From 7e733bf841e11e6cb449856d47091b703c0ce471 Mon Sep 17 00:00:00 2001 From: Belem Zhang Date: Sat, 18 Sep 2021 14:21:47 +0800 Subject: [PATCH 1/3] compile in web worker - blocking --- html/js/owt/owtstream.js | 24 +++++---- html/js/tflite/deeplab/webnn/webnnworker.js | 18 +++++-- html/js/tflite/utils.js | 56 +++++++++++++++++++++ 3 files changed, 85 insertions(+), 13 deletions(-) diff --git a/html/js/owt/owtstream.js b/html/js/owt/owtstream.js index 524b8ca..af3111b 100644 --- a/html/js/owt/owtstream.js +++ b/html/js/owt/owtstream.js @@ -51,17 +51,21 @@ const oneWebMeetOWT = async () => { getProcessedStream(); initConference(); userMarquee(); + ssLoad(); - if(parsePathnameBackend().toLowerCase() === 'webnn' && parseSearchParams("ds") === "1") { - console.log("^^^^^^^^^^^^^^^^^ WIN ^^^^^^^^^^^^^^^^^^^^") - let worker = new Worker('../js/tflite/deeplab/webnn/webnnworker.js'); - worker.addEventListener('message', (e) => { - const { msg } = e.data; - $("#worker").html(msg); - }); - } else { - ssLoad(); - } + // // if(parsePathnameBackend().toLowerCase() === 'webnn' && parseSearchParams("ds") === "1") { + // if(parsePathnameBackend().toLowerCase() === 'wasm' && parseSearchParams("ds") === "0") { + // console.log("^^^^^^^^^^^^^^^^^ WIN ^^^^^^^^^^^^^^^^^^^^") + // let worker = new Worker('../js/tflite/deeplab/webnn/webnnworker.js'); + // worker.postMessage(['loadtask', 'computetask']); + + // worker.addEventListener('message', (e) => { + // const { msg } = e.data; + // $("#worker").html(msg); + // }); + // } else { + // ssLoad(); + // } }; const ssConfig = async (isSS, effect) => { diff --git a/html/js/tflite/deeplab/webnn/webnnworker.js b/html/js/tflite/deeplab/webnn/webnnworker.js index f7fe203..088c15e 100644 --- a/html/js/tflite/deeplab/webnn/webnnworker.js +++ b/html/js/tflite/deeplab/webnn/webnnworker.js @@ -6,6 +6,8 @@ let outputBuffer; let loadtask = async () => { importScripts("../../utils.js"); + importScripts("../../deeplab/tflite_model_runner_cc_simd.js"); + importScripts("../../deeplab/tflite_model_runner_cc_threaded_simd.worker.js"); importScripts("./deeplabv3_mnv2_tflite.js"); netInstance = new DeepLabV3MNV2TFLite(); inputOptions = netInstance.inputOptions; @@ -15,13 +17,23 @@ let loadtask = async () => { } let computetask = async () => { - inputBuffer = getInputTensor(null, inputOptions); + inputBuffer = new Float32Array([1, 321, 321, 3], 0); outputBuffer = netInstance.compute(modelRunner, inputBuffer); self.postMessage({msg: "prediction completed"}); } -loadtask(); -computetask(); +addEventListener('message', (e) => { + const [loadt, computet] = e.data; + if(loadt === "loadtask") { + loadtask(); + } + if(computet === "computetask") { + computetask(); + } +}); + +// loadtask(); +// computetask(); \ No newline at end of file diff --git a/html/js/tflite/utils.js b/html/js/tflite/utils.js index 653be34..6d34d84 100644 --- a/html/js/tflite/utils.js +++ b/html/js/tflite/utils.js @@ -82,6 +82,7 @@ function getInputTensor(inputElement, inputOptions) { inputElement.width = inputElement.videoWidth || inputElement.naturalWidth; + inputElement.height = inputElement.videoHeight || inputElement.naturalHeight; @@ -135,6 +136,61 @@ function getInputTensor(inputElement, inputOptions) { return tensor; } +function getInputTensorWorker(inputElement, inputOptions) { + const inputDimensions = inputOptions.inputDimensions; + const tensor = new Float32Array( + inputDimensions.slice(1).reduce((a, b) => a * b)); + let [channels, height, width] = inputDimensions.slice(1); + const mean = inputOptions.mean || [0, 0, 0, 0]; + const std = inputOptions.std || [1, 1, 1, 1]; + const normlizationFlag = inputOptions.norm || false; + const scaledFlag = inputOptions.scaledFlag || false; + const inputLayout = inputOptions.inputLayout; + const imageChannels = 4; // RGBA + + if (inputLayout === 'nhwc') { + [height, width, channels] = inputDimensions.slice(1); + } + const canvasElement = document.createElement('canvas'); + canvasElement.width = width; + canvasElement.height = height; + const canvasContext = canvasElement.getContext('2d'); + + if (scaledFlag) { + const resizeRatio = Math.max( + Math.max(1280 / width, 720 / height), 1); + const scaledWidth = Math.floor(1280 / resizeRatio); + const scaledHeight = Math.floor(720 / resizeRatio); + canvasContext.drawImage(inputElement, 0, 0, scaledWidth, scaledHeight); + } else { + canvasContext.drawImage(inputElement, 0, 0, width, height); + } + + let pixels = canvasContext.getImageData(0, 0, width, height).data; + + if (normlizationFlag) { + pixels = new Float32Array(pixels).map((p) => p / 255); + } + + for (let c = 0; c < channels; ++c) { + for (let h = 0; h < height; ++h) { + for (let w = 0; w < width; ++w) { + const value = + pixels[h * width * imageChannels + w * imageChannels + c]; + if (inputLayout === 'nchw') { + tensor[c * width * height + h * width + w] = + (value - mean[c]) / std[c]; + } else { + tensor[h * width * channels + w * channels + c] = + (value - mean[c]) / std[c]; + } + } + } + } + return tensor; +} + + // Get median value from an array of Number function getMedianValue(array) { array = array.sort((a, b) => a - b); From ef9e50750e298158c3dddeb6938577174c00d27f Mon Sep 17 00:00:00 2001 From: Belem Zhang Date: Mon, 27 Sep 2021 16:36:02 +0800 Subject: [PATCH 2/3] compile in web worker - wip --- html/js/owt/owtstream.js | 139 +- .../deeplab/webnn/tflite_model_runner_cc.wasm | Bin 0 -> 2144751 bytes .../webnn/tflite_model_runner_cc_simd.wasm | Bin 0 -> 2819665 bytes .../tflite_model_runner_cc_threaded_simd.wasm | Bin 0 -> 2836732 bytes html/js/tflite/deeplab/webnn/webnnworker.js | 127 +- html/js/webnn-polyfill.js | 18181 ++++++++++++++++ html/tflite-webnn-deeplab/index.html | 2 +- 7 files changed, 18408 insertions(+), 41 deletions(-) create mode 100644 html/js/tflite/deeplab/webnn/tflite_model_runner_cc.wasm create mode 100644 html/js/tflite/deeplab/webnn/tflite_model_runner_cc_simd.wasm create mode 100644 html/js/tflite/deeplab/webnn/tflite_model_runner_cc_threaded_simd.wasm create mode 100644 html/js/webnn-polyfill.js diff --git a/html/js/owt/owtstream.js b/html/js/owt/owtstream.js index af3111b..23e6e0e 100644 --- a/html/js/owt/owtstream.js +++ b/html/js/owt/owtstream.js @@ -1,3 +1,83 @@ +let instanceType = "deeplabtflite"; +let isFirstTimeLoad = true; +let loadTime = 0; +let buildTime = 0; +let computeTime = 0; +let outputDimensions = [1,321, 321, 21]; + +let inputOptions = { + mean: [127.5, 127.5, 127.5], + std: [127.5, 127.5, 127.5], + scaledFlag: false, + inputLayout: 'nhwc', + inputDimensions: [1, 321, 321, 3], // deeplab + inputResolution: [321, 321] +}; + +let outputBuffer; +let continueinputvideo = true + +const pipeline2 = buildWebGL2Pipeline( + inputvideo, + backgroundImageSource, + "none", + [321, 321], + outputcanvas, + null +); + +function stopCamera() { + stream.getTracks().forEach((track) => { + if (track.readyState === 'live' && track.kind === 'video') { + track.stop(); + } + }); +} + +async function renderCamStream() { + const inputBuffer = getInputTensor(inputvideo, inputOptions); + let obj = { + task: 'nncompute', + value: inputBuffer + } + worker.postMessage(obj); +} + +async function drawOutput(outputBuffer, srcElement) { + if (instanceType.startsWith('deeplab')) { + outputBuffer = tf.tidy(() => { + const a = tf.tensor(outputBuffer, outputDimensions, 'float32'); + let axis = 3; + if (instanceType === 'deeplabnchw') { + axis = 1; + } + const b = tf.argMax(a, axis); + const c = tf.tensor(b.dataSync(), b.shape, 'float32'); + return c.dataSync(); + }); + } + console.log('output: ', outputBuffer); + outputcanvas.width = srcElement.naturalWidth | srcElement.videoWidth; + outputcanvas.height = srcElement.naturalHeight | srcElement.videoHeight; + const pipeline = buildWebGL2Pipeline( + srcElement, + backgroundImageSource, + backgroundType, + inputOptions.inputResolution, + outputcanvas, + outputBuffer, + ); + const postProcessingConfig = { + smoothSegmentationMask: true, + jointBilateralFilter: {sigmaSpace: 1, sigmaColor: 0.1}, + coverage: [0.5, 0.75], + lightWrapping: 0.3, + blendMode: 'screen', + } + pipeline.updatePostProcessingConfig(postProcessingConfig); + await pipeline.render(); +} + const createOWTStream = async () => { stream = await Owt.Base.MediaStreamFactory.createMediaStream( avTrackConstraint @@ -13,17 +93,6 @@ const createOWTStream = async () => { console.log(inputvideo.srcObject) } -let continueinputvideo = true - -const pipeline2 = buildWebGL2Pipeline( - inputvideo, - backgroundImageSource, - "none", - [321, 321], - outputcanvas, - null -); - const videoCanvasOnFrame = async () => { if(continueinputvideo) { window.requestAnimationFrame(videoCanvasOnFrame); @@ -42,6 +111,8 @@ const videoCanvasOnFrame = async () => { } } +let worker; +worker = new Worker('../js/tflite/deeplab/webnn/webnnworker.js'); const oneWebMeetOWT = async () => { await createOWTStream() @@ -51,7 +122,14 @@ const oneWebMeetOWT = async () => { getProcessedStream(); initConference(); userMarquee(); - ssLoad(); + // ssLoad(); + + let obj = { + task: 'nnwarmup', + value: null + } + worker.postMessage(obj); + // // if(parsePathnameBackend().toLowerCase() === 'webnn' && parseSearchParams("ds") === "1") { // if(parsePathnameBackend().toLowerCase() === 'wasm' && parseSearchParams("ds") === "0") { @@ -68,6 +146,36 @@ const oneWebMeetOWT = async () => { // } }; +worker.addEventListener('message', async (e) => { + const { msg } = e.data; + if (msg === "modelloaded") { + $("#modelloadstatus").html('Model Loaded'); + $("#tbb").prop('disabled', false); + $("#tbr").prop('disabled', false); + $("#tbb").removeClass('disabled'); + $("#tbr").removeClass('disabled'); + } else { + console.log('Msg from worker: ', e.data) + outputBuffer = e.data; + await drawOutput(outputBuffer, inputvideo); + + console.log('- Computing... '); + const start = performance.now(); + computeTime = (performance.now() - start).toFixed(2); + console.log(` done in ${computeTime} ms.`); + // await drawOutput(outputBuffer, inputvideo); + + if(continueAnimating) + { + rafReq = requestAnimationFrame(renderCamStream); + spaninference.html(computeTime) + let ct = parseInt(computeTime) + $("#fps").html((1000/ct).toFixed(0)) + } +} + +}); + const ssConfig = async (isSS, effect) => { if(isSS && effect) { backgroundImageSource.src = '../../assets/img/ssbg/0.jpg' @@ -75,7 +183,12 @@ const ssConfig = async (isSS, effect) => { console.log(isSS + ' ' + effect) backgroundType = effect; continueAnimating = true - await ssCompute() + + try { + inputvideo.onloadedmediadata = await renderCamStream(); + } catch (error) { + console.log(error); + } } else { // gl = outputcanvas.getContext("2d"); backgroundImageSource.src = ''; diff --git a/html/js/tflite/deeplab/webnn/tflite_model_runner_cc.wasm b/html/js/tflite/deeplab/webnn/tflite_model_runner_cc.wasm new file mode 100644 index 0000000000000000000000000000000000000000..71d21f507c1294214247bb5d9010c7119775bbfb GIT binary patch literal 2144751 zcmeFa37A|}ng4&++HO_Xt?ugX>aGB{u5k>T#t{RenB0UVEDFjpIGddrXLP!Q0wRM> zC+Uz7qpU($MeKxCAc`o+q7rrlK{gThuqg@xB1=>>|Ihc_Th-kOiR1kK&-0t-`Twhv zx@UdQd*1gw?|ILA&OK!<`1ldFWm)!p)pPA3cgd0^){wJgiM_;xdDtY_ij!&$`4rI8 zOCLECC7w?M?Hr1yB?%O=Eb_AABwE%`shuu(#ZF`b7R4%^WCg4VSOUTS^5lFFU$n?x zG!#rqw1&DS#S9E*@nU=NltKWqRZ;z3Gzk^bCm~5peWJDki}|FKT0CTr+M`3&sqKKQ zp@2$q;g>5 z#0-L?1Vpcthz=}SGUSQ$Je@^~8FC>Wk}70`uO-mU8P&H<4;q^{pQczt%`Ih-ZVhd} zmE5UW*3e;76aL?dS(8T4B2a3Na_FB5hG9w8nl@TAJ^_~y@4L(!g*F}i}9Q)D1(rQQ5QO(Wc<-H9|p zs;_a4Koa(Zj(JEtoh7i|6DXQXCCmhbyS0hNLx?7%F>8Ue&4;q`$k>|Lklo5aZ23W< zH*7h#lS8pRI+6cL002|Kj;aWl#?6`hq%<&X%#jJj?II%P$9 zKIEIxYtp3xGXMfpXJlhEWGi1yVFzdPW&H zRUN7JA}&242z0xn`$?n(z^pOUg&h_s1-U@R6qO zQC6Ms(Wd0bEuZi)2J$D&_pzq@f12=d=KGT-u^)@ z119C~P56T*JYBV%1q&2${w00<>jG7AK9oNGElvFQH1^^2@sTv~KNhGX&hP^3?|6(X zFu)crP~V*+(%47S$Hx|^QRm17qJ?u*TK(uW@#86!W75Yb(hA3>MgDVvRiwgk3q*P6 zlMBRJ=Tm7cNlVU6>&+wPKG3|j={lZQa!QWlmAX9F^YY&Ooa0$`$#*@cEARMC%XO9E z`#ul59@$>gbLRULa!7D|AlP}&vt7&gZHK~S__jX8y~wijw&Mr+IOo+#o?-hQpPcR4 z@3V6MC*t5J+U_Rz5 z&jF;8P|UI|+jo8M9DBFj;@DH?+)AOQnM4SrFFE`{j?9?IIK`*{9fnmjjk< zLsd2C7oDPAvuoh#**#(aZ1I|Y5mJF!$+Ak@xK3b|{w*Zk|Hub-KbAs#a=BTxAXpqM zsnv=Y^OomB?{d!HF<0Kl-p96lE1!2Azpu|JSb3`wfLnQ%Cwe$u;QFrX%*^p`C)%py>s$A9+!q}T=u|JDC5B(?+w*AR1Jd$#cj(UL{ezEA#2=(x~(Oyb*N-S2F53V2m6g4r0r;YKxeYYvptKd2ZdK zHROn1Y7`*S@5<+WClB#=wX9su$>qab*{gvUnQ`E;_W+Mj- zb!noK8;1FihV$JadF667?D3pZ#cA}uq1%P&mZbtnv7c)fVFc$2`FxHsrx0}AH|N$6 ze8+#sn~TMMyZny+u+h)pGVJvoJC{#ohZYKd15P~j?WPZXtEfpWAf@d<7l~%%gQh?^ zIl=tE8zsh$s+0?MIbVPRcE5QRirsc0XXVfcWPv=I0qJU}vh+os(QL-vq%TPa%-iHk za&FYBZG&B4xgbe(=4Ho8;%OL_Gs^ZX!56@*4zed~U;ZM^(`{x-F}Yqm95+jg5;u2e$RAX|x8n0mlXplH6$vU%9(40e=}wp9)FE!FnH}4c zeA_#e&{t@2M#TZHyHfo_8ubs=Mn2!}iMG?_^5^V%&<<~Zdwu_Uz1~%~OSaR}Ts0HA z@4Pd**V(`6#7(DIIG~odc9VI+p;H-;s-|h1DIeK!>{1?ZrY>sQeT)C5?SM``7Li7;6ab=B zB0-;02?oMg+p(M$>aAiqnn$}-fs%E;jr7d+kvF%i4k<7tpr3$YHhF$N7gl5><@5hY z#s2)iTTG+7=E?=kmK=Js95TW}RBe$-49#-n$6$ysk`W`|SYX(M^n*mAP|JczdDr^1 zOh0F?cT9+C1jAG-VgT_`xPj8K-I_yFWw*PZX3DnRTc-CpJICy6V+H*4o6*cDFex+? zEd!!bVWQT@0CDU-kR&K=%VW-*LLuo&6sEpuQ3i+t#Z-;u81iX)xm@nzKjsEjCHhX2 z)ha19q%)17_8HBDWnJu1*uzW)zKj!lXfW(rZV!foJ=^!V+xL8m$A4*}9^?xt`}1fm{f6!j(c*+;;b_ZfAP zN(P)Kr1UA3kUyok-G%OMePO#nPB*W3H{5R&8z!Y}xrLl-^}DX(VSgDkY8BglV|RCN z#di7%kd2QB#|J#yAD1Btl_bkZmgHYTr@6~aU<5Z!^=zzm(Z6ZypPN1omO10dq{v|# zz+i?N=#OZ`L54T>x{a#)M&E68S8KH%A8PQa7MRvV5cE2&=P}%UCMCZ4!mg8eyi>Gf z@+ntsRv864x9v97a(C5pp#U`L?)Fm(FgTRbjq%tfi(fQ$Kz|5B)FGg!(=!ZXfPojb z9F{<8vv@TO_OxI|5Q_WCCN-^}RyS#oh17q^rvLz9A8B7&zO?KkA!FXyn1dOz#7@Sa z|E?3{|Et&8a{(G;uLahNzO(lN>qE{y3s9r;7g!f|JNquc8@1m8>#1&M{{_}b1?PYT z*6MEOJqxVyZs)xVtS@#u2QILF-Q^s#!1`5}^S%Yv(_PN{7g)dSat>Z#{i4e`WP$Z$ zmviU>>xnMsum#rRUC!SvupaAj4qsrc?xOQNDV_D;ozNLLDiq97wuAf`~QP1f;E2n+GTk)@VzgAmQ`)PPt zcz5;8>N8zG?fQP#y1_9b{5_?0rS9o<{JePL;PHd64m>;X*uWzL-yOJl;2Q(y z4xBdd*?}W}Q~Xi?{r&6uukF9Q|Lp!R_Mg^&wtc^UfBwGwz4;C9_x$4o2evwhe0zS#Rr@A}?Hd#~udsQ2@|XZD`j+xx4+EA=Z2=hx4v-&{DQ{>Pp>DqpWW zU%8_4tIGA2t14fsJXg8A^2^F~m9JE;uKcF*rOGcV->7`Ka&2X8<(kS@E6-MLtvpou zb!9{4)ynTHmsM`8+)%l+a!KX(%59ZzRlZ%hsj{webLE!Gm6gXUPgX9jJXLwPa)0Hq z%A=J>D&MdCpmI^=iOK_&A6Cw+{HStaWliPW%6MgU<$}r=E9Y0fP&u#i`N}z!vnpp- zeq8xU<-W=@l@}_%t-M%ysq%8=mCDa5Kd-E>tg3vka#!U$mAfnVRK8oex3ao+LG9}B z((vi(Ppf~Z{c{UrQ;_*D4A@VfAp@SEZCt_Q0(bbTSbrFuv8JJn08mshWN0Y1W%-KS133bhG2)ILx}d=kC%R2dbo67>5kIvrQ1rkmToD1 zo3XakzOcEb`K{77OE;9R*VsG1v|`$^LnlmIK5f~wq2D(*Fc4pDzS4ZDIrO{ci$u;U z{kHi+bLjczb0+ee=Cc~2&oqBc^jFPaHh<9^daC&(ktdpuH`h0Ze%|~Uk)Jky()_Us z{;2swqK`Iz(ENUL=;7u=L>_ED(7eAnbVu`cBDXbfZQjxxy0Li!k#FE3yQVqx_2$=z zoLsuP`PJsoRn4!M$lB(W&7murmlOF?^Rnip0)B?RPHvvm{Hy}}8`JZTgU=0)J~jBn z;A4a92hVj!?-~5g;O&FA4c;<%^WeI{Zw(GzH8`|(aOm>Ep-Yr~@!&;+7Y>fD8T|a< zd4r?p4xTf3(%@$XmwGD(mkn+lcx~Vh11}H!Zs4~ArwopsJowqcm4lxiJYjJ8;L^dd z!9NfDY2c3ozaQ8z@XEkT11}B?y)f|n0FpECn}KHrz~t8hzaskdz%K`Wq3BZsPZE7% z;PHX=14BO__!*I(4*X=`#{)w@8u%fRM+bf|@O>40c;F$T4-PyqaR0#2_Xh4Ga__)B z19vO$I|FwSy>sA>f!hae8@Od)-M~!)-yZnZz&8hO9JpcN`hn{Pt{M3Hz}E(@8u-cp zy}Nqgs{@x0d}-iPMZP?6#lVRJmkf-4ao~c1q0bKteQsdrWC8tCgRfWg^{l>r+4x1{ zsm8;NhZ=V_?r7ZJxV3RhL8H(5wAJuk;VyQPjVe`fo3e{;vPU{wMk$?_b~l^Zp<9 zk3QP}gZ@YQzu$jP|K0uH>AzhiZY*Bke`E1${WtV~xgShc_mB6V-#_~K{`30J?LVjg ztp0BlPwqdd|HS^!_J5{-W&fZ1{?zwc-yi#a-?yRfmA?D@m-}Ag`#%4~!oB{Beb?Cc z`uFl<^L;<;d$jKdeGm41x9>ZBclO=UcWd7* zeK+>q(06^`b$ws%TibVK-{=K>SM+_M@BF@R6hGg0Uf)@LXY`%gcXHoJeJA#Px^G3_ zZ+l?0us5+1}A#_x`H)@!rRJf8P7E-XHXiKHU3I?_Is4clO@VdrR-l zy*KrKyZ4*DH}qcCdtL80dcW3tb?+s;_ZBbgUDJ!MSlxR;uPFD0-t&9U>pi#koZhp0 zSM`pb(R+ID=Xy`;J*9W_^{4B>J9_{%-&m%qG?|HcA zp`HhO9#G<)J$Lln-g8^eu~+w8rTC?VFZW#0b9v9&o-2DU>AAS)qMi$td|}~>Jr^kO z`JQun&h9zCa8}Q%p3fJ~E1c_{TR5%fR8mgqIjNKKo9?gVp6-62``+&Fc3<0lP4|`E zS9h*_D6PgK`ee^UKX_0j4h)rYGORKHifw|Y3&Qim&xhah&kN5D z&k6sWTNR!Wel9#UJSALjpBR27{9W#k)eY5GtFKgFs=io#G57oGx!#3^m#e?4zEFiI zLuwTo&)U#xwhc7E;iwR3Cd)XuJ*RU109c1G>=+UIJg)lRLQ zTsujC$Mc`5t*ou6olsj|TUL9%`m5^W)rYG0RexOlf%-C@e<}Q3_+t3m@P+WX@Y(89 z)t^`IuYR}s!|L~|KkTOaEC=i$&Z?lbNSw*Jn9bJsi9JFl1YYxmb#sa5S#uaoqn z@CV`01L60=p}WF6!lB#4+rpux`CG%YT^={{IQC?4%S?`Aj~%NHJ?IZ@?0T{5<*q+> z4gId`m99T^4ZYO$YS(LBLx1Qh+p|k2jeY9c=7V@fmPD2}C$bW6B(`TbR_wK$$Zol$ z6h;)c2rWJ;w)UZv9a$r>JHzo}C*o0<xi!JXN(L$5eF%$%>q0^r*;HMS}LxN^+egYD!qeRO=OQ8n|L3O?8G@{BzevnCUN6-@2OaW1hzG~j&f~s@3cTOnN7y*eVak-B;GN^ zPy1zgSSX1C=MXkMQAfeSAR?p*dC57?m-T;p*P09dYga7a)y2JbJnOY3pgratC=}JT za1UCqf~0!sIwtkwiF?#u-W($IaK1{m*utPpn%;@F9G4=Iy|ZQQZUHT^hv_MGhQ)&e zD+;?u;W`Td5RmQB!ztL?2|}h$BV%OK(LiK#6K~&1L{xkv z_V%BYv%N$uS&K#91{?v|5=+}$k~Y^Jo*#>S>XL zq^NWnM@caxVgy8t+-M(_EIodCVPOnGXaKyu5i?E@AZZwr?4`A-V04-uPyuC=W;;o_ zQ*gjEuk;4cc+}HJm_8UnN!Y1Y?}Qqi(6lxvN$F8Ze&wVvslT@YVllOhAS;fh0yF9aIXon-EbS~!4Hndp zW^pw{aoVz_5rl zJcP_}rt`CksKdlX6VaFoN@j*lF-T+ddg7+s2NfqPWS~ukJ@vRAI`G38T`c`

fJ2L=tNeOQDGt^k-3RN-p{CJ_l5(`)G0fi? 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 z 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%0D$QDwZsyA)gR)~5u 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

UEiO(O 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 z

n!^u`h}OhuC>r$7yph)}u%IC4%agmtXm^H!>W?9jQUs)VQQsH9b}sjOoFMs~S++F`UZ`At6J?ffumRYh@pP?rb;yr?6eA z&}0O6jO~geKmXaTCNK7j-z=sJ-9GP_Zof~@H>UeCtc2m5uuzy4OIxpNk*JHb3a5bY znVB98N6d-2pDk-d+1EPpSout2x+Y3t(XeB?9Kg+1N#n!+qpGI(RI(#)Opc6>MvXXu z<00Ro3WD#bv^mc$&ACjOsE^uYX}K5swzu201!AwE&G^9E?etW+VPi60DYIJ4^HGW& z20N0gC)n{P0RwT9l*!AP@fszOXPkd~_sazr%TH?MyH86+%$jMB%Q<*t$8WesT> zJ_eMI5Q$@eFVGmfAuc*lp@1cUUVxQ7L-M@{iJU}8dN1C$+Kz1OLqi{Oj%@sZ0C70! ze8MG7k`()3lCh%LkOWzw-bZDKe>Mj5#jZ0khA!jCcQ!R+i0@F_m~;C(7mMd)AGY_6behS zIB;mND#0*$9B#r+hDRpgQ*3?b$Q6H+={%^Xh(V*7k11qTDAg+vdxP+$G#7F) zj}l}xhW_jnTXa%!@*N;75|$t=_A{zQ2I_snve*z|QMjG~v|ZEFH@o?|U8!$iQX@J8 z8^IYcgjEh7Y#1R#eAe(wDnbLxfbA*c&n4JDKtSx_*5^zt+x%etEBzUx$`es5=)x2@ zV5q5SrR`ph8lX|!z%-_8qZs$Y$p%*YG(keASKP2IZ+2db909}j4Lh$k>&VcKHz6I- zC#T$OMT5+*1Ul_bO}Q7b(S$5Y9iMC;wX*3YXpR}_d#mhc2X;q)TIx?y^(U$NgI&D! zCmHAuCozlq18xN$DQ`mR{b?M%Kjs&Fpg)m}0;$6eJ^jtL`x}@|`#C2H?n;7l(U27d ztmI?!MRNz+a<qMsuhBgfJF)1h-JJ^|n(933|!@7X6H+Lws`mz}_^3*HF zs6+O{QgztI>8CF8 zb~o*UKmbxb|Bb*nZ^VkkOph^=rXwN%a0GLNf}}}{iD4h(poF`_l~gBO!$rdw37PJx zYWj>O+ggN{kz_R5h*pFI6e<7_)p=v&D&?xzWp}Ngl?hGZv6`r} zK_4h(Aq^?T1T;kS zA0%VBq*c&5YSlyba17y!8jC58VN^(+HFI@&h@LtL*f{iGLeY=;x#2d=sju7VrRs}+ zHpIhUu9%Uje0G!~KXZg4cc-$arz5O508>f^8kmP$qKu*~I>^xrdg*zYjuJynryq=T zjrN(kqI(uen3VF9lOp&b&}?M61Vu(BsL@6A@(T}?wF9#_oY!^*%Ba1X@DG~MJL?Hp z;M9XJh+&|?Vv<-MU|UxLPlk~LW9enpu=1d)*AjsB#7zuH0FVD2vobDDrkVfE-n+ng zR$XNMBpAt6#||U|i9}IR&=74EGtnU<-bs|0c+)W$qd{fv&5YdWB=`GUYoEuz zs=8?&F+Si?|9#HckG0ocd#$zCUVH7=7A@{}XL+%|_)8WTWIn_EcH`o7`n z87(d@BF9CSY#EYlDd5Ace>!3?=@YqbCvA*K$l#R$0&WZ^#qEDJ(*O8W?27aFeLry6 z&+{hgkOeTcZpfEzzb{jbFbvoB44E(}^3)x^Tz=Vxe7qxXK$P3CFi=n?`>k5ZtMeG| z_zRasD9OI8kI8{8qITXxpYuI2E>NtxY$>MHR=>m?WU~`79NrOY7$McKFEh&a?61yM z{tP~)!O=G2HpYm4FY?2a*5@qnV&&rIFH5PW^F*HEsDjDyA{<+=qUl)k*-J3=F)=Qv zp)BVK>Lj}dyq;Z=3xt&HO+*0421)1d)Wm8t<9L2~q}8b-BhfE}bp18m^XKzlgc2r9F` zka!UWBdm%ytbLcJ#zfg;Eu$Y(6&mm6$S4Za={h(j z`UeHyBD6j6mu3|D8rq^71sO?}$V=aBQuErTsyd+w!pvZ)r3L5zNUM&F=*URRyHVn$ z&D57aE}%p;rxE93_hdixT+?PmW!Qi9ILH$h{}qSui5+PiK4T6g?c#4EF4#a+ zCN~sMJZ7Fnn8@g*^|W0)%A7s@-_Ew;IFjEd)Nj2Ijnm8hz*T%Q;!KJXUy2TJghX0v zg@ByHx(14EQE@XwP)bm{7*ZG!h1E|H2CUani9C8H)8h_1w7er39)3jh9A>%MTKB$6&3PkH5F?=wV%LV`XKlJsxt944u)bJ{bkyLP0 z!A0Am)(JW|@1M_4MCW!0&FZSNWj~)52TjLoekkJX=d^j9-OJzDC(Fq<_dnC;pt+uP zD7)A@{MYKR#7}YegJwPxpJ5_L!>`xNL%-%PvoFl^wAH@grzwpE&C!2$_|Ju=#tc+y z@%m!%1_`*Rc=XXx_IVR_T!H23m%@4YLNlM}nuPw_4_G5faqF)J5T5ve?4~RvvM;2= zI{zPe{)fx_$2<`gN1OToeQZLTV=6^-86GX70Q7l|w!_SMICo;Ymy$cVuLxmi0e4K* zfu(WbY*c*Y1M)gU%~i_8m8?_Q7ZY7MN&XSrdL%h@;FW>IWGVL+{QN`;Q4ELMD=ynm z5}Z8$w2P>!RDyp4%~1n2asfQc2V3(Nh!j0(Icu#g;JJ2C;#+IRSU>nLNfopz_uo_4 zyY2JmM67u!tkbR$rYoWs=?AqTLJcfe;ZQe1AyKp0XS|mQFho}f(w)g}x)=zCmsj(WrO#gP_iK2<{`e|> zlAXyOv;>xpE#uAs(xk$puYa-2Ic`9(;9!{V-gM~T8_l5zJHrzf9sV^c8V)b4 z=pmRuq%^{YP~urxCU6yoP#z~)Kl@)08@gPJzs@M6x@MPT52VANjX6S#^7({(wct^x z*iwaJsWhNFF%L&f4p_ErhZ!tz_p9!#W5I>L4qh{UfEMRm?&OLg73~u$mpvUsZD?vv>es`oQ(rD; zAgnvKlczlv&e^ke`a(>Xx@V@neIoXF?8m~O4!n+Uo=^fW@?8hN|6Ap3r@>ndq7a5m6dJ#AGT5h`r_|4or+NQdLAE}OIaD*aEAQx@ zxkfoYy$-KL+a2itOS+^34pya5#-8y#ll1%ZRCyQ%ecVcOyRbDvMy_(E!~YmF`%)3X z5m_0bTiZs^(ah|M(|9Cv3A|3&=}w=@3`TptpIT?;1Q9|LLtns?}Ko%-`Oyn z*P~|RANGrn_p`&j;cv_*bFdFhJlxuS;sG8Ph87>>7S&DsV&EEYgxfHdq7wo=Mw*Q9 z0|Ex(+^E|g4L|=3K;XWaC@jXgdW^Xfp@;9I%G%J0vrc;2H?c>~jv~c+#-+wRmFpER z(xNUlR}$EC?9Z~t-u4?2Z!I?ZC<0|Ia{4<2I8 zlo=W92gMmOQ3JGf-QqJ2DWJ4z0kW6N1?=DQGvBC|RdNNRnoUxLTL)U>w%KXyPug zH4>Q#Y)xM{m@8)xi!-$%a-hkoDF&*w)YJ$pMiv| z;ABQcMGjEa3_>Ga%zBE@f*skeofSQ=)> zt%dNlDdp2Q#?feV z`M_dpw5fbh4GZOi6#^WN$LN2KlXHY0uXM2XBtVf3I62H87x{tgkqu*6D0@tE9L@Q# zk6#G#wd%$)Y$O@aNyd1Y?04(zl6N?eYaar`4)zfFuWAI9b+UQa!Ee*7-xcMXUpLvz z&@*#w$ec?a(x$h)`j4OsGX1Grx@uBv>cC`f%aD=XoNvrtpN>c3sv-f%r4My5{50*Y z?6ccf!8NdqM3;6P0$b7vC4_D8e$wn3xavls8)td;DHCqxSgA zAjfuq*C~Q-U%@Aj5z(GMS8y<89Um7)FJpxJ`6fsV+{z9Y7!KSWhJ$nj;|M?x`=7y{ zBG~Q%7E8*-bOBXEY(-d$7zv|HwBIPO4bcxdkV~?CgC+JA!n?sM%vrInfDYF=%{5Q_ zP^2wv&cR$DW#Jqxj!+$gWg-eGa^Wlo6~K?oeAXXqt zHrt`+%gcO@M@C7*!~z99+%Bt~8-8odVa$H^Ln3Qfdd`n&hWH_BCm|(n5)J~~gREU2 zj!bA@4h2-Pl=@mi?%;{2iRbXc+G{I6Y|<|bFA2M85&K>s&ljjdrRijt1`vWU4yZv( z*Qu9`6k8ym#(XS>WF`nC8ZNdM5DVY=k9GFMVosqB z3j?|TRDr1MWiJ7ztB`<*bR@Jdrn57gL?8#vN_A+P>hRKd#Qwek99spc_J!4G`O7{J zC=F*sgeA+)f)q7~dO(_xzQ{jMBa?4ux zF|-Ez0-h9+m!zJlIdWF5uy3?}E5o{#!J1Y^t6P}~tvD9ew1RFfR>}JYWOJd+Yz>)& zIsIlHqM5WWsgZ#cWI+O1qbrT{J;IE^QfBzoEc02Qyh`Ur*xS{g(SB_`D4Jf22BE&} zPvhaIWJwVOHYp4fpn-ipc+&nno{E7bj;Lccr|Fj%SUSrlq=kqUWs2I;MhvXPRw1#s zVAP69^#CSy7#J228b%DgY~3(ds|rnpxw7(1+_Jo;pFsdam(1m1f)@}XT*ez*Cfuk&naWVVxu-&Mi+pi8y?-o*w(p)wZ&&^FW+ z;>pL7>S$+M^<3tRlvAI2fPkrmN@RnK`75C81B}?V-s%s1Q=IcYBE2k+`xcvJ-WcGN z?ZV|Ohj$tzsGHC=a~|%_H|KETf90;(6joI3Im3#0d5sb+ch|uQerwMPA*N3Wd+XwZ zC`C+d^;Vo*y%QEdiz5SLk+W}w7EQ2Osry(g7g4QjA*J|qlU^VY`ofs{V?Cg9!XuL% zVx#7+5eRPhQv@O?J)>R=6{^Zg*7*z-vX|02y&+>w0s}LoLL!{LpZd^q+Q4LGs-*$X z%D*HHS@oPs3>D^Nhdi|22?rp>QIVSDqiWfaOH_ccMP{f<8JqHHAmSD-xA|j@3JfJ#n0YKroBAchHn>a+#tP zKCPh@rnWMfMj=QILD*!c5R?y$nRs4(0pF^un&c%a*;Iy^@Tms~uq3k91cTzI576xT z1cTs?%kl*7s3}IyrH(N%6Sd%-o|-?#Oa@{m5EJcI%*5C#Eek8_%^-DT^$a>GtY`++ zDA5d3RTZoavax4jO{Fo|Y6olexk;1SNn zxBYOW6je^g@R*Yd1KwxD(S* zVf|QnTL?&D63z2R+o!GiV38oh*W2uC${9T^+#AIw%xU7~I5+5F_C+6WF3)A$takH;*;4Wi=v`%K$9XK?ck;a~TDPj7I8}ZeULh0yc#x zWnC-|TjP4hH6>)>st+MJEb9epgW?ha1|p+twc9LKZ^qp)RG=4u$6_ZBXHv8@MH{WL z;jGL!1B^xe8wDhY2{A?NaSalz({SeA9x084GN_S&rY`k5Ai)5vcv=IarqCNhqswNS zsgc0OlL!uT!m1B5A~;&pEM^KB*aQ<*<4~>Dewnl`=T?$=&>OlgBxch#oJy2ENyMQq zVvK=+0&zh;>VTa1!a+rXE}?ArK}DU3!ZV;es5qhp>}4~M-E9`Kmw2D{^u`oJmj#B= zHe8eN1{yjPTY$!r48}_}oe$dpYf1r^LZW4q&vAM`<9l3)R)vKLPjG_f0APtB7aa>_ zD@s%gPAerP(otS&a+_awgA&v71NQeR5)HFH)fPu+hblDl4RR0?sF5+T%{DN`DvISC zGf_SZxQRCA;jGHyR4a5$DH?nb0Zyq9=nJ+u2rLg>(g-j#S(0gxBlQ|c1gPqoxHUzL zm+Cv4(^Fk+DYrfhR(%M4Z*k5=G(s-*+d!n>)_5hi(E7@x?sFt);jU{Blpp$5jiR6Msa=}vU7%C|z!W|a;=%Z@| zVKzC&j2_z_j%w{(La5YSLKcAI%%uh|kr5d_5;7X?Jl(m(^=BuXOFFKjHjX=&DkN!2 z2ubkVdM@EfD~NPbEXm&8Ls1pNptabZ`J{7N9k7fU&yIJde!R1T^$N=jo86)C+vOBt zKF3-kNg+`cdg~R)UavVyRoY5WRHS-xnkcemw8F(ar5M$QADIl(aGyT9gbX`VN`he} zWVCom>L=}N^ZQ*J9NeTOf@77+5X30U)KwpXE&&(w(beRHHgZZeCqy+97Ryipud6AY^+xG*O-xY6Haa8D-z?HC;iA1aBMMHm4db`ZnwAy z$%$rSx@7#X6!ktEO)4H&(6eVTJsX3tcAAiUKORklj1^7L&RUw_rEs)bjpT@ge{hLg z>s%#GToTx$(}aOIO%slbl3|NCo2Wv``7-sI%QuATuVk+^&?7sUM%-==HCBXDv!o`W z#4u@g4f*HCb!0}_b@d@XJ0~sno(dK{VjU*)BgZ6C6exwJ7) zUX21dCtb{A3*w-#u7>jyVA^RjzoNliw)aDy3eB_oVoc}7gUNFC!!3Z0&WUa@=NJk< z9-AL4`E=kcHp7G9X|bk}&QGJUdRk~(%o-zU3sePC)dC;8`h9pX%D#TDJQ?qP2xHGZ zO1)F5yOsL6(RsFvqGK)gM9 z#J3l5+gaA5c1O1-55(DfwV6@8oycVzrz?Jp-yQtk&hJ(HzJp(#5L%GSU98@W+mni#9b(q5*++@pes7L3~AEllh`k`c@|28ly^xrBB8~Wd@l%XHTIY<9tB@F$C zAm@PlL*PEDaQ~){PZ6A`F(2$x4~#mT+JIPlD}i9xfC&WLiex$$xj>=xjJ1hQLfZV? zKGsYD!gB$XDZPUygY#?>2Ih7WA`)4p49L8Kk)sqbAgbY-MfOj^a;Ac^za!e#QTg? z%4eifHY1hr8HvtTPDjlzk%Y~wsZObzVjX`M9k>nHjHU&n)3j1f(@LoWhm~-et~+pO zssq3GTY;vwx;hG$2{Cp-3+ zJLdM4;O#BJ+Y`XsU4n-eA4Yv?|A_`&$9m00n&YvoU7iC*@Oef~oZtzKpbhWiO4;y! zRw)fH{4)&iv3huqF}%+bkxb4oiC{`6m_#3;ebFGSIsl0%3P65HDFOMA5=MhZYamTX zX%eZaY0h9$PWa@Dq?${ZkC;rwcxH+*5=FkHkKj7vQqZK(!!ei1!Bw$%TVxRry`trY zX&A^H;?nv4*UK%U$d`~www{RzD5CqPxJgFA4-Qd=?QWJz1Qelw7EOxaZH-fjP6TM> zm-@asY2^hV5Q4QKz(x{T{;FZAyelLfm!;L%3GIiAENWEOo|0BxvjgCAx@J*B8-oyTJ7u; zl5vM*^A6uQy{u%Rs)|E|3IGOv!D9CP;Izu81J0o|X2-HLVP*9;lt#v@ivUoU+fbJy zMt50mbDdmdg_A7h_~xsYP@Wo3_bh1O{@&p6_i9ooJ486}vc}WucDDLkZsa(M*lOYj z6g2VE&i=r9&3tKRA2-Z^s`72>NvlLCbIgdo95ZD;oG!}JAhUc+)O@`Sr46qEGi46$ zu`kORavhdoUB#%z3>~R4LkwTlA_<$p8&vx~?Ozjo5Se=>9Dgk7IIvIlWI z|Atf^SkSzj+mal+$dSn~dvEd$96aZdJl~L-%1zu9)gF88$@vME-(t*ElKP(81{Q-A zvzeQx7FQkDWxN*C;8CVkyCxanDx8L`VKHTd>-%(O#J)1Kn1?h&uJ}4_@0X=y^Dax_ z_^2$}D7I3#@mVQqmL4o0F`Uyn#T(;GQQ_IHy8(^34VW$aknE1^pJNy0!;oBD5<2d* zUN^pi4S$`{S)GEZ3iOulz>OXo4@xsklv#{f2K2@EPeyl4<_vEjACwTOA8$ut)SrpZ zk4q$(MvY8_=FdlD`ahM69R<1F%JIycNOeOYoHDYex^$4W3j|G@WSbssZ0kOvppUWk zVKp8DX413Ld~8m8XQkWKRlH}y=n@A@y(@FJL(Uo%yxC#siR*VmUStg%#O9JOsK_1B z5_{CZn|8-)4p^*lUJ*Xoj zShljaE)4Z#UQfjn@3+@OBTBg9p?uupZ(`SG6)^`Z?6}Iflf7*LuO2(H;%{V24j)^f zxu5+JSG96lkv%bf7RM?0kNLl?#|3xuj=AmUEgrc%$>L6LBr96( zYAB_Q6-8MP`cOgsGzx0Pp)GO{Rux2SbSbL+yU-@GPeu7t6?Oj)D~fMN)h5dpYLox1 z?l$P)dkp&X7XNZl0|){yIdL>}&zyxuLU5M>pKuGpi*9&l>~af6W3FzPQdt0nRdTqm zxF_EcAeTpM4zb1AgQ>fds18WqBtMoT;85vFLU~XvPXLv1npf}`Qye%fB-Mfz%MdO0 zT3IPgC13;8+M?dv;D)~w<8sIeCa!0~D4|@pTT8daL|7|Q-H;p=x5+~zT`G3smKSHg zN$1oAUdVD#-R?iR|A_xl|0toH>e9U1p8Q0tQ>k!W>keE>Q}sMP%h)838X_}1Y@1@Y zgIAku8crYxS2&pGg8>$JUsT+}v8>$6P$DgsS^GjeJ_%rDp)X3$lxf&%B47s_buK={tOMN9_2XJi6!RT?&wt?0?@6 z+*F*Q-#6Vg+`^cMG-wLSgBIBbMvuaAeqnff3t!4``iz)!1^(`!-6jHt$7sR^n5a$n z@rqy;z!ekhyyP|5n!wT3JYkQxiqZVcZ}O?oYQz?K8Wbji@7AZsspSf<<#K94W#30F z?|4YHfRCycvw-47Ty$V>1`|AIHB6)ITah;g*&eTKH$O}wKrcRQb(RYe0Hc-#XV7c< zrAh!LqS)W4SP2Fd5pY2r8W}2(&6D{tHXgX%+o2x;CmBFNidVYu*k*GCPEhK0SUp_5R>7;TkK5 zz@aZX_Sp->)E{nILp9k47lxlqU`Wslw|caG;^^jxqJ1Sh#cSO%#rXpNr;S)#LVcA96q4lN0z%y#s4sbHl1 z%noCnX8*xXVCLF^W+TEkj7k?6)wVS#dsud<8tsw4LOm0n1C&-sf2cr^NL3OCrr=(b zTVjN-Ec*__K(wLv+bf#Xj+jkhsQ?_6VQ#OCRS4lQN|!WKT&+}l)*Ixkdc!DH2$-Q) z)Wd0BjTQ%X8F@H*CblMIi@T}YP5@NE^9;Ezrz_Q<=>#zwlN^>o&1W^lpwTBHgHkh9 zsvcW(mg4zkiufo@_x!LA`}$#WNqF;seuY+Tel?c?mUU@>T1tW|O|C0OD;$YxbWwgk z2!B_ttL}ncbr*WAx;wjmcfpTeCqCU>DxkZwRd;1sgGO<@ps#gDIUiDXlu;0MhK_23 z#Jz(qV|*Gtw$PN&X9Kd9#@}uZr(c1B1{DS6DW5q@s~1ZpNr5Z{{Zb>mKG*jy&0lnd zv7t|56spQdtww@1pQ7kHXvQYz+r;isZH91b)^7t~nqht*=1i zP4`ybcM~VCczr3<2eYYw>gizeP@2%(U2sHOHE9HO2?@s+!JwK4Isx04X@bpQ8JGLQ zVb|vJ)8&yEOa966$h)2ukNksf%0}4h?AZMCT+(FO-wl^!*#2p7N$==CU@nPTB1VOH zc`@vA&INH`mBtLs7CXf$vnfvLZVkpM5x(M-l!jB{24d{nIHjyQs7TpeYAB!E2~%ux zNa+QgwXelE`LYh@{N3l3pJmAt#EPq^e>c4s?KqyA)2XRH7IEqL z+K;L7c~kpAU1LtOKB(vPz~}TFv2E-?^z+vg1t<0AuPKsQZ0ZUYKbD19 zVYQ^?n_VwuPo9reEfNVMlJ1Rq{+c3$f-T3e@PH~UWdq7&@?mFk6?Q}J<6`&uYl=8c z?ij`0wn2gRGuPJ(q8K}l6 z;bV4mp5mIK_sBxI#*bZZy#o2MW0rpYnxdzBP0?M6;zY1y3BD~I&0L*A)da?1g!Rhq zpU^W_Fmhq?WWkd1VbXm$!6#L;EnB0^yxISbC0mEOd7%=F4ons^mkdvr5%NqP@)2gn zhyeaEyCN;TeBlx7uzOlWVLZc3ZobFH1_K5^R%+~U4$sp0B)t;K*Vr#~ZP^DPhQU$hP zqdd1QMb$?XDOsDfX~QRs*1Qarqk2;Pfzla?Q#Jsr%JFZa$5^M$;z)HA)`rs4E!@#U zid8D{`wEwd+-wclXoI!Q^$xP1<#XzGiIKO^2u`xnsg@$-)x^wlK!0K$~oj@vA6n$MpQcJK34| zgi`NQ3Qwh(;$vjOgKDPu%R6|5QyI~Q@96OSNN{P>$T7U@*8UI$Rr^s@V6{J})G^im zfKnf)_WP8u+V8DvzjwO!b0_n%?^lq&Am<9D&P>PmxnxyFWd=m=4&Uw=0z>p zRMB^<=pscvL(zq@s9Zs;sBHK0)T1y0jyJuV`hG&GFQ{hryl0BXsroi0 z3|F_-xVp8(6}69Yf&#F)yB&@M3NIXFsmzQnqtJ=_3Y>jIuTfRuG z7bm0l6Pz@*-_0;DE_5#vmY>Z3&3WcW8RxJ)wcdY6zUfY?eH;YL6rW|o{X5xluI_C$ot&#Z1F{*au1z*5bnFX#317v zh?R|JA+U(Yv+~+p$T!|L+4xNn|6Dai^hf>^_3WhlZ&S~?Wj#Bpde}E^)&rO}40j?d z480&0tC8as_7hoW$Fpo>Yw1k?qJO4p|-Y0~tAvoTI3IK#=St)i%&hM5CW1p6|IYBwk<sC+0pgxf?5&jd$e@Rh0ONt^R*vt75I{6WP`N{o9Bfyh}gddF&KdN~N?cEj5X^Ofx zm1-L|=!s}?`-{;vb_Evh(+Z5I89G|wqK#to-Il<|6Mqru@j**=Hy7BT=JTYZ3WP$2 zsQCT&e)PR^O+&iCLI@qBZ&2Lz@I2fT!0|_w103`7Q6bnChh9$Z@-3R=4y~R-lyOx# z?h`4jcr8doG#49PW(Lc_K@J5m5OIfZA{+xg&^QOQB?YbH6bGt}FM=fTJ1iD~SK=$d z_<4cE3s9MJFuA{>w@O0>bz#uOJV1a*O=Of15rlTZ9Gp>D5o=R;9nat)@+Ra{l?Xm_ zAi&Rv8oc(BmZV3ca#1>wN6Z^yobHH#yLn}@=qCnF0UIR4HaT6kqsU}gK-V}Wd%J8h z9NRUqv@zdQzLc07@;Fd9T{NFlvR}qyXO_38;2<%FmNHK`R2t&TAA|iXmONfWsZc_s!aAyFzIEc~8pQ2+N1h{jjyR=a zR*}#m34!6$H`lW?U-?hb44R<4qZC{P9pG|e@JKntJt{RH9jfKtv>&1t`TD5VP`oWy z2lE4>*@&Jp4PfFWe#}dQ9{I6LU&b&t(&Nz`BpW)#Fa9W!X++}3mB9Ph-5fi`|NIe` zT*W7TM1fm^z9U6n9=OXbn>$a~qSl({rr>9?ykFk&^U z&Tk>$4t4`Pid7}jM?ZCirjW|{J3twnys9RKUZIYn^rNd8hr>^sRjDStUuv7nY&oPbeFqG|Qxje&jzB5LvTVXD1SjbGdyM+L!lxj- zP#jInk!-dS!-!W{5*}VVB{)huZfI#6N6bfgkWmIDG#ra6O&RY6I1 z;Z4UYEXl5kktW$e_mJIxXbrx#~~*C3>pkfZU+-B!B=rFEh|ojdwKbqn5=e1>6qeMFFzT+WmPqZ z$sqHpoR}^-X^v%8HHb-7b-bzuF$JjB<5knd^w#4Lld5eHlOA;=$to@-R7wLu6Bo4} zmrI5Imn_O2`vQ83KLwyq%%4L4OXg&c)_)G~27$njjU0lp~Zaa9ZsPIVO*m?n+eGK8w;w zXJ3=4f8q7!B91LGZA5j|_)3*U@sqTUjQr^zD_OGpg~9eNc?AnNROU-W=X_b8vNfv+bL1eV@&O6)S;Y?E|Zkm>*U~&xUkc+RGA#OvO?Ewd*PT2nlxI z1Ij(Y-<=zXPr-_)YlaI1QC-EREMTQGs9d{!7RV@PuUh_#Xtkh1kcZX3nk~a~;=0eO z(Zh4nX|-I2=VXf(lMpI>lKpbnZv+ZM#&E1Pa)|<1l0Y3AfCFH&;q&XBQh6ctS%6~9 z=Z8|nSC#(9!j`V^S|noK1rx$Nu#SZ>8}E+QiT-y9UF}{9DpAW{vE@1z)S#1tAe0t1 z3|Bn|;D57RgG;0=U*-s>Bc^cp!jI-?f(u^Mu-40cLkwG}p`wvhG?Nch6?;Tln$5f% zIs=zP4^&l%2L0%81SSBwCAh(S#BcypiJCzJHRCQHx{SlX*9)N)(TBCswl+i`Ztev) zLe3zdM<{lj&S1A7m+~7n;iEbs4U%SLjWNK8x#eJLyR>6BCVH&_WIH(n*!sw5l<^#?1dQ zm2f4O94gwnZ5yIxZ-yNT1r_wdAMm0KmA+GnRiU?DfnJA+8m2hYRD{NeDrRZ~_OP+j z%d&fBM=R0DMGH=;PPjT>P5~}+5akT_+U-eg8fTY~1!apv(B@Snt38wzh`qyj+b}_+ zqGDSKI=&eDOBke~sFqqqwa^bplWq{XV-83V0?R?8k2Dyw)uxl)!{ME&o%O~vs2x@P zVCA}IqTLjZ!RkoAUQ;~|3W^k9vSr*-k4@H2Y}F-p4qp-6b_Sf!;T6QlTy0?-GaU$M zZR!r}QJ1l3L2nB;3W5jD<6toh)%aA^_&Gg$C1A-baSXLD(c+8?T6x_y6r@YEFKmVd zHkK}K74=SF-c~nk;TO6Ar^25>FqGYZ=vH?F;!!usL9xe@A=xc40In)jkZv%W)eWzv z>V~2R3k`Iq*#ip+(8X463s)@l`G640OgQtIXPka}t;B;Zt&wXWSUbONj?fmJ&}!#4;c? zsL}A7#7mcfmx^8D-ER^Pd0-OnEd-?QBuf<^@tDU*ymEza!`JiS69elry-nh2E<$`k z;xSu!okIWWF1B(>JoEk(XElk}avW-?*${S#*ST!9#0vm8t_FKSIP!E4Na_WILl~kC z?ncnh@g-g`h>fgOB%Z1&CElej@ra4*gl1M#SPi!VOX3+fWU5R{yue}ys?a1JjM23N z;fm|+)B>9IUOG$|c+-c(+s*4psDUXPa#W}U%XDP!wNoJr)X(&zW#%D20Xp;iky-#Q zkazsGTE!ayxRiJL2>FzR7l3o5OCXpc(KT%JH0L<@t%2y4@-7HhLvBC?PK6ppAW5<} zF!0v!#O2)^N_mGM(ZOGncP*E9?ONV>VeXJNn5X5P-j2h2kxI@xMofo=r4IvC_#$K@STzePtZs^0saHbR5PS;m;8zh$ zI^r7eVM)KiGmw7G+AV_cq!NGwTk<`X035)q(Tkx~iSAkeR!cr^_d_7~l1~BMOQ z#6Hm>25_=p3<8iN;ym5DMgSVc3`=P7D7B3=w)C(gXgZ`4g9FoM^^-KjV80TBFaW5e zAqL^Jw&5w#@p@Rl2$j>45TMGnUl3r`c0=EVVZSL1UHhOTCJcQVYx!qLqONlJ7o@80 zGqFC*pmQ*qCJ*}(JhlQ1@(`FL7T3tbRVzTmnK6q{=afh++X+&U00<|LijFJQ)qu|g zBe%{r1tTKP7lL60Xo8V()ig&ix_m;PofeGx2#;7L7^`8B`N}$COAO<8E*?QN401|5 z26V3@9$&voJih+vh{s3t?98)i_L zWxaI#g()H0$b~YI;F%DNrL?+w=}0hkF^|ekK^GXIf*3;qVuYwXL=0vvW&+HvV2gVr zyPT1&HkwW?AnGgjP->w&$$GjCIpR${ZwWH{1YSW2Qh>CTFYmM3s zA-c+LszoCKHQ5=@ej(UR128W~?mC?7E5`#mB z8uCRN-4dF5jxAfXwk1RjNz_#eQP8Qjx$ez-h5xu}lVVM6v()BhROu;MQ=UkyYXrg$LQT8MriCBRp5vwBlZSy&|*u&`o?3>H=$0h4Lc^vqzIl!7y9 zH%*g3Z%4DJu(YrmGO)1Ly$a~5oZo~Vrj@z0s5n?rcX;WQRqM_`@h7ZG70KFKA|zb` z7GXG8Td`icwUrJ9YirYJY}VGPEMGo@8@=Bk+#a5zF5_4lXe5Z-g*Fjs)g%}MRpsU4bcs;uEV$jNrGaA0~Waa3C zCzPY_KcO6b+sVk$3hIU&wZ*8mZXM`SkOK767Nm{p`?e83(ylf0sTQPH$~)l8ElJ-$ zB}w0QJV{y(77*5}6=7oL%HvDYR~Pa3(g(N9o=BQjwa;7$CD?W(G^yg#0<{vSjRK+` zbCFbuav)AlqH4P*$kb5btPx`=QmO7)h*YoAM5@#!=j;_4asDmAQR#Qnl<; zEmg~YU+HAa7z84`*hH-DTb@9=Ru#@@;;tiJ8yTSTQoIH#M=O3>681Mt!oCh6^yQbZ z72uVGtxyF8tdX$hY;!yjdxE+eBDO@zmsQGEpj1+Jx?8KHtUGI&%$^dntE(|fowG); zGc9IcJtb!UY*T!?;>_Nv(|_Ao+!Q<6D=R+2`TEmj^mSKSV)1Ha(k|H1&Xc7AO=CZ% zDm$Y(;w0F(S73riE-hH%BT4p~diV(_@G@j(3e`pc;K zKqUG4%R=*kaPsw+t>r^kC!fT#I33l|1i)XxcR~O_5%>XM8_=*K!PHvN=bq&%AFOAIU!?!d4xsIfo{{~8ON*9usmkrHlH z4@J?hzcjEA7Y!`LMFR_Q(ZB+y1%7Lu?9=vFj_$q^u$$ZjK;Kyna* zU|qXyGUQYbiF`6w5MtfdqjqkveNJ>JF5&}_0iRdE59f8t0Q6cC*qOH*uk$TbvRnve z54zSGHee{m$u+jXQuL74s5ps*vy+nN`dcd2p51{0?J@;e>O+3Rs(zaYGA1@TnGu6I(inM9II{t zuLXqQ^cNLaS`RBsf?c?bS5>i{V?vzlZeKcS88(TR9Wnm|Gx$sbKCf-!)4U!02rKyP zn8e|Dp2ni%D8*OOwsY-Z&9!*Q8&cz(_du(=z~K#sRDh)`+OzDinWQfV^*{KVoC=u) z)FlTDC}RuE=o(`R-fS3K1o6PyNLm}nW(5U;v1__#}vV( z72dH5b!@vD2QvWZGH1jMu7Endu283G4F_8T(bcOUVwOAV9Fhj=>~2v(0qO*iHCB)0 z7-o*shS8Z}4L5=nZl;F>Rwnb8v2>Wo&g$!Mw)o|JuyRl=?g>8(_dmQ20^ zy_|cZ=&t!tFgaExU8=E#ARW396Rmn~3eU>;l>GFHu3FR>=gDRIvsXBGknP;R?yP}r zM`Y1*jl1+ne*71j0?rYZsp^=bwLyfaW}EK9m!s}cp2SU4D}J+M(akwp&obg zQ?zB=z0AQg$h1O$fM{rg)1w;jMg_uhzCqfLx0`RUR!>x&wY_q2MD6myu%Re9%G$B7X#MuhU1KiSUy-7p9-rjtBBBK zUXdBBtFA576}8KXM#HfbPE;KfNvlqy!_W-JLM+s)@Reau7U4zUhLPqb0J&u|zS(oq zB`R8YPP#-zizn!kq1UG5>P|83)hQzWP{mfLMhrrOPX{BJPc*s7vY*&V@?1jIA9HyH zdB^kmStPy^KMUi{`pIC_P7Z6-Yl+co#*|dVVV-4A2RxS_*1D6}|^)@UupI-rVE=#jzre(@!iAx{` zzli&eI&f;3<6bJF6i#95m)ojxTRo%Lz;Uu!^^sh!A#uQjkw8bfRxa}=s7L#BbN<9K zUyBp%o|Ch4alR3LY5nf_T@1OH>%03&mtAj!r2f~xI3kI=&aiOS0Du6^B?7H!%4<(( zXv{2yzcRSI=L)M!P+?+M(q@XA4vcBr&Kcpo2`Lj$3I;0V4f0tr)-uUDIwbA4zrsIu zy9HWTk0m`z^^rkOs0v2UYYSN|A1o8Ex|(Ie{kbI-xafr~|B(^ug@#eRVEw3GXqBv9 zu&d#{;C{>eF%ABTE)iaqXC5_dyWqMSin#Q7< z#+ZFhW6Y%IZpQ3k!O_15ir*CvCv&>qeqO-jB>x3-XKvTcZyaa4xFmro(BHv>bEctB}+Yc2F zhric}Unm{$kW7EuFn@@IMraZMhz*nb){-T(JwojmqhgIA1&}~?ymAF_Mhc+1&?`QR zHiQPqMu?cxAZUPWsMH#u9x4q`50wU}he`v~L!|-gq0#{LP-%ceX@K-q8sMBUv{{!9 z0)WoSez+n&rd-IN{e+tn)2=`j|CJJ`*r;~F&-*hQIm}3&6-trsv#RJu z1Ta6>BOm#>mX#kr+YrwD7m?b!lD}|y{8i%mjwjsl zC78!woo@rxn+PtoJ%14?uJan7nST|jEu>xye38wQDF13Sgfu@hkI+C!w)5>I7nF?i z7n3}Vq{y8AHF*G3lHGxn(6(-B5g4Srq9j2cbYd)luIzaB+e;1Tc)+oEy+i=%CAOT# zipuU^>M?&1`oxlBPTk%`^0#mHh1JlaI0ez)of7>L<*b?-;$JpsL=9^$y`K^_Wi$o{agd7PP3a}->J++%i!9ez{3hZkr*arX~6GVGS{H79nNPH5|c9)$t=`vhYt?xHz{?{9 z@V)JnNjf8>OG_!b81$6NEC3+uDaEZ$6q4>-Z*&Jw|Nb%BI-A62)aZ5+pQh1m{2D&; z3Li)E?2T@Xj|%o`5EihNah$PhI9?Ff+XnH))^6sWr35E#fH!_VA0~4K41;c z*hf+Iy$}^$(pHB-;VPJJNd$(xD@LS5W53NNNUX^&WLjX_%O{jK^r4;>tba${yua2kliG`C6V2rfim*GTiHcOVBKgJwwl#PK`h| zuPLU{0DB^ZdlLm}PYObTqqU|?)&k?LzJr`RX8P6-Ozb;Szis#t`8iU6DrLOFfm`$o zThEgv7^pFSVi+1PZNpBOX!``^mYlgjI-k3{a{$j%7ZFs||W+suOd8e*f zK9xL&nmc99CRTKuSz^U%cH=WhB)4i-K?0&$-Bi1Cx>}s3rt5?dE_7&jTAgr7#IYoi zq_VYR6;FCw2neiNwf7ABR5LWHJ#Jvp38|j;Gl(3iFJPA*OVsfPF4Y%o_L)BJnJ^R= zy9r395C+Si6kpR3EP+Q$+Zy)iwr*Xy$B#`D%Q_sOmild)15a9gr4WeL3;la0SchU&(Kp7I(wG)I zE%r=N^I~n$7(d!kn5aOyilwNSB!Ys3GtK3!ACy6DZ7QSze*%rSjmE{6MUSdjG>*nC zk*%zvK5E4Z+bR~-s%KPKZuM3d>sG-_ zXjQXUmIe#NZVkdlEWf62-5>*}29uL&(9AB_jzS+5(Z~C!89mG%U8ELCa#s#zbE+qU ze_E_QZC(9oNA>C4`V)AwDFlHYdwzs-I824}ufzy{;>$Y1pK8S&&0#_W517Jc2R1gq zo+taaw${k|E6|)6j|>YS1RZ_3dNmhbrS+@KD3WYiLWnrAM2Ir6MDW9H1*|X3G{nXh zUs;+P~x2!9c7pWo5aV*g2Y_wNfc{MmQT|7S}@BkmV zO+gtt|ER^=}i}S+G$aDVcEqsOV`nzX~E@U>H4DQ~n zTB3<#$OITAJU-QQs77J(Z${F3H4@T%FRRhYh#J=pe;?Znzpd4 zamxn_)Rko;m^mjAep=%N3vV3>*Y<6LzHQ3+X<@n|OApf(KM{5-UiPqC@e@I4gvBmv zi!ftZZCiL7r1Qq0IbSUa)YesLjs>BF07f&P1T%zKdphx2~j22P)DBm0B z`iaK)GU&(7#2cHfQ48D27pz6EfgX$=K5jdKG<@NLi)M|&v2o;1cSd>!&JIVjaz z=F2|5q_Tx|dAK5ElS_mS7jICGt1JiJ8+{&L6LOqE4jrIdRE}#c$0@YW!;L(=fCf$n zEaWq9_VQ--%yf_D&nz*;BaCaZ5v#?^{o6j>U@t(JczXRRe|^RI=_08}{u*liYJYu| z!gwq9CV#!+uU~V1y4`XwI3(Bm>ub*^RK9X=^w&4}>l@D}kiP0>nJ*}J^U%|VpdK(e z3gjhC;aOkivf1}@Eq{G`e17@>b^>L&mGr$KeG6&Up7#C_=_8~IRsm?V*tW7y^?5vM zE)Bofi_bK3HkV^nlso5?%QeF*PPtrl6sXgPV1tv?MyHGg%MHo$ErVqFS%75uS%hTy z*$T;GiO92x{&^{i<)?+=m7gBe$d9OzpA2f`X8{uAXK`$_w-ws6Q1BIPN6;VNTjLk% zr#IfFpV9b5`pL#$rJn_?r2H(7x9evs_R$8F6H%u%esRuEZ+w=1M&q*us7(>&8=tdk z(nRBzsDjq`rTU;r#Zzz01qk{vnJ^lEjh;r>Uig-czgAD#`0MnvFg{mL3qE}o$6v3f z#qoIzR6UCzNt-cS!z@D4bjhFqKoENhRs4j;_Urj@9T|CXwgDvND^04X@@_CP)tz#Kbb2qn75`$^@dhnFuA z4CFebSBmI=Hc&}^jrI0#^|q^d9P#v|o_hG|*wg3r)Xz`%rzi9@hntRlW4$p8@1oZ# z_gOv7o0An!kLk(w$o1`*p49GHq1{u}?kDuN3mdTVkLsz1%aT2PL{ELqU6p@CPji~G zdU{w-SdC%>V3ii6m@&F$T8ZP8p8q z%=Cfe{Pal~o=D$I`iYRfoAhTx`UvS`A$>dPM??Bn(vO7nEu=pb(uYVNC0!h)F=rc} zXiE^L5_s?L`h6Un5;R*FOjK$@o|?{(M=y<8B)Pi4dd}8}aA{?!GGx;ka3(+#XlBT# zGo;JXIGP!DCNr^=-1|Tetf5wcaQ;p5rvinlN;H zZKDfozSWIxTl1}M^jvSWbKFKdYYNvr-Mr>o-RM`X`Bpc2o;Ql>a-5#_))cNAU0n06 zZgl&aZ*`+Pz0tvO8y&1ETsL~!ns0TZFJAMlZuA0glyG*(>FH=q;kwbSYrfTup1tN< z-ROnhDBe29nL)EvVNLgG>OFnUx4O}ntoc?q`p@|`e0!U?k*gL&=pULv>n(`N)lXwV zl)+o2D>fEH^EL&k!}hY5{l*hp3^kO>h;E=1=+g4&6xKq#onAcY`m3u&C0Ci&ATsP}nt| z;VKGmK01x46tjAM6}4s+^+Y>f6kQ(qd%222RdeG(SU$~b#%LAA2kEW0n0o3}l&V4h z(`*~#f~_hhtELX$M&qVV+Zw+J6+lJYSik~`G=$VxU5R)3+N)ZNLB3ignM$a&){B@7 zw(??{i?+2|lCQPtd|EASz@tD}Saop?tS^8LN&D!_XTH)57xNcdHkMvQIPh$@Dx2n- zWiw?o!V!Xb+d|)?v3hBwwU?=u0EWKDw|ae~wO3CQQ;pT@BdxtE{q3;nLuaO1*l6|D zmnv6jvaE!(`qBE!oF}D~X|>kUib^ZGt9WRa`ktxCVezE3nJg_Qj-v$6@NWeq?4DR4UZp~tnIR^0P@ zwr`Lu702E?qMsPkm6A;!<+eEbf3c<1Dn9(HI3(~!c4tiUzdF#%KO&pFSISD*iR7#J zZL1LI(-0N(ey@Gj4gfHgTL5`_fp$&olQsq(2x(>)ZL?hgyxPYI@mHu{L-bI{71G%+ zY#w{#n97Im*d5tF$BKX5TFQs-RYx@_HxfMNLsj(!Nq{UK<|jMF*T#UZM^z&5$#MTX zt+GRhUsBvLIYG@_G5t|ni5qy@oDnJno;G&k>`iSQA<`MU-too9KCD3sJH4$jW;OKtgx#65B&zvzL6k8?4C!qy0A^?P%`xImQZEpM zc3np_Za{s4F6tBge(#C$J?i<$q&AD(nj!JjEqr9U@)MLuxrG<7DI;a?HXj|&%TdgF-)$;N5}{1s{_A! z7LEyT)&*4>EtOn%FOhA-;`6_&jYn-n4ku}`czv;W1J~R6zFrF|vFmK9#9$apH-iqe zqPFR0BY7w;e*G*iO}ZVAR>s!P-LTpmNijIaE?jq8Wc-jyD!)tonXoJ-OT|{)%@3)7q;o^hsy6#Un;*#Jyd>|dZ_#^^-%d;>Y?(xlourY9G6B8 z2HD-V^-#89|v=6yDi4if$daH&*)NfeHRFp zM()n6*qN4Ix&(I!PC{~pq);MFJ}P}2ap5%|#|-S_J3&pzLZtlcih1}(yoLyZ*&0Fz zgbOib>31haNb3MaJh2;>E3*O80Qx$4wuZcmW!}8Zi%GD~+nJAz(8OvctWyj?_ScE1 zL~_h;qAwUd^ioc*Jh`RYUuaVZbF|RmFIw3v%i|(=8Szf&qB9&BQXkjHP{?;8428p; z|4=X#PIi>&(YZnV{G{@ro5^1?Lm(j7r2I+qUh%EzU!>x?H|IY_fj##U6%E-a?# zlWa=!wrhl8YJv_Zb+6MhPN@#5MN73waqlMYTBL|6Kq@7Lt%p=X%0g4(CMQ-S${)jV z3a*jn$^lKsu0cy=G^fI#lQ0pLO`GQIKCvM2U=UcF%z-mpwZNfHqkZ(9iQ?8mj6p{P3Z55mCm_h>DrTB1PG1o-mMKt=fW{U{ts0lAq(+~dr~>+C0l_+0v$jjD;UaHX(;5R|>(PhtMY44xGei_u;$4#}(2d+e zjA#`0M}U=AhnQre=i>TiwDcNLom0&Pj62T;r@~{Q&@GP78Xmy4twy8c_7*94P+tHy zARA*ivlQ$U@LeS|JWTmS6s(xhXi1{r#t=NG6x_!bH_WMN&`vZKL!g5iZL$l20}ue0 z;N~Oj8S;D{Ck&8{7H&;UcyT&~-r&mwn z5>q4?PKxs45Rz6L*&yK*3G}qf=9&bfHXzzaiDfk zaw)p#NX}ql62m`=*;WO!-3Vqo+_bYO^ zN#Ig!d`g>w6--k39+QIi7Dpot7b%7mO?Ws}!WiQc2gVG8xMr|0k{3FIDv{3KqU1R& z#{7n*K;R!~_2Sd2)qpp~eeu>r&csM>(19$fQUFP5&G9RcAJsFyvHHy9gks#+G6taR zYMcU>D73V{SULcVx*AS1HGzG|G)uUD6*^4bDQ@MS|0>pip_W0asbAOc|7w z&0ugbw2$DFzCI zy@45k4C0P^aVdAq`O=qk$36FK;j3Dek*G_r&%R|y0SiPsVb@KqcfIv6NCfPu21!nd z;K7GVD-a(o1`T)LFj^W+A&i;g;U^4V7KWM;z}b>Z!!xWmf7MC`2jkZnh9`&>6@g2W zXVP0)nV5TJwCnYlPqOpnOt~vQKiNr;YKWPQb=59TfvZj`@r=yJtCw7%z+ORt_oy5( zA_kdz*cseNc9A`v`ErL7TMxB5X)%b@oy{h3gdB#$LPn6Se2vJ(3os)lqW|SN#9|H; z;WdmOr*rf|{`F%1Vk;$hiuSNS?|7~rxxm&A`O#B9_MY_Tzv-vn``&+^y(gIr|HC&$ zQS=H$s2tv1+m5XIDInHq4}~*S4T3s4(VR+FplRjAQ_y`&{T2S_3}@cI23sxhi6JQU zPXEh`N5(i{}EAA0K$O4CT*o7wG9c&CyCUVN$Y%!+xCuI7!DgM%0Lh@0z5q)ddgmM%Y@s zAHKlPrIXGUZ4ywk28gseNSgK0`+gvAz3U7SW+f6@lot1HF$4KuZ&X@;)ONCdX}Efxk~bD4=K2Z+T4@|!c^OKB znZlf2j|8XJzn|N+nmf-sy`qZ!qj7ruh2Zq6?OoeoW^+}0z}kA&Mgja(&aH1yXcymJ z{r=$GdK4D?ymRaLdFR&3h2eSU*1z}8tq-H@X|X0})d#e~AT4LrdqY~zs&|L9oK=sI zE{f5ux&3#n|%u9jW+Iz~zf7!Oh|Xd3%nByC^@PEV6dC@BXzXFcpT>FUHhkjLQ`Jv;m%&+;-^$)1YY6#$v{&aD=gUOm= zZ7;@2&Cs`14YA}{^&vELnm0s0*J}v3iB-iyL&G&6LXS4C`4Ad1?MU%3)@{gwR<4J- z(VF@~Lknv@god{2LsGQYZ-~>P>-T78&4B+1&*7YC# zr?cMp{oo!dSGh`?%d|))SPUjAKdSVVI%KDP7H#jAr|afz_5SzVJ@g7(6oJ~0;;nWM zm7`=Y&oT3{ijXtodhVfecdWcaN(pR!}qm~WgrlEKuRL*=}Q zrjPgKlyhk9Pr68k$~m-lCC%-1a1E_pNw@R5atzg>zsfOm9}ksdC`LJJRtt6DZZ|(0Ox};@(YPN@K1WTXI6?7Vt<;U3rUe z`xY{KDP58QKSYw)rY$alH7WPD+~X-o8cy0+xX(8!6gudm`1o zA;q4M6#->L@>|=hfHqFOb9flaCXdHX_QL}idnxy5imL*@PZFJk?FQ3}5?Nn~7$XZG zJO9uDrb#=CZ5s+Q^K0|QA%i;Q36d&$h80{WKgjSZ3m2dQqk7?cO!%SThibdDa$e*+ z_jw4b=H6tFnA)_ZXZ;*a*tM07n%&2+!)RU%A*1HI%*r+f!gBI5e5`~ci^&j=6$PEH zIshO=dlmj;&PI>ytze8Gw0Y|n6atj&a*{NWxfnun};4w458I7PRW zMsNty4klXFXInrhOFkCM!cEYM?a8qi$^j5rq-1C(}4KY;(iSFGuU-)Nm-lB z@9MIS)#G`bch;{=lnc>VWlC%FqXMl{Rt7m*WjgAw%DTs|Y^Wm_Q~2w;&P241#) zhB@O00@KdK@E-%?ejo{qnkm8ap22T&)>iSQZ(M|Nl{crxdYNmZ<+Vu&6qnP#uwN-@iFNtFHf+3b!D$x`vz z-`7b9VveI2kj`#IL&)B~!P5VBn0;VV_S2_ikIrZR_vY-5&DoQivLD=3Jn(^0@v;7V zD>`lXs1|93IpPrY0|uu+`b9d%HZg9eOKKjPhUs(c9H~lbHv$duT{_c9&hnr*i8{E% zPX>pFlSa65$k7+UFDHdgaq|Ilew9a))RkrYtF;X)_dIqM^!rv4J$o_G(_44)32TCU zu}?O;OdT|en`P-qP5Zh~rEXS~e4J*JvRP9M&X#Kqnt>|Bg#r5xJ3VyX{S>v2Q|bgI zillf16cHfWQABe>2EHtX0#JezZJ@IKnd&aHR1xCbk5&2u+vd{2936Q};0OsS3=*(; z;7CT`2j1uX=EvTNK8~(CPPNiBfCm5g($BSLJ))NZmTm=0w`@+@4~6Pjmg=#gN-Cag zVCMWhd`sf7v2u?PhkpS6Xb_hZ6=kjvTDX`($CR9Rde3q3l*Alq=%q)XLP(Ej6?ebY zoNbsjV!LuHA(V)GT={Rl9VKYE(&jX$ddr-KqNKcMp-8;4q)|$Hu3j$iQkoZFDGC}| zm~ourxbY9a$efz{$)ml`j)ew6cIDPdnXYjXIhP&#Nq(OPx3)3 z>pl@tE=%K2rkv+$bFYu>cH&dT zup2=Qbz1}DzSSd@Y$H+$PkTHzNl&LBqz)UiSOjZ4<=~B>r+(K|e)Eiccim^ zY}plK1$Z>y2)yCYa zfGcNet48HROQ(3}t6y!cfq zA9=Y!O|15iD48M!iVONkD`sjy#o~M)VuSNAzp^wiI4O84 z+k1HR=-60|$>7de?c(sy0-?Bv^af`c4*bZfLCJ7Jmy)3-xa`QX3TPu*K9?$nAAAi3 z0=8A=a4a#;A)~`Fy+BvE1bRmVbDUVzKJm@!Cr@ zbJe%)69qa~>g-83q;^c^Na=bh@^GM$xy_8?M-!`i;9~xsaVY|VZ#?l9uKwLco0}bV z80<^Y-a`4?Tr;t!x^p{&C$pSJ>^p`O{dxCa z)v2mer_MQb>eMObLfU(Zm_TYt!8Y4ep~;MfpLi0JPsxWBp(u=i1GNGagOKzZp4p_c zy>f9HOBd!DYZHcJRLgcK^+>!A8 zOyw*xEi*fjREfiZX81;^g5~!hxGOKa3|#b6EYgOls?{YfF0fabD$$?JefS--UR{@! zrC6^{QG*gDy~>|#?7_Q;WJC3tXxxG2TazT65jHH*y6-_(mDwj>;j`_(M?J?FG7ItA z-jsUPX3tT^6XSm^1SM~S2lMHlq%qS~AIvT;<{}tKYrVd#ANaDKj-ATZzbQ{C1GQw}DGa__1DTnqD z=$ii0a91PIxD@QSIQ@~nv4VRuRurH5NEeG-h6YtU^pWnag@x~v-4GvW)CJOfk1Y43 zL8xVo+fYT=7uLW_+&GMibm}3>%g}8)?vJTS(KD`7>Wz*UQ7hIfUW zhVvl(iD41m7SR~Wh}%Vn2Ci1PX?#dgq;S;Par;03;bd(ow{7<-v+7a>a;q!`nTqK! zOkwC+I34=#weA?v9l@k&6FY*n{<==e1*{cZO2X&_Q+u%$y%)*G>_Xzo?!cOuBk#~h z#pk$VP9R;DJ9KG@GrQk|4O+S`ueV^Q_P3nqcA}|woP^3plAp9MFO42hkHcCW$Gw+0 zF4EkEj`XHIv=v%gI|#0i0_N7!4a9%&R~>OT?zCXc>Lk^@zN ztM$cgUK$`6kOS9Sai@ZdkOtY1mj)?QCX)t4ttFq+pg!Ghi5hy$YMBV2IfLg6Mot1zg%#PmMU)$ z49x7AaA*cUu2OXZZudb3_sD~U&q9t-oo1{#e44eS`7xR1KkT(-b9hamh-0V?5}L!K ze`*e|r9OCpo5O1oHo^>CGcaNRrGFN&c*QDVlXk9!Cp4MYPYq1!r>lnBq`rJ~llm3G zv2PL91K|y0ZhR2VG%kY@rP=IWYA2P9Zqw)JL7w<5F=3yX-8Zwc44d7vHH0=2aDZ7% zzqqRIY}rByrniP|B2rb>-<;q6a_PN9sjipkqq`K`Y@m}Ou*&>d|LG)ZN#`x;BzkdK zC(*YWhE2M7Ei9fsxyv=jtSqIZ@>Z7e(RGNjV$;&pLsP}&2xcPN68>Aat@zpSUxGCJ zt0LL(QvB0h>1QDtgc@P5HE3G5N#I~3&;$Fs)98D@3ED2imt-VlF6!)fT};+2TI*QW z4Ww9ro(oNl^$_S`y!`SC9uNY2`JGSQ@QQDG-+x%IH@^lmNqU=}y&wvVS%>lsgjw5l z9TzWB*z9C0&e(Pj6Wn_qgm$x z>*+N!AI^vu_Tl5VXy)+U2MFl-<47uEB>f&-T)5e*^+=`^d!brDXFGPjFJ0f==!%p zu~7g>)}lt=_9Gnf!ns+v(9wV5+-k9wXB|cJK-3qu&qc*yGmzd{Thsfu%QaqwYSG>k);D8DWsMu&OeUCRop4;9(Fo zHcE_APASudGcKA^Fd(&z!rQh9K{OpjA|f)2!p@8%D(0YgHv;L+k?} zwpLlrIh}r=*>}09YlgCkgMdKI(U!&`eN_Y@gWJ^+ep;5o%83os7Q&>iMe`~ylKmxC z(I~etSRLTe5xFag4oV*?reKzLESXyRVz=lZ zWUx>J62Tvmp8A7>kfN9&Hkevfzy&s%L+w`193LgCpa+8#QeC>5k+5V_*5#QhG1xML z+;7-Gox+vt)JKb9X~imPSk=;1t*Ym$+X;Cqk(E zP%lLVs53^F$zOG%p~I0Zs%HYfzNU_bYhn_kJ0qka=L$lNl?n1{jcqzxd{W|6bAzi9 zigLsvVe9-yD#7&zjz7}jG7N;4<^$}-2Y^ji%^;V#l3*GAlCp~_X^R0sOtB^+N3kAY7X= z+1aqfqYhIQNXgb4yXnWh^^zl-(J*9W!@*Qj86PQt7g_ab;9w@Cr9J>qXG1yWONb~l z7++9Fb)IEMu|9S|9fh&Xca%zchV#2X-|~*q+|8p;i{ZX+B=NNZ26tEA!~h@a_l;(Q zJo~;GTD@;v_#{Vfb__U2GF_%0cr< zEgh^`J0wwvhAkZvGoA0*xR2U%tg#*Z+cXsjN78#ZpX`GoKj#=~4~m7v8-;Ci?*p_P z`QdYlD{3W1HDhmYq@d zG4{sB;vcp4iBZ2r^wVz{N-)PflC=D$!yaYE0W7kz_>ACV)F}R&ZbVlvldk9+8Bow~ zs-P_DV^NR}6>xc4LCp^IE_@Z^!6HXgB7D%0A677wyU^0N&W<3)x9$V0qSuCO`}*^N+JNNeQyXkw2d z*n;pnq=$?RNIZ4&VLfeiPu-jXv52{+6h(ulo$hJU*^IArPt!RQ9Qdqz+Q`(AC&JmF zZA$5(0vWf4XynrtY?IP*GZv)b@RWyX!EUxAY3*hwdYs){i6(0|tOdH8moxqy;1>KO zf_q@SrXO#_@mf;>sb_4arfCc0(X(mg1UfilY_#rVFg1GU&)yONSy)lk$jpa zx6?0b5nXYj1QP=vu7}!zUPU4_VCa`j`FNYN4$EaXRN-u}kqFSbfY)k21yMuDMK}Q6 z4UY!(gKOMY>jiheUH2XhJ9VGB_gCtkgQ5inRRSZVy9Y7&OmGjsftREon z(TxVk*Si7oyHD^8ri)*ELIb2^0f1~kD~^wKECyHJQ2dgh`0!`FU31d2i)JyT-U*6( zKDXoxb+Ufbi~#jpL_o!{X^Pxc0<2yu+v*zBEaVj}DQxz}9eRyRXH3bzuz*C&Jcn&X ze6TV?jEpp%v`pJhR4iz{SyP?Dhv5|UQ3DDT8#R5;l}g8Gvg3@}Vuk*NFI6b>zzKOp z&xjJ~0a3Oe=S(zW$Vt=rWU-0I42AHGQ$IOM)v$y+iH++n(+a*c25u*q#)8C$c<$*07`vI30BT<>C)68a!PmLFE7VHd7Ei`fXzfkN>PQFHLbk)Nb1 z&+8d_@5&3R^7=WgJl1mnVC7kC)S<%4lj)Qp=n8`!b}%SI?^rH$*u8bX1{*U$jZfy5 zLI(C>)sYFHd9$n)9}O^|kul&Ho!(SMD^t+Mn1bsN|Atc+zncM*rMK1Q%W`Aq_!-{8 zEV!5V&$Rqv01AJ=87*J$^KrTxP~;}Xf0C*9co7sLe@(IdLG(lWSPv9?8QV9{OgCGn zIR?Hs0mBmYgiQNbjwH7xki9G5M|R*86I#yP;a_zKTI?swElMu|O3#mLcRPnK%;lfmo;A zlPBL1drBT`h8w>6D3o)R2PxD@(*|XLxx`45uudYzVR%80MFD7xl>#GENK#+M=Xx9$ z>RFm>?~p0IhVz{#w{gf8(&9g)C9+{R74M`p^B?+KFEZuy4v8?xbi+lGX=fiasnr0H z>DqnS)VwSg_}z<4+mr#BUQvzwn{jmqpj+o2MIS;mN;9# z65&4C4iiblGv0P;e7vdZt7l=%V#_&`e8=)SQkpfd;@U-Lae1n) zo$oE@KYUxPJY005;x|>^eY*Rg?(WsyuT$RLy0P*W`{gax%7a`>Lqf6gq3|^6n4o-K zfZwgVKhoV%-91DRN2($g`bD6tR!t&8uL+1c!qk96uKxRhW7S7ZD*j%eZ{_B35Pb<7&Y875e_;_jx4>FSADo`jypGIJTq-?EQ~BVmsO6aq#?(U@F*hkoIOp8%OgV)J*)M06bR{#%wyGioFrn5*80Je=P3L*nkM})#QqUXiTakvYHt_qk9ZVx7< zm9b<8&WP|Qf`B((6HMsxvQWaWt*DO>jP8QwRlyb9VO81A#ayYy>&VT<77tZ-uB1@# zvFQswOE+3CVyY`WG^m1qwcQE+H*!ac8@Ny(25<>Ks^CW+ekAzxt>D8<1^-3| z|Md?3UV|$5H`$%we+PF2_rT#-283Ig9(;f7+)1p-`yBw#VaIn+?SjA=Z*}nA;yxa9 zm-p!7LiDoW-|GgPz{@Q)hAD%^o>Xh?d;Rlqu32k)u+@07`LW_KX&XAN@-St4iR%e$ z*}?vK%X>}m3%WjKBgkE4zxzk^xXZ(0qsa>c@N$zO1{0}bW#Z)WfUJO8CnNwUV$NYe}e? z-cPp_r*O#pH%tlqCa$OAD0Bw;V+h73BpRnj#T$*P%y_*uv*?ewmTMO-f$Q~ci@V&Q zi|rWD%dgkd%R)SHl@h;yU2v?|w^zE$K9_->*2~ws%bQ%vo89F`y?j}?*L~AwgW#pX z_t*tFXE5myyS~jX0qX^XtZQpBYvq7*OEO7J=0?(|5EaM)6_sMIMDe>472_P%W1gY2PXGNnhks zuE?iCU^h|5WJYx+6? zSp~2HN4q(0gK5@|pzHRFbeJ&0${IbJIE&-Z&@SpM{6X7I#FDiILfm33a{x&(lEZy> zBjp4zg`+AH8mThTNM%C8DHFS%MOTx$ToYuvye!<5bwp5I#G9t#vZvS`%Eq+2V_Su7 zvY{E*1RST4wctkAz$K-^Fgr%!XXsoL+{ztV(=A*uQr)a4CZhrSY2U;>v3_pjLaZXm zRru0PT*fTpUhddmv4;z%0=!aBI2w(S@doaRrSvUah&^;87ubO`nTBP&nmddu7Ao^f z-D^XPHSQaEB8U(Ng@}c3=Yn9`$~T$LJF*|^)D>$ncU$MuBeX-NPh1y17DnOQL#>>O zD06%fPnqrLn&6?3!Vy&B6hVzsG3jTUu@cGrO^A&u4^~)6um#qqx z`sGPXEnZFkLcc@*I$yzqdYNFYu9)eoG&2gmAk9qaO*JEfsb+fNbTh97EqFX0)fL9? z6*4N!!`2Vyt9H~eGMGv@ptk*kSKD-z+V+JDBTZM_p7Rt}X>_H!hH{6vI;CpUxKD{A zbGMWuBcgtXGi|JqD{^Gh-=w{Xph}JmCUyXF8Ap~u-Os!#j%=Cw92us)gd?MT8b>Zi z+Q$-%k&Lrh0tsprRez1>^DfKS2nm_rPyyI;&O9xeEtv4KpsW=$macRTlFm};&KGTM z9UmctfH@Me0skPbOg4L!N2R8in6ETb?LSn9mFY`$SeYKG!^-qf9ag4?>aa3BREL$x zLXONIDsby^hm~nFP%N{qs$gYe@?%0R%|J`t9a~ATYRYCVLz}jq+m=)r+-xmI2W8N5 zOx-*NV5E6{-kA|Xw5~y;P|Nct^&N3J)O$bHuyTMlRZQYzd?bIWQ;_5G{(0EtzlNPO^Lh3xD5i9hl^a z>&;p>Ci67Ny0PoJQ9Iu;VEeA@4s@l47gE0Md(SrLmtCocsw?$Sb)_DvuGB--m3pYU zQV-8fSEA!tS7H*GgFa9~R_V%?x-zz|WZGPHo_m8KQ~9kY+#AI*FFVk^(Y9{%K7%l! z!!YEnVC(PToJA!!lK8bd6zirf*Ga>M98(MDKElcdQvqxc^1qOmJ4Xx zN>hblS+DQ~knc$Oy;DNaWPzdHNJFQWvRiD31*JJVwhv7hENQ=sE&AZBAkRYW zpkVytyU+6or|{K*@1IRWlNj8#g8c0SF)K+rs-8?RnJhN5v zj25@D`4J+rm+ei`Uw#;;s*YW`*VVBTev$=ZG0 zi42U`8Nf_cnU&?S29b?6sa1}jwl##b`%JUU4lAhPZg{LsIc-kL)-Wx*@*U1S!=5lY z(1y2-NXyL(eHiNV1BzvmrNjcA%!p66ITK_QJ}JotMx5)GB!Y$?q}sEo z5=KHjXyAzrU;;F9UnN-rRa;|Ns+F4;0$2^RdszV0GJEd^08a;csc07xH-Fr5F3|Uc zqiV>PHA)td7@m+Ki#iti4dg&xWG?BJCY3}B|H5TtkZ3{IL41>IX_$Bpq+tqY?G?qw zCJR%e*z*Av%P;~pk_0V03}s`YNMTDvXAUCiyR^;4QRokTnJDzr09k3z*fJbBLT zaG|SlqAO|BeKo=?zn+gOmjk$|vMT-JA8)T_(-uIaCr_1&*JeHR6% zrtdm6U32s$`fi!b>AU@8&!q2``J6gk<@;x&@BaK{ZQ}W-O-L*6D-?Pn{$Cl7vDA0V zG)~{`r#YWyu^QkD)-T@O*LU9WU zShgwB;D-lS`|wNp5EOs$ajb%xD#i6OD9b+r2M}g{p;!d#2xE0Jb!ak#VY~APgBdSF zn4H?qi!e3>D}j)3Aqc~aDTFmvMi?gM{--{+gz14#iAUrx(_IiKn3!8jm?QqHw;9-H zx~fF8=m#{naa2e?ahWIw(Y%zP``C^^F~$`D z_PH70p7P+{t>i2`wp8%Vj{2SmQ?C{oE0cH$m|1o>a5lQ&d z%A6dTGL1>IhY7C#S7sZTn`}puZT-U*#R$=H-wdRl?VhmrZTO4(a-BKADG)y|*ba!8 zu+2O=vmG;hwG|M{VYwAhw|*-ix3bP+71CBf91y6b_G74vn`Y}FKw2Ej099_gAgv{2 zfrKeLwaeSG>cn#4wd!i8%~FgpO`u&&$Wyk!6OywmMNZM7FcQ z8xx!!c|+}3^}wnu%SSKR74+87rf65#BY<`+NGv%(=WM-i5|d+YE+01o${6qQlCe!C zY3{;XV$UR5w_vNqFx~DXKJ}QuV6R*~oTk)tdUi6K(3Z@J*ZZU638+Wiu$a!Ndf6It zQxulq1kTV5J<15(aZg>hJbz~^9F^Jm@<_Rmkz%`{=__MR3Ec$r5}Nx>~1OE=$Pu+{==W42P*?3EOP_5owK_dQle2 zmuX!s)4Di{P>XbV%WGX+wHuP7+F>za&k25%fWYLig*j&3`~YSQ7OhO#3bif7-f0=# z-oc25rC+sT30&q@xHy!Yxr-j;br{`NoVjb9IWgTzN&&i+G$hUVTz3;Pu>$AQ!e~%l zln|A|EfKrQDAWUqO*Ck|wO#=&RQn3(wyHp9r3%!Ps8*>&2^?t^I;~#;DVV;dW9rb6 zQd316wB@}fj^rRz%Bb6@I@lO?YNH&8SK`_-ph;E5Elt80(2~1!D6K@p#P^Iekb4#y zC@uot#M%tfCDtBGy~O;{g&DrOMqbSdmjU-zo`|lzP9Z6%qO@W>0D1wc65rU^tx%qM z2gd-#svE-zJ7(Fs-~bEa)Ue>0BXCsn32YJa!0FCyCq3#9YsCR}2X>=6KW(}BKoAr5 z9XEpv4Rh(ow934~$MJ!j4rt!FJ`V`+PaT%h4D)8IYgG~2RIeiLjmuydIn{a-FG^G5 z+V@F|V`5lsM^#8fLptWzf@q>Eptm7ZR_N`5HmRpV=`biY?-F4fb(v{`HcgRY*r9gF znmT5WpxCuMwMU`azT!DTEIlEceJ%<>=UTHTpHz6=HT~x`dd6R~{GRH0tp7Zw=vhNJ zYN!i?Y;uP1bOedTEt|S|yyB2ndSMXF!O?&(eTdTeUqZ(}K%u!XQn~DdBh(ZCLup_r zHDecZ7+degls8(O`EXdAWx5LrI?XR%&Ig*XuE07+E`)VfY|>^6j&)Y- zv}B!~cvfRcoNK6Los6iGbLqC?Tth2yu3C4&xx_jhxMi%fqV0doa( zs1-Mdk(th3_XNoK6mrhF!Di1TI~(Xq}}Bu_~Bm<%?CS)%z3 zigk{x%sQ7QfpyaCrL2>%4%)IA7kv_eb;@-HLgKO#>%@s=3F{0P(6SK|g_vO8*UZC=8#MP1aNvVoi89=}Hw&J^rrCyC$;0EH~Y2&I+J|l=fdJ4+_L|PnB;qhqp`zHZ6!d%94YO3o=rmS;+Dh4CWpO-NnB|$ z6>N+s!f2Sy6*WwS?OehV@zLZ^t-h8SDS`A%XU=QN66DlPrGscLiEq~W4`=7|@Xd;C zReW>QmtR*qE9Q;cT*v<=)EAh@z@y=1>ofoHeRwhyiZ7J_`{&^LCtlT^?K^ zRFai>Cq9}Q(uS1f3Z^_brC>S@NajcB(78?;>k;PDDME~DMuQvG>Ow{}tiYBdIZ?qn zbuJ$*->kDYs6u1q8{A(3zroJN|cX#W)BcE`0Yri93GlSI; zPeH~wvkj>{<1^WW)E|>6rclzIaDHp}a30j957nn;0uLyZok;`Y)E_sXQGd(4r6Son zpCb7@MdKSPG`^ui;~Oe8zTvq;;~Opojp%$M#l!c7#mS#7`65T9Em0ozocU-4F{ig8}HN?oi~sv6ptjZ(9wbUsU? zRE5W9X_NZWvB=|>ZBjBfNElwWNwF0AJT;~~&umf}&xAl&Rf&9_V)1!ql3E#y7jBVy z;!-S9D=UuPBK1ex!lpbyPQV&sJJEr4)IwndjuXi4Tjlx5Dui}|$9C3q|BceTn>62M zX^2?z?odJJCw=s9g}@-p48Mel3DdA;it3JYR+vcZSus4}|@XT50HZ zz9NzGA1@6l?05JIq?8X_8d7k@UxJhxRX_9SS&^zW(w=ef+;lO6=Vmu}h}yTp;L%2) zo;cEHelaW_doau*yhC6D1lH5AvIwDeo{0@GCFE`Tevh|%89VOPGGjk1%Z<63rwB|* z%;=_S?A_cSdhXMTL)JzmE(7o=1#)G@M`ydF;NYSEB=(9|Z8*-kH1St6(|g~gk@8pO z`2G)ig(>7 zHfi5O&lE4~hPW1AvTpd5$tEvRH~h+Elb5I)e$}$ce*)cb8JnD~*yQYd$tKI`uv0XT zhhIe#;!D&GzcR=7CF+LD$MxN&Z39+_f3`~gkR!pxv4OSEXDvc?JJ4@xT z*y;2~IX8)vv195)!e;Udk+W;!f84;VX@Os`2x@+h_p#1E5LADgut!W*J>Ig@RS`#; zoQs5|O)(FMFJkw;294qeeuk)>)0hYUXC0u>C_Z_wMez)Z2kynOu$;yhW>W-!HVssH z->1Afv*1dd4&?Jn)wR6F<9$ZfYB|hoC#VvS8PbMLe->=8?^T<#qdV5b8&EVX-wBRN|D+B0lD!{DPE?dY*eb3aTs z1_rf33p^Y;GgOBtSg38!BFF$MLBz==bg9CGvaNu8pk2F4oWuAKhNX5-$$TVGw&UnL z4!RA3Ta3qB@-nbjSe>=;M;PW(ex!5c^Qd=3@lgsO5*ukg56v^h#V=R})2CPeS;Lgg zZE0jHi*r4JgsC040R?RQ#sS(zt`%+jIMdpL#uhv(zvm!_i?m!@wR?o)MA-2_gkfv) zIIh(+nD+BK7R{2$Y~v!A#`%+dKqaa+eWcg2Q`stMg=hlIEeDNJ7NP&utJk z@5?&(y&a63xnE?oz@NA59tk(_fo-+jwbNC+5 zeYUc>1*nrf>Pk_%?^@~2U5C{&mTvEV=RF*qm=7JmrzN}{CbjvFx$D)5w{ya)tLGMI zqb1%zwOaLR5viX)u3D`Nsup7<$cEXsdOO=Pc5xbjFTTa*wtn#nR6$i!hm6*J6kJ2b zvn-V`>CaTEaqR6BPJ20a(jIrZ$2~JT2i@-+3@nI7^5LNS&hW>|h>e26!iXCJ4Qs6a*IW@!E$KuU*>~bc76MY3N@Z znPcKyzml2*{??P#Lbk{CknM3lWINlG#pT&GUhbny+!kb2fQ?Kl zQ`?D57Qh6`7#6;!v_*@OG+75SvGGRxx@Y)xW_v_o7gQ*8elg9Dmb_x^%L!-Lt%gUH zK1@QSiu$Z`?Rb>^dWKVpNIXqca4wTQ7!R}o-{JCd7!H@KiIBqO${vRgZH;awf;pF) zh+WR*#@>`JJA0frv^CmGc=8w{yM-rb>keJCK^uVB18u^L?O*9POIhQ^Ye!@@*QQT4 z)LC!A#)#&uXVx=y@=lY3KnZEy%%*j!Z8KZXsi6jx)lGVr^e|1Ok6n6&H|L1k-X_=^ zhvROX>uu(4Y9EJ&_A>fBb|Homok%;juh+{qXNdwn_wp>`ZXI_o0BA^3L_mVs#4ww-Zz{#powtK*@j3+tr`$AetJHW& z>z-w)FTB7~x2v^T+nsR>k-A66Y#<>CKSw@NvyAd2i5PlwIReREiadK5-{2>TIp5aH zGD<-=AUcvl^fQ#ug$OkN4{_94NmL=r59PyiUmHGyyz)tqSEdd2<<4ZtI~^xAjn+kfev|gd`n&!W4G7x~&Q@U32QTut}<#y6tQF4C*$=XLfUH zhyo{do5#MoJxn!Fw>ihj^lPaHsM|WT&uQNzo<@7-GKu!gB}IGY@^Z9iE?4(B$X@F9 zj4n5$`Et3bXGeD4h;AEfi}#?ha+&SDK;L$v=5pEF%iK}}s+Xc_pvfYm&|jn+TaZkd z6fBr#U|O`P+RRIxDjjD@P4y1M!$z|p+pP0~f-ECUSPF{LmbFwn8p)zX64tSc}|U!QEOa9FkP(^cojwF-KQ! zupK)@^|v=1_KX6(mKPhV7jMgZSucCRH_zBL|CSjA_VJ^{Rnas#wNC1t1(0C!X)lF> z-jK|Yh;n9$PQ45C1n$g&5fOzlB2tMOtB4{t@3>%O`ScfyEHmW%^FkK*aoFo{vKQ2D z8u6Iv$A8=jH_B!8GH-EQ@IrXY@XEYJGm#o^QB;WKyv4Z5q~j*3<0db6+~jJXdfFtSHr%4zF zBU-!#i`$&I)>?wU42eI$V-*ZyGj~%|qU0@Wb&4COr4b{dk*$N3%)m-`Ly7Q~DPHK* zGWS9;h??2h9+|6}+35B7C|111RngdpS|{EDGu2s7HQr*ALpM!uqa${lW_THIF;rd@ zvOI6OSY#P*`R9c!(Ce@_yo|R@1>Y0|3$MsRf_J<-{r=FNe)va|cgF)^z1#D7v_jl| z4mecQbqf;1DWDdCU44m5x2DQ=&>A$L6(DA=i3DeC(l00C}~RM51qy+SQLcqUOun9ty=;UvG*mO7UxmJ%(A0yH{gY~5 zQJxn%Z4QDy1P{vN*XUtB3n+%6fT<6x6=4sr_D(X)sG)<>ziTHk29u+mc!-0G!?z(6 z7Ti9DEclu@5IcwtXQBS9{xA?5*)oP=B`caY$VSg6aH$chZBe9|*BO?mmvc5G*+IP% zt|GkV1f<=s6KVt#3w6AmR3E}Z5;M!xi4eF#N`=>=2%RvIH>$<03n_#?7B542HiNyIa*N{W&?9!BrVjW7 z0fg05KQey#K#0o7HHls$w7aDyd}YHmtn36wEZ-lxrU37t$}tM+zhtVg{3TNc5wvK{ zrS#DbEpWeUpJ=}-Zdq!k0~P`ueqq>HN;S5gYNTLvkp3)0Al3f%Np#u$jyR!Qq?Xl83V(vn)YB zOHj)~SU%V^xgdLf_i+BDSw>TI9y;@QtGZ3*hY)ZNCJJA%q*|O86GI82u^sdxK*o@dF}=3il_a>fGDNUCaa+vlwkru< z)NpVCYK#`JlrNz2j_8e>rlv~S`JF5nsUAfLw?Q`Pluciyq-Qa#i0ezyd=h0^P+QTe zO&A*rEz7dBQEvoI!YwI^)iocNT}OiY;Jdo@QP8+GZ7Q_rzae>OUu4~%cWqR)jHDbi zpOorFq9Yt1sEUuh3x}b?*yfpDBJ~y)-cBNZuP2_DDp??A4(X=|uIHfQ-munQ3a!0z z=x{#dmn3Mx?P#^heJGBJU+7Q;46$vnKtCYG@OzVSuA@sm8l z5JYF6Q)O_3DgHm*=-83Zb481DwW7e{^by+YU5o7OYe7zdiHf1Nchc|7V$Q1)*+p)m zoyEyrq4XvklfGcvf61~l4^=CvFIQSW3eFb2jAxD4FxbNF!J6W*JZuawtXZd_N8Zte z^c#C2K-qJ-F%vYAgH>k~N>snSdbc?lf%sD$!%K{?R*#;Op*(W;~vu^`FGK?fyrP@E>=K+sLneLyjtYaUt+P|AEl z9V$3Ng9x2I$fDhLnoJ+0=*%i+N|W&F;jy7CeS=?GEJ1si28@IrsmcFU8+k2+Co>ri zH$&gO30V_Me{ye7TlT_w8tx6HGB3~xXs98(8dpIcXd}{_Tg6re0~bbHi@}|KoPD%P zv5^!2ndYtRm}QD-mqP78k&(~ZR+Ww)M#kwm=sxLRl2*o2|M;&7)vFh*2%EbD4N)4g z7~?s_e5BXa|0KEzu@0Yit)X=I53-KQ26>$jiLI%i0Ao&Zt(y_w5G7h9|RYj#so zNz;c~ZWt$j9)&G&($kpXW82+LopfTFLKzn!`XZYfL(!Jok;tj!oPXx1F(}S{9&)L8 znFchYYW19&3_+?XH_?!Xvl0#Z2 zea$FoB%in?9!2jArFSll&gVnC73a6XKaL_n3D6RY-m}m2H;YC$1W}{enyCGWLmt|l ziJ=KfrPj7%9t|dvoZvvB30co3p^qVr=(nK2(36LF;<6u2>NlR?lN{i(K$6Kp;m8Mp zikv)M2IW@SpI#ch$w9dVD4#PZSYj(Ejwakti;5Q9kT(QEUk-8vDTZRD>fPiZ-pB>` zdjb5R&#HPLvkuq?5?EF*9J16bd1F1Qd{rJBv>k~10_(AdymagNc7a$yQ$R$VW%xyiIqAb$lraecTax>IvPAo@)5RFEk{@w;1@3YnX{X#R%xSGaQuX z3H?muG2{RdEnaQHHsblnAfQJ*phrBQ(*ooO{d5hG5jtw2Qv$>%t$Ka#R6$iY3i(v> zVGr{mU8(FT!FGgxss z5BLh5=vU}O9qj5AI_@DH>sRPlE$6T}*Cgh^M*88_2+r{OYwBDcV@(*1q7XG5$+U!8 z1r^nOQBWWJd-2=F5~@*!xu{AfaLgE0?#|H?bedySLH##X$=w;18gtexyts384ySSz zAxfZ}J4drv>RXJ)Ys|PfH!|lAA|5Ip$0}tyIn~g+Gx+JMa!-zA;Wwb$vNH7zQKvU; z#}~)hbT;J-)KVtFtq7FVpRv?kR=jk|F($bC`{|5wpOX78=^qt%w70L4n2$_P9GKiA^k_VYMh>ydCCc-)3G0? z4$!i3Itb`t59lEe=#&7taeAr-=o!ap1+_L#PkNXS=t^Zz2(}xiCu*<<#%Tq|#_1Cx zV48QXKP=9b1Z<~e!-G~Crxl>uIK5XDfi~{;6kKlTD)2;q0=`!nS_%#Vb01YwnNA!@3%NvUJZ9U%S_Ac zFk-PsvB^g{AuZ#a&+Z1)RaveZ@vLKG+9wAmVg#6-ClZ~pB!R-~*D)D#aBrSN$AB;n zH;6p+*ofoJQoW<}b6wU<%`}xYcaPX=PoQbQR%#&mww3g>F2EPu8kTeDQ3La_Cclz6 z9C}paOJ_yE6VzS=tm*ntai$y}BX(d?CttHl-Y1lI4TD{IHDPChIG8uhIelZra*t>d zHu=(M0nhK^znG+3U{Y<0xhr=v#{p}_yvLPyErU*Zf8ZZf?y*{4W5%ialVxeI1PnI% zVa4%<-9N-t?B$e>$8ya0lnyG?43|m(sFAO8fJ$v*5YR~hqSqeqfH3=%%=knNkTGM< zP!hb+zK+tLH&;-jzK(LQU?R}&)|E0A1=}&>#XfAutNeNpb_s1ywR*Es@mf3CChD?5 zV4&aSEqSMhe%wPpCg>*}F8k2oVKzFnB*empDGpt`haE<}s5@*}O7-fsBb_4VmAu!4 zGaUy|>j6B2YGn5)@>)Ic2v_yMX`N!|#UWlZ)&tPFwPej;4-5i&Sb)IJLmtp60rKLo z2FQ9~G^0+9JYA^=DyX#{I4PJZy{ju_oDgg;4*Rgn9x(Cmdw_dQ-qiz&q6hXX_-u6| zmY9cpw}-qa$PW99eaK)RyS$8MhJ9uuvVrN|u;1;n4}@19`y6P~>vk2Q!0@FXbbTz@ zTGXZnRHN1bXSJrU`NA+IAOE6_d$wR0;-MEqyv-L-SN#|o1n`Ie(1WK1;H&{ST?0_p zKXCs<{}LOmSurYTHT~mZ5Az{&IAB}~wx1`|U<0W?PpIISxIZg|QmZpUs1x^RN`%^S z5~`$0TZdOSVZc%=-d~!+s;=tv2jfZA2s(Yh*X%^UW+%#;L9a3ud&GOBRluxz_j)jQ z>k9T41?HZA6!sTuV3=PS$^bXX>2UNPcMYvOF6+l9)L<%hP7VI8FBlK*HyHU+Q@E_1 z{fSY9xthXtr?22~-_B$Gb{;D$sQpH(_rMVkVL>^)!qv}-IFu9}A(68rfh{K-ZS6x( zzVRY^94#P8UZyXRWUMLkYNt0Y>AS5fg)$%Up)@X0PrFxWylgsZV8y0BzTxL4Zp%Y+cE|rJgh0CaIYyPcshlAE#0$4LNl9v9(Sj&$Z=n>WBm#pt5rxn==6+b zJ$J-ISWr$s_WL=@v9IIl%!*7Gx-o4AW1iA&&tjOB74z$3b{&a@za zj_)t@0Wx4gDdrQ=5jEV+y$uX7CW;}3vsp;aF=&gUHZIO3?3;$16KNq{YLMMa4FlBm za$~SY#{~>P9}R(6cx4J?br+#Y6BNTRL6BAC_AYYlszFGGx}+QmmO2pN%a^ zjf$N=LnU+^y--JWsvFO6x4>w3*!&c_%*t#Qr)}Qm4oac6L6`Gh;d)f7#>^h}wS7oe z=HaJQ>rYtUo$|G&%1O7&u8yn^+5u*EXrKi+O4POlW!~!I%n8Fqicu}Lpb*(ra!xQe zot;-PvP{v$z-P$%09R*Jb0f|yYP`ZCnEpCvoeE)av6S^(E)9GXy4#rEP8s|#n-Xk{ znOfXsXxUU=ef&5BUW`_@JLbO5c1NnSdVjRE;aSNV?9P1mHDouqja~1+MIsgKhSi%U z)awl(tM`Hcd4Oe=>7ga+0I4+gOdY^O(5)tsZELi^EUH{C+Fck9rDDRY0 z`h%QJcy+Ay3R9vqhh^OE0Z))8)TNHwohS(rrbK#9VlGL6p?0q)g}Zfy2`nn#517if zSmuLuk+0p)2M&%XJvd+Jm$Oi&*G}+PjWBmB%OTy9UITkVSIRjjP0W>ZuGGYsCX8k_ z5fZa77HPAi4lA#oMKaIuysWBDSQ8e~J6Xd!?q@K^U@v~OA1n1wIX`G5=~QJiq`0+R z98NUmMQ551l&T2I!2rsniX8Q&9PwK2f=Y2?exWR-qj6z2*^a<5Sj_-#_kNbjm=|%E zucV6bN`g#rYN(=wu_iM;dtPS$=$Ws8K&tSY~Ryu7T@$ z*4mHL5R*OSN3SaLyIaa9zj22W*FvJnb6x})r4W!0CCRI#VWeRa<2s@b8cn5Jpz1462SV(Mba1zj36d83bg)<=)5ey19vh6Dei+78Z~5-8 zh)Uh>Re?u^XE@O#9`C37-G92ow@9oc00gooQhimx5dea&R0aCVi`c@$9{xkRLIEl^BXwB^hveO17}@~Xh-64lYnr*To5B5M>$O&$^Qq>Ko8&U|{h zL>`n#-qPb~2{n`Vtn#wpbw+ue`Si?SUe$Kxa-Z-c;GFWl?iLf= zKN9+w@_TD;Kfj0sG69h`)%NQ#Wld;SDfnp7-M%G@g5+0EOGu_RF?7ZmgN`LRl||-y zEle`D?$2Vs#YX6atj>@`!lCT!(mIlyL5QpVzr#Q8xb<4br zz;cxn&d)?gtjH9b5{8sF??~NW<*Xp1?4UWxr8bifj_o!?bY^a~(=D7VQ*OZhLn26q z{3#KnQ-)5J1i4J9A>Bzoa31i4d_wsgD?d@@Tc+F~t)7&1&ni8(+%rn=>UXA0PuNG&vzSoQ66qfG@E_3??s&Ri&gn8AY@2-mPPg$& zlo|Q8^M08URaK{^L>(1yDCUSSWI=^EF}Y9{(sX>1y;`d(QSdJrnwg ztrDKl6||kB8ea09YeJc_gtWvdyV8&}LGCM1o-IaLmC-%;oR-W}hGrK|y{|dJYD2r8Ap*oGGimbeP)2&R6FVT^Vkt z`}A{qpgNW2B&YTz8nj#{oaQ7AhERs9XilqW(5O7FOVOOVbuZJuEz<6FlU* z|5U&GPnGxfRi5n10Mc~et(`Q;kU&PnB|Kf_z4yF z-E#I6^~_a>SG5V1z0%~#_+Dv5>5FcyM2$va5XpK0zcn!|0+Wz*tL8Kuxp2B?@TYG;t*-zq)AcNu2gPu-su;E@UtbJY)`gYC zu-nqXJg5}IZgvABizS9_p&n5V*#w#QdhLth3UU)M>~^-87-olpR3M@;n$wXJ!%N4j zSkv9=R~o&je)TF)zh5QhDylP+;&D$8$CTcQ#bagqWnvV%JnHG@h_3L11?6+%ccIL; zOq{|hrNSuvLw?Ad>hqsd<&a@4Q$KtOO1?#V9#DFe!xKvHZ7gMa#xCh`G%C}R?p_c7 zZe5|3#eO-9Wj^F2+S8*WD8*bK8%Z>6aTJ2aguF?#{RjH!q{L?q7;2_pVJ?tCR5X)I zK{RK&z}cHB^@$IrsljUbB;gj+e8~c+z^qJGzKl+`HPkXaHj*b8d^cbQ#Os5d;?mw~ zaBb_VtGHEI$4KKUCn8};X|0QW1KLZFB%f%kvZ-n3ZCVm$3RnEmhyL&-+S6jYi?pYy z;2Tr$L-KjeT5N0jLsBq8KJ%Z^S-*4}~r{O_Q#aSg*+|T7IVl}`r z3TQ>*HKAu8*OdZ{@1Z9dWUpEm7$o;yYq?-Tha^ z_oA5LTX%(b7Vo&IXXrl?rdaf7?uNMb1DW-doj#0dEdS3GG?i&}zr*3~R;rEkR^xF5dZ6p$j3Ye}e@>_3nXX^SJ-hTKNwgBtM$ zM05=+?x;`(;WYtxw(a*Y8u-_Z8+gv5IUyT%2{bm~{iZTOkr@}nz((G05nZKo>A$5v zDbS$1QFxuO+^0Tq78psZXo&(mz!{# z=5kAKIzkp`cOu)5v zz#nj%2swwq;sG)su2GKYoToSGfNWTh$LPISfsz{8%si1%5=KfD1!NjkH(*bA)^xFo zh^GcAP}BrrjXK%Ht7o+Re9gXW3Wr95xhZ)O9^~^t9()m3%@Zgx2(>Ay$RL{~U{@`f zo%7V8LnCV?i&Bt)aW*M#%vzwH*xccs;1_dwH(RSGkt^s2O$>Cf&GO{DMe3I0I4pV} z_-xPvhQB0sct+zFqFP`r0n?NWt~auElA6TGQFRm2RcKEg+Osy`46zD5b;Z8kI`shH zrmgzy;V&_Y5sutL`?7V4{5vzBZ$LMs&v_Wmx&Q@}6@o#oif+4h4YnEmUh9><&7Kch zo0H_%O2U6rK1IbKO&bAVQX!^OqgA2<@{|$Ji_1o+lnZ;rbh#CzaM|l(cHQ8H%*oJg zX1>LZl4-&M9=yY_f6=Vwx=dV9XSflz!JS^4pwusL`rrs~3C9KmZDt zf#p^OSQ#lPltzjwh}F|{Z5^VmcpOLGmjIt*MK^4S7<=%mLH8!&x`>1V=ZJ`CA1D*{5BewCx>MlYll=rL%fq7kV8 zU?tQmc(oFxzpM=;`l3T&?F&?3Up{5?GJdq50SZ=Q!t{4o_+O`#;XGw?#zH1N=*?6t znNWT7y09BqX|hQ~7%OdKA67WsXq2-t%_{xlA(0c<2%OI6Yl&VFiP}Hrf`c58bbYG* zYWVBKEeEslC9f^U(^^I3<9qsH$zx{@WUhBEW187uV#>hp|2%kWfiAyP0L`4z*z7Wiw5=s>>45TGI~F#^TYF&g7Z_Shb^N`cAckEmcve z!rt!6?qoM%D_PuoK~l7O8`575^R?;_;L{-@tnzR6f+C(D zZANh%2ZRv{5FNyEO8+Fzr?4LIJRQ%P7(kc+@F29+%eaFQxVwTo$b!3^q#RsB#KkeN zy}1lUW>kN3{z7}3FM0c-gZYbLi=@9|$(Qx^He2#`=AeQ;_UQK)AI$X7%Qj^%oXcKB z{Kz>DhoJ6I?Hq*YruS3Sj@k4y?gokU`L#6dk&_xv=|ilCYZULJ?qu1g0CDO68|Li4 zIFzl?@ z1?B50LLRuo`|1V7(6Lm5_0-3e@dewT(tmymU-M}z5}?yNf<_%auQq;NaQ(|%(HnOJ zH(V3^oLocAhYi!PdNRwVB*8cJrZpP5SeFvccYQV`E=l*z40PZ6C5Yc_-7&M|?G@G? z({#2@;Fw;5d(_K(D$7{nM=zX4Pw!@#f_5a*PiDB7egd=hs3O@6Rm&k* z-cGGVAVxK!yd{L=-b0%!zK433zNcPmG$&hw(vKRk-fFu!Uw@vWEenc-vY<$~EScyo zbB8@aXvUs46_8i2nAisniieGCB;BU6P4jSto=ji8HTuxYQBRpsOfmM={!RP`78v3u zx?_%BD^4mIW8J<%Gt&aTt{5`lr%K=?ptG}S6@a2`1@Msq)@9QwAaVr&Hx%&DfM-+G zBV;gllbn%#2wpu^#29s@m#CT|*mW8i>m=ZzLQIvqPQ5gG8y5!6Tc|QcN)RZY{Zbmn zJ@##7>(iSUp}iUE-Oa8LNp2Q53VS`Wtrt;VLE7F6+0NSA!7HfJeTrq$OG!&>g6xHW zd7-dDK`B)f_%*mcE9%WU4XsV`C!rEAiHL+l^jAslta{hE8hymRcCThOy$#m@;-Rd%yZOgXblRLEJFOl!{PRHY1;pKyv+SbAGaxniI zSDCLdihl8uulDjqOI{{wd8T4$BdDmia-fK%&DF=M1lMl8s^HfUK&SMe21;7v7{vB$ z{r%sYf9gU%M-R=dSGgUr%>QFs)7RwmmpA+1LF`us)-)Gm~T+vJGa!(QK6d z>j7$gl5O7=zAfLL?RY(-D%+r>8z9ar#1}R@zR=A!8&9Cy8S3fS_=%BQUTy>+fPK-g5jFKRtuINK?NJqIll#vzgmZ{TKeg3To-5N1Wb)At)vw+pE| zK+JNaV*Z`Uc7RmLDF)b)Fw0A>pRdUEU(@IMuM^i-M$Cu%xL^^ykqZXdtGVDPdnK1) z8GhF)aO+ksxH4|xLa3#T3v;uLT(A*MbHPS5$%T~$q?>G*OybSx#Kjc-wLKws3k}<7 zs_`Eymi)$T@zqzwM*D1-s)2${h#!y%KR^q{{72p_b*S9|BZ=9 z@$P%H;2}%-4XE@55e%hgQtDfC>XOcL!VJy&?z*P{DpPTy(Pw8*BFlj`Bo_8Gl zmM%g^Th4Y(Su?}TCSWP!19zHjG5hs&nbwK~zBYeKgt2XL2iqwZ=I)Xfysuh-W74jj z?>v$ZTlrID_0dyhj$89#EBDDjCNV(VVpc#gjHZQOqS%%4-INbi`K-Nr6)SM4 zYGhebaD-5&!z;ZW*7TJlHRIXn?KE%bdxegF1=~+{1>Z*TSO~KCd-KMTy;c_@7!9^{ zt7~gUTQRC9yTW&Z!dDzUB6JT|PYI^i22YqanFJB_lQJa>+MI(LVN$7;OFO@rqK11z z0>NskD}Gmi@BkS*msa3vSAm@l*;UhTGQ~|*={cuU@ak*8vLsbG0_uD}1UH(tr}H5r zoi~b^Q5&S23XaEuXN5LCJV_t64;o?g`{OrW;X8hhtIOCi* ztN_kFLT*e%IB*eu47Uar44K}G=%0SNUD_th2oZcNZx>T{6n@YV;{Yr%Xph4qf*)nD zneq5g9$9ETpRy+(>{yx>CTS+bLwvVYd1P%&fAEs&qh9JjUDR~u%q(6WQV&>I+SuyQ zILM*2Kx#TjSUv=)Q9_b40_HM|0($8o(G~)98zgH^ACf|)HXY^7GL%~isV?r9;i$}S zU^4$WEmGA$tSXAZw`qjagw8?Md9vxN@E1$3h^$BIt)=Uu>!_`@ThSbwzTu(?&W^P5 zUW=EwMXGGfQ~cDSgVs7Qa|g9L_$y*|ar8DZ?sd7piKoxhScsCY=CF8tG&YuX4)9^R@#R=_r)jP@*Q2!b*98PQ(n0r_GAY z=|OkUp~jW}cd#86S7g!r9Yy22>5}NseDT-fmc`SXos)R6$-YMV8uInyis4?of)uZ~ zZYJTjA?iK$=`I3G*5;_VlY4WjRx4?*RfI;H-csE8H(mWlGVBVo@O}co$3ibXliUzQ zj6yR%7LP1;(!UCQAY9AL4_3$nB2YPwAeLD_Nbj}uykW_mAA2)~5hZ!OiDa2OsTC*? zuIO7TNCDXJiq7qbEryKDdKTE31al;Wz%XR%WK)#pFpv#~9Mri}8B5Io>_Sy+f> z8LQxBH|F^;niXl|Zu=g|U4|g&QIiP+8qe|(hHcwTUBhjN$itliVyO`f21?eDVWssw zA^egL_R`>JWfeu8lT-15gMCU)NY$6Zz@s&Hx1?&Ebu7BKln<=6u%iRX*U`Pspd9iF z4M01s&=#ym96q{p>7QT_w@k?z~NaUyq`>n}nw_WFC0;;BFHCff#TroOxt{1it`2QB{i{p>qS zzYwNDki5>tbav$78bd@03p`WV{t*z!B!spU_euos*t~vpB@i z#yUB}CAOEHQnhnP?G&HaDe38d39-dP#quf&GzsUC?mng0eN>1E(wH!PYx+}T$r|n{UJ(CY zFK^nAz?d~_pi|$NYcbH0NAu~=jM=OpOz#~_?x@fys*8&60)^2mH^YWYp#44ooJJ+s z_b~8qPhku-Tn{x}%_Ax;?FZzhKPKso--DLcVOMc6M&w_4%Jl0#ZgoeUWDZ3WSx@># z>RmNdHzd@}AJ|xRTW=eM}Bjnza`v9><8G8{Ap`7r?oM&6$mjcDPfvHk`6k-y-BkGZ=2#Y&EDK{qm&A?59^xsH0TIo^pFDpieT!k~CeTgk0 z1;v{L!nh?g7^hFiJsAwh?!`x-^-G4AD$LA{OA#kqt*?r^KdpACC(t&W^1+;*vo)xw zF{k7kXr(&9eyNs6e);$}w!vlT*W?gw20O8*qV$n=T_{(gvrQ?EV_|xD)$dc^}i32owLy2S{$KtT$LVD{4 zN8U)PnPf`^wW35s1o^0-r?nvYOfwwzn#QEqq|;~PVxe)Mw~jinTBtEQlD@GB)svIl z{x^oSRNqM|R)p!%Ht&Afjw`^{BK4i>(U&sbq-wbsWVYK)Hv&yJEXkzRy&28+|FYV> zb`G43qA|uq#D+tdv5fTcp{pJc;aU0zp?Nrost6IKxNG<$XiY4T?l_YEU5KwSvE9;h z6633;MS6Eh%fbW4PSL0?&EsdFJ>pfyBBq?)hHRh7IVdHj?u^fIrV>!}f?bYkuv)OM}2(JZL-6_36{nP;p_eK7E!Juz4r_VLaQ# zz2MEM&Iu9c4$|MUJ7xS$G*41|1WTQg>DA}(6|Ch9(qFP-qV!$Qm+EM!;uv9E=Fcyk zRs5h>#mAl{s~AiAoPxf(7+&%71H3|JZliOVxd(ZL$gn;r29mDADhAqP9id z>a0S%|4Gj(AkYh76_}~URlgdmaP@;#NZVYQRs8%?R^jsWS;f+<*${8Qb)8k52Z0yL zD3}EUa}`EW;#n&Xm&PbcB-I#&0}i85OFg3q@LzyKh*zY)Pse&Dq1UT2iDQ>OD$CLD zn1t%%n1t@m&m_v6eJ1gq=Sy|!OhQvPaLSISBK+>;s*2q*L4kAYlhYkQyk@Rw_V(B7Fny>kwb|~adI6jGP9RkiN@S^k z6}$#l*f4vIlHyKY+`@BG9M#Hup=kGsR#4LShKjt(GMcT7lA|Cpu(=_)?{Ah1wbo41 zH|s1gZ1~)Cx#5tTH{(W|6q#-`IAb1U&`*jd>{rKdjN`s1C%&ZEIG3JIS%8rKFGhqR zxN!inKXeC95foIvpc)$dtn$e*$p>)$*sY4doR5AUja06(= z&(IW5=1SV0fdz*FqspP-S@LVyK8|6D#O@o29##n`t;(Yb10{Iat3fVPIgtHStASjG zEo2EKeO)$ezKL|B9(QNSj^O`fKpe={9Aulj^qoMmDf-YUZ{L*P=nE%o18I@beYVf^!IC-H{e#JgXJ5?BZtnPaigr|BD|d?nmCpaMw; zVLw5Y*GsEk`pH!NQ^HZ_GY?6qDcYdHV+mK^ML*PSpr%!7S5rM!gzLJ3Tp9ql0Q-)! zhWW}*XkTI3>H%07SeMeMKVW^J3=})CgZn$Zjz!dHo=tp&txCQ`S{KBi%dpop%;wON;u7jCn~kS$^pgZ&>}P>Yu#Ny<*9Eg}i~;e8u@n~H1lLmZ z5HOnR3hb$S_6V;k@`qDmOyG8h$#L9l3L85AaM!n(>?j&nCA86>tXm#!H^yb%_a zpVv8<#z%%pE1EHw*Fqu7%9H1*Hkk%RXkomEnQk;V+jv>cjT^}HX_Ld%P~a(3B!Hbz zbpS4UmT%G#IS#;vg;+Q_)4$p$-eE2JsNpzexYg@Qe+!UCATxmx{dDy+s-JQFjHN$H zPUM(Y1TYY@Yz+G(%4Xie0f^^HSQt?gr(RSA7ogMu}Q0yhZEj1|DS=!%Yefoh|;or z(nJ(v6VQZKZ!j68pNjI1FvS-$n9w@*nl*|a8+Ia|MJ?>bHU*coZl?bpFhUgV280&F z=WXap0_%-EuoCKQ?E8b{g_ZvB@pdtNsF=PTk^+yU^;!gSC3)}Yg=i7CGNcE!h{vBn zi_mwcMd-*mr$sz$cTyv+F4c&w%hia_n;P-C0X1UFT>9vxsS&^atksD3hfG~0LpYlj zYWQJOBenBIyGWBOr!V)E zRVHLC>Su8(g|e(B|AX}XEF_zotIN1rDW+KXv}Gavw5x%ya}04AO;s;Oy+E^5_ZS~~ zM)l%j2s^2+mU^jr(VwbD>4&r&CUNF;81iW7!QizDQP(XTM8PXew_xs{YVNOm=^qT} z7CQ7Cebh97O1(g*m{vJ}##u3~)C<9_XBgBljHV$;k8RZpB5+!U`qJ9x+fZp4D}h`= zx-3yNtf;=C@qQ^9HY!$EG=7L(RG_O=G~C1#MFXy5<^oV#S2R!@?{M_{Tqzr%z`9Q& z>`S3+Y+0&o+~<{zvOmykSCh8!Ed6GE#Qs{r2_xRnW6~TQ9ItQ~ueex+m1ss$I8`?^se@X zWGZmlMQHlK;ux&Stc184AdWTFkVA=XlW$n6iqL$mq4L@8lq_N?)jv2ZK=P(4mphl% zvf#sbO)!e2XOD`)*SzqWfTb~-+A0WK-6{x=dnf(O#7i(CauzLlEk6y@2+{&C7-{!9 zg_f0*T~;<9S=LE^BZ5rF4cT1PLIjCc=BF0ET?)-d1$KYZU-N3E*C)5`zHl32Ok_ z4!}SoIDGy~)rh~l)JBv5R%!%`r&02&eG~H#bk#~94tt7<+e)8|@)4QP36c)d%-#{? zZTbqQ#;=(ljf0TQWf@MVPOa1G5VT@?NUjrq)#p%xF3|8?PcgZoS$eLWx8^MZMJ8y) zPKgTcLcE!=;pl0&(0WTBoIDl;hogmc8P3|<10>q&Dcahpghwh24!^?JDE7W2>N~>p zBs=(dQiWQ^a>^vE6=>;0Ylj<%eDE&3x_H%3N7aW|nSqulp5Y*~O?nTDz;7zWP`k{0C;WMXvGu5V0My>|h#>#FWN&*R>D-74v*RJLVHz_}NZ2(UpAV=OSZj<7)n8k~t? z=u9R}()s2il9|tP?2Me!IJh~AB$4PG84=O8I=VpGWN8LPBfAFd;GZf5{9E6pfD@5#2)G+H_$*K2pCaH*aN>$O zjDQPV5b#r!_@u_PWBKJlf~xqLtwEG|KMufl4a9)wPKE{kfv>no%LGInNP8|~7h(pf5%`Cv?* zQ*tv}m0R=yB7zg`79aYAZIo^6#v50bR!af)``70!ZPLI|&?b%1q%7T&%_Py2qpIXn z$Hh@>yd^$Mn$nJ7S=LM_#DP?>o6r=mcLIq2Yc`jUTFz8HqSUGuk$-%N141;uu~L5! zr7sOcTNR>a)(P^71W%5VMPH#8fgY3~Wk~2n0X;&84fJ#$3ORcI`m!kervv)}`P!X1 z!%CkiXM#q0$r)mGbozUQ)yss`07jpTle9`)Bb=1noXl2O`K>ggU0fiYlrigxj#Cn< zlIJ58DWP%8{5y@OUng~Uke0BzK}*&j*iB+Qwz1pa>R3vc>{Q%oN$TPL7Mk1%vv0!4 zfDd{2XpIMy^3l#C!yO@;_WRhCHaRh?yTZ8^WmgId8I0OCll5=Ve9602s9Ocy`d}~G z1N}nJM945q4e0%Y8#;gb|C^qs&3=;qdzzjSu}t@N?v2@oR;KNdbJt+vngZvE-x9dP zqgsRug?dt6?DK%Yr2|~@w>rnPWCjMswvah%w3Ue6QDJ8g3C#X>CwoWyzgzqiKjTxY zbJUbuw$UTAe)btGZJM2ieQfFqsE-VyzFJp?>>(X%8XV+{p!A3#cf*fx1HMm=zK(+} z@{tch_)^^LF|Xr)NhXobL+Rhp!OU0ER!$iw-`qJE$F1N%wQ-nYQgi;S#by@E<;Gvd zPB1f;<4S!`;I;H@{rdN*Ooj5Zdub!bTCd39Ww-*GhARdlB^+bZbqXO%t7T4ITZ4#3 zC`+@XNHabAmsVr;7b9R6(u!MUTJbPeo>n}f&%T@vDa$0rT@X@SJkbxNG*=cL~*wtkdhmWp=%-oU7B>cSbwUqh!cA?Z!%a(vM<}!A>Uj7V~5Y*HfHz?@vr(>E_3@ zvB-kz9^g>V#L7;iydz(`ObFn-{g1 zC|CkL16%Rr1LSao18$5a(^G^X0JncA_vY|xeCe&!n>g<0Zz4Hu$BEA_Q}NE zw#IZDIY@(PBLv!GmbVyS*eApo!|vFT;=JoQJ?YwF^i@+S?wLX_J*C+psF`n{X{-EV z%w{#lp%x{W(0PgcBn47-{woEW9m77w{I|IqG2#&+gXfG~)n+G$a=UZw7ejdI889y71U z#RVmec8qMR#Yimav6Yw)%4w7BY3bm+D|?L0j7nyhb09S?Gjx=HL2l$HunU>jBiCIE zg|%DpJP$2sbMk0$DX6&sjhR!?EH)-FYZMbO-rL?s7pTxBbwa{!3Ig3V02Sw|vk31V zn2eKCGB7;KN7QbUU~;acicM8QiSiU(ssTzRc zn7q1J`S|GWp%=xGPYjnWKJtmtuIvmdgJn@HQ9E5*#dBY7$r#!Ykw~!#G~!t^aLHca zK&f78926HF8wx$=<&cM-3Xtxgc2YdZTmiIFq}8aBs&;mdC1a$;$L-z(4;xb)__$J( zR93(e7y?;Od@k(06rKV}>WAuEN+dhXk?NBcg3gJo9P1%oFqtj3WIxqQ)Edbq(!WH_ zK9e0CvWfujG0tHNuhK_wTFlTiolF82tgq}&f9BAm;q3=zk`e@T8^`ij~2IN zca~?eMVEt$iw*?43D;(SvBAMhDor9goi)pSeRa9*5tLwF z%J~O1g0Jpca6mHowGBOniB}6>Tk~Z%3LTAYZ1Y2Uv3aa9@zlo5;(fmA&Bi1Cfn_L^ zt+ccmY4F)Uq&Bvy+$7ZIlG)OpRpbmtLb;+;EM#ohOZ zeKIWAd>L!5ZHt@yLMo1au@9+3r1uuvY?}S2(T*D2d5djO;(hA7Q1zn43*U$HZtYE3 zhfs*}CM26X`(vCFcY9;`iA-Fi#V8dF*vdjAmu);IChsnuEe3Gn#fDDA@shWonR;26 z5D+!sp7Bt%a;!TiZN>?s9JZ80@D=3uLpAjFiNy3nEz)q(c``}bKAR;xL8=Ay*i&<% zj3UQeU^Zkbz#G-OQ0QNjY`m%!qQfjr0*V?JL6Git*|Mf#3(aLN*5Tm_gL=QXMJzP{G%za1nkoA9Rb? z`UI^A+>>42v|G_;hxJ6tW@#q-Dd{#j6ozTg%^AzrL#sXPD;l*$Z_WUo~u+c>eF@O7XXMg(7lYpf+eiV6@Xq<@_iM4z_D)itjM&A99MqPb#hHB`#ufV(-L^Cy-EVxx zOw=2?QgkxP9%5E5-rIT9MgKmlY1^n;*|!z!W7K`D)n#nd-J2z4IUbB9RFWeXnqNGWy}osCEOH5|Q-QP^ka-lbjYKK;?tSh;E>rq2vQ} z==DqIFD%*|rVd~q(TfPzP$sWYR5hshcJcgINCtJk6 z5CRr;6a$7DB9T300~Y7`?4yhK3{Y&}Fv$|m7Yltakq)GxAqbNvywV&n(W+DnH9Af`PxAxj)PZlq|DX)G!uvoJ8-2ESvtX=8V;Hi}vyUNRs zIni6iTi`L%BjYK`6MjJrFMgZ4YTU%)?)Cka0$Md_+-&|Txk>v<>eI}(-+yBCS|f(; zAD466E?Eb{uue`W&&0Y`@vbL~byA^|u}&-7Z+XI5hv}X+))1!2l%Hy z9PwZBZC|f_rSr}N9gHA~$!{P^q7lf%mSJ5~9&;*4LP*)-XmZJa&A6PNQi>y5uKlRu zYPhI3Yovi?$mIVt#J5(-Hz@adf_AFO!At!5VI62I=?F~bQG?A^e2~y`cr`%n(@990 zBxuaK)ecDl4)=UnCQkqxi;j6>-H=OZSmnv8Wre2$C=0mJY5ofG-vE%O#LWQ0F1tpvx7jIE z_%p-Lur{U6E`uxxK)DT#QsAUAhS%EFLu>o4lw+2s*3wBJR0m~oh!oP!c4zR!Pv`%W zSN29W|DP5%xaY%cBKc>aEw_ngS4 zS2x_`kJwJ5pKl5^-Z)rcc28OU4WayYE50ifpB*foSKu!W#j!m=-xiAJ1I0_wo2;z9 z=tuT2A@Q3X!?92)Ql*{oO^C5H8f!y;cINwgott~>5Hjv20y}t@-Fzby%l9J*>#nkI zU9slcx%oy_xxL3okz0wpbJaaO;~x>Nog4O-px52p%czh-ez@_3TAKo5N0nL8%=wY8 zzv>=}th<>+hRmAaaI}2?z8i0(<<|?UhP4}Y&RW2CUEXrAK-VV_RJ^x7fW47U00xNb z1#xNsV!jSqz;lqNzYfN&h7ijqytBiob#A6#0X5Zh)I<*<2RL#@xfe|<9NBlx!Ic=< zmqP54&LVKU^Qjeeprj!}vmAyF(o_7)^oXrhUhZ!o8I;TR^(IwH^k9pT=+9q{ZKn4; z=b%#W=XyiW;Bb3;s3EYTFy*rn8C-_4B6}FMxiALdosYXnY}7j%s{pX2`DQ4_Is3ff zL?NKvD8VUdCIM;D1B$%<9$rsEkQ>2ZpGv`m8+q2E8NTFuGxaA7j)aX{%6dt7W}Hie zdOjf#J&xFu1d4?G7s=4XJD-OORCWZXx4fMIw1nj*xI8Jgv_wlShAvLPkTCr2Myag<>+sn67Y8fWoMl@-?;=}nVhJ~pd?Ti0-- zA-qWm%Tz!ROwo!`;ss#1*Ml0U{=l)DI$b4e_50fNzvgH{M|EgjL>?M9Z|UDcQXj+X zsC-@ej`>Vq4|%z|361la*VFXO4{wIM__?sXpqA*5AACRB_Y*D!Oe}5o##jNE`rmf zKt5zy8yq=W9J4!~a}uqa70KwCOo zjBZ~Nd8jRUNgQrC?AC&B9Eb?WD~N;P49$Ut=80*c`|J%p=Bk7Tky4_Bn)H2{vl4Ru z$s8w-8NWU_-Bks~Nlh?2H`;+GYaNI>qxtU^t%yW`rz|m+4IHQff{JSLEh2@vh=vh~ z(CKn(oSmw7=j+e*-8yK5keQ~Z3Q}#pu6Ww@ogX7?9#)*Qui%DId%yBCD|9u z0GJYR$+{>!WF$>oLcD{e2DVzS~(ML22GqX{jbap07Ip2EtBmI^Z*!1kuy~Vd5+)7qA>ran=_#OU& z_XN=6pzX?Ffe zRrAtD&6liM^Ck1Dc?&hshgD6FFV+B-*KC@n0>Fx_pSDsqJwDs0xn|SL-t^7X#Gf23 z?tACoIsrzD`@jA9^7io$f4Z+P{0-u^{gxZQFm1T~!GT};;JeoS#Sm`QQ{k32$znAP zw@_vXx9X{C-sHU+g-geUMLdXwm~(D}LMua9ILmk{SggbjQs~?Ug;s{J2sNETHTUMB;vY{m=lynQFsl^TzN-{O;__PIKdC-gDS>FO9^23u=(=TXX7g_ssT z7VUeWi=|}&JJu(pm#Asq2q~Hlx53QcW-wBpd59q zWoIn%4qO_HLLh7u{UlR&=?#?icE>RkI5zC^uMl{4T9^L`E%f<2mVsei@ylBICuUK^ z*$SCC`546+b2>Y3`Jdf_+~KBz=VRPL1)Ca*TCwnnxab|P1bDj!su5B!`F;YO%9Fc# zEic5q&`zRgzPPJLKl1cWgz8RiQ}H>0L3ipp&+qwpDs}GX<1HMpZMlt@cx@;}&fL24 zR{@SZ9(Or+8wZ$;^7{3gd+i6hv0lqRoYvX(@MRQJ4uJNlE&>+hKT-8BDeKs1JQk&?t?OHt?cL_xs8 zywLlJkcobbBT4Zmzjo-aZ5*Ma_d&|`X{>blddSfOJOviI*e}|fa%bVUzltLNPtb6q~6mR0| zuuPdO9px7-9fkQ_D(A7o3bq6y@8TQ>$CM^T#x zveJ*Go;;;{=3Ss!^PCeW!>0W@SpdosWaY)QYfl%A$Fv;8~H!aUJ@aa5NRVY+3uy`!x*+9p>@!{uUPhy z7vc@?>Yhi@Pbexaf$AnG0ovhT>n&x<%mji(uQ~TbUCGyx^Tb{Q&F0qI7dTC~*hFDs zh+yJaOBSgj;Z}xTY*A?^sZq&^xf;O>xz@%bLb#|MJ(0Vaw+#=(A=c=@=GEkCbKFA4TQz|-@ClrN= z<-feOt`#Rq)GED)2zSz`foYIESG3*iwU2;-JodOIkqUu|A|ABf(`eb_9HzVtBk#14 znz?Eijb2H&Ww%q|jB5OMHbZXcTFoTQW&*d>HChZ`;Fhb~?A*M)q#k?{;c$FKs(k#} zS~+Ov9p-XA%>#{hPsh;gx}7#KG{onaA_qg=!DPULM_LadKEIEY+1fEzHp1c(4XJT6 z_+g(hii@`>$<)3W(T^O)tvB=i3rapggwYBKM)~sgn|O2kO|RTsJWh8Qi`42l*O^zC z?*8b3&e6mJW%^QRYpd`~d1=8+g-IY|LhME!0{`Lu>mwz^W41vWE_s)*3Yw?duCLps`&v3IQtXS+rZJ0Kmidh)1=$(yH;yw@bftJmk z&&4)V$)oZswLQeGx@X#+xA=T@N;jYbkRKm?1)o#nss8_}&AsHKU3h;v(CG2EM_+aA zXuA038@g0dz;OtdZ`04{) zD?E*U+wAGCFpIit{&(JWpiQ*4GeIA-UD*+i6MD=uGLl*QXStLudP%hPO**&8bzITb z$0k$OibNm>>`@ z`1dgVW_@Gl_M3PSIukd@5@Y%-2t7y^Z$l~V?VZ2zi?@CLlfVC$ABca%1_@w;f2z!Q zBhBfcfg?4ns_0_OP{lx&o%k4}$mA_jBN2gIix&BhPA2a;P#T9G0n2=yW0yRn@i6taS_J7NhC4c&=bVOaTSyjtA`kqEds~p^aQb%oKEoa!8Sl5cM#`*;fb;JWgX>7o( zS4){cEZ^mNi!Yy(L|PkRZ2J9LdBnboLL&JkJ$tR0c2Ur?eg{!Vif1b9FHF`FDLT%Xhp9;bV?VZc zm=qEc%@ciJ$`(y`Viu3~C#-UGIpvh8r>{?r`>La&pPi?hvFygcjZtrH^Rp~)KrtwR zHAmF&tpx2^v$QK`{a_#DkyBf<)*fq6Lco^ST1u>zb=LHkSw3+2 z!ywsa&joWBy_GwpdLt^MA84XI(QlPQpzK{6@q?ls6rxXjd_}u&a%G0&LPbi5Cc7_D z=Y9YeO=d4b;oj6McV)ER#B_s?T7!$ej~I9UpydbmElDkjxV3h&=ta~>ow>R-i*3ma%TF6QB_4es(+4cMQLM zgeF^N%N5FGapAP{dfx`7Kqt~>u=ug-0ms9wK0mhFh}CMyKjiP^M6SYidt~)kpI!a#dH#+-qrV%%2vsC}k?j*RS50^% zx29?v+Gd}`)y`$`)XWoZ3wr`>)-P+-V_yokOciXjWg-Es@oX7lU?gwZl40=}jMujl z&nlQl&T-gaIhN{uFqC;2pGRe_EGo9~IVfJRul{|!JV=NVBY<=i2NS~S_K8y~DoM}Y z-qzy4EKB5WkLWE(y_&EDdwL9A+_UKX=#_yl{bc@G4qG!?}TW0{h zavT-!_{>=GwzrOEuPvUS_&eW9sx$wh>^0f(>FmEwXJ4MqzBHXJPiKEVo&DK#_NUX? z7pJrTGM#;4y4Xk6f28Vk@w;^Lt+(p#_qb~nAK-qXxR3j!Sg`y1?fC`v$u~G$GGetE563%ZDYkR-Zq-uK305)%WY%X=clvJO&7m%yOqC} z3*{f-LiulUq5QAD&C1`;h4Ozqo&C{t=ikO*N;$)qJ^fohh={&?<_M?&9GmLwyEU4n@s@eq%*`B2`kHK+Z7Xw0_c;_Me_K@~3U zygxQeB9#-km>Wv_Tfp(KHTV#4Jamk?ne1U`_}nTZi(Ic3ewgrbG{t)qpUW69g{EqB z%?!GmrZAeonZa<#$bZN1)poPrNUDR8Q%xxoikm;_@fUr9J1(wyt+o^LDlTm8T8dL# z!^&^=I-FgNgaktRH=vR_7s*feQ5GEU%0*euyC?F{)5as;dMsBU#&=X;ox5stuM(ng zD7fIzT@W!V1-$Kg#Z_RuOg4j1M~kRB%#2@jU;FBlF4#k)sQ4V%XTTtDZ_mwFi08sH25qEk6}MvE-YTLS4-b)Q&ga?Ei#4WU&iF@$0OSdUisU_ zdmbO**u~phmv=rk7EcBr%Gwk`T7(a1F1ZdeVawDp^;+lu+2QwjPPxVZif+6WSJ3`GkB2j4hK_0FzLjd(yW62RdQhu{MZAVo*5^Z zgJzN2od~)`&hKEAV3U4p@*%=$er>Gid6Y@4G}AKr@{UOFSxhFC6Kilq-=R$d1ExT% zcPa*qof!i-4mrwk^27i;JB`IcvrJ>=Ur!-L^e}JR4Y*F0?C6||9dOjyp^uIavV+DZ z^RY8wg9|20dP8im2gU}eMMFXp>4ocoRIKyaHlHJQGh3UG*P3cHO^AG0<9ir{VA`4{ z1XmFv4Ve-6L0|0?uck%~GeT6XG!uFy%^LbWY(_9VI*G&rWv4PD(6lr+KpvAENb*oz z@RJ$Q;v{ASbE9Y`x=V$TDkZt4M&M?8+`YP0NI7udUuQI$vY?3;Bp?Sp#i_FnXgw(}cEUz5(8ku(7@a zOwF8WPn;ISMX1F8DidN4tS3#p>6A*H)O>UpDzPyiYo}wkBsbX?UP-ze#S2fKNi_~| zEtu+T!OpLHA-=vo?vpWb+@w1e%@hF}MLM##>A;}KGEgwKbV)W)W*3r4rt*=!dHbh( z7+3ogx~1eHEDA@puj%y46pe}sE!kZmuBA*9H9@i50C;QEVjAuiZ~PSn=;q^lSvcLS zsItVNBUz9bH1I?RUn6>(60ay$=%86@T7PVf2o-sH=osQ=pkHPH6Ogc6OH}rX z&Dqzd)etOkfM$H1BbHG@Lw-W2{}Mkqpw?|09b|A+JTWLQE!a%U4!1>--HR-P2}WEr z+~)PIZlZ2lqrKG5xCWoS?qot~Efk92T_`On z`1iZ>5s3pV8p+;3xJ*I;_Y~z+mI^QEoJL%%3uYC@pzHFYHv94`rd-RgP`{VbM2fi3 zOM1H--Uz0?Gj40#bkD-F8W|uDs--Ysoa@`#>LJQUH_d2fKce=LR0yXc3JtZSzqq>h zjmGQgWbRJ%NgP@%hugO{IGMi;7&U_-*8fX~7GDMVXgIXkXyXp_5$OgU*ujwq*K1%T zN{iu1CuU_3cI#rc6tY%dHrdeNjF$@8{(;#Zc-E>WIX%cVh!)dO+I zoK`uHj-rc!@H(yYSfP0m=dl7`I*$Zt%)Xo)^D}W4Ydp`;S^Q&#@yM*7Ws#pal*S!1 zCMKu&8M00c)-zp3E~&(Y8qXCzZWWJw!ve^y;xoFzD=IGG11MY`|3`l3FzCzwC}Tn5 zSG2)$VhZG4`ebrD)?@0enY*BC=)^~u;eywW_f`CjfMPR?FY5+Jtayorw*Vb&ap-vh zXeRF+fgrz2&aRyihDe6%Cc9q1{Pjnx&@?f(Tt{|Bp2)%Fy5fB&Mq~+KfAO{xBlrkW zxj~Wx%1&tQ{@Vyo&hU}#Z=Y98kQ&riyvWuqwpO5h@rtpSR8$qu-mht{723iB`HU8% z)Dc|#vjgO|;N`tN<^)^)p6tfStZuZzZn}nAz#fZg$(UZpA5Lw_ej8NuHPKINmHMIR z>g;nd3%aP06p7y`Fcv!9WAAWNKt?3xp_~n_2%(}KUbx2%ea0=}6cb;`X2GkCP?$*A zlt$P(_qOy#2%My|yo9CnkUttklP`SYIHI4ly>)?!GNiXEuFjQwTnZ4XHw8E{u=rriNz=XmIo4pg}>DVL=skz#enJ> zt@Bprj-0v|yo9Cpk`u ztT;^^k49HQGkArNPtBNH#ZhXgkoZHq&9IgWjZD0XZ&j$PnkEeO3I&eRS;H_NBUW9u z$7z?e7b(7rmz9rZ@8|opT1N5@f+Jz0k?1nn`EjlgPox4HE;Bg&SIei?qwIagGE*ev ztCC}C+AEQK)iHsZz5$8?oz6E#;|>{AlLLY#_qAY+|!j+u}ups-Rm(l!D;A+Ddi%S<;t;9)b)MN>xajuuF^}Wxgh_ zr?Qm=&FG5@0>}K2Y9$w#=gGLy1{R0sHL+28e?eN>zzZ8NDNSZ0K?;?U!88ZC`p#?ZgGGM%F%q5LV$*;)3 zw@OSNF}`&v4q=pK3k40uiVO{!>dblXEvJo`BUFKjEZN z4RUTFs{WxhM!g86Eq{!ADr8u>B7mU;rX18tFBa_D)KtC{=t$dAqm`c5s5szLB7ZJ8>OE z;Q=uY%k5T{UJge8s<4w!K*3=&S-sg_PP#H6^O&2U6M<*QdU)yV4~%BL$tP% zz($KpNXPnq5Dn3BW=R~JTyQWct~PfB{v{sA(Xf|ji8PlQi2xy#!`M$fbCWze!#btM zY&13eM2ruJ>3ry~%rl{pt8F0^NxLYy21ih{ylu%FWp*`ky|IF!$GhsXudd2oQkK1B zpe*AL>Sb`ZRb@BT54ThgC+ml7CFT-cc514(OxcHKsuucz@?m=fU2CbM?- zY92|X)%(cvm}ELk%(oy&+VadYMvnt6H)(2wPMh&D$Ecf{hHB7|XOZrfL6f}~Xe*0U z$&hH*$a7<++Z+RresbTkuLBfX?;}1_jE2X2K0yi`teM;wnbrUVM6eR9pSSAu^Omol zD^pGD=X_K_+-7i=Vrl&x1r=LSaXH14);WDDa3ftKjzdfM)oO;Jz$8O$hf}ewh^9md zpW@{YN9?K+f41+=?gavg3G$vG)cMgyU*VR!EN+lxYg7qFP2oS4&lL_~=n$5;kDh^J z-nucp6hes75{U8b=88?iHsN8a6q7}6cb<8hn+rv7!qAL3&JARn5FwwGrnD zgBc*ruT#ri9y&<#LRDJ;Oc5w8zzkpFipPFJ8v(c(0%!^cNCD||p47C-$!Lf$(G?N% zm?*E&H?9cjcxvEbjE?!n2Z37|Ls{jN)8y=`d__6~!ihRONCWRfNdp@X=rtB9&_KPe zX#mg6zZ3XjvPLCYSJNO2G+GKk$)PTV75@fZuv5sqX|6meJ%?Gi;k_a&ZqQ zkavc2${~Cz!gDYub|poZs);%g)Ummr`hb>$LZ-qZ34YMeYP@Ex(G+2% zYg=!)Ks0KL>#|oghpd)yuE}DHk2ulJw<4LjpEVwCGb~-Wg_7m1z~sv3t;P`0U^A?B z;zH|0a=u@-`eln>W8v?!Lsd&?4Ft4IphxrEXn&XC7BR0-C!oIy1^G5o9x3UAtc!`y|IyAgCtCrU@|13_=vJ8ep3@HH`d5&=!3(s;;E}6=J>p|pgK99y1k9|wauLN?)Dq>G0dzOW`j!90ADP5A z_(dmY^J^EU0V)gIe@Xn9-%Gm`43OAGyarLbU=oBe(O7d7wk5MRD(Kl|ie9C%yq6iM zgyc*8s-q|>wM&NCV7%H=j`i$H(B-Madh8;@~3*q59#gtB04=59vQ8B}>TE2>+*( zt92j}ZT+#W5eHFY*ySn2G?_C)v8UMfX11{)pNUn;8J{g=9-y=nr>g z4-qTrxJe#RXTmaul^Zt&V$QFbxy{1`NUdm&tV%t=R7UiCpD*`NTSX7$$cS!bRi(rX zcV~-K838Y_ie`6hR5YbVC_>eq4ch@8IM#2}Egs}FtZ6isRc2roc;u1TN|-#BEqi+F z=(c9~bXDrXLLJC+=YDfsY~9n-hvG3@y$QLI1n61#D~I+Gb0bG}=*#sz3oTaeBk5xN zC*P3|9Aj&$Iurwa`HrN6s3ScnrnUj1q*QtC6Xuz(w@4*8>C3$;u})DIRnZSJ8u){- z&@Cc2t=@#;sizapHSrN#F*0a-X=Grr3r}qg(D2Qi@wwSP! zkt@S4&MW2LJUxXrn;Vjn=nZK7^Ol{G_O?~BD8s8ey9HcD?S!+!WUq;NOpPg*OZ0XWoM z36g@xuSxU1EaV`c&2aTtLh#xA6+T=2%Dp~%gKw+8S$Q-2+N)mLEty3~FMr1dd&&tF zz7Nwj@hnv$lBaJb6JfnM2&*v?QwJkssWFb2sv9Grfm)pihRGOdZ@0)Mp>)h!jT$9W z+$Jg710zXvB6R8bKTK{bM*4Odj~Xza^)W$GswkEiIqJ;<#1rMQ*v3eFZ!uC|Q8u~C zdEirEjg6H}Dj8{~IkEq*oOs$*lTd{RB*L!lu^A9sqs7S3b>v7oY{ThqS$DG@&M``? z=Y;SSmZhkejl_VzcGrpt2Fb;TNtOuA2uTp5M-AVP<&ixL^Lm~gX4D)EAjx4SkH8?B z%&0j!SW2egfh@iROH%rTGJo?#Tc1GE+aqtqKoW?M4~Qt(goDnI>z;+YJ^q%as6 z?x`I39gMG*4?zijpx9oBnI2lLA{gpUxqud~GufXcywuWI5p~Akx^}yDelPaza%jC4 zucPcixiEZp>JeZH)}(L+0GyG8A1*`Uj}4Zp`dS^GSyFISizFD5@XjSCuF$G z0=IhW?zx$xrq**J@Rj-GwBTV4=z0N)PWTT1B<;e2nU=x4xyUiw8{Ztb*_LoEY^?Y2E zPOuEm%uyQ%|5HgrBquGD_SGS|4K%lOnS+pkxW9!PJ)t>Dj?Bb-LjtP+oi&WGuUQ7g z#9L#Q1luFH+#&LMCS&g9^w#f4MSE7#x>)|G>fnqrYo5p_o|)!^jBsFyF`!bki=~2U zB+~MiB!ledNC?PBo|!N)L0RQRCAQC_i-L?~?_il}!cRN(b6yZ)DaLK>c)X5& zyTlV?E&4?1x@1HWjf!Q;Oa(t_5{h6dnt*a6T~LoGaCAX*D9L_vqu1|JL-PLhc#VKN zBjv>uNW@eRNl*$J&|weAyUsNf?L3^*6K zE&L?cv!OonNiPgyxS|n0&s8Lr&x^S*E8+{6iWGy-h2Ra`yNRyw;KJS6FTgHBbJ%`1 z>QVlpZOH=tHHSd!ibzImZYM8Jgzl`w zJz~Mg4Ke3p(kEtV>cME{ZhY(0cM~wK%gN*T1c4=&$kNlf-NNXEKz8J0%;3C@$k*e! z+anNS43;06)002AkKY8%i$D7)H(GJ~HDdP|tkMjK$!?Ei2}+Zs860c6maef$#|xzD zE6xL9Z@frJswPvg$}mTmh!DY{odxWX+cisJiaS4J$v_uif+c)xf}>`z$YRXH zM!}`HYZQD4P(BTRC{AWYO(T~L*+%*(JJ@C$lBA4L8l{mTp+%J6R)91}wK_+XT`ju6 z1GTE9{aCx=QUPT?Nb0&Ccj33=9&3vnZlym-A*y=;5-(yjqzeN~_CcA%5n+CsKP2&#^S#ZdV%%+&SDty;I5qX#wmWY# zC?HDN&sPoM4eE1Q8uQPOKEQId&eR3wL3K_y{RCnmI~Q@chV`KY>SbPstk{XzJ#`*` z-GoXN*ECy{SZ-82URV5LRq=~F1f6o-5wlb^v{aX0Y&c`jAh+J2p7o0DV0rDF8IwxZGhM`dOR%swySRmu;#Mdjw6_$sc1sd;I zs32ffZ!dti?ptej!U$EE9mphT#*s^p6kTF}J>wSzSo2gYBqiD1<{eK%XGUx#ZGE}% zz$(7hc5aSnYb&nYDD4u8MU@deP~f8!T1S!=*$hMxqY;~dU)d?x%9|WdPY(0TQ z34qA#q*Mz{(`4K{NfyUh5vtEh}4VskK(w8a8sI81Rs!Z$BdQKK{WTWX|qD zjpP7qvbl`=_2%VcT_LVmAxg0+o)`@qPtAI?SOSM%Kmx081ZN7buG3Yx#?CW|Ity)2 zASext;;MbxD%ix$VeI;OjWg|P|CRYA1aEWywaqX1J*x0(zg*>)9|IVu-{8OY16yU# z7rP!*TfCkRR}6;z)^IJYIK)-u8L;h&R@!wjT#tn-x=lTwKBzoqz{(vDSL})X#@JXn zWX9YhKPKd&o0Jn%f&BpWez6JKnOK|nJyNO z)@6oYMCmW)GDlIxy=V6n@8Xs^DzM8N{V9I+7q#eUcECC=Rf&uKETIdNt8JnnmcPf4 zhC7O*y+6uN$or-j@;ruqzA5{&0G_XXgU_5pa56AfB{5K zBV(G)tBQAn>xE$VOI+b@ae(U^xxR<%Ca(11xDDARWTz=D{ITEkY#X(-KBtoo6bPa= z7Y&qLG;Atsf`YcX=hZZ|RAcs;WmIBiW9Q55WaLInB{oG0zK$W=jzCbPWu0tK_N#5h zTzT6fK&Z~W2A58pRK(CD31fI~g?4FkPP-j`+qrDh1()%GjlZ}Q*Pf$&COKF91K`rW zE4v@3P^YFUmSv~(UKZJZ%a_`*!h{30=t`Y16o!y*W)?~jr5FTacjXW=x3hDVm8zRw*IOrN zQJ*a6wW@A|8QYrj^$ca!CEni2(5P7kvuAtMQXC zgd>NP^T%aVPag)^S=XU@Gn*kFBx63Z*KG@p10Vr3=06O=XbR2dHD5>jT$7P zB3Ix-E^d0A(u`(zXGCJatgllJxb9~|v#zsUT#9F>yGRA+vd9NSbUh{w;+iu*=CZ9z za`>~;`Irei*Slk_2Ru7nj*$SakH)A3*NhK$a@oXJ0=Qh+-KfhOxx@ z?%BF-@1CQ}#a&4IY<*brTwVFlB%|H4(`&k$L7tl%b^x7QPGMfw^}HQG;Ck*3AadQb z16;YDvjg0@p1lJYT+iA8Os+FKz?SRA9bnIOdIvq{x?u;D;F|47Z{V_iM~aQi*X>Ag ze)6du>6Kh2cd%v}=X|z7l$_X+Ud&~DN4lL0pE}vbWt4BRaN*c#x}hVrGuxBd%03V9 zXQyuxt#xzpj`U5szEMQi&GsGX8+GL?IsSl-(3to!<`2M3%>q-+(t?_$JvBt@G?dKh zpM-YLx^|o-tg{)nE-qW;)DMB&hPdJva+k3d!ex7J;?77K~IvKlpnAm4Qi8bZ!z&=3ksLySPQ zAz#><8fog631ik93$=-?R<*}e8xIo`!MK<`wvoIuyx($z-rLi;1t_jBw`spW{uV;`0V_h!op z+FkZpuEH^rkq?de1D4v%RC}$Au#Xuu4Fe^p8H)wAE{L}1Db+Ty_|+oUgb4Eg;d_rl z_!j!U5I!cw!NUX=Y>2gZs=QOBIa&%Ja>^;sRD|Lq7d18W;9hv3)q_-nBl+^6Iw`!``+0MKX6SMt)iX%uiWtsZrusz zoc4XA-_vtM5K8a?4+a$vDE)Iej!3z%u*=R7K@z|BTR%tBS-3}-4B(A(M5;ZNv4xk6 zy&n0~bdnmW#eF=2LtUoR{E<^2`PPpt{IK+p$?(IE_OTy?L-UkB;Rm@+7ewcUADi`q zJF=bdReuIMWS=~m`Yn!A!or&CZiy^xuo-DNLi zGQ}M$kt9PAh@qeowtsb|=RqpWL*8rejBnJE24lIBu&@uz8o|P1#SA^k#kMO$ciU~7 zhwir7UJ>2p`syAYK9VD)$6>!98kfbh@`Ro* zh$gNkwxa^%oH8U4;(?Qxx5+TzDBP_9hv*O6i&z1c}(tzP1&;aXYcVpN; zzjNaz<5>5e7}X1LnNlXQj2cF#@F)8f+9_LRWc7$f>R&R*qs~tfm~~9qvgWvAqqj1v z6^VB7p|zsVwcmPGF@BvkFW^k1 zoxfD7H|6e6(cLBi1U~D*0XU*j4rWPKfys!g0oZrzSb<662Sf&$|B?sHOiKYiJG{<1 zqtF<+2w;)32h(y8;6s&*pnx@}nt2`N)+ZQ6g*{Cs6NpBMN3x>n*2>Tp2wJv$#*pRBuO zoDYnEG<&t7M=`obzgjFBvbf*>md@27jHIbOp6)K4Gn35b>%(VQx@W&E;=k@$emTc4 zoBVQ~UpD(?i(j6iv4P3e)lAt(i_vR!XJLK2QyyB|?sRrn%kFfFN@{l-xJ&GAn!DKU zHp&%=x-$;_Y(|sBZ@&wa(8{OeTJS_So(1>LWp0?Tg*E&>@b2zY@-4YPooYPYl5Y-A z*EODQ&d&=^*?Z*>fpA{FDLl1Luc;lLZsO~94tKgy_MH5z@N{G2=~?;N;VF5R72LBy zTc)(!i$IJgAH7=dd3JU_av)D=>fIM3>pEiqqP5GnXRUe*ajUoIta=L*s<)d~y@grT zTMkAWY8R$fZ#S=cJJNW&Wz}1Rq^kRrfwwxmtw#zPQBR!lQU##Q?4|hlgd)f^QJ7-Ja5X<_lD;zqn?82jkjy?yzzFB z=Su9WXpc#V6mUjs^%*=Yg&Pb4&cxglh28*RDz!&or=8G7)TyAcwep^w^W{BN^fB`+ z0N(Y6Kd9 zh!LI@z&DM?S(+T3LL1xp^xAB}%89h=B-Rqo5u?w6?%B|A2;!h}H<(3FO1*D_BMirI zb}}YS)l4$RbQ+8q<_H5|ka6QjgB;Kvn{=%$iO9|wl?SDIHI=8J@>y2X6=xV|cbJ-k z){8#L4BC$RCdqVs*eySk^I5Y*{U)+dZgg)DlJ(R)t*OO&GJ!pbvpeE^-j0y_Ang@q zJ_FW=-;YW*qgOp1>LfAcLKjAJy<@R9_{&6iZpmJ!9o}%Qi~HCG22(ENfk{MvOzU}sIE&A6K;AWbnMW3v zY6hWFTWvn4d0_Ta?x$!Wk=aE=EZ1lM5upHsFSxX!IRmju`PVJ&PS9yaIHNkK#i9ka z?t$^rb`Nm>;#Mu;7cl*F(Ov!cj< z`b=Ett_Vb~EmNJ)Sx5v0=wIlx&hIHZ-3pziw0Ao7PFuo2=(M)t`a~mbbejGeE0kX( zCd320Afw(`)WhfG{5)+>wgZ4g5%Rfg)`EEI1U-I>B1KF_{2wY(DUaOJK={_c{Qs4} z)mPen=$5{?gprY~YvR!=^huE-mJV6mmB0de&KzFqf&$pQt@z_lN*k0PCZbW3C7QKr zstPrUc`C(#*mdy@)l@{PRac%QEU`wjq4HKLW6W|YzwekTv*Wc^atCHHd&Wi;LFl!@7cl@>q&r z`I|1icba4;v^BXmL<=QInUd z=o=}z?@_h7To!FtP%R);6}^U{AF-k+0BPn{I zj{u~zcuGv@G?0zT#dXla;Fbt_D#esf;;{9lf?qn#OzW0eE#u+#r=i zIlUy#3+?UBJDN+1lKj9u2&rhkJ)E|C_5G2?{e3f?-;T*COlBG9 z?3>XxSwI(aLXdW9EM4|_02ihcF@2}!$~49%oF5U_hqMs)m7G>AY2UTk&l$wwAoJqX zr68bXiz^eweLZb>a`+6#$}o+3pu!Wrx62(54SuKdk#O`y6K$-3(9W(avg@JUYP6xI z&go)x8pVH3tOO0=J_7Fc=#`sa9IFv%Yq%r5DmB={)-EeW%v0xQ;2xB?+x9ql5iyg0 zP4^>J9z@?OcRK6Uj0q(<8TZc&{(fMl^VRURmawFdz#rM>%EAJ?vduCs!8T)I0UT^| zj5buZxiYV7)Rb+;yk^v_Y;&XXWNlv8sJxZRn6{kCm2GZRW_7-_&1+PaZN@#_PUXrr zmz9}Nyh1w^U!m{M>X2~$u!fAsxl1b;g^p`1V)zUt=(J2jpu{fkk1PZPnFaV)%`uI%eEZQF|mwjfY^E94HeIwhg z!#$4Vhwio$+3d4#zxf}MWSVpHnOO8MVkavIF)v_YnMfd+HO)cc|EqhsBQxuMHcko# zqN11>FZge&DArA%ea@zH&nvd*cTseU8M`V}SpRp{`eH+|vHop$PZ|1MJk=gdK8

wp(c1gN}!_Gcn(!iRVShPw@+0zY&4?>VvYy8tH7) zltT#zHlGa28yw124&_Rqy!WV}XlN~=xQio-khiVGW=D){JV&fGJGs-gWC*v3?Dfoe z4Z~er!0<9IXenJNK4Y+v#uBus>|eCf*G(E=3;=OM0f?yiZPl!*VSt59V#pY&s{Rc? zX@d;eK=Rx!b}TM*klQO{@QF%f0CWmuW*k6PA|pSptf`|V87Idl3k{d!=!AXrL}JZY z1s8dup-H#dr=~BTf*1`}=D_@fF)w$R(t^p^K`F2=E+7SiRgXYx9lmo|G)E2=IAJ{q z!UEHOL(l4XLpp6Q@Bc$i)7D4B60z zT)#%Df5u4d6EHZ?k1Mp~71n4$c8y=sn+eehKWzN4J61C-(D=^o;)N4M_ zJx|*vO>U#EDiwIPRA4QooLq^~XIuJ}K0k;) zUpmnEyy0oRmm{x6O`|Uz)acT#4_1B*uR@A=f~%xp1xF!h^a@cs>wyDWrO|_c9u0tw z3lJK;EI_W&%MC!QHQI)qrj%kp0&OLwQWgyABLWMa59^BjFA2O$=~4sykcF>78IYqv z^A@FfuG5R9=F!Osr56qiI!!xY!;+m3XdMe^9SvwL)@UuBFZ1XDWdO2SfJ&Cd{sHp4ZLRnNE!5TyQiO};E_1yJx zrR;gJN-updy?pAWe$pjLr`S$Wc+$o(kJQ?#XHZr70!U0f>heH&bLH6EZ);wl8J6vH z_Q>sb0f0s92d4Q@-AhY_Fe&b<{~si{!x=iE|EBLRU0dG=D?e(hqwMjJwUeP0xK z*Z0K+_#u5qiJNA5UjWiqW!Lw9qw=Z!x*Ar)uR9XZIUFD_)MzaBbQ9l8#9-6Gep%c zO7@2a_Js!eYT%bYZI-5P0BIr)B}uTL(2I3X_7`z2rX>l`FEL3YSxybUs7QJA;$WLH z?`X+~OUhoFUffMmgZOYr-(f)K=Q&0_@L`^_=Zy~zyCo@ZP;6=t&_Mx$KnDV#IRSD$ z%ryWRAJ*sK)aq?mn-3zC`*{sM>=)P#7bW|2rJ26KJ0JQr_>vESx5fwVHIEb@CSMeI zP&Z*bcuZ+S06(ECL|CC%;K53#A_6?{Aw|%3O|fM}JkY)IU}AEItrd`sr^a3g4<;rr zUVD6aaoI!Xfu(}L1Fjk$=BH{NOois1nXCN4K|luspaTMgKR72qfd>sh#)E+w-YS0( zmap~)_X{kv-=`~N>I;0}K?D5I_)vqg&K?d7To40&d{`(MNGF3o==1);=`1Q*!_u&& z2>=@OSdh3A0rE;M8Y>OR0BcS>YfuK{XaKTUqqW$mjJnN8`qLtIdpLlML3mgY(4-|n zc>9tRc&P!Q8ev|1`Voe3{=Z|4c~Qv&gTE}e_Z!^h0N2JCWE$*HO#NZX63p#j<;TMJ zDo4M}lh*&9~bn?_;gc_F63LHCl}@!V#eZHxCE27HYH>8fX!dI0dyH7FqyVs?l1i(fXc; z5$Y+O@v1MBeY(;wQI_kbiN%l$H>aXLU70J3YA{vN#-J*bFt4IMU70V7mg8^3_N(X# zbsx1|QTM}irR@GCtEMY;7~w^w8lQO>;SO|qM=A8K(`xi zt`DlnRSaC_u+E^<%j<(qJD^q5ia|h+1V9f5KuZGTI=$2YWIBE7X@$mDgl#ZLd`w`` z>7%-$(~AP{I=$EcKQwIApo~)c0+7BchiOHl@~Nj4HLT{eBA|0PKwhZPT4+F)ZYt(6iN_d{lS8*qk(>qrZhHd5!$|FaER8-whWzKebKJo7U+)~b7S zBYee0UKEUXe@-wK2Vtyo9czTu_z?hTOgSt-2*`o}x%@3O0Ga%)&q1d}{@B$o4dBHy?-=Y;-vk_-EK+iZe65r&cs1f67LW(&RQ(?~wQ{VG+N- z@EKFV!0(`foc}&SPqHFqu~t&4h?Sj-yPo3|Dmmboh*A!$Vr@XCYX9OfHXX>DI-x7A zu1r@Vx-#wR7?9M(_)|*-Eyxa-RM^ymz#GJn$I$d4rD2bTc8=@HIU&nx$3B-hlnSr|k;$8~0$bp<$qLw+tW2q_lLLy?uzot} z`B)&_QC&F%b+H!p#Ua8WtGlM2qh8WAAz;h6EtWh(@GEq!R$Zgw-GWS)4uuxx)q-or ze6s}*YxW5$lHTzgw}v!ftvW$_>**YWB}n+)`hgxc+h^FkU+u0(Lv@`-Ljyhw!sBg! zB$KtUHXhon-I;vO+D_&RODQywImV*6EXPqTj^ku5&H&uwbc^h{wfN8r4bUnla}dyx z0O)W4v>-rXkZ%Aw11A$vU+rYxEwJEuNLS3%yugP+z5yO1+0YS%XPQR;co;F4HB!2h zxm=Evbn?_rW(}*Mz6S$32LgI?HCl5Gw1%9_8kF(iMDP$+YP41wXjM+;3(vsGd>2mU zMFXAg3#A9lZR-b=Opz~ITRa9UA2}Ss0G)w&z^K*YaZq3pj{~|Q9&-Zk;xX3%KO`PCC^w&hiA$oGi^o#QL^^qD@u*=n z#AAOzXJ0_CU!&D;pfw~OH7G;tc#yH>8m;99T9tTQbOz#a8{+YTl70q#MNq$F;<3^c zj~A>h9)p$dKHJ6P5Lb!E{Mi6=@t8k5h=&7O6?Pf~bT9xqAV3VXa{}bzG1mZO;&JN8 zCX5Q=(OBu;FR+NmK3x%yzQDV9^c&!Z#G?jflsX!ixF{yNcr2Doq?4zPY}T-vkl3LF_~jOT@aJGbAp&SpjB365R3f*(7phu zFF-CP{RW^jup%&QwH0|Rh{=f{CM&g=tdwE`o0Js9}#quQVH$J4TS%stmbiebLfm()~b7E2bg3tTHrQ*XrstYf zWVXvH!zMgXW=RNojC!ew;0sp8sWq)o^7!-r8Ku=cwt>my^Gm%kVP95<9`;eA*`enT znuT&rYq0X8=VBI6v*TQ47M3~fAee>abAwrMK&wWLK|qfP5Gwa@0JJ1PZWfjrfL4zh ztCBrY(A8$)n7{)5sIK6FdPlHxi z(>fB+IULYisL@(DW3)~Lo3c`)wK9MfgAUZUpoh)bn@LD@7aKm$-9kqR2?4G78m;*T zT0=fh4a%ssF97MQvQw+ys9X(Z&p-WOmWS;~I5FAZGp;?a@To+yG<( zOr%yU@oZ&=qDHu88l!|f?oKLr*AJE|+qEDC%O;2Jz3K){WKZ@~GI36falUi_fj zw?-3|dvPQHKOAsh5O5DkF4Vvw>ZHEOA`vH8^9V^Y1XuNOWlP0_l`Vk>{t?hsMr07sqXGnRjt4-?0^~ecZU8z1BLd4; z8<9r@RxH*PSy>Wz=fP3~JTz!d1!_>%*%N_*E26Qh#Y#zII(cd%Qp0MjKpzX}91Z9# z)@UuBFjV<$P;C+8$YYd?QGa}DjTYv{EAA70`@KLT3;Kio`EClGD8U)w@ zt#XbB0UZ$_BAOia*&j#)SWzaW=9RHk=b!DpmQLgH&>%IcgAQP5L)zUu10Ha04+wV z(&VC{(ZB|g8m)$2?H4+5b6-HKU!&D;pf#lKH7KLjA)y73`5LYH8m;enX2*~_zob^( zn_eng)%*k>*H$cj`ecYMtEhX?%VklG=qfrivahJ9d(SInQ4LxuS`S_Z^{Bd!5m;0e z_nH^WD$iTxG1r+L&n@-&%riUw3Y~sVDfHI(f*M^kon8oynogf2=ssBa$kT!-1a${LqBA24$3bIEeU?MBH_HsT6TKdFpsb4XY6k*&oo^7trh1X!RRt4aGxhP=?lV zp+%pTYqXXdXjRt#Ii<9mA|CRWh{pvb{S5kwpe~zutOTeg9v1|YKk4pX={F8meyr;z z{{&Z|xY7lfi^obgh=&7O?Oet4oeN2c`6&3E4R`2fTPU~atXm>fs;pd)gUL1K5D59izP?tal06O z&D7Ia#N(qE1muA~6-IM45X~_{Du-#WB|i8RvrOh_kkGK(mxCqD?rRIKCvx<| z9^6S|hUF9abjUmzGUy%2S_b1fQ)9pI)W96@?bp2M*LWh`1JiidZX+C9F-4*J54zij@cg@kr?PVO?3HUJ&Gvwb9&xjJ(lb zod{~{?M7dtg?Yx%!FmFP$<5#+pQM#M%?I0ZFsmAchetzq7S))`{bIARV3X{#YQRk= zpJLW-%t4d(!FTZdQCKgSC`to(eyJ8NzFS?=4s$hEbt?_J0bJM`4B+_&+fKZ$Vh&S- zVD1(eMB`8ZGcPb?wwHs%C742?DHT29R1*K$&U zGz9neyr27YMNaxXfVrIXdv$+JPR>P6bi84Zlc`!x1~dZ)|87B3_jM&JWL{81{z3^A zmNn%A2{Z}}&YLLI6obP7+XcaMF<2WG(*U{pOPv1?Mr;D_I9`Sqe>AUk} zLlluRH?<3UV7jHiNw+h3o^)%9m}u!6gEIuWD0y74xT-BBV;v7|JsR5jy0`VX+FGvL zTBa>q9XW>&J9S~Dntb-;Chd>p*t|T=CEH8{qR3_g9BO@6n;f2Jtt!xeKm{%>3p{gG z0fVqOTNcuNi`dV+OW9XEv7H>%SX2Yls2c+gum=SeWjmlNw4W3B zpuxl7jft^;FVdzWHALgrF^Mj)js_84ln4j^r4(Vh8)N8=N=#;&5IDf*kpSW00AWcG z9(+gyTN;3%(@_!aam+wkr!qCnfLZQmH%JIxj|wWo#Bp7f7bxh#6AI9+8iEm0nd}2* z@@0&q1NOj5HqaL_PXzQ=1UR@vO~Bha38`0@dr~R+5VIUY_cV>N)vlJX2m=~H02<3& z`vaf$1##%t{OSjOm6!pP`U5ghcCRT|k3GXVe?nKhq?KoY{FlBYny);=g|vjYwpUX6 zBxR{4@O=SzUqFLj(gcb)1eejU3(IQ31$TL<1=9_4<{QF0 zjI9jL!2t6>fH^0a!BZKASqt$hNC@)X0n(uWX9FYi>s44aM!GQxaV zSA=;%Ed<}E*}@vaY@|M|Fdq$FSQOyk=QIJsx@vm3jWJzksiM~UH~_Z{0WaXg2R76Y zuI98f5(0mgQK%R#&yPiM5liMva-w>-Gz zKR8hN$TnKW`XA=1QDA`qrt}53g^|Po`PWZMZ)58JVeeg_?7Gf6&vVaxR^3~rE4k#z zk{s`QEyr?VCraXn5<7{G@IzKa>?962gKi;Da%#z@r1@37mHcWixnFpsQ-aZy^rAj|Sii0`8Yk7AoKfqpgvIB@{flktLLF zub(cV@X1IVl1+gEHpo)>Orcq$hr-w%yDFfLt8Dr4t4azSzba6GZ za2#Ym;+R2h9IdKgCF=T_K(%uL^4W?t&L)sS-v-?}6@aW%-C9X1m+I&xUL9?i-1T{K z0FlUq!mEP%r7z3ytp=#3+WiWflEsF0(9j#+Y2M3N?I(rrOMZ>-5DMWRIxR3u5#eKt zbaCoE+WuoN4IIYRIP9eW`b#@3;P^`ehj~D2IBXQq!vWB-0BBKw0*57lE`Y_inP-nRC!B@`{U8TpNHaSKV4pDwpiB>jK#0 z&tVTHu?c&u2efl zu^gZpdkja}BRY_yl^?za_5j_-xSIB0H6v<|YXWMv?AhaNWMldXu+&eeKp7p51t5#6?Ac>6sl0Ip zNChidsXi0Bb2>m?t-7_EK;F1pj|3pct8N`nDhIATPX&6wuQG1c#jxAR?P90^}KZB>`j%JhI7RO$G>j z7>1W*fIKCzfIq1#47@Dxo`IJW@M9Su6)3OYBwPSFF5wFLEeaQd+&BZIf|X=|JQ=!k zB6M%5>ekW)ck6_@#h8|=ZY_;;%Vvyzm1&K*SKUhF>M?Z(YCaOWb-e1<@uXX0a#evc zY@H0MXu0ava@DQpJp-hg-&pHs)oRG6j;+e8)D(8iyIj!dLLPM-ojeQ`9rH96RW#&J z$D*<}DmrF$PHXrmfmLRO|ATnEe-~fV zmDNbk_ChXo@`j=QsaH~%k)Pyhvi3^iP2MG5e&v`>NRRbOVLT}qh}ww&V@WW)I#^0z zm^$Dy=bGO86TKK-8Cwkilhy3U1dhYD9tmKN3#?ZI#}lvsDNjAHbG&$=ExC5uR>sj< z6KvZBXI4(Hr}(g*A{wDcZbkH}A7AM}u8FRjcGgYP{I^Y^O%l8veTDDb!Yk;MS1${% zsPGkw>fpAA!#IxV3aS@14j*+{jN=fki{qnYHe)tM=G~smSEgjf7MEnU5N+;5SFsNY zD?Rz@Kq9WDeqK!h1O|A=3ZMQ4tc+}NxS8PR{m$sz3Wj# zulk_|K`VPjKg%qQ+ot%EK|@kcNB{!3W4cNJ1U67O0SoVj{rZ!h!e$B+ zLAH;u*uEyM3M0st5i}ym4U0IB2r{oETrn5tHa^;$j`>tzyA_elQ+XvJSuAQ)4&ykg zD{jw%#u2C-$3fNuC}y|5&ibp7x~n!z&sIY|d!8Xbb1g$f2F~dUSDn4K9P-&~ z16MI*7V9OAVaZ=H_>{MF#7+orpAj5TcRIjZ6+F)hs};O}rT`9Ndww;s*GhuU{`DBj zJ%&Q2lwLz#iu7U;9eD{lcx5LBdkont&~{!79ShxDRQEhnEXMAQiT=}}=&3NGl?p>E zu?qNMtys%B925Nov?FtXeCjd{lSqDhH_P=x8OKD|_$u-UtsV(rj|;5d>vlYVH76nV zCgArZ#U;VZRq#&P&^JUb_`UT!smS>Y11OUNlm&TT#4&DGTCV!e$D88>uJdkWsfs zLl+m+wcwh>t|bVSMmrOVp4Jt+wW=y!qpij&m&Vbc?-@zdS|*dMRLT^O%4FBeqzRqW z+&VI;B4aXXuh4GimB~lcM<{u`8rJdH$Aq;stfxcKQ(<^3)v#7#6=5QgNt}omr$@JY zp``Qi?DiDHCj#6h!SzD96yaVb*~$}P1MG&vR>_j4{?cyxGa_%L^yU3!)?6+fA@{O6 z@$-LaA%V~d(+sH~fVPL#XGnZ3^nFp)yzDH-z9R_bFcG(B6(Iy2X7pf#?!%da1`@>EC5Vbn5H}M+!Mns9KmMZ#d^Q3o4ek(aspP5cAKsTR?_p* zs1KrOBc7KQkgikb#!kS}bk+DUWh!v>h$c=@^tdKY;k>jkakAntlyQfA9OYn{o*|b= zeOm|SMCE3l5%%Gc(}5bRqC)U30u@3Fx){#@Ja`vM0M1j_ac1U*aE@wJI^j~I(zo*3#X>r&OJzrULLz+Z?I`kF+R=!! z#Ad5^#{`vRtVKcfHgz$DYGxFMFJtL6UGE=Z_j?^6M%%4y*i=2{hQL#!aht;}Ssnwm_iJRNkxsX(5U zN;j;eATXQJ=16}&tl|jDF=jS zEjsr5HZmre;3 z7+Ddh-}sMW}DjKwH_I}Q7uf|vlv=TRy*Asw6N{FB z_JDP!qK=Xj;JmA`P4xKkqG^{~rnVOyyuM7QA=n?jnyL<)1DCkzVM721yk3)KI8b?0 zcePs>M7RGGljOj8@R;csb?{fLgU8bjisw-j3c>D zC}|Ijcvg%Uq&+es(r#6CjaAWRr&I+2UQrd_+Dfd#4gss8Ypg=ir&NVG!pYFua@E>$ zta`Dk;=7dfXzHmU_0UBpbp_5cOXbDq{z8(tJPf*GYqvLpx)^j57kVmjq4C-0blB_E z_aRK)h3*a~u?AD-LSr9rp%MReeI(U@xdcPWv9P2!^z3uubU+nimO1J{oE5emmEh_<6R{SDk zVeH|kiZNHIR54SW5$Wld=$9w8Jp?M8&=t+SL|#kK+)I}SY5<)rS#mr>T%+2HS%S0} z)R{oi)4Jk!tg5?b{+&p>8cBPR;*@PP1Y()&#Y_%V?TKp=MtewI(~MA87-vCU^lZHl zySNqQBZ-cCF*hX^O{&lsm_j9781Yyb`l8@@o?ndcz<=p>%tW^%XaV$Wq6Lz4=BN<* zXAu4hGba3MOHLT zi2pHNVV1?J-eRn`8IP}6xo&oUc0*lcd8)kC8{0$lO!=xfTi)u|GuN4dlxZ!(VZTz? z?2xiR=d3cti~4=TT((^q>h0nT@z0umz#`onUk9x&I2Zubx`{p|effZ8&C7xSQ$Q;Z z;i><7WwJPA)=>M;pS zSmf!jjrf$V)L+qdVqb41ZYRcbMwgBFbz$RaSQ^3qDr|;l!lCZ@7Lrt%$HK`wkA%}< zj#tO~9FM2N(7&2rZIM4mR8zJx%+JOkn;m>Oz&xfa;=CxBpZ}8#sx4M9(aJ!JewT+2 z4-6-xn(S2_Hn7K71D66@#OekWxwt(jFuF*ulb6$k^7Dxydw-IAuXKK+oIVzbpzU3p$mlO9bAqfOGX#kay@FU|3cua29J zeb?#e_pzx-5?IP{=xl{txc&dwOhY&fXLP0E)4I~|D)zGY_opP=tDBRtPAK1J&uvRSW=rl(P=4dQ(_x!QYFHs7M4}TCp;~uRRR}UE4okEX+>3h z;?qi6C2*fr8RNiX0V#{B>Jy+A)2iJyNl;#*ZXub*OtkhjdZA)lZ03{?mAmOEXEoM! zSP?%`93hOzy)P+hPQ@a9&6N6!NMUDWFvr!S&wfEWZK&2t@EUQxL5Lgzh5YT3H(V^vu9VXA5%$8?2-7X`w%zLi*uo& zQ@SelqK1N=j17T8i(mNF7+Z-!=6Piw`}GSn6BZ9wi~+;zV+<%d7H6a#G`wl+tf{B; zlOs%y=ECP`>S4CX`soFIo<`-ttso5Q)m-r+|D~Dwn&p;_K2KARmF)90s59n@Obq2O zXfaALVSV0ae6CnVi^i5)N)}46EhBcWp!sS1wJ*-pZJV48%y9!qgYMy&Z5m<7Tz z#pAy(=3ST=tqELEJg6gjQxpmpit2`{Y2xJn8ZHSQpB zVcdw1bt&a3S)=e78?Cu0%;*>K{AX-L-SdCOCalsJS2ZiHf{SIc*M7!kqeVP;C{#NC zXKdCi;w2QkK(2a3=z)UAg`Tj8w}vfjmBywV{-ab3aKs0xP@nj!kBL^A0|nkVUh&59 zQQoNd0$EW2(cDD~-jq?!Zd5|XPvViFU8RT~4ow}?RkW_yV=-;Yk_){=Dt@YuIMGTH z?d(eB@G6OR+N(`t6Rv6T?6})Zo@wlqEs zKKZgLFn*0@buAc;VbqBq19L8j!C8U%*dLhX90Nn*@jWa!=ksp#D?4M59ukr3zLan@?f^D`RLGCuZ{@}nqg63&iF4| zkAh(-Yl}Dyvj^Ty!NrxVQsv@jrzCttK(X4#1vI2=r9jC?&IVha&C8^<{&3>Lyv#9| zaYYS>0~OPTH*gtORV5s(m{!@qWjw1Y-pf3jRtXapleon97jvHom|0R)?`1BfRVUYY znbjPw6X$SK%&<2(%oa;Bxx2_*%@8F@mi?kPiZ2?s({Ni({I>Le7EiM>7dGEhufAk9 zZaM9h^i*`tE1hM|`ANwK+G<(y;U}TXseGKzEu_kmLC{YG5nB=nZ)uiN5F5CMXJp%9 zw9~rcNv+Dpdl0Lsjc@n?*sLsimr^yV#DaRssM#hfmhRBn#3-Hlee zDrYqDuw?_zgoaLshE~Px@IX2DvxLgNxZ4mf1oR_^9!n7ZDXqz7vzaf%V((5 zu6d#(s}^fK(SUZXFb1E2yU`CNCa9Kpoo;%Xu99~We1_F#qOw6VVL9bKj(VbFV9u)g z-~Nu7qOt0*nR%l0MA6JqZ=(W}L^Pik*|D~#0voJUe6|wEZ+gr!&wa{}u|jM?@ehq# z^i#@^KBs6h&sKscH}XWE3hkWK6-iyL*lannS=B-7(nBrpi5}%DS8JigxV>;Mw1NmU zya=Q`g?nJ0C_DuQ%oFXh4gyufT9~*hYQ*t;A=O|+##Mf)~tmk6udyLIwtf$!9}6Rd!ma0J%Ms)qZf%p-V=?K8}URd)F-_0 zq-cerJ`s3hsp5^LQQk1=Hoh=Vl%sgW7v_nAQ9m87k9eZuk)T$kg&qq{J)*1J>WV#% zr%g3AA+i&Al!#k-qPn-F#d_(9hF5iVAk>tPGYJ|-!vE?tPL1v9f_s&Fp5?N!W`sA2 ze^G_`;)Qu8W09$|qEguCmr`j1H)BD#2pj%VTx{TGEUJq4Ocv8B^3$RrAM@Ex1u0um z2fb&ql6KI7g3J2`m&ilOvH{EVWptVOfsZctNJN^!Be~dZ#Y4$c&!iv2Tv-_>!yQRh z3ro*rvi}603EhZh7yejPuRdw+>1x`m^SKvPIT;4Dtg7A#T~4ctuJ^CPDJr4J4%(uLaUGHik>?z5MF5=PeBCt!a$@h2CDLDnF*YlQ@UdMSETPf zh?P{|$LNx-393%28Xof4igquc~8__CNlQ zUpRg0!~gKu)7gXjf8nX0`qSU~t-o8n;saWHC0k+t#SeX$zpr~}|HThH^ysi52)l4z zd-JpCuFf1r?R|re*EQxua3UD*7-opO+Ch!)8#LfXl((vHbB$tYAqN1;XqPn7?(Z+Y zw&^g0=TOJa?2xjUhPrFKamU=Cfr4PsTpJc%&WK0?ZrYcsa5eeFU19&v3ylIe%& z>duEgy#H%o%RY4H4mZirGa9bD?3(QLMeQ(q5?bVSjr4-&{%^4Q%gknwv4}@dw2unn zR{AniS^n#9u4f_@A0^^dcsavMZ|rdOw+%DOd+>A>NrO-Nf)h&jHa9bcr738|wC5{A z5_oA*dBeGN!Jgnk$^gcmU@A2c>sagd1G-ci*nZdxwyw|j8buiO>ln3ld3U~7{pje3 z!V5*6D$ERO&z)Ut=(|uZVwXl_7lMqpfS^WTm1y@F0rC3tunOeaB^p(%0)NaZQsCsB z<|C|96RRj0%UGpWB4!T6L`))7{V&dp{3QC4BhvpV7*NN;wKzczNve1MqETxfNkprt zy*7ItBK7&7V|_e}s1}2XJjD!Sg=ub?$|J+)f#K`0a~*~=QNT9uauoDKioDb8KWw>N z+sIiEGl>ZqVa0@SfuS$H6dTZU@eOif7@rx|@T)A^Be}OB1zN&FAZ=!rjsQi%QH!0d zg-&W24O);uV@LSWe!c%GppeLP zmsbo%o89?=4J+-7m1vLt7$typ?S_@Ej+L$+spM1%T+oGG0TO-aez;ldYCJGV1Cs%C zB8<}64ZR|Foj-F${eHs8{KjbK#41Ej^rRo=hU^YdNK?g4SX9NC2dhnHoH~hJw`9kx z;5_t!)FveEa2ln~jg-+*4MDEoKWsTH{=wnIj=_{ojPN@};6Y3FhIAlSUfjeER-|=U zd>tzUMSa%x+>mn!?jJNr+-(;V%J-y>_^VyCf1vnpU&CzKT5p4&zg9mCtXXN1RY{&Mvwm2np7C5dg!L!WN7Q9h*a;RVwFG45%f>cXAGMNkAv{Lr6 z>?WQ!t+BiAX|8@%p52gV-5+Y?9eg6w&&G(AA>7an%seuz$*3^Ro4~LG!i>mEwq zuKoCa_k%}=J&+A5Cg%{SNjilxGnx0oEe)xmxXH3V@bpNJpdi9cIo>8xL^10@+O4wa zXx}9D5<8Se&Dw?!vu=isaq3<7i9Bx{$sfRm_veOn8Fi^mj+M0}Ls-}puJrbolrvzu zhs$AzR(nEn=;JoE;=#jaFr_}|9mKpjvwv3K;2KZdyzQEs@A`iRm+bqLYk#```C9qg zr+)r5xYH<(dxxzxr3Uu(QTc=;;5ut+=VrAF$mETo?W=k&JrP=jCGYxq#n}vfrgs*$(1n$NV&Vr_6v5R;4;=C8oFIUOF@&LsNX`M1 z!j`uO-P^>t=m-kf5}YvyBH<+uP0bH_$07G(xcXd?-#?J5qsbX``P7`7dLtkvSREI) z0c&Ee|IAF)r2!fJxDbe+Iy+z{Nyd@yC3lmzlJb#RC@kq=chI5iXfby2NlNURKXG9%d_A8U`uiTK?C2 zWe~5=-@~QzxNDixxuJfyYmW|osvJD!Muv~+xZCt1Zxj8ZfQ&R;s$a^YW2m@3e<#gj z_U=+IuFvn}!mRT>H`MhBQSR=(p{{%w?(V#y&O$_SCY$9iUlVO3OZ;J)`8T}ZoqsO^ z&t+aR0dEny1hry%*YZYSQbqt{!fJg}%ul40yvGB>`VL&c7Sw>NirW1g+u-WtL0S?W zAb217XhL%go;h3F&zv#daB?nRAz_!i#MmgltTQF51}#~LwWw05Q7nZKiBYM-+@gbL z(iD2z_rcT!Jh+4QF-#M@ti(5;>;GRSz7lUK7Il7&1W!~94IaROm{VFLQ8OJ4Q>tca zZpe;dNwSHfmt=V^rU$@W&vm^dbK@l$y^xl7lbACv$xX0}Nsrhi?jf`)tSW-3n!>8I zgf!E2{8;rqif&6(z-=`7os_HE3-X)6z+m3sU?98lHG-Sess=mM5--*v;at%MZlQQ| z+*HP1mgc%U+=Q{FZ__BVO@o#nLy*8{AA;td^jaD#4wCzZOuPn(S2#Mz=osXWBcyT* z27L(8^FrLep?<)`H5qLW_2)+`Cx-nN(Vre7Wd|&OkGIL7DW(y^Pt9`JWl{U38vFJ6 zA%u}sgPXaK?j}uw)ZWB}sLWn22U;d%z8mVh{oURh>aG-Cwpq4|-TLEZ`(Ht7 zuS0l|atSYM`6j%X>pyD975#nMq4($qa)KLi(hw%4S~BN~8~Qa59A*XgZl0u49#EB|II_g92fx>YH&H3UvlXPqznu1U z-)z!|1{d48mY5OG`%-$Fl-TRNQJoL)NhPIwxM&Jczpr@avctm$V6OE&Z`dTeE*JjV zP`1dr7RCYo&BKO8Pb!8${|1H_We4M|k`wrR7rYQTp;mH&N*Q~UOfWFNkfu6on<}T@ z&s$SM!}a;qexSR#K-xX>JM3<^{Em_exEpfa`~N^>lLawohU*A>%9-zVH_5}~J)Q~p z&AOjf+^L)sp#!pOvb%*lLoK{xvm*&BalfwtiK@_$OPIQP@+cNq!?4`E`776a@Fzcc z_;tU~|J5yF!b2$3%7?o0>qE#;dL8hBJeYcO*#x2y@=`M9I zb}w_+xvSkZ?xwQNo2kRY?eoLj8>Y7u(hRlxIJ{D@3QR-?H%o2Y?%vY>i3VWzv$Qtj zw(?TV+RK;I+qbxvyX)O6+#dHjf#iq(NUl(w_x@?MV>fSduXT62H}kr7i`(0OXe-T3 zx^I!?1op-5X7?hujV@p2oEx}Tx*Oc9+^gN|sq2UNR(1Kc#im)x2=JYK0KXNGFL77e zi!0n+{eLsV?HlI@nMFc|!lfVIA;y>4;O=s_xuLtU@^?!H9y(W~SSFh=R z5tEnM8jJ#!HTp-`QLzVi2lsZ@J>9GIO`~;&12M~x33Fjnq=CGk%iU1=0TVR1qNoja z=}}@okakiDw{^$ha@`djZWUS^?CQEJbRBBJyg%42S6TlJu5y=10@V&c-M~s;;VxI< z%cUME)filv?{ixfn!4PA14T9%xLw>1URvMhUaB7k?#lVW%eY)IKe(F9uKB?=6x&*t z!hMO`Mv-lT^pdVE*$-Z>b{m6NNRk>*{+ik09ygpv|Dlzo#fhAE-Nkf6e=zcz4kfR* z={4V{;k6_wmfoY+*Q(zQ-R;w#n_ZJq1Z>Ju9lh?k7OyeHGgeXn%8);W$E|p^#g7buXU7PEWKbY9Id%N zKj`FE`(ZN=?1J$RTX;~aul;fn4;RIUi(g)Qi27G&KWtDI?e8)B`>_4}8T)(O{yt)V zAG5!|WPg|J?+N?+r2YN8{av=dC$Td~-Vkkcwd3@P-R@=R5BHK;cZJ(C?>GWuJAK(6 z`?7R}5Kv%ez%%fnx$;?}1o4Um> z{Ym8Iz4&w9u`r8`ncLpavhHWL=bMkzKHxo*v%~M;o%;?Ixl={n zts>v)?i{?Mi-o>(R=@K4ow~kLrQV~*@6w;|=1-BiJv#>9)dPRhu@|m-;Q0o4wdBIcCTrrgCZE3DZ{flI6u5Y-T}8ayE|ra+_YbL z$lW0x`~RlKGs^9tyAI_>CP=1JQ`W0^m%FRz#rm`TKN+cLb6s^|n7KPgJ2B<ocyRSnYh359FP;9ps2?6=?)Je! zcN6Qy`2S2=>|=$+1BVB9z;g%P6!8;xkUz)v>PF8EJvVsfM$a8RcX;MT&pkc&c;-moX1b#q9O#%0p*Rw-&s}^uJj1 zEMi$0VwtHCmU-RappTZoE;qt&2W^b67psV0f?V)CA{RW5$OX@9<>K{1yX3ew(@P?m&@o%T9C! zB3?((&6HT zMm)0^k+|bk#u{%xk8#@0u;yx`FFWhK?C~;lSyggftZJ3UH@Bwr7-ESGz48_g6*Vrn z%Vz@I6*B>@gV`9AoWaH&9Oi!)54a&&|82vA3YZe~ko!hR4pxRP1W*Qg%L}5r?hREh zp^lQC>|MhK?rEkI{{(anQ!l|Pa$`mU`DSOb$c*0dySuPqqTCy1E6~Co$n!td#(rXn z;Cw&zgqrmLu8YwOjBe10afa<0ujQ@>9=ni_}Pn3hAUHl}~0Ipvfe@Dys+w%APS$?l?@Oz-iby9@anPLly zaDzUrLle{~OBMgMm)Aa!6Pv@wf3dmdFZIDCo-flgi*en-%gis#@CoI?4T(iwjz_o| z(?TtaLSBmJw+k=pW&QsZ>JcBMWSf#*N^WAtaq&pWD?&*MvT{fCbjSj1R%Cc^FRBVE z29jZ_JXE&>t1-B$bk1<`=HtRBIWmU_ZFl(~cUNGqSS}4h(~{71pcf`mVv_U6G>ttI zgp+ZXk7Ca_Lo(~~PVAXIn=30?9qU=6&ciW1a zb7tMWB6bt!OC5g+Y2MK}<2QGOoHI*ZVs&5R+Xb8Yk;yrWRbXlxq#r#%Y_J-qAMq6$ zu{me>c(S|Tq2YKNoEm#eOkXCLx525gw;Zx9L(JRY)C444AtYQ8alyx$@<$ zUB(Jp@P`$cq9m;F62F_%(6AS-!tXqf@H@|I`Ta_v=t{zc&{$+b zgGStp!S`6XQkN^i3h1b-JRQBn+^+5LEH3FzJQulL&MVoSHX00Wu3v)C?v&8(Vh}^b z(0R?d-Md}9k=wQQC2rT+m$+S{FLU3^(c#qAZHacg1c#Bx?b-=AjI*Ty4hu|p^t~=| zj>V&wP+-{q$C|5HfRPTZnlV8IL(asI3I@Sv?3T#ME(|%lLC(M#)A12d7qxmYn!!EAB`$=9n(E8a=lBH8PR$p`!9kdf@ zRoNRr6Aq*$mfMHoX#4P7gEVDpQETYK=J)yJ&a$zOtFdi>I7eeMu`#ytgvLncij8Tt zX4oDF@L2)qQ1QQ*rxSXcMF3@O7R&EZ{+4Xx!5yTvkx7+KF&LF?iSsK1#33PuFFXSV+?y}%P_KJjzIiJ!bVvwv2L z?*ZQvzX%3H9CUze_uo0hjubg?<=cYAJt((vxWe|;0j|}lVd$|I_f*xccC}bd35+?5 zzpO~tyPvMtT3UgIF`B&4GT9Ksi7X_;k@`Tc3-4^K_S`1hioTP?#=0TuWTLKkuaGbS zW`=Do0)n25Y3p`gvm7_$TDIYs+nu0~69Bq{4mFkTDf&BKr)_n#A~)mORM6c{MnQQ? zUgdo_`cFI9TK%8Gjc|xg*CzRDt>YbK`?R-ztvET!Zw56$? z!`mf`k8S+SH-s;BgE<`upH9zGD@}y#s*ON-l;j1NptxC&1xpx!H)x1zV@;jkf!`g8i2J&M@WafQb$~U+6e<-PHnox8wLQ96r_&tiEyvx=4rv* z&COo{SN6g>?gEeJk;lpW9AGjuJ|V8wJ<;&2?kv~c4@#jov;+O5wC!cLWUVk#>%Vsn zwTBCCMaO8PP`f})iOWQ|ukla)uxs76!?PU90B&j^+A>*64%UQT?^K1?YKnXI>6=kA zXRu?yFbtS7}5AGXI7DP^@;*>Bdv%JhV{M%Hc6-=M)~3pBuG`=D`6=Zd%jPfM5h{EW@z@&`m>IT|Quq zLGU^Zf?xR622r;eoXYA=7)1Tv*=sWOpYc?;HGfNwIck&NXZfe=QxM+pv*|+vAN|J>*eohXnPM z`rKv*cHXcvthvi3ZphGn*JLvwip$o4j21bm$i4QHZsC&MSVR1kn#%qqj0|^K^M>qF z?pScUnhOeIw@EU!;lcn_cfO^X;B!Qu;4>CQTCVl*U*+NNF{pyS*X{)Wb==W|LtN+& z;;#M+eqO@Q1AKlmxw|IYh9__E?*ee+wb@(L%#F1>4XWVZZFhqIF7EQzX7gMS*Y9=B z{y(q#Q;BWJ@ADl59a>f-d&J=V&mP|U{g3zh%g6NNLVjcRBf6n9*%(&(XLY4{ayJZ{ zKViS$SR=24&41TqyE%))Zf*ND=a%RJlsuH*w5>Zh1wXh_!iuQ#z0ZV?G>)AB3DtvIxa|rBS$E7tl zV0WN|D}Uo);Mh>8xxipp-{)TBp*7s}?BH@*o}M4YWHS%L;qaSf6fHExS&q5pyubPEE z+k9)Bt2#T_q_tUP`S2wN5p|jv-S%67vsHz*x)#0fc3`1qAYK!jDU{OTkHyha zUK7#R{1|y{-5(>bt@-f+c`eq{<}mBd|L=KixgF0Sk>AOD4&0m9iBFSwo%rSQHyzH{ zqhDqxTy(|?d@;mBK9qO7#rfU27Oc^>%r-FD#v#mFJYD;Oh z;_nDCpEE+=d19lQhHOLg;6}3#>yjKKBgGRZA zFNfUKQdQ8~-*_{=Dm%#OHn{K|$9Ibz^SAEy>VBiHn*WV{ z@~Z6FyUgwog+ACWskHKD@%htCj5Krolx{lQ{4ypSx2stFGB420#czp*uI;BHBB1;! z@8)4U%*HTf!>`b2aS26LtS3~JuK`-McT~tRubBxNx1@rypWge-ZS$FN%MKZU;;Br& zvR9m926LAce$0Jyn%mLb9^V`eOE?c22$~{<=7N*1=HzknXT(J(J^otX+#YKUo??fp z6~#Hn!6gO}drV3##}%;QjuQC2zS^lw&t&eB040BF-n>giF2XpqQzTa{WAM~e?2sWl3TS6i{rofod5{O5bc1TbvO?=0JGY7JIdkKJaA%O zP9QZDJJ5~9i~}fkNUkR4yBrx#vb1L#EiuW-iZewG#R7djy;kp~u80$ERIH0@VuRuP zu_7PrklCS;+%pCnnZ4I;ceq9S;QJC}=*7nh=J7<>R5w4^!n+plT6ia}IX_^}w7%)E zg)NZ$0xZZ(WmG?f#F>-w9(DWyn$vaW?I}>7pB2fzC@s@*7mbvG*KNF7IroI_!-yLL z)?yRnWkaaQ3tD(!V_>AU*bV_=CjL=8v99;e|FFUFB|a!w$A~GsXsn>^v)fHtiMSOt zP6a{fl==nGiIJ--;-MfcT8@oO#b5si)aBLO{ElvRb921{6ZPVwdUo*RfBp;2mylzzQ6FyI#mmH0h){^kru1 zA?prl+t^m(GEuMtRXWvkI~KxAk9eOUvWTQ;7ZGxYLxT7q^oP4&sn;fsd>wQ)^(}%% z!KGV9XQ2*r5?))P7u*AKT8E%DeLCQ2jboF+8^TdaRl$HTi|42Hzg|mA*hH4jSN)Z> zze8FBSwEtGzKT1(KNwOK4P zaRRB+o&rR9H=^}~(HdG3KOLbpTv*ZC)<)QHCt4FA4YZa^T4_o>iPmV#Kp#)T z$aA3e?9~~PJxXYM_gty`W9O&xlWVCsLggpc{%%wTISIL(1VMl^u+?KW& zeMUHDjV%tZd+(CDVs;#i@w+d?82|YB>HGP$^c$h?udV&vj4>c9`fhBD%K;_Em|57Q z4U_RC*7)7e!5Wv~WsQZo-n&LwQdcP9Nv0p5N%7wyvi<`?Z1+3&e z)YP$-|Cr?Mfc&!$zr*AcL#AL_1Ki}artX!w;h7%w1eF9P7CKkV!Dd8m7 zU^Km+lx50`H1Op=B|tib!e5#j_(KkgKl(HLG|dfuTQ`~;T;=Bm|LTi8J4pT`f0oP* z;9DK)Pt&x)>{AUXUQf$7S4_V7g=fFQMyP2D7v8=C(1=kndsE*>eww-ML?AHK!wDa1 z>L^qeLQT4lp(fqOP?NUB5J*wJBG%YP#hNzF1EfLoQ8C*-V}TI*Gi=I9r$f_jYJcs` z>vngvt9qiF)4rRU>C?@I@1~9(h~3nE?56HxH>cO>W^n6$Z-JcjR>hecFlj1#D_lbl zm`2AfO#8DIe(uj9i>3e{)s3bAFY{9XqZdwU@rf^*arcYYwy7E-DI5Z?z#ocXRlIUQ zR5afxFKkMe6+i#yqmwfupBCJ~q8uogvElTAV%qwlzgVZNLU2sm_$zJzZ{iNCPPF6j zU=qvhno4sk-Ag_DrW+fBWKp8 zY&zu|h&d*Y-IHOV9A5L}R6dd^ZM-GOtWW|goE$s}-`N~+0C#B8!rJ03@!gQ4K(gVc z{k6B=+j!7zVm)qu`$Mc3@#X{j+us308D9&H{lsix){8aPxOits#vX(Iu1yy z32Cx?@Z2|x@p9n|Z-roBE8r})1BiazqzWPQWNenOKaOdi^bukKGIspw^?zDlgH=o* zM2%5f4-C<&(r={NptWQNy7Xkd2BR__ZOJs*1})iOq#(yy>Y}(Ze7~sKB-qyvuImIjBIl7 z$!1=EFe=(!s%X2x*263I2@3IxqKH8zNNR;T1Z;yyFkb&b9@`!R(^nS0DK2Iy+qk$T zT-NU!U`}PMn6s6Jz9nO&ENFhNo9e*oVx<_jR$RV;TVigc?ZX_v;8xl}_MWU-Z|~c( z_iGz&$a8kg5?~FP{dO#`5y|YMPR#6Y!t85C0&~DL6+gO7{g1)}(!PC!6dTWdXUNx> zW(VvE=4)<9IXs>7kzw8G%g#^_?d*B83y(~?$qJR`EVVHFa+W|P=d5~E(z{N?XEgpD zk54O;(=!kt0TCW?Y`(!;BIY_6jVP}65w3^Mb=qBn$lyN(`wxGjCp=^Ra5J_4u-b?N z8ky413O!o}``-?X8C_7Urf1BK$kh&3-@>n$2($ViQu?ki(>zDFEwcH(?0XVV$Bc(HdH_Kv{*fDsa zs3T)SozgxX*fH3Uwr9uSwM$7F{-h+OsL+pO_X>YflY|UF;w1Oc8OVi1Z6@saoR#FqHdc~iLa!t}JANHX((v~zN|G|qJ0m`e zl3df|b5N2mM2)@~QKQ8dqDH|-e<5n52;^wg@|zen`ms_6TDbCssL{Gnqi3H!vtr0; zV=s7y&vE+v@fSS9YTEw1d4`cGU+@eqbNIri&p%#j#dW98FL;LQO`m_SmG}GyxHu!B zPCD{F=GV1?MM!^m1|j_N1xH@kN@r1127bs(;24QAEkVa?_|5TT5VJ1HN(dii&`YH~ z5PPu5ye0lNX^7`Ci(s0Nh%G}~2JnQI@%4rv2@w!29Q&2@VQcm}?X4j+spa|dp5^)S zp5=MnlLrv82qu(8;CCE1Z7l+jS`N97a_p^HXI=a`z)THM7mE&cH2PruCTVdY0FS4Dmv9 zBdrD#;R0=YnZz_$UMFD2y19}sz=m=UED5}!C3T%g7t*3@j0MaP8?q#3LL(rIZKMS1 zwXH*E{tI1c5mM>PU#UI|aKgtSi9+qzXMG9W2z1S&R4PxjN~w?ytrA$&8cKAui8;43 zr!@84>T}i7#l>`ahw~xzK#uP*GJ#JQ22Euw6(o9R7suLKC(- z34RNE*hvJoq=Z_r6Oj->w5zmvaM<2qHQ7C+Ret+dpGfsfgE7k5z}3-+_!|94Qb!M7 zufM$ZUPOV*_p{c2&b84hG+$ZyloQW)!&9d#0(%uSc>i>f~x{CI@DO!Vo zEYT6z_kA(U5&WOlPohB^RYzYA+R3&H{PX^MZ9jy%vXkuj(3K{8W~?jpK<7TP+^Pg> z300>55Axw8x)XoV&Icf!R>9Nqk8J5~($u7CKb*W%!=0tq0;jn`OSR#;? zvRk&hjdSm;3OlZm3~AH*xR7=EK4+hhv%O?6m^L(9XS*y#5k=Nc29$}0(Dp06N)oG! z_B7>F^fln1_EpLP_Gm3OTd=wrvTaaRI?qH$y(0_%=WmV3LU#}Z(h`EjZ`FwmhPWDI zvGW<~#X`*=(C}lu+Kloc{IMP`L)clN%yi(wof1X0-?5`y;2Lfq2O)Qbx4CaB2`3!U z0U8XK+5?Dm_x#ZnI_g8O5jDP8#y=eO(HuSMBk$j3VSgl4$HdSiboD8F?G24k z^TXT+pm_Zco=rw+VJm110tR>AxWHa zs%YPC-&|)E7aZNIzZ42LdAzB|n?}58#+z2WX>((3aF#0l7n`D(i%g#((Vo4jxgWp+ z&p8M^c`q`pg-lX!wYw6Ph60k&@sH9eoA{p(dWyH|jLmCp^D27Pi%sYjTA);aDtF78I3Ta(P%AKmR)4RX|so&UiVJ=PK2h0gqxMCYnPo|a2E72aDa@0 zQ)NNI?4uZ^?=K; z>~?P3sXg7loZ_$o%hTM0Cft?TIdhB-;v6ySk6iI+$p+$NkhGhXdYvRDi!u7Iq%f&y16?g0<)$9>wKDb~ zGXU4rfwY_2olK=M1LCQP$YABn}H;?KV@Uy3w7na)XjTogBc}ug$}5BMuBLWqC;X1&T==c5z`z z+Sxe>q&BhVoecB`@Mn8(p0cxicB8VhZl>(?{~jra%XkaldRT{iN{o@U2KVyFaQuAs z$2j@0U3Qusj3e@iLzq3tfrJEn+Z$D?v`#yb5vD6C=bcWGt!++cSqJAXkWHI}J=tR0 zfpTGDpzj%X0_E6hq_QKFLs2_t-#WJg_A1I*pCje)=05nj5l0b{Hq3|2gqVhGnvD_G z!@1f|I$UwY4kjxImlQTaa5J3Rf8;GY2FwRhQ{2CK2R?~>TM$Evt7ZW*3Sv9XLjo3V zEv(1?2X_?pAD9Pqx%M-GLH++mzQ8ImW2}c2GAOE)d!&pm1zuIlJz9fC_2LNqGY1Is zloh{}4ojlO#OMLOjUFmPDD9v1dtK=}Reb>!4Y2Sk^)v=c`BzNCZM!t1FoogIIrH)p z`m`=Yxo7J^4B9iy$vHpkS1t0=D!z;Y)lp|({agsW{PE{BiwU6@kwEa+^U60hP47wx zmta08FiI^tZN@5q$rzD=vAKSPfhh{QZqNfqpg^1tPL%MS6<_?-giGWA;6n+2D)9jn zo4UcR_NQdU&-_|a*leIW2kFfdQ%? z1+uxxCQ*N{!*}_lF8hF_+&~B(gZA`gFR$h3;>+%5t|D32Y(!QK&Nc@eLDa-VdDBJx zj;WejG=B-h!1USwOmSa8Claav$g{(D6g*G>OlPIp)F_;}L)KJj$aEhKneHn?W)m9>LijAXK#_5Gnv55d$qoPi=Fm+GjJfcBDT~oycrVvRIWl9q)umrW7dI zn%blqf=A$;;2ZU)pt;qzDCm?8LS;o)5I9{e2Mn zX7R+YAoROwvS105YgrhPLdmoo}=H8dJe_ORV%BbLIKF;FxwH5RA zwJXKr=h&J~mv#SIbrl04UX11Rb-}l<8?}v93>(NmAxwt1aSxZqyfjW${MTPev`6fx z*g%8`I>ZCvY-h4cA;Az0!St#D1><(HX2Idg7T1TmnP&V~LnQj@HzrwdLe^S>Ey#F7 z)V731`Je_mK&3jN37|ZCQaqbOZZsxlEH)*Qb;paX9+3X(0r9UM`su?=`mim1 z*cl)6xq1r}mRX?TTN&yAYFCg^9&&uyT_ANaWrJ6oT0d*&fy6*AG^&W>xcO^yVJ{w_ zn={R(irzg+tmj{R0oke`+uUn94ULt8jVi5094It~M~p^7Zu!YCsHh-BGVgyv`ij(L z{|4;gR0wN5DMXs(nY8HY77T{Bc5T_|t@6gr`Ja}~oVKx%!&yQLMd_Yw2_|b&IPkjF zB01;*67C29@`)jOs#t^Yq>(Tz{m(oa1IBa{AY5h`7?-}O+6E1wuZ1hQKD~LhH`ECh z^JdeTq1z2o*RmS|(y(Gf`@h)?XPrU=d-vdUO6rRL{TILRi!}ulY+V)S-hMJqFxG(`Z1^#MEiU0YPK^msF9FOJx~-%maj31wFUrTDBDlTlXmv~ofNgBn(vJ!q&Z z*SdA8j`HDIS^H_bilg!pMDkX^xx;>{HDOsjtosUe-%)@`1v$E`AHfx#B2QLHm_zdd zN5I$*eCw3dEoairnM-GTlQ~&#&KI!7nQTZoi&`@U4ofL^M0{)^fVL`36TwZLxkLBA zThitCV=^Jt|G1?4$F^VN@(y&zv-d$-}F%WZ+a;GH$9a8n;uI4O%LP#+mv>oc+V`HS!(`U(>kEf zcbNZHPWR-z`kt~}ECvW7FDH(X&5QhE2=}a?QpztucKkA)tqe8gQ8Nd^8t|4&Ut3YR?nIm0 z8sWC#44{WKOCR9aXJ{4t2BG4MFtl{GiLODBN7m(2y_8{8ygi#UA>Lbm?&F zIDVIoaH}04Qiem!;?5iGf7Nsi4f4Ag#3*JN~x9CmvkZ?R(zbcOJrX1f*IljAw zHKX>{*(Dz>?t2!5$7lJ&&XkWLe`c1r^?XFKguwbfANmwKPp7qh(Boxv66p3 znbfq5S#dQ?=Dg`cf{jj!jZTV(ZKJ~=jaeKuRH{(yfIEU|BO{s$9#H0GqpPZ0F9Vv-6@Mj}o zowR@1e+Iz2!jeF=L6Cntot7n7X@gDf;;0QOsUOt_Tc1@Me7VUtCLp%=e*KrLbowxw zl~>Z}TpB3!8XNCik z>e92SkpRX5_d zkvEs=TO`}WlRV5_#hWO7(md{D9Kx=h|FlR)@xpJ#GKrN^1P9hqEtU!KX$o@~tI zL{`Oq8#1|tX{|kDa$n_Hn0!i>W}L~VN+wUaTiF9CcS`_&=c0qi@;yCYCU;< zD+r7ZI5h3uL=KD-F)+MHlFlX-qE-U1%xyeIH$AsJmp^w>7LA07Wv;~!KSG4$^Sb-; zr@4DlcfU?tTz5kKdbimj#FNIRCf>S?l)?S`?>kIG;m*p|GsiKXR~TJWvCnor+(66`5K@2Ps+w3TRM1f8^3#~>nG ziXD-mD=%rtfht-+gk2!fjGUa}cLbj(O7VxlCt~H{XTbl=FKB^4)D;gYIa66hoZPLW z!?sO|m5;a9Br$u@wr$u@wr$u@wCy9C}!yxbY&~&7Ln!^#3x5E?>vyV80#l5Tfk{u-HKyHG%N)=>* z+BRlLn_T3V%NtCh!H-zm@%5Sh97vOs*;2Z)|4kte`&HF6k-%v=(KY1+C-)1pvWnTAzatkAQCeNCpi77#ga4+0>1 zkpK$45FmO1e*%c_Ic{Pomduq7rDH>xz@g8HAs6)#K>eym6A=*e2YpOL?3|~78V0Bt z0ojSA<A+84x?+8ZA_cW(-jCktqo`^RPMPpv|bTPyS^NrwaO< zi`G^z)@6pN5SKoFqGoQWrAuxb@Vy1J_a=eqDgH)S#f~bW#37V=-}`WNw?l3hQ=bVL z8Tw01Q0&lPj)K=W*kV~9h~^B(9!=^&R$~hrkml(>l)?p6td^ZZ@SAoAOiF8CLb8Vj zvOUPUugGjk2lSn{>ZPiBsV|Es`)rM17c>J?e{q_EKJNP`cu5--Hu_>?tE8;=;%k4H3RJn*WGN4Zdh6DHw$ z-j_)p8RKb7gEloQ|Q1}BL*LO=69Nh*Kj|?u@ulg zS!9!y?Jz?fG za3mEp&x9#%h1VBc)%v;(ON@|k#iQxJk1~tpEO|h)7dej+fg;7tppWUKnU7}ir^5YB zy!u_;?B!;+W|K`%6wM}$C@e3TjX{A6iOuqq^WP8Io#8VG_*r{rrTWDTb=kVTg{g7; zEjh#%afo1B4>}+oFoX0j!(&L+?vjkY`$2L_H5~8T22&lZN!`ZZIlQL`7 z#a2ZN-zt4^Mj|^2KPWx5Dw*cbh|;4~+sq=sWvf`e&?-=^)s9-#erZ2eR*kKzri+FY z@;cTm>!8M1pS@L6we_HCZLBhseyozfZvU4r29RO}KJ?FBlA`8+a^+9Esx?CY)86u@ zo2sAaJ%NZ_S&?=BW!r!E{w&IY%}~KRv7rQING~)|G>4AHv6uF_q`+dW;@poz-|vMT z_g zdw~$z$DS}}c0$5!Q_9dqe$b;pZp85fAR;r}N^?fBplw%pwSnfE)fhD-*k0M`Czb+q#(>9#P-!mO^h%w%w5n%c8k}p zGp`LXaxaKO3uX9ebXRH^*VH=`euxcBl;WpaD==5V`qaBs`BJpYQtCR@m^F4aff#{W znMx3MKB!6~GpOhxR!R@BHvssNT@=>h!}LnN;*0dfW1ryWYHmKL8+L73gpmyt zo{b!A^gBN$HgaAc*#ypjDhOqclmdYyr3$=gtl9T8OWmFj3X0bh&6YXLuRS*c27f;Y9u;4m0jLiWCMN9+$r+TD63I$ph?gZlB z9i!z#+6!G*H8QJ66m#KprJiy7%yH?~cbM0368tpgby zASCDofv-}`uhRj;3x{BMgxD8ENu)A#vIHp!)M@H$Sw|^?IL`l78oc=q_LV@7Rz7tz zQVM8gIZ_{m;Z7XowC|Bl4Pka9Cxbs0lgd~H;UBcXT70r$OZW_xg?kQ1S3$$4RIQz? zBYav*?P}~g^rx?+8xA~Ib8-d8TVlfD2||K}_eT=Mt=kgpGmtNDOLZLGq4YDcSlkT2 zF*u?pflFp5OakaKPTQ2`-=Q=SK6A0kQ;YB5b@ol@&RhpoSo2Glz@$QWgTRYZU=@j17>2X~zsG=iiL#;i zEH7{D0~Vb5#;vU(+sAtA{9I$y1R@Vov+gjytp1~$#3?#7M*PDe>a(mYTR^PEvy>Qv z?aUJcRd?mkGu2RjEIkreZFOW`9AWrd1qjtkbrH2Q-*gw*$lQ#Zv?&j~2s-=;`?(%S ztH4xibxKcsxxqha(u$*POIt#VMyU}Wx)<_wb*7SVMiA>Fc$twaTA*o{#$Jt@!(rwJ zGyEi4hf%j#VApWBG6wuF>)l9`WG4!!1@y8|i&LF~mCMVPtUw)|^}yYXNr6W=e=1rIHWqoy zF*#~ECfBzdX(^yhao&(wnEx>>M|T6uVLP;>8cWMzrOCQn*K(-%H()ue`ah-R=tj%Y z4YOp~&(uC>!E1fXVZW4?!%mxGUntzOj^&X443 z0aO_e(~GEUZ#?KTG#hdn%R#dorjunkCQHk)#aoVxye^e3mm!sTh;f~--*QZP%YiVK zmP4y@3hj(q4xG5ka)eQjT8=ORWhM?T21X4ShD^!mj{uYgV9ZUKev$oG7i~Rvs&dM##8(aG@;DlwyJuw9s=C z&XR9jwyot5Snhf2Kt>0&g~>RFz=BfY$2(wIIt`nAfha{X%xhMhA2jgULz`gZGnWpt z7A$a>*~Td)Imt)lS)r)U;YU!#9OfnnHILVu;JBw$uzG%0>J#&|pgW2V&3Egi!>mw3 zsLbj;DI@q%7TMBH<)%5z$`Z$6<`=T<)0bd!^d%EK9DnE*YQ|+63!yR?ulD4%iH~TP zQHE%G%{mmYDq9VS)ac|)LD5`?Bqy3NV${$UUudME>ikd2ED3ET1# zM&;uIL`RekoZF7eN}5uaqJwBe(P^(II>|Ks>lGcfor=!$(Sff+bQDnzqGLxc_(*Xo zI+g`5gd;3obo|*2rRZp7q7oeyw+RGc2bcmbgp;G_*ldq&DC>w0!2pSlRrgtpQIn*i zgA{ntG0kSbu*o}p=|yMsCDY7GbS6#fsS6b46r?fHk$N2!orr)aI&u`GzY_`SAulbH zpw|45Y;59(>q`&z39Z$K)_JcA%p|9LXs zdZhUQR=3#w#@PjMgM=$?_=2zF?l(4k$>u{MP7BmAA=PHDDeZodAH=QW$*o??7FHu&->$5)vNbjRoyC;q>`#E zoqH|YCAstiTegL4a9!gc!Z_d#hBz58{J|frs&bDdY*yARutbIlPGdT5|CqS5n29@K z29lN&0_h&oNfS?oUQMRyw3CKjbV3q$l9hzOB+RU2LU)*EKHq)Lz3;xNS5isHKoVK5 zckeyt-t%LhefF=j&pwezuBc4^p?339PVMHUhuY0c54D?@9%?tQ5X)gBG-O$!o2mv8 zQ)~;_un7%oX3s#ul2h2JZivr}^s6Z{awt@G1%uYUQ%gESavWD*#Nv5WKN^WD< zmgf)K4CE0trF{-;8d|}u5SpicTH+$ys!D|Ky0H_APbFlR8FPnicqrInwpz@7!kgXT zKC7R22H$Li`_*EnrACD$SW@@8=})*ZZWdhc6K;~5E3kgWcjNwp`imsaYwT_D=qKSg;8>1Tqu9k!LE(*!QrV*2HcXOK$^h87;pVpHyRF z8neeKrlJzMY6!Z=b_S%|das%?;?B_!1TWdSrm1^`y7{ASEHU#$bXjo|Y#btxr3n)< zT8(K*MNj|>)p?GijJjGMY5-}VVGDI@1RAw)OW?WSR>ebF%#*)%Wr2;Nrjez7bNx!dDp+ca8O7r1rCq!oAaO(PDb4ks{EhC#z~e?mZ&m%WnL1 z(N(Om?rrXeZ*w1T<9w+iI*RNTR^;$JxGBZk+I4isJ#OG?PLG>^t{eFv$VFaW2iCBt zYFOoh=A*%BFmWbOq2@s?(BRS`UBqJdB|Z*&+Wob$xEn%5P^6uDPxPb%P_c-gCpq-R z;rV8TY9>l!&F;t8!ysYD5DutqAc=Nt3O$5sZR-f^w z{Z}okp9iEZ%9=Fd0?DyuMQv-x>M!~li|n5&vibpTV-ZtPdqT*pa7DXVBhfPL&c3lb zD@t4Igt^q%@Z_3M-0nD)!L+JeRjDK^-hU;bOdaw12UEf*H0ySJsHpd9wLX&*aZo%g zybWbG;4;3}hYPsS01PUPLKsm9bZ5jy1X{&oJuZGrkFX!e0WcpUt}t*B+!iT9{LZBD z4%o-`Pis#xK98ut7oeV$Zci&+(l3s+b~RZRJO+?MXDQ!A7hyNdoT5@+RH~w!rX!6V zKpQJ|1BRHlj0lOH{Or|nD$u9`35Dh3R`8WBOjQ9xB>f^EqC<8Dkb;efr-BoLpbAn< zT3LDkDLlFWm@3h(sYeQr02);L#*o4+--q{@Q$o#@FNW-8Pj6(B|?~9+=9Szc!zT58$Pk%D*z2 zju7@YelHpWL4Om3L&RLua8Lv!9l(!@iRWGK`A2VakKK!WQxZr9+dfNRJ>EbLLM}9g zqG#f=Jj|w~f^m@3N!u=N>xEj@X)Tk8Og@1O>b+X9yvhq0UW4rF@8n5|a5Nbnv9vTY zOoa094Q3!{Z7fQsPa#IK>!S)5g#&tYuFBOPzCgSSf|Wo5P?9?&KAE=+f(@#^pwc2J zvP(|l<1GmkcN>EY?vq&M?RM;}7Lx;1&1|8t5rh>dN;1}bIx0y}0W-&F6qbJp;{rOS zn$QxK8cixR*<4U13c5x`uG&CN&1EYbjy{T0pSfv;qaJnHN2`%r*G6(_9|zTRwX%sz zo11>4ZFY-Ew*c$7;`}@wTxr!nxepxLljGGFuV zueO;$>3fq$X^T*Qn+-Ru_mhZ~t_lLv&%14dlW1DO5VooDnD*VcO`>f!iLmhH+cn(V zG>PPV)sxjPOrmX?M6-00z#dEv1xB6n^;DCIB5^FL^K5y&pO>5?FWn@sr@2JT63wMq zgV3~}OPjPoo#K5nF;44!!6gA>?htBMGikvq>>Ghupk=LGL*r&OllXWgpV3U( zrJ1zL?bb}{xLx&3>V`HF6ijU-m-baNY1;9HpGjKeqiDQvrm~-f-lPnrH4p+JgvYkl zpBDLSm`I8SOyW@5~qaL{(Ptv3RdRz8yTk6^Wk$tXJ z%=J4t*XX2rD4b(TTPP0dvjZ}IP`epLoqGa;1$cW`KFziJEA6!9X-J%NiW8&IpdVQ^ z@X(K$_4H##yJbUcC{I6TY-~a2e4CJbM)ZS?C#)Wj7U;)}=!e`|MhJ%G=?AWVs;8n6 z6e*)sm1j8E&x3w!ng{(DnwN=w=mbLOhwM5Si7Wasv<>Q%EqTC++ndr4{4l{eJU~4C zz`Fp*Rh*cGs|Nj;3-p7zp~*WTS}^YE2V4;P!5{Ra4OrSP6a5fGU<#oniqvP{RP2Q`o!%;63rcY+5(O zUdsaUz|uQ}cua{r81cxAcz|-Aco_DHc+7}+DD0w8FA$G_dvwebkJvQL_GSGH+)+zwAXwu^Y2 zeoY`Ak%-4EDQDjBR;Ozeyy@Eu*doh>#9>ZpM(UPe5YE1^c}xAPm&IEU0m} z1%dAVPpu?@iVSSs47T%R*_Qsa7O^^+#1TU&CvzZfhs9OK{gLvkzo!*&@~ zcX$RF$}jw$9HHu1D%yalokl8wrMPexE52CD1k_4g5+3fJKc)3Ag$$6i`ww2CMD5XJ zcjrDXR)ec+sMjyFdZ9KVyA@*wqyGjF)x}stwI7j&YCobCbEGaN>_;qP6{F^<7;rY+ zjlUhx-9cl0$!{f4fg69@K-vTIKD^pMyHEIb-(FQng92pOeiO6(##c!Enx~i@AN)`; z)<@;BkFl}IGXl-HswdS({a+D)t1>h`0CMjmELOSEcVX25$hduj>ZEB4)4N#RUUlh% zcyN|6+f^YAT6U380*?4)6$L}6wqi!zznsJsk3w}~BsGC6Og}9M7h&6>z$65u6p={Q zqO|y>a|z7Dr~?v_0Sm#c7!olq_G0dE$aBU`LKM)b@+s1X!KX;K!KVnIdpc^4De}37 zG3Zzq7(>@)WOW{aE#lKaZ132TH?HH$S}pfR)KSd}wo#SIgE+AR$m|!PjaC2r);&W5 z^^eB#r$tKjvhE}vIeuS0>4TlL{V?k~xy3^lD#x{p?j(KK(EP16T?(F^wQJ2sAjvHy zT}DJQ4~^PwQUOZqabl&jIyYj_Z8CHLJ)lyNg71kh&c?JWuf+`mWg}svBAf*&p9?<{ zwhc$4AonDp8ZL!saG;tH-d<~^^O zj*IV&(_)r;KwIqmh=;gkSQIL5du#mg#HnFQ$E_h)MKm1R(?(`Tla-}1c`fq9t4e3H zh+d^sg<)n+RPvQ#9);@Uo~sfpYUMcdiD#ZDfgZ~@gc2mX$bln%c$FrrZ`J%sy>od* zAFBBSDQV6h?9YDwkY0}*(wHB)R3qo-9x45i+aeNPig~o58xYwobfKO{)`cPSh|s3h zj3KCG|2E7c*5kt5fZ*BmFnaeb&7;_lNOK-xQEJX34k_^Si1d0i>Um_|5kuzD7Q6DT z&!grnQrutK9%=F%$&Gt0nZ`Ldc{=^cqa|MmKFm(sLEC4!a-yD6z-i^RstJ_J-m}RE zS}aNVK#Qj7z%;_?u_6tc%l(!UGaip?uf$?gSL70yj`KH zIth8GQPrdi+t|CVlNZN$FT9fwzYWdbTGKlf&9ml<=2=P&*{vSfRC(@hlpTWR+~8Jh zs(}|s2bHIAHBcAKc*O%YXS||)Mnd{sxj4q#pnV}QU!yBc#w(2QLLm*q5os9XJ&+v3 zlocIFj#|7pJ6B7Zrg2=^)v?wGj*FIy#k(zCV9HHBtsj@Yb>6Pi56sIz%sNEixO%m7 zu2(5l;Km81-uYaU3KLz~9-=}q0$;YPn(E9NHqMx|DNhi%eHTx;fJwGKaR< zm32(_BIZzY2KAY4bN+}EpCo8H*rMBd8hOFhrV$}pQ$uU`oh_`Sp!X(IDXg_@^@A{> z8X~MM!i4!t#n|YWIaS5+K*fzY&wo=cV`pMCaNgHHyv{7;2bh=`I4x07d!XSf@VXX;r5@ zONw`=#oqC3tn;M^`Kd;+vO3Uf>L%*2qO06XN#9Ug?&0Q-b#sE7U#C&GbG1fE3i17| zjUE1QU&_ahB;(45RZF9WGb_N`o*Qi;w=sAY1@xpk^T@TC{z3`o5TvK zo=l>cFgNlj8p?5G-g9=DdTw#I;v7M==7eF(p9- z{v^vXgDqwai&tY9rS!%KZ?t%WKZ(co2Fk6N#=C8cgciKHW4>Za!fvcY92#Z%LpD}% zoOL3|fN&aR9)Y`e-PMNM=PdYf+WoVIB!2IG;dGg?=Kh*dZ7H$9!8%=rwHgke^iuz% zKV621BH?tI$!dQM`#x4Ay<<-E4BYPd3ZvT{!>5U9(o?y2rJcNWn#+`;I{b&3kdJxKar^ zb{c!yKHbl2Ty%U8msxx*I5%aDSNE?KS1EgegvqtyYTZYhw-W_pyV`Y}3+=j@cG0z? zRLof|*FrCNS|X3jEpEji_w{0+M7%kS02<$q6?9=pD{wDZHdEagWS&av0#H!|E@z84z7<&Dg1F88q+ zh|8PYye@Bc3%YzC1JC7t=VXsa2s7m^Cgbk#n%kqpmhg0;4MLGVx?ZjI_}76U_g7x? zpxVXbCN>X`dtG;rf)}0#J0(oM-q3H-9b(BC>G<#(xbye8ajR?j_q$2$0-!T84ofj~ zyH_^v%szGI4m$JZOWm0}x7e8z)|s9=sLq7Og8%r*t-9}Dards}KfoS^u60S9nCQ|C zh!OKE8%L&4XKtl4_g(7FEN`(hx2ZG0K6O`!d8(N{W;nh*tL_I@+#A;NSGW|Su-!LN z`%9qv+nC)#G=xre0j;`MthgiAKeq%&puid5^T=JhvH>Am^!Ub0-Q$TZ_V}m`pSUXv zl~-U7WtA|3jT9JN!lYpZG+k!c;(?w{yIc5_WX^W7KGAn1wDo;=GoXcD@*M~JeU0#8 zX;yWORzn5Ln*xlE1DWr=)R4Kkh^#|3iy34g_(yUk)lF5G&N-adhWDT^FW(?WfM(OS zHU`f2{$1noEFi9q@ftz_bIr3?0oylTYS_Mdi&$40)?sIp8}C7|&Kkd1k%x-r9UMX= zu2kb+L*w6csT+U$78`$;HNK<9cc9^+@%w$_jrSZn2gSZh?SC!p|GrDz{=2u>{_nB& zkE{LT?)s|z2h{$Ckau8BA(h3MXZ4fmCj@@HUTf$Z$QawGWTij=h`3ZDU?Ra_Bn>Eh z@obiTY*kE?^D|j($fOmVac~|HFw5SEzvLU;>>W-qh|Tw6R$Ga$yTiS*O1Mr5V~xGV zUrv3jaz~5&&SE+oWk29uAq0e24?%C0;in{eu0^&hlk5jj|GQc{rGfU{e=ALww`5(PsSypDdP{3^l1RwBVR>AcGd07&$yeedjHGN}*=+W9>$AVN^#g9%c zXuhe`)ahCmN{a`+My00?6Dr?J@m!`c~)t*9@LV)k$|tf=XYR+ zIY*B{Uu}5q6=t-H8A|~xAC(@^zS9Ck%}FNH!CHne&$gE+`TJUVyP9 zB%wB`>SixcBBcW$g$X zwPoNtN|*T_I}Y6-5W@&@0i=#HI@)>LTJdg`Dwr3R*)I+t$gsw8`r@Z>z0r9Qa$-_W z?Bat_mu6a@)b17zRzOXK&GUNUZG2|4bMgKJkSx2{E6%Clgh^{Dx|u`m)h$+8HII_= zbH6SuX955`Qu$F7VcvY5L5-2l{?!a>wrvxq8QD+I6rlP&?5@@Z2NI?Vjnw>|^V$EG z?52}{sWU7X45FqVjBe#qKML$^4`#Mwf@5sR(8@kAf_`k{i0Mz`=rjh$=r4^vQH&|F z1Ei7RdBcPmoQ`UEXlGh>wU;C=@ib*TM#6ZE)Z;;U8V|>XskVJJuU>lx!#^=v7+c3q={2Xodgm+Vh7hD3-$r-e1#fs)C=2*It7 zi!n7V;)6%I!bMOQy)t~H3YdW4h0tn!WrmV>Guc%*Fe!;-PIbb+3RKG;R2F_-VYRad zqWbS6X*?=ZqYo2!z>_Cjpn*Iz$`E`}oQ+c{+bMqpjqmry(%^EAXa`>ZE z_VUO`C7;I}{I~P>^q`dJRG2~KfB9UCnFk8avfhBVp^V5fT0#jlS1=^YW0djcOEq(p zv;AOm#u~tOB|+6CLQspnhGoq{w!qP3upuCVT!KJttJzn-vSJqDfrV9yphm)i#-xLRo`RI z)x90RY|2ryBS;~>Oy3uaL!xt<*Y{+~jh#Jhtr8+YCTv!S;0Os4781Cphb_%M?Q#?Q z<0@FDK|ai`@w8b43Nihh?%M7gAm4a@gv+l7*fo>(o|D z&;wC~d6Nd6wElekx3o$S7CIWBnS|B1VFreX%B=Lt$4_TXbi3Wl(;!TY%hTXo)4+Vd zg>vlRhwwC~fn|k>(9f-=fzS05p`Tk#1E1?BLO*xQ(_nb3E@m2hAdN@D@?eS(4;?|d zf*y%;iKytOr4#4adVa4e4NESvk+iC;zUIIM%swz)J z%t~7{@;QjC`qpfaI(Q7;2(Pc2BEqLM09vPYi|Ba*F1=skFC)V4+3+|=BXQQZLo3;> z21zxDP@u}CYY!reT6wGG!w=#;9q~O|#+@QF+1=btDONMBP)SAreqY+j-4UJg^`-G- z^z>wigxFyyI$i*`%bb7G%9=PeQ2AC{Za=PL%qy@a=q)fBw z$`WAqtAq;*W+izO6C_Nl4p3NJg1ySYmR^aM{Gp=t?$DmO6Q^*heoYibzv4!p(Utz$ z<$?Kpo@U_uER5mD1whxTDNw0F8pLt6%xgom>Hz$0!5WwSE?A^8@B%Aa#LP%oXyUQW za+^6w<0+pkC-6sKwe?h=vmqjEFP*%HEiGbmdDq_2u059=KuBOyrGRAKD0r4_GmjPX z_9|wdauWy8kL{IK{mS;nD?6Tgy12qhe4AJpPpG&*JZZQ88wd-gib@z z)?iXL79BtTB#txHZ64}_>fPjZDy{q(^R%)Vgs2qun=v<~Z{YohS|z!f&)BEfFBCy9x6uXyEQ+WW^smYA23%Jazl*C~SrngbhyNkWsXh zu7mF-7Xt;)bAMs0_3+6jMBPc4NuhZtMtZvkX@Hb0E&wl=W& z6VEFr#1OTsvC}Cy^7`Ud^tn0m(g;OwV@V+_wp&-E2Nt0#QVf}9G^su>71f~M6+yV! z745_5cO}(#O6hlHi?+hbB{X!Up^gMc-bPojDx$bZWTbbpN6Z?k@OkzGr0sh5yzR@EN+SYbDvS4`9Ob+0P2C?IiMPqJZT&JS zEz`0rk8Mdgb9lIL$rKiVeqy@P<3f>oZIXK^3bPi!7VhOC$3{jojU4iexPGHPLkSEoz!2~IO`f3sa^j${uaO?F7}qHbZs0^GHM z(r*RhBvbILM7m%zKJ1K9Aaj-LGT&+kCHmofp|uQrDzZ?W#wiW z+-2BWbfqfZP`yw`FO5T z`BzKXPtatm5=b=LCF6D)Ecg`Yt)}+H&&IZywS4wQJ{D?&+%cwOG!kzSRdFqj$FO2q zl>p)3wlu3{lik{-udN_`P61RQfHD~iCRCinNCzn%uB($HQ5?sS`cnS5eG@j)X8)_^ zldK#D><{+hNhxhQ^mANJomMQP5@Fw9`bN+T4Ngm>#JD4CgdA=z>aM0mw7pFG4xB>Gc4J@mg2vP2ZM6SM-6XZ`BnYt`fRp=dAdpM{cco72^$E zX^2C?+13{q-j%h{k3hrU7IJbIc->|Xt`=pi?Oc4gG1eNqbAO^ew+ZbNzk}z(6C)Ns zV7y#YyN*uB(ak)=r?DcQ>kYQ~NG5~LR7dETx8-?@7P*ON>p0s76qDVpWM9UFpmCU# zW3WU=MNUrS6+H=xd6tQadxzX-=#xHo3>m`!3Ovh@Ba*+7vA(AYTsbx z)V{%bsC|R=Q2Pe!q4o{dL+u-!$o4Otm&Jd-OFzi2Y5ZU=)d8S#4wcPaCr9*Cws}mjWdJ0`Va@QT9=1u#WCLLL zn4Jwc!#ogHVeZw7kV@DValA;D6bhRA!=WM`%RN=LzP7ygD*;xWCB)SUiuBZBd z#lUL4=*KXVhhMGE&miSB zGeGD>UQ12$kOU=TyEKC;Vr*)$vBGdO3_mzlw3W+2T#YSD#h27Dn@y)b4FKC1Bg z(ldjvcQ-W?p(D}Y+Dzol7$_K1QuZbW%|zH0=gH`si6-Q2inRwb5xN-`<0(`4^)*(C z$pjUwVWmhaE5($&qS5wpOJT07)~1;V4X?6N=r$N!xHaHzZYG*EGm$SXyxKPtp-Zx} z+003F4u?-`@fcQ&fmSQRS+msy>Gigiy499KtG!*PZ(BLHnP}3CTV74h2aH=G!kI75 znvDXi7mXRnWaR^2W7|9J%@gM{6Uk6^UNaE|dtHI91Up^r!lx4>-tYQD%8Ej~a@T)ZP$M6fql z3$SbT2G}Lj90rjA3(>hsJqHWW>e$49acFE6TM4Ev+SW7j%4G=zEuo}?BYY9!oC0!uc zh6DxYBdXa-_7j8{fvy^Hevd5@Ygq@65&hVniq_v}mmbT*ZSCTc^l7WhDngz? zWkiU41@X3r7?H?tdEo%u?O&9@Ch>x9|I$xB zhX)BSXw5$?ho~J?q^&I8f5Uu_`UPs|loc30Q|J*ZS4C|sgSB-W<;HK1!hi4Rj)|JY zC%Zq_;Ve^@(O+U2UCz%ey&Q^1sR zS}rm>E@6ZLmn@RX9pYGN=J{0Buv-akRVdYDEMKc%1!ixa@iTtD$$#ld7ugn7wk_Qv z(xlQ6&F!!o6N0^TCO-sax={7~jjG+ys@;WDz0X(8&b!U4ZilMxYgEmOw0$|)>$b1D z1{31TIH6PjD{B6qA~YFDt97=4zjv-b6~ z^rp5qBiM6yi)|CvH&odiLF7X=if$Z5P?Z>N8bw<>SARzOqbTQhp2H}P*eEjO1EYw< z$7JWN#wg|;U-#xiX!VZy{cyM+sNTvC5$w_A;wRKQR@FN&grVL_wl_H9WsPsU0CAr| z$j&}yM>WKNqtu}w>TL*quJN)MT$_;{{GKP3={U7Y%Q9{kdlJv4Rzl2jFF# zLoFomYo-~JcbU;6(rGh?rN{h>QyC63Z<-D#+r`2uHX{%Gb zB2&*byXhnDQSv<*HDduAhU?NyJCD|Ao*eRckCo-e+BFGkEa9D`#-euMB4;@q;Wh9E{ZXB0WUFCMl`-v6KsZlzzmj-w-es!Mi0X%9C$s~C9Ut(owEPc0 z^M#*@wTU}5zT$jlBCij^+_}-$&6i)$E2zX=z7V~3zVPl{_Td}Mi=?*(2NI`Y(+GMQ zZfVuF5l=+rlN~ly$L4Sb2or5EftRFkJMZiXLkjKV*mp*Q9LPOT=W@RCXr3u$bY7LI zui}>4t?D~1JCi)9(L8jDTuS*^Q&zzgp$Jjc!ZuOhBXyQAm%c=JrtO@K{5-V6L#b9A zj%~m$5v%^{Xgty2QcRnu<|#)i>PpK3Pk~?_@ziyM(FyVWHCq)dl%GHqMyuI+)Kk|Z zO~S5M`?Hl}sMwWVv9YH_+NUbxuNxGY$ z_frh$xe7;k#Dx_qC>UWfTq)QCq{*iq=zMjCQ#0g#JCNSvK%iKyK0ha&L7A(G*~0p) zBX!o%eip-TBo4HA|CqO#2bu7EvyBFY*(L^A@iS)IFy0Rh**M!q?bZHl8$HKtGcSFc zZF0!pqR==n+l(FiVNjKRw&DD}Znhy>G-lg*M2lgwt&%J1*`{r8^0(V;wuM<_6U)zC zW?C^0rm;ZkQ~h+q>SYE$;j|rFcQVhwTMp;KeXPdm5pbF}VZ-D>sw<4e|IAGd;IuNE zI6VQi=)W->r*ZkGI+Y3K%7ERuY7k=Es~tg{8^h_txp`i{@XI_;5_K2la&rmuGS9o0^GPlN&+DU|v8y3G z@0>Wj1)kTh;WE!-uiZNP)A=ON9ugO`q5RaJ#w*>IQg%~enpAMLmUM4ZVQ*&n)9zX~ z$9JRTNuX+>zEsnvB`rAUglw;?l_!%@jrBLARCX{8l~O6fq*N6w{mC@czLaVrBel+{ z)mj?SR#(Oy12FLz1-ZQ@S=rEMA2`^rrDTPRfzj%7$0!)i$;> zvrA%v(vJL?qiaJQe8Kd@ZaB0U3)5nI{u{5`n^+mv*E#qK#)Yb3?Dy(7jIZxT^|CFH zvQjXEX!9?Bg?NbNA4GT2;y;Y;I!V)`@`bOM_a z#;Zr6Qa+_C&%dB+ha)O)Og^q#Bcz=hle2n2`T1B#w2wcc2MFwQu@BkB8Q0jF*u+eM z9ALwP4y!@I8^LXc(O6|b_C9j5;7E@rtUM)_ItGN(JswvIAHIhRFZ>`EQrXU>QXcYo z@9=qV_jzyedH4IgdwkvrpLe^@lLd-0kNUhLK5xnADZ*Y0eHsnWFp(Y9<}gEhThMnl zz4=gdE*M!%yBvemn`3*Lcm8( zFYT!8oeI&>;*1O~3!IU`WtK2GTzWZ?=k+B~O!VayAOJ<+y~uaKmBcn?I*W!xnV_>w zSSuP-#&>OnGftTgpA~}cU=Xh0T_wDz1RCQOLc$l7KqK9JNcfx*#`mY6jTHuIobWa+ zw>#v0KIFYf-W+*!mE$0M$zKY2UnI|w2Q)Zm!{>cQc{*2kXGnMGm-V+=}GV;oSjM#llvc?|5{8an>TdC@VTFP38{f1C9$g>En=K;RR>AGb8& z#FQUSLEW|_LVl*q@vKG=ayA>JNd{@s>Q;toQC zKdURe;WN5=-tdBM8CeJrJVX!hhEIh=;|;%{2YAEB*@3HR+2jo$Q65zN*<>hhc+Sde z@`ev91v>t?t}utkbfsnQ*Oh|Kg#5qIR3QIrx|07@UCI9wUHRVT75O$%$+tO3zRhIv zZElfoQ;K|0&%TE{GI@+w&|)a9J%~c$i{MEfE|qTlw#S4%@l8beW!|GiXqlS1sJO1< z=BJojuV*Eq_7pC}0Jboel@f7T++<51E6#|0r=ZT9p2c^Xd^Aj{ zV*BNbRwK&I8ATQj38E7nt#EW#vfpQ<&rK$LueY%SO~U z+L`@UzfYTgE)~Z<>oz_+7x&xPwm-Ruw*AL`+cy7vW83&_=nRGE`WXrr^>P5rS~9@M zpzwhtWT;h(9esQ`A9O`XTG^j(jl}z6H;1~%8V#Ba6$LX`=Yo0z6*h<0#!@$fSLIE0 zPN{fBt!4{+rDBUHOIv|w8q>e9&v^AxUmz2q*65oT9rn>p zG$SD{E|tdN31j_2TVhWC1xS#cFxsnM$Od2FD0PAnQc3;7oEMZTj* zfPwOG+}V&fTIbDd$Q!HkcKb>pT*j|9R*KCs^lM|Ky$yN&N@q9Z^($TQm5v6Heq*Jh z^~XSaT~8-BC5OJTVvgN(Kw`EsR=}tF zl7ks5Bz(zOVM3UhCoY+>;<0Yrt77_%DyCog7iW8{8camlSq^`~zY^d37q2aURfop- zr~f@F#$^>Tj z@*n%RsR_&ZFMP#25ZXDu>1*}1lpo0}{R(9@LNo~n&v5?E*&8KAa^6aKhc$waT}M;1 zmF%x&Jn#ju0fol?{B8pOi96Saxr=TS7WwpbMqKCun=n_ z+t0&_z^1Dz7=BQb%ux`xDk2rjFEXGrUcenO8F^-wpZf~Lwa55ka4;c8stB<)5zkl- z1a|FdR%pAn@RByyR}50NYQk$seN~ZGmaRsFZ+TH`BWVsSWLyqyzXN|R3ufsDh`5wM zUsLb1x(I08GiKRe*%qDV5Qd?mLofXlh#O)1E}seG7#kW49pGW99{o~!cXztJu~`{|BNtf>42p1%Gs ztEW%#^eM|LKl7Vy3~f>Q%fHEv8{K^7d4=<3_UlfikQinf_zXUQHJDcQqnNPe*M0^q z#fB)m4_{w95v}~%*`77hkWmHHWQE3_`3>P*p^af+=tGo;*jau!N5JISX3S{RE#JSj z*B;y2YmbN5!rJMkwLa|$8*@tp(A?}Hf7x%1mrpL0S7tvnQhv>*%=D!4Mw2OT>pu25+!BjLs)9Y>(AVLtbwU4CyoAGXUr%f15!af$qAs|ZhvPMQ*VTF0iiTC%*WsEU`%3$IS~JgA zy00#{ndd7#TIUfTdRV1>9j^JYue7hHHS>I>SJwqM^L(W@)_G>s+X&vi7T)~WS8Dn- z$zjw2=zXP&b-~T=e5J?gJl5}r^|Y^hH$V23ntr`Wr3dPQo8S3LkJovL&~0N+`?`1Y zV_&K1*PB$jR2SU*&R2R%oyV!CK{+45-oEZ_AN#pw(LN5x(yuqnJ4Iy&Lk|tj^Oe4u zykLO&mL{(a{kbM@nBALC-adjP7e0B1BZ2S!@QLla-$#&(n7qT0z*jnaV*5(_2x61h z7FGuadfnt580g_h;457>vBP)1QZvAOE{QuvrHQ8UFfyXZvF^0dAhkPf@L?5*G(Vo1%S&n7rb$LeaNyE6i zA+JyAS$`V%juZQuRTBPwAp3B9Z#^4WS6!F)_BxL^DC_bbQXZXxJ(X?kMCkr$JHA%h z#|!uhb#S7AduvgeOHYf^YXrUKd>jHKJ#68zY)@7`ZL$IW3F7tmC+Kbb6S!pfCvcg? zKY_~}ZV6l#a7&oPpiY!1g6X1B78BHhlL8l=<-?_olLD6>P6}M)q`+l1-=oW1zE_{y zhm;oOPKCDeT$grU=+eut)FsRJ=`x#NrORA?wJro{@@sX;@+Dnn^Mks~<%e`x$PcT~R?aRUeeeoX7HqQ_`xR9Mk^7ZDsY^S* zPM2POy)K!yps7GmRs|l_Fj1zo47E_V`3iKV3N)O(Iz3X$Hzc*!2q@EXdz8d-wURi_0tJf$ z(n-SHucYhOhz*91hmy|vr0dq$poN!*l0N2>Cf7h2oI8}n^0q#lS_6IX=}^*hN}6*w zvB)~=UZJL9uT|?<+19%|6?sPs;`X#-1)Rf$%0F#qNrI;*{L}0T%e1x48n36TeAS=#Py2k; zFZ!n|ebxBW=*_}c{aOE%`>I*HSDy1#zo4g1`2y0smbwX6b%vE-Qz@hD*HT`L_NSl1 zV}^d){l~edpLYK-?&+7^Kgaz`;r?0fX{@C`!99($`^UJaF?P@DfBFLVs@f%G#DdkA zM)a6yjpXO1FU~Ea>9WVtr8zTvR@ZOMEu&#N$N2m)nmfc*4|HZu&=YSu$4vrk#&i%& z=jNM%h6V1L2^%~$)A{4N@-nz-W^b_4jN0I%y$9g!Jy6Zw1NipdfX@c4dMUhTz8jRs z0N8uriIvA7Sa}S9l?NVJc?^QR_g&z_k^Od(&QN#OlAnr+*PL&5sC z{Z7Aan}5EsZG4stTV?pR_-|mzclk*<exp;z9Aa&AX=cEwqxUj9bv!rX zH)Cb1#aPgdklDwOo|2Xve{>g(-xML@9E@g>>bY#s(Xh0BJu5})cr?R>gKaVr$A}w$ zlOkqt7meH$UBMj@O_#WgYrWg}ol1>Esk-wuVHK9Tz-4<*;0C9?TE2X(vrzsKD^=wm zvpbdlD(+~(JzQwd30sn&b;RAQ%TGf2$)R|bf>{CD!Agade;)-W$D{96H8;oiTB$1k ze!EloZ{?0R*0`_(>z%}B_yC%;&gQiyJ)|!cu$8Cd(c>0m=Xmtr`SO0yXP)wxA64d= zY}bdCdDfB+MklmUL@QuY-b^Ip zcE64_M(VQL>?S$Y+HLzLxz3}c9gmRRxR%jf$m9FgSTTD)hI4h|w=g&>kC>|RyI;UK zv07pYTRo`*+efm0N!T1N&oeL*tg|24rPJXviPXQLfIQj*!*)SXG+9=oIOj`Na_-v2 zc(9kVw5z+e8)vOZSrH}?j3?-hH*x?Dhg)fH|CkW*J}!uw_j-Ksu~@)877$yYIM`#~ z+~Z$9!G%w6=R!0bZ%+Y(OlH#&ecVvNEk64gmyR%(Lgel-X6md^-|iTaCGMo4%XQf9 zNZZF9!$K`YnsuXsbgEg%UGFBQ85oVhgdf7WjA@%4zid|-lbf-k&Srl(rxnYw@?(EQ zt%|H*v1q~euz_VX`wNaQ9Rr90>F*^8CzjgAqQBKZ6(A9-4YpYg+qPg!miA7Kxt^zT z6XykU_JLgu7^4gFaTCBlY$)pi{8_om1)Oc~<6R*Zjt6GxC_un_gr*``oK7Otg6;{m zz`Hgy%44G5yT#{lB9mS}$^{e*_81}qntev^E%}^9|K2_>xaK=IdMMt(iG5sVQT)I# zp*I)JjMkwT^^i(=&Wcf{48;jZRu$d?njvj2G!O>mpdOlBBhS0kpBWBb!kF8X4^8bc zBVY|Zh_8L|7W7B@y{ai^ox9Hx5)$qOC)+~jw$QmP9BwQ4Aiu)wcJ{~P0<^V8_0v7o zPixlI&&a+k_5Ts4iMPX4`E=TMUC>C5!KI3ERvs}i9E>K|pB3MU9U{4NK3BjrL15ZO znc=okw?)PXuo#f+23%$|Um$NxXrJVrNKPs+V~`FrNVYqw4S>xWhtjK$ z0EreuXLUIq6}sFUJJ;4Bl^Q&avL8(iyS6J^8q+{99X%Xl`d;vN*rWFdlq~`&DF#b) z*YW6`+%fQP=VH{8Cr4N2Z%p1nQulcDAeU)zMjKrX@|1meFLyZBo!~O*F?&LWNItxW zr0jU~CN49_Bk;kKQ^wgo6pouIfmem-Mn0``ujXmn&9UY}Ky{FNksf=bF-*cPtsaxO zxRO1-i!0ltAa#FsIN9s>P%f_!dvIC*052y+x8fv;*scdZCn{gbtb15LWpp+&0z%|J6jxZ2OhVxm?O#rM9s1s9i#9$N1%l0Rdu#@6qx07Sp3l7F3v=PmmI<=B>tS5Jq z+%4GM1b0{19TC>CEGxIm-Cn!vaOdo9oI6Dh!^Fc~Zg*qc6?Qku-IaDX!reZ*BeYU2S&>ch}fm%-tgGoS>cb1M8g`d3#RF^ltZ31okUF;lst`3J+LEK|?HOZqa8E zIOvpRV6LvRuBo!9M&C5DuCB6Z%et(qsw^73E^A+vMX%OnU0G$(^>tZAl?8m(W#v^C zKwOvAt+Ighx-3^^F&yi%_EuSp*}AMfRTcxgF6)Xai_u?~wNPb&BI~l|t1R#+WNAoz zaI(@L;kQ%P60lCID4154S7A+wE{U5%HY?`bh;2$^Mlwr%M=1#R8Z}KcNs@QM)@%GpI@wB@(anp~`3ijDy8|N@Y z=|_o9tbUYKzp*aSmO7s5jdhSrH>>q9wWF#Z=OgOZH=45R>Q9E(-xgb<{&uJzO16di zhXKXySl=Ef*tZWJvu^wP`dMcC_QFF0#7<7+ZlMM-Tg(-+m=w(bKeWccI?V9#nb>rE zuoatJs&07oAzbfu3bReLy| z^kTp=6dZoqoC6-cKAKeZv-3Uj`}(xdTD+&RBNEWud-nP4Kw1QT8+5aW83M9*s`jMvz&-|H`tgsATu zn_=P!)q3&7_}nF}wjEf?y53jSdMV`PsMZS{n^fzC4`ZkFwml5ULvhZ4yeR`i&qFx$ z0<6wkVmV^grIJ}?U`Wk({(=<04XWOqxkLJGRq9?tiNjJ76gVfX)Qj0j&U*0TIF>0r zc(EN@fF8VfFGnLDyc!^PBObiEAg3c9yjp=7K@VR2kRK8cUQLk-$%9vC@IumqS9{PN z_2AVb6i7XIH3}V44_@6ujnsoz%g`k8wUAgwnzV%ig;Gj`ZOB7dBYFnU@fw~h3Js(b z)X=3UX{Ml}E=6fG1@(0)YBf_(ZI_~vX38$5j5bp^JI;iDn8R?U$m-W(tpkeSDz`x08}(n3_w>lQw%`+nkfdL ztC}eWpsSlH2B2%2DF&d$W{Lr5e>24ZbfB4H0J^rBVgOodrWk+@Hd72hhngt{puboDHii4r zI|iWRYdEYGJA8@(=;k#zPO;sm7=UhBL#-%geTo6-RcqqP*b7yT0qE6hxVkB9m{JTt zx31x4qUT_VXv+ivl@&SfCdBE9zh2W}y~fsx%}+T}sNq$@*%6BjPj&gv z%VWJ)j?ZeRO1rf4jfj5B-5uy@iDXqPy}Mf%`4^D)$PqTE>{t$88P4 z+)uk0NyioVegc|AdVOG_Vh`HF*0>JOz~pVw2*(i}^#P5Vk@Tmrj5+xep{}|O$NG?J zNnJbEM|BcGoR}>{8VY9shofqJap7IxIK9|7s+RLq-Ry(KjMjHpraBm1RrNZ0t@S#& z-MZD$`K`;mBJdR3Sk)m}{Q{DJ8~1X9qJfZQz@ECTBa#K^GUbGvs>?lfS&@6_E=ABn zm)&LOGMK|UrE|279o>N&K4L9SKALjV3gVV>DypZR`9#-ppmXHt43#R!e~pIEL8trT6k>yGXgN(5RPeM3T{ft6b##PqR6VL-I$A?cy|casnD%q*Yhv^PQ_ig7 z;|ivutn>w#0=gQeRHSoThr!fZ#zJ%5vH_UdhXXK0hX^ZXnV*D`idgew#mq$ql7(Xl zfgW||juD}C8El@pizrC5cb#J9#3y7;K5^=lKT;R8KXFPYF$& z2y2kNwHT)XO2PKrcp{9R%4(!&m7EpMMvB&amsk4gOT-Eb9k{ zm+YV5nb0nYtU$xYr&v_h{tRMZ>O!?z`t{4gG?G0sEWFy{GTu4TXlw@u7%S1s?pulp zC^rG~zG19bgElW4iECPBreH?k&g0QO9;nPeTqXa$>YwW5K=0Mbv8dH*C9RmlTkPGo zcJW(nbVm+^wzL%DUAH%hcg?Es<91@2fmlKNSizU6rwV#aBU%tBYg)gChc2XohlLF` zL_^A_$3#GskRl;yGNP80*6 zjdH`DNS!7lph*(rN9!$|xtLf~at8EvU%~RK%BOqs(9)}l!oZOF?lM8BMKeV%0-T-p z!*TY^E{|QyK72TMcKbm1a3Nlu^_KNn57k)@_p^ko#1iJDHVY{Ec&seUC7f5ta*Apd zu7aV$UJz5*&XbUsr^k5;c>IKJ<^5$bitQHnhi5}7E><|&d3^POjr-_&Rv9(EJ|CU} zY$@&`58If&hl9Wb+eolocb+8(IRsx~dso06#77%Dq0EJpKLk1Y0H7&_9W#XdTo2V|h*l1IlyL-&A=g07*X#e@kYF`(ok&Tm4=BzrpG z<6@0jOMT3`I8-$1+rnXs`jxqzB$%yU8$h@fE=gwYU<&fvajJ}icr zjCUXA0gbd|etwt?qLBfGNfCfzXe0{Gc=yW>Xq0ZL{6RFb^6_j6Iu1UJzI@x*-BT|oyFv`;uL^L!ww_9^>k#prNW=Zx9%_(NiJ?4~%)h}9#URNL3xoih^ zE=9N2DMv%f^>xakrKn^VO?9L0e@b+$ww#8K*tsoDagMr;iLp_Abux{T7?w=}9cyK8 zDIg;eyRmi75BgD>qFpiF*{;hgE$L>g$3-V5BxkVo91g7`PFcCZarG`!&*VNfqTXfG zNz@xTciAdb`q9HH>_sTXZ;Re&C96sl{#T!;aO6-yJl8?ocJ^sh{<9Y(WXBAGB#{vg z+_pFDL<$o#*jHWtgi%9^a9{$i3-Rkz6Yb(n~|AX<#_gH3F$CO$?dK3(;ud1 z?2jw|&u6)T4wXL&!y@ii`RhLx`uy={t3H>6t)f4+IY&cUFsKpk{V`7Vx5ar!eMOSz z5KgtVQv8*}SQ{iFDXHUC3ZvfvkFnV>qJ{=5N0aDLjXhFm{~iNKosL~Z_j0Kf8$gSZ znu#8T{)ywVFVafmy_SCug*`&EMjsos_hO>@SaXCQ7-?u7=BveIUlDnT;r)s}cU%1Z zR$%v|e2x^E6(eLbnOwYbFv2=?n3lH6!-UfY4(yKLsAC2JRdC=Plo-CeV**~P=pGwB z(Vmg+ZSi{ws{CHHkLG~a0TV_z|Kp*k``f)_@^tUL%s8o)7C24%liE_MZ)Z^_zfUKj zvebB5=ebtnUjE2GVjQ*q+;(9w*>jh0Izx*Nf0+pniZ8V@eMW0?$a3_KZ@K5(9d)e1cu)qvdmq{BuOgTjZP-TEq2ena%7I6eIiO4Av?) z&Yqbvc?8{e96!4;#*vLe6p>~h zxe;Zrhfr<(Cr{E#_GOhXay`n`dV8emtvvljK`Vq)hsSJqR4n#&)b$BW4=n!kclUgm zyc^d)dQir%o6qiNbsXv-Ll_b3_=m|h&#GbNa1vSF(tIRkrfQJQQy#A3JI~hS>3E3nmCa8U{_mPdjTG3Vnif!P7tM1qtuycxJsfZYh;-3R(Yz{lXhucF&Zlf<;UuhC zR_uD}>0-B)_%>=`_Z7>0)`4|JXr2}Gnp#n@@RUul;tHE?#U6^-+b_bbbo$xh<{y~1 zISP1ox`nsu;VFCZ#~1<3syegC&ABVWYXHkQklW?s=M2}Bz zOU6&f?}522!-^3SQ~Z>rx$EZz7(Baw+J=B8?9^ z8gYn(u5cwMv5OzWea^wE&cibuZ3LM{mZu1qfx3ECsy+>2n-W^5PT*r|w>;k#)j{qE z#w{okC;Rm4(b^#FGt|?nEL^jin?s90I746qj#30XTt*X7d*Uy+Q%ULfaCGa=dLg?0fF!(${HX|%8181Sm}hLwgv zzKm0Uqj75KJUBIwzg3)SesnQ7gOebintrZCWi z8box+9xk&-yvNW<#EYn$z^t$5Z$u}(?EZ~Nc701bGj>XIh5Hx2`AzaI@r4xKR#Lk? zeI{M`G-BqNPd)j|-BXgg)he_{g*!HvG=^y?1MD-#K?bP$yy*r7%nWI3lA5h-ErBXIO!%Tc9-}RY%`w%AA+Em)(aAf z%!Z-t8Oz>@z_ODF@KX=s{+mg(9@m@pEgr>k%0P17Hec*gxnnYqv=Eui2Sf{QDrviw zgu3R4C7_qrel>>gb37=b^ffgB*O%0-9bR(?>I$$r2^8-LVhrec1zE{pj!dZkDB#aVrws^snSW>h7Ghg2g;ibi{_ zxX%3CN#tD;H7;w!WL$9Bs&-7O-D~+#w~y)K@nbJ{rxc6vP&`vOP2&mYG}jl*&m(7- zzw4~vg}zs>bc)@O2e&{{5WM9xyWw@+L_y? zcprpTB<$i!ev8|dcSu&~M_gMEt`>`{Zs&t}0?eTY_c-4Gyz!4|^S~^+08pJ{iM~aT`U2Mh#5n&3)k>U(vGIHC^N`W8+xp_!pGAuD&pBOx6P-!X} z=G~Bn)D*C?;Uu%0R__PhXxI%h&)q_+@%dg{an}LZTM^<%+!A+E2Cn2KM&X2erMuD{ zqU)@ z*z&KpdOnHZs*xG_$+zO8u6P&HQ<3QSy^RHm2p4N8-&N%j2ZXj^p)RzlEDw^y{= zO}iVFwo7Td+_Km6ne^H=f29(ybo+cFmK7n=e*ZM(u7xBd%gh{^9)W%2z&cu#Pyy^P z^&9WG$Y=$~N?vkZAX5O-w2ba9#^>`9tnH5iXyPWUIS_S5SjRghyyanj#^)8r6srth z$tE>^)}?13mD(yXfPwW)PN$rbQIxKHv|E$|u9&5^R@WP=yFg|Jr)+n%y9R)dJmN5L zkKcCMjfB7lc#WjkvVi>Fcdy*7rJ2-S1Dfc1_1*KbF$uD`w_R%h4A7kNU@6GT3ovWD z=*X*#teU|L%bb5>yF03^d6fYj^@%&mGh%k#|79w<#V?D9)g6NUY1tn`6Jmt90AOt@ z;XQNn#a_V#hj!)TS+0EUjWbOdXWDiGJJ=2pN3#sgDG>s`!%9-JPnq$|Z9*wVaV!2d zJzrd-PY#QhD32GWt&k%?0BRhI8c)p^i+anE#tX4BNSjsKcGA==Wss&FW<&siZnpB9 zjihRej(EZ?BLDmHd0kw-UzY{A0GGM^fG)H7t8`h)b6pmJFyGDOSL%}F*Xh#BU#&|g z-^Z-o=0@i8T}VDV)EqYQU421eqdyzS{ zMhcB~9rjC&=U1r(h!bl*qa*97nEWnxl{lD2(rJj-id&tAa4lbULJXlM4<*xS#2Bv1 zSj%rKV>hpdtQuLO#b{@}smWt3mbA5u;} z%XP+h@l3Iu7{$d5Tt9O&cNg>X#c{WNwUEF8C(fX<)6mO;?N$`zGLQ{ZnA~E)2v)eL zRaUZ^6PwyPmM*ib5jg^}%UU(+t`H|CMVxqJBAj?*V!A#tAP(fDVkEIgoQ*XF)Irkc ztQ|w0SGw_H(jv9E*N9~*5IFm&*jalk;JpT6XVR72jnShnt-n&^ewXXITh@wr)$Mzb z-fyQz+v)$+5dA6*p6rf8Vi!Fpz6Q8o$LsFuwH3$4DMZl;$o2Ns&_T@-YFKb%c}y*@ za(l4xRh;-BSe>e7xCNPjTc~=##r=2OLC=&eujTUyu53D!&yz<1;b)j{-X4g(wwgY- z)9-T?D#a+TCMf4|>v0bg6>7iWoN@hDV6>4KN5rauZi~qe6jLPQkFnq~xA6vYevHD%4@D$7nZ>1d(vT z+A>h#iFNIY&r;6*JLiWrgF1${fltoc1ePojidXV$9kX^-QbJf)W|Qa)w&T6 z@wU579k@z~SGiq2@p{JmdaXqqs@QZlIefaMR7_dcNn+c$pn{1I`bg>&ook7%JB?$o{^R#0sOa^Q@J>=sd`ff{uyw$%qI@3M~+V%OnU99Y~I% zNpLv=b2DM$AU^fHpQx-^j*3$wx9K6#;F6;8T`LZes1eY+Bx)qqkeHx9gazZFK%;~0 zq2@~G+~al5J%a6SCs`LMXHIz?@ru==z2=3P43SS|8JoKvIn`Dyh{wg;LgFcot`s-e zvh_-SqiBpq2nK4ZFTwH!AaRZS7()d25g!Leq@WB^tXLXe9tXH95o>q3!%*4dZrZkY zUk@E;8|SsF#Z{|rhdAO@Vvj`f=OK~cDl1wogjDVrNN2 zn9+wpu@jA8QcQt8V18o-Y_|dw(vD%3>1BPxG|@NpG-2C;x)s>PoTwJu;X0-H$X4!E zo|2(l0#AowW2MO5l|C`i6GP#jW?;Ft@TdJHL9ugoOQW!Q2#H2j$f#^3_+c0w5N5K) z8-yi$5`n?_&>?$F|<3>Iwygp=e-PD9iAM(_7CtOQ(I(rax#f)60UD>xNJm%YlLK)~ZTZf0} zXWm-2gOYYIe>7)yP!wduLYewz>^7xhJkaT0O{XUk%z&jS6?A&F7!fTI@g}jR(_^C3 zBO*5JPs=4p&QbPeO2vfHX(EIQy^upB8~V*+Qx%=Ij~PF|D-4r@UIY(UizyovHiwCT z(`eU4Fze(y)Pl^hf4`#)ZQtlrIp5s(zI{KNkJ;gG4WYdb^xQ-YH=mHmWc9| zBFdOKd5B?ffhZR)atK6lIMfRL1-qfl)3QHec;Me2GYZBuN1}KNEzI|VLLFMqX88_p z@pq!QaUL0nKHX%~-|ZDRCMXEA3zM|gR`v>75rt1fA2Mq<#9>C-3MtZ7HYTF2Y)nL3 z8B7cq*{~aijh`E93OI?SyfS<5repg&dpRifas#a<=ERjNXkrH2V=y{wJN}_dzZ`uK zzee+OZogR%uaNanfRgoa7M=#%ur%n1479~7J(D>G+z+opbgzKP*cgjMBWOy=@tx8< zq>`(d3=>o|CGLCN^>TDr&tAsN7YH^uLDthxiY{7G%O|yzge#ujYWt+Nl2~Ih=OLfe zQxf4~#a@Wvql?6UrgUU8b(dUesD4;we*VkaW8VNt|4m?0L1Eb`B8v)ry?Q9l16;g@ z;_$+f)em;DQaG1;YMkncp|Gb!^2kj=iOFEeSVhqGK~!4Ht!#Xe%m4z>q~VVVEkFd7 z`eyogGo0f%MqvIt@6cOx@RY=v;qL%6>2WO7Kq{E6#O$n)MA~m%&*mk_<_AFVij!W~&@Vq>JnVfwizR6wW_zaP;WF#p+%tJ4W1!Z?PAZkJ z8qhn%$qbm{49s$L4zSkuhO%~!Z-iCvw2hmA5_n`Fo4}GM3>?G59?>qfA<`QFlX7CE zOJnGa?Eb(^D+17KJHLvuKhTbMDylZl@#YMz&PRCpj=UZKBP`O$WVvKNFPz#F=UzF6 z>v_pp$gAa;Al@r~@T6H`M$0+*gdtvuix(p>FM$!WqQKsN0OtJ%0N#Jdnh&$hhq>m% zLiHdq1_0mz#<9%?Y6Y$r(V+o2iK}F+HyRgW)N4SzgL^Mz6L^vSvJrui#vu_GSbqJ2 zzJxJko<1BRgTn~t-FY~4JRBe=z+xo8qSJ>3fRH~ffKW^_0YW%Y140iqAoNfJLJu_{ z^iTsr4>ch4aDG5=Xar5L28cMV2LvO03ch2$u_lfR&9$Z~P>gs`fNyxG&J|PML4x}Q z2njfjBLFi8GOP)s={j0ErSir;Qn@VR520%dvTVMt?7^q#V$1|!R*6i(6Qni2kfn6^ zx3k#59AMYnv&?=o&CXoPLsb z`C8(;3WfTK+F{b)P*6NrP_vA}iXBpnSQG8Spd;UN9RnbiD4DRtxvpOYU7_+azGp(U z$X^hXoc1B8_iHo??|8|f@FJ_%TE3xHYdKX~bqHQo9bO8)si{7)Dxb73)q=WOQLJWt z6}bGT9#TW=(>XLi56#BL$yi1ApW4_x8q&5rcDD^3xKzmQIOip*8pBpl*M84t12lwP1GY((Lxzl&_J@qm zteNK?tgUp;MrPPx{d5|SqP1uCKN^X4m)iH z=@IYaDS;x`GzBxnW9xPz{er!80;fu;hRT;>L*)yA!kGhQbErZY!geMYY77(1iqjUv z<|LzhPcN$3r8x-h^s${&v~6B8yHu&Qc}SJjP+47?U8<)sRD5d9JjYO>7i^_-n-0~# z9%q|Rs$JX9NnpcwMk^>-vrxc{Ku8}W#-ey4iPGlugGfyL97JWslp(Z*ow)j}t~|5b zh#*%i&DzOiUb0q9pvRRC*x7+-iT3gP^?<5)1|0yN%IN86*`5W8eOUKwCS??Kq$l%i zl~LdO$Vo*KdWcNOvHmc}5oQZl3@M^-;X?NPTu8i+3q{=P^KSQfctk1h7N2*_=PmiX zMW46N=Q*D@>+|q%)ptngDpMQsS_t2e15><^a)o}0a0WdCoyxEJkK3lqaT#1CU=ier zUv08PjDa3&TRY#2h_If3=F6#zU)F};wk-A%M$ppQtL(=EF>_R7HuJ5z0 z0%q5B)p?%By|-@Fy;XHeDp{q6rE`wTNhy{RIVhImn06gUwv}LlKH@Z{+t3=KZ^lzq zo>;=p`0H`3A}v5k3=#fBFITwE#arR<;~d$f=&$HV zp;c8Dz2x4-sz@vpF0RP`S4D!c5ieM49oQtB$MTIR=9wm|1L|FqQMnNtq0)*4dHB89 z`$B_o4e0pAj^$|%5ii%cg@dV~{5xoxOB>3URw#SvSiX9}u`I_Ps0O&X*U2PErs5oO z@{TK>w1CIN_yHNf0bs0ix4OQY0BfshvQ|=n7{Lj#EEdBrdWEx^<7(}b>G%WrsvF(F zuYA52&A3?)+?STm_Yw1WJ|cnP(8+AI7~NIb>e4K*ylX{fft>|L2dmQ6DjSQybX9HS zAa>X=DqAVfF4oSbzen7o&UWGTzybI@mox$!2$A;Jn8;T{}P%Piy@1Ni2sUo( z$1oedI8ljU`gv3`&u|yK7529XIwTVU#kuwE8AEZpeM^Zi*qd%Ec7&&OM9ET_Frbn; z6hRRP=M5GY`cnR(?W2Z1YUm>^F`A@U+m*N)ckizF3A-hi!w`@=9G5Te%-y{!wrk4C zvtw6mH4UauZm>e2Gn4!V2iIJYEjf0)?v7mB#D5d+czz$0A6)H)EqsyNmW%8Hq&vUqr9? zSe{q`8W!)d-Q>fF3@&z$^|GH?q3p$bY&ZEK&C_}5m2%Zodu(#vJ(gw1BC|aflh zXn&bK7Cioqv&SM%wmr77%pN;@ukEecV|6uj+Ib!J*e4@t<31a6ZK)w#KvU0dieZkJ zxj+{FS42N;-&j;pTz^&#aoMAR zB?)CkT(;R8T^ob4qEQk$e|Iqq-ZFI2MKE}xi;VD~QkayBV(_?9R)j_|ZVcXi;GU)A zkjND9yZ*!3LG_4Wku|26VV17wlskDq!|dk)`P0Yqk!2yz$1yf#*~6YYjWM(lDk9z% za(_EK*ESwx5fez3NgmXd@}RB>9u(Ba3z9|TBUxS-UQq1ILzjSB<@;w4wNEDz*rF6hz$wFZ^ODO%gT+<}5fn4qOf)4M3u?F}ro zy);!u3FWssXu9ZI>{hDOWN9kCeX7*)rK!5`sVsS7X{u~5%G8ZZQ+01snTpzDajVi^ z>g3YY$zJNz(o{?gtCF`ZP2JW@-LW(kI)ol8@9_EL8*O_kkP*`w>1refn*rA{wR zo$jUXS(>`1m%4Xp>fT=JtxHpH?WOKpn!2x-dfU>}+j^-F~NP^(a6I%*3D;~u$LC*bdq1nx$+8p>+)1BM|xr)}*<<(z!kFKl}aH7AYq8>|7 zf94e#<-c4-SJdUzUwB2E>V&8mC>e$x)b&^b`%KHgD-z|e&X>TY1RuJ!OB1}J%_Q{m zcXfdmv#x9kS6o-+s#{@Q^=7%p$`}jwTju$L7j`sPBB|F)onkcLd1E5(HB4MndCUCm~FxP-Onw3xLqd?Y19`* zW$U__DCMCWJszf=G@B45$P2E5I|$9OBUxnfsSVMz2I9V4D2r^e1Yt}m3Mzgq4m5gh zl2%5J6RG-O!H|<2X<@a@oSf#^R+BktO3RM{i7ES4G*^yNVrj!6Pdl>BK;djEJ$Ywk zRP2GrRK4x+$CN)(f8ZWcX^B5%naV9K9Dcv?h-CATWb+soiK1;=@3){l=jzTeJ#8Q%sT^X$@68D4H(_0Ew^i>MxpfZN#FlA+(Ji@TrX(DW5 zP&oCM!`Yr?My4FIz5$Xp1A8MMAm+JI+eB zFau;QI|FUkU!g2RGwQ=$ma9?`ZX3AlWm>1PXExCBsNF>EU=I7Drie;ubzjtkXHEnb zk_uK0YR||psZop`%o`Ykwvk`3sAdpcGt|;YGZ~Dty<)4*t3-VEx-5Vp{8-RE9if6J zXBGU@C>)aCOw6k&mwl4TV)kVWQe}_F0E*ZGzO-`y9U|M@rj_AUldy;A+gn)?NENsD zi5k%?+BRj>*7l$$N9-<4Fv8Au!_LBl9!-Zvr@yGQ-X`7T9%twb0+mnI2|7L{+Oka8 zQ73?#`xAC6fm4UjoJHGATYsS)UM=i!0;nAl#-_V&7~ADYHMi0t=t^`>3>ZczU=CDq zHlu~9169%^uhs*H)_NoypyM%)!7z^r-Sdk@41OC%I5aY<*|SoH1+(i?9*qo#2r6ZR z9$ikJ@klr*%wt?`160apecr1+RiTY6)1#f`dUUfbdL$V0jlsh39&qIekHlhs1pOcp_zVEcavdvC=o}T*p5r({ zgZo&CI_^<}a@5nnB^6PqBbDph@OVMgMnyg7QE#2YN*bqFib7MVTqARUOau2DL>=)c z?ynyuYMr9y6*Yn5EZU710-CA~n}k3P3O(#1^84}4uDP1$^lR@DL6pVGuHw}%*p}iFzSFko)zfQ{Fj!uZg|nkp(l-^ zl;@vOOeN3zJODcT`X0`$zO7-@KmWlL-acpc602FhaV6L8B{CAILBQ z)j~0kPG_(<$66eeoSq<)>~;k!+eRcmGDMz>__W_RqM@&ZUZ5X-O8G{QS4{e`xS+=!MFvq%x;_&889F13}$|M%Ts^ zV($}DXHZ|&gxVCNv^_LZ_`>79)QsT*;|_scmAdkXEiHAW5xXek2y74U#V45?N2Ihs z%LM?-%s3*#P_7sdg^t9G;gjmJ2o8;>re8;=P{Hy#P38y0dvwwCRvOw}5YaXdCcxbYZ=aO2U1aN{un;l@LR z8+ZzeB{kI%NPsZZYGo@3rtY(2fLxu+huE;p4r(n;)!A!BoY1PLA?e04;t562K-{8u z4k#Nlhk7^?H_Ooz($<%0kCkaBNRyc?-Avb&X(!9HCrFbLm64E35vvtC2<%IQm^wA1 zGRiteW`XM|VMqYi?xAR;5ZvsD4=;sJZdX`oin>7u=6pHO#Tw*-Yoe<2r!J`CD{+(? zqF^GuMA^5jk`Iz!kTt`k&pA*50}8ND_smjOn$ObqGkqZ6RN8))Pi#LomA0Sd6Wh;C zJ=@RCl3{GhHebm0b5pumWy|(+(^A{dF5@Q}SzHkGzyuUAk6OtGzhz23NJCsXz7BRN zr;RH5R5OglQ6-!$Dj6yWeGZUpjT(X?g@VCd0dy1>`@#zFSd+n)X=B&z8i*M=j9CQl z2$80w1F{)J-LFv4+!b6&2m_aGJh*~r%C}XO8kVIhNvTY1o)y{4F?bzF5*mmihoBbehTy5w_fkPuk;w|V*B?d9*YQq}(3 zEu{8;A0hMxb38b^dnaeNeiUBYPB*E`cY6WiQt9P`cC*BF!9P~)JHq=s@sK}0uEhE1 z9l?(&KyHXGPTO4eTM+lMCN?Y*FMrRQej4&t=SJrrlE{oh~beEU? zbNZI?_<245B@~!0N79p{O2yCclouTe+O2{fD+{>Z??%#qLjYQxd#{b20>%+yY>kp# zvdgs~Ljws(uxtu+r^UB-Mb9ZnZ~m=4i{KW{22akhGLLY~HVyCtMLKtIOH;p*bI7wr zfNP6`@;=f`{%0Jh^Z1NTae%av4|83Zgl$mmzZ3cG&u5Sa0-)?ERF0I5W1R|dmR2Fq z2Uau+fm{&a-$t7qQJ zgHQMHKz?dlTmbxNr$e?1_*&-cJ$W~eA;B$$NOEdk!5P;n4>1AT2(jZ3mwJe}NkU8t zwIm8{jZEZeq3$jg8SpIon*m5-eq^;VP)z9uI#@^FlaH9+?1AEmKc-e`(#@|Au#OPQ zB$>(44I0riCS3ZD5oh`AD!gy)LDfJa8?&)RyjzZKTN^M*)}7@h92o*QB_7EE!CM8WLRehCF5m+13AhXrL*4|7%6Gk| z?B>DSP96YZDa7H%UV)P3+vX`#o^O%|=JaXWx&~y&I=%+f$I^G0{A%c13#5;d!TlaG{zeNCz*B4NzNesQGEI3o>c8XC-;Sva?jMJZ@p^vsjLBP(CF*Z1UhjG}$qE zO^JsB&{cG{L%xP?6gDug0&aw&Z;Wm{H54XVY$+~W9Amy3Z;_7jX$ ze<~8$JQckddE?JS;0N%&&}NK z3X!fY9o!xSa-G0e6n74?WDd6{_${D9b;j?IT|E^&CZuZ#9mMu57+nI#eTitbtD=+S zUpF{4WPK}ZgxmXM40nNUP?{zfTwN1jk{qRQr~!sE}P{}roxDt--*l!i#l#Mq+U$mimV|VE+Gz^5)RR{VM)BgZpfA;WRRY6I z6FU12)^zSjIacVhV9C2|JRYtL$}aP?F1HqSS!em#r?lz7ogMT0s22`HiZPLf0V?f6 z!vNnSN`!?V{G$!K90sTl7+Z_JNMjLkK6F0kqIMTuG8=L%!%++mkd?>2NN7f_| ztKi4l9Dx>`_MN&I*QD0nNMm%Zcj@ZQrL+3P=WJH(8Yy+he6ses1MG2gf}}Z0P=^48 z1@qdt2|l%o^m(;*h3~dw-hih7TK2}#9K{fxtam%ZoR9+iZLxiEWiQY*llFgnXx-tq{1%+y`W_7nRn&@cQ+gV&xbZkQ>i5Asc?4B{==*q(Co&GQb(8S@^Sr8c*YXYyyuL^fc%lLL7d%df&C z@p3mkOL@6`_lP=1I@-7?9XN#J;={@NbYl|qhcyNrAWzfsp3@v4kp=UEg78JX7U`@x zAM2dVCUu-VO9wxbLCBxXt^#Z0!fYbuVvamdC-2WTYXJ%|4yKzQ=eCX%d1C%}-kD`D zin5T5+&iK5*G%!62!Wig5&mhWs|3EFJ)Ql*rbRLjd<>eP8rR7kGbb<;l;Tx{xtcQE z9P5@fXrFhpgl5r`cas;R8v{%mCKv>(io#^If;^PDG3mnA=vj_4BMgFq*~D~E3nIaIF`(QrC@Cv5jr!YPlo5S_8@>A;QN&jZp zzIiJAAchV4=$Vk4#plv1K|q4L^?WvrCS!Ik-AELGY3j))6!H*tUv+=J}Q@CkPlznk9;f*_4IVqwAmyP}EK1<6eDmEhJw`J4C1 zuROWH>>4b{SPey-vQ`v{-Pa+0a3UEAbDDsYB`bC_D)70jpk0@+;`i*jDrA}O?b}Y) z*b~^FWIDT|44%EAjw=Jf^y0vo8&VX)+zTS3Ou35;Z{EQDG;7LyXKwhfhc?e=||DZtw~$t{B*v)&ig3WD&3zBFnv|dAb1pQUiFqtKdPBr zSALL8pJ2DDJ}0p*=tOp99nPu@SZ?DFGPG0NYtuE4rW+!4{U~$<-I&GSu=R@TIS2P1Vl_m2wd&PLkeIGGC{BN_Yee`#$OXd5eISnF`OkF$ zh?HesJo~xsjq~$ABqQVohRl}dzn5~HJnW!p<1T1K&}!o@#!-kyRSKV^Z8q$|yO0#5Jm$6Bj)zLgMKDU7Gpnh)Ipy`E)9luE|I$F8%d4+TA z+Zah@0KZDOEJu&Rh6LC*UqJ1oAcOYhGRUrbrVMtW1j`^e^d{0wO2d7oWfNhIfAQ6YCW7D`1dLw&}HR zCXRB$66ME?3N$kNFcJv4-g_VT2I1Vh zz@M>X6^_%{h;vvMaD6B#2JOC0E>xPJaQushEO}Zjte*UqZ6LSV8jrX0xiB!e@`YAs zJ$OBN&UCj_xF-);x0n{|Rs#|I#9<2|#Ena=Dl&%VzmWduH!f0t^ko{34BUQSwBJ*R z0t(T6-yr&hKbGbeZKhy=y@S5j1?it^iP4rolp{VhX3DzBLI19 zh9_YS6mfkCLrXYY8zdz#>h5sYg5;DRd;|jq4Vrwp!tZ~VH+*|%%SCL%PKs2bWn5m< z;im&s5??uINrmt!F$kEQ5Hw{xg+!OtPQ*GEy!r^}_YV?a7g=rzQOKGh{;0I}J2KxiGzjd(#5NP!{@9l*H* zz{kMOTu`qBgSqHj{Gr`{X`1ph4bi^8YkT& zyEZY(OS+M6EvkYzWB6D~|02w6aj3>{I8=?{FeQ*Xu;roprMskBHWxZTS{9op5n)3I z0w0#POz-$t&!9y}(93S?1Lf^YV6^NL>JEHH4ccrC>b*fd8bY)d5LU(qX<}&N-5Fy5 zOJo;XEErK}^m{l1q6YXWme*@U*~$7ww9RC;L=7C&3-M233+-7Tme4n>;`iAwFBQM1LRL(_;`f=b7KKl1 z;-A;qkrfrcPlfpc#V?}Bl@z}Z3mjofMc0GCbk$H$JQBO&_Y{Zh#&|zX{3R%UkA^NW zKMCQg#y$~3X4^7&FuWMWFJi?$#qXc5toS_z2JTn8o5&4A`zn@!K@%wDJ zNb$>&7jx;nQ1Sa*SSx;?2vxOp*Tou-m~gqL`29S2YsK%ARqiJl5`Fd9qTJ6bzEb?2 zta6`J8RR}u=Uzeadn!Di;`bsa7^Y-d#V-?#9(D?|$(1Mge2U*C6TFh*w{L=}aC@+D zf-kK2U4DXXGg@wf`xU>M*?RoHmUG)v{A!9z#qR|tc!}coSuLvbDSlsN8`JI$T27G~ zHMR$kUv`H40*c>Hgs)Zcd+w)flVt05ji)Q*X#oGeD#h>b#22ObUDV}^SNxV;Ua0u} z!{UjDY^XywSQj~}5N5L={?2bTjkMK@F{LX{2toG1?Ey5T zR<8Z*=>rg#D@`W7MjO(%Z96Eaazb|d}D zkV={)cXZFJm>RBsx|!-(WiD@P#nTi<9y`_BMd@peGI@SF zUBMM(5=B)scSDyY4T<`*%5^mfx&f5L+&7VOlV4!>{6TC&d*`^35a~EziJkt$_W2UK zhgK+-!GbeGg9(*BWYl+g5m&D?@s`@l+dVUeN%SsUT%yVVz!~m(CMnjSyD^*NoVwd0cWhzG{s7;#Y5t&|Gi4g3RIgj3g zile?V8QxHy_Ek1xOr|3jU8v`FX1!$7UkZ(tp%~0?kU)z72NpuADH(SGiWZ3$sSBkg z$7HR4vVxgMqJ?Fs#S1=A5tg|w)JE)F%yoy%SLo~tR73LH0)kVK2cQ5VYb;r=jW`49 z86i*lqB-VOMIY;n<`h>IeWWk?XfOI4lTAyl>{sb;IUq0hMW6NP&WA^8bC+@1brdiE zIudXN%<1>@L2~pNeHjrFOOu!gX_sX0rAD9*1cCfQOK*-{~QWo%7IM z`G&D?C$Ej}@esOkb3|q~$M>s-wrohWA3i8hhmk&7K9A^mg=zA`?ZM7WuN3~Go^Hwk z+A_cKtVr`4&w{)*`jXNq?zEm5hrkG+7`ax~2AuFWg*TT6+qrhmfty!&46aN;9>`?m zDdnU5C-tPhlX_Cm6M9nqV|r5G2|cOj5j`Z%Y@i?3lYzvTfHAl(_z9je z^JQA?iK;dzjzD)rie)DBU>5E93eVzYmS^0Tc%uCBiSh|JF=MnGSuyg}fDuAAuN5MD zw49kQ;k^;y_d?@m^dW3L4Wi=_B0N5y(4+ju%xr9pG)UP<%J|k8r|n=r!8E*~b`*?5 zH*nu70=^(Q4Y;dVulVy(wni6z^RWbkRk8g|k+FvrivxIiEmjI~E_tmeU4(dCSeimV zffJ@8;H7vfEU;g&dNv4`FrMC*_mku&oZ;8+1{mbD>ro7C*DX6dH7Uf zQA~pkw2KqHhG-?6uOY1Ni)hGGzM53uG7VAmDQgBDN@EkDgC!n8LO5>5jVbpYk3|!Q z2R~E+1lRT!&>av2c?V=r%>QlpF03Vsd6bh9=0J3EQk>0jmXqRGP0nIl5)=cos7FOe zWC$hDpJy8wJPpJ8pkqf zoG4jJZs|o$5G5PR&Aq6NL}_ku_RvblX)MC}Kyvq9lhsr{2&(q--l*QySl)fIDM~Hn zy<4TLnY<^}yV}V6c=fIZ@;*_$t986@tlk$its`+=D_sv*T6(6z1jZHtRtdRu3dyIz zrjF2v8>?YcKuI4tZPtUa%}nAL)dOQ_Kx+uu#H=f6NR|b4?3F->VzGwpi%o$h#Ujh? zi_I3mLO(F{&1p5beKTJHLmzxpz|aRp4h*&&IW^Hr*X@N}S$24;aq;C@4newj2s8jC zgPsriB1svj%_%Q!)|`(AFAZL`eef{vR*__dj5T!Z)v5+23ub2hV z=ze$<(whH?dj89a-xP@j>gtwn>)WvUCJSWU2hU46ZMmifEpXjE04+G~kVdyQ3-B7% z`;~k~jR;WiS%#p)pk=rREn6sS=}=Ldt$UL_Qo2>iX~Vio@!#bjZqbM`h*V5$HJT9F zCDP~zl)iCVaWug&xRDfL)_Qjh0#_~?8l3(0hK84NXci7k->@t*401P8A?AgHV12Vx zP+v6!Wa%3K@4moh`HuF%h}U{`irLaVD75a3T+|g zqAs6YUC`>~Xm%=_qLE29j66Mx2Bmc9K{EHbR^v zCgb+t3NFA7vJkQf_HZX@Y;-aZ5u*t(i7_n;z(0Rl$c_%cv}H!QA^)u+*2 zc)%>$cj>-ZgnM*QmmA1=2me8EP|YbHVBDv?Ib~1jdwEn)G4YIKw-mmES03AFmka@+ z0y#5-OLu?=6NDKgrWD_pb^Sgh=46QsbPgfVfe(73{!-s=gLwbmBwpqB5*V3kykzh8 zP?s@?+cby9W)@g#Gb>t7d8<6QI?2$wR5*i%rH-j+r$l?0yfbtze`bNX(!DBguRy0@ zPNQk%nRJrhKAtW=wuC)aIP5#(7wdrK1rsp!#BIz%FMzPg)NDLxp_Un+=palBGM`ML zAB2hBQbCan9OJ@47?!RNoFr#ytM4F;Ayf)lwoObDFsP|te4{UKLJDv>G zzBH7uoWBT@^2iP~3Gfqzn9V+MUzw$h(J?v)LJm^fw-nNo4OVd;W0{#K2{iah57?w~ zBy?JUS05J7sTGjOI72hqSEx5~K?|%R6=(}GF`ih>fn`+}w0dL);u6c{T4mkpHOv?< ztsIpIMB*tR_QP&pX+&7^+`q-V`3xfequUK8$V4EFH8OeGM`Bfecu!z|&fbv5SI6}A z>NqH)WbMvtyZ3tHgokAi`RROkp*{O>zdbuL6vnB^8f98EISR39(!WF(oU_5P4CRtz zu)zJ1AGn$T&T`C3_{*2%R;yWn(KMx5gJnml)7`%$rwL+$a3M)v#<<3D@L|Nf7U z+;Act{;#P^WyLUt()!B50sqy64cTxfUDzs$raGZ|&Dwworb_fi{qbF(`gS!e>KWb+ z@oHeuV8c=mBlb76jJAdxhTyQfKF(Vj7Mo*Eh0x?~+D+RwHcOgJB~2f&Fn~r(IpG4sR_B+L40J{iA z$tA(Bsr9>A8w%8fL^>Ub@B##sx1@$4w2gL2%(p$*Q6xGeW3r-c)Jo#GR5)<=;OHRv zv#=Pl^M;LCQqgP8k_rmh7F;a{=9Gb@xI5-L$e5ro>m+A%78)1la@bBDt1$%^lXX%9 z5=+!6Pw9r?wLLLy;Ar2mP?aH|l>ik0o#D`ird0lGNx+(h8bU4g39^(D8#T4_$wt(|!;DLj z1APek(B_0QE&1!UTK4c5+@&o{$>6lT=4%U%z_#Z7o(n09nsghFp$Gqpi9z z{is~d@#RKFn8$={!W7SGF|Z%v5lL|q;)X1a?rDc6j_%#4GYoi+l4OM#HsC6T9lFdT zGG#ncw+A0bM+s~ch@DyDT3@I@8AYMlln1aDsMUN>m;t<{ltn26`6!ktw5_EY2n6sHcwGRQAdPo$WBL)(FLa)6M2*AY15D&;j`x~p6N4x-95f$k^6G_# z{5GbJ5C=_eCB#s1d4cFWK$~7Sa=McIw(d2cc--tp&k7q6p4S<|IGPq{@5OkQafr6Y z`}5Z0xVr~B?6gan{v?}bI}d!QtQjR?p;@E|Q4vsLO$uRDZEEGTU4#WXt67^2*2hh0 z&_`H6rP2^IB1|_5g`X73{{*XKBhN4Y9Kg&{EzbRK1Q<{xuW@G2XJg=l_fxS@hFn;H zK_WCSYzh&_ZtTy|Q@rn9^sXxqG*N;cLJsv&@tiI}U~Mo1YDser?+%f?8YwSQ-M?x2 zAmQdEHNwTfiLtFt_`Bh8IV|Np2%s-zrvyg{WUsyu7IE}ntmmZxo2A-e$o*}?5ZI7=Jf9lDhO6*}94 z5-63~)IFASCXUu#5h!(*47zH5HDkhAFAAEaEX8oTv^$4rmHlT9$}j-eW- z2F`Wk7zsZaA`6G0yNT1`0rzuhF6}Yw*J%Q3FjStT!&)8W#7az%hlW!~GoH)P|E1$< z7zaM)*oBz%*-VD)v_L1;c{CWa!F2494N)Xl5;F7!EO29NV9c=?ucyliSYym-ABGBh zX;PSV<7q72*~8803T+sXew7$C3F!w?Wu8r44=|`@qP&nX-rk|Ir8xID__3C1XJM#~ z4`#YC?$CZEhJX&RNM|LPIlO!o418Zv0}xUjd6~j;b~y5eE^U@tr0uOrp$HaU-Rgx! zj!5!AiB;>YS>n>q+pHy>W_J1;+O~!YzS>-$e!hk-7&;rw^ECZJ)ppgHYN%O6pkhhE z%087~aDlEZ*Ab049SP3Yk@GZrVUhhKF263O=ai!jG!UX5=1R$G0hNHbf{7DQb$+uM zg}w!xf-GERd=$2=w*buHEr%pexkZKDa>#rNt&$!bJ@zW;&yVRDamqvR4yHq|ZRz7Y zjDWERUc7F^+4=;LP)S{VB22i-_F*1)9zdbaQ@6U9QhilnUWt?cTNd$J2Di}SHjTlb z&f;cN)mF`+c~-p;5ElWk(n3P%yM6QIVnub~46v1z-N8N4`|CJ5VRy=|33cg*VH5EJ^UK{LT z*x2BAQbI{ZZR-Um$p2J~7?%+WS=J^zei01?=k?D;=S@D&oApS1)JL*ZZ`~}@V<^iRNHfQ^d9$*mJ0B++bd&HX zSz}-ZD4$5jZaiYF48}2<3@8LBpDm7wCGIBInNWPny;1_94*a8wKFB60DM-_~bZRDF zM@dB>&k1|&RJS~puk}w;vCUUP8K&zYKGTgN7`t=OWpmuNq77??oVST&6QBZ+4z}8c zp)W`Ertt|fXrzn?b}bX)!>w8;60e#K!K?OmHndS#JIhX3`G@kPuj@2e-L?k%iBUGa zrC*^L3dGYPGome>^eQvuDa%1(sE&jD>{$1Tm9JKJR;O#cb0D1=Zl$@x-@r^FM7H?b z81e&X@sGD8%KH#ZoScuEL&P^lJ9T-{n>Y^-*R0WhOQ^%uOg165Bd90Q2;f~9aM}dQ zMLxtNvJ{hlWk%e#5ILP)F0E=Ij@UwEC)T31h2b$`;wW460x(91w%$Sp5fKW?y+H`- z!oi_7K@9DvQWYb~N`6M3RDpKr$>zI(UBV5aK<$(ik%cPUp?A!&#)vLD!vq6m4{0$< zrXE)q$gG)7#n7eH8NkCWP{R5EAfg_SAXMC328d)xZdEoDE&)^5uVW%l22HJ$$WrvR zUDQ;49ocHuxX}u(P4kaO%L>Hw%aBs=kVbP>z1k3s%5H`*7SV{ z1kC2c_M!YC3IDmfKU%_Q*>qrD$QXb~qzHi{(yaNkpcWH>aHmi90d_cc;Qc(9`a6hZ zYrh>&xiGSOJ?B2sh~&+=UHf2u-82OI5X@xX}r#DEPLh8#KU^bLI5({Wn&XW8xLeEa=%k{@Y zyNp_P_RNk%h>^~y!XQe-qVtJ}k4*a4g>@8P`kkDdrfHHz3Rr~P$<4q+u)1)vlr{on zhzCj79x$_#z~Mi@naJKpIb+L=mQuJ*=MSQAL{y2UkKI-ZOvCNWo^ORLY1>>m!KJin zXYFWiS^O+Ec9@dMfyqk*tZPnS^CAA)m02aqA`$H(itbu7R7)$?AI0s%aUwCATVFT@RketoG6u zVL;G17;sgI0p;E`_5*j?QdU!&YR0}L`B`wFYV5%PLTqU{#=#USJ1We%kDw28R4|`V zE|I9^h5RsQ)f%xg9aLwYS#Y8qt^^Bj%FzKzk;?ie zAcZJ4CS`zI(}&=+G6EjSBVyzy7!-h;H3WkUL0mM;A!zszpr@VH7O)mAY6IBQ0Tys0 zo0T2x(1@1@J}l_RJrvZ|Ks_24E>H1sp^({pt)bugd`dko)+X#HH7B>gRC!4Hunl~{Kr0FUH(#Q@C$v1Q0Uu97RDm9|RqYU*Z2uSih zc}R=X)ycmRy#u0mv1lEsMTWn>+qFL+xM#6qeI*azcklqs?}KIycHxIe4~A+?jMiQr zSlRFK$Q}CNx?nev5Wl=R(jRkdYHyIjl}vPg{;+s`i^lP{Ygfcvj+x7Lq<2E^Lp-Lq z?TrTrC`rDg#kb}z4GK`f^sqA^1fxNS3}G^TYlBLU5MsbhnOg8JkJYG{dQ-NBFcn7i ztkYv>CLfCtrSPFLb8GWDT+QiZl*}~bL8W6BiUdY&@)=HhCUdi&J^oNW0ZF?4`#0Eg z-S=&fg-aw%1gr=XFKdtWd4;-0t&r7@ z8m~}vUv(N6XL)(Ab_jnDR3;bAGHX^A_XXKX!E-wkk(;KA_Jy!f`Wey> zVsADN*?XYA0lia$ZC6$T@6=$MmAxnbatOTQ%nt?%hF7$4I`%;R=V(KlXovL@3JU}* z3gT--*kszxo<0;BU?a&a#!!J&E-b_v70}lTE3o40phJV90@Z0p)nvXW|5 zuX=&1qUwc$buS#D;VB%1hW6KcA!)uh&O9B}#aS;}p3!>2Qe>ks%m=-^7rMn)B_aeE zSd%2sXqpt;E>E|a4{|!wh0Gg-N;4&3fPzV7lg9>YDldW$A&Nl-{(U%S<=OpyTU>l3 zN}NUSUuri-^6y_7Rk6~S6swWfc38S%llH5x5g4>lRCM7+i0bFwJNO~!Dww!c06UBN z=s@&_!|{ifCE|?KrXMEo7`1_}WgRYB;zBR!A`pWZm)@hz{8M-#EqQHfERKrRGP$7aDxs9Y|Ol8Ziag^KnV zEU+Yxy3#Qz3P)kDYn%==;YpI2@MNjf#HBX~aVi-Nm~K>6VP9XCF2X#Gp=wtNmPQ$5 zgdtmir9p$GZi}3+eQc8IFnvImu=^}G5c;zGLEaH6$xN+(hc}IqGR^iSh{T{oe~*km$AMH#TK72 zE=Ynz9NK307SM2jyhE!-fQqt?t6MW8jOcNdLP$8vvnGs?xy$5L`gq7;syJFa&H#fR0Xd8y+WI zZb?QG?8O2>%S@IbT;=UjiKq{m0}|%Sg;cgAn6}JffMk8Zmc)wn%}4B0xg{xBB6EU< zpaVnZs*^2=%~!~L#PAeSg|IHJ%nKaQ2xY9L2%%}3 z45GkgL_5HT33ZU6pfqF;gOfwT29RQWgfHk{Xk2K>FsS-3K4if~3>m%2j3ET7P_b(6 z(qTkd#(FcHBh`cxQSaXMgpVwqa6u{)4wm!@M^;izxPs+`6TI+*tMy*o$`ifhY3+I?a3-FUe}j0!AD1eZk}n zlcQX%3YL=xVPg~0wUOxZ4Gm^P(MTk=TIB}1F0RZ=lc4gHku`-2ZOh0W79bH_5_VM;f}9%&bWX^~VwgF%HPscao@Q$8Bnm(Nn!HdaWb z@OQ&%b<`7UTNfFq8X(?(s0eIm%u+#IsW>-Ug=FKmC4(+0`d~3duK_hdfK&8pA9I0h z!5Ui8!o%7uH6KO`3wAB0>=3J|X6~Uns|iuCoDk8X0=HqC5Y=fD(uY1fJ|U`~q4B(8 z)_g($CWb|w*8bt}SawCAYN(w?jVM1-jgq3*+9IM}Mk5P)Ar`=5=mo$`weUMNUjijo zF(VM}9t=}+V1bDWf2=a=g<#YhCr@IUWiQTpfjNt{N??WD3}YReI!O}^ftgx=*i}+Q zIz=BD6$TNJh1xlsIzbdj{Tdzghvov+iD?@!f)C|7#(f2wyq;^yO)|cBM_mm9%0(ctA56uqW|g1ts>c7S-i=?-{@NjZ&Lph!waD>tvqeB<)^Mgl-zR+ z>!k_SIXkVXkA0^VU9MIr+GExWzm&VNYd1Ft&6GR0$82XmC;BLMjm3b7?-C zi8LQEnCzq*J&7S@2NoU9yr9B{4%aXz*_-v~LI@L|WSHaW?HUSzMo;lLx>pS}@e&d( zi1N40Wp7Ql6W%hHzG)`EawffIF8em}ua33USErM6>D8j?58ujhpcI<^N+<6(zvqzD z7pv2^&ZKXi6N#CA8&vQdvdyi`x1I7uoCrZhg}#IkZl`NzX0`<^ErM5gaP90In>{hO zz0hLmRM8O990Rg9tmcGNY)PPGs&GHAuiFM$4%4 z+2iRHf#aDj)?;1ZJz4uZKN?{p_!9_zKdzg;Exk5^A!eRrSZXr0hq9fWRR7Xz!2>&a zzRmFfC|mYm%kmbGA<}9(c@LoQHk@v9V*mGIzv|7;csRdiCdT8oUkg7lmH=e(z2f_6 zhex2s{GK|(Hi9YwUJsQIyNoM)z%R)^$RvB;9>}&&>LB9>1xB|C+p&&|mhMT@rbMp0 zHRe2V%)T)9?R~j(jhUz;JUOCmqK!fa5udIXL^e8Em(nCsp%jr$FaQ?jy9WDCTWiS- zG!EK=(0yRGTfk=^!zHsrlxUvT90Ci~4ZouMyA@;>C9M?d0-`vc+m~mgcLdHQnn0B# z&p_3HZ4L?JaQ=eP=V_Xdq&gTuUtAX))WJCv1R6ng7i7(&o18Tj-(8;6 zZ>C8VXSZ}(QQQB;;)(r7oKV!7;2@hGixsa(JrA4KDv&z0ZGNpRBZsxVL+3H1c}A8G zwE(gMbn*brtWHcIWCVUL0}eZ@w#RQ0Y_Jq?%xgtA`OC$C^OucqtnYp{6U)Iq=s=I~ zq+@l7Bo?4~=_wYVc@bM>#Ik695FlEN=0Q;l(0p5Ho?LgMfHIClh#b+rHbU}NNFGbL zmh3HHh{&wHKu3O*SM*3WWJsSaghO?P^rge-80&`IOGsb40GyVEF$U5WLkz@vN2p(x z4@@=^DL)9N)6Jv2fTz(jkml%L7Q`4gxu-wF*<9JsL;qs5LH}58_T@p^+MfqjT<9NK zygITizcJ@8m=i5R|2SZ9^dFb#pZ;=wx)iZl=h@EKYG+3Vf>3{C63cMitBp1d*{@`} zDE|(a$7!qh>-E|r%`^Yv^xnqIEF9?DYW>Ss?8{K+EQ1B*8YSLM{%SpjFd3_K|kp6|UBZEOBY&04%hi6n-m^?EC16YQiRv2WZ z_bsiGarB7Pb&TDPe^1Ijs*~ZYGA!h4ubk9I z#yruqlRD9~K$6mQL%;(EiwJKGQz@up5Fu`JbC7`FwDMN9n{ z?U2Rs3AN|X)x<{>`U8a?R_ON$99O_bL@eg2b$H6c_IHd+Y|6>&Ud4+yip=T6& zk-$?5*dRTr*8h(`X27$s^+5elF#yt0HxfIQUoNOfvirvKUPV~>ud0!Msq(pSH!5Bt@QMOH*^Uf*gX2gTvC4MU#3L5qq9f1DCtQVD-f;KjPAGb+j#?wLhJY0W6#gVhQt@$b+g zyvsyAXzNB8qaR%~e5zoCn5r*Pl)89YMV?S=o>%B66?#sgR|q_-fOYYd+T~Mqs=r+# z*EBQROmA*{|SZungISU%koe3hVVpx`Aku-KN!aV72@Y0 z0Q!cr>KISE8q_*=R@mfMRo%-9S;t;d=x>O6Q331N83@y|V`p$2UeDc%9s3fWs$-{B zgu%x13R%aVQ|KJ!KdXQboXU6D;Os)Ld^$#NB&aR{yX=H7BwR&WCyr@=Y$4$^vh2iB zh5nXGjwoQ2%=czzzJK)mJY|j6Bus8h-xy{S!qM(3n3YDfi!PPI=IKUp(gJj=7--Q6 zXcrW39I$3j&f7CPqu>D%s1jP%VPu(g7!jw!h`*%m21#@!zw8?4S(;c;rWHrVhG#@9 zj+q<{$_Fi@;bq$dL`DssOeenEG&8Jd0o#x_e{ruMO_ub^3`NXpu3h#j?Da}k6ZER# zt><>Ix>pKUy;8W>tJ2Pb0jPwnawP3#T5(mcN^21~>5B5=R3iux7)kN4`J`awMFHwb zg?`soh(fOt^_T)S$0vG#bOJycf{tJonXU%^Wgo{-v0q9n0@XMi5Mx_Fb0K;tLaeWv z#bAkBcUWHK+?o5$m$v^2A(}Z$w=k6vh1{&KZk9tj`B%c^iaSNsV zEQ#|M@ggt6s2zB$!(SeqD&l8U;yKS0V#B(HikjaDPvsXrK7VN-dPTA zSSF^Pu~H`1FqtOFMD`EL5Kq9WkUZ=ND1f7*>>Qtqjod0}$|5X%ABa{3iTwm1_pm~L z1Sxo20fW6`VZAGHc&~@V=nGJHw8^L%#aBw~5EnuFGw>Ce_lmJ=72&61AE`DmFu*vX z)JS7aS+6wmwGP3+5?#A4xSPjW1j?g6^o{MoJ^657G_!{j3v@96Br-+7LVG%3MgfEb zTiJ-nWBQOrm02oDv$ zo(+Q5tM4-8M6;&hI84jrgHnn%R?);*6tDn0a@%4iqAEpX+sk!F*V+Bawu%5Q)bTL6**>O28CyZt#)5G=_l2NnmEbG$$2_@bO( z6d7M7Wjmlm?$kG|ie5X=vMedRfn%#V<(%lx$=Uh^IhzG;IhZq`vWx$5_^{*-nS8*L zi*8`rj~R)yLkp)zN!UC`GMGIAkZPBo7qEWf<1CB&34BGk`91=_M0@YyX{+PzdWQ#2 zZE=VhG?XguNNSlcub)>rd-?2t;qyJ!=VT};zUkTC(()28xn5Ahuc?IF`SO3I1e`T^ z1NPM=oGu%nj+Bj{2o?i4r+u?QTiu%fq_Xa$j9;a!165i3>#{I%?Qaf%k8A^9SK2C2 zmPhx>qE!bjTE$K*JJWbJ`Iv38L`$3p0)jd~NP!cQj(@#JUr*<;eNC!=J&ggA1OxhB z!&XrsRWT%bF?+;HGIzL%wi(nfv^BqYPB#5jt3cD!lD~x(&eHU&5mA#h0Le)vUCX(V z+>tkQGdfoIV(N5!8s>}R8S)F>_F5>@7F)t%Go0CSk&<9aMVd580TwFjEV%=Cv&IRT zuz4m3cQ7vk>!=<-OD1?}JMq z!F4pn+F0xL2N?Jgl`j|qmQYpo{;F!Gx2}3WRUfIU){0S)M?iID^+%dH77})%dch+6 zrDH^LhOu~zk(AFH!vgGfKVjry<%LJlHCZd;8;ISz1fdv$} z%)x;MqreB9R@H%oiUL=-qE!{{(W)f{4h3K7erj43<&6esAqBpGR^?#%$$Z^m^Jg

=epRpiYs7YY)`q`xc zbqv)Ru)Sy$t~cn#x;17uAG{;HhjRa#R&@T^JE9IUX$0u=;$LYa4X~3>k*`~L zkY@2JE!=spVj0bv@iv! z$w$Im1!s1kcmk6;#l9sBq>-^Um=`L>naxuJu;0jQC|?$KJ6C3%@!wBpkxhj3gsoPl zC`}H2GX3}P^A-NY2RZe_r4qWE?|?XvCZ`W)z_{Z3bogI+<;;g-(fb6T>tX&&Au}O6 zuZeq+Tci8IO$OQw@#*?oRTgOjkc@HS9_3_;*ap6f3)h3pG#rB`DG9&y^YgfmS+gJ? zxR7skFeb8Zpj!E69Poe;t51;NqCz>Oz%sdvd=yu^g~HWtp>VZZs78$mdpNsA%fv8n zwV27kfO>IOm^BS~4HeREA?!|fHFU4GEn>3JKCtn!HlRn+CX@2pw%@M(CJ$IaRwLU~ zSw^6}Kn9ay zP%N}VEQ@JrwL!ll#N5SKJ1d$U^KPZ#Fn_leu+RgvEUY4`DEr2gwt>!VLrn_E2ZX|U z3qR1p52}S9*urN|HKC0>#Aw}X=Vj$9tJb~4H)0n;@Xa)%k^Hj6l41f1oh?!b3kMio zN7XcFhv9GbEpzEBq^?f(A~BvTBPV*12y)6ujzQPu1C2I{hDB3%;dg__gZeD_-bcc1X*uSUVgS2q}OY<2QOx} zW#sZTneA_G%F6KnS4UZCGq})fGf1!3Y_~3Ew(*?)wV7?SD&P2PdqqqRul?1oZ3v4C z&NhSedd+rxF|!Rv__djBI2H&ciJu{#Dodo}7zRNPA)|s!ALz1e$Y9ypC1wHb)XwOD zljTO=N22c|F#<*|p`C*7!82yb%IL712nH#%DpbiULSE-)B&_gRTR9gcSckP1hAS>3 zkKZOGGrzD6{K7Wy+kF7L>7^`+?8*8+)~A+nVHZp)ZfMgoFJMoso|e_auh^5fMX)Dz zZ8dvR515i{z}}_-)7!$@G+;wFr6V_n?>&U!YXj%-k7tb={mcZx7~(2~aFg39Y~P19A?l)-Y9Oyq7{4 z-H#$_n9no|Xd<^UxrViq8uzKvCcOb-n?Y^j14}yR_I#=J|P(|0e`YIFYoKsfL-3#AzUs& zmUKz`I>hxQz~$wAUEYbx0sA_@DEM(e#_uZNq8@wAG!>mm*ErsO|tl}4__qt z&Ai;;rvsfoABcxg&Ne^fc2lx!9_7CbQG;zk!1)iIJ2O7L?F=QS1#p!oL%1Guj*&wH zyIxNc$7+cfXNl(=60g_b7F^(j{WnDm9DFz15Z{oRbry zUKQuML}i3^#&T4$1}PoIsQ1+^3l==XevKLsSOcW90ehM0%hCoI?=GSUBlk+!Q4S*B z#*C@tK1m(n<8=X3S&rv|TruNX=PQS{rJyaI2~OSfBQ40t1#- zMf5R2)FDk5j=^&onM(YmqhLJRnF*sBnQnQVzab5{xjJ9^_xhMt-m1JZB8V&>2%gp4#UFbT5XDq&FX;x9(zO3Io=4{cD5P;&_{Gzo|}Kz zW1GKC3KJMMFbR`z1ARkTh&%>+F@}(_H2c0GQ;p&r@fJxyWHXO;Rds6}V%wy4+oVon z&8hn&@6EA_!8pxro4;!qM`|<>chE(6FDr=g`;HB+SjC!CmKEWBcfdey_VG4Fr=U@6^ z1blYB?b`Bq+ut1_<_yxI;*ag%(wXw0l8=2ulUslNoW6cR7Ja+?q*`HLb5^bT`gGsd z^nlaX{ofk~yUo6#wCe75`*k$%EDL$-#Sy z|FHP@JZd7`C-j}V4VK60=E1=FniLvSB`knbir9f-LpNH2Ca>3(k>z z;waVGVYuJaRD@M^r^0G@is~?27d7UPEg{6&v$r}-I}CkRrO3|qixeU|TLS{w**XMO zcDBgjMtq|f(je;?yt#R%UGgg4KRhqe6uG`WqbB|EM=1Zx3caG5UQp;XRq2GE*L7O$ zb+9;Ho_pz{2!wpHyWvYb?HB2Q;;I zY1#tii>L#aF{({nVWB&X92h6zg1nm6T&uLViP~4Xpi^uA*IH9rlsgDSBbpEWia0V0x zi-FmZIBW#s>;=7Q6CGq5GF#yi;}{?T?r6aHNWd=Bx0fB*u^=XrcE23u4e&Epqj)D; zdKtf?f^$Ae$A9tdF{d!n)jaQ}h~H9^WySeR3fxKHk7)Vq*p+hFGTAtV=VT zVSkb?qlITnhZ7ag>31D{l2!gOb^n}7eNdr4ROqNee?kRE6tEiR!@3G6bE`sUh8q0H zM?kE(tM=-^XRWPsdvfuEDu%mn=^n<$Qn+Z-Qe-!8n~{(10OplL(6y0I%!Z4R4}eq} z`Ls$SAGx4ld!zu2pN)D@K{^P-hH6I*%EGZkuWH0YqFS? zYW{-qo^Z`v@(w-K-jnla$s)V?|m)LDfnf$keu^ zV<7W_aa$0tYKDJAOXHkEzeaJd)RTU;H|b}~1!0pe;4<=35T(-?TK+5=U8u=o{#27| zEbJ~;d|kDPVj&a(zNvsf3w=Q5sQy_{_+q9}xvw+lHzb6B-@Kpf=2Vzu!DFH8b)8ax!8@}VbC(AA4p*V&ngI$xLoP?L++L^F zhH?W5!j7yk8Eq_B7|irnjWNE#W<=|L#TkLCV~uEmSZLzyF>63^Q*V!T@{Z8%w{ww+ zh4#KZPCaz{+v6z@-TC$y{!97pdwaaQnum`}gOLC%Kl4-ppr|KoSqh6A`FKJ17 zotKy75+rGhDX5oZQZLE0UXnZNB{^L$$$j;b++Q!ryDx1?dZm}LBtN#&lKfFzgUPAb zF(KJW(O->-jR11ZDYm{t<-)|}fpQ4^dC`wA{17Ci4wOHq0IW=r`g!sn*8APy{XaD# zv_4M`HV|F2LfHqPTPb>fRkF_1{=Q1Ooj~RX#jWIhb;;F1afnrsn(R47ggQ^5?K}*E zK%NaM0=f9`hbd6vjyJft!wO`hEB^F{L^m5hD70n;eZY9nETm-PQrZ#~K;_l^IJ+6V zsK$b)5$U4hQ{Mlx>e)!(i~?f+uXgU=DrCnjzVKlY=y3l=#2fnWh;Ol`_6qK(;63CN zCt*i=i&s_T^;Oxs32ZkGqOh`e)Mayiyk-!@mqAu1Kd_LT#}9^)^S?I`UMWC00U!(z zBc^shy92+lo5?{jZvhgLCL$k^*9>AbT_CZR|8+@VkrzNu$O{Q44W&sinxZ3`LU!PC z5)J(={!v6ZFV-0tJW=Jn7s&G73v_w!CFy?|?|+%-f7w{Q=yDjQhO@+#7oM)m|IOBs z8`o)o%oV}Pq4_K+o%&QQMTljx3_32k1s*8qJ-1FtMz13?1L?rl_+jn}-|fL;1b2Aw zD8VTY-l?l9E$iL8;(Z>vZ&!S~hvvzcdT_rkG((=!g>OM&AQotX`nc>lU#Fo*Waq?$YAiOl3+<6JdHnMt-$k2~Cd%>~nA)BUK z?gu^7V4BUO8{}|$FufA@*fThs9@JGeTV~AXbR18!ytqP_`~ssPiG(+GjZqEEX)qRYtY1qU zzKdy=C`0US{PnC=A`O?J#A*h9r5FN5*brwlrxcQFR640(0H4k*7cz67jepv_3E$%_ zcMsk)`G=%hlMLFd6ixs2DD*A!n`QdZ`z+Ug|}ymwHj_rC!u}sTZ{_l|nYz)uMJET;)v&YCu{o zY7LT0FsqvedMz~-n>t-CYI@G1me%O&v#7_ks6(!jVnTDK9%Y@OWZktSULO`pQ!Pnq zwbDb~9^6~$ybkxRbY68Y!{Ck5RPik$wKbplk;l>O=G@JFZ??8d=+5R7WdeTe?*)5k ztI0=CX4fdx&Xbe)mS?q3II?7 zM|Kt7p`;VL@8;|cw#rTT&*T8SwAdXwflMTjGwhJPkw-R{P4T#DF57A!u}VEZ*Q@!M zS$@0E3jFh?Gyw6WQ#0AsgeK?GtuxuSm<`*}&k$bng?_fDS0hi~4E}g?x{c5lLT{lF zAz8UqG<`F8V$+;CuLtwoqx&#f8wsk?D18fQc`q$*OI^`Ene7nLcx$$!l>5Iyck9~C zl8qaGh;HAX?nvMIK)&O~!|&UW?zrDl+J_(SuzV-(Wg&0=V7gu&XVx9uD`*v_+76~_ zTg}|KZd$&wmTT%-M#~{xrm}06s|=)eFM~m4Yas{HE2!+&KIG>^YA8nTwS;$ugkpwL z$2)eR3#y4gk?1Ear(N#?4_;!ZSdol{a83$J8e0w}UB*U|WZ0!FeR%USHUdpu#zre) zqwN9o%nI13OuLMYUK2L@{Z^0RX_@*0jhWGit&-s}Hg&-1B2)(z!!rOk;gl+Rrh^&Q zW+`WJjM*6!UDRPi(H)m!cEFdSi?~e4n4JJlt!8%gQqx6xsp%rU)O3+vYPv`-HC?2a z#dHzoYZZ{!T|9Sa(>gU+&>OR`L$ZFeB%!3H-7h$eeZNQAOcw;KF0wAUB8`#dPBg6xCq5j!QykvdutE*=fw{aH~0&rRgT<6mdLR zx|z@fp&W`OAZs%X(iB<&x`fbL+-P#_V{43TFwKa79V#QfM_YZlcjN1dGkLaws~Z`c zb-C3$-(mYdTYb5!`&Ms?e}ogIk$`>9OmG;m+TAjhgr<(Aq2&2k!U3$B)FhTl+* z6=rAlq}^|0GM{)Pj)D+s1n{uC6Ev;ST!HWYu*; zdP^rGiy!I^-A|Y5Hbq2e(jy%7h32P=BFv6k1;Z?eNP{@BtfIpy)y%LaRBOw6sam=3 zz#1&_wd^sqVuPVt@@hDyyxW-5?i~i|OF-?g0`N%AodZ-& zn%l}1Au2fyG!1X+tPXp!$HcIzklwJULt;N!D7+7eEvE+davB=!@Ej3D>Bvwkjx!x;P71SsRdFz48o&a7YvL@MW5 z6n!+zN9;_CUXFx0#}n@Hl=(0pmCe}eOQ{?A2bI1oH7-uzwNT^oNaj-U$m~s=9dKU2 z2y{ll==0`M`W(B1*MUBlHA5%)_16hwh)nCF&zbc9kG;2nvg^9)Jny~lv+BL7dQ~b( zC6#R7cP-l`N3xY5WVP+2b&X{!9xn(GATUXf7t3o+)~jL>8>c60mSc&D8XU%9xgFCn z;HEv`CZ-Y7Zj+vNH-RzTp6&!3FvLu|8AF?HCm6>s*|GGL zxZb(vo_qG$`<%1S-uvu*PDwsLg={-cK9?LU;nq5+SLq;3#3k9hS;)?W=iY&#*~{k5 zjbw8b&D13}0~*NXj`9_`{1kHk7`Z%?`$cq<%NLN#GctI&+;$Aga=9XbyTT8 zST4t14;+%2OfKihy-Y4w(#z!}Hzk+5+D<8#v*~}bzfG}>OxFpg$Oq!N#wk8`mN*5+ zYfm@@MjNjRoWq=gHSlDYliB1!hMsSZ+X41~$B$=T)Yuqms0!DGCVJSn6>Z7kS3qt#8E;!(vxY>#P3CO)V%zaBxIPivNam2Ws1q_4xfv8YiMB00 zQn;Mg4s%`yXiOE*@jK8uNUQv>9O!x_G{?7Y1m12d*j)7>X9b<5jchW!tE%JpMqMPCt!?54XD$ zndx(+Ef=xN=T{B6$T>cL*oxa`OFs>`+H=!0dAnxv5{=l*OkT=nGHy@9GkIzKeA~oK zRz;_p$)o1Vrf2fDjb?HVy%_S9nOvYbekPB=d*hir2A$VBlZD{WOdf$&T$;%RR^w;# zD6DKj-FPNzH2Il40?kv-WY<|^XR^Xsdpa-aHIBW?Ocq<1x60i3%V+Xt8(x~p*6uSq zlUdeb)gN=w8A@_jH9vQKtiSELz>blca=b2PO~cP93C;D0AR7Ie$I%ooLj2!wUUWqQ zD+2ZMB8%5WclH!@#JI^EVRT1Hv z6*(<@hdw@|_@a}rU+qo>m_)=(e9$KmF_Vax;fR={T2XyC;3Oi(yQ^#aKKDb{L+*#J zhujZc55s=wllVLf7`8~|-BzGuEw1#7E}nMI?whD`8ALe|zK&{_A zOVf4|@o~NdYE2?O(!h>!Da+D;-q&X0(Xr_U0{m_&S3LORc3KkiAy z$N9l2e*G+Qib=%B`NAnC5g*BTPwWw~0~<$t*iH#vnCEQ7$4w<4Wreg1`H3qY=dBX) zarCVk@v&}@omoHeNyLZZfyzWaCnG+}Gx;qZ@llz{Z>5Njb%X58&g9n@@nIe{)rf%M zpbaas*@%EqAD_{PfbQ#y_^{5X;yWC);rnZI5iX-XKC}3~zK9Roc^-jpDQLrrY_@+5 z-=UAsD87@34^BY#XMJ-yQ+6Ww%wR_#6 z=7)8LLaZ~?gWjh??&Kjk2~(Retx1^L>4mAC4}l?X4%3=AuTPxU&n4&eF;}I0=bPbR zJDFRPxpgkhEf)t;bzUb@#1^heV8|peWD*$SE>3f|brH_*fUKb@s%I|&Rq-=^&(FysxKw$GlWX*&rFIp3!3BrxRsaQFU? zXNhA>0z=LhckfAH$oau3e(Nl8ib-I|`NAnCfgxuyFl6|qjC1ZP5IZlu6#4QN4h;Fm zw`yR>xx#UteH|?L3dbw-no9MK;^N!+|0C z_>AH^2@IJ8h9q14m4e%JrQmkEvuCc$AlYAB0h#M zCVF$Y(Znl#;+1|bd8Lnu`1rOr!*g~rwBB0g;4nnZj|B0eS&A7?z`(=f~99__vgoT{fVIj|-C1;XJSjhS2s5%J?c?12+|MOXzwv(`s^KIHr!b0A_Y5Tip zY1&T0Le95oI|&OpKb*aP=PYrINm$7F;_N*M3pqbH#dBwgQ%u4_&KFKG2@5%sVIk#1 z_;sDeITsdEKH>f?eqYEcj4HmvVIjW1URzj*K0dSfzP_*! z+nyeQZz(Lqifp!jhr>ej@fpRp92U}Hn>!BEp!aH{vliBlrC~pc?2P_;Qj5ctsD9&2 z5ZBW1X#H>+%yo2ne~{EUeOxbtBqT+N+F{N>jgsKTI^U+@pdV3feV}3#)b9;5VTZ5d z+R;AbjwWaRPcAB%#G}Ng=K;LrE@^8Dwomr= zcf(Hnj{g4itNd%lm(GMcJJ%iOU;Vo8=kJ~I{`ehtCHt>C_HE1Y{yXhW``D*DNjqNp zFqi3E^!MYPgSZ{Ph~LnSNUijtaIib*Onl}iKJ(|2&-|Eply7-6{CX#IYcjXarMWdG9>v7yNjyp} zK?gXh(o#wDkGu$=o`}=9Y|jwYZPrYRlRH z#c4ps`zPy`=E-DkO=7)XbF7z4!f9}0F}Hli_q`c&>ql>l7LGOUx;RMhg^5SI1FUN@ zLfJYo=zT|0!v=0vDTaNooMH1|(ECm+5v@d6xX^oML@a@EG^0kA}QEcz^LBB!sYiUz`6Q##U zV(+P$9k6y=T)T0(_iagVFuGX=!YKV*Fi7jS_fbcKxM5{`@7?M0&HPVt{~$URw+vp& zhx^mOK8;&BZ0u6|9c<8sa5?Nyu)_>?n87~aVDB$Lv)4dTfu>gOt7lCX)MgHKDTCT9 zLtQ!@sJk3g=aFOx7f`9S-s%0}S#ks02|}f=s^?v$kybCrRTsJH8M*34uEuazHLx7e zSt=`fF#_s+YzOsYz$m(8D(@1(m?~gQ3C2_gW6EIAf0Zs_WQ2fF(X2}vY0zQVH38## zKqD=rY8!m*qJA?kwzK-%RzG92LVOG&kRCI$t6#*o`nz;_MvfIXLhEcj&9w7@+F=IN z)7ot|$a%M#*51v|RM=;>_G{|kdV1$=eI#F(!^Tw8Ms+f+1q*8o&(mqUNY?YDy$#p+ z*O!eI{AwCrt4UyDU88=a_n~1VoleiVdXGhADvl>!;}5R?)J&F^~~aIPTM~? zOVf78WZIr*({`(ywuY#mZq&_ zrHPOX5m0@klAZfP@|>Htvo>ve3Cc?kO$LRg*YCQST#v)cqwX(2lY7DefA067Df}?;GQsGrTXU8jUsr+K$too)}S z({-m#&t~d$J)X_fX(hcnO>$G}w5#ou>U39}Vp|svQl|8TQ{)5jT;mj9I!l~l=tQLn zr*K^89OM*JaEflblRkjxV9de<33yiceZ9YiD`F(%zz>X;ix}^sm}MZq$oH3D)k8QR z$Z%NeE_AL7vEI$OpRW6vaz9P|Y~vcI>%vZd$hx>KQom)+2eeRrc zd+{_pES@>p-_G(h<6LFsM?3A4Ghyv;#YJ~}JRdK9Itk?5i)fR!??`GVSf zm25TV-L1LvE)M&%-kr8LpxB&zcc*PxYRQy|)2AxxSVdcM_!W>_PR85T*DP5yh!+O< z2x7POFzSNQ0EYP*l&-k4U`>zI4Q4cL361FjdVeNsmH!Q>dA@|^_|}cUTbmaJIV2*&4ZJpdeh1O>pHZ8 zo<9;`WPCg;$LAzzuv1)Ae$@(8>)p2=g-d95?K9IWYQ@(8qI z@jXA23#`V^%kBDAw2rwr!n>f@T~U-z-_EjUq?a}^w|%DLDT9mBa!9h_Rmm*B$C zXt7ax%&o@HP&{nRp{781e3{K)Tq_{dAlAMh@DR=@$})l8t3Zgj)_I@0MJ@(u zca^_`BuHPzo_ClT`Z<1im)?!JP6$57b2|?923MuWZf4H&)m}wa@adrUschgf zlpyLW<>n!|<^^p7O>mm2m*F)~BuZLk@ z{YkW|ancDlTI*jP2XVX>uMGNcBei=i-ZSX$eeK)`A>f>kc71cW(Ig^o5;b%#MGcLK zcKzlzBeG#KwBqFrs_!e)ngAnr(;i%{S@aaZaazr)QMC>4+^1jMVwgVs$5ySNro<)y+s=9nD`2 zds0kdT_>@w+C-Uzs3V|+2ct6_qW))RY1&R=UC*~^JBf8g#^*eXH{@iAKRrv+b`tA) zzD?Untm_*%ZC^f1({>W;dcIBDNv!Mn5$pOVXNhA>VqGgy@sn8BNmM*R*PA(7?rSwF z{*TWRrpG0!TR7JBhPP_0>u?`*6kbzAhE?}zCb6z}#zd`;nkyT|x|WH2PR6

`%Iq8ch^Du5?h+ zmR%86D-ijUG6iZ)?TW3)A+syRIwE2kwTt=rM8=Y(yqw$3&OtwbZ!g={=)M5vRI(G! z`{*XFnaJi0qg#PwZ2pfWKuaQpC4dl&RQUA0sL(8tV6FPI$#_wrS>iNp=dW6!S>iNZ z;jdaD)oGfZ@mH;o>O@#Y{Z%W(nK_S4f7OaYR^p?|zv=7Rm|`6KdbFM?uo8bfR;uvM zNa2XHaksNb4hw8R8KqNSHhiH9BexpqE~^NuQBHwtHNh8c2O>7mTg zRpFq?M|cU;4w^BHI|q%vburF^O-nL0yO;;tnDTjWp`Zw8(o>|b_%M?iZKSs28jowo z0JW;F5IF=UIDQQ6pjZmV+>yigoCA`GxIShC+{i;~8N_a|R#-I~70L?0UZE&q=y069 zlLPtgg1dbe!F?B45*>Jmn-Y_4vJ8h5)ZeHuYK3hvwnM1Xn3t)Jgm290^Nc8WCY=Ha zf^M8mQV`AvFGiRI=yswrdyqj#YOvOmjQo_D8A4`Tao!WXYp(-ZNuQpng9Ibi;r!Fy zE!A2Ysev~;_-f{lCP{Hmuy061r;iC=10APhS7)SfC+YT~63an77G_%hO4&VSWXn4z z8Ga;{*9cYgi_-uT}wF|ck0U==tu-L?fHv-1|jdqLXJ67tij*}N2 zve`I`xg)R)pij+BUh)lFHLe?4`z%c~$0`Pq5i2tISXgT+X_G~`CzBjkmNZ#(U@EGp zfwHY4=_1T&+nN=gwi%3-FkjT%09&CGpC*}^aA5=@;AV9u$OgQc5lVe8I}L@vV<=Y7 zCfF5c6V&__5FjARL0%I}bwsF)hnOA5GT^E*b~xo_;HLC>O$ckE&vlDD~+o?sL;m|`^XX_(MnaF#LZ2AU<>hqkFHmo!dI z;xuv71WuDVPQen1_L;RULr6=4(pst*@cn$|M;0RG1Ga!Bi#cPPGcNUFLKZ-hKJg05 zL@`9ja56Ai-P^N_4re6;8>NQh8-gL9)c>LyRsYOg%WPp!t!)o0}N*vwkrmpj0|nl|K@ENf+k+&74E$)V-P^ITlmQvGP3FLxe3e(Yx3)F7(;n*az z!Uo`p41X4O;2`M7Bwe9~s2V~Dfj3}%Bx{l|y4a+BTWnX`3)43rLZeGi?WVkhymoXj zbc?*yE1*&2F`x^2MIOE+S}gLiVbjqf&zM!uioC{+X)tvq8aDu}HrR6Azh(fjW)h{t z9|{ecrN zfBgItB)|P9Us3Y!zVb4gCqnnOkHvoo%Dc9O$G=Y~n1dgmKH}rk{&72Y@3G3_$g^kT;Kw^he7xfy@7xR6JEf1?7JA|| zFx|b)U_c<<=HNoc!`S_kac>Xz=@ux=W#N!)h+*Qa7AF4WzS<4hOvd&jrhF$yEAHfg zF;05>Cv6jwhS4#|W>R}WkbfeZmgEfF$eVnS{s+-*5@sa!@P#J9-@0rI;a_8y9wgVY zmcp3}ag)1&YX$wNzobwLgm#ZtihVKnti^At!+o?@qGRJwDhz6nv=(NNB+>Ommg-5> z`J4?CF}Wsc2}(|rIVQO_3Ng7hvrRrNrfh!Z-E3u_RWv_-%q@-+EIcjjGZ$R2;o;WC z2^7iseP)aEMImB?Ibv@gdz_zAsyi_tV5XiU;$%En)Zf|SowNH)Q2hW2e`kw#&g?Tc z^)nw-sAvVa;4xO?X{i2ALVZZxtOnwUs#v5POfU!b!$)vge|0hl{gO7lbxJ zQ&eDl^hL4F|GAMgUY^kz;T*r9iDW_$xGq9vcxIRm0FOsl>g;ENhk!n`J1X#uWTX>f`(ksw(|&%T|fT?^*V2Cdl9lHL5U<|X$Z(kVv_E}N(vJlC#g zwRR4Uon*&(dC;8BuF`>a)fcX~KjfU7-OH~>N!X*c#hEsCY=gU6%+wKu|Ezg0NbLbW zL+UDXp8~1t>Bc=Hl|z$+lQ~DKkf4LvE$e<_I)TcvO~c|cZmO1b3&J{M*pSL8X*?@} zz&ON}4)X^6hSUwNWJlO|ZAgtgCnjiLoPFi;*b_?T!@8GvLJ9oFOFW^37I}#$lyLf_ zmv}D5L#IzrKoQk(RH;O#iGBM8XJ%gzZm0wOQUnHTZJH?d2|TjGh7 ze%VG=z0i}q&AMlve>q>DdYP`FL1}bP?h&%4p%6>;`)ZqzpNgB=1cBTz*22l) zR>4CgXm*V%svA7miXul@wr6o!9>P{=I%*d!5N(wEmUIPsCXN)AlF~;e;ANquPl$8f zUq>4sxgoT518k@LZVUtiIFp*oX*DftJgl&-$ELiYToav-oorZwrGUdzugx%{pCZ;K zAEA0OOUxY|y;f0r)MdNbx-GT6`JS12x7o?xaBYUE34>GtIrvKb8GwPZtyr7aUev4o zotU(}J&I~3eu=3e0MyBmFKAjYsV_A0FHBkkWtK%n{*$kK-1N402wM8?^b3H zZvP_X`O9S%kr~}&OoPTM1RRqS9x7T8>b?KB`;Hkje&L1556=JvK5Re)gkp}e+Gh=5 zNX$xJ$W>b)qC66Y%u(3XD}aivHyUXIdM$hGg$Y4~);h3IO`f3~V5!7`tjM}!ilvb zm~lOQ5N3^I!K`60qrFC8Lzt<=VODxOm_QpWfh;4~=qM4FaZ?2vbG;$ZTF-(jX(Q+o z{7g%M+%&0nwK#UKy^HC)p+K!{Dtx-j@HTqzClY{x# zuU@%d47+>o*O8>p+rO4+;pdvir-i{{gxEqEVlXry);fY&353A-smaW+g2p_9p`ZPxco9e5TQjSkRLDhzA z&3oohuNQ3IvjVu7<3u2~2zzI995zRTm+Snz0f^L*}9h z8d&J(BFw+aB7t_O%65ZKpdZN{mMFG50d~SLwHW4fug;woK`ew>-J>$W*-o^@rXVjy7`5G!4Zr5k>)qK0rU zGkP`5M0MdS8xniWG^2 z+cx8E0jG4kBM8_c4N?09xLDTcBG0Hk3F`5o2n)JLWukbI$dcyjx<`>AX326mukLXY z5gE)4@zL94VddN2f) ztuYV{UWRJSaVR}shL1qi)Cj7yu@J;af%1d0Gs$j4m5}GCT5wcNJE|4|G6II? z8>&1Qj2r_ERqm9oK9a4mP#_l!4xvznT_a>A&;SHiJs1QG~YA`O_ZpU&Gu58~kQ9C3He69RmQ4(Zfc{pn2O~foQQqv5xPe#<~zLWyZ2?BN3qK*`^JBQH<5HLSPgV$NHQRi_~mXXDY-X=4{kU?_m*v zG7f1M0j=i*v;h=~qqjB9v6%KyTj4Q}WHPU7+AU9;xS%vmoe^Q7R*95qrUrvu6lf8a zla3P>?kY?ghJ=OhmlKv~5yG-Oi=dS^$&Yu*S|bHH_T5>JwsxtRnj%yxc%KNY+yu7O ziNJ_qRU$CCr7?>s5!eqjlGd#Wyj3tQ!tj?6!z61`;iL`8{R7!Gqlo>elUl*#psVDn zig9YO5s=C&riLezCoW^rKv>lTPF~oChUfD8;~nvSKOVz;wOPw^ZeUBX2pW4>i^|lv zoW0F>B_mI%TJ1LKjwEf?L^RHHOcuaJnC(K;_^0qXe4$X)^gfGm-?sdkUWs{)ms);F zZ^dhd_gcQE7thLPLh^-p{n+=Q*KRJseX78>^?AgXQki6auAuFY zf`ai=Uk`JZll)Qjz9m(^o>5#mi`4h=|)BBY?m!4Ph z42m(y+tG+guA&N)Jf2=s@^E@V$>nrQ$)z+XxtOL(cG3rwY^N8MgfvsKnVwRzmToIq zO5d!cm)@tOo1RwEPR}T5re~GZ(j5t-OMsf>GIUngIZaP6iBPaR^gu%Uuxp(Y>gl=x zOcQrd`j~PS-AGjZxN-uPqK4^Q`$tsJ3XkaKsqmPR>F}_UZg^aY3!^mBsEeJ{Ie6-9 zJzaGA^@XU^SFuuGSxD`Q6n`Y@?O=E?UKtEC&Fn4c z?d(R_4`-0HVJDm=^do09h5L-Av^gxiS(nZ1GMAawvQNQW!?yIL+u@>{F5uMR0bMq; z2UWa9#K@o>u_0w)pMneW3NR@jF6oj@-#kK?m3^ietNWUd=(h8&44|Hc`*qpOu26jY zcBbGV{6V&2J9AF7as9j@<|aLjL=F!mTH!VZ6TS9k;2+vbH;oXIOMIKT^kvxigCO7` zaB&5+yahZytl2F;rXRy8xO^IZbVzp&?*WbGjfcaPCl3Loo}4}maY!xZC?cju=q|}) zW}uf4H~`AgHtV$qzB#6aYWOJK=&SmqzSn`oL|alzr@%}b%O z^0==-O@y~7o<{?c?FQiHo0pJ09`t|7-7&ggs2xyHM3KyIb)G`?{Sa%{i{-lefF zcg1HY&}miAIu8*0h8lT`ObqW-B6HbukY4l(F>E)&yM**>;aMfmI77go08w`#>KTZ7 z7KLf<5bogj`)YUU%hze&3pYJE;mJu6)Vnl*^eK{OXoig{8)Gzsk;zACeUtBsJMd{* zFQ*_{k9)koXoF6?n@+SDdJ5>N7+bTjskt<^V*Ka*;rl(gV|L@)oi)SI!-HW#E>?_dyk}s{ zSF=lE&79m$8=nf#sEuN*#zA9@N;oLyFn4{59Q2x#)iXv`ImtzpAe!gi!uWqPL;3-D zz$M1?{Yd+{6qby5oJpSqy+ZRKtRpqoAmUZ%c?Is;gWlgMbp%Yg)gi)GkOjN}vo=t@ z-&#y})ERno3fB-ia>(1K zIsXqP#nvhdJ0NxywI2rqD+EAhOP**!O-p5Q7o(<8ir+wc@K=$zq&a8QoU=5C_tFL$ za!w67ufU=bcQoOmnjk_rshjw3{Kv7S=yWcWuf6o0Ij^i0R?XjT)Eh6KstsPL?`6$x z%2V{iLH*GhyYmJd`0=sOeA_Gf?-zcxb*1rYlR7| zdw1~nahB?RPg7ZJ(JYj+R)ntSegqVv-|>OptnK!GZ$_&&GQNso_x@I+_xBdHM4~My z)&w+cfXQUq8?D#q=^`I z9!fqzYu@xw@^Q5k8!w72iTTE}py}SnKQyn_vY5^b%uQMkbOnF`N;pTqX-WYk0ZMc5 z$1Gem2Y&>t{t>X2NA?7D;4>ZI=exu*IA59CmUBqHY`yH8~716oL#m(i98f|K)D;a!l~WT zIPaQ7&}JBGnl4sc!30yR_;PqauCLgq;4?k01#7Fa^W3$r-lvdARlZn(}5Lxd!lh_GBGZ(t%FiysCH zTirxv-bUY~zqM@3Q7#Q%d)o`c0w}ll^A7ex>HT^G@7J?f81-tLg7s<)JN9aw9=~q9 zco?sRD=cS~`EGQ!jkt}XE~;FqppzoVSOH;}C={6N)td~blfdZ&Alm|#0C7){bm2A@ z5Mz3;l@0YX59@28d=Ba7m>!Bo@hl6SsCMVQk_^#?4U*Jn2)4fdY}y*sj8Myd!Jytw zZT#MiXf8^i<6qu??x)wwo7s^hwoO%t3J1KAJ-ytuDG3ySk`yd#oxIn zH}^1~Pd{0AD!%v0HT>QmjnnhvDANAGmM6hJPybov`cfmkU+IrEFm90ka03el>GwA< zQ;_~~lDhq+hS}hm!Oglzuu%->3AC>goHH{$4%(fYRTrr{Adb7wYLZ zDgEhs`n=K~si)tp^oQ!{pHcehdirOTemvb)@{#m|N}f-zD|sgU79|g-A5zjz|D2Mw z^v^5VN&kY9pK7G1m43dFepu;#BmIj?KiNqClF~m+(!Z?qcaroYN`E~`|BBL|Ptskb zKb53=N9;EVWRiYV=^xh9zpC_i>gmUn{(3#Vsr2XT>5EE#s-AwE($CjZ zMj6l7({ES$$$I)7N?%I#*`MHK31!cE_Gg`!WILYyRlB*Fo%8H(+0D)Dyk~#kZf<55Jo^foCz#4EdiDnq z{L0?v+0P|nPwnhYp8W~CxvLcdwd!Z>W?NlQ_E+uZuBJ)K{+8X`)9QkmRq)KW43e)LQ?DwLZ1hKWwePVy%D3TCa)j zZ7d9ey`7p7-fXRZz*>LFT7SQ_Uh7r9L?qaArPg-`YdWsIr36J!Ns}%~VWDHM*ai4` zSp_dM%#||O*HA%MwZ9$Za~WN83C(R0Q~LsT_Ia#rbLe%SL}2b^{KoJspRA)2K+Fi5 zGfELOXO$voc9bG$&M8IEoL7pVxu6t5b5SXR=02qenl~v$(3s#u(3s%+gv-4fF7{q< zsrQ@N_$>rULUEICjrQO?I*j;v6*K|?0 z?myw<2SghE6tT?3yKzeI+t>Y4&7u#?H(@+0RABPCv43 z28K@GP;@E+A`Lm}H-|OjG0Vnp7Q*v9yBfZU-=*-4{LY6D@VgS;&+lS*AHQ?q8~FWt zt!RYz%HcA+N2Z_fb+Y$_cgx5Vp3`I^JZn>qcLlZQR8TWc(F~mqa>|;)Rlysdp&jBY z%OT@;A-t2{RpT*B#$)D<$E+BSSu`FqXFTSrwc|-^#}n3$w^}c?ReDM@rbp9 zK}$PQ+M$DGQfmiS1($n>c3iP`JZ$ZF(AuHZoTY$W40ybm-xV3vfX5|%=VXoxZ?bmW zXYIIX?YLm=IB)Hc#Z87UA?mEP_QCAE=Z*LKZ}k(sM+OS_IFek{!X3g0O=>|%*~lfGQ(gd z!gNmd7G@jFeEc}*KWHTDFLTnGt@|yIU=vv+X03BIH=uvSSL*O(z% z^xgHwRr6xj6v*7816N_8&+O5%o60WAv+)ylw$JcIH*M7Amou?HTJ)~)!Glx+mAFjv>Y>VzfuwUPNhfr6J zleCna4Lv10?g@4t#Gb#NZS*NP8+NW|{XTba#MAX`v(F<$HoKmkkU~K8ue+G9^fX9RP7Td7e)6-|baT47)P-Ra~+ zMEPEN#xW?o@h~3gLK!IFO4#BnTnSOKw_!5W6}C3H`f`Q24b!BqFtuUk(-qb>On|zQ zKO1gaP!O@Z_zol_kl*jPlj*bgqUWFIKf|C2fq7u&KQgVp_dg*%B=~HlD zc+>T4wa*;3EkHt7q7%k!A1!78{s2Y$~PE_b-P|AXLC!*qEB zN5u5+Lu3$E*ytDd5{?vkh>j>w4(6!{>!Z*yuRC#US3>YFCHTE7A>xs6A#a7y7;J-_ z!4xPylXVAE?u3cAvBD5_1~_nXcFSO57afK@y}PI}_y)@n8=J*0%8U+ym+L^pn_k8MX{>hAqRJVaxDl*fP9ff{S<)zGQdMmS*8?hH?}p6iA@~EltUeBkY_b?7SoF zf+OsrBkaDg?C3MJNAxjZBKjCG5q)WazN|psseTsGw_Tv`w1%gl@2sJ32Jxa3VRYon zCJJi@l{Oz(A?t@z{jl8+r~BcojkAcZh`h0b=qRieBmnYOggiXMH8vaA#~EPki3X|p znoqN)XpdR#0+Qu4lbI1u&fJ*?gZnh=KgUY$3`eNh5Zkv;X9{;wN@?$hQuYEuU%D z+XV12f1G-#L6Xxq*keU1GHxeVWuT;dvM9_5#Q|m-H)XL!T(Q+@4|>jK6yU6lIX0DJ zE@}(Cp4`>WDS9d1ZAF9ni{(-Pr5guHr4(pdX`@n#cdwAGwMG21aZ{C9dx~+5^O&`N z%s1KS>`(9@JIsW8Gbr-`EVml|Itu`qtIawc?Sm_N)(q7iNief2QSOly9q5slj`qk) zM|&jyP8w!js1Ql1N3_KV=fFoOHTcKp?cN0?5lBiP+BhPnO2y0N=jVfrJ03eonrJ_VH)ru0yR4W*=PAKqVLfs_6n$oe@xVOQ2$F51(;R znb&m%R1CcKjdao=HU-2y3eFfhFThoz&l0Rkr6oX>N{@ijbQwycL;5ff!4wodAcE+B zZ`Nmw$uO7s&YOtBgza(2zeJQp$R2?U-4n{v^Z*hyew)zyS@y<2AJg!n4&*Z_9;1b# zx!&_(4(=_Iv#p|tLm~(PD4iw6N?(4aihNgD8ROs7vkK6fGb5GL$QP}0>e{dhF5!>B zlQMNr$a(GxQC{ z$}f{Ku{*BV@UANWBN$lc=TYE$#tpS?hZsrxn|YRPhirJcfxrvR8-WlwjFC>6lj&vy zhn|?Zc9;7V3>zgxJ(X{hc!;aVc#zW&fOIdP7SLMGkwCUjb4|U;=&6k{7$f9_x3%Zk z9k2@x;Cg_6Gd;r%J+iGosn-*EqJ%wjMCtZEkWI+tLYu-|jM>)@Vto>Q&&%MEz5d{S6ab-xpYFn7u!#cG;)4c;PF^GkKB z>Ag=x54QCg9)2j{+#dN|Z`V5iq*>Q0DYqxKtr*2HOu_Cnr(_5*$Dn|Ny%F)TjQws5 zoCO*>p|J(4K{QBOaGN$5LJKA`CiT%dA(stuH^uEi|ALJ&N*Kni22YEMAg|ImvmzU3 z!&0s7i`)>ArF-R+uTn&0sk9hWMF=c}e#?YD;<`5eqj5CFX}X3_*0Dz>>CqhG>!oZ_ zZUw@tHD1&wmQAm4+2?oORU*J*eP)(^BY@^agC~W5)A$%{nKq-wSCO$1bRfY0FVm#pK4}4`9KU6ISOx3}HoHJ%*aAz%8-q zAz{J#ov=DC>gWxk4vJwOz%N=sWZ5DtBcyoLvSU<%%ZyvYrw1lD|8xm5@8<0xMQjXEVwe&3GYr;YtX>L1dSADMJ)CH}= zj@cU|v&@W1Mqs)b>gft8vo=O>=N$;7I^!NlQ!h#vua$A2ie6| z5aFyEt|K~72E^DfTHvlV9Mi0INj|-pEyP+vB8=9eN*qy(E^$aL69R2DXOioI;Mj}h zOz+UPNK*0y<9aXa8PC%qoRoffyezX7o_@2fJgguO*o7TV7=AcXH(jNV{S4uUH;U0} zFRbe-oZz8e*mg2rG?@DN2Vv2;B7Oi1yO`t`jX|!Orm-eX1ACeQGlQwC12&SjXd z0!W+E1j1pd*rAtJ8D(BtWt0(2UFlr}ju=AgR5qK#>%eCtq@tl#__kPk>=+ZBFNQ7W ziQNz)_&6kBmwj;S#t-Qi2fD#Xbs}_x5ofPJ)F+LgAZ`eaZ|tQz^bHc?xH^&70=Gzg zm>1dkUFY`F^SsX?dyWQ=gC#IamkgTP)w+}Gw*tsiSQG4%0vN_afxrwmKPTDAph#JD9o1)`A z`5rPH2?kL2I|xrPjvmw`}C8 zLXKwO#d*1D#Zq@UHo;yhnl+6X^AD&}xH_E2pxO#mssfswjkRpSD5KOKJF*s=P_ z(wC;zgkloS9@-WeYiNF936=DA1ftr~8#uB4kcO+I%Ld~$dQ2c$ehD37?483IU{sqZ z0u;JhA&+_RFeeQy^lxg0%?!yzAkwgb@Y6`2WV^|9*mB_~J!3M=RDpq&-oQ01)ed|w zEfX}dB9@kEndLgu*`Q^FAA?7u*~5u!Q=|M=U^q7#GtwOT$*+U^Y6*6N9D2vV# zB1~C;(28Ukv@^Q~OXH}K6GZ;8q?;9TwzkFh z>nkqEEP`d@1{B^9G7zdl#yZclDF7C|hxDu8%;xuuyEyaM3^oQ(8W&jpfNLPsWRaW3 zw88~TTG^s;4Ha?>2rtRYO~)74&}<~1%M~jFk$*A}6xvihi0cEYfNRKDEjh>*sL@&^ z-4V5LjYDdql^tr&7YriTIJ7O%$X?qdfKgVo_iST>4+JfSqcw})VBIxA7MP_t!81;f0B zEzjnaM}fOkI3i=fDzKs&t4JcN(1e}Opoj}U(l~Vd+fd_>)x$OA$U<6$UMwNN0%K$$ zu1brAeisdZCrcoMX!~s+HjJhj|hbmwpwx&fbZa8J++G9u7!a@#tHm)9( zSV*)I9om+-^jMOujhuxrD=_r5jfFJCLIAQjhSVwz0VX8~O$ugAW3$bJY&kOR0(FD6 z$r~UqtlxAd!t4kceZrZD8&WGOmx_?RVjlXiF(S&qff$Wf37VuGcbykjRT{f<5^W9Fho7WMmUbFgB6H=Oo||o5*3LNQ`J~Mm3No z)WrApFlw0MOpq?oFvE|3P`YT#@8Sp_X>ktO;2MWR7JmRS3zRybxs@{u?^s3XtB4?- zW8kUMgYZ=8G2z**!n5+(L*Yqug9yPYWFtEe=M%S(-N69tHeFmPOuN9jNbI0GNx@{M zXBhT=NJrR|8a>o5{*R=-q3{T-k`N^gJy2K14mjO_We{{dk|unbM3JvZmf*uA@0FUe zlRQUzNIryRgybWc9N}ai-AO)-J&bEsId+nd$u1H&g`96;NMt4x7MPU_O_XbSOl%3c z%n2QE1e6@ACaJ#(YYsI3#|b_uA$?-iz&v;kn4BT<#L3qh+~3Oq654 zhUcU@YO3WqAr~5Ldk*h*d1!Vm*ZI^$(!Mo`G6x^7zcaMNfPa!^^7|P`979B@xZ%Ze zU;&6sDwWJ9S7|d0xNYZYvR;VtC(8qi_^dSi#9FRi?zielN z>Z-_Nu>B&0H~&Rn)-sqd330gG&U|la@PyrrLbG-?P7MJzbr4{90RS*j&M^R{m|6z3 z@n2Icq(i=T576|8R}M|)PxlN>j%yPcDgc(#Tl;3V02w0IM20vYN)KSiofkK~m{Vt* z42>E&&=oSo05N4`D7PEv2AOVDGX>RjhEVO4p$hNPfDUb-YMVD@nlohAv3BwY8L}Br zX8$^5$f)O)cyAs4N=_(5Q)5T6)^j!AfFH!Xh|k`w_-r_XJ}Z~3m7<#2tQ@q8ymUjH zHVm{NLcdYb7H2`f~ zbWZ}lK{baBYKP{uK@)cjan`#-Q)9v)I{tea6Nh~7s|#uiC#h}B(89fdy3_dw6FRQ0 zF1gZX-Bc}+?;TQM z@V|WFH_jtflb0DU?1IJspvuOe{u1*Yv)T=QgIoB>7k=Xl%Say?F4^vA55C77*)HAa zeV`*li#o(p-Z9Kx>X@dnbWGi(V;KI@#=*|T9;tH^<2u(WcWz3u$_9?$mqh4#*EnE3 z;q}eIC7Z4(k%xt#$m|X0bn~qUjdMv;-Wm;gH()__-wnHCO@0|%olAOG@M^a^Fl6Ws zO`Rw=nA^PV2KgA2zg`g!c7V6d?&2s*&qh8K=qOPo6bDhPEXxN$&l~QLM&XX-gf+l6)Fa zvoP_Hd{}ycG%-ZEG%>6_JKC8{oOfwt2(KM&>_y?*VGFXRb+VPR(85e*0CNj-*9b43 zYhf%}I1lCQVH6@rN|w=CZpmsobSL?!Erf{8yi@vp{i77x78CM1(1Qir8#jbtLO#nf zP(z1ezOT6xn%%OICf;5R;sB*jWuXgkhDdM$0+yrf8R0Z znrnaLgLSCX& zWr#$+=_pDbSGeY!`NZoOEMBhh8DH%)p8M3Ua!vel*V13+(+?V$3V$Ucfr3|c&bT1% zJd=OVQdbF6C}d*AlfMNj7f;5x3yK&m8iL=J4@};3LH@>k;GXFV;@4ilO+ZhMy}t7- z0(8rQ3P`C6a*H@RwiO)of`feppNTY;9|jEyY1|o3u1EEYIqr^G9KIlyl6scj^lBtn zN!@69ZLNB3X@^~)-~obh3Vc^Q3JWLlTmY_-dpgg_+xK*SKH!HCCL%VVBcrnk!f=cw z90d>SS%`SpgWX~yD*|;MHkudexqyt7$VpIxtd*s5Nssu4{;HzgfLPRW*c!eW$hVu#BYhsKU?wS?3+8G*~u=H}3Gp)-V^OI7zEm)a^5tMr1o}ih^f}AW z=jlS9Ra3cz#~>fzpOg8@seA>?%+!b@Bq2Hj?7>}xgpZ`fSR^~#b&8`+qE3`|I|*x( zT5P6$DH1~73RQ?6boBy`wsnyY$zmTG^FKu5kMvajp~SG}8M?|PUbJm-QY(OONChf& zm^cQ80Pq=!*_QdRMp7FF=6;FsNHJ(bo@d79p?U+*DWSXd@$tE@4EpS%Wg-Q*Y9Pc< z`9N%K$^qC{i??i0EnBAV*0RD1p$iDssU$dO0?pva(3aX42ET`(?cx?o&Xx}Xg_>Zmz4 z1p9PB?@#E6^#E;C3=x^l7e6K%ul zS*BIsdO*`lgXeb#H*zo#KTu@vwI`Ks)cGjrh#NTri6>R<(vzvVLr*})=_EBFZI;}qGinT^fX#3b zm@y!j!(RiNogj3Yz9)`g5c6i9372!UNG>%kDIa_V8>;f5%eF%M*=J&$@oX4RwQVB1 z6R8ZqNE*C{ix<+c?%m*wLRKtu;By5JX7+p@fM5j=dQb3}kcQwkAt_;rLK=lCP!G;# z!4pWQYr!^W1EB1=7hz`ybY&<^9PEPM+2I%;ecGRS0q7syPv4#b;_ zxa>+_foCmVpt)dyXD(i#yQ|7sl)WD0c5@pPfV(UACQ3;To!c*&>8VNN50(;{7kd&G2erC| zPtvJ>Dq2K_B6TkVPJ}|luP8-l!$l|TMWVBT=p<>Pvr%j?(TUqjqO&15UBQE|=Q|_- zdHPb*0RWOXbe~gd)r#KTx*yqw*_9(zT^<^SX%B?=(4nIn3$v=4gXO z+!;wG`t-p{9Yh%ndZBK_p}Qy)LQS1an>WjE3E%8+U}a*WYnhVyI3jfeos7A^JJ#P_ zxTvIyxpsJ!0tdE9L$j^ckyNXzlx~3@sF&WLQu}DB7}`=auEQJD+)^ahWjCQEO1n|-rQT4l zq5X`W%%|yIC_&6QiW3N3++hUkTB9^QQyHn;v{Gs^l@aZ!RQsTg8JkQLS8Us$OR@?) z8B{@aF(`i|&o_FKo=N|Q$$oc(l^@iy?9*|#fo3Nf){11K7?{d#VhGfYRb?K+6)98wxpO{Mln!IX9Pf|*TG6ofk+0NNZ8*fA{l^4 z28!nyaSS+du+|~s7;xgSeUK>oERSqtax`VGJ$_FZj#wQ|CNyuTkn3%ROV))3Teou0ErE|9f{3MqO(Q| zV3P4?A$7oSEGolnlSo%kGejc9c1z*>ZljYh<3!xa6l~xufQ;#p(7gF_y|Nc?_{3Zs z?}%|MisK-c*=Z$?-&NuGFb2@i0>{@s1sp#X*JblLrz)F^hXNn6nE=KvXN~JH;Br!! zDw`BC$o>pd0szd|)YJri1CxOO#biWCVkj~HC4tG{PcbIr?+)GHJ}1T}WlV;@bD0d) z_c56g@E<4vpQdk*Md4_`aF>2@1);*W`z0{)q$T^+&(vqCv7{B5CfNaAZX?cRG?r2X zHeJE77eO*Ni*syZOj((Ny%_TWttFWue`7YdN$~iih>K;l(qDk%(FMF3#&_1p{Ad9d z6eqz$2q^X?t1-K82^VFi>30X>k;+C{&?ryPlf`#*`N(`Ni+;>;#gHvp7wy9dw*{5V zsAW}mB>S#T>q0VUF>qABFfO#vV^Y&SF$!Qt%IN)S{lRs^8`cS8G>GgGTqQ+(U3ZDO zyKqR$JwAowRI4TTOQ-rg> z%WtD+_INvYH05MQ6*XCl4dkn(tR4lUJQ!0YT%4)TmoR~OmhB~oR=JF=GyE%ryHn02 zj3czpjzS+xe^v2*qfgoj1gi-V=XB00^*R0B%IX<6tA~T&=a@H4(-N$n(K)ZpKpdBi z!}p$zQ|f6LIOsIYHbE|99Fa%9Ec?Wg&eD`0X4ouE&#kOcH}uIPiezxnc*K-}ZyEH# zqZ?(~^I+v75GaN`W!uPY$*hV!;7{XCdFuyXn&lVRgnjYj7b5vz-;!{TY46tni|t;75 zIS;heRXogPhbbmQ3=$MEbJmI|neG1?KPW3Uumn6{sW>av7_TJm=-kEuFeva)B92Tq zgZN!HTSlLYgYo7UM~c#m|LpecGp+PcB1N%hYUcCBnLx(Utxm(x=C)*uhz}JJi0Lqs zMOovufQa6UL(==p1u#0IU&Wot_<(w|yFmbrC{C{#u#pg%jczC_^3Z3|LP?lb<|MEsuK7JUieaGE z22I||L|D)?5H{~2t56M6HrQ77LXjJ;R`$XL45qjtjA@g^R-rJe1gXYCZ8u?6P^O!| zYh1)n#8a8&GJX!Fw>2a%ml+J$dpwMlUf`6G{MqeD+)ry2;)y*j7=%KyzzoTF z8h)Z~)s_VU*74DJdUQ6lcy432A?VqSgQT6IpWQe_+9V8lj*vEFF7Zal+=T+n#^c$i z|NaRtY@LEuTu(De;Z#G=vk=;F?wP_7FlGghWD|S@j4|k5aD&mB9z*Hh3S0aP9(lro zPM0jC)m@m!bHzfQ%y}cEylN}F&=fuyl(~=|7eOtouv&2S$U;$z z2N#wLu8p}1u3&BPhQGnpim=R@9%2alGa^p^p%D*PI%&^XmM8C>SbWGFY_!Q0=^wni`PXTHN|sXv|DC3?{yCli=+zEVNpqM?oPUFc4qYm^@jx1 z&dW{W6DT6Cu5OctxGwq_=N8e#EF64E$-$xg2Lxw2BV^ZPnLVn_enD@d^FmjBGGanH zno{GMk+bGNN-}ACB0yB4cEs}aJjheMs_}R(cgk)NRpOL08r3d5vnz%z`bj)p?B1;; z&VB(2Z^U#Uvbb`|w9Hy+kq?u^%q0HGOrp60$!uiDARaQz18Tnh-nJ3 zua#SPaGJimhi<8f0wU$-(hz`02W!oFZJy^x?iDj)%5*rYW@xT5rUQ9!Jnz4^U65DL zd}O6P25-(=zaElea`HqEXMedwzM|BH$4L4wIvy{PuGCH{U5P*l36Fy4JQSaxEMaDm z1%P0(BmhiEG?_PEVKmniWIc!jbR?@PwB2tGs6`5$jd#>e0i zcz&geaSokyF}k%e*~9}>+yE5B90&!MDu9m>^h|gnVP;rceLiqss)z1+rT6PQSR8>D z5u0)z)Idd}=Rskr@H{AtC*kOX*louL&aNgYfS|n@t!%7JB}CilClj;-q47*oteE2w zo^Oz%Z$YZH_y8tho>f{*f7FGRksc^(!ioWv?u2_|T{&l@20SWViLILzm5SQY`Se@V zDr(?IcMu6v>RIR8ciBBA?=%mCiVQWcCsEHZ73O-zD1jQ-F2lzijlzy6GvjDKBvicD zNoB}gw9JTUPo;dLpZi2;^wS9}gcg{P`@>kOtMvFeVHAjYx_fDfpVH2GMJ@RFr*hpz zVQcCw_j#gIl?qL(AYO&}X1H)JID;^Stwh3+svkq#!;Bb zGZnj7j{}em{GYLm)RFk0fy7`4~FB+ z2vCD|AHfxbCNp+)C%iCIipgCUapjVQVXyUQ#~kLw*Hvs!G|Msp*N?N{QLb{_4N9S( zqROD?u1N?J8N5g*zmmpIWdEE}7PK#+?%tYbd#F2>J%*n z0UrY2d^Z~hITN;adKnalPXzRXH;cI|az`D!iuzS&zEs>Di<(n5%v&Kp&0x<@18&0c ztct66EY04sgn^58fQs>hU3!ALGkSuScK{itO~I$jH95d+U38zR9nwh*Y#TUfh`0AA z$P$_+8!}`$U>GjGEKKWYT}=T{$))m0Al1R98|6h_fpFK52!jd=9p`YELMP#`t=P)PUnz9N z-|3D`ms9UbiaQX}hG%DNtBM`ju6K|6UyGhD z`p|9zaVY%EU;=)5u$c09_|Q--EFjX^jHs3ILz+6EH@Hws(u5YT5?<6vkl!QO?~7E8 z_Uw6o;`}Sv1sgmp{3_qQ01_If1PP6uZG)H5n`=FUoW1i-cn383u3^~RYgcp^JTlCz zQJwai2P@+AKzqvq;Xyx!mfF4;NRE4UON2C1!ylGG6B~97gD%K|RdRFqFnp{x-Ke$j&o1hBuM!%NLR#BQ1&6M^YLl)#0) zDkD&?>f$PWxq~(5Ou7N3>q@b7ZW@N-uJzH+S+em?MF~I(D>p&1Rm(HBl04Kgkso%; zuXYmDmAmwz9VB;WEO6v{QDs=ost1o{wp$(!C37jeRtq*P`&`!@^Hm+z?fHO`s?X#0 znSKAZ=!5J-u(2~9q^BR!1USc8?k|2MNH9)xgbtAOS@uAyi|1EP0dCIFi7+~i4R5?Y zFfTX_h__&U&`<>2lFXBiU|V>y&o41>)nAt`{_%@(JukhOy#)Ed)_iPhe%jW2$=1BR zbt@i{2reXnRYVu3*?zMuN78=?9wuU~mYcZ+v_5LaoLvc861a}FMV-@J^NoJ2{>{hUwX5W#SG=Jfw}VtZHc>OV5cin zq~da!&g7bFI!ih1tz+o?9^B^InWp@d&zEI?yQFhEm)N+qe0qAQ6_05h^l8aFe;Kcc z%2B|AmJ|lHjG%qg{2aNEV41D_ZnLZ)Sv7i@Eh|jrOITSD5?6}~1*R_x4cv!hR`t_l zRi7cn>ol34XX){aotz0K@x1PtV*MRW%#?0uDq_9H#$E|W>;9ZL8mk^`_*j7aI5S&dq^bGP8Qh{5DNa8AKI5 zjp3twj{6Y|RL_s)epY0G6%MOlSJ4^yioB!XobC!a5Mck?@^N<{H-`oDhjue-H^-?lMNTO43LcQ`CLWOC1|BfIwLEMwh->n+7{sYnQr>~I z7K1n|L-E^Z_+k+Eu}gDj+me_7S0!mN2u)Ai;|#NGmb(9fBi|5++D(MaoZ-kXEt0`B zpn^_JiIwM}G4nk0JoIUvXPt-oz>^AbT(B`839H{ccO?Mr>B2jJvDM`Yy%L8arXPFq zI-R1fPHBIhRzhKJ>{_!viM336UqNhAwgk;ZPcoc=U$CU1ubyw@4BpEge_9$0x^h8( ze6B%f{@iW^&1jiF`=YPuzj>)03hGt&yaNnf3+lFr#kwELV{hFr3F2hYm8=s=43Nrn zu2tRC*ZReKVTZY`{o6{u*7h5ddb!4h!3s`J3~Tp&%l0g!>OBWPDf4RmS=NQ3eVJd2 zm)CVsE71|f$PBzPVUD-LkB|s8t;)XAa6vYtceNFMmOHAhsoUfu$i@sa$xU!n-e&Ok zRRGogQvu{ib8<;5id(H#Be8bYdIaGHo%Js_apmQ6ky-Oa10wT9Td_?Y9PcP!LaWLr zZC_B9hIIz4P7);HKIyRg(45iIuMSd~p3*Dz+!vm+JVjE{D@(sL^0!hd<<|;&C8V}X zxgpgVJsGQ6HQG)XtQrv4lu2o;L7xQ0r5#GoG_wexxK8QD;n}R!N7f0J?T5~d)UTXm zc5dV<@Y&Idb0d16nu}US37ZE4TNXr`;*^*iHSLdeH#2Hje+A7fm=LFpd#Ndp65&RT zyP) zW|%u6I!z-xjA)s-5#|eqI*MtfL%%s+lnt>egB@>b)mkQ2(8Mlaeg%VWTe5602_&_M z8N$)|g}^@Qgciol``?KsaBVm2It zdm9E)k(n`WYCGlywBuy%n(2aCCevlfT+;>EKULGEBq|{*C@lI?5)?iZlA!RBkOYN~ zvN6hn03CTntL_(yOPjnjUK-NSb+nLnj0(H?dmpHnCKJ+J7Pnl?Xr5!a$m$p*ny0c{ z%+fGyU(j-)j(L`gC_vW)s-DVnp&qkb(i2%Ou!)0-?sOu8NA9zWIN(DT7%W@|&2lNw zNyjfVFJfA^2&Z2ij$>oDH~36 zzN1$nu zo5e;4A|a9uGARioG1HZtbZ%WFAAymFv33*2<&aE}i7PXk#+{k!S&ir&HZ-~C$I>W$ z9&1a5oLKkX*Y3oP2@1sPqG1tOjFHEV*v(+Rj8WS-O{o{)L#KU)(9}tuuhDmYL>)?+ zu;Jwv7NNBOo=2PcJCH}|cod~?8sl8{SY2$6K8wlLcw{k&{QN&-FH)~A;#f8h_QIHnv1p~-b~%s!;(Qg> z?1Y{6xIBAs3D>9wATz35w$&5ZcDdenJU?v|$uQbz6X}Y@P~5#o_OFyGk5Vsf z9-aH`-ztmd=45;*Dt1{63-a}h;vOq|9;iiCm@B*R;dJOhs5>8D7Y%6$Pcv)IMqqZ; zGTBue3D3cObhl?vaojN_IxCn^-8>L-k@Q3<sI2DV+|uxck}UcqTv_DwazvG$I}GcY%?l|RV*}%w+qe^zmu9P|U=qpSC<)9P>%GhFR~;$64(ymv0NA9kPP(iPMVR;uvAT zs%*JcR#vqmEJK?S$+e(!S~43m?KPz#qkizvNX#CR0hTkVHf)v-m?QaH3lyf)ihGGN zTUKzwCl}~y=sM|))n}XnO07@|Q;Z`?l*%1aM7}a68;TTjAjJTv`hEFNY-Ww}4#5*9J0 zAO%c|5LSj^72a}2V~pb;7h4D{vpBQ0)z4UQW@~!c6@|trOrbOfHpoOTepDelco{SmhWMPwQGGQ&QovJf^Tpd1q?;6*%@wE}KlK6qaFQa>+o_ zXf&eO%!N?=cPO-3IW}P~kYuw6KVI9FC8pz6P;lT0W^$$P}6?AU3J(c>l8 zOl%O1Uf*4M!8HFH3P%|I7pwtJYomMY$6NYKWI+?FPVloO1V!*`c#`YoBVf=w=}?s0IX6!GDQ(>%78)_T=Oxu0`d8R%dCK;Sr70c z3BHzUVyS}~%%t*hgba8T)FcNQF9A;pH1qk}b~;vO1Tj~WL9t^3^{wdCYX1;&4bZL(w!BSp>$#JwsdTeMEe#%T)F1?`vzkgDs|L= z%j)r3%?E1dTvy-N30!>#-PLy^ige<(aJx~1N zm44bqT!^3WQ}-HBpc#HzOa)=t;pZ}ig`mXegTjQ%{W0N>OL)8vo=323-b=3OCD-?o zOjMbdz363ctJe z%|T)!mtmO!T|9}L|E5%Xt5)dzhio0ujVu9NKvFuW_~H&k?1m%KV-RxNEK7#I787iQ z*(}c+KP)9aJ`6|2>jES1jH(kXR>|nZ%(k*fCFy+Fo?grj^&6_*&}UZ3PzUWo4%RUM zsvB%*UZiy001qwf@mL1G<&mR+@>q?M#p5L%u4dDIt)+TgflO=F@a~HxXFUJhmBYHW++%h~H>-(hbIagDhfNDSfc#ryA$u07T&=26HyV|iCQ{IoqC zU(&|papj^X59!HOv8;*WfHfCHHOmq#ep$i<6=7&EZ2!bs?ca0@wXE%b9YP;zi&+kifn! zQ{)*AEO5Qr+}xbdf?Z;3cUX`XVkj0tev{=%L3=au;PU&D91a2UQrG*nV#-f3@h%Xc zcijO+f^?gH+$J7j2A92A%e16*faU;vMCZmL17T&*X9G=lZG;Z`vp57b0ki3z2uE^| zL38lW=SPWBcZS&|mKmV*sjljEh#Wpsq+VM87KbUOYo`&Oi5- zBdn~Komq^4&5f8U-~he_-AhaF2_zAdGL{G^F6KTyIH3@<_g?ZsOfliSLGeb`b9C+C zILwtRsbI#iEzUR{6Ytx?U1c(0kY0kS8|&%a%9wkTtGR z6||RR%WPT8E~diEl_FRLIH5FWy3=zt56|Tt7uHFxj$)|6l8LUSIu@C_%s+Or?tHM} z@pGwu#?;i5G)guXy5x$s+5*m~&UqO@N`!RgnK|Kg%d z{c8I!9RJ`K!&j^vpZJX<4}S#`fm?YvsKv;FV9i=9R%<933IH@hF*JWmtiV#y5sX`_ z0TQelI5vQ$qX!JA!+;^#w+Jw_Ze(-P14bfXaL&)7z+lN}4lr0yssTg4dce@H9x%iT zP7WAlDv=iJeeLOR7tvS5JvpJtemEJjN4N zD`AApVhKTu?}m?bdP3XoY$-#MPW{j-q&h90uDDK=033+EU@wejla1yQ{gdK($5!l= zk|WkDqM%Nyo0dK%6^t^vkC-wRRNwakKI2ixYAz`I1MHTkXqy>jXZ8d`-O=ETWH8sS zf8y+SQ3vaXh!JoOG%*&&a=!){iD+4cuuR}Gow6*(QkXGi$G-ycLmFNH;p;CPOdIGG z3xMVh6k)+fRT-umQw-}Adng4>De;Rp1r}FjCD9N}Op`=Bo8%_RoFb`7_@-cp zOm=h0tV>_HN$rmK*`df!6#8ws%6o?guzTT#qAgQEjtrETu$`gWJu5TaHqaJB9Tub) zIcER}Q=%&cxOEXuCV4g3x%{x3FKp67puuefkJdf;pbli-o)6uV4|^&a|Ai=hMlIJp zWV1Yj_mIs}(fBV$>C+a<6S2=b?ZzDLODp%}4bKlW@Y!|;boy~d{PYybSa-!JR8SYn zCdXcKwrgjpSTHrWi8tcW6dsnxBiM&k*=!5(#J3^+vA7B9CP~G5=uiZ*SWJ6x$D!a| zO+zTSuS&3ch@4|gTnRPKs^G=8tKKwx@q|Jfp_?$32JAsH!59YBmK&ReZwfx22@Is% z<*Xu7w)G6m%=eSR%npRS(sg^TfrWQL>;Aumc0q?7&;%S9zj$4s#oA_Qt$aqsjpc{l zmS{j)JVF@Wq5C*%awQmoorTwnlRpva1O!NF;uq%-AQriXz`&?eMlTXPXHaHYr8!L& zDvO>hLV}AUEc(mlMDWTzgPzdPzHQ8)t9VfPaTZ7wTuGRLE$UBobqB0ik%eWRPh=P; zHJKiE8rw6hz1dhnfP$Tx;^wRYHHDeVhj1ahOksM)3FT9c1kLVg#B{Rez}saqU-c7Z zoz-m?hk+p1Jy!=pD^o5L$+BnN^Df6^1Vpu{=_($8q zFX59+O9@SxmclbxNfM@l`EGjxqd8tvHz&;=qo!GEGOQ)e;Wm}v-Bm#nvd|#`6RcWM zqWv=I3|+%}6*RUpl&UW!BlT^Qs&?x!Ovlc{VLSeVjpFsTA|Dk;dat%?;ie9kZ!8WM zx+uS^I?yrtzrv$K2x`}v4174mu+}PhcEa9nxze?4rrS?1nbKS2XEI2}$f*m7T3GD;w!2rP{jp7Z0AlV-3y?SGkqNG*cJ~6vK+gg#c2H5)nL{jq`AVbkZcv+rCLdbY|9tnJsBjXfJoR1JUoX!oI&f9a|z-ZgH zBOiRI*2xK-MYkiec$r5Qj~6p`-h-GLQovSMb>7429>|LJI->w{+#*vvz_crPpl6+* zj|II7?8jTCu+=dSTjfSSt%-5PiPpl#JZu%?P7)fkRALudD%s6;Bq)Q`N8QRa#KSHU z%bW);{WIfstgV`2cL>G{0yp4N2V($qTE5KoMFT_OrM9%S71tdyab^IEc zBtl9U3frTIyfPh}C}TvM%4oGCG{)2C;LP#)iP3YIVLDyhe3#rr#hr+Y>~$PKW0})m zmC|^4zg&%7G8T=^*qoS{orvC{WB)RcrizynsPH0Yd|MvDj;Z07Y{i;_s+x$-Y=hEgUi|&x%>V|8*Iz0vokGK+7;{ z)d6gETC2)hNEX} zqcwjhd1O8nvyqe<4&nHl)|u%lh(gH9!MoY6m@ZH~O*XT?#V`4S#Xo8^l z)P<@>m`wWiB(`fC7p_@wSrZgy0tTuz~GDI5?C&J452)JR}pt9wEzvdHjc(*Ni{q)L5%HDph~a}p48D; z$gE3k{f!JSlyLg+!gvGnsjqo&oaiQ+_r~)fnx{>cNjL_Q9Ui!KStD8xYd zYeRZlT*0(i19*18ZbkFCKq=u9J)+NG3kH&y6VGL`=iwmm1fKK}vdRTa&95#4ggfOt z$hwBPCeDHy__12~Bc-^m$WldoUbIo8M5e4w(;u94uS~69yi-E%s#EHXcVMkn=IDR} zwT3v5thjE4I5xc+tX4d^u7U}My=#U-S9@da4YC@djogN4z+s5<(bU^oG2UXP?vikD zm~(#2@u%Zd2d+*rY|We@vXMvIa1+E;6kTHi;NZ5Ar!qiB-cevCpa|Oyb0dKeq!)$? z9drw-d-OCH+4kD z(@q1_g>)C-sH7d2TFCF+EMaYz1(uXSha8?yEa@)<6_#LMxBwH-YsKIY726#v2v;yP zvu-ip<$KFzC)zi+5-hnv!K(PSwUKQ=N4G5l4dKb0TPVE*oHFb;NEe1SjA+&Ppk`@6 zeljLT3|-I_%%K1fnt5R8Ah^w$hA!ftm_!9{q!TL3>^M5Ez_8NMN>PVb*5~5hI$jG% zDCeaRX(68${5&I)l6wd_Nz?bmZk2%V4e(w2H>uw0me17y z;m>l`gwMJ)N_SUO)7J25YxuN*rJ6Pvv!+dS&0bec3$@er&@COyX_F@2!;qoCqEq<|n^!7WQ_rPLGGXt#$N)?#twUg!n92j36EfSx zTX6dZ=Co#~^*2Fr@#!eLaZC)yTY&Gdx;_v}!8d>*N+?~UFuD+@?6S}tDJs6f90L%E zLg|*R>=r4StReyy8L^GdU}J*LBC)!GH&9vAmT5Xoah)dm7N|{SU=KR9sz4FaDHM8X z^@x=rhIERYp}kOER%p5wP#D1Mx^qy?WODW>-Ak}LI`YGSw`M3EKXY?V=Fbh-_IitZ z8lcuwypM_@*SFR?dxiKH4?A7qezavBX}nCU0(o_Umk57|uss~7L-OkrONwtEV;w33 z;=}sH79tj7Suzc-e!Oitu49~EZBk3}HmL;;H6F?igj)VZGGWK{+a}=7B%s zRVd_aSRwpJj^Lr}M@za(5I&0fqIV$ZB74uY)n~Nsh;GaB@#Bbb>|I6eM5!L zRQ>tgVY&4>j7EED2rjapSxzqoy5m5J008#X>d(0OY{ji4+|0u#UoKbNjn<7LK!x=HqBrcaDH$-YD?5>FDFi?e?gH{5)x~23TZBfO2SPr7yMK=n*1u1 zWS8!s8b0~9?>%HHoIX<9B25#Y)018D=SolDO)BBry>d<^+5Kxf(P{%hDG#ru5?e*^^L1lMa)p z8BDTw^HVr*rR`$4Qi_7EsTIHhT4?sam;hwfOfMog_b@sP6l^N=MR&U4rS#O?g*fl| zDJA*iFNyfy^!Dc#f09T3BbvBn;(asOi=Y=dG>e?>#9M!BviMtAPMbaZG>WJ9=(}t+ zKaVb(#QIJTO3f(Zg~DDH(~9VVL0yV*6i@bUsMBf`>XzVNI}h6qfwbti6z7vR^veO2 z>Ilsl7U;#arg*@ZbP^+od43gBg*zEZD8B$rYO96)TH(KRpc!05&R%mTGkk#<%o7gK zl(7poi<{e*B|$+cN?*mm1j458HW+fr4*bb4oIwjfFrCW9nJTqjzD)6CFnh-mtQs|9 zyFEcwVuOld3&6|Xh9_L}Mn*_0yW4%x&hX@tE&h`*I6cRJs0Gjl^UR?td5ncutdrhD z$w}-1bfV3S9M$uW#>!*Wb3Ak)q9}tu+!LG-5<)X?hfu={@GSc?6cRq5UfkT{H(n4R zfU()t9nqJQ1VA+`Gx+FrdvlRxpCuSjulWrb&cw-t6vm-quQ{VhQjJA0J8j6F7-j#6 z#=v=Eou_~266mF2bwN+RsenKu zzbO5KxT=6de0l#E{G)+*p>u%C_dF!FxH;%U1#D5Yc_9xl)QC}*U2QSqn?S$QB_LsmR(uxtXzTY@%PCWhUhqKo&-}camksGX^gYRTkx?85t2TR|Oc>)16tf&MUO@Sv`CC2(By+zHEDEldeU+&U zX3T$gCk;!T5GI%(dLY`gRyipwhs>ceIkFnrJy6*|kIJyftjUtfsGkmb%OcChqzy&9 zvDb7sMf>`SCrIx|>O28*a-NVlPcU;$bvsWO5Km}2PZ)5XkQh(UBAP*mk&0iUk68B_ zfeE-)<4oW`!2>FuCYmRlQ4FYnn`d7Ss|T=Wm=LUFY;(q`n$FO)+vvJVp%6oB6#tF> zQc0s2>Fap#ZZ)#IjF}DSi1G#c4JV`DZ%5nGl7&KSVHnNOXq|IiUNtM2HHv4GySPCf zIGRVWbrK-$eg*1S8;xZ@qSx6w5|*s;XtF?DtrYH+>RtLGO$+GB`~)3%NNY(`NGQEA zvxh4!lwQ`=Ym&t(<7O+gLHPEbweE5XZvoM}vo);-nZ$K3d+TYTO#waTn$#Q6AlT(*)Vg5(u!fJXi#${^@L zg|Yh7^0^}i5gI;sP6!%4;~0Phan7kooE>CoG+YT0gpyXOdull7BA_TMfFu$$`;7>` zW%8fyV2ulu%(Z$b^yW_q&ukADD)|hjf7m}ino{}ESp8vEcmRAo>=kwlI}}9HRL9F@ z;}JN8r_(Wr-z&ywCV#PQ{Rq|rgT9%NXlME3F0FzReOjiR@&~d0|70V*LGgIU@ zs!@V2Oh%Obl?)~I1bLp6AOu`VK!2C_f~0+ALmvy{q?g#F>+9dyH>>{IYT8ZDFedi9 zkcaV8$}woV$JASFEh*;4IAiuVq6+d|O>h8o9*G5jUYgj7C_%PBlxV#^o{pwdy;rAr z0z;k!QDOYZaH&dTjEh@7?>Cgt+i$uPg5}iDN7sPO-_&X#VZNV_rY5t)jr0=GwRrNg zUp_~SgfH2L#$-V7a{6;$KIa;6?XY?l+s`TJ!7Ji5-RE^x(bX`xWJ2A8^ory)47mZM z0UeYmzDUdh^)`Z|D^ErvThNfmp%3O@V>TI^^l$foQ9q6_&9Lf_8#Ry8vuQ~CLV9It z1^RMss#$F@bjhd`JTQG5Mx<>E492tDZy>(`8A-XG4hhKo>7lBAl?)2bB+sv2Efdr) zEn6xzZ)-`mEX)H_l?Oq-En5G*a~o_BQCXpAFdc=8c3njyeMTiG#Nc8|SXIBGnfLB- z)p6Mx{ATXBu9qFW*tjk)3zpp!eMR0e(Sx<83cy*jqhEW1-hMbXAYD=em$)`yVaT4q zHR=ft<@5y01D;?DCgf`DpG01kSY4J_Q$3H;8Qwb0B9 zpcG17tJTt1SNuQ%4M1gIBP<*|6;}YE#RO4YG|?Ce*I}=r1G$LNjuLTd`6_D-q)Hk;IteF|A6%JCIAx;RvC^kiyT8%5ctRSQgP;aZ-IMTd0Q zW^rvfCu_<%sb(=RCuEf-#7-lo)K#KJ_EApigc}lQD1To8sQJCA{C%aS2M1~S z`@e#tkx#f@6;|8Jl*Moaj4Y1$#9Q?Q7L-^x7cW^g_fK+WY%bVJ!awSn;`#`Sm?8Zt ze_2*(xU^x;WWc7f*T>msi2={$5E30(ihFB_W^x9;2?SK-)&jauFHTU$F&d{^AWE2=AcwE6z;QpSQWI zxUIM@^iKy|%!?lx;xh;7|4H6r`r&r=qn16`D#0&G6x;1V?Hr99XP+6~))!uz zL%_;BOy${Entbv;{$@E}dms>~+a?HQGuo1o6g)qx3f` ziZ+GNTBQ%OV_hGVpr$%)<;J0=580!VgG#CMXoQaByg;P#R#0<(o4%$p93p`ma^v z3LM^)*6e7jn;@wTc3()k>STPKVh8~&kz=aanLqu@J`ClX?NXl zY)K+RiWltT(0pB8zRE3|m0hC=Fuf`+R+&d~U39I;Sq{%@6$oYn%YM~7j=W~ZHOLZk z1PMSOymWK}Ea{b@W0k6idWRiK7x-$7xguo!&ixxvMf$aZ+mbD>OBJbJdc9g5T_HSf zV-iK0LMjWv?dfn-%zUMd2MOgV!2$f0_PU56Y=Ntg&VC2|L>Y?1-yO`3;tk{7|DEcM zO78HI>s9iOT1nDgk_^Q`N`5*yQyEm0S1LN~MXk}BYeh+WQ8Eq&Z^G9Gq@p9ZRD6B6P9m8xk+?1vd z&ABZzfzg{|Ql_r}d6_4=Q{g6Q?>$}eK4#ZI_4JW179FV^42AE-&fA8v-z)AQb*ED4 z^9|E$u(&(GBKz7{u?uie2vRNdnksn1Pz8{i%En579Q}p^B=nH)RS!vf56RQtL%vuK zm4oW}UhJS>*B8e~y-g|a;hnV}lD68iZ;TZ)^pHa8poc+4@@I#3M zkqlKANqZN`)ZazESQnLp`uSemv_nALPimK?4wBk$sl%iWTk0sOW0pEb>gKnq#7&3V z#f+tHBXzH(W=I{d)ZL_>u+$z>J8xBqy`&zn)B#e5EcFnnqn0{CYWi);_c*B?mYN1| z-tNt$X6)TgQoAj6C#hLW?Iv}=QV)b;iQPwM@aI!NkIEp?dGM=W)e)cuw^MrzhlH+>DJWvSap{jH^DNPWdpca!>> zrS_2eCrj-m^({*sAm!~oMC!Zt?g**xTk3IA|6-|Wkm84yx|!7fveZseKeg1Iq;3Rx zu9u_C*n~KUQuecA>VaSIzHUNQJOg28^nF`x`bhiqeS56fA^QHRO`l#1yw&vGR8B-W zeTV+hr|++%@56$~P)#3cpFT46Paj{Lz{x@Vd@pw2ER21G)P74nLF$O5wm$@I{eiyj zAhp|4caVC}QoBeUwbZ?&Zu>*!n!0fh%18oPa(Ew;~fij86xPMUu};E%GjRBuVo!p2D@z~Iij{MI+wWUT&+)Q z2&chwNO;UqY*ai# z_tDUNEC+oo_TfPIFiI}eRKLnI4ZqN_x!5xurA6SwHKe3FTbKE> zRw;XjPu08SFeueEGhQ?0s_AU}n(rlH~g<^_*>dkmYY{CnE)n3FPFCQ@~w0n zKfP{mCY+xOkF@6?!Zs`veBC6@;(tW!4$-1jv-n(m>8MsRziz7|6vwT13E`=YbrGi# z7qjdRm?m%&Q<1U*#fud7+S*pkj&0dmt0McA*k=fg8=@QClT$ z7KbdNd4T7ZVup7OE$j6fYx;T`U1?rIsmJ5Xwz3U^%80-7I)|-)iqQ7|$aR#}(t(J3 zzhlNVP#i@U(`JVCmyRY{X5@_xg=OkFjS)0Z4wLN=VZbz4G#T-rMm%gIK1)Mix~-U= zJ{oN?P!#QLTlOj5<6MyR1h4WR-&&O}CThF1f9fd?ee;Ks`0otoAd$jWS70UVw+i2br7TBha4!Nja zSO6gy1{gjJ(Q5?*GQCiyVFOK8*w8X;AfjE^&>IgPGrDQxiArqfhH8N?>kv_e3seCv zSQWZ{RyFCAce)dS4{~W?YS=E3!3rM|Eg$>OX`zfJu-7`cQq35<3L11}Skr|19zd&} z(XXvr=XMHI0+TohN~i^b(i`qO&_jVPy}pJ1_2JauJe=Z99jAId1OO~M-9RvD`EGtX)`9%Ri^TM?SV$41LqT^$$LW_E=mh;3XSl|FY(hJ698igC znhlk}b2%i+0Z`5KwNS+F#zn-)2e8`iIcG*T6qconSknPMLjh`?ZW8`tYhA^YV_LT0 ztLiQJQ(xAibsgZ|s;FWIPPbN%aADd$s=BHgIx38{RcW?;i0Ad!*}e{ZT&zwStg1a> zn>daxfywq)zw|n=XR+#O`?%Ggbn^-t5@V=4z-)_0>y)r$S|^|#7fZh1uzhq|;eoV4 z)|xC@2N!a&gZ~KEs3r$qx?)?g;x(`&MXaB!ATqv7?z#vIh=lKA9&;rUT-&6aIuJV1$30F>A`MmCqhcyso!@e#jPs4-$RhQPU_IRMfTg*4 zalzzOE-I3sSSo02)?J5QpZw3F&B^p#aXex=;0o6Pm-R0Ji@Fxj0nz#pGbl^Meb*c& zXlQ!N>B?Fmf)Rs2bF{uSxy4`gYkO-|0Bx$+WZK@9DzR4zT4z%gOng$6WUguq;$`=Vt!Zma;$YFdjsw#q=J1tT?QKPJ=KYZ*Rc? z47*epISflWOV>Ij-us3V^4`x3Xu+vZCv*wj(gc`{Zn=!set5uzyYZYDSsG?IF^0u2 z1r#u?tWdbHh4CSm5vc&in zyq{a&JegdtZy}*r|30_9kDKD6;g$*^<2)x$P;{rC0R5R=44(iC!*Z_1E1qQP8^s8k zCV5DK3Lwvj^!Vv%&fjy21}A`-BTP_9dLTq+=G*`|ag(`9Ks{4)Td`g(kV)2->o5Vo zC|g1qlvf5aT7lzboCAUB*~X=CfIf)p{Jvh@L;=m!g6bbn8se220$FG`g5-#q9gssF zof0{`>4fBf$&XlIubsB%SOeJ)TD4_$Tj7)Cq_Z4{q={hSzg{8E6a*KN;)yS{^JHcA zWCPr2WH%~YCqy0p8o@w8!)aUuw`AB}$>t@EB#Bw}_Y>oo zHe@4+q_`oZ+~%;WYk&@x!CEomkUA_RK^@eME$U!U>pdt=9V#L%OsIq9;$M1IU6Rrb zb4%E}MVt|9)Y;&S2+K)agY0gLdGd8EvMn-%2gb>SkMibBv2`Ggfn57w74aVda>5&!hAIYP^=V?){3n}*M5S=!df&=m@V?qM5nCs7);^_2a2iO$GX zJRJg>sR4D(BnYH{43Y&v4<aD^9N>{vCn zVQWAd0UCgsrd$mS1dMAvJTCkE!xoXp5WYMFUJVU6NK}{^^H2tZXuTqOsPd zrg@TCEU6gkacZZ+MQ{YSkao0PXgaMyUK4IuiF$Fd6tEFz4yI(X@~Gtjo6Pn3xNI+3?`y$+-~H*$9A z&Ktu|nk|EKVNh_#GAg%2mr6Iyh6u2NxECq3jGoB#r-Fo)y_Abz!DJB*AM{WlKcphJ zxNsfRcSH8E@4jj$T!h+nz85mxw85}V15 zoMfR>pD!ipUJibRYuekLQCtjm-{<=77=0|xQb-0~!*15)U|e=qle9q1;BHvU8FA%$ zQX5=mgEvRY>6pow9qNirlOv+VFU7OMT=`3T<-!cXigG%zY-I~W znMnpa#j%~h1qGTXaWq85{=YP|vp4a!&6sGpovsT5s+crtD%>o62_RQt7@MR=Sx3BB z9Z)$ItTeMwmw4kvwRwZUy%J4w=!m`Xj!27=8H_dJ%%Fyz5`+Oe$`KHy7P`-Y9HxOG zc{FMKKl{{JI>xW?yGiUTV!70P#dwtqIU*4uyB2mwuo|292)t{g_MpXVj}68`^v|LU zO63Cw38*-zK@v&ZEuQUyPMM;%qOWk`(wK?BC8l%OA~lGyAk{{*J`N zO-uIV{te3y$|tZc5lYCPz#b?t*a(u zEuAuNC)RuV@;!?*rM(~1z_Tm8%p*K)r;6|jg?v^c3-*_XOi-t$jz7i`f|TXwigIq2 z>0@m@m0uPgI1wcT|JCM(v@d>tIxFsEQjQ+BN!dk`pKwCu*8K2>!K52-6cNw#Rw#`) zD+$PApAyQ+hvLp}v$xsbIWh1neKDgWswqy1j)%QdGoky|bby{02l-yr^KjPnc z6nEZe-<5o@`hL{E^C)({-o7jOQ1$%@|IVYhdAogA@^JNi+7XjSG5rSnuH+-t_nZ7X zkK)cZ+IJ-%ufFf_?>vfqZ?f-79;?3Z^zS^1M{ct3N^Y;pvrc@ zvmNwo{3>=#TN_I5t+E~RY&?n`Z?W%6-dv6Bh=1o%-1PhQUCGOqNfPzjP(cla{sm16=zSPl9mQl)!j|%txiw#&b}d* zEr})(qf}W~(=|i`;X;!}mB5bx^5MsX9+-l7I{pQ*kX;@Ay;4eRHp_-CHi*j0cnu5w zp)9+}kiNylDm;HD4j%J@xAv>$Vl!jlfB$tWowt(S+$O0Rih_HBya{i98 zF4%e3V6y#7O-{XR-k{k3+~4)h*))MdWxxCSW*>TeyCs~x-rFs@eXta_2wx_av zF=mFe(1GlgU@59>c2ueuu7q{j7df{MJmLRd48}%byGe$>2QAIn>e)42$<95N0>z76 zmLk-mxRca&CEh+_*HcJ=QzwW(`y+XQtX+ZQ&c;jCeD+FBg??fg4Q8(d=31lKwi#3~ z$4$nxv0kg#2B;xHe;guL%WM`JV-@V-2q!D%4XYE|vR7pvB(9F}Xyc{un+oOhgAN%b z3j_V=kdNdVtBsPw5*q5t!3Ha{EWCNQveyryYgiv`8mR|dc)zsM;p}$Kn-yLR>5n!y zP#56NUd{7p0~*WY^czi1Dg$eGbI!86KnAou5kIZn=19)jL6o8g1T<2`VT`A5=?5U& zX)BKg%NgP4PIpZeGo0`OI57)*-*)tW8{r$-I`~~#<2kHt-N<>_ojL6@C2C)D_rTz0 zEdr^@>~?F9b0P-2-14Z4BZdS|-ECOHb|ib#AYVoRv92Q|wBGg*3B5>xUVifkHE{nR zHy%>MUCML}~^95WPq!u|@7*K~oD5Ra7dI`UyI z7klf7ww@Pj9MRSrWZJYxTYDQ_%w3(hG7QqNc|oYf`9X$SyfV}pr7+x%2u$*f8e&m7 zQJfD8XyAh4IUTX2Fn4v>grn7Jby-YZm^CDv5sSej*NF%=pfz^6(i+{0sFQxo&fnXp z;nZq%Gwr;%RQ5mT z)BI*8!ASn2_(9?=J+fCxs<*!%vA-X-zle-L_DDKXLY-+#30IF{oxM?s6OsLE`>6i4 zPl4!P+eh=KLhzddwcFsc9w#{nqB+u%0%@I- zP`u(KpX%cz56RzN=On6t&06;N3-5)Hn&1 z*Ez|_un~?|FL{U!Wo`5Y!_?2mJsxsLTtn3w4>43-n1=|a{XFD=ODN|d|3|;Ws_(>! zDEp#3RX9ly8z`G7#*n|S?ttw0y>%!|BAPtr*@@X-ew zP#@~99|KD_R`5$3RvQz^1TH?#EznM8&KqP69c2NAy+UNlQ!6YN>lK+eD3B*>5kK^U zNgL)P0!8BAPOmbeUQ>~({X{Q!5?-eF^<6Du>fxI)0`N+zJAbOhleJX50fgla-*J|q zzZO?3aazgaFb;W+Iq67YsTw<*{<|zU0&iYl9saped!!}VT6!EM0<@1H$v!HUY>uXZ zZj@S~S7z@C#wWEX#4*!xv+; z3mIv?7O<=f*tqi0kdvd}bqYQ8W3vbmIc1ksEd!|zm1$&u!Qp9=|s1l z@R{?~8d9X`DnuT;jxcNVouuyw0OH(@5l}-)ctjN}&t`8K>_!>)5hte5ZH&+fn3#`i zeSIXmmABGA^y&v_y0uq8CHoh7jp$*N{iUUp?JpD*Jd%9^1+gsoLt>F?C8O+qJNink zzxh9;bqi|qh12v04ac3MoNVmMIk_M^w^pT9|;m>Dc zVR&%_rPfi%GL|^>8A>@4?X_ADq2Ap*DAJCKAAf6b4J%*K$Ax2$f6FeSZ|oNIORema zR%V*^P^=fxxEyQETmm=tLa*T0Wbx*PwoCA__AYr1TCmF{*dgo@surp$hH+i=86jI@ zM>q1o$H8mIWV{hxjZUy)w2AqSft2@M6Ry3imcq2UMT z+3`>k8Vwj2=s|5-^1?sm$HHj^m$~HO>k_iDjLJdrc z)ts<}$X=Fn9S|`Uh*K<)rlsix=@$QSvybRSlUtTyK{3~=A`)AITAS-gtn%nmu9&;yZ!)HlpoQ(_L~Ljd;%w(F(o2}Pg4AkpXAO;i_s z=S5igd zi-95(l{&sqEKAmf;w}Fnt=EO(*Xu+#!u*Kn@To0xLL-$yivuD$9+PIC;p&0tj0~C# z+RGqEa^q+Ev%;u}gdM14GDd$;6P>moPZGQd)Q2MJA6A!&H0{^P(3T5Dh9=Ke2)C^L zRb~D~>G9h^>d$aoe~)ay6eAm9j5J0`eUSlvH2d3=`XF48`a-=P>D&^7!W6;?cG|Iw z##nfL3#DA@-)8k~N9;QJ^rZfqM6;#TpLVH_OyuQT?C%fpvtR_Dl+?d14pRS{wn@^U zRJ}Wn$hRvZjwAA^<0*-J`cB6+nr8MLC}c8^kn#M~Ghv;Il+UBk+X(_(|mCMMNM=Lc@uP zvnp=T@!nWoI*3kIeq5Yhf1mf>ck1ug_TI0@2Jay73EwGCgiHC2T-CyqE--*4{z{tu zp6lB?kN_U5+$sfgbwBwDi1B-Hul-UWp;=d`4*{t-E3ooS5O zKW1Gd_~ z>;#dA_V=NfaH=K{m5_O7oIRct&jiwhr83Oy{g9;R3chJUC$}pxB{I!SUc(E`55Jq) z+f=Txj;U|jMPPg@9$7LeW0H8yDq|cnQd^fWt1aYey)@kTEt?Pjy@E-bW`)+uafG)u zP%C%-qU9c}Q&}lGPDR`>`^Na&U807axLla2vRN4iB5vs>SXXV1Y|n?T)%M9x#q~c5(yW;k#9R9~Ap^qGLD@N|?5y(LG1y+=@8OxX_wO2PFXz43qSHbfT7dgtZYXA* z(@@2ezNrJPMLa*k7n)DWm+73c+d{4TtWIkNOMG4u`i^x9yc4( zf?b6`G)9a*5+(CCmZ`QUYPB7$)pn#-+o6-G?KJh6(biz_NY-9D|Lym(_PE|6@M?L# zo3(NH$!S`D`<<)}#SdsDyO#Gz)?T8%SCjDVtj(PYnwnH3e=H0 zFeF~rmcW4g0UKT@#gqt~dvHSOTu^~?cStV;PJF5kPL6HRzQU?ghcjKrFjyQ3g*9J? zLRt+RtTk}pI1N$MTX9PGXXm&q>x23`2esX2 zKpx=QDE}$b{*YGjOpI29ZjH6e(_YK?4W?I!uS@3!%S-2eOP+I-;vmW_#Y%x`Ho8p9 zh{u)<*~nMQIQzWXPMkNzZh~y~ZjH*7uB&376mJf#l`rCwN;J6o1$U9pL~Nxcwt}-3 zHQL5z8^}c4arRF1EP6(Vt1V+MJ*kR>i6C;Vs(1Z+s)FOxs=8x-RnJ490fLgH)MkB| zOW>;!c=}henDjS%9JtU7AT=aq8+wJLts0WHiXM{I8*?QU8Za=)eTAC%{~$`ChB@r8Ku>nnpQcl+~Qj0&qDwD*Z)oW*XR25FW~+}(7!&=uYZ}r zdt&`-9#l?J|C(3sNXfKzOcFaizy@X z^q1h_T;EerE#K;HP;54oA6%m`9akESVMDc-#2hWMvJF{Q4zAupGzBqfmPMky>$`4S60_-MCPuG@*@PzD>u`D}9 zZxYR~h#@N@4Lq3>#)q3p)#+jNwpLY>P{# zS5R=ggU1My!OmD!XyYYhnV?ONSSIdly_YGTE~Heo{9V79fy>AOI_EYn=RwIU7sz;k z)ss)g9!#!4)oBg)C}EP;6BZDN>QIPdt9Uwb67%|`9#b<4g4$tuNVk5f=rNWks_qa( zUG*jR65w`!9=RTFPpl(E2y;GShXsR*IT{MV$@Rd(m&vjvFFlrVtJR#^M#i>&0m{l;_3wFU)d)4$ zSdrD*;r^%&lpTgM*alT2!_3*hGF!R4+j(w%k_z(A0X9|OH&x8*=)X`!Q5yX zbI%E0iJGX4zf4kvS1)J?^QfyYhhbhSy0qB=^@`bmPQo?NX)u|<1TN93uLJ5H9T?&f zLT2{UY}I@Zk6s{LEBZc)T!ld7Uc=z(6Ke>hS5(y^Si%uVfv!RzbrFAn;ZNwI=+0{4 z69aVo;hPPM7s8(b$DaY=4;2Ue*-sBfD7DGaN60f|1K4Yb1L5l1|Ht0Dz*$z+cfR{^ z-uqPbuIdIF3U!}jn>5m`9Ytt~rfZkb#Y-gyGR$0W;=RNDjCPR>)ga*}K$n8pW;AJ| zQ8eD9C7FRlm@p#~NyN}GN>E9Hi6$hXc4Bl$G}`8&fRDc4-+!&W&pxM4^@~QEeBe=M zKh|E4|N6hzfBlz39)5*8*5R|%o;=H*gEWLThCqg};w3I9^-ul5Y$(Ek%xUox>E~;0 zuHW&+CgU)E@r)z{D#wk&~|4}SXDtIx#H5wqxN5uezOU5Bt>#!sD ziUH-jJ-65L!FxQjAB^zr%SQ;-VC z#4kgvq-Q?bQ)cJY*sK~~wkw^Wqu4iN*PbzZ9~9frg#jlIe2wc1U!yqZCJ>D@;aYhH z!%f>_L0BW$|TyHhMSiZq0A=A&IZl?0YF4APUfEtKRUeMCB#UHudl)L`89 zK1jb|(%#?vtJsq(_IcV$V~V-k-@|MaIYXxMhr83}>k=m<-c4y*Cywd0#e4ISvUMmo z5^Zy=j>R-@65U40?|U^(v}2s8RMTF`@Cz;N5)(4;bFZWs1Dsv(D%yi$im)3~(PkG` z)X-4&g%fnkX=u`a+&z&WOoPT_=!KH!v@@w@n}#*B-L^0ctvkL`Xl6@A#EUrTBdY8X z7~NRS>;Wyy-*0;7A!}xQ<25s?rE-&xr8b1@DKxXuf)Yi`G_yU_26jr9Ia1B+e!3x8 zS$75!^^6#-RbQl;4V975FEz9KNfADxnduQV9+qZinmi*O*35X|G_!DwW_CYX>Y-_7 zzb;%^Ni#DnsA^_Q78v8DYoSb)wug}7J|P9c&f}G--9idBpB!A7qNG=qT;%j}Woop9 zA(j%%m9A)Y~f+7PPR;GC1 zlqs9?5oPKqQxDR4|`hf}6LJR;N%s!R#9P*mz#8PSYOQ#DIW zsz%c(Q&OdPUR5=`D#fxAOvzSNDw>9TOd`l3{po8+oI-!%<&dV~8JX9gw$lU6D$KiY z;=>Crg32$;SgyEin@xHVL|DXHRkMibMv5rOvSBVhY}sBFxF zLW3%B9ILTa;b?%V=%K@KJUA|l=rhM4E*!zcj10=8=)rX91F2{tkE1&=Cos!GZm3p2 z;rY;9c<#c{RI46)oNCqG2UM#FC)5$FrdDao!U5H)A1*y}7DXpBD?s~;#0>6J=ACB# z^BDA@Z6S9YB7$3srzKBwAi|VK3lhw96&SqEUq~83{+;_<`gx3>rPwvJw@`l+miPeF zF75O|xewr!CdH?QB_3578)5_`RNZ; zrieH!BcM)C*r-megW45mXZ2I--Ke}) z8L?ZrMG540o4#eq7W^O-4Mr*T`kRq$Eu!@@!pk@vZIj@NR&-*zI6NHDWps6MhX0L7 zecQp2OQH2`Ql|!Bn{IrR!(bQMgHk&qZT)KK56wG;LwQEcERf@-v#HbnHhPO|Eo7{eqSJeaQX- zB{#`;tu)DZ(o>2%g0e}LS;r)c&uEexev%)y(SUQFz8C=C9`+>PX_HK4ZjwomQO}ie zgr7UrWio}>BtIw!YDnJ3gy4MUT~VE%WL4wiDs7U5%Ectx<{7H%!bVib=p+;Cqt=v& zD3KAU8wM1ow>DoGt2=|nrSkYW9YA6HoIWf8;OA7mu{nh@me1)ePtED~Zccx*xmj+! zCwfkQb1M0DpYB`Yu%uJOA#B9NVU)f@hogByO>fg;P2KV;=n;#Udi4Y<0Z2_%0+qBZ1)z4lODrou%LL${c1h`~0E8bo0wr%0bxHs_;*&#MjSSIc z(+NTMQI#Ae_#HVOG8r1}(`_~@roYvcce&bHg%Ag$9Z!fREw!!ERp2fPiTOK?aMB#} zT_w6k4CfEu;j&N4wM_g7xnOmIdHxl9JQcD*5;@k!WfG>BoP@O2fB-JV`#Kl`$Cz{^ zgc&DO_lZ1L%4+=C7F}o_E5!Xa`JVVfNm)Z~sX#j|@r9{mE&ooKe!E%pq=|!ar~~rR z)yfVut<83ps09?XUIzx4oJ|?B2eo>Q+UP@+lY?6-KKf>S)Z8vpkG%` zHNHclvF@s^fNt{`hy95)Ms!79ZpH8S$skDs2uULRojwz3WZJsyhLqSQ71s-EG@6W} zKo!w|b49AkR{mWZE{ajkQoiAEOhXxP*ZKARN%f3F7pPaw!<_?l6X~R!_fRw6x%>#? z+{z2q)vh^?c{Gmhd!udt2_vU4(f+_E_wG=7z1W+yHxW7thZMxTGUsQMU$@w+7f+a4 z>e|j?kK{4Y*w!8P9mrg^zR|jN5;R`U`}o|&ewX}nyy5f;|JpXwx*fDHX8@Aw-I=~C z3Q6h=zwQhQVm%krFpQX#isBk{Du|f+|liWqrp@i&zGYKvv&0$8CFW(_Y|`` zip=hPw%+|jFuSKDl5Mf`{oj6yvW_BU{r4wKjToA=|1p)E zibiE@T3UeRNYZ`RHcrB6abK`e#D3GK^h6hqeKe@@x1TW9IW)m{P9^^oI!_C($#RRw zT81EX$uGb*@*U_O^23|>)=DhbNK_O*_RGkJ#TTX+vF#(^NR|)@j^WK-ZEbQf+dGgB z=C08Bq(9nn7DnjMR+3_Gi8&Iqw}h5hz-4iOAO*`S#L9{-`|?H?T7;&;P`e)+TeUl! zKCG4Yg@V*wNdGSiG@N44z%OFHz?+o-QTBmUK11G8GmuUKst>8DF*;hDQ_kthIytN5 z$15mEk6VL6$Qf68Xbtm#6>zc~k_Z76@e-$^sYm=P%?3@COr-Y*Qgg{~Aq8977l|yI zq^}TF*)T3hjOw`6N9Z^xYg9-6Qq&x-E?uGGhYnWpE5}xRsjJwlnHrUQpyBjcm3QL^ zZ5(oPnZA92y68g93;ne0BHvt!(kCT!_@h^j`^YyR%rm_?}yxfKUXiMl~K1(w8 z0LM;QcjJAq9~=0Aoj23+9~`+4cBlDZSqM$tHVkGQTkZ&buvC`*$|3n+A9X%heNgQ3 zV9eI`VftVP1F-!e%Y3jqqn^ftRq1`OyGDGlyQ^mZE^qeV`i9<(;W|b@Q`m0+daqPINhN#K+i?h2dlOG`i9_ZJl_y}Rd1cA zaf}c4ADj`C$T};Oq{^b(Az z6JBlyxQT&s51Y1o(k)p*6DROtS-b8___V&{kv0put03JOl5-Kh)?oiCy*NEmWG;+a ztHyotMLKwTbSZoQHhh75_iFAik%_GllOQ%uJVIe{e8-xmeiRbP4+|`cwz&|N#4gWf z>4FxQDP3D|8FOvHWt?7I;Ch_{Zsj)mT!G_zxEQ<60E-xPY4P0{7qqCeo)6dyIL^0+ zjpJJ4sppQpa8Y$Zo2P3-@Oi`W&k4teU0oFyw8!xZ(}{*HjE%vOxS-|xDqYZn#zCXP z1wDYmc$9`mF{dM*FUO}wmKE+ExS*e!Q&ImDIj4mS`U#%X-=9iuie2WimFCpDpaN9T-4lp*_S&r_Iddf?;0+ygoh9~b66#Zw+1 zPdT9H@Nvz|5Dk6gDH?jbG;~0B;nAC^d#94W3)!C-kvuLBhs=qSvheIII(s|EW8=y| zmHPzeNFW$E^--&tS1j_UyO?)50~%$~2?G*cBX(qLV0bu_q2Tk%f~}H;D9|n=XJ+&Z zs{;4Lz^+g>+9AV227)XKeq>)fZ49fIMIplibHN)H9Qwuql6mx$Hu5;Nkpp@+j~+gL zY%00mo4567nR$zehn6s8)RHf26wka7Tj~=;ORZ?Vl5kIF~_rWOsiKAZ0;q%#@c;|;;VdQ4!0>+z=#io`@3lzt`+#{5j4uQSA&`IQDfBQ_8W7s1EA ztcWLUoaWx=#MOa)PT3Gqg1r|oC!Q!lVlNZqNiy0@3i!XjnH&i4KuUnu&vL*k`hx)* ztVRL<7QdHy7YBp+G%uROwsUGJV@Vc}9~%*7kc+j%?`7;wC7^3(MPGXqp*B2~$qp4_M$TR(&X1`;LeT*|!9)G~UUmXFFDjlKGms)Smr;CXegxYMNB38#K z3wQ>5_1F!lMTie`pYD%YIbqXuWXA|F(gxs~j2a5ZVSg{sP}gd@vK1yW_sP*j#E3x( zKBS$>v0`UpHC6Xx5w!jtL1tvWg#4L2RkL|>~q8L1u1DPVvzea`ye6f&w{3To+JP4#Po3BVQ6B@${! zucc8cbXUi*S#w+a4cg;LO9K(~amhO9>npY?8T5;Gdm<47x%MwrK;BX^e(N-wMi^51 zSDdH>)N-98sg|?$g#7ykY5`EON?pL`#!e3XZM_=k)b;?b6@BG7-4l=n{3>`=fq}QK z#LaNBmd=?pzjVA@aC`Nz$|WRr55grB2yI0Ug#~!I{PY8`036MdTr6+K$+ttXaW)X- zZ~Eg_{`34FuA%; zd?d-^{NW`3og{yjI8Vx{mDPejP!#+V7W48YPAKi>KRB-7`l8^c(OvVKIF+}PpW+MF ztj1>-CH`7%?&cKMZhq=ei48@G&#AFJoZgz`8(oRy194bak_Ds?e90j^bQwT7#GXru zk2v!uN`RIZJSbiPTwx-PkvK+;OCe|HiLXFmpnWW)BV29k1iY2f9BM>k%9#R%vOQhl zrm@ghVTV*k9kc=3a$cnBhQ}{(BD>Dxt0{mG@M&c@bX=jHSW6Iynh|wPz!5kPLah+2 zCqBflzKE$vEZMaYKn6 zULBr#sXt#{L4BGP%r>Z)l0A}L>hvtCtR>$P8G{={7qDeVHKxC7ah}dEn1#x)AiyC; z_@fiDe@~$gMd)R2OZW6Xo&}lM?_;aZGA}buW^}$qXeYFcym|-3G*+uB|HQpSr_NAg z;yNoN3g!zL%NoDcp5O7&W{p>I1j#)SM|ql+p+D^V{_C&(C32{dehMJz5n@T#W{HrsT-WeB z_%kPysFQZ<1R7L zeWD`~mZ*|U50kDoh?TYQ4!a}PSHZL3hFR2Vv%QT(`+?||>SFxpA;iigNuE!*$^ekB zjLurJ23J}1QuRKIR9OV_02Xb8K(1Mxs0U6ulNw2xWe{Hr3?n$FAI|_1;$1T?>XsPk zSP=rx5S4>sZqadA53CA-Hl@;U)W}-DuB0n%Q-gxie-s0Y98rWkiD!-t0e8|Nj%~Gu zVK{6#|F@-IttB0vR^7*ukt2}L z>*@bM=+#nAtcwap^8yztvQ{Fb&D8)Qal8%lGY3p`X1Oh#@6F+)(9j`dZ8<_(twKmYeecxt zxrYN>lq$^OhQqj6OP5~uaW)kCO^WqScda71clhi%$&A~#HO$iCPhy@B*+JY-#D9X}9w#t$<3 zfI*Geek5D&I8uM7PS1J~D5Du)-wR`O6nrbfIk20R0&z`Kjn*mrT%|IsG%lwI*VmfD zM}e7j;p&76f;(4sbxeS_vt#F8xH1JYOnUB-v@FXgk-F1{~8)DKu$y;6hCv z3!MYbn=E$74|BaEeJ|%VI0cs|*p0yks*UnB+wkCpHtp$xAaD6+$sB^6<1CL%9&+8v z3r>0K2?GElb%-r6;;~jTWf`d?md~Rx+!GKZ&$PZoE<)+uNcu`sypY3=*3YMizUC$0 z$l6)E4KI}MRK}rjyr(h-OlfcofflBJ-eeB)9rD0Mh3TVXE0|1;PA-ZFJm>%O*h325 zqe`eVAU@EyDRBmXN&hTnt;;QPsh^CJ+5;UF%0oV7tXYaH9*0iy1AOhj*Ksf`-O`;$ zI2g~7DZ757GlLBZrZ!LLiW6Z>@Pxr!oB#y!!>xf zG}g{x_v8?EL&UHF5G`J)Bsd_x?#Y{jB=@;GcB!uiWkXyyW`)5YMdDy?0xmDYGrV zVO*c}@Scc1-$q~Vc76VhqR+g{Z@tUD#A4#B zh0k^tpZ&&P*k^Zqva9F%3s&|zreAa&Rx75TUoMVh;o)%P_M1&&TC(W&xf5@k-JA@ zeLpDbq%S{C0ewrqx%*L4=%{>r$mO^H8}{0ZH$s5$>jkpqPu~#;|1X!c>Amt4&3|sgw96THc`v1$JD_OuLpdB(wrV4$yRD zO`D@Kl6}13YDfsj@qrqV0;S^}`A6;*mjShPWl0+H`?$!`OMzt)&F1%8fqsPEp*Ixn zh4E|_0%tN>p_)jM0Oq(ph#19E$s!9Il|dK!>a&12S6!>%l@eBJ!_~&4+Lh`3SOp|n zxBBrfpixMh;ojEjl0jM8G%yo*!I3#%a__N=K3ogi($uD-WqSRz--#ekV(n}>5zo#D zjmw&6XDx2GXYCOe;`VG+{&S1ONOah_)){@NIE+;~6nG5+z*VJn;T1-Vuwj zW}$Z+^To49`Rw?G-U;BGRv-|-{nc4gs)K2kIDKo%tApKawYkr@_v&Dpb%%=33tpN! zSiCCAMzh&Op$<-obxlwkvy}1}t*%cB4d0GET+1w)I_TeXTd0GR`Y_R^VKU*5dV5S1oQE9^Ku5bv1mT9kuL{GcOl;0MxO&kr=al7}>7 zy$*+0#=@2Yb6EWZ)sz%WN+n#OP$~r$DV01$m6IBZiYoUZhc8bn7x12YyZX7?{oKjV z4FhrwAlF$2fFq1Jh;8XhAc;GK)cCD%v1+B~QaOkqOk2elPYp8Sq4l zJfy;1zlBn##&r?#b;M`#-x=Y;7L@BCF!mrHgmb^iL4jY``O5$n(holIy1`&{lM_I_mVB+gh5J69BUFjsL79x;M~_dC^G zZgiM_Ap#HxE#}%>#m_@=bm{^;Tm`D_a!B!%tx?vIyi0w`IX8@zq&+%{9H0kDYPv z`^e$bd_}bcc;(M_OS8|y_gZv^I%0_D^A}e38S7x`8wIU%m=;XfPnPBO2N|c%cXiOunZqA~c9sJ9p(H{g0lV{f2{9CKF`6t$&Huvt2{kpfcT2QOELszgC z@ut>}IQ|?=XIUYOHR^|htrj1bUzhJtd|X54iB}7Jr6@p$TmeAJ33&>-b-|x>niUt2 zodW2a8eyD2cM&grzcu4?MrPZQVXc{dl7A-HD(poJebuHi$-f{TA^_`uyz7=xvq@&k zH2qRjA$_Cxi$YT3ufQbyWiVs$*OfI~p{O}MHNfTgOEXz`TYm~lp?AWozER_=Njzzv zBZSnFClW=h!lmek79Hj64eX-=8Od5Yn6=?6hW;RPNVsf*M}vQ$oLU%$N!{*ZdtOW6 z#0f>2ZUvK`FYsKMe?3?v)ZR`%MWW!w{3cPT(BPbF-4E;9ADx&)>6mCM`F5)}WjVNe z)7j)?TyHeNfF%D~xCr1yqS{`S@5o;lk%5XE4Ev1t|IDPwsl#pVex9SB)5B+X?c7wn z&_Y>e`g0&iYxr}5CwL9KnDX9)XA3-J46PZ75t!6Q(Qz&REa(7UQOi77G+`;d+-<*c zX7DmW8)HYWb$=Zi2Gv4{;(Z0KSyhCyt)k#(O(1oMAQuIyhb@#ZH6z|`BssyC@@s_) z))QH2EnA?0eX0O{S;2(UdbHeD%O+GTcIm1n#M5yZ*~^}*uVx{ox$1x>I#v}l0a~Dh zr?*Z6|FKg9?Vk;#_XSR`Yi3hFLVz(r>B9Xf;XZ9OvuUpXM){Zp8+W@`DYr!#+{(`5 zQ!G2dN^B~B2DLJ`qCS`hXcEr%C(sQtMG$uR)p45W3xG`9i{>~h_tuCWhX5d!2XY`P z9Qil`h^c#&)cS(O#-JzFoOwDkm;rW{V17mmaP|CFavHI%CeE*e>}f-p7YNirnP(|IOm$YKXRTe$P$}rWY+t4ebktHVz zId`Zq1wedRX-%8lph22y;(U#5L2*!RXxwOJsqQAqb+)Zq)H85YQr>lm2Eo_?mo(vS zuMqXu^rtU`Y^Jj5S1fLys7JHR5)|d|D(j#V3ICc3Kw#EdysFHwX{6eKWq>rtu>fga zMArq+xhe`prh}vvQI8p8bZbHv{RV{-?nv)#6bWX~j%?M8idm1^>5pX{Er-|9o@5BG zO1{yK8aryx;YmAUe}bu1sv?W>Q(1!xLe}8m zp#k?Bw?cIWRTl{1^{i@5E~_(j^&;$EI`E$t`EZl5fdWYm-i!Pv7m*_}UelhB$f&K@ zBUdv7sKK2OhOXNrajIc0(M*aj%?E$~ekpF^fIV0u)1Du0ANG<*^MxbFau zDVnk$a?$f#AVrMtZOL6HFvWRW8@)h0NKqP-1?wEfn0*~UI?Uho{x97ho;xEZ5#HXT z)6{-Ge5f_oxlVlM_FiW&s|TYFY#CSg`Lf2Z>9^+IP4#Nx#Q(r{1FMu1aO2ziow*%v zxI|>s0Y2zLmC>^KhllFNOU){Re&G@e+JsU94~`i^q>P`7j8meJh4+5p>zmm#c^Gi; zlW3J01ZoBW+NNcJ11<-(wy*1V==0qE@cMp2zki&Obh6}{9(f>-q&1e0Ve=fVnmz_| zN4K~TKnS%I%C9pVOA3Hs(2!Ti)Jp?_{*C zix3-vu8mqSxbcQw>re-arq9099~TU(QwGK>N@VZ|OOrMZ8HN?gaR~DfTirl$o@3La zalqx&)SBDzqhJo=PktZ6Gy81rI?zr#WE;2j+i%F)*BWsf>CFWRQ|kj$TgkmcE4WS% z%Xi(<%pcgKK#3*oyeaXQTJoFPawD*1GdFgJHI?sDW>P-LPj%&)YLb}p0G62lQy?dY zdGFkVzcHQOwyG)QCBt=xk~#_DFSYEzO}Pb^T0}tMJ;~)2Aiigk_$C03x82GtrRW-z>+roQ`aCje zJ-?shcOAc9;5XyHTqh7Q?nb=5I@fS9=EFMkuK;K=*5)@_bs zY`lCC10;Yro@f~;7fyXZWv9F%+9ckD%m(g6iS)70Z&=AjDcVb%iPQsvo!Zbln;j(V;>#SKg9W^oE-k;HW+l%wAM}o6EkH=c-Kh5q zST6&p-Wt1jNRCz*jfb4XcPtOG%WhNnlm`K)=trf)YfQlDs+9sxeM~AO!qsW);m=&r zA|kc)w{|(f!`9|Uzvz@-xB`_gI_?Vy1+75d6|TJdc4X;3ht6@2z9c9^Q~)7pnM0KT zu<)H}+{LsdFe!$Ch{4j?ZMQDdP)Q^}D zKTxjp){FRo*IdXCKE7A;({VoA$t0UhHV*uF5H)jY-}%Lp8(xo(i4CeuvU8&*3;`^O z(mSRtWrM?*i@-LRDutFf?jla##TH@CPZ0|soq`xy7UK+zEQ1T5#1wM<;s@BMMvxA^ znbg3wWUlO!ND`z2v2S4oCfj)nZQvFJ(QqH12vzj}hMWOXPqaRS$PC%Qn!Ey9bneN} zRWXYU4AO7c;#mz6&VvvL(s?|T{|{I!Hx{c?7l?DDcNvcdsk>sA<>s&dK(C@%RWE|< zhXktfwS8mcD_rIfMhH>39_OFD zOHz;cY0&=W8>X^kPf00$=VZ8qX)*8R)GMdC?cTy|vu6eN&%S%8Gr0NJad^b6)(fw);JyB35a_wgt9z6I4?#op273zf*IkWU zLct*1n(LLlTzC-UTPDKtQ@#xR&4n+yS^c6zeEW%?QEms$ugd@S_n#$$b`o-_15y1#r#+Q;NAPfN_K#Z=SBIMq+)gGV{rbXX>(d)3MGhKQ^;&hKmS6W%w`Z$=tm>KK z`@KO~=>uHy(W~_5)pI+%FuRACHmgpC9B(evpG%g%J|&)Yt)1gq``eIkgVh(0G`EX2 zMn8rnE~#pl_4FnnRtCwr=JvVnEZO^=%if<7U+&twTJ24MwG(+u$Xmr%iwOv0&;V@h zg$_L@^0wB1WG#WXT3lrni?v?xm#kPKh7zoq5n5hRF!8B^Cnr zOX!f!p)ByZ3SYI5WYEh8xQyJO_o&0C#Cxq*58Gc3g5}ABzK1O5P&M7#S?%6#_t_pR zdY}Eh!~WjoK077e9eG$uY%+O%Mv>+O1Q;V?tPri%lqQ%qCg?xAV5$IiCOT!lS@t7Y zA>j#HQuQZe;(D^RoP6o+Uw$YCdW|ad`t6_UsY(kN;kQ*bZL6OB$*h~%shyKq`=|S> z$f+a|q%ebg|Efj&yS5D4+Nu*WVH)&m0p~r}c<@0j+%}gjTxKyZwh-w;B5euG4KM;! z+Z2-)z;HlG_%n;C3yg$)4#veh`8xJBQ8RHc%&0Numc9}@{^Z|3sswA&XZEiGp*50> z1W$~j-HR-mw0nC2OZC`x|B{001+4r$?Z#{RtLI)Puv{e9*XnHboB?U6zs6l$hm=Ar zBvjfEnV14C2MB0_>yAIIt@^7;Qtk6Il6~CtG#@RaxQYB}3&;e<%xa<_XC?bBM_v*$ z?fko|44fL3G)YG0``j*y8=QD9Zyg{q_*8*mAOsDdXvQv3sy}Gc1(;p4YN6MqL`#wj z7w4?XgDkevDfqznO=1nfnWsXBe7D2texf6B*e!y+AuiyMJjb;hH(t(uTa+u*tMiCw0LAtN7uW)D&inzAjpq?mMCLH529m5LFP zHtsrO26!_;cAhu@#2&Ny*is++Utd+ePdwVpa64yXJJdmO(#5JHF?ds`H4kjL*^PZK zPgiHhtL=RxsiOyR(Sx{WkN3uCSgMMJ|hVx)Cocn67 zvOP6dS^WdO6NOa1lb*5g`H6m#FjQR!mj-q2vN~@n>fGt;T=I1?k(CO{PVF94aEDcJ zS5d*OzJlFU0Q1Yg#@dg#*aHqG15IcD7Mn|`%s})YegzcAFNIcm&zRDVitqCf+yexK zf_G3-r~rrz#`$g@0CLiT@%OG+s9<;jio|aEcgMZsqS^eqYzptZx0YX~W??wmUSR(O z*PjvJL><|2XT-bs&6iw5qLwqny|D{?JTwnIs8D^AN+oIce4 z_W2HycD7=nT<_n~n=~nh5wX1o2QZ2^Yq29q*2Me;^hy3V!9uQ#&|)Wy5=|55lzNl) zrbV_1vE&PI#b*9Olq^6)1aI@-iGjk7NmuSPv2^ZaJ!{BzX-Yk9$aYzsO_n&c=R1Z& z4Oub`>=#%WKkL!9_}QdCn}uTy`1h3V$c;&wP2oAeik0MttrP0f1SR;}s2C>!`5yRt+tXef{0>-8;MOX*X?LQ`M>Fa?MdY8VF`9mh!%+6 zkVWPN+P*D>d<--Oa37}V0W1E;|{b?y9JmPrWHTvBL*M#cw zJ$ywvcb)y{fhCy)Q>MGwIg6-P+hhPX6s`xAS>N_p<@cEd2jpD4m~~Wpmxi~-2rb_o zZJQ&&kN7lxrufnKM&4RrRq5UK&8_yA^F?`bQ{=vtLCo!vJ>2OkMcLuezR+=tN5cNJ z7a?G4Ra5{lzMd3r-XdASM|(ZKJX{8aS+EYnlKt!fxW~2mfZ^SPqdo{A;NI`C_xCM( zj|ldy++~(F1qfHS`5RA1uW~s2>I94ePELHK5?{0xOM2ZNx%h()(t9KyQ|C#T6N_d4 zAPWjFu8SSe(!Q2qSW;w*j?am8pgmr)nMMKxFdi&7z<0c>8u>H|E?Bxt9)`qV)w!i; z!7@IBC_EP!;nN%ti_*6Ej6t#kz&%`qK)Yo{+<|jtaK&gy1=b5873x310t&DYFj#)N zlyP%+frjsZ0iXm73)q2gC}79F8yPo6aE!l-;oAn*=LT+NM9~IPw4(IG)2do&r()W& z5QEAlV`ZEg`67?f8|w%9=HG6rPk>!PPB$N#D6EyZbZL|N zY0zCAcdnR7E2ZhrX2CXH92<#v&2v$*KJK9Q0=ud!&_4ijFhbibs#y{?;RglU8gl+z z=gUscVz!u5fy)Nk3-nO|6yTvf5Sk=lLj~JMRQwr-lDlEv?}z`H}q%^U)ZiU zTk1AlzU|FAu4E|%Cr--WVK<>&%V&mBoqym4iRXGiG;nPO#M^ zpYPxQbBpQ6g}cXRtJ6EV$lv$oX8zk$hq1vH{h9pNxxa<`nmH(~vUg3-Tb?rRXYa9M+P z@?>9kEgQ6eldFQ&aM&X88d~nd?X`fw*U-g2*h0{6%JR3u9S8vX4ELU&!fXQXra`*N z=$IYT=ee-JANHA$|*s5pqi-49!Nk3^7vS=do zP~b~@TYnXBrQYaD;V03~we4KoSs?N@3UN@&q;+8xuITn<3w+XqNze;5PS;k^86MgK z1o%fU*sdq2O>cFpIpk%?YCjEdYkYkiKBj_a?cd_B_LNt9_iw@BgaLh3zq@tDzt%%G z_ObfW&5k>N1_va29v5%N{iN$Mp;|;y??ylJ$7Q!T* zI?l*jq$%?kt~19+vV|b8CHuP*oQE-f$&w08!Z=9hWz-D#L;%E>00_37io%&^A^qg} z!a+lSd#<*$swFV_Z}-2AZ`~G(@iW~WnQ68|S7zFvt2yQWb3q~zShG)X@=M*WMq<68 z>4L_9i;zL?G!lF-_ST3UuyS{WRs!-cOJ<;d)?_>R&z&b`&Ke18TRU)Fa!qn?MLD$= z`@lB;8FNET09!R-CPlwA}~=pB1JbLWhG!CvMYEM&FWvEXwVQ=LXfTPz{p*; zw?p${C+#dHp10vv9>twI^w_4Rk+n6?603a7&Zm+7`xinzVFB|lLTPDm82mL&4ub(6 z%>@a1@llv~iq)26$5C;RzaL2-@=p9FJcq7yG0D_SyXXkmWUWI6E4S|2N%A(;w9lDQ zV_YnNGQQ33%TalGbRNTR_P`2tIg)$>1#~u&V)4c0vo0jS($W}cQN;LrH|wZ#U7J^} zSX2j0jR>d1ftpRXdJH6lVp`^EJP9sYyxPMnxr*R^SHolZxx9Chp?1G11W1gtI{4w{mD1$-uawV> zs+x9pb;{U*_9ase)IRRpU=~A6_UH zjy~zsKl%vu>TJG}ddpefuiEx&o}k4%+K%7HDT3g*2pE?%s`z*sHg<`!W!h_-(X?5I zl}`7bX&A!Nn{C@@*4?hJTXMUb1HL6kyI1Zq^?$vAMOUZgtKW|Dm&X9CGG)lt+wYmMATV#9InBglylxa%JSt;~Z7U^@lY z^zFPLS;&@e7=gQxD^&#|!<@Q7e$8T!h`t^^A73#EfPLm~yh2xU2wr!)>ZCW!{ot}z zUfSE}GX5Eu%})OX+;Ayrghl0UPcP835CV>Gao>Q8=&c%!cp5VXU1hPP-Q#2Azp4#=^@F7cBm~;DAomA`Xtx)nZ&t*G zj~#z@S&o!T^!+<;#An#eAK|#grcFvJcYz8gqeVaGihh%#jgg{1A5m={DwRSs>?ec@ zcffqv3D?m#uuP;D#~yN9Bguyr%uOnWtlUgSLCF4M6^*2_LDvcjiC+@%&rgy@+V&W` z_r+6$6N?p=MxS+f_|+p#ZM)3nuy9RVSGm^4uAT*L2I=lrzeChS!+e~Sq%-n>(yqYP zk$X__NBm$RWbx*R6&Y|TV}l>Ft&KJv`4vy&$M$L>VHg`qB5t1-ln^#w6fwhDXhT~v(mimdxOo($3E1}>m$G(otHmzMen0%?I1-zcfHkmFGZPruw&)f z{@UxU=ts57lY$(VIaMIW&0)ZtG2cTTVdYYBQ>_nh@G;RRG1H8(alRpb9_nP;qMTLB zH#RSp+{5N2(7bRmJUocWz&q`z~HmdRzBuF z`|#ki1Ge%}SNzfY%TA4LWz$IKe#d?G2SqCpW7)qy9&~Gvtji7l4)?*H!3RrA*YQa> z_~f}GZQSfWxu^I9k0_KoC_mb#cewJuKPbPngY!jK{@|_dgAc9v!HZpw_9=5v!Tm0S z>fnEu$#N6-L#+RI(iL)*-a8G4R$!F`Q;_^-lXwR0dw?j7No&?2blV9Ez)p|khud*R zv{`H&BhO0qBe@I;*;JEeXDIv<6HPT<=m-ZB5*Mh_KBzYkZNh*YCDG0u+@IF2Rjs6lD`BgMYsKBv2`vsxgQr_mniC*4J6on_!5ZgivpI^mnp z*q!pj)n*hfvg9CK+3ctVUtQCowE(MW5H$w?DYYDUmGvgqiK6NN5*S|;X+v{Nnk(}! zzVANLzgi#zd(GEJujHNPQv2sNGYVG6Ua7%6J30%uO{^bDfaE7;luOZGoTJC*r2nO* z)rmNLJIjYQKx=GN}&=X z>lDU-fZG_nnyi<)Qhy2R6M9Gl*}aL2_1uFPde07QPE6pQ#cV4iT{ zk!~CsQ|v_<@FE&s66-~>4lRVDXj?Cy;I^f9sclrE0Yob(Q_vGS(xTAji+6Nok&q5l zxRCzCbdvm%KPNo1H>Y+j&tx^S41zw5&c|o`Hx&gIGMU3ckZ*j8=vm_x zgZz$ASv|?n4=x7dm0lCVs5hKGEpRa9DSX(g}1azvITfX$qFu0b_9Yg z8aT4dhSJGHKewp9QtonDb^2*4^BSuN*m0jAtrFd1cJ%}5SempQm;?s6oZWUR*rSVp_$)s6q_ey00BRC1mNEABlQ_G? zQe$|C)Cv)@2IEYEfJw_t910Ou?j6Ssj`XfJ=p8RF>BEvnu%kAne~zods*xatoX}Z@ z9*osl)Z#Q8us)^RIgjYsR>@y>VfRs56!&BJY69S=1;U7amz|s}xXqbr$5}{QaVET=1&yE5! zkp2&OB^r46N1tHmj+DU)9z3A|EtmJ??~*Ucj8^5At28rO92-|Shbqhl3#fu!M01MO1elLlgjy=rF~a95&XRV<%w2c;SlY96EML*xMkZ z3e%DQh|xh^67)>za^|K*^eS_MlEmDgO3&O(>W(ruN_pnS)iUOW$nngLw_O^8-=?U3%a@a|*8vbSC#ZkCR9}3A2 zC(zXTu@*)Gq{LfWtE3mB&M3omjFYCwdE0$|7CbvjfB7x_Iyk%Z^8Yi_ZxFmn`epq$ zX%+(-)FNNZYh*35S5i%gNric44gaSFg#||E&Lm(P{mLx&g=;FH^jlj;-tk}hes=tq z=y)282<3Oxl}Vl$j%arHUl9Qkeqr+I^|;Zf*XuzeY&PnRdQ`7B8V%B(>Zew>e2jnz zJzjjtw22M6U9bG=?*8OHfHPg2XY#Ca!xl_wn*8bNk14YRe0d(0sUS8wb30FuV=`A- z&8@OdR;hjMX?eA#yfQ{eCF~xt?@l9kE)>0r>4*K%N~McTzSobr^24yJ%yoO6dH{oz zbHSdkbGua@Or#?Q8m!~<9ucc!udosV6tC$hR#X4OuzzJk9JkQsp z&qQ8kr;0i0dw$*bT)6MKsC=J?l^$Dv%kNKys<1)ahv&-!<0s$Q5Y}~#nJJQ2^JR*c z345U+yfMJnsq&i~GdQj97W`Ie=@K!G&aAd5utsO@qB+BX(Q|1H;|V8en7lQKCb7bC z#Gu@F&}{V?1djTcU>vflzxK7P4D}l`=KbZZR!B)_h19aZgMOVH&14ovzm^&J@TqvR9*a96D?~ZZ>f)NmAD{n+O!ky!T{3{!58J}m06vR*&XQziaUC` zF$jt-=soc0vP{NqQ7QfAos>VbgZ&}(pDR`-6sXuiVoh8{t;KLyAGs=PTp^pKqXY+U ztdV6_bi;&^5*j{lQ-{3-<*>ZKM$OmYNmuUqle9pPk%Q7*U7qwOowRc)+Yc~>>`W;p zuxEB^mxWwa%9N>@UTQ!GaZs@_*(Iq7{@2b54w7UW+B_R8z{Do~52Lih%;Zms*t+|PRVvx!eJTrIpy20ImDdox(#=7gj0 z^KI`ZIzL3kVCBB`{6dXK8d(^YT7pMU6}?G8P}IOQw%r}nak-K+cxnm=AVC>4WCXh? zhw5#hp!+gJwVhK*Mr?2fG9kYx#k@^!6#dBOm8>s1-bO}1F)Ds8H%mu+v#y3b>y!B= z#{rtSIXV*1fvp1t#P9@2s!W|3;MjDYkdFBlk}oyGjy&Tq?&K&UKFqUZ z+i+(rSuvbLEIATOj*KNYJxeC=L<#mKV?9&mN;~fi{W`{!ksijBJ7R=}6k4Zh!Iljj zDDRh0b!G0|m8aCE+fAspp=&4-t!e_iH5T29h1bTILlK#&abc6cfUw1GP(86fXuRDR0~u zb_q*`(5CUG>vV4x;I~=CG#^11U6gc^=-1M(Ps5ZO_ptk1xK1tLI+Bc+hk)g9WDKVrozEFCtJS0hS{l!t; zZA<|{+8UcJKSWH#vGi{iPQC?cRd2Lg^Yin`e0O5w{QBptn&M{diKm|Yv~~0IKQuqT zVg8io@g!vh?76*X&(A-7{VPO=i9|I=jUhUqZgcT-1PkE^YcG&{QPQr zeA49n8S~HBToitxU7Y#D?!LCQ`J(yx7jyF?{J&5Z#l4R$Aus+PV%_h;*^ zyT3vAXBDM?Q3l;hio5IeZmzg{o$m7DZb^5uLc%C#;*9RyN=+X8a1aRX3}xA@p;aL` znyC@b4Uv>*^VNi%gN4?#Z6k`qmt>P>lKm%&8-b%C(t(waQ$6W%m5&D@XoF zF$$}?U_Jq>M*5H|;9R8}o>`QIO@+(q#C(CvqMD$)#WWuxDTYVJtC3m{HZl&CDMls- zFC&Yr1~!7Y(GO_(*?>p;}%!J|Nch&nJK3csu>(kKaNP&F_y+5;nyiv;wk5=D5F~AfF zGsBVt;r;;e1xzg$D6|T-kYjvGEZIEN*E7^tc_Ialjugd#lNRJPeQ~ljVGB9QPArL5~Qf zN=h$xjODZ^0g^obNzljVJqh~wLr;P}Zh8{*@wo$m_8ked=cv!oGDd5P(SaC4qpBJ; zOqY@W(y>~Zn9?6g&8Si64#h9-ZRrpSz>#LeO$*nn>~e0#YeuGYm~O^ZXP|V9@MjCp zVQHKZ6pVtdG`bs)-atP-kbj3f(n1Ghq!_)2FjCV28ENCNN4jA!#oyKxpQ@3wcrnEJ zy>$Y(51sRyYo=6v4LcsU*njrX>fGuQ`;Ju5kJnyLIa(cj<`dMx^+&6Ne>y=u;}6W;N3 z7+mlfB^@8~yoi^32Y@r_odZBxdnCVrw?9#a%}ZG6jI**!$ARX-OUKd`AW3V^|LSKJ z*~(|FWgY}veOOgz2As3z)##@kWdPlK1ep7TLujCjIC)pEsvq36EWA+j;`}`3m@%KE z2kRlKAMC>OU_JS0aRL{~el$EzV-U_+?*koRob}~3EN6hR5?Bs#=4dg3H6=|wfs8;a z3wb)85r`jDXB*Nvs4H;d@pRgF*O116vV84J0{-FE$b6jSp3|u+`@oNqY+lYW#*lv1 z9)>oq^X=Y>jurjvAJMJzk$EFcQ90<);nDPaEQ=Wa~3%meq%XWnFGnLdK-J zH#tel+^R~$=8j(_l)+wh$uvGePD5ML#@k-l3qE=j7eye#l{TGmRr9MN6kO&40bL2P z$G?y@3c!Z8T;l66mg4~~z-m=R^dHJWi=P6Ovr=1N01e;MJluEUd27-&&aixcddWU;IAtqpa;50wbAqSXOCGQcx~l$l|l zf#g7=%j~q>Nn%m{hmVmGAboB3_@j*Ye>7n5M?kKCIJUt@711}4+utiP09s>Zg6Kf9 z8kwL40EZJ5nV<;*_aI&G2e%1AIyfc9MmJ)TPL#BB!cm?HPU0wR?kDw3#1){5^;Xtk zN^azVTIest^DI|;Y%Zw4EzU3(rM6UjHo?3vYi*TijL#-l)Rs8&(6c`yrlY7%PM0%y z$m(R_OQ6Tq^(0X8NZhI805V2~jDUZjJ{~8WJ{lI!3Eyu>lykgBLpmBp=<~`U9VvN^ zu#(cJ)g?E1l;8L*L@peD>L~M-Gs}J(`BgNN137#KYDyI?ois%%LXIPPjcBg2#!1O? zVTk4P@%&k+>G^Y2XLrb7RpAa%VIL?q2E?P`Cwp-Ty(69VA;qvn%T%*`G&=al1F_-f z*Y@_oE&FbcieI-PG-8CB;cbl7_V9;dI%OX%?*C}?@qs}f4T{lWEk^^U2z)d5KwcZ` z7l5T79lrIKgPwk$Sa=D2G>xM(riYH5F+re5XH1_xcE-e}hNDBtq;`9}3gCENgH;pf z*|3#I>LK<5D+7^Yuh&@kW7K`*y~TjQ%ucQh#)Qb2rI;$vNS88RRIOl2tRSjP=c2vVV8N%_3j2nAD`6=} z&50%D^`xAoap|vvfw@+c8Pl_ABs!J=x*Ew@?IBJJoSj*MpDSd;eP6z6-dgfGW z4E~b+;QTtUtF`Qldd}t?AQU@Gi}R+N<`W>OE^C>O^UENKy|wvbl6p?O*9+;itxuRV zJ@E$pGN*u@+SWr;CG^ypj19UD>Gn~53CMgRz5Jm0=n{n!I!-t6}RkmL(5{Sr;s3qcntR?9R+W0gjOT)CjYfewaSPoc9g>N0W>dM3Kq zhfY@fDaBF%wYar!IpvH?iHxlEO6e82X3+|uC!899=Rxw`@z5!x+UQzPO)SbohwHJ? zpo$mIcv&uB0e3&513^e~s031Vc){rK#)uwCEUY5}jD6H1NM##@WHKEJe7s5NKC^`& z9AOSb4~GtcWX>-`pi18k1#{S9Tg4n^+bTE^Tn0eNH02s8OLRgU7oSlc~!nZ z0q=q1suF2aZAD7YGGrU$3ax$v=PohrgE5I7*-nuX2}HDfl&@nVv=Nj4MtN4|cKG>i zf4IB7%2`UBz&jR9t7tjrA=e$!`mh_R2;gp;R`GOA4=#G9 zYC-zRqDD(O2;FWy@sA7!Ep8)`%!WC(Xo%Ot#nEJJLy;8{8@E!()JFc;qjKJZ0DX z+7RVFIazyv>p9y%{DTY~*!RCOCiT^JPc)Oa)kY>y27h((OvbtC0c;Kj4`p)B7@3@6 zhR6Mm%txh_k%{wjEN&7^reRQPv^ep#+l(gKldJ0J7o^wL4ERa02jYjt1JJf66|Q`M z!cmisQa+G(SPEVFKpubTb>#zjncN99z7-UXT8@rVmO$YEij@aiNtVu6mXI3Z4rcdt zpm2~TvrCq=OQ1SPK~eXx80lc-58EFXY^HED-RX z4nom&XFZz!lVx@X+UX(qSyFU~F2-s-Et~iqL(5YotF;Y_pzm_EMD;j?;Hu_!Hr92t zgrP)8{r5_lCfjI`Cc5~yH}{GXOnEW25aca;xxWlkMd@XiwT3G?@{ZWFe+9!WCcIv8YSXs|YWZz+}(!nSo1a zP_QWt+yy~!MJ6_9CD){kxD>RoO1L7+-v(nl4#?DWs;fK-^ZOn(Lko63j2y}JHK$~q zJgj)|l3V%wel~fg&ZUtXVff=KW ztf)|uhQ>D;mXNke3g-$pljbq0HmU3a#k^Q)bChtE4m(#0wRLU982LCE9%ZVn9Y%se z|8#6|nQu+Vc`%yU;g%+M1rMN0j3JIMSTqly`^h;6 zvLkimoO9ZqoO4dilXK4LcXG}-#ZJySr_sqd=Ttd4=bR2F=bTgC%n~rIP0l%|t~pCU zdYa`6Fa=GTh11L|J%Uroz@4G-4Lp`jc`Rv5o;iJaXdX-QzZIYu^;nt{?O60!dVd)w zase-|i?+sCNdtFTp~>R%>ETN*wtWAJxA>ulA&cL(icm2}w7Cth6$R)Z?w>E(GREOi zYoP%_f6htfxR6t2Mm7T*jjrt1aJ-1kz+%i5K4YJaag2>Pe!!cOx}PwM?uCaz-@}w$ zHy|n0_Fr--j6jGE1_>;}dKbkIL%e6BwRDxs6MSOcyo@GGB7w0k<=ZG3S z%f|SZ@E(QcU&;e52I9*`j&Y5^4b7{>H9ALV4kfP9I>=z^%Aj{}CV{&~^9ap@L>Y9C z(40qHgFmcXx-#e=p}CBBjs_B%-oZ5nGUsNvGB6Obh`DPC5Ys*=qxC)W3~`NQ2u%aw z8a)H~LU}ll{Y2&tij|gJ@>MBX&Y(FMDF+~?HQ=%WsCKJzU z2@5|a$_t;9=}FI(MMVO@JTBXuwVS>}ZfUvaDZ-EWNF<*1nn-?~LdS_8dY~H9i+Zk@ z`=n+qE3>c~=DkuYs(;E4#W%eOOChE=JjK0r5qcusiLdlMXLVT>^M{IEjU2j1jti>? zEkgZPr#RA!A<~QnK)+bCu%5XA@??z)D)XD|U#IgxR9TQy%Y=)SLKdDr`J2!&UrW9p zr4O|HNlIO5{uJ%KQhujAXU^oBY~v!aAc0+7nmC!MK6a!d72kL67c)pHUpxlBkY`)cPLVPu4d znJEBDbIw4Xof$lX-bMK{>~pR-^-5_a88A;tAGve2ih(ajoId!S-_I<(?<5QFyW4R> zD$?*ehw7x;N6x$s^nwUM5NpgB_bW4%C6^JkD?{F(jtmi_Bvc`B$LkSub~evI~I>J z)?C=A!4=uD$iC~cV_6)dU~W{PE-D+AzSnWFlosLlYswK?%O)4e{z;C|XjYHA%9*wr z;s7p1B3Ye;DJ4a4=qFT5p1Ybdwc)d5vida!#=3i%6I8ibD(eRpN59i~lKrLu4FL-s9-k~=0+)W#9?ofE58 z>^pTILf>PJsoHl0N7?rz&q(PhppnY$4P@&h3tCD(NivtpWg2BuXT&pt?ausSORWm6GdtFhUu!?6bcPHHHbq(Q-@pIxSXx5jY!68gJ?4~j`C$d^+ zu@tE}4Hm>!!Lw=5>@qisK8H~7DgEJyIy3S!bH8X>&3Q%bpbZTb=S?WV9e@JbE}>E$ z_9n8hfEcVe+}J3x)XlPC3Y}$E8O}1A<;oHbnkdgqsB6~nrE5$`g^Z>p z*lboB5)UCq#40r;egS4tuVS@^-jb>if zO47?KVS>KarqzlDV-q1Ts#egPT}_m7wZePU8&?H6tLXsHK%Q~(<^&*deMx#^861y* zOJA>$%Q^y(g0hg+>AKEHuut{G=u9B*cZ$RRbh4X2{7;wu@INk<+$w9>;eQO*Ult(zRt11I?u^%NRCM`30mO< zPCA0$||CP*j(cHRWmSq!%M|LIzmm zX(ZS|$^nM~n$UL`!Zu;(Mxp>k%_nJWFH6#>bFAYlw{e6$*_y2fsI2Sx4&+s}?nwL0 zB1KUK!mN8nyouKwG_A7->AU`<|AnSD1gE-Fztwe(o+qozCoMe@L=m`_sS*6o!!rZ; zQJBvztP8Xlqil_LH8`zC!$$|*hg=)>d9sSt^p$bayrC>~P9hOCun7^wlM4_hPiH+`&JFvc-lF3raLod-eo+w4_~` zDwf@s!Yue@DXFP}ab$t=#De5V>WM&JT%itW>P?)-vtl)_&yiAPVoJCq-3^zd+qy5~ z>QK9nGUNxqxV56MUPy-?^deL*{Lpm3Es1c0a%k#79^Jl0kZfy(b6y>fQ$EJtAJdt5(3z;WH_~=!=lA1Y*L|31xJobV5!!Y zY6T>&)|SewHRnk2+-UX>z6L6{jQ6dQQL%O`2SR4%Lx_Os{tAjs`1SE#yiQ zDPjqS?Cc#HBFo--O|u2h7cE7HkNf>t+vFuQOn6 z2xiJBseiJnd?M}00GfQV9@o9;4SM#ITZ&UEhHd5i)^~mAU#>0Xax$0gT%qI@NUR~@ z=5wnf6_9L@4mjXKhPbZ1h7Ajm9keBlAZwW5%4#Ed^(7lHMwQwfVHko)&N?EV2wB24 zaW9e+xQ$+lYKL4wPQd7t868XN6f~qnr#*X@9Mws^hRzoUiQ1_jJl4Zrv(f;Z(lyYM znG2IMl^ykXs8%?f8ELZ30(oc5QbA?IFymR&vP{-ad5eidPzf{GB-&u50tM9r8fUk` z>2#z5Chx#*lS9PYZRm#BZQPc2TPJH{x3ymqnBAt|z}ao>!funNFvdEXN#E-2HeaF1 zb!yHU{&)kXL3SHi#3eTXlxD-Yk;oTPm)#~Fg~+FzseN*OA_UBCgCU_e=)s8H7HgO` ziatkp@hSb`*fq5xixMu$&*ioUMh)SI!)~+J22N+U;Z-yHEi9k~lgL9B`3Ti?ub#5l z{_R<8ks|G&^A#+%Iuxrz9R?FcY^@7Jjq^%fb%~GOZlwOgm-aH%1~h;*ziwSM*n3h_i?pNAWCALN|ukSp()b z@p<>f+#5eSHrxKlM-mNi4@3i|Lvd&ZYK?u583&Z;i!(toJQ+xXil)~oEg^eQ`-<5YH3`h|X%3Bil+RCZV0GL^jpqVzi| zNXG^$`?`T@ZXGUE_KGTx_KJKLu0bMlyV=|k?XO@#6l6JWB=TxF=}@zAq}mkrVF)t8 zB$9Z<9VZft<zD=%h5RH_I2o;}NDqwLR(cwNjs7uNLGwv|8PSiRqkb z^G0FEbZ}C5rbFNG>@k&*=RJV_0`wCzGa|+pG7U1hS?M%~(i!n)Z4pCmtH|PKBrEd zs&lG(cUJ)g-ReHuiWJbTts-`e<5{~e!4~n#c#m-h<6Yl-jPZO=QiXXm7aYDfI?zTi zkYGY0F=#M$b1|ZVwt|2WO(*gCk&uKWBoZZx5fu#@5 zjV*Q7-g|w_HP@VT%{A9tb15%<1$G&r5=Ao0e^pi$WEG^Q)dIz}KtK(U0s*qVM)$YZ z7Ah5%yyG`FR2W3OeHLG0!Vo(3lEphOgFDiM4OMKH#&yS?-`RNG5w&8;WlPq_weEO| zEAD-*%>@_PPgzeI*N=7PSXA^AC9ChCA2Ywz`Z30BZAF7YG~#Fmf-cw**ib+2N^-Jr zln|6Do+NA2pdVvc4l~J!er!vAXRp-rW;4jbBN&x}YA0H(_2Vh&$K1xXms+<Ag{imY3>1HPXqT64PI)#N4JgREZyTD+8f{N<1A^ zV*N&yc)C`JCt)I1v8crFuoBBo8ErCaNjHrM;GmGYU8}@?!bGkCFhdUqA(;KwSBc@z zjaA~fmBF>^Gz(4|l{k2ksC@S+18TQ%@~d7AzZ3oNl#iI^N8^q%Y%)&d`O1!OeZpkNwjehC`!b{OLaGSH9-hDIG1rGiOiPA0^i8c z<{DLIWWHmn=nb-J5hAtIE%zG+(>)`nUAC}WBzna(9>nzzAl7Z++#HU}ER#gZT!@b3 z<3|_C`%nJ1xuQcC2YPF259*H94Un_Bg*XhSz}WSuAVdWFJJ^Qkoq|U|xGP@L*Crdr zsLve0lT0JnRBVqT?-wR)oew(9B-^Id{A;mRdUV4nw^G|S8W1k}Q5(J+Fj2}Xsx}pP z$3j(R(X^Up0oRuK5(Smb z9mizJ8FQz?bl!#_=?J<|aQ;C4u2h!>BmsHE4XKD5zcX&ymFQvqCxME3-B$EFrVcLK z)I%7 zZtesMMBG5E1g`?4J{ZkScIhAC@~qz9rkq>>M!bJ;i>qs(Lt6H_c_B#+fNs}FCgCb< zY+yNIJI`&5#I;kK`;WIpyq;MHMJv|kaD>r z(VcSqOp>jodZY^@7ldh)KJ}29OF%+C8p5P{(<6up;;2Cw)MrR!6oSCe4)Ioc3F0lI z!O9Be(&jX5U>R>gaR-(~obWHxkv!3c`mfF?NJE0Kr0lZX)kGCw5LHUm?bKGLx{<$S zLKfvCyIODe-kZR3t!0%8*s>Ntx(_hu!<7$xt@BM@3z)R4>TqbZbj5 z#U7cAdnZ(>9Oh_kDG4aRv-wl=2Vze48j;f|2I#G3r8C(oY;oy4DCr&F4yLEIRn@m+9C?ViJv$8PL zJkYJvva?2>GoG*0k~Ze9TD*7=*#fR;5&461VnsmcqITsAO~krI=;V~K+iIa^Bt)nr zizO*s1qgCWfErPa^xpf2N2Mh~$z0HC{_Z*YO&bUo{XksMy2#ja31Kmq2y_|f zK1hHlOV^44G%iUSaXP}*!yVZ;%MTJ29uG3Oh~v*l04;XM+Km@15{#H}SG$aRB?%O^ z=*@LUw5~P9Jhn>9E%r)g+oFBZP8GDJaSF1ha@(Bf2(c zy?>Z!;vI0;v4~Sl!-9;0L2T#^(>Yy`>L%@#G$sIgFkm54edAlqLaB;Yih)|9V#h z-N32(pi^dP)dwTs-&q9DY*$_jC#efXi#;_)%>z#SPim2I2DEq@B&Y{ZRdS{^e%Y!_ z1a|QiJ~#`2mR_JGU=#LoKwSEsIk7qzW%Bm0 zc=8Uf;E_Px!*{}WYVr@1!USigw$T!@8_wx))Ce<+ZRb%+hx0ZI9k>~$kc6b;^jfO} zNh{6UZ8%0{=yl{6^O-S)G*ID@yl_>6#abVe>P1GnoO;D}zXl~}E+R!s-80rS6>*)rGo^ML`ZWC6+EE$NZzRwHMBgjQ4*@%}WoaR!L}llTEaia8fv^5BYMo2uf5M z>&3}M3XsOWmM*R86A~u7K-Ye7a4Nr+E<3@xq)Q7*wSbY^4+W8p%z)n(G;g!Z62Aq+$zHSS5;Q9o?jPM%C4XrA4W$#4DYz_nfWnjLF>WJFkwc2y>)R` z@ni{fAuk}yrD3Ds%WE5pQZEojD05XDVyx+WOcF+r7#2fEPL#wTYa zib_cpIT+uWqzg890n)1kkEF%o(>2*PdBEq@6>Vj-(*?kmZjJu9OCwU;T z_fqep^(wN~JW8}-F9NKxg~g&|DApLTj*MXzIE%57w2}S|ROnffpo|$`wW@^%;!<*S z(Z>X1ow21dXz0{dU8Yraw)-*};j*xp>PTWBV_F(Y=LPu`5McAKHMhW)ATsM+N;n!( zAEGILC+s6|q+vD>E~q99Wi4(rLjf}HV$EnivXli~NE(09l7102ZX|2b3d#^Ht3;Fe%K%#Npl`5NA1Qn_6n39DsSg7{Zy_@IK87+u4nPX+jG^?gI20;+j zH^0s>>TutnCS5Sze0}FP{MFK(2|Ac}l-GNG%(iy}I3!P{THJ;y5uKq9!n7vxA;V+J z#IS;~-Gqo~+dZaA$5*h56IA8H-#}b&^j}lUqczUh9-c#vi*%|h|LSNVR(?^JhChJJ zLUVYGev%ro8rDH)v21Dwc1@I-&>>f`GTyLAiB_i!uaQZ zI41*GL{iXqZJhJq_=EQ+=%vI+oIh) zAfsJ<8kYUcoF>UVj7a^#mY!#UUHsd#mBK`eWIq+;743dN-`8-)v8Hom$Zaa z!-7Q1DfE1iJkmq-3dPnTYeia&Q#jtBAR~&#M`crz*zCoi>R91e;SB~Yxx5k$?`5(9 zQ#6END5mr%auL-Pgy=%NRDbeUkQ*BCMihtO4CKy)!nmucup|s8#`3=q4c5b8SyD5~ zNXe)gj`k)*p8~je_2*d4n(%#`MT;AT;au|W4dV=BV4&`M0%5oJg>mRW+E zSg{wOQ^TDd>Bcr&or8)BvQ#-UgA`_x=*$TaJ553|mbjocLsH!9c*gzg6$*L`CEg=eTU-b(ielUU%O@@b9N0Zl7xRx%pHI6VqO@O9Q1WyqEw#37{*aj(eE?(J@?2t+# z`hZ_WG*ZM_-ixT97U+%@oO&8)3BjPP-AhWeBy6Ddda&zRNBdrwR9QC_Q*50{)okIw zqhFa+r%d8a84ff;%rdEV$fSiFl0nTUSNi^18YQ{pw%J_Eqk>x>!L!B^0@h7VI}{Phjn2%tRT_+ zFwPBYr>5$<3}Yo|9~CI{!Sx`(@^|_uLslL7WQQ~c4*)&en@3jC&w(beipj;H?0eRz zwTl*&j!mA5{8TyAJgF_=G#frVLvb%195^H$^Sd^rEHr{zp-}y&hXH9<_arNN#!pZ` zXL$;Nz&0m|Yt;O4PRV>N7Xkk9cy6f(j3>09IUksk6rGk3)Id)&%F}%CseNycwW!%X zKq|}VD25-0Q_d9zAVx~PD!5%?R0sqKb%xYA$`(kNT`0cWw3YwP98JiUS+?~YkixT0zS(qA@0(@IY88E6Ke?u5B(yMyO1fG0 zO=ffZj>wf9`ei!jMZvI>7W2xpga%{?B$a>C`-B{zU|tScwMCZy$^^!&^aM@TSmb(w zLgNLA2GGKGrU3L{!FXZz7GR(VcPwlgDom3tKsJ5ES~bifLq%?K16r;`E7u>*WSek8 z1xE+8$*`CNE&X)54KI5`!ak9#d#GfvSyqN(a}*lEQV>?;Z1`}&BD#B+-TCDoD{=M{ z6a#K;I8vrTnH}La%!m5x30^+J5Slh9B-O9cagt6TAv9WHvzh8qj>1$w#Z-?lx<;EC z$SQPIS3rLD&d-(VBQm}gi?mw{f>6mg*Q4;ze3bu`!G%d|wjE0pw6SdBV+ z>2{W&NR$NDAn3a?Unh@D7s6eP-)k93q?!P@Qt;8_<%aXLY`+8#1E%x5bXlL(<^6s+ zY1B=F8KKV6ut>$ooI)MJ-Q;2>eElE@hHm~d$doD_;FYN(bhN&Y?IUrJ2n0F8Y;rmt zIsx8tN;>2W>VwH<6Oc^v-y|jm{S0J_5ETuo}#qYS?kqc zU-i!bqZBC-cxMe!Tii1;TZA1=+9O0gMH&0qQvEnl6HviOcZ}=FFpo>HKqn%*SqK_} zF+oojvmnd_&1#{Tg`j5xQXpuxph4jv*a$W2ZJ=iDfBL|;sW}oRKCo!*%{;Y$9owd0GbSpBY> z!vLejKCuMEB?JJF$)RQpH?}5%uDcp+(wvQ45$7KMl!&4yw@_S((eGJuoz%LpoI@E^ zwHH|O@WeQxiHY>}TI|0B^M@TRy{nd1n29&h{#5??IgRHiQ5FFGT?1VJGz}Zp*$|`{ zginuPV|@UDOr5lR8gE??0`fppAw(frF;M`qyr_qOPYW^wiZKypz*6!7Z)Q0YjsolE zWn*MUm1=X1-T4o6In+AxW_C9h$2FL~$8r$QUGgyB;L0QxCfe`@rISAB+jHy5A zv8nAozz}v>Ks%@F=(AX+CaQP_PH$TFePdRap23O~8#2=mSZYaDNvlEX@DpBUdbtfO z$*wNl%+rAD@q7x2OPr{!9$LQej*j)YwBVogH_bi#9X$p1yK<=#LD-}xWsHA3(yvBq zO;?%c!cm*7>RV4j8PBSj(f13(_lv81Ed2a|lqBc5Wjfqmzmf7R?;a)tLyG-VfFngv zaUpE=*yc^;a2M4pr@)4Ct2fGJ4U`|Fr}z0zI_tj3w(LH%R;!(OIy(LYKCP)%6s_fu zpE*>;bUp!M2{B}aC}>a3vB_dBQhADyRi~2hNKlth(lTwb0E_mxfJ(lV`WMg#Hq|s+ z7w9Qz^=I$>)03H6yhNlpmSTORnv1d9Flu<;{3%(e_`QGn-eXuO%7}n1#0BMJNh9*H zWS!V1#afEKn4`3dyIy~~fnrAc1IEyb*Xs{Z)=ngh7QPlRlv>1a74VpPq)NiTXEf&# z1#S;4BPev)z{19n#>eTdCeJST&@9Uwu!spUt{)Ap1_AFB2_oahY1~HwP5JnM=81-;Bn$K)zc5jka)QV( z&K_<@D1?~g>BEm`MOjQtT7pAUqBGMEZ=op>mbW=w8GU!N*dHh-I-U)_xfrxm5%Z;f z*Z|^3qXSKeuv~+_h@5x>O$DhBc!8!u5xzrHA}mLH3MHT^iQKg`75mkJc8J9h-KgpT ztZB-;C<)6v4KiJ!P@etJXv*$f@=>tYUQJH{4s#;Yq4ZLD|MlK-0-jBQa`X;BbGeyT z88a7M(lIOz2dbF_AfNlJ`uZ23(0089l4M1Oo1GNWMLID!Ol7@Gt4lc^LO)$B)K+2x zvNr>DXu~;7C8}0Oyf|%VR#pp|K>d{^6`DI#lrbh2_tY@4)GDns8xc&uh?X zuml7sH0QOO-Lq74f%^Vb{nLzifJtF>_Q!r?F5vuE8eQf2prg>paVj=%H(bzavXSu%(+(Xj4w3;V>{(D*fM_`s= zyTYO8cm3%b(V&iW(=d5?Y+4DA*Vc`y#6tcvoBDL-Nmc85zBt=|=8^S?svZLFa0vcq(p;3lOqD6K6RyGPby;b{B*_Syb% zPrUSR&-Raf;-%j<+dt;W(vOQZesi|ZnKxnIhxzLPL`Je6YItm1tgexv2+sSkl6`cx zKX)WBM~lYmX8T-j`a}oeS7!TMOt!W(hM0ww zN@VRHUaLDcYE?13hwWNa94(c+byl~HJkio0n$-;@YfBHQgcOG-Wy3jIcn-}v+W4B@ zJeeBbKkJy~Yic}Ncz$_Sx2&w~;n9|U->l=JKf$)IopmJjCs_I|vvOJd;ZY+VGpHBq zsCKBrKfG3dbfZ?W?X4Z9A=PX+UX30L$YdYtmy}q@e{ojpnhUkC8+M6oEUk`G8GPq# zk41zPxULT5*fhlAqS?u2JFs`pR5l&<0q>C`*kZz}Q;Qox~a0}#{S?f@`k;g>J6T9q|k>&vA2?pHA#jTO?yp^&seA-Oxfi|rn5g*N2? z6MN|C)XvYcjPz$~S*OnCADQ#FfljJ37#%)GkmY8uB|WTcm- zWp5ghnhwWfF&dC{q&&1L9}_G!W)VV~%aCjTxn;S*V4XRg0F*5ma^SOKMt-)D-7;-@ z@`+ubJ57fL9;z6?WQ(^Af3ehAL3w*TB@~&AQl!jwI%^BCM1bj;3E2r)ENl+s-SQe> zV4!~-V3r$TPLIH7vB@^jRPU_|X+NIX?jg?Pnk#{3Pb`K-)P3j2BHi&TG;&|JHo-G^%RQYpd%(IR>4*H;jhSdP;;mB z%W39W5Qr7|Vw^glbWIYYFR`b((qJBkv*=N4M1p$T-DEB6{Etp@&Mf zi;n`*%&}xIC*f^Sqm!;2B0}vXN36kOAaYk^E;3;WXWZBv7jLsI%6$x^&D&k^_9Q~w zXO5T;K`VncR^MzfD=6{4h*ie2?kSF!heOD|rDb;itC@$sf5 zdh$5F8tjggSQlw1R2#M0pln!&X!cRD2Hixg!RL>GH7jlFVU4ID4c4IUCyh1sJY3;g zlx;+0G5fmsVkhV^@fF(}vbQ*}oRn)9loIc-jciQ+C+uVtnV1v6L843sZzQtM)^1sn zXo0sSOG0wU-j7bO6M?8vqN*sW5hnuQ z&4PT) zXHc*nd2hTs0D%Gt2`%sS09H6r1v(Kb38sO0(XS8BR(Cz9zFBQVkqBg|c&EnVuwyMb z7^CIMUIC;h*w?ptPEU{)!dLpvfjad;9LlR}E?caqB^{8tJOP0$3F-oxH+z?_((;V`{uW~wr0V3@+5$zM?6l7|^UBFtdlx#4 z(9IK|M(Tn}hS}mhLhb*7OmxW31$bhrkpf^qLQRv2v{8A%>Od(E`20hZx=Oi5vsR*@ zx!rHY;{(#d6aH1G0=6Or56O3)koL4Rek7Rsv|0h=`~hrv41?09c5pD5(dq(VCK}y& z#^)FtYA(ZkRT9+DlXYjr(_c}6G5gth9+^vk5o_+?Cx&&I7A-+Jk$*KcgYW`oeeYjF zF=hc^_Z@P$RK+nZZIJS?#u9RZxmP7@$WwNME25gl@=x0Z?8Z}Ps2d12*8!fX`f6fh z#-Ts-8K3Q&sP6hwhmn_u`*#hFsFoHbF*sFLUGp$2vn4v{U2k+Ex$?HE?JN2BIR7&P z^EZy;ib;TfjWDFOur&_5^OKSrb<}$8f#j1A0HtQmFKqugujts}o+>>*<5ydch`J=zW6|7Ms9}J;&n-i}UoX0~ScB^ZA02#pf&N!fDy7X-)1^rpPJ# zPl=^cJUR3_IHc=(DD#d+QVYVR>^v>Eo1>J70|{7_823jvJ)bX@pomN%OWCXCB}?Ve=pRuE1*e6ZK!EygC^b!O*^%-)Ur#9b_GacVV4N#vc8;^uUE~>Occe$ zR!H8H7!T9zYWzYQ@7kqoXE_0bTH2i&4^YaA+Pplyd3m<93}lN0BggHCG{9b9M?wTL z53K$ajE>~!zwvq);qx};^?xyFdK|p&bF1ccQcRViCdAia2aSk}NB_4ND%@nm2;*^@%POVBQc($9aR5ZJ0M~@8V^cH}pEp8$=}>nKvjI z=M5iBlWG>{4VCb`p&ZR@;kkp^f>}c?ioaoO@i)L76@OQW{yho)wTe;muQf5<4+gF@ zgZ&%dJtp7%i$T*rCEp22|N8h&ti1h6u%6d#k@cE`{958Lfuc*ZiX3PYRtG~DSw@7A z*7r`P(^?>5BWUr~3xx%pfO3khR`mX6L8Rqg+@XrcUe|16V9>22+ObZTEJKZ!a6?9h zbKM>7w{?6T!JAKfT*=?es^tvip0}Hu9avghWY3(n45{r!x>`+K5~5%Fl9IzobXs3R zJ7!~(79@q)ZKEPIYYLQ;Y7NVJ9s0Wto{MnYP7m4NS>gxbxEPHhI`mNkoT9g2j^bQJ zi{%u64p?x96_H+p2;j1F3UXR&p|5c`mNJ?9Ly$cn58HXs17uRG7k14%1apcD!Rp&z zVtK*ZTs8|GpHH=07}mk^_+ZQB>stZ_mO_Ku%QPI#=Ylulx6=t-^;YPVl~W74;LWK# zM9|MzTY4C!-x=n`a$37F6NDKJRxKp7u!-pf+0Wshg6~j1) zkrEm5tcHw}`8AxKA@;#VFG`jp?Qk)s@@ipBf5c^)NvRYB z$D1mhVWH%g01Z1jK^S@xSU`_$AHH zj`u0md8Ek!kTcQZEgZ7~LV=U?PL814M8@IFq$8fUwIe4gSr50HX zlYk#R@c&$4-h0nj^G%h6@BPgu@_pD$2vLPctT@Tp)Q%3Zu`9Is8Aku!5QA75P4;wFL#9!jFM^EIBtgGHpDLLjU~%;Kg=~2Y&Y1*Bhz<7L5y(MG z28WNMhW%OH$bO`rV6!Vjs8?{){2qGX`*#=sT|J3kwnmCY<^w3Ij9^`jjC)iAK6LNE zNJSwFiZ14=JuC}%r~69F;L-ly@;}eeL!GY4d{Vggg;Xf#$Wn~6l9WmH@h^Z@_m{{r zj28J%4I-9UR2CH#yuQ^_m3%Tp@4G-aEXbgm1p|7DNQ|N!o7SmG#Mn-B1F`Cb<3yqK zZlfGakC_9xzhND{D>_3nXBu6A)c;0K-$7@)yD!^~cpuUsC*{>?UgRGoCXNrEXFlb{ zG_fPu27yV))R|;_zB=WkH^0}UWe)>1-4nI9mPzn77{(OwNf&c(2VUNTyTvdsBCeTs zLJ-!93t1eGq+3owD znZ~BjvzlTqW1};e%6xIRXYB&)fW&}ZZVr`c8r~VlQ3o8!Rtu6)FBVI4(s<*$V&h2f z0Q1g~#$}JGVWt8j7g;id-`(C5yM20H1sNLnW!I^z&|5~E@nTG1pav3STmhGb@pI~G z6htIo96z)M4_So)UU;A)MwH1)BMNO59QtRBG@STUHb_d>AW3Lsb462|Ohg1nfo8K? zBH2pR>Ro)aWCos~(YAYcWurlm%x{uO5IF5e`RA3fLLSkVE|_PGnCA53kVi;23!)hE z2nm2zX4+AKejy4R33-%AXB!K7r26PWsJWK#W3m1-lof$Aku95X1Ydp&2kQBitlQ2m zMzUvX{tMk8Gw5-C-2~LZBh!PTH;b_1fPOQ1E1zuB5S6sOCf%S=ytmzMpeIfeWhCtRp{UZ1p2wZplr-YGs;*%D{4xcl%9U2$`L*+MJkO~DL?DGKd-#rKA~$I zdR;APm99p0B+j^myb}!w-h$oLc)XZHyN>naTQVdsT;B969oO@>Z*=FwuzWgN-Vj-& ze~5@oA{gt3N$)_~T$IA-0?n!N6als{aY}7qcP)Rf#GTdC1lcf{BqIuXx3yf|6qZ-Q zA&kvFM1H3vHjAe|NLEFtru@8E%M(WOUR1?dtb=H z)kB=;ZW}`PSFvlYWzsY0i71v~`24i9p-6pW0QgCc2`}jwT_|PChOwMoIw}gfE=)T+ zym?jld38VtT?Yf9s}|o(ewt7qYV{VH8R@OD=iXYFsJAWTTI?-cSofAMVIn}ln&Je} zQfRo)Wlv=b#`vg}R#+j(A39H0QQ?tbRIICe8BJ+J$maoyk;s9;0@II2$r`$SL?(YzIL*w1`v0mmp+@I>V0; z6LWA`vDUHVotL8O6ov^+;^gH=d1H=kGFUiAA%1mg(TjTJWo@s#in_?YB@s77h)YB| z6`D}U^n=pDgbl}~)l%@sw|F6);gn_IvKlz#()#^jZGrG#r#}H=R}djS+TI2DT{8CY zDEk^Gfj~MYq&7suRN|G9BogB-4un3Vsfp8!whc4)uX>^=_rB|n~9!c*fJsnbH z#H}HEWVI}XS2JnWJ7$<8;9S8$iOgMH@%!E0_dDFN>Hvf~cqC8#WzSDkl2=>=vW%>` z^|w)xSnFw}$NfIUQ_e(_iR=aBquG~7(~%V0UiG!RpvGM!-ZU*kKVeXB=f%!qwtDDx zIV}%0MC!?^O|M{GjqJF%IqJH^WG@xYaXA+ ztFiLEl{|<}86>*cri-S65_t;F^PfYuXrrEJ)6^n_fnut<5((IqW;Vlr6E?TWut-D= zj7Ol82dob$dUkvfS4r!O55q6g6q_oILKKzWh|BG_Gb<%OFvHJ>o$ zVCj`l5T+R&?bv1SBaY^{U-*LZm}r}LlJrZEFRwef(=Oz+JZ%l}~Hwq_v}9R-)#E{g^M?1)U1zxP{^%@T>PftW>p z%}s?l(G1nLG62CxTa0=Ugot99BSvK5da`W7Vl^Btmr= z-ED0ZwKP>+DME$}t8Z94h*cyb5RH}xd#Qz72~koP*_NbnREbnU!dl7jpY*;uyjwz- zENLWki9-ipw-RMsK6V{x0SVd+X209x^bwST!GvTJOF7Fw#;oJ@KJyBQ$NKJi(3c1( z-dfg>@>w@j#86HCVO6WibZ7Wk3O_~oX=Zk32~7i$tcXighIp~w6+T3;!$kef}5eci_J)C-SqU+EpRuNq@kswClL8;%pcV(!?^qX%w*};$T!EovZSZbBl#n>3P z;8!F4lfpCq;og>?TO=#=9Bs=X%ILHj0yfktDnWM=)YXH3bLTeD3f;B9ABfU7G-0-n zd86wAzf2B>>2L15ezsArRO*#1`C4ia?TQm99VPLzqXQej)XvYPRW2L8?6t}(3wty= zBm80Ma|m~VfC`mDAz)KON=jM*SVUIPbwz|8-hBGj)Yp1s#_8+T#|wpjdf^CFfD&Le zA}>bEGQP?b{T8Z{zNO7!u%h)qcfAGkDKa zP%5m$i3wkPy)I=R3*)Us>Gj~Uj;42jPK%_8=c{IMD1aJx0GXC^Jpn~d+cf#*N6aA&Z>dkkuAVwb`iRENpy;}cA?K3vNrq6`bp(LVD~ z_nEwPpUJv$pa1@je|~-5Kho#RNBVqa?DPK7KJ!rbnY?wM$+~f$zjKs*&P{c!j3i0( zugvxC>4dx5ir~}j&kv;V5ybf*mVlSGFN3`CB}O~Z5Bo;?>FbAuAQ^o%qOw1b!jX{a zgG`PU4g5GK643`wC^C^JyyhRt7${n52&;NNY(xHB_bJb8=x5R>I?@fW_34f{c1D@M z^Y_`oMbZ?Nre99OVHy8g{1-I?^j*>c>QuiEVOrL#6SyM$NG>^cBqHg-u>BDr7hki# z9B&9nwW!}um^?N-1TT_}?~_$aH?OA6&8tW}ifG5~C5YG24Lgcz!>%3gUM2RwwlKxe z)TSS*0eb_fB$iNegPV#HO2^^Ie;PdyxV~f*&!5vkaC2=y=%_X;9RtyXAwV@k`eRpf zj^B8B#;`Q6=|y&lMnjh*I46dea}?`_Jm?gx9kfgdMFrLH^$|t$k)nk%Zi_{MStQ1r z_}aUmYE|Y!=k%n3T*4ZMwj!lMx5T#5FSyzcTiEDjvJ81wRshd~4|q0VeZjnkzhIz; z;hE_l@`_W+G6sU`vcFsY2?|nCVSuEr8t0_vFx>ySQK3}TgMBpd|`GBKd z%riebL!9&_o`~h9?PtuNFqT`p4Ybk#yE#kZ>7{IY+1E6trA0cx{2cy?;q*^qn9Q~& z(}Z;tX~)U~HSFOii#l^Bk(%{;m&5yE@1cZ90NmNCb*K5SQxMgW9(LqGz)tzJ=E&i$ zxB1V?JNF^OhEvU@$I~0_lyipzQ?Yi+i3Y4mnUJJ)+tDpRL7BrP9V}U#9Rj>71+?i1 z8c7sn*7`obtzgPXG4IsT*{)Wj)>=us_on-+C+IMrN4SVrEIxQQ!X8&otibvlk%;zU zEc6njUfr>`UsqX95lhv)iirmW-?5EhRP+Z$s<0YA(wt5aaM;SME&K{s;%jBcNt^7% zVjMyu&xBeMI6Fc|*-a=#Ae04=AQ{ge;=~aAd4iS_{ois@8*CrfB6 z|JoeYYvE~WHN}Vg!}11^^{e`$&oKv!Yv+yN-qR#fT3)s=?-HAxM_4LY*O+`#EqeKG z|AXOo##oZ9_mU)Aw#I7NB+}OKd#Iur1YJNXMXDORx`N^1ocbmAj2NQsf5S&ma) zw#o<}maW=40(mMDmaTA?maP)!)uq*uR3_nZZrwBhV zpR(lP2NDt!fKZKr@#2mnJB%oN+iI`Az-^_s6bY%_tvBtv;!>s|%D30A5TnNKKivOY zKlsq6KKIDmFB8=W=5%#Ol0cuNZ`u9szr6Y5pZU4J{o{XkX^}iP0p);^zHWu&?(Ul| zA1Qt56=f!9vnxhl8tnCP!-CV;q0hU^s{)3;{ot3s^Y_1h%V%!8On`$lsBYixW3JjK zd<&JMb?-yKj-Y(^v#$b)MQdMaggt7lnwcNL~mOA=up`CusaMfUo2cewa{SP1f#jhOrm3O}<-8bm&zW1BI^zGZ;_pJ|?gKYP& z|Lkq=`~EMy<6U!uPHS1YIY*+Of?2V*Z}&5<+C4gg?C0;ZAJ9q365ZWb&g`D|7*S#u zwq4ZDVu}t3Y=-&RvC^?1w{7g(w{Q0;SM9@6(LuSL9BpD>KxWsqPpfvSGIo8R1$FNe zX10#i3`3w|^!AZARLm_2#io56>zyfP_YL3zZBTN{&>1%RF*v%s0&TNDU?yO;Oc4)T zs+W+*J>Q+aY4?9?y>a)OfA#vGyZl3ceEaX2{b`{{Z`lVSOfe!wcb^9Q8CP9eG82J{ zuE1O>={~X9dPXG1kkmjKOw|?Xb*~r|4Ad#iQPZX(4`K|t zHbSnFXF-hBLJrzpN67U)A{!|9PcM;@U$yO!SxL9c&g6cKDjj6dU5XUK#3iK^y+Y!Z zX~vJ}Ny#b9(k=cRJU#LM9(c(OKguh8BB#DcJy5oTdLL^DC7B3LX>|{bmb7ZBQ_F3> z#FAY~G6|0wqI!QGoY@5Y#V`dL7(Nz0D2TZW;Lc>y;H1SR68UVV{VJw#RxQj&@f#Y! zCHjJ%g4;#@-8ohZ6;Z%VgB9z{N^Vr`JzMqnjI9?dE)VA|MXg%+L|f0?hIz{dMAY*F{p z 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 literal 0 HcmV?d00001 diff --git a/html/js/tflite/deeplab/webnn/tflite_model_runner_cc_simd.wasm b/html/js/tflite/deeplab/webnn/tflite_model_runner_cc_simd.wasm new file mode 100644 index 0000000000000000000000000000000000000000..590b3d14a20d788f67fa1543fa2159549d5db462 GIT binary patch literal 2819665 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�YOR4`>9a)-=~V- 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

L~bg<6{DM%mr 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 z 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 Lb(Y!HE=iW9I(QvJ^ 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%0Decf}u*^F80p=W(3WoZhApN?!Dfac(Pgu9;( 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≻X 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

#tCE>~7&u@o$0v`zdz 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

o&Aw0STYE$L*{C)ddPM2|MpPgrS1 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

tMAxoi_q~J4 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 u;C+nXuEBvvB~iNm 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%0AkIIMNH;U6JNyf^#s)61nY#}H&cJ!b9g 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 literal 0 HcmV?d00001 diff --git a/html/js/tflite/deeplab/webnn/webnnworker.js b/html/js/tflite/deeplab/webnn/webnnworker.js index 088c15e..66d3824 100644 --- a/html/js/tflite/deeplab/webnn/webnnworker.js +++ b/html/js/tflite/deeplab/webnn/webnnworker.js @@ -1,39 +1,112 @@ -let netInstance; -let inputOptions; + +importScripts('../tflite_model_runner_cc_simd.js'); +importScripts('../../../webnn-polyfill.js'); + let modelRunner; -let inputBuffer; -let outputBuffer; - -let loadtask = async () => { - importScripts("../../utils.js"); - importScripts("../../deeplab/tflite_model_runner_cc_simd.js"); - importScripts("../../deeplab/tflite_model_runner_cc_threaded_simd.worker.js"); - importScripts("./deeplabv3_mnv2_tflite.js"); - netInstance = new DeepLabV3MNV2TFLite(); - inputOptions = netInstance.inputOptions; - self.postMessage({msg: "loading model"}); - modelRunner = await netInstance.load(); - self.postMessage({msg: "model loaded"}); + +function sizeOfShape(shape) { + return shape.reduce((a, b) => { + return a * b; + }); } -let computetask = async () => { - inputBuffer = new Float32Array([1, 321, 321, 3], 0); - outputBuffer = netInstance.compute(modelRunner, inputBuffer); - self.postMessage({msg: "prediction completed"}); +let warmup = async () => { + const inputDimensions = [1, 321, 321, 3]; + const inputBuffer = new Float32Array(sizeOfShape(inputDimensions)); + modelRunner = await load(); + compute(modelRunner, inputBuffer); } -addEventListener('message', (e) => { - const [loadt, computet] = e.data; - if(loadt === "loadtask") { - loadtask(); +let nncompute = (inputBuffer) => { + let outputBuffer = compute(modelRunner, inputBuffer); + outputBuffer = new Float32Array(outputBuffer); + console.log('outputBuffer in worker: ', outputBuffer); + postMessage(outputBuffer, [outputBuffer.buffer]); +} + +addEventListener('message', async (e) => { + const task = e.data.task; + const value = e.data.value; + if(task === "nnwarmup") { + await warmup(); + self.postMessage({msg: "modelloaded"}); } - if(computet === "computetask") { - computetask(); + if(task === "nncompute") { + nncompute(value); } }); -// loadtask(); -// computetask(); +async function load() { + // Create the model runner with the model. + + const MODEL_PATH = '../../../../assets/models/deeplab/deeplab_mobilenetv2_321_no_argmax.tflite'; + + // Load WASM module and model. + const [module, modelArrayBuffer] = await Promise.all([ + tflite_model_runner_ModuleFactory(), + (await fetch(MODEL_PATH)).arrayBuffer(), + ]); + const modelBytes = new Uint8Array(modelArrayBuffer); + const offset = module._malloc(modelBytes.length); + module.HEAPU8.set(modelBytes, offset); + // Create model runner. + const modelRunnerResult = + module.TFLiteWebModelRunner.CreateFromBufferAndOptions( + offset, modelBytes.length, { + numThreads: Math.min( + 4, Math.max(1, (navigator.hardwareConcurrency || 1) / 2)), + enableWebNNDelegate: true, + webNNDevicePreference: 1 // 0 - default, 1 - gpu, 2 - cpu + }); + if (!modelRunnerResult.ok()) { + throw new Error( + 'Failed to create TFLiteWebModelRunner: ' + modelRunnerResult.errorMessage()); + } + const modelRunner = modelRunnerResult.value(); + return modelRunner; +} + +function compute(modelRunner, inputData) { + // Get input and output info. + const inputs = this.callAndDelete( + modelRunner.GetInputs(), results => this.convertCppVectorToArray(results)); + const input = inputs[0]; + const outputs = this.callAndDelete( + modelRunner.GetOutputs(), results => this.convertCppVectorToArray(results)); + const output = outputs[0]; + // Set input tensor data from the image + const inputBuffer = input.data(); + // const inputData = new Float32Array(inputBuffer.length); + inputBuffer.set(inputData); + + const success = modelRunner.Infer(); + if (!success) return; + return output.data(); +} + +/** + * Calls the given function with the given deletable argument, ensuring that + * the argument gets deleted afterwards (even if the function throws an error). +*/ +function callAndDelete(arg, func) { + try { + return func(arg); + } finally { + if (arg != null) arg.delete(); + } +} + +/** Converts the given c++ vector to a JS array. */ +function convertCppVectorToArray(vector) { + if (vector == null) return []; + + const result = []; + for (let i = 0; i < vector.size(); i++) { + const item = vector.get(i); + result.push(item); + } + return result; +} \ No newline at end of file diff --git a/html/js/webnn-polyfill.js b/html/js/webnn-polyfill.js new file mode 100644 index 0000000..e348689 --- /dev/null +++ b/html/js/webnn-polyfill.js @@ -0,0 +1,18181 @@ +!function(e){var t={};function n(s){if(t[s])return t[s].exports;var o=t[s]={i:s,l:!1,exports:{}};return e[s].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,s){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:s})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var s=Object.create(null);if(n.r(s),Object.defineProperty(s,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(s,o,function(t){return e[t]}.bind(null,o));return s},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=0)}({"./node_modules/@tensorflow/tfjs-backend-cpu/dist/backend_cpu.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/backend_cpu.js ***! + \***********************************************************************/ +/*! exports provided: MathBackendCPU */function(e,t,n){"use strict";n.r(t),n.d(t,"MathBackendCPU",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=s.kernel_impls.whereImpl;class i extends s.KernelBackend{constructor(){super(),this.blockSize=48,this.firstUse=!0,this.data=new s.DataStorage(this,Object(s.engine)())}nextDataId(){return i.nextDataId++}write(e,t,n){this.firstUse&&(this.firstUse=!1,Object(s.env)().get("IS_NODE")&&s.backend_util.warn("\n============================\nHi there 👋. Looks like you are running TensorFlow.js in Node.js. To speed things up dramatically, install our node backend, which binds to TensorFlow C++, by running npm i @tensorflow/tfjs-node, or npm i @tensorflow/tfjs-node-gpu if you have CUDA. Then call require('@tensorflow/tfjs-node'); (-gpu suffix for CUDA) at the start of your program. Visit https://github.com/tensorflow/tfjs-node for more details.\n============================"));const o={id:this.nextDataId()};return this.data.set(o,{values:e,dtype:n,refCount:1}),o}makeTensorInfo(e,t,n){let o;if("string"===t&&null!=n&&n.length>0&&s.util.isString(n[0])){const r=n.map((e=>s.util.encodeString(e)));o=this.write(r,e,t)}else o=this.write(n,e,t);return{dataId:o,shape:e,dtype:t}}refCount(e){if(this.data.has(e)){return this.data.get(e).refCount}return 0}incRef(e){this.data.get(e).refCount++}decRef(e){if(this.data.has(e)){this.data.get(e).refCount--}}move(e,t,n,s,o){this.data.set(e,{values:t,dtype:s,refCount:o})}numDataIds(){return this.data.numDataIds()}async read(e){return this.readSync(e)}readSync(e){const{dtype:t,complexTensorInfos:n}=this.data.get(e);if("complex64"===t){const e=this.readSync(n.real.dataId),t=this.readSync(n.imag.dataId);return s.backend_util.mergeRealAndImagArrays(e,t)}return this.data.get(e).values}bufferSync(e){const t=this.readSync(e.dataId);let n=t;if("string"===e.dtype)try{n=t.map((e=>s.util.decodeString(e)))}catch(e){throw new Error("Failed to decode encoded string bytes into utf-8")}return Object(s.buffer)(e.shape,e.dtype,n)}makeOutput(e,t,n){const o=this.write(e,t,n);return Object(s.engine)().makeTensorFromDataId(o,t,n,this)}disposeData(e,t=!1){if(this.data.has(e)){if(this.data.get(e).refCount--,!t&&this.data.get(e).refCount>0)return!1;const{complexTensorInfos:n}=this.data.get(e);null!=n&&(this.disposeData(n.real.dataId,!0),this.disposeData(n.imag.dataId,!0)),this.data.delete(e)}return!0}disposeIntermediateTensorInfo(e){this.disposeData(e.dataId)}async time(e){const t=s.util.now();e();return{kernelMs:s.util.now()-t}}memory(){return{unreliable:!0,reasons:["The reported memory is an upper bound. Due to automatic garbage collection, the true allocated memory may be less."]}}where(e){Object(o.assertNotComplex)([e],"where");const t=this.readSync(e.dataId);return r(e.shape,t)}dispose(){}floatPrecision(){return 32}epsilon(){return super.epsilon()}}i.nextDataId=0},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/base.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/base.js ***! + \****************************************************************/ +/*! exports provided: MathBackendCPU, version_cpu, shared */function(e,t,n){"use strict";n.r(t);var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./backend_cpu */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/backend_cpu.js"),r=n(/*! ./shared */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/shared.js");n.d(t,"shared",(function(){return r})),n.d(t,"MathBackendCPU",(function(){return o.MathBackendCPU}));var i=n(/*! ./version */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/version.js");n.d(t,"version_cpu",(function(){return i.version})), +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +Object(s.registerBackend)("cpu",(()=>new o.MathBackendCPU),1)},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js ***! + \********************************************************************/ +/*! exports provided: assertNotComplex */function(e,t,n){"use strict";n.r(t),n.d(t,"assertNotComplex",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t){Array.isArray(e)||(e=[e]),e.forEach((e=>{null!=e&&s.util.assert("complex64"!==e.dtype,(()=>`${t} does not support complex64 tensors in the CPU backend.`))}))}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/index.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/index.js ***! + \*****************************************************************/ +/*! exports provided: MathBackendCPU, version_cpu, shared */function(e,t,n){"use strict";n.r(t);var s=n(/*! ./base */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/base.js");n.d(t,"MathBackendCPU",(function(){return s.MathBackendCPU})),n.d(t,"version_cpu",(function(){return s.version_cpu})),n.d(t,"shared",(function(){return s.shared}));n(/*! ./register_all_kernels */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/register_all_kernels.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Abs.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Abs.js ***! + \***********************************************************************/ +/*! exports provided: simpleAbsImpl, abs, absConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"simpleAbsImpl",(function(){return r})),n.d(t,"abs",(function(){return i})),n.d(t,"absConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const t=new Float32Array(e.length);for(let n=0;n{const{x:t}=e.inputs,n=e.backend;Object(o.assertNotComplex)(t,"abs");let i=new Float32Array(s.util.sizeFromShape(t.shape));return i=r(n.data.get(t.dataId).values),n.makeOutput(i,t.shape,"float32")},a={kernelName:s.Abs,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Acos.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Acos.js ***! + \************************************************************************/ +/*! exports provided: acos, acosConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"acos",(function(){return r})),n.d(t,"acosConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.Acos,(e=>Math.acos(e))),i={kernelName:s.Acos,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Acosh.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Acosh.js ***! + \*************************************************************************/ +/*! exports provided: acosh, acoshConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"acosh",(function(){return r})),n.d(t,"acoshConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.Acosh,(e=>Math.acosh(e))),i={kernelName:s.Acosh,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Add.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Add.js ***! + \***********************************************************************/ +/*! exports provided: addImpl, addComplexImpl, add, addConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"addImpl",(function(){return i})),n.d(t,"addComplexImpl",(function(){return a})),n.d(t,"add",(function(){return d})),n.d(t,"addConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>e+t)),a=Object(r.createComplexBinaryKernelImpl)(((e,t,n,s)=>({real:e+n,imag:t+s}))),d=Object(r.binaryKernelFunc)(s.Add,i,a),u={kernelName:s.Add,backendName:"cpu",kernelFunc:d}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AddN.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AddN.js ***! + \************************************************************************/ +/*! exports provided: addN, addNConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"addN",(function(){return r})),n.d(t,"addNConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n}=e,r=t;Object(o.assertNotComplex)(t,"addN");const i=r.map((e=>n.data.get(e.dataId).values)),a=Object(s.buffer)(r[0].shape,r[0].dtype),d=a.values;for(let e=0;en&&(n=o,s=e)}b[e]=s}return f.forEach((e=>n.disposeIntermediateTensorInfo(e))),n.makeTensorInfo(p,"int32",b)}const a={kernelName:s.ArgMax,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ArgMin.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ArgMin.js ***! + \**************************************************************************/ +/*! exports provided: argMin, argMinConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"argMin",(function(){return i})),n.d(t,"argMinConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{axis:d}=i;Object(o.assertNotComplex)(a,"argMin");let u=s.util.parseAxisParam(d,a.shape);const l=s.backend_util.getAxesPermutation(u,a.shape.length);let c=a;const f=[];null!=l&&(c=Object(r.transpose)({inputs:{x:a},backend:n,attrs:{perm:l}}),f.push(c),u=s.backend_util.getInnerMostAxes(u.length,c.shape.length)),u=[u[0]],s.backend_util.assertAxesAreInnerMostDims("argMin",u,c.shape.length);const[p,m]=s.backend_util.computeOutAndReduceShapes(c.shape,u),h=s.util.sizeFromShape(p),b=s.util.makeZerosTypedArray(h,"int32"),j=s.util.sizeFromShape(m),g=n.data.get(c.dataId).values;for(let e=0;en.disposeIntermediateTensorInfo(e))),n.makeTensorInfo(p,"int32",b)}const a={kernelName:s.ArgMin,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Asin.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Asin.js ***! + \************************************************************************/ +/*! exports provided: asin, asinConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"asin",(function(){return r})),n.d(t,"asinConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.Asin,(e=>Math.asin(e))),i={kernelName:s.Asin,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Asinh.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Asinh.js ***! + \*************************************************************************/ +/*! exports provided: asinh, asinhConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"asinh",(function(){return r})),n.d(t,"asinhConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.Asinh,(e=>Math.asinh(e))),i={kernelName:s.Asinh,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atan.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atan.js ***! + \************************************************************************/ +/*! exports provided: atan, atanConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"atan",(function(){return r})),n.d(t,"atanConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.Atan,(e=>Math.atan(e))),i={kernelName:s.Atan,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atan2.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atan2.js ***! + \*************************************************************************/ +/*! exports provided: atan2Impl, atan2, atan2Config */function(e,t,n){"use strict";n.r(t),n.d(t,"atan2Impl",(function(){return i})),n.d(t,"atan2",(function(){return a})),n.d(t,"atan2Config",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>Math.atan2(e,t))),a=Object(r.binaryKernelFunc)(s.Atan2,i),d={kernelName:s.Atan2,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atanh.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atanh.js ***! + \*************************************************************************/ +/*! exports provided: atanh, atanhConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"atanh",(function(){return r})),n.d(t,"atanhConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.Atanh,(e=>Math.atanh(e))),i={kernelName:s.Atanh,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPool.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPool.js ***! + \***************************************************************************/ +/*! exports provided: avgPool, avgPoolConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"avgPool",(function(){return a})),n.d(t,"avgPoolConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ../utils/pool_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/pool_utils.js"),i=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Identity.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:d}=t;Object(o.assertNotComplex)(d,"avgPool");const{filterSize:u,strides:l,pad:c,dimRoundingMode:f}=a;s.util.assert(s.backend_util.eitherStridesOrDilationsAreOne(l,1),(()=>`Error in avgPool: Either strides or dilations must be 1. Got strides ${l} and dilations '1'`));const p=s.backend_util.computePool2DInfo(d.shape,u,l,1,c,f);let m;if(1===p.filterWidth&&1===p.filterHeight&&s.util.arraysEqual(p.inShape,p.outShape))m=Object(i.identity)({inputs:{x:d},backend:n});else{const e=n.data.get(d.dataId).values,t=s.util.computeStrides(d.shape),o=Object(r.pool)(e,d.shape,d.dtype,t,p,"avg");m=n.makeTensorInfo(p.outShape,d.dtype,o.values)}return m}const d={kernelName:s.AvgPool,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPool3D.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPool3D.js ***! + \*****************************************************************************/ +/*! exports provided: avgPool3D, avgPool3DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"avgPool3D",(function(){return i})),n.d(t,"avgPool3DConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ../utils/pool_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/pool_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{filterSize:d,strides:u,pad:l,dimRoundingMode:c,dataFormat:f}=i;Object(o.assertNotComplex)(a,"avgPool3d");const p=s.backend_util.computePool3DInfo(a.shape,d,u,1,l,c,f),m=n.data.get(a.dataId).values,h=Object(r.pool3d)(m,a.shape,a.dtype,s.util.computeStrides(a.shape),p,"avg");return n.makeTensorInfo(h.shape,"float32",h.values)}const a={kernelName:s.AvgPool3D,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPool3DGrad.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPool3DGrad.js ***! + \*********************************************************************************/ +/*! exports provided: avgPool3DGrad, avgPool3DGradConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"avgPool3DGrad",(function(){return r})),n.d(t,"avgPool3DGradConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{dy:i,input:a}=t,{filterSize:d,strides:u,pad:l,dimRoundingMode:c}=r;Object(o.assertNotComplex)([i,a],"avgPool3DGrad");const f=s.backend_util.computePool3DInfo(a.shape,d,u,1,l,c),p=f.strideDepth,m=f.strideHeight,h=f.strideWidth,b=f.filterDepth,j=f.filterHeight,g=f.filterWidth,w=f.dilationDepth,_=f.dilationHeight,k=f.dilationWidth,v=f.effectiveFilterDepth,x=f.effectiveFilterHeight,y=f.effectiveFilterWidth,O=v-1-f.padInfo.front,I=y-1-f.padInfo.left,C=x-1-f.padInfo.top,S=Object(s.buffer)(a.shape,"float32"),T=1/(b*j*g),N=n.bufferSync(i);for(let e=0;e=f.outDepth||Math.floor(s)!==s))for(let n=0;n=f.outHeight||Math.floor(o)!==o))for(let n=0;n=f.outWidth||Math.floor(r)!==r)continue;d+=N.get(e,s,o,r,t)}}}S.set(d*T,e,n,s,o,t)}return n.makeTensorInfo(S.shape,S.dtype,S.values)}const i={kernelName:s.AvgPool3DGrad,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPoolGrad.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPoolGrad.js ***! + \*******************************************************************************/ +/*! exports provided: avgPoolGrad, avgPoolGradConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"avgPoolGrad",(function(){return r})),n.d(t,"avgPoolGradConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{dy:i,input:a}=t,d=a;Object(o.assertNotComplex)([i,a],"avgPoolGrad");const{filterSize:u,strides:l,pad:c}=r,f=s.backend_util.computePool2DInfo(d.shape,u,l,1,c),p=f.strideHeight,m=f.strideWidth,h=f.filterHeight,b=f.filterWidth,j=f.dilationHeight,g=f.dilationWidth,w=f.effectiveFilterHeight,_=f.effectiveFilterWidth,k=_-1-f.padInfo.left,v=w-1-f.padInfo.top,x=Object(s.buffer)(d.shape,"float32"),y=1/(h*b),O=n.data.get(i.dataId).values,I=Object(s.buffer)(i.shape,"float32",O);for(let e=0;e=f.outHeight||Math.floor(s)!==s))for(let n=0;n<_;n+=g){const o=(r+n)/m;if(o<0||o>=f.outWidth||Math.floor(o)!==o)continue;i+=I.get(e,s,o,t)}}x.set(i*y,e,n,s,t)}return n.makeTensorInfo(x.shape,x.dtype,x.values)}const i={kernelName:s.AvgPoolGrad,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchMatMul.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchMatMul.js ***! + \*******************************************************************************/ +/*! exports provided: batchMatMul, batchMatMulConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"batchMatMul",(function(){return i})),n.d(t,"batchMatMulConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{a:a,b:d}=t,{transposeA:u,transposeB:l}=i;Object(o.assertNotComplex)([a,d],"matMul");const c=a.shape.length,f=d.shape.length,p=u?a.shape[c-2]:a.shape[c-1],m=l?d.shape[f-1]:d.shape[f-2],h=u?a.shape[c-1]:a.shape[c-2],b=l?d.shape[f-2]:d.shape[f-1],j=a.shape.slice(0,-2),g=d.shape.slice(0,-2),w=s.util.sizeFromShape(j),_=s.util.sizeFromShape(g),k=w===_||1===w||1===_;s.util.assert(c>=2&&f>=2&&k,(()=>`Error in matMul: the input batch dimensions must either be the same or at least one input batch dimension must be 1. Got input batch dimensions of (${j}) and (${g}).`));const v=(w>_?a.shape.slice(0,-2):d.shape.slice(0,-2)).concat([h,b]);s.util.assert(p===m,(()=>`Error in matMul: inner shapes (${p}) and (${m}) of Tensors with shapes ${a.shape} and ${d.shape} and transposeA=${u} and transposeB=${l} must match.`));const x=u?[w,p,h]:[w,h,p],y=l?[_,b,m]:[_,m,b],O=Object(r.reshape)({inputs:{x:a},backend:n,attrs:{shape:x}}),I=Object(r.reshape)({inputs:{x:d},backend:n,attrs:{shape:y}}),C=u?O.shape[1]:O.shape[2],S=u?O.shape[2]:O.shape[1],T=l?I.shape[1]:I.shape[2],N=Math.max(w,_),E=n.data.get(O.dataId).values,A=n.data.get(I.dataId).values,R=s.util.computeStrides(O.shape),F=s.util.computeStrides(I.shape),[$,M,D]=u?[R[0],1,R[1]]:[R[0],R[1],1],[P,B,L]=l?[1,F[1],F[0]]:[F[1],1,F[0]],z=S*T,G=Object(s.buffer)([N,S,T],O.dtype),W=G.values,U=n.blockSize;for(let e=0;e"Batch normalization gradient requires mean and variance to have equal ranks.")),s.util.assert(null==d||u.shape.length===d.shape.length,(()=>"Batch normalization gradient requires mean and offset to have equal ranks.")),s.util.assert(null==a||u.shape.length===a.shape.length,(()=>"Batch normalization gradient requires mean and scale to have equal ranks.")),Object(o.assertNotComplex)([i,u,l,a,d],"batchNorm");let{varianceEpsilon:c}=r;null==c&&(c=.001);const f=n.data.get(i.dataId).values,p=n.data.get(u.dataId).values,m=n.data.get(l.dataId).values,h=a?n.data.get(a.dataId).values:new Float32Array([1]),b=d?n.data.get(d.dataId).values:new Float32Array([0]),j=new Float32Array(f.length),g=b.length,w=h.length,_=m.length,k=p.length;let v=0,x=0,y=0,O=0;for(let e=0;e=g&&(v=0),x>=k&&(x=0),y>=w&&(y=0),O>=_&&(O=0);return n.makeTensorInfo(i.shape,i.dtype,j)}const i={kernelName:s.FusedBatchNorm,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchToSpaceND.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchToSpaceND.js ***! + \**********************************************************************************/ +/*! exports provided: batchToSpaceND, batchToSpaceNDConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"batchToSpaceND",(function(){return d})),n.d(t,"batchToSpaceNDConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"),i=n(/*! ./Slice */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Slice.js"),a=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function d(e){const{inputs:t,backend:n,attrs:d}=e,{x:u}=t,{blockShape:l,crops:c}=d;Object(o.assertNotComplex)([u],"batchToSpaceND");const f=l.reduce(((e,t)=>e*t)),p=s.backend_util.getReshaped(u.shape,l,f),m=s.backend_util.getPermuted(p.length,l.length),h=s.backend_util.getReshapedPermuted(u.shape,l,f),b=s.backend_util.getSliceBeginCoords(c,l.length),j=s.backend_util.getSliceSize(h,c,l.length),g=Object(r.reshape)({inputs:{x:u},backend:n,attrs:{shape:p}}),w=Object(a.transpose)({inputs:{x:g},backend:n,attrs:{perm:m}}),_=Object(r.reshape)({inputs:{x:w},backend:n,attrs:{shape:h}}),k=Object(i.slice)({inputs:{x:_},backend:n,attrs:{begin:b,size:j}});return n.disposeIntermediateTensorInfo(g),n.disposeIntermediateTensorInfo(w),n.disposeIntermediateTensorInfo(_),k}const u={kernelName:s.BatchToSpaceND,backendName:"cpu",kernelFunc:d}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Bincount.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Bincount.js ***! + \****************************************************************************/ +/*! exports provided: bincount, bincountConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"bincount",(function(){return r})),n.d(t,"bincountConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Bincount_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Bincount_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:s}=e,{x:r,weights:i}=t,{size:a}=s,d=n.data.get(r.dataId).values,u=n.data.get(i.dataId).values,l=Object(o.bincountImpl)(d,u,i.dtype,i.shape,a);return n.makeTensorInfo([a],i.dtype,l)}const i={kernelName:s.Bincount,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Bincount_impl.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Bincount_impl.js ***! + \*********************************************************************************/ +/*! exports provided: bincountImpl, bincountReduceImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"bincountImpl",(function(){return o})),n.d(t,"bincountReduceImpl",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t,n,o,r){const i=s.util.sizeFromShape(o),a=s.util.makeZerosTypedArray(r,n);for(let n=0;n=r||(a[s]+=i>0?t[n]:1)}return a}function r(e,t,n,o=!1){const r=e.shape[0],i=e.shape[1],a=Object(s.buffer)([r,n],t.dtype);for(let s=0;s=n||(o?a.set(1,s,i):t.size>0?a.set(a.get(s,i)+t.get(s,r),s,i):a.set(a.get(s,i)+1,s,i))}return a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cast.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cast.js ***! + \************************************************************************/ +/*! exports provided: cast, castConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"cast",(function(){return u})),n.d(t,"castConfig",(function(){return l}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/zeros_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/zeros_impl.js"),i=n(/*! ./Complex */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Complex.js"),a=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Identity.js"),d=n(/*! ./Real */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Real.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function u(e){const{inputs:t,backend:n,attrs:l}=e,{x:c}=t,{dtype:f}=l;if("complex64"===f){if("complex64"===c.dtype)return Object(a.identity)({inputs:{x:c},backend:n});const e=Object(r.zeros)(n,c.shape,c.dtype),t=u({inputs:{x:c},backend:n,attrs:{dtype:"float32"}}),s=Object(i.complex)({inputs:{real:t,imag:e},backend:n});return n.disposeIntermediateTensorInfo(e),n.disposeIntermediateTensorInfo(t),s}if("complex64"===c.dtype){const e=Object(d.real)({inputs:{input:c},backend:n}),t=u({inputs:{x:e},backend:n,attrs:{dtype:f}});return n.disposeIntermediateTensorInfo(e),t}if(!s.util.hasEncodingLoss(c.dtype,f)){const e=Object(a.identity)({inputs:{x:c},backend:n});return{dataId:e.dataId,shape:e.shape,dtype:f}}if("int32"===f){const e=n.data.get(c.dataId).values,t=Int32Array.from(e);return n.makeTensorInfo(c.shape,"int32",t)}if("bool"===f){const e=n.data.get(c.dataId).values,t=s.util.toTypedArray([0],c.dtype),[r,i]=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>e!==t?1:0))(c.shape,[],e,t,"bool");return n.makeTensorInfo(i,"bool",r)}throw new Error(`Error in Cast: failed to cast ${c.dtype} to ${f}`)}const l={kernelName:s.Cast,backendName:"cpu",kernelFunc:u}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Ceil.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Ceil.js ***! + \************************************************************************/ +/*! exports provided: ceilImpl, ceil, ceilConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"ceilImpl",(function(){return i})),n.d(t,"ceil",(function(){return a})),n.d(t,"ceilConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_impl.js"),r=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.createSimpleUnaryImpl)((e=>Math.ceil(e))),a=Object(r.unaryKernelFuncFromImpl)(s.Ceil,i),d={kernelName:s.Ceil,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Clip.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Clip.js ***! + \************************************************************************/ +/*! exports provided: clip, clipConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"clip",(function(){return r})),n.d(t,"clipConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.ClipByValue,((e,t)=>{const n=t;return e>n.clipValueMax?n.clipValueMax:e{const{x:t}=e.inputs,n=e.backend,o=new Float32Array(s.util.sizeFromShape(t.shape)),r=n.data.get(t.dataId),i=r.complexTensorInfos.real,a=r.complexTensorInfos.imag,d=n.data.get(i.dataId).values,u=n.data.get(a.dataId).values;for(let e=0;ee.shape)),p);if(0===s.util.sizeFromShape(m))return n.makeTensorInfo(m,t[0].dtype,[]);const h=t.filter((e=>s.util.sizeFromShape(e.shape)>0));if(1===h.length)return Object(i.identity)({inputs:{x:h[0]},backend:n});const b=h.map((e=>e.shape));if(s.backend_util.assertParamsConsistent(b,p),"complex64"===h[0].dtype){const e=h.map((e=>Object(d.real)({inputs:{input:e},backend:n}))),t=h.map((e=>Object(a.imag)({inputs:{input:e},backend:n}))),s=l({inputs:e,backend:n,attrs:{axis:p}}),r=l({inputs:t,backend:n,attrs:{axis:p}}),i=Object(o.complex)({inputs:{real:s,imag:r},backend:n});return e.forEach((e=>n.disposeIntermediateTensorInfo(e))),t.forEach((e=>n.disposeIntermediateTensorInfo(e))),n.disposeIntermediateTensorInfo(s),n.disposeIntermediateTensorInfo(r),i}const j=h.map((e=>{const t=[-1,s.util.sizeFromShape(e.shape.slice(p))];return Object(u.reshape)({inputs:{x:e},backend:n,attrs:{shape:t}})})),g=j.map((e=>({vals:n.data.get(e.dataId).values,shape:e.shape})));m=s.backend_util.computeOutShape(j.map((e=>e.shape)),1);const w=1===j[0].shape[0],_=Object(r.concatImpl)(g,m,t[0].dtype,w),k=s.backend_util.computeOutShape(h.map((e=>e.shape)),p),v=n.makeTensorInfo(k,t[0].dtype,_);return j.forEach((e=>n.disposeIntermediateTensorInfo(e))),v}const c={kernelName:s.Concat,backendName:"cpu",kernelFunc:l}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Concat_impl.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Concat_impl.js ***! + \*******************************************************************************/ +/*! exports provided: concatImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"concatImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t,n,o){const r=s.util.getArrayFromDType(n,s.util.sizeFromShape(t));if(o&&"string"!==n){let t=0;e.forEach((e=>{const n=s.util.sizeFromShape(e.shape);r.set(e.vals,t),t+=n}))}else{let o=0;e.forEach((e=>{const i="string"===n?s.backend_util.fromUint8ToStringArray(e.vals):e.vals;let a=0;for(let n=0;n=m.inHeight)continue;const r=e*y[0],i=t+n*I;for(let e=0;e=m.inWidth)continue;const o=i+s*C;let a=r+e*y[1];for(let e=0;e=c.inDepth)continue;const r=e*C[0],i=t+n*I[1];for(let e=0;e=c.inHeight)continue;const o=r+e*C[1],a=i+s*I[2];for(let e=0;e=c.inWidth)continue;const r=o+e*C[2],i=a+t*c.inChannels;let d=r;for(let e=0;eMath.cos(e))),i={kernelName:s.Cos,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cosh.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cosh.js ***! + \************************************************************************/ +/*! exports provided: cosh, coshConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"cosh",(function(){return r})),n.d(t,"coshConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.Cosh,(e=>Math.cosh(e))),i={kernelName:s.Cosh,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/CropAndResize.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/CropAndResize.js ***! + \*********************************************************************************/ +/*! exports provided: cropAndResize, cropAndResizeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"cropAndResize",(function(){return o})),n.d(t,"cropAndResizeConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e){const{inputs:t,backend:n,attrs:o}=e,{image:r,boxes:i,boxInd:a}=t,{cropSize:d,method:u,extrapolationValue:l}=o,[c,f,p,m]=r.shape,h=i.shape[0],[b,j]=d,g=Object(s.buffer)([h,b,j,m],"float32"),w=n.data.get(i.dataId).values,_=n.data.get(a.dataId).values,k=n.data.get(r.dataId).values,v=s.util.computeStrides(r.shape),x=s.util.computeStrides(g.shape);for(let e=0;e=c)continue;const a=b>1?(o-n)*(f-1)/(b-1):0,d=j>1?(r-s)*(p-1)/(j-1):0;for(let t=0;t1?n*(f-1)+t*a:.5*(n+o)*(f-1);if(c<0||c>f-1)for(let n=0;n1?s*(p-1)+u*d:.5*(s+r)*(p-1);if(c<0||c>p-1){for(let n=0;n1?s*(p-1)+n*d:.5*(s+r)*(p-1);if(o<0||o>p-1){for(let s=0;se+j-t-1:(e,t)=>e+t;for(let e=0;e`Only NHWC dataFormat supported on CPU for depthToSpace. Got ${a}`)),s.util.assert(i>1,(()=>`blockSize should be > 1 for depthToSpace, but was: ${i}`));const d=r.shape[0],u=r.shape[1],l=r.shape[2],c=r.shape[3],f=u*i,p=l*i,m=c/(i*i),h=n.data.get(r.dataId).values,b=new Float32Array(d*f*p*m);let j=0;for(let e=0;e`Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides ${d} and dilations '${m}'`));const h=s.backend_util.computeConv2DInfo(i.shape,a.shape,d,m,u,c,!0),{filterHeight:b,filterWidth:j,dilationHeight:g,dilationWidth:w,padInfo:_}=h,k=_.left,v=_.top,x=h.outChannels/h.inChannels,y=new s.TensorBuffer(h.outShape,i.dtype),O=n.data.get(i.dataId).values,I=n.data.get(a.dataId).values,C=y.values;for(let e=0;e=h.inHeight)continue;const r=e*p[0],i=t+n*f[1];for(let e=0;e=h.inWidth)continue;const o=r+e*p[1],a=i+s*h.inChannels;let d=t,u=o;for(let e=0;e{const{x:o,filter:r}=e,{strides:i,pad:a,dilations:d}=n,u=t,l=u.data.get(o.dataId).values,c=o.shape.length,f=u.data.get(r.dataId).values,p=r.shape.length,{batchSize:m,inHeight:h,inWidth:b,inChannels:j,outHeight:g,outWidth:w,padInfo:_,strideHeight:k,strideWidth:v,filterHeight:x,filterWidth:y,dilationHeight:O,dilationWidth:I,outShape:C}=s.backend_util.computeDilation2DInfo(o.shape,r.shape,i,a,"NHWC",d),S=s.util.sizeFromShape(C),T=C.length,N=s.util.getArrayFromDType(o.dtype,S);for(let e=0;e=0&&i=0&&mu&&(u=b)}}}N[s.util.locToIndex([e,t,i,d],T,s.util.computeStrides(C))]=u}}}return{dataId:u.write(s.util.toTypedArray(N,o.dtype),C,o.dtype),shape:C,dtype:o.dtype}}}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Dilation2DBackpropFilter.js": +/*!********************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Dilation2DBackpropFilter.js ***! + \********************************************************************************************/ +/*! exports provided: dilation2dBackpropFilterConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"dilation2dBackpropFilterConfig",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */const o={kernelName:s.Dilation2DBackpropFilter,backendName:"cpu",kernelFunc:({inputs:e,backend:t,attrs:n})=>{const{x:o,filter:r,dy:i}=e,{strides:a,pad:d,dilations:u}=n,l=t,c=s.util.toNestedArray(o.shape,l.data.get(o.dataId).values),f=s.util.toNestedArray(r.shape,l.data.get(r.dataId).values),{batchSize:p,inHeight:m,inWidth:h,inChannels:b,outHeight:j,outWidth:g,padInfo:w,strideHeight:_,strideWidth:k,filterHeight:v,filterWidth:x,dilationHeight:y,dilationWidth:O,outShape:I}=s.backend_util.computeDilation2DInfo(o.shape,r.shape,a,d,"NHWC",u);s.util.assert(i.rank===I.length,(()=>`Error in ${s.Dilation2DBackpropFilter}, dy must have the same rank as output ${I.length}, but got ${i.rank}`));const C=s.util.toNestedArray(I,l.data.get(i.dataId).values),S=s.util.makeZerosNestedTypedArray(r.shape,r.dtype);for(let e=0;e=0&&s=0&&ui&&(i=o,a=t,d=n)}}}S[a][d][r]+=C[e][t][s][r]}}}return{dataId:l.write(s.util.toTypedArray(S,o.dtype),r.shape,r.dtype),shape:r.shape,dtype:r.dtype}}}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Dilation2DBackpropInput.js": +/*!*******************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Dilation2DBackpropInput.js ***! + \*******************************************************************************************/ +/*! exports provided: dilation2dBackpropInputConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"dilation2dBackpropInputConfig",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */const o={kernelName:s.Dilation2DBackpropInput,backendName:"cpu",kernelFunc:({inputs:e,backend:t,attrs:n})=>{const{x:o,filter:r,dy:i}=e,{strides:a,pad:d,dilations:u}=n,l=t,c=s.util.toNestedArray(o.shape,l.data.get(o.dataId).values),f=s.util.toNestedArray(r.shape,l.data.get(r.dataId).values),{batchSize:p,inHeight:m,inWidth:h,inChannels:b,outHeight:j,outWidth:g,padInfo:w,strideHeight:_,strideWidth:k,filterHeight:v,filterWidth:x,dilationHeight:y,dilationWidth:O,outShape:I}=s.backend_util.computeDilation2DInfo(o.shape,r.shape,a,d,"NHWC",u);s.util.assert(i.rank===I.length,(()=>`Error in ${s.Dilation2DBackpropInput}, dy must have the same rank as output ${I.length}, but got ${i.rank}`));const C=s.util.toNestedArray(I,l.data.get(i.dataId).values),S=s.util.makeZerosNestedTypedArray(o.shape,o.dtype);for(let e=0;e=0&&s=0&&ui&&(i=o,a=s,d=u)}}}S[e][a][d][r]+=C[e][t][s][r]}}}return{dataId:l.write(s.util.toTypedArray(S,o.dtype),o.shape,o.dtype),shape:o.shape,dtype:o.dtype}}}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Einsum.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Einsum.js ***! + \**************************************************************************/ +/*! exports provided: einsum, einsumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"einsum",(function(){return d})),n.d(t,"einsumConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Multiply */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Multiply.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"),i=n(/*! ./Sum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sum.js"),a=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function d(e){const{inputs:t,backend:n,attrs:d}=e,{equation:u}=d,l=t,{allDims:c,summedDims:f,idDims:p}=s.backend_util.decodeEinsumEquation(u,l.length);s.backend_util.checkEinsumDimSizes(c.length,p,l);const{path:m,steps:h}=s.backend_util.getEinsumComputePath(f,p),b=h.length;let j=null,g=c.length;const w=[];for(let e=0;e=0&&(j=Object(i.sum)({inputs:{x:j},backend:n,attrs:{axis:m[e]-(c.length-g),keepDims:!1}}),w.push(j)),g--)}for(const e of w)e!==j&&n.disposeIntermediateTensorInfo(e);return j}const u={kernelName:s.Einsum,backendName:"cpu",kernelFunc:d}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Elu.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Elu.js ***! + \***********************************************************************/ +/*! exports provided: elu, eluConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"elu",(function(){return r})),n.d(t,"eluConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.Elu,(e=>e>=0?e:Math.exp(e)-1)),i={kernelName:s.Elu,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/EluGrad.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/EluGrad.js ***! + \***************************************************************************/ +/*! exports provided: eluGrad, eluGradConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"eluGrad",(function(){return r})),n.d(t,"eluGradConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n}=e,{dy:r,y:i}=t;Object(o.assertNotComplex)([r,i],"eluGrad");const a=new Float32Array(s.util.sizeFromShape(i.shape)),d=n.data.get(i.dataId).values,u=n.data.get(r.dataId).values;for(let e=0;e=1?u[e]:u[e]*(t+1)}return n.makeTensorInfo(i.shape,"float32",a)}const i={kernelName:s.EluGrad,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Equal.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Equal.js ***! + \*************************************************************************/ +/*! exports provided: equalImpl, equal, equalConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"equalImpl",(function(){return i})),n.d(t,"equal",(function(){return a})),n.d(t,"equalConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>e===t?1:0)),a=Object(r.binaryKernelFunc)(s.Equal,i,null,"bool"),d={kernelName:s.Equal,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Erf.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Erf.js ***! + \***********************************************************************/ +/*! exports provided: erf, erfConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"erf",(function(){return c})),n.d(t,"erfConfig",(function(){return f}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=s.backend_util.ERF_P,i=s.backend_util.ERF_A1,a=s.backend_util.ERF_A2,d=s.backend_util.ERF_A3,u=s.backend_util.ERF_A4,l=s.backend_util.ERF_A5,c=Object(o.unaryKernelFunc)(s.Erf,(e=>{const t=Math.sign(e),n=Math.abs(e),s=1/(1+r*n);return t*(1-((((l*s+u)*s+d)*s+a)*s+i)*s*Math.exp(-n*n))})),f={kernelName:s.Erf,backendName:"cpu",kernelFunc:c}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Exp.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Exp.js ***! + \***********************************************************************/ +/*! exports provided: expImpl, exp, expConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"expImpl",(function(){return i})),n.d(t,"exp",(function(){return a})),n.d(t,"expConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_impl.js"),r=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.createSimpleUnaryImpl)((e=>Math.exp(e))),a=Object(r.unaryKernelFuncFromImpl)(s.Exp,i),d={kernelName:s.Exp,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ExpandDims.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ExpandDims.js ***! + \******************************************************************************/ +/*! exports provided: expandDims, expandDimsConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"expandDims",(function(){return r})),n.d(t,"expandDimsConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{input:i}=t,{dim:a}=r,d=i.shape.length,u=i.shape.slice();let l=a;return a<0&&(s.util.assert(-(d+1)<=a,(()=>`Axis must be in the interval [${-(d+1)}, ${d}]`)),l=d+a+1),u.splice(l,0,1),Object(o.reshape)({inputs:{x:i},backend:n,attrs:{shape:u}})}const i={kernelName:s.ExpandDims,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Expm1.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Expm1.js ***! + \*************************************************************************/ +/*! exports provided: expm1Impl, expm1, expm1Config */function(e,t,n){"use strict";n.r(t),n.d(t,"expm1Impl",(function(){return i})),n.d(t,"expm1",(function(){return a})),n.d(t,"expm1Config",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_impl.js"),r=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.createSimpleUnaryImpl)((e=>Math.expm1(e))),a=Object(r.unaryKernelFuncFromImpl)(s.Expm1,i),d={kernelName:s.Expm1,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FFT.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FFT.js ***! + \***********************************************************************/ +/*! exports provided: fft, fftConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fft",(function(){return i})),n.d(t,"fftConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/fft_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/fft_utils.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n}=e,{input:i}=t,a=s.util.sizeFromShape(i.shape),d=i.shape[i.shape.length-1],u=a/d,l=Object(r.reshape)({inputs:{x:i},backend:n,attrs:{shape:[u,d]}}),c=Object(o.fftBatch)(l,!1,n),f=Object(r.reshape)({inputs:{x:c},backend:n,attrs:{shape:i.shape}});return n.disposeIntermediateTensorInfo(l),n.disposeIntermediateTensorInfo(c),f}const a={kernelName:s.FFT,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Fill.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Fill.js ***! + \************************************************************************/ +/*! exports provided: fill, fillConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fill",(function(){return o})),n.d(t,"fillConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e){const{backend:t,attrs:n}=e,{shape:o,value:r,dtype:i}=n,a=i||s.util.inferDtype(r),d=s.util.getArrayFromDType(a,s.util.sizeFromShape(o));return function(e,t,n){e.fill(t)}(d,r),t.makeTensorInfo(o,a,d)}const r={kernelName:s.Fill,backendName:"cpu",kernelFunc:o}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FlipLeftRight.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FlipLeftRight.js ***! + \*********************************************************************************/ +/*! exports provided: flipLeftRightConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"flipLeftRightConfig",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */const o={kernelName:s.FlipLeftRight,backendName:"cpu",kernelFunc:({inputs:e,attrs:t,backend:n})=>{const{image:o}=e,r=n,i=s.util.getTypedArrayFromDType(o.dtype,s.util.sizeFromShape(o.shape)),[a,d,u,l]=o.shape,c=r.data.get(o.dataId).values;for(let e=0;e=0&&rMath.floor(e))),a=Object(r.unaryKernelFuncFromImpl)(s.Floor,i),d={kernelName:s.Floor,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FloorDiv.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FloorDiv.js ***! + \****************************************************************************/ +/*! exports provided: floorDivImpl, floorDiv, floorDivConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"floorDivImpl",(function(){return i})),n.d(t,"floorDiv",(function(){return a})),n.d(t,"floorDivConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>Math.floor(e/t))),a=Object(r.binaryKernelFunc)(s.FloorDiv,i,null,"int32"),d={kernelName:s.FloorDiv,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FusedConv2D.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FusedConv2D.js ***! + \*******************************************************************************/ +/*! exports provided: fusedConv2D, fusedConv2DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fusedConv2D",(function(){return a})),n.d(t,"fusedConv2DConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/fused_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/fused_utils.js"),r=n(/*! ./Add */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Add.js"),i=n(/*! ./Conv2D */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv2D.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){const{inputs:t,backend:n,attrs:s}=e,{x:a,filter:d,bias:u,preluActivationWeights:l}=t,{strides:c,pad:f,dataFormat:p,dilations:m,dimRoundingMode:h,activation:b,leakyreluAlpha:j}=s;let g=Object(i.conv2D)({inputs:{x:a,filter:d},backend:n,attrs:{strides:c,pad:f,dataFormat:p,dilations:m,dimRoundingMode:h}});if(u){const e=g;g=Object(r.add)({inputs:{a:g,b:u},backend:n}),n.disposeIntermediateTensorInfo(e)}if(b){const e=g;g=Object(o.applyActivation)(n,g,b,l,j),n.disposeIntermediateTensorInfo(e)}return g}const d={kernelName:s.FusedConv2D,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FusedDepthwiseConv2D.js": +/*!****************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FusedDepthwiseConv2D.js ***! + \****************************************************************************************/ +/*! exports provided: fusedDepthwiseConv2D, fusedDepthwiseConv2DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fusedDepthwiseConv2D",(function(){return a})),n.d(t,"fusedDepthwiseConv2DConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/fused_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/fused_utils.js"),r=n(/*! ./Add */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Add.js"),i=n(/*! ./DepthwiseConv2dNative */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DepthwiseConv2dNative.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){const{inputs:t,backend:n,attrs:s}=e,{x:a,filter:d,bias:u,preluActivationWeights:l}=t,{strides:c,pad:f,dataFormat:p,dilations:m,dimRoundingMode:h,activation:b,leakyreluAlpha:j}=s;let g=Object(i.depthwiseConv2dNative)({inputs:{x:a,filter:d},backend:n,attrs:{strides:c,pad:f,dataFormat:p,dilations:m,dimRoundingMode:h}});if(u){const e=g;g=Object(r.add)({inputs:{a:g,b:u},backend:n}),n.disposeIntermediateTensorInfo(e)}if(b){const e=g;g=Object(o.applyActivation)(n,g,b,l,j),n.disposeIntermediateTensorInfo(e)}return g}const d={kernelName:s.FusedDepthwiseConv2D,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GatherNd.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GatherNd.js ***! + \****************************************************************************/ +/*! exports provided: gatherNd, gatherNdConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"gatherNd",(function(){return r})),n.d(t,"gatherNdConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./GatherNd_Impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GatherNd_Impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n}=e,{params:r,indices:i}=t,a=s.util.sizeFromShape(r.shape),d=i.shape,u=d[d.length-1],[l,c,f,p]=s.backend_util.prepareAndValidate(r,i);if(0===c)return n.makeTensorInfo(l,r.dtype,[]);const m=n.data.get(i.dataId).values,h=n.bufferSync(r),b=Object(o.gatherNdImpl)(m,h,r.dtype,c,u,f,p,r.shape,a);return n.makeTensorInfo(l,r.dtype,b.values)}const i={kernelName:s.GatherNd,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GatherNd_Impl.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GatherNd_Impl.js ***! + \*********************************************************************************/ +/*! exports provided: gatherNdImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"gatherNdImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t,n,o,r,i,a,d,u){const l=Object(s.buffer)([o,i],n);for(let n=0;n=u/i)throw new Error(`Invalid indices: ${s} does not index into ${d}`);for(let e=0;ee>t?1:0)),a=Object(r.binaryKernelFunc)(s.Greater,i,null,"bool"),d={kernelName:s.Greater,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GreaterEqual.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GreaterEqual.js ***! + \********************************************************************************/ +/*! exports provided: greaterEqualImpl, greaterEqual, greaterEqualConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"greaterEqualImpl",(function(){return i})),n.d(t,"greaterEqual",(function(){return a})),n.d(t,"greaterEqualConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>e>=t?1:0)),a=Object(r.binaryKernelFunc)(s.GreaterEqual,i,null,"bool"),d={kernelName:s.GreaterEqual,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IFFT.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IFFT.js ***! + \************************************************************************/ +/*! exports provided: ifft, ifftConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"ifft",(function(){return i})),n.d(t,"ifftConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/fft_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/fft_utils.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n}=e,{input:i}=t,a=s.util.sizeFromShape(i.shape),d=i.shape[i.shape.length-1],u=a/d,l=Object(r.reshape)({inputs:{x:i},backend:n,attrs:{shape:[u,d]}}),c=Object(o.fftBatch)(l,!0,n),f=Object(r.reshape)({inputs:{x:c},backend:n,attrs:{shape:i.shape}});return n.disposeIntermediateTensorInfo(l),n.disposeIntermediateTensorInfo(c),f}const a={kernelName:s.IFFT,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Identity.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Identity.js ***! + \****************************************************************************/ +/*! exports provided: identity, identityConfig */function(e,t,n){"use strict"; +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function s(e){const{inputs:t,backend:n}=e,{x:s}=t;return n.incRef(s.dataId),{dataId:s.dataId,shape:s.shape,dtype:s.dtype}}n.r(t),n.d(t,"identity",(function(){return s})),n.d(t,"identityConfig",(function(){return o}));const o={kernelName:n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js").Identity,backendName:"cpu",kernelFunc:s}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Imag.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Imag.js ***! + \************************************************************************/ +/*! exports provided: imag, imagConfig */function(e,t,n){"use strict"; +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function s(e){const{inputs:t,backend:n}=e,{input:s}=t,o=n.data.get(s.dataId).complexTensorInfos.imag,r=n.data.get(o.dataId).values;return n.makeTensorInfo(o.shape,o.dtype,r)}n.r(t),n.d(t,"imag",(function(){return s})),n.d(t,"imagConfig",(function(){return o}));const o={kernelName:n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js").Imag,backendName:"cpu",kernelFunc:s}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsFinite.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsFinite.js ***! + \****************************************************************************/ +/*! exports provided: isFinite, isFiniteConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"isFinite",(function(){return r})),n.d(t,"isFiniteConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.IsFinite,(e=>Number.isFinite(e)?1:0),"bool"),i={kernelName:s.IsFinite,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsInf.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsInf.js ***! + \*************************************************************************/ +/*! exports provided: isInf, isInfConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"isInf",(function(){return r})),n.d(t,"isInfConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.IsInf,(e=>Math.abs(e)===1/0?1:0),"bool"),i={kernelName:s.IsInf,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsNaN.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsNaN.js ***! + \*************************************************************************/ +/*! exports provided: isNaN, isNaNConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"isNaN",(function(){return r})),n.d(t,"isNaNConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.IsNan,(e=>Number.isNaN(e)?1:0),"bool"),i={kernelName:s.IsNan,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LRN.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LRN.js ***! + \***********************************************************************/ +/*! exports provided: lRN, lRNConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"lRN",(function(){return r})),n.d(t,"lRNConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i}=t,{depthRadius:a,bias:d,alpha:u,beta:l}=r;Object(o.assertNotComplex)(i,"LRN");const c=i.shape[3],f=c-1,p=n.data.get(i.dataId).values,m=s.util.sizeFromShape(i.shape),h=new Float32Array(m);function b(e){const t=e%c;let n=e-t+Math.max(0,t-a);const s=e-t+Math.min(t+a,f);let o=0;for(;n<=s;n++){const e=p[n];o+=e*e}return o}for(let e=0;eee<=t?1:0)),a=Object(r.binaryKernelFunc)(s.LessEqual,i,null,"bool"),d={kernelName:s.LessEqual,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LinSpace.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LinSpace.js ***! + \****************************************************************************/ +/*! exports provided: linSpace, linSpaceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"linSpace",(function(){return r})),n.d(t,"linSpaceConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./LinSpace_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LinSpace_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{backend:t,attrs:n}=e,{start:s,stop:r,num:i}=n,a=Object(o.linSpaceImpl)(s,r,i);return t.makeTensorInfo([a.length],"float32",a)}const i={kernelName:s.LinSpace,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LinSpace_impl.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LinSpace_impl.js ***! + \*********************************************************************************/ +/*! exports provided: linSpaceImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"linSpaceImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t,n){const o=(t-e)/(n-1),r=s.util.makeZerosTypedArray(n,"float32");r[0]=e;for(let e=1;eMath.log(e))),a=Object(r.unaryKernelFuncFromImpl)(s.Log,i),d={kernelName:s.Log,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Log1p.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Log1p.js ***! + \*************************************************************************/ +/*! exports provided: log1p, log1pConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"log1p",(function(){return r})),n.d(t,"log1pConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.Log1p,(e=>Math.log1p(e))),i={kernelName:s.Log1p,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalAnd.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalAnd.js ***! + \******************************************************************************/ +/*! exports provided: logicalAndImpl, logicalAnd, logicalAndConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"logicalAndImpl",(function(){return i})),n.d(t,"logicalAnd",(function(){return a})),n.d(t,"logicalAndConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>e&&t)),a=Object(r.binaryKernelFunc)(s.LogicalAnd,i,null,"bool"),d={kernelName:s.LogicalAnd,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalNot.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalNot.js ***! + \******************************************************************************/ +/*! exports provided: logicalNot, logicalNotConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"logicalNot",(function(){return r})),n.d(t,"logicalNotConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.LogicalNot,(e=>e?0:1),"bool"),i={kernelName:s.LogicalNot,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalOr.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalOr.js ***! + \*****************************************************************************/ +/*! exports provided: logicalOrImpl, logicalOr, logicalOrConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"logicalOrImpl",(function(){return i})),n.d(t,"logicalOr",(function(){return a})),n.d(t,"logicalOrConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>e||t)),a=Object(r.binaryKernelFunc)(s.LogicalOr,i,null,"bool"),d={kernelName:s.LogicalOr,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Max.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Max.js ***! + \***********************************************************************/ +/*! exports provided: max, maxConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"max",(function(){return a})),n.d(t,"maxConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./Max_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Max_impl.js"),i=n(/*! ./Transpose_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:d}=t,{reductionIndices:u,keepDims:l}=a,c=n;let f=d.shape;const p=f.length,m=s.util.parseAxisParam(u,f);let h=m;const b=s.backend_util.getAxesPermutation(h,p);let j=c.data.get(d.dataId).values;if(null!=b){const e=new Array(p);for(let t=0;t`Error in maxPool: Either strides or dilations must be 1. Got strides ${l} and dilations '1'`));const p=s.backend_util.computePool2DInfo(d.shape,u,l,1,c,f);let m;if(1===p.filterWidth&&1===p.filterHeight&&s.util.arraysEqual(p.inShape,p.outShape))m=Object(i.identity)({inputs:{x:d},backend:n});else{const e=n.data.get(d.dataId).values,t=s.util.computeStrides(d.shape),o=Object(r.pool)(e,d.shape,d.dtype,t,p,"max");m=n.makeTensorInfo(p.outShape,d.dtype,o.values)}return m}const d={kernelName:s.MaxPool,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPool3D.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPool3D.js ***! + \*****************************************************************************/ +/*! exports provided: maxPool3D, maxPool3DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPool3D",(function(){return i})),n.d(t,"maxPool3DConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ../utils/pool_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/pool_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{filterSize:d,strides:u,pad:l,dimRoundingMode:c,dataFormat:f}=i;Object(o.assertNotComplex)(a,"maxPool3d");const p=s.backend_util.computePool3DInfo(a.shape,d,u,1,l,c,f),m=n.data.get(a.dataId).values,h=Object(r.pool3d)(m,a.shape,a.dtype,s.util.computeStrides(a.shape),p,"max");return n.makeTensorInfo(h.shape,"float32",h.values)}const a={kernelName:s.MaxPool3D,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPool3DGrad.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPool3DGrad.js ***! + \*********************************************************************************/ +/*! exports provided: maxPool3DGrad, maxPool3DGradConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPool3DGrad",(function(){return i})),n.d(t,"maxPool3DGradConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ../utils/pool_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/pool_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{dy:a,input:d}=t,{filterSize:u,strides:l,pad:c,dimRoundingMode:f}=i;Object(o.assertNotComplex)([a,d],"maxPool3DGrad");const p=s.backend_util.computePool3DInfo(d.shape,u,l,1,c,f),m=n.bufferSync(d),h=Object(r.maxPool3dPositions)(m,p),b=p.strideDepth,j=p.strideHeight,g=p.strideWidth,w=p.dilationDepth,_=p.dilationHeight,k=p.dilationWidth,v=p.effectiveFilterDepth,x=p.effectiveFilterHeight,y=p.effectiveFilterWidth,O=v-1-p.padInfo.front,I=y-1-p.padInfo.left,C=x-1-p.padInfo.top,S=Object(s.buffer)(d.shape,"float32"),T=n.bufferSync(a);for(let e=0;e=p.outDepth||Math.floor(s)!==s))for(let o=0;o=p.outHeight||Math.floor(r)!==r))for(let i=0;i=p.outWidth||Math.floor(u)!==u)continue;const l=v*x*y-1-h.get(e,s,r,u,t)===n*x*y+o*y+i?1:0;if(0===l)continue;d+=T.get(e,s,r,u,t)*l}}}S.set(d,e,n,s,o,t)}return n.makeTensorInfo(S.shape,S.dtype,S.values)}const a={kernelName:s.MaxPool3DGrad,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolGrad.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolGrad.js ***! + \*******************************************************************************/ +/*! exports provided: maxPoolGrad, maxPoolGradConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPoolGrad",(function(){return i})),n.d(t,"maxPoolGradConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ../utils/pool_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/pool_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{dy:a,input:d,output:u}=t,l=d;Object(o.assertNotComplex)([d,u],"maxPoolGrad");const{filterSize:c,strides:f,pad:p,dimRoundingMode:m}=i,h=s.backend_util.computePool2DInfo(l.shape,c,f,1,p,m),b=n.data.get(l.dataId).values,j=Object(s.buffer)(h.outShape,l.dtype,Object(r.maxPoolPositions)(b,l.shape,l.dtype,h).values),g=h.strideHeight,w=h.strideWidth,_=h.dilationHeight,k=h.dilationWidth,v=h.effectiveFilterHeight,x=h.effectiveFilterWidth,y=x-1-h.padInfo.left,O=v-1-h.padInfo.top,I=Object(s.buffer)(l.shape,"float32"),C=n.data.get(a.dataId).values,S=Object(s.buffer)(a.shape,"float32",C);for(let e=0;e=h.outHeight||Math.floor(s)!==s))for(let o=0;o=h.outWidth||Math.floor(a)!==a)continue;const d=v*x-1-j.get(e,s,a,t)===n*x+o?1:0;if(0===d)continue;i+=S.get(e,s,a,t)*d}}I.set(i,e,n,s,t)}return n.makeTensorInfo(I.shape,I.dtype,I.values)}const a={kernelName:s.MaxPoolGrad,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolWithArgmax.js": +/*!*************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolWithArgmax.js ***! + \*************************************************************************************/ +/*! exports provided: maxPoolWithArgmaxConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPoolWithArgmaxConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./MaxPoolWithArgmax_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolWithArgmax_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i={kernelName:s.MaxPoolWithArgmax,backendName:"cpu",kernelFunc:({inputs:e,attrs:t,backend:n})=>{const{x:i}=e,{filterSize:a,strides:d,pad:u,includeBatchInIndex:l}=t,c=n;Object(o.assertNotComplex)(i,"MaxPoolWithArgmax");const f=c.data.get(i.dataId).values,p=s.backend_util.computePool2DInfo(i.shape,a,d,[1,1],u),[m,h]=Object(r.maxPoolWithArgmaxImpl)(f,i.shape,i.dtype,l,p),b=c.write(m,p.outShape,i.dtype),j=c.write(h,p.outShape,i.dtype);return[{dataId:b,shape:p.outShape,dtype:i.dtype},{dataId:j,shape:p.outShape,dtype:"int32"}]}}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolWithArgmax_impl.js": +/*!******************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolWithArgmax_impl.js ***! + \******************************************************************************************/ +/*! exports provided: maxPoolWithArgmaxImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPoolWithArgmaxImpl",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/pool_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/pool_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e,t,n,r,i){const a=s.util.computeStrides(t),d=Object(o.pool)(e,t,n,a,i,"max"),u=Object(o.maxPoolPositions)(e,t,n,i,!0,r);return[d.values,u.values]}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Max_impl.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Max_impl.js ***! + \****************************************************************************/ +/*! exports provided: maxImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"maxImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t,n,o){const r=s.util.getTypedArrayFromDType(o,s.util.sizeFromShape(n));for(let n=0;no)&&(o=t)}r[n]=o}return r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Maximum.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Maximum.js ***! + \***************************************************************************/ +/*! exports provided: maximumImpl, maximum, maximumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maximumImpl",(function(){return i})),n.d(t,"maximum",(function(){return a})),n.d(t,"maximumConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>Math.max(e,t))),a=Object(r.binaryKernelFunc)(s.Maximum,i),d={kernelName:s.Maximum,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Mean.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Mean.js ***! + \************************************************************************/ +/*! exports provided: mean, meanConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"mean",(function(){return a})),n.d(t,"meanConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Cast */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cast.js"),r=n(/*! ./RealDiv */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RealDiv.js"),i=n(/*! ./Sum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sum.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:d}=t,{axis:u,keepDims:l}=a,c=s.util.parseAxisParam(u,d.shape),f=s.backend_util.computeOutAndReduceShapes(d.shape,c)[1],p=s.util.sizeFromShape(f),m=[],h=n.makeTensorInfo([],"float32",new Float32Array([p]));m.push(h);const b=Object(o.cast)({inputs:{x:d},backend:n,attrs:{dtype:"float32"}});m.push(b);const j=Object(r.div)({inputs:{a:b,b:h},backend:n});m.push(j);const g=Object(i.sum)({inputs:{x:j},backend:n,attrs:{axis:u,keepDims:l}});return m.forEach((e=>n.disposeIntermediateTensorInfo(e))),g}const d={kernelName:s.Mean,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Min.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Min.js ***! + \***********************************************************************/ +/*! exports provided: min, minConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"min",(function(){return a})),n.d(t,"minConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"),i=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:d}=t,{axis:u,keepDims:l}=a;Object(o.assertNotComplex)(d,"min");const c=s.util.parseAxisParam(u,d.shape);let f=c;const p=s.backend_util.getAxesPermutation(f,d.shape.length);let m=d;null!=p&&(m=Object(i.transpose)({inputs:{x:d},backend:n,attrs:{perm:p}}),f=s.backend_util.getInnerMostAxes(f.length,d.shape.length)),s.backend_util.assertAxesAreInnerMostDims("min",f,m.shape.length);const[h,b]=s.backend_util.computeOutAndReduceShapes(m.shape,f),j=s.util.sizeFromShape(b),g=s.util.makeZerosTypedArray(s.util.sizeFromShape(h),m.dtype),w=n.data.get(m.dataId).values;for(let e=0;eMath.min(e,t))),a=Object(r.binaryKernelFunc)(s.Minimum,i),d={kernelName:s.Minimum,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MirrorPad.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MirrorPad.js ***! + \*****************************************************************************/ +/*! exports provided: mirrorPad, mirrorPadConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"mirrorPad",(function(){return r})),n.d(t,"mirrorPadConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i}=t,{paddings:a,mode:d}=r;Object(o.assertNotComplex)(i,"mirrorPad");const u=a.map(((e,t)=>e[0]+i.shape[t]+e[1])),l=a.map((e=>e[0])),c=a.map(((e,t)=>e[0]+i.shape[t])),f="reflect"===d?0:1,p=n.data.get(i.dataId).values,m=i.shape.length,h=s.util.computeStrides(i.shape),b=s.util.sizeFromShape(u),j=u.length,g=s.util.computeStrides(u),w=s.util.getTypedArrayFromDType(i.dtype,b);for(let e=0;e=c[e]&&(t[e]=2*(c[e]-1)-t[e]+f);t=t.map(((e,t)=>e-l[t]));const n=s.util.locToIndex(t,m,h);w[e]=p[n]}return{dataId:n.write(w,u,i.dtype),shape:u,dtype:i.dtype}}const i={kernelName:s.MirrorPad,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Mod.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Mod.js ***! + \***********************************************************************/ +/*! exports provided: modImpl, mod, modConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"modImpl",(function(){return i})),n.d(t,"mod",(function(){return a})),n.d(t,"modConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>{const n=e%t;return e<0&&t<0||e>=0&&t>=0?n:(n+t)%t})),a=Object(r.binaryKernelFunc)(s.Mod,i),d={kernelName:s.Mod,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Multinomial.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Multinomial.js ***! + \*******************************************************************************/ +/*! exports provided: multinomial, multinomialConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"multinomial",(function(){return a})),n.d(t,"multinomialConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! seedrandom */"./node_modules/seedrandom/index.js"),r=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),i=n(/*! ./Softmax */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Softmax.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){const{inputs:t,backend:n,attrs:a}=e,{logits:d}=t,{numSamples:u,seed:l,normalized:c}=a;Object(r.assertNotComplex)(d,"multinomial");const f=c?d:Object(i.softmax)({inputs:{logits:d},backend:n,attrs:{dim:-1}}),p=f.shape[0],m=f.shape[1],h=n.data.get(f.dataId).values,b=[p,u],j=s.util.makeZerosTypedArray(s.util.sizeFromShape(b),"int32");for(let e=0;ee*t)),a=Object(r.createComplexBinaryKernelImpl)(((e,t,n,s)=>({real:e*n-t*s,imag:e*s+t*n}))),d=Object(r.binaryKernelFunc)(s.Multiply,i,a),u={kernelName:s.Multiply,backendName:"cpu",kernelFunc:d}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Neg.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Neg.js ***! + \***********************************************************************/ +/*! exports provided: negImpl, neg, negConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"negImpl",(function(){return i})),n.d(t,"neg",(function(){return a})),n.d(t,"negConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./Multiply */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Multiply.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e,t,n){const o=s.util.createScalarValue(-1,n);return Object(r.multiplyImpl)([],t,o,e,n)}function a(e){const{inputs:t,backend:n}=e,{x:s}=t;Object(o.assertNotComplex)(s,"neg");const r=n.data.get(s.dataId).values,[a,d]=i(r,s.shape,s.dtype);return n.makeTensorInfo(d,s.dtype,a)}const d={kernelName:s.Neg,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV3.js": +/*!***************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV3.js ***! + \***************************************************************************************/ +/*! exports provided: nonMaxSuppressionV3, nonMaxSuppressionV3Config */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionV3",(function(){return i})),n.d(t,"nonMaxSuppressionV3Config",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=s.kernel_impls.nonMaxSuppressionV3Impl;function i(e){const{inputs:t,backend:n,attrs:s}=e,{boxes:i,scores:a}=t,{maxOutputSize:d,iouThreshold:u,scoreThreshold:l}=s;Object(o.assertNotComplex)(i,"NonMaxSuppression");const c=n.data.get(i.dataId).values,f=n.data.get(a.dataId).values,{selectedIndices:p}=r(c,f,d,u,l);return n.makeTensorInfo([p.length],"int32",new Int32Array(p))}const a={kernelName:s.NonMaxSuppressionV3,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV4.js": +/*!***************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV4.js ***! + \***************************************************************************************/ +/*! exports provided: nonMaxSuppressionV4, nonMaxSuppressionV4Config */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionV4",(function(){return i})),n.d(t,"nonMaxSuppressionV4Config",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=s.kernel_impls.nonMaxSuppressionV4Impl;function i(e){const{inputs:t,backend:n,attrs:s}=e,{boxes:i,scores:a}=t,{maxOutputSize:d,iouThreshold:u,scoreThreshold:l,padToMaxOutputSize:c}=s;Object(o.assertNotComplex)(i,"NonMaxSuppressionPadded");const f=n.data.get(i.dataId).values,p=n.data.get(a.dataId).values,{selectedIndices:m,validOutputs:h}=r(f,p,d,u,l,c);return[n.makeTensorInfo([m.length],"int32",new Int32Array(m)),n.makeTensorInfo([],"int32",new Int32Array([h]))]}const a={kernelName:s.NonMaxSuppressionV4,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV5.js": +/*!***************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV5.js ***! + \***************************************************************************************/ +/*! exports provided: nonMaxSuppressionV5, nonMaxSuppressionV5Config */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionV5",(function(){return i})),n.d(t,"nonMaxSuppressionV5Config",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=s.kernel_impls.nonMaxSuppressionV5Impl;function i(e){const{inputs:t,backend:n,attrs:s}=e,{boxes:i,scores:a}=t,{maxOutputSize:d,iouThreshold:u,scoreThreshold:l,softNmsSigma:c}=s;Object(o.assertNotComplex)(i,"NonMaxSuppressionWithScore");const f=n.data.get(i.dataId).values,p=n.data.get(a.dataId).values,m=d,h=u,b=l,j=c,{selectedIndices:g,selectedScores:w}=r(f,p,m,h,b,j);return[n.makeTensorInfo([g.length],"int32",new Int32Array(g)),n.makeTensorInfo([w.length],"float32",new Float32Array(w))]}const a={kernelName:s.NonMaxSuppressionV5,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NotEqual.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NotEqual.js ***! + \****************************************************************************/ +/*! exports provided: notEqualImpl, notEqual, notEqualConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"notEqualImpl",(function(){return i})),n.d(t,"notEqual",(function(){return a})),n.d(t,"notEqualConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>e!==t?1:0)),a=Object(r.binaryKernelFunc)(s.NotEqual,i,null,"bool"),d={kernelName:s.NotEqual,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/OneHot.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/OneHot.js ***! + \**************************************************************************/ +/*! exports provided: oneHot, oneHotConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"oneHot",(function(){return r})),n.d(t,"oneHotConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{indices:i}=t,{depth:a,onValue:d,offValue:u}=r;Object(o.assertNotComplex)(i,"oneHot");const l=s.util.sizeFromShape(i.shape),c=new Float32Array(l*a);c.fill(u);const f=n.data.get(i.dataId).values;for(let e=0;e=0&&f[e]{s.util.assertShapesMatch(d,e.shape,"All tensors passed to stack must have matching shapes"),s.util.assert(u===e.dtype,(()=>"All tensors passed to stack must have matching dtypes"))}));const l=[],c=t.map((e=>{const t=Object(r.expandDims)({inputs:{input:e},backend:n,attrs:{dim:a}});return l.push(t),t})),f=Object(o.concat)({inputs:c,backend:n,attrs:{axis:a}});return l.forEach((e=>n.disposeIntermediateTensorInfo(e))),f}const a={kernelName:s.Pack,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/PadV2.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/PadV2.js ***! + \*************************************************************************/ +/*! exports provided: padV2, padV2Config */function(e,t,n){"use strict";n.r(t),n.d(t,"padV2",(function(){return r})),n.d(t,"padV2Config",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i}=t,{paddings:a,constantValue:d}=r;Object(o.assertNotComplex)(i,"pad");const u=a.map(((e,t)=>e[0]+i.shape[t]+e[1])),l=a.map((e=>e[0])),c=n.data.get(i.dataId).values,f=s.util.sizeFromShape(i.shape),p=i.shape.length,m=s.util.computeStrides(i.shape),h=s.util.sizeFromShape(u),b=u.length,j=s.util.computeStrides(u),g=s.util.getTypedArrayFromDType(i.dtype,h);0!==d&&g.fill(d);for(let e=0;ee+l[t]));g[s.util.locToIndex(t,b,j)]=c[e]}return{dataId:n.write(g,u,i.dtype),shape:u,dtype:i.dtype}}const i={kernelName:s.PadV2,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Pow.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Pow.js ***! + \***********************************************************************/ +/*! exports provided: powImpl, pow, powConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"powImpl",(function(){return i})),n.d(t,"pow",(function(){return a})),n.d(t,"powConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>Math.pow(e,t))),a=Object(r.binaryKernelFunc)(s.Pow,i),d={kernelName:s.Pow,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Prelu.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Prelu.js ***! + \*************************************************************************/ +/*! exports provided: prelu, preluConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"prelu",(function(){return a})),n.d(t,"preluConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(r.createSimpleBinaryKernelImpl)(((e,t)=>e<0?t*e:e));function a(e){const{inputs:t,backend:n}=e,{x:s,alpha:r}=t;Object(o.assertNotComplex)([s,r],"prelu");const a=n.data.get(s.dataId).values,d=n.data.get(r.dataId).values,[u,l]=i(s.shape,r.shape,a,d,s.dtype);return n.makeTensorInfo(l,s.dtype,u)}const d={kernelName:s.Prelu,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Prod.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Prod.js ***! + \************************************************************************/ +/*! exports provided: prodImpl, prod, prodConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"prodImpl",(function(){return i})),n.d(t,"prod",(function(){return a})),n.d(t,"prodConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e,t,n,o){const[r,i]=s.backend_util.computeOutAndReduceShapes(e,o),a=Object(s.upcastType)(t,"int32"),d=s.util.makeZerosTypedArray(s.util.sizeFromShape(r),a),u=s.util.sizeFromShape(i);for(let e=0;en.disposeIntermediateTensorInfo(e))),n.makeTensorInfo(k,_,g)}const d={kernelName:s.Prod,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Range.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Range.js ***! + \*************************************************************************/ +/*! exports provided: range, rangeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"range",(function(){return r})),n.d(t,"rangeConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Range_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Range_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{backend:t,attrs:n}=e,{start:s,stop:r,dtype:i,step:a}=n,d=Object(o.rangeImpl)(s,r,a,i);return t.makeTensorInfo([d.length],i,d)}const i={kernelName:s.Range,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Range_impl.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Range_impl.js ***! + \******************************************************************************/ +/*! exports provided: rangeImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"rangeImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t,n,o){if(e===t||e1)return s.util.makeZerosTypedArray(0,o);const r=Math.abs(Math.ceil((t-e)/n)),i=s.util.makeZerosTypedArray(r,o);te/t)),a=Object(r.binaryKernelFunc)(s.RealDiv,i),d={kernelName:s.RealDiv,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reciprocal.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reciprocal.js ***! + \******************************************************************************/ +/*! exports provided: reciprocal, reciprocalConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"reciprocal",(function(){return r})),n.d(t,"reciprocalConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.Reciprocal,(e=>1/e)),i={kernelName:s.Reciprocal,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Relu.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Relu.js ***! + \************************************************************************/ +/*! exports provided: relu, reluConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"relu",(function(){return r})),n.d(t,"reluConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.Relu,(e=>Math.max(0,e))),i={kernelName:s.Relu,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Relu6.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Relu6.js ***! + \*************************************************************************/ +/*! exports provided: relu6, relu6Config */function(e,t,n){"use strict";n.r(t),n.d(t,"relu6",(function(){return r})),n.d(t,"relu6Config",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.Relu6,(e=>Math.min(Math.max(0,e),6))),i={kernelName:s.Relu6,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js ***! + \***************************************************************************/ +/*! exports provided: reshape, reshapeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"reshape",(function(){return o})),n.d(t,"reshapeConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e){const{inputs:t,backend:n,attrs:o}=e,{x:r}=t,{shape:i}=o,a=s.util.sizeFromShape(r.shape),d=s.util.inferFromImplicitShape(i,a),u=s.util.sizeFromShape(d);s.util.assert(a===u,(()=>`The new shape (${d}) has ${u} elements and the old shape (${r.shape}) has ${a} elements. The new shape and old shape must have the same number of elements.`)),n.incRef(r.dataId);const l=n.data.get(r.dataId);if(null!=l.complexTensorInfos){const e=l.complexTensorInfos.real,t=l.complexTensorInfos.imag;e.shape=d,t.shape=d}return{dataId:r.dataId,shape:d,dtype:r.dtype}}const r={kernelName:s.Reshape,backendName:"cpu",kernelFunc:o}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ResizeBilinear.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ResizeBilinear.js ***! + \**********************************************************************************/ +/*! exports provided: resizeBilinear, resizeBilinearConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"resizeBilinear",(function(){return r})),n.d(t,"resizeBilinearConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{images:i}=t,{alignCorners:a,halfPixelCenters:d,size:u}=r;Object(o.assertNotComplex)(i,"resizeBilinear");const l=s.util.computeStrides(i.shape),[c,f]=u,[p,m,h,b]=i.shape,j=n.data.get(i.dataId).values,g=new Float32Array(s.util.sizeFromShape([p,c,f,b])),w=[a&&c>1?m-1:m,a&&f>1?h-1:h],_=[a&&c>1?c-1:c,a&&f>1?f-1:f];let k=0;const v=w[0]/_[0],x=w[1]/_[1];for(let e=0;e1?c-1:c,d&&h>1?f-1:f],g=[d&&m>1?m-1:m,d&&h>1?h-1:h],w=j[0]/g[0],_=j[1]/g[1],k=n.data.get(a.dataId).values;let v=0;for(let e=0;e1?m-1:m,a&&f>1?h-1:h],_=[a&&c>1?c-1:c,a&&f>1?f-1:f],k=w[0]/_[0],v=w[1]/_[1];let x=0;for(let e=0;e1?f-1:f,d&&b>1?p-1:p],_=[d&&h>1?h-1:h,d&&b>1?b-1:b],k=w[0]/_[0],v=w[1]/_[1],x=1/k,y=1/v,O=2*Math.ceil(x)+2,I=2*Math.ceil(y)+2;for(let e=0;e=h)continue;const c=t+u*l[1],m=u*k;if(e===Math.min(f-1,d?Math.round(m):Math.floor(m)))for(let e=0;e=b)continue;const o=c+t*l[2],r=t*v;s===Math.min(p-1,d?Math.round(r):Math.floor(r))&&(i+=g[o+n])}}j[r+n]=i}}}}return n.makeTensorInfo(i.shape,i.dtype,j)}const i={kernelName:s.ResizeNearestNeighborGrad,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reverse.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reverse.js ***! + \***************************************************************************/ +/*! exports provided: reverse, reverseConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"reverse",(function(){return i})),n.d(t,"reverseConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Identity.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{dims:d}=i;Object(o.assertNotComplex)(a,"reverse");const u=a.shape.length,l=s.util.parseAxisParam(d,a.shape);if(0===u)return Object(r.identity)({inputs:{x:a},backend:n});const c=new s.TensorBuffer(a.shape,a.dtype),f=n.bufferSync(a);for(let e=0;en[e]=a.shape[e]-1-n[e])),c.set(f.get(...n),...t)}return n.makeTensorInfo(c.shape,c.dtype,c.values)}const a={kernelName:s.Reverse,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RotateWithOffset.js": +/*!************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RotateWithOffset.js ***! + \************************************************************************************/ +/*! exports provided: rotateWithOffsetConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"rotateWithOffsetConfig",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */const o={kernelName:s.RotateWithOffset,backendName:"cpu",kernelFunc:({inputs:e,attrs:t,backend:n})=>{const{image:o}=e,{radians:r,fillValue:i,center:a}=t,d=n,u=s.util.getTypedArrayFromDType(o.dtype,s.util.sizeFromShape(o.shape)),[l,c,f,p]=o.shape,[m,h]=s.backend_util.getImageCenter(a,c,f),b=Math.sin(r),j=Math.cos(r),g=d.data.get(o.dataId).values;for(let e=0;e=0&&_=0&&k{const t=Math.floor(e);return e-t<.5?Math.floor(e):e-t>.5?Math.ceil(e):t%2==0?t:t+1})),i={kernelName:s.Round,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Rsqrt.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Rsqrt.js ***! + \*************************************************************************/ +/*! exports provided: rsqrtImpl, rsqrt, rsqrtConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"rsqrtImpl",(function(){return i})),n.d(t,"rsqrt",(function(){return a})),n.d(t,"rsqrtConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_impl.js"),r=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.createSimpleUnaryImpl)((e=>1/Math.sqrt(e))),a=Object(r.unaryKernelFuncFromImpl)(s.Rsqrt,i),d={kernelName:s.Rsqrt,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ScatterNd.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ScatterNd.js ***! + \*****************************************************************************/ +/*! exports provided: scatterNd, scatterNdConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"scatterNd",(function(){return r})),n.d(t,"scatterNdConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Scatter_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Scatter_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{indices:i,updates:a}=t,{shape:d}=r,{sliceRank:u,numUpdates:l,sliceSize:c,strides:f,outputSize:p}=s.backend_util.calculateShapes(a,i,d),m=n.bufferSync(i),h=n.bufferSync(a),b=Object(o.scatterImpl)(m,h,d,p,c,l,u,f,0,!0);return n.makeTensorInfo(d,b.dtype,b.values)}const i={kernelName:s.ScatterNd,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Scatter_impl.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Scatter_impl.js ***! + \********************************************************************************/ +/*! exports provided: scatterImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"scatterImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t,n,o,r,i,a,d,u,l){const c=[o/r,r],f=e.values,p=t.values;if(0===o)return Object(s.buffer)(n,t.dtype);const m=Object(s.buffer)(c,t.dtype);m.values.fill(u);for(let e=0;e=o/r)throw new Error(`Invalid indices: ${s} does not index into ${n}`);for(let n=0;n1||1===i.shape.length?1:s.util.sizeFromShape(i.shape.slice(1));for(let e=0;ee>=0?i*e:r*(Math.exp(e)-1))),d={kernelName:s.Selu,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sigmoid.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sigmoid.js ***! + \***************************************************************************/ +/*! exports provided: sigmoid, sigmoidConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sigmoid",(function(){return r})),n.d(t,"sigmoidConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.Sigmoid,(e=>1/(1+Math.exp(-e)))),i={kernelName:s.Sigmoid,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sign.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sign.js ***! + \************************************************************************/ +/*! exports provided: sign, signConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sign",(function(){return r})),n.d(t,"signConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.Sign,(e=>e<0?-1:e>0?1:0)),i={kernelName:s.Sign,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sin.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sin.js ***! + \***********************************************************************/ +/*! exports provided: sin, sinConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sin",(function(){return r})),n.d(t,"sinConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.Sin,(e=>Math.sin(e))),i={kernelName:s.Sin,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sinh.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sinh.js ***! + \************************************************************************/ +/*! exports provided: sinh, sinhConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sinh",(function(){return r})),n.d(t,"sinhConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.Sinh,(e=>Math.sinh(e))),i={kernelName:s.Sinh,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Slice.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Slice.js ***! + \*************************************************************************/ +/*! exports provided: sliceImpl, slice, sliceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sliceImpl",(function(){return r})),n.d(t,"slice",(function(){return i})),n.d(t,"sliceConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e,t,n,o,r){const i=s.slice_util.isSliceContinous(o,t,n),a=s.util.sizeFromShape(n),d=s.util.computeStrides(o);if(i){const n=s.slice_util.computeFlatOffset(t,d);return"string"===r?e.slice(n,n+a):e.subarray(n,n+a)}const u="string"===r?s.backend_util.fromUint8ToStringArray(e):e,l=Object(s.buffer)(o,r,u),c=Object(s.buffer)(n,r);for(let e=0;ee+t[n]));c.set(l.get(...s),...n)}return"string"===r?s.backend_util.fromStringArrayToUint8(c.values):c.values}function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{begin:d,size:u}=i;Object(o.assertNotComplex)(a,"slice");const[l,c]=s.slice_util.parseSliceParams(a,d,u);s.slice_util.assertParamsValid(a,l,c);const f=r(n.data.get(a.dataId).values,l,c,a.shape,a.dtype);return n.makeTensorInfo(c,a.dtype,f)}const a={kernelName:s.Slice,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Softmax.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Softmax.js ***! + \***************************************************************************/ +/*! exports provided: softmax, softmaxConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"softmax",(function(){return l})),n.d(t,"softmaxConfig",(function(){return c}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Exp */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Exp.js"),r=n(/*! ./Max */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Max.js"),i=n(/*! ./RealDiv */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RealDiv.js"),a=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"),d=n(/*! ./Sub */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sub.js"),u=n(/*! ./Sum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sum.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function l(e){const{inputs:t,backend:n,attrs:l}=e,{logits:c}=t,{dim:f}=l,p=c.shape.length;let m=f;if(-1===m&&(m=p-1),m!==p-1)throw Error(`Softmax along a non-last dimension is not yet supported. Logits was rank ${p} and dim was ${m}`);const h=s.util.parseAxisParam([m],c.shape),b=Object(r.max)({inputs:{x:c},backend:n,attrs:{reductionIndices:h,keepDims:!1}}),j=s.backend_util.expandShapeToKeepDim(b.shape,h),g=Object(a.reshape)({inputs:{x:b},backend:n,attrs:{shape:j}}),w=Object(d.sub)({inputs:{a:c,b:g},backend:n}),_=Object(o.exp)({inputs:{x:w},backend:n}),k=Object(u.sum)({inputs:{x:_},backend:n,attrs:{axis:h,keepDims:!1}}),v=Object(a.reshape)({inputs:{x:k},backend:n,attrs:{shape:j}}),x=Object(i.div)({inputs:{a:_,b:v},backend:n});return n.disposeIntermediateTensorInfo(b),n.disposeIntermediateTensorInfo(g),n.disposeIntermediateTensorInfo(w),n.disposeIntermediateTensorInfo(_),n.disposeIntermediateTensorInfo(k),n.disposeIntermediateTensorInfo(v),x}const c={kernelName:s.Softmax,backendName:"cpu",kernelFunc:l}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Softplus.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Softplus.js ***! + \****************************************************************************/ +/*! exports provided: softplus, softplusConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"softplus",(function(){return i})),n.d(t,"softplusConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Math.log(1.1920928955078125e-7)+2,i=Object(o.unaryKernelFunc)(s.Softplus,(e=>{const t=e>-r,n=eNumber(e))))),n.makeTensorInfo([b.length],s.dtype,new Int32Array(b))]}const i={kernelName:s.SparseFillEmptyRows,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseFillEmptyRows_impl.js": +/*!********************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseFillEmptyRows_impl.js ***! + \********************************************************************************************/ +/*! exports provided: sparseFillEmptyRowsImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"sparseFillEmptyRowsImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t,n,o,r,i,a){const d=t[0],u=i[0],l=new Array(u),c=new Array(d),f=t[1];if(0===u){if(0!==d)throw new Error(`Received SparseTensor with denseShape[0] = 0 but\n indices.shape[0] = ${d}`);return[s.util.getArrayFromDType(n,0),[0,f],s.util.getArrayFromDType(r,0),l,c]}let p=!0,m=0;const h=new Array(u).fill(0);for(let t=0;t=u)throw new Error(`indices(${t}, 0) is invalid: ${n} >= ${u}`);++h[n],p=p&&n>=m,m=n}let b=!0;for(let e=0;e0&&(h[e]+=h[e-1])}if(b&&p){const t=e,n=o;for(let e=0;e0){m[p-1]=1;for(let e=p-2;e>=0;--e)m[e]=m[e+1]*o[e+1]}const h=[];if(d>0){h[d-1]=1;for(let e=d-2;e>=0;--e)h[e]=h[e+1]*u[e+1]}const b=s.util.getArrayFromDType(n,a*d);for(let t=0;t0?r[d-1]+1:0;if(c<0)throw new Error("segment ids must be >= 0");const f=t.slice();f[0]=c;const p=f.reduce(((e,t)=>e*t),1),m=s.util.getArrayFromDType(n,p);if(0===d)return c>0&&m.fill(a),[m,f];if(c<=0)throw new Error("segment ids must be >= 0");let h=0,b=1,j=0,g=r[h];for(;;){let t=0;if(b=t)throw new Error("segment ids are not increasing")}if(g<0||g>=c)throw new Error(`Segment id ${g} out of range [0, ${c}), possibly because segmentIds input is not sorted.`);g>j&&m.fill(a,j*l,g*l);for(let t=h;t=u[0])throw new Error(`Bad: indices[${t}] == ${o[t]} out of range [0, ${u[0]})`);for(let t=0;td)break}return j{const t=[...f];t[u]=e;const s=Object(o.slice)({inputs:{x:i},backend:n,attrs:{begin:c,size:t}});return c[u]+=e,s}))}const i={kernelName:s.SplitV,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sqrt.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sqrt.js ***! + \************************************************************************/ +/*! exports provided: sqrt, sqrtConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sqrt",(function(){return r})),n.d(t,"sqrtConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.Sqrt,(e=>Math.sqrt(e))),i={kernelName:s.Sqrt,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Square.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Square.js ***! + \**************************************************************************/ +/*! exports provided: squareConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"squareConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r={kernelName:s.Square,backendName:"cpu",kernelFunc:({inputs:e,backend:t})=>{const{x:n}=e,s=t;Object(o.assertNotComplex)(n,"square");const r=s.data.get(n.dataId).values,i=new Float32Array(r.length);for(let e=0;e{const n=e-t;return n*n})),a=Object(r.binaryKernelFunc)(s.SquaredDifference,i),d={kernelName:s.SquaredDifference,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Step.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Step.js ***! + \************************************************************************/ +/*! exports provided: step, stepConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"step",(function(){return r})),n.d(t,"stepConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.Step,((e,t)=>{const n=t;return isNaN(e)?NaN:e>0?1:n.alpha})),i={kernelName:s.Step,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StridedSlice.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StridedSlice.js ***! + \********************************************************************************/ +/*! exports provided: stridedSlice, stridedSliceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"stridedSlice",(function(){return d})),n.d(t,"stridedSliceConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"),i=n(/*! ./Slice */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Slice.js"),a=n(/*! ./StridedSlice_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StridedSlice_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function d(e){const{inputs:t,backend:n,attrs:d}=e,{x:u}=t,{begin:l,end:c,strides:f,beginMask:p,endMask:m,ellipsisMask:h,newAxisMask:b,shrinkAxisMask:j}=d;Object(o.assertNotComplex)(u,"stridedSlice");const{nonStrided:g,$begin:w,$strides:_,size:k,newShape:v,outShape:x}=s.slice_util.sliceInfo(u.shape,l,c,f,p,m,h,b,j),y=Object(r.reshape)({inputs:{x:u},backend:n,attrs:{shape:v}});let O;if(g){const e=Object(i.slice)({inputs:{x:y},backend:n,attrs:{begin:w,size:k}});O=Object(r.reshape)({inputs:{x:e},backend:n,attrs:{shape:x}}),n.disposeIntermediateTensorInfo(e)}else if(x.some((e=>0===e)))O=n.makeTensorInfo(x,u.dtype,[]);else{const e=n.bufferSync(y),t=Object(a.stridedSliceImpl)(x,e,_,w);O=n.makeTensorInfo(t.shape,t.dtype,t.values)}const I=Object(r.reshape)({inputs:{x:O},backend:n,attrs:{shape:x}});return n.disposeIntermediateTensorInfo(y),n.disposeIntermediateTensorInfo(O),I}const u={kernelName:s.StridedSlice,backendName:"cpu",kernelFunc:d}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StridedSlice_impl.js": +/*!*************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StridedSlice_impl.js ***! + \*************************************************************************************/ +/*! exports provided: stridedSliceImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"stridedSliceImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t,n,o){const r=Object(s.buffer)(e,t.dtype);for(let e=0;e0?0:i-a);let f=0;f+=d*this.leftPad.length;for(let t=0;te.forEach((e=>p[m++]=e));for(let e=0;e0){h(e[c+l-1]);for(let e=0;e0){let e=t[0];if(0!==e)throw new Error(`First split value must be 0, got ${e}`);for(let s=1;s=e;if(o=o&&t[s]<=n,!o)throw new Error(`Invalid split value ${t[s]}, must be in [${e}, ${n}]`);e=t[s]}if(e!==n)throw new Error(`Last split value must be data size. Expected ${n}, got ${e}`)}const r=o-1,i=s.util.getArrayFromDType("int32",o);if(0===n||0===o){const e=new Array(n);for(let e=0;e<=r;++e)i[e]=0;return[e,i]}i[0]=0;for(let e=1;e<=r;++e){const n=t[e]-t[e-1];let s=0;this.nGramWidths.forEach((e=>{s+=this.getNumNGrams(n,e)})),this.preserveShort&&n>0&&0===s&&(s=1),i[e]=i[e-1]+s}const a=new Array(i[r]);for(let n=0;n{const i=t[n+1]-t[n],d=this.getNumNGrams(i,r);this.createNGrams(e,s,a,o,d,r),o+=d})),this.preserveShort&&o===i[n]){const r=t[n+1]-t[n];if(0===r)continue;const i=r+2*this.padWidth,d=1;this.createNGrams(e,s,a,o,d,i)}}return[a,i]}}function r(e,t,n,s,r,i,a,d){return new o(n,s,r,i,a,d).compute(e,t)}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringSplit.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringSplit.js ***! + \*******************************************************************************/ +/*! exports provided: stringSplit, stringSplitConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"stringSplit",(function(){return r})),n.d(t,"stringSplitConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./StringSplit_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringSplit_impl.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:s}=e,{skipEmpty:r}=s,{input:i,delimiter:a}=t;if("string"!==i.dtype)throw new Error("Input must be of datatype string");if(1!==i.shape.length)throw new Error(`Input must be a vector, got shape: ${i.shape}`);if(0!==a.shape.length)throw new Error(`Delimiter must be a scalar, got shape: ${a.shape}`);const d=n.data.get(i.dataId).values,u=n.data.get(a.dataId).values[0],[l,c,f]=Object(o.stringSplitImpl)(d,u,r),p=c.length;return[n.makeTensorInfo([p,2],"int32",l),n.makeTensorInfo([p],"string",c),n.makeTensorInfo([2],"int32",new Int32Array(f))]}const i={kernelName:s.StringSplit,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringSplit_impl.js": +/*!************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringSplit_impl.js ***! + \************************************************************************************/ +/*! exports provided: stringSplitImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"stringSplitImpl",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t,n){if(!e.length)return[];if(0===t.length){const t=new Array(e.length);for(let n=0;ne-t)),a=Object(r.createComplexBinaryKernelImpl)(((e,t,n,s)=>({real:e-n,imag:t-s}))),d=Object(r.binaryKernelFunc)(s.Sub,i,a),u={kernelName:s.Sub,backendName:"cpu",kernelFunc:d}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sum.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sum.js ***! + \***********************************************************************/ +/*! exports provided: sum, sumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sum",(function(){return l})),n.d(t,"sumConfig",(function(){return c}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ../utils/zeros_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/zeros_impl.js"),i=n(/*! ./Cast */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cast.js"),a=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Identity.js"),d=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"),u=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function l(e){const{inputs:t,backend:n,attrs:l}=e,{x:c}=t,{axis:f,keepDims:p}=l;let m;Object(o.assertNotComplex)(c,"sum"),m="bool"===c.dtype?Object(i.cast)({inputs:{x:c},backend:n,attrs:{dtype:"int32"}}):Object(a.identity)({inputs:{x:c},backend:n});const h=m.shape.length,b=s.util.parseAxisParam(f,m.shape),j=s.backend_util.getAxesPermutation(b,h);let g=b,w=m;null!=j&&(w=Object(u.transpose)({inputs:{x:m},backend:n,attrs:{perm:j}}),g=s.backend_util.getInnerMostAxes(g.length,h)),s.backend_util.assertAxesAreInnerMostDims("sum",g,w.shape.length);const[_,k]=s.backend_util.computeOutAndReduceShapes(w.shape,g),v=s.backend_util.upcastType(w.dtype,"int32");let x=Object(r.zeros)(n,_,v);const y=s.util.sizeFromShape(k),O=n.data.get(x.dataId).values,I=n.data.get(w.dataId).values;for(let e=0;eMath.tan(e))),i={kernelName:s.Tan,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tanh.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tanh.js ***! + \************************************************************************/ +/*! exports provided: tanh, tanhConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"tanh",(function(){return r})),n.d(t,"tanhConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.Tanh,(e=>Math.tanh(e))),i={kernelName:s.Tanh,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tile.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tile.js ***! + \************************************************************************/ +/*! exports provided: tile, tileConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"tile",(function(){return i})),n.d(t,"tileConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./Tile_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tile_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:s}=e,{x:i}=t,{reps:a}=s;Object(o.assertNotComplex)(i,"tile");const d=Object(r.tileImpl)(n.bufferSync(i),a);return n.makeTensorInfo(d.shape,d.dtype,d.values)}const a={kernelName:s.Tile,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tile_impl.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tile_impl.js ***! + \*****************************************************************************/ +/*! exports provided: tileImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"tileImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t){const n=new Array(e.rank);for(let s=0;s{const n=t.value-e.value;return 0===n?e.index-t.index:n};function r(e,t,n=0,i=e.length-1){for(;i>n;){if(i-n>600){const s=i-n+1,o=t-n+1,a=Math.log(s),d=.5*Math.exp(2*a/3),u=.5*Math.sqrt(a*d*(s-d)/s)*Math.sign(o-s/2);r(e,t,Math.max(n,Math.floor(t-o*d/s+u)),Math.min(i,Math.floor(t+(s-o)*d/s+u)))}const a=e[t];let d=n,u=i;for(s.util.swap(e,n,t),o(e[i],a)>0&&s.util.swap(e,n,i);d0;)u-=1}0===o(e[n],a)?s.util.swap(e,n,u):(u+=1,s.util.swap(e,u,i)),u<=t&&(n=u+1),t<=u&&(i=u-1)}}function i(e,t,n,i,a){const d=t[t.length-1],[u,l]=[e.length/d,d],c=s.util.getTypedArrayFromDType(n,u*i),f=s.util.getTypedArrayFromDType("int32",u*i);for(let t=0;td[t]={value:e,index:t})),it-1)if(t<=1)n=0;else{const e=2*t;n-=e*Math.trunc(n/e),n>=t&&(n=e-n-1)}return s.util.clamp(0,n,t-1)}(e,t);case"wrap":return function(e,t){let n=e;if(n<0)if(t<=1)n=0;else{const e=t-1;n+=t*(Math.trunc(-n/e)+1)}else if(n>t-1)if(t<=1)n=0;else{const e=t-1;n-=t*Math.trunc(n/e)}return s.util.clamp(0,n,t-1)}(e,t);case"nearest":return function(e,t){return s.util.clamp(0,e,t-1)}(e,t);case"constant":default:return function(e,t){return e}(e)}}function a(e,t,n,s,o,r,i,a,d,u,l){return 0<=a&&a{for(let n=0;nn.disposeIntermediateTensorInfo(e))),w}const f={kernelName:s.UnsortedSegmentSum,backendName:"cpu",kernelFunc:c}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ZerosLike.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ZerosLike.js ***! + \*****************************************************************************/ +/*! exports provided: zerosLike, zerosLikeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"zerosLike",(function(){return d})),n.d(t,"zerosLikeConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Complex */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Complex.js"),r=n(/*! ./Fill */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Fill.js"),i=n(/*! ./Imag */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Imag.js"),a=n(/*! ./Real */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Real.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function d(e){const{inputs:t,backend:n}=e,{x:s}=t;if("string"===s.dtype)throw new Error("zerosLike is not supported for string tensors");if("complex64"===s.dtype){const e=Object(a.real)({inputs:{input:s},backend:n}),t=d({inputs:{x:e},backend:n}),r=Object(i.imag)({inputs:{input:s},backend:n}),u=d({inputs:{x:r},backend:n}),l=Object(o.complex)({inputs:{real:t,imag:u},backend:n});return n.disposeIntermediateTensorInfo(e),n.disposeIntermediateTensorInfo(t),n.disposeIntermediateTensorInfo(r),n.disposeIntermediateTensorInfo(u),l}return Object(r.fill)({backend:n,attrs:{shape:s.shape,value:0,dtype:s.dtype}})}const u={kernelName:s.ZerosLike,backendName:"cpu",kernelFunc:d}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/_FusedMatMul.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/_FusedMatMul.js ***! + \********************************************************************************/ +/*! exports provided: _fusedMatMul, _fusedMatMulConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"_fusedMatMul",(function(){return a})),n.d(t,"_fusedMatMulConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/fused_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/fused_utils.js"),r=n(/*! ./Add */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Add.js"),i=n(/*! ./BatchMatMul */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchMatMul.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){const{inputs:t,backend:n,attrs:s}=e,{a:a,b:d,bias:u,preluActivationWeights:l}=t,{transposeA:c,transposeB:f,activation:p,leakyreluAlpha:m}=s;let h,b,j;const g=[];h=Object(i.batchMatMul)({inputs:{a:a,b:d},attrs:{transposeA:c,transposeB:f},backend:n}),u&&(b=Object(r.add)({inputs:{a:h,b:u},backend:n}),g.push(h),h=b),p&&(j=Object(o.applyActivation)(n,h,p,l,m),g.push(h),h=j);for(const e of g)n.disposeIntermediateTensorInfo(e);return h}const d={kernelName:s._FusedMatMul,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/register_all_kernels.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/register_all_kernels.js ***! + \********************************************************************************/ +/*! no exports provided */function(e,t,n){"use strict";n.r(t);var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./kernels/_FusedMatMul */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/_FusedMatMul.js"),r=n(/*! ./kernels/Abs */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Abs.js"),i=n(/*! ./kernels/Acos */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Acos.js"),a=n(/*! ./kernels/Acosh */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Acosh.js"),d=n(/*! ./kernels/Add */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Add.js"),u=n(/*! ./kernels/AddN */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AddN.js"),l=n(/*! ./kernels/All */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/All.js"),c=n(/*! ./kernels/Any */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Any.js"),f=n(/*! ./kernels/ArgMax */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ArgMax.js"),p=n(/*! ./kernels/ArgMin */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ArgMin.js"),m=n(/*! ./kernels/Asin */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Asin.js"),h=n(/*! ./kernels/Asinh */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Asinh.js"),b=n(/*! ./kernels/Atan */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atan.js"),j=n(/*! ./kernels/Atan2 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atan2.js"),g=n(/*! ./kernels/Atanh */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atanh.js"),w=n(/*! ./kernels/AvgPool */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPool.js"),_=n(/*! ./kernels/AvgPool3D */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPool3D.js"),k=n(/*! ./kernels/AvgPool3DGrad */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPool3DGrad.js"),v=n(/*! ./kernels/AvgPoolGrad */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPoolGrad.js"),x=n(/*! ./kernels/BatchMatMul */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchMatMul.js"),y=n(/*! ./kernels/BatchNorm */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchNorm.js"),O=n(/*! ./kernels/BatchToSpaceND */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchToSpaceND.js"),I=n(/*! ./kernels/Bincount */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Bincount.js"),C=n(/*! ./kernels/Cast */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cast.js"),S=n(/*! ./kernels/Ceil */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Ceil.js"),T=n(/*! ./kernels/Clip */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Clip.js"),N=n(/*! ./kernels/Complex */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Complex.js"),E=n(/*! ./kernels/ComplexAbs */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ComplexAbs.js"),A=n(/*! ./kernels/Concat */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Concat.js"),R=n(/*! ./kernels/Conv2D */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv2D.js"),F=n(/*! ./kernels/Conv2DBackpropFilter */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv2DBackpropFilter.js"),$=n(/*! ./kernels/Conv2DBackpropInput */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv2DBackpropInput.js"),M=n(/*! ./kernels/Conv3D */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv3D.js"),D=n(/*! ./kernels/Conv3DBackpropFilterV2 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv3DBackpropFilterV2.js"),P=n(/*! ./kernels/Conv3DBackpropInputV2 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv3DBackpropInputV2.js"),B=n(/*! ./kernels/Cos */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cos.js"),L=n(/*! ./kernels/Cosh */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cosh.js"),z=n(/*! ./kernels/CropAndResize */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/CropAndResize.js"),G=n(/*! ./kernels/Cumsum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cumsum.js"),W=n(/*! ./kernels/DenseBincount */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DenseBincount.js"),U=n(/*! ./kernels/DepthToSpace */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DepthToSpace.js"),V=n(/*! ./kernels/DepthwiseConv2dNative */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DepthwiseConv2dNative.js"),q=n(/*! ./kernels/DepthwiseConv2dNativeBackpropFilter */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DepthwiseConv2dNativeBackpropFilter.js"),H=n(/*! ./kernels/DepthwiseConv2dNativeBackpropInput */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DepthwiseConv2dNativeBackpropInput.js"),K=n(/*! ./kernels/Diag */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Diag.js"),X=n(/*! ./kernels/Dilation2D */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Dilation2D.js"),Y=n(/*! ./kernels/Dilation2DBackpropFilter */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Dilation2DBackpropFilter.js"),Z=n(/*! ./kernels/Dilation2DBackpropInput */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Dilation2DBackpropInput.js"),Q=n(/*! ./kernels/Einsum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Einsum.js"),J=n(/*! ./kernels/Elu */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Elu.js"),ee=n(/*! ./kernels/EluGrad */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/EluGrad.js"),te=n(/*! ./kernels/Equal */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Equal.js"),ne=n(/*! ./kernels/Erf */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Erf.js"),se=n(/*! ./kernels/Exp */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Exp.js"),oe=n(/*! ./kernels/ExpandDims */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ExpandDims.js"),re=n(/*! ./kernels/Expm1 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Expm1.js"),ie=n(/*! ./kernels/FFT */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FFT.js"),ae=n(/*! ./kernels/Fill */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Fill.js"),de=n(/*! ./kernels/FlipLeftRight */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FlipLeftRight.js"),ue=n(/*! ./kernels/Floor */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Floor.js"),le=n(/*! ./kernels/FloorDiv */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FloorDiv.js"),ce=n(/*! ./kernels/FusedConv2D */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FusedConv2D.js"),fe=n(/*! ./kernels/FusedDepthwiseConv2D */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FusedDepthwiseConv2D.js"),pe=n(/*! ./kernels/GatherNd */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GatherNd.js"),me=n(/*! ./kernels/GatherV2 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GatherV2.js"),he=n(/*! ./kernels/Greater */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Greater.js"),be=n(/*! ./kernels/GreaterEqual */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GreaterEqual.js"),je=n(/*! ./kernels/Identity */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Identity.js"),ge=n(/*! ./kernels/IFFT */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IFFT.js"),we=n(/*! ./kernels/Imag */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Imag.js"),_e=n(/*! ./kernels/IsFinite */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsFinite.js"),ke=n(/*! ./kernels/IsInf */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsInf.js"),ve=n(/*! ./kernels/IsNaN */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsNaN.js"),xe=n(/*! ./kernels/LeakyRelu */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LeakyRelu.js"),ye=n(/*! ./kernels/Less */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Less.js"),Oe=n(/*! ./kernels/LessEqual */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LessEqual.js"),Ie=n(/*! ./kernels/LinSpace */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LinSpace.js"),Ce=n(/*! ./kernels/Log */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Log.js"),Se=n(/*! ./kernels/Log1p */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Log1p.js"),Te=n(/*! ./kernels/LogicalAnd */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalAnd.js"),Ne=n(/*! ./kernels/LogicalNot */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalNot.js"),Ee=n(/*! ./kernels/LogicalOr */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalOr.js"),Ae=n(/*! ./kernels/LRN */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LRN.js"),Re=n(/*! ./kernels/LRNGrad */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LRNGrad.js"),Fe=n(/*! ./kernels/Max */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Max.js"),$e=n(/*! ./kernels/Maximum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Maximum.js"),Me=n(/*! ./kernels/MaxPool */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPool.js"),De=n(/*! ./kernels/MaxPool3D */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPool3D.js"),Pe=n(/*! ./kernels/MaxPool3DGrad */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPool3DGrad.js"),Be=n(/*! ./kernels/MaxPoolGrad */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolGrad.js"),Le=n(/*! ./kernels/MaxPoolWithArgmax */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolWithArgmax.js"),ze=n(/*! ./kernels/Mean */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Mean.js"),Ge=n(/*! ./kernels/Min */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Min.js"),We=n(/*! ./kernels/Minimum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Minimum.js"),Ue=n(/*! ./kernels/MirrorPad */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MirrorPad.js"),Ve=n(/*! ./kernels/Mod */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Mod.js"),qe=n(/*! ./kernels/Multinomial */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Multinomial.js"),He=n(/*! ./kernels/Multiply */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Multiply.js"),Ke=n(/*! ./kernels/Neg */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Neg.js"),Xe=n(/*! ./kernels/NonMaxSuppressionV3 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV3.js"),Ye=n(/*! ./kernels/NonMaxSuppressionV4 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV4.js"),Ze=n(/*! ./kernels/NonMaxSuppressionV5 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV5.js"),Qe=n(/*! ./kernels/NotEqual */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NotEqual.js"),Je=n(/*! ./kernels/OneHot */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/OneHot.js"),et=n(/*! ./kernels/OnesLike */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/OnesLike.js"),tt=n(/*! ./kernels/Pack */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Pack.js"),nt=n(/*! ./kernels/PadV2 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/PadV2.js"),st=n(/*! ./kernels/Pow */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Pow.js"),ot=n(/*! ./kernels/Prelu */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Prelu.js"),rt=n(/*! ./kernels/Prod */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Prod.js"),it=n(/*! ./kernels/Range */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Range.js"),at=n(/*! ./kernels/Real */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Real.js"),dt=n(/*! ./kernels/RealDiv */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RealDiv.js"),ut=n(/*! ./kernels/Reciprocal */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reciprocal.js"),lt=n(/*! ./kernels/Relu */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Relu.js"),ct=n(/*! ./kernels/Relu6 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Relu6.js"),ft=n(/*! ./kernels/Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"),pt=n(/*! ./kernels/ResizeBilinear */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ResizeBilinear.js"),mt=n(/*! ./kernels/ResizeBilinearGrad */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ResizeBilinearGrad.js"),ht=n(/*! ./kernels/ResizeNearestNeighbor */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ResizeNearestNeighbor.js"),bt=n(/*! ./kernels/ResizeNearestNeighborGrad */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ResizeNearestNeighborGrad.js"),jt=n(/*! ./kernels/Reverse */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reverse.js"),gt=n(/*! ./kernels/RotateWithOffset */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RotateWithOffset.js"),wt=n(/*! ./kernels/Round */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Round.js"),_t=n(/*! ./kernels/Rsqrt */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Rsqrt.js"),kt=n(/*! ./kernels/ScatterNd */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ScatterNd.js"),vt=n(/*! ./kernels/Select */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Select.js"),xt=n(/*! ./kernels/Selu */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Selu.js"),yt=n(/*! ./kernels/Sigmoid */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sigmoid.js"),Ot=n(/*! ./kernels/Sign */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sign.js"),It=n(/*! ./kernels/Sin */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sin.js"),Ct=n(/*! ./kernels/Sinh */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sinh.js"),St=n(/*! ./kernels/Slice */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Slice.js"),Tt=n(/*! ./kernels/Softmax */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Softmax.js"),Nt=n(/*! ./kernels/Softplus */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Softplus.js"),Et=n(/*! ./kernels/SpaceToBatchND */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SpaceToBatchND.js"),At=n(/*! ./kernels/SparseFillEmptyRows */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseFillEmptyRows.js"),Rt=n(/*! ./kernels/SparseReshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseReshape.js"),Ft=n(/*! ./kernels/SparseSegmentMean */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseSegmentMean.js"),$t=n(/*! ./kernels/SparseSegmentSum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseSegmentSum.js"),Mt=n(/*! ./kernels/SparseToDense */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseToDense.js"),Dt=n(/*! ./kernels/SplitV */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SplitV.js"),Pt=n(/*! ./kernels/Sqrt */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sqrt.js"),Bt=n(/*! ./kernels/Square */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Square.js"),Lt=n(/*! ./kernels/SquaredDifference */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SquaredDifference.js"),zt=n(/*! ./kernels/Step */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Step.js"),Gt=n(/*! ./kernels/StridedSlice */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StridedSlice.js"),Wt=n(/*! ./kernels/StringNGrams */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringNGrams.js"),Ut=n(/*! ./kernels/StringSplit */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringSplit.js"),Vt=n(/*! ./kernels/StringToHashBucketFast */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringToHashBucketFast.js"),qt=n(/*! ./kernels/Sub */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sub.js"),Ht=n(/*! ./kernels/Sum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sum.js"),Kt=n(/*! ./kernels/Tan */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tan.js"),Xt=n(/*! ./kernels/Tanh */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tanh.js"),Yt=n(/*! ./kernels/Tile */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tile.js"),Zt=n(/*! ./kernels/TopK */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/TopK.js"),Qt=n(/*! ./kernels/Transform */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transform.js"),Jt=n(/*! ./kernels/Transpose */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose.js"),en=n(/*! ./kernels/Unique */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Unique.js"),tn=n(/*! ./kernels/Unpack */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Unpack.js"),nn=n(/*! ./kernels/UnsortedSegmentSum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/UnsortedSegmentSum.js"),sn=n(/*! ./kernels/ZerosLike */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ZerosLike.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const on=[o._fusedMatMulConfig,r.absConfig,i.acosConfig,a.acoshConfig,d.addConfig,u.addNConfig,l.allConfig,c.anyConfig,f.argMaxConfig,p.argMinConfig,m.asinConfig,h.asinhConfig,b.atanConfig,j.atan2Config,g.atanhConfig,w.avgPoolConfig,_.avgPool3DConfig,k.avgPool3DGradConfig,v.avgPoolGradConfig,x.batchMatMulConfig,y.batchNormConfig,O.batchToSpaceNDConfig,I.bincountConfig,C.castConfig,S.ceilConfig,T.clipConfig,N.complexConfig,E.complexAbsConfig,A.concatConfig,F.conv2DBackpropFilterConfig,$.conv2DBackpropInputConfig,R.conv2DConfig,D.conv3DBackpropFilterV2Config,P.conv3DBackpropInputV2Config,M.conv3DConfig,B.cosConfig,L.coshConfig,z.cropAndResizeConfig,G.cumsumConfig,W.denseBincountConfig,U.depthToSpaceConfig,V.depthwiseConv2dNativeConfig,q.depthwiseConv2dNativeBackpropFilterConfig,H.depthwiseConv2dNativeBackpropInputConfig,K.diagConfig,X.dilation2dConfig,Z.dilation2dBackpropInputConfig,Y.dilation2dBackpropFilterConfig,dt.realDivConfig,Q.einsumConfig,J.eluConfig,ee.eluGradConfig,te.equalConfig,ne.erfConfig,se.expConfig,oe.expandDimsConfig,re.expm1Config,ie.fftConfig,ae.fillConfig,de.flipLeftRightConfig,ue.floorConfig,le.floorDivConfig,ce.fusedConv2DConfig,fe.fusedDepthwiseConv2DConfig,pe.gatherNdConfig,me.gatherV2Config,he.greaterConfig,be.greaterEqualConfig,je.identityConfig,ge.ifftConfig,we.imagConfig,_e.isFiniteConfig,ke.isInfConfig,ve.isNaNConfig,xe.leakyReluConfig,ye.lessConfig,Oe.lessEqualConfig,Ie.linSpaceConfig,Ce.logConfig,Se.log1pConfig,Te.logicalAndConfig,Ne.logicalNotConfig,Ee.logicalOrConfig,Ae.lRNConfig,Re.lRNGradConfig,$e.maximumConfig,Me.maxPoolConfig,De.maxPool3DConfig,Pe.maxPool3DGradConfig,Be.maxPoolGradConfig,Le.maxPoolWithArgmaxConfig,Fe.maxConfig,ze.meanConfig,Ge.minConfig,We.minimumConfig,Ue.mirrorPadConfig,Ve.modConfig,qe.multinomialConfig,He.multiplyConfig,Ke.negConfig,Xe.nonMaxSuppressionV3Config,Ye.nonMaxSuppressionV4Config,Ze.nonMaxSuppressionV5Config,Qe.notEqualConfig,Je.oneHotConfig,et.onesLikeConfig,tt.packConfig,nt.padV2Config,st.powConfig,ot.preluConfig,rt.prodConfig,it.rangeConfig,at.realConfig,ut.reciprocalConfig,lt.reluConfig,ct.relu6Config,ft.reshapeConfig,pt.resizeBilinearConfig,mt.resizeBilinearGradConfig,ht.resizeNearestNeighborConfig,bt.resizeNearestNeighborGradConfig,jt.reverseConfig,gt.rotateWithOffsetConfig,wt.roundConfig,_t.rsqrtConfig,kt.scatterNdConfig,vt.selectConfig,xt.seluConfig,yt.sigmoidConfig,Ot.signConfig,It.sinConfig,Ct.sinhConfig,St.sliceConfig,Tt.softmaxConfig,Nt.softplusConfig,Et.spaceToBatchNDConfig,At.sparseFillEmptyRowsConfig,Rt.sparseReshapeConfig,Ft.sparseSegmentMeanConfig,$t.sparseSegmentSumConfig,Mt.sparseToDenseConfig,Dt.splitVConfig,Pt.sqrtConfig,Bt.squareConfig,Lt.squaredDifferenceConfig,zt.stepConfig,Gt.stridedSliceConfig,Wt.stringNGramsConfig,Ut.stringSplitConfig,Vt.stringToHashBucketFastConfig,qt.subConfig,Ht.sumConfig,Kt.tanConfig,Xt.tanhConfig,Yt.tileConfig,Zt.topKConfig,Jt.transposeConfig,Qt.transformConfig,en.uniqueConfig,tn.unpackConfig,nn.unsortedSegmentSumConfig,sn.zerosLikeConfig];for(const e of on)Object(s.registerKernel)(e)},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/shared.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/shared.js ***! + \******************************************************************/ +/*! exports provided: simpleAbsImpl, addImpl, bincountImpl, bincountReduceImpl, ceilImpl, concatImpl, equalImpl, expImpl, expm1Impl, floorImpl, gatherNdImpl, gatherV2Impl, greaterImpl, greaterEqualImpl, lessImpl, lessEqualImpl, linSpaceImpl, logImpl, maxImpl, maximumImpl, minimumImpl, multiplyImpl, negImpl, notEqualImpl, prodImpl, rangeImpl, rsqrtImpl, sliceImpl, sparseFillEmptyRowsImpl, sparseReshapeImpl, sparseSegmentReductionImpl, squaredDifferenceImpl, stridedSliceImpl, stringNGramsImpl, stringSplitImpl, stringToHashBucketFastImpl, subImpl, tileImpl, topKImpl, transposeImpl, uniqueImpl */function(e,t,n){"use strict";n.r(t);var s=n(/*! ./kernels/Abs */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Abs.js");n.d(t,"simpleAbsImpl",(function(){return s.simpleAbsImpl}));var o=n(/*! ./kernels/Add */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Add.js");n.d(t,"addImpl",(function(){return o.addImpl}));var r=n(/*! ./kernels/Bincount_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Bincount_impl.js");n.d(t,"bincountImpl",(function(){return r.bincountImpl})),n.d(t,"bincountReduceImpl",(function(){return r.bincountReduceImpl}));var i=n(/*! ./kernels/Ceil */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Ceil.js");n.d(t,"ceilImpl",(function(){return i.ceilImpl}));var a=n(/*! ./kernels/Concat_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Concat_impl.js");n.d(t,"concatImpl",(function(){return a.concatImpl}));var d=n(/*! ./kernels/Equal */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Equal.js");n.d(t,"equalImpl",(function(){return d.equalImpl}));var u=n(/*! ./kernels/Exp */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Exp.js");n.d(t,"expImpl",(function(){return u.expImpl}));var l=n(/*! ./kernels/Expm1 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Expm1.js");n.d(t,"expm1Impl",(function(){return l.expm1Impl}));var c=n(/*! ./kernels/Floor */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Floor.js");n.d(t,"floorImpl",(function(){return c.floorImpl}));var f=n(/*! ./kernels/GatherNd_Impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GatherNd_Impl.js");n.d(t,"gatherNdImpl",(function(){return f.gatherNdImpl}));var p=n(/*! ./kernels/GatherV2_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GatherV2_impl.js");n.d(t,"gatherV2Impl",(function(){return p.gatherV2Impl}));var m=n(/*! ./kernels/Greater */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Greater.js");n.d(t,"greaterImpl",(function(){return m.greaterImpl}));var h=n(/*! ./kernels/GreaterEqual */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GreaterEqual.js");n.d(t,"greaterEqualImpl",(function(){return h.greaterEqualImpl}));var b=n(/*! ./kernels/Less */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Less.js");n.d(t,"lessImpl",(function(){return b.lessImpl}));var j=n(/*! ./kernels/LessEqual */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LessEqual.js");n.d(t,"lessEqualImpl",(function(){return j.lessEqualImpl}));var g=n(/*! ./kernels/LinSpace_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LinSpace_impl.js");n.d(t,"linSpaceImpl",(function(){return g.linSpaceImpl}));var w=n(/*! ./kernels/Log */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Log.js");n.d(t,"logImpl",(function(){return w.logImpl}));var _=n(/*! ./kernels/Max_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Max_impl.js");n.d(t,"maxImpl",(function(){return _.maxImpl}));var k=n(/*! ./kernels/Maximum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Maximum.js");n.d(t,"maximumImpl",(function(){return k.maximumImpl}));var v=n(/*! ./kernels/Minimum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Minimum.js");n.d(t,"minimumImpl",(function(){return v.minimumImpl}));var x=n(/*! ./kernels/Multiply */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Multiply.js");n.d(t,"multiplyImpl",(function(){return x.multiplyImpl}));var y=n(/*! ./kernels/Neg */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Neg.js");n.d(t,"negImpl",(function(){return y.negImpl}));var O=n(/*! ./kernels/NotEqual */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NotEqual.js");n.d(t,"notEqualImpl",(function(){return O.notEqualImpl}));var I=n(/*! ./kernels/Prod */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Prod.js");n.d(t,"prodImpl",(function(){return I.prodImpl}));var C=n(/*! ./kernels/Range_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Range_impl.js");n.d(t,"rangeImpl",(function(){return C.rangeImpl}));var S=n(/*! ./kernels/Rsqrt */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Rsqrt.js");n.d(t,"rsqrtImpl",(function(){return S.rsqrtImpl}));var T=n(/*! ./kernels/Slice */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Slice.js");n.d(t,"sliceImpl",(function(){return T.sliceImpl}));var N=n(/*! ./kernels/SparseFillEmptyRows_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseFillEmptyRows_impl.js");n.d(t,"sparseFillEmptyRowsImpl",(function(){return N.sparseFillEmptyRowsImpl}));var E=n(/*! ./kernels/SparseReshape_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseReshape_impl.js");n.d(t,"sparseReshapeImpl",(function(){return E.sparseReshapeImpl}));var A=n(/*! ./kernels/SparseSegmentReduction_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseSegmentReduction_impl.js");n.d(t,"sparseSegmentReductionImpl",(function(){return A.sparseSegmentReductionImpl}));var R=n(/*! ./kernels/SquaredDifference */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SquaredDifference.js");n.d(t,"squaredDifferenceImpl",(function(){return R.squaredDifferenceImpl}));var F=n(/*! ./kernels/StridedSlice_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StridedSlice_impl.js");n.d(t,"stridedSliceImpl",(function(){return F.stridedSliceImpl}));var $=n(/*! ./kernels/StringNGrams_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringNGrams_impl.js");n.d(t,"stringNGramsImpl",(function(){return $.stringNGramsImpl}));var M=n(/*! ./kernels/StringSplit_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringSplit_impl.js");n.d(t,"stringSplitImpl",(function(){return M.stringSplitImpl}));var D=n(/*! ./kernels/StringToHashBucketFast_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringToHashBucketFast_impl.js");n.d(t,"stringToHashBucketFastImpl",(function(){return D.stringToHashBucketFastImpl}));var P=n(/*! ./kernels/Sub */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sub.js");n.d(t,"subImpl",(function(){return P.subImpl}));var B=n(/*! ./kernels/Tile_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tile_impl.js");n.d(t,"tileImpl",(function(){return B.tileImpl}));var L=n(/*! ./kernels/TopK_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/TopK_impl.js");n.d(t,"topKImpl",(function(){return L.topKImpl}));var z=n(/*! ./kernels/Transpose_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose_impl.js");n.d(t,"transposeImpl",(function(){return z.transposeImpl}));var G=n(/*! ./kernels/Unique_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Unique_impl.js");n.d(t,"uniqueImpl",(function(){return G.uniqueImpl}))},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js ***! + \*****************************************************************************/ +/*! exports provided: createSimpleBinaryKernelImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"createSimpleBinaryKernelImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e){return(t,n,o,r,i)=>{const a=s.backend_util.assertAndGetBroadcastShape(t,n),d=a.length,u=s.util.computeStrides(a),l=s.util.sizeFromShape(a),c=s.util.getTypedArrayFromDType(i,l),f=t.length,p=n.length,m=s.util.computeStrides(t),h=s.util.computeStrides(n),b=s.backend_util.getBroadcastDims(t,a),j=s.backend_util.getBroadcastDims(n,a);if(b.length+j.length===0)for(let t=0;ti[e]=0));const a=s.util.locToIndex(i,f,m),l=n.slice(-p);j.forEach((e=>l[e]=0));const g=s.util.locToIndex(l,p,h);c[t]=e(o[a],r[g])}return[c,a]}}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js ***! + \******************************************************************************/ +/*! exports provided: binaryKernelFunc, createComplexBinaryKernelImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"binaryKernelFunc",(function(){return a})),n.d(t,"createComplexBinaryKernelImpl",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ../kernels/Cast */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cast.js"),i=n(/*! ../kernels/Complex */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Complex.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e,t,n,a){return null==n?({inputs:n,backend:r})=>{const{a:i,b:d}=n,u=r;Object(o.assertNotComplex)([i,d],e);const l=u.data.get(i.dataId).values,c=u.data.get(d.dataId).values,f="string"===i.dtype?s.backend_util.fromUint8ToStringArray(l):l,p="string"===i.dtype?s.backend_util.fromUint8ToStringArray(c):c,m=a||i.dtype,[h,b]=t(i.shape,d.shape,f,p,m);return u.makeTensorInfo(b,m,h)}:({inputs:e,backend:s})=>{const{a:o,b:d}=e,u=s;if("complex64"===o.dtype||"complex64"===d.dtype){const e=Object(r.cast)({inputs:{x:o},backend:u,attrs:{dtype:"complex64"}}),t=u.data.get(e.dataId),s=t.complexTensorInfos.real,a=t.complexTensorInfos.imag,l=u.data.get(s.dataId).values,c=u.data.get(a.dataId).values,f=Object(r.cast)({inputs:{x:d},backend:u,attrs:{dtype:"complex64"}}),p=u.data.get(f.dataId),m=p.complexTensorInfos.real,h=p.complexTensorInfos.imag,b=u.data.get(m.dataId).values,j=u.data.get(h.dataId).values,[g,w,_]=n(o.shape,d.shape,l,c,b,j),k=u.makeTensorInfo(_,"float32",g),v=u.makeTensorInfo(_,"float32",w),x=Object(i.complex)({inputs:{real:k,imag:v},backend:u});return u.disposeIntermediateTensorInfo(e),u.disposeIntermediateTensorInfo(f),u.disposeIntermediateTensorInfo(k),u.disposeIntermediateTensorInfo(v),x}{const e=u.data.get(o.dataId).values,n=u.data.get(d.dataId).values,s=a||o.dtype,[r,i]=t(o.shape,d.shape,e,n,s);return u.makeTensorInfo(i,s,r)}}}function d(e){return(t,n,o,r,i,a)=>{const d=s.backend_util.assertAndGetBroadcastShape(t,n),u=s.util.sizeFromShape(d),l=d.length,c=s.util.computeStrides(d),f=s.util.getTypedArrayFromDType("float32",u),p=s.util.getTypedArrayFromDType("float32",u),m=s.backend_util.getBroadcastDims(t,d),h=s.backend_util.getBroadcastDims(n,d),b=s.backend_util.mergeRealAndImagArrays(o,r),j=s.backend_util.mergeRealAndImagArrays(i,a),g=t.length,w=s.util.computeStrides(t),_=n.length,k=s.util.computeStrides(n);if(m.length+h.length===0)for(let t=0;to[e]=0));const r=s.util.locToIndex(o,g,w),i=n.slice(-_);h.forEach((e=>i[e]=0));const a=s.util.locToIndex(i,_,k),d=e(b[2*r],b[2*r+1],j[2*a],j[2*a+1]);f[t]=d.real,p[t]=d.imag}return[f,p,d]}}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/fft_utils.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/fft_utils.js ***! + \***************************************************************************/ +/*! exports provided: fftBatch, fftImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"fftBatch",(function(){return m})),n.d(t,"fftImpl",(function(){return h}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernels/Add */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Add.js"),r=n(/*! ../kernels/Complex */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Complex.js"),i=n(/*! ../kernels/Concat */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Concat.js"),a=n(/*! ../kernels/Identity */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Identity.js"),d=n(/*! ../kernels/Imag */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Imag.js"),u=n(/*! ../kernels/Multiply */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Multiply.js"),l=n(/*! ../kernels/Real */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Real.js"),c=n(/*! ../kernels/RealDiv */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RealDiv.js"),f=n(/*! ../kernels/Slice */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Slice.js"),p=n(/*! ../kernels/Sub */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sub.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function m(e,t,n){const o=e.shape,i=o[0],a=o[1],d=n.data.get(e.dataId),u=d.complexTensorInfos.real,l=d.complexTensorInfos.imag,c=[i,a],p=s.util.sizeFromShape(c),m=s.util.getTypedArrayFromDType("float32",p),b=s.util.getTypedArrayFromDType("float32",p);for(let e=0;eb?b=s:"avg"===i&&(g+=s,w++)}if(isNaN(b))break}j[x+n*_+t]="avg"===i?g/w:b}}}return b}function r(e,t,n,o,r=!1,i=!1){const a=Object(s.buffer)(o.outShape,"int32"),d=o.strideHeight,u=o.strideWidth,l=o.dilationHeight,c=o.dilationWidth,f=o.effectiveFilterHeight,p=o.effectiveFilterWidth,m=o.padInfo.top,h=o.padInfo.left,b=Object(s.buffer)(t,n,e);for(let e=0;e_&&(_=u,k=r?i?((e*o.inHeight+n)*o.inWidth+s)*o.inChannels+t:(n*o.inWidth+s)*o.inChannels+t:a*p+d)}}a.set(k,e,n,d,t)}}return a}function i(e,t,n,o,r,i){const a=r.strideDepth,d=r.strideHeight,u=r.strideWidth,l=r.dilationDepth,c=r.dilationHeight,f=r.dilationWidth,p=r.effectiveFilterDepth,m=r.effectiveFilterHeight,h=r.effectiveFilterWidth,b=r.padInfo.front,j=r.padInfo.top,g=r.padInfo.left,w="max"===i?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,_=Object(s.buffer)(r.outShape,n),k=_.values,v=r.outShape[1]*r.outShape[2]*r.outShape[3]*r.outShape[4],x=r.outShape[2]*r.outShape[3]*r.outShape[4],y=r.outShape[3]*r.outShape[4],O=r.outShape[4];for(let t=0;tv?v=r:"avg"===i&&(x+=r,y++),isNaN(v))break}if(isNaN(v))break}if(isNaN(v))break}k[j+t]="avg"===i?x/y:v}}}}return _}function a(e,t){const n=Object(s.buffer)(t.outShape,"int32"),o=t.strideDepth,r=t.strideHeight,i=t.strideWidth,a=t.dilationDepth,d=t.dilationHeight,u=t.dilationWidth,l=t.effectiveFilterDepth,c=t.effectiveFilterHeight,f=t.effectiveFilterWidth,p=t.padInfo.front,m=t.padInfo.top,h=t.padInfo.left;for(let s=0;s=y&&(y=d,O=n*c*f+r*c+a)}}}n.set(O,s,j,o,r,b)}}}return n}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_impl.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_impl.js ***! + \****************************************************************************/ +/*! exports provided: createSimpleUnaryImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"createSimpleUnaryImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e){return(t,n,o)=>{const r=s.util.getTypedArrayFromDType(n,t.length);for(let n=0;n{const{x:d}=r;if(Object(o.assertNotComplex)(d,e),"string"===d.dtype||"string"===n)throw new Error("unaryKernelFunc does not support string input/output");const u=a,l=u.data.get(d.dataId).values,c=s.util.sizeFromShape(d.shape),f=n||d.dtype,p=s.util.getArrayFromDType(f,c);for(let e=0;e{const{x:a}=s;if(Object(o.assertNotComplex)(a,e),"string"===a.dtype||"string"===n)throw new Error("unaryKernelFunc does not support string input/output");const d=i,u=d.data.get(a.dataId).values,l=n||a.dtype,c=t(u,l,r);return d.makeTensorInfo(a.shape,l,c)}}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/zeros_impl.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/zeros_impl.js ***! + \****************************************************************************/ +/*! exports provided: zeros */function(e,t,n){"use strict";n.r(t),n.d(t,"zeros",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernels/Complex */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Complex.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e,t,n="float32"){if("complex64"===n){const n=r(e,t,"float32"),s=r(e,t,"float32");return Object(o.complex)({inputs:{real:n,imag:s},backend:e})}const i=s.util.makeZerosTypedArray(s.util.sizeFromShape(t),n);return e.makeTensorInfo(t,n,i)}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/version.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/version.js ***! + \*******************************************************************/ +/*! exports provided: version */function(e,t,n){"use strict";n.r(t),n.d(t,"version",(function(){return s})); +/** @license See the LICENSE file. */ +const s="3.8.0"},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/backend_wasm.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/backend_wasm.js ***! + \*************************************************************************/ +/*! exports provided: BackendWasm, init, setWasmPath, setWasmPaths, resetWasmPath */function(e,t,n){"use strict";n.r(t),n.d(t,"BackendWasm",(function(){return u})),n.d(t,"init",(function(){return c})),n.d(t,"setWasmPath",(function(){return g})),n.d(t,"setWasmPaths",(function(){return w})),n.d(t,"resetWasmPath",(function(){return _}));n(/*! ./flags_wasm */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/flags_wasm.js");var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../wasm-out/tfjs-backend-wasm-threaded-simd.js */"./node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm-threaded-simd.js"),r=n.n(o),i=n(/*! ../wasm-out/tfjs-backend-wasm-threaded-simd.worker.js */"./node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm-threaded-simd.worker.js"),a=n(/*! ../wasm-out/tfjs-backend-wasm.js */"./node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm.js"),d=n.n(a); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class u extends s.KernelBackend{constructor(e){super(),this.wasm=e,this.dataIdNextNumber=1,this.wasm.tfjs.init(),this.dataIdMap=new s.DataStorage(this,Object(s.engine)())}write(e,t,n){const s={id:this.dataIdNextNumber++};return this.move(s,e,t,n,1),s}numDataIds(){return this.dataIdMap.numDataIds()}async time(e){const t=s.util.now();e();return{kernelMs:s.util.now()-t}}move(e,t,n,o,r){const i=this.dataIdNextNumber++;if("string"===o){const s=t;return void this.dataIdMap.set(e,{id:i,stringBytes:s,shape:n,dtype:o,memoryOffset:null,refCount:r})}const a=s.util.sizeFromShape(n),d=a*s.util.bytesPerElement(o),u=this.wasm._malloc(d);this.dataIdMap.set(e,{id:i,memoryOffset:u,shape:n,dtype:o,refCount:r}),this.wasm.tfjs.registerTensor(i,a,u),null!=t&&this.wasm.HEAPU8.set(new Uint8Array(t.buffer,t.byteOffset,d),u)}async read(e){return this.readSync(e)}readSync(e){const{memoryOffset:t,dtype:n,shape:o,stringBytes:r}=this.dataIdMap.get(e);if("string"===n)return r;return function(e,t){switch(t){case"float32":return new Float32Array(e);case"int32":return new Int32Array(e);case"bool":return new Uint8Array(e);default:throw new Error(`Unknown dtype ${t}`)}}(this.wasm.HEAPU8.slice(t,t+s.util.sizeFromShape(o)*s.util.bytesPerElement(n)).buffer,n)}disposeData(e,t=!1){if(this.dataIdMap.has(e)){const n=this.dataIdMap.get(e);if(n.refCount--,!t&&n.refCount>0)return!1;this.wasm._free(n.memoryOffset),this.wasm.tfjs.disposeData(n.id),this.dataIdMap.delete(e)}return!0}refCount(e){if(this.dataIdMap.has(e)){return this.dataIdMap.get(e).refCount}return 0}incRef(e){const t=this.dataIdMap.get(e);null!=t&&t.refCount++}floatPrecision(){return 32}getMemoryOffset(e){return this.dataIdMap.get(e).memoryOffset}dispose(){this.wasm.tfjs.dispose(),"PThread"in this.wasm&&this.wasm.PThread.terminateAllThreads(),this.wasm=null}memory(){return{unreliable:!1}}makeOutput(e,t,n){let o;if(null==n)o=this.write(null,e,t);else{const r=this.dataIdNextNumber++;o={id:r},this.dataIdMap.set(o,{id:r,memoryOffset:n,shape:e,dtype:t,refCount:1});const i=s.util.sizeFromShape(e);this.wasm.tfjs.registerTensor(r,i,n)}return{dataId:o,shape:e,dtype:t}}typedArrayFromHeap({shape:e,dtype:t,dataId:n}){const o=this.wasm.HEAPU8.buffer,{memoryOffset:r}=this.dataIdMap.get(n),i=s.util.sizeFromShape(e);switch(t){case"float32":return new Float32Array(o,r,i);case"int32":return new Int32Array(o,r,i);case"bool":return new Uint8Array(o,r,i);default:throw new Error(`Unknown dtype ${t}`)}}}function l(e,t,n){if(null!=p)return p;let s="tfjs-backend-wasm.wasm";return e&&t?s="tfjs-backend-wasm-threaded-simd.wasm":e&&(s="tfjs-backend-wasm-simd.wasm"),null!=h&&null!=h[s]?h[s]:n+s}async function c(){const[e,t]=await Promise.all([Object(s.env)().getAsync("WASM_HAS_SIMD_SUPPORT"),Object(s.env)().getAsync("WASM_HAS_MULTITHREAD_SUPPORT")]);return new Promise(((n,o)=>{const a={};var u;a.locateFile=(n,s)=>{if(n.endsWith(".worker.js")){const e=i.wasmWorkerContents,t=new Blob([e],{type:"application/javascript"});return URL.createObjectURL(t)}return n.endsWith(".wasm")?l(e,t,null!=m?m:s):s+n},j&&(a.instantiateWasm=(u=l(e,t,null!=m?m:""),(e,t)=>(s.util.fetch(u,{credentials:"same-origin"}).then((n=>{n.ok||e.env.a(`failed to load wasm binary file at '${u}'`),n.arrayBuffer().then((n=>{WebAssembly.instantiate(n,e).then((e=>{t(e.instance,e.module)}))}))})),{})));let c,f=!1;a.onAbort=()=>{if(f)return;if(b)return;b=!0;o({message:"Make sure the server can serve the `.wasm` file relative to the bundled js file. For more details see https://github.com/tensorflow/tfjs/blob/master/tfjs-backend-wasm/README.md#using-bundlers"})},t&&e&&null==p?(a.mainScriptUrlOrBlob=new Blob(["var WasmBackendModuleThreadedSimd = "+r.a.toString()],{type:"text/javascript"}),c=r()(a)):c=d()(a),c.then((e=>{f=!0,b=!1;e.tfjs={init:e.cwrap("init",null,[]),registerTensor:e.cwrap("register_tensor",null,["number","number","number"]),disposeData:e.cwrap("dispose_data",null,["number"]),dispose:e.cwrap("dispose",null,[])},n({wasm:e})}))}))}const f=["tfjs-backend-wasm.wasm","tfjs-backend-wasm-simd.wasm","tfjs-backend-wasm-threaded-simd.wasm"];let p=null,m=null,h={},b=!1,j=!1;function g(e,t=!1){if(Object(s.deprecationWarn)("setWasmPath has been deprecated in favor of setWasmPaths and will be removed in a future release."),b)throw new Error("The WASM backend was already initialized. Make sure you call `setWasmPath()` before you call `tf.setBackend()` or `tf.ready()`");p=e,j=t}function w(e,t=!1){if(b)throw new Error("The WASM backend was already initialized. Make sure you call `setWasmPaths()` before you call `tf.setBackend()` or `tf.ready()`");if("string"==typeof e)m=e;else{h=e;const t=f.filter((e=>null==h[e]));if(t.length>0)throw new Error(`There were no entries found for the following binaries: ${t.join(",")}. Please either call setWasmPaths with a map providing a path for each binary, or with a string indicating the directory where all the binaries can be found.`)}j=t}function _(){p=null,m=null,h={},j=!1,b=!1}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/base.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/base.js ***! + \*****************************************************************/ +/*! exports provided: BackendWasm, setWasmPath, setWasmPaths, version_wasm */function(e,t,n){"use strict";n.r(t);n(/*! ./flags_wasm */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/flags_wasm.js");var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./backend_wasm */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/backend_wasm.js");n.d(t,"BackendWasm",(function(){return o.BackendWasm})),n.d(t,"setWasmPath",(function(){return o.setWasmPath})),n.d(t,"setWasmPaths",(function(){return o.setWasmPaths}));var r=n(/*! ./version */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/version.js");n.d(t,"version_wasm",(function(){return r.version}));Object(s.registerBackend)("wasm",(async()=>{const{wasm:e}=await Object(o.init)();return new o.BackendWasm(e)}),2)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/flags_wasm.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/flags_wasm.js ***! + \***********************************************************************/ +/*! no exports provided */function(e,t,n){"use strict";n.r(t);var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */const o=Object(s.env)();o.registerFlag("WASM_HAS_SIMD_SUPPORT",(async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,9,1,7,0,65,0,253,15,26,11])))),o.registerFlag("WASM_HAS_MULTITHREAD_SUPPORT",(async()=>{if(o.get("IS_NODE"))return!1;try{return(new MessageChannel).port1.postMessage(new SharedArrayBuffer(1)),WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11]))}catch(e){return!1}}))},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/index.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/index.js ***! + \******************************************************************/ +/*! exports provided: BackendWasm, setWasmPath, setWasmPaths, version_wasm */function(e,t,n){"use strict";n.r(t);n(/*! ./register_all_kernels */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/register_all_kernels.js");var s=n(/*! ./base */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/base.js");n.d(t,"BackendWasm",(function(){return s.BackendWasm})),n.d(t,"setWasmPath",(function(){return s.setWasmPath})),n.d(t,"setWasmPaths",(function(){return s.setWasmPaths})),n.d(t,"version_wasm",(function(){return s.version_wasm}))},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernel_utils/shared.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernel_utils/shared.js ***! + \********************************************************************************/ +/*! exports provided: concatImplCPU, rangeImplCPU, sliceImplCPU */function(e,t,n){"use strict";n.r(t);var s=n(/*! @tensorflow/tfjs-backend-cpu/dist/shared */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/shared.js");n.d(t,"concatImplCPU",(function(){return s.concatImpl})),n.d(t,"sliceImplCPU",(function(){return s.sliceImpl})),n.d(t,"rangeImplCPU",(function(){return s.rangeImpl}))},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Abs.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Abs.js ***! + \************************************************************************/ +/*! exports provided: absConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"absConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createUnaryKernelConfig)(s.Abs)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Add.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Add.js ***! + \************************************************************************/ +/*! exports provided: addConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"addConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createBinaryKernelConfig)(s.Add,!0)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/AddN.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/AddN.js ***! + \*************************************************************************/ +/*! exports provided: addNConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"addNConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let r;const i={kernelName:s.AddN,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.AddN,null,["array","number","number","number"])},kernelFunc:function(e){const{inputs:t,backend:n}=e,i=n.makeOutput(t[0].shape,t[0].dtype);if(0===s.util.sizeFromShape(i.shape))return i;const a=t.map((e=>n.dataIdMap.get(e.dataId).id)),d=new Uint8Array(new Int32Array(a).buffer),u=n.dataIdMap.get(i.dataId).id;return r(d,a.length,o.CppDType[i.dtype],u),i}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/All.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/All.js ***! + \************************************************************************/ +/*! exports provided: allConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"allConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./kernel_utils */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/kernel_utils.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let r;const i={kernelName:s.All,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.All,null,["number, number, number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:i}=e,{axis:a,keepDims:d}=i,{x:u}=n;let l=t.dataIdMap.get(u.dataId).id,c=u;const{transposed:f,axes:p,originalAxes:m,inputWasTransposed:h}=Object(o.permuteAxesAndTranspose)(u,a,t);if(h){c=f,l=t.dataIdMap.get(f.dataId).id}const b=c.shape.length;s.backend_util.assertAxesAreInnerMostDims("all",p,b);const[j,g]=s.backend_util.computeOutAndReduceShapes(c.shape,p),w=s.util.sizeFromShape(g),_=t.makeOutput(j,u.dtype);if(0!==s.util.sizeFromShape(c.shape)){const e=t.dataIdMap.get(_.dataId).id;r(l,w,e)}if(h&&t.disposeData(f.dataId),d){const e=s.backend_util.expandShapeToKeepDim(_.shape,m);_.shape=e}return _}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Any.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Any.js ***! + \************************************************************************/ +/*! exports provided: anyConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"anyConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./kernel_utils */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/kernel_utils.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let r;const i={kernelName:s.Any,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.Any,null,["number, number, number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:i}=e,{axis:a,keepDims:d}=i,{x:u}=n;let l=t.dataIdMap.get(u.dataId).id,c=u;const{transposed:f,axes:p,originalAxes:m,inputWasTransposed:h}=Object(o.permuteAxesAndTranspose)(u,a,t);if(h){c=f,l=t.dataIdMap.get(f.dataId).id}const b=c.shape.length;s.backend_util.assertAxesAreInnerMostDims("any",p,b);const[j,g]=s.backend_util.computeOutAndReduceShapes(c.shape,p),w=s.util.sizeFromShape(g),_=t.makeOutput(j,u.dtype);if(0!==s.util.sizeFromShape(c.shape)){const e=t.dataIdMap.get(_.dataId).id;r(l,w,e)}if(h&&t.disposeData(f.dataId),d){const e=s.backend_util.expandShapeToKeepDim(_.shape,m);_.shape=e}return _}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ArgMax.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ArgMax.js ***! + \***************************************************************************/ +/*! exports provided: argMaxConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"argMaxConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./kernel_utils */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/kernel_utils.js"),r=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let i;const a={kernelName:s.ArgMax,backendName:"wasm",kernelFunc:function(e){const{backend:t,inputs:n,attrs:a}=e,{axis:d}=a,{x:u}=n,l=t.dataIdMap.get(u.dataId).id;let c=l,f=u;const{transposed:p,axes:m,inputWasTransposed:h}=Object(o.permuteAxesAndTranspose)(u,d,t);if(h){const e=t.dataIdMap.get(p.dataId).id;e!==l&&(f=p,c=e)}const b=f.shape.slice(0,-1),j=t.makeOutput(b,"int32"),g=t.dataIdMap.get(j.dataId).id,w=s.util.sizeFromShape(j.shape),_=f.shape[m[0]];return i(c,r.CppDType[f.dtype],w,_,g),h&&t.disposeData(p.dataId),j},setupFunc:function(e){i=e.wasm.cwrap(s.ArgMax,null,["number","number","number","number","number"])}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/AvgPool.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/AvgPool.js ***! + \****************************************************************************/ +/*! exports provided: avgPoolConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"avgPoolConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */let o;const r={kernelName:s.AvgPool,backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.AvgPool,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:t,attrs:n,backend:r}=e,i=t.x,a=r.dataIdMap.get(i.dataId).id,{filterSize:d,strides:u,pad:l,dimRoundingMode:c}=n,f=s.backend_util.computePool2DInfo(i.shape,d,u,1,l,c),p=f.filterHeight,m=f.filterWidth,h=f.padInfo.top,b=f.padInfo.right,j=f.padInfo.bottom,g=f.padInfo.left,w=f.strideHeight,_=f.strideWidth,k=f.inChannels;if("channelsLast"!==f.dataFormat)throw new Error(`wasm backend does not support dataFormat:'${f.dataFormat}'. Please use 'channelsLast'.`);if(1!==f.dilationWidth||1!==f.dilationHeight)throw new Error(`was backend only supports average pooling with dilation = [1, 1], got [${f.dilationHeight}, ${f.dilationWidth}].`);const v=r.makeOutput(f.outShape,"float32"),x=r.dataIdMap.get(v.dataId).id;return o(a,i.shape[0],i.shape[1],i.shape[2],p,m,h,b,j,g,w,_,k,x),v}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/BatchMatMul.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/BatchMatMul.js ***! + \********************************************************************************/ +/*! exports provided: batchMatMulConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"batchMatMulConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let r;const i={kernelName:s.BatchMatMul,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.BatchMatMul,null,["number","array","number","number","array","number","number","number","number"])},kernelFunc:function(e){const{inputs:t,backend:n,attrs:i}=e,{a:a,b:d}=t,{transposeA:u,transposeB:l}=i;if("float32"!==a.dtype||"float32"!==d.dtype)throw new Error("BatchMatMul for non non-float32 tensors not yet supported.");const c=a.shape.length,f=d.shape.length,p=u?a.shape[c-2]:a.shape[c-1],m=l?d.shape[f-1]:d.shape[f-2],h=u?a.shape[c-1]:a.shape[c-2],b=l?d.shape[f-2]:d.shape[f-1],j=a.shape.slice(0,-2),g=d.shape.slice(0,-2),w=s.util.sizeFromShape(j),_=s.util.sizeFromShape(g),k=w===_||1===w||1===_;s.util.assert(c>=2&&f>=2&&k,(()=>`Error in matMul: the input batch dimensions must either be the same or at least one input batch dimension must be 1. Got input batch dimensions of (${j}) and (${g}).`));const v=(w>_?a.shape.slice(0,-2):d.shape.slice(0,-2)).concat([h,b]);s.util.assert(p===m,(()=>`Error in matMul: inner shapes (${p}) and (${m}) of Tensors with shapes ${a.shape} and ${d.shape} and transposeA=${u} and transposeB=${l} must match.`));const x=u?[w,p,h]:[w,h,p],y=l?[_,b,m]:[_,m,b],O=Object(o.reshape)({inputs:{x:a},backend:n,attrs:{shape:x}}),I=Object(o.reshape)({inputs:{x:d},backend:n,attrs:{shape:y}}),C=n.dataIdMap.get(O.dataId).id,S=n.dataIdMap.get(I.dataId).id,T=u?O.shape[2]:O.shape[1],N=l?I.shape[1]:I.shape[2],E=Math.max(w,_),A=n.makeOutput([E,T,N],O.dtype),R=n.dataIdMap.get(A.dataId).id,F=new Uint8Array(new Int32Array(O.shape).buffer),$=new Uint8Array(new Int32Array(I.shape).buffer);return r(C,F,O.shape.length,S,$,I.shape.length,u,l,R),n.disposeData(O.dataId),n.disposeData(I.dataId),A.shape=v,A}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/BatchToSpaceND.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/BatchToSpaceND.js ***! + \***********************************************************************************/ +/*! exports provided: batchToSpaceNDConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"batchToSpaceNDConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Reshape.js"),r=n(/*! ./Slice */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Slice.js"),i=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Transpose.js");const a={kernelName:s.BatchToSpaceND,backendName:"wasm",kernelFunc: +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const{inputs:t,backend:n,attrs:a}=e,{x:d}=t,{blockShape:u,crops:l}=a,c=u.reduce(((e,t)=>e*t)),f=s.backend_util.getReshaped(d.shape,u,c),p=s.backend_util.getPermuted(f.length,u.length),m=s.backend_util.getReshapedPermuted(d.shape,u,c),h=s.backend_util.getSliceBeginCoords(l,u.length),b=s.backend_util.getSliceSize(m,l,u.length),j=Object(o.reshape)({inputs:{x:d},backend:n,attrs:{shape:f}}),g=Object(i.transpose)({inputs:{x:j},backend:n,attrs:{perm:p}}),w=Object(o.reshape)({inputs:{x:g},backend:n,attrs:{shape:m}}),_=Object(r.slice)({inputs:{x:w},backend:n,attrs:{begin:h,size:b}});return n.disposeData(j.dataId),n.disposeData(g.dataId),n.disposeData(j.dataId),_}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Cast.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Cast.js ***! + \*************************************************************************/ +/*! exports provided: cast, castConfig */function(e,t,n){"use strict"; +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function s(e){const{inputs:{x:t},attrs:{dtype:n},backend:s}=e,o=s.makeOutput(t.shape,n),r=s.typedArrayFromHeap(t);return s.typedArrayFromHeap(o).set(r),o}n.r(t),n.d(t,"cast",(function(){return s})),n.d(t,"castConfig",(function(){return o}));const o={kernelName:n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js").Cast,backendName:"wasm",kernelFunc:s}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Ceil.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Ceil.js ***! + \*************************************************************************/ +/*! exports provided: ceilConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"ceilConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createUnaryKernelConfig)(s.Ceil)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ClipByValue.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ClipByValue.js ***! + \********************************************************************************/ +/*! exports provided: clipByValueConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"clipByValueConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */let o;const r={kernelName:s.ClipByValue,backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.ClipByValue,null,["number","number","number","number"])},kernelFunc:function(e){const{inputs:t,backend:n,attrs:s}=e,{x:r}=t,{clipValueMin:i,clipValueMax:a}=s,d=n.dataIdMap.get(r.dataId).id,u=n.makeOutput(r.shape,r.dtype),l=n.dataIdMap.get(u.dataId).id;return o(d,i,a,l),u}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Concat.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Concat.js ***! + \***************************************************************************/ +/*! exports provided: concat, concatConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"concat",(function(){return a})),n.d(t,"concatConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernel_utils/shared.js"),r=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Identity.js"),i=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){const{inputs:t,backend:n}=e,a=s.util.parseAxisParam(e.attrs.axis,t[0].shape)[0];let d=s.backend_util.computeOutShape(t.map((e=>e.shape)),a);const u=t.filter((e=>s.util.sizeFromShape(e.shape)>0));if(1===u.length)return Object(r.identity)({inputs:{x:u[0]},backend:n});const l=n.makeOutput(d,t[0].dtype);if(0===s.util.sizeFromShape(d))return l;const c=u.map((e=>e.shape));if(s.backend_util.assertParamsConsistent(c,a),"string"===u[0].dtype){const e=u.map((e=>{const t=[-1,s.util.sizeFromShape(e.shape.slice(a))];return Object(i.reshape)({inputs:{x:e},backend:n,attrs:{shape:t}})})),r=e.map((e=>({vals:n.readSync(e.dataId),shape:e.shape})));d=s.backend_util.computeOutShape(e.map((e=>e.shape)),1);const c=1===e[0].shape[0],f=Object(o.concatImplCPU)(r,d,t[0].dtype,c),p=s.backend_util.computeOutShape(u.map((e=>e.shape)),a);l.shape=p;return n.dataIdMap.get(l.dataId).stringBytes=s.backend_util.fromStringArrayToUint8(f),e.forEach((e=>n.disposeData(e.dataId))),l}const f=s.util.sizeFromShape(u[0].shape.slice(0,a));let p=0;const m=u.map((e=>{const t=s.util.sizeFromShape(e.shape.slice(a));return p+=t,t})),h=u.map((e=>n.typedArrayFromHeap(e))),b=n.typedArrayFromHeap(l);for(let e=0;e`cumsum does not support ${d.dtype} tensors in the WASM backend`));const p=s.backend_util.getAxesPermutation([u],f);let m=d;null!==p&&(m=Object(r.transpose)({inputs:{x:d},attrs:{perm:p},backend:n}));const h=s.backend_util.getInnerMostAxes(1,f)[0];s.backend_util.assertAxesAreInnerMostDims("cumsum",[h],f);const b=n.makeOutput(m.shape,m.dtype),j=m.shape[h],g=n.dataIdMap.get(m.dataId).id,w=n.dataIdMap.get(b.dataId).id;i(g,l?1:0,c?1:0,j,w,o.CppDType[d.dtype]);let _=b;if(null!==p){const e=s.backend_util.getUndoAxesPermutation(p);_=Object(r.transpose)({inputs:{x:b},attrs:{perm:e},backend:n}),n.disposeData(m.dataId),n.disposeData(b.dataId)}return _}const d={kernelName:s.Cumsum,backendName:"wasm",setupFunc:function(e){i=e.wasm.cwrap(s.Cumsum,null,["number","number","number","number","number","number"])},kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/DepthToSpace.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/DepthToSpace.js ***! + \*********************************************************************************/ +/*! exports provided: depthToSpace, depthToSpaceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"depthToSpace",(function(){return r})),n.d(t,"depthToSpaceConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */let o;function r(e){const{backend:t,inputs:n,attrs:r}=e,{x:i}=n,{blockSize:a,dataFormat:d}=r;s.util.assert(a>1,(()=>`blockSize should be > 1 for depthToSpace, but was: ${a}`));const u=i.shape[0],l="NHWC"===d?i.shape[1]:i.shape[2],c="NHWC"===d?i.shape[2]:i.shape[3],f="NHWC"===d?i.shape[3]:i.shape[1],p=l*a,m=c*a,h=f/(a*a),b="NHWC"===d?[u,p,m,h]:[u,h,p,m],j=t.makeOutput(b,"float32"),g=t.dataIdMap.get(i.dataId).id,w=new Uint8Array(new Int32Array(s.util.computeStrides(i.shape)).buffer),_=new Uint8Array(new Int32Array(b).buffer),k=new Uint8Array(new Int32Array(s.util.computeStrides(b)).buffer),v=t.dataIdMap.get(j.dataId).id;return o(g,a,"NHWC"===d?1:0,w,i.shape.length-1,_,k,b.length,v),j}const i={kernelName:s.DepthToSpace,backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.DepthToSpace,null,["number","number","number","array","number","array","array","number","number"])},kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/DepthwiseConv2dNative.js": +/*!******************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/DepthwiseConv2dNative.js ***! + \******************************************************************************************/ +/*! exports provided: depthwiseConv2dNativeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"depthwiseConv2dNativeConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */let o;const r={kernelName:s.DepthwiseConv2dNative,backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.DepthwiseConv2dNative,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:t,attrs:n,backend:r}=e,{x:i,filter:a}=t,d=r.dataIdMap.get(i.dataId).id,u=r.dataIdMap.get(a.dataId).id,{strides:l,dilations:c,pad:f,dimRoundingMode:p}=n,m=null==c?[1,1]:c,h=s.backend_util.computeConv2DInfo(i.shape,a.shape,l,m,f,p,!0),b=h.filterHeight,j=h.filterWidth,g=h.padInfo.top,w=h.padInfo.right,_=h.padInfo.bottom,k=h.padInfo.left,v=h.dilationHeight,x=h.dilationWidth,y=h.strideHeight,O=h.strideWidth,I=h.inChannels,C=h.outChannels,S="SAME"===h.padInfo.type?1:0;if("channelsLast"!==h.dataFormat)throw new Error(`wasm backend DepthwiseConv2dNative does not support dataFormat:'${h.dataFormat}'. Please use 'channelsLast'.`);const T=r.makeOutput(h.outShape,"float32"),N=r.dataIdMap.get(T.dataId).id;return o(d,i.shape[0],i.shape[1],i.shape[2],u,b,j,g,w,_,k,S,v,x,y,O,I,C,N),T}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Equal.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Equal.js ***! + \**************************************************************************/ +/*! exports provided: equalConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"equalConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createBinaryKernelConfig)(s.Equal,!1,"bool")},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Exp.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Exp.js ***! + \************************************************************************/ +/*! exports provided: expConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"expConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createUnaryKernelConfig)(s.Exp)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ExpandDims.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ExpandDims.js ***! + \*******************************************************************************/ +/*! exports provided: expandDims, expandDimsConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"expandDims",(function(){return r})),n.d(t,"expandDimsConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,attrs:n,backend:r}=e,{input:i}=t,{dim:a}=n,d=i.shape.length,u=i.shape.slice();let l=a;return a<0&&(s.util.assert(-(d+1)<=a,(()=>`Axis must be in the interval [${-(d+1)}, ${d}]`)),l=d+a+1),u.splice(l,0,1),Object(o.reshape)({inputs:{x:i},backend:r,attrs:{shape:u}})}const i={kernelName:s.ExpandDims,backendName:"wasm",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Fill.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Fill.js ***! + \*************************************************************************/ +/*! exports provided: fillConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fillConfig",(function(){return s}));const s={kernelName:n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js").Fill,backendName:"wasm",kernelFunc: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const{attrs:{shape:t,value:n,dtype:s},backend:o}=e,r=o.makeOutput(t,s);return o.typedArrayFromHeap(r).fill(n),r}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FlipLeftRight.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FlipLeftRight.js ***! + \**********************************************************************************/ +/*! exports provided: flipLeftRight, flipLeftRightConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"flipLeftRight",(function(){return r})),n.d(t,"flipLeftRightConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */let o;function r(e){const{inputs:t,backend:n}=e,{image:s}=t,r=n.makeOutput(s.shape,s.dtype),i=n.dataIdMap.get(s.dataId).id,a=n.dataIdMap.get(r.dataId).id,[d,u,l,c]=s.shape;return o(i,d,u,l,c,a),r}const i={kernelName:s.FlipLeftRight,backendName:"wasm",kernelFunc:r,setupFunc:function(e){o=e.wasm.cwrap(s.FlipLeftRight,null,["number","number","number","number","number","number"])}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Floor.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Floor.js ***! + \**************************************************************************/ +/*! exports provided: floorConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"floorConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createUnaryKernelConfig)(s.Floor)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FloorDiv.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FloorDiv.js ***! + \*****************************************************************************/ +/*! exports provided: floorDivConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"floorDivConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createBinaryKernelConfig)(s.FloorDiv,!1)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FusedBatchNorm.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FusedBatchNorm.js ***! + \***********************************************************************************/ +/*! exports provided: fusedBatchNormConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fusedBatchNormConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */let o;const r={kernelName:s.FusedBatchNorm,backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.FusedBatchNorm,null,["number","number","number","number","number","number","number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:r}=e,{varianceEpsilon:i}=r,{x:a,mean:d,variance:u,offset:l,scale:c}=n,f=t.dataIdMap.get(a.dataId).id,p=t.dataIdMap.get(d.dataId).id,m=t.dataIdMap.get(u.dataId).id,h=null!=l?t.dataIdMap.get(l.dataId).id:0,b=null!=c?t.dataIdMap.get(c.dataId).id:0,j=t.makeOutput(a.shape,a.dtype);if(0===s.util.sizeFromShape(a.shape))return j;const g=t.dataIdMap.get(j.dataId).id;return o(f,p,m,h,b,i,g),j}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FusedConv2D.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FusedConv2D.js ***! + \********************************************************************************/ +/*! exports provided: fusedConv2DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fusedConv2DConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let r;const i={kernelName:s.FusedConv2D,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.FusedConv2D,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:t,attrs:n,backend:i}=e,{x:a,filter:d,bias:u,preluActivationWeights:l}=t,{strides:c,pad:f,dilations:p,dataFormat:m,dimRoundingMode:h,activation:b,leakyreluAlpha:j}=n,g=s.backend_util.computeConv2DInfo(a.shape,d.shape,c,p,f,h),w=o.FusableActivation[b];if(null==w)throw new Error(`${b} activation not yet supported for FusedConv2D in the wasm backend.`);const _=i.dataIdMap.get(a.dataId).id,k=i.dataIdMap.get(d.dataId).id,v=g.outChannels;let x=0;if(null!=u){const e=i.dataIdMap.get(u.dataId);if(1!==e.shape.length)throw new Error(`FusedConv2D only supports rank-1 bias but got rank ${e.shape.length}.`);if(e.shape[0]!==v)throw new Error(`FusedConv2D bias shape (${e.shape}) does not match the number of output channels (${v})`);x=e.id}const y=g.filterHeight,O=g.filterWidth,I=g.padInfo.top,C=g.padInfo.right,S=g.padInfo.bottom,T=g.padInfo.left,N=g.dilationHeight,E=g.dilationWidth,A=g.strideHeight,R=g.strideWidth,F=g.inChannels,$="SAME"===g.padInfo.type?1:0,M=g.batchSize,D=g.inHeight,P=g.inWidth;if("NHWC"!==m)throw new Error(`wasm backend FusedConv2D does not support dataFormat:'${m}'. Please use 'NHWC'.`);const B=i.makeOutput(g.outShape,"float32"),L=i.dataIdMap.get(B.dataId).id,z=null==l?0:i.dataIdMap.get(l.dataId).id;return r(_,M,D,P,k,y,O,x,I,C,S,T,$,N,E,A,R,F,v,w,z,j||0,L),B}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FusedDepthwiseConv2D.js": +/*!*****************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FusedDepthwiseConv2D.js ***! + \*****************************************************************************************/ +/*! exports provided: fusedDepthwiseConv2DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fusedDepthwiseConv2DConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let r;const i={kernelName:s.FusedDepthwiseConv2D,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.FusedDepthwiseConv2D,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:t,attrs:n,backend:i}=e,{x:a,filter:d,bias:u,preluActivationWeights:l}=t,{strides:c,pad:f,dilations:p,dataFormat:m,dimRoundingMode:h,activation:b,leakyreluAlpha:j}=n,g=s.backend_util.computeConv2DInfo(a.shape,d.shape,c,p,f,h,!0),w=o.FusableActivation[b];if(null==w)throw new Error(`${b} activation not yet supported for FusedDepthwiseConv2D in the wasm backend.`);const _=i.dataIdMap.get(a.dataId).id,k=i.dataIdMap.get(d.dataId).id,v=g.outChannels;let x=0;if(null!=u){const e=i.dataIdMap.get(u.dataId);if(1!==e.shape.length)throw new Error(`FusedDepthwiseConv2D only supports rank-1 bias but got rank ${e.shape.length}.`);if(e.shape[0]!==v)throw new Error(`FusedDepthwiseConv2D bias shape (${e.shape}) does not match the number of output channels (${v})`);x=e.id}const y=g.filterHeight,O=g.filterWidth,I=g.padInfo.top,C=g.padInfo.right,S=g.padInfo.bottom,T=g.padInfo.left,N=g.dilationHeight,E=g.dilationWidth,A=g.strideHeight,R=g.strideWidth,F=g.inChannels,$="SAME"===g.padInfo.type?1:0,M=g.batchSize,D=g.inHeight,P=g.inWidth;if("NHWC"!==m)throw new Error(`wasm backend FusedDepthwiseConv2D does not support dataFormat:'${m}'. Please use 'NHWC'.`);const B=i.makeOutput(g.outShape,"float32"),L=i.dataIdMap.get(B.dataId).id,z=null==l?0:i.dataIdMap.get(l.dataId).id;return r(_,M,D,P,k,y,O,x,I,C,S,T,$,N,E,A,R,F,v,w,z,j||0,L),B}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/GatherNd.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/GatherNd.js ***! + \*****************************************************************************/ +/*! exports provided: gatherNdConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"gatherNdConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let r;const i={kernelName:s.GatherNd,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.GatherNd,null,["number","number","number","number","number","number","array","number"])},kernelFunc:function(e){const{backend:t,inputs:n}=e,{params:i,indices:a}=n,[d,u,l,c]=s.gather_util.prepareAndValidate(i,a),f=t.makeOutput(d,i.dtype);if(0===u)return f;const p=a.shape,m=p[p.length-1],h=t.dataIdMap.get(i.dataId).id,b=t.dataIdMap.get(a.dataId).id,j=new Uint8Array(new Int32Array(c).buffer),g=t.dataIdMap.get(f.dataId).id;return r(h,o.CppDType[i.dtype],b,u,m,l,j,g),f}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/GatherV2.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/GatherV2.js ***! + \*****************************************************************************/ +/*! exports provided: gatherV2Config */function(e,t,n){"use strict";n.r(t),n.d(t,"gatherV2Config",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Reshape.js"),r=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let i;const a={kernelName:s.GatherV2,backendName:"wasm",setupFunc:function(e){i=e.wasm.cwrap("Gather",null,["number","number","array","number","number","number","array","number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:a}=e,{x:d,indices:u}=n,{axis:l,batchDims:c}=a,f=s.util.parseAxisParam(l,d.shape)[0],p=s.backend_util.segment_util.collectGatherOpShapeInfo(d,u,f,c),m=Object(o.reshape)({inputs:{x:d},attrs:{shape:[p.batchSize,p.outerSize,p.dimSize,p.sliceSize]},backend:t}),h=s.util.sizeFromShape(u.shape),b=Object(o.reshape)({inputs:{x:u},attrs:{shape:[p.batchSize,h/p.batchSize]},backend:t}),j=[p.batchSize,p.outerSize,h/p.batchSize,p.sliceSize],g=t.makeOutput(j,d.dtype);if(0===s.util.sizeFromShape(d.shape))return g;const w=m.shape.length-1,_=t.dataIdMap.get(m.dataId).id,k=t.dataIdMap.get(b.dataId).id,v=t.dataIdMap.get(g.dataId).id,x=new Uint8Array(new Int32Array(s.util.computeStrides(m.shape)).buffer),y=new Uint8Array(new Int32Array(s.util.computeStrides(j)).buffer);return i(_,r.CppDType[d.dtype],x,w,k,p.batchSize,y,v),t.disposeData(m.dataId),t.disposeData(b.dataId),g.shape=p.outputShape,g}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Greater.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Greater.js ***! + \****************************************************************************/ +/*! exports provided: greaterConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"greaterConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createBinaryKernelConfig)(s.Greater,!1,"bool")},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/GreaterEqual.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/GreaterEqual.js ***! + \*********************************************************************************/ +/*! exports provided: greaterEqualConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"greaterEqualConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createBinaryKernelConfig)(s.GreaterEqual,!1,"bool")},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Identity.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Identity.js ***! + \*****************************************************************************/ +/*! exports provided: identity, identityConfig */function(e,t,n){"use strict"; +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function s(e){const{inputs:{x:t},backend:n}=e,s=n.makeOutput(t.shape,t.dtype),o=n.typedArrayFromHeap(t);return n.typedArrayFromHeap(s).set(o),s}n.r(t),n.d(t,"identity",(function(){return s})),n.d(t,"identityConfig",(function(){return o}));const o={kernelName:n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js").Identity,backendName:"wasm",kernelFunc:s}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/LeakyRelu.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/LeakyRelu.js ***! + \******************************************************************************/ +/*! exports provided: leakyRelu, leakyReluConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"leakyRelu",(function(){return r})),n.d(t,"leakyReluConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */let o;function r(e){const{inputs:{x:t},attrs:{alpha:n},backend:r}=e,i=r.dataIdMap.get(t.dataId).id,a=r.makeOutput(t.shape,t.dtype);if(0!==s.util.sizeFromShape(t.shape)){const e=r.dataIdMap.get(a.dataId).id;o(i,n,e)}return a}const i={kernelName:s.LeakyRelu,backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.LeakyRelu,null,["number","number","number"])},kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Less.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Less.js ***! + \*************************************************************************/ +/*! exports provided: lessConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"lessConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createBinaryKernelConfig)(s.Less,!1,"bool")},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/LessEqual.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/LessEqual.js ***! + \******************************************************************************/ +/*! exports provided: lessEqualConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"lessEqualConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createBinaryKernelConfig)(s.LessEqual,!1,"bool")},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Log.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Log.js ***! + \************************************************************************/ +/*! exports provided: logConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"logConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createUnaryKernelConfig)(s.Log)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/LogicalAnd.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/LogicalAnd.js ***! + \*******************************************************************************/ +/*! exports provided: logicalAndConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"logicalAndConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createBinaryKernelConfig)(s.LogicalAnd,!1,"bool")},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Max.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Max.js ***! + \************************************************************************/ +/*! exports provided: maxConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maxConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./kernel_utils */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/kernel_utils.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let r;const i={kernelName:s.Max,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.Max,null,["number, number, number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:i}=e,{reductionIndices:a,keepDims:d}=i,{x:u}=n;let l=t.dataIdMap.get(u.dataId).id,c=u;const{transposed:f,axes:p,originalAxes:m,inputWasTransposed:h}=Object(o.permuteAxesAndTranspose)(u,a,t);if(h){c=f,l=t.dataIdMap.get(f.dataId).id}const b=c.shape.length;s.backend_util.assertAxesAreInnerMostDims("max",p,b);const[j,g]=s.backend_util.computeOutAndReduceShapes(c.shape,p),w=s.util.sizeFromShape(g),_=t.makeOutput(j,u.dtype);if(0!==s.util.sizeFromShape(c.shape)){const e=t.dataIdMap.get(_.dataId).id;r(l,w,e)}if(h&&t.disposeData(f.dataId),d){const e=s.backend_util.expandShapeToKeepDim(_.shape,m);_.shape=e}return _}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/MaxPool.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/MaxPool.js ***! + \****************************************************************************/ +/*! exports provided: maxPoolConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPoolConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */let o;const r={kernelName:s.MaxPool,backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.MaxPool,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:t,attrs:n,backend:r}=e,i=t.x,a=r.dataIdMap.get(i.dataId).id,{filterSize:d,strides:u,pad:l,dimRoundingMode:c}=n,f=s.backend_util.computePool2DInfo(i.shape,d,u,1,l,c),p=f.filterHeight,m=f.filterWidth,h=f.padInfo.top,b=f.padInfo.right,j=f.padInfo.bottom,g=f.padInfo.left,w=f.dilationHeight,_=f.dilationWidth,k=f.strideHeight,v=f.strideWidth,x=f.inChannels,y=f.outChannels;if("channelsLast"!==f.dataFormat)throw new Error(`wasm backend does not support dataFormat:'${f.dataFormat}'. Please use 'channelsLast'.`);const O=r.makeOutput(f.outShape,"float32"),I=r.dataIdMap.get(O.dataId).id;return o(a,i.shape[0],i.shape[1],i.shape[2],p,m,h,b,j,g,w,_,k,v,x,y,I),O}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Maximum.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Maximum.js ***! + \****************************************************************************/ +/*! exports provided: maximumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maximumConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createBinaryKernelConfig)(s.Maximum,!1)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Mean.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Mean.js ***! + \*************************************************************************/ +/*! exports provided: mean, meanConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"mean",(function(){return a})),n.d(t,"meanConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Cast */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Cast.js"),r=n(/*! ./kernel_utils */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/kernel_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let i;function a(e){const{backend:t,inputs:n,attrs:a}=e,{axis:d,keepDims:u}=a,{x:l}=n,c=t.dataIdMap.get(l.dataId).id;let f=c,p=l;const{transposed:m,axes:h,originalAxes:b,inputWasTransposed:j}=Object(r.permuteAxesAndTranspose)(l,d,t);let g=h;if(j){const e=t.dataIdMap.get(m.dataId).id;e!==c&&(p=m,f=e,g=s.backend_util.getInnerMostAxes(g.length,p.shape.length))}s.backend_util.assertAxesAreInnerMostDims("mean",g,p.shape.length);const[w,_]=s.backend_util.computeOutAndReduceShapes(p.shape,g),k=s.util.sizeFromShape(_);let v=p;"float32"!==p.dtype&&(v=Object(o.cast)({backend:t,inputs:{x:p},attrs:{dtype:"float32"}}),f=t.dataIdMap.get(v.dataId).id);const x=t.makeOutput(w,"float32");if(0!==s.util.sizeFromShape(p.shape)){const e=t.dataIdMap.get(x.dataId).id;i(f,k,e)}if(j&&t.disposeData(m.dataId),u){const e=s.backend_util.expandShapeToKeepDim(x.shape,b);x.shape=e}return"float32"!==p.dtype&&t.disposeData(v.dataId),x}const d={kernelName:s.Mean,backendName:"wasm",setupFunc:function(e){i=e.wasm.cwrap(s.Mean,null,["number, number, number"])},kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Min.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Min.js ***! + \************************************************************************/ +/*! exports provided: minConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"minConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./kernel_utils */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/kernel_utils.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let r;const i={kernelName:s.Min,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.Min,null,["number, number, number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:i}=e,{axis:a,keepDims:d}=i,{x:u}=n,l=t.dataIdMap.get(u.dataId).id;let c=l,f=u;const{transposed:p,axes:m,originalAxes:h,inputWasTransposed:b}=Object(o.permuteAxesAndTranspose)(u,a,t);if(b){const e=t.dataIdMap.get(p.dataId).id;e!==l&&(f=p,c=e)}const j=f.shape.length;s.backend_util.assertAxesAreInnerMostDims("min",m,j);const[g,w]=s.backend_util.computeOutAndReduceShapes(f.shape,m),_=s.util.sizeFromShape(w),k=t.makeOutput(g,f.dtype);if(0!==s.util.sizeFromShape(f.shape)){const e=t.dataIdMap.get(k.dataId).id;r(c,_,e)}if(b&&t.disposeData(p.dataId),d){const e=s.backend_util.expandShapeToKeepDim(k.shape,h);k.shape=e}return k}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Minimum.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Minimum.js ***! + \****************************************************************************/ +/*! exports provided: minimumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"minimumConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createBinaryKernelConfig)(s.Minimum,!1)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/MirrorPad.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/MirrorPad.js ***! + \******************************************************************************/ +/*! exports provided: mirrorPadConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"mirrorPadConfig",(function(){return a}));var s,o=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),r=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js");let i;!function(e){e[e.reflect=0]="reflect",e[e.symmetric=1]="symmetric"}(s||(s={}));const a={kernelName:o.MirrorPad,backendName:"wasm",kernelFunc:function(e){const{inputs:{x:t},backend:n,attrs:{paddings:o,mode:a}}=e,d=o.map(((e,n)=>e[0]+t.shape[n]+e[1])),u=n.dataIdMap.get(t.dataId).id,l=n.makeOutput(d,t.dtype),c=n.dataIdMap.get(l.dataId).id,f=new Uint8Array(new Int32Array(t.shape).buffer),p=o.map((e=>e[0])),m=o.map((e=>e[1])),h=new Uint8Array(new Int32Array(p).buffer),b=new Uint8Array(new Int32Array(m).buffer);return i(u,f,t.shape.length,r.CppDType[t.dtype],h,b,s[a],c),l},setupFunc:function(e){i=e.wasm.cwrap(o.MirrorPad,null,["number","array","number","number","array","array","number","number"])}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Multiply.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Multiply.js ***! + \*****************************************************************************/ +/*! exports provided: multiplyConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"multiplyConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createBinaryKernelConfig)(s.Multiply,!0)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Neg.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Neg.js ***! + \************************************************************************/ +/*! exports provided: negConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"negConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createUnaryKernelConfig)(s.Neg)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NonMaxSuppressionV3.js": +/*!****************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NonMaxSuppressionV3.js ***! + \****************************************************************************************/ +/*! exports provided: nonMaxSuppressionV3Config */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionV3Config",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./NonMaxSuppression_util */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NonMaxSuppression_util.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let r;const i={kernelName:s.NonMaxSuppressionV3,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.NonMaxSuppressionV3,"number",["number","number","number","number","number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:s}=e,{iouThreshold:i,maxOutputSize:a,scoreThreshold:d}=s,{boxes:u,scores:l}=n,c=t.dataIdMap.get(u.dataId).id,f=t.dataIdMap.get(l.dataId).id,p=r(c,f,a,i,d),{pSelectedIndices:m,selectedSize:h,pSelectedScores:b,pValidOutputs:j}=Object(o.parseResultStruct)(t,p);return t.wasm._free(b),t.wasm._free(j),t.makeOutput([h],"int32",m)}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NonMaxSuppressionV4.js": +/*!****************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NonMaxSuppressionV4.js ***! + \****************************************************************************************/ +/*! exports provided: nonMaxSuppressionV4Config */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionV4Config",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./NonMaxSuppression_util */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NonMaxSuppression_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let r;const i={kernelName:s.NonMaxSuppressionV4,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.NonMaxSuppressionV4,"number",["number","number","number","number","number","bool"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:s}=e,{iouThreshold:i,maxOutputSize:a,scoreThreshold:d,padToMaxOutputSize:u}=s,{boxes:l,scores:c}=n,f=t.dataIdMap.get(l.dataId).id,p=t.dataIdMap.get(c.dataId).id,m=r(f,p,a,i,d,u),{pSelectedIndices:h,selectedSize:b,pSelectedScores:j,pValidOutputs:g}=Object(o.parseResultStruct)(t,m);return t.wasm._free(j),[t.makeOutput([b],"int32",h),t.makeOutput([],"int32",g)]}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NonMaxSuppressionV5.js": +/*!****************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NonMaxSuppressionV5.js ***! + \****************************************************************************************/ +/*! exports provided: nonMaxSuppressionV5Config */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionV5Config",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./NonMaxSuppression_util */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NonMaxSuppression_util.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let r;const i={kernelName:s.NonMaxSuppressionV5,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.NonMaxSuppressionV5,"number",["number","number","number","number","number","number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:s}=e,{iouThreshold:i,maxOutputSize:a,scoreThreshold:d,softNmsSigma:u}=s,{boxes:l,scores:c}=n,f=t.dataIdMap.get(l.dataId).id,p=t.dataIdMap.get(c.dataId).id,m=r(f,p,a,i,d,u),{pSelectedIndices:h,selectedSize:b,pSelectedScores:j,pValidOutputs:g}=Object(o.parseResultStruct)(t,m);return t.wasm._free(g),[t.makeOutput([b],"int32",h),t.makeOutput([b],"float32",j)]}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NonMaxSuppression_util.js": +/*!*******************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NonMaxSuppression_util.js ***! + \*******************************************************************************************/ +/*! exports provided: parseResultStruct */function(e,t,n){"use strict"; +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function s(e,t){const n=new Int32Array(e.wasm.HEAPU8.buffer,t,4),s=n[0],o=n[1],r=n[2],i=n[3];return e.wasm._free(t),{pSelectedIndices:s,selectedSize:o,pSelectedScores:r,pValidOutputs:i}}n.r(t),n.d(t,"parseResultStruct",(function(){return s}))},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NotEqual.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NotEqual.js ***! + \*****************************************************************************/ +/*! exports provided: notEqualConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"notEqualConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createBinaryKernelConfig)(s.NotEqual,!1,"bool")},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/OneHot.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/OneHot.js ***! + \***************************************************************************/ +/*! exports provided: oneHotConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"oneHotConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */let o;const r={kernelName:s.OneHot,backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.OneHot,null,["number","number","number","number","number"])},kernelFunc:function(e){const{inputs:t,backend:n,attrs:s}=e,{indices:r}=t,{depth:i,onValue:a,offValue:d}=s,u=n.makeOutput([...r.shape,i],"int32"),l=n.dataIdMap.get(u.dataId).id,c=n.dataIdMap.get(r.dataId).id;return o(c,i,a,d,l),u}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/OnesLike.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/OnesLike.js ***! + \*****************************************************************************/ +/*! exports provided: onesLikeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"onesLikeConfig",(function(){return s}));const s={kernelName:n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js").OnesLike,backendName:"wasm",kernelFunc: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const{inputs:{x:t},backend:n}=e,s=n.makeOutput(t.shape,t.dtype);return n.typedArrayFromHeap(s).fill(1),s}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Pack.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Pack.js ***! + \*************************************************************************/ +/*! exports provided: pack, packConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"pack",(function(){return i})),n.d(t,"packConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Concat */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Concat.js"),r=n(/*! ./ExpandDims */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ExpandDims.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{axis:a}=i;if(1===t.length)return Object(r.expandDims)({inputs:{input:t[0]},backend:n,attrs:{dim:a}});const d=t[0].shape,u=t[0].dtype;t.forEach((e=>{s.util.assertShapesMatch(d,e.shape,"All tensors passed to stack must have matching shapes"),s.util.assert(u===e.dtype,(()=>"All tensors passed to stack must have matching dtypes"))}));const l=[],c=t.map((e=>{const t=Object(r.expandDims)({inputs:{input:e},backend:n,attrs:{dim:a}});return l.push(t),t})),f=Object(o.concat)({inputs:c,backend:n,attrs:{axis:a}});return l.forEach((e=>n.disposeData(e.dataId))),f}const a={kernelName:s.Pack,backendName:"wasm",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/PadV2.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/PadV2.js ***! + \**************************************************************************/ +/*! exports provided: padV2Config */function(e,t,n){"use strict";n.r(t),n.d(t,"padV2Config",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let r;const i={kernelName:s.PadV2,backendName:"wasm",kernelFunc:function(e){const{inputs:{x:t},backend:n,attrs:{paddings:s,constantValue:i}}=e,a=s.map(((e,n)=>e[0]+t.shape[n]+e[1])),d=n.dataIdMap.get(t.dataId).id,u=n.makeOutput(a,t.dtype),l=n.dataIdMap.get(u.dataId).id,c=new Uint8Array(new Int32Array(t.shape).buffer),f=s.map((e=>e[0])),p=s.map((e=>e[1])),m=new Uint8Array(new Int32Array(f).buffer),h=new Uint8Array(new Int32Array(p).buffer);return r(d,c,t.shape.length,o.CppDType[t.dtype],m,h,i,l),u},setupFunc:function(e){r=e.wasm.cwrap(s.PadV2,null,["number","array","number","number","array","array","number","number"])}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Pow.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Pow.js ***! + \************************************************************************/ +/*! exports provided: powConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"powConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createBinaryKernelConfig)(s.Pow,!1)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Prelu.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Prelu.js ***! + \**************************************************************************/ +/*! exports provided: preluConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"preluConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */let o;const r={kernelName:s.Prelu,backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.Prelu,null,["number","number","number"])},kernelFunc:function(e){const{inputs:t,backend:n}=e,{x:s,alpha:r}=t,i=n.dataIdMap.get(s.dataId).id,a=n.dataIdMap.get(r.dataId).id,d=n.makeOutput(s.shape,"float32"),u=n.dataIdMap.get(d.dataId).id;return o(i,a,u),d}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Prod.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Prod.js ***! + \*************************************************************************/ +/*! exports provided: prodConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"prodConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./kernel_utils */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/kernel_utils.js"),r=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let i;const a={kernelName:s.Prod,backendName:"wasm",setupFunc:function(e){i=e.wasm.cwrap(s.Prod,null,["number","number","number","number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:a}=e,{axis:d,keepDims:u}=a,{x:l}=n,c=t.dataIdMap.get(l.dataId).id;let f=c,p=l;const{transposed:m,axes:h,originalAxes:b,inputWasTransposed:j}=Object(o.permuteAxesAndTranspose)(l,d,t);let g=h;if(j){const e=t.dataIdMap.get(m.dataId).id;e!==c&&(p=m,f=e,g=s.backend_util.getInnerMostAxes(g.length,p.shape.length))}s.backend_util.assertAxesAreInnerMostDims("prod",g,p.shape.length);const[w,_]=s.backend_util.computeOutAndReduceShapes(p.shape,g),k=s.util.sizeFromShape(_),v=t.makeOutput(w,p.dtype);if(0!==s.util.sizeFromShape(p.shape)){const e=t.dataIdMap.get(v.dataId).id;i(f,k,r.CppDType[v.dtype],e)}if(j&&t.disposeData(m.dataId),u){const e=s.backend_util.expandShapeToKeepDim(v.shape,b);v.shape=e}return v}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Range.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Range.js ***! + \**************************************************************************/ +/*! exports provided: range, rangeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"range",(function(){return r})),n.d(t,"rangeConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=e=>{const{backend:t,attrs:n}=e,{start:s,stop:r,step:i,dtype:a}=n,d=Object(o.rangeImplCPU)(s,r,i,a),u=t.makeOutput([d.length],a);return t.typedArrayFromHeap(u).set(d),u},i={kernelName:s.Range,backendName:"wasm",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/RealDiv.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/RealDiv.js ***! + \****************************************************************************/ +/*! exports provided: realDivConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"realDivConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createBinaryKernelConfig)(s.RealDiv,!0)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Relu.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Relu.js ***! + \*************************************************************************/ +/*! exports provided: reluConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"reluConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createUnaryKernelConfig)(s.Relu)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Relu6.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Relu6.js ***! + \**************************************************************************/ +/*! exports provided: relu6Config */function(e,t,n){"use strict";n.r(t),n.d(t,"relu6Config",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createUnaryKernelConfig)(s.Relu6)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Reshape.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Reshape.js ***! + \****************************************************************************/ +/*! exports provided: reshape, reshapeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"reshape",(function(){return o})),n.d(t,"reshapeConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e){const{inputs:t,attrs:n}=e,{x:o}=t,{shape:r}=n,i=s.util.sizeFromShape(o.shape),a=s.util.inferFromImplicitShape(r,i);return s.util.assert(i===s.util.sizeFromShape(a),(()=>`new shape: ${a}, old shape: ${o.shape}. New shape and old shape must have the same number of elements.`)),e.backend.incRef(o.dataId),{dataId:o.dataId,shape:a,dtype:o.dtype}}const r={kernelName:s.Reshape,backendName:"wasm",kernelFunc:o}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ResizeBilinear.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ResizeBilinear.js ***! + \***********************************************************************************/ +/*! exports provided: resizeBilinearConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"resizeBilinearConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Cast */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Cast.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let r;const i={kernelName:s.ResizeBilinear,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.ResizeBilinear,null,["number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:i}=e,{images:a}=n,{alignCorners:d,halfPixelCenters:u,size:l}=i,[c,f]=l,[p,m,h,b]=a.shape,j=[p,c,f,b];let g,w=t.dataIdMap.get(a.dataId);"float32"!==w.dtype&&(g=Object(o.cast)({backend:t,inputs:{x:a},attrs:{dtype:"float32"}}),w=t.dataIdMap.get(g.dataId));const _=w.id,k=t.makeOutput(j,"float32");if(0===s.util.sizeFromShape(a.shape))return k;const v=t.dataIdMap.get(k.dataId).id;return r(_,p,m,h,b,c,f,d?1:0,u?1:0,v),null!=g&&t.disposeData(g.dataId),k}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Reverse.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Reverse.js ***! + \****************************************************************************/ +/*! exports provided: reverse, reverseConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"reverse",(function(){return a})),n.d(t,"reverseConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Identity.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let i;function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:d}=t,{dims:u}=a,l=s.util.parseAxisParam(u,d.shape);if(0===d.shape.length)return Object(o.identity)({inputs:{x:d},backend:n});const c=n.makeOutput(d.shape,d.dtype),f=n.dataIdMap.get(d.dataId).id,p=n.dataIdMap.get(c.dataId).id,m=new Uint8Array(new Int32Array(l).buffer),h=new Uint8Array(new Int32Array(d.shape).buffer);i(f,m,l.length,h,d.shape.length,p);const b=Object(r.reshape)({inputs:{x:c},attrs:{shape:d.shape},backend:n});return n.disposeData(c.dataId),b}const d={kernelName:s.Reverse,backendName:"wasm",kernelFunc:a,setupFunc:function(e){i=e.wasm.cwrap(s.Reverse,null,["number","array","number","array","number","number"])}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/RotateWithOffset.js": +/*!*************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/RotateWithOffset.js ***! + \*************************************************************************************/ +/*! exports provided: rotateWithOffset, rotateWithOffsetConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"rotateWithOffset",(function(){return r})),n.d(t,"rotateWithOffsetConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */let o;function r(e){const{inputs:t,backend:n,attrs:r}=e,{image:i}=t,{radians:a,fillValue:d,center:u}=r,l=n.makeOutput(i.shape,i.dtype),c=n.dataIdMap.get(i.dataId).id,f=n.dataIdMap.get(l.dataId).id,[p,m,h,b]=i.shape,[j,g]=s.backend_util.getImageCenter(u,m,h),w="number"==typeof d?[d,d,d,0===d?0:255]:[...d,255],_=new Uint8Array(new Int32Array(w).buffer);return o(c,p,m,h,b,a,j,g,_,w.length,f),l}const i={kernelName:s.RotateWithOffset,backendName:"wasm",kernelFunc:r,setupFunc:function(e){o=e.wasm.cwrap(s.RotateWithOffset,null,["number","number","number","number","number","number","number","number","array","number","number"])}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Round.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Round.js ***! + \**************************************************************************/ +/*! exports provided: roundConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"roundConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createUnaryKernelConfig)(s.Round)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Rsqrt.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Rsqrt.js ***! + \**************************************************************************/ +/*! exports provided: rsqrtConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"rsqrtConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createUnaryKernelConfig)(s.Rsqrt)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ScatterNd.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ScatterNd.js ***! + \******************************************************************************/ +/*! exports provided: scatterNdConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"scatterNdConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let r;const i={kernelName:s.ScatterNd,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.ScatterNd,null,["number","number","number","number","number","number","array","number","number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:i}=e,{indices:a,updates:d}=n,{shape:u}=i,l=t.makeOutput(u,d.dtype);if(0===s.util.sizeFromShape(u))return l;const{sliceRank:c,numUpdates:f,sliceSize:p,strides:m,outputSize:h}=s.scatter_util.calculateShapes(d,a,u),b=t.dataIdMap.get(a.dataId).id,j=t.dataIdMap.get(d.dataId).id,g=new Uint8Array(new Int32Array(m).buffer),w=t.dataIdMap.get(l.dataId).id;return r(b,j,o.CppDType[d.dtype],c,f,p,g,h,w),l}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Select.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Select.js ***! + \***************************************************************************/ +/*! exports provided: selectConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"selectConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */let o;const r={kernelName:s.Select,backendName:"wasm",kernelFunc:function(e){const{inputs:t,backend:n}=e,{condition:r,t:i,e:a}=t,d=n.dataIdMap.get(r.dataId).id,u=n.dataIdMap.get(i.dataId).id,l=n.dataIdMap.get(a.dataId).id,c=n.makeOutput(i.shape,i.dtype),f=n.dataIdMap.get(c.dataId).id,p=r.shape.length,m=i.shape.length,h=0===p||p>1||1===m?1:s.util.sizeFromShape(i.shape.slice(1));return o(d,u,l,h,f),c},setupFunc:function(e){o=e.wasm.cwrap("SelectV2",null,["number","number","number","number","number"])}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sigmoid.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sigmoid.js ***! + \****************************************************************************/ +/*! exports provided: sigmoidConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sigmoidConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */let o;const r={kernelName:"Sigmoid",backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.Sigmoid,null,["number","number"])},kernelFunc:function(e){const{backend:t,inputs:{x:n}}=e,r=t.dataIdMap.get(n.dataId).id,i=t.makeOutput(n.shape,n.dtype),a=t.dataIdMap.get(i.dataId).id;return 0===s.util.sizeFromShape(i.shape)||o(r,a),i}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sin.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sin.js ***! + \************************************************************************/ +/*! exports provided: sinConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sinConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createUnaryKernelConfig)(s.Sin)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Slice.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Slice.js ***! + \**************************************************************************/ +/*! exports provided: slice, sliceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"slice",(function(){return r})),n.d(t,"sliceConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:{x:t},attrs:{begin:n,size:r},backend:i}=e,[a,d]=s.slice_util.parseSliceParams(t,n,r),u=s.slice_util.isSliceContinous(t.shape,a,d),l=i.readSync(t.dataId),c=i.makeOutput(d,t.dtype),f=s.util.computeStrides(t.shape),p=i.dataIdMap.get(c.dataId);if(u){const e=s.slice_util.computeFlatOffset(a,f);if("string"===t.dtype)p.stringBytes=l.slice(e,e+s.util.sizeFromShape(d));else{i.typedArrayFromHeap(c).set(l.subarray(e,e+s.util.sizeFromShape(d)))}return c}if("string"===t.dtype){const e=Object(o.sliceImplCPU)(l,a,d,t.shape,t.dtype);return p.stringBytes=e,c}const m=i.typedArrayFromHeap(c),h=t.shape.length;if(2===h)!function(e,t,n,s,o){let r=0;const i=s[0],a=s[1],d=i+o[0];for(let s=i;s{const t=[...f];t[u]=e;const n=Object(o.slice)({inputs:{x:i},attrs:{begin:c,size:t},backend:r});return c[u]+=e,n}))}const i={kernelName:s.SplitV,backendName:"wasm",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sqrt.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sqrt.js ***! + \*************************************************************************/ +/*! exports provided: sqrtConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sqrtConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createUnaryKernelConfig)(s.Sqrt)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Square.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Square.js ***! + \***************************************************************************/ +/*! exports provided: squareConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"squareConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createUnaryKernelConfig)(s.Square)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/SquaredDifference.js": +/*!**************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/SquaredDifference.js ***! + \**************************************************************************************/ +/*! exports provided: squaredDifferenceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"squaredDifferenceConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createBinaryKernelConfig)(s.SquaredDifference,!0)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Step.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Step.js ***! + \*************************************************************************/ +/*! exports provided: stepConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"stepConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */let o;const r={kernelName:s.Step,backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.Step,null,["number","number","number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:s}=e,{alpha:r}=s,{x:i}=n,a=t.dataIdMap.get(i.dataId).id,d=t.makeOutput(i.shape,i.dtype),u=t.dataIdMap.get(d.dataId).id;return o(a,r,u),d}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/StridedSlice.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/StridedSlice.js ***! + \*********************************************************************************/ +/*! exports provided: stridedSlice, stridedSliceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"stridedSlice",(function(){return a})),n.d(t,"stridedSliceConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Reshape.js"),r=n(/*! ./Slice */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Slice.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let i;function a(e){const{backend:t,inputs:n,attrs:a}=e,{x:d}=n;let{begin:u,end:l,strides:c}=a;null==c&&(c=new Array(u.length));const{beginMask:f,endMask:p,ellipsisMask:m,newAxisMask:h,shrinkAxisMask:b}=a,j=s.backend_util.slice_util.maskToAxes(m);if(j.length>1)throw new Error("Multiple ellipses in slice is not allowed.");if(0!==m&&0!==h)throw new Error("Using both ellipsisMask and newAxisMask is not yet supported.");if(0!==m&&0!==b)throw new Error("Using both ellipsisMask and shrinkAxisMask is not yet supported.");const g=d.shape.length-u.length,w=s.backend_util.slice_util.maskToAxes(h),_=d.shape.slice();w.forEach((e=>{u[e]=0,l[e]=1,_.splice(e,0,1)}));const k=Object(o.reshape)({inputs:{x:d},attrs:{shape:_},backend:t}),{begin:v,end:x,strides:y}=s.backend_util.slice_util.getNormalizedAxes(k.shape,j,g,u,l,c,f,p,m);u=v,l=x,c=y;const O=s.backend_util.slice_util.maskToAxes(b);O.forEach((e=>{l[e]=u[e]+1,c[e]=1}));const I=s.backend_util.slice_util.computeOutShape(u,l,c),C=I.filter(((e,t)=>-1===O.indexOf(t)));if(c.every((e=>1===e))){const e=Object(r.slice)({inputs:{x:k},attrs:{begin:u,size:I},backend:t});t.disposeData(k.dataId);const n=Object(o.reshape)({inputs:{x:e},attrs:{shape:C},backend:t});return t.disposeData(e.dataId),n}const S=t.makeOutput(C,"float32");if(!C.some((e=>0===e))){const e=t.dataIdMap.get(k.dataId).id,n=new Uint8Array(new Int32Array(s.util.computeStrides(k.shape)).buffer),o=new Uint8Array(new Int32Array(u).buffer),r=new Uint8Array(new Int32Array(l).buffer),a=new Uint8Array(new Int32Array(c).buffer),d=new Uint8Array(new Int32Array(C).buffer),f=new Uint8Array(new Int32Array(s.util.computeStrides(C)).buffer),p=t.dataIdMap.get(S.dataId).id;i(e,n,k.shape.length,o,r,a,d,f,C.length,p)}t.disposeData(k.dataId);const T=Object(o.reshape)({inputs:{x:S},attrs:{shape:C},backend:t});return t.disposeData(S.dataId),T}const d={kernelName:s.StridedSlice,backendName:"wasm",setupFunc:function(e){i=e.wasm.cwrap(s.StridedSlice,null,["number","array","number","array","array","array","array","array","number","number"])},kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sub.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sub.js ***! + \************************************************************************/ +/*! exports provided: subConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"subConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createBinaryKernelConfig)(s.Sub,!0)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sum.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sum.js ***! + \************************************************************************/ +/*! exports provided: sumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sumConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./kernel_utils */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/kernel_utils.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let r;const i={kernelName:s.Sum,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.Sum,null,["number, number, number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:i}=e,{axis:a,keepDims:d}=i,{x:u}=n,l=t.dataIdMap.get(u.dataId).id;let c=l,f=u;const{transposed:p,axes:m,originalAxes:h,inputWasTransposed:b}=Object(o.permuteAxesAndTranspose)(u,a,t);let j=m;if(b){const e=t.dataIdMap.get(p.dataId).id;e!==l&&(f=p,c=e,j=s.backend_util.getInnerMostAxes(j.length,f.shape.length))}s.backend_util.assertAxesAreInnerMostDims("sum",j,f.shape.length);const[g,w]=s.backend_util.computeOutAndReduceShapes(f.shape,j),_=s.util.sizeFromShape(w),k=t.makeOutput(g,f.dtype);if(0!==s.util.sizeFromShape(f.shape)){const e=t.dataIdMap.get(k.dataId).id;r(c,_,e)}if(b&&t.disposeData(p.dataId),d){const e=s.backend_util.expandShapeToKeepDim(k.shape,h);k.shape=e}return k}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Tan.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Tan.js ***! + \************************************************************************/ +/*! exports provided: tanConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"tanConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createUnaryKernelConfig)(s.Tan)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Tanh.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Tanh.js ***! + \*************************************************************************/ +/*! exports provided: tanhConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"tanhConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createUnaryKernelConfig)(s.Tanh)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Tile.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Tile.js ***! + \*************************************************************************/ +/*! exports provided: tileConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"tileConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let r;const i={kernelName:s.Tile,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.Tile,null,["number","array","number","array","number","number"])},kernelFunc:function(e){const{inputs:t,backend:n,attrs:s}=e,{x:i}=t,a=n.dataIdMap.get(i.dataId).id,{reps:d}=s,u=new Array(i.shape.length);for(let e=0;e{const{x:s}=e,{k:i,sorted:a}=n,d=t.dataIdMap.get(s.dataId).id,u=new Uint8Array(new Int32Array(s.shape).buffer),l=s.shape.slice();l[l.length-1]=i;const c=t.makeOutput(l,s.dtype),f=t.dataIdMap.get(c.dataId).id,p=t.makeOutput(l,"int32"),m=t.dataIdMap.get(p.dataId).id;return r(d,u,s.shape.length,o.CppDType[s.dtype],i,a,f,m),[c,p]},a={kernelName:s.TopK,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.TopK,null,["number","array","number","number","number","bool","number","number"])},kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Transform.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Transform.js ***! + \******************************************************************************/ +/*! exports provided: transformConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"transformConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */let o;const r={kernelName:s.Transform,backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.Transform,null,["number","number","bool","number","number","number","number","number","number","array","number","number","number","number","number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:r}=e,{image:i,transforms:a}=n,{interpolation:d,fillMode:u,fillValue:l,outputShape:c}=r,[f,p,m,h]=i.shape,[b,j]=null!=c?c:[p,m],g=[f,b,j,h],w=new Uint8Array(new Int32Array(s.util.computeStrides(i.shape)).buffer),_=t.makeOutput(g,i.dtype),k=t.dataIdMap.get(_.dataId).id,v=t.dataIdMap.get(i.dataId).id,x=t.dataIdMap.get(a.dataId).id,y="nearest"===d?1:2;let O;switch(u){case"constant":O=1;break;case"reflect":O=2;break;case"wrap":O=3;break;case"nearest":O=4;break;default:O=1}return o(v,x,a.shape[0]>1,f,b,j,h,m,p,w,i.shape.length-1,y,O,l,k),_}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Transpose.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Transpose.js ***! + \******************************************************************************/ +/*! exports provided: transpose, transposeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"transpose",(function(){return a})),n.d(t,"transposeConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Identity.js"),r=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let i;function a(e){const{inputs:t,backend:n,attrs:s}=e,[a,d]=function(e,t){const n=[],s=[];for(let o=0;o=e&&(-1===t||s[t]>s[n])&&(t=n);s[t]=e}return[n,s]}(t.x.shape,s.perm);let u=!0;for(let e=0;e({dataId:e,dtype:t,shape:u})))}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ZerosLike.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ZerosLike.js ***! + \******************************************************************************/ +/*! exports provided: zerosLikeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"zerosLikeConfig",(function(){return s}));const s={kernelName:n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js").ZerosLike,backendName:"wasm",kernelFunc: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const{inputs:{x:t},backend:n}=e,s=n.makeOutput(t.shape,t.dtype);return n.typedArrayFromHeap(s).fill(0),s}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/_FusedMatMul.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/_FusedMatMul.js ***! + \*********************************************************************************/ +/*! exports provided: fusedMatMulConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fusedMatMulConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let r;const i={kernelName:s._FusedMatMul,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s._FusedMatMul,null,["number","array","number","number","array","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:t,backend:n,attrs:s}=e,{a:i,b:a,bias:d,preluActivationWeights:u}=t;if("float32"!==i.dtype||"float32"!==a.dtype)throw new Error("_FusedMatMul for non non-float32 tensors not yet supported.");const{transposeA:l,transposeB:c,activation:f,leakyreluAlpha:p}=s,m=n.dataIdMap.get(i.dataId).id,h=n.dataIdMap.get(a.dataId).id;let b=0;if(null!=d){const e=n.dataIdMap.get(d.dataId);if(1!==e.shape.length)throw new Error(`_FusedMatMul only supports rank-1 bias but got rank ${e.shape.length}.`);b=e.id}const j=null==u?0:n.dataIdMap.get(u.dataId).id,g=o.FusableActivation[f];if(null==g)throw new Error(`${f} activation not yet supported for FusedConv2D in the wasm backend.`);const w=l?i.shape[2]:i.shape[1],_=c?a.shape[1]:a.shape[2],k=i.shape[0],v=n.makeOutput([k,w,_],i.dtype),x=n.dataIdMap.get(v.dataId).id,y=new Uint8Array(new Int32Array(i.shape).buffer),O=new Uint8Array(new Int32Array(a.shape).buffer);return r(m,y,i.shape.length,h,O,a.shape.length,l,c,g,b,j,p||0,x),v}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js ***! + \**********************************************************************************/ +/*! exports provided: createBinaryKernelConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"createBinaryKernelConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e,t,n){let r;return{kernelName:e,backendName:"wasm",setupFunc:function(t){r=t.wasm.cwrap(e,null,["number","array","number","number","array","number","number","number"])},kernelFunc:function(i){const{backend:a,inputs:d}=i,{a:u,b:l}=d,c=a.dataIdMap.get(u.dataId).id,f=a.dataIdMap.get(l.dataId).id,p=null!=n?n:u.dtype,m=s.backend_util.assertAndGetBroadcastShape(u.shape,l.shape),h=a.makeOutput(m,p);if(0===s.util.sizeFromShape(m))return h;const b=new Uint8Array(new Int32Array(u.shape).buffer),j=new Uint8Array(new Int32Array(l.shape).buffer),g=a.dataIdMap.get(h.dataId).id,w=()=>r(c,b,u.shape.length,f,j,l.shape.length,o.CppDType[u.dtype],g);if(t&&"float32"===u.dtype)return w(),h;const _=s.backend_util.getBroadcastDims(u.shape,m),k=s.backend_util.getBroadcastDims(l.shape,m),v=_.every(((e,t)=>e===t)),x=k.every(((e,t)=>e===t));if(v&&x)return w(),h;throw new Error(`Broadcasting along outer dims is not yet supported for ${u.dtype} ${e}.`)}}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/kernel_utils.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/kernel_utils.js ***! + \*********************************************************************************/ +/*! exports provided: permuteAxesAndTranspose */function(e,t,n){"use strict";n.r(t),n.d(t,"permuteAxesAndTranspose",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Transpose.js"); +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e,t,n){const r=e.shape,i=e.shape.length,a=s.util.parseAxisParam(t,r);let d=a;const u=s.backend_util.getAxesPermutation(d,i);let l=null,c=!1;if(null!=u){const t=new Array(i);for(let e=0;e1&&s.argv[1].replace(/\\/g,"/"),b=s.argv.slice(2),s.on("uncaughtException",(function(e){if(!(e instanceof ln))throw e})),s.on("unhandledRejection",ke),j=function(e){s.exit(e)},p.inspect=function(){return"[Emscripten Module object]"};try{N=n(/*! worker_threads */6)}catch(e){throw console.error('The "worker_threads" module is not supported in this node.js build - perhaps a newer version is needed?'),e}r.Worker=N.Worker}else k?("undefined"!=typeof read&&(x=function(e){return read(e)}),O=function(e){var t;return"function"==typeof readbuffer?new Uint8Array(readbuffer(e)):(U("object"==typeof(t=read(e,"binary"))),t)},"undefined"!=typeof scriptArgs?b=scriptArgs:"undefined"!=typeof arguments&&(b=arguments),"function"==typeof quit&&(j=function(e){quit(e)}),"undefined"!=typeof print&&("undefined"==typeof console&&(console={}),console.log=print,console.warn=console.error="undefined"!=typeof printErr?printErr:print)):(g||w)&&(w?S=self.location.href:"undefined"!=typeof document&&document.currentScript&&(S=document.currentScript.src),"undefined"!=typeof i&&i&&(S=i),S=0!==S.indexOf("blob:")?S.substr(0,S.lastIndexOf("/")+1):"",_?(x=function(e,t){return I||(I=n(/*! fs */5)),C||(C=n(/*! path */4)),e=C.normalize(e),I.readFileSync(e,t?null:"utf8")},O=function(e){var t=x(e,!0);return t.buffer||(t=new Uint8Array(t)),U(t.buffer),t}):(x=function(e){var t=new XMLHttpRequest;return t.open("GET",e,!1),t.send(null),t.responseText},w&&(O=function(e){var t=new XMLHttpRequest;return t.open("GET",e,!1),t.responseType="arraybuffer",t.send(null),new Uint8Array(t.response)}),y=function(e,t,n){var s=new XMLHttpRequest;s.open("GET",e,!0),s.responseType="arraybuffer",s.onload=function(){200==s.status||0==s.status&&s.response?t(s.response):n()},s.onerror=n,s.send(null)}));_&&"undefined"==typeof performance&&(r.performance=n(/*! perf_hooks */7).performance);var E,A=p.print||console.log.bind(console),R=p.printErr||console.warn.bind(console);for(m in h)h.hasOwnProperty(m)&&(p[m]=h[m]);h=null,p.arguments&&(b=p.arguments),p.thisProgram&&p.thisProgram,p.quit&&(j=p.quit),Atomics.load,Atomics.store,Atomics.compareExchange,p.wasmBinary&&(E=p.wasmBinary);var F,$,M=p.noExitRuntime||!0;"object"!=typeof WebAssembly&&ke("no native wasm support detected");var D,P,B,L,z,G,W=!1;function U(e,t){e||ke("Assertion failed: "+t)}function V(e){var t=p["_"+e];return U(t,"Cannot call unknown function "+e+", make sure it is exported"),t}function q(e,t,n,s,o){var r={string:function(e){var t=0;if(null!=e&&0!==e){var n=1+(e.length<<2);Z(e,t=on(n),n)}return t},array:function(e){var t=on(e.length);return J(e,t),t}},i=V(e),a=[],d=0;if(s)for(var u=0;u=s);){var r=e[t++];if(!r)return o;if(128&r){var i=63&e[t++];if(192!=(224&r)){var a=63&e[t++];if((r=224==(240&r)?(15&r)<<12|i<<6|a:(7&r)<<18|i<<12|a<<6|63&e[t++])<65536)o+=String.fromCharCode(r);else{var d=r-65536;o+=String.fromCharCode(55296|d>>10,56320|1023&d)}}else o+=String.fromCharCode((31&r)<<6|i)}else o+=String.fromCharCode(r)}return o}function X(e,t){return e?K(a(),e,t):""}function Y(e,t,n,s){if(!(s>0))return 0;for(var o=n,r=n+s-1,i=0;i=55296&&a<=57343&&(a=65536+((1023&a)<<10)|1023&e.charCodeAt(++i)),a<=127){if(n>=r)break;t[n++]=a}else if(a<=2047){if(n+1>=r)break;t[n++]=192|a>>6,t[n++]=128|63&a}else if(a<=65535){if(n+2>=r)break;t[n++]=224|a>>12,t[n++]=128|a>>6&63,t[n++]=128|63&a}else{if(n+3>=r)break;t[n++]=240|a>>18,t[n++]=128|a>>12&63,t[n++]=128|a>>6&63,t[n++]=128|63&a}}return t[n]=0,n-o}function Z(e,t,n){return Y(e,a(),t,n)}function Q(e){for(var t=0,n=0;n=55296&&s<=57343&&(s=65536+((1023&s)<<10)|1023&e.charCodeAt(++n)),s<=127?++t:t+=s<=2047?2:s<=65535?3:4}return t}function J(e,n){t().set(e,n)}function ee(e,t){return e%t>0&&(e+=t-e%t),e}function te(e){D=e,p.HEAP8=P=new Int8Array(e),p.HEAP16=new Int16Array(e),p.HEAP32=L=new Int32Array(e),p.HEAPU8=B=new Uint8Array(e),p.HEAPU16=new Uint16Array(e),p.HEAPU32=z=new Uint32Array(e),p.HEAPF32=new Float32Array(e),p.HEAPF64=G=new Float64Array(e)}var ne,se=p.INITIAL_MEMORY||16777216;if(v)F=p.wasmMemory,D=p.buffer;else if(p.wasmMemory)F=p.wasmMemory;else if(!((F=new WebAssembly.Memory({initial:se/65536,maximum:32768,shared:!0})).buffer instanceof SharedArrayBuffer))throw R("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag"),_&&console.log("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and also use a recent version)"),Error("bad memory");F&&(D=F.buffer),se=D.byteLength,te(D);var oe=[],re=[],ie=[],ae=[],de=[];function ue(){if(!v){if(p.preRun)for("function"==typeof p.preRun&&(p.preRun=[p.preRun]);p.preRun.length;)me(p.preRun.shift());Re(oe)}}function le(){v||Re(re)}function ce(){v||Re(ie)}function fe(){}function pe(){if(!v){if(p.postRun)for("function"==typeof p.postRun&&(p.postRun=[p.postRun]);p.postRun.length;)he(p.postRun.shift());Re(de)}}function me(e){oe.unshift(e)}function he(e){de.unshift(e)}v||re.push({func:function(){Gt()}});var be=0,je=null,ge=null;function we(e){U(!v,"addRunDependency cannot be used in a pthread worker"),be++,p.monitorRunDependencies&&p.monitorRunDependencies(be)}function _e(e){if(be--,p.monitorRunDependencies&&p.monitorRunDependencies(be),0==be&&(null!==je&&(clearInterval(je),je=null),ge)){var t=ge;ge=null,t()}}function ke(e){p.onAbort&&p.onAbort(e),v&&console.error("Pthread aborting at "+(new Error).stack),R(e+=""),W=!0,e="abort("+e+"). Build with -s ASSERTIONS=1 for more info.";var t=new WebAssembly.RuntimeError(e);throw f(t),t}function ve(e,t){return String.prototype.startsWith?e.startsWith(t):0===e.indexOf(t)}p.preloadedImages={},p.preloadedAudios={};var xe="data:application/octet-stream;base64,";function ye(e){return ve(e,xe)}var Oe="file://";function Ie(e){return ve(e,Oe)}var Ce="tfjs-backend-wasm-threaded-simd.wasm";function Se(e){try{if(e==Ce&&E)return new Uint8Array(E);if(O)return O(e);throw"both async and sync fetching of the wasm failed"}catch(e){ke(e)}}function Te(){if(!E&&(g||w)){if("function"==typeof fetch&&!Ie(Ce))return fetch(Ce,{credentials:"same-origin"}).then((function(e){if(!e.ok)throw"failed to load wasm binary file at '"+Ce+"'";return e.arrayBuffer()})).catch((function(){return Se(Ce)}));if(y)return new Promise((function(e,t){y(Ce,(function(t){e(new Uint8Array(t))}),t)}))}return Promise.resolve().then((function(){return Se(Ce)}))}function Ne(){var e={a:zt};function t(e,t){var n=e.exports;if(p.asm=n,ne=p.asm.F,$=t,!v){var s=Be.unusedWorkers.length;Be.unusedWorkers.forEach((function(e){Be.loadWasmModuleToWorker(e,(function(){--s||_e()}))}))}}function n(e){t(e.instance,e.module)}function s(t){return Te().then((function(t){return WebAssembly.instantiate(t,e)})).then(t,(function(e){R("failed to asynchronously prepare wasm: "+e),ke(e)}))}if(v||we(),p.instantiateWasm)try{return p.instantiateWasm(e,t)}catch(e){return R("Module.instantiateWasm callback failed with error: "+e),!1}return(E||"function"!=typeof WebAssembly.instantiateStreaming||ye(Ce)||Ie(Ce)||"function"!=typeof fetch?s(n):fetch(Ce,{credentials:"same-origin"}).then((function(t){return WebAssembly.instantiateStreaming(t,e).then(n,(function(e){return R("wasm streaming compile failed: "+e),R("falling back to ArrayBuffer instantiation"),s(n)}))}))).catch(f),{}}ye(Ce)||(Ce=T(Ce));var Ee={9832:function(){throw"Canceled!"},9850:function(e,t){setTimeout((function(){Zt(e,t)}),0)}};function Ae(){Be.initRuntime()}function Re(e){for(;e.length>0;){var t=e.shift();if("function"!=typeof t){var n=t.func;"number"==typeof n?void 0===t.arg?ne.get(n)():ne.get(n)(t.arg):n(void 0===t.arg?null:t.arg)}else t(p)}}function Fe(e,n){if(e<=0||e>t().length||!0&e||n<0)return-28;if(0==n)return 0;n>=2147483647&&(n=1/0);var s=Atomics.load(d(),un>>2),o=0;if(s==e&&Atomics.compareExchange(d(),un>>2,s,0)==s&&(o=1,--n<=0))return 1;var r=Atomics.notify(d(),e>>2,n);if(r>=0)return r+o;throw"Atomics.notify returned an unexpected value "+r}function $e(e){if(v)throw"Internal Error! killThread() can only ever be called from main application thread!";if(!e)throw"Internal Error! Null pthread_ptr in killThread!";d()[e+12>>2]=0;var t=Be.pthreads[e];t.worker.terminate(),Be.freeThreadData(t),Be.runningWorkers.splice(Be.runningWorkers.indexOf(t.worker),1),t.worker.pthread=void 0}function Me(e){if(v)throw"Internal Error! cancelThread() can only ever be called from main application thread!";if(!e)throw"Internal Error! Null pthread_ptr in cancelThread!";Be.pthreads[e].worker.postMessage({cmd:"cancel"})}function De(e){if(v)throw"Internal Error! cleanupThread() can only ever be called from main application thread!";if(!e)throw"Internal Error! Null pthread_ptr in cleanupThread!";var t=Be.pthreads[e];if(t){d()[e+12>>2]=0;var n=t.worker;Be.returnWorkerToPool(n)}}p._emscripten_futex_wake=Fe;var Pe,Be={unusedWorkers:[],runningWorkers:[],initMainThreadBlock:function(){for(var e=Math.min(4,Math.max(1,(navigator.hardwareConcurrency||1)/2)),t=0;t>2]=e;var n=e+152;d()[n>>2]=n;var s=Wt(512);for(t=0;t<128;++t)u()[s/4+t]=0;Atomics.store(u(),e+100>>2,s),Atomics.store(u(),e+40>>2,e),tn(e,!w,1),Yt(e)},initWorker:function(){},pthreads:{},threadExitHandlers:[],setThreadStatus:function(){},runExitHandlers:function(){for(;Be.threadExitHandlers.length>0;)Be.threadExitHandlers.pop()();v&&Ht()&&Kt()},runExitHandlersAndDeinitThread:function(e,t){Atomics.store(u(),e+56>>2,1),Atomics.store(u(),e+60>>2,0),Be.runExitHandlers(),Atomics.store(u(),e+4>>2,t),Atomics.store(u(),e+0>>2,1),Fe(e+0,2147483647),tn(0,0,0)},threadExit:function(e){var t=Ht();t&&(Be.runExitHandlersAndDeinitThread(t,e),v&&postMessage({cmd:"exit"}))},threadCancel:function(){Be.runExitHandlersAndDeinitThread(Ht(),-1),postMessage({cmd:"cancelDone"})},terminateAllThreads:function(){for(var e in Be.pthreads)(s=Be.pthreads[e])&&s.worker&&Be.returnWorkerToPool(s.worker);Be.pthreads={};for(var t=0;t>2];d()[e.threadInfoStruct+100>>2]=0,Ut(t),Ut(e.threadInfoStruct)}e.threadInfoStruct=0,e.allocatedOwnStack&&e.stackBase&&Ut(e.stackBase),e.stackBase=0,e.worker&&(e.worker.pthread=null)}},returnWorkerToPool:function(e){Be.runWithoutMainThreadQueuedCalls((function(){delete Be.pthreads[e.pthread.threadInfoStruct],Be.unusedWorkers.push(e),Be.runningWorkers.splice(Be.runningWorkers.indexOf(e),1),Be.freeThreadData(e.pthread),e.pthread=void 0}))},runWithoutMainThreadQueuedCalls:function(e){d()[dn>>2]=0;try{e()}finally{d()[dn>>2]=1}},receiveObjectTransfer:function(e){},loadWasmModuleToWorker:function(e,t){e.onmessage=function(n){var s=n.data,o=s.cmd;if(e.pthread&&(Be.currentProxiedOperationCallerThread=e.pthread.threadInfoStruct),s.targetThread&&s.targetThread!=Ht()){var r=Be.pthreads[s.targetThread];return r?r.worker.postMessage(n.data,s.transferList):console.error('Internal error! Worker sent a message "'+o+'" to target pthread '+s.targetThread+", but that thread no longer exists!"),void(Be.currentProxiedOperationCallerThread=void 0)}if("processQueuedMainThreadWork"===o)Xt();else if("spawnThread"===o)Mt(n.data);else if("cleanupThread"===o)De(s.thread);else if("killThread"===o)$e(s.thread);else if("cancelThread"===o)Me(s.thread);else if("loaded"===o)e.loaded=!0,t&&t(e),e.runPthread&&(e.runPthread(),delete e.runPthread);else if("print"===o)A("Thread "+s.threadId+": "+s.text);else if("printErr"===o)R("Thread "+s.threadId+": "+s.text);else if("alert"===o)alert("Thread "+s.threadId+": "+s.text);else if("exit"===o)e.pthread&&Atomics.load(u(),e.pthread.threadInfoStruct+64>>2)&&Be.returnWorkerToPool(e);else if("exitProcess"===o)try{fn(s.returnCode)}catch(n){if(n instanceof ln)return;throw n}else"cancelDone"===o?Be.returnWorkerToPool(e):"objectTransfer"===o?Be.receiveObjectTransfer(n.data):"setimmediate"===n.data.target?e.postMessage(n.data):R("worker sent an unknown command "+o);Be.currentProxiedOperationCallerThread=void 0},e.onerror=function(e){R("pthread sent an error! "+e.filename+":"+e.lineno+": "+e.message)},_&&(e.on("message",(function(t){e.onmessage({data:t})})),e.on("error",(function(t){e.onerror(t)})),e.on("exit",(function(e){}))),e.postMessage({cmd:"load",urlOrBlob:p.mainScriptUrlOrBlob||i,wasmMemory:F,wasmModule:$})},allocateUnusedWorker:function(){var e=T("tfjs-backend-wasm-threaded-simd.worker.js");Be.unusedWorkers.push(new Worker(e))},getNewWorker:function(){return 0==Be.unusedWorkers.length&&(Be.allocateUnusedWorker(),Be.loadWasmModuleToWorker(Be.unusedWorkers[0])),Be.unusedWorkers.length>0?Be.unusedWorkers.pop():null},busySpinWait:function(e){for(var t=performance.now()+e;performance.now()>2]=e,e}function qe(e,t){if(v)return et(1,1,e,t)}function He(e,t){if(e==t)postMessage({cmd:"processQueuedMainThreadWork"});else if(v)postMessage({targetThread:e,cmd:"processThreadQueue"});else{var n=Be.pthreads[e],s=n&&n.worker;if(!s)return;s.postMessage({cmd:"processThreadQueue"})}return 1}function Ke(){ke()}function Xe(e,t,n){var s=st(t,n);return Ee[e].apply(null,s)}function Ye(e,t){}function Ze(e,n,s){if(e<=0||e>t().length||!0&e)return-28;if(g){if(Atomics.load(d(),e>>2)!=n)return-6;var o=performance.now(),r=o+s;for(Atomics.exchange(d(),un>>2,e);;){if((o=performance.now())>r)return Atomics.exchange(d(),un>>2,0),-73;if(0==Atomics.exchange(d(),un>>2,0))break;if(Xt(),Atomics.load(d(),e>>2)!=n)return-6;Atomics.exchange(d(),un>>2,e)}return 0}var i=Atomics.wait(d(),e>>2,n,s);if("timed-out"===i)return-73;if("not-equal"===i)return-6;if("ok"===i)return 0;throw"Atomics.wait returned an unexpected value "+i}function Qe(e,t,n){a().copyWithin(e,t,t+n)}function Je(){return _?n(/*! os */8).cpus().length:navigator.hardwareConcurrency}function et(e,t){for(var n=arguments.length-2,s=nn(),o=n,r=on(8*o),i=r>>3,a=0;a>=2;n=a()[e++];){var s=n<105;s&&1&t&&t++,nt.push(s?l()[t++>>1]:d()[t]),++t}return nt}function ot(e,t,n){tt.length=t;for(var s=n>>3,o=0;o>>16),te(F.buffer),1}catch(e){}}function at(e){var t=rt();if(e<=t)return!1;var n=2147483648;if(e>n)return!1;for(var s=1;s<=4;s*=2){var o=t*(1+.2/s);if(o=Math.min(o,e+100663296),it(Math.min(n,ee(Math.max(e,o),65536))))return!0}return!1}var dt={inEventHandler:0,removeAllEventListeners:function(){for(var e=dt.eventHandlers.length-1;e>=0;--e)dt._removeHandler(e);dt.eventHandlers=[],dt.deferredCalls=[]},registerRemoveEventListeners:function(){dt.removeEventListenersRegistered||(ae.push(dt.removeAllEventListeners),dt.removeEventListenersRegistered=!0)},deferredCalls:[],deferCall:function(e,t,n){function s(e,t){if(e.length!=t.length)return!1;for(var n in e)if(e[n]!=t[n])return!1;return!0}for(var o in dt.deferredCalls){var r=dt.deferredCalls[o];if(r.targetFunction==e&&s(r.argsList,n))return}dt.deferredCalls.push({targetFunction:e,precedence:t,argsList:n}),dt.deferredCalls.sort((function(e,t){return e.precedence>2]=n,d()[i+4>>2]=s,d()[i+8>>2]=o,en(0,e,637534208,t,s,i),sn(r)},getTargetThreadForEventCallback:function(e){switch(e){case 1:return 0;case 2:return Be.currentProxiedOperationCallerThread;default:return e}},getNodeNameForTarget:function(e){return e?e==window?"#window":e==screen?"#screen":e&&e.nodeName?e.nodeName:"":""},fullscreenEnabled:function(){return document.fullscreenEnabled||document.webkitFullscreenEnabled}};function ut(e){var t=Q(e)+1,n=Wt(t);return Z(e,n,t),n}function lt(e,t,n,s){var o=nn(),r=on(12),i=0;t&&(i=ut(t)),d()[r>>2]=i,d()[r+4>>2]=n,d()[r+8>>2]=s,en(0,e,657457152,0,i,r),sn(o)}function ct(e,t,n,s){lt(e,t=t?X(t):"",n,s)}function ft(e){return e>2?X(e):e}var pt=[0,"undefined"!=typeof document?document:0,"undefined"!=typeof window?window:0];function mt(e){return e=ft(e),pt[e]||("undefined"!=typeof document?document.querySelector(e):void 0)}function ht(e){return mt(e)}function bt(e,t,n){var s=ht(e);if(!s)return-4;if(s.canvasSharedPtr&&(d()[s.canvasSharedPtr>>2]=t,d()[s.canvasSharedPtr+4>>2]=n),!s.offscreenCanvas&&s.controlTransferredOffscreen)return s.canvasSharedPtr?(ct(d()[s.canvasSharedPtr+8>>2],e,t,n),1):-4;s.offscreenCanvas&&(s=s.offscreenCanvas);var o=!1;if(s.GLctxObject&&s.GLctxObject.GLctx){var r=s.GLctxObject.GLctx.getParameter(2978);o=0===r[0]&&0===r[1]&&r[2]===s.width&&r[3]===s.height}return s.width=t,s.height=n,o&&s.GLctxObject.GLctx.viewport(0,0,t,n),0}function jt(e,t,n){return v?et(2,1,e,t,n):bt(e,t,n)}function gt(e,t,n){return ht(e)?bt(e,t,n):jt(e,t,n)}function wt(e){}function _t(e,t){}function kt(e){var t=e.getExtension("ANGLE_instanced_arrays");if(t)return e.vertexAttribDivisor=function(e,n){t.vertexAttribDivisorANGLE(e,n)},e.drawArraysInstanced=function(e,n,s,o){t.drawArraysInstancedANGLE(e,n,s,o)},e.drawElementsInstanced=function(e,n,s,o,r){t.drawElementsInstancedANGLE(e,n,s,o,r)},1}function vt(e){var t=e.getExtension("OES_vertex_array_object");if(t)return e.createVertexArray=function(){return t.createVertexArrayOES()},e.deleteVertexArray=function(e){t.deleteVertexArrayOES(e)},e.bindVertexArray=function(e){t.bindVertexArrayOES(e)},e.isVertexArray=function(e){return t.isVertexArrayOES(e)},1}function xt(e){var t=e.getExtension("WEBGL_draw_buffers");if(t)return e.drawBuffers=function(e,n){t.drawBuffersWEBGL(e,n)},1}function yt(e){return!!(e.multiDrawWebgl=e.getExtension("WEBGL_multi_draw"))}var Ot={counter:1,buffers:[],programs:[],framebuffers:[],renderbuffers:[],textures:[],uniforms:[],shaders:[],vaos:[],contexts:{},offscreenCanvases:{},timerQueriesEXT:[],programInfos:{},stringCache:{},unpackAlignment:4,recordError:function(e){Ot.lastError||(Ot.lastError=e)},getNewId:function(e){for(var t=Ot.counter++,n=e.length;n>2]:-1;o+=X(d()[n+4*r>>2],i<0?void 0:i)}return o},createContext:function(e,t){var n=e.getContext("webgl",t);return n?Ot.registerContext(n,t):0},registerContext:function(e,t){var n=Wt(8);d()[n+4>>2]=Ht();var s={handle:n,attributes:t,version:t.majorVersion,GLctx:e};return e.canvas&&(e.canvas.GLctxObject=s),Ot.contexts[n]=s,("undefined"==typeof t.enableExtensionsByDefault||t.enableExtensionsByDefault)&&Ot.initExtensions(s),n},makeContextCurrent:function(e){return Ot.currentContext=Ot.contexts[e],p.ctx=Tt=Ot.currentContext&&Ot.currentContext.GLctx,!(e&&!Tt)},getContext:function(e){return Ot.contexts[e]},deleteContext:function(e){Ot.currentContext===Ot.contexts[e]&&(Ot.currentContext=null),"object"==typeof dt&&dt.removeAllHandlersOnTarget(Ot.contexts[e].GLctx.canvas),Ot.contexts[e]&&Ot.contexts[e].GLctx.canvas&&(Ot.contexts[e].GLctx.canvas.GLctxObject=void 0),Ut(Ot.contexts[e].handle),Ot.contexts[e]=null},initExtensions:function(e){if(e||(e=Ot.currentContext),!e.initExtensionsDone){e.initExtensionsDone=!0;var t=e.GLctx;kt(t),vt(t),xt(t),t.disjointTimerQueryExt=t.getExtension("EXT_disjoint_timer_query"),yt(t),(t.getSupportedExtensions()||[]).forEach((function(e){e.indexOf("lose_context")<0&&e.indexOf("debug")<0&&t.getExtension(e)}))}},populateUniformTable:function(e){for(var t=Ot.programs[e],n=Ot.programInfos[e]={uniforms:{},maxUniformLength:0,maxAttributeLength:-1,maxUniformBlockNameLength:-1},s=n.uniforms,o=Tt.getProgramParameter(t,35718),r=0;r>2,s=d()[n+6],o={alpha:!!d()[n+0],depth:!!d()[n+1],stencil:!!d()[n+2],antialias:!!d()[n+3],premultipliedAlpha:!!d()[n+4],preserveDrawingBuffer:!!d()[n+5],powerPreference:It[s],failIfMajorPerformanceCaveat:!!d()[n+7],majorVersion:d()[n+8],minorVersion:d()[n+9],enableExtensionsByDefault:d()[n+10],explicitSwapControl:d()[n+11],proxyContextToMainThread:d()[n+12],renderViaOffscreenBackBuffer:d()[n+13]},r=ht(e);return r?o.explicitSwapControl?0:Ot.createContext(r,o):0}function St(e,t){return Ct(e,t)}var Tt,Nt={mappings:{},buffers:[null,[],[]],printChar:function(e,t){var n=Nt.buffers[e];0===t||10===t?((1===e?A:R)(K(n,0)),n.length=0):n.push(t)},varargs:void 0,get:function(){return Nt.varargs+=4,d()[Nt.varargs-4>>2]},getStr:function(e){return X(e)},get64:function(e,t){return e}};function Et(e){return v?et(3,1,e):0}function At(e,t,n,s,o){if(v)return et(4,1,e,t,n,s,o)}function Rt(e,t,n,s){if(v)return et(5,1,e,t,n,s);for(var o=0,r=0;r>2],u=d()[t+(8*r+4)>>2],l=0;l>2]=o,0}function Ft(e){var t=Be.threadExitHandlers.pop();e&&t()}function $t(e,t){Be.threadExitHandlers.push((function(){ne.get(e)(t)}))}function Mt(e){if(v)throw"Internal Error! spawnThread() can only ever be called from main application thread!";var t=Be.getNewWorker();if(void 0!==t.pthread)throw"Internal error!";if(!e.pthread_ptr)throw"Internal error, no pthread ptr!";Be.runningWorkers.push(t);for(var n=Wt(512),s=0;s<128;++s)d()[n+4*s>>2]=0;var o=e.stackBase+e.stackSize,r=Be.pthreads[e.pthread_ptr]={worker:t,stackBase:e.stackBase,stackSize:e.stackSize,allocatedOwnStack:e.allocatedOwnStack,threadInfoStruct:e.pthread_ptr},i=r.threadInfoStruct>>2;Atomics.store(u(),i+16,e.detached),Atomics.store(u(),i+25,n),Atomics.store(u(),i+10,r.threadInfoStruct),Atomics.store(u(),i+20,e.stackSize),Atomics.store(u(),i+19,o),Atomics.store(u(),i+26,e.stackSize),Atomics.store(u(),i+28,o),Atomics.store(u(),i+29,e.detached);var a=qt()+40;Atomics.store(u(),i+43,a),t.pthread=r;var l={cmd:"run",start_routine:e.startRoutine,arg:e.arg,threadInfoStruct:e.pthread_ptr,stackBase:e.stackBase,stackSize:e.stackSize};t.runPthread=function(){l.time=performance.now(),t.postMessage(l,e.transferList)},t.loaded&&(t.runPthread(),delete t.runPthread)}function Dt(e,t,n,s){if("undefined"==typeof SharedArrayBuffer)return R("Current environment does not support SharedArrayBuffer, pthreads are not available!"),6;if(!e)return R("pthread_create called with a null thread pointer!"),28;var o=[];if(v&&0===o.length)return Qt(687865856,e,t,n,s);var r=0,i=0,a=0;t&&-1!=t?(r=d()[t>>2],r+=81920,i=d()[t+8>>2],a=0!==d()[t+12>>2]):r=2097152;var l=0==i;l?i=an(16,r):U((i-=r)>0);for(var c=Wt(228),f=0;f<57;++f)u()[(c>>2)+f]=0;d()[e>>2]=c,d()[c+12>>2]=c;var p=c+152;d()[p>>2]=p;var m={stackBase:i,stackSize:r,allocatedOwnStack:l,detached:a,startRoutine:n,pthread_ptr:c,arg:s,transferList:o};return v?(m.cmd="spawnThread",postMessage(m,o)):Mt(m),0}function Pt(e){if(v)return et(6,1,e);switch(e){case 30:return 16384;case 85:return 131072;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:case 80:case 81:case 79:return-1;case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 75:return 16384;case 39:return 1e3;case 89:return 700;case 71:return 256;case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:return"object"==typeof navigator&&navigator.hardwareConcurrency||1}return Ve(28),-1}v||Be.initMainThreadBlock();var Bt,Lt=[null,qe,jt,Et,At,Rt,Pt],zt={e:We,r:Ue,x:He,b:Ke,y:Xe,j:Ye,c:Ze,d:Fe,f:Pe,p:Qe,z:Je,u:ot,q:at,v:gt,i:wt,t:_t,w:St,m:Et,n:At,g:Rt,o:Ae,a:F||p.wasmMemory,k:Ft,l:$t,h:Dt,s:Pt},Gt=(Ne(),p.___wasm_call_ctors=function(){return(Gt=p.___wasm_call_ctors=p.asm.A).apply(null,arguments)}),Wt=(p._init=function(){return(p._init=p.asm.B).apply(null,arguments)},p._register_tensor=function(){return(p._register_tensor=p.asm.C).apply(null,arguments)},p._dispose_data=function(){return(p._dispose_data=p.asm.D).apply(null,arguments)},p._dispose=function(){return(p._dispose=p.asm.E).apply(null,arguments)},p._Abs=function(){return(p._Abs=p.asm.G).apply(null,arguments)},p._Add=function(){return(p._Add=p.asm.H).apply(null,arguments)},p._AddN=function(){return(p._AddN=p.asm.I).apply(null,arguments)},p._All=function(){return(p._All=p.asm.J).apply(null,arguments)},p._Any=function(){return(p._Any=p.asm.K).apply(null,arguments)},p._ArgMax=function(){return(p._ArgMax=p.asm.L).apply(null,arguments)},p._AvgPool=function(){return(p._AvgPool=p.asm.M).apply(null,arguments)},p._BatchMatMul=function(){return(p._BatchMatMul=p.asm.N).apply(null,arguments)},p._Ceil=function(){return(p._Ceil=p.asm.O).apply(null,arguments)},p._ClipByValue=function(){return(p._ClipByValue=p.asm.P).apply(null,arguments)},p._Conv2D=function(){return(p._Conv2D=p.asm.Q).apply(null,arguments)},p._Conv2DBackpropInput=function(){return(p._Conv2DBackpropInput=p.asm.R).apply(null,arguments)},p._Cos=function(){return(p._Cos=p.asm.S).apply(null,arguments)},p._Cosh=function(){return(p._Cosh=p.asm.T).apply(null,arguments)},p._CropAndResize=function(){return(p._CropAndResize=p.asm.U).apply(null,arguments)},p._Cumsum=function(){return(p._Cumsum=p.asm.V).apply(null,arguments)},p._DepthToSpace=function(){return(p._DepthToSpace=p.asm.W).apply(null,arguments)},p._DepthwiseConv2dNative=function(){return(p._DepthwiseConv2dNative=p.asm.X).apply(null,arguments)},p._Equal=function(){return(p._Equal=p.asm.Y).apply(null,arguments)},p._Exp=function(){return(p._Exp=p.asm.Z).apply(null,arguments)},p._FlipLeftRight=function(){return(p._FlipLeftRight=p.asm._).apply(null,arguments)},p._Floor=function(){return(p._Floor=p.asm.$).apply(null,arguments)},p._FloorDiv=function(){return(p._FloorDiv=p.asm.aa).apply(null,arguments)},p._FusedBatchNorm=function(){return(p._FusedBatchNorm=p.asm.ba).apply(null,arguments)},p._FusedConv2D=function(){return(p._FusedConv2D=p.asm.ca).apply(null,arguments)},p._FusedDepthwiseConv2D=function(){return(p._FusedDepthwiseConv2D=p.asm.da).apply(null,arguments)},p._Gather=function(){return(p._Gather=p.asm.ea).apply(null,arguments)},p._GatherNd=function(){return(p._GatherNd=p.asm.fa).apply(null,arguments)},p._Greater=function(){return(p._Greater=p.asm.ga).apply(null,arguments)},p._GreaterEqual=function(){return(p._GreaterEqual=p.asm.ha).apply(null,arguments)},p._LeakyRelu=function(){return(p._LeakyRelu=p.asm.ia).apply(null,arguments)},p._Less=function(){return(p._Less=p.asm.ja).apply(null,arguments)},p._LessEqual=function(){return(p._LessEqual=p.asm.ka).apply(null,arguments)},p._Log=function(){return(p._Log=p.asm.la).apply(null,arguments)},p._LogicalAnd=function(){return(p._LogicalAnd=p.asm.ma).apply(null,arguments)},p._Max=function(){return(p._Max=p.asm.na).apply(null,arguments)},p._MaxPool=function(){return(p._MaxPool=p.asm.oa).apply(null,arguments)},p._Maximum=function(){return(p._Maximum=p.asm.pa).apply(null,arguments)},p._Mean=function(){return(p._Mean=p.asm.qa).apply(null,arguments)},p._Min=function(){return(p._Min=p.asm.ra).apply(null,arguments)},p._Minimum=function(){return(p._Minimum=p.asm.sa).apply(null,arguments)},p._MirrorPad=function(){return(p._MirrorPad=p.asm.ta).apply(null,arguments)},p._Multiply=function(){return(p._Multiply=p.asm.ua).apply(null,arguments)},p._Neg=function(){return(p._Neg=p.asm.va).apply(null,arguments)},p._NonMaxSuppressionV3=function(){return(p._NonMaxSuppressionV3=p.asm.wa).apply(null,arguments)},p._NonMaxSuppressionV4=function(){return(p._NonMaxSuppressionV4=p.asm.xa).apply(null,arguments)},p._NonMaxSuppressionV5=function(){return(p._NonMaxSuppressionV5=p.asm.ya).apply(null,arguments)},p._NotEqual=function(){return(p._NotEqual=p.asm.za).apply(null,arguments)},p._OneHot=function(){return(p._OneHot=p.asm.Aa).apply(null,arguments)},p._PadV2=function(){return(p._PadV2=p.asm.Ba).apply(null,arguments)},p._Pow=function(){return(p._Pow=p.asm.Ca).apply(null,arguments)},p._Prelu=function(){return(p._Prelu=p.asm.Da).apply(null,arguments)},p._Prod=function(){return(p._Prod=p.asm.Ea).apply(null,arguments)},p._RealDiv=function(){return(p._RealDiv=p.asm.Fa).apply(null,arguments)},p._Relu=function(){return(p._Relu=p.asm.Ga).apply(null,arguments)},p._Relu6=function(){return(p._Relu6=p.asm.Ha).apply(null,arguments)},p._ResizeBilinear=function(){return(p._ResizeBilinear=p.asm.Ia).apply(null,arguments)},p._Reverse=function(){return(p._Reverse=p.asm.Ja).apply(null,arguments)},p._RotateWithOffset=function(){return(p._RotateWithOffset=p.asm.Ka).apply(null,arguments)},p._Round=function(){return(p._Round=p.asm.La).apply(null,arguments)},p._Rsqrt=function(){return(p._Rsqrt=p.asm.Ma).apply(null,arguments)},p._ScatterNd=function(){return(p._ScatterNd=p.asm.Na).apply(null,arguments)},p._SelectV2=function(){return(p._SelectV2=p.asm.Oa).apply(null,arguments)},p._Sigmoid=function(){return(p._Sigmoid=p.asm.Pa).apply(null,arguments)},p._Sin=function(){return(p._Sin=p.asm.Qa).apply(null,arguments)},p._Softmax=function(){return(p._Softmax=p.asm.Ra).apply(null,arguments)},p._Sqrt=function(){return(p._Sqrt=p.asm.Sa).apply(null,arguments)},p._Square=function(){return(p._Square=p.asm.Ta).apply(null,arguments)},p._SquaredDifference=function(){return(p._SquaredDifference=p.asm.Ua).apply(null,arguments)},p._Step=function(){return(p._Step=p.asm.Va).apply(null,arguments)},p._StridedSlice=function(){return(p._StridedSlice=p.asm.Wa).apply(null,arguments)},p._Sub=function(){return(p._Sub=p.asm.Xa).apply(null,arguments)},p._Sum=function(){return(p._Sum=p.asm.Ya).apply(null,arguments)},p._Tan=function(){return(p._Tan=p.asm.Za).apply(null,arguments)},p._Tanh=function(){return(p._Tanh=p.asm._a).apply(null,arguments)},p._Tile=function(){return(p._Tile=p.asm.$a).apply(null,arguments)},p._TopK=function(){return(p._TopK=p.asm.ab).apply(null,arguments)},p._Transform=function(){return(p._Transform=p.asm.bb).apply(null,arguments)},p._Transpose=function(){return(p._Transpose=p.asm.cb).apply(null,arguments)},p.__FusedMatMul=function(){return(p.__FusedMatMul=p.asm.db).apply(null,arguments)},p._malloc=function(){return(Wt=p._malloc=p.asm.eb).apply(null,arguments)}),Ut=p._free=function(){return(Ut=p._free=p.asm.fb).apply(null,arguments)},Vt=p.___errno_location=function(){return(Vt=p.___errno_location=p.asm.gb).apply(null,arguments)},qt=p._emscripten_get_global_libc=function(){return(qt=p._emscripten_get_global_libc=p.asm.hb).apply(null,arguments)},Ht=p._pthread_self=function(){return(Ht=p._pthread_self=p.asm.ib).apply(null,arguments)},Kt=p.___pthread_tsd_run_dtors=function(){return(Kt=p.___pthread_tsd_run_dtors=p.asm.jb).apply(null,arguments)},Xt=p._emscripten_main_thread_process_queued_calls=function(){return(Xt=p._emscripten_main_thread_process_queued_calls=p.asm.kb).apply(null,arguments)},Yt=(p._emscripten_current_thread_process_queued_calls=function(){return(p._emscripten_current_thread_process_queued_calls=p.asm.lb).apply(null,arguments)},p._emscripten_register_main_browser_thread_id=function(){return(Yt=p._emscripten_register_main_browser_thread_id=p.asm.mb).apply(null,arguments)}),Zt=p.__emscripten_do_dispatch_to_thread=function(){return(Zt=p.__emscripten_do_dispatch_to_thread=p.asm.nb).apply(null,arguments)},Qt=p._emscripten_sync_run_in_main_thread_4=function(){return(Qt=p._emscripten_sync_run_in_main_thread_4=p.asm.ob).apply(null,arguments)},Jt=p._emscripten_run_in_main_runtime_thread_js=function(){return(Jt=p._emscripten_run_in_main_runtime_thread_js=p.asm.pb).apply(null,arguments)},en=p.__emscripten_call_on_thread=function(){return(en=p.__emscripten_call_on_thread=p.asm.qb).apply(null,arguments)},tn=(p._emscripten_tls_init=function(){return(p._emscripten_tls_init=p.asm.rb).apply(null,arguments)},p.__emscripten_thread_init=function(){return(tn=p.__emscripten_thread_init=p.asm.sb).apply(null,arguments)}),nn=p.stackSave=function(){return(nn=p.stackSave=p.asm.tb).apply(null,arguments)},sn=p.stackRestore=function(){return(sn=p.stackRestore=p.asm.ub).apply(null,arguments)},on=p.stackAlloc=function(){return(on=p.stackAlloc=p.asm.vb).apply(null,arguments)},rn=p._emscripten_stack_set_limits=function(){return(rn=p._emscripten_stack_set_limits=p.asm.wb).apply(null,arguments)},an=p._memalign=function(){return(an=p._memalign=p.asm.xb).apply(null,arguments)},dn=p.__emscripten_allow_main_runtime_queued_calls=9824,un=p.__emscripten_main_thread_futex=11448;function ln(e){this.name="ExitStatus",this.message="Program terminated with exit("+e+")",this.status=e}function cn(e){if(e=e||b,!(be>0)){if(v)return c(p),le(),void postMessage({cmd:"loaded"});ue(),be>0||(p.setStatus?(p.setStatus("Running..."),setTimeout((function(){setTimeout((function(){p.setStatus("")}),1),t()}),1)):t())}function t(){Bt||(Bt=!0,p.calledRun=!0,W||(le(),ce(),c(p),p.onRuntimeInitialized&&p.onRuntimeInitialized(),pe()))}}function fn(e,t){if(!t||!M||0!==e){if(!t&&v)throw postMessage({cmd:"exitProcess",returnCode:e}),new ln(e);M||(Be.terminateAllThreads(),fe(),p.onExit&&p.onExit(e),W=!0),j(e,new ln(e))}}if(p.cwrap=H,p.PThread=Be,p.PThread=Be,p.wasmMemory=F,p.ExitStatus=ln,ge=function e(){Bt||cn(),Bt||(ge=e)},p.run=cn,p.preInit)for("function"==typeof p.preInit&&(p.preInit=[p.preInit]);p.preInit.length>0;)p.preInit.pop()();return v&&(M=!1,Be.initWorker()),cn(),e.ready});e.exports=a}).call(this,"/index.js",n(/*! ./../../../process/browser.js */"./node_modules/process/browser.js"),"/",n(/*! ./../../../webpack/buildin/global.js */"./node_modules/webpack/buildin/global.js"))},"./node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm-threaded-simd.worker.js": +/*!*******************************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm-threaded-simd.worker.js ***! + \*******************************************************************************************************/ +/*! exports provided: wasmWorkerContents */function(e,t,n){"use strict";n.r(t),n.d(t,"wasmWorkerContents",(function(){return s}));const s='var Module={};function threadPrintErr(){var text=Array.prototype.slice.call(arguments).join(" ");console.error(text)}function threadAlert(){var text=Array.prototype.slice.call(arguments).join(" ");postMessage({cmd:"alert",text:text,threadId:Module["_pthread_self"]()})}var err=threadPrintErr;this.alert=threadAlert;Module["instantiateWasm"]=function(info,receiveInstance){var instance=new WebAssembly.Instance(Module["wasmModule"],info);Module["wasmModule"]=null;receiveInstance(instance);return instance.exports};function moduleLoaded(){}this.onmessage=function(e){try{if(e.data.cmd==="load"){Module["wasmModule"]=e.data.wasmModule;Module["wasmMemory"]=e.data.wasmMemory;Module["buffer"]=Module["wasmMemory"].buffer;Module["ENVIRONMENT_IS_PTHREAD"]=true;if(typeof e.data.urlOrBlob==="string"){importScripts(e.data.urlOrBlob)}else{var objectUrl=URL.createObjectURL(e.data.urlOrBlob);importScripts(objectUrl);URL.revokeObjectURL(objectUrl)}WasmBackendModuleThreadedSimd(Module).then(function(instance){Module=instance;moduleLoaded()})}else if(e.data.cmd==="objectTransfer"){Module["PThread"].receiveObjectTransfer(e.data)}else if(e.data.cmd==="run"){Module["__performance_now_clock_drift"]=performance.now()-e.data.time;Module["__emscripten_thread_init"](e.data.threadInfoStruct,0,0);var max=e.data.stackBase;var top=e.data.stackBase+e.data.stackSize;Module["establishStackSpace"](top,max);Module["_emscripten_tls_init"]();Module["PThread"].receiveObjectTransfer(e.data);Module["PThread"].setThreadStatus(Module["_pthread_self"](),1);try{var result=Module["invokeEntryPoint"](e.data.start_routine,e.data.arg);if(!Module["getNoExitRuntime"]())Module["PThread"].threadExit(result)}catch(ex){if(ex==="Canceled!"){Module["PThread"].threadCancel()}else if(ex!="unwind"){if(ex instanceof Module["ExitStatus"]){if(Module["getNoExitRuntime"]()){}else{Module["PThread"].threadExit(ex.status)}}else{Module["PThread"].threadExit(-2);throw ex}}}}else if(e.data.cmd==="cancel"){if(Module["_pthread_self"]()){Module["PThread"].threadCancel()}}else if(e.data.target==="setimmediate"){}else if(e.data.cmd==="processThreadQueue"){if(Module["_pthread_self"]()){Module["_emscripten_current_thread_process_queued_calls"]()}}else{err("worker.js received unknown command "+e.data.cmd);err(e.data)}}catch(ex){err("worker.js onmessage() captured an uncaught exception: "+ex);if(ex&&ex.stack)err(ex.stack);throw ex}};if(typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string"){self={location:{href:__filename}};var onmessage=this.onmessage;var nodeWorkerThreads=require("worker_threads");global.Worker=nodeWorkerThreads.Worker;var parentPort=nodeWorkerThreads.parentPort;parentPort.on("message",function(data){onmessage({data:data})});var nodeFS=require("fs");var nodeRead=function(filename){return nodeFS.readFileSync(filename,"utf8")};function globalEval(x){global.require=require;global.Module=Module;eval.call(null,x)}importScripts=function(f){globalEval(nodeRead(f))};postMessage=function(msg){parentPort.postMessage(msg)};if(typeof performance==="undefined"){performance={now:function(){return Date.now()}}}}'},"./node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm.js ***! + \**********************************************************************************/ +/*! no static exports found */function(e,t,n){(function(t,s,o){var r,i=(r=(r="undefined"!=typeof document&&document.currentScript?document.currentScript.src:void 0)||t,function(e){var t,i,a="undefined"!=typeof(e=e||{})?e:{};a.ready=new Promise((function(e,n){t=e,i=n}));var d,u={};for(d in a)a.hasOwnProperty(d)&&(u[d]=a[d]);var l=[],c=!1,f=!1,p=!1,m=!1;c="object"==typeof window,f="function"==typeof importScripts,p="object"==typeof s&&"object"==typeof s.versions&&"string"==typeof s.versions.node,m=!c&&!p&&!f;var h,b,j,g,w,_="";function k(e){return a.locateFile?a.locateFile(e,_):_+e}p?(_=f?n(/*! path */4).dirname(_)+"/":o+"/",h=function(e,t){return g||(g=n(/*! fs */5)),w||(w=n(/*! path */4)),e=w.normalize(e),g.readFileSync(e,t?null:"utf8")},j=function(e){var t=h(e,!0);return t.buffer||(t=new Uint8Array(t)),C(t.buffer),t},s.argv.length>1&&s.argv[1].replace(/\\/g,"/"),l=s.argv.slice(2),s.on("uncaughtException",(function(e){if(!(e instanceof $e))throw e})),s.on("unhandledRejection",re),a.inspect=function(){return"[Emscripten Module object]"}):m?("undefined"!=typeof read&&(h=function(e){return read(e)}),j=function(e){var t;return"function"==typeof readbuffer?new Uint8Array(readbuffer(e)):(C("object"==typeof(t=read(e,"binary"))),t)},"undefined"!=typeof scriptArgs?l=scriptArgs:"undefined"!=typeof arguments&&(l=arguments),"undefined"!=typeof print&&("undefined"==typeof console&&(console={}),console.log=print,console.warn=console.error="undefined"!=typeof printErr?printErr:print)):(c||f)&&(f?_=self.location.href:"undefined"!=typeof document&&document.currentScript&&(_=document.currentScript.src),r&&(_=r),_=0!==_.indexOf("blob:")?_.substr(0,_.lastIndexOf("/")+1):"",h=function(e){var t=new XMLHttpRequest;return t.open("GET",e,!1),t.send(null),t.responseText},f&&(j=function(e){var t=new XMLHttpRequest;return t.open("GET",e,!1),t.responseType="arraybuffer",t.send(null),new Uint8Array(t.response)}),b=function(e,t,n){var s=new XMLHttpRequest;s.open("GET",e,!0),s.responseType="arraybuffer",s.onload=function(){200==s.status||0==s.status&&s.response?t(s.response):n()},s.onerror=n,s.send(null)});var v,x,y=a.print||console.log.bind(console),O=a.printErr||console.warn.bind(console);for(d in u)u.hasOwnProperty(d)&&(a[d]=u[d]);u=null,a.arguments&&(l=a.arguments),a.thisProgram&&a.thisProgram,a.quit&&a.quit,a.wasmBinary&&(v=a.wasmBinary),a.noExitRuntime,"object"!=typeof WebAssembly&&re("no native wasm support detected");var I=!1;function C(e,t){e||re("Assertion failed: "+t)}function S(e){var t=a["_"+e];return C(t,"Cannot call unknown function "+e+", make sure it is exported"),t}function T(e,t,n,s,o){var r={string:function(e){var t=0;if(null!=e&&0!==e){var n=1+(e.length<<2);B(e,t=Fe(n),n)}return t},array:function(e){var t=Fe(e.length);return L(e,t),t}},i=S(e),a=[],d=0;if(s)for(var u=0;u=s);)++o;if(o-t>16&&e.subarray&&$)return $.decode(e.subarray(t,o));for(var r="";t>10,56320|1023&u)}}else r+=String.fromCharCode((31&i)<<6|a)}else r+=String.fromCharCode(i)}return r}function D(e,t){return e?M(R,e,t):""}function P(e,t,n,s){if(!(s>0))return 0;for(var o=n,r=n+s-1,i=0;i=55296&&a<=57343&&(a=65536+((1023&a)<<10)|1023&e.charCodeAt(++i)),a<=127){if(n>=r)break;t[n++]=a}else if(a<=2047){if(n+1>=r)break;t[n++]=192|a>>6,t[n++]=128|63&a}else if(a<=65535){if(n+2>=r)break;t[n++]=224|a>>12,t[n++]=128|a>>6&63,t[n++]=128|63&a}else{if(n+3>=r)break;t[n++]=240|a>>18,t[n++]=128|a>>12&63,t[n++]=128|a>>6&63,t[n++]=128|63&a}}return t[n]=0,n-o}function B(e,t,n){return P(e,R,t,n)}function L(e,t){A.set(e,t)}function z(e,t){return e%t>0&&(e+=t-e%t),e}function G(e){E=e,a.HEAP8=A=new Int8Array(e),a.HEAP16=new Int16Array(e),a.HEAP32=F=new Int32Array(e),a.HEAPU8=R=new Uint8Array(e),a.HEAPU16=new Uint16Array(e),a.HEAPU32=new Uint32Array(e),a.HEAPF32=new Float32Array(e),a.HEAPF64=new Float64Array(e)}a.INITIAL_MEMORY;var W,U=[],V=[],q=[],H=[];function K(){if(a.preRun)for("function"==typeof a.preRun&&(a.preRun=[a.preRun]);a.preRun.length;)Q(a.preRun.shift());he(U)}function X(){he(V)}function Y(){he(q)}function Z(){if(a.postRun)for("function"==typeof a.postRun&&(a.postRun=[a.postRun]);a.postRun.length;)J(a.postRun.shift());he(H)}function Q(e){U.unshift(e)}function J(e){H.unshift(e)}V.push({func:function(){Ne()}});var ee=0,te=null,ne=null;function se(e){ee++,a.monitorRunDependencies&&a.monitorRunDependencies(ee)}function oe(e){if(ee--,a.monitorRunDependencies&&a.monitorRunDependencies(ee),0==ee&&(null!==te&&(clearInterval(te),te=null),ne)){var t=ne;ne=null,t()}}function re(e){a.onAbort&&a.onAbort(e),O(e+=""),I=!0,e="abort("+e+"). Build with -s ASSERTIONS=1 for more info.";var t=new WebAssembly.RuntimeError(e);throw i(t),t}function ie(e,t){return String.prototype.startsWith?e.startsWith(t):0===e.indexOf(t)}a.preloadedImages={},a.preloadedAudios={};var ae="data:application/octet-stream;base64,";function de(e){return ie(e,ae)}var ue="file://";function le(e){return ie(e,ue)}var ce="tfjs-backend-wasm.wasm";function fe(e){try{if(e==ce&&v)return new Uint8Array(v);if(j)return j(e);throw"both async and sync fetching of the wasm failed"}catch(e){re(e)}}function pe(){if(!v&&(c||f)){if("function"==typeof fetch&&!le(ce))return fetch(ce,{credentials:"same-origin"}).then((function(e){if(!e.ok)throw"failed to load wasm binary file at '"+ce+"'";return e.arrayBuffer()})).catch((function(){return fe(ce)}));if(b)return new Promise((function(e,t){b(ce,(function(t){e(new Uint8Array(t))}),t)}))}return Promise.resolve().then((function(){return fe(ce)}))}function me(){var e={a:Te};function t(e,t){var n=e.exports;a.asm=n,G((x=a.asm.i).buffer),W=a.asm.o,oe()}function n(e){t(e.instance)}function s(t){return pe().then((function(t){return WebAssembly.instantiate(t,e)})).then(t,(function(e){O("failed to asynchronously prepare wasm: "+e),re(e)}))}if(se(),a.instantiateWasm)try{return a.instantiateWasm(e,t)}catch(e){return O("Module.instantiateWasm callback failed with error: "+e),!1}return(v||"function"!=typeof WebAssembly.instantiateStreaming||de(ce)||le(ce)||"function"!=typeof fetch?s(n):fetch(ce,{credentials:"same-origin"}).then((function(t){return WebAssembly.instantiateStreaming(t,e).then(n,(function(e){return O("wasm streaming compile failed: "+e),O("falling back to ArrayBuffer instantiation"),s(n)}))}))).catch(i),{}}function he(e){for(;e.length>0;){var t=e.shift();if("function"!=typeof t){var n=t.func;"number"==typeof n?void 0===t.arg?W.get(n)():W.get(n)(t.arg):n(void 0===t.arg?null:t.arg)}else t(a)}}function be(){re()}function je(e,t,n){R.copyWithin(e,t,t+n)}function ge(){return R.length}function we(e){try{return x.grow(e-E.byteLength+65535>>>16),G(x.buffer),1}catch(e){}}function _e(e){var t=ge(),n=2147483648;if(e>n)return!1;for(var s=1;s<=4;s*=2){var o=t*(1+.2/s);if(o=Math.min(o,e+100663296),we(Math.min(n,z(Math.max(e,o),65536))))return!0}return!1}de(ce)||(ce=k(ce));var ke={mappings:{},buffers:[null,[],[]],printChar:function(e,t){var n=ke.buffers[e];0===t||10===t?((1===e?y:O)(M(n,0)),n.length=0):n.push(t)},varargs:void 0,get:function(){return ke.varargs+=4,F[ke.varargs-4>>2]},getStr:function(e){return D(e)},get64:function(e,t){return e}};function ve(e){return 0}function xe(e,t,n,s,o){}function ye(e,t,n,s){for(var o=0,r=0;r>2],a=F[t+(8*r+4)>>2],d=0;d>2]=o,0}function Oe(){return 6}function Ie(e){return F[Ee()>>2]=e,e}function Ce(e){switch(e){case 30:return 16384;case 85:return 131072;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:case 80:case 81:case 79:return-1;case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 75:return 16384;case 39:return 1e3;case 89:return 700;case 71:return 256;case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:return"object"==typeof navigator&&navigator.hardwareConcurrency||1}return Ie(28),-1}var Se,Te={a:be,d:je,e:_e,f:ve,c:xe,b:ye,g:Oe,h:Ce},Ne=(me(),a.___wasm_call_ctors=function(){return(Ne=a.___wasm_call_ctors=a.asm.j).apply(null,arguments)}),Ee=(a._init=function(){return(a._init=a.asm.k).apply(null,arguments)},a._register_tensor=function(){return(a._register_tensor=a.asm.l).apply(null,arguments)},a._dispose_data=function(){return(a._dispose_data=a.asm.m).apply(null,arguments)},a._dispose=function(){return(a._dispose=a.asm.n).apply(null,arguments)},a._Abs=function(){return(a._Abs=a.asm.p).apply(null,arguments)},a._Add=function(){return(a._Add=a.asm.q).apply(null,arguments)},a._AddN=function(){return(a._AddN=a.asm.r).apply(null,arguments)},a._All=function(){return(a._All=a.asm.s).apply(null,arguments)},a._Any=function(){return(a._Any=a.asm.t).apply(null,arguments)},a._ArgMax=function(){return(a._ArgMax=a.asm.u).apply(null,arguments)},a._AvgPool=function(){return(a._AvgPool=a.asm.v).apply(null,arguments)},a._BatchMatMul=function(){return(a._BatchMatMul=a.asm.w).apply(null,arguments)},a._Ceil=function(){return(a._Ceil=a.asm.x).apply(null,arguments)},a._ClipByValue=function(){return(a._ClipByValue=a.asm.y).apply(null,arguments)},a._Conv2D=function(){return(a._Conv2D=a.asm.z).apply(null,arguments)},a._Conv2DBackpropInput=function(){return(a._Conv2DBackpropInput=a.asm.A).apply(null,arguments)},a._Cos=function(){return(a._Cos=a.asm.B).apply(null,arguments)},a._Cosh=function(){return(a._Cosh=a.asm.C).apply(null,arguments)},a._CropAndResize=function(){return(a._CropAndResize=a.asm.D).apply(null,arguments)},a._Cumsum=function(){return(a._Cumsum=a.asm.E).apply(null,arguments)},a._DepthToSpace=function(){return(a._DepthToSpace=a.asm.F).apply(null,arguments)},a._DepthwiseConv2dNative=function(){return(a._DepthwiseConv2dNative=a.asm.G).apply(null,arguments)},a._Equal=function(){return(a._Equal=a.asm.H).apply(null,arguments)},a._Exp=function(){return(a._Exp=a.asm.I).apply(null,arguments)},a._FlipLeftRight=function(){return(a._FlipLeftRight=a.asm.J).apply(null,arguments)},a._Floor=function(){return(a._Floor=a.asm.K).apply(null,arguments)},a._FloorDiv=function(){return(a._FloorDiv=a.asm.L).apply(null,arguments)},a._FusedBatchNorm=function(){return(a._FusedBatchNorm=a.asm.M).apply(null,arguments)},a._FusedConv2D=function(){return(a._FusedConv2D=a.asm.N).apply(null,arguments)},a._FusedDepthwiseConv2D=function(){return(a._FusedDepthwiseConv2D=a.asm.O).apply(null,arguments)},a._Gather=function(){return(a._Gather=a.asm.P).apply(null,arguments)},a._GatherNd=function(){return(a._GatherNd=a.asm.Q).apply(null,arguments)},a._Greater=function(){return(a._Greater=a.asm.R).apply(null,arguments)},a._GreaterEqual=function(){return(a._GreaterEqual=a.asm.S).apply(null,arguments)},a._LeakyRelu=function(){return(a._LeakyRelu=a.asm.T).apply(null,arguments)},a._Less=function(){return(a._Less=a.asm.U).apply(null,arguments)},a._LessEqual=function(){return(a._LessEqual=a.asm.V).apply(null,arguments)},a._Log=function(){return(a._Log=a.asm.W).apply(null,arguments)},a._LogicalAnd=function(){return(a._LogicalAnd=a.asm.X).apply(null,arguments)},a._Max=function(){return(a._Max=a.asm.Y).apply(null,arguments)},a._MaxPool=function(){return(a._MaxPool=a.asm.Z).apply(null,arguments)},a._Maximum=function(){return(a._Maximum=a.asm._).apply(null,arguments)},a._Mean=function(){return(a._Mean=a.asm.$).apply(null,arguments)},a._Min=function(){return(a._Min=a.asm.aa).apply(null,arguments)},a._Minimum=function(){return(a._Minimum=a.asm.ba).apply(null,arguments)},a._MirrorPad=function(){return(a._MirrorPad=a.asm.ca).apply(null,arguments)},a._Multiply=function(){return(a._Multiply=a.asm.da).apply(null,arguments)},a._Neg=function(){return(a._Neg=a.asm.ea).apply(null,arguments)},a._NonMaxSuppressionV3=function(){return(a._NonMaxSuppressionV3=a.asm.fa).apply(null,arguments)},a._NonMaxSuppressionV4=function(){return(a._NonMaxSuppressionV4=a.asm.ga).apply(null,arguments)},a._NonMaxSuppressionV5=function(){return(a._NonMaxSuppressionV5=a.asm.ha).apply(null,arguments)},a._NotEqual=function(){return(a._NotEqual=a.asm.ia).apply(null,arguments)},a._OneHot=function(){return(a._OneHot=a.asm.ja).apply(null,arguments)},a._PadV2=function(){return(a._PadV2=a.asm.ka).apply(null,arguments)},a._Pow=function(){return(a._Pow=a.asm.la).apply(null,arguments)},a._Prelu=function(){return(a._Prelu=a.asm.ma).apply(null,arguments)},a._Prod=function(){return(a._Prod=a.asm.na).apply(null,arguments)},a._RealDiv=function(){return(a._RealDiv=a.asm.oa).apply(null,arguments)},a._Relu=function(){return(a._Relu=a.asm.pa).apply(null,arguments)},a._Relu6=function(){return(a._Relu6=a.asm.qa).apply(null,arguments)},a._ResizeBilinear=function(){return(a._ResizeBilinear=a.asm.ra).apply(null,arguments)},a._Reverse=function(){return(a._Reverse=a.asm.sa).apply(null,arguments)},a._RotateWithOffset=function(){return(a._RotateWithOffset=a.asm.ta).apply(null,arguments)},a._Round=function(){return(a._Round=a.asm.ua).apply(null,arguments)},a._Rsqrt=function(){return(a._Rsqrt=a.asm.va).apply(null,arguments)},a._ScatterNd=function(){return(a._ScatterNd=a.asm.wa).apply(null,arguments)},a._SelectV2=function(){return(a._SelectV2=a.asm.xa).apply(null,arguments)},a._Sigmoid=function(){return(a._Sigmoid=a.asm.ya).apply(null,arguments)},a._Sin=function(){return(a._Sin=a.asm.za).apply(null,arguments)},a._Softmax=function(){return(a._Softmax=a.asm.Aa).apply(null,arguments)},a._Sqrt=function(){return(a._Sqrt=a.asm.Ba).apply(null,arguments)},a._Square=function(){return(a._Square=a.asm.Ca).apply(null,arguments)},a._SquaredDifference=function(){return(a._SquaredDifference=a.asm.Da).apply(null,arguments)},a._Step=function(){return(a._Step=a.asm.Ea).apply(null,arguments)},a._StridedSlice=function(){return(a._StridedSlice=a.asm.Fa).apply(null,arguments)},a._Sub=function(){return(a._Sub=a.asm.Ga).apply(null,arguments)},a._Sum=function(){return(a._Sum=a.asm.Ha).apply(null,arguments)},a._Tan=function(){return(a._Tan=a.asm.Ia).apply(null,arguments)},a._Tanh=function(){return(a._Tanh=a.asm.Ja).apply(null,arguments)},a._Tile=function(){return(a._Tile=a.asm.Ka).apply(null,arguments)},a._TopK=function(){return(a._TopK=a.asm.La).apply(null,arguments)},a._Transform=function(){return(a._Transform=a.asm.Ma).apply(null,arguments)},a._Transpose=function(){return(a._Transpose=a.asm.Na).apply(null,arguments)},a.__FusedMatMul=function(){return(a.__FusedMatMul=a.asm.Oa).apply(null,arguments)},a._malloc=function(){return(a._malloc=a.asm.Pa).apply(null,arguments)},a._free=function(){return(a._free=a.asm.Qa).apply(null,arguments)},a.___errno_location=function(){return(Ee=a.___errno_location=a.asm.Ra).apply(null,arguments)}),Ae=a.stackSave=function(){return(Ae=a.stackSave=a.asm.Sa).apply(null,arguments)},Re=a.stackRestore=function(){return(Re=a.stackRestore=a.asm.Ta).apply(null,arguments)},Fe=a.stackAlloc=function(){return(Fe=a.stackAlloc=a.asm.Ua).apply(null,arguments)};function $e(e){this.name="ExitStatus",this.message="Program terminated with exit("+e+")",this.status=e}function Me(e){function n(){Se||(Se=!0,a.calledRun=!0,I||(X(),Y(),t(a),a.onRuntimeInitialized&&a.onRuntimeInitialized(),Z()))}e=e||l,ee>0||(K(),ee>0||(a.setStatus?(a.setStatus("Running..."),setTimeout((function(){setTimeout((function(){a.setStatus("")}),1),n()}),1)):n()))}if(a.cwrap=N,ne=function e(){Se||Me(),Se||(ne=e)},a.run=Me,a.preInit)for("function"==typeof a.preInit&&(a.preInit=[a.preInit]);a.preInit.length>0;)a.preInit.pop()();return Me(),e.ready});e.exports=i}).call(this,"/index.js",n(/*! ./../../../process/browser.js */"./node_modules/process/browser.js"),"/")},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/addn_gpu.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/addn_gpu.js ***! + \**********************************************************************/ +/*! exports provided: AddNProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"AddNProgram",(function(){return s})); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e,t){this.outputShape=[],this.outputShape=e,this.variableNames=t.map(((e,t)=>`T${t}`));const n=[];this.variableNames.forEach((e=>{n.push(`float v${e} = get${e}AtOutCoords();`)}));const s=this.variableNames.map((e=>`v${e}`)).join(" + ");this.userCode=`\n void main() {\n ${n.join("\n ")}\n\n float result = ${s};\n setOutput(result);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/addn_packed_gpu.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/addn_packed_gpu.js ***! + \*****************************************************************************/ +/*! exports provided: AddNPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"AddNPackedProgram",(function(){return s})); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e,t){this.outputShape=[],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=e,this.variableNames=t.map(((e,t)=>`T${t}`));const n=[];this.variableNames.forEach((e=>{n.push(`vec4 v${e} = get${e}AtOutCoords();`)}));const s=this.variableNames.map((e=>`v${e}`)).join(" + ");this.userCode=`\n void main() {\n ${n.join("\n ")}\n\n vec4 result = ${s};\n setOutput(result);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/argminmax_gpu.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/argminmax_gpu.js ***! + \***************************************************************************/ +/*! exports provided: ArgMinMaxProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ArgMinMaxProgram",(function(){return s})); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e,t,n){this.variableNames=["A"];const{windowSize:s,batchSize:o,outSize:r}=e;n||this.variableNames.push("bestIndicesA"),this.outputShape=[o,r];const i="max"===t?">":"<",a=n?"inOffset + i;":"round(getBestIndicesA(batch, inOffset + i));";this.userCode=`\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = outIdx * ${s};\n\n int bestIndex = inOffset;\n float bestValue = getA(batch, bestIndex);\n\n for (int i = 0; i < ${s}; i++) {\n int inIdx = ${a};\n float candidate = getA(batch, inIdx);\n if (candidate ${i} bestValue) {\n bestValue = candidate;\n bestIndex = inIdx;\n }\n }\n setOutput(float(bestIndex));\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/argminmax_packed_gpu.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/argminmax_packed_gpu.js ***! + \**********************************************************************************/ +/*! exports provided: ArgMinMaxPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ArgMinMaxPackedProgram",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./packing_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/packing_util.js"),r=n(/*! ./shader_compiler */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class i{constructor(e,t,n,i){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,s.util.assert(e.length>2,(()=>`Packed arg${n.charAt(0).toUpperCase()+n.slice(1)} supports only inputs with rank above 2.`));const a=e[e.length-1],d=Math.ceil(a/t);this.outputShape=e.slice(0,-1),d>1&&this.outputShape.push(d),i||this.variableNames.push("bestIndicesA");const u=this.outputShape,l=u.length,c=Object(r.getCoordsDataType)(l),f=Object(o.getChannels)("coords",l);let p,m;if(1===d){m=l+1;const e=Object(r.getCoordsDataType)(m);p=`\n ${e} sourceLocR = ${e}(${f.join()}, 0);\n ++${f[l-1]};\n ${e} sourceLocG = ${e}(${f.join()}, 0);\n ++${f[l-2]};\n ${e} sourceLocA = ${e}(${f.join()}, 0);\n --${f[l-1]};\n ${e} sourceLocB = ${e}(${f.join()}, 0);\n --${f[l-2]};`}else m=l,p=`\n ${c} sourceLocR = coords;\n ++${f[l-1]};\n ${c} sourceLocG = coords;\n ++${f[l-2]};\n ${c} sourceLocA = coords;\n --${f[l-1]};\n ${c} sourceLocB = coords;\n --${f[l-2]};`;const h=["x","y","z","w","u","v"].slice(0,m),b="."+h[m-1],j=h.map((e=>"int "+e)),g=Object(o.getChannels)("sourceLocR",m-1).concat("inIdx.r"),w=Object(o.getChannels)("sourceLocG",m-1).concat("inIdx.g"),_=Object(o.getChannels)("sourceLocB",m-1).concat("inIdx.b"),k=Object(o.getChannels)("sourceLocA",m-1).concat("inIdx.a"),v="max"===n?"greaterThan":"lessThan",x=i?"":`\n inIdx = round(vec4(getBestIndicesAChannel(${g.join()}),\n getBestIndicesAChannel(${w.join()}),\n getBestIndicesAChannel(${_.join()}),\n getBestIndicesAChannel(${k.join()})));`,y=`vec4(\n getAChannel(${g.join()}),\n hasNextCol ? getAChannel(${w.join()}) : 0.,\n hasNextRow ? getAChannel(${_.join()}) : 0.,\n hasNextRow && hasNextCol ? getAChannel(${k.join()}) : 0.)`,O=i?"":`\n float getBestIndicesAChannel(${j.join()}) {\n return getChannel(getBestIndicesA(${h.join()}),\n vec2(${h.slice(-2).join()}));\n }`;this.userCode=`\n float getAChannel(${j.join()}) {\n return getChannel(getA(${h.join()}),\n vec2(${h.slice(-2).join()}));\n }\n ${O}\n void main() {\n ${c} coords = getOutputCoords();\n bool hasNextCol = ${f[l-1]} < ${u[l-1]-1};\n bool hasNextRow = ${f[l-2]} < ${u[l-2]-1};\n ${p}\n ivec4 srcIdx = ivec4(sourceLocR${b}, sourceLocG${b},\n sourceLocB${b}, sourceLocA${b}) * ${t};\n ivec4 inIdx = srcIdx;\n vec4 bestIndex = vec4(inIdx);\n vec4 bestValue = ${y};\n\n for (int i = 0; i < ${t}; i++) {\n inIdx = srcIdx;\n ${x}\n vec4 candidate = ${y};\n bvec4 nan = isnan(candidate);\n bvec4 replace = bvec4(\n vec4(${v}(candidate, bestValue)) * (vec4(1.0) - vec4(nan)));\n\n bestValue = vec4(replace.x ? candidate.x : bestValue.x,\n replace.y ? candidate.y : bestValue.y,\n replace.z ? candidate.z : bestValue.z,\n replace.w ? candidate.w : bestValue.w);\n bestIndex = mix(bestIndex, vec4(inIdx), vec4(replace));\n srcIdx++;\n }\n setOutput(bestIndex);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/avg_pool_backprop_gpu.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/avg_pool_backprop_gpu.js ***! + \***********************************************************************************/ +/*! exports provided: AvgPool2DBackpropProgram, AvgPool3DBackpropProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"AvgPool2DBackpropProgram",(function(){return s})),n.d(t,"AvgPool3DBackpropProgram",(function(){return o})); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e){this.variableNames=["dy"],this.outputShape=e.inShape;const t=e.filterHeight,n=e.filterWidth,s=e.strideHeight,o=e.strideWidth,r=e.dilationHeight,i=e.dilationWidth,a=e.effectiveFilterHeight,d=e.effectiveFilterWidth,u=a-1-e.padInfo.top,l=d-1-e.padInfo.left,c=1/(t*n);this.userCode=`\n const ivec2 pads = ivec2(${u}, ${l});\n const float avgMultiplier = float(${c});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n\n ivec2 dyRCCorner = coords.yz - pads;\n int dyRCorner = dyRCCorner.x;\n int dyCCorner = dyRCCorner.y;\n\n // Convolve dy(?, ?, d) with pos mask(:, :, d) to get dx(xR, xC, d).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < ${a};\n wR += ${r}) {\n float dyR = float(dyRCorner + wR) / ${s}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < ${d};\n wC+= ${i}) {\n float dyC = float(dyCCorner + wC) / ${o}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(b, idyR, idyC, d);\n\n dotProd += dyValue * avgMultiplier;\n }\n }\n setOutput(dotProd);\n }\n `}}class o{constructor(e){this.variableNames=["dy"],this.outputShape=e.inShape;const t=e.filterDepth,n=e.filterHeight,s=e.filterWidth,o=e.strideDepth,r=e.strideHeight,i=e.strideWidth,a=e.dilationDepth,d=e.dilationHeight,u=e.dilationWidth,l=e.effectiveFilterDepth,c=e.effectiveFilterHeight,f=e.effectiveFilterWidth,p=l-1-e.padInfo.front,m=c-1-e.padInfo.top,h=f-1-e.padInfo.left,b=1/(t*n*s);this.userCode=`\n const ivec3 pads = ivec3(${p}, ${m}, ${h});\n const float avgMultiplier = float(${b});\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int ch = coords.u;\n\n ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads;\n int dyDCorner = dyCorner.x;\n int dyRCorner = dyCorner.y;\n int dyCCorner = dyCorner.z;\n\n // Convolve dy(?, ?, ?, d) with pos mask(:, :, :, ch) to get\n // dx(xD, xR, xC, ch).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n\n for (int wD = 0; wD < ${l};\n wD += ${a}) {\n float dyD = float(dyDCorner + wD) / ${o}.0;\n\n if (dyD < 0.0 || dyD >= ${e.outDepth}.0 || fract(dyD) > 0.0) {\n continue;\n }\n int idyD = int(dyD);\n\n for (int wR = 0; wR < ${c};\n wR += ${d}) {\n float dyR = float(dyRCorner + wR) / ${r}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 ||\n fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < ${f};\n wC += ${u}) {\n float dyC = float(dyCCorner + wC) / ${i}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(batch, idyD, idyR, idyC, ch);\n\n dotProd += dyValue * avgMultiplier;\n }\n }\n }\n setOutput(dotProd);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/backend_webgl.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/backend_webgl.js ***! + \***************************************************************************/ +/*! exports provided: EPSILON_FLOAT32, EPSILON_FLOAT16, getBinaryCache, MathBackendWebGL */function(e,t,n){"use strict";n.r(t),n.d(t,"EPSILON_FLOAT32",(function(){return x})),n.d(t,"EPSILON_FLOAT16",(function(){return y})),n.d(t,"getBinaryCache",(function(){return I})),n.d(t,"MathBackendWebGL",(function(){return S}));n(/*! ./flags_webgl */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/flags_webgl.js");var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./canvas_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/canvas_util.js"),r=n(/*! ./decode_matrix_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/decode_matrix_gpu.js"),i=n(/*! ./decode_matrix_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/decode_matrix_packed_gpu.js"),a=n(/*! ./encode_float_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_float_gpu.js"),d=n(/*! ./encode_float_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_float_packed_gpu.js"),u=n(/*! ./encode_matrix_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_matrix_gpu.js"),l=n(/*! ./encode_matrix_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_matrix_packed_gpu.js"),c=n(/*! ./gpgpu_context */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/gpgpu_context.js"),f=n(/*! ./gpgpu_math */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/gpgpu_math.js"),p=n(/*! ./kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"),m=n(/*! ./pack_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/pack_gpu.js"),h=n(/*! ./reshape_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/reshape_packed_gpu.js"),b=n(/*! ./tex_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/tex_util.js"),j=n(/*! ./texture_manager */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/texture_manager.js"),g=n(/*! ./unaryop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js"),w=n(/*! ./unaryop_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_packed_gpu.js"),_=n(/*! ./unpack_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/unpack_gpu.js"),k=n(/*! ./webgl_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const v=s.kernel_impls.whereImpl,x=1e-7,y=1e-4,O={};function I(e){return e in O||(O[e]={}),O[e]}const C=Object(s.env)().getNumber("CPU_HANDOFF_SIZE_THRESHOLD");class S extends s.KernelBackend{constructor(e){if(super(),this.pendingRead=new WeakMap,this.pendingDisposal=new WeakSet,this.dataRefCount=new WeakMap,this.numBytesInGPU=0,this.uploadWaitMs=0,this.downloadWaitMs=0,this.lastGlFlushTime=0,this.warnedAboutMemory=!1,this.pendingDeletes=0,this.disposed=!1,!Object(s.env)().getBool("HAS_WEBGL"))throw new Error("WebGL is not supported on this device");if(null==e){const e=Object(o.getWebGLContext)(Object(s.env)().getNumber("WEBGL_VERSION"));this.binaryCache=I(Object(s.env)().getNumber("WEBGL_VERSION")),this.gpgpu=new c.GPGPUContext(e),this.canvas=e.canvas,this.gpgpuCreatedLocally=!0}else this.gpgpu=e,this.binaryCache={},this.gpgpuCreatedLocally=!1,this.canvas=e.gl.canvas;this.textureManager=new j.TextureManager(this.gpgpu),this.numMBBeforeWarning=null==Object(s.env)().global.screen?1024:Object(s.env)().global.screen.height*Object(s.env)().global.screen.width*window.devicePixelRatio*600/1024/1024,this.texData=new s.DataStorage(this,Object(s.engine)())}nextDataId(){return S.nextDataId++}numDataIds(){return this.texData.numDataIds()-this.pendingDeletes}write(e,t,n){if((Object(s.env)().getBool("WEBGL_CHECK_NUMERICAL_PROBLEMS")||Object(s.env)().getBool("DEBUG"))&&this.checkNumericalProblems(e),"complex64"===n&&null!=e)throw new Error("Cannot write to a complex64 dtype. Please use tf.complex(real, imag).");const o={id:this.nextDataId()};return this.texData.set(o,{shape:t,dtype:n,values:e,usage:b.TextureUsage.UPLOAD,refCount:1}),o}refCount(e){if(this.texData.has(e)){return this.texData.get(e).refCount}return 0}incRef(e){this.texData.get(e).refCount++}decRef(e){if(this.texData.has(e)){this.texData.get(e).refCount--}}move(e,t,n,o,r){if(Object(s.env)().getBool("DEBUG")&&this.checkNumericalProblems(t),"complex64"===o)throw new Error("Cannot write to a complex64 dtype. Please use tf.complex(real, imag).");this.texData.set(e,{shape:n,dtype:o,values:t,usage:b.TextureUsage.UPLOAD,refCount:r})}disposeIntermediateTensorInfo(e){this.disposeData(e.dataId)}readSync(e){const t=this.texData.get(e),{values:n,dtype:o,complexTensorInfos:r,slice:i,shape:a,isPacked:d}=t;if(null!=i){let t;t=d?new w.UnaryOpPackedProgram(a,g.CLONE):new g.UnaryOpProgram(a,g.CLONE);const n=this.runWebGLProgram(t,[{dataId:e,shape:a,dtype:o}],o),s=this.readSync(n.dataId);return this.disposeIntermediateTensorInfo(n),s}if(null!=n)return this.convertAndCacheOnCPU(e);if("string"===o)return n;const u=null!=this.activeTimers;let l,c;if(u&&(l=s.util.now()),"complex64"===o){const e=this.readSync(r.real.dataId),t=this.readSync(r.imag.dataId);c=s.backend_util.mergeRealAndImagArrays(e,t)}else c=this.getValuesFromTexture(e);return u&&(this.downloadWaitMs+=s.util.now()-l),this.convertAndCacheOnCPU(e,c)}async read(e){if(this.pendingRead.has(e)){const t=this.pendingRead.get(e);return new Promise((e=>t.push(e)))}const t=this.texData.get(e),{values:n,shape:o,slice:r,dtype:i,complexTensorInfos:a,isPacked:d}=t;if(null!=r){let t;t=d?new w.UnaryOpPackedProgram(o,g.CLONE):new g.UnaryOpProgram(o,g.CLONE);const n=this.runWebGLProgram(t,[{dataId:e,shape:o,dtype:i}],i),s=this.read(n.dataId);return this.disposeIntermediateTensorInfo(n),s}if(null!=n)return this.convertAndCacheOnCPU(e);if(!Object(s.env)().getBool("WEBGL_DOWNLOAD_FLOAT_ENABLED")&&2===Object(s.env)().getNumber("WEBGL_VERSION"))throw new Error("tensor.data() with WEBGL_DOWNLOAD_FLOAT_ENABLED=false and WEBGL_VERSION=2 not yet supported.");let u,l,c=null;if("complex64"!==i&&Object(s.env)().get("WEBGL_BUFFER_SUPPORTED")){u=this.decode(e);const t=this.texData.get(u.dataId);c=this.gpgpu.createBufferFromTexture(t.texture,...b.getDenseTexShape(o))}if(this.pendingRead.set(e,[]),"complex64"!==i&&await this.gpgpu.createAndWaitForFence(),"complex64"===i){const e=await Promise.all([this.read(a.real.dataId),this.read(a.imag.dataId)]),t=e[0],n=e[1];l=s.backend_util.mergeRealAndImagArrays(t,n)}else if(null==c)l=this.getValuesFromTexture(e);else{const e=s.util.sizeFromShape(o);l=this.gpgpu.downloadFloat32MatrixFromBuffer(c,e)}if(null!=u&&this.disposeIntermediateTensorInfo(u),null!=c){const e=this.gpgpu.gl;k.callAndCheck(e,(()=>e.deleteBuffer(c)))}const f=this.convertAndCacheOnCPU(e,l),p=this.pendingRead.get(e);return this.pendingRead.delete(e),p.forEach((e=>e(f))),this.pendingDisposal.has(e)&&(this.pendingDisposal.delete(e),this.disposeData(e)&&Object(s.engine)().removeDataId(e,this),this.pendingDeletes--),f}bufferSync(e){const t=this.readSync(e.dataId);let n=t;if("string"===e.dtype)try{n=t.map((e=>s.util.decodeString(e)))}catch(e){throw new Error("Failed to decode encoded string bytes into utf-8")}return Object(s.buffer)(e.shape,e.dtype,n)}checkNumericalProblems(e){if(null!=e)for(let t=0;t0}async time(e){const t=this.activeTimers,n=[];let o=!1;null==this.programTimersStack?(this.programTimersStack=n,o=!0):this.activeTimers.push(n),this.activeTimers=n,e();const r=s.util.flatten(this.activeTimers.map((e=>e.query))).filter((e=>null!=e)),i=s.util.flatten(this.activeTimers.map((e=>e.name))).filter((e=>null!=e));this.activeTimers=t,o&&(this.programTimersStack=null);const a={uploadWaitMs:this.uploadWaitMs,downloadWaitMs:this.downloadWaitMs,kernelMs:null,wallMs:null};if(Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE")>0){const e=await Promise.all(r);a.kernelMs=s.util.sum(e),a.getExtraProfileInfo=()=>e.map(((e,t)=>({name:i[t],ms:e}))).map((e=>`${e.name}: ${e.ms}`)).join(", ")}else a.kernelMs={error:"WebGL query timers are not supported in this environment."};return this.uploadWaitMs=0,this.downloadWaitMs=0,a}memory(){return{unreliable:!1,numBytesInGPU:this.numBytesInGPU,numBytesInGPUAllocated:this.textureManager.numBytesAllocated,numBytesInGPUFree:this.textureManager.numBytesFree}}startTimer(){return Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE")>0?this.gpgpu.beginQuery():{startMs:s.util.now(),endMs:null}}endTimer(e){return Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE")>0?(this.gpgpu.endQuery(),e):(e.endMs=s.util.now(),e)}async getQueryTime(e){if(Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE")>0)return this.gpgpu.waitForQueryAndGetTime(e);const t=e;return t.endMs-t.startMs}disposeData(e,t=!1){if(this.pendingDisposal.has(e))return!1;if(!this.texData.has(e))return!0;if(t?this.texData.get(e).refCount=0:this.texData.get(e).refCount--,!t&&this.texData.get(e).refCount>0)return!1;if(this.pendingRead.has(e))return this.pendingDisposal.add(e),this.pendingDeletes++,!1;this.releaseGPUData(e);const{complexTensorInfos:n}=this.texData.get(e);return null!=n&&(this.disposeData(n.real.dataId,t),this.disposeData(n.imag.dataId,t)),this.texData.delete(e),!0}releaseGPUData(e){const{texture:t,dtype:n,texShape:s,usage:o,isPacked:r,slice:i}=this.texData.get(e),a=i&&i.origDataId||e,d=this.dataRefCount.get(a);d>1?this.dataRefCount.set(a,d-1):(this.dataRefCount.delete(a),null!=t&&(this.numBytesInGPU-=this.computeBytes(s,n),this.textureManager.releaseTexture(t,s,o,r)));const u=this.texData.get(e);u.texture=null,u.texShape=null,u.isPacked=!1,u.slice=null}getTexture(e){return this.uploadToGPU(e),this.texData.get(e).texture}getDataInfo(e){return this.texData.get(e)}shouldExecuteOnCPU(e,t=C){return Object(s.env)().getBool("WEBGL_CPU_FORWARD")&&e.every((e=>null==this.texData.get(e.dataId).texture&&s.util.sizeFromShape(e.shape)0&&s.util.isString(n[0])){const r=n.map((e=>s.util.encodeString(e)));o=this.write(r,e,t)}else o=this.write(n,e,t);return this.texData.get(o).usage=null,{dataId:o,shape:e,dtype:t}}makeOutput(e,t,n){const{dataId:o}=this.makeTensorInfo(e,t,n);return Object(s.engine)().makeTensorFromDataId(o,e,t,this)}unpackTensor(e){const t=new _.UnpackProgram(e.shape);return this.runWebGLProgram(t,[e],e.dtype)}packTensor(e){const t=new m.PackProgram(e.shape);return this.runWebGLProgram(t,[e],e.dtype,null,!0)}packedReshape(e,t){const n=[k.getBatchDim(e.shape),...k.getRowsCols(e.shape)],s={dtype:e.dtype,shape:n,dataId:e.dataId},o=[k.getBatchDim(t),...k.getRowsCols(t)],r=new h.ReshapePackedProgram(o,n),i=this.runWebGLProgram(r,[s],e.dtype,null,!0);return{dataId:i.dataId,shape:t,dtype:i.dtype}}decode(e){const t=this.texData.get(e),{isPacked:n,shape:s,dtype:o}=t,a=k.getShapeAs3D(s);let d;d=n?new i.DecodeMatrixPackedProgram(a):new r.DecodeMatrixProgram(a);return{dtype:o,shape:s,dataId:this.runWebGLProgram(d,[{shape:a,dtype:o,dataId:e}],o,null,!0).dataId}}runWebGLProgram(e,t,n,o,r=!1){const i=this.makeTensorInfo(e.outputShape,n),a=this.texData.get(i.dataId);if(e.packedOutput&&(a.isPacked=!0),e.outPackingScheme===b.PackingScheme.DENSE){const t=b.getDenseTexShape(e.outputShape);a.texShape=t.map((e=>2*e))}if(null!=e.outTexUsage&&(a.usage=e.outTexUsage),0===s.util.sizeFromShape(i.shape))return a.values=s.util.getTypedArrayFromDType(i.dtype,0),i;const d=[],u=t.map((t=>{if("complex64"===t.dtype)throw new Error("GPGPUProgram does not support complex64 input. For complex64 dtypes, please separate the program into real and imaginary parts.");let n=this.texData.get(t.dataId);if(null==n.texture){if(!e.packedInputs&&s.util.sizeFromShape(t.shape)<=Object(s.env)().getNumber("WEBGL_SIZE_UPLOAD_UNIFORM"))return{shape:t.shape,texData:null,isUniform:!0,uniformValues:n.values};e.packedInputs&&(n.isPacked=!0,n.shape=t.shape)}else if(!!n.isPacked!=!!e.packedInputs)t=n.isPacked?this.unpackTensor(t):this.packTensor(t),d.push(t),n=this.texData.get(t.dataId);else if(n.isPacked&&!k.isReshapeFree(n.shape,t.shape)){const e=t,s=t.shape;t.shape=n.shape,t=this.packedReshape(t,s),d.push(t),n=this.texData.get(t.dataId),e.shape=s}return this.uploadToGPU(t.dataId),{shape:t.shape,texData:n,isUniform:!1}}));this.uploadToGPU(i.dataId);const l={shape:i.shape,texData:a,isUniform:!1},c=f.makeShaderKey(e,u,l),p=this.getAndSaveBinary(c,(()=>f.compileProgram(this.gpgpu,e,u,l))),m=null!=this.activeTimers;let h;m&&(h=this.startTimer()),f.runProgram(this.gpgpu,p,u,l,o),d.forEach((e=>this.disposeIntermediateTensorInfo(e))),m&&(h=this.endTimer(h),this.activeTimers.push({name:e.constructor.name,query:this.getQueryTime(h)}));const j=Object(s.env)().get("WEBGL_FLUSH_THRESHOLD");if(j>0){const e=s.util.now();e-this.lastGlFlushTime>j&&(this.gpgpu.gl.flush(),this.lastGlFlushTime=e)}if(!Object(s.env)().getBool("WEBGL_LAZILY_UNPACK")&&a.isPacked&&!1===r){const e=this.unpackTensor(i);return this.disposeIntermediateTensorInfo(i),e}return i}compileAndRun(e,t,n,s,o=!1){n=n||t[0].dtype;return this.runWebGLProgram(e,t,n,s,o)}getAndSaveBinary(e,t){return e in this.binaryCache||(this.binaryCache[e]=t()),this.binaryCache[e]}getTextureManager(){return this.textureManager}dispose(){if(!this.disposed){if(!Object(s.env)().getBool("IS_TEST")){Object.keys(this.binaryCache).forEach((e=>{this.gpgpu.deleteProgram(this.binaryCache[e].webGLProgram),delete this.binaryCache[e]}))}this.textureManager.dispose(),null!=this.canvas&&"undefined"!=typeof HTMLCanvasElement&&this.canvas instanceof HTMLCanvasElement?this.canvas.remove():this.canvas=null,this.gpgpuCreatedLocally&&(this.gpgpu.program=null,this.gpgpu.dispose()),this.disposed=!0}}floatPrecision(){return null==this.floatPrecisionValue&&(this.floatPrecisionValue=Object(s.tidy)((()=>{if(!Object(s.env)().get("WEBGL_RENDER_FLOAT32_ENABLED")){const e=Object(s.env)().getBool("DEBUG");Object(s.env)().set("DEBUG",!1);const t=this.abs(Object(s.scalar)(1e-8)).dataSync()[0];if(Object(s.env)().set("DEBUG",e),t>0)return 32}return 16}))),this.floatPrecisionValue}epsilon(){return 32===this.floatPrecision()?x:y}uploadToGPU(e){const t=this.texData.get(e),{shape:n,dtype:o,values:r,texture:i,usage:a,isPacked:d}=t;if(null!=i)return;const c=null!=this.activeTimers;let f;c&&(f=s.util.now());let p=t.texShape;if(null==p&&(p=k.getTextureShapeFromLogicalShape(n,d),t.texShape=p),null!=r){const e=k.getShapeAs3D(n);let i,a=p[1],m=p[0];const h=r instanceof Uint8Array;d?([a,m]=b.getPackedMatrixTextureShapeWidthHeight(p[0],p[1]),i=new l.EncodeMatrixPackedProgram(e,[m,a],h)):i=new u.EncodeMatrixProgram(e,[m,a],h);const j=this.makeTensorInfo([m,a],o);this.texData.get(j.dataId).usage=h?b.TextureUsage.PIXELS:b.TextureUsage.UPLOAD,this.gpgpu.uploadDenseMatrixToTexture(this.getTexture(j.dataId),a,m,r);const g=!0,w=this.runWebGLProgram(i,[j],o,null,g),_=this.texData.get(w.dataId);t.texture=_.texture,t.texShape=_.texShape,t.isPacked=_.isPacked,t.usage=_.usage,this.disposeIntermediateTensorInfo(j),this.texData.delete(w.dataId),t.values=null,c&&(this.uploadWaitMs+=s.util.now()-f)}else{const e=this.acquireTexture(p,a,o,d);t.texture=e}}convertAndCacheOnCPU(e,t){const n=this.texData.get(e),{dtype:s}=n;return this.releaseGPUData(e),null!=t&&(n.values=function(e,t){if("float32"===t||"complex64"===t)return e;if("int32"===t||"bool"===t){const n="int32"===t?new Int32Array(e.length):new Uint8Array(e.length);for(let t=0;t1024*this.numMBBeforeWarning*1024){const e=(this.numBytesInGPU/1024/1024).toFixed(2);this.warnedAboutMemory=!0,console.warn(`High memory usage in GPU: ${e} MB, most likely due to a memory leak`)}return this.textureManager.acquireTexture(e,t,s)}computeBytes(e,t){return e[0]*e[1]*s.util.bytesPerElement(t)}}S.nextDataId=0},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/base.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/base.js ***! + \******************************************************************/ +/*! exports provided: version_webgl, MathBackendWebGL, setWebGLContext, GPGPUContext, gpgpu_util, webgl_util, forceHalfFloat, webgl */function(e,t,n){"use strict";n.r(t),n.d(t,"webgl",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./backend_webgl */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/backend_webgl.js"),r=n(/*! ./version */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/version.js");n.d(t,"version_webgl",(function(){return r.version}));var i=n(/*! ./webgl */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl.js");n.d(t,"MathBackendWebGL",(function(){return i.MathBackendWebGL})),n.d(t,"setWebGLContext",(function(){return i.setWebGLContext})),n.d(t,"GPGPUContext",(function(){return i.GPGPUContext})),n.d(t,"gpgpu_util",(function(){return i.gpgpu_util})),n.d(t,"webgl_util",(function(){return i.webgl_util})),n.d(t,"forceHalfFloat",(function(){return i.forceHalfFloat})), +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +s.device_util.isBrowser()&&Object(s.registerBackend)("webgl",(()=>new o.MathBackendWebGL),2);const a={forceHalfFloat:i.forceHalfFloat}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/batchnorm_gpu.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/batchnorm_gpu.js ***! + \***************************************************************************/ +/*! exports provided: BatchNormProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"BatchNormProgram",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */class o{constructor(e,t,n,o,r,i){this.outputShape=[],this.variableNames=["x","mean","variance"],s.backend_util.assertAndGetBroadcastShape(e,t),s.backend_util.assertAndGetBroadcastShape(e,n);let a="0.0";null!=o&&(s.backend_util.assertAndGetBroadcastShape(e,o),this.variableNames.push("offset"),a="getOffsetAtOutCoords()");let d="1.0";null!=r&&(s.backend_util.assertAndGetBroadcastShape(e,r),this.variableNames.push("scale"),d="getScaleAtOutCoords()"),this.outputShape=e,this.userCode=`\n void main() {\n float x = getXAtOutCoords();\n float mean = getMeanAtOutCoords();\n float variance = getVarianceAtOutCoords();\n float offset = ${a};\n float scale = ${d};\n float inv = scale * inversesqrt(variance + float(${i}));\n setOutput(dot(vec3(x, -mean, offset), vec3(inv, inv, 1)));\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/batchnorm_packed_gpu.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/batchnorm_packed_gpu.js ***! + \**********************************************************************************/ +/*! exports provided: BatchNormPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"BatchNormPackedProgram",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */class o{constructor(e,t,n,o,r,i){this.packedInputs=!0,this.packedOutput=!0,this.variableNames=["x","mean","variance"],s.backend_util.assertAndGetBroadcastShape(e,t),s.backend_util.assertAndGetBroadcastShape(e,n);let a="vec4(0.0)";null!=o&&(s.backend_util.assertAndGetBroadcastShape(e,o),this.variableNames.push("offset"),a="getOffsetAtOutCoords()");let d="vec4(1.0)";null!=r&&(s.backend_util.assertAndGetBroadcastShape(e,r),this.variableNames.push("scale"),d="getScaleAtOutCoords()"),this.outputShape=e,this.userCode=`\n void main() {\n vec4 offset = ${a};\n vec4 scale = ${d};\n\n vec4 x = getXAtOutCoords();\n vec4 mean = getMeanAtOutCoords();\n vec4 variance = getVarianceAtOutCoords();\n\n vec4 inv = scale * inversesqrt(variance + vec4(${i}));\n\n setOutput((x - mean) * inv + offset);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_complex_gpu.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_complex_gpu.js ***! + \**********************************************************************************/ +/*! exports provided: COMPLEX_MULTIPLY, BinaryOpComplexProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"COMPLEX_MULTIPLY",(function(){return o})),n.d(t,"BinaryOpComplexProgram",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */const o={REAL:"return areal * breal - aimag * bimag;",IMAG:"return areal * bimag + aimag * breal;"};class r{constructor(e,t,n){this.variableNames=["AReal","AImag","BReal","BImag"],this.outputShape=s.backend_util.assertAndGetBroadcastShape(t,n),this.userCode=`\n float binaryOpComplex(\n float areal, float aimag, float breal, float bimag) {\n ${e}\n }\n\n void main() {\n float areal = getARealAtOutCoords();\n float aimag = getAImagAtOutCoords();\n float breal = getBRealAtOutCoords();\n float bimag = getBImagAtOutCoords();\n setOutput(binaryOpComplex(areal, aimag, breal, bimag));\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_gpu.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_gpu.js ***! + \**************************************************************************/ +/*! exports provided: CHECK_NAN_SNIPPET, SQUARED_DIFFERENCE, BinaryOpProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"CHECK_NAN_SNIPPET",(function(){return r})),n.d(t,"SQUARED_DIFFERENCE",(function(){return i})),n.d(t,"BinaryOpProgram",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./gpgpu_math */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/gpgpu_math.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r="\n if (isnan(a)) return a;\n if (isnan(b)) return b;\n",i="return (a - b) * (a - b);";class a{constructor(e,t,n){this.variableNames=["A","B"],this.outputShape=s.backend_util.assertAndGetBroadcastShape(t,n),this.enableShapeUniforms=Object(o.useShapeUniforms)(this.outputShape.length),this.userCode=`\n float binaryOperation(float a, float b) {\n ${e}\n }\n\n void main() {\n float a = getAAtOutCoords();\n float b = getBAtOutCoords();\n setOutput(binaryOperation(a, b));\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_packed_gpu.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_packed_gpu.js ***! + \*********************************************************************************/ +/*! exports provided: CHECK_NAN_SNIPPET, ELU_DER, NOT_EQUAL, BinaryOpPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"CHECK_NAN_SNIPPET",(function(){return a})),n.d(t,"ELU_DER",(function(){return d})),n.d(t,"NOT_EQUAL",(function(){return u})),n.d(t,"BinaryOpPackedProgram",(function(){return l}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./gpgpu_math */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/gpgpu_math.js"),r=n(/*! ./packing_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/packing_util.js"),i=n(/*! ./shader_compiler */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const a="\n result.r = isNaN.r > 0. ? NAN : result.r;\n result.g = isNaN.g > 0. ? NAN : result.g;\n result.b = isNaN.b > 0. ? NAN : result.b;\n result.a = isNaN.a > 0. ? NAN : result.a;\n",d="\n vec4 bGTEZero = vec4(greaterThanEqual(b, vec4(0.)));\n return (bGTEZero * a) + ((vec4(1.0) - bGTEZero) * (a * (b + vec4(1.0))));\n",u="\n return vec4(notEqual(a, b));\n";class l{constructor(e,t,n,a=!1){this.variableNames=["A","B"],this.supportsBroadcasting=!0,this.packedInputs=!0,this.packedOutput=!0,this.outputShape=s.backend_util.assertAndGetBroadcastShape(t,n);const d=this.outputShape.length;this.enableShapeUniforms=Object(o.useShapeUniforms)(d);let u="";if(a)if(0===d||1===s.util.sizeFromShape(this.outputShape))u="\n result.y = 0.;\n result.z = 0.;\n result.w = 0.;\n ";else{if(u=`\n ${Object(i.getCoordsDataType)(d)} coords = getOutputCoords();\n `,1===d)this.enableShapeUniforms?u+="\n result.y = (coords + 1) >= outShape ? 0. : result.y;\n result.z = 0.;\n result.w = 0.;\n ":u+=`\n result.y = (coords + 1) >= ${this.outputShape[0]} ? 0. : result.y;\n result.z = 0.;\n result.w = 0.;\n `;else{const e=Object(r.getChannels)("coords",d);this.enableShapeUniforms?u+=`\n bool nextRowOutOfBounds =\n (${e[d-2]} + 1) >= outShape[${d} - 2];\n bool nextColOutOfBounds =\n (${e[d-1]} + 1) >= outShape[${d} - 1];\n result.y = nextColOutOfBounds ? 0. : result.y;\n result.z = nextRowOutOfBounds ? 0. : result.z;\n result.w = nextColOutOfBounds || nextRowOutOfBounds ? 0. : result.w;\n `:u+=`\n bool nextRowOutOfBounds =\n (${e[d-2]} + 1) >= ${this.outputShape[d-2]};\n bool nextColOutOfBounds =\n (${e[d-1]} + 1) >= ${this.outputShape[d-1]};\n result.y = nextColOutOfBounds ? 0. : result.y;\n result.z = nextRowOutOfBounds ? 0. : result.z;\n result.w = nextColOutOfBounds || nextRowOutOfBounds ? 0. : result.w;\n `}}this.userCode=`\n vec4 binaryOperation(vec4 a, vec4 b) {\n ${e}\n }\n\n void main() {\n vec4 a = getAAtOutCoords();\n vec4 b = getBAtOutCoords();\n\n vec4 result = binaryOperation(a, b);\n ${u}\n\n setOutput(result);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/canvas_util.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/canvas_util.js ***! + \*************************************************************************/ +/*! exports provided: clearWebGLContext, setWebGLContext, getWebGLContext */function(e,t,n){"use strict";n.r(t),n.d(t,"clearWebGLContext",(function(){return r})),n.d(t,"setWebGLContext",(function(){return i})),n.d(t,"getWebGLContext",(function(){return a})); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const s={},o={alpha:!1,antialias:!1,premultipliedAlpha:!1,preserveDrawingBuffer:!1,depth:!1,stencil:!1,failIfMajorPerformanceCaveat:!0};function r(e){delete s[e]}function i(e,t){s[e]=t}function a(e){if(!(e in s)){const t=function(e){if(1!==e&&2!==e)throw new Error("Cannot get WebGL rendering context, WebGL is disabled.");const t=function(e){if("undefined"!=typeof OffscreenCanvas&&2===e)return new OffscreenCanvas(300,150);if("undefined"!=typeof document)return document.createElement("canvas");throw new Error("Cannot create a canvas in this context")}(e);if(t.addEventListener("webglcontextlost",(t=>{t.preventDefault(),delete s[e]}),!1),1===e)return t.getContext("webgl",o)||t.getContext("experimental-webgl",o);return t.getContext("webgl2",o)}(e);if(null===t)return console.log("Could not get context for WebGL version",e),null;s[e]=t}const t=s[e];return t.isContextLost()?(delete s[e],a(e)):(t.disable(t.DEPTH_TEST),t.disable(t.STENCIL_TEST),t.disable(t.BLEND),t.disable(t.DITHER),t.disable(t.POLYGON_OFFSET_FILL),t.disable(t.SAMPLE_COVERAGE),t.enable(t.SCISSOR_TEST),t.enable(t.CULL_FACE),t.cullFace(t.BACK),s[e])}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/clip_gpu.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/clip_gpu.js ***! + \**********************************************************************/ +/*! exports provided: ClipProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ClipProgram",(function(){return s})); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e){this.variableNames=["A"],this.customUniforms=[{name:"minVal",type:"float"},{name:"maxVal",type:"float"}],this.outputShape=e,this.userCode="\n\n void main() {\n float value = getAAtOutCoords();\n if (isnan(value)) {\n setOutput(value);\n return;\n }\n\n setOutput(clamp(value, minVal, maxVal));\n }\n "}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/clip_packed_gpu.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/clip_packed_gpu.js ***! + \*****************************************************************************/ +/*! exports provided: ClipPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ClipPackedProgram",(function(){return s})); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.customUniforms=[{name:"minVal",type:"float"},{name:"maxVal",type:"float"}],this.outputShape=e,this.userCode="\n void main() {\n vec4 value = getAAtOutCoords();\n\n if (any(isnan(value))) {\n setOutput(value);\n return;\n }\n\n setOutput(clamp(value, vec4(minVal), vec4(maxVal)));\n }\n "}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/complex_abs_gpu.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/complex_abs_gpu.js ***! + \*****************************************************************************/ +/*! exports provided: ComplexAbsProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ComplexAbsProgram",(function(){return s})); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e){this.variableNames=["real","imag"],this.outputShape=e,this.userCode="\n void main() {\n float re = abs(getRealAtOutCoords());\n float im = abs(getImagAtOutCoords());\n float mx = max(re, im);\n\n // sadly the length function in glsl is not underflow-safe\n // (at least not on Intel GPUs). So the safe solution is\n // to ensure underflow-safety in all cases.\n setOutput(\n mx == 0.0 ? 0.0 : mx * length(vec2(1, min(re, im)/mx))\n );\n }\n "}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/concat_gpu.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/concat_gpu.js ***! + \************************************************************************/ +/*! exports provided: ConcatProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ConcatProgram",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */class o{constructor(e){this.outputShape=[],this.outputShape=s.backend_util.computeOutShape(e,1),this.variableNames=e.map(((e,t)=>`T${t}`));const t=new Array(e.length-1);t[0]=e[0][1];for(let n=1;n`T${t}`));const c=new Array(e.length-1);c[0]=e[0][t];for(let n=1;n= ${c[e-1]}) {\n return getChannel(\n getT${e}(${a(l,f,t)}),\n vec2(${a(p,f,t)}));\n }`}const b=c.length,j=c[c.length-1];h+=`\n return getChannel(\n getT${b}(${a(l,f,j)}),\n vec2(${a(p,f,j)}));`,this.userCode=`\n float getValue(${l.map((e=>"int "+e))}) {\n ${h}\n }\n\n void main() {\n ${d} coords = getOutputCoords();\n vec4 result = vec4(getValue(${u}), 0., 0., 0.);\n\n ${u[i-1]} = ${u[i-1]} + 1;\n if (${u[i-1]} < ${n[i-1]}) {\n result.g = getValue(${u});\n }\n\n ${u[i-2]} = ${u[i-2]} + 1;\n if (${u[i-2]} < ${n[i-2]}) {\n result.a = getValue(${u});\n }\n\n ${u[i-1]} = ${u[i-1]} - 1;\n if (${u[i-2]} < ${n[i-2]} &&\n ${u[i-1]} < ${n[i-1]}) {\n result.b = getValue(${u});\n }\n setOutput(result);\n }\n `}}function a(e,t,n){const s=e.indexOf(t);return e.map(((e,t)=>t===s?`${e} - ${n}`:e)).join()}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu.js ***! + \*******************************************************************************/ +/*! exports provided: Conv2DDerFilterProgram, Conv2DDerInputProgram, Conv3DDerFilterProgram, Conv3DDerInputProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"Conv2DDerFilterProgram",(function(){return s})),n.d(t,"Conv2DDerInputProgram",(function(){return o})),n.d(t,"Conv3DDerFilterProgram",(function(){return r})),n.d(t,"Conv3DDerInputProgram",(function(){return i})); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e){this.variableNames=["x","dy"],this.outputShape=e.filterShape;const t=e.strideHeight,n=e.strideWidth,s=e.padInfo.top,o=e.padInfo.left,r="channelsLast"===e.dataFormat;this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int wR = coords.x;\n int wC = coords.y;\n int d1 = coords.z;\n int d2 = coords.w;\n\n // Convolve x(?, ?, d1) with dy(:, :, d2) to get dw(wR, wC, d1, d2).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n\n for (int b = 0; b < ${e.batchSize}; b++) {\n for (int yR = 0; yR < ${e.outHeight}; yR++) {\n int xR = wR + yR * ${t} - ${s};\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int yC = 0; yC < ${e.outWidth}; yC++) {\n int xC = wC + yC * ${n} - ${o};\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n if (${r}) {\n float dyValue = getDy(b, yR, yC, d2);\n float xValue = getX(b, xR, xC, d1);\n dotProd += (xValue * dyValue);\n } else {\n float dyValue = getDy(b, d2, yR, yC);\n float xValue = getX(b, d1, xR, xC);\n dotProd += (xValue * dyValue);\n }\n\n }\n }\n }\n setOutput(dotProd);\n }\n `}}class o{constructor(e){this.variableNames=["dy","W"],this.outputShape=e.inShape;const t=e.filterHeight,n=e.filterWidth,s=e.strideHeight,o=e.strideWidth,r="channelsLast"===e.dataFormat,i=t-1-e.padInfo.top,a=n-1-e.padInfo.left,d=r?1:2,u=r?2:3,l=r?3:1;this.userCode=`\n const ivec2 pads = ivec2(${i}, ${a});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d1 = coords[${l}];\n\n ivec2 dyCorner = ivec2(coords[${d}], coords[${u}]) - pads;\n int dyRCorner = dyCorner.x;\n int dyCCorner = dyCorner.y;\n\n // Convolve dy(?, ?, d2) with w(:, :, d1, d2) to compute dx(xR, xC, d1).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < ${t}; wR++) {\n float dyR = float(dyRCorner + wR) / ${s}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n int wRPerm = ${t} - 1 - wR;\n\n for (int wC = 0; wC < ${n}; wC++) {\n float dyC = float(dyCCorner + wC) / ${o}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n int wCPerm = ${n} - 1 - wC;\n\n for (int d2 = 0; d2 < ${e.outChannels}; d2++) {\n\n if (${r}) {\n float xValue = getDy(batch, idyR, idyC, d2);\n float wValue = getW(wRPerm, wCPerm, d1, d2);\n dotProd += xValue * wValue;\n } else {\n float xValue = getDy(batch, d2, idyR, idyC);\n float wValue = getW(wRPerm, wCPerm, d1, d2);\n dotProd += xValue * wValue;\n }\n\n }\n }\n }\n setOutput(dotProd);\n }\n `}}class r{constructor(e){this.variableNames=["x","dy"],this.outputShape=e.filterShape;const t=e.strideDepth,n=e.strideHeight,s=e.strideWidth,o=e.padInfo.front,r=e.padInfo.top,i=e.padInfo.left;this.userCode=`\n void main() {\n ivec5 coords = getOutputCoords();\n int wF = coords.x;\n int wR = coords.y;\n int wC = coords.z;\n int d1 = coords.w;\n int d2 = coords.u;\n\n float dotProd = 0.0;\n\n for (int b = 0; b < ${e.batchSize}; b++) {\n for (int yF = 0; yF < ${e.outDepth}; yF++) {\n int xF = wF + yF * ${t} - ${o};\n\n if (xF < 0 || xF >= ${e.inDepth}) {\n continue;\n }\n\n for (int yR = 0; yR < ${e.outHeight}; yR++) {\n int xR = wR + yR * ${n} - ${r};\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int yC = 0; yC < ${e.outWidth}; yC++) {\n int xC = wC + yC * ${s} - ${i};\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n float dyValue = getDy(b, yF, yR, yC, d2);\n float xValue = getX(b, xF, xR, xC, d1);\n dotProd += (xValue * dyValue);\n }\n }\n }\n }\n setOutput(dotProd);\n }\n `}}class i{constructor(e){this.variableNames=["dy","W"],this.outputShape=e.inShape;const t=e.filterDepth,n=e.filterHeight,s=e.filterWidth,o=e.strideDepth,r=e.strideHeight,i=e.strideWidth,a=t-1-e.padInfo.front,d=n-1-e.padInfo.top,u=s-1-e.padInfo.left;this.userCode=`\n const ivec3 pads = ivec3(${a}, ${d}, ${u});\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int d1 = coords.u;\n\n\n ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads;\n int dyFCorner = dyCorner.x;\n int dyRCorner = dyCorner.y;\n int dyCCorner = dyCorner.z;\n\n float dotProd = 0.0;\n for (int wF = 0; wF < ${t}; wF++) {\n float dyF = float(dyFCorner + wF) / ${o}.0;\n\n if (dyF < 0.0 || dyF >= ${e.outDepth}.0 || fract(dyF) > 0.0) {\n continue;\n }\n int idyF = int(dyF);\n\n int wFPerm = ${t} - 1 - wF;\n\n for (int wR = 0; wR < ${n}; wR++) {\n float dyR = float(dyRCorner + wR) / ${r}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 ||\n fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n int wRPerm = ${n} - 1 - wR;\n\n for (int wC = 0; wC < ${s}; wC++) {\n float dyC = float(dyCCorner + wC) / ${i}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n int wCPerm = ${s} - 1 - wC;\n\n for (int d2 = 0; d2 < ${e.outChannels}; d2++) {\n float xValue = getDy(batch, idyF, idyR, idyC, d2);\n float wValue = getW(wFPerm, wRPerm, wCPerm, d1, d2);\n dotProd += xValue * wValue;\n }\n }\n }\n }\n setOutput(dotProd);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu_depthwise.js": +/*!*****************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu_depthwise.js ***! + \*****************************************************************************************/ +/*! exports provided: DepthwiseConv2DDerFilterProgram, DepthwiseConv2DDerInputProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"DepthwiseConv2DDerFilterProgram",(function(){return s})),n.d(t,"DepthwiseConv2DDerInputProgram",(function(){return o})); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e){this.variableNames=["x","dy"],this.outputShape=e.filterShape;const t=e.strideHeight,n=e.strideWidth,s=e.padInfo.top,o=e.padInfo.left,r=e.outChannels/e.inChannels;this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int wR = coords.x;\n int wC = coords.y;\n int d1 = coords.z;\n int dm = coords.w;\n int d2 = d1 * ${r} + dm;\n\n float dotProd = 0.0;\n\n // TO DO: Vec4 over the batch size\n for (int b = 0; b < ${e.batchSize}; b++) {\n for (int yR = 0; yR < ${e.outHeight}; yR++) {\n int xR = wR + yR * ${t} - ${s};\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int yC = 0; yC < ${e.outWidth}; yC++) {\n int xC = wC + yC * ${n} - ${o};\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n float dyValue = getDy(b, yR, yC, d2);\n float xValue = getX(b, xR, xC, d1);\n dotProd += (xValue * dyValue);\n }\n }\n }\n setOutput(dotProd);\n }\n `}}class o{constructor(e){this.variableNames=["dy","W"],this.outputShape=e.inShape;const t=e.filterHeight,n=e.filterWidth,s=e.strideHeight,o=e.strideWidth,r=t-1-e.padInfo.top,i=n-1-e.padInfo.left,a=e.outChannels/e.inChannels;this.userCode=`\n const ivec2 pads = ivec2(${r}, ${i});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d1 = coords[3];\n ivec2 dyCorner = coords.yz - pads;\n int dyRCorner = dyCorner.x;\n int dyCCorner = dyCorner.y;\n\n float dotProd = 0.0;\n\n for (int wR = 0; wR < ${t}; wR++) {\n float dyR = float(dyRCorner + wR) / ${s}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n int wRPerm = ${t} - 1 - wR;\n\n for (int wC = 0; wC < ${n}; wC++) {\n float dyC = float(dyCCorner + wC) / ${o}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n int wCPerm = ${n} - 1 - wC;\n\n // TO DO: Vec4 over the channelMul\n for (int dm = 0; dm < ${a}; dm++) {\n int d2 = d1 * ${a} + dm;\n float xValue = getDy(batch, idyR, idyC, d2);\n float wValue = getW(wRPerm, wCPerm, d1, dm);\n dotProd += xValue * wValue;\n }\n }\n }\n setOutput(dotProd);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_gpu.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_gpu.js ***! + \**********************************************************************/ +/*! exports provided: Conv2DProgram, Conv3DProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"Conv2DProgram",(function(){return s})),n.d(t,"Conv3DProgram",(function(){return o})); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e,t=!1,n=null,s=!1,o=!1){this.variableNames=["x","W"],this.outputShape=e.outShape;const r=e.padInfo.top,i=e.padInfo.left,a=e.strideHeight,d=e.strideWidth,u=e.dilationHeight,l=e.dilationWidth,c=e.filterHeight,f=e.filterWidth,p=4*Math.floor(e.inChannels/4),m=e.inChannels%4,h="channelsLast"===e.dataFormat,b=h?1:2,j=h?2:3,g=h?3:1;let w="",_="";n&&(w=s?`float activation(float a) {\n float b = getPreluActivationWeightsAtOutCoords();\n ${n}\n }`:o?`float activation(float a) {\n float b = getLeakyreluAlphaAtOutCoords();\n ${n}\n }`:`\n float activation(float x) {\n ${n}\n }\n `,_="result = activation(result);");const k=t?"result += getBiasAtOutCoords();":"";t&&this.variableNames.push("bias"),s&&this.variableNames.push("preluActivationWeights"),o&&this.variableNames.push("leakyreluAlpha"),this.userCode=`\n ${w}\n\n const ivec2 strides = ivec2(${a}, ${d});\n const ivec2 pads = ivec2(${r}, ${i});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d2 = coords[${g}];\n\n ivec2 xRCCorner =\n ivec2(coords[${b}], coords[${j}]) * strides - pads;\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // Convolve x(?, ?, d1) with w(:, :, d1, d2) to get y(yR, yC, d2).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < ${c}; wR++) {\n int xR = xRCorner + wR * ${u};\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${f}; wC++) {\n int xC = xCCorner + wC * ${l};\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n for (int d1 = 0; d1 < ${p}; d1 += 4) {\n vec4 wValues = vec4(\n getW(wR, wC, d1, d2),\n getW(wR, wC, d1 + 1, d2),\n getW(wR, wC, d1 + 2, d2),\n getW(wR, wC, d1 + 3, d2)\n );\n\n if (${h}) {\n vec4 xValues = vec4(\n getX(batch, xR, xC, d1),\n getX(batch, xR, xC, d1 + 1),\n getX(batch, xR, xC, d1 + 2),\n getX(batch, xR, xC, d1 + 3)\n );\n dotProd += dot(xValues, wValues);\n } else {\n vec4 xValues = vec4(\n getX(batch, d1, xR, xC),\n getX(batch, d1 + 1, xR, xC),\n getX(batch, d1 + 2, xR, xC),\n getX(batch, d1 + 3, xR, xC)\n );\n dotProd += dot(xValues, wValues);\n }\n }\n\n if (${1===m}) {\n\n if (${h}) {\n dotProd +=\n getX(batch, xR, xC, ${p}) *\n getW(wR, wC, ${p}, d2);\n } else {\n dotProd +=\n getX(batch, ${p}, xR, xC) *\n getW(wR, wC, ${p}, d2);\n }\n\n } else if (${2===m}) {\n vec2 wValues = vec2(\n getW(wR, wC, ${p}, d2),\n getW(wR, wC, ${p} + 1, d2)\n );\n\n if (${h}) {\n vec2 xValues = vec2(\n getX(batch, xR, xC, ${p}),\n getX(batch, xR, xC, ${p} + 1)\n );\n dotProd += dot(xValues, wValues);\n } else {\n vec2 xValues = vec2(\n getX(batch, ${p}, xR, xC),\n getX(batch, ${p} + 1, xR, xC)\n );\n dotProd += dot(xValues, wValues);\n }\n\n } else if (${3===m}) {\n vec3 wValues = vec3(\n getW(wR, wC, ${p}, d2),\n getW(wR, wC, ${p} + 1, d2),\n getW(wR, wC, ${p} + 2, d2)\n );\n\n if (${h}) {\n vec3 xValues = vec3(\n getX(batch, xR, xC, ${p}),\n getX(batch, xR, xC, ${p} + 1),\n getX(batch, xR, xC, ${p} + 2)\n );\n dotProd += dot(xValues, wValues);\n } else {\n vec3 xValues = vec3(\n getX(batch, ${p}, xR, xC),\n getX(batch, ${p} + 1, xR, xC),\n getX(batch, ${p} + 2, xR, xC)\n );\n dotProd += dot(xValues, wValues);\n }\n\n }\n }\n }\n\n float result = dotProd;\n ${k}\n ${_}\n setOutput(result);\n }\n `}}class o{constructor(e){this.variableNames=["x","W"],this.outputShape=e.outShape;const t=e.padInfo.front,n=e.padInfo.top,s=e.padInfo.left,o=e.strideDepth,r=e.strideHeight,i=e.strideWidth,a=e.dilationDepth,d=e.dilationHeight,u=e.dilationWidth,l=e.filterDepth,c=e.filterHeight,f=e.filterWidth,p=4*Math.floor(e.inChannels/4),m=e.inChannels%4;this.userCode=`\n const ivec3 strides = ivec3(${o}, ${r}, ${i});\n const ivec3 pads = ivec3(${t}, ${n}, ${s});\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int d2 = coords.u;\n\n ivec3 xFRCCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads;\n int xFCorner = xFRCCorner.x;\n int xRCorner = xFRCCorner.y;\n int xCCorner = xFRCCorner.z;\n\n // Convolve x(?, ?, ?, d1) with w(:, :, :, d1, d2) to get\n // y(yF, yR, yC, d2). ? = to be determined. : = across all\n // values in that axis.\n float dotProd = 0.0;\n for (int wF = 0; wF < ${l}; wF++) {\n int xF = xFCorner + wF * ${a};\n\n if (xF < 0 || xF >= ${e.inDepth}) {\n continue;\n }\n\n for (int wR = 0; wR < ${c}; wR++) {\n int xR = xRCorner + wR * ${d};\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${f}; wC++) {\n int xC = xCCorner + wC * ${u};\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n for (int d1 = 0; d1 < ${p}; d1 += 4) {\n vec4 xValues = vec4(\n getX(batch, xF, xR, xC, d1),\n getX(batch, xF, xR, xC, d1 + 1),\n getX(batch, xF, xR, xC, d1 + 2),\n getX(batch, xF, xR, xC, d1 + 3)\n );\n vec4 wValues = vec4(\n getW(wF, wR, wC, d1, d2),\n getW(wF, wR, wC, d1 + 1, d2),\n getW(wF, wR, wC, d1 + 2, d2),\n getW(wF, wR, wC, d1 + 3, d2)\n );\n\n dotProd += dot(xValues, wValues);\n }\n\n if (${1===m}) {\n dotProd +=\n getX(batch, xF, xR, xC, ${p}) *\n getW(wF, wR, wC, ${p}, d2);\n } else if (${2===m}) {\n vec2 xValues = vec2(\n getX(batch, xF, xR, xC, ${p}),\n getX(batch, xF, xR, xC, ${p} + 1)\n );\n vec2 wValues = vec2(\n getW(wF, wR, wC, ${p}, d2),\n getW(wF, wR, wC, ${p} + 1, d2)\n );\n dotProd += dot(xValues, wValues);\n } else if (${3===m}) {\n vec3 xValues = vec3(\n getX(batch, xF, xR, xC, ${p}),\n getX(batch, xF, xR, xC, ${p} + 1),\n getX(batch, xF, xR, xC, ${p} + 2)\n );\n vec3 wValues = vec3(\n getW(wF, wR, wC, ${p}, d2),\n getW(wF, wR, wC, ${p} + 1, d2),\n getW(wF, wR, wC, ${p} + 2, d2)\n );\n dotProd += dot(xValues, wValues);\n }\n }\n }\n }\n setOutput(dotProd);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_gpu_depthwise.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_gpu_depthwise.js ***! + \********************************************************************************/ +/*! exports provided: DepthwiseConv2DProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"DepthwiseConv2DProgram",(function(){return s})); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e,t=!1,n=null,s=!1,o=!1){this.variableNames=["x","W"],this.outputShape=e.outShape;const r=e.inHeight,i=e.inWidth,a=e.padInfo.top,d=e.padInfo.left,u=e.strideHeight,l=e.strideWidth,c=e.dilationHeight,f=e.dilationWidth,p=e.filterHeight,m=e.filterWidth,h=e.outChannels/e.inChannels;let b="",j="";n&&(b=s?`float activation(float a) {\n float b = getPreluActivationWeightsAtOutCoords();\n ${n}\n }`:o?`float activation(float a) {\n float b = getLeakyreluAlphaAtOutCoords();\n ${n}\n }`:`\n float activation(float x) {\n ${n}\n }\n `,j="result = activation(result);");const g=t?"result += getBiasAtOutCoords();":"";t&&this.variableNames.push("bias"),s&&this.variableNames.push("preluActivationWeights"),o&&this.variableNames.push("leakyreluAlpha"),this.userCode=`\n ${b}\n\n const ivec2 strides = ivec2(${u}, ${l});\n const ivec2 pads = ivec2(${a}, ${d});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords.x;\n ivec2 xRCCorner = coords.yz * strides - pads;\n int d2 = coords.w;\n int d1 = d2 / ${h};\n int q = d2 - d1 * ${h};\n\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // Convolve x(?, ?, d1) with w(:, :, d1, q) to get y(yR, yC, d2).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n // TO DO(dsmilkov): Flatten the two for loops and vec4 the operations.\n for (int wR = 0; wR < ${p}; wR++) {\n int xR = xRCorner + wR * ${c};\n\n if (xR < 0 || xR >= ${r}) {\n continue;\n }\n\n for (int wC = 0; wC < ${m}; wC++) {\n int xC = xCCorner + wC * ${f};\n\n if (xC < 0 || xC >= ${i}) {\n continue;\n }\n\n float xVal = getX(batch, xR, xC, d1);\n float wVal = getW(wR, wC, d1, q);\n dotProd += xVal * wVal;\n }\n }\n\n float result = dotProd;\n ${g}\n ${j}\n setOutput(result);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_packed_gpu_depthwise.js": +/*!***************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_packed_gpu_depthwise.js ***! + \***************************************************************************************/ +/*! exports provided: DepthwiseConvPacked2DProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"DepthwiseConvPacked2DProgram",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */class o{constructor(e,t=!1,n=null,o=!1,r=!1){this.variableNames=["x","W"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=e.outShape;const i=e.outChannels/e.inChannels,a=e.inHeight,d=e.inWidth,u=e.padInfo.top,l=e.padInfo.left,c=e.strideHeight,f=e.strideWidth,p=e.dilationHeight,m=e.dilationWidth,h=e.filterHeight,b=e.filterWidth,j=b;let g="\n int xR; int xC; int xCOffset;\n vec4 wTexel; vec4 previous; vec4 final;";for(let e=0;e=0 && xR < ${a}) {\n `;for(let t=0;t<(j+1)/2;t++){const n=2*t,o=n*m;if(g+=`\n xC = xCCorner + ${o};\n `,1===f){if(n= 0 && xCOffset < ${d} && xTexelC${n}Ready == 0) {\n xTexelC${n} = getX(batch, xR, xCOffset, d1);\n\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= ${d}) {\n xTexelC${n}.zw = vec2(0.0);\n }\n xTexelC${n}Ready = 1;\n }\n `,g+=1===m&&o>0?`\n xC${n} = vec4(xTexelC${n-2}.zw, xTexelC${n}.xy);\n `:`\n xCOffset = xC + 1 - 2;\n\n if (xCOffset >= 0 && xCOffset < ${d}) {\n previous = getX(batch, xR, xCOffset, d1);\n\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= ${d}) {\n previous.zw = vec2(0.0);\n }\n\n xC${n} = vec4(previous.zw, xTexelC${n}.xy);\n } else {\n xC${n} = vec4(0.0, 0.0, xTexelC${n}.xy);\n }\n `):g+=`\n if (xC >= 0 && xC < ${d} && xTexelC${n}Ready == 0) {\n xTexelC${n} = getX(batch, xR, xC, d1);\n if (xC + 1 >= ${d}) {\n xTexelC${n}.zw = vec2(0.0);\n }\n xTexelC${n}Ready = 1;\n }\n\n xC${n} = xTexelC${n};\n `,o+1= 0 && xCOffset < ${d} && xTexelC${n+1}Ready == 0) {\n xTexelC${n+1} = getX(batch, xR, xCOffset, d1);\n\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= ${d}) {\n xTexelC${n+1}.zw = vec2(0.0);\n }\n xTexelC${n+1}Ready = 1;\n }\n `,m>1&&(g+=`\n xCOffset -= 2;\n if (xCOffset >= 0 && xCOffset < ${d} && xTexelC${n}Ready == 0) {\n xTexelC${n} = getX(batch, xR, xCOffset, d1);\n xTexelC${n}Ready = 1;\n }\n `),g+=`\n xC${n+1} = vec4(xTexelC${n}.zw, xTexelC${n+1}.xy);\n `):g+=1===e?`\n xC${n+1} = xTexelC${n};\n `:`\n xCOffset = xC + ${e};\n\n if (xCOffset >= 0 && xCOffset < ${d} && xTexelC${n+1}Ready == 0) {\n xTexelC${n+1} = getX(batch, xR, xCOffset, d1);\n if (xCOffset + 1 >= ${d}) {\n xTexelC${n+1}.zw = vec2(0.0);\n }\n xTexelC${n+1}Ready = 1;\n }\n\n xC${n+1} = xTexelC${n+1};\n `}}else o= 0 && xCOffset < ${d} && xTexelC${n}Ready == 0) {\n xTexelC${n} = getX(batch, xR, xCOffset, d1);\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= ${d}) {\n xTexelC${n}.zw = vec2(0.0);\n }\n xTexelC${n}Ready = 1;\n }\n\n if(xC + 1 >= 0 && xC + 1 < ${d} && xTexelC${n+1}Ready == 0) {\n xTexelC${n+1} = getX(batch, xR, xC + 1, d1);\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xC + 2 >= ${d}) {\n xTexelC${n+1}.zw = vec2(0.0);\n }\n xTexelC${n+1}Ready = 1;\n }\n\n xC${n} = vec4(xTexelC${n}.zw, xTexelC${n+1}.zw);\n `,o+1= 0 && xCOffset < ${d}) {\n final = getX(batch, xR, xCOffset, d1);\n }\n xC${n+1} = vec4(xTexelC${n+1}.xy, final.xy);\n `)):(g+=`\n if(xC >= 0 && xC < ${d} && xTexelC${n}Ready == 0) {\n xTexelC${n} = getX(batch, xR, xC, d1);\n if (xC + 1 >= ${d}) {\n xTexelC${n}.zw = vec2(0.0);\n }\n xTexelC${n}Ready = 1;\n }\n\n xCOffset = xC + ${f};\n if(xCOffset >= 0 && xCOffset < ${d} && xTexelC${n+1}Ready == 0) {\n xTexelC${n+1} = getX(batch, xR, xCOffset, d1);\n if (xCOffset + 1 >= ${d}) {\n xTexelC${n+1}.zw = vec2(0.);\n }\n xTexelC${n+1}Ready = 1;\n }\n\n xC${n} = vec4(\n xTexelC${n}.xy, xTexelC${n+1}.xy);\n `,o+11?[""+(i-1)/(l-1),"(y2-y1) * height_ratio",`y1*${p} + float(y)*(height_scale)`]:["0.0","0.0",`0.5 * (y1+y2) * ${p}`],[g,w,_]=c>1?[""+(a-1)/(c-1),"(x2-x1) * width_ratio",`x1*${m} + float(x)*(width_scale)`]:["0.0","0.0",`0.5 * (x1+x2) * ${m}`];this.userCode=`\n const float height_ratio = float(${h});\n const float width_ratio = float(${g});\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int y = coords[1];\n int x = coords[2];\n int d = coords[3];\n\n // get box vals\n float y1 = getBoxes(b,0);\n float x1 = getBoxes(b,1);\n float y2 = getBoxes(b,2);\n float x2 = getBoxes(b,3);\n\n // get image in batch index\n int bInd = round(getBoxInd(b));\n if(bInd < 0 || bInd >= ${r}) {\n return;\n }\n\n float height_scale = ${b};\n float width_scale = ${w};\n\n float in_y = ${j};\n if( in_y < 0.0 || in_y > ${p} ) {\n setOutput(float(${o}));\n return;\n }\n float in_x = ${_};\n if( in_x < 0.0 || in_x > ${m} ) {\n setOutput(float(${o}));\n return;\n }\n\n vec2 sourceFracIndexCR = vec2(in_x,in_y);\n if(${f} == 1) {\n // Compute the four integer indices.\n ivec2 sourceFloorCR = ivec2(sourceFracIndexCR);\n ivec2 sourceCeilCR = ivec2(ceil(sourceFracIndexCR));\n\n float topLeft = getImage(b, sourceFloorCR.y, sourceFloorCR.x, d);\n float bottomLeft = getImage(b, sourceCeilCR.y, sourceFloorCR.x, d);\n float topRight = getImage(b, sourceFloorCR.y, sourceCeilCR.x, d);\n float bottomRight = getImage(b, sourceCeilCR.y, sourceCeilCR.x, d);\n\n vec2 fracCR = sourceFracIndexCR - vec2(sourceFloorCR);\n\n float top = topLeft + (topRight - topLeft) * fracCR.x;\n float bottom = bottomLeft + (bottomRight - bottomLeft) * fracCR.x;\n float newValue = top + (bottom - top) * fracCR.y;\n setOutput(newValue);\n } else {\n // Compute the coordinators of nearest neighbor point.\n ivec2 sourceNearestCR = ivec2(floor(\n sourceFracIndexCR + vec2(0.5,0.5)));\n float newValue = getImage(b, sourceNearestCR.y, sourceNearestCR.x, d);\n setOutput(newValue);\n }\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/cumsum_gpu.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/cumsum_gpu.js ***! + \************************************************************************/ +/*! exports provided: CumSumProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"CumSumProgram",(function(){return o}));var s=n(/*! ./shader_compiler */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js");class o{constructor(e,t,n){this.variableNames=["x"],this.customUniforms=[{name:"index",type:"float"}],this.outputShape=e;const o=e.length,a=t?"0.0":`getX(${r(o,"coords")})`,d=e[e.length-1];let u="",l="";t?(u=n?"end != "+(d-1):"end != 0",l=n?"end + 1":"end - 1"):(u=n?`end + pow2 < ${d}`:"end >= pow2",l=n?"end + pow2":"end - pow2"),this.userCode=`\n void main() {\n ${Object(s.getCoordsDataType)(o)} coords = getOutputCoords();\n int end = ${i(o,"coords")};\n float val = ${a};\n int pow2 = int(pow(2.0, index));\n if (${u}) {\n int idx = ${l};\n ${i(o,"coords")} = idx;\n val += getX(${r(o,"coords")});\n }\n setOutput(val);\n }\n `}}function r(e,t){if(1===e)return`${t}`;if(2===e)return`${t}.x, ${t}.y`;if(3===e)return`${t}.x, ${t}.y, ${t}.z`;if(4===e)return`${t}.x, ${t}.y, ${t}.z, ${t}.w`;throw Error(`Cumulative sum for rank ${e} is not yet supported`)}function i(e,t){if(1===e)return`${t}`;if(2===e)return`${t}.y`;if(3===e)return`${t}.z`;if(4===e)return`${t}.w`;throw Error(`Cumulative sum for rank ${e} is not yet supported`)}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/decode_matrix_gpu.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/decode_matrix_gpu.js ***! + \*******************************************************************************/ +/*! exports provided: DecodeMatrixProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"DecodeMatrixProgram",(function(){return i}));var s=n(/*! ./glsl_version */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"),o=n(/*! ./shader_compiler_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js"),r=n(/*! ./tex_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/tex_util.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class i{constructor(e){this.variableNames=["A"],this.packedInputs=!1,this.packedOutput=!0,this.outPackingScheme=r.PackingScheme.DENSE;const t=Object(r.getDenseTexShape)(e),n=Object(s.getGlslDifferences)();this.outputShape=e,this.userCode=`\n ivec3 outCoordsFromFlatIndex(int index) {\n ${o.getLogicalCoordinatesFromFlatIndex(["r","c","d"],e)}\n return ivec3(r, c, d);\n }\n\n void main() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(${t[0]}, ${t[1]}));\n int index = 4 * (resTexRC.x * ${t[1]} + resTexRC.y);\n\n vec4 result = vec4(0.);\n\n for (int i=0; i<4; i++) {\n int flatIndex = index + i;\n ivec3 rc = outCoordsFromFlatIndex(flatIndex);\n result[i] = getA(rc.x, rc.y, rc.z);\n }\n\n ${n.output} = result;\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/decode_matrix_packed_gpu.js": +/*!**************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/decode_matrix_packed_gpu.js ***! + \**************************************************************************************/ +/*! exports provided: DecodeMatrixPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"DecodeMatrixPackedProgram",(function(){return i}));var s=n(/*! ./glsl_version */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"),o=n(/*! ./shader_compiler_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js"),r=n(/*! ./tex_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/tex_util.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class i{constructor(e){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outPackingScheme=r.PackingScheme.DENSE;const t=Object(r.getDenseTexShape)(e),n=Object(s.getGlslDifferences)();this.outputShape=e,this.userCode=`\n ivec3 outCoordsFromFlatIndex(int index) {\n ${o.getLogicalCoordinatesFromFlatIndex(["r","c","d"],e)}\n return ivec3(r, c, d);\n }\n\n void main() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(${t[0]}, ${t[1]}));\n int index = 4 * (resTexRC.x * ${t[1]} + resTexRC.y);\n\n vec4 result = vec4(0.);\n\n for (int i=0; i<4; i++) {\n int flatIndex = index + i;\n ivec3 rc = outCoordsFromFlatIndex(flatIndex);\n result[i] = getChannel(getA(rc.x, rc.y, rc.z), vec2(rc.y, rc.z));\n }\n\n ${n.output} = result;\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/depth_to_space_gpu.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/depth_to_space_gpu.js ***! + \********************************************************************************/ +/*! exports provided: DepthToSpaceProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"DepthToSpaceProgram",(function(){return s})); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e,t,n){this.variableNames=["x"],this.outputShape=[],this.outputShape=e,this.blockSize=t,this.dataFormat=n,this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int h = ${this.getHeightCoordString()};\n int w = ${this.getWidthCoordString()};\n int d = ${this.getDepthCoordString()};\n\n int in_h = h / ${t};\n int offset_h = imod(h, ${t});\n int in_w = w / ${t};\n int offset_w = imod(w, ${t});\n int offset_d = (offset_h * ${t} + offset_w) *\n ${this.getOutputDepthSize()};\n int in_d = d + offset_d;\n\n float result = ${this.getInputSamplingString()};\n setOutput(result);\n }\n `}getHeightCoordString(){return"NHWC"===this.dataFormat?"coords[1]":"coords[2]"}getWidthCoordString(){return"NHWC"===this.dataFormat?"coords[2]":"coords[3]"}getDepthCoordString(){return"NHWC"===this.dataFormat?"coords[3]":"coords[1]"}getOutputDepthSize(){return"NHWC"===this.dataFormat?this.outputShape[3]:this.outputShape[1]}getInputSamplingString(){return"NHWC"===this.dataFormat?"getX(b, in_h, in_w, in_d)":"getX(b, in_d, in_h, in_w)"}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/diag_gpu.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/diag_gpu.js ***! + \**********************************************************************/ +/*! exports provided: DiagProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"DiagProgram",(function(){return s})); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e){this.variableNames=["X"],this.outputShape=[e,e],this.userCode="\n void main() {\n ivec2 coords = getOutputCoords();\n float val = coords[0] == coords[1] ? getX(coords[0]) : 0.0;\n setOutput(val);\n }\n "}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/dilation_gpu.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/dilation_gpu.js ***! + \**************************************************************************/ +/*! exports provided: Dilation2DProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"Dilation2DProgram",(function(){return s})); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e){this.variableNames=["x","W"],this.outputShape=e.outShape;const{inHeight:t,inWidth:n,padInfo:s,strideHeight:o,strideWidth:r,filterHeight:i,filterWidth:a,dilationHeight:d,dilationWidth:u}=e,{top:l,left:c}=s;this.userCode=`\n const ivec2 strides = ivec2(${o}, ${r});\n const ivec2 pads = ivec2(${l}, ${c});\n const float neg_infinity = -3.4e38;\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords.x;\n int d1 = coords.w;\n ivec2 outTopLeftCorner =\n coords.yz * strides - pads;\n int hBeg = outTopLeftCorner.x;\n int wBeg = outTopLeftCorner.y;\n\n float curVal = neg_infinity;\n for (int h = 0; h < ${i}; h++) {\n int hIn = hBeg + h * ${d};\n\n if (hIn >= 0 && hIn < ${t}) {\n for (int w = 0; w < ${a}; w++) {\n int wIn = wBeg + w * ${u};\n\n if (wIn >= 0 && wIn < ${n}) {\n float xVal = getX(batch, hIn, wIn, d1);\n float wVal = getW(h, w, d1);\n\n float val = xVal + wVal;\n if (val > curVal) {\n curVal = val;\n }\n }\n }\n }\n }\n\n float result = curVal;\n setOutput(result);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_float_gpu.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_float_gpu.js ***! + \******************************************************************************/ +/*! exports provided: EncodeFloatProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"EncodeFloatProgram",(function(){return i}));var s=n(/*! ./glsl_version */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"),o=n(/*! ./shader_compiler_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js"),r=n(/*! ./tex_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/tex_util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class i{constructor(e){this.variableNames=["A"],this.outTexUsage=r.TextureUsage.DOWNLOAD;const t=Object(s.getGlslDifferences)();this.outputShape=e,this.userCode=`\n ${o.ENCODE_FLOAT_SNIPPET}\n\n void main() {\n float x = getAAtOutCoords();\n ${t.output} = encode_float(x);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_float_packed_gpu.js": +/*!*************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_float_packed_gpu.js ***! + \*************************************************************************************/ +/*! exports provided: EncodeFloatPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"EncodeFloatPackedProgram",(function(){return i}));var s=n(/*! ./glsl_version */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"),o=n(/*! ./shader_compiler_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js"),r=n(/*! ./tex_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/tex_util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class i{constructor(e){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!1,this.outTexUsage=r.TextureUsage.DOWNLOAD;const t=Object(s.getGlslDifferences)();this.outputShape=e,this.userCode=`\n ${o.ENCODE_FLOAT_SNIPPET}\n\n void main() {\n ivec3 coords = getOutputCoords();\n float x = getChannel(getAAtOutCoords(), vec2(coords.y, coords.z));\n ${t.output} = encode_float(x);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_matrix_gpu.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_matrix_gpu.js ***! + \*******************************************************************************/ +/*! exports provided: EncodeMatrixProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"EncodeMatrixProgram",(function(){return r}));var s=n(/*! ./glsl_version */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"),o=n(/*! ./shader_compiler_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class r{constructor(e,t,n=!1){this.variableNames=["A"];const r=Object(s.getGlslDifferences)(),[i,a]=t;this.outputShape=e;let d="result";n&&(d="floor(result * 255. + 0.5)"),this.userCode=`\n ${o.getFlatIndexFrom3D(e)}\n\n void main() {\n ivec3 coords = getOutputCoords();\n\n int flatIndex = getFlatIndex(coords);\n int offset = imod(flatIndex, 4);\n\n flatIndex = idiv(flatIndex, 4, 1.);\n\n int r = flatIndex / ${a};\n int c = imod(flatIndex, ${a});\n vec2 uv = (vec2(c, r) + halfCR) / vec2(${a}.0, ${i}.0);\n vec4 values = ${r.texture2D}(A, uv);\n\n float result;\n\n if(offset == 0) {\n result = values[0];\n } else if(offset == 1) {\n result = values[1];\n } else if(offset == 2) {\n result = values[2];\n } else {\n result = values[3];\n }\n\n ${r.output} = vec4(${d}, 0., 0., 0.);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_matrix_packed_gpu.js": +/*!**************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_matrix_packed_gpu.js ***! + \**************************************************************************************/ +/*! exports provided: EncodeMatrixPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"EncodeMatrixPackedProgram",(function(){return r}));var s=n(/*! ./glsl_version */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"),o=n(/*! ./shader_compiler_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class r{constructor(e,t,n=!1){this.variableNames=["A"],this.packedInputs=!1,this.packedOutput=!0;const r=Object(s.getGlslDifferences)(),[i,a]=t;this.outputShape=e;let d="",u="result";n&&(u="floor(result * 255. + 0.5)");for(let t=0;t<=1;t++)for(let n=0;n<=1;n++){const s=2*t+n;d+=`\n localCoords = coords;\n if(localCoords[2] + ${n} < ${e[2]}) {\n localCoords[2] += ${n};\n if(localCoords[1] + ${t} < ${e[1]}) {\n localCoords[1] += ${t};\n\n flatIndex = getFlatIndex(localCoords);\n offset = imod(flatIndex, 4);\n\n flatIndex = idiv(flatIndex, 4, 1.);\n\n r = flatIndex / ${a};\n c = imod(flatIndex, ${a});\n uv = (vec2(c, r) + halfCR) / vec2(${a}.0, ${i}.0);\n values = ${r.texture2D}(A, uv);\n\n if(offset == 0) {\n result[${s}] = values[0];\n } else if(offset == 1) {\n result[${s}] = values[1];\n } else if(offset == 2) {\n result[${s}] = values[2];\n } else {\n result[${s}] = values[3];\n }\n }\n }\n `}this.userCode=`\n ${o.getFlatIndexFrom3D(e)}\n\n void main() {\n ivec3 coords = getOutputCoords();\n\n vec4 result = vec4(0.);\n int flatIndex, r, c, offset;\n ivec3 localCoords;\n vec2 uv;\n vec4 values;\n\n ${d}\n\n ${r.output} = ${u};\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/fft_gpu.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/fft_gpu.js ***! + \*********************************************************************/ +/*! exports provided: FFTProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"FFTProgram",(function(){return s})); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e,t,n){this.variableNames=["real","imag"];const s=t[1];this.outputShape=t;const o=n?`2.0 * ${Math.PI}`:`-2.0 * ${Math.PI}`,r=n?`${s}.0`:"1.0";let i;if("real"===e)i="return real * expR - imag * expI;";else{if("imag"!==e)throw new Error(`FFT component must be either "real" or "imag", got ${e}.`);i="return real * expI + imag * expR;"}this.userCode=`\n const float exponentMultiplier = ${o};\n\n float unaryOpComplex(float real, float expR, float imag, float expI) {\n ${i}\n }\n\n float mulMatDFT(int batch, int index) {\n float indexRatio = float(index) / float(${s});\n float exponentMultiplierTimesIndexRatio =\n exponentMultiplier * indexRatio;\n\n float result = 0.0;\n\n for (int i = 0; i < ${s}; i++) {\n // x = (-2|2 * PI / N) * index * i;\n float x = exponentMultiplierTimesIndexRatio * float(i);\n float expR = cos(x);\n float expI = sin(x);\n float real = getReal(batch, i);\n float imag = getImag(batch, i);\n\n result +=\n unaryOpComplex(real, expR, imag, expI) / ${r};\n }\n\n return result;\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n setOutput(mulMatDFT(coords[0], coords[1]));\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/fill_gpu.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/fill_gpu.js ***! + \**********************************************************************/ +/*! exports provided: FillProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"FillProgram",(function(){return s})); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e,t){this.outputShape=[],this.customUniforms=[{name:"value",type:"float"}],this.variableNames=["x"],this.outputShape=e,this.userCode="\n void main() {\n // Input can be obtained from uniform value.\n setOutput(value);\n }\n "}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/flags_webgl.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/flags_webgl.js ***! + \*************************************************************************/ +/*! no exports provided */function(e,t,n){"use strict";n.r(t);var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./webgl_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(s.env)();r.registerFlag("HAS_WEBGL",(()=>r.getNumber("WEBGL_VERSION")>0)),r.registerFlag("WEBGL_VERSION",(()=>Object(o.isWebGLVersionEnabled)(2)?2:Object(o.isWebGLVersionEnabled)(1)?1:0)),r.registerFlag("WEBGL_CHECK_NUMERICAL_PROBLEMS",(()=>!1)),r.registerFlag("WEBGL_BUFFER_SUPPORTED",(()=>2===r.get("WEBGL_VERSION"))),r.registerFlag("WEBGL_CPU_FORWARD",(()=>!0)),r.registerFlag("WEBGL_FORCE_F16_TEXTURES",(()=>!1)),r.registerFlag("WEBGL_PACK",(()=>r.getBool("HAS_WEBGL"))),r.registerFlag("WEBGL_PACK_NORMALIZATION",(()=>r.getBool("WEBGL_PACK"))),r.registerFlag("WEBGL_PACK_CLIP",(()=>r.getBool("WEBGL_PACK"))),r.registerFlag("WEBGL_PACK_DEPTHWISECONV",(()=>r.getBool("WEBGL_PACK"))),r.registerFlag("WEBGL_PACK_BINARY_OPERATIONS",(()=>r.getBool("WEBGL_PACK"))),r.registerFlag("WEBGL_PACK_UNARY_OPERATIONS",(()=>r.getBool("WEBGL_PACK"))),r.registerFlag("WEBGL_PACK_ARRAY_OPERATIONS",(()=>r.getBool("WEBGL_PACK"))),r.registerFlag("WEBGL_PACK_IMAGE_OPERATIONS",(()=>r.getBool("WEBGL_PACK"))),r.registerFlag("WEBGL_PACK_REDUCE",(()=>r.getBool("WEBGL_PACK"))),r.registerFlag("WEBGL_LAZILY_UNPACK",(()=>r.getBool("WEBGL_PACK"))),r.registerFlag("WEBGL_CONV_IM2COL",(()=>r.getBool("WEBGL_PACK"))),r.registerFlag("WEBGL_MAX_TEXTURE_SIZE",(()=>Object(o.getWebGLMaxTextureSize)(r.getNumber("WEBGL_VERSION")))),r.registerFlag("WEBGL_MAX_TEXTURES_IN_SHADER",(()=>Object(o.getMaxTexturesInShader)(r.getNumber("WEBGL_VERSION")))),r.registerFlag("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION",(()=>{const e=r.getNumber("WEBGL_VERSION");return 0===e?0:Object(o.getWebGLDisjointQueryTimerVersion)(e)})),r.registerFlag("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE",(()=>r.getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")>0&&!s.device_util.isMobile())),r.registerFlag("WEBGL_RENDER_FLOAT32_CAPABLE",(()=>Object(o.isCapableOfRenderingToFloatTexture)(r.getNumber("WEBGL_VERSION")))),r.registerFlag("WEBGL_RENDER_FLOAT32_ENABLED",(()=>!r.getBool("WEBGL_FORCE_F16_TEXTURES")&&r.getBool("WEBGL_RENDER_FLOAT32_CAPABLE"))),r.registerFlag("WEBGL_DOWNLOAD_FLOAT_ENABLED",(()=>Object(o.isDownloadFloatTextureEnabled)(r.getNumber("WEBGL_VERSION")))),r.registerFlag("WEBGL_FENCE_API_ENABLED",(()=>Object(o.isWebGLFenceEnabled)(r.getNumber("WEBGL_VERSION")))),r.registerFlag("WEBGL_SIZE_UPLOAD_UNIFORM",(()=>r.getBool("WEBGL_RENDER_FLOAT32_ENABLED")?4:0)),r.registerFlag("WEBGL_DELETE_TEXTURE_THRESHOLD",(()=>-1),(e=>{if(e<0&&-1!==e)throw new Error(`WEBGL_DELETE_TEXTURE_THRESHOLD must be -1 (indicating never delete) or at least 0, but got ${e}.`)})),r.registerFlag("WEBGL_FLUSH_THRESHOLD",(()=>s.device_util.isMobile()&&r.getBool("IS_CHROME")?1:-1),(e=>{if(e<0&&-1!==e)throw new Error(`WEBGL_FLUSH_THRESHOLD must be -1 (indicating never manual flush) or at least 0, but got ${e}.`)})),r.registerFlag("CPU_HANDOFF_SIZE_THRESHOLD",(()=>128)),r.registerFlag("WEBGL_USE_SHAPES_UNIFORMS",(()=>!1)),r.registerFlag("TOPK_LAST_DIM_CPU_HANDOFF_SIZE_THRESHOLD",(()=>1e5)),r.registerFlag("TOPK_K_CPU_HANDOFF_THRESHOLD",(()=>128))},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/flip_left_right_gpu.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/flip_left_right_gpu.js ***! + \*********************************************************************************/ +/*! exports provided: FlipLeftRightProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"FlipLeftRightProgram",(function(){return s})); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e){this.variableNames=["Image"],this.outputShape=[];const t=e[2];this.outputShape=e,this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int x = coords[2];\n\n int coordX = ${t} - x - 1;\n float outputValue;\n if(coordX >= 0 && coordX < ${t}) {\n outputValue = getImage(coords[0], coords[1], coordX, coords[3]);\n } else {\n outputValue = getImage(coords[0], coords[1], coords[2], coords[3]);\n }\n setOutput(outputValue);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/gather_gpu.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/gather_gpu.js ***! + \************************************************************************/ +/*! exports provided: GatherProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"GatherProgram",(function(){return o}));var s=n(/*! ./shader_compiler */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */class o{constructor(e,t){this.variableNames=["A","indices"],this.outputShape=t,this.rank=t.length;const n=Object(s.getCoordsDataType)(this.rank),o=function(e,t){const n=["resRC.x","resRC.y","resRC.z","resRC.w"],s=[];for(let t=0;t1?"strides[j]":"strides";this.userCode=`\n ${o} strides = ${o}(${this.strides});\n void main() {\n ${r} coords = getOutputCoords();\n int flattenIndex = 0;\n for (int j = 0; j < ${this.sliceDim}; j++) {\n int index = round(getIndices(coords[0], j));\n flattenIndex += index * ${i};\n }\n setOutput(getX(flattenIndex, coords[1]));\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js ***! + \**************************************************************************/ +/*! exports provided: getGlslDifferences */function(e,t,n){"use strict";n.r(t),n.d(t,"getGlslDifferences",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(){let e,t,n,o,r,i,a,d,u,l;return 2===Object(s.env)().getNumber("WEBGL_VERSION")?(e="#version 300 es",t="in",n="out",o="in",r="texture",i="outputColor",a="out vec4 outputColor;",d="\n bool isnan_custom(float val) {\n return (val > 0.0 || val < 0.0) ? false : val != 0.0;\n }\n\n bvec4 isnan_custom(vec4 val) {\n return bvec4(isnan_custom(val.x),\n isnan_custom(val.y), isnan_custom(val.z), isnan_custom(val.w));\n }\n\n #define isnan(value) isnan_custom(value)\n ",u="",l="\n #define round(value) newRound(value)\n int newRound(float value) {\n return int(floor(value + 0.5));\n }\n\n ivec4 newRound(vec4 value) {\n return ivec4(floor(value + vec4(0.5)));\n }\n "):(e="",t="attribute",n="varying",o="varying",r="texture2D",i="gl_FragColor",a="",d="\n #define isnan(value) isnan_custom(value)\n bool isnan_custom(float val) {\n return (val > 0. || val < 1. || val == 0.) ? false : true;\n }\n bvec4 isnan_custom(vec4 val) {\n return bvec4(isnan(val.x), isnan(val.y), isnan(val.z), isnan(val.w));\n }\n ",u="\n uniform float INFINITY;\n\n bool isinf(float val) {\n return abs(val) == INFINITY;\n }\n bvec4 isinf(vec4 val) {\n return equal(abs(val), vec4(INFINITY));\n }\n ",l="\n int round(float value) {\n return int(floor(value + 0.5));\n }\n\n ivec4 round(vec4 value) {\n return ivec4(floor(value + vec4(0.5)));\n }\n "),{version:e,attribute:t,varyingVs:n,varyingFs:o,texture2D:r,output:i,defineOutput:a,defineSpecialNaN:d,defineSpecialInf:u,defineRound:l}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/gpgpu_context.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/gpgpu_context.js ***! + \***************************************************************************/ +/*! exports provided: GPGPUContext, linearSearchLastTrue */function(e,t,n){"use strict";n.r(t),n.d(t,"GPGPUContext",(function(){return d})),n.d(t,"linearSearchLastTrue",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./canvas_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/canvas_util.js"),r=n(/*! ./gpgpu_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/gpgpu_util.js"),i=n(/*! ./tex_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/tex_util.js"),a=n(/*! ./webgl_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class d{constructor(e){this.outputTexture=null,this.program=null,this.disposed=!1,this.vertexAttrsAreBound=!1,this.itemsToPoll=[];const t=Object(s.env)().getNumber("WEBGL_VERSION");null!=e?(this.gl=e,Object(o.setWebGLContext)(t,e)):this.gl=Object(o.getWebGLContext)(t);let n="WEBGL_color_buffer_float";const d="EXT_color_buffer_half_float";if(1===Object(s.env)().getNumber("WEBGL_VERSION")){const e="OES_texture_float",t="OES_texture_half_float";if(this.textureFloatExtension=a.getExtensionOrThrow(this.gl,e),a.hasExtension(this.gl,t))this.textureHalfFloatExtension=a.getExtensionOrThrow(this.gl,t);else if(Object(s.env)().get("WEBGL_FORCE_F16_TEXTURES"))throw new Error("GL context does not support half float textures, yet the environment flag WEBGL_FORCE_F16_TEXTURES is set to true.");if(this.colorBufferFloatExtension=this.gl.getExtension(n),a.hasExtension(this.gl,d))this.colorBufferHalfFloatExtension=a.getExtensionOrThrow(this.gl,d);else if(Object(s.env)().get("WEBGL_FORCE_F16_TEXTURES"))throw new Error("GL context does not support color renderable half floats, yet the environment flag WEBGL_FORCE_F16_TEXTURES is set to true.")}else if(n="EXT_color_buffer_float",a.hasExtension(this.gl,n))this.colorBufferFloatExtension=this.gl.getExtension(n);else{if(!a.hasExtension(this.gl,d))throw new Error("GL context does not support color renderable floats");this.colorBufferHalfFloatExtension=this.gl.getExtension(d)}this.vertexBuffer=r.createVertexBuffer(this.gl),this.indexBuffer=r.createIndexBuffer(this.gl),this.framebuffer=a.createFramebuffer(this.gl),this.textureConfig=i.getTextureConfig(this.gl,this.textureHalfFloatExtension)}get debug(){return Object(s.env)().getBool("DEBUG")}dispose(){if(this.disposed)return;null!=this.program&&console.warn("Disposing a GPGPUContext that still has a bound WebGLProgram. This is probably a resource leak, delete the program with GPGPUContext.deleteProgram before disposing."),null!=this.outputTexture&&console.warn("Disposing a GPGPUContext that still has a bound output matrix texture. This is probably a resource leak, delete the output matrix texture with GPGPUContext.deleteMatrixTexture before disposing.");const e=this.gl;a.callAndCheck(e,(()=>e.finish())),a.callAndCheck(e,(()=>e.bindFramebuffer(e.FRAMEBUFFER,null))),a.callAndCheck(e,(()=>e.deleteFramebuffer(this.framebuffer))),a.callAndCheck(e,(()=>e.bindBuffer(e.ARRAY_BUFFER,null))),a.callAndCheck(e,(()=>e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,null))),a.callAndCheck(e,(()=>e.deleteBuffer(this.indexBuffer))),this.disposed=!0}createFloat32MatrixTexture(e,t){return this.throwIfDisposed(),r.createFloat32MatrixTexture(this.gl,e,t,this.textureConfig)}createFloat16MatrixTexture(e,t){return this.throwIfDisposed(),r.createFloat16MatrixTexture(this.gl,e,t,this.textureConfig)}createUnsignedBytesMatrixTexture(e,t){return this.throwIfDisposed(),r.createUnsignedBytesMatrixTexture(this.gl,e,t,this.textureConfig)}uploadPixelDataToTexture(e,t){this.throwIfDisposed(),r.uploadPixelDataToTexture(this.gl,e,t)}uploadDenseMatrixToTexture(e,t,n,s){this.throwIfDisposed(),r.uploadDenseMatrixToTexture(this.gl,e,t,n,s,this.textureConfig)}createFloat16PackedMatrixTexture(e,t){return this.throwIfDisposed(),r.createFloat16PackedMatrixTexture(this.gl,e,t,this.textureConfig)}createPackedMatrixTexture(e,t){return this.throwIfDisposed(),r.createPackedMatrixTexture(this.gl,e,t,this.textureConfig)}deleteMatrixTexture(e){this.throwIfDisposed(),this.outputTexture===e&&(a.unbindColorTextureFromFramebuffer(this.gl,this.framebuffer),this.outputTexture=null),a.callAndCheck(this.gl,(()=>this.gl.deleteTexture(e)))}downloadByteEncodedFloatMatrixFromOutputTexture(e,t,n){return this.downloadMatrixDriver(e,(()=>r.downloadByteEncodedFloatMatrixFromOutputTexture(this.gl,t,n,this.textureConfig)))}downloadPackedMatrixFromBuffer(e,t,n,s,o,i){return r.downloadPackedMatrixFromBuffer(this.gl,e,t,n,s,o,i,this.textureConfig)}downloadFloat32MatrixFromBuffer(e,t){return r.downloadFloat32MatrixFromBuffer(this.gl,e,t)}createBufferFromTexture(e,t,n){this.bindTextureToFrameBuffer(e);const s=r.createBufferFromOutputTexture(this.gl,t,n,this.textureConfig);return this.unbindTextureToFrameBuffer(),s}createAndWaitForFence(){const e=this.createFence(this.gl);return this.pollFence(e)}createFence(e){let t,n;if(Object(s.env)().getBool("WEBGL_FENCE_API_ENABLED")){const s=e,o=s.fenceSync(s.SYNC_GPU_COMMANDS_COMPLETE,0);e.flush(),n=()=>{const e=s.clientWaitSync(o,0,0);return e===s.ALREADY_SIGNALED||e===s.CONDITION_SATISFIED},t=o}else Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")>0?(t=this.beginQuery(),this.endQuery(),n=()=>this.isQueryAvailable(t,Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION"))):n=()=>!0;return{query:t,isFencePassed:n}}downloadMatrixFromPackedTexture(e,t,n){return this.downloadMatrixDriver(e,(()=>r.downloadMatrixFromPackedOutputTexture(this.gl,t,n)))}createProgram(e){this.throwIfDisposed();const t=this.gl,n=a.createFragmentShader(t,e);null==this.vertexShader&&(this.vertexShader=r.createVertexShader(t));const s=a.createProgram(t);return a.callAndCheck(t,(()=>t.attachShader(s,this.vertexShader))),a.callAndCheck(t,(()=>t.attachShader(s,n))),a.linkProgram(t,s),this.debug&&a.validateProgram(t,s),this.vertexAttrsAreBound||(this.setProgram(s),this.vertexAttrsAreBound=r.bindVertexProgramAttributeStreams(t,this.program,this.vertexBuffer)),s}deleteProgram(e){this.throwIfDisposed(),e===this.program&&(this.program=null),null!=e&&a.callAndCheck(this.gl,(()=>this.gl.deleteProgram(e)))}setProgram(e){this.throwIfDisposed(),this.program=e,null!=this.program&&this.debug&&a.validateProgram(this.gl,this.program),a.callAndCheck(this.gl,(()=>this.gl.useProgram(e)))}getUniformLocation(e,t,n=!0){return this.throwIfDisposed(),n?a.getProgramUniformLocationOrThrow(this.gl,e,t):a.getProgramUniformLocation(this.gl,e,t)}getAttributeLocation(e,t){return this.throwIfDisposed(),a.callAndCheck(this.gl,(()=>this.gl.getAttribLocation(e,t)))}getUniformLocationNoThrow(e,t){return this.throwIfDisposed(),this.gl.getUniformLocation(e,t)}setInputMatrixTexture(e,t,n){this.throwIfDisposed(),this.throwIfNoProgram(),a.bindTextureToProgramUniformSampler(this.gl,e,t,n)}setOutputMatrixTexture(e,t,n){this.setOutputMatrixTextureDriver(e,n,t)}setOutputPackedMatrixTexture(e,t,n){this.throwIfDisposed();const[s,o]=i.getPackedMatrixTextureShapeWidthHeight(t,n);this.setOutputMatrixTextureDriver(e,s,o)}setOutputMatrixWriteRegion(e,t,n,s){this.setOutputMatrixWriteRegionDriver(n,e,s,t)}setOutputPackedMatrixWriteRegion(e,t,n,s){throw new Error("setOutputPackedMatrixWriteRegion not implemented.")}debugValidate(){null!=this.program&&a.validateProgram(this.gl,this.program),a.validateFramebuffer(this.gl)}executeProgram(){this.throwIfDisposed(),this.throwIfNoProgram();const e=this.gl;this.debug&&this.debugValidate(),a.callAndCheck(e,(()=>e.drawElements(e.TRIANGLES,6,e.UNSIGNED_SHORT,0)))}blockUntilAllProgramsCompleted(){this.throwIfDisposed(),a.callAndCheck(this.gl,(()=>this.gl.finish()))}getQueryTimerExtension(){return null==this.disjointQueryTimerExtension&&(this.disjointQueryTimerExtension=a.getExtensionOrThrow(this.gl,2===Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")?"EXT_disjoint_timer_query_webgl2":"EXT_disjoint_timer_query")),this.disjointQueryTimerExtension}getQueryTimerExtensionWebGL2(){return this.getQueryTimerExtension()}getQueryTimerExtensionWebGL1(){return this.getQueryTimerExtension()}beginQuery(){if(2===Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")){const e=this.gl,t=this.getQueryTimerExtensionWebGL2(),n=e.createQuery();return e.beginQuery(t.TIME_ELAPSED_EXT,n),n}const e=this.getQueryTimerExtensionWebGL1(),t=e.createQueryEXT();return e.beginQueryEXT(e.TIME_ELAPSED_EXT,t),t}endQuery(){if(2===Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")){const e=this.gl,t=this.getQueryTimerExtensionWebGL2();return void e.endQuery(t.TIME_ELAPSED_EXT)}const e=this.getQueryTimerExtensionWebGL1();e.endQueryEXT(e.TIME_ELAPSED_EXT)}async waitForQueryAndGetTime(e){return await s.util.repeatedTry((()=>this.disposed||this.isQueryAvailable(e,Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")))),this.getQueryTime(e,Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION"))}getQueryTime(e,t){if(0===t)return null;if(2===t){const t=this.gl;return t.getQueryParameter(e,t.QUERY_RESULT)/1e6}{const t=this.getQueryTimerExtensionWebGL1();return t.getQueryObjectEXT(e,t.QUERY_RESULT_EXT)/1e6}}isQueryAvailable(e,t){if(0===t)return!0;if(2===t){const t=this.gl,n=this.getQueryTimerExtensionWebGL2(),s=t.getQueryParameter(e,t.QUERY_RESULT_AVAILABLE);return null==this.disjoint&&(this.disjoint=this.gl.getParameter(n.GPU_DISJOINT_EXT)),s&&!this.disjoint}{const t=this.getQueryTimerExtensionWebGL1(),n=t.getQueryObjectEXT(e,t.QUERY_RESULT_AVAILABLE_EXT);return null==this.disjoint&&(this.disjoint=this.gl.getParameter(t.GPU_DISJOINT_EXT)),n&&!this.disjoint}}pollFence(e){return new Promise((t=>{this.addItemToPoll((()=>e.isFencePassed()),(()=>t()))}))}pollItems(){const e=u(this.itemsToPoll.map((e=>e.isDoneFn)));for(let t=0;t<=e;++t){const{resolveFn:e}=this.itemsToPoll[t];e()}this.itemsToPoll=this.itemsToPoll.slice(e+1)}addItemToPoll(e,t){this.itemsToPoll.push({isDoneFn:e,resolveFn:t}),this.itemsToPoll.length>1||s.util.repeatedTry((()=>(this.pollItems(),0===this.itemsToPoll.length)))}bindTextureToFrameBuffer(e){this.throwIfDisposed(),a.bindColorTextureToFramebuffer(this.gl,e,this.framebuffer),this.debug&&a.validateFramebuffer(this.gl)}unbindTextureToFrameBuffer(){null!=this.outputTexture?(a.bindColorTextureToFramebuffer(this.gl,this.outputTexture,this.framebuffer),this.debug&&a.validateFramebuffer(this.gl)):a.unbindColorTextureFromFramebuffer(this.gl,this.framebuffer)}downloadMatrixDriver(e,t){this.bindTextureToFrameBuffer(e);const n=t();return this.unbindTextureToFrameBuffer(),n}setOutputMatrixTextureDriver(e,t,n){this.throwIfDisposed();const s=this.gl;a.bindColorTextureToFramebuffer(s,e,this.framebuffer),this.debug&&a.validateFramebuffer(s),this.outputTexture=e,a.callAndCheck(s,(()=>s.viewport(0,0,t,n))),a.callAndCheck(s,(()=>s.scissor(0,0,t,n)))}setOutputMatrixWriteRegionDriver(e,t,n,s){this.throwIfDisposed(),a.callAndCheck(this.gl,(()=>this.gl.scissor(e,t,n,s)))}throwIfDisposed(){if(this.disposed)throw new Error("Attempted to use disposed GPGPUContext.")}throwIfNoProgram(){if(null==this.program)throw new Error("No GPU program is currently set.")}}function u(e){let t=0;for(;t{const s={logicalShape:e.shape,texShape:e.isUniform?null:e.texData.texShape,isUniform:e.isUniform,isPacked:!e.isUniform&&e.texData.isPacked,flatOffset:null};return null!=e.texData&&null!=e.texData.slice&&e.texData.slice.flatOffset>0&&(s.flatOffset=e.texData.slice.flatOffset),{name:t.variableNames[n],shapeInfo:s}})),a=i.map((e=>e.shapeInfo)),d={logicalShape:r.shape,texShape:r.texData.texShape,isUniform:!1,isPacked:r.texData.isPacked,flatOffset:null},u=o.makeShader(i,d,t),l=e.createProgram(u);let c=null;const f=e.getUniformLocation(l,"NAN",!1);1===Object(s.env)().getNumber("WEBGL_VERSION")&&(c=e.getUniformLocation(l,"INFINITY",!1));const p=!1,m={},h={},b={};for(let n=0;n{_[n]=e.getUniformLocation(l,t.name,p)})),{program:t,source:u,webGLProgram:l,uniformLocations:m,customUniformLocations:_,inShapeInfos:a,outShapeInfo:d,infLoc:c,nanLoc:f,inShapesLocations:h,inTexShapesLocations:b,outShapeLocation:j,outShapeStridesLocation:w,outTexShapeLocation:g}}function i(e,t){if(e.length!==t.length)throw Error(`Binary was compiled with ${e.length} inputs, but was executed with ${t.length} inputs`);e.forEach(((e,n)=>{const o=e.logicalShape,r=t[n],i=r.shape;if(!s.util.arraysEqual(o,i))throw Error(`Binary was compiled with different shapes than the current args. Shapes ${o} and ${i} must match`);if(e.isUniform&&r.isUniform)return;const a=e.texShape,d=r.isUniform?null:r.texData.texShape;if(!s.util.arraysEqual(a,d))throw Error(`Binary was compiled with different texture shapes than the current args. Shape ${a} and ${d} must match`)}))}function a(e,t,n,r,a){t.program.enableShapeUniforms||(i(t.inShapeInfos,n),i([t.outShapeInfo],[r]));const d=r.texData.texture,u=r.texData.texShape;r.texData.isPacked?e.setOutputPackedMatrixTexture(d,u[0],u[1]):e.setOutputMatrixTexture(d,u[0],u[1]),e.setProgram(t.webGLProgram),1===Object(s.env)().getNumber("WEBGL_VERSION")&&null!==t.infLoc&&e.gl.uniform1f(t.infLoc,1/0),null!==t.nanLoc&&e.gl.uniform1f(t.nanLoc,NaN),n.forEach(((n,r)=>{const i=t.program.variableNames[r],a=t.uniformLocations[i],d=t.uniformLocations[`offset${i}`],u=t.inShapesLocations[`${i}Shape`],l=t.inTexShapesLocations[`${i}TexShape`];if(u){const{uniformShape:s}=o.getUniformInfoFromShape(t.program.packedInputs,n.shape,n.texData.texShape);switch(s.length){case 1:e.gl.uniform1iv(u,new Int32Array(s));break;case 2:e.gl.uniform2iv(u,new Int32Array(s));break;case 3:e.gl.uniform3iv(u,new Int32Array(s));break;case 4:e.gl.uniform4iv(u,new Int32Array(s))}}if(l&&e.gl.uniform2i(l,n.texData.texShape[0],n.texData.texShape[1]),null!=a)if(n.isUniform)if(s.util.sizeFromShape(n.shape)<2)e.gl.uniform1f(a,n.uniformValues[0]);else{let t=n.uniformValues;t instanceof Float32Array||(t=new Float32Array(t)),e.gl.uniform1fv(a,t)}else null!=n.texData.slice&&null!=d&&e.gl.uniform1i(d,n.texData.slice.flatOffset),e.setInputMatrixTexture(n.texData.texture,a,r)}));const l=t.outShapeLocation;if(l)switch(r.shape.length){case 1:e.gl.uniform1iv(l,new Int32Array(r.shape));break;case 2:e.gl.uniform2iv(l,new Int32Array(r.shape));break;case 3:e.gl.uniform3iv(l,new Int32Array(r.shape));break;case 4:e.gl.uniform4iv(l,new Int32Array(r.shape))}if(t.outShapeStridesLocation){const n=s.util.computeStrides(r.shape);switch(r.shape.length){case 2:e.gl.uniform1iv(t.outShapeStridesLocation,new Int32Array(n));break;case 3:e.gl.uniform2iv(t.outShapeStridesLocation,new Int32Array(n));break;case 4:e.gl.uniform3iv(t.outShapeStridesLocation,new Int32Array(n))}}t.outTexShapeLocation&&e.gl.uniform2i(t.outTexShapeLocation,r.texData.texShape[0],r.texData.texShape[1]),t.program.customUniforms&&a&&t.program.customUniforms.forEach(((n,s)=>{const o=t.customUniformLocations[s],r=a[s];if("float"===n.type)e.gl.uniform1fv(o,r);else if("vec2"===n.type)e.gl.uniform2fv(o,r);else if("vec3"===n.type)e.gl.uniform3fv(o,r);else if("vec4"===n.type)e.gl.uniform4fv(o,r);else if("int"===n.type)e.gl.uniform1iv(o,r);else if("ivec2"===n.type)e.gl.uniform2iv(o,r);else if("ivec3"===n.type)e.gl.uniform3iv(o,r);else{if("ivec4"!==n.type)throw Error(`uniform type ${n.type} is not supported yet.`);e.gl.uniform4iv(o,r)}})),e.executeProgram()}function d(e,t,n){let r="";t.concat(n).forEach((t=>{const i=null!=t.texData&&null!=t.texData.slice&&t.texData.slice.flatOffset>0;if(e.enableShapeUniforms&&!t.isUniform){const a=t.texData.texShape,{useSqueezeShape:d,uniformShape:u}=o.getUniformInfoFromShape(e.packedInputs,t.shape,a);let l="",c="",f="";if(1===u.length&&e.packedInputs){const e=[Math.ceil(a[0]/2),Math.ceil(a[1]/2)];l=`${e[0]>1}_${e[1]>1}`}else if(2!==u.length||e.packedInputs){if(u.length>2&&!e.packedInputs){const e=s.util.computeStrides(u);f=`${e[0]===a[1]}_${e[e.length-1]===a[1]}`}}else c=`${u[0]>1}_${u[1]>1}`;const p=t.shape.length,m=2===p&&s.util.arraysEqual(t.shape,a),h=1===s.util.sizeFromShape(t.shape),b=s.backend_util.getBroadcastDims(t.shape,n.shape),j=!e.packedInputs&&p===n.shape.length&&s.util.arraysEqual(a,n.texData.texShape),g=e.packedInputs||p>2?"":`${a[0]>1}_${a[1]>1}`;r+=`${p}_${j}_${d}_${u.length}_${h}_${b}_${m}_${l}_${c}_${f}_${g}_${i}`}else{const e=t.isUniform?"uniform":t.texData.texShape;r+=`${t.shape}_${e}_${i}`}}));const i=e.userCode;let a=e.constructor.name;return a+="_"+r+"_"+i+`${Object(s.env)().getNumber("WEBGL_VERSION")}`,a}function u(e){return Object(s.env)().getBool("WEBGL_USE_SHAPES_UNIFORMS")&&e<=4}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/gpgpu_util.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/gpgpu_util.js ***! + \************************************************************************/ +/*! exports provided: createVertexShader, createVertexBuffer, createIndexBuffer, getInternalFormatForFloat32MatrixTexture, createFloat32MatrixTexture, getInternalFormatForFloat16MatrixTexture, createFloat16MatrixTexture, getInternalFormatForUnsignedBytesMatrixTexture, createUnsignedBytesMatrixTexture, getInternalFormatForPackedMatrixTexture, createPackedMatrixTexture, getInternalFormatForFloat16PackedMatrixTexture, createFloat16PackedMatrixTexture, bindVertexProgramAttributeStreams, uploadDenseMatrixToTexture, uploadPixelDataToTexture, createBufferFromOutputTexture, downloadFloat32MatrixFromBuffer, downloadByteEncodedFloatMatrixFromOutputTexture, downloadPackedMatrixFromBuffer, downloadMatrixFromPackedOutputTexture */function(e,t,n){"use strict";n.r(t),n.d(t,"createVertexShader",(function(){return i})),n.d(t,"createVertexBuffer",(function(){return a})),n.d(t,"createIndexBuffer",(function(){return d})),n.d(t,"getInternalFormatForFloat32MatrixTexture",(function(){return l})),n.d(t,"createFloat32MatrixTexture",(function(){return c})),n.d(t,"getInternalFormatForFloat16MatrixTexture",(function(){return f})),n.d(t,"createFloat16MatrixTexture",(function(){return p})),n.d(t,"getInternalFormatForUnsignedBytesMatrixTexture",(function(){return m})),n.d(t,"createUnsignedBytesMatrixTexture",(function(){return h})),n.d(t,"getInternalFormatForPackedMatrixTexture",(function(){return b})),n.d(t,"createPackedMatrixTexture",(function(){return j})),n.d(t,"getInternalFormatForFloat16PackedMatrixTexture",(function(){return g})),n.d(t,"createFloat16PackedMatrixTexture",(function(){return w})),n.d(t,"bindVertexProgramAttributeStreams",(function(){return _})),n.d(t,"uploadDenseMatrixToTexture",(function(){return k})),n.d(t,"uploadPixelDataToTexture",(function(){return v})),n.d(t,"createBufferFromOutputTexture",(function(){return x})),n.d(t,"downloadFloat32MatrixFromBuffer",(function(){return y})),n.d(t,"downloadByteEncodedFloatMatrixFromOutputTexture",(function(){return O})),n.d(t,"downloadPackedMatrixFromBuffer",(function(){return I})),n.d(t,"downloadMatrixFromPackedOutputTexture",(function(){return C}));var s=n(/*! ./glsl_version */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"),o=n(/*! ./tex_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/tex_util.js"),r=n(/*! ./webgl_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const t=Object(s.getGlslDifferences)(),n=`${t.version}\n precision highp float;\n ${t.attribute} vec3 clipSpacePos;\n ${t.attribute} vec2 uv;\n ${t.varyingVs} vec2 resultUV;\n\n void main() {\n gl_Position = vec4(clipSpacePos, 1);\n resultUV = uv;\n }`;return r.createVertexShader(e,n)}function a(e){const t=new Float32Array([-1,1,0,0,1,-1,-1,0,0,0,1,1,0,1,1,1,-1,0,1,0]);return r.createStaticVertexBuffer(e,t)}function d(e){const t=new Uint16Array([0,1,2,2,1,3]);return r.createStaticIndexBuffer(e,t)}function u(e,t,n,s,o,i){r.validateTextureSize(t,n);const a=r.createTexture(e),d=e.TEXTURE_2D;return r.callAndCheck(e,(()=>e.bindTexture(d,a))),r.callAndCheck(e,(()=>e.texParameteri(d,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE))),r.callAndCheck(e,(()=>e.texParameteri(d,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE))),r.callAndCheck(e,(()=>e.texParameteri(d,e.TEXTURE_MIN_FILTER,e.NEAREST))),r.callAndCheck(e,(()=>e.texParameteri(d,e.TEXTURE_MAG_FILTER,e.NEAREST))),r.callAndCheck(e,(()=>e.texImage2D(d,0,s,t,n,0,o,i,null))),r.callAndCheck(e,(()=>e.bindTexture(e.TEXTURE_2D,null))),a}function l(e){return e.internalFormatFloat}function c(e,t,n,s){const[r,i]=o.getUnpackedMatrixTextureShapeWidthHeight(t,n);return u(e,r,i,l(s),s.textureFormatFloat,e.FLOAT)}function f(e){return e.internalFormatHalfFloat}function p(e,t,n,s){const[r,i]=o.getUnpackedMatrixTextureShapeWidthHeight(t,n);return u(e,r,i,f(s),s.textureFormatFloat,s.textureTypeHalfFloat)}function m(e){return e.downloadTextureFormat}function h(e,t,n,s){const[r,i]=o.getUnpackedMatrixTextureShapeWidthHeight(t,n);return u(e,r,i,m(s),e.RGBA,e.UNSIGNED_BYTE)}function b(e){return e.internalFormatPackedFloat}function j(e,t,n,s){const[r,i]=o.getPackedMatrixTextureShapeWidthHeight(t,n);return u(e,r,i,b(s),e.RGBA,e.FLOAT)}function g(e){return e.internalFormatPackedHalfFloat}function w(e,t,n,s){const[r,i]=o.getPackedMatrixTextureShapeWidthHeight(t,n);return u(e,r,i,g(s),e.RGBA,s.textureTypeHalfFloat)}function _(e,t,n){r.callAndCheck(e,(()=>e.bindBuffer(e.ARRAY_BUFFER,n)));return r.bindVertexBufferToProgramAttribute(e,t,"clipSpacePos",n,3,20,0)&&r.bindVertexBufferToProgramAttribute(e,t,"uv",n,2,20,12)}function k(e,t,n,s,o,i){let a,d,u;r.callAndCheck(e,(()=>e.bindTexture(e.TEXTURE_2D,t))),o instanceof Uint8Array?(a=new Uint8Array(n*s*4),d=e.UNSIGNED_BYTE,u=e.RGBA):(a=new Float32Array(n*s*4),d=e.FLOAT,u=i.internalFormatPackedFloat),a.set(o),r.callAndCheck(e,(()=>e.texImage2D(e.TEXTURE_2D,0,u,n,s,0,e.RGBA,d,a))),r.callAndCheck(e,(()=>e.bindTexture(e.TEXTURE_2D,null)))}function v(e,t,n){r.callAndCheck(e,(()=>e.bindTexture(e.TEXTURE_2D,t))),n.data instanceof Uint8Array?r.callAndCheck(e,(()=>e.texImage2D(e.TEXTURE_2D,0,e.RGBA,n.width,n.height,0,e.RGBA,e.UNSIGNED_BYTE,n.data))):r.callAndCheck(e,(()=>e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,n))),r.callAndCheck(e,(()=>e.bindTexture(e.TEXTURE_2D,null)))}function x(e,t,n,s){const o=e.createBuffer();r.callAndCheck(e,(()=>e.bindBuffer(e.PIXEL_PACK_BUFFER,o)));const i=16*t*n;return r.callAndCheck(e,(()=>e.bufferData(e.PIXEL_PACK_BUFFER,i,e.STREAM_READ))),r.callAndCheck(e,(()=>e.readPixels(0,0,n,t,e.RGBA,e.FLOAT,0))),r.callAndCheck(e,(()=>e.bindBuffer(e.PIXEL_PACK_BUFFER,null))),o}function y(e,t,n){const s=e,o=new Float32Array(n);return s.bindBuffer(s.PIXEL_PACK_BUFFER,t),s.getBufferSubData(s.PIXEL_PACK_BUFFER,0,o),s.bindBuffer(s.PIXEL_PACK_BUFFER,null),o}function O(e,t,n,s){const[i,a]=o.getUnpackedMatrixTextureShapeWidthHeight(t,n),d=new Uint8Array(o.getUnpackedArraySizeFromMatrixSize(t*n,4));return r.callAndCheck(e,(()=>e.readPixels(0,0,i,a,s.downloadTextureFormat,e.UNSIGNED_BYTE,d))),new Float32Array(d.buffer)}function I(e,t,n,s,r,i,a,d){const u=e,l=new Float32Array(o.getPackedRGBAArraySizeFromMatrixShape(i,a));return u.bindBuffer(u.PIXEL_PACK_BUFFER,t),u.getBufferSubData(u.PIXEL_PACK_BUFFER,0,l),u.bindBuffer(u.PIXEL_PACK_BUFFER,null),l}function C(e,t,n){const s=new Float32Array(t*n*4);return r.callAndCheck(e,(()=>e.readPixels(0,0,n,t,e.RGBA,e.FLOAT,s))),s}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/im2col_packed_gpu.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/im2col_packed_gpu.js ***! + \*******************************************************************************/ +/*! exports provided: Im2ColPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"Im2ColPackedProgram",(function(){return o}));var s=n(/*! ./glsl_version */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */class o{constructor(e,t,n){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=e;const{filterWidth:o,inChannels:r,strideWidth:i,strideHeight:a,padInfo:d,outWidth:u,dilationWidth:l,dilationHeight:c,dataFormat:f}=n,{left:p,top:m}=d,h=r*o,b=Object(s.getGlslDifferences)(),j="channelsLast"===f,g=j?0:1,w=j?1:2;let _="";for(let n=0;n<=1;n++)for(let s=0;s<=1;s++)_+=`\n blockIndex = rc.y + ${s};\n pos = rc.x + ${n};\n\n if(blockIndex < ${e[1]} && pos < ${e[0]}) {\n offsetY = int(blockIndex / (${u})) * ${a} - ${m};\n d0 = offsetY + ${c} * (pos / ${h});\n\n if(d0 < ${t[g]} && d0 >= 0) {\n\n offsetX = int(mod(float(blockIndex), ${u}.) * ${i}. - ${p}.);\n d1 = offsetX + ${l} * (int(mod(float(pos), ${h}.) / ${r}.));\n\n if(d1 < ${t[w]} && d1 >= 0) {\n\n ch = int(mod(float(pos), ${r}.));\n\n if (${j}) {\n innerDims = vec2(d1, ch);\n result[${2*n+s}] = getChannel(\n getA(d0, int(innerDims.x),\n int(innerDims.y)), innerDims);\n } else {\n innerDims = vec2(d0, d1);\n result[${2*n+s}] = getChannel(\n getA(ch, int(innerDims.x),\n int(innerDims.y)), innerDims);\n }\n }\n }\n }\n `;this.userCode=`\n void main() {\n ivec2 rc = getOutputCoords();\n\n vec4 result = vec4(0);\n\n int blockIndex, pos, offsetY, d0, offsetX, d1, ch;\n vec2 innerDims;\n\n ${_}\n\n ${b.output} = result;\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/index.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/index.js ***! + \*******************************************************************/ +/*! exports provided: version_webgl, MathBackendWebGL, setWebGLContext, GPGPUContext, gpgpu_util, webgl_util, forceHalfFloat, webgl */function(e,t,n){"use strict";n.r(t);var s=n(/*! ./base */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/base.js");n.d(t,"version_webgl",(function(){return s.version_webgl})),n.d(t,"MathBackendWebGL",(function(){return s.MathBackendWebGL})),n.d(t,"setWebGLContext",(function(){return s.setWebGLContext})),n.d(t,"GPGPUContext",(function(){return s.GPGPUContext})),n.d(t,"gpgpu_util",(function(){return s.gpgpu_util})),n.d(t,"webgl_util",(function(){return s.webgl_util})),n.d(t,"forceHalfFloat",(function(){return s.forceHalfFloat})),n.d(t,"webgl",(function(){return s.webgl}));n(/*! ./register_all_kernels */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/register_all_kernels.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/arg_min_max.js": +/*!**************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/arg_min_max.js ***! + \**************************************************************************************/ +/*! exports provided: argMinMaxReduce */function(e,t,n){"use strict";n.r(t),n.d(t,"argMinMaxReduce",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../argminmax_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/argminmax_gpu.js"),r=n(/*! ../argminmax_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/argminmax_packed_gpu.js"),i=n(/*! ../kernels/Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e,t,n,r=null){let i=t.shape[0],d=t.shape[1];null!=r&&(i=r.shape[0],d=r.shape[1]);const u=s.backend_util.computeOptimalWindowSize(d),l={windowSize:u,inSize:d,batchSize:i,outSize:Math.ceil(d/u)},c=new o.ArgMinMaxProgram(l,n,null==r),f=[t];null!=r&&f.push(r);const p=e.runWebGLProgram(c,f,"int32");if(1===p.shape[1])return p;const m=a(e,t,n,p);return e.disposeIntermediateTensorInfo(p),m}function d(e,t,n,o=null){const i=null!=o?o.shape:t.shape,a=i[i.length-1],u=s.backend_util.computeOptimalWindowSize(a),l=new r.ArgMinMaxPackedProgram(i,u,n,null==o),c=null==o?[t]:[t,o],f=e.runWebGLProgram(l,c,"int32");if(f.shape.length===t.shape.length){const s=d(e,t,n,f);return e.disposeIntermediateTensorInfo(f),s}return f}function u(e,t,n,o){const r=[n];if(s.backend_util.assertAxesAreInnerMostDims("arg"+o.charAt(0).toUpperCase()+o.slice(1),r,t.shape.length),!Object(s.env)().getBool("WEBGL_PACK_REDUCE")||t.shape.length<=2){const n=[],[d,u]=s.backend_util.computeOutAndReduceShapes(t.shape,r),l=s.util.sizeFromShape(u),c=Object(i.reshape)({inputs:{x:t},backend:e,attrs:{shape:[-1,l]}});n.push(c);const f=a(e,c,o);n.push(f);const p=Object(i.reshape)({inputs:{x:f},backend:e,attrs:{shape:d}});return n.forEach((t=>e.disposeIntermediateTensorInfo(t))),p}return d(e,t,o)}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/int.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/int.js ***! + \******************************************************************************/ +/*! exports provided: int */function(e,t,n){"use strict";n.r(t),n.d(t,"int",(function(){return o}));var s=n(/*! ../unaryop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t){const n=new s.UnaryOpProgram(e.shape,"return float(int(x));"),o=t.runWebGLProgram(n,[e],"int32");return{dataId:o.dataId,shape:o.shape,dtype:o.dtype}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js": +/*!*********************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js ***! + \*********************************************************************************************/ +/*! exports provided: CHECK_NAN_SNIPPET_UNARY, CHECK_NAN_SNIPPET_BINARY, CHECK_NAN_SNIPPET_BINARY_PACKED, unaryKernelFunc, binaryKernelFunc, mapActivationToShaderProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"CHECK_NAN_SNIPPET_UNARY",(function(){return c})),n.d(t,"CHECK_NAN_SNIPPET_BINARY",(function(){return f})),n.d(t,"CHECK_NAN_SNIPPET_BINARY_PACKED",(function(){return p})),n.d(t,"unaryKernelFunc",(function(){return m})),n.d(t,"binaryKernelFunc",(function(){return h})),n.d(t,"mapActivationToShaderProgram",(function(){return b}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../binaryop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_gpu.js"),r=n(/*! ../binaryop_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_packed_gpu.js"),i=n(/*! ../kernels/Complex */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js"),a=n(/*! ../kernels/LeakyRelu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LeakyRelu.js"),d=n(/*! ../kernels/Prelu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Prelu.js"),u=n(/*! ../unaryop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js"),l=n(/*! ../unaryop_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_packed_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const c="if (isnan(x)) return x;",f="\n if (isnan(a)) return a;\n if (isnan(b)) return b;\n",p="\n result.r = isNaN.r > 0. ? NAN : result.r;\n result.g = isNaN.g > 0. ? NAN : result.g;\n result.b = isNaN.b > 0. ? NAN : result.b;\n result.a = isNaN.a > 0. ? NAN : result.a;\n";function m({opSnippet:e,packedOpSnippet:t,cpuKernelImpl:n,dtype:o}){return({inputs:r,backend:i})=>{const{x:a}=r,d=i,c=o||a.dtype;if(d.shouldExecuteOnCPU([a])&&null!=n){const e=d.texData.get(a.dataId),t=n(e.values,c);return d.makeTensorInfo(a.shape,c,t)}let f;return f=Object(s.env)().getBool("WEBGL_PACK_UNARY_OPERATIONS")&&null!=t?new l.UnaryOpPackedProgram(a.shape,t):new u.UnaryOpProgram(a.shape,e),d.runWebGLProgram(f,[a],c)}}function h({opSnippet:e,packedOpSnippet:t,checkOutOfBounds:n=!1,supportsComplex:a=!1,cpuKernelImpl:d,dtype:u}){return({inputs:l,backend:c})=>{const{a:f,b:p}=l,m=c;if(a&&"complex64"===f.dtype){const t=m.texData.get(f.dataId),n=m.texData.get(p.dataId),[r,a]=[[t.complexTensorInfos.real,n.complexTensorInfos.real],[t.complexTensorInfos.imag,n.complexTensorInfos.imag]].map((t=>{const[n,r]=t,i={dataId:n.dataId,dtype:n.dtype,shape:f.shape},a={dataId:r.dataId,dtype:r.dtype,shape:p.shape},d=new o.BinaryOpProgram(e,f.shape,p.shape);return m.runWebGLProgram(d,[i,a],Object(s.upcastType)(n.dtype,r.dtype))})),d=Object(i.complex)({inputs:{real:r,imag:a},backend:m});return m.disposeIntermediateTensorInfo(r),m.disposeIntermediateTensorInfo(a),d}const h=u||Object(s.upcastType)(f.dtype,p.dtype);if(("string"===f.dtype||"string"===p.dtype||m.shouldExecuteOnCPU([f,p]))&&null!=d){const e=m.texData.get(f.dataId).values,t=m.texData.get(p.dataId).values,n="string"===f.dtype?s.backend_util.fromUint8ToStringArray(e):e,o="string"===f.dtype?s.backend_util.fromUint8ToStringArray(t):t,[r,i]=d(f.shape,p.shape,n,o,h),a=m.makeTensorInfo(i,h);return m.texData.get(a.dataId).values=r,a}let b;return b=Object(s.env)().getBool("WEBGL_PACK_BINARY_OPERATIONS")&&null!=t?new r.BinaryOpPackedProgram(t,f.shape,p.shape,n):new o.BinaryOpProgram(e,f.shape,p.shape),m.runWebGLProgram(b,[f,p],h)}}function b(e,t=!1){if("linear"===e)return t?l.LINEAR:u.LINEAR;if("relu"===e)return t?l.RELU:u.RELU;if("elu"===e)return t?l.ELU:u.ELU;if("relu6"===e)return t?l.RELU6:u.RELU6;if("prelu"===e)return t?d.PRELU_PACKED:d.PRELU;if("leakyrelu"===e)return t?a.LEAKYRELU_PACKED:a.LEAKYRELU;if("sigmoid"===e)return t?l.SIGMOID:u.SIGMOID;throw new Error(`Activation ${e} has not been implemented for the WebGL backend.`)}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/reduce.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/reduce.js ***! + \*********************************************************************************/ +/*! exports provided: reduce */function(e,t,n){"use strict";n.r(t),n.d(t,"reduce",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../mean_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/mean_gpu.js"),r=n(/*! ../reduce_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/reduce_gpu.js");function i(e,t,n,i){const a= +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t=[];for(;0===t.length||1!==t[t.length-1].outSize;){const n=t.length?t[t.length-1].outSize:e[1],o=s.backend_util.computeOptimalWindowSize(n);t.push({inSize:n,windowSize:o,outSize:Math.ceil(n/o)})}return t}(e.shape);let d=e;for(let s=0;s 1.) {\n return NAN;\n }\n return acos(x);\n",i=Object(o.unaryKernelFunc)({opSnippet:r}),a={kernelName:s.Acos,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Acosh.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Acosh.js ***! + \***************************************************************************/ +/*! exports provided: acosh, acoshConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"acosh",(function(){return i})),n.d(t,"acoshConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=n(/*! ../unaryop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js").CHECK_NAN_SNIPPET+"\n if (x < 1.0) return NAN;\nreturn log(x + sqrt(x * x - 1.0));",i=Object(o.unaryKernelFunc)({opSnippet:r}),a={kernelName:s.Acosh,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Add.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Add.js ***! + \*************************************************************************/ +/*! exports provided: addKernelFunc, addConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"addKernelFunc",(function(){return a})),n.d(t,"addConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i="return a + b;",a=Object(o.binaryKernelFunc)({opSnippet:i,packedOpSnippet:i,supportsComplex:!0,cpuKernelImpl:r.addImplCPU}),d={kernelName:s.Add,backendName:"webgl",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/AddN.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/AddN.js ***! + \**************************************************************************/ +/*! exports provided: addN, addNConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"addN",(function(){return a})),n.d(t,"addNConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../addn_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/addn_gpu.js"),r=n(/*! ../addn_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/addn_packed_gpu.js"),i=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){const{inputs:t,backend:n}=e,d=t;if(1===d.length)return Object(i.identity)({inputs:{x:d[0]},backend:n});if(d.length>Object(s.env)().get("WEBGL_MAX_TEXTURES_IN_SHADER")){const e=Math.floor(d.length/2),t=a({inputs:d.slice(0,e),backend:n}),s=a({inputs:d.slice(e),backend:n});return a({inputs:[t,s],backend:n})}const u=d.map((e=>e.dtype)).reduce(((e,t)=>Object(s.upcastType)(e,t))),l=d.map((e=>e.shape)),c=Object(s.env)().getBool("WEBGL_PACK")?new r.AddNPackedProgram(d[0].shape,l):new o.AddNProgram(d[0].shape,l);return n.runWebGLProgram(c,d,u)}const d={kernelName:s.AddN,backendName:"webgl",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/All.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/All.js ***! + \*************************************************************************/ +/*! exports provided: all, allConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"all",(function(){return a})),n.d(t,"allConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/reduce */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/reduce.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),i=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:d}=t,{axis:u,keepDims:l}=a,c=d.shape.length,f=s.util.parseAxisParam(u,d.shape);let p=f;const m=s.backend_util.getAxesPermutation(p,c);let h=d;null!=m&&(h=Object(i.transpose)({inputs:{x:d},backend:n,attrs:{perm:m}}),p=s.backend_util.getInnerMostAxes(p.length,c)),s.backend_util.assertAxesAreInnerMostDims("all",p,c);const[b,j]=s.backend_util.computeOutAndReduceShapes(h.shape,p),g=s.util.sizeFromShape(j),w=Object(r.reshape)({inputs:{x:h},backend:n,attrs:{shape:[-1,g]}}),_=Object(o.reduce)(w,w.dtype,"all",n);let k;if(l){const e=s.backend_util.expandShapeToKeepDim(b,f);k=Object(r.reshape)({inputs:{x:_},backend:n,attrs:{shape:e}})}else k=Object(r.reshape)({inputs:{x:_},backend:n,attrs:{shape:b}});return n.disposeIntermediateTensorInfo(w),n.disposeIntermediateTensorInfo(_),null!=m&&n.disposeIntermediateTensorInfo(h),k}const d={kernelName:s.All,backendName:"webgl",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Any.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Any.js ***! + \*************************************************************************/ +/*! exports provided: any, anyConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"any",(function(){return a})),n.d(t,"anyConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/reduce */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/reduce.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),i=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:d}=t,{axis:u,keepDims:l}=a,c=d.shape.length,f=s.util.parseAxisParam(u,d.shape);let p=f;const m=s.backend_util.getAxesPermutation(p,c);let h=d;null!=m&&(h=Object(i.transpose)({inputs:{x:d},backend:n,attrs:{perm:m}}),p=s.backend_util.getInnerMostAxes(p.length,c)),s.backend_util.assertAxesAreInnerMostDims("any",p,c);const[b,j]=s.backend_util.computeOutAndReduceShapes(h.shape,p),g=s.util.sizeFromShape(j),w=Object(r.reshape)({inputs:{x:h},backend:n,attrs:{shape:[-1,g]}}),_=Object(o.reduce)(w,w.dtype,"any",n);let k;if(l){const e=s.backend_util.expandShapeToKeepDim(b,f);k=Object(r.reshape)({inputs:{x:_},backend:n,attrs:{shape:e}})}else k=Object(r.reshape)({inputs:{x:_},backend:n,attrs:{shape:b}});return n.disposeIntermediateTensorInfo(w),n.disposeIntermediateTensorInfo(_),null!=m&&n.disposeIntermediateTensorInfo(h),k}const d={kernelName:s.Any,backendName:"webgl",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ArgMax.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ArgMax.js ***! + \****************************************************************************/ +/*! exports provided: argMax, argMaxConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"argMax",(function(){return i})),n.d(t,"argMaxConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/arg_min_max */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/arg_min_max.js"),r=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{axis:d}=i;let u=s.util.parseAxisParam(d,a.shape);const l=s.backend_util.getAxesPermutation(u,a.shape.length);let c=a;const f=[];null!=l&&(c=Object(r.transpose)({inputs:{x:a},backend:n,attrs:{perm:l}}),f.push(c),u=s.backend_util.getInnerMostAxes(u.length,c.shape.length)),s.backend_util.assertAxesAreInnerMostDims("argMax",[u[0]],c.shape.length);const p=Object(o.argMinMaxReduce)(n,c,u[0],"max");return f.forEach((e=>n.disposeIntermediateTensorInfo(e))),p}const a={kernelName:s.ArgMax,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ArgMin.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ArgMin.js ***! + \****************************************************************************/ +/*! exports provided: argMin, argMinConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"argMin",(function(){return i})),n.d(t,"argMinConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/arg_min_max */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/arg_min_max.js"),r=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{axis:d}=i;let u=s.util.parseAxisParam(d,a.shape);const l=s.backend_util.getAxesPermutation(u,a.shape.length);let c=a;const f=[];null!=l&&(c=Object(r.transpose)({inputs:{x:a},backend:n,attrs:{perm:l}}),f.push(c),u=s.backend_util.getInnerMostAxes(u.length,c.shape.length)),s.backend_util.assertAxesAreInnerMostDims("argMin",[u[0]],c.shape.length);const p=Object(o.argMinMaxReduce)(n,c,u[0],"min");return f.forEach((e=>n.disposeIntermediateTensorInfo(e))),p}const a={kernelName:s.ArgMin,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Asin.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Asin.js ***! + \**************************************************************************/ +/*! exports provided: asin, asinConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"asin",(function(){return i})),n.d(t,"asinConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=n(/*! ../unaryop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js").CHECK_NAN_SNIPPET+"\n if (abs(x) > 1.) {\n return NAN;\n }\n return asin(x);\n",i=Object(o.unaryKernelFunc)({opSnippet:r}),a={kernelName:s.Asin,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Asinh.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Asinh.js ***! + \***************************************************************************/ +/*! exports provided: asinh, asinhConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"asinh",(function(){return i})),n.d(t,"asinhConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=n(/*! ../unaryop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js").CHECK_NAN_SNIPPET+"return log(x + sqrt(x * x + 1.0));",i=Object(o.unaryKernelFunc)({opSnippet:r}),a={kernelName:s.Asinh,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Atan.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Atan.js ***! + \**************************************************************************/ +/*! exports provided: atan, atanConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"atan",(function(){return i})),n.d(t,"atanConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=n(/*! ../unaryop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js").CHECK_NAN_SNIPPET+"\n return atan(x);\n",i=Object(o.unaryKernelFunc)({opSnippet:r}),a={kernelName:s.Atan,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Atan2.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Atan2.js ***! + \***************************************************************************/ +/*! exports provided: atan2, atan2Config */function(e,t,n){"use strict";n.r(t),n.d(t,"atan2",(function(){return a})),n.d(t,"atan2Config",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=o.CHECK_NAN_SNIPPET_BINARY+"\n return atan(a, b);\n",i="\n vec4 result = atan(a, b);\n vec4 isNaN = min(vec4(isnan(a)) + vec4(isnan(b)), vec4(1.0));\n "+o.CHECK_NAN_SNIPPET_BINARY_PACKED+"\n return result;\n",a=Object(o.binaryKernelFunc)({opSnippet:r,packedOpSnippet:i}),d={kernelName:s.Atan2,backendName:"webgl",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Atanh.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Atanh.js ***! + \***************************************************************************/ +/*! exports provided: atanh, atanhConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"atanh",(function(){return i})),n.d(t,"atanhConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=n(/*! ../unaryop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js").CHECK_NAN_SNIPPET+"\n if ((x < -1.0) || (x > 1.0)) return NAN;\nreturn (log(1.0 + x) - log(1.0 - x)) / 2.0;",i=Object(o.unaryKernelFunc)({opSnippet:r}),a={kernelName:s.Atanh,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPool.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPool.js ***! + \*****************************************************************************/ +/*! exports provided: avgPool, avgPoolConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"avgPool",(function(){return a})),n.d(t,"avgPoolConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../pool_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/pool_gpu.js"),r=n(/*! ../webgl_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"),i=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:d}=t;Object(r.assertNotComplex)(d,"avgPool");const{filterSize:u,strides:l,pad:c,dimRoundingMode:f}=a;s.util.assert(s.backend_util.eitherStridesOrDilationsAreOne(l,1),(()=>`Error in avgPool: Either strides or dilations must be 1. Got strides ${l} and dilations '1'`));const p=s.backend_util.computePool2DInfo(d.shape,u,l,1,c,f);if(1===p.filterWidth&&1===p.filterHeight&&s.util.arraysEqual(p.inShape,p.outShape))return Object(i.identity)({inputs:{x:d},backend:n});const m=new o.Pool2DProgram(p,"avg",!1);return n.runWebGLProgram(m,[d],"float32")}const d={kernelName:s.AvgPool,backendName:"webgl",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPool3D.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPool3D.js ***! + \*******************************************************************************/ +/*! exports provided: avgPool3D, avgPool3DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"avgPool3D",(function(){return r})),n.d(t,"avgPool3DConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../pool_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/pool_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i}=t,{filterSize:a,strides:d,pad:u,dimRoundingMode:l,dataFormat:c}=r,f=s.backend_util.computePool3DInfo(i.shape,a,d,[1,1,1],u,l,c),p=new o.Pool3DProgram(f,"avg",!1);return n.runWebGLProgram(p,[i],"float32")}const i={kernelName:s.AvgPool3D,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPool3DGrad.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPool3DGrad.js ***! + \***********************************************************************************/ +/*! exports provided: avgPool3DGrad, avgPoolGrad3DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"avgPool3DGrad",(function(){return r})),n.d(t,"avgPoolGrad3DConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../avg_pool_backprop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/avg_pool_backprop_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{dy:i,input:a}=t,d=a,{filterSize:u,strides:l,pad:c,dimRoundingMode:f}=r,p=s.backend_util.computePool3DInfo(d.shape,u,l,[1,1,1],c,f),m=new o.AvgPool3DBackpropProgram(p);return n.runWebGLProgram(m,[i],d.dtype)}const i={kernelName:s.AvgPool3DGrad,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPoolGrad.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPoolGrad.js ***! + \*********************************************************************************/ +/*! exports provided: avgPoolGrad, avgPoolGradConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"avgPoolGrad",(function(){return i})),n.d(t,"avgPoolGradConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../avg_pool_backprop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/avg_pool_backprop_gpu.js"),r=n(/*! ../webgl_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{dy:a,input:d}=t,u=d;Object(r.assertNotComplex)([a,d],"avgPoolGrad");const{filterSize:l,strides:c,pad:f}=i,p=s.backend_util.computePool2DInfo(u.shape,l,c,1,f),m=new o.AvgPool2DBackpropProgram(p);return n.runWebGLProgram(m,[a],u.dtype)}const a={kernelName:s.AvgPoolGrad,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchMatMul.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchMatMul.js ***! + \*********************************************************************************/ +/*! exports provided: batchMatMul, batchMatMulConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"batchMatMul",(function(){return r})),n.d(t,"batchMatMulConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./BatchMatMul_impl */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchMatMul_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:s}=e,{a:r,b:i}=t,{transposeA:a,transposeB:d}=s;return Object(o.batchMatMulImpl)({a:r,b:i,transposeA:a,transposeB:d,backend:n})}const i={kernelName:s.BatchMatMul,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchMatMul_impl.js": +/*!**************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchMatMul_impl.js ***! + \**************************************************************************************/ +/*! exports provided: MATMUL_SHARED_DIM_THRESHOLD, batchMatMulImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"MATMUL_SHARED_DIM_THRESHOLD",(function(){return l})),n.d(t,"batchMatMulImpl",(function(){return c}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../mulmat_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/mulmat_packed_gpu.js"),i=n(/*! ./Multiply */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Multiply.js"),a=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),d=n(/*! ./Sum */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sum.js"),u=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const l=1e3;function c({a:e,b:t,transposeA:n,transposeB:c,backend:f,bias:p=null,preluActivationWeights:m=null,leakyreluAlpha:h=0,activation:b=null}){const j=e.shape.length,g=t.shape.length,w=n?e.shape[j-2]:e.shape[j-1],_=c?t.shape[g-1]:t.shape[g-2],k=n?e.shape[j-1]:e.shape[j-2],v=c?t.shape[g-2]:t.shape[g-1],x=e.shape.slice(0,-2),y=t.shape.slice(0,-2),O=s.util.sizeFromShape(x),I=s.util.sizeFromShape(y),C=O===I||1===O||1===I;s.util.assert(j>=2&&g>=2&&C,(()=>`Error in matMul: the input batch dimensions must either be the same or at least one input batch dimension must be 1. Got input batch dimensions of (${x}) and (${y}).`));const S=(O>I?e.shape.slice(0,-2):t.shape.slice(0,-2)).concat([k,v]);s.util.assert(w===_,(()=>`Error in matMul: inner shapes (${w}) and (${_}) of Tensors with shapes ${e.shape} and ${t.shape} and transposeA=${n} and transposeB=${c} must match.`));const T=n?[O,w,k]:[O,k,w],N=c?[I,v,_]:[I,_,v],E=Object(a.reshape)({inputs:{x:e},backend:f,attrs:{shape:T}}),A=Object(a.reshape)({inputs:{x:t},backend:f,attrs:{shape:N}}),R=[E,A],F=Math.max(O,I),$=n?E.shape[1]:E.shape[2],M=null!=p,D=null!=m,P="leakyrelu"===b,B=null!=b?Object(o.mapActivationToShaderProgram)(b,!0):null;let L;if((1===k||1===v)&&$>l&&!1===(M||D||P||null!=B)){let e=E,t=A;n&&(e=Object(u.transpose)({inputs:{x:E},backend:f,attrs:{perm:[0,2,1]}}),R.push(e)),c&&(t=Object(u.transpose)({inputs:{x:A},backend:f,attrs:{perm:[0,2,1]}}),R.push(t));const s=1===v;let o=e;1!==v&&(o=Object(a.reshape)({inputs:{x:e},backend:f,attrs:{shape:[F,$,1]}}),R.push(o));const r=1===v?2:1;let l=t;s&&(l=Object(a.reshape)({inputs:{x:t},backend:f,attrs:{shape:[F,1,$]}}),R.push(l));const p=Object(i.multiply)({inputs:{a:o,b:l},backend:f});L=Object(d.sum)({inputs:{x:p},backend:f,attrs:{axis:r,keepDims:!0}}),R.push(p)}else{const o=Object(s.upcastType)(e.dtype,t.dtype),i=new r.MatMulPackedProgram(T,N,[F,k,v],n,c,M,B,D,P),a=[E,A];if(null!=p&&a.push(p),D&&a.push(m),P){const e=f.makeTensorInfo([],"float32",s.util.createScalarValue(h,"float32"));a.push(e),R.push(e)}L=f.runWebGLProgram(i,a,o)}const z=Object(a.reshape)({inputs:{x:L},backend:f,attrs:{shape:S}});R.push(L);for(const e of R)f.disposeIntermediateTensorInfo(e);return z}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchNorm.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchNorm.js ***! + \*******************************************************************************/ +/*! exports provided: batchNorm, batchNormConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"batchNorm",(function(){return i})),n.d(t,"batchNormConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../batchnorm_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/batchnorm_gpu.js"),r=n(/*! ../batchnorm_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/batchnorm_packed_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=({inputs:e,backend:t,attrs:n})=>{const{x:i,mean:a,variance:d,offset:u,scale:l}=e;s.util.assert(a.shape.length===d.shape.length,(()=>"Batch normalization gradient requires mean and variance to have equal ranks.")),s.util.assert(null==u||a.shape.length===u.shape.length,(()=>"Batch normalization gradient requires mean and offset to have equal ranks.")),s.util.assert(null==l||a.shape.length===l.shape.length,(()=>"Batch normalization gradient requires mean and scale to have equal ranks."));let{varianceEpsilon:c}=n;null==c&&(c=.001);const f=[i,a,d];let p=null;null!=u&&(p=u.shape,f.push(u));let m=null;null!=l&&(m=l.shape,f.push(l));const h=Object(s.env)().getBool("WEBGL_PACK_NORMALIZATION")?new r.BatchNormPackedProgram(i.shape,a.shape,d.shape,p,m,c):new o.BatchNormProgram(i.shape,a.shape,d.shape,p,m,c);return t.runWebGLProgram(h,f,f[0].dtype)},a={kernelName:s.FusedBatchNorm,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchToSpaceND.js": +/*!************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchToSpaceND.js ***! + \************************************************************************************/ +/*! exports provided: batchToSpaceND, batchToSpaceNDConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"batchToSpaceND",(function(){return a})),n.d(t,"batchToSpaceNDConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),r=n(/*! ./Slice */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Slice.js"),i=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const a=e=>{const{inputs:t,backend:n,attrs:a}=e,{x:d}=t,{blockShape:u,crops:l}=a;s.util.assert(d.shape.length<=4,(()=>"batchToSpaceND for rank > 4 with a WebGL backend not implemented yet"));const c=u.reduce(((e,t)=>e*t)),f=s.backend_util.getReshaped(d.shape,u,c),p=s.backend_util.getPermuted(f.length,u.length),m=s.backend_util.getReshapedPermuted(d.shape,u,c),h=s.backend_util.getSliceBeginCoords(l,u.length),b=s.backend_util.getSliceSize(m,l,u.length),j=[],g=Object(o.reshape)({inputs:{x:d},backend:n,attrs:{shape:f}}),w=Object(i.transpose)({inputs:{x:g},backend:n,attrs:{perm:p}}),_=Object(o.reshape)({inputs:{x:w},backend:n,attrs:{shape:m}}),k=Object(r.slice)({inputs:{x:_},backend:n,attrs:{begin:h,size:b}});return j.push(g),j.push(w),j.push(_),j.forEach((e=>n.disposeIntermediateTensorInfo(e))),k},d={kernelName:s.BatchToSpaceND,backendName:"webgl",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Bincount.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Bincount.js ***! + \******************************************************************************/ +/*! exports provided: bincount, bincountConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"bincount",(function(){return r})),n.d(t,"bincountConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:s}=e,{x:r,weights:i}=t,{size:a}=s,d=n.readSync(r.dataId),u=n.readSync(i.dataId),l=Object(o.bincountImplCPU)(d,u,i.dtype,i.shape,a);return n.makeTensorInfo([a],i.dtype,l)}const i={kernelName:s.Bincount,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Cast.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Cast.js ***! + \**************************************************************************/ +/*! exports provided: cast, castConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"cast",(function(){return u})),n.d(t,"castConfig",(function(){return l}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Complex */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js"),r=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"),i=n(/*! ./NotEqual */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NotEqual.js"),a=n(/*! ./Real */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Real.js"),d=n(/*! ../kernel_utils/int */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/int.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function u(e){const{inputs:t,backend:n,attrs:l}=e,{x:c}=t,{dtype:f}=l;if("complex64"===f){if("complex64"===c.dtype)return Object(r.identity)({inputs:{x:c},backend:n});const e=s.zeros(c.shape),t=u({inputs:{x:c},backend:n,attrs:{dtype:"float32"}}),i=Object(o.complex)({inputs:{real:t,imag:e},backend:n});return e.dispose(),n.disposeIntermediateTensorInfo(t),i}if("complex64"===c.dtype){const e=Object(a.real)({inputs:{input:c},backend:n}),t=u({inputs:{x:e},backend:n,attrs:{dtype:f}});return n.disposeIntermediateTensorInfo(e),t}if(!s.util.hasEncodingLoss(c.dtype,f)){const e=Object(r.identity)({inputs:{x:c},backend:n});return{dataId:e.dataId,shape:e.shape,dtype:f}}if("int32"===f)return Object(d.int)(c,n);if("bool"===f){const e=n.makeTensorInfo([],"bool",s.util.getTypedArrayFromDType("bool",1)),t={a:c,b:e},o=Object(i.notEqual)({inputs:t,backend:n});return n.disposeIntermediateTensorInfo(e),o}throw new Error(`Error in Cast: failed to cast ${c.dtype} to ${f}`)}const l={kernelName:s.Cast,backendName:"webgl",kernelFunc:u}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Ceil.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Ceil.js ***! + \**************************************************************************/ +/*! exports provided: ceil, ceilConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"ceil",(function(){return a})),n.d(t,"ceilConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i="return ceil(x);",a=Object(o.unaryKernelFunc)({opSnippet:i,packedOpSnippet:i,cpuKernelImpl:r.ceilImplCPU}),d={kernelName:s.Ceil,backendName:"webgl",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ClipByValue.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ClipByValue.js ***! + \*********************************************************************************/ +/*! exports provided: clipByValue, clipByValueConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"clipByValue",(function(){return i})),n.d(t,"clipByValueConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../clip_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/clip_gpu.js"),r=n(/*! ../clip_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/clip_packed_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{clipValueMin:d,clipValueMax:u}=i;let l;l=Object(s.env)().getBool("WEBGL_PACK_CLIP")?new r.ClipPackedProgram(a.shape):new o.ClipProgram(a.shape);const c=[[d],[u]];return n.runWebGLProgram(l,[a],a.dtype,c)}const a={kernelName:s.ClipByValue,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js ***! + \*****************************************************************************/ +/*! exports provided: complex, complexConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"complex",(function(){return r})),n.d(t,"complexConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n}=e,{real:s,imag:r}=t,i=n.makeTensorInfo(s.shape,"complex64"),a=n.texData.get(i.dataId),d=Object(o.identity)({inputs:{x:s},backend:n}),u=Object(o.identity)({inputs:{x:r},backend:n});return a.complexTensorInfos={real:d,imag:u},i}const i={kernelName:s.Complex,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ComplexAbs.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ComplexAbs.js ***! + \********************************************************************************/ +/*! exports provided: complexAbs, complexAbsConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"complexAbs",(function(){return i})),n.d(t,"complexAbsConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../complex_abs_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/complex_abs_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e,t){return{dataId:t.dataId,dtype:t.dtype,shape:e.shape}}function i(e){const{inputs:t,backend:n}=e,{x:s}=t,i=n.texData.get(s.dataId),a=new o.ComplexAbsProgram(s.shape),d=[r(s,i.complexTensorInfos.real),r(s,i.complexTensorInfos.imag)];return n.runWebGLProgram(a,d,d[0].dtype)}const a={kernelName:s.ComplexAbs,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Concat.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Concat.js ***! + \****************************************************************************/ +/*! exports provided: concat, concatConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"concat",(function(){return i})),n.d(t,"concatConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Concat_impl */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Concat_impl.js"),r=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{axis:a}=i,d=s.util.parseAxisParam(a,t[0].shape)[0],u=s.backend_util.computeOutShape(t.map((e=>e.shape)),d);if(0===s.util.sizeFromShape(u))return n.makeTensorInfo(u,t[0].dtype,[]);const l=t.filter((e=>s.util.sizeFromShape(e.shape)>0));if(1===l.length)return Object(r.identity)({inputs:{x:l[0]},backend:n});const c=l.map((e=>e.shape));return s.backend_util.assertParamsConsistent(c,d),Object(o.concatImpl)(l,d,n)}const a={kernelName:s.Concat,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Concat_impl.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Concat_impl.js ***! + \*********************************************************************************/ +/*! exports provided: concatImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"concatImpl",(function(){return c}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../concat_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/concat_gpu.js"),r=n(/*! ../concat_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/concat_packed_gpu.js"),i=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"),a=n(/*! ./Complex */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js"),d=n(/*! ./Imag */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Imag.js"),u=n(/*! ./Real */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Real.js"),l=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function c(e,t,n){const f=e[0].dtype;if("complex64"===f){const s=e.map((e=>Object(u.real)({inputs:{input:e},backend:n}))),o=e.map((e=>Object(d.imag)({inputs:{input:e},backend:n}))),r=c(s,t,n),i=c(o,t,n),l=Object(a.complex)({inputs:{real:r,imag:i},backend:n});return s.forEach((e=>n.disposeIntermediateTensorInfo(e))),o.forEach((e=>n.disposeIntermediateTensorInfo(e))),n.disposeIntermediateTensorInfo(r),n.disposeIntermediateTensorInfo(i),l}let p=n.shouldExecuteOnCPU(e);if("string"===f&&(p=!0),p){const o=e.map((e=>{const o=[-1,s.util.sizeFromShape(e.shape.slice(t))];return Object(l.reshape)({inputs:{x:e},backend:n,attrs:{shape:o}})})),r=o.map((e=>({vals:n.readSync(e.dataId),shape:e.shape}))),a=s.backend_util.computeOutShape(o.map((e=>e.shape)),1),d=1===o[0].shape[0],u=Object(i.concatImplCPU)(r,a,f,d),c=s.backend_util.computeOutShape(e.map((e=>e.shape)),t),p=n.makeTensorInfo(c,f,u);return o.forEach((e=>n.disposeIntermediateTensorInfo(e))),p}if(e.length>Object(s.env)().getNumber("WEBGL_MAX_TEXTURES_IN_SHADER")){const s=Math.floor(e.length/2),o=c(e.slice(0,s),t,n),r=c(e.slice(s),t,n),i=c([o,r],t,n);return n.disposeIntermediateTensorInfo(o),n.disposeIntermediateTensorInfo(r),i}if(Object(s.env)().getBool("WEBGL_PACK_ARRAY_OPERATIONS")&&e[0].shape.length>1){const s=new r.ConcatPackedProgram(e.map((e=>e.shape)),t);return n.runWebGLProgram(s,e,f)}const{tensors2D:m,outShape:h}=function(e,t,n){const o=s.backend_util.computeOutShape(e.map((e=>e.shape)),t);return{tensors2D:e.map((e=>Object(l.reshape)({inputs:{x:e},attrs:{shape:[-1,s.util.sizeFromShape(e.shape.slice(t))]},backend:n}))),outShape:o}}(e,t,n),b=new o.ConcatProgram(m.map((e=>e.shape))),j=n.runWebGLProgram(b,m,f);m.forEach((e=>n.disposeIntermediateTensorInfo(e)));const g=Object(l.reshape)({inputs:{x:j},attrs:{shape:h},backend:n});return n.disposeIntermediateTensorInfo(j),g}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2D.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2D.js ***! + \****************************************************************************/ +/*! exports provided: conv2d, conv2DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"conv2d",(function(){return a})),n.d(t,"conv2DConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../conv_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_gpu.js"),r=n(/*! ./Conv2D_impl */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2D_impl.js"),i=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:d,filter:u}=t,{strides:l,pad:c,dataFormat:f,dilations:p,dimRoundingMode:m}=a,h=s.backend_util.convertConv2DDataFormat(f),b=s.backend_util.computeConv2DInfo(d.shape,u.shape,l,p,c,m,!1,h);let j;if(1!==b.filterHeight||1!==b.filterWidth||1!==b.dilationHeight||1!==b.dilationWidth||1!==b.strideHeight||1!==b.strideWidth||"SAME"!==b.padInfo.type&&"VALID"!==b.padInfo.type)if(Object(s.env)().getBool("WEBGL_CONV_IM2COL")&&1===d.shape[0])j=Object(r.conv2dWithIm2Row)({x:d,filter:u,convInfo:b,backend:n});else{const e=new o.Conv2DProgram(b);j=n.runWebGLProgram(e,[d,u],"float32")}else j=Object(r.conv2dByMatMul)({x:d,filter:u,convInfo:b,backend:n});const g=Object(i.reshape)({inputs:{x:j},backend:n,attrs:{shape:b.outShape}});return n.disposeIntermediateTensorInfo(j),g}const d={kernelName:s.Conv2D,backendName:"webgl",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2DBackpropFilter.js": +/*!******************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2DBackpropFilter.js ***! + \******************************************************************************************/ +/*! exports provided: conv2DBackpropFilter, conv2DBackpropFilterConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"conv2DBackpropFilter",(function(){return r})),n.d(t,"conv2DBackpropFilterConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../conv_backprop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i,dy:a}=t,{strides:d,pad:u,dataFormat:l,dimRoundingMode:c,filterShape:f}=r,p=s.backend_util.convertConv2DDataFormat(l),m=s.backend_util.computeConv2DInfo(i.shape,f,d,1,u,c,!1,p),h=new o.Conv2DDerFilterProgram(m);return n.runWebGLProgram(h,[i,a],"float32")}const i={kernelName:s.Conv2DBackpropFilter,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2DBackpropInput.js": +/*!*****************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2DBackpropInput.js ***! + \*****************************************************************************************/ +/*! exports provided: conv2DBackpropInput, conv2DBackpropInputConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"conv2DBackpropInput",(function(){return r})),n.d(t,"conv2DBackpropInputConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../conv_backprop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{dy:i,filter:a}=t,{inputShape:d,strides:u,pad:l,dataFormat:c,dimRoundingMode:f}=r,p=s.backend_util.convertConv2DDataFormat(c),m=s.backend_util.computeConv2DInfo(d,a.shape,u,1,l,f,!1,p),h=new o.Conv2DDerInputProgram(m);return n.runWebGLProgram(h,[i,a],"float32")}const i={kernelName:s.Conv2DBackpropInput,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2D_impl.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2D_impl.js ***! + \*********************************************************************************/ +/*! exports provided: conv2dByMatMul, conv2dWithIm2Row */function(e,t,n){"use strict";n.r(t),n.d(t,"conv2dByMatMul",(function(){return c})),n.d(t,"conv2dWithIm2Row",(function(){return f}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../im2col_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/im2col_packed_gpu.js"),r=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),i=n(/*! ../mulmat_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/mulmat_packed_gpu.js"),a=n(/*! ../webgl_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"),d=n(/*! ./BatchMatMul_impl */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchMatMul_impl.js"),u=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"),l=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function c({x:e,filter:t,convInfo:n,backend:o,bias:r=null,preluActivationWeights:i=null,leakyreluAlpha:c=0,activation:f=null}){const p=e.shape,m=o.texData.get(e.dataId),h=n.inChannels,b=p[0]*p[1]*p[2],j=n.outChannels,g="channelsLast"===n.dataFormat;let w;const _=[],k=(1===b||1===j)&&h>d.MATMUL_SHARED_DIM_THRESHOLD,v=p[2]%2!=0&&!!m.isPacked;if(!k&&Object(s.env)().getBool("WEBGL_LAZILY_UNPACK")&&Object(s.env)().getBool("WEBGL_PACK_BINARY_OPERATIONS")&&v){const h=g?p[0]*p[1]*(p[2]+1):p[0]*p[2]*(p[3]+1),b={dataId:e.dataId,shape:[1,h,n.inChannels],dtype:e.dtype},j=m.shape;m.shape=m.shape.slice(),m.shape[m.shape.length-2]++,s.util.assert(a.isReshapeFree(m.shape,b.shape),(()=>`packed reshape ${m.shape} to ${b.shape} isn't free`));const k=Object(l.reshape)({inputs:{x:t},backend:o,attrs:{shape:[1,n.inChannels,n.outChannels]}});_.push(k);const v=Object(d.batchMatMulImpl)({a:b,b:k,backend:o,transposeA:false,transposeB:false,bias:r,activation:f,preluActivationWeights:i,leakyreluAlpha:c}),x=o.texData.get(v.dataId);s.util.assert(x.isPacked,(()=>"batchMatMul result is expected to be packed")),m.shape=j,x.shape=n.outShape,w=Object(u.identity)({inputs:{x:v},backend:o}),w.shape=n.outShape,_.push(v)}else{const s=g?p[0]*p[1]*p[2]:p[0]*p[2]*p[3],a=Object(l.reshape)({inputs:{x:e},backend:o,attrs:{shape:[1,s,n.inChannels]}}),u=Object(l.reshape)({inputs:{x:t},backend:o,attrs:{shape:[1,n.inChannels,n.outChannels]}}),m=Object(d.batchMatMulImpl)({a:a,b:u,transposeA:false,transposeB:false,backend:o,bias:r,activation:f,preluActivationWeights:i,leakyreluAlpha:c});w=Object(l.reshape)({inputs:{x:m},backend:o,attrs:{shape:n.outShape}}),_.push(a),_.push(u),_.push(m)}for(const e of _)o.disposeIntermediateTensorInfo(e);return w}function f({x:e,filter:t,convInfo:n,backend:a,bias:d=null,preluActivationWeights:u=null,leakyreluAlpha:c=0,activation:f=null}){const{filterWidth:p,filterHeight:m,inChannels:h,outWidth:b,outHeight:j,dataFormat:g}=n,w="channelsLast"===g,_=p*m*h,k=j*b,v=[_,k],x=[],y=Object(l.reshape)({inputs:{x:e},backend:a,attrs:{shape:e.shape.slice(1)}}),O=Object(l.reshape)({inputs:{x:t},backend:a,attrs:{shape:[1,_,s.util.sizeFromShape(t.shape)/_]}});x.push(y),x.push(O);const I=new o.Im2ColPackedProgram(v,y.shape,n),C=a.runWebGLProgram(I,[y],"float32"),S=Object(l.reshape)({inputs:{x:C},backend:a,attrs:{shape:[1,v[0],v[1]]}});x.push(C),x.push(S);const T=null!=d,N=null!=u,E="leakyrelu"===f,A=f?Object(r.mapActivationToShaderProgram)(f,!0):null,R=new i.MatMulPackedProgram(S.shape,O.shape,[1,k,n.outChannels],!0,!1,T,A,N,E),F=[S,O];if(d&&F.push(d),N&&F.push(u),E){const e=a.makeTensorInfo([],"float32",s.util.createScalarValue(c,"float32"));F.push(e),x.push(e)}const $=a.runWebGLProgram(R,F,"float32"),M=w?[1,j,b,n.outChannels]:[1,n.outChannels,j,b],D=Object(l.reshape)({inputs:{x:$},backend:a,attrs:{shape:M}});x.push($);for(const e of x)a.disposeIntermediateTensorInfo(e);return D}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv3D.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv3D.js ***! + \****************************************************************************/ +/*! exports provided: conv3D, conv3DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"conv3D",(function(){return r})),n.d(t,"conv3DConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../conv_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i,filter:a}=t,{strides:d,pad:u,dilations:l}=r,c=s.backend_util.computeConv3DInfo(i.shape,a.shape,d,l,u),f=new o.Conv3DProgram(c);return n.runWebGLProgram(f,[i,a],"float32")}const i={kernelName:s.Conv3D,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv3DBackpropFilterV2.js": +/*!********************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv3DBackpropFilterV2.js ***! + \********************************************************************************************/ +/*! exports provided: conv3DBackpropFilterV2, conv3DBackpropFilterV2Config */function(e,t,n){"use strict";n.r(t),n.d(t,"conv3DBackpropFilterV2",(function(){return r})),n.d(t,"conv3DBackpropFilterV2Config",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../conv_backprop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i,dy:a}=t,{strides:d,pad:u,filterShape:l}=r,c=s.backend_util.computeConv3DInfo(i.shape,l,d,1,u),f=new o.Conv3DDerFilterProgram(c);return n.runWebGLProgram(f,[i,a],"float32")}const i={kernelName:s.Conv3DBackpropFilterV2,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv3DBackpropInputV2.js": +/*!*******************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv3DBackpropInputV2.js ***! + \*******************************************************************************************/ +/*! exports provided: conv3DBackpropInput, conv3DBackpropInputConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"conv3DBackpropInput",(function(){return r})),n.d(t,"conv3DBackpropInputConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../conv_backprop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{dy:i,filter:a}=t,{pad:d,strides:u,inputShape:l}=r,c=s.backend_util.computeConv3DInfo(l,a.shape,u,1,d),f=new o.Conv3DDerInputProgram(c);return n.runWebGLProgram(f,[i,a],"float32")}const i={kernelName:s.Conv3DBackpropInputV2,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Cos.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Cos.js ***! + \*************************************************************************/ +/*! exports provided: cos, cosConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"cos",(function(){return i})),n.d(t,"cosConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=o.CHECK_NAN_SNIPPET_UNARY+"\n return cos(x);\n",i=Object(o.unaryKernelFunc)({opSnippet:r}),a={kernelName:s.Cos,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Cosh.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Cosh.js ***! + \**************************************************************************/ +/*! exports provided: cosh, coshConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"cosh",(function(){return r})),n.d(t,"coshConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)({opSnippet:"\n float e2x = exp(-x);\n return (e2x + 1.0 / e2x) / 2.0;\n"}),i={kernelName:s.Cosh,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/CropAndResize.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/CropAndResize.js ***! + \***********************************************************************************/ +/*! exports provided: cropAndResize, cropAndResizeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"cropAndResize",(function(){return r})),n.d(t,"cropAndResizeConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../crop_and_resize_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/crop_and_resize_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=e=>{const{inputs:t,backend:n,attrs:s}=e,{image:r,boxes:i,boxInd:a}=t,{cropSize:d,method:u,extrapolationValue:l}=s,c=new o.CropAndResizeProgram(r.shape,i.shape,d,u,l);return n.runWebGLProgram(c,[r,i,a],"float32")},i={kernelName:s.CropAndResize,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Cumsum.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Cumsum.js ***! + \****************************************************************************/ +/*! exports provided: cumsum, cumsumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"cumsum",(function(){return a})),n.d(t,"cumsumConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cumsum_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/cumsum_gpu.js"),r=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"),i=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:d}=t,{axis:u,exclusive:l,reverse:c}=a,f=d.shape.length,p=s.backend_util.getAxesPermutation([u],f);let m=d;null!=p&&(m=Object(i.transpose)({inputs:{x:d},backend:n,attrs:{perm:p}}));const h=s.backend_util.getInnerMostAxes(1,f)[0];if(h!==f-1)throw new Error(`WebGL cumsum shader expects an inner-most axis=${d.shape.length-1} but got axis=${u}`);const b=m.shape[h];let j=Object(r.identity)({inputs:{x:m},backend:n});for(let e=0;e<=Math.ceil(Math.log2(b))-1;e++){const t=new o.CumSumProgram(m.shape,!1,c),s=[[e]],r=j;j=n.runWebGLProgram(t,[j],j.dtype,s),n.disposeIntermediateTensorInfo(r)}if(l){const e=new o.CumSumProgram(m.shape,l,c),t=j;j=n.runWebGLProgram(e,[j],j.dtype),n.disposeIntermediateTensorInfo(t)}if(null!=p){const e=s.backend_util.getUndoAxesPermutation(p),t=Object(i.transpose)({inputs:{x:j},backend:n,attrs:{perm:e}});return n.disposeIntermediateTensorInfo(j),n.disposeIntermediateTensorInfo(m),t}return j}const d={kernelName:s.Cumsum,backendName:"webgl",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/DenseBincount.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/DenseBincount.js ***! + \***********************************************************************************/ +/*! exports provided: denseBincount, denseBincountConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"denseBincount",(function(){return r})),n.d(t,"denseBincountConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:s}=e,{x:r,weights:i}=t,{size:a,binaryOutput:d}=s;if(1===r.shape.length){const e=n.readSync(r.dataId),t=n.readSync(i.dataId),s=Object(o.bincountImplCPU)(e,t,i.dtype,i.shape,a);return n.makeTensorInfo([a],i.dtype,s)}if(2===r.shape.length){const e=n.bufferSync(r),t=n.bufferSync(i),s=Object(o.bincountReduceImplCPU)(e,t,a,d);return n.makeTensorInfo(s.shape,i.dtype,s.values)}throw new Error(`Error in denseBincount: input must be at most rank 2, but got rank${r.shape.length}.`)}const i={kernelName:s.DenseBincount,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthToSpace.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthToSpace.js ***! + \**********************************************************************************/ +/*! exports provided: depthToSpace, depthToSpaceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"depthToSpace",(function(){return r})),n.d(t,"depthToSpaceConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../depth_to_space_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/depth_to_space_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i}=t,{blockSize:a,dataFormat:d}=r;s.util.assert(a>1,(()=>`blockSize should be > 1 for depthToSpace, but was: ${a}`));const u=i.shape[0],l="NHWC"===d?i.shape[1]:i.shape[2],c="NHWC"===d?i.shape[2]:i.shape[3],f="NHWC"===d?i.shape[3]:i.shape[1],p=l*a,m=c*a,h=f/(a*a),b="NHWC"===d?[u,p,m,h]:[u,h,p,m],j=new o.DepthToSpaceProgram(b,a,d);return n.runWebGLProgram(j,[i],i.dtype)}const i={kernelName:s.DepthToSpace,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthwiseConv2dNative.js": +/*!*******************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthwiseConv2dNative.js ***! + \*******************************************************************************************/ +/*! exports provided: depthwiseConv2dNative, depthwiseConv2dNativeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"depthwiseConv2dNative",(function(){return i})),n.d(t,"depthwiseConv2dNativeConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../conv_gpu_depthwise */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_gpu_depthwise.js"),r=n(/*! ../conv_packed_gpu_depthwise */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_packed_gpu_depthwise.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a,filter:d}=t,{strides:u,pad:l,dilations:c,dimRoundingMode:f}=i;let p=c;null==p&&(p=[1,1]),s.util.assert(s.backend_util.eitherStridesOrDilationsAreOne(u,p),(()=>`Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides ${u} and dilations '${p}'`));const m=s.backend_util.computeConv2DInfo(a.shape,d.shape,u,p,l,f,!0);let h;return h=Object(s.env)().getBool("WEBGL_PACK_DEPTHWISECONV")&&m.strideWidth<=2&&m.outChannels/m.inChannels==1?new r.DepthwiseConvPacked2DProgram(m):new o.DepthwiseConv2DProgram(m),n.runWebGLProgram(h,[a,d],"float32")}const a={kernelName:s.DepthwiseConv2dNative,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthwiseConv2dNativeBackpropFilter.js": +/*!*********************************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthwiseConv2dNativeBackpropFilter.js ***! + \*********************************************************************************************************/ +/*! exports provided: depthwiseConv2dNativeBackpropFilter, depthwiseConv2dNativeBackpropFilterConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"depthwiseConv2dNativeBackpropFilter",(function(){return r})),n.d(t,"depthwiseConv2dNativeBackpropFilterConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../conv_backprop_gpu_depthwise */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu_depthwise.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i,dy:a}=t,{strides:d,dilations:u,pad:l,dimRoundingMode:c,filterShape:f}=r,p=s.backend_util.computeConv2DInfo(i.shape,f,d,u,l,c,!0),m=new o.DepthwiseConv2DDerFilterProgram(p);return n.runWebGLProgram(m,[i,a],"float32")}const i={kernelName:s.DepthwiseConv2dNativeBackpropFilter,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthwiseConv2dNativeBackpropInput.js": +/*!********************************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthwiseConv2dNativeBackpropInput.js ***! + \********************************************************************************************************/ +/*! exports provided: depthwiseConv2dNativeBackpropInput, depthwiseConv2dNativeBackpropInputConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"depthwiseConv2dNativeBackpropInput",(function(){return r})),n.d(t,"depthwiseConv2dNativeBackpropInputConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../conv_backprop_gpu_depthwise */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu_depthwise.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{dy:i,filter:a}=t,{strides:d,dilations:u,pad:l,dimRoundingMode:c,inputShape:f}=r,p=s.backend_util.computeConv2DInfo(f,a.shape,d,u,l,c,!0),m=new o.DepthwiseConv2DDerInputProgram(p);return n.runWebGLProgram(m,[i,a],"float32")}const i={kernelName:s.DepthwiseConv2dNativeBackpropInput,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Diag.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Diag.js ***! + \**************************************************************************/ +/*! exports provided: diag, diagConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"diag",(function(){return i})),n.d(t,"diagConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../diag_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/diag_gpu.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n}=e,{x:i}=t,a=[...i.shape,...i.shape],d=s.util.sizeFromShape(i.shape),u=Object(r.reshape)({inputs:{x:i},backend:n,attrs:{shape:[d]}}),l=new o.DiagProgram(d),c=n.runWebGLProgram(l,[u],u.dtype),f=Object(r.reshape)({inputs:{x:c},backend:n,attrs:{shape:a}});return n.disposeIntermediateTensorInfo(u),n.disposeIntermediateTensorInfo(c),f}const a={kernelName:s.Diag,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Dilation2D.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Dilation2D.js ***! + \********************************************************************************/ +/*! exports provided: dilation2D, dilation2DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"dilation2D",(function(){return i})),n.d(t,"dilation2DConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../dilation_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/dilation_gpu.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a,filter:d}=t,{strides:u,pad:l,dilations:c}=i,f=s.backend_util.computeDilation2DInfo(a.shape,d.shape,u,l,"NHWC",c);let p;const m=new o.Dilation2DProgram(f);p=n.runWebGLProgram(m,[a,d],"float32");const h=Object(r.reshape)({inputs:{x:p},backend:n,attrs:{shape:f.outShape}});return n.disposeIntermediateTensorInfo(p),h}const a={kernelName:s.Dilation2D,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Einsum.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Einsum.js ***! + \****************************************************************************/ +/*! exports provided: einsum, einsumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"einsum",(function(){return d})),n.d(t,"einsumConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Multiply */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Multiply.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),i=n(/*! ./Sum */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sum.js"),a=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function d(e){const{inputs:t,backend:n,attrs:d}=e,{equation:u}=d,l=t,{allDims:c,summedDims:f,idDims:p}=s.backend_util.decodeEinsumEquation(u,l.length);s.backend_util.checkEinsumDimSizes(c.length,p,l);const{path:m,steps:h}=s.backend_util.getEinsumComputePath(f,p),b=h.length;let j=null,g=c.length;const w=[];for(let e=0;e=0&&(j=Object(i.sum)({inputs:{x:j},backend:n,attrs:{axis:m[e]-(c.length-g),keepDims:!1}}),w.push(j)),g--)}for(const e of w)e!==j&&n.disposeIntermediateTensorInfo(e);return j}const u={kernelName:s.Einsum,backendName:"webgl",kernelFunc:d}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Elu.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Elu.js ***! + \*************************************************************************/ +/*! exports provided: eluConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"eluConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)({opSnippet:"return (x >= 0.0) ? x : (exp(x) - 1.0);",packedOpSnippet:"\n vec4 result;\n\n result.r = (x.r >= 0.0) ? x.r : (exp(x.r) - 1.0);\n result.g = (x.g >= 0.0) ? x.g : (exp(x.g) - 1.0);\n result.b = (x.b >= 0.0) ? x.b : (exp(x.b) - 1.0);\n result.a = (x.a >= 0.0) ? x.a : (exp(x.a) - 1.0);\n\n return result;\n"}),i={kernelName:s.Elu,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/EluGrad.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/EluGrad.js ***! + \*****************************************************************************/ +/*! exports provided: eluGrad, eluGradConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"eluGrad",(function(){return i})),n.d(t,"eluGradConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../binaryop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_gpu.js"),r=n(/*! ../binaryop_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_packed_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=e=>{const{inputs:t,backend:n}=e,{dy:i,y:a}=t,d=Object(s.env)().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new r.BinaryOpPackedProgram("\n vec4 bGTEZero = vec4(greaterThanEqual(b, vec4(0.)));\n return (bGTEZero * a) + ((vec4(1.0) - bGTEZero) * (a * (b + vec4(1.0))));\n",i.shape,a.shape):new o.BinaryOpProgram("return (b >= 1.0) ? a : a * (b + 1.0);",i.shape,a.shape);return n.runWebGLProgram(d,[i,a],i.dtype)},a={kernelName:s.EluGrad,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Equal.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Equal.js ***! + \***************************************************************************/ +/*! exports provided: equal, equalConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"equal",(function(){return i})),n.d(t,"equalConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.binaryKernelFunc)({opSnippet:"return float(a == b);",packedOpSnippet:"\n return vec4(equal(a, b));\n",dtype:"bool",cpuKernelImpl:r.equalImplCPU}),a={kernelName:s.Equal,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Erf.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Erf.js ***! + \*************************************************************************/ +/*! exports provided: erf, erfConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"erf",(function(){return i})),n.d(t,"erfConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=`\n // Error function is calculated approximately with elementary function.\n // See "Handbook of Mathematical Functions with Formulas,\n // Graphs, and Mathematical Tables", Abramowitz and Stegun.\n float p = ${s.backend_util.ERF_P};\n float a1 = ${s.backend_util.ERF_A1};\n float a2 = ${s.backend_util.ERF_A2};\n float a3 = ${s.backend_util.ERF_A3};\n float a4 = ${s.backend_util.ERF_A4};\n float a5 = ${s.backend_util.ERF_A5};\n\n float sign = sign(x);\n x = abs(x);\n float t = 1.0 / (1.0 + p * x);\n return sign * (1.0 - (((((a5*t + a4)*t) + a3)*t + a2)*t + a1)*t*exp(-x*x));\n`,i=Object(o.unaryKernelFunc)({opSnippet:r}),a={kernelName:s.Erf,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Exp.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Exp.js ***! + \*************************************************************************/ +/*! exports provided: EXP, exp, expConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"EXP",(function(){return i})),n.d(t,"exp",(function(){return a})),n.d(t,"expConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i="return exp(x);",a=Object(o.unaryKernelFunc)({opSnippet:i,packedOpSnippet:i,cpuKernelImpl:r.expImplCPU}),d={kernelName:s.Exp,backendName:"webgl",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ExpandDims.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ExpandDims.js ***! + \********************************************************************************/ +/*! exports provided: expandDims, expandDimsConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"expandDims",(function(){return r})),n.d(t,"expandDimsConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,attrs:n,backend:r}=e,{dim:i}=n,{input:a}=t,d=a.shape.length,u=a.shape.slice();let l=i;return i<0&&(s.util.assert(-(d+1)<=i,(()=>`Axis must be in the interval [${-(d+1)}, ${d}]`)),l=d+i+1),u.splice(l,0,1),Object(o.reshape)({inputs:{x:a},backend:r,attrs:{shape:u}})}const i={kernelName:s.ExpandDims,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Expm1.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Expm1.js ***! + \***************************************************************************/ +/*! exports provided: expm1, expm1Config */function(e,t,n){"use strict";n.r(t),n.d(t,"expm1",(function(){return a})),n.d(t,"expm1Config",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i="return exp(x) - 1.0;",a=Object(o.unaryKernelFunc)({opSnippet:i,packedOpSnippet:i,cpuKernelImpl:r.expm1ImplCPU}),d={kernelName:s.Expm1,backendName:"webgl",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FFT.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FFT.js ***! + \*************************************************************************/ +/*! exports provided: fft, fftConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fft",(function(){return r})),n.d(t,"fftConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./FFT_impl */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FFT_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n}=e,{input:s}=t;return Object(o.fftImpl)(s,!1,n)}const i={kernelName:s.FFT,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FFT_impl.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FFT_impl.js ***! + \******************************************************************************/ +/*! exports provided: fftImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"fftImpl",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../fft_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/fft_gpu.js"),r=n(/*! ./Complex */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js"),i=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e,t,n){const a=n.texData.get(e.dataId),d=s.util.sizeFromShape(e.shape),u=e.shape[e.shape.length-1],l=d/u,c=Object(i.reshape)({inputs:{x:e},backend:n,attrs:{shape:[l,u]}}),f=c.shape,p=new o.FFTProgram("real",f,t),m=new o.FFTProgram("imag",f,t),h=[{dataId:a.complexTensorInfos.real.dataId,dtype:a.complexTensorInfos.real.dtype,shape:f},{dataId:a.complexTensorInfos.imag.dataId,dtype:a.complexTensorInfos.imag.dtype,shape:f}],b=n.runWebGLProgram(p,h,"float32"),j=n.runWebGLProgram(m,h,"float32"),g=Object(r.complex)({inputs:{real:b,imag:j},backend:n});n.disposeIntermediateTensorInfo(b),n.disposeIntermediateTensorInfo(j);const w=Object(i.reshape)({inputs:{x:g},backend:n,attrs:{shape:e.shape}});return n.disposeIntermediateTensorInfo(c),n.disposeIntermediateTensorInfo(g),w}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Fill.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Fill.js ***! + \**************************************************************************/ +/*! exports provided: fill, fillConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fill",(function(){return r})),n.d(t,"fillConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../fill_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/fill_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{backend:t,attrs:n}=e,{shape:r,value:i}=n;let{dtype:a}=n;if(a=a||s.util.inferDtype(i),"string"===a){const e=s.util.getArrayFromDType(a,s.util.sizeFromShape(r));return e.fill(i),t.makeTensorInfo(r,a,e)}{const e=new o.FillProgram(r,i),n=[[i]];return t.runWebGLProgram(e,[],a,n)}}const i={kernelName:s.Fill,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FlipLeftRight.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FlipLeftRight.js ***! + \***********************************************************************************/ +/*! exports provided: flipLeftRightConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"flipLeftRightConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../flip_left_right_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/flip_left_right_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r={kernelName:s.FlipLeftRight,backendName:"webgl",kernelFunc:({inputs:e,backend:t})=>{const{image:n}=e,s=t,r=new o.FlipLeftRightProgram(n.shape);return s.runWebGLProgram(r,[n],n.dtype)}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Floor.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Floor.js ***! + \***************************************************************************/ +/*! exports provided: floor, floorConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"floor",(function(){return a})),n.d(t,"floorConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i="return floor(x);",a=Object(o.unaryKernelFunc)({opSnippet:i,packedOpSnippet:i,cpuKernelImpl:r.floorImplCPU}),d={kernelName:s.Floor,backendName:"webgl",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FloorDiv.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FloorDiv.js ***! + \******************************************************************************/ +/*! exports provided: floorDiv, floorDivConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"floorDiv",(function(){return r})),n.d(t,"floorDivConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.binaryKernelFunc)({opSnippet:"\n float s = sign(a) * sign(b);\n int ia = round(a);\n int ib = round(b);\n if (ib != 0) {\n // Windows (D3D) wants guaranteed non-zero int division at compile-time.\n return float(idiv(ia, ib, s));\n } else {\n return NAN;\n }\n",packedOpSnippet:"\n ivec4 ia = round(a);\n ivec4 ib = round(b);\n bvec4 cond = notEqual(ib, ivec4(0));\n ivec4 result = ivec4(0);\n vec4 s = sign(a) * sign(b);\n\n // Windows (D3D) wants guaranteed non-zero int division at compile-time.\n if (cond[0]) {\n result[0] = idiv(ia[0], ib[0], s[0]);\n }\n if (cond[1]) {\n result[1] = idiv(ia[1], ib[1], s[1]);\n }\n if (cond[2]) {\n result[2] = idiv(ia[2], ib[2], s[2]);\n }\n if (cond[3]) {\n result[3] = idiv(ia[3], ib[3], s[3]);\n }\n return vec4(result);\n",dtype:"int32"}),i={kernelName:s.FloorDiv,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FromPixels.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FromPixels.js ***! + \********************************************************************************/ +/*! exports provided: fromPixelsConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fromPixelsConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../tex_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/tex_util.js"),r=n(/*! ./FromPixels_utils/from_pixels_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FromPixels_utils/from_pixels_gpu.js"),i=n(/*! ./FromPixels_utils/from_pixels_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FromPixels_utils/from_pixels_packed_gpu.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const a={kernelName:s.FromPixels,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e;let{pixels:u}=t;const{numChannels:l}=a,c="undefined"!=typeof HTMLVideoElement&&u instanceof HTMLVideoElement,f="undefined"!=typeof HTMLImageElement&&u instanceof HTMLImageElement,[p,m]=c?[u.videoWidth,u.videoHeight]:[u.width,u.height],h=[m,p],b=[m,p,l];(f||c)&&(null==d&&(d=document.createElement("canvas").getContext("2d")),d.canvas.width=p,d.canvas.height=m,d.drawImage(u,0,0,p,m),u=d.canvas);const j=n.makeTensorInfo(h,"int32");n.texData.get(j.dataId).usage=o.TextureUsage.PIXELS,n.gpgpu.uploadPixelDataToTexture(n.getTexture(j.dataId),u);const g=Object(s.env)().getBool("WEBGL_PACK")?new i.FromPixelsPackedProgram(b):new r.FromPixelsProgram(b),w=n.runWebGLProgram(g,[j],"int32");return n.disposeData(j.dataId),w}};let d},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FromPixels_utils/from_pixels_gpu.js": +/*!******************************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FromPixels_utils/from_pixels_gpu.js ***! + \******************************************************************************************************/ +/*! exports provided: FromPixelsProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"FromPixelsProgram",(function(){return o}));var s=n(/*! ../../glsl_version */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */class o{constructor(e){this.variableNames=["A"];const t=Object(s.getGlslDifferences)(),[n,o]=e;this.outputShape=e,this.userCode=`\n void main() {\n ivec3 coords = getOutputCoords();\n int texR = coords[0];\n int texC = coords[1];\n int depth = coords[2];\n vec2 uv = (vec2(texC, texR) + halfCR) / vec2(${o}.0, ${n}.0);\n\n vec4 values = ${t.texture2D}(A, uv);\n float value;\n if (depth == 0) {\n value = values.r;\n } else if (depth == 1) {\n value = values.g;\n } else if (depth == 2) {\n value = values.b;\n } else if (depth == 3) {\n value = values.a;\n }\n\n setOutput(floor(value * 255.0 + 0.5));\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FromPixels_utils/from_pixels_packed_gpu.js": +/*!*************************************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FromPixels_utils/from_pixels_packed_gpu.js ***! + \*************************************************************************************************************/ +/*! exports provided: FromPixelsPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"FromPixelsPackedProgram",(function(){return o}));var s=n(/*! ../../glsl_version */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */class o{constructor(e){this.variableNames=["A"],this.packedInputs=!1,this.packedOutput=!0;const t=Object(s.getGlslDifferences)(),[n,o]=e;this.outputShape=e,this.userCode=`\n void main() {\n ivec3 coords = getOutputCoords();\n int texR = coords[0];\n int texC = coords[1];\n int depth = coords[2];\n\n vec4 result = vec4(0.);\n\n for(int row=0; row<=1; row++) {\n for(int col=0; col<=1; col++) {\n texC = coords[1] + row;\n depth = coords[2] + col;\n\n vec2 uv = (vec2(texC, texR) + halfCR) /\n vec2(${o}.0, ${n}.0);\n vec4 values = ${t.texture2D}(A, uv);\n float value;\n if (depth == 0) {\n value = values.r;\n } else if (depth == 1) {\n value = values.g;\n } else if (depth == 2) {\n value = values.b;\n } else if (depth == 3) {\n value = values.a;\n }\n\n result[row * 2 + col] = floor(value * 255.0 + 0.5);\n }\n }\n\n ${t.output} = result;\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FusedConv2D.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FusedConv2D.js ***! + \*********************************************************************************/ +/*! exports provided: fusedConv2d, fusedConv2DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fusedConv2d",(function(){return d})),n.d(t,"fusedConv2DConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../conv_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_gpu.js"),r=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),i=n(/*! ./Conv2D_impl */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2D_impl.js"),a=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function d(e){const{inputs:t,backend:n,attrs:d}=e,{x:u,filter:l,bias:c,preluActivationWeights:f}=t,{strides:p,pad:m,dataFormat:h,dilations:b,dimRoundingMode:j,activation:g,leakyreluAlpha:w}=d,_=s.backend_util.convertConv2DDataFormat(h),k=s.backend_util.computeConv2DInfo(u.shape,l.shape,p,b,m,j,!1,_);let v;const x=[];if(1!==k.filterHeight||1!==k.filterWidth||1!==k.dilationHeight||1!==k.dilationWidth||1!==k.strideHeight||1!==k.strideWidth||"SAME"!==k.padInfo.type&&"VALID"!==k.padInfo.type)if(Object(s.env)().getBool("WEBGL_CONV_IM2COL")&&1===u.shape[0])v=Object(i.conv2dWithIm2Row)({x:u,filter:l,convInfo:k,backend:n,bias:c,activation:g,preluActivationWeights:f,leakyreluAlpha:w});else{const e=null!=c,t=null!=f,i="leakyrelu"===g,a=g?Object(r.mapActivationToShaderProgram)(g,!1):null,d=new o.Conv2DProgram(k,e,a,t,i),p=[u,l];if(c&&p.push(c),f&&p.push(f),i){const e=n.makeTensorInfo([],"float32",s.util.createScalarValue(w,"float32"));p.push(e),x.push(e)}v=n.runWebGLProgram(d,p,"float32")}else v=Object(i.conv2dByMatMul)({x:u,filter:l,convInfo:k,backend:n,bias:c,activation:g,preluActivationWeights:f,leakyreluAlpha:w});const y=Object(a.reshape)({inputs:{x:v},backend:n,attrs:{shape:k.outShape}});return x.push(v),x.forEach((e=>n.disposeIntermediateTensorInfo(e))),y}const u={kernelName:s.FusedConv2D,backendName:"webgl",kernelFunc:d}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FusedDepthwiseConv2D.js": +/*!******************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FusedDepthwiseConv2D.js ***! + \******************************************************************************************/ +/*! exports provided: fusedDepthwiseConv2D, fusedDepthwiseConv2DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fusedDepthwiseConv2D",(function(){return a})),n.d(t,"fusedDepthwiseConv2DConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../conv_gpu_depthwise */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_gpu_depthwise.js"),r=n(/*! ../conv_packed_gpu_depthwise */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_packed_gpu_depthwise.js"),i=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:d,filter:u,bias:l,preluActivationWeights:c}=t,{strides:f,pad:p,dilations:m,dimRoundingMode:h,activation:b,leakyreluAlpha:j}=a,g=[];let w=m;null==w&&(w=[1,1]),s.util.assert(s.backend_util.eitherStridesOrDilationsAreOne(f,w),(()=>`Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides ${f} and dilations '${w}'`));const _=s.backend_util.computeConv2DInfo(d.shape,u.shape,f,w,p,h,!0),k=Object(s.env)().getBool("WEBGL_PACK_DEPTHWISECONV")&&_.strideWidth<=2&&_.outChannels/_.inChannels==1,v=b?Object(i.mapActivationToShaderProgram)(b,k):null,x=[d,u],y=null!=l,O=null!=c,I="leakyrelu"===b;if(y&&x.push(l),O&&x.push(c),I){const e=n.makeTensorInfo([],"float32",s.util.createScalarValue(j,"float32"));x.push(e),g.push(e)}let C;C=k?new r.DepthwiseConvPacked2DProgram(_,y,v,O,I):new o.DepthwiseConv2DProgram(_,y,v,O,I);const S=n.runWebGLProgram(C,x,"float32");return g.forEach((e=>n.disposeIntermediateTensorInfo(e))),S}const d={kernelName:s.FusedDepthwiseConv2D,backendName:"webgl",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/GatherNd.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/GatherNd.js ***! + \******************************************************************************/ +/*! exports provided: gatherNd, gatherNdConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"gatherNd",(function(){return a})),n.d(t,"gatherNdConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../gather_nd_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/gather_nd_gpu.js"),r=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"),i=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){const{inputs:t,backend:n}=e,{params:a,indices:d}=t,u=d.shape,l=u[u.length-1],c=s.util.sizeFromShape(a.shape),[f,p,m,h]=s.backend_util.prepareAndValidate(a,d),b=Object(i.reshape)({inputs:{x:d},backend:n,attrs:{shape:[p,l]}}),j=Object(i.reshape)({inputs:{x:a},backend:n,attrs:{shape:[s.util.sizeFromShape(a.shape)/m,m]}});if(n.shouldExecuteOnCPU([a,d])||"string"===a.dtype){const e=n.readSync(d.dataId),t=n.bufferSync(a),s=Object(r.gatherNdImplCPU)(e,t,a.dtype,p,l,m,h,a.shape,c);return n.makeTensorInfo(f,a.dtype,s.values)}const g=new o.GatherNDProgram(l,h,[p,m]),w=n.runWebGLProgram(g,[j,b],j.dtype),_=Object(i.reshape)({inputs:{x:w},backend:n,attrs:{shape:f}});return n.disposeIntermediateTensorInfo(b),n.disposeIntermediateTensorInfo(j),n.disposeIntermediateTensorInfo(w),_}const d={kernelName:s.GatherNd,backendName:"webgl",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/GatherV2.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/GatherV2.js ***! + \******************************************************************************/ +/*! exports provided: gatherV2, gatherV2Config */function(e,t,n){"use strict";n.r(t),n.d(t,"gatherV2",(function(){return a})),n.d(t,"gatherV2Config",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../gather_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/gather_gpu.js"),r=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"),i=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:d,indices:u}=t,{axis:l,batchDims:c}=a,f=s.util.parseAxisParam(l,d.shape)[0],p=s.backend_util.segment_util.collectGatherOpShapeInfo(d,u,f,c),m=s.util.sizeFromShape(u.shape),h=[],b=Object(i.reshape)({inputs:{x:d},backend:n,attrs:{shape:[p.batchSize,p.outerSize,p.dimSize,p.sliceSize]}}),j=Object(i.reshape)({inputs:{x:u},backend:n,attrs:{shape:[p.batchSize,m/p.batchSize]}});h.push(b),h.push(j);const g=[p.batchSize,p.outerSize,m/p.batchSize,p.sliceSize];if(n.shouldExecuteOnCPU([d,u])||"string"===d.dtype){const e=n.bufferSync(j),t=n.bufferSync(b),s=Object(r.gatherV2ImplCPU)(t,e,g);return h.forEach((e=>n.disposeIntermediateTensorInfo(e))),n.makeTensorInfo(p.outputShape,s.dtype,s.values)}const w=new o.GatherProgram(b.shape,g),_=n.runWebGLProgram(w,[b,j],b.dtype);h.push(_);const k=Object(i.reshape)({inputs:{x:_},backend:n,attrs:{shape:p.outputShape}});return h.forEach((e=>n.disposeIntermediateTensorInfo(e))),k}const d={kernelName:s.GatherV2,backendName:"webgl",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Greater.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Greater.js ***! + \*****************************************************************************/ +/*! exports provided: greater, greaterConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"greater",(function(){return i})),n.d(t,"greaterConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.binaryKernelFunc)({opSnippet:"return float(a > b);",packedOpSnippet:"\n return vec4(greaterThan(a, b));\n",cpuKernelImpl:r.greaterImplCPU,dtype:"bool"}),a={kernelName:s.Greater,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/GreaterEqual.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/GreaterEqual.js ***! + \**********************************************************************************/ +/*! exports provided: greaterEqual, greaterEqualConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"greaterEqual",(function(){return i})),n.d(t,"greaterEqualConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.binaryKernelFunc)({opSnippet:"return float(a >= b);",packedOpSnippet:"\n return vec4(greaterThanEqual(a, b));\n",dtype:"bool",cpuKernelImpl:r.greaterEqualImplCPU}),a={kernelName:s.GreaterEqual,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/IFFT.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/IFFT.js ***! + \**************************************************************************/ +/*! exports provided: ifft, ifftConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"ifft",(function(){return r})),n.d(t,"ifftConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./FFT_impl */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FFT_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n}=e,{input:s}=t;return Object(o.fftImpl)(s,!0,n)}const i={kernelName:s.IFFT,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js ***! + \******************************************************************************/ +/*! exports provided: identity, identityConfig */function(e,t,n){"use strict"; +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function s(e){const{inputs:t,backend:n}=e,{x:s}=t;return n.incRef(s.dataId),{dataId:s.dataId,shape:s.shape,dtype:s.dtype}}n.r(t),n.d(t,"identity",(function(){return s})),n.d(t,"identityConfig",(function(){return o}));const o={kernelName:n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js").Identity,backendName:"webgl",kernelFunc:s}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Imag.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Imag.js ***! + \**************************************************************************/ +/*! exports provided: imag, imagConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"imag",(function(){return r})),n.d(t,"imagConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n}=e,{input:s}=t,r=n.texData.get(s.dataId);return Object(o.identity)({inputs:{x:r.complexTensorInfos.imag},backend:n})}const i={kernelName:s.Imag,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/IsFinite.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/IsFinite.js ***! + \******************************************************************************/ +/*! exports provided: isFinite, isFiniteConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"isFinite",(function(){return r})),n.d(t,"isFiniteConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)({opSnippet:"return float(!isnan(x) && !isinf(x));",dtype:"bool"}),i={kernelName:s.IsFinite,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/IsInf.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/IsInf.js ***! + \***************************************************************************/ +/*! exports provided: isInf, isInfConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"isInf",(function(){return r})),n.d(t,"isInfConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)({opSnippet:"return float(isinf(x));",dtype:"bool"}),i={kernelName:s.IsInf,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/IsNaN.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/IsNaN.js ***! + \***************************************************************************/ +/*! exports provided: isNaN, isNaNConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"isNaN",(function(){return r})),n.d(t,"isNaNConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)({opSnippet:"return float(isnan(x));",dtype:"bool"}),i={kernelName:s.IsNan,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LRN.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LRN.js ***! + \*************************************************************************/ +/*! exports provided: lrn, LRNConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"lrn",(function(){return i})),n.d(t,"LRNConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../lrn_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/lrn_gpu.js"),r=n(/*! ../lrn_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/lrn_packed_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=e=>{const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{depthRadius:d,bias:u,alpha:l,beta:c}=i,f=Object(s.env)().getBool("WEBGL_PACK_NORMALIZATION")?new r.LRNPackedProgram(a.shape,d,u,l,c):new o.LRNProgram(a.shape,d,u,l,c);return n.runWebGLProgram(f,[a],a.dtype)},a={kernelName:s.LRN,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LRNGrad.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LRNGrad.js ***! + \*****************************************************************************/ +/*! exports provided: lrnGrad, LRNGradConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"lrnGrad",(function(){return r})),n.d(t,"LRNGradConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../lrn_grad_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/lrn_grad_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=e=>{const{inputs:t,backend:n,attrs:s}=e,{x:r,y:i,dy:a}=t,{depthRadius:d,bias:u,alpha:l,beta:c}=s,f=new o.LRNGradProgram(r.shape,d,u,l,c);return n.runWebGLProgram(f,[r,i,a],r.dtype)},i={kernelName:s.LRNGrad,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LeakyRelu.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LeakyRelu.js ***! + \*******************************************************************************/ +/*! exports provided: LEAKYRELU, LEAKYRELU_PACKED, leakyRelu, leakyReluConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"LEAKYRELU",(function(){return i})),n.d(t,"LEAKYRELU_PACKED",(function(){return a})),n.d(t,"leakyRelu",(function(){return d})),n.d(t,"leakyReluConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../binaryop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_gpu.js"),r=n(/*! ../binaryop_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_packed_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i="return (a < 0.) ? b * a : a;",a="\n vec4 aLessThanZero = vec4(lessThan(a, vec4(0.)));\n return (aLessThanZero * (b * a)) + ((vec4(1.0) - aLessThanZero) * a);\n";function d(e){const{inputs:t,backend:n,attrs:d}=e,{x:u}=t,{alpha:l}=d,c=n.makeTensorInfo([],"float32",s.util.createScalarValue(l,"float32")),f=Object(s.env)().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new r.BinaryOpPackedProgram(a,u.shape,c.shape):new o.BinaryOpProgram(i,u.shape,c.shape),p=n.runWebGLProgram(f,[u,c],u.dtype);return n.disposeIntermediateTensorInfo(c),p}const u={kernelName:s.LeakyRelu,backendName:"webgl",kernelFunc:d}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Less.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Less.js ***! + \**************************************************************************/ +/*! exports provided: less, lessConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"less",(function(){return i})),n.d(t,"lessConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.binaryKernelFunc)({opSnippet:"return float(a < b);",packedOpSnippet:"\n return vec4(lessThan(a, b));\n",cpuKernelImpl:r.lessImplCPU,dtype:"bool"}),a={kernelName:s.Less,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LessEqual.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LessEqual.js ***! + \*******************************************************************************/ +/*! exports provided: LESS_EQUAL, LESS_EQUAL_PACKED, lessEqual, lessEqualConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"LESS_EQUAL",(function(){return i})),n.d(t,"LESS_EQUAL_PACKED",(function(){return a})),n.d(t,"lessEqual",(function(){return d})),n.d(t,"lessEqualConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i="return float(a <= b);",a="\n return vec4(lessThanEqual(a, b));\n",d=Object(o.binaryKernelFunc)({opSnippet:i,packedOpSnippet:a,cpuKernelImpl:r.lessEqualImplCPU,dtype:"bool"}),u={kernelName:s.LessEqual,backendName:"webgl",kernelFunc:d}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LinSpace.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LinSpace.js ***! + \******************************************************************************/ +/*! exports provided: linSpace, linSpaceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"linSpace",(function(){return r})),n.d(t,"linSpaceConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{backend:t,attrs:n}=e,{start:s,stop:r,num:i}=n,a=Object(o.linSpaceImplCPU)(s,r,i);return t.makeTensorInfo([a.length],"float32",a)}const i={kernelName:s.LinSpace,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Log.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Log.js ***! + \*************************************************************************/ +/*! exports provided: log, logConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"log",(function(){return i})),n.d(t,"logConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.unaryKernelFunc)({opSnippet:"if (x < 0.0) return NAN;\n return log(x);",packedOpSnippet:"\n vec4 result = log(x);\n vec4 isNaN = vec4(lessThan(x, vec4(0.0)));\n result.r = isNaN.r == 1.0 ? NAN : result.r;\n result.g = isNaN.g == 1.0 ? NAN : result.g;\n result.b = isNaN.b == 1.0 ? NAN : result.b;\n result.a = isNaN.a == 1.0 ? NAN : result.a;\n\n return result;\n",cpuKernelImpl:r.logImplCPU}),a={kernelName:s.Log,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Log1p.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Log1p.js ***! + \***************************************************************************/ +/*! exports provided: log1p, log1pConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"log1p",(function(){return r})),n.d(t,"log1pConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)({opSnippet:"return log(1.0 + x);"}),i={kernelName:s.Log1p,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LogicalAnd.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LogicalAnd.js ***! + \********************************************************************************/ +/*! exports provided: logicalAnd, logicalAndConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"logicalAnd",(function(){return r})),n.d(t,"logicalAndConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.binaryKernelFunc)({opSnippet:"return float(a >= 1.0 && b >= 1.0);",packedOpSnippet:"\n return vec4(\n vec4(greaterThanEqual(a, vec4(1.0))) *\n vec4(greaterThanEqual(b, vec4(1.0))));\n",dtype:"bool"}),i={kernelName:s.LogicalAnd,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LogicalNot.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LogicalNot.js ***! + \********************************************************************************/ +/*! exports provided: logicalNot, logicalNotConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"logicalNot",(function(){return r})),n.d(t,"logicalNotConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)({opSnippet:"return float(!(x >= 1.0));"}),i={kernelName:s.LogicalNot,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LogicalOr.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LogicalOr.js ***! + \*******************************************************************************/ +/*! exports provided: logicalOr, logicalOrConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"logicalOr",(function(){return r})),n.d(t,"logicalOrConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.binaryKernelFunc)({opSnippet:"return float(a >= 1.0 || b >= 1.0);",packedOpSnippet:"\n return min(\n vec4(greaterThanEqual(a, vec4(1.0))) +\n vec4(greaterThanEqual(b, vec4(1.0))),\n vec4(1.0));\n",dtype:"bool"}),i={kernelName:s.LogicalOr,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Max.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Max.js ***! + \*************************************************************************/ +/*! exports provided: max, maxConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"max",(function(){return a})),n.d(t,"maxConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"),r=n(/*! ./Max_impl */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Max_impl.js"),i=n(/*! ./Transpose_impl */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:d}=t,{reductionIndices:u,keepDims:l}=a,c=d.shape.length,f=s.util.parseAxisParam(u,d.shape);let p=f;const m=s.backend_util.getAxesPermutation(p,c),h=null!=m,b=n.shouldExecuteOnCPU([d]);let j=d;if(h){if(b){const e=n.texData.get(j.dataId).values,t=new Array(c);for(let e=0;e`Error in maxPool: Either strides or dilations must be 1. Got strides ${l} and dilations '1'`));const p=s.backend_util.computePool2DInfo(d.shape,u,l,1,c,f);if(1===p.filterWidth&&1===p.filterHeight&&s.util.arraysEqual(p.inShape,p.outShape))return Object(i.identity)({inputs:{x:d},backend:n});const m=new o.Pool2DProgram(p,"max",!1);return n.runWebGLProgram(m,[d],d.dtype)}const d={kernelName:s.MaxPool,backendName:"webgl",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPool3D.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPool3D.js ***! + \*******************************************************************************/ +/*! exports provided: maxPool3d, maxPool3DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPool3d",(function(){return r})),n.d(t,"maxPool3DConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../pool_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/pool_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i}=t,{filterSize:a,strides:d,pad:u,dataFormat:l,dimRoundingMode:c}=r,f=s.backend_util.computePool3DInfo(i.shape,a,d,[1,1,1],u,c,l),p=new o.Pool3DProgram(f,"max",!1);return n.runWebGLProgram(p,[i],i.dtype)}const i={kernelName:s.MaxPool3D,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPool3DGrad.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPool3DGrad.js ***! + \***********************************************************************************/ +/*! exports provided: maxPool3DGrad, maxPoolGrad3DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPool3DGrad",(function(){return i})),n.d(t,"maxPoolGrad3DConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../max_pool_backprop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/max_pool_backprop_gpu.js"),r=n(/*! ../pool_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/pool_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{dy:a,input:d}=t,u=d,{filterSize:l,strides:c,pad:f,dimRoundingMode:p}=i,m=s.backend_util.computePool3DInfo(u.shape,l,c,[1,1,1],f,p),h=new r.Pool3DProgram(m,"max",!0),b=n.runWebGLProgram(h,[u],u.dtype),j=new o.MaxPool3DBackpropProgram(m),g=n.runWebGLProgram(j,[a,b],u.dtype);return n.disposeIntermediateTensorInfo(b),g}const a={kernelName:s.MaxPool3DGrad,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolGrad.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolGrad.js ***! + \*********************************************************************************/ +/*! exports provided: maxPoolGrad, maxPoolGradConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPoolGrad",(function(){return a})),n.d(t,"maxPoolGradConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../max_pool_backprop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/max_pool_backprop_gpu.js"),r=n(/*! ../pool_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/pool_gpu.js"),i=n(/*! ../webgl_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){const{inputs:t,backend:n,attrs:a}=e,{dy:d,input:u,output:l}=t,c=u;Object(i.assertNotComplex)([u,l],"maxPoolGrad");const{filterSize:f,strides:p,pad:m,dimRoundingMode:h}=a,b=s.backend_util.computePool2DInfo(c.shape,f,p,1,m,h),j=new r.Pool2DProgram(b,"max",!0),g=n.runWebGLProgram(j,[c],c.dtype),w=new o.MaxPool2DBackpropProgram(b),_=n.runWebGLProgram(w,[d,g],c.dtype);return n.disposeIntermediateTensorInfo(g),_}const d={kernelName:s.MaxPoolGrad,backendName:"webgl",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolWithArgmax.js": +/*!***************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolWithArgmax.js ***! + \***************************************************************************************/ +/*! exports provided: maxPoolWithArgmaxConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPoolWithArgmaxConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./MaxPoolWithArgmax_impl */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolWithArgmax_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r={kernelName:s.MaxPoolWithArgmax,backendName:"webgl",kernelFunc:({inputs:e,attrs:t,backend:n})=>{const{x:r}=e,{filterSize:i,strides:a,pad:d,includeBatchInIndex:u}=t,l=n;s.util.assert(4===r.shape.length,(()=>`Error in maxPool: input must be rank 4 but got rank ${r.shape.length}.`));const c=[1,1];s.util.assert(s.backend_util.eitherStridesOrDilationsAreOne(a,c),(()=>`Error in maxPool: Either strides or dilations must be 1. Got strides ${a} and dilations '${c}'`));const f=s.backend_util.computePool2DInfo(r.shape,i,a,c,d),[p,m]=Object(o.maxPoolWithArgmaxImpl)(r,u,f,l);return[p,m]}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolWithArgmax_impl.js": +/*!********************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolWithArgmax_impl.js ***! + \********************************************************************************************/ +/*! exports provided: maxPoolWithArgmaxImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPoolWithArgmaxImpl",(function(){return o}));var s=n(/*! ../pool_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/pool_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t,n,o){let r=new s.Pool2DProgram(n,"max",!1);const i=o.runWebGLProgram(r,[e],"float32");r=new s.Pool2DProgram(n,"max",!0,!0,t);return[i,o.runWebGLProgram(r,[e],"float32")]}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Max_impl.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Max_impl.js ***! + \******************************************************************************/ +/*! exports provided: maxImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"maxImpl",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/reduce */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/reduce.js"),r=n(/*! ../kernels/Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e,t,n,i){const a=s.util.sizeFromShape(t),d=s.util.sizeFromShape(e.shape)/a,u=Object(r.reshape)({inputs:{x:e},attrs:{shape:[d,a]},backend:i}),l=Object(o.reduce)(u,e.dtype,"max",i),c=Object(r.reshape)({inputs:{x:l},attrs:{shape:n},backend:i});return i.disposeIntermediateTensorInfo(u),i.disposeIntermediateTensorInfo(l),c}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Maximum.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Maximum.js ***! + \*****************************************************************************/ +/*! exports provided: maximum, maximumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maximum",(function(){return l})),n.d(t,"maximumConfig",(function(){return c}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../binaryop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_gpu.js"),r=n(/*! ../binaryop_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_packed_gpu.js"),i=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),a=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const d=o.CHECK_NAN_SNIPPET+"\n return max(a, b);\n",u="\n vec4 result = vec4(max(a, b));\n vec4 isNaN = min(vec4(isnan(a)) + vec4(isnan(b)), vec4(1.0));\n "+r.CHECK_NAN_SNIPPET+"\n return result;\n",l=Object(i.binaryKernelFunc)({opSnippet:d,packedOpSnippet:u,cpuKernelImpl:a.maximumImplCPU}),c={kernelName:s.Maximum,backendName:"webgl",kernelFunc:l}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Mean.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Mean.js ***! + \**************************************************************************/ +/*! exports provided: meanConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"meanConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Mean_impl */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Mean_impl.js"),r=n(/*! ./Transpose_impl */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i={kernelName:s.Mean,backendName:"webgl",kernelFunc:({inputs:e,attrs:t,backend:n})=>{const{x:i}=e,{keepDims:a,axis:d}=t,u=n,l=i.shape.length,c=s.util.parseAxisParam(d,i.shape);let f=c;const p=s.backend_util.getAxesPermutation(f,l),m=null!=p,h=u.shouldExecuteOnCPU([i]),b=[];let j=i;if(m){if(h){const e=u.texData.get(j.dataId).values,t=new Array(l);for(let e=0;e{const{x:i}=e,{paddings:a,mode:d}=n,u=Object(s.env)().getBool("WEBGL_PACK_ARRAY_OPERATIONS")?new r.MirrorPadPackedProgram(i.shape,a,d):new o.MirrorPadProgram(i.shape,a,d);return t.runWebGLProgram(u,[i],i.dtype)},a={kernelName:s.MirrorPad,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Mod.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Mod.js ***! + \*************************************************************************/ +/*! exports provided: mod, modConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"mod",(function(){return a})),n.d(t,"modConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../binaryop_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_packed_gpu.js"),r=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i="\n vec4 result = mod(a, b);\n vec4 isNaN = vec4(equal(b, vec4(0.0)));\n "+o.CHECK_NAN_SNIPPET+"\n return result;\n",a=Object(r.binaryKernelFunc)({opSnippet:"if (b == 0.0) return NAN;\n return mod(a, b);",packedOpSnippet:i}),d={kernelName:s.Mod,backendName:"webgl",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Multinomial.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Multinomial.js ***! + \*********************************************************************************/ +/*! exports provided: multinomial, multinomialConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"multinomial",(function(){return i})),n.d(t,"multinomialConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../multinomial_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/multinomial_gpu.js"),r=n(/*! ./Softmax */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Softmax.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:s}=e,{logits:i}=t,{numSamples:a,seed:d,normalized:u}=s,l=u?i:Object(r.softmax)({inputs:{logits:i},backend:n,attrs:{dim:i.shape.length-1}}),c=l.shape[0],f=l.shape[1],p=new o.MultinomialProgram(c,f,a),m=[[d]],h=n.runWebGLProgram(p,[l],"int32",m);return u||n.disposeIntermediateTensorInfo(l),h}const a={kernelName:s.Multinomial,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Multiply.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Multiply.js ***! + \******************************************************************************/ +/*! exports provided: multiply, multiplyConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"multiply",(function(){return l})),n.d(t,"multiplyConfig",(function(){return c}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../binaryop_complex_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_complex_gpu.js"),r=n(/*! ../binaryop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_gpu.js"),i=n(/*! ../binaryop_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_packed_gpu.js"),a=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"),d=n(/*! ./Complex */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const u="return a * b;";function l(e){const{inputs:t,backend:n}=e,{a:l,b:c}=t,f=s.backend_util.upcastType(l.dtype,c.dtype);if("complex64"===l.dtype){const e=n.texData.get(l.dataId),t=n.texData.get(c.dataId),s=new o.BinaryOpComplexProgram(o.COMPLEX_MULTIPLY.REAL,l.shape,c.shape),r=new o.BinaryOpComplexProgram(o.COMPLEX_MULTIPLY.IMAG,l.shape,c.shape),i=[{dataId:e.complexTensorInfos.real.dataId,dtype:e.complexTensorInfos.real.dtype,shape:l.shape},{dataId:e.complexTensorInfos.imag.dataId,dtype:e.complexTensorInfos.imag.dtype,shape:l.shape},{dataId:t.complexTensorInfos.real.dataId,dtype:t.complexTensorInfos.real.dtype,shape:c.shape},{dataId:t.complexTensorInfos.imag.dataId,dtype:t.complexTensorInfos.imag.dtype,shape:c.shape}],a=n.runWebGLProgram(s,i,"float32"),u=n.runWebGLProgram(r,i,"float32"),f=Object(d.complex)({inputs:{real:a,imag:u},backend:n});return n.disposeIntermediateTensorInfo(a),n.disposeIntermediateTensorInfo(u),f}if(n.shouldExecuteOnCPU([l,c])){const e=n.texData.get(l.dataId),t=n.texData.get(c.dataId),[s,o]=Object(a.multiplyImplCPU)(l.shape,c.shape,e.values,t.values,f),r=n.makeTensorInfo(o,f);return n.texData.get(r.dataId).values=s,r}let p;return p=Object(s.env)().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new i.BinaryOpPackedProgram(u,l.shape,c.shape):new r.BinaryOpProgram(u,l.shape,c.shape),n.runWebGLProgram(p,[l,c],f)}const c={kernelName:s.Multiply,backendName:"webgl",kernelFunc:l}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Neg.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Neg.js ***! + \*************************************************************************/ +/*! exports provided: neg, negConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"neg",(function(){return d})),n.d(t,"negConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"),r=n(/*! ../unaryop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js"),i=n(/*! ../unaryop_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_packed_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const a="return -x;";function d(e){const{inputs:t,backend:n}=e,{x:d}=t;if(n.shouldExecuteOnCPU([d])){const e=n.texData.get(d.dataId),[t,s]=Object(o.negImplCPU)(e.values,d.shape,d.dtype);return n.makeTensorInfo(s,d.dtype,t)}let u;return u=Object(s.env)().getBool("WEBGL_PACK_UNARY_OPERATIONS")?new i.UnaryOpPackedProgram(d.shape,a):new r.UnaryOpProgram(d.shape,a),n.runWebGLProgram(u,[d],d.dtype)}const u={kernelName:s.Neg,backendName:"webgl",kernelFunc:d}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV3.js": +/*!*****************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV3.js ***! + \*****************************************************************************************/ +/*! exports provided: nonMaxSuppressionV3, nonMaxSuppressionV3Config */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionV3",(function(){return r})),n.d(t,"nonMaxSuppressionV3Config",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */const o=s.kernel_impls.nonMaxSuppressionV3Impl;function r(e){s.backend_util.warn("tf.nonMaxSuppression() in webgl locks the UI thread. Call tf.nonMaxSuppressionAsync() instead");const{inputs:t,backend:n,attrs:r}=e,{boxes:i,scores:a}=t,{maxOutputSize:d,iouThreshold:u,scoreThreshold:l}=r,c=n.readSync(i.dataId),f=n.readSync(a.dataId),{selectedIndices:p}=o(c,f,d,u,l);return n.makeTensorInfo([p.length],"int32",new Int32Array(p))}const i={kernelName:s.NonMaxSuppressionV3,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV4.js": +/*!*****************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV4.js ***! + \*****************************************************************************************/ +/*! exports provided: nonMaxSuppressionV4, nonMaxSuppressionV4Config */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionV4",(function(){return r})),n.d(t,"nonMaxSuppressionV4Config",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */const o=s.kernel_impls.nonMaxSuppressionV4Impl;function r(e){s.backend_util.warn("tf.nonMaxSuppression() in webgl locks the UI thread. Call tf.nonMaxSuppressionAsync() instead");const{inputs:t,backend:n,attrs:r}=e,{boxes:i,scores:a}=t,{maxOutputSize:d,iouThreshold:u,scoreThreshold:l,padToMaxOutputSize:c}=r,f=n.readSync(i.dataId),p=n.readSync(a.dataId),{selectedIndices:m,validOutputs:h}=o(f,p,d,u,l,c);return[n.makeTensorInfo([m.length],"int32",new Int32Array(m)),n.makeTensorInfo([],"int32",new Int32Array([h]))]}const i={kernelName:s.NonMaxSuppressionV4,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV5.js": +/*!*****************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV5.js ***! + \*****************************************************************************************/ +/*! exports provided: nonMaxSuppressionV5, nonMaxSuppressionV5Config */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionV5",(function(){return r})),n.d(t,"nonMaxSuppressionV5Config",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */const o=s.kernel_impls.nonMaxSuppressionV5Impl;function r(e){s.backend_util.warn("tf.nonMaxSuppression() in webgl locks the UI thread. Call tf.nonMaxSuppressionAsync() instead");const{inputs:t,backend:n,attrs:r}=e,{boxes:i,scores:a}=t,{maxOutputSize:d,iouThreshold:u,scoreThreshold:l,softNmsSigma:c}=r,f=n.readSync(i.dataId),p=n.readSync(a.dataId),m=d,h=u,b=l,j=c,{selectedIndices:g,selectedScores:w}=o(f,p,m,h,b,j);return[n.makeTensorInfo([g.length],"int32",new Int32Array(g)),n.makeTensorInfo([w.length],"float32",new Float32Array(w))]}const i={kernelName:s.NonMaxSuppressionV5,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NotEqual.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NotEqual.js ***! + \******************************************************************************/ +/*! exports provided: notEqual, notEqualConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"notEqual",(function(){return i})),n.d(t,"notEqualConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.binaryKernelFunc)({opSnippet:"return float(a != b);",cpuKernelImpl:r.notEqualImplCPU,dtype:"bool"}),a={kernelName:s.NotEqual,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/OneHot.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/OneHot.js ***! + \****************************************************************************/ +/*! exports provided: oneHot, oneHotConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"oneHot",(function(){return i})),n.d(t,"oneHotConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../onehot_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/onehot_gpu.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=e=>{const{inputs:t,backend:n,attrs:i}=e,{indices:a}=t,{depth:d,onValue:u,offValue:l}=i,c=s.util.sizeFromShape(a.shape),f=new o.OneHotProgram(c,d,u,l),p=Object(r.reshape)({inputs:{x:a},backend:n,attrs:{shape:[c]}}),m=n.runWebGLProgram(f,[p],a.dtype);n.disposeIntermediateTensorInfo(p);const h=[...a.shape,d],b=Object(r.reshape)({inputs:{x:m},backend:n,attrs:{shape:h}});return n.disposeIntermediateTensorInfo(m),b},a={kernelName:s.OneHot,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/OnesLike.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/OnesLike.js ***! + \******************************************************************************/ +/*! exports provided: onesLike, onesLikeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"onesLike",(function(){return u})),n.d(t,"onesLikeConfig",(function(){return l}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Complex */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js"),r=n(/*! ./Fill */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Fill.js"),i=n(/*! ./Imag */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Imag.js"),a=n(/*! ./Real */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Real.js"),d=n(/*! ./ZerosLike */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ZerosLike.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function u(e){const{inputs:t,backend:n}=e,{x:s}=t;if("string"===s.dtype)throw new Error("onesLike is not supported under string dtype");if("complex64"===s.dtype){const e=Object(a.real)({inputs:{input:s},backend:n}),t=u({inputs:{x:e},backend:n}),r=Object(i.imag)({inputs:{input:s},backend:n}),l=Object(d.zerosLike)({inputs:{x:r},backend:n}),c=Object(o.complex)({inputs:{real:t,imag:l},backend:n});return n.disposeIntermediateTensorInfo(e),n.disposeIntermediateTensorInfo(t),n.disposeIntermediateTensorInfo(r),n.disposeIntermediateTensorInfo(l),c}return Object(r.fill)({attrs:{shape:s.shape,dtype:s.dtype,value:1},backend:n})}const l={kernelName:s.OnesLike,backendName:"webgl",kernelFunc:u}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Pack.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Pack.js ***! + \**************************************************************************/ +/*! exports provided: pack, packConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"pack",(function(){return i})),n.d(t,"packConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Concat */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Concat.js"),r=n(/*! ./ExpandDims */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ExpandDims.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{axis:a}=i;if(1===t.length)return Object(r.expandDims)({inputs:{input:t[0]},backend:n,attrs:{dim:a}});const d=t[0].shape,u=t[0].dtype;t.forEach((e=>{s.util.assertShapesMatch(d,e.shape,"All tensors passed to stack must have matching shapes"),s.util.assert(u===e.dtype,(()=>"All tensors passed to stack must have matching dtypes"))}));const l=[],c=t.map((e=>{const t=Object(r.expandDims)({inputs:{input:e},backend:n,attrs:{dim:a}});return l.push(t),t})),f=Object(o.concat)({inputs:c,backend:n,attrs:{axis:a}});return l.forEach((e=>n.disposeIntermediateTensorInfo(e))),f}const a={kernelName:s.Pack,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/PadV2.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/PadV2.js ***! + \***************************************************************************/ +/*! exports provided: padV2, padV2Config */function(e,t,n){"use strict";n.r(t),n.d(t,"padV2",(function(){return i})),n.d(t,"padV2Config",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../pad_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/pad_gpu.js"),r=n(/*! ../pad_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/pad_packed_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=e=>{const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{paddings:d,constantValue:u}=i,l=Object(s.env)().getBool("WEBGL_PACK_ARRAY_OPERATIONS")?new r.PadPackedProgram(a.shape,d,u):new o.PadProgram(a.shape,d,u),c=[[u]];return n.runWebGLProgram(l,[a],a.dtype,c)},a={kernelName:s.PadV2,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Pow.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Pow.js ***! + \*************************************************************************/ +/*! exports provided: pow, powConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"pow",(function(){return a})),n.d(t,"powConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../binaryop_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_packed_gpu.js"),r=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i="\n // isModRound1 has 1 for components with round(mod(b, 2.0)) == 1, 0 otherwise.\n vec4 isModRound1 = vec4(equal(round(mod(b, 2.0)), ivec4(1)));\n vec4 multiplier = sign(a) * isModRound1 + (vec4(1.0) - isModRound1);\n vec4 result = multiplier * pow(abs(a), b);\n\n // Ensure that a^0 = 1, including 0^0 = 1 as this correspond to TF and JS\n bvec4 isExpZero = equal(b, vec4(0.0));\n result.r = isExpZero.r ? 1.0 : result.r;\n result.g = isExpZero.g ? 1.0 : result.g;\n result.b = isExpZero.b ? 1.0 : result.b;\n result.a = isExpZero.a ? 1.0 : result.a;\n\n vec4 isNaN = vec4(lessThan(a, vec4(0.0))) * vec4(lessThan(floor(b), b));\n "+o.CHECK_NAN_SNIPPET+"\n return result;\n",a=Object(r.binaryKernelFunc)({opSnippet:"\n if(a < 0.0 && floor(b) < b){\n return NAN;\n }\n if (b == 0.0) {\n return 1.0;\n }\n return (round(mod(b, 2.0)) != 1) ?\n pow(abs(a), b) : sign(a) * pow(abs(a), b);\n",packedOpSnippet:i}),d={kernelName:s.Pow,backendName:"webgl",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Prelu.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Prelu.js ***! + \***************************************************************************/ +/*! exports provided: PRELU, PRELU_PACKED, prelu, preluConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"PRELU",(function(){return i})),n.d(t,"PRELU_PACKED",(function(){return a})),n.d(t,"prelu",(function(){return d})),n.d(t,"preluConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../binaryop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_gpu.js"),r=n(/*! ../binaryop_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_packed_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i="return (a < 0.) ? b * a : a;",a="\n vec4 aLessThanZero = vec4(lessThan(a, vec4(0.)));\n return (aLessThanZero * (b * a)) + ((vec4(1.0) - aLessThanZero) * a);\n";function d(e){const{inputs:t,backend:n}=e,{x:d,alpha:u}=t,l=Object(s.env)().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new r.BinaryOpPackedProgram(a,d.shape,u.shape):new o.BinaryOpProgram(i,d.shape,u.shape);return n.runWebGLProgram(l,[d,u],d.dtype)}const u={kernelName:s.Prelu,backendName:"webgl",kernelFunc:d}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Prod.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Prod.js ***! + \**************************************************************************/ +/*! exports provided: prod, prodConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"prod",(function(){return d})),n.d(t,"prodConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/reduce */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/reduce.js"),r=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"),i=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),a=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function d(e){const{inputs:t,backend:n,attrs:d}=e,{x:u}=t,{axis:l,keepDims:c}=d,f=u.shape.length,p=[],m=s.util.parseAxisParam(l,u.shape);let h=m;const b=s.backend_util.getAxesPermutation(h,f);let j,g=u;if(null!=b&&(g=Object(a.transpose)({inputs:{x:u},backend:n,attrs:{perm:b}}),h=s.backend_util.getInnerMostAxes(h.length,f),p.push(g)),s.backend_util.assertAxesAreInnerMostDims("prod",h,f),n.shouldExecuteOnCPU([g])){const e=n.texData.get(g.dataId).values,{outVals:t,outShape:s,outDtype:o}=Object(r.prodImplCPU)(g.shape,g.dtype,e,h);j=n.makeTensorInfo(s,o,t)}else{const[e,t]=s.backend_util.computeOutAndReduceShapes(g.shape,h),r=s.util.sizeFromShape(t),a=Object(i.reshape)({inputs:{x:g},backend:n,attrs:{shape:[-1,r]}}),d=Object(s.sumOutType)(u.dtype),l=Object(o.reduce)(a,d,"prod",n);j=Object(i.reshape)({inputs:{x:l},backend:n,attrs:{shape:e}}),p.push(a),p.push(l)}if(c){p.push(j);const e=s.backend_util.expandShapeToKeepDim(j.shape,m);j=Object(i.reshape)({inputs:{x:j},backend:n,attrs:{shape:e}})}return p.forEach((e=>n.disposeIntermediateTensorInfo(e))),j}const u={kernelName:s.Prod,backendName:"webgl",kernelFunc:d}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Range.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Range.js ***! + \***************************************************************************/ +/*! exports provided: range, rangeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"range",(function(){return r})),n.d(t,"rangeConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=e=>{const{backend:t,attrs:n}=e,{start:s,stop:r,step:i,dtype:a}=n,d=Object(o.rangeImplCPU)(s,r,i,a);return t.makeTensorInfo([d.length],a,d)},i={kernelName:s.Range,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Real.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Real.js ***! + \**************************************************************************/ +/*! exports provided: real, realConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"real",(function(){return r})),n.d(t,"realConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n}=e,{input:s}=t,r=n.texData.get(s.dataId);return Object(o.identity)({inputs:{x:r.complexTensorInfos.real},backend:n})}const i={kernelName:s.Real,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/RealDiv.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/RealDiv.js ***! + \*****************************************************************************/ +/*! exports provided: realDiv, realDivConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"realDiv",(function(){return r})),n.d(t,"realDivConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.binaryKernelFunc)({opSnippet:"\nif (a == b) {\n return 1.0;\n};\nreturn a / b;",packedOpSnippet:"\n // vec4 one = vec4(equal(a, b));\n // return one + (vec4(1.0) - one) * a / b;\n vec4 result = a / b;\n if(a.x == b.x) {\n result.x = 1.;\n }\n if(a.y == b.y) {\n result.y = 1.;\n }\n if(a.z == b.z) {\n result.z = 1.;\n }\n if(a.w == b.w) {\n result.w = 1.;\n }\n\n return result;\n",checkOutOfBounds:!0}),i={kernelName:s.RealDiv,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reciprocal.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reciprocal.js ***! + \********************************************************************************/ +/*! exports provided: reciprocal, reciprocalConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"reciprocal",(function(){return r})),n.d(t,"reciprocalConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)({opSnippet:"return 1.0 / x;"}),i={kernelName:s.Reciprocal,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Relu.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Relu.js ***! + \**************************************************************************/ +/*! exports provided: relu, reluConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"relu",(function(){return i})),n.d(t,"reluConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=n(/*! ../unaryop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js").CHECK_NAN_SNIPPET+"\n return (x < 0.0) ? 0.0 : x;\n",i=Object(o.unaryKernelFunc)({opSnippet:r,packedOpSnippet:"\n vec4 result = x * vec4(greaterThanEqual(x, vec4(0.0)));\n bvec4 isNaN = isnan(x);\n\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n"}),a={kernelName:s.Relu,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Relu6.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Relu6.js ***! + \***************************************************************************/ +/*! exports provided: relu6, relu6Config */function(e,t,n){"use strict";n.r(t),n.d(t,"relu6",(function(){return i})),n.d(t,"relu6Config",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=n(/*! ../unaryop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js").CHECK_NAN_SNIPPET+"\n return (x < 0.0) ? 0.0 : min(6.0, x);\n",i=Object(o.unaryKernelFunc)({opSnippet:r,packedOpSnippet:"\n vec4 result = min(x, vec4(6.)) * vec4(greaterThanEqual(x, vec4(0.0)));\n bvec4 isNaN = isnan(x);\n\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n"}),a={kernelName:s.Relu6,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js ***! + \*****************************************************************************/ +/*! exports provided: reshape, reshapeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"reshape",(function(){return i})),n.d(t,"reshapeConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/reshape.js"),r=n(/*! ../webgl_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{shape:d}=i,u=n,l=s.util.sizeFromShape(a.shape),c=s.util.inferFromImplicitShape(d,l),f=s.util.sizeFromShape(c);s.util.assert(l===f,(()=>`The new shape (${c}) has ${f} elements and the old shape (${a.shape}) has ${l} elements. The new shape and old shape must have the same number of elements.`));const p=u.texData.get(a.dataId);return!p.isPacked||Object(r.isReshapeFree)(a.shape,c)||null!==p.texture&&Object(r.isReshapeFree)(p.shape,c)?(u.incRef(a.dataId),{dataId:a.dataId,shape:c,dtype:a.dtype}):Object(o.packedReshape)(a,c,u)}const a={kernelName:s.Reshape,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeBilinear.js": +/*!************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeBilinear.js ***! + \************************************************************************************/ +/*! exports provided: resizeBilinear, resizeBilinearConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"resizeBilinear",(function(){return i})),n.d(t,"resizeBilinearConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../resize_bilinear_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_gpu.js"),r=n(/*! ../resize_bilinear_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_packed_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{images:a}=t,{alignCorners:d,halfPixelCenters:u,size:l}=i,[c,f]=l,p=Object(s.env)().getBool("WEBGL_PACK_IMAGE_OPERATIONS")?new r.ResizeBilinearPackedProgram(a.shape,c,f,d,u):new o.ResizeBilinearProgram(a.shape,c,f,d,u);return n.runWebGLProgram(p,[a],"float32")}const a={kernelName:s.ResizeBilinear,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeBilinearGrad.js": +/*!****************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeBilinearGrad.js ***! + \****************************************************************************************/ +/*! exports provided: resizeBilinearGrad, resizeBilinearGradConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"resizeBilinearGrad",(function(){return r})),n.d(t,"resizeBilinearGradConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../resize_bilinear_backprop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_backprop_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:s}=e,{images:r,dy:i}=t,{alignCorners:a}=s,d=new o.ResizeBilinearBackpropProgram(i.shape,r.shape,a);return n.runWebGLProgram(d,[i],i.dtype)}const i={kernelName:s.ResizeBilinearGrad,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeNearestNeighbor.js": +/*!*******************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeNearestNeighbor.js ***! + \*******************************************************************************************/ +/*! exports provided: resizeNearestNeighbor, resizeNearestNeighborConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"resizeNearestNeighbor",(function(){return i})),n.d(t,"resizeNearestNeighborConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../resize_nearest_neighbor_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_gpu.js"),r=n(/*! ../resize_nearest_neighbor_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_packed_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{images:a}=t,{alignCorners:d,halfPixelCenters:u,size:l}=i,[c,f]=l,p=Object(s.env)().getBool("WEBGL_PACK_IMAGE_OPERATIONS")?new r.ResizeNearestNeighborPackedProgram(a.shape,c,f,d,u):new o.ResizeNearestNeighborProgram(a.shape,c,f,d,u);return n.runWebGLProgram(p,[a],a.dtype)}const a={kernelName:s.ResizeNearestNeighbor,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeNearestNeighborGrad.js": +/*!***********************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeNearestNeighborGrad.js ***! + \***********************************************************************************************/ +/*! exports provided: resizeNearestNeighborGrad, resizeNearestNeighborGradConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"resizeNearestNeighborGrad",(function(){return r})),n.d(t,"resizeNearestNeighborGradConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../resize_nearest_neighbor_backprop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_backprop_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:s}=e,{images:r,dy:i}=t,{alignCorners:a}=s,d=new o.ResizeNearestNeigborBackpropProgram(i.shape,r.shape,a);return n.runWebGLProgram(d,[i],i.dtype)}const i={kernelName:s.ResizeNearestNeighborGrad,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reverse.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reverse.js ***! + \*****************************************************************************/ +/*! exports provided: reverse, reverseConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"reverse",(function(){return a})),n.d(t,"reverseConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../reverse_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/reverse_gpu.js"),r=n(/*! ../reverse_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/reverse_packed_gpu.js"),i=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:d}=t,{dims:u}=a,l=d.shape.length,c=s.util.parseAxisParam(u,d.shape);if(0===l)return Object(i.identity)({inputs:{x:d},backend:n});const f=Object(s.env)().getBool("WEBGL_PACK_ARRAY_OPERATIONS")?new r.ReversePackedProgram(d.shape,c):new o.ReverseProgram(d.shape,c);return n.runWebGLProgram(f,[d],d.dtype)}const d={kernelName:s.Reverse,backendName:"webgl",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/RotateWithOffset.js": +/*!**************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/RotateWithOffset.js ***! + \**************************************************************************************/ +/*! exports provided: rotateWithOffsetConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"rotateWithOffsetConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../rotate_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/rotate_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r={kernelName:s.RotateWithOffset,backendName:"webgl",kernelFunc:({inputs:e,attrs:t,backend:n})=>{const{image:r}=e,{radians:i,fillValue:a,center:d}=t,u=n,l=new o.RotateProgram(r.shape,a),[c,f]=s.backend_util.getImageCenter(d,r.shape[1],r.shape[2]),p=[[c,f,Math.sin(i),Math.cos(i)]];return u.runWebGLProgram(l,[r],r.dtype,p)}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Round.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Round.js ***! + \***************************************************************************/ +/*! exports provided: round, roundConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"round",(function(){return r})),n.d(t,"roundConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)({opSnippet:"\n // OpenGL ES does not support round function.\n // The algorithm is based on banker's rounding.\n float base = floor(x);\n if ((x - base) < 0.5) {\n return floor(x);\n } else if ((x - base) > 0.5) {\n return ceil(x);\n } else {\n if (mod(base, 2.0) == 0.0) {\n return base;\n } else {\n return base + 1.0;\n }\n }\n"}),i={kernelName:s.Round,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Rsqrt.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Rsqrt.js ***! + \***************************************************************************/ +/*! exports provided: rsqrt, rsqrtConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"rsqrt",(function(){return i})),n.d(t,"rsqrtConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.unaryKernelFunc)({opSnippet:"return inversesqrt(x);",cpuKernelImpl:r.rsqrtImplCPU}),a={kernelName:s.Rsqrt,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ScatterNd.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ScatterNd.js ***! + \*******************************************************************************/ +/*! exports provided: scatterNd, scatterNdConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"scatterNd",(function(){return i})),n.d(t,"scatterNdConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../scatter_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/scatter_gpu.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{indices:a,updates:d}=t,{shape:u}=i,{sliceRank:l,numUpdates:c,sliceSize:f,strides:p,outputSize:m}=s.backend_util.calculateShapes(d,a,u),h=[m/f,f];if(0===m)return n.makeTensorInfo(u,a.dtype);const b=Object(r.reshape)({inputs:{x:a},backend:n,attrs:{shape:[c,l]}}),j=Object(r.reshape)({inputs:{x:d},backend:n,attrs:{shape:[c,f]}}),g=n.makeTensorInfo([],"float32",new Float32Array([0])),w=new o.ScatterProgram(c,l,b.shape.length,j.shape.length,p,h),_=n.runWebGLProgram(w,[j,b,g],j.dtype),k=Object(r.reshape)({inputs:{x:_},backend:n,attrs:{shape:u}});return n.disposeIntermediateTensorInfo(b),n.disposeIntermediateTensorInfo(j),n.disposeIntermediateTensorInfo(_),n.disposeIntermediateTensorInfo(g),k}const a={kernelName:s.ScatterNd,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Select.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Select.js ***! + \****************************************************************************/ +/*! exports provided: select, selectConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"select",(function(){return r})),n.d(t,"selectConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../select_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/select_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n}=e,{condition:r,t:i,e:a}=t,d=new o.SelectProgram(r.shape.length,i.shape,i.shape.length);return n.runWebGLProgram(d,[r,i,a],Object(s.upcastType)(i.dtype,a.dtype))}const i={kernelName:s.Select,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Selu.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Selu.js ***! + \**************************************************************************/ +/*! exports provided: selu, seluConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"selu",(function(){return i})),n.d(t,"seluConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=`\n // Stable and Attracting Fixed Point (0, 1) for Normalized Weights.\n // see: https://arxiv.org/abs/1706.02515\n float scaleAlpha = ${s.backend_util.SELU_SCALEALPHA};\n float scale = ${s.backend_util.SELU_SCALE};\n return (x >= 0.0) ? scale * x : scaleAlpha * (exp(x) - 1.0);\n`,i=Object(o.unaryKernelFunc)({opSnippet:r}),a={kernelName:s.Selu,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sigmoid.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sigmoid.js ***! + \*****************************************************************************/ +/*! exports provided: sigmoid, sigmoidConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sigmoid",(function(){return r})),n.d(t,"sigmoidConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)({opSnippet:"return 1.0 / (1.0 + exp(-1.0 * x));"}),i={kernelName:s.Sigmoid,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sign.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sign.js ***! + \**************************************************************************/ +/*! exports provided: sign, signConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sign",(function(){return r})),n.d(t,"signConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)({opSnippet:"\n if (isnan(x)) { return 0.0; }\n return sign(x);\n"}),i={kernelName:s.Sign,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sin.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sin.js ***! + \*************************************************************************/ +/*! exports provided: sin, sinConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sin",(function(){return i})),n.d(t,"sinConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=o.CHECK_NAN_SNIPPET_UNARY+"\n return sin(x);\n",i=Object(o.unaryKernelFunc)({opSnippet:r}),a={kernelName:s.Sin,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sinh.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sinh.js ***! + \**************************************************************************/ +/*! exports provided: sinh, sinhConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sinh",(function(){return r})),n.d(t,"sinhConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)({opSnippet:"\n float e2x = exp(x);\n return (e2x - 1.0 / e2x) / 2.0;\n"}),i={kernelName:s.Sinh,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Slice.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Slice.js ***! + \***************************************************************************/ +/*! exports provided: slice, sliceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"slice",(function(){return a})),n.d(t,"sliceConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"),r=n(/*! ../slice_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/slice_gpu.js"),i=n(/*! ../slice_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/slice_packed_gpu.js");function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:d}=t,{begin:u,size:l}=a,[c,f]=s.slice_util.parseSliceParams(d,u,l);if(s.slice_util.assertParamsValid(d,c,f),0===s.util.sizeFromShape(f))return n.makeTensorInfo(f,d.dtype,[]);if(n.shouldExecuteOnCPU([d])||"string"===d.dtype){const e=n.texData.get(d.dataId),t=Object(o.sliceImplCPU)(e.values,c,f,d.shape,d.dtype);return n.makeTensorInfo(f,d.dtype,t)}const{isPacked:p}=n.texData.get(d.dataId),m=s.slice_util.isSliceContinous(d.shape,c,f);if(p||!m){const e=Object(s.env)().getBool("WEBGL_PACK_ARRAY_OPERATIONS")?new i.SlicePackedProgram(f):new r.SliceProgram(f),t=[c];return n.runWebGLProgram(e,[d],d.dtype,t)}return n.uploadToGPU(d.dataId), +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,o){const r=o.texData.get(e.dataId),i=o.makeTensorInfo(n,e.dtype),a=o.texData.get(i.dataId);Object.assign(a,r),a.refCount=1,a.shape=n,a.dtype=e.dtype;let d=s.slice_util.computeFlatOffset(t,s.util.computeStrides(e.shape));r.slice&&(d+=r.slice.flatOffset),a.slice={flatOffset:d,origDataId:r.slice&&r.slice.origDataId||e.dataId};const u=o.dataRefCount.get(a.slice.origDataId)||1;return o.dataRefCount.set(a.slice.origDataId,u+1),i}(d,c,f,n)}const d={kernelName:s.Slice,backendName:"webgl",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Softmax.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Softmax.js ***! + \*****************************************************************************/ +/*! exports provided: softmax, softmaxConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"softmax",(function(){return l})),n.d(t,"softmaxConfig",(function(){return c}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Exp */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Exp.js"),r=n(/*! ./Max */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Max.js"),i=n(/*! ./RealDiv */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/RealDiv.js"),a=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),d=n(/*! ./Sub */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sub.js"),u=n(/*! ./Sum */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sum.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function l(e){const{inputs:t,backend:n,attrs:l}=e,{logits:c}=t,{dim:f}=l,p=s.util.parseAxisParam([f],c.shape),m=Object(r.max)({inputs:{x:c},backend:n,attrs:{reductionIndices:p,keepDims:!1}}),h=s.backend_util.expandShapeToKeepDim(m.shape,p),b=Object(a.reshape)({inputs:{x:m},backend:n,attrs:{shape:h}}),j=Object(d.sub)({inputs:{a:c,b:b},backend:n}),g=Object(o.exp)({inputs:{x:j},backend:n}),w=Object(u.sum)({inputs:{x:g},backend:n,attrs:{axis:p,keepDims:!1}}),_=Object(a.reshape)({inputs:{x:w},backend:n,attrs:{shape:h}}),k=Object(i.realDiv)({inputs:{a:g,b:_},backend:n});return n.disposeIntermediateTensorInfo(m),n.disposeIntermediateTensorInfo(b),n.disposeIntermediateTensorInfo(j),n.disposeIntermediateTensorInfo(g),n.disposeIntermediateTensorInfo(w),n.disposeIntermediateTensorInfo(_),k}const c={kernelName:s.Softmax,backendName:"webgl",kernelFunc:l}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Softplus.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Softplus.js ***! + \******************************************************************************/ +/*! exports provided: softplus, softplusConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"softplus",(function(){return r})),n.d(t,"softplusConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)({opSnippet:"\n float epsilon = 1.1920928955078125e-7;\n float threshold = log(epsilon) + 2.0;\n\n bool too_large = x > -threshold;\n bool too_small = x < threshold;\n\n float result;\n float exp_x = exp(x);\n\n if (too_large){\n result = x;\n }\n else if (too_small){\n result = exp_x;\n }\n else{\n result = log(exp_x + 1.0);\n }\n return result;\n"}),i={kernelName:s.Softplus,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SpaceToBatchND.js": +/*!************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SpaceToBatchND.js ***! + \************************************************************************************/ +/*! exports provided: spaceToBatchND, spaceToBatchNDConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"spaceToBatchND",(function(){return a})),n.d(t,"spaceToBatchNDConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./PadV2 */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/PadV2.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),i=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const a=e=>{const{inputs:t,backend:n,attrs:a}=e,{x:d}=t,{blockShape:u,paddings:l}=a;s.util.assert(d.shape.length<=4,(()=>"spaceToBatchND for rank > 4 with a WebGL backend not implemented yet"));const c=u.reduce(((e,t)=>e*t)),f=[[0,0]];f.push(...l);for(let e=1+u.length;en.disposeIntermediateTensorInfo(e))),_},d={kernelName:s.SpaceToBatchND,backendName:"webgl",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseFillEmptyRows.js": +/*!*****************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseFillEmptyRows.js ***! + \*****************************************************************************************/ +/*! exports provided: sparseFillEmptyRows, sparseFillEmptyRowsConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sparseFillEmptyRows",(function(){return r})),n.d(t,"sparseFillEmptyRowsConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n}=e,{indices:s,values:r,denseShape:i,defaultValue:a}=t;if(1!==i.shape.length)throw new Error(`Dense shape must be a vector, saw:\n ${i.shape}`);if(2!==s.shape.length)throw new Error(`Indices must be a matrix, saw:\n ${s.shape}`);if(1!==r.shape.length)throw new Error(`Values must be a vector, saw:\n ${r.shape}`);if(0!==a.shape.length)throw new Error(`Default value must be a scalar, saw:\n ${a.shape}`);const d=n.readSync(s.dataId),u=n.readSync(r.dataId),l=n.readSync(i.dataId),c=n.readSync(a.dataId)[0],[f,p,m,h,b]=Object(o.sparseFillEmptyRowsImplCPU)(d,s.shape,s.dtype,u,r.dtype,l,c);return[n.makeTensorInfo(p,s.dtype,f),n.makeTensorInfo([p[0]],r.dtype,m),n.makeTensorInfo([h.length],"bool",new Uint8Array(h.map((e=>Number(e))))),n.makeTensorInfo([b.length],s.dtype,new Int32Array(b))]}const i={kernelName:s.SparseFillEmptyRows,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseReshape.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseReshape.js ***! + \***********************************************************************************/ +/*! exports provided: sparseReshape, sparseReshapeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sparseReshape",(function(){return r})),n.d(t,"sparseReshapeConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n}=e,{inputIndices:s,inputShape:r,newShape:i}=t;if(2!==s.shape.length)throw new Error(`Input indices should be a matrix but received shape ${s.shape}`);if(1!==r.shape.length)throw new Error(`Input shape should be a vector but received shape ${r.shape}`);if(1!==i.shape.length)throw new Error(`Target shape should be a vector but received shape ${i.shape}`);const a=Array.from(n.readSync(r.dataId)),d=n.readSync(s.dataId),u=Array.from(n.readSync(i.dataId)),[l,c,f]=Object(o.sparseReshapeImplCPU)(d,s.shape,s.dtype,a,u);return[n.makeTensorInfo(c,s.dtype,l),n.makeTensorInfo([f.length],i.dtype,new Int32Array(f))]}const i={kernelName:s.SparseReshape,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseSegmentMean.js": +/*!***************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseSegmentMean.js ***! + \***************************************************************************************/ +/*! exports provided: sparseSegmentMean, sparseSegmentMeanConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sparseSegmentMean",(function(){return r})),n.d(t,"sparseSegmentMeanConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n}=e,{data:s,indices:r,segmentIds:i}=t;if(s.shape.length<1)throw new Error("Data should be at least 1 dimensional but received scalar");if(1!==r.shape.length)throw new Error(`Indices should be a vector but received shape\n ${r.shape}`);if(1!==i.shape.length)throw new Error(`Segment ids should be a vector but received shape\n ${i.shape}`);const a=n.readSync(s.dataId),d=n.readSync(r.dataId),u=n.readSync(i.dataId),[l,c]=Object(o.sparseSegmentReductionImplCPU)(a,s.shape,s.dtype,d,u,!0);return n.makeTensorInfo(c,s.dtype,l)}const i={kernelName:s.SparseSegmentMean,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseSegmentSum.js": +/*!**************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseSegmentSum.js ***! + \**************************************************************************************/ +/*! exports provided: sparseSegmentSum, sparseSegmentSumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sparseSegmentSum",(function(){return r})),n.d(t,"sparseSegmentSumConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n}=e,{data:s,indices:r,segmentIds:i}=t;if(s.shape.length<1)throw new Error("Data should be at least 1 dimensional but received scalar");if(1!==r.shape.length)throw new Error(`Indices should be a vector but received shape\n ${r.shape}`);if(1!==i.shape.length)throw new Error(`Segment ids should be a vector but received shape\n ${i.shape}`);const a=n.readSync(s.dataId),d=n.readSync(r.dataId),u=n.readSync(i.dataId),[l,c]=Object(o.sparseSegmentReductionImplCPU)(a,s.shape,s.dtype,d,u);return n.makeTensorInfo(c,s.dtype,l)}const i={kernelName:s.SparseSegmentSum,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseToDense.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseToDense.js ***! + \***********************************************************************************/ +/*! exports provided: sparseToDense, sparseToDenseConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sparseToDense",(function(){return i})),n.d(t,"sparseToDenseConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../scatter_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/scatter_gpu.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{sparseIndices:a,sparseValues:d,defaultValue:u}=t,{outputShape:l}=i,{sliceRank:c,numUpdates:f,strides:p,outputSize:m}=s.backend_util.calculateShapes(d,a,l),h=new o.ScatterProgram(f,c,a.shape.length,d.shape.length,p,[m,1],!1),b=n.runWebGLProgram(h,[d,a,u],d.dtype),j=Object(r.reshape)({inputs:{x:b},backend:n,attrs:{shape:l}});return n.disposeIntermediateTensorInfo(b),j}const a={kernelName:s.SparseToDense,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SplitV.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SplitV.js ***! + \****************************************************************************/ +/*! exports provided: splitV, splitVConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"splitV",(function(){return r})),n.d(t,"splitVConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Slice */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Slice.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i}=t,{numOrSizeSplits:a,axis:d}=r,u=s.util.parseAxisParam(d,i.shape)[0],l=s.backend_util.prepareSplitSize(i,a,u),c=i.shape.length,f=new Array(c).fill(0),p=i.shape.slice();return l.map((e=>{const t=[...p];t[u]=e;const s=Object(o.slice)({inputs:{x:i},backend:n,attrs:{begin:f,size:t}});return f[u]+=e,s}))}const i={kernelName:s.SplitV,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sqrt.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sqrt.js ***! + \**************************************************************************/ +/*! exports provided: sqrt, sqrtConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sqrt",(function(){return r})),n.d(t,"sqrtConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)({opSnippet:"return sqrt(x);"}),i={kernelName:s.Sqrt,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Square.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Square.js ***! + \****************************************************************************/ +/*! exports provided: square, squareConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"square",(function(){return r})),n.d(t,"squareConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)({opSnippet:"return x * x;"}),i={kernelName:s.Square,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SquaredDifference.js": +/*!***************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SquaredDifference.js ***! + \***************************************************************************************/ +/*! exports provided: squaredDifference, squaredDifferenceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"squaredDifference",(function(){return i})),n.d(t,"squaredDifferenceConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r="return (a - b) * (a - b);",i=Object(o.binaryKernelFunc)({opSnippet:r,packedOpSnippet:r}),a={kernelName:s.SquaredDifference,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Step.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Step.js ***! + \**************************************************************************/ +/*! exports provided: step, stepConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"step",(function(){return r})),n.d(t,"stepConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../unaryop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r({inputs:e,attrs:t,backend:n}){const{x:s}=e,r=o.CHECK_NAN_SNIPPET+`\n return x > 0.0 ? 1.0 : float(${t.alpha});\n `,i=new o.UnaryOpProgram(s.shape,r);return n.runWebGLProgram(i,[s],s.dtype)}const i={kernelName:s.Step,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/StridedSlice.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/StridedSlice.js ***! + \**********************************************************************************/ +/*! exports provided: stridedSlice, stridedSliceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"stridedSlice",(function(){return d})),n.d(t,"stridedSliceConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"),r=n(/*! ../strided_slice_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/strided_slice_gpu.js"),i=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),a=n(/*! ./Slice */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Slice.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function d(e){const{inputs:t,backend:n,attrs:d}=e,{x:u}=t,{begin:l,end:c,strides:f,beginMask:p,endMask:m,ellipsisMask:h,newAxisMask:b,shrinkAxisMask:j}=d,{nonStrided:g,$begin:w,$strides:_,size:k,newShape:v,outShape:x}=s.slice_util.sliceInfo(u.shape,l,c,f,p,m,h,b,j),y=Object(i.reshape)({inputs:{x:u},backend:n,attrs:{shape:v}});let O;if(g){const e=Object(a.slice)({inputs:{x:y},backend:n,attrs:{begin:w,size:k}});O=Object(i.reshape)({inputs:{x:e},backend:n,attrs:{shape:x}}),n.disposeIntermediateTensorInfo(e)}else if(x.some((e=>0===e)))O=n.makeTensorInfo(x,u.dtype,[]);else{if(n.shouldExecuteOnCPU([y])){const e=n.texData.get(y.dataId).values,t=Object(s.buffer)(y.shape,y.dtype,e),r=Object(o.stridedSliceImplCPU)(x,t,_,w);O=n.makeTensorInfo(x,y.dtype,r.values)}else{const e=new r.StridedSliceProgram(w,_,x);O=n.runWebGLProgram(e,[y],y.dtype)}}const I=Object(i.reshape)({inputs:{x:O},backend:n,attrs:{shape:x}});return n.disposeIntermediateTensorInfo(y),n.disposeIntermediateTensorInfo(O),I}const u={kernelName:s.StridedSlice,backendName:"webgl",kernelFunc:d}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/StringNGrams.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/StringNGrams.js ***! + \**********************************************************************************/ +/*! exports provided: stringNGrams, stringNGramsConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"stringNGrams",(function(){return r})),n.d(t,"stringNGramsConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:s}=e,{separator:r,nGramWidths:i,leftPad:a,rightPad:d,padWidth:u,preserveShortSequences:l}=s,{data:c,dataSplits:f}=t,p=n.readSync(c.dataId),m=n.readSync(f.dataId),[h,b]=Object(o.stringNGramsImplCPU)(p,m,r,i,a,d,u,l);return[n.makeTensorInfo([h.length],"string",h),n.makeTensorInfo(f.shape,"int32",b)]}const i={kernelName:s.StringNGrams,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/StringSplit.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/StringSplit.js ***! + \*********************************************************************************/ +/*! exports provided: stringSplit, stringSplitConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"stringSplit",(function(){return r})),n.d(t,"stringSplitConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:s}=e,{skipEmpty:r}=s,{input:i,delimiter:a}=t;if("string"!==i.dtype)throw new Error("Input must be of datatype string");if(1!==i.shape.length)throw new Error(`Input must be a vector, got shape: ${i.shape}`);if(0!==a.shape.length)throw new Error(`Delimiter must be a scalar, got shape: ${a.shape}`);const d=n.readSync(i.dataId),u=n.readSync(a.dataId)[0],[l,c,f]=Object(o.stringSplitImplCPU)(d,u,r),p=c.length;return[n.makeTensorInfo([p,2],"int32",l),n.makeTensorInfo([p],"string",c),n.makeTensorInfo([2],"int32",new Int32Array(f))]}const i={kernelName:s.StringSplit,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/StringToHashBucketFast.js": +/*!********************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/StringToHashBucketFast.js ***! + \********************************************************************************************/ +/*! exports provided: stringToHashBucketFast, stringToHashBucketFastConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"stringToHashBucketFast",(function(){return r})),n.d(t,"stringToHashBucketFastConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:s}=e,{numBuckets:r}=s,{input:i}=t;if("string"!==i.dtype)throw new Error("Input must be of datatype string");if(r<=0)throw new Error("Number of buckets must be at least 1");const a=n.readSync(i.dataId),d=Object(o.stringToHashBucketFastImplCPU)(a,r);return n.makeTensorInfo(i.shape,"int32",d)}const i={kernelName:s.StringToHashBucketFast,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sub.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sub.js ***! + \*************************************************************************/ +/*! exports provided: sub, subConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sub",(function(){return a})),n.d(t,"subConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i="return a - b;",a=Object(o.binaryKernelFunc)({opSnippet:i,packedOpSnippet:i,supportsComplex:!0,cpuKernelImpl:r.subImplCPU}),d={kernelName:s.Sub,backendName:"webgl",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sum.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sum.js ***! + \*************************************************************************/ +/*! exports provided: sum, sumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sum",(function(){return r})),n.d(t,"sumConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Sum_impl */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sum_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:s}=e,{x:r}=t,{axis:i,keepDims:a}=s;return Object(o.sumImpl)(r,i,a,n)}const i={kernelName:s.Sum,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sum_impl.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sum_impl.js ***! + \******************************************************************************/ +/*! exports provided: sumImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"sumImpl",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/reduce */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/reduce.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),i=n(/*! ./Transpose_impl */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e,t,n,a){const d=t,u=e.shape.length,l=s.util.parseAxisParam(d,e.shape);let c=l;const f=s.backend_util.getAxesPermutation(c,u),p=null!=f;let m=e;p&&(m=Object(i.transposeImpl)(e,f,a),c=s.backend_util.getInnerMostAxes(c.length,u)),s.backend_util.assertAxesAreInnerMostDims("sum",c,u);const[h,b]=s.backend_util.computeOutAndReduceShapes(m.shape,c);let j=h;n&&(j=s.backend_util.expandShapeToKeepDim(h,l));const g=s.util.sizeFromShape(b),w=s.util.sizeFromShape(e.shape)/g,_=Object(r.reshape)({inputs:{x:m},attrs:{shape:[w,g]},backend:a}),k=Object(s.sumOutType)(e.dtype),v=Object(o.reduce)(_,k,"sum",a),x=Object(r.reshape)({inputs:{x:v},attrs:{shape:j},backend:a});return a.disposeIntermediateTensorInfo(_),a.disposeIntermediateTensorInfo(v),p&&a.disposeIntermediateTensorInfo(m),x}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Tan.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Tan.js ***! + \*************************************************************************/ +/*! exports provided: tan, tanConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"tan",(function(){return r})),n.d(t,"tanConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)({opSnippet:"return tan(x);"}),i={kernelName:s.Tan,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Tanh.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Tanh.js ***! + \**************************************************************************/ +/*! exports provided: tanh, tanhConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"tanh",(function(){return r})),n.d(t,"tanhConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)({opSnippet:"\n float e2x = exp(-2.0 * abs(x));\n return sign(x) * (1.0 - e2x) / (1.0 + e2x);\n"}),i={kernelName:s.Tanh,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Tile.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Tile.js ***! + \**************************************************************************/ +/*! exports provided: tile, tileConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"tile",(function(){return i})),n.d(t,"tileConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"),r=n(/*! ../tile_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/tile_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{reps:d}=i;if("string"===a.dtype||a.shape.length>5){const e=n.readSync(a.dataId),t="string"===a.dtype?e.map((e=>s.util.decodeString(e))):e,r=Object(s.buffer)(a.shape,a.dtype,t),i=Object(o.tileImplCPU)(r,d);return n.makeTensorInfo(i.shape,i.dtype,i.values)}const u=new r.TileProgram(a.shape,d);return n.runWebGLProgram(u,[a],a.dtype)}const a={kernelName:s.Tile,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/TopK.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/TopK.js ***! + \**************************************************************************/ +/*! exports provided: topK, topKConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"topK",(function(){return f})),n.d(t,"topKConfig",(function(){return p}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"),r=n(/*! ../top_k_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/top_k_gpu.js"),i=n(/*! ./Fill */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Fill.js"),a=n(/*! ./GatherV2 */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/GatherV2.js"),d=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),u=n(/*! ./Slice */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Slice.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function l(e,t){null!==t&&e.disposeIntermediateTensorInfo(t)}function c(e){let t=1;for(;tj){const e=n.readSync(p.dataId),[t,s]=Object(o.topKImplCPU)(e,g,p.dtype,m,h);return[n.makeTensorInfo(t.shape,t.dtype,t.values),n.makeTensorInfo(s.shape,s.dtype,s.values)]}if(0===m)return g[g.length-1]=0,[n.makeTensorInfo(g,p.dtype,[]),n.makeTensorInfo(g,"int32",[])];if(1===w)return[p,Object(i.fill)({attrs:{shape:g,dtype:"int32",value:0},backend:n})];const _=n.texData.get(p.dataId),k=null!==_&&_.isPacked,v=k?n.unpackTensor(p):p,x=s.util.sizeFromShape(g)/w,y=Object(d.reshape)({inputs:{x:v},attrs:{shape:[x,w]},backend:n});k&&l(n,v);const O=c(m),I=c(w);let C=null;const S=()=>null===C?[y,y]:[y,C],T=(e,t,s)=>{const o=S(),i=new r.SwapProgram(s),a=[[w],[null===C?1:0],[Number.NEGATIVE_INFINITY],[e],[t]],d=C;C=n.runWebGLProgram(i,o,"int32",a),l(n,d)};for(let e=1;e=1;n/=2)T(t,n,[x,I])}for(let e=I;e>O;e/=2){const t=S(),s=new r.MergeProgram([x,e/2]),o=[[w],[null===C?1:0],[O]],i=C;C=n.runWebGLProgram(s,t,"int32",o),l(n,i);const a=O/2,d=2*a;for(let e=a;e>=1;e/=2)T(d,e,C.shape)}let N=C;C=Object(u.slice)({inputs:{x:C},backend:n,attrs:{begin:0,size:[x,m]}}),l(n,N);let E=Object(a.gatherV2)({inputs:{x:y,indices:C},backend:n,attrs:{axis:1,batchDims:1}});l(n,y);const A=g.slice(0,-1);A.push(m),N=C,C=Object(d.reshape)({inputs:{x:C},attrs:{shape:A},backend:n}),l(n,N);const R=E;return E=Object(d.reshape)({inputs:{x:E},attrs:{shape:A},backend:n}),l(n,R),[E,C]}const p={kernelName:s.TopK,backendName:"webgl",kernelFunc:f}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transform.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transform.js ***! + \*******************************************************************************/ +/*! exports provided: transform, transformConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"transform",(function(){return r})),n.d(t,"transformConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../transform_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/transform_gpu.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:s}=e,{image:r,transforms:i}=t,{interpolation:a,fillMode:d,fillValue:u,outputShape:l}=s,[c,f,p,m]=r.shape,[h,b]=null!=l?l:[f,p],j=[c,h,b,m],g=new o.TransformProgram(f,p,a,d,u,j);return n.runWebGLProgram(g,[r,i],"float32")}const i={kernelName:s.Transform,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js ***! + \*******************************************************************************/ +/*! exports provided: transpose, transposeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"transpose",(function(){return r})),n.d(t,"transposeConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Transpose_impl */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:s}=e,{x:r}=t,{perm:i}=s,a=n,d=r.shape.length,u=new Array(d);for(let e=0;en.disposeIntermediateTensorInfo(e))),b}const a={kernelName:s.Unpack,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/UnsortedSegmentSum.js": +/*!****************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/UnsortedSegmentSum.js ***! + \****************************************************************************************/ +/*! exports provided: unsortedSegmentSum, unsortedSegmentSumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"unsortedSegmentSum",(function(){return u})),n.d(t,"unsortedSegmentSumConfig",(function(){return l}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../segment_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/segment_gpu.js"),r=n(/*! ./Range */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Range.js"),i=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),a=n(/*! ./Tile */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Tile.js"),d=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function u(e){const{inputs:t,backend:n,attrs:u}=e,{x:l,segmentIds:c}=t,{numSegments:f}=u,p=l.shape.length,m=[];let h=0;const b=s.backend_util.getAxesPermutation([h],p);let j=l;null!=b&&(j=Object(d.transpose)({inputs:{x:l},backend:n,attrs:{perm:b}}),m.push(j),h=s.backend_util.getInnerMostAxes(1,p)[0]);const g=s.backend_util.segment_util.computeOutShape(j.shape,h,f),w=s.util.sizeFromShape([j.shape[h]]),_=Object(i.reshape)({inputs:{x:j},backend:n,attrs:{shape:[-1,w]}});m.push(_);const k=Object(s.sumOutType)(l.dtype),v=(e,t,i,d,u)=>{const l=e.shape[0],c=e.shape[1],f=s.backend_util.segment_util.segOpComputeOptimalWindowSize(c,u),p={windowSize:f,inSize:c,batchSize:l,numSegments:u},h=new o.SegmentOpProgram(p,t),b=n.compileAndRun(h,[e,i],d);if(m.push(b),b.shape[1]===u)return b;const j=Object(r.range)({backend:n,attrs:{start:0,stop:u,step:1,dtype:"float32"}}),g=Object(a.tile)({inputs:{x:j},backend:n,attrs:{reps:[c/f]}});m.push(j),m.push(g);return v(b,t,g,d,u)},x=v(_,"unsortedSegmentSum",c,k,f),y=Object(i.reshape)({inputs:{x:x},backend:n,attrs:{shape:g}});let O=y;if(null!=b){m.push(y);const e=s.backend_util.getUndoAxesPermutation(b);O=Object(d.transpose)({inputs:{x:O},backend:n,attrs:{perm:e}})}return m.forEach((e=>n.disposeIntermediateTensorInfo(e))),O}const l={kernelName:s.UnsortedSegmentSum,backendName:"webgl",kernelFunc:u}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ZerosLike.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ZerosLike.js ***! + \*******************************************************************************/ +/*! exports provided: zerosLike, zerosLikeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"zerosLike",(function(){return d})),n.d(t,"zerosLikeConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Complex */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js"),r=n(/*! ./Fill */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Fill.js"),i=n(/*! ./Imag */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Imag.js"),a=n(/*! ./Real */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Real.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function d(e){const{inputs:t,backend:n}=e,{x:s}=t;if("complex64"===s.dtype){const e=Object(a.real)({inputs:{input:s},backend:n}),t=d({inputs:{x:e},backend:n}),r=Object(i.imag)({inputs:{input:s},backend:n}),u=d({inputs:{x:r},backend:n}),l=Object(o.complex)({inputs:{real:t,imag:u},backend:n});return n.disposeIntermediateTensorInfo(e),n.disposeIntermediateTensorInfo(t),n.disposeIntermediateTensorInfo(r),n.disposeIntermediateTensorInfo(u),l}return Object(r.fill)({attrs:{shape:s.shape,dtype:s.dtype,value:"string"===s.dtype?"":0},backend:n})}const u={kernelName:s.ZerosLike,backendName:"webgl",kernelFunc:d}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/_FusedMatMul.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/_FusedMatMul.js ***! + \**********************************************************************************/ +/*! exports provided: _fusedMatMul, _fusedMatMulConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"_fusedMatMul",(function(){return r})),n.d(t,"_fusedMatMulConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./BatchMatMul_impl */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchMatMul_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:s}=e,{a:r,b:i,bias:a,preluActivationWeights:d}=t,{transposeA:u,transposeB:l,activation:c,leakyreluAlpha:f}=s;return Object(o.batchMatMulImpl)({a:r,b:i,transposeA:u,transposeB:l,backend:n,bias:a,preluActivationWeights:d,leakyreluAlpha:f,activation:c})}const i={kernelName:s._FusedMatMul,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/lrn_gpu.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/lrn_gpu.js ***! + \*********************************************************************/ +/*! exports provided: LRNProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"LRNProgram",(function(){return s})); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e,t,n,s,o){this.variableNames=["x"],this.outputShape=[];const r=t,i=e[3]-1;let a;this.outputShape=e;const d=`float(${n}) + float(${s}) * sum`;a=.5===o?`inversesqrt(${d})`:1===o?`1.0/(${d})`:`exp(log(${d}) * float(-${o}));`,this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int r = coords[1];\n int c = coords[2];\n int d = coords[3];\n float x = getX(b, r, c, d);\n float sum = 0.0;\n for (int j = -${r}; j <= ${r}; j++) {\n int idx = d + j;\n if (idx >= 0 && idx <= ${i}) {\n float z = getX(b, r, c, idx);\n sum += z * z;\n }\n }\n float val = x * ${a};\n setOutput(val);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/lrn_grad_gpu.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/lrn_grad_gpu.js ***! + \**************************************************************************/ +/*! exports provided: LRNGradProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"LRNGradProgram",(function(){return s})); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e,t,n,s,o){this.variableNames=["inputImage","outputImage","dy"],this.outputShape=[],this.outputShape=e,this.depth=e[3],this.depthRadius=t,this.bias=n,this.alpha=s,this.beta=o,this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int r = coords[1];\n int c = coords[2];\n\n float result = 0.0;\n for (int d = 0; d < ${this.depth}; ++d) {\n int depthBegin = int(max(0.0, float(d - ${t})));\n int depthEnd = int(min(float(${this.depth}),\n float(d + ${t} + 1)));\n\n const int MIN_DEPTH_BEGIN = 0;\n const int MAX_DEPTH_END = ${this.depth};\n\n float norm = 0.0;\n for (int k = MIN_DEPTH_BEGIN; k < MAX_DEPTH_END; ++k) {\n if (k < depthBegin){\n continue;\n }\n else if (k >= depthBegin && k < depthEnd) {\n norm += getInputImage(b, r, c, k) * getInputImage(b, r, c, k);\n }\n else {\n break;\n }\n }\n\n norm = float(${s}) * norm + float(${n});\n\n for(int k = MIN_DEPTH_BEGIN; k < MAX_DEPTH_END; ++k){\n if (k < depthBegin){\n continue;\n }\n else if (k >= depthBegin && k < depthEnd){\n float dyi = -2.0 * float(${s})\n * float(${o})\n * getInputImage(b ,r ,c, k) * getOutputImage(b, r, c, d)\n / norm;\n if (k == d) {\n dyi += pow(norm, -1.0 * ${o});\n }\n if (k == coords[3]) {\n dyi *= getDy(b, r, c, d);\n result += dyi;\n }\n }\n else {\n break;\n }\n }\n }\n setOutput(result);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/lrn_packed_gpu.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/lrn_packed_gpu.js ***! + \****************************************************************************/ +/*! exports provided: LRNPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"LRNPackedProgram",(function(){return s})); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e,t,n,s,o){this.variableNames=["x"],this.outputShape=[],this.packedInputs=!0,this.packedOutput=!0;const r=t,i=e[3]-1;let a;this.outputShape=e;const d=`float(${n}) + float(${s}) * sum`;a=.5===o?`inversesqrt(${d})`:1===o?`1.0/(${d})`:`exp(log(${d}) * float(-${o}));`,this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords.x;\n int r = coords.y;\n int c = coords.z;\n int d = coords.w;\n\n bool hasNextCol = d < ${this.outputShape[3]};\n bool hasNextRow = c < ${this.outputShape[2]};\n\n vec4 sum = vec4(0.);\n vec4 xFragAtOutputCoords = getX(b, r, c, d);\n\n vec4 xAtOutputCoords = vec4(\n getChannel(xFragAtOutputCoords, vec2(c, d)),\n hasNextCol ?\n getChannel(xFragAtOutputCoords, vec2(c, d + 1)) : 0.0,\n hasNextRow ?\n getChannel(xFragAtOutputCoords , vec2(c + 1, d)) : 0.0,\n (hasNextRow && hasNextCol) ?\n getChannel(xFragAtOutputCoords, vec2(c + 1, d + 1)) : 0.0\n );\n\n int firstChannel = d - ${r};\n vec2 cache = vec2(0.);\n if(firstChannel >= 0){\n vec4 firstChannelFrag = getX(b, r, c, firstChannel);\n cache.x = getChannel(firstChannelFrag, vec2(c, firstChannel));\n if(hasNextRow){\n cache.y = getChannel(firstChannelFrag, vec2(c + 1, firstChannel));\n }\n }\n\n ivec2 depth = ivec2(d, d + 1);\n for (int j = - ${r}; j <= ${r}; j++) {\n ivec2 idx = depth + j;\n bvec2 aboveLowerBound = greaterThanEqual(idx, ivec2(0));\n bvec2 belowUpperBound = lessThanEqual(idx, ivec2(${i}));\n\n bool depthInRange = aboveLowerBound.x && belowUpperBound.x;\n bool depthPlusOneInRange = aboveLowerBound.y && belowUpperBound.y;\n\n if(depthInRange || depthPlusOneInRange){\n vec4 z = vec4(0.);\n vec4 xFragAtCurrentDepth;\n z.xz = cache.xy;\n if(depthPlusOneInRange && hasNextCol){\n xFragAtCurrentDepth = idx.y != d ?\n getX(b, r, c, idx.y) : xFragAtOutputCoords;\n z.y = getChannel(xFragAtCurrentDepth, vec2(c, idx.y));\n if(hasNextRow){\n z.w = getChannel(xFragAtCurrentDepth, vec2(c + 1, idx.y));\n }\n }\n cache.xy = z.yw;\n sum += z * z;\n }\n }\n vec4 result = xAtOutputCoords * ${a};\n setOutput(result);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/max_pool_backprop_gpu.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/max_pool_backprop_gpu.js ***! + \***********************************************************************************/ +/*! exports provided: MaxPool2DBackpropProgram, MaxPool3DBackpropProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"MaxPool2DBackpropProgram",(function(){return s})),n.d(t,"MaxPool3DBackpropProgram",(function(){return o})); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e){this.variableNames=["dy","maxPos"],this.outputShape=e.inShape;const t=e.strideHeight,n=e.strideWidth,s=e.dilationHeight,o=e.effectiveFilterHeight,r=e.effectiveFilterWidth,i=o-1-e.padInfo.top,a=r-1-e.padInfo.left,d=o*r-1;this.userCode=`\n const ivec2 pads = ivec2(${i}, ${a});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n\n ivec2 dyRCCorner = coords.yz - pads;\n int dyRCorner = dyRCCorner.x;\n int dyCCorner = dyRCCorner.y;\n\n // Convolve dy(?, ?, d) with pos mask(:, :, d) to get dx(xR, xC, d).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < ${o};\n wR += ${s}) {\n float dyR = float(dyRCorner + wR) / ${t}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < ${r}; wC++) {\n float dyC = float(dyCCorner + wC) / ${n}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(b, idyR, idyC, d);\n int maxPosValue = ${d} - int(getMaxPos(b, idyR, idyC, d));\n\n // Get the current value, check it against the value from the\n // position matrix.\n int curPosValue = wR * ${r} + wC;\n float mask = float(maxPosValue == curPosValue ? 1.0 : 0.0);\n\n dotProd += dyValue * mask;\n }\n }\n setOutput(dotProd);\n }\n `}}class o{constructor(e){this.variableNames=["dy","maxPos"],this.outputShape=e.inShape;const t=e.strideDepth,n=e.strideHeight,s=e.strideWidth,o=e.dilationDepth,r=e.dilationHeight,i=e.dilationWidth,a=e.effectiveFilterDepth,d=e.effectiveFilterHeight,u=e.effectiveFilterWidth,l=a-1-e.padInfo.front,c=d-1-e.padInfo.top,f=u-1-e.padInfo.left,p=a*d*u-1;this.userCode=`\n const ivec3 pads = ivec3(${l}, ${c}, ${f});\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int ch = coords.u;\n\n ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads;\n int dyDCorner = dyCorner.x;\n int dyRCorner = dyCorner.y;\n int dyCCorner = dyCorner.z;\n\n // Convolve dy(?, ?, ?, ch) with pos mask(:, :, :, d) to get\n // dx(xD, xR, xC, ch).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n\n for (int wD = 0; wD < ${a};\n wD += ${o}) {\n float dyD = float(dyDCorner + wD) / ${t}.0;\n\n if (dyD < 0.0 || dyD >= ${e.outDepth}.0 || fract(dyD) > 0.0) {\n continue;\n }\n int idyD = int(dyD);\n\n for (int wR = 0; wR < ${d};\n wR += ${r}) {\n float dyR = float(dyRCorner + wR) / ${n}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 ||\n fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < ${u};\n wC += ${i}) {\n float dyC = float(dyCCorner + wC) / ${s}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(batch, idyD, idyR, idyC, ch);\n int maxPosValue = ${p} -\n int(getMaxPos(batch, idyD, idyR, idyC, ch));\n\n // Get the current value, check it against the value from the\n // position matrix.\n int curPosValue =\n wD * ${d} * ${u} +\n wR * ${u} + wC;\n float mask = float(maxPosValue == curPosValue ? 1.0 : 0.0);\n\n dotProd += dyValue * mask;\n }\n }\n }\n setOutput(dotProd);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/mean_gpu.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/mean_gpu.js ***! + \**********************************************************************/ +/*! exports provided: MeanProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"MeanProgram",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */class o{constructor(e,t){this.variableNames=["x"];const{windowSize:n,batchSize:o,inSize:r,outSize:i}=e;this.outputShape=[o,i];const a=4*Math.floor(n/4),d=n%4;let u="sumValue += dot(values, ones);";if(null!=t){const e=1/t;u=`sumValue += dot(values * ${s.util.isInt(e)?e.toPrecision(2):e}, ones);`}let l="";r%n>0&&(l=`\n if (inIdx < 0 || inIdx >= ${r}) {\n return 0.0;\n }\n `),this.userCode=`\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float getValue(int batch, int inIdx) {\n ${l}\n return getX(batch, inIdx);\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = outIdx * ${n};\n\n float sumValue = 0.0;\n\n for (int i = 0; i < ${a}; i += 4) {\n int inIdx = inOffset + i;\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n getValue(batch, inIdx + 3)\n );\n\n ${u}\n }\n\n int inIdx = inOffset + ${a};\n if (${1===d}) {\n vec4 values = vec4(getValue(batch, inIdx), 0.0, 0.0, 0.0);\n\n ${u}\n } else if (${2===d}) {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1), 0.0, 0.0);\n\n ${u}\n } else if (${3===d}) {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2), 0.0);\n\n ${u}\n }\n setOutput(sumValue);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/mirror_pad_gpu.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/mirror_pad_gpu.js ***! + \****************************************************************************/ +/*! exports provided: MirrorPadProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"MirrorPadProgram",(function(){return o}));var s=n(/*! ./shader_compiler */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */class o{constructor(e,t,n){this.variableNames=["x"],this.outputShape=t.map(((t,n)=>t[0]+e[n]+t[1]));const o=e.length,r=Object(s.getCoordsDataType)(o),i=t.map((e=>e[0])).join(","),a=t.map(((t,n)=>t[0]+e[n])).join(","),d=["coords[0]","coords[1]","coords[2]","coords[3]"].slice(0,o),u="reflect"===n?0:1;this.userCode=1!==o?`\n ${r} start = ${r}(${i});\n ${r} end = ${r}(${a});\n\n void main() {\n ${r} outC = getOutputCoords();\n for (int i = 0; i < ${o}; i++) {\n if (outC[i] < start[i]) {\n outC[i] = start[i] * 2 - outC[i] - ${u};\n } else if(outC[i] >= end[i]) {\n outC[i] = (end[i] - 1) * 2 - outC[i] + ${u};\n }\n }\n ${r} coords = outC - start;\n setOutput(getX(${d}));\n }\n `:`\n int start = ${i};\n int end = ${a};\n\n void main() {\n int outC = getOutputCoords();\n if (outC < start) {\n outC = start * 2 - outC - ${u};\n } else if(outC >= end) {\n outC = (end - 1) * 2 - outC + ${u};\n }\n setOutput(getX(outC - start));\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/mirror_pad_packed_gpu.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/mirror_pad_packed_gpu.js ***! + \***********************************************************************************/ +/*! exports provided: MirrorPadPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"MirrorPadPackedProgram",(function(){return r}));var s=n(/*! ./packing_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/packing_util.js"),o=n(/*! ./shader_compiler */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class r{constructor(e,t,n){this.variableNames=["x"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=t.map(((t,n)=>t[0]+e[n]+t[1]));const r=e.length,i=Object(o.getCoordsDataType)(r),a=t.map((e=>e[0])).join(","),d=t.map(((t,n)=>t[0]+e[n])).join(","),u=Object(s.getChannels)("rc",r),l=Object(s.getChannels)("source",r),c=`${u[r-1]} < ${this.outputShape[r-1]}`,f=1===r?"source":`vec2(${l.slice(-2).join()})`,p="reflect"===n?0:1;let m="";if(1===r){const e=`\n ${i} source = rc;\n if (source < start) {\n source = start * 2 - source - ${p};\n } else if (source >= end) {\n source = (end - 1) * 2 - source + ${p};\n }\n source -= start;\n `;m=`\n ${i} rc = outputLoc;\n ${e}\n result[0] = getChannel(getX(${l.join()}), ${f});\n ${u[r-1]} += 1;\n if(${c}) {\n ${e}\n result[1] = getChannel(getX(${l.join()}), ${f});\n }\n `}else{const e=`\n ${i} source = rc;\n ${i} lt = ${i}(lessThan(source, start));\n ${i} gte = ${i}(greaterThanEqual(source, end));\n ${i} orig = 1 - (lt + gte);\n source = orig * source +\n lt * (start * 2 - source - ${p}) +\n gte * ((end - 1) * 2 - source + ${p});\n source -= start;\n `;m=`\n ${i} rc = outputLoc;\n ${e}\n result[0] = getChannel(getX(${l.join()}), ${f});\n ${u[r-1]} += 1;\n if(${c}) {\n ${e}\n result[1] = getChannel(getX(${l.join()}), ${f});\n }\n rc = outputLoc;\n ${u[r-2]} += 1;\n if(${u[r-2]} < ${this.outputShape[r-2]}) {\n ${e}\n result[2] = getChannel(getX(${l.join()}), ${f});\n ${u[r-1]} += 1;\n if(${c}) {\n ${e}\n result[3] = getChannel(getX(${l.join()}), ${f});\n }\n }\n `}this.userCode=`\n const ${i} start = ${i}(${a});\n const ${i} end = ${i}(${d});\n\n void main() {\n ${i} outputLoc = getOutputCoords();\n vec4 result = vec4(0.);\n ${m}\n setOutput(result);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/mulmat_packed_gpu.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/mulmat_packed_gpu.js ***! + \*******************************************************************************/ +/*! exports provided: MatMulPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"MatMulPackedProgram",(function(){return s})); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e,t,n,s=!1,o=!1,r=!1,i=null,a=!1,d=!1){this.variableNames=["matrixA","matrixB"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=n;const u=s?e[1]:e[2],l=Math.ceil(u/2),c=s?"i * 2, rc.y":"rc.y, i * 2",f=o?"rc.z, i * 2":"i * 2, rc.z",p=s?["a.xxyy","a.zzww"]:["a.xxzz","a.yyww"],m=o?["b.xzxz","b.ywyw"]:["b.xyxy","b.zwzw"];let h="",b="";i&&(h=a?`vec4 activation(vec4 a) {\n vec4 b = getPreluActivationWeightsAtOutCoords();\n ${i}\n }`:d?`vec4 activation(vec4 a) {\n vec4 b = getLeakyreluAlphaAtOutCoords();\n ${i}\n }`:`vec4 activation(vec4 x) {\n ${i}\n }`,b="result = activation(result);");const j=r?"result += getBiasAtOutCoords();":"";r&&this.variableNames.push("bias"),a&&this.variableNames.push("preluActivationWeights"),d&&this.variableNames.push("leakyreluAlpha");let g="rc.x",w="rc.x";e[0] ${t[0]}`;let s="";for(let o=e-2;o= ${t[o]}`,o= ${t};\n bool rEdge = rp1 >= ${n};\n `}(t,e[e.length-1],e[e.length-2],n),d=function(e,t){const n=e.length,s=function(e,t){const n=[];for(let s=0;s<=1;s++)for(let o=0;o<=1;o++){let r=`${0===s?"r":"rp1"}, ${0===o?"c":"cp1"}`;for(let n=2;n= ${e[0]} ? 0. : getA(rc + 1),\n 0, 0`;return`getA(${s[0]}),\n cEdge ? 0. : getA(${s[1]}),\n rEdge ? 0. : getA(${s[2]}),\n rEdge || cEdge ? 0. : getA(${s[3]})`}(e,n);this.userCode=`\n void main() {\n ${r} rc = getOutputCoords();\n\n if(${i}) {\n setOutput(vec4(0));\n } else {\n ${a}\n\n setOutput(vec4(${d}));\n }\n }\n `}}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/packing_util.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/packing_util.js ***! + \**************************************************************************/ +/*! exports provided: getVecChannels, getChannels, getSourceCoords */function(e,t,n){"use strict"; +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function s(e,t){return["x","y","z","w","u","v"].slice(0,t).map((t=>`${e}.${t}`))}function o(e,t){return 1===t?[e]:s(e,t)}function r(e,t){if(1===e)return"rc";let n="";for(let s=0;st[0]+e[n]+t[1]));const o=e.length,r=Object(s.getCoordsDataType)(o),i=t.map((e=>e[0])).join(","),a=t.map(((t,n)=>t[0]+e[n])).join(","),d=["coords[0]","coords[1]","coords[2]","coords[3]"].slice(0,o);this.userCode=1!==o?`\n ${r} start = ${r}(${i});\n ${r} end = ${r}(${a});\n\n void main() {\n ${r} outC = getOutputCoords();\n if (any(lessThan(outC, start)) || any(greaterThanEqual(outC, end))) {\n setOutput(value);\n } else {\n ${r} coords = outC - start;\n setOutput(getX(${d}));\n }\n }\n `:`\n int start = ${i};\n int end = ${a};\n\n void main() {\n int outC = getOutputCoords();\n if (outC < start || outC >= end) {\n setOutput(value);\n } else {\n setOutput(getX(outC - start));\n }\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/pad_packed_gpu.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/pad_packed_gpu.js ***! + \****************************************************************************/ +/*! exports provided: PadPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"PadPackedProgram",(function(){return r}));var s=n(/*! ./packing_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/packing_util.js"),o=n(/*! ./shader_compiler */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class r{constructor(e,t,n){this.variableNames=["x"],this.packedInputs=!0,this.packedOutput=!0,this.customUniforms=[{name:"value",type:"float"}],this.outputShape=t.map(((t,n)=>t[0]+e[n]+t[1]));const r=e.length,i=Object(o.getCoordsDataType)(r),a=t.map((e=>e[0])).join(","),d=t.map(((t,n)=>t[0]+e[n])).join(","),u=Object(s.getChannels)("rc",r),l=Object(s.getChannels)("source",r),c=`${u[r-1]} < ${this.outputShape[r-1]}`,f=1===r?"source":`vec2(${l.slice(-2).join()})`,p=[`${i} rc = outputLoc;`,`${u[r-1]} += 1;\n if(${c}) {\n `,1===r?"":`}\n rc = outputLoc;\n ${u[r-2]} += 1;\n if(${u[r-2]} < ${this.outputShape[r-2]}) {`,1===r?"":` ${u[r-1]} += 1;\n if(${c}) {`],m=1===r?"rc < start || rc >= end":"any(lessThan(rc, start)) || any(greaterThanEqual(rc, end))";let h="";for(let e=0,t=1===r?2:4;e= ${e.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${c};\n wC += ${u}) {\n int xC = xCCorner + wC;\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n float value = getX(batch, xR, xC, d);\n\n // If a min / max value has already been found, use it. If not,\n // use the current value.\n float currMinMaxValue = mix(\n value, minMaxValue, minMaxValueFound);\n if (value ${t} currMinMaxValue) {\n minMaxValue = value;\n minMaxValueFound = 1.0;\n minMaxPosition = ${s?o?h:b:`wR * ${c} + wC`};\n }\n }\n }\n setOutput(float(minMaxPosition));\n }\n `)}let g=`${t}(${t}(${t}(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])`;"avg"===t&&(g="avgValue / count");const w=4*Math.floor(r/4),_=r%4,k=`\n if (${m}) {\n avgValue += dot(values, ones);\n } else {\n minMaxValue = max(values, minMaxValue);\n }\n `;this.userCode=`\n const ivec2 strides = ivec2(${i}, ${a});\n const ivec2 pads = ivec2(${f}, ${p});\n const float initializationValue = ${j};\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float count = 0.0;\n\n float getValue(int batch, int xR, int xC, int d) {\n if (xC < 0 || xC >= ${e.inWidth}) {\n return initializationValue;\n }\n count += 1.0;\n return getX(batch, xR, xC, d);\n }\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d = coords[3];\n\n ivec2 xRCCorner = coords.yz * strides - pads;\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // max/min x(?, ?, d) to get y(yR, yC, d).\n // ? = to be determined\n vec4 minMaxValue = vec4(${j});\n float avgValue = 0.0;\n count = 0.0;\n\n for (int wR = 0; wR < ${l};\n wR += ${d}) {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${w}; wC += 4) {\n int xC = xCCorner + wC * ${u};\n\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + ${u}, d),\n getValue(batch, xR, xC + 2 * ${u}, d),\n getValue(batch, xR, xC + 3 * ${u}, d)\n );\n\n ${k}\n }\n\n int xC = xCCorner + ${w};\n if (${1===_}) {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n ${k}\n } else if (${2===_}) {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + ${u}, d),\n initializationValue,\n initializationValue\n );\n\n ${k}\n } else if (${3===_}) {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + ${u}, d),\n getValue(batch, xR, xC + 2 * ${u}, d),\n initializationValue\n );\n\n ${k}\n }\n }\n setOutput(${g});\n }\n `}}class o{constructor(e,t,n,s=!1,o=!1){if(this.variableNames=["x"],"avg"===t&&n)throw new Error("Cannot compute positions for average pool.");const r=e.filterWidth,i=e.strideDepth,a=e.strideHeight,d=e.strideWidth,u=e.dilationDepth,l=e.dilationHeight,c=e.dilationWidth,f=e.effectiveFilterDepth,p=e.effectiveFilterHeight,m=e.effectiveFilterWidth,h=e.padInfo.front,b=e.padInfo.top,j=e.padInfo.left;this.outputShape=e.outShape;const g="avg"===t;let w="0.0";if(g||(w="-1.0 / 1e-20"),n){const t=">=";return void(this.userCode=`\n const ivec3 strides =\n ivec3(${i}, ${a}, ${d});\n const ivec3 pads = ivec3(${h}, ${b}, ${j});\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int ch = coords.u;\n\n ivec3 xCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads;\n int xDCorner = xCorner.x;\n int xRCorner = xCorner.y;\n int xCCorner = xCorner.z;\n\n // max/min x(?, ?, ?, ch) to get y(yD, yR, yC, ch).\n // ? = to be determined\n float minMaxValue = 0.0;\n float minMaxValueFound = 0.0;\n int minMaxPosition = 0;\n\n for (int wD = 0; wD < ${f};\n wD += ${u}) {\n int xD = xDCorner + wD;\n\n if (xD < 0 || xD >= ${e.inDepth}) {\n continue;\n }\n\n for (int wR = 0; wR < ${p};\n wR += ${l}) {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${m};\n wC += ${c}) {\n int xC = xCCorner + wC;\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n float value = getX(batch, xD, xR, xC, ch);\n\n // If a min / max value has already been found, use it. If not,\n // use the current value.\n float currMinMaxValue = mix(\n value, minMaxValue, minMaxValueFound);\n if (value ${t} currMinMaxValue) {\n minMaxValue = value;\n minMaxValueFound = 1.0;\n minMaxPosition = ${s?o?`(((batch * ${e.inDepth} + xD) * ${e.inHeight} + xR) * ${e.inWidth} + xC) * ${e.inChannels} + ch`:`((xD * ${e.inHeight} + xR) * ${e.inWidth} + xC) * ${e.inChannels} + ch`:`wD * ${p} * ${m} +\n wR * ${m} + wC`};\n }\n }\n }\n }\n setOutput(float(minMaxPosition));\n }\n `)}let _=`${t}(${t}(${t}(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])`;"avg"===t&&(_="avgValue / count");const k=4*Math.floor(r/4),v=r%4,x=`\n if (${g}) {\n avgValue += dot(values, ones);\n } else {\n minMaxValue = max(values, minMaxValue);\n }\n `;this.userCode=`\n const ivec3 strides =\n ivec3(${i}, ${a}, ${d});\n const ivec3 pads = ivec3(${h}, ${b}, ${j});\n const float initializationValue = ${w};\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float count = 0.0;\n\n float getValue(int batch, int xD, int xR, int xC, int ch) {\n if (xC < 0 || xC >= ${e.inWidth}) {\n return initializationValue;\n }\n count += 1.0;\n return getX(batch, xD, xR, xC, ch);\n }\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int ch = coords.u;\n\n ivec3 xCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads;\n int xDCorner = xCorner.x;\n int xRCorner = xCorner.y;\n int xCCorner = xCorner.z;\n\n // max/min x(?, ?, ?, d) to get y(yD, yR, yC, ch).\n // ? = to be determined\n vec4 minMaxValue = vec4(${w});\n float avgValue = 0.0;\n count = 0.0;\n\n for (int wD = 0; wD < ${f};\n wD += ${u}) {\n int xD = xDCorner + wD;\n\n if (xD < 0 || xD >= ${e.inDepth}) {\n continue;\n }\n\n for (int wR = 0; wR < ${p};\n wR += ${l}) {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${k}; wC += 4) {\n int xC = xCCorner + wC * ${c};\n\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n getValue(batch, xD, xR, xC + ${c}, ch),\n getValue(batch, xD, xR, xC + 2 * ${c}, ch),\n getValue(batch, xD, xR, xC + 3 * ${c}, ch)\n );\n\n ${x}\n }\n\n int xC = xCCorner + ${k};\n if (${1===v}) {\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n ${x}\n } else if (${2===v}) {\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n getValue(batch, xD, xR, xC + ${c}, ch),\n initializationValue,\n initializationValue\n );\n\n ${x}\n } else if (${3===v}) {\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n getValue(batch, xD, xR, xC + ${c}, ch),\n getValue(batch, xD, xR, xC + 2 * ${c}, ch),\n initializationValue\n );\n\n ${x}\n }\n }\n setOutput(${_});\n }\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/reduce_gpu.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/reduce_gpu.js ***! + \************************************************************************/ +/*! exports provided: ReduceProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ReduceProgram",(function(){return s})); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e,t){this.variableNames=["x"];const{windowSize:n,batchSize:s,inSize:o,outSize:r}=e;this.outputShape=[s,r];let i="0.0",a="";"prod"===t?i="1.0":"min"===t?(i="1.0 / 1e-20",a="min"):"max"===t&&(i="-1.0 / 1e-20",a="max");let d=`${t}(${t}(${t}(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])`;"sum"===t?d="sumValue":"prod"===t?d="prodValue":"all"===t?d="allValue":"any"===t&&(d="anyValue");const u=4*Math.floor(n/4),l=n%4;let c=`\n if (${"sum"===t}) {\n sumValue += dot(values, ones);\n } else if (${"prod"===t}) {\n vec2 tmp = vec2(values[0], values[1]) * vec2(values[2], values[3]);\n prodValue *= tmp[0] * tmp[1];\n } else {\n minMaxValue = ${a}(values, minMaxValue);\n if (${"min"===t} || ${"max"===t}) {\n minMaxValue = ${a}(values, minMaxValue);\n bvec4 isNaN = isnan(values);\n if (isNaN.r || isNaN.g || isNaN.b || isNaN.a) {\n minMaxValue = vec4(NAN);\n }\n }\n }\n `,f="vec4";"all"===t?(i="1.0",c="\n bool reducedAllValue = all(values);\n float floatedReducedAllValue = float(reducedAllValue);\n allValue = float(allValue >= 1.0 && floatedReducedAllValue >= 1.0);\n ",f="bvec4"):"any"===t&&(i="0.0",c="\n bool reducedAnyValue = any(values);\n float floatedReducedAnyValue = float(reducedAnyValue);\n anyValue = float(anyValue >= 1.0 || floatedReducedAnyValue >= 1.0);\n ",f="bvec4");let p="";o%n>0&&(p=`\n if (inIdx < 0 || inIdx >= ${o}) {\n return initializationValue;\n }\n `),this.userCode=`\n const float initializationValue = ${i};\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float getValue(int batch, int inIdx) {\n ${p}\n return getX(batch, inIdx);\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = outIdx * ${n};\n\n vec4 minMaxValue = vec4(${i});\n float prodValue = 1.0;\n float sumValue = 0.0;\n float allValue = 1.0;\n float anyValue = 0.0;\n\n for (int i = 0; i < ${u}; i += 4) {\n int inIdx = inOffset + i;\n ${f} values = ${f}(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n getValue(batch, inIdx + 3)\n );\n\n ${c}\n }\n\n int inIdx = inOffset + ${u};\n if (${1===l}) {\n ${f} values = ${f}(\n getValue(batch, inIdx),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n ${c}\n } else if (${2===l}) {\n ${f} values = ${f}(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n initializationValue,\n initializationValue\n );\n\n ${c}\n } else if (${3===l}) {\n ${f} values = ${f}(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n initializationValue\n );\n\n ${c}\n }\n setOutput(${d});\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/register_all_kernels.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/register_all_kernels.js ***! + \**********************************************************************************/ +/*! no exports provided */function(e,t,n){"use strict";n.r(t);var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./kernels/_FusedMatMul */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/_FusedMatMul.js"),r=n(/*! ./kernels/Abs */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Abs.js"),i=n(/*! ./kernels/Acos */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Acos.js"),a=n(/*! ./kernels/Acosh */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Acosh.js"),d=n(/*! ./kernels/Add */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Add.js"),u=n(/*! ./kernels/AddN */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/AddN.js"),l=n(/*! ./kernels/All */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/All.js"),c=n(/*! ./kernels/Any */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Any.js"),f=n(/*! ./kernels/ArgMax */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ArgMax.js"),p=n(/*! ./kernels/ArgMin */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ArgMin.js"),m=n(/*! ./kernels/Asin */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Asin.js"),h=n(/*! ./kernels/Asinh */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Asinh.js"),b=n(/*! ./kernels/Atan */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Atan.js"),j=n(/*! ./kernels/Atan2 */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Atan2.js"),g=n(/*! ./kernels/Atanh */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Atanh.js"),w=n(/*! ./kernels/AvgPool */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPool.js"),_=n(/*! ./kernels/AvgPool3D */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPool3D.js"),k=n(/*! ./kernels/AvgPool3DGrad */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPool3DGrad.js"),v=n(/*! ./kernels/AvgPoolGrad */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPoolGrad.js"),x=n(/*! ./kernels/BatchMatMul */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchMatMul.js"),y=n(/*! ./kernels/BatchNorm */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchNorm.js"),O=n(/*! ./kernels/BatchToSpaceND */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchToSpaceND.js"),I=n(/*! ./kernels/Bincount */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Bincount.js"),C=n(/*! ./kernels/Cast */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Cast.js"),S=n(/*! ./kernels/Ceil */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Ceil.js"),T=n(/*! ./kernels/ClipByValue */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ClipByValue.js"),N=n(/*! ./kernels/Complex */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js"),E=n(/*! ./kernels/ComplexAbs */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ComplexAbs.js"),A=n(/*! ./kernels/Concat */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Concat.js"),R=n(/*! ./kernels/Conv2D */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2D.js"),F=n(/*! ./kernels/Conv2DBackpropFilter */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2DBackpropFilter.js"),$=n(/*! ./kernels/Conv2DBackpropInput */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2DBackpropInput.js"),M=n(/*! ./kernels/Conv3D */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv3D.js"),D=n(/*! ./kernels/Conv3DBackpropFilterV2 */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv3DBackpropFilterV2.js"),P=n(/*! ./kernels/Conv3DBackpropInputV2 */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv3DBackpropInputV2.js"),B=n(/*! ./kernels/Cos */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Cos.js"),L=n(/*! ./kernels/Cosh */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Cosh.js"),z=n(/*! ./kernels/CropAndResize */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/CropAndResize.js"),G=n(/*! ./kernels/Cumsum */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Cumsum.js"),W=n(/*! ./kernels/DenseBincount */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/DenseBincount.js"),U=n(/*! ./kernels/DepthToSpace */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthToSpace.js"),V=n(/*! ./kernels/DepthwiseConv2dNative */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthwiseConv2dNative.js"),q=n(/*! ./kernels/DepthwiseConv2dNativeBackpropFilter */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthwiseConv2dNativeBackpropFilter.js"),H=n(/*! ./kernels/DepthwiseConv2dNativeBackpropInput */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthwiseConv2dNativeBackpropInput.js"),K=n(/*! ./kernels/Diag */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Diag.js"),X=n(/*! ./kernels/Dilation2D */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Dilation2D.js"),Y=n(/*! ./kernels/Einsum */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Einsum.js"),Z=n(/*! ./kernels/Elu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Elu.js"),Q=n(/*! ./kernels/EluGrad */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/EluGrad.js"),J=n(/*! ./kernels/Equal */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Equal.js"),ee=n(/*! ./kernels/Erf */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Erf.js"),te=n(/*! ./kernels/Exp */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Exp.js"),ne=n(/*! ./kernels/ExpandDims */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ExpandDims.js"),se=n(/*! ./kernels/Expm1 */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Expm1.js"),oe=n(/*! ./kernels/FFT */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FFT.js"),re=n(/*! ./kernels/Fill */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Fill.js"),ie=n(/*! ./kernels/FlipLeftRight */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FlipLeftRight.js"),ae=n(/*! ./kernels/Floor */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Floor.js"),de=n(/*! ./kernels/FloorDiv */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FloorDiv.js"),ue=n(/*! ./kernels/FromPixels */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FromPixels.js"),le=n(/*! ./kernels/FusedConv2D */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FusedConv2D.js"),ce=n(/*! ./kernels/FusedDepthwiseConv2D */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FusedDepthwiseConv2D.js"),fe=n(/*! ./kernels/GatherNd */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/GatherNd.js"),pe=n(/*! ./kernels/GatherV2 */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/GatherV2.js"),me=n(/*! ./kernels/Greater */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Greater.js"),he=n(/*! ./kernels/GreaterEqual */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/GreaterEqual.js"),be=n(/*! ./kernels/Identity */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"),je=n(/*! ./kernels/IFFT */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/IFFT.js"),ge=n(/*! ./kernels/Imag */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Imag.js"),we=n(/*! ./kernels/IsFinite */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/IsFinite.js"),_e=n(/*! ./kernels/IsInf */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/IsInf.js"),ke=n(/*! ./kernels/IsNaN */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/IsNaN.js"),ve=n(/*! ./kernels/LeakyRelu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LeakyRelu.js"),xe=n(/*! ./kernels/Less */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Less.js"),ye=n(/*! ./kernels/LessEqual */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LessEqual.js"),Oe=n(/*! ./kernels/LinSpace */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LinSpace.js"),Ie=n(/*! ./kernels/Log */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Log.js"),Ce=n(/*! ./kernels/Log1p */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Log1p.js"),Se=n(/*! ./kernels/LogicalAnd */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LogicalAnd.js"),Te=n(/*! ./kernels/LogicalNot */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LogicalNot.js"),Ne=n(/*! ./kernels/LogicalOr */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LogicalOr.js"),Ee=n(/*! ./kernels/LRN */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LRN.js"),Ae=n(/*! ./kernels/LRNGrad */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LRNGrad.js"),Re=n(/*! ./kernels/Max */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Max.js"),Fe=n(/*! ./kernels/Maximum */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Maximum.js"),$e=n(/*! ./kernels/MaxPool */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPool.js"),Me=n(/*! ./kernels/MaxPool3D */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPool3D.js"),De=n(/*! ./kernels/MaxPool3DGrad */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPool3DGrad.js"),Pe=n(/*! ./kernels/MaxPoolGrad */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolGrad.js"),Be=n(/*! ./kernels/MaxPoolWithArgmax */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolWithArgmax.js"),Le=n(/*! ./kernels/Mean */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Mean.js"),ze=n(/*! ./kernels/Min */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Min.js"),Ge=n(/*! ./kernels/Minimum */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Minimum.js"),We=n(/*! ./kernels/MirrorPad */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MirrorPad.js"),Ue=n(/*! ./kernels/Mod */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Mod.js"),Ve=n(/*! ./kernels/Multinomial */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Multinomial.js"),qe=n(/*! ./kernels/Multiply */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Multiply.js"),He=n(/*! ./kernels/Neg */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Neg.js"),Ke=n(/*! ./kernels/NonMaxSuppressionV3 */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV3.js"),Xe=n(/*! ./kernels/NonMaxSuppressionV4 */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV4.js"),Ye=n(/*! ./kernels/NonMaxSuppressionV5 */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV5.js"),Ze=n(/*! ./kernels/NotEqual */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NotEqual.js"),Qe=n(/*! ./kernels/OneHot */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/OneHot.js"),Je=n(/*! ./kernels/OnesLike */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/OnesLike.js"),et=n(/*! ./kernels/Pack */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Pack.js"),tt=n(/*! ./kernels/PadV2 */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/PadV2.js"),nt=n(/*! ./kernels/Pow */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Pow.js"),st=n(/*! ./kernels/Prelu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Prelu.js"),ot=n(/*! ./kernels/Prod */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Prod.js"),rt=n(/*! ./kernels/Range */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Range.js"),it=n(/*! ./kernels/Real */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Real.js"),at=n(/*! ./kernels/RealDiv */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/RealDiv.js"),dt=n(/*! ./kernels/Reciprocal */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reciprocal.js"),ut=n(/*! ./kernels/Relu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Relu.js"),lt=n(/*! ./kernels/Relu6 */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Relu6.js"),ct=n(/*! ./kernels/Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),ft=n(/*! ./kernels/ResizeBilinear */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeBilinear.js"),pt=n(/*! ./kernels/ResizeBilinearGrad */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeBilinearGrad.js"),mt=n(/*! ./kernels/ResizeNearestNeighbor */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeNearestNeighbor.js"),ht=n(/*! ./kernels/ResizeNearestNeighborGrad */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeNearestNeighborGrad.js"),bt=n(/*! ./kernels/Reverse */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reverse.js"),jt=n(/*! ./kernels/RotateWithOffset */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/RotateWithOffset.js"),gt=n(/*! ./kernels/Round */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Round.js"),wt=n(/*! ./kernels/Rsqrt */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Rsqrt.js"),_t=n(/*! ./kernels/ScatterNd */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ScatterNd.js"),kt=n(/*! ./kernels/Select */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Select.js"),vt=n(/*! ./kernels/Selu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Selu.js"),xt=n(/*! ./kernels/Sigmoid */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sigmoid.js"),yt=n(/*! ./kernels/Sign */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sign.js"),Ot=n(/*! ./kernels/Sin */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sin.js"),It=n(/*! ./kernels/Sinh */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sinh.js"),Ct=n(/*! ./kernels/Slice */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Slice.js"),St=n(/*! ./kernels/Softmax */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Softmax.js"),Tt=n(/*! ./kernels/Softplus */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Softplus.js"),Nt=n(/*! ./kernels/SpaceToBatchND */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SpaceToBatchND.js"),Et=n(/*! ./kernels/SparseFillEmptyRows */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseFillEmptyRows.js"),At=n(/*! ./kernels/SparseReshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseReshape.js"),Rt=n(/*! ./kernels/SparseSegmentMean */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseSegmentMean.js"),Ft=n(/*! ./kernels/SparseSegmentSum */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseSegmentSum.js"),$t=n(/*! ./kernels/SparseToDense */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseToDense.js"),Mt=n(/*! ./kernels/SplitV */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SplitV.js"),Dt=n(/*! ./kernels/Sqrt */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sqrt.js"),Pt=n(/*! ./kernels/Square */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Square.js"),Bt=n(/*! ./kernels/SquaredDifference */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SquaredDifference.js"),Lt=n(/*! ./kernels/Step */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Step.js"),zt=n(/*! ./kernels/StridedSlice */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/StridedSlice.js"),Gt=n(/*! ./kernels/StringNGrams */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/StringNGrams.js"),Wt=n(/*! ./kernels/StringSplit */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/StringSplit.js"),Ut=n(/*! ./kernels/StringToHashBucketFast */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/StringToHashBucketFast.js"),Vt=n(/*! ./kernels/Sub */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sub.js"),qt=n(/*! ./kernels/Sum */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sum.js"),Ht=n(/*! ./kernels/Tan */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Tan.js"),Kt=n(/*! ./kernels/Tanh */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Tanh.js"),Xt=n(/*! ./kernels/Tile */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Tile.js"),Yt=n(/*! ./kernels/TopK */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/TopK.js"),Zt=n(/*! ./kernels/Transform */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transform.js"),Qt=n(/*! ./kernels/Transpose */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"),Jt=n(/*! ./kernels/Unique */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Unique.js"),en=n(/*! ./kernels/Unpack */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Unpack.js"),tn=n(/*! ./kernels/UnsortedSegmentSum */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/UnsortedSegmentSum.js"),nn=n(/*! ./kernels/ZerosLike */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ZerosLike.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const sn=[Ee.LRNConfig,Ae.LRNGradConfig,o._fusedMatMulConfig,r.absConfig,i.acosConfig,a.acoshConfig,d.addConfig,u.addNConfig,l.allConfig,c.anyConfig,f.argMaxConfig,p.argMinConfig,m.asinConfig,h.asinhConfig,j.atan2Config,b.atanConfig,g.atanhConfig,_.avgPool3DConfig,w.avgPoolConfig,k.avgPoolGrad3DConfig,v.avgPoolGradConfig,x.batchMatMulConfig,y.batchNormConfig,O.batchToSpaceNDConfig,I.bincountConfig,C.castConfig,S.ceilConfig,T.clipByValueConfig,E.complexAbsConfig,N.complexConfig,A.concatConfig,F.conv2DBackpropFilterConfig,$.conv2DBackpropInputConfig,R.conv2DConfig,D.conv3DBackpropFilterV2Config,P.conv3DBackpropInputConfig,M.conv3DConfig,B.cosConfig,L.coshConfig,z.cropAndResizeConfig,G.cumsumConfig,W.denseBincountConfig,U.depthToSpaceConfig,q.depthwiseConv2dNativeBackpropFilterConfig,H.depthwiseConv2dNativeBackpropInputConfig,V.depthwiseConv2dNativeConfig,K.diagConfig,X.dilation2DConfig,Y.einsumConfig,Z.eluConfig,Q.eluGradConfig,J.equalConfig,ee.erfConfig,te.expConfig,ne.expandDimsConfig,se.expm1Config,oe.fftConfig,re.fillConfig,ie.flipLeftRightConfig,ae.floorConfig,de.floorDivConfig,ue.fromPixelsConfig,le.fusedConv2DConfig,ce.fusedDepthwiseConv2DConfig,fe.gatherNdConfig,pe.gatherV2Config,me.greaterConfig,he.greaterEqualConfig,be.identityConfig,je.ifftConfig,ge.imagConfig,we.isFiniteConfig,_e.isInfConfig,ke.isNaNConfig,ve.leakyReluConfig,xe.lessConfig,ye.lessEqualConfig,Oe.linSpaceConfig,Ce.log1pConfig,Ie.logConfig,Se.logicalAndConfig,Te.logicalNotConfig,Ne.logicalOrConfig,Re.maxConfig,Me.maxPool3DConfig,$e.maxPoolConfig,De.maxPoolGrad3DConfig,Pe.maxPoolGradConfig,Be.maxPoolWithArgmaxConfig,Fe.maximumConfig,Le.meanConfig,ze.minConfig,Ge.minimumConfig,We.mirrorPadConfig,Ue.modConfig,Ve.multinomialConfig,qe.multiplyConfig,He.negConfig,Ke.nonMaxSuppressionV3Config,Xe.nonMaxSuppressionV4Config,Ye.nonMaxSuppressionV5Config,Ze.notEqualConfig,Qe.oneHotConfig,Je.onesLikeConfig,et.packConfig,tt.padV2Config,nt.powConfig,st.preluConfig,ot.prodConfig,rt.rangeConfig,it.realConfig,at.realDivConfig,dt.reciprocalConfig,lt.relu6Config,ut.reluConfig,ct.reshapeConfig,ft.resizeBilinearConfig,pt.resizeBilinearGradConfig,mt.resizeNearestNeighborConfig,ht.resizeNearestNeighborGradConfig,bt.reverseConfig,jt.rotateWithOffsetConfig,gt.roundConfig,wt.rsqrtConfig,_t.scatterNdConfig,kt.selectConfig,vt.seluConfig,xt.sigmoidConfig,yt.signConfig,Ot.sinConfig,It.sinhConfig,Ct.sliceConfig,St.softmaxConfig,Tt.softplusConfig,Nt.spaceToBatchNDConfig,Et.sparseFillEmptyRowsConfig,At.sparseReshapeConfig,Rt.sparseSegmentMeanConfig,Ft.sparseSegmentSumConfig,$t.sparseToDenseConfig,Mt.splitVConfig,Dt.sqrtConfig,Pt.squareConfig,Bt.squaredDifferenceConfig,Lt.stepConfig,zt.stridedSliceConfig,Gt.stringNGramsConfig,Wt.stringSplitConfig,Ut.stringToHashBucketFastConfig,Vt.subConfig,qt.sumConfig,Ht.tanConfig,Kt.tanhConfig,Xt.tileConfig,Yt.topKConfig,Zt.transformConfig,Qt.transposeConfig,Jt.uniqueConfig,en.unpackConfig,tn.unsortedSegmentSumConfig,nn.zerosLikeConfig];for(const e of sn)Object(s.registerKernel)(e)},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/reshape_packed_gpu.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/reshape_packed_gpu.js ***! + \********************************************************************************/ +/*! exports provided: ReshapePackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ReshapePackedProgram",(function(){return o}));var s=n(/*! ./shader_compiler_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */class o{constructor(e,t){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=e;let n="";for(let e=0;e<4;e++){let t="thisRC = rc;";e%2==1&&(t+="thisRC.z += 1;"),e>1&&(t+="thisRC.y += 1;"),n+=`\n ${t}\n ${e>0?"if(thisRC.y < rows && thisRC.z < cols){":""}\n int flatIndex = getFlatIndex(thisRC);\n\n ivec3 inputRC = inputCoordsFromReshapedOutCoords(flatIndex);\n vec2 inputRCInnerDims = vec2(float(inputRC.y),float(inputRC.z));\n\n result[${e}] =\n getChannel(getA(inputRC.x, inputRC.y, inputRC.z), inputRCInnerDims);\n ${e>0?"}":""}\n `}var o;this.userCode=`\n ${o=t,`\n ivec3 inputCoordsFromReshapedOutCoords(int index) {\n ${s.getLogicalCoordinatesFromFlatIndex(["r","c","d"],o)}\n return ivec3(r, c, d);\n }\n `}\n ${s.getFlatIndexFrom3D(e)}\n\n void main() {\n ivec3 rc = getOutputCoords();\n\n vec4 result = vec4(0.);\n\n ivec3 thisRC;\n int rows = ${e[1]};\n int cols = ${e[2]};\n\n ${n}\n\n setOutput(result);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_backprop_gpu.js": +/*!******************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_backprop_gpu.js ***! + \******************************************************************************************/ +/*! exports provided: ResizeBilinearBackpropProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ResizeBilinearBackpropProgram",(function(){return s})); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e,t,n){this.variableNames=["dy"],this.outputShape=[],this.outputShape=t;const[,s,o]=t,[,r,i]=e,a=[n&&r>1?s-1:s,n&&i>1?o-1:o],d=[n&&r>1?r-1:r,n&&i>1?i-1:i],u=a[0]/d[0],l=a[1]/d[1],c=1/u,f=1/l,p=2*Math.ceil(c)+2,m=2*Math.ceil(f)+2;this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n int r = coords[1];\n int c = coords[2];\n\n float accumulator = 0.0;\n\n const float heightScale = float(${u});\n const float widthScale = float(${l});\n\n const float invHeightScale = float(${c});\n const float invWidthScale = float(${f});\n\n const int winHeight = int(${p});\n const int winWidth = int(${m});\n\n // Compute bounds for where in dy we will look\n float startRLerp = floor(float(r) * invHeightScale);\n int startDyR = int(startRLerp - float(winHeight / 2));\n\n float startCLerp = floor(float(c) * invWidthScale);\n int startDyC = int(startCLerp - float(winWidth / 2));\n\n // Loop over dy\n for (int dyROffset = 0; dyROffset < winHeight; dyROffset++) {\n int dyR = dyROffset + startDyR;\n\n // Guard against the window exceeding the bounds of dy\n if (dyR < 0 || dyR >= ${r}) {\n continue;\n }\n\n for (int dyCOffset = 0; dyCOffset < winWidth; dyCOffset++) {\n int dyC = dyCOffset + startDyC;\n\n // Guard against the window exceeding the bounds of dy\n if (dyC < 0 || dyC >= ${i}) {\n continue;\n }\n\n float dxR = float(dyR) * heightScale;\n int topDxRIndex = int(floor(dxR));\n int bottomDxRIndex = int(min(ceil(dxR), ${s-1}.0));\n float dxRLerp = dxR - float(topDxRIndex);\n float inverseDxRLerp = 1.0 - dxRLerp;\n\n float dxC = float(dyC) * widthScale;\n int leftDxCIndex = int(floor(dxC));\n int rightDxCIndex = int(min(ceil(dxC), ${o-1}.0));\n float dxCLerp = dxC - float(leftDxCIndex);\n float inverseDxCLerp = 1.0 - dxCLerp;\n\n if (r == topDxRIndex && c == leftDxCIndex) {\n // topLeft\n accumulator +=\n getDy(b, dyR, dyC, d) * inverseDxRLerp * inverseDxCLerp;\n }\n\n if (r == topDxRIndex && c == rightDxCIndex) {\n // topRight\n accumulator += getDy(b, dyR, dyC, d) * inverseDxRLerp * dxCLerp;\n }\n\n if (r == bottomDxRIndex && c == leftDxCIndex) {\n // bottomLeft\n accumulator += getDy(b, dyR, dyC, d) * dxRLerp * inverseDxCLerp;\n }\n\n if (r == bottomDxRIndex && c == rightDxCIndex) {\n // bottomRight\n accumulator += getDy(b, dyR, dyC, d) * dxRLerp * dxCLerp;\n }\n }\n }\n // End loop over dy\n\n setOutput(accumulator);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_gpu.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_gpu.js ***! + \*********************************************************************************/ +/*! exports provided: ResizeBilinearProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ResizeBilinearProgram",(function(){return s})); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e,t,n,s,o){this.variableNames=["A"],this.outputShape=[];const[r,i,a,d]=e;this.outputShape=[r,t,n,d];const u=[s&&t>1?i-1:i,s&&n>1?a-1:a],l=[s&&t>1?t-1:t,s&&n>1?n-1:n];let c;c=o?"(vec2(yRC) + vec2(0.5)) * effectiveInputOverOutputRatioRC - vec2(0.5)":"vec2(yRC) * effectiveInputOverOutputRatioRC",this.userCode=`\n const vec2 effectiveInputOverOutputRatioRC = vec2(\n ${u[0]/l[0]},\n ${u[1]/l[1]});\n const vec2 inputShapeRC = vec2(${i}.0, ${a}.0);\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n ivec2 yRC = coords.yz;\n\n // Fractional source index.\n vec2 sourceFracIndexRC = ${c};\n\n // Compute the four integer indices.\n ivec2 sourceFloorRC = ivec2(max(sourceFracIndexRC, vec2(0.0)));\n ivec2 sourceCeilRC = ivec2(\n min(inputShapeRC - 1.0, ceil(sourceFracIndexRC)));\n\n float topLeft = getA(b, sourceFloorRC.x, sourceFloorRC.y, d);\n float bottomLeft = getA(b, sourceCeilRC.x, sourceFloorRC.y, d);\n float topRight = getA(b, sourceFloorRC.x, sourceCeilRC.y, d);\n float bottomRight = getA(b, sourceCeilRC.x, sourceCeilRC.y, d);\n\n vec2 fracRC = sourceFracIndexRC - vec2(sourceFloorRC);\n\n float top = topLeft + (topRight - topLeft) * fracRC.y;\n float bottom = bottomLeft + (bottomRight - bottomLeft) * fracRC.y;\n float newValue = top + (bottom - top) * fracRC.x;\n\n setOutput(newValue);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_packed_gpu.js": +/*!****************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_packed_gpu.js ***! + \****************************************************************************************/ +/*! exports provided: ResizeBilinearPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ResizeBilinearPackedProgram",(function(){return s})); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e,t,n,s,o){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=[];const[r,i,a,d]=e;this.outputShape=[r,t,n,d];const u=[s&&t>1?i-1:i,s&&n>1?a-1:a],l=[s&&t>1?t-1:t,s&&n>1?n-1:n];let c;c=o?"(vec3(yRC) + vec3(0.5)) * effectiveInputOverOutputRatioRC - vec3(0.5)":"vec3(yRC) * effectiveInputOverOutputRatioRC",this.userCode=`\n const vec3 effectiveInputOverOutputRatioRC = vec3(\n ${u[0]/l[0]},\n ${u[1]/l[1]},\n ${u[1]/l[1]});\n const vec3 inputShapeRC = vec3(${i}.0, ${a}.0,\n ${a}.0);\n\n float getAValue(int b, int r, int c, int d) {\n return getChannel(getA(b, r, c, d), vec2(c, d));\n }\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n // Calculate values for next column in yRC.z.\n ivec3 yRC = coords.yzz + ivec3(0, 0, 1);\n\n // Fractional source index.\n vec3 sourceFracIndexRC = ${c};\n\n // Compute the four integer indices.\n ivec3 sourceFloorRC = ivec3(max(sourceFracIndexRC, vec3(0.0)));\n ivec3 sourceCeilRC = ivec3(\n min(inputShapeRC - 1.0, ceil(sourceFracIndexRC)));\n\n // Should we calculate next column and row elements in 2x2 packed cell.\n bool hasNextCol = d < ${d-1};\n bool hasNextRow = coords.z < ${n-1};\n\n // In parallel, construct four corners for all four components in\n // packed 2x2 cell.\n vec4 topLeft = vec4(\n getAValue(b, sourceFloorRC.x, sourceFloorRC.y, d),\n hasNextCol ? getAValue(b, sourceFloorRC.x, sourceFloorRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceFloorRC.x, sourceFloorRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceFloorRC.x, sourceFloorRC.z, d + 1) : 0.0);\n\n vec4 bottomLeft = vec4(\n getAValue(b, sourceCeilRC.x, sourceFloorRC.y, d),\n hasNextCol ? getAValue(b, sourceCeilRC.x, sourceFloorRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceCeilRC.x, sourceFloorRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceCeilRC.x, sourceFloorRC.z, d + 1) : 0.0);\n\n vec4 topRight = vec4(\n getAValue(b, sourceFloorRC.x, sourceCeilRC.y, d),\n hasNextCol ? getAValue(b, sourceFloorRC.x, sourceCeilRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceFloorRC.x, sourceCeilRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceFloorRC.x, sourceCeilRC.z, d + 1) : 0.0);\n\n vec4 bottomRight = vec4(\n getAValue(b, sourceCeilRC.x, sourceCeilRC.y, d),\n hasNextCol ? getAValue(b, sourceCeilRC.x, sourceCeilRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceCeilRC.x, sourceCeilRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceCeilRC.x, sourceCeilRC.z, d + 1) : 0.0);\n\n vec3 fracRC = sourceFracIndexRC - vec3(sourceFloorRC);\n\n vec4 top = mix(topLeft, topRight, fracRC.yyzz);\n vec4 bottom = mix(bottomLeft, bottomRight, fracRC.yyzz);\n vec4 newValue = mix(top, bottom, fracRC.x);\n\n setOutput(newValue);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_backprop_gpu.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_backprop_gpu.js ***! + \**************************************************************************************************/ +/*! exports provided: ResizeNearestNeigborBackpropProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ResizeNearestNeigborBackpropProgram",(function(){return s})); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e,t,n){this.variableNames=["dy"],this.outputShape=[],this.outputShape=t;const[,s,o]=t,[,r,i]=e,a=[n&&r>1?s-1:s,n&&i>1?o-1:o],d=[n&&r>1?r-1:r,n&&i>1?i-1:i],u=a[0]/d[0],l=a[1]/d[1],c=1/u,f=1/l,p=2*Math.ceil(c)+2,m=2*Math.ceil(f)+2;this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n int r = coords[1];\n int c = coords[2];\n\n float accumulator = 0.0;\n\n const float heightScale = float(${u});\n const float widthScale = float(${l});\n\n const float invHeightScale = float(${c});\n const float invWidthScale = float(${f});\n\n const int winHeight = int(${p});\n const int winWidth = int(${m});\n\n // Compute bounds for where in dy we will look\n float startRLerp = floor(float(r) * invHeightScale);\n int startDyR = int(floor(startRLerp - float(winHeight / 2)));\n\n float startCLerp = floor(float(c) * invWidthScale);\n int startDyC = int(floor(startCLerp - float(winWidth / 2)));\n\n // Loop over dy\n for (int dyROffset = 0; dyROffset < winHeight; dyROffset++) {\n int dyR = dyROffset + startDyR;\n\n // Guard against the window exceeding the bounds of dy\n if (dyR < 0 || dyR >= ${r}) {\n continue;\n }\n\n for (int dyCOffset = 0; dyCOffset < winWidth; dyCOffset++) {\n int dyC = dyCOffset + startDyC;\n\n // Guard against the window exceeding the bounds of dy\n if (dyC < 0 || dyC >= ${i}) {\n continue;\n }\n\n float sourceFracRow =\n float(${a[0]}) *\n (float(dyR) / float(${d[0]}));\n\n float sourceFracCol =\n float(${a[1]}) *\n (float(dyC) / float(${d[1]}));\n\n int sourceNearestRow = int(min(\n float(int(${s}) - 1),\n ${n} ? float(round(sourceFracRow)) :\n float(floor(sourceFracRow))));\n\n int sourceNearestCol = int(min(\n float(int(${o}) - 1),\n ${n} ? float(round(sourceFracCol)) :\n float(floor(sourceFracCol))));\n\n if (r == sourceNearestRow && c == sourceNearestCol) {\n accumulator += getDy(b, dyR, dyC, d);\n }\n }\n }\n // End loop over dy\n\n setOutput(accumulator);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_gpu.js": +/*!*****************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_gpu.js ***! + \*****************************************************************************************/ +/*! exports provided: ResizeNearestNeighborProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ResizeNearestNeighborProgram",(function(){return s})); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e,t,n,s,o){this.variableNames=["A"],this.outputShape=[];const[r,i,a,d]=e;this.outputShape=[r,t,n,d];const u=[s&&t>1?i-1:i,s&&n>1?a-1:a],l=[s&&t>1?t-1:t,s&&n>1?n-1:n],c=s?"0.5":"0.0";let f;f=o?"max((vec2(yRC) + vec2(0.5)) * effectiveInputOverOutputRatioRC, vec2(0.0))":"vec2(yRC) * effectiveInputOverOutputRatioRC",this.userCode=`\n const vec2 effectiveInputOverOutputRatioRC = vec2(\n ${u[0]/l[0]},\n ${u[1]/l[1]});\n const vec2 inputShapeRC = vec2(${i}.0, ${a}.0);\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n ivec2 yRC = coords.yz;\n\n // Fractional source index.\n vec2 sourceFracIndexRC = ${f};\n\n // Compute the coordinators of nearest neighbor point.\n ivec2 sourceNearestRC = ivec2(\n min(inputShapeRC - 1.0, floor(sourceFracIndexRC + ${c})));\n float newValue = getA(b, sourceNearestRC.x, sourceNearestRC.y, d);\n\n setOutput(newValue);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_packed_gpu.js": +/*!************************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_packed_gpu.js ***! + \************************************************************************************************/ +/*! exports provided: ResizeNearestNeighborPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ResizeNearestNeighborPackedProgram",(function(){return s})); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e,t,n,s,o){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=[];const[r,i,a,d]=e;this.outputShape=[r,t,n,d];const u=[s&&t>1?i-1:i,s&&n>1?a-1:a],l=[s&&t>1?t-1:t,s&&n>1?n-1:n],c=s?"0.5":"0.0";let f;f=o?"max((vec3(yRC) + vec3(0.5)) * effectiveInputOverOutputRatioRC, vec3(0.0))":"vec3(yRC) * effectiveInputOverOutputRatioRC",this.userCode=`\n const vec3 effectiveInputOverOutputRatioRC = vec3(\n ${u[0]/l[0]},\n ${u[1]/l[1]},\n ${u[1]/l[1]});\n const vec3 inputShapeRC = vec3(${i}.0, ${a}.0,\n ${a}.0);\n\n float getAValue(int b, int r, int c, int d) {\n return getChannel(getA(b, r, c, d), vec2(c, d));\n }\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n // Calculate values for next column in yRC.z.\n ivec3 yRC = coords.yzz + ivec3(0, 0, 1);\n\n // Fractional source index.\n vec3 sourceFracIndexRC = ${f};\n\n // Compute the coordinators of nearest neighbor point.\n ivec3 sourceNearestRC = ivec3(\n min(inputShapeRC - 1.0, floor(sourceFracIndexRC + ${c})));\n\n // Should we calculate next column and row elements in 2x2 packed cell.\n bool hasNextCol = d < ${d-1};\n bool hasNextRow = coords.z < ${n-1};\n\n vec4 newValue = vec4(\n getAValue(b, sourceNearestRC.x, sourceNearestRC.y, d),\n hasNextCol ? getAValue(b, sourceNearestRC.x, sourceNearestRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceNearestRC.x, sourceNearestRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceNearestRC.x, sourceNearestRC.z, d + 1) : 0.0);\n\n setOutput(newValue);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/reverse_gpu.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/reverse_gpu.js ***! + \*************************************************************************/ +/*! exports provided: ReverseProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ReverseProgram",(function(){return o}));var s=n(/*! ./shader_compiler */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */class o{constructor(e,t){this.variableNames=["x"];const n=e.length;if(n>4)throw new Error(`WebGL backend: Reverse of rank-${n} tensor is not yet supported`);if(this.outputShape=e,1===n)return void(this.userCode=`\n void main() {\n int coord = getOutputCoords();\n setOutput(getX(${e[0]} - coord - 1));\n }\n `);const o=e.map(((n,s)=>(n=>-1!==t.indexOf(n)&&1!==e[n]?`${e[n]} - coords[${n}] - 1`:`coords[${n}]`)(s))).join(","),r=Object(s.getCoordsDataType)(n);this.userCode=`\n void main() {\n ${r} coords = getOutputCoords();\n setOutput(getX(${o}));\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/reverse_packed_gpu.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/reverse_packed_gpu.js ***! + \********************************************************************************/ +/*! exports provided: ReversePackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ReversePackedProgram",(function(){return r}));var s=n(/*! ./packing_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/packing_util.js"),o=n(/*! ./shader_compiler */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class r{constructor(e,t){this.variableNames=["x"],this.packedInputs=!0,this.packedOutput=!0;const n=e.length;if(n>4)throw new Error(`WebGL backend: Reverse of rank-${n} tensor is not yet supported`);this.outputShape=e;const r=Object(s.getChannels)("rc",n),i=`${r[n-1]} + 1 < ${this.outputShape[n-1]}`,a=`${r[n-2]} + 1 < ${this.outputShape[n-2]}`,d=Object(o.getCoordsDataType)(n);function u(n){const s=e.map(((s,o)=>function(n,s){return-1!==t.indexOf(n)&&1!==e[n]?`${e[n]} - ${s[n]} - 1`:`${s[n]}`}(o,n)));return`getChannel(getX(${s.join(",")}), vec2(${s.slice(-2).join(",")}))`}this.userCode=1===n?`\n void main(){\n int rc = getOutputCoords();\n vec4 result = vec4(0.);\n result.r = getChannel(getX(${e[0]} - rc - 1),\n ${e[0]} - rc - 1);\n if(${i}){\n result.g = getChannel(getX(${e[0]} - (rc + 1) - 1),\n ${e[0]} - (rc + 1) - 1);\n }\n setOutput(result);\n }\n `:`\n void main() {\n ${d} rc = getOutputCoords();\n vec4 result = vec4(0.);\n result.r = ${function(e){return u(e)}(r.slice())};\n if(${i}){\n result.g = ${function(e){return e[n-1]="("+e[n-1]+" + 1)",u(e)}(r.slice())};\n }\n if(${a}) {\n result.b = ${function(e){return e[n-2]="("+e[n-2]+" + 1)",u(e)}(r.slice())};\n if(${i}) {\n result.a = ${function(e){return e[n-1]="("+e[n-1]+" + 1)",e[n-2]="("+e[n-2]+" + 1)",u(e)}(r.slice())};\n }\n }\n setOutput(result);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/rotate_gpu.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/rotate_gpu.js ***! + \************************************************************************/ +/*! exports provided: RotateProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"RotateProgram",(function(){return s})); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e,t){this.variableNames=["Image"],this.outputShape=[],this.customUniforms=[{name:"params",type:"vec4"}];const n=e[1],s=e[2];this.outputShape=e;let o="";o="number"==typeof t?`float outputValue = ${t.toFixed(2)};`:`\n vec3 fill = vec3(${t.join(",")});\n float outputValue = fill[coords[3]];`,this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int x = coords[2];\n int y = coords[1];\n float coordXFloat = (float(x) - params[0]) * params[3] -\n (float(y) - params[1]) * params[2];\n float coordYFloat = (float(x) - params[0]) * params[2] +\n (float(y) - params[1]) * params[3];\n int coordX = int(round(coordXFloat + params[0]));\n int coordY = int(round(coordYFloat + params[1]));\n ${o}\n if(coordX >= 0 && coordX < ${s} && coordY >= 0 && coordY < ${n}) {\n outputValue = getImage(coords[0], coordY, coordX, coords[3]);\n }\n setOutput(outputValue);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/scatter_gpu.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/scatter_gpu.js ***! + \*************************************************************************/ +/*! exports provided: ScatterProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ScatterProgram",(function(){return o}));var s=n(/*! ./shader_compiler */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */class o{constructor(e,t,n,o,r,i,a=!0){this.variableNames=["updates","indices","defaultValue"],this.outputShape=i;const d=Object(s.getCoordsDataType)(r.length),u=Object(s.getCoordsDataType)(i.length);let l="";1===n?l="i":2===n&&(l="i, j");const c=`getIndices(${l})`;let f="";1===o?f="i":2===o&&(f="i, coords[1]");const p=`getUpdates(${f})`,m=t>1?"strides[j]":"strides";this.userCode=`\n ${d} strides = ${d}(${r});\n\n void main() {\n ${u} coords = getOutputCoords();\n float sum = 0.0;\n bool found = false;\n for (int i = 0; i < ${e}; i++) {\n int flattenedIndex = 0;\n for (int j = 0; j < ${t}; j++) {\n int index = round(${c});\n flattenedIndex += index * ${m};\n }\n if (flattenedIndex == coords[0]) {\n sum += ${p};\n found = true;\n }\n }\n setOutput(mix(getDefaultValue(), sum, float(found)));\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/segment_gpu.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/segment_gpu.js ***! + \*************************************************************************/ +/*! exports provided: SegmentOpProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"SegmentOpProgram",(function(){return s})); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e,t){this.variableNames=["x","segmentIds"];const n=e.windowSize,s=e.batchSize,o=e.inSize,r=e.numSegments,i=r*Math.ceil(o/n);this.outputShape=[s,i];const a=4*Math.floor(n/4),d=n%4,u="\n sumValue += dot(values, segFilter);\n ";let l="";o%n>0&&(l=`\n if (inIdx < 0 || inIdx >= ${o}) {\n return initializationValue;\n }\n `);let c="";o%n>0&&(c=`\n if (inIdx < 0 || inIdx >= ${o}) {\n return -1.0;\n }\n `),this.userCode=`\n const float initializationValue = 0.0;\n\n float getValue(int batch, int inIdx) {\n ${l}\n return getX(batch, inIdx);\n }\n\n float getSegmentIdAtIndex(int inIdx) {\n ${c}\n return getSegmentIds(inIdx);\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = int(floor(float(outIdx) / float(\n ${r})) * float(${n}));\n int currentSeg = int(mod(float(outIdx), float(${r})));\n\n float sumValue = 0.0;\n\n for (int i = 0; i < ${a}; i += 4) {\n int inIdx = inOffset + i;\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n getValue(batch, inIdx + 3)\n );\n\n vec4 segFilter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 2)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 3)) == currentSeg ? 1 : 0\n );\n\n ${u}\n }\n\n int inIdx = inOffset + ${a};\n if (${1===d}) {\n vec4 values = vec4(\n getValue(batch, inIdx),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n int inIdxSeg = int(getSegmentIdAtIndex(inIdx));\n\n vec4 segFilter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n 0,\n 0,\n 0\n );\n\n ${u}\n } else if (${2===d}) {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n initializationValue,\n initializationValue\n );\n\n vec4 segFilter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\n 0,\n 0\n );\n\n ${u}\n } else if (${3===d}) {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n initializationValue\n );\n\n vec4 segFilter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 2)) == currentSeg ? 1 : 0,\n 0\n );\n\n ${u}\n }\n setOutput(sumValue);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/select_gpu.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/select_gpu.js ***! + \************************************************************************/ +/*! exports provided: SelectProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"SelectProgram",(function(){return o}));var s=n(/*! ./shader_compiler */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */class o{constructor(e,t,n){let o,r;if(this.variableNames=["c","a","b"],this.outputShape=t,n>4)throw Error(`Where for rank ${n} is not yet supported`);if(1===n)r="resRC",o="resRC";else{const n=["resRC.x","resRC.y","resRC.z","resRC.w"],s=[],i=[];for(let o=0;o= 1.0) {\n setOutput(getA(${r}));\n } else {\n setOutput(getB(${r}));\n }\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js ***! + \*****************************************************************************/ +/*! exports provided: makeShader, getCoordsDataType, getUniformInfoFromShape, squeezeInputInfo */function(e,t,n){"use strict";n.r(t),n.d(t,"makeShader",(function(){return a})),n.d(t,"getCoordsDataType",(function(){return j})),n.d(t,"getUniformInfoFromShape",(function(){return g})),n.d(t,"squeezeInputInfo",(function(){return w}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./glsl_version */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"),r=n(/*! ./shader_compiler_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const{getBroadcastDims:i}=s.backend_util;function a(e,t,n){const a=[];if(e.forEach((e=>{const t=s.util.sizeFromShape(e.shapeInfo.logicalShape);if(e.shapeInfo.isUniform?a.push(`uniform float ${e.name}${t>1?`[${t}]`:""};`):(a.push(`uniform sampler2D ${e.name};`),a.push(`uniform int offset${e.name};`)),n.enableShapeUniforms){const{uniformShape:t}=g(n.packedInputs,e.shapeInfo.logicalShape,e.shapeInfo.texShape);switch(t.length){case 1:a.push(`uniform int ${e.name}Shape;`);break;case 2:a.push(`uniform ivec2 ${e.name}Shape;`);break;case 3:a.push(`uniform ivec3 ${e.name}Shape;`);break;case 4:a.push(`uniform ivec4 ${e.name}Shape;`)}a.push(`uniform ivec2 ${e.name}TexShape;`)}})),n.enableShapeUniforms){switch(t.logicalShape.length){case 1:a.push("uniform int outShape;");break;case 2:a.push("uniform ivec2 outShape;"),a.push("uniform int outShapeStrides;");break;case 3:a.push("uniform ivec3 outShape;"),a.push("uniform ivec2 outShapeStrides;");break;case 4:a.push("uniform ivec4 outShape;"),a.push("uniform ivec3 outShapeStrides;")}a.push("uniform ivec2 outTexShape;")}n.customUniforms&&n.customUniforms.forEach((e=>{a.push(`uniform ${e.type} ${e.name}${e.arrayIndex?`[${e.arrayIndex}]`:""};`)}));const h=a.join("\n"),b=e.map((e=>function(e,t,n=!1,o){let r="";r+=n?u(e,o):d(e,o);const a=e.shapeInfo.logicalShape,l=t.logicalShape;a.length<=l.length&&(r+=n?function(e,t){const n=e.name,o=n.charAt(0).toUpperCase()+n.slice(1),r="get"+o+"AtOutCoords",a=e.shapeInfo.logicalShape.length,d=t.logicalShape.length,u=i(e.shapeInfo.logicalShape,t.logicalShape),l=j(d),c=d-a;let f;const p=["x","y","z","w","u","v"];f=0===a?"":d<2&&u.length>=1?"coords = 0;":u.map((e=>`coords.${p[e+c]} = 0;`)).join("\n");let m="";m=d<2&&a>0?"coords":e.shapeInfo.logicalShape.map(((e,t)=>`coords.${p[t+c]}`)).join(", ");let h="return outputValue;";const b=1===s.util.sizeFromShape(e.shapeInfo.logicalShape),g=1===s.util.sizeFromShape(t.logicalShape);if(1!==a||b||g){if(b&&!g)h=1===d?"\n return vec4(outputValue.x, outputValue.x, 0., 0.);\n ":"\n return vec4(outputValue.x);\n ";else if(u.length){const e=a-2,t=a-1;u.indexOf(e)>-1&&u.indexOf(t)>-1?h="return vec4(outputValue.x);":u.indexOf(e)>-1?h="return vec4(outputValue.x, outputValue.y, outputValue.x, outputValue.y);":u.indexOf(t)>-1&&(h="return vec4(outputValue.xx, outputValue.zz);")}}else h="\n return vec4(outputValue.xy, outputValue.xy);\n ";return`\n vec4 ${r}() {\n ${l} coords = getOutputCoords();\n ${f}\n vec4 outputValue = get${o}(${m});\n ${h}\n }\n `}(e,t):function(e,t){const n=e.name,o=n.charAt(0).toUpperCase()+n.slice(1),r="get"+o+"AtOutCoords",a=t.texShape,d=e.shapeInfo.texShape,u=e.shapeInfo.logicalShape.length,l=t.logicalShape.length;if(!e.shapeInfo.isUniform&&u===l&&null==e.shapeInfo.flatOffset&&s.util.arraysEqual(d,a))return`\n float ${r}() {\n return sampleTexture(${n}, resultUV);\n }\n `;const c=j(l),f=i(e.shapeInfo.logicalShape,t.logicalShape),p=l-u;let m;const h=["x","y","z","w","u","v"];m=0===u?"":l<2&&f.length>=1?"coords = 0;":f.map((e=>`coords.${h[e+p]} = 0;`)).join("\n");let b="";b=l<2&&u>0?"coords":e.shapeInfo.logicalShape.map(((e,t)=>`coords.${h[t+p]}`)).join(", ");return`\n float ${r}() {\n ${c} coords = getOutputCoords();\n ${m}\n return get${o}(${b});\n }\n `}(e,t));return r}(e,t,n.packedInputs,n.enableShapeUniforms))).join("\n"),w=t.texShape,_=Object(o.getGlslDifferences)(),k=function(e){return`\n float sampleTexture(sampler2D textureSampler, vec2 uv) {\n return ${e.texture2D}(textureSampler, uv).r;\n }\n `}(_);let v,x,y=function(e){return`${e.version}\n precision highp float;\n precision highp int;\n precision highp sampler2D;\n ${e.varyingFs} vec2 resultUV;\n ${e.defineOutput}\n const vec2 halfCR = vec2(0.5, 0.5);\n\n struct ivec5\n {\n int x;\n int y;\n int z;\n int w;\n int u;\n };\n\n struct ivec6\n {\n int x;\n int y;\n int z;\n int w;\n int u;\n int v;\n };\n\n uniform float NAN;\n ${e.defineSpecialNaN}\n ${e.defineSpecialInf}\n ${e.defineRound}\n\n int imod(int x, int y) {\n return x - y * (x / y);\n }\n\n int idiv(int a, int b, float sign) {\n int res = a / b;\n int mod = imod(a, b);\n if (sign < 0. && mod != 0) {\n res -= 1;\n }\n return res;\n }\n\n //Based on the work of Dave Hoskins\n //https://www.shadertoy.com/view/4djSRW\n #define HASHSCALE1 443.8975\n float random(float seed){\n vec2 p = resultUV * seed;\n vec3 p3 = fract(vec3(p.xyx) * HASHSCALE1);\n p3 += dot(p3, p3.yzx + 19.19);\n return fract((p3.x + p3.y) * p3.z);\n }\n\n ${l}\n ${c}\n ${f}\n `}(_);t.isPacked?(v=function(e,t,n){switch(e.length){case 0:return m();case 1:return function(e,t,n){const s=[Math.ceil(t[0]/2),Math.ceil(t[1]/2)];if(1===s[0])return n?"\n int getOutputCoords() {\n return 2 * int(resultUV.x * ceil(float(outTexShape[1]) / 2.0));\n }\n ":`\n int getOutputCoords() {\n return 2 * int(resultUV.x * ${s[1]}.0);\n }\n `;if(1===s[1])return n?"\n int getOutputCoords() {\n return 2 * int(resultUV.y * ceil(float(outTexShape[0]) / 2.0));\n }\n ":`\n int getOutputCoords() {\n return 2 * int(resultUV.y * ${s[0]}.0);\n }\n `;if(n)return"\n int getOutputCoords() {\n ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0));\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(packedTexShape[0], packedTexShape[1]));\n return 2 * (resTexRC.x * packedTexShape[1] + resTexRC.y);\n }\n ";return`\n int getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(${s[0]}, ${s[1]}));\n return 2 * (resTexRC.x * ${s[1]} + resTexRC.y);\n }\n `}(0,t,n);case 2:return function(e,t,n){const o=[Math.ceil(t[0]/2),Math.ceil(t[1]/2)];if(s.util.arraysEqual(e,t))return n?"\n ivec2 getOutputCoords() {\n ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0));\n return 2 * ivec2(resultUV.yx * vec2(packedTexShape[0], packedTexShape[1]));\n }\n ":`\n ivec2 getOutputCoords() {\n return 2 * ivec2(resultUV.yx * vec2(${o[0]}, ${o[1]}));\n }\n `;const r=Math.ceil(e[1]/2);if(n)return"\n ivec2 getOutputCoords() {\n ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0));\n int texelsInLogicalRow = int(ceil(float(outShape[1]) / 2.0));\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(packedTexShape[0], packedTexShape[1]));\n\n int index = resTexRC.x * packedTexShape[1] + resTexRC.y;\n int r = 2 * (index / texelsInLogicalRow);\n int c = imod(index, texelsInLogicalRow) * 2;\n\n return ivec2(r, c);\n }\n ";return`\n ivec2 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(${o[0]}, ${o[1]}));\n\n int index = resTexRC.x * ${o[1]} + resTexRC.y;\n int r = 2 * (index / ${r});\n int c = imod(index, ${r}) * 2;\n\n return ivec2(r, c);\n }\n `}(e,t,n);case 3:return function(e,t,n){if(n)return"\n ivec3 getOutputCoords() {\n ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0));\n int texelsInLogicalRow = int(ceil(float(outShape[2]) / 2.0));\n int texelsInBatch = texelsInLogicalRow * int(ceil(float(outShape[1]) / 2.0));\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(packedTexShape[0], packedTexShape[1]));\n int index = resTexRC.x * packedTexShape[1] + resTexRC.y;\n\n int b = index / texelsInBatch;\n index -= b * texelsInBatch;\n\n int r = 2 * (index / texelsInLogicalRow);\n int c = imod(index, texelsInLogicalRow) * 2;\n\n return ivec3(b, r, c);\n }\n ";const s=[Math.ceil(t[0]/2),Math.ceil(t[1]/2)],o=Math.ceil(e[2]/2),r=o*Math.ceil(e[1]/2);return`\n ivec3 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(${s[0]}, ${s[1]}));\n int index = resTexRC.x * ${s[1]} + resTexRC.y;\n\n int b = index / ${r};\n index -= b * ${r};\n\n int r = 2 * (index / ${o});\n int c = imod(index, ${o}) * 2;\n\n return ivec3(b, r, c);\n }\n `}(e,t,n);default:return function(e,t,n){if(n)return"\n ivec4 getOutputCoords() {\n ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0));\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(packedTexShape[0], packedTexShape[1]));\n int index = resTexRC.x * packedTexShape[1] + resTexRC.y;\n\n int texelsInLogicalRow = int(ceil(float(outShape[3]) / 2.0));\n int texelsInBatch = texelsInLogicalRow * int(ceil(float(outShape[2]) / 2.0));\n int texelsInBatchN = texelsInBatch * outShape[1];\n\n int b2 = index / texelsInBatchN;\n index -= b2 * texelsInBatchN;\n\n int b = index / texelsInBatch;\n index -= b * texelsInBatch;\n\n int r = 2 * (index / texelsInLogicalRow);\n int c = imod(index, texelsInLogicalRow) * 2;\n\n return ivec4(b2, b, r, c);\n }\n ";const s=[Math.ceil(t[0]/2),Math.ceil(t[1]/2)],o=Math.ceil(e[e.length-1]/2),r=o*Math.ceil(e[e.length-2]/2);let i=r,a="",d="b, r, c";for(let t=2;t1&&!s.util.arraysEqual(t,n)&&o.lengthe[t])).join(", ")}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js ***! + \**********************************************************************************/ +/*! exports provided: getLogicalCoordinatesFromFlatIndex, getLogicalCoordinatesFromFlatIndexByUniform, dotify, getFlatIndexFrom3D, ENCODE_FLOAT_SNIPPET */function(e,t,n){"use strict";n.r(t),n.d(t,"getLogicalCoordinatesFromFlatIndex",(function(){return o})),n.d(t,"getLogicalCoordinatesFromFlatIndexByUniform",(function(){return r})),n.d(t,"dotify",(function(){return a})),n.d(t,"getFlatIndexFrom3D",(function(){return d})),n.d(t,"ENCODE_FLOAT_SNIPPET",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t,n="index"){const o=s.util.computeStrides(t);return o.map(((t,s)=>`${`int ${e[s]} = ${n} / ${t}`}; ${s===o.length-1?`int ${e[s+1]} = ${n} - ${e[s]} * ${t}`:`index -= ${e[s]} * ${t}`};`)).join("")}function r(e,t,n="index"){const o=s.util.computeStrides(t);return o.map(((t,s)=>`${`int ${e[s]} = ${n} / outShapeStrides[${s}]`}; ${s===o.length-1?`int ${e[s+1]} = ${n} - ${e[s]} * outShapeStrides[${s}]`:`index -= ${e[s]} * outShapeStrides[${s}]`};`)).join("")}function i(e){return 1===e.length?`${e[0]}`:`vec${e.length}(${e.join(",")})`}function a(e,t){if(e.length!==t.length)throw new Error(`Vectors to be dotted must be of the same length -got ${e.length} and ${t.length}`);const n=[],s=Math.floor(e.length/4),o=e.length%4;for(let o=0;o`float(${e})`)),r=r.map((e=>`float(${e})`))),n.push(`${i(o)}, ${i(r)}`)}return n.map(((e,t)=>`dot(${e})`)).join("+")}function d(e){const t=s.util.computeStrides(e).map((e=>e.toString()));return`\n int getFlatIndex(ivec3 coords) {\n return coords.x * ${t[0]} + coords.y * ${t[1]} + coords.z;\n }\n`}const u="\n const float FLOAT_MAX = 1.70141184e38;\n const float FLOAT_MIN = 1.17549435e-38;\n\n lowp vec4 encode_float(highp float v) {\n if (isnan(v)) {\n return vec4(255, 255, 255, 255);\n }\n\n highp float av = abs(v);\n\n if(av < FLOAT_MIN) {\n return vec4(0.0, 0.0, 0.0, 0.0);\n } else if(v > FLOAT_MAX) {\n return vec4(0.0, 0.0, 128.0, 127.0) / 255.0;\n } else if(v < -FLOAT_MAX) {\n return vec4(0.0, 0.0, 128.0, 255.0) / 255.0;\n }\n\n highp vec4 c = vec4(0,0,0,0);\n\n highp float e = floor(log2(av));\n highp float m = exp2(fract(log2(av))) - 1.0;\n\n c[2] = floor(128.0 * m);\n m -= c[2] / 128.0;\n c[1] = floor(32768.0 * m);\n m -= c[1] / 32768.0;\n c[0] = floor(8388608.0 * m);\n\n highp float ebias = e + 127.0;\n c[3] = floor(ebias / 2.0);\n ebias -= c[3] * 2.0;\n c[2] += floor(ebias) * 128.0;\n\n c[3] += 128.0 * step(0.0, -v);\n\n return c / 255.0;\n }\n"},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/slice_gpu.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/slice_gpu.js ***! + \***********************************************************************/ +/*! exports provided: SliceProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"SliceProgram",(function(){return o}));var s=n(/*! ./shader_compiler */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */class o{constructor(e){this.variableNames=["source"],this.outputShape=e,this.rank=e.length;const t=Object(s.getCoordsDataType)(this.rank);this.customUniforms=[{name:"start",arrayIndex:this.rank,type:"int"}];const n=function(e){if(1===e)return"sourceLoc";if(e<=6)return r.slice(0,e).map((e=>"sourceLoc."+e)).join(",");throw Error(`Slicing for rank ${e} is not yet supported`)}(this.rank);let o;o=`\n ${t} sourceLoc;\n ${t} coords = getOutputCoords();\n ${e.map(((e,t)=>`sourceLoc.${r[t]} = start[${t}] + coords.${r[t]};`)).join("\n")}\n `,this.userCode=`\n void main() {\n ${o}\n setOutput(getSource(${n}));\n }\n `}}const r=["x","y","z","w","u","v"]},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/slice_packed_gpu.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/slice_packed_gpu.js ***! + \******************************************************************************/ +/*! exports provided: SlicePackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"SlicePackedProgram",(function(){return r}));var s=n(/*! ./packing_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/packing_util.js"),o=n(/*! ./shader_compiler */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class r{constructor(e){this.variableNames=["source"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=e,this.rank=e.length,this.customUniforms=[{name:"start",arrayIndex:this.rank,type:"int"}];const t=Object(o.getCoordsDataType)(this.rank),n=Object(s.getChannels)("coords",this.rank),r=Object(s.getChannels)("sourceLoc",this.rank),i=1===this.rank?"sourceLoc":`vec2(${r.slice(-2).join()})`,a=`getChannel(getSource(${r.join()}), ${i})`,d=`\n result.x = ${a};\n if (++${n[this.rank-1]} < ${e[this.rank-1]}) {\n ++${r[this.rank-1]};\n result.y = ${a};\n --${r[this.rank-1]};\n }\n `,u=1===this.rank?"":`\n --${n[this.rank-1]};\n if (++${n[this.rank-2]} < ${e[this.rank-2]}) {\n ++${r[this.rank-2]};\n result.z = ${a};\n if (++${n[this.rank-1]} < ${e[this.rank-1]}) {\n ++${r[this.rank-1]};\n result.w = ${a};\n }\n }\n `,l=this.rank<=4?`sourceLoc = coords +\n ${t}(${e.map(((e,t)=>`start[${t}]`)).join()});`:e.map(((e,t)=>`${r[t]} = ${n[t]} + start[${t}];`)).join("\n");this.userCode=`\n void main() {\n ${t} coords = getOutputCoords();\n ${t} sourceLoc;\n ${l}\n vec4 result = vec4(0.);\n ${d}\n ${u}\n setOutput(result);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/strided_slice_gpu.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/strided_slice_gpu.js ***! + \*******************************************************************************/ +/*! exports provided: StridedSliceProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"StridedSliceProgram",(function(){return o}));var s=n(/*! ./shader_compiler */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */class o{constructor(e,t,n){this.variableNames=["x"],this.outputShape=n;const o=n.length,r=Object(s.getCoordsDataType)(n.length),i=Object(s.getCoordsDataType)(n.length);let a="";if(1===o)a="coords * strides + begin";else{let e=0;a=n.map(((t,s)=>(e++,1===n.length?`coords * strides[${s}] + begin[${s}]`:`coords[${e-1}] * strides[${s}] + begin[${s}]`))).join(",")}this.userCode=`\n ${r} begin = ${r}(${e});\n ${r} strides = ${r}(${t});\n\n void main() {\n ${i} coords = getOutputCoords();\n setOutput(getX(${a}));\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/tex_util.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/tex_util.js ***! + \**********************************************************************/ +/*! exports provided: PackingScheme, TextureUsage, PhysicalTextureType, getUnpackedMatrixTextureShapeWidthHeight, getUnpackedArraySizeFromMatrixSize, getColorMatrixTextureShapeWidthHeight, getDenseTexShape, getMatrixSizeFromUnpackedArraySize, decodeMatrixFromUnpackedColorRGBAArray, getPackedMatrixTextureShapeWidthHeight, getPackedRGBAArraySizeFromMatrixShape, getTextureConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"PackingScheme",(function(){return s})),n.d(t,"TextureUsage",(function(){return o})),n.d(t,"PhysicalTextureType",(function(){return r})),n.d(t,"getUnpackedMatrixTextureShapeWidthHeight",(function(){return a})),n.d(t,"getUnpackedArraySizeFromMatrixSize",(function(){return d})),n.d(t,"getColorMatrixTextureShapeWidthHeight",(function(){return u})),n.d(t,"getDenseTexShape",(function(){return l})),n.d(t,"getMatrixSizeFromUnpackedArraySize",(function(){return c})),n.d(t,"decodeMatrixFromUnpackedColorRGBAArray",(function(){return f})),n.d(t,"getPackedMatrixTextureShapeWidthHeight",(function(){return p})),n.d(t,"getPackedRGBAArraySizeFromMatrixShape",(function(){return m})),n.d(t,"getTextureConfig",(function(){return h}));var s,o,r,i=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function a(e,t){return[t,e]}function d(e,t){return e*t}function u(e,t){return[4*t,e]}function l(e){const t=i.util.sizeFromShape(e),n=Math.ceil(t/4);return i.util.sizeToSquarishShape(n)}function c(e,t){if(e%t!=0)throw new Error(`unpackedSize (${e}) must be a multiple of ${t}`);return e/t}function f(e,t,n){const s=e.length*n/4;if(t.length= ${s}`);let o=0;for(let s=0;s0){this.numFreeTextures--,this.numUsedTextures++,this._numBytesFree-=i,this.log();const e=this.freeTextures[o].shift();return this.usedTextures[o].push(e),e}let l;return s===r.PhysicalTextureType.PACKED_2X2_FLOAT32?l=this.gpgpu.createPackedMatrixTexture(e[0],e[1]):s===r.PhysicalTextureType.PACKED_2X2_FLOAT16?l=this.gpgpu.createFloat16PackedMatrixTexture(e[0],e[1]):s===r.PhysicalTextureType.UNPACKED_FLOAT32?l=this.gpgpu.createFloat32MatrixTexture(e[0],e[1]):s===r.PhysicalTextureType.UNPACKED_FLOAT16?l=this.gpgpu.createFloat16MatrixTexture(e[0],e[1]):s===r.PhysicalTextureType.PACKED_4X1_UNSIGNED_BYTE&&(l=this.gpgpu.createUnsignedBytesMatrixTexture(e[0],e[1])),this.usedTextures[o].push(l),this.numUsedTextures++,this._numBytesAllocated+=i,this.log(),l}releaseTexture(e,t,n,o){if(null==this.freeTextures)return;const r=d(n,o),i=u(t,r,o);i in this.freeTextures||(this.freeTextures[i]=[]);const l=a(t,r,this.gpgpu.gl,this.gpgpu.textureConfig,o),c=Object(s.env)().get("WEBGL_DELETE_TEXTURE_THRESHOLD");-1!==c&&this._numBytesAllocated>c?(this.gpgpu.deleteMatrixTexture(e),this._numBytesAllocated-=l):(this.freeTextures[i].push(e),this.numFreeTextures++,this._numBytesFree+=l),this.numUsedTextures--;const f=this.usedTextures[i],p=f.indexOf(e);if(p<0)throw new Error("Cannot release a texture that was never provided by this texture manager");f.splice(p,1),this.log()}log(){if(!this.logEnabled)return;const e=this.numFreeTextures+this.numUsedTextures;console.log("Free/Used",`${this.numFreeTextures} / ${this.numUsedTextures}`,`(${e})`);const t=this._numBytesFree/this._numBytesAllocated;console.log(`Bytes allocated: ${this._numBytesAllocated}`),console.log(`Bytes unused: ${this._numBytesFree} (${Math.round(100*t)}%)`)}get numBytesAllocated(){return this._numBytesAllocated}get numBytesFree(){return this._numBytesFree}getNumUsedTextures(){return this.numUsedTextures}getNumFreeTextures(){return this.numFreeTextures}dispose(){if(null!=this.freeTextures){for(const e in this.freeTextures)this.freeTextures[e].forEach((e=>{this.gpgpu.deleteMatrixTexture(e)}));for(const e in this.usedTextures)this.usedTextures[e].forEach((e=>{this.gpgpu.deleteMatrixTexture(e)}));this.freeTextures=null,this.usedTextures=null,this.numUsedTextures=0,this.numFreeTextures=0,this._numBytesAllocated=0,this._numBytesFree=0}}}function a(e,t,n,s,i){const a=function(e,t){switch(e){case r.PhysicalTextureType.PACKED_2X2_FLOAT32:return Object(o.getInternalFormatForPackedMatrixTexture)(t);case r.PhysicalTextureType.PACKED_2X2_FLOAT16:return Object(o.getInternalFormatForFloat16PackedMatrixTexture)(t);case r.PhysicalTextureType.UNPACKED_FLOAT32:return Object(o.getInternalFormatForFloat32MatrixTexture)(t);case r.PhysicalTextureType.UNPACKED_FLOAT16:return Object(o.getInternalFormatForFloat16MatrixTexture)(t);case r.PhysicalTextureType.PACKED_4X1_UNSIGNED_BYTE:return Object(o.getInternalFormatForUnsignedBytesMatrixTexture)(t);default:throw new Error(`Unknown physical texture type ${e}`)}}(t,s);let d;if(i){const[t,n]=Object(r.getPackedMatrixTextureShapeWidthHeight)(e[0],e[1]);d=t*n}else{const[t,n]=Object(r.getUnpackedMatrixTextureShapeWidthHeight)(e[0],e[1]);d=t*n}return d*function(e,t){const n=e;if(t===n.R32F)return 4;if(t===n.R16F)return 2;if(t===n.RGBA32F)return 16;if(t===e.RGBA)return 16;if(t===n.RGBA16F)return 8;throw new Error(`Unknown internal format ${t}`)}(n,a)}function d(e,t){if(e===r.TextureUsage.UPLOAD)return r.PhysicalTextureType.PACKED_2X2_FLOAT32;if(e===r.TextureUsage.RENDER||null==e)return function(e){return Object(s.env)().getBool("WEBGL_RENDER_FLOAT32_ENABLED")?e?r.PhysicalTextureType.PACKED_2X2_FLOAT32:r.PhysicalTextureType.UNPACKED_FLOAT32:e?r.PhysicalTextureType.PACKED_2X2_FLOAT16:r.PhysicalTextureType.UNPACKED_FLOAT16}(t);if(e===r.TextureUsage.DOWNLOAD||e===r.TextureUsage.PIXELS)return r.PhysicalTextureType.PACKED_4X1_UNSIGNED_BYTE;throw new Error(`Unknown logical texture type ${e}`)}function u(e,t,n){return`${e[0]}_${e[1]}_${t}_${n}`}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/tile_gpu.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/tile_gpu.js ***! + \**********************************************************************/ +/*! exports provided: TileProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"TileProgram",(function(){return o}));var s=n(/*! ./shader_compiler */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */class o{constructor(e,t){this.variableNames=["A"];const n=new Array(e.length);for(let s=0;s5)throw Error(`Tile for rank ${t} is not yet supported`);if(1===t)return`imod(resRC, ${e[0]})`;const n=["resRC.x","resRC.y","resRC.z","resRC.w","resRC.u"],s=[];for(let t=0;t= dir;\n bool isGreater = x0 > x1 || (x0 == x1 && i1 > i0);\n if (reverse == isGreater) { // Elements in opposite order of direction\n int iTemp = i0;\n i0 = i1;\n i1 = iTemp;\n }\n if (isFirstInPair) {\n setOutput(float(i0));\n } else {\n setOutput(float(i1));\n }\n }\n "}}class o{constructor(e){this.variableNames=["x","indices"],this.customUniforms=[{name:"n",type:"int"},{name:"firstPass",type:"int"},{name:"k",type:"int"}],this.outputShape=e,this.userCode="\n void main() {\n // Takes max of indices (0, k), (1, k + 1), (2, k + 2) ...\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int elemIdx = coords[1];\n\n // The output size is half of the previous size.\n // If the previous sequence is | | | | _ _ _ _ | | | | _ _ _ _ (k=4),\n // we only need to output the indices at positions |, the indices at\n // positions _ can be thrown away, see Figure5(b) After Phase 2\n // (Merge phase) in the Bitonic Top K paper referenced above.\n // For example, the paper shows we only need to output the orange bars.\n // The output sequence should look like this | | | | | | | |.\n // Because the sequence is halved, to map the output index back\n // to the previous sequence to find the corresponding value,\n // we need to double the index. When we double the index,\n // we basically interpolate a position, so 2i looks like\n // | _ | _ | _ | _ | _ | _ | _. We move the | to the first k position\n // of each 2k positions by - elemIdx % k. E.g. for output at\n // index 4,5,6,7, we want to get the corresponding element at\n // original index 8,9,10,11, for output at index 8,9,10,11,\n // we want to get the corresponding element at original index\n // 16,17,18,19, so on and so forth.\n\n int i = elemIdx < k ? elemIdx : (elemIdx * 2 - imod(elemIdx, k));\n int i0 = firstPass == 1 ? i : int(getIndices(batch, i));\n int i1 = firstPass == 1 ? i + k : int(getIndices(batch, i + k));\n\n float x0 = getX(batch, i0);\n float x1 = i1 < n ? getX(batch, i1) : x0;\n\n setOutput(x0 >= x1 ? float(i0) : float(i1));\n }\n "}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/transform_gpu.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/transform_gpu.js ***! + \***************************************************************************/ +/*! exports provided: TransformProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"TransformProgram",(function(){return s})); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e,t,n,s,o,r){this.variableNames=["Image","Transforms"],this.outputShape=r;const i="nearest"===n?1:2;let a;switch(s){case"constant":a=1;break;case"reflect":a=2;break;case"wrap":a=3;break;case"nearest":a=4;break;default:a=1}this.userCode=`\n float mapCoord(float outCoord, float len) {\n float inCoord = outCoord;\n if(${a} == 2) {\n if (inCoord < 0.0) {\n if (len <= 1.0) {\n inCoord = 0.0;\n } else {\n float sz2 = 2.0 * len;\n if (inCoord < sz2) {\n inCoord = sz2 * float(int(float(-inCoord / sz2))) +\n inCoord;\n }\n inCoord = inCoord < -len ? inCoord + sz2 : -inCoord - 1.0;\n }\n } else if (inCoord > len - 1.0) {\n if (len <= 1.0) {\n inCoord = 0.0;\n } else {\n float sz2 = 2.0 * len;\n inCoord -= sz2 * float(int(float(inCoord / sz2)));\n if (inCoord >= len) {\n inCoord = sz2 - inCoord - 1.0;\n }\n }\n }\n return clamp(inCoord, 0.0, len - 1.0);\n } else if (${a} == 3) {\n if (inCoord < 0.0) {\n if (len <= 1.0) {\n inCoord = 0.0;\n } else {\n float sz = len - 1.0;\n inCoord += len * (float(int(float(-inCoord / sz))) + 1.0);\n }\n } else if (inCoord > len - 1.0) {\n if (len <= 1.0) {\n inCoord = 0.0;\n } else {\n float sz = len - 1.0;\n inCoord -= len * float(int(float(inCoord / sz)));\n }\n }\n return clamp(inCoord, 0.0, len - 1.0);\n } else if (${a} == 4) {\n return clamp(outCoord, 0.0, len - 1.0);\n } else {\n return outCoord;\n }\n }\n\n float readWithFillValue(int batch, int coordY, int coordX,\n int channel) {\n float outputValue;\n if (0 <= coordY && coordY < ${e} && 0 <= coordX && coordX < ${t}) {\n outputValue = getImage(batch, coordY, coordX, channel);\n } else {\n outputValue = float(${o});\n }\n return outputValue;\n }\n\n void main() {\n ivec4 coords = getOutputCoords();\n float outputValue;\n int batch = coords[0];\n int x = coords[2];\n int y = coords[1];\n int channel = coords[3];\n float xf = float(x);\n float yf = float(y);\n float a1 = getTransforms(batch, 0);\n float a2 = getTransforms(batch, 1);\n float a3 = getTransforms(batch, 2);\n float b1 = getTransforms(batch, 3);\n float b2 = getTransforms(batch, 4);\n float b3 = getTransforms(batch, 5);\n float c1 = getTransforms(batch, 6);\n float c2 = getTransforms(batch, 7);\n float projection = c1 * xf + c2 * yf + 1.0;\n if (projection == 0.0) {\n outputValue = float(${o});\n } else {\n float inX = (a1 * xf + a2 * yf + a3) / projection;\n float inY = (b1 * xf + b2 * yf + b3) / projection;\n float mapX = mapCoord(inX, float(${t}));\n float mapY = mapCoord(inY, float(${e}));\n\n if (${i} == 1) {\n int coordY = int(round(mapY));\n int coordX = int(round(mapX));\n outputValue = readWithFillValue(batch, coordY, coordX,\n channel);\n } else {\n float yFloor = floor(mapY);\n float xFloor = floor(mapX);\n float yCeil = yFloor + 1.0;\n float xCeil = xFloor + 1.0;\n float valueYFloor = (xCeil - mapX) *\n readWithFillValue(batch, int(yFloor), int(xFloor), channel) +\n (mapX - xFloor) *\n readWithFillValue(batch, int(yFloor), int(xCeil), channel);\n float valueYCeil = (xCeil - mapX) *\n readWithFillValue(batch, int(yCeil), int(xFloor), channel) +\n (mapX - xFloor) *\n readWithFillValue(batch, int(yCeil), int(xCeil), channel);\n outputValue = (yCeil - mapY) * valueYFloor +\n (mapY - yFloor) * valueYCeil;\n }\n }\n setOutput(outputValue);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/transpose_gpu.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/transpose_gpu.js ***! + \***************************************************************************/ +/*! exports provided: TransposeProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"TransposeProgram",(function(){return o}));var s=n(/*! ./shader_compiler */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */class o{constructor(e,t){this.variableNames=["A"];const n=new Array(e.length);for(let s=0;s6)throw Error(`Transpose for rank ${t} is not yet supported`);const n=["resRC.x","resRC.y","resRC.z","resRC.w","resRC.u","resRC.v"],s=new Array(t);for(let t=0;t6)throw Error(`Packed transpose for rank ${this.rank} is not yet supported.`);const r=Object(o.getCoordsDataType)(this.rank),i=Object(s.getVecChannels)("rc",this.rank),a=new Array(this.rank);for(let e=0;e 0.0 ? 1.0 : float(${e});\n `}const u="return (x >= 0.0) ? x : (exp(x) - 1.0);",l=r+"\n return (x < 0.0) ? 0.0 : x;\n",c=r+"\n return (x < 0.0) ? 0.0 : min(6.0, x);\n",f="return x;",p="return 1.0 / (1.0 + exp(-1.0 * x));"},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_packed_gpu.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_packed_gpu.js ***! + \********************************************************************************/ +/*! exports provided: LINEAR, ELU, RELU, RELU6, SIGMOID, UnaryOpPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"LINEAR",(function(){return o})),n.d(t,"ELU",(function(){return r})),n.d(t,"RELU",(function(){return i})),n.d(t,"RELU6",(function(){return a})),n.d(t,"SIGMOID",(function(){return d})),n.d(t,"UnaryOpPackedProgram",(function(){return u}));var s=n(/*! ./gpgpu_math */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/gpgpu_math.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */const o="return x;",r="\n vec4 result;\n\n result.r = (x.r >= 0.0) ? x.r : (exp(x.r) - 1.0);\n result.g = (x.g >= 0.0) ? x.g : (exp(x.g) - 1.0);\n result.b = (x.b >= 0.0) ? x.b : (exp(x.b) - 1.0);\n result.a = (x.a >= 0.0) ? x.a : (exp(x.a) - 1.0);\n\n return result;\n",i="\n vec4 result = x * vec4(greaterThanEqual(x, vec4(0.0)));\n bvec4 isNaN = isnan(x);\n\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n",a="\n vec4 result = min(x, vec4(6.)) * vec4(greaterThanEqual(x, vec4(0.0)));\n bvec4 isNaN = isnan(x);\n\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n",d="return 1.0 / (1.0 + exp(-1.0 * x));";class u{constructor(e,t){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=e,this.enableShapeUniforms=Object(s.useShapeUniforms)(this.outputShape.length),this.userCode=`\n vec4 unaryOperation(vec4 x) {\n ${t}\n }\n\n void main() {\n vec4 x = getAAtOutCoords();\n vec4 y = unaryOperation(x);\n\n setOutput(y);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/unpack_gpu.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/unpack_gpu.js ***! + \************************************************************************/ +/*! exports provided: UnpackProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"UnpackProgram",(function(){return r}));var s=n(/*! ./packing_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/packing_util.js"),o=n(/*! ./shader_compiler */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class r{constructor(e){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!1,this.outputShape=e;const t=e.length,n=Object(s.getChannels)("rc",t),r=Object(o.getCoordsDataType)(t),i=Object(s.getSourceCoords)(t,n),a=n.slice(-2),d=t<=1?"rc":`vec2(${a.join(",")})`;this.userCode=`\n void main() {\n ${r} rc = getOutputCoords();\n vec4 packedInput = getA(${i});\n\n setOutput(getChannel(packedInput, ${d}));\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/version.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/version.js ***! + \*********************************************************************/ +/*! exports provided: version */function(e,t,n){"use strict";n.r(t),n.d(t,"version",(function(){return s})); +/** @license See the LICENSE file. */ +const s="3.8.0"},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl.js ***! + \*******************************************************************/ +/*! exports provided: MathBackendWebGL, setWebGLContext, GPGPUContext, gpgpu_util, webgl_util, forceHalfFloat */function(e,t,n){"use strict";n.r(t),n.d(t,"forceHalfFloat",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./gpgpu_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/gpgpu_util.js");n.d(t,"gpgpu_util",(function(){return o}));var r=n(/*! ./webgl_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js");n.d(t,"webgl_util",(function(){return r}));var i=n(/*! ./backend_webgl */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/backend_webgl.js");n.d(t,"MathBackendWebGL",(function(){return i.MathBackendWebGL}));var a=n(/*! ./canvas_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/canvas_util.js");n.d(t,"setWebGLContext",(function(){return a.setWebGLContext}));var d=n(/*! ./gpgpu_context */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/gpgpu_context.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function u(){Object(s.env)().set("WEBGL_FORCE_F16_TEXTURES",!0)}n.d(t,"GPGPUContext",(function(){return d.GPGPUContext}))},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js ***! + \************************************************************************/ +/*! exports provided: callAndCheck, canBeRepresented, getWebGLErrorMessage, getExtensionOrThrow, createVertexShader, createFragmentShader, createProgram, linkProgram, validateProgram, createStaticVertexBuffer, createStaticIndexBuffer, getNumChannels, createTexture, validateTextureSize, createFramebuffer, bindVertexBufferToProgramAttribute, bindTextureUnit, unbindTextureUnit, getProgramUniformLocationOrThrow, getProgramUniformLocation, bindTextureToProgramUniformSampler, bindCanvasToFramebuffer, bindColorTextureToFramebuffer, unbindColorTextureFromFramebuffer, validateFramebuffer, getFramebufferErrorMessage, getBatchDim, getRowsCols, getShapeAs3D, getTextureShapeFromLogicalShape, isReshapeFree, getWebGLMaxTextureSize, resetMaxTextureSize, resetMaxTexturesInShader, getMaxTexturesInShader, getWebGLDisjointQueryTimerVersion, hasExtension, isWebGLVersionEnabled, isCapableOfRenderingToFloatTexture, isDownloadFloatTextureEnabled, isWebGLFenceEnabled, assertNotComplex */function(e,t,n){"use strict";n.r(t),n.d(t,"callAndCheck",(function(){return i})),n.d(t,"canBeRepresented",(function(){return a})),n.d(t,"getWebGLErrorMessage",(function(){return d})),n.d(t,"getExtensionOrThrow",(function(){return u})),n.d(t,"createVertexShader",(function(){return l})),n.d(t,"createFragmentShader",(function(){return c})),n.d(t,"createProgram",(function(){return p})),n.d(t,"linkProgram",(function(){return m})),n.d(t,"validateProgram",(function(){return h})),n.d(t,"createStaticVertexBuffer",(function(){return b})),n.d(t,"createStaticIndexBuffer",(function(){return j})),n.d(t,"getNumChannels",(function(){return g})),n.d(t,"createTexture",(function(){return w})),n.d(t,"validateTextureSize",(function(){return _})),n.d(t,"createFramebuffer",(function(){return k})),n.d(t,"bindVertexBufferToProgramAttribute",(function(){return v})),n.d(t,"bindTextureUnit",(function(){return x})),n.d(t,"unbindTextureUnit",(function(){return y})),n.d(t,"getProgramUniformLocationOrThrow",(function(){return O})),n.d(t,"getProgramUniformLocation",(function(){return I})),n.d(t,"bindTextureToProgramUniformSampler",(function(){return C})),n.d(t,"bindCanvasToFramebuffer",(function(){return S})),n.d(t,"bindColorTextureToFramebuffer",(function(){return T})),n.d(t,"unbindColorTextureFromFramebuffer",(function(){return N})),n.d(t,"validateFramebuffer",(function(){return E})),n.d(t,"getFramebufferErrorMessage",(function(){return A})),n.d(t,"getBatchDim",(function(){return $})),n.d(t,"getRowsCols",(function(){return M})),n.d(t,"getShapeAs3D",(function(){return D})),n.d(t,"getTextureShapeFromLogicalShape",(function(){return P})),n.d(t,"isReshapeFree",(function(){return L})),n.d(t,"getWebGLMaxTextureSize",(function(){return W})),n.d(t,"resetMaxTextureSize",(function(){return U})),n.d(t,"resetMaxTexturesInShader",(function(){return V})),n.d(t,"getMaxTexturesInShader",(function(){return q})),n.d(t,"getWebGLDisjointQueryTimerVersion",(function(){return H})),n.d(t,"hasExtension",(function(){return K})),n.d(t,"isWebGLVersionEnabled",(function(){return X})),n.d(t,"isCapableOfRenderingToFloatTexture",(function(){return Y})),n.d(t,"isDownloadFloatTextureEnabled",(function(){return Z})),n.d(t,"isWebGLFenceEnabled",(function(){return J})),n.d(t,"assertNotComplex",(function(){return ee}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./canvas_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/canvas_util.js"),r=n(/*! ./tex_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/tex_util.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e,t){const n=t();return Object(s.env)().getBool("DEBUG")&&function(e){const t=e.getError();if(t!==e.NO_ERROR)throw new Error("WebGL Error: "+d(e,t))}(e),n}function a(e){return!!(Object(s.env)().getBool("WEBGL_RENDER_FLOAT32_ENABLED")||0===e||5.96e-8e.getExtension(t)),'Extension "'+t+'" not supported on this browser.')}function l(e,t){const n=R(e,(()=>e.createShader(e.VERTEX_SHADER)),"Unable to create vertex WebGLShader.");if(i(e,(()=>e.shaderSource(n,t))),i(e,(()=>e.compileShader(n))),!1===e.getShaderParameter(n,e.COMPILE_STATUS))throw console.log(e.getShaderInfoLog(n)),new Error("Failed to compile vertex shader.");return n}function c(e,t){const n=R(e,(()=>e.createShader(e.FRAGMENT_SHADER)),"Unable to create fragment WebGLShader.");if(i(e,(()=>e.shaderSource(n,t))),i(e,(()=>e.compileShader(n))),!1===e.getShaderParameter(n,e.COMPILE_STATUS))throw function(e,t){const n=f.exec(t);if(null==n)return console.log(`Couldn't parse line number in error: ${t}`),void console.log(e);const o=+n[1],r=e.split("\n"),i=r.length.toString().length+2,a=r.map(((e,t)=>s.util.rightPad((t+1).toString(),i)+e));let d=0;for(let e=0;ee.createProgram()),"Unable to create WebGLProgram.")}function m(e,t){if(i(e,(()=>e.linkProgram(t))),!1===e.getProgramParameter(t,e.LINK_STATUS))throw console.log(e.getProgramInfoLog(t)),new Error("Failed to link vertex and fragment shaders.")}function h(e,t){if(i(e,(()=>e.validateProgram(t))),!1===e.getProgramParameter(t,e.VALIDATE_STATUS))throw console.log(e.getProgramInfoLog(t)),new Error("Shader program validation failed.")}function b(e,t){const n=R(e,(()=>e.createBuffer()),"Unable to create WebGLBuffer");return i(e,(()=>e.bindBuffer(e.ARRAY_BUFFER,n))),i(e,(()=>e.bufferData(e.ARRAY_BUFFER,t,e.STATIC_DRAW))),n}function j(e,t){const n=R(e,(()=>e.createBuffer()),"Unable to create WebGLBuffer");return i(e,(()=>e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,n))),i(e,(()=>e.bufferData(e.ELEMENT_ARRAY_BUFFER,t,e.STATIC_DRAW))),n}function g(){return 2===Object(s.env)().getNumber("WEBGL_VERSION")?1:4}function w(e){return R(e,(()=>e.createTexture()),"Unable to create WebGLTexture.")}function _(e,t){const n=Object(s.env)().getNumber("WEBGL_MAX_TEXTURE_SIZE");if(e<=0||t<=0){throw new Error("Requested texture size "+`[${e}x${t}]`+" is invalid.")}if(e>n||t>n){throw new Error("Requested texture size "+`[${e}x${t}]`+" greater than WebGL maximum on this browser / GPU "+`[${n}x${n}]`+".")}}function k(e){return R(e,(()=>e.createFramebuffer()),"Unable to create WebGLFramebuffer.")}function v(e,t,n,s,o,r,a){const d=e.getAttribLocation(t,n);return-1!==d&&(i(e,(()=>e.bindBuffer(e.ARRAY_BUFFER,s))),i(e,(()=>e.vertexAttribPointer(d,o,e.FLOAT,!1,r,a))),i(e,(()=>e.enableVertexAttribArray(d))),!0)}function x(e,t,n){F(e,n),i(e,(()=>e.activeTexture(e.TEXTURE0+n))),i(e,(()=>e.bindTexture(e.TEXTURE_2D,t)))}function y(e,t){F(e,t),i(e,(()=>e.activeTexture(e.TEXTURE0+t))),i(e,(()=>e.bindTexture(e.TEXTURE_2D,null)))}function O(e,t,n){return R(e,(()=>e.getUniformLocation(t,n)),'uniform "'+n+'" not present in program.')}function I(e,t,n){return e.getUniformLocation(t,n)}function C(e,t,n,s){i(e,(()=>x(e,t,s))),i(e,(()=>e.uniform1i(n,s)))}function S(e){i(e,(()=>e.bindFramebuffer(e.FRAMEBUFFER,null))),i(e,(()=>e.viewport(0,0,e.canvas.width,e.canvas.height))),i(e,(()=>e.scissor(0,0,e.canvas.width,e.canvas.height)))}function T(e,t,n){i(e,(()=>e.bindFramebuffer(e.FRAMEBUFFER,n))),i(e,(()=>e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,t,0)))}function N(e,t){i(e,(()=>e.bindFramebuffer(e.FRAMEBUFFER,t))),i(e,(()=>e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,null,0)))}function E(e){const t=e.checkFramebufferStatus(e.FRAMEBUFFER);if(t!==e.FRAMEBUFFER_COMPLETE)throw new Error("Error binding framebuffer: "+A(e,t))}function A(e,t){switch(t){case e.FRAMEBUFFER_INCOMPLETE_ATTACHMENT:return"FRAMEBUFFER_INCOMPLETE_ATTACHMENT";case e.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:return"FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT";case e.FRAMEBUFFER_INCOMPLETE_DIMENSIONS:return"FRAMEBUFFER_INCOMPLETE_DIMENSIONS";case e.FRAMEBUFFER_UNSUPPORTED:return"FRAMEBUFFER_UNSUPPORTED";default:return`unknown error ${t}`}}function R(e,t,n){const s=i(e,(()=>t()));if(null==s)throw new Error(n);return s}function F(e,t){const n=e.MAX_COMBINED_TEXTURE_IMAGE_UNITS-1,s=t+e.TEXTURE0;if(sn){throw new Error(`textureUnit must be in ${`[gl.TEXTURE0, gl.TEXTURE${n}]`}.`)}}function $(e,t=2){return s.util.sizeFromShape(e.slice(0,e.length-t))}function M(e){if(0===e.length)throw Error("Cannot get rows and columns of an empty shape array.");return[e.length>1?e[e.length-2]:1,e[e.length-1]]}function D(e){let t=[1,1,1];return 0===e.length||1===e.length&&1===e[0]||(t=[$(e),...M(e)]),t}function P(e,t=!1){let n=Object(s.env)().getNumber("WEBGL_MAX_TEXTURE_SIZE");if(t&&(n*=2,1===(e=e.map(((t,n)=>n>=e.length-2?s.util.nearestLargerEven(e[n]):e[n]))).length&&(e=[2,e[0]])),2!==e.length){const t=s.util.squeezeShape(e);e=t.newShape}let o=s.util.sizeFromShape(e);if(e.length<=1&&o<=n)return[1,o];if(2===e.length&&e[0]<=n&&e[1]<=n)return e;if(3===e.length&&e[0]*e[1]<=n&&e[2]<=n)return[e[0]*e[1],e[2]];if(3===e.length&&e[0]<=n&&e[1]*e[2]<=n)return[e[0],e[1]*e[2]];if(4===e.length&&e[0]*e[1]*e[2]<=n&&e[3]<=n)return[e[0]*e[1]*e[2],e[3]];if(4===e.length&&e[0]<=n&&e[1]*e[2]*e[3]<=n)return[e[0],e[1]*e[2]*e[3]];if(t){const t=$(e);let n=2,r=2;return e.length&&([n,r]=M(e)),o=t*(n/2)*(r/2),s.util.sizeToSquarishShape(o).map((e=>2*e))}return s.util.sizeToSquarishShape(o)}function B(e){return e%2==0}function L(e,t){if(e=e.slice(-2),t=t.slice(-2),s.util.arraysEqual(e,t))return!0;if(!e.length||!t.length)return!0;if(0===e[0]||0===e[1]||0===t[0]||0===t[1])return!0;if(e.length!==t.length){const n=e.slice(-1)[0],s=t.slice(-1)[0];if(n===s)return!0;if(B(n)&&B(s)&&(1===e[0]||1===t[0]))return!0}return e[1]===t[1]&&B(e[0])&&B(t[0])}let z,G;function W(e){if(null==z){const t=Object(o.getWebGLContext)(e);z=t.getParameter(t.MAX_TEXTURE_SIZE)}return z}function U(){z=null}function V(){G=null}function q(e){if(null==G){const t=Object(o.getWebGLContext)(e);G=t.getParameter(t.MAX_TEXTURE_IMAGE_UNITS)}return Math.min(16,G)}function H(e){if(0===e)return 0;let t;const n=Object(o.getWebGLContext)(e);return t=K(n,"EXT_disjoint_timer_query_webgl2")&&2===e?2:K(n,"EXT_disjoint_timer_query")?1:0,t}function K(e,t){return null!=e.getExtension(t)}function X(e){try{if(null!=Object(o.getWebGLContext)(e))return!0}catch(e){return console.log("Error when getting WebGL context: ",e),!1}return!1}function Y(e){if(0===e)return!1;const t=Object(o.getWebGLContext)(e);if(1===e){if(!K(t,"OES_texture_float"))return!1}else if(!K(t,"EXT_color_buffer_float"))return!1;return Q(t)}function Z(e){if(0===e)return!1;const t=Object(o.getWebGLContext)(e);if(1!==e){if(K(t,"EXT_color_buffer_float"))return Q(t);const e="EXT_color_buffer_half_float";if(K(t,e)){const n=t.getExtension(e);return function(e,t){const n=Object(r.getTextureConfig)(e,t),s=e.createTexture();e.bindTexture(e.TEXTURE_2D,s);const o=1,i=1;e.texImage2D(e.TEXTURE_2D,0,n.internalFormatHalfFloat,o,i,0,n.textureFormatFloat,n.textureTypeHalfFloat,null);const a=e.createFramebuffer();e.bindFramebuffer(e.FRAMEBUFFER,a),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,s,0);const d=e.checkFramebufferStatus(e.FRAMEBUFFER)===e.FRAMEBUFFER_COMPLETE;return e.bindTexture(e.TEXTURE_2D,null),e.bindFramebuffer(e.FRAMEBUFFER,null),e.deleteTexture(s),e.deleteFramebuffer(a),d}(t,n)}return!1}if(!K(t,"OES_texture_float"))return!1;if(!K(t,"WEBGL_color_buffer_float"))return!1;return Q(t)}function Q(e){const t=Object(r.getTextureConfig)(e),n=e.createTexture();e.bindTexture(e.TEXTURE_2D,n);e.texImage2D(e.TEXTURE_2D,0,t.internalFormatFloat,1,1,0,t.textureFormatFloat,t.textureTypeFloat,null);const s=e.createFramebuffer();e.bindFramebuffer(e.FRAMEBUFFER,s),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,n,0);const o=e.checkFramebufferStatus(e.FRAMEBUFFER)===e.FRAMEBUFFER_COMPLETE;return e.bindTexture(e.TEXTURE_2D,null),e.bindFramebuffer(e.FRAMEBUFFER,null),e.deleteTexture(n),e.deleteFramebuffer(s),o}function J(e){if(2!==e)return!1;return null!=Object(o.getWebGLContext)(e).fenceSync}function ee(e,t){Array.isArray(e)||(e=[e]),e.forEach((e=>{null!=e&&s.util.assert("complex64"!==e.dtype,(()=>`${t} does not support complex64 tensors in the WebGL backend.`))}))}},"./node_modules/@tensorflow/tfjs-core/dist/backends/backend.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/backends/backend.js ***! + \*********************************************************************/ +/*! exports provided: EPSILON_FLOAT32, EPSILON_FLOAT16, DataStorage, KernelBackend */function(e,t,n){"use strict";n.r(t),n.d(t,"EPSILON_FLOAT32",(function(){return s})),n.d(t,"EPSILON_FLOAT16",(function(){return o})),n.d(t,"DataStorage",(function(){return r})),n.d(t,"KernelBackend",(function(){return i})); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const s=1e-7,o=1e-4;class r{constructor(e,t){this.backend=e,this.dataMover=t,this.data=new WeakMap,this.dataIdsCount=0}get(e){return this.data.has(e)||this.dataMover.moveData(this.backend,e),this.data.get(e)}set(e,t){this.dataIdsCount++,this.data.set(e,t)}has(e){return this.data.has(e)}delete(e){return this.dataIdsCount--,this.data.delete(e)}numDataIds(){return this.dataIdsCount}}class i{refCount(e){return a("refCount")}incRef(e){return a("incRef")}timerAvailable(){return!0}time(e){return a("time")}read(e){return a("read")}readSync(e){return a("readSync")}numDataIds(){return a("numDataIds")}disposeData(e,t){return a("disposeData")}write(e,t,n){return a("write")}move(e,t,n,s,o){return a("move")}memory(){return a("memory")}floatPrecision(){return a("floatPrecision")}epsilon(){return 32===this.floatPrecision()?s:o}dispose(){return a("dispose")}}function a(e){throw new Error(`'${e}' not yet implemented or not found in the registry. This kernel may not be supported by the tfjs backend you have chosen`)}},"./node_modules/@tensorflow/tfjs-core/dist/backends/backend_util.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/backends/backend_util.js ***! + \**************************************************************************/ +/*! exports provided: axesAreInnerMostDims, combineLocations, computeOutAndReduceShapes, expandShapeToKeepDim, assertAxesAreInnerMostDims, getAxesPermutation, getUndoAxesPermutation, getInnerMostAxes, getBroadcastDims, getReductionAxes, assertAndGetBroadcastShape, assertParamsConsistent, computeOutShape, computeDilation2DInfo, computePool2DInfo, computePool3DInfo, computeConv2DInfo, computeConv3DInfo, computeDefaultPad, tupleValuesAreOne, eitherStridesOrDilationsAreOne, convertConv2DDataFormat, getFusedDyActivation, getFusedBiasGradient, applyActivation, shouldFuse, PARALLELIZE_THRESHOLD, computeOptimalWindowSize, slice_util, upcastType, getImageCenter, getReshaped, getPermuted, getReshapedPermuted, getSliceBeginCoords, getSliceSize, prepareAndValidate, validateUpdateShape, validateInput, calculateShapes, SELU_SCALEALPHA, SELU_SCALE, ERF_P, ERF_A1, ERF_A2, ERF_A3, ERF_A4, ERF_A5, warn, log, mergeRealAndImagArrays, splitRealAndImagArrays, complexWithEvenIndex, complexWithOddIndex, getComplexWithIndex, assignToTypedArray, exponents, exponent, decodeEinsumEquation, getEinsumPermutation, checkEinsumDimSizes, getEinsumComputePath, isIdentityPermutation, prepareSplitSize, segment_util, fromUint8ToStringArray, fromStringArrayToUint8 */function(e,t,n){"use strict";n.r(t),n.d(t,"fromUint8ToStringArray",(function(){return x})),n.d(t,"fromStringArrayToUint8",(function(){return y}));var s=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),o=n(/*! ../ops/axis_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/axis_util.js");n.d(t,"axesAreInnerMostDims",(function(){return o.axesAreInnerMostDims})),n.d(t,"combineLocations",(function(){return o.combineLocations})),n.d(t,"computeOutAndReduceShapes",(function(){return o.computeOutAndReduceShapes})),n.d(t,"expandShapeToKeepDim",(function(){return o.expandShapeToKeepDim})),n.d(t,"assertAxesAreInnerMostDims",(function(){return o.assertAxesAreInnerMostDims})),n.d(t,"getAxesPermutation",(function(){return o.getAxesPermutation})),n.d(t,"getUndoAxesPermutation",(function(){return o.getUndoAxesPermutation})),n.d(t,"getInnerMostAxes",(function(){return o.getInnerMostAxes}));var r=n(/*! ../ops/broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js");n.d(t,"getBroadcastDims",(function(){return r.getBroadcastDims})),n.d(t,"getReductionAxes",(function(){return r.getReductionAxes})),n.d(t,"assertAndGetBroadcastShape",(function(){return r.assertAndGetBroadcastShape}));var i=n(/*! ../ops/concat_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/concat_util.js");n.d(t,"assertParamsConsistent",(function(){return i.assertParamsConsistent})),n.d(t,"computeOutShape",(function(){return i.computeOutShape}));var a=n(/*! ../ops/conv_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js");n.d(t,"computeDilation2DInfo",(function(){return a.computeDilation2DInfo})),n.d(t,"computePool2DInfo",(function(){return a.computePool2DInfo})),n.d(t,"computePool3DInfo",(function(){return a.computePool3DInfo})),n.d(t,"computeConv2DInfo",(function(){return a.computeConv2DInfo})),n.d(t,"computeConv3DInfo",(function(){return a.computeConv3DInfo})),n.d(t,"computeDefaultPad",(function(){return a.computeDefaultPad})),n.d(t,"tupleValuesAreOne",(function(){return a.tupleValuesAreOne})),n.d(t,"eitherStridesOrDilationsAreOne",(function(){return a.eitherStridesOrDilationsAreOne})),n.d(t,"convertConv2DDataFormat",(function(){return a.convertConv2DDataFormat}));var d=n(/*! ../ops/fused_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/fused_util.js");n.d(t,"getFusedDyActivation",(function(){return d.getFusedDyActivation})),n.d(t,"getFusedBiasGradient",(function(){return d.getFusedBiasGradient})),n.d(t,"applyActivation",(function(){return d.applyActivation})),n.d(t,"shouldFuse",(function(){return d.shouldFuse}));var u=n(/*! ../ops/reduce_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/reduce_util.js");n.d(t,"PARALLELIZE_THRESHOLD",(function(){return u.PARALLELIZE_THRESHOLD})),n.d(t,"computeOptimalWindowSize",(function(){return u.computeOptimalWindowSize}));var l=n(/*! ../ops/slice_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice_util.js");n.d(t,"slice_util",(function(){return l}));var c=n(/*! ../types */"./node_modules/@tensorflow/tfjs-core/dist/types.js");n.d(t,"upcastType",(function(){return c.upcastType}));var f=n(/*! ../ops/rotate_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/rotate_util.js");n.d(t,"getImageCenter",(function(){return f.getImageCenter}));var p=n(/*! ../ops/array_ops_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/array_ops_util.js");n.d(t,"getReshaped",(function(){return p.getReshaped})),n.d(t,"getPermuted",(function(){return p.getPermuted})),n.d(t,"getReshapedPermuted",(function(){return p.getReshapedPermuted})),n.d(t,"getSliceBeginCoords",(function(){return p.getSliceBeginCoords})),n.d(t,"getSliceSize",(function(){return p.getSliceSize}));var m=n(/*! ../ops/gather_nd_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/gather_nd_util.js");n.d(t,"prepareAndValidate",(function(){return m.prepareAndValidate}));var h=n(/*! ../ops/scatter_nd_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/scatter_nd_util.js");n.d(t,"validateUpdateShape",(function(){return h.validateUpdateShape})),n.d(t,"validateInput",(function(){return h.validateInput})),n.d(t,"calculateShapes",(function(){return h.calculateShapes}));var b=n(/*! ../ops/selu_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/selu_util.js");n.d(t,"SELU_SCALEALPHA",(function(){return b.SELU_SCALEALPHA})),n.d(t,"SELU_SCALE",(function(){return b.SELU_SCALE}));var j=n(/*! ../ops/erf_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/erf_util.js");n.d(t,"ERF_P",(function(){return j.ERF_P})),n.d(t,"ERF_A1",(function(){return j.ERF_A1})),n.d(t,"ERF_A2",(function(){return j.ERF_A2})),n.d(t,"ERF_A3",(function(){return j.ERF_A3})),n.d(t,"ERF_A4",(function(){return j.ERF_A4})),n.d(t,"ERF_A5",(function(){return j.ERF_A5}));var g=n(/*! ../log */"./node_modules/@tensorflow/tfjs-core/dist/log.js");n.d(t,"warn",(function(){return g.warn})),n.d(t,"log",(function(){return g.log}));var w=n(/*! ../backends/complex_util */"./node_modules/@tensorflow/tfjs-core/dist/backends/complex_util.js");n.d(t,"mergeRealAndImagArrays",(function(){return w.mergeRealAndImagArrays})),n.d(t,"splitRealAndImagArrays",(function(){return w.splitRealAndImagArrays})),n.d(t,"complexWithEvenIndex",(function(){return w.complexWithEvenIndex})),n.d(t,"complexWithOddIndex",(function(){return w.complexWithOddIndex})),n.d(t,"getComplexWithIndex",(function(){return w.getComplexWithIndex})),n.d(t,"assignToTypedArray",(function(){return w.assignToTypedArray})),n.d(t,"exponents",(function(){return w.exponents})),n.d(t,"exponent",(function(){return w.exponent}));var _=n(/*! ../backends/einsum_util */"./node_modules/@tensorflow/tfjs-core/dist/backends/einsum_util.js");n.d(t,"decodeEinsumEquation",(function(){return _.decodeEinsumEquation})),n.d(t,"getEinsumPermutation",(function(){return _.getEinsumPermutation})),n.d(t,"checkEinsumDimSizes",(function(){return _.checkEinsumDimSizes})),n.d(t,"getEinsumComputePath",(function(){return _.getEinsumComputePath})),n.d(t,"isIdentityPermutation",(function(){return _.isIdentityPermutation}));var k=n(/*! ../ops/split_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/split_util.js");n.d(t,"prepareSplitSize",(function(){return k.prepareSplitSize}));var v=n(/*! ../ops/segment_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/segment_util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function x(e){try{return e.map((e=>Object(s.decodeString)(e)))}catch(e){throw new Error(`Failed to decode encoded string bytes into utf-8, error: ${e}`)}}function y(e){return e.map((e=>Object(s.encodeString)(e)))}n.d(t,"segment_util",(function(){return v}))},"./node_modules/@tensorflow/tfjs-core/dist/backends/complex_util.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/backends/complex_util.js ***! + \**************************************************************************/ +/*! exports provided: mergeRealAndImagArrays, splitRealAndImagArrays, complexWithEvenIndex, complexWithOddIndex, getComplexWithIndex, assignToTypedArray, exponents, exponent */function(e,t,n){"use strict"; +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function s(e,t){if(e.length!==t.length)throw new Error(`Cannot merge real and imag arrays of different lengths. real:${e.length}, imag: ${t.length}.`);const n=new Float32Array(2*e.length);for(let s=0;s/g;function i(e,t){const n=((e=e.replace(/\s/g,"")).length-e.replace(r,"").length)/o.length;if(n<1)throw new Error("Equations without an arrow are not supported.");if(n>1)throw new Error('Equation must contain exactly one arrow ("->").');const[i,a]=e.split(o);Object(s.assert)(-1===i.indexOf("..."),(()=>'The ellipsis notation ("...") is not supported yet.'));const d=i.split(","),u=d.length;if(t!==u)throw new Error(`Expected ${u} input tensors, received ${t}`);if(u>2)throw new Error("Support for more than 2 input tensors is not implemented yet.");const l=[];for(let e=0;e-1!==e.indexOf(t))))throw new Error(`Output subscripts contain the label ${t} not present in the input subscripts.`);-1===l.indexOf(t)&&l.push(t)}for(let e=0;e-1!==e)),{permutationIndices:n,expandDims:s}}function d(e,t,n){const o=new Array(e);for(let e=0;e`Expected dimension ${o[t[e][n]]} at axis ${n} of input shaped ${JSON.stringify(r)}, but got dimension ${r[n]}`))}}function u(e,t){const n=e,s=[];let o=0;0===e.length&&n.push(-1),o=e.length+1;for(let e=0;ee===t))}function c(e,t){const n=[];for(let s=0;sr&&p.push({score:t[e],boxIndex:e,suppressBeginIndex:0});p.sort(l);const m=i>0?-.5/i:0,h=[],b=[];for(;h.length0;){const t=p.pop(),{score:n,boxIndex:i,suppressBeginIndex:a}=t;if(n=a;--n){const s=d(e,i,h[n]);if(s>=o){c=!0;break}if(t.score=t.score*u(o,m,s),t.score<=r)break}t.suppressBeginIndex=h.length,c||(t.score===n?(h.push(i),b.push(t.score)):t.score>r&&Object(s.binaryInsert)(p,t,l))}const j=h.length,g=n-j;c&&g>0&&(h.push(...new Array(g).fill(0)),b.push(...new Array(g).fill(0)));const w={selectedIndices:h};return a&&(w.selectedScores=b),f&&(w.validOutputs=j),w}function d(e,t,n){const s=e.subarray(4*t,4*t+4),o=e.subarray(4*n,4*n+4),r=Math.min(s[0],s[2]),i=Math.min(s[1],s[3]),a=Math.max(s[0],s[2]),d=Math.max(s[1],s[3]),u=Math.min(o[0],o[2]),l=Math.min(o[1],o[3]),c=Math.max(o[0],o[2]),f=Math.max(o[1],o[3]),p=(a-r)*(d-i),m=(c-u)*(f-l);if(p<=0||m<=0)return 0;const h=Math.max(r,u),b=Math.max(i,l),j=Math.min(a,c),g=Math.min(d,f),w=Math.max(j-h,0)*Math.max(g-b,0);return w/(p+m-w)}function u(e,t,n){const s=Math.exp(t*n*n);return n<=e?s:0}function l(e,t){return e.score-t.score||e.score===t.score&&t.boxIndex-e.boxIndex}},"./node_modules/@tensorflow/tfjs-core/dist/backends/non_max_suppression_util.js": +/*!**************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/backends/non_max_suppression_util.js ***! + \**************************************************************************************/ +/*! exports provided: binaryInsert, binarySearch */function(e,t,n){"use strict"; +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function s(e,t,n){const s=o(e,t,n),r=s<0?-(s+1):s;e.splice(r,0,t)}function o(e,t,n){return function(e,t,n){let s=0,o=e.length,r=0,i=!1;for(;s>>1);const a=n(t,e[r]);a>0?s=r+1:(o=r,i=!a)}return i?s:-s-1}(e,t,n||r)}function r(e,t){return e>t?1:ee();function o(){return new Promise((e=>s((()=>e()))))}}.call(this,n(/*! ./../../../timers-browserify/main.js */"./node_modules/timers-browserify/main.js").setImmediate)},"./node_modules/@tensorflow/tfjs-core/dist/device_util.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/device_util.js ***! + \****************************************************************/ +/*! exports provided: isMobile, isBrowser */function(e,t,n){"use strict";function s(e){if(e||"undefined"!=typeof navigator&&null!=navigator){if(e||(e=navigator),"ReactNative"===e.product)return!0;const t=e.userAgent||e.vendor||window.opera;return/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(t)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(t.substr(0,4))}return!1}function o(){return"undefined"!=typeof window&&null!=window.document||"undefined"!=typeof WorkerGlobalScope}n.r(t),n.d(t,"isMobile",(function(){return s})),n.d(t,"isBrowser",(function(){return o}))},"./node_modules/@tensorflow/tfjs-core/dist/engine.js": +/*!***********************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/engine.js ***! + \***********************************************************/ +/*! exports provided: Engine, getOrMakeEngine, ENGINE, add */function(e,t,n){"use strict";n.r(t),n.d(t,"Engine",(function(){return h})),n.d(t,"getOrMakeEngine",(function(){return b})),n.d(t,"ENGINE",(function(){return j})),n.d(t,"add",(function(){return g}));var s=n(/*! ./backends/backend */"./node_modules/@tensorflow/tfjs-core/dist/backends/backend.js"),o=n(/*! ./environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"),r=n(/*! ./global_util */"./node_modules/@tensorflow/tfjs-core/dist/global_util.js"),i=n(/*! ./kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),a=n(/*! ./kernel_registry */"./node_modules/@tensorflow/tfjs-core/dist/kernel_registry.js"),d=n(/*! ./profiler */"./node_modules/@tensorflow/tfjs-core/dist/profiler.js"),u=n(/*! ./tape */"./node_modules/@tensorflow/tfjs-core/dist/tape.js"),l=n(/*! ./tensor */"./node_modules/@tensorflow/tfjs-core/dist/tensor.js"),c=n(/*! ./tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),f=n(/*! ./util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function p(e){return null!=e.kernelName}class m{constructor(){this.registeredVariables={},this.nextTapeNodeId=0,this.numBytes=0,this.numTensors=0,this.numStringTensors=0,this.numDataBuffers=0,this.gradientDepth=0,this.kernelDepth=0,this.scopeStack=[],this.numDataMovesStack=[],this.nextScopeId=0,this.tensorInfo=new WeakMap,this.profiling=!1,this.activeProfile={newBytes:0,newTensors:0,peakBytes:0,kernels:[],result:null,get kernelNames(){return Array.from(new Set(this.kernels.map((e=>e.name))))}}}dispose(){for(const e in this.registeredVariables)this.registeredVariables[e].dispose()}}class h{constructor(e){this.ENV=e,this.registry={},this.registryFactory={},this.pendingBackendInitId=0,this.state=new m}async ready(){if(null!=this.pendingBackendInit)return this.pendingBackendInit.then((()=>{}));if(null!=this.backendInstance)return;const e=this.getSortedBackends();for(let t=0;t{null!=e.setupFunc&&e.setupFunc(this.backendInstance)}))}disposeRegisteredKernels(e){Object(a.getKernelsForBackend)(e).forEach((t=>{null!=t.disposeFunc&&t.disposeFunc(this.registry[e])}))}initializeBackend(e){const t=this.registryFactory[e];if(null==t)throw new Error(`Cannot initialize backend ${e}, no registration found.`);try{const n=t.factory();if(!n||n instanceof s.KernelBackend||"function"!=typeof n.then)return this.registry[e]=n,{success:!0,asyncInit:!1};{const t=++this.pendingBackendInitId,s=n.then((n=>!(t(tthis.registryFactory[t].priority-this.registryFactory[e].priority))}initializeBackendsAndReturnBest(){const e=this.getSortedBackends();for(let t=0;tthis.startScope(s)),(()=>this.endScope(n)),(()=>(n=t(),n instanceof Promise&&console.error("Cannot return a Promise inside of tidy."),n)))}scopedRun(e,t,n){e();try{const e=n();return t(),e}catch(e){throw t(),e}}nextTensorId(){return h.nextTensorId++}nextVariableId(){return h.nextVariableId++}clone(e){const t=j.runKernel(i.Identity,{x:e}),n={x:e};return this.addTapeNode(this.state.activeScope.name,n,[t],(e=>({x:()=>{const t={x:e},n={dtype:"float32"};return j.runKernel(i.Cast,t,n)}})),[],{}),t}runKernel(e,t,n){null==this.backendName&&this.backend;if(!(null!=Object(a.getKernel)(e,this.backendName)))throw new Error(`Kernel '${e}' not registered for backend '${this.backendName}'`);return this.runKernelFunc({kernelName:e,inputs:t,attrs:n})}shouldCheckForMemLeaks(){return this.ENV.getBool("IS_TEST")}checkKernelForMemLeak(e,t,n){const s=this.backend.numDataIds();let o=0;n.forEach((e=>{o+="complex64"===e.dtype?3:1}));const r=this.state.numDataMovesStack[this.state.numDataMovesStack.length-1],i=s-t-o-r;if(i>0)throw new Error(`Backend '${this.backendName}' has an internal memory leak (${i} data ids) after running '${e}'`)}runKernelFunc(e){let t,n=[];const s=this.isTapeOn(),o=this.state.numBytes,r=this.state.numTensors;let i,d;this.shouldCheckForMemLeaks()&&this.state.numDataMovesStack.push(0),null==this.backendName&&this.backend;const u=p(e)?e.kernelName:null!=this.state.activeScope?this.state.activeScope.name:"";if(p(e)){const{kernelName:t,inputs:o,attrs:r}=e;null==this.backendName&&this.backend;const u=Object(a.getKernel)(t,this.backendName);f.assert(null!=u,(()=>`Cannot find registered kernel '${t}' for backend '${this.backendName}'`)),i=()=>{const e=this.backend.numDataIds();d=u.kernelFunc({inputs:o,attrs:r,backend:this.backend});const i=Array.isArray(d)?d:[d];this.shouldCheckForMemLeaks()&&this.checkKernelForMemLeak(t,e,i);const a=i.map((e=>{if(null!=e.rank)return e;const{dataId:t,shape:n,dtype:s}=e;return this.makeTensorFromDataId(t,n,s)}));if(s){const e=this.getTensorsForGradient(t,o,a);n=this.saveTensorsForBackwardMode(e)}return a}}else{const{forwardFunc:t}=e,o=e=>{s&&(n=e.map((e=>this.keep(this.clone(e)))))};i=()=>{const e=this.backend.numDataIds();d=this.tidy((()=>t(this.backend,o)));const n=Array.isArray(d)?d:[d];return this.shouldCheckForMemLeaks()&&this.checkKernelForMemLeak(u,e,n),n}}const{inputs:l,attrs:c}=e,m=p(e)?null:e.backwardsFunc;let h;return this.scopedRun((()=>this.state.kernelDepth++),(()=>this.state.kernelDepth--),(()=>{this.ENV.getBool("DEBUG")||this.state.profiling?(h=this.profiler.profileKernel(u,l,(()=>i())),this.ENV.getBool("DEBUG")&&this.profiler.logKernelProfile(h),t=h.outputs):t=i()})),s&&this.addTapeNode(u,l,t,m,n,c),this.state.profiling&&this.state.activeProfile.kernels.push({name:u,bytesAdded:this.state.numBytes-o,totalBytesSnapshot:this.state.numBytes,tensorsAdded:this.state.numTensors-r,totalTensorsSnapshot:this.state.numTensors,inputShapes:Object.keys(l).map((e=>null!=l[e]?l[e].shape:null)),outputShapes:t.map((e=>e.shape)),kernelTimeMs:h.timeMs,extraInfo:h.extraInfo}),Array.isArray(d)?t:t[0]}saveTensorsForBackwardMode(e){return e.map((e=>this.keep(this.clone(e))))}getTensorsForGradient(e,t,n){const s=Object(a.getGradient)(e);if(null!=s){const e=s.inputsToSave||[],o=s.outputsToSave||[];let r;s.saveAllInputs?(f.assert(Array.isArray(t),(()=>"saveAllInputs is true, expected inputs to be an array.")),r=Object.keys(t).map((e=>t[e]))):r=e.map((e=>t[e]));const i=n.filter(((e,t)=>o[t]));return r.concat(i)}return[]}makeTensor(e,t,n,s){if(null==e)throw new Error("Values passed to engine.makeTensor() are null");n=n||"float32",s=s||this.backend;let o=e;"string"===n&&f.isString(e[0])&&(o=e.map((e=>f.encodeString(e))));const r=s.write(o,t,n),i=new l.Tensor(t,n,r,this.nextTensorId());if(this.trackTensor(i,s),"string"===n){const e=this.state.tensorInfo.get(r),t=Object(f.bytesFromStringArray)(o);this.state.numBytes+=t-e.bytes,e.bytes=t}return i}makeTensorFromDataId(e,t,n,s){n=n||"float32";const o=new l.Tensor(t,n,e,this.nextTensorId());return this.trackTensor(o,s),o}makeVariable(e,t=!0,n,s){n=n||this.nextVariableId().toString(),null!=s&&s!==e.dtype&&(e=e.cast(s));const o=new l.Variable(e,t,n,this.nextTensorId());if(null!=this.state.registeredVariables[o.name])throw new Error(`Variable with name ${o.name} was already registered`);return this.state.registeredVariables[o.name]=o,this.incRef(o,this.backend),o}trackTensor(e,t){this.state.numTensors++,"string"===e.dtype&&this.state.numStringTensors++;let n=0;"complex64"!==e.dtype&&"string"!==e.dtype&&(n=e.size*f.bytesPerElement(e.dtype)),this.state.numBytes+=n,this.state.tensorInfo.has(e.dataId)||(this.state.numDataBuffers++,this.state.tensorInfo.set(e.dataId,{backend:t||this.backend,dtype:e.dtype,shape:e.shape,bytes:n})),e instanceof l.Variable||this.track(e)}incRef(e,t){this.trackTensor(e,t),this.backend.incRef(e.dataId)}removeDataId(e,t){this.state.tensorInfo.has(e)&&this.state.tensorInfo.get(e).backend===t&&(this.state.tensorInfo.delete(e),this.state.numDataBuffers--)}disposeTensor(e){if(!this.state.tensorInfo.has(e.dataId))return;const t=this.state.tensorInfo.get(e.dataId);if(this.state.numTensors--,"string"===e.dtype&&(this.state.numStringTensors--,this.state.numBytes-=t.bytes),"complex64"!==e.dtype&&"string"!==e.dtype){const t=e.size*f.bytesPerElement(e.dtype);this.state.numBytes-=t}t.backend.disposeData(e.dataId)&&this.removeDataId(e.dataId,t.backend)}disposeVariables(){for(const e in this.state.registeredVariables){const t=this.state.registeredVariables[e];this.disposeVariable(t)}}disposeVariable(e){this.disposeTensor(e),null!=this.state.registeredVariables[e.name]&&delete this.state.registeredVariables[e.name]}memory(){const e=this.backend.memory();return e.numTensors=this.state.numTensors,e.numDataBuffers=this.state.numDataBuffers,e.numBytes=this.state.numBytes,this.state.numStringTensors>0&&(e.unreliable=!0,null==e.reasons&&(e.reasons=[]),e.reasons.push("Memory usage by string tensors is approximate (2 bytes per character)")),e}async profile(e){this.state.profiling=!0;const t=this.state.numBytes,n=this.state.numTensors;this.state.activeProfile.kernels=[],this.state.activeProfile.result=await e(),this.state.profiling=!1,this.state.activeProfile.peakBytes=Math.max(...this.state.activeProfile.kernels.map((e=>e.totalBytesSnapshot))),this.state.activeProfile.newBytes=this.state.numBytes-t,this.state.activeProfile.newTensors=this.state.numTensors-n;for(const e of this.state.activeProfile.kernels)e.kernelTimeMs=await e.kernelTimeMs,e.extraInfo=await e.extraInfo;return this.state.activeProfile}isTapeOn(){return this.state.gradientDepth>0&&0===this.state.kernelDepth}addTapeNode(e,t,n,s,o,r){const i={id:this.state.nextTapeNodeId++,kernelName:e,inputs:t,outputs:n,saved:o},d=Object(a.getGradient)(e);null!=d&&(s=d.gradFunc),null!=s&&(i.gradient=e=>(e=e.map(((e,t)=>{if(null==e){const e=n[t],s=f.makeZerosTypedArray(e.size,e.dtype);return this.makeTensor(s,e.shape,e.dtype)}return e})),s(e.length>1?e:e[0],o,r))),this.state.activeTape.push(i)}keep(e){return e.kept=!0,e}startTape(){0===this.state.gradientDepth&&(this.state.activeTape=[]),this.state.gradientDepth++}endTape(){this.state.gradientDepth--}startScope(e){const t={track:[],name:"unnamed scope",id:this.state.nextScopeId++};e&&(t.name=e),this.state.scopeStack.push(t),this.state.activeScope=t}endScope(e){const t=Object(c.getTensorsInContainer)(e),n=new Set(t.map((e=>e.id)));for(let e=0;e{e.kept||e.scopeId!==s.id||this.track(e)}))}gradients(e,t,n,s=!1){if(f.assert(t.length>0,(()=>"gradients() received an empty list of xs.")),null!=n&&"float32"!==n.dtype)throw new Error(`dy must have 'float32' dtype, but has '${n.dtype}'`);const o=this.scopedRun((()=>this.startTape()),(()=>this.endTape()),(()=>this.tidy("forward",e)));f.assert(o instanceof l.Tensor,(()=>"The result y returned by f() must be a tensor."));const r=Object(u.getFilteredNodesXToY)(this.state.activeTape,t,o);if(!s&&0===r.length&&t.length>0)throw new Error("Cannot compute gradient of y=f(x) with respect to x. Make sure that the f you passed encloses all operations that lead from x to y.");return this.tidy("backward",(()=>{const e={};e[o.id]=null==n?function(e){const t=Object(f.makeOnesTypedArray)(Object(f.sizeFromShape)(e),"float32");return j.makeTensor(t,e,"float32")}(o.shape):n,Object(u.backpropagateGradients)(e,r,(e=>this.tidy(e)),g);const s=t.map((t=>e[t.id]));return 0===this.state.gradientDepth&&(this.state.activeTape.forEach((e=>{for(const t of e.saved)t.dispose()})),this.state.activeTape=null),{value:o,grads:s}}))}customGrad(e){return f.assert(f.isFunction(e),(()=>"The f passed in customGrad(f) must be a function.")),(...t)=>{let n;f.assert(t.every((e=>e instanceof l.Tensor)),(()=>"The args passed in customGrad(f)(x1, x2,...) must all be tensors"));const s={};t.forEach(((e,t)=>{s[t]=e}));return this.runKernelFunc({forwardFunc:(s,o)=>(n=e(...t,o),f.assert(n.value instanceof l.Tensor,(()=>"The function f passed in customGrad(f) must return an object where `obj.value` is a tensor")),f.assert(f.isFunction(n.gradFunc),(()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function.")),n.value),backwardsFunc:(e,s)=>{const o=n.gradFunc(e,s),r=Array.isArray(o)?o:[o];f.assert(r.length===t.length,(()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns the same number of tensors as inputs passed to f(...).")),f.assert(r.every((e=>e instanceof l.Tensor)),(()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns a list of only tensors."));const i={};return r.forEach(((e,t)=>{i[t]=()=>e})),i},inputs:s})}}readSync(e){return this.state.tensorInfo.get(e).backend.readSync(e)}read(e){return this.state.tensorInfo.get(e).backend.read(e)}async time(e){const t=Object(f.now)(),n=await this.backend.time(e);return n.wallMs=Object(f.now)()-t,n}track(e){return null!=this.state.activeScope&&(e.scopeId=this.state.activeScope.id,this.state.activeScope.track.push(e)),e}get registeredVariables(){return this.state.registeredVariables}reset(){this.pendingBackendInitId++,this.state.dispose(),this.ENV.reset(),this.state=new m;for(const e in this.registry)this.disposeRegisteredKernels(e),this.registry[e].dispose(),delete this.registry[e];this.backendName=null,this.backendInstance=null,this.pendingBackendInit=null}}function b(){const e=Object(r.getGlobalNamespace)();if(null==e._tfengine){const t=new o.Environment(e);e._tfengine=new h(t)}return Object(o.setEnvironmentGlobal)(e._tfengine.ENV),Object(l.setTensorTracker)((()=>e._tfengine)),e._tfengine}h.nextTensorId=0,h.nextVariableId=0;const j=b();function g(e,t){const n={a:e,b:t};return j.runKernel(i.Add,n)}},"./node_modules/@tensorflow/tfjs-core/dist/environment.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/environment.js ***! + \****************************************************************/ +/*! exports provided: Environment, getQueryParams, env, ENV, setEnvironmentGlobal */function(e,t,n){"use strict";n.r(t),n.d(t,"Environment",(function(){return r})),n.d(t,"getQueryParams",(function(){return i})),n.d(t,"env",(function(){return a})),n.d(t,"ENV",(function(){return d})),n.d(t,"setEnvironmentGlobal",(function(){return u}));var s=n(/*! ./util_base */"./node_modules/@tensorflow/tfjs-core/dist/util_base.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */const o="tfjsflags";class r{constructor(e){this.global=e,this.flags={},this.flagRegistry={},this.urlFlags={},this.getQueryParams=i,this.populateURLFlags()}setPlatform(e,t){null!=this.platform&&console.warn(`Platform ${this.platformName} has already been set. Overwriting the platform with ${t}.`),this.platformName=e,this.platform=t}registerFlag(e,t,n){if(this.flagRegistry[e]={evaluationFn:t,setHook:n},null!=this.urlFlags[e]){const t=this.urlFlags[e];console.warn(`Setting feature override from URL ${e}: ${t}.`),this.set(e,t)}}async getAsync(e){return e in this.flags||(this.flags[e]=await this.evaluateFlag(e)),this.flags[e]}get(e){if(e in this.flags)return this.flags[e];const t=this.evaluateFlag(e);if(Object(s.isPromise)(t))throw new Error(`Flag ${e} cannot be synchronously evaluated. Please use getAsync() instead.`);return this.flags[e]=t,this.flags[e]}getNumber(e){return this.get(e)}getBool(e){return this.get(e)}getFlags(){return this.flags}get features(){return this.flags}set(e,t){if(null==this.flagRegistry[e])throw new Error(`Cannot set flag ${e} as it has not been registered.`);this.flags[e]=t,null!=this.flagRegistry[e].setHook&&this.flagRegistry[e].setHook(t)}evaluateFlag(e){if(null==this.flagRegistry[e])throw new Error(`Cannot evaluate flag '${e}': no evaluation function found.`);return this.flagRegistry[e].evaluationFn()}setFlags(e){this.flags=Object.assign({},e)}reset(){this.flags={},this.urlFlags={},this.populateURLFlags()}populateURLFlags(){if("undefined"==typeof this.global||"undefined"==typeof this.global.location||"undefined"==typeof this.global.location.search)return;const e=this.getQueryParams(this.global.location.search);if(o in e){e.tfjsflags.split(",").forEach((e=>{const[t,n]=e.split(":");this.urlFlags[t]=function(e,t){if("true"===(t=t.toLowerCase())||"false"===t)return"true"===t;if(""+ +t===t)return+t;throw new Error(`Could not parse value flag value ${t} for flag ${e}.`)}(t,n)}))}}}function i(e){const t={};return e.replace(/[?&]([^=?&]+)(?:=([^&]*))?/g,((e,...n)=>(function(e,t,n){e[decodeURIComponent(t)]=decodeURIComponent(n||"")}(t,n[0],n[1]),n.join("=")))),t}function a(){return d}let d=null;function u(e){d=e}},"./node_modules/@tensorflow/tfjs-core/dist/flags.js": +/*!**********************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/flags.js ***! + \**********************************************************/ +/*! no exports provided */function(e,t,n){"use strict";n.r(t),function(e){n(/*! ./engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js");var t=n(/*! ./device_util */"./node_modules/@tensorflow/tfjs-core/dist/device_util.js"),s=n(/*! ./environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const o=Object(s.env)();o.registerFlag("DEBUG",(()=>!1),(e=>{e&&console.warn("Debugging mode is ON. The output of every math call will be downloaded to CPU and checked for NaNs. This significantly impacts performance.")})),o.registerFlag("IS_BROWSER",(()=>t.isBrowser())),o.registerFlag("IS_NODE",(()=>"undefined"!=typeof e&&"undefined"!=typeof e.versions&&"undefined"!=typeof e.versions.node)),o.registerFlag("IS_CHROME",(()=>"undefined"!=typeof navigator&&null!=navigator&&null!=navigator.userAgent&&/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor))),o.registerFlag("PROD",(()=>!1)),o.registerFlag("TENSORLIKE_CHECK_SHAPE_CONSISTENCY",(()=>o.getBool("DEBUG"))),o.registerFlag("DEPRECATION_WARNINGS_ENABLED",(()=>!0)),o.registerFlag("IS_TEST",(()=>!1)),o.registerFlag("CHECK_COMPUTATION_FOR_ERRORS",(()=>!0)),o.registerFlag("WRAP_TO_IMAGEBITMAP",(()=>!1))}.call(this,n(/*! ./../../../process/browser.js */"./node_modules/process/browser.js"))},"./node_modules/@tensorflow/tfjs-core/dist/global_util.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/global_util.js ***! + \****************************************************************/ +/*! exports provided: getGlobalNamespace, getGlobal */function(e,t,n){"use strict";n.r(t),function(e,s){ +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let o;function r(){if(null==o){let t;if("undefined"!=typeof window)t=window;else if("undefined"!=typeof e)t=e;else if("undefined"!=typeof s)t=s;else{if("undefined"==typeof self)throw new Error("Could not find a global object");t=self}o=t}return o}function i(e,t){const n=function(){const e=r();return null==e._tfGlobals&&(e._tfGlobals=new Map),e._tfGlobals}();if(n.has(e))return n.get(e);{const s=t();return n.set(e,s),n.get(e)}}n.d(t,"getGlobalNamespace",(function(){return r})),n.d(t,"getGlobal",(function(){return i}))}.call(this,n(/*! ./../../../webpack/buildin/global.js */"./node_modules/webpack/buildin/global.js"),n(/*! ./../../../process/browser.js */"./node_modules/process/browser.js"))},"./node_modules/@tensorflow/tfjs-core/dist/globals.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/globals.js ***! + \************************************************************/ +/*! exports provided: enableProdMode, enableDebugMode, disableDeprecationWarnings, deprecationWarn, disposeVariables, engine, memory, profile, tidy, dispose, keep, time, setBackend, ready, getBackend, removeBackend, findBackend, findBackendFactory, registerBackend, backend, setPlatform */function(e,t,n){"use strict";n.r(t),n.d(t,"enableProdMode",(function(){return a})),n.d(t,"enableDebugMode",(function(){return d})),n.d(t,"disableDeprecationWarnings",(function(){return u})),n.d(t,"deprecationWarn",(function(){return l})),n.d(t,"disposeVariables",(function(){return c})),n.d(t,"engine",(function(){return f})),n.d(t,"memory",(function(){return p})),n.d(t,"profile",(function(){return m})),n.d(t,"tidy",(function(){return h})),n.d(t,"dispose",(function(){return b})),n.d(t,"keep",(function(){return j})),n.d(t,"time",(function(){return g})),n.d(t,"setBackend",(function(){return w})),n.d(t,"ready",(function(){return _})),n.d(t,"getBackend",(function(){return k})),n.d(t,"removeBackend",(function(){return v})),n.d(t,"findBackend",(function(){return x})),n.d(t,"findBackendFactory",(function(){return y})),n.d(t,"registerBackend",(function(){return O})),n.d(t,"backend",(function(){return I})),n.d(t,"setPlatform",(function(){return C}));var s=n(/*! ./engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ./environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"),r=n(/*! ./tensor */"./node_modules/@tensorflow/tfjs-core/dist/tensor.js"),i=n(/*! ./tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(){Object(o.env)().set("PROD",!0)}function d(){Object(o.env)().set("DEBUG",!0)}function u(){Object(o.env)().set("DEPRECATION_WARNINGS_ENABLED",!1),console.warn("TensorFlow.js deprecation warnings have been disabled.")}function l(e){Object(o.env)().getBool("DEPRECATION_WARNINGS_ENABLED")&&console.warn(e+" You can disable deprecation warnings with tf.disableDeprecationWarnings().")}function c(){s.ENGINE.disposeVariables()}function f(){return s.ENGINE}function p(){return s.ENGINE.memory()}function m(e){return s.ENGINE.profile(e)}function h(e,t){return s.ENGINE.tidy(e,t)}function b(e){Object(i.getTensorsInContainer)(e).forEach((e=>e.dispose()))}function j(e){return s.ENGINE.keep(e)}function g(e){return s.ENGINE.time(e)}function w(e){return s.ENGINE.setBackend(e)}function _(){return s.ENGINE.ready()}function k(){return s.ENGINE.backendName}function v(e){s.ENGINE.removeBackend(e)}function x(e){return s.ENGINE.findBackend(e)}function y(e){return s.ENGINE.findBackendFactory(e)}function O(e,t,n=1){return s.ENGINE.registerBackend(e,t,n)}function I(){return s.ENGINE.backend}function C(e,t){Object(o.env)().setPlatform(e,t)}Object(r.setDeprecationWarningFn)(l)},"./node_modules/@tensorflow/tfjs-core/dist/gradients.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients.js ***! + \**************************************************************/ +/*! exports provided: customGrad, variableGrads, valueAndGrad, valueAndGrads, grad, grads */function(e,t,n){"use strict";n.r(t),n.d(t,"customGrad",(function(){return f})),n.d(t,"variableGrads",(function(){return c})),n.d(t,"valueAndGrad",(function(){return u})),n.d(t,"valueAndGrads",(function(){return l})),n.d(t,"grad",(function(){return a})),n.d(t,"grads",(function(){return d}));var s=n(/*! ./engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ./tensor */"./node_modules/@tensorflow/tfjs-core/dist/tensor.js"),r=n(/*! ./tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){return i.assert(i.isFunction(e),(()=>"The f passed in grad(f) must be a function")),(t,n)=>{const o=Object(r.convertToTensor)(t,"x","tf.grad","string_or_numeric"),a=null!=n?Object(r.convertToTensor)(n,"dy","tf.grad"):null;return s.ENGINE.tidy((()=>{const{value:t,grads:n}=s.ENGINE.gradients((()=>e(o)),[o],a);return null!=a&&i.assertShapesMatch(t.shape,a.shape,"The shape of dy passed in grad(f)(x, dy) must match the shape returned by f(x)"),p(n),n[0]}))}}function d(e){return i.assert(i.isFunction(e),(()=>"The f passed in grads(f) must be a function")),(t,n)=>{i.assert(Array.isArray(t),(()=>"The args passed in grads(f)(args) must be an array of `Tensor`s or `TensorLike`s"));const o=Object(r.convertToTensorArray)(t,"args","tf.grads","string_or_numeric"),a=null!=n?Object(r.convertToTensor)(n,"dy","tf.grads"):null;return s.ENGINE.tidy((()=>{const{value:t,grads:n}=s.ENGINE.gradients((()=>e(...o)),o,a);return null!=a&&i.assertShapesMatch(t.shape,a.shape,"The shape of dy passed in grads(f)([x1,...], dy) must match the shape returned by f([x1,...])"),p(n),n}))}}function u(e){return i.assert(i.isFunction(e),(()=>"The f passed in valueAndGrad(f) must be a function")),(t,n)=>{i.assert(t instanceof o.Tensor,(()=>"The x passed in valueAndGrad(f)(x) must be a tensor")),i.assert(null==n||n instanceof o.Tensor,(()=>"The dy passed in valueAndGrad(f)(x, dy) must be a tensor"));const{grads:r,value:a}=s.ENGINE.gradients((()=>e(t)),[t],n);return p(r),{grad:r[0],value:a}}}function l(e){return i.assert(i.isFunction(e),(()=>"The f passed in valueAndGrads(f) must be a function")),(t,n)=>{i.assert(Array.isArray(t)&&t.every((e=>e instanceof o.Tensor)),(()=>"The args passed in valueAndGrads(f)(args) must be array of tensors")),i.assert(null==n||n instanceof o.Tensor,(()=>"The dy passed in valueAndGrads(f)(args, dy) must be a tensor"));const r=s.ENGINE.gradients((()=>e(...t)),t,n);return null!=n&&i.assertShapesMatch(r.value.shape,n.shape,"The shape of dy passed in valueAndGrads(f)([x1,...], dy) must match the shape returned by f([x1,...])"),p(r.grads),r}}function c(e,t){i.assert(i.isFunction(e),(()=>"The f passed in variableGrads(f) must be a function")),i.assert(null==t||Array.isArray(t)&&t.every((e=>e instanceof o.Variable)),(()=>"The varList passed in variableGrads(f, varList) must be an array of variables"));const n=null!=t;if(!n){t=[];for(const e in s.ENGINE.registeredVariables)t.push(s.ENGINE.registeredVariables[e])}const r=n?t.filter((e=>!e.trainable)):null,a=t.length;t=t.filter((e=>e.trainable)),i.assert(t.length>0,(()=>`variableGrads() expects at least one of the input variables to be trainable, but none of the ${a} variables is trainable.`));const{value:d,grads:u}=s.ENGINE.gradients(e,t,null,!0);i.assert(u.some((e=>null!=e)),(()=>"Cannot find a connection between any variable and the result of the loss function y=f(x). Please make sure the operations that use variables are inside the function f passed to minimize().")),i.assert(0===d.rank,(()=>`The f passed in variableGrads(f) must return a scalar, but it returned a rank-${d.rank} tensor`));const l={};return t.forEach(((e,t)=>{null!=u[t]&&(l[e.name]=u[t])})),null!=r&&r.forEach((e=>l[e.name]=null)),{value:d,grads:l}}function f(e){return s.ENGINE.customGrad(e)}function p(e){if(e.filter((e=>null==e)).length>0)throw new Error("Cannot compute gradient of y=f(x) with respect to x. Make sure that\n the f you passed encloses all operations that lead from x to y.")}},"./node_modules/@tensorflow/tfjs-core/dist/hash_util.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/hash_util.js ***! + \**************************************************************/ +/*! exports provided: hexToLong, fingerPrint64 */function(e,t,n){"use strict";n.r(t),n.d(t,"hexToLong",(function(){return r})),n.d(t,"fingerPrint64",(function(){return b}));var s=n(/*! long */"./node_modules/long/src/long.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const o=n.n(s).a||s;function r(e){return o.fromString(e,!0,16)}const i=r("c3a5c85c97cb3127"),a=r("b492b66fbe98f273"),d=r("9ae16a3b2f90404f");function u(e){return e.xor(e.shru(47))}function l(e,t,n){const s=e.slice(t,t+n);return o.fromBytes(Array.from(s),!0,!0)}function c(e,t){return l(e,t,8)}function f(e,t){return l(e,t,4)}function p(e,t){return 0===t?e:e.shru(t).or(e.shl(64-t))}function m(e,t,n=r("9ddfea08eb382d69")){let s=e.xor(t).mul(n);s=s.xor(s.shru(47));let o=t.xor(s).mul(n);return o=o.xor(o.shru(47)),o=o.mul(n),o}function h(e,t,n,s){return function(e,t,n,s,o,r){o=o.add(e),r=p(r.add(o).add(s),21);const i=o;return o=(o=o.add(t)).add(n),r=r.add(p(o,44)),[o.add(s),r.add(i)]}(c(e,t),c(e,t+8),c(e,t+16),c(e,t+24),n,s)}function b(e,t=e.length){const n=o.fromNumber(81,!0);if(t<=32)return t<=16?function(e,t=e.length){if(t>=8){const n=d.add(2*t),s=c(e,0).add(d),o=c(e,t-8);return m(p(o,37).mul(n).add(s),p(s,25).add(o).mul(n),n)}if(t>=4){const n=d.add(2*t);return m(f(e,0).shl(3).add(t),f(e,t-4),n)}if(t>0){const n=e[0]+(e[t>>1]<<8),s=t+(e[t-1]<<2);return u(d.mul(n).xor(i.mul(s))).mul(d)}return d}(e,t):function(e,t=e.length){const n=d.add(2*t),s=c(e,0).mul(a),o=c(e,8),r=c(e,t-8).mul(n),i=c(e,t-16).mul(d);return m(p(s.add(o),43).add(p(r,30)).add(i),s.add(p(o.add(d),18)).add(r),n)}(e,t);if(t<=64)return function(e,t=e.length){const n=d.add(2*t),s=c(e,0).mul(d),o=c(e,8),r=c(e,t-8).mul(n),i=c(e,t-16).mul(d),a=p(s.add(o),43).add(p(r,30)).add(i),u=m(a,s.add(p(o.add(d),18)).add(r),n),l=c(e,16).mul(n),f=c(e,24),h=a.add(c(e,t-32)).mul(n),b=u.add(c(e,t-24)).mul(n);return m(p(l.add(f),43).add(p(h,30)).add(b),l.add(p(f.add(s),18)).add(h),n)}(e,t);let s=n,r=n.mul(a).add(113),l=u(r.mul(d).add(113)).mul(d),b=[o.UZERO,o.UZERO],j=[o.UZERO,o.UZERO];s=s.mul(d).add(c(e,0));let g=0;const w=64*(t-1>>6),_=w+(t-1&63)-63;do{s=p(s.add(r).add(b[0]).add(c(e,g+8)),37).mul(a),r=p(r.add(b[1]).add(c(e,g+48)),42).mul(a),s=s.xor(j[1]),r=r.add(b[0]).add(c(e,g+40)),l=p(l.add(j[0]),33).mul(a),b=h(e,g,b[1].mul(a),s.add(j[0])),j=h(e,g+32,l.add(j[1]),r.add(c(e,g+16))),[l,s]=[s,l],g+=64}while(g!==w);const k=a.add(l.and(255).shl(1));return g=_,j[0]=j[0].add(t-1&63),b[0]=b[0].add(j[0]),j[0]=j[0].add(b[0]),s=p(s.add(r).add(b[0]).add(c(e,g+8)),37).mul(k),r=p(r.add(b[1]).add(c(e,g+48)),42).mul(k),s=s.xor(j[1].mul(9)),r=r.add(b[0].mul(9).add(c(e,g+40))),l=p(l.add(j[0]),33).mul(k),b=h(e,g,b[1].mul(k),s.add(j[0])),j=h(e,g+32,l.add(j[1]),r.add(c(e,g+16))),[l,s]=[s,l],m(m(b[0],j[0],k).add(u(r).mul(i)).add(l),m(b[1],j[1],k).add(s),k)}},"./node_modules/@tensorflow/tfjs-core/dist/index.js": +/*!**********************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/index.js ***! + \**********************************************************/ +/*! exports provided: AdadeltaOptimizer, AdagradOptimizer, AdamOptimizer, AdamaxOptimizer, MomentumOptimizer, Optimizer, RMSPropOptimizer, SGDOptimizer, Tensor, TensorBuffer, Variable, Rank, sumOutType, upcastType, abs, acos, acosh, add, addN, all, any, argMax, argMin, asin, asinh, atan, atan2, atanh, avgPool, avgPool3d, basicLSTMCell, batchToSpaceND, batchNorm, batchNorm2d, batchNorm3d, batchNorm4d, bincount, broadcastTo, buffer, cast, ceil, clipByValue, clone, complex, concat, concat1d, concat2d, concat3d, concat4d, conv1d, conv2d, conv2dTranspose, conv3d, conv3dTranspose, cos, cosh, cumsum, denseBincount, depthToSpace, depthwiseConv2d, diag, dilation2d, div, divNoNan, dot, einsum, elu, equal, erf, exp, expandDims, expm1, eye, fill, floor, floorDiv, gather, greater, greaterEqual, imag, isFinite, isInf, isNaN, leakyRelu, less, lessEqual, linspace, localResponseNormalization, log, log1p, logSigmoid, logSoftmax, logSumExp, logicalAnd, logicalNot, logicalOr, logicalXor, matMul, max, maxPool, maxPool3d, maxPoolWithArgmax, maximum, mean, meshgrid, min, minimum, mirrorPad, mod, moments, mul, multiRNNCell, multinomial, neg, notEqual, oneHot, ones, onesLike, outerProduct, pad, pad1d, pad2d, pad3d, pad4d, pool, pow, prelu, print, prod, rand, randomGamma, randomNormal, randomUniform, range, real, reciprocal, relu, relu6, reshape, reverse, reverse1d, reverse2d, reverse3d, reverse4d, round, rsqrt, scalar, selu, separableConv2d, setdiff1dAsync, sigmoid, sign, sin, sinh, slice, slice1d, slice2d, slice3d, slice4d, softmax, softplus, spaceToBatchND, fft, ifft, irfft, rfft, split, sqrt, square, squaredDifference, squeeze, stack, step, stridedSlice, sub, sum, tan, tanh, tensor, tensor1d, tensor2d, tensor3d, tensor4d, tensor5d, tensor6d, tile, topk, truncatedNormal, unique, unsortedSegmentSum, unstack, variable, where, whereAsync, zeros, zerosLike, booleanMaskAsync, transpose, norm, movingAverage, scatterND, sparseToDense, gatherND, dropout, enclosingPowerOfTwo, cosineWindow, inTopKAsync, op, OP_SCOPE_SUFFIX, image, linalg, losses, spectral, fused, signal, sparse, string, Reduction, train, enableProdMode, enableDebugMode, disableDeprecationWarnings, deprecationWarn, disposeVariables, engine, memory, profile, tidy, dispose, keep, time, setBackend, ready, getBackend, removeBackend, findBackend, findBackendFactory, registerBackend, backend, setPlatform, getKernel, getGradient, getKernelsForBackend, registerKernel, registerGradient, unregisterKernel, unregisterGradient, copyRegisteredKernels, customGrad, grad, grads, valueAndGrad, valueAndGrads, variableGrads, Environment, env, ENV, version_core, nextFrame, browser, io, math, serialization, test_util, util, backend_util, tensor_util, slice_util, gather_util, scatter_util, device_util, kernel_impls, KernelBackend, DataStorage, Abs, Acos, Acosh, Add, AddN, All, Any, ArgMax, ArgMin, Asin, Asinh, Atan, Atanh, Atan2, AvgPool, AvgPoolGrad, AvgPool3D, AvgPool3DGrad, BatchMatMul, BatchToSpaceND, Bincount, BroadcastTo, Cast, Ceil, ClipByValue, Complex, ComplexAbs, Concat, Conv2D, Conv2DBackpropFilter, Conv2DBackpropInput, Conv3D, Conv3DBackpropFilterV2, Conv3DBackpropInputV2, Cos, Cosh, Cumsum, CropAndResize, DenseBincount, DepthToSpace, DepthwiseConv2dNative, DepthwiseConv2dNativeBackpropFilter, DepthwiseConv2dNativeBackpropInput, Diag, Dilation2D, Dilation2DBackpropInput, Dilation2DBackpropFilter, RealDiv, Einsum, Elu, EluGrad, Erf, Equal, Exp, ExpandDims, Expm1, FFT, Fill, FlipLeftRight, Floor, FloorDiv, FusedBatchNorm, GatherV2, GatherNd, Greater, GreaterEqual, Identity, IFFT, Imag, IsFinite, IsInf, IsNan, LeakyRelu, Less, LessEqual, LinSpace, Log, Log1p, LogicalAnd, LogicalNot, LogicalOr, LogSoftmax, LRN, LRNGrad, Max, Maximum, MaxPool, MaxPoolGrad, MaxPool3D, MaxPool3DGrad, MaxPoolWithArgmax, Mean, Min, Minimum, MirrorPad, Mod, Multinomial, Multiply, Neg, NotEqual, NonMaxSuppressionV3, NonMaxSuppressionV4, NonMaxSuppressionV5, OnesLike, OneHot, Pack, PadV2, Pool, Pow, Prelu, Prod, Range, Real, Reciprocal, Relu, Reshape, ResizeNearestNeighbor, ResizeNearestNeighborGrad, ResizeBilinear, ResizeBilinearGrad, Relu6, Reverse, Round, Rsqrt, ScatterNd, Select, Selu, Slice, Sin, Sinh, Sign, Sigmoid, Softplus, Sqrt, Sum, SpaceToBatchND, SplitV, Softmax, SparseFillEmptyRows, SparseReshape, SparseSegmentMean, SparseSegmentSum, SparseToDense, SquaredDifference, Square, StridedSlice, StringNGrams, StringSplit, StringToHashBucketFast, Sub, Tan, Tanh, Tile, TopK, Transform, Transpose, Unique, Unpack, UnsortedSegmentSum, ZerosLike, Step, FromPixels, RotateWithOffset, _FusedMatMul, FusedConv2D, FusedDepthwiseConv2D */function(e,t,n){"use strict";n.r(t);n(/*! ./base_side_effects */"./node_modules/@tensorflow/tfjs-core/dist/base_side_effects.js");var s=n(/*! ./base */"./node_modules/@tensorflow/tfjs-core/dist/base.js");n.d(t,"AdadeltaOptimizer",(function(){return s.AdadeltaOptimizer})),n.d(t,"AdagradOptimizer",(function(){return s.AdagradOptimizer})),n.d(t,"AdamOptimizer",(function(){return s.AdamOptimizer})),n.d(t,"AdamaxOptimizer",(function(){return s.AdamaxOptimizer})),n.d(t,"MomentumOptimizer",(function(){return s.MomentumOptimizer})),n.d(t,"Optimizer",(function(){return s.Optimizer})),n.d(t,"RMSPropOptimizer",(function(){return s.RMSPropOptimizer})),n.d(t,"SGDOptimizer",(function(){return s.SGDOptimizer})),n.d(t,"Tensor",(function(){return s.Tensor})),n.d(t,"TensorBuffer",(function(){return s.TensorBuffer})),n.d(t,"Variable",(function(){return s.Variable})),n.d(t,"Rank",(function(){return s.Rank})),n.d(t,"sumOutType",(function(){return s.sumOutType})),n.d(t,"upcastType",(function(){return s.upcastType})),n.d(t,"abs",(function(){return s.abs})),n.d(t,"acos",(function(){return s.acos})),n.d(t,"acosh",(function(){return s.acosh})),n.d(t,"add",(function(){return s.add})),n.d(t,"addN",(function(){return s.addN})),n.d(t,"all",(function(){return s.all})),n.d(t,"any",(function(){return s.any})),n.d(t,"argMax",(function(){return s.argMax})),n.d(t,"argMin",(function(){return s.argMin})),n.d(t,"asin",(function(){return s.asin})),n.d(t,"asinh",(function(){return s.asinh})),n.d(t,"atan",(function(){return s.atan})),n.d(t,"atan2",(function(){return s.atan2})),n.d(t,"atanh",(function(){return s.atanh})),n.d(t,"avgPool",(function(){return s.avgPool})),n.d(t,"avgPool3d",(function(){return s.avgPool3d})),n.d(t,"basicLSTMCell",(function(){return s.basicLSTMCell})),n.d(t,"batchToSpaceND",(function(){return s.batchToSpaceND})),n.d(t,"batchNorm",(function(){return s.batchNorm})),n.d(t,"batchNorm2d",(function(){return s.batchNorm2d})),n.d(t,"batchNorm3d",(function(){return s.batchNorm3d})),n.d(t,"batchNorm4d",(function(){return s.batchNorm4d})),n.d(t,"bincount",(function(){return s.bincount})),n.d(t,"broadcastTo",(function(){return s.broadcastTo})),n.d(t,"buffer",(function(){return s.buffer})),n.d(t,"cast",(function(){return s.cast})),n.d(t,"ceil",(function(){return s.ceil})),n.d(t,"clipByValue",(function(){return s.clipByValue})),n.d(t,"clone",(function(){return s.clone})),n.d(t,"complex",(function(){return s.complex})),n.d(t,"concat",(function(){return s.concat})),n.d(t,"concat1d",(function(){return s.concat1d})),n.d(t,"concat2d",(function(){return s.concat2d})),n.d(t,"concat3d",(function(){return s.concat3d})),n.d(t,"concat4d",(function(){return s.concat4d})),n.d(t,"conv1d",(function(){return s.conv1d})),n.d(t,"conv2d",(function(){return s.conv2d})),n.d(t,"conv2dTranspose",(function(){return s.conv2dTranspose})),n.d(t,"conv3d",(function(){return s.conv3d})),n.d(t,"conv3dTranspose",(function(){return s.conv3dTranspose})),n.d(t,"cos",(function(){return s.cos})),n.d(t,"cosh",(function(){return s.cosh})),n.d(t,"cumsum",(function(){return s.cumsum})),n.d(t,"denseBincount",(function(){return s.denseBincount})),n.d(t,"depthToSpace",(function(){return s.depthToSpace})),n.d(t,"depthwiseConv2d",(function(){return s.depthwiseConv2d})),n.d(t,"diag",(function(){return s.diag})),n.d(t,"dilation2d",(function(){return s.dilation2d})),n.d(t,"div",(function(){return s.div})),n.d(t,"divNoNan",(function(){return s.divNoNan})),n.d(t,"dot",(function(){return s.dot})),n.d(t,"einsum",(function(){return s.einsum})),n.d(t,"elu",(function(){return s.elu})),n.d(t,"equal",(function(){return s.equal})),n.d(t,"erf",(function(){return s.erf})),n.d(t,"exp",(function(){return s.exp})),n.d(t,"expandDims",(function(){return s.expandDims})),n.d(t,"expm1",(function(){return s.expm1})),n.d(t,"eye",(function(){return s.eye})),n.d(t,"fill",(function(){return s.fill})),n.d(t,"floor",(function(){return s.floor})),n.d(t,"floorDiv",(function(){return s.floorDiv})),n.d(t,"gather",(function(){return s.gather})),n.d(t,"greater",(function(){return s.greater})),n.d(t,"greaterEqual",(function(){return s.greaterEqual})),n.d(t,"imag",(function(){return s.imag})),n.d(t,"isFinite",(function(){return s.isFinite})),n.d(t,"isInf",(function(){return s.isInf})),n.d(t,"isNaN",(function(){return s.isNaN})),n.d(t,"leakyRelu",(function(){return s.leakyRelu})),n.d(t,"less",(function(){return s.less})),n.d(t,"lessEqual",(function(){return s.lessEqual})),n.d(t,"linspace",(function(){return s.linspace})),n.d(t,"localResponseNormalization",(function(){return s.localResponseNormalization})),n.d(t,"log",(function(){return s.log})),n.d(t,"log1p",(function(){return s.log1p})),n.d(t,"logSigmoid",(function(){return s.logSigmoid})),n.d(t,"logSoftmax",(function(){return s.logSoftmax})),n.d(t,"logSumExp",(function(){return s.logSumExp})),n.d(t,"logicalAnd",(function(){return s.logicalAnd})),n.d(t,"logicalNot",(function(){return s.logicalNot})),n.d(t,"logicalOr",(function(){return s.logicalOr})),n.d(t,"logicalXor",(function(){return s.logicalXor})),n.d(t,"matMul",(function(){return s.matMul})),n.d(t,"max",(function(){return s.max})),n.d(t,"maxPool",(function(){return s.maxPool})),n.d(t,"maxPool3d",(function(){return s.maxPool3d})),n.d(t,"maxPoolWithArgmax",(function(){return s.maxPoolWithArgmax})),n.d(t,"maximum",(function(){return s.maximum})),n.d(t,"mean",(function(){return s.mean})),n.d(t,"meshgrid",(function(){return s.meshgrid})),n.d(t,"min",(function(){return s.min})),n.d(t,"minimum",(function(){return s.minimum})),n.d(t,"mirrorPad",(function(){return s.mirrorPad})),n.d(t,"mod",(function(){return s.mod})),n.d(t,"moments",(function(){return s.moments})),n.d(t,"mul",(function(){return s.mul})),n.d(t,"multiRNNCell",(function(){return s.multiRNNCell})),n.d(t,"multinomial",(function(){return s.multinomial})),n.d(t,"neg",(function(){return s.neg})),n.d(t,"notEqual",(function(){return s.notEqual})),n.d(t,"oneHot",(function(){return s.oneHot})),n.d(t,"ones",(function(){return s.ones})),n.d(t,"onesLike",(function(){return s.onesLike})),n.d(t,"outerProduct",(function(){return s.outerProduct})),n.d(t,"pad",(function(){return s.pad})),n.d(t,"pad1d",(function(){return s.pad1d})),n.d(t,"pad2d",(function(){return s.pad2d})),n.d(t,"pad3d",(function(){return s.pad3d})),n.d(t,"pad4d",(function(){return s.pad4d})),n.d(t,"pool",(function(){return s.pool})),n.d(t,"pow",(function(){return s.pow})),n.d(t,"prelu",(function(){return s.prelu})),n.d(t,"print",(function(){return s.print})),n.d(t,"prod",(function(){return s.prod})),n.d(t,"rand",(function(){return s.rand})),n.d(t,"randomGamma",(function(){return s.randomGamma})),n.d(t,"randomNormal",(function(){return s.randomNormal})),n.d(t,"randomUniform",(function(){return s.randomUniform})),n.d(t,"range",(function(){return s.range})),n.d(t,"real",(function(){return s.real})),n.d(t,"reciprocal",(function(){return s.reciprocal})),n.d(t,"relu",(function(){return s.relu})),n.d(t,"relu6",(function(){return s.relu6})),n.d(t,"reshape",(function(){return s.reshape})),n.d(t,"reverse",(function(){return s.reverse})),n.d(t,"reverse1d",(function(){return s.reverse1d})),n.d(t,"reverse2d",(function(){return s.reverse2d})),n.d(t,"reverse3d",(function(){return s.reverse3d})),n.d(t,"reverse4d",(function(){return s.reverse4d})),n.d(t,"round",(function(){return s.round})),n.d(t,"rsqrt",(function(){return s.rsqrt})),n.d(t,"scalar",(function(){return s.scalar})),n.d(t,"selu",(function(){return s.selu})),n.d(t,"separableConv2d",(function(){return s.separableConv2d})),n.d(t,"setdiff1dAsync",(function(){return s.setdiff1dAsync})),n.d(t,"sigmoid",(function(){return s.sigmoid})),n.d(t,"sign",(function(){return s.sign})),n.d(t,"sin",(function(){return s.sin})),n.d(t,"sinh",(function(){return s.sinh})),n.d(t,"slice",(function(){return s.slice})),n.d(t,"slice1d",(function(){return s.slice1d})),n.d(t,"slice2d",(function(){return s.slice2d})),n.d(t,"slice3d",(function(){return s.slice3d})),n.d(t,"slice4d",(function(){return s.slice4d})),n.d(t,"softmax",(function(){return s.softmax})),n.d(t,"softplus",(function(){return s.softplus})),n.d(t,"spaceToBatchND",(function(){return s.spaceToBatchND})),n.d(t,"fft",(function(){return s.fft})),n.d(t,"ifft",(function(){return s.ifft})),n.d(t,"irfft",(function(){return s.irfft})),n.d(t,"rfft",(function(){return s.rfft})),n.d(t,"split",(function(){return s.split})),n.d(t,"sqrt",(function(){return s.sqrt})),n.d(t,"square",(function(){return s.square})),n.d(t,"squaredDifference",(function(){return s.squaredDifference})),n.d(t,"squeeze",(function(){return s.squeeze})),n.d(t,"stack",(function(){return s.stack})),n.d(t,"step",(function(){return s.step})),n.d(t,"stridedSlice",(function(){return s.stridedSlice})),n.d(t,"sub",(function(){return s.sub})),n.d(t,"sum",(function(){return s.sum})),n.d(t,"tan",(function(){return s.tan})),n.d(t,"tanh",(function(){return s.tanh})),n.d(t,"tensor",(function(){return s.tensor})),n.d(t,"tensor1d",(function(){return s.tensor1d})),n.d(t,"tensor2d",(function(){return s.tensor2d})),n.d(t,"tensor3d",(function(){return s.tensor3d})),n.d(t,"tensor4d",(function(){return s.tensor4d})),n.d(t,"tensor5d",(function(){return s.tensor5d})),n.d(t,"tensor6d",(function(){return s.tensor6d})),n.d(t,"tile",(function(){return s.tile})),n.d(t,"topk",(function(){return s.topk})),n.d(t,"truncatedNormal",(function(){return s.truncatedNormal})),n.d(t,"unique",(function(){return s.unique})),n.d(t,"unsortedSegmentSum",(function(){return s.unsortedSegmentSum})),n.d(t,"unstack",(function(){return s.unstack})),n.d(t,"variable",(function(){return s.variable})),n.d(t,"where",(function(){return s.where})),n.d(t,"whereAsync",(function(){return s.whereAsync})),n.d(t,"zeros",(function(){return s.zeros})),n.d(t,"zerosLike",(function(){return s.zerosLike})),n.d(t,"booleanMaskAsync",(function(){return s.booleanMaskAsync})),n.d(t,"transpose",(function(){return s.transpose})),n.d(t,"norm",(function(){return s.norm})),n.d(t,"movingAverage",(function(){return s.movingAverage})),n.d(t,"scatterND",(function(){return s.scatterND})),n.d(t,"sparseToDense",(function(){return s.sparseToDense})),n.d(t,"gatherND",(function(){return s.gatherND})),n.d(t,"dropout",(function(){return s.dropout})),n.d(t,"enclosingPowerOfTwo",(function(){return s.enclosingPowerOfTwo})),n.d(t,"cosineWindow",(function(){return s.cosineWindow})),n.d(t,"inTopKAsync",(function(){return s.inTopKAsync})),n.d(t,"op",(function(){return s.op})),n.d(t,"OP_SCOPE_SUFFIX",(function(){return s.OP_SCOPE_SUFFIX})),n.d(t,"image",(function(){return s.image})),n.d(t,"linalg",(function(){return s.linalg})),n.d(t,"losses",(function(){return s.losses})),n.d(t,"spectral",(function(){return s.spectral})),n.d(t,"fused",(function(){return s.fused})),n.d(t,"signal",(function(){return s.signal})),n.d(t,"sparse",(function(){return s.sparse})),n.d(t,"string",(function(){return s.string})),n.d(t,"Reduction",(function(){return s.Reduction})),n.d(t,"train",(function(){return s.train})),n.d(t,"enableProdMode",(function(){return s.enableProdMode})),n.d(t,"enableDebugMode",(function(){return s.enableDebugMode})),n.d(t,"disableDeprecationWarnings",(function(){return s.disableDeprecationWarnings})),n.d(t,"deprecationWarn",(function(){return s.deprecationWarn})),n.d(t,"disposeVariables",(function(){return s.disposeVariables})),n.d(t,"engine",(function(){return s.engine})),n.d(t,"memory",(function(){return s.memory})),n.d(t,"profile",(function(){return s.profile})),n.d(t,"tidy",(function(){return s.tidy})),n.d(t,"dispose",(function(){return s.dispose})),n.d(t,"keep",(function(){return s.keep})),n.d(t,"time",(function(){return s.time})),n.d(t,"setBackend",(function(){return s.setBackend})),n.d(t,"ready",(function(){return s.ready})),n.d(t,"getBackend",(function(){return s.getBackend})),n.d(t,"removeBackend",(function(){return s.removeBackend})),n.d(t,"findBackend",(function(){return s.findBackend})),n.d(t,"findBackendFactory",(function(){return s.findBackendFactory})),n.d(t,"registerBackend",(function(){return s.registerBackend})),n.d(t,"backend",(function(){return s.backend})),n.d(t,"setPlatform",(function(){return s.setPlatform})),n.d(t,"getKernel",(function(){return s.getKernel})),n.d(t,"getGradient",(function(){return s.getGradient})),n.d(t,"getKernelsForBackend",(function(){return s.getKernelsForBackend})),n.d(t,"registerKernel",(function(){return s.registerKernel})),n.d(t,"registerGradient",(function(){return s.registerGradient})),n.d(t,"unregisterKernel",(function(){return s.unregisterKernel})),n.d(t,"unregisterGradient",(function(){return s.unregisterGradient})),n.d(t,"copyRegisteredKernels",(function(){return s.copyRegisteredKernels})),n.d(t,"customGrad",(function(){return s.customGrad})),n.d(t,"grad",(function(){return s.grad})),n.d(t,"grads",(function(){return s.grads})),n.d(t,"valueAndGrad",(function(){return s.valueAndGrad})),n.d(t,"valueAndGrads",(function(){return s.valueAndGrads})),n.d(t,"variableGrads",(function(){return s.variableGrads})),n.d(t,"Environment",(function(){return s.Environment})),n.d(t,"env",(function(){return s.env})),n.d(t,"ENV",(function(){return s.ENV})),n.d(t,"version_core",(function(){return s.version_core})),n.d(t,"nextFrame",(function(){return s.nextFrame})),n.d(t,"browser",(function(){return s.browser})),n.d(t,"io",(function(){return s.io})),n.d(t,"math",(function(){return s.math})),n.d(t,"serialization",(function(){return s.serialization})),n.d(t,"test_util",(function(){return s.test_util})),n.d(t,"util",(function(){return s.util})),n.d(t,"backend_util",(function(){return s.backend_util})),n.d(t,"tensor_util",(function(){return s.tensor_util})),n.d(t,"slice_util",(function(){return s.slice_util})),n.d(t,"gather_util",(function(){return s.gather_util})),n.d(t,"scatter_util",(function(){return s.scatter_util})),n.d(t,"device_util",(function(){return s.device_util})),n.d(t,"kernel_impls",(function(){return s.kernel_impls})),n.d(t,"KernelBackend",(function(){return s.KernelBackend})),n.d(t,"DataStorage",(function(){return s.DataStorage})),n.d(t,"Abs",(function(){return s.Abs})),n.d(t,"Acos",(function(){return s.Acos})),n.d(t,"Acosh",(function(){return s.Acosh})),n.d(t,"Add",(function(){return s.Add})),n.d(t,"AddN",(function(){return s.AddN})),n.d(t,"All",(function(){return s.All})),n.d(t,"Any",(function(){return s.Any})),n.d(t,"ArgMax",(function(){return s.ArgMax})),n.d(t,"ArgMin",(function(){return s.ArgMin})),n.d(t,"Asin",(function(){return s.Asin})),n.d(t,"Asinh",(function(){return s.Asinh})),n.d(t,"Atan",(function(){return s.Atan})),n.d(t,"Atanh",(function(){return s.Atanh})),n.d(t,"Atan2",(function(){return s.Atan2})),n.d(t,"AvgPool",(function(){return s.AvgPool})),n.d(t,"AvgPoolGrad",(function(){return s.AvgPoolGrad})),n.d(t,"AvgPool3D",(function(){return s.AvgPool3D})),n.d(t,"AvgPool3DGrad",(function(){return s.AvgPool3DGrad})),n.d(t,"BatchMatMul",(function(){return s.BatchMatMul})),n.d(t,"BatchToSpaceND",(function(){return s.BatchToSpaceND})),n.d(t,"Bincount",(function(){return s.Bincount})),n.d(t,"BroadcastTo",(function(){return s.BroadcastTo})),n.d(t,"Cast",(function(){return s.Cast})),n.d(t,"Ceil",(function(){return s.Ceil})),n.d(t,"ClipByValue",(function(){return s.ClipByValue})),n.d(t,"Complex",(function(){return s.Complex})),n.d(t,"ComplexAbs",(function(){return s.ComplexAbs})),n.d(t,"Concat",(function(){return s.Concat})),n.d(t,"Conv2D",(function(){return s.Conv2D})),n.d(t,"Conv2DBackpropFilter",(function(){return s.Conv2DBackpropFilter})),n.d(t,"Conv2DBackpropInput",(function(){return s.Conv2DBackpropInput})),n.d(t,"Conv3D",(function(){return s.Conv3D})),n.d(t,"Conv3DBackpropFilterV2",(function(){return s.Conv3DBackpropFilterV2})),n.d(t,"Conv3DBackpropInputV2",(function(){return s.Conv3DBackpropInputV2})),n.d(t,"Cos",(function(){return s.Cos})),n.d(t,"Cosh",(function(){return s.Cosh})),n.d(t,"Cumsum",(function(){return s.Cumsum})),n.d(t,"CropAndResize",(function(){return s.CropAndResize})),n.d(t,"DenseBincount",(function(){return s.DenseBincount})),n.d(t,"DepthToSpace",(function(){return s.DepthToSpace})),n.d(t,"DepthwiseConv2dNative",(function(){return s.DepthwiseConv2dNative})),n.d(t,"DepthwiseConv2dNativeBackpropFilter",(function(){return s.DepthwiseConv2dNativeBackpropFilter})),n.d(t,"DepthwiseConv2dNativeBackpropInput",(function(){return s.DepthwiseConv2dNativeBackpropInput})),n.d(t,"Diag",(function(){return s.Diag})),n.d(t,"Dilation2D",(function(){return s.Dilation2D})),n.d(t,"Dilation2DBackpropInput",(function(){return s.Dilation2DBackpropInput})),n.d(t,"Dilation2DBackpropFilter",(function(){return s.Dilation2DBackpropFilter})),n.d(t,"RealDiv",(function(){return s.RealDiv})),n.d(t,"Einsum",(function(){return s.Einsum})),n.d(t,"Elu",(function(){return s.Elu})),n.d(t,"EluGrad",(function(){return s.EluGrad})),n.d(t,"Erf",(function(){return s.Erf})),n.d(t,"Equal",(function(){return s.Equal})),n.d(t,"Exp",(function(){return s.Exp})),n.d(t,"ExpandDims",(function(){return s.ExpandDims})),n.d(t,"Expm1",(function(){return s.Expm1})),n.d(t,"FFT",(function(){return s.FFT})),n.d(t,"Fill",(function(){return s.Fill})),n.d(t,"FlipLeftRight",(function(){return s.FlipLeftRight})),n.d(t,"Floor",(function(){return s.Floor})),n.d(t,"FloorDiv",(function(){return s.FloorDiv})),n.d(t,"FusedBatchNorm",(function(){return s.FusedBatchNorm})),n.d(t,"GatherV2",(function(){return s.GatherV2})),n.d(t,"GatherNd",(function(){return s.GatherNd})),n.d(t,"Greater",(function(){return s.Greater})),n.d(t,"GreaterEqual",(function(){return s.GreaterEqual})),n.d(t,"Identity",(function(){return s.Identity})),n.d(t,"IFFT",(function(){return s.IFFT})),n.d(t,"Imag",(function(){return s.Imag})),n.d(t,"IsFinite",(function(){return s.IsFinite})),n.d(t,"IsInf",(function(){return s.IsInf})),n.d(t,"IsNan",(function(){return s.IsNan})),n.d(t,"LeakyRelu",(function(){return s.LeakyRelu})),n.d(t,"Less",(function(){return s.Less})),n.d(t,"LessEqual",(function(){return s.LessEqual})),n.d(t,"LinSpace",(function(){return s.LinSpace})),n.d(t,"Log",(function(){return s.Log})),n.d(t,"Log1p",(function(){return s.Log1p})),n.d(t,"LogicalAnd",(function(){return s.LogicalAnd})),n.d(t,"LogicalNot",(function(){return s.LogicalNot})),n.d(t,"LogicalOr",(function(){return s.LogicalOr})),n.d(t,"LogSoftmax",(function(){return s.LogSoftmax})),n.d(t,"LRN",(function(){return s.LRN})),n.d(t,"LRNGrad",(function(){return s.LRNGrad})),n.d(t,"Max",(function(){return s.Max})),n.d(t,"Maximum",(function(){return s.Maximum})),n.d(t,"MaxPool",(function(){return s.MaxPool})),n.d(t,"MaxPoolGrad",(function(){return s.MaxPoolGrad})),n.d(t,"MaxPool3D",(function(){return s.MaxPool3D})),n.d(t,"MaxPool3DGrad",(function(){return s.MaxPool3DGrad})),n.d(t,"MaxPoolWithArgmax",(function(){return s.MaxPoolWithArgmax})),n.d(t,"Mean",(function(){return s.Mean})),n.d(t,"Min",(function(){return s.Min})),n.d(t,"Minimum",(function(){return s.Minimum})),n.d(t,"MirrorPad",(function(){return s.MirrorPad})),n.d(t,"Mod",(function(){return s.Mod})),n.d(t,"Multinomial",(function(){return s.Multinomial})),n.d(t,"Multiply",(function(){return s.Multiply})),n.d(t,"Neg",(function(){return s.Neg})),n.d(t,"NotEqual",(function(){return s.NotEqual})),n.d(t,"NonMaxSuppressionV3",(function(){return s.NonMaxSuppressionV3})),n.d(t,"NonMaxSuppressionV4",(function(){return s.NonMaxSuppressionV4})),n.d(t,"NonMaxSuppressionV5",(function(){return s.NonMaxSuppressionV5})),n.d(t,"OnesLike",(function(){return s.OnesLike})),n.d(t,"OneHot",(function(){return s.OneHot})),n.d(t,"Pack",(function(){return s.Pack})),n.d(t,"PadV2",(function(){return s.PadV2})),n.d(t,"Pool",(function(){return s.Pool})),n.d(t,"Pow",(function(){return s.Pow})),n.d(t,"Prelu",(function(){return s.Prelu})),n.d(t,"Prod",(function(){return s.Prod})),n.d(t,"Range",(function(){return s.Range})),n.d(t,"Real",(function(){return s.Real})),n.d(t,"Reciprocal",(function(){return s.Reciprocal})),n.d(t,"Relu",(function(){return s.Relu})),n.d(t,"Reshape",(function(){return s.Reshape})),n.d(t,"ResizeNearestNeighbor",(function(){return s.ResizeNearestNeighbor})),n.d(t,"ResizeNearestNeighborGrad",(function(){return s.ResizeNearestNeighborGrad})),n.d(t,"ResizeBilinear",(function(){return s.ResizeBilinear})),n.d(t,"ResizeBilinearGrad",(function(){return s.ResizeBilinearGrad})),n.d(t,"Relu6",(function(){return s.Relu6})),n.d(t,"Reverse",(function(){return s.Reverse})),n.d(t,"Round",(function(){return s.Round})),n.d(t,"Rsqrt",(function(){return s.Rsqrt})),n.d(t,"ScatterNd",(function(){return s.ScatterNd})),n.d(t,"Select",(function(){return s.Select})),n.d(t,"Selu",(function(){return s.Selu})),n.d(t,"Slice",(function(){return s.Slice})),n.d(t,"Sin",(function(){return s.Sin})),n.d(t,"Sinh",(function(){return s.Sinh})),n.d(t,"Sign",(function(){return s.Sign})),n.d(t,"Sigmoid",(function(){return s.Sigmoid})),n.d(t,"Softplus",(function(){return s.Softplus})),n.d(t,"Sqrt",(function(){return s.Sqrt})),n.d(t,"Sum",(function(){return s.Sum})),n.d(t,"SpaceToBatchND",(function(){return s.SpaceToBatchND})),n.d(t,"SplitV",(function(){return s.SplitV})),n.d(t,"Softmax",(function(){return s.Softmax})),n.d(t,"SparseFillEmptyRows",(function(){return s.SparseFillEmptyRows})),n.d(t,"SparseReshape",(function(){return s.SparseReshape})),n.d(t,"SparseSegmentMean",(function(){return s.SparseSegmentMean})),n.d(t,"SparseSegmentSum",(function(){return s.SparseSegmentSum})),n.d(t,"SparseToDense",(function(){return s.SparseToDense})),n.d(t,"SquaredDifference",(function(){return s.SquaredDifference})),n.d(t,"Square",(function(){return s.Square})),n.d(t,"StridedSlice",(function(){return s.StridedSlice})),n.d(t,"StringNGrams",(function(){return s.StringNGrams})),n.d(t,"StringSplit",(function(){return s.StringSplit})),n.d(t,"StringToHashBucketFast",(function(){return s.StringToHashBucketFast})),n.d(t,"Sub",(function(){return s.Sub})),n.d(t,"Tan",(function(){return s.Tan})),n.d(t,"Tanh",(function(){return s.Tanh})),n.d(t,"Tile",(function(){return s.Tile})),n.d(t,"TopK",(function(){return s.TopK})),n.d(t,"Transform",(function(){return s.Transform})),n.d(t,"Transpose",(function(){return s.Transpose})),n.d(t,"Unique",(function(){return s.Unique})),n.d(t,"Unpack",(function(){return s.Unpack})),n.d(t,"UnsortedSegmentSum",(function(){return s.UnsortedSegmentSum})),n.d(t,"ZerosLike",(function(){return s.ZerosLike})),n.d(t,"Step",(function(){return s.Step})),n.d(t,"FromPixels",(function(){return s.FromPixels})),n.d(t,"RotateWithOffset",(function(){return s.RotateWithOffset})),n.d(t,"_FusedMatMul",(function(){return s._FusedMatMul})),n.d(t,"FusedConv2D",(function(){return s.FusedConv2D})),n.d(t,"FusedDepthwiseConv2D",(function(){return s.FusedDepthwiseConv2D}))},"./node_modules/@tensorflow/tfjs-core/dist/io/browser_files.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/io/browser_files.js ***! + \*********************************************************************/ +/*! exports provided: BrowserDownloads, browserDownloadsRouter, browserDownloads, browserFiles */function(e,t,n){"use strict";n.r(t),n.d(t,"BrowserDownloads",(function(){return a})),n.d(t,"browserDownloadsRouter",(function(){return u})),n.d(t,"browserDownloads",(function(){return l})),n.d(t,"browserFiles",(function(){return c}));n(/*! ../flags */"./node_modules/@tensorflow/tfjs-core/dist/flags.js");var s=n(/*! ../environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"),o=n(/*! ./io_utils */"./node_modules/@tensorflow/tfjs-core/dist/io/io_utils.js"),r=n(/*! ./router_registry */"./node_modules/@tensorflow/tfjs-core/dist/io/router_registry.js");function i(e){return new Promise((e=>setTimeout(e))).then(e)}class a{constructor(e){if(!Object(s.env)().getBool("IS_BROWSER"))throw new Error("browserDownloads() cannot proceed because the current environment is not a browser.");e.startsWith(a.URL_SCHEME)&&(e=e.slice(a.URL_SCHEME.length)),null!=e&&0!==e.length||(e="model"),this.modelJsonFileName=e+".json",this.weightDataFileName=e+".weights.bin"}async save(e){if("undefined"==typeof document)throw new Error("Browser downloads are not supported in this environment since `document` is not present");const t=window.URL.createObjectURL(new Blob([e.weightData],{type:"application/octet-stream"}));if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserDownloads.save() does not support saving model topology in binary formats yet.");{const n=[{paths:["./"+this.weightDataFileName],weights:e.weightSpecs}],s=Object(o.getModelJSONForModelArtifacts)(e,n),r=window.URL.createObjectURL(new Blob([JSON.stringify(s)],{type:"application/json"})),a=null==this.modelJsonAnchor?document.createElement("a"):this.modelJsonAnchor;if(a.download=this.modelJsonFileName,a.href=r,await i((()=>a.dispatchEvent(new MouseEvent("click")))),null!=e.weightData){const e=null==this.weightDataAnchor?document.createElement("a"):this.weightDataAnchor;e.download=this.weightDataFileName,e.href=t,await i((()=>e.dispatchEvent(new MouseEvent("click"))))}return{modelArtifactsInfo:Object(o.getModelArtifactsInfoForJSON)(e)}}}}a.URL_SCHEME="downloads://";class d{constructor(e){if(null==e||e.length<1)throw new Error(`When calling browserFiles, at least 1 file is required, but received ${e}`);this.jsonFile=e[0],this.weightsFiles=e.slice(1)}async load(){return new Promise(((e,t)=>{const n=new FileReader;n.onload=n=>{const s=JSON.parse(n.target.result),r=s.modelTopology;if(null==r)return void t(new Error(`modelTopology field is missing from file ${this.jsonFile.name}`));if(null==s.weightsManifest)return void t(new Error(`weightManifest field is missing from file ${this.jsonFile.name}`));if(0===this.weightsFiles.length)return void e({modelTopology:r});const i=Object(o.getModelArtifactsForJSON)(s,(e=>this.loadWeights(e)));e(i)},n.onerror=e=>t(`Failed to read model topology and weights manifest JSON from file '${this.jsonFile.name}'. BrowserFiles supports loading Keras-style tf.Model artifacts only.`),n.readAsText(this.jsonFile)}))}loadWeights(e){const t=[],n=[];for(const s of e)t.push(...s.weights),n.push(...s.paths);const s=this.checkManifestAndWeightFiles(e),r=n.map((e=>this.loadWeightsFile(e,s[e])));return Promise.all(r).then((e=>[t,Object(o.concatenateArrayBuffers)(e)]))}loadWeightsFile(e,t){return new Promise(((n,s)=>{const o=new FileReader;o.onload=e=>{const t=e.target.result;n(t)},o.onerror=t=>s(`Failed to weights data from file of path '${e}'.`),o.readAsArrayBuffer(t)}))}checkManifestAndWeightFiles(e){const t=[],n=this.weightsFiles.map((e=>Object(o.basename)(e.name))),s={};for(const r of e)r.paths.forEach((e=>{const r=Object(o.basename)(e);if(-1!==t.indexOf(r))throw new Error(`Duplicate file basename found in weights manifest: '${r}'`);if(t.push(r),-1===n.indexOf(r))throw new Error(`Weight file with basename '${r}' is not provided.`);s[e]=this.weightsFiles[n.indexOf(r)]}));if(t.length!==this.weightsFiles.length)throw new Error(`Mismatch in the number of files in weights manifest (${t.length}) and the number of weight files provided (${this.weightsFiles.length}).`);return s}}const u=e=>Object(s.env)().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(a.URL_SCHEME)?l(e.slice(a.URL_SCHEME.length)):null;function l(e="model"){return new a(e)}function c(e){return new d(e)}r.IORouterRegistry.registerSaveRouter(u)},"./node_modules/@tensorflow/tfjs-core/dist/io/http.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/io/http.js ***! + \************************************************************/ +/*! exports provided: HTTPRequest, parseUrl, isHTTPScheme, httpRouter, http, browserHTTPRequest */function(e,t,n){"use strict";n.r(t),n.d(t,"HTTPRequest",(function(){return d})),n.d(t,"parseUrl",(function(){return u})),n.d(t,"isHTTPScheme",(function(){return l})),n.d(t,"httpRouter",(function(){return c})),n.d(t,"http",(function(){return f})),n.d(t,"browserHTTPRequest",(function(){return p}));var s=n(/*! ../environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./io_utils */"./node_modules/@tensorflow/tfjs-core/dist/io/io_utils.js"),i=n(/*! ./router_registry */"./node_modules/@tensorflow/tfjs-core/dist/io/router_registry.js"),a=n(/*! ./weights_loader */"./node_modules/@tensorflow/tfjs-core/dist/io/weights_loader.js");class d{constructor(e,t){if(this.DEFAULT_METHOD="POST",null==t&&(t={}),this.weightPathPrefix=t.weightPathPrefix,this.onProgress=t.onProgress,this.weightUrlConverter=t.weightUrlConverter,null!=t.fetchFunc?(Object(o.assert)("function"==typeof t.fetchFunc,(()=>"Must pass a function that matches the signature of `fetch` (see https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)")),this.fetch=t.fetchFunc):this.fetch=Object(s.env)().platform.fetch,Object(o.assert)(null!=e&&e.length>0,(()=>"URL path for http must not be null, undefined or empty.")),Array.isArray(e)&&Object(o.assert)(2===e.length,(()=>`URL paths for http must have a length of 2, (actual length is ${e.length}).`)),this.path=e,null!=t.requestInit&&null!=t.requestInit.body)throw new Error("requestInit is expected to have no pre-existing body, but has one.");this.requestInit=t.requestInit||{}}async save(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserHTTPRequest.save() does not support saving model topology in binary formats yet.");const t=Object.assign({method:this.DEFAULT_METHOD},this.requestInit);t.body=new FormData;const n=[{paths:["./model.weights.bin"],weights:e.weightSpecs}],s=Object(r.getModelJSONForModelArtifacts)(e,n);t.body.append("model.json",new Blob([JSON.stringify(s)],{type:"application/json"}),"model.json"),null!=e.weightData&&t.body.append("model.weights.bin",new Blob([e.weightData],{type:"application/octet-stream"}),"model.weights.bin");const o=await this.fetch(this.path,t);if(o.ok)return{modelArtifactsInfo:Object(r.getModelArtifactsInfoForJSON)(e),responses:[o]};throw new Error(`BrowserHTTPRequest.save() failed due to HTTP response status ${o.status}.`)}async load(){const e=await this.fetch(this.path,this.requestInit);if(!e.ok)throw new Error(`Request to ${this.path} failed with status code ${e.status}. Please verify this URL points to the model JSON of the model to load.`);let t;try{t=await e.json()}catch(e){let t=`Failed to parse model JSON of response from ${this.path}.`;throw this.path.endsWith(".pb")?t+=" Your path contains a .pb file extension. Support for .pb models have been removed in TensorFlow.js 1.0 in favor of .json models. You can re-convert your Python TensorFlow model using the TensorFlow.js 1.0 conversion scripts or you can convert your.pb models with the 'pb2json'NPM script in the tensorflow/tfjs-converter repository.":t+=" Please make sure the server is serving valid JSON for this request.",new Error(t)}const n=t.modelTopology,s=t.weightsManifest;if(null==n&&null==s)throw new Error(`The JSON from HTTP path ${this.path} contains neither model topology or manifest for weights.`);return Object(r.getModelArtifactsForJSON)(t,(e=>this.loadWeights(e)))}async loadWeights(e){const t=Array.isArray(this.path)?this.path[1]:this.path,[n,s]=u(t),o=this.weightPathPrefix||n,i=[];for(const t of e)i.push(...t.weights);const d=[],l=[];for(const t of e)for(const e of t.paths)null!=this.weightUrlConverter?l.push(this.weightUrlConverter(e)):d.push(o+e+s);this.weightUrlConverter&&d.push(...await Promise.all(l));const c=await Object(a.loadWeightsAsArrayBuffer)(d,{requestInit:this.requestInit,fetchFunc:this.fetch,onProgress:this.onProgress});return[i,Object(r.concatenateArrayBuffers)(c)]}}function u(e){const t=e.lastIndexOf("/"),n=e.lastIndexOf("?");return[e.substring(0,t)+"/",n>t?e.substring(n):""]}function l(e){return null!=e.match(d.URL_SCHEME_REGEX)}d.URL_SCHEME_REGEX=/^https?:\/\//;const c=(e,t)=>{if("undefined"==typeof fetch&&(null==t||null==t.fetchFunc))return null;{let n=!0;if(n=Array.isArray(e)?e.every((e=>l(e))):l(e),n)return f(e,t)}return null};function f(e,t){return new d(e,t)}function p(e,t){return f(e,t)}i.IORouterRegistry.registerSaveRouter(c),i.IORouterRegistry.registerLoadRouter(c)},"./node_modules/@tensorflow/tfjs-core/dist/io/indexed_db.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/io/indexed_db.js ***! + \******************************************************************/ +/*! exports provided: deleteDatabase, BrowserIndexedDB, indexedDBRouter, browserIndexedDB, BrowserIndexedDBManager */function(e,t,n){"use strict";n.r(t),n.d(t,"deleteDatabase",(function(){return u})),n.d(t,"BrowserIndexedDB",(function(){return f})),n.d(t,"indexedDBRouter",(function(){return p})),n.d(t,"browserIndexedDB",(function(){return m})),n.d(t,"BrowserIndexedDBManager",(function(){return h}));n(/*! ../flags */"./node_modules/@tensorflow/tfjs-core/dist/flags.js");var s=n(/*! ../environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"),o=n(/*! ./io_utils */"./node_modules/@tensorflow/tfjs-core/dist/io/io_utils.js"),r=n(/*! ./router_registry */"./node_modules/@tensorflow/tfjs-core/dist/io/router_registry.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i="tensorflowjs",a="models_store",d="model_info_store";async function u(){const e=l();return new Promise(((t,n)=>{const s=e.deleteDatabase(i);s.onsuccess=()=>t(),s.onerror=e=>n(e)}))}function l(){if(!Object(s.env)().getBool("IS_BROWSER"))throw new Error("Failed to obtain IndexedDB factory because the current environmentis not a web browser.");const e="undefined"==typeof window?self:window,t=e.indexedDB||e.mozIndexedDB||e.webkitIndexedDB||e.msIndexedDB||e.shimIndexedDB;if(null==t)throw new Error("The current browser does not appear to support IndexedDB.");return t}function c(e){const t=e.result;t.createObjectStore(a,{keyPath:"modelPath"}),t.createObjectStore(d,{keyPath:"modelPath"})}class f{constructor(e){if(this.indexedDB=l(),null==e||!e)throw new Error("For IndexedDB, modelPath must not be null, undefined or empty.");this.modelPath=e}async save(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserLocalStorage.save() does not support saving model topology in binary formats yet.");return this.databaseAction(this.modelPath,e)}async load(){return this.databaseAction(this.modelPath)}databaseAction(e,t){return new Promise(((e,n)=>{const s=this.indexedDB.open(i,1);s.onupgradeneeded=()=>c(s),s.onsuccess=()=>{const r=s.result;if(null==t){const t=r.transaction(a,"readonly"),s=t.objectStore(a).get(this.modelPath);s.onsuccess=()=>{if(null==s.result)return r.close(),n(new Error(`Cannot find model with path '${this.modelPath}' in IndexedDB.`));e(s.result.modelArtifacts)},s.onerror=e=>(r.close(),n(s.error)),t.oncomplete=()=>r.close()}else{const s=Object(o.getModelArtifactsInfoForJSON)(t),i=r.transaction(d,"readwrite");let u=i.objectStore(d);const l=u.put({modelPath:this.modelPath,modelArtifactsInfo:s});let c;l.onsuccess=()=>{c=r.transaction(a,"readwrite");const o=c.objectStore(a).put({modelPath:this.modelPath,modelArtifacts:t,modelArtifactsInfo:s});o.onsuccess=()=>e({modelArtifactsInfo:s}),o.onerror=e=>{u=i.objectStore(d);const t=u.delete(this.modelPath);t.onsuccess=()=>(r.close(),n(o.error)),t.onerror=e=>(r.close(),n(o.error))}},l.onerror=e=>(r.close(),n(l.error)),i.oncomplete=()=>{null==c?r.close():c.oncomplete=()=>r.close()}}},s.onerror=e=>n(s.error)}))}}f.URL_SCHEME="indexeddb://";const p=e=>Object(s.env)().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(f.URL_SCHEME)?m(e.slice(f.URL_SCHEME.length)):null;function m(e){return new f(e)}r.IORouterRegistry.registerSaveRouter(p),r.IORouterRegistry.registerLoadRouter(p);class h{constructor(){this.indexedDB=l()}async listModels(){return new Promise(((e,t)=>{const n=this.indexedDB.open(i,1);n.onupgradeneeded=()=>c(n),n.onsuccess=()=>{const s=n.result,o=s.transaction(d,"readonly"),r=o.objectStore(d).getAll();r.onsuccess=()=>{const t={};for(const e of r.result)t[e.modelPath]=e.modelArtifactsInfo;e(t)},r.onerror=e=>(s.close(),t(r.error)),o.oncomplete=()=>s.close()},n.onerror=e=>t(n.error)}))}async removeModel(e){var t;return e=(t=e).startsWith(f.URL_SCHEME)?t.slice(f.URL_SCHEME.length):t,new Promise(((t,n)=>{const s=this.indexedDB.open(i,1);s.onupgradeneeded=()=>c(s),s.onsuccess=()=>{const o=s.result,r=o.transaction(d,"readwrite"),i=r.objectStore(d),u=i.get(e);let l;u.onsuccess=()=>{if(null==u.result)return o.close(),n(new Error(`Cannot find model with path '${e}' in IndexedDB.`));{const s=i.delete(e),r=()=>{l=o.transaction(a,"readwrite");const s=l.objectStore(a).delete(e);s.onsuccess=()=>t(u.result.modelArtifactsInfo),s.onerror=e=>n(u.error)};s.onsuccess=r,s.onerror=e=>(r(),o.close(),n(u.error))}},u.onerror=e=>(o.close(),n(u.error)),r.oncomplete=()=>{null==l?o.close():l.oncomplete=()=>o.close()}},s.onerror=e=>n(s.error)}))}}},"./node_modules/@tensorflow/tfjs-core/dist/io/io.js": +/*!**********************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/io/io.js ***! + \**********************************************************/ +/*! exports provided: copyModel, listModels, moveModel, removeModel, browserFiles, browserHTTPRequest, concatenateArrayBuffers, decodeWeights, encodeWeights, fromMemory, getLoadHandlers, getModelArtifactsForJSON, getModelArtifactsInfoForJSON, getSaveHandlers, http, isHTTPScheme, loadWeights, registerLoadRouter, registerSaveRouter, weightsLoaderFactory, withSaveHandler */function(e,t,n){"use strict";n.r(t);n(/*! ./indexed_db */"./node_modules/@tensorflow/tfjs-core/dist/io/indexed_db.js"),n(/*! ./local_storage */"./node_modules/@tensorflow/tfjs-core/dist/io/local_storage.js");var s=n(/*! ./browser_files */"./node_modules/@tensorflow/tfjs-core/dist/io/browser_files.js");n.d(t,"browserFiles",(function(){return s.browserFiles}));var o=n(/*! ./http */"./node_modules/@tensorflow/tfjs-core/dist/io/http.js");n.d(t,"browserHTTPRequest",(function(){return o.browserHTTPRequest})),n.d(t,"http",(function(){return o.http})),n.d(t,"isHTTPScheme",(function(){return o.isHTTPScheme}));var r=n(/*! ./io_utils */"./node_modules/@tensorflow/tfjs-core/dist/io/io_utils.js");n.d(t,"concatenateArrayBuffers",(function(){return r.concatenateArrayBuffers})),n.d(t,"decodeWeights",(function(){return r.decodeWeights})),n.d(t,"encodeWeights",(function(){return r.encodeWeights})),n.d(t,"getModelArtifactsForJSON",(function(){return r.getModelArtifactsForJSON})),n.d(t,"getModelArtifactsInfoForJSON",(function(){return r.getModelArtifactsInfoForJSON}));var i=n(/*! ./passthrough */"./node_modules/@tensorflow/tfjs-core/dist/io/passthrough.js");n.d(t,"fromMemory",(function(){return i.fromMemory})),n.d(t,"withSaveHandler",(function(){return i.withSaveHandler}));var a=n(/*! ./router_registry */"./node_modules/@tensorflow/tfjs-core/dist/io/router_registry.js");n.d(t,"getLoadHandlers",(function(){return a.getLoadHandlers})),n.d(t,"getSaveHandlers",(function(){return a.getSaveHandlers})),n.d(t,"registerLoadRouter",(function(){return a.registerLoadRouter})),n.d(t,"registerSaveRouter",(function(){return a.registerSaveRouter}));var d=n(/*! ./weights_loader */"./node_modules/@tensorflow/tfjs-core/dist/io/weights_loader.js");n.d(t,"loadWeights",(function(){return d.loadWeights})),n.d(t,"weightsLoaderFactory",(function(){return d.weightsLoaderFactory}));var u=n(/*! ./model_management */"./node_modules/@tensorflow/tfjs-core/dist/io/model_management.js");n.d(t,"copyModel",(function(){return u.copyModel})),n.d(t,"listModels",(function(){return u.listModels})),n.d(t,"moveModel",(function(){return u.moveModel})),n.d(t,"removeModel",(function(){return u.removeModel}))},"./node_modules/@tensorflow/tfjs-core/dist/io/io_utils.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/io/io_utils.js ***! + \****************************************************************/ +/*! exports provided: encodeWeights, decodeWeights, concatenateTypedArrays, stringByteLength, arrayBufferToBase64String, base64StringToArrayBuffer, concatenateArrayBuffers, basename, getModelJSONForModelArtifacts, getModelArtifactsForJSON, getModelArtifactsInfoForJSON, getFloat16Decoder */function(e,t,n){"use strict";n.r(t),function(e){n.d(t,"encodeWeights",(function(){return a})),n.d(t,"decodeWeights",(function(){return d})),n.d(t,"concatenateTypedArrays",(function(){return u})),n.d(t,"stringByteLength",(function(){return c})),n.d(t,"arrayBufferToBase64String",(function(){return f})),n.d(t,"base64StringToArrayBuffer",(function(){return p})),n.d(t,"concatenateArrayBuffers",(function(){return m})),n.d(t,"basename",(function(){return h})),n.d(t,"getModelJSONForModelArtifacts",(function(){return b})),n.d(t,"getModelArtifactsForJSON",(function(){return j})),n.d(t,"getModelArtifactsInfoForJSON",(function(){return g})),n.d(t,"getFloat16Decoder",(function(){return w}));var s=n(/*! ../ops/complex */"./node_modules/@tensorflow/tfjs-core/dist/ops/complex.js"),o=n(/*! ../ops/tensor */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor.js"),r=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),i=n(/*! ./types */"./node_modules/@tensorflow/tfjs-core/dist/io/types.js");async function a(e,t){const n=[],s=[],o=Array.isArray(e)?e.map((e=>e.name)):Object.keys(e);for(let r=0;r{const t=await a.bytes(),n=t.reduce(((e,t)=>e+t.length),0)+4*t.length,s=new Uint8Array(n);let o=0;for(let e=0;e{if(t+=e.byteLength,n.push(e.byteLength===e.buffer.byteLength?e:new e.constructor(e)),!(e instanceof Float32Array||e instanceof Int32Array||e instanceof Uint8Array))throw new Error(`Unsupported TypedArray subtype: ${e.constructor.name}`)}));const s=new Uint8Array(t);let o=0;return n.forEach((e=>{s.set(new Uint8Array(e.buffer),o),o+=e.byteLength})),s.buffer}const l="undefined"!=typeof e&&("undefined"==typeof Blob||"undefined"==typeof atob||"undefined"==typeof btoa);function c(t){return l?e.byteLength(t):new Blob([t]).size}function f(t){if(l)return e.from(t).toString("base64");const n=new Uint8Array(t);let s="";for(let e=0,t=n.length;e{t+=e.byteLength}));const n=new Uint8Array(t);let s=0;return e.forEach((e=>{n.set(new Uint8Array(e),s),s+=e.byteLength})),n.buffer}function h(e){for(e=e.trim();e.endsWith("/");)e=e.slice(0,e.length-1);const t=e.split("/");return t[t.length-1]}function b(e,t){const n={modelTopology:e.modelTopology,format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy,weightsManifest:t};return null!=e.signature&&(n.signature=e.signature),null!=e.userDefinedMetadata&&(n.userDefinedMetadata=e.userDefinedMetadata),null!=e.modelInitializer&&(n.modelInitializer=e.modelInitializer),null!=e.trainingConfig&&(n.trainingConfig=e.trainingConfig),n}async function j(e,t){const n={modelTopology:e.modelTopology,format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy};if(null!=e.trainingConfig&&(n.trainingConfig=e.trainingConfig),null!=e.weightsManifest){const[s,o]=await t(e.weightsManifest);n.weightSpecs=s,n.weightData=o}return null!=e.signature&&(n.signature=e.signature),null!=e.userDefinedMetadata&&(n.userDefinedMetadata=e.userDefinedMetadata),null!=e.modelInitializer&&(n.modelInitializer=e.modelInitializer),n}function g(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("Expected JSON model topology, received ArrayBuffer.");return{dateSaved:new Date,modelTopologyType:"JSON",modelTopologyBytes:null==e.modelTopology?0:c(JSON.stringify(e.modelTopology)),weightSpecsBytes:null==e.weightSpecs?0:c(JSON.stringify(e.weightSpecs)),weightDataBytes:null==e.weightData?0:e.weightData.byteLength}}function w(){const e=function(){const e=e=>{let t=e<<13,n=0;for(;0==(8388608&t);)n-=8388608,t<<=1;return t&=-8388609,n+=947912704,t|n},t=new Uint32Array(2048);t[0]=0;for(let n=1;n<1024;n++)t[n]=e(n);for(let e=1024;e<2048;e++)t[e]=939524096+(e-1024<<13);return t}(),t=function(){const e=new Uint32Array(64);e[0]=0,e[31]=1199570944,e[32]=2147483648,e[63]=3347054592;for(let t=1;t<31;t++)e[t]=t<<23;for(let t=33;t<63;t++)e[t]=2147483648+(t-32<<23);return e}(),n=function(){const e=new Uint32Array(64);for(let t=0;t<64;t++)e[t]=1024;return e[0]=e[32]=0,e}();return s=>{const o=new ArrayBuffer(4*s.length),r=new Uint32Array(o);for(let o=0;o>10]+(1023&i)]+t[i>>10];r[o]=a}return new Float32Array(o)}}}.call(this,n(/*! ./../../../../buffer/index.js */"./node_modules/buffer/index.js").Buffer)},"./node_modules/@tensorflow/tfjs-core/dist/io/local_storage.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/io/local_storage.js ***! + \*********************************************************************/ +/*! exports provided: purgeLocalStorageArtifacts, BrowserLocalStorage, localStorageRouter, browserLocalStorage, BrowserLocalStorageManager */function(e,t,n){"use strict";n.r(t),n.d(t,"purgeLocalStorageArtifacts",(function(){return m})),n.d(t,"BrowserLocalStorage",(function(){return g})),n.d(t,"localStorageRouter",(function(){return w})),n.d(t,"browserLocalStorage",(function(){return _})),n.d(t,"BrowserLocalStorageManager",(function(){return k}));n(/*! ../flags */"./node_modules/@tensorflow/tfjs-core/dist/flags.js");var s=n(/*! ../environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./io_utils */"./node_modules/@tensorflow/tfjs-core/dist/io/io_utils.js"),i=n(/*! ./router_registry */"./node_modules/@tensorflow/tfjs-core/dist/io/router_registry.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const a="/",d="tensorflowjs_models",u="info",l="model_topology",c="weight_specs",f="weight_data",p="model_metadata";function m(){if(!Object(s.env)().getBool("IS_BROWSER")||"undefined"==typeof window||"undefined"==typeof window.localStorage)throw new Error("purgeLocalStorageModels() cannot proceed because local storage is unavailable in the current environment.");const e=window.localStorage,t=[];for(let n=0;no.length){e.removeItem(s);const n=j(s);-1===t.indexOf(n)&&t.push(n)}}return t}function h(e){return{info:[d,e,u].join(a),topology:[d,e,l].join(a),weightSpecs:[d,e,c].join(a),weightData:[d,e,f].join(a),modelMetadata:[d,e,p].join(a)}}function b(e){for(const t of Object.values(e))window.localStorage.removeItem(t)}function j(e){const t=e.split(a);if(t.length<3)throw new Error(`Invalid key format: ${e}`);return t.slice(1,t.length-1).join(a)}class g{constructor(e){if(!Object(s.env)().getBool("IS_BROWSER")||"undefined"==typeof window||"undefined"==typeof window.localStorage)throw new Error("The current environment does not support local storage.");if(this.LS=window.localStorage,null==e||!e)throw new Error("For local storage, modelPath must not be null, undefined or empty.");this.modelPath=e,this.keys=h(this.modelPath)}async save(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserLocalStorage.save() does not support saving model topology in binary formats yet.");{const t=JSON.stringify(e.modelTopology),n=JSON.stringify(e.weightSpecs),s=Object(r.getModelArtifactsInfoForJSON)(e);try{this.LS.setItem(this.keys.info,JSON.stringify(s)),this.LS.setItem(this.keys.topology,t),this.LS.setItem(this.keys.weightSpecs,n),this.LS.setItem(this.keys.weightData,Object(r.arrayBufferToBase64String)(e.weightData));const o={format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy,signature:null!=e.signature?e.signature:void 0,userDefinedMetadata:null!=e.userDefinedMetadata?e.userDefinedMetadata:void 0,modelInitializer:null!=e.modelInitializer?e.modelInitializer:void 0,trainingConfig:null!=e.trainingConfig?e.trainingConfig:void 0};return this.LS.setItem(this.keys.modelMetadata,JSON.stringify(o)),{modelArtifactsInfo:s}}catch(e){throw b(this.keys),new Error(`Failed to save model '${this.modelPath}' to local storage: size quota being exceeded is a possible cause of this failure: modelTopologyBytes=${s.modelTopologyBytes}, weightSpecsBytes=${s.weightSpecsBytes}, weightDataBytes=${s.weightDataBytes}.`)}}}async load(){const e=JSON.parse(this.LS.getItem(this.keys.info));if(null==e)throw new Error(`In local storage, there is no model with name '${this.modelPath}'`);if("JSON"!==e.modelTopologyType)throw new Error("BrowserLocalStorage does not support loading non-JSON model topology yet.");const t={},n=JSON.parse(this.LS.getItem(this.keys.topology));if(null==n)throw new Error(`In local storage, the topology of model '${this.modelPath}' is missing.`);t.modelTopology=n;const s=JSON.parse(this.LS.getItem(this.keys.weightSpecs));if(null==s)throw new Error(`In local storage, the weight specs of model '${this.modelPath}' are missing.`);t.weightSpecs=s;const o=this.LS.getItem(this.keys.modelMetadata);if(null!=o){const e=JSON.parse(o);t.format=e.format,t.generatedBy=e.generatedBy,t.convertedBy=e.convertedBy,null!=e.signature&&(t.signature=e.signature),null!=e.userDefinedMetadata&&(t.userDefinedMetadata=e.userDefinedMetadata),null!=e.modelInitializer&&(t.modelInitializer=e.modelInitializer),null!=e.trainingConfig&&(t.trainingConfig=e.trainingConfig)}const i=this.LS.getItem(this.keys.weightData);if(null==i)throw new Error(`In local storage, the binary weight values of model '${this.modelPath}' are missing.`);return t.weightData=Object(r.base64StringToArrayBuffer)(i),t}}g.URL_SCHEME="localstorage://";const w=e=>Object(s.env)().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(g.URL_SCHEME)?_(e.slice(g.URL_SCHEME.length)):null;function _(e){return new g(e)}i.IORouterRegistry.registerSaveRouter(w),i.IORouterRegistry.registerLoadRouter(w);class k{constructor(){Object(o.assert)(Object(s.env)().getBool("IS_BROWSER"),(()=>"Current environment is not a web browser")),Object(o.assert)("undefined"==typeof window||"undefined"!=typeof window.localStorage,(()=>"Current browser does not appear to support localStorage")),this.LS=window.localStorage}async listModels(){const e={},t=d+a,n=a+u;for(let s=0;s"scheme must not be undefined or null.")),e.endsWith(r)&&(e=e.slice(0,e.indexOf(r))),Object(s.assert)(e.length>0,(()=>"scheme must not be an empty string."));const n=i.getInstance();Object(s.assert)(null==n.managers[e],(()=>`A model store manager is already registered for scheme '${e}'.`)),n.managers[e]=t}static getManager(e){const t=this.getInstance().managers[e];if(null==t)throw new Error(`Cannot find model manager for scheme '${e}'`);return t}static getSchemes(){return Object.keys(this.getInstance().managers)}}function a(e){if(-1===e.indexOf(r))throw new Error(`The url string provided does not contain a scheme. Supported schemes are: ${i.getSchemes().join(",")}`);return{scheme:e.split(r)[0],path:e.split(r)[1]}}async function d(e,t,n=!1){Object(s.assert)(e!==t,(()=>`Old path and new path are the same: '${e}'`));const r=o.IORouterRegistry.getLoadHandlers(e);Object(s.assert)(r.length>0,(()=>`Copying failed because no load handler is found for source URL ${e}.`)),Object(s.assert)(r.length<2,(()=>`Copying failed because more than one (${r.length}) load handlers for source URL ${e}.`));const d=r[0],u=o.IORouterRegistry.getSaveHandlers(t);Object(s.assert)(u.length>0,(()=>`Copying failed because no save handler is found for destination URL ${t}.`)),Object(s.assert)(u.length<2,(()=>`Copying failed because more than one (${r.length}) save handlers for destination URL ${t}.`));const l=u[0],c=a(e).scheme,f=a(e).path,p=c===a(e).scheme,m=await d.load();n&&p&&await i.getManager(c).removeModel(f);const h=await l.save(m);return n&&!p&&await i.getManager(c).removeModel(f),h.modelArtifactsInfo}async function u(){const e=i.getSchemes(),t={};for(const n of e){const e=await i.getManager(n).listModels();for(const s in e){t[n+r+s]=e[s]}}return t}async function l(e){const t=a(e);return i.getManager(t.scheme).removeModel(t.path)}async function c(e,t){return d(e,t,!1)}async function f(e,t){return d(e,t,!0)}},"./node_modules/@tensorflow/tfjs-core/dist/io/passthrough.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/io/passthrough.js ***! + \*******************************************************************/ +/*! exports provided: fromMemory, withSaveHandler */function(e,t,n){"use strict";n.r(t),n.d(t,"fromMemory",(function(){return r})),n.d(t,"withSaveHandler",(function(){return i})); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e){this.modelArtifacts=e}async load(){return this.modelArtifacts}}class o{constructor(e){this.saveHandler=e}async save(e){return this.saveHandler(e)}}function r(e,t,n,o){if(1===arguments.length){return null!=e.modelTopology||null!=e.weightSpecs?new s(e):(console.warn("Please call tf.io.fromMemory() with only one argument. The argument should be of type ModelArtifacts. The multi-argument signature of tf.io.fromMemory() has been deprecated and will be removed in a future release."),new s({modelTopology:e}))}return console.warn("Please call tf.io.fromMemory() with only one argument. The argument should be of type ModelArtifacts. The multi-argument signature of tf.io.fromMemory() has been deprecated and will be removed in a future release."),new s({modelTopology:e,weightSpecs:t,weightData:n,trainingConfig:o})}function i(e){return new o(e)}},"./node_modules/@tensorflow/tfjs-core/dist/io/progress.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/io/progress.js ***! + \****************************************************************/ +/*! exports provided: monitorPromisesProgress */function(e,t,n){"use strict";n.r(t),n.d(t,"monitorPromisesProgress",(function(){return o}));var s=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t,n,o){!function(e){Object(s.assert)(null!=e&&Array.isArray(e)&&e.length>0,(()=>"promises must be a none empty array"))}(e),function(e,t){Object(s.assert)(e>=0&&e<=1,(()=>`Progress fraction must be in range [0, 1], but got startFraction ${e}`)),Object(s.assert)(t>=0&&t<=1,(()=>`Progress fraction must be in range [0, 1], but got endFraction ${t}`)),Object(s.assert)(t>=e,(()=>`startFraction must be no more than endFraction, but got startFraction ${e} and endFraction ${t}`))}(n=null==n?0:n,o=null==o?1:o);let r=0;return Promise.all(e.map((s=>(s.then((s=>{const i=n+ ++r/e.length*(o-n);return t(i),s})),s))))}},"./node_modules/@tensorflow/tfjs-core/dist/io/router_registry.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/io/router_registry.js ***! + \***********************************************************************/ +/*! exports provided: IORouterRegistry, registerSaveRouter, registerLoadRouter, getSaveHandlers, getLoadHandlers */function(e,t,n){"use strict";n.r(t),n.d(t,"IORouterRegistry",(function(){return s})),n.d(t,"registerSaveRouter",(function(){return o})),n.d(t,"registerLoadRouter",(function(){return r})),n.d(t,"getSaveHandlers",(function(){return i})),n.d(t,"getLoadHandlers",(function(){return a})); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(){this.saveRouters=[],this.loadRouters=[]}static getInstance(){return null==s.instance&&(s.instance=new s),s.instance}static registerSaveRouter(e){s.getInstance().saveRouters.push(e)}static registerLoadRouter(e){s.getInstance().loadRouters.push(e)}static getSaveHandlers(e){return s.getHandlers(e,"save")}static getLoadHandlers(e,t){return s.getHandlers(e,"load",t)}static getHandlers(e,t,n){const o=[];return("load"===t?s.getInstance().loadRouters:s.getInstance().saveRouters).forEach((t=>{const s=t(e,n);null!==s&&o.push(s)})),o}}const o=e=>s.registerSaveRouter(e),r=e=>s.registerLoadRouter(e),i=e=>s.getSaveHandlers(e),a=(e,t)=>s.getLoadHandlers(e,t)},"./node_modules/@tensorflow/tfjs-core/dist/io/types.js": +/*!*************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/io/types.js ***! + \*************************************************************/ +/*! exports provided: DTYPE_VALUE_SIZE_MAP */function(e,t,n){"use strict";n.r(t),n.d(t,"DTYPE_VALUE_SIZE_MAP",(function(){return s})); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const s={float32:4,float16:2,int32:4,uint16:2,uint8:1,bool:1,complex64:8}},"./node_modules/@tensorflow/tfjs-core/dist/io/weights_loader.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/io/weights_loader.js ***! + \**********************************************************************/ +/*! exports provided: loadWeightsAsArrayBuffer, loadWeights, weightsLoaderFactory */function(e,t,n){"use strict";n.r(t),n.d(t,"loadWeightsAsArrayBuffer",(function(){return d})),n.d(t,"loadWeights",(function(){return u})),n.d(t,"weightsLoaderFactory",(function(){return l}));var s=n(/*! ../environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./io_utils */"./node_modules/@tensorflow/tfjs-core/dist/io/io_utils.js"),i=n(/*! ./progress */"./node_modules/@tensorflow/tfjs-core/dist/io/progress.js"),a=n(/*! ./types */"./node_modules/@tensorflow/tfjs-core/dist/io/types.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +async function d(e,t){null==t&&(t={});const n=null==t.fetchFunc?Object(s.env)().platform.fetch:t.fetchFunc,o=e.map((e=>n(e,t.requestInit,{isBinary:!0}))),r=(null==t.onProgress?await Promise.all(o):await Object(i.monitorPromisesProgress)(o,t.onProgress,0,.5)).map((e=>e.arrayBuffer()));return null==t.onProgress?await Promise.all(r):await Object(i.monitorPromisesProgress)(r,t.onProgress,.5,1)}async function u(e,t="",n,s){return l((e=>d(e,{requestInit:s})))(e,t,n)}function l(e){return async(t,n="",s)=>{const i=t.map((()=>!1)),d={},u=null!=s?s.map((()=>!1)):[],l=[];if(t.forEach(((e,t)=>{let n=0;e.weights.forEach((e=>{const r="quantization"in e?e.quantization.dtype:e.dtype,c=a.DTYPE_VALUE_SIZE_MAP[r]*o.sizeFromShape(e.shape),f=()=>{i[t]=!0,null==d[t]&&(d[t]=[]),d[t].push({manifestEntry:e,groupOffset:n,sizeBytes:c})};null!=s?s.forEach(((t,n)=>{t===e.name&&(f(),u[n]=!0)})):f(),l.push(e.name),n+=c}))})),!u.every((e=>e))){const e=s.filter(((e,t)=>!u[t]));throw new Error(`Could not find weights in manifest with names: ${e.join(", ")}. \nManifest JSON has weights with names: ${l.join(", ")}.`)}const c=i.reduce(((e,t,n)=>(t&&e.push(n),e)),[]),f=[];c.forEach((e=>{t[e].paths.forEach((e=>{const t=n+(n.endsWith("/")?"":"/")+e;f.push(t)}))}));const p=await e(f),m={};let h=0;return c.forEach((e=>{const n=t[e].paths.length;let s=0;for(let e=0;e{const t=o.slice(e.groupOffset,e.groupOffset+e.sizeBytes),n=Object(r.decodeWeights)(t,[e.manifestEntry]);for(const e in n)m[e]=n[e]})),h+=n})),m}}},"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js ***! + \*****************************************************************/ +/*! exports provided: Abs, Acos, Acosh, Add, AddN, All, Any, ArgMax, ArgMin, Asin, Asinh, Atan, Atanh, Atan2, AvgPool, AvgPoolGrad, AvgPool3D, AvgPool3DGrad, BatchMatMul, BatchToSpaceND, Bincount, BroadcastTo, Cast, Ceil, ClipByValue, Complex, ComplexAbs, Concat, Conv2D, Conv2DBackpropFilter, Conv2DBackpropInput, Conv3D, Conv3DBackpropFilterV2, Conv3DBackpropInputV2, Cos, Cosh, Cumsum, CropAndResize, DenseBincount, DepthToSpace, DepthwiseConv2dNative, DepthwiseConv2dNativeBackpropFilter, DepthwiseConv2dNativeBackpropInput, Diag, Dilation2D, Dilation2DBackpropInput, Dilation2DBackpropFilter, RealDiv, Einsum, Elu, EluGrad, Erf, Equal, Exp, ExpandDims, Expm1, FFT, Fill, FlipLeftRight, Floor, FloorDiv, FusedBatchNorm, GatherV2, GatherNd, Greater, GreaterEqual, Identity, IFFT, Imag, IsFinite, IsInf, IsNan, LeakyRelu, Less, LessEqual, LinSpace, Log, Log1p, LogicalAnd, LogicalNot, LogicalOr, LogSoftmax, LRN, LRNGrad, Max, Maximum, MaxPool, MaxPoolGrad, MaxPool3D, MaxPool3DGrad, MaxPoolWithArgmax, Mean, Min, Minimum, MirrorPad, Mod, Multinomial, Multiply, Neg, NotEqual, NonMaxSuppressionV3, NonMaxSuppressionV4, NonMaxSuppressionV5, OnesLike, OneHot, Pack, PadV2, Pool, Pow, Prelu, Prod, Range, Real, Reciprocal, Relu, Reshape, ResizeNearestNeighbor, ResizeNearestNeighborGrad, ResizeBilinear, ResizeBilinearGrad, Relu6, Reverse, Round, Rsqrt, ScatterNd, Select, Selu, Slice, Sin, Sinh, Sign, Sigmoid, Softplus, Sqrt, Sum, SpaceToBatchND, SplitV, Softmax, SparseFillEmptyRows, SparseReshape, SparseSegmentMean, SparseSegmentSum, SparseToDense, SquaredDifference, Square, StridedSlice, StringNGrams, StringSplit, StringToHashBucketFast, Sub, Tan, Tanh, Tile, TopK, Transform, Transpose, Unique, Unpack, UnsortedSegmentSum, ZerosLike, Step, FromPixels, RotateWithOffset, _FusedMatMul, FusedConv2D, FusedDepthwiseConv2D */function(e,t,n){"use strict";n.r(t),n.d(t,"Abs",(function(){return s})),n.d(t,"Acos",(function(){return o})),n.d(t,"Acosh",(function(){return r})),n.d(t,"Add",(function(){return i})),n.d(t,"AddN",(function(){return a})),n.d(t,"All",(function(){return d})),n.d(t,"Any",(function(){return u})),n.d(t,"ArgMax",(function(){return l})),n.d(t,"ArgMin",(function(){return c})),n.d(t,"Asin",(function(){return f})),n.d(t,"Asinh",(function(){return p})),n.d(t,"Atan",(function(){return m})),n.d(t,"Atanh",(function(){return h})),n.d(t,"Atan2",(function(){return b})),n.d(t,"AvgPool",(function(){return j})),n.d(t,"AvgPoolGrad",(function(){return g})),n.d(t,"AvgPool3D",(function(){return w})),n.d(t,"AvgPool3DGrad",(function(){return _})),n.d(t,"BatchMatMul",(function(){return k})),n.d(t,"BatchToSpaceND",(function(){return v})),n.d(t,"Bincount",(function(){return x})),n.d(t,"BroadcastTo",(function(){return y})),n.d(t,"Cast",(function(){return O})),n.d(t,"Ceil",(function(){return I})),n.d(t,"ClipByValue",(function(){return C})),n.d(t,"Complex",(function(){return S})),n.d(t,"ComplexAbs",(function(){return T})),n.d(t,"Concat",(function(){return N})),n.d(t,"Conv2D",(function(){return E})),n.d(t,"Conv2DBackpropFilter",(function(){return A})),n.d(t,"Conv2DBackpropInput",(function(){return R})),n.d(t,"Conv3D",(function(){return F})),n.d(t,"Conv3DBackpropFilterV2",(function(){return $})),n.d(t,"Conv3DBackpropInputV2",(function(){return M})),n.d(t,"Cos",(function(){return D})),n.d(t,"Cosh",(function(){return P})),n.d(t,"Cumsum",(function(){return B})),n.d(t,"CropAndResize",(function(){return L})),n.d(t,"DenseBincount",(function(){return z})),n.d(t,"DepthToSpace",(function(){return G})),n.d(t,"DepthwiseConv2dNative",(function(){return W})),n.d(t,"DepthwiseConv2dNativeBackpropFilter",(function(){return U})),n.d(t,"DepthwiseConv2dNativeBackpropInput",(function(){return V})),n.d(t,"Diag",(function(){return q})),n.d(t,"Dilation2D",(function(){return H})),n.d(t,"Dilation2DBackpropInput",(function(){return K})),n.d(t,"Dilation2DBackpropFilter",(function(){return X})),n.d(t,"RealDiv",(function(){return Y})),n.d(t,"Einsum",(function(){return Z})),n.d(t,"Elu",(function(){return Q})),n.d(t,"EluGrad",(function(){return J})),n.d(t,"Erf",(function(){return ee})),n.d(t,"Equal",(function(){return te})),n.d(t,"Exp",(function(){return ne})),n.d(t,"ExpandDims",(function(){return se})),n.d(t,"Expm1",(function(){return oe})),n.d(t,"FFT",(function(){return re})),n.d(t,"Fill",(function(){return ie})),n.d(t,"FlipLeftRight",(function(){return ae})),n.d(t,"Floor",(function(){return de})),n.d(t,"FloorDiv",(function(){return ue})),n.d(t,"FusedBatchNorm",(function(){return le})),n.d(t,"GatherV2",(function(){return ce})),n.d(t,"GatherNd",(function(){return fe})),n.d(t,"Greater",(function(){return pe})),n.d(t,"GreaterEqual",(function(){return me})),n.d(t,"Identity",(function(){return he})),n.d(t,"IFFT",(function(){return be})),n.d(t,"Imag",(function(){return je})),n.d(t,"IsFinite",(function(){return ge})),n.d(t,"IsInf",(function(){return we})),n.d(t,"IsNan",(function(){return _e})),n.d(t,"LeakyRelu",(function(){return ke})),n.d(t,"Less",(function(){return ve})),n.d(t,"LessEqual",(function(){return xe})),n.d(t,"LinSpace",(function(){return ye})),n.d(t,"Log",(function(){return Oe})),n.d(t,"Log1p",(function(){return Ie})),n.d(t,"LogicalAnd",(function(){return Ce})),n.d(t,"LogicalNot",(function(){return Se})),n.d(t,"LogicalOr",(function(){return Te})),n.d(t,"LogSoftmax",(function(){return Ne})),n.d(t,"LRN",(function(){return Ee})),n.d(t,"LRNGrad",(function(){return Ae})),n.d(t,"Max",(function(){return Re})),n.d(t,"Maximum",(function(){return Fe})),n.d(t,"MaxPool",(function(){return $e})),n.d(t,"MaxPoolGrad",(function(){return Me})),n.d(t,"MaxPool3D",(function(){return De})),n.d(t,"MaxPool3DGrad",(function(){return Pe})),n.d(t,"MaxPoolWithArgmax",(function(){return Be})),n.d(t,"Mean",(function(){return Le})),n.d(t,"Min",(function(){return ze})),n.d(t,"Minimum",(function(){return Ge})),n.d(t,"MirrorPad",(function(){return We})),n.d(t,"Mod",(function(){return Ue})),n.d(t,"Multinomial",(function(){return Ve})),n.d(t,"Multiply",(function(){return qe})),n.d(t,"Neg",(function(){return He})),n.d(t,"NotEqual",(function(){return Ke})),n.d(t,"NonMaxSuppressionV3",(function(){return Xe})),n.d(t,"NonMaxSuppressionV4",(function(){return Ye})),n.d(t,"NonMaxSuppressionV5",(function(){return Ze})),n.d(t,"OnesLike",(function(){return Qe})),n.d(t,"OneHot",(function(){return Je})),n.d(t,"Pack",(function(){return et})),n.d(t,"PadV2",(function(){return tt})),n.d(t,"Pool",(function(){return nt})),n.d(t,"Pow",(function(){return st})),n.d(t,"Prelu",(function(){return ot})),n.d(t,"Prod",(function(){return rt})),n.d(t,"Range",(function(){return it})),n.d(t,"Real",(function(){return at})),n.d(t,"Reciprocal",(function(){return dt})),n.d(t,"Relu",(function(){return ut})),n.d(t,"Reshape",(function(){return lt})),n.d(t,"ResizeNearestNeighbor",(function(){return ct})),n.d(t,"ResizeNearestNeighborGrad",(function(){return ft})),n.d(t,"ResizeBilinear",(function(){return pt})),n.d(t,"ResizeBilinearGrad",(function(){return mt})),n.d(t,"Relu6",(function(){return ht})),n.d(t,"Reverse",(function(){return bt})),n.d(t,"Round",(function(){return jt})),n.d(t,"Rsqrt",(function(){return gt})),n.d(t,"ScatterNd",(function(){return wt})),n.d(t,"Select",(function(){return _t})),n.d(t,"Selu",(function(){return kt})),n.d(t,"Slice",(function(){return vt})),n.d(t,"Sin",(function(){return xt})),n.d(t,"Sinh",(function(){return yt})),n.d(t,"Sign",(function(){return Ot})),n.d(t,"Sigmoid",(function(){return It})),n.d(t,"Softplus",(function(){return Ct})),n.d(t,"Sqrt",(function(){return St})),n.d(t,"Sum",(function(){return Tt})),n.d(t,"SpaceToBatchND",(function(){return Nt})),n.d(t,"SplitV",(function(){return Et})),n.d(t,"Softmax",(function(){return At})),n.d(t,"SparseFillEmptyRows",(function(){return Rt})),n.d(t,"SparseReshape",(function(){return Ft})),n.d(t,"SparseSegmentMean",(function(){return $t})),n.d(t,"SparseSegmentSum",(function(){return Mt})),n.d(t,"SparseToDense",(function(){return Dt})),n.d(t,"SquaredDifference",(function(){return Pt})),n.d(t,"Square",(function(){return Bt})),n.d(t,"StridedSlice",(function(){return Lt})),n.d(t,"StringNGrams",(function(){return zt})),n.d(t,"StringSplit",(function(){return Gt})),n.d(t,"StringToHashBucketFast",(function(){return Wt})),n.d(t,"Sub",(function(){return Ut})),n.d(t,"Tan",(function(){return Vt})),n.d(t,"Tanh",(function(){return qt})),n.d(t,"Tile",(function(){return Ht})),n.d(t,"TopK",(function(){return Kt})),n.d(t,"Transform",(function(){return Xt})),n.d(t,"Transpose",(function(){return Yt})),n.d(t,"Unique",(function(){return Zt})),n.d(t,"Unpack",(function(){return Qt})),n.d(t,"UnsortedSegmentSum",(function(){return Jt})),n.d(t,"ZerosLike",(function(){return en})),n.d(t,"Step",(function(){return tn})),n.d(t,"FromPixels",(function(){return nn})),n.d(t,"RotateWithOffset",(function(){return sn})),n.d(t,"_FusedMatMul",(function(){return on})),n.d(t,"FusedConv2D",(function(){return rn})),n.d(t,"FusedDepthwiseConv2D",(function(){return an}));const s="Abs",o="Acos",r="Acosh",i="Add",a="AddN",d="All",u="Any",l="ArgMax",c="ArgMin",f="Asin",p="Asinh",m="Atan",h="Atanh",b="Atan2",j="AvgPool",g="AvgPoolGrad",w="AvgPool3D",_="AvgPool3DGrad",k="BatchMatMul",v="BatchToSpaceND",x="Bincount",y="BroadcastTo",O="Cast",I="Ceil",C="ClipByValue",S="Complex",T="ComplexAbs",N="Concat",E="Conv2D",A="Conv2DBackpropFilter",R="Conv2DBackpropInput",F="Conv3D",$="Conv3DBackpropFilterV2",M="Conv3DBackpropInputV2",D="Cos",P="Cosh",B="Cumsum",L="CropAndResize",z="DenseBincount",G="DepthToSpace",W="DepthwiseConv2dNative",U="DepthwiseConv2dNativeBackpropFilter",V="DepthwiseConv2dNativeBackpropInput",q="Diag",H="Dilation2D",K="Dilation2DBackpropInput",X="Dilation2DBackpropFilter",Y="RealDiv",Z="Einsum",Q="Elu",J="EluGrad",ee="Erf",te="Equal",ne="Exp",se="ExpandDims",oe="Expm1",re="FFT",ie="Fill",ae="FlipLeftRight",de="Floor",ue="FloorDiv",le="FusedBatchNorm",ce="GatherV2",fe="GatherNd",pe="Greater",me="GreaterEqual",he="Identity",be="IFFT",je="Imag",ge="IsFinite",we="IsInf",_e="IsNan",ke="LeakyRelu",ve="Less",xe="LessEqual",ye="LinSpace",Oe="Log",Ie="Log1p",Ce="LogicalAnd",Se="LogicalNot",Te="LogicalOr",Ne="LogSoftmax",Ee="LRN",Ae="LRNGrad",Re="Max",Fe="Maximum",$e="MaxPool",Me="MaxPoolGrad",De="MaxPool3D",Pe="MaxPool3DGrad",Be="MaxPoolWithArgmax",Le="Mean",ze="Min",Ge="Minimum",We="MirrorPad",Ue="Mod",Ve="Multinomial",qe="Multiply",He="Neg",Ke="NotEqual",Xe="NonMaxSuppressionV3",Ye="NonMaxSuppressionV4",Ze="NonMaxSuppressionV5",Qe="OnesLike",Je="OneHot",et="Pack",tt="PadV2",nt="Pool",st="Pow",ot="Prelu",rt="Prod",it="Range",at="Real",dt="Reciprocal",ut="Relu",lt="Reshape",ct="ResizeNearestNeighbor",ft="ResizeNearestNeighborGrad",pt="ResizeBilinear",mt="ResizeBilinearGrad",ht="Relu6",bt="Reverse",jt="Round",gt="Rsqrt",wt="ScatterNd",_t="Select",kt="Selu",vt="Slice",xt="Sin",yt="Sinh",Ot="Sign",It="Sigmoid",Ct="Softplus",St="Sqrt",Tt="Sum",Nt="SpaceToBatchND",Et="SplitV",At="Softmax",Rt="SparseFillEmptyRows",Ft="SparseReshape",$t="SparseSegmentMean",Mt="SparseSegmentSum",Dt="SparseToDense",Pt="SquaredDifference",Bt="Square",Lt="StridedSlice",zt="StringNGrams",Gt="StringSplit",Wt="StringToHashBucketFast",Ut="Sub",Vt="Tan",qt="Tanh",Ht="Tile",Kt="TopK",Xt="Transform",Yt="Transpose",Zt="Unique",Qt="Unpack",Jt="UnsortedSegmentSum",en="ZerosLike",tn="Step",nn="FromPixels",sn="RotateWithOffset",on="_FusedMatMul",rn="FusedConv2D",an="FusedDepthwiseConv2D"},"./node_modules/@tensorflow/tfjs-core/dist/kernel_registry.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/kernel_registry.js ***! + \********************************************************************/ +/*! exports provided: getKernel, getGradient, getKernelsForBackend, registerKernel, registerGradient, unregisterKernel, unregisterGradient, copyRegisteredKernels */function(e,t,n){"use strict";n.r(t),n.d(t,"getKernel",(function(){return a})),n.d(t,"getGradient",(function(){return d})),n.d(t,"getKernelsForBackend",(function(){return u})),n.d(t,"registerKernel",(function(){return l})),n.d(t,"registerGradient",(function(){return c})),n.d(t,"unregisterKernel",(function(){return f})),n.d(t,"unregisterGradient",(function(){return p})),n.d(t,"copyRegisteredKernels",(function(){return m}));var s=n(/*! ./environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"),o=n(/*! ./global_util */"./node_modules/@tensorflow/tfjs-core/dist/global_util.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.getGlobal)("kernelRegistry",(()=>new Map)),i=Object(o.getGlobal)("gradRegistry",(()=>new Map));function a(e,t){const n=h(e,t);return r.get(n)}function d(e){return i.get(e)}function u(e){const t=r.entries(),n=[];for(;;){const{done:s,value:o}=t.next();if(s)break;const[r,i]=o,[a]=r.split("_");a===e&&n.push(i)}return n}function l(e){const{kernelName:t,backendName:n}=e,s=h(t,n);r.has(s)&&console.warn(`The kernel '${t}' for backend '${n}' is already registered`),r.set(s,e)}function c(e){const{kernelName:t}=e;i.has(t)&&Object(s.env)().getBool("DEBUG")&&console.warn(`Overriding the gradient for '${t}'`),i.set(t,e)}function f(e,t){const n=h(e,t);if(!r.has(n))throw new Error(`The kernel '${e}' for backend '${t}' is not registered`);r.delete(n)}function p(e){if(!i.has(e))throw new Error(`The gradient '${e}' for backend is not registered`);i.delete(e)}function m(e,t){u(e).forEach((e=>{l(Object.assign({},e,{backendName:t}))}))}function h(e,t){return`${t}_${e}`}},"./node_modules/@tensorflow/tfjs-core/dist/log.js": +/*!********************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/log.js ***! + \********************************************************/ +/*! exports provided: warn, log */function(e,t,n){"use strict";n.r(t),n.d(t,"warn",(function(){return o})),n.d(t,"log",(function(){return r}));var s=n(/*! ./environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(...e){Object(s.env)().getBool("IS_TEST")||console.warn(...e)}function r(...e){Object(s.env)().getBool("IS_TEST")||console.log(...e)}},"./node_modules/@tensorflow/tfjs-core/dist/math.js": +/*!*********************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/math.js ***! + \*********************************************************/ +/*! exports provided: confusionMatrix */function(e,t,n){"use strict";n.r(t);var s=n(/*! ./ops/confusion_matrix */"./node_modules/@tensorflow/tfjs-core/dist/ops/confusion_matrix.js");n.d(t,"confusionMatrix",(function(){return s.confusionMatrix}))},"./node_modules/@tensorflow/tfjs-core/dist/ops/abs.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/abs.js ***! + \************************************************************/ +/*! exports provided: abs */function(e,t,n){"use strict";n.r(t),n.d(t,"abs",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({abs_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t=Object(r.convertToTensor)(e,"x","abs");if("complex64"===t.dtype){const e={x:t};return s.ENGINE.runKernel(o.ComplexAbs,e)}{const e={x:t};return s.ENGINE.runKernel(o.Abs,e)}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/acos.js": +/*!*************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/acos.js ***! + \*************************************************************/ +/*! exports provided: acos */function(e,t,n){"use strict";n.r(t),n.d(t,"acos",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({acos_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","acos")};return s.ENGINE.runKernel(o.Acos,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/acosh.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/acosh.js ***! + \**************************************************************/ +/*! exports provided: acosh */function(e,t,n){"use strict";n.r(t),n.d(t,"acosh",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({acosh_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","acosh")};return s.ENGINE.runKernel(o.Acosh,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/add.js ***! + \************************************************************/ +/*! exports provided: add */function(e,t,n){"use strict";n.r(t),n.d(t,"add",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({add_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){let n=Object(i.convertToTensor)(e,"a","add"),a=Object(i.convertToTensor)(t,"b","add");[n,a]=Object(r.makeTypesMatch)(n,a);const d={a:n,b:a};return s.ENGINE.runKernel(o.Add,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/add_n.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/add_n.js ***! + \**************************************************************/ +/*! exports provided: addN */function(e,t,n){"use strict";n.r(t),n.d(t,"addN",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({addN_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){i.assert(Array.isArray(e),(()=>"The argument passed to tf.addN() must be a list of tensors")),i.assert(e.length>=1,(()=>`Must pass at least one tensor to tf.addN(), but got ${e.length}`));const t=e.map(((e,t)=>Object(r.convertToTensor)(e,`tensors${t}`,"addN"))),n=t[0];t.forEach((e=>{if(e.dtype!==n.dtype)throw new Error("All tensors passed to tf.addN() must have the same dtype")})),t.forEach((e=>{if(!i.arraysEqual(e.shape,n.shape))throw new Error("All tensors passed to tf.addN() must have the same shape")}));const a=t;return s.ENGINE.runKernel(o.AddN,a)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/all.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/all.js ***! + \************************************************************/ +/*! exports provided: all */function(e,t,n){"use strict";n.r(t),n.d(t,"all",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({all_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=null,n=!1){const i={x:Object(r.convertToTensor)(e,"x","all","bool")},a={axis:t,keepDims:n};return s.ENGINE.runKernel(o.All,i,a)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/any.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/any.js ***! + \************************************************************/ +/*! exports provided: any */function(e,t,n){"use strict";n.r(t),n.d(t,"any",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({any_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=null,n=!1){const i={x:Object(r.convertToTensor)(e,"x","any","bool")},a={axis:t,keepDims:n};return s.ENGINE.runKernel(o.Any,i,a)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/arg_max.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/arg_max.js ***! + \****************************************************************/ +/*! exports provided: argMax */function(e,t,n){"use strict";n.r(t),n.d(t,"argMax",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({argMax_: +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=0){const n={x:Object(r.convertToTensor)(e,"x","argMax")},i={axis:t};return s.ENGINE.runKernel(o.ArgMax,n,i)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/arg_min.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/arg_min.js ***! + \****************************************************************/ +/*! exports provided: argMin */function(e,t,n){"use strict";n.r(t),n.d(t,"argMin",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({argMin_: +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=0){const n={x:Object(r.convertToTensor)(e,"x","argMin")},i={axis:t};return s.ENGINE.runKernel(o.ArgMin,n,i)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/array_ops_util.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/array_ops_util.js ***! + \***********************************************************************/ +/*! exports provided: getReshaped, getPermuted, getReshapedPermuted, getSliceBeginCoords, getSliceSize */function(e,t,n){"use strict"; +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function s(e,t,n,s=!0){let o=[];if(s)o=o.concat(t.slice(0)),o.push(e[0]/n),o=o.concat(e.slice(1));else{o=o.concat(e[0]);const n=t.length;for(let s=0;s=2*t+1||s%2==1?o.push(s):n.push(s);s.push(...n),s.push(0),s.push(...o)}return s}function r(e,t,n,s=!0){const o=[];s?o.push(e[0]/n):o.push(e[0]*n);for(let n=1;n`Error in avgPool: Either strides or dilations must be 1. Got strides ${n} and dilations '1'`));let p=f,m=!1;3===f.rank&&(m=!0,p=Object(l.reshape)(f,[1,f.shape[0],f.shape[1],f.shape[2]])),i.assert(4===p.rank,(()=>`Error in avgPool: x must be rank 4 but got rank ${p.rank}.`)),null!=c&&i.assert(i.isInt(u),(()=>`Error in avgPool: pad must be an integer when using, dimRoundingMode ${c} but got pad ${u}.`));const h={x:p},b={filterSize:t,strides:n,pad:u,dimRoundingMode:c};let j=s.ENGINE.runKernel(o.AvgPool,h,b);return j=Object(a.cast)(j,f.dtype),m?Object(l.reshape)(j,[j.shape[1],j.shape[2],j.shape[3]]):j}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/avg_pool_3d.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/avg_pool_3d.js ***! + \********************************************************************/ +/*! exports provided: avgPool3d */function(e,t,n){"use strict";n.r(t),n.d(t,"avgPool3d",(function(){return l}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const l=Object(d.op)({avgPool3d_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,d,l,c="NDHWC"){const f=Object(r.convertToTensor)(e,"x","avgPool3d","float32");let p=f,m=!1;4===f.rank&&(m=!0,p=Object(u.reshape)(f,[1,f.shape[0],f.shape[1],f.shape[2],f.shape[3]])),i.assert(5===p.rank,(()=>`Error in avgPool3d: x must be rank 5 but got rank ${p.rank}.`)),i.assert("NDHWC"===c,(()=>`Error in avgPool3d: Only NDHWC is currently supported, but got dataFormat of ${c}`)),null!=l&&i.assert(i.isInt(d),(()=>`Error in avgPool3d: pad must be an integer when using, dimRoundingMode ${l} but got pad ${d}.`));const h={x:p},b={filterSize:t,strides:n,pad:d,dimRoundingMode:l,dataFormat:c};let j=s.ENGINE.runKernel(o.AvgPool3D,h,b);return j=Object(a.cast)(j,p.dtype),m?Object(u.reshape)(j,[j.shape[1],j.shape[2],j.shape[3],j.shape[4]]):j}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/axis_util.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/axis_util.js ***! + \******************************************************************/ +/*! exports provided: axesAreInnerMostDims, combineLocations, computeOutAndReduceShapes, expandShapeToKeepDim, assertAxesAreInnerMostDims, getAxesPermutation, getUndoAxesPermutation, getInnerMostAxes */function(e,t,n){"use strict";n.r(t),n.d(t,"axesAreInnerMostDims",(function(){return o})),n.d(t,"combineLocations",(function(){return r})),n.d(t,"computeOutAndReduceShapes",(function(){return i})),n.d(t,"expandShapeToKeepDim",(function(){return a})),n.d(t,"assertAxesAreInnerMostDims",(function(){return d})),n.d(t,"getAxesPermutation",(function(){return u})),n.d(t,"getUndoAxesPermutation",(function(){return l})),n.d(t,"getInnerMostAxes",(function(){return c}));var s=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t){for(let n=0;ne[t]))]}function a(e,t){return r(e,t.map((e=>1)),t)}function d(e,t,n){s.assert(o(t,n),(()=>`${e} supports only inner-most axes for now. Got axes ${t} and rank-${n} input.`))}function u(e,t){if(o(e,t))return null;const n=[];for(let s=0;sn.push(e))),n}function l(e){return e.map(((e,t)=>[t,e])).sort(((e,t)=>e[1]-t[1])).map((e=>e[0]))}function c(e,t){const n=[];for(let s=t-e;se*t));i.assert(a.rank>=1+t.length,(()=>`input rank is ${a.rank} but should be > than blockShape.length ${t.length}`)),i.assert(n.length===t.length,(()=>`crops.length is ${n.length} but should be equal to blockShape.length ${t.length}`)),i.assert(a.shape[0]%d==0,(()=>`input tensor batch is ${a.shape[0]} but is not divisible by the product of the elements of blockShape ${t.join(" * ")} === ${d}`));const u={x:a},l={blockShape:t,crops:n};return s.ENGINE.runKernel(o.BatchToSpaceND,u,l)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm.js ***! + \******************************************************************/ +/*! exports provided: batchNorm */function(e,t,n){"use strict";n.r(t),n.d(t,"batchNorm",(function(){return l}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./batchnorm_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm_util.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const l=Object(d.op)({batchNorm_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,d,l,c){null==c&&(c=.001);const f=Object(r.convertToTensor)(e,"x","batchNorm"),p=Object(r.convertToTensor)(t,"mean","batchNorm"),m=Object(r.convertToTensor)(n,"variance","batchNorm");let h,b;null!=l&&(h=Object(r.convertToTensor)(l,"scale","batchNorm")),null!=d&&(b=Object(r.convertToTensor)(d,"offset","batchNorm")),i.assert(p.rank===m.rank,(()=>"Batch normalization gradient requires mean and variance to have equal ranks.")),i.assert(null==b||p.rank===b.rank,(()=>"Batch normalization gradient requires mean and offset to have equal ranks.")),i.assert(null==h||p.rank===h.rank,(()=>"Batch normalization gradient requires mean and scale to have equal ranks."));const j={x:Object(a.xAs4D)(f),scale:h,offset:b,mean:p,variance:m},g={varianceEpsilon:c},w=s.ENGINE.runKernel(o.FusedBatchNorm,j,g);return Object(u.reshape)(w,f.shape)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm2d.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm2d.js ***! + \********************************************************************/ +/*! exports provided: batchNorm2d */function(e,t,n){"use strict";n.r(t),n.d(t,"batchNorm2d",(function(){return a}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./batchnorm */"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({batchNorm2d_:function(e,t,n,i,a,d){const u=Object(s.convertToTensor)(e,"x","batchNorm"),l=Object(s.convertToTensor)(t,"mean","batchNorm"),c=Object(s.convertToTensor)(n,"variance","batchNorm");let f,p;return null!=a&&(f=Object(s.convertToTensor)(a,"scale","batchNorm")),null!=i&&(p=Object(s.convertToTensor)(i,"offset","batchNorm")),o.assert(2===u.rank,(()=>`Error in batchNorm2D: x must be rank 2 but got rank ${u.rank}.`)),o.assert(2===l.rank||1===l.rank,(()=>`Error in batchNorm2D: mean must be rank 2 or rank 1 but got rank ${l.rank}.`)),o.assert(2===c.rank||1===c.rank,(()=>`Error in batchNorm2D: variance must be rank 2 or rank 1 but got rank ${c.rank}.`)),null!=f&&o.assert(2===f.rank||1===f.rank,(()=>`Error in batchNorm2D: scale must be rank 2 or rank 1 but got rank ${f.rank}.`)),null!=p&&o.assert(2===p.rank||1===p.rank,(()=>`Error in batchNorm2D: offset must be rank 2 or rank 1 but got rank ${p.rank}.`)),Object(r.batchNorm)(u,l,c,p,f,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm3d.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm3d.js ***! + \********************************************************************/ +/*! exports provided: batchNorm3d */function(e,t,n){"use strict";n.r(t),n.d(t,"batchNorm3d",(function(){return a}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./batchnorm */"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({batchNorm3d_:function(e,t,n,i,a,d){const u=Object(s.convertToTensor)(e,"x","batchNorm"),l=Object(s.convertToTensor)(t,"mean","batchNorm"),c=Object(s.convertToTensor)(n,"variance","batchNorm");let f,p;return null!=a&&(f=Object(s.convertToTensor)(a,"scale","batchNorm")),null!=i&&(p=Object(s.convertToTensor)(i,"offset","batchNorm")),o.assert(3===u.rank,(()=>`Error in batchNorm3D: x must be rank 3 but got rank ${u.rank}.`)),o.assert(3===l.rank||1===l.rank,(()=>`Error in batchNorm3D: mean must be rank 3 or rank 1 but got rank ${l.rank}.`)),o.assert(3===c.rank||1===c.rank,(()=>`Error in batchNorm3D: variance must be rank 3 or rank 1 but got rank ${c.rank}.`)),null!=f&&o.assert(3===f.rank||1===f.rank,(()=>`Error in batchNorm3D: scale must be rank 3 or rank 1 but got rank ${f.rank}.`)),null!=p&&o.assert(3===p.rank||1===p.rank,(()=>`Error in batchNorm3D: offset must be rank 3 or rank 1 but got rank ${p.rank}.`)),Object(r.batchNorm)(u,l,c,p,f,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm4d.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm4d.js ***! + \********************************************************************/ +/*! exports provided: batchNorm4d */function(e,t,n){"use strict";n.r(t),n.d(t,"batchNorm4d",(function(){return a}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./batchnorm */"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({batchNorm4d_:function(e,t,n,i,a,d){const u=Object(s.convertToTensor)(e,"x","batchNorm"),l=Object(s.convertToTensor)(t,"mean","batchNorm"),c=Object(s.convertToTensor)(n,"variance","batchNorm");let f,p;return null!=a&&(f=Object(s.convertToTensor)(a,"scale","batchNorm")),null!=i&&(p=Object(s.convertToTensor)(i,"offset","batchNorm")),o.assert(4===u.rank,(()=>`Error in batchNorm4D: x must be rank 4 but got rank ${u.rank}.`)),o.assert(4===l.rank||1===l.rank,(()=>`Error in batchNorm4D: mean must be rank 4 or rank 1 but got rank ${l.rank}.`)),o.assert(4===c.rank||1===c.rank,(()=>`Error in batchNorm4D: variance must be rank 4 or rank 1 but got rank ${c.rank}.`)),null!=f&&o.assert(4===f.rank||1===f.rank,(()=>`Error in batchNorm4D: scale must be rank 4 or rank 1 but got rank ${f.rank}.`)),null!=p&&o.assert(4===p.rank||1===p.rank,(()=>`Error in batchNorm4D: offset must be rank 4 or rank 1 but got rank ${p.rank}.`)),Object(r.batchNorm)(u,l,c,p,f,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm_util.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm_util.js ***! + \***********************************************************************/ +/*! exports provided: xAs4D */function(e,t,n){"use strict";n.r(t),n.d(t,"xAs4D",(function(){return o}));var s=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");function o(e){let t;return t=0===e.rank||1===e.rank?Object(s.reshape)(e,[1,1,1,e.size]):2===e.rank?Object(s.reshape)(e,[1,1,e.shape[0],e.shape[1]]):3===e.rank?Object(s.reshape)(e,[1,e.shape[0],e.shape[1],e.shape[2]]):e,t}},"./node_modules/@tensorflow/tfjs-core/dist/ops/bincount.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/bincount.js ***! + \*****************************************************************/ +/*! exports provided: bincount */function(e,t,n){"use strict";n.r(t),n.d(t,"bincount",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({bincount_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n){const a=Object(r.convertToTensor)(e,"x","bincount"),d=Object(r.convertToTensor)(t,"weights","bincount");i.assert("int32"===a.dtype,(()=>`Error in bincount: input dtype must be int32, but got ${a.dtype}`)),i.assert(n>=0,(()=>`size must be non-negative, but got ${n}.`)),i.assert(d.size===a.size||0===d.size,(()=>`Error in bincount: weights must have the same size as input or0-length, but got input shape: ${a.shape}, weights shape: ${d.shape}.`));const u={x:a,weights:d},l={size:n};return s.ENGINE.runKernel(o.Bincount,u,l)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/boolean_mask.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/boolean_mask.js ***! + \*********************************************************************/ +/*! exports provided: booleanMaskAsync */function(e,t,n){"use strict";n.r(t),n.d(t,"booleanMaskAsync",(function(){return u}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./gather */"./node_modules/@tensorflow/tfjs-core/dist/ops/gather.js"),i=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),a=n(/*! ./squeeze */"./node_modules/@tensorflow/tfjs-core/dist/ops/squeeze.js"),d=n(/*! ./where_async */"./node_modules/@tensorflow/tfjs-core/dist/ops/where_async.js");const u= +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +async function(e,t,n){const u=Object(s.convertToTensor)(e,"tensor","boolMask"),l=Object(s.convertToTensor)(t,"mask","boolMask","bool"),c=null==n?0:n,f=l.rank,p=u.shape;o.assert(f>0,(()=>"mask cannot be scalar")),o.assertShapesMatch(p.slice(c,c+f),l.shape,"mask's shape must match the first K dimensions of tensor's shape,");let m=1;for(let e=c;e!(e>0)||e%1!=0)))throw new Error(`broadcastTo(): Invalid broadcast shape [${t}].`);if(t.lengthn.rank){const e=n.shape.slice();for(;e.length=0;e--)if(u[e]===t[e])l[e]=1;else if(1!==n.shape[e])throw new Error(`broadcastTo(): [${a}] cannot be broadcast to [${t}].`);if(0===l.map(((e,t)=>e>1?t:-1)).filter((e=>e>=0)).length)return Object(i.clone)(n);const c={x:n},f={reps:l};return s.ENGINE.runKernel(o.Tile,c,f)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js ***! + \***********************************************************************/ +/*! exports provided: getBroadcastDims, getReductionAxes, assertAndGetBroadcastShape */function(e,t,n){"use strict"; +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function s(e,t){const n=e.length,s=[];for(let o=0;o1&&1===i&&s.unshift(r)}return s}function o(e,t){const n=[];for(let s=0;s1)&&n.unshift(r)}return n}function r(e,t){const n=[],s=Math.max(e.length,t.length);for(let o=0;o4)throw new Error("Cannot construct Tensor with more than 4 channels from pixels.");if(null==e)throw new Error("pixels passed to tf.browser.fromPixels() can not be null");let n=!1,o=!1,a=!1,d=!1,u=!1,l=!1;if(e.data instanceof Uint8Array)n=!0;else if("undefined"!=typeof ImageData&&e instanceof ImageData)o=!0;else if("undefined"!=typeof HTMLVideoElement&&e instanceof HTMLVideoElement)a=!0;else if("undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement)d=!0;else if(null!=e.getContext)u=!0;else{if(!("undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap))throw new Error(`pixels passed to tf.browser.fromPixels() must be either an HTMLVideoElement, HTMLImageElement, HTMLCanvasElement, ImageData in browser, or OffscreenCanvas, ImageData in webworker or {data: Uint32Array, width: number, height: number}, but was ${e.constructor.name}`);l=!0}if(a){const t=2;if(a&&e.readyState element.")}if(null!=Object(i.getKernel)(r.FromPixels,s.ENGINE.backendName)){const n={pixels:e},o={numChannels:t};return s.ENGINE.runKernel(r.FromPixels,n,o)}const[p,m]=a?[e.videoWidth,e.videoHeight]:[e.width,e.height];let h,b;if(u?h=e.getContext("2d").getImageData(0,0,p,m).data:o||n?h=e.data:(d||a||l)&&(null==f&&(f=document.createElement("canvas").getContext("2d")),f.canvas.width=p,f.canvas.height=m,f.drawImage(e,0,0,p,m),h=f.getImageData(0,0,p,m).data),4===t)b=new Int32Array(h);else{const e=p*m;b=new Int32Array(e*t);for(let n=0;n4||2===r)throw new Error(`toPixels only supports depth of size 1, 3 or 4 but got ${r}`);if("float32"!==n.dtype&&"int32"!==n.dtype)throw new Error(`Unsupported type for toPixels: ${n.dtype}. Please use float32 or int32 tensors.`);const i=await n.data(),l="float32"===n.dtype?255:1,c=new Uint8ClampedArray(o*s*4);for(let e=0;e1)throw new Error(`Tensor values for a float32 Tensor must be in the range [0 - 1] but encountered ${o}.`)}else if("int32"===n.dtype&&(o<0||o>255))throw new Error(`Tensor values for a int32 Tensor must be in the range [0 - 255] but encountered ${o}.`);1===r?(t[0]=o*l,t[1]=o*l,t[2]=o*l):t[s]=o*l}const s=4*e;c[s+0]=Math.round(t[0]),c[s+1]=Math.round(t[1]),c[s+2]=Math.round(t[2]),c[s+3]=Math.round(t[3])}if(null!=t){t.width=o,t.height=s;const e=t.getContext("2d"),n=new ImageData(c,o,s);e.putImageData(n,0,0)}return n!==e&&n.dispose(),c}const j=Object(l.op)({fromPixels_:p})},"./node_modules/@tensorflow/tfjs-core/dist/ops/buffer.js": +/*!***************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/buffer.js ***! + \***************************************************************/ +/*! exports provided: buffer */function(e,t,n){"use strict";n.r(t),n.d(t,"buffer",(function(){return r}));var s=n(/*! ../tensor */"./node_modules/@tensorflow/tfjs-core/dist/tensor.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e,t="float32",n){return t=t||"float32",o.assertNonNegativeIntegerDimensions(e),new s.TensorBuffer(e,t,n)}},"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js": +/*!*************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js ***! + \*************************************************************/ +/*! exports provided: cast */function(e,t,n){"use strict";n.r(t),n.d(t,"cast",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({cast_: +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){const n=Object(r.convertToTensor)(e,"x","cast");if(!i.isValidDtype(t))throw new Error(`Failed to cast to unknown dtype ${t}`);if("string"===t&&"string"!==n.dtype||"string"!==t&&"string"===n.dtype)throw new Error("Only strings can be casted to strings");const a={x:n},d={dtype:t};return s.ENGINE.runKernel(o.Cast,a,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/ceil.js": +/*!*************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/ceil.js ***! + \*************************************************************/ +/*! exports provided: ceil */function(e,t,n){"use strict";n.r(t),n.d(t,"ceil",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({ceil_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","ceil")};return s.ENGINE.runKernel(o.Ceil,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/clip_by_value.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/clip_by_value.js ***! + \**********************************************************************/ +/*! exports provided: clipByValue */function(e,t,n){"use strict";n.r(t),n.d(t,"clipByValue",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({clipByValue_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n){const a=Object(r.convertToTensor)(e,"x","clipByValue");i.assert(t<=n,(()=>`Error in clip: min (${t}) must be less than or equal to max (${n}).`));const d={x:a},u={clipValueMin:t,clipValueMax:n};return s.ENGINE.runKernel(o.ClipByValue,d,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/clone.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/clone.js ***! + \**************************************************************/ +/*! exports provided: clone */function(e,t,n){"use strict";n.r(t),n.d(t,"clone",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({clone_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","clone","string_or_numeric")};return s.ENGINE.runKernel(o.Identity,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/complex.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/complex.js ***! + \****************************************************************/ +/*! exports provided: complex */function(e,t,n){"use strict";n.r(t),n.d(t,"complex",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({complex_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){const n=Object(r.convertToTensor)(e,"real","complex"),a=Object(r.convertToTensor)(t,"imag","complex");i.assertShapesMatch(n.shape,a.shape,`real and imag shapes, ${n.shape} and ${a.shape}, must match in call to tf.complex().`);const d={real:n,imag:a};return s.ENGINE.runKernel(o.Complex,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/concat.js": +/*!***************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/concat.js ***! + \***************************************************************/ +/*! exports provided: concat */function(e,t,n){"use strict";n.r(t),n.d(t,"concat",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./clone */"./node_modules/@tensorflow/tfjs-core/dist/ops/clone.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(d.op)({concat_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=0){Object(i.assert)(e.length>=1,(()=>"Pass at least one tensor to concat"));const n=Object(r.convertToTensorArray)(e,"tensors","concat","string_or_numeric");if("complex64"===n[0].dtype&&n.forEach((e=>{if("complex64"!==e.dtype)throw new Error(`Cannot concatenate complex64 tensors with a tensor\n with dtype ${e.dtype}. `)})),1===n.length)return Object(a.clone)(n[0]);const d=n,u={axis:t};return s.ENGINE.runKernel(o.Concat,d,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/concat_1d.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/concat_1d.js ***! + \******************************************************************/ +/*! exports provided: concat1d */function(e,t,n){"use strict";n.r(t),n.d(t,"concat1d",(function(){return r}));var s=n(/*! ./concat */"./node_modules/@tensorflow/tfjs-core/dist/ops/concat.js"),o=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const r=Object(o.op)({concat1d_:function(e){return Object(s.concat)(e,0)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/concat_2d.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/concat_2d.js ***! + \******************************************************************/ +/*! exports provided: concat2d */function(e,t,n){"use strict";n.r(t),n.d(t,"concat2d",(function(){return r}));var s=n(/*! ./concat */"./node_modules/@tensorflow/tfjs-core/dist/ops/concat.js"),o=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const r=Object(o.op)({concat2d_:function(e,t){return Object(s.concat)(e,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/concat_3d.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/concat_3d.js ***! + \******************************************************************/ +/*! exports provided: concat3d */function(e,t,n){"use strict";n.r(t),n.d(t,"concat3d",(function(){return r}));var s=n(/*! ./concat */"./node_modules/@tensorflow/tfjs-core/dist/ops/concat.js"),o=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const r=Object(o.op)({concat3d_:function(e,t){return Object(s.concat)(e,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/concat_4d.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/concat_4d.js ***! + \******************************************************************/ +/*! exports provided: concat4d */function(e,t,n){"use strict";n.r(t),n.d(t,"concat4d",(function(){return r}));var s=n(/*! ./concat */"./node_modules/@tensorflow/tfjs-core/dist/ops/concat.js"),o=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const r=Object(o.op)({concat4d_:function(e,t){return Object(s.concat)(e,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/concat_util.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/concat_util.js ***! + \********************************************************************/ +/*! exports provided: assertParamsConsistent, computeOutShape */function(e,t,n){"use strict";n.r(t),n.d(t,"assertParamsConsistent",(function(){return o})),n.d(t,"computeOutShape",(function(){return r}));var s=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t){const n=e[0].length;e.forEach(((e,t)=>{s.assert(e.length===n,(()=>`Error in concat${n}D: rank of tensors[${t}] must be the same as the rank of the rest (${n})`))})),s.assert(t>=0&&t`Error in concat${n}D: axis must be between 0 and ${n-1}.`));const o=e[0];e.forEach(((e,r)=>{for(let i=0;i`Error in concat${n}D: Shape of tensors[${r}] (${e}) does not match the shape of the rest (${o}) along the non-concatenated axis ${r}.`))}))}function r(e,t){const n=e[0].slice();for(let s=1;s0&&Number.isInteger(n),(()=>`If provided, numClasses must be a positive integer, but got ${n}`)),o.assert(1===d.rank,(()=>`Expected the rank of labels to be 1, but got ${d.rank}`)),o.assert(1===l.rank,(()=>`Expected the rank of predictions to be 1, but got ${l.rank}`)),o.assert(d.shape[0]===l.shape[0],(()=>`Mismatch in the number of examples: ${d.shape[0]} vs. ${l.shape[0]}. Labels and predictions should have the same number of elements.`)),o.assert(n>0&&Number.isInteger(n),(()=>`numClasses is required to be a positive integer, but got ${n}`));const c=Object(a.oneHot)(Object(r.cast)(d,"int32"),n),f=Object(a.oneHot)(Object(r.cast)(l,"int32"),n),p=Object(u.transpose)(c),m=Object(i.matMul)(p,f);return Object(r.cast)(m,"int32")}const c=Object(d.op)({confusionMatrix_:l})},"./node_modules/@tensorflow/tfjs-core/dist/ops/conv1d.js": +/*!***************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/conv1d.js ***! + \***************************************************************/ +/*! exports provided: conv1d */function(e,t,n){"use strict";n.r(t),n.d(t,"conv1d",(function(){return u}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./conv2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d.js"),i=n(/*! ./conv_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),d=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const u=Object(a.op)({conv1d_:function(e,t,n,a,u="NWC",l=1,c){const f=Object(s.convertToTensor)(e,"x","conv1d"),p=Object(s.convertToTensor)(t,"filter","conv1d");let m=f,h=!1;2===f.rank&&(h=!0,m=Object(d.reshape)(f,[1,f.shape[0],f.shape[1]])),o.assert(3===m.rank,(()=>`Error in conv1d: input must be rank 3, but got rank ${m.rank}.`)),o.assert(3===p.rank,(()=>`Error in conv1d: filter must be rank 3, but got rank ${p.rank}.`)),null!=c&&o.assert(o.isInt(a),(()=>`Error in conv1d: pad must be an integer when using, dimRoundingMode ${c} but got pad ${a}.`)),o.assert(m.shape[2]===p.shape[1],(()=>`Error in conv1d: depth of input (${m.shape[2]}) must match input depth for filter ${p.shape[1]}.`)),o.assert(i.eitherStridesOrDilationsAreOne(n,l),(()=>`Error in conv1D: Either stride or dilation must be 1. Got stride ${n} and dilation '${l}'`)),o.assert("NWC"===u,(()=>`Error in conv1d: got dataFormat of ${u} but only NWC is currently supported.`));const b=Object(d.reshape)(p,[1,p.shape[0],p.shape[1],p.shape[2]]),j=Object(d.reshape)(m,[m.shape[0],1,m.shape[1],m.shape[2]]),g=[1,n],w=[1,l],_=Object(r.conv2d)(j,b,g,a,"NHWC",w,c);return h?Object(d.reshape)(_,[_.shape[2],_.shape[3]]):Object(d.reshape)(_,[_.shape[0],_.shape[2],_.shape[3]])}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d.js": +/*!***************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d.js ***! + \***************************************************************/ +/*! exports provided: conv2d */function(e,t,n){"use strict";n.r(t),n.d(t,"conv2d",(function(){return l}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./conv_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const l=Object(d.op)({conv2d_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,d,l="NHWC",c=[1,1],f){const p=Object(r.convertToTensor)(e,"x","conv2d"),m=Object(r.convertToTensor)(t,"filter","conv2d");let h=p,b=!1;3===p.rank&&(b=!0,h=Object(u.reshape)(p,[1,p.shape[0],p.shape[1],p.shape[2]])),i.assert(4===h.rank,(()=>`Error in conv2d: input must be rank 4, but got rank ${h.rank}.`)),i.assert(4===m.rank,(()=>`Error in conv2d: filter must be rank 4, but got rank ${m.rank}.`)),null!=f&&i.assert(i.isInt(d),(()=>`Error in conv2d: pad must be an integer when using, dimRoundingMode ${f} but got pad ${d}.`));const j="NHWC"===l?h.shape[3]:h.shape[1];i.assert(j===m.shape[2],(()=>`Error in conv2d: depth of input (${j}) must match input depth for filter ${m.shape[2]}.`)),i.assert(a.eitherStridesOrDilationsAreOne(n,c),(()=>`Error in conv2D: Either strides or dilations must be 1. Got strides ${n} and dilations '${c}'`));const g={x:h,filter:m},w={strides:n,pad:d,dataFormat:l,dilations:c,dimRoundingMode:f},_=s.ENGINE.runKernel(o.Conv2D,g,w);return b?Object(u.reshape)(_,[_.shape[1],_.shape[2],_.shape[3]]):_}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d_backprop_filter.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d_backprop_filter.js ***! + \*******************************************************************************/ +/*! exports provided: conv2DBackpropFilter */function(e,t,n){"use strict";n.r(t),n.d(t,"conv2DBackpropFilter",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),a=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const d=Object(i.op)({conv2DBackpropFilter_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,i,d,u="NHWC",l){let c=e;3===e.rank&&(c=Object(a.reshape)(e,[1,e.shape[0],e.shape[1],e.shape[2]]));let f=t;3===f.rank&&(f=Object(a.reshape)(t,[1,t.shape[0],t.shape[1],t.shape[2]])),r.assert(4===c.rank,(()=>`Error in conv2dDerFilter: input must be rank 4, but got shape ${c.shape}.`)),r.assert(4===f.rank,(()=>`Error in conv2dDerFilter: dy must be rank 4, but got shape ${f.shape}.`)),r.assert(4===n.length,(()=>`Error in conv2dDerFilter: filterShape must be length 4, but got ${n}.`));const p="NHWC"===u?c.shape[3]:c.shape[1],m="NHWC"===u?f.shape[3]:f.shape[1];r.assert(p===n[2],(()=>`Error in conv2dDerFilter: depth of input ${p}) must match input depth in filter (${n[2]}.`)),r.assert(m===n[3],(()=>`Error in conv2dDerFilter: depth of dy (${m}) must match output depth for filter (${n[3]}).`)),null!=l&&r.assert(r.isInt(d),(()=>`Error in conv2dDerFilter: pad must be an integer when using, dimRoundingMode ${l} but got pad ${d}.`));const h={x:c,dy:f},b={strides:i,pad:d,dataFormat:u,dimRoundingMode:l,filterShape:n};return s.ENGINE.runKernel(o.Conv2DBackpropFilter,h,b)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d_backprop_input.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d_backprop_input.js ***! + \******************************************************************************/ +/*! exports provided: conv2DBackpropInput */function(e,t,n){"use strict";n.r(t),n.d(t,"conv2DBackpropInput",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),a=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const d=Object(i.op)({conv2DBackpropInput_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,i,d,u="NHWC",l){r.assert(e.length===t.rank,(()=>`Length of inShape (${e.length}) and rank of dy (${t.rank}) must match`));let c=e,f=t,p=!1;3===t.rank&&(p=!0,f=Object(a.reshape)(t,[1,t.shape[0],t.shape[1],t.shape[2]]),c=[1,e[0],e[1],e[2]]),r.assert(4===c.length,(()=>`Error in conv2dDerInput: inShape must be length 4, but got length ${c.length}.`)),r.assert(4===f.rank,(()=>`Error in conv2dDerInput: dy must be rank 4, but got rank ${f.rank}`)),r.assert(4===n.rank,(()=>`Error in conv2dDerInput: filter must be rank 4, but got rank ${n.rank}`));const m="NHWC"===u?c[3]:c[1],h="NHWC"===u?f.shape[3]:f.shape[1];r.assert(m===n.shape[2],(()=>`Error in conv2dDerInput: depth of input (${m}) must match input depth for filter ${n.shape[2]}.`)),r.assert(h===n.shape[3],(()=>`Error in conv2dDerInput: depth of output (${h}) must match output depth for filter ${n.shape[3]}.`)),null!=l&&r.assert(r.isInt(d),(()=>`Error in conv2dDerInput: pad must be an integer when using, dimRoundingMode ${l} but got pad ${d}.`));const b={dy:f,filter:n},j={strides:i,pad:d,dataFormat:u,dimRoundingMode:l,inputShape:c},g=s.ENGINE.runKernel(o.Conv2DBackpropInput,b,j);return p?Object(a.reshape)(g,[g.shape[1],g.shape[2],g.shape[3]]):g}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d_transpose.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d_transpose.js ***! + \*************************************************************************/ +/*! exports provided: conv2dTranspose */function(e,t,n){"use strict";n.r(t),n.d(t,"conv2dTranspose",(function(){return i}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ./conv2d_backprop_input */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d_backprop_input.js"),r=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const i=Object(r.op)({conv2dTranspose_:function(e,t,n,r,i,a){const d=Object(s.convertToTensor)(e,"x","conv2dTranspose"),u=Object(s.convertToTensor)(t,"filter","conv2dTranspose");return Object(o.conv2DBackpropInput)(n,d,u,r,i,"NHWC",a)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/conv3d.js": +/*!***************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/conv3d.js ***! + \***************************************************************/ +/*! exports provided: conv3d */function(e,t,n){"use strict";n.r(t),n.d(t,"conv3d",(function(){return l}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./conv_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const l=Object(d.op)({conv3d_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,d,l="NDHWC",c=[1,1,1]){const f=Object(r.convertToTensor)(e,"x","conv3d"),p=Object(r.convertToTensor)(t,"filter","conv3d");let m=f,h=!1;4===f.rank&&(h=!0,m=Object(u.reshape)(f,[1,f.shape[0],f.shape[1],f.shape[2],f.shape[3]])),i.assert(5===m.rank,(()=>`Error in conv3d: input must be rank 5, but got rank ${m.rank}.`)),i.assert(5===p.rank,(()=>`Error in conv3d: filter must be rank 5, but got rank ${p.rank}.`)),i.assert(m.shape[4]===p.shape[3],(()=>`Error in conv3d: depth of input (${m.shape[4]}) must match input depth for filter ${p.shape[3]}.`)),i.assert(Object(a.eitherStridesOrDilationsAreOne)(n,c),(()=>`Error in conv3D: Either strides or dilations must be 1. Got strides ${n} and dilations '${c}'`)),i.assert("NDHWC"===l,(()=>`Error in conv3d: got dataFormat of ${l} but only NDHWC is currently supported.`));const b={x:m,filter:p},j={strides:n,pad:d,dataFormat:l,dilations:c},g=s.ENGINE.runKernel(o.Conv3D,b,j);return h?Object(u.reshape)(g,[g.shape[1],g.shape[2],g.shape[3],g.shape[4]]):g}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/conv3d_backprop_input.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/conv3d_backprop_input.js ***! + \******************************************************************************/ +/*! exports provided: conv3DBackpropInput */function(e,t,n){"use strict";n.r(t),n.d(t,"conv3DBackpropInput",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),a=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const d=Object(i.op)({conv3DBackpropInput_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,i,d){r.assert(e.length===t.rank,(()=>`Length of inShape (${e.length}) and rank of dy (${t.rank}) must match`));let u=e,l=t,c=!1;4===t.rank&&(c=!0,l=Object(a.reshape)(t,[1,t.shape[0],t.shape[1],t.shape[2],t.shape[3]]),u=[1,e[0],e[1],e[2],e[3]]);const f=u[4],p=l.shape[4];r.assert(5===u.length,(()=>`Error in conv3dDerInput: inShape must be length 5, but got length ${u.length}.`)),r.assert(5===l.rank,(()=>`Error in conv3dDerInput: dy must be rank 5, but got rank ${l.rank}`)),r.assert(5===n.rank,(()=>`Error in conv3dDerInput: filter must be rank 5, but got rank ${n.rank}`)),r.assert(f===n.shape[3],(()=>`Error in conv3dDerInput: depth of input (${f}) must match input depth for filter ${n.shape[3]}.`)),r.assert(p===n.shape[4],(()=>`Error in conv3dDerInput: depth of output (${p}) must match output depth for filter ${n.shape[4]}.`));const m={dy:l,filter:n},h={pad:d,strides:i,inputShape:u},b=s.ENGINE.runKernel(o.Conv3DBackpropInputV2,m,h);return c?Object(a.reshape)(b,[b.shape[1],b.shape[2],b.shape[3],b.shape[4]]):b}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/conv3d_transpose.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/conv3d_transpose.js ***! + \*************************************************************************/ +/*! exports provided: conv3dTranspose */function(e,t,n){"use strict";n.r(t),n.d(t,"conv3dTranspose",(function(){return i}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ./conv3d_backprop_input */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv3d_backprop_input.js"),r=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const i=Object(r.op)({conv3dTranspose_:function(e,t,n,r,i){const a=Object(s.convertToTensor)(e,"x","conv3dTranspose"),d=Object(s.convertToTensor)(t,"filter","conv3dTranspose");return Object(o.conv3DBackpropInput)(n,a,d,r,i)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js ***! + \******************************************************************/ +/*! exports provided: computeDilation2DInfo, computePool2DInfo, computePool3DInfo, computeConv2DInfo, computeConv3DInfo, computeDefaultPad, tupleValuesAreOne, eitherStridesOrDilationsAreOne, convertConv2DDataFormat */function(e,t,n){"use strict"; +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function s(e,t,n,s,o="NHWC",r){return i(e,[...t,e[3]],n,r,s,null,null,h(o))}function o(e,t,n,s,o,r,a="channelsLast"){const[d,l]=u(t);let c;if("channelsLast"===a)c=[d,l,e[3],e[3]];else{if("channelsFirst"!==a)throw new Error(`Unknown dataFormat ${a}`);c=[d,l,e[1],e[1]]}return i(e,c,n,s,o,r,!1,a)}function r(e,t,n,s,o,r,i="NDHWC"){const[d,u,c]=l(t);let f,p;if("NDHWC"===i)p="channelsLast",f=[d,u,c,e[4],e[4]];else{if("NCDHW"!==i)throw new Error(`Unknown dataFormat ${i}`);p="channelsFirst",f=[d,u,c,e[1],e[1]]}return a(e,f,n,s,o,!1,p,r)}function i(e,t,n,s,o,r,i=!1,a="channelsLast"){let[l,p,m,h]=[-1,-1,-1,-1];if("channelsLast"===a)[l,p,m,h]=e;else{if("channelsFirst"!==a)throw new Error(`Unknown dataFormat ${a}`);[l,h,p,m]=e}const[b,j,,g]=t,[w,_]=u(n),[k,v]=u(s),x=c(b,k),y=c(j,v),{padInfo:O,outHeight:I,outWidth:C}=function(e,t,n,s,o,r,i,a,u){let l,c,p;if("number"==typeof e){l={top:e,bottom:e,left:e,right:e,type:0===e?"VALID":"NUMBER"};const o=function(e,t,n,s,o){null==s&&(s=d(e,t,n));const r=e[0],i=e[1],a=f((r-t+2*s)/n+1,o),u=f((i-t+2*s)/n+1,o);return[a,u]}([t,n],r,s,e,a);c=o[0],p=o[1]}else if("same"===e){c=Math.ceil(t/s),p=Math.ceil(n/o);const e=Math.max(0,(c-1)*s+r-t),a=Math.max(0,(p-1)*o+i-n),d=Math.floor(e/2),u=e-d,f=Math.floor(a/2);l={top:d,bottom:u,left:f,right:a-f,type:"SAME"}}else if("valid"===e)l={top:0,bottom:0,left:0,right:0,type:"VALID"},c=Math.ceil((t-r+1)/s),p=Math.ceil((n-i+1)/o);else{if("object"!=typeof e)throw Error(`Unknown padding parameter: ${e}`);{const d="channelsLast"===u?e[1][0]:e[2][0],m="channelsLast"===u?e[1][1]:e[2][1],h="channelsLast"===u?e[2][0]:e[3][0],b="channelsLast"===u?e[2][1]:e[3][1];l={top:d,bottom:m,left:h,right:b,type:0===d&&0===m&&0===h&&0===b?"VALID":"EXPLICIT"},c=f((t-r+d+m)/s+1,a),p=f((n-i+h+b)/o+1,a)}}return{padInfo:l,outHeight:c,outWidth:p}}(o,p,m,w,_,x,y,r,a),S=i?g*h:g;let T;return"channelsFirst"===a?T=[l,S,I,C]:"channelsLast"===a&&(T=[l,I,C,S]),{batchSize:l,dataFormat:a,inHeight:p,inWidth:m,inChannels:h,outHeight:I,outWidth:C,outChannels:S,padInfo:O,strideHeight:w,strideWidth:_,filterHeight:b,filterWidth:j,effectiveFilterHeight:x,effectiveFilterWidth:y,dilationHeight:k,dilationWidth:v,inShape:e,outShape:T,filterShape:t}}function a(e,t,n,s,o,r=!1,i="channelsLast",a){let[u,p,m,h,b]=[-1,-1,-1,-1,-1];if("channelsLast"===i)[u,p,m,h,b]=e;else{if("channelsFirst"!==i)throw new Error(`Unknown dataFormat ${i}`);[u,b,p,m,h]=e}const[j,g,w,,_]=t,[k,v,x]=l(n),[y,O,I]=l(s),C=c(j,y),S=c(g,O),T=c(w,I),{padInfo:N,outDepth:E,outHeight:A,outWidth:R}=function(e,t,n,s,o,r,i,a,u,l,c){let p,m,h,b;if("number"==typeof e){p={top:e,bottom:e,left:e,right:e,front:e,back:e,type:0===e?"VALID":"NUMBER"};const r=function(e,t,n,s,o,r){null==o&&(o=d(e,t,s));const i=e[0],a=e[1],u=e[2],l=f((i-t+2*o)/s+1,r),c=f((a-t+2*o)/s+1,r),p=f((u-t+2*o)/s+1,r);return[l,c,p,n]}([t,n,s,1],a,1,o,e,c);m=r[0],h=r[1],b=r[2]}else if("same"===e){m=Math.ceil(t/o),h=Math.ceil(n/r),b=Math.ceil(s/i);const e=(m-1)*o+a-t,d=(h-1)*r+u-n,c=(b-1)*i+l-s,f=Math.floor(e/2),j=e-f,g=Math.floor(d/2),w=d-g,_=Math.floor(c/2);p={top:g,bottom:w,left:_,right:c-_,front:f,back:j,type:"SAME"}}else{if("valid"!==e)throw Error(`Unknown padding parameter: ${e}`);p={top:0,bottom:0,left:0,right:0,front:0,back:0,type:"VALID"},m=Math.ceil((t-a+1)/o),h=Math.ceil((n-u+1)/r),b=Math.ceil((s-l+1)/i)}return{padInfo:p,outDepth:m,outHeight:h,outWidth:b}}(o,p,m,h,k,v,x,C,S,T,a),F=r?_*b:_;let $;return"channelsFirst"===i?$=[u,F,E,A,R]:"channelsLast"===i&&($=[u,E,A,R,F]),{batchSize:u,dataFormat:i,inDepth:p,inHeight:m,inWidth:h,inChannels:b,outDepth:E,outHeight:A,outWidth:R,outChannels:F,padInfo:N,strideDepth:k,strideHeight:v,strideWidth:x,filterDepth:j,filterHeight:g,filterWidth:w,effectiveFilterDepth:C,effectiveFilterHeight:S,effectiveFilterWidth:T,dilationDepth:y,dilationHeight:O,dilationWidth:I,inShape:e,outShape:$,filterShape:t}}function d(e,t,n,s=1){const o=c(t,s);return Math.floor((e[0]*(n-1)-n+o)/2)}function u(e){return"number"==typeof e?[e,e,e]:2===e.length?[e[0],e[1],1]:e}function l(e){return"number"==typeof e?[e,e,e]:e}function c(e,t){return t<=1?e:e+(e-1)*(t-1)}function f(e,t){if(!t)return Math.trunc(e);switch(t){case"round":return Math.round(e);case"ceil":return Math.ceil(e);case"floor":return Math.floor(e);default:throw new Error(`Unknown roundingMode ${t}`)}}function p(e){const[t,n,s]=u(e);return 1===t&&1===n&&1===s}function m(e,t){return p(e)||p(t)}function h(e){if("NHWC"===e)return"channelsLast";if("NCHW"===e)return"channelsFirst";throw new Error(`Unknown dataFormat ${e}`)}n.r(t),n.d(t,"computeDilation2DInfo",(function(){return s})),n.d(t,"computePool2DInfo",(function(){return o})),n.d(t,"computePool3DInfo",(function(){return r})),n.d(t,"computeConv2DInfo",(function(){return i})),n.d(t,"computeConv3DInfo",(function(){return a})),n.d(t,"computeDefaultPad",(function(){return d})),n.d(t,"tupleValuesAreOne",(function(){return p})),n.d(t,"eitherStridesOrDilationsAreOne",(function(){return m})),n.d(t,"convertConv2DDataFormat",(function(){return h}))},"./node_modules/@tensorflow/tfjs-core/dist/ops/cos.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/cos.js ***! + \************************************************************/ +/*! exports provided: cos */function(e,t,n){"use strict";n.r(t),n.d(t,"cos",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({cos_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","cos")};return s.ENGINE.runKernel(o.Cos,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/cosh.js": +/*!*************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/cosh.js ***! + \*************************************************************/ +/*! exports provided: cosh */function(e,t,n){"use strict";n.r(t),n.d(t,"cosh",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({cosh_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","cosh")};return s.ENGINE.runKernel(o.Cosh,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/cumsum.js": +/*!***************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/cumsum.js ***! + \***************************************************************/ +/*! exports provided: cumsum */function(e,t,n){"use strict";n.r(t),n.d(t,"cumsum",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({cumsum_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=0,n=!1,i=!1){const a={x:Object(r.convertToTensor)(e,"x","cumsum")},d={axis:t,exclusive:n,reverse:i};return s.ENGINE.runKernel(o.Cumsum,a,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/dense_bincount.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/dense_bincount.js ***! + \***********************************************************************/ +/*! exports provided: denseBincount */function(e,t,n){"use strict";n.r(t),n.d(t,"denseBincount",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({denseBincount_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,a=!1){const d=Object(r.convertToTensor)(e,"x","denseBincount"),u=Object(r.convertToTensor)(t,"weights","denseBincount");i.assert("int32"===d.dtype,(()=>`Error in denseBincount: input dtype must be int32, but got ${d.dtype}`)),i.assert(d.rank<=2,(()=>`Error in denseBincount: input must be at most rank 2, but got rank ${d.rank}.`)),i.assert(n>=0,(()=>`size must be non-negative, but got ${n}.`)),i.assert(u.size===d.size||0===u.size,(()=>`Error in denseBincount: weights must have the same shape as x or 0-length, but got x shape: ${d.shape}, weights shape: ${u.shape}.`));const l={x:d,weights:u},c={size:n,binaryOutput:a};return s.ENGINE.runKernel(o.DenseBincount,l,c)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/depth_to_space.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/depth_to_space.js ***! + \***********************************************************************/ +/*! exports provided: depthToSpace */function(e,t,n){"use strict";n.r(t),n.d(t,"depthToSpace",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({depthToSpace_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n="NHWC"){const a=Object(r.convertToTensor)(e,"x","depthToSpace"),d="NHWC"===n?a.shape[1]:a.shape[2],u="NHWC"===n?a.shape[2]:a.shape[3],l="NHWC"===n?a.shape[3]:a.shape[1];i.assert(d*t>=0,(()=>`Negative dimension size caused by overflow when multiplying\n ${d} and ${t} for depthToSpace with input shape\n ${a.shape}`)),i.assert(u*t>=0,(()=>`Negative dimension size caused by overflow when multiplying\n ${u} and ${t} for depthToSpace with input shape\n ${a.shape}`)),i.assert(l%(t*t)==0,(()=>`Dimension size must be evenly divisible by ${t*t} but is ${l} for depthToSpace with input shape ${a.shape}`));const c={x:a},f={blockSize:t,dataFormat:n};return s.ENGINE.runKernel(o.DepthToSpace,c,f)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d.js ***! + \*************************************************************************/ +/*! exports provided: depthwiseConv2d */function(e,t,n){"use strict";n.r(t),n.d(t,"depthwiseConv2d",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),d=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const u=Object(a.op)({depthwiseConv2d_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,a,u="NHWC",l=[1,1],c){const f=Object(r.convertToTensor)(e,"x","depthwiseConv2d"),p=Object(r.convertToTensor)(t,"filter","depthwiseConv2d");let m=f,h=!1;3===f.rank&&(h=!0,m=Object(d.reshape)(f,[1,f.shape[0],f.shape[1],f.shape[2]])),i.assert(4===m.rank,(()=>`Error in depthwiseConv2d: input must be rank 4, but got rank ${m.rank}.`)),i.assert(4===p.rank,(()=>`Error in depthwiseConv2d: filter must be rank 4, but got rank ${p.rank}.`)),i.assert(m.shape[3]===p.shape[2],(()=>`Error in depthwiseConv2d: number of input channels (${m.shape[3]}) must match the inChannels dimension in filter ${p.shape[2]}.`)),null!=c&&i.assert(i.isInt(a),(()=>`Error in depthwiseConv2d: pad must be an integer when using, dimRoundingMode ${c} but got pad ${a}.`));const b={x:m,filter:p},j={strides:n,pad:a,dataFormat:u,dilations:l,dimRoundingMode:c},g=s.ENGINE.runKernel(o.DepthwiseConv2dNative,b,j);return h?Object(d.reshape)(g,[g.shape[1],g.shape[2],g.shape[3]]):g}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d_native_backprop_filter.js": +/*!************************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d_native_backprop_filter.js ***! + \************************************************************************************************/ +/*! exports provided: depthwiseConv2dNativeBackpropFilter */function(e,t,n){"use strict";n.r(t),n.d(t,"depthwiseConv2dNativeBackpropFilter",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),i=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const a=Object(r.op)({depthwiseConv2dNativeBackpropFilter_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,r,a,d=[1,1],u){let l=e;3===e.rank&&(l=Object(i.reshape)(e,[1,e.shape[0],e.shape[1],e.shape[2]]));let c=t;3===c.rank&&(c=Object(i.reshape)(t,[1,t.shape[0],t.shape[1],t.shape[2]]));const f={x:l,dy:c},p={strides:r,pad:a,dimRoundingMode:u,dilations:d,filterShape:n};return s.ENGINE.runKernel(o.DepthwiseConv2dNativeBackpropFilter,f,p)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d_native_backprop_input.js": +/*!***********************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d_native_backprop_input.js ***! + \***********************************************************************************************/ +/*! exports provided: depthwiseConv2dNativeBackpropInput */function(e,t,n){"use strict";n.r(t),n.d(t,"depthwiseConv2dNativeBackpropInput",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),i=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const a=Object(r.op)({depthwiseConv2dNativeBackpropInput_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,r,a,d=[1,1],u){let l=t,c=!1;3===t.rank&&(c=!0,l=Object(i.reshape)(t,[1,t.shape[0],t.shape[1],t.shape[2]]));const f={dy:l,filter:n},p={strides:r,pad:a,dimRoundingMode:u,dilations:d,inputShape:e},m=s.ENGINE.runKernel(o.DepthwiseConv2dNativeBackpropInput,f,p);return c?Object(i.reshape)(m,[m.shape[1],m.shape[2],m.shape[3]]):m}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/diag.js": +/*!*************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/diag.js ***! + \*************************************************************/ +/*! exports provided: diag */function(e,t,n){"use strict";n.r(t),n.d(t,"diag",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({diag_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","diag")};return s.ENGINE.runKernel(o.Diag,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/dilation2d.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/dilation2d.js ***! + \*******************************************************************/ +/*! exports provided: dilation2d */function(e,t,n){"use strict";n.r(t),n.d(t,"dilation2d",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),d=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const u=Object(a.op)({dilation2d_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,a,u=[1,1],l="NHWC"){const c=Object(r.convertToTensor)(e,"x","dilation2d"),f=Object(r.convertToTensor)(t,"filter","dilation2d");i.assert(3===c.rank||4===c.rank,(()=>`Error in dilation2d: input must be rank 3 or 4, but got rank ${c.rank}.`)),i.assert(3===f.rank,(()=>`Error in dilation2d: filter must be rank 3, but got rank ${f.rank}.`)),i.assert("NHWC"===l,(()=>`Error in dilation2d: Only NHWC is currently supported, but got dataFormat of ${l}`));let p=c,m=!1;3===c.rank&&(p=Object(d.reshape)(c,[1,c.shape[0],c.shape[1],c.shape[2]]),m=!0);const h={x:p,filter:f},b={strides:n,pad:a,dilations:u},j=s.ENGINE.runKernel(o.Dilation2D,h,b);return m?Object(d.reshape)(j,[j.shape[1],j.shape[2],j.shape[3]]):j}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/div.js ***! + \************************************************************/ +/*! exports provided: div */function(e,t,n){"use strict";n.r(t),n.d(t,"div",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./floorDiv */"./node_modules/@tensorflow/tfjs-core/dist/ops/floorDiv.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(d.op)({div_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){let n=Object(i.convertToTensor)(e,"a","div"),d=Object(i.convertToTensor)(t,"b","div");if([n,d]=Object(r.makeTypesMatch)(n,d),"int32"===n.dtype&&"int32"===d.dtype)return Object(a.floorDiv)(n,d);const u={a:n,b:d};return s.ENGINE.runKernel(o.RealDiv,u,{})}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/div_no_nan.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/div_no_nan.js ***! + \*******************************************************************/ +/*! exports provided: divNoNan */function(e,t,n){"use strict";n.r(t),n.d(t,"divNoNan",(function(){return l}));var s=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),o=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),r=n(/*! ./div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),i=n(/*! ./equal */"./node_modules/@tensorflow/tfjs-core/dist/ops/equal.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),d=n(/*! ./where */"./node_modules/@tensorflow/tfjs-core/dist/ops/where.js"),u=n(/*! ./zeros_like */"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js");const l=Object(a.op)({divNoNan_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){let n=Object(o.convertToTensor)(e,"a","div"),a=Object(o.convertToTensor)(t,"b","div");[n,a]=Object(s.makeTypesMatch)(n,a);const l=Object(r.div)(n,a),c=Object(u.zerosLike)(l),f=Object(i.equal)(a,c);return Object(d.where)(f,c,l)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/dot.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/dot.js ***! + \************************************************************/ +/*! exports provided: dot */function(e,t,n){"use strict";n.r(t),n.d(t,"dot",(function(){return d}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./mat_mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mat_mul.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),a=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const d=Object(i.op)({dot_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){const n=Object(s.convertToTensor)(e,"t1","dot"),i=Object(s.convertToTensor)(t,"t2","dot");o.assert(!(1!==n.rank&&2!==n.rank||1!==i.rank&&2!==i.rank),(()=>`Error in dot: inputs must all be rank 1 or 2, but got ranks ${n.rank} and ${i.rank}.`));const d=1===n.rank?n.size:n.shape[1],u=1===i.rank?i.size:i.shape[0];if(o.assert(d===u,(()=>`Error in dot: inner dimensions of inputs must match, but got ${d} and ${u}.`)),1===n.rank&&1===i.rank){const e=Object(a.reshape)(n,[1,-1]),t=Object(a.reshape)(i,[-1,1]),s=Object(r.matMul)(e,t);return Object(a.reshape)(s,[])}if(1===n.rank&&2===i.rank){const e=Object(a.reshape)(n,[1,-1]),t=Object(a.reshape)(i,[i.shape[0],i.shape[1]]),s=Object(r.matMul)(e,t);return Object(a.reshape)(s,[s.size])}if(2===n.rank&&1===i.rank){const e=Object(a.reshape)(i,[-1,1]),t=Object(r.matMul)(n,e);return Object(a.reshape)(t,[t.size])}{const e=Object(a.reshape)(i,[i.shape[0],i.shape[1]]);return Object(r.matMul)(n,e)}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/dropout.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/dropout.js ***! + \****************************************************************/ +/*! exports provided: dropout */function(e,t,n){"use strict";n.r(t),n.d(t,"dropout",(function(){return p}));var s=n(/*! ../tensor */"./node_modules/@tensorflow/tfjs-core/dist/tensor.js"),o=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),r=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),i=n(/*! ./add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),a=n(/*! ./div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),d=n(/*! ./dropout_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/dropout_util.js"),u=n(/*! ./floor */"./node_modules/@tensorflow/tfjs-core/dist/ops/floor.js"),l=n(/*! ./mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),c=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),f=n(/*! ./random_uniform */"./node_modules/@tensorflow/tfjs-core/dist/ops/random_uniform.js");const p=Object(c.op)({dropout_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,c){const p=Object(o.convertToTensor)(e,"x","dropout");if(r.assert("float32"===p.dtype,(()=>`x has to be a floating point tensor since it's going to be scaled, but got a ${p.dtype} tensor instead.`)),r.assert(t>=0&&t<1,(()=>`rate must be a float in the range [0, 1), but got ${t}.`)),0===t)return e instanceof s.Tensor?p.clone():p;const m=Object(d.getNoiseShape)(p,n),h=1-t,b=Object(a.div)(Object(u.floor)(Object(i.add)(Object(f.randomUniform)(m,0,1,"float32",c),h)),h);return Object(l.mul)(p,b)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/dropout_util.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/dropout_util.js ***! + \*********************************************************************/ +/*! exports provided: getNoiseShape */function(e,t,n){"use strict";n.r(t),n.d(t,"getNoiseShape",(function(){return o}));var s=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t){if(null==t)return e.shape.slice();if(s.arraysEqual(e.shape,t))return t;if(e.shape.length===t.length){const n=[];for(let s=0;sObject(r.convertToTensor)(e,`tensors${t}`,"einsum"))),i={equation:e};return s.ENGINE.runKernel(o.Einsum,n,i)}const d=Object(i.op)({einsum_:a})},"./node_modules/@tensorflow/tfjs-core/dist/ops/elu.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/elu.js ***! + \************************************************************/ +/*! exports provided: elu */function(e,t,n){"use strict";n.r(t),n.d(t,"elu",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({elu_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","elu")};return s.ENGINE.runKernel(o.Elu,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/equal.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/equal.js ***! + \**************************************************************/ +/*! exports provided: equal */function(e,t,n){"use strict";n.r(t),n.d(t,"equal",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(d.op)({equal_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){let n=Object(i.convertToTensor)(e,"a","equal","string_or_numeric"),d=Object(i.convertToTensor)(t,"b","equal","string_or_numeric");[n,d]=Object(r.makeTypesMatch)(n,d),Object(a.assertAndGetBroadcastShape)(n.shape,d.shape);const u={a:n,b:d};return s.ENGINE.runKernel(o.Equal,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/erf.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/erf.js ***! + \************************************************************/ +/*! exports provided: erf */function(e,t,n){"use strict";n.r(t),n.d(t,"erf",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(d.op)({erf_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){let t=Object(r.convertToTensor)(e,"x","erf");i.assert("int32"===t.dtype||"float32"===t.dtype,(()=>"Input dtype must be `int32` or `float32`.")),"int32"===t.dtype&&(t=Object(a.cast)(t,"float32"));const n={x:t};return s.ENGINE.runKernel(o.Erf,n)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/erf_util.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/erf_util.js ***! + \*****************************************************************/ +/*! exports provided: ERF_P, ERF_A1, ERF_A2, ERF_A3, ERF_A4, ERF_A5 */function(e,t,n){"use strict";n.r(t),n.d(t,"ERF_P",(function(){return s})),n.d(t,"ERF_A1",(function(){return o})),n.d(t,"ERF_A2",(function(){return r})),n.d(t,"ERF_A3",(function(){return i})),n.d(t,"ERF_A4",(function(){return a})),n.d(t,"ERF_A5",(function(){return d})); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const s=.3275911,o=.254829592,r=-.284496736,i=1.421413741,a=-1.453152027,d=1.061405429},"./node_modules/@tensorflow/tfjs-core/dist/ops/exp.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/exp.js ***! + \************************************************************/ +/*! exports provided: exp */function(e,t,n){"use strict";n.r(t),n.d(t,"exp",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({exp_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","exp")};return s.ENGINE.runKernel(o.Exp,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/expand_dims.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/expand_dims.js ***! + \********************************************************************/ +/*! exports provided: expandDims */function(e,t,n){"use strict";n.r(t),n.d(t,"expandDims",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({expandDims_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=0){const n=Object(r.convertToTensor)(e,"x","expandDims","string_or_numeric");i.assert(t<=n.rank,(()=>"Axis must be <= rank of the tensor"));const a={input:n},d={dim:t};return s.ENGINE.runKernel(o.ExpandDims,a,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/expm1.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/expm1.js ***! + \**************************************************************/ +/*! exports provided: expm1 */function(e,t,n){"use strict";n.r(t),n.d(t,"expm1",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({expm1_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","expm1")};return s.ENGINE.runKernel(o.Expm1,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/eye.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/eye.js ***! + \************************************************************/ +/*! exports provided: eye */function(e,t,n){"use strict";n.r(t),n.d(t,"eye",(function(){return d}));var s=n(/*! ./buffer */"./node_modules/@tensorflow/tfjs-core/dist/ops/buffer.js"),o=n(/*! ./expand_dims */"./node_modules/@tensorflow/tfjs-core/dist/ops/expand_dims.js"),r=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),i=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),a=n(/*! ./tile */"./node_modules/@tensorflow/tfjs-core/dist/ops/tile.js");const d=Object(r.op)({eye_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,r="float32"){null==t&&(t=e);const d=Object(s.buffer)([e,t],r),u=e<=t?e:t;for(let e=0;e`Error in fused conv2d: input must be rank 4, but got rank ${C.rank}.`)),d.assert(4===I.rank,(()=>`Error in fused conv2d: filter must be rank 4, but got rank ${I.rank}.`)),null!=_&&d.assert(d.isInt(b),(()=>`Error in fused conv2d: pad must be an integer when using, dimRoundingMode ${_} but got pad ${b}.`)),d.assert(C.shape[3]===I.shape[2],(()=>`Error in conv2d: depth of input (${C.shape[3]}) must match input depth for filter ${I.shape[2]}.`)),d.assert(m.eitherStridesOrDilationsAreOne(n,w),(()=>`Error in conv2D: Either strides or dilations must be 1. Got strides ${n} and dilations '${w}'`)),d.assert("NHWC"===g,(()=>`Error in conv2d: got dataFormat of ${g} but only NHWC is currently supported.`));const T=m.computeConv2DInfo(C.shape,I.shape,n,w,b,_);let N,E;null!=k&&(N=Object(a.convertToTensor)(k,"bias","fused conv2d"),[N]=Object(i.makeTypesMatch)(N,O),l.assertAndGetBroadcastShape(T.outShape,N.shape)),null!=x&&(E=Object(a.convertToTensor)(x,"prelu weights","fused conv2d"));const A=(e,t)=>{const[s,o,r,i]=t,a=Object(h.getFusedDyActivation)(e,r,v);d.assert(m.tupleValuesAreOne(w),(()=>`Error in gradient of fused conv2D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${w}'`));const u=[Object(p.conv2DBackpropInput)(o.shape,a,s,n,b),Object(f.conv2DBackpropFilter)(o,a,s.shape,n,b)];if(null!=i){const e=Object(h.getFusedBiasGradient)(i,a);u.push(e)}return u},R={x:C,filter:I,bias:N,preluActivationWeights:E},F={strides:n,pad:b,dataFormat:g,dilations:w,dimRoundingMode:_,activation:v,leakyreluAlpha:y};if(null==k){return Object(o.customGrad)(((e,t,n)=>{let o=s.ENGINE.runKernel(r.FusedConv2D,R,F);return n([t,e,o]),S&&(o=Object(j.reshape)(o,[o.shape[1],o.shape[2],o.shape[3]])),{value:o,gradFunc:A}}))(C,I)}return Object(o.customGrad)(((e,t,n,o)=>{let i=s.ENGINE.runKernel(r.FusedConv2D,R,F);return o([t,e,i,n]),S&&(i=Object(j.reshape)(i,[i.shape[1],i.shape[2],i.shape[3]])),{value:i,gradFunc:A}}))(C,I,N)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/fused/depthwise_conv2d.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/fused/depthwise_conv2d.js ***! + \*******************************************************************************/ +/*! exports provided: depthwiseConv2d */function(e,t,n){"use strict";n.r(t),n.d(t,"depthwiseConv2d",(function(){return g}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../gradients */"./node_modules/@tensorflow/tfjs-core/dist/gradients.js"),r=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),i=n(/*! ../../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),a=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),d=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),u=n(/*! ../add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),l=n(/*! ../broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),c=n(/*! ../conv_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js"),f=n(/*! ../depthwise_conv2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d.js"),p=n(/*! ../depthwise_conv2d_native_backprop_filter */"./node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d_native_backprop_filter.js"),m=n(/*! ../depthwise_conv2d_native_backprop_input */"./node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d_native_backprop_input.js"),h=n(/*! ../fused_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/fused_util.js"),b=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),j=n(/*! ../reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const g=Object(b.op)({fusedDepthwiseConv2d_: +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function({x:e,filter:t,strides:n,pad:b,dataFormat:g="NHWC",dilations:w=[1,1],dimRoundingMode:_,bias:k,activation:v="linear",preluActivationWeights:x,leakyreluAlpha:y}){if(!1===Object(h.shouldFuse)(s.ENGINE.state.gradientDepth,v)){let s=Object(f.depthwiseConv2d)(e,t,n,b,g,w,_);return null!=k&&(s=Object(u.add)(s,k)),Object(h.applyActivation)(s,v,x,y)}const O=Object(a.convertToTensor)(e,"x","depthwiseConv2d"),I=Object(a.convertToTensor)(t,"filter","depthwiseConv2d");let C=O,S=!1;3===O.rank&&(S=!0,C=Object(j.reshape)(O,[1,O.shape[0],O.shape[1],O.shape[2]])),d.assert(4===C.rank,(()=>`Error in fused depthwiseConv2d: input must be rank 4, but got rank ${C.rank}.`)),d.assert(4===I.rank,(()=>`Error in fused depthwiseConv2d: filter must be rank 4, but got rank ${I.rank}.`)),d.assert(C.shape[3]===I.shape[2],(()=>`Error in fused depthwiseConv2d: number of input channels (${C.shape[3]}) must match the inChannels dimension in filter ${I.shape[2]}.`)),null==w&&(w=[1,1]),d.assert(c.eitherStridesOrDilationsAreOne(n,w),(()=>`Error in fused depthwiseConv2d: Either strides or dilations must be 1. Got strides ${n} and dilations '${w}'`)),null!=_&&d.assert(d.isInt(b),(()=>`Error in fused depthwiseConv2d: pad must be an integer when using dimRoundingMode ${_} but got pad ${b}.`));const T=c.computeConv2DInfo(C.shape,I.shape,n,w,b,_,!0);let N,E;null!=k&&(N=Object(a.convertToTensor)(k,"bias","fused conv2d"),[N]=Object(i.makeTypesMatch)(N,O),l.assertAndGetBroadcastShape(T.outShape,N.shape)),null!=x&&(E=Object(a.convertToTensor)(x,"prelu weights","fused depthwiseConv2d"));const A=(e,t)=>{d.assert(c.tupleValuesAreOne(w),(()=>`Error in gradient of fused depthwiseConv2d: dilation rates greater than 1 are not yet supported. Got dilations '${w}'`));const[s,o,r,i]=t,a=Object(h.getFusedDyActivation)(e,r,v),u=Object(m.depthwiseConv2dNativeBackpropInput)(o.shape,a,s,n,b,w,_),l=Object(p.depthwiseConv2dNativeBackpropFilter)(o,a,s.shape,n,b,w,_);if(null!=i){return[u,l,Object(h.getFusedBiasGradient)(N,a)]}return[u,l]},R={x:C,filter:I,bias:N,preluActivationWeights:E},F={strides:n,pad:b,dataFormat:g,dilations:w,dimRoundingMode:_,activation:v,leakyreluAlpha:y};if(null==k){return Object(o.customGrad)(((e,t,n)=>{let o=s.ENGINE.runKernel(r.FusedDepthwiseConv2D,R,F);return n([t,e,o]),S&&(o=Object(j.reshape)(o,[o.shape[1],o.shape[2],o.shape[3]])),{value:o,gradFunc:A}}))(C,I)}return Object(o.customGrad)(((e,t,n,o)=>{let i=s.ENGINE.runKernel(r.FusedDepthwiseConv2D,R,F);return o([t,e,i,n]),S&&(i=Object(j.reshape)(i,[i.shape[1],i.shape[2],i.shape[3]])),{value:i,gradFunc:A}}))(C,I,N)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/fused/mat_mul.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/fused/mat_mul.js ***! + \**********************************************************************/ +/*! exports provided: matMul */function(e,t,n){"use strict";n.r(t),n.d(t,"matMul",(function(){return h}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../gradients */"./node_modules/@tensorflow/tfjs-core/dist/gradients.js"),r=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),i=n(/*! ../../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),a=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),d=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),u=n(/*! ../add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),l=n(/*! ../broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),c=n(/*! ../fused_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/fused_util.js"),f=n(/*! ../mat_mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mat_mul.js"),p=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),m=n(/*! ../reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const h=Object(p.op)({fusedMatMul_: +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function({a:e,b:t,transposeA:n=!1,transposeB:p=!1,bias:h,activation:b="linear",preluActivationWeights:j,leakyreluAlpha:g}){if(!1===Object(c.shouldFuse)(s.ENGINE.state.gradientDepth,b)){let s=Object(f.matMul)(e,t,n,p);return null!=h&&(s=Object(u.add)(s,h)),Object(c.applyActivation)(s,b,j,g)}let w=Object(a.convertToTensor)(e,"a","fused matMul"),_=Object(a.convertToTensor)(t,"b","fused matMul");[w,_]=Object(i.makeTypesMatch)(w,_);const k=n?w.shape[w.rank-2]:w.shape[w.rank-1],v=p?_.shape[_.rank-1]:_.shape[_.rank-2],x=n?w.shape[w.rank-1]:w.shape[w.rank-2],y=p?_.shape[_.rank-2]:_.shape[_.rank-1],O=w.shape.slice(0,-2),I=_.shape.slice(0,-2),C=d.sizeFromShape(O),S=d.sizeFromShape(I);d.assert(w.rank>=2&&_.rank>=2&&w.rank===_.rank,(()=>`Error in fused matMul: inputs must have the same rank of at least 2, got ranks ${w.rank} and ${_.rank}.`)),d.assert(d.arraysEqual(O,I),(()=>`Error in fused matMul: outer dimensions (${O}) and (${I}) of Tensors with shapes ${w.shape} and ${_.shape} must match.`)),d.assert(k===v,(()=>`Error in fused matMul: inner shapes (${k}) and (${v}) of Tensors with shapes ${w.shape} and ${_.shape} and transposeA=${n} and transposeB=${p} must match.`));const T=w.shape.slice(0,-2).concat([x,y]),N=n?Object(m.reshape)(w,[C,k,x]):Object(m.reshape)(w,[C,x,k]),E=p?Object(m.reshape)(_,[S,y,v]):Object(m.reshape)(_,[S,v,y]);let A,R;null!=h&&(A=Object(a.convertToTensor)(h,"bias","fused matMul"),[A]=Object(i.makeTypesMatch)(A,w),l.assertAndGetBroadcastShape(T,A.shape)),null!=j&&(R=Object(a.convertToTensor)(j,"prelu weights","fused matMul"));const F=(e,t)=>{const[s,o,r,i]=t,a=Object(c.getFusedDyActivation)(Object(m.reshape)(e,r.shape),r,b);let d,u;if(n||p?!n&&p?(d=Object(f.matMul)(a,o,!1,!1),u=Object(f.matMul)(a,s,!0,!1)):n&&!p?(d=Object(f.matMul)(o,a,!1,!0),u=Object(f.matMul)(s,a,!1,!1)):(d=Object(f.matMul)(o,a,!0,!0),u=Object(f.matMul)(a,s,!0,!0)):(d=Object(f.matMul)(a,o,!1,!0),u=Object(f.matMul)(s,a,!0,!1)),null!=h){return[d,u,Object(c.getFusedBiasGradient)(i,a)]}return[d,u]},$={a:N,b:E,bias:A,preluActivationWeights:R},M={transposeA:n,transposeB:p,activation:b,leakyreluAlpha:g};if(null==h){return Object(o.customGrad)(((e,t,n)=>{const o=s.ENGINE.runKernel(r._FusedMatMul,$,M);return n([e,t,o]),{value:Object(m.reshape)(o,T),gradFunc:F}}))(N,E)}return Object(o.customGrad)(((e,t,n,o)=>{const i=s.ENGINE.runKernel(r._FusedMatMul,$,M);return o([e,t,i,n]),{value:Object(m.reshape)(i,T),gradFunc:F}}))(N,E,A)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/fused_ops.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/fused_ops.js ***! + \******************************************************************/ +/*! exports provided: conv2d, depthwiseConv2d, matMul */function(e,t,n){"use strict";n.r(t);var s=n(/*! ./fused/conv2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/fused/conv2d.js");n.d(t,"conv2d",(function(){return s.conv2d}));var o=n(/*! ./fused/depthwise_conv2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/fused/depthwise_conv2d.js");n.d(t,"depthwiseConv2d",(function(){return o.depthwiseConv2d}));var r=n(/*! ./fused/mat_mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/fused/mat_mul.js");n.d(t,"matMul",(function(){return r.matMul}))},"./node_modules/@tensorflow/tfjs-core/dist/ops/fused_util.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/fused_util.js ***! + \*******************************************************************/ +/*! exports provided: getFusedDyActivation, getFusedBiasGradient, applyActivation, shouldFuse */function(e,t,n){"use strict";n.r(t),n.d(t,"getFusedDyActivation",(function(){return m})),n.d(t,"getFusedBiasGradient",(function(){return h})),n.d(t,"applyActivation",(function(){return b})),n.d(t,"shouldFuse",(function(){return j}));var s=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),o=n(/*! ./elu */"./node_modules/@tensorflow/tfjs-core/dist/ops/elu.js"),r=n(/*! ./leaky_relu */"./node_modules/@tensorflow/tfjs-core/dist/ops/leaky_relu.js"),i=n(/*! ./mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),a=n(/*! ./prelu */"./node_modules/@tensorflow/tfjs-core/dist/ops/prelu.js"),d=n(/*! ./relu */"./node_modules/@tensorflow/tfjs-core/dist/ops/relu.js"),u=n(/*! ./relu6 */"./node_modules/@tensorflow/tfjs-core/dist/ops/relu6.js"),l=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),c=n(/*! ./sigmoid */"./node_modules/@tensorflow/tfjs-core/dist/ops/sigmoid.js"),f=n(/*! ./step */"./node_modules/@tensorflow/tfjs-core/dist/ops/step.js"),p=n(/*! ./sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function m(e,t,n){if(null==n||"linear"===n)return e;if("relu"===n)return Object(i.mul)(e,Object(f.step)(t));throw new Error(`Cannot compute gradient for fused activation ${n}.`)}function h(e,t){let n=t;const o=s.getReductionAxes(e.shape,t.shape);return o.length>0&&(n=Object(p.sum)(n,o)),Object(l.reshape)(n,e.shape)}function b(e,t,n,s){if("linear"===t)return e;if("relu"===t)return Object(d.relu)(e);if("elu"===t)return Object(o.elu)(e);if("relu6"===t)return Object(u.relu6)(e);if("prelu"===t)return Object(a.prelu)(e,n);if("leakyrelu"===t)return Object(r.leakyRelu)(e,s);if("sigmoid"===t)return Object(c.sigmoid)(e);throw new Error(`Unknown fused activation ${t}.`)}const j=(e,t)=>!(e>0)||"linear"===t},"./node_modules/@tensorflow/tfjs-core/dist/ops/gather.js": +/*!***************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/gather.js ***! + \***************************************************************/ +/*! exports provided: gather */function(e,t,n){"use strict";n.r(t),n.d(t,"gather",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({gather_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n=0,i=0){const a={x:Object(r.convertToTensor)(e,"x","gather"),indices:Object(r.convertToTensor)(t,"indices","gather","int32")},d={axis:n,batchDims:i};return s.ENGINE.runKernel(o.GatherV2,a,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/gather_nd.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/gather_nd.js ***! + \******************************************************************/ +/*! exports provided: gatherND */function(e,t,n){"use strict";n.r(t),n.d(t,"gatherND",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({gatherND_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){const n=Object(r.convertToTensor)(t,"indices","gatherND","int32"),i={params:Object(r.convertToTensor)(e,"x","gatherND","string_or_numeric"),indices:n};return s.ENGINE.runKernel(o.GatherNd,i)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/gather_nd_util.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/gather_nd_util.js ***! + \***********************************************************************/ +/*! exports provided: prepareAndValidate */function(e,t,n){"use strict";n.r(t),n.d(t,"prepareAndValidate",(function(){return o}));var s=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js");function o(e,t){const n=e.shape.length,o=t.shape.length;if(n<1)throw new Error(`tf.gatherND() expects the input to be rank 1 or higher, but the rank was ${n}.`);if(o<1)throw new Error(`tf.gatherND() expects the indices to be rank 1 or higher, but the rank was ${o}.`);if("int32"!==t.dtype)throw new Error(`tf.gatherND() expects the indices to be int32 type, but the dtype was ${t.dtype}.`);if(t.shape[o-1]>n)throw new Error(`index innermost dimension length must be <= tensor rank; saw: ${t.shape[o-1]} vs. ${n}`);if(0===Object(s.sizeFromShape)(e.shape))throw new Error(`Requested more than 0 entries, but input is empty. Input shape: ${e.shape}.`);const r=t.shape,i=r[r.length-1];let a=1;for(let e=0;ee/l)),1].slice(0,i);return[u,a,l,c]}},"./node_modules/@tensorflow/tfjs-core/dist/ops/greater.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/greater.js ***! + \****************************************************************/ +/*! exports provided: greater */function(e,t,n){"use strict";n.r(t),n.d(t,"greater",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(d.op)({greater_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){let n=Object(i.convertToTensor)(e,"a","greater","string_or_numeric"),d=Object(i.convertToTensor)(t,"b","greater","string_or_numeric");[n,d]=Object(r.makeTypesMatch)(n,d),Object(a.assertAndGetBroadcastShape)(n.shape,d.shape);const u={a:n,b:d};return s.ENGINE.runKernel(o.Greater,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/greater_equal.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/greater_equal.js ***! + \**********************************************************************/ +/*! exports provided: greaterEqual */function(e,t,n){"use strict";n.r(t),n.d(t,"greaterEqual",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(d.op)({greaterEqual_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){let n=Object(i.convertToTensor)(e,"a","greaterEqual","string_or_numeric"),d=Object(i.convertToTensor)(t,"b","greaterEqual","string_or_numeric");[n,d]=Object(r.makeTypesMatch)(n,d),Object(a.assertAndGetBroadcastShape)(n.shape,d.shape);const u={a:n,b:d};return s.ENGINE.runKernel(o.GreaterEqual,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/imag.js": +/*!*************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/imag.js ***! + \*************************************************************/ +/*! exports provided: imag */function(e,t,n){"use strict";n.r(t),n.d(t,"imag",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({imag_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={input:Object(r.convertToTensor)(e,"input","imag")};return s.ENGINE.runKernel(o.Imag,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/crop_and_resize.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/image/crop_and_resize.js ***! + \******************************************************************************/ +/*! exports provided: cropAndResize */function(e,t,n){"use strict";n.r(t),n.d(t,"cropAndResize",(function(){return d}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({cropAndResize_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,a,d="bilinear",u=0){const l=Object(r.convertToTensor)(e,"image","cropAndResize"),c=Object(r.convertToTensor)(t,"boxes","cropAndResize","float32"),f=Object(r.convertToTensor)(n,"boxInd","cropAndResize","int32"),p=c.shape[0];i.assert(4===l.rank,(()=>`Error in cropAndResize: image must be rank 4,but got rank ${l.rank}.`)),i.assert(2===c.rank&&4===c.shape[1],(()=>`Error in cropAndResize: boxes must be have size [${p},4] but had shape ${c.shape}.`)),i.assert(1===f.rank&&f.shape[0]===p,(()=>`Error in cropAndResize: boxInd must be have size [${p}] but had shape ${c.shape}.`)),i.assert(2===a.length,(()=>`Error in cropAndResize: cropSize must be of length 2, but got length ${a.length}.`)),i.assert(a[0]>=1&&a[1]>=1,(()=>`cropSize must be atleast [1,1], but was ${a}`)),i.assert("bilinear"===d||"nearest"===d,(()=>`method must be bilinear or nearest, but was ${d}`));const m={image:l,boxes:c,boxInd:f},h={method:d,extrapolationValue:u,cropSize:a};return s.ENGINE.runKernel(o.CropAndResize,m,h)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/flip_left_right.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/image/flip_left_right.js ***! + \******************************************************************************/ +/*! exports provided: flipLeftRight */function(e,t,n){"use strict";n.r(t),n.d(t,"flipLeftRight",(function(){return d}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({flipLeftRight_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t=Object(r.convertToTensor)(e,"image","flipLeftRight","float32");i.assert(4===t.rank,(()=>`Error in flipLeftRight: image must be rank 4,but got rank ${t.rank}.`));const n={image:t};return s.ENGINE.runKernel(o.FlipLeftRight,n,{})}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression.js ***! + \**********************************************************************************/ +/*! exports provided: nonMaxSuppression */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppression",(function(){return d}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../nonmax_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/nonmax_util.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({nonMaxSuppression_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,a=.5,d=Number.NEGATIVE_INFINITY){const u=Object(r.convertToTensor)(e,"boxes","nonMaxSuppression"),l=Object(r.convertToTensor)(t,"scores","nonMaxSuppression"),c=Object(i.nonMaxSuppSanityCheck)(u,l,n,a,d),f={maxOutputSize:n=c.maxOutputSize,iouThreshold:a=c.iouThreshold,scoreThreshold:d=c.scoreThreshold};return s.ENGINE.runKernel(o.NonMaxSuppressionV3,{boxes:u,scores:l},f)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_async.js": +/*!****************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_async.js ***! + \****************************************************************************************/ +/*! exports provided: nonMaxSuppressionAsync */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionAsync",(function(){return a}));var s=n(/*! ../../backends/non_max_suppression_impl */"./node_modules/@tensorflow/tfjs-core/dist/backends/non_max_suppression_impl.js"),o=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),r=n(/*! ../nonmax_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/nonmax_util.js"),i=n(/*! ../tensor1d */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor1d.js");const a= +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +async function(e,t,n,a=.5,d=Number.NEGATIVE_INFINITY){const u=Object(o.convertToTensor)(e,"boxes","nonMaxSuppressionAsync"),l=Object(o.convertToTensor)(t,"scores","nonMaxSuppressionAsync"),c=Object(r.nonMaxSuppSanityCheck)(u,l,n,a,d);n=c.maxOutputSize,a=c.iouThreshold,d=c.scoreThreshold;const f=await Promise.all([u.data(),l.data()]),p=f[0],m=f[1],{selectedIndices:h}=Object(s.nonMaxSuppressionV3Impl)(p,m,n,a,d);return u!==e&&u.dispose(),l!==t&&l.dispose(),Object(i.tensor1d)(h,"int32")}},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_padded.js": +/*!*****************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_padded.js ***! + \*****************************************************************************************/ +/*! exports provided: nonMaxSuppressionPadded */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionPadded",(function(){return d}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../nonmax_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/nonmax_util.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({nonMaxSuppressionPadded_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,a=.5,d=Number.NEGATIVE_INFINITY,u=!1){const l=Object(r.convertToTensor)(e,"boxes","nonMaxSuppression"),c=Object(r.convertToTensor)(t,"scores","nonMaxSuppression"),f=Object(i.nonMaxSuppSanityCheck)(l,c,n,a,d,null),p={boxes:l,scores:c},m={maxOutputSize:f.maxOutputSize,iouThreshold:f.iouThreshold,scoreThreshold:f.scoreThreshold,padToMaxOutputSize:u},h=s.ENGINE.runKernel(o.NonMaxSuppressionV4,p,m);return{selectedIndices:h[0],validOutputs:h[1]}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_padded_async.js": +/*!***********************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_padded_async.js ***! + \***********************************************************************************************/ +/*! exports provided: nonMaxSuppressionPaddedAsync */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionPaddedAsync",(function(){return d}));var s=n(/*! ../../backends/non_max_suppression_impl */"./node_modules/@tensorflow/tfjs-core/dist/backends/non_max_suppression_impl.js"),o=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),r=n(/*! ../nonmax_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/nonmax_util.js"),i=n(/*! ../scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),a=n(/*! ../tensor1d */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor1d.js");const d= +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +async function(e,t,n,d=.5,u=Number.NEGATIVE_INFINITY,l=!1){const c=Object(o.convertToTensor)(e,"boxes","nonMaxSuppressionAsync"),f=Object(o.convertToTensor)(t,"scores","nonMaxSuppressionAsync"),p=Object(r.nonMaxSuppSanityCheck)(c,f,n,d,u,null),m=p.maxOutputSize,h=p.iouThreshold,b=p.scoreThreshold,[j,g]=await Promise.all([c.data(),f.data()]),{selectedIndices:w,validOutputs:_}=Object(s.nonMaxSuppressionV4Impl)(j,g,m,h,b,l);return c!==e&&c.dispose(),f!==t&&f.dispose(),{selectedIndices:Object(a.tensor1d)(w,"int32"),validOutputs:Object(i.scalar)(_,"int32")}}},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_with_score.js": +/*!*********************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_with_score.js ***! + \*********************************************************************************************/ +/*! exports provided: nonMaxSuppressionWithScore */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionWithScore",(function(){return d}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../nonmax_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/nonmax_util.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({nonMaxSuppressionWithScore_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,a=.5,d=Number.NEGATIVE_INFINITY,u=0){const l=Object(r.convertToTensor)(e,"boxes","nonMaxSuppression"),c=Object(r.convertToTensor)(t,"scores","nonMaxSuppression"),f=Object(i.nonMaxSuppSanityCheck)(l,c,n,a,d,u),p={boxes:l,scores:c},m={maxOutputSize:n=f.maxOutputSize,iouThreshold:a=f.iouThreshold,scoreThreshold:d=f.scoreThreshold,softNmsSigma:u=f.softNmsSigma},h=s.ENGINE.runKernel(o.NonMaxSuppressionV5,p,m);return{selectedIndices:h[0],selectedScores:h[1]}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_with_score_async.js": +/*!***************************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_with_score_async.js ***! + \***************************************************************************************************/ +/*! exports provided: nonMaxSuppressionWithScoreAsync */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionWithScoreAsync",(function(){return a}));var s=n(/*! ../../backends/non_max_suppression_impl */"./node_modules/@tensorflow/tfjs-core/dist/backends/non_max_suppression_impl.js"),o=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),r=n(/*! ../nonmax_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/nonmax_util.js"),i=n(/*! ../tensor1d */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor1d.js");const a= +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +async function(e,t,n,a=.5,d=Number.NEGATIVE_INFINITY,u=0){const l=Object(o.convertToTensor)(e,"boxes","nonMaxSuppressionAsync"),c=Object(o.convertToTensor)(t,"scores","nonMaxSuppressionAsync"),f=Object(r.nonMaxSuppSanityCheck)(l,c,n,a,d,u);n=f.maxOutputSize,a=f.iouThreshold,d=f.scoreThreshold,u=f.softNmsSigma;const p=await Promise.all([l.data(),c.data()]),m=p[0],h=p[1],{selectedIndices:b,selectedScores:j}=Object(s.nonMaxSuppressionV5Impl)(m,h,n,a,d,u);return l!==e&&l.dispose(),c!==t&&c.dispose(),{selectedIndices:Object(i.tensor1d)(b,"int32"),selectedScores:Object(i.tensor1d)(j)}}},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/resize_bilinear.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/image/resize_bilinear.js ***! + \******************************************************************************/ +/*! exports provided: resizeBilinear */function(e,t,n){"use strict";n.r(t),n.d(t,"resizeBilinear",(function(){return u}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),d=n(/*! ../reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const u=Object(a.op)({resizeBilinear_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n=!1,a=!1){const u=Object(r.convertToTensor)(e,"images","resizeBilinear");i.assert(3===u.rank||4===u.rank,(()=>`Error in resizeBilinear: x must be rank 3 or 4, but got rank ${u.rank}.`)),i.assert(2===t.length,(()=>`Error in resizeBilinear: new shape must 2D, but got shape ${t}.`)),i.assert(!1===a||!1===n,(()=>"Error in resizeBilinear: If halfPixelCenters is true, alignCorners must be false."));let l=u,c=!1;3===u.rank&&(c=!0,l=Object(d.reshape)(u,[1,u.shape[0],u.shape[1],u.shape[2]]));const[]=t,f={images:l},p={alignCorners:n,halfPixelCenters:a,size:t},m=s.ENGINE.runKernel(o.ResizeBilinear,f,p);return c?Object(d.reshape)(m,[m.shape[1],m.shape[2],m.shape[3]]):m}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/resize_nearest_neighbor.js": +/*!**************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/image/resize_nearest_neighbor.js ***! + \**************************************************************************************/ +/*! exports provided: resizeNearestNeighbor */function(e,t,n){"use strict";n.r(t),n.d(t,"resizeNearestNeighbor",(function(){return u}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),d=n(/*! ../reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const u=Object(a.op)({resizeNearestNeighbor_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n=!1,a=!1){const u=Object(r.convertToTensor)(e,"images","resizeNearestNeighbor");i.assert(3===u.rank||4===u.rank,(()=>`Error in resizeNearestNeighbor: x must be rank 3 or 4, but got rank ${u.rank}.`)),i.assert(2===t.length,(()=>`Error in resizeNearestNeighbor: new shape must 2D, but got shape ${t}.`)),i.assert("float32"===u.dtype||"int32"===u.dtype,(()=>"`images` must have `int32` or `float32` as dtype")),i.assert(!1===a||!1===n,(()=>"Error in resizeNearestNeighbor: If halfPixelCenters is true, alignCorners must be false."));let l=u,c=!1;3===u.rank&&(c=!0,l=Object(d.reshape)(u,[1,u.shape[0],u.shape[1],u.shape[2]]));const[]=t,f={images:l},p={alignCorners:n,halfPixelCenters:a,size:t},m=s.ENGINE.runKernel(o.ResizeNearestNeighbor,f,p);return c?Object(d.reshape)(m,[m.shape[1],m.shape[2],m.shape[3]]):m}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/rotate_with_offset.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/image/rotate_with_offset.js ***! + \*********************************************************************************/ +/*! exports provided: rotateWithOffset */function(e,t,n){"use strict";n.r(t),n.d(t,"rotateWithOffset",(function(){return d}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({rotateWithOffset_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n=0,a=.5){const d=Object(r.convertToTensor)(e,"image","rotateWithOffset","float32");i.assert(4===d.rank,(()=>`Error in rotateWithOffset: image must be rank 4,but got rank ${d.rank}.`));const u={image:d},l={radians:t,fillValue:n,center:a};return s.ENGINE.runKernel(o.RotateWithOffset,u,l)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/threshold.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/image/threshold.js ***! + \************************************************************************/ +/*! exports provided: threshold */function(e,t,n){"use strict";n.r(t),n.d(t,"threshold",(function(){return x}));var s=n(/*! ../tensor1d */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor1d.js"),o=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),r=n(/*! ../cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),i=n(/*! ../split */"./node_modules/@tensorflow/tfjs-core/dist/ops/split.js"),a=n(/*! ../bincount */"./node_modules/@tensorflow/tfjs-core/dist/ops/bincount.js"),d=n(/*! ../less_equal */"./node_modules/@tensorflow/tfjs-core/dist/ops/less_equal.js"),u=n(/*! ../greater */"./node_modules/@tensorflow/tfjs-core/dist/ops/greater.js"),l=n(/*! ../sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js"),c=n(/*! ../add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),f=n(/*! ../mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),p=n(/*! ../div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),m=n(/*! ../sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),h=n(/*! ../round */"./node_modules/@tensorflow/tfjs-core/dist/ops/round.js"),b=n(/*! ../where */"./node_modules/@tensorflow/tfjs-core/dist/ops/where.js"),j=n(/*! ../fill */"./node_modules/@tensorflow/tfjs-core/dist/ops/fill.js"),g=n(/*! ../slice */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice.js"),w=n(/*! ../range */"./node_modules/@tensorflow/tfjs-core/dist/ops/range.js"),_=n(/*! ../tensor */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor.js"),k=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),v=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js");const x=Object(o.op)({threshold_: +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t="binary",n=!1,o=.5){const x=Object(v.convertToTensor)(e,"image","threshold"),y=x.shape[0]*x.shape[1];let O,I,C,S,T=Object(f.mul)(Object(s.tensor1d)([o]),255);if(k.assert(3===x.rank,(()=>`Error in threshold: image must be rank 3,but got rank ${x.rank}.`)),k.assert(3===x.shape[2]||1===x.shape[2],(()=>`Error in threshold: image color channel must be equal to 3 or 1but got ${x.shape[2]}.`)),k.assert("int32"===x.dtype||"float32"===x.dtype,(()=>`Error in dtype: image dtype must be int32 or float32,but got dtype ${x.dtype}.`)),k.assert("otsu"===t||"binary"===t,(()=>`Method must be binary or otsu, but was ${t}`)),3===x.shape[2]){[O,I,C]=Object(i.split)(x,[1,1,1],-1);const e=Object(f.mul)(O,.2989),t=Object(f.mul)(I,.587),n=Object(f.mul)(C,.114);S=Object(c.add)(Object(c.add)(e,t),n)}else S=e;if("otsu"===t){T=function(e,t){let n,o,r,i,a,d,h=Object(s.tensor1d)([-1]),_=Object(s.tensor1d)([0]),k=Object(s.tensor1d)([0]);for(let v=0;v`Error in transform: image must be rank 4,but got rank ${l.rank}.`)),i.assert(2===c.rank&&(c.shape[0]===l.shape[0]||1===c.shape[0])&&8===c.shape[1],(()=>"Error in transform: Input transform should be batch x 8 or 1 x 8")),i.assert(null==u||2===u.length,(()=>`Error in transform: outputShape must be [height, width] or null, but got ${u}.`));const f={image:l,transforms:c},p={interpolation:n,fillMode:a,fillValue:d,outputShape:u};return s.ENGINE.runKernel(o.Transform,f,p)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/in_top_k.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/in_top_k.js ***! + \*****************************************************************/ +/*! exports provided: inTopKAsync */function(e,t,n){"use strict";n.r(t),n.d(t,"inTopKAsync",(function(){return i}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./tensor */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor.js");const i= +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +async function(e,t,n=1){const i=Object(s.convertToTensor)(e,"predictions","inTopK"),a=Object(s.convertToTensor)(t,"targets","inTopK");Object(o.assert)(i.rank>1,(()=>`inTopK() expects the predictions to be of rank 2 or higher, but got ${i.rank}`)),Object(o.assert)(i.rank-1===a.rank,(()=>`predictions rank should be 1 larger than targets rank, but got predictions rank ${i.rank} and targets rank ${a.rank}`)),Object(o.assertShapesMatch)(i.shape.slice(0,i.shape.length-1),a.shape,"predictions's shape should be align with the targets' shape, except the last dimension.");const d=i.shape[i.shape.length-1];Object(o.assert)(n>0&&n<=d,(()=>`'k' passed to inTopK() must be > 0 && <= the predictions last dimension (${d}), but got ${n}`));const u=await i.data(),l=await a.data(),[c,f]=[u.length/d,d],p=Object(o.getTypedArrayFromDType)("bool",c);for(let e=0;et.value-e.value)),p[e]=0;for(let t=0;t`bandPart(): numLower must be an integer, got ${t}.`)),Object(o.assert)(n%1==0,(()=>`bandPart(): numUpper must be an integer, got ${n}.`));const d=Object(s.convertToTensor)(e,"a","bandPart");Object(o.assert)(d.rank>=2,(()=>`bandPart(): Rank must be at least 2, got ${d.rank}.`));const j=d.shape,[g,w]=d.shape.slice(-2);if(!(t<=g))throw new Error(`bandPart(): numLower (${t}) must not be greater than the number of rows (${g}).`);if(!(n<=w))throw new Error(`bandPart(): numUpper (${n}) must not be greater than the number of columns (${w}).`);t<0&&(t=g),n<0&&(n=w);const _=Object(l.reshape)(Object(u.range)(0,g,1,"int32"),[-1,1]),k=Object(u.range)(0,w,1,"int32"),v=Object(p.sub)(_,k),x=Object(a.logicalAnd)(Object(i.lessEqual)(v,Object(c.scalar)(+t,"int32")),Object(r.greaterEqual)(v,Object(c.scalar)(-n,"int32"))),y=Object(b.zeros)([g,w],d.dtype);return Object(l.reshape)(Object(f.stack)(Object(m.unstack)(Object(l.reshape)(d,[-1,g,w])).map((e=>Object(h.where)(x,e,y)))),j)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/linalg/gram_schmidt.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/linalg/gram_schmidt.js ***! + \****************************************************************************/ +/*! exports provided: gramSchmidt */function(e,t,n){"use strict";n.r(t),n.d(t,"gramSchmidt",(function(){return m}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ../div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),i=n(/*! ../mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),a=n(/*! ../norm */"./node_modules/@tensorflow/tfjs-core/dist/ops/norm.js"),d=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ../split */"./node_modules/@tensorflow/tfjs-core/dist/ops/split.js"),l=n(/*! ../squeeze */"./node_modules/@tensorflow/tfjs-core/dist/ops/squeeze.js"),c=n(/*! ../stack */"./node_modules/@tensorflow/tfjs-core/dist/ops/stack.js"),f=n(/*! ../sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),p=n(/*! ../sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js");const m=Object(d.op)({gramSchmidt_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){let t;if(Array.isArray(e)){t=!1,Object(o.assert)(null!=e&&e.length>0,(()=>"Gram-Schmidt process: input must not be null, undefined, or empty"));const n=e[0].shape[0];for(let t=1;t`Gram-Schmidt: Non-unique lengths found in the input vectors: (${e[t].shape[0]} vs. ${n})`))}else t=!0,e=Object(u.split)(e,e.shape[0],0).map((e=>Object(l.squeeze)(e,[0])));Object(o.assert)(e.length<=e[0].shape[0],(()=>`Gram-Schmidt: Number of vectors (${e.length}) exceeds number of dimensions (${e[0].shape[0]}).`));const n=[],d=e;for(let t=0;t{let e=d[t];if(t>0)for(let s=0;s{Object(r.assert)(2===e.shape.length,(()=>`qr2d() requires a 2D Tensor, but got a ${e.shape.length}D Tensor.`));const n=e.shape[0],h=e.shape[1];let b=Object(u.eye)(n),g=Object(i.clone)(e);const v=Object(_.tensor2d)([[1]],[1,1]);let y=Object(i.clone)(v);const O=n>=h?h:n;for(let e=0;e{const t=Object(j.slice)(g,[e,e],[n-e,1]),s=Object(m.norm)(t),o=Object(j.slice)(g,[e,e],[1,1]),r=Object(x.where)(Object(l.greater)(o,0),Object(_.tensor2d)([[-1]]),Object(_.tensor2d)([[1]])),u=Object(w.sub)(o,Object(f.mul)(r,s)),O=Object(d.div)(t,u);y=1===O.shape[0]?Object(i.clone)(v):Object(a.concat)([v,Object(j.slice)(O,[1,0],[O.shape[0]-1,O.shape[1]])],0);const I=Object(p.neg)(Object(d.div)(Object(c.matMul)(r,u),s)),C=Object(j.slice)(g,[e,0],[n-e,h]),S=Object(f.mul)(I,y),T=Object(k.transpose)(y);if(0===e)g=Object(w.sub)(C,Object(c.matMul)(S,Object(c.matMul)(T,C)));else{const t=Object(w.sub)(C,Object(c.matMul)(S,Object(c.matMul)(T,C)));g=Object(a.concat)([Object(j.slice)(g,[0,0],[e,h]),t],0)}const N=Object(k.transpose)(S),E=Object(j.slice)(b,[0,e],[n,b.shape[1]-e]);if(0===e)b=Object(w.sub)(E,Object(c.matMul)(Object(c.matMul)(E,y),N));else{const t=Object(w.sub)(E,Object(c.matMul)(Object(c.matMul)(E,y),N));b=Object(a.concat)([Object(j.slice)(b,[0,0],[n,e]),t],1)}return[y,g,b]})),Object(o.dispose)([t,r,u])}return!t&&n>h&&(b=Object(j.slice)(b,[0,0],[n,h]),g=Object(j.slice)(g,[0,0],[h,h])),[b,g]}))}const O=Object(h.op)({qr_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=!1){if(Object(r.assert)(e.rank>=2,(()=>`qr() requires input tensor to have a rank >= 2, but got rank ${e.rank}`)),2===e.rank)return y(e,t);{const n=e.shape.slice(0,e.shape.length-2).reduce(((e,t)=>e*t)),s=Object(v.unstack)(Object(b.reshape)(e,[n,e.shape[e.shape.length-2],e.shape[e.shape.length-1]]),0),o=[],r=[];s.forEach((e=>{const[n,s]=y(e,t);o.push(n),r.push(s)}));return[Object(b.reshape)(Object(g.stack)(o,0),e.shape),Object(b.reshape)(Object(g.stack)(r,0),e.shape)]}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/linspace.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/linspace.js ***! + \*****************************************************************/ +/*! exports provided: linspace */function(e,t,n){"use strict";n.r(t),n.d(t,"linspace",(function(){return r}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e,t,n){if(n<=0)throw new Error("The number of values should be positive.");const r={start:e,stop:t,num:n};return s.ENGINE.runKernel(o.LinSpace,{},r)}},"./node_modules/@tensorflow/tfjs-core/dist/ops/local_response_normalization.js": +/*!*************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/local_response_normalization.js ***! + \*************************************************************************************/ +/*! exports provided: localResponseNormalization */function(e,t,n){"use strict";n.r(t),n.d(t,"localResponseNormalization",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),d=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const u=Object(a.op)({localResponseNormalization_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=5,n=1,a=1,u=.5){const l=Object(r.convertToTensor)(e,"x","localResponseNormalization");i.assert(4===l.rank||3===l.rank,(()=>`Error in localResponseNormalization: x must be rank 3 or 4 but got\n rank ${l.rank}.`)),i.assert(i.isInt(t),(()=>`Error in localResponseNormalization: depthRadius must be an integer but got depthRadius ${t}.`));let c=l,f=!1;3===l.rank&&(f=!0,c=Object(d.reshape)(l,[1,l.shape[0],l.shape[1],l.shape[2]]));const p={x:c},m={depthRadius:t,bias:n,alpha:a,beta:u},h=s.ENGINE.runKernel(o.LRN,p,m);return f?Object(d.reshape)(h,[h.shape[1],h.shape[2],h.shape[3]]):h}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/log.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/log.js ***! + \************************************************************/ +/*! exports provided: log */function(e,t,n){"use strict";n.r(t),n.d(t,"log",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({log_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","log")};return s.ENGINE.runKernel(o.Log,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/log1p.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/log1p.js ***! + \**************************************************************/ +/*! exports provided: log1p */function(e,t,n){"use strict";n.r(t),n.d(t,"log1p",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({log1p_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","log1p")};return s.ENGINE.runKernel(o.Log1p,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/log_sigmoid.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/log_sigmoid.js ***! + \********************************************************************/ +/*! exports provided: logSigmoid */function(e,t,n){"use strict";n.r(t),n.d(t,"logSigmoid",(function(){return l}));var s=n(/*! ../gradients */"./node_modules/@tensorflow/tfjs-core/dist/gradients.js"),o=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),r=n(/*! ./mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),i=n(/*! ./neg */"./node_modules/@tensorflow/tfjs-core/dist/ops/neg.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),d=n(/*! ./sigmoid */"./node_modules/@tensorflow/tfjs-core/dist/ops/sigmoid.js"),u=n(/*! ./softplus */"./node_modules/@tensorflow/tfjs-core/dist/ops/softplus.js");const l=Object(a.op)({logSigmoid_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t=Object(o.convertToTensor)(e,"x","logSigmoid");return Object(s.customGrad)((e=>({value:Object(i.neg)(Object(u.softplus)(Object(i.neg)(e))),gradFunc:t=>Object(r.mul)(t,Object(d.sigmoid)(Object(i.neg)(e)))})))(t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/log_softmax.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/log_softmax.js ***! + \********************************************************************/ +/*! exports provided: logSoftmax */function(e,t,n){"use strict";n.r(t),n.d(t,"logSoftmax",(function(){return p}));var s=n(/*! ../gradients */"./node_modules/@tensorflow/tfjs-core/dist/gradients.js"),o=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),r=n(/*! ./cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),i=n(/*! ./exp */"./node_modules/@tensorflow/tfjs-core/dist/ops/exp.js"),a=n(/*! ./log */"./node_modules/@tensorflow/tfjs-core/dist/ops/log.js"),d=n(/*! ./max */"./node_modules/@tensorflow/tfjs-core/dist/ops/max.js"),u=n(/*! ./mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),l=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),c=n(/*! ./sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),f=n(/*! ./sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js");const p=Object(l.op)({logSoftmax_: +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=-1){const n=Object(o.convertToTensor)(e,"logits","logSoftmax");if(-1===t&&(t=n.rank-1),t!==n.rank-1)throw Error(`Log Softmax along a non-last dimension is not yet supported. Logits was rank ${n.rank} and axis was ${t}`);return Object(s.customGrad)(((e,n)=>{const s=Object(d.max)(e,t,!0),o=Object(c.sub)(e,s),l=Object(c.sub)(Object(r.cast)(o,"float32"),Object(a.log)(Object(f.sum)(Object(i.exp)(o),t,!0)));n([l]);return{value:l,gradFunc:(e,n)=>{const[s]=n,o=Object(i.exp)(s);return Object(c.sub)(e,Object(u.mul)(Object(f.sum)(e,t,!0),o))}}}))(n)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/log_sum_exp.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/log_sum_exp.js ***! + \********************************************************************/ +/*! exports provided: logSumExp */function(e,t,n){"use strict";n.r(t),n.d(t,"logSumExp",(function(){return m}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),i=n(/*! ./axis_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/axis_util.js"),a=n(/*! ./exp */"./node_modules/@tensorflow/tfjs-core/dist/ops/exp.js"),d=n(/*! ./log */"./node_modules/@tensorflow/tfjs-core/dist/ops/log.js"),u=n(/*! ./max */"./node_modules/@tensorflow/tfjs-core/dist/ops/max.js"),l=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),c=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),f=n(/*! ./sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),p=n(/*! ./sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js");const m=Object(l.op)({logSumExp_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=null,n=!1){const l=Object(s.convertToTensor)(e,"x","logSumExp"),m=Object(o.parseAxisParam)(t,l.shape),h=Object(u.max)(l,m,!0),b=Object(f.sub)(l,h),j=Object(a.exp)(b),g=Object(p.sum)(j,m),w=Object(d.log)(g),_=Object(r.add)(Object(c.reshape)(h,w.shape),w);if(n){const e=Object(i.expandShapeToKeepDim)(_.shape,m);return Object(c.reshape)(_,e)}return _}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/logical_and.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/logical_and.js ***! + \********************************************************************/ +/*! exports provided: logicalAnd */function(e,t,n){"use strict";n.r(t),n.d(t,"logicalAnd",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({logicalAnd_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){const n=Object(r.convertToTensor)(e,"a","logicalAnd","bool"),a=Object(r.convertToTensor)(t,"b","logicalAnd","bool");Object(i.assertAndGetBroadcastShape)(n.shape,a.shape);const d={a:n,b:a};return s.ENGINE.runKernel(o.LogicalAnd,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/logical_not.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/logical_not.js ***! + \********************************************************************/ +/*! exports provided: logicalNot */function(e,t,n){"use strict";n.r(t),n.d(t,"logicalNot",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({logicalNot_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","logicalNot","bool")};return s.ENGINE.runKernel(o.LogicalNot,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/logical_or.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/logical_or.js ***! + \*******************************************************************/ +/*! exports provided: logicalOr */function(e,t,n){"use strict";n.r(t),n.d(t,"logicalOr",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({logicalOr_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){const n=Object(r.convertToTensor)(e,"a","logicalOr","bool"),a=Object(r.convertToTensor)(t,"b","logicalOr","bool");Object(i.assertAndGetBroadcastShape)(n.shape,a.shape);const d={a:n,b:a};return s.ENGINE.runKernel(o.LogicalOr,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/logical_xor.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/logical_xor.js ***! + \********************************************************************/ +/*! exports provided: logicalXor */function(e,t,n){"use strict";n.r(t),n.d(t,"logicalXor",(function(){return u}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),r=n(/*! ./logical_and */"./node_modules/@tensorflow/tfjs-core/dist/ops/logical_and.js"),i=n(/*! ./logical_not */"./node_modules/@tensorflow/tfjs-core/dist/ops/logical_not.js"),a=n(/*! ./logical_or */"./node_modules/@tensorflow/tfjs-core/dist/ops/logical_or.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(d.op)({logicalXor_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){const n=Object(s.convertToTensor)(e,"a","logicalXor","bool"),d=Object(s.convertToTensor)(t,"b","logicalXor","bool");return Object(o.assertAndGetBroadcastShape)(n.shape,d.shape),Object(r.logicalAnd)(Object(a.logicalOr)(e,t),Object(i.logicalNot)(Object(r.logicalAnd)(e,t)))}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js ***! + \***********************************************************************/ +/*! exports provided: Reduction */function(e,t,n){"use strict"; +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var s;n.r(t),n.d(t,"Reduction",(function(){return s})),function(e){e[e.NONE=0]="NONE",e[e.MEAN=1]="MEAN",e[e.SUM=2]="SUM",e[e.SUM_BY_NONZERO_WEIGHTS=3]="SUM_BY_NONZERO_WEIGHTS"}(s||(s={}))},"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/absolute_difference.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/losses/absolute_difference.js ***! + \***********************************************************************************/ +/*! exports provided: absoluteDifference */function(e,t,n){"use strict";n.r(t),n.d(t,"absoluteDifference",(function(){return l}));var s=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ../abs */"./node_modules/@tensorflow/tfjs-core/dist/ops/abs.js"),i=n(/*! ../loss_ops_utils */"./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),d=n(/*! ../sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),u=n(/*! ./compute_weighted_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js");const l=Object(a.op)({absoluteDifference_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,a=i.Reduction.SUM_BY_NONZERO_WEIGHTS){const l=Object(s.convertToTensor)(e,"labels","absoluteDifference"),c=Object(s.convertToTensor)(t,"predictions","absoluteDifference");let f=null;null!=n&&(f=Object(s.convertToTensor)(n,"weights","absoluteDifference")),Object(o.assertShapesMatch)(l.shape,c.shape,"Error in absoluteDifference: ");const p=Object(r.abs)(Object(d.sub)(l,c));return Object(u.computeWeightedLoss)(p,f,a)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js": +/*!*************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js ***! + \*************************************************************************************/ +/*! exports provided: computeWeightedLoss */function(e,t,n){"use strict";n.r(t),n.d(t,"computeWeightedLoss",(function(){return m}));var s=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),r=n(/*! ../div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),i=n(/*! ../loss_ops_utils */"./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js"),a=n(/*! ../mean */"./node_modules/@tensorflow/tfjs-core/dist/ops/mean.js"),d=n(/*! ../mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),u=n(/*! ../not_equal */"./node_modules/@tensorflow/tfjs-core/dist/ops/not_equal.js"),l=n(/*! ../ones */"./node_modules/@tensorflow/tfjs-core/dist/ops/ones.js"),c=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),f=n(/*! ../scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),p=n(/*! ../sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js");const m=Object(c.op)({computeWeightedLoss_:function(e,t,n=i.Reduction.SUM_BY_NONZERO_WEIGHTS){const c=Object(s.convertToTensor)(e,"losses","computeWeightedLoss");let m=null;null!=t&&(m=Object(s.convertToTensor)(t,"weights","computeWeightedLoss"));const h=null==m?c:Object(d.mul)(c,m);if(n===i.Reduction.NONE)return h;if(n===i.Reduction.SUM)return Object(p.sum)(h);if(n===i.Reduction.MEAN){if(null==m)return Object(a.mean)(h);{const e=c.size/m.size,t=Object(r.div)(Object(p.sum)(h),Object(p.sum)(m));return e>1?Object(r.div)(t,Object(f.scalar)(e)):t}}if(n===i.Reduction.SUM_BY_NONZERO_WEIGHTS){if(null==m)return Object(r.div)(Object(p.sum)(h),Object(f.scalar)(c.size));{const e=Object(d.mul)(m,Object(l.ones)(c.shape)),t=Object(o.cast)(Object(p.sum)(Object(u.notEqual)(e,Object(f.scalar)(0))),"float32");return Object(r.div)(Object(p.sum)(h),t)}}throw Error(`Unknown reduction: ${n}`)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/cosine_distance.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/losses/cosine_distance.js ***! + \*******************************************************************************/ +/*! exports provided: cosineDistance */function(e,t,n){"use strict";n.r(t),n.d(t,"cosineDistance",(function(){return f}));var s=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ../loss_ops_utils */"./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js"),i=n(/*! ../mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),d=n(/*! ../scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),u=n(/*! ../sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),l=n(/*! ../sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js"),c=n(/*! ./compute_weighted_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js");const f=Object(a.op)({cosineDistance_:function(e,t,n,a,f=r.Reduction.SUM_BY_NONZERO_WEIGHTS){const p=Object(s.convertToTensor)(e,"labels","cosineDistance"),m=Object(s.convertToTensor)(t,"predictions","cosineDistance");let h=null;null!=a&&(h=Object(s.convertToTensor)(a,"weights","cosineDistance")),Object(o.assertShapesMatch)(p.shape,m.shape,"Error in cosineDistance: ");const b=Object(d.scalar)(1),j=Object(u.sub)(b,Object(l.sum)(Object(i.mul)(p,m),n,!0));return Object(c.computeWeightedLoss)(j,h,f)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/hinge_loss.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/losses/hinge_loss.js ***! + \**************************************************************************/ +/*! exports provided: hingeLoss */function(e,t,n){"use strict";n.r(t),n.d(t,"hingeLoss",(function(){return f}));var s=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ../loss_ops_utils */"./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js"),i=n(/*! ../mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),d=n(/*! ../relu */"./node_modules/@tensorflow/tfjs-core/dist/ops/relu.js"),u=n(/*! ../scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),l=n(/*! ../sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),c=n(/*! ./compute_weighted_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js");const f=Object(a.op)({hingeLoss_:function(e,t,n,a=r.Reduction.SUM_BY_NONZERO_WEIGHTS){let f=Object(s.convertToTensor)(e,"labels","hingeLoss");const p=Object(s.convertToTensor)(t,"predictions","hingeLoss");let m=null;null!=n&&(m=Object(s.convertToTensor)(n,"weights","hingeLoss")),Object(o.assertShapesMatch)(f.shape,p.shape,"Error in hingeLoss: ");const h=Object(u.scalar)(1);f=Object(l.sub)(Object(i.mul)(Object(u.scalar)(2),f),h);const b=Object(d.relu)(Object(l.sub)(h,Object(i.mul)(f,p)));return Object(c.computeWeightedLoss)(b,m,a)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/huber_loss.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/losses/huber_loss.js ***! + \**************************************************************************/ +/*! exports provided: huberLoss */function(e,t,n){"use strict";n.r(t),n.d(t,"huberLoss",(function(){return h}));var s=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ../abs */"./node_modules/@tensorflow/tfjs-core/dist/ops/abs.js"),i=n(/*! ../add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),a=n(/*! ../loss_ops_utils */"./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js"),d=n(/*! ../minimum */"./node_modules/@tensorflow/tfjs-core/dist/ops/minimum.js"),u=n(/*! ../mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),l=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),c=n(/*! ../scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),f=n(/*! ../square */"./node_modules/@tensorflow/tfjs-core/dist/ops/square.js"),p=n(/*! ../sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),m=n(/*! ./compute_weighted_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js");const h=Object(l.op)({huberLoss_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,l=1,h=a.Reduction.SUM_BY_NONZERO_WEIGHTS){const b=Object(s.convertToTensor)(e,"labels","huberLoss"),j=Object(s.convertToTensor)(t,"predictions","huberLoss");let g=null;null!=n&&(g=Object(s.convertToTensor)(n,"weights","huberLoss")),Object(o.assertShapesMatch)(b.shape,j.shape,"Error in huberLoss: ");const w=Object(c.scalar)(l),_=Object(r.abs)(Object(p.sub)(j,b)),k=Object(d.minimum)(_,w),v=Object(p.sub)(_,k),x=Object(i.add)(Object(u.mul)(Object(c.scalar)(.5),Object(f.square)(k)),Object(u.mul)(w,v));return Object(m.computeWeightedLoss)(x,g,h)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/log_loss.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/losses/log_loss.js ***! + \************************************************************************/ +/*! exports provided: logLoss */function(e,t,n){"use strict";n.r(t),n.d(t,"logLoss",(function(){return m}));var s=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ../add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),i=n(/*! ../log */"./node_modules/@tensorflow/tfjs-core/dist/ops/log.js"),a=n(/*! ../loss_ops_utils */"./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js"),d=n(/*! ../mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),u=n(/*! ../neg */"./node_modules/@tensorflow/tfjs-core/dist/ops/neg.js"),l=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),c=n(/*! ../scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),f=n(/*! ../sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),p=n(/*! ./compute_weighted_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js");const m=Object(l.op)({logLoss_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,l=1e-7,m=a.Reduction.SUM_BY_NONZERO_WEIGHTS){const h=Object(s.convertToTensor)(e,"labels","logLoss"),b=Object(s.convertToTensor)(t,"predictions","logLoss");let j=null;null!=n&&(j=Object(s.convertToTensor)(n,"weights","logLoss")),Object(o.assertShapesMatch)(h.shape,b.shape,"Error in logLoss: ");const g=Object(c.scalar)(1),w=Object(c.scalar)(l),_=Object(u.neg)(Object(d.mul)(h,Object(i.log)(Object(r.add)(b,w)))),k=Object(d.mul)(Object(f.sub)(g,h),Object(i.log)(Object(r.add)(Object(f.sub)(g,b),w))),v=Object(f.sub)(_,k);return Object(p.computeWeightedLoss)(v,j,m)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/mean_squared_error.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/losses/mean_squared_error.js ***! + \**********************************************************************************/ +/*! exports provided: meanSquaredError */function(e,t,n){"use strict";n.r(t),n.d(t,"meanSquaredError",(function(){return u}));var s=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ../loss_ops_utils */"./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js"),i=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),a=n(/*! ../squared_difference */"./node_modules/@tensorflow/tfjs-core/dist/ops/squared_difference.js"),d=n(/*! ./compute_weighted_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js");const u=Object(i.op)({meanSquaredError_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,i=r.Reduction.SUM_BY_NONZERO_WEIGHTS){const u=Object(s.convertToTensor)(e,"labels","meanSquaredError"),l=Object(s.convertToTensor)(t,"predictions","meanSquaredError");let c=null;null!=n&&(c=Object(s.convertToTensor)(n,"weights","meanSquaredError")),Object(o.assertShapesMatch)(u.shape,l.shape,"Error in meanSquaredError: ");const f=Object(a.squaredDifference)(u,l);return Object(d.computeWeightedLoss)(f,c,i)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/sigmoid_cross_entropy.js": +/*!*************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/losses/sigmoid_cross_entropy.js ***! + \*************************************************************************************/ +/*! exports provided: sigmoidCrossEntropy */function(e,t,n){"use strict";n.r(t),n.d(t,"sigmoidCrossEntropy",(function(){return j}));var s=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ../abs */"./node_modules/@tensorflow/tfjs-core/dist/ops/abs.js"),i=n(/*! ../add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),a=n(/*! ../exp */"./node_modules/@tensorflow/tfjs-core/dist/ops/exp.js"),d=n(/*! ../log1p */"./node_modules/@tensorflow/tfjs-core/dist/ops/log1p.js"),u=n(/*! ../loss_ops_utils */"./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js"),l=n(/*! ../mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),c=n(/*! ../neg */"./node_modules/@tensorflow/tfjs-core/dist/ops/neg.js"),f=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),p=n(/*! ../relu */"./node_modules/@tensorflow/tfjs-core/dist/ops/relu.js"),m=n(/*! ../scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),h=n(/*! ../sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),b=n(/*! ./compute_weighted_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js");const j=Object(f.op)({sigmoidCrossEntropy_:function(e,t,n,f=0,j=u.Reduction.SUM_BY_NONZERO_WEIGHTS){let g=Object(s.convertToTensor)(e,"multiClassLabels","sigmoidCrossEntropy");const w=Object(s.convertToTensor)(t,"logits","sigmoidCrossEntropy");let _=null;if(null!=n&&(_=Object(s.convertToTensor)(n,"weights","sigmoidCrossEntropy")),Object(o.assertShapesMatch)(g.shape,w.shape,"Error in sigmoidCrossEntropy: "),f>0){const e=Object(m.scalar)(f),t=Object(m.scalar)(1),n=Object(m.scalar)(.5);g=Object(i.add)(Object(l.mul)(g,Object(h.sub)(t,e)),Object(l.mul)(n,e))}const k= +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){const n=Object(s.convertToTensor)(e,"labels","sigmoidCrossEntropyWithLogits"),u=Object(s.convertToTensor)(t,"logits","sigmoidCrossEntropyWithLogits");Object(o.assertShapesMatch)(n.shape,u.shape,"Error in sigmoidCrossEntropyWithLogits: ");const f=Object(p.relu)(u),m=Object(l.mul)(u,n),b=Object(d.log1p)(Object(a.exp)(Object(c.neg)(Object(r.abs)(u))));return Object(i.add)(Object(h.sub)(f,m),b)}(g,w);return Object(b.computeWeightedLoss)(k,_,j)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/softmax_cross_entropy.js": +/*!*************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/losses/softmax_cross_entropy.js ***! + \*************************************************************************************/ +/*! exports provided: softmaxCrossEntropy */function(e,t,n){"use strict";n.r(t),n.d(t,"softmaxCrossEntropy",(function(){return k}));var s=n(/*! ../../gradients */"./node_modules/@tensorflow/tfjs-core/dist/gradients.js"),o=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),r=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),i=n(/*! ../add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),a=n(/*! ../axis_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/axis_util.js"),d=n(/*! ../cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),u=n(/*! ../div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),l=n(/*! ../exp */"./node_modules/@tensorflow/tfjs-core/dist/ops/exp.js"),c=n(/*! ../log_sum_exp */"./node_modules/@tensorflow/tfjs-core/dist/ops/log_sum_exp.js"),f=n(/*! ../loss_ops_utils */"./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js"),p=n(/*! ../mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),m=n(/*! ../neg */"./node_modules/@tensorflow/tfjs-core/dist/ops/neg.js"),h=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),b=n(/*! ../reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),j=n(/*! ../scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),g=n(/*! ../sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),w=n(/*! ../sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js"),_=n(/*! ./compute_weighted_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js");const k=Object(h.op)({softmaxCrossEntropy_:function(e,t,n,h=0,k=f.Reduction.SUM_BY_NONZERO_WEIGHTS){let v=Object(o.convertToTensor)(e,"onehotLabels","softmaxCrossEntropy");const x=Object(o.convertToTensor)(t,"logits","softmaxCrossEntropy");let y=null;if(null!=n&&(y=Object(o.convertToTensor)(n,"weights","softmaxCrossEntropy")),Object(r.assertShapesMatch)(v.shape,x.shape,"Error in softmaxCrossEntropy: "),h>0){const e=Object(j.scalar)(h),t=Object(j.scalar)(1),n=Object(j.scalar)(v.shape[1]);v=Object(i.add)(Object(p.mul)(v,Object(g.sub)(t,e)),Object(u.div)(e,n))}const O= +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n=-1){if(-1===n&&(n=t.rank-1),n!==t.rank-1)throw Error(`Softmax cross entropy along a non-last dimension is not yet supported. Labels / logits was rank ${t.rank} and dim was ${n}`);return Object(s.customGrad)(((e,t,s)=>{const o=Object(c.logSumExp)(t,[n],!0),r=Object(g.sub)(Object(d.cast)(t,"float32"),o);s([e,r]);const i=Object(m.neg)(Object(p.mul)(r,e));return{value:Object(w.sum)(i,[n]),gradFunc:(e,t)=>{const[s,o]=t,r=Object(a.expandShapeToKeepDim)(e.shape,[n]);return[Object(p.mul)(Object(b.reshape)(e,r),Object(g.sub)(Object(d.cast)(s,"float32"),Object(l.exp)(o))),Object(p.mul)(Object(b.reshape)(e,r),Object(g.sub)(Object(l.exp)(o),Object(d.cast)(s,"float32")))]}}}))(e,t)}(v,x);return Object(_.computeWeightedLoss)(O,y,k)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/mat_mul.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/mat_mul.js ***! + \****************************************************************/ +/*! exports provided: matMul */function(e,t,n){"use strict";n.r(t),n.d(t,"matMul",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({matMul_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n=!1,a=!1){let d=Object(i.convertToTensor)(e,"a","matMul"),u=Object(i.convertToTensor)(t,"b","matMul");[d,u]=Object(r.makeTypesMatch)(d,u);const l={a:d,b:u},c={transposeA:n,transposeB:a};return s.ENGINE.runKernel(o.BatchMatMul,l,c)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/max.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/max.js ***! + \************************************************************/ +/*! exports provided: max */function(e,t,n){"use strict";n.r(t),n.d(t,"max",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({max_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=null,n=!1){const i={x:Object(r.convertToTensor)(e,"x","max")},a={reductionIndices:t,keepDims:n};return s.ENGINE.runKernel(o.Max,i,a)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/max_pool.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/max_pool.js ***! + \*****************************************************************/ +/*! exports provided: maxPool */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPool",(function(){return l}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./conv_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const l=Object(d.op)({maxPool_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,d,l){const c=Object(r.convertToTensor)(e,"x","maxPool");let f=c,p=!1;3===c.rank&&(p=!0,f=Object(u.reshape)(c,[1,c.shape[0],c.shape[1],c.shape[2]])),i.assert(4===f.rank,(()=>`Error in maxPool: input must be rank 4 but got rank ${f.rank}.`)),i.assert(a.eitherStridesOrDilationsAreOne(n,1),(()=>`Error in maxPool: Either strides or dilations must be 1. Got strides ${n} and dilations '1'`)),null!=l&&i.assert(i.isInt(d),(()=>`Error in maxPool: pad must be an integer when using, dimRoundingMode ${l} but got pad ${d}.`));const m={x:f},h={filterSize:t,strides:n,pad:d,dimRoundingMode:l},b=s.ENGINE.runKernel(o.MaxPool,m,h);return p?Object(u.reshape)(b,[b.shape[1],b.shape[2],b.shape[3]]):b}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/max_pool_3d.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/max_pool_3d.js ***! + \********************************************************************/ +/*! exports provided: maxPool3d */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPool3d",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),d=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const u=Object(a.op)({maxPool3d_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=[1,1,1],n,a,u,l="NDHWC"){const c=Object(r.convertToTensor)(e,"x","maxPool3d");let f=c,p=!1;4===c.rank&&(p=!0,f=Object(d.reshape)(c,[1,c.shape[0],c.shape[1],c.shape[2],c.shape[3]])),i.assert(5===f.rank,(()=>`Error in maxPool3d: x must be rank 5 but got rank ${f.rank}.`)),i.assert("NDHWC"===l,(()=>`Error in maxPool3d: Only NDHWC is currently supported, but got dataFormat of ${l}`)),null!=u&&i.assert(i.isInt(a),(()=>`Error in maxPool3d: pad must be an integer when using, dimRoundingMode ${u} but got pad ${a}.`));const m={x:f},h={filterSize:t,strides:n,pad:a,dimRoundingMode:u,dataFormat:l},b=s.ENGINE.runKernel(o.MaxPool3D,m,h);return p?Object(d.reshape)(b,[b.shape[1],b.shape[2],b.shape[3],b.shape[4]]):b}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/max_pool_with_argmax.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/max_pool_with_argmax.js ***! + \*****************************************************************************/ +/*! exports provided: maxPoolWithArgmax */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPoolWithArgmax",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({maxPoolWithArgmax_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,i,a=!1){const d={x:Object(r.convertToTensor)(e,"x","maxPoolWithArgmax")},u={filterSize:t,strides:n,pad:i,includeBatchInIndex:a},l=s.ENGINE.runKernel(o.MaxPoolWithArgmax,d,u);return{result:l[0],indexes:l[1]}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/maximum.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/maximum.js ***! + \****************************************************************/ +/*! exports provided: maximum */function(e,t,n){"use strict";n.r(t),n.d(t,"maximum",(function(){return l}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),d=n(/*! ./cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const l=Object(u.op)({maximum_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){let n=Object(i.convertToTensor)(e,"a","maximum"),u=Object(i.convertToTensor)(t,"b","maximum");[n,u]=Object(r.makeTypesMatch)(n,u),"bool"===n.dtype&&(n=Object(d.cast)(n,"int32"),u=Object(d.cast)(u,"int32")),Object(a.assertAndGetBroadcastShape)(n.shape,u.shape);const l={a:n,b:u};return s.ENGINE.runKernel(o.Maximum,l)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/mean.js": +/*!*************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/mean.js ***! + \*************************************************************/ +/*! exports provided: mean */function(e,t,n){"use strict";n.r(t),n.d(t,"mean",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({mean_: +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=null,n=!1){const i={x:Object(r.convertToTensor)(e,"x","mean")},a={axis:t,keepDims:n};return s.ENGINE.runKernel(o.Mean,i,a)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/meshgrid.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/meshgrid.js ***! + \*****************************************************************/ +/*! exports provided: meshgrid */function(e,t,n){"use strict";n.r(t),n.d(t,"meshgrid",(function(){return u}));var s=n(/*! ./mat_mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mat_mul.js"),o=n(/*! ./ones */"./node_modules/@tensorflow/tfjs-core/dist/ops/ones.js"),r=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),i=n(/*! ../tensor */"./node_modules/@tensorflow/tfjs-core/dist/tensor.js"),a=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),d=n(/*! ../util_base */"./node_modules/@tensorflow/tfjs-core/dist/util_base.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function u(e,t,{indexing:n="xy"}={}){if("xy"!==n&&"ij"!==n)throw new TypeError(`${n} is not a valid third argument to meshgrid`);if(void 0===e)return[];let u=Object(a.convertToTensor)(e,"x","meshgrid",e instanceof i.Tensor?e.dtype:"float32");if(void 0===t)return[u];let l=Object(a.convertToTensor)(t,"y","meshgrid",t instanceof i.Tensor?t.dtype:"float32");const c=Object(d.sizeFromShape)(u.shape),f=Object(d.sizeFromShape)(l.shape);return"xy"===n?(u=Object(r.reshape)(u,[1,-1]),l=Object(r.reshape)(l,[-1,1]),[Object(s.matMul)(Object(o.ones)([f,1],u.dtype),u),Object(s.matMul)(l,Object(o.ones)([1,c],l.dtype))]):(u=Object(r.reshape)(u,[-1,1]),l=Object(r.reshape)(l,[1,-1]),[Object(s.matMul)(u,Object(o.ones)([1,f],u.dtype)),Object(s.matMul)(Object(o.ones)([c,1],l.dtype),l)])}},"./node_modules/@tensorflow/tfjs-core/dist/ops/min.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/min.js ***! + \************************************************************/ +/*! exports provided: min */function(e,t,n){"use strict";n.r(t),n.d(t,"min",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({min_: +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=null,n=!1){const i={x:Object(r.convertToTensor)(e,"x","min")},a={axis:t,keepDims:n};return s.ENGINE.runKernel(o.Min,i,a)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/minimum.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/minimum.js ***! + \****************************************************************/ +/*! exports provided: minimum */function(e,t,n){"use strict";n.r(t),n.d(t,"minimum",(function(){return l}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),d=n(/*! ./cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const l=Object(u.op)({minimum_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){let n=Object(i.convertToTensor)(e,"a","minimum"),u=Object(i.convertToTensor)(t,"b","minimum");[n,u]=Object(r.makeTypesMatch)(n,u),"bool"===n.dtype&&(n=Object(d.cast)(n,"int32"),u=Object(d.cast)(u,"int32")),Object(a.assertAndGetBroadcastShape)(n.shape,u.shape);const l={a:n,b:u};return s.ENGINE.runKernel(o.Minimum,l)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/mirror_pad.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/mirror_pad.js ***! + \*******************************************************************/ +/*! exports provided: mirrorPad */function(e,t,n){"use strict";n.r(t),n.d(t,"mirrorPad",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({mirrorPad_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n){i.assert("reflect"===n||"symmetric"===n,(()=>`Invalid mode. Mode must be either reflect or symmetric. Got ${n}.`));const a=Object(r.convertToTensor)(e,"x","mirrorPad");if(0===a.rank)throw new Error("mirrorPad(scalar) is not defined. Pass non-scalar to mirrorPad");i.assert(t.length===a.rank,(()=>`Padding doesn't match input. Must be ${a.rank}. Got ${t.length}.`));const d="reflect"===n?1:0;for(let e=0;e"Invalid number of paddings. Must be length of 2 each.")),i.assert(t[e][0]>=0&&t[e][0]<=a.shape[e]-d&&t[e][1]>=0&&t[e][1]<=a.shape[e]-d,(()=>`Padding in dimension ${e} cannot be greater than or equal to ${a.shape[e]-d} or less than 0 for input of shape ${a.shape}`));const u={paddings:t,mode:n},l={x:a};return s.ENGINE.runKernel(o.MirrorPad,l,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/mod.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/mod.js ***! + \************************************************************/ +/*! exports provided: mod */function(e,t,n){"use strict";n.r(t),n.d(t,"mod",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({mod_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){let n=Object(i.convertToTensor)(e,"a","mod"),a=Object(i.convertToTensor)(t,"b","mod");[n,a]=Object(r.makeTypesMatch)(n,a);const d={a:n,b:a};return s.ENGINE.runKernel(o.Mod,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/moments.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/moments.js ***! + \****************************************************************/ +/*! exports provided: moments */function(e,t,n){"use strict";n.r(t),n.d(t,"moments",(function(){return f}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./axis_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/axis_util.js"),i=n(/*! ./cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),a=n(/*! ./mean */"./node_modules/@tensorflow/tfjs-core/dist/ops/mean.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),l=n(/*! ./square */"./node_modules/@tensorflow/tfjs-core/dist/ops/square.js"),c=n(/*! ./sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js");const f=Object(d.op)({moments_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=null,n=!1){e=Object(s.convertToTensor)(e,"x","moments");const d=Object(o.parseAxisParam)(t,e.shape),f=Object(a.mean)(e,d,n);let p=f.shape;n||(p=Object(r.expandShapeToKeepDim)(f.shape,d));const m=Object(l.square)(Object(c.sub)(Object(i.cast)(e,"float32"),Object(u.reshape)(f,p)));return{mean:f,variance:Object(a.mean)(m,d,n)}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/moving_average.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/moving_average.js ***! + \***********************************************************************/ +/*! exports provided: movingAverage */function(e,t,n){"use strict";n.r(t),n.d(t,"movingAverage",(function(){return p}));var s=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),o=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),r=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),i=n(/*! ./add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),a=n(/*! ./div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),d=n(/*! ./mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),l=n(/*! ./pow */"./node_modules/@tensorflow/tfjs-core/dist/ops/pow.js"),c=n(/*! ./scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),f=n(/*! ./sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js");const p=Object(u.op)({movingAverage_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,u,p=!0){const m=Object(o.convertToTensor)(e,"v","movingAverage"),h=Object(o.convertToTensor)(t,"x","movingAverage"),b=Object(o.convertToTensor)(n,"decay","movingAverage");Object(s.assertTypesMatch)(m,h),r.assert(r.arraysEqual(m.shape,h.shape),(()=>"Shape mismatch in v and x"));const j=Object(c.scalar)(1),g=Object(f.sub)(j,b);let w=Object(d.mul)(Object(f.sub)(h,m),g);if(p){r.assert(null!=u,(()=>"When using zeroDebias: true, step is required."));const e=Object(o.convertToTensor)(u,"step","movingAverage");w=Object(a.div)(w,Object(f.sub)(j,Object(l.pow)(b,e)))}return Object(i.add)(m,w)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js ***! + \************************************************************/ +/*! exports provided: mul */function(e,t,n){"use strict";n.r(t),n.d(t,"mul",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({mul_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){let n=Object(i.convertToTensor)(e,"a","mul"),a=Object(i.convertToTensor)(t,"b","mul");[n,a]=Object(r.makeTypesMatch)(n,a);const d={a:n,b:a};return s.ENGINE.runKernel(o.Multiply,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/multi_rnn_cell.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/multi_rnn_cell.js ***! + \***********************************************************************/ +/*! exports provided: multiRNNCell */function(e,t,n){"use strict";n.r(t),n.d(t,"multiRNNCell",(function(){return r}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const r=Object(o.op)({multiRNNCell_:function(e,t,n,o){const r=Object(s.convertToTensor)(t,"data","multiRNNCell"),i=Object(s.convertToTensorArray)(n,"c","multiRNNCell"),a=Object(s.convertToTensorArray)(o,"h","multiRNNCell");let d=r;const u=[];for(let t=0;t2)throw new Error(`Rank of probabilities must be 1 or 2, but is ${l}`);n=n||Math.random();const c={logits:1===l?Object(a.reshape)(d,[1,-1]):d},f={numSamples:t,seed:n,normalized:i},p=s.ENGINE.runKernel(o.Multinomial,c,f);return 1===l?Object(a.reshape)(p,[p.size]):p}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/neg.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/neg.js ***! + \************************************************************/ +/*! exports provided: neg */function(e,t,n){"use strict";n.r(t),n.d(t,"neg",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({neg_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","neg")};return s.ENGINE.runKernel(o.Neg,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/nonmax_util.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/nonmax_util.js ***! + \********************************************************************/ +/*! exports provided: nonMaxSuppSanityCheck */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppSanityCheck",(function(){return o}));var s=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t,n,o,r,i){null==o&&(o=.5),null==r&&(r=Number.NEGATIVE_INFINITY),null==i&&(i=0);const a=e.shape[0];return n=Math.min(n,a),s.assert(0<=o&&o<=1,(()=>`iouThreshold must be in [0, 1], but was '${o}'`)),s.assert(2===e.rank,(()=>`boxes must be a 2D tensor, but was of rank '${e.rank}'`)),s.assert(4===e.shape[1],(()=>`boxes must have 4 columns, but 2nd dimension was ${e.shape[1]}`)),s.assert(1===t.rank,(()=>"scores must be a 1D tensor")),s.assert(t.shape[0]===a,(()=>`scores has incompatible shape with boxes. Expected ${a}, but was ${t.shape[0]}`)),s.assert(0<=i&&i<=1,(()=>`softNmsSigma must be in [0, 1], but was '${i}'`)),{maxOutputSize:n,iouThreshold:o,scoreThreshold:r,softNmsSigma:i}}},"./node_modules/@tensorflow/tfjs-core/dist/ops/norm.js": +/*!*************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/norm.js ***! + \*************************************************************/ +/*! exports provided: norm */function(e,t,n){"use strict";n.r(t),n.d(t,"norm",(function(){return j}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./abs */"./node_modules/@tensorflow/tfjs-core/dist/ops/abs.js"),i=n(/*! ./axis_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/axis_util.js"),a=n(/*! ./max */"./node_modules/@tensorflow/tfjs-core/dist/ops/max.js"),d=n(/*! ./min */"./node_modules/@tensorflow/tfjs-core/dist/ops/min.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),l=n(/*! ./pow */"./node_modules/@tensorflow/tfjs-core/dist/ops/pow.js"),c=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),f=n(/*! ./scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),p=n(/*! ./sqrt */"./node_modules/@tensorflow/tfjs-core/dist/ops/sqrt.js"),m=n(/*! ./square */"./node_modules/@tensorflow/tfjs-core/dist/ops/square.js"),h=n(/*! ./sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js");function b(e,t,n=null){if(0===e.rank)return Object(r.abs)(e);if(1!==e.rank&&null===n)return b(Object(c.reshape)(e,[-1]),t,n);if(1===e.rank||"number"==typeof n||Array.isArray(n)&&1===n.length){if(1===t)return Object(h.sum)(Object(r.abs)(e),n);if(t===1/0)return Object(a.max)(Object(r.abs)(e),n);if(t===-1/0)return Object(d.min)(Object(r.abs)(e),n);if("euclidean"===t||2===t)return Object(p.sqrt)(Object(h.sum)(Object(l.pow)(Object(r.abs)(e),Object(f.scalar)(2,"int32")),n));throw new Error(`Error in norm: invalid ord value: ${t}`)}if(Array.isArray(n)&&2===n.length){if(1===t)return Object(a.max)(Object(h.sum)(Object(r.abs)(e),n[0]),n[1]-1);if(t===1/0)return Object(a.max)(Object(h.sum)(Object(r.abs)(e),n[1]),n[0]);if(t===-1/0)return Object(d.min)(Object(h.sum)(Object(r.abs)(e),n[1]),n[0]);if("fro"===t||"euclidean"===t)return Object(p.sqrt)(Object(h.sum)(Object(m.square)(e),n));throw new Error(`Error in norm: invalid ord value: ${t}`)}throw new Error(`Error in norm: invalid axis: ${n}`)}const j=Object(u.op)({norm_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t="euclidean",n=null,r=!1){const a=b(e=Object(s.convertToTensor)(e,"x","norm"),t,n);let d=a.shape;if(r){const t=Object(o.parseAxisParam)(n,e.shape);d=i.expandShapeToKeepDim(a.shape,t)}return Object(c.reshape)(a,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/not_equal.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/not_equal.js ***! + \******************************************************************/ +/*! exports provided: notEqual */function(e,t,n){"use strict";n.r(t),n.d(t,"notEqual",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(d.op)({notEqual_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){let n=Object(i.convertToTensor)(e,"a","notEqual","string_or_numeric"),d=Object(i.convertToTensor)(t,"b","notEqual","string_or_numeric");[n,d]=Object(r.makeTypesMatch)(n,d),Object(a.assertAndGetBroadcastShape)(n.shape,d.shape);const u={a:n,b:d};return s.ENGINE.runKernel(o.NotEqual,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/one_hot.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/one_hot.js ***! + \****************************************************************/ +/*! exports provided: oneHot */function(e,t,n){"use strict";n.r(t),n.d(t,"oneHot",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({oneHot_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n=1,i=0){if(t<2)throw new Error(`Error in oneHot: depth must be >=2, but it is ${t}`);const a={indices:Object(r.convertToTensor)(e,"indices","oneHot","int32")},d={depth:t,onValue:n,offValue:i};return s.ENGINE.runKernel(o.OneHot,a,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/ones.js": +/*!*************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/ones.js ***! + \*************************************************************/ +/*! exports provided: ones */function(e,t,n){"use strict";n.r(t),n.d(t,"ones",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./complex */"./node_modules/@tensorflow/tfjs-core/dist/ops/complex.js"),i=n(/*! ./zeros */"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e,t="float32"){if("complex64"===t){const t=a(e,"float32"),n=Object(i.zeros)(e,"float32");return Object(r.complex)(t,n)}const n=Object(o.makeOnesTypedArray)(Object(o.sizeFromShape)(e),t);return s.ENGINE.makeTensor(n,e,t)}},"./node_modules/@tensorflow/tfjs-core/dist/ops/ones_like.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/ones_like.js ***! + \******************************************************************/ +/*! exports provided: onesLike */function(e,t,n){"use strict";n.r(t),n.d(t,"onesLike",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({onesLike_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","onesLike")};return s.ENGINE.runKernel(o.OnesLike,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js ***! + \******************************************************************/ +/*! exports provided: OP_SCOPE_SUFFIX, op */function(e,t,n){"use strict";n.r(t),n.d(t,"OP_SCOPE_SUFFIX",(function(){return r})),n.d(t,"op",(function(){return i}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r="__op";function i(e){const t=Object.keys(e);if(1!==t.length)throw new Error(`Please provide an object with a single key (operation name) mapping to a function. Got an object with ${t.length} keys.`);let n=t[0];const i=e[n];n.endsWith("_")&&(n=n.substring(0,n.length-1)),n+=r;const a=(...e)=>{s.ENGINE.startScope(n);try{const t=i(...e);return Object(o.isPromise)(t)&&console.error("Cannot return a Promise inside of tidy."),s.ENGINE.endScope(t),t}catch(e){throw s.ENGINE.endScope(null),e}};return Object.defineProperty(a,"name",{value:n,configurable:!0}),a}},"./node_modules/@tensorflow/tfjs-core/dist/ops/ops.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/ops.js ***! + \************************************************************/ +/*! exports provided: abs, acos, acosh, add, addN, all, any, argMax, argMin, asin, asinh, atan, atan2, atanh, avgPool, avgPool3d, basicLSTMCell, batchToSpaceND, batchNorm, batchNorm2d, batchNorm3d, batchNorm4d, bincount, broadcastTo, buffer, cast, ceil, clipByValue, clone, complex, concat, concat1d, concat2d, concat3d, concat4d, conv1d, conv2d, conv2dTranspose, conv3d, conv3dTranspose, cos, cosh, cumsum, denseBincount, depthToSpace, depthwiseConv2d, diag, dilation2d, div, divNoNan, dot, einsum, elu, equal, erf, exp, expandDims, expm1, eye, fill, floor, floorDiv, gather, greater, greaterEqual, imag, isFinite, isInf, isNaN, leakyRelu, less, lessEqual, linspace, localResponseNormalization, log, log1p, logSigmoid, logSoftmax, logSumExp, logicalAnd, logicalNot, logicalOr, logicalXor, matMul, max, maxPool, maxPool3d, maxPoolWithArgmax, maximum, mean, meshgrid, min, minimum, mirrorPad, mod, moments, mul, multiRNNCell, multinomial, neg, notEqual, oneHot, ones, onesLike, outerProduct, pad, pad1d, pad2d, pad3d, pad4d, pool, pow, prelu, print, prod, rand, randomGamma, randomNormal, randomUniform, range, real, reciprocal, relu, relu6, reshape, reverse, reverse1d, reverse2d, reverse3d, reverse4d, round, rsqrt, scalar, selu, separableConv2d, setdiff1dAsync, sigmoid, sign, sin, sinh, slice, slice1d, slice2d, slice3d, slice4d, softmax, softplus, spaceToBatchND, fft, ifft, irfft, rfft, split, sqrt, square, squaredDifference, squeeze, stack, step, stridedSlice, sub, sum, tan, tanh, tensor, tensor1d, tensor2d, tensor3d, tensor4d, tensor5d, tensor6d, tile, topk, truncatedNormal, unique, unsortedSegmentSum, unstack, variable, where, whereAsync, zeros, zerosLike, booleanMaskAsync, transpose, norm, movingAverage, scatterND, sparseToDense, gatherND, dropout, enclosingPowerOfTwo, cosineWindow, inTopKAsync, op, OP_SCOPE_SUFFIX, image, linalg, losses, spectral, fused, signal, sparse, string */function(e,t,n){"use strict";n.r(t),n.d(t,"image",(function(){return _s})),n.d(t,"linalg",(function(){return ks})),n.d(t,"losses",(function(){return vs})),n.d(t,"spectral",(function(){return gs})),n.d(t,"signal",(function(){return ws})),n.d(t,"sparse",(function(){return xs})),n.d(t,"string",(function(){return ys}));var s=n(/*! ./abs */"./node_modules/@tensorflow/tfjs-core/dist/ops/abs.js");n.d(t,"abs",(function(){return s.abs}));var o=n(/*! ./acos */"./node_modules/@tensorflow/tfjs-core/dist/ops/acos.js");n.d(t,"acos",(function(){return o.acos}));var r=n(/*! ./acosh */"./node_modules/@tensorflow/tfjs-core/dist/ops/acosh.js");n.d(t,"acosh",(function(){return r.acosh}));var i=n(/*! ./add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js");n.d(t,"add",(function(){return i.add}));var a=n(/*! ./add_n */"./node_modules/@tensorflow/tfjs-core/dist/ops/add_n.js");n.d(t,"addN",(function(){return a.addN}));var d=n(/*! ./all */"./node_modules/@tensorflow/tfjs-core/dist/ops/all.js");n.d(t,"all",(function(){return d.all}));var u=n(/*! ./any */"./node_modules/@tensorflow/tfjs-core/dist/ops/any.js");n.d(t,"any",(function(){return u.any}));var l=n(/*! ./arg_max */"./node_modules/@tensorflow/tfjs-core/dist/ops/arg_max.js");n.d(t,"argMax",(function(){return l.argMax}));var c=n(/*! ./arg_min */"./node_modules/@tensorflow/tfjs-core/dist/ops/arg_min.js");n.d(t,"argMin",(function(){return c.argMin}));var f=n(/*! ./asin */"./node_modules/@tensorflow/tfjs-core/dist/ops/asin.js");n.d(t,"asin",(function(){return f.asin}));var p=n(/*! ./asinh */"./node_modules/@tensorflow/tfjs-core/dist/ops/asinh.js");n.d(t,"asinh",(function(){return p.asinh}));var m=n(/*! ./atan */"./node_modules/@tensorflow/tfjs-core/dist/ops/atan.js");n.d(t,"atan",(function(){return m.atan}));var h=n(/*! ./atan2 */"./node_modules/@tensorflow/tfjs-core/dist/ops/atan2.js");n.d(t,"atan2",(function(){return h.atan2}));var b=n(/*! ./atanh */"./node_modules/@tensorflow/tfjs-core/dist/ops/atanh.js");n.d(t,"atanh",(function(){return b.atanh}));var j=n(/*! ./avg_pool */"./node_modules/@tensorflow/tfjs-core/dist/ops/avg_pool.js");n.d(t,"avgPool",(function(){return j.avgPool}));var g=n(/*! ./avg_pool_3d */"./node_modules/@tensorflow/tfjs-core/dist/ops/avg_pool_3d.js");n.d(t,"avgPool3d",(function(){return g.avgPool3d}));var w=n(/*! ./basic_lstm_cell */"./node_modules/@tensorflow/tfjs-core/dist/ops/basic_lstm_cell.js");n.d(t,"basicLSTMCell",(function(){return w.basicLSTMCell}));var _=n(/*! ./batch_to_space_nd */"./node_modules/@tensorflow/tfjs-core/dist/ops/batch_to_space_nd.js");n.d(t,"batchToSpaceND",(function(){return _.batchToSpaceND}));var k=n(/*! ./batchnorm */"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm.js");n.d(t,"batchNorm",(function(){return k.batchNorm}));var v=n(/*! ./batchnorm2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm2d.js");n.d(t,"batchNorm2d",(function(){return v.batchNorm2d}));var x=n(/*! ./batchnorm3d */"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm3d.js");n.d(t,"batchNorm3d",(function(){return x.batchNorm3d}));var y=n(/*! ./batchnorm4d */"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm4d.js");n.d(t,"batchNorm4d",(function(){return y.batchNorm4d}));var O=n(/*! ./bincount */"./node_modules/@tensorflow/tfjs-core/dist/ops/bincount.js");n.d(t,"bincount",(function(){return O.bincount}));var I=n(/*! ./broadcast_to */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_to.js");n.d(t,"broadcastTo",(function(){return I.broadcastTo}));var C=n(/*! ./buffer */"./node_modules/@tensorflow/tfjs-core/dist/ops/buffer.js");n.d(t,"buffer",(function(){return C.buffer}));var S=n(/*! ./cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js");n.d(t,"cast",(function(){return S.cast}));var T=n(/*! ./ceil */"./node_modules/@tensorflow/tfjs-core/dist/ops/ceil.js");n.d(t,"ceil",(function(){return T.ceil}));var N=n(/*! ./clip_by_value */"./node_modules/@tensorflow/tfjs-core/dist/ops/clip_by_value.js");n.d(t,"clipByValue",(function(){return N.clipByValue}));var E=n(/*! ./clone */"./node_modules/@tensorflow/tfjs-core/dist/ops/clone.js");n.d(t,"clone",(function(){return E.clone}));var A=n(/*! ./complex */"./node_modules/@tensorflow/tfjs-core/dist/ops/complex.js");n.d(t,"complex",(function(){return A.complex}));var R=n(/*! ./concat */"./node_modules/@tensorflow/tfjs-core/dist/ops/concat.js");n.d(t,"concat",(function(){return R.concat}));var F=n(/*! ./concat_1d */"./node_modules/@tensorflow/tfjs-core/dist/ops/concat_1d.js");n.d(t,"concat1d",(function(){return F.concat1d}));var $=n(/*! ./concat_2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/concat_2d.js");n.d(t,"concat2d",(function(){return $.concat2d}));var M=n(/*! ./concat_3d */"./node_modules/@tensorflow/tfjs-core/dist/ops/concat_3d.js");n.d(t,"concat3d",(function(){return M.concat3d}));var D=n(/*! ./concat_4d */"./node_modules/@tensorflow/tfjs-core/dist/ops/concat_4d.js");n.d(t,"concat4d",(function(){return D.concat4d}));var P=n(/*! ./conv1d */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv1d.js");n.d(t,"conv1d",(function(){return P.conv1d}));var B=n(/*! ./conv2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d.js");n.d(t,"conv2d",(function(){return B.conv2d}));var L=n(/*! ./conv2d_transpose */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d_transpose.js");n.d(t,"conv2dTranspose",(function(){return L.conv2dTranspose}));var z=n(/*! ./conv3d */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv3d.js");n.d(t,"conv3d",(function(){return z.conv3d}));var G=n(/*! ./conv3d_transpose */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv3d_transpose.js");n.d(t,"conv3dTranspose",(function(){return G.conv3dTranspose}));var W=n(/*! ./cos */"./node_modules/@tensorflow/tfjs-core/dist/ops/cos.js");n.d(t,"cos",(function(){return W.cos}));var U=n(/*! ./cosh */"./node_modules/@tensorflow/tfjs-core/dist/ops/cosh.js");n.d(t,"cosh",(function(){return U.cosh}));var V=n(/*! ./cumsum */"./node_modules/@tensorflow/tfjs-core/dist/ops/cumsum.js");n.d(t,"cumsum",(function(){return V.cumsum}));var q=n(/*! ./dense_bincount */"./node_modules/@tensorflow/tfjs-core/dist/ops/dense_bincount.js");n.d(t,"denseBincount",(function(){return q.denseBincount}));var H=n(/*! ./depth_to_space */"./node_modules/@tensorflow/tfjs-core/dist/ops/depth_to_space.js");n.d(t,"depthToSpace",(function(){return H.depthToSpace}));var K=n(/*! ./depthwise_conv2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d.js");n.d(t,"depthwiseConv2d",(function(){return K.depthwiseConv2d}));var X=n(/*! ./diag */"./node_modules/@tensorflow/tfjs-core/dist/ops/diag.js");n.d(t,"diag",(function(){return X.diag}));var Y=n(/*! ./dilation2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/dilation2d.js");n.d(t,"dilation2d",(function(){return Y.dilation2d}));var Z=n(/*! ./div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js");n.d(t,"div",(function(){return Z.div}));var Q=n(/*! ./div_no_nan */"./node_modules/@tensorflow/tfjs-core/dist/ops/div_no_nan.js");n.d(t,"divNoNan",(function(){return Q.divNoNan}));var J=n(/*! ./dot */"./node_modules/@tensorflow/tfjs-core/dist/ops/dot.js");n.d(t,"dot",(function(){return J.dot}));var ee=n(/*! ./einsum */"./node_modules/@tensorflow/tfjs-core/dist/ops/einsum.js");n.d(t,"einsum",(function(){return ee.einsum}));var te=n(/*! ./elu */"./node_modules/@tensorflow/tfjs-core/dist/ops/elu.js");n.d(t,"elu",(function(){return te.elu}));var ne=n(/*! ./equal */"./node_modules/@tensorflow/tfjs-core/dist/ops/equal.js");n.d(t,"equal",(function(){return ne.equal}));var se=n(/*! ./erf */"./node_modules/@tensorflow/tfjs-core/dist/ops/erf.js");n.d(t,"erf",(function(){return se.erf}));var oe=n(/*! ./exp */"./node_modules/@tensorflow/tfjs-core/dist/ops/exp.js");n.d(t,"exp",(function(){return oe.exp}));var re=n(/*! ./expand_dims */"./node_modules/@tensorflow/tfjs-core/dist/ops/expand_dims.js");n.d(t,"expandDims",(function(){return re.expandDims}));var ie=n(/*! ./expm1 */"./node_modules/@tensorflow/tfjs-core/dist/ops/expm1.js");n.d(t,"expm1",(function(){return ie.expm1}));var ae=n(/*! ./eye */"./node_modules/@tensorflow/tfjs-core/dist/ops/eye.js");n.d(t,"eye",(function(){return ae.eye}));var de=n(/*! ./fill */"./node_modules/@tensorflow/tfjs-core/dist/ops/fill.js");n.d(t,"fill",(function(){return de.fill}));var ue=n(/*! ./floor */"./node_modules/@tensorflow/tfjs-core/dist/ops/floor.js");n.d(t,"floor",(function(){return ue.floor}));var le=n(/*! ./floorDiv */"./node_modules/@tensorflow/tfjs-core/dist/ops/floorDiv.js");n.d(t,"floorDiv",(function(){return le.floorDiv}));var ce=n(/*! ./gather */"./node_modules/@tensorflow/tfjs-core/dist/ops/gather.js");n.d(t,"gather",(function(){return ce.gather}));var fe=n(/*! ./greater */"./node_modules/@tensorflow/tfjs-core/dist/ops/greater.js");n.d(t,"greater",(function(){return fe.greater}));var pe=n(/*! ./greater_equal */"./node_modules/@tensorflow/tfjs-core/dist/ops/greater_equal.js");n.d(t,"greaterEqual",(function(){return pe.greaterEqual}));var me=n(/*! ./imag */"./node_modules/@tensorflow/tfjs-core/dist/ops/imag.js");n.d(t,"imag",(function(){return me.imag}));var he=n(/*! ./is_finite */"./node_modules/@tensorflow/tfjs-core/dist/ops/is_finite.js");n.d(t,"isFinite",(function(){return he.isFinite}));var be=n(/*! ./is_inf */"./node_modules/@tensorflow/tfjs-core/dist/ops/is_inf.js");n.d(t,"isInf",(function(){return be.isInf}));var je=n(/*! ./is_nan */"./node_modules/@tensorflow/tfjs-core/dist/ops/is_nan.js");n.d(t,"isNaN",(function(){return je.isNaN}));var ge=n(/*! ./leaky_relu */"./node_modules/@tensorflow/tfjs-core/dist/ops/leaky_relu.js");n.d(t,"leakyRelu",(function(){return ge.leakyRelu}));var we=n(/*! ./less */"./node_modules/@tensorflow/tfjs-core/dist/ops/less.js");n.d(t,"less",(function(){return we.less}));var _e=n(/*! ./less_equal */"./node_modules/@tensorflow/tfjs-core/dist/ops/less_equal.js");n.d(t,"lessEqual",(function(){return _e.lessEqual}));var ke=n(/*! ./linspace */"./node_modules/@tensorflow/tfjs-core/dist/ops/linspace.js");n.d(t,"linspace",(function(){return ke.linspace}));var ve=n(/*! ./local_response_normalization */"./node_modules/@tensorflow/tfjs-core/dist/ops/local_response_normalization.js");n.d(t,"localResponseNormalization",(function(){return ve.localResponseNormalization}));var xe=n(/*! ./log */"./node_modules/@tensorflow/tfjs-core/dist/ops/log.js");n.d(t,"log",(function(){return xe.log}));var ye=n(/*! ./log1p */"./node_modules/@tensorflow/tfjs-core/dist/ops/log1p.js");n.d(t,"log1p",(function(){return ye.log1p}));var Oe=n(/*! ./log_sigmoid */"./node_modules/@tensorflow/tfjs-core/dist/ops/log_sigmoid.js");n.d(t,"logSigmoid",(function(){return Oe.logSigmoid}));var Ie=n(/*! ./log_softmax */"./node_modules/@tensorflow/tfjs-core/dist/ops/log_softmax.js");n.d(t,"logSoftmax",(function(){return Ie.logSoftmax}));var Ce=n(/*! ./log_sum_exp */"./node_modules/@tensorflow/tfjs-core/dist/ops/log_sum_exp.js");n.d(t,"logSumExp",(function(){return Ce.logSumExp}));var Se=n(/*! ./logical_and */"./node_modules/@tensorflow/tfjs-core/dist/ops/logical_and.js");n.d(t,"logicalAnd",(function(){return Se.logicalAnd}));var Te=n(/*! ./logical_not */"./node_modules/@tensorflow/tfjs-core/dist/ops/logical_not.js");n.d(t,"logicalNot",(function(){return Te.logicalNot}));var Ne=n(/*! ./logical_or */"./node_modules/@tensorflow/tfjs-core/dist/ops/logical_or.js");n.d(t,"logicalOr",(function(){return Ne.logicalOr}));var Ee=n(/*! ./logical_xor */"./node_modules/@tensorflow/tfjs-core/dist/ops/logical_xor.js");n.d(t,"logicalXor",(function(){return Ee.logicalXor}));var Ae=n(/*! ./mat_mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mat_mul.js");n.d(t,"matMul",(function(){return Ae.matMul}));var Re=n(/*! ./max */"./node_modules/@tensorflow/tfjs-core/dist/ops/max.js");n.d(t,"max",(function(){return Re.max}));var Fe=n(/*! ./max_pool */"./node_modules/@tensorflow/tfjs-core/dist/ops/max_pool.js");n.d(t,"maxPool",(function(){return Fe.maxPool}));var $e=n(/*! ./max_pool_3d */"./node_modules/@tensorflow/tfjs-core/dist/ops/max_pool_3d.js");n.d(t,"maxPool3d",(function(){return $e.maxPool3d}));var Me=n(/*! ./max_pool_with_argmax */"./node_modules/@tensorflow/tfjs-core/dist/ops/max_pool_with_argmax.js");n.d(t,"maxPoolWithArgmax",(function(){return Me.maxPoolWithArgmax}));var De=n(/*! ./maximum */"./node_modules/@tensorflow/tfjs-core/dist/ops/maximum.js");n.d(t,"maximum",(function(){return De.maximum}));var Pe=n(/*! ./mean */"./node_modules/@tensorflow/tfjs-core/dist/ops/mean.js");n.d(t,"mean",(function(){return Pe.mean}));var Be=n(/*! ./meshgrid */"./node_modules/@tensorflow/tfjs-core/dist/ops/meshgrid.js");n.d(t,"meshgrid",(function(){return Be.meshgrid}));var Le=n(/*! ./min */"./node_modules/@tensorflow/tfjs-core/dist/ops/min.js");n.d(t,"min",(function(){return Le.min}));var ze=n(/*! ./minimum */"./node_modules/@tensorflow/tfjs-core/dist/ops/minimum.js");n.d(t,"minimum",(function(){return ze.minimum}));var Ge=n(/*! ./mirror_pad */"./node_modules/@tensorflow/tfjs-core/dist/ops/mirror_pad.js");n.d(t,"mirrorPad",(function(){return Ge.mirrorPad}));var We=n(/*! ./mod */"./node_modules/@tensorflow/tfjs-core/dist/ops/mod.js");n.d(t,"mod",(function(){return We.mod}));var Ue=n(/*! ./moments */"./node_modules/@tensorflow/tfjs-core/dist/ops/moments.js");n.d(t,"moments",(function(){return Ue.moments}));var Ve=n(/*! ./mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js");n.d(t,"mul",(function(){return Ve.mul}));var qe=n(/*! ./multi_rnn_cell */"./node_modules/@tensorflow/tfjs-core/dist/ops/multi_rnn_cell.js");n.d(t,"multiRNNCell",(function(){return qe.multiRNNCell}));var He=n(/*! ./multinomial */"./node_modules/@tensorflow/tfjs-core/dist/ops/multinomial.js");n.d(t,"multinomial",(function(){return He.multinomial}));var Ke=n(/*! ./neg */"./node_modules/@tensorflow/tfjs-core/dist/ops/neg.js");n.d(t,"neg",(function(){return Ke.neg}));var Xe=n(/*! ./not_equal */"./node_modules/@tensorflow/tfjs-core/dist/ops/not_equal.js");n.d(t,"notEqual",(function(){return Xe.notEqual}));var Ye=n(/*! ./one_hot */"./node_modules/@tensorflow/tfjs-core/dist/ops/one_hot.js");n.d(t,"oneHot",(function(){return Ye.oneHot}));var Ze=n(/*! ./ones */"./node_modules/@tensorflow/tfjs-core/dist/ops/ones.js");n.d(t,"ones",(function(){return Ze.ones}));var Qe=n(/*! ./ones_like */"./node_modules/@tensorflow/tfjs-core/dist/ops/ones_like.js");n.d(t,"onesLike",(function(){return Qe.onesLike}));var Je=n(/*! ./outer_product */"./node_modules/@tensorflow/tfjs-core/dist/ops/outer_product.js");n.d(t,"outerProduct",(function(){return Je.outerProduct}));var et=n(/*! ./pad */"./node_modules/@tensorflow/tfjs-core/dist/ops/pad.js");n.d(t,"pad",(function(){return et.pad}));var tt=n(/*! ./pad1d */"./node_modules/@tensorflow/tfjs-core/dist/ops/pad1d.js");n.d(t,"pad1d",(function(){return tt.pad1d}));var nt=n(/*! ./pad2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/pad2d.js");n.d(t,"pad2d",(function(){return nt.pad2d}));var st=n(/*! ./pad3d */"./node_modules/@tensorflow/tfjs-core/dist/ops/pad3d.js");n.d(t,"pad3d",(function(){return st.pad3d}));var ot=n(/*! ./pad4d */"./node_modules/@tensorflow/tfjs-core/dist/ops/pad4d.js");n.d(t,"pad4d",(function(){return ot.pad4d}));var rt=n(/*! ./pool */"./node_modules/@tensorflow/tfjs-core/dist/ops/pool.js");n.d(t,"pool",(function(){return rt.pool}));var it=n(/*! ./pow */"./node_modules/@tensorflow/tfjs-core/dist/ops/pow.js");n.d(t,"pow",(function(){return it.pow}));var at=n(/*! ./prelu */"./node_modules/@tensorflow/tfjs-core/dist/ops/prelu.js");n.d(t,"prelu",(function(){return at.prelu}));var dt=n(/*! ./print */"./node_modules/@tensorflow/tfjs-core/dist/ops/print.js");n.d(t,"print",(function(){return dt.print}));var ut=n(/*! ./prod */"./node_modules/@tensorflow/tfjs-core/dist/ops/prod.js");n.d(t,"prod",(function(){return ut.prod}));var lt=n(/*! ./rand */"./node_modules/@tensorflow/tfjs-core/dist/ops/rand.js");n.d(t,"rand",(function(){return lt.rand}));var ct=n(/*! ./random_gamma */"./node_modules/@tensorflow/tfjs-core/dist/ops/random_gamma.js");n.d(t,"randomGamma",(function(){return ct.randomGamma}));var ft=n(/*! ./random_normal */"./node_modules/@tensorflow/tfjs-core/dist/ops/random_normal.js");n.d(t,"randomNormal",(function(){return ft.randomNormal}));var pt=n(/*! ./random_uniform */"./node_modules/@tensorflow/tfjs-core/dist/ops/random_uniform.js");n.d(t,"randomUniform",(function(){return pt.randomUniform}));var mt=n(/*! ./range */"./node_modules/@tensorflow/tfjs-core/dist/ops/range.js");n.d(t,"range",(function(){return mt.range}));var ht=n(/*! ./real */"./node_modules/@tensorflow/tfjs-core/dist/ops/real.js");n.d(t,"real",(function(){return ht.real}));var bt=n(/*! ./reciprocal */"./node_modules/@tensorflow/tfjs-core/dist/ops/reciprocal.js");n.d(t,"reciprocal",(function(){return bt.reciprocal}));var jt=n(/*! ./relu */"./node_modules/@tensorflow/tfjs-core/dist/ops/relu.js");n.d(t,"relu",(function(){return jt.relu}));var gt=n(/*! ./relu6 */"./node_modules/@tensorflow/tfjs-core/dist/ops/relu6.js");n.d(t,"relu6",(function(){return gt.relu6}));var wt=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");n.d(t,"reshape",(function(){return wt.reshape}));var _t=n(/*! ./reverse */"./node_modules/@tensorflow/tfjs-core/dist/ops/reverse.js");n.d(t,"reverse",(function(){return _t.reverse}));var kt=n(/*! ./reverse_1d */"./node_modules/@tensorflow/tfjs-core/dist/ops/reverse_1d.js");n.d(t,"reverse1d",(function(){return kt.reverse1d}));var vt=n(/*! ./reverse_2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/reverse_2d.js");n.d(t,"reverse2d",(function(){return vt.reverse2d}));var xt=n(/*! ./reverse_3d */"./node_modules/@tensorflow/tfjs-core/dist/ops/reverse_3d.js");n.d(t,"reverse3d",(function(){return xt.reverse3d}));var yt=n(/*! ./reverse_4d */"./node_modules/@tensorflow/tfjs-core/dist/ops/reverse_4d.js");n.d(t,"reverse4d",(function(){return yt.reverse4d}));var Ot=n(/*! ./round */"./node_modules/@tensorflow/tfjs-core/dist/ops/round.js");n.d(t,"round",(function(){return Ot.round}));var It=n(/*! ./rsqrt */"./node_modules/@tensorflow/tfjs-core/dist/ops/rsqrt.js");n.d(t,"rsqrt",(function(){return It.rsqrt}));var Ct=n(/*! ./scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js");n.d(t,"scalar",(function(){return Ct.scalar}));var St=n(/*! ./selu */"./node_modules/@tensorflow/tfjs-core/dist/ops/selu.js");n.d(t,"selu",(function(){return St.selu}));var Tt=n(/*! ./separable_conv2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/separable_conv2d.js");n.d(t,"separableConv2d",(function(){return Tt.separableConv2d}));var Nt=n(/*! ./setdiff1d_async */"./node_modules/@tensorflow/tfjs-core/dist/ops/setdiff1d_async.js");n.d(t,"setdiff1dAsync",(function(){return Nt.setdiff1dAsync}));var Et=n(/*! ./sigmoid */"./node_modules/@tensorflow/tfjs-core/dist/ops/sigmoid.js");n.d(t,"sigmoid",(function(){return Et.sigmoid}));var At=n(/*! ./sign */"./node_modules/@tensorflow/tfjs-core/dist/ops/sign.js");n.d(t,"sign",(function(){return At.sign}));var Rt=n(/*! ./sin */"./node_modules/@tensorflow/tfjs-core/dist/ops/sin.js");n.d(t,"sin",(function(){return Rt.sin}));var Ft=n(/*! ./sinh */"./node_modules/@tensorflow/tfjs-core/dist/ops/sinh.js");n.d(t,"sinh",(function(){return Ft.sinh}));var $t=n(/*! ./slice */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice.js");n.d(t,"slice",(function(){return $t.slice}));var Mt=n(/*! ./slice1d */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice1d.js");n.d(t,"slice1d",(function(){return Mt.slice1d}));var Dt=n(/*! ./slice2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice2d.js");n.d(t,"slice2d",(function(){return Dt.slice2d}));var Pt=n(/*! ./slice3d */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice3d.js");n.d(t,"slice3d",(function(){return Pt.slice3d}));var Bt=n(/*! ./slice4d */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice4d.js");n.d(t,"slice4d",(function(){return Bt.slice4d}));var Lt=n(/*! ./softmax */"./node_modules/@tensorflow/tfjs-core/dist/ops/softmax.js");n.d(t,"softmax",(function(){return Lt.softmax}));var zt=n(/*! ./softplus */"./node_modules/@tensorflow/tfjs-core/dist/ops/softplus.js");n.d(t,"softplus",(function(){return zt.softplus}));var Gt=n(/*! ./space_to_batch_nd */"./node_modules/@tensorflow/tfjs-core/dist/ops/space_to_batch_nd.js");n.d(t,"spaceToBatchND",(function(){return Gt.spaceToBatchND}));var Wt=n(/*! ./spectral/fft */"./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/fft.js");n.d(t,"fft",(function(){return Wt.fft}));var Ut=n(/*! ./spectral/ifft */"./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/ifft.js");n.d(t,"ifft",(function(){return Ut.ifft}));var Vt=n(/*! ./spectral/irfft */"./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/irfft.js");n.d(t,"irfft",(function(){return Vt.irfft}));var qt=n(/*! ./spectral/rfft */"./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/rfft.js");n.d(t,"rfft",(function(){return qt.rfft}));var Ht=n(/*! ./split */"./node_modules/@tensorflow/tfjs-core/dist/ops/split.js");n.d(t,"split",(function(){return Ht.split}));var Kt=n(/*! ./sqrt */"./node_modules/@tensorflow/tfjs-core/dist/ops/sqrt.js");n.d(t,"sqrt",(function(){return Kt.sqrt}));var Xt=n(/*! ./square */"./node_modules/@tensorflow/tfjs-core/dist/ops/square.js");n.d(t,"square",(function(){return Xt.square}));var Yt=n(/*! ./squared_difference */"./node_modules/@tensorflow/tfjs-core/dist/ops/squared_difference.js");n.d(t,"squaredDifference",(function(){return Yt.squaredDifference}));var Zt=n(/*! ./squeeze */"./node_modules/@tensorflow/tfjs-core/dist/ops/squeeze.js");n.d(t,"squeeze",(function(){return Zt.squeeze}));var Qt=n(/*! ./stack */"./node_modules/@tensorflow/tfjs-core/dist/ops/stack.js");n.d(t,"stack",(function(){return Qt.stack}));var Jt=n(/*! ./step */"./node_modules/@tensorflow/tfjs-core/dist/ops/step.js");n.d(t,"step",(function(){return Jt.step}));var en=n(/*! ./strided_slice */"./node_modules/@tensorflow/tfjs-core/dist/ops/strided_slice.js");n.d(t,"stridedSlice",(function(){return en.stridedSlice}));var tn=n(/*! ./sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js");n.d(t,"sub",(function(){return tn.sub}));var nn=n(/*! ./sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js");n.d(t,"sum",(function(){return nn.sum}));var sn=n(/*! ./tan */"./node_modules/@tensorflow/tfjs-core/dist/ops/tan.js");n.d(t,"tan",(function(){return sn.tan}));var on=n(/*! ./tanh */"./node_modules/@tensorflow/tfjs-core/dist/ops/tanh.js");n.d(t,"tanh",(function(){return on.tanh}));var rn=n(/*! ./tensor */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor.js");n.d(t,"tensor",(function(){return rn.tensor}));var an=n(/*! ./tensor1d */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor1d.js");n.d(t,"tensor1d",(function(){return an.tensor1d}));var dn=n(/*! ./tensor2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor2d.js");n.d(t,"tensor2d",(function(){return dn.tensor2d}));var un=n(/*! ./tensor3d */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor3d.js");n.d(t,"tensor3d",(function(){return un.tensor3d}));var ln=n(/*! ./tensor4d */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor4d.js");n.d(t,"tensor4d",(function(){return ln.tensor4d}));var cn=n(/*! ./tensor5d */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor5d.js");n.d(t,"tensor5d",(function(){return cn.tensor5d}));var fn=n(/*! ./tensor6d */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor6d.js");n.d(t,"tensor6d",(function(){return fn.tensor6d}));var pn=n(/*! ./tile */"./node_modules/@tensorflow/tfjs-core/dist/ops/tile.js");n.d(t,"tile",(function(){return pn.tile}));var mn=n(/*! ./topk */"./node_modules/@tensorflow/tfjs-core/dist/ops/topk.js");n.d(t,"topk",(function(){return mn.topk}));var hn=n(/*! ./truncated_normal */"./node_modules/@tensorflow/tfjs-core/dist/ops/truncated_normal.js");n.d(t,"truncatedNormal",(function(){return hn.truncatedNormal}));var bn=n(/*! ./unique */"./node_modules/@tensorflow/tfjs-core/dist/ops/unique.js");n.d(t,"unique",(function(){return bn.unique}));var jn=n(/*! ./unsorted_segment_sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/unsorted_segment_sum.js");n.d(t,"unsortedSegmentSum",(function(){return jn.unsortedSegmentSum}));var gn=n(/*! ./unstack */"./node_modules/@tensorflow/tfjs-core/dist/ops/unstack.js");n.d(t,"unstack",(function(){return gn.unstack}));var wn=n(/*! ./variable */"./node_modules/@tensorflow/tfjs-core/dist/ops/variable.js");n.d(t,"variable",(function(){return wn.variable}));var _n=n(/*! ./where */"./node_modules/@tensorflow/tfjs-core/dist/ops/where.js");n.d(t,"where",(function(){return _n.where}));var kn=n(/*! ./where_async */"./node_modules/@tensorflow/tfjs-core/dist/ops/where_async.js");n.d(t,"whereAsync",(function(){return kn.whereAsync}));var vn=n(/*! ./zeros */"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros.js");n.d(t,"zeros",(function(){return vn.zeros}));var xn=n(/*! ./zeros_like */"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js");n.d(t,"zerosLike",(function(){return xn.zerosLike}));var yn=n(/*! ./boolean_mask */"./node_modules/@tensorflow/tfjs-core/dist/ops/boolean_mask.js");n.d(t,"booleanMaskAsync",(function(){return yn.booleanMaskAsync}));var On=n(/*! ./transpose */"./node_modules/@tensorflow/tfjs-core/dist/ops/transpose.js");n.d(t,"transpose",(function(){return On.transpose}));var In=n(/*! ./norm */"./node_modules/@tensorflow/tfjs-core/dist/ops/norm.js");n.d(t,"norm",(function(){return In.norm}));var Cn=n(/*! ./moving_average */"./node_modules/@tensorflow/tfjs-core/dist/ops/moving_average.js");n.d(t,"movingAverage",(function(){return Cn.movingAverage}));var Sn=n(/*! ./scatter_nd */"./node_modules/@tensorflow/tfjs-core/dist/ops/scatter_nd.js");n.d(t,"scatterND",(function(){return Sn.scatterND}));var Tn=n(/*! ./sparse_to_dense */"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse_to_dense.js");n.d(t,"sparseToDense",(function(){return Tn.sparseToDense}));var Nn=n(/*! ./gather_nd */"./node_modules/@tensorflow/tfjs-core/dist/ops/gather_nd.js");n.d(t,"gatherND",(function(){return Nn.gatherND}));var En=n(/*! ./dropout */"./node_modules/@tensorflow/tfjs-core/dist/ops/dropout.js");n.d(t,"dropout",(function(){return En.dropout}));var An=n(/*! ./signal_ops_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/signal_ops_util.js");n.d(t,"enclosingPowerOfTwo",(function(){return An.enclosingPowerOfTwo})),n.d(t,"cosineWindow",(function(){return An.cosineWindow}));var Rn=n(/*! ./in_top_k */"./node_modules/@tensorflow/tfjs-core/dist/ops/in_top_k.js");n.d(t,"inTopKAsync",(function(){return Rn.inTopKAsync}));var Fn=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");n.d(t,"op",(function(){return Fn.op})),n.d(t,"OP_SCOPE_SUFFIX",(function(){return Fn.OP_SCOPE_SUFFIX}));var $n=n(/*! ./fused_ops */"./node_modules/@tensorflow/tfjs-core/dist/ops/fused_ops.js");n.d(t,"fused",(function(){return $n}));var Mn=n(/*! ./signal/hamming_window */"./node_modules/@tensorflow/tfjs-core/dist/ops/signal/hamming_window.js"),Dn=n(/*! ./signal/hann_window */"./node_modules/@tensorflow/tfjs-core/dist/ops/signal/hann_window.js"),Pn=n(/*! ./signal/frame */"./node_modules/@tensorflow/tfjs-core/dist/ops/signal/frame.js"),Bn=n(/*! ./signal/stft */"./node_modules/@tensorflow/tfjs-core/dist/ops/signal/stft.js"),Ln=n(/*! ./image/crop_and_resize */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/crop_and_resize.js"),zn=n(/*! ./image/flip_left_right */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/flip_left_right.js"),Gn=n(/*! ./image/rotate_with_offset */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/rotate_with_offset.js"),Wn=n(/*! ./image/non_max_suppression */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression.js"),Un=n(/*! ./image/non_max_suppression_async */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_async.js"),Vn=n(/*! ./image/non_max_suppression_with_score */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_with_score.js"),qn=n(/*! ./image/non_max_suppression_with_score_async */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_with_score_async.js"),Hn=n(/*! ./image/non_max_suppression_padded */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_padded.js"),Kn=n(/*! ./image/non_max_suppression_padded_async */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_padded_async.js"),Xn=n(/*! ./image/resize_bilinear */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/resize_bilinear.js"),Yn=n(/*! ./image/resize_nearest_neighbor */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/resize_nearest_neighbor.js"),Zn=n(/*! ./image/threshold */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/threshold.js"),Qn=n(/*! ./image/transform */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/transform.js"),Jn=n(/*! ./linalg/band_part */"./node_modules/@tensorflow/tfjs-core/dist/ops/linalg/band_part.js"),es=n(/*! ./linalg/gram_schmidt */"./node_modules/@tensorflow/tfjs-core/dist/ops/linalg/gram_schmidt.js"),ts=n(/*! ./linalg/qr */"./node_modules/@tensorflow/tfjs-core/dist/ops/linalg/qr.js"),ns=n(/*! ./losses/absolute_difference */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/absolute_difference.js"),ss=n(/*! ./losses/compute_weighted_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js"),os=n(/*! ./losses/cosine_distance */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/cosine_distance.js"),rs=n(/*! ./losses/hinge_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/hinge_loss.js"),is=n(/*! ./losses/huber_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/huber_loss.js"),as=n(/*! ./losses/log_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/log_loss.js"),ds=n(/*! ./losses/mean_squared_error */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/mean_squared_error.js"),us=n(/*! ./losses/sigmoid_cross_entropy */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/sigmoid_cross_entropy.js"),ls=n(/*! ./losses/softmax_cross_entropy */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/softmax_cross_entropy.js"),cs=n(/*! ./sparse/sparse_fill_empty_rows */"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_fill_empty_rows.js"),fs=n(/*! ./sparse/sparse_reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_reshape.js"),ps=n(/*! ./sparse/sparse_segment_mean */"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_segment_mean.js"),ms=n(/*! ./sparse/sparse_segment_sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_segment_sum.js"),hs=n(/*! ./string/string_n_grams */"./node_modules/@tensorflow/tfjs-core/dist/ops/string/string_n_grams.js"),bs=n(/*! ./string/string_split */"./node_modules/@tensorflow/tfjs-core/dist/ops/string/string_split.js"),js=n(/*! ./string/string_to_hash_bucket_fast */"./node_modules/@tensorflow/tfjs-core/dist/ops/string/string_to_hash_bucket_fast.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const gs={fft:Wt.fft,ifft:Ut.ifft,rfft:qt.rfft,irfft:Vt.irfft},ws={hammingWindow:Mn.hammingWindow,hannWindow:Dn.hannWindow,frame:Pn.frame,stft:Bn.stft},_s={flipLeftRight:zn.flipLeftRight,resizeNearestNeighbor:Yn.resizeNearestNeighbor,resizeBilinear:Xn.resizeBilinear,rotateWithOffset:Gn.rotateWithOffset,cropAndResize:Ln.cropAndResize,nonMaxSuppression:Wn.nonMaxSuppression,nonMaxSuppressionAsync:Un.nonMaxSuppressionAsync,nonMaxSuppressionWithScore:Vn.nonMaxSuppressionWithScore,nonMaxSuppressionWithScoreAsync:qn.nonMaxSuppressionWithScoreAsync,nonMaxSuppressionPadded:Hn.nonMaxSuppressionPadded,nonMaxSuppressionPaddedAsync:Kn.nonMaxSuppressionPaddedAsync,threshold:Zn.threshold,transform:Qn.transform},ks={bandPart:Jn.bandPart,gramSchmidt:es.gramSchmidt,qr:ts.qr},vs={absoluteDifference:ns.absoluteDifference,computeWeightedLoss:ss.computeWeightedLoss,cosineDistance:os.cosineDistance,hingeLoss:rs.hingeLoss,huberLoss:is.huberLoss,logLoss:as.logLoss,meanSquaredError:ds.meanSquaredError,sigmoidCrossEntropy:us.sigmoidCrossEntropy,softmaxCrossEntropy:ls.softmaxCrossEntropy},xs={sparseFillEmptyRows:cs.sparseFillEmptyRows,sparseReshape:fs.sparseReshape,sparseSegmentMean:ps.sparseSegmentMean,sparseSegmentSum:ms.sparseSegmentSum},ys={stringNGrams:hs.stringNGrams,stringSplit:bs.stringSplit,stringToHashBucketFast:js.stringToHashBucketFast}},"./node_modules/@tensorflow/tfjs-core/dist/ops/outer_product.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/outer_product.js ***! + \**********************************************************************/ +/*! exports provided: outerProduct */function(e,t,n){"use strict";n.r(t),n.d(t,"outerProduct",(function(){return d}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./mat_mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mat_mul.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),a=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const d=Object(i.op)({outerProduct_:function(e,t){const n=Object(s.convertToTensor)(e,"v1","outerProduct"),i=Object(s.convertToTensor)(t,"v2","outerProduct");o.assert(1===n.rank&&1===i.rank,(()=>`Error in outerProduct: inputs must be rank 1, but got ranks ${n.rank} and ${i.rank}.`));const d=Object(a.reshape)(n,[-1,1]),u=Object(a.reshape)(i,[1,-1]);return Object(r.matMul)(d,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/pad.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/pad.js ***! + \************************************************************/ +/*! exports provided: pad */function(e,t,n){"use strict";n.r(t),n.d(t,"pad",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({pad_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n=0){const i=Object(r.convertToTensor)(e,"x","pad");if(0===i.rank)throw new Error("pad(scalar) is not defined. Pass non-scalar to pad");const a={paddings:t,constantValue:n},d={x:i};return s.ENGINE.runKernel(o.PadV2,d,a)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/pad1d.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/pad1d.js ***! + \**************************************************************/ +/*! exports provided: pad1d */function(e,t,n){"use strict";n.r(t),n.d(t,"pad1d",(function(){return i}));var s=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),o=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),r=n(/*! ./pad */"./node_modules/@tensorflow/tfjs-core/dist/ops/pad.js");const i=Object(o.op)({pad1d_:function(e,t,n=0){return Object(s.assert)(2===t.length,(()=>"Invalid number of paddings. Must be length of 2.")),Object(r.pad)(e,[t],n)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/pad2d.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/pad2d.js ***! + \**************************************************************/ +/*! exports provided: pad2d */function(e,t,n){"use strict";n.r(t),n.d(t,"pad2d",(function(){return i}));var s=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),o=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),r=n(/*! ./pad */"./node_modules/@tensorflow/tfjs-core/dist/ops/pad.js");const i=Object(o.op)({pad2d_:function(e,t,n=0){return Object(s.assert)(2===t.length&&2===t[0].length&&2===t[1].length,(()=>"Invalid number of paddings. Must be length of 2 each.")),Object(r.pad)(e,t,n)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/pad3d.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/pad3d.js ***! + \**************************************************************/ +/*! exports provided: pad3d */function(e,t,n){"use strict";n.r(t),n.d(t,"pad3d",(function(){return i}));var s=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),o=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),r=n(/*! ./pad */"./node_modules/@tensorflow/tfjs-core/dist/ops/pad.js");const i=Object(o.op)({pad3d_:function(e,t,n=0){return Object(s.assert)(3===t.length&&2===t[0].length&&2===t[1].length&&2===t[2].length,(()=>"Invalid number of paddings. Must be length of 2 each.")),Object(r.pad)(e,t,n)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/pad4d.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/pad4d.js ***! + \**************************************************************/ +/*! exports provided: pad4d */function(e,t,n){"use strict";n.r(t),n.d(t,"pad4d",(function(){return i}));var s=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),o=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),r=n(/*! ./pad */"./node_modules/@tensorflow/tfjs-core/dist/ops/pad.js");const i=Object(o.op)({pad4d_:function(e,t,n=0){return Object(s.assert)(4===t.length&&2===t[0].length&&2===t[1].length&&2===t[2].length&&2===t[3].length,(()=>"Invalid number of paddings. Must be length of 2 each.")),Object(r.pad)(e,t,n)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/pool.js": +/*!*************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/pool.js ***! + \*************************************************************/ +/*! exports provided: pool */function(e,t,n){"use strict";n.r(t),n.d(t,"pool",(function(){return f}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./avg_pool */"./node_modules/@tensorflow/tfjs-core/dist/ops/avg_pool.js"),i=n(/*! ./batch_to_space_nd */"./node_modules/@tensorflow/tfjs-core/dist/ops/batch_to_space_nd.js"),a=n(/*! ./conv_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js"),d=n(/*! ./max_pool */"./node_modules/@tensorflow/tfjs-core/dist/ops/max_pool.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),l=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),c=n(/*! ./space_to_batch_nd */"./node_modules/@tensorflow/tfjs-core/dist/ops/space_to_batch_nd.js");const f=Object(u.op)({pool_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,u,f,p){null==f&&(f=[1,1]),null==p&&(p=1),0===u&&(u="valid");const m=Object(s.convertToTensor)(e,"x","maxPool");let h=m,b=!1;3===m.rank&&(b=!0,h=Object(l.reshape)(m,[1,m.shape[0],m.shape[1],m.shape[2]])),o.assert(a.eitherStridesOrDilationsAreOne(p,f),(()=>`Error in pool: Either strides or dilations must be 1. Got strides ${p} and dilations '${f}'`));const j=a.computePool2DInfo(h.shape,t,p,f,u),g=[j.dilationHeight,j.dilationWidth];let w;w="same"===u?function(e,t){const n=e.map(((e,n)=>e+(e-1)*(t[n]-1))).map((e=>e-1)),s=n.map((e=>Math.floor(e/2))),o=n.map(((e,t)=>e-s[t]));return n.map(((e,t)=>[s[t],o[t]]))}([j.filterHeight,j.filterWidth],g):[[0,0],[0,0]];const _=1===g[0]&&1===g[1],[k,v]=function(e,t,n){const s=n.map((e=>e[0])),o=n.map((e=>e[1])),r=e.concat(s,o),i=t.map(((e,t)=>(e-r[t]%e)%e)),a=o.map(((e,t)=>e+i[t])),d=t.map(((e,t)=>[s[t],a[t]])),u=t.map(((e,t)=>[0,i[t]]));return[d,u]}([j.inHeight,j.inWidth],g,w),x=_?u:"valid",y=_?h:Object(c.spaceToBatchND)(h,g,k),O=("avg"===n?()=>Object(r.avgPool)(y,t,p,x):()=>Object(d.maxPool)(y,t,p,x))(),I=_?O:Object(i.batchToSpaceND)(O,g,v);return b?Object(l.reshape)(I,[I.shape[1],I.shape[2],I.shape[3]]):I}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/pow.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/pow.js ***! + \************************************************************/ +/*! exports provided: pow */function(e,t,n){"use strict";n.r(t),n.d(t,"pow",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({pow_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){let n=Object(i.convertToTensor)(e,"base","pow"),a=Object(i.convertToTensor)(t,"exp","pow");[n,a]=Object(r.makeTypesMatch)(n,a);const d={a:n,b:a};return s.ENGINE.runKernel(o.Pow,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/prelu.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/prelu.js ***! + \**************************************************************/ +/*! exports provided: prelu */function(e,t,n){"use strict";n.r(t),n.d(t,"prelu",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({prelu_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){const n={x:Object(r.convertToTensor)(e,"x","prelu"),alpha:Object(r.convertToTensor)(t,"alpha","prelu")};return s.ENGINE.runKernel(o.Prelu,n)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/print.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/print.js ***! + \**************************************************************/ +/*! exports provided: print */function(e,t,n){"use strict"; +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function s(e,t=!1){console.log(e.toString(t))}n.r(t),n.d(t,"print",(function(){return s}))},"./node_modules/@tensorflow/tfjs-core/dist/ops/prod.js": +/*!*************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/prod.js ***! + \*************************************************************/ +/*! exports provided: prod */function(e,t,n){"use strict";n.r(t),n.d(t,"prod",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({prod_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=null,n=!1){let a=Object(r.convertToTensor)(e,"x","prod");"bool"===a.dtype&&(a=Object(i.cast)(a,"int32"));const d={x:a},u={axis:t,keepDims:n};return s.ENGINE.runKernel(o.Prod,d,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/rand.js": +/*!*************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/rand.js ***! + \*************************************************************/ +/*! exports provided: rand */function(e,t,n){"use strict";n.r(t),n.d(t,"rand",(function(){return i}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const i=Object(r.op)({rand_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n){const r=Object(o.sizeFromShape)(e);let i=null;if(null==n||"float32"===n)i=new Float32Array(r);else if("int32"===n)i=new Int32Array(r);else{if("bool"!==n)throw new Error(`Unknown data type ${n}`);i=new Uint8Array(r)}for(let e=0;e=1||0===r);const i=Math.sqrt(-2*Math.log(r)/r);e=this.mean+this.stdDev*s*i,t=this.mean+this.stdDev*o*i,this.truncated&&!this.isValidTruncated(e)||(n=!0)}return this.truncated&&!this.isValidTruncated(t)||(this.nextVal=this.convertValue(t)),this.convertValue(e)}convertValue(e){return null==this.dtype||"float32"===this.dtype?e:Math.round(e)}isValidTruncated(e){return e<=this.upper&&e>=this.lower}}class i{constructor(e,t,n,o){this.alpha=e,this.beta=1/t,this.dtype=n;const i=o||Math.random();this.randu=s.alea(i.toString()),this.randn=new r(0,1,n,!1,this.randu()),this.d=e<1?e+2/3:e-1/3,this.c=1/Math.sqrt(9*this.d)}nextValue(){let e,t,n,s,o,r;for(;;){do{s=this.randn.nextValue(),r=1+this.c*s}while(r<=0);if(r*=r*r,e=s*s,t=1-.331*e*e,n=.5*e+this.d*(1-r+Math.log(r)),o=this.randu(),onull==this.dtype||"float32"===this.dtype,this.min=e,this.range=t-e,this.dtype=n,null==o&&(o=Math.random()),"number"==typeof o&&(o=o.toString()),!this.canReturnFloat()&&this.range<=1)throw new Error(`The difference between ${e} - ${t} <= 1 and dtype is not float`);this.random=s.alea(o)}convertValue(e){return this.canReturnFloat()?e:Math.round(e)}nextValue(){return this.convertValue(this.min+this.range*this.random())}}function d(e){const t=e.length,n=function(e){const t=l(e),n=e.length;let s=0,o=0;for(let r=0;r5.991)throw new Error(`Invalid p-value for JB: ${o}`)}function u(e,t,n,s){null==s&&(s=Object(o.testEpsilon)());const r=l(e);Object(o.expectNumbersClose)(r,t,s),Object(o.expectNumbersClose)(function(e,t){let n=0;for(let s=0;s`Error in reverse1D: x must be rank 1 but got rank ${t.rank}.`)),Object(i.reverse)(t,0)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/reverse_2d.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/reverse_2d.js ***! + \*******************************************************************/ +/*! exports provided: reverse2d */function(e,t,n){"use strict";n.r(t),n.d(t,"reverse2d",(function(){return a}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),i=n(/*! ./reverse */"./node_modules/@tensorflow/tfjs-core/dist/ops/reverse.js");const a=Object(r.op)({reverse2d_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){const n=Object(s.convertToTensor)(e,"x","reverse");return o.assert(2===n.rank,(()=>`Error in reverse2D: x must be rank 2 but got rank ${n.rank}.`)),Object(i.reverse)(n,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/reverse_3d.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/reverse_3d.js ***! + \*******************************************************************/ +/*! exports provided: reverse3d */function(e,t,n){"use strict";n.r(t),n.d(t,"reverse3d",(function(){return a}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),i=n(/*! ./reverse */"./node_modules/@tensorflow/tfjs-core/dist/ops/reverse.js");const a=Object(r.op)({reverse3d_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){const n=Object(s.convertToTensor)(e,"x","reverse");return o.assert(3===n.rank,(()=>`Error in reverse3D: x must be rank 3 but got rank ${n.rank}.`)),Object(i.reverse)(n,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/reverse_4d.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/reverse_4d.js ***! + \*******************************************************************/ +/*! exports provided: reverse4d */function(e,t,n){"use strict";n.r(t),n.d(t,"reverse4d",(function(){return a}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),i=n(/*! ./reverse */"./node_modules/@tensorflow/tfjs-core/dist/ops/reverse.js");const a=Object(r.op)({reverse4d_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){const n=Object(s.convertToTensor)(e,"x","reverse");return o.assert(4===n.rank,(()=>`Error in reverse4D: x must be rank 4 but got rank ${n.rank}.`)),Object(i.reverse)(n,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/rotate_util.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/rotate_util.js ***! + \********************************************************************/ +/*! exports provided: getImageCenter */function(e,t,n){"use strict"; +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function s(e,t,n){return[n*("number"==typeof e?e:e[0]),t*("number"==typeof e?e:e[1])]}n.r(t),n.d(t,"getImageCenter",(function(){return s}))},"./node_modules/@tensorflow/tfjs-core/dist/ops/round.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/round.js ***! + \**************************************************************/ +/*! exports provided: round */function(e,t,n){"use strict";n.r(t),n.d(t,"round",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({round_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","round")};return s.ENGINE.runKernel(o.Round,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/rsqrt.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/rsqrt.js ***! + \**************************************************************/ +/*! exports provided: rsqrt */function(e,t,n){"use strict";n.r(t),n.d(t,"rsqrt",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({rsqrt_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","rsqrt")};return s.ENGINE.runKernel(o.Rsqrt,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js": +/*!***************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js ***! + \***************************************************************/ +/*! exports provided: scalar */function(e,t,n){"use strict";n.r(t),n.d(t,"scalar",(function(){return r}));var s=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),o=n(/*! ./tensor_ops_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor_ops_util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e,t){if((Object(s.isTypedArray)(e)&&"string"!==t||Array.isArray(e))&&"complex64"!==t)throw new Error("Error creating a new Scalar: value must be a primitive (number|boolean|string)");if("string"===t&&Object(s.isTypedArray)(e)&&!(e instanceof Uint8Array))throw new Error("When making a scalar from encoded string, the value must be `Uint8Array`.");return Object(o.makeTensor)(e,[],[],t)}},"./node_modules/@tensorflow/tfjs-core/dist/ops/scatter_nd.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/scatter_nd.js ***! + \*******************************************************************/ +/*! exports provided: scatterND */function(e,t,n){"use strict";n.r(t),n.d(t,"scatterND",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),a=n(/*! ./scatter_nd_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/scatter_nd_util.js");const d=Object(i.op)({scatterND_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n){const i=Object(r.convertToTensor)(e,"indices","scatterND","int32"),d=Object(r.convertToTensor)(t,"updates","scatterND");a.validateInput(d,i,n);const u={indices:i,updates:d},l={shape:n};return s.ENGINE.runKernel(o.ScatterNd,u,l)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/scatter_nd_util.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/scatter_nd_util.js ***! + \************************************************************************/ +/*! exports provided: validateUpdateShape, validateInput, calculateShapes */function(e,t,n){"use strict";n.r(t),n.d(t,"validateUpdateShape",(function(){return o})),n.d(t,"validateInput",(function(){return r})),n.d(t,"calculateShapes",(function(){return i}));var s=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js");function o(e,t,n){const s=t.rank>1?t.shape[t.rank-1]:1,o=t.rank>1?t.rank-1:1,r=`Must have updates.shape = indices.shape[:batchDim] + shape[sliceDim:], got updates.shape: ${n.shape}, indices.shape: ${t.shape}, shape: ${e}, sliceDim: ${s}, and batchDim: ${o}.`;if(n.rank1?t.shape[o-1]:1,i=n.length;let a=1;for(let e=r;et||n===e?r=!0:n=Object(s.nearestDivisor)(e,n+1);return n}function i(e,t,n){const s=[],o=e.length;for(let r=0;ro))throw new Error(`Expect batchDims in the range of [-${o}, ${o}], but got ${s}`);if(s<0&&(s+=o),s>r)throw new Error(`batchDims (${s}) must be less than rank(x) (\n ${r}).`);if(n`Error in separableConv2d: input must be rank 4, but got rank ${h.rank}.`)),o.assert(4===p.rank,(()=>`Error in separableConv2d: depthwise filter must be rank 4, but got rank ${p.rank}.`)),o.assert(4===m.rank,(()=>`Error in separableConv2d: pointwise filter must be rank 4, but got rank ${p.rank}.`)),o.assert(1===m.shape[0],(()=>`Error in separableConv2d: the first dimension of pointwise filter must be 1, but got ${m.shape[0]}.`)),o.assert(1===m.shape[1],(()=>`Error in separableConv2d: the second dimension of pointwise filter must be 1, but got ${m.shape[1]}.`));const j=p.shape[2],g=p.shape[3];o.assert(m.shape[2]===j*g,(()=>`Error in separableConv2d: the third dimension of pointwise filter must be ${j*g}, but got ${m.shape[2]}.`));const w=Object(i.depthwiseConv2d)(h,p,a,u,c,l),_=Object(r.conv2d)(w,m,1,"valid",c);return b?Object(d.reshape)(_,[_.shape[1],_.shape[2],_.shape[3]]):_}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/setdiff1d_async.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/setdiff1d_async.js ***! + \************************************************************************/ +/*! exports provided: setdiff1dAsync */function(e,t,n){"use strict";n.r(t),n.d(t,"setdiff1dAsync",(function(){return i}));var s=n(/*! ../tensor */"./node_modules/@tensorflow/tfjs-core/dist/tensor.js"),o=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),r=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js");const i= +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +async function(e,t){const n=Object(o.convertToTensor)(e,"x","setdiff1d"),i=Object(o.convertToTensor)(t,"y","setdiff1d");r.assert(n.dtype===i.dtype,(()=>`x and y should have the same dtype, but got x (${n.dtype}) and y (${i.dtype}).`)),r.assert(1===n.rank,(()=>`x should be 1D tensor, but got x (${n.shape}).`)),r.assert(1===i.rank,(()=>`y should be 1D tensor, but got y (${i.shape}).`));const a=await n.data(),d=await i.data(),u=new Set(d);let l=0;for(let e=0;e`slice1d expects a rank-1 tensor, but got a rank-${r.rank} tensor`)),Object(i.slice)(r,[t],[n])}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/slice2d.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/slice2d.js ***! + \****************************************************************/ +/*! exports provided: slice2d */function(e,t,n){"use strict";n.r(t),n.d(t,"slice2d",(function(){return a}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),i=n(/*! ./slice */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice.js");const a=Object(r.op)({slice2d_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n){const r=Object(s.convertToTensor)(e,"x","slice2d");return o.assert(2===r.rank,(()=>`slice2d expects a rank-2 tensor, but got a rank-${r.rank} tensor`)),Object(i.slice)(r,t,n)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/slice3d.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/slice3d.js ***! + \****************************************************************/ +/*! exports provided: slice3d */function(e,t,n){"use strict";n.r(t),n.d(t,"slice3d",(function(){return a}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),i=n(/*! ./slice */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice.js");const a=Object(r.op)({slice3d_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n){const r=Object(s.convertToTensor)(e,"x","slice3d");return o.assert(3===r.rank,(()=>`slice3d expects a rank-3 tensor, but got a rank-${r.rank} tensor`)),Object(i.slice)(r,t,n)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/slice4d.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/slice4d.js ***! + \****************************************************************/ +/*! exports provided: slice4d */function(e,t,n){"use strict";n.r(t),n.d(t,"slice4d",(function(){return a}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),i=n(/*! ./slice */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice.js");const a=Object(r.op)({slice4d_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n){const r=Object(s.convertToTensor)(e,"x","slice4d");return o.assert(4===r.rank,(()=>`slice4d expects a rank-4 tensor, but got a rank-${r.rank} tensor`)),Object(i.slice)(r,t,n)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/slice_util.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/slice_util.js ***! + \*******************************************************************/ +/*! exports provided: assertParamsValid, maskToAxes, computeOutShape, stridesWithElidedDims, getNormalizedAxes, startIndicesWithElidedDims, stopIndicesWithElidedDims, stridesForAxis, startForAxis, stopForAxis, isSliceContinous, computeFlatOffset, parseSliceParams, sliceInfo */function(e,t,n){"use strict";n.r(t),n.d(t,"assertParamsValid",(function(){return o})),n.d(t,"maskToAxes",(function(){return r})),n.d(t,"computeOutShape",(function(){return i})),n.d(t,"stridesWithElidedDims",(function(){return a})),n.d(t,"getNormalizedAxes",(function(){return l})),n.d(t,"startIndicesWithElidedDims",(function(){return c})),n.d(t,"stopIndicesWithElidedDims",(function(){return f})),n.d(t,"stridesForAxis",(function(){return p})),n.d(t,"startForAxis",(function(){return m})),n.d(t,"stopForAxis",(function(){return h})),n.d(t,"isSliceContinous",(function(){return b})),n.d(t,"computeFlatOffset",(function(){return j})),n.d(t,"parseSliceParams",(function(){return g})),n.d(t,"sliceInfo",(function(){return w}));var s=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t,n){const o=e.shape.length;s.assert(o===t.length,(()=>`Error in slice${o}D: Length of begin ${t} must match the rank of the array (${o}).`)),s.assert(o===n.length,(()=>`Error in slice${o}D: Length of size ${n} must match the rank of the array (${o}).`));for(let r=0;r`Error in slice${o}D: begin[${r}] + size[${r}] (${t[r]+n[r]}) would overflow input.shape[${r}] (${e.shape[r]})`))}function r(e){const t=[];let n=0;for(;e>0;)1&e&&t.push(n),e/=2,n++;return t}function i(e,t,n){const s=[];for(let o=0;o0){const u=t[0],l=n+1;b=c(i,u,l,s,e),j=f(d,u,l,o,e),g=a(r,u,l,e)}else for(let t=0;t-1)r[o]=0;else{const i=d(t,n,o);let a=s[i];e&1<-1)i[s]=Number.MAX_SAFE_INTEGER;else{const r=d(t,n,s);let a=o[r];e&1<0?Number.MIN_SAFE_INTEGER:Number.MAX_SAFE_INTEGER);const u=o[r];return a<0&&(a+=u),a=s.clamp(0,a,u-1),a}function h(e,t,n,o,r,i){let a=t[r];const d=n[r]||1;(e&1<0?Number.MAX_SAFE_INTEGER:Number.MIN_SAFE_INTEGER);const u=o[r];return a<0&&(a+=u),a=d>0?s.clamp(0,a,u):s.clamp(-1,a,u-1),a}function b(e,t,n){let s=n.length;for(let e=0;e1){s=e;break}for(let o=s+1;o0||n[o]!==e[o])return!1;return!0}function j(e,t){let n=e.length>0?e[e.length-1]:1;for(let s=0;s{s.assert(-1!==e,(()=>"slice() does not support negative begin indexing."))})),i=null==n?new Array(r).fill(-1):"number"==typeof n?[n,...new Array(r-1).fill(-1)]:n.lengtht>=0?t:(s.assert(-1===t,(()=>`Negative size values should be exactly -1 but got ${t} for the slice() size at index ${n}.`)),e.shape[n]-o[n]))),[o,i]}function w(e,t,n,s,o,a,d,u,c){let f=t.slice(),p=n.slice(),m=s;null==s&&(m=new Array(f.length));const h=r(d);if(h.length>1)throw new Error("Multiple ellipses in slice is not allowed.");if(0!==d&&0!==u)throw new Error("Using both ellipsisMask and newAxisMask is not yet supported.");if(0!==d&&0!==c)throw new Error("Using both ellipsisMask and shrinkAxisMask is not yet supported.");const b=e.length-f.length,j=r(u),g=e.slice();j.forEach((e=>{f[e]=0,p[e]=1,g.splice(e,0,1)}));const{begin:w,end:_,strides:k}=l(g,h,b,f,p,m,o,a,d);f=w,p=_,m=k;const v=r(c);v.forEach((e=>{p[e]=f[e]+1,m[e]=1}));const x=i(f,p,m),y=x.filter(((e,t)=>-1===v.indexOf(t)));return{nonStrided:m.every((e=>1===e)),$begin:f,$end:p,$strides:m,size:x,newShape:g,outShape:y}}},"./node_modules/@tensorflow/tfjs-core/dist/ops/softmax.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/softmax.js ***! + \****************************************************************/ +/*! exports provided: softmax */function(e,t,n){"use strict";n.r(t),n.d(t,"softmax",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({softmax_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=-1){const n=Object(r.convertToTensor)(e,"logits","softmax","float32");if(-1===t&&(t=n.rank-1),t!==n.rank-1)throw Error(`Softmax along a non-last dimension is not yet supported. Logits was rank ${n.rank} and dim was ${t}`);const i={logits:n},a={dim:t};return s.ENGINE.runKernel(o.Softmax,i,a)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/softplus.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/softplus.js ***! + \*****************************************************************/ +/*! exports provided: softplus */function(e,t,n){"use strict";n.r(t),n.d(t,"softplus",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({softplus_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","softplus")};return s.ENGINE.runKernel(o.Softplus,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/space_to_batch_nd.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/space_to_batch_nd.js ***! + \**************************************************************************/ +/*! exports provided: spaceToBatchND */function(e,t,n){"use strict";n.r(t),n.d(t,"spaceToBatchND",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({spaceToBatchND_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n){const a=Object(r.convertToTensor)(e,"x","spaceToBatchND");i.assert(a.rank>=1+t.length,(()=>`input rank ${a.rank} should be > than [blockShape] ${t.length}`)),i.assert(n.length===t.length,(()=>`paddings.shape[0] ${n.length} must be equal to [blockShape] ${t.length}`)),i.assert(a.shape.reduce(((e,s,o)=>o>0&&o<=t.length?e&&(s+n[o-1][0]+n[o-1][1])%t[o-1]==0:e),!0),(()=>`input spatial dimensions ${a.shape.slice(1)} with paddings ${n.toString()} must be divisible by blockShapes ${t.toString()}`));const d={x:a},u={blockShape:t,paddings:n};return s.ENGINE.runKernel(o.SpaceToBatchND,d,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_fill_empty_rows.js": +/*!**************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_fill_empty_rows.js ***! + \**************************************************************************************/ +/*! exports provided: sparseFillEmptyRows */function(e,t,n){"use strict";n.r(t),n.d(t,"sparseFillEmptyRows",(function(){return a}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({sparseFillEmptyRows_: +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,i){const a=Object(r.convertToTensor)(e,"indices","sparseFillEmptyRows"),d=Object(r.convertToTensor)(t,"values","sparseFillEmptyRows"),u=Object(r.convertToTensor)(n,"denseShape","sparseFillEmptyRows"),l=Object(r.convertToTensor)(i,"defaultValue","sparseFillEmptyRows",d.dtype);if(2!==a.rank)throw new Error(`Indices should be Tensor2D but received shape\n ${a.shape}`);if(1!==d.rank)throw new Error(`Values should be Tensor1D but received shape ${d.shape}`);if(1!==u.rank)throw new Error(`Dense shape should be Tensor1D but received shape ${u.shape}`);if(0!==l.rank)throw new Error(`Default value should be a scalar but received shape ${l.shape}`);const c={indices:a,values:d,denseShape:u,defaultValue:l},f=s.ENGINE.runKernel(o.SparseFillEmptyRows,c);return{outputIndices:f[0],outputValues:f[1],emptyRowIndicator:f[2],reverseIndexMap:f[3]}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_reshape.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_reshape.js ***! + \******************************************************************************/ +/*! exports provided: sparseReshape */function(e,t,n){"use strict";n.r(t),n.d(t,"sparseReshape",(function(){return a}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({sparseReshape_: +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n){const i=Object(r.convertToTensor)(e,"inputIndices","sparseReshape"),a=Object(r.convertToTensor)(t,"inputShape","sparseReshape"),d=Object(r.convertToTensor)(n,"newShape","sparseReshape");if(2!==i.rank)throw new Error(`Input indices should be Tensor2D but received shape\n ${i.shape}`);if(1!==a.rank)throw new Error(`Input shape should be Tensor1D but received shape ${a.shape}`);if(1!==d.rank)throw new Error(`New shape should be Tensor1D but received shape ${d.shape}`);const u={inputIndices:i,inputShape:a,newShape:d},l=s.ENGINE.runKernel(o.SparseReshape,u);return{outputIndices:l[0],outputShape:l[1]}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_segment_mean.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_segment_mean.js ***! + \***********************************************************************************/ +/*! exports provided: sparseSegmentMean */function(e,t,n){"use strict";n.r(t),n.d(t,"sparseSegmentMean",(function(){return a}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({sparseSegmentMean_: +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n){const i=Object(r.convertToTensor)(e,"data","sparseSegmentMean"),a=Object(r.convertToTensor)(t,"indices","sparseSegmentMean"),d=Object(r.convertToTensor)(n,"segmentIds","sparseSegmentMean");if(i.rank<1)throw new Error("Data should be at least 1 dimensional but received scalar");if(1!==a.rank)throw new Error(`Indices should be Tensor1D but received shape\n ${a.shape}`);if(1!==d.rank)throw new Error(`Segment ids should be Tensor1D but received shape\n ${d.shape}`);const u={data:i,indices:a,segmentIds:d};return s.ENGINE.runKernel(o.SparseSegmentMean,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_segment_sum.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_segment_sum.js ***! + \**********************************************************************************/ +/*! exports provided: sparseSegmentSum */function(e,t,n){"use strict";n.r(t),n.d(t,"sparseSegmentSum",(function(){return a}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({sparseSegmentSum_: +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n){const i=Object(r.convertToTensor)(e,"data","sparseSegmentSum"),a=Object(r.convertToTensor)(t,"indices","sparseSegmentSum"),d=Object(r.convertToTensor)(n,"segmentIds","sparseSegmentSum");if(i.rank<1)throw new Error("Data should be at least 1 dimensional but received scalar");if(1!==a.rank)throw new Error(`Indices should be Tensor1D but received shape\n ${a.shape}`);if(1!==d.rank)throw new Error(`Segment ids should be Tensor1D but received shape\n ${d.shape}`);const u={data:i,indices:a,segmentIds:d};return s.ENGINE.runKernel(o.SparseSegmentSum,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse_to_dense.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/sparse_to_dense.js ***! + \************************************************************************/ +/*! exports provided: sparseToDense */function(e,t,n){"use strict";n.r(t),n.d(t,"sparseToDense",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../ops/sparse_to_dense_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse_to_dense_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({sparseToDense_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,a=0){const d=Object(i.convertToTensor)(e,"sparseIndices","sparseToDense","int32"),u=Object(i.convertToTensor)(t,"sparseValues","sparseToDense"),l=Object(i.convertToTensor)(a,"defaultValue","sparseToDense",u.dtype);r.validateInput(d,u,n,l);const c={sparseIndices:d,sparseValues:u,defaultValue:l},f={outputShape:n};return s.ENGINE.runKernel(o.SparseToDense,c,f)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse_to_dense_util.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/sparse_to_dense_util.js ***! + \*****************************************************************************/ +/*! exports provided: validateInput */function(e,t,n){"use strict";function s(e,t,n,s){if("int32"!==e.dtype)throw new Error(`tf.sparseToDense() expects the indices to be int32 type, but the dtype was ${e.dtype}.`);if(e.rank>2)throw new Error(`sparseIndices should be a scalar, vector, or matrix, but got shape ${e.shape}.`);const o=e.rank>0?e.shape[0]:1,r=e.rank>1?e.shape[1]:1;if(n.length!==r)throw new Error(`outputShape has incorrect number of elements:, ${n.length}, should be: ${r}.`);const i=t.size;if(0!==t.rank&&(1!==t.rank||i!==o))throw new Error(`sparseValues has incorrect shape ${t.shape}, should be [] or [${o}]`);if(t.dtype!==s.dtype)throw new Error("sparseValues.dtype must match defaultValues.dtype")}n.r(t),n.d(t,"validateInput",(function(){return s}))},"./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/fft.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/fft.js ***! + \*********************************************************************/ +/*! exports provided: fft */function(e,t,n){"use strict";n.r(t),n.d(t,"fft",(function(){return a}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),i=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({fft_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){Object(r.assert)("complex64"===e.dtype,(()=>`The dtype for tf.spectral.fft() must be complex64 but got ${e.dtype}.`));const t={input:e};return s.ENGINE.runKernel(o.FFT,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/ifft.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/ifft.js ***! + \**********************************************************************/ +/*! exports provided: ifft */function(e,t,n){"use strict";n.r(t),n.d(t,"ifft",(function(){return a}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),i=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({ifft_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){Object(r.assert)("complex64"===e.dtype,(()=>`The dtype for tf.spectral.ifft() must be complex64 but got ${e.dtype}.`));const t={input:e};return s.ENGINE.runKernel(o.IFFT,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/irfft.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/irfft.js ***! + \***********************************************************************/ +/*! exports provided: irfft */function(e,t,n){"use strict";n.r(t),n.d(t,"irfft",(function(){return m}));var s=n(/*! ../complex */"./node_modules/@tensorflow/tfjs-core/dist/ops/complex.js"),o=n(/*! ../concat */"./node_modules/@tensorflow/tfjs-core/dist/ops/concat.js"),r=n(/*! ../imag */"./node_modules/@tensorflow/tfjs-core/dist/ops/imag.js"),i=n(/*! ../mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),d=n(/*! ../real */"./node_modules/@tensorflow/tfjs-core/dist/ops/real.js"),u=n(/*! ../reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),l=n(/*! ../reverse */"./node_modules/@tensorflow/tfjs-core/dist/ops/reverse.js"),c=n(/*! ../scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),f=n(/*! ../slice */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice.js"),p=n(/*! ./ifft */"./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/ifft.js");const m=Object(a.op)({irfft_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t=e.shape[e.shape.length-1],n=e.size/t;let a;if(t<=2){const s=Object(u.reshape)(e,[n,t]);a=Object(p.ifft)(s)}else{const m=[n,2*(t-1)],h=Object(u.reshape)(Object(d.real)(e),[n,t]),b=Object(u.reshape)(Object(r.imag)(e),[n,t]),j=Object(l.reverse)(Object(f.slice)(h,[0,1],[n,t-2]),1),g=Object(i.mul)(Object(l.reverse)(Object(f.slice)(b,[0,1],[n,t-2]),1),Object(c.scalar)(-1)),w=Object(o.concat)([h,j],1),_=Object(o.concat)([b,g],1),k=Object(u.reshape)(Object(s.complex)(w,_),[m[0],m[1]]);a=Object(p.ifft)(k)}if(a=Object(d.real)(a),3===e.rank&&0!==e.shape[0]){const t=a,n=e.shape[0];a=Object(u.reshape)(a,[n,a.shape[0]/n,a.shape[1]]),t.dispose()}return a}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/rfft.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/rfft.js ***! + \**********************************************************************/ +/*! exports provided: rfft */function(e,t,n){"use strict";n.r(t),n.d(t,"rfft",(function(){return h}));var s=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),o=n(/*! ../complex */"./node_modules/@tensorflow/tfjs-core/dist/ops/complex.js"),r=n(/*! ../concat */"./node_modules/@tensorflow/tfjs-core/dist/ops/concat.js"),i=n(/*! ../imag */"./node_modules/@tensorflow/tfjs-core/dist/ops/imag.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),d=n(/*! ../real */"./node_modules/@tensorflow/tfjs-core/dist/ops/real.js"),u=n(/*! ../reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),l=n(/*! ../slice */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice.js"),c=n(/*! ../split */"./node_modules/@tensorflow/tfjs-core/dist/ops/split.js"),f=n(/*! ../zeros */"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros.js"),p=n(/*! ../zeros_like */"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js"),m=n(/*! ./fft */"./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/fft.js");const h=Object(a.op)({rfft_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){Object(s.assert)("float32"===e.dtype,(()=>`The dtype for rfft() must be real value but got ${e.dtype}`));let n=e.shape[e.shape.length-1];const a=e.size/n;let h;if(null!=t&&t0)),o=e.shape.map((e=>e));o[e.shape.length-1]=t,h=Object(l.slice)(e,s,o),n=t}else if(null!=t&&t>n){const s=e.shape.map((e=>e));s[e.shape.length-1]=t-n,h=Object(r.concat)([e,Object(f.zeros)(s)],e.shape.length-1),n=t}else h=e;const b=Object(p.zerosLike)(h),j=Object(u.reshape)(Object(o.complex)(h,b),[a,n]),g=Object(m.fft)(j),w=Math.floor(n/2)+1,_=Object(d.real)(g),k=Object(i.imag)(g),v=Object(c.split)(_,[w,n-w],_.shape.length-1),x=Object(c.split)(k,[w,n-w],k.shape.length-1),y=h.shape.slice();return y[h.shape.length-1]=w,Object(u.reshape)(Object(o.complex)(v[0],x[0]),y)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/split.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/split.js ***! + \**************************************************************/ +/*! exports provided: split */function(e,t,n){"use strict";n.r(t),n.d(t,"split",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({split_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n=0){const i={x:Object(r.convertToTensor)(e,"x","split")},a={numOrSizeSplits:t,axis:n};return s.ENGINE.runKernel(o.SplitV,i,a)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/split_util.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/split_util.js ***! + \*******************************************************************/ +/*! exports provided: prepareSplitSize */function(e,t,n){"use strict";n.r(t),n.d(t,"prepareSplitSize",(function(){return o}));var s=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js");function o(e,t,n=0){let o=[];if("number"==typeof t)Object(s.assert)(e.shape[n]%t==0,(()=>"Number of splits must evenly divide the axis.")),o=new Array(t).fill(e.shape[n]/t);else{const r=t.reduce(((e,t)=>(-1===t&&(e+=1),e)),0);Object(s.assert)(r<=1,(()=>"There should be only one negative value in split array."));const i=t.indexOf(-1);if(-1!==i){const s=t.reduce(((e,t)=>t>0?e+t:e));t[i]=e.shape[n]-s}Object(s.assert)(e.shape[n]===t.reduce(((e,t)=>e+t)),(()=>"The sum of sizes must match the size of the axis dimension.")),o=t}return o}},"./node_modules/@tensorflow/tfjs-core/dist/ops/sqrt.js": +/*!*************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/sqrt.js ***! + \*************************************************************/ +/*! exports provided: sqrt */function(e,t,n){"use strict";n.r(t),n.d(t,"sqrt",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({sqrt_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","sqrt")};return s.ENGINE.runKernel(o.Sqrt,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/square.js": +/*!***************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/square.js ***! + \***************************************************************/ +/*! exports provided: square */function(e,t,n){"use strict";n.r(t),n.d(t,"square",(function(){return i}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),r=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const i=Object(r.op)({square_: +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t=Object(o.convertToTensor)(e,"x","square");return s.ENGINE.runKernel("Square",{x:t},{})}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/squared_difference.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/squared_difference.js ***! + \***************************************************************************/ +/*! exports provided: squaredDifference */function(e,t,n){"use strict";n.r(t),n.d(t,"squaredDifference",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(d.op)({squaredDifference_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){let n=Object(i.convertToTensor)(e,"a","squaredDifference"),d=Object(i.convertToTensor)(t,"b","squaredDifference");[n,d]=Object(r.makeTypesMatch)(n,d),Object(a.assertAndGetBroadcastShape)(n.shape,d.shape);const u={a:n,b:d};return s.ENGINE.runKernel(o.SquaredDifference,u,{})}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/squeeze.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/squeeze.js ***! + \****************************************************************/ +/*! exports provided: squeeze */function(e,t,n){"use strict";n.r(t),n.d(t,"squeeze",(function(){return a}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),i=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const a=Object(r.op)({squeeze_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){const n=Object(s.convertToTensor)(e,"x","squeeze");return Object(i.reshape)(n,Object(o.squeezeShape)(n.shape,t).newShape)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/stack.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/stack.js ***! + \**************************************************************/ +/*! exports provided: stack */function(e,t,n){"use strict";n.r(t),n.d(t,"stack",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({stack_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=0){const n=Object(r.convertToTensorArray)(e,"tensors","stack","string_or_numeric");i.assert(n.length>=1,(()=>"Pass at least one tensor to tf.stack")),n.length>0&&i.assert(t<=n[0].rank,(()=>"Axis must be <= rank of the tensor"));const a=n,d={axis:t};return s.ENGINE.runKernel(o.Pack,a,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/step.js": +/*!*************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/step.js ***! + \*************************************************************/ +/*! exports provided: step */function(e,t,n){"use strict";n.r(t),n.d(t,"step",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({step_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=0){const n={x:Object(r.convertToTensor)(e,"x","step")},i={alpha:t};return s.ENGINE.runKernel(o.Step,n,i)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/strided_slice.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/strided_slice.js ***! + \**********************************************************************/ +/*! exports provided: stridedSlice */function(e,t,n){"use strict";n.r(t),n.d(t,"stridedSlice",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({stridedSlice_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,i,a=0,d=0,u=0,l=0,c=0){const f={x:Object(r.convertToTensor)(e,"x","stridedSlice","string_or_numeric")},p={begin:t,end:n,strides:i,beginMask:a,endMask:d,ellipsisMask:u,newAxisMask:l,shrinkAxisMask:c};return s.ENGINE.runKernel(o.StridedSlice,f,p)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/string/string_n_grams.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/string/string_n_grams.js ***! + \******************************************************************************/ +/*! exports provided: stringNGrams */function(e,t,n){"use strict";n.r(t),n.d(t,"stringNGrams",(function(){return a}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({stringNGrams_: +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,i,a,d,u,l){const c=Object(r.convertToTensor)(e,"data","stringNGrams","string");if("string"!==c.dtype)throw new Error("Data must be of datatype string");if(1!==c.shape.length)throw new Error(`Data must be a vector, saw: ${c.shape}`);const f=Object(r.convertToTensor)(t,"dataSplits","stringNGrams");if("int32"!==f.dtype)throw new Error("Data splits must be of datatype int32");const p={separator:n,nGramWidths:i,leftPad:a,rightPad:d,padWidth:u,preserveShortSequences:l},m={data:c,dataSplits:f},h=s.ENGINE.runKernel(o.StringNGrams,m,p);return{nGrams:h[0],nGramsSplits:h[1]}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/string/string_split.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/string/string_split.js ***! + \****************************************************************************/ +/*! exports provided: stringSplit */function(e,t,n){"use strict";n.r(t),n.d(t,"stringSplit",(function(){return a}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({stringSplit_: +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n=!0){const i=Object(r.convertToTensor)(e,"input","stringSplit","string"),a=Object(r.convertToTensor)(t,"delimiter","stringSplit","string");if(1!==i.rank)throw new Error(`Input should be Tensor1D but received shape ${i.shape}`);if(0!==a.rank)throw new Error(`Delimiter should be a scalar but received shape ${a.shape}`);const d={skipEmpty:n},u={input:i,delimiter:a},l=s.ENGINE.runKernel(o.StringSplit,u,d);return{indices:l[0],values:l[1],shape:l[2]}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/string/string_to_hash_bucket_fast.js": +/*!******************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/string/string_to_hash_bucket_fast.js ***! + \******************************************************************************************/ +/*! exports provided: stringToHashBucketFast */function(e,t,n){"use strict";n.r(t),n.d(t,"stringToHashBucketFast",(function(){return a}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({stringToHashBucketFast_: +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){const n=Object(r.convertToTensor)(e,"input","stringToHashBucketFast","string"),i={numBuckets:t};if(t<=0)throw new Error("Number of buckets must be at least 1");const a={input:n};return s.ENGINE.runKernel(o.StringToHashBucketFast,a,i)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js ***! + \************************************************************/ +/*! exports provided: sub */function(e,t,n){"use strict";n.r(t),n.d(t,"sub",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({sub_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){let n=Object(i.convertToTensor)(e,"a","sub"),a=Object(i.convertToTensor)(t,"b","sub");[n,a]=Object(r.makeTypesMatch)(n,a);const d={a:n,b:a};return s.ENGINE.runKernel(o.Sub,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js ***! + \************************************************************/ +/*! exports provided: sum */function(e,t,n){"use strict";n.r(t),n.d(t,"sum",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({sum_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=null,n=!1){let a=Object(r.convertToTensor)(e,"x","sum");"bool"===a.dtype&&(a=Object(i.cast)(a,"int32"));const d={x:a},u={axis:t,keepDims:n};return s.ENGINE.runKernel(o.Sum,d,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/tan.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/tan.js ***! + \************************************************************/ +/*! exports provided: tan */function(e,t,n){"use strict";n.r(t),n.d(t,"tan",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({tan_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","tan")};return s.ENGINE.runKernel(o.Tan,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/tanh.js": +/*!*************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/tanh.js ***! + \*************************************************************/ +/*! exports provided: tanh */function(e,t,n){"use strict";n.r(t),n.d(t,"tanh",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({tanh_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","tanh")};return s.ENGINE.runKernel(o.Tanh,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor.js": +/*!***************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/tensor.js ***! + \***************************************************************/ +/*! exports provided: tensor */function(e,t,n){"use strict";n.r(t),n.d(t,"tensor",(function(){return r}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ./tensor_ops_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor_ops_util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e,t,n){const r=Object(s.inferShape)(e,n);return Object(o.makeTensor)(e,t,r,n)}},"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor1d.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/tensor1d.js ***! + \*****************************************************************/ +/*! exports provided: tensor1d */function(e,t,n){"use strict";n.r(t),n.d(t,"tensor1d",(function(){return i}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./tensor_ops_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor_ops_util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e,t){Object(o.assertNonNull)(e);const n=Object(s.inferShape)(e,t);if(1!==n.length)throw new Error("tensor1d() requires values to be a flat/TypedArray");return Object(r.makeTensor)(e,null,n,t)}},"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor2d.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/tensor2d.js ***! + \*****************************************************************/ +/*! exports provided: tensor2d */function(e,t,n){"use strict";n.r(t),n.d(t,"tensor2d",(function(){return i}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./tensor_ops_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor_ops_util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e,t,n){if(Object(o.assertNonNull)(e),null!=t&&2!==t.length)throw new Error("tensor2d() requires shape to have two numbers");const i=Object(s.inferShape)(e,n);if(2!==i.length&&1!==i.length)throw new Error("tensor2d() requires values to be number[][] or flat/TypedArray");if(1===i.length&&null==t)throw new Error("tensor2d() requires shape to be provided when `values` are a flat/TypedArray");return Object(r.makeTensor)(e,t,i,n)}},"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor3d.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/tensor3d.js ***! + \*****************************************************************/ +/*! exports provided: tensor3d */function(e,t,n){"use strict";n.r(t),n.d(t,"tensor3d",(function(){return i}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./tensor_ops_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor_ops_util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e,t,n){if(Object(o.assertNonNull)(e),null!=t&&3!==t.length)throw new Error("tensor3d() requires shape to have three numbers");const i=Object(s.inferShape)(e,n);if(3!==i.length&&1!==i.length)throw new Error("tensor3d() requires values to be number[][][] or flat/TypedArray");if(1===i.length&&null==t)throw new Error("tensor3d() requires shape to be provided when `values` are a flat array");return Object(r.makeTensor)(e,t,i,n)}},"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor4d.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/tensor4d.js ***! + \*****************************************************************/ +/*! exports provided: tensor4d */function(e,t,n){"use strict";n.r(t),n.d(t,"tensor4d",(function(){return i}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./tensor_ops_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor_ops_util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e,t,n){if(Object(o.assertNonNull)(e),null!=t&&4!==t.length)throw new Error("tensor4d() requires shape to have four numbers");const i=Object(s.inferShape)(e,n);if(4!==i.length&&1!==i.length)throw new Error("tensor4d() requires values to be number[][][][] or flat/TypedArray");if(1===i.length&&null==t)throw new Error("tensor4d() requires shape to be provided when `values` are a flat array");return Object(r.makeTensor)(e,t,i,n)}},"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor5d.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/tensor5d.js ***! + \*****************************************************************/ +/*! exports provided: tensor5d */function(e,t,n){"use strict";n.r(t),n.d(t,"tensor5d",(function(){return i}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./tensor_ops_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor_ops_util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e,t,n){if(Object(o.assertNonNull)(e),null!=t&&5!==t.length)throw new Error("tensor5d() requires shape to have five numbers");const i=Object(s.inferShape)(e,n);if(5!==i.length&&1!==i.length)throw new Error("tensor5d() requires values to be number[][][][][] or flat/TypedArray");if(1===i.length&&null==t)throw new Error("tensor5d() requires shape to be provided when `values` are a flat array");return Object(r.makeTensor)(e,t,i,n)}},"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor6d.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/tensor6d.js ***! + \*****************************************************************/ +/*! exports provided: tensor6d */function(e,t,n){"use strict";n.r(t),n.d(t,"tensor6d",(function(){return i}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./tensor_ops_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor_ops_util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e,t,n){if(Object(o.assertNonNull)(e),null!=t&&6!==t.length)throw new Error("tensor6d() requires shape to have six numbers");const i=Object(s.inferShape)(e,n);if(6!==i.length&&1!==i.length)throw new Error("tensor6d() requires values to be number[][][][][][] or flat/TypedArray");if(1===i.length&&null==t)throw new Error("tensor6d() requires shape to be provided when `values` are a flat array");return t=t||i,Object(r.makeTensor)(e,t,i,n)}},"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor_ops_util.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/tensor_ops_util.js ***! + \************************************************************************/ +/*! exports provided: makeTensor */function(e,t,n){"use strict";n.r(t),n.d(t,"makeTensor",(function(){return r}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e,t,n,r){if(null==r&&(r=Object(o.inferDtype)(e)),"complex64"===r)throw new Error("Cannot construct a complex64 tensor directly. Please use tf.complex(real, imag).");if(!Object(o.isTypedArray)(e)&&!Array.isArray(e)&&"number"!=typeof e&&"boolean"!=typeof e&&"string"!=typeof e)throw new Error("values passed to tensor(values) must be a number/boolean/string or an array of numbers/booleans/strings, or a TypedArray");if(null!=t){Object(o.assertNonNegativeIntegerDimensions)(t);const e=Object(o.sizeFromShape)(t),s=Object(o.sizeFromShape)(n);Object(o.assert)(e===s,(()=>`Based on the provided shape, [${t}], the tensor should have ${e} values but has ${s}`));for(let e=0;e`Error creating a new Tensor. Inferred shape (${n}) does not match the provided shape (${t}). `))}}return Object(o.isTypedArray)(e)||Array.isArray(e)||(e=[e]),t=t||n,e="string"!==r?Object(o.toTypedArray)(e,r):Object(o.flatten)(e,[],!0),s.ENGINE.makeTensor(e,t,r)}},"./node_modules/@tensorflow/tfjs-core/dist/ops/tile.js": +/*!*************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/tile.js ***! + \*************************************************************/ +/*! exports provided: tile */function(e,t,n){"use strict";n.r(t),n.d(t,"tile",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({tile_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){const n=Object(r.convertToTensor)(e,"x","tile","string_or_numeric");i.assert(n.rank===t.length,(()=>`Error in transpose: rank of input ${n.rank} must match length of reps ${t}.`));const a={x:n},d={reps:t};return s.ENGINE.runKernel(o.Tile,a,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/topk.js": +/*!*************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/topk.js ***! + \*************************************************************/ +/*! exports provided: topk */function(e,t,n){"use strict";n.r(t),n.d(t,"topk",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({topk_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=1,n=!0){const i=Object(r.convertToTensor)(e,"x","topk");if(0===i.rank)throw new Error("topk() expects the input to be of rank 1 or higher");const a=i.shape[i.shape.length-1];if(t<0)throw new Error(`'k' passed to topk() must be >= 0 but got ${t}`);if(t>a)throw new Error(`'k' passed to topk() must be <= the last dimension (${a}) but got ${t}`);const d={x:i},u={k:t,sorted:n},[l,c]=s.ENGINE.runKernel(o.TopK,d,u);return{values:l,indices:c}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/transpose.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/transpose.js ***! + \******************************************************************/ +/*! exports provided: transpose */function(e,t,n){"use strict";n.r(t),n.d(t,"transpose",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({transpose_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){const n=Object(r.convertToTensor)(e,"x","transpose");if(null==t&&(t=n.shape.map(((e,t)=>t)).reverse()),i.assert(n.rank===t.length,(()=>`Error in transpose: rank of input ${n.rank} must match length of perm ${t}.`)),t.forEach((e=>{i.assert(e>=0&&e"All entries in 'perm' must be between 0 and "+(n.rank-1)+` but got ${t}`))})),n.rank<=1)return n.clone();const a={x:n},d={perm:t};return s.ENGINE.runKernel(o.Transpose,a,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/truncated_normal.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/truncated_normal.js ***! + \*************************************************************************/ +/*! exports provided: truncatedNormal */function(e,t,n){"use strict";n.r(t),n.d(t,"truncatedNormal",(function(){return i}));var s=n(/*! ./buffer */"./node_modules/@tensorflow/tfjs-core/dist/ops/buffer.js"),o=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),r=n(/*! ./rand_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/rand_util.js");const i=Object(o.op)({truncatedNormal_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=0,n=1,o,i){if(null!=o&&"bool"===o)throw new Error("Unsupported data type $ { dtype }");const a=new r.MPRandGauss(t,n,o,!0,i),d=Object(s.buffer)(e,o);for(let e=0;e0,(()=>"The input tensor must be at least 1D"));const a={x:n},d={axis:t},[u,l]=s.ENGINE.runKernel(o.Unique,a,d);return{values:u,indices:l}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/unsorted_segment_sum.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/unsorted_segment_sum.js ***! + \*****************************************************************************/ +/*! exports provided: unsortedSegmentSum */function(e,t,n){"use strict";n.r(t),n.d(t,"unsortedSegmentSum",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({unsortedSegmentSum_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n){const a=Object(r.convertToTensor)(e,"x","unsortedSegmentSum"),d=Object(r.convertToTensor)(t,"segmentIds","unsortedSegmentSum","int32");Object(i.assert)(Object(i.isInt)(n),(()=>"numSegments must be of dtype int"));const u={x:a,segmentIds:d},l={numSegments:n};return s.ENGINE.runKernel(o.UnsortedSegmentSum,u,l)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/unstack.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/unstack.js ***! + \****************************************************************/ +/*! exports provided: unstack */function(e,t,n){"use strict";n.r(t),n.d(t,"unstack",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({unstack_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=0){const n=Object(r.convertToTensor)(e,"x","unstack","string_or_numeric");i.assert(t>=-n.shape.length&&t`Axis = ${t} is not in [-${n.shape.length}, ${n.shape.length})`));const a={value:n},d={axis:t};return s.ENGINE.runKernel(o.Unpack,a,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/variable.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/variable.js ***! + \*****************************************************************/ +/*! exports provided: variable */function(e,t,n){"use strict";n.r(t),n.d(t,"variable",(function(){return o}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t=!0,n,o){return s.ENGINE.makeVariable(e,t,n,o)}},"./node_modules/@tensorflow/tfjs-core/dist/ops/where.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/where.js ***! + \**************************************************************/ +/*! exports provided: where */function(e,t,n){"use strict";n.r(t),n.d(t,"where",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./broadcast_to */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_to.js"),a=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(d.op)({where_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n){const d=Object(r.convertToTensor)(t,"a","where"),u=Object(r.convertToTensor)(n,"b","where"),l=Object(r.convertToTensor)(e,"condition","where","bool"),c=Object(a.assertAndGetBroadcastShape)(Object(a.assertAndGetBroadcastShape)(l.shape,d.shape),u.shape),f={condition:Object(i.broadcastTo)(l,c),t:Object(i.broadcastTo)(d,c),e:Object(i.broadcastTo)(u,c)};return s.ENGINE.runKernel(o.Select,f)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/where_async.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/where_async.js ***! + \********************************************************************/ +/*! exports provided: whereAsync */function(e,t,n){"use strict";n.r(t),n.d(t,"whereAsync",(function(){return r}));var s=n(/*! ../backends/where_impl */"./node_modules/@tensorflow/tfjs-core/dist/backends/where_impl.js"),o=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js");const r= +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +async function(e){const t=Object(o.convertToTensor)(e,"condition","whereAsync","bool"),n=await t.data(),r=Object(s.whereImpl)(t.shape,n);return e!==t&&t.dispose(),r}},"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/zeros.js ***! + \**************************************************************/ +/*! exports provided: zeros */function(e,t,n){"use strict";n.r(t),n.d(t,"zeros",(function(){return i}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./complex */"./node_modules/@tensorflow/tfjs-core/dist/ops/complex.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e,t="float32"){if("complex64"===t){const t=i(e,"float32"),n=i(e,"float32");return Object(r.complex)(t,n)}const n=Object(o.makeZerosTypedArray)(Object(o.sizeFromShape)(e),t);return s.ENGINE.makeTensor(n,e,t)}},"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js ***! + \*******************************************************************/ +/*! exports provided: zerosLike */function(e,t,n){"use strict";n.r(t),n.d(t,"zerosLike",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({zerosLike_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","zerosLike")};return s.ENGINE.runKernel(o.ZerosLike,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/optimizers/adadelta_optimizer.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/optimizers/adadelta_optimizer.js ***! + \**********************************************************************************/ +/*! exports provided: AdadeltaOptimizer */function(e,t,n){"use strict";n.r(t),n.d(t,"AdadeltaOptimizer",(function(){return p}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../globals */"./node_modules/@tensorflow/tfjs-core/dist/globals.js"),r=n(/*! ../ops/add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),i=n(/*! ../ops/div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),a=n(/*! ../ops/mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),d=n(/*! ../ops/ops */"./node_modules/@tensorflow/tfjs-core/dist/ops/ops.js"),u=n(/*! ../ops/square */"./node_modules/@tensorflow/tfjs-core/dist/ops/square.js"),l=n(/*! ../ops/zeros_like */"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js"),c=n(/*! ../serialization */"./node_modules/@tensorflow/tfjs-core/dist/serialization.js"),f=n(/*! ./optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class p extends f.Optimizer{constructor(e,t,n=null){super(),this.learningRate=e,this.rho=t,this.epsilon=n,this.accumulatedGrads=[],this.accumulatedUpdates=[],null==n&&(this.epsilon=s.ENGINE.backend.epsilon())}applyGradients(e){(Array.isArray(e)?e.map((e=>e.name)):Object.keys(e)).forEach(((t,n)=>{const c=s.ENGINE.registeredVariables[t];null==this.accumulatedGrads[n]&&(this.accumulatedGrads[n]={originalName:`${t}/accum_grad`,variable:Object(o.tidy)((()=>Object(l.zerosLike)(c).variable(false)))}),null==this.accumulatedUpdates[n]&&(this.accumulatedUpdates[n]={originalName:`${t}/accum_var`,variable:Object(o.tidy)((()=>Object(l.zerosLike)(c).variable(false)))});const f=Array.isArray(e)?e[n].tensor:e[t];if(null==f)return;const p=this.accumulatedGrads[n].variable,m=this.accumulatedUpdates[n].variable;Object(o.tidy)((()=>{const e=Object(r.add)(Object(a.mul)(p,this.rho),Object(a.mul)(Object(u.square)(f),1-this.rho)),t=Object(a.mul)(Object(i.div)(Object(d.sqrt)(Object(r.add)(m,this.epsilon)),Object(d.sqrt)(Object(r.add)(p,this.epsilon))),f),n=Object(r.add)(Object(a.mul)(m,this.rho),Object(a.mul)(Object(u.square)(t),1-this.rho));p.assign(e),m.assign(n);const s=Object(r.add)(Object(a.mul)(t,-this.learningRate),c);c.assign(s)}))})),this.incrementIterations()}dispose(){null!=this.accumulatedUpdates&&(Object(o.dispose)(this.accumulatedGrads.map((e=>e.variable))),Object(o.dispose)(this.accumulatedUpdates.map((e=>e.variable))))}async getWeights(){const e=[...this.accumulatedGrads,...this.accumulatedUpdates];return[await this.saveIterations()].concat(e.map((e=>({name:e.originalName,tensor:e.variable}))))}async setWeights(e){const t=(e=await this.extractIterations(e)).length/2;this.accumulatedGrads=e.slice(0,t).map((e=>({originalName:e.name,variable:e.tensor.variable(false)}))),this.accumulatedUpdates=e.slice(t,2*t).map((e=>({originalName:e.name,variable:e.tensor.variable(false)})))}getConfig(){return{learningRate:this.learningRate,rho:this.rho,epsilon:this.epsilon}}static fromConfig(e,t){return new e(t.learningRate,t.rho,t.epsilon)}}p.className="Adadelta",Object(c.registerClass)(p)},"./node_modules/@tensorflow/tfjs-core/dist/optimizers/adagrad_optimizer.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/optimizers/adagrad_optimizer.js ***! + \*********************************************************************************/ +/*! exports provided: AdagradOptimizer */function(e,t,n){"use strict";n.r(t),n.d(t,"AdagradOptimizer",(function(){return p}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../globals */"./node_modules/@tensorflow/tfjs-core/dist/globals.js"),r=n(/*! ../ops/add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),i=n(/*! ../ops/div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),a=n(/*! ../ops/fill */"./node_modules/@tensorflow/tfjs-core/dist/ops/fill.js"),d=n(/*! ../ops/mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),u=n(/*! ../ops/sqrt */"./node_modules/@tensorflow/tfjs-core/dist/ops/sqrt.js"),l=n(/*! ../ops/square */"./node_modules/@tensorflow/tfjs-core/dist/ops/square.js"),c=n(/*! ../serialization */"./node_modules/@tensorflow/tfjs-core/dist/serialization.js"),f=n(/*! ./optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class p extends f.Optimizer{constructor(e,t=.1){super(),this.learningRate=e,this.initialAccumulatorValue=t,this.accumulatedGrads=[]}applyGradients(e){(Array.isArray(e)?e.map((e=>e.name)):Object.keys(e)).forEach(((t,n)=>{const c=s.ENGINE.registeredVariables[t];if(null==this.accumulatedGrads[n]){const e=!1;this.accumulatedGrads[n]={originalName:`${t}/accumulator`,variable:Object(o.tidy)((()=>Object(a.fill)(c.shape,this.initialAccumulatorValue).variable(e)))}}const f=Array.isArray(e)?e[n].tensor:e[t];if(null==f)return;const p=this.accumulatedGrads[n].variable;Object(o.tidy)((()=>{const e=Object(r.add)(p,Object(l.square)(f));p.assign(e);const t=Object(r.add)(Object(d.mul)(Object(i.div)(f,Object(u.sqrt)(Object(r.add)(e,s.ENGINE.backend.epsilon()))),-this.learningRate),c);c.assign(t)}))})),this.incrementIterations()}dispose(){null!=this.accumulatedGrads&&Object(o.dispose)(this.accumulatedGrads.map((e=>e.variable)))}async getWeights(){return[await this.saveIterations()].concat(this.accumulatedGrads.map((e=>({name:e.originalName,tensor:e.variable}))))}async setWeights(e){e=await this.extractIterations(e);this.accumulatedGrads=e.map((e=>({originalName:e.name,variable:e.tensor.variable(false)})))}getConfig(){return{learningRate:this.learningRate,initialAccumulatorValue:this.initialAccumulatorValue}}static fromConfig(e,t){return new e(t.learningRate,t.initialAccumulatorValue)}}p.className="Adagrad",Object(c.registerClass)(p)},"./node_modules/@tensorflow/tfjs-core/dist/optimizers/adam_optimizer.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/optimizers/adam_optimizer.js ***! + \******************************************************************************/ +/*! exports provided: AdamOptimizer */function(e,t,n){"use strict";n.r(t),n.d(t,"AdamOptimizer",(function(){return b}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../globals */"./node_modules/@tensorflow/tfjs-core/dist/globals.js"),r=n(/*! ../ops/add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),i=n(/*! ../ops/div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),a=n(/*! ../ops/mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),d=n(/*! ../ops/pow */"./node_modules/@tensorflow/tfjs-core/dist/ops/pow.js"),u=n(/*! ../ops/scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),l=n(/*! ../ops/sqrt */"./node_modules/@tensorflow/tfjs-core/dist/ops/sqrt.js"),c=n(/*! ../ops/square */"./node_modules/@tensorflow/tfjs-core/dist/ops/square.js"),f=n(/*! ../ops/sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),p=n(/*! ../ops/zeros_like */"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js"),m=n(/*! ../serialization */"./node_modules/@tensorflow/tfjs-core/dist/serialization.js"),h=n(/*! ./optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class b extends h.Optimizer{constructor(e,t,n,r=null){super(),this.learningRate=e,this.beta1=t,this.beta2=n,this.epsilon=r,this.accumulatedFirstMoment=[],this.accumulatedSecondMoment=[],Object(o.tidy)((()=>{this.accBeta1=Object(u.scalar)(t).variable(),this.accBeta2=Object(u.scalar)(n).variable()})),null==r&&(this.epsilon=s.ENGINE.backend.epsilon())}applyGradients(e){const t=Array.isArray(e)?e.map((e=>e.name)):Object.keys(e);Object(o.tidy)((()=>{const n=Object(f.sub)(1,this.accBeta1),d=Object(f.sub)(1,this.accBeta2);t.forEach(((t,u)=>{const f=s.ENGINE.registeredVariables[t];null==this.accumulatedFirstMoment[u]&&(this.accumulatedFirstMoment[u]={originalName:`${t}/m`,variable:Object(o.tidy)((()=>Object(p.zerosLike)(f).variable(false)))}),null==this.accumulatedSecondMoment[u]&&(this.accumulatedSecondMoment[u]={originalName:`${t}/v`,variable:Object(o.tidy)((()=>Object(p.zerosLike)(f).variable(false)))});const m=Array.isArray(e)?e[u].tensor:e[t];if(null==m)return;const h=this.accumulatedFirstMoment[u].variable,b=this.accumulatedSecondMoment[u].variable,j=Object(r.add)(Object(a.mul)(h,this.beta1),Object(a.mul)(m,1-this.beta1)),g=Object(r.add)(Object(a.mul)(b,this.beta2),Object(a.mul)(Object(c.square)(m),1-this.beta2)),w=Object(i.div)(j,n),_=Object(i.div)(g,d);h.assign(j),b.assign(g);const k=Object(r.add)(Object(a.mul)(Object(i.div)(w,Object(r.add)(Object(l.sqrt)(_),this.epsilon)),-this.learningRate),f);f.assign(k)})),this.accBeta1.assign(Object(a.mul)(this.accBeta1,this.beta1)),this.accBeta2.assign(Object(a.mul)(this.accBeta2,this.beta2))})),this.incrementIterations()}dispose(){this.accBeta1.dispose(),this.accBeta2.dispose(),null!=this.accumulatedFirstMoment&&Object(o.dispose)(this.accumulatedFirstMoment.map((e=>e.variable))),null!=this.accumulatedSecondMoment&&Object(o.dispose)(this.accumulatedSecondMoment.map((e=>e.variable)))}async getWeights(){const e=[...this.accumulatedFirstMoment,...this.accumulatedSecondMoment];return[await this.saveIterations()].concat(e.map((e=>({name:e.originalName,tensor:e.variable}))))}async setWeights(e){e=await this.extractIterations(e),Object(o.tidy)((()=>{this.accBeta1.assign(Object(d.pow)(this.beta1,this.iterations_+1)),this.accBeta2.assign(Object(d.pow)(this.beta2,this.iterations_+1))}));const t=e.length/2;this.accumulatedFirstMoment=e.slice(0,t).map((e=>({originalName:e.name,variable:e.tensor.variable(false)}))),this.accumulatedSecondMoment=e.slice(t,2*t).map((e=>({originalName:e.name,variable:e.tensor.variable(false)})))}getConfig(){return{learningRate:this.learningRate,beta1:this.beta1,beta2:this.beta2,epsilon:this.epsilon}}static fromConfig(e,t){return new e(t.learningRate,t.beta1,t.beta2,t.epsilon)}}b.className="Adam",Object(m.registerClass)(b)},"./node_modules/@tensorflow/tfjs-core/dist/optimizers/adamax_optimizer.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/optimizers/adamax_optimizer.js ***! + \********************************************************************************/ +/*! exports provided: AdamaxOptimizer */function(e,t,n){"use strict";n.r(t),n.d(t,"AdamaxOptimizer",(function(){return h}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../globals */"./node_modules/@tensorflow/tfjs-core/dist/globals.js"),r=n(/*! ../ops/abs */"./node_modules/@tensorflow/tfjs-core/dist/ops/abs.js"),i=n(/*! ../ops/add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),a=n(/*! ../ops/div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),d=n(/*! ../ops/maximum */"./node_modules/@tensorflow/tfjs-core/dist/ops/maximum.js"),u=n(/*! ../ops/mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),l=n(/*! ../ops/scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),c=n(/*! ../ops/sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),f=n(/*! ../ops/zeros_like */"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js"),p=n(/*! ../serialization */"./node_modules/@tensorflow/tfjs-core/dist/serialization.js"),m=n(/*! ./optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class h extends m.Optimizer{constructor(e,t,n,r=null,i=0){super(),this.learningRate=e,this.beta1=t,this.beta2=n,this.epsilon=r,this.decay=i,this.accumulatedFirstMoment=[],this.accumulatedWeightedInfNorm=[],Object(o.tidy)((()=>{this.iteration=Object(l.scalar)(0).variable(),this.accBeta1=Object(l.scalar)(t).variable()})),null==r&&(this.epsilon=s.ENGINE.backend.epsilon())}applyGradients(e){const t=Array.isArray(e)?e.map((e=>e.name)):Object.keys(e);Object(o.tidy)((()=>{const n=Object(c.sub)(1,this.accBeta1),o=Object(a.div)(-this.learningRate,Object(i.add)(Object(u.mul)(this.iteration,this.decay),1));t.forEach(((t,l)=>{const c=s.ENGINE.registeredVariables[t];null==this.accumulatedFirstMoment[l]&&(this.accumulatedFirstMoment[l]={originalName:`${t}/m`,variable:Object(f.zerosLike)(c).variable(false)}),null==this.accumulatedWeightedInfNorm[l]&&(this.accumulatedWeightedInfNorm[l]={originalName:`${t}/v`,variable:Object(f.zerosLike)(c).variable(false)});const p=Array.isArray(e)?e[l].tensor:e[t];if(null==p)return;const m=this.accumulatedFirstMoment[l].variable,h=this.accumulatedWeightedInfNorm[l].variable,b=Object(i.add)(Object(u.mul)(m,this.beta1),Object(u.mul)(p,1-this.beta1)),j=Object(u.mul)(h,this.beta2),g=Object(r.abs)(p),w=Object(d.maximum)(j,g);m.assign(b),h.assign(w);const _=Object(i.add)(Object(u.mul)(Object(a.div)(o,n),Object(a.div)(b,Object(i.add)(w,this.epsilon))),c);c.assign(_)})),this.iteration.assign(Object(i.add)(this.iteration,1)),this.accBeta1.assign(Object(u.mul)(this.accBeta1,this.beta1))})),this.incrementIterations()}dispose(){this.accBeta1.dispose(),this.iteration.dispose(),null!=this.accumulatedFirstMoment&&Object(o.dispose)(this.accumulatedFirstMoment.map((e=>e.variable))),null!=this.accumulatedWeightedInfNorm&&Object(o.dispose)(this.accumulatedWeightedInfNorm.map((e=>e.variable)))}async getWeights(){throw new Error("getWeights() is not implemented for Adamax yet.")}async setWeights(e){throw new Error("setWeights() is not implemented for Adamax yet.")}getConfig(){return{learningRate:this.learningRate,beta1:this.beta1,beta2:this.beta2,epsilon:this.epsilon,decay:this.decay}}static fromConfig(e,t){return new e(t.learningRate,t.beta1,t.beta2,t.epsilon,t.decay)}}h.className="Adamax",Object(p.registerClass)(h)},"./node_modules/@tensorflow/tfjs-core/dist/optimizers/momentum_optimizer.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/optimizers/momentum_optimizer.js ***! + \**********************************************************************************/ +/*! exports provided: MomentumOptimizer */function(e,t,n){"use strict";n.r(t),n.d(t,"MomentumOptimizer",(function(){return c}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../globals */"./node_modules/@tensorflow/tfjs-core/dist/globals.js"),r=n(/*! ../ops/add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),i=n(/*! ../ops/mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),a=n(/*! ../ops/scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),d=n(/*! ../ops/zeros_like */"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js"),u=n(/*! ../serialization */"./node_modules/@tensorflow/tfjs-core/dist/serialization.js"),l=n(/*! ./sgd_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/sgd_optimizer.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class c extends l.SGDOptimizer{constructor(e,t,n=!1){super(e),this.learningRate=e,this.momentum=t,this.useNesterov=n,this.accumulations=[],this.m=Object(a.scalar)(this.momentum)}applyGradients(e){(Array.isArray(e)?e.map((e=>e.name)):Object.keys(e)).forEach(((t,n)=>{const a=s.ENGINE.registeredVariables[t];if(null==this.accumulations[n]){const e=!1;this.accumulations[n]={originalName:`${t}/momentum`,variable:Object(o.tidy)((()=>Object(d.zerosLike)(a).variable(e)))}}const u=this.accumulations[n].variable,l=Array.isArray(e)?e[n].tensor:e[t];null!=l&&Object(o.tidy)((()=>{let e;const t=Object(r.add)(Object(i.mul)(this.m,u),l);e=this.useNesterov?Object(r.add)(Object(i.mul)(this.c,Object(r.add)(l,Object(i.mul)(t,this.m))),a):Object(r.add)(Object(i.mul)(this.c,t),a),u.assign(t),a.assign(e)}))})),this.incrementIterations()}dispose(){this.m.dispose(),null!=this.accumulations&&Object(o.dispose)(this.accumulations.map((e=>e.variable)))}setMomentum(e){this.momentum=e}async getWeights(){return[await this.saveIterations()].concat(this.accumulations.map((e=>({name:e.originalName,tensor:e.variable}))))}async setWeights(e){e=await this.extractIterations(e);this.accumulations=e.map((e=>({originalName:e.name,variable:e.tensor.variable(false)})))}getConfig(){return{learningRate:this.learningRate,momentum:this.momentum,useNesterov:this.useNesterov}}static fromConfig(e,t){return new e(t.learningRate,t.momentum,t.useNesterov)}}c.className="Momentum",Object(u.registerClass)(c)},"./node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer.js ***! + \*************************************************************************/ +/*! exports provided: Optimizer */function(e,t,n){"use strict";n.r(t),n.d(t,"Optimizer",(function(){return a}));var s=n(/*! ../globals */"./node_modules/@tensorflow/tfjs-core/dist/globals.js"),o=n(/*! ../gradients */"./node_modules/@tensorflow/tfjs-core/dist/gradients.js"),r=n(/*! ../ops/ops */"./node_modules/@tensorflow/tfjs-core/dist/ops/ops.js"),i=n(/*! ../serialization */"./node_modules/@tensorflow/tfjs-core/dist/serialization.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class a extends i.Serializable{minimize(e,t=!1,n){const{value:o,grads:r}=this.computeGradients(e,n);if(null!=n){const e=n.map((e=>({name:e.name,tensor:r[e.name]})));this.applyGradients(e)}else this.applyGradients(r);return Object(s.dispose)(r),t?o:(o.dispose(),null)}get iterations(){return null==this.iterations_&&(this.iterations_=0),this.iterations_}incrementIterations(){this.iterations_=this.iterations+1}computeGradients(e,t){return Object(o.variableGrads)(e,t)}dispose(){null!=this.iterations_&&Object(s.dispose)(this.iterations_)}async saveIterations(){return null==this.iterations_&&(this.iterations_=0),{name:"iter",tensor:Object(r.scalar)(this.iterations_,"int32")}}async getWeights(){throw new Error("getWeights() is not implemented for this optimizer yet.")}async setWeights(e){throw new Error(`setWeights() is not implemented for this optimizer class ${this.getClassName()}`)}async extractIterations(e){return this.iterations_=(await e[0].tensor.data())[0],e.slice(1)}}Object.defineProperty(a,Symbol.hasInstance,{value:e=>null!=e.minimize&&null!=e.computeGradients&&null!=e.applyGradients})},"./node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer_constructors.js": +/*!**************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer_constructors.js ***! + \**************************************************************************************/ +/*! exports provided: OptimizerConstructors */function(e,t,n){"use strict";n.r(t),n.d(t,"OptimizerConstructors",(function(){return l}));var s=n(/*! ./adadelta_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/adadelta_optimizer.js"),o=n(/*! ./adagrad_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/adagrad_optimizer.js"),r=n(/*! ./adam_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/adam_optimizer.js"),i=n(/*! ./adamax_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/adamax_optimizer.js"),a=n(/*! ./momentum_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/momentum_optimizer.js"),d=n(/*! ./rmsprop_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/rmsprop_optimizer.js"),u=n(/*! ./sgd_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/sgd_optimizer.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class l{static sgd(e){return new u.SGDOptimizer(e)}static momentum(e,t,n=!1){return new a.MomentumOptimizer(e,t,n)}static rmsprop(e,t=.9,n=0,s=null,o=!1){return new d.RMSPropOptimizer(e,t,n,s,o)}static adam(e=.001,t=.9,n=.999,s=null){return new r.AdamOptimizer(e,t,n,s)}static adadelta(e=.001,t=.95,n=null){return new s.AdadeltaOptimizer(e,t,n)}static adamax(e=.002,t=.9,n=.999,s=null,o=0){return new i.AdamaxOptimizer(e,t,n,s,o)}static adagrad(e,t=.1){return new o.AdagradOptimizer(e,t)}}},"./node_modules/@tensorflow/tfjs-core/dist/optimizers/rmsprop_optimizer.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/optimizers/rmsprop_optimizer.js ***! + \*********************************************************************************/ +/*! exports provided: RMSPropOptimizer */function(e,t,n){"use strict";n.r(t),n.d(t,"RMSPropOptimizer",(function(){return m}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../globals */"./node_modules/@tensorflow/tfjs-core/dist/globals.js"),r=n(/*! ../ops/add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),i=n(/*! ../ops/div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),a=n(/*! ../ops/mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),d=n(/*! ../ops/sqrt */"./node_modules/@tensorflow/tfjs-core/dist/ops/sqrt.js"),u=n(/*! ../ops/square */"./node_modules/@tensorflow/tfjs-core/dist/ops/square.js"),l=n(/*! ../ops/sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),c=n(/*! ../ops/zeros_like */"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js"),f=n(/*! ../serialization */"./node_modules/@tensorflow/tfjs-core/dist/serialization.js"),p=n(/*! ./optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class m extends p.Optimizer{constructor(e,t=.9,n=0,o=null,r=!1){if(super(),this.learningRate=e,this.decay=t,this.momentum=n,this.epsilon=o,this.accumulatedMeanSquares=[],this.accumulatedMoments=[],this.accumulatedMeanGrads=[],this.centered=r,null==o&&(this.epsilon=s.ENGINE.backend.epsilon()),null==e)throw new Error("learningRate for RMSPropOptimizer must be defined.")}applyGradients(e){(Array.isArray(e)?e.map((e=>e.name)):Object.keys(e)).forEach(((t,n)=>{const f=s.ENGINE.registeredVariables[t],p=!1;null==this.accumulatedMeanSquares[n]&&(this.accumulatedMeanSquares[n]={originalName:`${t}/rms`,variable:Object(o.tidy)((()=>Object(c.zerosLike)(f).variable(p)))}),null==this.accumulatedMoments[n]&&(this.accumulatedMoments[n]={originalName:`${t}/momentum`,variable:Object(o.tidy)((()=>Object(c.zerosLike)(f).variable(p)))}),null==this.accumulatedMeanGrads[n]&&this.centered&&(this.accumulatedMeanGrads[n]={originalName:`${t}/mg`,variable:Object(o.tidy)((()=>Object(c.zerosLike)(f).variable(p)))});const m=Array.isArray(e)?e[n].tensor:e[t];if(null==m)return;const h=this.accumulatedMeanSquares[n].variable,b=this.accumulatedMoments[n].variable;Object(o.tidy)((()=>{const e=Object(r.add)(Object(a.mul)(h,this.decay),Object(a.mul)(Object(u.square)(m),1-this.decay));if(this.centered){const t=this.accumulatedMeanGrads[n].variable,s=Object(r.add)(Object(a.mul)(t,this.decay),Object(a.mul)(m,1-this.decay)),o=Object(i.div)(Object(a.mul)(m,this.learningRate),Object(d.sqrt)(Object(l.sub)(e,Object(r.add)(Object(u.square)(s),this.epsilon)))),c=Object(r.add)(Object(a.mul)(b,this.momentum),o);h.assign(e),t.assign(s),b.assign(c);const p=Object(l.sub)(f,c);f.assign(p)}else{const e=Object(r.add)(Object(a.mul)(h,this.decay),Object(a.mul)(Object(u.square)(m),1-this.decay)),t=Object(r.add)(Object(a.mul)(b,this.momentum),Object(i.div)(Object(a.mul)(m,this.learningRate),Object(d.sqrt)(Object(r.add)(e,this.epsilon))));h.assign(e),b.assign(t);const n=Object(l.sub)(f,t);f.assign(n)}}))})),this.incrementIterations()}dispose(){null!=this.accumulatedMeanSquares&&Object(o.dispose)(this.accumulatedMeanSquares.map((e=>e.variable))),null!=this.accumulatedMeanGrads&&this.centered&&Object(o.dispose)(this.accumulatedMeanGrads.map((e=>e.variable))),null!=this.accumulatedMoments&&Object(o.dispose)(this.accumulatedMoments.map((e=>e.variable)))}async getWeights(){const e=[...this.accumulatedMeanSquares,...this.accumulatedMoments];return this.centered&&e.push(...this.accumulatedMeanGrads),[await this.saveIterations()].concat(e.map((e=>({name:e.originalName,tensor:e.variable}))))}async setWeights(e){e=await this.extractIterations(e);const t=this.centered?e.length/3:e.length/2,n=!1;this.accumulatedMeanSquares=e.slice(0,t).map((e=>({originalName:e.name,variable:e.tensor.variable(n)}))),this.accumulatedMoments=e.slice(t,2*t).map((e=>({originalName:e.name,variable:e.tensor.variable(n)}))),this.centered&&(this.accumulatedMeanGrads=e.slice(2*t,3*t).map((e=>({originalName:e.name,variable:e.tensor.variable(n)}))))}getConfig(){return{learningRate:this.learningRate,decay:this.decay,momentum:this.momentum,epsilon:this.epsilon,centered:this.centered}}static fromConfig(e,t){return new e(t.learningRate,t.decay,t.momentum,t.epsilon,t.centered)}}m.className="RMSProp",Object(f.registerClass)(m)},"./node_modules/@tensorflow/tfjs-core/dist/optimizers/sgd_optimizer.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/optimizers/sgd_optimizer.js ***! + \*****************************************************************************/ +/*! exports provided: SGDOptimizer */function(e,t,n){"use strict";n.r(t),n.d(t,"SGDOptimizer",(function(){return l}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../globals */"./node_modules/@tensorflow/tfjs-core/dist/globals.js"),r=n(/*! ../ops/add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),i=n(/*! ../ops/mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),a=n(/*! ../ops/scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),d=n(/*! ../serialization */"./node_modules/@tensorflow/tfjs-core/dist/serialization.js"),u=n(/*! ./optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class l extends u.Optimizer{constructor(e){super(),this.learningRate=e,this.setLearningRate(e)}applyGradients(e){(Array.isArray(e)?e.map((e=>e.name)):Object.keys(e)).forEach(((t,n)=>{const a=Array.isArray(e)?e[n].tensor:e[t];if(null==a)return;const d=s.ENGINE.registeredVariables[t];Object(o.tidy)((()=>{const e=Object(r.add)(Object(i.mul)(this.c,a),d);d.assign(e)}))})),this.incrementIterations()}setLearningRate(e){this.learningRate=e,null!=this.c&&this.c.dispose(),this.c=Object(o.keep)(Object(a.scalar)(-e))}dispose(){this.c.dispose()}async getWeights(){return[await this.saveIterations()]}async setWeights(e){if(0!==(e=await this.extractIterations(e)).length)throw new Error("SGD optimizer does not have settable weights.")}getConfig(){return{learningRate:this.learningRate}}static fromConfig(e,t){return new e(t.learningRate)}}l.className="SGD",Object(d.registerClass)(l)},"./node_modules/@tensorflow/tfjs-core/dist/platforms/platform_browser.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/platforms/platform_browser.js ***! + \*******************************************************************************/ +/*! exports provided: PlatformBrowser */function(e,t,n){"use strict";n.r(t),n.d(t,"PlatformBrowser",(function(){return a}));n(/*! ../flags */"./node_modules/@tensorflow/tfjs-core/dist/flags.js");var s=n(/*! ../environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"),o=n(/*! ../io/indexed_db */"./node_modules/@tensorflow/tfjs-core/dist/io/indexed_db.js"),r=n(/*! ../io/local_storage */"./node_modules/@tensorflow/tfjs-core/dist/io/local_storage.js"),i=n(/*! ../io/model_management */"./node_modules/@tensorflow/tfjs-core/dist/io/model_management.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class a{fetch(e,t){return fetch(e,t)}now(){return performance.now()}encode(e,t){if("utf-8"!==t&&"utf8"!==t)throw new Error(`Browser's encoder only supports utf-8, but got ${t}`);return null==this.textEncoder&&(this.textEncoder=new TextEncoder),this.textEncoder.encode(e)}decode(e,t){return new TextDecoder(t).decode(e)}}if(Object(s.env)().get("IS_BROWSER")){Object(s.env)().setPlatform("browser",new a);try{i.ModelStoreManagerRegistry.registerManager(r.BrowserLocalStorage.URL_SCHEME,new r.BrowserLocalStorageManager)}catch(e){}try{i.ModelStoreManagerRegistry.registerManager(o.BrowserIndexedDB.URL_SCHEME,new o.BrowserIndexedDBManager)}catch(e){}}},"./node_modules/@tensorflow/tfjs-core/dist/platforms/platform_node.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/platforms/platform_node.js ***! + \****************************************************************************/ +/*! exports provided: getNodeFetch, resetSystemFetch, setSystemFetch, getSystemFetch, PlatformNode */function(e,t,n){"use strict";n.r(t),function(e){n.d(t,"getNodeFetch",(function(){return o})),n.d(t,"resetSystemFetch",(function(){return i})),n.d(t,"setSystemFetch",(function(){return a})),n.d(t,"getSystemFetch",(function(){return d})),n.d(t,"PlatformNode",(function(){return u}));var s=n(/*! ../environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */const o={importFetch:()=>n(/*! node-fetch */1)};let r;function i(){r=null}function a(e){r=e}function d(){return r}class u{constructor(){this.util=n(/*! util */2),this.textEncoder=new this.util.TextEncoder}fetch(e,t){return null!=Object(s.env)().global.fetch?Object(s.env)().global.fetch(e,t):(null==r&&(r=o.importFetch()),r(e,t))}now(){const t=e.hrtime();return 1e3*t[0]+t[1]/1e6}encode(e,t){if("utf-8"!==t&&"utf8"!==t)throw new Error(`Node built-in encoder only supports utf-8, but got ${t}`);return this.textEncoder.encode(e)}decode(e,t){return 0===e.length?"":new this.util.TextDecoder(t).decode(e)}}Object(s.env)().get("IS_NODE")&&Object(s.env)().setPlatform("node",new u)}.call(this,n(/*! ./../../../../process/browser.js */"./node_modules/process/browser.js"))},"./node_modules/@tensorflow/tfjs-core/dist/profiler.js": +/*!*************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/profiler.js ***! + \*************************************************************/ +/*! exports provided: Profiler, checkComputationForErrors, Logger */function(e,t,n){"use strict";n.r(t),n.d(t,"Profiler",(function(){return r})),n.d(t,"checkComputationForErrors",(function(){return i})),n.d(t,"Logger",(function(){return a}));var s=n(/*! ./environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"),o=n(/*! ./util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class r{constructor(e,t){this.backendTimer=e,this.logger=t,null==t&&(this.logger=new a)}profileKernel(e,t,n){let r;const a=()=>{r=n()};let d;const u=o.now();if(this.backendTimer.timerAvailable())d=this.backendTimer.time(a);else{a();for(const e of r)e.dataSync();d=Promise.resolve({kernelMs:o.now()-u})}if(Object(s.env)().getBool("CHECK_COMPUTATION_FOR_ERRORS"))for(let t=0;t{i(t,n.dtype,e)}))}return{kernelName:e,outputs:r,inputs:t,timeMs:d.then((e=>e.kernelMs)),extraInfo:d.then((e=>null!=e.getExtraProfileInfo?e.getExtraProfileInfo():""))}}logKernelProfile(e){const{kernelName:t,outputs:n,timeMs:s,inputs:o,extraInfo:r}=e;n.forEach((e=>{Promise.all([e.data(),s,r]).then((n=>{this.logger.logKernelProfile(t,e,n[0],n[1],o,n[2])}))}))}}function i(e,t,n){if("float32"!==t)return!1;for(let t=0;t0?s:""} `}}console.log(`%c${d}\t%c${a}\t%c${u}D ${c}\t%c${l}\t%c${f}\t%c${i}`,"font-weight:bold","color:red","color:blue","color: orange","color: green","color: steelblue")}}},"./node_modules/@tensorflow/tfjs-core/dist/serialization.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/serialization.js ***! + \******************************************************************/ +/*! exports provided: Serializable, SerializationMap, registerClass */function(e,t,n){"use strict";n.r(t),n.d(t,"Serializable",(function(){return o})),n.d(t,"SerializationMap",(function(){return r})),n.d(t,"registerClass",(function(){return i}));var s=n(/*! ./util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */class o{getClassName(){return this.constructor.className}static fromConfig(e,t){return new e(t)}}class r{constructor(){this.classNameMap={}}static getMap(){return null==r.instance&&(r.instance=new r),r.instance}static register(e){r.getMap().classNameMap[e.className]=[e,e.fromConfig]}}function i(e){Object(s.assert)(null!=e.className,(()=>"Class being registered does not have the static className property defined.")),Object(s.assert)("string"==typeof e.className,(()=>"className is required to be a string, but got type "+typeof e.className)),Object(s.assert)(e.className.length>0,(()=>"Class being registered has an empty-string as its className, which is disallowed.")),r.register(e)}},"./node_modules/@tensorflow/tfjs-core/dist/tape.js": +/*!*********************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/tape.js ***! + \*********************************************************/ +/*! exports provided: getFilteredNodesXToY, backpropagateGradients */function(e,t,n){"use strict";n.r(t),n.d(t,"getFilteredNodesXToY",(function(){return o})),n.d(t,"backpropagateGradients",(function(){return r}));var s=n(/*! ./util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t,n){const s={},o={};for(let e=0;es[e.id]=!0)),a=!0,o[r.id]=!0;break}if(a)break}}const r={};r[n.id]=!0;const i={};for(let t=e.length-1;t>=0;t--){const n=e[t],s=n.inputs;for(let e=0;e=0;r--){const i=t[r],a=[];if(i.outputs.forEach((t=>{const n=e[t.id];null!=n?a.push(n):a.push(null)})),null==i.gradient)throw new Error(`Cannot compute gradient: gradient function not found for ${i.kernelName}.`);const d=i.gradient(a);for(const t in i.inputs){if(!(t in d))throw new Error(`Cannot backprop through input ${t}. Available gradients found: ${Object.keys(d)}.`);const r=n((()=>d[t]()));if("float32"!==r.dtype)throw new Error(`Error in gradient for op ${i.kernelName}. The gradient of input ${t} must have 'float32' dtype, but has '${r.dtype}'`);const a=i.inputs[t];if(!s.arraysEqual(r.shape,a.shape))throw new Error(`Error in gradient for op ${i.kernelName}. The gradient of input '${t}' has shape '${r.shape}', which does not match the shape of the input '${a.shape}'`);if(null==e[a.id])e[a.id]=r;else{const t=e[a.id];e[a.id]=o(t,r),t.dispose()}}}}},"./node_modules/@tensorflow/tfjs-core/dist/tensor.js": +/*!***********************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/tensor.js ***! + \***********************************************************/ +/*! exports provided: TensorBuffer, setTensorTracker, setOpHandler, setDeprecationWarningFn, Tensor, getGlobalTensorClass, Variable */function(e,t,n){"use strict";n.r(t),n.d(t,"TensorBuffer",(function(){return i})),n.d(t,"setTensorTracker",(function(){return l})),n.d(t,"setOpHandler",(function(){return c})),n.d(t,"setDeprecationWarningFn",(function(){return f})),n.d(t,"Tensor",(function(){return p})),n.d(t,"getGlobalTensorClass",(function(){return m})),n.d(t,"Variable",(function(){return h}));var s=n(/*! ./global_util */"./node_modules/@tensorflow/tfjs-core/dist/global_util.js"),o=n(/*! ./tensor_format */"./node_modules/@tensorflow/tfjs-core/dist/tensor_format.js"),r=n(/*! ./util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class i{constructor(e,t,n){if(this.dtype=t,this.shape=e.slice(),this.size=r.sizeFromShape(e),null!=n){const e=n.length;r.assert(e===this.size,(()=>`Length of values '${e}' does not match the size inferred by the shape '${this.size}'.`))}if("complex64"===t)throw new Error("complex64 dtype TensorBuffers are not supported. Please create a TensorBuffer for the real and imaginary parts separately and call tf.complex(real, imag).");this.values=n||r.getArrayFromDType(t,this.size),this.strides=Object(r.computeStrides)(e)}set(e,...t){0===t.length&&(t=[0]),r.assert(t.length===this.rank,(()=>`The number of provided coordinates (${t.length}) must match the rank (${this.rank})`));const n=this.locToIndex(t);this.values[n]=e}get(...e){0===e.length&&(e=[0]);let t=0;for(const n of e){if(n<0||n>=this.shape[t]){const t=`Requested out of range element at ${e}. Buffer shape=${this.shape}`;throw new Error(t)}t++}let n=e[e.length-1];for(let t=0;tr.decodeString(e)))}catch(e){throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes().")}}return e}dataSync(){this.throwIfDisposed();const e=a().readSync(this.dataId);if("string"===this.dtype)try{return e.map((e=>r.decodeString(e)))}catch(e){throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes().")}return e}async bytes(){this.throwIfDisposed();const e=await a().read(this.dataId);return"string"===this.dtype?e:new Uint8Array(e.buffer)}dispose(){this.isDisposed||(a().disposeTensor(this),this.isDisposedInternal=!0)}get isDisposed(){return this.isDisposedInternal}throwIfDisposed(){if(this.isDisposed)throw new Error("Tensor is disposed.")}print(e=!1){return d.print(this,e)}clone(){return this.throwIfDisposed(),d.clone(this)}toString(e=!1){const t=this.dataSync();return Object(o.tensorToString)(t,this.shape,this.dtype,e)}cast(e){return this.throwIfDisposed(),d.cast(this,e)}variable(e=!0,t,n){return this.throwIfDisposed(),a().makeVariable(this,e,t,n)}}function m(){return Object(s.getGlobal)("Tensor",(()=>p))}Object.defineProperty(p,Symbol.hasInstance,{value:e=>!!e&&null!=e.data&&null!=e.dataSync&&null!=e.throwIfDisposed}),m();class h extends p{constructor(e,t,n,s){super(e.shape,e.dtype,e.dataId,s),this.trainable=t,this.name=n}assign(e){if(e.dtype!==this.dtype)throw new Error(`dtype of the new value (${e.dtype}) and previous value (${this.dtype}) must match`);if(!r.arraysEqual(e.shape,this.shape))throw new Error(`shape of the new value (${e.shape}) and previous value (${this.shape}) must match`);a().disposeTensor(this),this.dataId=e.dataId,a().incRef(this,null)}dispose(){a().disposeVariable(this),this.isDisposedInternal=!0}}Object.defineProperty(h,Symbol.hasInstance,{value:e=>e instanceof p&&null!=e.assign&&e.assign instanceof Function})},"./node_modules/@tensorflow/tfjs-core/dist/tensor_format.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/tensor_format.js ***! + \******************************************************************/ +/*! exports provided: tensorToString */function(e,t,n){"use strict";n.r(t),n.d(t,"tensorToString",(function(){return o}));var s=n(/*! ./util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t,n,o){const i=Object(s.computeStrides)(t),u=function(e,t,n,o){const i=Object(s.sizeFromShape)(t),a=o[o.length-1],u=new Array(a).fill(0),l=t.length,c="complex64"===n?d(e):e;if(l>1)for(let e=0;e" "+e)).join("\n")),f.join("\n")}function r(e,t,n){let o;return o=Array.isArray(e)?`${parseFloat(e[0].toFixed(7))} + ${parseFloat(e[1].toFixed(7))}j`:Object(s.isString)(e)?`'${e}'`:"bool"===n?i(e):parseFloat(e.toFixed(7)).toString(),Object(s.rightPad)(o,t)}function i(e){return 0===e?"false":"true"}function a(e,t,n,s,o,u=!0){const l="complex64"===n?2:1,c=t[0],f=t.length;if(0===f){if("complex64"===n){return[r(d(e)[0],0,n)]}return"bool"===n?[i(e[0])]:[e[0].toString()]}if(1===f){if(c>20){const t=3*l;let s=Array.from(e.slice(0,t)),i=Array.from(e.slice((c-3)*l,c*l));return"complex64"===n&&(s=d(s),i=d(i)),["["+s.map(((e,t)=>r(e,o[t],n))).join(", ")+", ..., "+i.map(((e,t)=>r(e,o[c-3+t],n))).join(", ")+"]"]}return["["+("complex64"===n?d(e):Array.from(e)).map(((e,t)=>r(e,o[t],n))).join(", ")+"]"]}const p=t.slice(1),m=s.slice(1),h=s[0]*l,b=[];if(c>20){for(let t=0;t<3;t++){const s=t*h,r=s+h;b.push(...a(e.slice(s,r),p,n,m,o,!1))}b.push("...");for(let t=c-3;t`The dtypes of the first(${e.dtype}) and second(${t.dtype}) input must match`))}function d(e,t){return t.some((t=>t.id===e.id))}function u(e){const t=[];return l(e,t,new Set),t}function l(e,t,n){if(null==e)return;if(e instanceof s.Tensor)return void t.push(e);if(o=e,!Array.isArray(o)&&"object"!=typeof o)return;var o;const r=e;for(const e in r){const s=r[e];n.has(s)||(n.add(s),l(s,t,n))}}},"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js ***! + \********************************************************************/ +/*! exports provided: inferShape, convertToTensor, convertToTensorArray */function(e,t,n){"use strict";n.r(t),n.d(t,"inferShape",(function(){return a})),n.d(t,"convertToTensor",(function(){return l})),n.d(t,"convertToTensorArray",(function(){return c}));var s=n(/*! ./engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ./environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"),r=n(/*! ./tensor */"./node_modules/@tensorflow/tfjs-core/dist/tensor.js"),i=n(/*! ./util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e,t){let n=e;if(Object(i.isTypedArray)(e))return"string"===t?[]:[e.length];if(!Array.isArray(e))return[];const s=[];for(;Array.isArray(n)||Object(i.isTypedArray)(n)&&"string"!==t;)s.push(n.length),n=n[0];return Array.isArray(e)&&Object(o.env)().getBool("TENSORLIKE_CHECK_SHAPE_CONSISTENCY")&&d(e,s,[]),s}function d(e,t,n){if(n=n||[],!Array.isArray(e)&&!Object(i.isTypedArray)(e))return void Object(i.assert)(0===t.length,(()=>`Element arr[${n.join("][")}] is a primitive, but should be an array/TypedArray of ${t[0]} elements`));Object(i.assert)(t.length>0,(()=>`Element arr[${n.join("][")}] should be a primitive, but is an array of ${e.length} elements`)),Object(i.assert)(e.length===t[0],(()=>`Element arr[${n.join("][")}] should have ${t[0]} elements, but has ${e.length} elements`));const s=t.slice(1);for(let t=0;t=0&&(d=o),u(o,d,t,n),null==e||!Object(i.isTypedArray)(e)&&!Array.isArray(e)&&"number"!=typeof e&&"boolean"!=typeof e&&"string"!=typeof e){const s=null==e?"null":e.constructor.name;throw new Error(`Argument '${t}' passed to '${n}' must be a Tensor or TensorLike, but got '${s}'`)}const l=a(e,d);Object(i.isTypedArray)(e)||Array.isArray(e)||(e=[e]);const c="string"!==d?Object(i.toTypedArray)(e,d):Object(i.flatten)(e,[],!0);return s.ENGINE.makeTensor(c,l,d)}function c(e,t,n,s="numeric"){if(!Array.isArray(e))throw new Error(`Argument ${t} passed to ${n} must be a \`Tensor[]\` or \`TensorLike[]\``);return e.map(((e,o)=>l(e,`${t}[${o}]`,n,s)))}},"./node_modules/@tensorflow/tfjs-core/dist/test_util.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/test_util.js ***! + \**************************************************************/ +/*! exports provided: TEST_EPSILON_FLOAT16, expectArraysClose, testEpsilon, expectPromiseToFail, expectArraysEqual, expectNumbersClose, expectValuesInRange, expectArrayBuffersEqual, encodeStrings */function(e,t,n){"use strict";n.r(t),n.d(t,"TEST_EPSILON_FLOAT16",(function(){return i})),n.d(t,"expectArraysClose",(function(){return a})),n.d(t,"testEpsilon",(function(){return d})),n.d(t,"expectPromiseToFail",(function(){return l})),n.d(t,"expectArraysEqual",(function(){return c})),n.d(t,"expectNumbersClose",(function(){return f})),n.d(t,"expectValuesInRange",(function(){return m})),n.d(t,"expectArrayBuffersEqual",(function(){return h})),n.d(t,"encodeStrings",(function(){return b}));var s=n(/*! ./engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ./tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),r=n(/*! ./util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=.1;function a(e,t,n){return null==n&&(n=d()),u(e,t,((e,t)=>p(e,t,n)))}function d(){return 32===s.ENGINE.backend.floatPrecision()?.001:i}function u(e,t,n){let s=!0;if((Object(r.isTypedArray)(e)||Object(r.isTypedArray)(t))&&(s=!1),Object(r.isTypedArray)(e)&&Object(r.isTypedArray)(t)&&(s=!0),s){const n=e.constructor.name,s=t.constructor.name;if(n!==s)throw new Error(`Arrays are of different type. Actual: ${n}. Expected: ${s}`)}if(Array.isArray(e)&&Array.isArray(t)){const n=Object(o.inferShape)(e),s=Object(o.inferShape)(t);if(!Object(r.arraysEqual)(n,s))throw new Error(`Arrays have different shapes. Actual: [${n}]. Expected: [${s}]`)}const i=Object(r.isTypedArray)(e)?e:Object(r.flatten)(e),a=Object(r.isTypedArray)(t)?t:Object(r.flatten)(t);if(i.length!==a.length)throw new Error(`Arrays have different lengths actual: ${i.length} vs expected: ${a.length}.\nActual: ${i}.\nExpected: ${a}.`);for(let e=0;et.fail()),(()=>t()))}function c(e,t){const n="string"==typeof t||"number"==typeof t||"boolean"==typeof t?[t]:t;return Object(r.isString)(e)||Object(r.isString)(e[0])||Object(r.isString)(t)||Object(r.isString)(t[0])?u(e,n,((e,t)=>e==t)):u(e,t,((e,t)=>p(e,t,0)))}function f(e,t,n){if(null==n&&(n=d()),!p(e,t,n))throw new Error(`Numbers differ: actual === ${e}, expected === ${t}`)}function p(e,t,n){return!isFinite(e)&&!isFinite(t)||!(isNaN(e)||isNaN(t)||Math.abs(e-t)>n)}function m(e,t,n){for(let s=0;sn)throw new Error(`Value out of range:${e[s]} low: ${t}, high: ${n}`)}function h(e,t){expect(new Float32Array(e)).toEqual(new Float32Array(t))}function b(e){for(let t=0;t0;)n=Math.random()*t|0,t--,a(e,t,n)}function o(e,t){if(e.length!==t.length)throw new Error(`Array sizes must match to be shuffled together First array length was ${e.length}Second array length was ${t.length}`);let n=e.length,s=0;for(;n>0;)s=Math.random()*n|0,n--,a(e,n,s),a(t,n,s)}function r(e,t,n){return Math.max(e,Math.min(t,n))}function i(e){return e%2==0?e:e+1}function a(e,t,n){const s=e[t];e[t]=e[n],e[n]=s}function d(e){let t=0;for(let n=0;nn+` Shapes ${e} and ${t} must match`))}function p(e){c(null!=e,(()=>"The input to the tensor constructor must be a non-null value."))}function m(e,t=[],n=!1){if(null==t&&(t=[]),Array.isArray(e)||A(e)&&!n)for(let s=0;s0),n){return new Promise(((s,o)=>{let r=0;const i=()=>{if(e())return void s();r++;const a=t(r);null!=n&&r>=n?o():setTimeout(i,a)};i()}))}function y(e,t){let n=1,s=-1;for(let t=0;t=0)n*=e[t];else if(-1===e[t]){if(-1!==s)throw Error(`Shapes can only have 1 implicit size. Found -1 at dim ${s} and dim ${t}`);s=t}else if(e[t]<0)throw Error(`Shapes can not be < 0. Found ${e[t]} at dim ${t}`);if(-1===s){if(t>0&&t!==n)throw Error(`Size(${t}) must match the product of shape ${e}`);return e}if(0===n)throw Error(`Cannot infer the missing size in [${e}] when there are 0 elements`);if(t%n!=0)throw Error(`The implicit shape can't be a fractional number. Got ${t} / ${n}`);const o=e.slice();return o[s]=t/n,o}function O(e,t){const n=t.length;return c((e=null==e?t.map(((e,t)=>t)):[].concat(e)).every((e=>e>=-n&&e`All values in axis param must be in range [-${n}, ${n}) but got axis ${e}`)),c(e.every((e=>g(e))),(()=>`All values in axis param must be integers but got axis ${e}`)),e.map((e=>e<0?n+e:e))}function I(e,t){const n=[],s=[],o=null!=t&&Array.isArray(t)&&0===t.length,r=null==t||o?null:O(t,e).sort();let i=0;for(let t=0;tt)&&1===e[t]&&(n.push(e[t]),s.push(t)),r[i]<=t&&i++}1!==e[t]&&(n.push(e[t]),s.push(t))}return{newShape:n,keptDims:s}}function C(e,t){let n=null;if(null==e||"float32"===e)n=new Float32Array(t);else if("int32"===e)n=new Int32Array(t);else{if("bool"!==e)throw new Error(`Unknown data type ${e}`);n=new Uint8Array(t)}return n}function S(e,t){let n=null;if(null==e||"float32"===e)n=new Float32Array(t);else if("int32"===e)n=new Int32Array(t);else if("bool"===e)n=new Uint8Array(t);else{if("string"!==e)throw new Error(`Unknown data type ${e}`);n=new Array(t)}return n}function T(e,t){for(let n=0;nt+=e.length)),t}function $(e){return"string"==typeof e||e instanceof String}function M(e){return"boolean"==typeof e}function D(e){return"number"==typeof e}function P(e){return Array.isArray(e)?P(e[0]):e instanceof Float32Array?"float32":e instanceof Int32Array||e instanceof Uint8Array?"int32":D(e)?"float32":$(e)?"string":M(e)?"bool":"float32"}function B(e){return!!(e&&e.constructor&&e.call&&e.apply)}function L(e,t){for(let n=t;n=0;--s)n[s]=n[s+1]*e[s+1];return n}function G(e,t,n,s=!1){const o=new Array;if(1===t.length){const r=t[0]*(s?2:1);for(let t=0;te*t))*(s?2:1);for(let t=0;te*t))*(n?2:1);if(0===s)return[];if(s!==t.length)throw new Error(`[${e}] does not match the input size ${t.length}${n?" for a complex tensor":""}.`);return G(0,e,t,n)}function U(e,t){const n=V(e,t);for(let e=0;ee*t),1);if(null==t||"float32"===t)return W(e,new Float32Array(n));if("int32"===t)return W(e,new Int32Array(n));if("bool"===t)return W(e,new Uint8Array(n));throw new Error(`Unknown data type ${t}`)}function H(e){e.forEach((t=>{c(Number.isInteger(t)&&t>=0,(()=>`Tensor must have a shape comprised of positive integers but got shape [${e}].`))}))}function K(e,t,n){if(0===t)return 0;if(1===t)return e[0];let s=e[e.length-1];for(let t=0;t0?i-4:i;for(n=0;n>16&255,d[l++]=t>>8&255,d[l++]=255&t;2===a&&(t=o[e.charCodeAt(n)]<<2|o[e.charCodeAt(n+1)]>>4,d[l++]=255&t);1===a&&(t=o[e.charCodeAt(n)]<<10|o[e.charCodeAt(n+1)]<<4|o[e.charCodeAt(n+2)]>>2,d[l++]=t>>8&255,d[l++]=255&t);return d},t.fromByteArray=function(e){for(var t,n=e.length,o=n%3,r=[],i=16383,a=0,d=n-o;ad?d:a+i));1===o?(t=e[n-1],r.push(s[t>>2]+s[t<<4&63]+"==")):2===o&&(t=(e[n-2]<<8)+e[n-1],r.push(s[t>>10]+s[t>>4&63]+s[t<<2&63]+"="));return r.join("")};for(var s=[],o=[],r="undefined"!=typeof Uint8Array?Uint8Array:Array,i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",a=0,d=i.length;a0)throw new Error("Invalid string. Length must be a multiple of 4");var n=e.indexOf("=");return-1===n&&(n=t),[n,n===t?0:4-n%4]}function l(e,t,n){for(var o,r,i=[],a=t;a>18&63]+s[r>>12&63]+s[r>>6&63]+s[63&r]);return i.join("")}o["-".charCodeAt(0)]=62,o["_".charCodeAt(0)]=63},"./node_modules/buffer/index.js": +/*!**************************************!*\ + !*** ./node_modules/buffer/index.js ***! + \**************************************/ +/*! no static exports found */function(e,t,n){"use strict";(function(e){ +/*! + * The buffer module from node.js, for the browser. + * + * @author Feross Aboukhadijeh + * @license MIT + */ +var s=n(/*! base64-js */"./node_modules/base64-js/index.js"),o=n(/*! ieee754 */"./node_modules/ieee754/index.js"),r=n(/*! isarray */"./node_modules/isarray/index.js");function i(){return d.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function a(e,t){if(i()=i())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+i().toString(16)+" bytes");return 0|e}function m(e,t){if(d.isBuffer(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var n=e.length;if(0===n)return 0;for(var s=!1;;)switch(t){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":case void 0:return z(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return G(e).length;default:if(s)return z(e).length;t=(""+t).toLowerCase(),s=!0}}function h(e,t,n){var s=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return"";if((n>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return N(this,t,n);case"utf8":case"utf-8":return I(this,t,n);case"ascii":return S(this,t,n);case"latin1":case"binary":return T(this,t,n);case"base64":return O(this,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return E(this,t,n);default:if(s)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),s=!0}}function b(e,t,n){var s=e[t];e[t]=e[n],e[n]=s}function j(e,t,n,s,o){if(0===e.length)return-1;if("string"==typeof n?(s=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),n=+n,isNaN(n)&&(n=o?0:e.length-1),n<0&&(n=e.length+n),n>=e.length){if(o)return-1;n=e.length-1}else if(n<0){if(!o)return-1;n=0}if("string"==typeof t&&(t=d.from(t,s)),d.isBuffer(t))return 0===t.length?-1:g(e,t,n,s,o);if("number"==typeof t)return t&=255,d.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?o?Uint8Array.prototype.indexOf.call(e,t,n):Uint8Array.prototype.lastIndexOf.call(e,t,n):g(e,[t],n,s,o);throw new TypeError("val must be string, number or Buffer")}function g(e,t,n,s,o){var r,i=1,a=e.length,d=t.length;if(void 0!==s&&("ucs2"===(s=String(s).toLowerCase())||"ucs-2"===s||"utf16le"===s||"utf-16le"===s)){if(e.length<2||t.length<2)return-1;i=2,a/=2,d/=2,n/=2}function u(e,t){return 1===i?e[t]:e.readUInt16BE(t*i)}if(o){var l=-1;for(r=n;ra&&(n=a-d),r=n;r>=0;r--){for(var c=!0,f=0;fo&&(s=o):s=o;var r=t.length;if(r%2!=0)throw new TypeError("Invalid hex string");s>r/2&&(s=r/2);for(var i=0;i>8,o=n%256,r.push(o),r.push(s);return r}(t,e.length-n),e,n,s)}function O(e,t,n){return 0===t&&n===e.length?s.fromByteArray(e):s.fromByteArray(e.slice(t,n))}function I(e,t,n){n=Math.min(e.length,n);for(var s=[],o=t;o239?4:u>223?3:u>191?2:1;if(o+c<=n)switch(c){case 1:u<128&&(l=u);break;case 2:128==(192&(r=e[o+1]))&&(d=(31&u)<<6|63&r)>127&&(l=d);break;case 3:r=e[o+1],i=e[o+2],128==(192&r)&&128==(192&i)&&(d=(15&u)<<12|(63&r)<<6|63&i)>2047&&(d<55296||d>57343)&&(l=d);break;case 4:r=e[o+1],i=e[o+2],a=e[o+3],128==(192&r)&&128==(192&i)&&128==(192&a)&&(d=(15&u)<<18|(63&r)<<12|(63&i)<<6|63&a)>65535&&d<1114112&&(l=d)}null===l?(l=65533,c=1):l>65535&&(l-=65536,s.push(l>>>10&1023|55296),l=56320|1023&l),s.push(l),o+=c}return function(e){var t=e.length;if(t<=C)return String.fromCharCode.apply(String,e);var n="",s=0;for(;s0&&(e=this.toString("hex",0,n).match(/.{2}/g).join(" "),this.length>n&&(e+=" ... ")),""},d.prototype.compare=function(e,t,n,s,o){if(!d.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===n&&(n=e?e.length:0),void 0===s&&(s=0),void 0===o&&(o=this.length),t<0||n>e.length||s<0||o>this.length)throw new RangeError("out of range index");if(s>=o&&t>=n)return 0;if(s>=o)return-1;if(t>=n)return 1;if(this===e)return 0;for(var r=(o>>>=0)-(s>>>=0),i=(n>>>=0)-(t>>>=0),a=Math.min(r,i),u=this.slice(s,o),l=e.slice(t,n),c=0;co)&&(n=o),e.length>0&&(n<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");s||(s="utf8");for(var r=!1;;)switch(s){case"hex":return w(this,e,t,n);case"utf8":case"utf-8":return _(this,e,t,n);case"ascii":return k(this,e,t,n);case"latin1":case"binary":return v(this,e,t,n);case"base64":return x(this,e,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return y(this,e,t,n);default:if(r)throw new TypeError("Unknown encoding: "+s);s=(""+s).toLowerCase(),r=!0}},d.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var C=4096;function S(e,t,n){var s="";n=Math.min(e.length,n);for(var o=t;os)&&(n=s);for(var o="",r=t;rn)throw new RangeError("Trying to access beyond buffer length")}function R(e,t,n,s,o,r){if(!d.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>o||te.length)throw new RangeError("Index out of range")}function F(e,t,n,s){t<0&&(t=65535+t+1);for(var o=0,r=Math.min(e.length-n,2);o>>8*(s?o:1-o)}function $(e,t,n,s){t<0&&(t=4294967295+t+1);for(var o=0,r=Math.min(e.length-n,4);o>>8*(s?o:3-o)&255}function M(e,t,n,s,o,r){if(n+s>e.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function D(e,t,n,s,r){return r||M(e,0,n,4),o.write(e,t,n,s,23,4),n+4}function P(e,t,n,s,r){return r||M(e,0,n,8),o.write(e,t,n,s,52,8),n+8}d.prototype.slice=function(e,t){var n,s=this.length;if((e=~~e)<0?(e+=s)<0&&(e=0):e>s&&(e=s),(t=void 0===t?s:~~t)<0?(t+=s)<0&&(t=0):t>s&&(t=s),t0&&(o*=256);)s+=this[e+--t]*o;return s},d.prototype.readUInt8=function(e,t){return t||A(e,1,this.length),this[e]},d.prototype.readUInt16LE=function(e,t){return t||A(e,2,this.length),this[e]|this[e+1]<<8},d.prototype.readUInt16BE=function(e,t){return t||A(e,2,this.length),this[e]<<8|this[e+1]},d.prototype.readUInt32LE=function(e,t){return t||A(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},d.prototype.readUInt32BE=function(e,t){return t||A(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},d.prototype.readIntLE=function(e,t,n){e|=0,t|=0,n||A(e,t,this.length);for(var s=this[e],o=1,r=0;++r=(o*=128)&&(s-=Math.pow(2,8*t)),s},d.prototype.readIntBE=function(e,t,n){e|=0,t|=0,n||A(e,t,this.length);for(var s=t,o=1,r=this[e+--s];s>0&&(o*=256);)r+=this[e+--s]*o;return r>=(o*=128)&&(r-=Math.pow(2,8*t)),r},d.prototype.readInt8=function(e,t){return t||A(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},d.prototype.readInt16LE=function(e,t){t||A(e,2,this.length);var n=this[e]|this[e+1]<<8;return 32768&n?4294901760|n:n},d.prototype.readInt16BE=function(e,t){t||A(e,2,this.length);var n=this[e+1]|this[e]<<8;return 32768&n?4294901760|n:n},d.prototype.readInt32LE=function(e,t){return t||A(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},d.prototype.readInt32BE=function(e,t){return t||A(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},d.prototype.readFloatLE=function(e,t){return t||A(e,4,this.length),o.read(this,e,!0,23,4)},d.prototype.readFloatBE=function(e,t){return t||A(e,4,this.length),o.read(this,e,!1,23,4)},d.prototype.readDoubleLE=function(e,t){return t||A(e,8,this.length),o.read(this,e,!0,52,8)},d.prototype.readDoubleBE=function(e,t){return t||A(e,8,this.length),o.read(this,e,!1,52,8)},d.prototype.writeUIntLE=function(e,t,n,s){(e=+e,t|=0,n|=0,s)||R(this,e,t,n,Math.pow(2,8*n)-1,0);var o=1,r=0;for(this[t]=255&e;++r=0&&(r*=256);)this[t+o]=e/r&255;return t+n},d.prototype.writeUInt8=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,1,255,0),d.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},d.prototype.writeUInt16LE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,2,65535,0),d.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):F(this,e,t,!0),t+2},d.prototype.writeUInt16BE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,2,65535,0),d.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):F(this,e,t,!1),t+2},d.prototype.writeUInt32LE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,4,4294967295,0),d.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):$(this,e,t,!0),t+4},d.prototype.writeUInt32BE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,4,4294967295,0),d.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):$(this,e,t,!1),t+4},d.prototype.writeIntLE=function(e,t,n,s){if(e=+e,t|=0,!s){var o=Math.pow(2,8*n-1);R(this,e,t,n,o-1,-o)}var r=0,i=1,a=0;for(this[t]=255&e;++r>0)-a&255;return t+n},d.prototype.writeIntBE=function(e,t,n,s){if(e=+e,t|=0,!s){var o=Math.pow(2,8*n-1);R(this,e,t,n,o-1,-o)}var r=n-1,i=1,a=0;for(this[t+r]=255&e;--r>=0&&(i*=256);)e<0&&0===a&&0!==this[t+r+1]&&(a=1),this[t+r]=(e/i>>0)-a&255;return t+n},d.prototype.writeInt8=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,1,127,-128),d.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},d.prototype.writeInt16LE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,2,32767,-32768),d.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):F(this,e,t,!0),t+2},d.prototype.writeInt16BE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,2,32767,-32768),d.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):F(this,e,t,!1),t+2},d.prototype.writeInt32LE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,4,2147483647,-2147483648),d.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):$(this,e,t,!0),t+4},d.prototype.writeInt32BE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),d.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):$(this,e,t,!1),t+4},d.prototype.writeFloatLE=function(e,t,n){return D(this,e,t,!0,n)},d.prototype.writeFloatBE=function(e,t,n){return D(this,e,t,!1,n)},d.prototype.writeDoubleLE=function(e,t,n){return P(this,e,t,!0,n)},d.prototype.writeDoubleBE=function(e,t,n){return P(this,e,t,!1,n)},d.prototype.copy=function(e,t,n,s){if(n||(n=0),s||0===s||(s=this.length),t>=e.length&&(t=e.length),t||(t=0),s>0&&s=this.length)throw new RangeError("sourceStart out of bounds");if(s<0)throw new RangeError("sourceEnd out of bounds");s>this.length&&(s=this.length),e.length-t=0;--o)e[o+t]=this[o+n];else if(r<1e3||!d.TYPED_ARRAY_SUPPORT)for(o=0;o>>=0,n=void 0===n?this.length:n>>>0,e||(e=0),"number"==typeof e)for(r=t;r55295&&n<57344){if(!o){if(n>56319){(t-=3)>-1&&r.push(239,191,189);continue}if(i+1===s){(t-=3)>-1&&r.push(239,191,189);continue}o=n;continue}if(n<56320){(t-=3)>-1&&r.push(239,191,189),o=n;continue}n=65536+(o-55296<<10|n-56320)}else o&&(t-=3)>-1&&r.push(239,191,189);if(o=null,n<128){if((t-=1)<0)break;r.push(n)}else if(n<2048){if((t-=2)<0)break;r.push(n>>6|192,63&n|128)}else if(n<65536){if((t-=3)<0)break;r.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;r.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return r}function G(e){return s.toByteArray(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}(e).replace(B,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function W(e,t,n,s){for(var o=0;o=t.length||o>=e.length);++o)t[o+n]=e[o];return o}}).call(this,n(/*! ./../webpack/buildin/global.js */"./node_modules/webpack/buildin/global.js"))},"./node_modules/ieee754/index.js": +/*!***************************************!*\ + !*** ./node_modules/ieee754/index.js ***! + \***************************************/ +/*! no static exports found */function(e,t){ +/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */ +t.read=function(e,t,n,s,o){var r,i,a=8*o-s-1,d=(1<>1,l=-7,c=n?o-1:0,f=n?-1:1,p=e[t+c];for(c+=f,r=p&(1<<-l)-1,p>>=-l,l+=a;l>0;r=256*r+e[t+c],c+=f,l-=8);for(i=r&(1<<-l)-1,r>>=-l,l+=s;l>0;i=256*i+e[t+c],c+=f,l-=8);if(0===r)r=1-u;else{if(r===d)return i?NaN:1/0*(p?-1:1);i+=Math.pow(2,s),r-=u}return(p?-1:1)*i*Math.pow(2,r-s)},t.write=function(e,t,n,s,o,r){var i,a,d,u=8*r-o-1,l=(1<>1,f=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,p=s?0:r-1,m=s?1:-1,h=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(a=isNaN(t)?1:0,i=l):(i=Math.floor(Math.log(t)/Math.LN2),t*(d=Math.pow(2,-i))<1&&(i--,d*=2),(t+=i+c>=1?f/d:f*Math.pow(2,1-c))*d>=2&&(i++,d/=2),i+c>=l?(a=0,i=l):i+c>=1?(a=(t*d-1)*Math.pow(2,o),i+=c):(a=t*Math.pow(2,c-1)*Math.pow(2,o),i=0));o>=8;e[n+p]=255&a,p+=m,a/=256,o-=8);for(i=i<0;e[n+p]=255&i,p+=m,i/=256,u-=8);e[n+p-m]|=128*h}},"./node_modules/isarray/index.js": +/*!***************************************!*\ + !*** ./node_modules/isarray/index.js ***! + \***************************************/ +/*! no static exports found */function(e,t){var n={}.toString;e.exports=Array.isArray||function(e){return"[object Array]"==n.call(e)}},"./node_modules/long/src/long.js": +/*!***************************************!*\ + !*** ./node_modules/long/src/long.js ***! + \***************************************/ +/*! no static exports found */function(e,t){e.exports=s;var n=null;try{n=new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([0,97,115,109,1,0,0,0,1,13,2,96,0,1,127,96,4,127,127,127,127,1,127,3,7,6,0,1,1,1,1,1,6,6,1,127,1,65,0,11,7,50,6,3,109,117,108,0,1,5,100,105,118,95,115,0,2,5,100,105,118,95,117,0,3,5,114,101,109,95,115,0,4,5,114,101,109,95,117,0,5,8,103,101,116,95,104,105,103,104,0,0,10,191,1,6,4,0,35,0,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,126,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,127,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,128,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,129,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,130,34,4,66,32,135,167,36,0,32,4,167,11])),{}).exports}catch(e){}function s(e,t,n){this.low=0|e,this.high=0|t,this.unsigned=!!n}function o(e){return!0===(e&&e.__isLong__)}s.prototype.__isLong__,Object.defineProperty(s.prototype,"__isLong__",{value:!0}),s.isLong=o;var r={},i={};function a(e,t){var n,s,o;return t?(o=0<=(e>>>=0)&&e<256)&&(s=i[e])?s:(n=u(e,(0|e)<0?-1:0,!0),o&&(i[e]=n),n):(o=-128<=(e|=0)&&e<128)&&(s=r[e])?s:(n=u(e,e<0?-1:0,!1),o&&(r[e]=n),n)}function d(e,t){if(isNaN(e))return t?g:j;if(t){if(e<0)return g;if(e>=m)return x}else{if(e<=-h)return y;if(e+1>=h)return v}return e<0?d(-e,t).neg():u(e%p|0,e/p|0,t)}function u(e,t,n){return new s(e,t,n)}s.fromInt=a,s.fromNumber=d,s.fromBits=u;var l=Math.pow;function c(e,t,n){if(0===e.length)throw Error("empty string");if("NaN"===e||"Infinity"===e||"+Infinity"===e||"-Infinity"===e)return j;if("number"==typeof t?(n=t,t=!1):t=!!t,(n=n||10)<2||360)throw Error("interior hyphen");if(0===s)return c(e.substring(1),t,n).neg();for(var o=d(l(n,8)),r=j,i=0;i>>0:this.low},O.toNumber=function(){return this.unsigned?(this.high>>>0)*p+(this.low>>>0):this.high*p+(this.low>>>0)},O.toString=function(e){if((e=e||10)<2||36>>0).toString(e);if((r=a).isZero())return u+i;for(;u.length<6;)u="0"+u;i=""+u+i}},O.getHighBits=function(){return this.high},O.getHighBitsUnsigned=function(){return this.high>>>0},O.getLowBits=function(){return this.low},O.getLowBitsUnsigned=function(){return this.low>>>0},O.getNumBitsAbs=function(){if(this.isNegative())return this.eq(y)?64:this.neg().getNumBitsAbs();for(var e=0!=this.high?this.high:this.low,t=31;t>0&&0==(e&1<=0},O.isOdd=function(){return 1==(1&this.low)},O.isEven=function(){return 0==(1&this.low)},O.equals=function(e){return o(e)||(e=f(e)),(this.unsigned===e.unsigned||this.high>>>31!=1||e.high>>>31!=1)&&(this.high===e.high&&this.low===e.low)},O.eq=O.equals,O.notEquals=function(e){return!this.eq(e)},O.neq=O.notEquals,O.ne=O.notEquals,O.lessThan=function(e){return this.comp(e)<0},O.lt=O.lessThan,O.lessThanOrEqual=function(e){return this.comp(e)<=0},O.lte=O.lessThanOrEqual,O.le=O.lessThanOrEqual,O.greaterThan=function(e){return this.comp(e)>0},O.gt=O.greaterThan,O.greaterThanOrEqual=function(e){return this.comp(e)>=0},O.gte=O.greaterThanOrEqual,O.ge=O.greaterThanOrEqual,O.compare=function(e){if(o(e)||(e=f(e)),this.eq(e))return 0;var t=this.isNegative(),n=e.isNegative();return t&&!n?-1:!t&&n?1:this.unsigned?e.high>>>0>this.high>>>0||e.high===this.high&&e.low>>>0>this.low>>>0?-1:1:this.sub(e).isNegative()?-1:1},O.comp=O.compare,O.negate=function(){return!this.unsigned&&this.eq(y)?y:this.not().add(w)},O.neg=O.negate,O.add=function(e){o(e)||(e=f(e));var t=this.high>>>16,n=65535&this.high,s=this.low>>>16,r=65535&this.low,i=e.high>>>16,a=65535&e.high,d=e.low>>>16,l=0,c=0,p=0,m=0;return p+=(m+=r+(65535&e.low))>>>16,c+=(p+=s+d)>>>16,l+=(c+=n+a)>>>16,l+=t+i,u((p&=65535)<<16|(m&=65535),(l&=65535)<<16|(c&=65535),this.unsigned)},O.subtract=function(e){return o(e)||(e=f(e)),this.add(e.neg())},O.sub=O.subtract,O.multiply=function(e){if(this.isZero())return j;if(o(e)||(e=f(e)),n)return u(n.mul(this.low,this.high,e.low,e.high),n.get_high(),this.unsigned);if(e.isZero())return j;if(this.eq(y))return e.isOdd()?y:j;if(e.eq(y))return this.isOdd()?y:j;if(this.isNegative())return e.isNegative()?this.neg().mul(e.neg()):this.neg().mul(e).neg();if(e.isNegative())return this.mul(e.neg()).neg();if(this.lt(b)&&e.lt(b))return d(this.toNumber()*e.toNumber(),this.unsigned);var t=this.high>>>16,s=65535&this.high,r=this.low>>>16,i=65535&this.low,a=e.high>>>16,l=65535&e.high,c=e.low>>>16,p=65535&e.low,m=0,h=0,g=0,w=0;return g+=(w+=i*p)>>>16,h+=(g+=r*p)>>>16,g&=65535,h+=(g+=i*c)>>>16,m+=(h+=s*p)>>>16,h&=65535,m+=(h+=r*c)>>>16,h&=65535,m+=(h+=i*l)>>>16,m+=t*p+s*c+r*l+i*a,u((g&=65535)<<16|(w&=65535),(m&=65535)<<16|(h&=65535),this.unsigned)},O.mul=O.multiply,O.divide=function(e){if(o(e)||(e=f(e)),e.isZero())throw Error("division by zero");var t,s,r;if(n)return this.unsigned||-2147483648!==this.high||-1!==e.low||-1!==e.high?u((this.unsigned?n.div_u:n.div_s)(this.low,this.high,e.low,e.high),n.get_high(),this.unsigned):this;if(this.isZero())return this.unsigned?g:j;if(this.unsigned){if(e.unsigned||(e=e.toUnsigned()),e.gt(this))return g;if(e.gt(this.shru(1)))return _;r=g}else{if(this.eq(y))return e.eq(w)||e.eq(k)?y:e.eq(y)?w:(t=this.shr(1).div(e).shl(1)).eq(j)?e.isNegative()?w:k:(s=this.sub(e.mul(t)),r=t.add(s.div(e)));if(e.eq(y))return this.unsigned?g:j;if(this.isNegative())return e.isNegative()?this.neg().div(e.neg()):this.neg().div(e).neg();if(e.isNegative())return this.div(e.neg()).neg();r=j}for(s=this;s.gte(e);){t=Math.max(1,Math.floor(s.toNumber()/e.toNumber()));for(var i=Math.ceil(Math.log(t)/Math.LN2),a=i<=48?1:l(2,i-48),c=d(t),p=c.mul(e);p.isNegative()||p.gt(s);)p=(c=d(t-=a,this.unsigned)).mul(e);c.isZero()&&(c=w),r=r.add(c),s=s.sub(p)}return r},O.div=O.divide,O.modulo=function(e){return o(e)||(e=f(e)),n?u((this.unsigned?n.rem_u:n.rem_s)(this.low,this.high,e.low,e.high),n.get_high(),this.unsigned):this.sub(this.div(e).mul(e))},O.mod=O.modulo,O.rem=O.modulo,O.not=function(){return u(~this.low,~this.high,this.unsigned)},O.and=function(e){return o(e)||(e=f(e)),u(this.low&e.low,this.high&e.high,this.unsigned)},O.or=function(e){return o(e)||(e=f(e)),u(this.low|e.low,this.high|e.high,this.unsigned)},O.xor=function(e){return o(e)||(e=f(e)),u(this.low^e.low,this.high^e.high,this.unsigned)},O.shiftLeft=function(e){return o(e)&&(e=e.toInt()),0==(e&=63)?this:e<32?u(this.low<>>32-e,this.unsigned):u(0,this.low<>>e|this.high<<32-e,this.high>>e,this.unsigned):u(this.high>>e-32,this.high>=0?0:-1,this.unsigned)},O.shr=O.shiftRight,O.shiftRightUnsigned=function(e){if(o(e)&&(e=e.toInt()),0===(e&=63))return this;var t=this.high;return e<32?u(this.low>>>e|t<<32-e,t>>>e,this.unsigned):u(32===e?t:t>>>e-32,0,this.unsigned)},O.shru=O.shiftRightUnsigned,O.shr_u=O.shiftRightUnsigned,O.toSigned=function(){return this.unsigned?u(this.low,this.high,!1):this},O.toUnsigned=function(){return this.unsigned?this:u(this.low,this.high,!0)},O.toBytes=function(e){return e?this.toBytesLE():this.toBytesBE()},O.toBytesLE=function(){var e=this.high,t=this.low;return[255&t,t>>>8&255,t>>>16&255,t>>>24,255&e,e>>>8&255,e>>>16&255,e>>>24]},O.toBytesBE=function(){var e=this.high,t=this.low;return[e>>>24,e>>>16&255,e>>>8&255,255&e,t>>>24,t>>>16&255,t>>>8&255,255&t]},s.fromBytes=function(e,t,n){return n?s.fromBytesLE(e,t):s.fromBytesBE(e,t)},s.fromBytesLE=function(e,t){return new s(e[0]|e[1]<<8|e[2]<<16|e[3]<<24,e[4]|e[5]<<8|e[6]<<16|e[7]<<24,t)},s.fromBytesBE=function(e,t){return new s(e[4]<<24|e[5]<<16|e[6]<<8|e[7],e[0]<<24|e[1]<<16|e[2]<<8|e[3],t)}},"./node_modules/process/browser.js": +/*!*****************************************!*\ + !*** ./node_modules/process/browser.js ***! + \*****************************************/ +/*! no static exports found */function(e,t){var n,s,o=e.exports={};function r(){throw new Error("setTimeout has not been defined")}function i(){throw new Error("clearTimeout has not been defined")}function a(e){if(n===setTimeout)return setTimeout(e,0);if((n===r||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:r}catch(e){n=r}try{s="function"==typeof clearTimeout?clearTimeout:i}catch(e){s=i}}();var d,u=[],l=!1,c=-1;function f(){l&&d&&(l=!1,d.length?u=d.concat(u):c=-1,u.length&&p())}function p(){if(!l){var e=a(f);l=!0;for(var t=u.length;t;){for(d=u,u=[];++c1)for(var n=1;n>>0,t=(s*=t)>>>0,t+=4294967296*(s-=t)}return 2.3283064365386963e-10*(t>>>0)});n.next=function(){var e=2091639*n.s0+2.3283064365386963e-10*n.c;return n.s0=n.s1,n.s1=n.s2,n.s2=e-(n.c=0|e)},n.c=1,n.s0=s(" "),n.s1=s(" "),n.s2=s(" "),n.s0-=s(e),n.s0<0&&(n.s0+=1),n.s1-=s(e),n.s1<0&&(n.s1+=1),n.s2-=s(e),n.s2<0&&(n.s2+=1),s=null}function a(e,t){return t.c=e.c,t.s0=e.s0,t.s1=e.s1,t.s2=e.s2,t}function d(e,t){var n=new i(e),s=t&&t.state,o=n.next;return o.int32=function(){return 4294967296*n.next()|0},o.double=function(){return o()+11102230246251565e-32*(2097152*o()|0)},o.quick=o,s&&("object"==typeof s&&a(s,n),o.state=function(){return a(n,{})}),o}o&&o.exports?o.exports=d:n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js")&&n(/*! !webpack amd options */"./node_modules/webpack/buildin/amd-options.js")?void 0===(s=function(){return d}.call(t,n,t,o))||(o.exports=s):this.alea=d}(0,e,n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js"))}).call(this,n(/*! ./../../webpack/buildin/module.js */"./node_modules/webpack/buildin/module.js")(e))},"./node_modules/seedrandom/lib/tychei.js": +/*!***********************************************!*\ + !*** ./node_modules/seedrandom/lib/tychei.js ***! + \***********************************************/ +/*! no static exports found */function(e,t,n){(function(e){var s;!function(e,o,r){function i(e){var t=this,n="";t.next=function(){var e=t.b,n=t.c,s=t.d,o=t.a;return e=e<<25^e>>>7^n,n=n-s|0,s=s<<24^s>>>8^o,o=o-e|0,t.b=e=e<<20^e>>>12^n,t.c=n=n-s|0,t.d=s<<16^n>>>16^o,t.a=o-e|0},t.a=0,t.b=0,t.c=-1640531527,t.d=1367130551,e===Math.floor(e)?(t.a=e/4294967296|0,t.b=0|e):n+=e;for(var s=0;s>>0)/4294967296};return o.double=function(){do{var e=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},o.int32=n.next,o.quick=o,s&&("object"==typeof s&&a(s,n),o.state=function(){return a(n,{})}),o}o&&o.exports?o.exports=d:n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js")&&n(/*! !webpack amd options */"./node_modules/webpack/buildin/amd-options.js")?void 0===(s=function(){return d}.call(t,n,t,o))||(o.exports=s):this.tychei=d}(0,e,n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js"))}).call(this,n(/*! ./../../webpack/buildin/module.js */"./node_modules/webpack/buildin/module.js")(e))},"./node_modules/seedrandom/lib/xor128.js": +/*!***********************************************!*\ + !*** ./node_modules/seedrandom/lib/xor128.js ***! + \***********************************************/ +/*! no static exports found */function(e,t,n){(function(e){var s;!function(e,o,r){function i(e){var t=this,n="";t.x=0,t.y=0,t.z=0,t.w=0,t.next=function(){var e=t.x^t.x<<11;return t.x=t.y,t.y=t.z,t.z=t.w,t.w^=t.w>>>19^e^e>>>8},e===(0|e)?t.x=e:n+=e;for(var s=0;s>>0)/4294967296};return o.double=function(){do{var e=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},o.int32=n.next,o.quick=o,s&&("object"==typeof s&&a(s,n),o.state=function(){return a(n,{})}),o}o&&o.exports?o.exports=d:n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js")&&n(/*! !webpack amd options */"./node_modules/webpack/buildin/amd-options.js")?void 0===(s=function(){return d}.call(t,n,t,o))||(o.exports=s):this.xor128=d}(0,e,n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js"))}).call(this,n(/*! ./../../webpack/buildin/module.js */"./node_modules/webpack/buildin/module.js")(e))},"./node_modules/seedrandom/lib/xor4096.js": +/*!************************************************!*\ + !*** ./node_modules/seedrandom/lib/xor4096.js ***! + \************************************************/ +/*! no static exports found */function(e,t,n){(function(e){var s;!function(e,o,r){function i(e){var t=this;t.next=function(){var e,n,s=t.w,o=t.X,r=t.i;return t.w=s=s+1640531527|0,n=o[r+34&127],e=o[r=r+1&127],n^=n<<13,e^=e<<17,n^=n>>>15,e^=e>>>12,n=o[r]=n^e,t.i=r,n+(s^s>>>16)|0},function(e,t){var n,s,o,r,i,a=[],d=128;for(t===(0|t)?(s=t,t=null):(t+="\0",s=0,d=Math.max(d,t.length)),o=0,r=-32;r>>15,s^=s<<4,s^=s>>>13,r>=0&&(i=i+1640531527|0,o=0==(n=a[127&r]^=s+i)?o+1:0);for(o>=128&&(a[127&(t&&t.length||0)]=-1),o=127,r=512;r>0;--r)s=a[o+34&127],n=a[o=o+1&127],s^=s<<13,n^=n<<17,s^=s>>>15,n^=n>>>12,a[o]=s^n;e.w=i,e.X=a,e.i=o}(t,e)}function a(e,t){return t.i=e.i,t.w=e.w,t.X=e.X.slice(),t}function d(e,t){null==e&&(e=+new Date);var n=new i(e),s=t&&t.state,o=function(){return(n.next()>>>0)/4294967296};return o.double=function(){do{var e=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},o.int32=n.next,o.quick=o,s&&(s.X&&a(s,n),o.state=function(){return a(n,{})}),o}o&&o.exports?o.exports=d:n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js")&&n(/*! !webpack amd options */"./node_modules/webpack/buildin/amd-options.js")?void 0===(s=function(){return d}.call(t,n,t,o))||(o.exports=s):this.xor4096=d}(0,e,n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js"))}).call(this,n(/*! ./../../webpack/buildin/module.js */"./node_modules/webpack/buildin/module.js")(e))},"./node_modules/seedrandom/lib/xorshift7.js": +/*!**************************************************!*\ + !*** ./node_modules/seedrandom/lib/xorshift7.js ***! + \**************************************************/ +/*! no static exports found */function(e,t,n){(function(e){var s;!function(e,o,r){function i(e){var t=this;t.next=function(){var e,n,s=t.x,o=t.i;return e=s[o],n=(e^=e>>>7)^e<<24,n^=(e=s[o+1&7])^e>>>10,n^=(e=s[o+3&7])^e>>>3,n^=(e=s[o+4&7])^e<<7,e=s[o+7&7],n^=(e^=e<<13)^e<<9,s[o]=n,t.i=o+1&7,n},function(e,t){var n,s=[];if(t===(0|t))s[0]=t;else for(t=""+t,n=0;n0;--n)e.next()}(t,e)}function a(e,t){return t.x=e.x.slice(),t.i=e.i,t}function d(e,t){null==e&&(e=+new Date);var n=new i(e),s=t&&t.state,o=function(){return(n.next()>>>0)/4294967296};return o.double=function(){do{var e=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},o.int32=n.next,o.quick=o,s&&(s.x&&a(s,n),o.state=function(){return a(n,{})}),o}o&&o.exports?o.exports=d:n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js")&&n(/*! !webpack amd options */"./node_modules/webpack/buildin/amd-options.js")?void 0===(s=function(){return d}.call(t,n,t,o))||(o.exports=s):this.xorshift7=d}(0,e,n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js"))}).call(this,n(/*! ./../../webpack/buildin/module.js */"./node_modules/webpack/buildin/module.js")(e))},"./node_modules/seedrandom/lib/xorwow.js": +/*!***********************************************!*\ + !*** ./node_modules/seedrandom/lib/xorwow.js ***! + \***********************************************/ +/*! no static exports found */function(e,t,n){(function(e){var s;!function(e,o,r){function i(e){var t=this,n="";t.next=function(){var e=t.x^t.x>>>2;return t.x=t.y,t.y=t.z,t.z=t.w,t.w=t.v,(t.d=t.d+362437|0)+(t.v=t.v^t.v<<4^e^e<<1)|0},t.x=0,t.y=0,t.z=0,t.w=0,t.v=0,e===(0|e)?t.x=e:n+=e;for(var s=0;s>>4),t.next()}function a(e,t){return t.x=e.x,t.y=e.y,t.z=e.z,t.w=e.w,t.v=e.v,t.d=e.d,t}function d(e,t){var n=new i(e),s=t&&t.state,o=function(){return(n.next()>>>0)/4294967296};return o.double=function(){do{var e=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},o.int32=n.next,o.quick=o,s&&("object"==typeof s&&a(s,n),o.state=function(){return a(n,{})}),o}o&&o.exports?o.exports=d:n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js")&&n(/*! !webpack amd options */"./node_modules/webpack/buildin/amd-options.js")?void 0===(s=function(){return d}.call(t,n,t,o))||(o.exports=s):this.xorwow=d}(0,e,n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js"))}).call(this,n(/*! ./../../webpack/buildin/module.js */"./node_modules/webpack/buildin/module.js")(e))},"./node_modules/seedrandom/seedrandom.js": +/*!***********************************************!*\ + !*** ./node_modules/seedrandom/seedrandom.js ***! + \***********************************************/ +/*! no static exports found */function(e,t,n){var s;!function(o,r){var i,a=this,d=256,u=r.pow(d,6),l=r.pow(2,52),c=2*l,f=255;function p(e,t,n){var s=[],f=j(b((t=1==t?{entropy:!0}:t||{}).entropy?[e,g(o)]:null==e?function(){try{var e;return i&&(e=i.randomBytes)?e=e(d):(e=new Uint8Array(d),(a.crypto||a.msCrypto).getRandomValues(e)),g(e)}catch(e){var t=a.navigator,n=t&&t.plugins;return[+new Date,a,n,a.screen,g(o)]}}():e,3),s),p=new m(s),w=function(){for(var e=p.g(6),t=u,n=0;e=c;)e/=2,t/=2,n>>>=1;return(e+n)/t};return w.int32=function(){return 0|p.g(4)},w.quick=function(){return p.g(4)/4294967296},w.double=w,j(g(p.S),o),(t.pass||n||function(e,t,n,s){return s&&(s.S&&h(s,p),e.state=function(){return h(p,{})}),n?(r.random=e,t):e})(w,f,"global"in t?t.global:this==r,t.state)}function m(e){var t,n=e.length,s=this,o=0,r=s.i=s.j=0,i=s.S=[];for(n||(e=[n++]);o=0&&(e._idleTimeoutId=setTimeout((function(){e._onTimeout&&e._onTimeout()}),t))},n(/*! setimmediate */"./node_modules/setimmediate/setImmediate.js"),t.setImmediate="undefined"!=typeof self&&self.setImmediate||"undefined"!=typeof e&&e.setImmediate||this&&this.setImmediate,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||"undefined"!=typeof e&&e.clearImmediate||this&&this.clearImmediate}).call(this,n(/*! ./../webpack/buildin/global.js */"./node_modules/webpack/buildin/global.js"))},"./node_modules/webpack/buildin/amd-define.js": +/*!***************************************!*\ + !*** (webpack)/buildin/amd-define.js ***! + \***************************************/ +/*! no static exports found */function(e,t){e.exports=function(){throw new Error("define cannot be used indirect")}},"./node_modules/webpack/buildin/amd-options.js": +/*!****************************************!*\ + !*** (webpack)/buildin/amd-options.js ***! + \****************************************/ +/*! no static exports found */function(e,t){(function(t){e.exports=t}).call(this,{})},"./node_modules/webpack/buildin/global.js": +/*!***********************************!*\ + !*** (webpack)/buildin/global.js ***! + \***********************************/ +/*! no static exports found */function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(e){"object"==typeof window&&(n=window)}e.exports=n},"./node_modules/webpack/buildin/module.js": +/*!***********************************!*\ + !*** (webpack)/buildin/module.js ***! + \***********************************/ +/*! no static exports found */function(e,t){e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children||(e.children=[]),Object.defineProperty(e,"loaded",{enumerable:!0,get:function(){return e.l}}),Object.defineProperty(e,"id",{enumerable:!0,get:function(){return e.i}}),e.webpackPolyfill=1),e}},"./src/main.js": +/*!*********************!*\ + !*** ./src/main.js ***! + \*********************/ +/*! no exports provided */function(e,t,n){"use strict";n.r(t),function(e){var t=n(/*! ./ml */"./src/ml.ts"),s=n(/*! ./nn/context */"./src/nn/context.ts"),o=n(/*! ./nn/graph */"./src/nn/graph.ts"),r=n(/*! ./nn/graph_builder */"./src/nn/graph_builder.ts"),i=n(/*! ./nn/operand */"./src/nn/operand.ts");null==navigator.ml&&(navigator.ml=new t.ML),null==e.ML&&(e.ML=t.ML),null==e.MLContext&&(e.MLContext=s.MLContext),null==e.MLGraphBuilder&&(e.MLGraphBuilder=r.MLGraphBuilder),null==e.MLGraph&&(e.MLGraph=o.MLGraph),null==e.MLOperand&&(e.MLOperand=i.MLOperand)}.call(this,n(/*! ./../node_modules/webpack/buildin/global.js */"./node_modules/webpack/buildin/global.js"))},"./src/ml.ts": +/*!*******************!*\ + !*** ./src/ml.ts ***! + \*******************/ +/*! exports provided: ML */function(e,t,n){"use strict";n.r(t),n.d(t,"ML",(function(){return o}));var s=n(/*! ./nn/context */"./src/nn/context.ts");class o{constructor(){}createContext(e={}){return new s.MLContext(e)}}},"./src/nn/context.ts": +/*!***************************!*\ + !*** ./src/nn/context.ts ***! + \***************************/ +/*! exports provided: MLPowerPreference, MLDevicePreference, MLContext */function(e,t,n){"use strict";n.r(t),n.d(t,"MLPowerPreference",(function(){return s})),n.d(t,"MLDevicePreference",(function(){return o})),n.d(t,"MLContext",(function(){return d}));n(/*! @tensorflow/tfjs-backend-webgl */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/index.js"),n(/*! @tensorflow/tfjs-backend-cpu */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/index.js");var s,o,r=n(/*! @tensorflow/tfjs-backend-wasm */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/index.js"),i=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),a=n(/*! ./utils */"./src/nn/utils.ts");!function(e){e.default="default",e["high-performance"]="high-performance",e["low-power"]="low-power"}(s||(s={})),function(e){e.default="default",e.gpu="gpu",e.cpu="cpu"}(o||(o={}));class d{constructor(e={}){a.assert(e instanceof Object,"Invalid options."),void 0!==e.powerPreference&&a.assert(e.powerPreference in s,"Invalid power preference."),this.options_=e}get options(){return this.options_}get tf(){return r.setWasmPaths(`https://unpkg.com/@tensorflow/tfjs-backend-wasm@${i.version_core}/dist/`),i}}},"./src/nn/graph.ts": +/*!*************************!*\ + !*** ./src/nn/graph.ts ***! + \*************************/ +/*! exports provided: ExecutionContext, MLGraph */function(e,t,n){"use strict";n.r(t),n.d(t,"ExecutionContext",(function(){return i})),n.d(t,"MLGraph",(function(){return a}));n(/*! @tensorflow/tfjs-backend-webgl */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/index.js"),n(/*! @tensorflow/tfjs-backend-cpu */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/index.js"),n(/*! @tensorflow/tfjs-backend-wasm */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/index.js");var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./operand */"./src/nn/operand.ts"),r=n(/*! ./utils */"./src/nn/utils.ts");class i{constructor(e,t,n,s){this.constantTenosrs_=e,this.operandRefs_=s,this.allocateInputTensors(t,n),this.outputTensors_=new Map,this.outputOperands_=new Set}allocateInputTensors(e,t){this.inputTensors_=new Map;for(const n in t){const s=t[n],o=e.get(n);let i,a;void 0!==s.dimensions?(i={type:o.desc.type,dimensions:s.dimensions},a=s.resource):(i=o.desc,a=s),this.inputTensors_.set(o,{ref:this.operandRefs_.get(o),tensor:r.createTensor(i,a)})}}compute(e){for(const t of e.values())this.outputOperands_.add(t);const t={};for(const n of e.keys())t[n]=this.getTensor(e.get(n));return t}setOutputTensor(e,t){r.assert(!this.outputTensors_.has(e),"MLOutput already has tensor."),this.outputTensors_.set(e,{ref:this.operandRefs_.get(e),tensor:t})}releaseTensor(e){let t;if(e instanceof o.InputOperand)t=this.inputTensors_;else{if(!(e instanceof o.OutputOperand))return;if(this.outputOperands_.has(e))return;t=this.outputTensors_}const n=t.get(e);r.assert(void 0!==n,"No tensor found for operand."),n.ref--,0===n.ref&&(s.dispose(n.tensor),t.delete(e))}getTensor(e){if(e instanceof o.ConstantOperand)return this.constantTenosrs_.get(e);if(e instanceof o.InputOperand)return this.inputTensors_.get(e).tensor;if(e instanceof o.OutputOperand)return this.outputTensors_.has(e)||(e.operation.compute(this),r.assert(this.outputTensors_.has(e),"No output is set.")),this.outputTensors_.get(e).tensor;throw new Error("The operand is invalid.")}}class a{constructor(e){this.inputs_=new Map,this.outputs_=new Map,this.constants_=new Set,this.operandRefs_=new Map,this.constantTensors_=new Map,r.assert(void 0!==e,"Invalid argument");for(const t in e)r.assert("string"==typeof t&&e[t]instanceof o.OutputOperand,"The outputs parameter is invalid."),this.outputs_.set(t,e[t]);r.assert(0!==this.outputs_.size,"The outputs is empty")}compute(e,t){this.validateInputs(e),r.assert(0!==Object.keys(t).length,"The outputs is invalid.");const n=new Map;for(const e in t)r.assert("string"==typeof e&&this.outputs_.has(e),"The name of the output is invalid."),r.assert(r.isTypedArray(t[e]),"Only output of ArrayBufferView type is supported."),n.set(e,this.outputs_.get(e));const o=s.tidy((()=>new i(this.constantTensors_,this.inputs_,e,this.operandRefs_).compute(n)));for(const e of Object.keys(o)){const n=o[e],i=r.createOperandDescriptorFromTensor(n),a=t[e];r.validateTypedArray(a,i.type,i.dimensions),a.set(n.dataSync()),s.dispose(n)}}validateInputs(e){for(const t in e){r.assert("string"==typeof t&&this.inputs_.has(t),"The name of the input is invalid.");const n=this.inputs_.get(t);let s,o;if(void 0!==e[t].dimensions){const i=e[t];s=i.resource,o=i.dimensions,r.assert(void 0!==s,"The resource of input is undefined."),r.assert(!0===r.isIntegerArray(o),"The type of the input dimensions is invalid."),r.assert(o.length===n.desc.dimensions.length,"The rank of the input dimensions is invalid."),r.assert(!r.isDyanmicShape(o),"The value of input dimensions is negative.");for(let e=0;e0&&r.assert(t===o[e],"The value of the input dimensions is invalid.")}}else s=e[t],r.assert(!r.isDyanmicShape(n.desc.dimensions),"The input dimensions is not specified."),o=n.desc.dimensions;r.assert(r.isTypedArray(s),"Only resource of ArrayBufferView type is supported."),r.validateTypedArray(s,n.desc.type,o)}}static buildAndCompile(e){const t=new a(e);return t.build(),t.compile(),t}build(){const e=new Set;for(const t of this.outputs_.values())this.buildOperation(t.operation,e)}buildOperation(e,t){if(!t.has(e)){t.add(e);for(const n of e.inputs()){if(this.operandRefs_.has(n)){let e=this.operandRefs_.get(n);e++,this.operandRefs_.set(n,e)}else this.operandRefs_.set(n,1);if(n instanceof o.InputOperand){if(this.inputs_.has(n.name)){if(this.inputs_.get(n.name)!==n)throw new Error("The name of this input is existed.");continue}this.inputs_.set(n.name,n)}else n instanceof o.ConstantOperand?this.constants_.has(n)||this.constants_.add(n):n instanceof o.OutputOperand&&this.buildOperation(n.operation,t)}}}compile(){this.allocateConstants(),this.computeOnce()}allocateConstants(){for(const e of this.constants_)this.constantTensors_.set(e,r.createTensor(e.desc,e.value))}computeOnce(){const e={};for(const t of this.inputs_.keys()){const n=this.inputs_.get(t),s=n.desc.dimensions.map((e=>e<0?1:e)),o=new(r.getTypedArray(n.desc.type))(r.sizeFromDimensions(n.desc.dimensions));e[t]={resource:o,dimensions:s}}const t=s.tidy((()=>new i(this.constantTensors_,this.inputs_,e,this.operandRefs_).compute(this.outputs_)));for(const e of Object.keys(t)){const n=t[e];n.dataSync(),s.dispose(n)}}dispose(){for(const e of this.constantTensors_.values())s.dispose(e);const e=new Set;for(const t of this.outputs_.values())this.disposeOperation(t.operation,e)}disposeOperation(e,t){if(!t.has(e)){e.dispose(),t.add(e);for(const n of e.inputs())n instanceof o.OutputOperand&&this.disposeOperation(n.operation,t)}}}},"./src/nn/graph_builder.ts": +/*!*********************************!*\ + !*** ./src/nn/graph_builder.ts ***! + \*********************************/ +/*! exports provided: MLInputOperandLayout, MLFilterOperandLayout, MLAutoPad, MLRecurrentNetworkWeightLayout, MLRecurrentNetworkDirection, MLPaddingMode, MLInterpolationMode, MLGraphBuilder */function(e,t,n){"use strict";n.r(t),n.d(t,"MLInputOperandLayout",(function(){return s})),n.d(t,"MLFilterOperandLayout",(function(){return o})),n.d(t,"MLAutoPad",(function(){return r})),n.d(t,"MLRecurrentNetworkWeightLayout",(function(){return i})),n.d(t,"MLRecurrentNetworkDirection",(function(){return a})),n.d(t,"MLPaddingMode",(function(){return d})),n.d(t,"MLInterpolationMode",(function(){return u})),n.d(t,"MLGraphBuilder",(function(){return F}));var s,o,r,i,a,d,u,l=n(/*! ./context */"./src/nn/context.ts"),c=n(/*! ./graph */"./src/nn/graph.ts"),f=n(/*! ./operand */"./src/nn/operand.ts"),p=n(/*! ./ops/batch_norm */"./src/nn/ops/batch_norm.ts"),m=n(/*! ./ops/binary */"./src/nn/ops/binary.ts"),h=n(/*! ./ops/clamp */"./src/nn/ops/clamp.ts"),b=n(/*! ./ops/concat */"./src/nn/ops/concat.ts"),j=n(/*! ./ops/conv2d */"./src/nn/ops/conv2d.ts"),g=n(/*! ./ops/gemm */"./src/nn/ops/gemm.ts"),w=n(/*! ./ops/gru */"./src/nn/ops/gru.ts"),_=n(/*! ./ops/instance_norm */"./src/nn/ops/instance_norm.ts"),k=n(/*! ./ops/leaky_relu */"./src/nn/ops/leaky_relu.ts"),v=n(/*! ./ops/pad */"./src/nn/ops/pad.ts"),x=n(/*! ./ops/pool2d */"./src/nn/ops/pool2d.ts"),y=n(/*! ./ops/reduce */"./src/nn/ops/reduce.ts"),O=n(/*! ./ops/resample */"./src/nn/ops/resample.ts"),I=n(/*! ./ops/reshape */"./src/nn/ops/reshape.ts"),C=n(/*! ./ops/slice */"./src/nn/ops/slice.ts"),S=n(/*! ./ops/softmax */"./src/nn/ops/softmax.ts"),T=n(/*! ./ops/split */"./src/nn/ops/split.ts"),N=n(/*! ./ops/squeeze */"./src/nn/ops/squeeze.ts"),E=n(/*! ./ops/transpose */"./src/nn/ops/transpose.ts"),A=n(/*! ./ops/unary */"./src/nn/ops/unary.ts"),R=n(/*! ./utils */"./src/nn/utils.ts");!function(e){e.nchw="nchw",e.nhwc="nhwc"}(s||(s={})),function(e){e.oihw="oihw",e.hwio="hwio",e.ohwi="ohwi",e.ihwo="ihwo"}(o||(o={})),function(e){e.explicit="explicit",e["same-upper"]="same-upper",e["same-lower"]="same-lower"}(r||(r={})),function(e){e.zrn="zrn",e.rzn="rzn"}(i||(i={})),function(e){e.forward="forward",e.backward="backward",e.both="both"}(a||(a={})),function(e){e.constant="constant",e.edge="edge",e.reflection="reflection",e.symmetric="symmetric"}(d||(d={})),function(e){e["nearest-neighbor"]="nearest-neighbor",e.linear="linear"}(u||(u={}));class F{constructor(e){R.assert(e instanceof l.MLContext,"The context paramter is invalid."),this.context_=e}get context(){return this.context_}build(e){return c.MLGraph.buildAndCompile(e)}input(e,t){return new f.InputOperand(e,t,this)}constant(e,t){return"number"==typeof e?(void 0===t&&(t=f.MLOperandType.float32),f.ConstantOperand.createScalar(e,t,this)):f.ConstantOperand.createTensor(e,t,this)}batchNormalization(e,t,n,s={}){return this.validateOperandBuilder([e,t,n,s.scale,s.bias]),new p.BatchNormalization(e,t,n,s).getFusedOutputs()[0]}clamp(e={},t={}){if(e instanceof f.MLOperand){const n=e;return this.validateOperandBuilder([n,t.minValue,t.maxValue]),new h.Clamp(n,t).output}{const t=e;return this.validateOperandBuilder([t.minValue,t.maxValue]),new h.Clamp(void 0,t)}}concat(e,t){return this.validateOperandBuilder(e),new b.Concat(e,t).output}conv2d(e,t,n={}){const s=[e,t];return n.bias&&s.push(n.bias),this.validateOperandBuilder(s),new j.Conv2d(e,t,n).getFusedOutputs()[0]}add(e,t){return this.validateOperandBuilder([e,t]),new m.Add(e,t).output}sub(e,t){return this.validateOperandBuilder([e,t]),new m.Sub(e,t).output}mul(e,t){return this.validateOperandBuilder([e,t]),new m.Mul(e,t).output}div(e,t){return this.validateOperandBuilder([e,t]),new m.Div(e,t).output}max(e,t){return this.validateOperandBuilder([e,t]),new m.Max(e,t).output}min(e,t){return this.validateOperandBuilder([e,t]),new m.Min(e,t).output}pow(e,t){return this.validateOperandBuilder([e,t]),new m.Pow(e,t).output}exp(e){return this.validateOperandBuilder([e]),new A.Exp(e).output}hardSwish(e){return void 0===e?new A.HardSwish(void 0):(this.validateOperandBuilder([e]),new A.HardSwish(e).output)}relu(e){return void 0===e?new A.Relu(void 0):(this.validateOperandBuilder([e]),new A.Relu(e).output)}sigmoid(e){return void 0===e?new A.Sigmoid(void 0):(this.validateOperandBuilder([e]),new A.Sigmoid(e).output)}tanh(e){return void 0===e?new A.Tanh(void 0):(this.validateOperandBuilder([e]),new A.Tanh(e).output)}gemm(e,t,n={}){return this.validateOperandBuilder([e,t,n.c]),g.Gemm.build(this,e,t,n)}gru(e,t,n,s,o,r={}){return this.validateOperandBuilder([e,t,n,r.bias,r.recurrentBias,r.initialHiddenState]),new w.Gru(e,t,n,s,o,r).outputs}gruCell(e,t,n,s,o,r={}){return this.validateOperandBuilder([e,t,n,s,r.bias,r.recurrentBias]),new w.GruCell(e,t,n,s,o,r).output}instanceNormalization(e,t={}){return this.validateOperandBuilder([e,t.bias,t.scale]),new _.InstanceNormalization(e,t).output}leakyRelu(e={},t={}){if(e instanceof f.MLOperand){const n=e;return this.validateOperandBuilder([n]),new k.LeakyRelu(n,t.alpha).output}{const t=e;return new k.LeakyRelu(void 0,t.alpha)}}matmul(e,t){return this.validateOperandBuilder([e,t]),new m.MatMul(e,t).output}pad(e,t,n={}){return this.validateOperandBuilder([e,t]),new v.Pad(e,t,n).output}averagePool2d(e,t={}){return this.validateOperandBuilder([e]),new x.AveragePool2d(e,t).output}l2Pool2d(e,t={}){return this.validateOperandBuilder([e]),new x.L2Pool2d(e,t).output}maxPool2d(e,t={}){return this.validateOperandBuilder([e]),new x.MaxPool2d(e,t).output}reduceL1(e,t={}){return this.validateOperandBuilder([e]),new y.ReduceL1(e,t).output}reduceL2(e,t={}){return this.validateOperandBuilder([e]),new y.ReduceL2(e,t).output}reduceLogSumExp(e,t={}){return this.validateOperandBuilder([e]),new y.ReduceLogSumExp(e,t).output}reduceMax(e,t={}){return this.validateOperandBuilder([e]),new y.ReduceMax(e,t).output}reduceMean(e,t={}){return this.validateOperandBuilder([e]),new y.ReduceMean(e,t).output}reduceMin(e,t={}){return this.validateOperandBuilder([e]),new y.ReduceMin(e,t).output}reduceProduct(e,t={}){return this.validateOperandBuilder([e]),new y.ReduceProduct(e,t).output}reduceSum(e,t={}){return this.validateOperandBuilder([e]),new y.ReduceSum(e,t).output}resample(e,t={}){return this.validateOperandBuilder([e]),new O.Resample(e,t).output}reshape(e,t){return this.validateOperandBuilder([e]),new I.Reshape(e,t).output}slice(e,t,n,s={}){return this.validateOperandBuilder([e]),new C.Slice(e,t,n,s.axes).output}softmax(e){return this.validateOperandBuilder([e]),new S.Softmax(e).output}split(e,t,n={}){return this.validateOperandBuilder([e]),new T.Split(e,t,n).outputs}squeeze(e,t={}){return this.validateOperandBuilder([e]),new N.Squeeze(e,t.axes).output}transpose(e,t={}){return this.validateOperandBuilder([e]),new E.Transpose(e,t.permutation).output}validateOperandBuilder(e){R.assert(e.every((e=>!e||e instanceof f.MLOperand&&e.builder===this)),"The operand is not built by this builder.")}}},"./src/nn/operand.ts": +/*!***************************!*\ + !*** ./src/nn/operand.ts ***! + \***************************/ +/*! exports provided: MLOperandType, MLOperand, InputOperand, ConstantOperand, OutputOperand */function(e,t,n){"use strict";n.r(t),n.d(t,"MLOperandType",(function(){return s})),n.d(t,"MLOperand",(function(){return r})),n.d(t,"InputOperand",(function(){return i})),n.d(t,"ConstantOperand",(function(){return a})),n.d(t,"OutputOperand",(function(){return d}));var s,o=n(/*! ./utils */"./src/nn/utils.ts");!function(e){e.float32="float32",e.float16="float16",e.int32="int32",e.uint32="uint32",e.int8="int8",e.uint8="uint8"}(s||(s={}));class r{constructor(e){this.builder_=e}get builder(){return this.builder_}}class i extends r{constructor(e,t,n){super(n),o.assert("string"==typeof e,"The name parameter is invalid"),this.name=e,o.validateOperandDescriptor(t),this.desc=t}}class a extends r{constructor(e,t,n){super(n),this.desc=e,this.value=t}static createScalar(e,t=s.float32,n){return o.assert(t in s,"The operand type is invalid."),o.validateValueType(e,t),new a({type:t},e,n)}static createTensor(e,t,n){o.assert(o.isTypedArray(t),"Only ArrayBufferView value type is supported.");const s=t;return o.validateOperandDescriptor(e),o.validateTypedArray(s,e.type,e.dimensions),new a(e,s,n)}}class d extends r{constructor(e){super(e.builder),this.operation=e}}},"./src/nn/operation.ts": +/*!*****************************!*\ + !*** ./src/nn/operation.ts ***! + \*****************************/ +/*! exports provided: Operation, SingleOutputOperation */function(e,t,n){"use strict";n.r(t),n.d(t,"Operation",(function(){return r})),n.d(t,"SingleOutputOperation",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./operand */"./src/nn/operand.ts");class r{constructor(e){this.outputs_=[],this.builder_=e}get builder(){return this.builder_}get outputs(){return this.outputs_}compute(e){const t=new Map;for(const n of this.inputs())t.set(n,e.getTensor(n));const n=s.tidy((()=>this.computeImpl(t)));for(let t=0;t=-t.rank,"The axis parameter is invalid.");const n=this.axis_>=0?this.axis_:t.rank+this.axis_,o=e.get(this.mean_);r.assert(1===o.rank,"The mean operand is not 1-D.");const i=e.get(this.variance_);let a,d;r.assert(1===i.rank,"The mean operand is not 1-D."),this.scale_&&(a=e.get(this.scale_),r.assert(1===a.rank,"The scale operand is not 1-D.")),this.bias_&&(d=e.get(this.bias_),r.assert(1===d.rank,"The bias operand is not 1-D."));const u=Array.from(Array(t.rank).keys());return u[n]=t.rank-1,u[t.rank-1]=n,s.transpose(s.batchNorm(s.transpose(t,u),o,i,d,a,this.epsilon_),u)}}},"./src/nn/ops/binary.ts": +/*!******************************!*\ + !*** ./src/nn/ops/binary.ts ***! + \******************************/ +/*! exports provided: Binary, Add, Sub, Mul, Div, Max, Min, Pow, MatMul */function(e,t,n){"use strict";n.r(t),n.d(t,"Binary",(function(){return i})),n.d(t,"Add",(function(){return a})),n.d(t,"Sub",(function(){return d})),n.d(t,"Mul",(function(){return u})),n.d(t,"Div",(function(){return l})),n.d(t,"Max",(function(){return c})),n.d(t,"Min",(function(){return f})),n.d(t,"Pow",(function(){return p})),n.d(t,"MatMul",(function(){return m}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../operation */"./src/nn/operation.ts"),r=n(/*! ../utils */"./src/nn/utils.ts");class i extends o.SingleOutputOperation{constructor(e,t){super(e.builder),r.validateOperand(e),this.a_=e,r.validateOperand(t),this.b_=t}inputs(){return[this.a_,this.b_]}run(e){const t=e.get(this.a_),n=e.get(this.b_);return this.runOp(t,n)}}class a extends i{runOp(e,t){return s.add(e,t)}}class d extends i{runOp(e,t){return s.sub(e,t)}}class u extends i{runOp(e,t){return s.mul(e,t)}}class l extends i{runOp(e,t){return s.div(e,t)}}class c extends i{runOp(e,t){return s.maximum(e,t)}}class f extends i{runOp(e,t){return s.minimum(e,t)}}class p extends i{runOp(e,t){return s.pow(e,t)}}class m extends i{runOp(e,t){if(1===e.rank)return 1===t.rank?s.dot(e,t):s.matMul(s.reshape(e,[1,-1]),t);if(1===t.rank)return s.matMul(e,s.reshape(t,[-1,1]));{const n=e.rank>t.rank?e.rank:t.rank;let o=s.matMul(e,t);return o.rank!==n&&(o=s.reshape(o,[1].concat(o.shape))),o}}}},"./src/nn/ops/clamp.ts": +/*!*****************************!*\ + !*** ./src/nn/ops/clamp.ts ***! + \*****************************/ +/*! exports provided: Clamp */function(e,t,n){"use strict";n.r(t),n.d(t,"Clamp",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../operand */"./src/nn/operand.ts"),r=n(/*! ../operation */"./src/nn/operation.ts"),i=n(/*! ../utils */"./src/nn/utils.ts");class a extends r.SingleOutputOperation{constructor(e,t={}){void 0!==e?(super(e.builder),i.validateOperand(e),this.x_=e):(super(void 0),this.x_=void 0),i.validateOptionalOperand(t.minValue),this.minOperand_=t.minValue,this.minScalarValue_=this.getScalarValue(this.minOperand_,!0),i.validateOptionalOperand(t.maxValue),this.maxOperand_=t.maxValue,this.maxScalarValue_=this.getScalarValue(this.maxOperand_)}get minScalarValue(){return this.minScalarValue_}get maxScalarValue(){return this.maxScalarValue_}getScalarValue(e,t=!1){if(e instanceof o.ConstantOperand){const t=e;if("number"==typeof t.value)return t.value}else if(void 0===e)return t?-1/0:1/0}inputs(){const e=[this.x_];return this.minOperand_&&e.push(this.minOperand_),this.maxOperand_&&e.push(this.maxOperand_),e}run(e){const t=e.get(this.x_);return this.minOperand_?this.maxOperand_?s.minimum(s.maximum(t,e.get(this.minOperand_)),e.get(this.maxOperand_)):s.maximum(t,e.get(this.minOperand_)):this.maxOperand_?s.minimum(t,e.get(this.maxOperand_)):s.clone(t)}apply(e){return this.builder_=e.builder,i.validateOperand(e),this.x_=e,this.createOutput(),this.output}runOp(e){return i.assert(void 0!==this.minScalarValue_&&void 0!==this.maxScalarValue_,"tf.js only supports clipByValue."),s.clipByValue(e,this.minScalarValue_,this.maxScalarValue_)}}},"./src/nn/ops/concat.ts": +/*!******************************!*\ + !*** ./src/nn/ops/concat.ts ***! + \******************************/ +/*! exports provided: Concat */function(e,t,n){"use strict";n.r(t),n.d(t,"Concat",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../operand */"./src/nn/operand.ts"),r=n(/*! ../operation */"./src/nn/operation.ts"),i=n(/*! ../utils */"./src/nn/utils.ts");class a extends r.SingleOutputOperation{constructor(e,t){i.assert(e.every((e=>e instanceof o.MLOperand)),"The parameter is not an operand."),super(e[0].builder),this.inputs_=e,i.assert(i.isInteger(t),"The axis parameter is invalid."),this.axis_=t}inputs(){return this.inputs_}run(e){const t=[];for(const n of this.inputs())t.push(e.get(n));return s.concat(t,this.axis_)}}},"./src/nn/ops/conv2d.ts": +/*!******************************!*\ + !*** ./src/nn/ops/conv2d.ts ***! + \******************************/ +/*! exports provided: Conv2d */function(e,t,n){"use strict";n.r(t),n.d(t,"Conv2d",(function(){return c}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../graph_builder */"./src/nn/graph_builder.ts"),r=n(/*! ../operand */"./src/nn/operand.ts"),i=n(/*! ../operation */"./src/nn/operation.ts"),a=n(/*! ../utils */"./src/nn/utils.ts"),d=n(/*! ./clamp */"./src/nn/ops/clamp.ts"),u=n(/*! ./leaky_relu */"./src/nn/ops/leaky_relu.ts"),l=n(/*! ./unary */"./src/nn/ops/unary.ts");class c extends i.SingleOutputOperation{constructor(e,t,n={}){super(e.builder),a.validateOperand(e),this.input_=e,a.validateOperand(t),this.filter_=t,a.assert(!(n.autoPad===o.MLAutoPad.explicit&&void 0===n.padding),"The padding parameter should be assigned when autoPad is explicit."),this.initOptions(n.padding,n.strides,n.dilations,n.groups,n.inputLayout,n.filterLayout,n.autoPad,n.transpose,n.outputPadding,n.outputSizes,n.bias,n.activation)}initOptions(e=[0,0,0,0],t=[1,1],n=[1,1],s=1,r=o.MLInputOperandLayout.nchw,i=o.MLFilterOperandLayout.oihw,d=o.MLAutoPad.explicit,c=!1,f=[0,0],p,m,h){a.assert(a.isIntegerArray(e)&&4===e.length,"The padding parameter is invalid."),this.padding_=e,a.assert(a.isIntegerArray(t)&&2===t.length,"The strides parameter is invalid."),this.strides_=t,a.assert(a.isIntegerArray(n)&&2===n.length,"The dilations parameter is invalid."),this.dilations_=n,a.assert(a.isInteger(s),"The gourps parameter is invalid."),this.groups_=s,a.assert(r in o.MLInputOperandLayout,"The input layout parameter is invalid."),this.inputLayout_=r,a.assert(i in o.MLFilterOperandLayout,"The filter layout parameter is invalid."),this.filterLayout_=i,a.assert(d in o.MLAutoPad,"The autoPad parameter is invalid."),this.autoPad_=d,this.transpose_=c,this.transpose_?(a.assert(a.isIntegerArray(f)&&2===f.length,"The outputPadding parameter is invalid."),this.outputPadding_=f,a.assert(void 0===p||a.isIntegerArray(p)&&2===p.length,"The outputSizes parameter is invalid."),this.outputSizes_=p):(this.outputPadding_=[0,0],this.outputSizes_=void 0),this.bias_=m,this.bias_&&a.validateOperand(this.bias_),h instanceof l.Relu?(this.fusedActivation_="relu",this.activation_=void 0):this.isRelu6(h)?(this.fusedActivation_="relu6",this.activation_=void 0):h instanceof u.LeakyRelu?(this.fusedActivation_="leakyrelu",this.leakyreluAlpha_=h.alpha,this.activation_=void 0):h instanceof l.Sigmoid?(this.fusedActivation_="sigmoid",this.activation_=void 0):(this.fusedActivation_=void 0,this.activation_=h)}isRelu6(e){if(e instanceof d.Clamp){const t=e;if(Math.abs(t.minScalarValue-0)<1e-5&&Math.abs(t.maxScalarValue-6)<1e-5)return!0}return!1}getFusedOutputs(){return this.activation_?[this.activation_.apply(this.output)]:[this.output]}inputs(){const e=[this.input_,this.filter_];return this.bias_&&e.push(this.bias_),e}run(e){let t,n,i=e.get(this.input_),d=!1;this.bias_&&(n=e.get(this.bias_)),this.inputLayout_===o.MLInputOperandLayout.nchw&&(i=s.transpose(i,[0,2,3,1]));const u=i.shape[3];void 0===this.filterTensor_?(t=e.get(this.filter_),!1===this.transpose_?this.filterLayout_===o.MLFilterOperandLayout.oihw?t=s.transpose(t,[2,3,1,0]):this.filterLayout_===o.MLFilterOperandLayout.ohwi?t=s.transpose(t,[1,2,3,0]):this.filterLayout_===o.MLFilterOperandLayout.ihwo&&(t=s.transpose(t,[1,2,0,3])):this.filterLayout_===o.MLFilterOperandLayout.oihw?t=s.transpose(t,[2,3,0,1]):this.filterLayout_===o.MLFilterOperandLayout.hwio?t=s.transpose(t,[0,1,3,2]):this.filterLayout_===o.MLFilterOperandLayout.ohwi?t=s.transpose(t,[1,2,0,3]):this.filterLayout_===o.MLFilterOperandLayout.ihwo&&(t=s.transpose(t,[1,2,3,0])),1!==this.groups_&&(t=s.transpose(t,[0,1,3,2])),this.filter_ instanceof r.ConstantOperand&&(this.filterTensor_=t,s.keep(this.filterTensor_))):t=this.filterTensor_;const l=a.getPaddings(i,t,this.padding_,this.strides_,this.outputPadding_,this.dilations_,this.autoPad_);let c;if(!1===this.transpose_)if(1===this.groups_)c=s.fused.conv2d({x:i,filter:t,strides:this.strides_,pad:l,dataFormat:"NHWC",dilations:this.dilations_,bias:n,activation:this.fusedActivation_,leakyreluAlpha:this.leakyreluAlpha_}),d=!0;else{if(this.groups_!==u||this.groups_!==t.shape[2])throw new Error(`The tf.js convolution doesn't support groups parameter ${this.groups_}`);if("valid"===l||"same"===l||l instanceof Array&&l[1][0]===l[1][1]&&l[1][0]===l[2][0]&&l[1][0]===l[2][1]){let e;e="valid"===l||"same"===l?l:l[1][0],c=s.fused.depthwiseConv2d({x:i,filter:t,strides:this.strides_,pad:e,dataFormat:"NHWC",dilations:this.dilations_,bias:n,activation:this.fusedActivation_,leakyreluAlpha:this.leakyreluAlpha_}),d=!0}else c=s.depthwiseConv2d(i,t,this.strides_,l,"NHWC",this.dilations_)}else{this.autoPad_!==o.MLAutoPad.explicit&&(this.outputSizes_=[i.shape[1]*this.strides_[0],i.shape[2]*this.strides_[1]]);const e=[i.shape[0],0,0,t.shape[2]];if(void 0===this.outputSizes_)for(let n=0;n<2;++n)e[n+1]=this.strides_[n]*(i.shape[n+1]-1)+this.outputPadding_[n]+((t.shape[n]-1)*this.dilations_[n]+1)-this.padding_[2*n]-this.padding_[2*n+1];else e[1]=this.outputSizes_[0],e[2]=this.outputSizes_[1];c=s.conv2dTranspose(i,t,e,this.strides_,l)}return d||(n&&(c=s.add(c,n)),"relu"===this.fusedActivation_?c=s.relu(c):"relu6"===this.fusedActivation_?c=s.clipByValue(c,0,6):"leakyrelu"===this.fusedActivation_?c=s.leakyRelu(c,this.leakyreluAlpha_):"sigmoid"===this.fusedActivation_?c=s.sigmoid(c):void 0!==this.fusedActivation_&&a.assert(!1,`The ${this.fusedActivation_} is un supported.`)),this.inputLayout_===o.MLInputOperandLayout.nchw&&(c=s.transpose(c,[0,3,1,2])),c}dispose(){this.filterTensor_&&s.dispose(this.filterTensor_)}}},"./src/nn/ops/gemm.ts": +/*!****************************!*\ + !*** ./src/nn/ops/gemm.ts ***! + \****************************/ +/*! exports provided: Gemm */function(e,t,n){"use strict";n.r(t),n.d(t,"Gemm",(function(){return r}));var s=n(/*! ../operand */"./src/nn/operand.ts"),o=n(/*! ../utils */"./src/nn/utils.ts");class r{static build(e,t,n,r={}){o.validateOperand(t),o.validateOperand(n),o.assert(void 0===r.c||"number"==typeof r.c||r.c instanceof s.MLOperand,"The options.c is invalid."),o.assert(void 0===r.aTranspose||o.isBoolean(r.aTranspose),"The options.aTranspose is invalid."),o.assert(void 0===r.bTranspose||o.isBoolean(r.bTranspose),"The options.bTranspose is invalid."),o.assert(void 0===r.alpha||"number"==typeof r.alpha,"The options.alpha is invalid."),o.assert(void 0===r.beta||"number"==typeof r.beta,"The options.beta is invalid."),r.aTranspose&&(t=e.transpose(t)),r.bTranspose&&(n=e.transpose(n));const i=e.constant(void 0===r.alpha?1:r.alpha),a=e.constant(void 0===r.beta?1:r.beta),d=e.matmul(e.mul(i,t),n);return r.c?e.add(d,e.mul(a,r.c)):d}}},"./src/nn/ops/gru.ts": +/*!***************************!*\ + !*** ./src/nn/ops/gru.ts ***! + \***************************/ +/*! exports provided: Gru, GruCell */function(e,t,n){"use strict";n.r(t),n.d(t,"Gru",(function(){return u})),n.d(t,"GruCell",(function(){return l}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../graph_builder */"./src/nn/graph_builder.ts"),r=n(/*! ../operand */"./src/nn/operand.ts"),i=n(/*! ../operation */"./src/nn/operation.ts"),a=n(/*! ../utils */"./src/nn/utils.ts"),d=n(/*! ./unary */"./src/nn/ops/unary.ts");class u extends i.Operation{constructor(e,t,n,s,o,i={}){super(e.builder),a.validateOperand(e),this.input_=e,a.validateOperand(t),this.weight_=t,a.validateOperand(n),this.recurrentWeight_=n,a.assert(a.isInteger(s)&&s>0,"The steps parameter is invalid."),this.steps_=s,a.assert(a.isInteger(o)&&o>0,"The hiddenSize parameter is invalid."),this.hiddenSize_=o,this.initOptions(i.bias,i.recurrentBias,i.initialHiddenState,i.resetAfter,i.returnSequence,i.direction,i.layout,i.activations),this.outputs.push(new r.OutputOperand(this)),this.returnSequence_&&this.outputs_.push(new r.OutputOperand(this))}initOptions(e,t,n,s=!0,r=!1,i=o.MLRecurrentNetworkDirection.forward,u=o.MLRecurrentNetworkWeightLayout.zrn,l=[this.builder.sigmoid(),this.builder.tanh()]){a.validateOptionalOperand(e),this.bias_=e,a.validateOptionalOperand(t),this.recurrentBias_=t,a.validateOptionalOperand(n),this.initialHiddenState_=n,a.assert(a.isBoolean(s),"The resetAfter parameter is not a boolean."),this.resetAfter_=s,a.assert(a.isBoolean(r),"The resetAfter parameter is not a boolean."),this.returnSequence_=r,a.assert(i in o.MLRecurrentNetworkDirection,"The direction parameter is invalid."),this.direction_=i,a.assert(u in o.MLRecurrentNetworkWeightLayout,"The layout parameter is invalid."),this.layout_=u,a.assert(l instanceof Array&&2===l.length&&l.every((e=>e instanceof d.UnaryMLOperator)),"The activations parameter is invalid."),this.activations_=l}inputs(){const e=[this.input_,this.weight_,this.recurrentWeight_];return this.bias_&&e.push(this.bias_),this.recurrentBias_&&e.push(this.recurrentBias_),this.initialHiddenState_&&e.push(this.initialHiddenState_),e}computeImpl(e){const t=e.get(this.input_),n=e.get(this.weight_),r=e.get(this.recurrentWeight_),i=this.bias_?e.get(this.bias_):void 0,a=this.recurrentWeight_?e.get(this.recurrentBias_):void 0,d=this.initialHiddenState_?e.get(this.initialHiddenState_):void 0,u=this.steps_,c=this.hiddenSize_,f=this.resetAfter_,p=this.returnSequence_,m=this.layout_,h=this.activations_,b=this.direction_,j=b===o.MLRecurrentNetworkDirection.both?2:1;let g,w=d;void 0===w&&(w=s.zeros([j,1,c]));const _=[],k=[],v=[],x=[];for(let e=0;e0,"The hiddenSize parameter is invalid."),this.hiddenSize_=o,this.initOptions(r.bias,r.recurrentBias,r.resetAfter,r.layout,r.activations)}initOptions(e,t,n=!0,s=o.MLRecurrentNetworkWeightLayout.zrn,r=[this.builder.sigmoid(),this.builder.tanh()]){a.validateOptionalOperand(e),this.bias_=e,a.validateOptionalOperand(t),this.recurrentBias_=t,a.assert(a.isBoolean(n),"The resetAfter parameter is not a boolean."),this.resetAfter_=n,a.assert(s in o.MLRecurrentNetworkWeightLayout,"The layout parameter is invalid."),this.layout_=s,a.assert(r instanceof Array&&2===r.length&&r.every((e=>e instanceof d.UnaryMLOperator)),"The activations parameter is invalid."),this.activations_=r}inputs(){const e=[this.input_,this.weight_,this.recurrentWeight_,this.hiddenState_];return this.bias_&&e.push(this.bias_),this.recurrentBias_&&e.push(this.recurrentBias_),e}static compute(e,t,n,r,i,a,d,u,l=!0,c=o.MLRecurrentNetworkWeightLayout.zrn){const f=s.scalar(1),p=s.scalar(0),m=c===o.MLRecurrentNetworkWeightLayout.zrn?{z:0,r:i,n:2*i}:{r:0,z:i,n:2*i},h=a[0],b=a[1],j=h.runOp(s.add(s.add(d?s.slice(d,[m.z],[i]):p,u?s.slice(u,[m.z],[i]):p),s.add(s.matMul(e,s.transpose(s.slice(t,[m.z,0],[i,-1]))),s.matMul(r,s.transpose(s.slice(n,[m.z,0],[i,-1])))))),g=h.runOp(s.add(s.add(d?s.slice(d,[m.r],[i]):p,u?s.slice(u,[m.r],[i]):p),s.add(s.matMul(e,s.transpose(s.slice(t,[m.r,0],[i,-1]))),s.matMul(r,s.transpose(s.slice(n,[m.r,0],[i,-1]))))));let w;return w=l?b.runOp(s.add(d?s.slice(d,[m.n],[i]):p,s.add(s.matMul(e,s.transpose(s.slice(t,[m.n,0],[i,-1]))),s.mul(g,s.add(u?s.slice(u,[m.n],[i]):p,s.matMul(r,s.transpose(s.slice(n,[m.n,0],[i,-1])))))))):b.runOp(s.add(s.add(d?s.slice(d,[m.n],[i]):p,u?s.slice(u,[m.n],[i]):p),s.add(s.matMul(e,s.transpose(s.slice(t,[m.n,0],[i,-1]))),s.matMul(s.mul(g,r),s.transpose(s.slice(n,[m.n,0],[i,-1])))))),s.add(s.mul(j,r),s.mul(w,s.sub(f,j)))}run(e){return l.compute(e.get(this.input_),e.get(this.weight_),e.get(this.recurrentWeight_),e.get(this.hiddenState_),this.hiddenSize_,this.activations_,this.bias_?e.get(this.bias_):void 0,this.recurrentBias_?e.get(this.recurrentBias_):void 0,this.resetAfter_,this.layout_)}}},"./src/nn/ops/instance_norm.ts": +/*!*************************************!*\ + !*** ./src/nn/ops/instance_norm.ts ***! + \*************************************/ +/*! exports provided: InstanceNormalization */function(e,t,n){"use strict";n.r(t),n.d(t,"InstanceNormalization",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../graph_builder */"./src/nn/graph_builder.ts"),r=n(/*! ../operation */"./src/nn/operation.ts"),i=n(/*! ../utils */"./src/nn/utils.ts");class a extends r.SingleOutputOperation{constructor(e,t={}){if(super(e.builder),i.validateOperand(e),this.input_=e,i.validateOptionalOperand(t.scale),this.scale_=t.scale,i.validateOptionalOperand(t.bias),this.bias_=t.bias,void 0!==t.epsilon){const e=t.epsilon;i.assert("number"==typeof e,"The epsilon parameter is invalid"),this.epsilon_=e}else this.epsilon_=1e-5;void 0!==t.layout?(i.assert(t.layout in o.MLInputOperandLayout,"The layout parameter is invalid."),this.layout_=t.layout):this.layout_=o.MLInputOperandLayout.nchw}inputs(){const e=[this.input_];return this.scale_&&e.push(this.scale_),this.bias_&&e.push(this.bias_),e}run(e){const t=e.get(this.input_);i.assert(4===t.rank,"The input operand is not 4-D.");let n,r,a=[2,3],d=[1,-1,1,1],u=t.shape[1];this.layout_===o.MLInputOperandLayout.nhwc&&(a=[1,2],d=[1,1,1,-1],u=t.shape[3]),this.scale_&&(n=e.get(this.scale_),i.assert(1===n.rank,"The scale operand is not 1-D."),i.assert(n.shape[0]===u,"The length of scale is not equal to the size of the feature dimension of the input.")),this.bias_&&(r=e.get(this.bias_),i.assert(1===r.rank,"The bias operand is not 1-D."),i.assert(r.shape[0]===u,"The length of bias is not equal to the size of the feature dimension of the input."));const l=s.mean(t,a,!0),c=s.mean(s.pow(s.sub(t,l),2),a,!0),f=s.div(s.sub(t,l),s.sqrt(s.add(c,this.epsilon_))),p=n?s.mul(s.reshape(n,d),f):f;return r?s.add(s.reshape(r,d),p):p}}},"./src/nn/ops/leaky_relu.ts": +/*!**********************************!*\ + !*** ./src/nn/ops/leaky_relu.ts ***! + \**********************************/ +/*! exports provided: LeakyRelu */function(e,t,n){"use strict";n.r(t),n.d(t,"LeakyRelu",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils */"./src/nn/utils.ts"),r=n(/*! ./unary */"./src/nn/ops/unary.ts");class i extends r.UnaryMLOperator{constructor(e,t=.01){super(e),o.assert("number"==typeof t,"The alpha parameter is invalid."),this.alpha_=t}get alpha(){return this.alpha_}runOp(e){return s.leakyRelu(e,this.alpha_)}}},"./src/nn/ops/pad.ts": +/*!***************************!*\ + !*** ./src/nn/ops/pad.ts ***! + \***************************/ +/*! exports provided: Pad */function(e,t,n){"use strict";n.r(t),n.d(t,"Pad",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../graph_builder */"./src/nn/graph_builder.ts"),r=n(/*! ../operation */"./src/nn/operation.ts"),i=n(/*! ../utils */"./src/nn/utils.ts");class a extends r.SingleOutputOperation{constructor(e,t,n={}){super(e.builder),this.mode_=o.MLPaddingMode.constant,this.value_=0,i.validateOperand(e),this.input_=e,i.validateOperand(t),this.padding_=t,void 0!==n.mode&&(i.assert(n.mode in o.MLPaddingMode,"The mode parameter is invalid."),this.mode_=n.mode),void 0!==n.value&&(this.value_=n.value)}inputs(){return[this.input_,this.padding_]}run(e){const t=e.get(this.input_),n=e.get(this.padding_);i.assert(2===n.rank&&"int32"===n.dtype&&n.shape[0]===t.rank,"The padding operand is invalid.");const r=n.arraySync();if(this.mode_===o.MLPaddingMode.constant)return s.pad(t,r,this.value_);if(this.mode_===o.MLPaddingMode.edge){const e=new Array(r.length);let n=t;for(;;){for(let t=0;t0?(e[t][n]=1,r[t][n]-=1):e[t][n]=0}if(e.every((e=>0===e[0]&&0===e[1])))break;n=s.mirrorPad(n,e,"symmetric")}return n}{let e;return this.mode_===o.MLPaddingMode.reflection?e="reflect":this.mode_===o.MLPaddingMode.symmetric&&(e="symmetric"),s.mirrorPad(t,r,e)}}}},"./src/nn/ops/pool2d.ts": +/*!******************************!*\ + !*** ./src/nn/ops/pool2d.ts ***! + \******************************/ +/*! exports provided: Pool, AveragePool2d, MaxPool2d, L2Pool2d */function(e,t,n){"use strict";n.r(t),n.d(t,"Pool",(function(){return a})),n.d(t,"AveragePool2d",(function(){return d})),n.d(t,"MaxPool2d",(function(){return u})),n.d(t,"L2Pool2d",(function(){return l}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../graph_builder */"./src/nn/graph_builder.ts"),r=n(/*! ../operation */"./src/nn/operation.ts"),i=n(/*! ../utils */"./src/nn/utils.ts");class a extends r.SingleOutputOperation{constructor(e,t={}){super(e.builder),i.validateOperand(e),this.input_=e,this.initOptions(t.windowDimensions,t.padding,t.strides,t.dilations,t.layout,t.autoPad)}initOptions(e=[-1,-1],t=[0,0,0,0],n=[1,1],s=[1,1],r=o.MLInputOperandLayout.nchw,a=o.MLAutoPad.explicit){i.assert(i.isIntegerArray(e)&&2===e.length,"The padding parameter is invalid."),this.windowDimensions_=e,i.assert(i.isIntegerArray(t)&&4===t.length,"The padding parameter is invalid."),this.padding_=t,i.assert(i.isIntegerArray(n)&&2===n.length,"The strides parameter is invalid."),this.strides_=n,i.assert(i.isIntegerArray(s)&&2===s.length,"The dilations parameter is invalid."),this.dilations_=s,i.assert(r in o.MLInputOperandLayout,"The layout parameter is invalid."),this.layout_=r,i.assert(a in o.MLAutoPad,"The autoPad parameter is invalid."),this.autoPad_=a}inputs(){return[this.input_]}run(e){let t=e.get(this.input_);const n=this.getPoolingType();this.layout_===o.MLInputOperandLayout.nchw&&(t=s.transpose(t,[0,2,3,1]));const r=this.windowDimensions_;let i,a;if(-1===r[0]&&-1===r[1]&&(r[0]=t.shape[1],r[1]=t.shape[2]),this.autoPad_===o.MLAutoPad.explicit)i=this.padding_.every((e=>0===e))?"valid":[[0,0],[this.padding_[0],this.padding_[1]],[this.padding_[2],this.padding_[3]],[0,0]];else if(this.autoPad_===o.MLAutoPad["same-upper"])i="same";else{i=[[0,0],[0,0],[0,0],[0,0]];const e=[0,0];for(let n=0;n<2;++n)e[n]=Math.ceil(t.shape[1+n]/this.strides_[n]);const n=[0,0];for(let s=0;s<2;++s)n[s]=this.strides_[s]*(e[s]-1)+((r[s]-1)*this.dilations_[s]+1)-t.shape[1+s];for(let e=0;e<2;++e)i[e+1][0]=n[e]-Math.floor(n[e]/2),i[e+1][1]=Math.floor(n[e]/2)}return"l2"===n?(t=s.pow(t,2),a=s.sqrt(s.pool(t,this.windowDimensions_,"avg",i,this.dilations_,this.strides_))):a=s.pool(t,this.windowDimensions_,n,i,this.dilations_,this.strides_),this.layout_===o.MLInputOperandLayout.nchw&&(a=s.transpose(a,[0,3,1,2])),a}}class d extends a{getPoolingType(){return"avg"}}class u extends a{getPoolingType(){return"max"}}class l extends a{getPoolingType(){return"l2"}}},"./src/nn/ops/reduce.ts": +/*!******************************!*\ + !*** ./src/nn/ops/reduce.ts ***! + \******************************/ +/*! exports provided: ReduceLogSumExp, ReduceMax, ReduceMean, ReduceMin, ReduceProduct, ReduceSum, ReduceL1, ReduceL2 */function(e,t,n){"use strict";n.r(t),n.d(t,"ReduceLogSumExp",(function(){return a})),n.d(t,"ReduceMax",(function(){return d})),n.d(t,"ReduceMean",(function(){return u})),n.d(t,"ReduceMin",(function(){return l})),n.d(t,"ReduceProduct",(function(){return c})),n.d(t,"ReduceSum",(function(){return f})),n.d(t,"ReduceL1",(function(){return p})),n.d(t,"ReduceL2",(function(){return m}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../operation */"./src/nn/operation.ts"),r=n(/*! ../utils */"./src/nn/utils.ts");class i extends o.SingleOutputOperation{constructor(e,t={}){super(e.builder),r.validateOperand(e),this.input_=e,void 0!==t.axes?(r.assert(r.isIntegerArray(t.axes),"The axes parameter is invalid."),this.axes_=t.axes):this.axes_=void 0,void 0!==t.keepDimensions?(r.assert(r.isBoolean(t.keepDimensions),"The keepDimensions parameter is not a boolean."),this.keepDimensions_=t.keepDimensions):this.keepDimensions_=!1}inputs(){return[this.input_]}run(e){const t=e.get(this.input_);return r.assert(r.validateAxes(this.axes_,t.rank),`The axes must be in range [-${t.rank}, ${t.rank})`),this.runOp(t,this.axes_,this.keepDimensions_)}}class a extends i{runOp(e,t,n){return s.logSumExp(e,t,n)}}class d extends i{runOp(e,t,n){return s.max(e,t,n)}}class u extends i{runOp(e,t,n){return s.mean(e,t,n)}}class l extends i{runOp(e,t,n){return s.min(e,t,n)}}class c extends i{runOp(e,t,n){return s.prod(e,t,n)}}class f extends i{runOp(e,t,n){return s.sum(e,t,n)}}class p extends i{runOp(e,t,n){return s.sum(s.abs(e),t,n)}}class m extends i{runOp(e,t,n){return s.sqrt(s.sum(s.pow(e,2),t,n))}}},"./src/nn/ops/resample.ts": +/*!********************************!*\ + !*** ./src/nn/ops/resample.ts ***! + \********************************/ +/*! exports provided: Resample */function(e,t,n){"use strict";n.r(t),n.d(t,"Resample",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../graph_builder */"./src/nn/graph_builder.ts"),r=n(/*! ../operation */"./src/nn/operation.ts"),i=n(/*! ../utils */"./src/nn/utils.ts");class a extends r.SingleOutputOperation{constructor(e,t={}){if(super(e.builder),this.mode_=o.MLInterpolationMode["nearest-neighbor"],i.validateOperand(e),this.input_=e,void 0!==t.scales){const e=t.scales;i.assert(e instanceof Array&&e.every((e=>"number"==typeof e))&&4===e.length,"The scales parameter is invalid."),this.scales_=t.scales}void 0!==t.sizes&&(i.assert(i.isIntegerArray(t.sizes)&&4===t.sizes.length,"The sizes parameter is invalid."),this.sizes_=t.sizes,this.scales_=void 0),i.assert(void 0!==this.scales_||void 0!==this.sizes_,"The scales or sizes parameter is not provied."),void 0!==t.mode&&(i.assert(t.mode in o.MLInterpolationMode,"The mode parameter is invalid."),this.mode_=t.mode)}inputs(){return[this.input_]}run(e){let t=e.get(this.input_);i.assert(4===t.rank,"The input tensor is not 4-D.");const n=[0,0];let r,a=!1;if(void 0!==this.sizes_)if(this.sizes_[0]===t.shape[0]&&this.sizes_[1]===t.shape[1])n[0]=this.sizes_[2],n[1]=this.sizes_[3],t=s.transpose(t,[0,2,3,1]),a=!0;else{if(this.sizes_[0]!==t.shape[0]||this.sizes_[3]!==t.shape[3])throw new Error("tf.image.resize doesn't support the sizes parameter.");n[0]=this.sizes_[1],n[1]=this.sizes_[2]}else if(void 0!==this.scales_)if(1===this.scales_[0]&&1===this.scales_[1])n[0]=Math.floor(t.shape[2]*this.scales_[2]),n[1]=Math.floor(t.shape[3]*this.scales_[3]),t=s.transpose(t,[0,2,3,1]),a=!0;else{if(1!==this.scales_[0]||1!==this.scales_[3])throw new Error("tf.image.resize doesn't support the scales parameter.");n[0]=Math.floor(t.shape[1]*this.scales_[1]),n[1]=Math.floor(t.shape[2]*this.scales_[2])}return this.mode_===o.MLInterpolationMode["nearest-neighbor"]?r=s.image.resizeNearestNeighbor(t,n,!1,!0):this.mode_===o.MLInterpolationMode.linear&&(r=s.image.resizeBilinear(t,n,!1,!0)),a&&(r=s.transpose(r,[0,3,1,2])),r}}},"./src/nn/ops/reshape.ts": +/*!*******************************!*\ + !*** ./src/nn/ops/reshape.ts ***! + \*******************************/ +/*! exports provided: Reshape */function(e,t,n){"use strict";n.r(t),n.d(t,"Reshape",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../operation */"./src/nn/operation.ts"),r=n(/*! ../utils */"./src/nn/utils.ts");class i extends o.SingleOutputOperation{constructor(e,t){super(e.builder),r.validateOperand(e),this.input_=e,r.assert(r.isIntegerArray(t)&&0!==t.length,"The newShape parameter is invalid."),this.newShape_=t}inputs(){return[this.input_]}run(e){const t=e.get(this.input_);return s.reshape(t,this.newShape_)}}},"./src/nn/ops/slice.ts": +/*!*****************************!*\ + !*** ./src/nn/ops/slice.ts ***! + \*****************************/ +/*! exports provided: Slice */function(e,t,n){"use strict";n.r(t),n.d(t,"Slice",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../operation */"./src/nn/operation.ts"),r=n(/*! ../utils */"./src/nn/utils.ts");class i extends o.SingleOutputOperation{constructor(e,t,n,s){super(e.builder),r.validateOperand(e),this.input_=e,r.assert(r.isIntegerArray(t),"The starts parameter is invalid."),this.starts_=t,r.assert(r.isIntegerArray(n)&&n.every((e=>e>0||-1===e)),"The sizes parameter is invalid."),this.sizes_=n,r.assert(n.length==n.length,"The length of sizes is not equal to the length of sizes.))"),r.assert(void 0===s||r.isIntegerArray(s),"The axes parameter is invalid."),void 0!==s&&r.assert(n.length===s.length,"The length of axes is invalid.))"),this.axes_=s}inputs(){return[this.input_]}run(e){const t=e.get(this.input_),n=t.shape.length;if(void 0===this.axes_){this.axes_=[];for(let e=0;ee=-n)),"The value of axes is invalid."),r.assert(this.starts_.length===this.axes_.length,"The length of starts is invalid."),r.assert(this.sizes_.length===this.axes_.length,"The length of sizes is invalid.");const o=new Array(this.axes_.length).fill(0),i=new Array(this.axes_.length).fill(-1);for(let e=0;ed(e)))}function l(e){return e instanceof Float32Array||e instanceof Int32Array||e instanceof Uint32Array||e instanceof Int16Array||e instanceof Uint16Array||e instanceof Int8Array||e instanceof Uint8Array}function c(e){if("float32"===e)return Float32Array;if("int32"===e)return Int32Array;if("uint32"===e)return Uint32Array;if("float16"===e)return Uint16Array;if("int8"===e)return Int8Array;if("uint8"===e)return Uint8Array;throw new Error("Type is not supported.")}function f(e){let t;if(e instanceof Float32Array)t=new Float32Array(e.length);else if(e instanceof Int32Array)t=new Int32Array(e.length);else if(e instanceof Uint32Array)t=new Uint32Array(e.length);else if(e instanceof Uint16Array)t=new Uint16Array(e.length);else if(e instanceof Int8Array)t=new Int8Array(e.length);else{if(!(e instanceof Uint8Array))throw new Error("Type is not supported.");t=new Uint8Array(e.length)}return t.set(e),t}function p(e){if("float32"===e)return"float32";if("int32"===e)return"int32";throw new Error("The operand type is not supported by TF.js.")}function m(e){let t;return"float32"===e.dtype?t=r.MLOperandType.float32:"int32"===e.dtype&&(t=r.MLOperandType.int32),{type:t,dimensions:e.shape}}function h(e){i(e.type in r.MLOperandType,"The operand type is invalid."),e.dimensions&&i(u(e.dimensions),"The dimensions is invalid.")}function b(e){return!e.every((e=>e>0))}function j(e,t,n){i(l(e),"The value is not a typed array."),i(e instanceof c(t),"The type of value is invalid."),i(e.length===_(n),`the value length ${e.length} is invalid, size of [${n}] ${_(n)} is expected.`)}function g(e,t){t===r.MLOperandType.int32?i(Number.isInteger(e),"the value is not an int32."):t===r.MLOperandType.uint32?i(Number.isInteger(e)&&e>=0,"the value is not an uint32."):t===r.MLOperandType.int8?i(Number.isInteger(e)&&e>=-128&&e<=127,"the value is not an int8."):t===r.MLOperandType.uint8&&i(Number.isInteger(e)&&e>=0&&e<=255,"the value is not an uint8.")}function w(e,t){const n=p(e.type);if(void 0!==e.dimensions){i(l(t),"Only ArrayBufferView value is supported.");const o=t;j(o,e.type,e.dimensions);const r=f(o);return s.tensor(r,e.dimensions,n)}return"number"==typeof t?(g(t,e.type),s.scalar(t,n)):(j(t,e.type,e.dimensions),s.scalar(t[0],n))}function _(e){return void 0===e||u(e)&&0===e.length?1:e.reduce(((e,t)=>t>0?e*t:e),1)}function k(e,t=""){i(e instanceof r.MLOperand,`The parameter ${t} is not an operand.`)}function v(e,t=""){i(void 0===e||e instanceof r.MLOperand,`The parameter ${t} is not an optional operand.`)}function x(e,t){if("undefined"!=typeof e&&e.length>0)for(let n=0;n=t||e[n]<-t)return!1;return!0}function y(e,t,n,s,r,i,a){let d;if(a===o.MLAutoPad.explicit)d=n.every((e=>0===e))?"valid":[[0,0],[n[0],n[1]],[n[2],n[3]],[0,0]];else if(a===o.MLAutoPad["same-upper"])d="same";else{d=[[0,0],[0,0],[0,0],[0,0]];const n=[0,0];for(let t=0;t<2;++t)n[t]=Math.ceil(e.shape[1+t]/s[t]);const o=[0,0];for(let a=0;a<2;++a)o[a]=s[a]*(n[a]-1)+r[a]+((t.shape[a]-1)*i[a]+1)-e.shape[1+a];for(let e=0;e<2;++e)d[e+1][0]=o[e]-Math.floor(o[e]/2),d[e+1][1]=Math.floor(o[e]/2)}return d}},0: +/*!***************************!*\ + !*** multi ./src/main.js ***! + \***************************/ +/*! no static exports found */function(e,t,n){e.exports=n(/*! ./src/main.js */"./src/main.js")},1: +/*!****************************!*\ + !*** node-fetch (ignored) ***! + \****************************/ +/*! no static exports found */function(e,t){},2: +/*!**********************!*\ + !*** util (ignored) ***! + \**********************/ +/*! no static exports found */function(e,t){},3: +/*!************************!*\ + !*** crypto (ignored) ***! + \************************/ +/*! no static exports found */function(e,t){},4: +/*!**********************!*\ + !*** path (ignored) ***! + \**********************/ +/*! no static exports found */function(e,t){},5: +/*!********************!*\ + !*** fs (ignored) ***! + \********************/ +/*! no static exports found */function(e,t){},6: +/*!********************************!*\ + !*** worker_threads (ignored) ***! + \********************************/ +/*! no static exports found */function(e,t){},7: +/*!****************************!*\ + !*** perf_hooks (ignored) ***! + \****************************/ +/*! no static exports found */function(e,t){},8: +/*!********************!*\ + !*** os (ignored) ***! + \********************/ +/*! no static exports found */function(e,t){}}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9iYWNrZW5kX2NwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2Jhc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9jcHVfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9BYnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0Fjb3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0Fjb3NoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9BZGQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0FkZE4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0FsbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvQW55LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9BcmdNYXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0FyZ01pbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvQXNpbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvQXNpbmguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0F0YW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0F0YW4yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9BdGFuaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvQXZnUG9vbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvQXZnUG9vbDNELmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9BdmdQb29sM0RHcmFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9BdmdQb29sR3JhZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvQmF0Y2hNYXRNdWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0JhdGNoTm9ybS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvQmF0Y2hUb1NwYWNlTkQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0JpbmNvdW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9CaW5jb3VudF9pbXBsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9DYXN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9DZWlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9DbGlwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Db21wbGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Db21wbGV4QWJzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Db25jYXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0NvbmNhdF9pbXBsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Db252MkQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0NvbnYyREJhY2twcm9wRmlsdGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Db252MkRCYWNrcHJvcElucHV0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Db252M0QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0NvbnYzREJhY2twcm9wRmlsdGVyVjIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0NvbnYzREJhY2twcm9wSW5wdXRWMi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvQ29zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Db3NoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Dcm9wQW5kUmVzaXplLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9DdW1zdW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0RlbnNlQmluY291bnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0RlcHRoVG9TcGFjZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRGVwdGh3aXNlQ29udjJkTmF0aXZlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9EZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRGlhZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRGlsYXRpb24yRC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRGlsYXRpb24yREJhY2twcm9wRmlsdGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9EaWxhdGlvbjJEQmFja3Byb3BJbnB1dC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRWluc3VtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9FbHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0VsdUdyYWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0VxdWFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9FcmYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0V4cC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRXhwYW5kRGltcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRXhwbTEuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0ZGVC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRmlsbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRmxpcExlZnRSaWdodC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRmxvb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0Zsb29yRGl2LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9GdXNlZENvbnYyRC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRnVzZWREZXB0aHdpc2VDb252MkQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0dhdGhlck5kLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9HYXRoZXJOZF9JbXBsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9HYXRoZXJWMi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvR2F0aGVyVjJfaW1wbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvR3JlYXRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvR3JlYXRlckVxdWFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9JRkZULmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9JZGVudGl0eS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvSW1hZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvSXNGaW5pdGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0lzSW5mLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Jc05hTi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvTFJOLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9MUk5HcmFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9MZWFreVJlbHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0xlc3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0xlc3NFcXVhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvTGluU3BhY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0xpblNwYWNlX2ltcGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0xvZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvTG9nMXAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0xvZ2ljYWxBbmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0xvZ2ljYWxOb3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0xvZ2ljYWxPci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvTWF4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9NYXhQb29sLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9NYXhQb29sM0QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL01heFBvb2wzREdyYWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL01heFBvb2xHcmFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9NYXhQb29sV2l0aEFyZ21heC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvTWF4UG9vbFdpdGhBcmdtYXhfaW1wbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvTWF4X2ltcGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL01heGltdW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL01lYW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL01pbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvTWluaW11bS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvTWlycm9yUGFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Nb2QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL011bHRpbm9taWFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9NdWx0aXBseS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvTmVnLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Ob25NYXhTdXBwcmVzc2lvblYzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Ob25NYXhTdXBwcmVzc2lvblY0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Ob25NYXhTdXBwcmVzc2lvblY1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Ob3RFcXVhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvT25lSG90LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9PbmVzTGlrZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvUGFjay5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvUGFkVjIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1Bvdy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvUHJlbHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1Byb2QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1JhbmdlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9SYW5nZV9pbXBsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9SZWFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9SZWFsRGl2LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9SZWNpcHJvY2FsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9SZWx1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9SZWx1Ni5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvUmVzaGFwZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvUmVzaXplQmlsaW5lYXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1Jlc2l6ZUJpbGluZWFyR3JhZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvUmVzaXplTmVhcmVzdE5laWdoYm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9SZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9SZXZlcnNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Sb3RhdGVXaXRoT2Zmc2V0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Sb3VuZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvUnNxcnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1NjYXR0ZXJOZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU2NhdHRlcl9pbXBsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9TZWxlY3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1NlbHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1NpZ21vaWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1NpZ24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1Npbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU2luaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU2xpY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1NvZnRtYXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1NvZnRwbHVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9TcGFjZVRvQmF0Y2hORC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU3BhcnNlRmlsbEVtcHR5Um93cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU3BhcnNlRmlsbEVtcHR5Um93c19pbXBsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9TcGFyc2VSZXNoYXBlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9TcGFyc2VSZXNoYXBlX2ltcGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1NwYXJzZVNlZ21lbnRNZWFuLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9TcGFyc2VTZWdtZW50UmVkdWN0aW9uX2ltcGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1NwYXJzZVNlZ21lbnRTdW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1NwYXJzZVRvRGVuc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1NwbGl0Vi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU3FydC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU3F1YXJlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9TcXVhcmVkRGlmZmVyZW5jZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU3RlcC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU3RyaWRlZFNsaWNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9TdHJpZGVkU2xpY2VfaW1wbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU3RyaW5nTkdyYW1zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9TdHJpbmdOR3JhbXNfaW1wbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU3RyaW5nU3BsaXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1N0cmluZ1NwbGl0X2ltcGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1N0cmluZ1RvSGFzaEJ1Y2tldEZhc3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1N0cmluZ1RvSGFzaEJ1Y2tldEZhc3RfaW1wbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU3ViLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9TdW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1Rhbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvVGFuaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvVGlsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvVGlsZV9pbXBsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Ub3BLLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Ub3BLX2ltcGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1RyYW5zZm9ybS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvVHJhbnNwb3NlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9UcmFuc3Bvc2VfaW1wbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvVW5pcXVlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9VbmlxdWVfaW1wbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvVW5wYWNrLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9VbnNvcnRlZFNlZ21lbnRTdW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1plcm9zTGlrZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvX0Z1c2VkTWF0TXVsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3QvcmVnaXN0ZXJfYWxsX2tlcm5lbHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9zaGFyZWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC91dGlscy9iaW5hcnlfaW1wbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L3V0aWxzL2JpbmFyeV91dGlscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L3V0aWxzL2ZmdF91dGlscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L3V0aWxzL2Z1c2VkX3V0aWxzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3QvdXRpbHMvcG9vbF91dGlscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L3V0aWxzL3VuYXJ5X2ltcGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC91dGlscy91bmFyeV91dGlscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L3V0aWxzL3plcm9zX2ltcGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC92ZXJzaW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2JhY2tlbmRfd2FzbS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9iYXNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2ZsYWdzX3dhc20uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVsX3V0aWxzL3NoYXJlZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0Ficy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0FkZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0FkZE4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9BbGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9BbnkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9BcmdNYXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9BdmdQb29sLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvQmF0Y2hNYXRNdWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9CYXRjaFRvU3BhY2VORC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0Nhc3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9DZWlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvQ2xpcEJ5VmFsdWUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9Db25jYXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9Db252MkQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9Db252MkRCYWNrcHJvcElucHV0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvQ29zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvQ29zaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0Nyb3BBbmRSZXNpemUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9DdW1zdW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9EZXB0aFRvU3BhY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9EZXB0aHdpc2VDb252MmROYXRpdmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9FcXVhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0V4cC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0V4cGFuZERpbXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9GaWxsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvRmxpcExlZnRSaWdodC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0Zsb29yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvRmxvb3JEaXYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9GdXNlZEJhdGNoTm9ybS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0Z1c2VkQ29udjJELmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvRnVzZWREZXB0aHdpc2VDb252MkQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9HYXRoZXJOZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0dhdGhlclYyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvR3JlYXRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0dyZWF0ZXJFcXVhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0lkZW50aXR5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvTGVha3lSZWx1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvTGVzcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0xlc3NFcXVhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0xvZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0xvZ2ljYWxBbmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9NYXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9NYXhQb29sLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvTWF4aW11bS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL01lYW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9NaW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9NaW5pbXVtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvTWlycm9yUGFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvTXVsdGlwbHkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9OZWcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9Ob25NYXhTdXBwcmVzc2lvblYzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvTm9uTWF4U3VwcHJlc3Npb25WNC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL05vbk1heFN1cHByZXNzaW9uVjUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9Ob25NYXhTdXBwcmVzc2lvbl91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvTm90RXF1YWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9PbmVIb3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9PbmVzTGlrZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1BhY2suanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9QYWRWMi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1Bvdy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1ByZWx1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvUHJvZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1JhbmdlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvUmVhbERpdi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1JlbHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9SZWx1Ni5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1Jlc2hhcGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9SZXNpemVCaWxpbmVhci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1JldmVyc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9Sb3RhdGVXaXRoT2Zmc2V0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvUm91bmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9Sc3FydC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1NjYXR0ZXJOZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1NlbGVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1NpZ21vaWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9TaW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9TbGljZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1NvZnRtYXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9TcGFjZVRvQmF0Y2hORC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1NwbGl0Vi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1NxcnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9TcXVhcmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9TcXVhcmVkRGlmZmVyZW5jZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1N0ZXAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9TdHJpZGVkU2xpY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9TdWIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9TdW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9UYW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9UYW5oLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvVGlsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1RvcEsuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9UcmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9UcmFuc3Bvc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9VbnBhY2suanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9aZXJvc0xpa2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9fRnVzZWRNYXRNdWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9iaW5hcnlfa2VybmVsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMva2VybmVsX3V0aWxzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvdHlwZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy91bmFyeV9rZXJuZWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3QvcmVnaXN0ZXJfYWxsX2tlcm5lbHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3QvdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vd2FzbS1vdXQvdGZqcy1iYWNrZW5kLXdhc20tdGhyZWFkZWQtc2ltZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vd2FzbS1vdXQvdGZqcy1iYWNrZW5kLXdhc20tdGhyZWFkZWQtc2ltZC53b3JrZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL3dhc20tb3V0L3RmanMtYmFja2VuZC13YXNtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9hZGRuX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvYWRkbl9wYWNrZWRfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9hcmdtaW5tYXhfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9hcmdtaW5tYXhfcGFja2VkX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvYXZnX3Bvb2xfYmFja3Byb3BfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9iYWNrZW5kX3dlYmdsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9iYXNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9iYXRjaG5vcm1fZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9iYXRjaG5vcm1fcGFja2VkX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvYmluYXJ5b3BfY29tcGxleF9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2JpbmFyeW9wX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvYmluYXJ5b3BfcGFja2VkX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvY2FudmFzX3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2NsaXBfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9jbGlwX3BhY2tlZF9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2NvbXBsZXhfYWJzX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvY29uY2F0X2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvY29uY2F0X3BhY2tlZF9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2NvbnZfYmFja3Byb3BfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9jb252X2JhY2twcm9wX2dwdV9kZXB0aHdpc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2NvbnZfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9jb252X2dwdV9kZXB0aHdpc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2NvbnZfcGFja2VkX2dwdV9kZXB0aHdpc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2Nyb3BfYW5kX3Jlc2l6ZV9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2N1bXN1bV9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2RlY29kZV9tYXRyaXhfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9kZWNvZGVfbWF0cml4X3BhY2tlZF9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2RlcHRoX3RvX3NwYWNlX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvZGlhZ19ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2RpbGF0aW9uX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvZW5jb2RlX2Zsb2F0X2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvZW5jb2RlX2Zsb2F0X3BhY2tlZF9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2VuY29kZV9tYXRyaXhfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9lbmNvZGVfbWF0cml4X3BhY2tlZF9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2ZmdF9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2ZpbGxfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9mbGFnc193ZWJnbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvZmxpcF9sZWZ0X3JpZ2h0X2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvZ2F0aGVyX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvZ2F0aGVyX25kX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvZ2xzbF92ZXJzaW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9ncGdwdV9jb250ZXh0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9ncGdwdV9tYXRoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9ncGdwdV91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9pbTJjb2xfcGFja2VkX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbF91dGlscy9hcmdfbWluX21heC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVsX3V0aWxzL2ludC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVsX3V0aWxzL3JlZHVjZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVsX3V0aWxzL3Jlc2hhcGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbF91dGlscy9zaGFyZWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvQWJzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0Fjb3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvQWNvc2guanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvQWRkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0FkZE4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvQWxsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0FueS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9BcmdNYXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvQXJnTWluLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0FzaW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvQXNpbmguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvQXRhbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9BdGFuMi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9BdGFuaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9BdmdQb29sLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0F2Z1Bvb2wzRC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9BdmdQb29sM0RHcmFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0F2Z1Bvb2xHcmFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0JhdGNoTWF0TXVsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0JhdGNoTWF0TXVsX2ltcGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvQmF0Y2hOb3JtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0JhdGNoVG9TcGFjZU5ELmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0JpbmNvdW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0Nhc3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvQ2VpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9DbGlwQnlWYWx1ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9Db21wbGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0NvbXBsZXhBYnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvQ29uY2F0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0NvbmNhdF9pbXBsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0NvbnYyRC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9Db252MkRCYWNrcHJvcEZpbHRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9Db252MkRCYWNrcHJvcElucHV0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0NvbnYyRF9pbXBsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0NvbnYzRC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9Db252M0RCYWNrcHJvcEZpbHRlclYyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0NvbnYzREJhY2twcm9wSW5wdXRWMi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9Db3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvQ29zaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9Dcm9wQW5kUmVzaXplLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0N1bXN1bS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9EZW5zZUJpbmNvdW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0RlcHRoVG9TcGFjZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9EZXB0aHdpc2VDb252MmROYXRpdmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9EaWFnLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0RpbGF0aW9uMkQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvRWluc3VtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0VsdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9FbHVHcmFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0VxdWFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0VyZi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9FeHAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvRXhwYW5kRGltcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9FeHBtMS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9GRlQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvRkZUX2ltcGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvRmlsbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9GbGlwTGVmdFJpZ2h0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0Zsb29yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0Zsb29yRGl2LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0Zyb21QaXhlbHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvRnJvbVBpeGVsc191dGlscy9mcm9tX3BpeGVsc19ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvRnJvbVBpeGVsc191dGlscy9mcm9tX3BpeGVsc19wYWNrZWRfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0Z1c2VkQ29udjJELmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0Z1c2VkRGVwdGh3aXNlQ29udjJELmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0dhdGhlck5kLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0dhdGhlclYyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0dyZWF0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvR3JlYXRlckVxdWFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0lGRlQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvSWRlbnRpdHkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvSW1hZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9Jc0Zpbml0ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9Jc0luZi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9Jc05hTi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9MUk4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvTFJOR3JhZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9MZWFreVJlbHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvTGVzcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9MZXNzRXF1YWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvTGluU3BhY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvTG9nLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0xvZzFwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0xvZ2ljYWxBbmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvTG9naWNhbE5vdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9Mb2dpY2FsT3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvTWF4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL01heFBvb2wuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvTWF4UG9vbDNELmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL01heFBvb2wzREdyYWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvTWF4UG9vbEdyYWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvTWF4UG9vbFdpdGhBcmdtYXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvTWF4UG9vbFdpdGhBcmdtYXhfaW1wbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9NYXhfaW1wbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9NYXhpbXVtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL01lYW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvTWVhbl9pbXBsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL01pbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9NaW5pbXVtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL01pcnJvclBhZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9Nb2QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvTXVsdGlub21pYWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvTXVsdGlwbHkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvTmVnLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL05vbk1heFN1cHByZXNzaW9uVjMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvTm9uTWF4U3VwcHJlc3Npb25WNC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9Ob25NYXhTdXBwcmVzc2lvblY1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL05vdEVxdWFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL09uZUhvdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9PbmVzTGlrZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9QYWNrLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL1BhZFYyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL1Bvdy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9QcmVsdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9Qcm9kLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL1JhbmdlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL1JlYWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvUmVhbERpdi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9SZWNpcHJvY2FsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL1JlbHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvUmVsdTYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvUmVzaGFwZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9SZXNpemVCaWxpbmVhci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9SZXNpemVCaWxpbmVhckdyYWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvUmVzaXplTmVhcmVzdE5laWdoYm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL1Jlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvUmV2ZXJzZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9Sb3RhdGVXaXRoT2Zmc2V0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL1JvdW5kLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL1JzcXJ0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL1NjYXR0ZXJOZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9TZWxlY3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvU2VsdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9TaWdtb2lkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL1NpZ24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvU2luLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL1NpbmguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvU2xpY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvU29mdG1heC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9Tb2Z0cGx1cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9TcGFjZVRvQmF0Y2hORC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9TcGFyc2VGaWxsRW1wdHlSb3dzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL1NwYXJzZVJlc2hhcGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvU3BhcnNlU2VnbWVudE1lYW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvU3BhcnNlU2VnbWVudFN1bS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9TcGFyc2VUb0RlbnNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL1NwbGl0Vi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9TcXJ0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL1NxdWFyZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9TcXVhcmVkRGlmZmVyZW5jZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9TdGVwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL1N0cmlkZWRTbGljZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9TdHJpbmdOR3JhbXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvU3RyaW5nU3BsaXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvU3RyaW5nVG9IYXNoQnVja2V0RmFzdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9TdWIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvU3VtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL1N1bV9pbXBsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL1Rhbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9UYW5oLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL1RpbGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvVG9wSy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9UcmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvVHJhbnNwb3NlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL1RyYW5zcG9zZV9pbXBsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL1VuaXF1ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9VbnBhY2suanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvVW5zb3J0ZWRTZWdtZW50U3VtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL1plcm9zTGlrZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9fRnVzZWRNYXRNdWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2xybl9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2xybl9ncmFkX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvbHJuX3BhY2tlZF9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L21heF9wb29sX2JhY2twcm9wX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvbWVhbl9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L21pcnJvcl9wYWRfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9taXJyb3JfcGFkX3BhY2tlZF9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L211bG1hdF9wYWNrZWRfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9tdWx0aW5vbWlhbF9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L29uZWhvdF9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L3BhY2tfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9wYWNraW5nX3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L3BhZF9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L3BhZF9wYWNrZWRfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9wb29sX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvcmVkdWNlX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvcmVnaXN0ZXJfYWxsX2tlcm5lbHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L3Jlc2hhcGVfcGFja2VkX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvcmVzaXplX2JpbGluZWFyX2JhY2twcm9wX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvcmVzaXplX2JpbGluZWFyX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvcmVzaXplX2JpbGluZWFyX3BhY2tlZF9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L3Jlc2l6ZV9uZWFyZXN0X25laWdoYm9yX2JhY2twcm9wX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvcmVzaXplX25lYXJlc3RfbmVpZ2hib3JfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9yZXNpemVfbmVhcmVzdF9uZWlnaGJvcl9wYWNrZWRfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9yZXZlcnNlX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvcmV2ZXJzZV9wYWNrZWRfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9yb3RhdGVfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9zY2F0dGVyX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qvc2VnbWVudF9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L3NlbGVjdF9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L3NoYWRlcl9jb21waWxlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qvc2hhZGVyX2NvbXBpbGVyX3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L3NsaWNlX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qvc2xpY2VfcGFja2VkX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qvc3RyaWRlZF9zbGljZV9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L3RleF91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC90ZXh0dXJlX21hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L3RpbGVfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC90b3Bfa19ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L3RyYW5zZm9ybV9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L3RyYW5zcG9zZV9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L3RyYW5zcG9zZV9wYWNrZWRfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC91bmFyeW9wX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvdW5hcnlvcF9wYWNrZWRfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC91bnBhY2tfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC92ZXJzaW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC93ZWJnbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qvd2ViZ2xfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvYmFja2VuZHMvYmFja2VuZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvYmFja2VuZHMvYmFja2VuZF91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9iYWNrZW5kcy9jb21wbGV4X3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2JhY2tlbmRzL2VpbnN1bV91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9iYWNrZW5kcy9rZXJuZWxfaW1wbHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2JhY2tlbmRzL25vbl9tYXhfc3VwcHJlc3Npb25faW1wbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvYmFja2VuZHMvbm9uX21heF9zdXBwcmVzc2lvbl91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9iYWNrZW5kcy93aGVyZV9pbXBsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9iYXNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9iYXNlX3NpZGVfZWZmZWN0cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvYnJvd3Nlcl91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9kZXZpY2VfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvZW5naW5lLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9lbnZpcm9ubWVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvZmxhZ3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2dsb2JhbF91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9nbG9iYWxzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9ncmFkaWVudHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2hhc2hfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2lvL2Jyb3dzZXJfZmlsZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2lvL2h0dHAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2lvL2luZGV4ZWRfZGIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2lvL2lvLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9pby9pb191dGlscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvaW8vbG9jYWxfc3RvcmFnZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvaW8vbW9kZWxfbWFuYWdlbWVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvaW8vcGFzc3Rocm91Z2guanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2lvL3Byb2dyZXNzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9pby9yb3V0ZXJfcmVnaXN0cnkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2lvL3R5cGVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9pby93ZWlnaHRzX2xvYWRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qva2VybmVsX25hbWVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9rZXJuZWxfcmVnaXN0cnkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2xvZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvbWF0aC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2Ficy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2Fjb3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9hY29zaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2FkZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2FkZF9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYWxsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYW55LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYXJnX21heC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2FyZ19taW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9hcnJheV9vcHNfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2FzaW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9hc2luaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2F0YW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9hdGFuMi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2F0YW5oLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYXZnX3Bvb2wuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9hdmdfcG9vbF8zZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2F4aXNfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2Jhc2ljX2xzdG1fY2VsbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2JhdGNoX3RvX3NwYWNlX25kLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYmF0Y2hub3JtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYmF0Y2hub3JtMmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9iYXRjaG5vcm0zZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2JhdGNobm9ybTRkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYmF0Y2hub3JtX3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9iaW5jb3VudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2Jvb2xlYW5fbWFzay5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2Jyb2FkY2FzdF90by5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2Jyb2FkY2FzdF91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2J1ZmZlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2Nhc3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9jZWlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvY2xpcF9ieV92YWx1ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2Nsb25lLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvY29tcGxleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2NvbmNhdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2NvbmNhdF8xZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2NvbmNhdF8yZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2NvbmNhdF8zZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2NvbmNhdF80ZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2NvbmNhdF91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvY29uZnVzaW9uX21hdHJpeC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2NvbnYxZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2NvbnYyZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2NvbnYyZF9iYWNrcHJvcF9maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9jb252MmRfYmFja3Byb3BfaW5wdXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9jb252MmRfdHJhbnNwb3NlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvY29udjNkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvY29udjNkX2JhY2twcm9wX2lucHV0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvY29udjNkX3RyYW5zcG9zZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2NvbnZfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2Nvcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2Nvc2guanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9jdW1zdW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9kZW5zZV9iaW5jb3VudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2RlcHRoX3RvX3NwYWNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZGVwdGh3aXNlX2NvbnYyZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2RlcHRod2lzZV9jb252MmRfbmF0aXZlX2JhY2twcm9wX2ZpbHRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2RlcHRod2lzZV9jb252MmRfbmF0aXZlX2JhY2twcm9wX2lucHV0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZGlhZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2RpbGF0aW9uMmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9kaXYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9kaXZfbm9fbmFuLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZG90LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZHJvcG91dC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2Ryb3BvdXRfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2VpbnN1bS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2VsdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2VxdWFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZXJmLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZXJmX3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9leHAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9leHBhbmRfZGltcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2V4cG0xLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZXllLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZmlsbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2Zsb29yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZmxvb3JEaXYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9mdXNlZC9jb252MmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9mdXNlZC9kZXB0aHdpc2VfY29udjJkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZnVzZWQvbWF0X211bC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2Z1c2VkX29wcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2Z1c2VkX3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9nYXRoZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9nYXRoZXJfbmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9nYXRoZXJfbmRfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2dyZWF0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9ncmVhdGVyX2VxdWFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvaW1hZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2ltYWdlL2Nyb3BfYW5kX3Jlc2l6ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2ltYWdlL2ZsaXBfbGVmdF9yaWdodC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2ltYWdlL25vbl9tYXhfc3VwcHJlc3Npb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9pbWFnZS9ub25fbWF4X3N1cHByZXNzaW9uX2FzeW5jLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvaW1hZ2Uvbm9uX21heF9zdXBwcmVzc2lvbl9wYWRkZWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9pbWFnZS9ub25fbWF4X3N1cHByZXNzaW9uX3BhZGRlZF9hc3luYy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2ltYWdlL25vbl9tYXhfc3VwcHJlc3Npb25fd2l0aF9zY29yZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2ltYWdlL25vbl9tYXhfc3VwcHJlc3Npb25fd2l0aF9zY29yZV9hc3luYy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2ltYWdlL3Jlc2l6ZV9iaWxpbmVhci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2ltYWdlL3Jlc2l6ZV9uZWFyZXN0X25laWdoYm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvaW1hZ2Uvcm90YXRlX3dpdGhfb2Zmc2V0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvaW1hZ2UvdGhyZXNob2xkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvaW1hZ2UvdHJhbnNmb3JtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvaW5fdG9wX2suanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9pc19maW5pdGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9pc19pbmYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9pc19uYW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9sZWFreV9yZWx1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbGVzcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2xlc3NfZXF1YWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9saW5hbGcvYmFuZF9wYXJ0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbGluYWxnL2dyYW1fc2NobWlkdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2xpbmFsZy9xci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2xpbnNwYWNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbG9jYWxfcmVzcG9uc2Vfbm9ybWFsaXphdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2xvZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2xvZzFwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbG9nX3NpZ21vaWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9sb2dfc29mdG1heC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2xvZ19zdW1fZXhwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbG9naWNhbF9hbmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9sb2dpY2FsX25vdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2xvZ2ljYWxfb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9sb2dpY2FsX3hvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2xvc3Nfb3BzX3V0aWxzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbG9zc2VzL2Fic29sdXRlX2RpZmZlcmVuY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9sb3NzZXMvY29tcHV0ZV93ZWlnaHRlZF9sb3NzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbG9zc2VzL2Nvc2luZV9kaXN0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2xvc3Nlcy9oaW5nZV9sb3NzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbG9zc2VzL2h1YmVyX2xvc3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9sb3NzZXMvbG9nX2xvc3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9sb3NzZXMvbWVhbl9zcXVhcmVkX2Vycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbG9zc2VzL3NpZ21vaWRfY3Jvc3NfZW50cm9weS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2xvc3Nlcy9zb2Z0bWF4X2Nyb3NzX2VudHJvcHkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9tYXRfbXVsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbWF4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbWF4X3Bvb2wuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9tYXhfcG9vbF8zZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL21heF9wb29sX3dpdGhfYXJnbWF4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbWF4aW11bS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL21lYW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9tZXNoZ3JpZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL21pbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL21pbmltdW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9taXJyb3JfcGFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbW9kLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbW9tZW50cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL21vdmluZ19hdmVyYWdlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbXVsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbXVsdGlfcm5uX2NlbGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9tdWx0aW5vbWlhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL25lZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL25vbm1heF91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbm9ybS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL25vdF9lcXVhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL29uZV9ob3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9vbmVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvb25lc19saWtlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvb3BlcmF0aW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvb3BzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvb3V0ZXJfcHJvZHVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3BhZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3BhZDFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcGFkMmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9wYWQzZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3BhZDRkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcG9vbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3Bvdy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3ByZWx1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcHJpbnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9wcm9kLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcmFuZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3JhbmRfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3JhbmRvbV9nYW1tYS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3JhbmRvbV9ub3JtYWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9yYW5kb21fdW5pZm9ybS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3JhbmdlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcmVhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3JlY2lwcm9jYWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9yZWR1Y2VfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3JlbHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9yZWx1Ni5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3Jlc2hhcGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9yZXZlcnNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcmV2ZXJzZV8xZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3JldmVyc2VfMmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9yZXZlcnNlXzNkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcmV2ZXJzZV80ZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3JvdGF0ZV91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcm91bmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9yc3FydC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NjYWxhci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NjYXR0ZXJfbmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zY2F0dGVyX25kX3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zZWdtZW50X3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zZWx1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc2VsdV91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc2VwYXJhYmxlX2NvbnYyZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NldGRpZmYxZF9hc3luYy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NpZ21vaWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zaWduLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc2lnbmFsL2ZyYW1lLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc2lnbmFsL2hhbW1pbmdfd2luZG93LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc2lnbmFsL2hhbm5fd2luZG93LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc2lnbmFsL3N0ZnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zaWduYWxfb3BzX3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zaW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zaW5oLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc2xpY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zbGljZTFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc2xpY2UyZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NsaWNlM2QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zbGljZTRkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc2xpY2VfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NvZnRtYXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zb2Z0cGx1cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NwYWNlX3RvX2JhdGNoX25kLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc3BhcnNlL3NwYXJzZV9maWxsX2VtcHR5X3Jvd3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zcGFyc2Uvc3BhcnNlX3Jlc2hhcGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zcGFyc2Uvc3BhcnNlX3NlZ21lbnRfbWVhbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NwYXJzZS9zcGFyc2Vfc2VnbWVudF9zdW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zcGFyc2VfdG9fZGVuc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zcGFyc2VfdG9fZGVuc2VfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NwZWN0cmFsL2ZmdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NwZWN0cmFsL2lmZnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zcGVjdHJhbC9pcmZmdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NwZWN0cmFsL3JmZnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zcGxpdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NwbGl0X3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zcXJ0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc3F1YXJlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc3F1YXJlZF9kaWZmZXJlbmNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc3F1ZWV6ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3N0YWNrLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc3RlcC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3N0cmlkZWRfc2xpY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zdHJpbmcvc3RyaW5nX25fZ3JhbXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zdHJpbmcvc3RyaW5nX3NwbGl0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc3RyaW5nL3N0cmluZ190b19oYXNoX2J1Y2tldF9mYXN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc3ViLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc3VtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvdGFuLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvdGFuaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3RlbnNvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3RlbnNvcjFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvdGVuc29yMmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy90ZW5zb3IzZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3RlbnNvcjRkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvdGVuc29yNWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy90ZW5zb3I2ZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3RlbnNvcl9vcHNfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3RpbGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy90b3BrLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvdHJhbnNwb3NlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvdHJ1bmNhdGVkX25vcm1hbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3VuaXF1ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3Vuc29ydGVkX3NlZ21lbnRfc3VtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvdW5zdGFjay5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3ZhcmlhYmxlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvd2hlcmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy93aGVyZV9hc3luYy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3plcm9zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvemVyb3NfbGlrZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3B0aW1pemVycy9hZGFkZWx0YV9vcHRpbWl6ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wdGltaXplcnMvYWRhZ3JhZF9vcHRpbWl6ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wdGltaXplcnMvYWRhbV9vcHRpbWl6ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wdGltaXplcnMvYWRhbWF4X29wdGltaXplci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3B0aW1pemVycy9tb21lbnR1bV9vcHRpbWl6ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wdGltaXplcnMvb3B0aW1pemVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHRpbWl6ZXJzL29wdGltaXplcl9jb25zdHJ1Y3RvcnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wdGltaXplcnMvcm1zcHJvcF9vcHRpbWl6ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wdGltaXplcnMvc2dkX29wdGltaXplci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvcGxhdGZvcm1zL3BsYXRmb3JtX2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L3BsYXRmb3Jtcy9wbGF0Zm9ybV9ub2RlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9wcm9maWxlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvc2VyaWFsaXphdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvdGFwZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvdGVuc29yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC90ZW5zb3JfZm9ybWF0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC90ZW5zb3JfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvdGVuc29yX3V0aWxfZW52LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC90ZXN0X3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L3RyYWluLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC90eXBlcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvdXRpbF9iYXNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC92ZXJzaW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9iYXNlNjQtanMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2J1ZmZlci9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaWVlZTc1NC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaXNhcnJheS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9uZy9zcmMvbG9uZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zZWVkcmFuZG9tL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zZWVkcmFuZG9tL2xpYi9hbGVhLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zZWVkcmFuZG9tL2xpYi90eWNoZWkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NlZWRyYW5kb20vbGliL3hvcjEyOC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2VlZHJhbmRvbS9saWIveG9yNDA5Ni5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2VlZHJhbmRvbS9saWIveG9yc2hpZnQ3LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zZWVkcmFuZG9tL2xpYi94b3J3b3cuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NlZWRyYW5kb20vc2VlZHJhbmRvbS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2V0aW1tZWRpYXRlL3NldEltbWVkaWF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdGltZXJzLWJyb3dzZXJpZnkvbWFpbi5qcyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vYW1kLWRlZmluZS5qcyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vYW1kLW9wdGlvbnMuanMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qcyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vbW9kdWxlLmpzIiwid2VicGFjazovLy8uL3NyYy9tYWluLmpzIiwid2VicGFjazovLy8uL3NyYy9tbC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbm4vY29udGV4dC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbm4vZ3JhcGgudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL25uL2dyYXBoX2J1aWxkZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL25uL29wZXJhbmQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL25uL29wZXJhdGlvbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbm4vb3BzL2JhdGNoX25vcm0udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL25uL29wcy9iaW5hcnkudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL25uL29wcy9jbGFtcC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbm4vb3BzL2NvbmNhdC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbm4vb3BzL2NvbnYyZC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbm4vb3BzL2dlbW0udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL25uL29wcy9ncnUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL25uL29wcy9pbnN0YW5jZV9ub3JtLnRzIiwid2VicGFjazovLy8uL3NyYy9ubi9vcHMvbGVha3lfcmVsdS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbm4vb3BzL3BhZC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbm4vb3BzL3Bvb2wyZC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbm4vb3BzL3JlZHVjZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbm4vb3BzL3Jlc2FtcGxlLnRzIiwid2VicGFjazovLy8uL3NyYy9ubi9vcHMvcmVzaGFwZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbm4vb3BzL3NsaWNlLnRzIiwid2VicGFjazovLy8uL3NyYy9ubi9vcHMvc29mdG1heC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbm4vb3BzL3NwbGl0LnRzIiwid2VicGFjazovLy8uL3NyYy9ubi9vcHMvc3F1ZWV6ZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbm4vb3BzL3RyYW5zcG9zZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbm4vb3BzL3VuYXJ5LnRzIiwid2VicGFjazovLy8uL3NyYy9ubi91dGlscy50cyJdLCJuYW1lcyI6WyJpbnN0YWxsZWRNb2R1bGVzIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiZXhwb3J0cyIsIm1vZHVsZSIsImkiLCJsIiwibW9kdWxlcyIsImNhbGwiLCJtIiwiYyIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImdldCIsInIiLCJTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsInZhbHVlIiwidCIsIm1vZGUiLCJfX2VzTW9kdWxlIiwibnMiLCJjcmVhdGUiLCJrZXkiLCJiaW5kIiwibiIsIm9iamVjdCIsInByb3BlcnR5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJwIiwicyIsIndoZXJlSW1wbCIsIk1hdGhCYWNrZW5kQ1BVIiwiY29uc3RydWN0b3IiLCJzdXBlciIsInRoaXMiLCJibG9ja1NpemUiLCJmaXJzdFVzZSIsImRhdGEiLCJuZXh0RGF0YUlkIiwid3JpdGUiLCJ2YWx1ZXMiLCJzaGFwZSIsImR0eXBlIiwid2FybiIsImRhdGFJZCIsImlkIiwic2V0IiwicmVmQ291bnQiLCJtYWtlVGVuc29ySW5mbyIsIm91dElkIiwibGVuZ3RoIiwiaXNTdHJpbmciLCJlbmNvZGVkVmFsdWVzIiwibWFwIiwiZW5jb2RlU3RyaW5nIiwiaGFzIiwiaW5jUmVmIiwiZGVjUmVmIiwibW92ZSIsIm51bURhdGFJZHMiLCJyZWFkU3luYyIsImNvbXBsZXhUZW5zb3JJbmZvcyIsInJlYWxWYWx1ZXMiLCJyZWFsIiwiaW1hZ1ZhbHVlcyIsImltYWciLCJtZXJnZVJlYWxBbmRJbWFnQXJyYXlzIiwiYnVmZmVyU3luYyIsImRlY29kZWREYXRhIiwiZGVjb2RlU3RyaW5nIiwiX2EiLCJFcnJvciIsIm1ha2VPdXRwdXQiLCJtYWtlVGVuc29yRnJvbURhdGFJZCIsImRpc3Bvc2VEYXRhIiwiZm9yY2UiLCJkZWxldGUiLCJkaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyIsInRlbnNvckluZm8iLCJmIiwic3RhcnQiLCJub3ciLCJrZXJuZWxNcyIsIm1lbW9yeSIsInVucmVsaWFibGUiLCJyZWFzb25zIiwid2hlcmUiLCJjb25kaXRpb24iLCJjb25kVmFscyIsImRpc3Bvc2UiLCJmbG9hdFByZWNpc2lvbiIsImVwc2lsb24iLCJhc3NlcnROb3RDb21wbGV4IiwidGVuc29yIiwib3BOYW1lIiwiQXJyYXkiLCJpc0FycmF5IiwiZm9yRWFjaCIsImFzc2VydCIsInNpbXBsZUFic0ltcGwiLCJ2YWxzIiwicmVzdWx0VmFsdWVzIiwiRmxvYXQzMkFycmF5IiwiTWF0aCIsImFicyIsImFyZ3MiLCJ4IiwiaW5wdXRzIiwiY3B1QmFja2VuZCIsImJhY2tlbmQiLCJzaXplRnJvbVNoYXBlIiwiYWJzQ29uZmlnIiwia2VybmVsTmFtZSIsImJhY2tlbmROYW1lIiwia2VybmVsRnVuYyIsImFjb3MiLCJ4aSIsImFjb3NDb25maWciLCJhY29zaCIsImFjb3NoQ29uZmlnIiwiYWRkSW1wbCIsImEiLCJiIiwiYWRkQ29tcGxleEltcGwiLCJhUmVhbCIsImFJbWFnIiwiYlJlYWwiLCJiSW1hZyIsImFkZCIsImFkZENvbmZpZyIsImFkZE4iLCJ0ZW5zb3JzIiwib3V0QnVmIiwib3V0VmFscyIsImN1cnJWYWxzIiwiaiIsImFkZE5Db25maWciLCJhbGwiLCJhdHRycyIsImF4aXMiLCJrZWVwRGltcyIsIm9yaWdBeGVzIiwicGFyc2VBeGlzUGFyYW0iLCJheGVzIiwicGVybXV0ZWRBeGVzIiwiZ2V0QXhlc1Blcm11dGF0aW9uIiwiJHgiLCJwZXJtIiwiZ2V0SW5uZXJNb3N0QXhlcyIsImFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zIiwib3V0U2hhcGUiLCJyZWR1Y2VTaGFwZSIsImNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMiLCJyZWR1Y2VTaXplIiwibWFrZVplcm9zVHlwZWRBcnJheSIsImFWYWxzIiwib2Zmc2V0IiwicmVzdWx0IiwiZXhwYW5kZWRTaGFwZSIsImV4cGFuZFNoYXBlVG9LZWVwRGltIiwicmVzaGFwZWRSZXN1bHQiLCJhbGxDb25maWciLCJhbnkiLCJhbnlWYWwiLCJhbnlDb25maWciLCJhcmdNYXgiLCJpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcyIsInB1c2giLCJvdXRTaXplIiwibWF4IiwibWF4SW5kZXgiLCJhcmdNYXhDb25maWciLCJhcmdNaW4iLCJtaW4iLCJtaW5JbmRleCIsImFyZ01pbkNvbmZpZyIsImFzaW4iLCJhc2luQ29uZmlnIiwiYXNpbmgiLCJhc2luaENvbmZpZyIsImF0YW4iLCJhdGFuQ29uZmlnIiwiYXRhbjJJbXBsIiwiYVZhbHVlIiwiYlZhbHVlIiwiYXRhbjIiLCJhdGFuMkNvbmZpZyIsImF0YW5oIiwiYXRhbmhDb25maWciLCJhdmdQb29sIiwiZmlsdGVyU2l6ZSIsInN0cmlkZXMiLCJwYWQiLCJkaW1Sb3VuZGluZ01vZGUiLCJlaXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUiLCJjb252SW5mbyIsImNvbXB1dGVQb29sMkRJbmZvIiwicmVzIiwiZmlsdGVyV2lkdGgiLCJmaWx0ZXJIZWlnaHQiLCJhcnJheXNFcXVhbCIsImluU2hhcGUiLCJ4VmFsdWVzIiwiY29tcHV0ZVN0cmlkZXMiLCJidWZmZXIiLCJhdmdQb29sQ29uZmlnIiwiYXZnUG9vbDNEIiwiZGF0YUZvcm1hdCIsImNvbXB1dGVQb29sM0RJbmZvIiwiYXZnUG9vbDNEQ29uZmlnIiwiYXZnUG9vbDNER3JhZCIsImR5IiwiaW5wdXQiLCJzdHJpZGVEZXB0aCIsInN0cmlkZUhlaWdodCIsInN0cmlkZVdpZHRoIiwiZmlsdGVyRGVwdGgiLCJkaWxhdGlvbkRlcHRoIiwiZGlsYXRpb25IZWlnaHQiLCJkaWxhdGlvbldpZHRoIiwiZWZmZWN0aXZlRmlsdGVyRGVwdGgiLCJlZmZlY3RpdmVGaWx0ZXJIZWlnaHQiLCJlZmZlY3RpdmVGaWx0ZXJXaWR0aCIsInBhZEZyb250IiwicGFkSW5mbyIsImZyb250IiwicGFkTGVmdCIsImxlZnQiLCJwYWRUb3AiLCJ0b3AiLCJkeCIsImF2Z011bHRpcGxpZXIiLCJkeUJ1ZiIsImJhdGNoIiwiYmF0Y2hTaXplIiwiY2hhbm5lbCIsImluQ2hhbm5lbHMiLCJkeERlcHRoIiwiaW5EZXB0aCIsImR4Um93IiwiaW5IZWlnaHQiLCJkeENvbCIsImluV2lkdGgiLCJkeURlcHRoQ29ybmVyIiwiZHlSb3dDb3JuZXIiLCJkeUNvbENvcm5lciIsImRvdFByb2QiLCJ3RGVwdGgiLCJkeURlcHRoIiwib3V0RGVwdGgiLCJmbG9vciIsIndSb3ciLCJkeVJvdyIsIm91dEhlaWdodCIsIndDb2wiLCJkeUNvbCIsIm91dFdpZHRoIiwiYXZnUG9vbDNER3JhZENvbmZpZyIsImF2Z1Bvb2xHcmFkIiwiZHlEYXRhIiwiZHhSIiwiZHhDIiwiZHlSQ29ybmVyIiwiZHlDQ29ybmVyIiwid1IiLCJkeVIiLCJ3QyIsImR5QyIsImF2Z1Bvb2xHcmFkQ29uZmlnIiwiYmF0Y2hNYXRNdWwiLCJ0cmFuc3Bvc2VBIiwidHJhbnNwb3NlQiIsImFSYW5rIiwiYlJhbmsiLCJpbm5lclNoYXBlQSIsImlubmVyU2hhcGVCIiwib3V0ZXJTaGFwZUEiLCJvdXRlclNoYXBlQiIsIm91dGVyRGltc0EiLCJzbGljZSIsIm91dGVyRGltc0IiLCJiYXRjaERpbUEiLCJiYXRjaERpbUIiLCJiYXRjaERpbXNDb21wYXRpYmxlIiwiY29uY2F0IiwiYTNkU2hhcGUiLCJiM2RTaGFwZSIsImEzZCIsImIzZCIsInNoYXJlZERpbSIsImxlZnREaW0iLCJyaWdodERpbSIsImJhdGNoRGltIiwiYTNkVmFsdWVzIiwiYjNkVmFsdWVzIiwiYTNkU3RyaWRlcyIsImIzZFN0cmlkZXMiLCJhQmF0Y2giLCJhT3V0ZXJTdGVwIiwiYUlubmVyU3RlcCIsImJJbm5lclN0ZXAiLCJiT3V0ZXJTdGVwIiwiYkJhdGNoIiwic2l6ZSIsInJlc1ZhbHMiLCJiaSIsImkwIiwiajAiLCJrMCIsImlCbG9jayIsImpCbG9jayIsImtCbG9jayIsInN1bSIsImsiLCJiYXRjaE9mZnNldEEiLCJiYXRjaE9mZnNldEIiLCJiYXRjaE1hdE11bENvbmZpZyIsImJhdGNoTm9ybSIsInNjYWxlIiwibWVhbiIsInZhcmlhbmNlIiwidmFyaWFuY2VFcHNpbG9uIiwieFZhbHMiLCJtVmFscyIsInZhclZhbHMiLCJzVmFscyIsIm9mZlZhbHMiLCJvZmZWYWxzTGVuZ3RoIiwic1ZhbHNMZW5ndGgiLCJ2YXJWYWxzTGVuZ3RoIiwibVZhbHNMZW5ndGgiLCJvZmZpIiwibWkiLCJzaSIsInZpIiwic3FydCIsImJhdGNoTm9ybUNvbmZpZyIsImJhdGNoVG9TcGFjZU5EIiwiYmxvY2tTaGFwZSIsImNyb3BzIiwicHJvZCIsInJlZHVjZSIsInJlc2hhcGVkIiwiZ2V0UmVzaGFwZWQiLCJwZXJtdXRlZCIsImdldFBlcm11dGVkIiwicmVzaGFwZWRQZXJtdXRlZCIsImdldFJlc2hhcGVkUGVybXV0ZWQiLCJzbGljZUJlZ2luQ29vcmRzIiwiZ2V0U2xpY2VCZWdpbkNvb3JkcyIsInNsaWNlU2l6ZSIsImdldFNsaWNlU2l6ZSIsInhSZXNoYXBlZCIsInhUcmFuc3Bvc2VkIiwieFRyYW5zcG9zZWRSZXNoYXBlZCIsImJlZ2luIiwiYmF0Y2hUb1NwYWNlTkRDb25maWciLCJiaW5jb3VudCIsIndlaWdodHMiLCJ3ZWlnaHRzVmFscyIsImJpbmNvdW50Q29uZmlnIiwiYmluY291bnRJbXBsIiwid2VpZ2h0c0R0eXBlIiwid2VpZ2h0c1NoYXBlIiwid2VpZ2h0c1NpemUiLCJiaW5jb3VudFJlZHVjZUltcGwiLCJ4QnVmIiwid2VpZ2h0c0J1ZiIsImJpbmFyeU91dHB1dCIsIm51bVJvd3MiLCJudW1Db2xzIiwiY2FzdCIsInplcm9zVGVuc29ySW5mbyIsImZsb2F0WCIsInJlYWxQYXJ0IiwiaGFzRW5jb2RpbmdMb3NzIiwiSW50MzJBcnJheSIsImZyb20iLCJ6ZXJvIiwidG9UeXBlZEFycmF5IiwicmVzdWx0RGF0YSIsInJlc3VsdFNoYXBlIiwiY2FzdENvbmZpZyIsImNlaWxJbXBsIiwiY2VpbCIsImNlaWxDb25maWciLCJjbGlwIiwiY2xpcEF0dHJzIiwiY2xpcFZhbHVlTWF4IiwiY2xpcFZhbHVlTWluIiwiY2xpcENvbmZpZyIsImNvbXBsZXgiLCJyZWFsVmFscyIsImltYWdWYWxzIiwiY29tcGxleEluZm8iLCJjb21wbGV4Q29uZmlnIiwiY29tcGxleEFicyIsImNvbXBsZXhWYWxzIiwiaHlwb3QiLCJjb21wbGV4QWJzQ29uZmlnIiwiJGF4aXMiLCJjb21wdXRlT3V0U2hhcGUiLCIkaW5wdXRzIiwiZmlsdGVyIiwic2hhcGVzIiwiYXNzZXJ0UGFyYW1zQ29uc2lzdGVudCIsInJlYWxzIiwiaW1hZ3MiLCJyZWFsQ29uY2F0ZWQiLCJpbWFnQ29uY2F0ZWQiLCJpbnB1dHMyRCIsImlucHV0c1ZhbFNoYXBlcyIsInNpbXBseUNvbmNhdCIsImZpbmFsT3V0U2hhcGUiLCJvdXRJbmZvIiwiY29uY2F0Q29uZmlnIiwiY29uY2F0SW1wbCIsImdldEFycmF5RnJvbURUeXBlIiwiY29sT2Zmc2V0IiwiZnJvbVVpbnQ4VG9TdHJpbmdBcnJheSIsInRJZHgiLCJyb3ciLCJyZXNJZHgiLCJjb2wiLCJjb252MkQiLCJkaWxhdGlvbnMiLCIkZGF0YUZvcm1hdCIsImNvbnZlcnRDb252MkREYXRhRm9ybWF0IiwiY29tcHV0ZUNvbnYyREluZm8iLCJpc0NoYW5uZWxzTGFzdCIsInkiLCJ4U3RyaWRlcyIsImZpbHRlclN0cmlkZXMiLCJ4QmF0Y2hTdHJpZGUiLCJ4Um93U3RyaWRlIiwieENvbFN0cmlkZSIsInhDaGFubmVsU3RyaWRlIiwieUJhdGNoU3RyaWRlIiwieVJvd1N0cmlkZSIsInlDb2xTdHJpZGUiLCJ5Q2hhbm5lbFN0cmlkZSIsIndWYWxzIiwieVZhbHMiLCJ4T2Zmc2V0MSIsInlPZmZzZXQxIiwieVIiLCJ5T2Zmc2V0MiIsInhSQ29ybmVyIiwieFIiLCJ3T2Zmc2V0MSIsInhPZmZzZXQyIiwieUMiLCJ5T2Zmc2V0MyIsInhDQ29ybmVyIiwieEMiLCJ4T2Zmc2V0MyIsIndPZmZzZXQzIiwiZDEiLCJ4VmFsIiwiZDIiLCJvdXRDaGFubmVscyIsImNvbnYyRENvbmZpZyIsImNvbnYyREJhY2twcm9wRmlsdGVyIiwiZmlsdGVyU2hhcGUiLCJkVyIsImxlZnRQYWQiLCJ0b3BQYWQiLCJkeVZhbHMiLCJ5Uk1pbiIsInlSTWF4IiwieUNNaW4iLCJ5Q01heCIsImNvbnYyREJhY2twcm9wRmlsdGVyQ29uZmlnIiwiY29udjJEQmFja3Byb3BJbnB1dCIsImlucHV0U2hhcGUiLCJkeVN0cmlkZXMiLCJkeFZhbHVlcyIsImR5VmFsdWVzIiwiZmx0VmFsdWVzIiwiZmx0UzAiLCJmbHRTMSIsImZsdFMyIiwieFJNaW4iLCJ4Q01pbiIsImR5T2Zmc2V0IiwiZmx0T2Zmc2V0IiwiY29udjJEQmFja3Byb3BJbnB1dENvbmZpZyIsImNvbnYzRCIsImNvbXB1dGVDb252M0RJbmZvIiwieUYiLCJ4RkNvcm5lciIsIndGIiwieEYiLCJ3T2Zmc2V0MiIsInlPZmZzZXQ0IiwieE9mZnNldDQiLCJ3T2Zmc2V0NCIsImNvbnYzRENvbmZpZyIsImNvbnYzREJhY2twcm9wRmlsdGVyVjIiLCJkdyIsImR3VmFsdWVzIiwiZHdTMCIsImR3UzEiLCJkd1MyIiwiZHdTMyIsImR5UzAiLCJkeVMxIiwiZHlTMiIsImR5UzMiLCJ4UzAiLCJ4UzEiLCJ4UzIiLCJ4UzMiLCJmcm9udFBhZCIsInlGTWluIiwieUZNYXgiLCJjb252M0RCYWNrcHJvcEZpbHRlclYyQ29uZmlnIiwiY29udjNEQmFja3Byb3BJbnB1dFYyIiwiZHhTMCIsImR4UzEiLCJkeFMyIiwiZHhTMyIsImZsdFMzIiwieEZNaW4iLCJjb252M0RCYWNrcHJvcElucHV0VjJDb25maWciLCJjb3MiLCJjb3NDb25maWciLCJjb3NoIiwiY29zaENvbmZpZyIsImNyb3BBbmRSZXNpemUiLCJpbWFnZSIsImJveGVzIiwiYm94SW5kIiwiY3JvcFNpemUiLCJtZXRob2QiLCJleHRyYXBvbGF0aW9uVmFsdWUiLCJpbWFnZUhlaWdodCIsImltYWdlV2lkdGgiLCJudW1DaGFubmVscyIsIm51bUJveGVzIiwiY3JvcEhlaWdodCIsImNyb3BXaWR0aCIsIm91dHB1dCIsImJveFZhbHMiLCJib3hJbmRWYWxzIiwiaW1hZ2VWYWxzIiwiaW5TdHJpZGUiLCJvdXRTdHJpZGUiLCJzdGFydEluZCIsInkxIiwieDEiLCJ5MiIsIngyIiwiYkluZCIsImhlaWdodFNjYWxlIiwid2lkdGhTY2FsZSIsInlJbmQiLCJpbmQiLCJ0b3BJbmQiLCJib3R0b21JbmQiLCJ5TGVycCIsInhJbmQiLCJsZWZ0SW5kIiwicmlnaHRJbmQiLCJ4TGVycCIsInRvcExlZnQiLCJ0b3BSaWdodCIsImJvdHRvbUxlZnQiLCJib3R0b20iLCJjbG9zZXN0WCIsInJvdW5kIiwiY2xvc2VzdFkiLCJpbkluZCIsIm91dEluZCIsImNyb3BBbmRSZXNpemVDb25maWciLCJjdW1zdW0iLCJleGNsdXNpdmUiLCJyZXZlcnNlIiwicGVybXV0YXRpb24iLCJwZXJtdXRlZEF4aXMiLCJyZXN1bHREdHlwZSIsImZpbmFsRGltIiwiaW5kZXhBZGp1c3RlciIsImlkeCIsInByZXZJZHgiLCJyZXZlcnNlUGVybXV0YXRpb24iLCJnZXRVbmRvQXhlc1Blcm11dGF0aW9uIiwicmV2ZXJzZVRyYW5zcG9zZWRSZXN1bHQiLCJjdW1zdW1Db25maWciLCJkZW5zZUJpbmNvdW50IiwiZGVuc2VCaW5jb3VudENvbmZpZyIsImRlcHRoVG9TcGFjZSIsImlucHV0SGVpZ2h0IiwiaW5wdXRXaWR0aCIsImlucHV0RGVwdGgiLCJvdXRwdXRIZWlnaHQiLCJvdXRwdXRXaWR0aCIsIm91dHB1dERlcHRoIiwib3V0cHV0SWR4IiwiaCIsImluSCIsIm9mZnNldEgiLCJ3IiwiaW5XIiwib2Zmc2V0RCIsImlucHV0SWR4IiwiZGVwdGhUb1NwYWNlQ29uZmlnIiwiZGVwdGh3aXNlQ29udjJkTmF0aXZlIiwiJGRpbGF0aW9ucyIsImNoTXVsIiwicSIsImRlcHRod2lzZUNvbnYyZE5hdGl2ZUNvbmZpZyIsImRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyIiwidHJ1bmMiLCJkbSIsImRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyQ29uZmlnIiwiZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCIsImRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXRDb25maWciLCJkaWFnIiwieFNpemUiLCJkaWFnQ29uZmlnIiwiZGlsYXRpb24yZENvbmZpZyIsInhSYW5rIiwiZmlsdGVyVmFscyIsImZpbHRlclJhbmsiLCJjb21wdXRlRGlsYXRpb24yREluZm8iLCJvdXRSYW5rIiwib3V0cHV0VmFscyIsImhPdXQiLCJoQmVnIiwid091dCIsIndCZWciLCJjdXJWYWwiLCJOdW1iZXIiLCJNSU5fU0FGRV9JTlRFR0VSIiwiaEluIiwid0luIiwieEluZGV4IiwibG9jVG9JbmRleCIsImZpbHRlckluZGV4IiwidmFsIiwiZGlsYXRpb24yZEJhY2twcm9wRmlsdGVyQ29uZmlnIiwidG9OZXN0ZWRBcnJheSIsIiRmaWx0ZXIiLCJyYW5rIiwiJGR5IiwiZ3JhZGllbnRzIiwibWFrZVplcm9zTmVzdGVkVHlwZWRBcnJheSIsImhNYXgiLCJ3TWF4IiwiZGlsYXRpb24yZEJhY2twcm9wSW5wdXRDb25maWciLCJoSW5NYXgiLCJ3SW5NYXgiLCJlaW5zdW0iLCJlcXVhdGlvbiIsImFsbERpbXMiLCJzdW1tZWREaW1zIiwiaWREaW1zIiwiZGVjb2RlRWluc3VtRXF1YXRpb24iLCJjaGVja0VpbnN1bURpbVNpemVzIiwicGF0aCIsInN0ZXBzIiwiZ2V0RWluc3VtQ29tcHV0ZVBhdGgiLCJuU3RlcHMiLCJvdXQiLCJudW1EaW1zUmVtYWluaW5nIiwidGVuc29yc1RvRGlzcG9zZSIsImlkVGVybSIsInBlcm11dGF0aW9uSW5kaWNlcyIsImV4cGFuZERpbXMiLCJkaW1zVG9FeHBhbmQiLCJnZXRFaW5zdW1QZXJtdXRhdGlvbiIsImlzSWRlbnRpdHlQZXJtdXRhdGlvbiIsInRhcmdldFNoYXBlIiwic3BsaWNlIiwiZWluc3VtQ29uZmlnIiwiZWx1IiwiZXhwIiwiZWx1Q29uZmlnIiwiZWx1R3JhZCIsInYiLCJlbHVHcmFkQ29uZmlnIiwiZXF1YWxJbXBsIiwiZXF1YWwiLCJlcXVhbENvbmZpZyIsIkVSRl9QIiwiYTEiLCJFUkZfQTEiLCJhMiIsIkVSRl9BMiIsImEzIiwiRVJGX0EzIiwiYTQiLCJFUkZfQTQiLCJhNSIsIkVSRl9BNSIsImVyZiIsInNpZ24iLCJlcmZDb25maWciLCJleHBJbXBsIiwiZXhwQ29uZmlnIiwiZGltIiwiaW5wdXRSYW5rIiwibmV3U2hhcGUiLCIkZGltIiwiZXhwYW5kRGltc0NvbmZpZyIsImV4cG0xSW1wbCIsImV4cG0xIiwiZXhwbTFDb25maWciLCJmZnQiLCJpbnB1dFNpemUiLCJpbm5lckRpbWVuc2lvblNpemUiLCJpbnB1dDJEIiwicmVzdWx0UmVzaGFwZWQiLCJmZnRDb25maWciLCJmaWxsIiwiJGR0eXBlIiwiaW5mZXJEdHlwZSIsImZpbGxWYWx1ZXMiLCJmaWxsQ29uZmlnIiwiZmxpcExlZnRSaWdodENvbmZpZyIsImdldFR5cGVkQXJyYXlGcm9tRFR5cGUiLCJiYXRjaElkeCIsImJhdGNoT2Zmc2V0Iiwicm93T2Zmc2V0IiwiY29vcmRYIiwib3V0SWR4Iiwib3V0cHV0VmFsdWUiLCJmbG9vckltcGwiLCJmbG9vckNvbmZpZyIsImZsb29yRGl2SW1wbCIsImZsb29yRGl2IiwiZmxvb3JEaXZDb25maWciLCJmdXNlZENvbnYyRCIsImJpYXMiLCJwcmVsdUFjdGl2YXRpb25XZWlnaHRzIiwiYWN0aXZhdGlvbiIsImxlYWt5cmVsdUFscGhhIiwicmVzdWx0T2xkIiwiZnVzZWRDb252MkRDb25maWciLCJmdXNlZERlcHRod2lzZUNvbnYyRCIsIm9sZFJlc3VsdCIsImZ1c2VkRGVwdGh3aXNlQ29udjJEQ29uZmlnIiwiZ2F0aGVyTmQiLCJwYXJhbXMiLCJpbmRpY2VzIiwicGFyYW1zU2l6ZSIsImluZGljZXNTaGFwZSIsInNsaWNlUmFuayIsIm51bVNsaWNlcyIsInByZXBhcmVBbmRWYWxpZGF0ZSIsImluZGljZXNEYXRhIiwicGFyYW1zQnVmIiwiZ2F0aGVyTmRDb25maWciLCJnYXRoZXJOZEltcGwiLCJwYXJhbXNTaGFwZSIsImluZGV4IiwiZmxhdHRlbkluZGV4IiwiaW5kZXhUb0xvYyIsImdhdGhlclYyIiwiYmF0Y2hEaW1zIiwiJGJhdGNoRGltcyIsImluZGljZXNTaXplIiwicGFyc2VkQXhpcyIsInNoYXBlSW5mbyIsInNlZ21lbnRfdXRpbCIsImNvbGxlY3RHYXRoZXJPcFNoYXBlSW5mbyIsImZsYXR0ZW5YIiwib3V0ZXJTaXplIiwiZGltU2l6ZSIsImZsYXR0ZW5PdXRwdXRTaGFwZSIsImluZGljZXNCdWYiLCJvdXRwdXRTaGFwZSIsImdhdGhlclYyQ29uZmlnIiwiZ2F0aGVyVjJJbXBsIiwib3JpZ2luYWxMb2MiLCJpbmRpY2VzSWR4IiwiaW5kaWNlc0luZGV4Iiwib3JpZ2luYWxJbmRleCIsImdyZWF0ZXJJbXBsIiwiZ3JlYXRlciIsImdyZWF0ZXJDb25maWciLCJncmVhdGVyRXF1YWxJbXBsIiwiZ3JlYXRlckVxdWFsIiwiZ3JlYXRlckVxdWFsQ29uZmlnIiwiaWZmdCIsImlmZnRDb25maWciLCJpZGVudGl0eSIsImlkZW50aXR5Q29uZmlnIiwiaW1hZ1ZhbCIsImltYWdDb25maWciLCJpc0Zpbml0ZSIsImlzRmluaXRlQ29uZmlnIiwiaXNJbmYiLCJJbmZpbml0eSIsImlzSW5mQ29uZmlnIiwiaXNOYU4iLCJpc05hTkNvbmZpZyIsImxSTiIsImRlcHRoUmFkaXVzIiwiYWxwaGEiLCJiZXRhIiwiY2hhbm5lbHMiLCJtYXhEIiwic3VtQWNyb3NzQ2hhbm5lbHMiLCJjdXJyZW50Q2hhbm5lbCIsImJlZ2luU3VtT2Zmc2V0IiwiZW5kU3VtT2Zmc2V0IiwieiIsInBvdyIsImxSTkNvbmZpZyIsImxSTkdyYWQiLCJkeVNpemUiLCJ5VmFsdWVzIiwiZGVwdGhCZWdpbiIsImRlcHRoRW5kIiwibm9ybSIsImR5aSIsImxSTkdyYWRDb25maWciLCJsZWFreVJlbHUiLCJsZWFreVJlbHVDb25maWciLCJsZXNzSW1wbCIsImxlc3MiLCJsZXNzQ29uZmlnIiwibGVzc0VxdWFsSW1wbCIsImxlc3NFcXVhbCIsImxlc3NFcXVhbENvbmZpZyIsImxpblNwYWNlIiwic3RvcCIsIm51bSIsImxpblNwYWNlQ29uZmlnIiwibGluU3BhY2VJbXBsIiwic3RlcCIsImxvZ0ltcGwiLCJsb2ciLCJsb2dDb25maWciLCJsb2cxcCIsImxvZzFwQ29uZmlnIiwibG9naWNhbEFuZEltcGwiLCJsb2dpY2FsQW5kIiwibG9naWNhbEFuZENvbmZpZyIsImxvZ2ljYWxOb3QiLCJsb2dpY2FsTm90Q29uZmlnIiwibG9naWNhbE9ySW1wbCIsImxvZ2ljYWxPciIsImxvZ2ljYWxPckNvbmZpZyIsInJlZHVjdGlvbkluZGljZXMiLCJ4U2hhcGUiLCJtYXhPdXRTaGFwZSIsIm1heENvbmZpZyIsIm1heFBvb2wiLCJtYXhQb29sQ29uZmlnIiwibWF4UG9vbDNEIiwibWF4UG9vbDNEQ29uZmlnIiwibWF4UG9vbDNER3JhZCIsImlucHV0QnVmIiwibWF4UG9zQnVmIiwibWFzayIsIm1heFBvb2wzREdyYWRDb25maWciLCJtYXhQb29sR3JhZCIsIm1heFBvb2xHcmFkQ29uZmlnIiwibWF4UG9vbFdpdGhBcmdtYXhDb25maWciLCJpbmNsdWRlQmF0Y2hJbkluZGV4IiwicG9vbGVkIiwiaW5kZXhlcyIsInBvb2xlZERhdGFJZCIsImluZGV4ZXNEYXRhSWQiLCJtYXhQb29sV2l0aEFyZ21heEltcGwiLCJtYXhQb29scyIsIm1heFBvc2l0aW9ucyIsIm1heEltcGwiLCJtYXhpbXVtSW1wbCIsIm1heGltdW0iLCJtYXhpbXVtQ29uZmlnIiwidG9EaXNwb3NlIiwicmVkdWNlU2l6ZVNjYWxhciIsIm1lYW5Db25maWciLCJtaW5Db25maWciLCJtaW5pbXVtSW1wbCIsIm1pbmltdW0iLCJtaW5pbXVtQ29uZmlnIiwibWlycm9yUGFkIiwicGFkZGluZ3MiLCJlbmQiLCJyZXN1bHRTaXplIiwicmVzdWx0UmFuayIsInJlc3VsdFN0cmlkZXMiLCJjb29yZHMiLCJpbkluZGV4IiwibWlycm9yUGFkQ29uZmlnIiwibW9kSW1wbCIsInJlbSIsIm1vZCIsIm1vZENvbmZpZyIsIm11bHRpbm9taWFsIiwibG9naXRzIiwibnVtU2FtcGxlcyIsInNlZWQiLCJub3JtYWxpemVkIiwicHJvYmFiaWxpdGllcyIsIm51bUV2ZW50cyIsInByb2JWYWxzIiwicmVzU2hhcGUiLCJjZGYiLCJldmVudCIsInJhbmRvbSIsInRvU3RyaW5nIiwib3V0T2Zmc2V0Iiwic2FtcGxlSWQiLCJtdWx0aW5vbWlhbENvbmZpZyIsIm11bHRpcGx5SW1wbCIsIm11bHRpcGx5Q29tcGxleEltcGwiLCJtdWx0aXBseSIsIm11bHRpcGx5Q29uZmlnIiwibmVnSW1wbCIsInhEdHlwZSIsIm1pbnVzT25lIiwiY3JlYXRlU2NhbGFyVmFsdWUiLCJuZWciLCJuZWdDb25maWciLCJub25NYXhTdXBwcmVzc2lvblYzSW1wbCIsIm5vbk1heFN1cHByZXNzaW9uVjMiLCJzY29yZXMiLCJtYXhPdXRwdXRTaXplIiwiaW91VGhyZXNob2xkIiwic2NvcmVUaHJlc2hvbGQiLCJib3hlc1ZhbHMiLCJzY29yZXNWYWxzIiwic2VsZWN0ZWRJbmRpY2VzIiwibm9uTWF4U3VwcHJlc3Npb25WM0NvbmZpZyIsIm5vbk1heFN1cHByZXNzaW9uVjRJbXBsIiwibm9uTWF4U3VwcHJlc3Npb25WNCIsInBhZFRvTWF4T3V0cHV0U2l6ZSIsInZhbGlkT3V0cHV0cyIsIm5vbk1heFN1cHByZXNzaW9uVjRDb25maWciLCJub25NYXhTdXBwcmVzc2lvblY1SW1wbCIsIm5vbk1heFN1cHByZXNzaW9uVjUiLCJzb2Z0Tm1zU2lnbWEiLCJtYXhPdXRwdXRTaXplVmFsIiwiaW91VGhyZXNob2xkVmFsIiwic2NvcmVUaHJlc2hvbGRWYWwiLCJzb2Z0Tm1zU2lnbWFWYWwiLCJzZWxlY3RlZFNjb3JlcyIsIm5vbk1heFN1cHByZXNzaW9uVjVDb25maWciLCJub3RFcXVhbEltcGwiLCJub3RFcXVhbCIsIm5vdEVxdWFsQ29uZmlnIiwib25lSG90IiwiZGVwdGgiLCJvblZhbHVlIiwib2ZmVmFsdWUiLCJpbmRpY2VzVmFsIiwib25lSG90Q29uZmlnIiwib25lc0xpa2UiLCJpbWFnUGFydCIsIm9uZXNMaWtlQ29uZmlnIiwicGFjayIsImFzc2VydFNoYXBlc01hdGNoIiwiZXhwYW5kZWRUZW5zb3JzIiwiZXhwYW5kZWRUIiwicGFja0NvbmZpZyIsInBhZFYyIiwiY29uc3RhbnRWYWx1ZSIsIm91dENvb3JkcyIsInBhZFYyQ29uZmlnIiwicG93SW1wbCIsInBvd0NvbmZpZyIsInByZWx1SW1wbCIsInhWYWx1ZSIsInByZWx1IiwiYlZhbHMiLCJwcmVsdUNvbmZpZyIsInByb2RJbXBsIiwicmVkdWN0aW9uQXhlcyIsIm91dER0eXBlIiwicGVybXV0ZWRYIiwicHJvZENvbmZpZyIsInJhbmdlIiwicmFuZ2VDb25maWciLCJyYW5nZUltcGwiLCJudW1FbGVtZW50cyIsInJlYWxWYWwiLCJyZWFsQ29uZmlnIiwicmVhbERpdkltcGwiLCJkaXYiLCJyZWFsRGl2Q29uZmlnIiwicmVjaXByb2NhbCIsInJlY2lwcm9jYWxDb25maWciLCJyZWx1IiwicmVsdUNvbmZpZyIsInJlbHU2IiwicmVsdTZDb25maWciLCJyZXNoYXBlIiwiJHNoYXBlIiwiaW5mZXJGcm9tSW1wbGljaXRTaGFwZSIsIiR4U2l6ZSIsInhEYXRhIiwicmVzaGFwZUNvbmZpZyIsInJlc2l6ZUJpbGluZWFyIiwiaW1hZ2VzIiwiYWxpZ25Db3JuZXJzIiwiaGFsZlBpeGVsQ2VudGVycyIsImltYWdlc1N0cmlkZXMiLCJuZXdIZWlnaHQiLCJuZXdXaWR0aCIsIm9sZEhlaWdodCIsIm9sZFdpZHRoIiwiZWZmZWN0aXZlSW5wdXRTaXplIiwiZWZmZWN0aXZlT3V0cHV0U2l6ZSIsImVmZmVjdGl2ZVJvd1NpemVSYXRpbyIsImVmZmVjdGl2ZUNvbFNpemVSYXRpbyIsInNvdXJjZUZyYWNSb3ciLCJzb3VyY2VSb3dGbG9vciIsInJvd0ZyYWMiLCJzb3VyY2VSb3dDZWlsIiwidG9wUm93T2Zmc2V0IiwiYm90Um93T2Zmc2V0Iiwic291cmNlRnJhY0NvbCIsInNvdXJjZUNvbEZsb29yIiwiY29sRnJhYyIsInNvdXJjZUNvbENlaWwiLCJ0b3BMZWZ0T2ZmZXN0IiwiYm90TGVmdE9mZnNldCIsInRvcFJpZ2h0T2Zmc2V0IiwiYm90UmlnaHRPZmZlc3QiLCJuZXdWYWx1ZSIsInJlc2l6ZUJpbGluZWFyQ29uZmlnIiwicmVzaXplQmlsaW5lYXJHcmFkIiwieEhlaWdodCIsInhXaWR0aCIsInlIZWlnaHQiLCJ5V2lkdGgiLCJlZmZlY3RpdmVYU2l6ZSIsImVmZmVjdGl2ZVlTaXplIiwiYk9mZnNldCIsInRvcER4UkluZGV4IiwiYm90dG9tRHhSSW5kZXgiLCJ0b3BEeFJPZmZzZXQiLCJib3R0b21EeFJPZmZzZXQiLCJkeFJMZXJwIiwiaW52ZXJzZUR4UkxlcnAiLCJsZWZ0RHhDSW5kZXgiLCJyaWdodER4Q0luZGV4IiwiZHhDTGVycCIsImludmVyc2VEeENMZXJwIiwidG9wTGVmdFJDT2Zmc2V0IiwidG9wUmlnaHRSQ09mZnNldCIsImJvdHRvbUxlZnRSQ09mZnNldCIsImJvdHRvbVJpZ2h0UkNPZmZzZXQiLCJpbnZlcnNlRHhSTGVycFRpbWVzSW52ZXJzZUR4Q0xlcnAiLCJpbnZlcnNlRHhSTGVycFRpbWVzRHhDTGVycCIsImR4UkxlcnBUaW1lc0ludmVyc2VEeENMZXJwIiwiZHhSTGVycFRpbWVzRHhDTGVycCIsImR5VmFsIiwicmVzaXplQmlsaW5lYXJHcmFkQ29uZmlnIiwicmVzaXplTmVhcmVzdE5laWdoYm9yIiwib3V0cHV0T2Zmc2V0Iiwic291cmNlTmVhcmVzdFJvdyIsInNvdXJjZU5lYXJlc3RDb2wiLCJuZXdWYWwiLCJyZXNpemVOZWFyZXN0TmVpZ2hib3JDb25maWciLCJyZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkIiwiaW52SGVpZ2h0U2NhbGUiLCJpbnZXaWR0aFNjYWxlIiwid2luSGVpZ2h0Iiwid2luV2lkdGgiLCJzdGFydFJMZXJwIiwic3RhcnREeVIiLCJzdGFydENMZXJwIiwic3RhcnREeUMiLCJhY2N1bSIsImR5UkluZGV4IiwiZHlST2Zmc2V0IiwiZHlDSW5kZXgiLCJkeUNPZmZzZXQiLCJyZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkQ29uZmlnIiwiZGltcyIsIiRkaW1zIiwib3V0TG9jIiwiaW5Mb2MiLCJyZXZlcnNlQ29uZmlnIiwicm90YXRlV2l0aE9mZnNldENvbmZpZyIsInJhZGlhbnMiLCJmaWxsVmFsdWUiLCJjZW50ZXIiLCJjZW50ZXJYIiwiY2VudGVyWSIsImdldEltYWdlQ2VudGVyIiwic2luRmFjdG9yIiwic2luIiwiY29zRmFjdG9yIiwiY29vcmRZIiwiYmFzZSIsInJvdW5kQ29uZmlnIiwicnNxcnRJbXBsIiwicnNxcnQiLCJyc3FydENvbmZpZyIsInNjYXR0ZXJOZCIsInVwZGF0ZXMiLCJudW1VcGRhdGVzIiwib3V0cHV0U2l6ZSIsImNhbGN1bGF0ZVNoYXBlcyIsInVwZGF0ZXNCdWYiLCJzY2F0dGVyTmRDb25maWciLCJzY2F0dGVySW1wbCIsImRlZmF1bHRWYWx1ZSIsInN1bUR1cGVJbmRpY2VzIiwiZmxhdHRlblNoYXBlIiwidXBkYXRlc0RhdGEiLCJzZWxlY3QiLCJlIiwiY29uZGl0aW9uUmFuayIsInRWYWx1ZXMiLCJlVmFsdWVzIiwibmV3VmFsdWVzIiwic2VsZWN0Q29uZmlnIiwic2NhbGVBbHBoYSIsIlNFTFVfU0NBTEVBTFBIQSIsIlNFTFVfU0NBTEUiLCJzZWx1Iiwic2VsdUNvbmZpZyIsInNpZ21vaWQiLCJzaWdtb2lkQ29uZmlnIiwic2lnbkNvbmZpZyIsInNpbkNvbmZpZyIsInNpbmgiLCJzaW5oQ29uZmlnIiwic2xpY2VJbXBsIiwiaXNDb250aW5vdXMiLCJpc1NsaWNlQ29udGlub3VzIiwiZmxhdE9mZnNldCIsImNvbXB1dGVGbGF0T2Zmc2V0Iiwic3ViYXJyYXkiLCJpbkJ1ZiIsImZyb21TdHJpbmdBcnJheVRvVWludDgiLCIkYmVnaW4iLCIkc2l6ZSIsInBhcnNlU2xpY2VQYXJhbXMiLCJhc3NlcnRQYXJhbXNWYWxpZCIsInNsaWNlQ29uZmlnIiwic29mdG1heCIsImxvZ2l0c1JhbmsiLCJtYXhMb2dpdCIsIm1heExvZ2l0UmVzaGFwZWQiLCJzdW1FeHAiLCJzdW1SZXNoYXBlZCIsInNvZnRtYXhDb25maWciLCJ0aHJlc2hvbGQiLCJzb2Z0cGx1cyIsInRvb0xhcmdlIiwidG9vU21hbGwiLCJleHBYIiwic29mdHBsdXNDb25maWciLCJzcGFjZVRvQmF0Y2hORCIsImNvbXBsZXRlUGFkZGluZ3MiLCJwYWRkZWRYIiwicmVzaGFwZWRQYWRkZWRTaGFwZSIsInBlcm11dGVkUmVzaGFwZWRQYWRkZWRQZXJtdXRhdGlvbiIsInJlc2hhcGVJbnB1dHMiLCJyZXNoYXBlQXR0cnMiLCJwYWRkZWRYUmVzaGFwZWQiLCJ0cmFuc3Bvc2VJbnB1dHMiLCJ0cmFuc3Bvc2VBdHRycyIsInBhZGRlZFhUIiwicmVzdWx0UmVzaGFwZUlucHV0cyIsInJlc3VsdFJlc2hhcGVBdHRycyIsInNwYWNlVG9CYXRjaE5EQ29uZmlnIiwic3BhcnNlRmlsbEVtcHR5Um93cyIsImRlbnNlU2hhcGUiLCIkaW5kaWNlcyIsIiR2YWx1ZXMiLCIkZGVuc2VTaGFwZSIsIiRkZWZhdWx0VmFsdWUiLCJvdXRwdXRJbmRpY2VzIiwib3V0cHV0SW5kaWNlc1NoYXBlIiwib3V0cHV0VmFsdWVzIiwiZW1wdHlSb3dJbmRpY2F0b3IiLCJyZXZlcnNlSW5kZXhNYXAiLCJVaW50OEFycmF5Iiwic3BhcnNlRmlsbEVtcHR5Um93c0NvbmZpZyIsInNwYXJzZUZpbGxFbXB0eVJvd3NJbXBsIiwiaW5kaWNlc0RUeXBlIiwidmFsdWVzRFR5cGUiLCJpbmRpY2VzQ291bnQiLCJkZW5zZVJvd3MiLCJyb3dzQXJlT3JkZXJlZCIsImxhc3RJbmRpY2VzUm93IiwiY3NyT2Zmc2V0IiwiYWxsUm93c0Z1bGwiLCJyb3dFbXB0eSIsImZ1bGxJbmRpY2VzQ291bnQiLCJmaWxsZWRDb3VudCIsIm91dHB1dEkiLCJzdGFydGluZ0luZGV4Iiwic3BhcnNlUmVzaGFwZSIsImlucHV0SW5kaWNlcyIsIiRpbnB1dFNoYXBlIiwiJGlucHV0SW5kaWNlcyIsIm5ld0luZGljZXMiLCJzcGFyc2VSZXNoYXBlQ29uZmlnIiwic3BhcnNlUmVzaGFwZUltcGwiLCJpbnB1dEluZGljZXNTaGFwZSIsImlucHV0RFR5cGUiLCJkZW5zZVNpemUiLCJubnoiLCJvdXRwdXRSYW5rIiwicHJvZHVjdCIsInVua25vd25JbmRleCIsIm1pc3NpbmciLCJpbnB1dFN0cmlkZXMiLCJvdXRwdXRTdHJpZGVzIiwic3BhcnNlU2VnbWVudE1lYW4iLCJzZWdtZW50SWRzIiwiJGRhdGEiLCIkc2VnbWVudElkcyIsIm91dHB1dERhdGEiLCJvdXRwdXREYXRhU2hhcGUiLCJzcGFyc2VTZWdtZW50TWVhbkNvbmZpZyIsInNwYXJzZVNlZ21lbnRSZWR1Y3Rpb25JbXBsIiwiaXNNZWFuIiwibnVtSW5kaWNlcyIsImlucHV0RmxhdCIsIm51bUNvbCIsIm91dHB1dFJvd3MiLCJvdXRwdXRMZW5ndGgiLCJ1bmluaXRpYWxpemVkSW5kZXgiLCJvdXRJbmRleCIsIm5leHRJbmRleCIsInNwYXJzZVNlZ21lbnRTdW0iLCJzcGFyc2VTZWdtZW50U3VtQ29uZmlnIiwic3BhcnNlVG9EZW5zZSIsInNwYXJzZUluZGljZXMiLCJzcGFyc2VWYWx1ZXMiLCJzcGFyc2VUb0RlbnNlQ29uZmlnIiwic3BsaXRWIiwibnVtT3JTaXplU3BsaXRzIiwic3BsaXRTaXplcyIsInByZXBhcmVTcGxpdFNpemUiLCJzbGljZVQiLCJzcGxpdFZDb25maWciLCJzcXJ0Q29uZmlnIiwic3F1YXJlQ29uZmlnIiwic3F1YXJlZERpZmZlcmVuY2VJbXBsIiwiZGlmZiIsInNxdWFyZWREaWZmZXJlbmNlIiwic3F1YXJlZERpZmZlcmVuY2VDb25maWciLCJzdGVwQXR0cnMiLCJOYU4iLCJzdGVwQ29uZmlnIiwic3RyaWRlZFNsaWNlIiwiYmVnaW5NYXNrIiwiZW5kTWFzayIsImVsbGlwc2lzTWFzayIsIm5ld0F4aXNNYXNrIiwic2hyaW5rQXhpc01hc2siLCJub25TdHJpZGVkIiwiJHN0cmlkZXMiLCJzbGljZUluZm8iLCJzbGljZWQiLCJzb21lIiwic3RyaWRlZFNsaWNlQ29uZmlnIiwic3RyaWRlZFNsaWNlSW1wbCIsImxvYyIsIm5ld0xvYyIsInN0cmluZ05HcmFtcyIsInNlcGFyYXRvciIsIm5HcmFtV2lkdGhzIiwicmlnaHRQYWQiLCJwYWRXaWR0aCIsInByZXNlcnZlU2hvcnRTZXF1ZW5jZXMiLCJkYXRhU3BsaXRzIiwiJGRhdGFTcGxpdHMiLCJuR3JhbXMiLCJuR3JhbXNTcGxpdHMiLCJzdHJpbmdOR3JhbXNDb25maWciLCJTdHJpbmdOR3JhbXNPcCIsInByZXNlcnZlU2hvcnQiLCJnZXRQYWRXaWR0aCIsIm5HcmFtV2lkdGgiLCJnZXROdW1OR3JhbXMiLCJjcmVhdGVOR3JhbXMiLCJzcGxpdEluZGV4Iiwib3V0cHV0U3RhcnRJbmRleCIsIm51bU5HcmFtcyIsIm5HcmFtSW5kZXgiLCJsZWZ0UGFkZGluZyIsInJpZ2h0UGFkZGluZyIsIm51bVRva2VucyIsImRhdGFTdGFydEluZGV4IiwibkdyYW1TaXplIiwibkdyYW0iLCJuZXh0TkdyYW1JbmRleCIsImFwcGVuZFRvTkdyYW0iLCJzdHIiLCJjb21wdXRlIiwic3BsaXRzIiwiaW5wdXREYXRhU2l6ZSIsInNwbGl0c1NpemUiLCJwcmV2U3BsaXQiLCJ2YWxpZFNwbGl0cyIsIm51bUJhdGNoSXRlbXMiLCJlbXB0eSIsIm91dHB1dFN0YXJ0SWR4IiwiZGF0YUxlbmd0aCIsInN0cmluZ05HcmFtc0ltcGwiLCJzdHJpbmdTcGxpdCIsInNraXBFbXB0eSIsImRlbGltaXRlciIsIiRpbnB1dCIsIiRkZWxpbWl0ZXIiLCJzdHJpbmdTcGxpdENvbmZpZyIsInNwbGl0IiwiZGVsaW1pdGVycyIsImluZGV4T2YiLCJ0b2tlbiIsInRva2VuU3RhcnQiLCJzdHJpbmdTcGxpdEltcGwiLCJ0b2tlbnMiLCJtYXhOdW1FbnRyaWVzIiwicGFydHMiLCJuRW50cmllcyIsInN0cmluZ1RvSGFzaEJ1Y2tldEZhc3QiLCJudW1CdWNrZXRzIiwic3RyaW5nVG9IYXNoQnVja2V0RmFzdENvbmZpZyIsInN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RJbXBsIiwiZmluZ2VyUHJpbnQ2NCIsIm1vZHVsbyIsImdldExvd0JpdHNVbnNpZ25lZCIsInN1YkltcGwiLCJzdWJDb21wbGV4SW1wbCIsInN1YiIsInN1YkNvbmZpZyIsInVwY2FzdFR5cGUiLCJzdW1Db25maWciLCJ0YW4iLCJ0YW5Db25maWciLCJ0YW5oIiwidGFuaENvbmZpZyIsInRpbGUiLCJyZXBzIiwidGlsZUNvbmZpZyIsInRpbGVJbXBsIiwidG9wSyIsInNvcnRlZCIsImFsbFRvcEtWYWxzIiwiYWxsVG9wS0luZGljZXMiLCJ0b3BLQ29uZmlnIiwiY29tcGFyZVBhaXIiLCJ2YWx1ZURpZmYiLCJhcnJheSIsInJpZ2h0Iiwic2QiLCJzd2FwIiwidG9wS0ltcGwiLCJsYXN0RGltIiwidmFsQW5kSW5kIiwic29ydCIsInRvcEtWYWxzIiwidG9wS0luZGljZXMiLCJ0cmFuc2Zvcm0iLCJ0cmFuc2Zvcm1zIiwiaW50ZXJwb2xhdGlvbiIsImZpbGxNb2RlIiwiYmF0Y2hTdHJpZGUiLCJyb3dTdHJpZGUiLCJjb2xTdHJpZGUiLCJ0cmFuc2Zvcm1WYWxzIiwib3V0WSIsIm91dFgiLCJwcm9qZWN0aW9uIiwiaW5YIiwiaW5ZIiwibWFwQ29vcmQiLCJuZWFyZXN0SW50ZXJwb2xhdGlvbiIsImJpbGluZWFySW50ZXJwb2xhdGlvbiIsInRyYW5zZm9ybUNvbmZpZyIsIm91dENvb3JkIiwibGVuIiwiaW5Db29yZCIsInN6MiIsImNsYW1wIiwibWFwQ29vcmRSZWZsZWN0Iiwic3oiLCJtYXBDb29yZFdyYXAiLCJtYXBDb29yZE5lYXJlc3QiLCJtYXBDb29yZENvbnN0YW50IiwicmVhZFdpdGhGaWxsVmFsdWUiLCJ5Rmxvb3IiLCJ4Rmxvb3IiLCJ5Q2VpbCIsInhDZWlsIiwidHJhbnNwb3NlIiwidHJhbnNwb3NlQ29uZmlnIiwidHJhbnNwb3NlSW1wbCIsIm5ld1N0cmlkZXMiLCJ1bmlxdWUiLCJ1bmlxdWVDb25maWciLCJ1bmlxdWVJbXBsIiwidW5pcXVlRWxlbWVudHMiLCJpbnB1dEJ1ZmZlciIsInVuaXF1ZUluZGljZXMiLCJpczFEVGVuc29yIiwiZWxlbWVudCIsImF4aXNWYWx1ZXMiLCJqb2luIiwidW5kZWZpbmVkIiwidW5pcXVlSW5kZXgiLCJrZXlzIiwib3V0cHV0VG1wU2hhcGUiLCJvdXRwdXRCdWZmZXIiLCJ1bmlxdWVFbGVtZW50SW5kZXgiLCJ1bnBhY2siLCJ2YWx1ZVJhbmsiLCJ0ZW1wUmVzIiwidW5wYWNrQ29uZmlnIiwidW5zb3J0ZWRTZWdtZW50U3VtIiwibnVtU2VnbWVudHMiLCJpbnRlcm1lZGlhdGVzIiwibnVtSXRlcnMiLCJleHBhbmRlZCIsInNjYWxhclZhbHVlIiwic2VnbWVudElkIiwibWFza0Nhc3RlZCIsIm11bCIsInN1bVRlbnNvckluZm8iLCJ1bnNvcnRlZFNlZ21lbnRTdW1Db25maWciLCJ6ZXJvc0xpa2UiLCJ6ZXJvc0xpa2VDb25maWciLCJfZnVzZWRNYXRNdWwiLCJjdXJyZW50IiwiYWRkUmVzIiwiYWN0aXZhdGlvblJlcyIsIl9mdXNlZE1hdE11bENvbmZpZyIsImtlcm5lbENvbmZpZ3MiLCJrZXJuZWxDb25maWciLCJjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsIiwib3AiLCJhU2hhcGUiLCJiU2hhcGUiLCJhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSIsImFTdHJpZGVzIiwiYlN0cmlkZXMiLCJhQnJvYWRjYXN0RGltcyIsImdldEJyb2FkY2FzdERpbXMiLCJiQnJvYWRjYXN0RGltcyIsImFMb2MiLCJhSW5kZXgiLCJiTG9jIiwiYkluZGV4IiwiYmluYXJ5S2VybmVsRnVuYyIsInNpbXBsZUltcGwiLCJjb21wbGV4SW1wbCIsImRlY29kZWRBVmFscyIsImRlY29kZWRCVmFscyIsIiRhQ29tcGxleCIsIiRhQ29tcGxleFZhbHMiLCJhUmVhbFZhbHMiLCJhSW1hZ1ZhbHMiLCIkYkNvbXBsZXgiLCIkYkNvbXBsZXhWYWxzIiwiYlJlYWxWYWxzIiwiYkltYWdWYWxzIiwicmVzdWx0UmVhbERhdGEiLCJyZXN1bHRJbWFnRGF0YSIsInJlc3VsdFJlYWwiLCJyZXN1bHRJbWFnIiwiY3JlYXRlQ29tcGxleEJpbmFyeUtlcm5lbEltcGwiLCJyZXN1bHRSZWFsVmFscyIsInJlc3VsdEltYWdWYWxzIiwiYUlkeCIsImJJZHgiLCJvcFJlc3VsdCIsImZmdEJhdGNoIiwiaW52ZXJzZSIsImlubmVyRGltIiwiaW5wdXRWYWxzIiwicmVhbDJEIiwiaW1hZzJEIiwiZmZ0SW1wbCIsImdldENvbXBsZXhXaXRoSW5kZXgiLCIkcmVhbEluZm8iLCIkaW1hZ0luZm8iLCJmZnRSYWRpeDIiLCJyZWFsSW5mbyIsImltYWdJbmZvIiwic2l6ZUluZm8iLCJzaXplSW5mb0NvcHkiLCJkaXZSZWFsSW5mbyIsImRpdkltYWdJbmZvIiwiZGl2UmVhbFZhbHMiLCJkaXZJbWFnVmFscyIsInJhd091dHB1dCIsInJldCIsImV4cG9uZW50IiwidGVybSIsImFzc2lnblRvVHlwZWRBcnJheSIsImZvdXJpZXJUcmFuc2Zvcm1CeU1hdG11bCIsInNwbGl0UmVhbEFuZEltYWdBcnJheXMiLCJoYWxmIiwiZXZlbkNvbXBsZXgiLCJjb21wbGV4V2l0aEV2ZW5JbmRleCIsImV2ZW5SZWFsVmFscyIsImV2ZW5JbWFnVmFscyIsImV2ZW5TaGFwZSIsImV2ZW5SZWFsSW5mbyIsImV2ZW5JbWFnSW5mbyIsImV2ZW5UZW5zb3JJbmZvIiwib2RkQ29tcGxleCIsImNvbXBsZXhXaXRoT2RkSW5kZXgiLCJvZGRSZWFsVmFscyIsIm9kZEltYWdWYWxzIiwib2RkU2hhcGUiLCJvZGRSZWFsSW5mbyIsIm9kZEltYWdJbmZvIiwib2RkVGVuc29ySW5mbyIsIiRldmVuQ29tcGxleCIsIiRldmVuUmVhbFZhbHMiLCIkZXZlbkltYWdWYWxzIiwiJGV2ZW5TaGFwZSIsIiRldmVuUmVhbEluZm8iLCIkZXZlbkltYWdJbmZvIiwiJGV2ZW5UZW5zb3JJbmZvIiwiJG9kZENvbXBsZXgiLCIkb2RkUmVhbFZhbHMiLCIkb2RkSW1hZ1ZhbHMiLCIkb2RkU2hhcGUiLCIkb2RkUmVhbEluZm8iLCIkb2RkSW1hZ0luZm8iLCIkb2RkVGVuc29ySW5mbyIsImV4cG9uZW50cyIsImVTaGFwZSIsImVSZWFsSW5mbyIsImVJbWFnSW5mbyIsImV4cG9uZW50SW5mbyIsImFkZFBhcnQiLCJzdWJQYXJ0IiwiYWRkUGFydFJlYWwiLCJzdWJQYXJ0UmVhbCIsImFkZFBhcnRJbWFnIiwic3ViUGFydEltYWciLCIkcmVhbCIsIiRpbWFnIiwiJHJlYWxWYWxzIiwiJGltYWdWYWxzIiwiYXBwbHlBY3RpdmF0aW9uIiwicG9vbCIsInBvb2xUeXBlIiwiaW5pdGlhbFZhbHVlIiwiTkVHQVRJVkVfSU5GSU5JVFkiLCJQT1NJVElWRV9JTkZJTklUWSIsIm91dHB1dEJhdGNoU3RyaWRlcyIsIm91dHB1dFJvd1N0cmlkZXMiLCJvdXRwdXRDb2xTdHJpZGVzIiwib3V0cHV0QmF0Y2hPZmZzZXQiLCJpbnB1dEJhdGNoT2Zmc2V0IiwieFJNYXgiLCJvdXRwdXRSb3dPZmZzZXQiLCJ4Q01heCIsIm1pbk1heFZhbHVlIiwiYXZnVmFsdWUiLCJjb3VudCIsInhST2Zmc2V0IiwicGl4ZWwiLCJtYXhQb29sUG9zaXRpb25zIiwiZmxhdHRlblBvc2l0aW9ucyIsIm1heFZhbHVlIiwibWF4UG9zaXRpb24iLCJwb29sM2QiLCJvdXRwdXREZXB0aFN0cmlkZXMiLCJ5RGVwdGgiLCJ4RGVwdGhDb3JuZXIiLCJ4RGVwdGhNaW4iLCJ4RGVwdGhNYXgiLCJvdXRwdXREZXB0aE9mZnNldCIsInlSb3ciLCJ4Um93Q29ybmVyIiwieFJvd01pbiIsInhSb3dNYXgiLCJ5Q29sIiwieENvbENvcm5lciIsInhDb2xNaW4iLCJ4Q29sTWF4Iiwib3V0cHV0Q29sT2Zmc2V0IiwieERlcHRoIiwieERlcHRoT2Zmc2V0IiwieFJvdyIsInhSb3dPZmZzZXQiLCJ4Q29sIiwibWF4UG9vbDNkUG9zaXRpb25zIiwiY3JlYXRlU2ltcGxlVW5hcnlJbXBsIiwidW5hcnlLZXJuZWxGdW5jIiwidW5hcnlLZXJuZWxGdW5jRnJvbUltcGwiLCJ1bmFyeUltcGwiLCJ6ZXJvcyIsInZlcnNpb24iLCJCYWNrZW5kV2FzbSIsIndhc20iLCJkYXRhSWROZXh0TnVtYmVyIiwidGZqcyIsImluaXQiLCJkYXRhSWRNYXAiLCJzdHJpbmdCeXRlcyIsIm1lbW9yeU9mZnNldCIsIm51bUJ5dGVzIiwiYnl0ZXNQZXJFbGVtZW50IiwiX21hbGxvYyIsInJlZ2lzdGVyVGVuc29yIiwiSEVBUFU4IiwiYnl0ZU9mZnNldCIsInR5cGVkQXJyYXlGcm9tQnVmZmVyIiwiX2ZyZWUiLCJnZXRNZW1vcnlPZmZzZXQiLCJQVGhyZWFkIiwidGVybWluYXRlQWxsVGhyZWFkcyIsInR5cGVkQXJyYXlGcm9tSGVhcCIsImdldFBhdGhUb1dhc21CaW5hcnkiLCJzaW1kU3VwcG9ydGVkIiwidGhyZWFkc1N1cHBvcnRlZCIsIndhc21Nb2R1bGVGb2xkZXIiLCJ3YXNtUGF0aCIsIndhc21GaWxlTWFwIiwiYXN5bmMiLCJQcm9taXNlIiwiZ2V0QXN5bmMiLCJyZXNvbHZlIiwicmVqZWN0IiwiZmFjdG9yeUNvbmZpZyIsImxvY2F0ZUZpbGUiLCJwcmVmaXgiLCJlbmRzV2l0aCIsInJlc3BvbnNlIiwiYmxvYiIsIkJsb2IiLCJ0eXBlIiwiVVJMIiwiY3JlYXRlT2JqZWN0VVJMIiwid2FzbVBhdGhQcmVmaXgiLCJjdXN0b21GZXRjaCIsImluc3RhbnRpYXRlV2FzbSIsImltcG9ydHMiLCJjYWxsYmFjayIsImZldGNoIiwiY3JlZGVudGlhbHMiLCJ0aGVuIiwiZW52IiwiYXJyYXlCdWZmZXIiLCJiaW5hcnkiLCJXZWJBc3NlbWJseSIsImluc3RhbnRpYXRlIiwiaW5zdGFuY2UiLCJpbml0aWFsaXplZCIsIm9uQWJvcnQiLCJpbml0QWJvcnRlZCIsIm1lc3NhZ2UiLCJtYWluU2NyaXB0VXJsT3JCbG9iIiwiY3dyYXAiLCJ3YXNtQmluYXJ5TmFtZXMiLCJzZXRXYXNtUGF0aCIsInVzZVBsYXRmb3JtRmV0Y2giLCJzZXRXYXNtUGF0aHMiLCJwcmVmaXhPckZpbGVNYXAiLCJtaXNzaW5nUGF0aHMiLCJyZXNldFdhc21QYXRoIiwiRU5WIiwicmVnaXN0ZXJGbGFnIiwidmFsaWRhdGUiLCJNZXNzYWdlQ2hhbm5lbCIsInBvcnQxIiwicG9zdE1lc3NhZ2UiLCJTaGFyZWRBcnJheUJ1ZmZlciIsIndhc21GdW5jIiwic2V0dXBGdW5jIiwiaW5wdXRJZHMiLCJpbnB1dElkc0J5dGVzIiwid2FzbUFsbCIsImlucHV0SWQiLCJ0cmFuc3Bvc2VkIiwib3JpZ2luYWxBeGVzIiwiaW5wdXRXYXNUcmFuc3Bvc2VkIiwid2FzbUFueSIsInhJZCIsInRyYW5zcG9zZWRJZCIsImlubmVyU2l6ZSIsIndhc21BdmdQb29sIiwicGFkUmlnaHQiLCJwYWRCb3R0b20iLCJ3YXNtQmF0Y2hNYXRNdWwiLCJhM2RJZCIsImIzZElkIiwiYVNoYXBlQnl0ZXMiLCJiU2hhcGVCeXRlcyIsImluVmFscyIsIndhc21DbGlwIiwiY2xpcEJ5VmFsdWVDb25maWciLCJzdW1Jbm5lckRpbXMiLCJpbm5lckRpbXMiLCJpbk9mZnNldCIsIndhc21Db252MmQiLCJmaWx0ZXJJZCIsImlucHV0Q2hhbm5lbHMiLCJvdXRwdXRDaGFubmVscyIsImlzU2FtZVBhZCIsIndhc21Db252MkRCYWNrcHJvcElucHV0IiwiZHhTdHJpZGVzIiwiZHlJZCIsIkludGVycG9sYXRpb25NZXRob2QiLCJ3YXNtQ3JvcEFuZFJlc2l6ZSIsImNhc3RlZERhdGEiLCJpbWFnZXNEYXRhIiwiaW1hZ2VzSWQiLCJib3hlc0lkIiwiYm94SW5kSWQiLCJpbWFnZXNTaGFwZUJ5dGVzIiwid2FzbUN1bXN1bSIsInBlcm11dGVkT3V0IiwicGVybXV0ZWRYSWQiLCJwZXJtdXRlZE91dElkIiwidW5kb1Blcm11dGF0aW9uIiwid2FzbURlcHRoVG9TcGFjZSIsInhTdHJpZGVzQnl0ZXMiLCJvdXRwdXRTaGFwZUJ5dGVzIiwib3V0U3RyaWRlc0J5dGVzIiwid2FzbURlcHRod2lzZUNvbnYyZCIsIndhc21GbGlwTGVmdFJpZ2h0IiwiZmxpcExlZnRSaWdodCIsImltYWdlSWQiLCJ3YXNtQmF0Y2hOb3JtIiwiZnVzZWRCYXRjaE5vcm1Db25maWciLCJtZWFuSWQiLCJ2YXJpYW5jZUlkIiwib2Zmc2V0SWQiLCJzY2FsZUlkIiwid2FzbUZ1c2VkQ29udjJkIiwiZnVzZWRBY3RpdmF0aW9uIiwiYmlhc0lkIiwiYmlhc0RhdGEiLCJwcmVsdUFjdGl2YXRpb25XZWlnaHRzSWQiLCJ3YXNtRnVzZWREZXB0aHdpc2VDb252MmQiLCJ3YXNtR2F0aGVyTmQiLCJpbmRpY2VzSWQiLCJzdHJpZGVzQnl0ZXMiLCJ3YXNtR2F0aGVyIiwic3RyaWRlc1NpemUiLCJ3YXNtTWF4Iiwid2FzbU1heFBvb2wiLCJ3YXNtTWVhbiIsImNhc3RlZElucHV0Iiwid2FzbU1pbiIsIk1pcnJvclBhZGRpbmdNb2RlIiwid2FzbU1pcnJvclBhZCIsInhTaGFwZUJ5dGVzIiwicHJlUGFkZGluZ3NGbGF0IiwicGFkVHVwbGUiLCJwb3N0UGFkZGluZ3NGbGF0IiwicHJlUGFkZGluZ3NCeXRlcyIsInBvc3RQYWRkaW5nc0J5dGVzIiwic2NvcmVzSWQiLCJyZXNPZmZzZXQiLCJwU2VsZWN0ZWRJbmRpY2VzIiwic2VsZWN0ZWRTaXplIiwicFNlbGVjdGVkU2NvcmVzIiwicFZhbGlkT3V0cHV0cyIsInBhcnNlUmVzdWx0U3RydWN0Iiwid2FzbU9uZUhvdCIsIndhc21QYWRWMiIsIndhc21QcmVsdSIsIndlaWdodHNJZCIsIndhc21Qcm9kIiwid2FzbVJlc2l6ZUJpbGluZWFyIiwid2FzbVJldmVyc2UiLCJheGVzQnl0ZXMiLCJvdXRTaGFwZUJ5dGVzIiwid2FzbVJvdGF0ZSIsInJvdGF0ZVdpdGhPZmZzZXQiLCJmaWxsQnl0ZXMiLCJ3YXNtU2NhdHRlck5kIiwidXBkYXRlc0lkIiwid2FzbVNlbGVjdCIsImNvbmRpdGlvbklkIiwidElkIiwiZUlkIiwiY1JhbmsiLCJ0UmFuayIsImJlZ2luXyIsInNpemVfIiwib3V0RGF0YSIsInhTdHJpZGUiLCJiZWdpbkkiLCJiZWdpbkoiLCJlbmRJIiwieE9mZnNldCIsInNsaWNlMmQiLCJ4U3RyaWRlMSIsInhTdHJpZGUyIiwiYmVnaW5LIiwiZW5kSiIsInNsaWNlM2QiLCJ4U3RyaWRlMyIsImVuZEsiLCJiZWdpbkwiLCJzbGljZTRkIiwieFNsaWNlU2l6ZSIsInhTbGljZSIsIndhc21TdGVwIiwid2FzbVN0cmlkZWRTbGljZSIsImVsbGlwc2lzQXhlcyIsInNsaWNlX3V0aWwiLCJtYXNrVG9BeGVzIiwibnVtSW50ZXJwb2xhdGVkQXhlcyIsImV4cGFuZEF4ZXMiLCJub3JtYWxpemVkQmVnaW4iLCJub3JtYWxpemVkRW5kIiwibm9ybWFsaXplZFN0cmlkZXMiLCJnZXROb3JtYWxpemVkQXhlcyIsInNocmlua0F4ZXMiLCJfIiwiZXZlcnkiLCJ4U2xpY2VkIiwiYmVnaW5CeXRlcyIsImVuZEJ5dGVzIiwid2FzbVN1bSIsIndhc21UaWxlIiwibmV3U2hhcGVCeXRlcyIsIndhc21Ub3BLIiwidG9wayIsIm91dFZhbHVlcyIsIm91dFZhbHVlc0lkIiwib3V0SW5kaWNlcyIsIm91dEluZGljZXNJZCIsIndhc21UcmFuc2Zvcm0iLCJ0cmFuc2Zvcm1zSWQiLCJpbnRlcnBvbGF0aW9uTW9kZUlkIiwiZmlsbE1vZGVJZCIsIndhc21UcmFuc3Bvc2UiLCJyZWR1Y2VkU2hhcGUiLCJuZXdQZXJtIiwibWluVmFsSWR4IiwicmVtb3ZlT25lU2l6ZURpbXMiLCJwZXJtSXNOb09wIiwiY2xvbmVkIiwicGVybUJ5dGVzIiwibnVtT3V0cHV0cyIsIm91dHMiLCJ3YXNtRnVzZWRNYXRNdWwiLCJmdXNlZE1hdE11bENvbmZpZyIsImFJZCIsImJJZCIsImNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyIsInN1cHBvcnRzRnVsbEJyb2FkY2FzdCIsIm91dHB1dFR5cGUiLCJsb29wc092ZXJBbGxPZkEiLCJsb29wc092ZXJBbGxPZkIiLCJwZXJtdXRlQXhlc0FuZFRyYW5zcG9zZSIsIkNwcERUeXBlIiwiRnVzYWJsZUFjdGl2YXRpb24iLCJjcmVhdGVVbmFyeUtlcm5lbENvbmZpZyIsIl9zY3JpcHREaXIiLCJXYXNtQmFja2VuZE1vZHVsZVRocmVhZGVkU2ltZCIsImRvY3VtZW50IiwiY3VycmVudFNjcmlwdCIsInNyYyIsIl9fZmlsZW5hbWUiLCJHUk9XQUJMRV9IRUFQX0k4Iiwid2FzbU1lbW9yeSIsInVwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzIiwiSEVBUDgiLCJHUk9XQUJMRV9IRUFQX1U4IiwiR1JPV0FCTEVfSEVBUF9JMzIiLCJIRUFQMzIiLCJHUk9XQUJMRV9IRUFQX1UzMiIsIkhFQVBVMzIiLCJHUk9XQUJMRV9IRUFQX0Y2NCIsIkhFQVBGNjQiLCJyZWFkeVByb21pc2VSZXNvbHZlIiwicmVhZHlQcm9taXNlUmVqZWN0IiwiTW9kdWxlIiwibW9kdWxlT3ZlcnJpZGVzIiwiYXJndW1lbnRzXyIsInF1aXRfIiwic3RhdHVzIiwidG9UaHJvdyIsIkVOVklST05NRU5UX0lTX1dFQiIsIkVOVklST05NRU5UX0lTX1dPUktFUiIsIkVOVklST05NRU5UX0lTX05PREUiLCJFTlZJUk9OTUVOVF9JU19TSEVMTCIsIndpbmRvdyIsImltcG9ydFNjcmlwdHMiLCJwcm9jZXNzIiwidmVyc2lvbnMiLCJub2RlIiwiRU5WSVJPTk1FTlRfSVNfUFRIUkVBRCIsInJlYWRfIiwicmVhZEFzeW5jIiwicmVhZEJpbmFyeSIsIm5vZGVGUyIsIm5vZGVQYXRoIiwic2NyaXB0RGlyZWN0b3J5Iiwibm9kZVdvcmtlclRocmVhZHMiLCJkaXJuYW1lIiwiX19kaXJuYW1lIiwiZmlsZW5hbWUiLCJyZXBsYWNlIiwiZXgiLCJFeGl0U3RhdHVzIiwiYWJvcnQiLCJjb25zb2xlIiwiZXJyb3IiLCJnbG9iYWwiLCJXb3JrZXIiLCJyZWFkIiwicmVhZGJ1ZmZlciIsInNjcmlwdEFyZ3MiLCJhcmd1bWVudHMiLCJxdWl0IiwicHJpbnQiLCJwcmludEVyciIsInNlbGYiLCJsb2NhdGlvbiIsImhyZWYiLCJzdWJzdHIiLCJsYXN0SW5kZXhPZiIsInVybCIsInhociIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsInNlbmQiLCJyZXNwb25zZVRleHQiLCJyZXNwb25zZVR5cGUiLCJvbmxvYWQiLCJvbmVycm9yIiwicGVyZm9ybWFuY2UiLCJ3YXNtQmluYXJ5IiwiZXJyIiwiQXRvbWljcyIsImxvYWQiLCJzdG9yZSIsImNvbXBhcmVFeGNoYW5nZSIsIndhc21Nb2R1bGUiLCJub0V4aXRSdW50aW1lIiwiQUJPUlQiLCJ0ZXh0IiwiZ2V0Q0Z1bmMiLCJpZGVudCIsImZ1bmMiLCJjY2FsbCIsInJldHVyblR5cGUiLCJhcmdUeXBlcyIsIm9wdHMiLCJ0b0MiLCJzdHJpbmdUb1VURjgiLCJzdGFja0FsbG9jIiwiYXJyIiwid3JpdGVBcnJheVRvTWVtb3J5IiwiY0FyZ3MiLCJzdGFjayIsImNvbnZlcnRlciIsInN0YWNrU2F2ZSIsImFwcGx5IiwiVVRGOFRvU3RyaW5nIiwiQm9vbGVhbiIsImNvbnZlcnRSZXR1cm5WYWx1ZSIsInN0YWNrUmVzdG9yZSIsIm51bWVyaWNBcmdzIiwiVVRGOEFycmF5VG9TdHJpbmciLCJoZWFwIiwibWF4Qnl0ZXNUb1JlYWQiLCJlbmRJZHgiLCJ1MCIsInUxIiwidTIiLCJTdHJpbmciLCJmcm9tQ2hhckNvZGUiLCJjaCIsInB0ciIsInN0cmluZ1RvVVRGOEFycmF5IiwibWF4Qnl0ZXNUb1dyaXRlIiwic3RhcnRJZHgiLCJ1IiwiY2hhckNvZGVBdCIsIm91dFB0ciIsImxlbmd0aEJ5dGVzVVRGOCIsImFsaWduVXAiLCJtdWx0aXBsZSIsImJ1ZiIsIkludDhBcnJheSIsIkludDE2QXJyYXkiLCJVaW50MTZBcnJheSIsIlVpbnQzMkFycmF5IiwiRmxvYXQ2NEFycmF5Iiwid2FzbVRhYmxlIiwiSU5JVElBTF9NRU1PUlkiLCJNZW1vcnkiLCJieXRlTGVuZ3RoIiwiX19BVFBSRVJVTl9fIiwiX19BVElOSVRfXyIsIl9fQVRNQUlOX18iLCJfX0FURVhJVF9fIiwiX19BVFBPU1RSVU5fXyIsInByZVJ1biIsImFkZE9uUHJlUnVuIiwic2hpZnQiLCJjYWxsUnVudGltZUNhbGxiYWNrcyIsImluaXRSdW50aW1lIiwicHJlTWFpbiIsImV4aXRSdW50aW1lIiwicG9zdFJ1biIsImFkZE9uUG9zdFJ1biIsImNiIiwidW5zaGlmdCIsIl9fX3dhc21fY2FsbF9jdG9ycyIsInJ1bkRlcGVuZGVuY2llcyIsInJ1bkRlcGVuZGVuY3lXYXRjaGVyIiwiZGVwZW5kZW5jaWVzRnVsZmlsbGVkIiwiYWRkUnVuRGVwZW5kZW5jeSIsInJlbW92ZVJ1bkRlcGVuZGVuY3kiLCJjbGVhckludGVydmFsIiwid2hhdCIsIlJ1bnRpbWVFcnJvciIsImhhc1ByZWZpeCIsInN0YXJ0c1dpdGgiLCJkYXRhVVJJUHJlZml4IiwiaXNEYXRhVVJJIiwiZmlsZVVSSVByZWZpeCIsImlzRmlsZVVSSSIsIndhc21CaW5hcnlGaWxlIiwiZ2V0QmluYXJ5IiwiZmlsZSIsImdldEJpbmFyeVByb21pc2UiLCJjYXRjaCIsImNyZWF0ZVdhc20iLCJpbmZvIiwiYXNtTGlicmFyeUFyZyIsInJlY2VpdmVJbnN0YW5jZSIsIm51bVdvcmtlcnNUb0xvYWQiLCJ1bnVzZWRXb3JrZXJzIiwibG9hZFdhc21Nb2R1bGVUb1dvcmtlciIsInJlY2VpdmVJbnN0YW50aWF0ZWRTb3VyY2UiLCJpbnN0YW50aWF0ZUFycmF5QnVmZmVyIiwicmVjZWl2ZXIiLCJyZWFzb24iLCJpbnN0YW50aWF0ZVN0cmVhbWluZyIsIkFTTV9DT05TVFMiLCIkMCIsIiQxIiwic2V0VGltZW91dCIsIl9fZW1zY3JpcHRlbl9kb19kaXNwYXRjaF90b190aHJlYWQiLCJpbml0UHRocmVhZHNKUyIsImNhbGxiYWNrcyIsImFyZyIsIl9lbXNjcmlwdGVuX2Z1dGV4X3dha2UiLCJhZGRyIiwibWFpblRocmVhZFdhaXRBZGRyZXNzIiwiX19lbXNjcmlwdGVuX21haW5fdGhyZWFkX2Z1dGV4IiwibWFpblRocmVhZFdva2VuIiwibm90aWZ5Iiwia2lsbFRocmVhZCIsInB0aHJlYWRfcHRyIiwicHRocmVhZCIsInB0aHJlYWRzIiwid29ya2VyIiwidGVybWluYXRlIiwiZnJlZVRocmVhZERhdGEiLCJydW5uaW5nV29ya2VycyIsImNhbmNlbFRocmVhZCIsImNsZWFudXBUaHJlYWQiLCJyZXR1cm5Xb3JrZXJUb1Bvb2wiLCJfZW1zY3JpcHRlbl9nZXRfbm93IiwiaW5pdE1haW5UaHJlYWRCbG9jayIsInB0aHJlYWRQb29sU2l6ZSIsIm5hdmlnYXRvciIsImhhcmR3YXJlQ29uY3VycmVuY3kiLCJhbGxvY2F0ZVVudXNlZFdvcmtlciIsInRiIiwiaGVhZFB0ciIsInRsc01lbW9yeSIsIl9fZW1zY3JpcHRlbl90aHJlYWRfaW5pdCIsIl9lbXNjcmlwdGVuX3JlZ2lzdGVyX21haW5fYnJvd3Nlcl90aHJlYWRfaWQiLCJpbml0V29ya2VyIiwidGhyZWFkRXhpdEhhbmRsZXJzIiwic2V0VGhyZWFkU3RhdHVzIiwicnVuRXhpdEhhbmRsZXJzIiwicG9wIiwiX3B0aHJlYWRfc2VsZiIsIl9fX3B0aHJlYWRfdHNkX3J1bl9kdG9ycyIsInJ1bkV4aXRIYW5kbGVyc0FuZERlaW5pdFRocmVhZCIsImV4aXRDb2RlIiwidGhyZWFkRXhpdCIsInRocmVhZENhbmNlbCIsInRocmVhZEluZm9TdHJ1Y3QiLCJhbGxvY2F0ZWRPd25TdGFjayIsInN0YWNrQmFzZSIsInJ1bldpdGhvdXRNYWluVGhyZWFkUXVldWVkQ2FsbHMiLCJfX2Vtc2NyaXB0ZW5fYWxsb3dfbWFpbl9ydW50aW1lX3F1ZXVlZF9jYWxscyIsInJlY2VpdmVPYmplY3RUcmFuc2ZlciIsIm9uRmluaXNoZWRMb2FkaW5nIiwib25tZXNzYWdlIiwiY21kIiwiY3VycmVudFByb3hpZWRPcGVyYXRpb25DYWxsZXJUaHJlYWQiLCJ0aHJlYWQiLCJ0YXJnZXRUaHJlYWQiLCJfZW1zY3JpcHRlbl9tYWluX3RocmVhZF9wcm9jZXNzX3F1ZXVlZF9jYWxscyIsInNwYXduVGhyZWFkIiwibG9hZGVkIiwicnVuUHRocmVhZCIsImFsZXJ0IiwiZXhpdCIsInRhcmdldCIsImxpbmVubyIsIm9uIiwicHRocmVhZE1haW5KcyIsImdldE5ld1dvcmtlciIsImJ1c3lTcGluV2FpdCIsIm1zZWNzIiwiZXN0YWJsaXNoU3RhY2tTcGFjZSIsInN0YWNrVG9wIiwic3RhY2tNYXgiLCJfZW1zY3JpcHRlbl9zdGFja19zZXRfbGltaXRzIiwiZ2V0Tm9FeGl0UnVudGltZSIsImludm9rZUVudHJ5UG9pbnQiLCJfX19hc3NlcnRfZmFpbCIsImxpbmUiLCJfX19jYWxsX21haW4iLCJhcmdjIiwiYXJndiIsIl9tYWluIiwic2V0RXJyTm8iLCJfX19lcnJub19sb2NhdGlvbiIsIl9hdGV4aXQiLCJfZW1zY3JpcHRlbl9wcm94eV90b19tYWluX3RocmVhZF9qcyIsIl9fZW1zY3JpcHRlbl9ub3RpZnlfdGhyZWFkX3F1ZXVlIiwidGFyZ2V0VGhyZWFkSWQiLCJtYWluVGhyZWFkSWQiLCJfYWJvcnQiLCJfZW1zY3JpcHRlbl9hc21fY29uc3RfaW50IiwiY29kZSIsInNpZ1B0ciIsImFyZ2J1ZiIsInJlYWRBc21Db25zdEFyZ3MiLCJfZW1zY3JpcHRlbl9jb25kaXRpb25hbF9zZXRfY3VycmVudF90aHJlYWRfc3RhdHVzIiwiZXhwZWN0ZWRTdGF0dXMiLCJuZXdTdGF0dXMiLCJfZW1zY3JpcHRlbl9mdXRleF93YWl0IiwidGltZW91dCIsInROb3ciLCJ0RW5kIiwiZXhjaGFuZ2UiLCJ3YWl0IiwiX2Vtc2NyaXB0ZW5fbWVtY3B5X2JpZyIsImRlc3QiLCJjb3B5V2l0aGluIiwiX2Vtc2NyaXB0ZW5fbnVtX2xvZ2ljYWxfY29yZXMiLCJjcHVzIiwic3luYyIsIm51bUNhbGxBcmdzIiwic2VyaWFsaXplZE51bUNhbGxBcmdzIiwiX2Vtc2NyaXB0ZW5fcnVuX2luX21haW5fcnVudGltZV90aHJlYWRfanMiLCJkYXRlTm93IiwiX2Vtc2NyaXB0ZW5fcmVjZWl2ZV9vbl9tYWluX3RocmVhZF9qc19jYWxsQXJncyIsInJlYWRBc21Db25zdEFyZ3NBcnJheSIsImRvdWJsZSIsIl9lbXNjcmlwdGVuX3JlY2VpdmVfb25fbWFpbl90aHJlYWRfanMiLCJwcm94aWVkRnVuY3Rpb25UYWJsZSIsIl9lbXNjcmlwdGVuX2dldF9oZWFwX3NpemUiLCJlbXNjcmlwdGVuX3JlYWxsb2NfYnVmZmVyIiwiZ3JvdyIsIl9lbXNjcmlwdGVuX3Jlc2l6ZV9oZWFwIiwicmVxdWVzdGVkU2l6ZSIsIm9sZFNpemUiLCJtYXhIZWFwU2l6ZSIsImN1dERvd24iLCJvdmVyR3Jvd25IZWFwU2l6ZSIsIkpTRXZlbnRzIiwiaW5FdmVudEhhbmRsZXIiLCJyZW1vdmVBbGxFdmVudExpc3RlbmVycyIsImV2ZW50SGFuZGxlcnMiLCJfcmVtb3ZlSGFuZGxlciIsImRlZmVycmVkQ2FsbHMiLCJyZWdpc3RlclJlbW92ZUV2ZW50TGlzdGVuZXJzIiwicmVtb3ZlRXZlbnRMaXN0ZW5lcnNSZWdpc3RlcmVkIiwiZGVmZXJDYWxsIiwidGFyZ2V0RnVuY3Rpb24iLCJwcmVjZWRlbmNlIiwiYXJnc0xpc3QiLCJhcnJheXNIYXZlRXF1YWxDb250ZW50IiwiYXJyQSIsImFyckIiLCJyZW1vdmVEZWZlcnJlZENhbGxzIiwiY2FuUGVyZm9ybUV2ZW50SGFuZGxlclJlcXVlc3RzIiwiY3VycmVudEV2ZW50SGFuZGxlciIsImFsbG93c0RlZmVycmVkQ2FsbHMiLCJydW5EZWZlcnJlZENhbGxzIiwicmVtb3ZlQWxsSGFuZGxlcnNPblRhcmdldCIsImV2ZW50VHlwZVN0cmluZyIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJldmVudExpc3RlbmVyRnVuYyIsInVzZUNhcHR1cmUiLCJyZWdpc3Rlck9yUmVtb3ZlSGFuZGxlciIsImV2ZW50SGFuZGxlciIsImpzRXZlbnRIYW5kbGVyIiwiaGFuZGxlckZ1bmMiLCJjYWxsYmFja2Z1bmMiLCJhZGRFdmVudExpc3RlbmVyIiwicXVldWVFdmVudEhhbmRsZXJPblRocmVhZF9paWlpIiwiZXZlbnRIYW5kbGVyRnVuYyIsImV2ZW50VHlwZUlkIiwiZXZlbnREYXRhIiwidXNlckRhdGEiLCJ2YXJhcmdzIiwiX19lbXNjcmlwdGVuX2NhbGxfb25fdGhyZWFkIiwiZ2V0VGFyZ2V0VGhyZWFkRm9yRXZlbnRDYWxsYmFjayIsImdldE5vZGVOYW1lRm9yVGFyZ2V0Iiwic2NyZWVuIiwibm9kZU5hbWUiLCJmdWxsc2NyZWVuRW5hYmxlZCIsIndlYmtpdEZ1bGxzY3JlZW5FbmFibGVkIiwic3RyaW5nVG9OZXdVVEY4IiwianNTdHJpbmciLCJjU3RyaW5nIiwiX2Vtc2NyaXB0ZW5fc2V0X29mZnNjcmVlbmNhbnZhc19zaXplX29uX3RhcmdldF90aHJlYWRfanMiLCJ0YXJnZXRDYW52YXMiLCJ3aWR0aCIsImhlaWdodCIsInRhcmdldENhbnZhc1B0ciIsIl9lbXNjcmlwdGVuX3NldF9vZmZzY3JlZW5jYW52YXNfc2l6ZV9vbl90YXJnZXRfdGhyZWFkIiwibWF5YmVDU3RyaW5nVG9Kc1N0cmluZyIsInNwZWNpYWxIVE1MVGFyZ2V0cyIsImZpbmRFdmVudFRhcmdldCIsInF1ZXJ5U2VsZWN0b3IiLCJmaW5kQ2FudmFzRXZlbnRUYXJnZXQiLCJfZW1zY3JpcHRlbl9zZXRfY2FudmFzX2VsZW1lbnRfc2l6ZV9jYWxsaW5nX3RocmVhZCIsImNhbnZhcyIsImNhbnZhc1NoYXJlZFB0ciIsIm9mZnNjcmVlbkNhbnZhcyIsImNvbnRyb2xUcmFuc2ZlcnJlZE9mZnNjcmVlbiIsImF1dG9SZXNpemVWaWV3cG9ydCIsIkdMY3R4T2JqZWN0IiwiR0xjdHgiLCJwcmV2Vmlld3BvcnQiLCJnZXRQYXJhbWV0ZXIiLCJ2aWV3cG9ydCIsIl9lbXNjcmlwdGVuX3NldF9jYW52YXNfZWxlbWVudF9zaXplX21haW5fdGhyZWFkIiwiX2Vtc2NyaXB0ZW5fc2V0X2NhbnZhc19lbGVtZW50X3NpemUiLCJfZW1zY3JpcHRlbl9zZXRfY3VycmVudF90aHJlYWRfc3RhdHVzIiwiX2Vtc2NyaXB0ZW5fc2V0X3RocmVhZF9uYW1lIiwidGhyZWFkSWQiLCJfX3dlYmdsX2VuYWJsZV9BTkdMRV9pbnN0YW5jZWRfYXJyYXlzIiwiY3R4IiwiZXh0IiwiZ2V0RXh0ZW5zaW9uIiwiZGl2aXNvciIsImZpcnN0IiwicHJpbWNvdW50IiwiX193ZWJnbF9lbmFibGVfT0VTX3ZlcnRleF9hcnJheV9vYmplY3QiLCJ2YW8iLCJfX3dlYmdsX2VuYWJsZV9XRUJHTF9kcmF3X2J1ZmZlcnMiLCJidWZzIiwiX193ZWJnbF9lbmFibGVfV0VCR0xfbXVsdGlfZHJhdyIsIm11bHRpRHJhd1dlYmdsIiwiR0wiLCJjb3VudGVyIiwiYnVmZmVycyIsInByb2dyYW1zIiwiZnJhbWVidWZmZXJzIiwicmVuZGVyYnVmZmVycyIsInRleHR1cmVzIiwidW5pZm9ybXMiLCJzaGFkZXJzIiwidmFvcyIsImNvbnRleHRzIiwib2Zmc2NyZWVuQ2FudmFzZXMiLCJ0aW1lclF1ZXJpZXNFWFQiLCJwcm9ncmFtSW5mb3MiLCJzdHJpbmdDYWNoZSIsInVucGFja0FsaWdubWVudCIsInJlY29yZEVycm9yIiwiZXJyb3JDb2RlIiwibGFzdEVycm9yIiwiZ2V0TmV3SWQiLCJ0YWJsZSIsImdldFNvdXJjZSIsInNoYWRlciIsInN0cmluZyIsInNvdXJjZSIsImNyZWF0ZUNvbnRleHQiLCJ3ZWJHTENvbnRleHRBdHRyaWJ1dGVzIiwiZ2V0Q29udGV4dCIsInJlZ2lzdGVyQ29udGV4dCIsImhhbmRsZSIsImNvbnRleHQiLCJhdHRyaWJ1dGVzIiwibWFqb3JWZXJzaW9uIiwiZW5hYmxlRXh0ZW5zaW9uc0J5RGVmYXVsdCIsImluaXRFeHRlbnNpb25zIiwibWFrZUNvbnRleHRDdXJyZW50IiwiY29udGV4dEhhbmRsZSIsImN1cnJlbnRDb250ZXh0IiwiZGVsZXRlQ29udGV4dCIsImluaXRFeHRlbnNpb25zRG9uZSIsImRpc2pvaW50VGltZXJRdWVyeUV4dCIsImdldFN1cHBvcnRlZEV4dGVuc2lvbnMiLCJwb3B1bGF0ZVVuaWZvcm1UYWJsZSIsInByb2dyYW0iLCJwdGFibGUiLCJtYXhVbmlmb3JtTGVuZ3RoIiwibWF4QXR0cmlidXRlTGVuZ3RoIiwibWF4VW5pZm9ybUJsb2NrTmFtZUxlbmd0aCIsInV0YWJsZSIsIm51bVVuaWZvcm1zIiwiZ2V0UHJvZ3JhbVBhcmFtZXRlciIsImdldEFjdGl2ZVVuaWZvcm0iLCJnZXRVbmlmb3JtTG9jYXRpb24iLCJfX2Vtc2NyaXB0ZW5fd2ViZ2xfcG93ZXJfcHJlZmVyZW5jZXMiLCJfZW1zY3JpcHRlbl93ZWJnbF9kb19jcmVhdGVfY29udGV4dCIsInBvd2VyUHJlZmVyZW5jZSIsImNvbnRleHRBdHRyaWJ1dGVzIiwibWlub3JWZXJzaW9uIiwiZXhwbGljaXRTd2FwQ29udHJvbCIsInByb3h5Q29udGV4dFRvTWFpblRocmVhZCIsInJlbmRlclZpYU9mZnNjcmVlbkJhY2tCdWZmZXIiLCJfZW1zY3JpcHRlbl93ZWJnbF9jcmVhdGVfY29udGV4dCIsImEwIiwiU1lTQ0FMTFMiLCJtYXBwaW5ncyIsInByaW50Q2hhciIsInN0cmVhbSIsImN1cnIiLCJnZXRTdHIiLCJnZXQ2NCIsImxvdyIsImhpZ2giLCJfZmRfY2xvc2UiLCJmZCIsIl9mZF9zZWVrIiwib2Zmc2V0X2xvdyIsIm9mZnNldF9oaWdoIiwid2hlbmNlIiwibmV3T2Zmc2V0IiwiX2ZkX3dyaXRlIiwiaW92IiwiaW92Y250IiwicG51bSIsIl9wdGhyZWFkX2NsZWFudXBfcG9wIiwiZXhlY3V0ZSIsInJvdXRpbmUiLCJfcHRocmVhZF9jbGVhbnVwX3B1c2giLCJ0aHJlYWRQYXJhbXMiLCJzdGFja0hpZ2giLCJzdGFja1NpemUiLCJ0aXMiLCJkZXRhY2hlZCIsImdsb2JhbF9sb2NhbGUiLCJfZW1zY3JpcHRlbl9nZXRfZ2xvYmFsX2xpYmMiLCJtc2ciLCJzdGFydFJvdXRpbmUiLCJ0aW1lIiwidHJhbnNmZXJMaXN0IiwiX3B0aHJlYWRfY3JlYXRlIiwiYXR0ciIsInN0YXJ0X3JvdXRpbmUiLCJfZW1zY3JpcHRlbl9zeW5jX3J1bl9pbl9tYWluX3RocmVhZF80IiwiX21lbWFsaWduIiwiX3N5c2NvbmYiLCJjYWxsZWRSdW4iLCJydW4iLCJkb1J1biIsImltcGxpY2l0IiwicnVuQ2FsbGVyIiwicmVhZHkiLCJ3YXNtV29ya2VyQ29udGVudHMiLCJXYXNtQmFja2VuZE1vZHVsZSIsIlVURjhEZWNvZGVyIiwiVGV4dERlY29kZXIiLCJlbmRQdHIiLCJkZWNvZGUiLCJBZGROUHJvZ3JhbSIsInZhcmlhYmxlTmFtZXMiLCJzbmlwcGV0cyIsInZhcmlhYmxlIiwib3BlcmF0aW9uIiwidXNlckNvZGUiLCJBZGROUGFja2VkUHJvZ3JhbSIsInBhY2tlZElucHV0cyIsInBhY2tlZE91dHB1dCIsIkFyZ01pbk1heFByb2dyYW0iLCJyZWR1Y2VJbmZvIiwiZmlyc3RQYXNzIiwid2luZG93U2l6ZSIsImNvbXBPcCIsImluZGV4U25pcHBldCIsIkFyZ01pbk1heFBhY2tlZFByb2dyYW0iLCJjaGFyQXQiLCJ0b1VwcGVyQ2FzZSIsImluU2l6ZSIsInNvdXJjZUxvY1NldHVwIiwic291cmNlUmFuayIsInNvdXJjZUxvY0RUeXBlIiwiaW5DaGFubmVsIiwiaW50Q2hhbm5lbHMiLCJzcmNSQ29vcmRzIiwic3JjR0Nvb3JkcyIsInNyY0JDb29yZHMiLCJzcmNBQ29vcmRzIiwiZmV0Y2hDYW5kaWRhdGVJZHgiLCJmZXRjaFZhbHVlIiwiZ2V0QmVzdEluZGljZXNBQ2hhbm5lbFNuaXBwZXQiLCJBdmdQb29sMkRCYWNrcHJvcFByb2dyYW0iLCJBdmdQb29sM0RCYWNrcHJvcFByb2dyYW0iLCJFUFNJTE9OX0ZMT0FUMzIiLCJFUFNJTE9OX0ZMT0FUMTYiLCJiaW5hcnlDYWNoZXMiLCJnZXRCaW5hcnlDYWNoZSIsIndlYkdMVmVyc2lvbiIsIkNQVV9IQU5ET0ZGX1NJWkVfVEhSRVNIT0xEIiwiZ2V0TnVtYmVyIiwiTWF0aEJhY2tlbmRXZWJHTCIsImdwZ3B1IiwicGVuZGluZ1JlYWQiLCJXZWFrTWFwIiwicGVuZGluZ0Rpc3Bvc2FsIiwiV2Vha1NldCIsImRhdGFSZWZDb3VudCIsIm51bUJ5dGVzSW5HUFUiLCJ1cGxvYWRXYWl0TXMiLCJkb3dubG9hZFdhaXRNcyIsImxhc3RHbEZsdXNoVGltZSIsIndhcm5lZEFib3V0TWVtb3J5IiwicGVuZGluZ0RlbGV0ZXMiLCJkaXNwb3NlZCIsImdldEJvb2wiLCJnbCIsImJpbmFyeUNhY2hlIiwiZ3BncHVDcmVhdGVkTG9jYWxseSIsInRleHR1cmVNYW5hZ2VyIiwibnVtTUJCZWZvcmVXYXJuaW5nIiwiZGV2aWNlUGl4ZWxSYXRpbyIsInRleERhdGEiLCJjaGVja051bWVyaWNhbFByb2JsZW1zIiwidXNhZ2UiLCJVUExPQUQiLCJpc1BhY2tlZCIsInJ1bldlYkdMUHJvZ3JhbSIsImNvbnZlcnRBbmRDYWNoZU9uQ1BVIiwic2hvdWxkVGltZVByb2dyYW0iLCJhY3RpdmVUaW1lcnMiLCJnZXRWYWx1ZXNGcm9tVGV4dHVyZSIsInN1YnNjcmliZXJzIiwidG1wRG93bmxvYWRUYXJnZXQiLCJ0bXBEYXRhIiwiY3JlYXRlQnVmZmVyRnJvbVRleHR1cmUiLCJ0ZXh0dXJlIiwiY3JlYXRlQW5kV2FpdEZvckZlbmNlIiwicHMiLCJkb3dubG9hZEZsb2F0MzJNYXRyaXhGcm9tQnVmZmVyIiwiZGVsZXRlQnVmZmVyIiwiZFR5cGVWYWxzIiwicmVtb3ZlRGF0YUlkIiwidG1wVGFyZ2V0IiwiZG93bmxvYWRNYXRyaXhGcm9tUGFja2VkVGV4dHVyZSIsInNob3VsZFVzZVBhY2tlZFByb2dyYW0iLCJkb3dubG9hZEJ5dGVFbmNvZGVkRmxvYXRNYXRyaXhGcm9tT3V0cHV0VGV4dHVyZSIsInRleFNoYXBlIiwidGltZXJBdmFpbGFibGUiLCJvbGRBY3RpdmVUaW1lcnMiLCJuZXdBY3RpdmVUaW1lcnMiLCJvdXRlck1vc3RUaW1lIiwicHJvZ3JhbVRpbWVyc1N0YWNrIiwiZmxhdHRlbmVkQWN0aXZlVGltZXJRdWVyaWVzIiwiZmxhdHRlbiIsInF1ZXJ5IiwiZmxhdHRlbmVkQWN0aXZlVGltZXJOYW1lcyIsIndhbGxNcyIsIm1zIiwibnVtQnl0ZXNJbkdQVUFsbG9jYXRlZCIsIm51bUJ5dGVzQWxsb2NhdGVkIiwibnVtQnl0ZXNJbkdQVUZyZWUiLCJudW1CeXRlc0ZyZWUiLCJzdGFydFRpbWVyIiwiYmVnaW5RdWVyeSIsInN0YXJ0TXMiLCJlbmRNcyIsImVuZFRpbWVyIiwiZW5kUXVlcnkiLCJ3YWl0Rm9yUXVlcnlBbmRHZXRUaW1lIiwidGltZXJRdWVyeSIsInJlbGVhc2VHUFVEYXRhIiwib3JpZ0RhdGFJZCIsImNvbXB1dGVCeXRlcyIsInJlbGVhc2VUZXh0dXJlIiwiZ2V0VGV4dHVyZSIsInVwbG9hZFRvR1BVIiwiZ2V0RGF0YUluZm8iLCJzaG91bGRFeGVjdXRlT25DUFUiLCJzaXplVGhyZXNob2xkIiwiZ2V0R1BHUFVDb250ZXh0IiwiZGF0YVN5bmMiLCJwYWNrZWRVbmFyeU9wIiwiY29tcGlsZUFuZFJ1biIsInVucGFja1RlbnNvciIsInBhY2tUZW5zb3IiLCJwYWNrZWRSZXNoYXBlIiwiYWZ0ZXJTaGFwZSIsImlucHV0M0RTaGFwZSIsImlucHV0M0QiLCJhZnRlclNoYXBlQXMzRCIsInNoYXBlQXMzRCIsIm91dHB1dER0eXBlIiwiY3VzdG9tVW5pZm9ybVZhbHVlcyIsInByZXZlbnRFYWdlclVucGFja2luZ09mT3V0cHV0Iiwib3V0UGFja2luZ1NjaGVtZSIsIkRFTlNFIiwidGV4ZWxTaGFwZSIsIm91dFRleFVzYWdlIiwiZGF0YVRvRGlzcG9zZSIsImlucHV0c0RhdGEiLCJpc1VuaWZvcm0iLCJ1bmlmb3JtVmFsdWVzIiwic2F2ZWRJbnB1dCIsImdldEFuZFNhdmVCaW5hcnkiLCJnZXRRdWVyeVRpbWUiLCJnbEZsdXNoVGhyZXNob2xkIiwiZmx1c2giLCJ1bnBhY2tlZCIsImdldFRleHR1cmVNYW5hZ2VyIiwiZGVsZXRlUHJvZ3JhbSIsIndlYkdMUHJvZ3JhbSIsIkhUTUxDYW52YXNFbGVtZW50IiwicmVtb3ZlIiwiZmxvYXRQcmVjaXNpb25WYWx1ZSIsImRlYnVnRmxhZyIsInVuZGVyZmxvd0NoZWNrVmFsdWUiLCJpc0J5dGVBcnJheSIsInRlbXBEZW5zZUlucHV0SGFuZGxlIiwiUElYRUxTIiwidXBsb2FkRGVuc2VNYXRyaXhUb1RleHR1cmUiLCJwcmV2ZW50RWFnZXJVbnBhY2tpbmciLCJlbmNvZGVkT3V0cHV0VGFyZ2V0Iiwib3V0cHV0VGV4RGF0YSIsIm5ld1RleHR1cmUiLCJhY3F1aXJlVGV4dHVyZSIsImZsb2F0MzJWYWx1ZXMiLCJmbG9hdDMyVG9UeXBlZEFycmF5IiwidGV4VHlwZSIsIm1iIiwidG9GaXhlZCIsImlzQnJvd3NlciIsIndlYmdsIiwiZm9yY2VIYWxmRmxvYXQiLCJCYXRjaE5vcm1Qcm9ncmFtIiwibWVhblNoYXBlIiwidmFyaWFuY2VTaGFwZSIsIm9mZnNldFNoYXBlIiwic2NhbGVTaGFwZSIsIm9mZnNldFNuaXBwZXQiLCJzY2FsZVNuaXBwZXQiLCJCYXRjaE5vcm1QYWNrZWRQcm9ncmFtIiwiQ09NUExFWF9NVUxUSVBMWSIsIlJFQUwiLCJJTUFHIiwiQmluYXJ5T3BDb21wbGV4UHJvZ3JhbSIsIkNIRUNLX05BTl9TTklQUEVUIiwiU1FVQVJFRF9ESUZGRVJFTkNFIiwiQmluYXJ5T3BQcm9ncmFtIiwiZW5hYmxlU2hhcGVVbmlmb3JtcyIsIkVMVV9ERVIiLCJOT1RfRVFVQUwiLCJCaW5hcnlPcFBhY2tlZFByb2dyYW0iLCJjaGVja091dE9mQm91bmRzIiwic3VwcG9ydHNCcm9hZGNhc3RpbmciLCJjaGVja091dE9mQm91bmRzU3RyaW5nIiwiV0VCR0xfQVRUUklCVVRFUyIsImFudGlhbGlhcyIsInByZW11bHRpcGxpZWRBbHBoYSIsInByZXNlcnZlRHJhd2luZ0J1ZmZlciIsInN0ZW5jaWwiLCJmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0IiwiY2xlYXJXZWJHTENvbnRleHQiLCJzZXRXZWJHTENvbnRleHQiLCJnZXRXZWJHTENvbnRleHQiLCJuZXdDdHgiLCJPZmZzY3JlZW5DYW52YXMiLCJjcmVhdGVFbGVtZW50IiwiY3JlYXRlQ2FudmFzIiwiZXYiLCJwcmV2ZW50RGVmYXVsdCIsImdldFdlYkdMUmVuZGVyaW5nQ29udGV4dCIsImlzQ29udGV4dExvc3QiLCJkaXNhYmxlIiwiREVQVEhfVEVTVCIsIlNURU5DSUxfVEVTVCIsIkJMRU5EIiwiRElUSEVSIiwiUE9MWUdPTl9PRkZTRVRfRklMTCIsIlNBTVBMRV9DT1ZFUkFHRSIsImVuYWJsZSIsIlNDSVNTT1JfVEVTVCIsIkNVTExfRkFDRSIsImN1bGxGYWNlIiwiQkFDSyIsIkNsaXBQcm9ncmFtIiwiY3VzdG9tVW5pZm9ybXMiLCJDbGlwUGFja2VkUHJvZ3JhbSIsIkNvbXBsZXhBYnNQcm9ncmFtIiwiQ29uY2F0UHJvZ3JhbSIsIm9mZnNldHMiLCJsYXN0SW5kZXgiLCJsYXN0U2hpZnQiLCJDb25jYXRQYWNrZWRQcm9ncmFtIiwibGFzdENoYW5uZWxzIiwiYWxsQ2hhbm5lbHMiLCJnZXRWYWx1ZVNuaXBwZXQiLCJzaGlmdGVkQ2hhbm5lbHMiLCJjaGFubmVsSWR4IiwiQ29udjJERGVyRmlsdGVyUHJvZ3JhbSIsIkNvbnYyRERlcklucHV0UHJvZ3JhbSIsInJvd0RpbSIsImNvbERpbSIsImNoYW5uZWxEaW0iLCJDb252M0REZXJGaWx0ZXJQcm9ncmFtIiwiQ29udjNERGVySW5wdXRQcm9ncmFtIiwiRGVwdGh3aXNlQ29udjJERGVyRmlsdGVyUHJvZ3JhbSIsImNoYW5uZWxNdWwiLCJEZXB0aHdpc2VDb252MkREZXJJbnB1dFByb2dyYW0iLCJDb252MkRQcm9ncmFtIiwiYWRkQmlhcyIsImhhc1ByZWx1QWN0aXZhdGlvbldlaWdodHMiLCJoYXNMZWFreXJlbHVBbHBoYSIsImlucHV0RGVwdGhOZWFyZXN0VmVjNCIsImlucHV0RGVwdGhWZWM0UmVtYWluZGVyIiwiYWN0aXZhdGlvblNuaXBwZXQiLCJhcHBseUFjdGl2YXRpb25TbmlwcGV0IiwiYWRkQmlhc1NuaXBwZXQiLCJDb252M0RQcm9ncmFtIiwiRGVwdGh3aXNlQ29udjJEUHJvZ3JhbSIsImhhc1ByZWx1QWN0aXZhdGlvbiIsImhhc0xlYWt5UmVsdUFscGhhIiwieE51bVJvd3MiLCJ4TnVtQ29scyIsIkRlcHRod2lzZUNvbnZQYWNrZWQyRFByb2dyYW0iLCJ0ZXhlbHNBY3Jvc3MiLCJtYWluTG9vcCIsInRleGVsQyIsImNvbEluZGV4IiwibmV4dFRleGVsT2Zmc2V0IiwibmVhcmVzdExhcmdlckV2ZW4iLCJDcm9wQW5kUmVzaXplUHJvZ3JhbSIsImltYWdlU2hhcGUiLCJib3hTaGFwZSIsIm1ldGhvZElkIiwiaW5wdXRIZWlnaHRGbG9hdCIsImlucHV0V2lkdGhGbG9hdCIsImhlaWdodFJhdGlvIiwid2lkdGhSYXRpbyIsIkN1bVN1bVByb2dyYW0iLCJnZXRDb29yZHMiLCJpZHhTdHJpbmciLCJnZXRGaW5hbENvb3JkIiwiRGVjb2RlTWF0cml4UHJvZ3JhbSIsImdsc2wiLCJEZWNvZGVNYXRyaXhQYWNrZWRQcm9ncmFtIiwiRGVwdGhUb1NwYWNlUHJvZ3JhbSIsImdldEhlaWdodENvb3JkU3RyaW5nIiwiZ2V0V2lkdGhDb29yZFN0cmluZyIsImdldERlcHRoQ29vcmRTdHJpbmciLCJnZXRPdXRwdXREZXB0aFNpemUiLCJnZXRJbnB1dFNhbXBsaW5nU3RyaW5nIiwiRGlhZ1Byb2dyYW0iLCJEaWxhdGlvbjJEUHJvZ3JhbSIsIkVuY29kZUZsb2F0UHJvZ3JhbSIsIkRPV05MT0FEIiwiRW5jb2RlRmxvYXRQYWNrZWRQcm9ncmFtIiwiRW5jb2RlTWF0cml4UHJvZ3JhbSIsImlucHV0SXNVbnNpZ25lZEJ5dGUiLCJ0ZXh0dXJlMkQiLCJFbmNvZGVNYXRyaXhQYWNrZWRQcm9ncmFtIiwiRkZUUHJvZ3JhbSIsImNvbXBvbmVudCIsImV4cG9uZW50TXVsdGlwbGllclNuaXBwZXQiLCJQSSIsInJlc3VsdERlbm9taW5hdG9yIiwib3BTdHJpbmciLCJGaWxsUHJvZ3JhbSIsImlzTW9iaWxlIiwiRmxpcExlZnRSaWdodFByb2dyYW0iLCJHYXRoZXJQcm9ncmFtIiwic291cmNlQ29vcmRzIiwiY3VycmVudENvb3JkcyIsImdldFNvdXJjZUNvb3JkcyIsIkdhdGhlck5EUHJvZ3JhbSIsInNsaWNlRGltIiwic3RyaWRlc1R5cGUiLCJzdHJpZGVTdHJpbmciLCJnZXRHbHNsRGlmZmVyZW5jZXMiLCJhdHRyaWJ1dGUiLCJ2YXJ5aW5nVnMiLCJ2YXJ5aW5nRnMiLCJkZWZpbmVPdXRwdXQiLCJkZWZpbmVTcGVjaWFsTmFOIiwiZGVmaW5lU3BlY2lhbEluZiIsImRlZmluZVJvdW5kIiwiR1BHUFVDb250ZXh0Iiwib3V0cHV0VGV4dHVyZSIsInZlcnRleEF0dHJzQXJlQm91bmQiLCJpdGVtc1RvUG9sbCIsImdsVmVyc2lvbiIsIkNPTE9SX0JVRkZFUl9GTE9BVCIsIkNPTE9SX0JVRkZFUl9IQUxGX0ZMT0FUIiwiVEVYVFVSRV9GTE9BVCIsIlRFWFRVUkVfSEFMRl9GTE9BVCIsInRleHR1cmVGbG9hdEV4dGVuc2lvbiIsInRleHR1cmVIYWxmRmxvYXRFeHRlbnNpb24iLCJjb2xvckJ1ZmZlckZsb2F0RXh0ZW5zaW9uIiwiY29sb3JCdWZmZXJIYWxmRmxvYXRFeHRlbnNpb24iLCJ2ZXJ0ZXhCdWZmZXIiLCJpbmRleEJ1ZmZlciIsImZyYW1lYnVmZmVyIiwidGV4dHVyZUNvbmZpZyIsImZpbmlzaCIsImJpbmRGcmFtZWJ1ZmZlciIsIkZSQU1FQlVGRkVSIiwiZGVsZXRlRnJhbWVidWZmZXIiLCJiaW5kQnVmZmVyIiwiQVJSQVlfQlVGRkVSIiwiRUxFTUVOVF9BUlJBWV9CVUZGRVIiLCJjcmVhdGVGbG9hdDMyTWF0cml4VGV4dHVyZSIsInJvd3MiLCJjb2x1bW5zIiwidGhyb3dJZkRpc3Bvc2VkIiwiY3JlYXRlRmxvYXQxNk1hdHJpeFRleHR1cmUiLCJjcmVhdGVVbnNpZ25lZEJ5dGVzTWF0cml4VGV4dHVyZSIsInVwbG9hZFBpeGVsRGF0YVRvVGV4dHVyZSIsInBpeGVscyIsImNyZWF0ZUZsb2F0MTZQYWNrZWRNYXRyaXhUZXh0dXJlIiwiY3JlYXRlUGFja2VkTWF0cml4VGV4dHVyZSIsImRlbGV0ZU1hdHJpeFRleHR1cmUiLCJkZWxldGVUZXh0dXJlIiwiZG93bmxvYWRNYXRyaXhEcml2ZXIiLCJkb3dubG9hZFBhY2tlZE1hdHJpeEZyb21CdWZmZXIiLCJwaHlzaWNhbFJvd3MiLCJwaHlzaWNhbENvbHMiLCJiaW5kVGV4dHVyZVRvRnJhbWVCdWZmZXIiLCJ1bmJpbmRUZXh0dXJlVG9GcmFtZUJ1ZmZlciIsImZlbmNlQ29udGV4dCIsImNyZWF0ZUZlbmNlIiwicG9sbEZlbmNlIiwiaXNGZW5jZVBhc3NlZCIsImdsMiIsImZlbmNlU3luYyIsIlNZTkNfR1BVX0NPTU1BTkRTX0NPTVBMRVRFIiwiY2xpZW50V2FpdFN5bmMiLCJBTFJFQURZX1NJR05BTEVEIiwiQ09ORElUSU9OX1NBVElTRklFRCIsImlzUXVlcnlBdmFpbGFibGUiLCJjcmVhdGVQcm9ncmFtIiwiZnJhZ21lbnRTaGFkZXJTb3VyY2UiLCJmcmFnbWVudFNoYWRlciIsInZlcnRleFNoYWRlciIsImF0dGFjaFNoYWRlciIsImRlYnVnIiwic2V0UHJvZ3JhbSIsInVzZVByb2dyYW0iLCJ1bmlmb3JtTmFtZSIsInNob3VsZFRocm93IiwiZ2V0QXR0cmlidXRlTG9jYXRpb24iLCJnZXRBdHRyaWJMb2NhdGlvbiIsImdldFVuaWZvcm1Mb2NhdGlvbk5vVGhyb3ciLCJzZXRJbnB1dE1hdHJpeFRleHR1cmUiLCJpbnB1dE1hdHJpeFRleHR1cmUiLCJ1bmlmb3JtTG9jYXRpb24iLCJ0ZXh0dXJlVW5pdCIsInRocm93SWZOb1Byb2dyYW0iLCJzZXRPdXRwdXRNYXRyaXhUZXh0dXJlIiwib3V0cHV0TWF0cml4VGV4dHVyZSIsInNldE91dHB1dE1hdHJpeFRleHR1cmVEcml2ZXIiLCJzZXRPdXRwdXRQYWNrZWRNYXRyaXhUZXh0dXJlIiwib3V0cHV0UGFja2VkTWF0cml4VGV4dHVyZSIsInNldE91dHB1dE1hdHJpeFdyaXRlUmVnaW9uIiwic3RhcnRSb3ciLCJzdGFydENvbHVtbiIsIm51bUNvbHVtbnMiLCJzZXRPdXRwdXRNYXRyaXhXcml0ZVJlZ2lvbkRyaXZlciIsInNldE91dHB1dFBhY2tlZE1hdHJpeFdyaXRlUmVnaW9uIiwiZGVidWdWYWxpZGF0ZSIsImV4ZWN1dGVQcm9ncmFtIiwiZHJhd0VsZW1lbnRzIiwiVFJJQU5HTEVTIiwiVU5TSUdORURfU0hPUlQiLCJibG9ja1VudGlsQWxsUHJvZ3JhbXNDb21wbGV0ZWQiLCJnZXRRdWVyeVRpbWVyRXh0ZW5zaW9uIiwiZGlzam9pbnRRdWVyeVRpbWVyRXh0ZW5zaW9uIiwiZ2V0UXVlcnlUaW1lckV4dGVuc2lvbldlYkdMMiIsImdldFF1ZXJ5VGltZXJFeHRlbnNpb25XZWJHTDEiLCJjcmVhdGVRdWVyeSIsIlRJTUVfRUxBUFNFRF9FWFQiLCJjcmVhdGVRdWVyeUVYVCIsImJlZ2luUXVlcnlFWFQiLCJlbmRRdWVyeUVYVCIsInJlcGVhdGVkVHJ5IiwicXVlcnlUaW1lclZlcnNpb24iLCJnZXRRdWVyeVBhcmFtZXRlciIsIlFVRVJZX1JFU1VMVCIsImdldFF1ZXJ5T2JqZWN0RVhUIiwiUVVFUllfUkVTVUxUX0VYVCIsImF2YWlsYWJsZSIsIlFVRVJZX1JFU1VMVF9BVkFJTEFCTEUiLCJkaXNqb2ludCIsIkdQVV9ESVNKT0lOVF9FWFQiLCJRVUVSWV9SRVNVTFRfQVZBSUxBQkxFX0VYVCIsImFkZEl0ZW1Ub1BvbGwiLCJwb2xsSXRlbXMiLCJsaW5lYXJTZWFyY2hMYXN0VHJ1ZSIsImlzRG9uZUZuIiwicmVzb2x2ZUZuIiwiZG93bmxvYWRBbmREZWNvZGUiLCJvdXRwdXRNYXRyaXhUZXh0dXJlTWF5YmVQYWNrZWQiLCJzY2lzc29yIiwiY29tcGlsZVByb2dyYW0iLCJpbnB1dEluZm9zIiwibG9naWNhbFNoYXBlIiwiaW5TaGFwZUluZm9zIiwib3V0U2hhcGVJbmZvIiwiaW5mTG9jIiwibmFuTG9jIiwidW5pZm9ybUxvY2F0aW9ucyIsImluU2hhcGVzTG9jYXRpb25zIiwiaW5UZXhTaGFwZXNMb2NhdGlvbnMiLCJ2YXJOYW1lIiwib3V0U2hhcGVMb2NhdGlvbiIsIm91dFRleFNoYXBlTG9jYXRpb24iLCJvdXRTaGFwZVN0cmlkZXNMb2NhdGlvbiIsImN1c3RvbVVuaWZvcm1Mb2NhdGlvbnMiLCJ2YWxpZGF0ZUJpbmFyeUFuZFByb2dyYW0iLCJzaGFwZUluZm9zIiwic2hhcGVBIiwic2hhcGVCIiwidGV4U2hhcGVBIiwidGV4U2hhcGVCIiwicnVuUHJvZ3JhbSIsIm91dFRleCIsIm91dFRleFNoYXBlIiwidW5pZm9ybTFmIiwidmFyTG9jIiwidmFyT2Zmc2V0TG9jIiwidmFyU2hhcGVMb2MiLCJ2YXJUZXhTaGFwZUxvYyIsInVuaWZvcm1TaGFwZSIsInVuaWZvcm0xaXYiLCJ1bmlmb3JtMml2IiwidW5pZm9ybTNpdiIsInVuaWZvcm00aXYiLCJ1bmlmb3JtMmkiLCJ1bmlmb3JtMWZ2IiwidW5pZm9ybTFpIiwib3V0U2hhcGVMb2MiLCJjdXN0b21Mb2MiLCJjdXN0b21WYWx1ZSIsInVuaWZvcm0yZnYiLCJ1bmlmb3JtM2Z2IiwidW5pZm9ybTRmdiIsIm1ha2VTaGFkZXJLZXkiLCJrZXlJbnB1dHMiLCJoYXNPZmZzZXQiLCJ4VGV4U2hhcGUiLCJ1c2VTcXVlZXplU2hhcGUiLCJyYW5rMSIsInJhbmsyIiwicmFuazM0IiwicGFja2VkVGV4U2hhcGUiLCJpc0xvZ2ljYWxTaGFwVGV4U2hhcGVFcXVhbCIsImlzU2NhbGFyIiwiYnJvYWRjYXN0RGltcyIsImlzSW5PdXRUZXhTaGFwZUVxdWFsIiwiaXNUZXhTaGFwZUdyZWF0ZXJUaGFuT25lIiwia2V5VXNlckNvZGUiLCJ1c2VTaGFwZVVuaWZvcm1zIiwiY3JlYXRlVmVydGV4U2hhZGVyIiwidmVydGV4U2hhZGVyU291cmNlIiwiY3JlYXRlVmVydGV4QnVmZmVyIiwidmVydGV4QXJyYXkiLCJjcmVhdGVJbmRleEJ1ZmZlciIsInRyaWFuZ2xlVmVydGV4SW5kaWNlcyIsImNyZWF0ZUFuZENvbmZpZ3VyZVRleHR1cmUiLCJpbnRlcm5hbEZvcm1hdCIsInRleHR1cmVGb3JtYXQiLCJ0ZXh0dXJlVHlwZSIsInRleDJkIiwiVEVYVFVSRV8yRCIsImJpbmRUZXh0dXJlIiwidGV4UGFyYW1ldGVyaSIsIlRFWFRVUkVfV1JBUF9TIiwiQ0xBTVBfVE9fRURHRSIsIlRFWFRVUkVfV1JBUF9UIiwiVEVYVFVSRV9NSU5fRklMVEVSIiwiTkVBUkVTVCIsIlRFWFRVUkVfTUFHX0ZJTFRFUiIsInRleEltYWdlMkQiLCJnZXRJbnRlcm5hbEZvcm1hdEZvckZsb2F0MzJNYXRyaXhUZXh0dXJlIiwiaW50ZXJuYWxGb3JtYXRGbG9hdCIsInRleHR1cmVGb3JtYXRGbG9hdCIsIkZMT0FUIiwiZ2V0SW50ZXJuYWxGb3JtYXRGb3JGbG9hdDE2TWF0cml4VGV4dHVyZSIsImludGVybmFsRm9ybWF0SGFsZkZsb2F0IiwidGV4dHVyZVR5cGVIYWxmRmxvYXQiLCJnZXRJbnRlcm5hbEZvcm1hdEZvclVuc2lnbmVkQnl0ZXNNYXRyaXhUZXh0dXJlIiwiZG93bmxvYWRUZXh0dXJlRm9ybWF0IiwiUkdCQSIsIlVOU0lHTkVEX0JZVEUiLCJnZXRJbnRlcm5hbEZvcm1hdEZvclBhY2tlZE1hdHJpeFRleHR1cmUiLCJpbnRlcm5hbEZvcm1hdFBhY2tlZEZsb2F0IiwiZ2V0SW50ZXJuYWxGb3JtYXRGb3JGbG9hdDE2UGFja2VkTWF0cml4VGV4dHVyZSIsImludGVybmFsRm9ybWF0UGFja2VkSGFsZkZsb2F0IiwiYmluZFZlcnRleFByb2dyYW1BdHRyaWJ1dGVTdHJlYW1zIiwiZGF0YUZvclVwbG9hZCIsInRleGVsRGF0YVR5cGUiLCJjcmVhdGVCdWZmZXJGcm9tT3V0cHV0VGV4dHVyZSIsImNyZWF0ZUJ1ZmZlciIsIlBJWEVMX1BBQ0tfQlVGRkVSIiwiYnVmZmVyU2l6ZUJ5dGVzIiwiYnl0ZXNQZXJGbG9hdCIsImJ1ZmZlckRhdGEiLCJTVFJFQU1fUkVBRCIsInJlYWRQaXhlbHMiLCJkb3dubG9hZFRhcmdldCIsImdldEJ1ZmZlclN1YkRhdGEiLCJjb2xzIiwiZG93bmxvYWRNYXRyaXhGcm9tUGFja2VkT3V0cHV0VGV4dHVyZSIsInBhY2tlZFJHQkEiLCJJbTJDb2xQYWNrZWRQcm9ncmFtIiwiaXRlbXNQZXJCbG9ja1JvdyIsInVucm9sbGVkIiwiYXJnUmVkdWNlIiwicmVkdWNlVHlwZSIsImJlc3RJbmRpY2VzQSIsImNvbXB1dGVPcHRpbWFsV2luZG93U2l6ZSIsImFyZ1JlZHVjZVBhY2tlZCIsImFyZ01pbk1heFJlZHVjZSIsImEyRCIsInJlZHVjZWQiLCJpbnQiLCJDSEVDS19OQU5fU05JUFBFVF9VTkFSWSIsIkNIRUNLX05BTl9TTklQUEVUX0JJTkFSWSIsIkNIRUNLX05BTl9TTklQUEVUX0JJTkFSWV9QQUNLRUQiLCJvcFNuaXBwZXQiLCJwYWNrZWRPcFNuaXBwZXQiLCJjcHVLZXJuZWxJbXBsIiwid2ViZ2xCYWNrZW5kIiwic3VwcG9ydHNDb21wbGV4IiwiYURhdGEiLCJiRGF0YSIsImNvbXBsZXhQYXJ0cyIsImFQYXJ0IiwiYlBhcnQiLCJhSGFuZGxlIiwiYkhhbmRsZSIsImNvbXBsZXhPdXRwdXQiLCJtYXBBY3RpdmF0aW9uVG9TaGFkZXJQcm9ncmFtIiwicGFja2VkIiwicmVkdWN0aW9uVHlwZSIsInJlZHVjdGlvblN0YWdlcyIsInN0YWdlcyIsImdldFJlZHVjdGlvblN0YWdlcyIsInByZXZpb3VzUmVzdWx0IiwiYWRkSW1wbENQVSIsImJpbmNvdW50SW1wbENQVSIsImJpbmNvdW50UmVkdWNlSW1wbENQVSIsImNlaWxJbXBsQ1BVIiwiY29uY2F0SW1wbENQVSIsImVxdWFsSW1wbENQVSIsImV4cEltcGxDUFUiLCJleHBtMUltcGxDUFUiLCJmbG9vckltcGxDUFUiLCJnYXRoZXJOZEltcGxDUFUiLCJnYXRoZXJWMkltcGxDUFUiLCJncmVhdGVySW1wbENQVSIsImdyZWF0ZXJFcXVhbEltcGxDUFUiLCJsZXNzSW1wbENQVSIsImxlc3NFcXVhbEltcGxDUFUiLCJsaW5TcGFjZUltcGxDUFUiLCJsb2dJbXBsQ1BVIiwibWF4SW1wbENQVSIsIm1heGltdW1JbXBsQ1BVIiwibWluaW11bUltcGxDUFUiLCJtdWx0aXBseUltcGxDUFUiLCJuZWdJbXBsQ1BVIiwibm90RXF1YWxJbXBsQ1BVIiwicHJvZEltcGxDUFUiLCJyYW5nZUltcGxDUFUiLCJyc3FydEltcGxDUFUiLCJzaW1wbGVBYnNJbXBsQ1BVIiwic2xpY2VJbXBsQ1BVIiwic3BhcnNlRmlsbEVtcHR5Um93c0ltcGxDUFUiLCJzcGFyc2VSZXNoYXBlSW1wbENQVSIsInNwYXJzZVNlZ21lbnRSZWR1Y3Rpb25JbXBsQ1BVIiwic3RyaWRlZFNsaWNlSW1wbENQVSIsInN0cmluZ05HcmFtc0ltcGxDUFUiLCJzdHJpbmdTcGxpdEltcGxDUFUiLCJzdHJpbmdUb0hhc2hCdWNrZXRGYXN0SW1wbENQVSIsInN1YkltcGxDUFUiLCJ0aWxlSW1wbENQVSIsInRvcEtJbXBsQ1BVIiwidHJhbnNwb3NlSW1wbENQVSIsInVuaXF1ZUltcGxDUFUiLCJBQlMiLCJBQ09TIiwiQUNPU0giLCJBREQiLCJhZGRLZXJuZWxGdW5jIiwibWlkSW5kZXgiLCJsZWZ0U2lkZSIsInJpZ2h0U2lkZSIsIkFTSU4iLCJBU0lOSCIsIkFUQU4iLCJBVEFOMiIsIkFUQU4yX1BBQ0tFRCIsIkFUQU5IIiwiYXZnUG9vbFByb2dyYW0iLCJhdmdQb29sQmFja3Byb3BQcm9ncmFtIiwiYXZnUG9vbEdyYWQzRENvbmZpZyIsIk1BVE1VTF9TSEFSRURfRElNX1RIUkVTSE9MRCIsImJhdGNoTWF0TXVsSW1wbCIsImhhc0JpYXMiLCJhVmVjIiwiYlZlYyIsInNob3VsZFJlc2hhcGVCIiwiYVZlYzNkIiwiYlZlYzNkIiwiJGxlYWt5cmVsdUFscGhhIiwib3V0UmVzaGFwZWQiLCJmaW5hbElucHV0cyIsInJlc2hhcGVkSW50ZXJtZWRpYXRlIiwidHJhbnNwb3NlZEludGVybWVkaWF0ZSIsInJlc2hhcGVkSW50ZXJtZWRpYXRlMiIsInplcm9zVGVuc29yIiwiYmluYXJ5SW5wdXRzIiwiQ0VJTCIsImNsaXBCeVZhbHVlIiwiY3VzdG9tVmFsdWVzIiwicmVhbFRlbnNvckluZm8iLCJpbWFnVGVuc29ySW5mbyIsIm1ha2VDb21wbGV4Q29tcG9uZW50VGVuc29ySW5mbyIsImNvbXBsZXhUZW5zb3IiLCJjb21wbGV4UGFydCIsInByb2dyYW1JbnB1dHMiLCJydW5PbkNwdSIsInRlbnNvcnMyRCIsImNvbXB1dGVUZW5zb3JzMkQiLCJjb252MmQiLCJjb252MmRCeU1hdE11bCIsInhUZXhEYXRhIiwic2hhcmVkTWF0TXVsRGltIiwib3V0ZXJTaGFwZVgiLCJvdXRlclNoYXBlRmlsdGVyIiwiYmF0Y2hNYXRNdWxXaWxsQmVVbnBhY2tlZCIsInJlc2hhcGVXaWxsQmVFeHBlbnNpdmUiLCJvcmlnaW5hbFhUZXhEYXRhU2hhcGUiLCJmaWx0ZXJSZXNoYXBlZCIsInBvaW50d2lzZUNvbnYiLCJwb2ludHdpc2VDb252VGV4RGF0YSIsImNvbnYyZFdpdGhJbTJSb3ciLCJ4MkNvbFNoYXBlIiwieFNxdWVlemVkIiwidzJSb3ciLCJpbTJDb2xQcm9ncmFtIiwiaW0yQ29sIiwiaW0yQ29sUmVzaGFwZWQiLCJtYXRtdWxQcm9ncmFtIiwiY29udjNEQmFja3Byb3BJbnB1dCIsImNvbnYzREJhY2twcm9wSW5wdXRDb25maWciLCJDT1MiLCJsb2cyIiwicHJldlJlc3VsdCIsImZsYXQiLCJkaWxhdGlvbjJEIiwiZGlsYXRpb24yRENvbmZpZyIsIkVSRiIsIkVYUCIsIkVYUE0xIiwicmVhbFByb2dyYW0iLCJpbWFnUHJvZ3JhbSIsImNvbXBsZXhPdXRwdXRSZXNoYXBlZCIsIkZMT09SIiwiZnJvbVBpeGVsc0NvbmZpZyIsImlzVmlkZW8iLCJIVE1MVmlkZW9FbGVtZW50IiwiaXNJbWFnZSIsIkhUTUxJbWFnZUVsZW1lbnQiLCJ2aWRlb1dpZHRoIiwidmlkZW9IZWlnaHQiLCJmcm9tUGl4ZWxzMkRDb250ZXh0IiwiZHJhd0ltYWdlIiwidGVtcFBpeGVsSGFuZGxlIiwiRnJvbVBpeGVsc1Byb2dyYW0iLCJGcm9tUGl4ZWxzUGFja2VkUHJvZ3JhbSIsImZ1c2VkQ29udjJkIiwic2hvdWxkUGFja0RlcHRod2lzZUNvbnYiLCJmbGF0dGVuSW5kaWNlcyIsIm91dFZhbHVlIiwiaW5wdXREYXRhIiwibHJuIiwiTFJOQ29uZmlnIiwibHJuR3JhZCIsIkxSTkdyYWRDb25maWciLCJMRUFLWVJFTFUiLCJMRUFLWVJFTFVfUEFDS0VEIiwiJGFscGhhIiwiTEVTU19FUVVBTCIsIkxFU1NfRVFVQUxfUEFDS0VEIiwibWF4SW5wdXRJc1RyYW5zcG9zZWQiLCJtYXhJbnB1dCIsIm1heElucHV0VmFsdWVzIiwibWF4UG9vbFByb2dyYW0iLCJtYXhQb29sM2QiLCJtYXhQb29sM2RQb3NpdGlvbnNQcm9ncmFtIiwibWF4UG9vbEJhY2twcm9wUHJvZ3JhbSIsIm1heFBvb2xHcmFkM0RDb25maWciLCJtYXhQb29sUG9zaXRpb25zUHJvZ3JhbSIsIm1heFBvb2xCYWNrUHJvcFByb2dyYW0iLCJwb29sT3V0cHV0IiwicmVzaGFwZWRJbnB1dCIsInJlc2hhcGVkT3V0cHV0IiwiTUFYSU1VTSIsIk1BWElNVU1fUEFDS0VEIiwibWVhbklucHV0SXNUcmFuc3Bvc2VkIiwibWVhbklucHV0IiwibWVhbklucHV0VmFsdWVzIiwibWVhbk91dFNoYXBlIiwibWVhbkltcGwiLCJNSU5JTVVNIiwiTUlOSU1VTV9QQUNLRUQiLCJtaXJyb3JQYWRLZXJuZWxGdW5jIiwiTU9EX1BBQ0tFRCIsInByb2JzIiwibnVtT3V0Y29tZXMiLCJNVUwiLCJORUciLCJQT1dfUEFDS0VEIiwiUFJFTFUiLCJQUkVMVV9QQUNLRUQiLCJvdXRwdXREVHlwZSIsInJlYWxEaXYiLCJSRUxVIiwiUkVMVTYiLCJTRUxVIiwiU0lOIiwibmV3VGV4RGF0YSIsImFzc2lnbiIsInNoYWxsb3dTbGljZSIsIm1heExvZ2l0c1Jlc2hhcGVkIiwic3VtRXhwUmVzaGFwZWQiLCJyZXNoYXBlZFBhZGRlZFgiLCJzcXVhcmUiLCJTVUIiLCJzdW1JbXBsIiwic3VtSW5wdXRJc1RyYW5zcG9zZWQiLCJzdW1JbnB1dCIsInN1bU91dFNoYXBlIiwib3V0VHlwZSIsImRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvT3JOdWxsIiwicm91bmRVcFRvUG93MiIsInBvdzIiLCJUT1BLX0xBU1RfRElNX0NQVV9IQU5ET0ZGX1NJWkVfVEhSRVNIT0xEIiwiVE9QS19LX0NQVV9IQU5ET0ZGX1RIUkVTSE9MRCIsInh0ZXhEYXRhIiwieElzUGFja2VkIiwieFVuUGFja2VkIiwieDJEIiwia1BvdzIiLCJsYXN0RGltUG93MiIsImdldElucHV0cyIsInJ1blN3YXAiLCJkaXIiLCJpbmMiLCJwcmV2SW5kaWNlcyIsIm1lcmdlUHJvZ3JhbSIsInByZXZWYWx1ZXMiLCJzZWdPcENvbXB1dGUiLCJzZWdPcFR5cGUiLCJzZWdPcENvbXB1dGVPcHRpbWFsV2luZG93U2l6ZSIsInNlZ09wSW5mbyIsInJhbmdlSW5mbyIsInRpbGVJbmZvIiwic2VnT3BSZXN1bHQiLCJMUk5Qcm9ncmFtIiwicmFkaXVzIiwicmFkIiwicG93T3BlcmF0b3IiLCJiYXNpcyIsIkxSTkdyYWRQcm9ncmFtIiwiTFJOUGFja2VkUHJvZ3JhbSIsIk1heFBvb2wyREJhY2twcm9wUHJvZ3JhbSIsIk1heFBvb2wzREJhY2twcm9wUHJvZ3JhbSIsIk1lYW5Qcm9ncmFtIiwid2luZG93U2l6ZU5lYXJlc3RWZWM0Iiwid2luZG93U2l6ZVZlYzRSZW1haW5kZXIiLCJ1cGRhdGVTbmlwcGV0IiwiZGVub21pbmF0b3IiLCJpc0ludCIsInRvUHJlY2lzaW9uIiwiTWlycm9yUGFkUHJvZ3JhbSIsInVucGFja2VkQ29vcmRzIiwiTWlycm9yUGFkUGFja2VkUHJvZ3JhbSIsImNMaW1pdCIsInBhZFNldHVwIiwiTWF0TXVsUGFja2VkUHJvZ3JhbSIsImhhc0xlYWt5cmVsdUFjdGl2YXRpb24iLCJzaGFyZWREaW1lbnNpb25QYWNrZWQiLCJhU2FtcGxlIiwiYlNhbXBsZSIsImFTd2l6emxlIiwiYlN3aXp6bGUiLCJiYXRjaEFTbmlwcGV0IiwiYmF0Y2hCU25pcHBldCIsIk11bHRpbm9taWFsUHJvZ3JhbSIsIk9uZUhvdFByb2dyYW0iLCJQYWNrUHJvZ3JhbSIsIm91dE9mQm91bmRzQ29uZGl0aW9uIiwiY29uZCIsImdldE91dE9mQm91bmRzQ29uZGl0aW9uIiwic2V0dXAiLCJnZXRTZXR1cCIsImNvb3JkIiwiZ2V0U291cmNlQ29vcmRzQXJyIiwiZ2V0T3V0cHV0IiwiZ2V0VmVjQ2hhbm5lbHMiLCJnZXRDaGFubmVscyIsIlBhZFByb2dyYW0iLCJQYWRQYWNrZWRQcm9ncmFtIiwiY29tcG9uZW50U2V0dXAiLCJwYWRkaW5nQXJlYSIsIlBvb2wyRFByb2dyYW0iLCJjb21wdXRlUG9zaXRpb25zIiwiaXNBdmdQb29sIiwiYmF0Y2hGbGF0dGVuUG9zaXRpb25TdHIiLCJmbGF0dGVuUG9zaXRpb25TdHIiLCJpbml0aWFsaXphdGlvblZhbHVlIiwiY29tcGFyZU9wIiwicmV0dXJuVmFsdWUiLCJmaWx0ZXJXaWR0aE5lYXJlc3RWZWM0IiwiZmlsdGVyV2lkdGhWZWM0UmVtYWluZGVyIiwiUG9vbDNEUHJvZ3JhbSIsIlJlZHVjZVByb2dyYW0iLCJ2ZWNUeXBlIiwiUmVzaGFwZVBhY2tlZFByb2dyYW0iLCJ0aGlzUkMiLCJSZXNpemVCaWxpbmVhckJhY2twcm9wUHJvZ3JhbSIsImR5U2hhcGUiLCJSZXNpemVCaWxpbmVhclByb2dyYW0iLCJlZmZlY3RpdmVJblNpemUiLCJlZmZlY3RpdmVPdXRTaXplIiwic291cmNlRnJhY0luZGV4UkMiLCJSZXNpemVCaWxpbmVhclBhY2tlZFByb2dyYW0iLCJSZXNpemVOZWFyZXN0TmVpZ2JvckJhY2twcm9wUHJvZ3JhbSIsIlJlc2l6ZU5lYXJlc3ROZWlnaGJvclByb2dyYW0iLCJyb3VuZEJhc2UiLCJSZXNpemVOZWFyZXN0TmVpZ2hib3JQYWNrZWRQcm9ncmFtIiwiUmV2ZXJzZVByb2dyYW0iLCJpbkNvb3JkcyIsImdldEluQ29vcmQiLCJSZXZlcnNlUGFja2VkUHJvZ3JhbSIsIm5leHRDb2x1bW4iLCJuZXh0Um93IiwiZ2V0Q2hhbm5lbCIsImluQ29vcmRzQXJyYXkiLCJjaGFubmVsczEiLCJnZXRSIiwiZ2V0RyIsImdldEIiLCJnZXRBIiwiUm90YXRlUHJvZ3JhbSIsImZpbGxTbmlwcGV0IiwiU2NhdHRlclByb2dyYW0iLCJ1cGRhdGVTaXplIiwiaW5kaWNlc1JhbmsiLCJ1cGRhdGVzUmFuayIsInN1bW1pbmdEdXBlSW5kZXgiLCJpbmRpY2VzU3RyaW5nIiwiaW5kaWNlc1NuaXBwZXQiLCJ1cGRhdGVzU3RyaW5nIiwidXBkYXRlc1NuaXBwZXQiLCJTZWdtZW50T3BQcm9ncmFtIiwiY2hlY2tWYWx1ZU91dE9mQm91bmRzIiwiY2hlY2tTZWdtZW50SWRPdXRPZkJvdW5kcyIsIlNlbGVjdFByb2dyYW0iLCJjQ29vcmRzIiwiYWJDb29yZHMiLCJjQ29vcmRWYXJzIiwiYWJDb29yZFZhcnMiLCJtYWtlU2hhZGVyIiwiaW5wdXRzSW5mbyIsInByZWZpeFNuaXBwZXRzIiwiZ2V0VW5pZm9ybUluZm9Gcm9tU2hhcGUiLCJhcnJheUluZGV4IiwiaW5wdXRQcmVmaXhTbmlwcGV0IiwiaW5wdXRTYW1wbGluZ1NuaXBwZXQiLCJpbkluZm8iLCJ1c2VzUGFja2VkVGV4dHVyZXMiLCJnZXRQYWNrZWRTYW1wbGVyRnJvbUluSW5mbyIsImdldFNhbXBsZXJGcm9tSW5JbmZvIiwiaW5wdXRJbmZvIiwidGV4TmFtZSIsInRleEZ1bmNTbmlwcGV0IiwiZnVuY05hbWUiLCJpblJhbmsiLCJnZXRDb29yZHNEYXRhVHlwZSIsInJhbmtEaWZmIiwiY29vcmRzU25pcHBldCIsImZpZWxkcyIsInVucGFja2VkQ29vcmRzU25pcHBldCIsImlzSW5wdXRTY2FsYXIiLCJpc091dHB1dFNjYWxhciIsImdldFBhY2tlZFNhbXBsZXJBdE91dHB1dENvb3JkcyIsImluVGV4U2hhcGUiLCJnZXRTYW1wbGVyQXRPdXRwdXRDb29yZHMiLCJnZXRJbnB1dFNhbXBsaW5nU25pcHBldCIsImZsb2F0VGV4dHVyZVNhbXBsZVNuaXBwZXQiLCJnZXRGbG9hdFRleHR1cmVTYW1wbGVTbmlwcGV0Iiwib3V0cHV0U2FtcGxpbmdTbmlwcGV0IiwiZmxvYXRUZXh0dXJlU2V0T3V0cHV0U25pcHBldCIsInNoYWRlclByZWZpeCIsIlNBTVBMRV8xRF9TTklQUEVUIiwiU0FNUExFXzJEX1NOSVBQRVQiLCJTQU1QTEVfM0RfU05JUFBFVCIsImdldFNoYWRlclByZWZpeCIsImdldE91dHB1dFNjYWxhckNvb3JkcyIsImdldE91dHB1dFBhY2tlZDFEQ29vcmRzIiwidGV4ZWxzSW5Mb2dpY2FsUm93IiwiZ2V0T3V0cHV0UGFja2VkMkRDb29yZHMiLCJ0ZXhlbHNJbkJhdGNoIiwiZ2V0T3V0cHV0UGFja2VkM0RDb29yZHMiLCJ0ZXhlbHNJbkJhdGNoTiIsImJhdGNoZXMiLCJnZXRPdXRwdXRQYWNrZWRORENvb3JkcyIsImdldFBhY2tlZE91dHB1dFNhbXBsaW5nU25pcHBldCIsImdldEZsb2F0VGV4dHVyZVNldFJHQkFTbmlwcGV0IiwiZ2V0T3V0cHV0MURDb29yZHMiLCJnZXRPdXRwdXQyRENvb3JkcyIsImNvb3Jkc0Zyb21JbmRleFNuaXBwZXQiLCJnZXRPdXRwdXQzRENvb3JkcyIsImdldE91dHB1dDREQ29vcmRzIiwiZ2V0T3V0cHV0NURDb29yZHMiLCJnZXRPdXRwdXQ2RENvb3JkcyIsImdldE91dHB1dFNhbXBsaW5nU25pcHBldCIsImdldEZsb2F0VGV4dHVyZVNldFJTbmlwcGV0IiwiU0hBREVSX1BBQ0tFRF9QUkVGSVgiLCJ0ZXhOdW1SIiwidGV4TnVtQyIsImdldEZsYXRPZmZzZXRVbmlmb3JtTmFtZSIsInROdW1SIiwidE51bUMiLCJnZXRTYW1wbGVyU2NhbGFyIiwiZ2V0VW5pZm9ybVNhbXBsZXIiLCJnZXRTYW1wbGVyMUQiLCJrZXB0RGltcyIsInNxdWVlemVTaGFwZSIsInNxdWVlemVkU2hhcGUiLCJzcXVlZXplSW5wdXRJbmZvIiwiZ2V0U3F1ZWV6ZWRQYXJhbXMiLCJnZXRTYW1wbGVyMkQiLCJzdHJpZGUwIiwic3RyaWRlMSIsImdldFNhbXBsZXIzRCIsInN0cmlkZTIiLCJzdHJpZGUyU3RyIiwic3RyaWRlMVN0ciIsInN0cmlkZTBTdHIiLCJnZXRTYW1wbGVyNEQiLCJzdHJpZGUzIiwiZ2V0U2FtcGxlcjVEIiwic3RyaWRlNCIsImdldFNhbXBsZXI2RCIsImdldFBhY2tlZFNhbXBsZXJTY2FsYXIiLCJnZXRQYWNrZWRTYW1wbGVyMUQiLCJ2YWx1ZXNQZXJSb3ciLCJnZXRQYWNrZWRTYW1wbGVyMkQiLCJnZXRQYWNrZWRTYW1wbGVyM0QiLCJnZXRQYWNrZWRTYW1wbGVyTkQiLCJ1c2VTcXVlZXplUGFja2VkU2hhcGUiLCJuZXdJbnB1dEluZm8iLCJKU09OIiwicGFyc2UiLCJzdHJpbmdpZnkiLCJnZXRMb2dpY2FsQ29vcmRpbmF0ZXNGcm9tRmxhdEluZGV4Iiwic3RyaWRlIiwiZ2V0TG9naWNhbENvb3JkaW5hdGVzRnJvbUZsYXRJbmRleEJ5VW5pZm9ybSIsImJ1aWxkVmVjIiwiZG90aWZ5Iiwic2xpY2VzIiwibmVhcmVzdFZlYzQiLCJuZWFyZXN0VmVjNFJlbWFpbmRlciIsInlTbGljZSIsImdldEZsYXRJbmRleEZyb20zRCIsIkVOQ09ERV9GTE9BVF9TTklQUEVUIiwiU2xpY2VQcm9ncmFtIiwiZGVzdFNpemUiLCJib2R5IiwiU2xpY2VQYWNrZWRQcm9ncmFtIiwic291cmNlTG9jIiwidXBwZXJSb3ciLCJsb3dlclJvdyIsIlN0cmlkZWRTbGljZVByb2dyYW0iLCJpbnB1dER0eXBlIiwibmV3Q29vcmRzIiwib3V0cHV0QXhpcyIsIlBhY2tpbmdTY2hlbWUiLCJUZXh0dXJlVXNhZ2UiLCJQaHlzaWNhbFRleHR1cmVUeXBlIiwiZ2V0VW5wYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodCIsImdldFVucGFja2VkQXJyYXlTaXplRnJvbU1hdHJpeFNpemUiLCJtYXRyaXhTaXplIiwiY2hhbm5lbHNQZXJUZXh0dXJlIiwiZ2V0Q29sb3JNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodCIsImdldERlbnNlVGV4U2hhcGUiLCJ0ZXhlbHNOZWVkZWQiLCJzaXplVG9TcXVhcmlzaFNoYXBlIiwiZ2V0TWF0cml4U2l6ZUZyb21VbnBhY2tlZEFycmF5U2l6ZSIsInVucGFja2VkU2l6ZSIsImRlY29kZU1hdHJpeEZyb21VbnBhY2tlZENvbG9yUkdCQUFycmF5IiwidW5wYWNrZWRBcnJheSIsIm1hdHJpeCIsInJlcXVpcmVkU2l6ZSIsImRzdCIsImdldFBhY2tlZE1hdHJpeFRleHR1cmVTaGFwZVdpZHRoSGVpZ2h0IiwiZ2V0UGFja2VkUkdCQUFycmF5U2l6ZUZyb21NYXRyaXhTaGFwZSIsImdldFRleHR1cmVDb25maWciLCJnbGFueSIsImRvd25sb2FkVW5wYWNrTnVtQ2hhbm5lbHMiLCJkZWZhdWx0TnVtQ2hhbm5lbHMiLCJ0ZXh0dXJlVHlwZUZsb2F0IiwiUjMyRiIsIlIxNkYiLCJSR0JBMTZGIiwiUkdCQTMyRiIsIlJFRCIsIkhBTEZfRkxPQVQiLCJIQUxGX0ZMT0FUX09FUyIsIlRleHR1cmVNYW5hZ2VyIiwibnVtVXNlZFRleHR1cmVzIiwibnVtRnJlZVRleHR1cmVzIiwiX251bUJ5dGVzQWxsb2NhdGVkIiwiX251bUJ5dGVzRnJlZSIsImZyZWVUZXh0dXJlcyIsImxvZ0VuYWJsZWQiLCJ1c2VkVGV4dHVyZXMiLCJzaGFwZVJDIiwicGh5c2ljYWxUZXhUeXBlIiwiZ2V0UGh5c2ljYWxGcm9tTG9naWNhbFRleHR1cmVUeXBlIiwic2hhcGVLZXkiLCJnZXRLZXlGcm9tVGV4dHVyZVNoYXBlIiwidGV4Qnl0ZXMiLCJQQUNLRURfMlgyX0ZMT0FUMzIiLCJQQUNLRURfMlgyX0ZMT0FUMTYiLCJVTlBBQ0tFRF9GTE9BVDMyIiwiVU5QQUNLRURfRkxPQVQxNiIsIlBBQ0tFRF80WDFfVU5TSUdORURfQllURSIsImxvZ2ljYWxUZXhUeXBlIiwiZGVsZXRlVGV4VGhyZXNob2xkIiwidGV4TGlzdCIsInRleEluZGV4IiwidG90YWwiLCJmcmVlUmF0aW8iLCJnZXROdW1Vc2VkVGV4dHVyZXMiLCJnZXROdW1GcmVlVGV4dHVyZXMiLCJ0ZXgiLCJpbnRlcm5hbEZvcm1hdEZvclBoeXNpY2FsVGV4VHlwZSIsInBhY2tlZFdpZHRoIiwicGFja2VkSGVpZ2h0IiwibnVtQnl0ZXNGb3JJbnRlcm5hbEZvcm1hdCIsIlJFTkRFUiIsImdldFBoeXNpY2FsVGV4dHVyZUZvclJlbmRlcmluZyIsInNoYXBlUm93c0NvbCIsIlRpbGVQcm9ncmFtIiwiU3dhcFByb2dyYW0iLCJNZXJnZVByb2dyYW0iLCJUcmFuc2Zvcm1Qcm9ncmFtIiwiVHJhbnNwb3NlUHJvZ3JhbSIsIm5ld0RpbSIsInN3aXRjaGVkIiwib3JpZ2luYWxPcmRlciIsInN3aXRjaGVkQ29vcmRzIiwiZ2V0U3dpdGNoZWRDb29yZHMiLCJUcmFuc3Bvc2VQYWNrZWRQcm9ncmFtIiwib3V0cHV0T3JkZXIiLCJzd2l0Y2hlZE9yZGVyIiwiZ2V0YyIsIlVuYXJ5T3BQcm9ncmFtIiwiTElORUFSIiwiU1RFUCIsIkVMVSIsIkNMT05FIiwiU0lHTU9JRCIsIlVuYXJ5T3BQYWNrZWRQcm9ncmFtIiwiVW5wYWNrUHJvZ3JhbSIsImNhbGxBbmRDaGVjayIsImdldEVycm9yIiwiTk9fRVJST1IiLCJnZXRXZWJHTEVycm9yTWVzc2FnZSIsImNoZWNrV2ViR0xFcnJvciIsImNhbkJlUmVwcmVzZW50ZWQiLCJJTlZBTElEX0VOVU0iLCJJTlZBTElEX1ZBTFVFIiwiSU5WQUxJRF9PUEVSQVRJT04iLCJJTlZBTElEX0ZSQU1FQlVGRkVSX09QRVJBVElPTiIsIk9VVF9PRl9NRU1PUlkiLCJDT05URVhUX0xPU1RfV0VCR0wiLCJnZXRFeHRlbnNpb25PclRocm93IiwiZXh0ZW5zaW9uTmFtZSIsInRocm93SWZOdWxsIiwiY3JlYXRlU2hhZGVyIiwiVkVSVEVYX1NIQURFUiIsInNoYWRlclNvdXJjZSIsImNvbXBpbGVTaGFkZXIiLCJnZXRTaGFkZXJQYXJhbWV0ZXIiLCJDT01QSUxFX1NUQVRVUyIsImdldFNoYWRlckluZm9Mb2ciLCJjcmVhdGVGcmFnbWVudFNoYWRlciIsIkZSQUdNRU5UX1NIQURFUiIsInNoYWRlckluZm9Mb2ciLCJsaW5lTnVtYmVyUmVnZXhSZXN1bHQiLCJsaW5lTnVtYmVyUmVnZXgiLCJleGVjIiwibGluZU51bWJlciIsInNoYWRlckxpbmVzIiwibGluZXNXaXRoTGluZU51bWJlcnMiLCJtYXhMaW5lTGVuZ3RoIiwiYmVmb3JlRXJyb3JMaW5lcyIsImVycm9yTGluZSIsImFmdGVyRXJyb3JMaW5lcyIsImxvZ1NoYWRlclNvdXJjZUFuZEluZm9Mb2ciLCJsaW5rUHJvZ3JhbSIsIkxJTktfU1RBVFVTIiwiZ2V0UHJvZ3JhbUluZm9Mb2ciLCJ2YWxpZGF0ZVByb2dyYW0iLCJWQUxJREFURV9TVEFUVVMiLCJjcmVhdGVTdGF0aWNWZXJ0ZXhCdWZmZXIiLCJTVEFUSUNfRFJBVyIsImNyZWF0ZVN0YXRpY0luZGV4QnVmZmVyIiwiZ2V0TnVtQ2hhbm5lbHMiLCJjcmVhdGVUZXh0dXJlIiwidmFsaWRhdGVUZXh0dXJlU2l6ZSIsIm1heFRleHR1cmVTaXplIiwiY3JlYXRlRnJhbWVidWZmZXIiLCJiaW5kVmVydGV4QnVmZmVyVG9Qcm9ncmFtQXR0cmlidXRlIiwiYXJyYXlFbnRyaWVzUGVySXRlbSIsIml0ZW1TdHJpZGVJbkJ5dGVzIiwiaXRlbU9mZnNldEluQnl0ZXMiLCJ2ZXJ0ZXhBdHRyaWJQb2ludGVyIiwiZW5hYmxlVmVydGV4QXR0cmliQXJyYXkiLCJiaW5kVGV4dHVyZVVuaXQiLCJ2YWxpZGF0ZVRleHR1cmVVbml0IiwiYWN0aXZlVGV4dHVyZSIsIlRFWFRVUkUwIiwidW5iaW5kVGV4dHVyZVVuaXQiLCJnZXRQcm9ncmFtVW5pZm9ybUxvY2F0aW9uT3JUaHJvdyIsImdldFByb2dyYW1Vbmlmb3JtTG9jYXRpb24iLCJiaW5kVGV4dHVyZVRvUHJvZ3JhbVVuaWZvcm1TYW1wbGVyIiwidW5pZm9ybVNhbXBsZXJMb2NhdGlvbiIsImJpbmRDYW52YXNUb0ZyYW1lYnVmZmVyIiwiYmluZENvbG9yVGV4dHVyZVRvRnJhbWVidWZmZXIiLCJmcmFtZWJ1ZmZlclRleHR1cmUyRCIsIkNPTE9SX0FUVEFDSE1FTlQwIiwidW5iaW5kQ29sb3JUZXh0dXJlRnJvbUZyYW1lYnVmZmVyIiwidmFsaWRhdGVGcmFtZWJ1ZmZlciIsImNoZWNrRnJhbWVidWZmZXJTdGF0dXMiLCJGUkFNRUJVRkZFUl9DT01QTEVURSIsImdldEZyYW1lYnVmZmVyRXJyb3JNZXNzYWdlIiwiRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5UIiwiRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NSVNTSU5HX0FUVEFDSE1FTlQiLCJGUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJTUVOU0lPTlMiLCJGUkFNRUJVRkZFUl9VTlNVUFBPUlRFRCIsInJldHVyblRPck51bGwiLCJmYWlsdXJlTWVzc2FnZSIsInRPck51bGwiLCJtYXhUZXh0dXJlVW5pdCIsIk1BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTIiwiZ2xUZXh0dXJlVW5pdCIsImdldEJhdGNoRGltIiwiZGltc1RvU2tpcCIsImdldFJvd3NDb2xzIiwiZ2V0U2hhcGVBczNEIiwiZ2V0VGV4dHVyZVNoYXBlRnJvbUxvZ2ljYWxTaGFwZSIsImxvZ1NoYXBlIiwibWF4VGV4U2l6ZSIsInNxdWVlemVSZXN1bHQiLCJpc0V2ZW4iLCJpc1Jlc2hhcGVGcmVlIiwic2hhcGUxIiwic2hhcGUyIiwic2hhcGUxQ29scyIsInNoYXBlMkNvbHMiLCJNQVhfVEVYVFVSRV9TSVpFIiwiTUFYX1RFWFRVUkVTX0lOX1NIQURFUiIsImdldFdlYkdMTWF4VGV4dHVyZVNpemUiLCJyZXNldE1heFRleHR1cmVTaXplIiwicmVzZXRNYXhUZXh0dXJlc0luU2hhZGVyIiwiZ2V0TWF4VGV4dHVyZXNJblNoYWRlciIsIk1BWF9URVhUVVJFX0lNQUdFX1VOSVRTIiwiZ2V0V2ViR0xEaXNqb2ludFF1ZXJ5VGltZXJWZXJzaW9uIiwiaGFzRXh0ZW5zaW9uIiwiaXNXZWJHTFZlcnNpb25FbmFibGVkIiwiaXNDYXBhYmxlT2ZSZW5kZXJpbmdUb0Zsb2F0VGV4dHVyZSIsImNyZWF0ZUZsb2F0VGV4dHVyZUFuZEJpbmRUb0ZyYW1lYnVmZmVyIiwiaXNEb3dubG9hZEZsb2F0VGV4dHVyZUVuYWJsZWQiLCJ0ZXhDb25maWciLCJmcmFtZUJ1ZmZlciIsImlzRnJhbWVCdWZmZXJDb21wbGV0ZSIsImNyZWF0ZUhhbGZGbG9hdFRleHR1cmVBbmRCaW5kVG9GcmFtZWJ1ZmZlciIsImlzV2ViR0xGZW5jZUVuYWJsZWQiLCJEYXRhU3RvcmFnZSIsImRhdGFNb3ZlciIsImRhdGFJZHNDb3VudCIsIm1vdmVEYXRhIiwiS2VybmVsQmFja2VuZCIsIm5vdFlldEltcGxlbWVudGVkIiwic3RyaW5ncyIsIkFSUk9XIiwiQVJST1dfUkVHRVgiLCJudW1UZW5zb3JzIiwibnVtQXJyb3dzIiwiaW5wdXRTdHJpbmciLCJvdXRwdXRTdHJpbmciLCJpbnB1dFRlcm1zIiwibnVtSW5wdXRzIiwiZGltTmFtZSIsImlucHV0VGVybSIsIlNldCIsIm51bURpbXMiLCJuRGltcyIsImRpbVNpemVzIiwiY29tcHV0ZWRUZXJtSW5kaWNlcyIsInRlcm1JbmRpY2VzIiwiZmluZFRlcm1zV2l0aERpbSIsInRlcm1JbmRleCIsIm5vbk1heFN1cHByZXNzaW9uSW1wbF8iLCJyZXR1cm5TY29yZXNUZW5zb3IiLCJyZXR1cm5WYWxpZE91dHB1dHMiLCJjYW5kaWRhdGVzIiwic2NvcmUiLCJib3hJbmRleCIsInN1cHByZXNzQmVnaW5JbmRleCIsImFzY2VuZGluZ0NvbXBhcmF0b3IiLCJjYW5kaWRhdGUiLCJvcmlnaW5hbFNjb3JlIiwiaWdub3JlQ2FuZGlkYXRlIiwiaW91IiwiaW50ZXJzZWN0aW9uT3ZlclVuaW9uIiwic3VwcHJlc3NXZWlnaHQiLCJlbGVtc1RvUGFkIiwiaUNvb3JkIiwiakNvb3JkIiwieW1pbkkiLCJ4bWluSSIsInltYXhJIiwieG1heEkiLCJ5bWluSiIsInhtaW5KIiwieW1heEoiLCJ4bWF4SiIsImFyZWFJIiwiYXJlYUoiLCJpbnRlcnNlY3Rpb25ZbWluIiwiaW50ZXJzZWN0aW9uWG1pbiIsImludGVyc2VjdGlvblltYXgiLCJpbnRlcnNlY3Rpb25YbWF4IiwiaW50ZXJzZWN0aW9uQXJlYSIsIndlaWdodCIsImMxIiwiYzIiLCJiaW5hcnlJbnNlcnQiLCJjb21wYXJhdG9yIiwiYmluYXJ5U2VhcmNoIiwiaW5zZXJ0aW9uUG9pbnQiLCJtaWRkbGUiLCJmb3VuZCIsImNvbXBhcmVSZXN1bHQiLCJiaW5hcnlTZWFyY2hfIiwiZGVmYXVsdENvbXBhcmF0b3IiLCJjb25kU2hhcGUiLCJpbkJ1ZmZlciIsInRvVGVuc29yIiwib3BIYW5kbGVyIiwiY2xvbmUiLCJkZWxheUNhbGxiYWNrIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwic2V0SW1tZWRpYXRlIiwibmV4dEZyYW1lIiwibmF2IiwidXNlckFnZW50IiwidmVuZG9yIiwib3BlcmEiLCJ0ZXN0IiwiV29ya2VyR2xvYmFsU2NvcGUiLCJpc1JlZ2lzdGVyZWRLZXJuZWxJbnZvY2F0aW9uIiwia2VybmVsSW52b2NhdGlvbiIsIkVuZ2luZVN0YXRlIiwicmVnaXN0ZXJlZFZhcmlhYmxlcyIsIm5leHRUYXBlTm9kZUlkIiwibnVtU3RyaW5nVGVuc29ycyIsIm51bURhdGFCdWZmZXJzIiwiZ3JhZGllbnREZXB0aCIsImtlcm5lbERlcHRoIiwic2NvcGVTdGFjayIsIm51bURhdGFNb3Zlc1N0YWNrIiwibmV4dFNjb3BlSWQiLCJwcm9maWxpbmciLCJhY3RpdmVQcm9maWxlIiwibmV3Qnl0ZXMiLCJuZXdUZW5zb3JzIiwicGVha0J5dGVzIiwia2VybmVscyIsInZhcmlhYmxlTmFtZSIsIkVuZ2luZSIsInJlZ2lzdHJ5IiwicmVnaXN0cnlGYWN0b3J5IiwicGVuZGluZ0JhY2tlbmRJbml0SWQiLCJzdGF0ZSIsInBlbmRpbmdCYWNrZW5kSW5pdCIsImJhY2tlbmRJbnN0YW5jZSIsInNvcnRlZEJhY2tlbmRzIiwiZ2V0U29ydGVkQmFja2VuZHMiLCJpbml0aWFsaXplQmFja2VuZCIsInN1Y2Nlc3MiLCJzZXRCYWNrZW5kIiwiYXN5bmNJbml0IiwiaW5pdGlhbGl6ZUJhY2tlbmRzQW5kUmV0dXJuQmVzdCIsImJhY2tlbmROYW1lcyIsImZpbmRCYWNrZW5kIiwiZmluZEJhY2tlbmRGYWN0b3J5IiwiZmFjdG9yeSIsInJlZ2lzdGVyQmFja2VuZCIsInByaW9yaXR5Iiwic2V0dXBSZWdpc3RlcmVkS2VybmVscyIsInByb2ZpbGVyIiwia2VybmVsIiwiZGlzcG9zZVJlZ2lzdGVyZWRLZXJuZWxzIiwiZGlzcG9zZUZ1bmMiLCJyZWdpc3RyeUZhY3RvcnlFbnRyeSIsInByb21pc2VJZCIsInJlbW92ZUJhY2tlbmQiLCJzcmNCYWNrZW5kIiwic2hvdWxkQ2hlY2tGb3JNZW1MZWFrcyIsInRpZHkiLCJuYW1lT3JGbiIsImZuIiwic2NvcGVkUnVuIiwic3RhcnRTY29wZSIsImVuZFNjb3BlIiwibmV4dFRlbnNvcklkIiwibmV4dFZhcmlhYmxlSWQiLCJFTkdJTkUiLCJydW5LZXJuZWwiLCJhZGRUYXBlTm9kZSIsImFjdGl2ZVNjb3BlIiwiZ3JhZElucHV0cyIsInJ1bktlcm5lbEZ1bmMiLCJjaGVja0tlcm5lbEZvck1lbUxlYWsiLCJudW1EYXRhSWRzQmVmb3JlIiwib3V0SW5mb3MiLCJudW1EYXRhSWRzQWZ0ZXIiLCJudW1PdXRwdXREYXRhSWRzIiwibnVtTW92ZXMiLCJkYXRhSWRzTGVha2VkIiwia2VybmVsUGFyYW1zIiwib3V0cHV0cyIsInNhdmVkIiwiaXNUYXBlT24iLCJzdGFydGluZ0J5dGVjb3VudCIsInN0YXJ0aW5nTnVtVGVuc29ycyIsImtlcm5lbE9yU2NvcGVOYW1lIiwib3V0VGVuc29ycyIsInRlbnNvcnNUb1NhdmUiLCJnZXRUZW5zb3JzRm9yR3JhZGllbnQiLCJzYXZlVGVuc29yc0ZvckJhY2t3YXJkTW9kZSIsImZvcndhcmRGdW5jIiwic2F2ZUZ1bmMiLCJrZWVwIiwiYmFja3dhcmRzRnVuYyIsImtlcm5lbFByb2ZpbGUiLCJwcm9maWxlS2VybmVsIiwibG9nS2VybmVsUHJvZmlsZSIsImJ5dGVzQWRkZWQiLCJ0b3RhbEJ5dGVzU25hcHNob3QiLCJ0ZW5zb3JzQWRkZWQiLCJ0b3RhbFRlbnNvcnNTbmFwc2hvdCIsImlucHV0U2hhcGVzIiwib3V0cHV0U2hhcGVzIiwiaXRlbSIsImtlcm5lbFRpbWVNcyIsInRpbWVNcyIsImV4dHJhSW5mbyIsImdyYWRDb25maWciLCJpbnB1dHNUb1NhdmUiLCJvdXRwdXRzVG9TYXZlIiwiaW5wdXRUZW5zb3JzVG9TYXZlIiwic2F2ZUFsbElucHV0cyIsImlucHV0TmFtZSIsIm91dHB1dFRlbnNvcnNUb1NhdmUiLCJtYWtlVGVuc29yIiwiYmFja2VuZFZhbHMiLCJ0cmFja1RlbnNvciIsImJ5dGVzIiwibWFrZVZhcmlhYmxlIiwidHJhaW5hYmxlIiwidHJhY2siLCJkaXNwb3NlVGVuc29yIiwiZGlzcG9zZVZhcmlhYmxlcyIsImRpc3Bvc2VWYXJpYWJsZSIsInN0YXJ0Qnl0ZXMiLCJzdGFydE51bVRlbnNvcnMiLCJncmFkaWVudHNGdW5jIiwidGFwZU5vZGUiLCJncmFkRnVuYyIsImdyYWRpZW50IiwiZHlzIiwiYWN0aXZlVGFwZSIsImtlcHQiLCJzdGFydFRhcGUiLCJlbmRUYXBlIiwic2NvcGVJbmZvIiwidGVuc29yc1RvVHJhY2tJblBhcmVudCIsInRlbnNvcnNUb1RyYWNrSW5QYXJlbnRTZXQiLCJvbGRTY29wZSIsInNjb3BlSWQiLCJ4cyIsImFsbG93Tm9HcmFkaWVudHMiLCJmaWx0ZXJlZFRhcGUiLCJhY2N1bXVsYXRlZEdyYWRpZW50TWFwIiwib25lcyIsImdyYWRzIiwiY3VzdG9tR3JhZCIsImlucHV0TWFwIiwic2F2ZSIsImdyYWRSZXMiLCJncmFkTWFwIiwiZ3JhZCIsInRpbWluZ0luZm8iLCJyZXNldCIsImdldE9yTWFrZUVuZ2luZSIsIl90ZmVuZ2luZSIsImVudmlyb25tZW50IiwiVEVOU09SRkxPV0pTX0ZMQUdTX1BSRUZJWCIsIkVudmlyb25tZW50IiwiZmxhZ3MiLCJmbGFnUmVnaXN0cnkiLCJ1cmxGbGFncyIsImdldFF1ZXJ5UGFyYW1zIiwicG9wdWxhdGVVUkxGbGFncyIsInNldFBsYXRmb3JtIiwicGxhdGZvcm1OYW1lIiwicGxhdGZvcm0iLCJmbGFnTmFtZSIsImV2YWx1YXRpb25GbiIsInNldEhvb2siLCJmbGFnVmFsdWUiLCJldmFsdWF0ZUZsYWciLCJnZXRGbGFncyIsInNldEZsYWdzIiwic2VhcmNoIiwidXJsUGFyYW1zIiwia2V5VmFsdWUiLCJ0b0xvd2VyQ2FzZSIsInBhcnNlVmFsdWUiLCJxdWVyeVN0cmluZyIsImRlY29kZVVSSUNvbXBvbmVudCIsImRlY29kZVBhcmFtIiwic2V0RW52aXJvbm1lbnRHbG9iYWwiLCJkZWJ1Z1ZhbHVlIiwiZ2xvYmFsTmFtZVNwYWNlIiwiZ2V0R2xvYmFsTmFtZXNwYWNlIiwiZ2V0R2xvYmFsIiwiZ2xvYmFsTWFwIiwiX3RmR2xvYmFscyIsIk1hcCIsImdldEdsb2JhbE1hcCIsInNpbmdsZXRvbiIsImVuYWJsZVByb2RNb2RlIiwiZW5hYmxlRGVidWdNb2RlIiwiZGlzYWJsZURlcHJlY2F0aW9uV2FybmluZ3MiLCJkZXByZWNhdGlvbldhcm4iLCJlbmdpbmUiLCJwcm9maWxlIiwiY29udGFpbmVyIiwiZ2V0QmFja2VuZCIsImNoZWNrR3JhZHMiLCIkYXJncyIsInZhbHVlQW5kR3JhZCIsInZhbHVlQW5kR3JhZHMiLCJ2YXJpYWJsZUdyYWRzIiwidmFyTGlzdCIsInNwZWNpZmllZFZhckxpc3QiLCJzcGVjaWZpZWROb25UcmFpbmFibGUiLCJvcmlnaW5hbFZhckNvdW50IiwiZyIsIm5hbWVkR3JhZHMiLCJMb25nIiwiaGV4VG9Mb25nIiwiaGV4IiwiZnJvbVN0cmluZyIsImsxIiwiazIiLCJzaGlmdE1peCIsInhvciIsInNocnUiLCJmcm9tQnl0ZXMiLCJmZXRjaDY0IiwiZmV0Y2gzMiIsInJvdGF0ZTY0Iiwib3IiLCJzaGwiLCJoYXNoTGVuMTYiLCJ3ZWFrSGFzaExlbjMyV2l0aFNlZWRzU3RyIiwid2Vha0hhc2hMZW4zMldpdGhTZWVkcyIsImZyb21OdW1iZXIiLCJoYXNoTGVuMHRvMTYiLCJoYXNoTGVuMTd0bzMyIiwiaGFzaExlbjMzdG82NCIsIlVaRVJPIiwibGFzdDY0IiwiYW5kIiwiZGVmZXIiLCJCcm93c2VyRG93bmxvYWRzIiwiZmlsZU5hbWVQcmVmaXgiLCJVUkxfU0NIRU1FIiwibW9kZWxKc29uRmlsZU5hbWUiLCJ3ZWlnaHREYXRhRmlsZU5hbWUiLCJtb2RlbEFydGlmYWN0cyIsIndlaWdodHNVUkwiLCJ3ZWlnaHREYXRhIiwibW9kZWxUb3BvbG9neSIsIkFycmF5QnVmZmVyIiwid2VpZ2h0c01hbmlmZXN0IiwicGF0aHMiLCJ3ZWlnaHRTcGVjcyIsIm1vZGVsSlNPTiIsIm1vZGVsSnNvblVSTCIsImpzb25BbmNob3IiLCJtb2RlbEpzb25BbmNob3IiLCJkb3dubG9hZCIsImRpc3BhdGNoRXZlbnQiLCJNb3VzZUV2ZW50Iiwid2VpZ2h0RGF0YUFuY2hvciIsIm1vZGVsQXJ0aWZhY3RzSW5mbyIsIkJyb3dzZXJGaWxlcyIsImZpbGVzIiwianNvbkZpbGUiLCJ3ZWlnaHRzRmlsZXMiLCJqc29uUmVhZGVyIiwiRmlsZVJlYWRlciIsIm1vZGVsQXJ0aWZhY3RzUHJvbWlzZSIsImxvYWRXZWlnaHRzIiwicmVhZEFzVGV4dCIsImVudHJ5IiwicGF0aFRvRmlsZSIsImNoZWNrTWFuaWZlc3RBbmRXZWlnaHRGaWxlcyIsInByb21pc2VzIiwibG9hZFdlaWdodHNGaWxlIiwid2VpZ2h0RmlsZVJlYWRlciIsInJlYWRBc0FycmF5QnVmZmVyIiwibWFuaWZlc3QiLCJiYXNlbmFtZXMiLCJmaWxlTmFtZXMiLCJncm91cCIsInBhdGhCYXNlbmFtZSIsImJyb3dzZXJEb3dubG9hZHNSb3V0ZXIiLCJicm93c2VyRG93bmxvYWRzIiwiYnJvd3NlckZpbGVzIiwicmVnaXN0ZXJTYXZlUm91dGVyIiwiSFRUUFJlcXVlc3QiLCJsb2FkT3B0aW9ucyIsIkRFRkFVTFRfTUVUSE9EIiwid2VpZ2h0UGF0aFByZWZpeCIsIm9uUHJvZ3Jlc3MiLCJ3ZWlnaHRVcmxDb252ZXJ0ZXIiLCJmZXRjaEZ1bmMiLCJyZXF1ZXN0SW5pdCIsIkZvcm1EYXRhIiwibW9kZWxUb3BvbG9neUFuZFdlaWdodE1hbmlmZXN0IiwiYXBwZW5kIiwib2siLCJyZXNwb25zZXMiLCJtb2RlbENvbmZpZ1JlcXVlc3QiLCJqc29uIiwid2VpZ2h0UGF0aCIsInN1ZmZpeCIsInBhcnNlVXJsIiwicGF0aFByZWZpeCIsImZldGNoVVJMcyIsInVybFByb21pc2VzIiwid2VpZ2h0c0dyb3VwIiwibGFzdFNsYXNoIiwibGFzdFNlYXJjaFBhcmFtIiwic3Vic3RyaW5nIiwiaXNIVFRQU2NoZW1lIiwibWF0Y2giLCJVUkxfU0NIRU1FX1JFR0VYIiwiaHR0cFJvdXRlciIsImlzSFRUUCIsInVybEl0ZW0iLCJodHRwIiwiYnJvd3NlckhUVFBSZXF1ZXN0IiwicmVnaXN0ZXJMb2FkUm91dGVyIiwiREFUQUJBU0VfTkFNRSIsIk1PREVMX1NUT1JFX05BTUUiLCJJTkZPX1NUT1JFX05BTUUiLCJkZWxldGVEYXRhYmFzZSIsImlkYkZhY3RvcnkiLCJnZXRJbmRleGVkREJGYWN0b3J5IiwiZGVsZXRlUmVxdWVzdCIsIm9uc3VjY2VzcyIsInRoZVdpbmRvdyIsImluZGV4ZWREQiIsIm1vekluZGV4ZWREQiIsIndlYmtpdEluZGV4ZWREQiIsIm1zSW5kZXhlZERCIiwic2hpbUluZGV4ZWREQiIsInNldFVwRGF0YWJhc2UiLCJvcGVuUmVxdWVzdCIsImRiIiwiY3JlYXRlT2JqZWN0U3RvcmUiLCJrZXlQYXRoIiwiQnJvd3NlckluZGV4ZWREQiIsIm1vZGVsUGF0aCIsImRhdGFiYXNlQWN0aW9uIiwib251cGdyYWRlbmVlZGVkIiwibW9kZWxUeCIsInRyYW5zYWN0aW9uIiwiZ2V0UmVxdWVzdCIsIm9iamVjdFN0b3JlIiwiY2xvc2UiLCJvbmNvbXBsZXRlIiwiaW5mb1R4IiwiaW5mb1N0b3JlIiwicHV0SW5mb1JlcXVlc3QiLCJwdXQiLCJwdXRNb2RlbFJlcXVlc3QiLCJkZWxldGVJbmZvUmVxdWVzdCIsImluZGV4ZWREQlJvdXRlciIsImJyb3dzZXJJbmRleGVkREIiLCJCcm93c2VySW5kZXhlZERCTWFuYWdlciIsInR4IiwiZ2V0QWxsSW5mb1JlcXVlc3QiLCJnZXRBbGwiLCJnZXRJbmZvUmVxdWVzdCIsImRlbGV0ZU1vZGVsRGF0YSIsImRlbGV0ZU1vZGVsUmVxdWVzdCIsImVuY29kZVdlaWdodHMiLCJzcGVjcyIsImRhdGFQcm9taXNlcyIsIm5hbWVzIiwic3BlYyIsInV0ZjhieXRlcyIsInRvdGFsTnVtQnl0ZXMiLCJieXRlc09mTGVuZ3RoIiwiY29uY2F0ZW5hdGVUeXBlZEFycmF5cyIsImRlY29kZVdlaWdodHMiLCJmbG9hdDE2RGVjb2RlIiwicXVhbnRpemF0aW9uIiwicXVhbnRpemF0aW9uU2l6ZUZhY3RvciIsImJ5dGVCdWZmZXIiLCJxdWFudGl6ZWRBcnJheSIsImdldEZsb2F0MTZEZWNvZGVyIiwiZHR5cGVGYWN0b3IiLCJyZWFsVGVuc29yIiwiaW1hZ2VUZW5zb3IiLCJ0b3RhbEJ5dGVMZW5ndGgiLCJub3JtYWxpemVkWHMiLCJ1c2VOb2RlQnVmZmVyIiwiQnVmZmVyIiwiYXRvYiIsImJ0b2EiLCJzdHJpbmdCeXRlTGVuZ3RoIiwiYXJyYXlCdWZmZXJUb0Jhc2U2NFN0cmluZyIsImJhc2U2NFN0cmluZ1RvQXJyYXlCdWZmZXIiLCJjb25jYXRlbmF0ZUFycmF5QnVmZmVycyIsInRlbXAiLCJiYXNlbmFtZSIsInRyaW0iLCJpdGVtcyIsImdldE1vZGVsSlNPTkZvck1vZGVsQXJ0aWZhY3RzIiwiYXJ0aWZhY3RzIiwiZm9ybWF0IiwiZ2VuZXJhdGVkQnkiLCJjb252ZXJ0ZWRCeSIsInNpZ25hdHVyZSIsInVzZXJEZWZpbmVkTWV0YWRhdGEiLCJtb2RlbEluaXRpYWxpemVyIiwidHJhaW5pbmdDb25maWciLCJnZXRNb2RlbEFydGlmYWN0c0ZvckpTT04iLCJnZXRNb2RlbEFydGlmYWN0c0luZm9Gb3JKU09OIiwiZGF0ZVNhdmVkIiwiRGF0ZSIsIm1vZGVsVG9wb2xvZ3lUeXBlIiwibW9kZWxUb3BvbG9neUJ5dGVzIiwid2VpZ2h0U3BlY3NCeXRlcyIsIndlaWdodERhdGFCeXRlcyIsIm1hbnRpc2FUYWJsZSIsImNvbnZlcnRNYW50aXNzYSIsImNvbXB1dGVGbG9hdDE2TWFudGlzYVRhYmxlIiwiZXhwb25lbnRUYWJsZSIsImNvbXB1dGVGbG9hdDE2RXhwb25lbnRUYWJsZSIsIm9mZnNldFRhYmxlIiwiY29tcHV0ZUZsb2F0MTZPZmZzZXRUYWJsZSIsImJ1ZmZlclVpbnQzMlZpZXciLCJmbG9hdDE2Qml0cyIsImZsb2F0MzJCaXRzIiwiUEFUSF9TRVBBUkFUT1IiLCJQQVRIX1BSRUZJWCIsIklORk9fU1VGRklYIiwiTU9ERUxfVE9QT0xPR1lfU1VGRklYIiwiV0VJR0hUX1NQRUNTX1NVRkZJWCIsIldFSUdIVF9EQVRBX1NVRkZJWCIsIk1PREVMX01FVEFEQVRBX1NVRkZJWCIsInB1cmdlTG9jYWxTdG9yYWdlQXJ0aWZhY3RzIiwibG9jYWxTdG9yYWdlIiwiTFMiLCJwdXJnZWRNb2RlbFBhdGhzIiwicmVtb3ZlSXRlbSIsIm1vZGVsTmFtZSIsImdldE1vZGVsUGF0aEZyb21LZXkiLCJnZXRNb2RlbEtleXMiLCJ0b3BvbG9neSIsIm1vZGVsTWV0YWRhdGEiLCJyZW1vdmVJdGVtcyIsIkJyb3dzZXJMb2NhbFN0b3JhZ2UiLCJzZXRJdGVtIiwibWV0YWRhdGEiLCJnZXRJdGVtIiwibWV0YWRhdGFTdHJpbmciLCJ3ZWlnaHREYXRhQmFzZTY0IiwibG9jYWxTdG9yYWdlUm91dGVyIiwiYnJvd3NlckxvY2FsU3RvcmFnZSIsIkJyb3dzZXJMb2NhbFN0b3JhZ2VNYW5hZ2VyIiwiVVJMX1NDSEVNRV9TVUZGSVgiLCJNb2RlbFN0b3JlTWFuYWdlclJlZ2lzdHJ5IiwibWFuYWdlcnMiLCJzY2hlbWUiLCJtYW5hZ2VyIiwiZ2V0SW5zdGFuY2UiLCJwYXJzZVVSTCIsImdldFNjaGVtZXMiLCJjbG9uZU1vZGVsSW50ZXJuYWwiLCJzb3VyY2VVUkwiLCJkZXN0VVJMIiwiZGVsZXRlU291cmNlIiwibG9hZEhhbmRsZXJzIiwiZ2V0TG9hZEhhbmRsZXJzIiwibG9hZEhhbmRsZXIiLCJzYXZlSGFuZGxlcnMiLCJnZXRTYXZlSGFuZGxlcnMiLCJzYXZlSGFuZGxlciIsInNvdXJjZVNjaGVtZSIsInNvdXJjZVBhdGgiLCJzYW1lTWVkaXVtIiwiZ2V0TWFuYWdlciIsInJlbW92ZU1vZGVsIiwic2F2ZVJlc3VsdCIsImxpc3RNb2RlbHMiLCJzY2hlbWVzIiwic2NoZW1lT3V0Iiwic2NoZW1lQW5kUGF0aCIsImNvcHlNb2RlbCIsIm1vdmVNb2RlbCIsIlBhc3N0aHJvdWdoTG9hZGVyIiwiUGFzc3Rocm91Z2hTYXZlciIsImZyb21NZW1vcnkiLCJ3aXRoU2F2ZUhhbmRsZXIiLCJtb25pdG9yUHJvbWlzZXNQcm9ncmVzcyIsInN0YXJ0RnJhY3Rpb24iLCJlbmRGcmFjdGlvbiIsImNoZWNrUHJvbWlzZXMiLCJjaGVja0ZyYWN0aW9uIiwicmVzb2x2ZWRQcm9taXNlIiwicHJvbWlzZSIsImZyYWN0aW9uIiwiSU9Sb3V0ZXJSZWdpc3RyeSIsInNhdmVSb3V0ZXJzIiwibG9hZFJvdXRlcnMiLCJzYXZlUm91dGVyIiwibG9hZFJvdXRlciIsImdldEhhbmRsZXJzIiwiaGFuZGxlclR5cGUiLCJ2YWxpZEhhbmRsZXJzIiwicm91dGVyIiwiaGFuZGxlciIsImxvdWRSb3V0ZXIiLCJEVFlQRV9WQUxVRV9TSVpFX01BUCIsImxvYWRXZWlnaHRzQXNBcnJheUJ1ZmZlciIsInJlcXVlc3RzIiwiZmV0Y2hVUkwiLCJpc0JpbmFyeSIsImJ1ZmZlclByb21pc2VzIiwiZmlsZVBhdGhQcmVmaXgiLCJ3ZWlnaHROYW1lcyIsIndlaWdodHNMb2FkZXJGYWN0b3J5IiwiZmV0Y2hVcmxzIiwiZmV0Y2hXZWlnaHRzRnVuY3Rpb24iLCJncm91cEluZGljZXNUb0ZldGNoTWFwIiwiZ3JvdXBXZWlnaHRzVG9GZXRjaCIsIndlaWdodHNGb3VuZCIsImFsbE1hbmlmZXN0V2VpZ2h0TmFtZXMiLCJtYW5pZmVzdEdyb3VwQ29uZmlnIiwiZ3JvdXBJbmRleCIsImdyb3VwT2Zmc2V0Iiwid2VpZ2h0c0VudHJ5IiwicmF3RHR5cGUiLCJ3ZWlnaHRzQnl0ZXMiLCJlbnF1ZXVlV2VpZ2h0c0ZvckZldGNoaW5nRm4iLCJtYW5pZmVzdEVudHJ5Iiwic2l6ZUJ5dGVzIiwid2VpZ2h0TmFtZSIsIndlaWdodEluZGV4Iiwid2VpZ2h0c05vdEZvdW5kIiwiZ3JvdXBJbmRpY2VzVG9GZXRjaCIsImFjY3VtdWxhdG9yIiwic2hvdWxkRmV0Y2giLCJmaWxlcGF0aCIsImZldGNoVXJsIiwid2VpZ2h0c1RlbnNvck1hcCIsImJ1ZmZlckluZGV4T2Zmc2V0IiwibnVtQnVmZmVycyIsImdyb3VwQnl0ZXMiLCJncm91cEJ1ZmZlciIsImdyb3VwQnl0ZUJ1ZmZlciIsImdyb3VwQnVmZmVyT2Zmc2V0IiwibmFtZVRvVGVuc29yTWFwIiwiQWJzIiwiQWNvcyIsIkFjb3NoIiwiQWRkIiwiQWRkTiIsIkFsbCIsIkFueSIsIkFyZ01heCIsIkFyZ01pbiIsIkFzaW4iLCJBc2luaCIsIkF0YW4iLCJBdGFuaCIsIkF0YW4yIiwiQXZnUG9vbCIsIkF2Z1Bvb2xHcmFkIiwiQXZnUG9vbDNEIiwiQXZnUG9vbDNER3JhZCIsIkJhdGNoTWF0TXVsIiwiQmF0Y2hUb1NwYWNlTkQiLCJCaW5jb3VudCIsIkJyb2FkY2FzdFRvIiwiQ2FzdCIsIkNlaWwiLCJDbGlwQnlWYWx1ZSIsIkNvbXBsZXgiLCJDb21wbGV4QWJzIiwiQ29uY2F0IiwiQ29udjJEIiwiQ29udjJEQmFja3Byb3BGaWx0ZXIiLCJDb252MkRCYWNrcHJvcElucHV0IiwiQ29udjNEIiwiQ29udjNEQmFja3Byb3BGaWx0ZXJWMiIsIkNvbnYzREJhY2twcm9wSW5wdXRWMiIsIkNvcyIsIkNvc2giLCJDdW1zdW0iLCJDcm9wQW5kUmVzaXplIiwiRGVuc2VCaW5jb3VudCIsIkRlcHRoVG9TcGFjZSIsIkRlcHRod2lzZUNvbnYyZE5hdGl2ZSIsIkRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyIiwiRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCIsIkRpYWciLCJEaWxhdGlvbjJEIiwiRGlsYXRpb24yREJhY2twcm9wSW5wdXQiLCJEaWxhdGlvbjJEQmFja3Byb3BGaWx0ZXIiLCJSZWFsRGl2IiwiRWluc3VtIiwiRWx1IiwiRWx1R3JhZCIsIkVyZiIsIkVxdWFsIiwiRXhwIiwiRXhwYW5kRGltcyIsIkV4cG0xIiwiRkZUIiwiRmlsbCIsIkZsaXBMZWZ0UmlnaHQiLCJGbG9vciIsIkZsb29yRGl2IiwiRnVzZWRCYXRjaE5vcm0iLCJHYXRoZXJWMiIsIkdhdGhlck5kIiwiR3JlYXRlciIsIkdyZWF0ZXJFcXVhbCIsIklkZW50aXR5IiwiSUZGVCIsIkltYWciLCJJc0Zpbml0ZSIsIklzSW5mIiwiSXNOYW4iLCJMZWFreVJlbHUiLCJMZXNzIiwiTGVzc0VxdWFsIiwiTGluU3BhY2UiLCJMb2ciLCJMb2cxcCIsIkxvZ2ljYWxBbmQiLCJMb2dpY2FsTm90IiwiTG9naWNhbE9yIiwiTG9nU29mdG1heCIsIkxSTiIsIkxSTkdyYWQiLCJNYXgiLCJNYXhpbXVtIiwiTWF4UG9vbCIsIk1heFBvb2xHcmFkIiwiTWF4UG9vbDNEIiwiTWF4UG9vbDNER3JhZCIsIk1heFBvb2xXaXRoQXJnbWF4IiwiTWVhbiIsIk1pbiIsIk1pbmltdW0iLCJNaXJyb3JQYWQiLCJNb2QiLCJNdWx0aW5vbWlhbCIsIk11bHRpcGx5IiwiTmVnIiwiTm90RXF1YWwiLCJOb25NYXhTdXBwcmVzc2lvblYzIiwiTm9uTWF4U3VwcHJlc3Npb25WNCIsIk5vbk1heFN1cHByZXNzaW9uVjUiLCJPbmVzTGlrZSIsIk9uZUhvdCIsIlBhY2siLCJQYWRWMiIsIlBvb2wiLCJQb3ciLCJQcmVsdSIsIlByb2QiLCJSYW5nZSIsIlJlYWwiLCJSZWNpcHJvY2FsIiwiUmVsdSIsIlJlc2hhcGUiLCJSZXNpemVOZWFyZXN0TmVpZ2hib3IiLCJSZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkIiwiUmVzaXplQmlsaW5lYXIiLCJSZXNpemVCaWxpbmVhckdyYWQiLCJSZWx1NiIsIlJldmVyc2UiLCJSb3VuZCIsIlJzcXJ0IiwiU2NhdHRlck5kIiwiU2VsZWN0IiwiU2VsdSIsIlNsaWNlIiwiU2luIiwiU2luaCIsIlNpZ24iLCJTaWdtb2lkIiwiU29mdHBsdXMiLCJTcXJ0IiwiU3VtIiwiU3BhY2VUb0JhdGNoTkQiLCJTcGxpdFYiLCJTb2Z0bWF4IiwiU3BhcnNlRmlsbEVtcHR5Um93cyIsIlNwYXJzZVJlc2hhcGUiLCJTcGFyc2VTZWdtZW50TWVhbiIsIlNwYXJzZVNlZ21lbnRTdW0iLCJTcGFyc2VUb0RlbnNlIiwiU3F1YXJlZERpZmZlcmVuY2UiLCJTcXVhcmUiLCJTdHJpZGVkU2xpY2UiLCJTdHJpbmdOR3JhbXMiLCJTdHJpbmdTcGxpdCIsIlN0cmluZ1RvSGFzaEJ1Y2tldEZhc3QiLCJTdWIiLCJUYW4iLCJUYW5oIiwiVGlsZSIsIlRvcEsiLCJUcmFuc2Zvcm0iLCJUcmFuc3Bvc2UiLCJVbmlxdWUiLCJVbnBhY2siLCJVbnNvcnRlZFNlZ21lbnRTdW0iLCJaZXJvc0xpa2UiLCJTdGVwIiwiRnJvbVBpeGVscyIsIlJvdGF0ZVdpdGhPZmZzZXQiLCJfRnVzZWRNYXRNdWwiLCJGdXNlZENvbnYyRCIsIkZ1c2VkRGVwdGh3aXNlQ29udjJEIiwia2VybmVsUmVnaXN0cnkiLCJncmFkUmVnaXN0cnkiLCJnZXRLZXJuZWwiLCJtYWtlS2V5IiwiZ2V0R3JhZGllbnQiLCJnZXRLZXJuZWxzRm9yQmFja2VuZCIsIml0IiwiZW50cmllcyIsImRvbmUiLCJuZXh0IiwiY29uZmlnIiwicmVnaXN0ZXJLZXJuZWwiLCJyZWdpc3RlckdyYWRpZW50IiwidW5yZWdpc3Rlcktlcm5lbCIsInVucmVnaXN0ZXJHcmFkaWVudCIsImNvcHlSZWdpc3RlcmVkS2VybmVscyIsInJlZ2lzdGVyZWRCYWNrZW5kTmFtZSIsIm5ld0JhY2tlbmROYW1lIiwiYWJzXyIsImFjb3NfIiwiYWNvc2hfIiwiYWRkXyIsIiRhIiwiJGIiLCJhZGROXyIsIiR0ZW5zb3JzIiwiZmlyc3RUZW5zb3IiLCJhbGxfIiwiYW55XyIsImFyZ01heF8iLCJhcmdNaW5fIiwiYmF0Y2hUb1NwYWNlIiwic3BhdGlhbExlbmd0aCIsInJlc2hhcGVkUmFuayIsImJsb2NrU2hhcGVSYW5rIiwicGVybXV0ZWRCZWZvcmVCYXRjaCIsInBlcm11dGVkQWZ0ZXJCYXRjaCIsInVuY3JvcHBlZFNoYXBlIiwiYXNpbl8iLCJhc2luaF8iLCJhdGFuXyIsImF0YW4yXyIsImF0YW5oXyIsImF2Z1Bvb2xfIiwieDREIiwicmVzaGFwZWRUbzREIiwiYXZnUG9vbDNkIiwiYXZnUG9vbDNkXyIsIng1RCIsInJlc2hhcGVkVG81RCIsImF4ZXNBcmVJbm5lck1vc3REaW1zIiwiY29tYmluZUxvY2F0aW9ucyIsIm91dHB1dExvYyIsInJlZHVjZUxvYyIsInJlZHVjZUlkeCIsIm51bUF4ZXMiLCJiYXNpY0xTVE1DZWxsIiwiYmFzaWNMU1RNQ2VsbF8iLCJmb3JnZXRCaWFzIiwibHN0bUtlcm5lbCIsImxzdG1CaWFzIiwiJGZvcmdldEJpYXMiLCIkbHN0bUtlcm5lbCIsIiRsc3RtQmlhcyIsIiRjIiwiJGgiLCJjb21iaW5lZCIsIndlaWdodGVkIiwic2xpY2VDb2xzIiwibmV3QyIsImJhdGNoVG9TcGFjZU5EXyIsImJhdGNoTm9ybV8iLCIkbWVhbiIsIiR2YXJpYW5jZSIsIiRzY2FsZSIsIiRvZmZzZXQiLCJiYXRjaE5vcm0yZCIsImJhdGNoTm9ybTJkXyIsImJhdGNoTm9ybTNkIiwiYmF0Y2hOb3JtM2RfIiwiYmF0Y2hOb3JtNGQiLCJiYXRjaE5vcm00ZF8iLCJ4QXM0RCIsImJpbmNvdW50XyIsIiR3ZWlnaHRzIiwiYm9vbGVhbk1hc2tBc3luYyIsIiR0ZW5zb3IiLCIkbWFzayIsImF4aXNGcm9tIiwibWFza0RpbSIsInRlbnNvclNoYXBlIiwibGVhZGluZ1NpemUiLCJ0YXJnZXRUZW5zb3JTaGFwZSIsInJlc2hhcGVkVGVuc29yIiwicmVzaGFwZWRNYXNrIiwicG9zaXRpdmVQb3NpdGlvbnMiLCJicm9hZGNhc3RUbyIsImJyb2FkY2FzdFRvXyIsImdldFJlZHVjdGlvbkF4ZXMiLCJpbkRpbSIsIm91dEF4aXMiLCJvdXREaW0iLCJmcm9tUGl4ZWxzXyIsImlzUGl4ZWxEYXRhIiwiaXNJbWFnZURhdGEiLCJpc0NhbnZhc0xpa2UiLCJpc0ltYWdlQml0bWFwIiwiSW1hZ2VEYXRhIiwiSW1hZ2VCaXRtYXAiLCJIQVZFX0NVUlJFTlRfREFUQV9SRUFEWV9TVEFURSIsInJlYWR5U3RhdGUiLCJnZXRJbWFnZURhdGEiLCJudW1QaXhlbHMiLCJjYW5XcmFwUGl4ZWxzVG9JbWFnZUJpdG1hcCIsImlzTm9uRW1wdHlQaXhlbHMiLCJmcm9tUGl4ZWxzQXN5bmMiLCJpbWFnZUJpdG1hcCIsImNyZWF0ZUltYWdlQml0bWFwIiwicHJlbXVsdGlwbHlBbHBoYSIsInRvUGl4ZWxzIiwiaW1nIiwiJGltZyIsIm9yaWdpbmFsSW1nVGVuc29yIiwibXVsdGlwbGllciIsIlVpbnQ4Q2xhbXBlZEFycmF5IiwicmdiYSIsImltYWdlRGF0YSIsInB1dEltYWdlRGF0YSIsImZyb21QaXhlbHMiLCJjYXN0XyIsImNlaWxfIiwiY2xpcEJ5VmFsdWVfIiwiY2xvbmVfIiwiY29tcGxleF8iLCJjb25jYXRfIiwiY29uY2F0MWQiLCJjb25jYXQxZF8iLCJjb25jYXQyZCIsImNvbmNhdDJkXyIsImNvbmNhdDNkIiwiY29uY2F0M2RfIiwiY29uY2F0NGQiLCJjb25jYXQ0ZF8iLCJmaXJzdFNoYXBlIiwiY29uZnVzaW9uTWF0cml4XyIsImxhYmVscyIsInByZWRpY3Rpb25zIiwibnVtQ2xhc3NlcyIsIiRsYWJlbHMiLCIkcHJlZGljdGlvbnMiLCJpc0ludGVnZXIiLCJvbmVIb3RMYWJlbHMiLCJvbmVIb3RQcmVkaWN0aW9ucyIsIm9uZUhvdExhYmVsc1QiLCJjb25mdXNpb25NYXRyaXgiLCJjb252MWQiLCJjb252MWRfIiwiZGlsYXRpb24iLCJ4M0QiLCJyZXNoYXBlZFRvM0QiLCJmaWx0ZXI0RCIsImlucHV0NEQiLCJjb252MmRfIiwiY29udjJEQmFja3Byb3BGaWx0ZXJfIiwiZHk0RCIsImNvbnYyREJhY2twcm9wSW5wdXRfIiwieFNoYXBlNEQiLCJjb252MmRUcmFuc3Bvc2UiLCJjb252MmRUcmFuc3Bvc2VfIiwiY29udjNkIiwiY29udjNkXyIsImNvbnYzREJhY2twcm9wSW5wdXRfIiwieFNoYXBlNUQiLCJkeTVEIiwiY29udjNkVHJhbnNwb3NlIiwiY29udjNkVHJhbnNwb3NlXyIsInJvdW5kaW5nTW9kZSIsInBhcnNlVHVwbGVQYXJhbSIsInBhcnNlM1R1cGxlUGFyYW0iLCJkZXB0aHdpc2UiLCJmaWx0ZXJDaGFubmVscyIsImdldEVmZmVjdGl2ZUZpbHRlclNpemUiLCJmaWVsZFNpemUiLCJ6ZXJvUGFkIiwiY29tcHV0ZURlZmF1bHRQYWQiLCJpbnB1dFJvd3MiLCJpbnB1dENvbHMiLCJvdXRwdXRDb2xzIiwiY29tcHV0ZU91dHB1dFNoYXBlMkQiLCJwYWRBbG9uZ0hlaWdodCIsInBhZEFsb25nV2lkdGgiLCJnZXRQYWRBbmRPdXRJbmZvIiwiYmFjayIsIm91dHB1dERlcHRocyIsImNvbXB1dGVPdXRwdXRTaGFwZTREIiwicGFkQWxvbmdEZXB0aCIsImdldDNEUGFkQW5kT3V0SW5mbyIsImVmZmVjdGl2ZUZpZWxkU2l6ZSIsInBhcmFtIiwidHVwbGVWYWx1ZXNBcmVPbmUiLCJkaW1BIiwiZGltQiIsImRpbUMiLCJjb3NfIiwiY29zaF8iLCJjdW1zdW1fIiwiZGVuc2VCaW5jb3VudF8iLCJkZXB0aFRvU3BhY2VfIiwiZGVwdGh3aXNlQ29udjJkIiwiZGVwdGh3aXNlQ29udjJkXyIsImRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyXyIsImRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXRfIiwiZGlhZ18iLCJkaWxhdGlvbjJkIiwiZGlsYXRpb24yZF8iLCJkaXZfIiwiZGl2Tm9OYW4iLCJkaXZOb05hbl8iLCJkaXZSZXN1bHQiLCJiRXF1YWxzWmVybyIsImRvdCIsImRvdF8iLCJ0MSIsInQyIiwiJHQxIiwiJHQyIiwidDFJbm5lciIsInQySW5uZXIiLCJ0MTJEIiwidDIyRCIsInQxdDIiLCJkcm9wb3V0IiwiZHJvcG91dF8iLCJyYXRlIiwibm9pc2VTaGFwZSIsIiRub2lzZVNoYXBlIiwia2VlcFByb2IiLCJnZXROb2lzZVNoYXBlIiwibmV3RGltZW5zaW9uIiwiZWluc3VtXyIsImVsdV8iLCJlcXVhbF8iLCJlcmZfIiwiZXhwXyIsImV4cGFuZERpbXNfIiwiZXhwbTFfIiwiZXllIiwiZXllXyIsImJhdGNoU2hhcGUiLCJidWZmIiwiZmxvb3JfIiwiZmxvb3JEaXZfIiwiZnVzZWRDb252MmRfIiwiJGJpYXMiLCIkcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyIsImR5QWN0aXZhdGlvbiIsImRlciIsImJpYXNEZXIiLCJjdXN0b21PcCIsImN1c3RvbU9wV2l0aEJpYXMiLCJmdXNlZERlcHRod2lzZUNvbnYyZF8iLCJ4RGVyIiwiZmlsdGVyRGVyIiwibWF0TXVsIiwiZnVzZWRNYXRNdWxfIiwiYTNEIiwiYjNEIiwiYURlciIsImJEZXIiLCJnZXRGdXNlZER5QWN0aXZhdGlvbiIsImdldEZ1c2VkQmlhc0dyYWRpZW50IiwicmVkdWNlQXhlcyIsInNob3VsZEZ1c2UiLCJnYXRoZXIiLCJnYXRoZXJfIiwiZ2F0aGVyTkQiLCJnYXRoZXJORF8iLCJ0ZW5zb3JSYW5rIiwiblJlc3VsdCIsImdyZWF0ZXJfIiwiZ3JlYXRlckVxdWFsXyIsImltYWdfIiwiY3JvcEFuZFJlc2l6ZV8iLCIkaW1hZ2UiLCIkYm94ZXMiLCIkYm94SW5kIiwiZmxpcExlZnRSaWdodF8iLCJub25NYXhTdXBwcmVzc2lvbiIsIm5vbk1heFN1cHByZXNzaW9uXyIsIiRzY29yZXMiLCJub25NYXhTdXBwcmVzc2lvbkFzeW5jIiwiYm94ZXNBbmRTY29yZXMiLCJub25NYXhTdXBwcmVzc2lvblBhZGRlZCIsIm5vbk1heFN1cHByZXNzaW9uUGFkZGVkXyIsIm5vbk1heFN1cHByZXNzaW9uUGFkZGVkQXN5bmMiLCIkbWF4T3V0cHV0U2l6ZSIsIiRpb3VUaHJlc2hvbGQiLCIkc2NvcmVUaHJlc2hvbGQiLCJub25NYXhTdXBwcmVzc2lvbldpdGhTY29yZSIsIm5vbk1heFN1cHByZXNzaW9uV2l0aFNjb3JlXyIsIm5vbk1heFN1cHByZXNzaW9uV2l0aFNjb3JlQXN5bmMiLCJyZXNpemVCaWxpbmVhcl8iLCIkaW1hZ2VzIiwiYmF0Y2hJbWFnZXMiLCJyZXNpemVOZWFyZXN0TmVpZ2hib3JfIiwicm90YXRlV2l0aE9mZnNldF8iLCJ0aHJlc2hvbGRfIiwiaW52ZXJ0ZWQiLCJ0aHJlc2hWYWx1ZSIsInRvdGFsUGl4ZWxzSW5JbWFnZSIsImdyYXlzY2FsZSIsIiR0aHJlc2hvbGQiLCIkciIsIiRnIiwiaGlzdG9ncmFtIiwiY2xhc3NGaXJzdCIsImNsYXNzU2Vjb25kIiwibWVhbkZpcnN0IiwibWVhblNlYyIsIndlaWdodEZvcmVncm91bmQiLCJ3ZWlnaHRCYWNrIiwiYmVzdFRocmVzaCIsImJlc3RJbkJldFZhciIsImNJbkJldFZhciIsIm1lYW5GaXJzdERpdkEiLCJtZWFuU2VjRmlsbCIsIm1lYW5TZWNBZGQiLCJtZWFuU2VjTXVsIiwiY0luQmV0VmFyU3ViQSIsImNJbkJldFZhclN1YkIiLCJjSW5CZXRWYXJNdWwiLCJvdHN1IiwiaW52Q29uZGl0aW9uIiwidHJhbnNmb3JtXyIsIiR0cmFuc2Zvcm1zIiwiaW5Ub3BLQXN5bmMiLCJ0YXJnZXRzIiwiJHRhcmdldHMiLCJwcmVkaWN0aW9uc1ZhbHMiLCJ0YXJnZXRzVmFscyIsInByZWNpc2lvbiIsImlzRmluaXRlXyIsImlzSW5mXyIsImlzTmFOXyIsImxlYWt5UmVsdV8iLCJsZXNzXyIsImxlc3NFcXVhbF8iLCJiYW5kUGFydCIsImJhbmRQYXJ0XyIsIm51bUxvd2VyIiwibnVtVXBwZXIiLCJNIiwiTiIsImlqIiwiaW5CYW5kIiwibWF0IiwiZ3JhbVNjaG1pZHQiLCJncmFtU2NobWlkdF8iLCJpbnB1dElzVGVuc29yMkQiLCJ5cyIsInhzMWQiLCJwcm9qIiwicXIyZCIsImZ1bGxNYXRyaWNlcyIsIm9uZTJEIiwiaXRlcnMiLCJyVGVtcCIsIndUZW1wIiwicVRlbXAiLCJyakVuZDEiLCJub3JtWCIsInJqaiIsIndQcmUiLCJ0YXUiLCJyakVuZEFsbCIsInRhdVRpbWVzVyIsIndUIiwiclRpbWVzVGF1IiwidGF3VGltZXNXVCIsInFBbGxKRW5kIiwicVRpbWVzVGF1IiwicXIiLCJxcl8iLCJvdXRlckRpbXNQcm9kIiwicHJldiIsIngyZHMiLCJxMmRzIiwicjJkcyIsIngyZCIsInEyZCIsInIyZCIsImxpbnNwYWNlIiwibG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb24iLCJsb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbl8iLCJsb2dfIiwibG9nMXBfIiwibG9nU2lnbW9pZCIsImxvZ1NpZ21vaWRfIiwibG9nU29mdG1heCIsImxvZ1NvZnRtYXhfIiwiJGxvZ2l0cyIsInhNYXgiLCJzaGlmdGVkIiwibG9nU3VtRXhwIiwibG9nU3VtRXhwXyIsImxvZ2ljYWxBbmRfIiwibG9naWNhbE5vdF8iLCJsb2dpY2FsT3JfIiwibG9naWNhbFhvciIsImxvZ2ljYWxYb3JfIiwiUmVkdWN0aW9uIiwiYWJzb2x1dGVEaWZmZXJlbmNlIiwiYWJzb2x1dGVEaWZmZXJlbmNlXyIsInJlZHVjdGlvbiIsIlNVTV9CWV9OT05aRVJPX1dFSUdIVFMiLCJsb3NzZXMiLCJjb21wdXRlV2VpZ2h0ZWRMb3NzIiwiY29tcHV0ZVdlaWdodGVkTG9zc18iLCIkbG9zc2VzIiwid2VpZ2h0ZWRMb3NzIiwiTk9ORSIsIlNVTSIsIk1FQU4iLCJicm9hZGNhc3RGYWN0b3IiLCJicm9hZGNhc3RlZFdlaWdodHMiLCJudW1Ob25aZXJvcyIsImNvc2luZURpc3RhbmNlIiwiY29zaW5lRGlzdGFuY2VfIiwib25lIiwiaGluZ2VMb3NzIiwiaGluZ2VMb3NzXyIsImh1YmVyTG9zcyIsImh1YmVyTG9zc18iLCJkZWx0YSIsImRlbHRhU2NhbGFyIiwicXVhZHJhdGljIiwibGluZWFyIiwibG9nTG9zcyIsImxvZ0xvc3NfIiwiZXBzaWxvblNjYWxhciIsImwxIiwibDIiLCJtZWFuU3F1YXJlZEVycm9yIiwibWVhblNxdWFyZWRFcnJvcl8iLCJzaWdtb2lkQ3Jvc3NFbnRyb3B5Iiwic2lnbW9pZENyb3NzRW50cm9weV8iLCJtdWx0aUNsYXNzTGFiZWxzIiwibGFiZWxTbW9vdGhpbmciLCIkbXVsdGlDbGFzc0xhYmVscyIsImxhYmVsU21vb3RoaW5nU2NhbGFyIiwibWF4T3V0cHV0Iiwib3V0cHV0WFRhcmdldCIsInNpZ21vaWRPdXRwdXQiLCJzaWdtb2lkQ3Jvc3NFbnRyb3B5V2l0aExvZ2l0c18iLCJzb2Z0bWF4Q3Jvc3NFbnRyb3B5Iiwic29mdG1heENyb3NzRW50cm9weV8iLCJvbmVob3RMYWJlbHMiLCIkb25laG90TGFiZWxzIiwibHNlIiwibG9nUmVzdWx0IiwiY29zdFZlY3RvciIsInNvZnRtYXhDcm9zc0VudHJvcHlXaXRoTG9naXRzXyIsIm1hdE11bF8iLCJtYXhfIiwibWF4UG9vbF8iLCJtYXhQb29sM2RfIiwibWF4UG9vbFdpdGhBcmdtYXgiLCJtYXhQb29sV2l0aEFyZ21heF8iLCJtYXhpbXVtXyIsIm1lYW5fIiwibWVzaGdyaWQiLCJpbmRleGluZyIsIlR5cGVFcnJvciIsIiR5IiwibWluXyIsIm1pbmltdW1fIiwibWlycm9yUGFkXyIsInNoYXBlT2Zmc2V0IiwibW9kXyIsIm1vbWVudHMiLCJtb21lbnRzXyIsInhNZWFuIiwia2VlcERpbXNTaGFwZSIsImRldlNxdWFyZWQiLCJtb3ZpbmdBdmVyYWdlIiwibW92aW5nQXZlcmFnZV8iLCJkZWNheSIsInplcm9EZWJpYXMiLCIkdiIsIiRkZWNheSIsIm9uZU1pbnVzRGVjYXkiLCJ1cGRhdGUiLCIkc3RlcCIsIm11bF8iLCJtdWx0aVJOTkNlbGwiLCJtdWx0aVJOTkNlbGxfIiwibHN0bUNlbGxzIiwibmV3U3RhdGVzIiwibmV3SCIsIm11bHRpbm9taWFsXyIsIm9yaWdSYW5rIiwibmVnXyIsIm5vbk1heFN1cHBTYW5pdHlDaGVjayIsIm5vcm1JbXBsIiwibm9ybV8iLCJvcmQiLCJub3RFcXVhbF8iLCJvbmVIb3RfIiwib25lc0xpa2VfIiwiT1BfU0NPUEVfU1VGRklYIiwiZjIiLCJjb25maWd1cmFibGUiLCJzcGVjdHJhbCIsInJmZnQiLCJpcmZmdCIsInNpZ25hbCIsImhhbW1pbmdXaW5kb3ciLCJoYW5uV2luZG93IiwiZnJhbWUiLCJzdGZ0IiwibGluYWxnIiwic3BhcnNlIiwib3V0ZXJQcm9kdWN0Iiwib3V0ZXJQcm9kdWN0XyIsInYxIiwidjIiLCIkdjEiLCIkdjIiLCJ2MTJEIiwidjIyRCIsInBhZF8iLCJwYWQxZCIsInBhZDFkXyIsInBhZDJkIiwicGFkMmRfIiwicGFkM2QiLCJwYWQzZF8iLCJwYWQ0ZCIsInBhZDRkXyIsInBvb2xfIiwid2luZG93U2hhcGUiLCJwb29saW5nVHlwZSIsImJhc2VQYWRkaW5nIiwicGFkRXh0cmFTaGFwZSIsInBhZEV4dHJhU3RhcnQiLCJwYWRFeHRyYUVuZCIsIndpdGhTcGFjZVRvQmF0Y2hCYXNlUGFkZGluZ3MiLCJpc0RpbGF0aW9uT25lIiwiYWRqdXN0ZWRQYWRkaW5nIiwiYWRqdXN0ZWRDcm9wcyIsInBhZFN0YXJ0Iiwib3JpZ1BhZEVuZCIsImZ1bGxJbnB1dFNoYXBlIiwicGFkRW5kRXh0cmEiLCJwYWRFbmQiLCJyZXF1aXJlZFNwYWNlVG9CYXRjaFBhZGRpbmdzIiwiY29udmVydGVkUGFkIiwiY29udmVydGVkWCIsInBvd18iLCIkYmFzZSIsIiRleHAiLCJwcmVsdV8iLCJ2ZXJib3NlIiwicHJvZF8iLCJyYW5kIiwicmFuZF8iLCJyYW5kRnVuY3Rpb24iLCJNUFJhbmRHYXVzcyIsInN0ZERldmlhdGlvbiIsInRydW5jYXRlZCIsInN0ZERldiIsIm5leHRWYWwiLCJ1cHBlciIsImxvd2VyIiwic2VlZFZhbHVlIiwibmV4dFZhbHVlIiwicmVzdWx0WCIsInJlc3VsdFkiLCJpc1ZhbGlkIiwiaXNWYWxpZFRydW5jYXRlZCIsImNvbnZlcnRWYWx1ZSIsIlJhbmRHYW1tYSIsInJhbmR1IiwicmFuZG4iLCJ2MCIsIlVuaWZvcm1SYW5kb20iLCJjYW5SZXR1cm5GbG9hdCIsImphcnF1ZUJlcmFOb3JtYWxpdHlUZXN0IiwidmFsdWVzTWVhbiIsInN1bTIiLCJzdW0zIiwic2tld25lc3MiLCJzdW00Iiwia3VydG9zaXMiLCJqYiIsImV4cGVjdEFycmF5SW5NZWFuU3RkUmFuZ2UiLCJhY3R1YWwiLCJleHBlY3RlZE1lYW4iLCJleHBlY3RlZFN0ZERldiIsImFjdHVhbE1lYW4iLCJzcXVhcmVEaWZmU3VtIiwic3RhbmRhcmREZXZpYXRpb24iLCJyYW5kb21HYW1tYSIsInJhbmRvbUdhbW1hXyIsInJnYW1tYSIsInJhbmRvbU5vcm1hbCIsInJhbmRvbU5vcm1hbF8iLCJyYW5kR2F1c3MiLCJyYW5kb21Vbmlmb3JtIiwicmFuZG9tVW5pZm9ybV8iLCJtaW52YWwiLCJtYXh2YWwiLCJyZWFsXyIsInJlY2lwcm9jYWxfIiwiUEFSQUxMRUxJWkVfVEhSRVNIT0xEIiwicmVsdV8iLCJyZWx1Nl8iLCJyZXNoYXBlXyIsInJldmVyc2VfIiwicmV2ZXJzZTFkIiwicmV2ZXJzZTFkXyIsInJldmVyc2UyZCIsInJldmVyc2UyZF8iLCJyZXZlcnNlM2QiLCJyZXZlcnNlM2RfIiwicmV2ZXJzZTRkIiwicmV2ZXJzZTRkXyIsInJvdW5kXyIsInJzcXJ0XyIsInNjYWxhciIsInNjYXR0ZXJORCIsInNjYXR0ZXJORF8iLCIkdXBkYXRlcyIsInZhbGlkYXRlVXBkYXRlU2hhcGUiLCJzaGFwZUVycm9yIiwidmFsaWRhdGVJbnB1dCIsInRvdGFsTmQiLCJzYWZlU2xpY2VEaW0iLCJzZWx1XyIsInNlcGFyYWJsZUNvbnYyZCIsInNlcGFyYWJsZUNvbnYyZF8iLCJkZXB0aHdpc2VGaWx0ZXIiLCJwb2ludHdpc2VGaWx0ZXIiLCIkZGVwdGh3aXNlRmlsdGVyIiwiJHBvaW50d2lzZUZpbHRlciIsImNoYW5uZWxNdWx0aXBsaWVyIiwic2V0ZGlmZjFkQXN5bmMiLCJ5U2V0Iiwic2lnbW9pZF8iLCJzaWduXyIsImZyYW1lXyIsImZyYW1lTGVuZ3RoIiwiZnJhbWVTdGVwIiwicGFkVmFsdWUiLCJwYWRMZW4iLCJoYW1taW5nV2luZG93XyIsIndpbmRvd0xlbmd0aCIsImhhbm5XaW5kb3dfIiwic3RmdF8iLCJmZnRMZW5ndGgiLCJ3aW5kb3dGbiIsImZyYW1lZFNpZ25hbCIsIndpbmRvd2VkU2lnbmFsIiwiZW5jbG9zaW5nUG93ZXJPZlR3byIsImNvc2luZVdpbmRvdyIsImV2ZW4iLCJjb3NBcmciLCJzaW5fIiwic2luaF8iLCJzbGljZV8iLCJzbGljZTFkIiwic2xpY2UxZF8iLCJzbGljZTJkXyIsInNsaWNlM2RfIiwic2xpY2U0ZF8iLCJzdHJpZGVzV2l0aEVsaWRlZERpbXMiLCJlbGxpcHNpc0luc2VydGlvbkluZGV4IiwibnVtRWxpZGVkQXhlcyIsInVubm9ybWFsaXplQXhpcyIsIm5vcm1hbGl6ZWRBeGlzIiwiZ2V0RWxpZGVkQXhlcyIsImVsaWRlZEF4ZXMiLCJmdWxsSW5kZXgiLCJzdGFydEluZGljZXNXaXRoRWxpZGVkRGltcyIsInN0b3BJbmRpY2VzV2l0aEVsaWRlZERpbXMiLCJzdGFydEZvckF4aXMiLCJzdG9wRm9yQXhpcyIsInN0cmlkZXNGb3JBeGlzIiwib3JpZ2luYWxCZWdpbiIsIm9yaWdpbmFsQXhpcyIsIm9yaWdpbmFsVmFsdWUiLCJvcmlnaW5hbEVuZCIsIk1BWF9TQUZFX0lOVEVHRVIiLCJheGlzU2l6ZSIsInN0YXJ0SW5kaWNlcyIsInN0b3BJbmRpY2VzIiwiZmlyc3ROb25PbmVBeGlzIiwiJGVuZCIsInNvZnRtYXhfIiwic29mdHBsdXNfIiwic3BhY2VUb0JhdGNoTkRfIiwic3BhcnNlRmlsbEVtcHR5Um93c18iLCJzcGFyc2VSZXNoYXBlXyIsIiRuZXdTaGFwZSIsInNwYXJzZVNlZ21lbnRNZWFuXyIsInNwYXJzZVNlZ21lbnRTdW1fIiwic3BhcnNlVG9EZW5zZV8iLCIkc3BhcnNlSW5kaWNlcyIsIiRzcGFyc2VWYWx1ZXMiLCJkZWZhdWx0VmFsdWVzIiwibnVtRWxlbXMiLCJudW1WYWx1ZXMiLCJmZnRfIiwiaWZmdF8iLCJpcmZmdF8iLCJjb21wbGV4SW5wdXQiLCJyZWFsSW5wdXQiLCJpbWFnSW5wdXQiLCJyZWFsQ29uanVnYXRlIiwiaW1hZ0Nvbmp1Z2F0ZSIsInJmZnRfIiwiYWRqdXN0ZWRJbnB1dCIsInplcm9zU2hhcGUiLCJ6ZXJvc0lucHV0IiwicmVhbENvbXBsZXhDb25qdWdhdGUiLCJpbWFnQ29tcGxleENvbmp1Z2F0ZSIsInNwbGl0XyIsIm51bU9mTmVncyIsIm5lZ0luZGV4Iiwic3FydF8iLCJzcXVhcmVfIiwic3F1YXJlZERpZmZlcmVuY2VfIiwic3F1ZWV6ZSIsInNxdWVlemVfIiwic3RhY2tfIiwic3RlcF8iLCJzdHJpZGVkU2xpY2VfIiwic3RyaW5nTkdyYW1zXyIsInN0cmluZ1NwbGl0XyIsInN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RfIiwic3ViXyIsInN1bV8iLCJ0YW5fIiwidGFuaF8iLCJpbmZlcnJlZFNoYXBlIiwidGVuc29yMWQiLCJ0ZW5zb3IyZCIsInRlbnNvcjNkIiwidGVuc29yNGQiLCJ0ZW5zb3I1ZCIsInRlbnNvcjZkIiwicHJvdmlkZWRTaXplIiwiaW5mZXJyZWRTaXplIiwiaW5mZXJyZWQiLCJmbGF0RGltc0RvbnRNYXRjaCIsInRpbGVfIiwidG9wa18iLCJ0cmFuc3Bvc2VfIiwidHJ1bmNhdGVkTm9ybWFsIiwidHJ1bmNhdGVkTm9ybWFsXyIsInVuaXF1ZV8iLCJ1bnNvcnRlZFNlZ21lbnRTdW1fIiwidW5zdGFjayIsInVuc3RhY2tfIiwid2hlcmVfIiwiJGNvbmRpdGlvbiIsImJyb2FkY2FzdFNoYXBlIiwid2hlcmVBc3luYyIsInplcm9zTGlrZV8iLCJBZGFkZWx0YU9wdGltaXplciIsImxlYXJuaW5nUmF0ZSIsInJobyIsImFjY3VtdWxhdGVkR3JhZHMiLCJhY2N1bXVsYXRlZFVwZGF0ZXMiLCJhcHBseUdyYWRpZW50cyIsInZhcmlhYmxlR3JhZGllbnRzIiwib3JpZ2luYWxOYW1lIiwiYWNjdW11bGF0ZWRHcmFkIiwiYWNjdW11bGF0ZWRVcGRhdGUiLCJuZXdBY2N1bXVsYXRlZEdyYWQiLCJuZXdBY2N1bXVsYXRlZFVwZGF0ZSIsImluY3JlbWVudEl0ZXJhdGlvbnMiLCJ2YXJpYWJsZXMiLCJzYXZlSXRlcmF0aW9ucyIsIndlaWdodFZhbHVlcyIsInZhcmlhYmxlQ291bnQiLCJleHRyYWN0SXRlcmF0aW9ucyIsImdldENvbmZpZyIsImNscyIsImNsYXNzTmFtZSIsIkFkYWdyYWRPcHRpbWl6ZXIiLCJpbml0aWFsQWNjdW11bGF0b3JWYWx1ZSIsIkFkYW1PcHRpbWl6ZXIiLCJiZXRhMSIsImJldGEyIiwiYWNjdW11bGF0ZWRGaXJzdE1vbWVudCIsImFjY3VtdWxhdGVkU2Vjb25kTW9tZW50IiwiYWNjQmV0YTEiLCJhY2NCZXRhMiIsInZhck5hbWVzIiwib25lTWludXNBY2NCZXRhMSIsIm9uZU1pbnVzQWNjQmV0YTIiLCJmaXJzdE1vbWVudCIsInNlY29uZE1vbWVudCIsIm5ld0ZpcnN0TW9tZW50IiwibmV3U2Vjb25kTW9tZW50IiwiYmlhc0NvcnJlY3RlZEZpcnN0TW9tZW50IiwiYmlhc0NvcnJlY3RlZFNlY29uZE1vbWVudCIsIml0ZXJhdGlvbnNfIiwiQWRhbWF4T3B0aW1pemVyIiwiYWNjdW11bGF0ZWRXZWlnaHRlZEluZk5vcm0iLCJpdGVyYXRpb24iLCJsciIsIndlaWdodGVkSW5mTm9ybSIsInV0MCIsInV0MSIsIm5ld1dlaWdodGVkSW5mTm9ybSIsIk1vbWVudHVtT3B0aW1pemVyIiwibW9tZW50dW0iLCJ1c2VOZXN0ZXJvdiIsImFjY3VtdWxhdGlvbnMiLCJhY2N1bXVsYXRpb24iLCJuZXdBY2N1bXVsYXRpb24iLCJzZXRNb21lbnR1bSIsIk9wdGltaXplciIsIm1pbmltaXplIiwicmV0dXJuQ29zdCIsImNvbXB1dGVHcmFkaWVudHMiLCJncmFkQXJyYXkiLCJpdGVyYXRpb25zIiwiZ2V0Q2xhc3NOYW1lIiwiaGFzSW5zdGFuY2UiLCJPcHRpbWl6ZXJDb25zdHJ1Y3RvcnMiLCJjZW50ZXJlZCIsIlJNU1Byb3BPcHRpbWl6ZXIiLCJhY2N1bXVsYXRlZE1lYW5TcXVhcmVzIiwiYWNjdW11bGF0ZWRNb21lbnRzIiwiYWNjdW11bGF0ZWRNZWFuR3JhZHMiLCJhY2N1bXVsYXRlZE1lYW5TcXVhcmUiLCJuZXdBY2N1bXVsYXRlZE1lYW5TcXVhcmUiLCJhY2N1bXVsYXRlZE1lYW5HcmFkIiwibmV3QWNjdW11bGF0ZWRNZWFuR3JhZCIsImdyYWRDb250cmlidXRpb24iLCJuZXdBY2N1bXVsYXRlZE1vbWVudHMiLCJTR0RPcHRpbWl6ZXIiLCJzZXRMZWFybmluZ1JhdGUiLCJQbGF0Zm9ybUJyb3dzZXIiLCJlbmNvZGUiLCJlbmNvZGluZyIsInRleHRFbmNvZGVyIiwiVGV4dEVuY29kZXIiLCJyZWdpc3Rlck1hbmFnZXIiLCJnZXROb2RlRmV0Y2giLCJpbXBvcnRGZXRjaCIsInN5c3RlbUZldGNoIiwicmVzZXRTeXN0ZW1GZXRjaCIsInNldFN5c3RlbUZldGNoIiwiZmV0Y2hGbiIsImdldFN5c3RlbUZldGNoIiwiUGxhdGZvcm1Ob2RlIiwidXRpbCIsInJlcXVlc3RJbml0cyIsImhydGltZSIsIlByb2ZpbGVyIiwiYmFja2VuZFRpbWVyIiwibG9nZ2VyIiwiTG9nZ2VyIiwiaG9sZFJlc3VsdFdyYXBwZXJGbiIsInRpbWVyIiwidGVuc29yVmFscyIsImNoZWNrQ29tcHV0YXRpb25Gb3JFcnJvcnMiLCJ0aW1pbmciLCJnZXRFeHRyYVByb2ZpbGVJbmZvIiwidmFsdWVDb250YWluZXIiLCJwYWRkZWROYW1lIiwiaW5wdXRTaGFwZXNEZXNjcmlwdGlvbiIsIlNlcmlhbGl6YWJsZSIsIlNlcmlhbGl6YXRpb25NYXAiLCJjbGFzc05hbWVNYXAiLCJnZXRNYXAiLCJmcm9tQ29uZmlnIiwicmVnaXN0ZXJDbGFzcyIsInJlZ2lzdGVyIiwiZ2V0RmlsdGVyZWROb2Rlc1hUb1kiLCJ0YXBlIiwidGVuc29yc0Zyb21YIiwibm9kZXNGcm9tWCIsIm5vZGVJbnB1dHMiLCJhbnlJbnB1dEZyb21YIiwidGVuc29yc0xlYWRUb1kiLCJub2Rlc1RvWSIsInBydW5lZElucHV0cyIsIm5vZGVJbnB1dCIsInBydW5lZE5vZGUiLCJiYWNrcHJvcGFnYXRlR3JhZGllbnRzIiwidGVuc29yQWNjdW11bGF0ZWRHcmFkaWVudE1hcCIsImdyYWRUZW5zb3IiLCJpbnB1dEdyYWRpZW50cyIsImN1ckdyYWRpZW50IiwiVGVuc29yQnVmZmVyIiwibG9jcyIsInRyYWNrZXJGbiIsImRlcHJlY2F0aW9uV2FybmluZ0ZuIiwic2V0VGVuc29yVHJhY2tlciIsInNldE9wSGFuZGxlciIsInNldERlcHJlY2F0aW9uV2FybmluZ0ZuIiwiVGVuc29yIiwiaXNEaXNwb3NlZEludGVybmFsIiwicmFua1R5cGUiLCJhcnJheVN5bmMiLCJpc0Rpc3Bvc2VkIiwiZ2V0R2xvYmFsVGVuc29yQ2xhc3MiLCJWYXJpYWJsZSIsInRlbnNvcklkIiwiRnVuY3Rpb24iLCJ0ZW5zb3JUb1N0cmluZyIsInBhZFBlckNvbCIsInZhbHVlc09yVHVwbGVzIiwiY3JlYXRlQ29tcGxleFR1cGxlcyIsInZhbFRvU3RyaW5nIiwiY29tcHV0ZU1heFNpemVQZXJDb2x1bW4iLCJ2YWxzTGluZXMiLCJzdWJUZW5zb3JUb1N0cmluZyIsImxpbmVzIiwidmFsU3RyIiwicGFyc2VGbG9hdCIsImJvb2xOdW1Ub1N0cmluZyIsImlzTGFzdCIsInN0b3JhZ2VQZXJFbGVtZW50IiwiZmlyc3RWYWxzU2l6ZSIsImZpcnN0VmFscyIsImxhc3RWYWxzIiwic3Vic2hhcGUiLCJzdWJzdHJpZGVzIiwic2VwIiwibmV3TGluZVNlcCIsImNvbXBsZXhUdXBsZXMiLCJtYWtlVHlwZXNNYXRjaCIsImFzc2VydFR5cGVzTWF0Y2giLCJpc1RlbnNvckluTGlzdCIsInRlbnNvckxpc3QiLCJnZXRUZW5zb3JzSW5Db250YWluZXIiLCJsaXN0Iiwid2Fsa1RlbnNvckNvbnRhaW5lciIsInNlZW4iLCJvYmoiLCJpdGVyYWJsZSIsImluZmVyU2hhcGUiLCJmaXJzdEVsZW0iLCJkZWVwQXNzZXJ0U2hhcGVDb25zaXN0ZW5jeSIsInN1YlNoYXBlIiwiYXNzZXJ0RHR5cGUiLCJleHBlY3RlZER0eXBlIiwiYWN0dWFsRFR5cGUiLCJhcmdOYW1lIiwiZnVuY3Rpb25OYW1lIiwiY29udmVydFRvVGVuc29yIiwicGFyc2VBc0R0eXBlIiwiaW5mZXJyZWREdHlwZSIsImNvbnZlcnRUb1RlbnNvckFycmF5IiwiVEVTVF9FUFNJTE9OX0ZMT0FUMTYiLCJleHBlY3RBcnJheXNDbG9zZSIsImV4cGVjdGVkIiwidGVzdEVwc2lsb24iLCJleHBlY3RBcnJheXNQcmVkaWNhdGUiLCJhcmVDbG9zZSIsInByZWRpY2F0ZSIsImNoZWNrQ2xhc3NUeXBlIiwiYVR5cGUiLCJiVHlwZSIsImFjdHVhbFNoYXBlIiwiZXhwZWN0ZWRTaGFwZSIsImFjdHVhbEZsYXQiLCJleHBlY3RlZEZsYXQiLCJleHBlY3RQcm9taXNlVG9GYWlsIiwiZmFpbCIsImV4cGVjdEFycmF5c0VxdWFsIiwiZXhwZWN0TnVtYmVyc0Nsb3NlIiwiZXhwZWN0VmFsdWVzSW5SYW5nZSIsImV4cGVjdEFycmF5QnVmZmVyc0VxdWFsIiwiZXhwZWN0IiwidG9FcXVhbCIsImVuY29kZVN0cmluZ3MiLCJ0cmFpbiIsInNnZCIsImFkYWRlbHRhIiwiYWRhZ3JhZCIsInJtc3Byb3AiLCJhZGFtYXgiLCJhZGFtIiwiUmFuayIsIlVwY2FzdEludDMyQW5kTWFwIiwiVXBjYXN0Qm9vbEFuZE1hcCIsIlVwY2FzdEZsb2F0MzJBbmRNYXAiLCJVcGNhc3RDb21wbGV4NjRBbmRNYXAiLCJ1cGNhc3RUeXBlTWFwIiwidHlwZUEiLCJ0eXBlQiIsInN1bU91dFR5cGUiLCJub0NvbnZlcnNpb25OZWVkZWQiLCJib29sIiwic2h1ZmZsZSIsInNodWZmbGVDb21ibyIsImFycmF5MiIsInJhbmRVbmlmb3JtIiwiZGlzdFNxdWFyZWQiLCJleHByIiwiZXJyb3JNZXNzYWdlUHJlZml4IiwiYXNzZXJ0Tm9uTnVsbCIsInNraXBUeXBlZEFycmF5IiwiaXNUeXBlZEFycmF5IiwiaXNTY2FsYXJTaGFwZSIsIm4xIiwibjIiLCJlMngiLCJjcmVhdGVTaHVmZmxlZEluZGljZXMiLCJzaHVmZmxlZEluZGljZXMiLCJyZXBlYXQiLCJjaGVja0ZuIiwiZGVsYXlGbiIsIm1heENvdW50ZXIiLCJ0cnlDb3VudCIsInRyeUZuIiwibmV4dEJhY2tvZmYiLCJzaGFwZVByb2QiLCJpbXBsaWNpdElkeCIsImF4IiwiaXNFbXB0eUFycmF5IiwiY2hlY2tDb252ZXJzaW9uRm9yRXJyb3JzIiwiaXNWYWxpZER0eXBlIiwib2xkVHlwZSIsIm5ld1R5cGUiLCJieXRlc0Zyb21TdHJpbmdBcnJheSIsImlzQm9vbGVhbiIsImlzTnVtYmVyIiwiaXNGdW5jdGlvbiIsIm5lYXJlc3REaXZpc29yIiwiY3JlYXRlTmVzdGVkQXJyYXkiLCJpc0NvbXBsZXgiLCJyZXN0IiwiYWNjIiwibWFrZU9uZXNUeXBlZEFycmF5IiwiYXNzZXJ0Tm9uTmVnYXRpdmVJbnRlZ2VyRGltZW5zaW9ucyIsImlzUHJvbWlzZSIsImI2NCIsImxlbnMiLCJnZXRMZW5zIiwidmFsaWRMZW4iLCJwbGFjZUhvbGRlcnNMZW4iLCJ0b0J5dGVBcnJheSIsInRtcCIsIkFyciIsIl9ieXRlTGVuZ3RoIiwiY3VyQnl0ZSIsInJldkxvb2t1cCIsImZyb21CeXRlQXJyYXkiLCJ1aW50OCIsImV4dHJhQnl0ZXMiLCJtYXhDaHVua0xlbmd0aCIsImxlbjIiLCJlbmNvZGVDaHVuayIsImxvb2t1cCIsImJhc2U2NCIsImllZWU3NTQiLCJrTWF4TGVuZ3RoIiwiVFlQRURfQVJSQVlfU1VQUE9SVCIsInRoYXQiLCJSYW5nZUVycm9yIiwiX19wcm90b19fIiwiZW5jb2RpbmdPck9mZnNldCIsImFsbG9jVW5zYWZlIiwiZnJvbUFycmF5TGlrZSIsImZyb21BcnJheUJ1ZmZlciIsImlzRW5jb2RpbmciLCJpc0J1ZmZlciIsImNoZWNrZWQiLCJjb3B5IiwiZnJvbU9iamVjdCIsImFzc2VydFNpemUiLCJpc1ZpZXciLCJsb3dlcmVkQ2FzZSIsInV0ZjhUb0J5dGVzIiwiYmFzZTY0VG9CeXRlcyIsInNsb3dUb1N0cmluZyIsImhleFNsaWNlIiwidXRmOFNsaWNlIiwiYXNjaWlTbGljZSIsImxhdGluMVNsaWNlIiwiYmFzZTY0U2xpY2UiLCJ1dGYxNmxlU2xpY2UiLCJiaWRpcmVjdGlvbmFsSW5kZXhPZiIsImFycmF5SW5kZXhPZiIsImluZGV4U2l6ZSIsImFyckxlbmd0aCIsInZhbExlbmd0aCIsInJlYWRVSW50MTZCRSIsImZvdW5kSW5kZXgiLCJoZXhXcml0ZSIsInJlbWFpbmluZyIsInN0ckxlbiIsInBhcnNlZCIsInBhcnNlSW50IiwidXRmOFdyaXRlIiwiYmxpdEJ1ZmZlciIsImFzY2lpV3JpdGUiLCJieXRlQXJyYXkiLCJhc2NpaVRvQnl0ZXMiLCJsYXRpbjFXcml0ZSIsImJhc2U2NFdyaXRlIiwidWNzMldyaXRlIiwidW5pdHMiLCJoaSIsImxvIiwidXRmMTZsZVRvQnl0ZXMiLCJzZWNvbmRCeXRlIiwidGhpcmRCeXRlIiwiZm91cnRoQnl0ZSIsInRlbXBDb2RlUG9pbnQiLCJmaXJzdEJ5dGUiLCJjb2RlUG9pbnQiLCJieXRlc1BlclNlcXVlbmNlIiwiY29kZVBvaW50cyIsIk1BWF9BUkdVTUVOVFNfTEVOR1RIIiwiZGVjb2RlQ29kZVBvaW50c0FycmF5IiwiU2xvd0J1ZmZlciIsImFsbG9jIiwiSU5TUEVDVF9NQVhfQllURVMiLCJmb28iLCJ0eXBlZEFycmF5U3VwcG9ydCIsInBvb2xTaXplIiwiX2F1Z21lbnQiLCJzcGVjaWVzIiwiYWxsb2NVbnNhZmVTbG93IiwiX2lzQnVmZmVyIiwiY29tcGFyZSIsInBvcyIsInN3YXAxNiIsInN3YXAzMiIsInN3YXA2NCIsImVxdWFscyIsImluc3BlY3QiLCJ0aGlzU3RhcnQiLCJ0aGlzRW5kIiwidGhpc0NvcHkiLCJ0YXJnZXRDb3B5IiwiaW5jbHVkZXMiLCJ0b0pTT04iLCJfYXJyIiwidG9IZXgiLCJjaGVja09mZnNldCIsImNoZWNrSW50Iiwib2JqZWN0V3JpdGVVSW50MTYiLCJsaXR0bGVFbmRpYW4iLCJvYmplY3RXcml0ZVVJbnQzMiIsImNoZWNrSUVFRTc1NCIsIndyaXRlRmxvYXQiLCJub0Fzc2VydCIsIndyaXRlRG91YmxlIiwibmV3QnVmIiwic2xpY2VMZW4iLCJyZWFkVUludExFIiwicmVhZFVJbnRCRSIsInJlYWRVSW50OCIsInJlYWRVSW50MTZMRSIsInJlYWRVSW50MzJMRSIsInJlYWRVSW50MzJCRSIsInJlYWRJbnRMRSIsInJlYWRJbnRCRSIsInJlYWRJbnQ4IiwicmVhZEludDE2TEUiLCJyZWFkSW50MTZCRSIsInJlYWRJbnQzMkxFIiwicmVhZEludDMyQkUiLCJyZWFkRmxvYXRMRSIsInJlYWRGbG9hdEJFIiwicmVhZERvdWJsZUxFIiwicmVhZERvdWJsZUJFIiwid3JpdGVVSW50TEUiLCJ3cml0ZVVJbnRCRSIsIndyaXRlVUludDgiLCJ3cml0ZVVJbnQxNkxFIiwid3JpdGVVSW50MTZCRSIsIndyaXRlVUludDMyTEUiLCJ3cml0ZVVJbnQzMkJFIiwid3JpdGVJbnRMRSIsImxpbWl0Iiwid3JpdGVJbnRCRSIsIndyaXRlSW50OCIsIndyaXRlSW50MTZMRSIsIndyaXRlSW50MTZCRSIsIndyaXRlSW50MzJMRSIsIndyaXRlSW50MzJCRSIsIndyaXRlRmxvYXRMRSIsIndyaXRlRmxvYXRCRSIsIndyaXRlRG91YmxlTEUiLCJ3cml0ZURvdWJsZUJFIiwidGFyZ2V0U3RhcnQiLCJJTlZBTElEX0JBU0U2NF9SRSIsImxlYWRTdXJyb2dhdGUiLCJzdHJpbmd0cmltIiwiYmFzZTY0Y2xlYW4iLCJpc0xFIiwibUxlbiIsIm5CeXRlcyIsImVMZW4iLCJlTWF4IiwiZUJpYXMiLCJuQml0cyIsInJ0IiwiTE4yIiwiSW5zdGFuY2UiLCJ1bnNpZ25lZCIsImlzTG9uZyIsIl9faXNMb25nX18iLCJJTlRfQ0FDSEUiLCJVSU5UX0NBQ0hFIiwiZnJvbUludCIsImNhY2hlZE9iaiIsImNhY2hlIiwiZnJvbUJpdHMiLCJaRVJPIiwiVFdPX1BXUl82NF9EQkwiLCJNQVhfVU5TSUdORURfVkFMVUUiLCJUV09fUFdSXzYzX0RCTCIsIk1JTl9WQUxVRSIsIk1BWF9WQUxVRSIsIlRXT19QV1JfMzJfREJMIiwibG93Qml0cyIsImhpZ2hCaXRzIiwicG93X2RibCIsInJhZGl4IiwicmFkaXhUb1Bvd2VyIiwicG93ZXIiLCJmcm9tVmFsdWUiLCJUV09fUFdSXzE2X0RCTCIsIlRXT19QV1JfMjQiLCJPTkUiLCJVT05FIiwiTkVHX09ORSIsIkxvbmdQcm90b3R5cGUiLCJ0b0ludCIsInRvTnVtYmVyIiwiaXNaZXJvIiwiaXNOZWdhdGl2ZSIsImVxIiwicmFkaXhMb25nIiwicmVtMSIsInJlbURpdiIsImRpZ2l0cyIsImdldEhpZ2hCaXRzIiwiZ2V0SGlnaEJpdHNVbnNpZ25lZCIsImdldExvd0JpdHMiLCJnZXROdW1CaXRzQWJzIiwiYml0IiwiZXF6IiwiaXNQb3NpdGl2ZSIsImlzT2RkIiwib3RoZXIiLCJub3RFcXVhbHMiLCJuZXEiLCJuZSIsImxlc3NUaGFuIiwiY29tcCIsImx0IiwibGVzc1RoYW5PckVxdWFsIiwibHRlIiwibGUiLCJncmVhdGVyVGhhbiIsImd0IiwiZ3JlYXRlclRoYW5PckVxdWFsIiwiZ3RlIiwiZ2UiLCJ0aGlzTmVnIiwib3RoZXJOZWciLCJuZWdhdGUiLCJub3QiLCJhZGRlbmQiLCJhNDgiLCJhMzIiLCJhMTYiLCJhMDAiLCJiNDgiLCJiMzIiLCJiMTYiLCJjNDgiLCJjMzIiLCJjMTYiLCJjMDAiLCJzdWJ0cmFjdCIsInN1YnRyYWhlbmQiLCJnZXRfaGlnaCIsImIwMCIsImRpdmlkZSIsImFwcHJveCIsImRpdl91IiwiZGl2X3MiLCJ0b1Vuc2lnbmVkIiwic2hyIiwiYXBwcm94UmVzIiwiYXBwcm94UmVtIiwicmVtX3UiLCJyZW1fcyIsInNoaWZ0TGVmdCIsIm51bUJpdHMiLCJzaGlmdFJpZ2h0Iiwic2hpZnRSaWdodFVuc2lnbmVkIiwic2hyX3UiLCJ0b1NpZ25lZCIsInRvQnl0ZXMiLCJ0b0J5dGVzTEUiLCJ0b0J5dGVzQkUiLCJmcm9tQnl0ZXNMRSIsImZyb21CeXRlc0JFIiwiY2FjaGVkU2V0VGltZW91dCIsImNhY2hlZENsZWFyVGltZW91dCIsImRlZmF1bHRTZXRUaW1vdXQiLCJkZWZhdWx0Q2xlYXJUaW1lb3V0IiwicnVuVGltZW91dCIsImZ1biIsImNsZWFyVGltZW91dCIsImN1cnJlbnRRdWV1ZSIsInF1ZXVlIiwiZHJhaW5pbmciLCJxdWV1ZUluZGV4IiwiY2xlYW5VcE5leHRUaWNrIiwiZHJhaW5RdWV1ZSIsIm1hcmtlciIsInJ1bkNsZWFyVGltZW91dCIsIkl0ZW0iLCJub29wIiwibmV4dFRpY2siLCJ0aXRsZSIsImJyb3dzZXIiLCJhZGRMaXN0ZW5lciIsIm9uY2UiLCJvZmYiLCJyZW1vdmVMaXN0ZW5lciIsInJlbW92ZUFsbExpc3RlbmVycyIsImVtaXQiLCJwcmVwZW5kTGlzdGVuZXIiLCJwcmVwZW5kT25jZUxpc3RlbmVyIiwibGlzdGVuZXJzIiwiYmluZGluZyIsImN3ZCIsImNoZGlyIiwidW1hc2siLCJhbGVhIiwieG9yMTI4IiwieG9yd293IiwieG9yc2hpZnQ3IiwieG9yNDA5NiIsInR5Y2hlaSIsInNyIiwiZGVmaW5lIiwiQWxlYSIsIm1lIiwibWFzaCIsInMwIiwiczEiLCJzMiIsImltcGwiLCJ4ZyIsInBybmciLCJpbnQzMiIsInF1aWNrIiwiWG9yR2VuIiwic3Ryc2VlZCIsIlgiLCJtYXRoIiwibm9kZWNyeXB0byIsInN0YXJ0ZGVub20iLCJzaWduaWZpY2FuY2UiLCJvdmVyZmxvdyIsInNlZWRyYW5kb20iLCJvcHRpb25zIiwic2hvcnRzZWVkIiwibWl4a2V5IiwiZW50cm9weSIsInRvc3RyaW5nIiwicmFuZG9tQnl0ZXMiLCJjcnlwdG8iLCJtc0NyeXB0byIsImdldFJhbmRvbVZhbHVlcyIsInBsdWdpbnMiLCJhdXRvc2VlZCIsImFyYzQiLCJBUkM0IiwiUyIsInBhc3MiLCJpc19tYXRoX2NhbGwiLCJrZXlsZW4iLCJwcm9wIiwidHlwIiwic21lYXIiLCJzdHJpbmdzZWVkIiwicmVnaXN0ZXJJbW1lZGlhdGUiLCJodG1sIiwibWVzc2FnZVByZWZpeCIsIm9uR2xvYmFsTWVzc2FnZSIsIm5leHRIYW5kbGUiLCJ0YXNrc0J5SGFuZGxlIiwiY3VycmVudGx5UnVubmluZ0FUYXNrIiwiZG9jIiwiYXR0YWNoVG8iLCJnZXRQcm90b3R5cGVPZiIsInJ1bklmUHJlc2VudCIsInBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXMiLCJvbGRPbk1lc3NhZ2UiLCJjYW5Vc2VQb3N0TWVzc2FnZSIsInBvcnQyIiwiZG9jdW1lbnRFbGVtZW50Iiwic2NyaXB0Iiwib25yZWFkeXN0YXRlY2hhbmdlIiwicmVtb3ZlQ2hpbGQiLCJhcHBlbmRDaGlsZCIsImF0dGFjaEV2ZW50IiwidGFzayIsImNsZWFySW1tZWRpYXRlIiwiVGltZW91dCIsImNsZWFyRm4iLCJfaWQiLCJfY2xlYXJGbiIsInNjb3BlIiwic2V0SW50ZXJ2YWwiLCJ1bnJlZiIsInJlZiIsImVucm9sbCIsIl9pZGxlVGltZW91dElkIiwiX2lkbGVUaW1lb3V0IiwidW5lbnJvbGwiLCJfdW5yZWZBY3RpdmUiLCJhY3RpdmUiLCJfb25UaW1lb3V0IiwiX193ZWJwYWNrX2FtZF9vcHRpb25zX18iLCJ3ZWJwYWNrUG9seWZpbGwiLCJkZXByZWNhdGUiLCJjaGlsZHJlbiIsIm1sIiwiTUwiLCJNTENvbnRleHQiLCJNTEdyYXBoQnVpbGRlciIsIk1MR3JhcGgiLCJNTE9wZXJhbmQiLCJNTFBvd2VyUHJlZmVyZW5jZSIsIk1MRGV2aWNlUHJlZmVyZW5jZSIsIm9wdGlvbnNfIiwiRXhlY3V0aW9uQ29udGV4dCIsImNvbnN0YW50VGVuc29ycyIsImlucHV0T3BlcmFuZHMiLCJvcGVyYW5kUmVmcyIsImNvbnN0YW50VGVub3Nyc18iLCJvcGVyYW5kUmVmc18iLCJhbGxvY2F0ZUlucHV0VGVuc29ycyIsIm91dHB1dFRlbnNvcnNfIiwib3V0cHV0T3BlcmFuZHNfIiwiaW5wdXRUZW5zb3JzXyIsImlucHV0T3BlcmFuZCIsImRlc2MiLCJyZXNvdXJjZSIsImRpbWVuc2lvbnMiLCJvdXRwdXRUZW5zb3JzIiwib3V0cHV0TmFtZSIsImdldFRlbnNvciIsInNldE91dHB1dFRlbnNvciIsInJlbGVhc2VUZW5zb3IiLCJvcGVyYW5kIiwib3BlcmFuZFRlbnNvck1hcCIsIm9wZXJhbmRUZW5zb3IiLCJpbnB1dHNfIiwib3V0cHV0c18iLCJjb25zdGFudHNfIiwiY29uc3RhbnRUZW5zb3JzXyIsInZhbGlkYXRlSW5wdXRzIiwib3V0cHV0T3BlcmFuZHMiLCJncmFwaCIsImJ1aWxkIiwiY29tcGlsZSIsInZpc2l0ZWRPcHMiLCJidWlsZE9wZXJhdGlvbiIsImFsbG9jYXRlQ29uc3RhbnRzIiwiY29tcHV0ZU9uY2UiLCJjb25zdGFudCIsImRpc3Bvc2VPcGVyYXRpb24iLCJNTElucHV0T3BlcmFuZExheW91dCIsIk1MRmlsdGVyT3BlcmFuZExheW91dCIsIk1MQXV0b1BhZCIsIk1MUmVjdXJyZW50TmV0d29ya1dlaWdodExheW91dCIsIk1MUmVjdXJyZW50TmV0d29ya0RpcmVjdGlvbiIsIk1MUGFkZGluZ01vZGUiLCJNTEludGVycG9sYXRpb25Nb2RlIiwiY29udGV4dF8iLCJidWlsZEFuZENvbXBpbGUiLCJkZXNjT3JWYWx1ZSIsInZhbHVlT3JUeXBlIiwiZmxvYXQzMiIsImNyZWF0ZVNjYWxhciIsImNyZWF0ZVRlbnNvciIsImJhdGNoTm9ybWFsaXphdGlvbiIsInZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIiLCJnZXRGdXNlZE91dHB1dHMiLCJvcGVyYW5kT3JPcHRpb25zIiwibWluVmFsdWUiLCJoYXJkU3dpc2giLCJnZW1tIiwiZ3J1IiwicmVjdXJyZW50V2VpZ2h0IiwiaGlkZGVuU2l6ZSIsInJlY3VycmVudEJpYXMiLCJpbml0aWFsSGlkZGVuU3RhdGUiLCJncnVDZWxsIiwiaGlkZGVuU3RhdGUiLCJpbnN0YW5jZU5vcm1hbGl6YXRpb24iLCJtYXRtdWwiLCJwYWRkaW5nIiwiYXZlcmFnZVBvb2wyZCIsImwyUG9vbDJkIiwibWF4UG9vbDJkIiwicmVkdWNlTDEiLCJyZWR1Y2VMMiIsInJlZHVjZUxvZ1N1bUV4cCIsInJlZHVjZU1heCIsInJlZHVjZU1lYW4iLCJyZWR1Y2VNaW4iLCJyZWR1Y2VQcm9kdWN0IiwicmVkdWNlU3VtIiwicmVzYW1wbGUiLCJzdGFydHMiLCJzaXplcyIsIm9wZXJhbmRzIiwiYnVpbGRlciIsIk1MT3BlcmFuZFR5cGUiLCJidWlsZGVyXyIsIklucHV0T3BlcmFuZCIsIkNvbnN0YW50T3BlcmFuZCIsIk91dHB1dE9wZXJhbmQiLCJPcGVyYXRpb24iLCJpbnB1dFRlbnNvcnMiLCJjb21wdXRlSW1wbCIsIlNpbmdsZU91dHB1dE9wZXJhdGlvbiIsImNyZWF0ZU91dHB1dCIsIkJhdGNoTm9ybWFsaXphdGlvbiIsImlucHV0XyIsInZhcmlhbmNlXyIsInNjYWxlXyIsImJpYXNfIiwiYXhpc18iLCJlcHNpbG9uXyIsImFjdGl2YXRpb25fIiwiQmluYXJ5IiwiYV8iLCJiXyIsInJ1bk9wIiwiTXVsIiwiRGl2IiwiTWF0TXVsIiwiQ2xhbXAiLCJ4XyIsIm1pbk9wZXJhbmRfIiwibWluU2NhbGFyVmFsdWVfIiwiZ2V0U2NhbGFyVmFsdWUiLCJtYXhPcGVyYW5kXyIsIm1heFNjYWxhclZhbHVlXyIsIm1pbnVzIiwibWluQ29uc3RhbnQiLCJDb252MmQiLCJmaWx0ZXJfIiwiYXV0b1BhZCIsImV4cGxpY2l0IiwiaW5pdE9wdGlvbnMiLCJncm91cHMiLCJpbnB1dExheW91dCIsImZpbHRlckxheW91dCIsIm91dHB1dFBhZGRpbmciLCJvdXRwdXRTaXplcyIsIm5jaHciLCJvaWh3IiwicGFkZGluZ18iLCJzdHJpZGVzXyIsImRpbGF0aW9uc18iLCJncm91cHNfIiwiaW5wdXRMYXlvdXRfIiwiZmlsdGVyTGF5b3V0XyIsImF1dG9QYWRfIiwib3V0cHV0UGFkZGluZ18iLCJvdXRwdXRTaXplc18iLCJmdXNlZEFjdGl2YXRpb25fIiwiaXNSZWx1NiIsImxlYWt5cmVsdUFscGhhXyIsIm1pblNjYWxhclZhbHVlIiwibWF4U2NhbGFyVmFsdWUiLCJmdXNlZCIsImZpbHRlclRlbnNvcl8iLCJvaHdpIiwiaWh3byIsImh3aW8iLCJmdXNlZERlcHRod2lzZVBhZCIsIkdlbW0iLCJhVHJhbnNwb3NlIiwiYlRyYW5zcG9zZSIsImFiIiwiR3J1Iiwid2VpZ2h0XyIsInJlY3VycmVudFdlaWdodF8iLCJzdGVwc18iLCJoaWRkZW5TaXplXyIsInJlc2V0QWZ0ZXIiLCJyZXR1cm5TZXF1ZW5jZSIsImRpcmVjdGlvbiIsImxheW91dCIsImFjdGl2YXRpb25zIiwicmV0dXJuU2VxdWVuY2VfIiwiZm9yd2FyZCIsInpybiIsInJlY3VycmVudEJpYXNfIiwiaW5pdGlhbEhpZGRlblN0YXRlXyIsInJlc2V0QWZ0ZXJfIiwiZGlyZWN0aW9uXyIsImxheW91dF8iLCJhY3RpdmF0aW9uc18iLCJudW1EaXJlY3Rpb25zIiwiYm90aCIsInNlcXVlbmNlIiwiY2VsbFdlaWdodCIsImNlbGxSZWN1cnJlbnRXZWlnaHQiLCJjZWxsQmlhcyIsImNlbGxSZWN1cnJlbnRCaWFzIiwic2xvdCIsImNlbGxIaWRkZW4iLCJjZWxsT3V0cHV0IiwiYmFja3dhcmQiLCJjZWxsSW5wdXQiLCJHcnVDZWxsIiwiaGlkZGVuU3RhdGVfIiwiYWN0aXZhdGlvbjAiLCJhY3RpdmF0aW9uMSIsIkluc3RhbmNlTm9ybWFsaXphdGlvbiIsIm5od2MiLCJzY2FsZWQiLCJhbHBoYV8iLCJQYWQiLCJtb2RlXyIsInZhbHVlXyIsInBhZGRpbmdBcnJheSIsImVkZ2UiLCJlZGdlUGFkZGluZ3MiLCJwYWRkZWQiLCJyZWZsZWN0aW9uIiwic3ltbWV0cmljIiwid2luZG93RGltZW5zaW9ucyIsIndpbmRvd0RpbWVuc2lvbnNfIiwiZ2V0UG9vbGluZ1R5cGUiLCJ0b3RhbFBhZGRpbmciLCJBdmVyYWdlUG9vbDJkIiwiTWF4UG9vbDJkIiwiTDJQb29sMmQiLCJSZWR1Y2UiLCJheGVzXyIsImtlZXBEaW1lbnNpb25zIiwia2VlcERpbWVuc2lvbnNfIiwiUmVkdWNlTG9nU3VtRXhwIiwiUmVkdWNlTWF4IiwiUmVkdWNlTWVhbiIsIlJlZHVjZU1pbiIsIlJlZHVjZVByb2R1Y3QiLCJSZWR1Y2VTdW0iLCJSZWR1Y2VMMSIsIlJlZHVjZUwyIiwiUmVzYW1wbGUiLCJzY2FsZXMiLCJzY2FsZXNfIiwic2l6ZXNfIiwibmV3U2hhcGVfIiwic3RhcnRzXyIsIlNwbGl0Iiwic3BsaXRzXyIsIlNxdWVlemUiLCJwZXJtdXRhdGlvbl8iLCJVbmFyeSIsIlVuYXJ5TUxPcGVyYXRvciIsIkhhcmRTd2lzaCIsImlzSW50ZWdlckFycmF5IiwiZ2V0VHlwZWRBcnJheSIsImNsb25lVHlwZWRBcnJheSIsImdldERhdGFUeXBlIiwiY3JlYXRlT3BlcmFuZERlc2NyaXB0b3JGcm9tVGVuc29yIiwidmFsaWRhdGVPcGVyYW5kRGVzY3JpcHRvciIsImlzRHlhbm1pY1NoYXBlIiwidmFsaWRhdGVUeXBlZEFycmF5Iiwic2l6ZUZyb21EaW1lbnNpb25zIiwidmFsaWRhdGVWYWx1ZVR5cGUiLCJ1aW50MzIiLCJpbnQ4IiwiY2xvbmVkQXJyYXkiLCJjdXJyZW50VmFsdWUiLCJ2YWxpZGF0ZU9wZXJhbmQiLCJ2YWxpZGF0ZU9wdGlvbmFsT3BlcmFuZCIsInZhbGlkYXRlQXhlcyIsImdldFBhZGRpbmdzIiwicmVzdWx0UGFkZGluZyJdLCJtYXBwaW5ncyI6ImFBQ0UsSUFBSUEsRUFBbUIsR0FHdkIsU0FBU0MsRUFBb0JDLEdBRzVCLEdBQUdGLEVBQWlCRSxHQUNuQixPQUFPRixFQUFpQkUsR0FBVUMsUUFHbkMsSUFBSUMsRUFBU0osRUFBaUJFLEdBQVksQ0FDekNHLEVBQUdILEVBQ0hJLEdBQUcsRUFDSEgsUUFBUyxJQVVWLE9BTkFJLEVBQVFMLEdBQVVNLEtBQUtKLEVBQU9ELFFBQVNDLEVBQVFBLEVBQU9ELFFBQVNGLEdBRy9ERyxFQUFPRSxHQUFJLEVBR0pGLEVBQU9ELFFBS2ZGLEVBQW9CUSxFQUFJRixFQUd4Qk4sRUFBb0JTLEVBQUlWLEVBR3hCQyxFQUFvQlUsRUFBSSxTQUFTUixFQUFTUyxFQUFNQyxHQUMzQ1osRUFBb0JhLEVBQUVYLEVBQVNTLElBQ2xDRyxPQUFPQyxlQUFlYixFQUFTUyxFQUFNLENBQUVLLFlBQVksRUFBTUMsSUFBS0wsS0FLaEVaLEVBQW9Ca0IsRUFBSSxTQUFTaEIsR0FDWCxvQkFBWGlCLFFBQTBCQSxPQUFPQyxhQUMxQ04sT0FBT0MsZUFBZWIsRUFBU2lCLE9BQU9DLFlBQWEsQ0FBRUMsTUFBTyxXQUU3RFAsT0FBT0MsZUFBZWIsRUFBUyxhQUFjLENBQUVtQixPQUFPLEtBUXZEckIsRUFBb0JzQixFQUFJLFNBQVNELEVBQU9FLEdBRXZDLEdBRFUsRUFBUEEsSUFBVUYsRUFBUXJCLEVBQW9CcUIsSUFDL0IsRUFBUEUsRUFBVSxPQUFPRixFQUNwQixHQUFXLEVBQVBFLEdBQThCLGlCQUFWRixHQUFzQkEsR0FBU0EsRUFB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SyxHQUFHLEtBQUssR0FBRyxLQUFLLElBQUksS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssRUFBRSxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxJQUFJLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssSUFBSSxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLE9BQU8sT0FBTyxLQUFLLEdBQUcsS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLElBQUksS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLE9BQU8sRUFBRSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssRUFBRSxLQUFLLElBQUksS0FBSyxFQUFFLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxHQUFHLEtBQUssR0FBRyxPQUFPLEVBQUUsS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssRUFBRSxPQUFPLEtBQUssS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsT0FB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RUFBRyxHQUN4QixJQUFLLElBQUk3MEwsRUFBSSxFQUFHQSxFQUFJLElBQUtBLEVBQ3ZCNjBMLEVBQVk3MEwsR0FBS3lHLEtBQUt5UixLQUFLNUssRUFBTTNLLE1BQU0sRUFBSTNDLEdBQUtpTSxFQUFRak0sSUFFMUQsTUFBTTI1TCxFQUFpQyxDQUFDLEVBQUcsR0FDM0MsSUFBSyxJQUFJMzVMLEVBQUksRUFBR0EsRUFBSSxJQUFLQSxFQUN2QjI1TCxFQUFhMzVMLEdBQUtpTSxFQUFRak0sSUFBTTYwTCxFQUFZNzBMLEdBQUssR0FBSzQwTCxFQUFjNTBMLEtBQzlEcVosRUFBTzFXLE1BQU0zQyxHQUFLLEdBQUsyYSxFQUFVM2EsR0FBSyxHQUFLc04sRUFBTTNLLE1BQU0sRUFBSTNDLEdBRW5FLElBQUssSUFBSUEsRUFBSSxFQUFHQSxFQUFJLElBQUtBLEVBQ3ZCMDhMLEVBQWMxOEwsRUFBSSxHQUFHLEdBQ2pCMjVMLEVBQWEzNUwsR0FBS3lHLEtBQUttSixNQUFNK3BMLEVBQWEzNUwsR0FBSyxHQUNuRDA4TCxFQUFjMThMLEVBQUksR0FBRyxHQUFLeUcsS0FBS21KLE1BQU0rcEwsRUFBYTM1TCxHQUFLLEdBSTdELE9BQU8wOEwsSSIsImZpbGUiOiJ3ZWJubi1wb2x5ZmlsbC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAwKTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgYnVmZmVyLCBEYXRhU3RvcmFnZSwgZW5naW5lLCBlbnYsIGtlcm5lbF9pbXBscywgS2VybmVsQmFja2VuZCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5jb25zdCB3aGVyZUltcGwgPSBrZXJuZWxfaW1wbHMud2hlcmVJbXBsO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4vY3B1X3V0aWwnO1xuZXhwb3J0IGNsYXNzIE1hdGhCYWNrZW5kQ1BVIGV4dGVuZHMgS2VybmVsQmFja2VuZCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuYmxvY2tTaXplID0gNDg7XG4gICAgICAgIHRoaXMuZmlyc3RVc2UgPSB0cnVlO1xuICAgICAgICB0aGlzLmRhdGEgPSBuZXcgRGF0YVN0b3JhZ2UodGhpcywgZW5naW5lKCkpO1xuICAgIH1cbiAgICBuZXh0RGF0YUlkKCkge1xuICAgICAgICByZXR1cm4gTWF0aEJhY2tlbmRDUFUubmV4dERhdGFJZCsrO1xuICAgIH1cbiAgICB3cml0ZSh2YWx1ZXMsIHNoYXBlLCBkdHlwZSkge1xuICAgICAgICBpZiAodGhpcy5maXJzdFVzZSkge1xuICAgICAgICAgICAgdGhpcy5maXJzdFVzZSA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKGVudigpLmdldCgnSVNfTk9ERScpKSB7XG4gICAgICAgICAgICAgICAgYmFja2VuZF91dGlsLndhcm4oJ1xcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT1cXG4nICtcbiAgICAgICAgICAgICAgICAgICAgJ0hpIHRoZXJlIPCfkYsuIExvb2tzIGxpa2UgeW91IGFyZSBydW5uaW5nIFRlbnNvckZsb3cuanMgaW4gJyArXG4gICAgICAgICAgICAgICAgICAgICdOb2RlLmpzLiBUbyBzcGVlZCB0aGluZ3MgdXAgZHJhbWF0aWNhbGx5LCBpbnN0YWxsIG91ciBub2RlICcgK1xuICAgICAgICAgICAgICAgICAgICAnYmFja2VuZCwgd2hpY2ggYmluZHMgdG8gVGVuc29yRmxvdyBDKyssIGJ5IHJ1bm5pbmcgJyArXG4gICAgICAgICAgICAgICAgICAgICducG0gaSBAdGVuc29yZmxvdy90ZmpzLW5vZGUsICcgK1xuICAgICAgICAgICAgICAgICAgICAnb3IgbnBtIGkgQHRlbnNvcmZsb3cvdGZqcy1ub2RlLWdwdSBpZiB5b3UgaGF2ZSBDVURBLiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ1RoZW4gY2FsbCByZXF1aXJlKFxcJ0B0ZW5zb3JmbG93L3RmanMtbm9kZVxcJyk7ICgtZ3B1ICcgK1xuICAgICAgICAgICAgICAgICAgICAnc3VmZml4IGZvciBDVURBKSBhdCB0aGUgc3RhcnQgb2YgeW91ciBwcm9ncmFtLiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ1Zpc2l0IGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RmanMtbm9kZSBmb3IgbW9yZSBkZXRhaWxzLicgK1xuICAgICAgICAgICAgICAgICAgICAnXFxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGFJZCA9IHsgaWQ6IHRoaXMubmV4dERhdGFJZCgpIH07XG4gICAgICAgIHRoaXMuZGF0YS5zZXQoZGF0YUlkLCB7IHZhbHVlcywgZHR5cGUsIHJlZkNvdW50OiAxIH0pO1xuICAgICAgICByZXR1cm4gZGF0YUlkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBkYXRhIGJ1Y2tldCBpbiBjcHUgYmFja2VuZC5cbiAgICAgKiBAcGFyYW0gc2hhcGUgU2hhcGUgb2YgdGhlIGBUZW5zb3JJbmZvYC5cbiAgICAgKiBAcGFyYW0gZHR5cGUgRFR5cGUgb2YgdGhlIGBUZW5zb3JJbmZvYC5cbiAgICAgKiBAcGFyYW0gdmFsdWVzIFRoZSB2YWx1ZSBvZiB0aGUgYFRlbnNvckluZm9gIHN0b3JlZCBhcyBhIGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKi9cbiAgICBtYWtlVGVuc29ySW5mbyhzaGFwZSwgZHR5cGUsIHZhbHVlcykge1xuICAgICAgICBsZXQgb3V0SWQ7XG4gICAgICAgIGlmIChkdHlwZSA9PT0gJ3N0cmluZycgJiYgdmFsdWVzICE9IG51bGwgJiYgdmFsdWVzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgIHV0aWwuaXNTdHJpbmcodmFsdWVzWzBdKSkge1xuICAgICAgICAgICAgY29uc3QgZW5jb2RlZFZhbHVlcyA9IHZhbHVlcy5tYXAoZCA9PiB1dGlsLmVuY29kZVN0cmluZyhkKSk7XG4gICAgICAgICAgICBvdXRJZCA9IHRoaXMud3JpdGUoZW5jb2RlZFZhbHVlcywgc2hhcGUsIGR0eXBlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG91dElkID0gdGhpcy53cml0ZSh2YWx1ZXMsIHNoYXBlLCBkdHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZGF0YUlkOiBvdXRJZCwgc2hhcGUsIGR0eXBlIH07XG4gICAgfVxuICAgIC8qKiBSZXR1cm4gcmVmQ291bnQgb2YgYSBgVGVuc29yRGF0YWAuICovXG4gICAgcmVmQ291bnQoZGF0YUlkKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGEuaGFzKGRhdGFJZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHRlbnNvckRhdGEgPSB0aGlzLmRhdGEuZ2V0KGRhdGFJZCk7XG4gICAgICAgICAgICByZXR1cm4gdGVuc29yRGF0YS5yZWZDb3VudDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgLyoqIEluY3JlYXNlIHJlZkNvdW50IG9mIGEgYFRlbnNvckRhdGFgLiAqL1xuICAgIGluY1JlZihkYXRhSWQpIHtcbiAgICAgICAgY29uc3QgdGVuc29yRGF0YSA9IHRoaXMuZGF0YS5nZXQoZGF0YUlkKTtcbiAgICAgICAgdGVuc29yRGF0YS5yZWZDb3VudCsrO1xuICAgIH1cbiAgICAvKiogRGVjcmVhc2UgcmVmQ291bnQgb2YgYSBgVGVuc29yRGF0YWAuICovXG4gICAgZGVjUmVmKGRhdGFJZCkge1xuICAgICAgICBpZiAodGhpcy5kYXRhLmhhcyhkYXRhSWQpKSB7XG4gICAgICAgICAgICBjb25zdCB0ZW5zb3JEYXRhID0gdGhpcy5kYXRhLmdldChkYXRhSWQpO1xuICAgICAgICAgICAgdGVuc29yRGF0YS5yZWZDb3VudC0tO1xuICAgICAgICB9XG4gICAgfVxuICAgIG1vdmUoZGF0YUlkLCB2YWx1ZXMsIHNoYXBlLCBkdHlwZSwgcmVmQ291bnQpIHtcbiAgICAgICAgdGhpcy5kYXRhLnNldChkYXRhSWQsIHsgdmFsdWVzLCBkdHlwZSwgcmVmQ291bnQgfSk7XG4gICAgfVxuICAgIG51bURhdGFJZHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEubnVtRGF0YUlkcygpO1xuICAgIH1cbiAgICBhc3luYyByZWFkKGRhdGFJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkU3luYyhkYXRhSWQpO1xuICAgIH1cbiAgICByZWFkU3luYyhkYXRhSWQpIHtcbiAgICAgICAgY29uc3QgeyBkdHlwZSwgY29tcGxleFRlbnNvckluZm9zIH0gPSB0aGlzLmRhdGEuZ2V0KGRhdGFJZCk7XG4gICAgICAgIGlmIChkdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlYWxWYWx1ZXMgPSB0aGlzLnJlYWRTeW5jKGNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsLmRhdGFJZCk7XG4gICAgICAgICAgICBjb25zdCBpbWFnVmFsdWVzID0gdGhpcy5yZWFkU3luYyhjb21wbGV4VGVuc29ySW5mb3MuaW1hZy5kYXRhSWQpO1xuICAgICAgICAgICAgcmV0dXJuIGJhY2tlbmRfdXRpbC5tZXJnZVJlYWxBbmRJbWFnQXJyYXlzKHJlYWxWYWx1ZXMsIGltYWdWYWx1ZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuZ2V0KGRhdGFJZCkudmFsdWVzO1xuICAgIH1cbiAgICBidWZmZXJTeW5jKHQpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMucmVhZFN5bmModC5kYXRhSWQpO1xuICAgICAgICBsZXQgZGVjb2RlZERhdGEgPSBkYXRhO1xuICAgICAgICBpZiAodC5kdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8gRGVjb2RlIHRoZSBieXRlcyBpbnRvIHN0cmluZy5cbiAgICAgICAgICAgICAgICBkZWNvZGVkRGF0YSA9IGRhdGEubWFwKGQgPT4gdXRpbC5kZWNvZGVTdHJpbmcoZCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZGVjb2RlIGVuY29kZWQgc3RyaW5nIGJ5dGVzIGludG8gdXRmLTgnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVmZmVyKHQuc2hhcGUsIHQuZHR5cGUsIGRlY29kZWREYXRhKTtcbiAgICB9XG4gICAgbWFrZU91dHB1dCh2YWx1ZXMsIHNoYXBlLCBkdHlwZSkge1xuICAgICAgICBjb25zdCBkYXRhSWQgPSB0aGlzLndyaXRlKHZhbHVlcywgc2hhcGUsIGR0eXBlKTtcbiAgICAgICAgcmV0dXJuIGVuZ2luZSgpLm1ha2VUZW5zb3JGcm9tRGF0YUlkKGRhdGFJZCwgc2hhcGUsIGR0eXBlLCB0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGlzcG9zZSB0aGUgbWVtb3J5IGlmIHRoZSBkYXRhSWQgaGFzIDAgcmVmQ291bnQuIFJldHVybiB0cnVlIGlmIHRoZSBtZW1vcnlcbiAgICAgKiBpcyByZWxlYXNlZCBvciBtZW1vcnkgaXMgbm90IG1hbmFnZWQgaW4gdGhpcyBiYWNrZW5kLCBmYWxzZSBpZiBtZW1vcnkgaXNcbiAgICAgKiBub3QgY2xlYXJlZC5cbiAgICAgKiBAcGFyYW0gZGF0YUlkXG4gICAgICogQG9hcmFtIGZvcmNlIE9wdGlvbmFsLCByZW1vdmUgdGhlIGRhdGEgcmVnYXJkbGVzcyBvZiByZWZDb3VudFxuICAgICAqL1xuICAgIGRpc3Bvc2VEYXRhKGRhdGFJZCwgZm9yY2UgPSBmYWxzZSkge1xuICAgICAgICBpZiAodGhpcy5kYXRhLmhhcyhkYXRhSWQpKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGEuZ2V0KGRhdGFJZCkucmVmQ291bnQtLTtcbiAgICAgICAgICAgIGlmICghZm9yY2UgJiYgdGhpcy5kYXRhLmdldChkYXRhSWQpLnJlZkNvdW50ID4gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgY29tcGxleFRlbnNvckluZm9zIH0gPSB0aGlzLmRhdGEuZ2V0KGRhdGFJZCk7XG4gICAgICAgICAgICBpZiAoY29tcGxleFRlbnNvckluZm9zICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3Bvc2VEYXRhKGNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsLmRhdGFJZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwb3NlRGF0YShjb21wbGV4VGVuc29ySW5mb3MuaW1hZy5kYXRhSWQsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5kYXRhLmRlbGV0ZShkYXRhSWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBkaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0ZW5zb3JJbmZvKSB7XG4gICAgICAgIHRoaXMuZGlzcG9zZURhdGEodGVuc29ySW5mby5kYXRhSWQpO1xuICAgIH1cbiAgICBhc3luYyB0aW1lKGYpIHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSB1dGlsLm5vdygpO1xuICAgICAgICBmKCk7XG4gICAgICAgIGNvbnN0IGtlcm5lbE1zID0gdXRpbC5ub3coKSAtIHN0YXJ0O1xuICAgICAgICByZXR1cm4geyBrZXJuZWxNcyB9O1xuICAgIH1cbiAgICBtZW1vcnkoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAvLyBVbnJlbGlhYmxlIGR1ZSB0byBhdXRvbWF0aWMgZ2MuIFRoZSBudW1iZXJzIGFib3ZlIGFyZSBjdW11bGF0aXZlLlxuICAgICAgICAgICAgdW5yZWxpYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHJlYXNvbnM6IFsnVGhlIHJlcG9ydGVkIG1lbW9yeSBpcyBhbiB1cHBlciBib3VuZC4gRHVlIHRvIGF1dG9tYXRpYyBnYXJiYWdlICcgK1xuICAgICAgICAgICAgICAgICAgICAnY29sbGVjdGlvbiwgdGhlIHRydWUgYWxsb2NhdGVkIG1lbW9yeSBtYXkgYmUgbGVzcy4nXVxuICAgICAgICB9O1xuICAgIH1cbiAgICB3aGVyZShjb25kaXRpb24pIHtcbiAgICAgICAgYXNzZXJ0Tm90Q29tcGxleChbY29uZGl0aW9uXSwgJ3doZXJlJyk7XG4gICAgICAgIGNvbnN0IGNvbmRWYWxzID0gdGhpcy5yZWFkU3luYyhjb25kaXRpb24uZGF0YUlkKTtcbiAgICAgICAgcmV0dXJuIHdoZXJlSW1wbChjb25kaXRpb24uc2hhcGUsIGNvbmRWYWxzKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHsgfVxuICAgIGZsb2F0UHJlY2lzaW9uKCkge1xuICAgICAgICByZXR1cm4gMzI7XG4gICAgfVxuICAgIC8qKiBSZXR1cm5zIHRoZSBzbWFsbGVzdCByZXByZXNlbnRhYmxlIG51bWJlci4gICovXG4gICAgZXBzaWxvbigpIHtcbiAgICAgICAgcmV0dXJuIHN1cGVyLmVwc2lsb24oKTtcbiAgICB9XG59XG5NYXRoQmFja2VuZENQVS5uZXh0RGF0YUlkID0gMDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJhY2tlbmRfY3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qXG4gKiBiYXNlLnRzIGNvbnRhaW5zIGFsbCB0aGUgZXhwb3J0cyBmcm9tIHRmanMtYmFja2VuZC1jcHVcbiAqIHdpdGhvdXQgYXV0by1rZXJuZWwgcmVnaXN0cmF0aW9uXG4gKi9cbmltcG9ydCB7IHJlZ2lzdGVyQmFja2VuZCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBNYXRoQmFja2VuZENQVSB9IGZyb20gJy4vYmFja2VuZF9jcHUnO1xuaW1wb3J0ICogYXMgc2hhcmVkIGZyb20gJy4vc2hhcmVkJztcbmV4cG9ydCB7IE1hdGhCYWNrZW5kQ1BVIH0gZnJvbSAnLi9iYWNrZW5kX2NwdSc7XG5leHBvcnQgeyB2ZXJzaW9uIGFzIHZlcnNpb25fY3B1IH0gZnJvbSAnLi92ZXJzaW9uJztcbmV4cG9ydCB7IHNoYXJlZCB9O1xuLy8gU2lkZSBlZmZlY3RzIGZvciBkZWZhdWx0IGluaXRpYWxpemF0aW9uIG9mIE1hdGhCYWNrZW5kQ1BVXG5yZWdpc3RlckJhY2tlbmQoJ2NwdScsICgpID0+IG5ldyBNYXRoQmFja2VuZENQVSgpLCAxIC8qIHByaW9yaXR5ICovKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJhc2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Tm90Q29tcGxleCh0ZW5zb3IsIG9wTmFtZSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh0ZW5zb3IpKSB7XG4gICAgICAgIHRlbnNvciA9IFt0ZW5zb3JdO1xuICAgIH1cbiAgICB0ZW5zb3IuZm9yRWFjaCh0ID0+IHtcbiAgICAgICAgaWYgKHQgIT0gbnVsbCkge1xuICAgICAgICAgICAgdXRpbC5hc3NlcnQodC5kdHlwZSAhPT0gJ2NvbXBsZXg2NCcsICgpID0+IGAke29wTmFtZX0gZG9lcyBub3Qgc3VwcG9ydCBjb21wbGV4NjQgdGVuc29ycyBpbiB0aGUgQ1BVIGJhY2tlbmQuYCk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNwdV91dGlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8vIEFsbCBleHBvcnRzIGZyb20gdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBpbiBiYXNlLlxuZXhwb3J0ICogZnJvbSAnLi9iYXNlJztcbmltcG9ydCAnLi9yZWdpc3Rlcl9hbGxfa2VybmVscyc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQWJzLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5leHBvcnQgZnVuY3Rpb24gc2ltcGxlQWJzSW1wbCh2YWxzKSB7XG4gICAgY29uc3QgcmVzdWx0VmFsdWVzID0gbmV3IEZsb2F0MzJBcnJheSh2YWxzLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHJlc3VsdFZhbHVlc1tpXSA9IE1hdGguYWJzKHZhbHNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0VmFsdWVzO1xufVxuZXhwb3J0IGNvbnN0IGFicyA9IChhcmdzKSA9PiB7XG4gICAgY29uc3QgeyB4IH0gPSBhcmdzLmlucHV0cztcbiAgICBjb25zdCBjcHVCYWNrZW5kID0gYXJncy5iYWNrZW5kO1xuICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ2FicycpO1xuICAgIGxldCByZXN1bHRWYWx1ZXMgPSBuZXcgRmxvYXQzMkFycmF5KHV0aWwuc2l6ZUZyb21TaGFwZSh4LnNoYXBlKSk7XG4gICAgY29uc3QgdmFsdWVzID0gY3B1QmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgIHJlc3VsdFZhbHVlcyA9IHNpbXBsZUFic0ltcGwodmFsdWVzKTtcbiAgICByZXR1cm4gY3B1QmFja2VuZC5tYWtlT3V0cHV0KHJlc3VsdFZhbHVlcywgeC5zaGFwZSwgJ2Zsb2F0MzInKTtcbn07XG5leHBvcnQgY29uc3QgYWJzQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEFicyxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogYWJzLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFicy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQWNvcyB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgYWNvcyA9IHVuYXJ5S2VybmVsRnVuYyhBY29zLCAoeGkpID0+IE1hdGguYWNvcyh4aSkpO1xuZXhwb3J0IGNvbnN0IGFjb3NDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQWNvcyxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogYWNvcyxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BY29zLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBY29zaCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgYWNvc2ggPSB1bmFyeUtlcm5lbEZ1bmMoQWNvc2gsICh4aSkgPT4gTWF0aC5hY29zaCh4aSkpO1xuZXhwb3J0IGNvbnN0IGFjb3NoQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEFjb3NoLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBhY29zaCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BY29zaC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBZGQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMsIGNyZWF0ZUNvbXBsZXhCaW5hcnlLZXJuZWxJbXBsIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBhZGRJbXBsID0gY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoKGEsIGIpID0+IGEgKyBiKSk7XG5leHBvcnQgY29uc3QgYWRkQ29tcGxleEltcGwgPSBjcmVhdGVDb21wbGV4QmluYXJ5S2VybmVsSW1wbCgoKGFSZWFsLCBhSW1hZywgYlJlYWwsIGJJbWFnKSA9PiB7XG4gICAgcmV0dXJuIHsgcmVhbDogYVJlYWwgKyBiUmVhbCwgaW1hZzogYUltYWcgKyBiSW1hZyB9O1xufSkpO1xuZXhwb3J0IGNvbnN0IGFkZCA9IGJpbmFyeUtlcm5lbEZ1bmMoQWRkLCBhZGRJbXBsLCBhZGRDb21wbGV4SW1wbCk7XG5leHBvcnQgY29uc3QgYWRkQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEFkZCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogYWRkXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QWRkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEFkZE4sIGJ1ZmZlciB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIGFkZE4oYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHRlbnNvcnMgPSBpbnB1dHM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChpbnB1dHMsICdhZGROJyk7XG4gICAgY29uc3QgdmFscyA9IHRlbnNvcnMubWFwKHQgPT4gYmFja2VuZC5kYXRhLmdldCh0LmRhdGFJZCkudmFsdWVzKTtcbiAgICBjb25zdCBvdXRCdWYgPSBidWZmZXIodGVuc29yc1swXS5zaGFwZSwgdGVuc29yc1swXS5kdHlwZSk7XG4gICAgY29uc3Qgb3V0VmFscyA9IG91dEJ1Zi52YWx1ZXM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZW5zb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGN1cnJWYWxzID0gdmFsc1tpXTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBvdXRWYWxzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBvdXRWYWxzW2pdICs9IGN1cnJWYWxzW2pdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dEJ1Zi5zaGFwZSwgb3V0QnVmLmR0eXBlLCBvdXRCdWYudmFsdWVzKTtcbn1cbmV4cG9ydCBjb25zdCBhZGROQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEFkZE4sXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGFkZE5cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BZGROLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEFsbCwgYmFja2VuZF91dGlsLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7IHRyYW5zcG9zZSB9IGZyb20gJy4vVHJhbnNwb3NlJztcbmV4cG9ydCBmdW5jdGlvbiBhbGwoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGF4aXMsIGtlZXBEaW1zIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KHgsICdhbGwnKTtcbiAgICBjb25zdCBvcmlnQXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG4gICAgbGV0IGF4ZXMgPSBvcmlnQXhlcztcbiAgICBjb25zdCBwZXJtdXRlZEF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKGF4ZXMsIHguc2hhcGUubGVuZ3RoKTtcbiAgICBsZXQgJHggPSB4O1xuICAgIGlmIChwZXJtdXRlZEF4ZXMgIT0gbnVsbCkge1xuICAgICAgICAkeCA9IHRyYW5zcG9zZSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHBlcm06IHBlcm11dGVkQXhlcyB9IH0pO1xuICAgICAgICBheGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoYXhlcy5sZW5ndGgsIHguc2hhcGUubGVuZ3RoKTtcbiAgICB9XG4gICAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdhbGwnLCBheGVzLCAkeC5zaGFwZS5sZW5ndGgpO1xuICAgIGNvbnN0IFtvdXRTaGFwZSwgcmVkdWNlU2hhcGVdID0gYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMoJHguc2hhcGUsIGF4ZXMpO1xuICAgIGNvbnN0IHJlZHVjZVNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuICAgIGNvbnN0IHZhbHMgPSB1dGlsLm1ha2VaZXJvc1R5cGVkQXJyYXkodXRpbC5zaXplRnJvbVNoYXBlKG91dFNoYXBlKSwgJHguZHR5cGUpO1xuICAgIGNvbnN0IGFWYWxzID0gYmFja2VuZC5kYXRhLmdldCgkeC5kYXRhSWQpLnZhbHVlcztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gaSAqIHJlZHVjZVNpemU7XG4gICAgICAgIGxldCBhbGwgPSBhVmFsc1tvZmZzZXRdO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJlZHVjZVNpemU7ICsraikge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhVmFsc1tvZmZzZXQgKyBqXTtcbiAgICAgICAgICAgIGFsbCA9IGFsbCAmJiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICB2YWxzW2ldID0gYWxsO1xuICAgIH1cbiAgICBpZiAocGVybXV0ZWRBeGVzICE9IG51bGwpIHtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbygkeCk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0U2hhcGUsICR4LmR0eXBlLCB2YWxzKTtcbiAgICBpZiAoa2VlcERpbXMpIHtcbiAgICAgICAgY29uc3QgZXhwYW5kZWRTaGFwZSA9IGJhY2tlbmRfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbShvdXRTaGFwZSwgb3JpZ0F4ZXMpO1xuICAgICAgICBjb25zdCByZXNoYXBlZFJlc3VsdCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogcmVzdWx0IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBleHBhbmRlZFNoYXBlIH0gfSk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHJlc2hhcGVkUmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGNvbnN0IGFsbENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBBbGwsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGFsbFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFsbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBbnksIGJhY2tlbmRfdXRpbCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQgeyB0cmFuc3Bvc2UgfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5leHBvcnQgZnVuY3Rpb24gYW55KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBheGlzLCBrZWVwRGltcyB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnYW55Jyk7XG4gICAgY29uc3Qgb3JpZ0F4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpO1xuICAgIGxldCBheGVzID0gb3JpZ0F4ZXM7XG4gICAgY29uc3QgcGVybXV0ZWRBeGVzID0gYmFja2VuZF91dGlsLmdldEF4ZXNQZXJtdXRhdGlvbihheGVzLCB4LnNoYXBlLmxlbmd0aCk7XG4gICAgbGV0ICR4ID0geDtcbiAgICBpZiAocGVybXV0ZWRBeGVzICE9IG51bGwpIHtcbiAgICAgICAgJHggPSB0cmFuc3Bvc2UoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kLCBhdHRyczogeyBwZXJtOiBwZXJtdXRlZEF4ZXMgfSB9KTtcbiAgICAgICAgYXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRJbm5lck1vc3RBeGVzKGF4ZXMubGVuZ3RoLCB4LnNoYXBlLmxlbmd0aCk7XG4gICAgfVxuICAgIGJhY2tlbmRfdXRpbC5hc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcygnYW55JywgYXhlcywgJHguc2hhcGUubGVuZ3RoKTtcbiAgICBjb25zdCBbb3V0U2hhcGUsIHJlZHVjZVNoYXBlXSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKCR4LnNoYXBlLCBheGVzKTtcbiAgICBjb25zdCByZWR1Y2VTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcbiAgICBjb25zdCB2YWxzID0gdXRpbC5tYWtlWmVyb3NUeXBlZEFycmF5KHV0aWwuc2l6ZUZyb21TaGFwZShvdXRTaGFwZSksICR4LmR0eXBlKTtcbiAgICBjb25zdCBhVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoJHguZGF0YUlkKS52YWx1ZXM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGkgKiByZWR1Y2VTaXplO1xuICAgICAgICBsZXQgYW55VmFsID0gYVZhbHNbb2Zmc2V0XTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByZWR1Y2VTaXplOyArK2opIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYVZhbHNbb2Zmc2V0ICsgal07XG4gICAgICAgICAgICBhbnlWYWwgPSBhbnlWYWwgfHwgdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFsc1tpXSA9IGFueVZhbDtcbiAgICB9XG4gICAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oJHgpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dFNoYXBlLCAkeC5kdHlwZSwgdmFscyk7XG4gICAgaWYgKGtlZXBEaW1zKSB7XG4gICAgICAgIGNvbnN0IGV4cGFuZGVkU2hhcGUgPSBiYWNrZW5kX3V0aWwuZXhwYW5kU2hhcGVUb0tlZXBEaW0ob3V0U2hhcGUsIG9yaWdBeGVzKTtcbiAgICAgICAgY29uc3QgcmVzaGFwZWRSZXN1bHQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHJlc3VsdCB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogZXhwYW5kZWRTaGFwZSB9IH0pO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc3VsdCk7XG4gICAgICAgIHJldHVybiByZXNoYXBlZFJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBjb25zdCBhbnlDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQW55LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBhbnlcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BbnkuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQXJnTWF4LCBiYWNrZW5kX3V0aWwsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7IHRyYW5zcG9zZSB9IGZyb20gJy4vVHJhbnNwb3NlJztcbmV4cG9ydCBmdW5jdGlvbiBhcmdNYXgoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGF4aXMgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ2FyZ01heCcpO1xuICAgIGxldCBheGVzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShheGlzLCB4LnNoYXBlKTtcbiAgICBjb25zdCBwZXJtdXRlZEF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKGF4ZXMsIHguc2hhcGUubGVuZ3RoKTtcbiAgICBsZXQgJHggPSB4O1xuICAgIGNvbnN0IGludGVybWVkaWF0ZVRlbnNvckluZm9zID0gW107XG4gICAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgICAgICR4ID0gdHJhbnNwb3NlKHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCwgYXR0cnM6IHsgcGVybTogcGVybXV0ZWRBeGVzIH0gfSk7XG4gICAgICAgIGludGVybWVkaWF0ZVRlbnNvckluZm9zLnB1c2goJHgpO1xuICAgICAgICBheGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoYXhlcy5sZW5ndGgsICR4LnNoYXBlLmxlbmd0aCk7XG4gICAgfVxuICAgIGF4ZXMgPSBbYXhlc1swXV07XG4gICAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdhcmdNYXgnLCBheGVzLCAkeC5zaGFwZS5sZW5ndGgpO1xuICAgIGNvbnN0IFtvdXRTaGFwZSwgcmVkdWNlU2hhcGVdID0gYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMoJHguc2hhcGUsIGF4ZXMpO1xuICAgIGNvbnN0IG91dFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUob3V0U2hhcGUpO1xuICAgIGNvbnN0IHZhbHMgPSB1dGlsLm1ha2VaZXJvc1R5cGVkQXJyYXkob3V0U2l6ZSwgJ2ludDMyJyk7XG4gICAgY29uc3QgcmVkdWNlU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShyZWR1Y2VTaGFwZSk7XG4gICAgY29uc3QgYVZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KCR4LmRhdGFJZCkudmFsdWVzO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBpICogcmVkdWNlU2l6ZTtcbiAgICAgICAgbGV0IG1heCA9IGFWYWxzW29mZnNldF07XG4gICAgICAgIGxldCBtYXhJbmRleCA9IDA7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmVkdWNlU2l6ZTsgKytqKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGFWYWxzW29mZnNldCArIGpdO1xuICAgICAgICAgICAgaWYgKHZhbHVlID4gbWF4KSB7XG4gICAgICAgICAgICAgICAgbWF4ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgbWF4SW5kZXggPSBqO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhbHNbaV0gPSBtYXhJbmRleDtcbiAgICB9XG4gICAgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dFNoYXBlLCAnaW50MzInLCB2YWxzKTtcbn1cbmV4cG9ydCBjb25zdCBhcmdNYXhDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQXJnTWF4LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBhcmdNYXhcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BcmdNYXguanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQXJnTWluLCBiYWNrZW5kX3V0aWwsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7IHRyYW5zcG9zZSB9IGZyb20gJy4vVHJhbnNwb3NlJztcbmV4cG9ydCBmdW5jdGlvbiBhcmdNaW4oYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGF4aXMgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ2FyZ01pbicpO1xuICAgIGxldCBheGVzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShheGlzLCB4LnNoYXBlKTtcbiAgICBjb25zdCBwZXJtdXRlZEF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKGF4ZXMsIHguc2hhcGUubGVuZ3RoKTtcbiAgICBsZXQgJHggPSB4O1xuICAgIGNvbnN0IGludGVybWVkaWF0ZVRlbnNvckluZm9zID0gW107XG4gICAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgICAgICR4ID0gdHJhbnNwb3NlKHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCwgYXR0cnM6IHsgcGVybTogcGVybXV0ZWRBeGVzIH0gfSk7XG4gICAgICAgIGludGVybWVkaWF0ZVRlbnNvckluZm9zLnB1c2goJHgpO1xuICAgICAgICBheGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoYXhlcy5sZW5ndGgsICR4LnNoYXBlLmxlbmd0aCk7XG4gICAgfVxuICAgIGF4ZXMgPSBbYXhlc1swXV07XG4gICAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdhcmdNaW4nLCBheGVzLCAkeC5zaGFwZS5sZW5ndGgpO1xuICAgIGNvbnN0IFtvdXRTaGFwZSwgcmVkdWNlU2hhcGVdID0gYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMoJHguc2hhcGUsIGF4ZXMpO1xuICAgIGNvbnN0IG91dFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUob3V0U2hhcGUpO1xuICAgIGNvbnN0IHZhbHMgPSB1dGlsLm1ha2VaZXJvc1R5cGVkQXJyYXkob3V0U2l6ZSwgJ2ludDMyJyk7XG4gICAgY29uc3QgcmVkdWNlU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShyZWR1Y2VTaGFwZSk7XG4gICAgY29uc3QgYVZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KCR4LmRhdGFJZCkudmFsdWVzO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBpICogcmVkdWNlU2l6ZTtcbiAgICAgICAgbGV0IG1pbiA9IGFWYWxzW29mZnNldF07XG4gICAgICAgIGxldCBtaW5JbmRleCA9IDA7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmVkdWNlU2l6ZTsgKytqKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGFWYWxzW29mZnNldCArIGpdO1xuICAgICAgICAgICAgaWYgKHZhbHVlIDwgbWluKSB7XG4gICAgICAgICAgICAgICAgbWluID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgbWluSW5kZXggPSBqO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhbHNbaV0gPSBtaW5JbmRleDtcbiAgICB9XG4gICAgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dFNoYXBlLCAnaW50MzInLCB2YWxzKTtcbn1cbmV4cG9ydCBjb25zdCBhcmdNaW5Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQXJnTWluLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBhcmdNaW5cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BcmdNaW4uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEFzaW4gfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IGFzaW4gPSB1bmFyeUtlcm5lbEZ1bmMoQXNpbiwgKHhpKSA9PiBNYXRoLmFzaW4oeGkpKTtcbmV4cG9ydCBjb25zdCBhc2luQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEFzaW4sXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGFzaW4sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXNpbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQXNpbmggfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IGFzaW5oID0gdW5hcnlLZXJuZWxGdW5jKEFzaW5oLCAoeGkpID0+IE1hdGguYXNpbmgoeGkpKTtcbmV4cG9ydCBjb25zdCBhc2luaENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBBc2luaCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogYXNpbmgsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXNpbmguanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEF0YW4gfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IGF0YW4gPSB1bmFyeUtlcm5lbEZ1bmMoQXRhbiwgKHhpKSA9PiBNYXRoLmF0YW4oeGkpKTtcbmV4cG9ydCBjb25zdCBhdGFuQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEF0YW4sXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGF0YW4sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXRhbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQXRhbjIgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IGF0YW4ySW1wbCA9IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwoKGFWYWx1ZSwgYlZhbHVlKSA9PiBNYXRoLmF0YW4yKGFWYWx1ZSwgYlZhbHVlKSk7XG5leHBvcnQgY29uc3QgYXRhbjIgPSBiaW5hcnlLZXJuZWxGdW5jKEF0YW4yLCBhdGFuMkltcGwpO1xuZXhwb3J0IGNvbnN0IGF0YW4yQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEF0YW4yLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBhdGFuMixcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BdGFuMi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQXRhbmggfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IGF0YW5oID0gdW5hcnlLZXJuZWxGdW5jKEF0YW5oLCAoeGkpID0+IE1hdGguYXRhbmgoeGkpKTtcbmV4cG9ydCBjb25zdCBhdGFuaENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBBdGFuaCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogYXRhbmgsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXRhbmguanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQXZnUG9vbCwgYmFja2VuZF91dGlsLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyBwb29sIH0gZnJvbSAnLi4vdXRpbHMvcG9vbF91dGlscyc7XG5pbXBvcnQgeyBpZGVudGl0eSB9IGZyb20gJy4vSWRlbnRpdHknO1xuZXhwb3J0IGZ1bmN0aW9uIGF2Z1Bvb2woYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBhc3NlcnROb3RDb21wbGV4KHgsICdhdmdQb29sJyk7XG4gICAgY29uc3QgeyBmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSB9ID0gYXR0cnM7XG4gICAgY29uc3QgZGlsYXRpb25zID0gMTtcbiAgICB1dGlsLmFzc2VydChiYWNrZW5kX3V0aWwuZWl0aGVyU3RyaWRlc09yRGlsYXRpb25zQXJlT25lKHN0cmlkZXMsIGRpbGF0aW9ucyksICgpID0+ICdFcnJvciBpbiBhdmdQb29sOiBFaXRoZXIgc3RyaWRlcyBvciBkaWxhdGlvbnMgbXVzdCBiZSAxLiAnICtcbiAgICAgICAgYEdvdCBzdHJpZGVzICR7c3RyaWRlc30gYW5kIGRpbGF0aW9ucyAnJHtkaWxhdGlvbnN9J2ApO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVQb29sMkRJbmZvKHguc2hhcGUsIGZpbHRlclNpemUsIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpO1xuICAgIGxldCByZXM7XG4gICAgaWYgKGNvbnZJbmZvLmZpbHRlcldpZHRoID09PSAxICYmIGNvbnZJbmZvLmZpbHRlckhlaWdodCA9PT0gMSAmJlxuICAgICAgICB1dGlsLmFycmF5c0VxdWFsKGNvbnZJbmZvLmluU2hhcGUsIGNvbnZJbmZvLm91dFNoYXBlKSkge1xuICAgICAgICByZXMgPSBpZGVudGl0eSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCB4VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgICAgICBjb25zdCBzdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyh4LnNoYXBlKTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gcG9vbCh4VmFsdWVzLCB4LnNoYXBlLCB4LmR0eXBlLCBzdHJpZGVzLCBjb252SW5mbywgJ2F2ZycpO1xuICAgICAgICByZXMgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGNvbnZJbmZvLm91dFNoYXBlLCB4LmR0eXBlLCBidWZmZXIudmFsdWVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydCBjb25zdCBhdmdQb29sQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEF2Z1Bvb2wsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGF2Z1Bvb2xcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BdmdQb29sLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEF2Z1Bvb2wzRCwgYmFja2VuZF91dGlsLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyBwb29sM2QgfSBmcm9tICcuLi91dGlscy9wb29sX3V0aWxzJztcbmV4cG9ydCBmdW5jdGlvbiBhdmdQb29sM0QoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCBkYXRhRm9ybWF0IH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KHgsICdhdmdQb29sM2QnKTtcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlUG9vbDNESW5mbyh4LnNoYXBlLCBmaWx0ZXJTaXplLCBzdHJpZGVzLCAxIC8qIGRpbGF0aW9ucyAqLywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGRhdGFGb3JtYXQpO1xuICAgIGNvbnN0IHhWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3Qgb3V0QnVmID0gcG9vbDNkKHhWYWx1ZXMsIHguc2hhcGUsIHguZHR5cGUsIHV0aWwuY29tcHV0ZVN0cmlkZXMoeC5zaGFwZSksIGNvbnZJbmZvLCAnYXZnJyk7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0QnVmLnNoYXBlLCAnZmxvYXQzMicsIG91dEJ1Zi52YWx1ZXMpO1xufVxuZXhwb3J0IGNvbnN0IGF2Z1Bvb2wzRENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBBdmdQb29sM0QsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGF2Z1Bvb2wzRFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUF2Z1Bvb2wzRC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBdmdQb29sM0RHcmFkLCBiYWNrZW5kX3V0aWwsIGJ1ZmZlciB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIGF2Z1Bvb2wzREdyYWQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGR5LCBpbnB1dCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGUgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoW2R5LCBpbnB1dF0sICdhdmdQb29sM0RHcmFkJyk7XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wzREluZm8oaW5wdXQuc2hhcGUsIGZpbHRlclNpemUsIHN0cmlkZXMsIDEgLyogZGlsYXRpb25zICovLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSk7XG4gICAgY29uc3Qgc3RyaWRlRGVwdGggPSBjb252SW5mby5zdHJpZGVEZXB0aDtcbiAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBmaWx0ZXJEZXB0aCA9IGNvbnZJbmZvLmZpbHRlckRlcHRoO1xuICAgIGNvbnN0IGZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmZpbHRlckhlaWdodDtcbiAgICBjb25zdCBmaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmZpbHRlcldpZHRoO1xuICAgIGNvbnN0IGRpbGF0aW9uRGVwdGggPSBjb252SW5mby5kaWxhdGlvbkRlcHRoO1xuICAgIGNvbnN0IGRpbGF0aW9uSGVpZ2h0ID0gY29udkluZm8uZGlsYXRpb25IZWlnaHQ7XG4gICAgY29uc3QgZGlsYXRpb25XaWR0aCA9IGNvbnZJbmZvLmRpbGF0aW9uV2lkdGg7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVyRGVwdGggPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJEZXB0aDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJIZWlnaHQ7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVyV2lkdGggPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJXaWR0aDtcbiAgICBjb25zdCBwYWRGcm9udCA9IGVmZmVjdGl2ZUZpbHRlckRlcHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8uZnJvbnQ7XG4gICAgY29uc3QgcGFkTGVmdCA9IGVmZmVjdGl2ZUZpbHRlcldpZHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICBjb25zdCBwYWRUb3AgPSBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgLSAxIC0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgZHggPSBidWZmZXIoaW5wdXQuc2hhcGUsICdmbG9hdDMyJyk7XG4gICAgY29uc3QgYXZnTXVsdGlwbGllciA9IDEgLyAoZmlsdGVyRGVwdGggKiBmaWx0ZXJIZWlnaHQgKiBmaWx0ZXJXaWR0aCk7XG4gICAgY29uc3QgZHlCdWYgPSBiYWNrZW5kLmJ1ZmZlclN5bmMoZHkpO1xuICAgIGZvciAobGV0IGJhdGNoID0gMDsgYmF0Y2ggPCBjb252SW5mby5iYXRjaFNpemU7ICsrYmF0Y2gpIHtcbiAgICAgICAgZm9yIChsZXQgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBjb252SW5mby5pbkNoYW5uZWxzOyArK2NoYW5uZWwpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGR4RGVwdGggPSAwOyBkeERlcHRoIDwgY29udkluZm8uaW5EZXB0aDsgKytkeERlcHRoKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZHhSb3cgPSAwOyBkeFJvdyA8IGNvbnZJbmZvLmluSGVpZ2h0OyArK2R4Um93KSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGR4Q29sID0gMDsgZHhDb2wgPCBjb252SW5mby5pbldpZHRoOyArK2R4Q29sKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTaGFkZXIgY29kZSBiZWdpbnMuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkeURlcHRoQ29ybmVyID0gZHhEZXB0aCAtIHBhZEZyb250O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHlSb3dDb3JuZXIgPSBkeFJvdyAtIHBhZFRvcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGR5Q29sQ29ybmVyID0gZHhDb2wgLSBwYWRMZWZ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRvdFByb2QgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgd0RlcHRoID0gMDsgd0RlcHRoIDwgZWZmZWN0aXZlRmlsdGVyRGVwdGg7IHdEZXB0aCArPSBkaWxhdGlvbkRlcHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHlEZXB0aCA9IChkeURlcHRoQ29ybmVyICsgd0RlcHRoKSAvIHN0cmlkZURlcHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkeURlcHRoIDwgMCB8fCBkeURlcHRoID49IGNvbnZJbmZvLm91dERlcHRoIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoZHlEZXB0aCkgIT09IGR5RGVwdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHdSb3cgPSAwOyB3Um93IDwgZWZmZWN0aXZlRmlsdGVySGVpZ2h0OyB3Um93ICs9IGRpbGF0aW9uSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGR5Um93ID0gKGR5Um93Q29ybmVyICsgd1JvdykgLyBzdHJpZGVIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkeVJvdyA8IDAgfHwgZHlSb3cgPj0gY29udkluZm8ub3V0SGVpZ2h0IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLmZsb29yKGR5Um93KSAhPT0gZHlSb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHdDb2wgPSAwOyB3Q29sIDwgZWZmZWN0aXZlRmlsdGVyV2lkdGg7IHdDb2wgKz0gZGlsYXRpb25XaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHlDb2wgPSAoZHlDb2xDb3JuZXIgKyB3Q29sKSAvIHN0cmlkZVdpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR5Q29sIDwgMCB8fCBkeUNvbCA+PSBjb252SW5mby5vdXRXaWR0aCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoZHlDb2wpICE9PSBkeUNvbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGl4ZWwgPSBkeUJ1Zi5nZXQoYmF0Y2gsIGR5RGVwdGgsIGR5Um93LCBkeUNvbCwgY2hhbm5lbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3RQcm9kICs9IHBpeGVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZHguc2V0KGRvdFByb2QgKiBhdmdNdWx0aXBsaWVyLCBiYXRjaCwgZHhEZXB0aCwgZHhSb3csIGR4Q29sLCBjaGFubmVsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhkeC5zaGFwZSwgZHguZHR5cGUsIGR4LnZhbHVlcyk7XG59XG5leHBvcnQgY29uc3QgYXZnUG9vbDNER3JhZENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBBdmdQb29sM0RHcmFkLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBhdmdQb29sM0RHcmFkXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXZnUG9vbDNER3JhZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBdmdQb29sR3JhZCwgYmFja2VuZF91dGlsLCBidWZmZXIgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBhdmdQb29sR3JhZChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgZHksIGlucHV0IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeCA9IGlucHV0O1xuICAgIGFzc2VydE5vdENvbXBsZXgoW2R5LCBpbnB1dF0sICdhdmdQb29sR3JhZCcpO1xuICAgIGNvbnN0IHsgZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkIH0gPSBhdHRycztcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlUG9vbDJESW5mbyh4LnNoYXBlLCBmaWx0ZXJTaXplLCBzdHJpZGVzLCAxIC8qIGRpbGF0aW9ucyAqLywgcGFkKTtcbiAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBmaWx0ZXJIZWlnaHQgPSBjb252SW5mby5maWx0ZXJIZWlnaHQ7XG4gICAgY29uc3QgZmlsdGVyV2lkdGggPSBjb252SW5mby5maWx0ZXJXaWR0aDtcbiAgICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICAgIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckhlaWdodDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoO1xuICAgIGNvbnN0IHBhZExlZnQgPSBlZmZlY3RpdmVGaWx0ZXJXaWR0aCAtIDEgLSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgY29uc3QgcGFkVG9wID0gZWZmZWN0aXZlRmlsdGVySGVpZ2h0IC0gMSAtIGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IGR4ID0gYnVmZmVyKHguc2hhcGUsICdmbG9hdDMyJyk7XG4gICAgY29uc3QgYXZnTXVsdGlwbGllciA9IDEgLyAoZmlsdGVySGVpZ2h0ICogZmlsdGVyV2lkdGgpO1xuICAgIGNvbnN0IGR5RGF0YSA9IGJhY2tlbmQuZGF0YS5nZXQoZHkuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgZHlCdWYgPSBidWZmZXIoZHkuc2hhcGUsICdmbG9hdDMyJywgZHlEYXRhKTtcbiAgICBmb3IgKGxldCBiID0gMDsgYiA8IGNvbnZJbmZvLmJhdGNoU2l6ZTsgKytiKSB7XG4gICAgICAgIGZvciAobGV0IGQgPSAwOyBkIDwgY29udkluZm8uaW5DaGFubmVsczsgKytkKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBkeFIgPSAwOyBkeFIgPCBjb252SW5mby5pbkhlaWdodDsgKytkeFIpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBkeEMgPSAwOyBkeEMgPCBjb252SW5mby5pbldpZHRoOyArK2R4Qykge1xuICAgICAgICAgICAgICAgICAgICAvLyBTaGFkZXIgY29kZSBiZWdpbnMuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGR5UkNvcm5lciA9IGR4UiAtIHBhZFRvcDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZHlDQ29ybmVyID0gZHhDIC0gcGFkTGVmdDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRvdFByb2QgPSAwO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB3UiA9IDA7IHdSIDwgZWZmZWN0aXZlRmlsdGVySGVpZ2h0OyB3UiArPSBkaWxhdGlvbkhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHlSID0gKGR5UkNvcm5lciArIHdSKSAvIHN0cmlkZUhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkeVIgPCAwIHx8IGR5UiA+PSBjb252SW5mby5vdXRIZWlnaHQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLmZsb29yKGR5UikgIT09IGR5Uikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgd0MgPSAwOyB3QyA8IGVmZmVjdGl2ZUZpbHRlcldpZHRoOyB3QyArPSBkaWxhdGlvbldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHlDID0gKGR5Q0Nvcm5lciArIHdDKSAvIHN0cmlkZVdpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkeUMgPCAwIHx8IGR5QyA+PSBjb252SW5mby5vdXRXaWR0aCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLmZsb29yKGR5QykgIT09IGR5Qykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGl4ZWwgPSBkeUJ1Zi5nZXQoYiwgZHlSLCBkeUMsIGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdFByb2QgKz0gcGl4ZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZHguc2V0KGRvdFByb2QgKiBhdmdNdWx0aXBsaWVyLCBiLCBkeFIsIGR4QywgZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGR4LnNoYXBlLCBkeC5kdHlwZSwgZHgudmFsdWVzKTtcbn1cbmV4cG9ydCBjb25zdCBhdmdQb29sR3JhZENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBBdmdQb29sR3JhZCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogYXZnUG9vbEdyYWRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BdmdQb29sR3JhZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQmF0Y2hNYXRNdWwsIGJ1ZmZlciwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5leHBvcnQgZnVuY3Rpb24gYmF0Y2hNYXRNdWwoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGEsIGIgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHRyYW5zcG9zZUEsIHRyYW5zcG9zZUIgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoW2EsIGJdLCAnbWF0TXVsJyk7XG4gICAgY29uc3QgYVJhbmsgPSBhLnNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBiUmFuayA9IGIuc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IGlubmVyU2hhcGVBID0gdHJhbnNwb3NlQSA/IGEuc2hhcGVbYVJhbmsgLSAyXSA6IGEuc2hhcGVbYVJhbmsgLSAxXTtcbiAgICBjb25zdCBpbm5lclNoYXBlQiA9IHRyYW5zcG9zZUIgPyBiLnNoYXBlW2JSYW5rIC0gMV0gOiBiLnNoYXBlW2JSYW5rIC0gMl07XG4gICAgY29uc3Qgb3V0ZXJTaGFwZUEgPSB0cmFuc3Bvc2VBID8gYS5zaGFwZVthUmFuayAtIDFdIDogYS5zaGFwZVthUmFuayAtIDJdO1xuICAgIGNvbnN0IG91dGVyU2hhcGVCID0gdHJhbnNwb3NlQiA/IGIuc2hhcGVbYlJhbmsgLSAyXSA6IGIuc2hhcGVbYlJhbmsgLSAxXTtcbiAgICBjb25zdCBvdXRlckRpbXNBID0gYS5zaGFwZS5zbGljZSgwLCAtMik7XG4gICAgY29uc3Qgb3V0ZXJEaW1zQiA9IGIuc2hhcGUuc2xpY2UoMCwgLTIpO1xuICAgIGNvbnN0IGJhdGNoRGltQSA9IHV0aWwuc2l6ZUZyb21TaGFwZShvdXRlckRpbXNBKTtcbiAgICBjb25zdCBiYXRjaERpbUIgPSB1dGlsLnNpemVGcm9tU2hhcGUob3V0ZXJEaW1zQik7XG4gICAgY29uc3QgYmF0Y2hEaW1zQ29tcGF0aWJsZSA9IGJhdGNoRGltQSA9PT0gYmF0Y2hEaW1CIHx8IGJhdGNoRGltQSA9PT0gMSB8fCBiYXRjaERpbUIgPT09IDE7XG4gICAgdXRpbC5hc3NlcnQoYVJhbmsgPj0gMiAmJiBiUmFuayA+PSAyICYmIGJhdGNoRGltc0NvbXBhdGlibGUsICgpID0+IGBFcnJvciBpbiBtYXRNdWw6IHRoZSBpbnB1dCBiYXRjaCBkaW1lbnNpb25zIG11c3QgZWl0aGVyIGJlIHRoZSBgICtcbiAgICAgICAgYHNhbWUgb3IgYXQgbGVhc3Qgb25lIGlucHV0IGJhdGNoIGRpbWVuc2lvbiBtdXN0IGJlIDEuIEdvdCBpbnB1dCBgICtcbiAgICAgICAgYGJhdGNoIGRpbWVuc2lvbnMgb2YgKCR7b3V0ZXJEaW1zQX0pIGFuZCAoJHtvdXRlckRpbXNCfSkuYCk7XG4gICAgY29uc3Qgb3V0U2hhcGVPdXRlckRpbXMgPSBiYXRjaERpbUEgPiBiYXRjaERpbUIgPyBhLnNoYXBlLnNsaWNlKDAsIC0yKSA6IGIuc2hhcGUuc2xpY2UoMCwgLTIpO1xuICAgIGNvbnN0IG91dFNoYXBlID0gb3V0U2hhcGVPdXRlckRpbXMuY29uY2F0KFtvdXRlclNoYXBlQSwgb3V0ZXJTaGFwZUJdKTtcbiAgICB1dGlsLmFzc2VydChpbm5lclNoYXBlQSA9PT0gaW5uZXJTaGFwZUIsICgpID0+IGBFcnJvciBpbiBtYXRNdWw6IGlubmVyIHNoYXBlcyAoJHtpbm5lclNoYXBlQX0pIGFuZCAoYCArXG4gICAgICAgIGAke2lubmVyU2hhcGVCfSkgb2YgVGVuc29ycyB3aXRoIHNoYXBlcyAke2Euc2hhcGV9IGFuZCBgICtcbiAgICAgICAgYCR7Yi5zaGFwZX0gYW5kIHRyYW5zcG9zZUE9JHt0cmFuc3Bvc2VBfWAgK1xuICAgICAgICBgIGFuZCB0cmFuc3Bvc2VCPSR7dHJhbnNwb3NlQn0gbXVzdCBtYXRjaC5gKTtcbiAgICBjb25zdCBhM2RTaGFwZSA9IHRyYW5zcG9zZUEgPyBbYmF0Y2hEaW1BLCBpbm5lclNoYXBlQSwgb3V0ZXJTaGFwZUFdIDpcbiAgICAgICAgW2JhdGNoRGltQSwgb3V0ZXJTaGFwZUEsIGlubmVyU2hhcGVBXTtcbiAgICBjb25zdCBiM2RTaGFwZSA9IHRyYW5zcG9zZUIgPyBbYmF0Y2hEaW1CLCBvdXRlclNoYXBlQiwgaW5uZXJTaGFwZUJdIDpcbiAgICAgICAgW2JhdGNoRGltQiwgaW5uZXJTaGFwZUIsIG91dGVyU2hhcGVCXTtcbiAgICAvLyBUaGUgcmVzdCBvZiB0aGUgaW1wbGVtZW50YXRpb24gaXMgZGVzaWduZWQgdG8gb3BlcmF0ZSBvbiByYW5rLTMgdGVuc29yc1xuICAgIGNvbnN0IGEzZCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogYSB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogYTNkU2hhcGUgfSB9KTtcbiAgICBjb25zdCBiM2QgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IGIgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IGIzZFNoYXBlIH0gfSk7XG4gICAgY29uc3Qgc2hhcmVkRGltID0gdHJhbnNwb3NlQSA/IGEzZC5zaGFwZVsxXSA6IGEzZC5zaGFwZVsyXTtcbiAgICBjb25zdCBsZWZ0RGltID0gdHJhbnNwb3NlQSA/IGEzZC5zaGFwZVsyXSA6IGEzZC5zaGFwZVsxXTtcbiAgICBjb25zdCByaWdodERpbSA9IHRyYW5zcG9zZUIgPyBiM2Quc2hhcGVbMV0gOiBiM2Quc2hhcGVbMl07XG4gICAgY29uc3QgYmF0Y2hEaW0gPSBNYXRoLm1heChiYXRjaERpbUEsIGJhdGNoRGltQik7XG4gICAgY29uc3QgYTNkVmFsdWVzID0gYmFja2VuZC5kYXRhLmdldChhM2QuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgYjNkVmFsdWVzID0gYmFja2VuZC5kYXRhLmdldChiM2QuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgYTNkU3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoYTNkLnNoYXBlKTtcbiAgICBjb25zdCBiM2RTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhiM2Quc2hhcGUpO1xuICAgIGNvbnN0IFthQmF0Y2gsIGFPdXRlclN0ZXAsIGFJbm5lclN0ZXBdID0gdHJhbnNwb3NlQSA/XG4gICAgICAgIFthM2RTdHJpZGVzWzBdLCAxLCBhM2RTdHJpZGVzWzFdXSA6XG4gICAgICAgIFthM2RTdHJpZGVzWzBdLCBhM2RTdHJpZGVzWzFdLCAxXTtcbiAgICBjb25zdCBbYklubmVyU3RlcCwgYk91dGVyU3RlcCwgYkJhdGNoXSA9IHRyYW5zcG9zZUIgP1xuICAgICAgICBbMSwgYjNkU3RyaWRlc1sxXSwgYjNkU3RyaWRlc1swXV0gOlxuICAgICAgICBbYjNkU3RyaWRlc1sxXSwgMSwgYjNkU3RyaWRlc1swXV07XG4gICAgY29uc3Qgc2l6ZSA9IGxlZnREaW0gKiByaWdodERpbTtcbiAgICBjb25zdCByZXN1bHQgPSBidWZmZXIoW2JhdGNoRGltLCBsZWZ0RGltLCByaWdodERpbV0sIGEzZC5kdHlwZSk7XG4gICAgY29uc3QgcmVzVmFscyA9IHJlc3VsdC52YWx1ZXM7XG4gICAgY29uc3QgYmxvY2tTaXplID0gYmFja2VuZC5ibG9ja1NpemU7XG4gICAgZm9yIChsZXQgYmkgPSAwOyBiaSA8IGJhdGNoRGltOyBiaSsrKSB7XG4gICAgICAgIGZvciAobGV0IGkwID0gMDsgaTAgPCBsZWZ0RGltOyBpMCArPSBibG9ja1NpemUpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGowID0gMDsgajAgPCByaWdodERpbTsgajAgKz0gYmxvY2tTaXplKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgazAgPSAwOyBrMCA8IHNoYXJlZERpbTsgazAgKz0gYmxvY2tTaXplKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciB3aGVuIGJsb2NrU2l6ZSBkb2Vzbid0IGV2ZW5seSBkaXZpZGUgdGhlIGlucHV0XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlCbG9jayA9IE1hdGgubWluKGkwICsgYmxvY2tTaXplLCBsZWZ0RGltKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgakJsb2NrID0gTWF0aC5taW4oajAgKyBibG9ja1NpemUsIHJpZ2h0RGltKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qga0Jsb2NrID0gTWF0aC5taW4oazAgKyBibG9ja1NpemUsIHNoYXJlZERpbSk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBpMDsgaSA8IGlCbG9jazsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gajA7IGogPCBqQmxvY2s7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdW0gPSAwLjA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IGswOyBrIDwga0Jsb2NrOyBrKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmF0Y2hPZmZzZXRBID0gTWF0aC5taW4oYmksIGJhdGNoRGltQSAtIDEpICogYUJhdGNoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXRjaE9mZnNldEIgPSBNYXRoLm1pbihiaSwgYmF0Y2hEaW1CIC0gMSkgKiBiQmF0Y2g7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFWYWwgPSBhM2RWYWx1ZXNbYmF0Y2hPZmZzZXRBICsgaSAqIGFPdXRlclN0ZXAgKyBrICogYUlubmVyU3RlcF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJWYWwgPSBiM2RWYWx1ZXNbayAqIGJJbm5lclN0ZXAgKyBqICogYk91dGVyU3RlcCArIGJhdGNoT2Zmc2V0Ql07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSBhVmFsICogYlZhbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzVmFsc1tiaSAqIHNpemUgKyAoaSAqIHJpZ2h0RGltICsgaildICs9IHN1bTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGEzZCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhiM2QpO1xuICAgIC8vIHNldCBjb3JyZWN0IHNoYXBlIG9uIG91dHB1dC5cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRTaGFwZSwgcmVzdWx0LmR0eXBlLCByZXN1bHQudmFsdWVzKTtcbn1cbmV4cG9ydCBjb25zdCBiYXRjaE1hdE11bENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBCYXRjaE1hdE11bCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogYmF0Y2hNYXRNdWwsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QmF0Y2hNYXRNdWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRnVzZWRCYXRjaE5vcm0sIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBiYXRjaE5vcm0oYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHgsIHNjYWxlLCBvZmZzZXQsIG1lYW4sIHZhcmlhbmNlIH0gPSBpbnB1dHM7XG4gICAgdXRpbC5hc3NlcnQobWVhbi5zaGFwZS5sZW5ndGggPT09IHZhcmlhbmNlLnNoYXBlLmxlbmd0aCwgKCkgPT4gJ0JhdGNoIG5vcm1hbGl6YXRpb24gZ3JhZGllbnQgcmVxdWlyZXMgbWVhbiBhbmQgdmFyaWFuY2UgdG8gaGF2ZSAnICtcbiAgICAgICAgJ2VxdWFsIHJhbmtzLicpO1xuICAgIHV0aWwuYXNzZXJ0KG9mZnNldCA9PSBudWxsIHx8IG1lYW4uc2hhcGUubGVuZ3RoID09PSBvZmZzZXQuc2hhcGUubGVuZ3RoLCAoKSA9PiAnQmF0Y2ggbm9ybWFsaXphdGlvbiBncmFkaWVudCByZXF1aXJlcyBtZWFuIGFuZCBvZmZzZXQgdG8gaGF2ZSAnICtcbiAgICAgICAgJ2VxdWFsIHJhbmtzLicpO1xuICAgIHV0aWwuYXNzZXJ0KHNjYWxlID09IG51bGwgfHwgbWVhbi5zaGFwZS5sZW5ndGggPT09IHNjYWxlLnNoYXBlLmxlbmd0aCwgKCkgPT4gJ0JhdGNoIG5vcm1hbGl6YXRpb24gZ3JhZGllbnQgcmVxdWlyZXMgbWVhbiBhbmQgc2NhbGUgdG8gaGF2ZSAnICtcbiAgICAgICAgJ2VxdWFsIHJhbmtzLicpO1xuICAgIGFzc2VydE5vdENvbXBsZXgoW3gsIG1lYW4sIHZhcmlhbmNlLCBzY2FsZSwgb2Zmc2V0XSwgJ2JhdGNoTm9ybScpO1xuICAgIGxldCB7IHZhcmlhbmNlRXBzaWxvbiB9ID0gYXR0cnM7XG4gICAgaWYgKHZhcmlhbmNlRXBzaWxvbiA9PSBudWxsKSB7XG4gICAgICAgIHZhcmlhbmNlRXBzaWxvbiA9IDAuMDAxO1xuICAgIH1cbiAgICBjb25zdCB4VmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBtVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQobWVhbi5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCB2YXJWYWxzID0gYmFja2VuZC5kYXRhLmdldCh2YXJpYW5jZS5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBzVmFscyA9IHNjYWxlID8gYmFja2VuZC5kYXRhLmdldChzY2FsZS5kYXRhSWQpLnZhbHVlcyA6XG4gICAgICAgIG5ldyBGbG9hdDMyQXJyYXkoWzFdKTtcbiAgICBjb25zdCBvZmZWYWxzID0gb2Zmc2V0ID9cbiAgICAgICAgYmFja2VuZC5kYXRhLmdldChvZmZzZXQuZGF0YUlkKS52YWx1ZXMgOlxuICAgICAgICBuZXcgRmxvYXQzMkFycmF5KFswXSk7XG4gICAgY29uc3Qgb3V0VmFscyA9IG5ldyBGbG9hdDMyQXJyYXkoeFZhbHMubGVuZ3RoKTtcbiAgICBjb25zdCBvZmZWYWxzTGVuZ3RoID0gb2ZmVmFscy5sZW5ndGg7XG4gICAgY29uc3Qgc1ZhbHNMZW5ndGggPSBzVmFscy5sZW5ndGg7XG4gICAgY29uc3QgdmFyVmFsc0xlbmd0aCA9IHZhclZhbHMubGVuZ3RoO1xuICAgIGNvbnN0IG1WYWxzTGVuZ3RoID0gbVZhbHMubGVuZ3RoO1xuICAgIGxldCBvZmZpID0gMDtcbiAgICBsZXQgbWkgPSAwO1xuICAgIGxldCBzaSA9IDA7XG4gICAgbGV0IHZpID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHhWYWxzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIG91dFZhbHNbaV0gPSBvZmZWYWxzW29mZmkrK10gK1xuICAgICAgICAgICAgKHhWYWxzW2ldIC0gbVZhbHNbbWkrK10pICogc1ZhbHNbc2krK10gL1xuICAgICAgICAgICAgICAgIE1hdGguc3FydCh2YXJWYWxzW3ZpKytdICsgdmFyaWFuY2VFcHNpbG9uKTtcbiAgICAgICAgaWYgKG9mZmkgPj0gb2ZmVmFsc0xlbmd0aCkge1xuICAgICAgICAgICAgb2ZmaSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1pID49IG1WYWxzTGVuZ3RoKSB7XG4gICAgICAgICAgICBtaSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpID49IHNWYWxzTGVuZ3RoKSB7XG4gICAgICAgICAgICBzaSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZpID49IHZhclZhbHNMZW5ndGgpIHtcbiAgICAgICAgICAgIHZpID0gMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyh4LnNoYXBlLCB4LmR0eXBlLCBvdXRWYWxzKTtcbn1cbmV4cG9ydCBjb25zdCBiYXRjaE5vcm1Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRnVzZWRCYXRjaE5vcm0sXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGJhdGNoTm9ybSxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1CYXRjaE5vcm0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBCYXRjaFRvU3BhY2VORCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQgeyBzbGljZSB9IGZyb20gJy4vU2xpY2UnO1xuaW1wb3J0IHsgdHJhbnNwb3NlIH0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuZXhwb3J0IGZ1bmN0aW9uIGJhdGNoVG9TcGFjZU5EKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBibG9ja1NoYXBlLCBjcm9wcyB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChbeF0sICdiYXRjaFRvU3BhY2VORCcpO1xuICAgIGNvbnN0IHByb2QgPSBibG9ja1NoYXBlLnJlZHVjZSgoYSwgYikgPT4gYSAqIGIpO1xuICAgIGNvbnN0IHJlc2hhcGVkID0gYmFja2VuZF91dGlsLmdldFJlc2hhcGVkKHguc2hhcGUsIGJsb2NrU2hhcGUsIHByb2QpO1xuICAgIGNvbnN0IHBlcm11dGVkID0gYmFja2VuZF91dGlsLmdldFBlcm11dGVkKHJlc2hhcGVkLmxlbmd0aCwgYmxvY2tTaGFwZS5sZW5ndGgpO1xuICAgIGNvbnN0IHJlc2hhcGVkUGVybXV0ZWQgPSBiYWNrZW5kX3V0aWwuZ2V0UmVzaGFwZWRQZXJtdXRlZCh4LnNoYXBlLCBibG9ja1NoYXBlLCBwcm9kKTtcbiAgICBjb25zdCBzbGljZUJlZ2luQ29vcmRzID0gYmFja2VuZF91dGlsLmdldFNsaWNlQmVnaW5Db29yZHMoY3JvcHMsIGJsb2NrU2hhcGUubGVuZ3RoKTtcbiAgICBjb25zdCBzbGljZVNpemUgPSBiYWNrZW5kX3V0aWwuZ2V0U2xpY2VTaXplKHJlc2hhcGVkUGVybXV0ZWQsIGNyb3BzLCBibG9ja1NoYXBlLmxlbmd0aCk7XG4gICAgY29uc3QgeFJlc2hhcGVkID0gcmVzaGFwZSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiByZXNoYXBlZCB9IH0pO1xuICAgIGNvbnN0IHhUcmFuc3Bvc2VkID0gdHJhbnNwb3NlKHsgaW5wdXRzOiB7IHg6IHhSZXNoYXBlZCB9LCBiYWNrZW5kLCBhdHRyczogeyBwZXJtOiBwZXJtdXRlZCB9IH0pO1xuICAgIGNvbnN0IHhUcmFuc3Bvc2VkUmVzaGFwZWQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHhUcmFuc3Bvc2VkIH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiByZXNoYXBlZFBlcm11dGVkIH0gfSk7XG4gICAgY29uc3QgcmVzdWx0ID0gc2xpY2Uoe1xuICAgICAgICBpbnB1dHM6IHsgeDogeFRyYW5zcG9zZWRSZXNoYXBlZCB9LFxuICAgICAgICBiYWNrZW5kLFxuICAgICAgICBhdHRyczogeyBiZWdpbjogc2xpY2VCZWdpbkNvb3Jkcywgc2l6ZTogc2xpY2VTaXplIH1cbiAgICB9KTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHhSZXNoYXBlZCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh4VHJhbnNwb3NlZCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh4VHJhbnNwb3NlZFJlc2hhcGVkKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGNvbnN0IGJhdGNoVG9TcGFjZU5EQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEJhdGNoVG9TcGFjZU5ELFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBiYXRjaFRvU3BhY2VORFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJhdGNoVG9TcGFjZU5ELmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEJpbmNvdW50IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGJpbmNvdW50SW1wbCB9IGZyb20gJy4vQmluY291bnRfaW1wbCc7XG5leHBvcnQgZnVuY3Rpb24gYmluY291bnQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHgsIHdlaWdodHMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHNpemUgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHhWYWxzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHdlaWdodHNWYWxzID0gYmFja2VuZC5kYXRhLmdldCh3ZWlnaHRzLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IG91dFZhbHMgPSBiaW5jb3VudEltcGwoeFZhbHMsIHdlaWdodHNWYWxzLCB3ZWlnaHRzLmR0eXBlLCB3ZWlnaHRzLnNoYXBlLCBzaXplKTtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbc2l6ZV0sIHdlaWdodHMuZHR5cGUsIG91dFZhbHMpO1xufVxuZXhwb3J0IGNvbnN0IGJpbmNvdW50Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEJpbmNvdW50LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBiaW5jb3VudFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJpbmNvdW50LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJ1ZmZlciwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgZnVuY3Rpb24gYmluY291bnRJbXBsKHhWYWxzLCB3ZWlnaHRzVmFscywgd2VpZ2h0c0R0eXBlLCB3ZWlnaHRzU2hhcGUsIHNpemUpIHtcbiAgICBjb25zdCB3ZWlnaHRzU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSh3ZWlnaHRzU2hhcGUpO1xuICAgIGNvbnN0IG91dFZhbHMgPSB1dGlsLm1ha2VaZXJvc1R5cGVkQXJyYXkoc2l6ZSwgd2VpZ2h0c0R0eXBlKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHhWYWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0geFZhbHNbaV07XG4gICAgICAgIGlmICh2YWx1ZSA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW5wdXQgeCBtdXN0IGJlIG5vbi1uZWdhdGl2ZSEnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgPj0gc2l6ZSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdlaWdodHNTaXplID4gMCkge1xuICAgICAgICAgICAgb3V0VmFsc1t2YWx1ZV0gKz0gd2VpZ2h0c1ZhbHNbaV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvdXRWYWxzW3ZhbHVlXSArPSAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXRWYWxzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGJpbmNvdW50UmVkdWNlSW1wbCh4QnVmLCB3ZWlnaHRzQnVmLCBzaXplLCBiaW5hcnlPdXRwdXQgPSBmYWxzZSkge1xuICAgIGNvbnN0IG51bVJvd3MgPSB4QnVmLnNoYXBlWzBdO1xuICAgIGNvbnN0IG51bUNvbHMgPSB4QnVmLnNoYXBlWzFdO1xuICAgIGNvbnN0IG91dEJ1ZiA9IGJ1ZmZlcihbbnVtUm93cywgc2l6ZV0sIHdlaWdodHNCdWYuZHR5cGUpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtUm93czsgaSsrKSB7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbnVtQ29sczsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHhCdWYuZ2V0KGksIGopO1xuICAgICAgICAgICAgaWYgKHZhbHVlIDwgMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW5wdXQgeCBtdXN0IGJlIG5vbi1uZWdhdGl2ZSEnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YWx1ZSA+PSBzaXplKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYmluYXJ5T3V0cHV0KSB7XG4gICAgICAgICAgICAgICAgb3V0QnVmLnNldCgxLCBpLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAod2VpZ2h0c0J1Zi5zaXplID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBvdXRCdWYuc2V0KG91dEJ1Zi5nZXQoaSwgdmFsdWUpICsgd2VpZ2h0c0J1Zi5nZXQoaSwgaiksIGksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG91dEJ1Zi5zZXQob3V0QnVmLmdldChpLCB2YWx1ZSkgKyAxLCBpLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXRCdWY7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1CaW5jb3VudF9pbXBsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IENhc3QsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmltcG9ydCB7IHplcm9zIH0gZnJvbSAnLi4vdXRpbHMvemVyb3NfaW1wbCc7XG5pbXBvcnQgeyBjb21wbGV4IH0gZnJvbSAnLi9Db21wbGV4JztcbmltcG9ydCB7IGlkZW50aXR5IH0gZnJvbSAnLi9JZGVudGl0eSc7XG5pbXBvcnQgeyByZWFsIH0gZnJvbSAnLi9SZWFsJztcbmV4cG9ydCBmdW5jdGlvbiBjYXN0KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBkdHlwZSB9ID0gYXR0cnM7XG4gICAgLy8gQ2FzdGluZyB0byBjb21wbGV4NjQuXG4gICAgaWYgKGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICBpZiAoeC5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgICAgIHJldHVybiBpZGVudGl0eSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgemVyb3NUZW5zb3JJbmZvID0gemVyb3MoYmFja2VuZCwgeC5zaGFwZSwgeC5kdHlwZSk7XG4gICAgICAgIGNvbnN0IGZsb2F0WCA9IGNhc3QoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kLCBhdHRyczogeyBkdHlwZTogJ2Zsb2F0MzInIH0gfSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBsZXgoeyBpbnB1dHM6IHsgcmVhbDogZmxvYXRYLCBpbWFnOiB6ZXJvc1RlbnNvckluZm8gfSwgYmFja2VuZCB9KTtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh6ZXJvc1RlbnNvckluZm8pO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGZsb2F0WCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8vIENhc3RpbmcgZnJvbSBjb21wbGV4NjRcbiAgICBpZiAoeC5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgY29uc3QgcmVhbFBhcnQgPSByZWFsKHsgaW5wdXRzOiB7IGlucHV0OiB4IH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNhc3QoeyBpbnB1dHM6IHsgeDogcmVhbFBhcnQgfSwgYmFja2VuZCwgYXR0cnM6IHsgZHR5cGUgfSB9KTtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZWFsUGFydCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGlmICghdXRpbC5oYXNFbmNvZGluZ0xvc3MoeC5kdHlwZSwgZHR5cGUpKSB7XG4gICAgICAgIC8vIFdlIGRvbid0IGNoYW5nZSB0aGUgdW5kZXJseWluZyBkYXRhLCBzaW5jZSB3ZSBjYXN0IHRvIGhpZ2hlclxuICAgICAgICAvLyBwcmVjaXNpb24uXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGlkZW50aXR5KHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCB9KTtcbiAgICAgICAgcmV0dXJuIHsgZGF0YUlkOiByZXN1bHQuZGF0YUlkLCBzaGFwZTogcmVzdWx0LnNoYXBlLCBkdHlwZSB9O1xuICAgIH1cbiAgICBpZiAoZHR5cGUgPT09ICdpbnQzMicpIHtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgICAgICBjb25zdCByZXN1bHRWYWx1ZXMgPSBJbnQzMkFycmF5LmZyb20odmFsdWVzKTtcbiAgICAgICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oeC5zaGFwZSwgJ2ludDMyJywgcmVzdWx0VmFsdWVzKTtcbiAgICB9XG4gICAgaWYgKGR0eXBlID09PSAnYm9vbCcpIHtcbiAgICAgICAgLy8gVGhpcyBpcyBlc3NlbnRpYWxseSB0aGUgcmVzdWx0IG9mIG5vdEVxdWFsKHgsIDApLiBXZSBhdm9pZCB1c2luZ1xuICAgICAgICAvLyBrZXJuZWwgbm90RXF1YWwgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jeSwgaS5lLiBiaW5hcnlfdXRpbHMgLT5cbiAgICAgICAgLy8gY2FzdCAtPiBub3RFcXVhbCAtPiBiaW5hcnlfdXRpbHMuXG4gICAgICAgIGNvbnN0IHhWYWxzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgICAgICBjb25zdCB6ZXJvID0gdXRpbC50b1R5cGVkQXJyYXkoWzBdLCB4LmR0eXBlKTtcbiAgICAgICAgY29uc3QgW3Jlc3VsdERhdGEsIHJlc3VsdFNoYXBlXSA9IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwoKGEsIGIpID0+IChhICE9PSBiKSA/IDEgOiAwKSh4LnNoYXBlLCBbXSwgeFZhbHMsIHplcm8sICdib29sJyk7XG4gICAgICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHJlc3VsdFNoYXBlLCAnYm9vbCcsIHJlc3VsdERhdGEpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIENhc3Q6IGZhaWxlZCB0byBjYXN0ICR7eC5kdHlwZX0gdG8gJHtkdHlwZX1gKTtcbn1cbmV4cG9ydCBjb25zdCBjYXN0Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IENhc3QsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGNhc3Rcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DYXN0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBDZWlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVNpbXBsZVVuYXJ5SW1wbCB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X2ltcGwnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jRnJvbUltcGwgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgY2VpbEltcGwgPSBjcmVhdGVTaW1wbGVVbmFyeUltcGwoKHhpKSA9PiBNYXRoLmNlaWwoeGkpKTtcbmV4cG9ydCBjb25zdCBjZWlsID0gdW5hcnlLZXJuZWxGdW5jRnJvbUltcGwoQ2VpbCwgY2VpbEltcGwpO1xuZXhwb3J0IGNvbnN0IGNlaWxDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQ2VpbCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogY2VpbCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DZWlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBDbGlwQnlWYWx1ZSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgY2xpcCA9IHVuYXJ5S2VybmVsRnVuYyhDbGlwQnlWYWx1ZSwgKHhpLCBhdHRycykgPT4ge1xuICAgIGNvbnN0IGNsaXBBdHRycyA9IGF0dHJzO1xuICAgIGlmICh4aSA+IGNsaXBBdHRycy5jbGlwVmFsdWVNYXgpIHtcbiAgICAgICAgcmV0dXJuIGNsaXBBdHRycy5jbGlwVmFsdWVNYXg7XG4gICAgfVxuICAgIHJldHVybiB4aSA8IGNsaXBBdHRycy5jbGlwVmFsdWVNaW4gPyBjbGlwQXR0cnMuY2xpcFZhbHVlTWluIDogeGk7XG59KTtcbmV4cG9ydCBjb25zdCBjbGlwQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IENsaXBCeVZhbHVlLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBjbGlwLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNsaXAuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQ29tcGxleCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgZnVuY3Rpb24gY29tcGxleChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyByZWFsLCBpbWFnIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgcmVhbFZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHJlYWwuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgaW1hZ1ZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KGltYWcuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgY29tcGxleEluZm8gPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHJlYWwuc2hhcGUsICdjb21wbGV4NjQnKTtcbiAgICBjb25zdCBjb21wbGV4ID0gYmFja2VuZC5kYXRhLmdldChjb21wbGV4SW5mby5kYXRhSWQpO1xuICAgIC8vIFRoZSBjb21wbGV4IHRlbnNvciBvd25zIHRoZSB1bmRlcmx5aW5nIHJlYWwgYW5kIGltYWcgdGVuc29ySW5mb3MsIG9ubHkgdGhlXG4gICAgLy8gY29tcGxleCB0ZW5zb3IgdHJhY2tzIHJlZkNvdW50LCB3aGVuIGNvbXBsZXhEYXRhIGlzIGRpc3Bvc2VkIHRoZVxuICAgIC8vIHVuZGVybHlpbmcgdGVuc29yRGF0YSB3aWxsIGJlIGRpc3Bvc2VkLlxuICAgIGNvbXBsZXguY29tcGxleFRlbnNvckluZm9zID0ge1xuICAgICAgICByZWFsOiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHJlYWwuc2hhcGUsICdmbG9hdDMyJywgcmVhbFZhbHMpLFxuICAgICAgICBpbWFnOiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGltYWcuc2hhcGUsICdmbG9hdDMyJywgaW1hZ1ZhbHMpXG4gICAgfTtcbiAgICByZXR1cm4gY29tcGxleEluZm87XG59XG5leHBvcnQgY29uc3QgY29tcGxleENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBDb21wbGV4LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBjb21wbGV4XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29tcGxleC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQ29tcGxleEFicywgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgY29uc3QgY29tcGxleEFicyA9IChhcmdzKSA9PiB7XG4gICAgY29uc3QgeyB4IH0gPSBhcmdzLmlucHV0cztcbiAgICBjb25zdCBjcHVCYWNrZW5kID0gYXJncy5iYWNrZW5kO1xuICAgIGNvbnN0IHJlc3VsdFZhbHVlcyA9IG5ldyBGbG9hdDMyQXJyYXkodXRpbC5zaXplRnJvbVNoYXBlKHguc2hhcGUpKTtcbiAgICBjb25zdCBjb21wbGV4VmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpO1xuICAgIGNvbnN0IHJlYWwgPSBjb21wbGV4VmFscy5jb21wbGV4VGVuc29ySW5mb3MucmVhbDtcbiAgICBjb25zdCBpbWFnID0gY29tcGxleFZhbHMuY29tcGxleFRlbnNvckluZm9zLmltYWc7XG4gICAgY29uc3QgcmVhbFZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KHJlYWwuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgaW1hZ1ZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KGltYWcuZGF0YUlkKS52YWx1ZXM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWFsVmFscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCByZWFsID0gcmVhbFZhbHNbaV07XG4gICAgICAgIGNvbnN0IGltYWcgPSBpbWFnVmFsc1tpXTtcbiAgICAgICAgcmVzdWx0VmFsdWVzW2ldID0gTWF0aC5oeXBvdChyZWFsLCBpbWFnKTtcbiAgICB9XG4gICAgcmV0dXJuIGNwdUJhY2tlbmQubWFrZU91dHB1dChyZXN1bHRWYWx1ZXMsIHguc2hhcGUsICdmbG9hdDMyJyk7XG59O1xuZXhwb3J0IGNvbnN0IGNvbXBsZXhBYnNDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQ29tcGxleEFicyxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogY29tcGxleEFicyxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db21wbGV4QWJzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgQ29uY2F0LCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNvbXBsZXggfSBmcm9tICcuL0NvbXBsZXgnO1xuaW1wb3J0IHsgY29uY2F0SW1wbCB9IGZyb20gJy4vQ29uY2F0X2ltcGwnO1xuaW1wb3J0IHsgaWRlbnRpdHkgfSBmcm9tICcuL0lkZW50aXR5JztcbmltcG9ydCB7IGltYWcgfSBmcm9tICcuL0ltYWcnO1xuaW1wb3J0IHsgcmVhbCB9IGZyb20gJy4vUmVhbCc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmV4cG9ydCBmdW5jdGlvbiBjb25jYXQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGF4aXMgfSA9IGF0dHJzO1xuICAgIGNvbnN0ICRheGlzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShheGlzLCBpbnB1dHNbMF0uc2hhcGUpWzBdO1xuICAgIGxldCBvdXRTaGFwZSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0U2hhcGUoaW5wdXRzLm1hcCh0ID0+IHQuc2hhcGUpLCAkYXhpcyk7XG4gICAgaWYgKHV0aWwuc2l6ZUZyb21TaGFwZShvdXRTaGFwZSkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0U2hhcGUsIGlucHV0c1swXS5kdHlwZSwgW10pO1xuICAgIH1cbiAgICAvLyBLZWVwIG9ubHkgbm9uLWVtcHR5IHRlbnNvcnMgKGlnbm9yZSB0ZW5zb3JzIHdpdGggMCBpbiB0aGVpciBzaGFwZSkuXG4gICAgY29uc3QgJGlucHV0cyA9IGlucHV0cy5maWx0ZXIodCA9PiB1dGlsLnNpemVGcm9tU2hhcGUodC5zaGFwZSkgPiAwKTtcbiAgICBpZiAoJGlucHV0cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGlkZW50aXR5KHsgaW5wdXRzOiB7IHg6ICRpbnB1dHNbMF0gfSwgYmFja2VuZCB9KTtcbiAgICB9XG4gICAgY29uc3Qgc2hhcGVzID0gJGlucHV0cy5tYXAodCA9PiB0LnNoYXBlKTtcbiAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0UGFyYW1zQ29uc2lzdGVudChzaGFwZXMsICRheGlzKTtcbiAgICBpZiAoJGlucHV0c1swXS5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgY29uc3QgcmVhbHMgPSAkaW5wdXRzLm1hcCgodCkgPT4gcmVhbCh7IGlucHV0czogeyBpbnB1dDogdCB9LCBiYWNrZW5kIH0pKTtcbiAgICAgICAgY29uc3QgaW1hZ3MgPSAkaW5wdXRzLm1hcCgodCkgPT4gaW1hZyh7IGlucHV0czogeyBpbnB1dDogdCB9LCBiYWNrZW5kIH0pKTtcbiAgICAgICAgY29uc3QgcmVhbENvbmNhdGVkID0gY29uY2F0KHsgaW5wdXRzOiByZWFscywgYmFja2VuZCwgYXR0cnM6IHsgYXhpczogJGF4aXMgfSB9KTtcbiAgICAgICAgY29uc3QgaW1hZ0NvbmNhdGVkID0gY29uY2F0KHsgaW5wdXRzOiBpbWFncywgYmFja2VuZCwgYXR0cnM6IHsgYXhpczogJGF4aXMgfSB9KTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY29tcGxleCh7IGlucHV0czogeyByZWFsOiByZWFsQ29uY2F0ZWQsIGltYWc6IGltYWdDb25jYXRlZCB9LCBiYWNrZW5kIH0pO1xuICAgICAgICByZWFscy5mb3JFYWNoKHIgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyKSk7XG4gICAgICAgIGltYWdzLmZvckVhY2goaSA9PiBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGkpKTtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZWFsQ29uY2F0ZWQpO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGltYWdDb25jYXRlZCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8vIEFueSBjb25jYXQgb2Ygbi1kaW1lbnNpb25hbCB0ZW5zb3JzIGFjcm9zcyBhbnkgYXhpcyBjYW4gYmUgcmVkdWNlZCB0b1xuICAgIC8vIGEgY29uY2F0ZW5hdGlvbiBvZiB0d28tZGltZW5zaW9uYWwgdGVuc29ycyBhY3Jvc3MgdGhlIGF4aXMgMSBieSBmaXJzdFxuICAgIC8vIHBhcnRpdGlvbmluZyB0aGUgYXhlcyBvZiB0aGUgb3JpZ2luYWwgdGVuc29ycyBpbnRvIHRob3NlIGxlc3MgdGhhbiB0aGVcbiAgICAvLyBheGlzIHRvIGJlIGNvbmNhdGVuYXRlZCBhbmQgdGhlIHJlc3QuIFRoZW4gcmVzaGFwZSB0aGUgdGVuc29yc1xuICAgIC8vIGludG8gYSB0d28tZGltZW5zaW9uYWwgdGVuc29yIGJ5IGNvbGxhcHNpbmcgdGhlc2UgdHdvIHNldHMgb2YgYXhlcyBhbmRcbiAgICAvLyBjb25jYXRlbmF0ZSB0aGUgcmVzdWx0aW5nIG1hdHJpY2VzIGFjcm9zcyB0aGUgYXhpcyAxLCBmaW5hbGx5IHJlc2hhcGluZ1xuICAgIC8vIHRoZSByZXN1bHQgdG8gaGF2ZSB0aGUgcHJvcGVyIHNoYXBlLlxuICAgIGNvbnN0IGlucHV0czJEID0gJGlucHV0cy5tYXAodCA9PiB7XG4gICAgICAgIGNvbnN0IGlubmVyU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSh0LnNoYXBlLnNsaWNlKCRheGlzKSk7XG4gICAgICAgIGNvbnN0IHNoYXBlID0gWy0xLCBpbm5lclNpemVdO1xuICAgICAgICByZXR1cm4gcmVzaGFwZSh7IGlucHV0czogeyB4OiB0IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlIH0gfSk7XG4gICAgfSk7XG4gICAgY29uc3QgaW5wdXRzVmFsU2hhcGVzID0gaW5wdXRzMkQubWFwKHQgPT4ge1xuICAgICAgICByZXR1cm4geyB2YWxzOiBiYWNrZW5kLmRhdGEuZ2V0KHQuZGF0YUlkKS52YWx1ZXMsIHNoYXBlOiB0LnNoYXBlIH07XG4gICAgfSk7XG4gICAgLy8gQ29uY2F0cyAyZCB0ZW5zb3JzIGFsb25nIGF4aXM9MS5cbiAgICBvdXRTaGFwZSA9XG4gICAgICAgIGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0U2hhcGUoaW5wdXRzMkQubWFwKHQgPT4gdC5zaGFwZSksIDEgLyogYXhpcyAqLyk7XG4gICAgY29uc3Qgc2ltcGx5Q29uY2F0ID0gaW5wdXRzMkRbMF0uc2hhcGVbMF0gPT09IDE7XG4gICAgY29uc3Qgb3V0VmFscyA9IGNvbmNhdEltcGwoaW5wdXRzVmFsU2hhcGVzLCBvdXRTaGFwZSwgaW5wdXRzWzBdLmR0eXBlLCBzaW1wbHlDb25jYXQpO1xuICAgIGNvbnN0IGZpbmFsT3V0U2hhcGUgPSBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dFNoYXBlKCRpbnB1dHMubWFwKHQgPT4gdC5zaGFwZSksICRheGlzKTtcbiAgICBjb25zdCBvdXRJbmZvID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhmaW5hbE91dFNoYXBlLCBpbnB1dHNbMF0uZHR5cGUsIG91dFZhbHMpO1xuICAgIGlucHV0czJELmZvckVhY2godCA9PiBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHQpKTtcbiAgICByZXR1cm4gb3V0SW5mbztcbn1cbmV4cG9ydCBjb25zdCBjb25jYXRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQ29uY2F0LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBjb25jYXRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db25jYXQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiBjb25jYXRJbXBsKGlucHV0cywgb3V0U2hhcGUsIGR0eXBlLCBzaW1wbHlDb25jYXQpIHtcbiAgICBjb25zdCBvdXRWYWxzID0gdXRpbC5nZXRBcnJheUZyb21EVHlwZShkdHlwZSwgdXRpbC5zaXplRnJvbVNoYXBlKG91dFNoYXBlKSk7XG4gICAgaWYgKHNpbXBseUNvbmNhdCAmJiBkdHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gVXNlIGJ1aWx0LWluIFR5cGVkQXJyYXkuc2V0KCkgbWV0aG9kIGZvciBzcGVlZC5cbiAgICAgICAgbGV0IG9mZnNldCA9IDA7XG4gICAgICAgIGlucHV0cy5mb3JFYWNoKGlucHV0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoaW5wdXQuc2hhcGUpO1xuICAgICAgICAgICAgb3V0VmFscy5zZXQoaW5wdXQudmFscywgb2Zmc2V0KTtcbiAgICAgICAgICAgIG9mZnNldCArPSBzaXplO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGxldCBjb2xPZmZzZXQgPSAwO1xuICAgICAgICBpbnB1dHMuZm9yRWFjaChpbnB1dCA9PiB7XG4gICAgICAgICAgICBjb25zdCBkZWNvZGVkRGF0YSA9IGR0eXBlID09PSAnc3RyaW5nJyA/XG4gICAgICAgICAgICAgICAgYmFja2VuZF91dGlsLmZyb21VaW50OFRvU3RyaW5nQXJyYXkoaW5wdXQudmFscykgOlxuICAgICAgICAgICAgICAgIGlucHV0LnZhbHM7XG4gICAgICAgICAgICBsZXQgdElkeCA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBpbnB1dC5zaGFwZVswXTsgKytyb3cpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNJZHggPSByb3cgKiBvdXRTaGFwZVsxXSArIGNvbE9mZnNldDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCBpbnB1dC5zaGFwZVsxXTsgKytjb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0VmFsc1tyZXNJZHggKyBjb2xdID0gZGVjb2RlZERhdGFbdElkeCsrXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb2xPZmZzZXQgKz0gaW5wdXQuc2hhcGVbMV07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gb3V0VmFscztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbmNhdF9pbXBsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgQ29udjJELCBUZW5zb3JCdWZmZXIsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBjb252MkQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHgsIGZpbHRlciB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0LCBkaWxhdGlvbnMsIGRpbVJvdW5kaW5nTW9kZSB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChbeCwgZmlsdGVyXSwgJ2NvbnYyZCcpO1xuICAgIGNvbnN0ICRkYXRhRm9ybWF0ID0gYmFja2VuZF91dGlsLmNvbnZlcnRDb252MkREYXRhRm9ybWF0KGRhdGFGb3JtYXQpO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252MkRJbmZvKHguc2hhcGUsIGZpbHRlci5zaGFwZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgZmFsc2UgLyogZGVwdGh3aXNlICovLCAkZGF0YUZvcm1hdCk7XG4gICAgY29uc3QgZmlsdGVySGVpZ2h0ID0gY29udkluZm8uZmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG4gICAgY29uc3QgZGlsYXRpb25IZWlnaHQgPSBjb252SW5mby5kaWxhdGlvbkhlaWdodDtcbiAgICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgICBjb25zdCBwYWRMZWZ0ID0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgIGNvbnN0IHBhZFRvcCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IGlzQ2hhbm5lbHNMYXN0ID0gY29udkluZm8uZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzTGFzdCc7XG4gICAgY29uc3QgeSA9IG5ldyBUZW5zb3JCdWZmZXIoY29udkluZm8ub3V0U2hhcGUsIHguZHR5cGUpO1xuICAgIGNvbnN0IHhTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyh4LnNoYXBlKTtcbiAgICBjb25zdCBmaWx0ZXJTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhmaWx0ZXIuc2hhcGUpO1xuICAgIGNvbnN0IHhCYXRjaFN0cmlkZSA9IHhTdHJpZGVzWzBdO1xuICAgIGNvbnN0IHhSb3dTdHJpZGUgPSBpc0NoYW5uZWxzTGFzdCA/IHhTdHJpZGVzWzFdIDogeFN0cmlkZXNbMl07XG4gICAgY29uc3QgeENvbFN0cmlkZSA9IGlzQ2hhbm5lbHNMYXN0ID8geFN0cmlkZXNbMl0gOiAxO1xuICAgIGNvbnN0IHhDaGFubmVsU3RyaWRlID0gaXNDaGFubmVsc0xhc3QgPyAxIDogeFN0cmlkZXNbMV07XG4gICAgY29uc3QgeUJhdGNoU3RyaWRlID0geS5zdHJpZGVzWzBdO1xuICAgIGNvbnN0IHlSb3dTdHJpZGUgPSBpc0NoYW5uZWxzTGFzdCA/IHkuc3RyaWRlc1sxXSA6IHkuc3RyaWRlc1syXTtcbiAgICBjb25zdCB5Q29sU3RyaWRlID0gaXNDaGFubmVsc0xhc3QgPyB5LnN0cmlkZXNbMl0gOiAxO1xuICAgIGNvbnN0IHlDaGFubmVsU3RyaWRlID0gaXNDaGFubmVsc0xhc3QgPyAxIDogeS5zdHJpZGVzWzFdO1xuICAgIGNvbnN0IHhWYWxzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHdWYWxzID0gYmFja2VuZC5kYXRhLmdldChmaWx0ZXIuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgeVZhbHMgPSB5LnZhbHVlcztcbiAgICBmb3IgKGxldCBiID0gMDsgYiA8IGNvbnZJbmZvLmJhdGNoU2l6ZTsgKytiKSB7XG4gICAgICAgIGNvbnN0IHhPZmZzZXQxID0gYiAqIHhCYXRjaFN0cmlkZTtcbiAgICAgICAgY29uc3QgeU9mZnNldDEgPSBiICogeUJhdGNoU3RyaWRlO1xuICAgICAgICBmb3IgKGxldCB5UiA9IDA7IHlSIDwgY29udkluZm8ub3V0SGVpZ2h0OyArK3lSKSB7XG4gICAgICAgICAgICBjb25zdCB5T2Zmc2V0MiA9IHlPZmZzZXQxICsgeVIgKiB5Um93U3RyaWRlO1xuICAgICAgICAgICAgY29uc3QgeFJDb3JuZXIgPSB5UiAqIGNvbnZJbmZvLnN0cmlkZUhlaWdodCAtIHBhZFRvcDtcbiAgICAgICAgICAgIGZvciAobGV0IHdSID0gMDsgd1IgPCBmaWx0ZXJIZWlnaHQ7ICsrd1IpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4UiA9IHhSQ29ybmVyICsgd1IgKiBkaWxhdGlvbkhlaWdodDtcbiAgICAgICAgICAgICAgICBpZiAoeFIgPCAwIHx8IHhSID49IGNvbnZJbmZvLmluSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB3T2Zmc2V0MSA9IHdSICogZmlsdGVyU3RyaWRlc1swXTtcbiAgICAgICAgICAgICAgICBjb25zdCB4T2Zmc2V0MiA9IHhPZmZzZXQxICsgeFIgKiB4Um93U3RyaWRlO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHlDID0gMDsgeUMgPCBjb252SW5mby5vdXRXaWR0aDsgKyt5Qykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB5T2Zmc2V0MyA9IHlPZmZzZXQyICsgeUMgKiB5Q29sU3RyaWRlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4Q0Nvcm5lciA9IHlDICogY29udkluZm8uc3RyaWRlV2lkdGggLSBwYWRMZWZ0O1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB3QyA9IDA7IHdDIDwgZmlsdGVyV2lkdGg7ICsrd0MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhDID0geENDb3JuZXIgKyB3QyAqIGRpbGF0aW9uV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeEMgPCAwIHx8IHhDID49IGNvbnZJbmZvLmluV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdPZmZzZXQyID0gd09mZnNldDEgKyB3QyAqIGZpbHRlclN0cmlkZXNbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4T2Zmc2V0MyA9IHhPZmZzZXQyICsgeEMgKiB4Q29sU3RyaWRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHdPZmZzZXQzID0gd09mZnNldDI7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBkMSA9IDA7IGQxIDwgY29udkluZm8uaW5DaGFubmVsczsgKytkMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhWYWwgPSB4VmFsc1t4T2Zmc2V0MyArIGQxICogeENoYW5uZWxTdHJpZGVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGQyID0gMDsgZDIgPCBjb252SW5mby5vdXRDaGFubmVsczsgKytkMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5VmFsc1t5T2Zmc2V0MyArIGQyICogeUNoYW5uZWxTdHJpZGVdICs9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VmFsICogd1ZhbHNbd09mZnNldDMgKyBkMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdPZmZzZXQzICs9IGNvbnZJbmZvLm91dENoYW5uZWxzO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHkuc2hhcGUsIHkuZHR5cGUsIHlWYWxzKTtcbn1cbmV4cG9ydCBjb25zdCBjb252MkRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQ29udjJELFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBjb252MkRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db252MkQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBDb252MkRCYWNrcHJvcEZpbHRlciwgVGVuc29yQnVmZmVyIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5leHBvcnQgZnVuY3Rpb24gY29udjJEQmFja3Byb3BGaWx0ZXIoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHgsIGR5IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQsIGRpbVJvdW5kaW5nTW9kZSwgZmlsdGVyU2hhcGUgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoW3gsIGR5XSwgJ2NvbnYyZEJhY2twcm9wRmlsdGVyJyk7XG4gICAgY29uc3QgJGRhdGFGb3JtYXQgPSBiYWNrZW5kX3V0aWwuY29udmVydENvbnYyRERhdGFGb3JtYXQoZGF0YUZvcm1hdCk7XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZUNvbnYyREluZm8oeC5zaGFwZSwgZmlsdGVyU2hhcGUsIHN0cmlkZXMsIDEgLyogZGlsYXRpb25zICovLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgZmFsc2UgLyogZGVwdGh3aXNlICovLCAkZGF0YUZvcm1hdCk7XG4gICAgY29uc3QgeyBzdHJpZGVIZWlnaHQsIHN0cmlkZVdpZHRoLCBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoIH0gPSBjb252SW5mbztcbiAgICBjb25zdCBpc0NoYW5uZWxzTGFzdCA9IGNvbnZJbmZvLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnO1xuICAgIGNvbnN0IGRXID0gbmV3IFRlbnNvckJ1ZmZlcihjb252SW5mby5maWx0ZXJTaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICBjb25zdCBsZWZ0UGFkID0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgIGNvbnN0IHRvcFBhZCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IHhWYWxzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IGR5VmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoZHkuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgeEJ1ZiA9IG5ldyBUZW5zb3JCdWZmZXIoeC5zaGFwZSwgeC5kdHlwZSwgeFZhbHMpO1xuICAgIGNvbnN0IGR5QnVmID0gbmV3IFRlbnNvckJ1ZmZlcihkeS5zaGFwZSwgZHkuZHR5cGUsIGR5VmFscyk7XG4gICAgZm9yIChsZXQgd1IgPSAwOyB3UiA8IGZpbHRlckhlaWdodDsgKyt3Uikge1xuICAgICAgICBjb25zdCB5Uk1pbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCgodG9wUGFkIC0gd1IpIC8gc3RyaWRlSGVpZ2h0KSk7XG4gICAgICAgIGNvbnN0IHlSTWF4ID0gTWF0aC5taW4oY29udkluZm8ub3V0SGVpZ2h0LCAoY29udkluZm8uaW5IZWlnaHQgKyB0b3BQYWQgLSB3UikgLyBzdHJpZGVIZWlnaHQpO1xuICAgICAgICBmb3IgKGxldCB3QyA9IDA7IHdDIDwgZmlsdGVyV2lkdGg7ICsrd0MpIHtcbiAgICAgICAgICAgIGNvbnN0IHlDTWluID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKChsZWZ0UGFkIC0gd0MpIC8gc3RyaWRlV2lkdGgpKTtcbiAgICAgICAgICAgIGNvbnN0IHlDTWF4ID0gTWF0aC5taW4oY29udkluZm8ub3V0V2lkdGgsIChjb252SW5mby5pbldpZHRoICsgbGVmdFBhZCAtIHdDKSAvIHN0cmlkZVdpZHRoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGQxID0gMDsgZDEgPCBjb252SW5mby5pbkNoYW5uZWxzOyArK2QxKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZDIgPSAwOyBkMiA8IGNvbnZJbmZvLm91dENoYW5uZWxzOyArK2QyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkb3RQcm9kID0gMDtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgYiA9IDA7IGIgPCBjb252SW5mby5iYXRjaFNpemU7ICsrYikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgeVIgPSB5Uk1pbjsgeVIgPCB5Uk1heDsgKyt5Uikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhSID0gd1IgKyB5UiAqIHN0cmlkZUhlaWdodCAtIHRvcFBhZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB5QyA9IHlDTWluOyB5QyA8IHlDTWF4OyArK3lDKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhDID0gd0MgKyB5QyAqIHN0cmlkZVdpZHRoIC0gbGVmdFBhZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ2hhbm5lbHNMYXN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3RQcm9kICs9IHhCdWYuZ2V0KGIsIHhSLCB4QywgZDEpICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeUJ1Zi5nZXQoYiwgeVIsIHlDLCBkMik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3RQcm9kICs9IHhCdWYuZ2V0KGIsIGQxLCB4UiwgeEMpICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeUJ1Zi5nZXQoYiwgZDIsIHlSLCB5Qyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZFcuc2V0KGRvdFByb2QsIHdSLCB3QywgZDEsIGQyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oZFcuc2hhcGUsIGRXLmR0eXBlLCBkVy52YWx1ZXMpO1xufVxuZXhwb3J0IGNvbnN0IGNvbnYyREJhY2twcm9wRmlsdGVyQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IENvbnYyREJhY2twcm9wRmlsdGVyLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBjb252MkRCYWNrcHJvcEZpbHRlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbnYyREJhY2twcm9wRmlsdGVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgQ29udjJEQmFja3Byb3BJbnB1dCwgVGVuc29yQnVmZmVyLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5leHBvcnQgZnVuY3Rpb24gY29udjJEQmFja3Byb3BJbnB1dChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgZHksIGZpbHRlciB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgaW5wdXRTaGFwZSwgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0LCBkaW1Sb3VuZGluZ01vZGUgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoW2R5LCBmaWx0ZXJdLCAnY29udjJkQmFja3Byb3BJbnB1dCcpO1xuICAgIGNvbnN0IGZpbHRlclN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGZpbHRlci5zaGFwZSk7XG4gICAgY29uc3QgZHlTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhkeS5zaGFwZSk7XG4gICAgbGV0ICRkYXRhRm9ybWF0ID0gYmFja2VuZF91dGlsLmNvbnZlcnRDb252MkREYXRhRm9ybWF0KGRhdGFGb3JtYXQpO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252MkRJbmZvKGlucHV0U2hhcGUsIGZpbHRlci5zaGFwZSwgc3RyaWRlcywgMSAvKiBkaWxhdGlvbnMgKi8sIHBhZCwgZGltUm91bmRpbmdNb2RlLCBmYWxzZSwgJGRhdGFGb3JtYXQpO1xuICAgIGNvbnN0IGR4ID0gbmV3IFRlbnNvckJ1ZmZlcihjb252SW5mby5pblNoYXBlLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IGR4VmFsdWVzID0gZHgudmFsdWVzO1xuICAgIGNvbnN0IGR5VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldChkeS5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBmbHRWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGZpbHRlci5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBbZmx0UzAsIGZsdFMxLCBmbHRTMl0gPSBmaWx0ZXJTdHJpZGVzO1xuICAgIGNvbnN0IHsgYmF0Y2hTaXplLCBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBpbkNoYW5uZWxzLCBpbkhlaWdodCwgaW5XaWR0aCwgb3V0Q2hhbm5lbHMsIG91dEhlaWdodCwgb3V0V2lkdGgsIHN0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGggfSA9IGNvbnZJbmZvO1xuICAgICRkYXRhRm9ybWF0ID0gY29udkluZm8uZGF0YUZvcm1hdDtcbiAgICBjb25zdCB0b3BQYWQgPSBmaWx0ZXJIZWlnaHQgLSAxIC0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgbGVmdFBhZCA9IGZpbHRlcldpZHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICBjb25zdCBpc0NoYW5uZWxzTGFzdCA9ICRkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNMYXN0JztcbiAgICBjb25zdCB4QmF0Y2hTdHJpZGUgPSBkeC5zdHJpZGVzWzBdO1xuICAgIGNvbnN0IHhSb3dTdHJpZGUgPSBpc0NoYW5uZWxzTGFzdCA/IGR4LnN0cmlkZXNbMV0gOiBkeC5zdHJpZGVzWzJdO1xuICAgIGNvbnN0IHhDb2xTdHJpZGUgPSBpc0NoYW5uZWxzTGFzdCA/IGR4LnN0cmlkZXNbMl0gOiAxO1xuICAgIGNvbnN0IHhDaGFubmVsU3RyaWRlID0gaXNDaGFubmVsc0xhc3QgPyAxIDogZHguc3RyaWRlc1sxXTtcbiAgICBjb25zdCB5QmF0Y2hTdHJpZGUgPSBkeVN0cmlkZXNbMF07XG4gICAgY29uc3QgeVJvd1N0cmlkZSA9IGlzQ2hhbm5lbHNMYXN0ID8gZHlTdHJpZGVzWzFdIDogZHlTdHJpZGVzWzJdO1xuICAgIGNvbnN0IHlDb2xTdHJpZGUgPSBpc0NoYW5uZWxzTGFzdCA/IGR5U3RyaWRlc1syXSA6IDE7XG4gICAgY29uc3QgeUNoYW5uZWxTdHJpZGUgPSBpc0NoYW5uZWxzTGFzdCA/IDEgOiBkeVN0cmlkZXNbMV07XG4gICAgZm9yIChsZXQgYiA9IDA7IGIgPCBiYXRjaFNpemU7ICsrYikge1xuICAgICAgICBmb3IgKGxldCBkMSA9IDA7IGQxIDwgaW5DaGFubmVsczsgKytkMSkge1xuICAgICAgICAgICAgZm9yIChsZXQgeFIgPSAwOyB4UiA8IGluSGVpZ2h0OyArK3hSKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeFJDb3JuZXIgPSB4UiAtIHRvcFBhZDtcbiAgICAgICAgICAgICAgICBjb25zdCB4Uk1pbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCh4UkNvcm5lciAvIHN0cmlkZUhlaWdodCkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHlSTWF4ID0gTWF0aC5taW4ob3V0SGVpZ2h0LCAoZmlsdGVySGVpZ2h0ICsgeFJDb3JuZXIpIC8gc3RyaWRlSGVpZ2h0KTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB4QyA9IDA7IHhDIDwgaW5XaWR0aDsgKyt4Qykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4Q0Nvcm5lciA9IHhDIC0gbGVmdFBhZDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeENNaW4gPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoeENDb3JuZXIgLyBzdHJpZGVXaWR0aCkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB5Q01heCA9IE1hdGgubWluKG91dFdpZHRoLCAoZmlsdGVyV2lkdGggKyB4Q0Nvcm5lcikgLyBzdHJpZGVXaWR0aCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkb3RQcm9kID0gMDtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgeVIgPSB4Uk1pbjsgeVIgPCB5Uk1heDsgKyt5Uikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd1IgPSB5UiAqIHN0cmlkZUhlaWdodCAtIHhSQ29ybmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgeUMgPSB4Q01pbjsgeUMgPCB5Q01heDsgKyt5Qykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdDID0geUMgKiBzdHJpZGVXaWR0aCAtIHhDQ29ybmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGR5T2Zmc2V0ID0geUJhdGNoU3RyaWRlICogYiArIHlSb3dTdHJpZGUgKiB5UiArIHlDb2xTdHJpZGUgKiB5QztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbHRPZmZzZXQgPSBmbHRTMCAqIChmaWx0ZXJIZWlnaHQgLSAxIC0gd1IpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmx0UzEgKiAoZmlsdGVyV2lkdGggLSAxIC0gd0MpICsgZmx0UzIgKiBkMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBkMiA9IDA7IGQyIDwgb3V0Q2hhbm5lbHM7ICsrZDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGl4ZWwgPSBkeVZhbHVlc1tkeU9mZnNldCArIHlDaGFubmVsU3RyaWRlICogZDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3ZWlnaHQgPSBmbHRWYWx1ZXNbZmx0T2Zmc2V0ICsgZDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3RQcm9kICs9IHBpeGVsICogd2VpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkeE9mZnNldCA9IHhCYXRjaFN0cmlkZSAqIGIgKyB4Um93U3RyaWRlICogeFIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgeENvbFN0cmlkZSAqIHhDICsgeENoYW5uZWxTdHJpZGUgKiBkMTtcbiAgICAgICAgICAgICAgICAgICAgZHhWYWx1ZXNbZHhPZmZzZXRdID0gZG90UHJvZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oZHguc2hhcGUsIGR4LmR0eXBlLCBkeC52YWx1ZXMpO1xufVxuZXhwb3J0IGNvbnN0IGNvbnYyREJhY2twcm9wSW5wdXRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQ29udjJEQmFja3Byb3BJbnB1dCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogY29udjJEQmFja3Byb3BJbnB1dFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbnYyREJhY2twcm9wSW5wdXQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBDb252M0QsIFRlbnNvckJ1ZmZlciwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnYzRChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCwgZmlsdGVyIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBzdHJpZGVzLCBwYWQsIGRpbGF0aW9ucyB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChbeCwgZmlsdGVyXSwgJ2NvbnYzZCcpO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252M0RJbmZvKHguc2hhcGUsIGZpbHRlci5zaGFwZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQpO1xuICAgIGNvbnN0IHsgZmlsdGVyRGVwdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGRpbGF0aW9uRGVwdGgsIGRpbGF0aW9uSGVpZ2h0LCBkaWxhdGlvbldpZHRoLCBwYWRJbmZvIH0gPSBjb252SW5mbztcbiAgICBjb25zdCBwYWRGcm9udCA9IHBhZEluZm8uZnJvbnQ7XG4gICAgY29uc3QgcGFkTGVmdCA9IHBhZEluZm8ubGVmdDtcbiAgICBjb25zdCBwYWRUb3AgPSBwYWRJbmZvLnRvcDtcbiAgICBjb25zdCB5ID0gbmV3IFRlbnNvckJ1ZmZlcihjb252SW5mby5vdXRTaGFwZSwgeC5kdHlwZSk7XG4gICAgY29uc3QgeFZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3Qgd1ZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KGZpbHRlci5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCB5VmFscyA9IHkudmFsdWVzO1xuICAgIGNvbnN0IHhTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyh4LnNoYXBlKTtcbiAgICBjb25zdCBmaWx0ZXJTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhmaWx0ZXIuc2hhcGUpO1xuICAgIGZvciAobGV0IGIgPSAwOyBiIDwgY29udkluZm8uYmF0Y2hTaXplOyArK2IpIHtcbiAgICAgICAgY29uc3QgeE9mZnNldDEgPSBiICogeFN0cmlkZXNbMF07XG4gICAgICAgIGNvbnN0IHlPZmZzZXQxID0gYiAqIHkuc3RyaWRlc1swXTtcbiAgICAgICAgZm9yIChsZXQgeUYgPSAwOyB5RiA8IGNvbnZJbmZvLm91dERlcHRoOyArK3lGKSB7XG4gICAgICAgICAgICBjb25zdCB5T2Zmc2V0MiA9IHlPZmZzZXQxICsgeUYgKiB5LnN0cmlkZXNbMV07XG4gICAgICAgICAgICBjb25zdCB4RkNvcm5lciA9IHlGICogY29udkluZm8uc3RyaWRlRGVwdGggLSBwYWRGcm9udDtcbiAgICAgICAgICAgIGZvciAobGV0IHdGID0gMDsgd0YgPCBmaWx0ZXJEZXB0aDsgKyt3Rikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhGID0geEZDb3JuZXIgKyB3RiAqIGRpbGF0aW9uRGVwdGg7XG4gICAgICAgICAgICAgICAgaWYgKHhGIDwgMCB8fCB4RiA+PSBjb252SW5mby5pbkRlcHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB3T2Zmc2V0MSA9IHdGICogZmlsdGVyU3RyaWRlc1swXTtcbiAgICAgICAgICAgICAgICBjb25zdCB4T2Zmc2V0MiA9IHhPZmZzZXQxICsgeEYgKiB4U3RyaWRlc1sxXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB5UiA9IDA7IHlSIDwgY29udkluZm8ub3V0SGVpZ2h0OyArK3lSKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHlPZmZzZXQzID0geU9mZnNldDIgKyB5UiAqIHkuc3RyaWRlc1syXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeFJDb3JuZXIgPSB5UiAqIGNvbnZJbmZvLnN0cmlkZUhlaWdodCAtIHBhZFRvcDtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgd1IgPSAwOyB3UiA8IGZpbHRlckhlaWdodDsgKyt3Uikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeFIgPSB4UkNvcm5lciArIHdSICogZGlsYXRpb25IZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeFIgPCAwIHx8IHhSID49IGNvbnZJbmZvLmluSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3T2Zmc2V0MiA9IHdPZmZzZXQxICsgd1IgKiBmaWx0ZXJTdHJpZGVzWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeE9mZnNldDMgPSB4T2Zmc2V0MiArIHhSICogeFN0cmlkZXNbMl07XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB5QyA9IDA7IHlDIDwgY29udkluZm8ub3V0V2lkdGg7ICsreUMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB5T2Zmc2V0NCA9IHlPZmZzZXQzICsgeUMgKiBjb252SW5mby5vdXRDaGFubmVscztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4Q0Nvcm5lciA9IHlDICogY29udkluZm8uc3RyaWRlV2lkdGggLSBwYWRMZWZ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHdDID0gMDsgd0MgPCBmaWx0ZXJXaWR0aDsgKyt3Qykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4QyA9IHhDQ29ybmVyICsgd0MgKiBkaWxhdGlvbldpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeEMgPCAwIHx8IHhDID49IGNvbnZJbmZvLmluV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdPZmZzZXQzID0gd09mZnNldDIgKyB3QyAqIGZpbHRlclN0cmlkZXNbMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhPZmZzZXQ0ID0geE9mZnNldDMgKyB4QyAqIGNvbnZJbmZvLmluQ2hhbm5lbHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB3T2Zmc2V0NCA9IHdPZmZzZXQzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBkMSA9IDA7IGQxIDwgY29udkluZm8uaW5DaGFubmVsczsgKytkMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeFZhbCA9IHhWYWxzW3hPZmZzZXQ0ICsgZDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgZDIgPSAwOyBkMiA8IGNvbnZJbmZvLm91dENoYW5uZWxzOyArK2QyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeVZhbHNbeU9mZnNldDQgKyBkMl0gKz0geFZhbCAqIHdWYWxzW3dPZmZzZXQ0ICsgZDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd09mZnNldDQgKz0gY29udkluZm8ub3V0Q2hhbm5lbHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oeS5zaGFwZSwgeS5kdHlwZSwgeS52YWx1ZXMpO1xufVxuZXhwb3J0IGNvbnN0IGNvbnYzRENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBDb252M0QsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGNvbnYzRFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbnYzRC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIENvbnYzREJhY2twcm9wRmlsdGVyVjIsIFRlbnNvckJ1ZmZlciwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnYzREJhY2twcm9wRmlsdGVyVjIoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHgsIGR5IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBzdHJpZGVzLCBwYWQsIGZpbHRlclNoYXBlIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KFt4LCBkeV0sICdjb252M2RCYWNrcHJvcEZpbHRlclYyJyk7XG4gICAgY29uc3QgeFN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKHguc2hhcGUpO1xuICAgIGNvbnN0IGR5U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoZHkuc2hhcGUpO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252M0RJbmZvKHguc2hhcGUsIGZpbHRlclNoYXBlLCBzdHJpZGVzLCAxIC8qIGRpbGF0aW9ucyAqLywgcGFkKTtcbiAgICBjb25zdCBzdHJpZGVEZXB0aCA9IGNvbnZJbmZvLnN0cmlkZURlcHRoO1xuICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICAgIGNvbnN0IGZpbHRlckRlcHRoID0gY29udkluZm8uZmlsdGVyRGVwdGg7XG4gICAgY29uc3QgZmlsdGVySGVpZ2h0ID0gY29udkluZm8uZmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG4gICAgY29uc3QgZHcgPSBuZXcgVGVuc29yQnVmZmVyKGNvbnZJbmZvLmZpbHRlclNoYXBlLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IGR3VmFsdWVzID0gZHcudmFsdWVzO1xuICAgIGNvbnN0IFtkd1MwLCBkd1MxLCBkd1MyLCBkd1MzXSA9IGR3LnN0cmlkZXM7XG4gICAgY29uc3QgZHlWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGR5LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IFtkeVMwLCBkeVMxLCBkeVMyLCBkeVMzXSA9IGR5U3RyaWRlcztcbiAgICBjb25zdCB4VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IFt4UzAsIHhTMSwgeFMyLCB4UzNdID0geFN0cmlkZXM7XG4gICAgY29uc3QgZnJvbnRQYWQgPSBjb252SW5mby5wYWRJbmZvLmZyb250O1xuICAgIGNvbnN0IGxlZnRQYWQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgY29uc3QgdG9wUGFkID0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgZm9yIChsZXQgd0YgPSAwOyB3RiA8IGZpbHRlckRlcHRoOyArK3dGKSB7XG4gICAgICAgIGNvbnN0IHlGTWluID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKChmcm9udFBhZCAtIHdGKSAvIHN0cmlkZURlcHRoKSk7XG4gICAgICAgIGNvbnN0IHlGTWF4ID0gTWF0aC5taW4oY29udkluZm8ub3V0RGVwdGgsIChjb252SW5mby5pbkRlcHRoICsgZnJvbnRQYWQgLSB3RikgLyBzdHJpZGVEZXB0aCk7XG4gICAgICAgIGNvbnN0IHdPZmZzZXQxID0gd0YgKiBkd1MwO1xuICAgICAgICBmb3IgKGxldCB3UiA9IDA7IHdSIDwgZmlsdGVySGVpZ2h0OyArK3dSKSB7XG4gICAgICAgICAgICBjb25zdCB5Uk1pbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCgodG9wUGFkIC0gd1IpIC8gc3RyaWRlSGVpZ2h0KSk7XG4gICAgICAgICAgICBjb25zdCB5Uk1heCA9IE1hdGgubWluKGNvbnZJbmZvLm91dEhlaWdodCwgKGNvbnZJbmZvLmluSGVpZ2h0ICsgdG9wUGFkIC0gd1IpIC8gc3RyaWRlSGVpZ2h0KTtcbiAgICAgICAgICAgIGNvbnN0IHdPZmZzZXQyID0gd1IgKiBkd1MxICsgd09mZnNldDE7XG4gICAgICAgICAgICBmb3IgKGxldCB3QyA9IDA7IHdDIDwgZmlsdGVyV2lkdGg7ICsrd0MpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB5Q01pbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCgobGVmdFBhZCAtIHdDKSAvIHN0cmlkZVdpZHRoKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgeUNNYXggPSBNYXRoLm1pbihjb252SW5mby5vdXRXaWR0aCwgKGNvbnZJbmZvLmluV2lkdGggKyBsZWZ0UGFkIC0gd0MpIC8gc3RyaWRlV2lkdGgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHdPZmZzZXQzID0gd0MgKiBkd1MyICsgd09mZnNldDI7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZDEgPSAwOyBkMSA8IGNvbnZJbmZvLmluQ2hhbm5lbHM7ICsrZDEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgd09mZnNldDQgPSBkMSAqIGR3UzMgKyB3T2Zmc2V0MztcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgZDIgPSAwOyBkMiA8IGNvbnZJbmZvLm91dENoYW5uZWxzOyArK2QyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZG90UHJvZCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBiID0gMDsgYiA8IGNvbnZJbmZvLmJhdGNoU2l6ZTsgKytiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeE9mZnNldDEgPSBiICogeFMwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHlPZmZzZXQxID0gYiAqIGR5UzA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgeUYgPSB5Rk1pbjsgeUYgPCB5Rk1heDsgKyt5Rikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4RiA9IHdGICsgeUYgKiBzdHJpZGVEZXB0aCAtIGZyb250UGFkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4T2Zmc2V0MiA9IHhGICogeFMxICsgeE9mZnNldDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHlPZmZzZXQyID0geUYgKiBkeVMxICsgeU9mZnNldDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHlSID0geVJNaW47IHlSIDwgeVJNYXg7ICsreVIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhSID0gd1IgKyB5UiAqIHN0cmlkZUhlaWdodCAtIHRvcFBhZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhPZmZzZXQzID0geFIgKiB4UzIgKyB4T2Zmc2V0MjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHlPZmZzZXQzID0geVIgKiBkeVMyICsgeU9mZnNldDI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB5QyA9IHlDTWluOyB5QyA8IHlDTWF4OyArK3lDKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeEMgPSB3QyArIHlDICogc3RyaWRlV2lkdGggLSBsZWZ0UGFkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhPZmZzZXQ0ID0geEMgKiB4UzMgKyB4T2Zmc2V0MztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB5T2Zmc2V0NCA9IHlDICogZHlTMyArIHlPZmZzZXQzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdFByb2QgKz0geFZhbHVlc1t4T2Zmc2V0NCArIGQxXSAqIGR5VmFsdWVzW3lPZmZzZXQ0ICsgZDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZHdWYWx1ZXNbd09mZnNldDQgKyBkMl0gPSBkb3RQcm9kO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGR3LnNoYXBlLCBkdy5kdHlwZSwgZHcudmFsdWVzKTtcbn1cbmV4cG9ydCBjb25zdCBjb252M0RCYWNrcHJvcEZpbHRlclYyQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IENvbnYzREJhY2twcm9wRmlsdGVyVjIsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGNvbnYzREJhY2twcm9wRmlsdGVyVjJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db252M0RCYWNrcHJvcEZpbHRlclYyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgQ29udjNEQmFja3Byb3BJbnB1dFYyLCBUZW5zb3JCdWZmZXIsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBjb252M0RCYWNrcHJvcElucHV0VjIoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGR5LCBmaWx0ZXIgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHBhZCwgc3RyaWRlcywgaW5wdXRTaGFwZSB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChbZHldLCAnY29udjNkQmFja3Byb3BJbnB1dFYyJyk7XG4gICAgY29uc3QgZHlTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhkeS5zaGFwZSk7XG4gICAgY29uc3QgZmlsdGVyU3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoZmlsdGVyLnNoYXBlKTtcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjNESW5mbyhpbnB1dFNoYXBlLCBmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsIDEgLyogZGlsYXRpb25zICovLCBwYWQpO1xuICAgIGNvbnN0IGR4ID0gbmV3IFRlbnNvckJ1ZmZlcihjb252SW5mby5pblNoYXBlLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IGR4VmFsdWVzID0gZHgudmFsdWVzO1xuICAgIGNvbnN0IFtkeFMwLCBkeFMxLCBkeFMyLCBkeFMzXSA9IGR4LnN0cmlkZXM7XG4gICAgY29uc3QgZHlWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGR5LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IFtkeVMwLCBkeVMxLCBkeVMyLCBkeVMzXSA9IGR5U3RyaWRlcztcbiAgICBjb25zdCBmbHRWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGZpbHRlci5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBbZmx0UzAsIGZsdFMxLCBmbHRTMiwgZmx0UzNdID0gZmlsdGVyU3RyaWRlcztcbiAgICBjb25zdCB7IGJhdGNoU2l6ZSwgZmlsdGVyRGVwdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGluQ2hhbm5lbHMsIGluRGVwdGgsIGluSGVpZ2h0LCBpbldpZHRoLCBvdXRDaGFubmVscywgb3V0RGVwdGgsIG91dEhlaWdodCwgb3V0V2lkdGgsIHN0cmlkZURlcHRoLCBzdHJpZGVIZWlnaHQsIHN0cmlkZVdpZHRoIH0gPSBjb252SW5mbztcbiAgICBjb25zdCBmcm9udFBhZCA9IGZpbHRlckRlcHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8uZnJvbnQ7XG4gICAgY29uc3QgdG9wUGFkID0gZmlsdGVySGVpZ2h0IC0gMSAtIGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IGxlZnRQYWQgPSBmaWx0ZXJXaWR0aCAtIDEgLSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgZm9yIChsZXQgYiA9IDA7IGIgPCBiYXRjaFNpemU7ICsrYikge1xuICAgICAgICBmb3IgKGxldCBkMSA9IDA7IGQxIDwgaW5DaGFubmVsczsgKytkMSkge1xuICAgICAgICAgICAgLy8gRnJhbWVzIG9mIGRlcHRoXG4gICAgICAgICAgICBmb3IgKGxldCB4RiA9IDA7IHhGIDwgaW5EZXB0aDsgKyt4Rikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhGQ29ybmVyID0geEYgLSBmcm9udFBhZDtcbiAgICAgICAgICAgICAgICBjb25zdCB4Rk1pbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCh4RkNvcm5lciAvIHN0cmlkZURlcHRoKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgeUZNYXggPSBNYXRoLm1pbihvdXREZXB0aCwgKGZpbHRlckRlcHRoICsgeEZDb3JuZXIpIC8gc3RyaWRlRGVwdGgpO1xuICAgICAgICAgICAgICAgIC8vIFJvd3MgYXMgcGVyIHN0YW5kYXJkIDJkIG1hdHJpeCBub3RhdGlvblxuICAgICAgICAgICAgICAgIGZvciAobGV0IHhSID0gMDsgeFIgPCBpbkhlaWdodDsgKyt4Uikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4UkNvcm5lciA9IHhSIC0gdG9wUGFkO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4Uk1pbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCh4UkNvcm5lciAvIHN0cmlkZUhlaWdodCkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB5Uk1heCA9IE1hdGgubWluKG91dEhlaWdodCwgKGZpbHRlckhlaWdodCArIHhSQ29ybmVyKSAvIHN0cmlkZUhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIENvbHVtbnMgYXMgcGVyIHN0YW5kYXJkIDJkIG1hdHJpeCBub3RhdGlvblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB4QyA9IDA7IHhDIDwgaW5XaWR0aDsgKyt4Qykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeENDb3JuZXIgPSB4QyAtIGxlZnRQYWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4Q01pbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCh4Q0Nvcm5lciAvIHN0cmlkZVdpZHRoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB5Q01heCA9IE1hdGgubWluKG91dFdpZHRoLCAoZmlsdGVyV2lkdGggKyB4Q0Nvcm5lcikgLyBzdHJpZGVXaWR0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZG90UHJvZCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB5RiA9IHhGTWluOyB5RiA8IHlGTWF4OyArK3lGKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd0YgPSB5RiAqIHN0cmlkZURlcHRoIC0geEZDb3JuZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgeVIgPSB4Uk1pbjsgeVIgPCB5Uk1heDsgKyt5Uikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3UiA9IHlSICogc3RyaWRlSGVpZ2h0IC0geFJDb3JuZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHlDID0geENNaW47IHlDIDwgeUNNYXg7ICsreUMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdDID0geUMgKiBzdHJpZGVXaWR0aCAtIHhDQ29ybmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHlPZmZzZXQgPSBkeVMwICogYiArIGR5UzEgKiB5RiArIGR5UzIgKiB5UiArIGR5UzMgKiB5QztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsdE9mZnNldCA9IGZsdFMwICogKGZpbHRlckRlcHRoIC0gMSAtIHdGKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmx0UzEgKiAoZmlsdGVySGVpZ2h0IC0gMSAtIHdSKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmx0UzIgKiAoZmlsdGVyV2lkdGggLSAxIC0gd0MpICsgZmx0UzMgKiBkMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGQyID0gMDsgZDIgPCBvdXRDaGFubmVsczsgKytkMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBpeGVsID0gZHlWYWx1ZXNbZHlPZmZzZXQgKyBkMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2VpZ2h0ID0gZmx0VmFsdWVzW2ZsdE9mZnNldCArIGQyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3RQcm9kICs9IHBpeGVsICogd2VpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZHhWYWx1ZXNbZHhTMCAqIGIgKyBkeFMxICogeEYgKyBkeFMyICogeFIgKyBkeFMzICogeEMgKyBkMV0gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdFByb2Q7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oZHguc2hhcGUsIGR4LmR0eXBlLCBkeC52YWx1ZXMpO1xufVxuZXhwb3J0IGNvbnN0IGNvbnYzREJhY2twcm9wSW5wdXRWMkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBDb252M0RCYWNrcHJvcElucHV0VjIsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGNvbnYzREJhY2twcm9wSW5wdXRWMlxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbnYzREJhY2twcm9wSW5wdXRWMi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBDb3MgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IGNvcyA9IHVuYXJ5S2VybmVsRnVuYyhDb3MsICh4aSkgPT4gTWF0aC5jb3MoeGkpKTtcbmV4cG9ydCBjb25zdCBjb3NDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQ29zLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBjb3MsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29zLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBDb3NoIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBjb3NoID0gdW5hcnlLZXJuZWxGdW5jKENvc2gsICh4aSkgPT4gTWF0aC5jb3NoKHhpKSk7XG5leHBvcnQgY29uc3QgY29zaENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBDb3NoLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBjb3NoLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvc2guanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYnVmZmVyLCBDcm9wQW5kUmVzaXplLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiBjcm9wQW5kUmVzaXplKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBpbWFnZSwgYm94ZXMsIGJveEluZCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgY3JvcFNpemUsIG1ldGhvZCwgZXh0cmFwb2xhdGlvblZhbHVlIH0gPSBhdHRycztcbiAgICBjb25zdCBbYmF0Y2gsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBudW1DaGFubmVsc10gPSBpbWFnZS5zaGFwZTtcbiAgICBjb25zdCBudW1Cb3hlcyA9IGJveGVzLnNoYXBlWzBdO1xuICAgIGNvbnN0IFtjcm9wSGVpZ2h0LCBjcm9wV2lkdGhdID0gY3JvcFNpemU7XG4gICAgY29uc3Qgb3V0cHV0ID0gYnVmZmVyKFtudW1Cb3hlcywgY3JvcEhlaWdodCwgY3JvcFdpZHRoLCBudW1DaGFubmVsc10sICdmbG9hdDMyJyk7XG4gICAgY29uc3QgYm94VmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoYm94ZXMuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgYm94SW5kVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoYm94SW5kLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IGltYWdlVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoaW1hZ2UuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgaW5TdHJpZGUgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGltYWdlLnNoYXBlKTsgLy8gdG8gY2FsY3VsYXRlIGZsYXQgaW5kZXhlcyBpbnRvIGltYWdlXG4gICAgY29uc3Qgb3V0U3RyaWRlID0gdXRpbC5jb21wdXRlU3RyaWRlcyhvdXRwdXQuc2hhcGUpOyAvLyB0byBjYWxjdWxhdGUgZmxhdCBpbmRleGVzIGludG8gb3V0cHV0XG4gICAgLy8gUmVmZXJlbmNlIGltcGxlbWVudGF0aW9uXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmZsb3cvYmxvYi9tYXN0ZXIvdGVuc29yZmxvdy9jb3JlL2tlcm5lbHMvY3JvcF9hbmRfcmVzaXplX29wLmNjXG4gICAgZm9yIChsZXQgYiA9IDA7IGIgPCBudW1Cb3hlczsgYisrKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0SW5kID0gYiAqIDQ7XG4gICAgICAgIGNvbnN0IHkxID0gYm94VmFsc1tzdGFydEluZF07XG4gICAgICAgIGNvbnN0IHgxID0gYm94VmFsc1tzdGFydEluZCArIDFdO1xuICAgICAgICBjb25zdCB5MiA9IGJveFZhbHNbc3RhcnRJbmQgKyAyXTtcbiAgICAgICAgY29uc3QgeDIgPSBib3hWYWxzW3N0YXJ0SW5kICsgM107XG4gICAgICAgIGNvbnN0IGJJbmQgPSBib3hJbmRWYWxzW2JdO1xuICAgICAgICBpZiAoYkluZCA+PSBiYXRjaCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaGVpZ2h0U2NhbGUgPSAoY3JvcEhlaWdodCA+IDEpID8gKHkyIC0geTEpICogKGltYWdlSGVpZ2h0IC0gMSkgLyAoY3JvcEhlaWdodCAtIDEpIDogMDtcbiAgICAgICAgY29uc3Qgd2lkdGhTY2FsZSA9IChjcm9wV2lkdGggPiAxKSA/ICh4MiAtIHgxKSAqIChpbWFnZVdpZHRoIC0gMSkgLyAoY3JvcFdpZHRoIC0gMSkgOiAwO1xuICAgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGNyb3BIZWlnaHQ7IHkrKykge1xuICAgICAgICAgICAgY29uc3QgeUluZCA9IChjcm9wSGVpZ2h0ID4gMSkgP1xuICAgICAgICAgICAgICAgIHkxICogKGltYWdlSGVpZ2h0IC0gMSkgKyB5ICogKGhlaWdodFNjYWxlKSA6XG4gICAgICAgICAgICAgICAgMC41ICogKHkxICsgeTIpICogKGltYWdlSGVpZ2h0IC0gMSk7XG4gICAgICAgICAgICBpZiAoeUluZCA8IDAgfHwgeUluZCA+IGltYWdlSGVpZ2h0IC0gMSkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgY3JvcFdpZHRoOyB4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBudW1DaGFubmVsczsgYysrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmQgPSBjICsgeCAqIG91dFN0cmlkZVsyXSArIHkgKiBvdXRTdHJpZGVbMV0gKyBiICogb3V0U3RyaWRlWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnZhbHVlc1tpbmRdID0gZXh0cmFwb2xhdGlvblZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1ldGhvZCA9PT0gJ2JpbGluZWFyJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvcEluZCA9IE1hdGguZmxvb3IoeUluZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgYm90dG9tSW5kID0gTWF0aC5jZWlsKHlJbmQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHlMZXJwID0geUluZCAtIHRvcEluZDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IGNyb3BXaWR0aDsgeCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhJbmQgPSAoY3JvcFdpZHRoID4gMSkgP1xuICAgICAgICAgICAgICAgICAgICAgICAgeDEgKiAoaW1hZ2VXaWR0aCAtIDEpICsgeCAqIHdpZHRoU2NhbGUgOlxuICAgICAgICAgICAgICAgICAgICAgICAgMC41ICogKHgxICsgeDIpICogKGltYWdlV2lkdGggLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHhJbmQgPCAwIHx8IHhJbmQgPiBpbWFnZVdpZHRoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBudW1DaGFubmVsczsgYysrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kID0gYyArIHggKiBvdXRTdHJpZGVbMl0gKyB5ICogb3V0U3RyaWRlWzFdICsgYiAqIG91dFN0cmlkZVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQudmFsdWVzW2luZF0gPSBleHRyYXBvbGF0aW9uVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsZWZ0SW5kID0gTWF0aC5mbG9vcih4SW5kKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmlnaHRJbmQgPSBNYXRoLmNlaWwoeEluZCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhMZXJwID0geEluZCAtIGxlZnRJbmQ7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgbnVtQ2hhbm5lbHM7IGMrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZCA9IGMgKyBsZWZ0SW5kICogaW5TdHJpZGVbMl0gKyB0b3BJbmQgKiBpblN0cmlkZVsxXSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYkluZCAqIGluU3RyaWRlWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9wTGVmdCA9IGltYWdlVmFsc1tpbmRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5kID0gYyArIHJpZ2h0SW5kICogaW5TdHJpZGVbMl0gKyB0b3BJbmQgKiBpblN0cmlkZVsxXSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYkluZCAqIGluU3RyaWRlWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9wUmlnaHQgPSBpbWFnZVZhbHNbaW5kXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZCA9IGMgKyBsZWZ0SW5kICogaW5TdHJpZGVbMl0gKyBib3R0b21JbmQgKiBpblN0cmlkZVsxXSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYkluZCAqIGluU3RyaWRlWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm90dG9tTGVmdCA9IGltYWdlVmFsc1tpbmRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5kID0gYyArIHJpZ2h0SW5kICogaW5TdHJpZGVbMl0gKyBib3R0b21JbmQgKiBpblN0cmlkZVsxXSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYkluZCAqIGluU3RyaWRlWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm90dG9tUmlnaHQgPSBpbWFnZVZhbHNbaW5kXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvcCA9IHRvcExlZnQgKyAodG9wUmlnaHQgLSB0b3BMZWZ0KSAqIHhMZXJwO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm90dG9tID0gYm90dG9tTGVmdCArIChib3R0b21SaWdodCAtIGJvdHRvbUxlZnQpICogeExlcnA7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmQgPSBjICsgeCAqIG91dFN0cmlkZVsyXSArIHkgKiBvdXRTdHJpZGVbMV0gKyBiICogb3V0U3RyaWRlWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnZhbHVlc1tpbmRdID0gdG9wICsgKChib3R0b20gLSB0b3ApICogeUxlcnApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7IC8vIG1ldGhvZCA9PSBcIm5lYXJlc3RcIlxuICAgICAgICAgICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgY3JvcFdpZHRoOyArK3gpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeEluZCA9IChjcm9wV2lkdGggPiAxKSA/XG4gICAgICAgICAgICAgICAgICAgICAgICB4MSAqIChpbWFnZVdpZHRoIC0gMSkgKyB4ICogd2lkdGhTY2FsZSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAwLjUgKiAoeDEgKyB4MikgKiAoaW1hZ2VXaWR0aCAtIDEpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoeEluZCA8IDAgfHwgeEluZCA+IGltYWdlV2lkdGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IG51bUNoYW5uZWxzOyBjKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmQgPSBjICsgeCAqIG91dFN0cmlkZVsyXSArIHkgKiBvdXRTdHJpZGVbMV0gKyBiICogb3V0U3RyaWRlWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC52YWx1ZXNbaW5kXSA9IGV4dHJhcG9sYXRpb25WYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsb3Nlc3RYID0gTWF0aC5yb3VuZCh4SW5kKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xvc2VzdFkgPSBNYXRoLnJvdW5kKHlJbmQpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IG51bUNoYW5uZWxzOyBjKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluSW5kID0gYyArIGNsb3Nlc3RYICogaW5TdHJpZGVbMl0gKyBjbG9zZXN0WSAqIGluU3RyaWRlWzFdICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSW5kICogaW5TdHJpZGVbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvdXRJbmQgPSBjICsgeCAqIG91dFN0cmlkZVsyXSArIHkgKiBvdXRTdHJpZGVbMV0gKyBiICogb3V0U3RyaWRlWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnZhbHVlc1tvdXRJbmRdID0gaW1hZ2VWYWxzW2luSW5kXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRwdXQuc2hhcGUsIG91dHB1dC5kdHlwZSwgb3V0cHV0LnZhbHVlcyk7XG59XG5leHBvcnQgY29uc3QgY3JvcEFuZFJlc2l6ZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBDcm9wQW5kUmVzaXplLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBjcm9wQW5kUmVzaXplXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q3JvcEFuZFJlc2l6ZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIEN1bXN1bSwgdXBjYXN0VHlwZSwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHsgdHJhbnNwb3NlIH0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuZXhwb3J0IGZ1bmN0aW9uIGN1bXN1bShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYXhpcywgZXhjbHVzaXZlLCByZXZlcnNlIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KHgsICdjdW1zdW0nKTtcbiAgICBjb25zdCBwZXJtdXRhdGlvbiA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oW2F4aXNdLCB4LnNoYXBlLmxlbmd0aCk7XG4gICAgbGV0ICR4ID0geDtcbiAgICBpZiAocGVybXV0YXRpb24gIT0gbnVsbCkge1xuICAgICAgICAkeCA9IHRyYW5zcG9zZSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHBlcm06IHBlcm11dGF0aW9uIH0gfSk7XG4gICAgfVxuICAgIGNvbnN0IHBlcm11dGVkQXhpcyA9IGJhY2tlbmRfdXRpbC5nZXRJbm5lck1vc3RBeGVzKDEsIHguc2hhcGUubGVuZ3RoKVswXTtcbiAgICBpZiAocGVybXV0ZWRBeGlzICE9PSAkeC5zaGFwZS5sZW5ndGggLSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgYmFja2VuZC5jdW1zdW0gaW4gQ1BVIGV4cGVjdHMgYW4gaW5uZXItbW9zdCBgICtcbiAgICAgICAgICAgIGBheGlzPSR7JHguc2hhcGUubGVuZ3RoIC0gMX0gYnV0IGdvdCBheGlzPSR7cGVybXV0ZWRBeGlzfWApO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHREdHlwZSA9IHVwY2FzdFR5cGUoJHguZHR5cGUsICdpbnQzMicpO1xuICAgIGNvbnN0IHZhbHMgPSB1dGlsLm1ha2VaZXJvc1R5cGVkQXJyYXkodXRpbC5zaXplRnJvbVNoYXBlKCR4LnNoYXBlKSwgcmVzdWx0RHR5cGUpO1xuICAgIGNvbnN0IGFWYWxzID0gYmFja2VuZC5kYXRhLmdldCgkeC5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBmaW5hbERpbSA9ICR4LnNoYXBlWyR4LnNoYXBlLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IGluZGV4QWRqdXN0ZXIgPSByZXZlcnNlID9cbiAgICAgICAgKGksIGopID0+IGkgKyBmaW5hbERpbSAtIGogLSAxIDpcbiAgICAgICAgKGksIGopID0+IGkgKyBqO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYVZhbHMubGVuZ3RoOyBpICs9IGZpbmFsRGltKSB7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZmluYWxEaW07IGorKykge1xuICAgICAgICAgICAgY29uc3QgaWR4ID0gaW5kZXhBZGp1c3RlcihpLCBqKTtcbiAgICAgICAgICAgIGlmIChqID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdmFsc1tpZHhdID0gZXhjbHVzaXZlID8gMCA6IGFWYWxzW2lkeF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2SWR4ID0gaW5kZXhBZGp1c3RlcihpLCBqIC0gMSk7XG4gICAgICAgICAgICAgICAgdmFsc1tpZHhdID0gZXhjbHVzaXZlID8gYVZhbHNbcHJldklkeF0gKyB2YWxzW3ByZXZJZHhdIDpcbiAgICAgICAgICAgICAgICAgICAgYVZhbHNbaWR4XSArIHZhbHNbcHJldklkeF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbygkeC5zaGFwZSwgcmVzdWx0RHR5cGUsIHZhbHMpO1xuICAgIGlmIChwZXJtdXRhdGlvbiAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHJldmVyc2VQZXJtdXRhdGlvbiA9IGJhY2tlbmRfdXRpbC5nZXRVbmRvQXhlc1Blcm11dGF0aW9uKHBlcm11dGF0aW9uKTtcbiAgICAgICAgY29uc3QgcmV2ZXJzZVRyYW5zcG9zZWRSZXN1bHQgPSB0cmFuc3Bvc2UoeyBpbnB1dHM6IHsgeDogcmVzdWx0IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHBlcm06IHJldmVyc2VQZXJtdXRhdGlvbiB9IH0pO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc3VsdCk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oJHgpO1xuICAgICAgICByZXR1cm4gcmV2ZXJzZVRyYW5zcG9zZWRSZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgY29uc3QgY3Vtc3VtQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEN1bXN1bSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogY3Vtc3VtXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q3Vtc3VtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IERlbnNlQmluY291bnQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYmluY291bnRJbXBsLCBiaW5jb3VudFJlZHVjZUltcGwgfSBmcm9tICcuL0JpbmNvdW50X2ltcGwnO1xuZXhwb3J0IGZ1bmN0aW9uIGRlbnNlQmluY291bnQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHgsIHdlaWdodHMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHNpemUsIGJpbmFyeU91dHB1dCB9ID0gYXR0cnM7XG4gICAgaWYgKHguc2hhcGUubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvbnN0IHhWYWxzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgICAgICBjb25zdCB3ZWlnaHRzVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQod2VpZ2h0cy5kYXRhSWQpLnZhbHVlcztcbiAgICAgICAgY29uc3Qgb3V0VmFscyA9IGJpbmNvdW50SW1wbCh4VmFscywgd2VpZ2h0c1ZhbHMsIHdlaWdodHMuZHR5cGUsIHdlaWdodHMuc2hhcGUsIHNpemUpO1xuICAgICAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbc2l6ZV0sIHdlaWdodHMuZHR5cGUsIG91dFZhbHMpO1xuICAgIH1cbiAgICBlbHNlIGlmICh4LnNoYXBlLmxlbmd0aCA9PT0gMikge1xuICAgICAgICBjb25zdCB4QnVmID0gYmFja2VuZC5idWZmZXJTeW5jKHgpO1xuICAgICAgICBjb25zdCB3ZWlnaHRzQnVmID0gYmFja2VuZC5idWZmZXJTeW5jKHdlaWdodHMpO1xuICAgICAgICBjb25zdCBvdXRCdWYgPSBiaW5jb3VudFJlZHVjZUltcGwoeEJ1Ziwgd2VpZ2h0c0J1Ziwgc2l6ZSwgYmluYXJ5T3V0cHV0KTtcbiAgICAgICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0QnVmLnNoYXBlLCB3ZWlnaHRzLmR0eXBlLCBvdXRCdWYudmFsdWVzKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBpbiBkZW5zZUJpbmNvdW50OiBpbnB1dCBtdXN0IGJlIGF0IG1vc3QgcmFuayAyLCBidXQgZ290IHJhbmtgICtcbiAgICAgICAgYCR7eC5zaGFwZS5sZW5ndGh9LmApO1xufVxuZXhwb3J0IGNvbnN0IGRlbnNlQmluY291bnRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRGVuc2VCaW5jb3VudCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogZGVuc2VCaW5jb3VudFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURlbnNlQmluY291bnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRGVwdGhUb1NwYWNlLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiBkZXB0aFRvU3BhY2UoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGJsb2NrU2l6ZSwgZGF0YUZvcm1hdCB9ID0gYXR0cnM7XG4gICAgdXRpbC5hc3NlcnQoZGF0YUZvcm1hdCA9PT0gJ05IV0MnLCAoKSA9PiBgT25seSBOSFdDIGRhdGFGb3JtYXQgc3VwcG9ydGVkIG9uIENQVSBmb3IgZGVwdGhUb1NwYWNlLiBHb3QgJHtkYXRhRm9ybWF0fWApO1xuICAgIHV0aWwuYXNzZXJ0KGJsb2NrU2l6ZSA+IDEsICgpID0+IGBibG9ja1NpemUgc2hvdWxkIGJlID4gMSBmb3IgZGVwdGhUb1NwYWNlLCBidXQgd2FzOiAke2Jsb2NrU2l6ZX1gKTtcbiAgICBjb25zdCBiYXRjaFNpemUgPSB4LnNoYXBlWzBdO1xuICAgIGNvbnN0IGlucHV0SGVpZ2h0ID0geC5zaGFwZVsxXTtcbiAgICBjb25zdCBpbnB1dFdpZHRoID0geC5zaGFwZVsyXTtcbiAgICBjb25zdCBpbnB1dERlcHRoID0geC5zaGFwZVszXTtcbiAgICBjb25zdCBvdXRwdXRIZWlnaHQgPSBpbnB1dEhlaWdodCAqIGJsb2NrU2l6ZTtcbiAgICBjb25zdCBvdXRwdXRXaWR0aCA9IGlucHV0V2lkdGggKiBibG9ja1NpemU7XG4gICAgY29uc3Qgb3V0cHV0RGVwdGggPSBpbnB1dERlcHRoIC8gKGJsb2NrU2l6ZSAqIGJsb2NrU2l6ZSk7XG4gICAgY29uc3QgeFZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgRmxvYXQzMkFycmF5KGJhdGNoU2l6ZSAqIG91dHB1dEhlaWdodCAqIG91dHB1dFdpZHRoICogb3V0cHV0RGVwdGgpO1xuICAgIGxldCBvdXRwdXRJZHggPSAwO1xuICAgIGZvciAobGV0IGIgPSAwOyBiIDwgYmF0Y2hTaXplOyArK2IpIHtcbiAgICAgICAgZm9yIChsZXQgaCA9IDA7IGggPCBvdXRwdXRIZWlnaHQ7ICsraCkge1xuICAgICAgICAgICAgY29uc3QgaW5IID0gTWF0aC5mbG9vcihoIC8gYmxvY2tTaXplKTtcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldEggPSAoaCAlIGJsb2NrU2l6ZSk7XG4gICAgICAgICAgICBmb3IgKGxldCB3ID0gMDsgdyA8IG91dHB1dFdpZHRoOyArK3cpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpblcgPSBNYXRoLmZsb29yKHcgLyBibG9ja1NpemUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldFcgPSAodyAlIGJsb2NrU2l6ZSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0RCA9IChvZmZzZXRIICogYmxvY2tTaXplICsgb2Zmc2V0VykgKiBvdXRwdXREZXB0aDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBkID0gMDsgZCA8IG91dHB1dERlcHRoOyArK2QpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5EID0gZCArIG9mZnNldEQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0SWR4ID0gaW5EICsgaW5wdXREZXB0aCAqIChpblcgKyBpbnB1dFdpZHRoICogKGluSCArIGlucHV0SGVpZ2h0ICogYikpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRbb3V0cHV0SWR4KytdID0geFZhbHVlc1tpbnB1dElkeF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtiYXRjaFNpemUsIG91dHB1dEhlaWdodCwgb3V0cHV0V2lkdGgsIG91dHB1dERlcHRoXSwgeC5kdHlwZSwgcmVzdWx0KTtcbn1cbmV4cG9ydCBjb25zdCBkZXB0aFRvU3BhY2VDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRGVwdGhUb1NwYWNlLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBkZXB0aFRvU3BhY2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EZXB0aFRvU3BhY2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBEZXB0aHdpc2VDb252MmROYXRpdmUsIFRlbnNvckJ1ZmZlciwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIGRlcHRod2lzZUNvbnYyZE5hdGl2ZShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCwgZmlsdGVyIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBzdHJpZGVzLCBwYWQsIGRpbGF0aW9ucywgZGltUm91bmRpbmdNb2RlIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KFt4LCBmaWx0ZXJdLCAnZGVwdGh3aXNlQ29udjJETmF0aXZlJyk7XG4gICAgY29uc3QgeFN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKHguc2hhcGUpO1xuICAgIGNvbnN0IGZpbHRlclN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGZpbHRlci5zaGFwZSk7XG4gICAgbGV0ICRkaWxhdGlvbnMgPSBkaWxhdGlvbnM7XG4gICAgaWYgKCRkaWxhdGlvbnMgPT0gbnVsbCkge1xuICAgICAgICAkZGlsYXRpb25zID0gWzEsIDFdO1xuICAgIH1cbiAgICB1dGlsLmFzc2VydChiYWNrZW5kX3V0aWwuZWl0aGVyU3RyaWRlc09yRGlsYXRpb25zQXJlT25lKHN0cmlkZXMsICRkaWxhdGlvbnMpLCAoKSA9PiAnRXJyb3IgaW4gZGVwdGh3aXNlQ29udjJkOiBFaXRoZXIgc3RyaWRlcyBvciBkaWxhdGlvbnMgbXVzdCBiZSAnICtcbiAgICAgICAgYDEuIEdvdCBzdHJpZGVzICR7c3RyaWRlc30gYW5kIGRpbGF0aW9ucyAnJHskZGlsYXRpb25zfSdgKTtcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyh4LnNoYXBlLCBmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsICRkaWxhdGlvbnMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCB0cnVlIC8qIGRlcHRod2lzZSAqLyk7XG4gICAgY29uc3QgeyBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBkaWxhdGlvbkhlaWdodCwgZGlsYXRpb25XaWR0aCwgcGFkSW5mbyB9ID0gY29udkluZm87XG4gICAgY29uc3QgcGFkTGVmdCA9IHBhZEluZm8ubGVmdDtcbiAgICBjb25zdCBwYWRUb3AgPSBwYWRJbmZvLnRvcDtcbiAgICBjb25zdCBjaE11bCA9IGNvbnZJbmZvLm91dENoYW5uZWxzIC8gY29udkluZm8uaW5DaGFubmVscztcbiAgICBjb25zdCB5ID0gbmV3IFRlbnNvckJ1ZmZlcihjb252SW5mby5vdXRTaGFwZSwgeC5kdHlwZSk7XG4gICAgY29uc3QgeFZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3Qgd1ZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KGZpbHRlci5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCB5VmFscyA9IHkudmFsdWVzO1xuICAgIGZvciAobGV0IGIgPSAwOyBiIDwgY29udkluZm8uYmF0Y2hTaXplOyArK2IpIHtcbiAgICAgICAgY29uc3QgeE9mZnNldDEgPSBiICogeFN0cmlkZXNbMF07XG4gICAgICAgIGNvbnN0IHlPZmZzZXQxID0gYiAqIHkuc3RyaWRlc1swXTtcbiAgICAgICAgZm9yIChsZXQgeVIgPSAwOyB5UiA8IGNvbnZJbmZvLm91dEhlaWdodDsgKyt5Uikge1xuICAgICAgICAgICAgY29uc3QgeU9mZnNldDIgPSB5T2Zmc2V0MSArIHlSICogeS5zdHJpZGVzWzFdO1xuICAgICAgICAgICAgY29uc3QgeFJDb3JuZXIgPSB5UiAqIGNvbnZJbmZvLnN0cmlkZUhlaWdodCAtIHBhZFRvcDtcbiAgICAgICAgICAgIGZvciAobGV0IHdSID0gMDsgd1IgPCBmaWx0ZXJIZWlnaHQ7ICsrd1IpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4UiA9IHhSQ29ybmVyICsgd1IgKiBkaWxhdGlvbkhlaWdodDtcbiAgICAgICAgICAgICAgICBpZiAoeFIgPCAwIHx8IHhSID49IGNvbnZJbmZvLmluSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB3T2Zmc2V0MSA9IHdSICogZmlsdGVyU3RyaWRlc1swXTtcbiAgICAgICAgICAgICAgICBjb25zdCB4T2Zmc2V0MiA9IHhPZmZzZXQxICsgeFIgKiB4U3RyaWRlc1sxXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB5QyA9IDA7IHlDIDwgY29udkluZm8ub3V0V2lkdGg7ICsreUMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeU9mZnNldDMgPSB5T2Zmc2V0MiArIHlDICogeS5zdHJpZGVzWzJdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4Q0Nvcm5lciA9IHlDICogY29udkluZm8uc3RyaWRlV2lkdGggLSBwYWRMZWZ0O1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB3QyA9IDA7IHdDIDwgZmlsdGVyV2lkdGg7ICsrd0MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhDID0geENDb3JuZXIgKyB3QyAqIGRpbGF0aW9uV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeEMgPCAwIHx8IHhDID49IGNvbnZJbmZvLmluV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdPZmZzZXQyID0gd09mZnNldDEgKyB3QyAqIGZpbHRlclN0cmlkZXNbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4T2Zmc2V0MyA9IHhPZmZzZXQyICsgeEMgKiBjb252SW5mby5pbkNoYW5uZWxzO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHlPZmZzZXQ0ID0geU9mZnNldDM7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgd09mZnNldDMgPSB3T2Zmc2V0MjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGQxID0gMDsgZDEgPCBjb252SW5mby5pbkNoYW5uZWxzOyArK2QxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeFZhbCA9IHhWYWxzW3hPZmZzZXQzICsgZDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHEgPSAwOyBxIDwgY2hNdWw7ICsrcSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5VmFsc1t5T2Zmc2V0NCArIHFdICs9IHhWYWwgKiB3VmFsc1t3T2Zmc2V0MyArIHFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5T2Zmc2V0NCArPSBjaE11bDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3T2Zmc2V0MyArPSBjaE11bDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyh5LnNoYXBlLCB5LmR0eXBlLCB5LnZhbHVlcyk7XG59XG5leHBvcnQgY29uc3QgZGVwdGh3aXNlQ29udjJkTmF0aXZlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IERlcHRod2lzZUNvbnYyZE5hdGl2ZSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogZGVwdGh3aXNlQ29udjJkTmF0aXZlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGVwdGh3aXNlQ29udjJkTmF0aXZlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIsIFRlbnNvckJ1ZmZlciB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4LCBkeSB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgZmlsdGVyU2hhcGUgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoW3gsIGR5XSwgJ2RlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyJyk7XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZUNvbnYyREluZm8oeC5zaGFwZSwgZmlsdGVyU2hhcGUsIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIHRydWUgLyogZGVwdGh3aXNlICovKTtcbiAgICBjb25zdCB7IHN0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGggfSA9IGNvbnZJbmZvO1xuICAgIGNvbnN0IGRXID0gbmV3IFRlbnNvckJ1ZmZlcihjb252SW5mby5maWx0ZXJTaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICBjb25zdCBsZWZ0UGFkID0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgIGNvbnN0IHRvcFBhZCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IGNoTXVsID0gY29udkluZm8ub3V0Q2hhbm5lbHMgLyBjb252SW5mby5pbkNoYW5uZWxzO1xuICAgIGNvbnN0IHhWYWxzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHhCdWYgPSBuZXcgVGVuc29yQnVmZmVyKHguc2hhcGUsIHguZHR5cGUsIHhWYWxzKTtcbiAgICBjb25zdCBkeVZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KGR5LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IGR5QnVmID0gbmV3IFRlbnNvckJ1ZmZlcihkeS5zaGFwZSwgZHkuZHR5cGUsIGR5VmFscyk7XG4gICAgZm9yIChsZXQgd1IgPSAwOyB3UiA8IGZpbHRlckhlaWdodDsgKyt3Uikge1xuICAgICAgICBjb25zdCB5Uk1pbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCgodG9wUGFkIC0gd1IpIC8gc3RyaWRlSGVpZ2h0KSk7XG4gICAgICAgIGNvbnN0IHlSTWF4ID0gTWF0aC5taW4oY29udkluZm8ub3V0SGVpZ2h0LCAoY29udkluZm8uaW5IZWlnaHQgKyB0b3BQYWQgLSB3UikgLyBzdHJpZGVIZWlnaHQpO1xuICAgICAgICBmb3IgKGxldCB3QyA9IDA7IHdDIDwgZmlsdGVyV2lkdGg7ICsrd0MpIHtcbiAgICAgICAgICAgIGNvbnN0IHlDTWluID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKChsZWZ0UGFkIC0gd0MpIC8gc3RyaWRlV2lkdGgpKTtcbiAgICAgICAgICAgIGNvbnN0IHlDTWF4ID0gTWF0aC5taW4oY29udkluZm8ub3V0V2lkdGgsIChjb252SW5mby5pbldpZHRoICsgbGVmdFBhZCAtIHdDKSAvIHN0cmlkZVdpZHRoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGQyID0gMDsgZDIgPCBjb252SW5mby5vdXRDaGFubmVsczsgKytkMikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGQxID0gTWF0aC50cnVuYyhkMiAvIGNoTXVsKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkbSA9IGQyICUgY2hNdWw7XG4gICAgICAgICAgICAgICAgbGV0IGRvdFByb2QgPSAwO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGIgPSAwOyBiIDwgY29udkluZm8uYmF0Y2hTaXplOyArK2IpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgeVIgPSB5Uk1pbjsgeVIgPCB5Uk1heDsgKyt5Uikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeFIgPSB3UiArIHlSICogc3RyaWRlSGVpZ2h0IC0gdG9wUGFkO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgeUMgPSB5Q01pbjsgeUMgPCB5Q01heDsgKyt5Qykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhDID0gd0MgKyB5QyAqIHN0cmlkZVdpZHRoIC0gbGVmdFBhZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3RQcm9kICs9IHhCdWYuZ2V0KGIsIHhSLCB4QywgZDEpICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHlCdWYuZ2V0KGIsIHlSLCB5QywgZDIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRXLnNldChkb3RQcm9kLCB3Uiwgd0MsIGQxLCBkbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oZFcuc2hhcGUsIGRXLmR0eXBlLCBkVy52YWx1ZXMpO1xufVxuZXhwb3J0IGNvbnN0IGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IERlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCwgVGVuc29yQnVmZmVyLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5leHBvcnQgZnVuY3Rpb24gZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgZHksIGZpbHRlciB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgaW5wdXRTaGFwZSB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChbZHksIGZpbHRlcl0sICdkZXB0aHdpc2VDb252MkROYXRpdmVCYWNrcHJvcElucHV0Jyk7XG4gICAgY29uc3QgZHlTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhkeS5zaGFwZSk7XG4gICAgY29uc3QgZmlsdGVyU3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoZmlsdGVyLnNoYXBlKTtcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyhpbnB1dFNoYXBlLCBmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIHRydWUgLyogZGVwdGh3aXNlICovKTtcbiAgICBjb25zdCBkeCA9IG5ldyBUZW5zb3JCdWZmZXIoY29udkluZm8uaW5TaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICBjb25zdCBkeFZhbHVlcyA9IGR4LnZhbHVlcztcbiAgICBjb25zdCBbZHhTMCwgZHhTMSwgZHhTMl0gPSBkeC5zdHJpZGVzO1xuICAgIGNvbnN0IGR5VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldChkeS5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBbZHlTMCwgZHlTMSwgZHlTMl0gPSBkeVN0cmlkZXM7XG4gICAgY29uc3QgZmx0VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldChmaWx0ZXIuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgW2ZsdFMwLCBmbHRTMSwgZmx0UzJdID0gZmlsdGVyU3RyaWRlcztcbiAgICBjb25zdCB7IGJhdGNoU2l6ZSwgZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5DaGFubmVscywgaW5IZWlnaHQsIGluV2lkdGgsIG91dENoYW5uZWxzLCBvdXRIZWlnaHQsIG91dFdpZHRoLCBzdHJpZGVIZWlnaHQsIHN0cmlkZVdpZHRoIH0gPSBjb252SW5mbztcbiAgICBjb25zdCB0b3BQYWQgPSBmaWx0ZXJIZWlnaHQgLSAxIC0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgbGVmdFBhZCA9IGZpbHRlcldpZHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICBjb25zdCBjaE11bCA9IG91dENoYW5uZWxzIC8gaW5DaGFubmVscztcbiAgICBmb3IgKGxldCBiID0gMDsgYiA8IGJhdGNoU2l6ZTsgKytiKSB7XG4gICAgICAgIGZvciAobGV0IGQxID0gMDsgZDEgPCBpbkNoYW5uZWxzOyArK2QxKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB4UiA9IDA7IHhSIDwgaW5IZWlnaHQ7ICsreFIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4UkNvcm5lciA9IHhSIC0gdG9wUGFkO1xuICAgICAgICAgICAgICAgIGNvbnN0IHhSTWluID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKHhSQ29ybmVyIC8gc3RyaWRlSGVpZ2h0KSk7XG4gICAgICAgICAgICAgICAgY29uc3QgeVJNYXggPSBNYXRoLm1pbihvdXRIZWlnaHQsIChmaWx0ZXJIZWlnaHQgKyB4UkNvcm5lcikgLyBzdHJpZGVIZWlnaHQpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHhDID0gMDsgeEMgPCBpbldpZHRoOyArK3hDKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhDQ29ybmVyID0geEMgLSBsZWZ0UGFkO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4Q01pbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCh4Q0Nvcm5lciAvIHN0cmlkZVdpZHRoKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHlDTWF4ID0gTWF0aC5taW4ob3V0V2lkdGgsIChmaWx0ZXJXaWR0aCArIHhDQ29ybmVyKSAvIHN0cmlkZVdpZHRoKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRvdFByb2QgPSAwO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB5UiA9IHhSTWluOyB5UiA8IHlSTWF4OyArK3lSKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3UiA9IHlSICogc3RyaWRlSGVpZ2h0IC0geFJDb3JuZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB5QyA9IHhDTWluOyB5QyA8IHlDTWF4OyArK3lDKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd0MgPSB5QyAqIHN0cmlkZVdpZHRoIC0geENDb3JuZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHlPZmZzZXQgPSBkeVMwICogYiArIGR5UzEgKiB5UiArIGR5UzIgKiB5QztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbHRPZmZzZXQgPSBmbHRTMCAqIChmaWx0ZXJIZWlnaHQgLSAxIC0gd1IpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmx0UzEgKiAoZmlsdGVyV2lkdGggLSAxIC0gd0MpICsgZmx0UzIgKiBkMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBkbSA9IDA7IGRtIDwgY2hNdWw7ICsrZG0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZDIgPSBkMSAqIGNoTXVsICsgZG07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBpeGVsID0gZHlWYWx1ZXNbZHlPZmZzZXQgKyBkMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdlaWdodCA9IGZsdFZhbHVlc1tmbHRPZmZzZXQgKyBkbV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdFByb2QgKz0gcGl4ZWwgKiB3ZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGR4VmFsdWVzW2R4UzAgKiBiICsgZHhTMSAqIHhSICsgZHhTMiAqIHhDICsgZDFdID0gZG90UHJvZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oZHguc2hhcGUsIGR4LmR0eXBlLCBkeC52YWx1ZXMpO1xufVxuZXhwb3J0IGNvbnN0IGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYnVmZmVyLCBEaWFnLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiBkaWFnKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB4U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSh4LnNoYXBlKTtcbiAgICBjb25zdCB4VmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBvdXRCdWYgPSBidWZmZXIoW3hTaXplLCB4U2l6ZV0sIHguZHR5cGUpO1xuICAgIGNvbnN0IHZhbHMgPSBvdXRCdWYudmFsdWVzO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeFZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFsc1tpICogeFNpemUgKyBpXSA9IHhWYWxzW2ldO1xuICAgIH1cbiAgICBjb25zdCBvdXRTaGFwZSA9IFsuLi54LnNoYXBlLCAuLi54LnNoYXBlXTtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRTaGFwZSwgb3V0QnVmLmR0eXBlLCBvdXRCdWYudmFsdWVzKTtcbn1cbmV4cG9ydCBjb25zdCBkaWFnQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IERpYWcsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGRpYWdcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EaWFnLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgRGlsYXRpb24yRCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgY29uc3QgZGlsYXRpb24yZENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBEaWxhdGlvbjJELFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiAoeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0pID0+IHtcbiAgICAgICAgY29uc3QgeyB4LCBmaWx0ZXIgfSA9IGlucHV0cztcbiAgICAgICAgY29uc3QgeyBzdHJpZGVzLCBwYWQsIGRpbGF0aW9ucyB9ID0gYXR0cnM7XG4gICAgICAgIGNvbnN0IGNwdUJhY2tlbmQgPSBiYWNrZW5kO1xuICAgICAgICBjb25zdCB4VmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcztcbiAgICAgICAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcbiAgICAgICAgY29uc3QgZmlsdGVyVmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoZmlsdGVyLmRhdGFJZCkudmFsdWVzO1xuICAgICAgICBjb25zdCBmaWx0ZXJSYW5rID0gZmlsdGVyLnNoYXBlLmxlbmd0aDtcbiAgICAgICAgY29uc3QgeyBiYXRjaFNpemUsIGluSGVpZ2h0LCBpbldpZHRoLCBpbkNoYW5uZWxzLCBvdXRIZWlnaHQsIG91dFdpZHRoLCBwYWRJbmZvLCBzdHJpZGVIZWlnaHQsIHN0cmlkZVdpZHRoLCBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBkaWxhdGlvbkhlaWdodCwgZGlsYXRpb25XaWR0aCwgb3V0U2hhcGUgfSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlRGlsYXRpb24yREluZm8oeC5zaGFwZSwgZmlsdGVyLnNoYXBlLCBzdHJpZGVzLCBwYWQsICdOSFdDJyAvKiBkYXRhRm9ybWF0ICovLCBkaWxhdGlvbnMpO1xuICAgICAgICBjb25zdCBvdXRTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKG91dFNoYXBlKTtcbiAgICAgICAgY29uc3Qgb3V0UmFuayA9IG91dFNoYXBlLmxlbmd0aDtcbiAgICAgICAgY29uc3Qgb3V0cHV0VmFscyA9IHV0aWwuZ2V0QXJyYXlGcm9tRFR5cGUoeC5kdHlwZSwgb3V0U2l6ZSk7XG4gICAgICAgIC8vIFVwc2FtcGxpbmcgdGhlIGlucHV0IGJ5IGZpbGwgaW4gYGRpbGF0aW9uIHNpemUgLSAxYCB2YWx1ZXMgYmV0d2VlbiBlYWNoXG4gICAgICAgIC8vIGlucHV0IHZhbHVlLlxuICAgICAgICAvLyBUaGlzIGltcGxlbWVudGF0aW9uIGZvbGxvd3MgdGhlIFRGIGMrKyBpbXBsZW1lbnRhdGlvbjpcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yZmxvdy9ibG9iL2Q5YTNhODQ5ZWRjMTk4ZTkwMTcyYmM1OGViMjkzZGU0NTdmOWQ5ODYvdGVuc29yZmxvdy9jb3JlL2tlcm5lbHMvZGlsYXRpb25fb3BzLmNjXG4gICAgICAgIGZvciAobGV0IGIgPSAwOyBiIDwgYmF0Y2hTaXplOyArK2IpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGhPdXQgPSAwOyBoT3V0IDwgb3V0SGVpZ2h0OyArK2hPdXQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBoQmVnID0gaE91dCAqIHN0cmlkZUhlaWdodCAtIHBhZEluZm8udG9wO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHdPdXQgPSAwOyB3T3V0IDwgb3V0V2lkdGg7ICsrd091dCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB3QmVnID0gd091dCAqIHN0cmlkZVdpZHRoIC0gcGFkSW5mby5sZWZ0O1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBkID0gMDsgZCA8IGluQ2hhbm5lbHM7ICsrZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGN1clZhbCA9IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaCA9IDA7IGggPCBmaWx0ZXJIZWlnaHQ7ICsraCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhJbiA9IGhCZWcgKyBoICogZGlsYXRpb25IZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhJbiA+PSAwICYmIGhJbiA8IGluSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHcgPSAwOyB3IDwgZmlsdGVyV2lkdGg7ICsrdykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd0luID0gd0JlZyArIHcgKiBkaWxhdGlvbldpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdJbiA+PSAwICYmIHdJbiA8IGluV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4SW5kZXggPSB1dGlsLmxvY1RvSW5kZXgoW2IsIGhJbiwgd0luLCBkXSwgeFJhbmssIHV0aWwuY29tcHV0ZVN0cmlkZXMoeC5zaGFwZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlckluZGV4ID0gdXRpbC5sb2NUb0luZGV4KFtoLCB3LCBkXSwgZmlsdGVyUmFuaywgdXRpbC5jb21wdXRlU3RyaWRlcyhmaWx0ZXIuc2hhcGUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSB4VmFsc1t4SW5kZXhdICsgZmlsdGVyVmFsc1tmaWx0ZXJJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA+IGN1clZhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJWYWwgPSB2YWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0SW5kZXggPSB1dGlsLmxvY1RvSW5kZXgoW2IsIGhPdXQsIHdPdXQsIGRdLCBvdXRSYW5rLCB1dGlsLmNvbXB1dGVTdHJpZGVzKG91dFNoYXBlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRWYWxzW291dHB1dEluZGV4XSA9IGN1clZhbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRhSWQgPSBjcHVCYWNrZW5kLndyaXRlKHV0aWwudG9UeXBlZEFycmF5KG91dHB1dFZhbHMsIHguZHR5cGUpLCBvdXRTaGFwZSwgeC5kdHlwZSk7XG4gICAgICAgIHJldHVybiB7IGRhdGFJZCwgc2hhcGU6IG91dFNoYXBlLCBkdHlwZTogeC5kdHlwZSB9O1xuICAgIH1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EaWxhdGlvbjJELmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgRGlsYXRpb24yREJhY2twcm9wRmlsdGVyLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBjb25zdCBkaWxhdGlvbjJkQmFja3Byb3BGaWx0ZXJDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRGlsYXRpb24yREJhY2twcm9wRmlsdGVyLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiAoeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0pID0+IHtcbiAgICAgICAgY29uc3QgeyB4LCBmaWx0ZXIsIGR5IH0gPSBpbnB1dHM7XG4gICAgICAgIGNvbnN0IHsgc3RyaWRlcywgcGFkLCBkaWxhdGlvbnMgfSA9IGF0dHJzO1xuICAgICAgICBjb25zdCBjcHVCYWNrZW5kID0gYmFja2VuZDtcbiAgICAgICAgY29uc3QgJHggPSB1dGlsLnRvTmVzdGVkQXJyYXkoeC5zaGFwZSwgY3B1QmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzKTtcbiAgICAgICAgY29uc3QgJGZpbHRlciA9IHV0aWwudG9OZXN0ZWRBcnJheShmaWx0ZXIuc2hhcGUsIGNwdUJhY2tlbmQuZGF0YS5nZXQoZmlsdGVyLmRhdGFJZCkudmFsdWVzKTtcbiAgICAgICAgY29uc3QgeyBiYXRjaFNpemUsIGluSGVpZ2h0LCBpbldpZHRoLCBpbkNoYW5uZWxzLCBvdXRIZWlnaHQsIG91dFdpZHRoLCBwYWRJbmZvLCBzdHJpZGVIZWlnaHQsIHN0cmlkZVdpZHRoLCBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBkaWxhdGlvbkhlaWdodCwgZGlsYXRpb25XaWR0aCwgb3V0U2hhcGUgfSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlRGlsYXRpb24yREluZm8oeC5zaGFwZSwgZmlsdGVyLnNoYXBlLCBzdHJpZGVzLCBwYWQsICdOSFdDJyAvKiBkYXRhRm9ybWF0ICovLCBkaWxhdGlvbnMpO1xuICAgICAgICB1dGlsLmFzc2VydChkeS5yYW5rID09PSBvdXRTaGFwZS5sZW5ndGgsICgpID0+IGBFcnJvciBpbiAke0RpbGF0aW9uMkRCYWNrcHJvcEZpbHRlcn0sIGR5IGAgK1xuICAgICAgICAgICAgYG11c3QgaGF2ZSB0aGUgc2FtZSByYW5rIGFzIG91dHB1dCAke291dFNoYXBlLmxlbmd0aH0sIGJ1dCBnb3QgYCArXG4gICAgICAgICAgICBgJHtkeS5yYW5rfWApO1xuICAgICAgICBjb25zdCAkZHkgPSB1dGlsLnRvTmVzdGVkQXJyYXkob3V0U2hhcGUsIGNwdUJhY2tlbmQuZGF0YS5nZXQoZHkuZGF0YUlkKS52YWx1ZXMpO1xuICAgICAgICAvLyBUaGUgY29tcHV0ZWQgZmlsdGVyIGdyYWRpZW50cyBoYXMgdGhlIHNhbWUgZGltZW5zaW9ucyBhcyB0aGUgZmlsdGVyOlxuICAgICAgICAvLyBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgZGVwdGhdXG4gICAgICAgIGNvbnN0IGdyYWRpZW50cyA9IHV0aWwubWFrZVplcm9zTmVzdGVkVHlwZWRBcnJheShmaWx0ZXIuc2hhcGUsIGZpbHRlci5kdHlwZSk7XG4gICAgICAgIC8vIEluIHRoZSBjYXNlIG9mIG11bHRpcGxlIGFyZ21heCBicmFuY2hlcywgd2Ugb25seSBiYWNrLXByb3BhZ2F0ZSBhbG9uZyB0aGVcbiAgICAgICAgLy8gbGFzdCBicmFuY2gsIGkuZS4sIHRoZSBvbmUgd2l0aCBsYXJnZXN0IHZhbHVlIG9mIGBoICogZmlsdGVyX2NvbHMgKyB3YCxcbiAgICAgICAgLy8gc2ltaWxhcmx5IHRvIHRoZSBtYXgtcG9vbGluZyBiYWNrd2FyZCByb3V0aW5lcy5cbiAgICAgICAgLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBmb2xsb3dzIHRoZSBURiBjKysgaW1wbGVtZW50YXRpb246XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmZsb3cvYmxvYi9kOWEzYTg0OWVkYzE5OGU5MDE3MmJjNThlYjI5M2RlNDU3ZjlkOTg2L3RlbnNvcmZsb3cvY29yZS9rZXJuZWxzL2RpbGF0aW9uX29wcy5jY1xuICAgICAgICBmb3IgKGxldCBiID0gMDsgYiA8IGJhdGNoU2l6ZTsgKytiKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBoT3V0ID0gMDsgaE91dCA8IG91dEhlaWdodDsgKytoT3V0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaEJlZyA9IGhPdXQgKiBzdHJpZGVIZWlnaHQgLSBwYWRJbmZvLnRvcDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB3T3V0ID0gMDsgd091dCA8IG91dFdpZHRoOyArK3dPdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgd0JlZyA9IHdPdXQgKiBzdHJpZGVXaWR0aCAtIHBhZEluZm8ubGVmdDtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgZCA9IDA7IGQgPCBpbkNoYW5uZWxzOyArK2QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjdXJWYWwgPSBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoTWF4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB3TWF4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGggPSAwOyBoIDwgZmlsdGVySGVpZ2h0OyArK2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoSW4gPSBoQmVnICsgaCAqIGRpbGF0aW9uSGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoSW4gPj0gMCAmJiBoSW4gPCBpbkhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB3ID0gMDsgdyA8IGZpbHRlcldpZHRoOyArK3cpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdJbiA9IHdCZWcgKyB3ICogZGlsYXRpb25XaWR0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3SW4gPj0gMCAmJiB3SW4gPCBpbldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gJHhbYl1baEluXVt3SW5dW2RdICsgJGZpbHRlcltoXVt3XVtkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsID4gY3VyVmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1clZhbCA9IHZhbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaE1heCA9IGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdNYXggPSB3O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGdyYWRpZW50c1toTWF4XVt3TWF4XVtkXSArPSAkZHlbYl1baE91dF1bd091dF1bZF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YUlkID0gY3B1QmFja2VuZC53cml0ZSh1dGlsLnRvVHlwZWRBcnJheShncmFkaWVudHMsIHguZHR5cGUpLCBmaWx0ZXIuc2hhcGUsIGZpbHRlci5kdHlwZSk7XG4gICAgICAgIHJldHVybiB7IGRhdGFJZCwgc2hhcGU6IGZpbHRlci5zaGFwZSwgZHR5cGU6IGZpbHRlci5kdHlwZSB9O1xuICAgIH1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EaWxhdGlvbjJEQmFja3Byb3BGaWx0ZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBEaWxhdGlvbjJEQmFja3Byb3BJbnB1dCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgY29uc3QgZGlsYXRpb24yZEJhY2twcm9wSW5wdXRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRGlsYXRpb24yREJhY2twcm9wSW5wdXQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6ICh7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IHgsIGZpbHRlciwgZHkgfSA9IGlucHV0cztcbiAgICAgICAgY29uc3QgeyBzdHJpZGVzLCBwYWQsIGRpbGF0aW9ucyB9ID0gYXR0cnM7XG4gICAgICAgIGNvbnN0IGNwdUJhY2tlbmQgPSBiYWNrZW5kO1xuICAgICAgICBjb25zdCAkeCA9IHV0aWwudG9OZXN0ZWRBcnJheSh4LnNoYXBlLCBjcHVCYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXMpO1xuICAgICAgICBjb25zdCAkZmlsdGVyID0gdXRpbC50b05lc3RlZEFycmF5KGZpbHRlci5zaGFwZSwgY3B1QmFja2VuZC5kYXRhLmdldChmaWx0ZXIuZGF0YUlkKS52YWx1ZXMpO1xuICAgICAgICBjb25zdCB7IGJhdGNoU2l6ZSwgaW5IZWlnaHQsIGluV2lkdGgsIGluQ2hhbm5lbHMsIG91dEhlaWdodCwgb3V0V2lkdGgsIHBhZEluZm8sIHN0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGRpbGF0aW9uSGVpZ2h0LCBkaWxhdGlvbldpZHRoLCBvdXRTaGFwZSB9ID0gYmFja2VuZF91dGlsLmNvbXB1dGVEaWxhdGlvbjJESW5mbyh4LnNoYXBlLCBmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsIHBhZCwgJ05IV0MnIC8qIGRhdGFGb3JtYXQgKi8sIGRpbGF0aW9ucyk7XG4gICAgICAgIHV0aWwuYXNzZXJ0KGR5LnJhbmsgPT09IG91dFNoYXBlLmxlbmd0aCwgKCkgPT4gYEVycm9yIGluICR7RGlsYXRpb24yREJhY2twcm9wSW5wdXR9LCBkeSBgICtcbiAgICAgICAgICAgIGBtdXN0IGhhdmUgdGhlIHNhbWUgcmFuayBhcyBvdXRwdXQgJHtvdXRTaGFwZS5sZW5ndGh9LCBidXQgZ290IGAgK1xuICAgICAgICAgICAgYCR7ZHkucmFua31gKTtcbiAgICAgICAgY29uc3QgJGR5ID0gdXRpbC50b05lc3RlZEFycmF5KG91dFNoYXBlLCBjcHVCYWNrZW5kLmRhdGEuZ2V0KGR5LmRhdGFJZCkudmFsdWVzKTtcbiAgICAgICAgLy8gVGhlIGNvbXB1dGVkIGdyYWRpZW50cyBoYXMgdGhlIHNhbWUgZGltZW5zaW9ucyBhcyB0aGUgaW5wdXQ6XG4gICAgICAgIC8vIFtiYXRjaCwgaW5wdXRIZWlnaHQsIGlucHV0Q29scywgaW5DaGFubmVsXVxuICAgICAgICBjb25zdCBncmFkaWVudHMgPSB1dGlsLm1ha2VaZXJvc05lc3RlZFR5cGVkQXJyYXkoeC5zaGFwZSwgeC5kdHlwZSk7XG4gICAgICAgIC8vIEluIHRoZSBjYXNlIG9mIG11bHRpcGxlIGFyZ21heCBicmFuY2hlcywgd2Ugb25seSBiYWNrLXByb3BhZ2F0ZSBhbG9uZyB0aGVcbiAgICAgICAgLy8gbGFzdCBicmFuY2gsIGkuZS4sIHRoZSBvbmUgd2l0aCBsYXJnZXN0IHZhbHVlIG9mIGBoICogZmlsdGVyX2NvbHMgKyB3YCxcbiAgICAgICAgLy8gc2ltaWxhcmx5IHRvIHRoZSBtYXgtcG9vbGluZyBiYWNrd2FyZCByb3V0aW5lcy5cbiAgICAgICAgLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBmb2xsb3dzIHRoZSBURiBjKysgaW1wbGVtZW50YXRpb246XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmZsb3cvYmxvYi9kOWEzYTg0OWVkYzE5OGU5MDE3MmJjNThlYjI5M2RlNDU3ZjlkOTg2L3RlbnNvcmZsb3cvY29yZS9rZXJuZWxzL2RpbGF0aW9uX29wcy5jY1xuICAgICAgICBmb3IgKGxldCBiID0gMDsgYiA8IGJhdGNoU2l6ZTsgKytiKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBoT3V0ID0gMDsgaE91dCA8IG91dEhlaWdodDsgKytoT3V0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaEJlZyA9IGhPdXQgKiBzdHJpZGVIZWlnaHQgLSBwYWRJbmZvLnRvcDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB3T3V0ID0gMDsgd091dCA8IG91dFdpZHRoOyArK3dPdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgd0JlZyA9IHdPdXQgKiBzdHJpZGVXaWR0aCAtIHBhZEluZm8ubGVmdDtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgZCA9IDA7IGQgPCBpbkNoYW5uZWxzOyArK2QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjdXJWYWwgPSBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoSW5NYXggPSAoaEJlZyA8IDApID8gMCA6IGhCZWc7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgd0luTWF4ID0gKHdCZWcgPCAwKSA/IDAgOiB3QmVnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaCA9IDA7IGggPCBmaWx0ZXJIZWlnaHQ7ICsraCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhJbiA9IGhCZWcgKyBoICogZGlsYXRpb25IZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhJbiA+PSAwICYmIGhJbiA8IGluSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHcgPSAwOyB3IDwgZmlsdGVyV2lkdGg7ICsrdykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd0luID0gd0JlZyArIHcgKiBkaWxhdGlvbldpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdJbiA+PSAwICYmIHdJbiA8IGluV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSAkeFtiXVtoSW5dW3dJbl1bZF0gKyAkZmlsdGVyW2hdW3ddW2RdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwgPiBjdXJWYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyVmFsID0gdmFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSW5NYXggPSBoSW47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdJbk1heCA9IHdJbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBncmFkaWVudHNbYl1baEluTWF4XVt3SW5NYXhdW2RdICs9ICRkeVtiXVtoT3V0XVt3T3V0XVtkXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRhSWQgPSBjcHVCYWNrZW5kLndyaXRlKHV0aWwudG9UeXBlZEFycmF5KGdyYWRpZW50cywgeC5kdHlwZSksIHguc2hhcGUsIHguZHR5cGUpO1xuICAgICAgICByZXR1cm4geyBkYXRhSWQsIHNoYXBlOiB4LnNoYXBlLCBkdHlwZTogeC5kdHlwZSB9O1xuICAgIH1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EaWxhdGlvbjJEQmFja3Byb3BJbnB1dC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIEVpbnN1bSwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBtdWx0aXBseSB9IGZyb20gJy4vTXVsdGlwbHknO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQgeyBzdW0gfSBmcm9tICcuL1N1bSc7XG5pbXBvcnQgeyB0cmFuc3Bvc2UgfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5leHBvcnQgZnVuY3Rpb24gZWluc3VtKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBlcXVhdGlvbiB9ID0gYXR0cnM7XG4gICAgY29uc3QgdGVuc29ycyA9IGlucHV0cztcbiAgICBjb25zdCB7IGFsbERpbXMsIHN1bW1lZERpbXMsIGlkRGltcyB9ID0gYmFja2VuZF91dGlsLmRlY29kZUVpbnN1bUVxdWF0aW9uKGVxdWF0aW9uLCB0ZW5zb3JzLmxlbmd0aCk7XG4gICAgYmFja2VuZF91dGlsLmNoZWNrRWluc3VtRGltU2l6ZXMoYWxsRGltcy5sZW5ndGgsIGlkRGltcywgdGVuc29ycyk7XG4gICAgY29uc3QgeyBwYXRoLCBzdGVwcyB9ID0gYmFja2VuZF91dGlsLmdldEVpbnN1bUNvbXB1dGVQYXRoKHN1bW1lZERpbXMsIGlkRGltcyk7XG4gICAgY29uc3QgblN0ZXBzID0gc3RlcHMubGVuZ3RoO1xuICAgIGxldCBvdXQgPSBudWxsO1xuICAgIGxldCBudW1EaW1zUmVtYWluaW5nID0gYWxsRGltcy5sZW5ndGg7XG4gICAgY29uc3QgdGVuc29yc1RvRGlzcG9zZSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgblN0ZXBzOyArK2kpIHtcbiAgICAgICAgZm9yIChjb25zdCBpZFRlcm0gb2Ygc3RlcHNbaV0pIHtcbiAgICAgICAgICAgIGNvbnN0IHsgcGVybXV0YXRpb25JbmRpY2VzOiBwZXJtLCBleHBhbmREaW1zOiBkaW1zVG9FeHBhbmQgfSA9IGJhY2tlbmRfdXRpbC5nZXRFaW5zdW1QZXJtdXRhdGlvbihudW1EaW1zUmVtYWluaW5nLCBpZERpbXNbaWRUZXJtXSk7XG4gICAgICAgICAgICBsZXQgeDtcbiAgICAgICAgICAgIGlmIChiYWNrZW5kX3V0aWwuaXNJZGVudGl0eVBlcm11dGF0aW9uKHBlcm0pKSB7XG4gICAgICAgICAgICAgICAgeCA9IHRlbnNvcnNbaWRUZXJtXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHggPSB0cmFuc3Bvc2UoeyBpbnB1dHM6IHsgeDogdGVuc29yc1tpZFRlcm1dIH0sIGJhY2tlbmQsIGF0dHJzOiB7IHBlcm0gfSB9KTtcbiAgICAgICAgICAgICAgICB0ZW5zb3JzVG9EaXNwb3NlLnB1c2goeCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0YXJnZXRTaGFwZSA9IHguc2hhcGUuc2xpY2UoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgZGltc1RvRXhwYW5kLmxlbmd0aDsgKytrKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0U2hhcGUuc3BsaWNlKGRpbXNUb0V4cGFuZFtrXSwgMCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXV0aWwuYXJyYXlzRXF1YWwoeC5zaGFwZSwgdGFyZ2V0U2hhcGUpKSB7XG4gICAgICAgICAgICAgICAgeCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogdGFyZ2V0U2hhcGUgfSB9KTtcbiAgICAgICAgICAgICAgICB0ZW5zb3JzVG9EaXNwb3NlLnB1c2goeCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3V0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgb3V0ID0geDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICAgICAgICAgICAgICBvdXQgPSBtdWx0aXBseSh7IGlucHV0czogeyBhOiB4LCBiOiBvdXQgfSwgYmFja2VuZCB9KTtcbiAgICAgICAgICAgICAgICB0ZW5zb3JzVG9EaXNwb3NlLnB1c2gob3V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA8IG5TdGVwcyAtIDEpIHtcbiAgICAgICAgICAgIGlmIChwYXRoW2ldID49IDApIHtcbiAgICAgICAgICAgICAgICBvdXQgPSBzdW0oe1xuICAgICAgICAgICAgICAgICAgICBpbnB1dHM6IHsgeDogb3V0IH0sXG4gICAgICAgICAgICAgICAgICAgIGJhY2tlbmQsXG4gICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBheGlzOiBwYXRoW2ldIC0gKGFsbERpbXMubGVuZ3RoIC0gbnVtRGltc1JlbWFpbmluZyksXG4gICAgICAgICAgICAgICAgICAgICAgICBrZWVwRGltczogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRlbnNvcnNUb0Rpc3Bvc2UucHVzaChvdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbnVtRGltc1JlbWFpbmluZy0tO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIENsZWFuIHVwIGludGVybWVkaWF0ZSB0ZW5zb3JzLlxuICAgIGZvciAoY29uc3QgdGVuc29ySW5mbyBvZiB0ZW5zb3JzVG9EaXNwb3NlKSB7XG4gICAgICAgIGlmICh0ZW5zb3JJbmZvID09PSBvdXQpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odGVuc29ySW5mbyk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgZWluc3VtQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEVpbnN1bSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogZWluc3VtXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RWluc3VtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFbHUgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IGVsdSA9IHVuYXJ5S2VybmVsRnVuYyhFbHUsICh4aSkgPT4geGkgPj0gMCA/IHhpIDogKE1hdGguZXhwKHhpKSAtIDEpKTtcbmV4cG9ydCBjb25zdCBlbHVDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRWx1LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBlbHUsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RWx1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVsdUdyYWQsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBlbHVHcmFkKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IGR5LCB5IH0gPSBpbnB1dHM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChbZHksIHldLCAnZWx1R3JhZCcpO1xuICAgIGNvbnN0IHJlc3VsdFZhbHVlcyA9IG5ldyBGbG9hdDMyQXJyYXkodXRpbC5zaXplRnJvbVNoYXBlKHkuc2hhcGUpKTtcbiAgICBjb25zdCB2YWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KHkuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgZHlWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGR5LmRhdGFJZCkudmFsdWVzO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IHYgPSB2YWx1ZXNbaV07XG4gICAgICAgIGlmICh2ID49IDEpIHtcbiAgICAgICAgICAgIHJlc3VsdFZhbHVlc1tpXSA9IGR5VmFsdWVzW2ldO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0VmFsdWVzW2ldID0gZHlWYWx1ZXNbaV0gKiAodiArIDEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHkuc2hhcGUsICdmbG9hdDMyJywgcmVzdWx0VmFsdWVzKTtcbn1cbmV4cG9ydCBjb25zdCBlbHVHcmFkQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEVsdUdyYWQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGVsdUdyYWRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FbHVHcmFkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVxdWFsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfaW1wbCc7XG5pbXBvcnQgeyBiaW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBlcXVhbEltcGwgPSBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsKChhLCBiKSA9PiAoYSA9PT0gYikgPyAxIDogMCk7XG5leHBvcnQgY29uc3QgZXF1YWwgPSBiaW5hcnlLZXJuZWxGdW5jKEVxdWFsLCBlcXVhbEltcGwsIG51bGwgLyogY29tcGxleEltcGwgKi8sICdib29sJyk7XG5leHBvcnQgY29uc3QgZXF1YWxDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRXF1YWwsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGVxdWFsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RXF1YWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgRXJmIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmNvbnN0IHAgPSBiYWNrZW5kX3V0aWwuRVJGX1A7XG5jb25zdCBhMSA9IGJhY2tlbmRfdXRpbC5FUkZfQTE7XG5jb25zdCBhMiA9IGJhY2tlbmRfdXRpbC5FUkZfQTI7XG5jb25zdCBhMyA9IGJhY2tlbmRfdXRpbC5FUkZfQTM7XG5jb25zdCBhNCA9IGJhY2tlbmRfdXRpbC5FUkZfQTQ7XG5jb25zdCBhNSA9IGJhY2tlbmRfdXRpbC5FUkZfQTU7XG5leHBvcnQgY29uc3QgZXJmID0gdW5hcnlLZXJuZWxGdW5jKEVyZiwgKHhpKSA9PiB7XG4gICAgY29uc3Qgc2lnbiA9IE1hdGguc2lnbih4aSk7XG4gICAgY29uc3QgdiA9IE1hdGguYWJzKHhpKTtcbiAgICBjb25zdCB0ID0gMS4wIC8gKDEuMCArIHAgKiB2KTtcbiAgICByZXR1cm4gc2lnbiAqXG4gICAgICAgICgxLjAgLVxuICAgICAgICAgICAgKCgoKChhNSAqIHQgKyBhNCkgKiB0KSArIGEzKSAqIHQgKyBhMikgKiB0ICsgYTEpICogdCAqXG4gICAgICAgICAgICAgICAgTWF0aC5leHAoLXYgKiB2KSk7XG59KTtcbmV4cG9ydCBjb25zdCBlcmZDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRXJmLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBlcmYsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RXJmLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFeHAgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlU2ltcGxlVW5hcnlJbXBsIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfaW1wbCc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmNGcm9tSW1wbCB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBleHBJbXBsID0gY3JlYXRlU2ltcGxlVW5hcnlJbXBsKCh4aSkgPT4gTWF0aC5leHAoeGkpKTtcbmV4cG9ydCBjb25zdCBleHAgPSB1bmFyeUtlcm5lbEZ1bmNGcm9tSW1wbChFeHAsIGV4cEltcGwpO1xuZXhwb3J0IGNvbnN0IGV4cENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBFeHAsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGV4cCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FeHAuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRXhwYW5kRGltcywgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmV4cG9ydCBmdW5jdGlvbiBleHBhbmREaW1zKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBpbnB1dCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgZGltIH0gPSBhdHRycztcbiAgICBjb25zdCBpbnB1dFJhbmsgPSBpbnB1dC5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgbmV3U2hhcGUgPSBpbnB1dC5zaGFwZS5zbGljZSgpO1xuICAgIGxldCAkZGltID0gZGltO1xuICAgIGlmIChkaW0gPCAwKSB7XG4gICAgICAgIC8vIE5lZ2F0aXZlIHZhbHVlIGlzIGNvdW50ZWQgZnJvbSB0aGUgdGFpbCBvZiByYW5rLlxuICAgICAgICB1dGlsLmFzc2VydCgtKGlucHV0UmFuayArIDEpIDw9IGRpbSwgKCkgPT4gYEF4aXMgbXVzdCBiZSBpbiB0aGUgaW50ZXJ2YWwgWyR7LShpbnB1dFJhbmsgKyAxKX0sICR7aW5wdXRSYW5rfV1gKTtcbiAgICAgICAgJGRpbSA9IGlucHV0UmFuayArIGRpbSArIDE7XG4gICAgfVxuICAgIG5ld1NoYXBlLnNwbGljZSgkZGltLCAwLCAxKTtcbiAgICByZXR1cm4gcmVzaGFwZSh7IGlucHV0czogeyB4OiBpbnB1dCB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogbmV3U2hhcGUgfSB9KTtcbn1cbmV4cG9ydCBjb25zdCBleHBhbmREaW1zQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEV4cGFuZERpbXMsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGV4cGFuZERpbXNcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FeHBhbmREaW1zLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFeHBtMSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVTaW1wbGVVbmFyeUltcGwgfSBmcm9tICcuLi91dGlscy91bmFyeV9pbXBsJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuY0Zyb21JbXBsIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IGV4cG0xSW1wbCA9IGNyZWF0ZVNpbXBsZVVuYXJ5SW1wbCgoeGkpID0+IE1hdGguZXhwbTEoeGkpKTtcbmV4cG9ydCBjb25zdCBleHBtMSA9IHVuYXJ5S2VybmVsRnVuY0Zyb21JbXBsKEV4cG0xLCBleHBtMUltcGwpO1xuZXhwb3J0IGNvbnN0IGV4cG0xQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEV4cG0xLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBleHBtMSxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FeHBtMS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBGRlQsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgZmZ0QmF0Y2ggfSBmcm9tICcuLi91dGlscy9mZnRfdXRpbHMnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5leHBvcnQgZnVuY3Rpb24gZmZ0KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IGlucHV0IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgaW5wdXRTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKGlucHV0LnNoYXBlKTtcbiAgICAvLyBDb2xsYXBzZSBhbGwgb3V0ZXIgZGltZW5zaW9ucyB0byBhIHNpbmdsZSBiYXRjaCBkaW1lbnNpb24uXG4gICAgY29uc3QgaW5uZXJEaW1lbnNpb25TaXplID0gaW5wdXQuc2hhcGVbaW5wdXQuc2hhcGUubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgYmF0Y2ggPSBpbnB1dFNpemUgLyBpbm5lckRpbWVuc2lvblNpemU7XG4gICAgY29uc3QgaW5wdXQyRCA9IHJlc2hhcGUoe1xuICAgICAgICBpbnB1dHM6IHsgeDogaW5wdXQgfSxcbiAgICAgICAgYmFja2VuZCxcbiAgICAgICAgYXR0cnM6IHsgc2hhcGU6IFtiYXRjaCwgaW5uZXJEaW1lbnNpb25TaXplXSB9XG4gICAgfSk7XG4gICAgY29uc3QgcmVzdWx0ID0gZmZ0QmF0Y2goaW5wdXQyRCwgZmFsc2UsIGJhY2tlbmQpO1xuICAgIGNvbnN0IHJlc3VsdFJlc2hhcGVkID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiByZXN1bHQgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IGlucHV0LnNoYXBlIH0gfSk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpbnB1dDJEKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdFJlc2hhcGVkO1xufVxuZXhwb3J0IGNvbnN0IGZmdENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBGRlQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGZmdFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZGVC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBGaWxsLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiBmaWxsKGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgc2hhcGUsIHZhbHVlLCBkdHlwZSB9ID0gYXR0cnM7XG4gICAgY29uc3QgJGR0eXBlID0gZHR5cGUgfHwgdXRpbC5pbmZlckR0eXBlKHZhbHVlKTtcbiAgICBjb25zdCB2YWx1ZXMgPSB1dGlsLmdldEFycmF5RnJvbURUeXBlKCRkdHlwZSwgdXRpbC5zaXplRnJvbVNoYXBlKHNoYXBlKSk7XG4gICAgZmlsbFZhbHVlcyh2YWx1ZXMsIHZhbHVlLCAkZHR5cGUpO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHNoYXBlLCAkZHR5cGUsIHZhbHVlcyk7XG59XG5leHBvcnQgY29uc3QgZmlsbENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBGaWxsLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBmaWxsXG59O1xuZnVuY3Rpb24gZmlsbFZhbHVlcyh2YWx1ZXMsIHZhbHVlLCBkdHlwZSkge1xuICAgIGlmIChkdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFsdWVzLmZpbGwodmFsdWUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdmFsdWVzLmZpbGwodmFsdWUpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZpbGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRmxpcExlZnRSaWdodCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgY29uc3QgZmxpcExlZnRSaWdodENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBGbGlwTGVmdFJpZ2h0LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiAoeyBpbnB1dHMsIGF0dHJzLCBiYWNrZW5kIH0pID0+IHtcbiAgICAgICAgY29uc3QgeyBpbWFnZSB9ID0gaW5wdXRzO1xuICAgICAgICBjb25zdCBjcHVCYWNrZW5kID0gYmFja2VuZDtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gdXRpbC5nZXRUeXBlZEFycmF5RnJvbURUeXBlKGltYWdlLmR0eXBlLCB1dGlsLnNpemVGcm9tU2hhcGUoaW1hZ2Uuc2hhcGUpKTtcbiAgICAgICAgY29uc3QgW2JhdGNoLCBpbWFnZUhlaWdodCwgaW1hZ2VXaWR0aCwgbnVtQ2hhbm5lbHNdID0gaW1hZ2Uuc2hhcGU7XG4gICAgICAgIGNvbnN0IGltYWdlVmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoaW1hZ2UuZGF0YUlkKS52YWx1ZXM7XG4gICAgICAgIGZvciAobGV0IGJhdGNoSWR4ID0gMDsgYmF0Y2hJZHggPCBiYXRjaDsgYmF0Y2hJZHgrKykge1xuICAgICAgICAgICAgY29uc3QgYmF0Y2hPZmZzZXQgPSBiYXRjaElkeCAqIGltYWdlV2lkdGggKiBpbWFnZUhlaWdodCAqIG51bUNoYW5uZWxzO1xuICAgICAgICAgICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgaW1hZ2VIZWlnaHQ7IHJvdysrKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93T2Zmc2V0ID0gcm93ICogKGltYWdlV2lkdGggKiBudW1DaGFubmVscyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgaW1hZ2VXaWR0aDsgY29sKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29sT2Zmc2V0ID0gY29sICogbnVtQ2hhbm5lbHM7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgbnVtQ2hhbm5lbHM7IGNoYW5uZWwrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29vcmRYID0gTWF0aC5yb3VuZChpbWFnZVdpZHRoIC0gY29sIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvdXRJZHggPSBiYXRjaE9mZnNldCArIHJvd09mZnNldCArIGNvbE9mZnNldCArIGNoYW5uZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3V0cHV0VmFsdWUgPSBpbWFnZVZhbHNbb3V0SWR4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjb29yZGluYXRlIHBvc2l0aW9uIGZhbGxzIHdpdGhpbiB0aGUgaW1hZ2UgYm91bmRhcmllcy4uLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvb3JkWCA+PSAwICYmIGNvb3JkWCA8IGltYWdlV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIG91dHB1dCB0byB0aGUgaW1hZ2UgdmFsdWUgYXQgdGhlIGNvb3JkaW5hdGUgcG9zaXRpb24uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm90YXRlZENvbE9mZnNldCA9IGNvb3JkWCAqIG51bUNoYW5uZWxzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGltYWdlSWR4ID0gYmF0Y2hPZmZzZXQgKyByb3dPZmZzZXQgKyByb3RhdGVkQ29sT2Zmc2V0ICsgY2hhbm5lbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRWYWx1ZSA9IGltYWdlVmFsc1tpbWFnZUlkeF07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbb3V0SWR4XSA9IG91dHB1dFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGFJZCA9IGNwdUJhY2tlbmQud3JpdGUob3V0cHV0LCBpbWFnZS5zaGFwZSwgaW1hZ2UuZHR5cGUpO1xuICAgICAgICByZXR1cm4geyBkYXRhSWQsIHNoYXBlOiBpbWFnZS5zaGFwZSwgZHR5cGU6IGltYWdlLmR0eXBlIH07XG4gICAgfVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZsaXBMZWZ0UmlnaHQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEZsb29yIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVNpbXBsZVVuYXJ5SW1wbCB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X2ltcGwnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jRnJvbUltcGwgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgZmxvb3JJbXBsID0gY3JlYXRlU2ltcGxlVW5hcnlJbXBsKCh4aSkgPT4gTWF0aC5mbG9vcih4aSkpO1xuZXhwb3J0IGNvbnN0IGZsb29yID0gdW5hcnlLZXJuZWxGdW5jRnJvbUltcGwoRmxvb3IsIGZsb29ySW1wbCk7XG5leHBvcnQgY29uc3QgZmxvb3JDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRmxvb3IsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGZsb29yLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZsb29yLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEZsb29yRGl2IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfaW1wbCc7XG5pbXBvcnQgeyBiaW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBmbG9vckRpdkltcGwgPSBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsKChhLCBiKSA9PiBNYXRoLmZsb29yKGEgLyBiKSk7XG5leHBvcnQgY29uc3QgZmxvb3JEaXYgPSBiaW5hcnlLZXJuZWxGdW5jKEZsb29yRGl2LCBmbG9vckRpdkltcGwsIG51bGwgLyogY29tcGxleEltcGwgKi8sICdpbnQzMicpO1xuZXhwb3J0IGNvbnN0IGZsb29yRGl2Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEZsb29yRGl2LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBmbG9vckRpdlxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZsb29yRGl2LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEZ1c2VkQ29udjJEIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFwcGx5QWN0aXZhdGlvbiB9IGZyb20gJy4uL3V0aWxzL2Z1c2VkX3V0aWxzJztcbmltcG9ydCB7IGFkZCB9IGZyb20gJy4vQWRkJztcbmltcG9ydCB7IGNvbnYyRCB9IGZyb20gJy4vQ29udjJEJztcbmV4cG9ydCBmdW5jdGlvbiBmdXNlZENvbnYyRChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCwgZmlsdGVyLCBiaWFzLCBwcmVsdUFjdGl2YXRpb25XZWlnaHRzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQsIGRpbGF0aW9ucywgZGltUm91bmRpbmdNb2RlLCBhY3RpdmF0aW9uLCBsZWFreXJlbHVBbHBoYSB9ID0gYXR0cnM7XG4gICAgbGV0IHJlc3VsdCA9IGNvbnYyRCh7XG4gICAgICAgIGlucHV0czogeyB4LCBmaWx0ZXIgfSxcbiAgICAgICAgYmFja2VuZCxcbiAgICAgICAgYXR0cnM6IHsgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0LCBkaWxhdGlvbnMsIGRpbVJvdW5kaW5nTW9kZSB9XG4gICAgfSk7XG4gICAgaWYgKGJpYXMpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0T2xkID0gcmVzdWx0O1xuICAgICAgICByZXN1bHQgPSBhZGQoeyBpbnB1dHM6IHsgYTogcmVzdWx0LCBiOiBiaWFzIH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVzdWx0T2xkKTtcbiAgICB9XG4gICAgaWYgKGFjdGl2YXRpb24pIHtcbiAgICAgICAgY29uc3QgcmVzdWx0T2xkID0gcmVzdWx0O1xuICAgICAgICByZXN1bHQgPSBhcHBseUFjdGl2YXRpb24oYmFja2VuZCwgcmVzdWx0LCBhY3RpdmF0aW9uLCBwcmVsdUFjdGl2YXRpb25XZWlnaHRzLCBsZWFreXJlbHVBbHBoYSk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVzdWx0T2xkKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBjb25zdCBmdXNlZENvbnYyRENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBGdXNlZENvbnYyRCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogZnVzZWRDb252MkRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GdXNlZENvbnYyRC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBGdXNlZERlcHRod2lzZUNvbnYyRCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhcHBseUFjdGl2YXRpb24gfSBmcm9tICcuLi91dGlscy9mdXNlZF91dGlscyc7XG5pbXBvcnQgeyBhZGQgfSBmcm9tICcuL0FkZCc7XG5pbXBvcnQgeyBkZXB0aHdpc2VDb252MmROYXRpdmUgfSBmcm9tICcuL0RlcHRod2lzZUNvbnYyZE5hdGl2ZSc7XG5leHBvcnQgZnVuY3Rpb24gZnVzZWREZXB0aHdpc2VDb252MkQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHgsIGZpbHRlciwgYmlhcywgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0LCBkaWxhdGlvbnMsIGRpbVJvdW5kaW5nTW9kZSwgYWN0aXZhdGlvbiwgbGVha3lyZWx1QWxwaGEgfSA9IGF0dHJzO1xuICAgIGxldCByZXN1bHQgPSBkZXB0aHdpc2VDb252MmROYXRpdmUoe1xuICAgICAgICBpbnB1dHM6IHsgeCwgZmlsdGVyIH0sXG4gICAgICAgIGJhY2tlbmQsXG4gICAgICAgIGF0dHJzOiB7IHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGlsYXRpb25zLCBkaW1Sb3VuZGluZ01vZGUgfVxuICAgIH0pO1xuICAgIGlmIChiaWFzKSB7XG4gICAgICAgIGNvbnN0IG9sZFJlc3VsdCA9IHJlc3VsdDtcbiAgICAgICAgcmVzdWx0ID0gYWRkKHsgaW5wdXRzOiB7IGE6IHJlc3VsdCwgYjogYmlhcyB9LCBiYWNrZW5kIH0pO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG9sZFJlc3VsdCk7XG4gICAgfVxuICAgIGlmIChhY3RpdmF0aW9uKSB7XG4gICAgICAgIGNvbnN0IG9sZFJlc3VsdCA9IHJlc3VsdDtcbiAgICAgICAgcmVzdWx0ID0gYXBwbHlBY3RpdmF0aW9uKGJhY2tlbmQsIHJlc3VsdCwgYWN0aXZhdGlvbiwgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cywgbGVha3lyZWx1QWxwaGEpO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG9sZFJlc3VsdCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgY29uc3QgZnVzZWREZXB0aHdpc2VDb252MkRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRnVzZWREZXB0aHdpc2VDb252MkQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGZ1c2VkRGVwdGh3aXNlQ29udjJEXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RnVzZWREZXB0aHdpc2VDb252MkQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBHYXRoZXJOZCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBnYXRoZXJOZEltcGwgfSBmcm9tICcuL0dhdGhlck5kX0ltcGwnO1xuZXhwb3J0IGZ1bmN0aW9uIGdhdGhlck5kKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IHBhcmFtcywgaW5kaWNlcyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHBhcmFtc1NpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocGFyYW1zLnNoYXBlKTtcbiAgICBjb25zdCBpbmRpY2VzU2hhcGUgPSBpbmRpY2VzLnNoYXBlO1xuICAgIGNvbnN0IHNsaWNlUmFuayA9IGluZGljZXNTaGFwZVtpbmRpY2VzU2hhcGUubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgW3Jlc3VsdFNoYXBlLCBudW1TbGljZXMsIHNsaWNlU2l6ZSwgc3RyaWRlc10gPSBiYWNrZW5kX3V0aWwucHJlcGFyZUFuZFZhbGlkYXRlKHBhcmFtcywgaW5kaWNlcyk7XG4gICAgaWYgKG51bVNsaWNlcyA9PT0gMCkge1xuICAgICAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhyZXN1bHRTaGFwZSwgcGFyYW1zLmR0eXBlLCBbXSk7XG4gICAgfVxuICAgIGNvbnN0IGluZGljZXNEYXRhID0gYmFja2VuZC5kYXRhLmdldChpbmRpY2VzLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHBhcmFtc0J1ZiA9IGJhY2tlbmQuYnVmZmVyU3luYyhwYXJhbXMpO1xuICAgIGNvbnN0IG91dEJ1ZiA9IGdhdGhlck5kSW1wbChpbmRpY2VzRGF0YSwgcGFyYW1zQnVmLCBwYXJhbXMuZHR5cGUsIG51bVNsaWNlcywgc2xpY2VSYW5rLCBzbGljZVNpemUsIHN0cmlkZXMsIHBhcmFtcy5zaGFwZSwgcGFyYW1zU2l6ZSk7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVzdWx0U2hhcGUsIHBhcmFtcy5kdHlwZSwgb3V0QnVmLnZhbHVlcyk7XG59XG5leHBvcnQgY29uc3QgZ2F0aGVyTmRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogR2F0aGVyTmQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGdhdGhlck5kXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9R2F0aGVyTmQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYnVmZmVyIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiBnYXRoZXJOZEltcGwoaW5kaWNlc0RhdGEsIHBhcmFtc0J1ZiwgZHR5cGUsIG51bVNsaWNlcywgc2xpY2VSYW5rLCBzbGljZVNpemUsIHN0cmlkZXMsIHBhcmFtc1NoYXBlLCBwYXJhbXNTaXplKSB7XG4gICAgY29uc3Qgb3V0QnVmID0gYnVmZmVyKFtudW1TbGljZXMsIHNsaWNlU2l6ZV0sIGR0eXBlKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVNsaWNlczsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gW107XG4gICAgICAgIGxldCBmbGF0dGVuSW5kZXggPSAwO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHNsaWNlUmFuazsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBkaW0gPSBpbmRpY2VzRGF0YVtpICogc2xpY2VSYW5rICsgal07XG4gICAgICAgICAgICBmbGF0dGVuSW5kZXggKz0gZGltICogc3RyaWRlc1tqXTtcbiAgICAgICAgICAgIGluZGV4LnB1c2goZGltKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmxhdHRlbkluZGV4IDwgMCB8fCBmbGF0dGVuSW5kZXggPj0gcGFyYW1zU2l6ZSAvIHNsaWNlU2l6ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGluZGljZXM6ICR7aW5kZXh9IGRvZXMgbm90IGluZGV4IGludG8gJHtwYXJhbXNTaGFwZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHNsaWNlU2l6ZTsgaysrKSB7XG4gICAgICAgICAgICBvdXRCdWYudmFsdWVzW2kgKiBzbGljZVNpemUgKyBrXSA9XG4gICAgICAgICAgICAgICAgcGFyYW1zQnVmLmdldCguLi5wYXJhbXNCdWYuaW5kZXhUb0xvYyhmbGF0dGVuSW5kZXggKiBzbGljZVNpemUgKyBrKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dEJ1Zjtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUdhdGhlck5kX0ltcGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBHYXRoZXJWMiwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHsgZ2F0aGVyVjJJbXBsIH0gZnJvbSAnLi9HYXRoZXJWMl9pbXBsJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuZXhwb3J0IGZ1bmN0aW9uIGdhdGhlclYyKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4LCBpbmRpY2VzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBheGlzLCBiYXRjaERpbXMgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoW3gsIGluZGljZXNdLCAnZ2F0aGVyVjInKTtcbiAgICBsZXQgJGJhdGNoRGltcyA9IGJhdGNoRGltcztcbiAgICBpZiAoYmF0Y2hEaW1zID09IG51bGwpIHtcbiAgICAgICAgJGJhdGNoRGltcyA9IDA7XG4gICAgfVxuICAgIGNvbnN0IGluZGljZXNTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKGluZGljZXMuc2hhcGUpO1xuICAgIGNvbnN0IHBhcnNlZEF4aXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpWzBdO1xuICAgIGNvbnN0IHNoYXBlSW5mbyA9IGJhY2tlbmRfdXRpbC5zZWdtZW50X3V0aWwuY29sbGVjdEdhdGhlck9wU2hhcGVJbmZvKHgsIGluZGljZXMsIHBhcnNlZEF4aXMsICRiYXRjaERpbXMpO1xuICAgIGNvbnN0IGZsYXR0ZW5YID0gcmVzaGFwZSh7XG4gICAgICAgIGlucHV0czogeyB4IH0sXG4gICAgICAgIGJhY2tlbmQsXG4gICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICBzaGFwZTogW1xuICAgICAgICAgICAgICAgIHNoYXBlSW5mby5iYXRjaFNpemUsIHNoYXBlSW5mby5vdXRlclNpemUsIHNoYXBlSW5mby5kaW1TaXplLFxuICAgICAgICAgICAgICAgIHNoYXBlSW5mby5zbGljZVNpemVcbiAgICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGZsYXR0ZW5JbmRleCA9IHJlc2hhcGUoe1xuICAgICAgICBpbnB1dHM6IHsgeDogaW5kaWNlcyB9LFxuICAgICAgICBiYWNrZW5kLFxuICAgICAgICBhdHRyczogeyBzaGFwZTogW3NoYXBlSW5mby5iYXRjaFNpemUsIGluZGljZXNTaXplIC8gc2hhcGVJbmZvLmJhdGNoU2l6ZV0gfVxuICAgIH0pO1xuICAgIGNvbnN0IGZsYXR0ZW5PdXRwdXRTaGFwZSA9IFtcbiAgICAgICAgc2hhcGVJbmZvLmJhdGNoU2l6ZSwgc2hhcGVJbmZvLm91dGVyU2l6ZSwgaW5kaWNlc1NpemUgLyBzaGFwZUluZm8uYmF0Y2hTaXplLFxuICAgICAgICBzaGFwZUluZm8uc2xpY2VTaXplXG4gICAgXTtcbiAgICBjb25zdCBpbmRpY2VzQnVmID0gYmFja2VuZC5idWZmZXJTeW5jKGZsYXR0ZW5JbmRleCk7XG4gICAgY29uc3QgeEJ1ZiA9IGJhY2tlbmQuYnVmZmVyU3luYyhmbGF0dGVuWCk7XG4gICAgY29uc3Qgb3V0QnVmID0gZ2F0aGVyVjJJbXBsKHhCdWYsIGluZGljZXNCdWYsIGZsYXR0ZW5PdXRwdXRTaGFwZSk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhmbGF0dGVuWCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhmbGF0dGVuSW5kZXgpO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHNoYXBlSW5mby5vdXRwdXRTaGFwZSwgb3V0QnVmLmR0eXBlLCBvdXRCdWYudmFsdWVzKTtcbn1cbmV4cG9ydCBjb25zdCBnYXRoZXJWMkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBHYXRoZXJWMixcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogZ2F0aGVyVjJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1HYXRoZXJWMi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBidWZmZXIgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIGdhdGhlclYySW1wbCh4QnVmLCBpbmRpY2VzQnVmLCBmbGF0dGVuT3V0cHV0U2hhcGUpIHtcbiAgICBjb25zdCBvdXRCdWYgPSBidWZmZXIoZmxhdHRlbk91dHB1dFNoYXBlLCB4QnVmLmR0eXBlKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dEJ1Zi5zaXplOyArK2kpIHtcbiAgICAgICAgY29uc3QgbmV3TG9jID0gb3V0QnVmLmluZGV4VG9Mb2MoaSk7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsTG9jID0gbmV3TG9jLnNsaWNlKCk7XG4gICAgICAgIGNvbnN0IGJhdGNoSWR4ID0gb3JpZ2luYWxMb2NbMF07XG4gICAgICAgIGNvbnN0IGluZGljZXNJZHggPSBvcmlnaW5hbExvY1syXTtcbiAgICAgICAgY29uc3QgaW5kaWNlc0luZGV4ID0gaW5kaWNlc0J1Zi5sb2NUb0luZGV4KFtiYXRjaElkeCwgaW5kaWNlc0lkeF0pO1xuICAgICAgICBvcmlnaW5hbExvY1syXSA9IGluZGljZXNCdWYudmFsdWVzW2luZGljZXNJbmRleF07XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsSW5kZXggPSB4QnVmLmxvY1RvSW5kZXgob3JpZ2luYWxMb2MpO1xuICAgICAgICBvdXRCdWYudmFsdWVzW2ldID0geEJ1Zi52YWx1ZXNbb3JpZ2luYWxJbmRleF07XG4gICAgfVxuICAgIHJldHVybiBvdXRCdWY7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1HYXRoZXJWMl9pbXBsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEdyZWF0ZXIgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IGdyZWF0ZXJJbXBsID0gY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoYSwgYikgPT4gKGEgPiBiKSA/IDEgOiAwKTtcbmV4cG9ydCBjb25zdCBncmVhdGVyID0gYmluYXJ5S2VybmVsRnVuYyhHcmVhdGVyLCBncmVhdGVySW1wbCwgbnVsbCAvKiBjb21wbGV4SW1wbCAqLywgJ2Jvb2wnKTtcbmV4cG9ydCBjb25zdCBncmVhdGVyQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEdyZWF0ZXIsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGdyZWF0ZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1HcmVhdGVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEdyZWF0ZXJFcXVhbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X2ltcGwnO1xuaW1wb3J0IHsgYmluYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgZ3JlYXRlckVxdWFsSW1wbCA9IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwoKGEsIGIpID0+IChhID49IGIpID8gMSA6IDApO1xuZXhwb3J0IGNvbnN0IGdyZWF0ZXJFcXVhbCA9IGJpbmFyeUtlcm5lbEZ1bmMoR3JlYXRlckVxdWFsLCBncmVhdGVyRXF1YWxJbXBsLCBudWxsIC8qIGNvbXBsZXhJbXBsICovLCAnYm9vbCcpO1xuZXhwb3J0IGNvbnN0IGdyZWF0ZXJFcXVhbENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBHcmVhdGVyRXF1YWwsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGdyZWF0ZXJFcXVhbFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUdyZWF0ZXJFcXVhbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBJRkZULCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGZmdEJhdGNoIH0gZnJvbSAnLi4vdXRpbHMvZmZ0X3V0aWxzJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuZXhwb3J0IGZ1bmN0aW9uIGlmZnQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW5wdXQgfSA9IGlucHV0cztcbiAgICBjb25zdCBpbnB1dFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoaW5wdXQuc2hhcGUpO1xuICAgIC8vIENvbGxhcHNlIGFsbCBvdXRlciBkaW1lbnNpb25zIHRvIGEgc2luZ2xlIGJhdGNoIGRpbWVuc2lvbi5cbiAgICBjb25zdCBpbm5lckRpbWVuc2lvblNpemUgPSBpbnB1dC5zaGFwZVtpbnB1dC5zaGFwZS5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBiYXRjaCA9IGlucHV0U2l6ZSAvIGlubmVyRGltZW5zaW9uU2l6ZTtcbiAgICBjb25zdCBpbnB1dDJEID0gcmVzaGFwZSh7XG4gICAgICAgIGlucHV0czogeyB4OiBpbnB1dCB9LFxuICAgICAgICBiYWNrZW5kLFxuICAgICAgICBhdHRyczogeyBzaGFwZTogW2JhdGNoLCBpbm5lckRpbWVuc2lvblNpemVdIH1cbiAgICB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBmZnRCYXRjaChpbnB1dDJELCB0cnVlLCBiYWNrZW5kKTtcbiAgICBjb25zdCByZXN1bHRSZXNoYXBlZCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogcmVzdWx0IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBpbnB1dC5zaGFwZSB9IH0pO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaW5wdXQyRCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXN1bHQpO1xuICAgIHJldHVybiByZXN1bHRSZXNoYXBlZDtcbn1cbmV4cG9ydCBjb25zdCBpZmZ0Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IElGRlQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGlmZnRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1JRkZULmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IElkZW50aXR5IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgYmFja2VuZC5pbmNSZWYoeC5kYXRhSWQpO1xuICAgIHJldHVybiB7IGRhdGFJZDogeC5kYXRhSWQsIHNoYXBlOiB4LnNoYXBlLCBkdHlwZTogeC5kdHlwZSB9O1xufVxuZXhwb3J0IGNvbnN0IGlkZW50aXR5Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IElkZW50aXR5LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBpZGVudGl0eVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUlkZW50aXR5LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEltYWcgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIGltYWcoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW5wdXQgfSA9IGlucHV0cztcbiAgICBjb25zdCBpbWFnID0gYmFja2VuZC5kYXRhLmdldChpbnB1dC5kYXRhSWQpLmNvbXBsZXhUZW5zb3JJbmZvcy5pbWFnO1xuICAgIGNvbnN0IGltYWdWYWwgPSBiYWNrZW5kLmRhdGEuZ2V0KGltYWcuZGF0YUlkKS52YWx1ZXM7XG4gICAgLy8gV2hlbiBjb21wbGV4IHRlbnNvciBpcyBkaXNwb3NlZCwgaXRzIHVuZGVybHlpbmcgcGFydHMgd2lsbCBiZSBkaXNwb3NlZCB0b28uXG4gICAgLy8gTWFrZSBuZXcgdGVuc29yIG91dCBvZiB0aGUgaW1hZyB2YWx1ZSBvZiB0aGUgY29tcGxleC4gVGhpcyBtYWtlcyBzdXJlIHRoZVxuICAgIC8vIHZhbHVlIGlzIHN0aWxsIGFjY2Vzc2libGUgZXZlbiBpZiBjb21wbGV4IHRlbnNvciBpcyBkaXNwb3NlZC5cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhpbWFnLnNoYXBlLCBpbWFnLmR0eXBlLCBpbWFnVmFsKTtcbn1cbmV4cG9ydCBjb25zdCBpbWFnQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEltYWcsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGltYWdcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1JbWFnLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBJc0Zpbml0ZSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgaXNGaW5pdGUgPSB1bmFyeUtlcm5lbEZ1bmMoSXNGaW5pdGUsICh4aSkgPT4gTnVtYmVyLmlzRmluaXRlKHhpKSA/IDEgOiAwLCAnYm9vbCcpO1xuZXhwb3J0IGNvbnN0IGlzRmluaXRlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IElzRmluaXRlLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBpc0Zpbml0ZSxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Jc0Zpbml0ZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgSXNJbmYgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IGlzSW5mID0gdW5hcnlLZXJuZWxGdW5jKElzSW5mLCAoeGkpID0+IE1hdGguYWJzKHhpKSA9PT0gSW5maW5pdHkgPyAxIDogMCwgJ2Jvb2wnKTtcbmV4cG9ydCBjb25zdCBpc0luZkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBJc0luZixcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogaXNJbmYsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SXNJbmYuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IElzTmFuIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBpc05hTiA9IHVuYXJ5S2VybmVsRnVuYyhJc05hbiwgKHhpKSA9PiBOdW1iZXIuaXNOYU4oeGkpID8gMSA6IDAsICdib29sJyk7XG5leHBvcnQgY29uc3QgaXNOYU5Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogSXNOYW4sXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGlzTmFOLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUlzTmFOLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IExSTiwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIGxSTihhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgZGVwdGhSYWRpdXMsIGJpYXMsIGFscGhhLCBiZXRhIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KHgsICdMUk4nKTtcbiAgICBjb25zdCBjaGFubmVscyA9IHguc2hhcGVbM107XG4gICAgY29uc3QgbWF4RCA9IGNoYW5uZWxzIC0gMTtcbiAgICBjb25zdCB4VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoeC5zaGFwZSk7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IEZsb2F0MzJBcnJheShzaXplKTtcbiAgICBmdW5jdGlvbiBzdW1BY3Jvc3NDaGFubmVscyhvZmZzZXQpIHtcbiAgICAgICAgY29uc3QgY3VycmVudENoYW5uZWwgPSBvZmZzZXQgJSBjaGFubmVscztcbiAgICAgICAgbGV0IGJlZ2luU3VtT2Zmc2V0ID0gb2Zmc2V0IC0gY3VycmVudENoYW5uZWwgKyBNYXRoLm1heCgwLCBjdXJyZW50Q2hhbm5lbCAtIGRlcHRoUmFkaXVzKTtcbiAgICAgICAgY29uc3QgZW5kU3VtT2Zmc2V0ID0gb2Zmc2V0IC0gY3VycmVudENoYW5uZWwgKyBNYXRoLm1pbihjdXJyZW50Q2hhbm5lbCArIGRlcHRoUmFkaXVzLCBtYXhEKTtcbiAgICAgICAgbGV0IHN1bSA9IDAuMDtcbiAgICAgICAgZm9yICg7IGJlZ2luU3VtT2Zmc2V0IDw9IGVuZFN1bU9mZnNldDsgYmVnaW5TdW1PZmZzZXQrKykge1xuICAgICAgICAgICAgY29uc3QgeiA9IHhWYWx1ZXNbYmVnaW5TdW1PZmZzZXRdO1xuICAgICAgICAgICAgc3VtICs9IHogKiB6O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdW07XG4gICAgfVxuICAgIGZvciAobGV0IG9mZnNldCA9IDA7IG9mZnNldCA8IHNpemU7IG9mZnNldCsrKSB7XG4gICAgICAgIGNvbnN0IHN1bSA9IHN1bUFjcm9zc0NoYW5uZWxzKG9mZnNldCk7XG4gICAgICAgIGNvbnN0IHZhbCA9IHhWYWx1ZXNbb2Zmc2V0XSAqIE1hdGgucG93KGJpYXMgKyBhbHBoYSAqIHN1bSwgLWJldGEpO1xuICAgICAgICByZXN1bHRbb2Zmc2V0XSA9IHZhbDtcbiAgICB9XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oeC5zaGFwZSwgeC5kdHlwZSwgcmVzdWx0KTtcbn1cbmV4cG9ydCBjb25zdCBsUk5Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTFJOLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBsUk5cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1MUk4uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTFJOR3JhZCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIGxSTkdyYWQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHgsIHksIGR5IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBkZXB0aFJhZGl1cywgYmlhcywgYWxwaGEsIGJldGEgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoZHksICdMUk5HcmFkJyk7XG4gICAgY29uc3QgZHlTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKGR5LnNoYXBlKTtcbiAgICBjb25zdCBjaGFubmVscyA9IGR5LnNoYXBlWzNdO1xuICAgIGNvbnN0IGR5VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldChkeS5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCB4VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHlWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KHkuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IEZsb2F0MzJBcnJheShkeVNpemUpO1xuICAgIGNvbnN0IHNpemUgPSBkeVNpemU7XG4gICAgZm9yIChsZXQgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgc2l6ZTsgb2Zmc2V0KyspIHtcbiAgICAgICAgY29uc3QgY3VycmVudENoYW5uZWwgPSBvZmZzZXQgJSBjaGFubmVscztcbiAgICAgICAgY29uc3QgZGVwdGhCZWdpbiA9IChvZmZzZXQgLSBjdXJyZW50Q2hhbm5lbCkgKyBNYXRoLm1heCgwLCBjdXJyZW50Q2hhbm5lbCAtIGRlcHRoUmFkaXVzKTtcbiAgICAgICAgY29uc3QgZGVwdGhFbmQgPSAob2Zmc2V0IC0gY3VycmVudENoYW5uZWwpICtcbiAgICAgICAgICAgIE1hdGgubWluKGNoYW5uZWxzLCBjdXJyZW50Q2hhbm5lbCArIGRlcHRoUmFkaXVzICsgMSk7XG4gICAgICAgIGxldCBub3JtID0gMDtcbiAgICAgICAgZm9yIChsZXQgayA9IGRlcHRoQmVnaW47IGsgPCBkZXB0aEVuZDsgaysrKSB7XG4gICAgICAgICAgICBub3JtICs9IE1hdGgucG93KHhWYWx1ZXNba10sIDIpO1xuICAgICAgICB9XG4gICAgICAgIG5vcm0gPSBhbHBoYSAqIG5vcm0gKyBiaWFzO1xuICAgICAgICBmb3IgKGxldCBrID0gZGVwdGhCZWdpbjsgayA8IGRlcHRoRW5kOyBrKyspIHtcbiAgICAgICAgICAgIGxldCBkeWkgPSAtMiAqIGFscGhhICogYmV0YSAqIHhWYWx1ZXNba10gKiB5VmFsdWVzW29mZnNldF0gLyBub3JtO1xuICAgICAgICAgICAgaWYgKG9mZnNldCA9PT0gaykge1xuICAgICAgICAgICAgICAgIGR5aSArPSBNYXRoLnBvdyhub3JtLCAtYmV0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkeWkgKj0gZHlWYWx1ZXNbb2Zmc2V0XTtcbiAgICAgICAgICAgIHJlc3VsdFtrXSArPSBkeWk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oZHkuc2hhcGUsIHguZHR5cGUsIHJlc3VsdCk7XG59XG5leHBvcnQgY29uc3QgbFJOR3JhZENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBMUk5HcmFkLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBsUk5HcmFkXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TFJOR3JhZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBMZWFreVJlbHUsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBsZWFreVJlbHUoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGFscGhhIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KFt4XSwgJ2xlYWt5UmVsdScpO1xuICAgIGNvbnN0IHhTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHguc2hhcGUpO1xuICAgIGNvbnN0IHhWYWxzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IG91dFZhbHMgPSB1dGlsLmdldFR5cGVkQXJyYXlGcm9tRFR5cGUoJ2Zsb2F0MzInLCB4U2l6ZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB4VmFscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBvdXRWYWxzW2ldID0geFZhbHNbaV0gPCAwID8gYWxwaGEgKiB4VmFsc1tpXSA6IHhWYWxzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyh4LnNoYXBlLCAnZmxvYXQzMicsIG91dFZhbHMpO1xufVxuZXhwb3J0IGNvbnN0IGxlYWt5UmVsdUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBMZWFreVJlbHUsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGxlYWt5UmVsdVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxlYWt5UmVsdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBMZXNzIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfaW1wbCc7XG5pbXBvcnQgeyBiaW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBsZXNzSW1wbCA9IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwoKGEsIGIpID0+IChhIDwgYikgPyAxIDogMCk7XG5leHBvcnQgY29uc3QgbGVzcyA9IGJpbmFyeUtlcm5lbEZ1bmMoTGVzcywgbGVzc0ltcGwsIG51bGwgLyogY29tcGxleEltcGwgKi8sICdib29sJyk7XG5leHBvcnQgY29uc3QgbGVzc0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBMZXNzLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBsZXNzXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TGVzcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBMZXNzRXF1YWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IGxlc3NFcXVhbEltcGwgPSBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsKChhLCBiKSA9PiAoYSA8PSBiKSA/IDEgOiAwKTtcbmV4cG9ydCBjb25zdCBsZXNzRXF1YWwgPSBiaW5hcnlLZXJuZWxGdW5jKExlc3NFcXVhbCwgbGVzc0VxdWFsSW1wbCwgbnVsbCAvKiBjb21wbGV4SW1wbCAqLywgJ2Jvb2wnKTtcbmV4cG9ydCBjb25zdCBsZXNzRXF1YWxDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTGVzc0VxdWFsLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBsZXNzRXF1YWxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1MZXNzRXF1YWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTGluU3BhY2UgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgbGluU3BhY2VJbXBsIH0gZnJvbSAnLi9MaW5TcGFjZV9pbXBsJztcbmV4cG9ydCBmdW5jdGlvbiBsaW5TcGFjZShhcmdzKSB7XG4gICAgY29uc3QgeyBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHN0YXJ0LCBzdG9wLCBudW0gfSA9IGF0dHJzO1xuICAgIGNvbnN0IG91dFZhbHMgPSBsaW5TcGFjZUltcGwoc3RhcnQsIHN0b3AsIG51bSk7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW291dFZhbHMubGVuZ3RoXSwgJ2Zsb2F0MzInLCBvdXRWYWxzKTtcbn1cbmV4cG9ydCBjb25zdCBsaW5TcGFjZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBMaW5TcGFjZSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogbGluU3BhY2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1MaW5TcGFjZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiBsaW5TcGFjZUltcGwoc3RhcnQsIHN0b3AsIG51bSkge1xuICAgIGNvbnN0IHN0ZXAgPSAoc3RvcCAtIHN0YXJ0KSAvIChudW0gLSAxKTtcbiAgICBjb25zdCB2YWx1ZXMgPSB1dGlsLm1ha2VaZXJvc1R5cGVkQXJyYXkobnVtLCAnZmxvYXQzMicpO1xuICAgIHZhbHVlc1swXSA9IHN0YXJ0O1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhbHVlc1tpXSA9IHZhbHVlc1tpIC0gMV0gKyBzdGVwO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVzO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TGluU3BhY2VfaW1wbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTG9nIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVNpbXBsZVVuYXJ5SW1wbCB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X2ltcGwnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jRnJvbUltcGwgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgbG9nSW1wbCA9IGNyZWF0ZVNpbXBsZVVuYXJ5SW1wbCgoeGkpID0+IE1hdGgubG9nKHhpKSk7XG5leHBvcnQgY29uc3QgbG9nID0gdW5hcnlLZXJuZWxGdW5jRnJvbUltcGwoTG9nLCBsb2dJbXBsKTtcbmV4cG9ydCBjb25zdCBsb2dDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTG9nLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBsb2csXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TG9nLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBMb2cxcCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgbG9nMXAgPSB1bmFyeUtlcm5lbEZ1bmMoTG9nMXAsICh4aSkgPT4gTWF0aC5sb2cxcCh4aSkpO1xuZXhwb3J0IGNvbnN0IGxvZzFwQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IExvZzFwLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBsb2cxcCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Mb2cxcC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBMb2dpY2FsQW5kIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfaW1wbCc7XG5pbXBvcnQgeyBiaW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBsb2dpY2FsQW5kSW1wbCA9IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwoKGEsIGIpID0+IGEgJiYgYik7XG5leHBvcnQgY29uc3QgbG9naWNhbEFuZCA9IGJpbmFyeUtlcm5lbEZ1bmMoTG9naWNhbEFuZCwgbG9naWNhbEFuZEltcGwsIG51bGwgLyogY29tcGxleEltcGwgKi8sICdib29sJyk7XG5leHBvcnQgY29uc3QgbG9naWNhbEFuZENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBMb2dpY2FsQW5kLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBsb2dpY2FsQW5kXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TG9naWNhbEFuZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTG9naWNhbE5vdCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgbG9naWNhbE5vdCA9IHVuYXJ5S2VybmVsRnVuYyhMb2dpY2FsTm90LCAoeGkpID0+IHhpID8gMCA6IDEsICdib29sJyk7XG5leHBvcnQgY29uc3QgbG9naWNhbE5vdENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBMb2dpY2FsTm90LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBsb2dpY2FsTm90LFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxvZ2ljYWxOb3QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTG9naWNhbE9yIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfaW1wbCc7XG5pbXBvcnQgeyBiaW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBsb2dpY2FsT3JJbXBsID0gY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoYSwgYikgPT4gYSB8fCBiKTtcbmV4cG9ydCBjb25zdCBsb2dpY2FsT3IgPSBiaW5hcnlLZXJuZWxGdW5jKExvZ2ljYWxPciwgbG9naWNhbE9ySW1wbCwgbnVsbCAvKiBjb21wbGV4SW1wbCAqLywgJ2Jvb2wnKTtcbmV4cG9ydCBjb25zdCBsb2dpY2FsT3JDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTG9naWNhbE9yLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBsb2dpY2FsT3Jcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Mb2dpY2FsT3IuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTWF4IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGJhY2tlbmRfdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyBtYXhJbXBsIH0gZnJvbSAnLi9NYXhfaW1wbCc7XG5pbXBvcnQgeyB0cmFuc3Bvc2VJbXBsIH0gZnJvbSAnLi9UcmFuc3Bvc2VfaW1wbCc7XG5leHBvcnQgZnVuY3Rpb24gbWF4KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyByZWR1Y3Rpb25JbmRpY2VzLCBrZWVwRGltcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgY3B1QmFja2VuZCA9IGJhY2tlbmQ7XG4gICAgbGV0IHhTaGFwZSA9IHguc2hhcGU7XG4gICAgY29uc3QgeFJhbmsgPSB4U2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IG9yaWdBeGVzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShyZWR1Y3Rpb25JbmRpY2VzLCB4U2hhcGUpO1xuICAgIGxldCBheGVzID0gb3JpZ0F4ZXM7XG4gICAgY29uc3QgcGVybXV0ZWRBeGVzID0gYmFja2VuZF91dGlsLmdldEF4ZXNQZXJtdXRhdGlvbihheGVzLCB4UmFuayk7XG4gICAgbGV0IHhWYWxzID0gY3B1QmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgIGlmIChwZXJtdXRlZEF4ZXMgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBuZXdTaGFwZSA9IG5ldyBBcnJheSh4UmFuayk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3U2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIG5ld1NoYXBlW2ldID0geFNoYXBlW3Blcm11dGVkQXhlc1tpXV07XG4gICAgICAgIH1cbiAgICAgICAgeFZhbHMgPSB0cmFuc3Bvc2VJbXBsKHhWYWxzLCB4U2hhcGUsIHguZHR5cGUsIHBlcm11dGVkQXhlcywgbmV3U2hhcGUpO1xuICAgICAgICBheGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoYXhlcy5sZW5ndGgsIHhSYW5rKTtcbiAgICAgICAgeFNoYXBlID0gbmV3U2hhcGU7XG4gICAgfVxuICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ21heCcpO1xuICAgIGJhY2tlbmRfdXRpbC5hc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcygnbWF4JywgYXhlcywgeFJhbmspO1xuICAgIGNvbnN0IFttYXhPdXRTaGFwZSwgcmVkdWNlU2hhcGVdID0gYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMoeFNoYXBlLCBheGVzKTtcbiAgICBjb25zdCByZWR1Y2VTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcbiAgICBjb25zdCByZXN1bHQgPSBtYXhJbXBsKHhWYWxzLCByZWR1Y2VTaXplLCBtYXhPdXRTaGFwZSwgeC5kdHlwZSk7XG4gICAgY29uc3QgZGF0YUlkID0gY3B1QmFja2VuZC53cml0ZShyZXN1bHQsIG1heE91dFNoYXBlLCB4LmR0eXBlKTtcbiAgICBsZXQgb3V0U2hhcGUgPSBtYXhPdXRTaGFwZTtcbiAgICBpZiAoa2VlcERpbXMpIHtcbiAgICAgICAgLy8gcmVzaGFwZVxuICAgICAgICBjb25zdCBuZXdTaGFwZSA9IGJhY2tlbmRfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbShtYXhPdXRTaGFwZSwgb3JpZ0F4ZXMpO1xuICAgICAgICBvdXRTaGFwZSA9IG5ld1NoYXBlO1xuICAgIH1cbiAgICByZXR1cm4geyBkYXRhSWQsIHNoYXBlOiBvdXRTaGFwZSwgZHR5cGU6IHguZHR5cGUgfTtcbn1cbmV4cG9ydCBjb25zdCBtYXhDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTWF4LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBtYXhcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NYXguanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBNYXhQb29sLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyBwb29sIH0gZnJvbSAnLi4vdXRpbHMvcG9vbF91dGlscyc7XG5pbXBvcnQgeyBpZGVudGl0eSB9IGZyb20gJy4vSWRlbnRpdHknO1xuZXhwb3J0IGZ1bmN0aW9uIG1heFBvb2woYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBhc3NlcnROb3RDb21wbGV4KHgsICdtYXhQb29sJyk7XG4gICAgY29uc3QgeyBmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSB9ID0gYXR0cnM7XG4gICAgY29uc3QgZGlsYXRpb25zID0gMTtcbiAgICB1dGlsLmFzc2VydChiYWNrZW5kX3V0aWwuZWl0aGVyU3RyaWRlc09yRGlsYXRpb25zQXJlT25lKHN0cmlkZXMsIGRpbGF0aW9ucyksICgpID0+ICdFcnJvciBpbiBtYXhQb29sOiBFaXRoZXIgc3RyaWRlcyBvciBkaWxhdGlvbnMgbXVzdCBiZSAxLiAnICtcbiAgICAgICAgYEdvdCBzdHJpZGVzICR7c3RyaWRlc30gYW5kIGRpbGF0aW9ucyAnJHtkaWxhdGlvbnN9J2ApO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVQb29sMkRJbmZvKHguc2hhcGUsIGZpbHRlclNpemUsIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpO1xuICAgIGxldCByZXM7XG4gICAgaWYgKGNvbnZJbmZvLmZpbHRlcldpZHRoID09PSAxICYmIGNvbnZJbmZvLmZpbHRlckhlaWdodCA9PT0gMSAmJlxuICAgICAgICB1dGlsLmFycmF5c0VxdWFsKGNvbnZJbmZvLmluU2hhcGUsIGNvbnZJbmZvLm91dFNoYXBlKSkge1xuICAgICAgICByZXMgPSBpZGVudGl0eSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCB4VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgICAgICBjb25zdCBzdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyh4LnNoYXBlKTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gcG9vbCh4VmFsdWVzLCB4LnNoYXBlLCB4LmR0eXBlLCBzdHJpZGVzLCBjb252SW5mbywgJ21heCcpO1xuICAgICAgICByZXMgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGNvbnZJbmZvLm91dFNoYXBlLCB4LmR0eXBlLCBidWZmZXIudmFsdWVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydCBjb25zdCBtYXhQb29sQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE1heFBvb2wsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IG1heFBvb2xcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NYXhQb29sLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgTWF4UG9vbDNELCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyBwb29sM2QgfSBmcm9tICcuLi91dGlscy9wb29sX3V0aWxzJztcbmV4cG9ydCBmdW5jdGlvbiBtYXhQb29sM0QoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCBkYXRhRm9ybWF0IH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KHgsICdtYXhQb29sM2QnKTtcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlUG9vbDNESW5mbyh4LnNoYXBlLCBmaWx0ZXJTaXplLCBzdHJpZGVzLCAxIC8qIGRpbGF0aW9ucyAqLywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGRhdGFGb3JtYXQpO1xuICAgIGNvbnN0IHhWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3Qgb3V0QnVmID0gcG9vbDNkKHhWYWx1ZXMsIHguc2hhcGUsIHguZHR5cGUsIHV0aWwuY29tcHV0ZVN0cmlkZXMoeC5zaGFwZSksIGNvbnZJbmZvLCAnbWF4Jyk7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0QnVmLnNoYXBlLCAnZmxvYXQzMicsIG91dEJ1Zi52YWx1ZXMpO1xufVxuZXhwb3J0IGNvbnN0IG1heFBvb2wzRENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBNYXhQb29sM0QsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IG1heFBvb2wzRFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1heFBvb2wzRC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIGJ1ZmZlciwgTWF4UG9vbDNER3JhZCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHsgbWF4UG9vbDNkUG9zaXRpb25zIH0gZnJvbSAnLi4vdXRpbHMvcG9vbF91dGlscyc7XG5leHBvcnQgZnVuY3Rpb24gbWF4UG9vbDNER3JhZChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgZHksIGlucHV0IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChbZHksIGlucHV0XSwgJ21heFBvb2wzREdyYWQnKTtcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlUG9vbDNESW5mbyhpbnB1dC5zaGFwZSwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgMSAvKiBkaWxhdGlvbnMgKi8sIHBhZCwgZGltUm91bmRpbmdNb2RlKTtcbiAgICBjb25zdCBpbnB1dEJ1ZiA9IGJhY2tlbmQuYnVmZmVyU3luYyhpbnB1dCk7XG4gICAgY29uc3QgbWF4UG9zQnVmID0gbWF4UG9vbDNkUG9zaXRpb25zKGlucHV0QnVmLCBjb252SW5mbyk7XG4gICAgY29uc3Qgc3RyaWRlRGVwdGggPSBjb252SW5mby5zdHJpZGVEZXB0aDtcbiAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBkaWxhdGlvbkRlcHRoID0gY29udkluZm8uZGlsYXRpb25EZXB0aDtcbiAgICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICAgIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckRlcHRoID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVyRGVwdGg7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVySGVpZ2h0ID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlcldpZHRoID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVyV2lkdGg7XG4gICAgY29uc3QgcGFkRnJvbnQgPSBlZmZlY3RpdmVGaWx0ZXJEZXB0aCAtIDEgLSBjb252SW5mby5wYWRJbmZvLmZyb250O1xuICAgIGNvbnN0IHBhZExlZnQgPSBlZmZlY3RpdmVGaWx0ZXJXaWR0aCAtIDEgLSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgY29uc3QgcGFkVG9wID0gZWZmZWN0aXZlRmlsdGVySGVpZ2h0IC0gMSAtIGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IGR4ID0gYnVmZmVyKGlucHV0LnNoYXBlLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IGR5QnVmID0gYmFja2VuZC5idWZmZXJTeW5jKGR5KTtcbiAgICBmb3IgKGxldCBiYXRjaCA9IDA7IGJhdGNoIDwgY29udkluZm8uYmF0Y2hTaXplOyArK2JhdGNoKSB7XG4gICAgICAgIGZvciAobGV0IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgY29udkluZm8uaW5DaGFubmVsczsgKytjaGFubmVsKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBkeERlcHRoID0gMDsgZHhEZXB0aCA8IGNvbnZJbmZvLmluRGVwdGg7ICsrZHhEZXB0aCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGR4Um93ID0gMDsgZHhSb3cgPCBjb252SW5mby5pbkhlaWdodDsgKytkeFJvdykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBkeENvbCA9IDA7IGR4Q29sIDwgY29udkluZm8uaW5XaWR0aDsgKytkeENvbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2hhZGVyIGNvZGUgYmVnaW5zXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkeURlcHRoQ29ybmVyID0gZHhEZXB0aCAtIHBhZEZyb250O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHlSb3dDb3JuZXIgPSBkeFJvdyAtIHBhZFRvcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGR5Q29sQ29ybmVyID0gZHhDb2wgLSBwYWRMZWZ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRvdFByb2QgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgd0RlcHRoID0gMDsgd0RlcHRoIDwgZWZmZWN0aXZlRmlsdGVyRGVwdGg7IHdEZXB0aCArPSBkaWxhdGlvbkRlcHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHlEZXB0aCA9IChkeURlcHRoQ29ybmVyICsgd0RlcHRoKSAvIHN0cmlkZURlcHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkeURlcHRoIDwgMCB8fCBkeURlcHRoID49IGNvbnZJbmZvLm91dERlcHRoIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoZHlEZXB0aCkgIT09IGR5RGVwdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHdSb3cgPSAwOyB3Um93IDwgZWZmZWN0aXZlRmlsdGVySGVpZ2h0OyB3Um93ICs9IGRpbGF0aW9uSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGR5Um93ID0gKGR5Um93Q29ybmVyICsgd1JvdykgLyBzdHJpZGVIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkeVJvdyA8IDAgfHwgZHlSb3cgPj0gY29udkluZm8ub3V0SGVpZ2h0IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLmZsb29yKGR5Um93KSAhPT0gZHlSb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHdDb2wgPSAwOyB3Q29sIDwgZWZmZWN0aXZlRmlsdGVyV2lkdGg7IHdDb2wgKz0gZGlsYXRpb25XaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHlDb2wgPSAoZHlDb2xDb3JuZXIgKyB3Q29sKSAvIHN0cmlkZVdpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR5Q29sIDwgMCB8fCBkeUNvbCA+PSBjb252SW5mby5vdXRXaWR0aCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoZHlDb2wpICE9PSBkeUNvbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF4UG9zID0gZWZmZWN0aXZlRmlsdGVyRGVwdGggKiBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdGl2ZUZpbHRlcldpZHRoIC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhQb3NCdWYuZ2V0KGJhdGNoLCBkeURlcHRoLCBkeVJvdywgZHlDb2wsIGNoYW5uZWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VyUG9zID0gd0RlcHRoICogZWZmZWN0aXZlRmlsdGVySGVpZ2h0ICogZWZmZWN0aXZlRmlsdGVyV2lkdGggK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdSb3cgKiBlZmZlY3RpdmVGaWx0ZXJXaWR0aCArIHdDb2w7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXNrID0gbWF4UG9zID09PSBjdXJQb3MgPyAxIDogMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXNrID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwaXhlbCA9IGR5QnVmLmdldChiYXRjaCwgZHlEZXB0aCwgZHlSb3csIGR5Q29sLCBjaGFubmVsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdFByb2QgKz0gcGl4ZWwgKiBtYXNrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZHguc2V0KGRvdFByb2QsIGJhdGNoLCBkeERlcHRoLCBkeFJvdywgZHhDb2wsIGNoYW5uZWwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGR4LnNoYXBlLCBkeC5kdHlwZSwgZHgudmFsdWVzKTtcbn1cbmV4cG9ydCBjb25zdCBtYXhQb29sM0RHcmFkQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE1heFBvb2wzREdyYWQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IG1heFBvb2wzREdyYWRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NYXhQb29sM0RHcmFkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgYnVmZmVyLCBNYXhQb29sR3JhZCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHsgbWF4UG9vbFBvc2l0aW9ucyB9IGZyb20gJy4uL3V0aWxzL3Bvb2xfdXRpbHMnO1xuZXhwb3J0IGZ1bmN0aW9uIG1heFBvb2xHcmFkKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBkeSwgaW5wdXQsIG91dHB1dCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHggPSBpbnB1dDtcbiAgICBhc3NlcnROb3RDb21wbGV4KFtpbnB1dCwgb3V0cHV0XSwgJ21heFBvb2xHcmFkJyk7XG4gICAgY29uc3QgeyBmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSB9ID0gYXR0cnM7XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wyREluZm8oeC5zaGFwZSwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgMSAvKiBkaWxhdGlvbnMgKi8sIHBhZCwgZGltUm91bmRpbmdNb2RlKTtcbiAgICBjb25zdCB4VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IG1heFBvc0J1ZiA9IGJ1ZmZlcihjb252SW5mby5vdXRTaGFwZSwgeC5kdHlwZSwgbWF4UG9vbFBvc2l0aW9ucyh4VmFsdWVzLCB4LnNoYXBlLCB4LmR0eXBlLCBjb252SW5mbykudmFsdWVzKTtcbiAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICAgIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckhlaWdodDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoO1xuICAgIGNvbnN0IHBhZExlZnQgPSBlZmZlY3RpdmVGaWx0ZXJXaWR0aCAtIDEgLSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgY29uc3QgcGFkVG9wID0gZWZmZWN0aXZlRmlsdGVySGVpZ2h0IC0gMSAtIGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IGR4ID0gYnVmZmVyKHguc2hhcGUsICdmbG9hdDMyJyk7XG4gICAgY29uc3QgZHlEYXRhID0gYmFja2VuZC5kYXRhLmdldChkeS5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBkeUJ1ZiA9IGJ1ZmZlcihkeS5zaGFwZSwgJ2Zsb2F0MzInLCBkeURhdGEpO1xuICAgIGZvciAobGV0IGIgPSAwOyBiIDwgY29udkluZm8uYmF0Y2hTaXplOyArK2IpIHtcbiAgICAgICAgZm9yIChsZXQgZCA9IDA7IGQgPCBjb252SW5mby5pbkNoYW5uZWxzOyArK2QpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGR4UiA9IDA7IGR4UiA8IGNvbnZJbmZvLmluSGVpZ2h0OyArK2R4Uikge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGR4QyA9IDA7IGR4QyA8IGNvbnZJbmZvLmluV2lkdGg7ICsrZHhDKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNoYWRlciBjb2RlIGJlZ2lucy5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZHlSQ29ybmVyID0gZHhSIC0gcGFkVG9wO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkeUNDb3JuZXIgPSBkeEMgLSBwYWRMZWZ0O1xuICAgICAgICAgICAgICAgICAgICBsZXQgZG90UHJvZCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHdSID0gMDsgd1IgPCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQ7IHdSICs9IGRpbGF0aW9uSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkeVIgPSAoZHlSQ29ybmVyICsgd1IpIC8gc3RyaWRlSGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR5UiA8IDAgfHwgZHlSID49IGNvbnZJbmZvLm91dEhlaWdodCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoZHlSKSAhPT0gZHlSKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB3QyA9IDA7IHdDIDwgZWZmZWN0aXZlRmlsdGVyV2lkdGg7IHdDICs9IGRpbGF0aW9uV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkeUMgPSAoZHlDQ29ybmVyICsgd0MpIC8gc3RyaWRlV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR5QyA8IDAgfHwgZHlDID49IGNvbnZJbmZvLm91dFdpZHRoIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoZHlDKSAhPT0gZHlDKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXhQb3MgPSBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgKiBlZmZlY3RpdmVGaWx0ZXJXaWR0aCAtIDEgLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhQb3NCdWYuZ2V0KGIsIGR5UiwgZHlDLCBkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJQb3MgPSB3UiAqIGVmZmVjdGl2ZUZpbHRlcldpZHRoICsgd0M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFzayA9IG1heFBvcyA9PT0gY3VyUG9zID8gMSA6IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hc2sgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBpeGVsID0gZHlCdWYuZ2V0KGIsIGR5UiwgZHlDLCBkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3RQcm9kICs9IHBpeGVsICogbWFzaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkeC5zZXQoZG90UHJvZCwgYiwgZHhSLCBkeEMsIGQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhkeC5zaGFwZSwgZHguZHR5cGUsIGR4LnZhbHVlcyk7XG59XG5leHBvcnQgY29uc3QgbWF4UG9vbEdyYWRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTWF4UG9vbEdyYWQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IG1heFBvb2xHcmFkXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWF4UG9vbEdyYWQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTWF4UG9vbFdpdGhBcmdtYXggfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYmFja2VuZF91dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyBtYXhQb29sV2l0aEFyZ21heEltcGwgfSBmcm9tICcuL01heFBvb2xXaXRoQXJnbWF4X2ltcGwnO1xuZXhwb3J0IGNvbnN0IG1heFBvb2xXaXRoQXJnbWF4Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE1heFBvb2xXaXRoQXJnbWF4LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiAoeyBpbnB1dHMsIGF0dHJzLCBiYWNrZW5kIH0pID0+IHtcbiAgICAgICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgICAgIGNvbnN0IHsgZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBpbmNsdWRlQmF0Y2hJbkluZGV4IH0gPSBhdHRycztcbiAgICAgICAgY29uc3QgY3B1QmFja2VuZCA9IGJhY2tlbmQ7XG4gICAgICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ01heFBvb2xXaXRoQXJnbWF4Jyk7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcztcbiAgICAgICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wyREluZm8oeC5zaGFwZSwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgWzEsIDFdLCBwYWQpO1xuICAgICAgICBjb25zdCBbcG9vbGVkLCBpbmRleGVzXSA9IG1heFBvb2xXaXRoQXJnbWF4SW1wbCh2YWx1ZXMsIHguc2hhcGUsIHguZHR5cGUsIGluY2x1ZGVCYXRjaEluSW5kZXgsIGNvbnZJbmZvKTtcbiAgICAgICAgY29uc3QgcG9vbGVkRGF0YUlkID0gY3B1QmFja2VuZC53cml0ZShwb29sZWQsIGNvbnZJbmZvLm91dFNoYXBlLCB4LmR0eXBlKTtcbiAgICAgICAgY29uc3QgaW5kZXhlc0RhdGFJZCA9IGNwdUJhY2tlbmQud3JpdGUoaW5kZXhlcywgY29udkluZm8ub3V0U2hhcGUsIHguZHR5cGUpO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgeyBkYXRhSWQ6IHBvb2xlZERhdGFJZCwgc2hhcGU6IGNvbnZJbmZvLm91dFNoYXBlLCBkdHlwZTogeC5kdHlwZSB9LFxuICAgICAgICAgICAgeyBkYXRhSWQ6IGluZGV4ZXNEYXRhSWQsIHNoYXBlOiBjb252SW5mby5vdXRTaGFwZSwgZHR5cGU6ICdpbnQzMicgfVxuICAgICAgICBdO1xuICAgIH1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NYXhQb29sV2l0aEFyZ21heC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IG1heFBvb2xQb3NpdGlvbnMsIHBvb2wgfSBmcm9tICcuLi91dGlscy9wb29sX3V0aWxzJztcbmV4cG9ydCBmdW5jdGlvbiBtYXhQb29sV2l0aEFyZ21heEltcGwoeFZhbHVlcywgeFNoYXBlLCBkdHlwZSwgaW5jbHVkZUJhdGNoSW5JbmRleCwgY29udkluZm8pIHtcbiAgICBjb25zdCBzdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyh4U2hhcGUpO1xuICAgIGNvbnN0IG1heFBvb2xzID0gcG9vbCh4VmFsdWVzLCB4U2hhcGUsIGR0eXBlLCBzdHJpZGVzLCBjb252SW5mbywgJ21heCcpO1xuICAgIGNvbnN0IG1heFBvc2l0aW9ucyA9IG1heFBvb2xQb3NpdGlvbnMoeFZhbHVlcywgeFNoYXBlLCBkdHlwZSwgY29udkluZm8sIHRydWUsIGluY2x1ZGVCYXRjaEluSW5kZXgpO1xuICAgIHJldHVybiBbbWF4UG9vbHMudmFsdWVzLCBtYXhQb3NpdGlvbnMudmFsdWVzXTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1heFBvb2xXaXRoQXJnbWF4X2ltcGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgZnVuY3Rpb24gbWF4SW1wbChhVmFscywgcmVkdWNlU2l6ZSwgb3V0U2hhcGUsIGR0eXBlKSB7XG4gICAgY29uc3QgdmFscyA9IHV0aWwuZ2V0VHlwZWRBcnJheUZyb21EVHlwZShkdHlwZSwgdXRpbC5zaXplRnJvbVNoYXBlKG91dFNoYXBlKSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGkgKiByZWR1Y2VTaXplO1xuICAgICAgICBsZXQgbWF4ID0gYVZhbHNbb2Zmc2V0XTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByZWR1Y2VTaXplOyArK2opIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYVZhbHNbb2Zmc2V0ICsgal07XG4gICAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHZhbHVlKSB8fFxuICAgICAgICAgICAgICAgIHZhbHVlID4gbWF4KSB7IC8vIGNvbXBhcmlzb24gd2l0aCBOYU4gYWx3YXlzIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgICAgIG1heCA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhbHNbaV0gPSBtYXg7XG4gICAgfVxuICAgIHJldHVybiB2YWxzO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWF4X2ltcGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTWF4aW11bSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X2ltcGwnO1xuaW1wb3J0IHsgYmluYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgbWF4aW11bUltcGwgPSBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsKCgoYVZhbHVlLCBiVmFsdWUpID0+IE1hdGgubWF4KGFWYWx1ZSwgYlZhbHVlKSkpO1xuZXhwb3J0IGNvbnN0IG1heGltdW0gPSBiaW5hcnlLZXJuZWxGdW5jKE1heGltdW0sIG1heGltdW1JbXBsKTtcbmV4cG9ydCBjb25zdCBtYXhpbXVtQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE1heGltdW0sXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IG1heGltdW1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NYXhpbXVtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgTWVhbiwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjYXN0IH0gZnJvbSAnLi9DYXN0JztcbmltcG9ydCB7IGRpdiB9IGZyb20gJy4vUmVhbERpdic7XG5pbXBvcnQgeyBzdW0gfSBmcm9tICcuL1N1bSc7XG5leHBvcnQgZnVuY3Rpb24gbWVhbihhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYXhpcywga2VlcERpbXMgfSA9IGF0dHJzO1xuICAgIGNvbnN0IGF4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpO1xuICAgIGNvbnN0IHNoYXBlcyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKHguc2hhcGUsIGF4ZXMpO1xuICAgIGNvbnN0IHJlZHVjZVNoYXBlID0gc2hhcGVzWzFdO1xuICAgIGNvbnN0IHJlZHVjZVNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuICAgIGNvbnN0IHRvRGlzcG9zZSA9IFtdO1xuICAgIGNvbnN0IHJlZHVjZVNpemVTY2FsYXIgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtdLCAnZmxvYXQzMicsIG5ldyBGbG9hdDMyQXJyYXkoW3JlZHVjZVNpemVdKSk7XG4gICAgdG9EaXNwb3NlLnB1c2gocmVkdWNlU2l6ZVNjYWxhcik7XG4gICAgY29uc3QgJHggPSBjYXN0KHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCwgYXR0cnM6IHsgZHR5cGU6ICdmbG9hdDMyJyB9IH0pO1xuICAgIHRvRGlzcG9zZS5wdXNoKCR4KTtcbiAgICBjb25zdCByZXMgPSBkaXYoeyBpbnB1dHM6IHsgYTogJHgsIGI6IHJlZHVjZVNpemVTY2FsYXIgfSwgYmFja2VuZCB9KTtcbiAgICB0b0Rpc3Bvc2UucHVzaChyZXMpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHN1bSh7IGlucHV0czogeyB4OiByZXMgfSwgYmFja2VuZCwgYXR0cnM6IHsgYXhpcywga2VlcERpbXMgfSB9KTtcbiAgICB0b0Rpc3Bvc2UuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgY29uc3QgbWVhbkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBNZWFuLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBtZWFuXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWVhbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIE1pbiwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQgeyB0cmFuc3Bvc2UgfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5leHBvcnQgZnVuY3Rpb24gbWluKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBheGlzLCBrZWVwRGltcyB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnbWluJyk7XG4gICAgY29uc3Qgb3JpZ0F4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpO1xuICAgIGxldCBheGVzID0gb3JpZ0F4ZXM7XG4gICAgY29uc3QgcGVybXV0ZWRBeGVzID0gYmFja2VuZF91dGlsLmdldEF4ZXNQZXJtdXRhdGlvbihheGVzLCB4LnNoYXBlLmxlbmd0aCk7XG4gICAgbGV0ICR4ID0geDtcbiAgICBpZiAocGVybXV0ZWRBeGVzICE9IG51bGwpIHtcbiAgICAgICAgJHggPSB0cmFuc3Bvc2UoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kLCBhdHRyczogeyBwZXJtOiBwZXJtdXRlZEF4ZXMgfSB9KTtcbiAgICAgICAgYXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRJbm5lck1vc3RBeGVzKGF4ZXMubGVuZ3RoLCB4LnNoYXBlLmxlbmd0aCk7XG4gICAgfVxuICAgIGJhY2tlbmRfdXRpbC5hc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcygnbWluJywgYXhlcywgJHguc2hhcGUubGVuZ3RoKTtcbiAgICBjb25zdCBbb3V0U2hhcGUsIHJlZHVjZVNoYXBlXSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKCR4LnNoYXBlLCBheGVzKTtcbiAgICBjb25zdCByZWR1Y2VTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcbiAgICBjb25zdCB2YWxzID0gdXRpbC5tYWtlWmVyb3NUeXBlZEFycmF5KHV0aWwuc2l6ZUZyb21TaGFwZShvdXRTaGFwZSksICR4LmR0eXBlKTtcbiAgICBjb25zdCBhVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoJHguZGF0YUlkKS52YWx1ZXM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGkgKiByZWR1Y2VTaXplO1xuICAgICAgICBsZXQgbWluID0gYVZhbHNbb2Zmc2V0XTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByZWR1Y2VTaXplOyArK2opIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYVZhbHNbb2Zmc2V0ICsgal07XG4gICAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHZhbHVlKSB8fFxuICAgICAgICAgICAgICAgIHZhbHVlIDwgbWluKSB7IC8vIGNvbXBhcmlzb24gd2l0aCBOYU4gYWx3YXlzIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgICAgIG1pbiA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhbHNbaV0gPSBtaW47XG4gICAgfVxuICAgIGlmIChwZXJtdXRlZEF4ZXMgIT0gbnVsbCkge1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKCR4KTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRTaGFwZSwgJHguZHR5cGUsIHZhbHMpO1xuICAgIGlmIChrZWVwRGltcykge1xuICAgICAgICBjb25zdCBleHBhbmRlZFNoYXBlID0gYmFja2VuZF91dGlsLmV4cGFuZFNoYXBlVG9LZWVwRGltKG91dFNoYXBlLCBvcmlnQXhlcyk7XG4gICAgICAgIGNvbnN0IHJlc2hhcGVkUmVzdWx0ID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiByZXN1bHQgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IGV4cGFuZGVkU2hhcGUgfSB9KTtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXN1bHQpO1xuICAgICAgICByZXR1cm4gcmVzaGFwZWRSZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgY29uc3QgbWluQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE1pbixcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogbWluXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWluLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IE1pbmltdW0gfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IG1pbmltdW1JbXBsID0gY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoKGFWYWx1ZSwgYlZhbHVlKSA9PiBNYXRoLm1pbihhVmFsdWUsIGJWYWx1ZSkpKTtcbmV4cG9ydCBjb25zdCBtaW5pbXVtID0gYmluYXJ5S2VybmVsRnVuYyhNaW5pbXVtLCBtaW5pbXVtSW1wbCk7XG5leHBvcnQgY29uc3QgbWluaW11bUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBNaW5pbXVtLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBtaW5pbXVtXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWluaW11bS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBNaXJyb3JQYWQsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBtaXJyb3JQYWQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHBhZGRpbmdzLCBtb2RlIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KHgsICdtaXJyb3JQYWQnKTtcbiAgICBjb25zdCBvdXRTaGFwZSA9IHBhZGRpbmdzLm1hcCgocCwgaSkgPT4gcFswXSAvKiBiZWZvcmVQYWQgKi8gKyB4LnNoYXBlW2ldICsgcFsxXSAvKiBhZnRlclBhZCAqLyk7XG4gICAgY29uc3Qgc3RhcnQgPSBwYWRkaW5ncy5tYXAocCA9PiBwWzBdKTtcbiAgICBjb25zdCBlbmQgPSBwYWRkaW5ncy5tYXAoKHAsIGkpID0+IHBbMF0gKyB4LnNoYXBlW2ldKTtcbiAgICBjb25zdCBvZmZzZXQgPSBtb2RlID09PSAncmVmbGVjdCcgPyAwIDogMTtcbiAgICBjb25zdCB4VmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCB4UmFuayA9IHguc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IHhTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyh4LnNoYXBlKTtcbiAgICBjb25zdCByZXN1bHRTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKG91dFNoYXBlKTtcbiAgICBjb25zdCByZXN1bHRSYW5rID0gb3V0U2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IHJlc3VsdFN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKG91dFNoYXBlKTtcbiAgICBjb25zdCByZXNWYWxzID0gdXRpbC5nZXRUeXBlZEFycmF5RnJvbURUeXBlKHguZHR5cGUsIHJlc3VsdFNpemUpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0U2l6ZTsgaSsrKSB7XG4gICAgICAgIGxldCBjb29yZHMgPSB1dGlsLmluZGV4VG9Mb2MoaSwgcmVzdWx0UmFuaywgcmVzdWx0U3RyaWRlcyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0UmFuazsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoY29vcmRzW2ldIDwgc3RhcnRbaV0pIHtcbiAgICAgICAgICAgICAgICBjb29yZHNbaV0gPSBzdGFydFtpXSAqIDIgLSBjb29yZHNbaV0gLSBvZmZzZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjb29yZHNbaV0gPj0gZW5kW2ldKSB7XG4gICAgICAgICAgICAgICAgY29vcmRzW2ldID0gKGVuZFtpXSAtIDEpICogMiAtIGNvb3Jkc1tpXSArIG9mZnNldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb29yZHMgPSBjb29yZHMubWFwKChjLCBpKSA9PiBjIC0gc3RhcnRbaV0pO1xuICAgICAgICBjb25zdCBpbkluZGV4ID0gdXRpbC5sb2NUb0luZGV4KGNvb3JkcywgeFJhbmssIHhTdHJpZGVzKTtcbiAgICAgICAgcmVzVmFsc1tpXSA9IHhWYWxzW2luSW5kZXhdO1xuICAgIH1cbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQud3JpdGUocmVzVmFscywgb3V0U2hhcGUsIHguZHR5cGUpO1xuICAgIHJldHVybiB7IGRhdGFJZDogb3V0SWQsIHNoYXBlOiBvdXRTaGFwZSwgZHR5cGU6IHguZHR5cGUgfTtcbn1cbmV4cG9ydCBjb25zdCBtaXJyb3JQYWRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTWlycm9yUGFkLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBtaXJyb3JQYWRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NaXJyb3JQYWQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTW9kIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfaW1wbCc7XG5pbXBvcnQgeyBiaW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBtb2RJbXBsID0gY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoKGFWYWx1ZSwgYlZhbHVlKSA9PiB7XG4gICAgY29uc3QgcmVtID0gYVZhbHVlICUgYlZhbHVlO1xuICAgIGlmICgoYVZhbHVlIDwgMCAmJiBiVmFsdWUgPCAwKSB8fCAoYVZhbHVlID49IDAgJiYgYlZhbHVlID49IDApKSB7XG4gICAgICAgIHJldHVybiByZW07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gKHJlbSArIGJWYWx1ZSkgJSBiVmFsdWU7XG4gICAgfVxufSkpO1xuZXhwb3J0IGNvbnN0IG1vZCA9IGJpbmFyeUtlcm5lbEZ1bmMoTW9kLCBtb2RJbXBsKTtcbmV4cG9ydCBjb25zdCBtb2RDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTW9kLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBtb2Rcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Nb2QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTXVsdGlub21pYWwsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0ICogYXMgc2VlZHJhbmRvbSBmcm9tICdzZWVkcmFuZG9tJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyBzb2Z0bWF4IH0gZnJvbSAnLi9Tb2Z0bWF4JztcbmV4cG9ydCBmdW5jdGlvbiBtdWx0aW5vbWlhbChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgbG9naXRzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBudW1TYW1wbGVzLCBzZWVkLCBub3JtYWxpemVkIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KGxvZ2l0cywgJ211bHRpbm9taWFsJyk7XG4gICAgY29uc3QgcHJvYmFiaWxpdGllcyA9IG5vcm1hbGl6ZWQgP1xuICAgICAgICBsb2dpdHMgOlxuICAgICAgICBzb2Z0bWF4KHsgaW5wdXRzOiB7IGxvZ2l0cyB9LCBiYWNrZW5kLCBhdHRyczogeyBkaW06IC0xIH0gfSk7XG4gICAgY29uc3QgYmF0Y2hTaXplID0gcHJvYmFiaWxpdGllcy5zaGFwZVswXTtcbiAgICBjb25zdCBudW1FdmVudHMgPSBwcm9iYWJpbGl0aWVzLnNoYXBlWzFdO1xuICAgIGNvbnN0IHByb2JWYWxzID0gYmFja2VuZC5kYXRhLmdldChwcm9iYWJpbGl0aWVzLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHJlc1NoYXBlID0gW2JhdGNoU2l6ZSwgbnVtU2FtcGxlc107XG4gICAgY29uc3QgcmVzVmFscyA9IHV0aWwubWFrZVplcm9zVHlwZWRBcnJheSh1dGlsLnNpemVGcm9tU2hhcGUocmVzU2hhcGUpLCAnaW50MzInKTtcbiAgICBmb3IgKGxldCBiID0gMDsgYiA8IGJhdGNoU2l6ZTsgKytiKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGIgKiBudW1FdmVudHM7XG4gICAgICAgIC8vIFRoZSBjZGYgd29uJ3QgaW5jbHVkZSB0aGUgbGFzdCBldmVudC4gSXQgd2lsbCBiZSBpbXBsaWNpdCBpZiBubyBvdGhlclxuICAgICAgICAvLyBldmVudCBoYXBwZW5lZC5cbiAgICAgICAgY29uc3QgY2RmID0gbmV3IEZsb2F0MzJBcnJheShudW1FdmVudHMgLSAxKTtcbiAgICAgICAgY2RmWzBdID0gcHJvYlZhbHNbb2Zmc2V0XTtcbiAgICAgICAgZm9yIChsZXQgZXZlbnQgPSAxOyBldmVudCA8IGNkZi5sZW5ndGg7ICsrZXZlbnQpIHtcbiAgICAgICAgICAgIGNkZltldmVudF0gPSBjZGZbZXZlbnQgLSAxXSArIHByb2JWYWxzW29mZnNldCArIGV2ZW50XTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByYW5kb20gPSBzZWVkcmFuZG9tLmFsZWEoc2VlZC50b1N0cmluZygpKTtcbiAgICAgICAgY29uc3Qgb3V0T2Zmc2V0ID0gYiAqIG51bVNhbXBsZXM7XG4gICAgICAgIGZvciAobGV0IHNhbXBsZUlkID0gMDsgc2FtcGxlSWQgPCBudW1TYW1wbGVzOyArK3NhbXBsZUlkKSB7XG4gICAgICAgICAgICBjb25zdCByID0gcmFuZG9tKCk7XG4gICAgICAgICAgICAvLyBBc3N1bWUgbGFzdCBldmVudCBoYXBwZW5lZCBieSBkZWZhdWx0LlxuICAgICAgICAgICAgcmVzVmFsc1tvdXRPZmZzZXQgKyBzYW1wbGVJZF0gPSBjZGYubGVuZ3RoO1xuICAgICAgICAgICAgZm9yIChsZXQgZXZlbnQgPSAwOyBldmVudCA8IGNkZi5sZW5ndGg7IGV2ZW50KyspIHtcbiAgICAgICAgICAgICAgICBpZiAociA8IGNkZltldmVudF0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzVmFsc1tvdXRPZmZzZXQgKyBzYW1wbGVJZF0gPSBldmVudDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghbm9ybWFsaXplZCkge1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHByb2JhYmlsaXRpZXMpO1xuICAgIH1cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhyZXNTaGFwZSwgJ2ludDMyJywgcmVzVmFscyk7XG59XG5leHBvcnQgY29uc3QgbXVsdGlub21pYWxDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTXVsdGlub21pYWwsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IG11bHRpbm9taWFsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TXVsdGlub21pYWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTXVsdGlwbHkgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMsIGNyZWF0ZUNvbXBsZXhCaW5hcnlLZXJuZWxJbXBsIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBtdWx0aXBseUltcGwgPSBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsKCgoYVZhbHVlLCBiVmFsdWUpID0+IGFWYWx1ZSAqIGJWYWx1ZSkpO1xuZXhwb3J0IGNvbnN0IG11bHRpcGx5Q29tcGxleEltcGwgPSBjcmVhdGVDb21wbGV4QmluYXJ5S2VybmVsSW1wbCgoKGFSZWFsLCBhSW1hZywgYlJlYWwsIGJJbWFnKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmVhbDogYVJlYWwgKiBiUmVhbCAtIGFJbWFnICogYkltYWcsXG4gICAgICAgIGltYWc6IGFSZWFsICogYkltYWcgKyBhSW1hZyAqIGJSZWFsXG4gICAgfTtcbn0pKTtcbmV4cG9ydCBjb25zdCBtdWx0aXBseSA9IGJpbmFyeUtlcm5lbEZ1bmMoTXVsdGlwbHksIG11bHRpcGx5SW1wbCwgbXVsdGlwbHlDb21wbGV4SW1wbCk7XG5leHBvcnQgY29uc3QgbXVsdGlwbHlDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTXVsdGlwbHksXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IG11bHRpcGx5XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TXVsdGlwbHkuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTmVnLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyBtdWx0aXBseUltcGwgfSBmcm9tICcuL011bHRpcGx5JztcbmV4cG9ydCBmdW5jdGlvbiBuZWdJbXBsKHhWYWxzLCB4U2hhcGUsIHhEdHlwZSkge1xuICAgIGNvbnN0IG1pbnVzT25lID0gdXRpbC5jcmVhdGVTY2FsYXJWYWx1ZSgtMSwgeER0eXBlKTtcbiAgICByZXR1cm4gbXVsdGlwbHlJbXBsKFtdLCB4U2hhcGUsIG1pbnVzT25lLCB4VmFscywgeER0eXBlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBuZWcoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ25lZycpO1xuICAgIGNvbnN0IHhWYWxzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IFtyZXMsIG5ld1NoYXBlXSA9IG5lZ0ltcGwoeFZhbHMsIHguc2hhcGUsIHguZHR5cGUpO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG5ld1NoYXBlLCB4LmR0eXBlLCByZXMpO1xufVxuZXhwb3J0IGNvbnN0IG5lZ0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBOZWcsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IG5lZ1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5lZy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBrZXJuZWxfaW1wbHMsIE5vbk1heFN1cHByZXNzaW9uVjMgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25WM0ltcGwgPSBrZXJuZWxfaW1wbHMubm9uTWF4U3VwcHJlc3Npb25WM0ltcGw7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIG5vbk1heFN1cHByZXNzaW9uVjMoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGJveGVzLCBzY29yZXMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoYm94ZXMsICdOb25NYXhTdXBwcmVzc2lvbicpO1xuICAgIGNvbnN0IGJveGVzVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoYm94ZXMuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3Qgc2NvcmVzVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoc2NvcmVzLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHsgc2VsZWN0ZWRJbmRpY2VzIH0gPSBub25NYXhTdXBwcmVzc2lvblYzSW1wbChib3hlc1ZhbHMsIHNjb3Jlc1ZhbHMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQpO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtzZWxlY3RlZEluZGljZXMubGVuZ3RoXSwgJ2ludDMyJywgbmV3IEludDMyQXJyYXkoc2VsZWN0ZWRJbmRpY2VzKSk7XG59XG5leHBvcnQgY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25WM0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBOb25NYXhTdXBwcmVzc2lvblYzLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBub25NYXhTdXBwcmVzc2lvblYzXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Tm9uTWF4U3VwcHJlc3Npb25WMy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBrZXJuZWxfaW1wbHMsIE5vbk1heFN1cHByZXNzaW9uVjQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25WNEltcGwgPSBrZXJuZWxfaW1wbHMubm9uTWF4U3VwcHJlc3Npb25WNEltcGw7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIG5vbk1heFN1cHByZXNzaW9uVjQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGJveGVzLCBzY29yZXMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsIHBhZFRvTWF4T3V0cHV0U2l6ZSB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChib3hlcywgJ05vbk1heFN1cHByZXNzaW9uUGFkZGVkJyk7XG4gICAgY29uc3QgYm94ZXNWYWxzID0gYmFja2VuZC5kYXRhLmdldChib3hlcy5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBzY29yZXNWYWxzID0gYmFja2VuZC5kYXRhLmdldChzY29yZXMuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgeyBzZWxlY3RlZEluZGljZXMsIHZhbGlkT3V0cHV0cyB9ID0gbm9uTWF4U3VwcHJlc3Npb25WNEltcGwoYm94ZXNWYWxzLCBzY29yZXNWYWxzLCBtYXhPdXRwdXRTaXplLCBpb3VUaHJlc2hvbGQsIHNjb3JlVGhyZXNob2xkLCBwYWRUb01heE91dHB1dFNpemUpO1xuICAgIHJldHVybiBbXG4gICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW3NlbGVjdGVkSW5kaWNlcy5sZW5ndGhdLCAnaW50MzInLCBuZXcgSW50MzJBcnJheShzZWxlY3RlZEluZGljZXMpKSxcbiAgICAgICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbXSwgJ2ludDMyJywgbmV3IEludDMyQXJyYXkoW3ZhbGlkT3V0cHV0c10pKVxuICAgIF07XG59XG5leHBvcnQgY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25WNENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBOb25NYXhTdXBwcmVzc2lvblY0LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBub25NYXhTdXBwcmVzc2lvblY0XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Tm9uTWF4U3VwcHJlc3Npb25WNC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBrZXJuZWxfaW1wbHMsIE5vbk1heFN1cHByZXNzaW9uVjUgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25WNUltcGwgPSBrZXJuZWxfaW1wbHMubm9uTWF4U3VwcHJlc3Npb25WNUltcGw7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIG5vbk1heFN1cHByZXNzaW9uVjUoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGJveGVzLCBzY29yZXMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsIHNvZnRObXNTaWdtYSB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChib3hlcywgJ05vbk1heFN1cHByZXNzaW9uV2l0aFNjb3JlJyk7XG4gICAgY29uc3QgYm94ZXNWYWxzID0gYmFja2VuZC5kYXRhLmdldChib3hlcy5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBzY29yZXNWYWxzID0gYmFja2VuZC5kYXRhLmdldChzY29yZXMuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgbWF4T3V0cHV0U2l6ZVZhbCA9IG1heE91dHB1dFNpemU7XG4gICAgY29uc3QgaW91VGhyZXNob2xkVmFsID0gaW91VGhyZXNob2xkO1xuICAgIGNvbnN0IHNjb3JlVGhyZXNob2xkVmFsID0gc2NvcmVUaHJlc2hvbGQ7XG4gICAgY29uc3Qgc29mdE5tc1NpZ21hVmFsID0gc29mdE5tc1NpZ21hO1xuICAgIGNvbnN0IHsgc2VsZWN0ZWRJbmRpY2VzLCBzZWxlY3RlZFNjb3JlcyB9ID0gbm9uTWF4U3VwcHJlc3Npb25WNUltcGwoYm94ZXNWYWxzLCBzY29yZXNWYWxzLCBtYXhPdXRwdXRTaXplVmFsLCBpb3VUaHJlc2hvbGRWYWwsIHNjb3JlVGhyZXNob2xkVmFsLCBzb2Z0Tm1zU2lnbWFWYWwpO1xuICAgIHJldHVybiBbXG4gICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW3NlbGVjdGVkSW5kaWNlcy5sZW5ndGhdLCAnaW50MzInLCBuZXcgSW50MzJBcnJheShzZWxlY3RlZEluZGljZXMpKSxcbiAgICAgICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbc2VsZWN0ZWRTY29yZXMubGVuZ3RoXSwgJ2Zsb2F0MzInLCBuZXcgRmxvYXQzMkFycmF5KHNlbGVjdGVkU2NvcmVzKSlcbiAgICBdO1xufVxuZXhwb3J0IGNvbnN0IG5vbk1heFN1cHByZXNzaW9uVjVDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTm9uTWF4U3VwcHJlc3Npb25WNSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogbm9uTWF4U3VwcHJlc3Npb25WNVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5vbk1heFN1cHByZXNzaW9uVjUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTm90RXF1YWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IG5vdEVxdWFsSW1wbCA9IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwoKChhLCBiKSA9PiAoYSAhPT0gYikgPyAxIDogMCkpO1xuZXhwb3J0IGNvbnN0IG5vdEVxdWFsID0gYmluYXJ5S2VybmVsRnVuYyhOb3RFcXVhbCwgbm90RXF1YWxJbXBsLCBudWxsIC8qIGNvbXBsZXhPcCAqLywgJ2Jvb2wnKTtcbmV4cG9ydCBjb25zdCBub3RFcXVhbENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBOb3RFcXVhbCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogbm90RXF1YWxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ob3RFcXVhbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBPbmVIb3QsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBvbmVIb3QoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGluZGljZXMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGRlcHRoLCBvblZhbHVlLCBvZmZWYWx1ZSB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChpbmRpY2VzLCAnb25lSG90Jyk7XG4gICAgY29uc3QgaW5kaWNlc1NpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoaW5kaWNlcy5zaGFwZSk7XG4gICAgY29uc3QgcmVzID0gbmV3IEZsb2F0MzJBcnJheShpbmRpY2VzU2l6ZSAqIGRlcHRoKTtcbiAgICByZXMuZmlsbChvZmZWYWx1ZSk7XG4gICAgY29uc3QgaW5kaWNlc1ZhbCA9IGJhY2tlbmQuZGF0YS5nZXQoaW5kaWNlcy5kYXRhSWQpLnZhbHVlcztcbiAgICBmb3IgKGxldCBldmVudCA9IDA7IGV2ZW50IDwgaW5kaWNlc1NpemU7ICsrZXZlbnQpIHtcbiAgICAgICAgaWYgKGluZGljZXNWYWxbZXZlbnRdID49IDAgJiYgaW5kaWNlc1ZhbFtldmVudF0gPCBkZXB0aCkge1xuICAgICAgICAgICAgcmVzW2V2ZW50ICogZGVwdGggKyBpbmRpY2VzVmFsW2V2ZW50XV0gPSBvblZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFsuLi5pbmRpY2VzLnNoYXBlLCBkZXB0aF0sICdpbnQzMicsIHJlcyk7XG59XG5leHBvcnQgY29uc3Qgb25lSG90Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE9uZUhvdCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogb25lSG90XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9T25lSG90LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IE9uZXNMaWtlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNvbXBsZXggfSBmcm9tICcuL0NvbXBsZXgnO1xuaW1wb3J0IHsgZmlsbCB9IGZyb20gJy4vRmlsbCc7XG5pbXBvcnQgeyBpbWFnIH0gZnJvbSAnLi9JbWFnJztcbmltcG9ydCB7IHJlYWwgfSBmcm9tICcuL1JlYWwnO1xuaW1wb3J0IHsgemVyb3NMaWtlIH0gZnJvbSAnLi9aZXJvc0xpa2UnO1xuZXhwb3J0IGZ1bmN0aW9uIG9uZXNMaWtlKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBpZiAoeC5kdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdvbmVzTGlrZSBpcyBub3Qgc3VwcG9ydGVkIGZvciBzdHJpbmcgdGVuc29ycycpO1xuICAgIH1cbiAgICBlbHNlIGlmICh4LmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICBjb25zdCByZWFsUGFydCA9IHJlYWwoeyBpbnB1dHM6IHsgaW5wdXQ6IHggfSwgYmFja2VuZCB9KTtcbiAgICAgICAgY29uc3QgciA9IG9uZXNMaWtlKHsgaW5wdXRzOiB7IHg6IHJlYWxQYXJ0IH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIGNvbnN0IGltYWdQYXJ0ID0gaW1hZyh7IGlucHV0czogeyBpbnB1dDogeCB9LCBiYWNrZW5kIH0pO1xuICAgICAgICBjb25zdCBpID0gemVyb3NMaWtlKHsgaW5wdXRzOiB7IHg6IGltYWdQYXJ0IH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBsZXgoeyBpbnB1dHM6IHsgcmVhbDogciwgaW1hZzogaSB9LCBiYWNrZW5kIH0pO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlYWxQYXJ0KTtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyKTtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpbWFnUGFydCk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gZmlsbCh7IGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiB4LnNoYXBlLCB2YWx1ZTogMSwgZHR5cGU6IHguZHR5cGUgfSB9KTtcbiAgICB9XG59XG5leHBvcnQgY29uc3Qgb25lc0xpa2VDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogT25lc0xpa2UsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IG9uZXNMaWtlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9T25lc0xpa2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUGFjaywgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjb25jYXQgfSBmcm9tICcuL0NvbmNhdCc7XG5pbXBvcnQgeyBleHBhbmREaW1zIH0gZnJvbSAnLi9FeHBhbmREaW1zJztcbmV4cG9ydCBmdW5jdGlvbiBwYWNrKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBheGlzIH0gPSBhdHRycztcbiAgICBpZiAoaW5wdXRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gZXhwYW5kRGltcyh7IGlucHV0czogeyBpbnB1dDogaW5wdXRzWzBdIH0sIGJhY2tlbmQsIGF0dHJzOiB7IGRpbTogYXhpcyB9IH0pO1xuICAgIH1cbiAgICBjb25zdCBzaGFwZSA9IGlucHV0c1swXS5zaGFwZTtcbiAgICBjb25zdCBkdHlwZSA9IGlucHV0c1swXS5kdHlwZTtcbiAgICBpbnB1dHMuZm9yRWFjaCh0ID0+IHtcbiAgICAgICAgdXRpbC5hc3NlcnRTaGFwZXNNYXRjaChzaGFwZSwgdC5zaGFwZSwgJ0FsbCB0ZW5zb3JzIHBhc3NlZCB0byBzdGFjayBtdXN0IGhhdmUgbWF0Y2hpbmcgc2hhcGVzJyk7XG4gICAgICAgIHV0aWwuYXNzZXJ0KGR0eXBlID09PSB0LmR0eXBlLCAoKSA9PiAnQWxsIHRlbnNvcnMgcGFzc2VkIHRvIHN0YWNrIG11c3QgaGF2ZSBtYXRjaGluZyBkdHlwZXMnKTtcbiAgICB9KTtcbiAgICBjb25zdCBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcyA9IFtdO1xuICAgIGNvbnN0IGV4cGFuZGVkVGVuc29ycyA9IGlucHV0cy5tYXAodCA9PiB7XG4gICAgICAgIGNvbnN0IGV4cGFuZGVkVCA9IGV4cGFuZERpbXMoeyBpbnB1dHM6IHsgaW5wdXQ6IHQgfSwgYmFja2VuZCwgYXR0cnM6IHsgZGltOiBheGlzIH0gfSk7XG4gICAgICAgIGludGVybWVkaWF0ZVRlbnNvckluZm9zLnB1c2goZXhwYW5kZWRUKTtcbiAgICAgICAgcmV0dXJuIGV4cGFuZGVkVDtcbiAgICB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBjb25jYXQoeyBpbnB1dHM6IGV4cGFuZGVkVGVuc29ycywgYmFja2VuZCwgYXR0cnM6IHsgYXhpcyB9IH0pO1xuICAgIGludGVybWVkaWF0ZVRlbnNvckluZm9zLmZvckVhY2godCA9PiBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHQpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGNvbnN0IHBhY2tDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUGFjayxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogcGFja1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBhY2suanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUGFkVjIsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBwYWRWMihhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgcGFkZGluZ3MsIGNvbnN0YW50VmFsdWUgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ3BhZCcpO1xuICAgIGNvbnN0IG91dFNoYXBlID0gcGFkZGluZ3MubWFwKChwLCBpKSA9PiBwWzBdIC8qIGJlZm9yZVBhZCAqLyArIHguc2hhcGVbaV0gKyBwWzFdIC8qIGFmdGVyUGFkICovKTtcbiAgICBjb25zdCBzdGFydCA9IHBhZGRpbmdzLm1hcChwID0+IHBbMF0pO1xuICAgIGNvbnN0IHhWYWxzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHhTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHguc2hhcGUpO1xuICAgIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgeFN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKHguc2hhcGUpO1xuICAgIGNvbnN0IHJlc3VsdFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUob3V0U2hhcGUpO1xuICAgIGNvbnN0IHJlc3VsdFJhbmsgPSBvdXRTaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgcmVzdWx0U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMob3V0U2hhcGUpO1xuICAgIGNvbnN0IHJlc1ZhbHMgPSB1dGlsLmdldFR5cGVkQXJyYXlGcm9tRFR5cGUoeC5kdHlwZSwgcmVzdWx0U2l6ZSk7XG4gICAgaWYgKGNvbnN0YW50VmFsdWUgIT09IDApIHtcbiAgICAgICAgcmVzVmFscy5maWxsKGNvbnN0YW50VmFsdWUpO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHhTaXplOyBpKyspIHtcbiAgICAgICAgY29uc3QgY29vcmRzID0gdXRpbC5pbmRleFRvTG9jKGksIHhSYW5rLCB4U3RyaWRlcyk7XG4gICAgICAgIGNvbnN0IG91dENvb3JkcyA9IGNvb3Jkcy5tYXAoKGMsIGkpID0+IGMgKyBzdGFydFtpXSk7XG4gICAgICAgIGNvbnN0IG91dEluZGV4ID0gdXRpbC5sb2NUb0luZGV4KG91dENvb3JkcywgcmVzdWx0UmFuaywgcmVzdWx0U3RyaWRlcyk7XG4gICAgICAgIHJlc1ZhbHNbb3V0SW5kZXhdID0geFZhbHNbaV07XG4gICAgfVxuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC53cml0ZShyZXNWYWxzLCBvdXRTaGFwZSwgeC5kdHlwZSk7XG4gICAgcmV0dXJuIHsgZGF0YUlkOiBvdXRJZCwgc2hhcGU6IG91dFNoYXBlLCBkdHlwZTogeC5kdHlwZSB9O1xufVxuZXhwb3J0IGNvbnN0IHBhZFYyQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFBhZFYyLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBwYWRWMlxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBhZFYyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFBvdyB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X2ltcGwnO1xuaW1wb3J0IHsgYmluYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgcG93SW1wbCA9IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwoKGEsIGIpID0+IE1hdGgucG93KGEsIGIpKTtcbmV4cG9ydCBjb25zdCBwb3cgPSBiaW5hcnlLZXJuZWxGdW5jKFBvdywgcG93SW1wbCk7XG5leHBvcnQgY29uc3QgcG93Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFBvdyxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogcG93XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UG93LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBQcmVsdSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHsgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmNvbnN0IHByZWx1SW1wbCA9IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwoKHhWYWx1ZSwgYVZhbHVlKSA9PiB4VmFsdWUgPCAwID8gYVZhbHVlICogeFZhbHVlIDogeFZhbHVlKTtcbmV4cG9ydCBmdW5jdGlvbiBwcmVsdShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4LCBhbHBoYSB9ID0gaW5wdXRzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoW3gsIGFscGhhXSwgJ3ByZWx1Jyk7XG4gICAgY29uc3QgYVZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgYlZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KGFscGhhLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IFtyZXN1bHREYXRhLCByZXN1bHRTaGFwZV0gPSBwcmVsdUltcGwoeC5zaGFwZSwgYWxwaGEuc2hhcGUsIGFWYWxzLCBiVmFscywgeC5kdHlwZSk7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVzdWx0U2hhcGUsIHguZHR5cGUsIHJlc3VsdERhdGEpO1xufVxuZXhwb3J0IGNvbnN0IHByZWx1Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFByZWx1LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBwcmVsdSxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QcmVsdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIFByb2QsIHVwY2FzdFR5cGUsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7IHRyYW5zcG9zZSB9IGZyb20gJy4vVHJhbnNwb3NlJztcbmV4cG9ydCBmdW5jdGlvbiBwcm9kSW1wbCh4U2hhcGUsIHhEdHlwZSwgeFZhbHMsIHJlZHVjdGlvbkF4ZXMpIHtcbiAgICBjb25zdCBbb3V0U2hhcGUsIHJlZHVjZVNoYXBlXSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKHhTaGFwZSwgcmVkdWN0aW9uQXhlcyk7XG4gICAgY29uc3Qgb3V0RHR5cGUgPSB1cGNhc3RUeXBlKHhEdHlwZSwgJ2ludDMyJyk7XG4gICAgY29uc3Qgb3V0VmFscyA9IHV0aWwubWFrZVplcm9zVHlwZWRBcnJheSh1dGlsLnNpemVGcm9tU2hhcGUob3V0U2hhcGUpLCBvdXREdHlwZSk7XG4gICAgY29uc3QgcmVkdWNlU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShyZWR1Y2VTaGFwZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRWYWxzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGkgKiByZWR1Y2VTaXplO1xuICAgICAgICBsZXQgcHJvZCA9IDE7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmVkdWNlU2l6ZTsgKytqKSB7XG4gICAgICAgICAgICBwcm9kICo9IHhWYWxzW29mZnNldCArIGpdO1xuICAgICAgICB9XG4gICAgICAgIG91dFZhbHNbaV0gPSBwcm9kO1xuICAgIH1cbiAgICByZXR1cm4geyBvdXRWYWxzLCBvdXRTaGFwZSwgb3V0RHR5cGUgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcm9kKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBheGlzLCBrZWVwRGltcyB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleCh4LCAncHJvZCcpO1xuICAgIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgYXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG4gICAgY29uc3QgcGVybXV0YXRpb24gPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKGF4ZXMsIHhSYW5rKTtcbiAgICBsZXQgcmVkdWN0aW9uQXhlcyA9IGF4ZXM7XG4gICAgbGV0IHBlcm11dGVkWCA9IHg7XG4gICAgY29uc3QgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MgPSBbXTtcbiAgICBpZiAocGVybXV0YXRpb24gIT0gbnVsbCkge1xuICAgICAgICBwZXJtdXRlZFggPSB0cmFuc3Bvc2UoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kLCBhdHRyczogeyBwZXJtOiBwZXJtdXRhdGlvbiB9IH0pO1xuICAgICAgICBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcy5wdXNoKHBlcm11dGVkWCk7XG4gICAgICAgIHJlZHVjdGlvbkF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0SW5uZXJNb3N0QXhlcyhyZWR1Y3Rpb25BeGVzLmxlbmd0aCwgeFJhbmspO1xuICAgIH1cbiAgICBjb25zdCB4VmFscyA9IGJhY2tlbmQuZGF0YS5nZXQocGVybXV0ZWRYLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHsgb3V0VmFscywgb3V0U2hhcGUsIG91dER0eXBlIH0gPSBwcm9kSW1wbChwZXJtdXRlZFguc2hhcGUsIHBlcm11dGVkWC5kdHlwZSwgeFZhbHMsIHJlZHVjdGlvbkF4ZXMpO1xuICAgIGxldCByZXN1bHRTaGFwZSA9IG91dFNoYXBlO1xuICAgIGlmIChrZWVwRGltcykge1xuICAgICAgICByZXN1bHRTaGFwZSA9IGJhY2tlbmRfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbShvdXRTaGFwZSwgYXhlcyk7XG4gICAgfVxuICAgIGludGVybWVkaWF0ZVRlbnNvckluZm9zLmZvckVhY2godCA9PiBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHQpKTtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhyZXN1bHRTaGFwZSwgb3V0RHR5cGUsIG91dFZhbHMpO1xufVxuZXhwb3J0IGNvbnN0IHByb2RDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUHJvZCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogcHJvZFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVByb2QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUmFuZ2UgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgcmFuZ2VJbXBsIH0gZnJvbSAnLi9SYW5nZV9pbXBsJztcbmV4cG9ydCBmdW5jdGlvbiByYW5nZShhcmdzKSB7XG4gICAgY29uc3QgeyBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHN0YXJ0LCBzdG9wLCBkdHlwZSwgc3RlcCB9ID0gYXR0cnM7XG4gICAgY29uc3QgdmFsdWVzID0gcmFuZ2VJbXBsKHN0YXJ0LCBzdG9wLCBzdGVwLCBkdHlwZSk7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW3ZhbHVlcy5sZW5ndGhdLCBkdHlwZSwgdmFsdWVzKTtcbn1cbmV4cG9ydCBjb25zdCByYW5nZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBSYW5nZSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogcmFuZ2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SYW5nZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiByYW5nZUltcGwoc3RhcnQsIHN0b3AsIHN0ZXAsIGR0eXBlKSB7XG4gICAgY29uc3Qgc2FtZVN0YXJ0U3RvcCA9IHN0YXJ0ID09PSBzdG9wO1xuICAgIGNvbnN0IGluY3JlYXNpbmdSYW5nZU5lZ2F0aXZlU3RlcCA9IHN0YXJ0IDwgc3RvcCAmJiBzdGVwIDwgMDtcbiAgICBjb25zdCBkZWNyZWFzaW5nUmFuZ2VQb3NpdGl2ZVN0ZXAgPSBzdG9wIDwgc3RhcnQgJiYgc3RlcCA+IDE7XG4gICAgaWYgKHNhbWVTdGFydFN0b3AgfHwgaW5jcmVhc2luZ1JhbmdlTmVnYXRpdmVTdGVwIHx8XG4gICAgICAgIGRlY3JlYXNpbmdSYW5nZVBvc2l0aXZlU3RlcCkge1xuICAgICAgICByZXR1cm4gdXRpbC5tYWtlWmVyb3NUeXBlZEFycmF5KDAsIGR0eXBlKTtcbiAgICB9XG4gICAgY29uc3QgbnVtRWxlbWVudHMgPSBNYXRoLmFicyhNYXRoLmNlaWwoKHN0b3AgLSBzdGFydCkgLyBzdGVwKSk7XG4gICAgY29uc3QgdmFsdWVzID0gdXRpbC5tYWtlWmVyb3NUeXBlZEFycmF5KG51bUVsZW1lbnRzLCBkdHlwZSk7XG4gICAgaWYgKHN0b3AgPCBzdGFydCAmJiBzdGVwID09PSAxKSB7XG4gICAgICAgIC8vIEF1dG8gYWRqdXN0IHRoZSBzdGVwJ3Mgc2lnbiBpZiBpdCBoYXNuJ3QgYmVlbiBzZXRcbiAgICAgICAgLy8gKG9yIHdhcyBzZXQgdG8gMSlcbiAgICAgICAgc3RlcCA9IC0xO1xuICAgIH1cbiAgICB2YWx1ZXNbMF0gPSBzdGFydDtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YWx1ZXNbaV0gPSB2YWx1ZXNbaSAtIDFdICsgc3RlcDtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlcztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJhbmdlX2ltcGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUmVhbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgZnVuY3Rpb24gcmVhbChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBpbnB1dCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHJlYWwgPSBiYWNrZW5kLmRhdGEuZ2V0KGlucHV0LmRhdGFJZCkuY29tcGxleFRlbnNvckluZm9zLnJlYWw7XG4gICAgY29uc3QgcmVhbFZhbCA9IGJhY2tlbmQuZGF0YS5nZXQocmVhbC5kYXRhSWQpLnZhbHVlcztcbiAgICAvLyBXaGVuIGNvbXBsZXggdGVuc29yIGlzIGRpc3Bvc2VkLCBpdHMgdW5kZXJseWluZyBwYXJ0cyB3aWxsIGJlIGRpc3Bvc2VkIHRvby5cbiAgICAvLyBNYWtlIG5ldyB0ZW5zb3Igb3V0IG9mIHRoZSByZWFsIHZhbHVlIG9mIHRoZSBjb21wbGV4LiBUaGlzIG1ha2VzIHN1cmUgdGhlXG4gICAgLy8gdmFsdWUgaXMgc3RpbGwgYWNjZXNzaWJsZSBldmVuIGlmIGNvbXBsZXggdGVuc29yIGlzIGRpc3Bvc2VkLlxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHJlYWwuc2hhcGUsIHJlYWwuZHR5cGUsIHJlYWxWYWwpO1xufVxuZXhwb3J0IGNvbnN0IHJlYWxDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUmVhbCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogcmVhbFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlYWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUmVhbERpdiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X2ltcGwnO1xuaW1wb3J0IHsgYmluYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgcmVhbERpdkltcGwgPSBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsKChhLCBiKSA9PiBhIC8gYik7XG5leHBvcnQgY29uc3QgZGl2ID0gYmluYXJ5S2VybmVsRnVuYyhSZWFsRGl2LCByZWFsRGl2SW1wbCk7XG5leHBvcnQgY29uc3QgcmVhbERpdkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBSZWFsRGl2LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBkaXZcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWFsRGl2LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBSZWNpcHJvY2FsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCByZWNpcHJvY2FsID0gdW5hcnlLZXJuZWxGdW5jKFJlY2lwcm9jYWwsICh4aSkgPT4gMSAvIHhpKTtcbmV4cG9ydCBjb25zdCByZWNpcHJvY2FsQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJlY2lwcm9jYWwsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHJlY2lwcm9jYWwsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVjaXByb2NhbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUmVsdSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgcmVsdSA9IHVuYXJ5S2VybmVsRnVuYyhSZWx1LCAoeGkpID0+IE1hdGgubWF4KDAsIHhpKSk7XG5leHBvcnQgY29uc3QgcmVsdUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBSZWx1LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiByZWx1LFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlbHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFJlbHU2IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCByZWx1NiA9IHVuYXJ5S2VybmVsRnVuYyhSZWx1NiwgKHhpKSA9PiBNYXRoLm1pbihNYXRoLm1heCgwLCB4aSksIDYpKTtcbmV4cG9ydCBjb25zdCByZWx1NkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBSZWx1NixcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogcmVsdTYsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVsdTYuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUmVzaGFwZSwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgZnVuY3Rpb24gcmVzaGFwZShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgc2hhcGUgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHhTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHguc2hhcGUpO1xuICAgIGNvbnN0ICRzaGFwZSA9IHV0aWwuaW5mZXJGcm9tSW1wbGljaXRTaGFwZShzaGFwZSwgeFNpemUpO1xuICAgIGNvbnN0ICR4U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSgkc2hhcGUpO1xuICAgIHV0aWwuYXNzZXJ0KHhTaXplID09PSAkeFNpemUsICgpID0+IGBUaGUgbmV3IHNoYXBlICgkeyRzaGFwZX0pIGhhcyAkeyR4U2l6ZX0gZWxlbWVudHMgYW5kIHRoZSBvbGQgYCArXG4gICAgICAgIGBzaGFwZSAoJHt4LnNoYXBlfSkgaGFzICR7eFNpemV9IGVsZW1lbnRzLiBUaGUgbmV3IHNoYXBlIGFuZCBvbGQgYCArXG4gICAgICAgIGBzaGFwZSBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGVsZW1lbnRzLmApO1xuICAgIGJhY2tlbmQuaW5jUmVmKHguZGF0YUlkKTtcbiAgICBjb25zdCB4RGF0YSA9IGJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpO1xuICAgIGlmICh4RGF0YS5jb21wbGV4VGVuc29ySW5mb3MgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCByZWFsID0geERhdGEuY29tcGxleFRlbnNvckluZm9zLnJlYWw7XG4gICAgICAgIGNvbnN0IGltYWcgPSB4RGF0YS5jb21wbGV4VGVuc29ySW5mb3MuaW1hZztcbiAgICAgICAgcmVhbC5zaGFwZSA9ICRzaGFwZTtcbiAgICAgICAgaW1hZy5zaGFwZSA9ICRzaGFwZTtcbiAgICB9XG4gICAgcmV0dXJuIHsgZGF0YUlkOiB4LmRhdGFJZCwgc2hhcGU6ICRzaGFwZSwgZHR5cGU6IHguZHR5cGUgfTtcbn1cbmV4cG9ydCBjb25zdCByZXNoYXBlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJlc2hhcGUsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHJlc2hhcGVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZXNoYXBlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFJlc2l6ZUJpbGluZWFyLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5leHBvcnQgZnVuY3Rpb24gcmVzaXplQmlsaW5lYXIoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGltYWdlcyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYWxpZ25Db3JuZXJzLCBoYWxmUGl4ZWxDZW50ZXJzLCBzaXplIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KGltYWdlcywgJ3Jlc2l6ZUJpbGluZWFyJyk7XG4gICAgY29uc3QgaW1hZ2VzU3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoaW1hZ2VzLnNoYXBlKTtcbiAgICBjb25zdCBbbmV3SGVpZ2h0LCBuZXdXaWR0aF0gPSBzaXplO1xuICAgIGNvbnN0IFtiYXRjaCwgb2xkSGVpZ2h0LCBvbGRXaWR0aCwgbnVtQ2hhbm5lbHNdID0gaW1hZ2VzLnNoYXBlO1xuICAgIGNvbnN0IHhWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGltYWdlcy5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgRmxvYXQzMkFycmF5KHV0aWwuc2l6ZUZyb21TaGFwZShbYmF0Y2gsIG5ld0hlaWdodCwgbmV3V2lkdGgsIG51bUNoYW5uZWxzXSkpO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUlucHV0U2l6ZSA9IFtcbiAgICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdIZWlnaHQgPiAxKSA/IG9sZEhlaWdodCAtIDEgOiBvbGRIZWlnaHQsXG4gICAgICAgIChhbGlnbkNvcm5lcnMgJiYgbmV3V2lkdGggPiAxKSA/IG9sZFdpZHRoIC0gMSA6IG9sZFdpZHRoXG4gICAgXTtcbiAgICBjb25zdCBlZmZlY3RpdmVPdXRwdXRTaXplID0gW1xuICAgICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld0hlaWdodCA+IDEpID8gbmV3SGVpZ2h0IC0gMSA6IG5ld0hlaWdodCxcbiAgICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdXaWR0aCA+IDEpID8gbmV3V2lkdGggLSAxIDogbmV3V2lkdGhcbiAgICBdO1xuICAgIGxldCBvdXRwdXRJZHggPSAwO1xuICAgIGNvbnN0IGVmZmVjdGl2ZVJvd1NpemVSYXRpbyA9IGVmZmVjdGl2ZUlucHV0U2l6ZVswXSAvIGVmZmVjdGl2ZU91dHB1dFNpemVbMF07XG4gICAgY29uc3QgZWZmZWN0aXZlQ29sU2l6ZVJhdGlvID0gZWZmZWN0aXZlSW5wdXRTaXplWzFdIC8gZWZmZWN0aXZlT3V0cHV0U2l6ZVsxXTtcbiAgICBmb3IgKGxldCBiID0gMDsgYiA8IGJhdGNoOyBiKyspIHtcbiAgICAgICAgZm9yIChsZXQgciA9IDA7IHIgPCBuZXdIZWlnaHQ7IHIrKykge1xuICAgICAgICAgICAgbGV0IHNvdXJjZUZyYWNSb3c7XG4gICAgICAgICAgICBpZiAoaGFsZlBpeGVsQ2VudGVycykge1xuICAgICAgICAgICAgICAgIHNvdXJjZUZyYWNSb3cgPSBlZmZlY3RpdmVSb3dTaXplUmF0aW8gKiAociArIDAuNSkgLSAwLjU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VGcmFjUm93ID0gZWZmZWN0aXZlUm93U2l6ZVJhdGlvICogcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZVJvd0Zsb29yID0gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcihzb3VyY2VGcmFjUm93KSk7XG4gICAgICAgICAgICBjb25zdCByb3dGcmFjID0gc291cmNlRnJhY1JvdyAtIHNvdXJjZVJvd0Zsb29yO1xuICAgICAgICAgICAgY29uc3Qgc291cmNlUm93Q2VpbCA9IE1hdGgubWluKG9sZEhlaWdodCAtIDEsIE1hdGguY2VpbChzb3VyY2VGcmFjUm93KSk7XG4gICAgICAgICAgICBjb25zdCB0b3BSb3dPZmZzZXQgPSBiICogaW1hZ2VzU3RyaWRlc1swXSArIHNvdXJjZVJvd0Zsb29yICogaW1hZ2VzU3RyaWRlc1sxXTtcbiAgICAgICAgICAgIGNvbnN0IGJvdFJvd09mZnNldCA9IGIgKiBpbWFnZXNTdHJpZGVzWzBdICsgc291cmNlUm93Q2VpbCAqIGltYWdlc1N0cmlkZXNbMV07XG4gICAgICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IG5ld1dpZHRoOyBjKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgc291cmNlRnJhY0NvbDtcbiAgICAgICAgICAgICAgICBpZiAoaGFsZlBpeGVsQ2VudGVycykge1xuICAgICAgICAgICAgICAgICAgICBzb3VyY2VGcmFjQ29sID0gZWZmZWN0aXZlQ29sU2l6ZVJhdGlvICogKGMgKyAwLjUpIC0gMC41O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlRnJhY0NvbCA9IGVmZmVjdGl2ZUNvbFNpemVSYXRpbyAqIGM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNvbEZsb29yID0gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcihzb3VyY2VGcmFjQ29sKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sRnJhYyA9IHNvdXJjZUZyYWNDb2wgLSBzb3VyY2VDb2xGbG9vcjtcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VDb2xDZWlsID0gTWF0aC5taW4ob2xkV2lkdGggLSAxLCBNYXRoLmNlaWwoc291cmNlRnJhY0NvbCkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvcExlZnRPZmZlc3QgPSB0b3BSb3dPZmZzZXQgKyBzb3VyY2VDb2xGbG9vciAqIGltYWdlc1N0cmlkZXNbMl07XG4gICAgICAgICAgICAgICAgY29uc3QgYm90TGVmdE9mZnNldCA9IGJvdFJvd09mZnNldCArIHNvdXJjZUNvbEZsb29yICogaW1hZ2VzU3RyaWRlc1syXTtcbiAgICAgICAgICAgICAgICBjb25zdCB0b3BSaWdodE9mZnNldCA9IHRvcFJvd09mZnNldCArIHNvdXJjZUNvbENlaWwgKiBpbWFnZXNTdHJpZGVzWzJdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJvdFJpZ2h0T2ZmZXN0ID0gYm90Um93T2Zmc2V0ICsgc291cmNlQ29sQ2VpbCAqIGltYWdlc1N0cmlkZXNbMl07XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZCA9IDA7IGQgPCBudW1DaGFubmVsczsgZCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEJlZ2luIHNoYWRlci5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgZnJhY3Rpb25hbCBpbmRleCBvZiB0aGUgc291cmNlLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0b3BMZWZ0ID0geFZhbHVlc1t0b3BMZWZ0T2ZmZXN0ICsgZF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvdHRvbUxlZnQgPSB4VmFsdWVzW2JvdExlZnRPZmZzZXQgKyBkXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9wUmlnaHQgPSB4VmFsdWVzW3RvcFJpZ2h0T2Zmc2V0ICsgZF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvdHRvbVJpZ2h0ID0geFZhbHVlc1tib3RSaWdodE9mZmVzdCArIGRdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0b3AgPSB0b3BMZWZ0ICsgKHRvcFJpZ2h0IC0gdG9wTGVmdCkgKiBjb2xGcmFjO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBib3R0b20gPSBib3R0b21MZWZ0ICsgKGJvdHRvbVJpZ2h0IC0gYm90dG9tTGVmdCkgKiBjb2xGcmFjO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHRvcCArIChib3R0b20gLSB0b3ApICogcm93RnJhYztcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W291dHB1dElkeCsrXSA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbYmF0Y2gsIG5ld0hlaWdodCwgbmV3V2lkdGgsIG51bUNoYW5uZWxzXSwgJ2Zsb2F0MzInLCByZXN1bHQpO1xufVxuZXhwb3J0IGNvbnN0IHJlc2l6ZUJpbGluZWFyQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJlc2l6ZUJpbGluZWFyLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiByZXNpemVCaWxpbmVhclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlc2l6ZUJpbGluZWFyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFJlc2l6ZUJpbGluZWFyR3JhZCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2l6ZUJpbGluZWFyR3JhZChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW1hZ2VzLCBkeSB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYWxpZ25Db3JuZXJzIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KFtkeSwgaW1hZ2VzXSwgJ3Jlc2l6ZUJpbGluZWFyR3JhZCcpO1xuICAgIGNvbnN0IGltYWdlc1N0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGltYWdlcy5zaGFwZSk7XG4gICAgY29uc3QgW2JhdGNoLCB4SGVpZ2h0LCB4V2lkdGgsIGRlcHRoXSA9IGltYWdlcy5zaGFwZTtcbiAgICBjb25zdCBbLCB5SGVpZ2h0LCB5V2lkdGhdID0gZHkuc2hhcGU7XG4gICAgY29uc3Qgb3V0cHV0ID0gbmV3IEZsb2F0MzJBcnJheShiYXRjaCAqIHhIZWlnaHQgKiB4V2lkdGggKiBkZXB0aCk7XG4gICAgLy8gSW4gdGhlIGJhY2t3YXJkcyBwYXNzLCB3ZSB3YW50IHRvIGZpbmQgdGhlIHBpeGVscyB0aGF0IHdlcmUgZ2VuZXJhdGVkXG4gICAgLy8gZm9yIGVhY2ggcGl4ZWwgaW4gdGhlIGlucHV0IGltYWdlIHRoZSBmb3J3YXJkIHBhc3MgYW5kIGFkZCB0aGVcbiAgICAvLyBjb3JyZXNwb25kaW5nIGNvZWZmaWNpZW50IGZyb20gZHkgdG8gdGhlIGdyYWRpZW50ICh3aXRoIHNvbWVcbiAgICAvLyBpbnRlcnBvbGF0aW9uKS5cbiAgICBjb25zdCBlZmZlY3RpdmVYU2l6ZSA9IFtcbiAgICAgICAgKGFsaWduQ29ybmVycyAmJiB5SGVpZ2h0ID4gMSkgPyB4SGVpZ2h0IC0gMSA6IHhIZWlnaHQsXG4gICAgICAgIChhbGlnbkNvcm5lcnMgJiYgeVdpZHRoID4gMSkgPyB4V2lkdGggLSAxIDogeFdpZHRoXG4gICAgXTtcbiAgICBjb25zdCBlZmZlY3RpdmVZU2l6ZSA9IFtcbiAgICAgICAgKGFsaWduQ29ybmVycyAmJiB5SGVpZ2h0ID4gMSkgPyB5SGVpZ2h0IC0gMSA6IHlIZWlnaHQsXG4gICAgICAgIChhbGlnbkNvcm5lcnMgJiYgeVdpZHRoID4gMSkgPyB5V2lkdGggLSAxIDogeVdpZHRoXG4gICAgXTtcbiAgICBjb25zdCBoZWlnaHRTY2FsZSA9IGVmZmVjdGl2ZVhTaXplWzBdIC8gZWZmZWN0aXZlWVNpemVbMF07XG4gICAgY29uc3Qgd2lkdGhTY2FsZSA9IGVmZmVjdGl2ZVhTaXplWzFdIC8gZWZmZWN0aXZlWVNpemVbMV07XG4gICAgLy8gUmVmZXJlbmNlIGltcGxlbWVudGF0aW9uXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmZsb3cvYmxvYi8zMDM5Mzc1Yzg2YTViYmM5NjEwYzc3MjVkY2FhOTVkNjM1Zjg3YmEyL3RlbnNvcmZsb3cvY29yZS9rZXJuZWxzL3Jlc2l6ZV9iaWxpbmVhcl9vcC5jYyNMMjc1XG4gICAgY29uc3QgZHlWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGR5LmRhdGFJZCkudmFsdWVzO1xuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIGZvciAobGV0IGIgPSAwOyBiIDwgYmF0Y2g7IGIrKykge1xuICAgICAgICBjb25zdCBiT2Zmc2V0ID0gYiAqIGltYWdlc1N0cmlkZXNbMF07XG4gICAgICAgIGZvciAobGV0IHIgPSAwOyByIDwgeUhlaWdodDsgcisrKSB7XG4gICAgICAgICAgICBjb25zdCBkeFIgPSByICogaGVpZ2h0U2NhbGU7XG4gICAgICAgICAgICBjb25zdCB0b3BEeFJJbmRleCA9IE1hdGguZmxvb3IoZHhSKTtcbiAgICAgICAgICAgIGNvbnN0IGJvdHRvbUR4UkluZGV4ID0gTWF0aC5taW4oTWF0aC5jZWlsKGR4UiksIHhIZWlnaHQgLSAxKTtcbiAgICAgICAgICAgIGNvbnN0IHRvcER4Uk9mZnNldCA9IGJPZmZzZXQgKyB0b3BEeFJJbmRleCAqIGltYWdlc1N0cmlkZXNbMV07XG4gICAgICAgICAgICBjb25zdCBib3R0b21EeFJPZmZzZXQgPSBiT2Zmc2V0ICsgYm90dG9tRHhSSW5kZXggKiBpbWFnZXNTdHJpZGVzWzFdO1xuICAgICAgICAgICAgY29uc3QgZHhSTGVycCA9IGR4UiAtIHRvcER4UkluZGV4O1xuICAgICAgICAgICAgY29uc3QgaW52ZXJzZUR4UkxlcnAgPSAxLjAgLSBkeFJMZXJwO1xuICAgICAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCB5V2lkdGg7IGMrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGR4QyA9IGMgKiB3aWR0aFNjYWxlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxlZnREeENJbmRleCA9IE1hdGguZmxvb3IoZHhDKTtcbiAgICAgICAgICAgICAgICBjb25zdCByaWdodER4Q0luZGV4ID0gTWF0aC5taW4oTWF0aC5jZWlsKGR4QyksIHhXaWR0aCAtIDEpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGR4Q0xlcnAgPSBkeEMgLSBsZWZ0RHhDSW5kZXg7XG4gICAgICAgICAgICAgICAgY29uc3QgaW52ZXJzZUR4Q0xlcnAgPSAxLjAgLSBkeENMZXJwO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvcExlZnRSQ09mZnNldCA9IHRvcER4Uk9mZnNldCArIGxlZnREeENJbmRleCAqIGltYWdlc1N0cmlkZXNbMl07XG4gICAgICAgICAgICAgICAgY29uc3QgdG9wUmlnaHRSQ09mZnNldCA9IHRvcER4Uk9mZnNldCArIHJpZ2h0RHhDSW5kZXggKiBpbWFnZXNTdHJpZGVzWzJdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJvdHRvbUxlZnRSQ09mZnNldCA9IGJvdHRvbUR4Uk9mZnNldCArIGxlZnREeENJbmRleCAqIGltYWdlc1N0cmlkZXNbMl07XG4gICAgICAgICAgICAgICAgY29uc3QgYm90dG9tUmlnaHRSQ09mZnNldCA9IGJvdHRvbUR4Uk9mZnNldCArIHJpZ2h0RHhDSW5kZXggKiBpbWFnZXNTdHJpZGVzWzJdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGludmVyc2VEeFJMZXJwVGltZXNJbnZlcnNlRHhDTGVycCA9IGludmVyc2VEeFJMZXJwICogaW52ZXJzZUR4Q0xlcnA7XG4gICAgICAgICAgICAgICAgY29uc3QgaW52ZXJzZUR4UkxlcnBUaW1lc0R4Q0xlcnAgPSBpbnZlcnNlRHhSTGVycCAqIGR4Q0xlcnA7XG4gICAgICAgICAgICAgICAgY29uc3QgZHhSTGVycFRpbWVzSW52ZXJzZUR4Q0xlcnAgPSBkeFJMZXJwICogaW52ZXJzZUR4Q0xlcnA7XG4gICAgICAgICAgICAgICAgY29uc3QgZHhSTGVycFRpbWVzRHhDTGVycCA9IGR4UkxlcnAgKiBkeENMZXJwO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGQgPSAwOyBkIDwgZGVwdGg7IGQrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkeVZhbCA9IGR5VmFsdWVzW29mZnNldCsrXTtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W3RvcExlZnRSQ09mZnNldCArIGRdICs9XG4gICAgICAgICAgICAgICAgICAgICAgICBkeVZhbCAqIGludmVyc2VEeFJMZXJwVGltZXNJbnZlcnNlRHhDTGVycDtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W3RvcFJpZ2h0UkNPZmZzZXQgKyBkXSArPSBkeVZhbCAqIGludmVyc2VEeFJMZXJwVGltZXNEeENMZXJwO1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRbYm90dG9tTGVmdFJDT2Zmc2V0ICsgZF0gKz0gZHlWYWwgKiBkeFJMZXJwVGltZXNJbnZlcnNlRHhDTGVycDtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W2JvdHRvbVJpZ2h0UkNPZmZzZXQgKyBkXSArPSBkeVZhbCAqIGR4UkxlcnBUaW1lc0R4Q0xlcnA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtiYXRjaCwgeFdpZHRoLCB4SGVpZ2h0LCBkZXB0aF0sICdmbG9hdDMyJywgb3V0cHV0KTtcbn1cbmV4cG9ydCBjb25zdCByZXNpemVCaWxpbmVhckdyYWRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUmVzaXplQmlsaW5lYXJHcmFkLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiByZXNpemVCaWxpbmVhckdyYWRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZXNpemVCaWxpbmVhckdyYWQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUmVzaXplTmVhcmVzdE5laWdoYm9yLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5leHBvcnQgZnVuY3Rpb24gcmVzaXplTmVhcmVzdE5laWdoYm9yKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBpbWFnZXMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGFsaWduQ29ybmVycywgaGFsZlBpeGVsQ2VudGVycywgc2l6ZSB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChpbWFnZXMsICdyZXNpemVOZWFyZXN0TmVpZ2hib3InKTtcbiAgICBjb25zdCBpbWFnZXNTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhpbWFnZXMuc2hhcGUpO1xuICAgIGNvbnN0IFtuZXdIZWlnaHQsIG5ld1dpZHRoXSA9IHNpemU7XG4gICAgY29uc3QgW2JhdGNoLCBvbGRIZWlnaHQsIG9sZFdpZHRoLCBudW1DaGFubmVsc10gPSBpbWFnZXMuc2hhcGU7XG4gICAgY29uc3QgeFZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoaW1hZ2VzLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IG91dHB1dCA9IG5ldyBGbG9hdDMyQXJyYXkoYmF0Y2ggKiBuZXdIZWlnaHQgKiBuZXdXaWR0aCAqIG51bUNoYW5uZWxzKTtcbiAgICBjb25zdCBlZmZlY3RpdmVJbnB1dFNpemUgPSBbXG4gICAgICAgIChhbGlnbkNvcm5lcnMgJiYgbmV3SGVpZ2h0ID4gMSkgPyBvbGRIZWlnaHQgLSAxIDogb2xkSGVpZ2h0LFxuICAgICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld1dpZHRoID4gMSkgPyBvbGRXaWR0aCAtIDEgOiBvbGRXaWR0aFxuICAgIF07XG4gICAgY29uc3QgZWZmZWN0aXZlT3V0cHV0U2l6ZSA9IFtcbiAgICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdIZWlnaHQgPiAxKSA/IG5ld0hlaWdodCAtIDEgOiBuZXdIZWlnaHQsXG4gICAgICAgIChhbGlnbkNvcm5lcnMgJiYgbmV3V2lkdGggPiAxKSA/IG5ld1dpZHRoIC0gMSA6IG5ld1dpZHRoXG4gICAgXTtcbiAgICBjb25zdCBlZmZlY3RpdmVSb3dTaXplUmF0aW8gPSBlZmZlY3RpdmVJbnB1dFNpemVbMF0gLyBlZmZlY3RpdmVPdXRwdXRTaXplWzBdO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUNvbFNpemVSYXRpbyA9IGVmZmVjdGl2ZUlucHV0U2l6ZVsxXSAvIGVmZmVjdGl2ZU91dHB1dFNpemVbMV07XG4gICAgbGV0IG91dHB1dE9mZnNldCA9IDA7XG4gICAgZm9yIChsZXQgYiA9IDA7IGIgPCBiYXRjaDsgYisrKSB7XG4gICAgICAgIGNvbnN0IGJhdGNoT2Zmc2V0ID0gYiAqIGltYWdlc1N0cmlkZXNbMF07XG4gICAgICAgIGZvciAobGV0IHIgPSAwOyByIDwgbmV3SGVpZ2h0OyByKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUZyYWNSb3cgPSBoYWxmUGl4ZWxDZW50ZXJzID9cbiAgICAgICAgICAgICAgICBlZmZlY3RpdmVSb3dTaXplUmF0aW8gKiAociArIDAuNSkgOlxuICAgICAgICAgICAgICAgIGVmZmVjdGl2ZVJvd1NpemVSYXRpbyAqIHI7XG4gICAgICAgICAgICBsZXQgc291cmNlTmVhcmVzdFJvdyA9IE1hdGgubWluKG9sZEhlaWdodCAtIDEsIGFsaWduQ29ybmVycyA/IE1hdGgucm91bmQoc291cmNlRnJhY1JvdykgOiBNYXRoLmZsb29yKHNvdXJjZUZyYWNSb3cpKTtcbiAgICAgICAgICAgIGlmIChoYWxmUGl4ZWxDZW50ZXJzKSB7XG4gICAgICAgICAgICAgICAgc291cmNlTmVhcmVzdFJvdyA9IE1hdGgubWF4KDAsIHNvdXJjZU5lYXJlc3RSb3cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgcm93T2Zmc2V0ID0gYmF0Y2hPZmZzZXQgKyBzb3VyY2VOZWFyZXN0Um93ICogaW1hZ2VzU3RyaWRlc1sxXTtcbiAgICAgICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgbmV3V2lkdGg7IGMrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUZyYWNDb2wgPSBoYWxmUGl4ZWxDZW50ZXJzID9cbiAgICAgICAgICAgICAgICAgICAgZWZmZWN0aXZlQ29sU2l6ZVJhdGlvICogKGMgKyAwLjUpIDpcbiAgICAgICAgICAgICAgICAgICAgZWZmZWN0aXZlQ29sU2l6ZVJhdGlvICogYztcbiAgICAgICAgICAgICAgICBsZXQgc291cmNlTmVhcmVzdENvbCA9IE1hdGgubWluKG9sZFdpZHRoIC0gMSwgYWxpZ25Db3JuZXJzID8gTWF0aC5yb3VuZChzb3VyY2VGcmFjQ29sKSA6XG4gICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3Ioc291cmNlRnJhY0NvbCkpO1xuICAgICAgICAgICAgICAgIGlmIChoYWxmUGl4ZWxDZW50ZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZU5lYXJlc3RDb2wgPSBNYXRoLm1heCgwLCBzb3VyY2VOZWFyZXN0Q29sKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgY29sT2Zmc2V0ID0gcm93T2Zmc2V0ICsgc291cmNlTmVhcmVzdENvbCAqIGltYWdlc1N0cmlkZXNbMl07XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZCA9IDA7IGQgPCBudW1DaGFubmVsczsgZCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEJlZ2luIHNoYWRlci5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgZnJhY3Rpb25hbCBpbmRleCBvZiB0aGUgc291cmNlLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdWYWwgPSB4VmFsdWVzW2NvbE9mZnNldCArIGRdO1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRbb3V0cHV0T2Zmc2V0KytdID0gbmV3VmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbYmF0Y2gsIG5ld0hlaWdodCwgbmV3V2lkdGgsIG51bUNoYW5uZWxzXSwgaW1hZ2VzLmR0eXBlLCBvdXRwdXQpO1xufVxuZXhwb3J0IGNvbnN0IHJlc2l6ZU5lYXJlc3ROZWlnaGJvckNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBSZXNpemVOZWFyZXN0TmVpZ2hib3IsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHJlc2l6ZU5lYXJlc3ROZWlnaGJvclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlc2l6ZU5lYXJlc3ROZWlnaGJvci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBSZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5leHBvcnQgZnVuY3Rpb24gcmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW1hZ2VzLCBkeSB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYWxpZ25Db3JuZXJzIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KFtkeSwgaW1hZ2VzXSwgJ3Jlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWQnKTtcbiAgICBjb25zdCBpbWFnZXNTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhpbWFnZXMuc2hhcGUpO1xuICAgIGNvbnN0IGR5U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoZHkuc2hhcGUpO1xuICAgIGNvbnN0IFtiYXRjaCwgeEhlaWdodCwgeFdpZHRoLCBkZXB0aF0gPSBpbWFnZXMuc2hhcGU7XG4gICAgY29uc3QgWywgeUhlaWdodCwgeVdpZHRoXSA9IGR5LnNoYXBlO1xuICAgIGNvbnN0IG91dHB1dCA9IG5ldyBGbG9hdDMyQXJyYXkoYmF0Y2ggKiB4SGVpZ2h0ICogeFdpZHRoICogZGVwdGgpO1xuICAgIGNvbnN0IGR5VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldChkeS5kYXRhSWQpLnZhbHVlcztcbiAgICAvLyBJbiB0aGUgYmFja3dhcmRzIHBhc3MsIHdlIHdhbnQgdG8gZmluZCB0aGUgcGl4ZWxzIHRoYXQgd2VyZSBnZW5lcmF0ZWRcbiAgICAvLyBmb3IgZWFjaCBwaXhlbCBpbiB0aGUgaW5wdXQgaW1hZ2UgdGhlIGZvcndhcmQgcGFzc1xuICAgIGNvbnN0IGVmZmVjdGl2ZVhTaXplID0gW1xuICAgICAgICAoYWxpZ25Db3JuZXJzICYmIHlIZWlnaHQgPiAxKSA/IHhIZWlnaHQgLSAxIDogeEhlaWdodCxcbiAgICAgICAgKGFsaWduQ29ybmVycyAmJiB5V2lkdGggPiAxKSA/IHhXaWR0aCAtIDEgOiB4V2lkdGhcbiAgICBdO1xuICAgIGNvbnN0IGVmZmVjdGl2ZVlTaXplID0gW1xuICAgICAgICAoYWxpZ25Db3JuZXJzICYmIHlIZWlnaHQgPiAxKSA/IHlIZWlnaHQgLSAxIDogeUhlaWdodCxcbiAgICAgICAgKGFsaWduQ29ybmVycyAmJiB5V2lkdGggPiAxKSA/IHlXaWR0aCAtIDEgOiB5V2lkdGhcbiAgICBdO1xuICAgIGNvbnN0IGhlaWdodFNjYWxlID0gZWZmZWN0aXZlWFNpemVbMF0gLyBlZmZlY3RpdmVZU2l6ZVswXTtcbiAgICBjb25zdCB3aWR0aFNjYWxlID0gZWZmZWN0aXZlWFNpemVbMV0gLyBlZmZlY3RpdmVZU2l6ZVsxXTtcbiAgICBjb25zdCBpbnZIZWlnaHRTY2FsZSA9IDEgLyBoZWlnaHRTY2FsZTtcbiAgICBjb25zdCBpbnZXaWR0aFNjYWxlID0gMSAvIHdpZHRoU2NhbGU7XG4gICAgLy8gVGhpcyBkZWZpbmVzIHRoZSBzaXplIG9mIHRoZSB3aW5kb3cgb2YgdmFsdWVzIGFyb3VuZCBhIHBhcnRpY3VsYXJcbiAgICAvLyBpbmRleCBpbiBkeSB0aGF0IHdlIHdhbnQgdG8gc2VhcmNoIGZvciBjb250cmlidXRpb25zIHRvIGR4LlxuICAgIGNvbnN0IHdpbkhlaWdodCA9IChNYXRoLmNlaWwoaW52SGVpZ2h0U2NhbGUpICogMikgKyAyO1xuICAgIGNvbnN0IHdpbldpZHRoID0gKE1hdGguY2VpbChpbnZXaWR0aFNjYWxlKSAqIDIpICsgMjtcbiAgICAvLyBMb29wIG92ZXIgdGhlIG91dHB1dCBzcGFjZS5cbiAgICBmb3IgKGxldCBiID0gMDsgYiA8IGJhdGNoOyBiKyspIHtcbiAgICAgICAgY29uc3QgYmF0Y2hPZmZzZXQgPSBiICogaW1hZ2VzU3RyaWRlc1swXTtcbiAgICAgICAgZm9yIChsZXQgciA9IDA7IHIgPCB4SGVpZ2h0OyByKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHJvd09mZnNldCA9IGJhdGNoT2Zmc2V0ICsgciAqIGltYWdlc1N0cmlkZXNbMV07XG4gICAgICAgICAgICAvLyBDb21wdXRlIGJvdW5kcyBmb3Igd2hlcmUgaW4gZHkgd2Ugd2lsbCBsb29rXG4gICAgICAgICAgICBjb25zdCBzdGFydFJMZXJwID0gTWF0aC5mbG9vcihyICogaW52SGVpZ2h0U2NhbGUpO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnREeVIgPSBNYXRoLmZsb29yKHN0YXJ0UkxlcnAgLSAod2luSGVpZ2h0IC8gMikpO1xuICAgICAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCB4V2lkdGg7IGMrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbE9mZnNldCA9IHJvd09mZnNldCArIGMgKiBpbWFnZXNTdHJpZGVzWzJdO1xuICAgICAgICAgICAgICAgIC8vIENvbXB1dGUgYm91bmRzIGZvciB3aGVyZSBpbiBkeSB3ZSB3aWxsIGxvb2tcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydENMZXJwID0gTWF0aC5mbG9vcihjICogaW52V2lkdGhTY2FsZSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnREeUMgPSBNYXRoLmZsb29yKHN0YXJ0Q0xlcnAgLSAod2luV2lkdGggLyAyKSk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZCA9IDA7IGQgPCBkZXB0aDsgZCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhY2N1bSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIC8vIGxvb3Agb3ZlciBkeVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBkeVJJbmRleCA9IDA7IGR5UkluZGV4IDwgd2luSGVpZ2h0OyBkeVJJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkeVIgPSBkeVJJbmRleCArIHN0YXJ0RHlSO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gR3VhcmQgYWdhaW5zdCB0aGUgd2luZG93IGV4Y2VlZGluZyB0aGUgYm91bmRzIG9mIGR5XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHlSIDwgMCB8fCBkeVIgPj0geUhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHlST2Zmc2V0ID0gYmF0Y2hPZmZzZXQgKyBkeVIgKiBkeVN0cmlkZXNbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VGcmFjUm93ID0gZHlSICogaGVpZ2h0U2NhbGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VOZWFyZXN0Um93ID0gTWF0aC5taW4oeEhlaWdodCAtIDEsIGFsaWduQ29ybmVycyA/IE1hdGgucm91bmQoc291cmNlRnJhY1JvdykgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3Ioc291cmNlRnJhY1JvdykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIgIT09IHNvdXJjZU5lYXJlc3RSb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGR5Q0luZGV4ID0gMDsgZHlDSW5kZXggPCB3aW5XaWR0aDsgZHlDSW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGR5QyA9IGR5Q0luZGV4ICsgc3RhcnREeUM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR3VhcmQgYWdhaW5zdCB0aGUgd2luZG93IGV4Y2VlZGluZyB0aGUgYm91bmRzIG9mIGR5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR5QyA8IDAgfHwgZHlDID49IHlXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHlDT2Zmc2V0ID0gZHlST2Zmc2V0ICsgZHlDICogZHlTdHJpZGVzWzJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUZyYWNDb2wgPSBkeUMgKiB3aWR0aFNjYWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZU5lYXJlc3RDb2wgPSBNYXRoLm1pbih4V2lkdGggLSAxLCBhbGlnbkNvcm5lcnMgPyBNYXRoLnJvdW5kKHNvdXJjZUZyYWNDb2wpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihzb3VyY2VGcmFjQ29sKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT09IHNvdXJjZU5lYXJlc3RDb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjdW0gKz0gZHlWYWx1ZXNbZHlDT2Zmc2V0ICsgZF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtjb2xPZmZzZXQgKyBkXSA9IGFjY3VtO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhpbWFnZXMuc2hhcGUsIGltYWdlcy5kdHlwZSwgb3V0cHV0KTtcbn1cbmV4cG9ydCBjb25zdCByZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHJlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFJldmVyc2UsIFRlbnNvckJ1ZmZlciwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHsgaWRlbnRpdHkgfSBmcm9tICcuL0lkZW50aXR5JztcbmV4cG9ydCBmdW5jdGlvbiByZXZlcnNlKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBkaW1zIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KHgsICdyZXZlcnNlJyk7XG4gICAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCAkZGltcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oZGltcywgeC5zaGFwZSk7XG4gICAgaWYgKHhSYW5rID09PSAwKSB7XG4gICAgICAgIHJldHVybiBpZGVudGl0eSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQgfSk7XG4gICAgfVxuICAgIGNvbnN0IG91dEJ1ZiA9IG5ldyBUZW5zb3JCdWZmZXIoeC5zaGFwZSwgeC5kdHlwZSk7XG4gICAgY29uc3QgeEJ1ZiA9IGJhY2tlbmQuYnVmZmVyU3luYyh4KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dEJ1Zi5zaXplOyBpKyspIHtcbiAgICAgICAgY29uc3Qgb3V0TG9jID0gb3V0QnVmLmluZGV4VG9Mb2MoaSk7XG4gICAgICAgIGNvbnN0IGluTG9jID0gb3V0TG9jLnNsaWNlKCk7XG4gICAgICAgICRkaW1zLmZvckVhY2goZCA9PiBpbkxvY1tkXSA9IHguc2hhcGVbZF0gLSAxIC0gaW5Mb2NbZF0pO1xuICAgICAgICBvdXRCdWYuc2V0KHhCdWYuZ2V0KC4uLmluTG9jKSwgLi4ub3V0TG9jKTtcbiAgICB9XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0QnVmLnNoYXBlLCBvdXRCdWYuZHR5cGUsIG91dEJ1Zi52YWx1ZXMpO1xufVxuZXhwb3J0IGNvbnN0IHJldmVyc2VDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUmV2ZXJzZSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogcmV2ZXJzZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJldmVyc2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBSb3RhdGVXaXRoT2Zmc2V0LCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBjb25zdCByb3RhdGVXaXRoT2Zmc2V0Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJvdGF0ZVdpdGhPZmZzZXQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6ICh7IGlucHV0cywgYXR0cnMsIGJhY2tlbmQgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IGltYWdlIH0gPSBpbnB1dHM7XG4gICAgICAgIGNvbnN0IHsgcmFkaWFucywgZmlsbFZhbHVlLCBjZW50ZXIgfSA9IGF0dHJzO1xuICAgICAgICBjb25zdCBjcHVCYWNrZW5kID0gYmFja2VuZDtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gdXRpbC5nZXRUeXBlZEFycmF5RnJvbURUeXBlKGltYWdlLmR0eXBlLCB1dGlsLnNpemVGcm9tU2hhcGUoaW1hZ2Uuc2hhcGUpKTtcbiAgICAgICAgY29uc3QgW2JhdGNoLCBpbWFnZUhlaWdodCwgaW1hZ2VXaWR0aCwgbnVtQ2hhbm5lbHNdID0gaW1hZ2Uuc2hhcGU7XG4gICAgICAgIGNvbnN0IFtjZW50ZXJYLCBjZW50ZXJZXSA9IGJhY2tlbmRfdXRpbC5nZXRJbWFnZUNlbnRlcihjZW50ZXIsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoKTtcbiAgICAgICAgY29uc3QgZnVsbE9wYWNpdHlWYWx1ZSA9IDI1NTtcbiAgICAgICAgY29uc3Qgc2luRmFjdG9yID0gTWF0aC5zaW4ocmFkaWFucyk7XG4gICAgICAgIGNvbnN0IGNvc0ZhY3RvciA9IE1hdGguY29zKHJhZGlhbnMpO1xuICAgICAgICBjb25zdCBpbWFnZVZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KGltYWdlLmRhdGFJZCkudmFsdWVzO1xuICAgICAgICBmb3IgKGxldCBiYXRjaElkeCA9IDA7IGJhdGNoSWR4IDwgYmF0Y2g7IGJhdGNoSWR4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGJhdGNoT2Zmc2V0ID0gYmF0Y2hJZHggKiBpbWFnZVdpZHRoICogaW1hZ2VIZWlnaHQgKiBudW1DaGFubmVscztcbiAgICAgICAgICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGltYWdlSGVpZ2h0OyByb3crKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvd09mZnNldCA9IHJvdyAqIChpbWFnZVdpZHRoICogbnVtQ2hhbm5lbHMpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IGltYWdlV2lkdGg7IGNvbCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbE9mZnNldCA9IGNvbCAqIG51bUNoYW5uZWxzO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjaGFubmVsID0gMDsgY2hhbm5lbCA8IG51bUNoYW5uZWxzOyBjaGFubmVsKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvb3JkcyA9IFtiYXRjaCwgcm93LCBjb2wsIGNoYW5uZWxdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeCA9IGNvb3Jkc1syXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHkgPSBjb29yZHNbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb29yZFgvY29vcmRZIGFyZSB0aGUgcmVzdWx0IG9mIHJvdGF0aW5nIGFuZCB0cmFuc2xhdGluZyB4L3kuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29vcmRYID0gKHggLSBjZW50ZXJYKSAqIGNvc0ZhY3RvciAtICh5IC0gY2VudGVyWSkgKiBzaW5GYWN0b3I7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29vcmRZID0gKHggLSBjZW50ZXJYKSAqIHNpbkZhY3RvciArICh5IC0gY2VudGVyWSkgKiBjb3NGYWN0b3I7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb29yZFggPSBNYXRoLnJvdW5kKGNvb3JkWCArIGNlbnRlclgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRZID0gTWF0aC5yb3VuZChjb29yZFkgKyBjZW50ZXJZKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvdXRwdXRWYWx1ZSA9IGZpbGxWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZmlsbFZhbHVlICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGFubmVsID09PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFZhbHVlID0gZnVsbE9wYWNpdHlWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFZhbHVlID0gZmlsbFZhbHVlW2NoYW5uZWxdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjb29yZGluYXRlIHBvc2l0aW9uIGZhbGxzIHdpdGhpbiB0aGUgaW1hZ2UgYm91bmRhcmllcy4uLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvb3JkWCA+PSAwICYmIGNvb3JkWCA8IGltYWdlV2lkdGggJiYgY29vcmRZID49IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29yZFkgPCBpbWFnZUhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgb3V0cHV0IHRvIHRoZSBpbWFnZSB2YWx1ZSBhdCB0aGUgY29vcmRpbmF0ZSBwb3NpdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByb3RhdGVkUm93T2Zmc2V0ID0gY29vcmRZICogKGltYWdlV2lkdGggKiBudW1DaGFubmVscyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm90YXRlZENvbE9mZnNldCA9IGNvb3JkWCAqIG51bUNoYW5uZWxzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGltYWdlSWR4ID0gYmF0Y2hPZmZzZXQgKyByb3RhdGVkUm93T2Zmc2V0ICsgcm90YXRlZENvbE9mZnNldCArIGNoYW5uZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VmFsdWUgPSBpbWFnZVZhbHNbaW1hZ2VJZHhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3V0SWR4ID0gYmF0Y2hPZmZzZXQgKyByb3dPZmZzZXQgKyBjb2xPZmZzZXQgKyBjaGFubmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W291dElkeF0gPSBvdXRwdXRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRhSWQgPSBjcHVCYWNrZW5kLndyaXRlKG91dHB1dCwgaW1hZ2Uuc2hhcGUsIGltYWdlLmR0eXBlKTtcbiAgICAgICAgcmV0dXJuIHsgZGF0YUlkLCBzaGFwZTogaW1hZ2Uuc2hhcGUsIGR0eXBlOiBpbWFnZS5kdHlwZSB9O1xuICAgIH1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Sb3RhdGVXaXRoT2Zmc2V0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBSb3VuZCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3Qgcm91bmQgPSB1bmFyeUtlcm5lbEZ1bmMoUm91bmQsICh4aSkgPT4ge1xuICAgIC8vIFRoZSBhbGdvcml0aG0gaXMgYmFzZWQgb24gYmFua2VyJ3Mgcm91bmRpbmcuXG4gICAgY29uc3QgYmFzZSA9IE1hdGguZmxvb3IoeGkpO1xuICAgIGlmICh4aSAtIGJhc2UgPCAwLjUpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoeGkpO1xuICAgIH1cbiAgICBlbHNlIGlmICh4aSAtIGJhc2UgPiAwLjUpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguY2VpbCh4aSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoYmFzZSAlIDIuMCA9PT0gMC4wKSB7XG4gICAgICAgICAgICByZXR1cm4gYmFzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBiYXNlICsgMS4wO1xuICAgICAgICB9XG4gICAgfVxufSk7XG5leHBvcnQgY29uc3Qgcm91bmRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUm91bmQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHJvdW5kLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJvdW5kLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBSc3FydCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVTaW1wbGVVbmFyeUltcGwgfSBmcm9tICcuLi91dGlscy91bmFyeV9pbXBsJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuY0Zyb21JbXBsIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IHJzcXJ0SW1wbCA9IGNyZWF0ZVNpbXBsZVVuYXJ5SW1wbCgoeGkpID0+IDEgLyBNYXRoLnNxcnQoeGkpKTtcbmV4cG9ydCBjb25zdCByc3FydCA9IHVuYXJ5S2VybmVsRnVuY0Zyb21JbXBsKFJzcXJ0LCByc3FydEltcGwpO1xuZXhwb3J0IGNvbnN0IHJzcXJ0Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJzcXJ0LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiByc3FydCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Sc3FydC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIFNjYXR0ZXJOZCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBzY2F0dGVySW1wbCB9IGZyb20gJy4vU2NhdHRlcl9pbXBsJztcbmV4cG9ydCBmdW5jdGlvbiBzY2F0dGVyTmQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGluZGljZXMsIHVwZGF0ZXMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHNoYXBlIH0gPSBhdHRycztcbiAgICBjb25zdCB7IHNsaWNlUmFuaywgbnVtVXBkYXRlcywgc2xpY2VTaXplLCBzdHJpZGVzLCBvdXRwdXRTaXplIH0gPSBiYWNrZW5kX3V0aWwuY2FsY3VsYXRlU2hhcGVzKHVwZGF0ZXMsIGluZGljZXMsIHNoYXBlKTtcbiAgICBjb25zdCBzdW1EdXBlSW5kaWNlcyA9IHRydWU7XG4gICAgY29uc3QgaW5kaWNlc0J1ZiA9IGJhY2tlbmQuYnVmZmVyU3luYyhpbmRpY2VzKTtcbiAgICBjb25zdCB1cGRhdGVzQnVmID0gYmFja2VuZC5idWZmZXJTeW5jKHVwZGF0ZXMpO1xuICAgIGNvbnN0IG91dEJ1ZiA9IHNjYXR0ZXJJbXBsKGluZGljZXNCdWYsIHVwZGF0ZXNCdWYsIHNoYXBlLCBvdXRwdXRTaXplLCBzbGljZVNpemUsIG51bVVwZGF0ZXMsIHNsaWNlUmFuaywgc3RyaWRlcywgMCAvKiBkZWZhdWx0VmFsdWUgKi8sIHN1bUR1cGVJbmRpY2VzKTtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhzaGFwZSwgb3V0QnVmLmR0eXBlLCBvdXRCdWYudmFsdWVzKTtcbn1cbmV4cG9ydCBjb25zdCBzY2F0dGVyTmRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU2NhdHRlck5kLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBzY2F0dGVyTmRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TY2F0dGVyTmQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYnVmZmVyIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiBzY2F0dGVySW1wbChpbmRpY2VzLCB1cGRhdGVzLCBzaGFwZSwgb3V0cHV0U2l6ZSwgc2xpY2VTaXplLCBudW1VcGRhdGVzLCBzbGljZVJhbmssIHN0cmlkZXMsIGRlZmF1bHRWYWx1ZSwgc3VtRHVwZUluZGljZXMpIHtcbiAgICBjb25zdCBmbGF0dGVuU2hhcGUgPSBbb3V0cHV0U2l6ZSAvIHNsaWNlU2l6ZSwgc2xpY2VTaXplXTtcbiAgICBjb25zdCBpbmRpY2VzRGF0YSA9IGluZGljZXMudmFsdWVzO1xuICAgIGNvbnN0IHVwZGF0ZXNEYXRhID0gdXBkYXRlcy52YWx1ZXM7XG4gICAgaWYgKG91dHB1dFNpemUgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGJ1ZmZlcihzaGFwZSwgdXBkYXRlcy5kdHlwZSk7XG4gICAgfVxuICAgIGNvbnN0IG91dEJ1ZiA9IGJ1ZmZlcihmbGF0dGVuU2hhcGUsIHVwZGF0ZXMuZHR5cGUpO1xuICAgIG91dEJ1Zi52YWx1ZXMuZmlsbChkZWZhdWx0VmFsdWUpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtVXBkYXRlczsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gW107XG4gICAgICAgIGxldCBmbGF0dGVuSW5kZXggPSAwO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHNsaWNlUmFuazsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBkaW0gPSBpbmRpY2VzRGF0YVtpICogc2xpY2VSYW5rICsgal07XG4gICAgICAgICAgICBpbmRleC5wdXNoKGRpbSk7XG4gICAgICAgICAgICBmbGF0dGVuSW5kZXggKz0gZGltICogc3RyaWRlc1tqXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmxhdHRlbkluZGV4IDwgMCB8fCBmbGF0dGVuSW5kZXggPj0gb3V0cHV0U2l6ZSAvIHNsaWNlU2l6ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGluZGljZXM6ICR7aW5kZXh9IGRvZXMgbm90IGluZGV4IGludG8gJHtzaGFwZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHNsaWNlU2l6ZTsgaysrKSB7XG4gICAgICAgICAgICBpZiAoc3VtRHVwZUluZGljZXMpIHtcbiAgICAgICAgICAgICAgICBvdXRCdWYudmFsdWVzW2ZsYXR0ZW5JbmRleCAqIHNsaWNlU2l6ZSArIGtdICs9XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZXNEYXRhW2kgKiBzbGljZVNpemUgKyBrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG91dEJ1Zi52YWx1ZXNbZmxhdHRlbkluZGV4ICogc2xpY2VTaXplICsga10gPSB1cGRhdGVzLnJhbmsgPT09IDAgP1xuICAgICAgICAgICAgICAgICAgICB1cGRhdGVzRGF0YVswXSA6XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZXNEYXRhW2kgKiBzbGljZVNpemUgKyBrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0QnVmO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2NhdHRlcl9pbXBsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFNlbGVjdCwgdXBjYXN0VHlwZSwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBjb25kaXRpb24sIHQsIGUgfSA9IGlucHV0cztcbiAgICBhc3NlcnROb3RDb21wbGV4KFtjb25kaXRpb24sIHQsIGVdLCAnc2VsZWN0Jyk7XG4gICAgY29uc3QgY29uZGl0aW9uUmFuayA9IGNvbmRpdGlvbi5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgdmFsdWVzID0gYmFja2VuZC5kYXRhLmdldChjb25kaXRpb24uZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgdFZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQodC5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBlVmFsdWVzID0gYmFja2VuZC5kYXRhLmdldChlLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHJlc3VsdER0eXBlID0gdXBjYXN0VHlwZSh0LmR0eXBlLCBlLmR0eXBlKTtcbiAgICBjb25zdCBuZXdWYWx1ZXMgPSB1dGlsLm1ha2VaZXJvc1R5cGVkQXJyYXkodXRpbC5zaXplRnJvbVNoYXBlKHQuc2hhcGUpLCByZXN1bHREdHlwZSk7XG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICBjb25zdCBvZmZzZXQgPSBjb25kaXRpb25SYW5rID09PSAwIHx8IGNvbmRpdGlvblJhbmsgPiAxIHx8IHQuc2hhcGUubGVuZ3RoID09PSAxID9cbiAgICAgICAgMSA6XG4gICAgICAgIHV0aWwuc2l6ZUZyb21TaGFwZSh0LnNoYXBlLnNsaWNlKDEpKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG9mZnNldDsgaisrKSB7XG4gICAgICAgICAgICBpZiAodmFsdWVzW2ldID09PSAxKSB7XG4gICAgICAgICAgICAgICAgbmV3VmFsdWVzW2luZGV4KytdID0gdFZhbHVlc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG5ld1ZhbHVlc1tpbmRleCsrXSA9IGVWYWx1ZXNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8odC5zaGFwZSwgcmVzdWx0RHR5cGUsIG5ld1ZhbHVlcyk7XG59XG5leHBvcnQgY29uc3Qgc2VsZWN0Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNlbGVjdCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogc2VsZWN0XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2VsZWN0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIFNlbHUgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuY29uc3Qgc2NhbGVBbHBoYSA9IGJhY2tlbmRfdXRpbC5TRUxVX1NDQUxFQUxQSEE7XG5jb25zdCBzY2FsZSA9IGJhY2tlbmRfdXRpbC5TRUxVX1NDQUxFO1xuZXhwb3J0IGNvbnN0IHNlbHUgPSB1bmFyeUtlcm5lbEZ1bmMoU2VsdSwgKHhpKSA9PiB7XG4gICAgaWYgKHhpID49IDApIHtcbiAgICAgICAgcmV0dXJuIHNjYWxlICogeGk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gc2NhbGVBbHBoYSAqIChNYXRoLmV4cCh4aSkgLSAxKTtcbiAgICB9XG59KTtcbmV4cG9ydCBjb25zdCBzZWx1Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNlbHUsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHNlbHUsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2VsdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU2lnbW9pZCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3Qgc2lnbW9pZCA9IHVuYXJ5S2VybmVsRnVuYyhTaWdtb2lkLCAoeGkpID0+IDEgLyAoMSArIE1hdGguZXhwKC14aSkpKTtcbmV4cG9ydCBjb25zdCBzaWdtb2lkQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNpZ21vaWQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHNpZ21vaWQsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2lnbW9pZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU2lnbiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3Qgc2lnbiA9IHVuYXJ5S2VybmVsRnVuYyhTaWduLCAoeGkpID0+IHtcbiAgICBpZiAoeGkgPCAwKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgZWxzZSBpZiAoeGkgPiAwKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxufSk7XG5leHBvcnQgY29uc3Qgc2lnbkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTaWduLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBzaWduLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNpZ24uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFNpbiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3Qgc2luID0gdW5hcnlLZXJuZWxGdW5jKFNpbiwgKHhpKSA9PiBNYXRoLnNpbih4aSkpO1xuZXhwb3J0IGNvbnN0IHNpbkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTaW4sXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHNpbixcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TaW4uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFNpbmggfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IHNpbmggPSB1bmFyeUtlcm5lbEZ1bmMoU2luaCwgKHhpKSA9PiBNYXRoLnNpbmgoeGkpKTtcbmV4cG9ydCBjb25zdCBzaW5oQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNpbmgsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHNpbmgsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2luaC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIGJ1ZmZlciwgU2xpY2UsIHNsaWNlX3V0aWwsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBzbGljZUltcGwodmFscywgYmVnaW4sIHNpemUsIHNoYXBlLCBkdHlwZSkge1xuICAgIGNvbnN0IGlzQ29udGlub3VzID0gc2xpY2VfdXRpbC5pc1NsaWNlQ29udGlub3VzKHNoYXBlLCBiZWdpbiwgc2l6ZSk7XG4gICAgY29uc3QgbGVuZ3RoID0gdXRpbC5zaXplRnJvbVNoYXBlKHNpemUpO1xuICAgIGNvbnN0IHhTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhzaGFwZSk7XG4gICAgaWYgKGlzQ29udGlub3VzKSB7XG4gICAgICAgIGNvbnN0IGZsYXRPZmZzZXQgPSBzbGljZV91dGlsLmNvbXB1dGVGbGF0T2Zmc2V0KGJlZ2luLCB4U3RyaWRlcyk7XG4gICAgICAgIGlmIChkdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWxzLnNsaWNlKGZsYXRPZmZzZXQsIGZsYXRPZmZzZXQgKyBsZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWxzLnN1YmFycmF5KGZsYXRPZmZzZXQsIGZsYXRPZmZzZXQgKyBsZW5ndGgpO1xuICAgIH1cbiAgICBjb25zdCBkZWNvZGVkRGF0YSA9IGR0eXBlID09PSAnc3RyaW5nJyA/XG4gICAgICAgIGJhY2tlbmRfdXRpbC5mcm9tVWludDhUb1N0cmluZ0FycmF5KHZhbHMpIDpcbiAgICAgICAgdmFscztcbiAgICBjb25zdCBpbkJ1ZiA9IGJ1ZmZlcihzaGFwZSwgZHR5cGUsIGRlY29kZWREYXRhKTtcbiAgICBjb25zdCBvdXRCdWYgPSBidWZmZXIoc2l6ZSwgZHR5cGUpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0QnVmLnNpemU7ICsraSkge1xuICAgICAgICBjb25zdCBvdXRMb2MgPSBvdXRCdWYuaW5kZXhUb0xvYyhpKTtcbiAgICAgICAgY29uc3QgaW5Mb2MgPSBvdXRMb2MubWFwKChpZHgsIGopID0+IGlkeCArIGJlZ2luW2pdKTtcbiAgICAgICAgb3V0QnVmLnNldChpbkJ1Zi5nZXQoLi4uaW5Mb2MpLCAuLi5vdXRMb2MpO1xuICAgIH1cbiAgICBpZiAoZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBiYWNrZW5kX3V0aWwuZnJvbVN0cmluZ0FycmF5VG9VaW50OChvdXRCdWYudmFsdWVzKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dEJ1Zi52YWx1ZXM7XG59XG5leHBvcnQgZnVuY3Rpb24gc2xpY2UoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGJlZ2luLCBzaXplIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KHgsICdzbGljZScpO1xuICAgIGNvbnN0IFskYmVnaW4sICRzaXplXSA9IHNsaWNlX3V0aWwucGFyc2VTbGljZVBhcmFtcyh4LCBiZWdpbiwgc2l6ZSk7XG4gICAgc2xpY2VfdXRpbC5hc3NlcnRQYXJhbXNWYWxpZCh4LCAkYmVnaW4sICRzaXplKTtcbiAgICBjb25zdCB2YWxzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IG91dFZhbHMgPSBzbGljZUltcGwodmFscywgJGJlZ2luLCAkc2l6ZSwgeC5zaGFwZSwgeC5kdHlwZSk7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oJHNpemUsIHguZHR5cGUsIG91dFZhbHMpO1xufVxuZXhwb3J0IGNvbnN0IHNsaWNlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNsaWNlLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBzbGljZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNsaWNlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgU29mdG1heCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBleHAgfSBmcm9tICcuL0V4cCc7XG5pbXBvcnQgeyBtYXggfSBmcm9tICcuL01heCc7XG5pbXBvcnQgeyBkaXYgfSBmcm9tICcuL1JlYWxEaXYnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQgeyBzdWIgfSBmcm9tICcuL1N1Yic7XG5pbXBvcnQgeyBzdW0gfSBmcm9tICcuL1N1bSc7XG5leHBvcnQgZnVuY3Rpb24gc29mdG1heChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgbG9naXRzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBkaW0gfSA9IGF0dHJzO1xuICAgIGNvbnN0IGxvZ2l0c1JhbmsgPSBsb2dpdHMuc2hhcGUubGVuZ3RoO1xuICAgIGxldCAkZGltID0gZGltO1xuICAgIGlmICgkZGltID09PSAtMSkge1xuICAgICAgICAkZGltID0gbG9naXRzUmFuayAtIDE7XG4gICAgfVxuICAgIGlmICgkZGltICE9PSBsb2dpdHNSYW5rIC0gMSkge1xuICAgICAgICB0aHJvdyBFcnJvcignU29mdG1heCBhbG9uZyBhIG5vbi1sYXN0IGRpbWVuc2lvbiBpcyBub3QgeWV0IHN1cHBvcnRlZC4gJyArXG4gICAgICAgICAgICBgTG9naXRzIHdhcyByYW5rICR7bG9naXRzUmFua30gYW5kIGRpbSB3YXMgJHskZGltfWApO1xuICAgIH1cbiAgICBjb25zdCBheGVzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShbJGRpbV0sIGxvZ2l0cy5zaGFwZSk7XG4gICAgY29uc3QgbWF4TG9naXQgPSBtYXgoe1xuICAgICAgICBpbnB1dHM6IHsgeDogbG9naXRzIH0sXG4gICAgICAgIGJhY2tlbmQsXG4gICAgICAgIGF0dHJzOiB7IHJlZHVjdGlvbkluZGljZXM6IGF4ZXMsIGtlZXBEaW1zOiBmYWxzZSB9XG4gICAgfSk7XG4gICAgY29uc3QgZXhwYW5kZWRTaGFwZSA9IGJhY2tlbmRfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbShtYXhMb2dpdC5zaGFwZSwgYXhlcyk7XG4gICAgY29uc3QgbWF4TG9naXRSZXNoYXBlZCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogbWF4TG9naXQgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IGV4cGFuZGVkU2hhcGUgfSB9KTtcbiAgICBjb25zdCBhID0gc3ViKHsgaW5wdXRzOiB7IGE6IGxvZ2l0cywgYjogbWF4TG9naXRSZXNoYXBlZCB9LCBiYWNrZW5kIH0pO1xuICAgIGNvbnN0IGIgPSBleHAoeyBpbnB1dHM6IHsgeDogYSB9LCBiYWNrZW5kIH0pO1xuICAgIGNvbnN0IHN1bUV4cCA9IHN1bSh7IGlucHV0czogeyB4OiBiIH0sIGJhY2tlbmQsIGF0dHJzOiB7IGF4aXM6IGF4ZXMsIGtlZXBEaW1zOiBmYWxzZSB9IH0pO1xuICAgIGNvbnN0IHN1bVJlc2hhcGVkID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiBzdW1FeHAgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IGV4cGFuZGVkU2hhcGUgfSB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBkaXYoeyBpbnB1dHM6IHsgYTogYiwgYjogc3VtUmVzaGFwZWQgfSwgYmFja2VuZCB9KTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG1heExvZ2l0KTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG1heExvZ2l0UmVzaGFwZWQpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oYSk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhiKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHN1bUV4cCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhzdW1SZXNoYXBlZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBjb25zdCBzb2Z0bWF4Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNvZnRtYXgsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHNvZnRtYXhcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Tb2Z0bWF4LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTb2Z0cGx1cyB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG4vLyBtaXJyb3JzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0Zi5ubi5zb2Z0cGx1czogaHR0cHM6Ly9nb28uZ2wvdmtjdndYXG4vLyBlcHNpbG9uIGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gMS4wIGFuZCB0aGUgbmV4dCByZXByZXNlbnRhYmxlIGZsb2F0LlxuLy8gRm9yIGEgc2luZ2xlIHByZWNpc2lvbiAzMiBiaXQgZmxvYXQgdGhpcyBzaG91bGQgYmUgMl4tMjMsIHNlZTpcbi8vIGh0dHBzOi8vbWF0aC5ieXUuZWR1L35zY2hvdy93b3JrL0lFRUVGbG9hdGluZ1BvaW50Lmh0bVxuY29uc3QgZXBzaWxvbiA9IDEuMTkyMDkyODk1NTA3ODEyNWUtNztcbmNvbnN0IHRocmVzaG9sZCA9IE1hdGgubG9nKGVwc2lsb24pICsgMi4wO1xuZXhwb3J0IGNvbnN0IHNvZnRwbHVzID0gdW5hcnlLZXJuZWxGdW5jKFNvZnRwbHVzLCAoeGkpID0+IHtcbiAgICAvLyBWYWx1ZSBhYm92ZSB3aGljaCBleHAoeCkgbWF5IG92ZXJmbG93LCBidXQgc29mdHBsdXMoeCkgPT0geFxuICAgIC8vIGlzIHdpdGhpbiBtYWNoaW5lIGVwc2lsb24uXG4gICAgY29uc3QgdG9vTGFyZ2UgPSB4aSA+IC10aHJlc2hvbGQ7XG4gICAgLy8gVmFsdWUgYmVsb3cgd2hpY2ggZXhwKHgpIG1heSB1bmRlcmZsb3csIGJ1dCBzb2Z0cGx1cyh4KSA9PSBleHAoeClcbiAgICAvLyBpcyB3aXRoaW4gbWFjaGluZSBlcHNpbG9uLlxuICAgIGNvbnN0IHRvb1NtYWxsID0geGkgPCB0aHJlc2hvbGQ7XG4gICAgY29uc3QgZXhwWCA9IE1hdGguZXhwKHhpKTtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGlmICh0b29TbWFsbCkge1xuICAgICAgICByZXN1bHQgPSBleHBYO1xuICAgIH1cbiAgICBlbHNlIGlmICh0b29MYXJnZSkge1xuICAgICAgICByZXN1bHQgPSB4aTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IE1hdGgubG9nKDEuMCArIGV4cFgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufSk7XG5leHBvcnQgY29uc3Qgc29mdHBsdXNDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU29mdHBsdXMsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHNvZnRwbHVzLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNvZnRwbHVzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgU3BhY2VUb0JhdGNoTkQsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7IHBhZFYyQ29uZmlnIH0gZnJvbSAnLi9QYWRWMic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7IHRyYW5zcG9zZSB9IGZyb20gJy4vVHJhbnNwb3NlJztcbmV4cG9ydCBmdW5jdGlvbiBzcGFjZVRvQmF0Y2hORChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYmxvY2tTaGFwZSwgcGFkZGluZ3MgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoW3hdLCAnc3BhY2VUb0JhdGNoTkQnKTtcbiAgICBjb25zdCBwcm9kID0gdXRpbC5zaXplRnJvbVNoYXBlKGJsb2NrU2hhcGUpO1xuICAgIGNvbnN0IGNvbXBsZXRlUGFkZGluZ3MgPSBbWzAsIDBdXTtcbiAgICBjb21wbGV0ZVBhZGRpbmdzLnB1c2goLi4ucGFkZGluZ3MpO1xuICAgIGZvciAobGV0IGkgPSAxICsgYmxvY2tTaGFwZS5sZW5ndGg7IGkgPCB4LnNoYXBlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbXBsZXRlUGFkZGluZ3MucHVzaChbMCwgMF0pO1xuICAgIH1cbiAgICBjb25zdCBwYWRkZWRYID0gcGFkVjJDb25maWcua2VybmVsRnVuYyh7XG4gICAgICAgIGlucHV0czogeyB4IH0sXG4gICAgICAgIGJhY2tlbmQsXG4gICAgICAgIGF0dHJzOiB7IHBhZGRpbmdzOiBjb21wbGV0ZVBhZGRpbmdzLCBjb25zdGFudFZhbHVlOiAwIH1cbiAgICB9KTtcbiAgICBjb25zdCByZXNoYXBlZFBhZGRlZFNoYXBlID0gYmFja2VuZF91dGlsLmdldFJlc2hhcGVkKHBhZGRlZFguc2hhcGUsIGJsb2NrU2hhcGUsIHByb2QsIGZhbHNlKTtcbiAgICBjb25zdCBwZXJtdXRlZFJlc2hhcGVkUGFkZGVkUGVybXV0YXRpb24gPSBiYWNrZW5kX3V0aWwuZ2V0UGVybXV0ZWQocmVzaGFwZWRQYWRkZWRTaGFwZS5sZW5ndGgsIGJsb2NrU2hhcGUubGVuZ3RoLCBmYWxzZSk7XG4gICAgY29uc3QgZmxhdHRlblNoYXBlID0gYmFja2VuZF91dGlsLmdldFJlc2hhcGVkUGVybXV0ZWQocGFkZGVkWC5zaGFwZSwgYmxvY2tTaGFwZSwgcHJvZCwgZmFsc2UpO1xuICAgIGNvbnN0IHJlc2hhcGVJbnB1dHMgPSB7IHg6IHBhZGRlZFggfTtcbiAgICBjb25zdCByZXNoYXBlQXR0cnMgPSB7IHNoYXBlOiByZXNoYXBlZFBhZGRlZFNoYXBlIH07XG4gICAgY29uc3QgcGFkZGVkWFJlc2hhcGVkID0gcmVzaGFwZSh7IGlucHV0czogcmVzaGFwZUlucHV0cywgYmFja2VuZCwgYXR0cnM6IHJlc2hhcGVBdHRycyB9KTtcbiAgICBjb25zdCB0cmFuc3Bvc2VJbnB1dHMgPSB7IHg6IHBhZGRlZFhSZXNoYXBlZCB9O1xuICAgIGNvbnN0IHRyYW5zcG9zZUF0dHJzID0geyBwZXJtOiBwZXJtdXRlZFJlc2hhcGVkUGFkZGVkUGVybXV0YXRpb24gfTtcbiAgICBjb25zdCBwYWRkZWRYVCA9IHRyYW5zcG9zZSh7IGlucHV0czogdHJhbnNwb3NlSW5wdXRzLCBiYWNrZW5kLCBhdHRyczogdHJhbnNwb3NlQXR0cnMgfSk7XG4gICAgY29uc3QgcmVzdWx0UmVzaGFwZUlucHV0cyA9IHsgeDogcGFkZGVkWFQgfTtcbiAgICBjb25zdCByZXN1bHRSZXNoYXBlQXR0cnMgPSB7IHNoYXBlOiBmbGF0dGVuU2hhcGUgfTtcbiAgICBjb25zdCByZXN1bHQgPSByZXNoYXBlKHsgaW5wdXRzOiByZXN1bHRSZXNoYXBlSW5wdXRzLCBiYWNrZW5kLCBhdHRyczogcmVzdWx0UmVzaGFwZUF0dHJzIH0pO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocGFkZGVkWCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhwYWRkZWRYUmVzaGFwZWQpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocGFkZGVkWFQpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgY29uc3Qgc3BhY2VUb0JhdGNoTkRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU3BhY2VUb0JhdGNoTkQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHNwYWNlVG9CYXRjaE5EXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3BhY2VUb0JhdGNoTkQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3BhcnNlRmlsbEVtcHR5Um93cyB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBzcGFyc2VGaWxsRW1wdHlSb3dzSW1wbCB9IGZyb20gJy4vU3BhcnNlRmlsbEVtcHR5Um93c19pbXBsJztcbmV4cG9ydCBmdW5jdGlvbiBzcGFyc2VGaWxsRW1wdHlSb3dzKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IGluZGljZXMsIHZhbHVlcywgZGVuc2VTaGFwZSwgZGVmYXVsdFZhbHVlIH0gPSBpbnB1dHM7XG4gICAgaWYgKGRlbnNlU2hhcGUuc2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRGVuc2Ugc2hhcGUgbXVzdCBiZSBhIHZlY3Rvciwgc2F3OlxuICAgICAgICAke2RlbnNlU2hhcGUuc2hhcGV9YCk7XG4gICAgfVxuICAgIGlmIChpbmRpY2VzLnNoYXBlLmxlbmd0aCAhPT0gMikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluZGljZXMgbXVzdCBiZSBhIG1hdHJpeCwgc2F3OlxuICAgICAgICAke2luZGljZXMuc2hhcGV9YCk7XG4gICAgfVxuICAgIGlmICh2YWx1ZXMuc2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVmFsdWVzIG11c3QgYmUgYSB2ZWN0b3IsIHNhdzpcbiAgICAgICAgJHt2YWx1ZXMuc2hhcGV9YCk7XG4gICAgfVxuICAgIGlmIChkZWZhdWx0VmFsdWUuc2hhcGUubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRGVmYXVsdCB2YWx1ZSBtdXN0IGJlIGEgc2NhbGFyLCBzYXc6XG4gICAgICAgICR7ZGVmYXVsdFZhbHVlLnNoYXBlfWApO1xuICAgIH1cbiAgICBjb25zdCAkaW5kaWNlcyA9IGJhY2tlbmQuZGF0YS5nZXQoaW5kaWNlcy5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCAkdmFsdWVzID0gYmFja2VuZC5kYXRhLmdldCh2YWx1ZXMuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgJGRlbnNlU2hhcGUgPSBiYWNrZW5kLmRhdGEuZ2V0KGRlbnNlU2hhcGUuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgJGRlZmF1bHRWYWx1ZSA9IGJhY2tlbmQuZGF0YS5nZXQoZGVmYXVsdFZhbHVlLmRhdGFJZCkudmFsdWVzWzBdO1xuICAgIGNvbnN0IFtvdXRwdXRJbmRpY2VzLCBvdXRwdXRJbmRpY2VzU2hhcGUsIG91dHB1dFZhbHVlcywgZW1wdHlSb3dJbmRpY2F0b3IsIHJldmVyc2VJbmRleE1hcF0gPSBzcGFyc2VGaWxsRW1wdHlSb3dzSW1wbCgkaW5kaWNlcywgaW5kaWNlcy5zaGFwZSwgaW5kaWNlcy5kdHlwZSwgJHZhbHVlcywgdmFsdWVzLmR0eXBlLCAkZGVuc2VTaGFwZSwgJGRlZmF1bHRWYWx1ZSk7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRwdXRJbmRpY2VzU2hhcGUsIGluZGljZXMuZHR5cGUsIG91dHB1dEluZGljZXMpLFxuICAgICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtvdXRwdXRJbmRpY2VzU2hhcGVbMF1dLCB2YWx1ZXMuZHR5cGUsIG91dHB1dFZhbHVlcyksXG4gICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW2VtcHR5Um93SW5kaWNhdG9yLmxlbmd0aF0sICdib29sJywgbmV3IFVpbnQ4QXJyYXkoZW1wdHlSb3dJbmRpY2F0b3IubWFwKCh2YWx1ZSkgPT4gTnVtYmVyKHZhbHVlKSkpKSxcbiAgICAgICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbcmV2ZXJzZUluZGV4TWFwLmxlbmd0aF0sIGluZGljZXMuZHR5cGUsIG5ldyBJbnQzMkFycmF5KHJldmVyc2VJbmRleE1hcCkpLFxuICAgIF07XG59XG5leHBvcnQgY29uc3Qgc3BhcnNlRmlsbEVtcHR5Um93c0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTcGFyc2VGaWxsRW1wdHlSb3dzLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBzcGFyc2VGaWxsRW1wdHlSb3dzLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNwYXJzZUZpbGxFbXB0eVJvd3MuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgZnVuY3Rpb24gc3BhcnNlRmlsbEVtcHR5Um93c0ltcGwoaW5kaWNlcywgaW5kaWNlc1NoYXBlLCBpbmRpY2VzRFR5cGUsIHZhbHVlcywgdmFsdWVzRFR5cGUsIGRlbnNlU2hhcGUsIGRlZmF1bHRWYWx1ZSkge1xuICAgIGNvbnN0IGluZGljZXNDb3VudCA9IGluZGljZXNTaGFwZVswXTtcbiAgICBjb25zdCBkZW5zZVJvd3MgPSBkZW5zZVNoYXBlWzBdO1xuICAgIGNvbnN0IGVtcHR5Um93SW5kaWNhdG9yID0gbmV3IEFycmF5KGRlbnNlUm93cyk7XG4gICAgY29uc3QgcmV2ZXJzZUluZGV4TWFwID0gbmV3IEFycmF5KGluZGljZXNDb3VudCk7XG4gICAgY29uc3QgcmFuayA9IGluZGljZXNTaGFwZVsxXTtcbiAgICBpZiAoZGVuc2VSb3dzID09PSAwKSB7XG4gICAgICAgIGlmIChpbmRpY2VzQ291bnQgIT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgU3BhcnNlVGVuc29yIHdpdGggZGVuc2VTaGFwZVswXSA9IDAgYnV0XG4gICAgICAgICBpbmRpY2VzLnNoYXBlWzBdID0gJHtpbmRpY2VzQ291bnR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3V0cHV0SW5kaWNlcyA9IHV0aWwuZ2V0QXJyYXlGcm9tRFR5cGUoaW5kaWNlc0RUeXBlLCAwKTtcbiAgICAgICAgY29uc3Qgb3V0cHV0VmFsdWVzID0gdXRpbC5nZXRBcnJheUZyb21EVHlwZSh2YWx1ZXNEVHlwZSwgMCk7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBvdXRwdXRJbmRpY2VzLCBbMCwgcmFua10sIG91dHB1dFZhbHVlcywgZW1wdHlSb3dJbmRpY2F0b3IsIHJldmVyc2VJbmRleE1hcFxuICAgICAgICBdO1xuICAgIH1cbiAgICBsZXQgcm93c0FyZU9yZGVyZWQgPSB0cnVlO1xuICAgIGxldCBsYXN0SW5kaWNlc1JvdyA9IDA7XG4gICAgY29uc3QgY3NyT2Zmc2V0ID0gbmV3IEFycmF5KGRlbnNlUm93cykuZmlsbCgwKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGljZXNDb3VudDsgKytpKSB7XG4gICAgICAgIC8vIGluZGljZXMgaXMgYSAyZCB0ZW5zb3Igd2l0aCBzaGFwZSBvZiBbTiwgcmFua11cbiAgICAgICAgY29uc3Qgcm93ID0gaW5kaWNlc1tpICogcmFua107XG4gICAgICAgIGlmIChyb3cgPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGluZGljZXMoJHtpfSwgMCkgaXMgaW52YWxpZDogJHtyb3d9IDwgMGApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyb3cgPj0gZGVuc2VSb3dzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGluZGljZXMoJHtpfSwgMCkgaXMgaW52YWxpZDogJHtyb3d9ID49ICR7ZGVuc2VSb3dzfWApO1xuICAgICAgICB9XG4gICAgICAgICsrY3NyT2Zmc2V0W3Jvd107XG4gICAgICAgIHJvd3NBcmVPcmRlcmVkID0gcm93c0FyZU9yZGVyZWQgJiYgKHJvdyA+PSBsYXN0SW5kaWNlc1Jvdyk7XG4gICAgICAgIGxhc3RJbmRpY2VzUm93ID0gcm93O1xuICAgIH1cbiAgICBsZXQgYWxsUm93c0Z1bGwgPSB0cnVlO1xuICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGRlbnNlUm93czsgKytyb3cpIHtcbiAgICAgICAgLy8gY3NyT2Zmc2V0IGhlcmUgZGVzY3JpYmVzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBkZW5zZSByb3dcbiAgICAgICAgY29uc3Qgcm93RW1wdHkgPSAoY3NyT2Zmc2V0W3Jvd10gPT09IDApO1xuICAgICAgICBlbXB0eVJvd0luZGljYXRvcltyb3ddID0gcm93RW1wdHk7XG4gICAgICAgIGFsbFJvd3NGdWxsID0gYWxsUm93c0Z1bGwgJiYgIXJvd0VtcHR5O1xuICAgICAgICAvLyBJbiBmaWxsZWQgdmVyc2lvbiwgZWFjaCByb3cgaGFzIGF0IGxlYXN0IG9uZSBlbGVtZW50LlxuICAgICAgICBjc3JPZmZzZXRbcm93XSA9IE1hdGgubWF4KGNzck9mZnNldFtyb3ddLCAxKTtcbiAgICAgICAgLy8gVXBkYXRlIGNzck9mZnNldCB0byByZXByZXNlbnQgdGhlIG51bWJlciBvZiBlbGVtZW50cyB1cCB0byBhbmRcbiAgICAgICAgLy8gaW5jbHVkaW5nIGRlbnNlUm93cyArIDE6XG4gICAgICAgIC8vICBjc3JPZmZzZXRbMF0gPT0gI3tlbGVtZW50cyBvZiByb3cgMH1cbiAgICAgICAgLy8gIGNzck9mZnNldFsxXSA9PSAje2VsZW1lbnRzIG9mIHJvdyAxfSArICN7ZWxlbWVudHMgb2Ygcm93IDB9XG4gICAgICAgIC8vICAuLlxuICAgICAgICAvLyAgY3NyT2Zmc2V0W2ldID09IHN0YXJ0aW5nIGluZGV4IGZvciBlbGVtZW50cyBpbiByb3cgaSArIDEuXG4gICAgICAgIGlmIChyb3cgPiAwKSB7XG4gICAgICAgICAgICBjc3JPZmZzZXRbcm93XSArPSBjc3JPZmZzZXRbcm93IC0gMV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFsbFJvd3NGdWxsICYmIHJvd3NBcmVPcmRlcmVkKSB7XG4gICAgICAgIGNvbnN0IG91dHB1dEluZGljZXMgPSBpbmRpY2VzO1xuICAgICAgICBjb25zdCBvdXRwdXRWYWx1ZXMgPSB2YWx1ZXM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kaWNlc0NvdW50OyArK2kpIHtcbiAgICAgICAgICAgIHJldmVyc2VJbmRleE1hcFtpXSA9IGk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIG91dHB1dEluZGljZXMsIFtpbmRpY2VzQ291bnQsIHJhbmtdLCBvdXRwdXRWYWx1ZXMsIGVtcHR5Um93SW5kaWNhdG9yLFxuICAgICAgICAgICAgcmV2ZXJzZUluZGV4TWFwXG4gICAgICAgIF07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBmdWxsSW5kaWNlc0NvdW50ID0gY3NyT2Zmc2V0W2RlbnNlUm93cyAtIDFdO1xuICAgICAgICBjb25zdCBvdXRwdXRJbmRpY2VzID0gdXRpbC5nZXRBcnJheUZyb21EVHlwZShpbmRpY2VzRFR5cGUsIGZ1bGxJbmRpY2VzQ291bnQgKiByYW5rKTtcbiAgICAgICAgY29uc3Qgb3V0cHV0VmFsdWVzID0gdXRpbC5nZXRBcnJheUZyb21EVHlwZSh2YWx1ZXNEVHlwZSwgZnVsbEluZGljZXNDb3VudCk7XG4gICAgICAgIGNvbnN0IGZpbGxlZENvdW50ID0gbmV3IEFycmF5KGRlbnNlUm93cykuZmlsbCgwKTtcbiAgICAgICAgLy8gRmlsbCBpbiB2YWx1ZXMgZm9yIHJvd3MgdGhhdCBhcmUgbm90IG1pc3NpbmdcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmRpY2VzQ291bnQ7ICsraSkge1xuICAgICAgICAgICAgLy8gaW5kaWNlcyBpcyBhIDJkIHRlbnNvciB3aXRoIHNoYXBlIG9mIFtOLCByYW5rXVxuICAgICAgICAgICAgY29uc3Qgcm93ID0gaW5kaWNlc1tpICogcmFua107XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBmaWxsZWRDb3VudFtyb3ddO1xuICAgICAgICAgICAgY29uc3Qgb3V0cHV0SSA9ICgocm93ID09PSAwKSA/IDAgOiBjc3JPZmZzZXRbcm93IC0gMV0pICsgb2Zmc2V0O1xuICAgICAgICAgICAgZmlsbGVkQ291bnRbcm93XSsrOyAvLyBJbmNyZW1lbnQgdGhlIGZpbGxlZCBjb3VudCBmb3IgdGhpcyByb3cuXG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJhbms7ICsraikge1xuICAgICAgICAgICAgICAgIC8vIGluZGljZXMgYW5kIG91dHB1dEluZGljZXMgYXJlIDJkIHRlbnNvcnMgd2l0aCBzaGFwZSBvZiBbTiwgcmFua11cbiAgICAgICAgICAgICAgICBvdXRwdXRJbmRpY2VzW291dHB1dEkgKiByYW5rICsgal0gPSBpbmRpY2VzW2kgKiByYW5rICsgal07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXRwdXRWYWx1ZXNbb3V0cHV0SV0gPSB2YWx1ZXNbaV07XG4gICAgICAgICAgICAvLyBXZSdsbCBuZWVkIHRoaXMgcmV2ZXJzZSBpbmRleCBtYXAgdG8gYmFja3Byb3AgY29ycmVjdGx5LlxuICAgICAgICAgICAgcmV2ZXJzZUluZGV4TWFwW2ldID0gb3V0cHV0STtcbiAgICAgICAgfVxuICAgICAgICAvLyBGaWxsIGluIHZhbHVlcyBmb3Igcm93cyB0aGF0IGFyZSBtaXNzaW5nXG4gICAgICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGRlbnNlUm93czsgKytyb3cpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvd0NvdW50ID0gZmlsbGVkQ291bnRbcm93XTtcbiAgICAgICAgICAgIGlmIChyb3dDb3VudCA9PT0gMCkgeyAvLyBXZSBoYXZlbid0IGZpbGxlZCB0aGlzIHJvd1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0aW5nSW5kZXggPSAocm93ID09PSAwKSA/IDAgOiBjc3JPZmZzZXRbcm93IC0gMV07XG4gICAgICAgICAgICAgICAgLy8gUmVtYWluaW5nIGluZGV4IHZhbHVlcyB3ZXJlIHNldCB0byB6ZXJvIGFscmVhZHkuXG4gICAgICAgICAgICAgICAgLy8gSnVzdCBuZWVkIHRvIHNldCB0aGUgcm93IGluZGV4IGluIHRoZSByaWdodCBsb2NhdGlvbi5cbiAgICAgICAgICAgICAgICAvLyBvdXRwdXRJbmRpY2VzIGlzIGEgMmQgdGVuc29yIHdpdGggc2hhcGUgb2YgW04sIHJhbmtdXG4gICAgICAgICAgICAgICAgb3V0cHV0SW5kaWNlc1tzdGFydGluZ0luZGV4ICogcmFuayArIDBdID0gcm93O1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGNvbCA9IDE7IGNvbCA8IHJhbms7ICsrY29sKSB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dEluZGljZXNbc3RhcnRpbmdJbmRleCAqIHJhbmsgKyBjb2xdID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3V0cHV0VmFsdWVzW3N0YXJ0aW5nSW5kZXhdID0gZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBvdXRwdXRJbmRpY2VzLCBbZnVsbEluZGljZXNDb3VudCwgcmFua10sIG91dHB1dFZhbHVlcywgZW1wdHlSb3dJbmRpY2F0b3IsXG4gICAgICAgICAgICByZXZlcnNlSW5kZXhNYXBcbiAgICAgICAgXTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TcGFyc2VGaWxsRW1wdHlSb3dzX2ltcGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3BhcnNlUmVzaGFwZSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBzcGFyc2VSZXNoYXBlSW1wbCB9IGZyb20gJy4vU3BhcnNlUmVzaGFwZV9pbXBsJztcbmV4cG9ydCBmdW5jdGlvbiBzcGFyc2VSZXNoYXBlKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IGlucHV0SW5kaWNlcywgaW5wdXRTaGFwZSwgbmV3U2hhcGUgfSA9IGlucHV0cztcbiAgICBpZiAoaW5wdXRJbmRpY2VzLnNoYXBlLmxlbmd0aCAhPT0gMikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYElucHV0IGluZGljZXMgc2hvdWxkIGJlIGEgbWF0cml4IGJ1dCByZWNlaXZlZCBzaGFwZVxuICAgICAgICAke2lucHV0SW5kaWNlcy5zaGFwZX1gKTtcbiAgICB9XG4gICAgaWYgKGlucHV0U2hhcGUuc2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW5wdXQgc2hhcGUgc2hvdWxkIGJlIGEgdmVjdG9yIGJ1dCByZWNlaXZlZCBzaGFwZVxuICAgICAgICAke2lucHV0U2hhcGUuc2hhcGV9YCk7XG4gICAgfVxuICAgIGlmIChuZXdTaGFwZS5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYXJnZXQgc2hhcGUgc2hvdWxkIGJlIGEgdmVjdG9yIGJ1dCByZWNlaXZlZCBzaGFwZSAke25ld1NoYXBlLnNoYXBlfWApO1xuICAgIH1cbiAgICBjb25zdCAkaW5wdXRTaGFwZSA9IEFycmF5LmZyb20oYmFja2VuZC5kYXRhLmdldChpbnB1dFNoYXBlLmRhdGFJZCkudmFsdWVzKTtcbiAgICBjb25zdCAkaW5wdXRJbmRpY2VzID0gYmFja2VuZC5kYXRhLmdldChpbnB1dEluZGljZXMuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgdGFyZ2V0U2hhcGUgPSBBcnJheS5mcm9tKGJhY2tlbmQuZGF0YS5nZXQobmV3U2hhcGUuZGF0YUlkKS52YWx1ZXMpO1xuICAgIGNvbnN0IFtuZXdJbmRpY2VzLCBpbmRpY2VzU2hhcGUsIG91dHB1dFNoYXBlXSA9IHNwYXJzZVJlc2hhcGVJbXBsKCRpbnB1dEluZGljZXMsIGlucHV0SW5kaWNlcy5zaGFwZSwgaW5wdXRJbmRpY2VzLmR0eXBlLCAkaW5wdXRTaGFwZSwgdGFyZ2V0U2hhcGUpO1xuICAgIHJldHVybiBbXG4gICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oaW5kaWNlc1NoYXBlLCBpbnB1dEluZGljZXMuZHR5cGUsIG5ld0luZGljZXMpLFxuICAgICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtvdXRwdXRTaGFwZS5sZW5ndGhdLCBuZXdTaGFwZS5kdHlwZSwgbmV3IEludDMyQXJyYXkob3V0cHV0U2hhcGUpKSxcbiAgICBdO1xufVxuZXhwb3J0IGNvbnN0IHNwYXJzZVJlc2hhcGVDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU3BhcnNlUmVzaGFwZSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogc3BhcnNlUmVzaGFwZSxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TcGFyc2VSZXNoYXBlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIHNwYXJzZVJlc2hhcGVJbXBsKGlucHV0SW5kaWNlcywgaW5wdXRJbmRpY2VzU2hhcGUsIGlucHV0RFR5cGUsIGlucHV0U2hhcGUsIHRhcmdldFNoYXBlKSB7XG4gICAgY29uc3QgZGVuc2VTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKGlucHV0U2hhcGUpO1xuICAgIGNvbnN0IG5ueiA9IGlucHV0SW5kaWNlc1NoYXBlWzBdO1xuICAgIGNvbnN0IG91dHB1dFJhbmsgPSB0YXJnZXRTaGFwZS5sZW5ndGg7XG4gICAgLy8gQ29tcHV0ZSB0aGUgb3V0cHV0IHNoYXBlLiBEZXRlcm1pbmUgcHJvZHVjdCBvZiBzcGVjaWZpZWQgZGltZW5zaW9ucywgYW5kXG4gICAgLy8gZmluZCB0aGUgaW5kZXggb2YgdGhlIHVuc3BlY2lmaWVkIG9uZS5cbiAgICBjb25zdCBvdXRwdXRTaGFwZSA9IFtdO1xuICAgIGxldCBwcm9kdWN0ID0gMTtcbiAgICBsZXQgdW5rbm93bkluZGV4ID0gLTE7XG4gICAgZm9yIChsZXQgZCA9IDA7IGQgPCBvdXRwdXRSYW5rOyArK2QpIHtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRhcmdldFNoYXBlW2RdO1xuICAgICAgICBpZiAoc2l6ZSA9PT0gLTEpIHtcbiAgICAgICAgICAgIGlmICh1bmtub3duSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBvbmx5IG9uZSBvdXRwdXQgZGltZW5zaW9uIG1heSBiZSAtMSwgbm90IGJvdGggJHt1bmtub3duSW5kZXh9IGFuZCAke2R9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1bmtub3duSW5kZXggPSBkO1xuICAgICAgICAgICAgb3V0cHV0U2hhcGUucHVzaCgxKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChzaXplIDwgMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgc2l6ZSAke2R9IG11c3QgYmUgbm9uLW5lZ2F0aXZlLCBub3QgJHtzaXplfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJvZHVjdCAqPSBzaXplO1xuICAgICAgICAgICAgb3V0cHV0U2hhcGUucHVzaChzaXplKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAodW5rbm93bkluZGV4ICE9PSAtMSkge1xuICAgICAgICBpZiAocHJvZHVjdCA8PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Jlc2hhcGUgY2Fubm90IGluZmVyIHRoZSBtaXNzaW5nICcgK1xuICAgICAgICAgICAgICAgICdpbnB1dCBzaXplIGZvciBhbiBlbXB0eSB0ZW5zb3IgdW5sZXNzIGFsbCAnICtcbiAgICAgICAgICAgICAgICAnc3BlY2lmaWVkIGlucHV0IHNpemVzIGFyZSBub24temVybycpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1pc3NpbmcgPSBNYXRoLnRydW5jKGRlbnNlU2l6ZSAvIHByb2R1Y3QpO1xuICAgICAgICBpZiAocHJvZHVjdCAqIG1pc3NpbmcgIT09IGRlbnNlU2l6ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnB1dCB0byByZXNoYXBlIGlzIGEgU3BhcnNlVGVuc29yIHdpdGggJHtkZW5zZVNpemV9XG4gICAgICAgICAgZGVuc2UgdmFsdWVzLCBidXQgdGhlIHJlcXVlc3RlZCBzaGFwZSByZXF1aXJlcyBhIG11bHRpcGxlIG9mICR7cHJvZHVjdH0uIGlucHV0U2hhcGU9JHtpbnB1dFNoYXBlfSBvdXRwdXRTaGFwZT0gJHtvdXRwdXRTaGFwZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBvdXRwdXRTaGFwZVt1bmtub3duSW5kZXhdID0gbWlzc2luZztcbiAgICB9XG4gICAgY29uc3Qgb3V0cHV0U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShvdXRwdXRTaGFwZSk7XG4gICAgaWYgKG91dHB1dFNpemUgIT09IGRlbnNlU2l6ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYElucHV0IHRvIHJlc2hhcGUgaXMgYSB0ZW5zb3Igd2l0aCAke2RlbnNlU2l6ZX0gZGVuc2UgdmFsdWVzLCBidXQgdGhlIHJlcXVlc3RlZCBzaGFwZSBoYXMgJHtvdXRwdXRTaXplfS4gaW5wdXRTaGFwZT0ke2lucHV0U2hhcGV9IG91dHB1dFNoYXBlPSR7b3V0cHV0U2hhcGV9YCk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0UmFuayA9IGlucHV0U2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IGlucHV0U3RyaWRlcyA9IFtdO1xuICAgIGlmIChpbnB1dFJhbmsgPiAwKSB7XG4gICAgICAgIGlucHV0U3RyaWRlc1tpbnB1dFJhbmsgLSAxXSA9IDE7XG4gICAgICAgIGZvciAobGV0IGQgPSBpbnB1dFJhbmsgLSAyOyBkID49IDA7IC0tZCkge1xuICAgICAgICAgICAgaW5wdXRTdHJpZGVzW2RdID0gaW5wdXRTdHJpZGVzW2QgKyAxXSAqIGlucHV0U2hhcGVbZCArIDFdO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG91dHB1dFN0cmlkZXMgPSBbXTtcbiAgICBpZiAob3V0cHV0UmFuayA+IDApIHtcbiAgICAgICAgb3V0cHV0U3RyaWRlc1tvdXRwdXRSYW5rIC0gMV0gPSAxO1xuICAgICAgICBmb3IgKGxldCBkID0gb3V0cHV0UmFuayAtIDI7IGQgPj0gMDsgLS1kKSB7XG4gICAgICAgICAgICBvdXRwdXRTdHJpZGVzW2RdID0gb3V0cHV0U3RyaWRlc1tkICsgMV0gKiBvdXRwdXRTaGFwZVtkICsgMV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbmV3SW5kaWNlcyA9IHV0aWwuZ2V0QXJyYXlGcm9tRFR5cGUoaW5wdXREVHlwZSwgbm56ICogb3V0cHV0UmFuayk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBubno7ICsraSkge1xuICAgICAgICBsZXQgaWQgPSAwO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGlucHV0UmFuazsgKytqKSB7XG4gICAgICAgICAgICAvLyBpbnB1dEluZGljZXMgaXMgYSAyZCB0ZW5zb3Igd2l0aCBzaGFwZSBvZiBbbm56LCBpbnB1dFJhbmtdXG4gICAgICAgICAgICBpZCArPSBpbnB1dEluZGljZXNbaSAqIGlucHV0UmFuayArIGpdICogaW5wdXRTdHJpZGVzW2pdO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgb3V0cHV0UmFuazsgKytqKSB7XG4gICAgICAgICAgICAvLyBuZXdJbmRpY2VzIGlzIGEgMmQgdGVuc29yIHdpdGggc2hhcGUgb2YgW25ueiwgb3V0cHV0UmFua11cbiAgICAgICAgICAgIG5ld0luZGljZXNbaSAqIG91dHB1dFJhbmsgKyBqXSA9IE1hdGgudHJ1bmMoaWQgLyBvdXRwdXRTdHJpZGVzW2pdKTtcbiAgICAgICAgICAgIGlkICU9IG91dHB1dFN0cmlkZXNbal07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFtuZXdJbmRpY2VzLCBbbm56LCBvdXRwdXRSYW5rXSwgb3V0cHV0U2hhcGVdO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3BhcnNlUmVzaGFwZV9pbXBsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFNwYXJzZVNlZ21lbnRNZWFuIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHNwYXJzZVNlZ21lbnRSZWR1Y3Rpb25JbXBsIH0gZnJvbSAnLi9TcGFyc2VTZWdtZW50UmVkdWN0aW9uX2ltcGwnO1xuZXhwb3J0IGZ1bmN0aW9uIHNwYXJzZVNlZ21lbnRNZWFuKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IGRhdGEsIGluZGljZXMsIHNlZ21lbnRJZHMgfSA9IGlucHV0cztcbiAgICBpZiAoZGF0YS5zaGFwZS5sZW5ndGggPCAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRGF0YSBzaG91bGQgYmUgYXQgbGVhc3QgMSBkaW1lbnNpb25hbCBidXQgcmVjZWl2ZWQgc2NhbGFyYCk7XG4gICAgfVxuICAgIGlmIChpbmRpY2VzLnNoYXBlLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluZGljZXMgc2hvdWxkIGJlIGEgdmVjdG9yIGJ1dCByZWNlaXZlZCBzaGFwZVxuICAgICAgICAgICR7aW5kaWNlcy5zaGFwZX1gKTtcbiAgICB9XG4gICAgaWYgKHNlZ21lbnRJZHMuc2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU2VnbWVudCBpZHMgc2hvdWxkIGJlIGEgdmVjdG9yIGJ1dCByZWNlaXZlZCBzaGFwZVxuICAgICAgICAgICR7c2VnbWVudElkcy5zaGFwZX1gKTtcbiAgICB9XG4gICAgY29uc3QgJGRhdGEgPSBiYWNrZW5kLmRhdGEuZ2V0KGRhdGEuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgJGluZGljZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGluZGljZXMuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgJHNlZ21lbnRJZHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHNlZ21lbnRJZHMuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgW291dHB1dERhdGEsIG91dHB1dERhdGFTaGFwZV0gPSBzcGFyc2VTZWdtZW50UmVkdWN0aW9uSW1wbCgkZGF0YSwgZGF0YS5zaGFwZSwgZGF0YS5kdHlwZSwgJGluZGljZXMsICRzZWdtZW50SWRzLCB0cnVlKTtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRwdXREYXRhU2hhcGUsIGRhdGEuZHR5cGUsIG91dHB1dERhdGEpO1xufVxuZXhwb3J0IGNvbnN0IHNwYXJzZVNlZ21lbnRNZWFuQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNwYXJzZVNlZ21lbnRNZWFuLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBzcGFyc2VTZWdtZW50TWVhbixcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TcGFyc2VTZWdtZW50TWVhbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiBzcGFyc2VTZWdtZW50UmVkdWN0aW9uSW1wbChpbnB1dCwgaW5wdXRTaGFwZSwgaW5wdXREVHlwZSwgaW5kaWNlcywgc2VnbWVudElkcywgaXNNZWFuID0gZmFsc2UsIGRlZmF1bHRWYWx1ZSA9IDApIHtcbiAgICBjb25zdCBudW1JbmRpY2VzID0gaW5kaWNlcy5sZW5ndGg7XG4gICAgaWYgKG51bUluZGljZXMgIT09IHNlZ21lbnRJZHMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgc2VnbWVudElkcyBhbmQgaW5kaWNlcyBzaG91bGQgaGF2ZSBzYW1lIHNpemUuYCk7XG4gICAgfVxuICAgIC8vIEZsYXR0ZW4gdGhlIGFycmF5IHRvIHR3byBkaW1lbnNpb25zXG4gICAgY29uc3QgaW5wdXRGbGF0ID0gW2lucHV0U2hhcGVbMF0sIGlucHV0Lmxlbmd0aCAvIGlucHV0U2hhcGVbMF1dO1xuICAgIGNvbnN0IG51bUNvbCA9IGlucHV0RmxhdFsxXTtcbiAgICAvLyBOb3RlIHRoYXQgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gYXNzdW1lcyB0aGF0IHNlZ21lbnRJZHMgdmFsdWVzIGFyZVxuICAgIC8vIHNvcnRlZC5cbiAgICBjb25zdCBsYXN0U2VnbWVudElkUGx1c09uZSA9IG51bUluZGljZXMgPiAwID8gc2VnbWVudElkc1tudW1JbmRpY2VzIC0gMV0gKyAxIDogMDtcbiAgICBjb25zdCBvdXRwdXRSb3dzID0gbGFzdFNlZ21lbnRJZFBsdXNPbmU7XG4gICAgaWYgKG91dHB1dFJvd3MgPCAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgc2VnbWVudCBpZHMgbXVzdCBiZSA+PSAwYCk7XG4gICAgfVxuICAgIGNvbnN0IG91dHB1dFNoYXBlID0gaW5wdXRTaGFwZS5zbGljZSgpO1xuICAgIG91dHB1dFNoYXBlWzBdID0gb3V0cHV0Um93cztcbiAgICBjb25zdCBvdXRwdXRMZW5ndGggPSBvdXRwdXRTaGFwZS5yZWR1Y2UoKHByb2R1Y3QsIHZhbHVlKSA9PiBwcm9kdWN0ICogdmFsdWUsIDEpO1xuICAgIC8vIE91dHB1dCBhcnJheSBpcyBpbml0aWFsaXplZCB3aXRoIHRoZSB2YWx1ZSAwIGJ5IGRlZmF1bHQuXG4gICAgY29uc3Qgb3V0cHV0ID0gdXRpbC5nZXRBcnJheUZyb21EVHlwZShpbnB1dERUeXBlLCBvdXRwdXRMZW5ndGgpO1xuICAgIC8vIE5vdGUgdGhhdCB3ZSBkbyBub3QgaW5pdGlhbGl6ZSB0aGUgb3V0cHV0IGJ1ZmZlciB3aXRoIGEgZGVmYXVsdCB2YWx1ZSwgc29cbiAgICAvLyB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgc2V0IG1pc3NpbmcgaW5kaWNlcyB0byB0aGUgZGVmYXVsdCB2YWx1ZS5cbiAgICBpZiAobnVtSW5kaWNlcyA9PT0gMCkge1xuICAgICAgICBpZiAob3V0cHV0Um93cyA+IDApIHtcbiAgICAgICAgICAgIG91dHB1dC5maWxsKGRlZmF1bHRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtvdXRwdXQsIG91dHB1dFNoYXBlXTtcbiAgICB9XG4gICAgaWYgKG91dHB1dFJvd3MgPD0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHNlZ21lbnQgaWRzIG11c3QgYmUgPj0gMGApO1xuICAgIH1cbiAgICBsZXQgc3RhcnQgPSAwLCBlbmQgPSAxO1xuICAgIC8vIEluZGV4IGZyb20gd2hpY2ggdGhlIG91dHB1dCBpcyBub3QgaW5pdGlhbGl6ZWQuXG4gICAgbGV0IHVuaW5pdGlhbGl6ZWRJbmRleCA9IDA7XG4gICAgbGV0IG91dEluZGV4ID0gc2VnbWVudElkc1tzdGFydF07XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgLy8gV2UgaW5pdGlhbGl6ZSBuZXh0SW5kZXggdG8gMCB0byBhdm9pZCBtYXkgYmUgdW5pbml0aWFsaXplZCB3YXJuaW5nXG4gICAgICAgIGxldCBuZXh0SW5kZXggPSAwO1xuICAgICAgICBpZiAoZW5kIDwgbnVtSW5kaWNlcykge1xuICAgICAgICAgICAgbmV4dEluZGV4ID0gc2VnbWVudElkc1tlbmRdO1xuICAgICAgICAgICAgaWYgKG91dEluZGV4ID09PSBuZXh0SW5kZXgpIHtcbiAgICAgICAgICAgICAgICArK2VuZDtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFdlIGhhdmUgYSBuZXcgc2VnbWVudCBoZXJlLiAgVmVyaWZ5IHRoYXQgdGhlIHNlZ21lbnQgaWRzIGFyZSBncm93aW5nLlxuICAgICAgICAgICAgaWYgKG91dEluZGV4ID49IG5leHRJbmRleCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgc2VnbWVudCBpZHMgYXJlIG5vdCBpbmNyZWFzaW5nYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG91dEluZGV4IDwgMCB8fCBvdXRJbmRleCA+PSBvdXRwdXRSb3dzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNlZ21lbnQgaWQgJHtvdXRJbmRleH0gb3V0IG9mIHJhbmdlIFswLCAke291dHB1dFJvd3N9KSwgcG9zc2libHkgYmVjYXVzZSBzZWdtZW50SWRzIGlucHV0IGlzIG5vdCBzb3J0ZWQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBnYXAgYmV0d2VlbiB0d28gaW5kaWNlcywgd2UgbmVlZCB0byBzZXQgdGhhdCBnYXAgdG8gdGhlXG4gICAgICAgIC8vIGRlZmF1bHQgdmFsdWUuXG4gICAgICAgIGlmIChvdXRJbmRleCA+IHVuaW5pdGlhbGl6ZWRJbmRleCkge1xuICAgICAgICAgICAgb3V0cHV0LmZpbGwoZGVmYXVsdFZhbHVlLCB1bmluaXRpYWxpemVkSW5kZXggKiBudW1Db2wsIG91dEluZGV4ICogbnVtQ29sKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBpbmRpY2VzW2ldO1xuICAgICAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBpbnB1dEZsYXRbMF0pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJhZDogaW5kaWNlc1ske2l9XSA9PSAke2luZGljZXNbaV19IG91dCBvZiByYW5nZSBbMCwgJHtpbnB1dEZsYXRbMF19KWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBudW1Db2w7IGorKykge1xuICAgICAgICAgICAgICAgIG91dHB1dFtvdXRJbmRleCAqIG51bUNvbCArIGpdICs9IGlucHV0W2luZGV4ICogbnVtQ29sICsgal07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzTWVhbikge1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBudW1Db2w7IGorKykge1xuICAgICAgICAgICAgICAgIG91dHB1dFtvdXRJbmRleCAqIG51bUNvbCArIGpdIC89IGVuZCAtIHN0YXJ0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN0YXJ0ID0gZW5kO1xuICAgICAgICArK2VuZDtcbiAgICAgICAgdW5pbml0aWFsaXplZEluZGV4ID0gb3V0SW5kZXggKyAxO1xuICAgICAgICBvdXRJbmRleCA9IG5leHRJbmRleDtcbiAgICAgICAgaWYgKGVuZCA+IG51bUluZGljZXMpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEZpbGwgdGhlIGdhcCBhdCB0aGUgZW5kIHdpdGggdGhlIGRlZmF1bHQgdmFsdWUuXG4gICAgaWYgKHVuaW5pdGlhbGl6ZWRJbmRleCA8IG91dHB1dFJvd3MpIHtcbiAgICAgICAgb3V0cHV0LmZpbGwoZGVmYXVsdFZhbHVlLCB1bmluaXRpYWxpemVkSW5kZXggKiBudW1Db2wsIG91dHB1dFJvd3MgKiBudW1Db2wpO1xuICAgIH1cbiAgICByZXR1cm4gW291dHB1dCwgb3V0cHV0U2hhcGVdO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3BhcnNlU2VnbWVudFJlZHVjdGlvbl9pbXBsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFNwYXJzZVNlZ21lbnRTdW0gfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgc3BhcnNlU2VnbWVudFJlZHVjdGlvbkltcGwgfSBmcm9tICcuL1NwYXJzZVNlZ21lbnRSZWR1Y3Rpb25faW1wbCc7XG5leHBvcnQgZnVuY3Rpb24gc3BhcnNlU2VnbWVudFN1bShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBkYXRhLCBpbmRpY2VzLCBzZWdtZW50SWRzIH0gPSBpbnB1dHM7XG4gICAgaWYgKGRhdGEuc2hhcGUubGVuZ3RoIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERhdGEgc2hvdWxkIGJlIGF0IGxlYXN0IDEgZGltZW5zaW9uYWwgYnV0IHJlY2VpdmVkIHNjYWxhcmApO1xuICAgIH1cbiAgICBpZiAoaW5kaWNlcy5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbmRpY2VzIHNob3VsZCBiZSBhIHZlY3RvciBidXQgcmVjZWl2ZWQgc2hhcGVcbiAgICAgICAgICR7aW5kaWNlcy5zaGFwZX1gKTtcbiAgICB9XG4gICAgaWYgKHNlZ21lbnRJZHMuc2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU2VnbWVudCBpZHMgc2hvdWxkIGJlIGEgdmVjdG9yIGJ1dCByZWNlaXZlZCBzaGFwZVxuICAgICAgICAgJHtzZWdtZW50SWRzLnNoYXBlfWApO1xuICAgIH1cbiAgICBjb25zdCAkZGF0YSA9IGJhY2tlbmQuZGF0YS5nZXQoZGF0YS5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCAkaW5kaWNlcyA9IGJhY2tlbmQuZGF0YS5nZXQoaW5kaWNlcy5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCAkc2VnbWVudElkcyA9IGJhY2tlbmQuZGF0YS5nZXQoc2VnbWVudElkcy5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBbb3V0cHV0RGF0YSwgb3V0cHV0RGF0YVNoYXBlXSA9IHNwYXJzZVNlZ21lbnRSZWR1Y3Rpb25JbXBsKCRkYXRhLCBkYXRhLnNoYXBlLCBkYXRhLmR0eXBlLCAkaW5kaWNlcywgJHNlZ21lbnRJZHMpO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dHB1dERhdGFTaGFwZSwgZGF0YS5kdHlwZSwgb3V0cHV0RGF0YSk7XG59XG5leHBvcnQgY29uc3Qgc3BhcnNlU2VnbWVudFN1bUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTcGFyc2VTZWdtZW50U3VtLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBzcGFyc2VTZWdtZW50U3VtLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNwYXJzZVNlZ21lbnRTdW0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBTcGFyc2VUb0RlbnNlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHNjYXR0ZXJJbXBsIH0gZnJvbSAnLi9TY2F0dGVyX2ltcGwnO1xuZXhwb3J0IGZ1bmN0aW9uIHNwYXJzZVRvRGVuc2UoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHNwYXJzZUluZGljZXMsIHNwYXJzZVZhbHVlcywgZGVmYXVsdFZhbHVlIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBvdXRwdXRTaGFwZSB9ID0gYXR0cnM7XG4gICAgY29uc3QgeyBzbGljZVJhbmssIG51bVVwZGF0ZXMsIHNsaWNlU2l6ZSwgc3RyaWRlcywgb3V0cHV0U2l6ZSB9ID0gYmFja2VuZF91dGlsLmNhbGN1bGF0ZVNoYXBlcyhzcGFyc2VWYWx1ZXMsIHNwYXJzZUluZGljZXMsIG91dHB1dFNoYXBlKTtcbiAgICBjb25zdCBzdW1EdXBlSW5kaWNlcyA9IGZhbHNlO1xuICAgIGNvbnN0IGluZGljZXNCdWYgPSBiYWNrZW5kLmJ1ZmZlclN5bmMoc3BhcnNlSW5kaWNlcyk7XG4gICAgY29uc3QgdXBkYXRlc0J1ZiA9IGJhY2tlbmQuYnVmZmVyU3luYyhzcGFyc2VWYWx1ZXMpO1xuICAgIGNvbnN0ICRkZWZhdWx0VmFsdWUgPSBiYWNrZW5kLmRhdGEuZ2V0KGRlZmF1bHRWYWx1ZS5kYXRhSWQpLnZhbHVlc1swXTtcbiAgICBjb25zdCBvdXRCdWYgPSBzY2F0dGVySW1wbChpbmRpY2VzQnVmLCB1cGRhdGVzQnVmLCBvdXRwdXRTaGFwZSwgb3V0cHV0U2l6ZSwgc2xpY2VTaXplLCBudW1VcGRhdGVzLCBzbGljZVJhbmssIHN0cmlkZXMsICRkZWZhdWx0VmFsdWUsIHN1bUR1cGVJbmRpY2VzKTtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRwdXRTaGFwZSwgb3V0QnVmLmR0eXBlLCBvdXRCdWYudmFsdWVzKTtcbn1cbmV4cG9ydCBjb25zdCBzcGFyc2VUb0RlbnNlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNwYXJzZVRvRGVuc2UsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHNwYXJzZVRvRGVuc2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TcGFyc2VUb0RlbnNlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBTcGxpdFYsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgc2xpY2UgfSBmcm9tICcuL1NsaWNlJztcbmV4cG9ydCBmdW5jdGlvbiBzcGxpdFYoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IG51bU9yU2l6ZVNwbGl0cywgYXhpcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgJGF4aXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpWzBdO1xuICAgIGNvbnN0IHNwbGl0U2l6ZXMgPSBiYWNrZW5kX3V0aWwucHJlcGFyZVNwbGl0U2l6ZSh4LCBudW1PclNpemVTcGxpdHMsICRheGlzKTtcbiAgICBjb25zdCBiZWdpbiA9IG5ldyBBcnJheSh4LnNoYXBlLmxlbmd0aCkuZmlsbCgwKTtcbiAgICBjb25zdCBzaXplID0geC5zaGFwZS5zbGljZSgpO1xuICAgIHJldHVybiBzcGxpdFNpemVzLm1hcChzID0+IHtcbiAgICAgICAgY29uc3Qgc2xpY2VTaXplID0gWy4uLnNpemVdO1xuICAgICAgICBzbGljZVNpemVbJGF4aXNdID0gcztcbiAgICAgICAgY29uc3Qgc2xpY2VUID0gc2xpY2UoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kLCBhdHRyczogeyBiZWdpbiwgc2l6ZTogc2xpY2VTaXplIH0gfSk7XG4gICAgICAgIGJlZ2luWyRheGlzXSArPSBzO1xuICAgICAgICByZXR1cm4gc2xpY2VUO1xuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IHNwbGl0VkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTcGxpdFYsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHNwbGl0VlxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNwbGl0Vi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3FydCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3Qgc3FydCA9IHVuYXJ5S2VybmVsRnVuYyhTcXJ0LCAoeGkpID0+IE1hdGguc3FydCh4aSkpO1xuZXhwb3J0IGNvbnN0IHNxcnRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU3FydCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogc3FydCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TcXJ0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFNxdWFyZSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGNvbnN0IHNxdWFyZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTcXVhcmUsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6ICh7IGlucHV0cywgYmFja2VuZCB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgICAgICBjb25zdCBjcHVCYWNrZW5kID0gYmFja2VuZDtcbiAgICAgICAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnc3F1YXJlJyk7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcztcbiAgICAgICAgY29uc3QgbmV3VmFsdWVzID0gbmV3IEZsb2F0MzJBcnJheSh2YWx1ZXMubGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVzW2ldO1xuICAgICAgICAgICAgbmV3VmFsdWVzW2ldID0gdmFsdWUgKiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRhSWQgPSBjcHVCYWNrZW5kLndyaXRlKG5ld1ZhbHVlcywgeC5zaGFwZSwgeC5kdHlwZSk7XG4gICAgICAgIHJldHVybiB7IGRhdGFJZCwgc2hhcGU6IHguc2hhcGUsIGR0eXBlOiB4LmR0eXBlIH07XG4gICAgfVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNxdWFyZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTcXVhcmVkRGlmZmVyZW5jZSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X2ltcGwnO1xuaW1wb3J0IHsgYmluYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV91dGlscyc7XG5leHBvcnQgY29uc3Qgc3F1YXJlZERpZmZlcmVuY2VJbXBsID0gY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoKGEsIGIpID0+IHtcbiAgICBjb25zdCBkaWZmID0gYSAtIGI7XG4gICAgcmV0dXJuIGRpZmYgKiBkaWZmO1xufSkpO1xuZXhwb3J0IGNvbnN0IHNxdWFyZWREaWZmZXJlbmNlID0gYmluYXJ5S2VybmVsRnVuYyhTcXVhcmVkRGlmZmVyZW5jZSwgc3F1YXJlZERpZmZlcmVuY2VJbXBsKTtcbmV4cG9ydCBjb25zdCBzcXVhcmVkRGlmZmVyZW5jZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTcXVhcmVkRGlmZmVyZW5jZSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogc3F1YXJlZERpZmZlcmVuY2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TcXVhcmVkRGlmZmVyZW5jZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3RlcCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3Qgc3RlcCA9IHVuYXJ5S2VybmVsRnVuYyhTdGVwLCAoeGksIGF0dHJzKSA9PiB7XG4gICAgY29uc3Qgc3RlcEF0dHJzID0gYXR0cnM7XG4gICAgaWYgKGlzTmFOKHhpKSkge1xuICAgICAgICByZXR1cm4gTmFOO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHhpID4gMCA/IDEgOiBzdGVwQXR0cnMuYWxwaGE7XG4gICAgfVxufSk7XG5leHBvcnQgY29uc3Qgc3RlcENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTdGVwLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBzdGVwLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN0ZXAuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgc2xpY2VfdXRpbCwgU3RyaWRlZFNsaWNlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7IHNsaWNlIH0gZnJvbSAnLi9TbGljZSc7XG5pbXBvcnQgeyBzdHJpZGVkU2xpY2VJbXBsIH0gZnJvbSAnLi9TdHJpZGVkU2xpY2VfaW1wbCc7XG5leHBvcnQgZnVuY3Rpb24gc3RyaWRlZFNsaWNlKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBiZWdpbiwgZW5kLCBzdHJpZGVzLCBiZWdpbk1hc2ssIGVuZE1hc2ssIGVsbGlwc2lzTWFzaywgbmV3QXhpc01hc2ssIHNocmlua0F4aXNNYXNrIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KHgsICdzdHJpZGVkU2xpY2UnKTtcbiAgICBjb25zdCB7IG5vblN0cmlkZWQsICRiZWdpbiwgJHN0cmlkZXMsIHNpemUsIG5ld1NoYXBlLCBvdXRTaGFwZSB9ID0gc2xpY2VfdXRpbC5zbGljZUluZm8oeC5zaGFwZSwgYmVnaW4sIGVuZCwgc3RyaWRlcywgYmVnaW5NYXNrLCBlbmRNYXNrLCBlbGxpcHNpc01hc2ssIG5ld0F4aXNNYXNrLCBzaHJpbmtBeGlzTWFzayk7XG4gICAgY29uc3QgJHggPSByZXNoYXBlKHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IG5ld1NoYXBlIH0gfSk7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBpZiAobm9uU3RyaWRlZCkge1xuICAgICAgICBjb25zdCBzbGljZWQgPSBzbGljZSh7IGlucHV0czogeyB4OiAkeCB9LCBiYWNrZW5kLCBhdHRyczogeyBiZWdpbjogJGJlZ2luLCBzaXplIH0gfSk7XG4gICAgICAgIHJlc3VsdCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogc2xpY2VkIH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBvdXRTaGFwZSB9IH0pO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHNsaWNlZCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKG91dFNoYXBlLnNvbWUoYXhpcyA9PiBheGlzID09PSAwKSkge1xuICAgICAgICByZXN1bHQgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dFNoYXBlLCB4LmR0eXBlLCBbXSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCB4QnVmID0gYmFja2VuZC5idWZmZXJTeW5jKCR4KTtcbiAgICAgICAgY29uc3Qgb3V0QnVmID0gc3RyaWRlZFNsaWNlSW1wbChvdXRTaGFwZSwgeEJ1ZiwgJHN0cmlkZXMsICRiZWdpbik7XG4gICAgICAgIHJlc3VsdCA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0QnVmLnNoYXBlLCBvdXRCdWYuZHR5cGUsIG91dEJ1Zi52YWx1ZXMpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHRSZXNoYXBlZCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogcmVzdWx0IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBvdXRTaGFwZSB9IH0pO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oJHgpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0UmVzaGFwZWQ7XG59XG5leHBvcnQgY29uc3Qgc3RyaWRlZFNsaWNlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFN0cmlkZWRTbGljZSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogc3RyaWRlZFNsaWNlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3RyaWRlZFNsaWNlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJ1ZmZlciB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgZnVuY3Rpb24gc3RyaWRlZFNsaWNlSW1wbChvdXRTaGFwZSwgeEJ1Ziwgc3RyaWRlcywgYmVnaW4pIHtcbiAgICBjb25zdCBvdXRCdWYgPSBidWZmZXIob3V0U2hhcGUsIHhCdWYuZHR5cGUpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0QnVmLnNpemU7IGkrKykge1xuICAgICAgICBjb25zdCBsb2MgPSBvdXRCdWYuaW5kZXhUb0xvYyhpKTtcbiAgICAgICAgY29uc3QgbmV3TG9jID0gbmV3IEFycmF5KGxvYy5sZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG5ld0xvYy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgbmV3TG9jW2pdID0gbG9jW2pdICogc3RyaWRlc1tqXSArIGJlZ2luW2pdO1xuICAgICAgICB9XG4gICAgICAgIG91dEJ1Zi5zZXQoeEJ1Zi5nZXQoLi4ubmV3TG9jKSwgLi4ubG9jKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dEJ1Zjtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN0cmlkZWRTbGljZV9pbXBsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFN0cmluZ05HcmFtcyB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBzdHJpbmdOR3JhbXNJbXBsIH0gZnJvbSAnLi9TdHJpbmdOR3JhbXNfaW1wbCc7XG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nTkdyYW1zKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBzZXBhcmF0b3IsIG5HcmFtV2lkdGhzLCBsZWZ0UGFkLCByaWdodFBhZCwgcGFkV2lkdGgsIHByZXNlcnZlU2hvcnRTZXF1ZW5jZXMgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHsgZGF0YSwgZGF0YVNwbGl0cyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0ICRkYXRhID0gYmFja2VuZC5kYXRhLmdldChkYXRhLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0ICRkYXRhU3BsaXRzID0gYmFja2VuZC5kYXRhLmdldChkYXRhU3BsaXRzLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IFtuR3JhbXMsIG5HcmFtc1NwbGl0c10gPSBzdHJpbmdOR3JhbXNJbXBsKCRkYXRhLCAkZGF0YVNwbGl0cywgc2VwYXJhdG9yLCBuR3JhbVdpZHRocywgbGVmdFBhZCwgcmlnaHRQYWQsIHBhZFdpZHRoLCBwcmVzZXJ2ZVNob3J0U2VxdWVuY2VzKTtcbiAgICByZXR1cm4gW1xuICAgICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtuR3JhbXMubGVuZ3RoXSwgJ3N0cmluZycsIG5HcmFtcyksXG4gICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oZGF0YVNwbGl0cy5zaGFwZSwgJ2ludDMyJywgbkdyYW1zU3BsaXRzKSxcbiAgICBdO1xufVxuZXhwb3J0IGNvbnN0IHN0cmluZ05HcmFtc0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTdHJpbmdOR3JhbXMsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHN0cmluZ05HcmFtcyxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdHJpbmdOR3JhbXMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG4vKipcbiAqIFRoZSBTdHJpbmdOR3JhbXNPcCBjbGFzcyBjcmVhdGVzIG5ncmFtcyBmcm9tIHJhZ2dlZCBzdHJpbmcgZGF0YS5cbiAqIFRoZSBjb25zdHJ1Y3RvciBjb250YWlucyBhbGwgYXR0cmlidXRlcyByZWxhdGVkIHRvIHRoZSBvcGVyYXRpb24gc3VjaCBhc1xuICogcGFkZGluZyB3aWR0aHMgYW5kIHN0cmluZ3MsIGFuZCB0aGUgY29tcHV0ZSBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0b1xuICogY29tcHV0ZSB0aGUgbmdyYW1zIGZvciBkaWZmZXJlbnQgcmFnZ2VkIHRlbnNvciBpbnB1dHMuXG4gKi9cbmNsYXNzIFN0cmluZ05HcmFtc09wIHtcbiAgICBjb25zdHJ1Y3RvcihzZXBhcmF0b3IsIG5HcmFtV2lkdGhzLCBsZWZ0UGFkLCByaWdodFBhZCwgcGFkV2lkdGgsIHByZXNlcnZlU2hvcnRTZXF1ZW5jZXMpIHtcbiAgICAgICAgdGhpcy5zZXBhcmF0b3IgPSB1dGlsLmVuY29kZVN0cmluZyhzZXBhcmF0b3IpO1xuICAgICAgICB0aGlzLm5HcmFtV2lkdGhzID0gbkdyYW1XaWR0aHM7XG4gICAgICAgIHRoaXMubGVmdFBhZCA9IHV0aWwuZW5jb2RlU3RyaW5nKGxlZnRQYWQpO1xuICAgICAgICB0aGlzLnJpZ2h0UGFkID0gdXRpbC5lbmNvZGVTdHJpbmcocmlnaHRQYWQpO1xuICAgICAgICB0aGlzLnBhZFdpZHRoID0gcGFkV2lkdGg7XG4gICAgICAgIHRoaXMucHJlc2VydmVTaG9ydCA9IHByZXNlcnZlU2hvcnRTZXF1ZW5jZXM7XG4gICAgfVxuICAgIGdldFBhZFdpZHRoKG5HcmFtV2lkdGgpIHtcbiAgICAgICAgLy8gTmdyYW1zIGNhbiBiZSBwYWRkZWQgd2l0aCBlaXRoZXIgYSBmaXhlZCBwYWQgd2lkdGggb3IgYSBkeW5hbWljIHBhZFxuICAgICAgICAvLyB3aWR0aCBkZXBlbmRpbmcgb24gdGhlICdwYWRXaWR0aCcgYXJnLCBidXQgaW4gbm8gY2FzZSBzaG91bGQgdGhlIHBhZGRpbmdcbiAgICAgICAgLy8gZXZlciBiZSB3aWRlciB0aGFuICduR3JhbVdpZHRoJyAtIDEuXG4gICAgICAgIHJldHVybiBNYXRoLm1pbih0aGlzLnBhZFdpZHRoIDwgMCA/IG5HcmFtV2lkdGggLSAxIDogdGhpcy5wYWRXaWR0aCwgbkdyYW1XaWR0aCAtIDEpO1xuICAgIH1cbiAgICBnZXROdW1OR3JhbXMobGVuZ3RoLCBuR3JhbVdpZHRoKSB7XG4gICAgICAgIGNvbnN0IHBhZFdpZHRoID0gdGhpcy5nZXRQYWRXaWR0aChuR3JhbVdpZHRoKTtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsICgobGVuZ3RoICsgMiAqIHBhZFdpZHRoKSAtIG5HcmFtV2lkdGgpICsgMSk7XG4gICAgfVxuICAgIGNyZWF0ZU5HcmFtcyhkYXRhLCBzcGxpdEluZGV4LCBvdXRwdXQsIG91dHB1dFN0YXJ0SW5kZXgsIG51bU5HcmFtcywgbkdyYW1XaWR0aCkge1xuICAgICAgICBmb3IgKGxldCBuR3JhbUluZGV4ID0gMDsgbkdyYW1JbmRleCA8IG51bU5HcmFtczsgKytuR3JhbUluZGV4KSB7XG4gICAgICAgICAgICBjb25zdCBwYWRXaWR0aCA9IHRoaXMuZ2V0UGFkV2lkdGgobkdyYW1XaWR0aCk7XG4gICAgICAgICAgICBjb25zdCBsZWZ0UGFkZGluZyA9IE1hdGgubWF4KDAsIHBhZFdpZHRoIC0gbkdyYW1JbmRleCk7XG4gICAgICAgICAgICBjb25zdCByaWdodFBhZGRpbmcgPSBNYXRoLm1heCgwLCBwYWRXaWR0aCAtIChudW1OR3JhbXMgLSAobkdyYW1JbmRleCArIDEpKSk7XG4gICAgICAgICAgICBjb25zdCBudW1Ub2tlbnMgPSBuR3JhbVdpZHRoIC0gKGxlZnRQYWRkaW5nICsgcmlnaHRQYWRkaW5nKTtcbiAgICAgICAgICAgIGNvbnN0IGRhdGFTdGFydEluZGV4ID0gc3BsaXRJbmRleCArIChsZWZ0UGFkZGluZyA+IDAgPyAwIDogbkdyYW1JbmRleCAtIHBhZFdpZHRoKTtcbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgdG90YWwgZXhwZWN0ZWQgc2l6ZSBvZiB0aGUgbkdyYW0gc28gd2UgY2FuIHJlc2VydmUgdGhlXG4gICAgICAgICAgICAvLyBjb3JyZWN0IGFtb3VudCBvZiBzcGFjZSBpbiB0aGUgc3RyaW5nLlxuICAgICAgICAgICAgbGV0IG5HcmFtU2l6ZSA9IDA7XG4gICAgICAgICAgICAvLyBTaXplIG9mIHRoZSBsZWZ0IHBhZGRpbmcuXG4gICAgICAgICAgICBuR3JhbVNpemUgKz0gbGVmdFBhZGRpbmcgKiB0aGlzLmxlZnRQYWQubGVuZ3RoO1xuICAgICAgICAgICAgLy8gU2l6ZSBvZiB0aGUgdG9rZW5zLlxuICAgICAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBudW1Ub2tlbnM7ICsrbikge1xuICAgICAgICAgICAgICAgIG5HcmFtU2l6ZSArPSBkYXRhW2RhdGFTdGFydEluZGV4ICsgbl0ubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU2l6ZSBvZiB0aGUgcmlnaHQgcGFkZGluZy5cbiAgICAgICAgICAgIG5HcmFtU2l6ZSArPSByaWdodFBhZGRpbmcgKiB0aGlzLnJpZ2h0UGFkLmxlbmd0aDtcbiAgICAgICAgICAgIC8vIFNpemUgb2YgdGhlIHNlcGFyYXRvcnMuXG4gICAgICAgICAgICBjb25zdCBudW1TZXBhcmF0b3JzID0gbGVmdFBhZGRpbmcgKyByaWdodFBhZGRpbmcgKyBudW1Ub2tlbnMgLSAxO1xuICAgICAgICAgICAgbkdyYW1TaXplICs9IG51bVNlcGFyYXRvcnMgKiB0aGlzLnNlcGFyYXRvci5sZW5ndGg7XG4gICAgICAgICAgICAvLyBCdWlsZCB0aGUgbkdyYW0uXG4gICAgICAgICAgICBvdXRwdXRbb3V0cHV0U3RhcnRJbmRleCArIG5HcmFtSW5kZXhdID0gbmV3IFVpbnQ4QXJyYXkobkdyYW1TaXplKTtcbiAgICAgICAgICAgIGNvbnN0IG5HcmFtID0gb3V0cHV0W291dHB1dFN0YXJ0SW5kZXggKyBuR3JhbUluZGV4XTtcbiAgICAgICAgICAgIGxldCBuZXh0TkdyYW1JbmRleCA9IDA7XG4gICAgICAgICAgICBjb25zdCBhcHBlbmRUb05HcmFtID0gKHN0cikgPT4gc3RyLmZvckVhY2goKHZhbHVlKSA9PiBuR3JhbVtuZXh0TkdyYW1JbmRleCsrXSA9IHZhbHVlKTtcbiAgICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgbGVmdFBhZGRpbmc7ICsrbikge1xuICAgICAgICAgICAgICAgIGFwcGVuZFRvTkdyYW0odGhpcy5sZWZ0UGFkKTtcbiAgICAgICAgICAgICAgICBhcHBlbmRUb05HcmFtKHRoaXMuc2VwYXJhdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE9ubHkgb3V0cHV0IGZpcnN0IG51bVRva2VucyAtIDEgcGFpcnMgb2YgZGF0YSBhbmQgc2VwYXJhdG9yXG4gICAgICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IG51bVRva2VucyAtIDE7ICsrbikge1xuICAgICAgICAgICAgICAgIGFwcGVuZFRvTkdyYW0oZGF0YVtkYXRhU3RhcnRJbmRleCArIG5dKTtcbiAgICAgICAgICAgICAgICBhcHBlbmRUb05HcmFtKHRoaXMuc2VwYXJhdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEhhbmRsZSBjYXNlIHdoZW4gdGhlcmUgYXJlIG5vIHRva2VucyBvciBubyByaWdodCBwYWRkaW5nIGFzIHRoZXNlXG4gICAgICAgICAgICAvLyBjYW4gcmVzdWx0IGluIGNvbnNlY3V0aXZlIHNlcGFyYXRvcnMuXG4gICAgICAgICAgICBpZiAobnVtVG9rZW5zID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgdG9rZW5zLCB0aGVuIG91dHB1dCBsYXN0IGFuZCB0aGVuIHBhaXIgZWFjaCBzZXBhcmF0b3JcbiAgICAgICAgICAgICAgICAvLyB3aXRoIHRoZSByaWdodCBwYWRkaW5nIHRoYXQgZm9sbG93cywgdG8gZW5zdXJlIG5HcmFtIGVuZHMgZWl0aGVyIHdpdGhcbiAgICAgICAgICAgICAgICAvLyB0aGUgdG9rZW4gb3Igd2l0aCB0aGUgcmlnaHQgcGFkLlxuICAgICAgICAgICAgICAgIGFwcGVuZFRvTkdyYW0oZGF0YVtkYXRhU3RhcnRJbmRleCArIG51bVRva2VucyAtIDFdKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IHJpZ2h0UGFkZGluZzsgKytuKSB7XG4gICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvTkdyYW0odGhpcy5zZXBhcmF0b3IpO1xuICAgICAgICAgICAgICAgICAgICBhcHBlbmRUb05HcmFtKHRoaXMucmlnaHRQYWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgdG9rZW5zLCB0aGVuIHRoZSBsYXN0IGl0ZW0gaW5zZXJ0ZWQgaW50byB0aGUgbkdyYW1cbiAgICAgICAgICAgICAgICAvLyBoYXMgYmVlbiB0aGUgc2VwYXJhdG9yIGZyb20gdGhlIGxlZnQgcGFkZGluZyBsb29wIGFib3ZlLiBIZW5jZSxcbiAgICAgICAgICAgICAgICAvLyBvdXRwdXQgcmlnaHQgcGFkIGFuZCBzZXBhcmF0b3IgYW5kIG1ha2Ugc3VyZSB0byBmaW5pc2ggd2l0aCBhXG4gICAgICAgICAgICAgICAgLy8gcGFkZGluZywgbm90IGEgc2VwYXJhdG9yLlxuICAgICAgICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgcmlnaHRQYWRkaW5nIC0gMTsgKytuKSB7XG4gICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvTkdyYW0odGhpcy5yaWdodFBhZCk7XG4gICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvTkdyYW0odGhpcy5zZXBhcmF0b3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhcHBlbmRUb05HcmFtKHRoaXMucmlnaHRQYWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIERhdGEgYW5kIHNwbGl0cyB0b2dldGhlciBmb3JtIHRoZSBkZWZpbml0aW9uIG9mIHRoZSByYWdnZWQgdGVuc29yLFxuICAgIC8vIHdoZXJlIGRhdGEgaXMgMSBkaW1lbnNpb25hbCBhbmQgY29udGFpbnMgdGhlIHZhbHVlcyBvZiB0aGUgdGVuc29yXG4gICAgLy8gYW5kIHNwbGl0cyBkZW5vdGVzIHRoZSBpbmRpY2VzIGF0IHdoaWNoIGVhY2ggcm93IHN0YXJ0cy5cbiAgICBjb21wdXRlKGRhdGEsIHNwbGl0cykge1xuICAgICAgICAvLyBWYWxpZGF0ZSB0aGF0IHRoZSBzcGxpdHMgYXJlIHZhbGlkIGluZGljZXMgaW50byBkYXRhLCBvbmx5IGlmIHRoZXJlIGFyZVxuICAgICAgICAvLyBzcGxpdHMgc3BlY2lmaWVkLlxuICAgICAgICBjb25zdCBpbnB1dERhdGFTaXplID0gZGF0YS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHNwbGl0c1NpemUgPSBzcGxpdHMubGVuZ3RoO1xuICAgICAgICBpZiAoc3BsaXRzU2l6ZSA+IDApIHtcbiAgICAgICAgICAgIGxldCBwcmV2U3BsaXQgPSBzcGxpdHNbMF07XG4gICAgICAgICAgICBpZiAocHJldlNwbGl0ICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaXJzdCBzcGxpdCB2YWx1ZSBtdXN0IGJlIDAsIGdvdCAke3ByZXZTcGxpdH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc3BsaXRzU2l6ZTsgKytpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbGlkU3BsaXRzID0gc3BsaXRzW2ldID49IHByZXZTcGxpdDtcbiAgICAgICAgICAgICAgICB2YWxpZFNwbGl0cyA9IHZhbGlkU3BsaXRzICYmIChzcGxpdHNbaV0gPD0gaW5wdXREYXRhU2l6ZSk7XG4gICAgICAgICAgICAgICAgaWYgKCF2YWxpZFNwbGl0cykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc3BsaXQgdmFsdWUgJHtzcGxpdHNbaV19LCBtdXN0IGJlIGluIFske3ByZXZTcGxpdH0sICR7aW5wdXREYXRhU2l6ZX1dYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByZXZTcGxpdCA9IHNwbGl0c1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcmV2U3BsaXQgIT09IGlucHV0RGF0YVNpemUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExhc3Qgc3BsaXQgdmFsdWUgbXVzdCBiZSBkYXRhIHNpemUuIEV4cGVjdGVkICR7aW5wdXREYXRhU2l6ZX0sIGdvdCAke3ByZXZTcGxpdH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBudW1CYXRjaEl0ZW1zID0gc3BsaXRzU2l6ZSAtIDE7XG4gICAgICAgIGNvbnN0IG5HcmFtc1NwbGl0cyA9IHV0aWwuZ2V0QXJyYXlGcm9tRFR5cGUoJ2ludDMyJywgc3BsaXRzU2l6ZSk7XG4gICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIGRhdGEgb3Igc2l6ZSwgcmV0dXJuIGFuIGVtcHR5IHJhZ2dlZCB0ZW5zb3IuXG4gICAgICAgIGlmIChpbnB1dERhdGFTaXplID09PSAwIHx8IHNwbGl0c1NpemUgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGVtcHR5ID0gbmV3IEFycmF5KGlucHV0RGF0YVNpemUpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gbnVtQmF0Y2hJdGVtczsgKytpKSB7XG4gICAgICAgICAgICAgICAgbkdyYW1zU3BsaXRzW2ldID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbZW1wdHksIG5HcmFtc1NwbGl0c107XG4gICAgICAgIH1cbiAgICAgICAgbkdyYW1zU3BsaXRzWzBdID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gbnVtQmF0Y2hJdGVtczsgKytpKSB7XG4gICAgICAgICAgICBjb25zdCBsZW5ndGggPSBzcGxpdHNbaV0gLSBzcGxpdHNbaSAtIDFdO1xuICAgICAgICAgICAgbGV0IG51bU5HcmFtcyA9IDA7XG4gICAgICAgICAgICB0aGlzLm5HcmFtV2lkdGhzLmZvckVhY2goKG5HcmFtV2lkdGgpID0+IHtcbiAgICAgICAgICAgICAgICBudW1OR3JhbXMgKz0gdGhpcy5nZXROdW1OR3JhbXMobGVuZ3RoLCBuR3JhbVdpZHRoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHRoaXMucHJlc2VydmVTaG9ydCAmJiBsZW5ndGggPiAwICYmIG51bU5HcmFtcyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIG51bU5HcmFtcyA9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuR3JhbXNTcGxpdHNbaV0gPSBuR3JhbXNTcGxpdHNbaSAtIDFdICsgbnVtTkdyYW1zO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5HcmFtcyA9IG5ldyBBcnJheShuR3JhbXNTcGxpdHNbbnVtQmF0Y2hJdGVtc10pO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUJhdGNoSXRlbXM7ICsraSkge1xuICAgICAgICAgICAgY29uc3Qgc3BsaXRJbmRleCA9IHNwbGl0c1tpXTtcbiAgICAgICAgICAgIGxldCBvdXRwdXRTdGFydElkeCA9IG5HcmFtc1NwbGl0c1tpXTtcbiAgICAgICAgICAgIHRoaXMubkdyYW1XaWR0aHMuZm9yRWFjaCgobkdyYW1XaWR0aCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHNwbGl0c1tpICsgMV0gLSBzcGxpdHNbaV07XG4gICAgICAgICAgICAgICAgY29uc3QgbnVtTkdyYW1zID0gdGhpcy5nZXROdW1OR3JhbXMobGVuZ3RoLCBuR3JhbVdpZHRoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZU5HcmFtcyhkYXRhLCBzcGxpdEluZGV4LCBuR3JhbXMsIG91dHB1dFN0YXJ0SWR4LCBudW1OR3JhbXMsIG5HcmFtV2lkdGgpO1xuICAgICAgICAgICAgICAgIG91dHB1dFN0YXJ0SWR4ICs9IG51bU5HcmFtcztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gSWYgd2UncmUgcHJlc2VydmluZyBzaG9ydCBzZXF1ZW5jZXMsIGNoZWNrIHRvIHNlZSBpZiBubyBzZXF1ZW5jZSB3YXNcbiAgICAgICAgICAgIC8vIGdlbmVyYXRlZCBieSBjb21wYXJpbmcgdGhlIGN1cnJlbnQgb3V0cHV0IHN0YXJ0IGlkeCB0byB0aGUgb3JpZ2luYWxcbiAgICAgICAgICAgIC8vIG9uZSAobkdyYW1TcGxpdHNkYXRhKS4gSWYgbm8gbmdyYW1zIHdlcmUgZ2VuZXJhdGVkLCB0aGVuIHRoZXkgd2lsbFxuICAgICAgICAgICAgLy8gYmUgZXF1YWwgKHNpbmNlIHdlIGluY3JlbWVudCBvdXRwdXRTdGFydElkeCBieSBudW1OR3JhbXMgZXZlcnlcbiAgICAgICAgICAgIC8vIHRpbWUgd2UgY3JlYXRlIGEgc2V0IG9mIG5ncmFtcy4pXG4gICAgICAgICAgICBpZiAodGhpcy5wcmVzZXJ2ZVNob3J0ICYmIG91dHB1dFN0YXJ0SWR4ID09PSBuR3JhbXNTcGxpdHNbaV0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhTGVuZ3RoID0gc3BsaXRzW2kgKyAxXSAtIHNwbGl0c1tpXTtcbiAgICAgICAgICAgICAgICAvLyBPbmUgbGVnaXRpbWF0ZSByZWFzb24gdG8gbm90IGhhdmUgYW55IG5ncmFtcyB3aGVuIHRoaXMucHJlc2VydmVTaG9ydFxuICAgICAgICAgICAgICAgIC8vIGlzIHRydWUgaXMgaWYgdGhlIHNlcXVlbmNlIGl0c2VsZiBpcyBlbXB0eS4gSW4gdGhhdCBjYXNlLCBtb3ZlIG9uLlxuICAgICAgICAgICAgICAgIGlmIChkYXRhTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IGR5bmFtaWMgcGFkZGluZyBzaXplcyBoZXJlOiBpZiBwYWRkaW5nXG4gICAgICAgICAgICAgICAgLy8gd2FzIGR5bmFtaWMsIGV2ZXJ5IHNlcXVlbmNlIHdvdWxkIGhhdmUgaGFkIHN1ZmZpY2llbnQgcGFkZGluZyB0b1xuICAgICAgICAgICAgICAgIC8vIGdlbmVyYXRlIGF0IGxlYXN0IG9uZSBuR3JhbS5cbiAgICAgICAgICAgICAgICBjb25zdCBuR3JhbVdpZHRoID0gZGF0YUxlbmd0aCArIDIgKiB0aGlzLnBhZFdpZHRoO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bU5HcmFtcyA9IDE7XG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVOR3JhbXMoZGF0YSwgc3BsaXRJbmRleCwgbkdyYW1zLCBvdXRwdXRTdGFydElkeCwgbnVtTkdyYW1zLCBuR3JhbVdpZHRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW25HcmFtcywgbkdyYW1zU3BsaXRzXTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nTkdyYW1zSW1wbChkYXRhLCBkYXRhU3BsaXRzLCBzZXBhcmF0b3IsIG5HcmFtV2lkdGhzLCBsZWZ0UGFkLCByaWdodFBhZCwgcGFkV2lkdGgsIHByZXNlcnZlU2hvcnRTZXF1ZW5jZXMpIHtcbiAgICByZXR1cm4gbmV3IFN0cmluZ05HcmFtc09wKHNlcGFyYXRvciwgbkdyYW1XaWR0aHMsIGxlZnRQYWQsIHJpZ2h0UGFkLCBwYWRXaWR0aCwgcHJlc2VydmVTaG9ydFNlcXVlbmNlcylcbiAgICAgICAgLmNvbXB1dGUoZGF0YSwgZGF0YVNwbGl0cyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdHJpbmdOR3JhbXNfaW1wbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTdHJpbmdTcGxpdCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBzdHJpbmdTcGxpdEltcGwgfSBmcm9tICcuL1N0cmluZ1NwbGl0X2ltcGwnO1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ1NwbGl0KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBza2lwRW1wdHkgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHsgaW5wdXQsIGRlbGltaXRlciB9ID0gaW5wdXRzO1xuICAgIGlmIChpbnB1dC5kdHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnB1dCBtdXN0IGJlIG9mIGRhdGF0eXBlIHN0cmluZycpO1xuICAgIH1cbiAgICBpZiAoaW5wdXQuc2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW5wdXQgbXVzdCBiZSBhIHZlY3RvciwgZ290IHNoYXBlOiAke2lucHV0LnNoYXBlfWApO1xuICAgIH1cbiAgICBpZiAoZGVsaW1pdGVyLnNoYXBlLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERlbGltaXRlciBtdXN0IGJlIGEgc2NhbGFyLCBnb3Qgc2hhcGU6ICR7ZGVsaW1pdGVyLnNoYXBlfWApO1xuICAgIH1cbiAgICBjb25zdCAkaW5wdXQgPSBiYWNrZW5kLmRhdGEuZ2V0KGlucHV0LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0ICRkZWxpbWl0ZXIgPSBiYWNrZW5kLmRhdGEuZ2V0KGRlbGltaXRlci5kYXRhSWQpLnZhbHVlc1swXTtcbiAgICBjb25zdCBbaW5kaWNlcywgdmFsdWVzLCBzaGFwZV0gPSBzdHJpbmdTcGxpdEltcGwoJGlucHV0LCAkZGVsaW1pdGVyLCBza2lwRW1wdHkpO1xuICAgIGNvbnN0IG91dHB1dFNpemUgPSB2YWx1ZXMubGVuZ3RoO1xuICAgIHJldHVybiBbXG4gICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW291dHB1dFNpemUsIDJdLCAnaW50MzInLCBpbmRpY2VzKSxcbiAgICAgICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbb3V0cHV0U2l6ZV0sICdzdHJpbmcnLCB2YWx1ZXMpLFxuICAgICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFsyXSwgJ2ludDMyJywgbmV3IEludDMyQXJyYXkoc2hhcGUpKVxuICAgIF07XG59XG5leHBvcnQgY29uc3Qgc3RyaW5nU3BsaXRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU3RyaW5nU3BsaXQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHN0cmluZ1NwbGl0LFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN0cmluZ1NwbGl0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZnVuY3Rpb24gc3BsaXQoc3RyLCBkZWxpbWl0ZXJzLCBza2lwRW1wdHkpIHtcbiAgICBpZiAoIXN0ci5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICAvLyBXaGVuIHRoZSBkZWxpbWl0ZXIgaXMgZW1wdHksIHRoZSBpbnB1dCBpcyBzcGxpdCBpbnRvIGluZGl2aWR1YWwgY2hhcmFjdGVycy5cbiAgICBpZiAoZGVsaW1pdGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5KHN0ci5sZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgcmVzdWx0W2ldID0gc3RyLnN1YmFycmF5KGksIGkgKyAxKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvLyBXaGVuIHRoZXJlIGlzIG9uZSBkZWxpbWl0ZXIsIHRoZSBpbnB1dCBpcyBzcGxpdCBvbmx5IGF0IHRoYXQgZGVsaW1pdGVyLlxuICAgIGlmIChkZWxpbWl0ZXJzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCBkZWxpbWl0ZXIgPSBkZWxpbWl0ZXJzWzBdO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgbGV0IGYgPSBzdHIuaW5kZXhPZihkZWxpbWl0ZXIpO1xuICAgICAgICB3aGlsZSAoZiAhPT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuID0gc3RyLnN1YmFycmF5KDAsIGYpO1xuICAgICAgICAgICAgaWYgKCFza2lwRW1wdHkgfHwgdG9rZW4ubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godG9rZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RyID0gc3RyLnN1YmFycmF5KGYgKyAxKTtcbiAgICAgICAgICAgIGYgPSBzdHIuaW5kZXhPZihkZWxpbWl0ZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc2tpcEVtcHR5IHx8IHN0ci5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHN0cik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLy8gV2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgZGVsaW1pdGVycywgdGhlIGlucHV0IGlzIHNwbGl0IGF0IGV2ZXJ5IGluc3RhbmNlXG4gICAgLy8gb25lIG9mIHRoZSBkZWxpbWl0ZXJzIGFwcGVhcnMuXG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgbGV0IHRva2VuU3RhcnQgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aCArIDE7IGkrKykge1xuICAgICAgICBpZiAoKGkgPT09IHN0ci5sZW5ndGgpIHx8IChkZWxpbWl0ZXJzLmluZGV4T2Yoc3RyW2ldKSAhPT0gLTEpKSB7XG4gICAgICAgICAgICBjb25zdCB0b2tlbiA9IHN0ci5zdWJhcnJheSh0b2tlblN0YXJ0LCBpKTtcbiAgICAgICAgICAgIGlmICghc2tpcEVtcHR5IHx8IHRva2VuLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRva2VuU3RhcnQgPSBpICsgMTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ1NwbGl0SW1wbChpbnB1dCwgZGVsaW1pdGVyLCBza2lwRW1wdHkpIHtcbiAgICBjb25zdCBiYXRjaFNpemUgPSBpbnB1dC5sZW5ndGg7XG4gICAgLy8gRW1wdHkgZGVsaW1pdGVyIG1lYW5zIHNwbGl0IHRoZSBpbnB1dCBjaGFyYWN0ZXIgYnkgY2hhcmFjdGVyLlxuICAgIGNvbnN0IHRva2VucyA9IFtdO1xuICAgIGxldCBvdXRwdXRTaXplID0gMDtcbiAgICBsZXQgbWF4TnVtRW50cmllcyA9IDA7XG4gICAgY29uc3QgbnVtSW5kaWNlcyA9IG5ldyBBcnJheShiYXRjaFNpemUpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmF0Y2hTaXplOyArK2kpIHtcbiAgICAgICAgY29uc3QgcGFydHMgPSBzcGxpdChpbnB1dFtpXSwgZGVsaW1pdGVyLCBza2lwRW1wdHkpO1xuICAgICAgICBjb25zdCBuRW50cmllcyA9IHBhcnRzLmxlbmd0aDtcbiAgICAgICAgbnVtSW5kaWNlc1tpXSA9IG5FbnRyaWVzO1xuICAgICAgICBvdXRwdXRTaXplICs9IG5FbnRyaWVzO1xuICAgICAgICBtYXhOdW1FbnRyaWVzID0gTWF0aC5tYXgobWF4TnVtRW50cmllcywgbkVudHJpZXMpO1xuICAgICAgICB0b2tlbnMucHVzaCguLi5wYXJ0cyk7XG4gICAgfVxuICAgIGNvbnN0IGluZGljZXMgPSB1dGlsLmdldEFycmF5RnJvbURUeXBlKCdpbnQzMicsIG91dHB1dFNpemUgKiAyKTtcbiAgICBjb25zdCB2YWx1ZXMgPSBuZXcgQXJyYXkob3V0cHV0U2l6ZSk7XG4gICAgY29uc3Qgc2hhcGUgPSBbYmF0Y2hTaXplLCBtYXhOdW1FbnRyaWVzXTtcbiAgICBsZXQgYyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiYXRjaFNpemU7ICsraSkge1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG51bUluZGljZXNbaV07ICsraikge1xuICAgICAgICAgICAgLy8gaW5kaWNlcyBpcyBhIDJkIHRlbnNvciB3aXRoIHNoYXBlIG9mIFtvdXRwdXRTaXplLCAyXVxuICAgICAgICAgICAgaW5kaWNlc1tjICogMl0gPSBpO1xuICAgICAgICAgICAgaW5kaWNlc1tjICogMiArIDFdID0gajtcbiAgICAgICAgICAgIHZhbHVlc1tjXSA9IHRva2Vuc1tjXTtcbiAgICAgICAgICAgICsrYztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW2luZGljZXMsIHZhbHVlcywgc2hhcGVdO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3RyaW5nU3BsaXRfaW1wbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTdHJpbmdUb0hhc2hCdWNrZXRGYXN0IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RJbXBsIH0gZnJvbSAnLi9TdHJpbmdUb0hhc2hCdWNrZXRGYXN0X2ltcGwnO1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3QoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IG51bUJ1Y2tldHMgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHsgaW5wdXQgfSA9IGlucHV0cztcbiAgICBpZiAoaW5wdXQuZHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW5wdXQgbXVzdCBiZSBvZiBkYXRhdHlwZSBzdHJpbmcnKTtcbiAgICB9XG4gICAgaWYgKG51bUJ1Y2tldHMgPD0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE51bWJlciBvZiBidWNrZXRzIG11c3QgYmUgYXQgbGVhc3QgMWApO1xuICAgIH1cbiAgICBjb25zdCAkaW5wdXQgPSBiYWNrZW5kLmRhdGEuZ2V0KGlucHV0LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IG91dHB1dCA9IHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RJbXBsKCRpbnB1dCwgbnVtQnVja2V0cyk7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oaW5wdXQuc2hhcGUsICdpbnQzMicsIG91dHB1dCk7XG59XG5leHBvcnQgY29uc3Qgc3RyaW5nVG9IYXNoQnVja2V0RmFzdENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTdHJpbmdUb0hhc2hCdWNrZXRGYXN0LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBzdHJpbmdUb0hhc2hCdWNrZXRGYXN0LFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN0cmluZ1RvSGFzaEJ1Y2tldEZhc3QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nVG9IYXNoQnVja2V0RmFzdEltcGwoaW5wdXQsIG51bUJ1Y2tldHMpIHtcbiAgICBjb25zdCBvdXRwdXQgPSB1dGlsLmdldEFycmF5RnJvbURUeXBlKCdpbnQzMicsIGlucHV0Lmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7ICsraSkge1xuICAgICAgICBvdXRwdXRbaV0gPVxuICAgICAgICAgICAgdXRpbC5maW5nZXJQcmludDY0KGlucHV0W2ldKS5tb2R1bG8obnVtQnVja2V0cykuZ2V0TG93Qml0c1Vuc2lnbmVkKCk7XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdHJpbmdUb0hhc2hCdWNrZXRGYXN0X2ltcGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3ViIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfaW1wbCc7XG5pbXBvcnQgeyBiaW5hcnlLZXJuZWxGdW5jLCBjcmVhdGVDb21wbGV4QmluYXJ5S2VybmVsSW1wbCB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV91dGlscyc7XG5leHBvcnQgY29uc3Qgc3ViSW1wbCA9IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwoKChhVmFsdWUsIGJWYWx1ZSkgPT4gYVZhbHVlIC0gYlZhbHVlKSk7XG5leHBvcnQgY29uc3Qgc3ViQ29tcGxleEltcGwgPSBjcmVhdGVDb21wbGV4QmluYXJ5S2VybmVsSW1wbCgoKGFSZWFsLCBhSW1hZywgYlJlYWwsIGJJbWFnKSA9PiB7XG4gICAgcmV0dXJuIHsgcmVhbDogYVJlYWwgLSBiUmVhbCwgaW1hZzogYUltYWcgLSBiSW1hZyB9O1xufSkpO1xuZXhwb3J0IGNvbnN0IHN1YiA9IGJpbmFyeUtlcm5lbEZ1bmMoU3ViLCBzdWJJbXBsLCBzdWJDb21wbGV4SW1wbCk7XG5leHBvcnQgY29uc3Qgc3ViQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFN1YixcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogc3ViXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3ViLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgU3VtLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyB6ZXJvcyB9IGZyb20gJy4uL3V0aWxzL3plcm9zX2ltcGwnO1xuaW1wb3J0IHsgY2FzdCB9IGZyb20gJy4vQ2FzdCc7XG5pbXBvcnQgeyBpZGVudGl0eSB9IGZyb20gJy4vSWRlbnRpdHknO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQgeyB0cmFuc3Bvc2UgfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5leHBvcnQgZnVuY3Rpb24gc3VtKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBheGlzLCBrZWVwRGltcyB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnc3VtJyk7XG4gICAgbGV0ICR4O1xuICAgIGlmICh4LmR0eXBlID09PSAnYm9vbCcpIHtcbiAgICAgICAgJHggPSBjYXN0KHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCwgYXR0cnM6IHsgZHR5cGU6ICdpbnQzMicgfSB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgICR4ID0gaWRlbnRpdHkoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kIH0pO1xuICAgIH1cbiAgICBjb25zdCB4UmFuayA9ICR4LnNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBheGVzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShheGlzLCAkeC5zaGFwZSk7XG4gICAgY29uc3QgcGVybXV0YXRpb24gPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKGF4ZXMsIHhSYW5rKTtcbiAgICBsZXQgcmVkdWN0aW9uQXhlcyA9IGF4ZXM7XG4gICAgbGV0IHBlcm11dGVkWCA9ICR4O1xuICAgIGlmIChwZXJtdXRhdGlvbiAhPSBudWxsKSB7XG4gICAgICAgIHBlcm11dGVkWCA9XG4gICAgICAgICAgICB0cmFuc3Bvc2UoeyBpbnB1dHM6IHsgeDogJHggfSwgYmFja2VuZCwgYXR0cnM6IHsgcGVybTogcGVybXV0YXRpb24gfSB9KTtcbiAgICAgICAgcmVkdWN0aW9uQXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRJbm5lck1vc3RBeGVzKHJlZHVjdGlvbkF4ZXMubGVuZ3RoLCB4UmFuayk7XG4gICAgfVxuICAgIGJhY2tlbmRfdXRpbC5hc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcygnc3VtJywgcmVkdWN0aW9uQXhlcywgcGVybXV0ZWRYLnNoYXBlLmxlbmd0aCk7XG4gICAgY29uc3QgW291dFNoYXBlLCByZWR1Y2VTaGFwZV0gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcyhwZXJtdXRlZFguc2hhcGUsIHJlZHVjdGlvbkF4ZXMpO1xuICAgIGNvbnN0IHJlc3VsdER0eXBlID0gYmFja2VuZF91dGlsLnVwY2FzdFR5cGUocGVybXV0ZWRYLmR0eXBlLCAnaW50MzInKTtcbiAgICBsZXQgcmVzdWx0ID0gemVyb3MoYmFja2VuZCwgb3V0U2hhcGUsIHJlc3VsdER0eXBlKTtcbiAgICBjb25zdCByZWR1Y2VTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcbiAgICBjb25zdCB2YWxzID0gYmFja2VuZC5kYXRhLmdldChyZXN1bHQuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgYVZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHBlcm11dGVkWC5kYXRhSWQpLnZhbHVlcztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gaSAqIHJlZHVjZVNpemU7XG4gICAgICAgIGxldCBzdW0gPSAwO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJlZHVjZVNpemU7ICsraikge1xuICAgICAgICAgICAgc3VtICs9IGFWYWxzW29mZnNldCArIGpdO1xuICAgICAgICB9XG4gICAgICAgIHZhbHNbaV0gPSBzdW07XG4gICAgfVxuICAgIGlmIChrZWVwRGltcykge1xuICAgICAgICBjb25zdCBuZXdTaGFwZSA9IGJhY2tlbmRfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbShyZXN1bHQuc2hhcGUsIGF4ZXMpO1xuICAgICAgICBjb25zdCBvbGRSZXN1bHQgPSByZXN1bHQ7XG4gICAgICAgIHJlc3VsdCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogcmVzdWx0IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBuZXdTaGFwZSB9IH0pO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG9sZFJlc3VsdCk7XG4gICAgfVxuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oJHgpO1xuICAgIGlmIChwZXJtdXRhdGlvbiAhPSBudWxsKSB7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocGVybXV0ZWRYKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBjb25zdCBzdW1Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU3VtLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBzdW1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdW0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFRhbiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgdGFuID0gdW5hcnlLZXJuZWxGdW5jKFRhbiwgKHhpKSA9PiBNYXRoLnRhbih4aSkpO1xuZXhwb3J0IGNvbnN0IHRhbkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBUYW4sXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHRhbixcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1UYW4uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFRhbmggfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IHRhbmggPSB1bmFyeUtlcm5lbEZ1bmMoVGFuaCwgKHhpKSA9PiBNYXRoLnRhbmgoeGkpKTtcbmV4cG9ydCBjb25zdCB0YW5oQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFRhbmgsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHRhbmgsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VGFuaC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBUaWxlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyB0aWxlSW1wbCB9IGZyb20gJy4vVGlsZV9pbXBsJztcbmV4cG9ydCBmdW5jdGlvbiB0aWxlKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyByZXBzIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KHgsICd0aWxlJyk7XG4gICAgY29uc3Qgb3V0QnVmID0gdGlsZUltcGwoYmFja2VuZC5idWZmZXJTeW5jKHgpLCByZXBzKTtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRCdWYuc2hhcGUsIG91dEJ1Zi5kdHlwZSwgb3V0QnVmLnZhbHVlcyk7XG59XG5leHBvcnQgY29uc3QgdGlsZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBUaWxlLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiB0aWxlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VGlsZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBidWZmZXIgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuLyoqXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdGlsZSBrZXJuZWwgc2hhcmVkIGJldHdlZW4gd2ViZ2wgYW5kIGNwdSBmb3Igc3RyaW5nXG4gKiB0ZW5zb3JzIG9ubHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aWxlSW1wbCh4QnVmLCByZXBzKSB7XG4gICAgY29uc3QgbmV3U2hhcGUgPSBuZXcgQXJyYXkoeEJ1Zi5yYW5rKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld1NoYXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG5ld1NoYXBlW2ldID0geEJ1Zi5zaGFwZVtpXSAqIHJlcHNbaV07XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGJ1ZmZlcihuZXdTaGFwZSwgeEJ1Zi5kdHlwZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHQudmFsdWVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IG5ld0xvYyA9IHJlc3VsdC5pbmRleFRvTG9jKGkpO1xuICAgICAgICBjb25zdCBvcmlnaW5hbExvYyA9IG5ldyBBcnJheSh4QnVmLnJhbmspO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG9yaWdpbmFsTG9jLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBvcmlnaW5hbExvY1tqXSA9IG5ld0xvY1tqXSAlIHhCdWYuc2hhcGVbal07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3JpZ2luYWxJbmRleCA9IHhCdWYubG9jVG9JbmRleChvcmlnaW5hbExvYyk7XG4gICAgICAgIHJlc3VsdC52YWx1ZXNbaV0gPSB4QnVmLnZhbHVlc1tvcmlnaW5hbEluZGV4XTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRpbGVfaW1wbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBUb3BLIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyB0b3BLSW1wbCB9IGZyb20gJy4vVG9wS19pbXBsJztcbmV4cG9ydCBmdW5jdGlvbiB0b3BLKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBrLCBzb3J0ZWQgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ3RvcGsnKTtcbiAgICBjb25zdCB4VmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBbYWxsVG9wS1ZhbHMsIGFsbFRvcEtJbmRpY2VzXSA9IHRvcEtJbXBsKHhWYWxzLCB4LnNoYXBlLCB4LmR0eXBlLCBrLCBzb3J0ZWQpO1xuICAgIHJldHVybiBbXG4gICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oYWxsVG9wS1ZhbHMuc2hhcGUsIGFsbFRvcEtWYWxzLmR0eXBlLCBhbGxUb3BLVmFscy52YWx1ZXMpLFxuICAgICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGFsbFRvcEtJbmRpY2VzLnNoYXBlLCBhbGxUb3BLSW5kaWNlcy5kdHlwZSwgYWxsVG9wS0luZGljZXMudmFsdWVzKVxuICAgIF07XG59XG5leHBvcnQgY29uc3QgdG9wS0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBUb3BLLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiB0b3BLXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VG9wSy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vKiogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRvcEsga2VybmVsIHNoYXJlZCBiZXR3ZWVuIHdlYmdsIGFuZCBjcHUuICovXG5pbXBvcnQgeyBidWZmZXIsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuY29uc3QgY29tcGFyZVBhaXIgPSAoYSwgYikgPT4ge1xuICAgIGNvbnN0IHZhbHVlRGlmZiA9IGIudmFsdWUgLSBhLnZhbHVlO1xuICAgIHJldHVybiB2YWx1ZURpZmYgPT09IDAgPyBhLmluZGV4IC0gYi5pbmRleCA6IHZhbHVlRGlmZjtcbn07XG4vKipcbiAqIFBhcnRpdGlvbnMgYXJyYXkgd2hlcmUgYWxsIGVsZW1lbnRzIHNtYWxsZXIgdGhhbiB0aGUgKGsrMSkgc21hbGxlc3QgZWxlbWVudFxuICogYXJlIGZvdW5kIHRvIHRoZSBsZWZ0IG9mIGl0LCBhbmQgYWxsIGxhcmdlciB0byB0aGUgcmlnaHQgb2YgaXQuXG4gKiBCYXNlZCBvbiB0aGUgRmxveWQtUml2ZXN0IEFsZ29yaXRobSwgcmVmOlxuICogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRmxveWQlRTIlODAlOTNSaXZlc3RfYWxnb3JpdGhtXG4gKiBAcGFyYW0gYXJyYXk6IEFycmF5IHRvIHBhcnRpdGlvblxuICogQHBhcmFtIGxlZnQ6IExlZnQgaW5kZXggZm9yIHRoZSBpbnRlcnZhbFxuICogQHBhcmFtIHJpZ2h0OiBSaWdodCBpbmRleCBmb3IgdGhlIGludGVydmFsXG4gKiBAcGFyYW0gazogRGVzaXJlZCBpbmRleCB2YWx1ZSwgd2hlcmUgYXJyYXlba10gaXMgdGhlIChrKzEpdGggc21hbGxlc3QgZWxlbWVudFxuICogICAgICAgICAgIHdoZW4gbGVmdCA9IDBcbiAqL1xuZnVuY3Rpb24gc2VsZWN0KGFycmF5LCBrLCBsZWZ0ID0gMCwgcmlnaHQgPSBhcnJheS5sZW5ndGggLSAxKSB7XG4gICAgd2hpbGUgKHJpZ2h0ID4gbGVmdCkge1xuICAgICAgICAvLyBVc2Ugc2VsZWN0IHJlY3Vyc2l2ZWx5IHRvIHNhbXBsZSBhIHNtYWxsZXIgc2V0IG9mIHNpemUgc1xuICAgICAgICAvLyB0aGUgYXJiaXRyYXJ5IGNvbnN0YW50cyA2MDAgYW5kIDAuNSBhcmUgdXNlZCBpbiB0aGUgb3JpZ2luYWxcbiAgICAgICAgLy8gdmVyc2lvbiB0byBtaW5pbWl6ZSBleGVjdXRpb24gdGltZS5cbiAgICAgICAgaWYgKHJpZ2h0IC0gbGVmdCA+IDYwMCkge1xuICAgICAgICAgICAgY29uc3QgbiA9IHJpZ2h0IC0gbGVmdCArIDE7XG4gICAgICAgICAgICBjb25zdCBpID0gayAtIGxlZnQgKyAxO1xuICAgICAgICAgICAgY29uc3QgeiA9IE1hdGgubG9nKG4pO1xuICAgICAgICAgICAgY29uc3QgcyA9IDAuNSAqIE1hdGguZXhwKDIgKiB6IC8gMyk7XG4gICAgICAgICAgICBjb25zdCBzZCA9IDAuNSAqIE1hdGguc3FydCh6ICogcyAqIChuIC0gcykgLyBuKSAqIE1hdGguc2lnbihpIC0gbiAvIDIpO1xuICAgICAgICAgICAgY29uc3QgbmV3TGVmdCA9IE1hdGgubWF4KGxlZnQsIE1hdGguZmxvb3IoayAtIGkgKiBzIC8gbiArIHNkKSk7XG4gICAgICAgICAgICBjb25zdCBuZXdSaWdodCA9IE1hdGgubWluKHJpZ2h0LCBNYXRoLmZsb29yKGsgKyAobiAtIGkpICogcyAvIG4gKyBzZCkpO1xuICAgICAgICAgICAgc2VsZWN0KGFycmF5LCBrLCBuZXdMZWZ0LCBuZXdSaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcGFydGl0aW9uIHRoZSBlbGVtZW50cyBiZXR3ZWVuIGxlZnQgYW5kIHJpZ2h0IGFyb3VuZCB0XG4gICAgICAgIGNvbnN0IHQgPSBhcnJheVtrXTtcbiAgICAgICAgbGV0IGkgPSBsZWZ0O1xuICAgICAgICBsZXQgaiA9IHJpZ2h0O1xuICAgICAgICB1dGlsLnN3YXAoYXJyYXksIGxlZnQsIGspO1xuICAgICAgICBpZiAoY29tcGFyZVBhaXIoYXJyYXlbcmlnaHRdLCB0KSA+IDApIHtcbiAgICAgICAgICAgIHV0aWwuc3dhcChhcnJheSwgbGVmdCwgcmlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChpIDwgaikge1xuICAgICAgICAgICAgdXRpbC5zd2FwKGFycmF5LCBpLCBqKTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIGotLTtcbiAgICAgICAgICAgIHdoaWxlIChjb21wYXJlUGFpcihhcnJheVtpXSwgdCkgPCAwKSB7XG4gICAgICAgICAgICAgICAgaSA9IGkgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2hpbGUgKGNvbXBhcmVQYWlyKGFycmF5W2pdLCB0KSA+IDApIHtcbiAgICAgICAgICAgICAgICBqID0gaiAtIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbXBhcmVQYWlyKGFycmF5W2xlZnRdLCB0KSA9PT0gMCkge1xuICAgICAgICAgICAgdXRpbC5zd2FwKGFycmF5LCBsZWZ0LCBqKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGogPSBqICsgMTtcbiAgICAgICAgICAgIHV0aWwuc3dhcChhcnJheSwgaiwgcmlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFkanVzdCBsZWZ0IGFuZCByaWdodCB0b3dhcmRzIHRoZSBib3VuZGFyaWVzIG9mIHRoZSBzdWJzZXRcbiAgICAgICAgLy8gY29udGFpbmluZyB0aGUgKGsgLSBsZWZ0ICsgMSl0aCBzbWFsbGVzdCBlbGVtZW50LlxuICAgICAgICBpZiAoaiA8PSBrKSB7XG4gICAgICAgICAgICBsZWZ0ID0gaiArIDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGsgPD0gaikge1xuICAgICAgICAgICAgcmlnaHQgPSBqIC0gMTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiB0b3BLSW1wbCh4LCB4U2hhcGUsIHhEdHlwZSwgaywgc29ydGVkKSB7XG4gICAgLy8gUmVzaGFwZSBpbnRvIGEgMmQgdGVuc29yIFtiYXRjaCwgbGFzdERpbV0gYW5kIGNvbXB1dGUgdG9wayBhbG9uZyBsYXN0RGltLlxuICAgIGNvbnN0IGxhc3REaW0gPSB4U2hhcGVbeFNoYXBlLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IFtiYXRjaCwgc2l6ZV0gPSBbeC5sZW5ndGggLyBsYXN0RGltLCBsYXN0RGltXTtcbiAgICBjb25zdCBhbGxUb3BLVmFscyA9IHV0aWwuZ2V0VHlwZWRBcnJheUZyb21EVHlwZSh4RHR5cGUsIGJhdGNoICogayk7XG4gICAgY29uc3QgYWxsVG9wS0luZGljZXMgPSB1dGlsLmdldFR5cGVkQXJyYXlGcm9tRFR5cGUoJ2ludDMyJywgYmF0Y2ggKiBrKTtcbiAgICBmb3IgKGxldCBiID0gMDsgYiA8IGJhdGNoOyBiKyspIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYiAqIHNpemU7XG4gICAgICAgIGNvbnN0IHZhbHMgPSB4LnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgc2l6ZSk7XG4gICAgICAgIGxldCB2YWxBbmRJbmQgPSBuZXcgQXJyYXkodmFscy5sZW5ndGgpO1xuICAgICAgICB2YWxzLmZvckVhY2goKHZhbHVlLCBpbmRleCkgPT4gdmFsQW5kSW5kW2luZGV4XSA9IHsgdmFsdWUsIGluZGV4IH0pO1xuICAgICAgICBpZiAoayA8IHZhbEFuZEluZC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHNlbGVjdCh2YWxBbmRJbmQsIGspO1xuICAgICAgICAgICAgdmFsQW5kSW5kID0gdmFsQW5kSW5kLnNsaWNlKDAsIGspO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzb3J0ZWQpIHtcbiAgICAgICAgICAgIHZhbEFuZEluZC5zb3J0KGNvbXBhcmVQYWlyKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvdXRPZmZzZXQgPSBiICogaztcbiAgICAgICAgY29uc3QgdG9wS1ZhbHMgPSBhbGxUb3BLVmFscy5zdWJhcnJheShvdXRPZmZzZXQsIG91dE9mZnNldCArIGspO1xuICAgICAgICBjb25zdCB0b3BLSW5kaWNlcyA9IGFsbFRvcEtJbmRpY2VzLnN1YmFycmF5KG91dE9mZnNldCwgb3V0T2Zmc2V0ICsgayk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgazsgaSsrKSB7XG4gICAgICAgICAgICB0b3BLVmFsc1tpXSA9IHZhbEFuZEluZFtpXS52YWx1ZTtcbiAgICAgICAgICAgIHRvcEtJbmRpY2VzW2ldID0gdmFsQW5kSW5kW2ldLmluZGV4O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFJlc2hhcGUgYmFjayB0byB0aGUgb3JpZ2luYWwgaW5wdXQgc2hhcGUsIGV4Y2VwdCB0aGF0IHRoZSBsYXN0XG4gICAgLy8gZGltZW5zaW9uIGlzIGsuXG4gICAgY29uc3Qgb3V0cHV0U2hhcGUgPSB4U2hhcGUuc2xpY2UoKTtcbiAgICBvdXRwdXRTaGFwZVtvdXRwdXRTaGFwZS5sZW5ndGggLSAxXSA9IGs7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgYnVmZmVyKG91dHB1dFNoYXBlLCB4RHR5cGUsIGFsbFRvcEtWYWxzKSxcbiAgICAgICAgYnVmZmVyKG91dHB1dFNoYXBlLCAnaW50MzInLCBhbGxUb3BLSW5kaWNlcylcbiAgICBdO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VG9wS19pbXBsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFRyYW5zZm9ybSwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYXR0cnMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBpbWFnZSwgdHJhbnNmb3JtcyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgaW50ZXJwb2xhdGlvbiwgZmlsbE1vZGUsIGZpbGxWYWx1ZSwgb3V0cHV0U2hhcGUgfSA9IGF0dHJzO1xuICAgIGNvbnN0IFtiYXRjaCwgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIG51bUNoYW5uZWxzXSA9IGltYWdlLnNoYXBlO1xuICAgIGNvbnN0IFtvdXRIZWlnaHQsIG91dFdpZHRoXSA9IG91dHB1dFNoYXBlICE9IG51bGwgPyBvdXRwdXRTaGFwZSA6IFtpbWFnZUhlaWdodCwgaW1hZ2VXaWR0aF07XG4gICAgY29uc3Qgb3V0U2hhcGUgPSBbYmF0Y2gsIG91dEhlaWdodCwgb3V0V2lkdGgsIG51bUNoYW5uZWxzXTtcbiAgICBjb25zdCBzdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhpbWFnZS5zaGFwZSk7XG4gICAgY29uc3QgYmF0Y2hTdHJpZGUgPSBzdHJpZGVzWzBdO1xuICAgIGNvbnN0IHJvd1N0cmlkZSA9IHN0cmlkZXNbMV07XG4gICAgY29uc3QgY29sU3RyaWRlID0gc3RyaWRlc1syXTtcbiAgICBjb25zdCBvdXRWYWxzID0gdXRpbC5nZXRUeXBlZEFycmF5RnJvbURUeXBlKGltYWdlLmR0eXBlLCB1dGlsLnNpemVGcm9tU2hhcGUob3V0U2hhcGUpKTtcbiAgICBvdXRWYWxzLmZpbGwoZmlsbFZhbHVlKTtcbiAgICBjb25zdCBpbWFnZVZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KGltYWdlLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHRyYW5zZm9ybVZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHRyYW5zZm9ybXMuZGF0YUlkKS52YWx1ZXM7XG4gICAgLy8gUmVmIFRGIGltcGxlbWVudGF0aW9uOlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmZsb3cvYmxvYi9tYXN0ZXIvdGVuc29yZmxvdy9jb3JlL2tlcm5lbHMvaW1hZ2UvaW1hZ2Vfb3BzLmhcbiAgICBmb3IgKGxldCBiID0gMDsgYiA8IGJhdGNoOyArK2IpIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gdHJhbnNmb3Jtcy5zaGFwZVswXSA9PT0gMSA/XG4gICAgICAgICAgICB0cmFuc2Zvcm1WYWxzIDpcbiAgICAgICAgICAgIHRyYW5zZm9ybVZhbHMuc3ViYXJyYXkoYiAqIDgsIGIgKiA4ICsgOCk7XG4gICAgICAgIGZvciAobGV0IG91dFkgPSAwOyBvdXRZIDwgb3V0SGVpZ2h0OyArK291dFkpIHtcbiAgICAgICAgICAgIGZvciAobGV0IG91dFggPSAwOyBvdXRYIDwgb3V0V2lkdGg7ICsrb3V0WCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgbnVtQ2hhbm5lbHM7ICsrY2hhbm5lbCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9qZWN0aW9uID0gdHJhbnNmb3JtWzZdICogb3V0WCArIHRyYW5zZm9ybVs3XSAqIG91dFkgKyAxO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvamVjdGlvbiA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBmaWxsIHZhbHVlIGZvciBpbmZpbml0ZSBjb29yZGluYXRlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGFyZSBvdXRzaWRlIHRoZSBpbnB1dCBpbWFnZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5YID0gKHRyYW5zZm9ybVswXSAqIG91dFggKyB0cmFuc2Zvcm1bMV0gKiBvdXRZICsgdHJhbnNmb3JtWzJdKSAvXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0aW9uO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpblkgPSAodHJhbnNmb3JtWzNdICogb3V0WCArIHRyYW5zZm9ybVs0XSAqIG91dFkgKyB0cmFuc2Zvcm1bNV0pIC9cbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3Rpb247XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHggPSBtYXBDb29yZChpblgsIGltYWdlV2lkdGgsIGZpbGxNb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeSA9IG1hcENvb3JkKGluWSwgaW1hZ2VIZWlnaHQsIGZpbGxNb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChpbnRlcnBvbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICduZWFyZXN0JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBuZWFyZXN0SW50ZXJwb2xhdGlvbihpbWFnZVZhbHMsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBiYXRjaFN0cmlkZSwgcm93U3RyaWRlLCBjb2xTdHJpZGUsIGIsIHksIHgsIGNoYW5uZWwsIGZpbGxWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdiaWxpbmVhcic6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gYmlsaW5lYXJJbnRlcnBvbGF0aW9uKGltYWdlVmFscywgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIGJhdGNoU3RyaWRlLCByb3dTdHJpZGUsIGNvbFN0cmlkZSwgYiwgeSwgeCwgY2hhbm5lbCwgZmlsbFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBpbiBUcmFuc2Zvcm06IEV4cGVjdCAnbmVhcmVzdCcgb3IgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAnYmlsaW5lYXInLCBidXQgZ290ICR7aW50ZXJwb2xhdGlvbn1gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmQgPSBiICogYmF0Y2hTdHJpZGUgKyBvdXRZICogcm93U3RyaWRlICsgb3V0WCAqIGNvbFN0cmlkZSArIGNoYW5uZWw7XG4gICAgICAgICAgICAgICAgICAgIG91dFZhbHNbaW5kXSA9IHZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0U2hhcGUsIGltYWdlLmR0eXBlLCBvdXRWYWxzKTtcbiAgICB9XG4gICAgY29uc3QgZGF0YUlkID0gYmFja2VuZC53cml0ZShvdXRWYWxzLCBvdXRTaGFwZSwgaW1hZ2UuZHR5cGUpO1xuICAgIHJldHVybiB7IGRhdGFJZCwgc2hhcGU6IGltYWdlLnNoYXBlLCBkdHlwZTogaW1hZ2UuZHR5cGUgfTtcbn1cbmV4cG9ydCBjb25zdCB0cmFuc2Zvcm1Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogVHJhbnNmb3JtLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiB0cmFuc2Zvcm1cbn07XG5mdW5jdGlvbiBtYXBDb29yZChvdXRDb29yZCwgbGVuLCBtb2RlKSB7XG4gICAgc3dpdGNoIChtb2RlKSB7XG4gICAgICAgIGNhc2UgJ3JlZmxlY3QnOlxuICAgICAgICAgICAgcmV0dXJuIG1hcENvb3JkUmVmbGVjdChvdXRDb29yZCwgbGVuKTtcbiAgICAgICAgY2FzZSAnd3JhcCc6XG4gICAgICAgICAgICByZXR1cm4gbWFwQ29vcmRXcmFwKG91dENvb3JkLCBsZW4pO1xuICAgICAgICBjYXNlICduZWFyZXN0JzpcbiAgICAgICAgICAgIHJldHVybiBtYXBDb29yZE5lYXJlc3Qob3V0Q29vcmQsIGxlbik7XG4gICAgICAgIGNhc2UgJ2NvbnN0YW50JzpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBtYXBDb29yZENvbnN0YW50KG91dENvb3JkLCBsZW4pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG1hcENvb3JkUmVmbGVjdChvdXRDb29yZCwgbGVuKSB7XG4gICAgLy8gUmVmbGVjdCBbYWJjZF0gdG8gW2RjYmF8YWJjZHxkY2JhXS5cbiAgICBsZXQgaW5Db29yZCA9IG91dENvb3JkO1xuICAgIGlmIChpbkNvb3JkIDwgMCkge1xuICAgICAgICBpZiAobGVuIDw9IDEpIHtcbiAgICAgICAgICAgIGluQ29vcmQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc3oyID0gMiAqIGxlbjtcbiAgICAgICAgICAgIGlmIChpbkNvb3JkIDwgc3oyKSB7XG4gICAgICAgICAgICAgICAgaW5Db29yZCA9IHN6MiAqIE1hdGgudHJ1bmMoLWluQ29vcmQgLyBzejIpICsgaW5Db29yZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGluQ29vcmQgPSBpbkNvb3JkIDwgLWxlbiA/IGluQ29vcmQgKyBzejIgOiAtaW5Db29yZCAtIDE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoaW5Db29yZCA+IGxlbiAtIDEpIHtcbiAgICAgICAgaWYgKGxlbiA8PSAxKSB7XG4gICAgICAgICAgICBpbkNvb3JkID0gMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHN6MiA9IDIgKiBsZW47XG4gICAgICAgICAgICBpbkNvb3JkIC09IHN6MiAqIE1hdGgudHJ1bmMoaW5Db29yZCAvIHN6Mik7XG4gICAgICAgICAgICBpZiAoaW5Db29yZCA+PSBsZW4pIHtcbiAgICAgICAgICAgICAgICBpbkNvb3JkID0gc3oyIC0gaW5Db29yZCAtIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gY2xhbXAgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2hlbiBvdXRDb29yZCA9IDMuNSBhbmQgbGVuID0gNCxcbiAgICAvLyBpbkNvb3JkID0gMy41IGFuZCB3aWxsIGJlIHJvdW5kZWQgdG8gNCBpbiBuZWFyZXN0IGludGVycG9sYXRpb24uXG4gICAgcmV0dXJuIHV0aWwuY2xhbXAoMCwgaW5Db29yZCwgbGVuIC0gMSk7XG59XG5mdW5jdGlvbiBtYXBDb29yZFdyYXAob3V0Q29vcmQsIGxlbikge1xuICAgIC8vIFdyYXAgW2FiY2RdIHRvIFthYmNkfGFiY2R8YWJjZF0uXG4gICAgbGV0IGluQ29vcmQgPSBvdXRDb29yZDtcbiAgICBpZiAoaW5Db29yZCA8IDApIHtcbiAgICAgICAgaWYgKGxlbiA8PSAxKSB7XG4gICAgICAgICAgICBpbkNvb3JkID0gMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHN6ID0gbGVuIC0gMTtcbiAgICAgICAgICAgIGluQ29vcmQgKz0gbGVuICogKE1hdGgudHJ1bmMoLWluQ29vcmQgLyBzeikgKyAxKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChpbkNvb3JkID4gbGVuIC0gMSkge1xuICAgICAgICBpZiAobGVuIDw9IDEpIHtcbiAgICAgICAgICAgIGluQ29vcmQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc3ogPSBsZW4gLSAxO1xuICAgICAgICAgICAgaW5Db29yZCAtPSBsZW4gKiBNYXRoLnRydW5jKGluQ29vcmQgLyBzeik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gY2xhbXAgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2hlbiBvdXRDb29yZCA9IC0wLjUgYW5kIGxlbiA9IDQsXG4gICAgLy8gaW5Db29yZCA9IDMuNSBhbmQgd2lsbCBiZSByb3VuZGVkIHRvIDQgaW4gbmVhcmVzdCBpbnRlcnBvbGF0aW9uLlxuICAgIHJldHVybiB1dGlsLmNsYW1wKDAsIGluQ29vcmQsIGxlbiAtIDEpO1xufVxuZnVuY3Rpb24gbWFwQ29vcmRDb25zdGFudChvdXRDb29yZCwgbGVuKSB7XG4gICAgcmV0dXJuIG91dENvb3JkO1xufVxuZnVuY3Rpb24gbWFwQ29vcmROZWFyZXN0KG91dENvb3JkLCBsZW4pIHtcbiAgICByZXR1cm4gdXRpbC5jbGFtcCgwLCBvdXRDb29yZCwgbGVuIC0gMSk7XG59XG5mdW5jdGlvbiByZWFkV2l0aEZpbGxWYWx1ZShpbWFnZVZhbHMsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBiYXRjaFN0cmlkZSwgcm93U3RyaWRlLCBjb2xTdHJpZGUsIGJhdGNoLCB5LCB4LCBjaGFubmVsLCBmaWxsVmFsdWUpIHtcbiAgICBjb25zdCBpbmQgPSBiYXRjaCAqIGJhdGNoU3RyaWRlICsgeSAqIHJvd1N0cmlkZSArIHggKiBjb2xTdHJpZGUgKyBjaGFubmVsO1xuICAgIGlmICgwIDw9IHkgJiYgeSA8IGltYWdlSGVpZ2h0ICYmIDAgPD0geCAmJiB4IDwgaW1hZ2VXaWR0aCkge1xuICAgICAgICByZXR1cm4gaW1hZ2VWYWxzW2luZF07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gZmlsbFZhbHVlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG5lYXJlc3RJbnRlcnBvbGF0aW9uKGltYWdlVmFscywgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIGJhdGNoU3RyaWRlLCByb3dTdHJpZGUsIGNvbFN0cmlkZSwgYmF0Y2gsIHksIHgsIGNoYW5uZWwsIGZpbGxWYWx1ZSkge1xuICAgIGNvbnN0ICR5ID0gTWF0aC5yb3VuZCh5KTtcbiAgICBjb25zdCAkeCA9IE1hdGgucm91bmQoeCk7XG4gICAgcmV0dXJuIHJlYWRXaXRoRmlsbFZhbHVlKGltYWdlVmFscywgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIGJhdGNoU3RyaWRlLCByb3dTdHJpZGUsIGNvbFN0cmlkZSwgYmF0Y2gsICR5LCAkeCwgY2hhbm5lbCwgZmlsbFZhbHVlKTtcbn1cbmZ1bmN0aW9uIGJpbGluZWFySW50ZXJwb2xhdGlvbihpbWFnZVZhbHMsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBiYXRjaFN0cmlkZSwgcm93U3RyaWRlLCBjb2xTdHJpZGUsIGJhdGNoLCB5LCB4LCBjaGFubmVsLCBmaWxsVmFsdWUpIHtcbiAgICBjb25zdCB5Rmxvb3IgPSBNYXRoLmZsb29yKHkpO1xuICAgIGNvbnN0IHhGbG9vciA9IE1hdGguZmxvb3IoeCk7XG4gICAgY29uc3QgeUNlaWwgPSB5Rmxvb3IgKyAxO1xuICAgIGNvbnN0IHhDZWlsID0geEZsb29yICsgMTtcbiAgICAvLyBmKHgsIHlGbG9vcikgPSAoeENlaWwgLSB4KSAvICh4Q2VpbCAtIHhGbG9vcikgKiBmKHhGbG9vciwgeUZsb29yKVxuICAgIC8vICAgICAgICAgICAgICAgKyAoeCAtIHhGbG9vcikgLyAoeENlaWwgLSB4Rmxvb3IpICogZih4Q2VpbCwgeUZsb29yKVxuICAgIGNvbnN0IHZhbHVlWUZsb29yID0gKHhDZWlsIC0geCkgKlxuICAgICAgICByZWFkV2l0aEZpbGxWYWx1ZShpbWFnZVZhbHMsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBiYXRjaFN0cmlkZSwgcm93U3RyaWRlLCBjb2xTdHJpZGUsIGJhdGNoLCB5Rmxvb3IsIHhGbG9vciwgY2hhbm5lbCwgZmlsbFZhbHVlKSArXG4gICAgICAgICh4IC0geEZsb29yKSAqXG4gICAgICAgICAgICByZWFkV2l0aEZpbGxWYWx1ZShpbWFnZVZhbHMsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBiYXRjaFN0cmlkZSwgcm93U3RyaWRlLCBjb2xTdHJpZGUsIGJhdGNoLCB5Rmxvb3IsIHhDZWlsLCBjaGFubmVsLCBmaWxsVmFsdWUpO1xuICAgIC8vIGYoeCwgeUNlaWwpID0gKHhDZWlsIC0geCkgLyAoeENlaWwgLSB4Rmxvb3IpICogZih4Rmxvb3IsIHlDZWlsKVxuICAgIC8vICAgICAgICAgICAgICsgKHggLSB4Rmxvb3IpIC8gKHhDZWlsIC0geEZsb29yKSAqIGYoeENlaWwsIHlDZWlsKVxuICAgIGNvbnN0IHZhbHVlWUNlaWwgPSAoeENlaWwgLSB4KSAqXG4gICAgICAgIHJlYWRXaXRoRmlsbFZhbHVlKGltYWdlVmFscywgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIGJhdGNoU3RyaWRlLCByb3dTdHJpZGUsIGNvbFN0cmlkZSwgYmF0Y2gsIHlDZWlsLCB4Rmxvb3IsIGNoYW5uZWwsIGZpbGxWYWx1ZSkgK1xuICAgICAgICAoeCAtIHhGbG9vcikgKlxuICAgICAgICAgICAgcmVhZFdpdGhGaWxsVmFsdWUoaW1hZ2VWYWxzLCBpbWFnZUhlaWdodCwgaW1hZ2VXaWR0aCwgYmF0Y2hTdHJpZGUsIHJvd1N0cmlkZSwgY29sU3RyaWRlLCBiYXRjaCwgeUNlaWwsIHhDZWlsLCBjaGFubmVsLCBmaWxsVmFsdWUpO1xuICAgIC8vIGYoeCwgeSkgPSAoeUNlaWwgLSB5KSAvICh5Q2VpbCAtIHlGbG9vcikgKiBmKHgsIHlGbG9vcilcbiAgICAvLyAgICAgICAgICsgKHkgLSB5Rmxvb3IpIC8gKHlDZWlsIC0geUZsb29yKSAqIGYoeCwgeUNlaWwpXG4gICAgcmV0dXJuICh5Q2VpbCAtIHkpICogdmFsdWVZRmxvb3IgKyAoeSAtIHlGbG9vcikgKiB2YWx1ZVlDZWlsO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VHJhbnNmb3JtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFRyYW5zcG9zZSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHsgdHJhbnNwb3NlSW1wbCB9IGZyb20gJy4vVHJhbnNwb3NlX2ltcGwnO1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zcG9zZShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGF0dHJzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgcGVybSB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleCh4LCAndHJhbnNwb3NlJyk7XG4gICAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBuZXdTaGFwZSA9IG5ldyBBcnJheSh4UmFuayk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdTaGFwZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBuZXdTaGFwZVtpXSA9IHguc2hhcGVbcGVybVtpXV07XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCByZXN1bHQgPSB0cmFuc3Bvc2VJbXBsKHZhbHVlcywgeC5zaGFwZSwgeC5kdHlwZSwgcGVybSwgbmV3U2hhcGUpO1xuICAgIGNvbnN0IGRhdGFJZCA9IGJhY2tlbmQud3JpdGUocmVzdWx0LCBuZXdTaGFwZSwgeC5kdHlwZSk7XG4gICAgcmV0dXJuIHsgZGF0YUlkLCBzaGFwZTogbmV3U2hhcGUsIGR0eXBlOiB4LmR0eXBlIH07XG59XG5leHBvcnQgY29uc3QgdHJhbnNwb3NlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFRyYW5zcG9zZSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogdHJhbnNwb3NlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VHJhbnNwb3NlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zcG9zZUltcGwoeFZhbHMsIHhTaGFwZSwgZHR5cGUsIHBlcm0sIG5ld1NoYXBlKSB7XG4gICAgY29uc3QgeFJhbmsgPSB4U2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IHhTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHhTaGFwZSk7XG4gICAgY29uc3QgeFN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKHhTaGFwZSk7XG4gICAgY29uc3QgbmV3U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMobmV3U2hhcGUpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHV0aWwuZ2V0VHlwZWRBcnJheUZyb21EVHlwZShkdHlwZSwgdXRpbC5zaXplRnJvbVNoYXBlKG5ld1NoYXBlKSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB4U2l6ZTsgKytpKSB7XG4gICAgICAgIGNvbnN0IGxvYyA9IHV0aWwuaW5kZXhUb0xvYyhpLCB4UmFuaywgeFN0cmlkZXMpO1xuICAgICAgICAvLyBQZXJtdXRlIGxvY2F0aW9uLlxuICAgICAgICBjb25zdCBuZXdMb2MgPSBuZXcgQXJyYXkobG9jLmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3TG9jLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBuZXdMb2NbaV0gPSBsb2NbcGVybVtpXV07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3SW5kZXggPSB1dGlsLmxvY1RvSW5kZXgobmV3TG9jLCB4UmFuaywgbmV3U3RyaWRlcyk7XG4gICAgICAgIHJlc3VsdFtuZXdJbmRleF0gPSB4VmFsc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRyYW5zcG9zZV9pbXBsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBVbmlxdWUgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7IHVuaXF1ZUltcGwgfSBmcm9tICcuL1VuaXF1ZV9pbXBsJztcbmV4cG9ydCBmdW5jdGlvbiB1bmlxdWUoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBhdHRycywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IGF4aXMgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ3VuaXF1ZScpO1xuICAgIGNvbnN0IHZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCB7IG91dHB1dFZhbHVlcywgb3V0cHV0U2hhcGUsIGluZGljZXMgfSA9IHVuaXF1ZUltcGwodmFsdWVzLCBheGlzLCB4LnNoYXBlLCB4LmR0eXBlKTtcbiAgICByZXR1cm4gW1xuICAgICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dHB1dFNoYXBlLCB4LmR0eXBlLCBvdXRwdXRWYWx1ZXMpLFxuICAgICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtpbmRpY2VzLmxlbmd0aF0sICdpbnQzMicsIGluZGljZXMpLFxuICAgIF07XG59XG5leHBvcnQgY29uc3QgdW5pcXVlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFVuaXF1ZSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogdW5pcXVlLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVVuaXF1ZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBUZW5zb3JCdWZmZXIsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIHVuaXF1ZUltcGwodmFsdWVzLCBheGlzLCBzaGFwZSwgZHR5cGUpIHtcbiAgICAvLyBOb3JtYWxpemUgYW5kIHZhbGlkYXRlIGF4aXMuXG4gICAgY29uc3QgJGF4aXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHNoYXBlKVswXTtcbiAgICAvLyBDYWxjdWxhdGUgdGhlIG5ldyBzaGFwZSB0aGF0IGlzIHN1aXRhYmxlIGZvciBleHRyYWN0aW5nIGRhdGEgYWxvbmcgdGhlXG4gICAgLy8gZ2l2ZW4gYXhpcy5cbiAgICAvL1xuICAgIC8vIFRoZSByYW5rIGlzIDMuXG4gICAgLy8gVGhlIHNpemUgb2YgdGhlIDFzdCBkaW1lbnNpb24gaXMgdGhlIHNpemUgb2YgYWxsIHRoZSBheGVzIDwgdGhlIGdpdmVuIGF4aXMuXG4gICAgLy8gVGhlIHNpemUgb2YgdGhlIDJuZCBkaW1lbnNpb24gaXMgdGhlIHNhbWUgYXMgdGhlIHNpemUgb2YgdGhlIGdpdmVuIGF4aXMuXG4gICAgLy8gVGhlIHNpemUgb2YgdGhlIDNyZCBkaW1lbnNpb24gaXMgdGhlIHNpemUgb2YgYWxsIHRoZSBheGVzID4gdGhlIGdpdmVuIGF4aXMuXG4gICAgLy9cbiAgICAvLyBGb3IgZXhhbXBsZSwgZm9yIGEgNEQgdGVuc29yIHdpdGggc2hhcGU9WzIsIDMsIDUsIDRdIGFuZCBheGlzPTIsIHRoZVxuICAgIC8vIG5ld1NoYXBlIHdvdWxkIGJlOiBbMiozLCA1LCA0XS5cbiAgICAvL1xuICAgIC8vIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCB0aGUgZmluYWwgb3V0cHV0IHNoYXBlLiBUaGlzIHdpbGwgYmUgdGhlIHNoYXBlIGZvciBhblxuICAgIC8vIGludGVybWVkaWF0ZSBUZW5zb3JCdWZmZXIgKHNlZSBpbnB1dEJ1ZmZlciBiZWxvdykgdG8gYWxsb3cgdXMgdG8gZXh0cmFjdFxuICAgIC8vIHZhbHVlcyBhbG9uZyB0aGUgZ2l2ZW4gYXhpcy4gVG8gZGVtb25zdHJhdGUgaG93IGl0IHdvcmtzLCBjb25zaWRlciB0aGVcbiAgICAvLyBmb2xsb3dpbmcgZXhhbXBsZTpcbiAgICAvL1xuICAgIC8vIElucHV0OiBhIDNEIHRlbnNvciwgd2l0aCBzaGFwZSBbMSwgMiwgM11cbiAgICAvLyBbXG4gICAgLy8gICBbXG4gICAgLy8gICAgICBbMSwyLDNdLFxuICAgIC8vICAgICAgWzQsNSw2XVxuICAgIC8vICAgXVxuICAgIC8vIF1cbiAgICAvLyBBeGlzOiAyICh0aGUgbGFzdCBheGlzKS5cbiAgICAvLyBBbG9uZyBheGlzIDIsIHdlIGV4cGVjdCB0byBleHRyYWN0IDMgdGVuc29yczogWzEsNF0sIFsyLDVdLCBbMyw2XS5cbiAgICAvL1xuICAgIC8vIEZvciB0aGlzIGV4YW1wbGUsIG5ld1NoYXBlIHdvdWxkIGJlOiBbMiwgMywgMV0sIHdoZXJlIDIgaXMgY2FsY3VsYXRlZCBmcm9tXG4gICAgLy8gMSoyLiBUaGUgcmUtc2hhcGVkIGRhdGEgd291bGQgbG9vayBsaWtlOlxuICAgIC8vXG4gICAgLy8gW1xuICAgIC8vICAgW1xuICAgIC8vICAgICBbMV0sIFsyXSwgWzNdXG4gICAgLy8gICBdLFxuICAgIC8vICAgW1xuICAgIC8vICAgICBbNF0sIFs1XSwgWzZdXG4gICAgLy8gICBdXG4gICAgLy8gXVxuICAgIC8vXG4gICAgLy8gVGhlbiwgd2UgY2FuIGNvbnN0cnVjdCBhIDMtbGV2ZWwgbmVzdGVkIGxvb3AgYnkgdGhlIGZvbGxvd2luZyBkaW1lbnNpb25cbiAgICAvLyBvcmRlciB0byBleHRyYWN0IHRoZSB2YWx1ZXMgYWxvbmcgdGhlIGF4aXMgKGRpbWVuc2lvbjEpOlxuICAgIC8vIGk6IGRpbWVuc2lvbjEgICAgICAgLy8gMCwxLDIgKG5ld1NoYXBlWzFdKVxuICAgIC8vICAgbTogZGltZW5zaW9uMCAgICAgLy8gMCwxICAgKG5ld1NoYXBlWzBdKVxuICAgIC8vICAgICBuOiBkaW1lbnNpb24yICAgLy8gMCAgICAgKG5ld1NoYXBlWzJdKVxuICAgIC8vXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgIG0sIGksIG5cbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS1cbiAgICAvLyBJdGVyYXRpb24gMDogZGF0YSBhdCBbMCwgMCwgMF0gPT4gXCIxXCJcbiAgICAvLyBJdGVyYXRpb24gMTogZGF0YSBhdCBbMSwgMCwgMF0gPT4gXCI0XCJcbiAgICAvLyBXZSBnb3QgWzEsNF0uXG4gICAgLy8gSXRlcmF0aW9uIDI6IGRhdGEgYXQgWzAsIDEsIDBdID0+IFwiMlwiXG4gICAgLy8gSXRlcmF0aW9uIDM6IGRhdGEgYXQgWzEsIDEsIDBdID0+IFwiNVwiXG4gICAgLy8gV2UgZ290IFsyLDVdLlxuICAgIC8vIEl0ZXJhdGlvbiA0OiBkYXRhIGF0IFswLCAyLCAwXSA9PiBcIjNcIlxuICAgIC8vIEl0ZXJhdGlvbiA1OiBkYXRhIGF0IFsxLCAyLCAwXSA9PiBcIjZcIlxuICAgIC8vIFdlIGdvdCBbMyw2XS5cbiAgICBjb25zdCBuZXdTaGFwZSA9IFsxLCBzaGFwZVswXSwgMV07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAkYXhpczsgaSsrKSB7XG4gICAgICAgIG5ld1NoYXBlWzBdICo9IHNoYXBlW2ldO1xuICAgIH1cbiAgICBuZXdTaGFwZVsxXSA9IHNoYXBlWyRheGlzXTtcbiAgICBmb3IgKGxldCBpID0gJGF4aXMgKyAxOyBpIDwgc2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbmV3U2hhcGVbMl0gKj0gc2hhcGVbaV07XG4gICAgfVxuICAgIC8vIEEgbWFwIGZyb20gdW5pcXVlIGVsZW1lbnRzICh0aGVpciBzdHJpbmcgcmVwcmVzZW50YXRpb25zKSB0byB0aGVpciB2YWx1ZXNcbiAgICAvLyBpbiBcImluZGljZXNcIiAoYmVsb3cpLlxuICAgIGNvbnN0IHVuaXF1ZUVsZW1lbnRzID0ge307XG4gICAgLy8gVGhlIGluZGljZXMgb2YgZWFjaCB1bmlxdWUgZWxlbWVudCBpbiB0aGUgb3JpZ2luYWwgdGVuc29yIGFsb25nIHRoZSBnaXZlblxuICAgIC8vIGF4aXMuIEl0IGlzIDFEIGFuZCBoYXMgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgZ2l2ZW4gYXhpcy5cbiAgICBjb25zdCBpbmRpY2VzID0gbmV3IEludDMyQXJyYXkoc2hhcGVbJGF4aXNdKTtcbiAgICAvLyBDcmVhdGUgYSBidWZmZXIgc28gd2UgY2FuIGVhc2lseSBleHRyYWN0IHZhbHVlIGF0IGEgZ2l2ZW4gbG9jYXRpb24uXG4gICAgY29uc3QgaW5wdXRCdWZmZXIgPSBuZXcgVGVuc29yQnVmZmVyKG5ld1NoYXBlLCBkdHlwZSwgdmFsdWVzKTtcbiAgICAvLyBUaGUgaW5kaWNlcyBhbG9uZyB0aGUgZ2l2ZW4gYXhpcyB0aGF0IGhhdmUgdW5pcXVlIGVsZW1lbnRzLiBUaGlzIGlzIGFcbiAgICAvLyBkZS1kdXBlZCB2ZXJzaW9uIG9mIFwiaW5kaWNlc1wiIGFib3ZlLlxuICAgIGNvbnN0IHVuaXF1ZUluZGljZXMgPSBbXTtcbiAgICBjb25zdCBpczFEVGVuc29yID0gbmV3U2hhcGVbMF0gPT09IDEgJiYgbmV3U2hhcGVbMl0gPT09IDE7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaGFwZVskYXhpc107IGkrKykge1xuICAgICAgICAvLyBFeHRyYWN0IHZhbHVlcyBhbG9uZyB0aGUgYXhpcy5cbiAgICAgICAgbGV0IGVsZW1lbnQ7XG4gICAgICAgIGlmIChpczFEVGVuc29yKSB7XG4gICAgICAgICAgICAvLyBGYXN0IHBhdGggZm9yIDFEIHRlbnNvciBpbnB1dC5cbiAgICAgICAgICAgIGVsZW1lbnQgPSB2YWx1ZXNbaV0udG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGF4aXNWYWx1ZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IG0gPSAwOyBtIDwgbmV3U2hhcGVbMF07IG0rKykge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgbmV3U2hhcGVbMl07IG4rKykge1xuICAgICAgICAgICAgICAgICAgICBheGlzVmFsdWVzLnB1c2goaW5wdXRCdWZmZXIuZ2V0KG0sIGksIG4pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbGVtZW50ID0gYXhpc1ZhbHVlcy5qb2luKCcsJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRGVkdXAgYW5kIHVwZGF0ZSB2YXJpb3VzIGluZGljZXMuXG4gICAgICAgIGlmICh1bmlxdWVFbGVtZW50c1tlbGVtZW50XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpbmRpY2VzW2ldID0gdW5pcXVlRWxlbWVudHNbZWxlbWVudF07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB1bmlxdWVJbmRleCA9IE9iamVjdC5rZXlzKHVuaXF1ZUVsZW1lbnRzKS5sZW5ndGg7XG4gICAgICAgICAgICB1bmlxdWVFbGVtZW50c1tlbGVtZW50XSA9IHVuaXF1ZUluZGV4O1xuICAgICAgICAgICAgaW5kaWNlc1tpXSA9IHVuaXF1ZUluZGV4O1xuICAgICAgICAgICAgdW5pcXVlSW5kaWNlcy5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIE5vdyB3ZSBrbm93IHdoZXJlIGVhY2ggb2YgdGhlIHVuaXF1ZSBlbGVtZW50cyBhcmUgbG9jYXRlZCBhbG9uZyB0aGUgYXhpc1xuICAgIC8vICh1bmlxdWVJbmRpY2VzKS4gRXh0cmFjdCB0aGVtIGZyb20gaW5wdXQgYnVmZmVyIGFuZCBzdG9yZSB0aGVtIGluIHRoZVxuICAgIC8vIG91dHB1dCBidWZmZXIuXG4gICAgY29uc3Qgb3V0cHV0VG1wU2hhcGUgPSBuZXdTaGFwZS5zbGljZSgpO1xuICAgIG91dHB1dFRtcFNoYXBlWzFdID0gT2JqZWN0LmtleXModW5pcXVlRWxlbWVudHMpLmxlbmd0aDtcbiAgICBjb25zdCBvdXRwdXRCdWZmZXIgPSBuZXcgVGVuc29yQnVmZmVyKG91dHB1dFRtcFNoYXBlLCBkdHlwZSk7XG4gICAgdW5pcXVlSW5kaWNlcy5mb3JFYWNoKCh1bmlxdWVFbGVtZW50SW5kZXgsIGkpID0+IHtcbiAgICAgICAgZm9yIChsZXQgbSA9IDA7IG0gPCBuZXdTaGFwZVswXTsgbSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IG5ld1NoYXBlWzJdOyBuKyspIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXIuc2V0KGlucHV0QnVmZmVyLmdldChtLCB1bmlxdWVFbGVtZW50SW5kZXgsIG4pLCBtLCBpLCBuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIC8vIFRoZSBvdXRwdXQgc2hhcGUgY2FuIGJlIGNhbGN1bGF0ZWQgZnJvbSB0aGUgaW5wdXQgc2hhcGUgd2l0aCB0aGUgc2l6ZSBvZlxuICAgIC8vIHRoZSBnaXZlbiBheGlzIHJlcGxhY2VkIGJ5IHRoZSBudW1iZXIgb2YgdW5pcXVlIGVsZW1lbnRzIGFsb25nIHRoYXQgYXhpcy5cbiAgICBjb25zdCBvdXRwdXRTaGFwZSA9IHNoYXBlLnNsaWNlKCk7XG4gICAgb3V0cHV0U2hhcGVbJGF4aXNdID0gb3V0cHV0VG1wU2hhcGVbMV07XG4gICAgcmV0dXJuIHtcbiAgICAgICAgb3V0cHV0VmFsdWVzOiBvdXRwdXRCdWZmZXIudmFsdWVzLFxuICAgICAgICBvdXRwdXRTaGFwZSxcbiAgICAgICAgaW5kaWNlcyxcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VW5pcXVlX2ltcGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgVW5wYWNrIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHsgc2xpY2UgfSBmcm9tICcuL1NsaWNlJztcbmV4cG9ydCBmdW5jdGlvbiB1bnBhY2soYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHZhbHVlIH0gPSBpbnB1dHM7XG4gICAgbGV0IHsgYXhpcyB9ID0gYXR0cnM7XG4gICAgaWYgKGF4aXMgPCAwKSB7XG4gICAgICAgIGF4aXMgKz0gdmFsdWUuc2hhcGUubGVuZ3RoO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZVJhbmsgPSB2YWx1ZS5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgbnVtID0gdmFsdWUuc2hhcGVbYXhpc107XG4gICAgY29uc3Qgb3V0U2hhcGUgPSBuZXcgQXJyYXkodmFsdWVSYW5rIC0gMSk7XG4gICAgbGV0IG91dEluZGV4ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlUmFuazsgaSsrKSB7XG4gICAgICAgIGlmIChpICE9PSBheGlzKSB7XG4gICAgICAgICAgICBvdXRTaGFwZVtvdXRJbmRleCsrXSA9IHZhbHVlLnNoYXBlW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGJlZ2luID0gbmV3IEFycmF5KHZhbHVlUmFuaykuZmlsbCgwKTtcbiAgICBjb25zdCBzaXplID0gdmFsdWUuc2hhcGUuc2xpY2UoKTtcbiAgICBzaXplW2F4aXNdID0gMTtcbiAgICBjb25zdCByZXMgPSBuZXcgQXJyYXkobnVtKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBiZWdpbltheGlzXSA9IGk7XG4gICAgICAgIGNvbnN0IHRlbXBSZXMgPSBzbGljZSh7IGlucHV0czogeyB4OiB2YWx1ZSB9LCBiYWNrZW5kLCBhdHRyczogeyBiZWdpbiwgc2l6ZSB9IH0pO1xuICAgICAgICByZXNbaV0gPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHRlbXBSZXMgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IG91dFNoYXBlIH0gfSk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odGVtcFJlcyk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5leHBvcnQgY29uc3QgdW5wYWNrQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFVucGFjayxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogdW5wYWNrXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VW5wYWNrLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFVuc29ydGVkU2VnbWVudFN1bSwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHsgY2FzdCB9IGZyb20gJy4vQ2FzdCc7XG5pbXBvcnQgeyBlcXVhbCB9IGZyb20gJy4vRXF1YWwnO1xuaW1wb3J0IHsgZXhwYW5kRGltcyB9IGZyb20gJy4vRXhwYW5kRGltcyc7XG5pbXBvcnQgeyBtdWx0aXBseSB9IGZyb20gJy4vTXVsdGlwbHknO1xuaW1wb3J0IHsgcGFjayB9IGZyb20gJy4vUGFjayc7XG5pbXBvcnQgeyBzdW0gfSBmcm9tICcuL1N1bSc7XG5leHBvcnQgZnVuY3Rpb24gdW5zb3J0ZWRTZWdtZW50U3VtKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4LCBzZWdtZW50SWRzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBudW1TZWdtZW50cyB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleCh4LCAndW5zb3J0ZWRTZWdtZW50U3VtJyk7XG4gICAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBzZWdtZW50SWRzUmFuayA9IHNlZ21lbnRJZHMuc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IHJlcyA9IFtdO1xuICAgIGNvbnN0IGludGVybWVkaWF0ZXMgPSBbXTtcbiAgICAvLyBSZXNoYXBlIHRoZSBzZWdtZW50IGlkJ3Mgc28gdGhhdCB0aGV5IGNhbiBiZSBicm9hZGNhc3Qgd2l0aFxuICAgIC8vIHguIFRoZSBuZXcgc2hhcGUgc2hvdWxkIGJlIFtzZWdtZW50SWRzLnNoYXBlLCAxLCAuLi4sIDFdXG4gICAgY29uc3QgbnVtSXRlcnMgPSB4UmFuayAtIHNlZ21lbnRJZHNSYW5rO1xuICAgIGxldCAkc2VnbWVudElkcyA9IHNlZ21lbnRJZHM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1JdGVyczsgKytpKSB7XG4gICAgICAgIGNvbnN0IGV4cGFuZGVkID0gZXhwYW5kRGltcyh7IGlucHV0czogeyBpbnB1dDogJHNlZ21lbnRJZHMgfSwgYmFja2VuZCwgYXR0cnM6IHsgZGltOiBpICsgMSB9IH0pO1xuICAgICAgICAkc2VnbWVudElkcyA9IGV4cGFuZGVkO1xuICAgICAgICBpbnRlcm1lZGlhdGVzLnB1c2goZXhwYW5kZWQpO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVNlZ21lbnRzOyArK2kpIHtcbiAgICAgICAgY29uc3Qgc2NhbGFyVmFsdWUgPSB1dGlsLmNyZWF0ZVNjYWxhclZhbHVlKGksICdpbnQzMicpO1xuICAgICAgICBjb25zdCBzZWdtZW50SWQgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtdLCAnaW50MzInLCBzY2FsYXJWYWx1ZSk7XG4gICAgICAgIGNvbnN0IG1hc2sgPSBlcXVhbCh7IGlucHV0czogeyBhOiBzZWdtZW50SWQsIGI6ICRzZWdtZW50SWRzIH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIGNvbnN0IG1hc2tDYXN0ZWQgPSBjYXN0KHsgaW5wdXRzOiB7IHg6IG1hc2sgfSwgYmFja2VuZCwgYXR0cnM6IHsgZHR5cGU6ICdmbG9hdDMyJyB9IH0pO1xuICAgICAgICBjb25zdCBtdWwgPSBtdWx0aXBseSh7IGlucHV0czogeyBhOiBtYXNrQ2FzdGVkLCBiOiB4IH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIGNvbnN0IHN1bVRlbnNvckluZm8gPSBzdW0oeyBpbnB1dHM6IHsgeDogbXVsIH0sIGJhY2tlbmQsIGF0dHJzOiB7IGF4aXM6IDAsIGtlZXBEaW1zOiBmYWxzZSB9IH0pO1xuICAgICAgICByZXMucHVzaChzdW1UZW5zb3JJbmZvKTtcbiAgICAgICAgaW50ZXJtZWRpYXRlcy5wdXNoKHNlZ21lbnRJZCk7XG4gICAgICAgIGludGVybWVkaWF0ZXMucHVzaChtYXNrKTtcbiAgICAgICAgaW50ZXJtZWRpYXRlcy5wdXNoKG1hc2tDYXN0ZWQpO1xuICAgICAgICBpbnRlcm1lZGlhdGVzLnB1c2gobXVsKTtcbiAgICAgICAgaW50ZXJtZWRpYXRlcy5wdXNoKHN1bVRlbnNvckluZm8pO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBwYWNrKHsgaW5wdXRzOiByZXMsIGJhY2tlbmQsIGF0dHJzOiB7IGF4aXM6IDAgfSB9KTtcbiAgICBpbnRlcm1lZGlhdGVzLmZvckVhY2godCA9PiBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHQpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGNvbnN0IHVuc29ydGVkU2VnbWVudFN1bUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBVbnNvcnRlZFNlZ21lbnRTdW0sXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHVuc29ydGVkU2VnbWVudFN1bVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVVuc29ydGVkU2VnbWVudFN1bS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBaZXJvc0xpa2UgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY29tcGxleCB9IGZyb20gJy4vQ29tcGxleCc7XG5pbXBvcnQgeyBmaWxsIH0gZnJvbSAnLi9GaWxsJztcbmltcG9ydCB7IGltYWcgfSBmcm9tICcuL0ltYWcnO1xuaW1wb3J0IHsgcmVhbCB9IGZyb20gJy4vUmVhbCc7XG5leHBvcnQgZnVuY3Rpb24gemVyb3NMaWtlKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBpZiAoeC5kdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd6ZXJvc0xpa2UgaXMgbm90IHN1cHBvcnRlZCBmb3Igc3RyaW5nIHRlbnNvcnMnKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoeC5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgY29uc3QgcmVhbFBhcnQgPSByZWFsKHsgaW5wdXRzOiB7IGlucHV0OiB4IH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIGNvbnN0IHIgPSB6ZXJvc0xpa2UoeyBpbnB1dHM6IHsgeDogcmVhbFBhcnQgfSwgYmFja2VuZCB9KTtcbiAgICAgICAgY29uc3QgaW1hZ1BhcnQgPSBpbWFnKHsgaW5wdXRzOiB7IGlucHV0OiB4IH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIGNvbnN0IGkgPSB6ZXJvc0xpa2UoeyBpbnB1dHM6IHsgeDogaW1hZ1BhcnQgfSwgYmFja2VuZCB9KTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY29tcGxleCh7IGlucHV0czogeyByZWFsOiByLCBpbWFnOiBpIH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVhbFBhcnQpO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHIpO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGltYWdQYXJ0KTtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBmaWxsKHsgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IHguc2hhcGUsIHZhbHVlOiAwLCBkdHlwZTogeC5kdHlwZSB9IH0pO1xuICAgIH1cbn1cbmV4cG9ydCBjb25zdCB6ZXJvc0xpa2VDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogWmVyb3NMaWtlLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiB6ZXJvc0xpa2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1aZXJvc0xpa2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IF9GdXNlZE1hdE11bCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhcHBseUFjdGl2YXRpb24gfSBmcm9tICcuLi91dGlscy9mdXNlZF91dGlscyc7XG5pbXBvcnQgeyBhZGQgfSBmcm9tICcuL0FkZCc7XG5pbXBvcnQgeyBiYXRjaE1hdE11bCB9IGZyb20gJy4vQmF0Y2hNYXRNdWwnO1xuZXhwb3J0IGZ1bmN0aW9uIF9mdXNlZE1hdE11bChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgYSwgYiwgYmlhcywgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgdHJhbnNwb3NlQSwgdHJhbnNwb3NlQiwgYWN0aXZhdGlvbiwgbGVha3lyZWx1QWxwaGEgfSA9IGF0dHJzO1xuICAgIGxldCBjdXJyZW50O1xuICAgIGxldCBhZGRSZXM7XG4gICAgbGV0IGFjdGl2YXRpb25SZXM7XG4gICAgY29uc3QgaW50ZXJtZWRpYXRlcyA9IFtdO1xuICAgIGNvbnN0IG1hdE11bFJlcyA9IGJhdGNoTWF0TXVsKHsgaW5wdXRzOiB7IGEsIGIgfSwgYXR0cnM6IHsgdHJhbnNwb3NlQSwgdHJhbnNwb3NlQiB9LCBiYWNrZW5kIH0pO1xuICAgIGN1cnJlbnQgPSBtYXRNdWxSZXM7XG4gICAgaWYgKGJpYXMpIHtcbiAgICAgICAgYWRkUmVzID0gYWRkKHsgaW5wdXRzOiB7IGE6IGN1cnJlbnQsIGI6IGJpYXMgfSwgYmFja2VuZCB9KTtcbiAgICAgICAgaW50ZXJtZWRpYXRlcy5wdXNoKGN1cnJlbnQpO1xuICAgICAgICBjdXJyZW50ID0gYWRkUmVzO1xuICAgIH1cbiAgICBpZiAoYWN0aXZhdGlvbikge1xuICAgICAgICBhY3RpdmF0aW9uUmVzID0gYXBwbHlBY3RpdmF0aW9uKGJhY2tlbmQsIGN1cnJlbnQsIGFjdGl2YXRpb24sIHByZWx1QWN0aXZhdGlvbldlaWdodHMsIGxlYWt5cmVsdUFscGhhKTtcbiAgICAgICAgaW50ZXJtZWRpYXRlcy5wdXNoKGN1cnJlbnQpO1xuICAgICAgICBjdXJyZW50ID0gYWN0aXZhdGlvblJlcztcbiAgICB9XG4gICAgZm9yIChjb25zdCBpIG9mIGludGVybWVkaWF0ZXMpIHtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpKTtcbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnQ7XG59XG5leHBvcnQgY29uc3QgX2Z1c2VkTWF0TXVsQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IF9GdXNlZE1hdE11bCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogX2Z1c2VkTWF0TXVsLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPV9GdXNlZE1hdE11bC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vLyBXZSBleHBsaWNpdGx5IGltcG9ydCB0aGUgbW9kdWxhciBrZXJuZWxzIHNvIHRoZXkgZ2V0IHJlZ2lzdGVyZWQgaW4gdGhlXG4vLyBnbG9iYWwgcmVnaXN0cnkgd2hlbiB3ZSBjb21waWxlIHRoZSBsaWJyYXJ5LiBBIG1vZHVsYXIgYnVpbGQgd291bGQgcmVwbGFjZVxuLy8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhbmQgaW1wb3J0IG9ubHkgdGhlIGtlcm5lbHMgdGhhdCBhcmUgbmVlZGVkLlxuaW1wb3J0IHsgcmVnaXN0ZXJLZXJuZWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgX2Z1c2VkTWF0TXVsQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL19GdXNlZE1hdE11bCc7XG5pbXBvcnQgeyBhYnNDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQWJzJztcbmltcG9ydCB7IGFjb3NDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQWNvcyc7XG5pbXBvcnQgeyBhY29zaENvbmZpZyB9IGZyb20gJy4va2VybmVscy9BY29zaCc7XG5pbXBvcnQgeyBhZGRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQWRkJztcbmltcG9ydCB7IGFkZE5Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvQWRkTic7XG5pbXBvcnQgeyBhbGxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQWxsJztcbmltcG9ydCB7IGFueUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9BbnknO1xuaW1wb3J0IHsgYXJnTWF4Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0FyZ01heCc7XG5pbXBvcnQgeyBhcmdNaW5Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvQXJnTWluJztcbmltcG9ydCB7IGFzaW5Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvQXNpbic7XG5pbXBvcnQgeyBhc2luaENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Bc2luaCc7XG5pbXBvcnQgeyBhdGFuQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0F0YW4nO1xuaW1wb3J0IHsgYXRhbjJDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQXRhbjInO1xuaW1wb3J0IHsgYXRhbmhDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQXRhbmgnO1xuaW1wb3J0IHsgYXZnUG9vbENvbmZpZyB9IGZyb20gJy4va2VybmVscy9BdmdQb29sJztcbmltcG9ydCB7IGF2Z1Bvb2wzRENvbmZpZyB9IGZyb20gJy4va2VybmVscy9BdmdQb29sM0QnO1xuaW1wb3J0IHsgYXZnUG9vbDNER3JhZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9BdmdQb29sM0RHcmFkJztcbmltcG9ydCB7IGF2Z1Bvb2xHcmFkQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0F2Z1Bvb2xHcmFkJztcbmltcG9ydCB7IGJhdGNoTWF0TXVsQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0JhdGNoTWF0TXVsJztcbmltcG9ydCB7IGJhdGNoTm9ybUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9CYXRjaE5vcm0nO1xuaW1wb3J0IHsgYmF0Y2hUb1NwYWNlTkRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQmF0Y2hUb1NwYWNlTkQnO1xuaW1wb3J0IHsgYmluY291bnRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQmluY291bnQnO1xuaW1wb3J0IHsgY2FzdENvbmZpZyB9IGZyb20gJy4va2VybmVscy9DYXN0JztcbmltcG9ydCB7IGNlaWxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQ2VpbCc7XG5pbXBvcnQgeyBjbGlwQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0NsaXAnO1xuaW1wb3J0IHsgY29tcGxleENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Db21wbGV4JztcbmltcG9ydCB7IGNvbXBsZXhBYnNDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQ29tcGxleEFicyc7XG5pbXBvcnQgeyBjb25jYXRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQ29uY2F0JztcbmltcG9ydCB7IGNvbnYyRENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Db252MkQnO1xuaW1wb3J0IHsgY29udjJEQmFja3Byb3BGaWx0ZXJDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQ29udjJEQmFja3Byb3BGaWx0ZXInO1xuaW1wb3J0IHsgY29udjJEQmFja3Byb3BJbnB1dENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Db252MkRCYWNrcHJvcElucHV0JztcbmltcG9ydCB7IGNvbnYzRENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Db252M0QnO1xuaW1wb3J0IHsgY29udjNEQmFja3Byb3BGaWx0ZXJWMkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9Db252M0RCYWNrcHJvcEZpbHRlclYyJztcbmltcG9ydCB7IGNvbnYzREJhY2twcm9wSW5wdXRWMkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9Db252M0RCYWNrcHJvcElucHV0VjInO1xuaW1wb3J0IHsgY29zQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0Nvcyc7XG5pbXBvcnQgeyBjb3NoQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0Nvc2gnO1xuaW1wb3J0IHsgY3JvcEFuZFJlc2l6ZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9Dcm9wQW5kUmVzaXplJztcbmltcG9ydCB7IGN1bXN1bUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9DdW1zdW0nO1xuaW1wb3J0IHsgZGVuc2VCaW5jb3VudENvbmZpZyB9IGZyb20gJy4va2VybmVscy9EZW5zZUJpbmNvdW50JztcbmltcG9ydCB7IGRlcHRoVG9TcGFjZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9EZXB0aFRvU3BhY2UnO1xuaW1wb3J0IHsgZGVwdGh3aXNlQ29udjJkTmF0aXZlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0RlcHRod2lzZUNvbnYyZE5hdGl2ZSc7XG5pbXBvcnQgeyBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlckNvbmZpZyB9IGZyb20gJy4va2VybmVscy9EZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlcic7XG5pbXBvcnQgeyBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0RlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXQnO1xuaW1wb3J0IHsgZGlhZ0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9EaWFnJztcbmltcG9ydCB7IGRpbGF0aW9uMmRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRGlsYXRpb24yRCc7XG5pbXBvcnQgeyBkaWxhdGlvbjJkQmFja3Byb3BGaWx0ZXJDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRGlsYXRpb24yREJhY2twcm9wRmlsdGVyJztcbmltcG9ydCB7IGRpbGF0aW9uMmRCYWNrcHJvcElucHV0Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0RpbGF0aW9uMkRCYWNrcHJvcElucHV0JztcbmltcG9ydCB7IGVpbnN1bUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9FaW5zdW0nO1xuaW1wb3J0IHsgZWx1Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0VsdSc7XG5pbXBvcnQgeyBlbHVHcmFkQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0VsdUdyYWQnO1xuaW1wb3J0IHsgZXF1YWxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRXF1YWwnO1xuaW1wb3J0IHsgZXJmQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0VyZic7XG5pbXBvcnQgeyBleHBDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRXhwJztcbmltcG9ydCB7IGV4cGFuZERpbXNDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRXhwYW5kRGltcyc7XG5pbXBvcnQgeyBleHBtMUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9FeHBtMSc7XG5pbXBvcnQgeyBmZnRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRkZUJztcbmltcG9ydCB7IGZpbGxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRmlsbCc7XG5pbXBvcnQgeyBmbGlwTGVmdFJpZ2h0Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0ZsaXBMZWZ0UmlnaHQnO1xuaW1wb3J0IHsgZmxvb3JDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRmxvb3InO1xuaW1wb3J0IHsgZmxvb3JEaXZDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRmxvb3JEaXYnO1xuaW1wb3J0IHsgZnVzZWRDb252MkRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRnVzZWRDb252MkQnO1xuaW1wb3J0IHsgZnVzZWREZXB0aHdpc2VDb252MkRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRnVzZWREZXB0aHdpc2VDb252MkQnO1xuaW1wb3J0IHsgZ2F0aGVyTmRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvR2F0aGVyTmQnO1xuaW1wb3J0IHsgZ2F0aGVyVjJDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvR2F0aGVyVjInO1xuaW1wb3J0IHsgZ3JlYXRlckNvbmZpZyB9IGZyb20gJy4va2VybmVscy9HcmVhdGVyJztcbmltcG9ydCB7IGdyZWF0ZXJFcXVhbENvbmZpZyB9IGZyb20gJy4va2VybmVscy9HcmVhdGVyRXF1YWwnO1xuaW1wb3J0IHsgaWRlbnRpdHlDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvSWRlbnRpdHknO1xuaW1wb3J0IHsgaWZmdENvbmZpZyB9IGZyb20gJy4va2VybmVscy9JRkZUJztcbmltcG9ydCB7IGltYWdDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvSW1hZyc7XG5pbXBvcnQgeyBpc0Zpbml0ZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9Jc0Zpbml0ZSc7XG5pbXBvcnQgeyBpc0luZkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9Jc0luZic7XG5pbXBvcnQgeyBpc05hTkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9Jc05hTic7XG5pbXBvcnQgeyBsZWFreVJlbHVDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTGVha3lSZWx1JztcbmltcG9ydCB7IGxlc3NDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTGVzcyc7XG5pbXBvcnQgeyBsZXNzRXF1YWxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTGVzc0VxdWFsJztcbmltcG9ydCB7IGxpblNwYWNlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0xpblNwYWNlJztcbmltcG9ydCB7IGxvZ0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9Mb2cnO1xuaW1wb3J0IHsgbG9nMXBDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTG9nMXAnO1xuaW1wb3J0IHsgbG9naWNhbEFuZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Mb2dpY2FsQW5kJztcbmltcG9ydCB7IGxvZ2ljYWxOb3RDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTG9naWNhbE5vdCc7XG5pbXBvcnQgeyBsb2dpY2FsT3JDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTG9naWNhbE9yJztcbmltcG9ydCB7IGxSTkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9MUk4nO1xuaW1wb3J0IHsgbFJOR3JhZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9MUk5HcmFkJztcbmltcG9ydCB7IG1heENvbmZpZyB9IGZyb20gJy4va2VybmVscy9NYXgnO1xuaW1wb3J0IHsgbWF4aW11bUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9NYXhpbXVtJztcbmltcG9ydCB7IG1heFBvb2xDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTWF4UG9vbCc7XG5pbXBvcnQgeyBtYXhQb29sM0RDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTWF4UG9vbDNEJztcbmltcG9ydCB7IG1heFBvb2wzREdyYWRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTWF4UG9vbDNER3JhZCc7XG5pbXBvcnQgeyBtYXhQb29sR3JhZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9NYXhQb29sR3JhZCc7XG5pbXBvcnQgeyBtYXhQb29sV2l0aEFyZ21heENvbmZpZyB9IGZyb20gJy4va2VybmVscy9NYXhQb29sV2l0aEFyZ21heCc7XG5pbXBvcnQgeyBtZWFuQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL01lYW4nO1xuaW1wb3J0IHsgbWluQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL01pbic7XG5pbXBvcnQgeyBtaW5pbXVtQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL01pbmltdW0nO1xuaW1wb3J0IHsgbWlycm9yUGFkQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL01pcnJvclBhZCc7XG5pbXBvcnQgeyBtb2RDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTW9kJztcbmltcG9ydCB7IG11bHRpbm9taWFsQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL011bHRpbm9taWFsJztcbmltcG9ydCB7IG11bHRpcGx5Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL011bHRpcGx5JztcbmltcG9ydCB7IG5lZ0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9OZWcnO1xuaW1wb3J0IHsgbm9uTWF4U3VwcHJlc3Npb25WM0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9Ob25NYXhTdXBwcmVzc2lvblYzJztcbmltcG9ydCB7IG5vbk1heFN1cHByZXNzaW9uVjRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTm9uTWF4U3VwcHJlc3Npb25WNCc7XG5pbXBvcnQgeyBub25NYXhTdXBwcmVzc2lvblY1Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL05vbk1heFN1cHByZXNzaW9uVjUnO1xuaW1wb3J0IHsgbm90RXF1YWxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTm90RXF1YWwnO1xuaW1wb3J0IHsgb25lSG90Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL09uZUhvdCc7XG5pbXBvcnQgeyBvbmVzTGlrZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9PbmVzTGlrZSc7XG5pbXBvcnQgeyBwYWNrQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1BhY2snO1xuaW1wb3J0IHsgcGFkVjJDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUGFkVjInO1xuaW1wb3J0IHsgcG93Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1Bvdyc7XG5pbXBvcnQgeyBwcmVsdUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9QcmVsdSc7XG5pbXBvcnQgeyBwcm9kQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1Byb2QnO1xuaW1wb3J0IHsgcmFuZ2VDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUmFuZ2UnO1xuaW1wb3J0IHsgcmVhbENvbmZpZyB9IGZyb20gJy4va2VybmVscy9SZWFsJztcbmltcG9ydCB7IHJlYWxEaXZDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUmVhbERpdic7XG5pbXBvcnQgeyByZWNpcHJvY2FsQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1JlY2lwcm9jYWwnO1xuaW1wb3J0IHsgcmVsdUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9SZWx1JztcbmltcG9ydCB7IHJlbHU2Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1JlbHU2JztcbmltcG9ydCB7IHJlc2hhcGVDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUmVzaGFwZSc7XG5pbXBvcnQgeyByZXNpemVCaWxpbmVhckNvbmZpZyB9IGZyb20gJy4va2VybmVscy9SZXNpemVCaWxpbmVhcic7XG5pbXBvcnQgeyByZXNpemVCaWxpbmVhckdyYWRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUmVzaXplQmlsaW5lYXJHcmFkJztcbmltcG9ydCB7IHJlc2l6ZU5lYXJlc3ROZWlnaGJvckNvbmZpZyB9IGZyb20gJy4va2VybmVscy9SZXNpemVOZWFyZXN0TmVpZ2hib3InO1xuaW1wb3J0IHsgcmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9SZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkJztcbmltcG9ydCB7IHJldmVyc2VDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUmV2ZXJzZSc7XG5pbXBvcnQgeyByb3RhdGVXaXRoT2Zmc2V0Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1JvdGF0ZVdpdGhPZmZzZXQnO1xuaW1wb3J0IHsgcm91bmRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUm91bmQnO1xuaW1wb3J0IHsgcnNxcnRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUnNxcnQnO1xuaW1wb3J0IHsgc2NhdHRlck5kQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NjYXR0ZXJOZCc7XG5pbXBvcnQgeyBzZWxlY3RDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU2VsZWN0JztcbmltcG9ydCB7IHNlbHVDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU2VsdSc7XG5pbXBvcnQgeyBzaWdtb2lkQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NpZ21vaWQnO1xuaW1wb3J0IHsgc2lnbkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9TaWduJztcbmltcG9ydCB7IHNpbkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9TaW4nO1xuaW1wb3J0IHsgc2luaENvbmZpZyB9IGZyb20gJy4va2VybmVscy9TaW5oJztcbmltcG9ydCB7IHNsaWNlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NsaWNlJztcbmltcG9ydCB7IHNvZnRtYXhDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU29mdG1heCc7XG5pbXBvcnQgeyBzb2Z0cGx1c0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9Tb2Z0cGx1cyc7XG5pbXBvcnQgeyBzcGFjZVRvQmF0Y2hORENvbmZpZyB9IGZyb20gJy4va2VybmVscy9TcGFjZVRvQmF0Y2hORCc7XG5pbXBvcnQgeyBzcGFyc2VGaWxsRW1wdHlSb3dzQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NwYXJzZUZpbGxFbXB0eVJvd3MnO1xuaW1wb3J0IHsgc3BhcnNlUmVzaGFwZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9TcGFyc2VSZXNoYXBlJztcbmltcG9ydCB7IHNwYXJzZVNlZ21lbnRNZWFuQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NwYXJzZVNlZ21lbnRNZWFuJztcbmltcG9ydCB7IHNwYXJzZVNlZ21lbnRTdW1Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3BhcnNlU2VnbWVudFN1bSc7XG5pbXBvcnQgeyBzcGFyc2VUb0RlbnNlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NwYXJzZVRvRGVuc2UnO1xuaW1wb3J0IHsgc3BsaXRWQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NwbGl0Vic7XG5pbXBvcnQgeyBzcXJ0Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NxcnQnO1xuaW1wb3J0IHsgc3F1YXJlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NxdWFyZSc7XG5pbXBvcnQgeyBzcXVhcmVkRGlmZmVyZW5jZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9TcXVhcmVkRGlmZmVyZW5jZSc7XG5pbXBvcnQgeyBzdGVwQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1N0ZXAnO1xuaW1wb3J0IHsgc3RyaWRlZFNsaWNlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1N0cmlkZWRTbGljZSc7XG5pbXBvcnQgeyBzdHJpbmdOR3JhbXNDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3RyaW5nTkdyYW1zJztcbmltcG9ydCB7IHN0cmluZ1NwbGl0Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1N0cmluZ1NwbGl0JztcbmltcG9ydCB7IHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3RyaW5nVG9IYXNoQnVja2V0RmFzdCc7XG5pbXBvcnQgeyBzdWJDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3ViJztcbmltcG9ydCB7IHN1bUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9TdW0nO1xuaW1wb3J0IHsgdGFuQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1Rhbic7XG5pbXBvcnQgeyB0YW5oQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1RhbmgnO1xuaW1wb3J0IHsgdGlsZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9UaWxlJztcbmltcG9ydCB7IHRvcEtDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvVG9wSyc7XG5pbXBvcnQgeyB0cmFuc2Zvcm1Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvVHJhbnNmb3JtJztcbmltcG9ydCB7IHRyYW5zcG9zZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9UcmFuc3Bvc2UnO1xuaW1wb3J0IHsgdW5pcXVlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1VuaXF1ZSc7XG5pbXBvcnQgeyB1bnBhY2tDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvVW5wYWNrJztcbmltcG9ydCB7IHVuc29ydGVkU2VnbWVudFN1bUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9VbnNvcnRlZFNlZ21lbnRTdW0nO1xuaW1wb3J0IHsgemVyb3NMaWtlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1plcm9zTGlrZSc7XG4vLyBMaXN0IGFsbCBrZXJuZWwgY29uZmlncyBoZXJlXG5jb25zdCBrZXJuZWxDb25maWdzID0gW1xuICAgIF9mdXNlZE1hdE11bENvbmZpZyxcbiAgICBhYnNDb25maWcsXG4gICAgYWNvc0NvbmZpZyxcbiAgICBhY29zaENvbmZpZyxcbiAgICBhZGRDb25maWcsXG4gICAgYWRkTkNvbmZpZyxcbiAgICBhbGxDb25maWcsXG4gICAgYW55Q29uZmlnLFxuICAgIGFyZ01heENvbmZpZyxcbiAgICBhcmdNaW5Db25maWcsXG4gICAgYXNpbkNvbmZpZyxcbiAgICBhc2luaENvbmZpZyxcbiAgICBhdGFuQ29uZmlnLFxuICAgIGF0YW4yQ29uZmlnLFxuICAgIGF0YW5oQ29uZmlnLFxuICAgIGF2Z1Bvb2xDb25maWcsXG4gICAgYXZnUG9vbDNEQ29uZmlnLFxuICAgIGF2Z1Bvb2wzREdyYWRDb25maWcsXG4gICAgYXZnUG9vbEdyYWRDb25maWcsXG4gICAgYmF0Y2hNYXRNdWxDb25maWcsXG4gICAgYmF0Y2hOb3JtQ29uZmlnLFxuICAgIGJhdGNoVG9TcGFjZU5EQ29uZmlnLFxuICAgIGJpbmNvdW50Q29uZmlnLFxuICAgIGNhc3RDb25maWcsXG4gICAgY2VpbENvbmZpZyxcbiAgICBjbGlwQ29uZmlnLFxuICAgIGNvbXBsZXhDb25maWcsXG4gICAgY29tcGxleEFic0NvbmZpZyxcbiAgICBjb25jYXRDb25maWcsXG4gICAgY29udjJEQmFja3Byb3BGaWx0ZXJDb25maWcsXG4gICAgY29udjJEQmFja3Byb3BJbnB1dENvbmZpZyxcbiAgICBjb252MkRDb25maWcsXG4gICAgY29udjNEQmFja3Byb3BGaWx0ZXJWMkNvbmZpZyxcbiAgICBjb252M0RCYWNrcHJvcElucHV0VjJDb25maWcsXG4gICAgY29udjNEQ29uZmlnLFxuICAgIGNvc0NvbmZpZyxcbiAgICBjb3NoQ29uZmlnLFxuICAgIGNyb3BBbmRSZXNpemVDb25maWcsXG4gICAgY3Vtc3VtQ29uZmlnLFxuICAgIGRlbnNlQmluY291bnRDb25maWcsXG4gICAgZGVwdGhUb1NwYWNlQ29uZmlnLFxuICAgIGRlcHRod2lzZUNvbnYyZE5hdGl2ZUNvbmZpZyxcbiAgICBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlckNvbmZpZyxcbiAgICBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0Q29uZmlnLFxuICAgIGRpYWdDb25maWcsXG4gICAgZGlsYXRpb24yZENvbmZpZyxcbiAgICBkaWxhdGlvbjJkQmFja3Byb3BJbnB1dENvbmZpZyxcbiAgICBkaWxhdGlvbjJkQmFja3Byb3BGaWx0ZXJDb25maWcsXG4gICAgcmVhbERpdkNvbmZpZyxcbiAgICBlaW5zdW1Db25maWcsXG4gICAgZWx1Q29uZmlnLFxuICAgIGVsdUdyYWRDb25maWcsXG4gICAgZXF1YWxDb25maWcsXG4gICAgZXJmQ29uZmlnLFxuICAgIGV4cENvbmZpZyxcbiAgICBleHBhbmREaW1zQ29uZmlnLFxuICAgIGV4cG0xQ29uZmlnLFxuICAgIGZmdENvbmZpZyxcbiAgICBmaWxsQ29uZmlnLFxuICAgIGZsaXBMZWZ0UmlnaHRDb25maWcsXG4gICAgZmxvb3JDb25maWcsXG4gICAgZmxvb3JEaXZDb25maWcsXG4gICAgZnVzZWRDb252MkRDb25maWcsXG4gICAgZnVzZWREZXB0aHdpc2VDb252MkRDb25maWcsXG4gICAgZ2F0aGVyTmRDb25maWcsXG4gICAgZ2F0aGVyVjJDb25maWcsXG4gICAgZ3JlYXRlckNvbmZpZyxcbiAgICBncmVhdGVyRXF1YWxDb25maWcsXG4gICAgaWRlbnRpdHlDb25maWcsXG4gICAgaWZmdENvbmZpZyxcbiAgICBpbWFnQ29uZmlnLFxuICAgIGlzRmluaXRlQ29uZmlnLFxuICAgIGlzSW5mQ29uZmlnLFxuICAgIGlzTmFOQ29uZmlnLFxuICAgIGxlYWt5UmVsdUNvbmZpZyxcbiAgICBsZXNzQ29uZmlnLFxuICAgIGxlc3NFcXVhbENvbmZpZyxcbiAgICBsaW5TcGFjZUNvbmZpZyxcbiAgICBsb2dDb25maWcsXG4gICAgbG9nMXBDb25maWcsXG4gICAgbG9naWNhbEFuZENvbmZpZyxcbiAgICBsb2dpY2FsTm90Q29uZmlnLFxuICAgIGxvZ2ljYWxPckNvbmZpZyxcbiAgICBsUk5Db25maWcsXG4gICAgbFJOR3JhZENvbmZpZyxcbiAgICBtYXhpbXVtQ29uZmlnLFxuICAgIG1heFBvb2xDb25maWcsXG4gICAgbWF4UG9vbDNEQ29uZmlnLFxuICAgIG1heFBvb2wzREdyYWRDb25maWcsXG4gICAgbWF4UG9vbEdyYWRDb25maWcsXG4gICAgbWF4UG9vbFdpdGhBcmdtYXhDb25maWcsXG4gICAgbWF4Q29uZmlnLFxuICAgIG1lYW5Db25maWcsXG4gICAgbWluQ29uZmlnLFxuICAgIG1pbmltdW1Db25maWcsXG4gICAgbWlycm9yUGFkQ29uZmlnLFxuICAgIG1vZENvbmZpZyxcbiAgICBtdWx0aW5vbWlhbENvbmZpZyxcbiAgICBtdWx0aXBseUNvbmZpZyxcbiAgICBuZWdDb25maWcsXG4gICAgbm9uTWF4U3VwcHJlc3Npb25WM0NvbmZpZyxcbiAgICBub25NYXhTdXBwcmVzc2lvblY0Q29uZmlnLFxuICAgIG5vbk1heFN1cHByZXNzaW9uVjVDb25maWcsXG4gICAgbm90RXF1YWxDb25maWcsXG4gICAgb25lSG90Q29uZmlnLFxuICAgIG9uZXNMaWtlQ29uZmlnLFxuICAgIHBhY2tDb25maWcsXG4gICAgcGFkVjJDb25maWcsXG4gICAgcG93Q29uZmlnLFxuICAgIHByZWx1Q29uZmlnLFxuICAgIHByb2RDb25maWcsXG4gICAgcmFuZ2VDb25maWcsXG4gICAgcmVhbENvbmZpZyxcbiAgICByZWNpcHJvY2FsQ29uZmlnLFxuICAgIHJlbHVDb25maWcsXG4gICAgcmVsdTZDb25maWcsXG4gICAgcmVzaGFwZUNvbmZpZyxcbiAgICByZXNpemVCaWxpbmVhckNvbmZpZyxcbiAgICByZXNpemVCaWxpbmVhckdyYWRDb25maWcsXG4gICAgcmVzaXplTmVhcmVzdE5laWdoYm9yQ29uZmlnLFxuICAgIHJlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWRDb25maWcsXG4gICAgcmV2ZXJzZUNvbmZpZyxcbiAgICByb3RhdGVXaXRoT2Zmc2V0Q29uZmlnLFxuICAgIHJvdW5kQ29uZmlnLFxuICAgIHJzcXJ0Q29uZmlnLFxuICAgIHNjYXR0ZXJOZENvbmZpZyxcbiAgICBzZWxlY3RDb25maWcsXG4gICAgc2VsdUNvbmZpZyxcbiAgICBzaWdtb2lkQ29uZmlnLFxuICAgIHNpZ25Db25maWcsXG4gICAgc2luQ29uZmlnLFxuICAgIHNpbmhDb25maWcsXG4gICAgc2xpY2VDb25maWcsXG4gICAgc29mdG1heENvbmZpZyxcbiAgICBzb2Z0cGx1c0NvbmZpZyxcbiAgICBzcGFjZVRvQmF0Y2hORENvbmZpZyxcbiAgICBzcGFyc2VGaWxsRW1wdHlSb3dzQ29uZmlnLFxuICAgIHNwYXJzZVJlc2hhcGVDb25maWcsXG4gICAgc3BhcnNlU2VnbWVudE1lYW5Db25maWcsXG4gICAgc3BhcnNlU2VnbWVudFN1bUNvbmZpZyxcbiAgICBzcGFyc2VUb0RlbnNlQ29uZmlnLFxuICAgIHNwbGl0VkNvbmZpZyxcbiAgICBzcXJ0Q29uZmlnLFxuICAgIHNxdWFyZUNvbmZpZyxcbiAgICBzcXVhcmVkRGlmZmVyZW5jZUNvbmZpZyxcbiAgICBzdGVwQ29uZmlnLFxuICAgIHN0cmlkZWRTbGljZUNvbmZpZyxcbiAgICBzdHJpbmdOR3JhbXNDb25maWcsXG4gICAgc3RyaW5nU3BsaXRDb25maWcsXG4gICAgc3RyaW5nVG9IYXNoQnVja2V0RmFzdENvbmZpZyxcbiAgICBzdWJDb25maWcsXG4gICAgc3VtQ29uZmlnLFxuICAgIHRhbkNvbmZpZyxcbiAgICB0YW5oQ29uZmlnLFxuICAgIHRpbGVDb25maWcsXG4gICAgdG9wS0NvbmZpZyxcbiAgICB0cmFuc3Bvc2VDb25maWcsXG4gICAgdHJhbnNmb3JtQ29uZmlnLFxuICAgIHVuaXF1ZUNvbmZpZyxcbiAgICB1bnBhY2tDb25maWcsXG4gICAgdW5zb3J0ZWRTZWdtZW50U3VtQ29uZmlnLFxuICAgIHplcm9zTGlrZUNvbmZpZ1xuXTtcbmZvciAoY29uc3Qga2VybmVsQ29uZmlnIG9mIGtlcm5lbENvbmZpZ3MpIHtcbiAgICByZWdpc3Rlcktlcm5lbChrZXJuZWxDb25maWcpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVnaXN0ZXJfYWxsX2tlcm5lbHMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLy8gU2hhcmVkIGZ1bmN0aW9uYWxpdHkgYW1vbmcgYmFja2VuZHMuXG5leHBvcnQgeyBzaW1wbGVBYnNJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL0Ficyc7XG5leHBvcnQgeyBhZGRJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL0FkZCc7XG5leHBvcnQgeyBiaW5jb3VudEltcGwsIGJpbmNvdW50UmVkdWNlSW1wbCB9IGZyb20gJy4va2VybmVscy9CaW5jb3VudF9pbXBsJztcbmV4cG9ydCB7IGNlaWxJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL0NlaWwnO1xuZXhwb3J0IHsgY29uY2F0SW1wbCB9IGZyb20gJy4va2VybmVscy9Db25jYXRfaW1wbCc7XG5leHBvcnQgeyBlcXVhbEltcGwgfSBmcm9tICcuL2tlcm5lbHMvRXF1YWwnO1xuZXhwb3J0IHsgZXhwSW1wbCB9IGZyb20gJy4va2VybmVscy9FeHAnO1xuZXhwb3J0IHsgZXhwbTFJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL0V4cG0xJztcbmV4cG9ydCB7IGZsb29ySW1wbCB9IGZyb20gJy4va2VybmVscy9GbG9vcic7XG5leHBvcnQgeyBnYXRoZXJOZEltcGwgfSBmcm9tICcuL2tlcm5lbHMvR2F0aGVyTmRfSW1wbCc7XG5leHBvcnQgeyBnYXRoZXJWMkltcGwgfSBmcm9tICcuL2tlcm5lbHMvR2F0aGVyVjJfaW1wbCc7XG5leHBvcnQgeyBncmVhdGVySW1wbCB9IGZyb20gJy4va2VybmVscy9HcmVhdGVyJztcbmV4cG9ydCB7IGdyZWF0ZXJFcXVhbEltcGwgfSBmcm9tICcuL2tlcm5lbHMvR3JlYXRlckVxdWFsJztcbmV4cG9ydCB7IGxlc3NJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL0xlc3MnO1xuZXhwb3J0IHsgbGVzc0VxdWFsSW1wbCB9IGZyb20gJy4va2VybmVscy9MZXNzRXF1YWwnO1xuZXhwb3J0IHsgbGluU3BhY2VJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL0xpblNwYWNlX2ltcGwnO1xuZXhwb3J0IHsgbG9nSW1wbCB9IGZyb20gJy4va2VybmVscy9Mb2cnO1xuZXhwb3J0IHsgbWF4SW1wbCB9IGZyb20gJy4va2VybmVscy9NYXhfaW1wbCc7XG5leHBvcnQgeyBtYXhpbXVtSW1wbCB9IGZyb20gJy4va2VybmVscy9NYXhpbXVtJztcbmV4cG9ydCB7IG1pbmltdW1JbXBsIH0gZnJvbSAnLi9rZXJuZWxzL01pbmltdW0nO1xuZXhwb3J0IHsgbXVsdGlwbHlJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL011bHRpcGx5JztcbmV4cG9ydCB7IG5lZ0ltcGwgfSBmcm9tICcuL2tlcm5lbHMvTmVnJztcbmV4cG9ydCB7IG5vdEVxdWFsSW1wbCB9IGZyb20gJy4va2VybmVscy9Ob3RFcXVhbCc7XG5leHBvcnQgeyBwcm9kSW1wbCB9IGZyb20gJy4va2VybmVscy9Qcm9kJztcbmV4cG9ydCB7IHJhbmdlSW1wbCB9IGZyb20gJy4va2VybmVscy9SYW5nZV9pbXBsJztcbmV4cG9ydCB7IHJzcXJ0SW1wbCB9IGZyb20gJy4va2VybmVscy9Sc3FydCc7XG5leHBvcnQgeyBzbGljZUltcGwgfSBmcm9tICcuL2tlcm5lbHMvU2xpY2UnO1xuZXhwb3J0IHsgc3BhcnNlRmlsbEVtcHR5Um93c0ltcGwgfSBmcm9tICcuL2tlcm5lbHMvU3BhcnNlRmlsbEVtcHR5Um93c19pbXBsJztcbmV4cG9ydCB7IHNwYXJzZVJlc2hhcGVJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL1NwYXJzZVJlc2hhcGVfaW1wbCc7XG5leHBvcnQgeyBzcGFyc2VTZWdtZW50UmVkdWN0aW9uSW1wbCB9IGZyb20gJy4va2VybmVscy9TcGFyc2VTZWdtZW50UmVkdWN0aW9uX2ltcGwnO1xuZXhwb3J0IHsgc3F1YXJlZERpZmZlcmVuY2VJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL1NxdWFyZWREaWZmZXJlbmNlJztcbmV4cG9ydCB7IHN0cmlkZWRTbGljZUltcGwgfSBmcm9tICcuL2tlcm5lbHMvU3RyaWRlZFNsaWNlX2ltcGwnO1xuZXhwb3J0IHsgc3RyaW5nTkdyYW1zSW1wbCB9IGZyb20gJy4va2VybmVscy9TdHJpbmdOR3JhbXNfaW1wbCc7XG5leHBvcnQgeyBzdHJpbmdTcGxpdEltcGwgfSBmcm9tICcuL2tlcm5lbHMvU3RyaW5nU3BsaXRfaW1wbCc7XG5leHBvcnQgeyBzdHJpbmdUb0hhc2hCdWNrZXRGYXN0SW1wbCB9IGZyb20gJy4va2VybmVscy9TdHJpbmdUb0hhc2hCdWNrZXRGYXN0X2ltcGwnO1xuZXhwb3J0IHsgc3ViSW1wbCB9IGZyb20gJy4va2VybmVscy9TdWInO1xuZXhwb3J0IHsgdGlsZUltcGwgfSBmcm9tICcuL2tlcm5lbHMvVGlsZV9pbXBsJztcbmV4cG9ydCB7IHRvcEtJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL1RvcEtfaW1wbCc7XG5leHBvcnQgeyB0cmFuc3Bvc2VJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL1RyYW5zcG9zZV9pbXBsJztcbmV4cG9ydCB7IHVuaXF1ZUltcGwgfSBmcm9tICcuL2tlcm5lbHMvVW5pcXVlX2ltcGwnO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2hhcmVkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG4vKipcbiAqIFRlbXBsYXRlIHRoYXQgY3JlYXRlcyBpbXBsZW1lbnRhdGlvbiBmb3IgYmluYXJ5IG9wcy4gU3VwcG9ydHMgYnJvYWRjYXN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbChvcCkge1xuICAgIHJldHVybiAoYVNoYXBlLCBiU2hhcGUsIGFWYWxzLCBiVmFscywgZHR5cGUpID0+IHtcbiAgICAgICAgY29uc3QgbmV3U2hhcGUgPSBiYWNrZW5kX3V0aWwuYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoYVNoYXBlLCBiU2hhcGUpO1xuICAgICAgICBjb25zdCByZXN1bHRSYW5rID0gbmV3U2hhcGUubGVuZ3RoO1xuICAgICAgICBjb25zdCByZXN1bHRTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhuZXdTaGFwZSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUobmV3U2hhcGUpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSB1dGlsLmdldFR5cGVkQXJyYXlGcm9tRFR5cGUoZHR5cGUsIHJlc3VsdFNpemUpO1xuICAgICAgICBjb25zdCBhUmFuayA9IGFTaGFwZS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGJSYW5rID0gYlNoYXBlLmxlbmd0aDtcbiAgICAgICAgY29uc3QgYVN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGFTaGFwZSk7XG4gICAgICAgIGNvbnN0IGJTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhiU2hhcGUpO1xuICAgICAgICBjb25zdCBhQnJvYWRjYXN0RGltcyA9IGJhY2tlbmRfdXRpbC5nZXRCcm9hZGNhc3REaW1zKGFTaGFwZSwgbmV3U2hhcGUpO1xuICAgICAgICBjb25zdCBiQnJvYWRjYXN0RGltcyA9IGJhY2tlbmRfdXRpbC5nZXRCcm9hZGNhc3REaW1zKGJTaGFwZSwgbmV3U2hhcGUpO1xuICAgICAgICBpZiAoYUJyb2FkY2FzdERpbXMubGVuZ3RoICsgYkJyb2FkY2FzdERpbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IG9wKGFWYWxzW2kgJSBhVmFscy5sZW5ndGhdLCBiVmFsc1tpICUgYlZhbHMubGVuZ3RoXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvYyA9IHV0aWwuaW5kZXhUb0xvYyhpLCByZXN1bHRSYW5rLCByZXN1bHRTdHJpZGVzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhTG9jID0gbG9jLnNsaWNlKC1hUmFuayk7XG4gICAgICAgICAgICAgICAgYUJyb2FkY2FzdERpbXMuZm9yRWFjaChkID0+IGFMb2NbZF0gPSAwKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhSW5kZXggPSB1dGlsLmxvY1RvSW5kZXgoYUxvYywgYVJhbmssIGFTdHJpZGVzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBiTG9jID0gbG9jLnNsaWNlKC1iUmFuayk7XG4gICAgICAgICAgICAgICAgYkJyb2FkY2FzdERpbXMuZm9yRWFjaChkID0+IGJMb2NbZF0gPSAwKTtcbiAgICAgICAgICAgICAgICBjb25zdCBiSW5kZXggPSB1dGlsLmxvY1RvSW5kZXgoYkxvYywgYlJhbmssIGJTdHJpZGVzKTtcbiAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBvcChhVmFsc1thSW5kZXhdLCBiVmFsc1tiSW5kZXhdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW3Jlc3VsdCwgbmV3U2hhcGVdO1xuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iaW5hcnlfaW1wbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7IGNhc3QgfSBmcm9tICcuLi9rZXJuZWxzL0Nhc3QnO1xuaW1wb3J0IHsgY29tcGxleCB9IGZyb20gJy4uL2tlcm5lbHMvQ29tcGxleCc7XG4vKipcbiAqIFRlbXBsYXRlIHRoYXQgY3JlYXRlcyBhIGBLZXJuZWxGdW5jYCBmb3IgYmluYXJ5IG9wcy5cbiAqIEBwYXJhbSBuYW1lIEtlcm5lbCBuYW1lLlxuICogQHBhcmFtIGJpbmFyeUtlcm5lbEltcGwgQSBgU2ltcGxlQmluYXJ5S2VybmVsSW1wbGAgZm9yIHRoZSBrZXJuZWwuXG4gKiBAcGFyYW0gYmluYXJ5S2VybmVsQ29tcGxleEltcGwgT3B0aW9uYWwuIElmIGV4aXN0cywgcmVwcmVzZW50cyBhXG4gKiAgICAgYENvbXBsZXhCaW5hcnlLZXJuZWxJbXBsYCBmb3IgdGhlIGtlcm5lbCwgd2lsbCBiZSB1c2VkIHdoZW4gaW5wdXQgZHR5cGVcbiAqICAgICBpcyBgY29tcGxleDY0YC5cbiAqIEBwYXJhbSBkdHlwZSBPcHRpb25hbC4gSWYgc2V0LCB0aGUgcmVzdWx0IGhhcyB0aGlzIGR0eXBlLiBPdGhlcndpc2UsIHRoZVxuICogICAgIHJlc3VsdCBoYXMgdGhlIHNhbWUgZHR5cGUgYXMgdGhlIGZpcnN0IGlucHV0LiBUaGlzIGlzIG1haW5seSB1c2VkIGluXG4gKiAgICAgY29tcGFyaXNvbiBrZXJuZWxzLCBzdWNoIGFzIEVxdWFsLCBMZXNzLCBHcmVhdGVyLCBldGMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiaW5hcnlLZXJuZWxGdW5jKG5hbWUsIHNpbXBsZUltcGwsIGNvbXBsZXhJbXBsLCBkdHlwZSkge1xuICAgIGlmIChjb21wbGV4SW1wbCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAoeyBpbnB1dHMsIGJhY2tlbmQgfSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBhLCBiIH0gPSBpbnB1dHM7XG4gICAgICAgICAgICBjb25zdCBjcHVCYWNrZW5kID0gYmFja2VuZDtcbiAgICAgICAgICAgIGFzc2VydE5vdENvbXBsZXgoW2EsIGJdLCBuYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IGFWYWxzID0gY3B1QmFja2VuZC5kYXRhLmdldChhLmRhdGFJZCkudmFsdWVzO1xuICAgICAgICAgICAgY29uc3QgYlZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KGIuZGF0YUlkKS52YWx1ZXM7XG4gICAgICAgICAgICBjb25zdCBkZWNvZGVkQVZhbHMgPSBhLmR0eXBlID09PSAnc3RyaW5nJyA/XG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1hbnlcbiAgICAgICAgICAgICAgICBiYWNrZW5kX3V0aWwuZnJvbVVpbnQ4VG9TdHJpbmdBcnJheShhVmFscykgOlxuICAgICAgICAgICAgICAgIGFWYWxzO1xuICAgICAgICAgICAgY29uc3QgZGVjb2RlZEJWYWxzID0gYS5kdHlwZSA9PT0gJ3N0cmluZycgP1xuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tYW55XG4gICAgICAgICAgICAgICAgYmFja2VuZF91dGlsLmZyb21VaW50OFRvU3RyaW5nQXJyYXkoYlZhbHMpIDpcbiAgICAgICAgICAgICAgICBiVmFscztcbiAgICAgICAgICAgIGNvbnN0ICRkdHlwZSA9IGR0eXBlIHx8IGEuZHR5cGU7XG4gICAgICAgICAgICBjb25zdCBbcmVzdWx0RGF0YSwgcmVzdWx0U2hhcGVdID0gc2ltcGxlSW1wbChhLnNoYXBlLCBiLnNoYXBlLCBkZWNvZGVkQVZhbHMsIGRlY29kZWRCVmFscywgJGR0eXBlKTtcbiAgICAgICAgICAgIHJldHVybiBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHJlc3VsdFNoYXBlLCAkZHR5cGUsIHJlc3VsdERhdGEpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gKHsgaW5wdXRzLCBiYWNrZW5kIH0pID0+IHtcbiAgICAgICAgY29uc3QgeyBhLCBiIH0gPSBpbnB1dHM7XG4gICAgICAgIGNvbnN0IGNwdUJhY2tlbmQgPSBiYWNrZW5kO1xuICAgICAgICBpZiAoYS5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcgfHwgYi5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgICAgIGNvbnN0ICRhQ29tcGxleCA9IGNhc3QoeyBpbnB1dHM6IHsgeDogYSB9LCBiYWNrZW5kOiBjcHVCYWNrZW5kLCBhdHRyczogeyBkdHlwZTogJ2NvbXBsZXg2NCcgfSB9KTtcbiAgICAgICAgICAgIGNvbnN0ICRhQ29tcGxleFZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KCRhQ29tcGxleC5kYXRhSWQpO1xuICAgICAgICAgICAgY29uc3QgYVJlYWwgPSAkYUNvbXBsZXhWYWxzLmNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsO1xuICAgICAgICAgICAgY29uc3QgYUltYWcgPSAkYUNvbXBsZXhWYWxzLmNvbXBsZXhUZW5zb3JJbmZvcy5pbWFnO1xuICAgICAgICAgICAgY29uc3QgYVJlYWxWYWxzID0gY3B1QmFja2VuZC5kYXRhLmdldChhUmVhbC5kYXRhSWQpLnZhbHVlcztcbiAgICAgICAgICAgIGNvbnN0IGFJbWFnVmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoYUltYWcuZGF0YUlkKS52YWx1ZXM7XG4gICAgICAgICAgICBjb25zdCAkYkNvbXBsZXggPSBjYXN0KHsgaW5wdXRzOiB7IHg6IGIgfSwgYmFja2VuZDogY3B1QmFja2VuZCwgYXR0cnM6IHsgZHR5cGU6ICdjb21wbGV4NjQnIH0gfSk7XG4gICAgICAgICAgICBjb25zdCAkYkNvbXBsZXhWYWxzID0gY3B1QmFja2VuZC5kYXRhLmdldCgkYkNvbXBsZXguZGF0YUlkKTtcbiAgICAgICAgICAgIGNvbnN0IGJSZWFsID0gJGJDb21wbGV4VmFscy5jb21wbGV4VGVuc29ySW5mb3MucmVhbDtcbiAgICAgICAgICAgIGNvbnN0IGJJbWFnID0gJGJDb21wbGV4VmFscy5jb21wbGV4VGVuc29ySW5mb3MuaW1hZztcbiAgICAgICAgICAgIGNvbnN0IGJSZWFsVmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoYlJlYWwuZGF0YUlkKS52YWx1ZXM7XG4gICAgICAgICAgICBjb25zdCBiSW1hZ1ZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KGJJbWFnLmRhdGFJZCkudmFsdWVzO1xuICAgICAgICAgICAgY29uc3QgW3Jlc3VsdFJlYWxEYXRhLCByZXN1bHRJbWFnRGF0YSwgcmVzdWx0U2hhcGVdID0gY29tcGxleEltcGwoYS5zaGFwZSwgYi5zaGFwZSwgYVJlYWxWYWxzLCBhSW1hZ1ZhbHMsIGJSZWFsVmFscywgYkltYWdWYWxzKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdFJlYWwgPSBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHJlc3VsdFNoYXBlLCAnZmxvYXQzMicsIHJlc3VsdFJlYWxEYXRhKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdEltYWcgPSBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHJlc3VsdFNoYXBlLCAnZmxvYXQzMicsIHJlc3VsdEltYWdEYXRhKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBsZXgoeyBpbnB1dHM6IHsgcmVhbDogcmVzdWx0UmVhbCwgaW1hZzogcmVzdWx0SW1hZyB9LCBiYWNrZW5kOiBjcHVCYWNrZW5kIH0pO1xuICAgICAgICAgICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbygkYUNvbXBsZXgpO1xuICAgICAgICAgICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbygkYkNvbXBsZXgpO1xuICAgICAgICAgICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXN1bHRSZWFsKTtcbiAgICAgICAgICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVzdWx0SW1hZyk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgYVZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KGEuZGF0YUlkKS52YWx1ZXM7XG4gICAgICAgICAgICBjb25zdCBiVmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoYi5kYXRhSWQpLnZhbHVlcztcbiAgICAgICAgICAgIGNvbnN0ICRkdHlwZSA9IGR0eXBlIHx8IGEuZHR5cGU7XG4gICAgICAgICAgICBjb25zdCBbcmVzdWx0RGF0YSwgcmVzdWx0U2hhcGVdID0gc2ltcGxlSW1wbChhLnNoYXBlLCBiLnNoYXBlLCBhVmFscywgYlZhbHMsICRkdHlwZSk7XG4gICAgICAgICAgICByZXR1cm4gY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbyhyZXN1bHRTaGFwZSwgJGR0eXBlLCByZXN1bHREYXRhKTtcbiAgICAgICAgfVxuICAgIH07XG59XG4vKipcbiAqIFRlbXBsYXRlIHRoYXQgY3JlYXRlcyB0aGUgY29tcGxleCB0eXBlIGltcGxlbWVudGF0aW9uIGZvciBiaW5hcnkgb3BzLlxuICogU3VwcG9ydHMgYnJvYWRjYXN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29tcGxleEJpbmFyeUtlcm5lbEltcGwob3ApIHtcbiAgICByZXR1cm4gKGFTaGFwZSwgYlNoYXBlLCBhUmVhbFZhbHMsIGFJbWFnVmFscywgYlJlYWxWYWxzLCBiSW1hZ1ZhbHMpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0U2hhcGUgPSBiYWNrZW5kX3V0aWwuYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoYVNoYXBlLCBiU2hhcGUpO1xuICAgICAgICBjb25zdCByZXN1bHRTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlc3VsdFNoYXBlKTtcbiAgICAgICAgY29uc3QgcmVzdWx0UmFuayA9IHJlc3VsdFNoYXBlLmxlbmd0aDtcbiAgICAgICAgY29uc3QgcmVzdWx0U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMocmVzdWx0U2hhcGUpO1xuICAgICAgICBjb25zdCByZXN1bHRSZWFsVmFscyA9IHV0aWwuZ2V0VHlwZWRBcnJheUZyb21EVHlwZSgnZmxvYXQzMicsIHJlc3VsdFNpemUpO1xuICAgICAgICBjb25zdCByZXN1bHRJbWFnVmFscyA9IHV0aWwuZ2V0VHlwZWRBcnJheUZyb21EVHlwZSgnZmxvYXQzMicsIHJlc3VsdFNpemUpO1xuICAgICAgICBjb25zdCBhQnJvYWRjYXN0RGltcyA9IGJhY2tlbmRfdXRpbC5nZXRCcm9hZGNhc3REaW1zKGFTaGFwZSwgcmVzdWx0U2hhcGUpO1xuICAgICAgICBjb25zdCBiQnJvYWRjYXN0RGltcyA9IGJhY2tlbmRfdXRpbC5nZXRCcm9hZGNhc3REaW1zKGJTaGFwZSwgcmVzdWx0U2hhcGUpO1xuICAgICAgICBjb25zdCBhVmFscyA9IGJhY2tlbmRfdXRpbC5tZXJnZVJlYWxBbmRJbWFnQXJyYXlzKGFSZWFsVmFscywgYUltYWdWYWxzKTtcbiAgICAgICAgY29uc3QgYlZhbHMgPSBiYWNrZW5kX3V0aWwubWVyZ2VSZWFsQW5kSW1hZ0FycmF5cyhiUmVhbFZhbHMsIGJJbWFnVmFscyk7XG4gICAgICAgIGNvbnN0IGFSYW5rID0gYVNoYXBlLmxlbmd0aDtcbiAgICAgICAgY29uc3QgYVN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGFTaGFwZSk7XG4gICAgICAgIGNvbnN0IGJSYW5rID0gYlNoYXBlLmxlbmd0aDtcbiAgICAgICAgY29uc3QgYlN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGJTaGFwZSk7XG4gICAgICAgIGlmIChhQnJvYWRjYXN0RGltcy5sZW5ndGggKyBiQnJvYWRjYXN0RGltcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0UmVhbFZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhSWR4ID0gaSAlIGFWYWxzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBjb25zdCBiSWR4ID0gaSAlIGJWYWxzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvcChhVmFsc1thSWR4ICogMl0sIGFWYWxzW2FJZHggKiAyICsgMV0sIGJWYWxzW2JJZHggKiAyXSwgYlZhbHNbYklkeCAqIDIgKyAxXSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0UmVhbFZhbHNbaV0gPSByZXN1bHQucmVhbDtcbiAgICAgICAgICAgICAgICByZXN1bHRJbWFnVmFsc1tpXSA9IHJlc3VsdC5pbWFnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRSZWFsVmFscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvYyA9IHV0aWwuaW5kZXhUb0xvYyhpLCByZXN1bHRSYW5rLCByZXN1bHRTdHJpZGVzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhTG9jID0gbG9jLnNsaWNlKC1hUmFuayk7XG4gICAgICAgICAgICAgICAgYUJyb2FkY2FzdERpbXMuZm9yRWFjaChkID0+IGFMb2NbZF0gPSAwKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhSW5kZXggPSB1dGlsLmxvY1RvSW5kZXgoYUxvYywgYVJhbmssIGFTdHJpZGVzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBiTG9jID0gbG9jLnNsaWNlKC1iUmFuayk7XG4gICAgICAgICAgICAgICAgYkJyb2FkY2FzdERpbXMuZm9yRWFjaChkID0+IGJMb2NbZF0gPSAwKTtcbiAgICAgICAgICAgICAgICBjb25zdCBiSW5kZXggPSB1dGlsLmxvY1RvSW5kZXgoYkxvYywgYlJhbmssIGJTdHJpZGVzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBvcFJlc3VsdCA9IG9wKGFWYWxzW2FJbmRleCAqIDJdLCBhVmFsc1thSW5kZXggKiAyICsgMV0sIGJWYWxzW2JJbmRleCAqIDJdLCBiVmFsc1tiSW5kZXggKiAyICsgMV0pO1xuICAgICAgICAgICAgICAgIHJlc3VsdFJlYWxWYWxzW2ldID0gb3BSZXN1bHQucmVhbDtcbiAgICAgICAgICAgICAgICByZXN1bHRJbWFnVmFsc1tpXSA9IG9wUmVzdWx0LmltYWc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtyZXN1bHRSZWFsVmFscywgcmVzdWx0SW1hZ1ZhbHMsIHJlc3VsdFNoYXBlXTtcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmluYXJ5X3V0aWxzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhZGQgfSBmcm9tICcuLi9rZXJuZWxzL0FkZCc7XG5pbXBvcnQgeyBjb21wbGV4IH0gZnJvbSAnLi4va2VybmVscy9Db21wbGV4JztcbmltcG9ydCB7IGNvbmNhdCB9IGZyb20gJy4uL2tlcm5lbHMvQ29uY2F0JztcbmltcG9ydCB7IGlkZW50aXR5IH0gZnJvbSAnLi4va2VybmVscy9JZGVudGl0eSc7XG5pbXBvcnQgeyBpbWFnIH0gZnJvbSAnLi4va2VybmVscy9JbWFnJztcbmltcG9ydCB7IG11bHRpcGx5IH0gZnJvbSAnLi4va2VybmVscy9NdWx0aXBseSc7XG5pbXBvcnQgeyByZWFsIH0gZnJvbSAnLi4va2VybmVscy9SZWFsJztcbmltcG9ydCB7IHJlYWxEaXZDb25maWcgfSBmcm9tICcuLi9rZXJuZWxzL1JlYWxEaXYnO1xuaW1wb3J0IHsgc2xpY2UgfSBmcm9tICcuLi9rZXJuZWxzL1NsaWNlJztcbmltcG9ydCB7IHN1YiB9IGZyb20gJy4uL2tlcm5lbHMvU3ViJztcbi8qKlxuICogQ2FsY3VsYXRlIEZGVCBvZiBpbm5lciBtb3N0IGVsZW1lbnRzIG9mIGJhdGNoIHRlbnNvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZmdEJhdGNoKGlucHV0LCBpbnZlcnNlLCBjcHVCYWNrZW5kKSB7XG4gICAgY29uc3QgaW5wdXRTaGFwZSA9IGlucHV0LnNoYXBlO1xuICAgIGNvbnN0IGJhdGNoID0gaW5wdXRTaGFwZVswXTtcbiAgICBjb25zdCBpbm5lckRpbSA9IGlucHV0U2hhcGVbMV07XG4gICAgY29uc3QgaW5wdXRWYWxzID0gY3B1QmFja2VuZC5kYXRhLmdldChpbnB1dC5kYXRhSWQpO1xuICAgIGNvbnN0IHJlYWwyRCA9IGlucHV0VmFscy5jb21wbGV4VGVuc29ySW5mb3MucmVhbDtcbiAgICBjb25zdCBpbWFnMkQgPSBpbnB1dFZhbHMuY29tcGxleFRlbnNvckluZm9zLmltYWc7XG4gICAgLy8gQ29sbGVjdHMgcmVhbCBhbmQgaW1hZ2luYXJ5IHZhbHVlcyBzZXBhcmF0ZWx5LlxuICAgIGNvbnN0IHJlc3VsdFNoYXBlID0gW2JhdGNoLCBpbm5lckRpbV07XG4gICAgY29uc3QgcmVzdWx0U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShyZXN1bHRTaGFwZSk7XG4gICAgY29uc3QgcmVzdWx0UmVhbCA9IHV0aWwuZ2V0VHlwZWRBcnJheUZyb21EVHlwZSgnZmxvYXQzMicsIHJlc3VsdFNpemUpO1xuICAgIGNvbnN0IHJlc3VsdEltYWcgPSB1dGlsLmdldFR5cGVkQXJyYXlGcm9tRFR5cGUoJ2Zsb2F0MzInLCByZXN1bHRTaXplKTtcbiAgICBmb3IgKGxldCBiID0gMDsgYiA8IGJhdGNoOyBiKyspIHtcbiAgICAgICAgLy8gVE9ETzogU3VwcG9ydCBzbGljZSBvcHMgZm9yIGNvbXBsZXggdHlwZS5cbiAgICAgICAgY29uc3QgciA9IHNsaWNlKHtcbiAgICAgICAgICAgIGlucHV0czogeyB4OiByZWFsMkQgfSxcbiAgICAgICAgICAgIGJhY2tlbmQ6IGNwdUJhY2tlbmQsXG4gICAgICAgICAgICBhdHRyczogeyBiZWdpbjogW2IsIDBdLCBzaXplOiBbMSwgaW5uZXJEaW1dIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGkgPSBzbGljZSh7XG4gICAgICAgICAgICBpbnB1dHM6IHsgeDogaW1hZzJEIH0sXG4gICAgICAgICAgICBiYWNrZW5kOiBjcHVCYWNrZW5kLFxuICAgICAgICAgICAgYXR0cnM6IHsgYmVnaW46IFtiLCAwXSwgc2l6ZTogWzEsIGlubmVyRGltXSB9XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBpbnB1dCA9IGNvbXBsZXgoeyBpbnB1dHM6IHsgcmVhbDogciwgaW1hZzogaSB9LCBiYWNrZW5kOiBjcHVCYWNrZW5kIH0pO1xuICAgICAgICAvLyBSdW4gRkZUIGJ5IGJhdGNoIGVsZW1lbnQuXG4gICAgICAgIGNvbnN0IHsgcmVhbCwgaW1hZyB9ID0gZmZ0SW1wbChpbnB1dCwgaW52ZXJzZSwgY3B1QmFja2VuZCk7XG4gICAgICAgIGNvbnN0IHJlcyA9IGJhY2tlbmRfdXRpbC5tZXJnZVJlYWxBbmRJbWFnQXJyYXlzKHJlYWwsIGltYWcpO1xuICAgICAgICBmb3IgKGxldCBkID0gMDsgZCA8IGlubmVyRGltOyBkKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGMgPSBiYWNrZW5kX3V0aWwuZ2V0Q29tcGxleFdpdGhJbmRleChyZXMsIGQpO1xuICAgICAgICAgICAgcmVzdWx0UmVhbFtiICogaW5uZXJEaW0gKyBkXSA9IGMucmVhbDtcbiAgICAgICAgICAgIHJlc3VsdEltYWdbYiAqIGlubmVyRGltICsgZF0gPSBjLmltYWc7XG4gICAgICAgIH1cbiAgICAgICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyKTtcbiAgICAgICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpKTtcbiAgICAgICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpbnB1dCk7XG4gICAgfVxuICAgIGNvbnN0ICRyZWFsSW5mbyA9IGNwdUJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVzdWx0U2hhcGUsICdmbG9hdDMyJywgcmVzdWx0UmVhbCk7XG4gICAgY29uc3QgJGltYWdJbmZvID0gY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbyhyZXN1bHRTaGFwZSwgJ2Zsb2F0MzInLCByZXN1bHRJbWFnKTtcbiAgICBjb25zdCByZXN1bHQgPSBjb21wbGV4KHsgaW5wdXRzOiB7IHJlYWw6ICRyZWFsSW5mbywgaW1hZzogJGltYWdJbmZvIH0sIGJhY2tlbmQ6IGNwdUJhY2tlbmQgfSk7XG4gICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbygkcmVhbEluZm8pO1xuICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oJGltYWdJbmZvKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZmdEltcGwoaW5wdXQsIGludmVyc2UsIGNwdUJhY2tlbmQpIHtcbiAgICBjb25zdCBpbnB1dFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoaW5wdXQuc2hhcGUpO1xuICAgIGNvbnN0IGlucHV0VmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoaW5wdXQuZGF0YUlkKTtcbiAgICBjb25zdCByZWFsVmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoaW5wdXRWYWxzLmNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IGltYWdWYWxzID0gY3B1QmFja2VuZC5kYXRhLmdldChpbnB1dFZhbHMuY29tcGxleFRlbnNvckluZm9zLmltYWcuZGF0YUlkKS52YWx1ZXM7XG4gICAgaWYgKGlzRXhwb25lbnRPZjIoaW5wdXRTaXplKSkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBmZnRSYWRpeDIocmVhbFZhbHMsIGltYWdWYWxzLCBpbnB1dFNpemUsIGludmVyc2UsIGNwdUJhY2tlbmQpO1xuICAgICAgICBjb25zdCByZXN1bHRTaGFwZSA9IFtpbnB1dC5zaGFwZVswXSwgaW5wdXQuc2hhcGVbMV1dO1xuICAgICAgICBpZiAoaW52ZXJzZSkge1xuICAgICAgICAgICAgY29uc3QgcmVhbEluZm8gPSBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHJlc3VsdFNoYXBlLCAnZmxvYXQzMicsIHJlc3VsdC5yZWFsKTtcbiAgICAgICAgICAgIGNvbnN0IGltYWdJbmZvID0gY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbyhyZXN1bHRTaGFwZSwgJ2Zsb2F0MzInLCByZXN1bHQuaW1hZyk7XG4gICAgICAgICAgICBjb25zdCBzaXplSW5mbyA9IGNwdUJhY2tlbmQubWFrZVRlbnNvckluZm8oW10sICdmbG9hdDMyJywgdXRpbC5jcmVhdGVTY2FsYXJWYWx1ZShpbnB1dFNpemUsICdmbG9hdDMyJykpO1xuICAgICAgICAgICAgY29uc3Qgc2l6ZUluZm9Db3B5ID0gaWRlbnRpdHkoeyBpbnB1dHM6IHsgeDogc2l6ZUluZm8gfSwgYmFja2VuZDogY3B1QmFja2VuZCB9KTtcbiAgICAgICAgICAgIGNvbnN0IGRpdlJlYWxJbmZvID0gcmVhbERpdkNvbmZpZy5rZXJuZWxGdW5jKHsgaW5wdXRzOiB7IGE6IHJlYWxJbmZvLCBiOiBzaXplSW5mbyB9LCBiYWNrZW5kOiBjcHVCYWNrZW5kIH0pO1xuICAgICAgICAgICAgY29uc3QgZGl2SW1hZ0luZm8gPSByZWFsRGl2Q29uZmlnLmtlcm5lbEZ1bmMoeyBpbnB1dHM6IHsgYTogaW1hZ0luZm8sIGI6IHNpemVJbmZvQ29weSB9LCBiYWNrZW5kOiBjcHVCYWNrZW5kIH0pO1xuICAgICAgICAgICAgY29uc3QgZGl2UmVhbFZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KGRpdlJlYWxJbmZvLmRhdGFJZCkudmFsdWVzO1xuICAgICAgICAgICAgY29uc3QgZGl2SW1hZ1ZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KGRpdkltYWdJbmZvLmRhdGFJZCkudmFsdWVzO1xuICAgICAgICAgICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZWFsSW5mbyk7XG4gICAgICAgICAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGltYWdJbmZvKTtcbiAgICAgICAgICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oc2l6ZUluZm8pO1xuICAgICAgICAgICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhzaXplSW5mb0NvcHkpO1xuICAgICAgICAgICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhkaXZSZWFsSW5mbyk7XG4gICAgICAgICAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGRpdkltYWdJbmZvKTtcbiAgICAgICAgICAgIHJldHVybiB7IHJlYWw6IGRpdlJlYWxWYWxzLCBpbWFnOiBkaXZJbWFnVmFscyB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBkYXRhID0gYmFja2VuZF91dGlsLm1lcmdlUmVhbEFuZEltYWdBcnJheXMocmVhbFZhbHMsIGltYWdWYWxzKTtcbiAgICAgICAgY29uc3QgcmF3T3V0cHV0ID0gZm91cmllclRyYW5zZm9ybUJ5TWF0bXVsKGRhdGEsIGlucHV0U2l6ZSwgaW52ZXJzZSk7XG4gICAgICAgIHJldHVybiBiYWNrZW5kX3V0aWwuc3BsaXRSZWFsQW5kSW1hZ0FycmF5cyhyYXdPdXRwdXQpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGlzRXhwb25lbnRPZjIoc2l6ZSkge1xuICAgIHJldHVybiAoc2l6ZSAmIHNpemUgLSAxKSA9PT0gMDtcbn1cbi8vIEZGVCB1c2luZyBDb29sZXktVHVrZXkgYWxnb3JpdGhtIG9uIHJhZGl4IDIgZGltZW5zaW9uYWwgaW5wdXQuXG5mdW5jdGlvbiBmZnRSYWRpeDIocmVhbFZhbHMsIGltYWdWYWxzLCBzaXplLCBpbnZlcnNlLCBjcHVCYWNrZW5kKSB7XG4gICAgaWYgKHNpemUgPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHsgcmVhbDogcmVhbFZhbHMsIGltYWc6IGltYWdWYWxzIH07XG4gICAgfVxuICAgIGNvbnN0IGRhdGEgPSBiYWNrZW5kX3V0aWwubWVyZ2VSZWFsQW5kSW1hZ0FycmF5cyhyZWFsVmFscywgaW1hZ1ZhbHMpO1xuICAgIGNvbnN0IGhhbGYgPSBzaXplIC8gMjtcbiAgICBjb25zdCBldmVuQ29tcGxleCA9IGJhY2tlbmRfdXRpbC5jb21wbGV4V2l0aEV2ZW5JbmRleChkYXRhKTtcbiAgICBjb25zdCBldmVuUmVhbFZhbHMgPSBldmVuQ29tcGxleC5yZWFsO1xuICAgIGNvbnN0IGV2ZW5JbWFnVmFscyA9IGV2ZW5Db21wbGV4LmltYWc7XG4gICAgY29uc3QgZXZlblNoYXBlID0gW2V2ZW5SZWFsVmFscy5sZW5ndGhdO1xuICAgIGNvbnN0IGV2ZW5SZWFsSW5mbyA9IGNwdUJhY2tlbmQubWFrZVRlbnNvckluZm8oZXZlblNoYXBlLCAnZmxvYXQzMicsIGV2ZW5SZWFsVmFscyk7XG4gICAgY29uc3QgZXZlbkltYWdJbmZvID0gY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbyhldmVuU2hhcGUsICdmbG9hdDMyJywgZXZlbkltYWdWYWxzKTtcbiAgICBjb25zdCBldmVuVGVuc29ySW5mbyA9IGNvbXBsZXgoeyBpbnB1dHM6IHsgcmVhbDogZXZlblJlYWxJbmZvLCBpbWFnOiBldmVuSW1hZ0luZm8gfSwgYmFja2VuZDogY3B1QmFja2VuZCB9KTtcbiAgICBjb25zdCBvZGRDb21wbGV4ID0gYmFja2VuZF91dGlsLmNvbXBsZXhXaXRoT2RkSW5kZXgoZGF0YSk7XG4gICAgY29uc3Qgb2RkUmVhbFZhbHMgPSBvZGRDb21wbGV4LnJlYWw7XG4gICAgY29uc3Qgb2RkSW1hZ1ZhbHMgPSBvZGRDb21wbGV4LmltYWc7XG4gICAgY29uc3Qgb2RkU2hhcGUgPSBbb2RkUmVhbFZhbHMubGVuZ3RoXTtcbiAgICBjb25zdCBvZGRSZWFsSW5mbyA9IGNwdUJhY2tlbmQubWFrZVRlbnNvckluZm8ob2RkU2hhcGUsICdmbG9hdDMyJywgb2RkUmVhbFZhbHMpO1xuICAgIGNvbnN0IG9kZEltYWdJbmZvID0gY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbyhvZGRTaGFwZSwgJ2Zsb2F0MzInLCBvZGRJbWFnVmFscyk7XG4gICAgY29uc3Qgb2RkVGVuc29ySW5mbyA9IGNvbXBsZXgoeyBpbnB1dHM6IHsgcmVhbDogb2RkUmVhbEluZm8sIGltYWc6IG9kZEltYWdJbmZvIH0sIGJhY2tlbmQ6IGNwdUJhY2tlbmQgfSk7XG4gICAgLy8gUmVjdXJzaXZlIGNhbGwgZm9yIGhhbGYgcGFydCBvZiBvcmlnaW5hbCBpbnB1dC5cbiAgICBjb25zdCAkZXZlbkNvbXBsZXggPSBmZnRSYWRpeDIoZXZlblJlYWxWYWxzLCBldmVuSW1hZ1ZhbHMsIGhhbGYsIGludmVyc2UsIGNwdUJhY2tlbmQpO1xuICAgIGNvbnN0ICRldmVuUmVhbFZhbHMgPSAkZXZlbkNvbXBsZXgucmVhbDtcbiAgICBjb25zdCAkZXZlbkltYWdWYWxzID0gJGV2ZW5Db21wbGV4LmltYWc7XG4gICAgY29uc3QgJGV2ZW5TaGFwZSA9IFskZXZlblJlYWxWYWxzLmxlbmd0aF07XG4gICAgY29uc3QgJGV2ZW5SZWFsSW5mbyA9IGNwdUJhY2tlbmQubWFrZVRlbnNvckluZm8oJGV2ZW5TaGFwZSwgJ2Zsb2F0MzInLCAkZXZlblJlYWxWYWxzKTtcbiAgICBjb25zdCAkZXZlbkltYWdJbmZvID0gY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbygkZXZlblNoYXBlLCAnZmxvYXQzMicsICRldmVuSW1hZ1ZhbHMpO1xuICAgIGNvbnN0ICRldmVuVGVuc29ySW5mbyA9IGNvbXBsZXgoe1xuICAgICAgICBpbnB1dHM6IHsgcmVhbDogJGV2ZW5SZWFsSW5mbywgaW1hZzogJGV2ZW5JbWFnSW5mbyB9LFxuICAgICAgICBiYWNrZW5kOiBjcHVCYWNrZW5kXG4gICAgfSk7XG4gICAgY29uc3QgJG9kZENvbXBsZXggPSBmZnRSYWRpeDIob2RkUmVhbFZhbHMsIG9kZEltYWdWYWxzLCBoYWxmLCBpbnZlcnNlLCBjcHVCYWNrZW5kKTtcbiAgICBjb25zdCAkb2RkUmVhbFZhbHMgPSAkb2RkQ29tcGxleC5yZWFsO1xuICAgIGNvbnN0ICRvZGRJbWFnVmFscyA9ICRvZGRDb21wbGV4LmltYWc7XG4gICAgY29uc3QgJG9kZFNoYXBlID0gWyRvZGRSZWFsVmFscy5sZW5ndGhdO1xuICAgIGNvbnN0ICRvZGRSZWFsSW5mbyA9IGNwdUJhY2tlbmQubWFrZVRlbnNvckluZm8oJG9kZFNoYXBlLCAnZmxvYXQzMicsICRvZGRSZWFsVmFscyk7XG4gICAgY29uc3QgJG9kZEltYWdJbmZvID0gY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbygkb2RkU2hhcGUsICdmbG9hdDMyJywgJG9kZEltYWdWYWxzKTtcbiAgICBjb25zdCAkb2RkVGVuc29ySW5mbyA9IGNvbXBsZXgoeyBpbnB1dHM6IHsgcmVhbDogJG9kZFJlYWxJbmZvLCBpbWFnOiAkb2RkSW1hZ0luZm8gfSwgYmFja2VuZDogY3B1QmFja2VuZCB9KTtcbiAgICBjb25zdCBlID0gYmFja2VuZF91dGlsLmV4cG9uZW50cyhzaXplLCBpbnZlcnNlKTtcbiAgICBjb25zdCBlU2hhcGUgPSBbZS5yZWFsLmxlbmd0aF07XG4gICAgY29uc3QgZVJlYWxJbmZvID0gY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbyhlU2hhcGUsICdmbG9hdDMyJywgZS5yZWFsKTtcbiAgICBjb25zdCBlSW1hZ0luZm8gPSBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGVTaGFwZSwgJ2Zsb2F0MzInLCBlLmltYWcpO1xuICAgIGNvbnN0IGNvbXBsZXhJbmZvID0gY29tcGxleCh7IGlucHV0czogeyByZWFsOiBlUmVhbEluZm8sIGltYWc6IGVJbWFnSW5mbyB9LCBiYWNrZW5kOiBjcHVCYWNrZW5kIH0pO1xuICAgIGNvbnN0IGV4cG9uZW50SW5mbyA9IG11bHRpcGx5KHsgaW5wdXRzOiB7IGE6IGNvbXBsZXhJbmZvLCBiOiAkb2RkVGVuc29ySW5mbyB9LCBiYWNrZW5kOiBjcHVCYWNrZW5kIH0pO1xuICAgIGNvbnN0IGFkZFBhcnQgPSBhZGQoe1xuICAgICAgICBpbnB1dHM6IHsgYTogJGV2ZW5UZW5zb3JJbmZvLCBiOiBleHBvbmVudEluZm8gfSxcbiAgICAgICAgYmFja2VuZDogY3B1QmFja2VuZFxuICAgIH0pO1xuICAgIGNvbnN0IHN1YlBhcnQgPSBzdWIoe1xuICAgICAgICBpbnB1dHM6IHsgYTogJGV2ZW5UZW5zb3JJbmZvLCBiOiBleHBvbmVudEluZm8gfSxcbiAgICAgICAgYmFja2VuZDogY3B1QmFja2VuZFxuICAgIH0pO1xuICAgIGNvbnN0IGFkZFBhcnRSZWFsID0gcmVhbCh7IGlucHV0czogeyBpbnB1dDogYWRkUGFydCB9LCBiYWNrZW5kOiBjcHVCYWNrZW5kIH0pO1xuICAgIGNvbnN0IHN1YlBhcnRSZWFsID0gcmVhbCh7IGlucHV0czogeyBpbnB1dDogc3ViUGFydCB9LCBiYWNrZW5kOiBjcHVCYWNrZW5kIH0pO1xuICAgIGNvbnN0IGFkZFBhcnRJbWFnID0gaW1hZyh7IGlucHV0czogeyBpbnB1dDogYWRkUGFydCB9LCBiYWNrZW5kOiBjcHVCYWNrZW5kIH0pO1xuICAgIGNvbnN0IHN1YlBhcnRJbWFnID0gaW1hZyh7IGlucHV0czogeyBpbnB1dDogc3ViUGFydCB9LCBiYWNrZW5kOiBjcHVCYWNrZW5kIH0pO1xuICAgIGNvbnN0ICRyZWFsID0gY29uY2F0KHtcbiAgICAgICAgaW5wdXRzOiBbYWRkUGFydFJlYWwsIHN1YlBhcnRSZWFsXSxcbiAgICAgICAgYmFja2VuZDogY3B1QmFja2VuZCxcbiAgICAgICAgYXR0cnM6IHsgYXhpczogMCB9XG4gICAgfSk7XG4gICAgY29uc3QgJGltYWcgPSBjb25jYXQoe1xuICAgICAgICBpbnB1dHM6IFthZGRQYXJ0SW1hZywgc3ViUGFydEltYWddLFxuICAgICAgICBiYWNrZW5kOiBjcHVCYWNrZW5kLFxuICAgICAgICBhdHRyczogeyBheGlzOiAwIH1cbiAgICB9KTtcbiAgICBjb25zdCAkcmVhbFZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KCRyZWFsLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0ICRpbWFnVmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoJGltYWcuZGF0YUlkKS52YWx1ZXM7XG4gICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhldmVuUmVhbEluZm8pO1xuICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oZXZlbkltYWdJbmZvKTtcbiAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGV2ZW5UZW5zb3JJbmZvKTtcbiAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG9kZFJlYWxJbmZvKTtcbiAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG9kZEltYWdJbmZvKTtcbiAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG9kZFRlbnNvckluZm8pO1xuICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oJGV2ZW5SZWFsSW5mbyk7XG4gICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbygkZXZlbkltYWdJbmZvKTtcbiAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKCRldmVuVGVuc29ySW5mbyk7XG4gICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbygkb2RkUmVhbEluZm8pO1xuICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oJG9kZEltYWdJbmZvKTtcbiAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKCRvZGRUZW5zb3JJbmZvKTtcbiAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGVSZWFsSW5mbyk7XG4gICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhlSW1hZ0luZm8pO1xuICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oY29tcGxleEluZm8pO1xuICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oZXhwb25lbnRJbmZvKTtcbiAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGFkZFBhcnQpO1xuICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oc3ViUGFydCk7XG4gICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhhZGRQYXJ0UmVhbCk7XG4gICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhhZGRQYXJ0SW1hZyk7XG4gICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhzdWJQYXJ0UmVhbCk7XG4gICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhzdWJQYXJ0SW1hZyk7XG4gICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbygkcmVhbCk7XG4gICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbygkaW1hZyk7XG4gICAgcmV0dXJuIHsgcmVhbDogJHJlYWxWYWxzLCBpbWFnOiAkaW1hZ1ZhbHMgfTtcbn1cbi8vIENhbGN1bGF0ZSBmb3VyaWVyIHRyYW5zZm9ybSBieSBtdWx0cGx5aW5nIHNpbnVzb2lkIG1hdHJpeC5cbmZ1bmN0aW9uIGZvdXJpZXJUcmFuc2Zvcm1CeU1hdG11bChkYXRhLCBzaXplLCBpbnZlcnNlKSB7XG4gICAgY29uc3QgcmV0ID0gbmV3IEZsb2F0MzJBcnJheShzaXplICogMik7XG4gICAgLy8gVE9ETzogVXNlIG1hdG11bCBpbnN0ZWFkIG9uY2UgaXQgc3VwcG9ydHMgY29tcGxleDY0IHR5cGUuXG4gICAgZm9yIChsZXQgciA9IDA7IHIgPCBzaXplOyByKyspIHtcbiAgICAgICAgbGV0IHJlYWwgPSAwLjA7XG4gICAgICAgIGxldCBpbWFnID0gMC4wO1xuICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IHNpemU7IGMrKykge1xuICAgICAgICAgICAgY29uc3QgZSA9IGJhY2tlbmRfdXRpbC5leHBvbmVudChyICogYywgc2l6ZSwgaW52ZXJzZSk7XG4gICAgICAgICAgICBjb25zdCB0ZXJtID0gYmFja2VuZF91dGlsLmdldENvbXBsZXhXaXRoSW5kZXgoZGF0YSwgYyk7XG4gICAgICAgICAgICByZWFsICs9IHRlcm0ucmVhbCAqIGUucmVhbCAtIHRlcm0uaW1hZyAqIGUuaW1hZztcbiAgICAgICAgICAgIGltYWcgKz0gdGVybS5yZWFsICogZS5pbWFnICsgdGVybS5pbWFnICogZS5yZWFsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnZlcnNlKSB7XG4gICAgICAgICAgICByZWFsIC89IHNpemU7XG4gICAgICAgICAgICBpbWFnIC89IHNpemU7XG4gICAgICAgIH1cbiAgICAgICAgYmFja2VuZF91dGlsLmFzc2lnblRvVHlwZWRBcnJheShyZXQsIHJlYWwsIGltYWcsIHIpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmZ0X3V0aWxzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGVsdSB9IGZyb20gJy4uL2tlcm5lbHMvRWx1JztcbmltcG9ydCB7IGlkZW50aXR5IH0gZnJvbSAnLi4va2VybmVscy9JZGVudGl0eSc7XG5pbXBvcnQgeyBsZWFreVJlbHUgfSBmcm9tICcuLi9rZXJuZWxzL0xlYWt5UmVsdSc7XG5pbXBvcnQgeyBwcmVsdSB9IGZyb20gJy4uL2tlcm5lbHMvUHJlbHUnO1xuaW1wb3J0IHsgcmVsdSB9IGZyb20gJy4uL2tlcm5lbHMvUmVsdSc7XG5pbXBvcnQgeyByZWx1NiB9IGZyb20gJy4uL2tlcm5lbHMvUmVsdTYnO1xuaW1wb3J0IHsgc2lnbW9pZCB9IGZyb20gJy4uL2tlcm5lbHMvU2lnbW9pZCc7XG5leHBvcnQgZnVuY3Rpb24gYXBwbHlBY3RpdmF0aW9uKGJhY2tlbmQsIHgsIGFjdGl2YXRpb24sIHByZWx1QWN0aXZhdGlvbldlaWdodHMsIGxlYWt5cmVsdUFscGhhKSB7XG4gICAgaWYgKGFjdGl2YXRpb24gPT09ICdsaW5lYXInKSB7XG4gICAgICAgIHJldHVybiBpZGVudGl0eSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdyZWx1Jykge1xuICAgICAgICByZXR1cm4gcmVsdSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdlbHUnKSB7XG4gICAgICAgIHJldHVybiBlbHUoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChhY3RpdmF0aW9uID09PSAncmVsdTYnKSB7XG4gICAgICAgIHJldHVybiByZWx1Nih7IGlucHV0czogeyB4IH0sIGJhY2tlbmQgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdwcmVsdScpIHtcbiAgICAgICAgcmV0dXJuIHByZWx1KHsgaW5wdXRzOiB7IHgsIGFscGhhOiBwcmVsdUFjdGl2YXRpb25XZWlnaHRzIH0sIGJhY2tlbmQgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdsZWFreXJlbHUnKSB7XG4gICAgICAgIHJldHVybiBsZWFreVJlbHUoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kLCBhdHRyczogeyBhbHBoYTogbGVha3lyZWx1QWxwaGEgfSB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYWN0aXZhdGlvbiA9PT0gJ3NpZ21vaWQnKSB7XG4gICAgICAgIHJldHVybiBzaWdtb2lkKHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCB9KTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBBY3RpdmF0aW9uICR7YWN0aXZhdGlvbn0gaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkIGZvciB0aGUgQ1BVIGJhY2tlbmQuYCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mdXNlZF91dGlscy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBidWZmZXIgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIHBvb2woeFZhbHVlcywgeFNoYXBlLCBkdHlwZSwgc3RyaWRlcywgY29udkluZm8sIHBvb2xUeXBlKSB7XG4gICAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgY29uc3QgZGlsYXRpb25IZWlnaHQgPSBjb252SW5mby5kaWxhdGlvbkhlaWdodDtcbiAgICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJIZWlnaHQ7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVyV2lkdGggPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJXaWR0aDtcbiAgICBjb25zdCBwYWRUb3AgPSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICBjb25zdCBwYWRMZWZ0ID0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgIGNvbnN0IGluaXRpYWxWYWx1ZSA9IChwb29sVHlwZSA9PT0gJ21heCcgPyBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgOlxuICAgICAgICBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpO1xuICAgIGNvbnN0IG91dHB1dCA9IGJ1ZmZlcihjb252SW5mby5vdXRTaGFwZSwgZHR5cGUpO1xuICAgIGNvbnN0IG91dHB1dFZhbHMgPSBvdXRwdXQudmFsdWVzO1xuICAgIGNvbnN0IG91dHB1dEJhdGNoU3RyaWRlcyA9IGNvbnZJbmZvLm91dFNoYXBlWzFdICogY29udkluZm8ub3V0U2hhcGVbMl0gKiBjb252SW5mby5vdXRTaGFwZVszXTtcbiAgICBjb25zdCBvdXRwdXRSb3dTdHJpZGVzID0gY29udkluZm8ub3V0U2hhcGVbMl0gKiBjb252SW5mby5vdXRTaGFwZVszXTtcbiAgICBjb25zdCBvdXRwdXRDb2xTdHJpZGVzID0gY29udkluZm8ub3V0U2hhcGVbM107XG4gICAgZm9yIChsZXQgYiA9IDA7IGIgPCBjb252SW5mby5iYXRjaFNpemU7ICsrYikge1xuICAgICAgICBjb25zdCBvdXRwdXRCYXRjaE9mZnNldCA9IGIgKiBvdXRwdXRCYXRjaFN0cmlkZXM7XG4gICAgICAgIGNvbnN0IGlucHV0QmF0Y2hPZmZzZXQgPSBiICogc3RyaWRlc1swXTtcbiAgICAgICAgZm9yIChsZXQgZCA9IDA7IGQgPCBjb252SW5mby5pbkNoYW5uZWxzOyArK2QpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHlSID0gMDsgeVIgPCBjb252SW5mby5vdXRIZWlnaHQ7ICsreVIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4UkNvcm5lciA9IHlSICogc3RyaWRlSGVpZ2h0IC0gcGFkVG9wO1xuICAgICAgICAgICAgICAgIGNvbnN0IHhSTWluID0gTWF0aC5tYXgoMCwgeFJDb3JuZXIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHhSTWF4ID0gTWF0aC5taW4oY29udkluZm8uaW5IZWlnaHQsIGVmZmVjdGl2ZUZpbHRlckhlaWdodCArIHhSQ29ybmVyKTtcbiAgICAgICAgICAgICAgICBjb25zdCBvdXRwdXRSb3dPZmZzZXQgPSBvdXRwdXRCYXRjaE9mZnNldCArIHlSICogb3V0cHV0Um93U3RyaWRlcztcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB5QyA9IDA7IHlDIDwgY29udkluZm8ub3V0V2lkdGg7ICsreUMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeENDb3JuZXIgPSB5QyAqIHN0cmlkZVdpZHRoIC0gcGFkTGVmdDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeENNaW4gPSBNYXRoLm1heCgwLCB4Q0Nvcm5lcik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhDTWF4ID0gTWF0aC5taW4oY29udkluZm8uaW5XaWR0aCwgZWZmZWN0aXZlRmlsdGVyV2lkdGggKyB4Q0Nvcm5lcik7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtaW5NYXhWYWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGF2Z1ZhbHVlID0gMDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgeFIgPSB4Uk1pbjsgeFIgPCB4Uk1heDsgeFIgKz0gZGlsYXRpb25IZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhST2Zmc2V0ID0gaW5wdXRCYXRjaE9mZnNldCArIHhSICogc3RyaWRlc1sxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHhDID0geENNaW47IHhDIDwgeENNYXg7IHhDICs9IGRpbGF0aW9uV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4Q09mZnNldCA9IHhST2Zmc2V0ICsgeEMgKiBzdHJpZGVzWzJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBpeGVsID0geFZhbHVlc1t4Q09mZnNldCArIGRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocG9vbFR5cGUgPT09ICdtYXgnICYmIHBpeGVsID4gbWluTWF4VmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk1heFZhbHVlID0gcGl4ZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBvb2xUeXBlID09PSAnYXZnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmdWYWx1ZSArPSBwaXhlbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNOYU4obWluTWF4VmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0T2Zmc2V0ID0gb3V0cHV0Um93T2Zmc2V0ICsgeUMgKiBvdXRwdXRDb2xTdHJpZGVzICsgZDtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0VmFsc1tvdXRwdXRPZmZzZXRdID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHBvb2xUeXBlID09PSAnYXZnJyA/IGF2Z1ZhbHVlIC8gY291bnQgOiBtaW5NYXhWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBtYXhQb29sUG9zaXRpb25zKHhWYWx1ZXMsIHhTaGFwZSwgZHR5cGUsIGNvbnZJbmZvLCBmbGF0dGVuUG9zaXRpb25zID0gZmFsc2UsIGluY2x1ZGVCYXRjaEluSW5kZXggPSBmYWxzZSkge1xuICAgIGNvbnN0IG1heFBvc2l0aW9ucyA9IGJ1ZmZlcihjb252SW5mby5vdXRTaGFwZSwgJ2ludDMyJyk7XG4gICAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgY29uc3QgZGlsYXRpb25IZWlnaHQgPSBjb252SW5mby5kaWxhdGlvbkhlaWdodDtcbiAgICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJIZWlnaHQ7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVyV2lkdGggPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJXaWR0aDtcbiAgICBjb25zdCBwYWRUb3AgPSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICBjb25zdCBwYWRMZWZ0ID0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgIGNvbnN0IHhCdWYgPSBidWZmZXIoeFNoYXBlLCBkdHlwZSwgeFZhbHVlcyk7XG4gICAgZm9yIChsZXQgYiA9IDA7IGIgPCBjb252SW5mby5iYXRjaFNpemU7ICsrYikge1xuICAgICAgICBmb3IgKGxldCBkID0gMDsgZCA8IGNvbnZJbmZvLmluQ2hhbm5lbHM7ICsrZCkge1xuICAgICAgICAgICAgZm9yIChsZXQgeVIgPSAwOyB5UiA8IGNvbnZJbmZvLm91dEhlaWdodDsgKyt5Uikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhSQ29ybmVyID0geVIgKiBzdHJpZGVIZWlnaHQgLSBwYWRUb3A7XG4gICAgICAgICAgICAgICAgbGV0IHhSTWluID0geFJDb3JuZXI7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHhSTWluIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICB4Uk1pbiArPSBkaWxhdGlvbkhlaWdodDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gY29uc3QgeFJNaW4gPSBNYXRoLm1heCgwLCB4UkNvcm5lcik7XG4gICAgICAgICAgICAgICAgY29uc3QgeFJNYXggPSBNYXRoLm1pbihjb252SW5mby5pbkhlaWdodCwgZWZmZWN0aXZlRmlsdGVySGVpZ2h0ICsgeFJDb3JuZXIpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHlDID0gMDsgeUMgPCBjb252SW5mby5vdXRXaWR0aDsgKyt5Qykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4Q0Nvcm5lciA9IHlDICogc3RyaWRlV2lkdGggLSBwYWRMZWZ0O1xuICAgICAgICAgICAgICAgICAgICBsZXQgeENNaW4gPSB4Q0Nvcm5lcjtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhDTWluIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgeENNaW4gKz0gZGlsYXRpb25XaWR0aDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCB4Q01heCA9IE1hdGgubWluKGNvbnZJbmZvLmluV2lkdGgsIGVmZmVjdGl2ZUZpbHRlcldpZHRoICsgeENDb3JuZXIpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWF4VmFsdWUgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtYXhQb3NpdGlvbiA9IC0xO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB4UiA9IHhSTWluOyB4UiA8IHhSTWF4OyB4UiArPSBkaWxhdGlvbkhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd1IgPSB4UiAtIHhSQ29ybmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgeEMgPSB4Q01pbjsgeEMgPCB4Q01heDsgeEMgKz0gZGlsYXRpb25XaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdDID0geEMgLSB4Q0Nvcm5lcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwaXhlbCA9IHhCdWYuZ2V0KGIsIHhSLCB4QywgZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBpeGVsID4gbWF4VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4VmFsdWUgPSBwaXhlbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZsYXR0ZW5Qb3NpdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFBvc2l0aW9uID0gaW5jbHVkZUJhdGNoSW5JbmRleCA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChiICogY29udkluZm8uaW5IZWlnaHQgKyB4UikgKiBjb252SW5mby5pbldpZHRoICsgeEMpICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udkluZm8uaW5DaGFubmVscyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh4UiAqIGNvbnZJbmZvLmluV2lkdGggKyB4QykgKiBjb252SW5mby5pbkNoYW5uZWxzICsgZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFBvc2l0aW9uID0gd1IgKiBlZmZlY3RpdmVGaWx0ZXJXaWR0aCArIHdDO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1heFBvc2l0aW9ucy5zZXQobWF4UG9zaXRpb24sIGIsIHlSLCB5QywgZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXhQb3NpdGlvbnM7XG59XG5leHBvcnQgZnVuY3Rpb24gcG9vbDNkKHhWYWx1ZXMsIHhTaGFwZSwgZHR5cGUsIHN0cmlkZXMsIGNvbnZJbmZvLCBwb29sVHlwZSkge1xuICAgIGNvbnN0IHN0cmlkZURlcHRoID0gY29udkluZm8uc3RyaWRlRGVwdGg7XG4gICAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgY29uc3QgZGlsYXRpb25EZXB0aCA9IGNvbnZJbmZvLmRpbGF0aW9uRGVwdGg7XG4gICAgY29uc3QgZGlsYXRpb25IZWlnaHQgPSBjb252SW5mby5kaWxhdGlvbkhlaWdodDtcbiAgICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJEZXB0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckRlcHRoO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckhlaWdodDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoO1xuICAgIGNvbnN0IHBhZEZyb250ID0gY29udkluZm8ucGFkSW5mby5mcm9udDtcbiAgICBjb25zdCBwYWRUb3AgPSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICBjb25zdCBwYWRMZWZ0ID0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgIGNvbnN0IGluaXRpYWxWYWx1ZSA9IChwb29sVHlwZSA9PT0gJ21heCcgPyBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgOlxuICAgICAgICBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpO1xuICAgIGNvbnN0IG91dHB1dCA9IGJ1ZmZlcihjb252SW5mby5vdXRTaGFwZSwgZHR5cGUpO1xuICAgIGNvbnN0IG91dHB1dFZhbHMgPSBvdXRwdXQudmFsdWVzO1xuICAgIGNvbnN0IG91dHB1dEJhdGNoU3RyaWRlcyA9IGNvbnZJbmZvLm91dFNoYXBlWzFdICogY29udkluZm8ub3V0U2hhcGVbMl0gKlxuICAgICAgICBjb252SW5mby5vdXRTaGFwZVszXSAqIGNvbnZJbmZvLm91dFNoYXBlWzRdO1xuICAgIGNvbnN0IG91dHB1dERlcHRoU3RyaWRlcyA9IGNvbnZJbmZvLm91dFNoYXBlWzJdICogY29udkluZm8ub3V0U2hhcGVbM10gKiBjb252SW5mby5vdXRTaGFwZVs0XTtcbiAgICBjb25zdCBvdXRwdXRSb3dTdHJpZGVzID0gY29udkluZm8ub3V0U2hhcGVbM10gKiBjb252SW5mby5vdXRTaGFwZVs0XTtcbiAgICBjb25zdCBvdXRwdXRDb2xTdHJpZGVzID0gY29udkluZm8ub3V0U2hhcGVbNF07XG4gICAgZm9yIChsZXQgYmF0Y2ggPSAwOyBiYXRjaCA8IGNvbnZJbmZvLmJhdGNoU2l6ZTsgKytiYXRjaCkge1xuICAgICAgICBjb25zdCBvdXRwdXRCYXRjaE9mZnNldCA9IGJhdGNoICogb3V0cHV0QmF0Y2hTdHJpZGVzO1xuICAgICAgICBjb25zdCBpbnB1dEJhdGNoT2Zmc2V0ID0gYmF0Y2ggKiBzdHJpZGVzWzBdO1xuICAgICAgICBmb3IgKGxldCBjaGFubmVsID0gMDsgY2hhbm5lbCA8IGNvbnZJbmZvLmluQ2hhbm5lbHM7ICsrY2hhbm5lbCkge1xuICAgICAgICAgICAgZm9yIChsZXQgeURlcHRoID0gMDsgeURlcHRoIDwgY29udkluZm8ub3V0RGVwdGg7ICsreURlcHRoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeERlcHRoQ29ybmVyID0geURlcHRoICogc3RyaWRlRGVwdGggLSBwYWRGcm9udDtcbiAgICAgICAgICAgICAgICBsZXQgeERlcHRoTWluID0geERlcHRoQ29ybmVyO1xuICAgICAgICAgICAgICAgIHdoaWxlICh4RGVwdGhNaW4gPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHhEZXB0aE1pbiArPSBkaWxhdGlvbkRlcHRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB4RGVwdGhNYXggPSBNYXRoLm1pbihjb252SW5mby5pbkRlcHRoLCBlZmZlY3RpdmVGaWx0ZXJEZXB0aCArIHhEZXB0aENvcm5lcik7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0RGVwdGhPZmZzZXQgPSBvdXRwdXRCYXRjaE9mZnNldCArIHlEZXB0aCAqIG91dHB1dERlcHRoU3RyaWRlcztcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB5Um93ID0gMDsgeVJvdyA8IGNvbnZJbmZvLm91dEhlaWdodDsgKyt5Um93KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhSb3dDb3JuZXIgPSB5Um93ICogc3RyaWRlSGVpZ2h0IC0gcGFkVG9wO1xuICAgICAgICAgICAgICAgICAgICBsZXQgeFJvd01pbiA9IHhSb3dDb3JuZXI7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4Um93TWluIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgeFJvd01pbiArPSBkaWxhdGlvbkhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCB4Um93TWF4ID0gTWF0aC5taW4oY29udkluZm8uaW5IZWlnaHQsIGVmZmVjdGl2ZUZpbHRlckhlaWdodCArIHhSb3dDb3JuZXIpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvdXRwdXRSb3dPZmZzZXQgPSBvdXRwdXREZXB0aE9mZnNldCArIHlSb3cgKiBvdXRwdXRSb3dTdHJpZGVzO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB5Q29sID0gMDsgeUNvbCA8IGNvbnZJbmZvLm91dFdpZHRoOyArK3lDb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhDb2xDb3JuZXIgPSB5Q29sICogc3RyaWRlV2lkdGggLSBwYWRMZWZ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHhDb2xNaW4gPSB4Q29sQ29ybmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhDb2xNaW4gPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeENvbE1pbiArPSBkaWxhdGlvbldpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeENvbE1heCA9IE1hdGgubWluKGNvbnZJbmZvLmluV2lkdGgsIGVmZmVjdGl2ZUZpbHRlcldpZHRoICsgeENvbENvcm5lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTaGFkZXIgY29kZSBiZWdpbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG91dHB1dENvbE9mZnNldCA9IG91dHB1dFJvd09mZnNldCArIHlDb2wgKiBvdXRwdXRDb2xTdHJpZGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1pbk1heFZhbHVlID0gaW5pdGlhbFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF2Z1ZhbHVlID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB4RGVwdGggPSB4RGVwdGhNaW47IHhEZXB0aCA8IHhEZXB0aE1heDsgeERlcHRoICs9IGRpbGF0aW9uRGVwdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4RGVwdGhPZmZzZXQgPSBpbnB1dEJhdGNoT2Zmc2V0ICsgeERlcHRoICogc3RyaWRlc1sxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB4Um93ID0geFJvd01pbjsgeFJvdyA8IHhSb3dNYXg7IHhSb3cgKz0gZGlsYXRpb25IZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeFJvd09mZnNldCA9IHhEZXB0aE9mZnNldCArIHhSb3cgKiBzdHJpZGVzWzJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB4Q29sID0geENvbE1pbjsgeENvbCA8IHhDb2xNYXg7IHhDb2wgKz0gZGlsYXRpb25XaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeENvbE9mZnNldCA9IHhSb3dPZmZzZXQgKyB4Q29sICogc3RyaWRlc1szXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBpeGVsID0geFZhbHVlc1t4Q29sT2Zmc2V0ICsgY2hhbm5lbF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHBvb2xUeXBlID09PSAnbWF4JyAmJiBwaXhlbCA+IG1pbk1heFZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk1heFZhbHVlID0gcGl4ZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwb29sVHlwZSA9PT0gJ2F2ZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmdWYWx1ZSArPSBwaXhlbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKG1pbk1heFZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc05hTihtaW5NYXhWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc05hTihtaW5NYXhWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0T2Zmc2V0ID0gb3V0cHV0Q29sT2Zmc2V0ICsgY2hhbm5lbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFZhbHNbb3V0cHV0T2Zmc2V0XSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbFR5cGUgPT09ICdhdmcnID8gYXZnVmFsdWUgLyBjb3VudCA6IG1pbk1heFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG59XG5leHBvcnQgZnVuY3Rpb24gbWF4UG9vbDNkUG9zaXRpb25zKHhCdWYsIGNvbnZJbmZvKSB7XG4gICAgY29uc3QgbWF4UG9zaXRpb25zID0gYnVmZmVyKGNvbnZJbmZvLm91dFNoYXBlLCAnaW50MzInKTtcbiAgICBjb25zdCBzdHJpZGVEZXB0aCA9IGNvbnZJbmZvLnN0cmlkZURlcHRoO1xuICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICAgIGNvbnN0IGRpbGF0aW9uRGVwdGggPSBjb252SW5mby5kaWxhdGlvbkRlcHRoO1xuICAgIGNvbnN0IGRpbGF0aW9uSGVpZ2h0ID0gY29udkluZm8uZGlsYXRpb25IZWlnaHQ7XG4gICAgY29uc3QgZGlsYXRpb25XaWR0aCA9IGNvbnZJbmZvLmRpbGF0aW9uV2lkdGg7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVyRGVwdGggPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJEZXB0aDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJIZWlnaHQ7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVyV2lkdGggPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJXaWR0aDtcbiAgICBjb25zdCBwYWRGcm9udCA9IGNvbnZJbmZvLnBhZEluZm8uZnJvbnQ7XG4gICAgY29uc3QgcGFkVG9wID0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgcGFkTGVmdCA9IGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICBmb3IgKGxldCBiYXRjaCA9IDA7IGJhdGNoIDwgY29udkluZm8uYmF0Y2hTaXplOyArK2JhdGNoKSB7XG4gICAgICAgIGZvciAobGV0IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgY29udkluZm8uaW5DaGFubmVsczsgKytjaGFubmVsKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB5RGVwdGggPSAwOyB5RGVwdGggPCBjb252SW5mby5vdXREZXB0aDsgKyt5RGVwdGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4RGVwdGhDb3JuZXIgPSB5RGVwdGggKiBzdHJpZGVEZXB0aCAtIHBhZEZyb250O1xuICAgICAgICAgICAgICAgIGxldCB4RGVwdGhNaW4gPSB4RGVwdGhDb3JuZXI7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHhEZXB0aE1pbiA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgeERlcHRoTWluICs9IGRpbGF0aW9uRGVwdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHhEZXB0aE1heCA9IE1hdGgubWluKGNvbnZJbmZvLmluRGVwdGgsIGVmZmVjdGl2ZUZpbHRlckRlcHRoICsgeERlcHRoQ29ybmVyKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB5Um93ID0gMDsgeVJvdyA8IGNvbnZJbmZvLm91dEhlaWdodDsgKyt5Um93KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhSb3dDb3JuZXIgPSB5Um93ICogc3RyaWRlSGVpZ2h0IC0gcGFkVG9wO1xuICAgICAgICAgICAgICAgICAgICBsZXQgeFJvd01pbiA9IHhSb3dDb3JuZXI7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4Um93TWluIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgeFJvd01pbiArPSBkaWxhdGlvbkhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCB4Um93TWF4ID0gTWF0aC5taW4oY29udkluZm8uaW5IZWlnaHQsIGVmZmVjdGl2ZUZpbHRlckhlaWdodCArIHhSb3dDb3JuZXIpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB5Q29sID0gMDsgeUNvbCA8IGNvbnZJbmZvLm91dFdpZHRoOyArK3lDb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhDb2xDb3JuZXIgPSB5Q29sICogc3RyaWRlV2lkdGggLSBwYWRMZWZ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHhDb2xNaW4gPSB4Q29sQ29ybmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhDb2xNaW4gPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeENvbE1pbiArPSBkaWxhdGlvbldpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeENvbE1heCA9IE1hdGgubWluKGNvbnZJbmZvLmluV2lkdGgsIGVmZmVjdGl2ZUZpbHRlcldpZHRoICsgeENvbENvcm5lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTaGFkZXIgY29kZSBiZWdpbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtYXhWYWx1ZSA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtYXhQb3NpdGlvbiA9IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgeERlcHRoID0geERlcHRoTWluOyB4RGVwdGggPCB4RGVwdGhNYXg7IHhEZXB0aCArPSBkaWxhdGlvbkRlcHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd0RlcHRoID0geERlcHRoIC0geERlcHRoQ29ybmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHhSb3cgPSB4Um93TWluOyB4Um93IDwgeFJvd01heDsgeFJvdyArPSBkaWxhdGlvbkhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Um93ID0geFJvdyAtIHhSb3dDb3JuZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHhDb2wgPSB4Q29sTWluOyB4Q29sIDwgeENvbE1heDsgeENvbCArPSBkaWxhdGlvbldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Q29sID0geENvbCAtIHhDb2xDb3JuZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwaXhlbCA9IHhCdWYuZ2V0KGJhdGNoLCB4RGVwdGgsIHhSb3csIHhDb2wsIGNoYW5uZWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBpeGVsID49IG1heFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4VmFsdWUgPSBwaXhlbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhQb3NpdGlvbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdEZXB0aCAqIGVmZmVjdGl2ZUZpbHRlckhlaWdodCAqIGVmZmVjdGl2ZUZpbHRlcldpZHRoICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdSb3cgKiBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgKyB3Q29sO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4UG9zaXRpb25zLnNldChtYXhQb3NpdGlvbiwgYmF0Y2gsIHlEZXB0aCwgeVJvdywgeUNvbCwgY2hhbm5lbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1heFBvc2l0aW9ucztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBvb2xfdXRpbHMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG4vKipcbiAqIFRlbXBsYXRlIHRoYXQgY3JlYXRlcyBpbXBsZW1lbnRhdGlvbiBmb3IgdW5hcnkgb3AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTaW1wbGVVbmFyeUltcGwob3ApIHtcbiAgICByZXR1cm4gKHZhbHVlcywgZHR5cGUsIGF0dHJzKSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IHV0aWwuZ2V0VHlwZWRBcnJheUZyb21EVHlwZShkdHlwZSwgdmFsdWVzLmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZXNbaV0gPSBvcCh2YWx1ZXNbaV0sIGF0dHJzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3VmFsdWVzO1xuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11bmFyeV9pbXBsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbi8qKlxuICogVGVtcGxhdGUgdGhhdCBjcmVhdGVzIGEgYEtlcm5lbEZ1bmNgIGZvciB1bmFyeSBvcHMuXG4gKiBAcGFyYW0gbmFtZSBLZXJuZWwgbmFtZS5cbiAqIEBwYXJhbSBvcCBBIGBTaW1wbGVVbmFyeU9wZXJhdGlvbmAgZm9yIHRoZSBrZXJuZWwuXG4gKiBAcGFyYW0gZHR5cGUgT3B0aW9uYWwuIElmIHNldCwgdGhlIHJlc3VsdCBoYXMgdGhpcyBkdHlwZS4gT3RoZXJ3aXNlLCB0aGVcbiAqICAgICByZXN1bHQgaGFzIHRoZSBzYW1lIGR0eXBlIGFzIHRoZSBpbnB1dC4gVGhpcyBpcyBtYWlubHkgdXNlZCBpbiBjZXJ0YWluXG4gKiAgICAga2VybmVscyB0aGF0IHJldHVybiBib29sIHR5cGUsIHN1Y2ggYXMgaXNGaW5pdGUsIGlzSW5mLCBldGMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmFyeUtlcm5lbEZ1bmMobmFtZSwgb3AsIGR0eXBlKSB7XG4gICAgcmV0dXJuICh7IGlucHV0cywgYXR0cnMsIGJhY2tlbmQgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICAgICAgYXNzZXJ0Tm90Q29tcGxleCh4LCBuYW1lKTtcbiAgICAgICAgaWYgKHguZHR5cGUgPT09ICdzdHJpbmcnIHx8IGR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmFyeUtlcm5lbEZ1bmMgZG9lcyBub3Qgc3VwcG9ydCBzdHJpbmcgaW5wdXQvb3V0cHV0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY3B1QmFja2VuZCA9IGJhY2tlbmQ7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcztcbiAgICAgICAgY29uc3QgeFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoeC5zaGFwZSk7XG4gICAgICAgIGNvbnN0ICRkdHlwZSA9IGR0eXBlIHx8IHguZHR5cGU7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IHV0aWwuZ2V0QXJyYXlGcm9tRFR5cGUoJGR0eXBlLCB4U2l6ZSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeFNpemU7ICsraSkge1xuICAgICAgICAgICAgbmV3VmFsdWVzW2ldID0gb3AodmFsdWVzW2ldLCBhdHRycyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNwdUJhY2tlbmQubWFrZVRlbnNvckluZm8oeC5zaGFwZSwgJGR0eXBlLCBuZXdWYWx1ZXMpO1xuICAgIH07XG59XG4vKipcbiAqIFRlbXBsYXRlIHRoYXQgY3JlYXRlcyBhIGBLZXJuZWxGdW5jYCBmb3IgdW5hcnkgb3BzIGZyb20gdGhlIGdpdmVuXG4gKiBgU2ltcGxlVW5hcnlJbXBsYC4uXG4gKiBAcGFyYW0gbmFtZSBLZXJuZWwgbmFtZS5cbiAqIEBwYXJhbSB1bmFyeUltcGwgQSBgU2ltcGxlVW5hcnlJbXBsYCB0aGF0IGltcGxlbWVudHMgdGhlIG9wLlxuICogQHBhcmFtIGR0eXBlIE9wdGlvbmFsLiBJZiBzZXQsIHRoZSByZXN1bHQgaGFzIHRoaXMgZHR5cGUuIE90aGVyd2lzZSwgdGhlXG4gKiAgICAgcmVzdWx0IGhhcyB0aGUgc2FtZSBkdHlwZSBhcyB0aGUgaW5wdXQuIFRoaXMgaXMgbWFpbmx5IHVzZWQgaW4gY2VydGFpblxuICogICAgIGtlcm5lbHMgdGhhdCByZXR1cm4gYm9vbCB0eXBlLCBzdWNoIGFzIGlzRmluaXRlLCBpc0luZiwgZXRjLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5hcnlLZXJuZWxGdW5jRnJvbUltcGwobmFtZSwgdW5hcnlJbXBsLCBkdHlwZSkge1xuICAgIHJldHVybiAoeyBpbnB1dHMsIGF0dHJzLCBiYWNrZW5kIH0pID0+IHtcbiAgICAgICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgICAgIGFzc2VydE5vdENvbXBsZXgoeCwgbmFtZSk7XG4gICAgICAgIGlmICh4LmR0eXBlID09PSAnc3RyaW5nJyB8fCBkdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndW5hcnlLZXJuZWxGdW5jIGRvZXMgbm90IHN1cHBvcnQgc3RyaW5nIGlucHV0L291dHB1dCcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNwdUJhY2tlbmQgPSBiYWNrZW5kO1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgICAgIGNvbnN0ICRkdHlwZSA9IGR0eXBlIHx8IHguZHR5cGU7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IHVuYXJ5SW1wbCh2YWx1ZXMsICRkdHlwZSwgYXR0cnMpO1xuICAgICAgICByZXR1cm4gY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbyh4LnNoYXBlLCAkZHR5cGUsIG5ld1ZhbHVlcyk7XG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVuYXJ5X3V0aWxzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY29tcGxleCB9IGZyb20gJy4uL2tlcm5lbHMvQ29tcGxleCc7XG4vKipcbiAqIEdlbmVyYXRlcyBhIHRlbnNvckluZm8gd2l0aCBhbGwgemVyb3MgdmFsdWUuXG4gKiBAcGFyYW0gYmFja2VuZCBjcHUgYmFja2VuZC5cbiAqIEBwYXJhbSBzaGFwZSBTaGFwZSBmb3IgdGhlIHplcm9zIHRlbnNvci5cbiAqIEBwYXJhbSBkdHlwZSBPcHRpb25hbC4gSWYgc2V0LCB0aGUgcmVzdWx0IGhhcyB0aGlzIGR0eXBlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gemVyb3MoYmFja2VuZCwgc2hhcGUsIGR0eXBlID0gJ2Zsb2F0MzInKSB7XG4gICAgaWYgKGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICBjb25zdCByZWFsID0gemVyb3MoYmFja2VuZCwgc2hhcGUsICdmbG9hdDMyJyk7XG4gICAgICAgIGNvbnN0IGltYWcgPSB6ZXJvcyhiYWNrZW5kLCBzaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICAgICAgcmV0dXJuIGNvbXBsZXgoeyBpbnB1dHM6IHsgcmVhbCwgaW1hZyB9LCBiYWNrZW5kIH0pO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZXMgPSB1dGlsLm1ha2VaZXJvc1R5cGVkQXJyYXkodXRpbC5zaXplRnJvbVNoYXBlKHNoYXBlKSwgZHR5cGUpO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHNoYXBlLCBkdHlwZSwgdmFsdWVzKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXplcm9zX2ltcGwuanMubWFwIiwiLyoqIEBsaWNlbnNlIFNlZSB0aGUgTElDRU5TRSBmaWxlLiAqL1xuLy8gVGhpcyBjb2RlIGlzIGF1dG8tZ2VuZXJhdGVkLCBkbyBub3QgbW9kaWZ5IHRoaXMgZmlsZSFcbmNvbnN0IHZlcnNpb24gPSAnMy44LjAnO1xuZXhwb3J0IHsgdmVyc2lvbiB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dmVyc2lvbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgJy4vZmxhZ3Nfd2FzbSc7XG5pbXBvcnQgeyBEYXRhU3RvcmFnZSwgZGVwcmVjYXRpb25XYXJuLCBlbmdpbmUsIGVudiwgS2VybmVsQmFja2VuZCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgd2FzbUZhY3RvcnlUaHJlYWRlZFNpbWQgZnJvbSAnLi4vd2FzbS1vdXQvdGZqcy1iYWNrZW5kLXdhc20tdGhyZWFkZWQtc2ltZC5qcyc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyB3YXNtV29ya2VyQ29udGVudHMgfSBmcm9tICcuLi93YXNtLW91dC90ZmpzLWJhY2tlbmQtd2FzbS10aHJlYWRlZC1zaW1kLndvcmtlci5qcyc7XG5pbXBvcnQgd2FzbUZhY3RvcnkgZnJvbSAnLi4vd2FzbS1vdXQvdGZqcy1iYWNrZW5kLXdhc20uanMnO1xuZXhwb3J0IGNsYXNzIEJhY2tlbmRXYXNtIGV4dGVuZHMgS2VybmVsQmFja2VuZCB7XG4gICAgY29uc3RydWN0b3Iod2FzbSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLndhc20gPSB3YXNtO1xuICAgICAgICAvLyAwIGlzIHJlc2VydmVkIGZvciBudWxsIGRhdGEgaWRzLlxuICAgICAgICB0aGlzLmRhdGFJZE5leHROdW1iZXIgPSAxO1xuICAgICAgICB0aGlzLndhc20udGZqcy5pbml0KCk7XG4gICAgICAgIHRoaXMuZGF0YUlkTWFwID0gbmV3IERhdGFTdG9yYWdlKHRoaXMsIGVuZ2luZSgpKTtcbiAgICB9XG4gICAgd3JpdGUodmFsdWVzLCBzaGFwZSwgZHR5cGUpIHtcbiAgICAgICAgY29uc3QgZGF0YUlkID0geyBpZDogdGhpcy5kYXRhSWROZXh0TnVtYmVyKysgfTtcbiAgICAgICAgdGhpcy5tb3ZlKGRhdGFJZCwgdmFsdWVzLCBzaGFwZSwgZHR5cGUsIDEpO1xuICAgICAgICByZXR1cm4gZGF0YUlkO1xuICAgIH1cbiAgICBudW1EYXRhSWRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhSWRNYXAubnVtRGF0YUlkcygpO1xuICAgIH1cbiAgICBhc3luYyB0aW1lKGYpIHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSB1dGlsLm5vdygpO1xuICAgICAgICBmKCk7XG4gICAgICAgIGNvbnN0IGtlcm5lbE1zID0gdXRpbC5ub3coKSAtIHN0YXJ0O1xuICAgICAgICByZXR1cm4geyBrZXJuZWxNcyB9O1xuICAgIH1cbiAgICBtb3ZlKGRhdGFJZCwgdmFsdWVzLCBzaGFwZSwgZHR5cGUsIHJlZkNvdW50KSB7XG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5kYXRhSWROZXh0TnVtYmVyKys7XG4gICAgICAgIGlmIChkdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0cmluZ0J5dGVzID0gdmFsdWVzO1xuICAgICAgICAgICAgdGhpcy5kYXRhSWRNYXAuc2V0KGRhdGFJZCwgeyBpZCwgc3RyaW5nQnl0ZXMsIHNoYXBlLCBkdHlwZSwgbWVtb3J5T2Zmc2V0OiBudWxsLCByZWZDb3VudCB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHNoYXBlKTtcbiAgICAgICAgY29uc3QgbnVtQnl0ZXMgPSBzaXplICogdXRpbC5ieXRlc1BlckVsZW1lbnQoZHR5cGUpO1xuICAgICAgICBjb25zdCBtZW1vcnlPZmZzZXQgPSB0aGlzLndhc20uX21hbGxvYyhudW1CeXRlcyk7XG4gICAgICAgIHRoaXMuZGF0YUlkTWFwLnNldChkYXRhSWQsIHsgaWQsIG1lbW9yeU9mZnNldCwgc2hhcGUsIGR0eXBlLCByZWZDb3VudCB9KTtcbiAgICAgICAgdGhpcy53YXNtLnRmanMucmVnaXN0ZXJUZW5zb3IoaWQsIHNpemUsIG1lbW9yeU9mZnNldCk7XG4gICAgICAgIGlmICh2YWx1ZXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy53YXNtLkhFQVBVOC5zZXQobmV3IFVpbnQ4QXJyYXkodmFsdWVzLmJ1ZmZlciwgdmFsdWVzLmJ5dGVPZmZzZXQsIG51bUJ5dGVzKSwgbWVtb3J5T2Zmc2V0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyByZWFkKGRhdGFJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkU3luYyhkYXRhSWQpO1xuICAgIH1cbiAgICByZWFkU3luYyhkYXRhSWQpIHtcbiAgICAgICAgY29uc3QgeyBtZW1vcnlPZmZzZXQsIGR0eXBlLCBzaGFwZSwgc3RyaW5nQnl0ZXMgfSA9IHRoaXMuZGF0YUlkTWFwLmdldChkYXRhSWQpO1xuICAgICAgICBpZiAoZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nQnl0ZXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYnl0ZXMgPSB0aGlzLndhc20uSEVBUFU4LnNsaWNlKG1lbW9yeU9mZnNldCwgbWVtb3J5T2Zmc2V0ICsgdXRpbC5zaXplRnJvbVNoYXBlKHNoYXBlKSAqIHV0aWwuYnl0ZXNQZXJFbGVtZW50KGR0eXBlKSk7XG4gICAgICAgIHJldHVybiB0eXBlZEFycmF5RnJvbUJ1ZmZlcihieXRlcy5idWZmZXIsIGR0eXBlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGlzcG9zZSB0aGUgbWVtb3J5IGlmIHRoZSBkYXRhSWQgaGFzIDAgcmVmQ291bnQuIFJldHVybiB0cnVlIGlmIHRoZSBtZW1vcnlcbiAgICAgKiBpcyByZWxlYXNlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqIEBwYXJhbSBkYXRhSWRcbiAgICAgKiBAb2FyYW0gZm9yY2UgT3B0aW9uYWwsIHJlbW92ZSB0aGUgZGF0YSByZWdhcmRsZXNzIG9mIHJlZkNvdW50XG4gICAgICovXG4gICAgZGlzcG9zZURhdGEoZGF0YUlkLCBmb3JjZSA9IGZhbHNlKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGFJZE1hcC5oYXMoZGF0YUlkKSkge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YUlkTWFwLmdldChkYXRhSWQpO1xuICAgICAgICAgICAgZGF0YS5yZWZDb3VudC0tO1xuICAgICAgICAgICAgaWYgKCFmb3JjZSAmJiBkYXRhLnJlZkNvdW50ID4gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMud2FzbS5fZnJlZShkYXRhLm1lbW9yeU9mZnNldCk7XG4gICAgICAgICAgICB0aGlzLndhc20udGZqcy5kaXNwb3NlRGF0YShkYXRhLmlkKTtcbiAgICAgICAgICAgIHRoaXMuZGF0YUlkTWFwLmRlbGV0ZShkYXRhSWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKiogUmV0dXJuIHJlZkNvdW50IG9mIGEgYFRlbnNvckRhdGFgLiAqL1xuICAgIHJlZkNvdW50KGRhdGFJZCkge1xuICAgICAgICBpZiAodGhpcy5kYXRhSWRNYXAuaGFzKGRhdGFJZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHRlbnNvckRhdGEgPSB0aGlzLmRhdGFJZE1hcC5nZXQoZGF0YUlkKTtcbiAgICAgICAgICAgIHJldHVybiB0ZW5zb3JEYXRhLnJlZkNvdW50O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBpbmNSZWYoZGF0YUlkKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGFJZE1hcC5nZXQoZGF0YUlkKTtcbiAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkge1xuICAgICAgICAgICAgZGF0YS5yZWZDb3VudCsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZsb2F0UHJlY2lzaW9uKCkge1xuICAgICAgICByZXR1cm4gMzI7XG4gICAgfVxuICAgIC8vIFJldHVybnMgdGhlIG1lbW9yeSBvZmZzZXQgb2YgYSB0ZW5zb3IuIFVzZWZ1bCBmb3IgZGVidWdnaW5nIGFuZCB1bml0XG4gICAgLy8gdGVzdGluZy5cbiAgICBnZXRNZW1vcnlPZmZzZXQoZGF0YUlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFJZE1hcC5nZXQoZGF0YUlkKS5tZW1vcnlPZmZzZXQ7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIHRoaXMud2FzbS50ZmpzLmRpc3Bvc2UoKTtcbiAgICAgICAgaWYgKCdQVGhyZWFkJyBpbiB0aGlzLndhc20pIHtcbiAgICAgICAgICAgIHRoaXMud2FzbS5QVGhyZWFkLnRlcm1pbmF0ZUFsbFRocmVhZHMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndhc20gPSBudWxsO1xuICAgIH1cbiAgICBtZW1vcnkoKSB7XG4gICAgICAgIHJldHVybiB7IHVucmVsaWFibGU6IGZhbHNlIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1ha2UgYSB0ZW5zb3IgaW5mbyBmb3IgdGhlIG91dHB1dCBvZiBhbiBvcC4gSWYgYG1lbW9yeU9mZnNldGAgaXMgbm90XG4gICAgICogcHJlc2VudCwgdGhpcyBtZXRob2QgYWxsb2NhdGVzIG1lbW9yeSBvbiB0aGUgV0FTTSBoZWFwLiBJZiBgbWVtb3J5T2Zmc2V0YFxuICAgICAqIGlzIHByZXNlbnQsIHRoZSBtZW1vcnkgd2FzIGFsbG9jYXRlZCBlbHNld2hlcmUgKGluIGMrKykgYW5kIHdlIGp1c3QgcmVjb3JkXG4gICAgICogdGhlIHBvaW50ZXIgd2hlcmUgdGhhdCBtZW1vcnkgbGl2ZXMuXG4gICAgICovXG4gICAgbWFrZU91dHB1dChzaGFwZSwgZHR5cGUsIG1lbW9yeU9mZnNldCkge1xuICAgICAgICBsZXQgZGF0YUlkO1xuICAgICAgICBpZiAobWVtb3J5T2Zmc2V0ID09IG51bGwpIHtcbiAgICAgICAgICAgIGRhdGFJZCA9IHRoaXMud3JpdGUobnVsbCAvKiB2YWx1ZXMgKi8sIHNoYXBlLCBkdHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBpZCA9IHRoaXMuZGF0YUlkTmV4dE51bWJlcisrO1xuICAgICAgICAgICAgZGF0YUlkID0geyBpZCB9O1xuICAgICAgICAgICAgdGhpcy5kYXRhSWRNYXAuc2V0KGRhdGFJZCwgeyBpZCwgbWVtb3J5T2Zmc2V0LCBzaGFwZSwgZHR5cGUsIHJlZkNvdW50OiAxIH0pO1xuICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShzaGFwZSk7XG4gICAgICAgICAgICB0aGlzLndhc20udGZqcy5yZWdpc3RlclRlbnNvcihpZCwgc2l6ZSwgbWVtb3J5T2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBkYXRhSWQsIHNoYXBlLCBkdHlwZSB9O1xuICAgIH1cbiAgICB0eXBlZEFycmF5RnJvbUhlYXAoeyBzaGFwZSwgZHR5cGUsIGRhdGFJZCB9KSB7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMud2FzbS5IRUFQVTguYnVmZmVyO1xuICAgICAgICBjb25zdCB7IG1lbW9yeU9mZnNldCB9ID0gdGhpcy5kYXRhSWRNYXAuZ2V0KGRhdGFJZCk7XG4gICAgICAgIGNvbnN0IHNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoc2hhcGUpO1xuICAgICAgICBzd2l0Y2ggKGR0eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdmbG9hdDMyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheShidWZmZXIsIG1lbW9yeU9mZnNldCwgc2l6ZSk7XG4gICAgICAgICAgICBjYXNlICdpbnQzMic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgbWVtb3J5T2Zmc2V0LCBzaXplKTtcbiAgICAgICAgICAgIGNhc2UgJ2Jvb2wnOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShidWZmZXIsIG1lbW9yeU9mZnNldCwgc2l6ZSk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBkdHlwZSAke2R0eXBlfWApO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gY3JlYXRlSW5zdGFudGlhdGVXYXNtRnVuYyhwYXRoKSB7XG4gICAgLy8gdGhpcyB3aWxsIGJlIHJlcGxhY2UgYnkgcm9sbHVwIHBsdWdpbiBwYXRjaFdlY2hhdFdlYkFzc2VtYmx5IGluIFxuICAgIC8vIG1pbnByb2dyYW0ncyBvdXRwdXQuXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgIHJldHVybiAoaW1wb3J0cywgY2FsbGJhY2spID0+IHtcbiAgICAgICAgdXRpbC5mZXRjaChwYXRoLCB7IGNyZWRlbnRpYWxzOiAnc2FtZS1vcmlnaW4nIH0pLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXJlc3BvbnNlWydvayddKSB7XG4gICAgICAgICAgICAgICAgaW1wb3J0cy5lbnYuYShgZmFpbGVkIHRvIGxvYWQgd2FzbSBiaW5hcnkgZmlsZSBhdCAnJHtwYXRofSdgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3BvbnNlLmFycmF5QnVmZmVyKCkudGhlbihiaW5hcnkgPT4ge1xuICAgICAgICAgICAgICAgIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKGJpbmFyeSwgaW1wb3J0cykudGhlbihvdXRwdXQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhvdXRwdXQuaW5zdGFuY2UsIG91dHB1dC5tb2R1bGUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge307XG4gICAgfTtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgcGF0aCBvZiB0aGUgV0FTTSBiaW5hcnkuXG4gKiBAcGFyYW0gc2ltZFN1cHBvcnRlZCB3aGV0aGVyIFNJTUQgaXMgc3VwcG9ydGVkXG4gKiBAcGFyYW0gdGhyZWFkc1N1cHBvcnRlZCB3aGV0aGVyIG11bHRpdGhyZWFkaW5nIGlzIHN1cHBvcnRlZFxuICogQHBhcmFtIHdhc21Nb2R1bGVGb2xkZXIgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBXQVNNIGJpbmFyaWVzLlxuICovXG5mdW5jdGlvbiBnZXRQYXRoVG9XYXNtQmluYXJ5KHNpbWRTdXBwb3J0ZWQsIHRocmVhZHNTdXBwb3J0ZWQsIHdhc21Nb2R1bGVGb2xkZXIpIHtcbiAgICBpZiAod2FzbVBhdGggIT0gbnVsbCkge1xuICAgICAgICAvLyBJZiB3YXNtUGF0aCBpcyBkZWZpbmVkLCB0aGUgdXNlciBoYXMgc3VwcGxpZWQgYSBmdWxsIHBhdGggdG9cbiAgICAgICAgLy8gdGhlIHZhbmlsbGEgLndhc20gYmluYXJ5LlxuICAgICAgICByZXR1cm4gd2FzbVBhdGg7XG4gICAgfVxuICAgIGxldCBwYXRoID0gJ3RmanMtYmFja2VuZC13YXNtLndhc20nO1xuICAgIGlmIChzaW1kU3VwcG9ydGVkICYmIHRocmVhZHNTdXBwb3J0ZWQpIHtcbiAgICAgICAgcGF0aCA9ICd0ZmpzLWJhY2tlbmQtd2FzbS10aHJlYWRlZC1zaW1kLndhc20nO1xuICAgIH1cbiAgICBlbHNlIGlmIChzaW1kU3VwcG9ydGVkKSB7XG4gICAgICAgIHBhdGggPSAndGZqcy1iYWNrZW5kLXdhc20tc2ltZC53YXNtJztcbiAgICB9XG4gICAgaWYgKHdhc21GaWxlTWFwICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHdhc21GaWxlTWFwW3BhdGhdICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB3YXNtRmlsZU1hcFtwYXRoXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gd2FzbU1vZHVsZUZvbGRlciArIHBhdGg7XG59XG4vKipcbiAqIEluaXRpYWxpemVzIHRoZSB3YXNtIG1vZHVsZSBhbmQgY3JlYXRlcyB0aGUganMgPC0tPiB3YXNtIGJyaWRnZS5cbiAqXG4gKiBOT1RFOiBXZSB3cmFwIHRoZSB3YXNtIG1vZHVsZSBpbiBhIG9iamVjdCB3aXRoIHByb3BlcnR5ICd3YXNtJyBpbnN0ZWFkIG9mXG4gKiByZXR1cm5pbmcgUHJvbWlzZTxCYWNrZW5kV2FzbU1vZHVsZT4gdG8gYXZvaWQgZnJlZXppbmcgQ2hyb21lIChsYXN0IHRlc3RlZFxuICogaW4gQ2hyb21lIDc2KS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgY29uc3QgW3NpbWRTdXBwb3J0ZWQsIHRocmVhZHNTdXBwb3J0ZWRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBlbnYoKS5nZXRBc3luYygnV0FTTV9IQVNfU0lNRF9TVVBQT1JUJyksXG4gICAgICAgIGVudigpLmdldEFzeW5jKCdXQVNNX0hBU19NVUxUSVRIUkVBRF9TVVBQT1JUJylcbiAgICBdKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCBmYWN0b3J5Q29uZmlnID0ge307XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGZ1bmN0aW9uIG92ZXJyaWRlcyB0aGUgRW1zY3JpcHRlbiBtb2R1bGUgbG9jYXRlRmlsZSB1dGlsaXR5LlxuICAgICAgICAgKiBAcGFyYW0gcGF0aCBUaGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgZmlsZSB0aGF0IG5lZWRzIHRvIGJlIGxvYWRlZC5cbiAgICAgICAgICogQHBhcmFtIHByZWZpeCBUaGUgcGF0aCB0byB0aGUgbWFpbiBKYXZhU2NyaXB0IGZpbGUncyBkaXJlY3RvcnkuXG4gICAgICAgICAqL1xuICAgICAgICBmYWN0b3J5Q29uZmlnLmxvY2F0ZUZpbGUgPSAocGF0aCwgcHJlZml4KSA9PiB7XG4gICAgICAgICAgICBpZiAocGF0aC5lbmRzV2l0aCgnLndvcmtlci5qcycpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB3YXNtV29ya2VyQ29udGVudHM7XG4gICAgICAgICAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtyZXNwb25zZV0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL2phdmFzY3JpcHQnIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhdGguZW5kc1dpdGgoJy53YXNtJykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UGF0aFRvV2FzbUJpbmFyeShzaW1kU3VwcG9ydGVkLCB0aHJlYWRzU3VwcG9ydGVkLCB3YXNtUGF0aFByZWZpeCAhPSBudWxsID8gd2FzbVBhdGhQcmVmaXggOiBwcmVmaXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArIHBhdGg7XG4gICAgICAgIH07XG4gICAgICAgIC8vIFVzZSB0aGUgaW5zdGFudGlhdGVXYXNtIG92ZXJyaWRlIHdoZW4gc3lzdGVtIGZldGNoIGlzIG5vdCBhdmFpbGFibGUuXG4gICAgICAgIC8vIFJlZmVyZW5jZTpcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2Vtc2NyaXB0ZW4tY29yZS9lbXNjcmlwdGVuL2Jsb2IvMmJjYTA4M2NiYmQ1YTQxMzNkYjYxZmJkNzRkMDRmN2ZlZWNmYTkwNy90ZXN0cy9tYW51YWxfd2FzbV9pbnN0YW50aWF0ZS5odG1sI0wxNzBcbiAgICAgICAgaWYgKGN1c3RvbUZldGNoKSB7XG4gICAgICAgICAgICBmYWN0b3J5Q29uZmlnLmluc3RhbnRpYXRlV2FzbSA9XG4gICAgICAgICAgICAgICAgY3JlYXRlSW5zdGFudGlhdGVXYXNtRnVuYyhnZXRQYXRoVG9XYXNtQmluYXJ5KHNpbWRTdXBwb3J0ZWQsIHRocmVhZHNTdXBwb3J0ZWQsIHdhc21QYXRoUHJlZml4ICE9IG51bGwgPyB3YXNtUGF0aFByZWZpeCA6ICcnKSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgICAgIGZhY3RvcnlDb25maWcub25BYm9ydCA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChpbml0aWFsaXplZCkge1xuICAgICAgICAgICAgICAgIC8vIEVtc2NyaXB0ZW4gYWxyZWFkeSBjYWxsZWQgY29uc29sZS53YXJuIHNvIG5vIG5lZWQgdG8gZG91YmxlIGxvZy5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5pdEFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBFbXNjcmlwdGVuIGNhbGxzIGBvbkFib3J0YCB0d2ljZSwgcmVzdWx0aW5nIGluIGRvdWJsZSBlcnJvclxuICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzLlxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGluaXRBYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnN0IHJlamVjdE1zZyA9ICdNYWtlIHN1cmUgdGhlIHNlcnZlciBjYW4gc2VydmUgdGhlIGAud2FzbWAgZmlsZSByZWxhdGl2ZSB0byB0aGUgJyArXG4gICAgICAgICAgICAgICAgJ2J1bmRsZWQganMgZmlsZS4gRm9yIG1vcmUgZGV0YWlscyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGZqcy9ibG9iL21hc3Rlci90ZmpzLWJhY2tlbmQtd2FzbS9SRUFETUUubWQjdXNpbmctYnVuZGxlcnMnO1xuICAgICAgICAgICAgcmVqZWN0KHsgbWVzc2FnZTogcmVqZWN0TXNnIH0pO1xuICAgICAgICB9O1xuICAgICAgICBsZXQgd2FzbTtcbiAgICAgICAgLy8gSWYgYHdhc21QYXRoYCBoYXMgYmVlbiBkZWZpbmVkIHdlIG11c3QgaW5pdGlhbGl6ZSB0aGUgdmFuaWxsYSBtb2R1bGUuXG4gICAgICAgIGlmICh0aHJlYWRzU3VwcG9ydGVkICYmIHNpbWRTdXBwb3J0ZWQgJiYgd2FzbVBhdGggPT0gbnVsbCkge1xuICAgICAgICAgICAgZmFjdG9yeUNvbmZpZy5tYWluU2NyaXB0VXJsT3JCbG9iID0gbmV3IEJsb2IoW2B2YXIgV2FzbUJhY2tlbmRNb2R1bGVUaHJlYWRlZFNpbWQgPSBgICtcbiAgICAgICAgICAgICAgICAgICAgd2FzbUZhY3RvcnlUaHJlYWRlZFNpbWQudG9TdHJpbmcoKV0sIHsgdHlwZTogJ3RleHQvamF2YXNjcmlwdCcgfSk7XG4gICAgICAgICAgICB3YXNtID0gd2FzbUZhY3RvcnlUaHJlYWRlZFNpbWQoZmFjdG9yeUNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBUaGUgd2FzbUZhY3Rvcnkgd29ya3MgZm9yIGJvdGggdmFuaWxsYSBhbmQgU0lNRCBiaW5hcmllcy5cbiAgICAgICAgICAgIHdhc20gPSB3YXNtRmFjdG9yeShmYWN0b3J5Q29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgV0FTTSBtb2R1bGUgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgYnkgdGhlIGZhY3RvcnkuXG4gICAgICAgIC8vIEFueSBlcnJvciB3aWxsIGJlIGNhdWdodCBieSB0aGUgb25BYm9ydCBjYWxsYmFjayBkZWZpbmVkIGFib3ZlLlxuICAgICAgICB3YXNtLnRoZW4oKG1vZHVsZSkgPT4ge1xuICAgICAgICAgICAgaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgICAgICAgaW5pdEFib3J0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IHZvaWRSZXR1cm5UeXBlID0gbnVsbDtcbiAgICAgICAgICAgIC8vIFVzaW5nIHRoZSB0ZmpzIG5hbWVzcGFjZSB0byBhdm9pZCBjb25mbGljdCB3aXRoIGVtc2NyaXB0ZW4ncyBBUEkuXG4gICAgICAgICAgICBtb2R1bGUudGZqcyA9IHtcbiAgICAgICAgICAgICAgICBpbml0OiBtb2R1bGUuY3dyYXAoJ2luaXQnLCBudWxsLCBbXSksXG4gICAgICAgICAgICAgICAgcmVnaXN0ZXJUZW5zb3I6IG1vZHVsZS5jd3JhcCgncmVnaXN0ZXJfdGVuc29yJywgbnVsbCwgW1xuICAgICAgICAgICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgICAgIGRpc3Bvc2VEYXRhOiBtb2R1bGUuY3dyYXAoJ2Rpc3Bvc2VfZGF0YScsIHZvaWRSZXR1cm5UeXBlLCBbJ251bWJlciddKSxcbiAgICAgICAgICAgICAgICBkaXNwb3NlOiBtb2R1bGUuY3dyYXAoJ2Rpc3Bvc2UnLCB2b2lkUmV0dXJuVHlwZSwgW10pLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlc29sdmUoeyB3YXNtOiBtb2R1bGUgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gdHlwZWRBcnJheUZyb21CdWZmZXIoYnVmZmVyLCBkdHlwZSkge1xuICAgIHN3aXRjaCAoZHR5cGUpIHtcbiAgICAgICAgY2FzZSAnZmxvYXQzMic6XG4gICAgICAgICAgICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheShidWZmZXIpO1xuICAgICAgICBjYXNlICdpbnQzMic6XG4gICAgICAgICAgICByZXR1cm4gbmV3IEludDMyQXJyYXkoYnVmZmVyKTtcbiAgICAgICAgY2FzZSAnYm9vbCc6XG4gICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBkdHlwZSAke2R0eXBlfWApO1xuICAgIH1cbn1cbmNvbnN0IHdhc21CaW5hcnlOYW1lcyA9IFtcbiAgICAndGZqcy1iYWNrZW5kLXdhc20ud2FzbScsICd0ZmpzLWJhY2tlbmQtd2FzbS1zaW1kLndhc20nLFxuICAgICd0ZmpzLWJhY2tlbmQtd2FzbS10aHJlYWRlZC1zaW1kLndhc20nXG5dO1xubGV0IHdhc21QYXRoID0gbnVsbDtcbmxldCB3YXNtUGF0aFByZWZpeCA9IG51bGw7XG5sZXQgd2FzbUZpbGVNYXAgPSB7fTtcbmxldCBpbml0QWJvcnRlZCA9IGZhbHNlO1xubGV0IGN1c3RvbUZldGNoID0gZmFsc2U7XG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBgc2V0V2FzbVBhdGhzYCBpbnN0ZWFkLlxuICogU2V0cyB0aGUgcGF0aCB0byB0aGUgYC53YXNtYCBmaWxlIHdoaWNoIHdpbGwgYmUgZmV0Y2hlZCB3aGVuIHRoZSB3YXNtXG4gKiBiYWNrZW5kIGlzIGluaXRpYWxpemVkLiBTZWVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RmanMvYmxvYi9tYXN0ZXIvdGZqcy1iYWNrZW5kLXdhc20vUkVBRE1FLm1kI3VzaW5nLWJ1bmRsZXJzXG4gKiBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHBhcmFtIHBhdGggd2FzbSBmaWxlIHBhdGggb3IgdXJsXG4gKiBAcGFyYW0gdXNlUGxhdGZvcm1GZXRjaCBvcHRpb25hbCBib29sZWFuIHRvIHVzZSBwbGF0Zm9ybSBmZXRjaCB0byBkb3dubG9hZFxuICogICAgIHRoZSB3YXNtIGZpbGUsIGRlZmF1bHQgdG8gZmFsc2UuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0Vudmlyb25tZW50JywgbmFtZXNwYWNlOiAnd2FzbSd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRXYXNtUGF0aChwYXRoLCB1c2VQbGF0Zm9ybUZldGNoID0gZmFsc2UpIHtcbiAgICBkZXByZWNhdGlvbldhcm4oJ3NldFdhc21QYXRoIGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2Ygc2V0V2FzbVBhdGhzIGFuZCcgK1xuICAgICAgICAnIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLicpO1xuICAgIGlmIChpbml0QWJvcnRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBXQVNNIGJhY2tlbmQgd2FzIGFscmVhZHkgaW5pdGlhbGl6ZWQuIE1ha2Ugc3VyZSB5b3UgY2FsbCAnICtcbiAgICAgICAgICAgICdgc2V0V2FzbVBhdGgoKWAgYmVmb3JlIHlvdSBjYWxsIGB0Zi5zZXRCYWNrZW5kKClgIG9yIGB0Zi5yZWFkeSgpYCcpO1xuICAgIH1cbiAgICB3YXNtUGF0aCA9IHBhdGg7XG4gICAgY3VzdG9tRmV0Y2ggPSB1c2VQbGF0Zm9ybUZldGNoO1xufVxuLyoqXG4gKiBDb25maWd1cmVzIHRoZSBsb2NhdGlvbnMgb2YgdGhlIFdBU00gYmluYXJpZXMuXG4gKlxuICogYGBganNcbiAqIHNldFdhc21QYXRocyh7XG4gKiAgJ3RmanMtYmFja2VuZC13YXNtLndhc20nOiAncmVuYW1lZC53YXNtJyxcbiAqICAndGZqcy1iYWNrZW5kLXdhc20tc2ltZC53YXNtJzogJ3JlbmFtZWQtc2ltZC53YXNtJyxcbiAqICAndGZqcy1iYWNrZW5kLXdhc20tdGhyZWFkZWQtc2ltZC53YXNtJzogJ3JlbmFtZWQtdGhyZWFkZWQtc2ltZC53YXNtJ1xuICogfSk7XG4gKiB0Zi5zZXRCYWNrZW5kKCd3YXNtJyk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gcHJlZml4T3JGaWxlTWFwIFRoaXMgY2FuIGJlIGVpdGhlciBhIHN0cmluZyBvciBvYmplY3Q6XG4gKiAgLSAoc3RyaW5nKSBUaGUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBXQVNNIGJpbmFyaWVzIGFyZSBsb2NhdGVkLlxuICogICAgIE5vdGUgdGhhdCB0aGlzIHByZWZpeCB3aWxsIGJlIHVzZWQgdG8gbG9hZCBlYWNoIGJpbmFyeSAodmFuaWxsYSxcbiAqICAgICBTSU1ELWVuYWJsZWQsIHRocmVhZGluZy1lbmFibGVkLCBldGMuKS5cbiAqICAtIChvYmplY3QpIE1hcHBpbmcgZnJvbSBuYW1lcyBvZiBXQVNNIGJpbmFyaWVzIHRvIGN1c3RvbVxuICogICAgIGZ1bGwgcGF0aHMgc3BlY2lmeWluZyB0aGUgbG9jYXRpb25zIG9mIHRob3NlIGJpbmFyaWVzLiBUaGlzIGlzIHVzZWZ1bCBpZlxuICogICAgIHlvdXIgV0FTTSBiaW5hcmllcyBhcmUgbm90IGFsbCBsb2NhdGVkIGluIHRoZSBzYW1lIGRpcmVjdG9yeSwgb3IgaWYgeW91clxuICogICAgIFdBU00gYmluYXJpZXMgaGF2ZSBiZWVuIHJlbmFtZWQuXG4gKiBAcGFyYW0gdXNlUGxhdGZvcm1GZXRjaCBvcHRpb25hbCBib29sZWFuIHRvIHVzZSBwbGF0Zm9ybSBmZXRjaCB0byBkb3dubG9hZFxuICogICAgIHRoZSB3YXNtIGZpbGUsIGRlZmF1bHQgdG8gZmFsc2UuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0Vudmlyb25tZW50JywgbmFtZXNwYWNlOiAnd2FzbSd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRXYXNtUGF0aHMocHJlZml4T3JGaWxlTWFwLCB1c2VQbGF0Zm9ybUZldGNoID0gZmFsc2UpIHtcbiAgICBpZiAoaW5pdEFib3J0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgV0FTTSBiYWNrZW5kIHdhcyBhbHJlYWR5IGluaXRpYWxpemVkLiBNYWtlIHN1cmUgeW91IGNhbGwgJyArXG4gICAgICAgICAgICAnYHNldFdhc21QYXRocygpYCBiZWZvcmUgeW91IGNhbGwgYHRmLnNldEJhY2tlbmQoKWAgb3IgJyArXG4gICAgICAgICAgICAnYHRmLnJlYWR5KClgJyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcHJlZml4T3JGaWxlTWFwID09PSAnc3RyaW5nJykge1xuICAgICAgICB3YXNtUGF0aFByZWZpeCA9IHByZWZpeE9yRmlsZU1hcDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHdhc21GaWxlTWFwID0gcHJlZml4T3JGaWxlTWFwO1xuICAgICAgICBjb25zdCBtaXNzaW5nUGF0aHMgPSB3YXNtQmluYXJ5TmFtZXMuZmlsdGVyKG5hbWUgPT4gd2FzbUZpbGVNYXBbbmFtZV0gPT0gbnVsbCk7XG4gICAgICAgIGlmIChtaXNzaW5nUGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGVyZSB3ZXJlIG5vIGVudHJpZXMgZm91bmQgZm9yIHRoZSBmb2xsb3dpbmcgYmluYXJpZXM6IGAgK1xuICAgICAgICAgICAgICAgIGAke21pc3NpbmdQYXRocy5qb2luKCcsJyl9LiBQbGVhc2UgZWl0aGVyIGNhbGwgc2V0V2FzbVBhdGhzIHdpdGggYSBgICtcbiAgICAgICAgICAgICAgICBgbWFwIHByb3ZpZGluZyBhIHBhdGggZm9yIGVhY2ggYmluYXJ5LCBvciB3aXRoIGEgc3RyaW5nIGluZGljYXRpbmcgYCArXG4gICAgICAgICAgICAgICAgYHRoZSBkaXJlY3Rvcnkgd2hlcmUgYWxsIHRoZSBiaW5hcmllcyBjYW4gYmUgZm91bmQuYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY3VzdG9tRmV0Y2ggPSB1c2VQbGF0Zm9ybUZldGNoO1xufVxuLyoqIFVzZWQgaW4gdW5pdCB0ZXN0cy4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNldFdhc21QYXRoKCkge1xuICAgIHdhc21QYXRoID0gbnVsbDtcbiAgICB3YXNtUGF0aFByZWZpeCA9IG51bGw7XG4gICAgd2FzbUZpbGVNYXAgPSB7fTtcbiAgICBjdXN0b21GZXRjaCA9IGZhbHNlO1xuICAgIGluaXRBYm9ydGVkID0gZmFsc2U7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iYWNrZW5kX3dhc20uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0ICcuL2ZsYWdzX3dhc20nO1xuaW1wb3J0IHsgcmVnaXN0ZXJCYWNrZW5kIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IEJhY2tlbmRXYXNtLCBpbml0IH0gZnJvbSAnLi9iYWNrZW5kX3dhc20nO1xuZXhwb3J0IHsgQmFja2VuZFdhc20sIHNldFdhc21QYXRoLCBzZXRXYXNtUGF0aHMgfSBmcm9tICcuL2JhY2tlbmRfd2FzbSc7XG5leHBvcnQgeyB2ZXJzaW9uIGFzIHZlcnNpb25fd2FzbSB9IGZyb20gJy4vdmVyc2lvbic7XG5jb25zdCBXQVNNX1BSSU9SSVRZID0gMjtcbnJlZ2lzdGVyQmFja2VuZCgnd2FzbScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IHdhc20gfSA9IGF3YWl0IGluaXQoKTtcbiAgICByZXR1cm4gbmV3IEJhY2tlbmRXYXNtKHdhc20pO1xufSwgV0FTTV9QUklPUklUWSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iYXNlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGVudiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5jb25zdCBFTlYgPSBlbnYoKTtcbi8qKlxuICogVHJ1ZSBpZiBTSU1EIGlzIHN1cHBvcnRlZC5cbiAqL1xuLy8gRnJvbTogaHR0cHM6Ly9naXRodWIuY29tL0dvb2dsZUNocm9tZUxhYnMvd2FzbS1mZWF0dXJlLWRldGVjdFxuRU5WLnJlZ2lzdGVyRmxhZyhcbi8vIFRoaXMgdHlwZWQgYXJyYXkgcGFzc2VkIGluIHRvIFdlYkFzc2VtYmx5LnZhbGlkYXRlIGlzIFdlYkFzc2VtYmx5IGJpbmFyeVxuLy8gY29kZS4gSW4gdGhpcyBjYXNlIGl0IGlzIGEgc21hbGwgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIFNJTURcbi8vIGluc3RydWN0aW9ucy5cbidXQVNNX0hBU19TSU1EX1NVUFBPUlQnLCBhc3luYyAoKSA9PiBXZWJBc3NlbWJseS52YWxpZGF0ZShuZXcgVWludDhBcnJheShbXG4gICAgMCwgOTcsIDExNSwgMTA5LCAxLCAwLCAwLCAwLCAxLCA0LCAxLCA5NiwgMCwgMCwgMyxcbiAgICAyLCAxLCAwLCAxMCwgOSwgMSwgNywgMCwgNjUsIDAsIDI1MywgMTUsIDI2LCAxMVxuXSkpKTtcbi8qKlxuICogVHJ1ZSBpZiB0aHJlYWRzIGFyZSBzdXBwb3J0ZWQuXG4gKi9cbi8vIEZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9Hb29nbGVDaHJvbWVMYWJzL3dhc20tZmVhdHVyZS1kZXRlY3RcbkVOVi5yZWdpc3RlckZsYWcoJ1dBU01fSEFTX01VTFRJVEhSRUFEX1NVUFBPUlQnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gVE9ETyhhbm54aW5neXVhbik6IEVuYWJsZSBub2RlIHN1cHBvcnQgb25jZSB0aGlzIGlzIHJlc29sdmVkOlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RmanMvaXNzdWVzLzM4MzBcbiAgICBpZiAoRU5WLmdldCgnSVNfTk9ERScpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gVGVzdCBmb3IgdHJhbnNmZXJhYmlsaXR5IG9mIFNBQnMgKG5lZWRlZCBmb3IgRmlyZWZveClcbiAgICAgICAgLy8gaHR0cHM6Ly9ncm91cHMuZ29vZ2xlLmNvbS9mb3J1bS8jIW1zZy9tb3ppbGxhLmRldi5wbGF0Zm9ybS9JSGtCWmxIRVRwQS9kd3NNTmNoV0VRQUpcbiAgICAgICAgbmV3IE1lc3NhZ2VDaGFubmVsKCkucG9ydDEucG9zdE1lc3NhZ2UobmV3IFNoYXJlZEFycmF5QnVmZmVyKDEpKTtcbiAgICAgICAgLy8gVGhpcyB0eXBlZCBhcnJheSBpcyBhIFdlYkFzc2VtYmx5IHByb2dyYW0gY29udGFpbmluZyB0aHJlYWRlZFxuICAgICAgICAvLyBpbnN0cnVjdGlvbnMuXG4gICAgICAgIHJldHVybiBXZWJBc3NlbWJseS52YWxpZGF0ZShuZXcgVWludDhBcnJheShbXG4gICAgICAgICAgICAwLCA5NywgMTE1LCAxMDksIDEsIDAsIDAsIDAsIDEsIDQsIDEsIDk2LCAwLCAwLCAzLCAyLCAxLCAwLCA1LFxuICAgICAgICAgICAgNCwgMSwgMywgMSwgMSwgMTAsIDExLCAxLCA5LCAwLCA2NSwgMCwgMjU0LCAxNiwgMiwgMCwgMjYsIDExXG4gICAgICAgIF0pKTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmxhZ3Nfd2FzbS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgJy4vcmVnaXN0ZXJfYWxsX2tlcm5lbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9iYXNlJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8vIEltcG9ydCBzaGFyZWQgZnVuY3Rpb25hbGl0eSBmcm9tIHRmanMtYmFja2VuZC1jcHUgd2l0aG91dCB0cmlnZ2VyaW5nXG4vLyBzaWRlIGVmZmVjdHMuXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWltcG9ydHMtZnJvbS1kaXN0XG5pbXBvcnQgeyBjb25jYXRJbXBsIGFzIGNvbmNhdEltcGxDUFUgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qvc2hhcmVkJztcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8taW1wb3J0cy1mcm9tLWRpc3RcbmltcG9ydCB7IHNsaWNlSW1wbCBhcyBzbGljZUltcGxDUFUgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qvc2hhcmVkJztcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8taW1wb3J0cy1mcm9tLWRpc3RcbmltcG9ydCB7IHJhbmdlSW1wbCBhcyByYW5nZUltcGxDUFUgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qvc2hhcmVkJztcbmV4cG9ydCB7IGNvbmNhdEltcGxDUFUsIHJhbmdlSW1wbENQVSwgc2xpY2VJbXBsQ1BVIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zaGFyZWQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQWJzIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi91bmFyeV9rZXJuZWwnO1xuZXhwb3J0IGNvbnN0IGFic0NvbmZpZyA9IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnKEFicyk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BYnMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQWRkIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vYmluYXJ5X2tlcm5lbCc7XG5jb25zdCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QgPSB0cnVlO1xuZXhwb3J0IGNvbnN0IGFkZENvbmZpZyA9IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyhBZGQsIHN1cHBvcnRzRnVsbEJyb2FkY2FzdCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BZGQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQWRkTiwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBDcHBEVHlwZSB9IGZyb20gJy4vdHlwZXMnO1xubGV0IHdhc21GdW5jO1xuZnVuY3Rpb24gc2V0dXBGdW5jKGJhY2tlbmQpIHtcbiAgICB3YXNtRnVuYyA9IGJhY2tlbmQud2FzbS5jd3JhcChBZGROLCBudWxsIC8qIHZvaWQgKi8sIFtcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICBdKTtcbn1cbmZ1bmN0aW9uIGFkZG4oYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChpbnB1dHNbMF0uc2hhcGUsIGlucHV0c1swXS5kdHlwZSk7XG4gICAgLy8gU2hvcnQtY2lyY3VpdCB6ZXJvLXNpemVkIHRlbnNvcnMuXG4gICAgaWYgKHV0aWwuc2l6ZUZyb21TaGFwZShvdXQuc2hhcGUpID09PSAwKSB7XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0SWRzID0gaW5wdXRzLm1hcCh4ID0+IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh4LmRhdGFJZCkuaWQpO1xuICAgIGNvbnN0IGlucHV0SWRzQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheShpbnB1dElkcykuYnVmZmVyKTtcbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICB3YXNtRnVuYyhpbnB1dElkc0J5dGVzLCBpbnB1dElkcy5sZW5ndGgsIENwcERUeXBlW291dC5kdHlwZV0sIG91dElkKTtcbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IGFkZE5Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQWRkTixcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYyxcbiAgICBrZXJuZWxGdW5jOiBhZGRuLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFkZE4uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQWxsLCBiYWNrZW5kX3V0aWwsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgcGVybXV0ZUF4ZXNBbmRUcmFuc3Bvc2UgfSBmcm9tICcuL2tlcm5lbF91dGlscyc7XG5sZXQgd2FzbUFsbDtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtQWxsID0gYmFja2VuZC53YXNtLmN3cmFwKEFsbCwgbnVsbCAvKnZvaWQqLywgWydudW1iZXIsIG51bWJlciwgbnVtYmVyJ10pO1xufVxuZnVuY3Rpb24gYWxsKGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGlucHV0cywgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBheGlzLCBrZWVwRGltcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHguZGF0YUlkKS5pZDtcbiAgICBsZXQgaW5wdXRJZCA9IHhJZDtcbiAgICBsZXQgaW5wdXQgPSB4O1xuICAgIGNvbnN0IHsgdHJhbnNwb3NlZCwgYXhlcywgb3JpZ2luYWxBeGVzLCBpbnB1dFdhc1RyYW5zcG9zZWQgfSA9IHBlcm11dGVBeGVzQW5kVHJhbnNwb3NlKHgsIGF4aXMsIGJhY2tlbmQpO1xuICAgIGlmIChpbnB1dFdhc1RyYW5zcG9zZWQpIHtcbiAgICAgICAgY29uc3QgdHJhbnNwb3NlZElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHRyYW5zcG9zZWQuZGF0YUlkKS5pZDtcbiAgICAgICAgaW5wdXQgPSB0cmFuc3Bvc2VkO1xuICAgICAgICBpbnB1dElkID0gdHJhbnNwb3NlZElkO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dFJhbmsgPSBpbnB1dC5zaGFwZS5sZW5ndGg7XG4gICAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdhbGwnLCBheGVzLCBpbnB1dFJhbmspO1xuICAgIGNvbnN0IFtvdXRTaGFwZSwgcmVkdWNlU2hhcGVdID0gYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMoaW5wdXQuc2hhcGUsIGF4ZXMpO1xuICAgIGNvbnN0IHJlZHVjZVNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChvdXRTaGFwZSwgeC5kdHlwZSk7XG4gICAgaWYgKHV0aWwuc2l6ZUZyb21TaGFwZShpbnB1dC5zaGFwZSkgIT09IDApIHtcbiAgICAgICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgICAgIHdhc21BbGwoaW5wdXRJZCwgcmVkdWNlU2l6ZSwgb3V0SWQpO1xuICAgIH1cbiAgICBpZiAoaW5wdXRXYXNUcmFuc3Bvc2VkKSB7XG4gICAgICAgIC8vIGRpc3Bvc2Ugb2YgdGhlIHRyYW5zcG9zZWQgdGVuc29yLlxuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VEYXRhKHRyYW5zcG9zZWQuZGF0YUlkKTtcbiAgICB9XG4gICAgaWYgKGtlZXBEaW1zKSB7XG4gICAgICAgIC8vIHJlc2hhcGVcbiAgICAgICAgY29uc3QgbmV3U2hhcGUgPSBiYWNrZW5kX3V0aWwuZXhwYW5kU2hhcGVUb0tlZXBEaW0ob3V0LnNoYXBlLCBvcmlnaW5hbEF4ZXMpO1xuICAgICAgICBvdXQuc2hhcGUgPSBuZXdTaGFwZTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBhbGxDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQWxsLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiBhbGxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BbGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQW55LCBiYWNrZW5kX3V0aWwsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgcGVybXV0ZUF4ZXNBbmRUcmFuc3Bvc2UgfSBmcm9tICcuL2tlcm5lbF91dGlscyc7XG5sZXQgd2FzbUFueTtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtQW55ID0gYmFja2VuZC53YXNtLmN3cmFwKEFueSwgbnVsbCAvKnZvaWQqLywgWydudW1iZXIsIG51bWJlciwgbnVtYmVyJ10pO1xufVxuZnVuY3Rpb24gYW55KGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGlucHV0cywgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBheGlzLCBrZWVwRGltcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHguZGF0YUlkKS5pZDtcbiAgICBsZXQgaW5wdXRJZCA9IHhJZDtcbiAgICBsZXQgaW5wdXQgPSB4O1xuICAgIGNvbnN0IHsgdHJhbnNwb3NlZCwgYXhlcywgb3JpZ2luYWxBeGVzLCBpbnB1dFdhc1RyYW5zcG9zZWQgfSA9IHBlcm11dGVBeGVzQW5kVHJhbnNwb3NlKHgsIGF4aXMsIGJhY2tlbmQpO1xuICAgIGlmIChpbnB1dFdhc1RyYW5zcG9zZWQpIHtcbiAgICAgICAgY29uc3QgdHJhbnNwb3NlZElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHRyYW5zcG9zZWQuZGF0YUlkKS5pZDtcbiAgICAgICAgaW5wdXQgPSB0cmFuc3Bvc2VkO1xuICAgICAgICBpbnB1dElkID0gdHJhbnNwb3NlZElkO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dFJhbmsgPSBpbnB1dC5zaGFwZS5sZW5ndGg7XG4gICAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdhbnknLCBheGVzLCBpbnB1dFJhbmspO1xuICAgIGNvbnN0IFtvdXRTaGFwZSwgcmVkdWNlU2hhcGVdID0gYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMoaW5wdXQuc2hhcGUsIGF4ZXMpO1xuICAgIGNvbnN0IHJlZHVjZVNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChvdXRTaGFwZSwgeC5kdHlwZSk7XG4gICAgaWYgKHV0aWwuc2l6ZUZyb21TaGFwZShpbnB1dC5zaGFwZSkgIT09IDApIHtcbiAgICAgICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgICAgIHdhc21BbnkoaW5wdXRJZCwgcmVkdWNlU2l6ZSwgb3V0SWQpO1xuICAgIH1cbiAgICBpZiAoaW5wdXRXYXNUcmFuc3Bvc2VkKSB7XG4gICAgICAgIC8vIGRpc3Bvc2Ugb2YgdGhlIHRyYW5zcG9zZWQgdGVuc29yLlxuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VEYXRhKHRyYW5zcG9zZWQuZGF0YUlkKTtcbiAgICB9XG4gICAgaWYgKGtlZXBEaW1zKSB7XG4gICAgICAgIC8vIHJlc2hhcGVcbiAgICAgICAgY29uc3QgbmV3U2hhcGUgPSBiYWNrZW5kX3V0aWwuZXhwYW5kU2hhcGVUb0tlZXBEaW0ob3V0LnNoYXBlLCBvcmlnaW5hbEF4ZXMpO1xuICAgICAgICBvdXQuc2hhcGUgPSBuZXdTaGFwZTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBhbnlDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQW55LFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiBhbnlcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BbnkuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQXJnTWF4LCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHBlcm11dGVBeGVzQW5kVHJhbnNwb3NlIH0gZnJvbSAnLi9rZXJuZWxfdXRpbHMnO1xuaW1wb3J0IHsgQ3BwRFR5cGUgfSBmcm9tICcuL3R5cGVzJztcbmxldCB3YXNtRnVuYztcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtRnVuYyA9IGJhY2tlbmQud2FzbS5jd3JhcChBcmdNYXgsIG51bGwgLyogdm9pZCAqLywgW1xuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicgLy8gb3V0X2lkXG4gICAgXSk7XG59XG5mdW5jdGlvbiBhcmdtYXgoYXJncykge1xuICAgIGNvbnN0IHsgYmFja2VuZCwgaW5wdXRzLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGF4aXMgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHhJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh4LmRhdGFJZCkuaWQ7XG4gICAgbGV0IGlucHV0SWQgPSB4SWQ7XG4gICAgbGV0IGlucHV0ID0geDtcbiAgICBjb25zdCB7IHRyYW5zcG9zZWQsIGF4ZXMsIGlucHV0V2FzVHJhbnNwb3NlZCB9ID0gcGVybXV0ZUF4ZXNBbmRUcmFuc3Bvc2UoeCwgYXhpcywgYmFja2VuZCk7XG4gICAgaWYgKGlucHV0V2FzVHJhbnNwb3NlZCkge1xuICAgICAgICBjb25zdCB0cmFuc3Bvc2VkSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQodHJhbnNwb3NlZC5kYXRhSWQpLmlkO1xuICAgICAgICBpZiAodHJhbnNwb3NlZElkICE9PSB4SWQpIHtcbiAgICAgICAgICAgIC8vIHRyYW5zcG9zZSB3YXMgbm90IGEgbm8tb3AuIFdlIHdpbGwgbmVlZCB0byBkaXNwb3NlIG9mIHRoaXNcbiAgICAgICAgICAgIC8vIG9uY2Ugd2UgYXJlIGRvbmUuXG4gICAgICAgICAgICBpbnB1dCA9IHRyYW5zcG9zZWQ7XG4gICAgICAgICAgICBpbnB1dElkID0gdHJhbnNwb3NlZElkO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG91dFNoYXBlID0gaW5wdXQuc2hhcGUuc2xpY2UoMCwgLTEpO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChvdXRTaGFwZSwgJ2ludDMyJyk7XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgY29uc3Qgb3V0ZXJTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKG91dC5zaGFwZSk7XG4gICAgY29uc3QgaW5uZXJTaXplID0gaW5wdXQuc2hhcGVbYXhlc1swXV07XG4gICAgd2FzbUZ1bmMoaW5wdXRJZCwgQ3BwRFR5cGVbaW5wdXQuZHR5cGVdLCBvdXRlclNpemUsIGlubmVyU2l6ZSwgb3V0SWQpO1xuICAgIGlmIChpbnB1dFdhc1RyYW5zcG9zZWQpIHtcbiAgICAgICAgLy8gZGlzcG9zZSBvZiB0aGUgdHJhbnNwb3NlZCB0ZW5zb3IuXG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZURhdGEodHJhbnNwb3NlZC5kYXRhSWQpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IGFyZ01heENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBBcmdNYXgsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBrZXJuZWxGdW5jOiBhcmdtYXgsXG4gICAgc2V0dXBGdW5jOiBzZXR1cFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFyZ01heC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBdmdQb29sLCBiYWNrZW5kX3V0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xubGV0IHdhc21BdmdQb29sO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21BdmdQb29sID0gYmFja2VuZC53YXNtLmN3cmFwKEF2Z1Bvb2wsIG51bGwgLyogdm9pZCAqLywgW1xuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgXSk7XG59XG5mdW5jdGlvbiBhdmdQb29sKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYXR0cnMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeCA9IGlucHV0cy54O1xuICAgIGNvbnN0IHhJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh4LmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgeyBmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSB9ID0gYXR0cnM7XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wyREluZm8oeC5zaGFwZSwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgMSAvKiBkaWxhdGlvbnMgKi8sIHBhZCwgZGltUm91bmRpbmdNb2RlKTtcbiAgICBjb25zdCBmaWx0ZXJIZWlnaHQgPSBjb252SW5mby5maWx0ZXJIZWlnaHQ7XG4gICAgY29uc3QgZmlsdGVyV2lkdGggPSBjb252SW5mby5maWx0ZXJXaWR0aDtcbiAgICBjb25zdCBwYWRUb3AgPSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICBjb25zdCBwYWRSaWdodCA9IGNvbnZJbmZvLnBhZEluZm8ucmlnaHQ7XG4gICAgY29uc3QgcGFkQm90dG9tID0gY29udkluZm8ucGFkSW5mby5ib3R0b207XG4gICAgY29uc3QgcGFkTGVmdCA9IGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBjaGFubmVscyA9IGNvbnZJbmZvLmluQ2hhbm5lbHM7XG4gICAgaWYgKGNvbnZJbmZvLmRhdGFGb3JtYXQgIT09ICdjaGFubmVsc0xhc3QnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgd2FzbSBiYWNrZW5kIGRvZXMgbm90IHN1cHBvcnQgZGF0YUZvcm1hdDonYCArXG4gICAgICAgICAgICBgJHtjb252SW5mby5kYXRhRm9ybWF0fScuIFBsZWFzZSB1c2UgJ2NoYW5uZWxzTGFzdCcuYCk7XG4gICAgfVxuICAgIGlmIChjb252SW5mby5kaWxhdGlvbldpZHRoICE9PSAxIHx8IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0ICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgd2FzIGJhY2tlbmQgb25seSBzdXBwb3J0cyBhdmVyYWdlIHBvb2xpbmcgd2l0aCBkaWxhdGlvbiA9IFsxLCAxXSwgYCArXG4gICAgICAgICAgICBgZ290IFske2NvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0fSwgJHtjb252SW5mby5kaWxhdGlvbldpZHRofV0uYCk7XG4gICAgfVxuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChjb252SW5mby5vdXRTaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICB3YXNtQXZnUG9vbCh4SWQsIHguc2hhcGVbMF0sIHguc2hhcGVbMV0sIHguc2hhcGVbMl0sIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIHBhZFRvcCwgcGFkUmlnaHQsIHBhZEJvdHRvbSwgcGFkTGVmdCwgc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aCwgY2hhbm5lbHMsIG91dElkKTtcbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IGF2Z1Bvb2xDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQXZnUG9vbCxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogYXZnUG9vbFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUF2Z1Bvb2wuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQmF0Y2hNYXRNdWwsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5sZXQgd2FzbUJhdGNoTWF0TXVsO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21CYXRjaE1hdE11bCA9IGJhY2tlbmQud2FzbS5jd3JhcChCYXRjaE1hdE11bCwgbnVsbCAvKiB2b2lkICovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInIC8vIG91dF9pZFxuICAgIF0pO1xufVxuZnVuY3Rpb24gYmF0Y2hNYXRNdWwoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGEsIGIgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHRyYW5zcG9zZUEsIHRyYW5zcG9zZUIgfSA9IGF0dHJzO1xuICAgIGlmIChhLmR0eXBlICE9PSAnZmxvYXQzMicgfHwgYi5kdHlwZSAhPT0gJ2Zsb2F0MzInKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQmF0Y2hNYXRNdWwgZm9yIG5vbiBub24tZmxvYXQzMiB0ZW5zb3JzIG5vdCB5ZXQgc3VwcG9ydGVkLmApO1xuICAgIH1cbiAgICBjb25zdCBhUmFuayA9IGEuc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IGJSYW5rID0gYi5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgaW5uZXJTaGFwZUEgPSB0cmFuc3Bvc2VBID8gYS5zaGFwZVthUmFuayAtIDJdIDogYS5zaGFwZVthUmFuayAtIDFdO1xuICAgIGNvbnN0IGlubmVyU2hhcGVCID0gdHJhbnNwb3NlQiA/IGIuc2hhcGVbYlJhbmsgLSAxXSA6IGIuc2hhcGVbYlJhbmsgLSAyXTtcbiAgICBjb25zdCBvdXRlclNoYXBlQSA9IHRyYW5zcG9zZUEgPyBhLnNoYXBlW2FSYW5rIC0gMV0gOiBhLnNoYXBlW2FSYW5rIC0gMl07XG4gICAgY29uc3Qgb3V0ZXJTaGFwZUIgPSB0cmFuc3Bvc2VCID8gYi5zaGFwZVtiUmFuayAtIDJdIDogYi5zaGFwZVtiUmFuayAtIDFdO1xuICAgIGNvbnN0IG91dGVyRGltc0EgPSBhLnNoYXBlLnNsaWNlKDAsIC0yKTtcbiAgICBjb25zdCBvdXRlckRpbXNCID0gYi5zaGFwZS5zbGljZSgwLCAtMik7XG4gICAgY29uc3QgYmF0Y2hEaW1BID0gdXRpbC5zaXplRnJvbVNoYXBlKG91dGVyRGltc0EpO1xuICAgIGNvbnN0IGJhdGNoRGltQiA9IHV0aWwuc2l6ZUZyb21TaGFwZShvdXRlckRpbXNCKTtcbiAgICBjb25zdCBiYXRjaERpbXNDb21wYXRpYmxlID0gYmF0Y2hEaW1BID09PSBiYXRjaERpbUIgfHwgYmF0Y2hEaW1BID09PSAxIHx8IGJhdGNoRGltQiA9PT0gMTtcbiAgICB1dGlsLmFzc2VydChhUmFuayA+PSAyICYmIGJSYW5rID49IDIgJiYgYmF0Y2hEaW1zQ29tcGF0aWJsZSwgKCkgPT4gYEVycm9yIGluIG1hdE11bDogdGhlIGlucHV0IGJhdGNoIGRpbWVuc2lvbnMgbXVzdCBlaXRoZXIgYmUgdGhlIGAgK1xuICAgICAgICBgc2FtZSBvciBhdCBsZWFzdCBvbmUgaW5wdXQgYmF0Y2ggZGltZW5zaW9uIG11c3QgYmUgMS4gR290IGlucHV0IGAgK1xuICAgICAgICBgYmF0Y2ggZGltZW5zaW9ucyBvZiAoJHtvdXRlckRpbXNBfSkgYW5kICgke291dGVyRGltc0J9KS5gKTtcbiAgICBjb25zdCBvdXRTaGFwZU91dGVyRGltcyA9IGJhdGNoRGltQSA+IGJhdGNoRGltQiA/IGEuc2hhcGUuc2xpY2UoMCwgLTIpIDogYi5zaGFwZS5zbGljZSgwLCAtMik7XG4gICAgY29uc3Qgb3V0U2hhcGUgPSBvdXRTaGFwZU91dGVyRGltcy5jb25jYXQoW291dGVyU2hhcGVBLCBvdXRlclNoYXBlQl0pO1xuICAgIHV0aWwuYXNzZXJ0KGlubmVyU2hhcGVBID09PSBpbm5lclNoYXBlQiwgKCkgPT4gYEVycm9yIGluIG1hdE11bDogaW5uZXIgc2hhcGVzICgke2lubmVyU2hhcGVBfSkgYW5kIChgICtcbiAgICAgICAgYCR7aW5uZXJTaGFwZUJ9KSBvZiBUZW5zb3JzIHdpdGggc2hhcGVzICR7YS5zaGFwZX0gYW5kIGAgK1xuICAgICAgICBgJHtiLnNoYXBlfSBhbmQgdHJhbnNwb3NlQT0ke3RyYW5zcG9zZUF9YCArXG4gICAgICAgIGAgYW5kIHRyYW5zcG9zZUI9JHt0cmFuc3Bvc2VCfSBtdXN0IG1hdGNoLmApO1xuICAgIGNvbnN0IGEzZFNoYXBlID0gdHJhbnNwb3NlQSA/IFtiYXRjaERpbUEsIGlubmVyU2hhcGVBLCBvdXRlclNoYXBlQV0gOlxuICAgICAgICBbYmF0Y2hEaW1BLCBvdXRlclNoYXBlQSwgaW5uZXJTaGFwZUFdO1xuICAgIGNvbnN0IGIzZFNoYXBlID0gdHJhbnNwb3NlQiA/IFtiYXRjaERpbUIsIG91dGVyU2hhcGVCLCBpbm5lclNoYXBlQl0gOlxuICAgICAgICBbYmF0Y2hEaW1CLCBpbm5lclNoYXBlQiwgb3V0ZXJTaGFwZUJdO1xuICAgIC8vIFRoZSByZXN0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBkZXNpZ25lZCB0byBvcGVyYXRlIG9uIHJhbmstMyB0ZW5zb3JzXG4gICAgY29uc3QgYTNkID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiBhIH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBhM2RTaGFwZSB9IH0pO1xuICAgIGNvbnN0IGIzZCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogYiB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogYjNkU2hhcGUgfSB9KTtcbiAgICBjb25zdCBhM2RJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChhM2QuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBiM2RJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChiM2QuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBsZWZ0RGltID0gdHJhbnNwb3NlQSA/IGEzZC5zaGFwZVsyXSA6IGEzZC5zaGFwZVsxXTtcbiAgICBjb25zdCByaWdodERpbSA9IHRyYW5zcG9zZUIgPyBiM2Quc2hhcGVbMV0gOiBiM2Quc2hhcGVbMl07XG4gICAgY29uc3QgYmF0Y2hEaW0gPSBNYXRoLm1heChiYXRjaERpbUEsIGJhdGNoRGltQik7XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KFtiYXRjaERpbSwgbGVmdERpbSwgcmlnaHREaW1dLCBhM2QuZHR5cGUpO1xuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IGFTaGFwZUJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobmV3IEludDMyQXJyYXkoYTNkLnNoYXBlKS5idWZmZXIpO1xuICAgIGNvbnN0IGJTaGFwZUJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobmV3IEludDMyQXJyYXkoYjNkLnNoYXBlKS5idWZmZXIpO1xuICAgIHdhc21CYXRjaE1hdE11bChhM2RJZCwgYVNoYXBlQnl0ZXMsIGEzZC5zaGFwZS5sZW5ndGgsIGIzZElkLCBiU2hhcGVCeXRlcywgYjNkLnNoYXBlLmxlbmd0aCwgdHJhbnNwb3NlQSwgdHJhbnNwb3NlQiwgb3V0SWQpO1xuICAgIGJhY2tlbmQuZGlzcG9zZURhdGEoYTNkLmRhdGFJZCk7XG4gICAgYmFja2VuZC5kaXNwb3NlRGF0YShiM2QuZGF0YUlkKTtcbiAgICBvdXQuc2hhcGUgPSBvdXRTaGFwZTtcbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IGJhdGNoTWF0TXVsQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEJhdGNoTWF0TXVsLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiBiYXRjaE1hdE11bFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJhdGNoTWF0TXVsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgQmF0Y2hUb1NwYWNlTkQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQgeyBzbGljZSB9IGZyb20gJy4vU2xpY2UnO1xuaW1wb3J0IHsgdHJhbnNwb3NlIH0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuZnVuY3Rpb24gYmF0Y2hUb1NwYWNlTkQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGJsb2NrU2hhcGUsIGNyb3BzIH0gPSBhdHRycztcbiAgICBjb25zdCBwcm9kID0gYmxvY2tTaGFwZS5yZWR1Y2UoKGEsIGIpID0+IGEgKiBiKTtcbiAgICBjb25zdCByZXNoYXBlZCA9IGJhY2tlbmRfdXRpbC5nZXRSZXNoYXBlZCh4LnNoYXBlLCBibG9ja1NoYXBlLCBwcm9kKTtcbiAgICBjb25zdCBwZXJtdXRlZCA9IGJhY2tlbmRfdXRpbC5nZXRQZXJtdXRlZChyZXNoYXBlZC5sZW5ndGgsIGJsb2NrU2hhcGUubGVuZ3RoKTtcbiAgICBjb25zdCByZXNoYXBlZFBlcm11dGVkID0gYmFja2VuZF91dGlsLmdldFJlc2hhcGVkUGVybXV0ZWQoeC5zaGFwZSwgYmxvY2tTaGFwZSwgcHJvZCk7XG4gICAgY29uc3Qgc2xpY2VCZWdpbkNvb3JkcyA9IGJhY2tlbmRfdXRpbC5nZXRTbGljZUJlZ2luQ29vcmRzKGNyb3BzLCBibG9ja1NoYXBlLmxlbmd0aCk7XG4gICAgY29uc3Qgc2xpY2VTaXplID0gYmFja2VuZF91dGlsLmdldFNsaWNlU2l6ZShyZXNoYXBlZFBlcm11dGVkLCBjcm9wcywgYmxvY2tTaGFwZS5sZW5ndGgpO1xuICAgIGNvbnN0IHhSZXNoYXBlZCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogcmVzaGFwZWQgfSB9KTtcbiAgICBjb25zdCB4VHJhbnNwb3NlZCA9IHRyYW5zcG9zZSh7IGlucHV0czogeyB4OiB4UmVzaGFwZWQgfSwgYmFja2VuZCwgYXR0cnM6IHsgcGVybTogcGVybXV0ZWQgfSB9KTtcbiAgICBjb25zdCB4VHJhbnNwb3NlZFJlc2hhcGVkID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiB4VHJhbnNwb3NlZCB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogcmVzaGFwZWRQZXJtdXRlZCB9IH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IHNsaWNlKHtcbiAgICAgICAgaW5wdXRzOiB7IHg6IHhUcmFuc3Bvc2VkUmVzaGFwZWQgfSxcbiAgICAgICAgYmFja2VuZCxcbiAgICAgICAgYXR0cnM6IHsgYmVnaW46IHNsaWNlQmVnaW5Db29yZHMsIHNpemU6IHNsaWNlU2l6ZSB9XG4gICAgfSk7XG4gICAgYmFja2VuZC5kaXNwb3NlRGF0YSh4UmVzaGFwZWQuZGF0YUlkKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VEYXRhKHhUcmFuc3Bvc2VkLmRhdGFJZCk7XG4gICAgYmFja2VuZC5kaXNwb3NlRGF0YSh4UmVzaGFwZWQuZGF0YUlkKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGNvbnN0IGJhdGNoVG9TcGFjZU5EQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEJhdGNoVG9TcGFjZU5ELFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAga2VybmVsRnVuYzogYmF0Y2hUb1NwYWNlTkRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1CYXRjaFRvU3BhY2VORC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBDYXN0IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiBjYXN0KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0czogeyB4IH0sIGF0dHJzOiB7IGR0eXBlIH0sIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KHguc2hhcGUsIGR0eXBlKTtcbiAgICBjb25zdCBpblZhbHMgPSBiYWNrZW5kLnR5cGVkQXJyYXlGcm9tSGVhcCh4KTtcbiAgICBjb25zdCBvdXRWYWxzID0gYmFja2VuZC50eXBlZEFycmF5RnJvbUhlYXAob3V0KTtcbiAgICBvdXRWYWxzLnNldChpblZhbHMpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgY2FzdENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBDYXN0LFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAga2VybmVsRnVuYzogY2FzdCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DYXN0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IENlaWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlVW5hcnlLZXJuZWxDb25maWcgfSBmcm9tICcuL3VuYXJ5X2tlcm5lbCc7XG5leHBvcnQgY29uc3QgY2VpbENvbmZpZyA9IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnKENlaWwpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q2VpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBDbGlwQnlWYWx1ZSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5sZXQgd2FzbUNsaXA7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbUNsaXAgPSBiYWNrZW5kLndhc20uY3dyYXAoQ2xpcEJ5VmFsdWUsIG51bGwgLyogdm9pZCAqLywgW1xuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyAvLyBvdXRfaWRcbiAgICBdKTtcbn1cbmZ1bmN0aW9uIGNsaXAoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGNsaXBWYWx1ZU1pbiwgY2xpcFZhbHVlTWF4IH0gPSBhdHRycztcbiAgICBjb25zdCB4SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dCh4LnNoYXBlLCB4LmR0eXBlKTtcbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICB3YXNtQ2xpcCh4SWQsIGNsaXBWYWx1ZU1pbiwgY2xpcFZhbHVlTWF4LCBvdXRJZCk7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBjbGlwQnlWYWx1ZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBDbGlwQnlWYWx1ZSxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogY2xpcFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNsaXBCeVZhbHVlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgQ29uY2F0LCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNvbmNhdEltcGxDUFUgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmltcG9ydCB7IGlkZW50aXR5IH0gZnJvbSAnLi9JZGVudGl0eSc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmV4cG9ydCBmdW5jdGlvbiBjb25jYXQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IGF4aXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGFyZ3MuYXR0cnMuYXhpcywgaW5wdXRzWzBdLnNoYXBlKVswXTtcbiAgICBsZXQgb3V0U2hhcGUgPSBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dFNoYXBlKGlucHV0cy5tYXAodCA9PiB0LnNoYXBlKSwgYXhpcyk7XG4gICAgLy8gS2VlcCBvbmx5IG5vbi1lbXB0eSB0ZW5zb3JzIChpZ25vcmUgdGVuc29ycyB3aXRoIDAgaW4gdGhlaXIgc2hhcGUpLlxuICAgIGNvbnN0ICRpbnB1dHMgPSBpbnB1dHMuZmlsdGVyKHQgPT4gdXRpbC5zaXplRnJvbVNoYXBlKHQuc2hhcGUpID4gMCk7XG4gICAgaWYgKCRpbnB1dHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiBpZGVudGl0eSh7IGlucHV0czogeyB4OiAkaW5wdXRzWzBdIH0sIGJhY2tlbmQgfSk7XG4gICAgfVxuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChvdXRTaGFwZSwgaW5wdXRzWzBdLmR0eXBlKTtcbiAgICBpZiAodXRpbC5zaXplRnJvbVNoYXBlKG91dFNoYXBlKSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cbiAgICBjb25zdCBzaGFwZXMgPSAkaW5wdXRzLm1hcCh0ID0+IHQuc2hhcGUpO1xuICAgIGJhY2tlbmRfdXRpbC5hc3NlcnRQYXJhbXNDb25zaXN0ZW50KHNoYXBlcywgYXhpcyk7XG4gICAgaWYgKCRpbnB1dHNbMF0uZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIC8vIEFueSBjb25jYXQgb2Ygbi1kaW1lbnNpb25hbCB0ZW5zb3JzIGFjcm9zcyBhbnkgYXhpcyBjYW4gYmUgcmVkdWNlZCB0b1xuICAgICAgICAvLyBhIGNvbmNhdGVuYXRpb24gb2YgdHdvLWRpbWVuc2lvbmFsIHRlbnNvcnMgYWNyb3NzIHRoZSBheGlzIDEgYnkgZmlyc3RcbiAgICAgICAgLy8gcGFydGl0aW9uaW5nIHRoZSBheGVzIG9mIHRoZSBvcmlnaW5hbCB0ZW5zb3JzIGludG8gdGhvc2UgbGVzcyB0aGFuIHRoZVxuICAgICAgICAvLyBheGlzIHRvIGJlIGNvbmNhdGVuYXRlZCBhbmQgdGhlIHJlc3QuIFRoZW4gcmVzaGFwZSB0aGUgdGVuc29yc1xuICAgICAgICAvLyBpbnRvIGEgdHdvLWRpbWVuc2lvbmFsIHRlbnNvciBieSBjb2xsYXBzaW5nIHRoZXNlIHR3byBzZXRzIG9mIGF4ZXMgYW5kXG4gICAgICAgIC8vIGNvbmNhdGVuYXRlIHRoZSByZXN1bHRpbmcgbWF0cmljZXMgYWNyb3NzIHRoZSBheGlzIDEsIGZpbmFsbHkgcmVzaGFwaW5nXG4gICAgICAgIC8vIHRoZSByZXN1bHQgdG8gaGF2ZSB0aGUgcHJvcGVyIHNoYXBlLlxuICAgICAgICBjb25zdCBpbnB1dHMyRCA9ICRpbnB1dHMubWFwKHQgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5uZXJTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHQuc2hhcGUuc2xpY2UoYXhpcykpO1xuICAgICAgICAgICAgY29uc3Qgc2hhcGUgPSBbLTEsIGlubmVyU2l6ZV07XG4gICAgICAgICAgICByZXR1cm4gcmVzaGFwZSh7IGlucHV0czogeyB4OiB0IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlIH0gfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBpbnB1dHNWYWxTaGFwZXMgPSBpbnB1dHMyRC5tYXAodCA9PiB7XG4gICAgICAgICAgICByZXR1cm4geyB2YWxzOiBiYWNrZW5kLnJlYWRTeW5jKHQuZGF0YUlkKSwgc2hhcGU6IHQuc2hhcGUgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIENvbmNhdHMgMmQgdGVuc29ycyBhbG9uZyBheGlzPTEuXG4gICAgICAgIG91dFNoYXBlID1cbiAgICAgICAgICAgIGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0U2hhcGUoaW5wdXRzMkQubWFwKHQgPT4gdC5zaGFwZSksIDEgLyogYXhpcyAqLyk7XG4gICAgICAgIGNvbnN0IHNpbXBseUNvbmNhdCA9IGlucHV0czJEWzBdLnNoYXBlWzBdID09PSAxO1xuICAgICAgICBjb25zdCBvdXRWYWxzID0gY29uY2F0SW1wbENQVShpbnB1dHNWYWxTaGFwZXMsIG91dFNoYXBlLCBpbnB1dHNbMF0uZHR5cGUsIHNpbXBseUNvbmNhdCk7XG4gICAgICAgIGNvbnN0IGZpbmFsT3V0U2hhcGUgPSBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dFNoYXBlKCRpbnB1dHMubWFwKHQgPT4gdC5zaGFwZSksIGF4aXMpO1xuICAgICAgICBvdXQuc2hhcGUgPSBmaW5hbE91dFNoYXBlO1xuICAgICAgICBjb25zdCBvdXREYXRhID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpO1xuICAgICAgICBvdXREYXRhLnN0cmluZ0J5dGVzID0gYmFja2VuZF91dGlsLmZyb21TdHJpbmdBcnJheVRvVWludDgob3V0VmFscyk7XG4gICAgICAgIGlucHV0czJELmZvckVhY2godCA9PiBiYWNrZW5kLmRpc3Bvc2VEYXRhKHQuZGF0YUlkKSk7XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuICAgIGNvbnN0IGJhdGNoRGltID0gdXRpbC5zaXplRnJvbVNoYXBlKCRpbnB1dHNbMF0uc2hhcGUuc2xpY2UoMCwgYXhpcykpO1xuICAgIGxldCBzdW1Jbm5lckRpbXMgPSAwO1xuICAgIGNvbnN0IGlubmVyRGltcyA9ICRpbnB1dHMubWFwKGlucHV0ID0+IHtcbiAgICAgICAgY29uc3QgaW5uZXJEaW0gPSB1dGlsLnNpemVGcm9tU2hhcGUoaW5wdXQuc2hhcGUuc2xpY2UoYXhpcykpO1xuICAgICAgICBzdW1Jbm5lckRpbXMgKz0gaW5uZXJEaW07XG4gICAgICAgIHJldHVybiBpbm5lckRpbTtcbiAgICB9KTtcbiAgICBjb25zdCBpblZhbHMgPSAkaW5wdXRzLm1hcChpbnB1dCA9PiBiYWNrZW5kLnR5cGVkQXJyYXlGcm9tSGVhcChpbnB1dCkpO1xuICAgIGNvbnN0IG91dFZhbHMgPSBiYWNrZW5kLnR5cGVkQXJyYXlGcm9tSGVhcChvdXQpO1xuICAgIGZvciAobGV0IGIgPSAwOyBiIDwgYmF0Y2hEaW07IGIrKykge1xuICAgICAgICBsZXQgb3V0T2Zmc2V0ID0gYiAqIHN1bUlubmVyRGltcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpblZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGlubmVyRGltID0gaW5uZXJEaW1zW2ldO1xuICAgICAgICAgICAgY29uc3QgaW5PZmZzZXQgPSBiICogaW5uZXJEaW07XG4gICAgICAgICAgICBjb25zdCB2YWxzID0gaW5WYWxzW2ldLnN1YmFycmF5KGluT2Zmc2V0LCBpbk9mZnNldCArIGlubmVyRGltKTtcbiAgICAgICAgICAgIG91dFZhbHMuc2V0KHZhbHMsIG91dE9mZnNldCk7XG4gICAgICAgICAgICBvdXRPZmZzZXQgKz0gaW5uZXJEaW07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBjb25jYXRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQ29uY2F0LFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAga2VybmVsRnVuYzogY29uY2F0LFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbmNhdC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIENvbnYyRCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5sZXQgd2FzbUNvbnYyZDtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtQ29udjJkID0gYmFja2VuZC53YXNtLmN3cmFwKENvbnYyRCwgbnVsbCAvKiB2b2lkICovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgIF0pO1xufVxuZnVuY3Rpb24gY29udjJkKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYXR0cnMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4LCBmaWx0ZXIgfSA9IGlucHV0cztcbiAgICBjb25zdCB4SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IGZpbHRlcklkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGZpbHRlci5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IHsgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgZGF0YUZvcm1hdCB9ID0gYXR0cnM7XG4gICAgY29uc3QgJGRhdGFGb3JtYXQgPSBiYWNrZW5kX3V0aWwuY29udmVydENvbnYyRERhdGFGb3JtYXQoZGF0YUZvcm1hdCk7XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZUNvbnYyREluZm8oeC5zaGFwZSwgZmlsdGVyLnNoYXBlLCBzdHJpZGVzLCBkaWxhdGlvbnMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCBmYWxzZSwgJGRhdGFGb3JtYXQpO1xuICAgIGNvbnN0IGZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmZpbHRlckhlaWdodDtcbiAgICBjb25zdCBmaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmZpbHRlcldpZHRoO1xuICAgIGNvbnN0IHBhZFRvcCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IHBhZFJpZ2h0ID0gY29udkluZm8ucGFkSW5mby5yaWdodDtcbiAgICBjb25zdCBwYWRCb3R0b20gPSBjb252SW5mby5wYWRJbmZvLmJvdHRvbTtcbiAgICBjb25zdCBwYWRMZWZ0ID0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgIGNvbnN0IGRpbGF0aW9uSGVpZ2h0ID0gY29udkluZm8uZGlsYXRpb25IZWlnaHQ7XG4gICAgY29uc3QgZGlsYXRpb25XaWR0aCA9IGNvbnZJbmZvLmRpbGF0aW9uV2lkdGg7XG4gICAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgY29uc3QgaW5wdXRDaGFubmVscyA9IGNvbnZJbmZvLmluQ2hhbm5lbHM7XG4gICAgY29uc3Qgb3V0cHV0Q2hhbm5lbHMgPSBjb252SW5mby5vdXRDaGFubmVscztcbiAgICBjb25zdCBpc1NhbWVQYWQgPSBjb252SW5mby5wYWRJbmZvLnR5cGUgPT09ICdTQU1FJyA/IDEgOiAwO1xuICAgIGlmIChjb252SW5mby5kYXRhRm9ybWF0ICE9PSAnY2hhbm5lbHNMYXN0Jykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHdhc20gYmFja2VuZCBDb252MkQgZG9lcyBub3Qgc3VwcG9ydCBkYXRhRm9ybWF0OidgICtcbiAgICAgICAgICAgIGAke2NvbnZJbmZvLmRhdGFGb3JtYXR9Jy4gUGxlYXNlIHVzZSAnY2hhbm5lbHNMYXN0Jy5gKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KGNvbnZJbmZvLm91dFNoYXBlLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIHdhc21Db252MmQoeElkLCB4LnNoYXBlWzBdLCB4LnNoYXBlWzFdLCB4LnNoYXBlWzJdLCBmaWx0ZXJJZCwgZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgcGFkVG9wLCBwYWRSaWdodCwgcGFkQm90dG9tLCBwYWRMZWZ0LCBpc1NhbWVQYWQsIGRpbGF0aW9uSGVpZ2h0LCBkaWxhdGlvbldpZHRoLCBzdHJpZGVIZWlnaHQsIHN0cmlkZVdpZHRoLCBpbnB1dENoYW5uZWxzLCBvdXRwdXRDaGFubmVscywgb3V0SWQpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgY29udjJEQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IENvbnYyRCxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogY29udjJkXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29udjJELmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgQ29udjJEQmFja3Byb3BJbnB1dCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5sZXQgd2FzbUNvbnYyREJhY2twcm9wSW5wdXQ7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbUNvbnYyREJhY2twcm9wSW5wdXQgPSBiYWNrZW5kLndhc20uY3dyYXAoQ29udjJEQmFja3Byb3BJbnB1dCwgbnVsbCwgW1xuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgIF0pO1xufVxuZnVuY3Rpb24gY29udjJEQmFja3Byb3BJbnB1dChhcmdzKSB7XG4gICAgY29uc3QgeyBiYWNrZW5kLCBpbnB1dHMsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgZHksIGZpbHRlciB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0LCBkaW1Sb3VuZGluZ01vZGUsIGlucHV0U2hhcGUgfSA9IGF0dHJzO1xuICAgIGNvbnN0IGRpbGF0aW9ucyA9IDE7XG4gICAgY29uc3QgJGRhdGFGb3JtYXQgPSBiYWNrZW5kX3V0aWwuY29udmVydENvbnYyRERhdGFGb3JtYXQoZGF0YUZvcm1hdCk7XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZUNvbnYyREluZm8oaW5wdXRTaGFwZSwgZmlsdGVyLnNoYXBlLCBzdHJpZGVzLCBkaWxhdGlvbnMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCBmYWxzZSAvKiBkZXB0aHdpc2UgKi8sICRkYXRhRm9ybWF0KTtcbiAgICBjb25zdCB7IGJhdGNoU2l6ZSwgZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5DaGFubmVscywgaW5IZWlnaHQsIGluV2lkdGgsIG91dENoYW5uZWxzLCBvdXRIZWlnaHQsIG91dFdpZHRoLCBzdHJpZGVIZWlnaHQsIHN0cmlkZVdpZHRoIH0gPSBjb252SW5mbztcbiAgICBjb25zdCB0b3BQYWQgPSBmaWx0ZXJIZWlnaHQgLSAxIC0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgbGVmdFBhZCA9IGZpbHRlcldpZHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICBjb25zdCBpc0NoYW5uZWxzTGFzdCA9IGNvbnZJbmZvLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnO1xuICAgIGNvbnN0IGR4U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoY29udkluZm8uaW5TaGFwZSk7XG4gICAgY29uc3QgZHlTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhkeS5zaGFwZSk7XG4gICAgY29uc3QgW2ZsdFMwLCBmbHRTMSwgZmx0UzJdID0gdXRpbC5jb21wdXRlU3RyaWRlcyhmaWx0ZXIuc2hhcGUpO1xuICAgIGNvbnN0IHhCYXRjaFN0cmlkZSA9IGR4U3RyaWRlc1swXTtcbiAgICBjb25zdCB4Um93U3RyaWRlID0gaXNDaGFubmVsc0xhc3QgPyBkeFN0cmlkZXNbMV0gOiBkeFN0cmlkZXNbMl07XG4gICAgY29uc3QgeENvbFN0cmlkZSA9IGlzQ2hhbm5lbHNMYXN0ID8gZHhTdHJpZGVzWzJdIDogMTtcbiAgICBjb25zdCB4Q2hhbm5lbFN0cmlkZSA9IGlzQ2hhbm5lbHNMYXN0ID8gMSA6IGR4U3RyaWRlc1sxXTtcbiAgICBjb25zdCB5QmF0Y2hTdHJpZGUgPSBkeVN0cmlkZXNbMF07XG4gICAgY29uc3QgeVJvd1N0cmlkZSA9IGlzQ2hhbm5lbHNMYXN0ID8gZHlTdHJpZGVzWzFdIDogZHlTdHJpZGVzWzJdO1xuICAgIGNvbnN0IHlDb2xTdHJpZGUgPSBpc0NoYW5uZWxzTGFzdCA/IGR5U3RyaWRlc1syXSA6IDE7XG4gICAgY29uc3QgeUNoYW5uZWxTdHJpZGUgPSBpc0NoYW5uZWxzTGFzdCA/IDEgOiBkeVN0cmlkZXNbMV07XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KGNvbnZJbmZvLmluU2hhcGUsICdmbG9hdDMyJyk7XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgZHlJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChkeS5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IGZpbHRlcklkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGZpbHRlci5kYXRhSWQpLmlkO1xuICAgIHdhc21Db252MkRCYWNrcHJvcElucHV0KGR5SWQsIGZpbHRlcklkLCBiYXRjaFNpemUsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGluSGVpZ2h0LCBpbldpZHRoLCBpbkNoYW5uZWxzLCBvdXRIZWlnaHQsIG91dFdpZHRoLCBvdXRDaGFubmVscywgc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aCwgdG9wUGFkLCBsZWZ0UGFkLCBmbHRTMCwgZmx0UzEsIGZsdFMyLCB4QmF0Y2hTdHJpZGUsIHhSb3dTdHJpZGUsIHhDb2xTdHJpZGUsIHhDaGFubmVsU3RyaWRlLCB5QmF0Y2hTdHJpZGUsIHlSb3dTdHJpZGUsIHlDb2xTdHJpZGUsIHlDaGFubmVsU3RyaWRlLCBvdXRJZCk7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBjb252MkRCYWNrcHJvcElucHV0Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IENvbnYyREJhY2twcm9wSW5wdXQsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IGNvbnYyREJhY2twcm9wSW5wdXRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db252MkRCYWNrcHJvcElucHV0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IENvcyB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVVbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vdW5hcnlfa2VybmVsJztcbmV4cG9ydCBjb25zdCBjb3NDb25maWcgPSBjcmVhdGVVbmFyeUtlcm5lbENvbmZpZyhDb3MpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29zLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IENvc2ggfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlVW5hcnlLZXJuZWxDb25maWcgfSBmcm9tICcuL3VuYXJ5X2tlcm5lbCc7XG5leHBvcnQgY29uc3QgY29zaENvbmZpZyA9IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnKENvc2gpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29zaC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBDcm9wQW5kUmVzaXplIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNhc3QgfSBmcm9tICcuL0Nhc3QnO1xuLy8gTXVzdCBtYXRjaCBlbnVtIGluIENyb3BBbmRSZXNpemUuY2NcbnZhciBJbnRlcnBvbGF0aW9uTWV0aG9kO1xuKGZ1bmN0aW9uIChJbnRlcnBvbGF0aW9uTWV0aG9kKSB7XG4gICAgSW50ZXJwb2xhdGlvbk1ldGhvZFtJbnRlcnBvbGF0aW9uTWV0aG9kW1wiYmlsaW5lYXJcIl0gPSAwXSA9IFwiYmlsaW5lYXJcIjtcbiAgICBJbnRlcnBvbGF0aW9uTWV0aG9kW0ludGVycG9sYXRpb25NZXRob2RbXCJuZWFyZXN0XCJdID0gMV0gPSBcIm5lYXJlc3RcIjtcbn0pKEludGVycG9sYXRpb25NZXRob2QgfHwgKEludGVycG9sYXRpb25NZXRob2QgPSB7fSkpO1xubGV0IHdhc21Dcm9wQW5kUmVzaXplO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21Dcm9wQW5kUmVzaXplID0gYmFja2VuZC53YXNtLmN3cmFwKENyb3BBbmRSZXNpemUsIG51bGwgLyp2b2lkKi8sIFtcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyAvLyBvdXQgaWRcbiAgICBdKTtcbn1cbmZ1bmN0aW9uIGNyb3BBbmRSZXNpemUoYXJncykge1xuICAgIGNvbnN0IHsgYmFja2VuZCwgaW5wdXRzLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IG1ldGhvZCwgZXh0cmFwb2xhdGlvblZhbHVlLCBjcm9wU2l6ZSB9ID0gYXR0cnM7XG4gICAgY29uc3QgeyBpbWFnZSwgYm94ZXMsIGJveEluZCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IG51bUJveGVzID0gYm94ZXMuc2hhcGVbMF07XG4gICAgY29uc3QgW2Nyb3BIZWlnaHQsIGNyb3BXaWR0aF0gPSBjcm9wU2l6ZTtcbiAgICBjb25zdCBvdXRTaGFwZSA9IFtudW1Cb3hlcywgY3JvcEhlaWdodCwgY3JvcFdpZHRoLCBpbWFnZS5zaGFwZVszXV07XG4gICAgbGV0IGltYWdlc0RhdGEgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoaW1hZ2UuZGF0YUlkKTtcbiAgICBsZXQgY2FzdGVkRGF0YTtcbiAgICBpZiAoaW1hZ2UuZHR5cGUgIT09ICdmbG9hdDMyJykge1xuICAgICAgICBjYXN0ZWREYXRhID0gY2FzdCh7IGJhY2tlbmQsIGlucHV0czogeyB4OiBpbWFnZSB9LCBhdHRyczogeyBkdHlwZTogJ2Zsb2F0MzInIH0gfSk7XG4gICAgICAgIGltYWdlc0RhdGEgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoY2FzdGVkRGF0YS5kYXRhSWQpO1xuICAgIH1cbiAgICBjb25zdCBpbWFnZXNJZCA9IGltYWdlc0RhdGEuaWQ7XG4gICAgY29uc3QgYm94ZXNJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChib3hlcy5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IGJveEluZElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGJveEluZC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChvdXRTaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBpbWFnZXNTaGFwZUJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobmV3IEludDMyQXJyYXkoaW1hZ2Uuc2hhcGUpLmJ1ZmZlcik7XG4gICAgd2FzbUNyb3BBbmRSZXNpemUoaW1hZ2VzSWQsIGJveGVzSWQsIGJveEluZElkLCBudW1Cb3hlcywgaW1hZ2VzU2hhcGVCeXRlcywgY3JvcEhlaWdodCwgY3JvcFdpZHRoLCBJbnRlcnBvbGF0aW9uTWV0aG9kW21ldGhvZF0sIGV4dHJhcG9sYXRpb25WYWx1ZSwgb3V0SWQpO1xuICAgIGlmIChjYXN0ZWREYXRhICE9IG51bGwpIHtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlRGF0YShjYXN0ZWREYXRhLmRhdGFJZCk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgY3JvcEFuZFJlc2l6ZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBDcm9wQW5kUmVzaXplLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiBjcm9wQW5kUmVzaXplXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q3JvcEFuZFJlc2l6ZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIEN1bXN1bSwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBDcHBEVHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgdHJhbnNwb3NlIH0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xubGV0IHdhc21DdW1zdW07XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbUN1bXN1bSA9IGJhY2tlbmQud2FzbS5jd3JhcChDdW1zdW0sIG51bGwgLyogdm9pZCAqLywgW1xuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInIC8vIGR0eXBlXG4gICAgXSk7XG59XG5leHBvcnQgZnVuY3Rpb24gY3Vtc3VtKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBheGlzLCBleGNsdXNpdmUsIHJldmVyc2UgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG4gICAgdXRpbC5hc3NlcnQoeC5kdHlwZSA9PT0gJ2Zsb2F0MzInIHx8IHguZHR5cGUgPT09ICdpbnQzMicsICgpID0+IGBjdW1zdW0gZG9lcyBub3Qgc3VwcG9ydCAke3guZHR5cGV9IHRlbnNvcnMgaW4gdGhlIFdBU00gYmFja2VuZGApO1xuICAgIC8vIHBlcm11dGUgcmVxdWlyZWQgYXhpcyB0byBpbm5lciBtb3N0IGF4aXNcbiAgICBjb25zdCBwZXJtdXRhdGlvbiA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oW2F4aXNdLCB4UmFuayk7XG4gICAgbGV0IHBlcm11dGVkWCA9IHg7XG4gICAgaWYgKHBlcm11dGF0aW9uICE9PSBudWxsKSB7XG4gICAgICAgIHBlcm11dGVkWCA9IHRyYW5zcG9zZSh7IGlucHV0czogeyB4IH0sIGF0dHJzOiB7IHBlcm06IHBlcm11dGF0aW9uIH0sIGJhY2tlbmQgfSk7XG4gICAgfVxuICAgIGNvbnN0IHBlcm11dGVkQXhpcyA9IGJhY2tlbmRfdXRpbC5nZXRJbm5lck1vc3RBeGVzKDEsIHhSYW5rKVswXTtcbiAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoJ2N1bXN1bScsIFtwZXJtdXRlZEF4aXNdLCB4UmFuayk7XG4gICAgY29uc3QgcGVybXV0ZWRPdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQocGVybXV0ZWRYLnNoYXBlLCBwZXJtdXRlZFguZHR5cGUpO1xuICAgIGNvbnN0IGZpbmFsRGltID0gcGVybXV0ZWRYLnNoYXBlW3Blcm11dGVkQXhpc107XG4gICAgY29uc3QgcGVybXV0ZWRYSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQocGVybXV0ZWRYLmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgcGVybXV0ZWRPdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChwZXJtdXRlZE91dC5kYXRhSWQpLmlkO1xuICAgIHdhc21DdW1zdW0ocGVybXV0ZWRYSWQsIGV4Y2x1c2l2ZSA/IDEgOiAwLCByZXZlcnNlID8gMSA6IDAsIGZpbmFsRGltLCBwZXJtdXRlZE91dElkLCBDcHBEVHlwZVt4LmR0eXBlXSk7XG4gICAgLy8gdHJhbnNwb3NlIGRhdGEgYmFjayBpZiBwZXJtdXRlZFxuICAgIGxldCBvdXQgPSBwZXJtdXRlZE91dDtcbiAgICBpZiAocGVybXV0YXRpb24gIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgdW5kb1Blcm11dGF0aW9uID0gYmFja2VuZF91dGlsLmdldFVuZG9BeGVzUGVybXV0YXRpb24ocGVybXV0YXRpb24pO1xuICAgICAgICBvdXQgPSB0cmFuc3Bvc2UoeyBpbnB1dHM6IHsgeDogcGVybXV0ZWRPdXQgfSwgYXR0cnM6IHsgcGVybTogdW5kb1Blcm11dGF0aW9uIH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZURhdGEocGVybXV0ZWRYLmRhdGFJZCk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZURhdGEocGVybXV0ZWRPdXQuZGF0YUlkKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBjdW1zdW1Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQ3Vtc3VtLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiBjdW1zdW1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DdW1zdW0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRGVwdGhUb1NwYWNlLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmxldCB3YXNtRGVwdGhUb1NwYWNlO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21EZXB0aFRvU3BhY2UgPSBiYWNrZW5kLndhc20uY3dyYXAoRGVwdGhUb1NwYWNlLCBudWxsIC8qdm9pZCovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgXSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVwdGhUb1NwYWNlKGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGlucHV0cywgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBibG9ja1NpemUsIGRhdGFGb3JtYXQgfSA9IGF0dHJzO1xuICAgIHV0aWwuYXNzZXJ0KGJsb2NrU2l6ZSA+IDEsICgpID0+IGBibG9ja1NpemUgc2hvdWxkIGJlID4gMSBmb3IgZGVwdGhUb1NwYWNlLCBidXQgd2FzOiAke2Jsb2NrU2l6ZX1gKTtcbiAgICBjb25zdCBiYXRjaFNpemUgPSB4LnNoYXBlWzBdO1xuICAgIGNvbnN0IGlucHV0SGVpZ2h0ID0gKGRhdGFGb3JtYXQgPT09ICdOSFdDJykgPyB4LnNoYXBlWzFdIDogeC5zaGFwZVsyXTtcbiAgICBjb25zdCBpbnB1dFdpZHRoID0gKGRhdGFGb3JtYXQgPT09ICdOSFdDJykgPyB4LnNoYXBlWzJdIDogeC5zaGFwZVszXTtcbiAgICBjb25zdCBpbnB1dERlcHRoID0gKGRhdGFGb3JtYXQgPT09ICdOSFdDJykgPyB4LnNoYXBlWzNdIDogeC5zaGFwZVsxXTtcbiAgICBjb25zdCBvdXRwdXRIZWlnaHQgPSBpbnB1dEhlaWdodCAqIGJsb2NrU2l6ZTtcbiAgICBjb25zdCBvdXRwdXRXaWR0aCA9IGlucHV0V2lkdGggKiBibG9ja1NpemU7XG4gICAgY29uc3Qgb3V0cHV0RGVwdGggPSBpbnB1dERlcHRoIC8gKGJsb2NrU2l6ZSAqIGJsb2NrU2l6ZSk7XG4gICAgY29uc3Qgb3V0cHV0U2hhcGUgPSAoZGF0YUZvcm1hdCA9PT0gJ05IV0MnKSA/XG4gICAgICAgIFtiYXRjaFNpemUsIG91dHB1dEhlaWdodCwgb3V0cHV0V2lkdGgsIG91dHB1dERlcHRoXSA6XG4gICAgICAgIFtiYXRjaFNpemUsIG91dHB1dERlcHRoLCBvdXRwdXRIZWlnaHQsIG91dHB1dFdpZHRoXTtcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQob3V0cHV0U2hhcGUsICdmbG9hdDMyJyk7XG4gICAgY29uc3QgeERhdGEgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeC5kYXRhSWQpO1xuICAgIGNvbnN0IHhJZCA9IHhEYXRhLmlkO1xuICAgIGNvbnN0IHhTdHJpZGVzQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheSh1dGlsLmNvbXB1dGVTdHJpZGVzKHguc2hhcGUpKS5idWZmZXIpO1xuICAgIGNvbnN0IG91dHB1dFNoYXBlQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheShvdXRwdXRTaGFwZSkuYnVmZmVyKTtcbiAgICBjb25zdCBvdXRTdHJpZGVzQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheSh1dGlsLmNvbXB1dGVTdHJpZGVzKG91dHB1dFNoYXBlKSkuYnVmZmVyKTtcbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBjaGFubmVsc0xhc3QgPSBkYXRhRm9ybWF0ID09PSAnTkhXQycgPyAxIDogMDtcbiAgICB3YXNtRGVwdGhUb1NwYWNlKHhJZCwgYmxvY2tTaXplLCBjaGFubmVsc0xhc3QsIHhTdHJpZGVzQnl0ZXMsIHguc2hhcGUubGVuZ3RoIC0gMSwgb3V0cHV0U2hhcGVCeXRlcywgb3V0U3RyaWRlc0J5dGVzLCBvdXRwdXRTaGFwZS5sZW5ndGgsIG91dElkKTtcbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IGRlcHRoVG9TcGFjZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBEZXB0aFRvU3BhY2UsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IGRlcHRoVG9TcGFjZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURlcHRoVG9TcGFjZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIERlcHRod2lzZUNvbnYyZE5hdGl2ZSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5sZXQgd2FzbURlcHRod2lzZUNvbnYyZDtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtRGVwdGh3aXNlQ29udjJkID1cbiAgICAgICAgYmFja2VuZC53YXNtLmN3cmFwKERlcHRod2lzZUNvbnYyZE5hdGl2ZSwgbnVsbCAvKiB2b2lkICovLCBbXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgXSk7XG59XG5mdW5jdGlvbiBkZXB0aHdpc2VDb252MmQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBhdHRycywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IHgsIGZpbHRlciB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHhJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh4LmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgZmlsdGVySWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoZmlsdGVyLmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgeyBzdHJpZGVzLCBkaWxhdGlvbnMsIHBhZCwgZGltUm91bmRpbmdNb2RlIH0gPSBhdHRycztcbiAgICBjb25zdCAkZGlsYXRpb25zID0gZGlsYXRpb25zID09IG51bGwgPyBbMSwgMV0gOiBkaWxhdGlvbnM7XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZUNvbnYyREluZm8oeC5zaGFwZSwgZmlsdGVyLnNoYXBlLCBzdHJpZGVzLCAkZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgdHJ1ZSAvKiBkZXB0aHdpc2UgKi8pO1xuICAgIGNvbnN0IGZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmZpbHRlckhlaWdodDtcbiAgICBjb25zdCBmaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmZpbHRlcldpZHRoO1xuICAgIGNvbnN0IHBhZFRvcCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IHBhZFJpZ2h0ID0gY29udkluZm8ucGFkSW5mby5yaWdodDtcbiAgICBjb25zdCBwYWRCb3R0b20gPSBjb252SW5mby5wYWRJbmZvLmJvdHRvbTtcbiAgICBjb25zdCBwYWRMZWZ0ID0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgIGNvbnN0IGRpbGF0aW9uSGVpZ2h0ID0gY29udkluZm8uZGlsYXRpb25IZWlnaHQ7XG4gICAgY29uc3QgZGlsYXRpb25XaWR0aCA9IGNvbnZJbmZvLmRpbGF0aW9uV2lkdGg7XG4gICAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgY29uc3QgaW5wdXRDaGFubmVscyA9IGNvbnZJbmZvLmluQ2hhbm5lbHM7XG4gICAgY29uc3Qgb3V0cHV0Q2hhbm5lbHMgPSBjb252SW5mby5vdXRDaGFubmVscztcbiAgICBjb25zdCBpc1NhbWVQYWQgPSBjb252SW5mby5wYWRJbmZvLnR5cGUgPT09ICdTQU1FJyA/IDEgOiAwO1xuICAgIGlmIChjb252SW5mby5kYXRhRm9ybWF0ICE9PSAnY2hhbm5lbHNMYXN0Jykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHdhc20gYmFja2VuZCBEZXB0aHdpc2VDb252MmROYXRpdmUgZG9lcyBub3Qgc3VwcG9ydCBkYXRhRm9ybWF0OidgICtcbiAgICAgICAgICAgIGAke2NvbnZJbmZvLmRhdGFGb3JtYXR9Jy4gUGxlYXNlIHVzZSAnY2hhbm5lbHNMYXN0Jy5gKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KGNvbnZJbmZvLm91dFNoYXBlLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIHdhc21EZXB0aHdpc2VDb252MmQoeElkLCB4LnNoYXBlWzBdLCB4LnNoYXBlWzFdLCB4LnNoYXBlWzJdLCBmaWx0ZXJJZCwgZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgcGFkVG9wLCBwYWRSaWdodCwgcGFkQm90dG9tLCBwYWRMZWZ0LCBpc1NhbWVQYWQsIGRpbGF0aW9uSGVpZ2h0LCBkaWxhdGlvbldpZHRoLCBzdHJpZGVIZWlnaHQsIHN0cmlkZVdpZHRoLCBpbnB1dENoYW5uZWxzLCBvdXRwdXRDaGFubmVscywgb3V0SWQpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgZGVwdGh3aXNlQ29udjJkTmF0aXZlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IERlcHRod2lzZUNvbnYyZE5hdGl2ZSxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogZGVwdGh3aXNlQ29udjJkXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGVwdGh3aXNlQ29udjJkTmF0aXZlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVxdWFsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vYmluYXJ5X2tlcm5lbCc7XG5jb25zdCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QgPSBmYWxzZTtcbmV4cG9ydCBjb25zdCBlcXVhbENvbmZpZyA9IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyhFcXVhbCwgc3VwcG9ydHNGdWxsQnJvYWRjYXN0LCAnYm9vbCcpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RXF1YWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRXhwIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi91bmFyeV9rZXJuZWwnO1xuZXhwb3J0IGNvbnN0IGV4cENvbmZpZyA9IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnKEV4cCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FeHAuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRXhwYW5kRGltcywgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmV4cG9ydCBmdW5jdGlvbiBleHBhbmREaW1zKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYXR0cnMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBpbnB1dCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgZGltIH0gPSBhdHRycztcbiAgICBjb25zdCBpbnB1dFJhbmsgPSBpbnB1dC5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgbmV3U2hhcGUgPSBpbnB1dC5zaGFwZS5zbGljZSgpO1xuICAgIGxldCAkZGltID0gZGltO1xuICAgIGlmIChkaW0gPCAwKSB7XG4gICAgICAgIC8vIE5lZ2F0aXZlIHZhbHVlIGlzIGNvdW50ZWQgZnJvbSB0aGUgdGFpbCBvZiByYW5rLlxuICAgICAgICB1dGlsLmFzc2VydCgtKGlucHV0UmFuayArIDEpIDw9IGRpbSwgKCkgPT4gYEF4aXMgbXVzdCBiZSBpbiB0aGUgaW50ZXJ2YWwgWyR7LShpbnB1dFJhbmsgKyAxKX0sICR7aW5wdXRSYW5rfV1gKTtcbiAgICAgICAgJGRpbSA9IGlucHV0UmFuayArIGRpbSArIDE7XG4gICAgfVxuICAgIG5ld1NoYXBlLnNwbGljZSgkZGltLCAwLCAxKTtcbiAgICByZXR1cm4gcmVzaGFwZSh7IGlucHV0czogeyB4OiBpbnB1dCB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogbmV3U2hhcGUgfSB9KTtcbn1cbmV4cG9ydCBjb25zdCBleHBhbmREaW1zQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEV4cGFuZERpbXMsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBrZXJuZWxGdW5jOiBleHBhbmREaW1zLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUV4cGFuZERpbXMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRmlsbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5mdW5jdGlvbiBmaWxsKGFyZ3MpIHtcbiAgICBjb25zdCB7IGF0dHJzOiB7IHNoYXBlLCB2YWx1ZSwgZHR5cGUgfSwgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoc2hhcGUsIGR0eXBlKTtcbiAgICBjb25zdCBvdXRWYWxzID0gYmFja2VuZC50eXBlZEFycmF5RnJvbUhlYXAob3V0KTtcbiAgICBvdXRWYWxzLmZpbGwodmFsdWUpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgZmlsbENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBGaWxsLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAga2VybmVsRnVuYzogZmlsbCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GaWxsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEZsaXBMZWZ0UmlnaHQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xubGV0IHdhc21GbGlwTGVmdFJpZ2h0O1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21GbGlwTGVmdFJpZ2h0ID0gYmFja2VuZC53YXNtLmN3cmFwKEZsaXBMZWZ0UmlnaHQsIG51bGwgLyogdm9pZCAqLywgW1xuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgIF0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZsaXBMZWZ0UmlnaHQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW1hZ2UgfSA9IGlucHV0cztcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoaW1hZ2Uuc2hhcGUsIGltYWdlLmR0eXBlKTtcbiAgICBjb25zdCBpbWFnZUlkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGltYWdlLmRhdGFJZCkuaWQ7XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgW2JhdGNoLCBpbWFnZUhlaWdodCwgaW1hZ2VXaWR0aCwgbnVtQ2hhbm5lbHNdID0gaW1hZ2Uuc2hhcGU7XG4gICAgd2FzbUZsaXBMZWZ0UmlnaHQoaW1hZ2VJZCwgYmF0Y2gsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBudW1DaGFubmVscywgb3V0SWQpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgZmxpcExlZnRSaWdodENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBGbGlwTGVmdFJpZ2h0LFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAga2VybmVsRnVuYzogZmxpcExlZnRSaWdodCxcbiAgICBzZXR1cEZ1bmM6IHNldHVwXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RmxpcExlZnRSaWdodC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBGbG9vciB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVVbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vdW5hcnlfa2VybmVsJztcbmV4cG9ydCBjb25zdCBmbG9vckNvbmZpZyA9IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnKEZsb29yKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZsb29yLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEZsb29yRGl2IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vYmluYXJ5X2tlcm5lbCc7XG5jb25zdCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QgPSBmYWxzZTtcbmV4cG9ydCBjb25zdCBmbG9vckRpdkNvbmZpZyA9IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyhGbG9vckRpdiwgc3VwcG9ydHNGdWxsQnJvYWRjYXN0KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZsb29yRGl2LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEZ1c2VkQmF0Y2hOb3JtLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmxldCB3YXNtQmF0Y2hOb3JtO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21CYXRjaE5vcm0gPSBiYWNrZW5kLndhc20uY3dyYXAoRnVzZWRCYXRjaE5vcm0sIG51bGwgLyogdm9pZCAqLywgWydudW1iZXInLCAnbnVtYmVyJywgJ251bWJlcicsICdudW1iZXInLCAnbnVtYmVyJywgJ251bWJlcicsICdudW1iZXInXSk7XG59XG5mdW5jdGlvbiBmdXNlZEJhdGNoTm9ybShhcmdzKSB7XG4gICAgY29uc3QgeyBiYWNrZW5kLCBpbnB1dHMsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgdmFyaWFuY2VFcHNpbG9uIH0gPSBhdHRycztcbiAgICBjb25zdCB7IHgsIG1lYW4sIHZhcmlhbmNlLCBvZmZzZXQsIHNjYWxlIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHguZGF0YUlkKS5pZDtcbiAgICBjb25zdCBtZWFuSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQobWVhbi5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IHZhcmlhbmNlSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQodmFyaWFuY2UuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBvZmZzZXRJZCA9IG9mZnNldCAhPSBudWxsID8gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG9mZnNldC5kYXRhSWQpLmlkIDogMDtcbiAgICBjb25zdCBzY2FsZUlkID0gc2NhbGUgIT0gbnVsbCA/IGJhY2tlbmQuZGF0YUlkTWFwLmdldChzY2FsZS5kYXRhSWQpLmlkIDogMDtcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoeC5zaGFwZSwgeC5kdHlwZSk7XG4gICAgLy8gU2hvcnQtY2lyY3VpdCB6ZXJvLXNpemVkIHRlbnNvcnMuXG4gICAgaWYgKHV0aWwuc2l6ZUZyb21TaGFwZSh4LnNoYXBlKSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICB3YXNtQmF0Y2hOb3JtKHhJZCwgbWVhbklkLCB2YXJpYW5jZUlkLCBvZmZzZXRJZCwgc2NhbGVJZCwgdmFyaWFuY2VFcHNpbG9uLCBvdXRJZCk7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBmdXNlZEJhdGNoTm9ybUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBGdXNlZEJhdGNoTm9ybSxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogZnVzZWRCYXRjaE5vcm1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GdXNlZEJhdGNoTm9ybS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIEZ1c2VkQ29udjJEIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IEZ1c2FibGVBY3RpdmF0aW9uIH0gZnJvbSAnLi90eXBlcyc7XG5sZXQgd2FzbUZ1c2VkQ29udjJkO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21GdXNlZENvbnYyZCA9IGJhY2tlbmQud2FzbS5jd3JhcChGdXNlZENvbnYyRCwgbnVsbCAvKiB2b2lkICovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICBdKTtcbn1cbmZ1bmN0aW9uIGZ1c2VkQ29udjJkKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYXR0cnMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4LCBmaWx0ZXIsIGJpYXMsIHByZWx1QWN0aXZhdGlvbldlaWdodHMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHN0cmlkZXMsIHBhZCwgZGlsYXRpb25zLCBkYXRhRm9ybWF0LCBkaW1Sb3VuZGluZ01vZGUsIGFjdGl2YXRpb24sIGxlYWt5cmVsdUFscGhhIH0gPSBhdHRycztcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyh4LnNoYXBlLCBmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpO1xuICAgIGNvbnN0IGZ1c2VkQWN0aXZhdGlvbiA9IEZ1c2FibGVBY3RpdmF0aW9uW2FjdGl2YXRpb25dO1xuICAgIGlmIChmdXNlZEFjdGl2YXRpb24gPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7YWN0aXZhdGlvbn0gYWN0aXZhdGlvbiBub3QgeWV0IHN1cHBvcnRlZCBmb3IgRnVzZWRDb252MkQgYCArXG4gICAgICAgICAgICBgaW4gdGhlIHdhc20gYmFja2VuZC5gKTtcbiAgICB9XG4gICAgY29uc3QgeElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHguZGF0YUlkKS5pZDtcbiAgICBjb25zdCBmaWx0ZXJJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChmaWx0ZXIuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBvdXRwdXRDaGFubmVscyA9IGNvbnZJbmZvLm91dENoYW5uZWxzO1xuICAgIGxldCBiaWFzSWQgPSAwO1xuICAgIGlmIChiaWFzICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgYmlhc0RhdGEgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoYmlhcy5kYXRhSWQpO1xuICAgICAgICBpZiAoYmlhc0RhdGEuc2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZ1c2VkQ29udjJEIG9ubHkgc3VwcG9ydHMgcmFuay0xIGJpYXMgYnV0IGdvdCBgICtcbiAgICAgICAgICAgICAgICBgcmFuayAke2JpYXNEYXRhLnNoYXBlLmxlbmd0aH0uYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJpYXNEYXRhLnNoYXBlWzBdICE9PSBvdXRwdXRDaGFubmVscykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGdXNlZENvbnYyRCBiaWFzIHNoYXBlICgke2JpYXNEYXRhLnNoYXBlfSkgZG9lcyBub3QgYCArXG4gICAgICAgICAgICAgICAgYG1hdGNoIHRoZSBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzICgke291dHB1dENoYW5uZWxzfSlgKTtcbiAgICAgICAgfVxuICAgICAgICBiaWFzSWQgPSBiaWFzRGF0YS5pZDtcbiAgICB9XG4gICAgY29uc3QgZmlsdGVySGVpZ2h0ID0gY29udkluZm8uZmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG4gICAgY29uc3QgcGFkVG9wID0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgcGFkUmlnaHQgPSBjb252SW5mby5wYWRJbmZvLnJpZ2h0O1xuICAgIGNvbnN0IHBhZEJvdHRvbSA9IGNvbnZJbmZvLnBhZEluZm8uYm90dG9tO1xuICAgIGNvbnN0IHBhZExlZnQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgY29uc3QgZGlsYXRpb25IZWlnaHQgPSBjb252SW5mby5kaWxhdGlvbkhlaWdodDtcbiAgICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBpbnB1dENoYW5uZWxzID0gY29udkluZm8uaW5DaGFubmVscztcbiAgICBjb25zdCBpc1NhbWVQYWQgPSBjb252SW5mby5wYWRJbmZvLnR5cGUgPT09ICdTQU1FJyA/IDEgOiAwO1xuICAgIGNvbnN0IGJhdGNoU2l6ZSA9IGNvbnZJbmZvLmJhdGNoU2l6ZTtcbiAgICBjb25zdCBpbkhlaWdodCA9IGNvbnZJbmZvLmluSGVpZ2h0O1xuICAgIGNvbnN0IGluV2lkdGggPSBjb252SW5mby5pbldpZHRoO1xuICAgIGlmIChkYXRhRm9ybWF0ICE9PSAnTkhXQycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB3YXNtIGJhY2tlbmQgRnVzZWRDb252MkQgZG9lcyBub3Qgc3VwcG9ydCBkYXRhRm9ybWF0OidgICtcbiAgICAgICAgICAgIGAke2RhdGFGb3JtYXR9Jy4gUGxlYXNlIHVzZSAnTkhXQycuYCk7XG4gICAgfVxuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChjb252SW5mby5vdXRTaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBwcmVsdUFjdGl2YXRpb25XZWlnaHRzSWQgPSBwcmVsdUFjdGl2YXRpb25XZWlnaHRzID09IG51bGwgP1xuICAgICAgICAwIDpcbiAgICAgICAgYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHByZWx1QWN0aXZhdGlvbldlaWdodHMuZGF0YUlkKS5pZDtcbiAgICB3YXNtRnVzZWRDb252MmQoeElkLCBiYXRjaFNpemUsIGluSGVpZ2h0LCBpbldpZHRoLCBmaWx0ZXJJZCwgZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgYmlhc0lkLCBwYWRUb3AsIHBhZFJpZ2h0LCBwYWRCb3R0b20sIHBhZExlZnQsIGlzU2FtZVBhZCwgZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGgsIHN0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGgsIGlucHV0Q2hhbm5lbHMsIG91dHB1dENoYW5uZWxzLCBmdXNlZEFjdGl2YXRpb24sIHByZWx1QWN0aXZhdGlvbldlaWdodHNJZCwgbGVha3lyZWx1QWxwaGEgfHwgMCwgb3V0SWQpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgZnVzZWRDb252MkRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRnVzZWRDb252MkQsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IGZ1c2VkQ29udjJkXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RnVzZWRDb252MkQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBGdXNlZERlcHRod2lzZUNvbnYyRCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBGdXNhYmxlQWN0aXZhdGlvbiB9IGZyb20gJy4vdHlwZXMnO1xubGV0IHdhc21GdXNlZERlcHRod2lzZUNvbnYyZDtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtRnVzZWREZXB0aHdpc2VDb252MmQgPVxuICAgICAgICBiYWNrZW5kLndhc20uY3dyYXAoRnVzZWREZXB0aHdpc2VDb252MkQsIG51bGwgLyogdm9pZCAqLywgW1xuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgXSk7XG59XG5mdW5jdGlvbiBmdXNlZERlcHRod2lzZUNvbnYyZChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGF0dHJzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCwgZmlsdGVyLCBiaWFzLCBwcmVsdUFjdGl2YXRpb25XZWlnaHRzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBzdHJpZGVzLCBwYWQsIGRpbGF0aW9ucywgZGF0YUZvcm1hdCwgZGltUm91bmRpbmdNb2RlLCBhY3RpdmF0aW9uLCBsZWFreXJlbHVBbHBoYSB9ID0gYXR0cnM7XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZUNvbnYyREluZm8oeC5zaGFwZSwgZmlsdGVyLnNoYXBlLCBzdHJpZGVzLCBkaWxhdGlvbnMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCB0cnVlIC8qIGRlcHRod2lzZSAqLyk7XG4gICAgY29uc3QgZnVzZWRBY3RpdmF0aW9uID0gRnVzYWJsZUFjdGl2YXRpb25bYWN0aXZhdGlvbl07XG4gICAgaWYgKGZ1c2VkQWN0aXZhdGlvbiA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHthY3RpdmF0aW9ufSBhY3RpdmF0aW9uIG5vdCB5ZXQgc3VwcG9ydGVkIGZvciBGdXNlZERlcHRod2lzZUNvbnYyRCBgICtcbiAgICAgICAgICAgIGBpbiB0aGUgd2FzbSBiYWNrZW5kLmApO1xuICAgIH1cbiAgICBjb25zdCB4SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IGZpbHRlcklkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGZpbHRlci5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IG91dHB1dENoYW5uZWxzID0gY29udkluZm8ub3V0Q2hhbm5lbHM7XG4gICAgbGV0IGJpYXNJZCA9IDA7XG4gICAgaWYgKGJpYXMgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBiaWFzRGF0YSA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChiaWFzLmRhdGFJZCk7XG4gICAgICAgIGlmIChiaWFzRGF0YS5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRnVzZWREZXB0aHdpc2VDb252MkQgb25seSBzdXBwb3J0cyByYW5rLTEgYmlhcyBidXQgZ290IGAgK1xuICAgICAgICAgICAgICAgIGByYW5rICR7Ymlhc0RhdGEuc2hhcGUubGVuZ3RofS5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYmlhc0RhdGEuc2hhcGVbMF0gIT09IG91dHB1dENoYW5uZWxzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZ1c2VkRGVwdGh3aXNlQ29udjJEIGJpYXMgc2hhcGUgKCR7Ymlhc0RhdGEuc2hhcGV9KSBkb2VzIG5vdCBgICtcbiAgICAgICAgICAgICAgICBgbWF0Y2ggdGhlIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMgKCR7b3V0cHV0Q2hhbm5lbHN9KWApO1xuICAgICAgICB9XG4gICAgICAgIGJpYXNJZCA9IGJpYXNEYXRhLmlkO1xuICAgIH1cbiAgICBjb25zdCBmaWx0ZXJIZWlnaHQgPSBjb252SW5mby5maWx0ZXJIZWlnaHQ7XG4gICAgY29uc3QgZmlsdGVyV2lkdGggPSBjb252SW5mby5maWx0ZXJXaWR0aDtcbiAgICBjb25zdCBwYWRUb3AgPSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICBjb25zdCBwYWRSaWdodCA9IGNvbnZJbmZvLnBhZEluZm8ucmlnaHQ7XG4gICAgY29uc3QgcGFkQm90dG9tID0gY29udkluZm8ucGFkSW5mby5ib3R0b207XG4gICAgY29uc3QgcGFkTGVmdCA9IGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICAgIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICAgIGNvbnN0IGlucHV0Q2hhbm5lbHMgPSBjb252SW5mby5pbkNoYW5uZWxzO1xuICAgIGNvbnN0IGlzU2FtZVBhZCA9IGNvbnZJbmZvLnBhZEluZm8udHlwZSA9PT0gJ1NBTUUnID8gMSA6IDA7XG4gICAgY29uc3QgYmF0Y2hTaXplID0gY29udkluZm8uYmF0Y2hTaXplO1xuICAgIGNvbnN0IGluSGVpZ2h0ID0gY29udkluZm8uaW5IZWlnaHQ7XG4gICAgY29uc3QgaW5XaWR0aCA9IGNvbnZJbmZvLmluV2lkdGg7XG4gICAgaWYgKGRhdGFGb3JtYXQgIT09ICdOSFdDJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHdhc20gYmFja2VuZCBGdXNlZERlcHRod2lzZUNvbnYyRCBkb2VzIG5vdCBzdXBwb3J0IGRhdGFGb3JtYXQ6J2AgK1xuICAgICAgICAgICAgYCR7ZGF0YUZvcm1hdH0nLiBQbGVhc2UgdXNlICdOSFdDJy5gKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KGNvbnZJbmZvLm91dFNoYXBlLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IHByZWx1QWN0aXZhdGlvbldlaWdodHNJZCA9IHByZWx1QWN0aXZhdGlvbldlaWdodHMgPT0gbnVsbCA/XG4gICAgICAgIDAgOlxuICAgICAgICBiYWNrZW5kLmRhdGFJZE1hcC5nZXQocHJlbHVBY3RpdmF0aW9uV2VpZ2h0cy5kYXRhSWQpLmlkO1xuICAgIHdhc21GdXNlZERlcHRod2lzZUNvbnYyZCh4SWQsIGJhdGNoU2l6ZSwgaW5IZWlnaHQsIGluV2lkdGgsIGZpbHRlcklkLCBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBiaWFzSWQsIHBhZFRvcCwgcGFkUmlnaHQsIHBhZEJvdHRvbSwgcGFkTGVmdCwgaXNTYW1lUGFkLCBkaWxhdGlvbkhlaWdodCwgZGlsYXRpb25XaWR0aCwgc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aCwgaW5wdXRDaGFubmVscywgb3V0cHV0Q2hhbm5lbHMsIGZ1c2VkQWN0aXZhdGlvbiwgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0c0lkLCBsZWFreXJlbHVBbHBoYSB8fCAwLCBvdXRJZCk7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBmdXNlZERlcHRod2lzZUNvbnYyRENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBGdXNlZERlcHRod2lzZUNvbnYyRCxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogZnVzZWREZXB0aHdpc2VDb252MmRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GdXNlZERlcHRod2lzZUNvbnYyRC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBnYXRoZXJfdXRpbCwgR2F0aGVyTmQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgQ3BwRFR5cGUgfSBmcm9tICcuL3R5cGVzJztcbmxldCB3YXNtR2F0aGVyTmQ7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbUdhdGhlck5kID0gYmFja2VuZC53YXNtLmN3cmFwKEdhdGhlck5kLCBudWxsIC8qdm9pZCovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdudW1iZXInIC8vIG91dElkXG4gICAgXSk7XG59XG5mdW5jdGlvbiBnYXRoZXJOZChhcmdzKSB7XG4gICAgY29uc3QgeyBiYWNrZW5kLCBpbnB1dHMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBwYXJhbXMsIGluZGljZXMgfSA9IGlucHV0cztcbiAgICBjb25zdCBbcmVzdWx0U2hhcGUsIG51bVNsaWNlcywgc2xpY2VTaXplLCBzdHJpZGVzXSA9IGdhdGhlcl91dGlsLnByZXBhcmVBbmRWYWxpZGF0ZShwYXJhbXMsIGluZGljZXMpO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChyZXN1bHRTaGFwZSwgcGFyYW1zLmR0eXBlKTtcbiAgICBpZiAobnVtU2xpY2VzID09PSAwKSB7XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuICAgIGNvbnN0IGluZGljZXNTaGFwZSA9IGluZGljZXMuc2hhcGU7XG4gICAgY29uc3Qgc2xpY2VSYW5rID0gaW5kaWNlc1NoYXBlW2luZGljZXNTaGFwZS5sZW5ndGggLSAxXTtcbiAgICBjb25zdCB4RGF0YSA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChwYXJhbXMuZGF0YUlkKTtcbiAgICBjb25zdCB4SWQgPSB4RGF0YS5pZDtcbiAgICBjb25zdCBpbmRpY2VzRGF0YSA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChpbmRpY2VzLmRhdGFJZCk7XG4gICAgY29uc3QgaW5kaWNlc0lkID0gaW5kaWNlc0RhdGEuaWQ7XG4gICAgY29uc3Qgc3RyaWRlc0J5dGVzID0gbmV3IFVpbnQ4QXJyYXkobmV3IEludDMyQXJyYXkoc3RyaWRlcykuYnVmZmVyKTtcbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICB3YXNtR2F0aGVyTmQoeElkLCBDcHBEVHlwZVtwYXJhbXMuZHR5cGVdLCBpbmRpY2VzSWQsIG51bVNsaWNlcywgc2xpY2VSYW5rLCBzbGljZVNpemUsIHN0cmlkZXNCeXRlcywgb3V0SWQpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgZ2F0aGVyTmRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogR2F0aGVyTmQsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IGdhdGhlck5kXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9R2F0aGVyTmQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBHYXRoZXJWMiwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7IENwcERUeXBlIH0gZnJvbSAnLi90eXBlcyc7XG5sZXQgd2FzbUdhdGhlcjtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtR2F0aGVyID0gYmFja2VuZC53YXNtLmN3cmFwKCdHYXRoZXInLCBudWxsIC8qdm9pZCovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgJ251bWJlcicgLy8gb3V0SWRcbiAgICBdKTtcbn1cbmZ1bmN0aW9uIGdhdGhlclYyKGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGlucHV0cywgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4LCBpbmRpY2VzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBheGlzLCBiYXRjaERpbXMgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHBhcnNlZEF4aXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpWzBdO1xuICAgIGNvbnN0IHNoYXBlSW5mbyA9IGJhY2tlbmRfdXRpbC5zZWdtZW50X3V0aWwuY29sbGVjdEdhdGhlck9wU2hhcGVJbmZvKHgsIGluZGljZXMsIHBhcnNlZEF4aXMsIGJhdGNoRGltcyk7XG4gICAgY29uc3QgZmxhdHRlblggPSByZXNoYXBlKHtcbiAgICAgICAgaW5wdXRzOiB7IHggfSxcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgIHNoYXBlOiBbXG4gICAgICAgICAgICAgICAgc2hhcGVJbmZvLmJhdGNoU2l6ZSwgc2hhcGVJbmZvLm91dGVyU2l6ZSwgc2hhcGVJbmZvLmRpbVNpemUsXG4gICAgICAgICAgICAgICAgc2hhcGVJbmZvLnNsaWNlU2l6ZVxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICBiYWNrZW5kXG4gICAgfSk7XG4gICAgY29uc3QgaW5kaWNlc1NpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoaW5kaWNlcy5zaGFwZSk7XG4gICAgY29uc3QgZmxhdHRlbkluZGV4ID0gcmVzaGFwZSh7XG4gICAgICAgIGlucHV0czogeyB4OiBpbmRpY2VzIH0sXG4gICAgICAgIGF0dHJzOiB7IHNoYXBlOiBbc2hhcGVJbmZvLmJhdGNoU2l6ZSwgaW5kaWNlc1NpemUgLyBzaGFwZUluZm8uYmF0Y2hTaXplXSB9LFxuICAgICAgICBiYWNrZW5kXG4gICAgfSk7XG4gICAgY29uc3QgZmxhdHRlbk91dHB1dFNoYXBlID0gW1xuICAgICAgICBzaGFwZUluZm8uYmF0Y2hTaXplLCBzaGFwZUluZm8ub3V0ZXJTaXplLCBpbmRpY2VzU2l6ZSAvIHNoYXBlSW5mby5iYXRjaFNpemUsXG4gICAgICAgIHNoYXBlSW5mby5zbGljZVNpemVcbiAgICBdO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChmbGF0dGVuT3V0cHV0U2hhcGUsIHguZHR5cGUpO1xuICAgIGlmICh1dGlsLnNpemVGcm9tU2hhcGUoeC5zaGFwZSkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG4gICAgY29uc3Qgc3RyaWRlc1NpemUgPSBmbGF0dGVuWC5zaGFwZS5sZW5ndGggLSAxO1xuICAgIGNvbnN0IHhEYXRhID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGZsYXR0ZW5YLmRhdGFJZCk7XG4gICAgY29uc3QgeElkID0geERhdGEuaWQ7XG4gICAgY29uc3QgaW5kaWNlc0RhdGEgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoZmxhdHRlbkluZGV4LmRhdGFJZCk7XG4gICAgY29uc3QgaW5kaWNlc0lkID0gaW5kaWNlc0RhdGEuaWQ7XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgeFN0cmlkZXNCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KHV0aWwuY29tcHV0ZVN0cmlkZXMoZmxhdHRlblguc2hhcGUpKS5idWZmZXIpO1xuICAgIGNvbnN0IG91dFN0cmlkZXNCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KHV0aWwuY29tcHV0ZVN0cmlkZXMoZmxhdHRlbk91dHB1dFNoYXBlKSkuYnVmZmVyKTtcbiAgICB3YXNtR2F0aGVyKHhJZCwgQ3BwRFR5cGVbeC5kdHlwZV0sIHhTdHJpZGVzQnl0ZXMsIHN0cmlkZXNTaXplLCBpbmRpY2VzSWQsIHNoYXBlSW5mby5iYXRjaFNpemUsIG91dFN0cmlkZXNCeXRlcywgb3V0SWQpO1xuICAgIGJhY2tlbmQuZGlzcG9zZURhdGEoZmxhdHRlblguZGF0YUlkKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VEYXRhKGZsYXR0ZW5JbmRleC5kYXRhSWQpO1xuICAgIC8vIHJlc2hhcGVcbiAgICBvdXQuc2hhcGUgPSBzaGFwZUluZm8ub3V0cHV0U2hhcGU7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBnYXRoZXJWMkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBHYXRoZXJWMixcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogZ2F0aGVyVjJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1HYXRoZXJWMi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBHcmVhdGVyIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vYmluYXJ5X2tlcm5lbCc7XG5jb25zdCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QgPSBmYWxzZTtcbmV4cG9ydCBjb25zdCBncmVhdGVyQ29uZmlnID0gY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnKEdyZWF0ZXIsIHN1cHBvcnRzRnVsbEJyb2FkY2FzdCwgJ2Jvb2wnKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUdyZWF0ZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgR3JlYXRlckVxdWFsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vYmluYXJ5X2tlcm5lbCc7XG5jb25zdCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QgPSBmYWxzZTtcbmV4cG9ydCBjb25zdCBncmVhdGVyRXF1YWxDb25maWcgPSBjcmVhdGVCaW5hcnlLZXJuZWxDb25maWcoR3JlYXRlckVxdWFsLCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QsICdib29sJyk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1HcmVhdGVyRXF1YWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgSWRlbnRpdHkgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0czogeyB4IH0sIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KHguc2hhcGUsIHguZHR5cGUpO1xuICAgIGNvbnN0IGluVmFscyA9IGJhY2tlbmQudHlwZWRBcnJheUZyb21IZWFwKHgpO1xuICAgIGNvbnN0IG91dFZhbHMgPSBiYWNrZW5kLnR5cGVkQXJyYXlGcm9tSGVhcChvdXQpO1xuICAgIG91dFZhbHMuc2V0KGluVmFscyk7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBpZGVudGl0eUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBJZGVudGl0eSxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIGtlcm5lbEZ1bmM6IGlkZW50aXR5LFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUlkZW50aXR5LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IExlYWt5UmVsdSwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5sZXQgd2FzbUZ1bmM7XG5mdW5jdGlvbiBzZXR1cEZ1bmMoYmFja2VuZCkge1xuICAgIHdhc21GdW5jID0gYmFja2VuZC53YXNtLmN3cmFwKExlYWt5UmVsdSwgbnVsbCAvKiB2b2lkICovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicgLy8gb3V0X2lkXG4gICAgXSk7XG59XG5leHBvcnQgZnVuY3Rpb24gbGVha3lSZWx1KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0czogeyB4IH0sIGF0dHJzOiB7IGFscGhhIH0sIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHguZGF0YUlkKS5pZDtcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoeC5zaGFwZSwgeC5kdHlwZSk7XG4gICAgaWYgKHV0aWwuc2l6ZUZyb21TaGFwZSh4LnNoYXBlKSAhPT0gMCkge1xuICAgICAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICAgICAgd2FzbUZ1bmMoeElkLCBhbHBoYSwgb3V0SWQpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IGxlYWt5UmVsdUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBMZWFreVJlbHUsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmMsXG4gICAga2VybmVsRnVuYzogbGVha3lSZWx1LFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxlYWt5UmVsdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBMZXNzIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vYmluYXJ5X2tlcm5lbCc7XG5jb25zdCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QgPSBmYWxzZTtcbmV4cG9ydCBjb25zdCBsZXNzQ29uZmlnID0gY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnKExlc3MsIHN1cHBvcnRzRnVsbEJyb2FkY2FzdCwgJ2Jvb2wnKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxlc3MuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTGVzc0VxdWFsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vYmluYXJ5X2tlcm5lbCc7XG5jb25zdCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QgPSBmYWxzZTtcbmV4cG9ydCBjb25zdCBsZXNzRXF1YWxDb25maWcgPSBjcmVhdGVCaW5hcnlLZXJuZWxDb25maWcoTGVzc0VxdWFsLCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QsICdib29sJyk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1MZXNzRXF1YWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTG9nIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi91bmFyeV9rZXJuZWwnO1xuZXhwb3J0IGNvbnN0IGxvZ0NvbmZpZyA9IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnKExvZyk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Mb2cuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTG9naWNhbEFuZCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVCaW5hcnlLZXJuZWxDb25maWcgfSBmcm9tICcuL2JpbmFyeV9rZXJuZWwnO1xuY29uc3Qgc3VwcG9ydHNGdWxsQnJvYWRjYXN0ID0gZmFsc2U7XG5leHBvcnQgY29uc3QgbG9naWNhbEFuZENvbmZpZyA9IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyhMb2dpY2FsQW5kLCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QsICdib29sJyk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Mb2dpY2FsQW5kLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBNYXggfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgcGVybXV0ZUF4ZXNBbmRUcmFuc3Bvc2UgfSBmcm9tICcuL2tlcm5lbF91dGlscyc7XG5sZXQgd2FzbU1heDtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtTWF4ID0gYmFja2VuZC53YXNtLmN3cmFwKE1heCwgbnVsbCAvKnZvaWQqLywgWydudW1iZXIsIG51bWJlciwgbnVtYmVyJ10pO1xufVxuZnVuY3Rpb24gbWF4KGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGlucHV0cywgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyByZWR1Y3Rpb25JbmRpY2VzOiBheGlzLCBrZWVwRGltcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHguZGF0YUlkKS5pZDtcbiAgICBsZXQgaW5wdXRJZCA9IHhJZDtcbiAgICBsZXQgaW5wdXQgPSB4O1xuICAgIGNvbnN0IHsgdHJhbnNwb3NlZCwgYXhlcywgb3JpZ2luYWxBeGVzLCBpbnB1dFdhc1RyYW5zcG9zZWQgfSA9IHBlcm11dGVBeGVzQW5kVHJhbnNwb3NlKHgsIGF4aXMsIGJhY2tlbmQpO1xuICAgIGlmIChpbnB1dFdhc1RyYW5zcG9zZWQpIHtcbiAgICAgICAgY29uc3QgdHJhbnNwb3NlZElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHRyYW5zcG9zZWQuZGF0YUlkKS5pZDtcbiAgICAgICAgaW5wdXQgPSB0cmFuc3Bvc2VkO1xuICAgICAgICBpbnB1dElkID0gdHJhbnNwb3NlZElkO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dFJhbmsgPSBpbnB1dC5zaGFwZS5sZW5ndGg7XG4gICAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdtYXgnLCBheGVzLCBpbnB1dFJhbmspO1xuICAgIGNvbnN0IFtvdXRTaGFwZSwgcmVkdWNlU2hhcGVdID0gYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMoaW5wdXQuc2hhcGUsIGF4ZXMpO1xuICAgIGNvbnN0IHJlZHVjZVNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChvdXRTaGFwZSwgeC5kdHlwZSk7XG4gICAgaWYgKHV0aWwuc2l6ZUZyb21TaGFwZShpbnB1dC5zaGFwZSkgIT09IDApIHtcbiAgICAgICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgICAgIHdhc21NYXgoaW5wdXRJZCwgcmVkdWNlU2l6ZSwgb3V0SWQpO1xuICAgIH1cbiAgICBpZiAoaW5wdXRXYXNUcmFuc3Bvc2VkKSB7XG4gICAgICAgIC8vIGRpc3Bvc2Ugb2YgdGhlIHRyYW5zcG9zZWQgdGVuc29yLlxuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VEYXRhKHRyYW5zcG9zZWQuZGF0YUlkKTtcbiAgICB9XG4gICAgaWYgKGtlZXBEaW1zKSB7XG4gICAgICAgIC8vIHJlc2hhcGVcbiAgICAgICAgY29uc3QgbmV3U2hhcGUgPSBiYWNrZW5kX3V0aWwuZXhwYW5kU2hhcGVUb0tlZXBEaW0ob3V0LnNoYXBlLCBvcmlnaW5hbEF4ZXMpO1xuICAgICAgICBvdXQuc2hhcGUgPSBuZXdTaGFwZTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBtYXhDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTWF4LFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiBtYXhcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NYXguanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBNYXhQb29sIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmxldCB3YXNtTWF4UG9vbDtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtTWF4UG9vbCA9IGJhY2tlbmQud2FzbS5jd3JhcChNYXhQb29sLCBudWxsIC8qIHZvaWQgKi8sIFtcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgIF0pO1xufVxuZnVuY3Rpb24gbWF4UG9vbChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGF0dHJzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHggPSBpbnB1dHMueDtcbiAgICBjb25zdCB4SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IHsgZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGUgfSA9IGF0dHJzO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVQb29sMkRJbmZvKHguc2hhcGUsIGZpbHRlclNpemUsIHN0cmlkZXMsIDEgLyogZGlsYXRpb25zICovLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSk7XG4gICAgY29uc3QgZmlsdGVySGVpZ2h0ID0gY29udkluZm8uZmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG4gICAgY29uc3QgcGFkVG9wID0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgcGFkUmlnaHQgPSBjb252SW5mby5wYWRJbmZvLnJpZ2h0O1xuICAgIGNvbnN0IHBhZEJvdHRvbSA9IGNvbnZJbmZvLnBhZEluZm8uYm90dG9tO1xuICAgIGNvbnN0IHBhZExlZnQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgY29uc3QgZGlsYXRpb25IZWlnaHQgPSBjb252SW5mby5kaWxhdGlvbkhlaWdodDtcbiAgICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBpbnB1dENoYW5uZWxzID0gY29udkluZm8uaW5DaGFubmVscztcbiAgICBjb25zdCBvdXRwdXRDaGFubmVscyA9IGNvbnZJbmZvLm91dENoYW5uZWxzO1xuICAgIGlmIChjb252SW5mby5kYXRhRm9ybWF0ICE9PSAnY2hhbm5lbHNMYXN0Jykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHdhc20gYmFja2VuZCBkb2VzIG5vdCBzdXBwb3J0IGRhdGFGb3JtYXQ6J2AgK1xuICAgICAgICAgICAgYCR7Y29udkluZm8uZGF0YUZvcm1hdH0nLiBQbGVhc2UgdXNlICdjaGFubmVsc0xhc3QnLmApO1xuICAgIH1cbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoY29udkluZm8ub3V0U2hhcGUsICdmbG9hdDMyJyk7XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgd2FzbU1heFBvb2woeElkLCB4LnNoYXBlWzBdLCB4LnNoYXBlWzFdLCB4LnNoYXBlWzJdLCBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBwYWRUb3AsIHBhZFJpZ2h0LCBwYWRCb3R0b20sIHBhZExlZnQsIGRpbGF0aW9uSGVpZ2h0LCBkaWxhdGlvbldpZHRoLCBzdHJpZGVIZWlnaHQsIHN0cmlkZVdpZHRoLCBpbnB1dENoYW5uZWxzLCBvdXRwdXRDaGFubmVscywgb3V0SWQpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgbWF4UG9vbENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBNYXhQb29sLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiBtYXhQb29sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWF4UG9vbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBNYXhpbXVtIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vYmluYXJ5X2tlcm5lbCc7XG5jb25zdCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QgPSBmYWxzZTtcbmV4cG9ydCBjb25zdCBtYXhpbXVtQ29uZmlnID0gY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnKE1heGltdW0sIHN1cHBvcnRzRnVsbEJyb2FkY2FzdCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NYXhpbXVtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgTWVhbiwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjYXN0IH0gZnJvbSAnLi9DYXN0JztcbmltcG9ydCB7IHBlcm11dGVBeGVzQW5kVHJhbnNwb3NlIH0gZnJvbSAnLi9rZXJuZWxfdXRpbHMnO1xubGV0IHdhc21NZWFuO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21NZWFuID1cbiAgICAgICAgYmFja2VuZC53YXNtLmN3cmFwKE1lYW4sIG51bGwgLyp2b2lkKi8sIFsnbnVtYmVyLCBudW1iZXIsIG51bWJlciddKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBtZWFuKGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGlucHV0cywgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBheGlzLCBrZWVwRGltcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHguZGF0YUlkKS5pZDtcbiAgICBsZXQgaW5wdXRJZCA9IHhJZDtcbiAgICBsZXQgaW5wdXQgPSB4O1xuICAgIGNvbnN0IHsgdHJhbnNwb3NlZCwgYXhlcywgb3JpZ2luYWxBeGVzLCBpbnB1dFdhc1RyYW5zcG9zZWQgfSA9IHBlcm11dGVBeGVzQW5kVHJhbnNwb3NlKHgsIGF4aXMsIGJhY2tlbmQpO1xuICAgIGxldCByZWR1Y3Rpb25BeGVzID0gYXhlcztcbiAgICBpZiAoaW5wdXRXYXNUcmFuc3Bvc2VkKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zcG9zZWRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh0cmFuc3Bvc2VkLmRhdGFJZCkuaWQ7XG4gICAgICAgIGlmICh0cmFuc3Bvc2VkSWQgIT09IHhJZCkge1xuICAgICAgICAgICAgLy8gdHJhbnNwb3NlIHdhcyBub3QgYSBuby1vcC4gV2Ugd2lsbCBuZWVkIHRvIGRpc3Bvc2Ugb2YgdGhpc1xuICAgICAgICAgICAgLy8gb25jZSB3ZSBhcmUgZG9uZS5cbiAgICAgICAgICAgIGlucHV0ID0gdHJhbnNwb3NlZDtcbiAgICAgICAgICAgIGlucHV0SWQgPSB0cmFuc3Bvc2VkSWQ7XG4gICAgICAgICAgICByZWR1Y3Rpb25BeGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMocmVkdWN0aW9uQXhlcy5sZW5ndGgsIGlucHV0LnNoYXBlLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdtZWFuJywgcmVkdWN0aW9uQXhlcywgaW5wdXQuc2hhcGUubGVuZ3RoKTtcbiAgICBjb25zdCBbb3V0U2hhcGUsIHJlZHVjZVNoYXBlXSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKGlucHV0LnNoYXBlLCByZWR1Y3Rpb25BeGVzKTtcbiAgICBjb25zdCByZWR1Y2VTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcbiAgICBsZXQgY2FzdGVkSW5wdXQgPSBpbnB1dDtcbiAgICBpZiAoaW5wdXQuZHR5cGUgIT09ICdmbG9hdDMyJykge1xuICAgICAgICBjYXN0ZWRJbnB1dCA9XG4gICAgICAgICAgICBjYXN0KHsgYmFja2VuZCwgaW5wdXRzOiB7IHg6IGlucHV0IH0sIGF0dHJzOiB7IGR0eXBlOiAnZmxvYXQzMicgfSB9KTtcbiAgICAgICAgaW5wdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChjYXN0ZWRJbnB1dC5kYXRhSWQpLmlkO1xuICAgIH1cbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQob3V0U2hhcGUsICdmbG9hdDMyJyk7XG4gICAgaWYgKHV0aWwuc2l6ZUZyb21TaGFwZShpbnB1dC5zaGFwZSkgIT09IDApIHtcbiAgICAgICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgICAgIHdhc21NZWFuKGlucHV0SWQsIHJlZHVjZVNpemUsIG91dElkKTtcbiAgICB9XG4gICAgaWYgKGlucHV0V2FzVHJhbnNwb3NlZCkge1xuICAgICAgICAvLyBkaXNwb3NlIG9mIHRoZSB0cmFuc3Bvc2VkIHRlbnNvci5cbiAgICAgICAgYmFja2VuZC5kaXNwb3NlRGF0YSh0cmFuc3Bvc2VkLmRhdGFJZCk7XG4gICAgfVxuICAgIGlmIChrZWVwRGltcykge1xuICAgICAgICAvLyByZXNoYXBlXG4gICAgICAgIGNvbnN0IG5ld1NoYXBlID0gYmFja2VuZF91dGlsLmV4cGFuZFNoYXBlVG9LZWVwRGltKG91dC5zaGFwZSwgb3JpZ2luYWxBeGVzKTtcbiAgICAgICAgb3V0LnNoYXBlID0gbmV3U2hhcGU7XG4gICAgfVxuICAgIGlmIChpbnB1dC5kdHlwZSAhPT0gJ2Zsb2F0MzInKSB7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZURhdGEoY2FzdGVkSW5wdXQuZGF0YUlkKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBtZWFuQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE1lYW4sXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IG1lYW5cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NZWFuLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgTWluLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHBlcm11dGVBeGVzQW5kVHJhbnNwb3NlIH0gZnJvbSAnLi9rZXJuZWxfdXRpbHMnO1xubGV0IHdhc21NaW47XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbU1pbiA9IGJhY2tlbmQud2FzbS5jd3JhcChNaW4sIG51bGwgLyp2b2lkKi8sIFsnbnVtYmVyLCBudW1iZXIsIG51bWJlciddKTtcbn1cbmZ1bmN0aW9uIG1pbihhcmdzKSB7XG4gICAgY29uc3QgeyBiYWNrZW5kLCBpbnB1dHMsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgYXhpcywga2VlcERpbXMgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHhJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh4LmRhdGFJZCkuaWQ7XG4gICAgbGV0IGlucHV0SWQgPSB4SWQ7XG4gICAgbGV0IGlucHV0ID0geDtcbiAgICBjb25zdCB7IHRyYW5zcG9zZWQsIGF4ZXMsIG9yaWdpbmFsQXhlcywgaW5wdXRXYXNUcmFuc3Bvc2VkIH0gPSBwZXJtdXRlQXhlc0FuZFRyYW5zcG9zZSh4LCBheGlzLCBiYWNrZW5kKTtcbiAgICBpZiAoaW5wdXRXYXNUcmFuc3Bvc2VkKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zcG9zZWRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh0cmFuc3Bvc2VkLmRhdGFJZCkuaWQ7XG4gICAgICAgIGlmICh0cmFuc3Bvc2VkSWQgIT09IHhJZCkge1xuICAgICAgICAgICAgLy8gdHJhbnNwb3NlIHdhcyBub3QgYSBuby1vcC4gV2Ugd2lsbCBuZWVkIHRvIGRpc3Bvc2Ugb2YgdGhpc1xuICAgICAgICAgICAgLy8gb25jZSB3ZSBhcmUgZG9uZS5cbiAgICAgICAgICAgIGlucHV0ID0gdHJhbnNwb3NlZDtcbiAgICAgICAgICAgIGlucHV0SWQgPSB0cmFuc3Bvc2VkSWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaW5wdXRSYW5rID0gaW5wdXQuc2hhcGUubGVuZ3RoO1xuICAgIGJhY2tlbmRfdXRpbC5hc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcygnbWluJywgYXhlcywgaW5wdXRSYW5rKTtcbiAgICBjb25zdCBbb3V0U2hhcGUsIHJlZHVjZVNoYXBlXSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKGlucHV0LnNoYXBlLCBheGVzKTtcbiAgICBjb25zdCByZWR1Y2VTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQob3V0U2hhcGUsIGlucHV0LmR0eXBlKTtcbiAgICBpZiAodXRpbC5zaXplRnJvbVNoYXBlKGlucHV0LnNoYXBlKSAhPT0gMCkge1xuICAgICAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICAgICAgd2FzbU1pbihpbnB1dElkLCByZWR1Y2VTaXplLCBvdXRJZCk7XG4gICAgfVxuICAgIGlmIChpbnB1dFdhc1RyYW5zcG9zZWQpIHtcbiAgICAgICAgLy8gZGlzcG9zZSBvZiB0aGUgdHJhbnNwb3NlZCB0ZW5zb3IuXG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZURhdGEodHJhbnNwb3NlZC5kYXRhSWQpO1xuICAgIH1cbiAgICBpZiAoa2VlcERpbXMpIHtcbiAgICAgICAgLy8gcmVzaGFwZVxuICAgICAgICBjb25zdCBuZXdTaGFwZSA9IGJhY2tlbmRfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbShvdXQuc2hhcGUsIG9yaWdpbmFsQXhlcyk7XG4gICAgICAgIG91dC5zaGFwZSA9IG5ld1NoYXBlO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IG1pbkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBNaW4sXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IG1pblxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1pbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBNaW5pbXVtIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vYmluYXJ5X2tlcm5lbCc7XG5jb25zdCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QgPSBmYWxzZTtcbmV4cG9ydCBjb25zdCBtaW5pbXVtQ29uZmlnID0gY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnKE1pbmltdW0sIHN1cHBvcnRzRnVsbEJyb2FkY2FzdCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NaW5pbXVtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IE1pcnJvclBhZCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBDcHBEVHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuLy8gTXVzdCBtYXRjaCBlbnVtIGluIE1pcnJvclBhZC5jY1xudmFyIE1pcnJvclBhZGRpbmdNb2RlO1xuKGZ1bmN0aW9uIChNaXJyb3JQYWRkaW5nTW9kZSkge1xuICAgIE1pcnJvclBhZGRpbmdNb2RlW01pcnJvclBhZGRpbmdNb2RlW1wicmVmbGVjdFwiXSA9IDBdID0gXCJyZWZsZWN0XCI7XG4gICAgTWlycm9yUGFkZGluZ01vZGVbTWlycm9yUGFkZGluZ01vZGVbXCJzeW1tZXRyaWNcIl0gPSAxXSA9IFwic3ltbWV0cmljXCI7XG59KShNaXJyb3JQYWRkaW5nTW9kZSB8fCAoTWlycm9yUGFkZGluZ01vZGUgPSB7fSkpO1xubGV0IHdhc21NaXJyb3JQYWQ7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbU1pcnJvclBhZCA9IGJhY2tlbmQud2FzbS5jd3JhcChNaXJyb3JQYWQsIG51bGwgLyogdm9pZCAqLywgW1xuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgXSk7XG59XG5mdW5jdGlvbiBtaXJyb3JQYWQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCwgYXR0cnM6IHsgcGFkZGluZ3MsIG1vZGUgfSB9ID0gYXJncztcbiAgICBjb25zdCBvdXRTaGFwZSA9IHBhZGRpbmdzLm1hcCgocCwgaSkgPT4gcFswXSAvKiBiZWZvcmVQYWQgKi8gKyB4LnNoYXBlW2ldICsgcFsxXSAvKiBhZnRlclBhZCAqLyk7XG4gICAgY29uc3QgeElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHguZGF0YUlkKS5pZDtcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQob3V0U2hhcGUsIHguZHR5cGUpO1xuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IHhTaGFwZUJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobmV3IEludDMyQXJyYXkoeC5zaGFwZSkuYnVmZmVyKTtcbiAgICBjb25zdCBwcmVQYWRkaW5nc0ZsYXQgPSBwYWRkaW5ncy5tYXAocGFkVHVwbGUgPT4gcGFkVHVwbGVbMF0pO1xuICAgIGNvbnN0IHBvc3RQYWRkaW5nc0ZsYXQgPSBwYWRkaW5ncy5tYXAocGFkVHVwbGUgPT4gcGFkVHVwbGVbMV0pO1xuICAgIGNvbnN0IHByZVBhZGRpbmdzQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheShwcmVQYWRkaW5nc0ZsYXQpLmJ1ZmZlcik7XG4gICAgY29uc3QgcG9zdFBhZGRpbmdzQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheShwb3N0UGFkZGluZ3NGbGF0KS5idWZmZXIpO1xuICAgIHdhc21NaXJyb3JQYWQoeElkLCB4U2hhcGVCeXRlcywgeC5zaGFwZS5sZW5ndGgsIENwcERUeXBlW3guZHR5cGVdLCBwcmVQYWRkaW5nc0J5dGVzLCBwb3N0UGFkZGluZ3NCeXRlcywgTWlycm9yUGFkZGluZ01vZGVbbW9kZV0sIG91dElkKTtcbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IG1pcnJvclBhZENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBNaXJyb3JQYWQsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBrZXJuZWxGdW5jOiBtaXJyb3JQYWQsXG4gICAgc2V0dXBGdW5jOiBzZXR1cFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1pcnJvclBhZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBNdWx0aXBseSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVCaW5hcnlLZXJuZWxDb25maWcgfSBmcm9tICcuL2JpbmFyeV9rZXJuZWwnO1xuY29uc3Qgc3VwcG9ydHNGdWxsQnJvYWRjYXN0ID0gdHJ1ZTtcbmV4cG9ydCBjb25zdCBtdWx0aXBseUNvbmZpZyA9IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyhNdWx0aXBseSwgc3VwcG9ydHNGdWxsQnJvYWRjYXN0KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU11bHRpcGx5LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IE5lZyB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVVbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vdW5hcnlfa2VybmVsJztcbmV4cG9ydCBjb25zdCBuZWdDb25maWcgPSBjcmVhdGVVbmFyeUtlcm5lbENvbmZpZyhOZWcpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TmVnLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IE5vbk1heFN1cHByZXNzaW9uVjMgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgcGFyc2VSZXN1bHRTdHJ1Y3QgfSBmcm9tICcuL05vbk1heFN1cHByZXNzaW9uX3V0aWwnO1xubGV0IHdhc21GdW5jO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21GdW5jID0gYmFja2VuZC53YXNtLmN3cmFwKE5vbk1heFN1cHByZXNzaW9uVjMsICdudW1iZXInLCAvLyBSZXN1bHQqXG4gICAgW1xuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgXSk7XG59XG5mdW5jdGlvbiBrZXJuZWxGdW5jKGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGlucHV0cywgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBpb3VUaHJlc2hvbGQsIG1heE91dHB1dFNpemUsIHNjb3JlVGhyZXNob2xkIH0gPSBhdHRycztcbiAgICBjb25zdCB7IGJveGVzLCBzY29yZXMgfSA9IGlucHV0cztcbiAgICBjb25zdCBib3hlc0lkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGJveGVzLmRhdGFJZCkuaWQ7XG4gICAgY29uc3Qgc2NvcmVzSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoc2NvcmVzLmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgcmVzT2Zmc2V0ID0gd2FzbUZ1bmMoYm94ZXNJZCwgc2NvcmVzSWQsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQpO1xuICAgIGNvbnN0IHsgcFNlbGVjdGVkSW5kaWNlcywgc2VsZWN0ZWRTaXplLCBwU2VsZWN0ZWRTY29yZXMsIHBWYWxpZE91dHB1dHMgfSA9IHBhcnNlUmVzdWx0U3RydWN0KGJhY2tlbmQsIHJlc09mZnNldCk7XG4gICAgLy8gU2luY2Ugd2UgYXJlIG5vdCB1c2luZyBzY29yZXMgZm9yIFYzLCB3ZSBoYXZlIHRvIGRlbGV0ZSBpdCBmcm9tIHRoZSBoZWFwLlxuICAgIGJhY2tlbmQud2FzbS5fZnJlZShwU2VsZWN0ZWRTY29yZXMpO1xuICAgIGJhY2tlbmQud2FzbS5fZnJlZShwVmFsaWRPdXRwdXRzKTtcbiAgICBjb25zdCBzZWxlY3RlZEluZGljZXNUZW5zb3IgPSBiYWNrZW5kLm1ha2VPdXRwdXQoW3NlbGVjdGVkU2l6ZV0sICdpbnQzMicsIHBTZWxlY3RlZEluZGljZXMpO1xuICAgIHJldHVybiBzZWxlY3RlZEluZGljZXNUZW5zb3I7XG59XG5leHBvcnQgY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25WM0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBOb25NYXhTdXBwcmVzc2lvblYzLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiBrZXJuZWxGdW5jLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5vbk1heFN1cHByZXNzaW9uVjMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTm9uTWF4U3VwcHJlc3Npb25WNCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBwYXJzZVJlc3VsdFN0cnVjdCB9IGZyb20gJy4vTm9uTWF4U3VwcHJlc3Npb25fdXRpbCc7XG5sZXQgd2FzbUZ1bmM7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbUZ1bmMgPSBiYWNrZW5kLndhc20uY3dyYXAoTm9uTWF4U3VwcHJlc3Npb25WNCwgJ251bWJlcicsIC8vIFJlc3VsdCpcbiAgICBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2Jvb2wnLFxuICAgIF0pO1xufVxuZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25WNChhcmdzKSB7XG4gICAgY29uc3QgeyBiYWNrZW5kLCBpbnB1dHMsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW91VGhyZXNob2xkLCBtYXhPdXRwdXRTaXplLCBzY29yZVRocmVzaG9sZCwgcGFkVG9NYXhPdXRwdXRTaXplIH0gPSBhdHRycztcbiAgICBjb25zdCB7IGJveGVzLCBzY29yZXMgfSA9IGlucHV0cztcbiAgICBjb25zdCBib3hlc0lkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGJveGVzLmRhdGFJZCkuaWQ7XG4gICAgY29uc3Qgc2NvcmVzSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoc2NvcmVzLmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgcmVzT2Zmc2V0ID0gd2FzbUZ1bmMoYm94ZXNJZCwgc2NvcmVzSWQsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsIHBhZFRvTWF4T3V0cHV0U2l6ZSk7XG4gICAgY29uc3QgeyBwU2VsZWN0ZWRJbmRpY2VzLCBzZWxlY3RlZFNpemUsIHBTZWxlY3RlZFNjb3JlcywgcFZhbGlkT3V0cHV0cyB9ID0gcGFyc2VSZXN1bHRTdHJ1Y3QoYmFja2VuZCwgcmVzT2Zmc2V0KTtcbiAgICAvLyBTaW5jZSB3ZSBhcmUgbm90IHVzaW5nIHNjb3JlcyBmb3IgVjQsIHdlIGhhdmUgdG8gZGVsZXRlIGl0IGZyb20gdGhlIGhlYXAuXG4gICAgYmFja2VuZC53YXNtLl9mcmVlKHBTZWxlY3RlZFNjb3Jlcyk7XG4gICAgY29uc3Qgc2VsZWN0ZWRJbmRpY2VzVGVuc29yID0gYmFja2VuZC5tYWtlT3V0cHV0KFtzZWxlY3RlZFNpemVdLCAnaW50MzInLCBwU2VsZWN0ZWRJbmRpY2VzKTtcbiAgICBjb25zdCB2YWxpZE91dHB1dHNUZW5zb3IgPSBiYWNrZW5kLm1ha2VPdXRwdXQoW10sICdpbnQzMicsIHBWYWxpZE91dHB1dHMpO1xuICAgIHJldHVybiBbc2VsZWN0ZWRJbmRpY2VzVGVuc29yLCB2YWxpZE91dHB1dHNUZW5zb3JdO1xufVxuZXhwb3J0IGNvbnN0IG5vbk1heFN1cHByZXNzaW9uVjRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTm9uTWF4U3VwcHJlc3Npb25WNCxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogbm9uTWF4U3VwcHJlc3Npb25WNCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ob25NYXhTdXBwcmVzc2lvblY0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IE5vbk1heFN1cHByZXNzaW9uVjUgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgcGFyc2VSZXN1bHRTdHJ1Y3QgfSBmcm9tICcuL05vbk1heFN1cHByZXNzaW9uX3V0aWwnO1xubGV0IHdhc21GdW5jO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21GdW5jID0gYmFja2VuZC53YXNtLmN3cmFwKE5vbk1heFN1cHByZXNzaW9uVjUsICdudW1iZXInLCAvLyBSZXN1bHQqXG4gICAgW1xuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgIF0pO1xufVxuZnVuY3Rpb24ga2VybmVsRnVuYyhhcmdzKSB7XG4gICAgY29uc3QgeyBiYWNrZW5kLCBpbnB1dHMsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW91VGhyZXNob2xkLCBtYXhPdXRwdXRTaXplLCBzY29yZVRocmVzaG9sZCwgc29mdE5tc1NpZ21hIH0gPSBhdHRycztcbiAgICBjb25zdCB7IGJveGVzLCBzY29yZXMgfSA9IGlucHV0cztcbiAgICBjb25zdCBib3hlc0lkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGJveGVzLmRhdGFJZCkuaWQ7XG4gICAgY29uc3Qgc2NvcmVzSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoc2NvcmVzLmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgcmVzT2Zmc2V0ID0gd2FzbUZ1bmMoYm94ZXNJZCwgc2NvcmVzSWQsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsIHNvZnRObXNTaWdtYSk7XG4gICAgY29uc3QgeyBwU2VsZWN0ZWRJbmRpY2VzLCBzZWxlY3RlZFNpemUsIHBTZWxlY3RlZFNjb3JlcywgcFZhbGlkT3V0cHV0cyB9ID0gcGFyc2VSZXN1bHRTdHJ1Y3QoYmFja2VuZCwgcmVzT2Zmc2V0KTtcbiAgICAvLyBTaW5jZSB3ZSBhcmUgbm90IHVzaW5nIHZhbGlkT3V0cHV0cyBmb3IgVjUsIHdlIGhhdmUgdG8gZGVsZXRlIGl0IGZyb20gdGhlXG4gICAgLy8gaGVhcC5cbiAgICBiYWNrZW5kLndhc20uX2ZyZWUocFZhbGlkT3V0cHV0cyk7XG4gICAgY29uc3Qgc2VsZWN0ZWRJbmRpY2VzVGVuc29yID0gYmFja2VuZC5tYWtlT3V0cHV0KFtzZWxlY3RlZFNpemVdLCAnaW50MzInLCBwU2VsZWN0ZWRJbmRpY2VzKTtcbiAgICBjb25zdCBzZWxlY3RlZFNjb3Jlc1RlbnNvciA9IGJhY2tlbmQubWFrZU91dHB1dChbc2VsZWN0ZWRTaXplXSwgJ2Zsb2F0MzInLCBwU2VsZWN0ZWRTY29yZXMpO1xuICAgIHJldHVybiBbc2VsZWN0ZWRJbmRpY2VzVGVuc29yLCBzZWxlY3RlZFNjb3Jlc1RlbnNvcl07XG59XG5leHBvcnQgY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25WNUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBOb25NYXhTdXBwcmVzc2lvblY1LFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiBrZXJuZWxGdW5jLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5vbk1heFN1cHByZXNzaW9uVjUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLyoqXG4gKiBQYXJzZSB0aGUgcmVzdWx0IG9mIHRoZSBjKysgbWV0aG9kLCB3aGljaCBoYXMgdGhlIHNoYXBlIGVxdWl2YWxlbnQgdG9cbiAqIGBSZXN1bHRgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VSZXN1bHRTdHJ1Y3QoYmFja2VuZCwgcmVzT2Zmc2V0KSB7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IEludDMyQXJyYXkoYmFja2VuZC53YXNtLkhFQVBVOC5idWZmZXIsIHJlc09mZnNldCwgNCk7XG4gICAgY29uc3QgcFNlbGVjdGVkSW5kaWNlcyA9IHJlc3VsdFswXTtcbiAgICBjb25zdCBzZWxlY3RlZFNpemUgPSByZXN1bHRbMV07XG4gICAgY29uc3QgcFNlbGVjdGVkU2NvcmVzID0gcmVzdWx0WzJdO1xuICAgIGNvbnN0IHBWYWxpZE91dHB1dHMgPSByZXN1bHRbM107XG4gICAgLy8gU2luY2UgdGhlIHJlc3VsdCB3YXMgYWxsb2NhdGVkIG9uIHRoZSBoZWFwLCB3ZSBoYXZlIHRvIGRlbGV0ZSBpdC5cbiAgICBiYWNrZW5kLndhc20uX2ZyZWUocmVzT2Zmc2V0KTtcbiAgICByZXR1cm4geyBwU2VsZWN0ZWRJbmRpY2VzLCBzZWxlY3RlZFNpemUsIHBTZWxlY3RlZFNjb3JlcywgcFZhbGlkT3V0cHV0cyB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Tm9uTWF4U3VwcHJlc3Npb25fdXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBOb3RFcXVhbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVCaW5hcnlLZXJuZWxDb25maWcgfSBmcm9tICcuL2JpbmFyeV9rZXJuZWwnO1xuY29uc3Qgc3VwcG9ydHNGdWxsQnJvYWRjYXN0ID0gZmFsc2U7XG5leHBvcnQgY29uc3Qgbm90RXF1YWxDb25maWcgPSBjcmVhdGVCaW5hcnlLZXJuZWxDb25maWcoTm90RXF1YWwsIHN1cHBvcnRzRnVsbEJyb2FkY2FzdCwgJ2Jvb2wnKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5vdEVxdWFsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IE9uZUhvdCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5sZXQgd2FzbU9uZUhvdDtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtT25lSG90ID0gYmFja2VuZC53YXNtLmN3cmFwKE9uZUhvdCwgbnVsbCAvKiB2b2lkICovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyAvLyBvdXRfaWRcbiAgICBdKTtcbn1cbmZ1bmN0aW9uIG9uZUhvdChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW5kaWNlcyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgZGVwdGgsIG9uVmFsdWUsIG9mZlZhbHVlIH0gPSBhdHRycztcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoWy4uLmluZGljZXMuc2hhcGUsIGRlcHRoXSwgJ2ludDMyJyk7XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgaW5kaWNlc0RhdGEgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoaW5kaWNlcy5kYXRhSWQpO1xuICAgIGNvbnN0IGluZGljZXNJZCA9IGluZGljZXNEYXRhLmlkO1xuICAgIHdhc21PbmVIb3QoaW5kaWNlc0lkLCBkZXB0aCwgb25WYWx1ZSwgb2ZmVmFsdWUsIG91dElkKTtcbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IG9uZUhvdENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBPbmVIb3QsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IG9uZUhvdCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1PbmVIb3QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgT25lc0xpa2UgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZnVuY3Rpb24gb25lc0xpa2UoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoeC5zaGFwZSwgeC5kdHlwZSk7XG4gICAgY29uc3Qgb3V0VmFscyA9IGJhY2tlbmQudHlwZWRBcnJheUZyb21IZWFwKG91dCk7XG4gICAgb3V0VmFscy5maWxsKDEpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3Qgb25lc0xpa2VDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogT25lc0xpa2UsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBrZXJuZWxGdW5jOiBvbmVzTGlrZSxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1PbmVzTGlrZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBQYWNrLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNvbmNhdCB9IGZyb20gJy4vQ29uY2F0JztcbmltcG9ydCB7IGV4cGFuZERpbXMgfSBmcm9tICcuL0V4cGFuZERpbXMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhY2soYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGF4aXMgfSA9IGF0dHJzO1xuICAgIGlmIChpbnB1dHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiBleHBhbmREaW1zKHsgaW5wdXRzOiB7IGlucHV0OiBpbnB1dHNbMF0gfSwgYmFja2VuZCwgYXR0cnM6IHsgZGltOiBheGlzIH0gfSk7XG4gICAgfVxuICAgIGNvbnN0IHNoYXBlID0gaW5wdXRzWzBdLnNoYXBlO1xuICAgIGNvbnN0IGR0eXBlID0gaW5wdXRzWzBdLmR0eXBlO1xuICAgIGlucHV0cy5mb3JFYWNoKHQgPT4ge1xuICAgICAgICB1dGlsLmFzc2VydFNoYXBlc01hdGNoKHNoYXBlLCB0LnNoYXBlLCAnQWxsIHRlbnNvcnMgcGFzc2VkIHRvIHN0YWNrIG11c3QgaGF2ZSBtYXRjaGluZyBzaGFwZXMnKTtcbiAgICAgICAgdXRpbC5hc3NlcnQoZHR5cGUgPT09IHQuZHR5cGUsICgpID0+ICdBbGwgdGVuc29ycyBwYXNzZWQgdG8gc3RhY2sgbXVzdCBoYXZlIG1hdGNoaW5nIGR0eXBlcycpO1xuICAgIH0pO1xuICAgIGNvbnN0IGludGVybWVkaWF0ZVRlbnNvckluZm9zID0gW107XG4gICAgY29uc3QgZXhwYW5kZWRUZW5zb3JzID0gaW5wdXRzLm1hcCh0ID0+IHtcbiAgICAgICAgY29uc3QgZXhwYW5kZWRUID0gZXhwYW5kRGltcyh7IGlucHV0czogeyBpbnB1dDogdCB9LCBiYWNrZW5kLCBhdHRyczogeyBkaW06IGF4aXMgfSB9KTtcbiAgICAgICAgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MucHVzaChleHBhbmRlZFQpO1xuICAgICAgICByZXR1cm4gZXhwYW5kZWRUO1xuICAgIH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGNvbmNhdCh7IGlucHV0czogZXhwYW5kZWRUZW5zb3JzLCBiYWNrZW5kLCBhdHRyczogeyBheGlzIH0gfSk7XG4gICAgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZURhdGEodC5kYXRhSWQpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGNvbnN0IHBhY2tDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUGFjayxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIGtlcm5lbEZ1bmM6IHBhY2tcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QYWNrLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFBhZFYyIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IENwcERUeXBlIH0gZnJvbSAnLi90eXBlcyc7XG5sZXQgd2FzbVBhZFYyO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21QYWRWMiA9IGJhY2tlbmQud2FzbS5jd3JhcChQYWRWMiwgbnVsbCAvKiB2b2lkICovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICBdKTtcbn1cbmZ1bmN0aW9uIHBhZChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kLCBhdHRyczogeyBwYWRkaW5ncywgY29uc3RhbnRWYWx1ZSB9IH0gPSBhcmdzO1xuICAgIGNvbnN0IG91dFNoYXBlID0gcGFkZGluZ3MubWFwKChwLCBpKSA9PiBwWzBdIC8qIGJlZm9yZVBhZCAqLyArIHguc2hhcGVbaV0gKyBwWzFdIC8qIGFmdGVyUGFkICovKTtcbiAgICBjb25zdCB4SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChvdXRTaGFwZSwgeC5kdHlwZSk7XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgeFNoYXBlQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheSh4LnNoYXBlKS5idWZmZXIpO1xuICAgIGNvbnN0IHByZVBhZGRpbmdzRmxhdCA9IHBhZGRpbmdzLm1hcChwYWRUdXBsZSA9PiBwYWRUdXBsZVswXSk7XG4gICAgY29uc3QgcG9zdFBhZGRpbmdzRmxhdCA9IHBhZGRpbmdzLm1hcChwYWRUdXBsZSA9PiBwYWRUdXBsZVsxXSk7XG4gICAgY29uc3QgcHJlUGFkZGluZ3NCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KHByZVBhZGRpbmdzRmxhdCkuYnVmZmVyKTtcbiAgICBjb25zdCBwb3N0UGFkZGluZ3NCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KHBvc3RQYWRkaW5nc0ZsYXQpLmJ1ZmZlcik7XG4gICAgd2FzbVBhZFYyKHhJZCwgeFNoYXBlQnl0ZXMsIHguc2hhcGUubGVuZ3RoLCBDcHBEVHlwZVt4LmR0eXBlXSwgcHJlUGFkZGluZ3NCeXRlcywgcG9zdFBhZGRpbmdzQnl0ZXMsIGNvbnN0YW50VmFsdWUsIG91dElkKTtcbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IHBhZFYyQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFBhZFYyLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAga2VybmVsRnVuYzogcGFkLFxuICAgIHNldHVwRnVuYzogc2V0dXBcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QYWRWMi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBQb3cgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi9iaW5hcnlfa2VybmVsJztcbmNvbnN0IHN1cHBvcnRzRnVsbEJyb2FkY2FzdCA9IGZhbHNlO1xuZXhwb3J0IGNvbnN0IHBvd0NvbmZpZyA9IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyhQb3csIHN1cHBvcnRzRnVsbEJyb2FkY2FzdCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Qb3cuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUHJlbHUgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xubGV0IHdhc21QcmVsdTtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtUHJlbHUgPSBiYWNrZW5kLndhc20uY3dyYXAoUHJlbHUsIG51bGwgLyogdm9pZCAqLywgW1xuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInIC8vIG91dF9pZFxuICAgIF0pO1xufVxuZnVuY3Rpb24gcHJlbHUoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCwgYWxwaGEgfSA9IGlucHV0cztcbiAgICBjb25zdCB4SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IHdlaWdodHNJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChhbHBoYS5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dCh4LnNoYXBlLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIHdhc21QcmVsdSh4SWQsIHdlaWdodHNJZCwgb3V0SWQpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgcHJlbHVDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUHJlbHUsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IHByZWx1XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHJlbHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBQcm9kLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHBlcm11dGVBeGVzQW5kVHJhbnNwb3NlIH0gZnJvbSAnLi9rZXJuZWxfdXRpbHMnO1xuaW1wb3J0IHsgQ3BwRFR5cGUgfSBmcm9tICcuL3R5cGVzJztcbmxldCB3YXNtUHJvZDtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtUHJvZCA9IGJhY2tlbmQud2FzbS5jd3JhcChQcm9kLCBudWxsIC8qdm9pZCovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInXG4gICAgXSk7XG59XG5mdW5jdGlvbiBwcm9kKGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGlucHV0cywgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBheGlzLCBrZWVwRGltcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHguZGF0YUlkKS5pZDtcbiAgICBsZXQgaW5wdXRJZCA9IHhJZDtcbiAgICBsZXQgaW5wdXQgPSB4O1xuICAgIGNvbnN0IHsgdHJhbnNwb3NlZCwgYXhlcywgb3JpZ2luYWxBeGVzLCBpbnB1dFdhc1RyYW5zcG9zZWQgfSA9IHBlcm11dGVBeGVzQW5kVHJhbnNwb3NlKHgsIGF4aXMsIGJhY2tlbmQpO1xuICAgIGxldCByZWR1Y3Rpb25BeGVzID0gYXhlcztcbiAgICBpZiAoaW5wdXRXYXNUcmFuc3Bvc2VkKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zcG9zZWRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh0cmFuc3Bvc2VkLmRhdGFJZCkuaWQ7XG4gICAgICAgIGlmICh0cmFuc3Bvc2VkSWQgIT09IHhJZCkge1xuICAgICAgICAgICAgLy8gdHJhbnNwb3NlIHdhcyBub3QgYSBuby1vcC4gV2Ugd2lsbCBuZWVkIHRvIGRpc3Bvc2Ugb2YgdGhpc1xuICAgICAgICAgICAgLy8gb25jZSB3ZSBhcmUgZG9uZS5cbiAgICAgICAgICAgIGlucHV0ID0gdHJhbnNwb3NlZDtcbiAgICAgICAgICAgIGlucHV0SWQgPSB0cmFuc3Bvc2VkSWQ7XG4gICAgICAgICAgICByZWR1Y3Rpb25BeGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMocmVkdWN0aW9uQXhlcy5sZW5ndGgsIGlucHV0LnNoYXBlLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdwcm9kJywgcmVkdWN0aW9uQXhlcywgaW5wdXQuc2hhcGUubGVuZ3RoKTtcbiAgICBjb25zdCBbb3V0U2hhcGUsIHJlZHVjZVNoYXBlXSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKGlucHV0LnNoYXBlLCByZWR1Y3Rpb25BeGVzKTtcbiAgICBjb25zdCByZWR1Y2VTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQob3V0U2hhcGUsIGlucHV0LmR0eXBlKTtcbiAgICBpZiAodXRpbC5zaXplRnJvbVNoYXBlKGlucHV0LnNoYXBlKSAhPT0gMCkge1xuICAgICAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICAgICAgd2FzbVByb2QoaW5wdXRJZCwgcmVkdWNlU2l6ZSwgQ3BwRFR5cGVbb3V0LmR0eXBlXSwgb3V0SWQpO1xuICAgIH1cbiAgICBpZiAoaW5wdXRXYXNUcmFuc3Bvc2VkKSB7XG4gICAgICAgIC8vIGRpc3Bvc2Ugb2YgdGhlIHRyYW5zcG9zZWQgdGVuc29yLlxuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VEYXRhKHRyYW5zcG9zZWQuZGF0YUlkKTtcbiAgICB9XG4gICAgaWYgKGtlZXBEaW1zKSB7XG4gICAgICAgIC8vIHJlc2hhcGVcbiAgICAgICAgY29uc3QgbmV3U2hhcGUgPSBiYWNrZW5kX3V0aWwuZXhwYW5kU2hhcGVUb0tlZXBEaW0ob3V0LnNoYXBlLCBvcmlnaW5hbEF4ZXMpO1xuICAgICAgICBvdXQuc2hhcGUgPSBuZXdTaGFwZTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBwcm9kQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFByb2QsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IHByb2Rcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Qcm9kLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFJhbmdlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHJhbmdlSW1wbENQVSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuZXhwb3J0IGNvbnN0IHJhbmdlID0gKGFyZ3MpID0+IHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgc3RhcnQsIHN0b3AsIHN0ZXAsIGR0eXBlIH0gPSBhdHRycztcbiAgICBjb25zdCB2YWx1ZXMgPSByYW5nZUltcGxDUFUoc3RhcnQsIHN0b3AsIHN0ZXAsIGR0eXBlKTtcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoW3ZhbHVlcy5sZW5ndGhdLCBkdHlwZSk7XG4gICAgY29uc3Qgb3V0VmFscyA9IGJhY2tlbmQudHlwZWRBcnJheUZyb21IZWFwKG91dCk7XG4gICAgb3V0VmFscy5zZXQodmFsdWVzKTtcbiAgICByZXR1cm4gb3V0O1xufTtcbmV4cG9ydCBjb25zdCByYW5nZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBSYW5nZSxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIGtlcm5lbEZ1bmM6IHJhbmdlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmFuZ2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUmVhbERpdiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVCaW5hcnlLZXJuZWxDb25maWcgfSBmcm9tICcuL2JpbmFyeV9rZXJuZWwnO1xuY29uc3Qgc3VwcG9ydHNGdWxsQnJvYWRjYXN0ID0gdHJ1ZTtcbmV4cG9ydCBjb25zdCByZWFsRGl2Q29uZmlnID0gY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnKFJlYWxEaXYsIHN1cHBvcnRzRnVsbEJyb2FkY2FzdCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWFsRGl2LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFJlbHUgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlVW5hcnlLZXJuZWxDb25maWcgfSBmcm9tICcuL3VuYXJ5X2tlcm5lbCc7XG5leHBvcnQgY29uc3QgcmVsdUNvbmZpZyA9IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnKFJlbHUpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVsdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBSZWx1NiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVVbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vdW5hcnlfa2VybmVsJztcbmV4cG9ydCBjb25zdCByZWx1NkNvbmZpZyA9IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnKFJlbHU2KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlbHU2LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFJlc2hhcGUsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2hhcGUoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHNoYXBlIH0gPSBhdHRycztcbiAgICBjb25zdCB4U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSh4LnNoYXBlKTtcbiAgICBjb25zdCAkc2hhcGUgPSB1dGlsLmluZmVyRnJvbUltcGxpY2l0U2hhcGUoc2hhcGUsIHhTaXplKTtcbiAgICB1dGlsLmFzc2VydCh4U2l6ZSA9PT0gdXRpbC5zaXplRnJvbVNoYXBlKCRzaGFwZSksICgpID0+IGBuZXcgc2hhcGU6ICR7JHNoYXBlfSwgb2xkIHNoYXBlOiAke3guc2hhcGV9LiBOZXcgc2hhcGUgYW5kIG9sZCBgICtcbiAgICAgICAgYHNoYXBlIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMuYCk7XG4gICAgLy8gQmFja2VuZCBuZWVkcyB0byB0cmFjayByZWZDb3VudCBmb3IgdGhlIGRhdGFJZCBmb3IgcmVzaGFwZSBvcFxuICAgIGFyZ3MuYmFja2VuZC5pbmNSZWYoeC5kYXRhSWQpO1xuICAgIHJldHVybiB7IGRhdGFJZDogeC5kYXRhSWQsIHNoYXBlOiAkc2hhcGUsIGR0eXBlOiB4LmR0eXBlIH07XG59XG5leHBvcnQgY29uc3QgcmVzaGFwZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBSZXNoYXBlLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAga2VybmVsRnVuYzogcmVzaGFwZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlc2hhcGUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUmVzaXplQmlsaW5lYXIsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY2FzdCB9IGZyb20gJy4vQ2FzdCc7XG5sZXQgd2FzbVJlc2l6ZUJpbGluZWFyO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21SZXNpemVCaWxpbmVhciA9IGJhY2tlbmQud2FzbS5jd3JhcChSZXNpemVCaWxpbmVhciwgbnVsbCAvKnZvaWQqLywgW1xuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyAvLyBvdXRJZFxuICAgIF0pO1xufVxuZnVuY3Rpb24gcmVzaXplQmlsaW5lYXIoYXJncykge1xuICAgIGNvbnN0IHsgYmFja2VuZCwgaW5wdXRzLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGltYWdlcyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYWxpZ25Db3JuZXJzLCBoYWxmUGl4ZWxDZW50ZXJzLCBzaXplIH0gPSBhdHRycztcbiAgICBjb25zdCBbbmV3SGVpZ2h0LCBuZXdXaWR0aF0gPSBzaXplO1xuICAgIGNvbnN0IFtiYXRjaCwgb2xkSGVpZ2h0LCBvbGRXaWR0aCwgbnVtQ2hhbm5lbHNdID0gaW1hZ2VzLnNoYXBlO1xuICAgIGNvbnN0IG91dFNoYXBlID0gW2JhdGNoLCBuZXdIZWlnaHQsIG5ld1dpZHRoLCBudW1DaGFubmVsc107XG4gICAgbGV0IHhEYXRhID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGltYWdlcy5kYXRhSWQpO1xuICAgIGxldCBjYXN0ZWREYXRhO1xuICAgIGlmICh4RGF0YS5kdHlwZSAhPT0gJ2Zsb2F0MzInKSB7XG4gICAgICAgIGNhc3RlZERhdGEgPVxuICAgICAgICAgICAgY2FzdCh7IGJhY2tlbmQsIGlucHV0czogeyB4OiBpbWFnZXMgfSwgYXR0cnM6IHsgZHR5cGU6ICdmbG9hdDMyJyB9IH0pO1xuICAgICAgICB4RGF0YSA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChjYXN0ZWREYXRhLmRhdGFJZCk7XG4gICAgfVxuICAgIGNvbnN0IHhJZCA9IHhEYXRhLmlkO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChvdXRTaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICBpZiAodXRpbC5zaXplRnJvbVNoYXBlKGltYWdlcy5zaGFwZSkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgd2FzbVJlc2l6ZUJpbGluZWFyKHhJZCwgYmF0Y2gsIG9sZEhlaWdodCwgb2xkV2lkdGgsIG51bUNoYW5uZWxzLCBuZXdIZWlnaHQsIG5ld1dpZHRoLCBhbGlnbkNvcm5lcnMgPyAxIDogMCwgaGFsZlBpeGVsQ2VudGVycyA/IDEgOiAwLCBvdXRJZCk7XG4gICAgaWYgKGNhc3RlZERhdGEgIT0gbnVsbCkge1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VEYXRhKGNhc3RlZERhdGEuZGF0YUlkKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCByZXNpemVCaWxpbmVhckNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBSZXNpemVCaWxpbmVhcixcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogcmVzaXplQmlsaW5lYXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZXNpemVCaWxpbmVhci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBSZXZlcnNlLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGlkZW50aXR5IH0gZnJvbSAnLi9JZGVudGl0eSc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmxldCB3YXNtUmV2ZXJzZTtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtUmV2ZXJzZSA9IGJhY2tlbmQud2FzbS5jd3JhcChSZXZlcnNlLCBudWxsLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInIC8vIG91dF9pZFxuICAgIF0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJldmVyc2UoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGRpbXMgfSA9IGF0dHJzO1xuICAgIGNvbnN0IGF4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGRpbXMsIHguc2hhcGUpO1xuICAgIGlmICh4LnNoYXBlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gaWRlbnRpdHkoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kIH0pO1xuICAgIH1cbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoeC5zaGFwZSwgeC5kdHlwZSk7XG4gICAgY29uc3QgeElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHguZGF0YUlkKS5pZDtcbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBheGVzQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheShheGVzKS5idWZmZXIpO1xuICAgIGNvbnN0IG91dFNoYXBlQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheSh4LnNoYXBlKS5idWZmZXIpO1xuICAgIHdhc21SZXZlcnNlKHhJZCwgYXhlc0J5dGVzLCBheGVzLmxlbmd0aCwgb3V0U2hhcGVCeXRlcywgeC5zaGFwZS5sZW5ndGgsIG91dElkKTtcbiAgICBjb25zdCByZXNoYXBlZCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogb3V0IH0sIGF0dHJzOiB7IHNoYXBlOiB4LnNoYXBlIH0sIGJhY2tlbmQgfSk7XG4gICAgYmFja2VuZC5kaXNwb3NlRGF0YShvdXQuZGF0YUlkKTtcbiAgICByZXR1cm4gcmVzaGFwZWQ7XG59XG5leHBvcnQgY29uc3QgcmV2ZXJzZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBSZXZlcnNlLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAga2VybmVsRnVuYzogcmV2ZXJzZSxcbiAgICBzZXR1cEZ1bmM6IHNldHVwXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmV2ZXJzZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBSb3RhdGVXaXRoT2Zmc2V0IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGJhY2tlbmRfdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5sZXQgd2FzbVJvdGF0ZTtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtUm90YXRlID0gYmFja2VuZC53YXNtLmN3cmFwKFJvdGF0ZVdpdGhPZmZzZXQsIG51bGwgLyogdm9pZCAqLywgW1xuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICBdKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVXaXRoT2Zmc2V0KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBpbWFnZSB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgcmFkaWFucywgZmlsbFZhbHVlLCBjZW50ZXIgfSA9IGF0dHJzO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChpbWFnZS5zaGFwZSwgaW1hZ2UuZHR5cGUpO1xuICAgIGNvbnN0IGltYWdlSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoaW1hZ2UuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBbYmF0Y2gsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBudW1DaGFubmVsc10gPSBpbWFnZS5zaGFwZTtcbiAgICBjb25zdCBbY2VudGVyWCwgY2VudGVyWV0gPSBiYWNrZW5kX3V0aWwuZ2V0SW1hZ2VDZW50ZXIoY2VudGVyLCBpbWFnZUhlaWdodCwgaW1hZ2VXaWR0aCk7XG4gICAgY29uc3QgZmlsbElzQmxhY2sgPSBmaWxsVmFsdWUgPT09IDA7XG4gICAgY29uc3QgZnVsbE9wYWNpdHlWYWx1ZSA9IDI1NTtcbiAgICBjb25zdCBmaWxsVmFsdWVzID0gdHlwZW9mIGZpbGxWYWx1ZSA9PT0gJ251bWJlcicgP1xuICAgICAgICBbZmlsbFZhbHVlLCBmaWxsVmFsdWUsIGZpbGxWYWx1ZSwgZmlsbElzQmxhY2sgPyAwIDogZnVsbE9wYWNpdHlWYWx1ZV0gOlxuICAgICAgICBbLi4uZmlsbFZhbHVlLCBmdWxsT3BhY2l0eVZhbHVlXTtcbiAgICBjb25zdCBmaWxsQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheShmaWxsVmFsdWVzKS5idWZmZXIpO1xuICAgIHdhc21Sb3RhdGUoaW1hZ2VJZCwgYmF0Y2gsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBudW1DaGFubmVscywgcmFkaWFucywgY2VudGVyWCwgY2VudGVyWSwgZmlsbEJ5dGVzLCBmaWxsVmFsdWVzLmxlbmd0aCwgb3V0SWQpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3Qgcm90YXRlV2l0aE9mZnNldENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBSb3RhdGVXaXRoT2Zmc2V0LFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAga2VybmVsRnVuYzogcm90YXRlV2l0aE9mZnNldCxcbiAgICBzZXR1cEZ1bmM6IHNldHVwXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Um90YXRlV2l0aE9mZnNldC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBSb3VuZCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVVbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vdW5hcnlfa2VybmVsJztcbmV4cG9ydCBjb25zdCByb3VuZENvbmZpZyA9IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnKFJvdW5kKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJvdW5kLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFJzcXJ0IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi91bmFyeV9rZXJuZWwnO1xuZXhwb3J0IGNvbnN0IHJzcXJ0Q29uZmlnID0gY3JlYXRlVW5hcnlLZXJuZWxDb25maWcoUnNxcnQpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UnNxcnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgc2NhdHRlcl91dGlsLCBTY2F0dGVyTmQsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgQ3BwRFR5cGUgfSBmcm9tICcuL3R5cGVzJztcbmxldCB3YXNtU2NhdHRlck5kO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21TY2F0dGVyTmQgPSBiYWNrZW5kLndhc20uY3dyYXAoU2NhdHRlck5kLCBudWxsIC8qdm9pZCovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyAvLyBvdXRJZFxuICAgIF0pO1xufVxuZnVuY3Rpb24gc2NhdHRlck5kKGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGlucHV0cywgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBpbmRpY2VzLCB1cGRhdGVzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBzaGFwZSB9ID0gYXR0cnM7XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KHNoYXBlLCB1cGRhdGVzLmR0eXBlKTtcbiAgICBpZiAodXRpbC5zaXplRnJvbVNoYXBlKHNoYXBlKSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cbiAgICBjb25zdCB7IHNsaWNlUmFuaywgbnVtVXBkYXRlcywgc2xpY2VTaXplLCBzdHJpZGVzLCBvdXRwdXRTaXplIH0gPSBzY2F0dGVyX3V0aWwuY2FsY3VsYXRlU2hhcGVzKHVwZGF0ZXMsIGluZGljZXMsIHNoYXBlKTtcbiAgICBjb25zdCBpbmRpY2VzRGF0YSA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChpbmRpY2VzLmRhdGFJZCk7XG4gICAgY29uc3QgaW5kaWNlc0lkID0gaW5kaWNlc0RhdGEuaWQ7XG4gICAgY29uc3QgdXBkYXRlc0RhdGEgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQodXBkYXRlcy5kYXRhSWQpO1xuICAgIGNvbnN0IHVwZGF0ZXNJZCA9IHVwZGF0ZXNEYXRhLmlkO1xuICAgIGNvbnN0IHN0cmlkZXNCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KHN0cmlkZXMpLmJ1ZmZlcik7XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgd2FzbVNjYXR0ZXJOZChpbmRpY2VzSWQsIHVwZGF0ZXNJZCwgQ3BwRFR5cGVbdXBkYXRlcy5kdHlwZV0sIHNsaWNlUmFuaywgbnVtVXBkYXRlcywgc2xpY2VTaXplLCBzdHJpZGVzQnl0ZXMsIG91dHB1dFNpemUsIG91dElkKTtcbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IHNjYXR0ZXJOZENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTY2F0dGVyTmQsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IHNjYXR0ZXJOZFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNjYXR0ZXJOZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTZWxlY3QsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xubGV0IHdhc21TZWxlY3Q7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbVNlbGVjdCA9IGJhY2tlbmQud2FzbS5jd3JhcCgnU2VsZWN0VjInLCBudWxsLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICBdKTtcbn1cbmZ1bmN0aW9uIHNlbGVjdChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBjb25kaXRpb24sIHQsIGUgfSA9IGlucHV0cztcbiAgICBjb25zdCBjb25kaXRpb25JZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChjb25kaXRpb24uZGF0YUlkKS5pZDtcbiAgICBjb25zdCB0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQodC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IGVJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChlLmRhdGFJZCkuaWQ7XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KHQuc2hhcGUsIHQuZHR5cGUpO1xuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IGNSYW5rID0gY29uZGl0aW9uLnNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCB0UmFuayA9IHQuc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IG9mZnNldCA9IGNSYW5rID09PSAwIHx8IGNSYW5rID4gMSB8fCB0UmFuayA9PT0gMSA/XG4gICAgICAgIDEgOlxuICAgICAgICB1dGlsLnNpemVGcm9tU2hhcGUodC5zaGFwZS5zbGljZSgxKSk7XG4gICAgd2FzbVNlbGVjdChjb25kaXRpb25JZCwgdElkLCBlSWQsIG9mZnNldCwgb3V0SWQpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3Qgc2VsZWN0Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNlbGVjdCxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIGtlcm5lbEZ1bmM6IHNlbGVjdCxcbiAgICBzZXR1cEZ1bmM6IHNldHVwXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2VsZWN0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFNpZ21vaWQsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xubGV0IHdhc21GdW5jO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21GdW5jID0gYmFja2VuZC53YXNtLmN3cmFwKFNpZ21vaWQsIG51bGwgLyogdm9pZCAqLywgWydudW1iZXInLCAnbnVtYmVyJ10pO1xufVxuZnVuY3Rpb24gc2lnbW9pZChhcmdzKSB7XG4gICAgY29uc3QgeyBiYWNrZW5kLCBpbnB1dHM6IHsgeCB9IH0gPSBhcmdzO1xuICAgIGNvbnN0IHhJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh4LmRhdGFJZCkuaWQ7XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KHguc2hhcGUsIHguZHR5cGUpO1xuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIC8vIFNob3J0LWNpcmN1aXQgemVyby1zaXplZCB0ZW5zb3JzLlxuICAgIGlmICh1dGlsLnNpemVGcm9tU2hhcGUob3V0LnNoYXBlKSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cbiAgICB3YXNtRnVuYyh4SWQsIG91dElkKTtcbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IHNpZ21vaWRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogJ1NpZ21vaWQnLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiBzaWdtb2lkXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2lnbW9pZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTaW4gfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlVW5hcnlLZXJuZWxDb25maWcgfSBmcm9tICcuL3VuYXJ5X2tlcm5lbCc7XG5leHBvcnQgY29uc3Qgc2luQ29uZmlnID0gY3JlYXRlVW5hcnlLZXJuZWxDb25maWcoU2luKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNpbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTbGljZSwgc2xpY2VfdXRpbCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBzbGljZUltcGxDUFUgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmV4cG9ydCBmdW5jdGlvbiBzbGljZShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHM6IHsgeCB9LCBhdHRyczogeyBiZWdpbiwgc2l6ZSB9LCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IFtiZWdpbl8sIHNpemVfXSA9IHNsaWNlX3V0aWwucGFyc2VTbGljZVBhcmFtcyh4LCBiZWdpbiwgc2l6ZSk7XG4gICAgY29uc3QgaXNDb250aW5vdXMgPSBzbGljZV91dGlsLmlzU2xpY2VDb250aW5vdXMoeC5zaGFwZSwgYmVnaW5fLCBzaXplXyk7XG4gICAgY29uc3QgeFZhbHMgPSBiYWNrZW5kLnJlYWRTeW5jKHguZGF0YUlkKTtcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoc2l6ZV8sIHguZHR5cGUpO1xuICAgIGNvbnN0IHhTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyh4LnNoYXBlKTtcbiAgICBjb25zdCBvdXREYXRhID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpO1xuICAgIGlmIChpc0NvbnRpbm91cykge1xuICAgICAgICBjb25zdCBmbGF0T2Zmc2V0ID0gc2xpY2VfdXRpbC5jb21wdXRlRmxhdE9mZnNldChiZWdpbl8sIHhTdHJpZGVzKTtcbiAgICAgICAgaWYgKHguZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBvdXREYXRhLnN0cmluZ0J5dGVzID1cbiAgICAgICAgICAgICAgICB4VmFsc1xuICAgICAgICAgICAgICAgICAgICAuc2xpY2UoZmxhdE9mZnNldCwgZmxhdE9mZnNldCArIHV0aWwuc2l6ZUZyb21TaGFwZShzaXplXykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgb3V0VmFscyA9IGJhY2tlbmQudHlwZWRBcnJheUZyb21IZWFwKG91dCk7XG4gICAgICAgICAgICBvdXRWYWxzLnNldCh4VmFsc1xuICAgICAgICAgICAgICAgIC5zdWJhcnJheShmbGF0T2Zmc2V0LCBmbGF0T2Zmc2V0ICsgdXRpbC5zaXplRnJvbVNoYXBlKHNpemVfKSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuICAgIGlmICh4LmR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCByZXMgPSBzbGljZUltcGxDUFUoeFZhbHMsIGJlZ2luXywgc2l6ZV8sIHguc2hhcGUsIHguZHR5cGUpO1xuICAgICAgICBvdXREYXRhLnN0cmluZ0J5dGVzID0gcmVzO1xuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cbiAgICBjb25zdCBvdXRWYWxzID0gYmFja2VuZC50eXBlZEFycmF5RnJvbUhlYXAob3V0KTtcbiAgICBjb25zdCByYW5rID0geC5zaGFwZS5sZW5ndGg7XG4gICAgaWYgKHJhbmsgPT09IDIpIHtcbiAgICAgICAgc2xpY2UyZCh4VmFscywgeFN0cmlkZXNbMF0sIG91dFZhbHMsIGJlZ2luXywgc2l6ZV8pO1xuICAgIH1cbiAgICBlbHNlIGlmIChyYW5rID09PSAzKSB7XG4gICAgICAgIHNsaWNlM2QoeFZhbHMsIHhTdHJpZGVzWzBdLCB4U3RyaWRlc1sxXSwgb3V0VmFscywgYmVnaW5fLCBzaXplXyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHJhbmsgPT09IDQpIHtcbiAgICAgICAgc2xpY2U0ZCh4VmFscywgeFN0cmlkZXNbMF0sIHhTdHJpZGVzWzFdLCB4U3RyaWRlc1syXSwgb3V0VmFscywgYmVnaW5fLCBzaXplXyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCByZXMgPSBzbGljZUltcGxDUFUoeFZhbHMsIGJlZ2luXywgc2l6ZV8sIHguc2hhcGUsIHguZHR5cGUpO1xuICAgICAgICBvdXRWYWxzLnNldChyZXMpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xufVxuZnVuY3Rpb24gc2xpY2UyZCh4VmFscywgeFN0cmlkZSwgb3V0VmFscywgYmVnaW4sIHNpemUpIHtcbiAgICBsZXQgb3V0T2Zmc2V0ID0gMDtcbiAgICBjb25zdCBiZWdpbkkgPSBiZWdpblswXTtcbiAgICBjb25zdCBiZWdpbkogPSBiZWdpblsxXTtcbiAgICBjb25zdCBlbmRJID0gYmVnaW5JICsgc2l6ZVswXTtcbiAgICBmb3IgKGxldCBpID0gYmVnaW5JOyBpIDwgZW5kSTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHhPZmZzZXQgPSBpICogeFN0cmlkZSArIGJlZ2luSjtcbiAgICAgICAgb3V0VmFscy5zZXQoeFZhbHMuc3ViYXJyYXkoeE9mZnNldCwgeE9mZnNldCArIHNpemVbMV0pLCBvdXRPZmZzZXQpO1xuICAgICAgICBvdXRPZmZzZXQgKz0gc2l6ZVsxXTtcbiAgICB9XG59XG5mdW5jdGlvbiBzbGljZTNkKHhWYWxzLCB4U3RyaWRlMSwgeFN0cmlkZTIsIG91dFZhbHMsIGJlZ2luLCBzaXplKSB7XG4gICAgbGV0IG91dE9mZnNldCA9IDA7XG4gICAgY29uc3QgYmVnaW5JID0gYmVnaW5bMF07XG4gICAgY29uc3QgYmVnaW5KID0gYmVnaW5bMV07XG4gICAgY29uc3QgYmVnaW5LID0gYmVnaW5bMl07XG4gICAgY29uc3QgZW5kSSA9IGJlZ2luSSArIHNpemVbMF07XG4gICAgY29uc3QgZW5kSiA9IGJlZ2luSiArIHNpemVbMV07XG4gICAgZm9yIChsZXQgaSA9IGJlZ2luSTsgaSA8IGVuZEk7IGkrKykge1xuICAgICAgICBmb3IgKGxldCBqID0gYmVnaW5KOyBqIDwgZW5kSjsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCB4T2Zmc2V0ID0gaSAqIHhTdHJpZGUxICsgaiAqIHhTdHJpZGUyICsgYmVnaW5LO1xuICAgICAgICAgICAgb3V0VmFscy5zZXQoeFZhbHMuc3ViYXJyYXkoeE9mZnNldCwgeE9mZnNldCArIHNpemVbMl0pLCBvdXRPZmZzZXQpO1xuICAgICAgICAgICAgb3V0T2Zmc2V0ICs9IHNpemVbMl07XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBzbGljZTRkKHhWYWxzLCB4U3RyaWRlMSwgeFN0cmlkZTIsIHhTdHJpZGUzLCBvdXRWYWxzLCBiZWdpbiwgc2l6ZSkge1xuICAgIGxldCBvdXRPZmZzZXQgPSAwO1xuICAgIGNvbnN0IGJlZ2luSSA9IGJlZ2luWzBdO1xuICAgIGNvbnN0IGJlZ2luSiA9IGJlZ2luWzFdO1xuICAgIGNvbnN0IGJlZ2luSyA9IGJlZ2luWzJdO1xuICAgIGNvbnN0IGVuZEkgPSBiZWdpbkkgKyBzaXplWzBdO1xuICAgIGNvbnN0IGVuZEogPSBiZWdpbkogKyBzaXplWzFdO1xuICAgIGNvbnN0IGVuZEsgPSBiZWdpbksgKyBzaXplWzJdO1xuICAgIGNvbnN0IGJlZ2luTCA9IGJlZ2luWzNdO1xuICAgIGZvciAobGV0IGkgPSBiZWdpbkk7IGkgPCBlbmRJOyBpKyspIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IGJlZ2luSjsgaiA8IGVuZEo7IGorKykge1xuICAgICAgICAgICAgZm9yIChsZXQgayA9IGJlZ2luSzsgayA8IGVuZEs7IGsrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhPZmZzZXQgPSBpICogeFN0cmlkZTEgKyBqICogeFN0cmlkZTIgKyBrICogeFN0cmlkZTMgKyBiZWdpbkw7XG4gICAgICAgICAgICAgICAgb3V0VmFscy5zZXQoeFZhbHMuc3ViYXJyYXkoeE9mZnNldCwgeE9mZnNldCArIHNpemVbM10pLCBvdXRPZmZzZXQpO1xuICAgICAgICAgICAgICAgIG91dE9mZnNldCArPSBzaXplWzNdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IGNvbnN0IHNsaWNlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNsaWNlLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAga2VybmVsRnVuYzogc2xpY2UsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2xpY2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU29mdG1heCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5sZXQgd2FzbUZ1bmM7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbUZ1bmMgPSBiYWNrZW5kLndhc20uY3dyYXAoU29mdG1heCwgbnVsbCAvKiB2b2lkICovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInIC8vIGJhdGNoXG4gICAgXSk7XG59XG5mdW5jdGlvbiBzb2Z0bWF4KGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGlucHV0czogeyBsb2dpdHMgfSwgYXR0cnM6IHsgZGltIH0gfSA9IGFyZ3M7XG4gICAgY29uc3QgeElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGxvZ2l0cy5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChsb2dpdHMuc2hhcGUsIGxvZ2l0cy5kdHlwZSk7XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgY2hhbm5lbHMgPSBsb2dpdHMuc2hhcGVbZGltXTtcbiAgICBjb25zdCBiYXRjaCA9IHV0aWwuc2l6ZUZyb21TaGFwZShsb2dpdHMuc2hhcGUpIC8gY2hhbm5lbHM7XG4gICAgLy8gU2hvcnQtY2lyY3VpdCB6ZXJvLXNpemVkIHRlbnNvcnMuXG4gICAgaWYgKHV0aWwuc2l6ZUZyb21TaGFwZShvdXQuc2hhcGUpID09PSAwKSB7XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuICAgIHdhc21GdW5jKHhJZCwgb3V0SWQsIGNoYW5uZWxzLCBiYXRjaCk7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBzb2Z0bWF4Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNvZnRtYXgsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IHNvZnRtYXhcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Tb2Z0bWF4LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgU3BhY2VUb0JhdGNoTkQsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgcGFkVjJDb25maWcgfSBmcm9tICcuL1BhZFYyJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHsgdHJhbnNwb3NlIH0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuZnVuY3Rpb24gc3BhY2VUb0JhdGNoTkQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGJsb2NrU2hhcGUsIHBhZGRpbmdzIH0gPSBhdHRycztcbiAgICBjb25zdCBwcm9kID0gdXRpbC5zaXplRnJvbVNoYXBlKGJsb2NrU2hhcGUpO1xuICAgIGNvbnN0IGNvbXBsZXRlUGFkZGluZ3MgPSBbWzAsIDBdXTtcbiAgICBjb21wbGV0ZVBhZGRpbmdzLnB1c2goLi4ucGFkZGluZ3MpO1xuICAgIGZvciAobGV0IGkgPSAxICsgYmxvY2tTaGFwZS5sZW5ndGg7IGkgPCB4LnNoYXBlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbXBsZXRlUGFkZGluZ3MucHVzaChbMCwgMF0pO1xuICAgIH1cbiAgICBjb25zdCBwYWRkZWRYID0gcGFkVjJDb25maWcua2VybmVsRnVuYyh7XG4gICAgICAgIGlucHV0czogeyB4IH0sXG4gICAgICAgIGJhY2tlbmQsXG4gICAgICAgIGF0dHJzOiB7IHBhZGRpbmdzOiBjb21wbGV0ZVBhZGRpbmdzLCBjb25zdGFudFZhbHVlOiAwIH1cbiAgICB9KTtcbiAgICBjb25zdCByZXNoYXBlZFBhZGRlZFNoYXBlID0gYmFja2VuZF91dGlsLmdldFJlc2hhcGVkKHBhZGRlZFguc2hhcGUsIGJsb2NrU2hhcGUsIHByb2QsIGZhbHNlKTtcbiAgICBjb25zdCBwZXJtdXRlZFJlc2hhcGVkUGFkZGVkUGVybXV0YXRpb24gPSBiYWNrZW5kX3V0aWwuZ2V0UGVybXV0ZWQocmVzaGFwZWRQYWRkZWRTaGFwZS5sZW5ndGgsIGJsb2NrU2hhcGUubGVuZ3RoLCBmYWxzZSk7XG4gICAgY29uc3QgZmxhdHRlblNoYXBlID0gYmFja2VuZF91dGlsLmdldFJlc2hhcGVkUGVybXV0ZWQocGFkZGVkWC5zaGFwZSwgYmxvY2tTaGFwZSwgcHJvZCwgZmFsc2UpO1xuICAgIGNvbnN0IHJlc2hhcGVJbnB1dHMgPSB7IHg6IHBhZGRlZFggfTtcbiAgICBjb25zdCByZXNoYXBlQXR0cnMgPSB7IHNoYXBlOiByZXNoYXBlZFBhZGRlZFNoYXBlIH07XG4gICAgY29uc3QgcGFkZGVkWFJlc2hhcGVkID0gcmVzaGFwZSh7IGlucHV0czogcmVzaGFwZUlucHV0cywgYmFja2VuZCwgYXR0cnM6IHJlc2hhcGVBdHRycyB9KTtcbiAgICBjb25zdCB0cmFuc3Bvc2VJbnB1dHMgPSB7IHg6IHBhZGRlZFhSZXNoYXBlZCB9O1xuICAgIGNvbnN0IHRyYW5zcG9zZUF0dHJzID0geyBwZXJtOiBwZXJtdXRlZFJlc2hhcGVkUGFkZGVkUGVybXV0YXRpb24gfTtcbiAgICBjb25zdCBwYWRkZWRYVCA9IHRyYW5zcG9zZSh7IGlucHV0czogdHJhbnNwb3NlSW5wdXRzLCBiYWNrZW5kLCBhdHRyczogdHJhbnNwb3NlQXR0cnMgfSk7XG4gICAgY29uc3QgcmVzdWx0UmVzaGFwZUlucHV0cyA9IHsgeDogcGFkZGVkWFQgfTtcbiAgICBjb25zdCByZXN1bHRSZXNoYXBlQXR0cnMgPSB7IHNoYXBlOiBmbGF0dGVuU2hhcGUgfTtcbiAgICBjb25zdCByZXN1bHQgPSByZXNoYXBlKHsgaW5wdXRzOiByZXN1bHRSZXNoYXBlSW5wdXRzLCBiYWNrZW5kLCBhdHRyczogcmVzdWx0UmVzaGFwZUF0dHJzIH0pO1xuICAgIGJhY2tlbmQuZGlzcG9zZURhdGEocGFkZGVkWC5kYXRhSWQpO1xuICAgIGJhY2tlbmQuZGlzcG9zZURhdGEocGFkZGVkWFJlc2hhcGVkLmRhdGFJZCk7XG4gICAgYmFja2VuZC5kaXNwb3NlRGF0YShwYWRkZWRYVC5kYXRhSWQpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgY29uc3Qgc3BhY2VUb0JhdGNoTkRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU3BhY2VUb0JhdGNoTkQsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBrZXJuZWxGdW5jOiBzcGFjZVRvQmF0Y2hORFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNwYWNlVG9CYXRjaE5ELmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFNwbGl0ViwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgc2xpY2UgfSBmcm9tICcuL1NsaWNlJztcbmV4cG9ydCBmdW5jdGlvbiBzcGxpdFYoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBhdHRycywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IG51bU9yU2l6ZVNwbGl0cywgYXhpcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgJGF4aXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpWzBdO1xuICAgIGNvbnN0IHNwbGl0U2l6ZXMgPSBiYWNrZW5kX3V0aWwucHJlcGFyZVNwbGl0U2l6ZSh4LCBudW1PclNpemVTcGxpdHMsICRheGlzKTtcbiAgICBjb25zdCBiZWdpbiA9IG5ldyBBcnJheSh4LnNoYXBlLmxlbmd0aCkuZmlsbCgwKTtcbiAgICBjb25zdCBzaXplID0geC5zaGFwZS5zbGljZSgpO1xuICAgIHJldHVybiBzcGxpdFNpemVzLm1hcChzID0+IHtcbiAgICAgICAgY29uc3QgeFNsaWNlU2l6ZSA9IFsuLi5zaXplXTtcbiAgICAgICAgeFNsaWNlU2l6ZVskYXhpc10gPSBzO1xuICAgICAgICBjb25zdCB4U2xpY2UgPSBzbGljZSh7IGlucHV0czogeyB4IH0sIGF0dHJzOiB7IGJlZ2luLCBzaXplOiB4U2xpY2VTaXplIH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIGJlZ2luWyRheGlzXSArPSBzO1xuICAgICAgICByZXR1cm4geFNsaWNlO1xuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IHNwbGl0VkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTcGxpdFYsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBrZXJuZWxGdW5jOiBzcGxpdFZcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TcGxpdFYuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3FydCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVVbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vdW5hcnlfa2VybmVsJztcbmV4cG9ydCBjb25zdCBzcXJ0Q29uZmlnID0gY3JlYXRlVW5hcnlLZXJuZWxDb25maWcoU3FydCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TcXJ0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFNxdWFyZSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVVbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vdW5hcnlfa2VybmVsJztcbmV4cG9ydCBjb25zdCBzcXVhcmVDb25maWcgPSBjcmVhdGVVbmFyeUtlcm5lbENvbmZpZyhTcXVhcmUpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3F1YXJlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFNxdWFyZWREaWZmZXJlbmNlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vYmluYXJ5X2tlcm5lbCc7XG5jb25zdCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QgPSB0cnVlO1xuZXhwb3J0IGNvbnN0IHNxdWFyZWREaWZmZXJlbmNlQ29uZmlnID0gY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnKFNxdWFyZWREaWZmZXJlbmNlLCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3F1YXJlZERpZmZlcmVuY2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3RlcCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5sZXQgd2FzbVN0ZXA7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbVN0ZXAgPSBiYWNrZW5kLndhc20uY3dyYXAoU3RlcCwgbnVsbCAvKnZvaWQqLywgW1xuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgIF0pO1xufVxuZnVuY3Rpb24gc3RlcChhcmdzKSB7XG4gICAgY29uc3QgeyBiYWNrZW5kLCBpbnB1dHMsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgYWxwaGEgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHhJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh4LmRhdGFJZCkuaWQ7XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KHguc2hhcGUsIHguZHR5cGUpO1xuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIHdhc21TdGVwKHhJZCwgYWxwaGEsIG91dElkKTtcbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IHN0ZXBDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU3RlcCxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogc3RlcFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN0ZXAuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBTdHJpZGVkU2xpY2UsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQgeyBzbGljZSB9IGZyb20gJy4vU2xpY2UnO1xubGV0IHdhc21TdHJpZGVkU2xpY2U7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbVN0cmlkZWRTbGljZSA9IGJhY2tlbmQud2FzbS5jd3JhcChTdHJpZGVkU2xpY2UsIG51bGwgLyp2b2lkKi8sIFtcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgXSk7XG59XG5leHBvcnQgZnVuY3Rpb24gc3RyaWRlZFNsaWNlKGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGlucHV0cywgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgbGV0IHsgYmVnaW4sIGVuZCwgc3RyaWRlcyB9ID0gYXR0cnM7XG4gICAgaWYgKHN0cmlkZXMgPT0gbnVsbCkge1xuICAgICAgICBzdHJpZGVzID0gbmV3IEFycmF5KGJlZ2luLmxlbmd0aCk7XG4gICAgfVxuICAgIGNvbnN0IHsgYmVnaW5NYXNrLCBlbmRNYXNrLCBlbGxpcHNpc01hc2ssIG5ld0F4aXNNYXNrLCBzaHJpbmtBeGlzTWFzayB9ID0gYXR0cnM7XG4gICAgY29uc3QgZWxsaXBzaXNBeGVzID0gYmFja2VuZF91dGlsLnNsaWNlX3V0aWwubWFza1RvQXhlcyhlbGxpcHNpc01hc2spO1xuICAgIGlmIChlbGxpcHNpc0F4ZXMubGVuZ3RoID4gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ011bHRpcGxlIGVsbGlwc2VzIGluIHNsaWNlIGlzIG5vdCBhbGxvd2VkLicpO1xuICAgIH1cbiAgICBpZiAoZWxsaXBzaXNNYXNrICE9PSAwICYmIG5ld0F4aXNNYXNrICE9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVXNpbmcgYm90aCBlbGxpcHNpc01hc2sgYW5kIG5ld0F4aXNNYXNrIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLicpO1xuICAgIH1cbiAgICBpZiAoZWxsaXBzaXNNYXNrICE9PSAwICYmIHNocmlua0F4aXNNYXNrICE9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVXNpbmcgYm90aCBlbGxpcHNpc01hc2sgYW5kIHNocmlua0F4aXNNYXNrIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLicpO1xuICAgIH1cbiAgICBjb25zdCBudW1JbnRlcnBvbGF0ZWRBeGVzID0geC5zaGFwZS5sZW5ndGggLSBiZWdpbi5sZW5ndGg7XG4gICAgLy8gRXhwYW5kIHRoZSBkaW1zIG9mIHggYmFzZWQgb24gdGhlIG5ld0F4aXNNYXNrLlxuICAgIGNvbnN0IGV4cGFuZEF4ZXMgPSBiYWNrZW5kX3V0aWwuc2xpY2VfdXRpbC5tYXNrVG9BeGVzKG5ld0F4aXNNYXNrKTtcbiAgICBjb25zdCBuZXdTaGFwZSA9IHguc2hhcGUuc2xpY2UoKTtcbiAgICBleHBhbmRBeGVzLmZvckVhY2goYXhpcyA9PiB7XG4gICAgICAgIGJlZ2luW2F4aXNdID0gMDtcbiAgICAgICAgZW5kW2F4aXNdID0gMTtcbiAgICAgICAgbmV3U2hhcGUuc3BsaWNlKGF4aXMsIDAsIDEpO1xuICAgIH0pO1xuICAgIGNvbnN0IHhSZXNoYXBlZCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeCB9LCBhdHRyczogeyBzaGFwZTogbmV3U2hhcGUgfSwgYmFja2VuZCB9KTtcbiAgICBjb25zdCB7IGJlZ2luOiBub3JtYWxpemVkQmVnaW4sIGVuZDogbm9ybWFsaXplZEVuZCwgc3RyaWRlczogbm9ybWFsaXplZFN0cmlkZXMgfSA9IGJhY2tlbmRfdXRpbC5zbGljZV91dGlsLmdldE5vcm1hbGl6ZWRBeGVzKHhSZXNoYXBlZC5zaGFwZSwgZWxsaXBzaXNBeGVzLCBudW1JbnRlcnBvbGF0ZWRBeGVzLCBiZWdpbiwgZW5kLCBzdHJpZGVzLCBiZWdpbk1hc2ssIGVuZE1hc2ssIGVsbGlwc2lzTWFzayk7XG4gICAgYmVnaW4gPSBub3JtYWxpemVkQmVnaW47XG4gICAgZW5kID0gbm9ybWFsaXplZEVuZDtcbiAgICBzdHJpZGVzID0gbm9ybWFsaXplZFN0cmlkZXM7XG4gICAgY29uc3Qgc2hyaW5rQXhlcyA9IGJhY2tlbmRfdXRpbC5zbGljZV91dGlsLm1hc2tUb0F4ZXMoc2hyaW5rQXhpc01hc2spO1xuICAgIC8vIEFkanVzdCB0aGUgZW5kcyBiYXNlZCBvbiB0aGUgc2hyaW5rIG1hc2suXG4gICAgc2hyaW5rQXhlcy5mb3JFYWNoKGF4aXMgPT4ge1xuICAgICAgICBlbmRbYXhpc10gPSBiZWdpbltheGlzXSArIDE7XG4gICAgICAgIHN0cmlkZXNbYXhpc10gPSAxO1xuICAgIH0pO1xuICAgIC8vIEZpZ3VyZSBvdXQgdGhlIG91dHB1dCBzaGFwZS5cbiAgICBjb25zdCBzaXplID0gYmFja2VuZF91dGlsLnNsaWNlX3V0aWwuY29tcHV0ZU91dFNoYXBlKGJlZ2luLCBlbmQsIHN0cmlkZXMpO1xuICAgIC8vIFJlbW92ZSB0aGUgYXhlcyBiYXNlZCBvbiBzaHJpbmtNYXNrLlxuICAgIGNvbnN0IG91dFNoYXBlID0gc2l6ZS5maWx0ZXIoKF8sIGF4aXMpID0+IHNocmlua0F4ZXMuaW5kZXhPZihheGlzKSA9PT0gLTEpO1xuICAgIGNvbnN0IG5vblN0cmlkZWQgPSBzdHJpZGVzLmV2ZXJ5KHYgPT4gdiA9PT0gMSk7XG4gICAgaWYgKG5vblN0cmlkZWQpIHtcbiAgICAgICAgY29uc3QgeFNsaWNlZCA9IHNsaWNlKHsgaW5wdXRzOiB7IHg6IHhSZXNoYXBlZCB9LCBhdHRyczogeyBiZWdpbiwgc2l6ZSB9LCBiYWNrZW5kIH0pO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VEYXRhKHhSZXNoYXBlZC5kYXRhSWQpO1xuICAgICAgICBjb25zdCByZXNoYXBlZCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogeFNsaWNlZCB9LCBhdHRyczogeyBzaGFwZTogb3V0U2hhcGUgfSwgYmFja2VuZCB9KTtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlRGF0YSh4U2xpY2VkLmRhdGFJZCk7XG4gICAgICAgIHJldHVybiByZXNoYXBlZDtcbiAgICB9XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KG91dFNoYXBlLCAnZmxvYXQzMicpO1xuICAgIGlmICghb3V0U2hhcGUuc29tZShheGlzID0+IGF4aXMgPT09IDApKSB7XG4gICAgICAgIGNvbnN0IHhJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh4UmVzaGFwZWQuZGF0YUlkKS5pZDtcbiAgICAgICAgY29uc3QgeFN0cmlkZXNCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KHV0aWwuY29tcHV0ZVN0cmlkZXMoeFJlc2hhcGVkLnNoYXBlKSkuYnVmZmVyKTtcbiAgICAgICAgY29uc3QgYmVnaW5CeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KGJlZ2luKS5idWZmZXIpO1xuICAgICAgICBjb25zdCBlbmRCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KGVuZCkuYnVmZmVyKTtcbiAgICAgICAgY29uc3Qgc3RyaWRlc0J5dGVzID0gbmV3IFVpbnQ4QXJyYXkobmV3IEludDMyQXJyYXkoc3RyaWRlcykuYnVmZmVyKTtcbiAgICAgICAgY29uc3Qgb3V0cHV0U2hhcGVCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KG91dFNoYXBlKS5idWZmZXIpO1xuICAgICAgICBjb25zdCBvdXRTdHJpZGVzQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheSh1dGlsLmNvbXB1dGVTdHJpZGVzKG91dFNoYXBlKSkuYnVmZmVyKTtcbiAgICAgICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgICAgIHdhc21TdHJpZGVkU2xpY2UoeElkLCB4U3RyaWRlc0J5dGVzLCB4UmVzaGFwZWQuc2hhcGUubGVuZ3RoLCBiZWdpbkJ5dGVzLCBlbmRCeXRlcywgc3RyaWRlc0J5dGVzLCBvdXRwdXRTaGFwZUJ5dGVzLCBvdXRTdHJpZGVzQnl0ZXMsIG91dFNoYXBlLmxlbmd0aCwgb3V0SWQpO1xuICAgIH1cbiAgICBiYWNrZW5kLmRpc3Bvc2VEYXRhKHhSZXNoYXBlZC5kYXRhSWQpO1xuICAgIGNvbnN0IHJlc2hhcGVkID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiBvdXQgfSwgYXR0cnM6IHsgc2hhcGU6IG91dFNoYXBlIH0sIGJhY2tlbmQgfSk7XG4gICAgYmFja2VuZC5kaXNwb3NlRGF0YShvdXQuZGF0YUlkKTtcbiAgICByZXR1cm4gcmVzaGFwZWQ7XG59XG5leHBvcnQgY29uc3Qgc3RyaWRlZFNsaWNlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFN0cmlkZWRTbGljZSxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogc3RyaWRlZFNsaWNlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3RyaWRlZFNsaWNlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFN1YiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVCaW5hcnlLZXJuZWxDb25maWcgfSBmcm9tICcuL2JpbmFyeV9rZXJuZWwnO1xuY29uc3Qgc3VwcG9ydHNGdWxsQnJvYWRjYXN0ID0gdHJ1ZTtcbmV4cG9ydCBjb25zdCBzdWJDb25maWcgPSBjcmVhdGVCaW5hcnlLZXJuZWxDb25maWcoU3ViLCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3ViLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgU3VtLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHBlcm11dGVBeGVzQW5kVHJhbnNwb3NlIH0gZnJvbSAnLi9rZXJuZWxfdXRpbHMnO1xubGV0IHdhc21TdW07XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbVN1bSA9IGJhY2tlbmQud2FzbS5jd3JhcChTdW0sIG51bGwgLyp2b2lkKi8sIFsnbnVtYmVyLCBudW1iZXIsIG51bWJlciddKTtcbn1cbmZ1bmN0aW9uIHN1bShhcmdzKSB7XG4gICAgY29uc3QgeyBiYWNrZW5kLCBpbnB1dHMsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgYXhpcywga2VlcERpbXMgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHhJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh4LmRhdGFJZCkuaWQ7XG4gICAgbGV0IGlucHV0SWQgPSB4SWQ7XG4gICAgbGV0IGlucHV0ID0geDtcbiAgICBjb25zdCB7IHRyYW5zcG9zZWQsIGF4ZXMsIG9yaWdpbmFsQXhlcywgaW5wdXRXYXNUcmFuc3Bvc2VkIH0gPSBwZXJtdXRlQXhlc0FuZFRyYW5zcG9zZSh4LCBheGlzLCBiYWNrZW5kKTtcbiAgICBsZXQgcmVkdWN0aW9uQXhlcyA9IGF4ZXM7XG4gICAgaWYgKGlucHV0V2FzVHJhbnNwb3NlZCkge1xuICAgICAgICBjb25zdCB0cmFuc3Bvc2VkSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQodHJhbnNwb3NlZC5kYXRhSWQpLmlkO1xuICAgICAgICBpZiAodHJhbnNwb3NlZElkICE9PSB4SWQpIHtcbiAgICAgICAgICAgIC8vIHRyYW5zcG9zZSB3YXMgbm90IGEgbm8tb3AuIFdlIHdpbGwgbmVlZCB0byBkaXNwb3NlIG9mIHRoaXNcbiAgICAgICAgICAgIC8vIG9uY2Ugd2UgYXJlIGRvbmUuXG4gICAgICAgICAgICBpbnB1dCA9IHRyYW5zcG9zZWQ7XG4gICAgICAgICAgICBpbnB1dElkID0gdHJhbnNwb3NlZElkO1xuICAgICAgICAgICAgcmVkdWN0aW9uQXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRJbm5lck1vc3RBeGVzKHJlZHVjdGlvbkF4ZXMubGVuZ3RoLCBpbnB1dC5zaGFwZS5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGJhY2tlbmRfdXRpbC5hc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcygnc3VtJywgcmVkdWN0aW9uQXhlcywgaW5wdXQuc2hhcGUubGVuZ3RoKTtcbiAgICBjb25zdCBbb3V0U2hhcGUsIHJlZHVjZVNoYXBlXSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKGlucHV0LnNoYXBlLCByZWR1Y3Rpb25BeGVzKTtcbiAgICBjb25zdCByZWR1Y2VTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQob3V0U2hhcGUsIGlucHV0LmR0eXBlKTtcbiAgICBpZiAodXRpbC5zaXplRnJvbVNoYXBlKGlucHV0LnNoYXBlKSAhPT0gMCkge1xuICAgICAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICAgICAgd2FzbVN1bShpbnB1dElkLCByZWR1Y2VTaXplLCBvdXRJZCk7XG4gICAgfVxuICAgIGlmIChpbnB1dFdhc1RyYW5zcG9zZWQpIHtcbiAgICAgICAgLy8gZGlzcG9zZSBvZiB0aGUgdHJhbnNwb3NlZCB0ZW5zb3IuXG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZURhdGEodHJhbnNwb3NlZC5kYXRhSWQpO1xuICAgIH1cbiAgICBpZiAoa2VlcERpbXMpIHtcbiAgICAgICAgLy8gcmVzaGFwZVxuICAgICAgICBjb25zdCBuZXdTaGFwZSA9IGJhY2tlbmRfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbShvdXQuc2hhcGUsIG9yaWdpbmFsQXhlcyk7XG4gICAgICAgIG91dC5zaGFwZSA9IG5ld1NoYXBlO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IHN1bUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTdW0sXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IHN1bVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN1bS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBUYW4gfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlVW5hcnlLZXJuZWxDb25maWcgfSBmcm9tICcuL3VuYXJ5X2tlcm5lbCc7XG5leHBvcnQgY29uc3QgdGFuQ29uZmlnID0gY3JlYXRlVW5hcnlLZXJuZWxDb25maWcoVGFuKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRhbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBUYW5oIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi91bmFyeV9rZXJuZWwnO1xuZXhwb3J0IGNvbnN0IHRhbmhDb25maWcgPSBjcmVhdGVVbmFyeUtlcm5lbENvbmZpZyhUYW5oKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRhbmguanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgVGlsZSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBDcHBEVHlwZSB9IGZyb20gJy4vdHlwZXMnO1xubGV0IHdhc21UaWxlO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21UaWxlID0gYmFja2VuZC53YXNtLmN3cmFwKFRpbGUsIG51bGwgLyogdm9pZCAqLywgW1xuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyAvLyBvdXRfaWRcbiAgICBdKTtcbn1cbmZ1bmN0aW9uIHRpbGUoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB4SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IHsgcmVwcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgbmV3U2hhcGUgPSBuZXcgQXJyYXkoeC5zaGFwZS5sZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3U2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbmV3U2hhcGVbaV0gPSB4LnNoYXBlW2ldICogcmVwc1tpXTtcbiAgICB9XG4gICAgY29uc3QgeFNoYXBlQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheSh4LnNoYXBlKS5idWZmZXIpO1xuICAgIGNvbnN0IG5ld1NoYXBlQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheShuZXdTaGFwZSkuYnVmZmVyKTtcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQobmV3U2hhcGUsIHguZHR5cGUpO1xuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIHdhc21UaWxlKHhJZCwgeFNoYXBlQnl0ZXMsIHguc2hhcGUubGVuZ3RoLCBuZXdTaGFwZUJ5dGVzLCBuZXdTaGFwZS5sZW5ndGgsIENwcERUeXBlW291dC5kdHlwZV0sIG91dElkKTtcbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IHRpbGVDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogVGlsZSxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogdGlsZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRpbGUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgVG9wSyB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBDcHBEVHlwZSB9IGZyb20gJy4vdHlwZXMnO1xubGV0IHdhc21Ub3BLO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21Ub3BLID0gYmFja2VuZC53YXNtLmN3cmFwKFRvcEssIG51bGwgLyogdm9pZCAqLywgW1xuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2Jvb2wnLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgXSk7XG59XG5leHBvcnQgY29uc3QgdG9wayA9ICh7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSkgPT4ge1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgaywgc29ydGVkIH0gPSBhdHRycztcbiAgICBjb25zdCB4SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IHhTaGFwZUJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobmV3IEludDMyQXJyYXkoeC5zaGFwZSkuYnVmZmVyKTtcbiAgICBjb25zdCBvdXRwdXRTaGFwZSA9IHguc2hhcGUuc2xpY2UoKTtcbiAgICBvdXRwdXRTaGFwZVtvdXRwdXRTaGFwZS5sZW5ndGggLSAxXSA9IGs7XG4gICAgY29uc3Qgb3V0VmFsdWVzID0gYmFja2VuZC5tYWtlT3V0cHV0KG91dHB1dFNoYXBlLCB4LmR0eXBlKTtcbiAgICBjb25zdCBvdXRWYWx1ZXNJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXRWYWx1ZXMuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBvdXRJbmRpY2VzID0gYmFja2VuZC5tYWtlT3V0cHV0KG91dHB1dFNoYXBlLCAnaW50MzInKTtcbiAgICBjb25zdCBvdXRJbmRpY2VzSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0SW5kaWNlcy5kYXRhSWQpLmlkO1xuICAgIHdhc21Ub3BLKHhJZCwgeFNoYXBlQnl0ZXMsIHguc2hhcGUubGVuZ3RoLCBDcHBEVHlwZVt4LmR0eXBlXSwgaywgc29ydGVkLCBvdXRWYWx1ZXNJZCwgb3V0SW5kaWNlc0lkKTtcbiAgICByZXR1cm4gW291dFZhbHVlcywgb3V0SW5kaWNlc107XG59O1xuZXhwb3J0IGNvbnN0IHRvcEtDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogVG9wSyxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogdG9wayxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ub3BLLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFRyYW5zZm9ybSwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5sZXQgd2FzbVRyYW5zZm9ybTtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtVHJhbnNmb3JtID0gYmFja2VuZC53YXNtLmN3cmFwKFRyYW5zZm9ybSwgbnVsbCAvKnZvaWQqLywgW1xuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdib29sJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInIC8vIG91dElkXG4gICAgXSk7XG59XG5mdW5jdGlvbiB0cmFuc2Zvcm0oYXJncykge1xuICAgIGNvbnN0IHsgYmFja2VuZCwgaW5wdXRzLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGltYWdlLCB0cmFuc2Zvcm1zIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBpbnRlcnBvbGF0aW9uLCBmaWxsTW9kZSwgZmlsbFZhbHVlLCBvdXRwdXRTaGFwZSB9ID0gYXR0cnM7XG4gICAgY29uc3QgW2JhdGNoLCBpbWFnZUhlaWdodCwgaW1hZ2VXaWR0aCwgbnVtQ2hhbm5lbHNdID0gaW1hZ2Uuc2hhcGU7XG4gICAgY29uc3QgW291dEhlaWdodCwgb3V0V2lkdGhdID0gb3V0cHV0U2hhcGUgIT0gbnVsbCA/IG91dHB1dFNoYXBlIDogW2ltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoXTtcbiAgICBjb25zdCBvdXRTaGFwZSA9IFtiYXRjaCwgb3V0SGVpZ2h0LCBvdXRXaWR0aCxcbiAgICAgICAgbnVtQ2hhbm5lbHNdO1xuICAgIGNvbnN0IHN0cmlkZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheSh1dGlsLmNvbXB1dGVTdHJpZGVzKGltYWdlLnNoYXBlKSkuYnVmZmVyKTtcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQob3V0U2hhcGUsIGltYWdlLmR0eXBlKTtcbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBpbWFnZURhdGEgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoaW1hZ2UuZGF0YUlkKTtcbiAgICBjb25zdCBpbWFnZUlkID0gaW1hZ2VEYXRhLmlkO1xuICAgIGNvbnN0IHRyYW5zZm9ybXNEYXRhID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHRyYW5zZm9ybXMuZGF0YUlkKTtcbiAgICBjb25zdCB0cmFuc2Zvcm1zSWQgPSB0cmFuc2Zvcm1zRGF0YS5pZDtcbiAgICBjb25zdCBpbnRlcnBvbGF0aW9uTW9kZUlkID0gaW50ZXJwb2xhdGlvbiA9PT0gJ25lYXJlc3QnID8gMSA6IDI7XG4gICAgbGV0IGZpbGxNb2RlSWQ7XG4gICAgc3dpdGNoIChmaWxsTW9kZSkge1xuICAgICAgICBjYXNlICdjb25zdGFudCc6XG4gICAgICAgICAgICBmaWxsTW9kZUlkID0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdyZWZsZWN0JzpcbiAgICAgICAgICAgIGZpbGxNb2RlSWQgPSAyO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3dyYXAnOlxuICAgICAgICAgICAgZmlsbE1vZGVJZCA9IDM7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbmVhcmVzdCc6XG4gICAgICAgICAgICBmaWxsTW9kZUlkID0gNDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgZmlsbE1vZGVJZCA9IDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgd2FzbVRyYW5zZm9ybShpbWFnZUlkLCB0cmFuc2Zvcm1zSWQsICh0cmFuc2Zvcm1zLnNoYXBlWzBdID4gMSksIGJhdGNoLCBvdXRIZWlnaHQsIG91dFdpZHRoLCBudW1DaGFubmVscywgaW1hZ2VXaWR0aCwgaW1hZ2VIZWlnaHQsIHN0cmlkZXMsIGltYWdlLnNoYXBlLmxlbmd0aCAtIDEsIGludGVycG9sYXRpb25Nb2RlSWQsIGZpbGxNb2RlSWQsIGZpbGxWYWx1ZSwgb3V0SWQpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgdHJhbnNmb3JtQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFRyYW5zZm9ybSxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogdHJhbnNmb3JtXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VHJhbnNmb3JtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFRyYW5zcG9zZSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBpZGVudGl0eSB9IGZyb20gJy4vSWRlbnRpdHknO1xuaW1wb3J0IHsgQ3BwRFR5cGUgfSBmcm9tICcuL3R5cGVzJztcbmxldCB3YXNtVHJhbnNwb3NlO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21UcmFuc3Bvc2UgPSBiYWNrZW5kLndhc20uY3dyYXAoVHJhbnNwb3NlLCBudWxsIC8qIHZvaWQgKi8sIFtcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdudW1iZXInLFxuICAgIF0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zcG9zZShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIC8vIFJlZHVjZSBhbnkgZGltZW5zaW9ucyB3aXRoIHNpemUgb25lLiBMb3dlci1yYW5rIHRyYW5zcG9zZSBrZXJuZWwgcGVyZm9ybXNcbiAgICAvLyBiZXR0ZXIgZHVlIHRvIHNpbXBsZXIgbWVtb3J5IGFjY2VzcyBwYXR0ZXJuLlxuICAgIGNvbnN0IFtyZWR1Y2VkU2hhcGUsIHBlcm1dID0gcmVtb3ZlT25lU2l6ZURpbXMoaW5wdXRzLnguc2hhcGUsIGF0dHJzLnBlcm0pO1xuICAgIGxldCBwZXJtSXNOb09wID0gdHJ1ZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBlcm0ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHBlcm1baV0gIT09IGkpIHtcbiAgICAgICAgICAgIHBlcm1Jc05vT3AgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBvdXRTaGFwZSA9IGNvbXB1dGVPdXRTaGFwZShpbnB1dHMueC5zaGFwZSwgYXR0cnMucGVybSk7XG4gICAgY29uc3QgeCA9IHtcbiAgICAgICAgZGF0YUlkOiBpbnB1dHMueC5kYXRhSWQsXG4gICAgICAgIHNoYXBlOiByZWR1Y2VkU2hhcGUsXG4gICAgICAgIGR0eXBlOiBpbnB1dHMueC5kdHlwZVxuICAgIH07XG4gICAgaWYgKHBlcm1Jc05vT3ApIHtcbiAgICAgICAgY29uc3QgY2xvbmVkID0gaWRlbnRpdHkoeyBpbnB1dHMsIGJhY2tlbmQgfSk7XG4gICAgICAgIGNsb25lZC5zaGFwZSA9IG91dFNoYXBlO1xuICAgICAgICByZXR1cm4gY2xvbmVkO1xuICAgIH1cbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQob3V0U2hhcGUsIHguZHR5cGUpO1xuICAgIGNvbnN0IHhJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh4LmRhdGFJZCkuaWQ7XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgcGVybUJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobmV3IEludDMyQXJyYXkocGVybSkuYnVmZmVyKTtcbiAgICBjb25zdCB4U2hhcGVCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KHguc2hhcGUpLmJ1ZmZlcik7XG4gICAgd2FzbVRyYW5zcG9zZSh4SWQsIHhTaGFwZUJ5dGVzLCB4LnNoYXBlLmxlbmd0aCwgQ3BwRFR5cGVbeC5kdHlwZV0sIG91dElkLCBwZXJtQnl0ZXMsIHBlcm0ubGVuZ3RoKTtcbiAgICByZXR1cm4gb3V0O1xufVxuZnVuY3Rpb24gY29tcHV0ZU91dFNoYXBlKGluU2hhcGUsIHBlcm0pIHtcbiAgICBjb25zdCBvdXRTaGFwZSA9IG5ldyBBcnJheShpblNoYXBlLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRTaGFwZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBvdXRTaGFwZVtpXSA9IGluU2hhcGVbcGVybVtpXV07XG4gICAgfVxuICAgIHJldHVybiBvdXRTaGFwZTtcbn1cbmZ1bmN0aW9uIHJlbW92ZU9uZVNpemVEaW1zKHNoYXBlLCBwZXJtKSB7XG4gICAgY29uc3QgbmV3U2hhcGUgPSBbXTtcbiAgICBjb25zdCBuZXdQZXJtID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaGFwZS5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAoc2hhcGVbaV0gIT09IDEpIHtcbiAgICAgICAgICAgIG5ld1NoYXBlLnB1c2goc2hhcGVbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaGFwZVtwZXJtW2ldXSAhPT0gMSkge1xuICAgICAgICAgICAgbmV3UGVybS5wdXNoKHBlcm1baV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3UGVybS5sZW5ndGg7ICsraSkge1xuICAgICAgICBsZXQgbWluVmFsSWR4ID0gLTE7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbmV3UGVybS5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgaWYgKG5ld1Blcm1bal0gPj0gaSAmJlxuICAgICAgICAgICAgICAgIChtaW5WYWxJZHggPT09IC0xIHx8IG5ld1Blcm1bbWluVmFsSWR4XSA+IG5ld1Blcm1bal0pKSB7XG4gICAgICAgICAgICAgICAgbWluVmFsSWR4ID0gajtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBuZXdQZXJtW21pblZhbElkeF0gPSBpO1xuICAgIH1cbiAgICByZXR1cm4gW25ld1NoYXBlLCBuZXdQZXJtXTtcbn1cbmV4cG9ydCBjb25zdCB0cmFuc3Bvc2VDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogVHJhbnNwb3NlLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAga2VybmVsRnVuYzogdHJhbnNwb3NlLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VHJhbnNwb3NlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFVucGFjayB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBzbGljZSB9IGZyb20gJy4vU2xpY2UnO1xuZnVuY3Rpb24gdW5wYWNrKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB2YWx1ZSB9ID0gaW5wdXRzO1xuICAgIGxldCB7IGF4aXMgfSA9IGF0dHJzO1xuICAgIGlmIChheGlzIDwgMCkge1xuICAgICAgICBheGlzICs9IHZhbHVlLnNoYXBlLmxlbmd0aDtcbiAgICB9XG4gICAgY29uc3QgbnVtT3V0cHV0cyA9IHZhbHVlLnNoYXBlW2F4aXNdO1xuICAgIGNvbnN0IHJhbmsgPSB2YWx1ZS5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3Qgb3V0U2hhcGUgPSBuZXcgQXJyYXkocmFuayAtIDEpO1xuICAgIGxldCBvdXRJbmRleCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5rOyBpKyspIHtcbiAgICAgICAgaWYgKGkgIT09IGF4aXMpIHtcbiAgICAgICAgICAgIG91dFNoYXBlW291dEluZGV4KytdID0gdmFsdWUuc2hhcGVbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgb3V0cyA9IG5ldyBBcnJheShudW1PdXRwdXRzKTtcbiAgICBjb25zdCBiZWdpbiA9IG5ldyBBcnJheShyYW5rKS5maWxsKDApO1xuICAgIGNvbnN0IHNpemUgPSB2YWx1ZS5zaGFwZS5zbGljZSgpO1xuICAgIHNpemVbYXhpc10gPSAxO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBiZWdpbltheGlzXSA9IGk7XG4gICAgICAgIG91dHNbaV0gPSBzbGljZSh7IGlucHV0czogeyB4OiB2YWx1ZSB9LCBhdHRyczogeyBiZWdpbiwgc2l6ZSB9LCBiYWNrZW5kIH0pO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cy5tYXAoKHsgZGF0YUlkLCBkdHlwZSB9KSA9PiAoeyBkYXRhSWQsIGR0eXBlLCBzaGFwZTogb3V0U2hhcGUgfSkpO1xufVxuZXhwb3J0IGNvbnN0IHVucGFja0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBVbnBhY2ssXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBrZXJuZWxGdW5jOiB1bnBhY2ssXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VW5wYWNrLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFplcm9zTGlrZSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5mdW5jdGlvbiB6ZXJvc0xpa2UoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoeC5zaGFwZSwgeC5kdHlwZSk7XG4gICAgY29uc3Qgb3V0VmFscyA9IGJhY2tlbmQudHlwZWRBcnJheUZyb21IZWFwKG91dCk7XG4gICAgb3V0VmFscy5maWxsKDApO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgemVyb3NMaWtlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFplcm9zTGlrZSxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIGtlcm5lbEZ1bmM6IHplcm9zTGlrZSxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1aZXJvc0xpa2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgX0Z1c2VkTWF0TXVsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IEZ1c2FibGVBY3RpdmF0aW9uIH0gZnJvbSAnLi90eXBlcyc7XG5sZXQgd2FzbUZ1c2VkTWF0TXVsO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21GdXNlZE1hdE11bCA9IGJhY2tlbmQud2FzbS5jd3JhcChfRnVzZWRNYXRNdWwsIG51bGwgLyogdm9pZCAqLywgW1xuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicgLy8gb3V0X2lkXG4gICAgXSk7XG59XG5mdW5jdGlvbiBmdXNlZEJhdGNoTWF0TXVsKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBhLCBiLCBiaWFzLCBwcmVsdUFjdGl2YXRpb25XZWlnaHRzIH0gPSBpbnB1dHM7XG4gICAgaWYgKGEuZHR5cGUgIT09ICdmbG9hdDMyJyB8fCBiLmR0eXBlICE9PSAnZmxvYXQzMicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBfRnVzZWRNYXRNdWwgZm9yIG5vbiBub24tZmxvYXQzMiB0ZW5zb3JzIG5vdCB5ZXQgc3VwcG9ydGVkLmApO1xuICAgIH1cbiAgICBjb25zdCB7IHRyYW5zcG9zZUEsIHRyYW5zcG9zZUIsIGFjdGl2YXRpb24sIGxlYWt5cmVsdUFscGhhIH0gPSBhdHRycztcbiAgICBjb25zdCBhSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoYS5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IGJJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChiLmRhdGFJZCkuaWQ7XG4gICAgbGV0IGJpYXNJZCA9IDA7XG4gICAgaWYgKGJpYXMgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBiaWFzRGF0YSA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChiaWFzLmRhdGFJZCk7XG4gICAgICAgIGlmIChiaWFzRGF0YS5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgX0Z1c2VkTWF0TXVsIG9ubHkgc3VwcG9ydHMgcmFuay0xIGJpYXMgYnV0IGdvdCBgICtcbiAgICAgICAgICAgICAgICBgcmFuayAke2JpYXNEYXRhLnNoYXBlLmxlbmd0aH0uYCk7XG4gICAgICAgIH1cbiAgICAgICAgYmlhc0lkID0gYmlhc0RhdGEuaWQ7XG4gICAgfVxuICAgIGNvbnN0IHByZWx1QWN0aXZhdGlvbldlaWdodHNJZCA9IHByZWx1QWN0aXZhdGlvbldlaWdodHMgPT0gbnVsbCA/XG4gICAgICAgIDAgOlxuICAgICAgICBiYWNrZW5kLmRhdGFJZE1hcC5nZXQocHJlbHVBY3RpdmF0aW9uV2VpZ2h0cy5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IGZ1c2VkQWN0aXZhdGlvbiA9IEZ1c2FibGVBY3RpdmF0aW9uW2FjdGl2YXRpb25dO1xuICAgIGlmIChmdXNlZEFjdGl2YXRpb24gPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7YWN0aXZhdGlvbn0gYWN0aXZhdGlvbiBub3QgeWV0IHN1cHBvcnRlZCBmb3IgRnVzZWRDb252MkQgYCArXG4gICAgICAgICAgICBgaW4gdGhlIHdhc20gYmFja2VuZC5gKTtcbiAgICB9XG4gICAgY29uc3QgbGVmdERpbSA9IHRyYW5zcG9zZUEgPyBhLnNoYXBlWzJdIDogYS5zaGFwZVsxXTtcbiAgICBjb25zdCByaWdodERpbSA9IHRyYW5zcG9zZUIgPyBiLnNoYXBlWzFdIDogYi5zaGFwZVsyXTtcbiAgICBjb25zdCBiYXRjaERpbSA9IGEuc2hhcGVbMF07XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KFtiYXRjaERpbSwgbGVmdERpbSwgcmlnaHREaW1dLCBhLmR0eXBlKTtcbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBhU2hhcGVCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KGEuc2hhcGUpLmJ1ZmZlcik7XG4gICAgY29uc3QgYlNoYXBlQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheShiLnNoYXBlKS5idWZmZXIpO1xuICAgIHdhc21GdXNlZE1hdE11bChhSWQsIGFTaGFwZUJ5dGVzLCBhLnNoYXBlLmxlbmd0aCwgYklkLCBiU2hhcGVCeXRlcywgYi5zaGFwZS5sZW5ndGgsIHRyYW5zcG9zZUEsIHRyYW5zcG9zZUIsIGZ1c2VkQWN0aXZhdGlvbiwgYmlhc0lkLCBwcmVsdUFjdGl2YXRpb25XZWlnaHRzSWQsIGxlYWt5cmVsdUFscGhhIHx8IDAsIG91dElkKTtcbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IGZ1c2VkTWF0TXVsQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IF9GdXNlZE1hdE11bCxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogZnVzZWRCYXRjaE1hdE11bFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPV9GdXNlZE1hdE11bC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgQ3BwRFR5cGUgfSBmcm9tICcuL3R5cGVzJztcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCaW5hcnlLZXJuZWxDb25maWcoa2VybmVsTmFtZSwgc3VwcG9ydHNGdWxsQnJvYWRjYXN0LCBkdHlwZSkge1xuICAgIGxldCB3YXNtRnVuYztcbiAgICBmdW5jdGlvbiBzZXR1cEZ1bmMoYmFja2VuZCkge1xuICAgICAgICB3YXNtRnVuYyA9IGJhY2tlbmQud2FzbS5jd3JhcChrZXJuZWxOYW1lLCBudWxsIC8qIHZvaWQgKi8sIFtcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnYXJyYXknLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInIC8vIG91dF9pZFxuICAgICAgICBdKTtcbiAgICB9XG4gICAgZnVuY3Rpb24ga2VybmVsRnVuYyhhcmdzKSB7XG4gICAgICAgIGNvbnN0IHsgYmFja2VuZCwgaW5wdXRzIH0gPSBhcmdzO1xuICAgICAgICBjb25zdCB7IGEsIGIgfSA9IGlucHV0cztcbiAgICAgICAgY29uc3QgYUlkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGEuZGF0YUlkKS5pZDtcbiAgICAgICAgY29uc3QgYklkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGIuZGF0YUlkKS5pZDtcbiAgICAgICAgY29uc3Qgb3V0cHV0VHlwZSA9IGR0eXBlICE9IG51bGwgPyBkdHlwZSA6IGEuZHR5cGU7XG4gICAgICAgIGNvbnN0IG5ld1NoYXBlID0gYmFja2VuZF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKGEuc2hhcGUsIGIuc2hhcGUpO1xuICAgICAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQobmV3U2hhcGUsIG91dHB1dFR5cGUpO1xuICAgICAgICAvLyBTaG9ydC1jaXJjdWl0IHplcm8tc2l6ZWQgdGVuc29ycy5cbiAgICAgICAgaWYgKHV0aWwuc2l6ZUZyb21TaGFwZShuZXdTaGFwZSkgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBvdXQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYVNoYXBlQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheShhLnNoYXBlKS5idWZmZXIpO1xuICAgICAgICBjb25zdCBiU2hhcGVCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KGIuc2hhcGUpLmJ1ZmZlcik7XG4gICAgICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgICAgICBjb25zdCBrZXJuZWxGdW5jID0gKCkgPT4gd2FzbUZ1bmMoYUlkLCBhU2hhcGVCeXRlcywgYS5zaGFwZS5sZW5ndGgsIGJJZCwgYlNoYXBlQnl0ZXMsIGIuc2hhcGUubGVuZ3RoLCBDcHBEVHlwZVthLmR0eXBlXSwgb3V0SWQpO1xuICAgICAgICAvLyBDdXJyZW50bHkgb25seSBzb21lIGZsb2F0IG9wZXJhdGlvbnMgc3VwcG9ydCBmdWxsIGJyb2FkY2FzdC5cbiAgICAgICAgaWYgKHN1cHBvcnRzRnVsbEJyb2FkY2FzdCAmJiBhLmR0eXBlID09PSAnZmxvYXQzMicpIHtcbiAgICAgICAgICAgIGtlcm5lbEZ1bmMoKTtcbiAgICAgICAgICAgIHJldHVybiBvdXQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYUJyb2FkY2FzdERpbXMgPSBiYWNrZW5kX3V0aWwuZ2V0QnJvYWRjYXN0RGltcyhhLnNoYXBlLCBuZXdTaGFwZSk7XG4gICAgICAgIGNvbnN0IGJCcm9hZGNhc3REaW1zID0gYmFja2VuZF91dGlsLmdldEJyb2FkY2FzdERpbXMoYi5zaGFwZSwgbmV3U2hhcGUpO1xuICAgICAgICBjb25zdCBsb29wc092ZXJBbGxPZkEgPSBhQnJvYWRjYXN0RGltcy5ldmVyeSgodiwgaSkgPT4gdiA9PT0gaSk7XG4gICAgICAgIGNvbnN0IGxvb3BzT3ZlckFsbE9mQiA9IGJCcm9hZGNhc3REaW1zLmV2ZXJ5KCh2LCBpKSA9PiB2ID09PSBpKTtcbiAgICAgICAgaWYgKGxvb3BzT3ZlckFsbE9mQSAmJiBsb29wc092ZXJBbGxPZkIpIHtcbiAgICAgICAgICAgIGtlcm5lbEZ1bmMoKTtcbiAgICAgICAgICAgIHJldHVybiBvdXQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJyb2FkY2FzdGluZyBhbG9uZyBvdXRlciBkaW1zIGlzIG5vdCB5ZXQgYCArXG4gICAgICAgICAgICAgICAgYHN1cHBvcnRlZCBmb3IgJHthLmR0eXBlfSAke2tlcm5lbE5hbWV9LmApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGtlcm5lbE5hbWUsIGJhY2tlbmROYW1lOiAnd2FzbScsIHNldHVwRnVuYywga2VybmVsRnVuYyB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmluYXJ5X2tlcm5lbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdHJhbnNwb3NlIH0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuLyoqXG4gKiBDb21wdXRlIHBlcm11dGF0aW9uIGF4ZXMgYW5kIGRvIGEgdHJhbnNwb3NlIGlmIG5lY2Vzc2FyeS5cbiAqXG4gKiBVc2VkIGJ5IHJlZHVjdGlvbiBvcHMuXG4gKiBAcGFyYW0geCBpbnB1dCBUZW5zb3JJbmZvXG4gKiBAcGFyYW0gYXhpcyByZWR1Y3Rpb24gYXhlc1xuICogQHBhcmFtIGJhY2tlbmQgd2FzbSBiYWNrZW5kIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwZXJtdXRlQXhlc0FuZFRyYW5zcG9zZSh4LCBheGlzLCBiYWNrZW5kKSB7XG4gICAgY29uc3QgeFNoYXBlID0geC5zaGFwZTtcbiAgICBjb25zdCB4UmFuayA9IHguc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IG9yaWdpbmFsQXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeFNoYXBlKTtcbiAgICBsZXQgYXhlcyA9IG9yaWdpbmFsQXhlcztcbiAgICBjb25zdCBwZXJtdXRlZEF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKGF4ZXMsIHhSYW5rKTtcbiAgICBsZXQgeFRyYW5zcG9zZWQgPSBudWxsO1xuICAgIGxldCBpbnB1dFdhc1RyYW5zcG9zZWQgPSBmYWxzZTtcbiAgICBpZiAocGVybXV0ZWRBeGVzICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgbmV3U2hhcGUgPSBuZXcgQXJyYXkoeFJhbmspO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld1NoYXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBuZXdTaGFwZVtpXSA9IHhTaGFwZVtwZXJtdXRlZEF4ZXNbaV1dO1xuICAgICAgICB9XG4gICAgICAgIGF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0SW5uZXJNb3N0QXhlcyhheGVzLmxlbmd0aCwgeFJhbmspO1xuICAgICAgICB4VHJhbnNwb3NlZCA9XG4gICAgICAgICAgICB0cmFuc3Bvc2UoeyBpbnB1dHM6IHsgeCB9LCBhdHRyczogeyBwZXJtOiBwZXJtdXRlZEF4ZXMgfSwgYmFja2VuZCB9KTtcbiAgICAgICAgY29uc3QgeElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHguZGF0YUlkKS5pZDtcbiAgICAgICAgY29uc3QgdHJhbnNwb3NlZElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHhUcmFuc3Bvc2VkLmRhdGFJZCkuaWQ7XG4gICAgICAgIGlmICh0cmFuc3Bvc2VkSWQgIT09IHhJZCkge1xuICAgICAgICAgICAgaW5wdXRXYXNUcmFuc3Bvc2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyB0cmFuc3Bvc2VkOiB4VHJhbnNwb3NlZCwgb3JpZ2luYWxBeGVzLCBheGVzLCBpbnB1dFdhc1RyYW5zcG9zZWQgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWtlcm5lbF91dGlscy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vLyBUaGlzIGVudW0gbXVzdCBhbGlnbiB3aXRoIHRoZSBlbnVtIGRlZmluZWQgaW4gY2MvYmFja2VuZC5oLlxuZXhwb3J0IHZhciBDcHBEVHlwZTtcbihmdW5jdGlvbiAoQ3BwRFR5cGUpIHtcbiAgICBDcHBEVHlwZVtDcHBEVHlwZVtcImZsb2F0MzJcIl0gPSAwXSA9IFwiZmxvYXQzMlwiO1xuICAgIENwcERUeXBlW0NwcERUeXBlW1wiaW50MzJcIl0gPSAxXSA9IFwiaW50MzJcIjtcbiAgICBDcHBEVHlwZVtDcHBEVHlwZVtcImJvb2xcIl0gPSAyXSA9IFwiYm9vbFwiO1xuICAgIENwcERUeXBlW0NwcERUeXBlW1wic3RyaW5nXCJdID0gM10gPSBcInN0cmluZ1wiO1xuICAgIENwcERUeXBlW0NwcERUeXBlW1wiY29tcGxleDY0XCJdID0gNF0gPSBcImNvbXBsZXg2NFwiO1xufSkoQ3BwRFR5cGUgfHwgKENwcERUeXBlID0ge30pKTtcbi8vIE11c3QgbWF0Y2ggZW51bSBpbiBjYy9mdXNhYmxlX2FjdGl2YXRpb25zLmguXG5leHBvcnQgdmFyIEZ1c2FibGVBY3RpdmF0aW9uO1xuKGZ1bmN0aW9uIChGdXNhYmxlQWN0aXZhdGlvbikge1xuICAgIEZ1c2FibGVBY3RpdmF0aW9uW0Z1c2FibGVBY3RpdmF0aW9uW1wibGluZWFyXCJdID0gMF0gPSBcImxpbmVhclwiO1xuICAgIEZ1c2FibGVBY3RpdmF0aW9uW0Z1c2FibGVBY3RpdmF0aW9uW1wicmVsdVwiXSA9IDFdID0gXCJyZWx1XCI7XG4gICAgRnVzYWJsZUFjdGl2YXRpb25bRnVzYWJsZUFjdGl2YXRpb25bXCJyZWx1NlwiXSA9IDJdID0gXCJyZWx1NlwiO1xuICAgIEZ1c2FibGVBY3RpdmF0aW9uW0Z1c2FibGVBY3RpdmF0aW9uW1wicHJlbHVcIl0gPSAzXSA9IFwicHJlbHVcIjtcbiAgICBGdXNhYmxlQWN0aXZhdGlvbltGdXNhYmxlQWN0aXZhdGlvbltcImxlYWt5cmVsdVwiXSA9IDRdID0gXCJsZWFreXJlbHVcIjtcbiAgICBGdXNhYmxlQWN0aXZhdGlvbltGdXNhYmxlQWN0aXZhdGlvbltcInNpZ21vaWRcIl0gPSA1XSA9IFwic2lnbW9pZFwiO1xufSkoRnVzYWJsZUFjdGl2YXRpb24gfHwgKEZ1c2FibGVBY3RpdmF0aW9uID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXR5cGVzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnKGtlcm5lbE5hbWUpIHtcbiAgICBsZXQgd2FzbUZ1bmM7XG4gICAgZnVuY3Rpb24gc2V0dXBGdW5jKGJhY2tlbmQpIHtcbiAgICAgICAgd2FzbUZ1bmMgPVxuICAgICAgICAgICAgYmFja2VuZC53YXNtLmN3cmFwKGtlcm5lbE5hbWUsIG51bGwgLyogdm9pZCAqLywgWydudW1iZXInLCAnbnVtYmVyJ10pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBrZXJuZWxGdW5jKGFyZ3MpIHtcbiAgICAgICAgY29uc3QgeyBiYWNrZW5kLCBpbnB1dHM6IHsgeCB9IH0gPSBhcmdzO1xuICAgICAgICBjb25zdCB4SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeC5kYXRhSWQpLmlkO1xuICAgICAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoeC5zaGFwZSwgeC5kdHlwZSk7XG4gICAgICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgICAgICAvLyBTaG9ydC1jaXJjdWl0IHplcm8tc2l6ZWQgdGVuc29ycy5cbiAgICAgICAgaWYgKHV0aWwuc2l6ZUZyb21TaGFwZShvdXQuc2hhcGUpID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gb3V0O1xuICAgICAgICB9XG4gICAgICAgIHdhc21GdW5jKHhJZCwgb3V0SWQpO1xuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cbiAgICByZXR1cm4geyBrZXJuZWxOYW1lLCBiYWNrZW5kTmFtZTogJ3dhc20nLCBzZXR1cEZ1bmMsIGtlcm5lbEZ1bmMgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVuYXJ5X2tlcm5lbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vLyBXZSBleHBsaWNpdGx5IGltcG9ydCB0aGUgbW9kdWxhciBrZXJuZWxzIHNvIHRoZXkgZ2V0IHJlZ2lzdGVyZWQgaW4gdGhlXG4vLyBnbG9iYWwgcmVnaXN0cnkgd2hlbiB3ZSBjb21waWxlIHRoZSBsaWJyYXJ5LiBBIG1vZHVsYXIgYnVpbGQgd291bGQgcmVwbGFjZVxuLy8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhbmQgaW1wb3J0IG9ubHkgdGhlIGtlcm5lbHMgdGhhdCBhcmUgbmVlZGVkLlxuaW1wb3J0IHsgcmVnaXN0ZXJLZXJuZWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgZnVzZWRNYXRNdWxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvX0Z1c2VkTWF0TXVsJztcbmltcG9ydCB7IGFic0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9BYnMnO1xuaW1wb3J0IHsgYWRkQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0FkZCc7XG5pbXBvcnQgeyBhZGROQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0FkZE4nO1xuaW1wb3J0IHsgYWxsQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0FsbCc7XG5pbXBvcnQgeyBhbnlDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQW55JztcbmltcG9ydCB7IGFyZ01heENvbmZpZyB9IGZyb20gJy4va2VybmVscy9BcmdNYXgnO1xuaW1wb3J0IHsgYXZnUG9vbENvbmZpZyB9IGZyb20gJy4va2VybmVscy9BdmdQb29sJztcbmltcG9ydCB7IGJhdGNoTWF0TXVsQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0JhdGNoTWF0TXVsJztcbmltcG9ydCB7IGJhdGNoVG9TcGFjZU5EQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0JhdGNoVG9TcGFjZU5EJztcbmltcG9ydCB7IGNhc3RDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQ2FzdCc7XG5pbXBvcnQgeyBjZWlsQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0NlaWwnO1xuaW1wb3J0IHsgY2xpcEJ5VmFsdWVDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQ2xpcEJ5VmFsdWUnO1xuaW1wb3J0IHsgY29uY2F0Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0NvbmNhdCc7XG5pbXBvcnQgeyBjb252MkRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQ29udjJEJztcbmltcG9ydCB7IGNvbnYyREJhY2twcm9wSW5wdXRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQ29udjJEQmFja3Byb3BJbnB1dCc7XG5pbXBvcnQgeyBjb3NDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQ29zJztcbmltcG9ydCB7IGNvc2hDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQ29zaCc7XG5pbXBvcnQgeyBjcm9wQW5kUmVzaXplQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0Nyb3BBbmRSZXNpemUnO1xuaW1wb3J0IHsgY3Vtc3VtQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0N1bXN1bSc7XG5pbXBvcnQgeyBkZXB0aFRvU3BhY2VDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRGVwdGhUb1NwYWNlJztcbmltcG9ydCB7IGRlcHRod2lzZUNvbnYyZE5hdGl2ZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9EZXB0aHdpc2VDb252MmROYXRpdmUnO1xuaW1wb3J0IHsgZXF1YWxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRXF1YWwnO1xuaW1wb3J0IHsgZXhwQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0V4cCc7XG5pbXBvcnQgeyBleHBhbmREaW1zQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0V4cGFuZERpbXMnO1xuaW1wb3J0IHsgZmlsbENvbmZpZyB9IGZyb20gJy4va2VybmVscy9GaWxsJztcbmltcG9ydCB7IGZsaXBMZWZ0UmlnaHRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRmxpcExlZnRSaWdodCc7XG5pbXBvcnQgeyBmbG9vckNvbmZpZyB9IGZyb20gJy4va2VybmVscy9GbG9vcic7XG5pbXBvcnQgeyBmbG9vckRpdkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9GbG9vckRpdic7XG5pbXBvcnQgeyBmdXNlZEJhdGNoTm9ybUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9GdXNlZEJhdGNoTm9ybSc7XG5pbXBvcnQgeyBmdXNlZENvbnYyRENvbmZpZyB9IGZyb20gJy4va2VybmVscy9GdXNlZENvbnYyRCc7XG5pbXBvcnQgeyBmdXNlZERlcHRod2lzZUNvbnYyRENvbmZpZyB9IGZyb20gJy4va2VybmVscy9GdXNlZERlcHRod2lzZUNvbnYyRCc7XG5pbXBvcnQgeyBnYXRoZXJOZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9HYXRoZXJOZCc7XG5pbXBvcnQgeyBnYXRoZXJWMkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9HYXRoZXJWMic7XG5pbXBvcnQgeyBncmVhdGVyQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0dyZWF0ZXInO1xuaW1wb3J0IHsgZ3JlYXRlckVxdWFsQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0dyZWF0ZXJFcXVhbCc7XG5pbXBvcnQgeyBpZGVudGl0eUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9JZGVudGl0eSc7XG5pbXBvcnQgeyBsZWFreVJlbHVDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTGVha3lSZWx1JztcbmltcG9ydCB7IGxlc3NDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTGVzcyc7XG5pbXBvcnQgeyBsZXNzRXF1YWxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTGVzc0VxdWFsJztcbmltcG9ydCB7IGxvZ0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9Mb2cnO1xuaW1wb3J0IHsgbG9naWNhbEFuZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Mb2dpY2FsQW5kJztcbmltcG9ydCB7IG1heENvbmZpZyB9IGZyb20gJy4va2VybmVscy9NYXgnO1xuaW1wb3J0IHsgbWF4aW11bUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9NYXhpbXVtJztcbmltcG9ydCB7IG1heFBvb2xDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTWF4UG9vbCc7XG5pbXBvcnQgeyBtZWFuQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL01lYW4nO1xuaW1wb3J0IHsgbWluQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL01pbic7XG5pbXBvcnQgeyBtaW5pbXVtQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL01pbmltdW0nO1xuaW1wb3J0IHsgbWlycm9yUGFkQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL01pcnJvclBhZCc7XG5pbXBvcnQgeyBtdWx0aXBseUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9NdWx0aXBseSc7XG5pbXBvcnQgeyBuZWdDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTmVnJztcbmltcG9ydCB7IG5vbk1heFN1cHByZXNzaW9uVjNDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTm9uTWF4U3VwcHJlc3Npb25WMyc7XG5pbXBvcnQgeyBub25NYXhTdXBwcmVzc2lvblY0Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL05vbk1heFN1cHByZXNzaW9uVjQnO1xuaW1wb3J0IHsgbm9uTWF4U3VwcHJlc3Npb25WNUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9Ob25NYXhTdXBwcmVzc2lvblY1JztcbmltcG9ydCB7IG5vdEVxdWFsQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL05vdEVxdWFsJztcbmltcG9ydCB7IG9uZUhvdENvbmZpZyB9IGZyb20gJy4va2VybmVscy9PbmVIb3QnO1xuaW1wb3J0IHsgb25lc0xpa2VDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvT25lc0xpa2UnO1xuaW1wb3J0IHsgcGFja0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9QYWNrJztcbmltcG9ydCB7IHBhZFYyQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1BhZFYyJztcbmltcG9ydCB7IHBvd0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9Qb3cnO1xuaW1wb3J0IHsgcHJlbHVDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUHJlbHUnO1xuaW1wb3J0IHsgcHJvZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Qcm9kJztcbmltcG9ydCB7IHJhbmdlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1JhbmdlJztcbmltcG9ydCB7IHJlYWxEaXZDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUmVhbERpdic7XG5pbXBvcnQgeyByZWx1Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1JlbHUnO1xuaW1wb3J0IHsgcmVsdTZDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUmVsdTYnO1xuaW1wb3J0IHsgcmVzaGFwZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9SZXNoYXBlJztcbmltcG9ydCB7IHJlc2l6ZUJpbGluZWFyQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1Jlc2l6ZUJpbGluZWFyJztcbmltcG9ydCB7IHJldmVyc2VDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUmV2ZXJzZSc7XG5pbXBvcnQgeyByb3RhdGVXaXRoT2Zmc2V0Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1JvdGF0ZVdpdGhPZmZzZXQnO1xuaW1wb3J0IHsgcm91bmRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUm91bmQnO1xuaW1wb3J0IHsgcnNxcnRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUnNxcnQnO1xuaW1wb3J0IHsgc2NhdHRlck5kQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NjYXR0ZXJOZCc7XG5pbXBvcnQgeyBzZWxlY3RDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU2VsZWN0JztcbmltcG9ydCB7IHNpZ21vaWRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU2lnbW9pZCc7XG5pbXBvcnQgeyBzaW5Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvU2luJztcbmltcG9ydCB7IHNsaWNlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NsaWNlJztcbmltcG9ydCB7IHNvZnRtYXhDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU29mdG1heCc7XG5pbXBvcnQgeyBzcGFjZVRvQmF0Y2hORENvbmZpZyB9IGZyb20gJy4va2VybmVscy9TcGFjZVRvQmF0Y2hORCc7XG5pbXBvcnQgeyBzcGxpdFZDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3BsaXRWJztcbmltcG9ydCB7IHNxcnRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3FydCc7XG5pbXBvcnQgeyBzcXVhcmVDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3F1YXJlJztcbmltcG9ydCB7IHNxdWFyZWREaWZmZXJlbmNlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NxdWFyZWREaWZmZXJlbmNlJztcbmltcG9ydCB7IHN0ZXBDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3RlcCc7XG5pbXBvcnQgeyBzdHJpZGVkU2xpY2VDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3RyaWRlZFNsaWNlJztcbmltcG9ydCB7IHN1YkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9TdWInO1xuaW1wb3J0IHsgc3VtQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1N1bSc7XG5pbXBvcnQgeyB0YW5Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvVGFuJztcbmltcG9ydCB7IHRhbmhDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvVGFuaCc7XG5pbXBvcnQgeyB0aWxlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1RpbGUnO1xuaW1wb3J0IHsgdG9wS0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9Ub3BLJztcbmltcG9ydCB7IHRyYW5zZm9ybUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9UcmFuc2Zvcm0nO1xuaW1wb3J0IHsgdHJhbnNwb3NlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1RyYW5zcG9zZSc7XG5pbXBvcnQgeyB1bnBhY2tDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvVW5wYWNrJztcbmltcG9ydCB7IHplcm9zTGlrZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9aZXJvc0xpa2UnO1xuLy8gTGlzdCBhbGwga2VybmVsIGNvbmZpZ3MgaGVyZVxuY29uc3Qga2VybmVsQ29uZmlncyA9IFtcbiAgICBhYnNDb25maWcsXG4gICAgYWRkQ29uZmlnLFxuICAgIGFkZE5Db25maWcsXG4gICAgYWxsQ29uZmlnLFxuICAgIGFueUNvbmZpZyxcbiAgICBhcmdNYXhDb25maWcsXG4gICAgYXZnUG9vbENvbmZpZyxcbiAgICBiYXRjaE1hdE11bENvbmZpZyxcbiAgICBiYXRjaFRvU3BhY2VORENvbmZpZyxcbiAgICBjYXN0Q29uZmlnLFxuICAgIGNlaWxDb25maWcsXG4gICAgY2xpcEJ5VmFsdWVDb25maWcsXG4gICAgY29uY2F0Q29uZmlnLFxuICAgIGNvbnYyRENvbmZpZyxcbiAgICBjb252MkRCYWNrcHJvcElucHV0Q29uZmlnLFxuICAgIGNvc0NvbmZpZyxcbiAgICBjb3NoQ29uZmlnLFxuICAgIGNyb3BBbmRSZXNpemVDb25maWcsXG4gICAgY3Vtc3VtQ29uZmlnLFxuICAgIGRlcHRoVG9TcGFjZUNvbmZpZyxcbiAgICBkZXB0aHdpc2VDb252MmROYXRpdmVDb25maWcsXG4gICAgZXF1YWxDb25maWcsXG4gICAgZXhwQ29uZmlnLFxuICAgIGV4cGFuZERpbXNDb25maWcsXG4gICAgZmlsbENvbmZpZyxcbiAgICBmbGlwTGVmdFJpZ2h0Q29uZmlnLFxuICAgIGZsb29yQ29uZmlnLFxuICAgIGZsb29yRGl2Q29uZmlnLFxuICAgIGZ1c2VkTWF0TXVsQ29uZmlnLFxuICAgIGZ1c2VkQmF0Y2hOb3JtQ29uZmlnLFxuICAgIGZ1c2VkQ29udjJEQ29uZmlnLFxuICAgIGZ1c2VkRGVwdGh3aXNlQ29udjJEQ29uZmlnLFxuICAgIGdhdGhlck5kQ29uZmlnLFxuICAgIGdhdGhlclYyQ29uZmlnLFxuICAgIGdyZWF0ZXJDb25maWcsXG4gICAgZ3JlYXRlckVxdWFsQ29uZmlnLFxuICAgIGlkZW50aXR5Q29uZmlnLFxuICAgIGxlYWt5UmVsdUNvbmZpZyxcbiAgICBsZXNzQ29uZmlnLFxuICAgIGxlc3NFcXVhbENvbmZpZyxcbiAgICBsb2dDb25maWcsXG4gICAgbG9naWNhbEFuZENvbmZpZyxcbiAgICBtYXhDb25maWcsXG4gICAgbWF4aW11bUNvbmZpZyxcbiAgICBtYXhQb29sQ29uZmlnLFxuICAgIG1lYW5Db25maWcsXG4gICAgbWluQ29uZmlnLFxuICAgIG1pbmltdW1Db25maWcsXG4gICAgbWlycm9yUGFkQ29uZmlnLFxuICAgIG11bHRpcGx5Q29uZmlnLFxuICAgIG5lZ0NvbmZpZyxcbiAgICBub25NYXhTdXBwcmVzc2lvblYzQ29uZmlnLFxuICAgIG5vbk1heFN1cHByZXNzaW9uVjRDb25maWcsXG4gICAgbm9uTWF4U3VwcHJlc3Npb25WNUNvbmZpZyxcbiAgICBub3RFcXVhbENvbmZpZyxcbiAgICBvbmVIb3RDb25maWcsXG4gICAgb25lc0xpa2VDb25maWcsXG4gICAgcGFja0NvbmZpZyxcbiAgICBwYWRWMkNvbmZpZyxcbiAgICBwb3dDb25maWcsXG4gICAgcHJlbHVDb25maWcsXG4gICAgcHJvZENvbmZpZyxcbiAgICByYW5nZUNvbmZpZyxcbiAgICByZWFsRGl2Q29uZmlnLFxuICAgIHJlbHVDb25maWcsXG4gICAgcmVsdTZDb25maWcsXG4gICAgcmVzaGFwZUNvbmZpZyxcbiAgICByZXNpemVCaWxpbmVhckNvbmZpZyxcbiAgICByZXZlcnNlQ29uZmlnLFxuICAgIHJvdGF0ZVdpdGhPZmZzZXRDb25maWcsXG4gICAgcnNxcnRDb25maWcsXG4gICAgcm91bmRDb25maWcsXG4gICAgc2NhdHRlck5kQ29uZmlnLFxuICAgIHNlbGVjdENvbmZpZyxcbiAgICBzaWdtb2lkQ29uZmlnLFxuICAgIHNpbkNvbmZpZyxcbiAgICBzbGljZUNvbmZpZyxcbiAgICBzb2Z0bWF4Q29uZmlnLFxuICAgIHNwYWNlVG9CYXRjaE5EQ29uZmlnLFxuICAgIHNwbGl0VkNvbmZpZyxcbiAgICBzcXJ0Q29uZmlnLFxuICAgIHNxdWFyZUNvbmZpZyxcbiAgICBzcXVhcmVkRGlmZmVyZW5jZUNvbmZpZyxcbiAgICBzdGVwQ29uZmlnLFxuICAgIHN0cmlkZWRTbGljZUNvbmZpZyxcbiAgICBzdWJDb25maWcsXG4gICAgc3VtQ29uZmlnLFxuICAgIHRhbkNvbmZpZyxcbiAgICB0YW5oQ29uZmlnLFxuICAgIHRpbGVDb25maWcsXG4gICAgdG9wS0NvbmZpZyxcbiAgICB0cmFuc2Zvcm1Db25maWcsXG4gICAgdHJhbnNwb3NlQ29uZmlnLFxuICAgIHVucGFja0NvbmZpZyxcbiAgICB6ZXJvc0xpa2VDb25maWdcbl07XG5mb3IgKGNvbnN0IGtlcm5lbENvbmZpZyBvZiBrZXJuZWxDb25maWdzKSB7XG4gICAgcmVnaXN0ZXJLZXJuZWwoa2VybmVsQ29uZmlnKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlZ2lzdGVyX2FsbF9rZXJuZWxzLmpzLm1hcCIsIi8qKiBAbGljZW5zZSBTZWUgdGhlIExJQ0VOU0UgZmlsZS4gKi9cbi8vIFRoaXMgY29kZSBpcyBhdXRvLWdlbmVyYXRlZCwgZG8gbm90IG1vZGlmeSB0aGlzIGZpbGUhXG5jb25zdCB2ZXJzaW9uID0gJzMuOC4wJztcbmV4cG9ydCB7IHZlcnNpb24gfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZlcnNpb24uanMubWFwIiwiXG52YXIgV2FzbUJhY2tlbmRNb2R1bGVUaHJlYWRlZFNpbWQgPSAoZnVuY3Rpb24oKSB7XG4gIHZhciBfc2NyaXB0RGlyID0gdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBkb2N1bWVudC5jdXJyZW50U2NyaXB0ID8gZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMgOiB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2YgX19maWxlbmFtZSAhPT0gJ3VuZGVmaW5lZCcpIF9zY3JpcHREaXIgPSBfc2NyaXB0RGlyIHx8IF9fZmlsZW5hbWU7XG4gIHJldHVybiAoXG5mdW5jdGlvbihXYXNtQmFja2VuZE1vZHVsZVRocmVhZGVkU2ltZCkge1xuICBXYXNtQmFja2VuZE1vZHVsZVRocmVhZGVkU2ltZCA9IFdhc21CYWNrZW5kTW9kdWxlVGhyZWFkZWRTaW1kIHx8IHt9O1xuXG5mdW5jdGlvbiBHUk9XQUJMRV9IRUFQX0k4KCl7aWYod2FzbU1lbW9yeS5idWZmZXIhPWJ1ZmZlcil7dXBkYXRlR2xvYmFsQnVmZmVyQW5kVmlld3Mod2FzbU1lbW9yeS5idWZmZXIpfXJldHVybiBIRUFQOH1mdW5jdGlvbiBHUk9XQUJMRV9IRUFQX1U4KCl7aWYod2FzbU1lbW9yeS5idWZmZXIhPWJ1ZmZlcil7dXBkYXRlR2xvYmFsQnVmZmVyQW5kVmlld3Mod2FzbU1lbW9yeS5idWZmZXIpfXJldHVybiBIRUFQVTh9ZnVuY3Rpb24gR1JPV0FCTEVfSEVBUF9JMzIoKXtpZih3YXNtTWVtb3J5LmJ1ZmZlciE9YnVmZmVyKXt1cGRhdGVHbG9iYWxCdWZmZXJBbmRWaWV3cyh3YXNtTWVtb3J5LmJ1ZmZlcil9cmV0dXJuIEhFQVAzMn1mdW5jdGlvbiBHUk9XQUJMRV9IRUFQX1UzMigpe2lmKHdhc21NZW1vcnkuYnVmZmVyIT1idWZmZXIpe3VwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzKHdhc21NZW1vcnkuYnVmZmVyKX1yZXR1cm4gSEVBUFUzMn1mdW5jdGlvbiBHUk9XQUJMRV9IRUFQX0Y2NCgpe2lmKHdhc21NZW1vcnkuYnVmZmVyIT1idWZmZXIpe3VwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzKHdhc21NZW1vcnkuYnVmZmVyKX1yZXR1cm4gSEVBUEY2NH12YXIgTW9kdWxlPXR5cGVvZiBXYXNtQmFja2VuZE1vZHVsZVRocmVhZGVkU2ltZCE9PVwidW5kZWZpbmVkXCI/V2FzbUJhY2tlbmRNb2R1bGVUaHJlYWRlZFNpbWQ6e307dmFyIHJlYWR5UHJvbWlzZVJlc29sdmUscmVhZHlQcm9taXNlUmVqZWN0O01vZHVsZVtcInJlYWR5XCJdPW5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUscmVqZWN0KXtyZWFkeVByb21pc2VSZXNvbHZlPXJlc29sdmU7cmVhZHlQcm9taXNlUmVqZWN0PXJlamVjdH0pO3ZhciBtb2R1bGVPdmVycmlkZXM9e307dmFyIGtleTtmb3Ioa2V5IGluIE1vZHVsZSl7aWYoTW9kdWxlLmhhc093blByb3BlcnR5KGtleSkpe21vZHVsZU92ZXJyaWRlc1trZXldPU1vZHVsZVtrZXldfX12YXIgYXJndW1lbnRzXz1bXTt2YXIgdGhpc1Byb2dyYW09XCIuL3RoaXMucHJvZ3JhbVwiO3ZhciBxdWl0Xz1mdW5jdGlvbihzdGF0dXMsdG9UaHJvdyl7dGhyb3cgdG9UaHJvd307dmFyIEVOVklST05NRU5UX0lTX1dFQj1mYWxzZTt2YXIgRU5WSVJPTk1FTlRfSVNfV09SS0VSPWZhbHNlO3ZhciBFTlZJUk9OTUVOVF9JU19OT0RFPWZhbHNlO3ZhciBFTlZJUk9OTUVOVF9JU19TSEVMTD1mYWxzZTtFTlZJUk9OTUVOVF9JU19XRUI9dHlwZW9mIHdpbmRvdz09PVwib2JqZWN0XCI7RU5WSVJPTk1FTlRfSVNfV09SS0VSPXR5cGVvZiBpbXBvcnRTY3JpcHRzPT09XCJmdW5jdGlvblwiO0VOVklST05NRU5UX0lTX05PREU9dHlwZW9mIHByb2Nlc3M9PT1cIm9iamVjdFwiJiZ0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucz09PVwib2JqZWN0XCImJnR5cGVvZiBwcm9jZXNzLnZlcnNpb25zLm5vZGU9PT1cInN0cmluZ1wiO0VOVklST05NRU5UX0lTX1NIRUxMPSFFTlZJUk9OTUVOVF9JU19XRUImJiFFTlZJUk9OTUVOVF9JU19OT0RFJiYhRU5WSVJPTk1FTlRfSVNfV09SS0VSO3ZhciBFTlZJUk9OTUVOVF9JU19QVEhSRUFEPU1vZHVsZVtcIkVOVklST05NRU5UX0lTX1BUSFJFQURcIl18fGZhbHNlO2lmKEVOVklST05NRU5UX0lTX1BUSFJFQUQpe2J1ZmZlcj1Nb2R1bGVbXCJidWZmZXJcIl19dmFyIHNjcmlwdERpcmVjdG9yeT1cIlwiO2Z1bmN0aW9uIGxvY2F0ZUZpbGUocGF0aCl7aWYoTW9kdWxlW1wibG9jYXRlRmlsZVwiXSl7cmV0dXJuIE1vZHVsZVtcImxvY2F0ZUZpbGVcIl0ocGF0aCxzY3JpcHREaXJlY3RvcnkpfXJldHVybiBzY3JpcHREaXJlY3RvcnkrcGF0aH12YXIgcmVhZF8scmVhZEFzeW5jLHJlYWRCaW5hcnksc2V0V2luZG93VGl0bGU7dmFyIG5vZGVGUzt2YXIgbm9kZVBhdGg7aWYoRU5WSVJPTk1FTlRfSVNfTk9ERSl7aWYoRU5WSVJPTk1FTlRfSVNfV09SS0VSKXtzY3JpcHREaXJlY3Rvcnk9cmVxdWlyZShcInBhdGhcIikuZGlybmFtZShzY3JpcHREaXJlY3RvcnkpK1wiL1wifWVsc2V7c2NyaXB0RGlyZWN0b3J5PV9fZGlybmFtZStcIi9cIn1yZWFkXz1mdW5jdGlvbiBzaGVsbF9yZWFkKGZpbGVuYW1lLGJpbmFyeSl7aWYoIW5vZGVGUylub2RlRlM9cmVxdWlyZShcImZzXCIpO2lmKCFub2RlUGF0aClub2RlUGF0aD1yZXF1aXJlKFwicGF0aFwiKTtmaWxlbmFtZT1ub2RlUGF0aFtcIm5vcm1hbGl6ZVwiXShmaWxlbmFtZSk7cmV0dXJuIG5vZGVGU1tcInJlYWRGaWxlU3luY1wiXShmaWxlbmFtZSxiaW5hcnk/bnVsbDpcInV0ZjhcIil9O3JlYWRCaW5hcnk9ZnVuY3Rpb24gcmVhZEJpbmFyeShmaWxlbmFtZSl7dmFyIHJldD1yZWFkXyhmaWxlbmFtZSx0cnVlKTtpZighcmV0LmJ1ZmZlcil7cmV0PW5ldyBVaW50OEFycmF5KHJldCl9YXNzZXJ0KHJldC5idWZmZXIpO3JldHVybiByZXR9O2lmKHByb2Nlc3NbXCJhcmd2XCJdLmxlbmd0aD4xKXt0aGlzUHJvZ3JhbT1wcm9jZXNzW1wiYXJndlwiXVsxXS5yZXBsYWNlKC9cXFxcL2csXCIvXCIpfWFyZ3VtZW50c189cHJvY2Vzc1tcImFyZ3ZcIl0uc2xpY2UoMik7cHJvY2Vzc1tcIm9uXCJdKFwidW5jYXVnaHRFeGNlcHRpb25cIixmdW5jdGlvbihleCl7aWYoIShleCBpbnN0YW5jZW9mIEV4aXRTdGF0dXMpKXt0aHJvdyBleH19KTtwcm9jZXNzW1wib25cIl0oXCJ1bmhhbmRsZWRSZWplY3Rpb25cIixhYm9ydCk7cXVpdF89ZnVuY3Rpb24oc3RhdHVzKXtwcm9jZXNzW1wiZXhpdFwiXShzdGF0dXMpfTtNb2R1bGVbXCJpbnNwZWN0XCJdPWZ1bmN0aW9uKCl7cmV0dXJuXCJbRW1zY3JpcHRlbiBNb2R1bGUgb2JqZWN0XVwifTt2YXIgbm9kZVdvcmtlclRocmVhZHM7dHJ5e25vZGVXb3JrZXJUaHJlYWRzPXJlcXVpcmUoXCJ3b3JrZXJfdGhyZWFkc1wiKX1jYXRjaChlKXtjb25zb2xlLmVycm9yKCdUaGUgXCJ3b3JrZXJfdGhyZWFkc1wiIG1vZHVsZSBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgbm9kZS5qcyBidWlsZCAtIHBlcmhhcHMgYSBuZXdlciB2ZXJzaW9uIGlzIG5lZWRlZD8nKTt0aHJvdyBlfWdsb2JhbC5Xb3JrZXI9bm9kZVdvcmtlclRocmVhZHMuV29ya2VyfWVsc2UgaWYoRU5WSVJPTk1FTlRfSVNfU0hFTEwpe2lmKHR5cGVvZiByZWFkIT1cInVuZGVmaW5lZFwiKXtyZWFkXz1mdW5jdGlvbiBzaGVsbF9yZWFkKGYpe3JldHVybiByZWFkKGYpfX1yZWFkQmluYXJ5PWZ1bmN0aW9uIHJlYWRCaW5hcnkoZil7dmFyIGRhdGE7aWYodHlwZW9mIHJlYWRidWZmZXI9PT1cImZ1bmN0aW9uXCIpe3JldHVybiBuZXcgVWludDhBcnJheShyZWFkYnVmZmVyKGYpKX1kYXRhPXJlYWQoZixcImJpbmFyeVwiKTthc3NlcnQodHlwZW9mIGRhdGE9PT1cIm9iamVjdFwiKTtyZXR1cm4gZGF0YX07aWYodHlwZW9mIHNjcmlwdEFyZ3MhPVwidW5kZWZpbmVkXCIpe2FyZ3VtZW50c189c2NyaXB0QXJnc31lbHNlIGlmKHR5cGVvZiBhcmd1bWVudHMhPVwidW5kZWZpbmVkXCIpe2FyZ3VtZW50c189YXJndW1lbnRzfWlmKHR5cGVvZiBxdWl0PT09XCJmdW5jdGlvblwiKXtxdWl0Xz1mdW5jdGlvbihzdGF0dXMpe3F1aXQoc3RhdHVzKX19aWYodHlwZW9mIHByaW50IT09XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGNvbnNvbGU9PT1cInVuZGVmaW5lZFwiKWNvbnNvbGU9e307Y29uc29sZS5sb2c9cHJpbnQ7Y29uc29sZS53YXJuPWNvbnNvbGUuZXJyb3I9dHlwZW9mIHByaW50RXJyIT09XCJ1bmRlZmluZWRcIj9wcmludEVycjpwcmludH19ZWxzZSBpZihFTlZJUk9OTUVOVF9JU19XRUJ8fEVOVklST05NRU5UX0lTX1dPUktFUil7aWYoRU5WSVJPTk1FTlRfSVNfV09SS0VSKXtzY3JpcHREaXJlY3Rvcnk9c2VsZi5sb2NhdGlvbi5ocmVmfWVsc2UgaWYodHlwZW9mIGRvY3VtZW50IT09XCJ1bmRlZmluZWRcIiYmZG9jdW1lbnQuY3VycmVudFNjcmlwdCl7c2NyaXB0RGlyZWN0b3J5PWRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjfWlmKHR5cGVvZiBfc2NyaXB0RGlyICE9PSBcInVuZGVmaW5lZFwiICYmIF9zY3JpcHREaXIpe3NjcmlwdERpcmVjdG9yeT1fc2NyaXB0RGlyfWlmKHNjcmlwdERpcmVjdG9yeS5pbmRleE9mKFwiYmxvYjpcIikhPT0wKXtzY3JpcHREaXJlY3Rvcnk9c2NyaXB0RGlyZWN0b3J5LnN1YnN0cigwLHNjcmlwdERpcmVjdG9yeS5sYXN0SW5kZXhPZihcIi9cIikrMSl9ZWxzZXtzY3JpcHREaXJlY3Rvcnk9XCJcIn1pZihFTlZJUk9OTUVOVF9JU19OT0RFKXtyZWFkXz1mdW5jdGlvbiBzaGVsbF9yZWFkKGZpbGVuYW1lLGJpbmFyeSl7aWYoIW5vZGVGUylub2RlRlM9cmVxdWlyZShcImZzXCIpO2lmKCFub2RlUGF0aClub2RlUGF0aD1yZXF1aXJlKFwicGF0aFwiKTtmaWxlbmFtZT1ub2RlUGF0aFtcIm5vcm1hbGl6ZVwiXShmaWxlbmFtZSk7cmV0dXJuIG5vZGVGU1tcInJlYWRGaWxlU3luY1wiXShmaWxlbmFtZSxiaW5hcnk/bnVsbDpcInV0ZjhcIil9O3JlYWRCaW5hcnk9ZnVuY3Rpb24gcmVhZEJpbmFyeShmaWxlbmFtZSl7dmFyIHJldD1yZWFkXyhmaWxlbmFtZSx0cnVlKTtpZighcmV0LmJ1ZmZlcil7cmV0PW5ldyBVaW50OEFycmF5KHJldCl9YXNzZXJ0KHJldC5idWZmZXIpO3JldHVybiByZXR9fWVsc2V7cmVhZF89ZnVuY3Rpb24odXJsKXt2YXIgeGhyPW5ldyBYTUxIdHRwUmVxdWVzdDt4aHIub3BlbihcIkdFVFwiLHVybCxmYWxzZSk7eGhyLnNlbmQobnVsbCk7cmV0dXJuIHhoci5yZXNwb25zZVRleHR9O2lmKEVOVklST05NRU5UX0lTX1dPUktFUil7cmVhZEJpbmFyeT1mdW5jdGlvbih1cmwpe3ZhciB4aHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3hoci5vcGVuKFwiR0VUXCIsdXJsLGZhbHNlKTt4aHIucmVzcG9uc2VUeXBlPVwiYXJyYXlidWZmZXJcIjt4aHIuc2VuZChudWxsKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoeGhyLnJlc3BvbnNlKX19cmVhZEFzeW5jPWZ1bmN0aW9uKHVybCxvbmxvYWQsb25lcnJvcil7dmFyIHhocj1uZXcgWE1MSHR0cFJlcXVlc3Q7eGhyLm9wZW4oXCJHRVRcIix1cmwsdHJ1ZSk7eGhyLnJlc3BvbnNlVHlwZT1cImFycmF5YnVmZmVyXCI7eGhyLm9ubG9hZD1mdW5jdGlvbigpe2lmKHhoci5zdGF0dXM9PTIwMHx8eGhyLnN0YXR1cz09MCYmeGhyLnJlc3BvbnNlKXtvbmxvYWQoeGhyLnJlc3BvbnNlKTtyZXR1cm59b25lcnJvcigpfTt4aHIub25lcnJvcj1vbmVycm9yO3hoci5zZW5kKG51bGwpfX1zZXRXaW5kb3dUaXRsZT1mdW5jdGlvbih0aXRsZSl7ZG9jdW1lbnQudGl0bGU9dGl0bGV9fWVsc2V7fWlmKEVOVklST05NRU5UX0lTX05PREUpe2lmKHR5cGVvZiBwZXJmb3JtYW5jZT09PVwidW5kZWZpbmVkXCIpe2dsb2JhbC5wZXJmb3JtYW5jZT1yZXF1aXJlKFwicGVyZl9ob29rc1wiKS5wZXJmb3JtYW5jZX19dmFyIG91dD1Nb2R1bGVbXCJwcmludFwiXXx8Y29uc29sZS5sb2cuYmluZChjb25zb2xlKTt2YXIgZXJyPU1vZHVsZVtcInByaW50RXJyXCJdfHxjb25zb2xlLndhcm4uYmluZChjb25zb2xlKTtmb3Ioa2V5IGluIG1vZHVsZU92ZXJyaWRlcyl7aWYobW9kdWxlT3ZlcnJpZGVzLmhhc093blByb3BlcnR5KGtleSkpe01vZHVsZVtrZXldPW1vZHVsZU92ZXJyaWRlc1trZXldfX1tb2R1bGVPdmVycmlkZXM9bnVsbDtpZihNb2R1bGVbXCJhcmd1bWVudHNcIl0pYXJndW1lbnRzXz1Nb2R1bGVbXCJhcmd1bWVudHNcIl07aWYoTW9kdWxlW1widGhpc1Byb2dyYW1cIl0pdGhpc1Byb2dyYW09TW9kdWxlW1widGhpc1Byb2dyYW1cIl07aWYoTW9kdWxlW1wicXVpdFwiXSlxdWl0Xz1Nb2R1bGVbXCJxdWl0XCJdO3ZhciBBdG9taWNzX2xvYWQ9QXRvbWljcy5sb2FkO3ZhciBBdG9taWNzX3N0b3JlPUF0b21pY3Muc3RvcmU7dmFyIEF0b21pY3NfY29tcGFyZUV4Y2hhbmdlPUF0b21pY3MuY29tcGFyZUV4Y2hhbmdlO3ZhciB3YXNtQmluYXJ5O2lmKE1vZHVsZVtcIndhc21CaW5hcnlcIl0pd2FzbUJpbmFyeT1Nb2R1bGVbXCJ3YXNtQmluYXJ5XCJdO3ZhciBub0V4aXRSdW50aW1lPU1vZHVsZVtcIm5vRXhpdFJ1bnRpbWVcIl18fHRydWU7aWYodHlwZW9mIFdlYkFzc2VtYmx5IT09XCJvYmplY3RcIil7YWJvcnQoXCJubyBuYXRpdmUgd2FzbSBzdXBwb3J0IGRldGVjdGVkXCIpfXZhciB3YXNtTWVtb3J5O3ZhciB3YXNtTW9kdWxlO3ZhciBBQk9SVD1mYWxzZTt2YXIgRVhJVFNUQVRVUztmdW5jdGlvbiBhc3NlcnQoY29uZGl0aW9uLHRleHQpe2lmKCFjb25kaXRpb24pe2Fib3J0KFwiQXNzZXJ0aW9uIGZhaWxlZDogXCIrdGV4dCl9fWZ1bmN0aW9uIGdldENGdW5jKGlkZW50KXt2YXIgZnVuYz1Nb2R1bGVbXCJfXCIraWRlbnRdO2Fzc2VydChmdW5jLFwiQ2Fubm90IGNhbGwgdW5rbm93biBmdW5jdGlvbiBcIitpZGVudCtcIiwgbWFrZSBzdXJlIGl0IGlzIGV4cG9ydGVkXCIpO3JldHVybiBmdW5jfWZ1bmN0aW9uIGNjYWxsKGlkZW50LHJldHVyblR5cGUsYXJnVHlwZXMsYXJncyxvcHRzKXt2YXIgdG9DPXtcInN0cmluZ1wiOmZ1bmN0aW9uKHN0cil7dmFyIHJldD0wO2lmKHN0ciE9PW51bGwmJnN0ciE9PXVuZGVmaW5lZCYmc3RyIT09MCl7dmFyIGxlbj0oc3RyLmxlbmd0aDw8MikrMTtyZXQ9c3RhY2tBbGxvYyhsZW4pO3N0cmluZ1RvVVRGOChzdHIscmV0LGxlbil9cmV0dXJuIHJldH0sXCJhcnJheVwiOmZ1bmN0aW9uKGFycil7dmFyIHJldD1zdGFja0FsbG9jKGFyci5sZW5ndGgpO3dyaXRlQXJyYXlUb01lbW9yeShhcnIscmV0KTtyZXR1cm4gcmV0fX07ZnVuY3Rpb24gY29udmVydFJldHVyblZhbHVlKHJldCl7aWYocmV0dXJuVHlwZT09PVwic3RyaW5nXCIpcmV0dXJuIFVURjhUb1N0cmluZyhyZXQpO2lmKHJldHVyblR5cGU9PT1cImJvb2xlYW5cIilyZXR1cm4gQm9vbGVhbihyZXQpO3JldHVybiByZXR9dmFyIGZ1bmM9Z2V0Q0Z1bmMoaWRlbnQpO3ZhciBjQXJncz1bXTt2YXIgc3RhY2s9MDtpZihhcmdzKXtmb3IodmFyIGk9MDtpPGFyZ3MubGVuZ3RoO2krKyl7dmFyIGNvbnZlcnRlcj10b0NbYXJnVHlwZXNbaV1dO2lmKGNvbnZlcnRlcil7aWYoc3RhY2s9PT0wKXN0YWNrPXN0YWNrU2F2ZSgpO2NBcmdzW2ldPWNvbnZlcnRlcihhcmdzW2ldKX1lbHNle2NBcmdzW2ldPWFyZ3NbaV19fX12YXIgcmV0PWZ1bmMuYXBwbHkobnVsbCxjQXJncyk7cmV0PWNvbnZlcnRSZXR1cm5WYWx1ZShyZXQpO2lmKHN0YWNrIT09MClzdGFja1Jlc3RvcmUoc3RhY2spO3JldHVybiByZXR9ZnVuY3Rpb24gY3dyYXAoaWRlbnQscmV0dXJuVHlwZSxhcmdUeXBlcyxvcHRzKXthcmdUeXBlcz1hcmdUeXBlc3x8W107dmFyIG51bWVyaWNBcmdzPWFyZ1R5cGVzLmV2ZXJ5KGZ1bmN0aW9uKHR5cGUpe3JldHVybiB0eXBlPT09XCJudW1iZXJcIn0pO3ZhciBudW1lcmljUmV0PXJldHVyblR5cGUhPT1cInN0cmluZ1wiO2lmKG51bWVyaWNSZXQmJm51bWVyaWNBcmdzJiYhb3B0cyl7cmV0dXJuIGdldENGdW5jKGlkZW50KX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gY2NhbGwoaWRlbnQscmV0dXJuVHlwZSxhcmdUeXBlcyxhcmd1bWVudHMsb3B0cyl9fWZ1bmN0aW9uIFVURjhBcnJheVRvU3RyaW5nKGhlYXAsaWR4LG1heEJ5dGVzVG9SZWFkKXt2YXIgZW5kSWR4PWlkeCttYXhCeXRlc1RvUmVhZDt2YXIgc3RyPVwiXCI7d2hpbGUoIShpZHg+PWVuZElkeCkpe3ZhciB1MD1oZWFwW2lkeCsrXTtpZighdTApcmV0dXJuIHN0cjtpZighKHUwJjEyOCkpe3N0cis9U3RyaW5nLmZyb21DaGFyQ29kZSh1MCk7Y29udGludWV9dmFyIHUxPWhlYXBbaWR4KytdJjYzO2lmKCh1MCYyMjQpPT0xOTIpe3N0cis9U3RyaW5nLmZyb21DaGFyQ29kZSgodTAmMzEpPDw2fHUxKTtjb250aW51ZX12YXIgdTI9aGVhcFtpZHgrK10mNjM7aWYoKHUwJjI0MCk9PTIyNCl7dTA9KHUwJjE1KTw8MTJ8dTE8PDZ8dTJ9ZWxzZXt1MD0odTAmNyk8PDE4fHUxPDwxMnx1Mjw8NnxoZWFwW2lkeCsrXSY2M31pZih1MDw2NTUzNil7c3RyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHUwKX1lbHNle3ZhciBjaD11MC02NTUzNjtzdHIrPVN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTZ8Y2g+PjEwLDU2MzIwfGNoJjEwMjMpfX1yZXR1cm4gc3RyfWZ1bmN0aW9uIFVURjhUb1N0cmluZyhwdHIsbWF4Qnl0ZXNUb1JlYWQpe3JldHVybiBwdHI/VVRGOEFycmF5VG9TdHJpbmcoR1JPV0FCTEVfSEVBUF9VOCgpLHB0cixtYXhCeXRlc1RvUmVhZCk6XCJcIn1mdW5jdGlvbiBzdHJpbmdUb1VURjhBcnJheShzdHIsaGVhcCxvdXRJZHgsbWF4Qnl0ZXNUb1dyaXRlKXtpZighKG1heEJ5dGVzVG9Xcml0ZT4wKSlyZXR1cm4gMDt2YXIgc3RhcnRJZHg9b3V0SWR4O3ZhciBlbmRJZHg9b3V0SWR4K21heEJ5dGVzVG9Xcml0ZS0xO2Zvcih2YXIgaT0wO2k8c3RyLmxlbmd0aDsrK2kpe3ZhciB1PXN0ci5jaGFyQ29kZUF0KGkpO2lmKHU+PTU1Mjk2JiZ1PD01NzM0Myl7dmFyIHUxPXN0ci5jaGFyQ29kZUF0KCsraSk7dT02NTUzNisoKHUmMTAyMyk8PDEwKXx1MSYxMDIzfWlmKHU8PTEyNyl7aWYob3V0SWR4Pj1lbmRJZHgpYnJlYWs7aGVhcFtvdXRJZHgrK109dX1lbHNlIGlmKHU8PTIwNDcpe2lmKG91dElkeCsxPj1lbmRJZHgpYnJlYWs7aGVhcFtvdXRJZHgrK109MTkyfHU+PjY7aGVhcFtvdXRJZHgrK109MTI4fHUmNjN9ZWxzZSBpZih1PD02NTUzNSl7aWYob3V0SWR4KzI+PWVuZElkeClicmVhaztoZWFwW291dElkeCsrXT0yMjR8dT4+MTI7aGVhcFtvdXRJZHgrK109MTI4fHU+PjYmNjM7aGVhcFtvdXRJZHgrK109MTI4fHUmNjN9ZWxzZXtpZihvdXRJZHgrMz49ZW5kSWR4KWJyZWFrO2hlYXBbb3V0SWR4KytdPTI0MHx1Pj4xODtoZWFwW291dElkeCsrXT0xMjh8dT4+MTImNjM7aGVhcFtvdXRJZHgrK109MTI4fHU+PjYmNjM7aGVhcFtvdXRJZHgrK109MTI4fHUmNjN9fWhlYXBbb3V0SWR4XT0wO3JldHVybiBvdXRJZHgtc3RhcnRJZHh9ZnVuY3Rpb24gc3RyaW5nVG9VVEY4KHN0cixvdXRQdHIsbWF4Qnl0ZXNUb1dyaXRlKXtyZXR1cm4gc3RyaW5nVG9VVEY4QXJyYXkoc3RyLEdST1dBQkxFX0hFQVBfVTgoKSxvdXRQdHIsbWF4Qnl0ZXNUb1dyaXRlKX1mdW5jdGlvbiBsZW5ndGhCeXRlc1VURjgoc3RyKXt2YXIgbGVuPTA7Zm9yKHZhciBpPTA7aTxzdHIubGVuZ3RoOysraSl7dmFyIHU9c3RyLmNoYXJDb2RlQXQoaSk7aWYodT49NTUyOTYmJnU8PTU3MzQzKXU9NjU1MzYrKCh1JjEwMjMpPDwxMCl8c3RyLmNoYXJDb2RlQXQoKytpKSYxMDIzO2lmKHU8PTEyNykrK2xlbjtlbHNlIGlmKHU8PTIwNDcpbGVuKz0yO2Vsc2UgaWYodTw9NjU1MzUpbGVuKz0zO2Vsc2UgbGVuKz00fXJldHVybiBsZW59ZnVuY3Rpb24gd3JpdGVBcnJheVRvTWVtb3J5KGFycmF5LGJ1ZmZlcil7R1JPV0FCTEVfSEVBUF9JOCgpLnNldChhcnJheSxidWZmZXIpfWZ1bmN0aW9uIGFsaWduVXAoeCxtdWx0aXBsZSl7aWYoeCVtdWx0aXBsZT4wKXt4Kz1tdWx0aXBsZS14JW11bHRpcGxlfXJldHVybiB4fXZhciBidWZmZXIsSEVBUDgsSEVBUFU4LEhFQVAxNixIRUFQVTE2LEhFQVAzMixIRUFQVTMyLEhFQVBGMzIsSEVBUEY2NDtmdW5jdGlvbiB1cGRhdGVHbG9iYWxCdWZmZXJBbmRWaWV3cyhidWYpe2J1ZmZlcj1idWY7TW9kdWxlW1wiSEVBUDhcIl09SEVBUDg9bmV3IEludDhBcnJheShidWYpO01vZHVsZVtcIkhFQVAxNlwiXT1IRUFQMTY9bmV3IEludDE2QXJyYXkoYnVmKTtNb2R1bGVbXCJIRUFQMzJcIl09SEVBUDMyPW5ldyBJbnQzMkFycmF5KGJ1Zik7TW9kdWxlW1wiSEVBUFU4XCJdPUhFQVBVOD1uZXcgVWludDhBcnJheShidWYpO01vZHVsZVtcIkhFQVBVMTZcIl09SEVBUFUxNj1uZXcgVWludDE2QXJyYXkoYnVmKTtNb2R1bGVbXCJIRUFQVTMyXCJdPUhFQVBVMzI9bmV3IFVpbnQzMkFycmF5KGJ1Zik7TW9kdWxlW1wiSEVBUEYzMlwiXT1IRUFQRjMyPW5ldyBGbG9hdDMyQXJyYXkoYnVmKTtNb2R1bGVbXCJIRUFQRjY0XCJdPUhFQVBGNjQ9bmV3IEZsb2F0NjRBcnJheShidWYpfXZhciBJTklUSUFMX01FTU9SWT1Nb2R1bGVbXCJJTklUSUFMX01FTU9SWVwiXXx8MTY3NzcyMTY7aWYoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRCl7d2FzbU1lbW9yeT1Nb2R1bGVbXCJ3YXNtTWVtb3J5XCJdO2J1ZmZlcj1Nb2R1bGVbXCJidWZmZXJcIl19ZWxzZXtpZihNb2R1bGVbXCJ3YXNtTWVtb3J5XCJdKXt3YXNtTWVtb3J5PU1vZHVsZVtcIndhc21NZW1vcnlcIl19ZWxzZXt3YXNtTWVtb3J5PW5ldyBXZWJBc3NlbWJseS5NZW1vcnkoe1wiaW5pdGlhbFwiOklOSVRJQUxfTUVNT1JZLzY1NTM2LFwibWF4aW11bVwiOjIxNDc0ODM2NDgvNjU1MzYsXCJzaGFyZWRcIjp0cnVlfSk7aWYoISh3YXNtTWVtb3J5LmJ1ZmZlciBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyKSl7ZXJyKFwicmVxdWVzdGVkIGEgc2hhcmVkIFdlYkFzc2VtYmx5Lk1lbW9yeSBidXQgdGhlIHJldHVybmVkIGJ1ZmZlciBpcyBub3QgYSBTaGFyZWRBcnJheUJ1ZmZlciwgaW5kaWNhdGluZyB0aGF0IHdoaWxlIHRoZSBicm93c2VyIGhhcyBTaGFyZWRBcnJheUJ1ZmZlciBpdCBkb2VzIG5vdCBoYXZlIFdlYkFzc2VtYmx5IHRocmVhZHMgc3VwcG9ydCAtIHlvdSBtYXkgbmVlZCB0byBzZXQgYSBmbGFnXCIpO2lmKEVOVklST05NRU5UX0lTX05PREUpe2NvbnNvbGUubG9nKFwiKG9uIG5vZGUgeW91IG1heSBuZWVkOiAtLWV4cGVyaW1lbnRhbC13YXNtLXRocmVhZHMgLS1leHBlcmltZW50YWwtd2FzbS1idWxrLW1lbW9yeSBhbmQgYWxzbyB1c2UgYSByZWNlbnQgdmVyc2lvbilcIil9dGhyb3cgRXJyb3IoXCJiYWQgbWVtb3J5XCIpfX19aWYod2FzbU1lbW9yeSl7YnVmZmVyPXdhc21NZW1vcnkuYnVmZmVyfUlOSVRJQUxfTUVNT1JZPWJ1ZmZlci5ieXRlTGVuZ3RoO3VwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzKGJ1ZmZlcik7dmFyIHdhc21UYWJsZTt2YXIgX19BVFBSRVJVTl9fPVtdO3ZhciBfX0FUSU5JVF9fPVtdO3ZhciBfX0FUTUFJTl9fPVtdO3ZhciBfX0FURVhJVF9fPVtdO3ZhciBfX0FUUE9TVFJVTl9fPVtdO3ZhciBydW50aW1lSW5pdGlhbGl6ZWQ9ZmFsc2U7dmFyIHJ1bnRpbWVFeGl0ZWQ9ZmFsc2U7aWYoIUVOVklST05NRU5UX0lTX1BUSFJFQUQpX19BVElOSVRfXy5wdXNoKHtmdW5jOmZ1bmN0aW9uKCl7X19fd2FzbV9jYWxsX2N0b3JzKCl9fSk7ZnVuY3Rpb24gcHJlUnVuKCl7aWYoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRClyZXR1cm47aWYoTW9kdWxlW1wicHJlUnVuXCJdKXtpZih0eXBlb2YgTW9kdWxlW1wicHJlUnVuXCJdPT1cImZ1bmN0aW9uXCIpTW9kdWxlW1wicHJlUnVuXCJdPVtNb2R1bGVbXCJwcmVSdW5cIl1dO3doaWxlKE1vZHVsZVtcInByZVJ1blwiXS5sZW5ndGgpe2FkZE9uUHJlUnVuKE1vZHVsZVtcInByZVJ1blwiXS5zaGlmdCgpKX19Y2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVFBSRVJVTl9fKX1mdW5jdGlvbiBpbml0UnVudGltZSgpe3J1bnRpbWVJbml0aWFsaXplZD10cnVlO2lmKEVOVklST05NRU5UX0lTX1BUSFJFQUQpcmV0dXJuO2NhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRJTklUX18pfWZ1bmN0aW9uIHByZU1haW4oKXtpZihFTlZJUk9OTUVOVF9JU19QVEhSRUFEKXJldHVybjtjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUTUFJTl9fKX1mdW5jdGlvbiBleGl0UnVudGltZSgpe2lmKEVOVklST05NRU5UX0lTX1BUSFJFQUQpcmV0dXJuO3J1bnRpbWVFeGl0ZWQ9dHJ1ZX1mdW5jdGlvbiBwb3N0UnVuKCl7aWYoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRClyZXR1cm47aWYoTW9kdWxlW1wicG9zdFJ1blwiXSl7aWYodHlwZW9mIE1vZHVsZVtcInBvc3RSdW5cIl09PVwiZnVuY3Rpb25cIilNb2R1bGVbXCJwb3N0UnVuXCJdPVtNb2R1bGVbXCJwb3N0UnVuXCJdXTt3aGlsZShNb2R1bGVbXCJwb3N0UnVuXCJdLmxlbmd0aCl7YWRkT25Qb3N0UnVuKE1vZHVsZVtcInBvc3RSdW5cIl0uc2hpZnQoKSl9fWNhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRQT1NUUlVOX18pfWZ1bmN0aW9uIGFkZE9uUHJlUnVuKGNiKXtfX0FUUFJFUlVOX18udW5zaGlmdChjYil9ZnVuY3Rpb24gYWRkT25Qb3N0UnVuKGNiKXtfX0FUUE9TVFJVTl9fLnVuc2hpZnQoY2IpfXZhciBydW5EZXBlbmRlbmNpZXM9MDt2YXIgcnVuRGVwZW5kZW5jeVdhdGNoZXI9bnVsbDt2YXIgZGVwZW5kZW5jaWVzRnVsZmlsbGVkPW51bGw7ZnVuY3Rpb24gYWRkUnVuRGVwZW5kZW5jeShpZCl7YXNzZXJ0KCFFTlZJUk9OTUVOVF9JU19QVEhSRUFELFwiYWRkUnVuRGVwZW5kZW5jeSBjYW5ub3QgYmUgdXNlZCBpbiBhIHB0aHJlYWQgd29ya2VyXCIpO3J1bkRlcGVuZGVuY2llcysrO2lmKE1vZHVsZVtcIm1vbml0b3JSdW5EZXBlbmRlbmNpZXNcIl0pe01vZHVsZVtcIm1vbml0b3JSdW5EZXBlbmRlbmNpZXNcIl0ocnVuRGVwZW5kZW5jaWVzKX19ZnVuY3Rpb24gcmVtb3ZlUnVuRGVwZW5kZW5jeShpZCl7cnVuRGVwZW5kZW5jaWVzLS07aWYoTW9kdWxlW1wibW9uaXRvclJ1bkRlcGVuZGVuY2llc1wiXSl7TW9kdWxlW1wibW9uaXRvclJ1bkRlcGVuZGVuY2llc1wiXShydW5EZXBlbmRlbmNpZXMpfWlmKHJ1bkRlcGVuZGVuY2llcz09MCl7aWYocnVuRGVwZW5kZW5jeVdhdGNoZXIhPT1udWxsKXtjbGVhckludGVydmFsKHJ1bkRlcGVuZGVuY3lXYXRjaGVyKTtydW5EZXBlbmRlbmN5V2F0Y2hlcj1udWxsfWlmKGRlcGVuZGVuY2llc0Z1bGZpbGxlZCl7dmFyIGNhbGxiYWNrPWRlcGVuZGVuY2llc0Z1bGZpbGxlZDtkZXBlbmRlbmNpZXNGdWxmaWxsZWQ9bnVsbDtjYWxsYmFjaygpfX19TW9kdWxlW1wicHJlbG9hZGVkSW1hZ2VzXCJdPXt9O01vZHVsZVtcInByZWxvYWRlZEF1ZGlvc1wiXT17fTtmdW5jdGlvbiBhYm9ydCh3aGF0KXtpZihNb2R1bGVbXCJvbkFib3J0XCJdKXtNb2R1bGVbXCJvbkFib3J0XCJdKHdoYXQpfWlmKEVOVklST05NRU5UX0lTX1BUSFJFQUQpY29uc29sZS5lcnJvcihcIlB0aHJlYWQgYWJvcnRpbmcgYXQgXCIrKG5ldyBFcnJvcikuc3RhY2spO3doYXQrPVwiXCI7ZXJyKHdoYXQpO0FCT1JUPXRydWU7RVhJVFNUQVRVUz0xO3doYXQ9XCJhYm9ydChcIit3aGF0K1wiKS4gQnVpbGQgd2l0aCAtcyBBU1NFUlRJT05TPTEgZm9yIG1vcmUgaW5mby5cIjt2YXIgZT1uZXcgV2ViQXNzZW1ibHkuUnVudGltZUVycm9yKHdoYXQpO3JlYWR5UHJvbWlzZVJlamVjdChlKTt0aHJvdyBlfWZ1bmN0aW9uIGhhc1ByZWZpeChzdHIscHJlZml4KXtyZXR1cm4gU3RyaW5nLnByb3RvdHlwZS5zdGFydHNXaXRoP3N0ci5zdGFydHNXaXRoKHByZWZpeCk6c3RyLmluZGV4T2YocHJlZml4KT09PTB9dmFyIGRhdGFVUklQcmVmaXg9XCJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsXCI7ZnVuY3Rpb24gaXNEYXRhVVJJKGZpbGVuYW1lKXtyZXR1cm4gaGFzUHJlZml4KGZpbGVuYW1lLGRhdGFVUklQcmVmaXgpfXZhciBmaWxlVVJJUHJlZml4PVwiZmlsZTovL1wiO2Z1bmN0aW9uIGlzRmlsZVVSSShmaWxlbmFtZSl7cmV0dXJuIGhhc1ByZWZpeChmaWxlbmFtZSxmaWxlVVJJUHJlZml4KX12YXIgd2FzbUJpbmFyeUZpbGU9XCJ0ZmpzLWJhY2tlbmQtd2FzbS10aHJlYWRlZC1zaW1kLndhc21cIjtpZighaXNEYXRhVVJJKHdhc21CaW5hcnlGaWxlKSl7d2FzbUJpbmFyeUZpbGU9bG9jYXRlRmlsZSh3YXNtQmluYXJ5RmlsZSl9ZnVuY3Rpb24gZ2V0QmluYXJ5KGZpbGUpe3RyeXtpZihmaWxlPT13YXNtQmluYXJ5RmlsZSYmd2FzbUJpbmFyeSl7cmV0dXJuIG5ldyBVaW50OEFycmF5KHdhc21CaW5hcnkpfWlmKHJlYWRCaW5hcnkpe3JldHVybiByZWFkQmluYXJ5KGZpbGUpfWVsc2V7dGhyb3dcImJvdGggYXN5bmMgYW5kIHN5bmMgZmV0Y2hpbmcgb2YgdGhlIHdhc20gZmFpbGVkXCJ9fWNhdGNoKGVycil7YWJvcnQoZXJyKX19ZnVuY3Rpb24gZ2V0QmluYXJ5UHJvbWlzZSgpe2lmKCF3YXNtQmluYXJ5JiYoRU5WSVJPTk1FTlRfSVNfV0VCfHxFTlZJUk9OTUVOVF9JU19XT1JLRVIpKXtpZih0eXBlb2YgZmV0Y2g9PT1cImZ1bmN0aW9uXCImJiFpc0ZpbGVVUkkod2FzbUJpbmFyeUZpbGUpKXtyZXR1cm4gZmV0Y2god2FzbUJpbmFyeUZpbGUse2NyZWRlbnRpYWxzOlwic2FtZS1vcmlnaW5cIn0pLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2Upe2lmKCFyZXNwb25zZVtcIm9rXCJdKXt0aHJvd1wiZmFpbGVkIHRvIGxvYWQgd2FzbSBiaW5hcnkgZmlsZSBhdCAnXCIrd2FzbUJpbmFyeUZpbGUrXCInXCJ9cmV0dXJuIHJlc3BvbnNlW1wiYXJyYXlCdWZmZXJcIl0oKX0pLmNhdGNoKGZ1bmN0aW9uKCl7cmV0dXJuIGdldEJpbmFyeSh3YXNtQmluYXJ5RmlsZSl9KX1lbHNle2lmKHJlYWRBc3luYyl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUscmVqZWN0KXtyZWFkQXN5bmMod2FzbUJpbmFyeUZpbGUsZnVuY3Rpb24ocmVzcG9uc2Upe3Jlc29sdmUobmV3IFVpbnQ4QXJyYXkocmVzcG9uc2UpKX0scmVqZWN0KX0pfX19cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gZ2V0QmluYXJ5KHdhc21CaW5hcnlGaWxlKX0pfWZ1bmN0aW9uIGNyZWF0ZVdhc20oKXt2YXIgaW5mbz17XCJhXCI6YXNtTGlicmFyeUFyZ307ZnVuY3Rpb24gcmVjZWl2ZUluc3RhbmNlKGluc3RhbmNlLG1vZHVsZSl7dmFyIGV4cG9ydHM9aW5zdGFuY2UuZXhwb3J0cztNb2R1bGVbXCJhc21cIl09ZXhwb3J0czt3YXNtVGFibGU9TW9kdWxlW1wiYXNtXCJdW1wiRlwiXTt3YXNtTW9kdWxlPW1vZHVsZTtpZighRU5WSVJPTk1FTlRfSVNfUFRIUkVBRCl7dmFyIG51bVdvcmtlcnNUb0xvYWQ9UFRocmVhZC51bnVzZWRXb3JrZXJzLmxlbmd0aDtQVGhyZWFkLnVudXNlZFdvcmtlcnMuZm9yRWFjaChmdW5jdGlvbih3KXtQVGhyZWFkLmxvYWRXYXNtTW9kdWxlVG9Xb3JrZXIodyxmdW5jdGlvbigpe2lmKCEtLW51bVdvcmtlcnNUb0xvYWQpcmVtb3ZlUnVuRGVwZW5kZW5jeShcIndhc20taW5zdGFudGlhdGVcIil9KX0pfX1pZighRU5WSVJPTk1FTlRfSVNfUFRIUkVBRCl7YWRkUnVuRGVwZW5kZW5jeShcIndhc20taW5zdGFudGlhdGVcIil9ZnVuY3Rpb24gcmVjZWl2ZUluc3RhbnRpYXRlZFNvdXJjZShvdXRwdXQpe3JlY2VpdmVJbnN0YW5jZShvdXRwdXRbXCJpbnN0YW5jZVwiXSxvdXRwdXRbXCJtb2R1bGVcIl0pfWZ1bmN0aW9uIGluc3RhbnRpYXRlQXJyYXlCdWZmZXIocmVjZWl2ZXIpe3JldHVybiBnZXRCaW5hcnlQcm9taXNlKCkudGhlbihmdW5jdGlvbihiaW5hcnkpe3JldHVybiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShiaW5hcnksaW5mbyl9KS50aGVuKHJlY2VpdmVyLGZ1bmN0aW9uKHJlYXNvbil7ZXJyKFwiZmFpbGVkIHRvIGFzeW5jaHJvbm91c2x5IHByZXBhcmUgd2FzbTogXCIrcmVhc29uKTthYm9ydChyZWFzb24pfSl9ZnVuY3Rpb24gaW5zdGFudGlhdGVBc3luYygpe2lmKCF3YXNtQmluYXJ5JiZ0eXBlb2YgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmc9PT1cImZ1bmN0aW9uXCImJiFpc0RhdGFVUkkod2FzbUJpbmFyeUZpbGUpJiYhaXNGaWxlVVJJKHdhc21CaW5hcnlGaWxlKSYmdHlwZW9mIGZldGNoPT09XCJmdW5jdGlvblwiKXtyZXR1cm4gZmV0Y2god2FzbUJpbmFyeUZpbGUse2NyZWRlbnRpYWxzOlwic2FtZS1vcmlnaW5cIn0pLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2Upe3ZhciByZXN1bHQ9V2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcocmVzcG9uc2UsaW5mbyk7cmV0dXJuIHJlc3VsdC50aGVuKHJlY2VpdmVJbnN0YW50aWF0ZWRTb3VyY2UsZnVuY3Rpb24ocmVhc29uKXtlcnIoXCJ3YXNtIHN0cmVhbWluZyBjb21waWxlIGZhaWxlZDogXCIrcmVhc29uKTtlcnIoXCJmYWxsaW5nIGJhY2sgdG8gQXJyYXlCdWZmZXIgaW5zdGFudGlhdGlvblwiKTtyZXR1cm4gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlSW5zdGFudGlhdGVkU291cmNlKX0pfSl9ZWxzZXtyZXR1cm4gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlSW5zdGFudGlhdGVkU291cmNlKX19aWYoTW9kdWxlW1wiaW5zdGFudGlhdGVXYXNtXCJdKXt0cnl7dmFyIGV4cG9ydHM9TW9kdWxlW1wiaW5zdGFudGlhdGVXYXNtXCJdKGluZm8scmVjZWl2ZUluc3RhbmNlKTtyZXR1cm4gZXhwb3J0c31jYXRjaChlKXtlcnIoXCJNb2R1bGUuaW5zdGFudGlhdGVXYXNtIGNhbGxiYWNrIGZhaWxlZCB3aXRoIGVycm9yOiBcIitlKTtyZXR1cm4gZmFsc2V9fWluc3RhbnRpYXRlQXN5bmMoKS5jYXRjaChyZWFkeVByb21pc2VSZWplY3QpO3JldHVybnt9fXZhciBBU01fQ09OU1RTPXs5ODMyOmZ1bmN0aW9uKCl7dGhyb3dcIkNhbmNlbGVkIVwifSw5ODUwOmZ1bmN0aW9uKCQwLCQxKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7X19lbXNjcmlwdGVuX2RvX2Rpc3BhdGNoX3RvX3RocmVhZCgkMCwkMSl9LDApfX07ZnVuY3Rpb24gaW5pdFB0aHJlYWRzSlMoKXtQVGhyZWFkLmluaXRSdW50aW1lKCl9ZnVuY3Rpb24gY2FsbFJ1bnRpbWVDYWxsYmFja3MoY2FsbGJhY2tzKXt3aGlsZShjYWxsYmFja3MubGVuZ3RoPjApe3ZhciBjYWxsYmFjaz1jYWxsYmFja3Muc2hpZnQoKTtpZih0eXBlb2YgY2FsbGJhY2s9PVwiZnVuY3Rpb25cIil7Y2FsbGJhY2soTW9kdWxlKTtjb250aW51ZX12YXIgZnVuYz1jYWxsYmFjay5mdW5jO2lmKHR5cGVvZiBmdW5jPT09XCJudW1iZXJcIil7aWYoY2FsbGJhY2suYXJnPT09dW5kZWZpbmVkKXt3YXNtVGFibGUuZ2V0KGZ1bmMpKCl9ZWxzZXt3YXNtVGFibGUuZ2V0KGZ1bmMpKGNhbGxiYWNrLmFyZyl9fWVsc2V7ZnVuYyhjYWxsYmFjay5hcmc9PT11bmRlZmluZWQ/bnVsbDpjYWxsYmFjay5hcmcpfX19ZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fZnV0ZXhfd2FrZShhZGRyLGNvdW50KXtpZihhZGRyPD0wfHxhZGRyPkdST1dBQkxFX0hFQVBfSTgoKS5sZW5ndGh8fGFkZHImMyE9MHx8Y291bnQ8MClyZXR1cm4tMjg7aWYoY291bnQ9PTApcmV0dXJuIDA7aWYoY291bnQ+PTIxNDc0ODM2NDcpY291bnQ9SW5maW5pdHk7dmFyIG1haW5UaHJlYWRXYWl0QWRkcmVzcz1BdG9taWNzLmxvYWQoR1JPV0FCTEVfSEVBUF9JMzIoKSxfX2Vtc2NyaXB0ZW5fbWFpbl90aHJlYWRfZnV0ZXg+PjIpO3ZhciBtYWluVGhyZWFkV29rZW49MDtpZihtYWluVGhyZWFkV2FpdEFkZHJlc3M9PWFkZHIpe3ZhciBsb2FkZWRBZGRyPUF0b21pY3MuY29tcGFyZUV4Y2hhbmdlKEdST1dBQkxFX0hFQVBfSTMyKCksX19lbXNjcmlwdGVuX21haW5fdGhyZWFkX2Z1dGV4Pj4yLG1haW5UaHJlYWRXYWl0QWRkcmVzcywwKTtpZihsb2FkZWRBZGRyPT1tYWluVGhyZWFkV2FpdEFkZHJlc3Mpey0tY291bnQ7bWFpblRocmVhZFdva2VuPTE7aWYoY291bnQ8PTApcmV0dXJuIDF9fXZhciByZXQ9QXRvbWljcy5ub3RpZnkoR1JPV0FCTEVfSEVBUF9JMzIoKSxhZGRyPj4yLGNvdW50KTtpZihyZXQ+PTApcmV0dXJuIHJldCttYWluVGhyZWFkV29rZW47dGhyb3dcIkF0b21pY3Mubm90aWZ5IHJldHVybmVkIGFuIHVuZXhwZWN0ZWQgdmFsdWUgXCIrcmV0fU1vZHVsZVtcIl9lbXNjcmlwdGVuX2Z1dGV4X3dha2VcIl09X2Vtc2NyaXB0ZW5fZnV0ZXhfd2FrZTtmdW5jdGlvbiBraWxsVGhyZWFkKHB0aHJlYWRfcHRyKXtpZihFTlZJUk9OTUVOVF9JU19QVEhSRUFEKXRocm93XCJJbnRlcm5hbCBFcnJvciEga2lsbFRocmVhZCgpIGNhbiBvbmx5IGV2ZXIgYmUgY2FsbGVkIGZyb20gbWFpbiBhcHBsaWNhdGlvbiB0aHJlYWQhXCI7aWYoIXB0aHJlYWRfcHRyKXRocm93XCJJbnRlcm5hbCBFcnJvciEgTnVsbCBwdGhyZWFkX3B0ciBpbiBraWxsVGhyZWFkIVwiO0dST1dBQkxFX0hFQVBfSTMyKClbcHRocmVhZF9wdHIrMTI+PjJdPTA7dmFyIHB0aHJlYWQ9UFRocmVhZC5wdGhyZWFkc1twdGhyZWFkX3B0cl07cHRocmVhZC53b3JrZXIudGVybWluYXRlKCk7UFRocmVhZC5mcmVlVGhyZWFkRGF0YShwdGhyZWFkKTtQVGhyZWFkLnJ1bm5pbmdXb3JrZXJzLnNwbGljZShQVGhyZWFkLnJ1bm5pbmdXb3JrZXJzLmluZGV4T2YocHRocmVhZC53b3JrZXIpLDEpO3B0aHJlYWQud29ya2VyLnB0aHJlYWQ9dW5kZWZpbmVkfWZ1bmN0aW9uIGNhbmNlbFRocmVhZChwdGhyZWFkX3B0cil7aWYoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRCl0aHJvd1wiSW50ZXJuYWwgRXJyb3IhIGNhbmNlbFRocmVhZCgpIGNhbiBvbmx5IGV2ZXIgYmUgY2FsbGVkIGZyb20gbWFpbiBhcHBsaWNhdGlvbiB0aHJlYWQhXCI7aWYoIXB0aHJlYWRfcHRyKXRocm93XCJJbnRlcm5hbCBFcnJvciEgTnVsbCBwdGhyZWFkX3B0ciBpbiBjYW5jZWxUaHJlYWQhXCI7dmFyIHB0aHJlYWQ9UFRocmVhZC5wdGhyZWFkc1twdGhyZWFkX3B0cl07cHRocmVhZC53b3JrZXIucG9zdE1lc3NhZ2Uoe1wiY21kXCI6XCJjYW5jZWxcIn0pfWZ1bmN0aW9uIGNsZWFudXBUaHJlYWQocHRocmVhZF9wdHIpe2lmKEVOVklST05NRU5UX0lTX1BUSFJFQUQpdGhyb3dcIkludGVybmFsIEVycm9yISBjbGVhbnVwVGhyZWFkKCkgY2FuIG9ubHkgZXZlciBiZSBjYWxsZWQgZnJvbSBtYWluIGFwcGxpY2F0aW9uIHRocmVhZCFcIjtpZighcHRocmVhZF9wdHIpdGhyb3dcIkludGVybmFsIEVycm9yISBOdWxsIHB0aHJlYWRfcHRyIGluIGNsZWFudXBUaHJlYWQhXCI7dmFyIHB0aHJlYWQ9UFRocmVhZC5wdGhyZWFkc1twdGhyZWFkX3B0cl07aWYocHRocmVhZCl7R1JPV0FCTEVfSEVBUF9JMzIoKVtwdGhyZWFkX3B0cisxMj4+Ml09MDt2YXIgd29ya2VyPXB0aHJlYWQud29ya2VyO1BUaHJlYWQucmV0dXJuV29ya2VyVG9Qb29sKHdvcmtlcil9fXZhciBQVGhyZWFkPXt1bnVzZWRXb3JrZXJzOltdLHJ1bm5pbmdXb3JrZXJzOltdLGluaXRNYWluVGhyZWFkQmxvY2s6ZnVuY3Rpb24oKXt2YXIgcHRocmVhZFBvb2xTaXplPU1hdGgubWluKDQsTWF0aC5tYXgoMSwobmF2aWdhdG9yLmhhcmR3YXJlQ29uY3VycmVuY3l8fDEpLzIpKTtmb3IodmFyIGk9MDtpPHB0aHJlYWRQb29sU2l6ZTsrK2kpe1BUaHJlYWQuYWxsb2NhdGVVbnVzZWRXb3JrZXIoKX19LGluaXRSdW50aW1lOmZ1bmN0aW9uKCl7dmFyIHRiPV9tYWxsb2MoMjI4KTtmb3IodmFyIGk9MDtpPDIyOC80OysraSlHUk9XQUJMRV9IRUFQX1UzMigpW3RiLzQraV09MDtHUk9XQUJMRV9IRUFQX0kzMigpW3RiKzEyPj4yXT10Yjt2YXIgaGVhZFB0cj10YisxNTI7R1JPV0FCTEVfSEVBUF9JMzIoKVtoZWFkUHRyPj4yXT1oZWFkUHRyO3ZhciB0bHNNZW1vcnk9X21hbGxvYyg1MTIpO2Zvcih2YXIgaT0wO2k8MTI4OysraSlHUk9XQUJMRV9IRUFQX1UzMigpW3Rsc01lbW9yeS80K2ldPTA7QXRvbWljcy5zdG9yZShHUk9XQUJMRV9IRUFQX1UzMigpLHRiKzEwMD4+Mix0bHNNZW1vcnkpO0F0b21pY3Muc3RvcmUoR1JPV0FCTEVfSEVBUF9VMzIoKSx0Yis0MD4+Mix0Yik7X19lbXNjcmlwdGVuX3RocmVhZF9pbml0KHRiLCFFTlZJUk9OTUVOVF9JU19XT1JLRVIsMSk7X2Vtc2NyaXB0ZW5fcmVnaXN0ZXJfbWFpbl9icm93c2VyX3RocmVhZF9pZCh0Yil9LGluaXRXb3JrZXI6ZnVuY3Rpb24oKXt9LHB0aHJlYWRzOnt9LHRocmVhZEV4aXRIYW5kbGVyczpbXSxzZXRUaHJlYWRTdGF0dXM6ZnVuY3Rpb24oKXt9LHJ1bkV4aXRIYW5kbGVyczpmdW5jdGlvbigpe3doaWxlKFBUaHJlYWQudGhyZWFkRXhpdEhhbmRsZXJzLmxlbmd0aD4wKXtQVGhyZWFkLnRocmVhZEV4aXRIYW5kbGVycy5wb3AoKSgpfWlmKEVOVklST05NRU5UX0lTX1BUSFJFQUQmJl9wdGhyZWFkX3NlbGYoKSlfX19wdGhyZWFkX3RzZF9ydW5fZHRvcnMoKX0scnVuRXhpdEhhbmRsZXJzQW5kRGVpbml0VGhyZWFkOmZ1bmN0aW9uKHRiLGV4aXRDb2RlKXtBdG9taWNzLnN0b3JlKEdST1dBQkxFX0hFQVBfVTMyKCksdGIrNTY+PjIsMSk7QXRvbWljcy5zdG9yZShHUk9XQUJMRV9IRUFQX1UzMigpLHRiKzYwPj4yLDApO1BUaHJlYWQucnVuRXhpdEhhbmRsZXJzKCk7QXRvbWljcy5zdG9yZShHUk9XQUJMRV9IRUFQX1UzMigpLHRiKzQ+PjIsZXhpdENvZGUpO0F0b21pY3Muc3RvcmUoR1JPV0FCTEVfSEVBUF9VMzIoKSx0YiswPj4yLDEpO19lbXNjcmlwdGVuX2Z1dGV4X3dha2UodGIrMCwyMTQ3NDgzNjQ3KTtfX2Vtc2NyaXB0ZW5fdGhyZWFkX2luaXQoMCwwLDApfSx0aHJlYWRFeGl0OmZ1bmN0aW9uKGV4aXRDb2RlKXt2YXIgdGI9X3B0aHJlYWRfc2VsZigpO2lmKHRiKXtQVGhyZWFkLnJ1bkV4aXRIYW5kbGVyc0FuZERlaW5pdFRocmVhZCh0YixleGl0Q29kZSk7aWYoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRCl7cG9zdE1lc3NhZ2Uoe1wiY21kXCI6XCJleGl0XCJ9KX19fSx0aHJlYWRDYW5jZWw6ZnVuY3Rpb24oKXtQVGhyZWFkLnJ1bkV4aXRIYW5kbGVyc0FuZERlaW5pdFRocmVhZChfcHRocmVhZF9zZWxmKCksLTEpO3Bvc3RNZXNzYWdlKHtcImNtZFwiOlwiY2FuY2VsRG9uZVwifSl9LHRlcm1pbmF0ZUFsbFRocmVhZHM6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gUFRocmVhZC5wdGhyZWFkcyl7dmFyIHB0aHJlYWQ9UFRocmVhZC5wdGhyZWFkc1t0XTtpZihwdGhyZWFkJiZwdGhyZWFkLndvcmtlcil7UFRocmVhZC5yZXR1cm5Xb3JrZXJUb1Bvb2wocHRocmVhZC53b3JrZXIpfX1QVGhyZWFkLnB0aHJlYWRzPXt9O2Zvcih2YXIgaT0wO2k8UFRocmVhZC51bnVzZWRXb3JrZXJzLmxlbmd0aDsrK2kpe3ZhciB3b3JrZXI9UFRocmVhZC51bnVzZWRXb3JrZXJzW2ldO3dvcmtlci50ZXJtaW5hdGUoKX1QVGhyZWFkLnVudXNlZFdvcmtlcnM9W107Zm9yKHZhciBpPTA7aTxQVGhyZWFkLnJ1bm5pbmdXb3JrZXJzLmxlbmd0aDsrK2kpe3ZhciB3b3JrZXI9UFRocmVhZC5ydW5uaW5nV29ya2Vyc1tpXTt2YXIgcHRocmVhZD13b3JrZXIucHRocmVhZDtQVGhyZWFkLmZyZWVUaHJlYWREYXRhKHB0aHJlYWQpO3dvcmtlci50ZXJtaW5hdGUoKX1QVGhyZWFkLnJ1bm5pbmdXb3JrZXJzPVtdfSxmcmVlVGhyZWFkRGF0YTpmdW5jdGlvbihwdGhyZWFkKXtpZighcHRocmVhZClyZXR1cm47aWYocHRocmVhZC50aHJlYWRJbmZvU3RydWN0KXt2YXIgdGxzTWVtb3J5PUdST1dBQkxFX0hFQVBfSTMyKClbcHRocmVhZC50aHJlYWRJbmZvU3RydWN0KzEwMD4+Ml07R1JPV0FCTEVfSEVBUF9JMzIoKVtwdGhyZWFkLnRocmVhZEluZm9TdHJ1Y3QrMTAwPj4yXT0wO19mcmVlKHRsc01lbW9yeSk7X2ZyZWUocHRocmVhZC50aHJlYWRJbmZvU3RydWN0KX1wdGhyZWFkLnRocmVhZEluZm9TdHJ1Y3Q9MDtpZihwdGhyZWFkLmFsbG9jYXRlZE93blN0YWNrJiZwdGhyZWFkLnN0YWNrQmFzZSlfZnJlZShwdGhyZWFkLnN0YWNrQmFzZSk7cHRocmVhZC5zdGFja0Jhc2U9MDtpZihwdGhyZWFkLndvcmtlcilwdGhyZWFkLndvcmtlci5wdGhyZWFkPW51bGx9LHJldHVybldvcmtlclRvUG9vbDpmdW5jdGlvbih3b3JrZXIpe1BUaHJlYWQucnVuV2l0aG91dE1haW5UaHJlYWRRdWV1ZWRDYWxscyhmdW5jdGlvbigpe2RlbGV0ZSBQVGhyZWFkLnB0aHJlYWRzW3dvcmtlci5wdGhyZWFkLnRocmVhZEluZm9TdHJ1Y3RdO1BUaHJlYWQudW51c2VkV29ya2Vycy5wdXNoKHdvcmtlcik7UFRocmVhZC5ydW5uaW5nV29ya2Vycy5zcGxpY2UoUFRocmVhZC5ydW5uaW5nV29ya2Vycy5pbmRleE9mKHdvcmtlciksMSk7UFRocmVhZC5mcmVlVGhyZWFkRGF0YSh3b3JrZXIucHRocmVhZCk7d29ya2VyLnB0aHJlYWQ9dW5kZWZpbmVkfSl9LHJ1bldpdGhvdXRNYWluVGhyZWFkUXVldWVkQ2FsbHM6ZnVuY3Rpb24oZnVuYyl7R1JPV0FCTEVfSEVBUF9JMzIoKVtfX2Vtc2NyaXB0ZW5fYWxsb3dfbWFpbl9ydW50aW1lX3F1ZXVlZF9jYWxscz4+Ml09MDt0cnl7ZnVuYygpfWZpbmFsbHl7R1JPV0FCTEVfSEVBUF9JMzIoKVtfX2Vtc2NyaXB0ZW5fYWxsb3dfbWFpbl9ydW50aW1lX3F1ZXVlZF9jYWxscz4+Ml09MX19LHJlY2VpdmVPYmplY3RUcmFuc2ZlcjpmdW5jdGlvbihkYXRhKXt9LGxvYWRXYXNtTW9kdWxlVG9Xb3JrZXI6ZnVuY3Rpb24od29ya2VyLG9uRmluaXNoZWRMb2FkaW5nKXt3b3JrZXIub25tZXNzYWdlPWZ1bmN0aW9uKGUpe3ZhciBkPWVbXCJkYXRhXCJdO3ZhciBjbWQ9ZFtcImNtZFwiXTtpZih3b3JrZXIucHRocmVhZClQVGhyZWFkLmN1cnJlbnRQcm94aWVkT3BlcmF0aW9uQ2FsbGVyVGhyZWFkPXdvcmtlci5wdGhyZWFkLnRocmVhZEluZm9TdHJ1Y3Q7aWYoZFtcInRhcmdldFRocmVhZFwiXSYmZFtcInRhcmdldFRocmVhZFwiXSE9X3B0aHJlYWRfc2VsZigpKXt2YXIgdGhyZWFkPVBUaHJlYWQucHRocmVhZHNbZC50YXJnZXRUaHJlYWRdO2lmKHRocmVhZCl7dGhyZWFkLndvcmtlci5wb3N0TWVzc2FnZShlLmRhdGEsZFtcInRyYW5zZmVyTGlzdFwiXSl9ZWxzZXtjb25zb2xlLmVycm9yKCdJbnRlcm5hbCBlcnJvciEgV29ya2VyIHNlbnQgYSBtZXNzYWdlIFwiJytjbWQrJ1wiIHRvIHRhcmdldCBwdGhyZWFkICcrZFtcInRhcmdldFRocmVhZFwiXStcIiwgYnV0IHRoYXQgdGhyZWFkIG5vIGxvbmdlciBleGlzdHMhXCIpfVBUaHJlYWQuY3VycmVudFByb3hpZWRPcGVyYXRpb25DYWxsZXJUaHJlYWQ9dW5kZWZpbmVkO3JldHVybn1pZihjbWQ9PT1cInByb2Nlc3NRdWV1ZWRNYWluVGhyZWFkV29ya1wiKXtfZW1zY3JpcHRlbl9tYWluX3RocmVhZF9wcm9jZXNzX3F1ZXVlZF9jYWxscygpfWVsc2UgaWYoY21kPT09XCJzcGF3blRocmVhZFwiKXtzcGF3blRocmVhZChlLmRhdGEpfWVsc2UgaWYoY21kPT09XCJjbGVhbnVwVGhyZWFkXCIpe2NsZWFudXBUaHJlYWQoZFtcInRocmVhZFwiXSl9ZWxzZSBpZihjbWQ9PT1cImtpbGxUaHJlYWRcIil7a2lsbFRocmVhZChkW1widGhyZWFkXCJdKX1lbHNlIGlmKGNtZD09PVwiY2FuY2VsVGhyZWFkXCIpe2NhbmNlbFRocmVhZChkW1widGhyZWFkXCJdKX1lbHNlIGlmKGNtZD09PVwibG9hZGVkXCIpe3dvcmtlci5sb2FkZWQ9dHJ1ZTtpZihvbkZpbmlzaGVkTG9hZGluZylvbkZpbmlzaGVkTG9hZGluZyh3b3JrZXIpO2lmKHdvcmtlci5ydW5QdGhyZWFkKXt3b3JrZXIucnVuUHRocmVhZCgpO2RlbGV0ZSB3b3JrZXIucnVuUHRocmVhZH19ZWxzZSBpZihjbWQ9PT1cInByaW50XCIpe291dChcIlRocmVhZCBcIitkW1widGhyZWFkSWRcIl0rXCI6IFwiK2RbXCJ0ZXh0XCJdKX1lbHNlIGlmKGNtZD09PVwicHJpbnRFcnJcIil7ZXJyKFwiVGhyZWFkIFwiK2RbXCJ0aHJlYWRJZFwiXStcIjogXCIrZFtcInRleHRcIl0pfWVsc2UgaWYoY21kPT09XCJhbGVydFwiKXthbGVydChcIlRocmVhZCBcIitkW1widGhyZWFkSWRcIl0rXCI6IFwiK2RbXCJ0ZXh0XCJdKX1lbHNlIGlmKGNtZD09PVwiZXhpdFwiKXt2YXIgZGV0YWNoZWQ9d29ya2VyLnB0aHJlYWQmJkF0b21pY3MubG9hZChHUk9XQUJMRV9IRUFQX1UzMigpLHdvcmtlci5wdGhyZWFkLnRocmVhZEluZm9TdHJ1Y3QrNjQ+PjIpO2lmKGRldGFjaGVkKXtQVGhyZWFkLnJldHVybldvcmtlclRvUG9vbCh3b3JrZXIpfX1lbHNlIGlmKGNtZD09PVwiZXhpdFByb2Nlc3NcIil7dHJ5e2V4aXQoZFtcInJldHVybkNvZGVcIl0pfWNhdGNoKGUpe2lmKGUgaW5zdGFuY2VvZiBFeGl0U3RhdHVzKXJldHVybjt0aHJvdyBlfX1lbHNlIGlmKGNtZD09PVwiY2FuY2VsRG9uZVwiKXtQVGhyZWFkLnJldHVybldvcmtlclRvUG9vbCh3b3JrZXIpfWVsc2UgaWYoY21kPT09XCJvYmplY3RUcmFuc2ZlclwiKXtQVGhyZWFkLnJlY2VpdmVPYmplY3RUcmFuc2ZlcihlLmRhdGEpfWVsc2UgaWYoZS5kYXRhLnRhcmdldD09PVwic2V0aW1tZWRpYXRlXCIpe3dvcmtlci5wb3N0TWVzc2FnZShlLmRhdGEpfWVsc2V7ZXJyKFwid29ya2VyIHNlbnQgYW4gdW5rbm93biBjb21tYW5kIFwiK2NtZCl9UFRocmVhZC5jdXJyZW50UHJveGllZE9wZXJhdGlvbkNhbGxlclRocmVhZD11bmRlZmluZWR9O3dvcmtlci5vbmVycm9yPWZ1bmN0aW9uKGUpe2VycihcInB0aHJlYWQgc2VudCBhbiBlcnJvciEgXCIrZS5maWxlbmFtZStcIjpcIitlLmxpbmVubytcIjogXCIrZS5tZXNzYWdlKX07aWYoRU5WSVJPTk1FTlRfSVNfTk9ERSl7d29ya2VyLm9uKFwibWVzc2FnZVwiLGZ1bmN0aW9uKGRhdGEpe3dvcmtlci5vbm1lc3NhZ2Uoe2RhdGE6ZGF0YX0pfSk7d29ya2VyLm9uKFwiZXJyb3JcIixmdW5jdGlvbihkYXRhKXt3b3JrZXIub25lcnJvcihkYXRhKX0pO3dvcmtlci5vbihcImV4aXRcIixmdW5jdGlvbihkYXRhKXt9KX13b3JrZXIucG9zdE1lc3NhZ2Uoe1wiY21kXCI6XCJsb2FkXCIsXCJ1cmxPckJsb2JcIjpNb2R1bGVbXCJtYWluU2NyaXB0VXJsT3JCbG9iXCJdfHxfc2NyaXB0RGlyLFwid2FzbU1lbW9yeVwiOndhc21NZW1vcnksXCJ3YXNtTW9kdWxlXCI6d2FzbU1vZHVsZX0pfSxhbGxvY2F0ZVVudXNlZFdvcmtlcjpmdW5jdGlvbigpe3ZhciBwdGhyZWFkTWFpbkpzPWxvY2F0ZUZpbGUoXCJ0ZmpzLWJhY2tlbmQtd2FzbS10aHJlYWRlZC1zaW1kLndvcmtlci5qc1wiKTtQVGhyZWFkLnVudXNlZFdvcmtlcnMucHVzaChuZXcgV29ya2VyKHB0aHJlYWRNYWluSnMpKX0sZ2V0TmV3V29ya2VyOmZ1bmN0aW9uKCl7aWYoUFRocmVhZC51bnVzZWRXb3JrZXJzLmxlbmd0aD09MCl7UFRocmVhZC5hbGxvY2F0ZVVudXNlZFdvcmtlcigpO1BUaHJlYWQubG9hZFdhc21Nb2R1bGVUb1dvcmtlcihQVGhyZWFkLnVudXNlZFdvcmtlcnNbMF0pfWlmKFBUaHJlYWQudW51c2VkV29ya2Vycy5sZW5ndGg+MClyZXR1cm4gUFRocmVhZC51bnVzZWRXb3JrZXJzLnBvcCgpO2Vsc2UgcmV0dXJuIG51bGx9LGJ1c3lTcGluV2FpdDpmdW5jdGlvbihtc2Vjcyl7dmFyIHQ9cGVyZm9ybWFuY2Uubm93KCkrbXNlY3M7d2hpbGUocGVyZm9ybWFuY2Uubm93KCk8dCl7fX19O2Z1bmN0aW9uIGVzdGFibGlzaFN0YWNrU3BhY2Uoc3RhY2tUb3Asc3RhY2tNYXgpe19lbXNjcmlwdGVuX3N0YWNrX3NldF9saW1pdHMoc3RhY2tUb3Asc3RhY2tNYXgpO3N0YWNrUmVzdG9yZShzdGFja1RvcCl9TW9kdWxlW1wiZXN0YWJsaXNoU3RhY2tTcGFjZVwiXT1lc3RhYmxpc2hTdGFja1NwYWNlO2Z1bmN0aW9uIGdldE5vRXhpdFJ1bnRpbWUoKXtyZXR1cm4gbm9FeGl0UnVudGltZX1Nb2R1bGVbXCJnZXROb0V4aXRSdW50aW1lXCJdPWdldE5vRXhpdFJ1bnRpbWU7ZnVuY3Rpb24gaW52b2tlRW50cnlQb2ludChwdHIsYXJnKXtyZXR1cm4gd2FzbVRhYmxlLmdldChwdHIpKGFyZyl9TW9kdWxlW1wiaW52b2tlRW50cnlQb2ludFwiXT1pbnZva2VFbnRyeVBvaW50O2Z1bmN0aW9uIF9fX2Fzc2VydF9mYWlsKGNvbmRpdGlvbixmaWxlbmFtZSxsaW5lLGZ1bmMpe2Fib3J0KFwiQXNzZXJ0aW9uIGZhaWxlZDogXCIrVVRGOFRvU3RyaW5nKGNvbmRpdGlvbikrXCIsIGF0OiBcIitbZmlsZW5hbWU/VVRGOFRvU3RyaW5nKGZpbGVuYW1lKTpcInVua25vd24gZmlsZW5hbWVcIixsaW5lLGZ1bmM/VVRGOFRvU3RyaW5nKGZ1bmMpOlwidW5rbm93biBmdW5jdGlvblwiXSl9ZnVuY3Rpb24gX19fY2FsbF9tYWluKGFyZ2MsYXJndil7dmFyIHJldHVybkNvZGU9X21haW4oYXJnYyxhcmd2KX12YXIgX2Vtc2NyaXB0ZW5fZ2V0X25vdztpZihFTlZJUk9OTUVOVF9JU19OT0RFKXtfZW1zY3JpcHRlbl9nZXRfbm93PWZ1bmN0aW9uKCl7dmFyIHQ9cHJvY2Vzc1tcImhydGltZVwiXSgpO3JldHVybiB0WzBdKjFlMyt0WzFdLzFlNn19ZWxzZSBpZihFTlZJUk9OTUVOVF9JU19QVEhSRUFEKXtfZW1zY3JpcHRlbl9nZXRfbm93PWZ1bmN0aW9uKCl7cmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpLU1vZHVsZVtcIl9fcGVyZm9ybWFuY2Vfbm93X2Nsb2NrX2RyaWZ0XCJdfX1lbHNlIGlmKHR5cGVvZiBkYXRlTm93IT09XCJ1bmRlZmluZWRcIil7X2Vtc2NyaXB0ZW5fZ2V0X25vdz1kYXRlTm93fWVsc2UgX2Vtc2NyaXB0ZW5fZ2V0X25vdz1mdW5jdGlvbigpe3JldHVybiBwZXJmb3JtYW5jZS5ub3coKX07ZnVuY3Rpb24gc2V0RXJyTm8odmFsdWUpe0dST1dBQkxFX0hFQVBfSTMyKClbX19fZXJybm9fbG9jYXRpb24oKT4+Ml09dmFsdWU7cmV0dXJuIHZhbHVlfWZ1bmN0aW9uIF9hdGV4aXQoZnVuYyxhcmcpe2lmKEVOVklST05NRU5UX0lTX1BUSFJFQUQpcmV0dXJuIF9lbXNjcmlwdGVuX3Byb3h5X3RvX21haW5fdGhyZWFkX2pzKDEsMSxmdW5jLGFyZyl9ZnVuY3Rpb24gX19lbXNjcmlwdGVuX25vdGlmeV90aHJlYWRfcXVldWUodGFyZ2V0VGhyZWFkSWQsbWFpblRocmVhZElkKXtpZih0YXJnZXRUaHJlYWRJZD09bWFpblRocmVhZElkKXtwb3N0TWVzc2FnZSh7XCJjbWRcIjpcInByb2Nlc3NRdWV1ZWRNYWluVGhyZWFkV29ya1wifSl9ZWxzZSBpZihFTlZJUk9OTUVOVF9JU19QVEhSRUFEKXtwb3N0TWVzc2FnZSh7XCJ0YXJnZXRUaHJlYWRcIjp0YXJnZXRUaHJlYWRJZCxcImNtZFwiOlwicHJvY2Vzc1RocmVhZFF1ZXVlXCJ9KX1lbHNle3ZhciBwdGhyZWFkPVBUaHJlYWQucHRocmVhZHNbdGFyZ2V0VGhyZWFkSWRdO3ZhciB3b3JrZXI9cHRocmVhZCYmcHRocmVhZC53b3JrZXI7aWYoIXdvcmtlcil7cmV0dXJufXdvcmtlci5wb3N0TWVzc2FnZSh7XCJjbWRcIjpcInByb2Nlc3NUaHJlYWRRdWV1ZVwifSl9cmV0dXJuIDF9ZnVuY3Rpb24gX2Fib3J0KCl7YWJvcnQoKX1mdW5jdGlvbiBfZW1zY3JpcHRlbl9hc21fY29uc3RfaW50KGNvZGUsc2lnUHRyLGFyZ2J1Zil7dmFyIGFyZ3M9cmVhZEFzbUNvbnN0QXJncyhzaWdQdHIsYXJnYnVmKTtyZXR1cm4gQVNNX0NPTlNUU1tjb2RlXS5hcHBseShudWxsLGFyZ3MpfWZ1bmN0aW9uIF9lbXNjcmlwdGVuX2NvbmRpdGlvbmFsX3NldF9jdXJyZW50X3RocmVhZF9zdGF0dXMoZXhwZWN0ZWRTdGF0dXMsbmV3U3RhdHVzKXt9ZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fZnV0ZXhfd2FpdChhZGRyLHZhbCx0aW1lb3V0KXtpZihhZGRyPD0wfHxhZGRyPkdST1dBQkxFX0hFQVBfSTgoKS5sZW5ndGh8fGFkZHImMyE9MClyZXR1cm4tMjg7aWYoIUVOVklST05NRU5UX0lTX1dFQil7dmFyIHJldD1BdG9taWNzLndhaXQoR1JPV0FCTEVfSEVBUF9JMzIoKSxhZGRyPj4yLHZhbCx0aW1lb3V0KTtpZihyZXQ9PT1cInRpbWVkLW91dFwiKXJldHVybi03MztpZihyZXQ9PT1cIm5vdC1lcXVhbFwiKXJldHVybi02O2lmKHJldD09PVwib2tcIilyZXR1cm4gMDt0aHJvd1wiQXRvbWljcy53YWl0IHJldHVybmVkIGFuIHVuZXhwZWN0ZWQgdmFsdWUgXCIrcmV0fWVsc2V7aWYoQXRvbWljcy5sb2FkKEdST1dBQkxFX0hFQVBfSTMyKCksYWRkcj4+MikhPXZhbCl7cmV0dXJuLTZ9dmFyIHROb3c9cGVyZm9ybWFuY2Uubm93KCk7dmFyIHRFbmQ9dE5vdyt0aW1lb3V0O3ZhciBsYXN0QWRkcj1BdG9taWNzLmV4Y2hhbmdlKEdST1dBQkxFX0hFQVBfSTMyKCksX19lbXNjcmlwdGVuX21haW5fdGhyZWFkX2Z1dGV4Pj4yLGFkZHIpO3doaWxlKDEpe3ROb3c9cGVyZm9ybWFuY2Uubm93KCk7aWYodE5vdz50RW5kKXtsYXN0QWRkcj1BdG9taWNzLmV4Y2hhbmdlKEdST1dBQkxFX0hFQVBfSTMyKCksX19lbXNjcmlwdGVuX21haW5fdGhyZWFkX2Z1dGV4Pj4yLDApO3JldHVybi03M31sYXN0QWRkcj1BdG9taWNzLmV4Y2hhbmdlKEdST1dBQkxFX0hFQVBfSTMyKCksX19lbXNjcmlwdGVuX21haW5fdGhyZWFkX2Z1dGV4Pj4yLDApO2lmKGxhc3RBZGRyPT0wKXticmVha31fZW1zY3JpcHRlbl9tYWluX3RocmVhZF9wcm9jZXNzX3F1ZXVlZF9jYWxscygpO2lmKEF0b21pY3MubG9hZChHUk9XQUJMRV9IRUFQX0kzMigpLGFkZHI+PjIpIT12YWwpe3JldHVybi02fWxhc3RBZGRyPUF0b21pY3MuZXhjaGFuZ2UoR1JPV0FCTEVfSEVBUF9JMzIoKSxfX2Vtc2NyaXB0ZW5fbWFpbl90aHJlYWRfZnV0ZXg+PjIsYWRkcil9cmV0dXJuIDB9fWZ1bmN0aW9uIF9lbXNjcmlwdGVuX21lbWNweV9iaWcoZGVzdCxzcmMsbnVtKXtHUk9XQUJMRV9IRUFQX1U4KCkuY29weVdpdGhpbihkZXN0LHNyYyxzcmMrbnVtKX1mdW5jdGlvbiBfZW1zY3JpcHRlbl9udW1fbG9naWNhbF9jb3Jlcygpe2lmKEVOVklST05NRU5UX0lTX05PREUpcmV0dXJuIHJlcXVpcmUoXCJvc1wiKS5jcHVzKCkubGVuZ3RoO3JldHVybiBuYXZpZ2F0b3JbXCJoYXJkd2FyZUNvbmN1cnJlbmN5XCJdfWZ1bmN0aW9uIF9lbXNjcmlwdGVuX3Byb3h5X3RvX21haW5fdGhyZWFkX2pzKGluZGV4LHN5bmMpe3ZhciBudW1DYWxsQXJncz1hcmd1bWVudHMubGVuZ3RoLTI7dmFyIHN0YWNrPXN0YWNrU2F2ZSgpO3ZhciBzZXJpYWxpemVkTnVtQ2FsbEFyZ3M9bnVtQ2FsbEFyZ3M7dmFyIGFyZ3M9c3RhY2tBbGxvYyhzZXJpYWxpemVkTnVtQ2FsbEFyZ3MqOCk7dmFyIGI9YXJncz4+Mztmb3IodmFyIGk9MDtpPG51bUNhbGxBcmdzO2krKyl7dmFyIGFyZz1hcmd1bWVudHNbMitpXTtHUk9XQUJMRV9IRUFQX0Y2NCgpW2IraV09YXJnfXZhciByZXQ9X2Vtc2NyaXB0ZW5fcnVuX2luX21haW5fcnVudGltZV90aHJlYWRfanMoaW5kZXgsc2VyaWFsaXplZE51bUNhbGxBcmdzLGFyZ3Msc3luYyk7c3RhY2tSZXN0b3JlKHN0YWNrKTtyZXR1cm4gcmV0fXZhciBfZW1zY3JpcHRlbl9yZWNlaXZlX29uX21haW5fdGhyZWFkX2pzX2NhbGxBcmdzPVtdO3ZhciByZWFkQXNtQ29uc3RBcmdzQXJyYXk9W107ZnVuY3Rpb24gcmVhZEFzbUNvbnN0QXJncyhzaWdQdHIsYnVmKXtyZWFkQXNtQ29uc3RBcmdzQXJyYXkubGVuZ3RoPTA7dmFyIGNoO2J1Zj4+PTI7d2hpbGUoY2g9R1JPV0FCTEVfSEVBUF9VOCgpW3NpZ1B0cisrXSl7dmFyIGRvdWJsZT1jaDwxMDU7aWYoZG91YmxlJiZidWYmMSlidWYrKztyZWFkQXNtQ29uc3RBcmdzQXJyYXkucHVzaChkb3VibGU/R1JPV0FCTEVfSEVBUF9GNjQoKVtidWYrKz4+MV06R1JPV0FCTEVfSEVBUF9JMzIoKVtidWZdKTsrK2J1Zn1yZXR1cm4gcmVhZEFzbUNvbnN0QXJnc0FycmF5fWZ1bmN0aW9uIF9lbXNjcmlwdGVuX3JlY2VpdmVfb25fbWFpbl90aHJlYWRfanMoaW5kZXgsbnVtQ2FsbEFyZ3MsYXJncyl7X2Vtc2NyaXB0ZW5fcmVjZWl2ZV9vbl9tYWluX3RocmVhZF9qc19jYWxsQXJncy5sZW5ndGg9bnVtQ2FsbEFyZ3M7dmFyIGI9YXJncz4+Mztmb3IodmFyIGk9MDtpPG51bUNhbGxBcmdzO2krKyl7X2Vtc2NyaXB0ZW5fcmVjZWl2ZV9vbl9tYWluX3RocmVhZF9qc19jYWxsQXJnc1tpXT1HUk9XQUJMRV9IRUFQX0Y2NCgpW2IraV19dmFyIGlzRW1Bc21Db25zdD1pbmRleDwwO3ZhciBmdW5jPSFpc0VtQXNtQ29uc3Q/cHJveGllZEZ1bmN0aW9uVGFibGVbaW5kZXhdOkFTTV9DT05TVFNbLWluZGV4LTFdO3JldHVybiBmdW5jLmFwcGx5KG51bGwsX2Vtc2NyaXB0ZW5fcmVjZWl2ZV9vbl9tYWluX3RocmVhZF9qc19jYWxsQXJncyl9ZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fZ2V0X2hlYXBfc2l6ZSgpe3JldHVybiBHUk9XQUJMRV9IRUFQX1U4KCkubGVuZ3RofWZ1bmN0aW9uIGVtc2NyaXB0ZW5fcmVhbGxvY19idWZmZXIoc2l6ZSl7dHJ5e3dhc21NZW1vcnkuZ3JvdyhzaXplLWJ1ZmZlci5ieXRlTGVuZ3RoKzY1NTM1Pj4+MTYpO3VwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzKHdhc21NZW1vcnkuYnVmZmVyKTtyZXR1cm4gMX1jYXRjaChlKXt9fWZ1bmN0aW9uIF9lbXNjcmlwdGVuX3Jlc2l6ZV9oZWFwKHJlcXVlc3RlZFNpemUpe3ZhciBvbGRTaXplPV9lbXNjcmlwdGVuX2dldF9oZWFwX3NpemUoKTtpZihyZXF1ZXN0ZWRTaXplPD1vbGRTaXplKXtyZXR1cm4gZmFsc2V9dmFyIG1heEhlYXBTaXplPTIxNDc0ODM2NDg7aWYocmVxdWVzdGVkU2l6ZT5tYXhIZWFwU2l6ZSl7cmV0dXJuIGZhbHNlfWZvcih2YXIgY3V0RG93bj0xO2N1dERvd248PTQ7Y3V0RG93bio9Mil7dmFyIG92ZXJHcm93bkhlYXBTaXplPW9sZFNpemUqKDErLjIvY3V0RG93bik7b3Zlckdyb3duSGVhcFNpemU9TWF0aC5taW4ob3Zlckdyb3duSGVhcFNpemUscmVxdWVzdGVkU2l6ZSsxMDA2NjMyOTYpO3ZhciBuZXdTaXplPU1hdGgubWluKG1heEhlYXBTaXplLGFsaWduVXAoTWF0aC5tYXgocmVxdWVzdGVkU2l6ZSxvdmVyR3Jvd25IZWFwU2l6ZSksNjU1MzYpKTt2YXIgcmVwbGFjZW1lbnQ9ZW1zY3JpcHRlbl9yZWFsbG9jX2J1ZmZlcihuZXdTaXplKTtpZihyZXBsYWNlbWVudCl7cmV0dXJuIHRydWV9fXJldHVybiBmYWxzZX12YXIgSlNFdmVudHM9e2luRXZlbnRIYW5kbGVyOjAscmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnM6ZnVuY3Rpb24oKXtmb3IodmFyIGk9SlNFdmVudHMuZXZlbnRIYW5kbGVycy5sZW5ndGgtMTtpPj0wOy0taSl7SlNFdmVudHMuX3JlbW92ZUhhbmRsZXIoaSl9SlNFdmVudHMuZXZlbnRIYW5kbGVycz1bXTtKU0V2ZW50cy5kZWZlcnJlZENhbGxzPVtdfSxyZWdpc3RlclJlbW92ZUV2ZW50TGlzdGVuZXJzOmZ1bmN0aW9uKCl7aWYoIUpTRXZlbnRzLnJlbW92ZUV2ZW50TGlzdGVuZXJzUmVnaXN0ZXJlZCl7X19BVEVYSVRfXy5wdXNoKEpTRXZlbnRzLnJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzKTtKU0V2ZW50cy5yZW1vdmVFdmVudExpc3RlbmVyc1JlZ2lzdGVyZWQ9dHJ1ZX19LGRlZmVycmVkQ2FsbHM6W10sZGVmZXJDYWxsOmZ1bmN0aW9uKHRhcmdldEZ1bmN0aW9uLHByZWNlZGVuY2UsYXJnc0xpc3Qpe2Z1bmN0aW9uIGFycmF5c0hhdmVFcXVhbENvbnRlbnQoYXJyQSxhcnJCKXtpZihhcnJBLmxlbmd0aCE9YXJyQi5sZW5ndGgpcmV0dXJuIGZhbHNlO2Zvcih2YXIgaSBpbiBhcnJBKXtpZihhcnJBW2ldIT1hcnJCW2ldKXJldHVybiBmYWxzZX1yZXR1cm4gdHJ1ZX1mb3IodmFyIGkgaW4gSlNFdmVudHMuZGVmZXJyZWRDYWxscyl7dmFyIGNhbGw9SlNFdmVudHMuZGVmZXJyZWRDYWxsc1tpXTtpZihjYWxsLnRhcmdldEZ1bmN0aW9uPT10YXJnZXRGdW5jdGlvbiYmYXJyYXlzSGF2ZUVxdWFsQ29udGVudChjYWxsLmFyZ3NMaXN0LGFyZ3NMaXN0KSl7cmV0dXJufX1KU0V2ZW50cy5kZWZlcnJlZENhbGxzLnB1c2goe3RhcmdldEZ1bmN0aW9uOnRhcmdldEZ1bmN0aW9uLHByZWNlZGVuY2U6cHJlY2VkZW5jZSxhcmdzTGlzdDphcmdzTGlzdH0pO0pTRXZlbnRzLmRlZmVycmVkQ2FsbHMuc29ydChmdW5jdGlvbih4LHkpe3JldHVybiB4LnByZWNlZGVuY2U8eS5wcmVjZWRlbmNlfSl9LHJlbW92ZURlZmVycmVkQ2FsbHM6ZnVuY3Rpb24odGFyZ2V0RnVuY3Rpb24pe2Zvcih2YXIgaT0wO2k8SlNFdmVudHMuZGVmZXJyZWRDYWxscy5sZW5ndGg7KytpKXtpZihKU0V2ZW50cy5kZWZlcnJlZENhbGxzW2ldLnRhcmdldEZ1bmN0aW9uPT10YXJnZXRGdW5jdGlvbil7SlNFdmVudHMuZGVmZXJyZWRDYWxscy5zcGxpY2UoaSwxKTstLWl9fX0sY2FuUGVyZm9ybUV2ZW50SGFuZGxlclJlcXVlc3RzOmZ1bmN0aW9uKCl7cmV0dXJuIEpTRXZlbnRzLmluRXZlbnRIYW5kbGVyJiZKU0V2ZW50cy5jdXJyZW50RXZlbnRIYW5kbGVyLmFsbG93c0RlZmVycmVkQ2FsbHN9LHJ1bkRlZmVycmVkQ2FsbHM6ZnVuY3Rpb24oKXtpZighSlNFdmVudHMuY2FuUGVyZm9ybUV2ZW50SGFuZGxlclJlcXVlc3RzKCkpe3JldHVybn1mb3IodmFyIGk9MDtpPEpTRXZlbnRzLmRlZmVycmVkQ2FsbHMubGVuZ3RoOysraSl7dmFyIGNhbGw9SlNFdmVudHMuZGVmZXJyZWRDYWxsc1tpXTtKU0V2ZW50cy5kZWZlcnJlZENhbGxzLnNwbGljZShpLDEpOy0taTtjYWxsLnRhcmdldEZ1bmN0aW9uLmFwcGx5KG51bGwsY2FsbC5hcmdzTGlzdCl9fSxldmVudEhhbmRsZXJzOltdLHJlbW92ZUFsbEhhbmRsZXJzT25UYXJnZXQ6ZnVuY3Rpb24odGFyZ2V0LGV2ZW50VHlwZVN0cmluZyl7Zm9yKHZhciBpPTA7aTxKU0V2ZW50cy5ldmVudEhhbmRsZXJzLmxlbmd0aDsrK2kpe2lmKEpTRXZlbnRzLmV2ZW50SGFuZGxlcnNbaV0udGFyZ2V0PT10YXJnZXQmJighZXZlbnRUeXBlU3RyaW5nfHxldmVudFR5cGVTdHJpbmc9PUpTRXZlbnRzLmV2ZW50SGFuZGxlcnNbaV0uZXZlbnRUeXBlU3RyaW5nKSl7SlNFdmVudHMuX3JlbW92ZUhhbmRsZXIoaS0tKX19fSxfcmVtb3ZlSGFuZGxlcjpmdW5jdGlvbihpKXt2YXIgaD1KU0V2ZW50cy5ldmVudEhhbmRsZXJzW2ldO2gudGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoaC5ldmVudFR5cGVTdHJpbmcsaC5ldmVudExpc3RlbmVyRnVuYyxoLnVzZUNhcHR1cmUpO0pTRXZlbnRzLmV2ZW50SGFuZGxlcnMuc3BsaWNlKGksMSl9LHJlZ2lzdGVyT3JSZW1vdmVIYW5kbGVyOmZ1bmN0aW9uKGV2ZW50SGFuZGxlcil7dmFyIGpzRXZlbnRIYW5kbGVyPWZ1bmN0aW9uIGpzRXZlbnRIYW5kbGVyKGV2ZW50KXsrK0pTRXZlbnRzLmluRXZlbnRIYW5kbGVyO0pTRXZlbnRzLmN1cnJlbnRFdmVudEhhbmRsZXI9ZXZlbnRIYW5kbGVyO0pTRXZlbnRzLnJ1bkRlZmVycmVkQ2FsbHMoKTtldmVudEhhbmRsZXIuaGFuZGxlckZ1bmMoZXZlbnQpO0pTRXZlbnRzLnJ1bkRlZmVycmVkQ2FsbHMoKTstLUpTRXZlbnRzLmluRXZlbnRIYW5kbGVyfTtpZihldmVudEhhbmRsZXIuY2FsbGJhY2tmdW5jKXtldmVudEhhbmRsZXIuZXZlbnRMaXN0ZW5lckZ1bmM9anNFdmVudEhhbmRsZXI7ZXZlbnRIYW5kbGVyLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50SGFuZGxlci5ldmVudFR5cGVTdHJpbmcsanNFdmVudEhhbmRsZXIsZXZlbnRIYW5kbGVyLnVzZUNhcHR1cmUpO0pTRXZlbnRzLmV2ZW50SGFuZGxlcnMucHVzaChldmVudEhhbmRsZXIpO0pTRXZlbnRzLnJlZ2lzdGVyUmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKX1lbHNle2Zvcih2YXIgaT0wO2k8SlNFdmVudHMuZXZlbnRIYW5kbGVycy5sZW5ndGg7KytpKXtpZihKU0V2ZW50cy5ldmVudEhhbmRsZXJzW2ldLnRhcmdldD09ZXZlbnRIYW5kbGVyLnRhcmdldCYmSlNFdmVudHMuZXZlbnRIYW5kbGVyc1tpXS5ldmVudFR5cGVTdHJpbmc9PWV2ZW50SGFuZGxlci5ldmVudFR5cGVTdHJpbmcpe0pTRXZlbnRzLl9yZW1vdmVIYW5kbGVyKGktLSl9fX19LHF1ZXVlRXZlbnRIYW5kbGVyT25UaHJlYWRfaWlpaTpmdW5jdGlvbih0YXJnZXRUaHJlYWQsZXZlbnRIYW5kbGVyRnVuYyxldmVudFR5cGVJZCxldmVudERhdGEsdXNlckRhdGEpe3ZhciBzdGFja1RvcD1zdGFja1NhdmUoKTt2YXIgdmFyYXJncz1zdGFja0FsbG9jKDEyKTtHUk9XQUJMRV9IRUFQX0kzMigpW3ZhcmFyZ3M+PjJdPWV2ZW50VHlwZUlkO0dST1dBQkxFX0hFQVBfSTMyKClbdmFyYXJncys0Pj4yXT1ldmVudERhdGE7R1JPV0FCTEVfSEVBUF9JMzIoKVt2YXJhcmdzKzg+PjJdPXVzZXJEYXRhO19fZW1zY3JpcHRlbl9jYWxsX29uX3RocmVhZCgwLHRhcmdldFRocmVhZCw2Mzc1MzQyMDgsZXZlbnRIYW5kbGVyRnVuYyxldmVudERhdGEsdmFyYXJncyk7c3RhY2tSZXN0b3JlKHN0YWNrVG9wKX0sZ2V0VGFyZ2V0VGhyZWFkRm9yRXZlbnRDYWxsYmFjazpmdW5jdGlvbih0YXJnZXRUaHJlYWQpe3N3aXRjaCh0YXJnZXRUaHJlYWQpe2Nhc2UgMTpyZXR1cm4gMDtjYXNlIDI6cmV0dXJuIFBUaHJlYWQuY3VycmVudFByb3hpZWRPcGVyYXRpb25DYWxsZXJUaHJlYWQ7ZGVmYXVsdDpyZXR1cm4gdGFyZ2V0VGhyZWFkfX0sZ2V0Tm9kZU5hbWVGb3JUYXJnZXQ6ZnVuY3Rpb24odGFyZ2V0KXtpZighdGFyZ2V0KXJldHVyblwiXCI7aWYodGFyZ2V0PT13aW5kb3cpcmV0dXJuXCIjd2luZG93XCI7aWYodGFyZ2V0PT1zY3JlZW4pcmV0dXJuXCIjc2NyZWVuXCI7cmV0dXJuIHRhcmdldCYmdGFyZ2V0Lm5vZGVOYW1lP3RhcmdldC5ub2RlTmFtZTpcIlwifSxmdWxsc2NyZWVuRW5hYmxlZDpmdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC5mdWxsc2NyZWVuRW5hYmxlZHx8ZG9jdW1lbnQud2Via2l0RnVsbHNjcmVlbkVuYWJsZWR9fTtmdW5jdGlvbiBzdHJpbmdUb05ld1VURjgoanNTdHJpbmcpe3ZhciBsZW5ndGg9bGVuZ3RoQnl0ZXNVVEY4KGpzU3RyaW5nKSsxO3ZhciBjU3RyaW5nPV9tYWxsb2MobGVuZ3RoKTtzdHJpbmdUb1VURjgoanNTdHJpbmcsY1N0cmluZyxsZW5ndGgpO3JldHVybiBjU3RyaW5nfWZ1bmN0aW9uIF9lbXNjcmlwdGVuX3NldF9vZmZzY3JlZW5jYW52YXNfc2l6ZV9vbl90YXJnZXRfdGhyZWFkX2pzKHRhcmdldFRocmVhZCx0YXJnZXRDYW52YXMsd2lkdGgsaGVpZ2h0KXt2YXIgc3RhY2tUb3A9c3RhY2tTYXZlKCk7dmFyIHZhcmFyZ3M9c3RhY2tBbGxvYygxMik7dmFyIHRhcmdldENhbnZhc1B0cj0wO2lmKHRhcmdldENhbnZhcyl7dGFyZ2V0Q2FudmFzUHRyPXN0cmluZ1RvTmV3VVRGOCh0YXJnZXRDYW52YXMpfUdST1dBQkxFX0hFQVBfSTMyKClbdmFyYXJncz4+Ml09dGFyZ2V0Q2FudmFzUHRyO0dST1dBQkxFX0hFQVBfSTMyKClbdmFyYXJncys0Pj4yXT13aWR0aDtHUk9XQUJMRV9IRUFQX0kzMigpW3ZhcmFyZ3MrOD4+Ml09aGVpZ2h0O19fZW1zY3JpcHRlbl9jYWxsX29uX3RocmVhZCgwLHRhcmdldFRocmVhZCw2NTc0NTcxNTIsMCx0YXJnZXRDYW52YXNQdHIsdmFyYXJncyk7c3RhY2tSZXN0b3JlKHN0YWNrVG9wKX1mdW5jdGlvbiBfZW1zY3JpcHRlbl9zZXRfb2Zmc2NyZWVuY2FudmFzX3NpemVfb25fdGFyZ2V0X3RocmVhZCh0YXJnZXRUaHJlYWQsdGFyZ2V0Q2FudmFzLHdpZHRoLGhlaWdodCl7dGFyZ2V0Q2FudmFzPXRhcmdldENhbnZhcz9VVEY4VG9TdHJpbmcodGFyZ2V0Q2FudmFzKTpcIlwiO19lbXNjcmlwdGVuX3NldF9vZmZzY3JlZW5jYW52YXNfc2l6ZV9vbl90YXJnZXRfdGhyZWFkX2pzKHRhcmdldFRocmVhZCx0YXJnZXRDYW52YXMsd2lkdGgsaGVpZ2h0KX1mdW5jdGlvbiBtYXliZUNTdHJpbmdUb0pzU3RyaW5nKGNTdHJpbmcpe3JldHVybiBjU3RyaW5nPjI/VVRGOFRvU3RyaW5nKGNTdHJpbmcpOmNTdHJpbmd9dmFyIHNwZWNpYWxIVE1MVGFyZ2V0cz1bMCx0eXBlb2YgZG9jdW1lbnQhPT1cInVuZGVmaW5lZFwiP2RvY3VtZW50OjAsdHlwZW9mIHdpbmRvdyE9PVwidW5kZWZpbmVkXCI/d2luZG93OjBdO2Z1bmN0aW9uIGZpbmRFdmVudFRhcmdldCh0YXJnZXQpe3RhcmdldD1tYXliZUNTdHJpbmdUb0pzU3RyaW5nKHRhcmdldCk7dmFyIGRvbUVsZW1lbnQ9c3BlY2lhbEhUTUxUYXJnZXRzW3RhcmdldF18fCh0eXBlb2YgZG9jdW1lbnQhPT1cInVuZGVmaW5lZFwiP2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0KTp1bmRlZmluZWQpO3JldHVybiBkb21FbGVtZW50fWZ1bmN0aW9uIGZpbmRDYW52YXNFdmVudFRhcmdldCh0YXJnZXQpe3JldHVybiBmaW5kRXZlbnRUYXJnZXQodGFyZ2V0KX1mdW5jdGlvbiBfZW1zY3JpcHRlbl9zZXRfY2FudmFzX2VsZW1lbnRfc2l6ZV9jYWxsaW5nX3RocmVhZCh0YXJnZXQsd2lkdGgsaGVpZ2h0KXt2YXIgY2FudmFzPWZpbmRDYW52YXNFdmVudFRhcmdldCh0YXJnZXQpO2lmKCFjYW52YXMpcmV0dXJuLTQ7aWYoY2FudmFzLmNhbnZhc1NoYXJlZFB0cil7R1JPV0FCTEVfSEVBUF9JMzIoKVtjYW52YXMuY2FudmFzU2hhcmVkUHRyPj4yXT13aWR0aDtHUk9XQUJMRV9IRUFQX0kzMigpW2NhbnZhcy5jYW52YXNTaGFyZWRQdHIrND4+Ml09aGVpZ2h0fWlmKGNhbnZhcy5vZmZzY3JlZW5DYW52YXN8fCFjYW52YXMuY29udHJvbFRyYW5zZmVycmVkT2Zmc2NyZWVuKXtpZihjYW52YXMub2Zmc2NyZWVuQ2FudmFzKWNhbnZhcz1jYW52YXMub2Zmc2NyZWVuQ2FudmFzO3ZhciBhdXRvUmVzaXplVmlld3BvcnQ9ZmFsc2U7aWYoY2FudmFzLkdMY3R4T2JqZWN0JiZjYW52YXMuR0xjdHhPYmplY3QuR0xjdHgpe3ZhciBwcmV2Vmlld3BvcnQ9Y2FudmFzLkdMY3R4T2JqZWN0LkdMY3R4LmdldFBhcmFtZXRlcigyOTc4KTthdXRvUmVzaXplVmlld3BvcnQ9cHJldlZpZXdwb3J0WzBdPT09MCYmcHJldlZpZXdwb3J0WzFdPT09MCYmcHJldlZpZXdwb3J0WzJdPT09Y2FudmFzLndpZHRoJiZwcmV2Vmlld3BvcnRbM109PT1jYW52YXMuaGVpZ2h0fWNhbnZhcy53aWR0aD13aWR0aDtjYW52YXMuaGVpZ2h0PWhlaWdodDtpZihhdXRvUmVzaXplVmlld3BvcnQpe2NhbnZhcy5HTGN0eE9iamVjdC5HTGN0eC52aWV3cG9ydCgwLDAsd2lkdGgsaGVpZ2h0KX19ZWxzZSBpZihjYW52YXMuY2FudmFzU2hhcmVkUHRyKXt2YXIgdGFyZ2V0VGhyZWFkPUdST1dBQkxFX0hFQVBfSTMyKClbY2FudmFzLmNhbnZhc1NoYXJlZFB0cis4Pj4yXTtfZW1zY3JpcHRlbl9zZXRfb2Zmc2NyZWVuY2FudmFzX3NpemVfb25fdGFyZ2V0X3RocmVhZCh0YXJnZXRUaHJlYWQsdGFyZ2V0LHdpZHRoLGhlaWdodCk7cmV0dXJuIDF9ZWxzZXtyZXR1cm4tNH1yZXR1cm4gMH1mdW5jdGlvbiBfZW1zY3JpcHRlbl9zZXRfY2FudmFzX2VsZW1lbnRfc2l6ZV9tYWluX3RocmVhZCh0YXJnZXQsd2lkdGgsaGVpZ2h0KXtpZihFTlZJUk9OTUVOVF9JU19QVEhSRUFEKXJldHVybiBfZW1zY3JpcHRlbl9wcm94eV90b19tYWluX3RocmVhZF9qcygyLDEsdGFyZ2V0LHdpZHRoLGhlaWdodCk7cmV0dXJuIF9lbXNjcmlwdGVuX3NldF9jYW52YXNfZWxlbWVudF9zaXplX2NhbGxpbmdfdGhyZWFkKHRhcmdldCx3aWR0aCxoZWlnaHQpfWZ1bmN0aW9uIF9lbXNjcmlwdGVuX3NldF9jYW52YXNfZWxlbWVudF9zaXplKHRhcmdldCx3aWR0aCxoZWlnaHQpe3ZhciBjYW52YXM9ZmluZENhbnZhc0V2ZW50VGFyZ2V0KHRhcmdldCk7aWYoY2FudmFzKXtyZXR1cm4gX2Vtc2NyaXB0ZW5fc2V0X2NhbnZhc19lbGVtZW50X3NpemVfY2FsbGluZ190aHJlYWQodGFyZ2V0LHdpZHRoLGhlaWdodCl9ZWxzZXtyZXR1cm4gX2Vtc2NyaXB0ZW5fc2V0X2NhbnZhc19lbGVtZW50X3NpemVfbWFpbl90aHJlYWQodGFyZ2V0LHdpZHRoLGhlaWdodCl9fWZ1bmN0aW9uIF9lbXNjcmlwdGVuX3NldF9jdXJyZW50X3RocmVhZF9zdGF0dXMobmV3U3RhdHVzKXt9ZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fc2V0X3RocmVhZF9uYW1lKHRocmVhZElkLG5hbWUpe31mdW5jdGlvbiBfX3dlYmdsX2VuYWJsZV9BTkdMRV9pbnN0YW5jZWRfYXJyYXlzKGN0eCl7dmFyIGV4dD1jdHguZ2V0RXh0ZW5zaW9uKFwiQU5HTEVfaW5zdGFuY2VkX2FycmF5c1wiKTtpZihleHQpe2N0eFtcInZlcnRleEF0dHJpYkRpdmlzb3JcIl09ZnVuY3Rpb24oaW5kZXgsZGl2aXNvcil7ZXh0W1widmVydGV4QXR0cmliRGl2aXNvckFOR0xFXCJdKGluZGV4LGRpdmlzb3IpfTtjdHhbXCJkcmF3QXJyYXlzSW5zdGFuY2VkXCJdPWZ1bmN0aW9uKG1vZGUsZmlyc3QsY291bnQscHJpbWNvdW50KXtleHRbXCJkcmF3QXJyYXlzSW5zdGFuY2VkQU5HTEVcIl0obW9kZSxmaXJzdCxjb3VudCxwcmltY291bnQpfTtjdHhbXCJkcmF3RWxlbWVudHNJbnN0YW5jZWRcIl09ZnVuY3Rpb24obW9kZSxjb3VudCx0eXBlLGluZGljZXMscHJpbWNvdW50KXtleHRbXCJkcmF3RWxlbWVudHNJbnN0YW5jZWRBTkdMRVwiXShtb2RlLGNvdW50LHR5cGUsaW5kaWNlcyxwcmltY291bnQpfTtyZXR1cm4gMX19ZnVuY3Rpb24gX193ZWJnbF9lbmFibGVfT0VTX3ZlcnRleF9hcnJheV9vYmplY3QoY3R4KXt2YXIgZXh0PWN0eC5nZXRFeHRlbnNpb24oXCJPRVNfdmVydGV4X2FycmF5X29iamVjdFwiKTtpZihleHQpe2N0eFtcImNyZWF0ZVZlcnRleEFycmF5XCJdPWZ1bmN0aW9uKCl7cmV0dXJuIGV4dFtcImNyZWF0ZVZlcnRleEFycmF5T0VTXCJdKCl9O2N0eFtcImRlbGV0ZVZlcnRleEFycmF5XCJdPWZ1bmN0aW9uKHZhbyl7ZXh0W1wiZGVsZXRlVmVydGV4QXJyYXlPRVNcIl0odmFvKX07Y3R4W1wiYmluZFZlcnRleEFycmF5XCJdPWZ1bmN0aW9uKHZhbyl7ZXh0W1wiYmluZFZlcnRleEFycmF5T0VTXCJdKHZhbyl9O2N0eFtcImlzVmVydGV4QXJyYXlcIl09ZnVuY3Rpb24odmFvKXtyZXR1cm4gZXh0W1wiaXNWZXJ0ZXhBcnJheU9FU1wiXSh2YW8pfTtyZXR1cm4gMX19ZnVuY3Rpb24gX193ZWJnbF9lbmFibGVfV0VCR0xfZHJhd19idWZmZXJzKGN0eCl7dmFyIGV4dD1jdHguZ2V0RXh0ZW5zaW9uKFwiV0VCR0xfZHJhd19idWZmZXJzXCIpO2lmKGV4dCl7Y3R4W1wiZHJhd0J1ZmZlcnNcIl09ZnVuY3Rpb24obixidWZzKXtleHRbXCJkcmF3QnVmZmVyc1dFQkdMXCJdKG4sYnVmcyl9O3JldHVybiAxfX1mdW5jdGlvbiBfX3dlYmdsX2VuYWJsZV9XRUJHTF9tdWx0aV9kcmF3KGN0eCl7cmV0dXJuISEoY3R4Lm11bHRpRHJhd1dlYmdsPWN0eC5nZXRFeHRlbnNpb24oXCJXRUJHTF9tdWx0aV9kcmF3XCIpKX12YXIgR0w9e2NvdW50ZXI6MSxidWZmZXJzOltdLHByb2dyYW1zOltdLGZyYW1lYnVmZmVyczpbXSxyZW5kZXJidWZmZXJzOltdLHRleHR1cmVzOltdLHVuaWZvcm1zOltdLHNoYWRlcnM6W10sdmFvczpbXSxjb250ZXh0czp7fSxvZmZzY3JlZW5DYW52YXNlczp7fSx0aW1lclF1ZXJpZXNFWFQ6W10scHJvZ3JhbUluZm9zOnt9LHN0cmluZ0NhY2hlOnt9LHVucGFja0FsaWdubWVudDo0LHJlY29yZEVycm9yOmZ1bmN0aW9uIHJlY29yZEVycm9yKGVycm9yQ29kZSl7aWYoIUdMLmxhc3RFcnJvcil7R0wubGFzdEVycm9yPWVycm9yQ29kZX19LGdldE5ld0lkOmZ1bmN0aW9uKHRhYmxlKXt2YXIgcmV0PUdMLmNvdW50ZXIrKztmb3IodmFyIGk9dGFibGUubGVuZ3RoO2k8cmV0O2krKyl7dGFibGVbaV09bnVsbH1yZXR1cm4gcmV0fSxnZXRTb3VyY2U6ZnVuY3Rpb24oc2hhZGVyLGNvdW50LHN0cmluZyxsZW5ndGgpe3ZhciBzb3VyY2U9XCJcIjtmb3IodmFyIGk9MDtpPGNvdW50OysraSl7dmFyIGxlbj1sZW5ndGg/R1JPV0FCTEVfSEVBUF9JMzIoKVtsZW5ndGgraSo0Pj4yXTotMTtzb3VyY2UrPVVURjhUb1N0cmluZyhHUk9XQUJMRV9IRUFQX0kzMigpW3N0cmluZytpKjQ+PjJdLGxlbjwwP3VuZGVmaW5lZDpsZW4pfXJldHVybiBzb3VyY2V9LGNyZWF0ZUNvbnRleHQ6ZnVuY3Rpb24oY2FudmFzLHdlYkdMQ29udGV4dEF0dHJpYnV0ZXMpe3ZhciBjdHg9Y2FudmFzLmdldENvbnRleHQoXCJ3ZWJnbFwiLHdlYkdMQ29udGV4dEF0dHJpYnV0ZXMpO2lmKCFjdHgpcmV0dXJuIDA7dmFyIGhhbmRsZT1HTC5yZWdpc3RlckNvbnRleHQoY3R4LHdlYkdMQ29udGV4dEF0dHJpYnV0ZXMpO3JldHVybiBoYW5kbGV9LHJlZ2lzdGVyQ29udGV4dDpmdW5jdGlvbihjdHgsd2ViR0xDb250ZXh0QXR0cmlidXRlcyl7dmFyIGhhbmRsZT1fbWFsbG9jKDgpO0dST1dBQkxFX0hFQVBfSTMyKClbaGFuZGxlKzQ+PjJdPV9wdGhyZWFkX3NlbGYoKTt2YXIgY29udGV4dD17aGFuZGxlOmhhbmRsZSxhdHRyaWJ1dGVzOndlYkdMQ29udGV4dEF0dHJpYnV0ZXMsdmVyc2lvbjp3ZWJHTENvbnRleHRBdHRyaWJ1dGVzLm1ham9yVmVyc2lvbixHTGN0eDpjdHh9O2lmKGN0eC5jYW52YXMpY3R4LmNhbnZhcy5HTGN0eE9iamVjdD1jb250ZXh0O0dMLmNvbnRleHRzW2hhbmRsZV09Y29udGV4dDtpZih0eXBlb2Ygd2ViR0xDb250ZXh0QXR0cmlidXRlcy5lbmFibGVFeHRlbnNpb25zQnlEZWZhdWx0PT09XCJ1bmRlZmluZWRcInx8d2ViR0xDb250ZXh0QXR0cmlidXRlcy5lbmFibGVFeHRlbnNpb25zQnlEZWZhdWx0KXtHTC5pbml0RXh0ZW5zaW9ucyhjb250ZXh0KX1yZXR1cm4gaGFuZGxlfSxtYWtlQ29udGV4dEN1cnJlbnQ6ZnVuY3Rpb24oY29udGV4dEhhbmRsZSl7R0wuY3VycmVudENvbnRleHQ9R0wuY29udGV4dHNbY29udGV4dEhhbmRsZV07TW9kdWxlLmN0eD1HTGN0eD1HTC5jdXJyZW50Q29udGV4dCYmR0wuY3VycmVudENvbnRleHQuR0xjdHg7cmV0dXJuIShjb250ZXh0SGFuZGxlJiYhR0xjdHgpfSxnZXRDb250ZXh0OmZ1bmN0aW9uKGNvbnRleHRIYW5kbGUpe3JldHVybiBHTC5jb250ZXh0c1tjb250ZXh0SGFuZGxlXX0sZGVsZXRlQ29udGV4dDpmdW5jdGlvbihjb250ZXh0SGFuZGxlKXtpZihHTC5jdXJyZW50Q29udGV4dD09PUdMLmNvbnRleHRzW2NvbnRleHRIYW5kbGVdKUdMLmN1cnJlbnRDb250ZXh0PW51bGw7aWYodHlwZW9mIEpTRXZlbnRzPT09XCJvYmplY3RcIilKU0V2ZW50cy5yZW1vdmVBbGxIYW5kbGVyc09uVGFyZ2V0KEdMLmNvbnRleHRzW2NvbnRleHRIYW5kbGVdLkdMY3R4LmNhbnZhcyk7aWYoR0wuY29udGV4dHNbY29udGV4dEhhbmRsZV0mJkdMLmNvbnRleHRzW2NvbnRleHRIYW5kbGVdLkdMY3R4LmNhbnZhcylHTC5jb250ZXh0c1tjb250ZXh0SGFuZGxlXS5HTGN0eC5jYW52YXMuR0xjdHhPYmplY3Q9dW5kZWZpbmVkO19mcmVlKEdMLmNvbnRleHRzW2NvbnRleHRIYW5kbGVdLmhhbmRsZSk7R0wuY29udGV4dHNbY29udGV4dEhhbmRsZV09bnVsbH0saW5pdEV4dGVuc2lvbnM6ZnVuY3Rpb24oY29udGV4dCl7aWYoIWNvbnRleHQpY29udGV4dD1HTC5jdXJyZW50Q29udGV4dDtpZihjb250ZXh0LmluaXRFeHRlbnNpb25zRG9uZSlyZXR1cm47Y29udGV4dC5pbml0RXh0ZW5zaW9uc0RvbmU9dHJ1ZTt2YXIgR0xjdHg9Y29udGV4dC5HTGN0eDtfX3dlYmdsX2VuYWJsZV9BTkdMRV9pbnN0YW5jZWRfYXJyYXlzKEdMY3R4KTtfX3dlYmdsX2VuYWJsZV9PRVNfdmVydGV4X2FycmF5X29iamVjdChHTGN0eCk7X193ZWJnbF9lbmFibGVfV0VCR0xfZHJhd19idWZmZXJzKEdMY3R4KTtHTGN0eC5kaXNqb2ludFRpbWVyUXVlcnlFeHQ9R0xjdHguZ2V0RXh0ZW5zaW9uKFwiRVhUX2Rpc2pvaW50X3RpbWVyX3F1ZXJ5XCIpO19fd2ViZ2xfZW5hYmxlX1dFQkdMX211bHRpX2RyYXcoR0xjdHgpO3ZhciBleHRzPUdMY3R4LmdldFN1cHBvcnRlZEV4dGVuc2lvbnMoKXx8W107ZXh0cy5mb3JFYWNoKGZ1bmN0aW9uKGV4dCl7aWYoZXh0LmluZGV4T2YoXCJsb3NlX2NvbnRleHRcIik8MCYmZXh0LmluZGV4T2YoXCJkZWJ1Z1wiKTwwKXtHTGN0eC5nZXRFeHRlbnNpb24oZXh0KX19KX0scG9wdWxhdGVVbmlmb3JtVGFibGU6ZnVuY3Rpb24ocHJvZ3JhbSl7dmFyIHA9R0wucHJvZ3JhbXNbcHJvZ3JhbV07dmFyIHB0YWJsZT1HTC5wcm9ncmFtSW5mb3NbcHJvZ3JhbV09e3VuaWZvcm1zOnt9LG1heFVuaWZvcm1MZW5ndGg6MCxtYXhBdHRyaWJ1dGVMZW5ndGg6LTEsbWF4VW5pZm9ybUJsb2NrTmFtZUxlbmd0aDotMX07dmFyIHV0YWJsZT1wdGFibGUudW5pZm9ybXM7dmFyIG51bVVuaWZvcm1zPUdMY3R4LmdldFByb2dyYW1QYXJhbWV0ZXIocCwzNTcxOCk7Zm9yKHZhciBpPTA7aTxudW1Vbmlmb3JtczsrK2kpe3ZhciB1PUdMY3R4LmdldEFjdGl2ZVVuaWZvcm0ocCxpKTt2YXIgbmFtZT11Lm5hbWU7cHRhYmxlLm1heFVuaWZvcm1MZW5ndGg9TWF0aC5tYXgocHRhYmxlLm1heFVuaWZvcm1MZW5ndGgsbmFtZS5sZW5ndGgrMSk7aWYobmFtZS5zbGljZSgtMSk9PVwiXVwiKXtuYW1lPW5hbWUuc2xpY2UoMCxuYW1lLmxhc3RJbmRleE9mKFwiW1wiKSl9dmFyIGxvYz1HTGN0eC5nZXRVbmlmb3JtTG9jYXRpb24ocCxuYW1lKTtpZihsb2Mpe3ZhciBpZD1HTC5nZXROZXdJZChHTC51bmlmb3Jtcyk7dXRhYmxlW25hbWVdPVt1LnNpemUsaWRdO0dMLnVuaWZvcm1zW2lkXT1sb2M7Zm9yKHZhciBqPTE7ajx1LnNpemU7KytqKXt2YXIgbj1uYW1lK1wiW1wiK2orXCJdXCI7bG9jPUdMY3R4LmdldFVuaWZvcm1Mb2NhdGlvbihwLG4pO2lkPUdMLmdldE5ld0lkKEdMLnVuaWZvcm1zKTtHTC51bmlmb3Jtc1tpZF09bG9jfX19fX07dmFyIF9fZW1zY3JpcHRlbl93ZWJnbF9wb3dlcl9wcmVmZXJlbmNlcz1bXCJkZWZhdWx0XCIsXCJsb3ctcG93ZXJcIixcImhpZ2gtcGVyZm9ybWFuY2VcIl07ZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fd2ViZ2xfZG9fY3JlYXRlX2NvbnRleHQodGFyZ2V0LGF0dHJpYnV0ZXMpe3ZhciBhPWF0dHJpYnV0ZXM+PjI7dmFyIHBvd2VyUHJlZmVyZW5jZT1HUk9XQUJMRV9IRUFQX0kzMigpW2ErKDI0Pj4yKV07dmFyIGNvbnRleHRBdHRyaWJ1dGVzPXtcImFscGhhXCI6ISFHUk9XQUJMRV9IRUFQX0kzMigpW2ErKDA+PjIpXSxcImRlcHRoXCI6ISFHUk9XQUJMRV9IRUFQX0kzMigpW2ErKDQ+PjIpXSxcInN0ZW5jaWxcIjohIUdST1dBQkxFX0hFQVBfSTMyKClbYSsoOD4+MildLFwiYW50aWFsaWFzXCI6ISFHUk9XQUJMRV9IRUFQX0kzMigpW2ErKDEyPj4yKV0sXCJwcmVtdWx0aXBsaWVkQWxwaGFcIjohIUdST1dBQkxFX0hFQVBfSTMyKClbYSsoMTY+PjIpXSxcInByZXNlcnZlRHJhd2luZ0J1ZmZlclwiOiEhR1JPV0FCTEVfSEVBUF9JMzIoKVthKygyMD4+MildLFwicG93ZXJQcmVmZXJlbmNlXCI6X19lbXNjcmlwdGVuX3dlYmdsX3Bvd2VyX3ByZWZlcmVuY2VzW3Bvd2VyUHJlZmVyZW5jZV0sXCJmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0XCI6ISFHUk9XQUJMRV9IRUFQX0kzMigpW2ErKDI4Pj4yKV0sbWFqb3JWZXJzaW9uOkdST1dBQkxFX0hFQVBfSTMyKClbYSsoMzI+PjIpXSxtaW5vclZlcnNpb246R1JPV0FCTEVfSEVBUF9JMzIoKVthKygzNj4+MildLGVuYWJsZUV4dGVuc2lvbnNCeURlZmF1bHQ6R1JPV0FCTEVfSEVBUF9JMzIoKVthKyg0MD4+MildLGV4cGxpY2l0U3dhcENvbnRyb2w6R1JPV0FCTEVfSEVBUF9JMzIoKVthKyg0ND4+MildLHByb3h5Q29udGV4dFRvTWFpblRocmVhZDpHUk9XQUJMRV9IRUFQX0kzMigpW2ErKDQ4Pj4yKV0scmVuZGVyVmlhT2Zmc2NyZWVuQmFja0J1ZmZlcjpHUk9XQUJMRV9IRUFQX0kzMigpW2ErKDUyPj4yKV19O3ZhciBjYW52YXM9ZmluZENhbnZhc0V2ZW50VGFyZ2V0KHRhcmdldCk7aWYoIWNhbnZhcyl7cmV0dXJuIDB9aWYoY29udGV4dEF0dHJpYnV0ZXMuZXhwbGljaXRTd2FwQ29udHJvbCl7cmV0dXJuIDB9dmFyIGNvbnRleHRIYW5kbGU9R0wuY3JlYXRlQ29udGV4dChjYW52YXMsY29udGV4dEF0dHJpYnV0ZXMpO3JldHVybiBjb250ZXh0SGFuZGxlfWZ1bmN0aW9uIF9lbXNjcmlwdGVuX3dlYmdsX2NyZWF0ZV9jb250ZXh0KGEwLGExKXtyZXR1cm4gX2Vtc2NyaXB0ZW5fd2ViZ2xfZG9fY3JlYXRlX2NvbnRleHQoYTAsYTEpfXZhciBTWVNDQUxMUz17bWFwcGluZ3M6e30sYnVmZmVyczpbbnVsbCxbXSxbXV0scHJpbnRDaGFyOmZ1bmN0aW9uKHN0cmVhbSxjdXJyKXt2YXIgYnVmZmVyPVNZU0NBTExTLmJ1ZmZlcnNbc3RyZWFtXTtpZihjdXJyPT09MHx8Y3Vycj09PTEwKXsoc3RyZWFtPT09MT9vdXQ6ZXJyKShVVEY4QXJyYXlUb1N0cmluZyhidWZmZXIsMCkpO2J1ZmZlci5sZW5ndGg9MH1lbHNle2J1ZmZlci5wdXNoKGN1cnIpfX0sdmFyYXJnczp1bmRlZmluZWQsZ2V0OmZ1bmN0aW9uKCl7U1lTQ0FMTFMudmFyYXJncys9NDt2YXIgcmV0PUdST1dBQkxFX0hFQVBfSTMyKClbU1lTQ0FMTFMudmFyYXJncy00Pj4yXTtyZXR1cm4gcmV0fSxnZXRTdHI6ZnVuY3Rpb24ocHRyKXt2YXIgcmV0PVVURjhUb1N0cmluZyhwdHIpO3JldHVybiByZXR9LGdldDY0OmZ1bmN0aW9uKGxvdyxoaWdoKXtyZXR1cm4gbG93fX07ZnVuY3Rpb24gX2ZkX2Nsb3NlKGZkKXtpZihFTlZJUk9OTUVOVF9JU19QVEhSRUFEKXJldHVybiBfZW1zY3JpcHRlbl9wcm94eV90b19tYWluX3RocmVhZF9qcygzLDEsZmQpO3JldHVybiAwfWZ1bmN0aW9uIF9mZF9zZWVrKGZkLG9mZnNldF9sb3csb2Zmc2V0X2hpZ2gsd2hlbmNlLG5ld09mZnNldCl7aWYoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRClyZXR1cm4gX2Vtc2NyaXB0ZW5fcHJveHlfdG9fbWFpbl90aHJlYWRfanMoNCwxLGZkLG9mZnNldF9sb3csb2Zmc2V0X2hpZ2gsd2hlbmNlLG5ld09mZnNldCl9ZnVuY3Rpb24gX2ZkX3dyaXRlKGZkLGlvdixpb3ZjbnQscG51bSl7aWYoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRClyZXR1cm4gX2Vtc2NyaXB0ZW5fcHJveHlfdG9fbWFpbl90aHJlYWRfanMoNSwxLGZkLGlvdixpb3ZjbnQscG51bSk7dmFyIG51bT0wO2Zvcih2YXIgaT0wO2k8aW92Y250O2krKyl7dmFyIHB0cj1HUk9XQUJMRV9IRUFQX0kzMigpW2lvditpKjg+PjJdO3ZhciBsZW49R1JPV0FCTEVfSEVBUF9JMzIoKVtpb3YrKGkqOCs0KT4+Ml07Zm9yKHZhciBqPTA7ajxsZW47aisrKXtTWVNDQUxMUy5wcmludENoYXIoZmQsR1JPV0FCTEVfSEVBUF9VOCgpW3B0citqXSl9bnVtKz1sZW59R1JPV0FCTEVfSEVBUF9JMzIoKVtwbnVtPj4yXT1udW07cmV0dXJuIDB9ZnVuY3Rpb24gX3B0aHJlYWRfY2xlYW51cF9wb3AoZXhlY3V0ZSl7dmFyIHJvdXRpbmU9UFRocmVhZC50aHJlYWRFeGl0SGFuZGxlcnMucG9wKCk7aWYoZXhlY3V0ZSlyb3V0aW5lKCl9ZnVuY3Rpb24gX3B0aHJlYWRfY2xlYW51cF9wdXNoKHJvdXRpbmUsYXJnKXtQVGhyZWFkLnRocmVhZEV4aXRIYW5kbGVycy5wdXNoKGZ1bmN0aW9uKCl7d2FzbVRhYmxlLmdldChyb3V0aW5lKShhcmcpfSl9ZnVuY3Rpb24gc3Bhd25UaHJlYWQodGhyZWFkUGFyYW1zKXtpZihFTlZJUk9OTUVOVF9JU19QVEhSRUFEKXRocm93XCJJbnRlcm5hbCBFcnJvciEgc3Bhd25UaHJlYWQoKSBjYW4gb25seSBldmVyIGJlIGNhbGxlZCBmcm9tIG1haW4gYXBwbGljYXRpb24gdGhyZWFkIVwiO3ZhciB3b3JrZXI9UFRocmVhZC5nZXROZXdXb3JrZXIoKTtpZih3b3JrZXIucHRocmVhZCE9PXVuZGVmaW5lZCl0aHJvd1wiSW50ZXJuYWwgZXJyb3IhXCI7aWYoIXRocmVhZFBhcmFtcy5wdGhyZWFkX3B0cil0aHJvd1wiSW50ZXJuYWwgZXJyb3IsIG5vIHB0aHJlYWQgcHRyIVwiO1BUaHJlYWQucnVubmluZ1dvcmtlcnMucHVzaCh3b3JrZXIpO3ZhciB0bHNNZW1vcnk9X21hbGxvYygxMjgqNCk7Zm9yKHZhciBpPTA7aTwxMjg7KytpKXtHUk9XQUJMRV9IRUFQX0kzMigpW3Rsc01lbW9yeStpKjQ+PjJdPTB9dmFyIHN0YWNrSGlnaD10aHJlYWRQYXJhbXMuc3RhY2tCYXNlK3RocmVhZFBhcmFtcy5zdGFja1NpemU7dmFyIHB0aHJlYWQ9UFRocmVhZC5wdGhyZWFkc1t0aHJlYWRQYXJhbXMucHRocmVhZF9wdHJdPXt3b3JrZXI6d29ya2VyLHN0YWNrQmFzZTp0aHJlYWRQYXJhbXMuc3RhY2tCYXNlLHN0YWNrU2l6ZTp0aHJlYWRQYXJhbXMuc3RhY2tTaXplLGFsbG9jYXRlZE93blN0YWNrOnRocmVhZFBhcmFtcy5hbGxvY2F0ZWRPd25TdGFjayx0aHJlYWRJbmZvU3RydWN0OnRocmVhZFBhcmFtcy5wdGhyZWFkX3B0cn07dmFyIHRpcz1wdGhyZWFkLnRocmVhZEluZm9TdHJ1Y3Q+PjI7QXRvbWljcy5zdG9yZShHUk9XQUJMRV9IRUFQX1UzMigpLHRpcysoNjQ+PjIpLHRocmVhZFBhcmFtcy5kZXRhY2hlZCk7QXRvbWljcy5zdG9yZShHUk9XQUJMRV9IRUFQX1UzMigpLHRpcysoMTAwPj4yKSx0bHNNZW1vcnkpO0F0b21pY3Muc3RvcmUoR1JPV0FCTEVfSEVBUF9VMzIoKSx0aXMrKDQwPj4yKSxwdGhyZWFkLnRocmVhZEluZm9TdHJ1Y3QpO0F0b21pY3Muc3RvcmUoR1JPV0FCTEVfSEVBUF9VMzIoKSx0aXMrKDgwPj4yKSx0aHJlYWRQYXJhbXMuc3RhY2tTaXplKTtBdG9taWNzLnN0b3JlKEdST1dBQkxFX0hFQVBfVTMyKCksdGlzKyg3Nj4+Miksc3RhY2tIaWdoKTtBdG9taWNzLnN0b3JlKEdST1dBQkxFX0hFQVBfVTMyKCksdGlzKygxMDQ+PjIpLHRocmVhZFBhcmFtcy5zdGFja1NpemUpO0F0b21pY3Muc3RvcmUoR1JPV0FCTEVfSEVBUF9VMzIoKSx0aXMrKDEwNCs4Pj4yKSxzdGFja0hpZ2gpO0F0b21pY3Muc3RvcmUoR1JPV0FCTEVfSEVBUF9VMzIoKSx0aXMrKDEwNCsxMj4+MiksdGhyZWFkUGFyYW1zLmRldGFjaGVkKTt2YXIgZ2xvYmFsX2xpYmM9X2Vtc2NyaXB0ZW5fZ2V0X2dsb2JhbF9saWJjKCk7dmFyIGdsb2JhbF9sb2NhbGU9Z2xvYmFsX2xpYmMrNDA7QXRvbWljcy5zdG9yZShHUk9XQUJMRV9IRUFQX1UzMigpLHRpcysoMTcyPj4yKSxnbG9iYWxfbG9jYWxlKTt3b3JrZXIucHRocmVhZD1wdGhyZWFkO3ZhciBtc2c9e1wiY21kXCI6XCJydW5cIixcInN0YXJ0X3JvdXRpbmVcIjp0aHJlYWRQYXJhbXMuc3RhcnRSb3V0aW5lLFwiYXJnXCI6dGhyZWFkUGFyYW1zLmFyZyxcInRocmVhZEluZm9TdHJ1Y3RcIjp0aHJlYWRQYXJhbXMucHRocmVhZF9wdHIsXCJzdGFja0Jhc2VcIjp0aHJlYWRQYXJhbXMuc3RhY2tCYXNlLFwic3RhY2tTaXplXCI6dGhyZWFkUGFyYW1zLnN0YWNrU2l6ZX07d29ya2VyLnJ1blB0aHJlYWQ9ZnVuY3Rpb24oKXttc2cudGltZT1wZXJmb3JtYW5jZS5ub3coKTt3b3JrZXIucG9zdE1lc3NhZ2UobXNnLHRocmVhZFBhcmFtcy50cmFuc2Zlckxpc3QpfTtpZih3b3JrZXIubG9hZGVkKXt3b3JrZXIucnVuUHRocmVhZCgpO2RlbGV0ZSB3b3JrZXIucnVuUHRocmVhZH19ZnVuY3Rpb24gX3B0aHJlYWRfY3JlYXRlKHB0aHJlYWRfcHRyLGF0dHIsc3RhcnRfcm91dGluZSxhcmcpe2lmKHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlcj09PVwidW5kZWZpbmVkXCIpe2VycihcIkN1cnJlbnQgZW52aXJvbm1lbnQgZG9lcyBub3Qgc3VwcG9ydCBTaGFyZWRBcnJheUJ1ZmZlciwgcHRocmVhZHMgYXJlIG5vdCBhdmFpbGFibGUhXCIpO3JldHVybiA2fWlmKCFwdGhyZWFkX3B0cil7ZXJyKFwicHRocmVhZF9jcmVhdGUgY2FsbGVkIHdpdGggYSBudWxsIHRocmVhZCBwb2ludGVyIVwiKTtyZXR1cm4gMjh9dmFyIHRyYW5zZmVyTGlzdD1bXTt2YXIgZXJyb3I9MDtpZihFTlZJUk9OTUVOVF9JU19QVEhSRUFEJiYodHJhbnNmZXJMaXN0Lmxlbmd0aD09PTB8fGVycm9yKSl7cmV0dXJuIF9lbXNjcmlwdGVuX3N5bmNfcnVuX2luX21haW5fdGhyZWFkXzQoNjg3ODY1ODU2LHB0aHJlYWRfcHRyLGF0dHIsc3RhcnRfcm91dGluZSxhcmcpfWlmKGVycm9yKXJldHVybiBlcnJvcjt2YXIgc3RhY2tTaXplPTA7dmFyIHN0YWNrQmFzZT0wO3ZhciBkZXRhY2hlZD0wO2lmKGF0dHImJmF0dHIhPS0xKXtzdGFja1NpemU9R1JPV0FCTEVfSEVBUF9JMzIoKVthdHRyPj4yXTtzdGFja1NpemUrPTgxOTIwO3N0YWNrQmFzZT1HUk9XQUJMRV9IRUFQX0kzMigpW2F0dHIrOD4+Ml07ZGV0YWNoZWQ9R1JPV0FCTEVfSEVBUF9JMzIoKVthdHRyKzEyPj4yXSE9PTB9ZWxzZXtzdGFja1NpemU9MjA5NzE1Mn12YXIgYWxsb2NhdGVkT3duU3RhY2s9c3RhY2tCYXNlPT0wO2lmKGFsbG9jYXRlZE93blN0YWNrKXtzdGFja0Jhc2U9X21lbWFsaWduKDE2LHN0YWNrU2l6ZSl9ZWxzZXtzdGFja0Jhc2UtPXN0YWNrU2l6ZTthc3NlcnQoc3RhY2tCYXNlPjApfXZhciB0aHJlYWRJbmZvU3RydWN0PV9tYWxsb2MoMjI4KTtmb3IodmFyIGk9MDtpPDIyOD4+MjsrK2kpR1JPV0FCTEVfSEVBUF9VMzIoKVsodGhyZWFkSW5mb1N0cnVjdD4+MikraV09MDtHUk9XQUJMRV9IRUFQX0kzMigpW3B0aHJlYWRfcHRyPj4yXT10aHJlYWRJbmZvU3RydWN0O0dST1dBQkxFX0hFQVBfSTMyKClbdGhyZWFkSW5mb1N0cnVjdCsxMj4+Ml09dGhyZWFkSW5mb1N0cnVjdDt2YXIgaGVhZFB0cj10aHJlYWRJbmZvU3RydWN0KzE1MjtHUk9XQUJMRV9IRUFQX0kzMigpW2hlYWRQdHI+PjJdPWhlYWRQdHI7dmFyIHRocmVhZFBhcmFtcz17c3RhY2tCYXNlOnN0YWNrQmFzZSxzdGFja1NpemU6c3RhY2tTaXplLGFsbG9jYXRlZE93blN0YWNrOmFsbG9jYXRlZE93blN0YWNrLGRldGFjaGVkOmRldGFjaGVkLHN0YXJ0Um91dGluZTpzdGFydF9yb3V0aW5lLHB0aHJlYWRfcHRyOnRocmVhZEluZm9TdHJ1Y3QsYXJnOmFyZyx0cmFuc2Zlckxpc3Q6dHJhbnNmZXJMaXN0fTtpZihFTlZJUk9OTUVOVF9JU19QVEhSRUFEKXt0aHJlYWRQYXJhbXMuY21kPVwic3Bhd25UaHJlYWRcIjtwb3N0TWVzc2FnZSh0aHJlYWRQYXJhbXMsdHJhbnNmZXJMaXN0KX1lbHNle3NwYXduVGhyZWFkKHRocmVhZFBhcmFtcyl9cmV0dXJuIDB9ZnVuY3Rpb24gX3N5c2NvbmYobmFtZSl7aWYoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRClyZXR1cm4gX2Vtc2NyaXB0ZW5fcHJveHlfdG9fbWFpbl90aHJlYWRfanMoNiwxLG5hbWUpO3N3aXRjaChuYW1lKXtjYXNlIDMwOnJldHVybiAxNjM4NDtjYXNlIDg1OnZhciBtYXhIZWFwU2l6ZT0yMTQ3NDgzNjQ4O3JldHVybiBtYXhIZWFwU2l6ZS8xNjM4NDtjYXNlIDEzMjpjYXNlIDEzMzpjYXNlIDEyOmNhc2UgMTM3OmNhc2UgMTM4OmNhc2UgMTU6Y2FzZSAyMzU6Y2FzZSAxNjpjYXNlIDE3OmNhc2UgMTg6Y2FzZSAxOTpjYXNlIDIwOmNhc2UgMTQ5OmNhc2UgMTM6Y2FzZSAxMDpjYXNlIDIzNjpjYXNlIDE1MzpjYXNlIDk6Y2FzZSAyMTpjYXNlIDIyOmNhc2UgMTU5OmNhc2UgMTU0OmNhc2UgMTQ6Y2FzZSA3NzpjYXNlIDc4OmNhc2UgMTM5OmNhc2UgODI6Y2FzZSA2ODpjYXNlIDY3OmNhc2UgMTY0OmNhc2UgMTE6Y2FzZSAyOTpjYXNlIDQ3OmNhc2UgNDg6Y2FzZSA5NTpjYXNlIDUyOmNhc2UgNTE6Y2FzZSA0NjpyZXR1cm4gMjAwODA5O2Nhc2UgMjc6Y2FzZSAyNDY6Y2FzZSAxMjc6Y2FzZSAxMjg6Y2FzZSAyMzpjYXNlIDI0OmNhc2UgMTYwOmNhc2UgMTYxOmNhc2UgMTgxOmNhc2UgMTgyOmNhc2UgMjQyOmNhc2UgMTgzOmNhc2UgMTg0OmNhc2UgMjQzOmNhc2UgMjQ0OmNhc2UgMjQ1OmNhc2UgMTY1OmNhc2UgMTc4OmNhc2UgMTc5OmNhc2UgNDk6Y2FzZSA1MDpjYXNlIDE2ODpjYXNlIDE2OTpjYXNlIDE3NTpjYXNlIDE3MDpjYXNlIDE3MTpjYXNlIDE3MjpjYXNlIDk3OmNhc2UgNzY6Y2FzZSAzMjpjYXNlIDE3MzpjYXNlIDM1OmNhc2UgODA6Y2FzZSA4MTpjYXNlIDc5OnJldHVybi0xO2Nhc2UgMTc2OmNhc2UgMTc3OmNhc2UgNzpjYXNlIDE1NTpjYXNlIDg6Y2FzZSAxNTc6Y2FzZSAxMjU6Y2FzZSAxMjY6Y2FzZSA5MjpjYXNlIDkzOmNhc2UgMTI5OmNhc2UgMTMwOmNhc2UgMTMxOmNhc2UgOTQ6Y2FzZSA5MTpyZXR1cm4gMTtjYXNlIDc0OmNhc2UgNjA6Y2FzZSA2OTpjYXNlIDcwOmNhc2UgNDpyZXR1cm4gMTAyNDtjYXNlIDMxOmNhc2UgNDI6Y2FzZSA3MjpyZXR1cm4gMzI7Y2FzZSA4NzpjYXNlIDI2OmNhc2UgMzM6cmV0dXJuIDIxNDc0ODM2NDc7Y2FzZSAzNDpjYXNlIDE6cmV0dXJuIDQ3ODM5O2Nhc2UgMzg6Y2FzZSAzNjpyZXR1cm4gOTk7Y2FzZSA0MzpjYXNlIDM3OnJldHVybiAyMDQ4O2Nhc2UgMDpyZXR1cm4gMjA5NzE1MjtjYXNlIDM6cmV0dXJuIDY1NTM2O2Nhc2UgMjg6cmV0dXJuIDMyNzY4O2Nhc2UgNDQ6cmV0dXJuIDMyNzY3O2Nhc2UgNzU6cmV0dXJuIDE2Mzg0O2Nhc2UgMzk6cmV0dXJuIDFlMztjYXNlIDg5OnJldHVybiA3MDA7Y2FzZSA3MTpyZXR1cm4gMjU2O2Nhc2UgNDA6cmV0dXJuIDI1NTtjYXNlIDI6cmV0dXJuIDEwMDtjYXNlIDE4MDpyZXR1cm4gNjQ7Y2FzZSAyNTpyZXR1cm4gMjA7Y2FzZSA1OnJldHVybiAxNjtjYXNlIDY6cmV0dXJuIDY7Y2FzZSA3MzpyZXR1cm4gNDtjYXNlIDg0OntpZih0eXBlb2YgbmF2aWdhdG9yPT09XCJvYmplY3RcIilyZXR1cm4gbmF2aWdhdG9yW1wiaGFyZHdhcmVDb25jdXJyZW5jeVwiXXx8MTtyZXR1cm4gMX19c2V0RXJyTm8oMjgpO3JldHVybi0xfWlmKCFFTlZJUk9OTUVOVF9JU19QVEhSRUFEKVBUaHJlYWQuaW5pdE1haW5UaHJlYWRCbG9jaygpO3ZhciBHTGN0eDt2YXIgcHJveGllZEZ1bmN0aW9uVGFibGU9W251bGwsX2F0ZXhpdCxfZW1zY3JpcHRlbl9zZXRfY2FudmFzX2VsZW1lbnRfc2l6ZV9tYWluX3RocmVhZCxfZmRfY2xvc2UsX2ZkX3NlZWssX2ZkX3dyaXRlLF9zeXNjb25mXTt2YXIgYXNtTGlicmFyeUFyZz17XCJlXCI6X19fYXNzZXJ0X2ZhaWwsXCJyXCI6X19fY2FsbF9tYWluLFwieFwiOl9fZW1zY3JpcHRlbl9ub3RpZnlfdGhyZWFkX3F1ZXVlLFwiYlwiOl9hYm9ydCxcInlcIjpfZW1zY3JpcHRlbl9hc21fY29uc3RfaW50LFwialwiOl9lbXNjcmlwdGVuX2NvbmRpdGlvbmFsX3NldF9jdXJyZW50X3RocmVhZF9zdGF0dXMsXCJjXCI6X2Vtc2NyaXB0ZW5fZnV0ZXhfd2FpdCxcImRcIjpfZW1zY3JpcHRlbl9mdXRleF93YWtlLFwiZlwiOl9lbXNjcmlwdGVuX2dldF9ub3csXCJwXCI6X2Vtc2NyaXB0ZW5fbWVtY3B5X2JpZyxcInpcIjpfZW1zY3JpcHRlbl9udW1fbG9naWNhbF9jb3JlcyxcInVcIjpfZW1zY3JpcHRlbl9yZWNlaXZlX29uX21haW5fdGhyZWFkX2pzLFwicVwiOl9lbXNjcmlwdGVuX3Jlc2l6ZV9oZWFwLFwidlwiOl9lbXNjcmlwdGVuX3NldF9jYW52YXNfZWxlbWVudF9zaXplLFwiaVwiOl9lbXNjcmlwdGVuX3NldF9jdXJyZW50X3RocmVhZF9zdGF0dXMsXCJ0XCI6X2Vtc2NyaXB0ZW5fc2V0X3RocmVhZF9uYW1lLFwid1wiOl9lbXNjcmlwdGVuX3dlYmdsX2NyZWF0ZV9jb250ZXh0LFwibVwiOl9mZF9jbG9zZSxcIm5cIjpfZmRfc2VlayxcImdcIjpfZmRfd3JpdGUsXCJvXCI6aW5pdFB0aHJlYWRzSlMsXCJhXCI6d2FzbU1lbW9yeXx8TW9kdWxlW1wid2FzbU1lbW9yeVwiXSxcImtcIjpfcHRocmVhZF9jbGVhbnVwX3BvcCxcImxcIjpfcHRocmVhZF9jbGVhbnVwX3B1c2gsXCJoXCI6X3B0aHJlYWRfY3JlYXRlLFwic1wiOl9zeXNjb25mfTt2YXIgYXNtPWNyZWF0ZVdhc20oKTt2YXIgX19fd2FzbV9jYWxsX2N0b3JzPU1vZHVsZVtcIl9fX3dhc21fY2FsbF9jdG9yc1wiXT1mdW5jdGlvbigpe3JldHVybihfX193YXNtX2NhbGxfY3RvcnM9TW9kdWxlW1wiX19fd2FzbV9jYWxsX2N0b3JzXCJdPU1vZHVsZVtcImFzbVwiXVtcIkFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9pbml0PU1vZHVsZVtcIl9pbml0XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9pbml0PU1vZHVsZVtcIl9pbml0XCJdPU1vZHVsZVtcImFzbVwiXVtcIkJcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9yZWdpc3Rlcl90ZW5zb3I9TW9kdWxlW1wiX3JlZ2lzdGVyX3RlbnNvclwiXT1mdW5jdGlvbigpe3JldHVybihfcmVnaXN0ZXJfdGVuc29yPU1vZHVsZVtcIl9yZWdpc3Rlcl90ZW5zb3JcIl09TW9kdWxlW1wiYXNtXCJdW1wiQ1wiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX2Rpc3Bvc2VfZGF0YT1Nb2R1bGVbXCJfZGlzcG9zZV9kYXRhXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9kaXNwb3NlX2RhdGE9TW9kdWxlW1wiX2Rpc3Bvc2VfZGF0YVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJEXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfZGlzcG9zZT1Nb2R1bGVbXCJfZGlzcG9zZVwiXT1mdW5jdGlvbigpe3JldHVybihfZGlzcG9zZT1Nb2R1bGVbXCJfZGlzcG9zZVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJFXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQWJzPU1vZHVsZVtcIl9BYnNcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0Ficz1Nb2R1bGVbXCJfQWJzXCJdPU1vZHVsZVtcImFzbVwiXVtcIkdcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9BZGQ9TW9kdWxlW1wiX0FkZFwiXT1mdW5jdGlvbigpe3JldHVybihfQWRkPU1vZHVsZVtcIl9BZGRcIl09TW9kdWxlW1wiYXNtXCJdW1wiSFwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0FkZE49TW9kdWxlW1wiX0FkZE5cIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0FkZE49TW9kdWxlW1wiX0FkZE5cIl09TW9kdWxlW1wiYXNtXCJdW1wiSVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0FsbD1Nb2R1bGVbXCJfQWxsXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9BbGw9TW9kdWxlW1wiX0FsbFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJKXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQW55PU1vZHVsZVtcIl9BbnlcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0FueT1Nb2R1bGVbXCJfQW55XCJdPU1vZHVsZVtcImFzbVwiXVtcIktcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9BcmdNYXg9TW9kdWxlW1wiX0FyZ01heFwiXT1mdW5jdGlvbigpe3JldHVybihfQXJnTWF4PU1vZHVsZVtcIl9BcmdNYXhcIl09TW9kdWxlW1wiYXNtXCJdW1wiTFwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0F2Z1Bvb2w9TW9kdWxlW1wiX0F2Z1Bvb2xcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0F2Z1Bvb2w9TW9kdWxlW1wiX0F2Z1Bvb2xcIl09TW9kdWxlW1wiYXNtXCJdW1wiTVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0JhdGNoTWF0TXVsPU1vZHVsZVtcIl9CYXRjaE1hdE11bFwiXT1mdW5jdGlvbigpe3JldHVybihfQmF0Y2hNYXRNdWw9TW9kdWxlW1wiX0JhdGNoTWF0TXVsXCJdPU1vZHVsZVtcImFzbVwiXVtcIk5cIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9DZWlsPU1vZHVsZVtcIl9DZWlsXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9DZWlsPU1vZHVsZVtcIl9DZWlsXCJdPU1vZHVsZVtcImFzbVwiXVtcIk9cIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9DbGlwQnlWYWx1ZT1Nb2R1bGVbXCJfQ2xpcEJ5VmFsdWVcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0NsaXBCeVZhbHVlPU1vZHVsZVtcIl9DbGlwQnlWYWx1ZVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJQXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQ29udjJEPU1vZHVsZVtcIl9Db252MkRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0NvbnYyRD1Nb2R1bGVbXCJfQ29udjJEXCJdPU1vZHVsZVtcImFzbVwiXVtcIlFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Db252MkRCYWNrcHJvcElucHV0PU1vZHVsZVtcIl9Db252MkRCYWNrcHJvcElucHV0XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Db252MkRCYWNrcHJvcElucHV0PU1vZHVsZVtcIl9Db252MkRCYWNrcHJvcElucHV0XCJdPU1vZHVsZVtcImFzbVwiXVtcIlJcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Db3M9TW9kdWxlW1wiX0Nvc1wiXT1mdW5jdGlvbigpe3JldHVybihfQ29zPU1vZHVsZVtcIl9Db3NcIl09TW9kdWxlW1wiYXNtXCJdW1wiU1wiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0Nvc2g9TW9kdWxlW1wiX0Nvc2hcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0Nvc2g9TW9kdWxlW1wiX0Nvc2hcIl09TW9kdWxlW1wiYXNtXCJdW1wiVFwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0Nyb3BBbmRSZXNpemU9TW9kdWxlW1wiX0Nyb3BBbmRSZXNpemVcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0Nyb3BBbmRSZXNpemU9TW9kdWxlW1wiX0Nyb3BBbmRSZXNpemVcIl09TW9kdWxlW1wiYXNtXCJdW1wiVVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0N1bXN1bT1Nb2R1bGVbXCJfQ3Vtc3VtXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9DdW1zdW09TW9kdWxlW1wiX0N1bXN1bVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJWXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfRGVwdGhUb1NwYWNlPU1vZHVsZVtcIl9EZXB0aFRvU3BhY2VcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0RlcHRoVG9TcGFjZT1Nb2R1bGVbXCJfRGVwdGhUb1NwYWNlXCJdPU1vZHVsZVtcImFzbVwiXVtcIldcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9EZXB0aHdpc2VDb252MmROYXRpdmU9TW9kdWxlW1wiX0RlcHRod2lzZUNvbnYyZE5hdGl2ZVwiXT1mdW5jdGlvbigpe3JldHVybihfRGVwdGh3aXNlQ29udjJkTmF0aXZlPU1vZHVsZVtcIl9EZXB0aHdpc2VDb252MmROYXRpdmVcIl09TW9kdWxlW1wiYXNtXCJdW1wiWFwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0VxdWFsPU1vZHVsZVtcIl9FcXVhbFwiXT1mdW5jdGlvbigpe3JldHVybihfRXF1YWw9TW9kdWxlW1wiX0VxdWFsXCJdPU1vZHVsZVtcImFzbVwiXVtcIllcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9FeHA9TW9kdWxlW1wiX0V4cFwiXT1mdW5jdGlvbigpe3JldHVybihfRXhwPU1vZHVsZVtcIl9FeHBcIl09TW9kdWxlW1wiYXNtXCJdW1wiWlwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0ZsaXBMZWZ0UmlnaHQ9TW9kdWxlW1wiX0ZsaXBMZWZ0UmlnaHRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0ZsaXBMZWZ0UmlnaHQ9TW9kdWxlW1wiX0ZsaXBMZWZ0UmlnaHRcIl09TW9kdWxlW1wiYXNtXCJdW1wiX1wiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0Zsb29yPU1vZHVsZVtcIl9GbG9vclwiXT1mdW5jdGlvbigpe3JldHVybihfRmxvb3I9TW9kdWxlW1wiX0Zsb29yXCJdPU1vZHVsZVtcImFzbVwiXVtcIiRcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9GbG9vckRpdj1Nb2R1bGVbXCJfRmxvb3JEaXZcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0Zsb29yRGl2PU1vZHVsZVtcIl9GbG9vckRpdlwiXT1Nb2R1bGVbXCJhc21cIl1bXCJhYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0Z1c2VkQmF0Y2hOb3JtPU1vZHVsZVtcIl9GdXNlZEJhdGNoTm9ybVwiXT1mdW5jdGlvbigpe3JldHVybihfRnVzZWRCYXRjaE5vcm09TW9kdWxlW1wiX0Z1c2VkQmF0Y2hOb3JtXCJdPU1vZHVsZVtcImFzbVwiXVtcImJhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfRnVzZWRDb252MkQ9TW9kdWxlW1wiX0Z1c2VkQ29udjJEXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9GdXNlZENvbnYyRD1Nb2R1bGVbXCJfRnVzZWRDb252MkRcIl09TW9kdWxlW1wiYXNtXCJdW1wiY2FcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9GdXNlZERlcHRod2lzZUNvbnYyRD1Nb2R1bGVbXCJfRnVzZWREZXB0aHdpc2VDb252MkRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0Z1c2VkRGVwdGh3aXNlQ29udjJEPU1vZHVsZVtcIl9GdXNlZERlcHRod2lzZUNvbnYyRFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJkYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0dhdGhlcj1Nb2R1bGVbXCJfR2F0aGVyXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9HYXRoZXI9TW9kdWxlW1wiX0dhdGhlclwiXT1Nb2R1bGVbXCJhc21cIl1bXCJlYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0dhdGhlck5kPU1vZHVsZVtcIl9HYXRoZXJOZFwiXT1mdW5jdGlvbigpe3JldHVybihfR2F0aGVyTmQ9TW9kdWxlW1wiX0dhdGhlck5kXCJdPU1vZHVsZVtcImFzbVwiXVtcImZhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfR3JlYXRlcj1Nb2R1bGVbXCJfR3JlYXRlclwiXT1mdW5jdGlvbigpe3JldHVybihfR3JlYXRlcj1Nb2R1bGVbXCJfR3JlYXRlclwiXT1Nb2R1bGVbXCJhc21cIl1bXCJnYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0dyZWF0ZXJFcXVhbD1Nb2R1bGVbXCJfR3JlYXRlckVxdWFsXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9HcmVhdGVyRXF1YWw9TW9kdWxlW1wiX0dyZWF0ZXJFcXVhbFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJoYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0xlYWt5UmVsdT1Nb2R1bGVbXCJfTGVha3lSZWx1XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9MZWFreVJlbHU9TW9kdWxlW1wiX0xlYWt5UmVsdVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJpYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0xlc3M9TW9kdWxlW1wiX0xlc3NcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0xlc3M9TW9kdWxlW1wiX0xlc3NcIl09TW9kdWxlW1wiYXNtXCJdW1wiamFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9MZXNzRXF1YWw9TW9kdWxlW1wiX0xlc3NFcXVhbFwiXT1mdW5jdGlvbigpe3JldHVybihfTGVzc0VxdWFsPU1vZHVsZVtcIl9MZXNzRXF1YWxcIl09TW9kdWxlW1wiYXNtXCJdW1wia2FcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Mb2c9TW9kdWxlW1wiX0xvZ1wiXT1mdW5jdGlvbigpe3JldHVybihfTG9nPU1vZHVsZVtcIl9Mb2dcIl09TW9kdWxlW1wiYXNtXCJdW1wibGFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Mb2dpY2FsQW5kPU1vZHVsZVtcIl9Mb2dpY2FsQW5kXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Mb2dpY2FsQW5kPU1vZHVsZVtcIl9Mb2dpY2FsQW5kXCJdPU1vZHVsZVtcImFzbVwiXVtcIm1hXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTWF4PU1vZHVsZVtcIl9NYXhcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX01heD1Nb2R1bGVbXCJfTWF4XCJdPU1vZHVsZVtcImFzbVwiXVtcIm5hXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTWF4UG9vbD1Nb2R1bGVbXCJfTWF4UG9vbFwiXT1mdW5jdGlvbigpe3JldHVybihfTWF4UG9vbD1Nb2R1bGVbXCJfTWF4UG9vbFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJvYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX01heGltdW09TW9kdWxlW1wiX01heGltdW1cIl09ZnVuY3Rpb24oKXtyZXR1cm4oX01heGltdW09TW9kdWxlW1wiX01heGltdW1cIl09TW9kdWxlW1wiYXNtXCJdW1wicGFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9NZWFuPU1vZHVsZVtcIl9NZWFuXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9NZWFuPU1vZHVsZVtcIl9NZWFuXCJdPU1vZHVsZVtcImFzbVwiXVtcInFhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTWluPU1vZHVsZVtcIl9NaW5cIl09ZnVuY3Rpb24oKXtyZXR1cm4oX01pbj1Nb2R1bGVbXCJfTWluXCJdPU1vZHVsZVtcImFzbVwiXVtcInJhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTWluaW11bT1Nb2R1bGVbXCJfTWluaW11bVwiXT1mdW5jdGlvbigpe3JldHVybihfTWluaW11bT1Nb2R1bGVbXCJfTWluaW11bVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJzYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX01pcnJvclBhZD1Nb2R1bGVbXCJfTWlycm9yUGFkXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9NaXJyb3JQYWQ9TW9kdWxlW1wiX01pcnJvclBhZFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJ0YVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX011bHRpcGx5PU1vZHVsZVtcIl9NdWx0aXBseVwiXT1mdW5jdGlvbigpe3JldHVybihfTXVsdGlwbHk9TW9kdWxlW1wiX011bHRpcGx5XCJdPU1vZHVsZVtcImFzbVwiXVtcInVhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTmVnPU1vZHVsZVtcIl9OZWdcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX05lZz1Nb2R1bGVbXCJfTmVnXCJdPU1vZHVsZVtcImFzbVwiXVtcInZhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTm9uTWF4U3VwcHJlc3Npb25WMz1Nb2R1bGVbXCJfTm9uTWF4U3VwcHJlc3Npb25WM1wiXT1mdW5jdGlvbigpe3JldHVybihfTm9uTWF4U3VwcHJlc3Npb25WMz1Nb2R1bGVbXCJfTm9uTWF4U3VwcHJlc3Npb25WM1wiXT1Nb2R1bGVbXCJhc21cIl1bXCJ3YVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX05vbk1heFN1cHByZXNzaW9uVjQ9TW9kdWxlW1wiX05vbk1heFN1cHByZXNzaW9uVjRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX05vbk1heFN1cHByZXNzaW9uVjQ9TW9kdWxlW1wiX05vbk1heFN1cHByZXNzaW9uVjRcIl09TW9kdWxlW1wiYXNtXCJdW1wieGFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Ob25NYXhTdXBwcmVzc2lvblY1PU1vZHVsZVtcIl9Ob25NYXhTdXBwcmVzc2lvblY1XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Ob25NYXhTdXBwcmVzc2lvblY1PU1vZHVsZVtcIl9Ob25NYXhTdXBwcmVzc2lvblY1XCJdPU1vZHVsZVtcImFzbVwiXVtcInlhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTm90RXF1YWw9TW9kdWxlW1wiX05vdEVxdWFsXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Ob3RFcXVhbD1Nb2R1bGVbXCJfTm90RXF1YWxcIl09TW9kdWxlW1wiYXNtXCJdW1wiemFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9PbmVIb3Q9TW9kdWxlW1wiX09uZUhvdFwiXT1mdW5jdGlvbigpe3JldHVybihfT25lSG90PU1vZHVsZVtcIl9PbmVIb3RcIl09TW9kdWxlW1wiYXNtXCJdW1wiQWFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9QYWRWMj1Nb2R1bGVbXCJfUGFkVjJcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1BhZFYyPU1vZHVsZVtcIl9QYWRWMlwiXT1Nb2R1bGVbXCJhc21cIl1bXCJCYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1Bvdz1Nb2R1bGVbXCJfUG93XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Qb3c9TW9kdWxlW1wiX1Bvd1wiXT1Nb2R1bGVbXCJhc21cIl1bXCJDYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1ByZWx1PU1vZHVsZVtcIl9QcmVsdVwiXT1mdW5jdGlvbigpe3JldHVybihfUHJlbHU9TW9kdWxlW1wiX1ByZWx1XCJdPU1vZHVsZVtcImFzbVwiXVtcIkRhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfUHJvZD1Nb2R1bGVbXCJfUHJvZFwiXT1mdW5jdGlvbigpe3JldHVybihfUHJvZD1Nb2R1bGVbXCJfUHJvZFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJFYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1JlYWxEaXY9TW9kdWxlW1wiX1JlYWxEaXZcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1JlYWxEaXY9TW9kdWxlW1wiX1JlYWxEaXZcIl09TW9kdWxlW1wiYXNtXCJdW1wiRmFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9SZWx1PU1vZHVsZVtcIl9SZWx1XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9SZWx1PU1vZHVsZVtcIl9SZWx1XCJdPU1vZHVsZVtcImFzbVwiXVtcIkdhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfUmVsdTY9TW9kdWxlW1wiX1JlbHU2XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9SZWx1Nj1Nb2R1bGVbXCJfUmVsdTZcIl09TW9kdWxlW1wiYXNtXCJdW1wiSGFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9SZXNpemVCaWxpbmVhcj1Nb2R1bGVbXCJfUmVzaXplQmlsaW5lYXJcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1Jlc2l6ZUJpbGluZWFyPU1vZHVsZVtcIl9SZXNpemVCaWxpbmVhclwiXT1Nb2R1bGVbXCJhc21cIl1bXCJJYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1JldmVyc2U9TW9kdWxlW1wiX1JldmVyc2VcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1JldmVyc2U9TW9kdWxlW1wiX1JldmVyc2VcIl09TW9kdWxlW1wiYXNtXCJdW1wiSmFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Sb3RhdGVXaXRoT2Zmc2V0PU1vZHVsZVtcIl9Sb3RhdGVXaXRoT2Zmc2V0XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Sb3RhdGVXaXRoT2Zmc2V0PU1vZHVsZVtcIl9Sb3RhdGVXaXRoT2Zmc2V0XCJdPU1vZHVsZVtcImFzbVwiXVtcIkthXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfUm91bmQ9TW9kdWxlW1wiX1JvdW5kXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Sb3VuZD1Nb2R1bGVbXCJfUm91bmRcIl09TW9kdWxlW1wiYXNtXCJdW1wiTGFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Sc3FydD1Nb2R1bGVbXCJfUnNxcnRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1JzcXJ0PU1vZHVsZVtcIl9Sc3FydFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJNYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1NjYXR0ZXJOZD1Nb2R1bGVbXCJfU2NhdHRlck5kXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9TY2F0dGVyTmQ9TW9kdWxlW1wiX1NjYXR0ZXJOZFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJOYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1NlbGVjdFYyPU1vZHVsZVtcIl9TZWxlY3RWMlwiXT1mdW5jdGlvbigpe3JldHVybihfU2VsZWN0VjI9TW9kdWxlW1wiX1NlbGVjdFYyXCJdPU1vZHVsZVtcImFzbVwiXVtcIk9hXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfU2lnbW9pZD1Nb2R1bGVbXCJfU2lnbW9pZFwiXT1mdW5jdGlvbigpe3JldHVybihfU2lnbW9pZD1Nb2R1bGVbXCJfU2lnbW9pZFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJQYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1Npbj1Nb2R1bGVbXCJfU2luXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9TaW49TW9kdWxlW1wiX1NpblwiXT1Nb2R1bGVbXCJhc21cIl1bXCJRYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1NvZnRtYXg9TW9kdWxlW1wiX1NvZnRtYXhcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1NvZnRtYXg9TW9kdWxlW1wiX1NvZnRtYXhcIl09TW9kdWxlW1wiYXNtXCJdW1wiUmFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9TcXJ0PU1vZHVsZVtcIl9TcXJ0XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9TcXJ0PU1vZHVsZVtcIl9TcXJ0XCJdPU1vZHVsZVtcImFzbVwiXVtcIlNhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfU3F1YXJlPU1vZHVsZVtcIl9TcXVhcmVcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1NxdWFyZT1Nb2R1bGVbXCJfU3F1YXJlXCJdPU1vZHVsZVtcImFzbVwiXVtcIlRhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfU3F1YXJlZERpZmZlcmVuY2U9TW9kdWxlW1wiX1NxdWFyZWREaWZmZXJlbmNlXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9TcXVhcmVkRGlmZmVyZW5jZT1Nb2R1bGVbXCJfU3F1YXJlZERpZmZlcmVuY2VcIl09TW9kdWxlW1wiYXNtXCJdW1wiVWFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9TdGVwPU1vZHVsZVtcIl9TdGVwXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9TdGVwPU1vZHVsZVtcIl9TdGVwXCJdPU1vZHVsZVtcImFzbVwiXVtcIlZhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfU3RyaWRlZFNsaWNlPU1vZHVsZVtcIl9TdHJpZGVkU2xpY2VcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1N0cmlkZWRTbGljZT1Nb2R1bGVbXCJfU3RyaWRlZFNsaWNlXCJdPU1vZHVsZVtcImFzbVwiXVtcIldhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfU3ViPU1vZHVsZVtcIl9TdWJcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1N1Yj1Nb2R1bGVbXCJfU3ViXCJdPU1vZHVsZVtcImFzbVwiXVtcIlhhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfU3VtPU1vZHVsZVtcIl9TdW1cIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1N1bT1Nb2R1bGVbXCJfU3VtXCJdPU1vZHVsZVtcImFzbVwiXVtcIllhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfVGFuPU1vZHVsZVtcIl9UYW5cIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1Rhbj1Nb2R1bGVbXCJfVGFuXCJdPU1vZHVsZVtcImFzbVwiXVtcIlphXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfVGFuaD1Nb2R1bGVbXCJfVGFuaFwiXT1mdW5jdGlvbigpe3JldHVybihfVGFuaD1Nb2R1bGVbXCJfVGFuaFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJfYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1RpbGU9TW9kdWxlW1wiX1RpbGVcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1RpbGU9TW9kdWxlW1wiX1RpbGVcIl09TW9kdWxlW1wiYXNtXCJdW1wiJGFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Ub3BLPU1vZHVsZVtcIl9Ub3BLXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Ub3BLPU1vZHVsZVtcIl9Ub3BLXCJdPU1vZHVsZVtcImFzbVwiXVtcImFiXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfVHJhbnNmb3JtPU1vZHVsZVtcIl9UcmFuc2Zvcm1cIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1RyYW5zZm9ybT1Nb2R1bGVbXCJfVHJhbnNmb3JtXCJdPU1vZHVsZVtcImFzbVwiXVtcImJiXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfVHJhbnNwb3NlPU1vZHVsZVtcIl9UcmFuc3Bvc2VcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1RyYW5zcG9zZT1Nb2R1bGVbXCJfVHJhbnNwb3NlXCJdPU1vZHVsZVtcImFzbVwiXVtcImNiXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfX0Z1c2VkTWF0TXVsPU1vZHVsZVtcIl9fRnVzZWRNYXRNdWxcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX19GdXNlZE1hdE11bD1Nb2R1bGVbXCJfX0Z1c2VkTWF0TXVsXCJdPU1vZHVsZVtcImFzbVwiXVtcImRiXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfbWFsbG9jPU1vZHVsZVtcIl9tYWxsb2NcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX21hbGxvYz1Nb2R1bGVbXCJfbWFsbG9jXCJdPU1vZHVsZVtcImFzbVwiXVtcImViXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfZnJlZT1Nb2R1bGVbXCJfZnJlZVwiXT1mdW5jdGlvbigpe3JldHVybihfZnJlZT1Nb2R1bGVbXCJfZnJlZVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJmYlwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX19fZXJybm9fbG9jYXRpb249TW9kdWxlW1wiX19fZXJybm9fbG9jYXRpb25cIl09ZnVuY3Rpb24oKXtyZXR1cm4oX19fZXJybm9fbG9jYXRpb249TW9kdWxlW1wiX19fZXJybm9fbG9jYXRpb25cIl09TW9kdWxlW1wiYXNtXCJdW1wiZ2JcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9lbXNjcmlwdGVuX2dldF9nbG9iYWxfbGliYz1Nb2R1bGVbXCJfZW1zY3JpcHRlbl9nZXRfZ2xvYmFsX2xpYmNcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX2Vtc2NyaXB0ZW5fZ2V0X2dsb2JhbF9saWJjPU1vZHVsZVtcIl9lbXNjcmlwdGVuX2dldF9nbG9iYWxfbGliY1wiXT1Nb2R1bGVbXCJhc21cIl1bXCJoYlwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX3B0aHJlYWRfc2VsZj1Nb2R1bGVbXCJfcHRocmVhZF9zZWxmXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9wdGhyZWFkX3NlbGY9TW9kdWxlW1wiX3B0aHJlYWRfc2VsZlwiXT1Nb2R1bGVbXCJhc21cIl1bXCJpYlwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX19fcHRocmVhZF90c2RfcnVuX2R0b3JzPU1vZHVsZVtcIl9fX3B0aHJlYWRfdHNkX3J1bl9kdG9yc1wiXT1mdW5jdGlvbigpe3JldHVybihfX19wdGhyZWFkX3RzZF9ydW5fZHRvcnM9TW9kdWxlW1wiX19fcHRocmVhZF90c2RfcnVuX2R0b3JzXCJdPU1vZHVsZVtcImFzbVwiXVtcImpiXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfZW1zY3JpcHRlbl9tYWluX3RocmVhZF9wcm9jZXNzX3F1ZXVlZF9jYWxscz1Nb2R1bGVbXCJfZW1zY3JpcHRlbl9tYWluX3RocmVhZF9wcm9jZXNzX3F1ZXVlZF9jYWxsc1wiXT1mdW5jdGlvbigpe3JldHVybihfZW1zY3JpcHRlbl9tYWluX3RocmVhZF9wcm9jZXNzX3F1ZXVlZF9jYWxscz1Nb2R1bGVbXCJfZW1zY3JpcHRlbl9tYWluX3RocmVhZF9wcm9jZXNzX3F1ZXVlZF9jYWxsc1wiXT1Nb2R1bGVbXCJhc21cIl1bXCJrYlwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX2Vtc2NyaXB0ZW5fY3VycmVudF90aHJlYWRfcHJvY2Vzc19xdWV1ZWRfY2FsbHM9TW9kdWxlW1wiX2Vtc2NyaXB0ZW5fY3VycmVudF90aHJlYWRfcHJvY2Vzc19xdWV1ZWRfY2FsbHNcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX2Vtc2NyaXB0ZW5fY3VycmVudF90aHJlYWRfcHJvY2Vzc19xdWV1ZWRfY2FsbHM9TW9kdWxlW1wiX2Vtc2NyaXB0ZW5fY3VycmVudF90aHJlYWRfcHJvY2Vzc19xdWV1ZWRfY2FsbHNcIl09TW9kdWxlW1wiYXNtXCJdW1wibGJcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9lbXNjcmlwdGVuX3JlZ2lzdGVyX21haW5fYnJvd3Nlcl90aHJlYWRfaWQ9TW9kdWxlW1wiX2Vtc2NyaXB0ZW5fcmVnaXN0ZXJfbWFpbl9icm93c2VyX3RocmVhZF9pZFwiXT1mdW5jdGlvbigpe3JldHVybihfZW1zY3JpcHRlbl9yZWdpc3Rlcl9tYWluX2Jyb3dzZXJfdGhyZWFkX2lkPU1vZHVsZVtcIl9lbXNjcmlwdGVuX3JlZ2lzdGVyX21haW5fYnJvd3Nlcl90aHJlYWRfaWRcIl09TW9kdWxlW1wiYXNtXCJdW1wibWJcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9fZW1zY3JpcHRlbl9kb19kaXNwYXRjaF90b190aHJlYWQ9TW9kdWxlW1wiX19lbXNjcmlwdGVuX2RvX2Rpc3BhdGNoX3RvX3RocmVhZFwiXT1mdW5jdGlvbigpe3JldHVybihfX2Vtc2NyaXB0ZW5fZG9fZGlzcGF0Y2hfdG9fdGhyZWFkPU1vZHVsZVtcIl9fZW1zY3JpcHRlbl9kb19kaXNwYXRjaF90b190aHJlYWRcIl09TW9kdWxlW1wiYXNtXCJdW1wibmJcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9lbXNjcmlwdGVuX3N5bmNfcnVuX2luX21haW5fdGhyZWFkXzQ9TW9kdWxlW1wiX2Vtc2NyaXB0ZW5fc3luY19ydW5faW5fbWFpbl90aHJlYWRfNFwiXT1mdW5jdGlvbigpe3JldHVybihfZW1zY3JpcHRlbl9zeW5jX3J1bl9pbl9tYWluX3RocmVhZF80PU1vZHVsZVtcIl9lbXNjcmlwdGVuX3N5bmNfcnVuX2luX21haW5fdGhyZWFkXzRcIl09TW9kdWxlW1wiYXNtXCJdW1wib2JcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9lbXNjcmlwdGVuX3J1bl9pbl9tYWluX3J1bnRpbWVfdGhyZWFkX2pzPU1vZHVsZVtcIl9lbXNjcmlwdGVuX3J1bl9pbl9tYWluX3J1bnRpbWVfdGhyZWFkX2pzXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9lbXNjcmlwdGVuX3J1bl9pbl9tYWluX3J1bnRpbWVfdGhyZWFkX2pzPU1vZHVsZVtcIl9lbXNjcmlwdGVuX3J1bl9pbl9tYWluX3J1bnRpbWVfdGhyZWFkX2pzXCJdPU1vZHVsZVtcImFzbVwiXVtcInBiXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfX2Vtc2NyaXB0ZW5fY2FsbF9vbl90aHJlYWQ9TW9kdWxlW1wiX19lbXNjcmlwdGVuX2NhbGxfb25fdGhyZWFkXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9fZW1zY3JpcHRlbl9jYWxsX29uX3RocmVhZD1Nb2R1bGVbXCJfX2Vtc2NyaXB0ZW5fY2FsbF9vbl90aHJlYWRcIl09TW9kdWxlW1wiYXNtXCJdW1wicWJcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9lbXNjcmlwdGVuX3Rsc19pbml0PU1vZHVsZVtcIl9lbXNjcmlwdGVuX3Rsc19pbml0XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9lbXNjcmlwdGVuX3Rsc19pbml0PU1vZHVsZVtcIl9lbXNjcmlwdGVuX3Rsc19pbml0XCJdPU1vZHVsZVtcImFzbVwiXVtcInJiXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfX2Vtc2NyaXB0ZW5fdGhyZWFkX2luaXQ9TW9kdWxlW1wiX19lbXNjcmlwdGVuX3RocmVhZF9pbml0XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9fZW1zY3JpcHRlbl90aHJlYWRfaW5pdD1Nb2R1bGVbXCJfX2Vtc2NyaXB0ZW5fdGhyZWFkX2luaXRcIl09TW9kdWxlW1wiYXNtXCJdW1wic2JcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIHN0YWNrU2F2ZT1Nb2R1bGVbXCJzdGFja1NhdmVcIl09ZnVuY3Rpb24oKXtyZXR1cm4oc3RhY2tTYXZlPU1vZHVsZVtcInN0YWNrU2F2ZVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJ0YlwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgc3RhY2tSZXN0b3JlPU1vZHVsZVtcInN0YWNrUmVzdG9yZVwiXT1mdW5jdGlvbigpe3JldHVybihzdGFja1Jlc3RvcmU9TW9kdWxlW1wic3RhY2tSZXN0b3JlXCJdPU1vZHVsZVtcImFzbVwiXVtcInViXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBzdGFja0FsbG9jPU1vZHVsZVtcInN0YWNrQWxsb2NcIl09ZnVuY3Rpb24oKXtyZXR1cm4oc3RhY2tBbGxvYz1Nb2R1bGVbXCJzdGFja0FsbG9jXCJdPU1vZHVsZVtcImFzbVwiXVtcInZiXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfZW1zY3JpcHRlbl9zdGFja19zZXRfbGltaXRzPU1vZHVsZVtcIl9lbXNjcmlwdGVuX3N0YWNrX3NldF9saW1pdHNcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX2Vtc2NyaXB0ZW5fc3RhY2tfc2V0X2xpbWl0cz1Nb2R1bGVbXCJfZW1zY3JpcHRlbl9zdGFja19zZXRfbGltaXRzXCJdPU1vZHVsZVtcImFzbVwiXVtcIndiXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfbWVtYWxpZ249TW9kdWxlW1wiX21lbWFsaWduXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9tZW1hbGlnbj1Nb2R1bGVbXCJfbWVtYWxpZ25cIl09TW9kdWxlW1wiYXNtXCJdW1wieGJcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9fZW1zY3JpcHRlbl9hbGxvd19tYWluX3J1bnRpbWVfcXVldWVkX2NhbGxzPU1vZHVsZVtcIl9fZW1zY3JpcHRlbl9hbGxvd19tYWluX3J1bnRpbWVfcXVldWVkX2NhbGxzXCJdPTk4MjQ7dmFyIF9fZW1zY3JpcHRlbl9tYWluX3RocmVhZF9mdXRleD1Nb2R1bGVbXCJfX2Vtc2NyaXB0ZW5fbWFpbl90aHJlYWRfZnV0ZXhcIl09MTE0NDg7TW9kdWxlW1wiY3dyYXBcIl09Y3dyYXA7TW9kdWxlW1wiUFRocmVhZFwiXT1QVGhyZWFkO01vZHVsZVtcIlBUaHJlYWRcIl09UFRocmVhZDtNb2R1bGVbXCJ3YXNtTWVtb3J5XCJdPXdhc21NZW1vcnk7TW9kdWxlW1wiRXhpdFN0YXR1c1wiXT1FeGl0U3RhdHVzO3ZhciBjYWxsZWRSdW47ZnVuY3Rpb24gRXhpdFN0YXR1cyhzdGF0dXMpe3RoaXMubmFtZT1cIkV4aXRTdGF0dXNcIjt0aGlzLm1lc3NhZ2U9XCJQcm9ncmFtIHRlcm1pbmF0ZWQgd2l0aCBleGl0KFwiK3N0YXR1cytcIilcIjt0aGlzLnN0YXR1cz1zdGF0dXN9ZGVwZW5kZW5jaWVzRnVsZmlsbGVkPWZ1bmN0aW9uIHJ1bkNhbGxlcigpe2lmKCFjYWxsZWRSdW4pcnVuKCk7aWYoIWNhbGxlZFJ1bilkZXBlbmRlbmNpZXNGdWxmaWxsZWQ9cnVuQ2FsbGVyfTtmdW5jdGlvbiBydW4oYXJncyl7YXJncz1hcmdzfHxhcmd1bWVudHNfO2lmKHJ1bkRlcGVuZGVuY2llcz4wKXtyZXR1cm59aWYoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRCl7cmVhZHlQcm9taXNlUmVzb2x2ZShNb2R1bGUpO2luaXRSdW50aW1lKCk7cG9zdE1lc3NhZ2Uoe1wiY21kXCI6XCJsb2FkZWRcIn0pO3JldHVybn1wcmVSdW4oKTtpZihydW5EZXBlbmRlbmNpZXM+MCl7cmV0dXJufWZ1bmN0aW9uIGRvUnVuKCl7aWYoY2FsbGVkUnVuKXJldHVybjtjYWxsZWRSdW49dHJ1ZTtNb2R1bGVbXCJjYWxsZWRSdW5cIl09dHJ1ZTtpZihBQk9SVClyZXR1cm47aW5pdFJ1bnRpbWUoKTtwcmVNYWluKCk7cmVhZHlQcm9taXNlUmVzb2x2ZShNb2R1bGUpO2lmKE1vZHVsZVtcIm9uUnVudGltZUluaXRpYWxpemVkXCJdKU1vZHVsZVtcIm9uUnVudGltZUluaXRpYWxpemVkXCJdKCk7cG9zdFJ1bigpfWlmKE1vZHVsZVtcInNldFN0YXR1c1wiXSl7TW9kdWxlW1wic2V0U3RhdHVzXCJdKFwiUnVubmluZy4uLlwiKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe01vZHVsZVtcInNldFN0YXR1c1wiXShcIlwiKX0sMSk7ZG9SdW4oKX0sMSl9ZWxzZXtkb1J1bigpfX1Nb2R1bGVbXCJydW5cIl09cnVuO2Z1bmN0aW9uIGV4aXQoc3RhdHVzLGltcGxpY2l0KXtpZihpbXBsaWNpdCYmbm9FeGl0UnVudGltZSYmc3RhdHVzPT09MCl7cmV0dXJufWlmKCFpbXBsaWNpdCl7aWYoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRCl7cG9zdE1lc3NhZ2Uoe1wiY21kXCI6XCJleGl0UHJvY2Vzc1wiLFwicmV0dXJuQ29kZVwiOnN0YXR1c30pO3Rocm93IG5ldyBFeGl0U3RhdHVzKHN0YXR1cyl9ZWxzZXt9fWlmKG5vRXhpdFJ1bnRpbWUpe31lbHNle1BUaHJlYWQudGVybWluYXRlQWxsVGhyZWFkcygpO0VYSVRTVEFUVVM9c3RhdHVzO2V4aXRSdW50aW1lKCk7aWYoTW9kdWxlW1wib25FeGl0XCJdKU1vZHVsZVtcIm9uRXhpdFwiXShzdGF0dXMpO0FCT1JUPXRydWV9cXVpdF8oc3RhdHVzLG5ldyBFeGl0U3RhdHVzKHN0YXR1cykpfWlmKE1vZHVsZVtcInByZUluaXRcIl0pe2lmKHR5cGVvZiBNb2R1bGVbXCJwcmVJbml0XCJdPT1cImZ1bmN0aW9uXCIpTW9kdWxlW1wicHJlSW5pdFwiXT1bTW9kdWxlW1wicHJlSW5pdFwiXV07d2hpbGUoTW9kdWxlW1wicHJlSW5pdFwiXS5sZW5ndGg+MCl7TW9kdWxlW1wicHJlSW5pdFwiXS5wb3AoKSgpfX1pZihFTlZJUk9OTUVOVF9JU19QVEhSRUFEKXtub0V4aXRSdW50aW1lPWZhbHNlO1BUaHJlYWQuaW5pdFdvcmtlcigpfXJ1bigpO1xuXG5cbiAgcmV0dXJuIFdhc21CYWNrZW5kTW9kdWxlVGhyZWFkZWRTaW1kLnJlYWR5XG59XG4pO1xufSkoKTtcbmlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG4gIG1vZHVsZS5leHBvcnRzID0gV2FzbUJhY2tlbmRNb2R1bGVUaHJlYWRlZFNpbWQ7XG5lbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZVsnYW1kJ10pXG4gIGRlZmluZShbXSwgZnVuY3Rpb24oKSB7IHJldHVybiBXYXNtQmFja2VuZE1vZHVsZVRocmVhZGVkU2ltZDsgfSk7XG5lbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG4gIGV4cG9ydHNbXCJXYXNtQmFja2VuZE1vZHVsZVRocmVhZGVkU2ltZFwiXSA9IFdhc21CYWNrZW5kTW9kdWxlVGhyZWFkZWRTaW1kO1xuIiwiZXhwb3J0IGNvbnN0IHdhc21Xb3JrZXJDb250ZW50cyA9ICd2YXIgTW9kdWxlPXt9O2Z1bmN0aW9uIHRocmVhZFByaW50RXJyKCl7dmFyIHRleHQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKS5qb2luKFwiIFwiKTtjb25zb2xlLmVycm9yKHRleHQpfWZ1bmN0aW9uIHRocmVhZEFsZXJ0KCl7dmFyIHRleHQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKS5qb2luKFwiIFwiKTtwb3N0TWVzc2FnZSh7Y21kOlwiYWxlcnRcIix0ZXh0OnRleHQsdGhyZWFkSWQ6TW9kdWxlW1wiX3B0aHJlYWRfc2VsZlwiXSgpfSl9dmFyIGVycj10aHJlYWRQcmludEVycjt0aGlzLmFsZXJ0PXRocmVhZEFsZXJ0O01vZHVsZVtcImluc3RhbnRpYXRlV2FzbVwiXT1mdW5jdGlvbihpbmZvLHJlY2VpdmVJbnN0YW5jZSl7dmFyIGluc3RhbmNlPW5ldyBXZWJBc3NlbWJseS5JbnN0YW5jZShNb2R1bGVbXCJ3YXNtTW9kdWxlXCJdLGluZm8pO01vZHVsZVtcIndhc21Nb2R1bGVcIl09bnVsbDtyZWNlaXZlSW5zdGFuY2UoaW5zdGFuY2UpO3JldHVybiBpbnN0YW5jZS5leHBvcnRzfTtmdW5jdGlvbiBtb2R1bGVMb2FkZWQoKXt9dGhpcy5vbm1lc3NhZ2U9ZnVuY3Rpb24oZSl7dHJ5e2lmKGUuZGF0YS5jbWQ9PT1cImxvYWRcIil7TW9kdWxlW1wid2FzbU1vZHVsZVwiXT1lLmRhdGEud2FzbU1vZHVsZTtNb2R1bGVbXCJ3YXNtTWVtb3J5XCJdPWUuZGF0YS53YXNtTWVtb3J5O01vZHVsZVtcImJ1ZmZlclwiXT1Nb2R1bGVbXCJ3YXNtTWVtb3J5XCJdLmJ1ZmZlcjtNb2R1bGVbXCJFTlZJUk9OTUVOVF9JU19QVEhSRUFEXCJdPXRydWU7aWYodHlwZW9mIGUuZGF0YS51cmxPckJsb2I9PT1cInN0cmluZ1wiKXtpbXBvcnRTY3JpcHRzKGUuZGF0YS51cmxPckJsb2IpfWVsc2V7dmFyIG9iamVjdFVybD1VUkwuY3JlYXRlT2JqZWN0VVJMKGUuZGF0YS51cmxPckJsb2IpO2ltcG9ydFNjcmlwdHMob2JqZWN0VXJsKTtVUkwucmV2b2tlT2JqZWN0VVJMKG9iamVjdFVybCl9V2FzbUJhY2tlbmRNb2R1bGVUaHJlYWRlZFNpbWQoTW9kdWxlKS50aGVuKGZ1bmN0aW9uKGluc3RhbmNlKXtNb2R1bGU9aW5zdGFuY2U7bW9kdWxlTG9hZGVkKCl9KX1lbHNlIGlmKGUuZGF0YS5jbWQ9PT1cIm9iamVjdFRyYW5zZmVyXCIpe01vZHVsZVtcIlBUaHJlYWRcIl0ucmVjZWl2ZU9iamVjdFRyYW5zZmVyKGUuZGF0YSl9ZWxzZSBpZihlLmRhdGEuY21kPT09XCJydW5cIil7TW9kdWxlW1wiX19wZXJmb3JtYW5jZV9ub3dfY2xvY2tfZHJpZnRcIl09cGVyZm9ybWFuY2Uubm93KCktZS5kYXRhLnRpbWU7TW9kdWxlW1wiX19lbXNjcmlwdGVuX3RocmVhZF9pbml0XCJdKGUuZGF0YS50aHJlYWRJbmZvU3RydWN0LDAsMCk7dmFyIG1heD1lLmRhdGEuc3RhY2tCYXNlO3ZhciB0b3A9ZS5kYXRhLnN0YWNrQmFzZStlLmRhdGEuc3RhY2tTaXplO01vZHVsZVtcImVzdGFibGlzaFN0YWNrU3BhY2VcIl0odG9wLG1heCk7TW9kdWxlW1wiX2Vtc2NyaXB0ZW5fdGxzX2luaXRcIl0oKTtNb2R1bGVbXCJQVGhyZWFkXCJdLnJlY2VpdmVPYmplY3RUcmFuc2ZlcihlLmRhdGEpO01vZHVsZVtcIlBUaHJlYWRcIl0uc2V0VGhyZWFkU3RhdHVzKE1vZHVsZVtcIl9wdGhyZWFkX3NlbGZcIl0oKSwxKTt0cnl7dmFyIHJlc3VsdD1Nb2R1bGVbXCJpbnZva2VFbnRyeVBvaW50XCJdKGUuZGF0YS5zdGFydF9yb3V0aW5lLGUuZGF0YS5hcmcpO2lmKCFNb2R1bGVbXCJnZXROb0V4aXRSdW50aW1lXCJdKCkpTW9kdWxlW1wiUFRocmVhZFwiXS50aHJlYWRFeGl0KHJlc3VsdCl9Y2F0Y2goZXgpe2lmKGV4PT09XCJDYW5jZWxlZCFcIil7TW9kdWxlW1wiUFRocmVhZFwiXS50aHJlYWRDYW5jZWwoKX1lbHNlIGlmKGV4IT1cInVud2luZFwiKXtpZihleCBpbnN0YW5jZW9mIE1vZHVsZVtcIkV4aXRTdGF0dXNcIl0pe2lmKE1vZHVsZVtcImdldE5vRXhpdFJ1bnRpbWVcIl0oKSl7fWVsc2V7TW9kdWxlW1wiUFRocmVhZFwiXS50aHJlYWRFeGl0KGV4LnN0YXR1cyl9fWVsc2V7TW9kdWxlW1wiUFRocmVhZFwiXS50aHJlYWRFeGl0KC0yKTt0aHJvdyBleH19fX1lbHNlIGlmKGUuZGF0YS5jbWQ9PT1cImNhbmNlbFwiKXtpZihNb2R1bGVbXCJfcHRocmVhZF9zZWxmXCJdKCkpe01vZHVsZVtcIlBUaHJlYWRcIl0udGhyZWFkQ2FuY2VsKCl9fWVsc2UgaWYoZS5kYXRhLnRhcmdldD09PVwic2V0aW1tZWRpYXRlXCIpe31lbHNlIGlmKGUuZGF0YS5jbWQ9PT1cInByb2Nlc3NUaHJlYWRRdWV1ZVwiKXtpZihNb2R1bGVbXCJfcHRocmVhZF9zZWxmXCJdKCkpe01vZHVsZVtcIl9lbXNjcmlwdGVuX2N1cnJlbnRfdGhyZWFkX3Byb2Nlc3NfcXVldWVkX2NhbGxzXCJdKCl9fWVsc2V7ZXJyKFwid29ya2VyLmpzIHJlY2VpdmVkIHVua25vd24gY29tbWFuZCBcIitlLmRhdGEuY21kKTtlcnIoZS5kYXRhKX19Y2F0Y2goZXgpe2VycihcIndvcmtlci5qcyBvbm1lc3NhZ2UoKSBjYXB0dXJlZCBhbiB1bmNhdWdodCBleGNlcHRpb246IFwiK2V4KTtpZihleCYmZXguc3RhY2spZXJyKGV4LnN0YWNrKTt0aHJvdyBleH19O2lmKHR5cGVvZiBwcm9jZXNzPT09XCJvYmplY3RcIiYmdHlwZW9mIHByb2Nlc3MudmVyc2lvbnM9PT1cIm9iamVjdFwiJiZ0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlPT09XCJzdHJpbmdcIil7c2VsZj17bG9jYXRpb246e2hyZWY6X19maWxlbmFtZX19O3ZhciBvbm1lc3NhZ2U9dGhpcy5vbm1lc3NhZ2U7dmFyIG5vZGVXb3JrZXJUaHJlYWRzPXJlcXVpcmUoXCJ3b3JrZXJfdGhyZWFkc1wiKTtnbG9iYWwuV29ya2VyPW5vZGVXb3JrZXJUaHJlYWRzLldvcmtlcjt2YXIgcGFyZW50UG9ydD1ub2RlV29ya2VyVGhyZWFkcy5wYXJlbnRQb3J0O3BhcmVudFBvcnQub24oXCJtZXNzYWdlXCIsZnVuY3Rpb24oZGF0YSl7b25tZXNzYWdlKHtkYXRhOmRhdGF9KX0pO3ZhciBub2RlRlM9cmVxdWlyZShcImZzXCIpO3ZhciBub2RlUmVhZD1mdW5jdGlvbihmaWxlbmFtZSl7cmV0dXJuIG5vZGVGUy5yZWFkRmlsZVN5bmMoZmlsZW5hbWUsXCJ1dGY4XCIpfTtmdW5jdGlvbiBnbG9iYWxFdmFsKHgpe2dsb2JhbC5yZXF1aXJlPXJlcXVpcmU7Z2xvYmFsLk1vZHVsZT1Nb2R1bGU7ZXZhbC5jYWxsKG51bGwseCl9aW1wb3J0U2NyaXB0cz1mdW5jdGlvbihmKXtnbG9iYWxFdmFsKG5vZGVSZWFkKGYpKX07cG9zdE1lc3NhZ2U9ZnVuY3Rpb24obXNnKXtwYXJlbnRQb3J0LnBvc3RNZXNzYWdlKG1zZyl9O2lmKHR5cGVvZiBwZXJmb3JtYW5jZT09PVwidW5kZWZpbmVkXCIpe3BlcmZvcm1hbmNlPXtub3c6ZnVuY3Rpb24oKXtyZXR1cm4gRGF0ZS5ub3coKX19fX0nOyIsIlxudmFyIFdhc21CYWNrZW5kTW9kdWxlID0gKGZ1bmN0aW9uKCkge1xuICB2YXIgX3NjcmlwdERpciA9IHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQuY3VycmVudFNjcmlwdCA/IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjIDogdW5kZWZpbmVkO1xuICBpZiAodHlwZW9mIF9fZmlsZW5hbWUgIT09ICd1bmRlZmluZWQnKSBfc2NyaXB0RGlyID0gX3NjcmlwdERpciB8fCBfX2ZpbGVuYW1lO1xuICByZXR1cm4gKFxuZnVuY3Rpb24oV2FzbUJhY2tlbmRNb2R1bGUpIHtcbiAgV2FzbUJhY2tlbmRNb2R1bGUgPSBXYXNtQmFja2VuZE1vZHVsZSB8fCB7fTtcblxudmFyIE1vZHVsZT10eXBlb2YgV2FzbUJhY2tlbmRNb2R1bGUhPT1cInVuZGVmaW5lZFwiP1dhc21CYWNrZW5kTW9kdWxlOnt9O3ZhciByZWFkeVByb21pc2VSZXNvbHZlLHJlYWR5UHJvbWlzZVJlamVjdDtNb2R1bGVbXCJyZWFkeVwiXT1uZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLHJlamVjdCl7cmVhZHlQcm9taXNlUmVzb2x2ZT1yZXNvbHZlO3JlYWR5UHJvbWlzZVJlamVjdD1yZWplY3R9KTt2YXIgbW9kdWxlT3ZlcnJpZGVzPXt9O3ZhciBrZXk7Zm9yKGtleSBpbiBNb2R1bGUpe2lmKE1vZHVsZS5oYXNPd25Qcm9wZXJ0eShrZXkpKXttb2R1bGVPdmVycmlkZXNba2V5XT1Nb2R1bGVba2V5XX19dmFyIGFyZ3VtZW50c189W107dmFyIHRoaXNQcm9ncmFtPVwiLi90aGlzLnByb2dyYW1cIjt2YXIgcXVpdF89ZnVuY3Rpb24oc3RhdHVzLHRvVGhyb3cpe3Rocm93IHRvVGhyb3d9O3ZhciBFTlZJUk9OTUVOVF9JU19XRUI9ZmFsc2U7dmFyIEVOVklST05NRU5UX0lTX1dPUktFUj1mYWxzZTt2YXIgRU5WSVJPTk1FTlRfSVNfTk9ERT1mYWxzZTt2YXIgRU5WSVJPTk1FTlRfSVNfU0hFTEw9ZmFsc2U7RU5WSVJPTk1FTlRfSVNfV0VCPXR5cGVvZiB3aW5kb3c9PT1cIm9iamVjdFwiO0VOVklST05NRU5UX0lTX1dPUktFUj10eXBlb2YgaW1wb3J0U2NyaXB0cz09PVwiZnVuY3Rpb25cIjtFTlZJUk9OTUVOVF9JU19OT0RFPXR5cGVvZiBwcm9jZXNzPT09XCJvYmplY3RcIiYmdHlwZW9mIHByb2Nlc3MudmVyc2lvbnM9PT1cIm9iamVjdFwiJiZ0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlPT09XCJzdHJpbmdcIjtFTlZJUk9OTUVOVF9JU19TSEVMTD0hRU5WSVJPTk1FTlRfSVNfV0VCJiYhRU5WSVJPTk1FTlRfSVNfTk9ERSYmIUVOVklST05NRU5UX0lTX1dPUktFUjt2YXIgc2NyaXB0RGlyZWN0b3J5PVwiXCI7ZnVuY3Rpb24gbG9jYXRlRmlsZShwYXRoKXtpZihNb2R1bGVbXCJsb2NhdGVGaWxlXCJdKXtyZXR1cm4gTW9kdWxlW1wibG9jYXRlRmlsZVwiXShwYXRoLHNjcmlwdERpcmVjdG9yeSl9cmV0dXJuIHNjcmlwdERpcmVjdG9yeStwYXRofXZhciByZWFkXyxyZWFkQXN5bmMscmVhZEJpbmFyeSxzZXRXaW5kb3dUaXRsZTt2YXIgbm9kZUZTO3ZhciBub2RlUGF0aDtpZihFTlZJUk9OTUVOVF9JU19OT0RFKXtpZihFTlZJUk9OTUVOVF9JU19XT1JLRVIpe3NjcmlwdERpcmVjdG9yeT1yZXF1aXJlKFwicGF0aFwiKS5kaXJuYW1lKHNjcmlwdERpcmVjdG9yeSkrXCIvXCJ9ZWxzZXtzY3JpcHREaXJlY3Rvcnk9X19kaXJuYW1lK1wiL1wifXJlYWRfPWZ1bmN0aW9uIHNoZWxsX3JlYWQoZmlsZW5hbWUsYmluYXJ5KXtpZighbm9kZUZTKW5vZGVGUz1yZXF1aXJlKFwiZnNcIik7aWYoIW5vZGVQYXRoKW5vZGVQYXRoPXJlcXVpcmUoXCJwYXRoXCIpO2ZpbGVuYW1lPW5vZGVQYXRoW1wibm9ybWFsaXplXCJdKGZpbGVuYW1lKTtyZXR1cm4gbm9kZUZTW1wicmVhZEZpbGVTeW5jXCJdKGZpbGVuYW1lLGJpbmFyeT9udWxsOlwidXRmOFwiKX07cmVhZEJpbmFyeT1mdW5jdGlvbiByZWFkQmluYXJ5KGZpbGVuYW1lKXt2YXIgcmV0PXJlYWRfKGZpbGVuYW1lLHRydWUpO2lmKCFyZXQuYnVmZmVyKXtyZXQ9bmV3IFVpbnQ4QXJyYXkocmV0KX1hc3NlcnQocmV0LmJ1ZmZlcik7cmV0dXJuIHJldH07aWYocHJvY2Vzc1tcImFyZ3ZcIl0ubGVuZ3RoPjEpe3RoaXNQcm9ncmFtPXByb2Nlc3NbXCJhcmd2XCJdWzFdLnJlcGxhY2UoL1xcXFwvZyxcIi9cIil9YXJndW1lbnRzXz1wcm9jZXNzW1wiYXJndlwiXS5zbGljZSgyKTtwcm9jZXNzW1wib25cIl0oXCJ1bmNhdWdodEV4Y2VwdGlvblwiLGZ1bmN0aW9uKGV4KXtpZighKGV4IGluc3RhbmNlb2YgRXhpdFN0YXR1cykpe3Rocm93IGV4fX0pO3Byb2Nlc3NbXCJvblwiXShcInVuaGFuZGxlZFJlamVjdGlvblwiLGFib3J0KTtxdWl0Xz1mdW5jdGlvbihzdGF0dXMpe3Byb2Nlc3NbXCJleGl0XCJdKHN0YXR1cyl9O01vZHVsZVtcImluc3BlY3RcIl09ZnVuY3Rpb24oKXtyZXR1cm5cIltFbXNjcmlwdGVuIE1vZHVsZSBvYmplY3RdXCJ9fWVsc2UgaWYoRU5WSVJPTk1FTlRfSVNfU0hFTEwpe2lmKHR5cGVvZiByZWFkIT1cInVuZGVmaW5lZFwiKXtyZWFkXz1mdW5jdGlvbiBzaGVsbF9yZWFkKGYpe3JldHVybiByZWFkKGYpfX1yZWFkQmluYXJ5PWZ1bmN0aW9uIHJlYWRCaW5hcnkoZil7dmFyIGRhdGE7aWYodHlwZW9mIHJlYWRidWZmZXI9PT1cImZ1bmN0aW9uXCIpe3JldHVybiBuZXcgVWludDhBcnJheShyZWFkYnVmZmVyKGYpKX1kYXRhPXJlYWQoZixcImJpbmFyeVwiKTthc3NlcnQodHlwZW9mIGRhdGE9PT1cIm9iamVjdFwiKTtyZXR1cm4gZGF0YX07aWYodHlwZW9mIHNjcmlwdEFyZ3MhPVwidW5kZWZpbmVkXCIpe2FyZ3VtZW50c189c2NyaXB0QXJnc31lbHNlIGlmKHR5cGVvZiBhcmd1bWVudHMhPVwidW5kZWZpbmVkXCIpe2FyZ3VtZW50c189YXJndW1lbnRzfWlmKHR5cGVvZiBxdWl0PT09XCJmdW5jdGlvblwiKXtxdWl0Xz1mdW5jdGlvbihzdGF0dXMpe3F1aXQoc3RhdHVzKX19aWYodHlwZW9mIHByaW50IT09XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGNvbnNvbGU9PT1cInVuZGVmaW5lZFwiKWNvbnNvbGU9e307Y29uc29sZS5sb2c9cHJpbnQ7Y29uc29sZS53YXJuPWNvbnNvbGUuZXJyb3I9dHlwZW9mIHByaW50RXJyIT09XCJ1bmRlZmluZWRcIj9wcmludEVycjpwcmludH19ZWxzZSBpZihFTlZJUk9OTUVOVF9JU19XRUJ8fEVOVklST05NRU5UX0lTX1dPUktFUil7aWYoRU5WSVJPTk1FTlRfSVNfV09SS0VSKXtzY3JpcHREaXJlY3Rvcnk9c2VsZi5sb2NhdGlvbi5ocmVmfWVsc2UgaWYodHlwZW9mIGRvY3VtZW50IT09XCJ1bmRlZmluZWRcIiYmZG9jdW1lbnQuY3VycmVudFNjcmlwdCl7c2NyaXB0RGlyZWN0b3J5PWRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjfWlmKF9zY3JpcHREaXIpe3NjcmlwdERpcmVjdG9yeT1fc2NyaXB0RGlyfWlmKHNjcmlwdERpcmVjdG9yeS5pbmRleE9mKFwiYmxvYjpcIikhPT0wKXtzY3JpcHREaXJlY3Rvcnk9c2NyaXB0RGlyZWN0b3J5LnN1YnN0cigwLHNjcmlwdERpcmVjdG9yeS5sYXN0SW5kZXhPZihcIi9cIikrMSl9ZWxzZXtzY3JpcHREaXJlY3Rvcnk9XCJcIn17cmVhZF89ZnVuY3Rpb24odXJsKXt2YXIgeGhyPW5ldyBYTUxIdHRwUmVxdWVzdDt4aHIub3BlbihcIkdFVFwiLHVybCxmYWxzZSk7eGhyLnNlbmQobnVsbCk7cmV0dXJuIHhoci5yZXNwb25zZVRleHR9O2lmKEVOVklST05NRU5UX0lTX1dPUktFUil7cmVhZEJpbmFyeT1mdW5jdGlvbih1cmwpe3ZhciB4aHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3hoci5vcGVuKFwiR0VUXCIsdXJsLGZhbHNlKTt4aHIucmVzcG9uc2VUeXBlPVwiYXJyYXlidWZmZXJcIjt4aHIuc2VuZChudWxsKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoeGhyLnJlc3BvbnNlKX19cmVhZEFzeW5jPWZ1bmN0aW9uKHVybCxvbmxvYWQsb25lcnJvcil7dmFyIHhocj1uZXcgWE1MSHR0cFJlcXVlc3Q7eGhyLm9wZW4oXCJHRVRcIix1cmwsdHJ1ZSk7eGhyLnJlc3BvbnNlVHlwZT1cImFycmF5YnVmZmVyXCI7eGhyLm9ubG9hZD1mdW5jdGlvbigpe2lmKHhoci5zdGF0dXM9PTIwMHx8eGhyLnN0YXR1cz09MCYmeGhyLnJlc3BvbnNlKXtvbmxvYWQoeGhyLnJlc3BvbnNlKTtyZXR1cm59b25lcnJvcigpfTt4aHIub25lcnJvcj1vbmVycm9yO3hoci5zZW5kKG51bGwpfX1zZXRXaW5kb3dUaXRsZT1mdW5jdGlvbih0aXRsZSl7ZG9jdW1lbnQudGl0bGU9dGl0bGV9fWVsc2V7fXZhciBvdXQ9TW9kdWxlW1wicHJpbnRcIl18fGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSk7dmFyIGVycj1Nb2R1bGVbXCJwcmludEVyclwiXXx8Y29uc29sZS53YXJuLmJpbmQoY29uc29sZSk7Zm9yKGtleSBpbiBtb2R1bGVPdmVycmlkZXMpe2lmKG1vZHVsZU92ZXJyaWRlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKXtNb2R1bGVba2V5XT1tb2R1bGVPdmVycmlkZXNba2V5XX19bW9kdWxlT3ZlcnJpZGVzPW51bGw7aWYoTW9kdWxlW1wiYXJndW1lbnRzXCJdKWFyZ3VtZW50c189TW9kdWxlW1wiYXJndW1lbnRzXCJdO2lmKE1vZHVsZVtcInRoaXNQcm9ncmFtXCJdKXRoaXNQcm9ncmFtPU1vZHVsZVtcInRoaXNQcm9ncmFtXCJdO2lmKE1vZHVsZVtcInF1aXRcIl0pcXVpdF89TW9kdWxlW1wicXVpdFwiXTt2YXIgd2FzbUJpbmFyeTtpZihNb2R1bGVbXCJ3YXNtQmluYXJ5XCJdKXdhc21CaW5hcnk9TW9kdWxlW1wid2FzbUJpbmFyeVwiXTt2YXIgbm9FeGl0UnVudGltZT1Nb2R1bGVbXCJub0V4aXRSdW50aW1lXCJdfHx0cnVlO2lmKHR5cGVvZiBXZWJBc3NlbWJseSE9PVwib2JqZWN0XCIpe2Fib3J0KFwibm8gbmF0aXZlIHdhc20gc3VwcG9ydCBkZXRlY3RlZFwiKX12YXIgd2FzbU1lbW9yeTt2YXIgQUJPUlQ9ZmFsc2U7dmFyIEVYSVRTVEFUVVM7ZnVuY3Rpb24gYXNzZXJ0KGNvbmRpdGlvbix0ZXh0KXtpZighY29uZGl0aW9uKXthYm9ydChcIkFzc2VydGlvbiBmYWlsZWQ6IFwiK3RleHQpfX1mdW5jdGlvbiBnZXRDRnVuYyhpZGVudCl7dmFyIGZ1bmM9TW9kdWxlW1wiX1wiK2lkZW50XTthc3NlcnQoZnVuYyxcIkNhbm5vdCBjYWxsIHVua25vd24gZnVuY3Rpb24gXCIraWRlbnQrXCIsIG1ha2Ugc3VyZSBpdCBpcyBleHBvcnRlZFwiKTtyZXR1cm4gZnVuY31mdW5jdGlvbiBjY2FsbChpZGVudCxyZXR1cm5UeXBlLGFyZ1R5cGVzLGFyZ3Msb3B0cyl7dmFyIHRvQz17XCJzdHJpbmdcIjpmdW5jdGlvbihzdHIpe3ZhciByZXQ9MDtpZihzdHIhPT1udWxsJiZzdHIhPT11bmRlZmluZWQmJnN0ciE9PTApe3ZhciBsZW49KHN0ci5sZW5ndGg8PDIpKzE7cmV0PXN0YWNrQWxsb2MobGVuKTtzdHJpbmdUb1VURjgoc3RyLHJldCxsZW4pfXJldHVybiByZXR9LFwiYXJyYXlcIjpmdW5jdGlvbihhcnIpe3ZhciByZXQ9c3RhY2tBbGxvYyhhcnIubGVuZ3RoKTt3cml0ZUFycmF5VG9NZW1vcnkoYXJyLHJldCk7cmV0dXJuIHJldH19O2Z1bmN0aW9uIGNvbnZlcnRSZXR1cm5WYWx1ZShyZXQpe2lmKHJldHVyblR5cGU9PT1cInN0cmluZ1wiKXJldHVybiBVVEY4VG9TdHJpbmcocmV0KTtpZihyZXR1cm5UeXBlPT09XCJib29sZWFuXCIpcmV0dXJuIEJvb2xlYW4ocmV0KTtyZXR1cm4gcmV0fXZhciBmdW5jPWdldENGdW5jKGlkZW50KTt2YXIgY0FyZ3M9W107dmFyIHN0YWNrPTA7aWYoYXJncyl7Zm9yKHZhciBpPTA7aTxhcmdzLmxlbmd0aDtpKyspe3ZhciBjb252ZXJ0ZXI9dG9DW2FyZ1R5cGVzW2ldXTtpZihjb252ZXJ0ZXIpe2lmKHN0YWNrPT09MClzdGFjaz1zdGFja1NhdmUoKTtjQXJnc1tpXT1jb252ZXJ0ZXIoYXJnc1tpXSl9ZWxzZXtjQXJnc1tpXT1hcmdzW2ldfX19dmFyIHJldD1mdW5jLmFwcGx5KG51bGwsY0FyZ3MpO3JldD1jb252ZXJ0UmV0dXJuVmFsdWUocmV0KTtpZihzdGFjayE9PTApc3RhY2tSZXN0b3JlKHN0YWNrKTtyZXR1cm4gcmV0fWZ1bmN0aW9uIGN3cmFwKGlkZW50LHJldHVyblR5cGUsYXJnVHlwZXMsb3B0cyl7YXJnVHlwZXM9YXJnVHlwZXN8fFtdO3ZhciBudW1lcmljQXJncz1hcmdUeXBlcy5ldmVyeShmdW5jdGlvbih0eXBlKXtyZXR1cm4gdHlwZT09PVwibnVtYmVyXCJ9KTt2YXIgbnVtZXJpY1JldD1yZXR1cm5UeXBlIT09XCJzdHJpbmdcIjtpZihudW1lcmljUmV0JiZudW1lcmljQXJncyYmIW9wdHMpe3JldHVybiBnZXRDRnVuYyhpZGVudCl9cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGNjYWxsKGlkZW50LHJldHVyblR5cGUsYXJnVHlwZXMsYXJndW1lbnRzLG9wdHMpfX12YXIgVVRGOERlY29kZXI9dHlwZW9mIFRleHREZWNvZGVyIT09XCJ1bmRlZmluZWRcIj9uZXcgVGV4dERlY29kZXIoXCJ1dGY4XCIpOnVuZGVmaW5lZDtmdW5jdGlvbiBVVEY4QXJyYXlUb1N0cmluZyhoZWFwLGlkeCxtYXhCeXRlc1RvUmVhZCl7dmFyIGVuZElkeD1pZHgrbWF4Qnl0ZXNUb1JlYWQ7dmFyIGVuZFB0cj1pZHg7d2hpbGUoaGVhcFtlbmRQdHJdJiYhKGVuZFB0cj49ZW5kSWR4KSkrK2VuZFB0cjtpZihlbmRQdHItaWR4PjE2JiZoZWFwLnN1YmFycmF5JiZVVEY4RGVjb2Rlcil7cmV0dXJuIFVURjhEZWNvZGVyLmRlY29kZShoZWFwLnN1YmFycmF5KGlkeCxlbmRQdHIpKX1lbHNle3ZhciBzdHI9XCJcIjt3aGlsZShpZHg8ZW5kUHRyKXt2YXIgdTA9aGVhcFtpZHgrK107aWYoISh1MCYxMjgpKXtzdHIrPVN0cmluZy5mcm9tQ2hhckNvZGUodTApO2NvbnRpbnVlfXZhciB1MT1oZWFwW2lkeCsrXSY2MztpZigodTAmMjI0KT09MTkyKXtzdHIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKHUwJjMxKTw8Nnx1MSk7Y29udGludWV9dmFyIHUyPWhlYXBbaWR4KytdJjYzO2lmKCh1MCYyNDApPT0yMjQpe3UwPSh1MCYxNSk8PDEyfHUxPDw2fHUyfWVsc2V7dTA9KHUwJjcpPDwxOHx1MTw8MTJ8dTI8PDZ8aGVhcFtpZHgrK10mNjN9aWYodTA8NjU1MzYpe3N0cis9U3RyaW5nLmZyb21DaGFyQ29kZSh1MCl9ZWxzZXt2YXIgY2g9dTAtNjU1MzY7c3RyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2fGNoPj4xMCw1NjMyMHxjaCYxMDIzKX19fXJldHVybiBzdHJ9ZnVuY3Rpb24gVVRGOFRvU3RyaW5nKHB0cixtYXhCeXRlc1RvUmVhZCl7cmV0dXJuIHB0cj9VVEY4QXJyYXlUb1N0cmluZyhIRUFQVTgscHRyLG1heEJ5dGVzVG9SZWFkKTpcIlwifWZ1bmN0aW9uIHN0cmluZ1RvVVRGOEFycmF5KHN0cixoZWFwLG91dElkeCxtYXhCeXRlc1RvV3JpdGUpe2lmKCEobWF4Qnl0ZXNUb1dyaXRlPjApKXJldHVybiAwO3ZhciBzdGFydElkeD1vdXRJZHg7dmFyIGVuZElkeD1vdXRJZHgrbWF4Qnl0ZXNUb1dyaXRlLTE7Zm9yKHZhciBpPTA7aTxzdHIubGVuZ3RoOysraSl7dmFyIHU9c3RyLmNoYXJDb2RlQXQoaSk7aWYodT49NTUyOTYmJnU8PTU3MzQzKXt2YXIgdTE9c3RyLmNoYXJDb2RlQXQoKytpKTt1PTY1NTM2KygodSYxMDIzKTw8MTApfHUxJjEwMjN9aWYodTw9MTI3KXtpZihvdXRJZHg+PWVuZElkeClicmVhaztoZWFwW291dElkeCsrXT11fWVsc2UgaWYodTw9MjA0Nyl7aWYob3V0SWR4KzE+PWVuZElkeClicmVhaztoZWFwW291dElkeCsrXT0xOTJ8dT4+NjtoZWFwW291dElkeCsrXT0xMjh8dSY2M31lbHNlIGlmKHU8PTY1NTM1KXtpZihvdXRJZHgrMj49ZW5kSWR4KWJyZWFrO2hlYXBbb3V0SWR4KytdPTIyNHx1Pj4xMjtoZWFwW291dElkeCsrXT0xMjh8dT4+NiY2MztoZWFwW291dElkeCsrXT0xMjh8dSY2M31lbHNle2lmKG91dElkeCszPj1lbmRJZHgpYnJlYWs7aGVhcFtvdXRJZHgrK109MjQwfHU+PjE4O2hlYXBbb3V0SWR4KytdPTEyOHx1Pj4xMiY2MztoZWFwW291dElkeCsrXT0xMjh8dT4+NiY2MztoZWFwW291dElkeCsrXT0xMjh8dSY2M319aGVhcFtvdXRJZHhdPTA7cmV0dXJuIG91dElkeC1zdGFydElkeH1mdW5jdGlvbiBzdHJpbmdUb1VURjgoc3RyLG91dFB0cixtYXhCeXRlc1RvV3JpdGUpe3JldHVybiBzdHJpbmdUb1VURjhBcnJheShzdHIsSEVBUFU4LG91dFB0cixtYXhCeXRlc1RvV3JpdGUpfWZ1bmN0aW9uIHdyaXRlQXJyYXlUb01lbW9yeShhcnJheSxidWZmZXIpe0hFQVA4LnNldChhcnJheSxidWZmZXIpfWZ1bmN0aW9uIGFsaWduVXAoeCxtdWx0aXBsZSl7aWYoeCVtdWx0aXBsZT4wKXt4Kz1tdWx0aXBsZS14JW11bHRpcGxlfXJldHVybiB4fXZhciBidWZmZXIsSEVBUDgsSEVBUFU4LEhFQVAxNixIRUFQVTE2LEhFQVAzMixIRUFQVTMyLEhFQVBGMzIsSEVBUEY2NDtmdW5jdGlvbiB1cGRhdGVHbG9iYWxCdWZmZXJBbmRWaWV3cyhidWYpe2J1ZmZlcj1idWY7TW9kdWxlW1wiSEVBUDhcIl09SEVBUDg9bmV3IEludDhBcnJheShidWYpO01vZHVsZVtcIkhFQVAxNlwiXT1IRUFQMTY9bmV3IEludDE2QXJyYXkoYnVmKTtNb2R1bGVbXCJIRUFQMzJcIl09SEVBUDMyPW5ldyBJbnQzMkFycmF5KGJ1Zik7TW9kdWxlW1wiSEVBUFU4XCJdPUhFQVBVOD1uZXcgVWludDhBcnJheShidWYpO01vZHVsZVtcIkhFQVBVMTZcIl09SEVBUFUxNj1uZXcgVWludDE2QXJyYXkoYnVmKTtNb2R1bGVbXCJIRUFQVTMyXCJdPUhFQVBVMzI9bmV3IFVpbnQzMkFycmF5KGJ1Zik7TW9kdWxlW1wiSEVBUEYzMlwiXT1IRUFQRjMyPW5ldyBGbG9hdDMyQXJyYXkoYnVmKTtNb2R1bGVbXCJIRUFQRjY0XCJdPUhFQVBGNjQ9bmV3IEZsb2F0NjRBcnJheShidWYpfXZhciBJTklUSUFMX01FTU9SWT1Nb2R1bGVbXCJJTklUSUFMX01FTU9SWVwiXXx8MTY3NzcyMTY7dmFyIHdhc21UYWJsZTt2YXIgX19BVFBSRVJVTl9fPVtdO3ZhciBfX0FUSU5JVF9fPVtdO3ZhciBfX0FUTUFJTl9fPVtdO3ZhciBfX0FUUE9TVFJVTl9fPVtdO3ZhciBydW50aW1lSW5pdGlhbGl6ZWQ9ZmFsc2U7X19BVElOSVRfXy5wdXNoKHtmdW5jOmZ1bmN0aW9uKCl7X19fd2FzbV9jYWxsX2N0b3JzKCl9fSk7ZnVuY3Rpb24gcHJlUnVuKCl7aWYoTW9kdWxlW1wicHJlUnVuXCJdKXtpZih0eXBlb2YgTW9kdWxlW1wicHJlUnVuXCJdPT1cImZ1bmN0aW9uXCIpTW9kdWxlW1wicHJlUnVuXCJdPVtNb2R1bGVbXCJwcmVSdW5cIl1dO3doaWxlKE1vZHVsZVtcInByZVJ1blwiXS5sZW5ndGgpe2FkZE9uUHJlUnVuKE1vZHVsZVtcInByZVJ1blwiXS5zaGlmdCgpKX19Y2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVFBSRVJVTl9fKX1mdW5jdGlvbiBpbml0UnVudGltZSgpe3J1bnRpbWVJbml0aWFsaXplZD10cnVlO2NhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRJTklUX18pfWZ1bmN0aW9uIHByZU1haW4oKXtjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUTUFJTl9fKX1mdW5jdGlvbiBwb3N0UnVuKCl7aWYoTW9kdWxlW1wicG9zdFJ1blwiXSl7aWYodHlwZW9mIE1vZHVsZVtcInBvc3RSdW5cIl09PVwiZnVuY3Rpb25cIilNb2R1bGVbXCJwb3N0UnVuXCJdPVtNb2R1bGVbXCJwb3N0UnVuXCJdXTt3aGlsZShNb2R1bGVbXCJwb3N0UnVuXCJdLmxlbmd0aCl7YWRkT25Qb3N0UnVuKE1vZHVsZVtcInBvc3RSdW5cIl0uc2hpZnQoKSl9fWNhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRQT1NUUlVOX18pfWZ1bmN0aW9uIGFkZE9uUHJlUnVuKGNiKXtfX0FUUFJFUlVOX18udW5zaGlmdChjYil9ZnVuY3Rpb24gYWRkT25Qb3N0UnVuKGNiKXtfX0FUUE9TVFJVTl9fLnVuc2hpZnQoY2IpfXZhciBydW5EZXBlbmRlbmNpZXM9MDt2YXIgcnVuRGVwZW5kZW5jeVdhdGNoZXI9bnVsbDt2YXIgZGVwZW5kZW5jaWVzRnVsZmlsbGVkPW51bGw7ZnVuY3Rpb24gYWRkUnVuRGVwZW5kZW5jeShpZCl7cnVuRGVwZW5kZW5jaWVzKys7aWYoTW9kdWxlW1wibW9uaXRvclJ1bkRlcGVuZGVuY2llc1wiXSl7TW9kdWxlW1wibW9uaXRvclJ1bkRlcGVuZGVuY2llc1wiXShydW5EZXBlbmRlbmNpZXMpfX1mdW5jdGlvbiByZW1vdmVSdW5EZXBlbmRlbmN5KGlkKXtydW5EZXBlbmRlbmNpZXMtLTtpZihNb2R1bGVbXCJtb25pdG9yUnVuRGVwZW5kZW5jaWVzXCJdKXtNb2R1bGVbXCJtb25pdG9yUnVuRGVwZW5kZW5jaWVzXCJdKHJ1bkRlcGVuZGVuY2llcyl9aWYocnVuRGVwZW5kZW5jaWVzPT0wKXtpZihydW5EZXBlbmRlbmN5V2F0Y2hlciE9PW51bGwpe2NsZWFySW50ZXJ2YWwocnVuRGVwZW5kZW5jeVdhdGNoZXIpO3J1bkRlcGVuZGVuY3lXYXRjaGVyPW51bGx9aWYoZGVwZW5kZW5jaWVzRnVsZmlsbGVkKXt2YXIgY2FsbGJhY2s9ZGVwZW5kZW5jaWVzRnVsZmlsbGVkO2RlcGVuZGVuY2llc0Z1bGZpbGxlZD1udWxsO2NhbGxiYWNrKCl9fX1Nb2R1bGVbXCJwcmVsb2FkZWRJbWFnZXNcIl09e307TW9kdWxlW1wicHJlbG9hZGVkQXVkaW9zXCJdPXt9O2Z1bmN0aW9uIGFib3J0KHdoYXQpe2lmKE1vZHVsZVtcIm9uQWJvcnRcIl0pe01vZHVsZVtcIm9uQWJvcnRcIl0od2hhdCl9d2hhdCs9XCJcIjtlcnIod2hhdCk7QUJPUlQ9dHJ1ZTtFWElUU1RBVFVTPTE7d2hhdD1cImFib3J0KFwiK3doYXQrXCIpLiBCdWlsZCB3aXRoIC1zIEFTU0VSVElPTlM9MSBmb3IgbW9yZSBpbmZvLlwiO3ZhciBlPW5ldyBXZWJBc3NlbWJseS5SdW50aW1lRXJyb3Iod2hhdCk7cmVhZHlQcm9taXNlUmVqZWN0KGUpO3Rocm93IGV9ZnVuY3Rpb24gaGFzUHJlZml4KHN0cixwcmVmaXgpe3JldHVybiBTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGg/c3RyLnN0YXJ0c1dpdGgocHJlZml4KTpzdHIuaW5kZXhPZihwcmVmaXgpPT09MH12YXIgZGF0YVVSSVByZWZpeD1cImRhdGE6YXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtO2Jhc2U2NCxcIjtmdW5jdGlvbiBpc0RhdGFVUkkoZmlsZW5hbWUpe3JldHVybiBoYXNQcmVmaXgoZmlsZW5hbWUsZGF0YVVSSVByZWZpeCl9dmFyIGZpbGVVUklQcmVmaXg9XCJmaWxlOi8vXCI7ZnVuY3Rpb24gaXNGaWxlVVJJKGZpbGVuYW1lKXtyZXR1cm4gaGFzUHJlZml4KGZpbGVuYW1lLGZpbGVVUklQcmVmaXgpfXZhciB3YXNtQmluYXJ5RmlsZT1cInRmanMtYmFja2VuZC13YXNtLndhc21cIjtpZighaXNEYXRhVVJJKHdhc21CaW5hcnlGaWxlKSl7d2FzbUJpbmFyeUZpbGU9bG9jYXRlRmlsZSh3YXNtQmluYXJ5RmlsZSl9ZnVuY3Rpb24gZ2V0QmluYXJ5KGZpbGUpe3RyeXtpZihmaWxlPT13YXNtQmluYXJ5RmlsZSYmd2FzbUJpbmFyeSl7cmV0dXJuIG5ldyBVaW50OEFycmF5KHdhc21CaW5hcnkpfWlmKHJlYWRCaW5hcnkpe3JldHVybiByZWFkQmluYXJ5KGZpbGUpfWVsc2V7dGhyb3dcImJvdGggYXN5bmMgYW5kIHN5bmMgZmV0Y2hpbmcgb2YgdGhlIHdhc20gZmFpbGVkXCJ9fWNhdGNoKGVycil7YWJvcnQoZXJyKX19ZnVuY3Rpb24gZ2V0QmluYXJ5UHJvbWlzZSgpe2lmKCF3YXNtQmluYXJ5JiYoRU5WSVJPTk1FTlRfSVNfV0VCfHxFTlZJUk9OTUVOVF9JU19XT1JLRVIpKXtpZih0eXBlb2YgZmV0Y2g9PT1cImZ1bmN0aW9uXCImJiFpc0ZpbGVVUkkod2FzbUJpbmFyeUZpbGUpKXtyZXR1cm4gZmV0Y2god2FzbUJpbmFyeUZpbGUse2NyZWRlbnRpYWxzOlwic2FtZS1vcmlnaW5cIn0pLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2Upe2lmKCFyZXNwb25zZVtcIm9rXCJdKXt0aHJvd1wiZmFpbGVkIHRvIGxvYWQgd2FzbSBiaW5hcnkgZmlsZSBhdCAnXCIrd2FzbUJpbmFyeUZpbGUrXCInXCJ9cmV0dXJuIHJlc3BvbnNlW1wiYXJyYXlCdWZmZXJcIl0oKX0pLmNhdGNoKGZ1bmN0aW9uKCl7cmV0dXJuIGdldEJpbmFyeSh3YXNtQmluYXJ5RmlsZSl9KX1lbHNle2lmKHJlYWRBc3luYyl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUscmVqZWN0KXtyZWFkQXN5bmMod2FzbUJpbmFyeUZpbGUsZnVuY3Rpb24ocmVzcG9uc2Upe3Jlc29sdmUobmV3IFVpbnQ4QXJyYXkocmVzcG9uc2UpKX0scmVqZWN0KX0pfX19cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gZ2V0QmluYXJ5KHdhc21CaW5hcnlGaWxlKX0pfWZ1bmN0aW9uIGNyZWF0ZVdhc20oKXt2YXIgaW5mbz17XCJhXCI6YXNtTGlicmFyeUFyZ307ZnVuY3Rpb24gcmVjZWl2ZUluc3RhbmNlKGluc3RhbmNlLG1vZHVsZSl7dmFyIGV4cG9ydHM9aW5zdGFuY2UuZXhwb3J0cztNb2R1bGVbXCJhc21cIl09ZXhwb3J0czt3YXNtTWVtb3J5PU1vZHVsZVtcImFzbVwiXVtcImlcIl07dXBkYXRlR2xvYmFsQnVmZmVyQW5kVmlld3Mod2FzbU1lbW9yeS5idWZmZXIpO3dhc21UYWJsZT1Nb2R1bGVbXCJhc21cIl1bXCJvXCJdO3JlbW92ZVJ1bkRlcGVuZGVuY3koXCJ3YXNtLWluc3RhbnRpYXRlXCIpfWFkZFJ1bkRlcGVuZGVuY3koXCJ3YXNtLWluc3RhbnRpYXRlXCIpO2Z1bmN0aW9uIHJlY2VpdmVJbnN0YW50aWF0ZWRTb3VyY2Uob3V0cHV0KXtyZWNlaXZlSW5zdGFuY2Uob3V0cHV0W1wiaW5zdGFuY2VcIl0pfWZ1bmN0aW9uIGluc3RhbnRpYXRlQXJyYXlCdWZmZXIocmVjZWl2ZXIpe3JldHVybiBnZXRCaW5hcnlQcm9taXNlKCkudGhlbihmdW5jdGlvbihiaW5hcnkpe3JldHVybiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShiaW5hcnksaW5mbyl9KS50aGVuKHJlY2VpdmVyLGZ1bmN0aW9uKHJlYXNvbil7ZXJyKFwiZmFpbGVkIHRvIGFzeW5jaHJvbm91c2x5IHByZXBhcmUgd2FzbTogXCIrcmVhc29uKTthYm9ydChyZWFzb24pfSl9ZnVuY3Rpb24gaW5zdGFudGlhdGVBc3luYygpe2lmKCF3YXNtQmluYXJ5JiZ0eXBlb2YgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmc9PT1cImZ1bmN0aW9uXCImJiFpc0RhdGFVUkkod2FzbUJpbmFyeUZpbGUpJiYhaXNGaWxlVVJJKHdhc21CaW5hcnlGaWxlKSYmdHlwZW9mIGZldGNoPT09XCJmdW5jdGlvblwiKXtyZXR1cm4gZmV0Y2god2FzbUJpbmFyeUZpbGUse2NyZWRlbnRpYWxzOlwic2FtZS1vcmlnaW5cIn0pLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2Upe3ZhciByZXN1bHQ9V2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcocmVzcG9uc2UsaW5mbyk7cmV0dXJuIHJlc3VsdC50aGVuKHJlY2VpdmVJbnN0YW50aWF0ZWRTb3VyY2UsZnVuY3Rpb24ocmVhc29uKXtlcnIoXCJ3YXNtIHN0cmVhbWluZyBjb21waWxlIGZhaWxlZDogXCIrcmVhc29uKTtlcnIoXCJmYWxsaW5nIGJhY2sgdG8gQXJyYXlCdWZmZXIgaW5zdGFudGlhdGlvblwiKTtyZXR1cm4gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlSW5zdGFudGlhdGVkU291cmNlKX0pfSl9ZWxzZXtyZXR1cm4gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlSW5zdGFudGlhdGVkU291cmNlKX19aWYoTW9kdWxlW1wiaW5zdGFudGlhdGVXYXNtXCJdKXt0cnl7dmFyIGV4cG9ydHM9TW9kdWxlW1wiaW5zdGFudGlhdGVXYXNtXCJdKGluZm8scmVjZWl2ZUluc3RhbmNlKTtyZXR1cm4gZXhwb3J0c31jYXRjaChlKXtlcnIoXCJNb2R1bGUuaW5zdGFudGlhdGVXYXNtIGNhbGxiYWNrIGZhaWxlZCB3aXRoIGVycm9yOiBcIitlKTtyZXR1cm4gZmFsc2V9fWluc3RhbnRpYXRlQXN5bmMoKS5jYXRjaChyZWFkeVByb21pc2VSZWplY3QpO3JldHVybnt9fWZ1bmN0aW9uIGNhbGxSdW50aW1lQ2FsbGJhY2tzKGNhbGxiYWNrcyl7d2hpbGUoY2FsbGJhY2tzLmxlbmd0aD4wKXt2YXIgY2FsbGJhY2s9Y2FsbGJhY2tzLnNoaWZ0KCk7aWYodHlwZW9mIGNhbGxiYWNrPT1cImZ1bmN0aW9uXCIpe2NhbGxiYWNrKE1vZHVsZSk7Y29udGludWV9dmFyIGZ1bmM9Y2FsbGJhY2suZnVuYztpZih0eXBlb2YgZnVuYz09PVwibnVtYmVyXCIpe2lmKGNhbGxiYWNrLmFyZz09PXVuZGVmaW5lZCl7d2FzbVRhYmxlLmdldChmdW5jKSgpfWVsc2V7d2FzbVRhYmxlLmdldChmdW5jKShjYWxsYmFjay5hcmcpfX1lbHNle2Z1bmMoY2FsbGJhY2suYXJnPT09dW5kZWZpbmVkP251bGw6Y2FsbGJhY2suYXJnKX19fWZ1bmN0aW9uIF9hYm9ydCgpe2Fib3J0KCl9ZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fbWVtY3B5X2JpZyhkZXN0LHNyYyxudW0pe0hFQVBVOC5jb3B5V2l0aGluKGRlc3Qsc3JjLHNyYytudW0pfWZ1bmN0aW9uIF9lbXNjcmlwdGVuX2dldF9oZWFwX3NpemUoKXtyZXR1cm4gSEVBUFU4Lmxlbmd0aH1mdW5jdGlvbiBlbXNjcmlwdGVuX3JlYWxsb2NfYnVmZmVyKHNpemUpe3RyeXt3YXNtTWVtb3J5Lmdyb3coc2l6ZS1idWZmZXIuYnl0ZUxlbmd0aCs2NTUzNT4+PjE2KTt1cGRhdGVHbG9iYWxCdWZmZXJBbmRWaWV3cyh3YXNtTWVtb3J5LmJ1ZmZlcik7cmV0dXJuIDF9Y2F0Y2goZSl7fX1mdW5jdGlvbiBfZW1zY3JpcHRlbl9yZXNpemVfaGVhcChyZXF1ZXN0ZWRTaXplKXt2YXIgb2xkU2l6ZT1fZW1zY3JpcHRlbl9nZXRfaGVhcF9zaXplKCk7dmFyIG1heEhlYXBTaXplPTIxNDc0ODM2NDg7aWYocmVxdWVzdGVkU2l6ZT5tYXhIZWFwU2l6ZSl7cmV0dXJuIGZhbHNlfWZvcih2YXIgY3V0RG93bj0xO2N1dERvd248PTQ7Y3V0RG93bio9Mil7dmFyIG92ZXJHcm93bkhlYXBTaXplPW9sZFNpemUqKDErLjIvY3V0RG93bik7b3Zlckdyb3duSGVhcFNpemU9TWF0aC5taW4ob3Zlckdyb3duSGVhcFNpemUscmVxdWVzdGVkU2l6ZSsxMDA2NjMyOTYpO3ZhciBuZXdTaXplPU1hdGgubWluKG1heEhlYXBTaXplLGFsaWduVXAoTWF0aC5tYXgocmVxdWVzdGVkU2l6ZSxvdmVyR3Jvd25IZWFwU2l6ZSksNjU1MzYpKTt2YXIgcmVwbGFjZW1lbnQ9ZW1zY3JpcHRlbl9yZWFsbG9jX2J1ZmZlcihuZXdTaXplKTtpZihyZXBsYWNlbWVudCl7cmV0dXJuIHRydWV9fXJldHVybiBmYWxzZX12YXIgU1lTQ0FMTFM9e21hcHBpbmdzOnt9LGJ1ZmZlcnM6W251bGwsW10sW11dLHByaW50Q2hhcjpmdW5jdGlvbihzdHJlYW0sY3Vycil7dmFyIGJ1ZmZlcj1TWVNDQUxMUy5idWZmZXJzW3N0cmVhbV07aWYoY3Vycj09PTB8fGN1cnI9PT0xMCl7KHN0cmVhbT09PTE/b3V0OmVycikoVVRGOEFycmF5VG9TdHJpbmcoYnVmZmVyLDApKTtidWZmZXIubGVuZ3RoPTB9ZWxzZXtidWZmZXIucHVzaChjdXJyKX19LHZhcmFyZ3M6dW5kZWZpbmVkLGdldDpmdW5jdGlvbigpe1NZU0NBTExTLnZhcmFyZ3MrPTQ7dmFyIHJldD1IRUFQMzJbU1lTQ0FMTFMudmFyYXJncy00Pj4yXTtyZXR1cm4gcmV0fSxnZXRTdHI6ZnVuY3Rpb24ocHRyKXt2YXIgcmV0PVVURjhUb1N0cmluZyhwdHIpO3JldHVybiByZXR9LGdldDY0OmZ1bmN0aW9uKGxvdyxoaWdoKXtyZXR1cm4gbG93fX07ZnVuY3Rpb24gX2ZkX2Nsb3NlKGZkKXtyZXR1cm4gMH1mdW5jdGlvbiBfZmRfc2VlayhmZCxvZmZzZXRfbG93LG9mZnNldF9oaWdoLHdoZW5jZSxuZXdPZmZzZXQpe31mdW5jdGlvbiBfZmRfd3JpdGUoZmQsaW92LGlvdmNudCxwbnVtKXt2YXIgbnVtPTA7Zm9yKHZhciBpPTA7aTxpb3ZjbnQ7aSsrKXt2YXIgcHRyPUhFQVAzMltpb3YraSo4Pj4yXTt2YXIgbGVuPUhFQVAzMltpb3YrKGkqOCs0KT4+Ml07Zm9yKHZhciBqPTA7ajxsZW47aisrKXtTWVNDQUxMUy5wcmludENoYXIoZmQsSEVBUFU4W3B0citqXSl9bnVtKz1sZW59SEVBUDMyW3BudW0+PjJdPW51bTtyZXR1cm4gMH1mdW5jdGlvbiBfcHRocmVhZF9jcmVhdGUoKXtyZXR1cm4gNn1mdW5jdGlvbiBzZXRFcnJObyh2YWx1ZSl7SEVBUDMyW19fX2Vycm5vX2xvY2F0aW9uKCk+PjJdPXZhbHVlO3JldHVybiB2YWx1ZX1mdW5jdGlvbiBfc3lzY29uZihuYW1lKXtzd2l0Y2gobmFtZSl7Y2FzZSAzMDpyZXR1cm4gMTYzODQ7Y2FzZSA4NTp2YXIgbWF4SGVhcFNpemU9MjE0NzQ4MzY0ODtyZXR1cm4gbWF4SGVhcFNpemUvMTYzODQ7Y2FzZSAxMzI6Y2FzZSAxMzM6Y2FzZSAxMjpjYXNlIDEzNzpjYXNlIDEzODpjYXNlIDE1OmNhc2UgMjM1OmNhc2UgMTY6Y2FzZSAxNzpjYXNlIDE4OmNhc2UgMTk6Y2FzZSAyMDpjYXNlIDE0OTpjYXNlIDEzOmNhc2UgMTA6Y2FzZSAyMzY6Y2FzZSAxNTM6Y2FzZSA5OmNhc2UgMjE6Y2FzZSAyMjpjYXNlIDE1OTpjYXNlIDE1NDpjYXNlIDE0OmNhc2UgNzc6Y2FzZSA3ODpjYXNlIDEzOTpjYXNlIDgyOmNhc2UgNjg6Y2FzZSA2NzpjYXNlIDE2NDpjYXNlIDExOmNhc2UgMjk6Y2FzZSA0NzpjYXNlIDQ4OmNhc2UgOTU6Y2FzZSA1MjpjYXNlIDUxOmNhc2UgNDY6cmV0dXJuIDIwMDgwOTtjYXNlIDI3OmNhc2UgMjQ2OmNhc2UgMTI3OmNhc2UgMTI4OmNhc2UgMjM6Y2FzZSAyNDpjYXNlIDE2MDpjYXNlIDE2MTpjYXNlIDE4MTpjYXNlIDE4MjpjYXNlIDI0MjpjYXNlIDE4MzpjYXNlIDE4NDpjYXNlIDI0MzpjYXNlIDI0NDpjYXNlIDI0NTpjYXNlIDE2NTpjYXNlIDE3ODpjYXNlIDE3OTpjYXNlIDQ5OmNhc2UgNTA6Y2FzZSAxNjg6Y2FzZSAxNjk6Y2FzZSAxNzU6Y2FzZSAxNzA6Y2FzZSAxNzE6Y2FzZSAxNzI6Y2FzZSA5NzpjYXNlIDc2OmNhc2UgMzI6Y2FzZSAxNzM6Y2FzZSAzNTpjYXNlIDgwOmNhc2UgODE6Y2FzZSA3OTpyZXR1cm4tMTtjYXNlIDE3NjpjYXNlIDE3NzpjYXNlIDc6Y2FzZSAxNTU6Y2FzZSA4OmNhc2UgMTU3OmNhc2UgMTI1OmNhc2UgMTI2OmNhc2UgOTI6Y2FzZSA5MzpjYXNlIDEyOTpjYXNlIDEzMDpjYXNlIDEzMTpjYXNlIDk0OmNhc2UgOTE6cmV0dXJuIDE7Y2FzZSA3NDpjYXNlIDYwOmNhc2UgNjk6Y2FzZSA3MDpjYXNlIDQ6cmV0dXJuIDEwMjQ7Y2FzZSAzMTpjYXNlIDQyOmNhc2UgNzI6cmV0dXJuIDMyO2Nhc2UgODc6Y2FzZSAyNjpjYXNlIDMzOnJldHVybiAyMTQ3NDgzNjQ3O2Nhc2UgMzQ6Y2FzZSAxOnJldHVybiA0NzgzOTtjYXNlIDM4OmNhc2UgMzY6cmV0dXJuIDk5O2Nhc2UgNDM6Y2FzZSAzNzpyZXR1cm4gMjA0ODtjYXNlIDA6cmV0dXJuIDIwOTcxNTI7Y2FzZSAzOnJldHVybiA2NTUzNjtjYXNlIDI4OnJldHVybiAzMjc2ODtjYXNlIDQ0OnJldHVybiAzMjc2NztjYXNlIDc1OnJldHVybiAxNjM4NDtjYXNlIDM5OnJldHVybiAxZTM7Y2FzZSA4OTpyZXR1cm4gNzAwO2Nhc2UgNzE6cmV0dXJuIDI1NjtjYXNlIDQwOnJldHVybiAyNTU7Y2FzZSAyOnJldHVybiAxMDA7Y2FzZSAxODA6cmV0dXJuIDY0O2Nhc2UgMjU6cmV0dXJuIDIwO2Nhc2UgNTpyZXR1cm4gMTY7Y2FzZSA2OnJldHVybiA2O2Nhc2UgNzM6cmV0dXJuIDQ7Y2FzZSA4NDp7aWYodHlwZW9mIG5hdmlnYXRvcj09PVwib2JqZWN0XCIpcmV0dXJuIG5hdmlnYXRvcltcImhhcmR3YXJlQ29uY3VycmVuY3lcIl18fDE7cmV0dXJuIDF9fXNldEVyck5vKDI4KTtyZXR1cm4tMX12YXIgYXNtTGlicmFyeUFyZz17XCJhXCI6X2Fib3J0LFwiZFwiOl9lbXNjcmlwdGVuX21lbWNweV9iaWcsXCJlXCI6X2Vtc2NyaXB0ZW5fcmVzaXplX2hlYXAsXCJmXCI6X2ZkX2Nsb3NlLFwiY1wiOl9mZF9zZWVrLFwiYlwiOl9mZF93cml0ZSxcImdcIjpfcHRocmVhZF9jcmVhdGUsXCJoXCI6X3N5c2NvbmZ9O3ZhciBhc209Y3JlYXRlV2FzbSgpO3ZhciBfX193YXNtX2NhbGxfY3RvcnM9TW9kdWxlW1wiX19fd2FzbV9jYWxsX2N0b3JzXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9fX3dhc21fY2FsbF9jdG9ycz1Nb2R1bGVbXCJfX193YXNtX2NhbGxfY3RvcnNcIl09TW9kdWxlW1wiYXNtXCJdW1wialwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX2luaXQ9TW9kdWxlW1wiX2luaXRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX2luaXQ9TW9kdWxlW1wiX2luaXRcIl09TW9kdWxlW1wiYXNtXCJdW1wia1wiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX3JlZ2lzdGVyX3RlbnNvcj1Nb2R1bGVbXCJfcmVnaXN0ZXJfdGVuc29yXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9yZWdpc3Rlcl90ZW5zb3I9TW9kdWxlW1wiX3JlZ2lzdGVyX3RlbnNvclwiXT1Nb2R1bGVbXCJhc21cIl1bXCJsXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfZGlzcG9zZV9kYXRhPU1vZHVsZVtcIl9kaXNwb3NlX2RhdGFcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX2Rpc3Bvc2VfZGF0YT1Nb2R1bGVbXCJfZGlzcG9zZV9kYXRhXCJdPU1vZHVsZVtcImFzbVwiXVtcIm1cIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9kaXNwb3NlPU1vZHVsZVtcIl9kaXNwb3NlXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9kaXNwb3NlPU1vZHVsZVtcIl9kaXNwb3NlXCJdPU1vZHVsZVtcImFzbVwiXVtcIm5cIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9BYnM9TW9kdWxlW1wiX0Fic1wiXT1mdW5jdGlvbigpe3JldHVybihfQWJzPU1vZHVsZVtcIl9BYnNcIl09TW9kdWxlW1wiYXNtXCJdW1wicFwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0FkZD1Nb2R1bGVbXCJfQWRkXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9BZGQ9TW9kdWxlW1wiX0FkZFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJxXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQWRkTj1Nb2R1bGVbXCJfQWRkTlwiXT1mdW5jdGlvbigpe3JldHVybihfQWRkTj1Nb2R1bGVbXCJfQWRkTlwiXT1Nb2R1bGVbXCJhc21cIl1bXCJyXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQWxsPU1vZHVsZVtcIl9BbGxcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0FsbD1Nb2R1bGVbXCJfQWxsXCJdPU1vZHVsZVtcImFzbVwiXVtcInNcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Bbnk9TW9kdWxlW1wiX0FueVwiXT1mdW5jdGlvbigpe3JldHVybihfQW55PU1vZHVsZVtcIl9BbnlcIl09TW9kdWxlW1wiYXNtXCJdW1widFwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0FyZ01heD1Nb2R1bGVbXCJfQXJnTWF4XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9BcmdNYXg9TW9kdWxlW1wiX0FyZ01heFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJ1XCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQXZnUG9vbD1Nb2R1bGVbXCJfQXZnUG9vbFwiXT1mdW5jdGlvbigpe3JldHVybihfQXZnUG9vbD1Nb2R1bGVbXCJfQXZnUG9vbFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJ2XCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQmF0Y2hNYXRNdWw9TW9kdWxlW1wiX0JhdGNoTWF0TXVsXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9CYXRjaE1hdE11bD1Nb2R1bGVbXCJfQmF0Y2hNYXRNdWxcIl09TW9kdWxlW1wiYXNtXCJdW1wid1wiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0NlaWw9TW9kdWxlW1wiX0NlaWxcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0NlaWw9TW9kdWxlW1wiX0NlaWxcIl09TW9kdWxlW1wiYXNtXCJdW1wieFwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0NsaXBCeVZhbHVlPU1vZHVsZVtcIl9DbGlwQnlWYWx1ZVwiXT1mdW5jdGlvbigpe3JldHVybihfQ2xpcEJ5VmFsdWU9TW9kdWxlW1wiX0NsaXBCeVZhbHVlXCJdPU1vZHVsZVtcImFzbVwiXVtcInlcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Db252MkQ9TW9kdWxlW1wiX0NvbnYyRFwiXT1mdW5jdGlvbigpe3JldHVybihfQ29udjJEPU1vZHVsZVtcIl9Db252MkRcIl09TW9kdWxlW1wiYXNtXCJdW1wielwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0NvbnYyREJhY2twcm9wSW5wdXQ9TW9kdWxlW1wiX0NvbnYyREJhY2twcm9wSW5wdXRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0NvbnYyREJhY2twcm9wSW5wdXQ9TW9kdWxlW1wiX0NvbnYyREJhY2twcm9wSW5wdXRcIl09TW9kdWxlW1wiYXNtXCJdW1wiQVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0Nvcz1Nb2R1bGVbXCJfQ29zXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Db3M9TW9kdWxlW1wiX0Nvc1wiXT1Nb2R1bGVbXCJhc21cIl1bXCJCXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQ29zaD1Nb2R1bGVbXCJfQ29zaFwiXT1mdW5jdGlvbigpe3JldHVybihfQ29zaD1Nb2R1bGVbXCJfQ29zaFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJDXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQ3JvcEFuZFJlc2l6ZT1Nb2R1bGVbXCJfQ3JvcEFuZFJlc2l6ZVwiXT1mdW5jdGlvbigpe3JldHVybihfQ3JvcEFuZFJlc2l6ZT1Nb2R1bGVbXCJfQ3JvcEFuZFJlc2l6ZVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJEXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQ3Vtc3VtPU1vZHVsZVtcIl9DdW1zdW1cIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0N1bXN1bT1Nb2R1bGVbXCJfQ3Vtc3VtXCJdPU1vZHVsZVtcImFzbVwiXVtcIkVcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9EZXB0aFRvU3BhY2U9TW9kdWxlW1wiX0RlcHRoVG9TcGFjZVwiXT1mdW5jdGlvbigpe3JldHVybihfRGVwdGhUb1NwYWNlPU1vZHVsZVtcIl9EZXB0aFRvU3BhY2VcIl09TW9kdWxlW1wiYXNtXCJdW1wiRlwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0RlcHRod2lzZUNvbnYyZE5hdGl2ZT1Nb2R1bGVbXCJfRGVwdGh3aXNlQ29udjJkTmF0aXZlXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9EZXB0aHdpc2VDb252MmROYXRpdmU9TW9kdWxlW1wiX0RlcHRod2lzZUNvbnYyZE5hdGl2ZVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJHXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfRXF1YWw9TW9kdWxlW1wiX0VxdWFsXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9FcXVhbD1Nb2R1bGVbXCJfRXF1YWxcIl09TW9kdWxlW1wiYXNtXCJdW1wiSFwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0V4cD1Nb2R1bGVbXCJfRXhwXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9FeHA9TW9kdWxlW1wiX0V4cFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJJXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfRmxpcExlZnRSaWdodD1Nb2R1bGVbXCJfRmxpcExlZnRSaWdodFwiXT1mdW5jdGlvbigpe3JldHVybihfRmxpcExlZnRSaWdodD1Nb2R1bGVbXCJfRmxpcExlZnRSaWdodFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJKXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfRmxvb3I9TW9kdWxlW1wiX0Zsb29yXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9GbG9vcj1Nb2R1bGVbXCJfRmxvb3JcIl09TW9kdWxlW1wiYXNtXCJdW1wiS1wiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0Zsb29yRGl2PU1vZHVsZVtcIl9GbG9vckRpdlwiXT1mdW5jdGlvbigpe3JldHVybihfRmxvb3JEaXY9TW9kdWxlW1wiX0Zsb29yRGl2XCJdPU1vZHVsZVtcImFzbVwiXVtcIkxcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9GdXNlZEJhdGNoTm9ybT1Nb2R1bGVbXCJfRnVzZWRCYXRjaE5vcm1cIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0Z1c2VkQmF0Y2hOb3JtPU1vZHVsZVtcIl9GdXNlZEJhdGNoTm9ybVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJNXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfRnVzZWRDb252MkQ9TW9kdWxlW1wiX0Z1c2VkQ29udjJEXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9GdXNlZENvbnYyRD1Nb2R1bGVbXCJfRnVzZWRDb252MkRcIl09TW9kdWxlW1wiYXNtXCJdW1wiTlwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0Z1c2VkRGVwdGh3aXNlQ29udjJEPU1vZHVsZVtcIl9GdXNlZERlcHRod2lzZUNvbnYyRFwiXT1mdW5jdGlvbigpe3JldHVybihfRnVzZWREZXB0aHdpc2VDb252MkQ9TW9kdWxlW1wiX0Z1c2VkRGVwdGh3aXNlQ29udjJEXCJdPU1vZHVsZVtcImFzbVwiXVtcIk9cIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9HYXRoZXI9TW9kdWxlW1wiX0dhdGhlclwiXT1mdW5jdGlvbigpe3JldHVybihfR2F0aGVyPU1vZHVsZVtcIl9HYXRoZXJcIl09TW9kdWxlW1wiYXNtXCJdW1wiUFwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0dhdGhlck5kPU1vZHVsZVtcIl9HYXRoZXJOZFwiXT1mdW5jdGlvbigpe3JldHVybihfR2F0aGVyTmQ9TW9kdWxlW1wiX0dhdGhlck5kXCJdPU1vZHVsZVtcImFzbVwiXVtcIlFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9HcmVhdGVyPU1vZHVsZVtcIl9HcmVhdGVyXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9HcmVhdGVyPU1vZHVsZVtcIl9HcmVhdGVyXCJdPU1vZHVsZVtcImFzbVwiXVtcIlJcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9HcmVhdGVyRXF1YWw9TW9kdWxlW1wiX0dyZWF0ZXJFcXVhbFwiXT1mdW5jdGlvbigpe3JldHVybihfR3JlYXRlckVxdWFsPU1vZHVsZVtcIl9HcmVhdGVyRXF1YWxcIl09TW9kdWxlW1wiYXNtXCJdW1wiU1wiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0xlYWt5UmVsdT1Nb2R1bGVbXCJfTGVha3lSZWx1XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9MZWFreVJlbHU9TW9kdWxlW1wiX0xlYWt5UmVsdVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJUXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTGVzcz1Nb2R1bGVbXCJfTGVzc1wiXT1mdW5jdGlvbigpe3JldHVybihfTGVzcz1Nb2R1bGVbXCJfTGVzc1wiXT1Nb2R1bGVbXCJhc21cIl1bXCJVXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTGVzc0VxdWFsPU1vZHVsZVtcIl9MZXNzRXF1YWxcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0xlc3NFcXVhbD1Nb2R1bGVbXCJfTGVzc0VxdWFsXCJdPU1vZHVsZVtcImFzbVwiXVtcIlZcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Mb2c9TW9kdWxlW1wiX0xvZ1wiXT1mdW5jdGlvbigpe3JldHVybihfTG9nPU1vZHVsZVtcIl9Mb2dcIl09TW9kdWxlW1wiYXNtXCJdW1wiV1wiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0xvZ2ljYWxBbmQ9TW9kdWxlW1wiX0xvZ2ljYWxBbmRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0xvZ2ljYWxBbmQ9TW9kdWxlW1wiX0xvZ2ljYWxBbmRcIl09TW9kdWxlW1wiYXNtXCJdW1wiWFwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX01heD1Nb2R1bGVbXCJfTWF4XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9NYXg9TW9kdWxlW1wiX01heFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJZXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTWF4UG9vbD1Nb2R1bGVbXCJfTWF4UG9vbFwiXT1mdW5jdGlvbigpe3JldHVybihfTWF4UG9vbD1Nb2R1bGVbXCJfTWF4UG9vbFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJaXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTWF4aW11bT1Nb2R1bGVbXCJfTWF4aW11bVwiXT1mdW5jdGlvbigpe3JldHVybihfTWF4aW11bT1Nb2R1bGVbXCJfTWF4aW11bVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJfXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTWVhbj1Nb2R1bGVbXCJfTWVhblwiXT1mdW5jdGlvbigpe3JldHVybihfTWVhbj1Nb2R1bGVbXCJfTWVhblwiXT1Nb2R1bGVbXCJhc21cIl1bXCIkXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTWluPU1vZHVsZVtcIl9NaW5cIl09ZnVuY3Rpb24oKXtyZXR1cm4oX01pbj1Nb2R1bGVbXCJfTWluXCJdPU1vZHVsZVtcImFzbVwiXVtcImFhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTWluaW11bT1Nb2R1bGVbXCJfTWluaW11bVwiXT1mdW5jdGlvbigpe3JldHVybihfTWluaW11bT1Nb2R1bGVbXCJfTWluaW11bVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJiYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX01pcnJvclBhZD1Nb2R1bGVbXCJfTWlycm9yUGFkXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9NaXJyb3JQYWQ9TW9kdWxlW1wiX01pcnJvclBhZFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJjYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX011bHRpcGx5PU1vZHVsZVtcIl9NdWx0aXBseVwiXT1mdW5jdGlvbigpe3JldHVybihfTXVsdGlwbHk9TW9kdWxlW1wiX011bHRpcGx5XCJdPU1vZHVsZVtcImFzbVwiXVtcImRhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTmVnPU1vZHVsZVtcIl9OZWdcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX05lZz1Nb2R1bGVbXCJfTmVnXCJdPU1vZHVsZVtcImFzbVwiXVtcImVhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTm9uTWF4U3VwcHJlc3Npb25WMz1Nb2R1bGVbXCJfTm9uTWF4U3VwcHJlc3Npb25WM1wiXT1mdW5jdGlvbigpe3JldHVybihfTm9uTWF4U3VwcHJlc3Npb25WMz1Nb2R1bGVbXCJfTm9uTWF4U3VwcHJlc3Npb25WM1wiXT1Nb2R1bGVbXCJhc21cIl1bXCJmYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX05vbk1heFN1cHByZXNzaW9uVjQ9TW9kdWxlW1wiX05vbk1heFN1cHByZXNzaW9uVjRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX05vbk1heFN1cHByZXNzaW9uVjQ9TW9kdWxlW1wiX05vbk1heFN1cHByZXNzaW9uVjRcIl09TW9kdWxlW1wiYXNtXCJdW1wiZ2FcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Ob25NYXhTdXBwcmVzc2lvblY1PU1vZHVsZVtcIl9Ob25NYXhTdXBwcmVzc2lvblY1XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Ob25NYXhTdXBwcmVzc2lvblY1PU1vZHVsZVtcIl9Ob25NYXhTdXBwcmVzc2lvblY1XCJdPU1vZHVsZVtcImFzbVwiXVtcImhhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTm90RXF1YWw9TW9kdWxlW1wiX05vdEVxdWFsXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Ob3RFcXVhbD1Nb2R1bGVbXCJfTm90RXF1YWxcIl09TW9kdWxlW1wiYXNtXCJdW1wiaWFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9PbmVIb3Q9TW9kdWxlW1wiX09uZUhvdFwiXT1mdW5jdGlvbigpe3JldHVybihfT25lSG90PU1vZHVsZVtcIl9PbmVIb3RcIl09TW9kdWxlW1wiYXNtXCJdW1wiamFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9QYWRWMj1Nb2R1bGVbXCJfUGFkVjJcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1BhZFYyPU1vZHVsZVtcIl9QYWRWMlwiXT1Nb2R1bGVbXCJhc21cIl1bXCJrYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1Bvdz1Nb2R1bGVbXCJfUG93XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Qb3c9TW9kdWxlW1wiX1Bvd1wiXT1Nb2R1bGVbXCJhc21cIl1bXCJsYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1ByZWx1PU1vZHVsZVtcIl9QcmVsdVwiXT1mdW5jdGlvbigpe3JldHVybihfUHJlbHU9TW9kdWxlW1wiX1ByZWx1XCJdPU1vZHVsZVtcImFzbVwiXVtcIm1hXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfUHJvZD1Nb2R1bGVbXCJfUHJvZFwiXT1mdW5jdGlvbigpe3JldHVybihfUHJvZD1Nb2R1bGVbXCJfUHJvZFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJuYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1JlYWxEaXY9TW9kdWxlW1wiX1JlYWxEaXZcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1JlYWxEaXY9TW9kdWxlW1wiX1JlYWxEaXZcIl09TW9kdWxlW1wiYXNtXCJdW1wib2FcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9SZWx1PU1vZHVsZVtcIl9SZWx1XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9SZWx1PU1vZHVsZVtcIl9SZWx1XCJdPU1vZHVsZVtcImFzbVwiXVtcInBhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfUmVsdTY9TW9kdWxlW1wiX1JlbHU2XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9SZWx1Nj1Nb2R1bGVbXCJfUmVsdTZcIl09TW9kdWxlW1wiYXNtXCJdW1wicWFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9SZXNpemVCaWxpbmVhcj1Nb2R1bGVbXCJfUmVzaXplQmlsaW5lYXJcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1Jlc2l6ZUJpbGluZWFyPU1vZHVsZVtcIl9SZXNpemVCaWxpbmVhclwiXT1Nb2R1bGVbXCJhc21cIl1bXCJyYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1JldmVyc2U9TW9kdWxlW1wiX1JldmVyc2VcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1JldmVyc2U9TW9kdWxlW1wiX1JldmVyc2VcIl09TW9kdWxlW1wiYXNtXCJdW1wic2FcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Sb3RhdGVXaXRoT2Zmc2V0PU1vZHVsZVtcIl9Sb3RhdGVXaXRoT2Zmc2V0XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Sb3RhdGVXaXRoT2Zmc2V0PU1vZHVsZVtcIl9Sb3RhdGVXaXRoT2Zmc2V0XCJdPU1vZHVsZVtcImFzbVwiXVtcInRhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfUm91bmQ9TW9kdWxlW1wiX1JvdW5kXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Sb3VuZD1Nb2R1bGVbXCJfUm91bmRcIl09TW9kdWxlW1wiYXNtXCJdW1widWFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Sc3FydD1Nb2R1bGVbXCJfUnNxcnRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1JzcXJ0PU1vZHVsZVtcIl9Sc3FydFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJ2YVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1NjYXR0ZXJOZD1Nb2R1bGVbXCJfU2NhdHRlck5kXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9TY2F0dGVyTmQ9TW9kdWxlW1wiX1NjYXR0ZXJOZFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJ3YVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1NlbGVjdFYyPU1vZHVsZVtcIl9TZWxlY3RWMlwiXT1mdW5jdGlvbigpe3JldHVybihfU2VsZWN0VjI9TW9kdWxlW1wiX1NlbGVjdFYyXCJdPU1vZHVsZVtcImFzbVwiXVtcInhhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfU2lnbW9pZD1Nb2R1bGVbXCJfU2lnbW9pZFwiXT1mdW5jdGlvbigpe3JldHVybihfU2lnbW9pZD1Nb2R1bGVbXCJfU2lnbW9pZFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJ5YVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1Npbj1Nb2R1bGVbXCJfU2luXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9TaW49TW9kdWxlW1wiX1NpblwiXT1Nb2R1bGVbXCJhc21cIl1bXCJ6YVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1NvZnRtYXg9TW9kdWxlW1wiX1NvZnRtYXhcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1NvZnRtYXg9TW9kdWxlW1wiX1NvZnRtYXhcIl09TW9kdWxlW1wiYXNtXCJdW1wiQWFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9TcXJ0PU1vZHVsZVtcIl9TcXJ0XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9TcXJ0PU1vZHVsZVtcIl9TcXJ0XCJdPU1vZHVsZVtcImFzbVwiXVtcIkJhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfU3F1YXJlPU1vZHVsZVtcIl9TcXVhcmVcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1NxdWFyZT1Nb2R1bGVbXCJfU3F1YXJlXCJdPU1vZHVsZVtcImFzbVwiXVtcIkNhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfU3F1YXJlZERpZmZlcmVuY2U9TW9kdWxlW1wiX1NxdWFyZWREaWZmZXJlbmNlXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9TcXVhcmVkRGlmZmVyZW5jZT1Nb2R1bGVbXCJfU3F1YXJlZERpZmZlcmVuY2VcIl09TW9kdWxlW1wiYXNtXCJdW1wiRGFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9TdGVwPU1vZHVsZVtcIl9TdGVwXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9TdGVwPU1vZHVsZVtcIl9TdGVwXCJdPU1vZHVsZVtcImFzbVwiXVtcIkVhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfU3RyaWRlZFNsaWNlPU1vZHVsZVtcIl9TdHJpZGVkU2xpY2VcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1N0cmlkZWRTbGljZT1Nb2R1bGVbXCJfU3RyaWRlZFNsaWNlXCJdPU1vZHVsZVtcImFzbVwiXVtcIkZhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfU3ViPU1vZHVsZVtcIl9TdWJcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1N1Yj1Nb2R1bGVbXCJfU3ViXCJdPU1vZHVsZVtcImFzbVwiXVtcIkdhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfU3VtPU1vZHVsZVtcIl9TdW1cIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1N1bT1Nb2R1bGVbXCJfU3VtXCJdPU1vZHVsZVtcImFzbVwiXVtcIkhhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfVGFuPU1vZHVsZVtcIl9UYW5cIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1Rhbj1Nb2R1bGVbXCJfVGFuXCJdPU1vZHVsZVtcImFzbVwiXVtcIklhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfVGFuaD1Nb2R1bGVbXCJfVGFuaFwiXT1mdW5jdGlvbigpe3JldHVybihfVGFuaD1Nb2R1bGVbXCJfVGFuaFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJKYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1RpbGU9TW9kdWxlW1wiX1RpbGVcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1RpbGU9TW9kdWxlW1wiX1RpbGVcIl09TW9kdWxlW1wiYXNtXCJdW1wiS2FcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Ub3BLPU1vZHVsZVtcIl9Ub3BLXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Ub3BLPU1vZHVsZVtcIl9Ub3BLXCJdPU1vZHVsZVtcImFzbVwiXVtcIkxhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfVHJhbnNmb3JtPU1vZHVsZVtcIl9UcmFuc2Zvcm1cIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1RyYW5zZm9ybT1Nb2R1bGVbXCJfVHJhbnNmb3JtXCJdPU1vZHVsZVtcImFzbVwiXVtcIk1hXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfVHJhbnNwb3NlPU1vZHVsZVtcIl9UcmFuc3Bvc2VcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1RyYW5zcG9zZT1Nb2R1bGVbXCJfVHJhbnNwb3NlXCJdPU1vZHVsZVtcImFzbVwiXVtcIk5hXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfX0Z1c2VkTWF0TXVsPU1vZHVsZVtcIl9fRnVzZWRNYXRNdWxcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX19GdXNlZE1hdE11bD1Nb2R1bGVbXCJfX0Z1c2VkTWF0TXVsXCJdPU1vZHVsZVtcImFzbVwiXVtcIk9hXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfbWFsbG9jPU1vZHVsZVtcIl9tYWxsb2NcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX21hbGxvYz1Nb2R1bGVbXCJfbWFsbG9jXCJdPU1vZHVsZVtcImFzbVwiXVtcIlBhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfZnJlZT1Nb2R1bGVbXCJfZnJlZVwiXT1mdW5jdGlvbigpe3JldHVybihfZnJlZT1Nb2R1bGVbXCJfZnJlZVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJRYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX19fZXJybm9fbG9jYXRpb249TW9kdWxlW1wiX19fZXJybm9fbG9jYXRpb25cIl09ZnVuY3Rpb24oKXtyZXR1cm4oX19fZXJybm9fbG9jYXRpb249TW9kdWxlW1wiX19fZXJybm9fbG9jYXRpb25cIl09TW9kdWxlW1wiYXNtXCJdW1wiUmFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIHN0YWNrU2F2ZT1Nb2R1bGVbXCJzdGFja1NhdmVcIl09ZnVuY3Rpb24oKXtyZXR1cm4oc3RhY2tTYXZlPU1vZHVsZVtcInN0YWNrU2F2ZVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJTYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgc3RhY2tSZXN0b3JlPU1vZHVsZVtcInN0YWNrUmVzdG9yZVwiXT1mdW5jdGlvbigpe3JldHVybihzdGFja1Jlc3RvcmU9TW9kdWxlW1wic3RhY2tSZXN0b3JlXCJdPU1vZHVsZVtcImFzbVwiXVtcIlRhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBzdGFja0FsbG9jPU1vZHVsZVtcInN0YWNrQWxsb2NcIl09ZnVuY3Rpb24oKXtyZXR1cm4oc3RhY2tBbGxvYz1Nb2R1bGVbXCJzdGFja0FsbG9jXCJdPU1vZHVsZVtcImFzbVwiXVtcIlVhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O01vZHVsZVtcImN3cmFwXCJdPWN3cmFwO3ZhciBjYWxsZWRSdW47ZnVuY3Rpb24gRXhpdFN0YXR1cyhzdGF0dXMpe3RoaXMubmFtZT1cIkV4aXRTdGF0dXNcIjt0aGlzLm1lc3NhZ2U9XCJQcm9ncmFtIHRlcm1pbmF0ZWQgd2l0aCBleGl0KFwiK3N0YXR1cytcIilcIjt0aGlzLnN0YXR1cz1zdGF0dXN9ZGVwZW5kZW5jaWVzRnVsZmlsbGVkPWZ1bmN0aW9uIHJ1bkNhbGxlcigpe2lmKCFjYWxsZWRSdW4pcnVuKCk7aWYoIWNhbGxlZFJ1bilkZXBlbmRlbmNpZXNGdWxmaWxsZWQ9cnVuQ2FsbGVyfTtmdW5jdGlvbiBydW4oYXJncyl7YXJncz1hcmdzfHxhcmd1bWVudHNfO2lmKHJ1bkRlcGVuZGVuY2llcz4wKXtyZXR1cm59cHJlUnVuKCk7aWYocnVuRGVwZW5kZW5jaWVzPjApe3JldHVybn1mdW5jdGlvbiBkb1J1bigpe2lmKGNhbGxlZFJ1bilyZXR1cm47Y2FsbGVkUnVuPXRydWU7TW9kdWxlW1wiY2FsbGVkUnVuXCJdPXRydWU7aWYoQUJPUlQpcmV0dXJuO2luaXRSdW50aW1lKCk7cHJlTWFpbigpO3JlYWR5UHJvbWlzZVJlc29sdmUoTW9kdWxlKTtpZihNb2R1bGVbXCJvblJ1bnRpbWVJbml0aWFsaXplZFwiXSlNb2R1bGVbXCJvblJ1bnRpbWVJbml0aWFsaXplZFwiXSgpO3Bvc3RSdW4oKX1pZihNb2R1bGVbXCJzZXRTdGF0dXNcIl0pe01vZHVsZVtcInNldFN0YXR1c1wiXShcIlJ1bm5pbmcuLi5cIik7c2V0VGltZW91dChmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtNb2R1bGVbXCJzZXRTdGF0dXNcIl0oXCJcIil9LDEpO2RvUnVuKCl9LDEpfWVsc2V7ZG9SdW4oKX19TW9kdWxlW1wicnVuXCJdPXJ1bjtpZihNb2R1bGVbXCJwcmVJbml0XCJdKXtpZih0eXBlb2YgTW9kdWxlW1wicHJlSW5pdFwiXT09XCJmdW5jdGlvblwiKU1vZHVsZVtcInByZUluaXRcIl09W01vZHVsZVtcInByZUluaXRcIl1dO3doaWxlKE1vZHVsZVtcInByZUluaXRcIl0ubGVuZ3RoPjApe01vZHVsZVtcInByZUluaXRcIl0ucG9wKCkoKX19cnVuKCk7XG5cblxuICByZXR1cm4gV2FzbUJhY2tlbmRNb2R1bGUucmVhZHlcbn1cbik7XG59KSgpO1xuaWYgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JylcbiAgbW9kdWxlLmV4cG9ydHMgPSBXYXNtQmFja2VuZE1vZHVsZTtcbmVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lWydhbWQnXSlcbiAgZGVmaW5lKFtdLCBmdW5jdGlvbigpIHsgcmV0dXJuIFdhc21CYWNrZW5kTW9kdWxlOyB9KTtcbmVsc2UgaWYgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JylcbiAgZXhwb3J0c1tcIldhc21CYWNrZW5kTW9kdWxlXCJdID0gV2FzbUJhY2tlbmRNb2R1bGU7XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5leHBvcnQgY2xhc3MgQWRkTlByb2dyYW0ge1xuICAgIGNvbnN0cnVjdG9yKG91dHB1dFNoYXBlLCBzaGFwZXMpIHtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IFtdO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGU7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IHNoYXBlcy5tYXAoKF8sIGkpID0+IGBUJHtpfWApO1xuICAgICAgICBjb25zdCBzbmlwcGV0cyA9IFtdO1xuICAgICAgICAvLyBHZXQgdGFyZ2V0IGVsZW1lbnRzIGZyb20gZXZlcnkgaW5wdXQgdGVuc29yLlxuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMuZm9yRWFjaCh2YXJpYWJsZSA9PiB7XG4gICAgICAgICAgICBzbmlwcGV0cy5wdXNoKGBmbG9hdCB2JHt2YXJpYWJsZX0gPSBnZXQke3ZhcmlhYmxlfUF0T3V0Q29vcmRzKCk7YCk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIHN1bSBvZiBhbGwgZWxlbWVudHMuXG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbiA9IHRoaXMudmFyaWFibGVOYW1lc1xuICAgICAgICAgICAgLm1hcCh2YXJpYWJsZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYHYke3ZhcmlhYmxlfWA7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbignICsgJyk7XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICR7c25pcHBldHMuam9pbignXFxuICAgICAgICAnKX1cblxuICAgICAgICBmbG9hdCByZXN1bHQgPSAke29wZXJhdGlvbn07XG4gICAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWRkbl9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuZXhwb3J0IGNsYXNzIEFkZE5QYWNrZWRQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3RvcihvdXRwdXRTaGFwZSwgc2hhcGVzKSB7XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBbXTtcbiAgICAgICAgdGhpcy5wYWNrZWRJbnB1dHMgPSB0cnVlO1xuICAgICAgICB0aGlzLnBhY2tlZE91dHB1dCA9IHRydWU7XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gc2hhcGVzLm1hcCgoXywgaSkgPT4gYFQke2l9YCk7XG4gICAgICAgIGNvbnN0IHNuaXBwZXRzID0gW107XG4gICAgICAgIC8vIEdldCB0YXJnZXQgZWxlbWVudHMgZnJvbSBldmVyeSBpbnB1dCB0ZW5zb3IuXG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcy5mb3JFYWNoKHZhcmlhYmxlID0+IHtcbiAgICAgICAgICAgIHNuaXBwZXRzLnB1c2goYHZlYzQgdiR7dmFyaWFibGV9ID0gZ2V0JHt2YXJpYWJsZX1BdE91dENvb3JkcygpO2ApO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBzdW0gb2YgYWxsIGVsZW1lbnRzLlxuICAgICAgICBjb25zdCBvcGVyYXRpb24gPSB0aGlzLnZhcmlhYmxlTmFtZXNcbiAgICAgICAgICAgIC5tYXAodmFyaWFibGUgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGB2JHt2YXJpYWJsZX1gO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmpvaW4oJyArICcpO1xuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke3NuaXBwZXRzLmpvaW4oJ1xcbiAgICAgICAgJyl9XG5cbiAgICAgICAgdmVjNCByZXN1bHQgPSAke29wZXJhdGlvbn07XG4gICAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWRkbl9wYWNrZWRfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmV4cG9ydCBjbGFzcyBBcmdNaW5NYXhQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3RvcihyZWR1Y2VJbmZvLCBvcCwgZmlyc3RQYXNzKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICAgICAgICBjb25zdCB7IHdpbmRvd1NpemUsIGJhdGNoU2l6ZSwgb3V0U2l6ZSB9ID0gcmVkdWNlSW5mbztcbiAgICAgICAgaWYgKCFmaXJzdFBhc3MpIHtcbiAgICAgICAgICAgIHRoaXMudmFyaWFibGVOYW1lcy5wdXNoKCdiZXN0SW5kaWNlc0EnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gW2JhdGNoU2l6ZSwgb3V0U2l6ZV07XG4gICAgICAgIGNvbnN0IGNvbXBPcCA9IChvcCA9PT0gJ21heCcpID8gJz4nIDogJzwnO1xuICAgICAgICBjb25zdCBpbmRleFNuaXBwZXQgPSBmaXJzdFBhc3MgP1xuICAgICAgICAgICAgJ2luT2Zmc2V0ICsgaTsnIDpcbiAgICAgICAgICAgICdyb3VuZChnZXRCZXN0SW5kaWNlc0EoYmF0Y2gsIGluT2Zmc2V0ICsgaSkpOyc7XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWMyIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHNbMF07XG4gICAgICAgIGludCBvdXRJZHggPSBjb29yZHNbMV07XG4gICAgICAgIGludCBpbk9mZnNldCA9IG91dElkeCAqICR7d2luZG93U2l6ZX07XG5cbiAgICAgICAgaW50IGJlc3RJbmRleCA9IGluT2Zmc2V0O1xuICAgICAgICBmbG9hdCBiZXN0VmFsdWUgPSBnZXRBKGJhdGNoLCBiZXN0SW5kZXgpO1xuXG4gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgJHt3aW5kb3dTaXplfTsgaSsrKSB7XG4gICAgICAgICAgaW50IGluSWR4ID0gJHtpbmRleFNuaXBwZXR9O1xuICAgICAgICAgIGZsb2F0IGNhbmRpZGF0ZSA9IGdldEEoYmF0Y2gsIGluSWR4KTtcbiAgICAgICAgICBpZiAoY2FuZGlkYXRlICR7Y29tcE9wfSBiZXN0VmFsdWUpIHtcbiAgICAgICAgICAgIGJlc3RWYWx1ZSA9IGNhbmRpZGF0ZTtcbiAgICAgICAgICAgIGJlc3RJbmRleCA9IGluSWR4O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQoZmxvYXQoYmVzdEluZGV4KSk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hcmdtaW5tYXhfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgZ2V0Q2hhbm5lbHMgfSBmcm9tICcuL3BhY2tpbmdfdXRpbCc7XG5pbXBvcnQgeyBnZXRDb29yZHNEYXRhVHlwZSB9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcbmV4cG9ydCBjbGFzcyBBcmdNaW5NYXhQYWNrZWRQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3RvcihzaGFwZSwgd2luZG93U2l6ZSwgb3AsIGZpcnN0UGFzcykge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgICAgICAgdGhpcy5wYWNrZWRJbnB1dHMgPSB0cnVlO1xuICAgICAgICB0aGlzLnBhY2tlZE91dHB1dCA9IHRydWU7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHNoYXBlLmxlbmd0aCA+IDIsICgpID0+IGBQYWNrZWQgYXJnJHtvcC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArXG4gICAgICAgICAgICBvcC5zbGljZSgxKX0gc3VwcG9ydHMgb25seSBpbnB1dHMgd2l0aCByYW5rIGFib3ZlIDIuYCk7XG4gICAgICAgIGNvbnN0IGluU2l6ZSA9IHNoYXBlW3NoYXBlLmxlbmd0aCAtIDFdO1xuICAgICAgICBjb25zdCBvdXRTaXplID0gTWF0aC5jZWlsKGluU2l6ZSAvIHdpbmRvd1NpemUpO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gc2hhcGUuc2xpY2UoMCwgLTEpO1xuICAgICAgICBpZiAob3V0U2l6ZSA+IDEpIHtcbiAgICAgICAgICAgIHRoaXMub3V0cHV0U2hhcGUucHVzaChvdXRTaXplKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZpcnN0UGFzcykge1xuICAgICAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzLnB1c2goJ2Jlc3RJbmRpY2VzQScpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG91dFNoYXBlID0gdGhpcy5vdXRwdXRTaGFwZTtcbiAgICAgICAgY29uc3QgcmFuayA9IG91dFNoYXBlLmxlbmd0aDtcbiAgICAgICAgY29uc3QgZHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShyYW5rKTtcbiAgICAgICAgY29uc3QgY29vcmRzID0gZ2V0Q2hhbm5lbHMoJ2Nvb3JkcycsIHJhbmspO1xuICAgICAgICBsZXQgc291cmNlTG9jU2V0dXA7XG4gICAgICAgIGxldCBzb3VyY2VSYW5rO1xuICAgICAgICBpZiAob3V0U2l6ZSA9PT0gMSkge1xuICAgICAgICAgICAgc291cmNlUmFuayA9IHJhbmsgKyAxO1xuICAgICAgICAgICAgY29uc3Qgc291cmNlTG9jRFR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShzb3VyY2VSYW5rKTtcbiAgICAgICAgICAgIHNvdXJjZUxvY1NldHVwID0gYFxuICAgICAgICAke3NvdXJjZUxvY0RUeXBlfSBzb3VyY2VMb2NSID0gJHtzb3VyY2VMb2NEVHlwZX0oJHtjb29yZHMuam9pbigpfSwgMCk7XG4gICAgICAgICsrJHtjb29yZHNbcmFuayAtIDFdfTtcbiAgICAgICAgJHtzb3VyY2VMb2NEVHlwZX0gc291cmNlTG9jRyA9ICR7c291cmNlTG9jRFR5cGV9KCR7Y29vcmRzLmpvaW4oKX0sIDApO1xuICAgICAgICArKyR7Y29vcmRzW3JhbmsgLSAyXX07XG4gICAgICAgICR7c291cmNlTG9jRFR5cGV9IHNvdXJjZUxvY0EgPSAke3NvdXJjZUxvY0RUeXBlfSgke2Nvb3Jkcy5qb2luKCl9LCAwKTtcbiAgICAgICAgLS0ke2Nvb3Jkc1tyYW5rIC0gMV19O1xuICAgICAgICAke3NvdXJjZUxvY0RUeXBlfSBzb3VyY2VMb2NCID0gJHtzb3VyY2VMb2NEVHlwZX0oJHtjb29yZHMuam9pbigpfSwgMCk7XG4gICAgICAgIC0tJHtjb29yZHNbcmFuayAtIDJdfTtgO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc291cmNlUmFuayA9IHJhbms7XG4gICAgICAgICAgICBzb3VyY2VMb2NTZXR1cCA9IGBcbiAgICAgICAgJHtkdHlwZX0gc291cmNlTG9jUiA9IGNvb3JkcztcbiAgICAgICAgKyske2Nvb3Jkc1tyYW5rIC0gMV19O1xuICAgICAgICAke2R0eXBlfSBzb3VyY2VMb2NHID0gY29vcmRzO1xuICAgICAgICArKyR7Y29vcmRzW3JhbmsgLSAyXX07XG4gICAgICAgICR7ZHR5cGV9IHNvdXJjZUxvY0EgPSBjb29yZHM7XG4gICAgICAgIC0tJHtjb29yZHNbcmFuayAtIDFdfTtcbiAgICAgICAgJHtkdHlwZX0gc291cmNlTG9jQiA9IGNvb3JkcztcbiAgICAgICAgLS0ke2Nvb3Jkc1tyYW5rIC0gMl19O2A7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2hhbm5lbHMgPSBbJ3gnLCAneScsICd6JywgJ3cnLCAndScsICd2J10uc2xpY2UoMCwgc291cmNlUmFuayk7XG4gICAgICAgIGNvbnN0IGluQ2hhbm5lbCA9ICcuJyArIGNoYW5uZWxzW3NvdXJjZVJhbmsgLSAxXTsgLy8gZS5nLiBcIi5iXCIgZm9yIHJhbmsgMy5cbiAgICAgICAgY29uc3QgaW50Q2hhbm5lbHMgPSBjaGFubmVscy5tYXAoeCA9PiAnaW50ICcgKyB4KTtcbiAgICAgICAgY29uc3Qgc3JjUkNvb3JkcyA9IGdldENoYW5uZWxzKCdzb3VyY2VMb2NSJywgc291cmNlUmFuayAtIDEpLmNvbmNhdCgnaW5JZHgucicpO1xuICAgICAgICBjb25zdCBzcmNHQ29vcmRzID0gZ2V0Q2hhbm5lbHMoJ3NvdXJjZUxvY0cnLCBzb3VyY2VSYW5rIC0gMSkuY29uY2F0KCdpbklkeC5nJyk7XG4gICAgICAgIGNvbnN0IHNyY0JDb29yZHMgPSBnZXRDaGFubmVscygnc291cmNlTG9jQicsIHNvdXJjZVJhbmsgLSAxKS5jb25jYXQoJ2luSWR4LmInKTtcbiAgICAgICAgY29uc3Qgc3JjQUNvb3JkcyA9IGdldENoYW5uZWxzKCdzb3VyY2VMb2NBJywgc291cmNlUmFuayAtIDEpLmNvbmNhdCgnaW5JZHguYScpO1xuICAgICAgICBjb25zdCBjb21wT3AgPSAob3AgPT09ICdtYXgnKSA/ICdncmVhdGVyVGhhbicgOiAnbGVzc1RoYW4nO1xuICAgICAgICBjb25zdCBmZXRjaENhbmRpZGF0ZUlkeCA9IGZpcnN0UGFzcyA/ICcnIDogYFxuICAgICAgICAgIGluSWR4ID0gcm91bmQodmVjNChnZXRCZXN0SW5kaWNlc0FDaGFubmVsKCR7c3JjUkNvb3Jkcy5qb2luKCl9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QmVzdEluZGljZXNBQ2hhbm5lbCgke3NyY0dDb29yZHMuam9pbigpfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEJlc3RJbmRpY2VzQUNoYW5uZWwoJHtzcmNCQ29vcmRzLmpvaW4oKX0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRCZXN0SW5kaWNlc0FDaGFubmVsKCR7c3JjQUNvb3Jkcy5qb2luKCl9KSkpO2A7XG4gICAgICAgIGNvbnN0IGZldGNoVmFsdWUgPSBgdmVjNChcbiAgICAgICAgICAgIGdldEFDaGFubmVsKCR7c3JjUkNvb3Jkcy5qb2luKCl9KSxcbiAgICAgICAgICAgIGhhc05leHRDb2wgPyBnZXRBQ2hhbm5lbCgke3NyY0dDb29yZHMuam9pbigpfSkgOiAwLixcbiAgICAgICAgICAgIGhhc05leHRSb3cgPyBnZXRBQ2hhbm5lbCgke3NyY0JDb29yZHMuam9pbigpfSkgOiAwLixcbiAgICAgICAgICAgIGhhc05leHRSb3cgJiYgaGFzTmV4dENvbCA/IGdldEFDaGFubmVsKCR7c3JjQUNvb3Jkcy5qb2luKCl9KSA6IDAuKWA7XG4gICAgICAgIGNvbnN0IGdldEJlc3RJbmRpY2VzQUNoYW5uZWxTbmlwcGV0ID0gZmlyc3RQYXNzID8gJycgOiBgXG4gICAgICBmbG9hdCBnZXRCZXN0SW5kaWNlc0FDaGFubmVsKCR7aW50Q2hhbm5lbHMuam9pbigpfSkge1xuICAgICAgICByZXR1cm4gZ2V0Q2hhbm5lbChnZXRCZXN0SW5kaWNlc0EoJHtjaGFubmVscy5qb2luKCl9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoJHtjaGFubmVscy5zbGljZSgtMikuam9pbigpfSkpO1xuICAgICAgfWA7XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBmbG9hdCBnZXRBQ2hhbm5lbCgke2ludENoYW5uZWxzLmpvaW4oKX0pIHtcbiAgICAgICAgcmV0dXJuIGdldENoYW5uZWwoZ2V0QSgke2NoYW5uZWxzLmpvaW4oKX0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoJHtjaGFubmVscy5zbGljZSgtMikuam9pbigpfSkpO1xuICAgICAgfVxuICAgICAgJHtnZXRCZXN0SW5kaWNlc0FDaGFubmVsU25pcHBldH1cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgJHtkdHlwZX0gY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGJvb2wgaGFzTmV4dENvbCA9ICR7Y29vcmRzW3JhbmsgLSAxXX0gPCAke291dFNoYXBlW3JhbmsgLSAxXSAtIDF9O1xuICAgICAgICBib29sIGhhc05leHRSb3cgPSAke2Nvb3Jkc1tyYW5rIC0gMl19IDwgJHtvdXRTaGFwZVtyYW5rIC0gMl0gLSAxfTtcbiAgICAgICAgJHtzb3VyY2VMb2NTZXR1cH1cbiAgICAgICAgaXZlYzQgc3JjSWR4ID0gaXZlYzQoc291cmNlTG9jUiR7aW5DaGFubmVsfSwgc291cmNlTG9jRyR7aW5DaGFubmVsfSxcbiAgICAgICAgICBzb3VyY2VMb2NCJHtpbkNoYW5uZWx9LCBzb3VyY2VMb2NBJHtpbkNoYW5uZWx9KSAqICR7d2luZG93U2l6ZX07XG4gICAgICAgIGl2ZWM0IGluSWR4ID0gc3JjSWR4O1xuICAgICAgICB2ZWM0IGJlc3RJbmRleCA9IHZlYzQoaW5JZHgpO1xuICAgICAgICB2ZWM0IGJlc3RWYWx1ZSA9ICR7ZmV0Y2hWYWx1ZX07XG5cbiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAke3dpbmRvd1NpemV9OyBpKyspIHtcbiAgICAgICAgICBpbklkeCA9IHNyY0lkeDtcbiAgICAgICAgICAke2ZldGNoQ2FuZGlkYXRlSWR4fVxuICAgICAgICAgIHZlYzQgY2FuZGlkYXRlID0gJHtmZXRjaFZhbHVlfTtcbiAgICAgICAgICBidmVjNCBuYW4gPSBpc25hbihjYW5kaWRhdGUpO1xuICAgICAgICAgIGJ2ZWM0IHJlcGxhY2UgPSBidmVjNChcbiAgICAgICAgICAgIHZlYzQoJHtjb21wT3B9KGNhbmRpZGF0ZSwgYmVzdFZhbHVlKSkgKiAodmVjNCgxLjApIC0gdmVjNChuYW4pKSk7XG5cbiAgICAgICAgICBiZXN0VmFsdWUgPSB2ZWM0KHJlcGxhY2UueCAgPyBjYW5kaWRhdGUueCA6IGJlc3RWYWx1ZS54LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZS55ICA/IGNhbmRpZGF0ZS55IDogYmVzdFZhbHVlLnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlLnogID8gY2FuZGlkYXRlLnogOiBiZXN0VmFsdWUueixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2UudyAgPyBjYW5kaWRhdGUudyA6IGJlc3RWYWx1ZS53KTtcbiAgICAgICAgICBiZXN0SW5kZXggPSBtaXgoYmVzdEluZGV4LCB2ZWM0KGluSWR4KSwgdmVjNChyZXBsYWNlKSk7XG4gICAgICAgICAgc3JjSWR4Kys7XG4gICAgICAgIH1cbiAgICAgICAgc2V0T3V0cHV0KGJlc3RJbmRleCk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hcmdtaW5tYXhfcGFja2VkX2dwdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5leHBvcnQgY2xhc3MgQXZnUG9vbDJEQmFja3Byb3BQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3Rvcihjb252SW5mbykge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ2R5J107XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5pblNoYXBlO1xuICAgICAgICBjb25zdCBmaWx0ZXJIZWlnaHQgPSBjb252SW5mby5maWx0ZXJIZWlnaHQ7XG4gICAgICAgIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG4gICAgICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICAgICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICAgICAgY29uc3QgZGlsYXRpb25IZWlnaHQgPSBjb252SW5mby5kaWxhdGlvbkhlaWdodDtcbiAgICAgICAgY29uc3QgZGlsYXRpb25XaWR0aCA9IGNvbnZJbmZvLmRpbGF0aW9uV2lkdGg7XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckhlaWdodDtcbiAgICAgICAgY29uc3QgZWZmZWN0aXZlRmlsdGVyV2lkdGggPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJXaWR0aDtcbiAgICAgICAgY29uc3QgcGFkVG9wID0gZWZmZWN0aXZlRmlsdGVySGVpZ2h0IC0gMSAtIGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgICAgICBjb25zdCBwYWRMZWZ0ID0gZWZmZWN0aXZlRmlsdGVyV2lkdGggLSAxIC0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgICAgICBjb25zdCBhdmdNdWx0aXBsaWVyID0gMSAvIChmaWx0ZXJIZWlnaHQgKiBmaWx0ZXJXaWR0aCk7XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCBpdmVjMiBwYWRzID0gaXZlYzIoJHtwYWRUb3B9LCAke3BhZExlZnR9KTtcbiAgICAgIGNvbnN0IGZsb2F0IGF2Z011bHRpcGxpZXIgPSBmbG9hdCgke2F2Z011bHRpcGxpZXJ9KTtcblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGIgPSBjb29yZHNbMF07XG4gICAgICAgIGludCBkID0gY29vcmRzWzNdO1xuXG4gICAgICAgIGl2ZWMyIGR5UkNDb3JuZXIgPSBjb29yZHMueXogLSBwYWRzO1xuICAgICAgICBpbnQgZHlSQ29ybmVyID0gZHlSQ0Nvcm5lci54O1xuICAgICAgICBpbnQgZHlDQ29ybmVyID0gZHlSQ0Nvcm5lci55O1xuXG4gICAgICAgIC8vIENvbnZvbHZlIGR5KD8sID8sIGQpIHdpdGggcG9zIG1hc2soOiwgOiwgZCkgdG8gZ2V0IGR4KHhSLCB4QywgZCkuXG4gICAgICAgIC8vID8gPSB0byBiZSBkZXRlcm1pbmVkLiA6ID0gYWNyb3NzIGFsbCB2YWx1ZXMgaW4gdGhhdCBheGlzLlxuICAgICAgICBmbG9hdCBkb3RQcm9kID0gMC4wO1xuICAgICAgICBmb3IgKGludCB3UiA9IDA7IHdSIDwgJHtlZmZlY3RpdmVGaWx0ZXJIZWlnaHR9O1xuICAgICAgICAgICAgd1IgKz0gJHtkaWxhdGlvbkhlaWdodH0pIHtcbiAgICAgICAgICBmbG9hdCBkeVIgPSBmbG9hdChkeVJDb3JuZXIgKyB3UikgLyAke3N0cmlkZUhlaWdodH0uMDtcblxuICAgICAgICAgIGlmIChkeVIgPCAwLjAgfHwgZHlSID49ICR7Y29udkluZm8ub3V0SGVpZ2h0fS4wIHx8IGZyYWN0KGR5UikgPiAwLjApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpbnQgaWR5UiA9IGludChkeVIpO1xuXG4gICAgICAgICAgZm9yIChpbnQgd0MgPSAwOyB3QyA8ICR7ZWZmZWN0aXZlRmlsdGVyV2lkdGh9O1xuICAgICAgICAgICAgd0MrPSAke2RpbGF0aW9uV2lkdGh9KSB7XG4gICAgICAgICAgICBmbG9hdCBkeUMgPSBmbG9hdChkeUNDb3JuZXIgKyB3QykgLyAke3N0cmlkZVdpZHRofS4wO1xuXG4gICAgICAgICAgICBpZiAoZHlDIDwgMC4wIHx8IGR5QyA+PSAke2NvbnZJbmZvLm91dFdpZHRofS4wIHx8XG4gICAgICAgICAgICAgICAgZnJhY3QoZHlDKSA+IDAuMCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGludCBpZHlDID0gaW50KGR5Qyk7XG5cbiAgICAgICAgICAgIGZsb2F0IGR5VmFsdWUgPSBnZXREeShiLCBpZHlSLCBpZHlDLCBkKTtcblxuICAgICAgICAgICAgZG90UHJvZCArPSBkeVZhbHVlICogYXZnTXVsdGlwbGllcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0T3V0cHV0KGRvdFByb2QpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEF2Z1Bvb2wzREJhY2twcm9wUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoY29udkluZm8pIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWydkeSddO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gY29udkluZm8uaW5TaGFwZTtcbiAgICAgICAgY29uc3QgZmlsdGVyRGVwdGggPSBjb252SW5mby5maWx0ZXJEZXB0aDtcbiAgICAgICAgY29uc3QgZmlsdGVySGVpZ2h0ID0gY29udkluZm8uZmlsdGVySGVpZ2h0O1xuICAgICAgICBjb25zdCBmaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmZpbHRlcldpZHRoO1xuICAgICAgICBjb25zdCBzdHJpZGVEZXB0aCA9IGNvbnZJbmZvLnN0cmlkZURlcHRoO1xuICAgICAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgICAgIGNvbnN0IGRpbGF0aW9uRGVwdGggPSBjb252SW5mby5kaWxhdGlvbkRlcHRoO1xuICAgICAgICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICAgICAgICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgICAgICAgY29uc3QgZWZmZWN0aXZlRmlsdGVyRGVwdGggPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJEZXB0aDtcbiAgICAgICAgY29uc3QgZWZmZWN0aXZlRmlsdGVySGVpZ2h0ID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVySGVpZ2h0O1xuICAgICAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoO1xuICAgICAgICBjb25zdCBwYWRGcm9udCA9IGVmZmVjdGl2ZUZpbHRlckRlcHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8uZnJvbnQ7XG4gICAgICAgIGNvbnN0IHBhZFRvcCA9IGVmZmVjdGl2ZUZpbHRlckhlaWdodCAtIDEgLSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICAgICAgY29uc3QgcGFkTGVmdCA9IGVmZmVjdGl2ZUZpbHRlcldpZHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICAgICAgY29uc3QgYXZnTXVsdGlwbGllciA9IDEgLyAoZmlsdGVyRGVwdGggKiBmaWx0ZXJIZWlnaHQgKiBmaWx0ZXJXaWR0aCk7XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCBpdmVjMyBwYWRzID0gaXZlYzMoJHtwYWRGcm9udH0sICR7cGFkVG9wfSwgJHtwYWRMZWZ0fSk7XG4gICAgICBjb25zdCBmbG9hdCBhdmdNdWx0aXBsaWVyID0gZmxvYXQoJHthdmdNdWx0aXBsaWVyfSk7XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzUgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiYXRjaCA9IGNvb3Jkcy54O1xuICAgICAgICBpbnQgY2ggPSBjb29yZHMudTtcblxuICAgICAgICBpdmVjMyBkeUNvcm5lciA9IGl2ZWMzKGNvb3Jkcy55LCBjb29yZHMueiwgY29vcmRzLncpIC0gcGFkcztcbiAgICAgICAgaW50IGR5RENvcm5lciA9IGR5Q29ybmVyLng7XG4gICAgICAgIGludCBkeVJDb3JuZXIgPSBkeUNvcm5lci55O1xuICAgICAgICBpbnQgZHlDQ29ybmVyID0gZHlDb3JuZXIuejtcblxuICAgICAgICAvLyBDb252b2x2ZSBkeSg/LCA/LCA/LCBkKSB3aXRoIHBvcyBtYXNrKDosIDosIDosIGNoKSB0byBnZXRcbiAgICAgICAgLy8gZHgoeEQsIHhSLCB4QywgY2gpLlxuICAgICAgICAvLyA/ID0gdG8gYmUgZGV0ZXJtaW5lZC4gOiA9IGFjcm9zcyBhbGwgdmFsdWVzIGluIHRoYXQgYXhpcy5cbiAgICAgICAgZmxvYXQgZG90UHJvZCA9IDAuMDtcblxuICAgICAgICBmb3IgKGludCB3RCA9IDA7IHdEIDwgJHtlZmZlY3RpdmVGaWx0ZXJEZXB0aH07XG4gICAgICAgICAgICB3RCArPSAke2RpbGF0aW9uRGVwdGh9KSB7XG4gICAgICAgICAgZmxvYXQgZHlEID0gZmxvYXQoZHlEQ29ybmVyICsgd0QpIC8gJHtzdHJpZGVEZXB0aH0uMDtcblxuICAgICAgICAgIGlmIChkeUQgPCAwLjAgfHwgZHlEID49ICR7Y29udkluZm8ub3V0RGVwdGh9LjAgfHwgZnJhY3QoZHlEKSA+IDAuMCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGludCBpZHlEID0gaW50KGR5RCk7XG5cbiAgICAgICAgICBmb3IgKGludCB3UiA9IDA7IHdSIDwgJHtlZmZlY3RpdmVGaWx0ZXJIZWlnaHR9O1xuICAgICAgICAgICAgICB3UiArPSAke2RpbGF0aW9uSGVpZ2h0fSkge1xuICAgICAgICAgICAgZmxvYXQgZHlSID0gZmxvYXQoZHlSQ29ybmVyICsgd1IpIC8gJHtzdHJpZGVIZWlnaHR9LjA7XG5cbiAgICAgICAgICAgIGlmIChkeVIgPCAwLjAgfHwgZHlSID49ICR7Y29udkluZm8ub3V0SGVpZ2h0fS4wIHx8XG4gICAgICAgICAgICAgICAgZnJhY3QoZHlSKSA+IDAuMCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGludCBpZHlSID0gaW50KGR5Uik7XG5cbiAgICAgICAgICAgIGZvciAoaW50IHdDID0gMDsgd0MgPCAke2VmZmVjdGl2ZUZpbHRlcldpZHRofTtcbiAgICAgICAgICAgICAgICB3QyArPSAke2RpbGF0aW9uV2lkdGh9KSB7XG4gICAgICAgICAgICAgIGZsb2F0IGR5QyA9IGZsb2F0KGR5Q0Nvcm5lciArIHdDKSAvICR7c3RyaWRlV2lkdGh9LjA7XG5cbiAgICAgICAgICAgICAgaWYgKGR5QyA8IDAuMCB8fCBkeUMgPj0gJHtjb252SW5mby5vdXRXaWR0aH0uMCB8fFxuICAgICAgICAgICAgICAgICAgZnJhY3QoZHlDKSA+IDAuMCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGludCBpZHlDID0gaW50KGR5Qyk7XG5cbiAgICAgICAgICAgICAgZmxvYXQgZHlWYWx1ZSA9IGdldER5KGJhdGNoLCBpZHlELCBpZHlSLCBpZHlDLCBjaCk7XG5cbiAgICAgICAgICAgICAgZG90UHJvZCArPSBkeVZhbHVlICogYXZnTXVsdGlwbGllcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0T3V0cHV0KGRvdFByb2QpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXZnX3Bvb2xfYmFja3Byb3BfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8vIEltcG9ydCB3ZWJnbCBmbGFncy5cbmltcG9ydCAnLi9mbGFnc193ZWJnbCc7XG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIGJ1ZmZlciwgRGF0YVN0b3JhZ2UsIGVuZ2luZSwgZW52LCBrZXJuZWxfaW1wbHMsIEtlcm5lbEJhY2tlbmQsIHNjYWxhciwgdGlkeSwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBnZXRXZWJHTENvbnRleHQgfSBmcm9tICcuL2NhbnZhc191dGlsJztcbmltcG9ydCB7IERlY29kZU1hdHJpeFByb2dyYW0gfSBmcm9tICcuL2RlY29kZV9tYXRyaXhfZ3B1JztcbmltcG9ydCB7IERlY29kZU1hdHJpeFBhY2tlZFByb2dyYW0gfSBmcm9tICcuL2RlY29kZV9tYXRyaXhfcGFja2VkX2dwdSc7XG5pbXBvcnQgeyBFbmNvZGVGbG9hdFByb2dyYW0gfSBmcm9tICcuL2VuY29kZV9mbG9hdF9ncHUnO1xuaW1wb3J0IHsgRW5jb2RlRmxvYXRQYWNrZWRQcm9ncmFtIH0gZnJvbSAnLi9lbmNvZGVfZmxvYXRfcGFja2VkX2dwdSc7XG5pbXBvcnQgeyBFbmNvZGVNYXRyaXhQcm9ncmFtIH0gZnJvbSAnLi9lbmNvZGVfbWF0cml4X2dwdSc7XG5pbXBvcnQgeyBFbmNvZGVNYXRyaXhQYWNrZWRQcm9ncmFtIH0gZnJvbSAnLi9lbmNvZGVfbWF0cml4X3BhY2tlZF9ncHUnO1xuaW1wb3J0IHsgR1BHUFVDb250ZXh0IH0gZnJvbSAnLi9ncGdwdV9jb250ZXh0JztcbmltcG9ydCAqIGFzIGdwZ3B1X21hdGggZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7IHNpbXBsZUFic0ltcGxDUFUgfSBmcm9tICcuL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuaW1wb3J0IHsgUGFja1Byb2dyYW0gfSBmcm9tICcuL3BhY2tfZ3B1JztcbmltcG9ydCB7IFJlc2hhcGVQYWNrZWRQcm9ncmFtIH0gZnJvbSAnLi9yZXNoYXBlX3BhY2tlZF9ncHUnO1xuaW1wb3J0ICogYXMgdGV4X3V0aWwgZnJvbSAnLi90ZXhfdXRpbCc7XG5pbXBvcnQgeyBUZXh0dXJlVXNhZ2UgfSBmcm9tICcuL3RleF91dGlsJztcbmltcG9ydCB7IFRleHR1cmVNYW5hZ2VyIH0gZnJvbSAnLi90ZXh0dXJlX21hbmFnZXInO1xuaW1wb3J0ICogYXMgdW5hcnlfb3AgZnJvbSAnLi91bmFyeW9wX2dwdSc7XG5pbXBvcnQgeyBVbmFyeU9wUHJvZ3JhbSB9IGZyb20gJy4vdW5hcnlvcF9ncHUnO1xuaW1wb3J0IHsgVW5hcnlPcFBhY2tlZFByb2dyYW0gfSBmcm9tICcuL3VuYXJ5b3BfcGFja2VkX2dwdSc7XG5pbXBvcnQgeyBVbnBhY2tQcm9ncmFtIH0gZnJvbSAnLi91bnBhY2tfZ3B1JztcbmltcG9ydCAqIGFzIHdlYmdsX3V0aWwgZnJvbSAnLi93ZWJnbF91dGlsJztcbmNvbnN0IHdoZXJlSW1wbCA9IGtlcm5lbF9pbXBscy53aGVyZUltcGw7XG5leHBvcnQgY29uc3QgRVBTSUxPTl9GTE9BVDMyID0gMWUtNztcbmV4cG9ydCBjb25zdCBFUFNJTE9OX0ZMT0FUMTYgPSAxZS00O1xuY29uc3QgYmluYXJ5Q2FjaGVzID0ge307XG5leHBvcnQgZnVuY3Rpb24gZ2V0QmluYXJ5Q2FjaGUod2ViR0xWZXJzaW9uKSB7XG4gICAgaWYgKHdlYkdMVmVyc2lvbiBpbiBiaW5hcnlDYWNoZXMpIHtcbiAgICAgICAgcmV0dXJuIGJpbmFyeUNhY2hlc1t3ZWJHTFZlcnNpb25dO1xuICAgIH1cbiAgICBiaW5hcnlDYWNoZXNbd2ViR0xWZXJzaW9uXSA9IHt9O1xuICAgIHJldHVybiBiaW5hcnlDYWNoZXNbd2ViR0xWZXJzaW9uXTtcbn1cbi8vIEVtcGlyaWNhbGx5IGRldGVybWluZWQgY29uc3RhbnQgdXNlZCB0byBkZXRlcm1pbmUgc2l6ZSB0aHJlc2hvbGQgZm9yIGhhbmRpbmdcbi8vIG9mZiBleGVjdXRpb24gdG8gdGhlIENQVS5cbmNvbnN0IENQVV9IQU5ET0ZGX1NJWkVfVEhSRVNIT0xEID0gZW52KCkuZ2V0TnVtYmVyKCdDUFVfSEFORE9GRl9TSVpFX1RIUkVTSE9MRCcpO1xuLy8gRW1waXJpY2FsbHkgZGV0ZXJtaW5lZCBjb25zdGFudCB1c2VkIHRvIGRlY2lkZSB0aGUgbnVtYmVyIG9mIE1CIG9uIEdQVVxuLy8gYmVmb3JlIHdlIHdhcm4gYWJvdXQgaGlnaCBtZW1vcnkgdXNlLiBUaGUgTUIgYXJlIHRoaXMgY29uc3RhbnQgKiBzY3JlZW4gYXJlYVxuLy8gKiBkcGkgLyAxMDI0IC8gMTAyNC5cbmNvbnN0IEJFRk9SRV9QQUdJTkdfQ09OU1RBTlQgPSA2MDA7XG5mdW5jdGlvbiBudW1NQkJlZm9yZVdhcm5pbmcoKSB7XG4gICAgaWYgKGVudigpLmdsb2JhbC5zY3JlZW4gPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gMTAyNDsgLy8gMSBHQi5cbiAgICB9XG4gICAgcmV0dXJuIChlbnYoKS5nbG9iYWwuc2NyZWVuLmhlaWdodCAqIGVudigpLmdsb2JhbC5zY3JlZW4ud2lkdGggKlxuICAgICAgICB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbykgKlxuICAgICAgICBCRUZPUkVfUEFHSU5HX0NPTlNUQU5UIC8gMTAyNCAvIDEwMjQ7XG59XG5leHBvcnQgY2xhc3MgTWF0aEJhY2tlbmRXZWJHTCBleHRlbmRzIEtlcm5lbEJhY2tlbmQge1xuICAgIGNvbnN0cnVjdG9yKGdwZ3B1KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIC8vIE1hcHMgZGF0YSBpZHMgdGhhdCBoYXZlIGEgcGVuZGluZyByZWFkIG9wZXJhdGlvbiwgdG8gbGlzdCBvZiBzdWJzY3JpYmVycy5cbiAgICAgICAgdGhpcy5wZW5kaW5nUmVhZCA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIC8vIExpc3Qgb2YgZGF0YSBpZHMgdGhhdCBhcmUgc2NoZWR1bGVkIGZvciBkaXNwb3NhbCwgYnV0IGFyZSB3YWl0aW5nIG9uIGFcbiAgICAgICAgLy8gcGVuZGluZyByZWFkIG9wZXJhdGlvbi5cbiAgICAgICAgdGhpcy5wZW5kaW5nRGlzcG9zYWwgPSBuZXcgV2Vha1NldCgpO1xuICAgICAgICAvLyBVc2VkIHRvIGNvdW50IHRoZSBudW1iZXIgb2YgJ3NoYWxsb3cnIHNsaWNlZCB0ZW5zb3JzIHRoYXQgcG9pbnQgdG8gdGhlXG4gICAgICAgIC8vIHNhbWUgZGF0YSBpZC5cbiAgICAgICAgdGhpcy5kYXRhUmVmQ291bnQgPSBuZXcgV2Vha01hcCgpO1xuICAgICAgICB0aGlzLm51bUJ5dGVzSW5HUFUgPSAwO1xuICAgICAgICAvLyBBY2N1bXVsYXRlZCB0aW1lIHNwZW50IChpbmNsdWRpbmcgYmxvY2tpbmcpIGluIHVwbG9hZGluZyBkYXRhIHRvIHdlYmdsLlxuICAgICAgICB0aGlzLnVwbG9hZFdhaXRNcyA9IDA7XG4gICAgICAgIC8vIEFjY3VtdWxhdGVkIHRpbWUgc3BlbnQgKGluY2x1ZGluZyBibG9ja2luZyBpbiBkb3dubG9hZGluZyBkYXRhIGZyb20gd2ViZ2wuXG4gICAgICAgIHRoaXMuZG93bmxvYWRXYWl0TXMgPSAwO1xuICAgICAgICAvLyByZWNvcmQgdGhlIGxhc3QgbWFudWFsIEdMIEZsdXNoIHRpbWUuXG4gICAgICAgIHRoaXMubGFzdEdsRmx1c2hUaW1lID0gMDtcbiAgICAgICAgdGhpcy53YXJuZWRBYm91dE1lbW9yeSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBlbmRpbmdEZWxldGVzID0gMDtcbiAgICAgICAgdGhpcy5kaXNwb3NlZCA9IGZhbHNlO1xuICAgICAgICBpZiAoIWVudigpLmdldEJvb2woJ0hBU19XRUJHTCcpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlYkdMIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBkZXZpY2UnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ3BncHUgPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgZ2wgPSBnZXRXZWJHTENvbnRleHQoZW52KCkuZ2V0TnVtYmVyKCdXRUJHTF9WRVJTSU9OJykpO1xuICAgICAgICAgICAgdGhpcy5iaW5hcnlDYWNoZSA9IGdldEJpbmFyeUNhY2hlKGVudigpLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpKTtcbiAgICAgICAgICAgIHRoaXMuZ3BncHUgPSBuZXcgR1BHUFVDb250ZXh0KGdsKTtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzID0gZ2wuY2FudmFzO1xuICAgICAgICAgICAgdGhpcy5ncGdwdUNyZWF0ZWRMb2NhbGx5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZ3BncHUgPSBncGdwdTtcbiAgICAgICAgICAgIHRoaXMuYmluYXJ5Q2FjaGUgPSB7fTtcbiAgICAgICAgICAgIHRoaXMuZ3BncHVDcmVhdGVkTG9jYWxseSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5jYW52YXMgPSBncGdwdS5nbC5jYW52YXM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50ZXh0dXJlTWFuYWdlciA9IG5ldyBUZXh0dXJlTWFuYWdlcih0aGlzLmdwZ3B1KTtcbiAgICAgICAgdGhpcy5udW1NQkJlZm9yZVdhcm5pbmcgPSBudW1NQkJlZm9yZVdhcm5pbmcoKTtcbiAgICAgICAgdGhpcy50ZXhEYXRhID0gbmV3IERhdGFTdG9yYWdlKHRoaXMsIGVuZ2luZSgpKTtcbiAgICB9XG4gICAgbmV4dERhdGFJZCgpIHtcbiAgICAgICAgcmV0dXJuIE1hdGhCYWNrZW5kV2ViR0wubmV4dERhdGFJZCsrO1xuICAgIH1cbiAgICBudW1EYXRhSWRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50ZXhEYXRhLm51bURhdGFJZHMoKSAtIHRoaXMucGVuZGluZ0RlbGV0ZXM7XG4gICAgfVxuICAgIHdyaXRlKHZhbHVlcywgc2hhcGUsIGR0eXBlKSB7XG4gICAgICAgIGlmIChlbnYoKS5nZXRCb29sKCdXRUJHTF9DSEVDS19OVU1FUklDQUxfUFJPQkxFTVMnKSB8fFxuICAgICAgICAgICAgZW52KCkuZ2V0Qm9vbCgnREVCVUcnKSkge1xuICAgICAgICAgICAgdGhpcy5jaGVja051bWVyaWNhbFByb2JsZW1zKHZhbHVlcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGR0eXBlID09PSAnY29tcGxleDY0JyAmJiB2YWx1ZXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgd3JpdGUgdG8gYSBjb21wbGV4NjQgZHR5cGUuIGAgK1xuICAgICAgICAgICAgICAgIGBQbGVhc2UgdXNlIHRmLmNvbXBsZXgocmVhbCwgaW1hZykuYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YUlkID0geyBpZDogdGhpcy5uZXh0RGF0YUlkKCkgfTtcbiAgICAgICAgdGhpcy50ZXhEYXRhLnNldChkYXRhSWQsIHsgc2hhcGUsIGR0eXBlLCB2YWx1ZXMsIHVzYWdlOiBUZXh0dXJlVXNhZ2UuVVBMT0FELCByZWZDb3VudDogMSB9KTtcbiAgICAgICAgcmV0dXJuIGRhdGFJZDtcbiAgICB9XG4gICAgLyoqIFJldHVybiByZWZDb3VudCBvZiBhIGBUZW5zb3JEYXRhYC4gKi9cbiAgICByZWZDb3VudChkYXRhSWQpIHtcbiAgICAgICAgaWYgKHRoaXMudGV4RGF0YS5oYXMoZGF0YUlkKSkge1xuICAgICAgICAgICAgY29uc3QgdGVuc29yRGF0YSA9IHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKTtcbiAgICAgICAgICAgIHJldHVybiB0ZW5zb3JEYXRhLnJlZkNvdW50O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICAvKiogSW5jcmVhc2UgcmVmQ291bnQgb2YgYSBgVGV4dHVyZURhdGFgLiAqL1xuICAgIGluY1JlZihkYXRhSWQpIHtcbiAgICAgICAgY29uc3QgdGV4RGF0YSA9IHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKTtcbiAgICAgICAgdGV4RGF0YS5yZWZDb3VudCsrO1xuICAgIH1cbiAgICAvKiogRGVjcmVhc2UgcmVmQ291bnQgb2YgYSBgVGV4dHVyZURhdGFgLiAqL1xuICAgIGRlY1JlZihkYXRhSWQpIHtcbiAgICAgICAgaWYgKHRoaXMudGV4RGF0YS5oYXMoZGF0YUlkKSkge1xuICAgICAgICAgICAgY29uc3QgdGV4RGF0YSA9IHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKTtcbiAgICAgICAgICAgIHRleERhdGEucmVmQ291bnQtLTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBtb3ZlKGRhdGFJZCwgdmFsdWVzLCBzaGFwZSwgZHR5cGUsIHJlZkNvdW50KSB7XG4gICAgICAgIGlmIChlbnYoKS5nZXRCb29sKCdERUJVRycpKSB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrTnVtZXJpY2FsUHJvYmxlbXModmFsdWVzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCB3cml0ZSB0byBhIGNvbXBsZXg2NCBkdHlwZS4gYCArXG4gICAgICAgICAgICAgICAgYFBsZWFzZSB1c2UgdGYuY29tcGxleChyZWFsLCBpbWFnKS5gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRleERhdGEuc2V0KGRhdGFJZCwgeyBzaGFwZSwgZHR5cGUsIHZhbHVlcywgdXNhZ2U6IFRleHR1cmVVc2FnZS5VUExPQUQsIHJlZkNvdW50IH0pO1xuICAgIH1cbiAgICBkaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0ZW5zb3JJbmZvKSB7XG4gICAgICAgIHRoaXMuZGlzcG9zZURhdGEodGVuc29ySW5mby5kYXRhSWQpO1xuICAgIH1cbiAgICByZWFkU3luYyhkYXRhSWQpIHtcbiAgICAgICAgY29uc3QgdGV4RGF0YSA9IHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKTtcbiAgICAgICAgY29uc3QgeyB2YWx1ZXMsIGR0eXBlLCBjb21wbGV4VGVuc29ySW5mb3MsIHNsaWNlLCBzaGFwZSwgaXNQYWNrZWQgfSA9IHRleERhdGE7XG4gICAgICAgIC8vIFRoZSBwcmVzZW5jZSBvZiBgc2xpY2VgIGluZGljYXRlcyB0aGlzIHRlbnNvciBpcyBhIHNoYWxsb3cgc2xpY2Ugb2YgYVxuICAgICAgICAvLyBkaWZmZXJlbnQgdGVuc29yLCBhbmQgaXMgdXNpbmcgdGhhdCBvcmlnaW5hbCB0ZW5zb3IncyB0ZXh0dXJlLiBSdW5cbiAgICAgICAgLy8gYGNsb25lYCBpbiBvcmRlciB0byBjb3B5IHRoYXQgdGV4dHVyZSBhbmQgcmVhZCBmcm9tIGl0LlxuICAgICAgICBpZiAoc2xpY2UgIT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IHByb2dyYW07XG4gICAgICAgICAgICBpZiAoaXNQYWNrZWQpIHtcbiAgICAgICAgICAgICAgICBwcm9ncmFtID0gbmV3IFVuYXJ5T3BQYWNrZWRQcm9ncmFtKHNoYXBlLCB1bmFyeV9vcC5DTE9ORSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwcm9ncmFtID0gbmV3IFVuYXJ5T3BQcm9ncmFtKHNoYXBlLCB1bmFyeV9vcC5DTE9ORSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXMgPSB0aGlzLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeyBkYXRhSWQsIHNoYXBlLCBkdHlwZSB9XSwgZHR5cGUpO1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMucmVhZFN5bmMocmVzLmRhdGFJZCk7XG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlcyk7XG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWVzICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRBbmRDYWNoZU9uQ1BVKGRhdGFJZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzaG91bGRUaW1lUHJvZ3JhbSA9IHRoaXMuYWN0aXZlVGltZXJzICE9IG51bGw7XG4gICAgICAgIGxldCBzdGFydDtcbiAgICAgICAgaWYgKHNob3VsZFRpbWVQcm9ncmFtKSB7XG4gICAgICAgICAgICBzdGFydCA9IHV0aWwubm93KCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlc3VsdDtcbiAgICAgICAgaWYgKGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICAgICAgY29uc3QgcmVhbFZhbHVlcyA9IHRoaXMucmVhZFN5bmMoY29tcGxleFRlbnNvckluZm9zLnJlYWwuZGF0YUlkKTtcbiAgICAgICAgICAgIGNvbnN0IGltYWdWYWx1ZXMgPSB0aGlzLnJlYWRTeW5jKGNvbXBsZXhUZW5zb3JJbmZvcy5pbWFnLmRhdGFJZCk7XG4gICAgICAgICAgICByZXN1bHQgPSBiYWNrZW5kX3V0aWwubWVyZ2VSZWFsQW5kSW1hZ0FycmF5cyhyZWFsVmFsdWVzLCBpbWFnVmFsdWVzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuZ2V0VmFsdWVzRnJvbVRleHR1cmUoZGF0YUlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2hvdWxkVGltZVByb2dyYW0pIHtcbiAgICAgICAgICAgIHRoaXMuZG93bmxvYWRXYWl0TXMgKz0gdXRpbC5ub3coKSAtIHN0YXJ0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRBbmRDYWNoZU9uQ1BVKGRhdGFJZCwgcmVzdWx0KTtcbiAgICB9XG4gICAgYXN5bmMgcmVhZChkYXRhSWQpIHtcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ1JlYWQuaGFzKGRhdGFJZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHN1YnNjcmliZXJzID0gdGhpcy5wZW5kaW5nUmVhZC5nZXQoZGF0YUlkKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHN1YnNjcmliZXJzLnB1c2gocmVzb2x2ZSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRleERhdGEgPSB0aGlzLnRleERhdGEuZ2V0KGRhdGFJZCk7XG4gICAgICAgIGNvbnN0IHsgdmFsdWVzLCBzaGFwZSwgc2xpY2UsIGR0eXBlLCBjb21wbGV4VGVuc29ySW5mb3MsIGlzUGFja2VkIH0gPSB0ZXhEYXRhO1xuICAgICAgICAvLyBUaGUgcHJlc2VuY2Ugb2YgYHNsaWNlYCBpbmRpY2F0ZXMgdGhpcyB0ZW5zb3IgaXMgYSBzaGFsbG93IHNsaWNlIG9mIGFcbiAgICAgICAgLy8gZGlmZmVyZW50IHRlbnNvciwgYW5kIGlzIHVzaW5nIHRoYXQgb3JpZ2luYWwgdGVuc29yJ3MgdGV4dHVyZS4gUnVuXG4gICAgICAgIC8vIGBjbG9uZWAgaW4gb3JkZXIgdG8gY29weSB0aGF0IHRleHR1cmUgYW5kIHJlYWQgZnJvbSBpdC5cbiAgICAgICAgaWYgKHNsaWNlICE9IG51bGwpIHtcbiAgICAgICAgICAgIGxldCBwcm9ncmFtO1xuICAgICAgICAgICAgaWYgKGlzUGFja2VkKSB7XG4gICAgICAgICAgICAgICAgcHJvZ3JhbSA9IG5ldyBVbmFyeU9wUGFja2VkUHJvZ3JhbShzaGFwZSwgdW5hcnlfb3AuQ0xPTkUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcHJvZ3JhbSA9IG5ldyBVbmFyeU9wUHJvZ3JhbShzaGFwZSwgdW5hcnlfb3AuQ0xPTkUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVzID0gdGhpcy5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3sgZGF0YUlkLCBzaGFwZSwgZHR5cGUgfV0sIGR0eXBlKTtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLnJlYWQocmVzLmRhdGFJZCk7XG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlcyk7XG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWVzICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRBbmRDYWNoZU9uQ1BVKGRhdGFJZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFlbnYoKS5nZXRCb29sKCdXRUJHTF9ET1dOTE9BRF9GTE9BVF9FTkFCTEVEJykgJiZcbiAgICAgICAgICAgIGVudigpLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpID09PSAyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHRlbnNvci5kYXRhKCkgd2l0aCBXRUJHTF9ET1dOTE9BRF9GTE9BVF9FTkFCTEVEPWZhbHNlIGFuZCBgICtcbiAgICAgICAgICAgICAgICBgV0VCR0xfVkVSU0lPTj0yIG5vdCB5ZXQgc3VwcG9ydGVkLmApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBidWZmZXIgPSBudWxsO1xuICAgICAgICBsZXQgdG1wRG93bmxvYWRUYXJnZXQ7XG4gICAgICAgIGlmIChkdHlwZSAhPT0gJ2NvbXBsZXg2NCcgJiYgZW52KCkuZ2V0KCdXRUJHTF9CVUZGRVJfU1VQUE9SVEVEJykpIHtcbiAgICAgICAgICAgIC8vIFBvc3NpYmx5IGNvcHkgdGhlIHRleHR1cmUgaW50byBhIGJ1ZmZlciBiZWZvcmUgaW5zZXJ0aW5nIGEgZmVuY2UuXG4gICAgICAgICAgICB0bXBEb3dubG9hZFRhcmdldCA9IHRoaXMuZGVjb2RlKGRhdGFJZCk7XG4gICAgICAgICAgICBjb25zdCB0bXBEYXRhID0gdGhpcy50ZXhEYXRhLmdldCh0bXBEb3dubG9hZFRhcmdldC5kYXRhSWQpO1xuICAgICAgICAgICAgYnVmZmVyID0gdGhpcy5ncGdwdS5jcmVhdGVCdWZmZXJGcm9tVGV4dHVyZSh0bXBEYXRhLnRleHR1cmUsIC4uLnRleF91dGlsLmdldERlbnNlVGV4U2hhcGUoc2hhcGUpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBlbmRpbmdSZWFkLnNldChkYXRhSWQsIFtdKTtcbiAgICAgICAgaWYgKGR0eXBlICE9PSAnY29tcGxleDY0Jykge1xuICAgICAgICAgICAgLy8gQ3JlYXRlIGEgZmVuY2UgYW5kIHdhaXQgZm9yIGl0IHRvIHJlc29sdmUuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmdwZ3B1LmNyZWF0ZUFuZFdhaXRGb3JGZW5jZSgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIERvd25sb2FkIHRoZSB2YWx1ZXMgZnJvbSB0aGUgR1BVLlxuICAgICAgICBsZXQgdmFscztcbiAgICAgICAgaWYgKGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICAgICAgY29uc3QgcHMgPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgdGhpcy5yZWFkKGNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsLmRhdGFJZCksXG4gICAgICAgICAgICAgICAgdGhpcy5yZWFkKGNvbXBsZXhUZW5zb3JJbmZvcy5pbWFnLmRhdGFJZClcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgY29uc3QgcmVhbFZhbHVlcyA9IHBzWzBdO1xuICAgICAgICAgICAgY29uc3QgaW1hZ1ZhbHVlcyA9IHBzWzFdO1xuICAgICAgICAgICAgdmFscyA9IGJhY2tlbmRfdXRpbC5tZXJnZVJlYWxBbmRJbWFnQXJyYXlzKHJlYWxWYWx1ZXMsIGltYWdWYWx1ZXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGJ1ZmZlciA9PSBudWxsKSB7XG4gICAgICAgICAgICB2YWxzID0gdGhpcy5nZXRWYWx1ZXNGcm9tVGV4dHVyZShkYXRhSWQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShzaGFwZSk7XG4gICAgICAgICAgICB2YWxzID0gdGhpcy5ncGdwdS5kb3dubG9hZEZsb2F0MzJNYXRyaXhGcm9tQnVmZmVyKGJ1ZmZlciwgc2l6ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRtcERvd25sb2FkVGFyZ2V0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odG1wRG93bmxvYWRUYXJnZXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChidWZmZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdwZ3B1LmdsO1xuICAgICAgICAgICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmRlbGV0ZUJ1ZmZlcihidWZmZXIpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkVHlwZVZhbHMgPSB0aGlzLmNvbnZlcnRBbmRDYWNoZU9uQ1BVKGRhdGFJZCwgdmFscyk7XG4gICAgICAgIGNvbnN0IHN1YnNjcmliZXJzID0gdGhpcy5wZW5kaW5nUmVhZC5nZXQoZGF0YUlkKTtcbiAgICAgICAgdGhpcy5wZW5kaW5nUmVhZC5kZWxldGUoZGF0YUlkKTtcbiAgICAgICAgLy8gTm90aWZ5IGFsbCBwZW5kaW5nIHJlYWRzLlxuICAgICAgICBzdWJzY3JpYmVycy5mb3JFYWNoKHJlc29sdmUgPT4gcmVzb2x2ZShkVHlwZVZhbHMpKTtcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ0Rpc3Bvc2FsLmhhcyhkYXRhSWQpKSB7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdEaXNwb3NhbC5kZWxldGUoZGF0YUlkKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRpc3Bvc2VEYXRhKGRhdGFJZCkpIHtcbiAgICAgICAgICAgICAgICBlbmdpbmUoKS5yZW1vdmVEYXRhSWQoZGF0YUlkLCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0RlbGV0ZXMtLTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZFR5cGVWYWxzO1xuICAgIH1cbiAgICBidWZmZXJTeW5jKHQpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMucmVhZFN5bmModC5kYXRhSWQpO1xuICAgICAgICBsZXQgZGVjb2RlZERhdGEgPSBkYXRhO1xuICAgICAgICBpZiAodC5kdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8gRGVjb2RlIHRoZSBieXRlcyBpbnRvIHN0cmluZy5cbiAgICAgICAgICAgICAgICBkZWNvZGVkRGF0YSA9IGRhdGEubWFwKGQgPT4gdXRpbC5kZWNvZGVTdHJpbmcoZCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZGVjb2RlIGVuY29kZWQgc3RyaW5nIGJ5dGVzIGludG8gdXRmLTgnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVmZmVyKHQuc2hhcGUsIHQuZHR5cGUsIGRlY29kZWREYXRhKTtcbiAgICB9XG4gICAgY2hlY2tOdW1lcmljYWxQcm9ibGVtcyh2YWx1ZXMpIHtcbiAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG51bSA9IHZhbHVlc1tpXTtcbiAgICAgICAgICAgIGlmICghd2ViZ2xfdXRpbC5jYW5CZVJlcHJlc2VudGVkKG51bSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUkVOREVSX0ZMT0FUMzJfQ0FQQUJMRScpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGBUaGUgdmFsdWUgJHtudW19IGNhbm5vdCBiZSByZXByZXNlbnRlZCB3aXRoIHlvdXIgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgY3VycmVudCBzZXR0aW5ncy4gQ29uc2lkZXIgZW5hYmxpbmcgZmxvYXQzMiByZW5kZXJpbmc6IGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCd0Zi5lbnYoKS5zZXQoJ1dFQkdMX1JFTkRFUl9GTE9BVDMyX0VOQUJMRUQnLCB0cnVlKTsnYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGBUaGUgdmFsdWUgJHtudW19IGNhbm5vdCBiZSByZXByZXNlbnRlZCBvbiB0aGlzIGRldmljZS5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRWYWx1ZXNGcm9tVGV4dHVyZShkYXRhSWQpIHtcbiAgICAgICAgY29uc3QgeyBzaGFwZSwgZHR5cGUsIGlzUGFja2VkIH0gPSB0aGlzLnRleERhdGEuZ2V0KGRhdGFJZCk7XG4gICAgICAgIGNvbnN0IHNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoc2hhcGUpO1xuICAgICAgICBpZiAoZW52KCkuZ2V0Qm9vbCgnV0VCR0xfRE9XTkxPQURfRkxPQVRfRU5BQkxFRCcpKSB7XG4gICAgICAgICAgICBjb25zdCB0bXBUYXJnZXQgPSB0aGlzLmRlY29kZShkYXRhSWQpO1xuICAgICAgICAgICAgY29uc3QgdG1wRGF0YSA9IHRoaXMudGV4RGF0YS5nZXQodG1wVGFyZ2V0LmRhdGFJZCk7XG4gICAgICAgICAgICBjb25zdCB2YWxzID0gdGhpcy5ncGdwdVxuICAgICAgICAgICAgICAgIC5kb3dubG9hZE1hdHJpeEZyb21QYWNrZWRUZXh0dXJlKHRtcERhdGEudGV4dHVyZSwgLi4udGV4X3V0aWwuZ2V0RGVuc2VUZXhTaGFwZShzaGFwZSkpXG4gICAgICAgICAgICAgICAgLnN1YmFycmF5KDAsIHNpemUpO1xuICAgICAgICAgICAgdGhpcy5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0bXBUYXJnZXQpO1xuICAgICAgICAgICAgcmV0dXJuIHZhbHM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2hvdWxkVXNlUGFja2VkUHJvZ3JhbSA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0snKSAmJiBpc1BhY2tlZCA9PT0gdHJ1ZTtcbiAgICAgICAgY29uc3Qgb3V0cHV0U2hhcGUgPSBzaG91bGRVc2VQYWNrZWRQcm9ncmFtID8gd2ViZ2xfdXRpbC5nZXRTaGFwZUFzM0Qoc2hhcGUpIDogc2hhcGU7XG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSBzaG91bGRVc2VQYWNrZWRQcm9ncmFtID9cbiAgICAgICAgICAgIG5ldyBFbmNvZGVGbG9hdFBhY2tlZFByb2dyYW0ob3V0cHV0U2hhcGUpIDpcbiAgICAgICAgICAgIG5ldyBFbmNvZGVGbG9hdFByb2dyYW0ob3V0cHV0U2hhcGUpO1xuICAgICAgICBjb25zdCBvdXRwdXQgPSB0aGlzLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeyBzaGFwZTogb3V0cHV0U2hhcGUsIGR0eXBlLCBkYXRhSWQgfV0sICdmbG9hdDMyJyk7XG4gICAgICAgIGNvbnN0IHRtcERhdGEgPSB0aGlzLnRleERhdGEuZ2V0KG91dHB1dC5kYXRhSWQpO1xuICAgICAgICBjb25zdCB2YWxzID0gdGhpcy5ncGdwdVxuICAgICAgICAgICAgLmRvd25sb2FkQnl0ZUVuY29kZWRGbG9hdE1hdHJpeEZyb21PdXRwdXRUZXh0dXJlKHRtcERhdGEudGV4dHVyZSwgdG1wRGF0YS50ZXhTaGFwZVswXSwgdG1wRGF0YS50ZXhTaGFwZVsxXSlcbiAgICAgICAgICAgIC5zdWJhcnJheSgwLCBzaXplKTtcbiAgICAgICAgdGhpcy5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhvdXRwdXQpO1xuICAgICAgICByZXR1cm4gdmFscztcbiAgICB9XG4gICAgdGltZXJBdmFpbGFibGUoKSB7XG4gICAgICAgIHJldHVybiBlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX0RJU0pPSU5UX1FVRVJZX1RJTUVSX0VYVEVOU0lPTl9SRUxJQUJMRScpID4gMDtcbiAgICB9XG4gICAgYXN5bmMgdGltZShmKSB7XG4gICAgICAgIGNvbnN0IG9sZEFjdGl2ZVRpbWVycyA9IHRoaXMuYWN0aXZlVGltZXJzO1xuICAgICAgICBjb25zdCBuZXdBY3RpdmVUaW1lcnMgPSBbXTtcbiAgICAgICAgbGV0IG91dGVyTW9zdFRpbWUgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMucHJvZ3JhbVRpbWVyc1N0YWNrID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMucHJvZ3JhbVRpbWVyc1N0YWNrID0gbmV3QWN0aXZlVGltZXJzO1xuICAgICAgICAgICAgb3V0ZXJNb3N0VGltZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZVRpbWVycy5wdXNoKG5ld0FjdGl2ZVRpbWVycyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hY3RpdmVUaW1lcnMgPSBuZXdBY3RpdmVUaW1lcnM7XG4gICAgICAgIGYoKTtcbiAgICAgICAgLy8gbmVlZGluZyB0byBzcGxpdCB0aGVzZSB1cCBiZWNhdXNlIHV0aWwuZmxhdHRlbiBvbmx5IGFjY2VwdHMgY2VydGFpbiB0eXBlc1xuICAgICAgICBjb25zdCBmbGF0dGVuZWRBY3RpdmVUaW1lclF1ZXJpZXMgPSB1dGlsLmZsYXR0ZW4odGhpcy5hY3RpdmVUaW1lcnMubWFwKChkKSA9PiBkLnF1ZXJ5KSlcbiAgICAgICAgICAgIC5maWx0ZXIoZCA9PiBkICE9IG51bGwpO1xuICAgICAgICBjb25zdCBmbGF0dGVuZWRBY3RpdmVUaW1lck5hbWVzID0gdXRpbC5mbGF0dGVuKHRoaXMuYWN0aXZlVGltZXJzLm1hcCgoZCkgPT4gZC5uYW1lKSlcbiAgICAgICAgICAgIC5maWx0ZXIoZCA9PiBkICE9IG51bGwpO1xuICAgICAgICB0aGlzLmFjdGl2ZVRpbWVycyA9IG9sZEFjdGl2ZVRpbWVycztcbiAgICAgICAgaWYgKG91dGVyTW9zdFRpbWUpIHtcbiAgICAgICAgICAgIHRoaXMucHJvZ3JhbVRpbWVyc1N0YWNrID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXMgPSB7XG4gICAgICAgICAgICB1cGxvYWRXYWl0TXM6IHRoaXMudXBsb2FkV2FpdE1zLFxuICAgICAgICAgICAgZG93bmxvYWRXYWl0TXM6IHRoaXMuZG93bmxvYWRXYWl0TXMsXG4gICAgICAgICAgICBrZXJuZWxNczogbnVsbCxcbiAgICAgICAgICAgIHdhbGxNczogbnVsbCAvLyB3aWxsIGJlIGZpbGxlZCBieSB0aGUgZW5naW5lXG4gICAgICAgIH07XG4gICAgICAgIGlmIChlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX0RJU0pPSU5UX1FVRVJZX1RJTUVSX0VYVEVOU0lPTl9SRUxJQUJMRScpID4gMCkge1xuICAgICAgICAgICAgY29uc3Qga2VybmVsTXMgPSBhd2FpdCBQcm9taXNlLmFsbChmbGF0dGVuZWRBY3RpdmVUaW1lclF1ZXJpZXMpO1xuICAgICAgICAgICAgcmVzWydrZXJuZWxNcyddID0gdXRpbC5zdW0oa2VybmVsTXMpO1xuICAgICAgICAgICAgcmVzWydnZXRFeHRyYVByb2ZpbGVJbmZvJ10gPSAoKSA9PiBrZXJuZWxNcy5tYXAoKGQsIGkpID0+ICh7IG5hbWU6IGZsYXR0ZW5lZEFjdGl2ZVRpbWVyTmFtZXNbaV0sIG1zOiBkIH0pKVxuICAgICAgICAgICAgICAgIC5tYXAoZCA9PiBgJHtkLm5hbWV9OiAke2QubXN9YClcbiAgICAgICAgICAgICAgICAuam9pbignLCAnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc1sna2VybmVsTXMnXSA9IHtcbiAgICAgICAgICAgICAgICBlcnJvcjogJ1dlYkdMIHF1ZXJ5IHRpbWVycyBhcmUgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGVudmlyb25tZW50LidcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGxvYWRXYWl0TXMgPSAwO1xuICAgICAgICB0aGlzLmRvd25sb2FkV2FpdE1zID0gMDtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgbWVtb3J5KCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdW5yZWxpYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBudW1CeXRlc0luR1BVOiB0aGlzLm51bUJ5dGVzSW5HUFUsXG4gICAgICAgICAgICBudW1CeXRlc0luR1BVQWxsb2NhdGVkOiB0aGlzLnRleHR1cmVNYW5hZ2VyLm51bUJ5dGVzQWxsb2NhdGVkLFxuICAgICAgICAgICAgbnVtQnl0ZXNJbkdQVUZyZWU6IHRoaXMudGV4dHVyZU1hbmFnZXIubnVtQnl0ZXNGcmVlXG4gICAgICAgIH07XG4gICAgfVxuICAgIHN0YXJ0VGltZXIoKSB7XG4gICAgICAgIGlmIChlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX0RJU0pPSU5UX1FVRVJZX1RJTUVSX0VYVEVOU0lPTl9SRUxJQUJMRScpID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ3BncHUuYmVnaW5RdWVyeSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHN0YXJ0TXM6IHV0aWwubm93KCksIGVuZE1zOiBudWxsIH07XG4gICAgfVxuICAgIGVuZFRpbWVyKHF1ZXJ5KSB7XG4gICAgICAgIGlmIChlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX0RJU0pPSU5UX1FVRVJZX1RJTUVSX0VYVEVOU0lPTl9SRUxJQUJMRScpID4gMCkge1xuICAgICAgICAgICAgdGhpcy5ncGdwdS5lbmRRdWVyeSgpO1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5O1xuICAgICAgICB9XG4gICAgICAgIHF1ZXJ5LmVuZE1zID0gdXRpbC5ub3coKTtcbiAgICAgICAgcmV0dXJuIHF1ZXJ5O1xuICAgIH1cbiAgICBhc3luYyBnZXRRdWVyeVRpbWUocXVlcnkpIHtcbiAgICAgICAgaWYgKGVudigpLmdldE51bWJlcignV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1JFTElBQkxFJykgPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ncGdwdS53YWl0Rm9yUXVlcnlBbmRHZXRUaW1lKHF1ZXJ5KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0aW1lclF1ZXJ5ID0gcXVlcnk7XG4gICAgICAgIHJldHVybiB0aW1lclF1ZXJ5LmVuZE1zIC0gdGltZXJRdWVyeS5zdGFydE1zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWNyZWFzZSB0aGUgUmVmQ291bnQgb24gdGhlIGRhdGFJZCBhbmQgZGlzcG9zZSB0aGUgbWVtb3J5IGlmIHRoZSBkYXRhSWRcbiAgICAgKiBoYXMgMCByZWZDb3VudC4gSWYgdGhlcmUgYXJlIHBlbmRpbmcgcmVhZCBvbiB0aGUgZGF0YSwgdGhlIGRpc3Bvc2FsIHdvdWxkXG4gICAgICogYWRkZWQgdG8gdGhlIHBlbmRpbmcgZGVsZXRlIHF1ZXVlLiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZGF0YUlkIGlzIHJlbW92ZWRcbiAgICAgKiBmcm9tIGJhY2tlbmQgb3IgdGhlIGJhY2tlbmQgZG9lcyBub3QgY29udGFpbiB0aGUgZGF0YUlkLCBmYWxzZSBpZiB0aGVcbiAgICAgKiBkYXRhSWQgaXMgbm90IHJlbW92ZWQuIE1lbW9yeSBtYXkgb3IgbWF5IG5vdCBiZSByZWxlYXNlZCBldmVuIHdoZW4gZGF0YUlkXG4gICAgICogaXMgcmVtb3ZlZCwgd2hpY2ggYWxzbyBkZXBlbmRzIG9uIGRhdGFSZWZDb3VudCwgc2VlIGByZWxlYXNlR1BVYC5cbiAgICAgKiBAcGFyYW0gZGF0YUlkXG4gICAgICogQG9hcmFtIGZvcmNlIE9wdGlvbmFsLCByZW1vdmUgdGhlIGRhdGEgcmVnYXJkbGVzcyBvZiByZWZDb3VudFxuICAgICAqL1xuICAgIGRpc3Bvc2VEYXRhKGRhdGFJZCwgZm9yY2UgPSBmYWxzZSkge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nRGlzcG9zYWwuaGFzKGRhdGFJZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBOby1vcCBpZiBhbHJlYWR5IGRpc3Bvc2VkLlxuICAgICAgICBpZiAoIXRoaXMudGV4RGF0YS5oYXMoZGF0YUlkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgZm9yY2UgZmxhZyBpcyBzZXQsIGNoYW5nZSByZWZDb3VudCB0byAwLCB0aGlzIHdvdWxkIGVuc3VyZSBkaXNwb3NhbFxuICAgICAgICAvLyB3aGVuIGFkZGVkIHRvIHRoZSBwZW5kaW5nRGlzcG9zYWwgcXVldWUuIE1lbW9yeSBtYXkgb3IgbWF5IG5vdCBiZVxuICAgICAgICAvLyByZWxlYXNlZCwgd2hpY2ggYWxzbyBkZXBlbmRzIG9uIGRhdGFSZWZDb3VudCwgc2VlIGByZWxlYXNlR1BVYC5cbiAgICAgICAgaWYgKGZvcmNlKSB7XG4gICAgICAgICAgICB0aGlzLnRleERhdGEuZ2V0KGRhdGFJZCkucmVmQ291bnQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50ZXhEYXRhLmdldChkYXRhSWQpLnJlZkNvdW50LS07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmb3JjZSAmJiB0aGlzLnRleERhdGEuZ2V0KGRhdGFJZCkucmVmQ291bnQgPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ1JlYWQuaGFzKGRhdGFJZCkpIHtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0Rpc3Bvc2FsLmFkZChkYXRhSWQpO1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nRGVsZXRlcysrO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVsZWFzZUdQVURhdGEoZGF0YUlkKTtcbiAgICAgICAgY29uc3QgeyBjb21wbGV4VGVuc29ySW5mb3MgfSA9IHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKTtcbiAgICAgICAgaWYgKGNvbXBsZXhUZW5zb3JJbmZvcyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2VEYXRhKGNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsLmRhdGFJZCwgZm9yY2UpO1xuICAgICAgICAgICAgdGhpcy5kaXNwb3NlRGF0YShjb21wbGV4VGVuc29ySW5mb3MuaW1hZy5kYXRhSWQsIGZvcmNlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRleERhdGEuZGVsZXRlKGRhdGFJZCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZWxlYXNlR1BVRGF0YShkYXRhSWQpIHtcbiAgICAgICAgY29uc3QgeyB0ZXh0dXJlLCBkdHlwZSwgdGV4U2hhcGUsIHVzYWdlLCBpc1BhY2tlZCwgc2xpY2UgfSA9IHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKTtcbiAgICAgICAgY29uc3Qga2V5ID0gc2xpY2UgJiYgc2xpY2Uub3JpZ0RhdGFJZCB8fCBkYXRhSWQ7XG4gICAgICAgIGNvbnN0IHJlZkNvdW50ID0gdGhpcy5kYXRhUmVmQ291bnQuZ2V0KGtleSk7XG4gICAgICAgIGlmIChyZWZDb3VudCA+IDEpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVJlZkNvdW50LnNldChrZXksIHJlZkNvdW50IC0gMSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRhdGFSZWZDb3VudC5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgIGlmICh0ZXh0dXJlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm51bUJ5dGVzSW5HUFUgLT0gdGhpcy5jb21wdXRlQnl0ZXModGV4U2hhcGUsIGR0eXBlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRleHR1cmVNYW5hZ2VyLnJlbGVhc2VUZXh0dXJlKHRleHR1cmUsIHRleFNoYXBlLCB1c2FnZSwgaXNQYWNrZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRleERhdGEgPSB0aGlzLnRleERhdGEuZ2V0KGRhdGFJZCk7XG4gICAgICAgIHRleERhdGEudGV4dHVyZSA9IG51bGw7XG4gICAgICAgIHRleERhdGEudGV4U2hhcGUgPSBudWxsO1xuICAgICAgICB0ZXhEYXRhLmlzUGFja2VkID0gZmFsc2U7XG4gICAgICAgIHRleERhdGEuc2xpY2UgPSBudWxsO1xuICAgIH1cbiAgICBnZXRUZXh0dXJlKGRhdGFJZCkge1xuICAgICAgICB0aGlzLnVwbG9hZFRvR1BVKGRhdGFJZCk7XG4gICAgICAgIHJldHVybiB0aGlzLnRleERhdGEuZ2V0KGRhdGFJZCkudGV4dHVyZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpbnRlcm5hbCBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmljIGRhdGEgYnVja2V0LiBVc2VkIGluIHVuaXRcbiAgICAgKiB0ZXN0cy5cbiAgICAgKi9cbiAgICBnZXREYXRhSW5mbyhkYXRhSWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKTtcbiAgICB9XG4gICAgLypcbiAgICBUZXN0cyB3aGV0aGVyIGFsbCB0aGUgaW5wdXRzIHRvIGFuIG9wIGFyZSBzbWFsbCBhbmQgb24gdGhlIENQVS4gVGhpcyBoZXVyaXN0aWNcbiAgICBkZXRlcm1pbmVzIHdoZW4gaXQgd291bGQgYmUgZmFzdGVyIHRvIGV4ZWN1dGUgYSBrZXJuZWwgb24gdGhlIENQVS4gV2ViR0xcbiAgICBrZXJuZWxzIG9wdCBpbnRvIHJ1bm5pbmcgdGhpcyBjaGVjayBhbmQgZm9yd2FyZGluZyB3aGVuIGFwcHJvcHJpYXRlLlxuICAgIFRPRE8oaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGZqcy9pc3N1ZXMvODcyKTogRGV2ZWxvcCBhIG1vcmVcbiAgICBzdXN0YWluYWJsZSBzdHJhdGVneSBmb3Igb3B0aW1pemluZyBiYWNrZW5kIGV4ZWN1dGlvbiBvZiBvcHMuXG4gICAgICovXG4gICAgc2hvdWxkRXhlY3V0ZU9uQ1BVKGlucHV0cywgc2l6ZVRocmVzaG9sZCA9IENQVV9IQU5ET0ZGX1NJWkVfVEhSRVNIT0xEKSB7XG4gICAgICAgIHJldHVybiBlbnYoKS5nZXRCb29sKCdXRUJHTF9DUFVfRk9SV0FSRCcpICYmXG4gICAgICAgICAgICBpbnB1dHMuZXZlcnkoaW5wdXQgPT4gdGhpcy50ZXhEYXRhLmdldChpbnB1dC5kYXRhSWQpLnRleHR1cmUgPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgIHV0aWwuc2l6ZUZyb21TaGFwZShpbnB1dC5zaGFwZSkgPCBzaXplVGhyZXNob2xkKTtcbiAgICB9XG4gICAgZ2V0R1BHUFVDb250ZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ncGdwdTtcbiAgICB9XG4gICAgd2hlcmUoY29uZGl0aW9uKSB7XG4gICAgICAgIGJhY2tlbmRfdXRpbC53YXJuKCd0Zi53aGVyZSgpIGluIHdlYmdsIGxvY2tzIHRoZSBVSSB0aHJlYWQuICcgK1xuICAgICAgICAgICAgJ0NhbGwgdGYud2hlcmVBc3luYygpIGluc3RlYWQnKTtcbiAgICAgICAgY29uc3QgY29uZFZhbHMgPSBjb25kaXRpb24uZGF0YVN5bmMoKTtcbiAgICAgICAgcmV0dXJuIHdoZXJlSW1wbChjb25kaXRpb24uc2hhcGUsIGNvbmRWYWxzKTtcbiAgICB9XG4gICAgcGFja2VkVW5hcnlPcCh4LCBvcCwgZHR5cGUpIHtcbiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBVbmFyeU9wUGFja2VkUHJvZ3JhbSh4LnNoYXBlLCBvcCk7XG4gICAgICAgIGNvbnN0IG91dEluZm8gPSB0aGlzLmNvbXBpbGVBbmRSdW4ocHJvZ3JhbSwgW3hdLCBkdHlwZSk7XG4gICAgICAgIHJldHVybiBlbmdpbmUoKS5tYWtlVGVuc29yRnJvbURhdGFJZChvdXRJbmZvLmRhdGFJZCwgb3V0SW5mby5zaGFwZSwgb3V0SW5mby5kdHlwZSk7XG4gICAgfVxuICAgIC8vIFRPRE8obXNvdWxhbmlsbGUpIHJlbW92ZSB0aGlzIG9uY2UgdGhlIGJhY2tlbmQgaGFzIGJlZW4gbW9kdWxhcml6ZWRcbiAgICAvLyBhIGNvcHkgaXMgbmVlZGVkIGhlcmUgdG8gYnJlYWsgYSBjaXJjdWxhciBkZXBlbmRlbmN5LlxuICAgIC8vIEFsc28gcmVtb3ZlIHRoZSBvcCBmcm9tIHVuYXJ5X29wLlxuICAgIGFicyh4KSB7XG4gICAgICAgIC8vIFRPRE86IGhhbmRsZSBjYXNlcyB3aGVuIHggaXMgY29tcGxleC5cbiAgICAgICAgaWYgKHRoaXMuc2hvdWxkRXhlY3V0ZU9uQ1BVKFt4XSkgJiYgeC5kdHlwZSAhPT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgICAgIGNvbnN0IG91dFZhbHVlcyA9IHNpbXBsZUFic0ltcGxDUFUodGhpcy50ZXhEYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1ha2VPdXRwdXQoeC5zaGFwZSwgeC5kdHlwZSwgb3V0VmFsdWVzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19VTkFSWV9PUEVSQVRJT05TJykpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhY2tlZFVuYXJ5T3AoeCwgdW5hcnlfb3AuQUJTLCB4LmR0eXBlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9ncmFtID0gbmV3IFVuYXJ5T3BQcm9ncmFtKHguc2hhcGUsIHVuYXJ5X29wLkFCUyk7XG4gICAgICAgIGNvbnN0IG91dEluZm8gPSB0aGlzLmNvbXBpbGVBbmRSdW4ocHJvZ3JhbSwgW3hdKTtcbiAgICAgICAgcmV0dXJuIGVuZ2luZSgpLm1ha2VUZW5zb3JGcm9tRGF0YUlkKG91dEluZm8uZGF0YUlkLCBvdXRJbmZvLnNoYXBlLCBvdXRJbmZvLmR0eXBlKTtcbiAgICB9XG4gICAgbWFrZVRlbnNvckluZm8oc2hhcGUsIGR0eXBlLCB2YWx1ZXMpIHtcbiAgICAgICAgbGV0IGRhdGFJZDtcbiAgICAgICAgaWYgKGR0eXBlID09PSAnc3RyaW5nJyAmJiB2YWx1ZXMgIT0gbnVsbCAmJiB2YWx1ZXMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgdXRpbC5pc1N0cmluZyh2YWx1ZXNbMF0pKSB7XG4gICAgICAgICAgICBjb25zdCBlbmNvZGVkVmFsdWVzID0gdmFsdWVzLm1hcChkID0+IHV0aWwuZW5jb2RlU3RyaW5nKGQpKTtcbiAgICAgICAgICAgIGRhdGFJZCA9IHRoaXMud3JpdGUoZW5jb2RlZFZhbHVlcywgc2hhcGUsIGR0eXBlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRhdGFJZCA9IHRoaXMud3JpdGUodmFsdWVzLCBzaGFwZSwgZHR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKS51c2FnZSA9IG51bGw7XG4gICAgICAgIHJldHVybiB7IGRhdGFJZCwgc2hhcGUsIGR0eXBlIH07XG4gICAgfVxuICAgIG1ha2VPdXRwdXQoc2hhcGUsIGR0eXBlLCB2YWx1ZXMpIHtcbiAgICAgICAgY29uc3QgeyBkYXRhSWQgfSA9IHRoaXMubWFrZVRlbnNvckluZm8oc2hhcGUsIGR0eXBlLCB2YWx1ZXMpO1xuICAgICAgICByZXR1cm4gZW5naW5lKCkubWFrZVRlbnNvckZyb21EYXRhSWQoZGF0YUlkLCBzaGFwZSwgZHR5cGUsIHRoaXMpO1xuICAgIH1cbiAgICB1bnBhY2tUZW5zb3IoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBVbnBhY2tQcm9ncmFtKGlucHV0LnNoYXBlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtpbnB1dF0sIGlucHV0LmR0eXBlKTtcbiAgICB9XG4gICAgcGFja1RlbnNvcihpbnB1dCkge1xuICAgICAgICBjb25zdCBwcm9ncmFtID0gbmV3IFBhY2tQcm9ncmFtKGlucHV0LnNoYXBlKTtcbiAgICAgICAgY29uc3QgcHJldmVudEVhZ2VyVW5wYWNraW5nT3V0cHV0ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtpbnB1dF0sIGlucHV0LmR0eXBlLCBudWxsIC8qIGN1c3RvbVVuaWZvcm1WYWx1ZXMgKi8sIHByZXZlbnRFYWdlclVucGFja2luZ091dHB1dCk7XG4gICAgfVxuICAgIHBhY2tlZFJlc2hhcGUoaW5wdXQsIGFmdGVyU2hhcGUpIHtcbiAgICAgICAgY29uc3QgaW5wdXQzRFNoYXBlID0gW1xuICAgICAgICAgICAgd2ViZ2xfdXRpbC5nZXRCYXRjaERpbShpbnB1dC5zaGFwZSksXG4gICAgICAgICAgICAuLi53ZWJnbF91dGlsLmdldFJvd3NDb2xzKGlucHV0LnNoYXBlKVxuICAgICAgICBdO1xuICAgICAgICBjb25zdCBpbnB1dDNEID0ge1xuICAgICAgICAgICAgZHR5cGU6IGlucHV0LmR0eXBlLFxuICAgICAgICAgICAgc2hhcGU6IGlucHV0M0RTaGFwZSxcbiAgICAgICAgICAgIGRhdGFJZDogaW5wdXQuZGF0YUlkXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGFmdGVyU2hhcGVBczNEID0gW1xuICAgICAgICAgICAgd2ViZ2xfdXRpbC5nZXRCYXRjaERpbShhZnRlclNoYXBlKSwgLi4ud2ViZ2xfdXRpbC5nZXRSb3dzQ29scyhhZnRlclNoYXBlKVxuICAgICAgICBdO1xuICAgICAgICBjb25zdCBwcm9ncmFtID0gbmV3IFJlc2hhcGVQYWNrZWRQcm9ncmFtKGFmdGVyU2hhcGVBczNELCBpbnB1dDNEU2hhcGUpO1xuICAgICAgICBjb25zdCBwcmV2ZW50RWFnZXJVbnBhY2tpbmdPZk91dHB1dCA9IHRydWU7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IHRoaXMucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtpbnB1dDNEXSwgaW5wdXQuZHR5cGUsIG51bGwgLyogY3VzdG9tVW5pZm9ybVZhbHVlcyAqLywgcHJldmVudEVhZ2VyVW5wYWNraW5nT2ZPdXRwdXQpO1xuICAgICAgICByZXR1cm4geyBkYXRhSWQ6IG91dHB1dC5kYXRhSWQsIHNoYXBlOiBhZnRlclNoYXBlLCBkdHlwZTogb3V0cHV0LmR0eXBlIH07XG4gICAgfVxuICAgIGRlY29kZShkYXRhSWQpIHtcbiAgICAgICAgY29uc3QgdGV4RGF0YSA9IHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKTtcbiAgICAgICAgY29uc3QgeyBpc1BhY2tlZCwgc2hhcGUsIGR0eXBlIH0gPSB0ZXhEYXRhO1xuICAgICAgICBjb25zdCBzaGFwZUFzM0QgPSB3ZWJnbF91dGlsLmdldFNoYXBlQXMzRChzaGFwZSk7XG4gICAgICAgIGxldCBwcm9ncmFtO1xuICAgICAgICBpZiAoaXNQYWNrZWQpIHtcbiAgICAgICAgICAgIHByb2dyYW0gPSBuZXcgRGVjb2RlTWF0cml4UGFja2VkUHJvZ3JhbShzaGFwZUFzM0QpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcHJvZ3JhbSA9IG5ldyBEZWNvZGVNYXRyaXhQcm9ncmFtKHNoYXBlQXMzRCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJldmVudEVhZ2VyVW5wYWNraW5nT2ZPdXRwdXQgPSB0cnVlO1xuICAgICAgICBjb25zdCBvdXQgPSB0aGlzLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeyBzaGFwZTogc2hhcGVBczNELCBkdHlwZSwgZGF0YUlkIH1dLCBkdHlwZSwgbnVsbCAvKiBjdXN0b21Vbmlmb3JtVmFsdWVzICovLCBwcmV2ZW50RWFnZXJVbnBhY2tpbmdPZk91dHB1dCk7XG4gICAgICAgIHJldHVybiB7IGR0eXBlLCBzaGFwZSwgZGF0YUlkOiBvdXQuZGF0YUlkIH07XG4gICAgfVxuICAgIHJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBpbnB1dHMsIG91dHB1dER0eXBlLCBjdXN0b21Vbmlmb3JtVmFsdWVzLCBwcmV2ZW50RWFnZXJVbnBhY2tpbmdPZk91dHB1dCA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IHRoaXMubWFrZVRlbnNvckluZm8ocHJvZ3JhbS5vdXRwdXRTaGFwZSwgb3V0cHV0RHR5cGUpO1xuICAgICAgICBjb25zdCBvdXREYXRhID0gdGhpcy50ZXhEYXRhLmdldChvdXRwdXQuZGF0YUlkKTtcbiAgICAgICAgaWYgKHByb2dyYW0ucGFja2VkT3V0cHV0KSB7XG4gICAgICAgICAgICBvdXREYXRhLmlzUGFja2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbS5vdXRQYWNraW5nU2NoZW1lID09PSB0ZXhfdXRpbC5QYWNraW5nU2NoZW1lLkRFTlNFKSB7XG4gICAgICAgICAgICBjb25zdCB0ZXhlbFNoYXBlID0gdGV4X3V0aWwuZ2V0RGVuc2VUZXhTaGFwZShwcm9ncmFtLm91dHB1dFNoYXBlKTtcbiAgICAgICAgICAgIC8vIEZvciBhIGRlbnNlbHkgcGFja2VkIG91dHB1dCwgd2UgZXhwbGljaXRseSBzZXQgdGV4U2hhcGVcbiAgICAgICAgICAgIC8vIHNvIGl0IGRvZXNuJ3QgZ2V0IGFzc2lnbmVkIGxhdGVyIGFjY29yZGluZyB0byBvdXIgdHlwaWNhbCBwYWNraW5nXG4gICAgICAgICAgICAvLyBzY2hlbWUgd2hlcmVpbiBhIHNpbmdsZSB0ZXhlbCBjYW4gb25seSBjb250YWluIHZhbHVlcyBmcm9tIGFkamFjZW50XG4gICAgICAgICAgICAvLyByb3dzL2NvbHMuXG4gICAgICAgICAgICBvdXREYXRhLnRleFNoYXBlID0gdGV4ZWxTaGFwZS5tYXAoZCA9PiBkICogMik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW0ub3V0VGV4VXNhZ2UgIT0gbnVsbCkge1xuICAgICAgICAgICAgb3V0RGF0YS51c2FnZSA9IHByb2dyYW0ub3V0VGV4VXNhZ2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHV0aWwuc2l6ZUZyb21TaGFwZShvdXRwdXQuc2hhcGUpID09PSAwKSB7XG4gICAgICAgICAgICAvLyBTaG9ydC1jaXJjdWl0IHRoZSBjb21wdXRhdGlvbiBzaW5jZSB0aGUgcmVzdWx0IGlzIGVtcHR5IChoYXMgMCBpbiBpdHNcbiAgICAgICAgICAgIC8vIHNoYXBlKS5cbiAgICAgICAgICAgIG91dERhdGEudmFsdWVzID1cbiAgICAgICAgICAgICAgICB1dGlsLmdldFR5cGVkQXJyYXlGcm9tRFR5cGUob3V0cHV0LmR0eXBlLCAwKTtcbiAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YVRvRGlzcG9zZSA9IFtdO1xuICAgICAgICBjb25zdCBpbnB1dHNEYXRhID0gaW5wdXRzLm1hcChpbnB1dCA9PiB7XG4gICAgICAgICAgICBpZiAoaW5wdXQuZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBHUEdQVVByb2dyYW0gZG9lcyBub3Qgc3VwcG9ydCBjb21wbGV4NjQgaW5wdXQuIEZvciBjb21wbGV4NjQgYCArXG4gICAgICAgICAgICAgICAgICAgIGBkdHlwZXMsIHBsZWFzZSBzZXBhcmF0ZSB0aGUgcHJvZ3JhbSBpbnRvIHJlYWwgYW5kIGltYWdpbmFyeSBgICtcbiAgICAgICAgICAgICAgICAgICAgYHBhcnRzLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHRleERhdGEgPSB0aGlzLnRleERhdGEuZ2V0KGlucHV0LmRhdGFJZCk7XG4gICAgICAgICAgICBpZiAodGV4RGF0YS50ZXh0dXJlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXByb2dyYW0ucGFja2VkSW5wdXRzICYmXG4gICAgICAgICAgICAgICAgICAgIHV0aWwuc2l6ZUZyb21TaGFwZShpbnB1dC5zaGFwZSkgPD1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVudigpLmdldE51bWJlcignV0VCR0xfU0laRV9VUExPQURfVU5JRk9STScpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFVwbG9hZCBzbWFsbCB0ZW5zb3JzIHRoYXQgbGl2ZSBvbiB0aGUgQ1BVIGFzIHVuaWZvcm1zLCBub3QgYXNcbiAgICAgICAgICAgICAgICAgICAgLy8gdGV4dHVyZXMuIERvIHRoaXMgb25seSB3aGVuIHRoZSBlbnZpcm9ubWVudCBzdXBwb3J0cyAzMmJpdCBmbG9hdHNcbiAgICAgICAgICAgICAgICAgICAgLy8gZHVlIHRvIHByb2JsZW1zIHdoZW4gY29tcGFyaW5nIDE2Yml0IGZsb2F0cyB3aXRoIDMyYml0IGZsb2F0cy5cbiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZmpzL2lzc3Vlcy84MjEpOiBNYWtlIGl0XG4gICAgICAgICAgICAgICAgICAgIC8vIHBvc3NpYmxlIGZvciBwYWNrZWQgc2hhZGVycyB0byBzYW1wbGUgZnJvbSB1bmlmb3Jtcy5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlOiBpbnB1dC5zaGFwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleERhdGE6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBpc1VuaWZvcm06IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB1bmlmb3JtVmFsdWVzOiB0ZXhEYXRhLnZhbHVlc1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBUaGlzIGVuc3VyZXMgdGhhdCBpZiBhIHBhY2tlZCBwcm9ncmFtJ3MgaW5wdXRzIGhhdmUgbm90IHlldCBiZWVuXG4gICAgICAgICAgICAgICAgLy8gdXBsb2FkZWQgdG8gdGhlIEdQVSwgdGhleSBnZXQgdXBsb2FkZWQgYXMgcGFja2VkIHJpZ2h0IG9mZiB0aGUgYmF0LlxuICAgICAgICAgICAgICAgIGlmIChwcm9ncmFtLnBhY2tlZElucHV0cykge1xuICAgICAgICAgICAgICAgICAgICB0ZXhEYXRhLmlzUGFja2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGV4RGF0YS5zaGFwZSA9IGlucHV0LnNoYXBlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCEhdGV4RGF0YS5pc1BhY2tlZCAhPT0gISFwcm9ncmFtLnBhY2tlZElucHV0cykge1xuICAgICAgICAgICAgICAgIGlucHV0ID0gdGV4RGF0YS5pc1BhY2tlZCA/IHRoaXMudW5wYWNrVGVuc29yKGlucHV0KSA6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFja1RlbnNvcihpbnB1dCk7XG4gICAgICAgICAgICAgICAgZGF0YVRvRGlzcG9zZS5wdXNoKGlucHV0KTtcbiAgICAgICAgICAgICAgICB0ZXhEYXRhID0gdGhpcy50ZXhEYXRhLmdldChpbnB1dC5kYXRhSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGV4RGF0YS5pc1BhY2tlZCAmJlxuICAgICAgICAgICAgICAgICF3ZWJnbF91dGlsLmlzUmVzaGFwZUZyZWUodGV4RGF0YS5zaGFwZSwgaW5wdXQuc2hhcGUpKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSB3aGVyZSBhIHRleHR1cmUgZXhpc3RzIGZvciBhIHRlbnNvclxuICAgICAgICAgICAgICAgIC8vIGJ1dCB0aGUgc2hhcGVzIGFyZSBpbmNvbXBhdGlibGUgKGR1ZSB0byBwYWNraW5nIGNvbnN0cmFpbnRzKSBiZWNhdXNlXG4gICAgICAgICAgICAgICAgLy8gdGhlIHRlbnNvciBkaWQgbm90IGhhdmUgYSBjaGFuY2UgdG8gZ28gdGhyb3VnaCB0aGUgcGFja2VkIHJlc2hhcGVcbiAgICAgICAgICAgICAgICAvLyBzaGFkZXIuIFRoaXMgb25seSBoYXBwZW5zIHdoZW4gd2UgcmVzaGFwZSB0aGUgKnNhbWUqIHRlbnNvciB0byBmb3JtXG4gICAgICAgICAgICAgICAgLy8gKmRpc3RpbmN0KiBpbnB1dHMgdG8gYW4gb3AsIGUuZy4gZG90dGluZyBhIHZlY3RvciB3aXRoIGl0c2VsZi4gVGhpc1xuICAgICAgICAgICAgICAgIC8vIGNhc2Ugd2lsbCBkaXNhcHBlYXIgb25jZSBwYWNrZWQgdXBsb2FkaW5nIGlzIHRoZSBkZWZhdWx0LlxuICAgICAgICAgICAgICAgIGNvbnN0IHNhdmVkSW5wdXQgPSBpbnB1dDtcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRTaGFwZSA9IGlucHV0LnNoYXBlO1xuICAgICAgICAgICAgICAgIGlucHV0LnNoYXBlID0gdGV4RGF0YS5zaGFwZTtcbiAgICAgICAgICAgICAgICBpbnB1dCA9IHRoaXMucGFja2VkUmVzaGFwZShpbnB1dCwgdGFyZ2V0U2hhcGUpO1xuICAgICAgICAgICAgICAgIGRhdGFUb0Rpc3Bvc2UucHVzaChpbnB1dCk7XG4gICAgICAgICAgICAgICAgdGV4RGF0YSA9IHRoaXMudGV4RGF0YS5nZXQoaW5wdXQuZGF0YUlkKTtcbiAgICAgICAgICAgICAgICBzYXZlZElucHV0LnNoYXBlID0gdGFyZ2V0U2hhcGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnVwbG9hZFRvR1BVKGlucHV0LmRhdGFJZCk7XG4gICAgICAgICAgICByZXR1cm4geyBzaGFwZTogaW5wdXQuc2hhcGUsIHRleERhdGEsIGlzVW5pZm9ybTogZmFsc2UgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudXBsb2FkVG9HUFUob3V0cHV0LmRhdGFJZCk7XG4gICAgICAgIGNvbnN0IG91dHB1dERhdGEgPSB7IHNoYXBlOiBvdXRwdXQuc2hhcGUsIHRleERhdGE6IG91dERhdGEsIGlzVW5pZm9ybTogZmFsc2UgfTtcbiAgICAgICAgY29uc3Qga2V5ID0gZ3BncHVfbWF0aC5tYWtlU2hhZGVyS2V5KHByb2dyYW0sIGlucHV0c0RhdGEsIG91dHB1dERhdGEpO1xuICAgICAgICBjb25zdCBiaW5hcnkgPSB0aGlzLmdldEFuZFNhdmVCaW5hcnkoa2V5LCAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZ3BncHVfbWF0aC5jb21waWxlUHJvZ3JhbSh0aGlzLmdwZ3B1LCBwcm9ncmFtLCBpbnB1dHNEYXRhLCBvdXRwdXREYXRhKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHNob3VsZFRpbWVQcm9ncmFtID0gdGhpcy5hY3RpdmVUaW1lcnMgIT0gbnVsbDtcbiAgICAgICAgbGV0IHF1ZXJ5O1xuICAgICAgICBpZiAoc2hvdWxkVGltZVByb2dyYW0pIHtcbiAgICAgICAgICAgIHF1ZXJ5ID0gdGhpcy5zdGFydFRpbWVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgZ3BncHVfbWF0aC5ydW5Qcm9ncmFtKHRoaXMuZ3BncHUsIGJpbmFyeSwgaW5wdXRzRGF0YSwgb3V0cHV0RGF0YSwgY3VzdG9tVW5pZm9ybVZhbHVlcyk7XG4gICAgICAgIGRhdGFUb0Rpc3Bvc2UuZm9yRWFjaChpbmZvID0+IHRoaXMuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaW5mbykpO1xuICAgICAgICBpZiAoc2hvdWxkVGltZVByb2dyYW0pIHtcbiAgICAgICAgICAgIHF1ZXJ5ID0gdGhpcy5lbmRUaW1lcihxdWVyeSk7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZVRpbWVycy5wdXNoKHsgbmFtZTogcHJvZ3JhbS5jb25zdHJ1Y3Rvci5uYW1lLCBxdWVyeTogdGhpcy5nZXRRdWVyeVRpbWUocXVlcnkpIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGdsRmx1c2hUaHJlc2hvbGQgPSBlbnYoKS5nZXQoJ1dFQkdMX0ZMVVNIX1RIUkVTSE9MRCcpO1xuICAgICAgICAvLyBNYW51YWxseSBHTCBmbHVzaCByZXF1ZXN0ZWRcbiAgICAgICAgaWYgKGdsRmx1c2hUaHJlc2hvbGQgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCB0aW1lID0gdXRpbC5ub3coKTtcbiAgICAgICAgICAgIGlmICgodGltZSAtIHRoaXMubGFzdEdsRmx1c2hUaW1lKSA+IGdsRmx1c2hUaHJlc2hvbGQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdwZ3B1LmdsLmZsdXNoKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0R2xGbHVzaFRpbWUgPSB0aW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghZW52KCkuZ2V0Qm9vbCgnV0VCR0xfTEFaSUxZX1VOUEFDSycpICYmIG91dERhdGEuaXNQYWNrZWQgJiZcbiAgICAgICAgICAgIHByZXZlbnRFYWdlclVucGFja2luZ09mT3V0cHV0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgY29uc3QgdW5wYWNrZWQgPSB0aGlzLnVucGFja1RlbnNvcihvdXRwdXQpO1xuICAgICAgICAgICAgdGhpcy5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhvdXRwdXQpO1xuICAgICAgICAgICAgcmV0dXJuIHVucGFja2VkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfVxuICAgIGNvbXBpbGVBbmRSdW4ocHJvZ3JhbSwgaW5wdXRzLCBvdXRwdXREdHlwZSwgY3VzdG9tVW5pZm9ybVZhbHVlcywgcHJldmVudEVhZ2VyVW5wYWNraW5nT2ZPdXRwdXQgPSBmYWxzZSkge1xuICAgICAgICBvdXRwdXREdHlwZSA9IG91dHB1dER0eXBlIHx8IGlucHV0c1swXS5kdHlwZTtcbiAgICAgICAgY29uc3Qgb3V0SW5mbyA9IHRoaXMucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIGlucHV0cywgb3V0cHV0RHR5cGUsIGN1c3RvbVVuaWZvcm1WYWx1ZXMsIHByZXZlbnRFYWdlclVucGFja2luZ09mT3V0cHV0KTtcbiAgICAgICAgcmV0dXJuIG91dEluZm87XG4gICAgfVxuICAgIGdldEFuZFNhdmVCaW5hcnkoa2V5LCBnZXRCaW5hcnkpIHtcbiAgICAgICAgaWYgKCEoa2V5IGluIHRoaXMuYmluYXJ5Q2FjaGUpKSB7XG4gICAgICAgICAgICB0aGlzLmJpbmFyeUNhY2hlW2tleV0gPSBnZXRCaW5hcnkoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5iaW5hcnlDYWNoZVtrZXldO1xuICAgIH1cbiAgICBnZXRUZXh0dXJlTWFuYWdlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dHVyZU1hbmFnZXI7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmRpc3Bvc2VkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXZvaWQgZGlzcG9zaW5nIHRoZSBjb21waWxlZCB3ZWJnbCBwcm9ncmFtcyBkdXJpbmcgdW5pdCB0ZXN0aW5nIGJlY2F1c2VcbiAgICAgICAgLy8gaXQgc2xvd3MgZG93biB0ZXN0IGV4ZWN1dGlvbi5cbiAgICAgICAgaWYgKCFlbnYoKS5nZXRCb29sKCdJU19URVNUJykpIHtcbiAgICAgICAgICAgIGNvbnN0IGFsbEtleXMgPSBPYmplY3Qua2V5cyh0aGlzLmJpbmFyeUNhY2hlKTtcbiAgICAgICAgICAgIGFsbEtleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZ3BncHUuZGVsZXRlUHJvZ3JhbSh0aGlzLmJpbmFyeUNhY2hlW2tleV0ud2ViR0xQcm9ncmFtKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5iaW5hcnlDYWNoZVtrZXldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50ZXh0dXJlTWFuYWdlci5kaXNwb3NlKCk7XG4gICAgICAgIGlmICh0aGlzLmNhbnZhcyAhPSBudWxsICYmXG4gICAgICAgICAgICAodHlwZW9mIChIVE1MQ2FudmFzRWxlbWVudCkgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXMgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jYW52YXMgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmdwZ3B1Q3JlYXRlZExvY2FsbHkpIHtcbiAgICAgICAgICAgIHRoaXMuZ3BncHUucHJvZ3JhbSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmdwZ3B1LmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRpc3Bvc2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgZmxvYXRQcmVjaXNpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLmZsb2F0UHJlY2lzaW9uVmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5mbG9hdFByZWNpc2lvblZhbHVlID0gdGlkeSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFlbnYoKS5nZXQoJ1dFQkdMX1JFTkRFUl9GTE9BVDMyX0VOQUJMRUQnKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBNb21lbnRhcmlseSBzd2l0Y2hpbmcgREVCVUcgZmxhZyB0byBmYWxzZSBzbyB3ZSBkb24ndCB0aHJvdyBhblxuICAgICAgICAgICAgICAgICAgICAvLyBlcnJvciB0cnlpbmcgdG8gdXBsb2FkIGEgc21hbGwgdmFsdWUuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlYnVnRmxhZyA9IGVudigpLmdldEJvb2woJ0RFQlVHJyk7XG4gICAgICAgICAgICAgICAgICAgIGVudigpLnNldCgnREVCVUcnLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuZGVyZmxvd0NoZWNrVmFsdWUgPSB0aGlzLmFicyhzY2FsYXIoMWUtOCkpLmRhdGFTeW5jKClbMF07XG4gICAgICAgICAgICAgICAgICAgIGVudigpLnNldCgnREVCVUcnLCBkZWJ1Z0ZsYWcpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodW5kZXJmbG93Q2hlY2tWYWx1ZSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAzMjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gMTY7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5mbG9hdFByZWNpc2lvblZhbHVlO1xuICAgIH1cbiAgICAvKiogUmV0dXJucyB0aGUgc21hbGxlc3QgcmVwcmVzZW50YWJsZSBudW1iZXIuICAqL1xuICAgIGVwc2lsb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZsb2F0UHJlY2lzaW9uKCkgPT09IDMyID8gRVBTSUxPTl9GTE9BVDMyIDogRVBTSUxPTl9GTE9BVDE2O1xuICAgIH1cbiAgICB1cGxvYWRUb0dQVShkYXRhSWQpIHtcbiAgICAgICAgY29uc3QgdGV4RGF0YSA9IHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKTtcbiAgICAgICAgY29uc3QgeyBzaGFwZSwgZHR5cGUsIHZhbHVlcywgdGV4dHVyZSwgdXNhZ2UsIGlzUGFja2VkIH0gPSB0ZXhEYXRhO1xuICAgICAgICBpZiAodGV4dHVyZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBBcnJheSBpcyBhbHJlYWR5IG9uIEdQVS4gTm8tb3AuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2hvdWxkVGltZVByb2dyYW0gPSB0aGlzLmFjdGl2ZVRpbWVycyAhPSBudWxsO1xuICAgICAgICBsZXQgc3RhcnQ7XG4gICAgICAgIGlmIChzaG91bGRUaW1lUHJvZ3JhbSkge1xuICAgICAgICAgICAgc3RhcnQgPSB1dGlsLm5vdygpO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0ZXhTaGFwZSA9IHRleERhdGEudGV4U2hhcGU7XG4gICAgICAgIGlmICh0ZXhTaGFwZSA9PSBudWxsKSB7XG4gICAgICAgICAgICB0ZXhTaGFwZSA9IHdlYmdsX3V0aWwuZ2V0VGV4dHVyZVNoYXBlRnJvbUxvZ2ljYWxTaGFwZShzaGFwZSwgaXNQYWNrZWQpO1xuICAgICAgICAgICAgdGV4RGF0YS50ZXhTaGFwZSA9IHRleFNoYXBlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3Qgc2hhcGVBczNEID0gd2ViZ2xfdXRpbC5nZXRTaGFwZUFzM0Qoc2hhcGUpO1xuICAgICAgICAgICAgbGV0IHByb2dyYW07XG4gICAgICAgICAgICBsZXQgd2lkdGggPSB0ZXhTaGFwZVsxXSwgaGVpZ2h0ID0gdGV4U2hhcGVbMF07XG4gICAgICAgICAgICBjb25zdCBpc0J5dGVBcnJheSA9IHZhbHVlcyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXk7XG4gICAgICAgICAgICBpZiAoaXNQYWNrZWQpIHtcbiAgICAgICAgICAgICAgICBbd2lkdGgsIGhlaWdodF0gPSB0ZXhfdXRpbC5nZXRQYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodCh0ZXhTaGFwZVswXSwgdGV4U2hhcGVbMV0pO1xuICAgICAgICAgICAgICAgIHByb2dyYW0gPSBuZXcgRW5jb2RlTWF0cml4UGFja2VkUHJvZ3JhbShzaGFwZUFzM0QsIFtoZWlnaHQsIHdpZHRoXSwgaXNCeXRlQXJyYXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcHJvZ3JhbSA9XG4gICAgICAgICAgICAgICAgICAgIG5ldyBFbmNvZGVNYXRyaXhQcm9ncmFtKHNoYXBlQXMzRCwgW2hlaWdodCwgd2lkdGhdLCBpc0J5dGVBcnJheSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0ZW1wRGVuc2VJbnB1dEhhbmRsZSA9IHRoaXMubWFrZVRlbnNvckluZm8oW2hlaWdodCwgd2lkdGhdLCBkdHlwZSk7XG4gICAgICAgICAgICBpZiAoaXNCeXRlQXJyYXkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRleERhdGEuZ2V0KHRlbXBEZW5zZUlucHV0SGFuZGxlLmRhdGFJZCkudXNhZ2UgPVxuICAgICAgICAgICAgICAgICAgICBUZXh0dXJlVXNhZ2UuUElYRUxTO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy50ZXhEYXRhLmdldCh0ZW1wRGVuc2VJbnB1dEhhbmRsZS5kYXRhSWQpLnVzYWdlID1cbiAgICAgICAgICAgICAgICAgICAgVGV4dHVyZVVzYWdlLlVQTE9BRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZ3BncHUudXBsb2FkRGVuc2VNYXRyaXhUb1RleHR1cmUodGhpcy5nZXRUZXh0dXJlKHRlbXBEZW5zZUlucHV0SGFuZGxlLmRhdGFJZCksIHdpZHRoLCBoZWlnaHQsIHZhbHVlcyk7XG4gICAgICAgICAgICAvLyBXZSB3YW50IHRoZSBvdXRwdXQgdG8gcmVtYWluIHBhY2tlZCByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZSBvZlxuICAgICAgICAgICAgLy8gV0VCR0xfUEFDSy5cbiAgICAgICAgICAgIGNvbnN0IHByZXZlbnRFYWdlclVucGFja2luZyA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCBlbmNvZGVkT3V0cHV0VGFyZ2V0ID0gdGhpcy5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3RlbXBEZW5zZUlucHV0SGFuZGxlXSwgZHR5cGUsIG51bGwsIHByZXZlbnRFYWdlclVucGFja2luZyk7XG4gICAgICAgICAgICAvLyBIYXZlIHRoZSBvcmlnaW5hbCB0ZXh0dXJlIGFzc3VtZSB0aGUgaWRlbnRpdHkgb2YgdGhlIGVuY29kZWQgb3V0cHV0LlxuICAgICAgICAgICAgY29uc3Qgb3V0cHV0VGV4RGF0YSA9IHRoaXMudGV4RGF0YS5nZXQoZW5jb2RlZE91dHB1dFRhcmdldC5kYXRhSWQpO1xuICAgICAgICAgICAgdGV4RGF0YS50ZXh0dXJlID0gb3V0cHV0VGV4RGF0YS50ZXh0dXJlO1xuICAgICAgICAgICAgdGV4RGF0YS50ZXhTaGFwZSA9IG91dHB1dFRleERhdGEudGV4U2hhcGU7XG4gICAgICAgICAgICB0ZXhEYXRhLmlzUGFja2VkID0gb3V0cHV0VGV4RGF0YS5pc1BhY2tlZDtcbiAgICAgICAgICAgIHRleERhdGEudXNhZ2UgPSBvdXRwdXRUZXhEYXRhLnVzYWdlO1xuICAgICAgICAgICAgdGhpcy5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0ZW1wRGVuc2VJbnB1dEhhbmRsZSk7XG4gICAgICAgICAgICB0aGlzLnRleERhdGEuZGVsZXRlKGVuY29kZWRPdXRwdXRUYXJnZXQuZGF0YUlkKTtcbiAgICAgICAgICAgIC8vIE9uY2UgdXBsb2FkZWQsIGRvbid0IHN0b3JlIHRoZSB2YWx1ZXMgb24gY3B1LlxuICAgICAgICAgICAgdGV4RGF0YS52YWx1ZXMgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHNob3VsZFRpbWVQcm9ncmFtKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGxvYWRXYWl0TXMgKz0gdXRpbC5ub3coKSAtIHN0YXJ0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbmV3VGV4dHVyZSA9IHRoaXMuYWNxdWlyZVRleHR1cmUodGV4U2hhcGUsIHVzYWdlLCBkdHlwZSwgaXNQYWNrZWQpO1xuICAgICAgICAgICAgdGV4RGF0YS50ZXh0dXJlID0gbmV3VGV4dHVyZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb252ZXJ0QW5kQ2FjaGVPbkNQVShkYXRhSWQsIGZsb2F0MzJWYWx1ZXMpIHtcbiAgICAgICAgY29uc3QgdGV4RGF0YSA9IHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKTtcbiAgICAgICAgY29uc3QgeyBkdHlwZSB9ID0gdGV4RGF0YTtcbiAgICAgICAgdGhpcy5yZWxlYXNlR1BVRGF0YShkYXRhSWQpO1xuICAgICAgICBpZiAoZmxvYXQzMlZhbHVlcyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0ZXhEYXRhLnZhbHVlcyA9IGZsb2F0MzJUb1R5cGVkQXJyYXkoZmxvYXQzMlZhbHVlcywgZHR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0ZXhEYXRhLnZhbHVlcztcbiAgICB9XG4gICAgYWNxdWlyZVRleHR1cmUodGV4U2hhcGUsIHRleFR5cGUsIGR0eXBlLCBpc1BhY2tlZCkge1xuICAgICAgICB0aGlzLm51bUJ5dGVzSW5HUFUgKz0gdGhpcy5jb21wdXRlQnl0ZXModGV4U2hhcGUsIGR0eXBlKTtcbiAgICAgICAgaWYgKCF0aGlzLndhcm5lZEFib3V0TWVtb3J5ICYmXG4gICAgICAgICAgICB0aGlzLm51bUJ5dGVzSW5HUFUgPiB0aGlzLm51bU1CQmVmb3JlV2FybmluZyAqIDEwMjQgKiAxMDI0KSB7XG4gICAgICAgICAgICBjb25zdCBtYiA9ICh0aGlzLm51bUJ5dGVzSW5HUFUgLyAxMDI0IC8gMTAyNCkudG9GaXhlZCgyKTtcbiAgICAgICAgICAgIHRoaXMud2FybmVkQWJvdXRNZW1vcnkgPSB0cnVlO1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBIaWdoIG1lbW9yeSB1c2FnZSBpbiBHUFU6ICR7bWJ9IE1CLCBgICtcbiAgICAgICAgICAgICAgICBgbW9zdCBsaWtlbHkgZHVlIHRvIGEgbWVtb3J5IGxlYWtgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy50ZXh0dXJlTWFuYWdlci5hY3F1aXJlVGV4dHVyZSh0ZXhTaGFwZSwgdGV4VHlwZSwgaXNQYWNrZWQpO1xuICAgIH1cbiAgICBjb21wdXRlQnl0ZXMoc2hhcGUsIGR0eXBlKSB7XG4gICAgICAgIHJldHVybiBzaGFwZVswXSAqIHNoYXBlWzFdICogdXRpbC5ieXRlc1BlckVsZW1lbnQoZHR5cGUpO1xuICAgIH1cbn1cbk1hdGhCYWNrZW5kV2ViR0wubmV4dERhdGFJZCA9IDA7XG5mdW5jdGlvbiBmbG9hdDMyVG9UeXBlZEFycmF5KGEsIGR0eXBlKSB7XG4gICAgaWYgKGR0eXBlID09PSAnZmxvYXQzMicgfHwgZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICAgIHJldHVybiBhO1xuICAgIH1cbiAgICBlbHNlIGlmIChkdHlwZSA9PT0gJ2ludDMyJyB8fCBkdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IChkdHlwZSA9PT0gJ2ludDMyJykgPyBuZXcgSW50MzJBcnJheShhLmxlbmd0aCkgOlxuICAgICAgICAgICAgbmV3IFVpbnQ4QXJyYXkoYS5sZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgcmVzdWx0W2ldID0gTWF0aC5yb3VuZChhW2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGR0eXBlICR7ZHR5cGV9YCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmFja2VuZF93ZWJnbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vLyBiYXNlLnRzIGlzIHRoZSB3ZWJnbCBiYWNrZW5kIHdpdGhvdXQgYXV0byBrZXJuZWwgcmVnaXN0cmF0aW9uLlxuaW1wb3J0IHsgZGV2aWNlX3V0aWwsIHJlZ2lzdGVyQmFja2VuZCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBNYXRoQmFja2VuZFdlYkdMIH0gZnJvbSAnLi9iYWNrZW5kX3dlYmdsJztcbmV4cG9ydCB7IHZlcnNpb24gYXMgdmVyc2lvbl93ZWJnbCB9IGZyb20gJy4vdmVyc2lvbic7XG5pZiAoZGV2aWNlX3V0aWwuaXNCcm93c2VyKCkpIHtcbiAgICByZWdpc3RlckJhY2tlbmQoJ3dlYmdsJywgKCkgPT4gbmV3IE1hdGhCYWNrZW5kV2ViR0woKSwgMiAvKiBwcmlvcml0eSAqLyk7XG59XG4vLyBFeHBvcnQgd2ViZ2wgdXRpbGl0aWVzXG5leHBvcnQgKiBmcm9tICcuL3dlYmdsJztcbi8vIEV4cG9ydCBmb3JjZUhhbGZGbG9zdCB1bmRlciB3ZWJnbCBuYW1lc3BhY2UgZm9yIHRoZSB1bmlvbiBidW5kbGUuXG5pbXBvcnQgeyBmb3JjZUhhbGZGbG9hdCB9IGZyb20gJy4vd2ViZ2wnO1xuZXhwb3J0IGNvbnN0IHdlYmdsID0geyBmb3JjZUhhbGZGbG9hdCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmFzZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGNsYXNzIEJhdGNoTm9ybVByb2dyYW0ge1xuICAgIGNvbnN0cnVjdG9yKHhTaGFwZSwgbWVhblNoYXBlLCB2YXJpYW5jZVNoYXBlLCBvZmZzZXRTaGFwZSwgc2NhbGVTaGFwZSwgdmFyaWFuY2VFcHNpbG9uKSB7XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBbXTtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWyd4JywgJ21lYW4nLCAndmFyaWFuY2UnXTtcbiAgICAgICAgYmFja2VuZF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKHhTaGFwZSwgbWVhblNoYXBlKTtcbiAgICAgICAgYmFja2VuZF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKHhTaGFwZSwgdmFyaWFuY2VTaGFwZSk7XG4gICAgICAgIGxldCBvZmZzZXRTbmlwcGV0ID0gJzAuMCc7XG4gICAgICAgIGlmIChvZmZzZXRTaGFwZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoeFNoYXBlLCBvZmZzZXRTaGFwZSk7XG4gICAgICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMucHVzaCgnb2Zmc2V0Jyk7XG4gICAgICAgICAgICBvZmZzZXRTbmlwcGV0ID0gJ2dldE9mZnNldEF0T3V0Q29vcmRzKCknO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzY2FsZVNuaXBwZXQgPSAnMS4wJztcbiAgICAgICAgaWYgKHNjYWxlU2hhcGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgYmFja2VuZF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKHhTaGFwZSwgc2NhbGVTaGFwZSk7XG4gICAgICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMucHVzaCgnc2NhbGUnKTtcbiAgICAgICAgICAgIHNjYWxlU25pcHBldCA9ICdnZXRTY2FsZUF0T3V0Q29vcmRzKCknO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSB4U2hhcGU7XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGZsb2F0IHggPSBnZXRYQXRPdXRDb29yZHMoKTtcbiAgICAgICAgZmxvYXQgbWVhbiA9IGdldE1lYW5BdE91dENvb3JkcygpO1xuICAgICAgICBmbG9hdCB2YXJpYW5jZSA9IGdldFZhcmlhbmNlQXRPdXRDb29yZHMoKTtcbiAgICAgICAgZmxvYXQgb2Zmc2V0ID0gJHtvZmZzZXRTbmlwcGV0fTtcbiAgICAgICAgZmxvYXQgc2NhbGUgPSAke3NjYWxlU25pcHBldH07XG4gICAgICAgIGZsb2F0IGludiA9IHNjYWxlICogaW52ZXJzZXNxcnQodmFyaWFuY2UgKyBmbG9hdCgke3ZhcmlhbmNlRXBzaWxvbn0pKTtcbiAgICAgICAgc2V0T3V0cHV0KGRvdCh2ZWMzKHgsIC1tZWFuLCBvZmZzZXQpLCB2ZWMzKGludiwgaW52LCAxKSkpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmF0Y2hub3JtX2dwdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGNsYXNzIEJhdGNoTm9ybVBhY2tlZFByb2dyYW0ge1xuICAgIGNvbnN0cnVjdG9yKHhTaGFwZSwgbWVhblNoYXBlLCB2YXJpYW5jZVNoYXBlLCBvZmZzZXRTaGFwZSwgc2NhbGVTaGFwZSwgdmFyaWFuY2VFcHNpbG9uKSB7XG4gICAgICAgIHRoaXMucGFja2VkSW5wdXRzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wYWNrZWRPdXRwdXQgPSB0cnVlO1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ3gnLCAnbWVhbicsICd2YXJpYW5jZSddO1xuICAgICAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoeFNoYXBlLCBtZWFuU2hhcGUpO1xuICAgICAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoeFNoYXBlLCB2YXJpYW5jZVNoYXBlKTtcbiAgICAgICAgbGV0IG9mZnNldFNuaXBwZXQgPSAndmVjNCgwLjApJztcbiAgICAgICAgaWYgKG9mZnNldFNoYXBlICE9IG51bGwpIHtcbiAgICAgICAgICAgIGJhY2tlbmRfdXRpbC5hc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSh4U2hhcGUsIG9mZnNldFNoYXBlKTtcbiAgICAgICAgICAgIHRoaXMudmFyaWFibGVOYW1lcy5wdXNoKCdvZmZzZXQnKTtcbiAgICAgICAgICAgIG9mZnNldFNuaXBwZXQgPSAnZ2V0T2Zmc2V0QXRPdXRDb29yZHMoKSc7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHNjYWxlU25pcHBldCA9ICd2ZWM0KDEuMCknO1xuICAgICAgICBpZiAoc2NhbGVTaGFwZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoeFNoYXBlLCBzY2FsZVNoYXBlKTtcbiAgICAgICAgICAgIHRoaXMudmFyaWFibGVOYW1lcy5wdXNoKCdzY2FsZScpO1xuICAgICAgICAgICAgc2NhbGVTbmlwcGV0ID0gJ2dldFNjYWxlQXRPdXRDb29yZHMoKSc7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IHhTaGFwZTtcbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgdmVjNCBvZmZzZXQgPSAke29mZnNldFNuaXBwZXR9O1xuICAgICAgICB2ZWM0IHNjYWxlID0gJHtzY2FsZVNuaXBwZXR9O1xuXG4gICAgICAgIHZlYzQgeCA9IGdldFhBdE91dENvb3JkcygpO1xuICAgICAgICB2ZWM0IG1lYW4gPSBnZXRNZWFuQXRPdXRDb29yZHMoKTtcbiAgICAgICAgdmVjNCB2YXJpYW5jZSA9IGdldFZhcmlhbmNlQXRPdXRDb29yZHMoKTtcblxuICAgICAgICB2ZWM0IGludiA9IHNjYWxlICogaW52ZXJzZXNxcnQodmFyaWFuY2UgKyB2ZWM0KCR7dmFyaWFuY2VFcHNpbG9ufSkpO1xuXG4gICAgICAgIHNldE91dHB1dCgoeCAtIG1lYW4pICogaW52ICsgb2Zmc2V0KTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJhdGNobm9ybV9wYWNrZWRfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG4vLyAoQXIgKyBBaSkoQnIgKyBCaSkgPVxuLy8gQXJCciArIEFyQmkgKyBBaUJyICsgQWlCaSA9IEFyQnIgLSBBQiArIEFyQmkgKyBBaUJyXG4vLyBZciA9IEFyQnIgLSBBQlxuLy8gWWkgPSBBckJpICsgQWlCclxuZXhwb3J0IGNvbnN0IENPTVBMRVhfTVVMVElQTFkgPSB7XG4gICAgUkVBTDogJ3JldHVybiBhcmVhbCAqIGJyZWFsIC0gYWltYWcgKiBiaW1hZzsnLFxuICAgIElNQUc6ICdyZXR1cm4gYXJlYWwgKiBiaW1hZyArIGFpbWFnICogYnJlYWw7J1xufTtcbmV4cG9ydCBjbGFzcyBCaW5hcnlPcENvbXBsZXhQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3RvcihvcCwgYVNoYXBlLCBiU2hhcGUpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWydBUmVhbCcsICdBSW1hZycsICdCUmVhbCcsICdCSW1hZyddO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gYmFja2VuZF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKGFTaGFwZSwgYlNoYXBlKTtcbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGZsb2F0IGJpbmFyeU9wQ29tcGxleChcbiAgICAgICAgICBmbG9hdCBhcmVhbCwgZmxvYXQgYWltYWcsIGZsb2F0IGJyZWFsLCBmbG9hdCBiaW1hZykge1xuICAgICAgICAke29wfVxuICAgICAgfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGZsb2F0IGFyZWFsID0gZ2V0QVJlYWxBdE91dENvb3JkcygpO1xuICAgICAgICBmbG9hdCBhaW1hZyA9IGdldEFJbWFnQXRPdXRDb29yZHMoKTtcbiAgICAgICAgZmxvYXQgYnJlYWwgPSBnZXRCUmVhbEF0T3V0Q29vcmRzKCk7XG4gICAgICAgIGZsb2F0IGJpbWFnID0gZ2V0QkltYWdBdE91dENvb3JkcygpO1xuICAgICAgICBzZXRPdXRwdXQoYmluYXJ5T3BDb21wbGV4KGFyZWFsLCBhaW1hZywgYnJlYWwsIGJpbWFnKSk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iaW5hcnlvcF9jb21wbGV4X2dwdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdXNlU2hhcGVVbmlmb3JtcyB9IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5leHBvcnQgY29uc3QgQ0hFQ0tfTkFOX1NOSVBQRVQgPSBgXG4gIGlmIChpc25hbihhKSkgcmV0dXJuIGE7XG4gIGlmIChpc25hbihiKSkgcmV0dXJuIGI7XG5gO1xuZXhwb3J0IGNvbnN0IFNRVUFSRURfRElGRkVSRU5DRSA9ICdyZXR1cm4gKGEgLSBiKSAqIChhIC0gYik7JztcbmV4cG9ydCBjbGFzcyBCaW5hcnlPcFByb2dyYW0ge1xuICAgIGNvbnN0cnVjdG9yKG9wLCBhU2hhcGUsIGJTaGFwZSkge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ0EnLCAnQiddO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gYmFja2VuZF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKGFTaGFwZSwgYlNoYXBlKTtcbiAgICAgICAgdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID0gdXNlU2hhcGVVbmlmb3Jtcyh0aGlzLm91dHB1dFNoYXBlLmxlbmd0aCk7XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBmbG9hdCBiaW5hcnlPcGVyYXRpb24oZmxvYXQgYSwgZmxvYXQgYikge1xuICAgICAgICAke29wfVxuICAgICAgfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGZsb2F0IGEgPSBnZXRBQXRPdXRDb29yZHMoKTtcbiAgICAgICAgZmxvYXQgYiA9IGdldEJBdE91dENvb3JkcygpO1xuICAgICAgICBzZXRPdXRwdXQoYmluYXJ5T3BlcmF0aW9uKGEsIGIpKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJpbmFyeW9wX2dwdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdXNlU2hhcGVVbmlmb3JtcyB9IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5pbXBvcnQgeyBnZXRDaGFubmVscyB9IGZyb20gJy4vcGFja2luZ191dGlsJztcbmltcG9ydCB7IGdldENvb3Jkc0RhdGFUeXBlIH0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuZXhwb3J0IGNvbnN0IENIRUNLX05BTl9TTklQUEVUID0gYFxuICByZXN1bHQuciA9IGlzTmFOLnIgPiAwLiA/IE5BTiA6IHJlc3VsdC5yO1xuICByZXN1bHQuZyA9IGlzTmFOLmcgPiAwLiA/IE5BTiA6IHJlc3VsdC5nO1xuICByZXN1bHQuYiA9IGlzTmFOLmIgPiAwLiA/IE5BTiA6IHJlc3VsdC5iO1xuICByZXN1bHQuYSA9IGlzTmFOLmEgPiAwLiA/IE5BTiA6IHJlc3VsdC5hO1xuYDtcbmV4cG9ydCBjb25zdCBFTFVfREVSID0gYFxuICB2ZWM0IGJHVEVaZXJvID0gdmVjNChncmVhdGVyVGhhbkVxdWFsKGIsIHZlYzQoMC4pKSk7XG4gIHJldHVybiAoYkdURVplcm8gKiBhKSArICgodmVjNCgxLjApIC0gYkdURVplcm8pICogKGEgKiAoYiArIHZlYzQoMS4wKSkpKTtcbmA7XG5leHBvcnQgY29uc3QgTk9UX0VRVUFMID0gYFxuICByZXR1cm4gdmVjNChub3RFcXVhbChhLCBiKSk7XG5gO1xuZXhwb3J0IGNsYXNzIEJpbmFyeU9wUGFja2VkUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3Iob3AsIGFTaGFwZSwgYlNoYXBlLCBjaGVja091dE9mQm91bmRzID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWydBJywgJ0InXTtcbiAgICAgICAgdGhpcy5zdXBwb3J0c0Jyb2FkY2FzdGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMucGFja2VkSW5wdXRzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wYWNrZWRPdXRwdXQgPSB0cnVlO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gYmFja2VuZF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKGFTaGFwZSwgYlNoYXBlKTtcbiAgICAgICAgY29uc3QgcmFuayA9IHRoaXMub3V0cHV0U2hhcGUubGVuZ3RoO1xuICAgICAgICB0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMgPSB1c2VTaGFwZVVuaWZvcm1zKHJhbmspO1xuICAgICAgICBsZXQgY2hlY2tPdXRPZkJvdW5kc1N0cmluZyA9ICcnO1xuICAgICAgICBpZiAoY2hlY2tPdXRPZkJvdW5kcykge1xuICAgICAgICAgICAgaWYgKHJhbmsgPT09IDAgfHwgdXRpbC5zaXplRnJvbVNoYXBlKHRoaXMub3V0cHV0U2hhcGUpID09PSAxKSB7XG4gICAgICAgICAgICAgICAgY2hlY2tPdXRPZkJvdW5kc1N0cmluZyA9IGBcbiAgICAgICAgICByZXN1bHQueSA9IDAuO1xuICAgICAgICAgIHJlc3VsdC56ID0gMC47XG4gICAgICAgICAgcmVzdWx0LncgPSAwLjtcbiAgICAgICAgYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGR0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUocmFuayk7XG4gICAgICAgICAgICAgICAgY2hlY2tPdXRPZkJvdW5kc1N0cmluZyA9IGBcbiAgICAgICAgICAke2R0eXBlfSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgYDtcbiAgICAgICAgICAgICAgICBpZiAocmFuayA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja091dE9mQm91bmRzU3RyaW5nICs9IGBcbiAgICAgICAgICAgIHJlc3VsdC55ID0gKGNvb3JkcyArIDEpID49IG91dFNoYXBlID8gMC4gOiByZXN1bHQueTtcbiAgICAgICAgICAgIHJlc3VsdC56ID0gMC47XG4gICAgICAgICAgICByZXN1bHQudyA9IDAuO1xuICAgICAgICAgIGA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja091dE9mQm91bmRzU3RyaW5nICs9IGBcbiAgICAgICAgICAgIHJlc3VsdC55ID0gKGNvb3JkcyArIDEpID49ICR7dGhpcy5vdXRwdXRTaGFwZVswXX0gPyAwLiA6IHJlc3VsdC55O1xuICAgICAgICAgICAgcmVzdWx0LnogPSAwLjtcbiAgICAgICAgICAgIHJlc3VsdC53ID0gMC47XG4gICAgICAgICAgYDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhbm5lbHMgPSBnZXRDaGFubmVscygnY29vcmRzJywgcmFuayk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrT3V0T2ZCb3VuZHNTdHJpbmcgKz0gYFxuICAgICAgICAgICAgYm9vbCBuZXh0Um93T3V0T2ZCb3VuZHMgPVxuICAgICAgICAgICAgICAoJHtjaGFubmVsc1tyYW5rIC0gMl19ICsgMSkgPj0gb3V0U2hhcGVbJHtyYW5rfSAtIDJdO1xuICAgICAgICAgICAgYm9vbCBuZXh0Q29sT3V0T2ZCb3VuZHMgPVxuICAgICAgICAgICAgICAoJHtjaGFubmVsc1tyYW5rIC0gMV19ICsgMSkgPj0gb3V0U2hhcGVbJHtyYW5rfSAtIDFdO1xuICAgICAgICAgICAgcmVzdWx0LnkgPSBuZXh0Q29sT3V0T2ZCb3VuZHMgPyAwLiA6IHJlc3VsdC55O1xuICAgICAgICAgICAgcmVzdWx0LnogPSBuZXh0Um93T3V0T2ZCb3VuZHMgPyAwLiA6IHJlc3VsdC56O1xuICAgICAgICAgICAgcmVzdWx0LncgPSBuZXh0Q29sT3V0T2ZCb3VuZHMgfHwgbmV4dFJvd091dE9mQm91bmRzID8gMC4gOiByZXN1bHQudztcbiAgICAgICAgICBgO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tPdXRPZkJvdW5kc1N0cmluZyArPSBgXG4gICAgICAgICAgICBib29sIG5leHRSb3dPdXRPZkJvdW5kcyA9XG4gICAgICAgICAgICAgICgke2NoYW5uZWxzW3JhbmsgLSAyXX0gKyAxKSA+PSAke3RoaXMub3V0cHV0U2hhcGVbcmFuayAtIDJdfTtcbiAgICAgICAgICAgIGJvb2wgbmV4dENvbE91dE9mQm91bmRzID1cbiAgICAgICAgICAgICAgKCR7Y2hhbm5lbHNbcmFuayAtIDFdfSArIDEpID49ICR7dGhpcy5vdXRwdXRTaGFwZVtyYW5rIC0gMV19O1xuICAgICAgICAgICAgcmVzdWx0LnkgPSBuZXh0Q29sT3V0T2ZCb3VuZHMgPyAwLiA6IHJlc3VsdC55O1xuICAgICAgICAgICAgcmVzdWx0LnogPSBuZXh0Um93T3V0T2ZCb3VuZHMgPyAwLiA6IHJlc3VsdC56O1xuICAgICAgICAgICAgcmVzdWx0LncgPSBuZXh0Q29sT3V0T2ZCb3VuZHMgfHwgbmV4dFJvd091dE9mQm91bmRzID8gMC4gOiByZXN1bHQudztcbiAgICAgICAgICBgO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2ZWM0IGJpbmFyeU9wZXJhdGlvbih2ZWM0IGEsIHZlYzQgYikge1xuICAgICAgICAke29wfVxuICAgICAgfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIHZlYzQgYSA9IGdldEFBdE91dENvb3JkcygpO1xuICAgICAgICB2ZWM0IGIgPSBnZXRCQXRPdXRDb29yZHMoKTtcblxuICAgICAgICB2ZWM0IHJlc3VsdCA9IGJpbmFyeU9wZXJhdGlvbihhLCBiKTtcbiAgICAgICAgJHtjaGVja091dE9mQm91bmRzU3RyaW5nfVxuXG4gICAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmluYXJ5b3BfcGFja2VkX2dwdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5jb25zdCBjb250ZXh0cyA9IHt9O1xuY29uc3QgV0VCR0xfQVRUUklCVVRFUyA9IHtcbiAgICBhbHBoYTogZmFsc2UsXG4gICAgYW50aWFsaWFzOiBmYWxzZSxcbiAgICBwcmVtdWx0aXBsaWVkQWxwaGE6IGZhbHNlLFxuICAgIHByZXNlcnZlRHJhd2luZ0J1ZmZlcjogZmFsc2UsXG4gICAgZGVwdGg6IGZhbHNlLFxuICAgIHN0ZW5jaWw6IGZhbHNlLFxuICAgIGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ6IHRydWVcbn07XG5leHBvcnQgZnVuY3Rpb24gY2xlYXJXZWJHTENvbnRleHQod2ViR0xWZXJzaW9uKSB7XG4gICAgZGVsZXRlIGNvbnRleHRzW3dlYkdMVmVyc2lvbl07XG59XG5leHBvcnQgZnVuY3Rpb24gc2V0V2ViR0xDb250ZXh0KHdlYkdMVmVyc2lvbiwgZ2wpIHtcbiAgICBjb250ZXh0c1t3ZWJHTFZlcnNpb25dID0gZ2w7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0V2ViR0xDb250ZXh0KHdlYkdMVmVyc2lvbikge1xuICAgIGlmICghKHdlYkdMVmVyc2lvbiBpbiBjb250ZXh0cykpIHtcbiAgICAgICAgY29uc3QgbmV3Q3R4ID0gZ2V0V2ViR0xSZW5kZXJpbmdDb250ZXh0KHdlYkdMVmVyc2lvbik7XG4gICAgICAgIGlmIChuZXdDdHggIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnRleHRzW3dlYkdMVmVyc2lvbl0gPSBuZXdDdHg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnQ291bGQgbm90IGdldCBjb250ZXh0IGZvciBXZWJHTCB2ZXJzaW9uJywgd2ViR0xWZXJzaW9uKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGdsID0gY29udGV4dHNbd2ViR0xWZXJzaW9uXTtcbiAgICBpZiAoZ2wuaXNDb250ZXh0TG9zdCgpKSB7XG4gICAgICAgIGRlbGV0ZSBjb250ZXh0c1t3ZWJHTFZlcnNpb25dO1xuICAgICAgICByZXR1cm4gZ2V0V2ViR0xDb250ZXh0KHdlYkdMVmVyc2lvbik7XG4gICAgfVxuICAgIGdsLmRpc2FibGUoZ2wuREVQVEhfVEVTVCk7XG4gICAgZ2wuZGlzYWJsZShnbC5TVEVOQ0lMX1RFU1QpO1xuICAgIGdsLmRpc2FibGUoZ2wuQkxFTkQpO1xuICAgIGdsLmRpc2FibGUoZ2wuRElUSEVSKTtcbiAgICBnbC5kaXNhYmxlKGdsLlBPTFlHT05fT0ZGU0VUX0ZJTEwpO1xuICAgIGdsLmRpc2FibGUoZ2wuU0FNUExFX0NPVkVSQUdFKTtcbiAgICBnbC5lbmFibGUoZ2wuU0NJU1NPUl9URVNUKTtcbiAgICBnbC5lbmFibGUoZ2wuQ1VMTF9GQUNFKTtcbiAgICBnbC5jdWxsRmFjZShnbC5CQUNLKTtcbiAgICByZXR1cm4gY29udGV4dHNbd2ViR0xWZXJzaW9uXTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUNhbnZhcyh3ZWJHTFZlcnNpb24pIHtcbiAgICBpZiAodHlwZW9mIE9mZnNjcmVlbkNhbnZhcyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2ViR0xWZXJzaW9uID09PSAyKSB7XG4gICAgICAgIHJldHVybiBuZXcgT2Zmc2NyZWVuQ2FudmFzKDMwMCwgMTUwKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjcmVhdGUgYSBjYW52YXMgaW4gdGhpcyBjb250ZXh0Jyk7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0V2ViR0xSZW5kZXJpbmdDb250ZXh0KHdlYkdMVmVyc2lvbikge1xuICAgIGlmICh3ZWJHTFZlcnNpb24gIT09IDEgJiYgd2ViR0xWZXJzaW9uICE9PSAyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGdldCBXZWJHTCByZW5kZXJpbmcgY29udGV4dCwgV2ViR0wgaXMgZGlzYWJsZWQuJyk7XG4gICAgfVxuICAgIGNvbnN0IGNhbnZhcyA9IGNyZWF0ZUNhbnZhcyh3ZWJHTFZlcnNpb24pO1xuICAgIGNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCd3ZWJnbGNvbnRleHRsb3N0JywgKGV2KSA9PiB7XG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGRlbGV0ZSBjb250ZXh0c1t3ZWJHTFZlcnNpb25dO1xuICAgIH0sIGZhbHNlKTtcbiAgICBpZiAod2ViR0xWZXJzaW9uID09PSAxKSB7XG4gICAgICAgIHJldHVybiAoY2FudmFzLmdldENvbnRleHQoJ3dlYmdsJywgV0VCR0xfQVRUUklCVVRFUykgfHxcbiAgICAgICAgICAgIGNhbnZhcy5nZXRDb250ZXh0KCdleHBlcmltZW50YWwtd2ViZ2wnLCBXRUJHTF9BVFRSSUJVVEVTKSk7XG4gICAgfVxuICAgIHJldHVybiBjYW52YXMuZ2V0Q29udGV4dCgnd2ViZ2wyJywgV0VCR0xfQVRUUklCVVRFUyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jYW52YXNfdXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5leHBvcnQgY2xhc3MgQ2xpcFByb2dyYW0ge1xuICAgIGNvbnN0cnVjdG9yKGFTaGFwZSkge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgICAgICAgdGhpcy5jdXN0b21Vbmlmb3JtcyA9IFtcbiAgICAgICAgICAgIHsgbmFtZTogJ21pblZhbCcsIHR5cGU6ICdmbG9hdCcgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ21heFZhbCcsIHR5cGU6ICdmbG9hdCcgfVxuICAgICAgICBdO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gYVNoYXBlO1xuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGZsb2F0IHZhbHVlID0gZ2V0QUF0T3V0Q29vcmRzKCk7XG4gICAgICAgIGlmIChpc25hbih2YWx1ZSkpIHtcbiAgICAgICAgICBzZXRPdXRwdXQodmFsdWUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHNldE91dHB1dChjbGFtcCh2YWx1ZSwgbWluVmFsLCBtYXhWYWwpKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNsaXBfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmV4cG9ydCBjbGFzcyBDbGlwUGFja2VkUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoYVNoYXBlKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICAgICAgICB0aGlzLnBhY2tlZElucHV0cyA9IHRydWU7XG4gICAgICAgIHRoaXMucGFja2VkT3V0cHV0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jdXN0b21Vbmlmb3JtcyA9IFtcbiAgICAgICAgICAgIHsgbmFtZTogJ21pblZhbCcsIHR5cGU6ICdmbG9hdCcgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ21heFZhbCcsIHR5cGU6ICdmbG9hdCcgfVxuICAgICAgICBdO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gYVNoYXBlO1xuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICB2ZWM0IHZhbHVlID0gZ2V0QUF0T3V0Q29vcmRzKCk7XG5cbiAgICAgICAgaWYgKGFueShpc25hbih2YWx1ZSkpKSB7XG4gICAgICAgICAgc2V0T3V0cHV0KHZhbHVlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBzZXRPdXRwdXQoY2xhbXAodmFsdWUsIHZlYzQobWluVmFsKSwgdmVjNChtYXhWYWwpKSk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jbGlwX3BhY2tlZF9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuZXhwb3J0IGNsYXNzIENvbXBsZXhBYnNQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3RvcihzaGFwZSkge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ3JlYWwnLCAnaW1hZyddO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gc2hhcGU7XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGZsb2F0IHJlID0gYWJzKGdldFJlYWxBdE91dENvb3JkcygpKTtcbiAgICAgICAgZmxvYXQgaW0gPSBhYnMoZ2V0SW1hZ0F0T3V0Q29vcmRzKCkpO1xuICAgICAgICBmbG9hdCBteCA9IG1heChyZSwgaW0pO1xuXG4gICAgICAgIC8vIHNhZGx5IHRoZSBsZW5ndGggZnVuY3Rpb24gaW4gZ2xzbCBpcyBub3QgdW5kZXJmbG93LXNhZmVcbiAgICAgICAgLy8gKGF0IGxlYXN0IG5vdCBvbiBJbnRlbCBHUFVzKS4gU28gdGhlIHNhZmUgc29sdXRpb24gaXNcbiAgICAgICAgLy8gdG8gZW5zdXJlIHVuZGVyZmxvdy1zYWZldHkgaW4gYWxsIGNhc2VzLlxuICAgICAgICBzZXRPdXRwdXQoXG4gICAgICAgICAgbXggPT0gMC4wID8gMC4wIDogbXggKiBsZW5ndGgodmVjMigxLCBtaW4ocmUsIGltKS9teCkpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb21wbGV4X2Fic19ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBjbGFzcyBDb25jYXRQcm9ncmFtIHtcbiAgICAvLyBDb25jYXRzIDJkIHRlbnNvcnMgYWxvbmcgYXhpcz0xLiBTZWUgY29tbWVudHMgaW4gTWF0aEJhY2tlbmRXZWJHTC5jb25jYXQoKS5cbiAgICBjb25zdHJ1Y3RvcihzaGFwZXMpIHtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IFtdO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gYmFja2VuZF91dGlsLmNvbXB1dGVPdXRTaGFwZShzaGFwZXMsIDEgLyogYXhpcyAqLyk7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IHNoYXBlcy5tYXAoKF8sIGkpID0+IGBUJHtpfWApO1xuICAgICAgICBjb25zdCBvZmZzZXRzID0gbmV3IEFycmF5KHNoYXBlcy5sZW5ndGggLSAxKTtcbiAgICAgICAgb2Zmc2V0c1swXSA9IHNoYXBlc1swXVsxXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBvZmZzZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBvZmZzZXRzW2ldID0gb2Zmc2V0c1tpIC0gMV0gKyBzaGFwZXNbaV1bMV07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc25pcHBldHMgPSBbYGlmICh5QyA8ICR7b2Zmc2V0c1swXX0pIHNldE91dHB1dChnZXRUMCh5UiwgeUMpKTtgXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBvZmZzZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzaGlmdCA9IG9mZnNldHNbaSAtIDFdO1xuICAgICAgICAgICAgc25pcHBldHMucHVzaChgZWxzZSBpZiAoeUMgPCAke29mZnNldHNbaV19KSBgICtcbiAgICAgICAgICAgICAgICBgc2V0T3V0cHV0KGdldFQke2l9KHlSLCB5Qy0ke3NoaWZ0fSkpO2ApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxhc3RJbmRleCA9IG9mZnNldHMubGVuZ3RoO1xuICAgICAgICBjb25zdCBsYXN0U2hpZnQgPSBvZmZzZXRzW29mZnNldHMubGVuZ3RoIC0gMV07XG4gICAgICAgIHNuaXBwZXRzLnB1c2goYGVsc2Ugc2V0T3V0cHV0KGdldFQke2xhc3RJbmRleH0oeVIsIHlDLSR7bGFzdFNoaWZ0fSkpO2ApO1xuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMiBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IHlSID0gY29vcmRzLng7XG4gICAgICAgIGludCB5QyA9IGNvb3Jkcy55O1xuXG4gICAgICAgICR7c25pcHBldHMuam9pbignXFxuICAgICAgICAnKX1cbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbmNhdF9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGdldENoYW5uZWxzIH0gZnJvbSAnLi9wYWNraW5nX3V0aWwnO1xuaW1wb3J0IHsgZ2V0Q29vcmRzRGF0YVR5cGUgfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5leHBvcnQgY2xhc3MgQ29uY2F0UGFja2VkUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3Ioc2hhcGVzLCBheGlzKSB7XG4gICAgICAgIHRoaXMucGFja2VkSW5wdXRzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wYWNrZWRPdXRwdXQgPSB0cnVlO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gW107XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dFNoYXBlKHNoYXBlcywgYXhpcyk7XG4gICAgICAgIGNvbnN0IHNoYXBlID0gdGhpcy5vdXRwdXRTaGFwZTtcbiAgICAgICAgY29uc3QgcmFuayA9IHNoYXBlLmxlbmd0aDtcbiAgICAgICAgY29uc3QgZHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShyYW5rKTtcbiAgICAgICAgY29uc3QgY29vcmRzID0gZ2V0Q2hhbm5lbHMoJ2Nvb3JkcycsIHJhbmspO1xuICAgICAgICBjb25zdCBjaGFubmVscyA9IFsneCcsICd5JywgJ3onLCAndycsICd1JywgJ3YnXS5zbGljZSgwLCByYW5rKTtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gc2hhcGVzLm1hcCgoXywgaSkgPT4gYFQke2l9YCk7XG4gICAgICAgIGNvbnN0IG9mZnNldHMgPSBuZXcgQXJyYXkoc2hhcGVzLmxlbmd0aCAtIDEpO1xuICAgICAgICBvZmZzZXRzWzBdID0gc2hhcGVzWzBdW2F4aXNdO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IG9mZnNldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIG9mZnNldHNbaV0gPSBvZmZzZXRzW2kgLSAxXSArIHNoYXBlc1tpXVtheGlzXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjaGFubmVsID0gY2hhbm5lbHNbYXhpc107XG4gICAgICAgIGNvbnN0IGxhc3RDaGFubmVscyA9IGNoYW5uZWxzLnNsaWNlKC0yKTtcbiAgICAgICAgY29uc3QgYWxsQ2hhbm5lbHMgPSBjaGFubmVscy5qb2luKCk7XG4gICAgICAgIGxldCBnZXRWYWx1ZVNuaXBwZXQgPSBgaWYgKCR7Y2hhbm5lbH0gPCAke29mZnNldHNbMF19KSB7XG4gICAgICAgIHJldHVybiBnZXRDaGFubmVsKFxuICAgICAgICAgICAgZ2V0VDAoJHthbGxDaGFubmVsc30pLCB2ZWMyKCR7bGFzdENoYW5uZWxzLmpvaW4oKX0pKTtcbiAgICAgICAgfWA7XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgb2Zmc2V0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgc2hpZnQgPSBvZmZzZXRzW2kgLSAxXTtcbiAgICAgICAgICAgIC8vIE5vdGU6IHRoZSA+PSBjb21wYXJpc29uIGJlbG93IG1heSBzZWVtIHVubmVjZXNzYXJ5IGdpdmVuIHRoZSBjaGVja1xuICAgICAgICAgICAgLy8gYWJvdmUgYnV0IGlzIG5lZWRlZCB0byB3b3JrYXJvdW5kIGJyYW5jaCBleGVjdXRpb24gaXNzdWVzIG9uIHNvbWVcbiAgICAgICAgICAgIC8vIGRldmljZXMuIEl0IG1ha2VzIGFsbCB0aGUgY29uZGl0aW9ucyBleGNsdXNpdmUgd2l0aG91dCByZWx5aW5nIG9uXG4gICAgICAgICAgICAvLyBleGVjdXRpb24gb3JkZXIuXG4gICAgICAgICAgICBnZXRWYWx1ZVNuaXBwZXQgKz0gYFxuICAgICAgICBpZiAoJHtjaGFubmVsfSA8ICR7b2Zmc2V0c1tpXX0gICYmICR7Y2hhbm5lbH0gPj0gJHtvZmZzZXRzW2kgLSAxXX0pIHtcbiAgICAgICAgICByZXR1cm4gZ2V0Q2hhbm5lbChcbiAgICAgICAgICAgIGdldFQke2l9KCR7c2hpZnRlZENoYW5uZWxzKGNoYW5uZWxzLCBjaGFubmVsLCBzaGlmdCl9KSxcbiAgICAgICAgICAgIHZlYzIoJHtzaGlmdGVkQ2hhbm5lbHMobGFzdENoYW5uZWxzLCBjaGFubmVsLCBzaGlmdCl9KSk7XG4gICAgICAgIH1gO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxhc3RJbmRleCA9IG9mZnNldHMubGVuZ3RoO1xuICAgICAgICBjb25zdCBzaGlmdCA9IG9mZnNldHNbb2Zmc2V0cy5sZW5ndGggLSAxXTtcbiAgICAgICAgZ2V0VmFsdWVTbmlwcGV0ICs9IGBcbiAgICAgICAgcmV0dXJuIGdldENoYW5uZWwoXG4gICAgICAgICAgZ2V0VCR7bGFzdEluZGV4fSgke3NoaWZ0ZWRDaGFubmVscyhjaGFubmVscywgY2hhbm5lbCwgc2hpZnQpfSksXG4gICAgICAgICAgdmVjMigke3NoaWZ0ZWRDaGFubmVscyhsYXN0Q2hhbm5lbHMsIGNoYW5uZWwsIHNoaWZ0KX0pKTtgO1xuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgZmxvYXQgZ2V0VmFsdWUoJHtjaGFubmVscy5tYXAoeCA9PiAnaW50ICcgKyB4KX0pIHtcbiAgICAgICAgJHtnZXRWYWx1ZVNuaXBwZXR9XG4gICAgICB9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgJHtkdHlwZX0gY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIHZlYzQgcmVzdWx0ID0gdmVjNChnZXRWYWx1ZSgke2Nvb3Jkc30pLCAwLiwgMC4sIDAuKTtcblxuICAgICAgICAke2Nvb3Jkc1tyYW5rIC0gMV19ID0gJHtjb29yZHNbcmFuayAtIDFdfSArIDE7XG4gICAgICAgIGlmICgke2Nvb3Jkc1tyYW5rIC0gMV19IDwgJHtzaGFwZVtyYW5rIC0gMV19KSB7XG4gICAgICAgICAgcmVzdWx0LmcgPSBnZXRWYWx1ZSgke2Nvb3Jkc30pO1xuICAgICAgICB9XG5cbiAgICAgICAgJHtjb29yZHNbcmFuayAtIDJdfSA9ICR7Y29vcmRzW3JhbmsgLSAyXX0gKyAxO1xuICAgICAgICBpZiAoJHtjb29yZHNbcmFuayAtIDJdfSA8ICR7c2hhcGVbcmFuayAtIDJdfSkge1xuICAgICAgICAgIHJlc3VsdC5hID0gZ2V0VmFsdWUoJHtjb29yZHN9KTtcbiAgICAgICAgfVxuXG4gICAgICAgICR7Y29vcmRzW3JhbmsgLSAxXX0gPSAke2Nvb3Jkc1tyYW5rIC0gMV19IC0gMTtcbiAgICAgICAgaWYgKCR7Y29vcmRzW3JhbmsgLSAyXX0gPCAke3NoYXBlW3JhbmsgLSAyXX0gJiZcbiAgICAgICAgICAgICR7Y29vcmRzW3JhbmsgLSAxXX0gPCAke3NoYXBlW3JhbmsgLSAxXX0pIHtcbiAgICAgICAgICByZXN1bHQuYiA9IGdldFZhbHVlKCR7Y29vcmRzfSk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0T3V0cHV0KHJlc3VsdCk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG4vKipcbiAqIFJldHVybiBhbiBleHByZXNzaW9uIGZvciBjb29yZGluYXRlcyBpbnRvIGEgdmVjdG9yIHdoZXJlIGEgZ2l2ZW4gY2hhbm5lbFxuICogd2lsbCBiZSBvZmZzZXQgYnkgW3NoaWZ0XS5cbiAqXG4gKiBAcGFyYW0gY2hhbm5lbHMgdGhlIGNoYW5uZWxzIHRvIGNvbnNpZGVyXG4gKiBAcGFyYW0gY2hhbm5lbCB0aGUgY2hhbm5lbCB3ZSB3YW50IHNoaWZ0ZWRcbiAqIEBwYXJhbSBzaGlmdCAgdGhlIGFtb3VudCB0byBzdWJ0cmFjdCBmcm9tIHRoZSBjaGFubmVsLlxuICpcbiAqIEByZXR1cm5zIGEgc3RyaW5nIG9mIHRoZSBmb3JtICd4LCB5LVtzaGlmdF0sIHonIHdoZXJlIGFueSBvbmUgY2hhbm5lbCBjYW5cbiAqIGhhdmUgdGhlIHNoaWZ0IGFwcGxpZWQuXG4gKi9cbmZ1bmN0aW9uIHNoaWZ0ZWRDaGFubmVscyhjaGFubmVscywgY2hhbm5lbCwgc2hpZnQpIHtcbiAgICBjb25zdCBjaGFubmVsSWR4ID0gY2hhbm5lbHMuaW5kZXhPZihjaGFubmVsKTtcbiAgICBjb25zdCByZXMgPSBjaGFubmVscy5tYXAoKGMsIGlkeCkgPT4ge1xuICAgICAgICBpZiAoaWR4ID09PSBjaGFubmVsSWR4KSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7Y30gLSAke3NoaWZ0fWA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gYztcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXMuam9pbigpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uY2F0X3BhY2tlZF9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuZXhwb3J0IGNsYXNzIENvbnYyRERlckZpbHRlclByb2dyYW0ge1xuICAgIGNvbnN0cnVjdG9yKGNvbnZJbmZvKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsneCcsICdkeSddO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gY29udkluZm8uZmlsdGVyU2hhcGU7XG4gICAgICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICAgICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICAgICAgY29uc3QgcGFkVG9wID0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgICAgIGNvbnN0IHBhZExlZnQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgICAgIGNvbnN0IGlzQ2hhbm5lbHNMYXN0ID0gY29udkluZm8uZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzTGFzdCc7XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgd1IgPSBjb29yZHMueDtcbiAgICAgICAgaW50IHdDID0gY29vcmRzLnk7XG4gICAgICAgIGludCBkMSA9IGNvb3Jkcy56O1xuICAgICAgICBpbnQgZDIgPSBjb29yZHMudztcblxuICAgICAgICAvLyBDb252b2x2ZSB4KD8sID8sIGQxKSB3aXRoIGR5KDosIDosIGQyKSB0byBnZXQgZHcod1IsIHdDLCBkMSwgZDIpLlxuICAgICAgICAvLyA/ID0gdG8gYmUgZGV0ZXJtaW5lZC4gOiA9IGFjcm9zcyBhbGwgdmFsdWVzIGluIHRoYXQgYXhpcy5cbiAgICAgICAgZmxvYXQgZG90UHJvZCA9IDAuMDtcblxuICAgICAgICBmb3IgKGludCBiID0gMDsgYiA8ICR7Y29udkluZm8uYmF0Y2hTaXplfTsgYisrKSB7XG4gICAgICAgICAgZm9yIChpbnQgeVIgPSAwOyB5UiA8ICR7Y29udkluZm8ub3V0SGVpZ2h0fTsgeVIrKykge1xuICAgICAgICAgICAgaW50IHhSID0gd1IgKyB5UiAqICR7c3RyaWRlSGVpZ2h0fSAtICR7cGFkVG9wfTtcblxuICAgICAgICAgICAgaWYgKHhSIDwgMCB8fCB4UiA+PSAke2NvbnZJbmZvLmluSGVpZ2h0fSkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChpbnQgeUMgPSAwOyB5QyA8ICR7Y29udkluZm8ub3V0V2lkdGh9OyB5QysrKSB7XG4gICAgICAgICAgICAgIGludCB4QyA9IHdDICsgeUMgKiAke3N0cmlkZVdpZHRofSAtICR7cGFkTGVmdH07XG5cbiAgICAgICAgICAgICAgaWYgKHhDIDwgMCB8fCB4QyA+PSAke2NvbnZJbmZvLmluV2lkdGh9KSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoJHtpc0NoYW5uZWxzTGFzdH0pIHtcbiAgICAgICAgICAgICAgICBmbG9hdCBkeVZhbHVlID0gZ2V0RHkoYiwgeVIsIHlDLCBkMik7XG4gICAgICAgICAgICAgICAgZmxvYXQgeFZhbHVlID0gZ2V0WChiLCB4UiwgeEMsIGQxKTtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9ICh4VmFsdWUgKiBkeVZhbHVlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmbG9hdCBkeVZhbHVlID0gZ2V0RHkoYiwgZDIsIHlSLCB5Qyk7XG4gICAgICAgICAgICAgICAgZmxvYXQgeFZhbHVlID0gZ2V0WChiLCBkMSwgeFIsIHhDKTtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9ICh4VmFsdWUgKiBkeVZhbHVlKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNldE91dHB1dChkb3RQcm9kKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBDb252MkREZXJJbnB1dFByb2dyYW0ge1xuICAgIGNvbnN0cnVjdG9yKGNvbnZJbmZvKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsnZHknLCAnVyddO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gY29udkluZm8uaW5TaGFwZTtcbiAgICAgICAgY29uc3QgZmlsdGVySGVpZ2h0ID0gY29udkluZm8uZmlsdGVySGVpZ2h0O1xuICAgICAgICBjb25zdCBmaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmZpbHRlcldpZHRoO1xuICAgICAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgICAgIGNvbnN0IGlzQ2hhbm5lbHNMYXN0ID0gY29udkluZm8uZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzTGFzdCc7XG4gICAgICAgIGNvbnN0IHBhZFRvcCA9IGZpbHRlckhlaWdodCAtIDEgLSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICAgICAgY29uc3QgcGFkTGVmdCA9IGZpbHRlcldpZHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICAgICAgY29uc3Qgcm93RGltID0gaXNDaGFubmVsc0xhc3QgPyAxIDogMjtcbiAgICAgICAgY29uc3QgY29sRGltID0gaXNDaGFubmVsc0xhc3QgPyAyIDogMztcbiAgICAgICAgY29uc3QgY2hhbm5lbERpbSA9IGlzQ2hhbm5lbHNMYXN0ID8gMyA6IDE7XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCBpdmVjMiBwYWRzID0gaXZlYzIoJHtwYWRUb3B9LCAke3BhZExlZnR9KTtcblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgZDEgPSBjb29yZHNbJHtjaGFubmVsRGltfV07XG5cbiAgICAgICAgaXZlYzIgZHlDb3JuZXIgPSBpdmVjMihjb29yZHNbJHtyb3dEaW19XSwgY29vcmRzWyR7Y29sRGltfV0pIC0gcGFkcztcbiAgICAgICAgaW50IGR5UkNvcm5lciA9IGR5Q29ybmVyLng7XG4gICAgICAgIGludCBkeUNDb3JuZXIgPSBkeUNvcm5lci55O1xuXG4gICAgICAgIC8vIENvbnZvbHZlIGR5KD8sID8sIGQyKSB3aXRoIHcoOiwgOiwgZDEsIGQyKSB0byBjb21wdXRlIGR4KHhSLCB4QywgZDEpLlxuICAgICAgICAvLyA/ID0gdG8gYmUgZGV0ZXJtaW5lZC4gOiA9IGFjcm9zcyBhbGwgdmFsdWVzIGluIHRoYXQgYXhpcy5cbiAgICAgICAgZmxvYXQgZG90UHJvZCA9IDAuMDtcbiAgICAgICAgZm9yIChpbnQgd1IgPSAwOyB3UiA8ICR7ZmlsdGVySGVpZ2h0fTsgd1IrKykge1xuICAgICAgICAgIGZsb2F0IGR5UiA9IGZsb2F0KGR5UkNvcm5lciArIHdSKSAvICR7c3RyaWRlSGVpZ2h0fS4wO1xuXG4gICAgICAgICAgaWYgKGR5UiA8IDAuMCB8fCBkeVIgPj0gJHtjb252SW5mby5vdXRIZWlnaHR9LjAgfHwgZnJhY3QoZHlSKSA+IDAuMCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGludCBpZHlSID0gaW50KGR5Uik7XG5cbiAgICAgICAgICBpbnQgd1JQZXJtID0gJHtmaWx0ZXJIZWlnaHR9IC0gMSAtIHdSO1xuXG4gICAgICAgICAgZm9yIChpbnQgd0MgPSAwOyB3QyA8ICR7ZmlsdGVyV2lkdGh9OyB3QysrKSB7XG4gICAgICAgICAgICBmbG9hdCBkeUMgPSBmbG9hdChkeUNDb3JuZXIgKyB3QykgLyAke3N0cmlkZVdpZHRofS4wO1xuXG4gICAgICAgICAgICBpZiAoZHlDIDwgMC4wIHx8IGR5QyA+PSAke2NvbnZJbmZvLm91dFdpZHRofS4wIHx8XG4gICAgICAgICAgICAgICAgZnJhY3QoZHlDKSA+IDAuMCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGludCBpZHlDID0gaW50KGR5Qyk7XG5cbiAgICAgICAgICAgIGludCB3Q1Blcm0gPSAke2ZpbHRlcldpZHRofSAtIDEgLSB3QztcblxuICAgICAgICAgICAgZm9yIChpbnQgZDIgPSAwOyBkMiA8ICR7Y29udkluZm8ub3V0Q2hhbm5lbHN9OyBkMisrKSB7XG5cbiAgICAgICAgICAgICAgaWYgKCR7aXNDaGFubmVsc0xhc3R9KSB7XG4gICAgICAgICAgICAgICAgZmxvYXQgeFZhbHVlID0gZ2V0RHkoYmF0Y2gsIGlkeVIsIGlkeUMsIGQyKTtcbiAgICAgICAgICAgICAgICBmbG9hdCB3VmFsdWUgPSBnZXRXKHdSUGVybSwgd0NQZXJtLCBkMSwgZDIpO1xuICAgICAgICAgICAgICAgIGRvdFByb2QgKz0geFZhbHVlICogd1ZhbHVlO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZsb2F0IHhWYWx1ZSA9IGdldER5KGJhdGNoLCBkMiwgaWR5UiwgaWR5Qyk7XG4gICAgICAgICAgICAgICAgZmxvYXQgd1ZhbHVlID0gZ2V0Vyh3UlBlcm0sIHdDUGVybSwgZDEsIGQyKTtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9IHhWYWx1ZSAqIHdWYWx1ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNldE91dHB1dChkb3RQcm9kKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBDb252M0REZXJGaWx0ZXJQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3Rvcihjb252SW5mbykge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ3gnLCAnZHknXTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IGNvbnZJbmZvLmZpbHRlclNoYXBlO1xuICAgICAgICBjb25zdCBzdHJpZGVEZXB0aCA9IGNvbnZJbmZvLnN0cmlkZURlcHRoO1xuICAgICAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgICAgIGNvbnN0IHBhZEZyb250ID0gY29udkluZm8ucGFkSW5mby5mcm9udDtcbiAgICAgICAgY29uc3QgcGFkVG9wID0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgICAgIGNvbnN0IHBhZExlZnQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM1IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgd0YgPSBjb29yZHMueDtcbiAgICAgICAgaW50IHdSID0gY29vcmRzLnk7XG4gICAgICAgIGludCB3QyA9IGNvb3Jkcy56O1xuICAgICAgICBpbnQgZDEgPSBjb29yZHMudztcbiAgICAgICAgaW50IGQyID0gY29vcmRzLnU7XG5cbiAgICAgICAgZmxvYXQgZG90UHJvZCA9IDAuMDtcblxuICAgICAgICBmb3IgKGludCBiID0gMDsgYiA8ICR7Y29udkluZm8uYmF0Y2hTaXplfTsgYisrKSB7XG4gICAgICAgICAgZm9yIChpbnQgeUYgPSAwOyB5RiA8ICR7Y29udkluZm8ub3V0RGVwdGh9OyB5RisrKSB7XG4gICAgICAgICAgICBpbnQgeEYgPSB3RiArIHlGICogJHtzdHJpZGVEZXB0aH0gLSAke3BhZEZyb250fTtcblxuICAgICAgICAgICAgaWYgKHhGIDwgMCB8fCB4RiA+PSAke2NvbnZJbmZvLmluRGVwdGh9KSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGludCB5UiA9IDA7IHlSIDwgJHtjb252SW5mby5vdXRIZWlnaHR9OyB5UisrKSB7XG4gICAgICAgICAgICAgIGludCB4UiA9IHdSICsgeVIgKiAke3N0cmlkZUhlaWdodH0gLSAke3BhZFRvcH07XG5cbiAgICAgICAgICAgICAgaWYgKHhSIDwgMCB8fCB4UiA+PSAke2NvbnZJbmZvLmluSGVpZ2h0fSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZm9yIChpbnQgeUMgPSAwOyB5QyA8ICR7Y29udkluZm8ub3V0V2lkdGh9OyB5QysrKSB7XG4gICAgICAgICAgICAgICAgaW50IHhDID0gd0MgKyB5QyAqICR7c3RyaWRlV2lkdGh9IC0gJHtwYWRMZWZ0fTtcblxuICAgICAgICAgICAgICAgIGlmICh4QyA8IDAgfHwgeEMgPj0gJHtjb252SW5mby5pbldpZHRofSkge1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZmxvYXQgZHlWYWx1ZSA9IGdldER5KGIsIHlGLCB5UiwgeUMsIGQyKTtcbiAgICAgICAgICAgICAgICBmbG9hdCB4VmFsdWUgPSBnZXRYKGIsIHhGLCB4UiwgeEMsIGQxKTtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9ICh4VmFsdWUgKiBkeVZhbHVlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQoZG90UHJvZCk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgQ29udjNERGVySW5wdXRQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3Rvcihjb252SW5mbykge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ2R5JywgJ1cnXTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IGNvbnZJbmZvLmluU2hhcGU7XG4gICAgICAgIGNvbnN0IGZpbHRlckRlcHRoID0gY29udkluZm8uZmlsdGVyRGVwdGg7XG4gICAgICAgIGNvbnN0IGZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmZpbHRlckhlaWdodDtcbiAgICAgICAgY29uc3QgZmlsdGVyV2lkdGggPSBjb252SW5mby5maWx0ZXJXaWR0aDtcbiAgICAgICAgY29uc3Qgc3RyaWRlRGVwdGggPSBjb252SW5mby5zdHJpZGVEZXB0aDtcbiAgICAgICAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICAgICAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICAgICAgICBjb25zdCBwYWRGcm9udCA9IGZpbHRlckRlcHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8uZnJvbnQ7XG4gICAgICAgIGNvbnN0IHBhZFRvcCA9IGZpbHRlckhlaWdodCAtIDEgLSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICAgICAgY29uc3QgcGFkTGVmdCA9IGZpbHRlcldpZHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IGl2ZWMzIHBhZHMgPSBpdmVjMygke3BhZEZyb250fSwgJHtwYWRUb3B9LCAke3BhZExlZnR9KTtcblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjNSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzLng7XG4gICAgICAgIGludCBkMSA9IGNvb3Jkcy51O1xuXG5cbiAgICAgICAgaXZlYzMgZHlDb3JuZXIgPSBpdmVjMyhjb29yZHMueSwgY29vcmRzLnosIGNvb3Jkcy53KSAtIHBhZHM7XG4gICAgICAgIGludCBkeUZDb3JuZXIgPSBkeUNvcm5lci54O1xuICAgICAgICBpbnQgZHlSQ29ybmVyID0gZHlDb3JuZXIueTtcbiAgICAgICAgaW50IGR5Q0Nvcm5lciA9IGR5Q29ybmVyLno7XG5cbiAgICAgICAgZmxvYXQgZG90UHJvZCA9IDAuMDtcbiAgICAgICAgZm9yIChpbnQgd0YgPSAwOyB3RiA8ICR7ZmlsdGVyRGVwdGh9OyB3RisrKSB7XG4gICAgICAgICAgZmxvYXQgZHlGID0gZmxvYXQoZHlGQ29ybmVyICsgd0YpIC8gJHtzdHJpZGVEZXB0aH0uMDtcblxuICAgICAgICAgIGlmIChkeUYgPCAwLjAgfHwgZHlGID49ICR7Y29udkluZm8ub3V0RGVwdGh9LjAgfHwgZnJhY3QoZHlGKSA+IDAuMCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGludCBpZHlGID0gaW50KGR5Rik7XG5cbiAgICAgICAgICBpbnQgd0ZQZXJtID0gJHtmaWx0ZXJEZXB0aH0gLSAxIC0gd0Y7XG5cbiAgICAgICAgICBmb3IgKGludCB3UiA9IDA7IHdSIDwgJHtmaWx0ZXJIZWlnaHR9OyB3UisrKSB7XG4gICAgICAgICAgICBmbG9hdCBkeVIgPSBmbG9hdChkeVJDb3JuZXIgKyB3UikgLyAke3N0cmlkZUhlaWdodH0uMDtcblxuICAgICAgICAgICAgaWYgKGR5UiA8IDAuMCB8fCBkeVIgPj0gJHtjb252SW5mby5vdXRIZWlnaHR9LjAgfHxcbiAgICAgICAgICAgICAgZnJhY3QoZHlSKSA+IDAuMCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGludCBpZHlSID0gaW50KGR5Uik7XG5cbiAgICAgICAgICAgIGludCB3UlBlcm0gPSAke2ZpbHRlckhlaWdodH0gLSAxIC0gd1I7XG5cbiAgICAgICAgICAgIGZvciAoaW50IHdDID0gMDsgd0MgPCAke2ZpbHRlcldpZHRofTsgd0MrKykge1xuICAgICAgICAgICAgICBmbG9hdCBkeUMgPSBmbG9hdChkeUNDb3JuZXIgKyB3QykgLyAke3N0cmlkZVdpZHRofS4wO1xuXG4gICAgICAgICAgICAgIGlmIChkeUMgPCAwLjAgfHwgZHlDID49ICR7Y29udkluZm8ub3V0V2lkdGh9LjAgfHxcbiAgICAgICAgICAgICAgICAgIGZyYWN0KGR5QykgPiAwLjApIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpbnQgaWR5QyA9IGludChkeUMpO1xuXG4gICAgICAgICAgICAgIGludCB3Q1Blcm0gPSAke2ZpbHRlcldpZHRofSAtIDEgLSB3QztcblxuICAgICAgICAgICAgICBmb3IgKGludCBkMiA9IDA7IGQyIDwgJHtjb252SW5mby5vdXRDaGFubmVsc307IGQyKyspIHtcbiAgICAgICAgICAgICAgICBmbG9hdCB4VmFsdWUgPSBnZXREeShiYXRjaCwgaWR5RiwgaWR5UiwgaWR5QywgZDIpO1xuICAgICAgICAgICAgICAgIGZsb2F0IHdWYWx1ZSA9IGdldFcod0ZQZXJtLCB3UlBlcm0sIHdDUGVybSwgZDEsIGQyKTtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9IHhWYWx1ZSAqIHdWYWx1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQoZG90UHJvZCk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb252X2JhY2twcm9wX2dwdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5leHBvcnQgY2xhc3MgRGVwdGh3aXNlQ29udjJERGVyRmlsdGVyUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoY29udkluZm8pIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWyd4JywgJ2R5J107XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5maWx0ZXJTaGFwZTtcbiAgICAgICAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICAgICAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICAgICAgICBjb25zdCBwYWRUb3AgPSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICAgICAgY29uc3QgcGFkTGVmdCA9IGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICAgICAgY29uc3QgY2hhbm5lbE11bCA9IGNvbnZJbmZvLm91dENoYW5uZWxzIC8gY29udkluZm8uaW5DaGFubmVscztcbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCB3UiA9IGNvb3Jkcy54O1xuICAgICAgICBpbnQgd0MgPSBjb29yZHMueTtcbiAgICAgICAgaW50IGQxID0gY29vcmRzLno7XG4gICAgICAgIGludCBkbSA9IGNvb3Jkcy53O1xuICAgICAgICBpbnQgZDIgPSBkMSAqICR7Y2hhbm5lbE11bH0gKyBkbTtcblxuICAgICAgICBmbG9hdCBkb3RQcm9kID0gMC4wO1xuXG4gICAgICAgIC8vIFRPIERPOiBWZWM0IG92ZXIgdGhlIGJhdGNoIHNpemVcbiAgICAgICAgZm9yIChpbnQgYiA9IDA7IGIgPCAke2NvbnZJbmZvLmJhdGNoU2l6ZX07IGIrKykge1xuICAgICAgICAgIGZvciAoaW50IHlSID0gMDsgeVIgPCAke2NvbnZJbmZvLm91dEhlaWdodH07IHlSKyspIHtcbiAgICAgICAgICAgIGludCB4UiA9IHdSICsgeVIgKiAke3N0cmlkZUhlaWdodH0gLSAke3BhZFRvcH07XG5cbiAgICAgICAgICAgIGlmICh4UiA8IDAgfHwgeFIgPj0gJHtjb252SW5mby5pbkhlaWdodH0pIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoaW50IHlDID0gMDsgeUMgPCAke2NvbnZJbmZvLm91dFdpZHRofTsgeUMrKykge1xuICAgICAgICAgICAgICBpbnQgeEMgPSB3QyArIHlDICogJHtzdHJpZGVXaWR0aH0gLSAke3BhZExlZnR9O1xuXG4gICAgICAgICAgICAgIGlmICh4QyA8IDAgfHwgeEMgPj0gJHtjb252SW5mby5pbldpZHRofSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZmxvYXQgZHlWYWx1ZSA9IGdldER5KGIsIHlSLCB5QywgZDIpO1xuICAgICAgICAgICAgICBmbG9hdCB4VmFsdWUgPSBnZXRYKGIsIHhSLCB4QywgZDEpO1xuICAgICAgICAgICAgICBkb3RQcm9kICs9ICh4VmFsdWUgKiBkeVZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0T3V0cHV0KGRvdFByb2QpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIERlcHRod2lzZUNvbnYyRERlcklucHV0UHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoY29udkluZm8pIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWydkeScsICdXJ107XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5pblNoYXBlO1xuICAgICAgICBjb25zdCBmaWx0ZXJIZWlnaHQgPSBjb252SW5mby5maWx0ZXJIZWlnaHQ7XG4gICAgICAgIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG4gICAgICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICAgICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICAgICAgY29uc3QgcGFkVG9wID0gZmlsdGVySGVpZ2h0IC0gMSAtIGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgICAgICBjb25zdCBwYWRMZWZ0ID0gZmlsdGVyV2lkdGggLSAxIC0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgICAgICBjb25zdCBjaGFubmVsTXVsID0gY29udkluZm8ub3V0Q2hhbm5lbHMgLyBjb252SW5mby5pbkNoYW5uZWxzO1xuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgY29uc3QgaXZlYzIgcGFkcyA9IGl2ZWMyKCR7cGFkVG9wfSwgJHtwYWRMZWZ0fSk7XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiYXRjaCA9IGNvb3Jkc1swXTtcbiAgICAgICAgaW50IGQxID0gY29vcmRzWzNdO1xuICAgICAgICBpdmVjMiBkeUNvcm5lciA9IGNvb3Jkcy55eiAtIHBhZHM7XG4gICAgICAgIGludCBkeVJDb3JuZXIgPSBkeUNvcm5lci54O1xuICAgICAgICBpbnQgZHlDQ29ybmVyID0gZHlDb3JuZXIueTtcblxuICAgICAgICBmbG9hdCBkb3RQcm9kID0gMC4wO1xuXG4gICAgICAgIGZvciAoaW50IHdSID0gMDsgd1IgPCAke2ZpbHRlckhlaWdodH07IHdSKyspIHtcbiAgICAgICAgICBmbG9hdCBkeVIgPSBmbG9hdChkeVJDb3JuZXIgKyB3UikgLyAke3N0cmlkZUhlaWdodH0uMDtcblxuICAgICAgICAgIGlmIChkeVIgPCAwLjAgfHwgZHlSID49ICR7Y29udkluZm8ub3V0SGVpZ2h0fS4wIHx8IGZyYWN0KGR5UikgPiAwLjApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpbnQgaWR5UiA9IGludChkeVIpO1xuXG4gICAgICAgICAgaW50IHdSUGVybSA9ICR7ZmlsdGVySGVpZ2h0fSAtIDEgLSB3UjtcblxuICAgICAgICAgIGZvciAoaW50IHdDID0gMDsgd0MgPCAke2ZpbHRlcldpZHRofTsgd0MrKykge1xuICAgICAgICAgICAgZmxvYXQgZHlDID0gZmxvYXQoZHlDQ29ybmVyICsgd0MpIC8gJHtzdHJpZGVXaWR0aH0uMDtcblxuICAgICAgICAgICAgaWYgKGR5QyA8IDAuMCB8fCBkeUMgPj0gJHtjb252SW5mby5vdXRXaWR0aH0uMCB8fFxuICAgICAgICAgICAgICAgIGZyYWN0KGR5QykgPiAwLjApIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbnQgaWR5QyA9IGludChkeUMpO1xuXG4gICAgICAgICAgICBpbnQgd0NQZXJtID0gJHtmaWx0ZXJXaWR0aH0gLSAxIC0gd0M7XG5cbiAgICAgICAgICAgIC8vIFRPIERPOiBWZWM0IG92ZXIgdGhlIGNoYW5uZWxNdWxcbiAgICAgICAgICAgIGZvciAoaW50IGRtID0gMDsgZG0gPCAke2NoYW5uZWxNdWx9OyBkbSsrKSB7XG4gICAgICAgICAgICAgIGludCBkMiA9IGQxICogJHtjaGFubmVsTXVsfSArIGRtO1xuICAgICAgICAgICAgICBmbG9hdCB4VmFsdWUgPSBnZXREeShiYXRjaCwgaWR5UiwgaWR5QywgZDIpO1xuICAgICAgICAgICAgICBmbG9hdCB3VmFsdWUgPSBnZXRXKHdSUGVybSwgd0NQZXJtLCBkMSwgZG0pO1xuICAgICAgICAgICAgICBkb3RQcm9kICs9IHhWYWx1ZSAqIHdWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0T3V0cHV0KGRvdFByb2QpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29udl9iYWNrcHJvcF9ncHVfZGVwdGh3aXNlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmV4cG9ydCBjbGFzcyBDb252MkRQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3Rvcihjb252SW5mbywgYWRkQmlhcyA9IGZhbHNlLCBhY3RpdmF0aW9uID0gbnVsbCwgaGFzUHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyA9IGZhbHNlLCBoYXNMZWFreXJlbHVBbHBoYSA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsneCcsICdXJ107XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5vdXRTaGFwZTtcbiAgICAgICAgY29uc3QgcGFkVG9wID0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgICAgIGNvbnN0IHBhZExlZnQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICAgICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICAgICAgY29uc3QgZGlsYXRpb25IZWlnaHQgPSBjb252SW5mby5kaWxhdGlvbkhlaWdodDtcbiAgICAgICAgY29uc3QgZGlsYXRpb25XaWR0aCA9IGNvbnZJbmZvLmRpbGF0aW9uV2lkdGg7XG4gICAgICAgIGNvbnN0IGZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmZpbHRlckhlaWdodDtcbiAgICAgICAgY29uc3QgZmlsdGVyV2lkdGggPSBjb252SW5mby5maWx0ZXJXaWR0aDtcbiAgICAgICAgY29uc3QgaW5wdXREZXB0aE5lYXJlc3RWZWM0ID0gTWF0aC5mbG9vcihjb252SW5mby5pbkNoYW5uZWxzIC8gNCkgKiA0O1xuICAgICAgICBjb25zdCBpbnB1dERlcHRoVmVjNFJlbWFpbmRlciA9IGNvbnZJbmZvLmluQ2hhbm5lbHMgJSA0O1xuICAgICAgICBjb25zdCBpc0NoYW5uZWxzTGFzdCA9IGNvbnZJbmZvLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnO1xuICAgICAgICBjb25zdCByb3dEaW0gPSBpc0NoYW5uZWxzTGFzdCA/IDEgOiAyO1xuICAgICAgICBjb25zdCBjb2xEaW0gPSBpc0NoYW5uZWxzTGFzdCA/IDIgOiAzO1xuICAgICAgICBjb25zdCBjaGFubmVsRGltID0gaXNDaGFubmVsc0xhc3QgPyAzIDogMTtcbiAgICAgICAgbGV0IGFjdGl2YXRpb25TbmlwcGV0ID0gJycsIGFwcGx5QWN0aXZhdGlvblNuaXBwZXQgPSAnJztcbiAgICAgICAgaWYgKGFjdGl2YXRpb24pIHtcbiAgICAgICAgICAgIGlmIChoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzKSB7XG4gICAgICAgICAgICAgICAgYWN0aXZhdGlvblNuaXBwZXQgPSBgZmxvYXQgYWN0aXZhdGlvbihmbG9hdCBhKSB7XG4gICAgICAgICAgZmxvYXQgYiA9IGdldFByZWx1QWN0aXZhdGlvbldlaWdodHNBdE91dENvb3JkcygpO1xuICAgICAgICAgICR7YWN0aXZhdGlvbn1cbiAgICAgICAgfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChoYXNMZWFreXJlbHVBbHBoYSkge1xuICAgICAgICAgICAgICAgIGFjdGl2YXRpb25TbmlwcGV0ID0gYGZsb2F0IGFjdGl2YXRpb24oZmxvYXQgYSkge1xuICAgICAgICAgIGZsb2F0IGIgPSBnZXRMZWFreXJlbHVBbHBoYUF0T3V0Q29vcmRzKCk7XG4gICAgICAgICAgJHthY3RpdmF0aW9ufVxuICAgICAgICB9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGFjdGl2YXRpb25TbmlwcGV0ID0gYFxuICAgICAgICAgIGZsb2F0IGFjdGl2YXRpb24oZmxvYXQgeCkge1xuICAgICAgICAgICAgJHthY3RpdmF0aW9ufVxuICAgICAgICAgIH1cbiAgICAgICAgYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFwcGx5QWN0aXZhdGlvblNuaXBwZXQgPSBgcmVzdWx0ID0gYWN0aXZhdGlvbihyZXN1bHQpO2A7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWRkQmlhc1NuaXBwZXQgPSBhZGRCaWFzID8gJ3Jlc3VsdCArPSBnZXRCaWFzQXRPdXRDb29yZHMoKTsnIDogJyc7XG4gICAgICAgIGlmIChhZGRCaWFzKSB7XG4gICAgICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMucHVzaCgnYmlhcycpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzKSB7XG4gICAgICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMucHVzaCgncHJlbHVBY3RpdmF0aW9uV2VpZ2h0cycpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNMZWFreXJlbHVBbHBoYSkge1xuICAgICAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzLnB1c2goJ2xlYWt5cmVsdUFscGhhJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICR7YWN0aXZhdGlvblNuaXBwZXR9XG5cbiAgICAgIGNvbnN0IGl2ZWMyIHN0cmlkZXMgPSBpdmVjMigke3N0cmlkZUhlaWdodH0sICR7c3RyaWRlV2lkdGh9KTtcbiAgICAgIGNvbnN0IGl2ZWMyIHBhZHMgPSBpdmVjMigke3BhZFRvcH0sICR7cGFkTGVmdH0pO1xuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHNbMF07XG4gICAgICAgIGludCBkMiA9IGNvb3Jkc1ske2NoYW5uZWxEaW19XTtcblxuICAgICAgICBpdmVjMiB4UkNDb3JuZXIgPVxuICAgICAgICAgICAgaXZlYzIoY29vcmRzWyR7cm93RGltfV0sIGNvb3Jkc1ske2NvbERpbX1dKSAqIHN0cmlkZXMgLSBwYWRzO1xuICAgICAgICBpbnQgeFJDb3JuZXIgPSB4UkNDb3JuZXIueDtcbiAgICAgICAgaW50IHhDQ29ybmVyID0geFJDQ29ybmVyLnk7XG5cbiAgICAgICAgLy8gQ29udm9sdmUgeCg/LCA/LCBkMSkgd2l0aCB3KDosIDosIGQxLCBkMikgdG8gZ2V0IHkoeVIsIHlDLCBkMikuXG4gICAgICAgIC8vID8gPSB0byBiZSBkZXRlcm1pbmVkLiA6ID0gYWNyb3NzIGFsbCB2YWx1ZXMgaW4gdGhhdCBheGlzLlxuICAgICAgICBmbG9hdCBkb3RQcm9kID0gMC4wO1xuICAgICAgICBmb3IgKGludCB3UiA9IDA7IHdSIDwgJHtmaWx0ZXJIZWlnaHR9OyB3UisrKSB7XG4gICAgICAgICAgaW50IHhSID0geFJDb3JuZXIgKyB3UiAqICR7ZGlsYXRpb25IZWlnaHR9O1xuXG4gICAgICAgICAgaWYgKHhSIDwgMCB8fCB4UiA+PSAke2NvbnZJbmZvLmluSGVpZ2h0fSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yIChpbnQgd0MgPSAwOyB3QyA8ICR7ZmlsdGVyV2lkdGh9OyB3QysrKSB7XG4gICAgICAgICAgICBpbnQgeEMgPSB4Q0Nvcm5lciArIHdDICogJHtkaWxhdGlvbldpZHRofTtcblxuICAgICAgICAgICAgaWYgKHhDIDwgMCB8fCB4QyA+PSAke2NvbnZJbmZvLmluV2lkdGh9KSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGludCBkMSA9IDA7IGQxIDwgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9OyBkMSArPSA0KSB7XG4gICAgICAgICAgICAgIHZlYzQgd1ZhbHVlcyA9IHZlYzQoXG4gICAgICAgICAgICAgICAgZ2V0Vyh3Uiwgd0MsIGQxLCBkMiksXG4gICAgICAgICAgICAgICAgZ2V0Vyh3Uiwgd0MsIGQxICsgMSwgZDIpLFxuICAgICAgICAgICAgICAgIGdldFcod1IsIHdDLCBkMSArIDIsIGQyKSxcbiAgICAgICAgICAgICAgICBnZXRXKHdSLCB3QywgZDEgKyAzLCBkMilcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICBpZiAoJHtpc0NoYW5uZWxzTGFzdH0pIHtcbiAgICAgICAgICAgICAgICB2ZWM0IHhWYWx1ZXMgPSB2ZWM0KFxuICAgICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgeFIsIHhDLCBkMSksXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4UiwgeEMsIGQxICsgMSksXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4UiwgeEMsIGQxICsgMiksXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4UiwgeEMsIGQxICsgMylcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGRvdFByb2QgKz0gZG90KHhWYWx1ZXMsIHdWYWx1ZXMpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZlYzQgeFZhbHVlcyA9IHZlYzQoXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCBkMSwgeFIsIHhDKSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIGQxICsgMSwgeFIsIHhDKSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIGQxICsgMiwgeFIsIHhDKSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIGQxICsgMywgeFIsIHhDKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZG90UHJvZCArPSBkb3QoeFZhbHVlcywgd1ZhbHVlcyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCR7aW5wdXREZXB0aFZlYzRSZW1haW5kZXIgPT09IDF9KSB7XG5cbiAgICAgICAgICAgICAgaWYgKCR7aXNDaGFubmVsc0xhc3R9KSB7XG4gICAgICAgICAgICAgICAgZG90UHJvZCArPVxuICAgICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4UiwgeEMsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSkgKlxuICAgICAgICAgICAgICAgICAgICBnZXRXKHdSLCB3QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9LCBkMik7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZG90UHJvZCArPVxuICAgICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0sIHhSLCB4QykgKlxuICAgICAgICAgICAgICAgICAgICBnZXRXKHdSLCB3QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9LCBkMik7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSBlbHNlIGlmICgke2lucHV0RGVwdGhWZWM0UmVtYWluZGVyID09PSAyfSkge1xuICAgICAgICAgICAgICB2ZWMyIHdWYWx1ZXMgPSB2ZWMyKFxuICAgICAgICAgICAgICAgIGdldFcod1IsIHdDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0sIGQyKSxcbiAgICAgICAgICAgICAgICBnZXRXKHdSLCB3QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9ICsgMSwgZDIpXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgaWYgKCR7aXNDaGFubmVsc0xhc3R9KSB7XG4gICAgICAgICAgICAgICAgdmVjMiB4VmFsdWVzID0gdmVjMihcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhSLCB4QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9KSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhSLCB4QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9ICsgMSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGRvdFByb2QgKz0gZG90KHhWYWx1ZXMsIHdWYWx1ZXMpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZlYzIgeFZhbHVlcyA9IHZlYzIoXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0sIHhSLCB4QyksXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0gKyAxLCB4UiwgeEMpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9IGRvdCh4VmFsdWVzLCB3VmFsdWVzKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCR7aW5wdXREZXB0aFZlYzRSZW1haW5kZXIgPT09IDN9KSB7XG4gICAgICAgICAgICAgIHZlYzMgd1ZhbHVlcyA9IHZlYzMoXG4gICAgICAgICAgICAgICAgZ2V0Vyh3Uiwgd0MsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSwgZDIpLFxuICAgICAgICAgICAgICAgIGdldFcod1IsIHdDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0gKyAxLCBkMiksXG4gICAgICAgICAgICAgICAgZ2V0Vyh3Uiwgd0MsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSArIDIsIGQyKVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIGlmICgke2lzQ2hhbm5lbHNMYXN0fSkge1xuICAgICAgICAgICAgICAgIHZlYzMgeFZhbHVlcyA9IHZlYzMoXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4UiwgeEMsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSksXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4UiwgeEMsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSArIDEpLFxuICAgICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgeFIsIHhDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0gKyAyKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZG90UHJvZCArPSBkb3QoeFZhbHVlcywgd1ZhbHVlcyk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmVjMyB4VmFsdWVzID0gdmVjMyhcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSwgeFIsIHhDKSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSArIDEsIHhSLCB4QyksXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0gKyAyLCB4UiwgeEMpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9IGRvdCh4VmFsdWVzLCB3VmFsdWVzKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZmxvYXQgcmVzdWx0ID0gZG90UHJvZDtcbiAgICAgICAgJHthZGRCaWFzU25pcHBldH1cbiAgICAgICAgJHthcHBseUFjdGl2YXRpb25TbmlwcGV0fVxuICAgICAgICBzZXRPdXRwdXQocmVzdWx0KTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBDb252M0RQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3Rvcihjb252SW5mbykge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ3gnLCAnVyddO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gY29udkluZm8ub3V0U2hhcGU7XG4gICAgICAgIGNvbnN0IHBhZEZyb250ID0gY29udkluZm8ucGFkSW5mby5mcm9udDtcbiAgICAgICAgY29uc3QgcGFkVG9wID0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgICAgIGNvbnN0IHBhZExlZnQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgICAgIGNvbnN0IHN0cmlkZURlcHRoID0gY29udkluZm8uc3RyaWRlRGVwdGg7XG4gICAgICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICAgICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICAgICAgY29uc3QgZGlsYXRpb25EZXB0aCA9IGNvbnZJbmZvLmRpbGF0aW9uRGVwdGg7XG4gICAgICAgIGNvbnN0IGRpbGF0aW9uSGVpZ2h0ID0gY29udkluZm8uZGlsYXRpb25IZWlnaHQ7XG4gICAgICAgIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICAgICAgICBjb25zdCBmaWx0ZXJEZXB0aCA9IGNvbnZJbmZvLmZpbHRlckRlcHRoO1xuICAgICAgICBjb25zdCBmaWx0ZXJIZWlnaHQgPSBjb252SW5mby5maWx0ZXJIZWlnaHQ7XG4gICAgICAgIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG4gICAgICAgIGNvbnN0IGlucHV0RGVwdGhOZWFyZXN0VmVjNCA9IE1hdGguZmxvb3IoY29udkluZm8uaW5DaGFubmVscyAvIDQpICogNDtcbiAgICAgICAgY29uc3QgaW5wdXREZXB0aFZlYzRSZW1haW5kZXIgPSBjb252SW5mby5pbkNoYW5uZWxzICUgNDtcbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IGl2ZWMzIHN0cmlkZXMgPSBpdmVjMygke3N0cmlkZURlcHRofSwgJHtzdHJpZGVIZWlnaHR9LCAke3N0cmlkZVdpZHRofSk7XG4gICAgICBjb25zdCBpdmVjMyBwYWRzID0gaXZlYzMoJHtwYWRGcm9udH0sICR7cGFkVG9wfSwgJHtwYWRMZWZ0fSk7XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzUgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiYXRjaCA9IGNvb3Jkcy54O1xuICAgICAgICBpbnQgZDIgPSBjb29yZHMudTtcblxuICAgICAgICBpdmVjMyB4RlJDQ29ybmVyID0gaXZlYzMoY29vcmRzLnksIGNvb3Jkcy56LCBjb29yZHMudykgKiBzdHJpZGVzIC0gcGFkcztcbiAgICAgICAgaW50IHhGQ29ybmVyID0geEZSQ0Nvcm5lci54O1xuICAgICAgICBpbnQgeFJDb3JuZXIgPSB4RlJDQ29ybmVyLnk7XG4gICAgICAgIGludCB4Q0Nvcm5lciA9IHhGUkNDb3JuZXIuejtcblxuICAgICAgICAvLyBDb252b2x2ZSB4KD8sID8sID8sIGQxKSB3aXRoIHcoOiwgOiwgOiwgZDEsIGQyKSB0byBnZXRcbiAgICAgICAgLy8geSh5RiwgeVIsIHlDLCBkMikuID8gPSB0byBiZSBkZXRlcm1pbmVkLiA6ID0gYWNyb3NzIGFsbFxuICAgICAgICAvLyB2YWx1ZXMgaW4gdGhhdCBheGlzLlxuICAgICAgICBmbG9hdCBkb3RQcm9kID0gMC4wO1xuICAgICAgICBmb3IgKGludCB3RiA9IDA7IHdGIDwgJHtmaWx0ZXJEZXB0aH07IHdGKyspIHtcbiAgICAgICAgICBpbnQgeEYgPSB4RkNvcm5lciArIHdGICogJHtkaWxhdGlvbkRlcHRofTtcblxuICAgICAgICAgIGlmICh4RiA8IDAgfHwgeEYgPj0gJHtjb252SW5mby5pbkRlcHRofSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yIChpbnQgd1IgPSAwOyB3UiA8ICR7ZmlsdGVySGVpZ2h0fTsgd1IrKykge1xuICAgICAgICAgICAgaW50IHhSID0geFJDb3JuZXIgKyB3UiAqICR7ZGlsYXRpb25IZWlnaHR9O1xuXG4gICAgICAgICAgICBpZiAoeFIgPCAwIHx8IHhSID49ICR7Y29udkluZm8uaW5IZWlnaHR9KSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGludCB3QyA9IDA7IHdDIDwgJHtmaWx0ZXJXaWR0aH07IHdDKyspIHtcbiAgICAgICAgICAgICAgaW50IHhDID0geENDb3JuZXIgKyB3QyAqICR7ZGlsYXRpb25XaWR0aH07XG5cbiAgICAgICAgICAgICAgaWYgKHhDIDwgMCB8fCB4QyA+PSAke2NvbnZJbmZvLmluV2lkdGh9KSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBmb3IgKGludCBkMSA9IDA7IGQxIDwgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9OyBkMSArPSA0KSB7XG4gICAgICAgICAgICAgICAgdmVjNCB4VmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhGLCB4UiwgeEMsIGQxKSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhGLCB4UiwgeEMsIGQxICsgMSksXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4RiwgeFIsIHhDLCBkMSArIDIpLFxuICAgICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgeEYsIHhSLCB4QywgZDEgKyAzKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdmVjNCB3VmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgICAgICAgIGdldFcod0YsIHdSLCB3QywgZDEsIGQyKSxcbiAgICAgICAgICAgICAgICAgIGdldFcod0YsIHdSLCB3QywgZDEgKyAxLCBkMiksXG4gICAgICAgICAgICAgICAgICBnZXRXKHdGLCB3Uiwgd0MsIGQxICsgMiwgZDIpLFxuICAgICAgICAgICAgICAgICAgZ2V0Vyh3Riwgd1IsIHdDLCBkMSArIDMsIGQyKVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9IGRvdCh4VmFsdWVzLCB3VmFsdWVzKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmICgke2lucHV0RGVwdGhWZWM0UmVtYWluZGVyID09PSAxfSkge1xuICAgICAgICAgICAgICAgIGRvdFByb2QgKz1cbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhGLCB4UiwgeEMsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSkgKlxuICAgICAgICAgICAgICAgICAgZ2V0Vyh3Riwgd1IsIHdDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0sIGQyKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICgke2lucHV0RGVwdGhWZWM0UmVtYWluZGVyID09PSAyfSkge1xuICAgICAgICAgICAgICAgIHZlYzIgeFZhbHVlcyA9IHZlYzIoXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4RiwgeFIsIHhDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0pLFxuICAgICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgeEYsIHhSLCB4QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9ICsgMSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHZlYzIgd1ZhbHVlcyA9IHZlYzIoXG4gICAgICAgICAgICAgICAgICBnZXRXKHdGLCB3Uiwgd0MsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSwgZDIpLFxuICAgICAgICAgICAgICAgICAgZ2V0Vyh3Riwgd1IsIHdDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0gKyAxLCBkMilcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGRvdFByb2QgKz0gZG90KHhWYWx1ZXMsIHdWYWx1ZXMpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKCR7aW5wdXREZXB0aFZlYzRSZW1haW5kZXIgPT09IDN9KSB7XG4gICAgICAgICAgICAgICAgdmVjMyB4VmFsdWVzID0gdmVjMyhcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhGLCB4UiwgeEMsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSksXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4RiwgeFIsIHhDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0gKyAxKSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhGLCB4UiwgeEMsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSArIDIpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB2ZWMzIHdWYWx1ZXMgPSB2ZWMzKFxuICAgICAgICAgICAgICAgICAgZ2V0Vyh3Riwgd1IsIHdDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0sIGQyKSxcbiAgICAgICAgICAgICAgICAgIGdldFcod0YsIHdSLCB3QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9ICsgMSwgZDIpLFxuICAgICAgICAgICAgICAgICAgZ2V0Vyh3Riwgd1IsIHdDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0gKyAyLCBkMilcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGRvdFByb2QgKz0gZG90KHhWYWx1ZXMsIHdWYWx1ZXMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNldE91dHB1dChkb3RQcm9kKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnZfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmV4cG9ydCBjbGFzcyBEZXB0aHdpc2VDb252MkRQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3Rvcihjb252SW5mbywgYWRkQmlhcyA9IGZhbHNlLCBhY3RpdmF0aW9uID0gbnVsbCwgaGFzUHJlbHVBY3RpdmF0aW9uID0gZmFsc2UsIGhhc0xlYWt5UmVsdUFscGhhID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWyd4JywgJ1cnXTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IGNvbnZJbmZvLm91dFNoYXBlO1xuICAgICAgICBjb25zdCB4TnVtUm93cyA9IGNvbnZJbmZvLmluSGVpZ2h0O1xuICAgICAgICBjb25zdCB4TnVtQ29scyA9IGNvbnZJbmZvLmluV2lkdGg7XG4gICAgICAgIGNvbnN0IHBhZFRvcCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgICAgICBjb25zdCBwYWRMZWZ0ID0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgICAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgICAgIGNvbnN0IGRpbGF0aW9uSGVpZ2h0ID0gY29udkluZm8uZGlsYXRpb25IZWlnaHQ7XG4gICAgICAgIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICAgICAgICBjb25zdCBmaWx0ZXJIZWlnaHQgPSBjb252SW5mby5maWx0ZXJIZWlnaHQ7XG4gICAgICAgIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG4gICAgICAgIGNvbnN0IGNoYW5uZWxNdWwgPSBjb252SW5mby5vdXRDaGFubmVscyAvIGNvbnZJbmZvLmluQ2hhbm5lbHM7XG4gICAgICAgIGxldCBhY3RpdmF0aW9uU25pcHBldCA9ICcnLCBhcHBseUFjdGl2YXRpb25TbmlwcGV0ID0gJyc7XG4gICAgICAgIGlmIChhY3RpdmF0aW9uKSB7XG4gICAgICAgICAgICBpZiAoaGFzUHJlbHVBY3RpdmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYWN0aXZhdGlvblNuaXBwZXQgPSBgZmxvYXQgYWN0aXZhdGlvbihmbG9hdCBhKSB7XG4gICAgICAgICAgZmxvYXQgYiA9IGdldFByZWx1QWN0aXZhdGlvbldlaWdodHNBdE91dENvb3JkcygpO1xuICAgICAgICAgICR7YWN0aXZhdGlvbn1cbiAgICAgICAgfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChoYXNMZWFreVJlbHVBbHBoYSkge1xuICAgICAgICAgICAgICAgIGFjdGl2YXRpb25TbmlwcGV0ID0gYGZsb2F0IGFjdGl2YXRpb24oZmxvYXQgYSkge1xuICAgICAgICAgIGZsb2F0IGIgPSBnZXRMZWFreXJlbHVBbHBoYUF0T3V0Q29vcmRzKCk7XG4gICAgICAgICAgJHthY3RpdmF0aW9ufVxuICAgICAgICB9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGFjdGl2YXRpb25TbmlwcGV0ID0gYFxuICAgICAgICAgIGZsb2F0IGFjdGl2YXRpb24oZmxvYXQgeCkge1xuICAgICAgICAgICAgJHthY3RpdmF0aW9ufVxuICAgICAgICAgIH1cbiAgICAgICAgYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFwcGx5QWN0aXZhdGlvblNuaXBwZXQgPSBgcmVzdWx0ID0gYWN0aXZhdGlvbihyZXN1bHQpO2A7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWRkQmlhc1NuaXBwZXQgPSBhZGRCaWFzID8gJ3Jlc3VsdCArPSBnZXRCaWFzQXRPdXRDb29yZHMoKTsnIDogJyc7XG4gICAgICAgIGlmIChhZGRCaWFzKSB7XG4gICAgICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMucHVzaCgnYmlhcycpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNQcmVsdUFjdGl2YXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMudmFyaWFibGVOYW1lcy5wdXNoKCdwcmVsdUFjdGl2YXRpb25XZWlnaHRzJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc0xlYWt5UmVsdUFscGhhKSB7XG4gICAgICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMucHVzaCgnbGVha3lyZWx1QWxwaGEnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgJHthY3RpdmF0aW9uU25pcHBldH1cblxuICAgICAgY29uc3QgaXZlYzIgc3RyaWRlcyA9IGl2ZWMyKCR7c3RyaWRlSGVpZ2h0fSwgJHtzdHJpZGVXaWR0aH0pO1xuICAgICAgY29uc3QgaXZlYzIgcGFkcyA9IGl2ZWMyKCR7cGFkVG9wfSwgJHtwYWRMZWZ0fSk7XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiYXRjaCA9IGNvb3Jkcy54O1xuICAgICAgICBpdmVjMiB4UkNDb3JuZXIgPSBjb29yZHMueXogKiBzdHJpZGVzIC0gcGFkcztcbiAgICAgICAgaW50IGQyID0gY29vcmRzLnc7XG4gICAgICAgIGludCBkMSA9IGQyIC8gJHtjaGFubmVsTXVsfTtcbiAgICAgICAgaW50IHEgPSBkMiAtIGQxICogJHtjaGFubmVsTXVsfTtcblxuICAgICAgICBpbnQgeFJDb3JuZXIgPSB4UkNDb3JuZXIueDtcbiAgICAgICAgaW50IHhDQ29ybmVyID0geFJDQ29ybmVyLnk7XG5cbiAgICAgICAgLy8gQ29udm9sdmUgeCg/LCA/LCBkMSkgd2l0aCB3KDosIDosIGQxLCBxKSB0byBnZXQgeSh5UiwgeUMsIGQyKS5cbiAgICAgICAgLy8gPyA9IHRvIGJlIGRldGVybWluZWQuIDogPSBhY3Jvc3MgYWxsIHZhbHVlcyBpbiB0aGF0IGF4aXMuXG4gICAgICAgIGZsb2F0IGRvdFByb2QgPSAwLjA7XG4gICAgICAgIC8vIFRPIERPKGRzbWlsa292KTogRmxhdHRlbiB0aGUgdHdvIGZvciBsb29wcyBhbmQgdmVjNCB0aGUgb3BlcmF0aW9ucy5cbiAgICAgICAgZm9yIChpbnQgd1IgPSAwOyB3UiA8ICR7ZmlsdGVySGVpZ2h0fTsgd1IrKykge1xuICAgICAgICAgIGludCB4UiA9IHhSQ29ybmVyICsgd1IgKiAke2RpbGF0aW9uSGVpZ2h0fTtcblxuICAgICAgICAgIGlmICh4UiA8IDAgfHwgeFIgPj0gJHt4TnVtUm93c30pIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAoaW50IHdDID0gMDsgd0MgPCAke2ZpbHRlcldpZHRofTsgd0MrKykge1xuICAgICAgICAgICAgaW50IHhDID0geENDb3JuZXIgKyB3QyAqICR7ZGlsYXRpb25XaWR0aH07XG5cbiAgICAgICAgICAgIGlmICh4QyA8IDAgfHwgeEMgPj0gJHt4TnVtQ29sc30pIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZsb2F0IHhWYWwgPSBnZXRYKGJhdGNoLCB4UiwgeEMsIGQxKTtcbiAgICAgICAgICAgIGZsb2F0IHdWYWwgPSBnZXRXKHdSLCB3QywgZDEsIHEpO1xuICAgICAgICAgICAgZG90UHJvZCArPSB4VmFsICogd1ZhbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmbG9hdCByZXN1bHQgPSBkb3RQcm9kO1xuICAgICAgICAke2FkZEJpYXNTbmlwcGV0fVxuICAgICAgICAke2FwcGx5QWN0aXZhdGlvblNuaXBwZXR9XG4gICAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29udl9ncHVfZGVwdGh3aXNlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGNsYXNzIERlcHRod2lzZUNvbnZQYWNrZWQyRFByb2dyYW0ge1xuICAgIGNvbnN0cnVjdG9yKGNvbnZJbmZvLCBhZGRCaWFzID0gZmFsc2UsIGFjdGl2YXRpb24gPSBudWxsLCBoYXNQcmVsdUFjdGl2YXRpb24gPSBmYWxzZSwgaGFzTGVha3lSZWx1QWxwaGEgPSBmYWxzZSkge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ3gnLCAnVyddO1xuICAgICAgICB0aGlzLnBhY2tlZElucHV0cyA9IHRydWU7XG4gICAgICAgIHRoaXMucGFja2VkT3V0cHV0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IGNvbnZJbmZvLm91dFNoYXBlO1xuICAgICAgICBjb25zdCBjaGFubmVsTXVsID0gY29udkluZm8ub3V0Q2hhbm5lbHMgLyBjb252SW5mby5pbkNoYW5uZWxzO1xuICAgICAgICBjb25zdCB4TnVtUm93cyA9IGNvbnZJbmZvLmluSGVpZ2h0O1xuICAgICAgICBjb25zdCB4TnVtQ29scyA9IGNvbnZJbmZvLmluV2lkdGg7XG4gICAgICAgIGNvbnN0IHBhZFRvcCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgICAgICBjb25zdCBwYWRMZWZ0ID0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgICAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgICAgIGNvbnN0IGRpbGF0aW9uSGVpZ2h0ID0gY29udkluZm8uZGlsYXRpb25IZWlnaHQ7XG4gICAgICAgIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICAgICAgICBjb25zdCBmaWx0ZXJIZWlnaHQgPSBjb252SW5mby5maWx0ZXJIZWlnaHQ7XG4gICAgICAgIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG4gICAgICAgIGNvbnN0IHRleGVsc0Fjcm9zcyA9IGZpbHRlcldpZHRoO1xuICAgICAgICBsZXQgbWFpbkxvb3AgPSBgXG4gICAgICBpbnQgeFI7IGludCB4QzsgaW50IHhDT2Zmc2V0O1xuICAgICAgdmVjNCB3VGV4ZWw7IHZlYzQgcHJldmlvdXM7IHZlYzQgZmluYWw7YDtcbiAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBmaWx0ZXJXaWR0aDsgYysrKSB7XG4gICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgdmVjNCB4VGV4ZWxDJHtjICogMn07XG4gICAgICAgICAgaW50IHhUZXhlbEMke2MgKiAyfVJlYWR5O1xuICAgICAgICAgIHZlYzQgeFRleGVsQyR7YyAqIDIgKyAxfTtcbiAgICAgICAgICBpbnQgeFRleGVsQyR7YyAqIDIgKyAxfVJlYWR5O1xuICAgICAgICAgIHZlYzQgeEMke2N9O2A7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgdmVjdG9yaXplZCBpbXBsZW1lbnRhdGlvbiB3b3JrcyBieSBnYXRoZXJpbmcgdGhlIHZhbHVlcyBuZWVkZWQgZm9yXG4gICAgICAgICAqIGVhY2ggb3V0cHV0IGNoYW5uZWwncyBkb3QgcHJvZHVjdCBpbnRvIHZlYzQncyBhbmQgdGhlbiBtdWx0aXBseWluZyB0aGVtXG4gICAgICAgICAqIGFsbCB0b2dldGhlciAodGhpcyBoYXBwZW5zIGluIHRoZSBmaW5hbCBkb3VibGUgZm9yLWxvb3AgYmVsb3cpLiBNb3N0IG9mXG4gICAgICAgICAqIHRoZSBtYWluIGxvb3AgY29uc2lzdHMgb2YgY29uc3RydWN0aW5nIHRoZXNlIHZlYzQncyB3aXRoIHRoZSBtaW5pbXVtXG4gICAgICAgICAqIG51bWJlciBvZiB0ZXh0dXJlMkQgY2FsbHMsIHdoaWNoIG1lYW5zIG1ha2luZyB1c2Ugb2YgYWxsIGZvdXIgcmV0dXJuZWRcbiAgICAgICAgICogdmFsdWVzIGZyb20gYSB0ZXh0dXJlMkQgY2FsbCBhdCBvbmNlLlxuICAgICAgICAgKi9cbiAgICAgICAgZm9yIChsZXQgciA9IDA7IHIgPCBmaWx0ZXJIZWlnaHQ7IHIrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBmaWx0ZXJXaWR0aDsgYysrKSB7XG4gICAgICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgIHhUZXhlbEMke2MgKiAyfSA9IHZlYzQoMC4wKTtcbiAgICAgICAgICB4VGV4ZWxDJHtjICogMn1SZWFkeSA9IDA7XG4gICAgICAgICAgeFRleGVsQyR7YyAqIDIgKyAxfSA9IHZlYzQoMC4wKTtcbiAgICAgICAgICB4VGV4ZWxDJHtjICogMiArIDF9UmVhZHkgPSAwO1xuICAgICAgICAgIHhDJHtjfSA9IHZlYzQoMC4wKTtgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICB4UiA9IHhSQ29ybmVyICsgJHtyICogZGlsYXRpb25IZWlnaHR9O1xuICAgICAgICBpZiAoeFIgPj0wICYmIHhSIDwgJHt4TnVtUm93c30pIHtcbiAgICAgIGA7XG4gICAgICAgICAgICBmb3IgKGxldCB0ZXhlbEMgPSAwOyB0ZXhlbEMgPCAodGV4ZWxzQWNyb3NzICsgMSkgLyAyOyB0ZXhlbEMrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbEluZGV4ID0gdGV4ZWxDICogMjtcbiAgICAgICAgICAgICAgICBjb25zdCBjID0gY29sSW5kZXggKiBkaWxhdGlvbldpZHRoO1xuICAgICAgICAgICAgICAgIG1haW5Mb29wICs9IGBcbiAgICAgICAgICB4QyA9IHhDQ29ybmVyICsgJHtjfTtcbiAgICAgICAgICBgO1xuICAgICAgICAgICAgICAgIGlmIChzdHJpZGVXaWR0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29sSW5kZXggPCBmaWx0ZXJXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgcGFkZGluZyBpcyBvZGQsIHRoZSBvdXRlciB0ZXhlbHMgaGF2ZSB0byBiZSBjb21wb3NlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWRMZWZ0ICUgMiA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IEVuc3VyZSB2ZWM0IHByZXZpb3VzIGRvZXMgbm90IHJlc3VsdCBpbiByZWR1bmRhbnQgc2FtcGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBhdm9pZCBzZXR0aW5nIHhUZXhlbFJDJ3MgdGhhdCBleGNlZWQgdGhlIGJvdW5kYXJ5IGluIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IHBsYWNlIHJhdGhlciB0aGFuIHJlc2V0dGluZyB0aGVtIHRvIHZlYzQoMCkpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRvIGNvbXB1dGUgeENPZmZzZXQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLSBJZiBwYWRkaW5nIGlzIG9kZCwgd2UgbXVzdCBhZGQgMSB0byBlbnN1cmUgd2UgYXNrIGZvciBhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW4tbnVtYmVyZWQgcm93LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC0gV2Ugc3VidHJhY3QgMiB0byBhY2Nlc3MgdGhlIHByZXZpb3VzIHRleGVsLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5Mb29wICs9IGBcbiAgICAgICAgICAgICAgICB4Q09mZnNldCA9IHhDICsgMTtcbiAgICAgICAgICAgICAgICBpZiAoeENPZmZzZXQgPj0gMCAmJiB4Q09mZnNldCA8ICR7eE51bUNvbHN9ICYmIHhUZXhlbEMke2NvbEluZGV4fVJlYWR5ID09IDApIHtcbiAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4fSA9IGdldFgoYmF0Y2gsIHhSLCB4Q09mZnNldCwgZDEpO1xuXG4gICAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIG1hbnVhbGx5IGNsZWFyIHVudXNlZCBjaGFubmVscyBpbiBjYXNlXG4gICAgICAgICAgICAgICAgICAvLyB3ZSdyZSByZWFkaW5nIGZyb20gcmVjeWNsZWQgdGV4dHVyZS5cbiAgICAgICAgICAgICAgICAgIGlmICh4Q09mZnNldCArIDEgPj0gJHt4TnVtQ29sc30pIHtcbiAgICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXh9Lnp3ID0gdmVjMigwLjApO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXh9UmVhZHkgPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHRleGVsIGhhcyBiZWVuIHJlYWQgaW4gcHJldmlvdXMgaXRlcmF0aW9uIGlmIHRoZSBkaWxhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIDEuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpbGF0aW9uV2lkdGggPT09IDEgJiYgYyA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICAgIHhDJHtjb2xJbmRleH0gPSB2ZWM0KHhUZXhlbEMke2NvbEluZGV4IC0gMn0uencsIHhUZXhlbEMke2NvbEluZGV4fS54eSk7XG4gICAgICAgICAgICAgICAgYDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5Mb29wICs9IGBcbiAgICAgICAgICAgICAgICAgIHhDT2Zmc2V0ID0geEMgKyAxIC0gMjtcblxuICAgICAgICAgICAgICAgICAgaWYgKHhDT2Zmc2V0ID49IDAgJiYgeENPZmZzZXQgPCAke3hOdW1Db2xzfSkge1xuICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyA9IGdldFgoYmF0Y2gsIHhSLCB4Q09mZnNldCwgZDEpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gbWFudWFsbHkgY2xlYXIgdW51c2VkIGNoYW5uZWxzIGluIGNhc2VcbiAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgcmVhZGluZyBmcm9tIHJlY3ljbGVkIHRleHR1cmUuXG4gICAgICAgICAgICAgICAgICAgIGlmICh4Q09mZnNldCArIDEgPj0gJHt4TnVtQ29sc30pIHtcbiAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91cy56dyA9IHZlYzIoMC4wKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHhDJHtjb2xJbmRleH0gPSB2ZWM0KHByZXZpb3VzLnp3LCB4VGV4ZWxDJHtjb2xJbmRleH0ueHkpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgeEMke2NvbEluZGV4fSA9IHZlYzQoMC4wLCAwLjAsIHhUZXhlbEMke2NvbEluZGV4fS54eSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhZGRpbmcgaXMgZXZlbiwgc28geFJDIGNvcnJlc3BvbmRzIHRvIGEgc2luZ2xlIHRleGVsLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5Mb29wICs9IGBcbiAgICAgICAgICAgICAgICBpZiAoeEMgPj0gMCAmJiB4QyA8ICR7eE51bUNvbHN9ICYmIHhUZXhlbEMke2NvbEluZGV4fVJlYWR5ID09IDApIHtcbiAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4fSA9IGdldFgoYmF0Y2gsIHhSLCB4QywgZDEpO1xuICAgICAgICAgICAgICAgICAgaWYgKHhDICsgMSA+PSAke3hOdW1Db2xzfSkge1xuICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH0uencgPSB2ZWMyKDAuMCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH1SZWFkeSA9IDE7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgeEMke2NvbEluZGV4fSA9IHhUZXhlbEMke2NvbEluZGV4fTtcbiAgICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgKyAxIDwgZmlsdGVyV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBkaWxhdGlvbiBpcyBldmVuLCB0aGUgc2Vjb25kIGVudHJ5IHNob3VsZCBtYXRjaCB0aGUgZmlyc3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoZWl0aGVyIGJvdGggYXJlIGNvbXBvc2VkIG9yIGJvdGggYXJlIHNpbmdsZSBzYW1wbGVzKS4gQnV0IGlmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlsYXRpb24gaXMgb2RkLCB0aGVuIHRoZSBzZWNvbmQgZW50cnkgc2hvdWxkIGJlIHRoZSBvcHBvc2l0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBmaXJzdCAoaWYgdGhlIGZpcnN0IGlzIGNvbXBvc2VkLCB0aGUgc2Vjb25kIGlzIGEgc2luZ2xlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2FtcGxlLCBhbmQgdmljZSB2ZXJzYS4pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFRleGVsT2Zmc2V0ID0gcGFkTGVmdCAlIDIgPT09IDAgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsLm5lYXJlc3RMYXJnZXJFdmVuKGRpbGF0aW9uV2lkdGgpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlsYXRpb25XaWR0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGRpbGF0aW9uV2lkdGggJSAyID09PSAwICYmIHBhZExlZnQgJSAyID09PSAxKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGlsYXRpb25XaWR0aCAlIDIgIT09IDAgJiYgcGFkTGVmdCAlIDIgIT09IDEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5Mb29wICs9IGBcbiAgICAgICAgICAgICAgICAgIHhDT2Zmc2V0ID0geEMgKyAke3BhZExlZnQgJSAyfSArICR7bmV4dFRleGVsT2Zmc2V0fTtcblxuICAgICAgICAgICAgICAgICAgaWYgKHhDT2Zmc2V0ID49IDAgJiYgeENPZmZzZXQgPCAke3hOdW1Db2xzfSAmJiB4VGV4ZWxDJHtjb2xJbmRleCArIDF9UmVhZHkgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleCArIDF9ID0gZ2V0WChiYXRjaCwgeFIsIHhDT2Zmc2V0LCBkMSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gTmVlZCB0byBtYW51YWxseSBjbGVhciB1bnVzZWQgY2hhbm5lbHMgaW4gY2FzZVxuICAgICAgICAgICAgICAgICAgICAvLyB3ZSdyZSByZWFkaW5nIGZyb20gcmVjeWNsZWQgdGV4dHVyZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHhDT2Zmc2V0ICsgMSA+PSAke3hOdW1Db2xzfSkge1xuICAgICAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4ICsgMX0uencgPSB2ZWMyKDAuMCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXggKyAxfVJlYWR5ID0gMTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGRpbGF0aW9uID4gMSB0aGVuIHRoZSB4UkMncyB3aWxsIG5vdCBiZSBhYmxlIHRvIHNoYXJlIGFueVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZXMsIHNvIGVhY2ggeFJDIHdpbGwgcmVxdWlyZSB0d28gdW5pcXVlIGNhbGxzIHRvIGdldFguXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaWxhdGlvbldpZHRoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICAgICAgICB4Q09mZnNldCAtPSAyO1xuICAgICAgICAgICAgICAgICAgICBpZiAoeENPZmZzZXQgPj0gMCAmJiB4Q09mZnNldCA8ICR7eE51bUNvbHN9ICYmIHhUZXhlbEMke2NvbEluZGV4fVJlYWR5ID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH0gPSBnZXRYKGJhdGNoLCB4UiwgeENPZmZzZXQsIGQxKTtcbiAgICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH1SZWFkeSA9IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgICAgICB4QyR7Y29sSW5kZXggKyAxfSA9IHZlYzQoeFRleGVsQyR7Y29sSW5kZXh9Lnp3LCB4VGV4ZWxDJHtjb2xJbmRleCArIDF9Lnh5KTtcbiAgICAgICAgICAgICAgICAgIGA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBkaWxhdGlvbiBpcyAxIGFuZCBwYWRkaW5nIGlzIG9kZCwgd2UgaGF2ZSBhbHJlYWR5IHJlYWQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRleGVsIHdoZW4gY29uc3RydWN0aW5nIHRoZSBwcmV2aW91cyB4IHZhbHVlLiBIZXJlIHdlIGNhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaW1wbHkgc2tpcCB0aGUgdGV4dHVyZSByZWFkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dFRleGVsT2Zmc2V0ID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgICAgICAgIHhDJHtjb2xJbmRleCArIDF9ID0geFRleGVsQyR7Y29sSW5kZXh9O1xuICAgICAgICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICAgICAgICB4Q09mZnNldCA9IHhDICsgJHtuZXh0VGV4ZWxPZmZzZXR9O1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh4Q09mZnNldCA+PSAwICYmIHhDT2Zmc2V0IDwgJHt4TnVtQ29sc30gJiYgeFRleGVsQyR7Y29sSW5kZXggKyAxfVJlYWR5ID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleCArIDF9ID0gZ2V0WChiYXRjaCwgeFIsIHhDT2Zmc2V0LCBkMSk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHhDT2Zmc2V0ICsgMSA+PSAke3hOdW1Db2xzfSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXggKyAxfS56dyA9IHZlYzIoMC4wKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXggKyAxfVJlYWR5ID0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHhDJHtjb2xJbmRleCArIDF9ID0geFRleGVsQyR7Y29sSW5kZXggKyAxfTtcbiAgICAgICAgICAgICAgICAgICAgYDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHsgLy8gc3RyaWRlID09PSAyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjIDwgZmlsdGVyV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlcGVuZGluZyBvbiB3aGV0aGVyIHBhZExlZnQgaXMgZXZlbiBvciBvZGQsIHdlIHdhbnQgZWl0aGVyIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8geHkgb3IgencgY2hhbm5lbHMgZnJvbSBYIHRleGVscyBmb3IgeEMke2NvbEluZGV4fS4gSWYgcGFkTGVmdCBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbiwgeEMke2NvbEluZGV4ICsxfSBpcyBzaW1wbHkgdGhlIHp3IGNoYW5uZWxzIG9mIHRleGVscyB3ZSd2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBzYW1wbGVkLiBCdXQgaWYgcGFkTGVmdCBpcyBvZGQsIHhDeyRjICsgMX0uencgd2lsbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBjb21lIGZyb20gdGhlIHh5IGNoYW5uZWxzIG9mIGEgbmV3IHRleGVsLCBoZW5jZSB0aGUgYFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmVjNFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluYWxgIGluaXRpYWxpemVkIGJlbG93LlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhZExlZnQgJSAyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICAgIHhDT2Zmc2V0ID0geEMgKyAxIC0gJHtzdHJpZGVXaWR0aH07XG4gICAgICAgICAgICAgICAgaWYoeENPZmZzZXQgPj0gMCAmJiB4Q09mZnNldCA8ICR7eE51bUNvbHN9ICYmIHhUZXhlbEMke2NvbEluZGV4fVJlYWR5ID09IDApIHtcbiAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4fSA9IGdldFgoYmF0Y2gsIHhSLCB4Q09mZnNldCwgZDEpO1xuICAgICAgICAgICAgICAgICAgLy8gTmVlZCB0byBtYW51YWxseSBjbGVhciB1bnVzZWQgY2hhbm5lbHMgaW4gY2FzZVxuICAgICAgICAgICAgICAgICAgLy8gd2UncmUgcmVhZGluZyBmcm9tIHJlY3ljbGVkIHRleHR1cmUuXG4gICAgICAgICAgICAgICAgICBpZiAoeENPZmZzZXQgKyAxID49ICR7eE51bUNvbHN9KSB7XG4gICAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4fS56dyA9IHZlYzIoMC4wKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4fVJlYWR5ID0gMTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZih4QyArIDEgPj0gMCAmJiB4QyArIDEgPCAke3hOdW1Db2xzfSAmJiB4VGV4ZWxDJHtjb2xJbmRleCArIDF9UmVhZHkgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXggKyAxfSA9IGdldFgoYmF0Y2gsIHhSLCB4QyArIDEsIGQxKTtcbiAgICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gbWFudWFsbHkgY2xlYXIgdW51c2VkIGNoYW5uZWxzIGluIGNhc2VcbiAgICAgICAgICAgICAgICAgIC8vIHdlJ3JlIHJlYWRpbmcgZnJvbSByZWN5Y2xlZCB0ZXh0dXJlLlxuICAgICAgICAgICAgICAgICAgaWYgKHhDICsgMiA+PSAke3hOdW1Db2xzfSkge1xuICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleCArIDF9Lnp3ID0gdmVjMigwLjApO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXggKyAxfVJlYWR5ID0gMTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB4QyR7Y29sSW5kZXh9ID0gdmVjNCh4VGV4ZWxDJHtjb2xJbmRleH0uencsIHhUZXhlbEMke2NvbEluZGV4ICsgMX0uencpO1xuICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjICsgMSA8IGZpbHRlcldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5Mb29wICs9IGBcbiAgICAgICAgICAgICAgICAgIGZpbmFsID0gdmVjNCgwLjApO1xuICAgICAgICAgICAgICAgICAgeENPZmZzZXQgPSB4QyArIDEgKyAke3N0cmlkZVdpZHRofTtcbiAgICAgICAgICAgICAgICAgIGlmKHhDT2Zmc2V0ID49IDAgJiYgeENPZmZzZXQgPCAke3hOdW1Db2xzfSkge1xuICAgICAgICAgICAgICAgICAgICBmaW5hbCA9IGdldFgoYmF0Y2gsIHhSLCB4Q09mZnNldCwgZDEpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgeEMke2NvbEluZGV4ICsgMX0gPSB2ZWM0KHhUZXhlbEMke2NvbEluZGV4ICsgMX0ueHksIGZpbmFsLnh5KTtcbiAgICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5Mb29wICs9IGBcbiAgICAgICAgICAgICAgICBpZih4QyA+PSAwICYmIHhDIDwgJHt4TnVtQ29sc30gJiYgeFRleGVsQyR7Y29sSW5kZXh9UmVhZHkgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXh9ID0gZ2V0WChiYXRjaCwgeFIsIHhDLCBkMSk7XG4gICAgICAgICAgICAgICAgICBpZiAoeEMgKyAxID49ICR7eE51bUNvbHN9KSB7XG4gICAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4fS56dyA9IHZlYzIoMC4wKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4fVJlYWR5ID0gMTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB4Q09mZnNldCA9IHhDICsgJHtzdHJpZGVXaWR0aH07XG4gICAgICAgICAgICAgICAgaWYoeENPZmZzZXQgPj0gMCAmJiB4Q09mZnNldCA8ICR7eE51bUNvbHN9ICYmIHhUZXhlbEMke2NvbEluZGV4ICsgMX1SZWFkeSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleCArIDF9ID0gZ2V0WChiYXRjaCwgeFIsIHhDT2Zmc2V0LCBkMSk7XG4gICAgICAgICAgICAgICAgICBpZiAoeENPZmZzZXQgKyAxID49ICR7eE51bUNvbHN9KSB7XG4gICAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4ICsgMX0uencgPSB2ZWMyKDAuKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4ICsgMX1SZWFkeSA9IDE7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgeEMke2NvbEluZGV4fSA9IHZlYzQoXG4gICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH0ueHksIHhUZXhlbEMke2NvbEluZGV4ICsgMX0ueHkpO1xuICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjICsgMSA8IGZpbHRlcldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5Mb29wICs9IGBcbiAgICAgICAgICAgICAgICAgIHhDJHtjb2xJbmRleCArIDF9ID0gdmVjNCh4VGV4ZWxDJHtjb2xJbmRleH0uencsIHhUZXhlbEMke2NvbEluZGV4ICsgMX0uencpO1xuICAgICAgICAgICAgICAgIGA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGxvY2FsaXplIHRoZSBkb3RQcm9kIGFjY3VtdWxhdGlvbiB3aXRoaW4gdGhlIGxvb3AsIHRoZSB0aGVvcnkgaXMgZm9yXG4gICAgICAgICAgICAgICAgLy8gR1BVIHdpdGggbGltaXRlZCBjYWNoZSwgYWNjdW11bGF0ZSBzdW0gYWNyb3NzIGxhcmdlIGFtb3VudCBvZlxuICAgICAgICAgICAgICAgIC8vIHZlcmlhYmxlcyB3aWxsIGNhdXNlIGxvdHMgb2YgY2FjaGUgbWlzc2VzLiAoaS5lLiA1eDUgZmlsdGVyIHdpbGwgaGF2ZVxuICAgICAgICAgICAgICAgIC8vIDUwIHZhcmlhYmxlcylcbiAgICAgICAgICAgICAgICBpZiAoY29sSW5kZXggPCBmaWx0ZXJXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICB3VGV4ZWwgPSBnZXRXKCR7cn0sICR7Y30sIGQxLCBxKTtcbiAgICAgICAgICAgIGRvdFByb2QgKz0geEMke2NvbEluZGV4fSAqIHZlYzQod1RleGVsLnh6LCB3VGV4ZWwueHopO1xuICAgICAgICAgIGA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjICsgMSA8IGZpbHRlcldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgIHdUZXhlbCA9IGdldFcoJHtyfSwgJHtjICsgMX0sIGQxLCBxKTtcbiAgICAgICAgICAgICAgZG90UHJvZCArPSB4QyR7Y29sSW5kZXggKyAxfSAqIHZlYzQod1RleGVsLnh6LCB3VGV4ZWwueHopO1xuICAgICAgICAgICAgYDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1haW5Mb29wICs9IGBcbiAgICAgICAgfVxuICAgICAgYDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYWN0aXZhdGlvblNuaXBwZXQgPSAnJywgYXBwbHlBY3RpdmF0aW9uU25pcHBldCA9ICcnO1xuICAgICAgICBpZiAoYWN0aXZhdGlvbikge1xuICAgICAgICAgICAgaWYgKGhhc1ByZWx1QWN0aXZhdGlvbikge1xuICAgICAgICAgICAgICAgIGFjdGl2YXRpb25TbmlwcGV0ID0gYHZlYzQgYWN0aXZhdGlvbih2ZWM0IGEpIHtcbiAgICAgICAgICB2ZWM0IGIgPSBnZXRQcmVsdUFjdGl2YXRpb25XZWlnaHRzQXRPdXRDb29yZHMoKTtcbiAgICAgICAgICAke2FjdGl2YXRpb259XG4gICAgICAgIH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaGFzTGVha3lSZWx1QWxwaGEpIHtcbiAgICAgICAgICAgICAgICBhY3RpdmF0aW9uU25pcHBldCA9IGB2ZWM0IGFjdGl2YXRpb24odmVjNCBhKSB7XG4gICAgICAgICAgdmVjNCBiID0gZ2V0TGVha3lyZWx1QWxwaGFBdE91dENvb3JkcygpO1xuICAgICAgICAgICR7YWN0aXZhdGlvbn1cbiAgICAgICAgfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhY3RpdmF0aW9uU25pcHBldCA9IGB2ZWM0IGFjdGl2YXRpb24odmVjNCB4KSB7XG4gICAgICAgICAgJHthY3RpdmF0aW9ufVxuICAgICAgICB9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFwcGx5QWN0aXZhdGlvblNuaXBwZXQgPSBgcmVzdWx0ID0gYWN0aXZhdGlvbihyZXN1bHQpO2A7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWRkQmlhc1NuaXBwZXQgPSBhZGRCaWFzID8gJ3Jlc3VsdCArPSBnZXRCaWFzQXRPdXRDb29yZHMoKTsnIDogJyc7XG4gICAgICAgIGlmIChhZGRCaWFzKSB7XG4gICAgICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMucHVzaCgnYmlhcycpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNQcmVsdUFjdGl2YXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMudmFyaWFibGVOYW1lcy5wdXNoKCdwcmVsdUFjdGl2YXRpb25XZWlnaHRzJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc0xlYWt5UmVsdUFscGhhKSB7XG4gICAgICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMucHVzaCgnbGVha3lyZWx1QWxwaGEnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgJHthY3RpdmF0aW9uU25pcHBldH1cblxuICAgICAgY29uc3QgaXZlYzIgc3RyaWRlcyA9IGl2ZWMyKCR7c3RyaWRlSGVpZ2h0fSwgJHtzdHJpZGVXaWR0aH0pO1xuICAgICAgY29uc3QgaXZlYzIgcGFkcyA9IGl2ZWMyKCR7cGFkVG9wfSwgJHtwYWRMZWZ0fSk7XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcblxuICAgICAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzLng7XG4gICAgICAgIGl2ZWMyIHhSQ0Nvcm5lciA9IGNvb3Jkcy55eiAqIHN0cmlkZXMgLSBwYWRzO1xuICAgICAgICBpbnQgZDIgPSBjb29yZHMudztcbiAgICAgICAgaW50IGQxID0gZDIgLyAke2NoYW5uZWxNdWx9O1xuICAgICAgICBpbnQgcSA9IGQyIC0gZDEgKiAke2NoYW5uZWxNdWx9O1xuICAgICAgICBpbnQgeFJDb3JuZXIgPSB4UkNDb3JuZXIueDtcbiAgICAgICAgaW50IHhDQ29ybmVyID0geFJDQ29ybmVyLnk7XG5cbiAgICAgICAgLy9pbnRpYWxpemUgZG90UHJvZCB3aXRoIGEgc21hbGwgZXBzaWxvbiBzZWVtcyB0byByZWR1Y2UgR1BVIGFjY3VyYWN5IGxvc3MuXG4gICAgICAgIHZlYzQgZG90UHJvZCA9IHZlYzQoMC4wMDAwMDAwMDAwMDAwMDEpO1xuXG4gICAgICAgICR7bWFpbkxvb3B9XG5cbiAgICAgICAgdmVjNCByZXN1bHQgPSBkb3RQcm9kIC0gdmVjNCgwLjAwMDAwMDAwMDAwMDAwMSk7XG4gICAgICAgICR7YWRkQmlhc1NuaXBwZXR9XG4gICAgICAgICR7YXBwbHlBY3RpdmF0aW9uU25pcHBldH1cbiAgICAgICAgc2V0T3V0cHV0KHJlc3VsdCk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb252X3BhY2tlZF9ncHVfZGVwdGh3aXNlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmV4cG9ydCBjbGFzcyBDcm9wQW5kUmVzaXplUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoaW1hZ2VTaGFwZSwgYm94U2hhcGUsIGNyb3BTaXplLCBtZXRob2QsIGV4dHJhcG9sYXRpb25WYWx1ZSkge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ0ltYWdlJywgJ0JveGVzJywgJ0JveEluZCddO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gW107XG4gICAgICAgIGNvbnN0IFtiYXRjaCwgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIGRlcHRoXSA9IGltYWdlU2hhcGU7XG4gICAgICAgIGNvbnN0IFtudW1Cb3hlcyxdID0gYm94U2hhcGU7XG4gICAgICAgIGNvbnN0IFtjcm9wSGVpZ2h0LCBjcm9wV2lkdGhdID0gY3JvcFNpemU7XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBbbnVtQm94ZXMsIGNyb3BIZWlnaHQsIGNyb3BXaWR0aCwgZGVwdGhdO1xuICAgICAgICBjb25zdCBtZXRob2RJZCA9IG1ldGhvZCA9PT0gJ2JpbGluZWFyJyA/IDEgOiAwO1xuICAgICAgICBjb25zdCBbaW5wdXRIZWlnaHRGbG9hdCwgaW5wdXRXaWR0aEZsb2F0XSA9IFtgJHtpbWFnZUhlaWdodCAtIDF9LjBgLCBgJHtpbWFnZVdpZHRoIC0gMX0uMGBdO1xuICAgICAgICBjb25zdCBbaGVpZ2h0UmF0aW8sIGhlaWdodFNjYWxlLCBpblldID0gY3JvcEhlaWdodCA+IDEgP1xuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIGAkeyhpbWFnZUhlaWdodCAtIDEpIC8gKGNyb3BIZWlnaHQgLSAxKX1gLFxuICAgICAgICAgICAgICAgICcoeTIteTEpICogaGVpZ2h0X3JhdGlvJyxcbiAgICAgICAgICAgICAgICBgeTEqJHtpbnB1dEhlaWdodEZsb2F0fSArIGZsb2F0KHkpKihoZWlnaHRfc2NhbGUpYCxcbiAgICAgICAgICAgIF0gOlxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICcwLjAnLFxuICAgICAgICAgICAgICAgICcwLjAnLFxuICAgICAgICAgICAgICAgIGAwLjUgKiAoeTEreTIpICogJHtpbnB1dEhlaWdodEZsb2F0fWAsXG4gICAgICAgICAgICBdO1xuICAgICAgICBjb25zdCBbd2lkdGhSYXRpbywgd2lkdGhTY2FsZSwgaW5YXSA9IGNyb3BXaWR0aCA+IDEgP1xuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIGAkeyhpbWFnZVdpZHRoIC0gMSkgLyAoY3JvcFdpZHRoIC0gMSl9YCxcbiAgICAgICAgICAgICAgICAnKHgyLXgxKSAqIHdpZHRoX3JhdGlvJyxcbiAgICAgICAgICAgICAgICBgeDEqJHtpbnB1dFdpZHRoRmxvYXR9ICsgZmxvYXQoeCkqKHdpZHRoX3NjYWxlKWAsXG4gICAgICAgICAgICBdIDpcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAnMC4wJyxcbiAgICAgICAgICAgICAgICAnMC4wJyxcbiAgICAgICAgICAgICAgICBgMC41ICogKHgxK3gyKSAqICR7aW5wdXRXaWR0aEZsb2F0fWAsXG4gICAgICAgICAgICBdO1xuICAgICAgICAvLyBSZWZlcmVuY2UgaW1wbGVtZW50YXRpb25cbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3JmbG93L2Jsb2IvbWFzdGVyL3RlbnNvcmZsb3cvY29yZS9rZXJuZWxzL2Nyb3BfYW5kX3Jlc2l6ZV9vcF9ncHUuY3UuY2NcbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IGZsb2F0IGhlaWdodF9yYXRpbyA9IGZsb2F0KCR7aGVpZ2h0UmF0aW99KTtcbiAgICAgIGNvbnN0IGZsb2F0IHdpZHRoX3JhdGlvID0gZmxvYXQoJHt3aWR0aFJhdGlvfSk7XG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYiA9IGNvb3Jkc1swXTtcbiAgICAgICAgaW50IHkgPSBjb29yZHNbMV07XG4gICAgICAgIGludCB4ID0gY29vcmRzWzJdO1xuICAgICAgICBpbnQgZCA9IGNvb3Jkc1szXTtcblxuICAgICAgICAvLyBnZXQgYm94IHZhbHNcbiAgICAgICAgZmxvYXQgeTEgPSBnZXRCb3hlcyhiLDApO1xuICAgICAgICBmbG9hdCB4MSA9IGdldEJveGVzKGIsMSk7XG4gICAgICAgIGZsb2F0IHkyID0gZ2V0Qm94ZXMoYiwyKTtcbiAgICAgICAgZmxvYXQgeDIgPSBnZXRCb3hlcyhiLDMpO1xuXG4gICAgICAgIC8vIGdldCBpbWFnZSBpbiBiYXRjaCBpbmRleFxuICAgICAgICBpbnQgYkluZCA9IHJvdW5kKGdldEJveEluZChiKSk7XG4gICAgICAgIGlmKGJJbmQgPCAwIHx8IGJJbmQgPj0gJHtiYXRjaH0pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmbG9hdCBoZWlnaHRfc2NhbGUgPSAke2hlaWdodFNjYWxlfTtcbiAgICAgICAgZmxvYXQgd2lkdGhfc2NhbGUgPSAke3dpZHRoU2NhbGV9O1xuXG4gICAgICAgIGZsb2F0IGluX3kgPSAke2luWX07XG4gICAgICAgIGlmKCBpbl95IDwgMC4wIHx8IGluX3kgPiAke2lucHV0SGVpZ2h0RmxvYXR9ICkge1xuICAgICAgICAgIHNldE91dHB1dChmbG9hdCgke2V4dHJhcG9sYXRpb25WYWx1ZX0pKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZmxvYXQgaW5feCA9ICR7aW5YfTtcbiAgICAgICAgaWYoIGluX3ggPCAwLjAgfHwgaW5feCA+ICR7aW5wdXRXaWR0aEZsb2F0fSApIHtcbiAgICAgICAgICBzZXRPdXRwdXQoZmxvYXQoJHtleHRyYXBvbGF0aW9uVmFsdWV9KSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmVjMiBzb3VyY2VGcmFjSW5kZXhDUiA9IHZlYzIoaW5feCxpbl95KTtcbiAgICAgICAgaWYoJHttZXRob2RJZH0gPT0gMSkge1xuICAgICAgICAgIC8vIENvbXB1dGUgdGhlIGZvdXIgaW50ZWdlciBpbmRpY2VzLlxuICAgICAgICAgIGl2ZWMyIHNvdXJjZUZsb29yQ1IgPSBpdmVjMihzb3VyY2VGcmFjSW5kZXhDUik7XG4gICAgICAgICAgaXZlYzIgc291cmNlQ2VpbENSID0gaXZlYzIoY2VpbChzb3VyY2VGcmFjSW5kZXhDUikpO1xuXG4gICAgICAgICAgZmxvYXQgdG9wTGVmdCA9IGdldEltYWdlKGIsIHNvdXJjZUZsb29yQ1IueSwgc291cmNlRmxvb3JDUi54LCBkKTtcbiAgICAgICAgICBmbG9hdCBib3R0b21MZWZ0ID0gZ2V0SW1hZ2UoYiwgc291cmNlQ2VpbENSLnksIHNvdXJjZUZsb29yQ1IueCwgZCk7XG4gICAgICAgICAgZmxvYXQgdG9wUmlnaHQgPSBnZXRJbWFnZShiLCBzb3VyY2VGbG9vckNSLnksIHNvdXJjZUNlaWxDUi54LCBkKTtcbiAgICAgICAgICBmbG9hdCBib3R0b21SaWdodCA9IGdldEltYWdlKGIsIHNvdXJjZUNlaWxDUi55LCBzb3VyY2VDZWlsQ1IueCwgZCk7XG5cbiAgICAgICAgICB2ZWMyIGZyYWNDUiA9IHNvdXJjZUZyYWNJbmRleENSIC0gdmVjMihzb3VyY2VGbG9vckNSKTtcblxuICAgICAgICAgIGZsb2F0IHRvcCA9IHRvcExlZnQgKyAodG9wUmlnaHQgLSB0b3BMZWZ0KSAqIGZyYWNDUi54O1xuICAgICAgICAgIGZsb2F0IGJvdHRvbSA9IGJvdHRvbUxlZnQgKyAoYm90dG9tUmlnaHQgLSBib3R0b21MZWZ0KSAqIGZyYWNDUi54O1xuICAgICAgICAgIGZsb2F0IG5ld1ZhbHVlID0gdG9wICsgKGJvdHRvbSAtIHRvcCkgKiBmcmFjQ1IueTtcbiAgICAgICAgICBzZXRPdXRwdXQobmV3VmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIENvbXB1dGUgdGhlIGNvb3JkaW5hdG9ycyBvZiBuZWFyZXN0IG5laWdoYm9yIHBvaW50LlxuICAgICAgICAgIGl2ZWMyIHNvdXJjZU5lYXJlc3RDUiA9IGl2ZWMyKGZsb29yKFxuICAgICAgICAgICAgc291cmNlRnJhY0luZGV4Q1IgKyB2ZWMyKDAuNSwwLjUpKSk7XG4gICAgICAgICAgZmxvYXQgbmV3VmFsdWUgPSBnZXRJbWFnZShiLCBzb3VyY2VOZWFyZXN0Q1IueSwgc291cmNlTmVhcmVzdENSLngsIGQpO1xuICAgICAgICAgIHNldE91dHB1dChuZXdWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNyb3BfYW5kX3Jlc2l6ZV9ncHUuanMubWFwIiwiaW1wb3J0IHsgZ2V0Q29vcmRzRGF0YVR5cGUgfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5leHBvcnQgY2xhc3MgQ3VtU3VtUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3Ioc2hhcGUsIGV4Y2x1c2l2ZSwgcmV2ZXJzZSkge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgICAgICAgdGhpcy5jdXN0b21Vbmlmb3JtcyA9IFt7IG5hbWU6ICdpbmRleCcsIHR5cGU6ICdmbG9hdCcgfV07XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBzaGFwZTtcbiAgICAgICAgY29uc3QgcmFuayA9IHNoYXBlLmxlbmd0aDtcbiAgICAgICAgY29uc3QgdmFsID0gZXhjbHVzaXZlID8gJzAuMCcgOiBgZ2V0WCgke2dldENvb3JkcyhyYW5rLCAnY29vcmRzJyl9KWA7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHNoYXBlW3NoYXBlLmxlbmd0aCAtIDFdO1xuICAgICAgICBsZXQgY29uZGl0aW9uID0gJyc7XG4gICAgICAgIGxldCBpZHhTdHJpbmcgPSAnJztcbiAgICAgICAgLy8gV2hlbiBleGNsdXNpdmUgaXMgc2V0LCB0aGUgY3Vtc3VtIG9wIGJlY29tZXMgcm9sbCBvcCB0aGF0IGNvcGllcyB0aGVcbiAgICAgICAgLy8gdmFsdWUgZnJvbSB0aGUgcHJldmlvdXMgaW5kZXggYmFzZWQgb24gdGhlIGRpcmVjdGlvbiBzcGVjaWZpZWQgYnkgdGhlXG4gICAgICAgIC8vIHJldmVyc2UgZmxhZy5cbiAgICAgICAgaWYgKGV4Y2x1c2l2ZSkge1xuICAgICAgICAgICAgY29uZGl0aW9uID0gcmV2ZXJzZSA/IGBlbmQgIT0gJHtsZW5ndGggLSAxfWAgOiAnZW5kICE9IDAnO1xuICAgICAgICAgICAgaWR4U3RyaW5nID0gcmV2ZXJzZSA/ICdlbmQgKyAxJyA6ICdlbmQgLSAxJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IHJldmVyc2UgPyBgZW5kICsgcG93MiA8ICR7bGVuZ3RofWAgOiAnZW5kID49IHBvdzInO1xuICAgICAgICAgICAgaWR4U3RyaW5nID0gKHJldmVyc2UgPyAnZW5kICsgcG93MicgOiAnZW5kIC0gcG93MicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICR7Z2V0Q29vcmRzRGF0YVR5cGUocmFuayl9IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgZW5kID0gJHtnZXRGaW5hbENvb3JkKHJhbmssICdjb29yZHMnKX07XG4gICAgICAgIGZsb2F0IHZhbCA9ICR7dmFsfTtcbiAgICAgICAgaW50IHBvdzIgPSBpbnQocG93KDIuMCwgaW5kZXgpKTtcbiAgICAgICAgaWYgKCR7Y29uZGl0aW9ufSkge1xuICAgICAgICAgIGludCBpZHggPSAke2lkeFN0cmluZ307XG4gICAgICAgICAgJHtnZXRGaW5hbENvb3JkKHJhbmssICdjb29yZHMnKX0gPSBpZHg7XG4gICAgICAgICAgdmFsICs9IGdldFgoJHtnZXRDb29yZHMocmFuaywgJ2Nvb3JkcycpfSk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0T3V0cHV0KHZhbCk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRDb29yZHMocmFuaywgbmFtZSkge1xuICAgIGlmIChyYW5rID09PSAxKSB7XG4gICAgICAgIHJldHVybiBgJHtuYW1lfWA7XG4gICAgfVxuICAgIGVsc2UgaWYgKHJhbmsgPT09IDIpIHtcbiAgICAgICAgcmV0dXJuIGAke25hbWV9LngsICR7bmFtZX0ueWA7XG4gICAgfVxuICAgIGVsc2UgaWYgKHJhbmsgPT09IDMpIHtcbiAgICAgICAgcmV0dXJuIGAke25hbWV9LngsICR7bmFtZX0ueSwgJHtuYW1lfS56YDtcbiAgICB9XG4gICAgZWxzZSBpZiAocmFuayA9PT0gNCkge1xuICAgICAgICByZXR1cm4gYCR7bmFtZX0ueCwgJHtuYW1lfS55LCAke25hbWV9LnosICR7bmFtZX0ud2A7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBFcnJvcihgQ3VtdWxhdGl2ZSBzdW0gZm9yIHJhbmsgJHtyYW5rfSBpcyBub3QgeWV0IHN1cHBvcnRlZGApO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldEZpbmFsQ29vcmQocmFuaywgbmFtZSkge1xuICAgIGlmIChyYW5rID09PSAxKSB7XG4gICAgICAgIHJldHVybiBgJHtuYW1lfWA7XG4gICAgfVxuICAgIGVsc2UgaWYgKHJhbmsgPT09IDIpIHtcbiAgICAgICAgcmV0dXJuIGAke25hbWV9LnlgO1xuICAgIH1cbiAgICBlbHNlIGlmIChyYW5rID09PSAzKSB7XG4gICAgICAgIHJldHVybiBgJHtuYW1lfS56YDtcbiAgICB9XG4gICAgZWxzZSBpZiAocmFuayA9PT0gNCkge1xuICAgICAgICByZXR1cm4gYCR7bmFtZX0ud2A7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBFcnJvcihgQ3VtdWxhdGl2ZSBzdW0gZm9yIHJhbmsgJHtyYW5rfSBpcyBub3QgeWV0IHN1cHBvcnRlZGApO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWN1bXN1bV9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZ2V0R2xzbERpZmZlcmVuY2VzIH0gZnJvbSAnLi9nbHNsX3ZlcnNpb24nO1xuaW1wb3J0ICogYXMgc2hhZGVyX3V0aWwgZnJvbSAnLi9zaGFkZXJfY29tcGlsZXJfdXRpbCc7XG5pbXBvcnQgeyBnZXREZW5zZVRleFNoYXBlLCBQYWNraW5nU2NoZW1lIH0gZnJvbSAnLi90ZXhfdXRpbCc7XG5leHBvcnQgY2xhc3MgRGVjb2RlTWF0cml4UHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3Iob3V0cHV0U2hhcGUpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWydBJ107XG4gICAgICAgIHRoaXMucGFja2VkSW5wdXRzID0gZmFsc2U7XG4gICAgICAgIHRoaXMucGFja2VkT3V0cHV0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5vdXRQYWNraW5nU2NoZW1lID0gUGFja2luZ1NjaGVtZS5ERU5TRTtcbiAgICAgICAgY29uc3QgdGV4U2hhcGUgPSBnZXREZW5zZVRleFNoYXBlKG91dHB1dFNoYXBlKTtcbiAgICAgICAgY29uc3QgZ2xzbCA9IGdldEdsc2xEaWZmZXJlbmNlcygpO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGU7XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBpdmVjMyBvdXRDb29yZHNGcm9tRmxhdEluZGV4KGludCBpbmRleCkge1xuICAgICAgICAke3NoYWRlcl91dGlsLmdldExvZ2ljYWxDb29yZGluYXRlc0Zyb21GbGF0SW5kZXgoWydyJywgJ2MnLCAnZCddLCBvdXRwdXRTaGFwZSl9XG4gICAgICAgIHJldHVybiBpdmVjMyhyLCBjLCBkKTtcbiAgICAgIH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICB2ZWMyKCR7dGV4U2hhcGVbMF19LCAke3RleFNoYXBlWzFdfSkpO1xuICAgICAgICBpbnQgaW5kZXggPSA0ICogKHJlc1RleFJDLnggKiAke3RleFNoYXBlWzFdfSArIHJlc1RleFJDLnkpO1xuXG4gICAgICAgIHZlYzQgcmVzdWx0ID0gdmVjNCgwLik7XG5cbiAgICAgICAgZm9yIChpbnQgaT0wOyBpPDQ7IGkrKykge1xuICAgICAgICAgIGludCBmbGF0SW5kZXggPSBpbmRleCArIGk7XG4gICAgICAgICAgaXZlYzMgcmMgPSBvdXRDb29yZHNGcm9tRmxhdEluZGV4KGZsYXRJbmRleCk7XG4gICAgICAgICAgcmVzdWx0W2ldID0gZ2V0QShyYy54LCByYy55LCByYy56KTtcbiAgICAgICAgfVxuXG4gICAgICAgICR7Z2xzbC5vdXRwdXR9ID0gcmVzdWx0O1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGVjb2RlX21hdHJpeF9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZ2V0R2xzbERpZmZlcmVuY2VzIH0gZnJvbSAnLi9nbHNsX3ZlcnNpb24nO1xuaW1wb3J0ICogYXMgc2hhZGVyX3V0aWwgZnJvbSAnLi9zaGFkZXJfY29tcGlsZXJfdXRpbCc7XG5pbXBvcnQgeyBnZXREZW5zZVRleFNoYXBlLCBQYWNraW5nU2NoZW1lIH0gZnJvbSAnLi90ZXhfdXRpbCc7XG5leHBvcnQgY2xhc3MgRGVjb2RlTWF0cml4UGFja2VkUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3Iob3V0cHV0U2hhcGUpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWydBJ107XG4gICAgICAgIHRoaXMucGFja2VkSW5wdXRzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wYWNrZWRPdXRwdXQgPSB0cnVlO1xuICAgICAgICB0aGlzLm91dFBhY2tpbmdTY2hlbWUgPSBQYWNraW5nU2NoZW1lLkRFTlNFO1xuICAgICAgICBjb25zdCB0ZXhTaGFwZSA9IGdldERlbnNlVGV4U2hhcGUob3V0cHV0U2hhcGUpO1xuICAgICAgICBjb25zdCBnbHNsID0gZ2V0R2xzbERpZmZlcmVuY2VzKCk7XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGl2ZWMzIG91dENvb3Jkc0Zyb21GbGF0SW5kZXgoaW50IGluZGV4KSB7XG4gICAgICAgICR7c2hhZGVyX3V0aWwuZ2V0TG9naWNhbENvb3JkaW5hdGVzRnJvbUZsYXRJbmRleChbJ3InLCAnYycsICdkJ10sIG91dHB1dFNoYXBlKX1cbiAgICAgICAgcmV0dXJuIGl2ZWMzKHIsIGMsIGQpO1xuICAgICAgfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIocmVzdWx0VVYueXggKlxuICAgICAgICAgIHZlYzIoJHt0ZXhTaGFwZVswXX0sICR7dGV4U2hhcGVbMV19KSk7XG4gICAgICAgIGludCBpbmRleCA9IDQgKiAocmVzVGV4UkMueCAqICR7dGV4U2hhcGVbMV19ICsgcmVzVGV4UkMueSk7XG5cbiAgICAgICAgdmVjNCByZXN1bHQgPSB2ZWM0KDAuKTtcblxuICAgICAgICBmb3IgKGludCBpPTA7IGk8NDsgaSsrKSB7XG4gICAgICAgICAgaW50IGZsYXRJbmRleCA9IGluZGV4ICsgaTtcbiAgICAgICAgICBpdmVjMyByYyA9IG91dENvb3Jkc0Zyb21GbGF0SW5kZXgoZmxhdEluZGV4KTtcbiAgICAgICAgICByZXN1bHRbaV0gPSBnZXRDaGFubmVsKGdldEEocmMueCwgcmMueSwgcmMueiksIHZlYzIocmMueSwgcmMueikpO1xuICAgICAgICB9XG5cbiAgICAgICAgJHtnbHNsLm91dHB1dH0gPSByZXN1bHQ7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWNvZGVfbWF0cml4X3BhY2tlZF9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuZXhwb3J0IGNsYXNzIERlcHRoVG9TcGFjZVByb2dyYW0ge1xuICAgIGNvbnN0cnVjdG9yKG91dHB1dFNoYXBlLCBibG9ja1NpemUsIGRhdGFGb3JtYXQpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWyd4J107XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBbXTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IG91dHB1dFNoYXBlO1xuICAgICAgICB0aGlzLmJsb2NrU2l6ZSA9IGJsb2NrU2l6ZTtcbiAgICAgICAgdGhpcy5kYXRhRm9ybWF0ID0gZGF0YUZvcm1hdDtcbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICB2b2lkIG1haW4oKSB7XG4gICAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgIGludCBiID0gY29vcmRzWzBdO1xuICAgICAgaW50IGggPSAke3RoaXMuZ2V0SGVpZ2h0Q29vcmRTdHJpbmcoKX07XG4gICAgICBpbnQgdyA9ICR7dGhpcy5nZXRXaWR0aENvb3JkU3RyaW5nKCl9O1xuICAgICAgaW50IGQgPSAke3RoaXMuZ2V0RGVwdGhDb29yZFN0cmluZygpfTtcblxuICAgICAgaW50IGluX2ggPSBoIC8gJHtibG9ja1NpemV9O1xuICAgICAgaW50IG9mZnNldF9oID0gaW1vZChoLCAke2Jsb2NrU2l6ZX0pO1xuICAgICAgaW50IGluX3cgPSB3IC8gJHtibG9ja1NpemV9O1xuICAgICAgaW50IG9mZnNldF93ID0gaW1vZCh3LCAke2Jsb2NrU2l6ZX0pO1xuICAgICAgaW50IG9mZnNldF9kID0gKG9mZnNldF9oICogJHtibG9ja1NpemV9ICsgb2Zmc2V0X3cpICpcbiAgICAgICAgJHt0aGlzLmdldE91dHB1dERlcHRoU2l6ZSgpfTtcbiAgICAgIGludCBpbl9kID0gZCArIG9mZnNldF9kO1xuXG4gICAgICBmbG9hdCByZXN1bHQgPSAke3RoaXMuZ2V0SW5wdXRTYW1wbGluZ1N0cmluZygpfTtcbiAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgIH1cbiAgYDtcbiAgICB9XG4gICAgZ2V0SGVpZ2h0Q29vcmRTdHJpbmcoKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGFGb3JtYXQgPT09ICdOSFdDJykge1xuICAgICAgICAgICAgcmV0dXJuIGBjb29yZHNbMV1gO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGBjb29yZHNbMl1gO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldFdpZHRoQ29vcmRTdHJpbmcoKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGFGb3JtYXQgPT09ICdOSFdDJykge1xuICAgICAgICAgICAgcmV0dXJuIGBjb29yZHNbMl1gO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGBjb29yZHNbM11gO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldERlcHRoQ29vcmRTdHJpbmcoKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGFGb3JtYXQgPT09ICdOSFdDJykge1xuICAgICAgICAgICAgcmV0dXJuIGBjb29yZHNbM11gO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGBjb29yZHNbMV1gO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldE91dHB1dERlcHRoU2l6ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YUZvcm1hdCA9PT0gJ05IV0MnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5vdXRwdXRTaGFwZVszXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm91dHB1dFNoYXBlWzFdO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldElucHV0U2FtcGxpbmdTdHJpbmcoKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGFGb3JtYXQgPT09ICdOSFdDJykge1xuICAgICAgICAgICAgcmV0dXJuIGBnZXRYKGIsIGluX2gsIGluX3csIGluX2QpYDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBgZ2V0WChiLCBpbl9kLCBpbl9oLCBpbl93KWA7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZXB0aF90b19zcGFjZV9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuZXhwb3J0IGNsYXNzIERpYWdQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3RvcihzaXplKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsnWCddO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gW3NpemUsIHNpemVdO1xuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgIGl2ZWMyIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgIGZsb2F0IHZhbCA9IGNvb3Jkc1swXSA9PSBjb29yZHNbMV0gPyBnZXRYKGNvb3Jkc1swXSkgOiAwLjA7XG4gICAgICAgICAgc2V0T3V0cHV0KHZhbCk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaWFnX2dwdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5leHBvcnQgY2xhc3MgRGlsYXRpb24yRFByb2dyYW0ge1xuICAgIGNvbnN0cnVjdG9yKGNvbnZJbmZvKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsneCcsICdXJ107XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5vdXRTaGFwZTtcbiAgICAgICAgY29uc3QgeyBpbkhlaWdodCwgaW5XaWR0aCwgcGFkSW5mbywgc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aCwgZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGggfSA9IGNvbnZJbmZvO1xuICAgICAgICBjb25zdCB7IHRvcDogcGFkVG9wLCBsZWZ0OiBwYWRMZWZ0IH0gPSBwYWRJbmZvO1xuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgY29uc3QgaXZlYzIgc3RyaWRlcyA9IGl2ZWMyKCR7c3RyaWRlSGVpZ2h0fSwgJHtzdHJpZGVXaWR0aH0pO1xuICAgICAgY29uc3QgaXZlYzIgcGFkcyA9IGl2ZWMyKCR7cGFkVG9wfSwgJHtwYWRMZWZ0fSk7XG4gICAgICBjb25zdCBmbG9hdCBuZWdfaW5maW5pdHkgPSAtMy40ZTM4O1xuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHMueDtcbiAgICAgICAgaW50IGQxID0gY29vcmRzLnc7XG4gICAgICAgIGl2ZWMyIG91dFRvcExlZnRDb3JuZXIgPVxuICAgICAgICAgICAgY29vcmRzLnl6ICogc3RyaWRlcyAtIHBhZHM7XG4gICAgICAgIGludCBoQmVnID0gb3V0VG9wTGVmdENvcm5lci54O1xuICAgICAgICBpbnQgd0JlZyA9IG91dFRvcExlZnRDb3JuZXIueTtcblxuICAgICAgICBmbG9hdCBjdXJWYWwgPSBuZWdfaW5maW5pdHk7XG4gICAgICAgIGZvciAoaW50IGggPSAwOyBoIDwgJHtmaWx0ZXJIZWlnaHR9OyBoKyspIHtcbiAgICAgICAgICBpbnQgaEluID0gaEJlZyArIGggKiAke2RpbGF0aW9uSGVpZ2h0fTtcblxuICAgICAgICAgIGlmIChoSW4gPj0gMCAmJiBoSW4gPCAke2luSGVpZ2h0fSkge1xuICAgICAgICAgICAgZm9yIChpbnQgdyA9IDA7IHcgPCAke2ZpbHRlcldpZHRofTsgdysrKSB7XG4gICAgICAgICAgICAgIGludCB3SW4gPSB3QmVnICsgdyAqICR7ZGlsYXRpb25XaWR0aH07XG5cbiAgICAgICAgICAgICAgaWYgKHdJbiA+PSAwICYmIHdJbiA8ICR7aW5XaWR0aH0pIHtcbiAgICAgICAgICAgICAgICBmbG9hdCB4VmFsID0gZ2V0WChiYXRjaCwgaEluLCB3SW4sIGQxKTtcbiAgICAgICAgICAgICAgICBmbG9hdCB3VmFsID0gZ2V0VyhoLCB3LCBkMSk7XG5cbiAgICAgICAgICAgICAgICBmbG9hdCB2YWwgPSB4VmFsICsgd1ZhbDtcbiAgICAgICAgICAgICAgICBpZiAodmFsID4gY3VyVmFsKSB7XG4gICAgICAgICAgICAgICAgICBjdXJWYWwgPSB2YWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZmxvYXQgcmVzdWx0ID0gY3VyVmFsO1xuICAgICAgICBzZXRPdXRwdXQocmVzdWx0KTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRpbGF0aW9uX2dwdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBnZXRHbHNsRGlmZmVyZW5jZXMgfSBmcm9tICcuL2dsc2xfdmVyc2lvbic7XG5pbXBvcnQgeyBFTkNPREVfRkxPQVRfU05JUFBFVCB9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyX3V0aWwnO1xuaW1wb3J0IHsgVGV4dHVyZVVzYWdlIH0gZnJvbSAnLi90ZXhfdXRpbCc7XG5leHBvcnQgY2xhc3MgRW5jb2RlRmxvYXRQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3RvcihvdXRwdXRTaGFwZSkge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgICAgICAgdGhpcy5vdXRUZXhVc2FnZSA9IFRleHR1cmVVc2FnZS5ET1dOTE9BRDtcbiAgICAgICAgY29uc3QgZ2xzbCA9IGdldEdsc2xEaWZmZXJlbmNlcygpO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGU7XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAke0VOQ09ERV9GTE9BVF9TTklQUEVUfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGZsb2F0IHggPSBnZXRBQXRPdXRDb29yZHMoKTtcbiAgICAgICAgJHtnbHNsLm91dHB1dH0gPSBlbmNvZGVfZmxvYXQoeCk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lbmNvZGVfZmxvYXRfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGdldEdsc2xEaWZmZXJlbmNlcyB9IGZyb20gJy4vZ2xzbF92ZXJzaW9uJztcbmltcG9ydCB7IEVOQ09ERV9GTE9BVF9TTklQUEVUIH0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXJfdXRpbCc7XG5pbXBvcnQgeyBUZXh0dXJlVXNhZ2UgfSBmcm9tICcuL3RleF91dGlsJztcbmV4cG9ydCBjbGFzcyBFbmNvZGVGbG9hdFBhY2tlZFByb2dyYW0ge1xuICAgIGNvbnN0cnVjdG9yKG91dHB1dFNoYXBlKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICAgICAgICB0aGlzLnBhY2tlZElucHV0cyA9IHRydWU7XG4gICAgICAgIHRoaXMucGFja2VkT3V0cHV0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMub3V0VGV4VXNhZ2UgPSBUZXh0dXJlVXNhZ2UuRE9XTkxPQUQ7XG4gICAgICAgIGNvbnN0IGdsc2wgPSBnZXRHbHNsRGlmZmVyZW5jZXMoKTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IG91dHB1dFNoYXBlO1xuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgJHtFTkNPREVfRkxPQVRfU05JUFBFVH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMyBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgZmxvYXQgeCA9IGdldENoYW5uZWwoZ2V0QUF0T3V0Q29vcmRzKCksIHZlYzIoY29vcmRzLnksIGNvb3Jkcy56KSk7XG4gICAgICAgICR7Z2xzbC5vdXRwdXR9ID0gZW5jb2RlX2Zsb2F0KHgpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZW5jb2RlX2Zsb2F0X3BhY2tlZF9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZ2V0R2xzbERpZmZlcmVuY2VzIH0gZnJvbSAnLi9nbHNsX3ZlcnNpb24nO1xuaW1wb3J0ICogYXMgc2hhZGVyX3V0aWwgZnJvbSAnLi9zaGFkZXJfY29tcGlsZXJfdXRpbCc7XG5leHBvcnQgY2xhc3MgRW5jb2RlTWF0cml4UHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3Iob3V0cHV0U2hhcGUsIHRleFNoYXBlLCBpbnB1dElzVW5zaWduZWRCeXRlID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWydBJ107XG4gICAgICAgIGNvbnN0IGdsc2wgPSBnZXRHbHNsRGlmZmVyZW5jZXMoKTtcbiAgICAgICAgY29uc3QgW2hlaWdodCwgd2lkdGhdID0gdGV4U2hhcGU7XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICAgICAgbGV0IG91dHB1dCA9IGByZXN1bHRgO1xuICAgICAgICBpZiAoaW5wdXRJc1Vuc2lnbmVkQnl0ZSkge1xuICAgICAgICAgICAgb3V0cHV0ID0gYGZsb29yKHJlc3VsdCAqIDI1NS4gKyAwLjUpYDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgJHtzaGFkZXJfdXRpbC5nZXRGbGF0SW5kZXhGcm9tM0Qob3V0cHV0U2hhcGUpfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWMzIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuXG4gICAgICAgIGludCBmbGF0SW5kZXggPSBnZXRGbGF0SW5kZXgoY29vcmRzKTtcbiAgICAgICAgaW50IG9mZnNldCA9IGltb2QoZmxhdEluZGV4LCA0KTtcblxuICAgICAgICBmbGF0SW5kZXggPSBpZGl2KGZsYXRJbmRleCwgNCwgMS4pO1xuXG4gICAgICAgIGludCByID0gZmxhdEluZGV4IC8gJHt3aWR0aH07XG4gICAgICAgIGludCBjID0gaW1vZChmbGF0SW5kZXgsICR7d2lkdGh9KTtcbiAgICAgICAgdmVjMiB1diA9ICh2ZWMyKGMsIHIpICsgaGFsZkNSKSAvIHZlYzIoJHt3aWR0aH0uMCwgJHtoZWlnaHR9LjApO1xuICAgICAgICB2ZWM0IHZhbHVlcyA9ICR7Z2xzbC50ZXh0dXJlMkR9KEEsIHV2KTtcblxuICAgICAgICBmbG9hdCByZXN1bHQ7XG5cbiAgICAgICAgaWYob2Zmc2V0ID09IDApIHtcbiAgICAgICAgICByZXN1bHQgPSB2YWx1ZXNbMF07XG4gICAgICAgIH0gZWxzZSBpZihvZmZzZXQgPT0gMSkge1xuICAgICAgICAgIHJlc3VsdCA9IHZhbHVlc1sxXTtcbiAgICAgICAgfSBlbHNlIGlmKG9mZnNldCA9PSAyKSB7XG4gICAgICAgICAgcmVzdWx0ID0gdmFsdWVzWzJdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdCA9IHZhbHVlc1szXTtcbiAgICAgICAgfVxuXG4gICAgICAgICR7Z2xzbC5vdXRwdXR9ID0gdmVjNCgke291dHB1dH0sIDAuLCAwLiwgMC4pO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZW5jb2RlX21hdHJpeF9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZ2V0R2xzbERpZmZlcmVuY2VzIH0gZnJvbSAnLi9nbHNsX3ZlcnNpb24nO1xuaW1wb3J0ICogYXMgc2hhZGVyX3V0aWwgZnJvbSAnLi9zaGFkZXJfY29tcGlsZXJfdXRpbCc7XG4vKlxuVGhpcyBpcyBob3cgdGhlIHNoYWRlciBlbmNvZGVzIGEgdGVuc29yIHdpdGggc2hhcGUgPSBbMiwgMywgNV1cbihpbmRpY2VzIGFyZSBbYmF0Y2gsIHJvdywgY29sXSkuXG5cbjAwMHwwMDEgICAwMDJ8MDAzICAgMDA0fHh4eCAgIDAyMHwwMjEgICAwMjJ8MDIzICAgMDI0fHh4eFxuLS0tLS0tLSAgIC0tLS0tLS0gICAtLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS0gICAtLS0tLS0tXG4wMTB8MDExICAgMDEyfDAxMyAgIDAxNHx4eHggICB4eHh8eHh4ICAgeHh4fHh4eCAgIHh4eHx4eHhcblxuMTAwfDEwMSAgIDEwMnwxMDMgICAxMDR8eHh4ICAgMTIwfDEyMSAgIDEyMnwxMjMgICAxMjR8eHh4XG4tLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS0gICAtLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS1cbjExMHwxMTEgICAxMTJ8MTEzICAgMTE0fHh4eCAgIHh4eHx4eHggICB4eHh8eHh4ICAgeHh4fHh4eFxuXG5TaW5nbGUgdGV4ZWxzIGNvbnRhaW4gb25seSB2YWx1ZXMgZnJvbSB0aGUgc2FtZSBiYXRjaCwgYW5kIGZyb20gYWRqYWNlbnQgcm93c1xuYW5kIGNvbHVtbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBFbmNvZGVNYXRyaXhQYWNrZWRQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3RvcihvdXRwdXRTaGFwZSwgdGV4U2hhcGUsIGlucHV0SXNVbnNpZ25lZEJ5dGUgPSBmYWxzZSkge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgICAgICAgdGhpcy5wYWNrZWRJbnB1dHMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wYWNrZWRPdXRwdXQgPSB0cnVlO1xuICAgICAgICBjb25zdCBnbHNsID0gZ2V0R2xzbERpZmZlcmVuY2VzKCk7XG4gICAgICAgIGNvbnN0IFtoZWlnaHQsIHdpZHRoXSA9IHRleFNoYXBlO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGU7XG4gICAgICAgIGxldCBtYWluTG9vcCA9ICcnO1xuICAgICAgICBsZXQgb3V0cHV0ID0gJ3Jlc3VsdCc7XG4gICAgICAgIGlmIChpbnB1dElzVW5zaWduZWRCeXRlKSB7XG4gICAgICAgICAgICBvdXRwdXQgPSAnZmxvb3IocmVzdWx0ICogMjU1LiArIDAuNSknO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8PSAxOyByb3crKykge1xuICAgICAgICAgICAgZm9yIChsZXQgY29sID0gMDsgY29sIDw9IDE7IGNvbCsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hhbm5lbCA9IHJvdyAqIDIgKyBjb2w7XG4gICAgICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgIGxvY2FsQ29vcmRzID0gY29vcmRzO1xuICAgICAgICAgIGlmKGxvY2FsQ29vcmRzWzJdICsgJHtjb2x9IDwgJHtvdXRwdXRTaGFwZVsyXX0pIHtcbiAgICAgICAgICAgIGxvY2FsQ29vcmRzWzJdICs9ICR7Y29sfTtcbiAgICAgICAgICAgIGlmKGxvY2FsQ29vcmRzWzFdICsgJHtyb3d9IDwgJHtvdXRwdXRTaGFwZVsxXX0pIHtcbiAgICAgICAgICAgICAgbG9jYWxDb29yZHNbMV0gKz0gJHtyb3d9O1xuXG4gICAgICAgICAgICAgIGZsYXRJbmRleCA9IGdldEZsYXRJbmRleChsb2NhbENvb3Jkcyk7XG4gICAgICAgICAgICAgIG9mZnNldCA9IGltb2QoZmxhdEluZGV4LCA0KTtcblxuICAgICAgICAgICAgICBmbGF0SW5kZXggPSBpZGl2KGZsYXRJbmRleCwgNCwgMS4pO1xuXG4gICAgICAgICAgICAgIHIgPSBmbGF0SW5kZXggLyAke3dpZHRofTtcbiAgICAgICAgICAgICAgYyA9IGltb2QoZmxhdEluZGV4LCAke3dpZHRofSk7XG4gICAgICAgICAgICAgIHV2ID0gKHZlYzIoYywgcikgKyBoYWxmQ1IpIC8gdmVjMigke3dpZHRofS4wLCAke2hlaWdodH0uMCk7XG4gICAgICAgICAgICAgIHZhbHVlcyA9ICR7Z2xzbC50ZXh0dXJlMkR9KEEsIHV2KTtcblxuICAgICAgICAgICAgICBpZihvZmZzZXQgPT0gMCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdFske2NoYW5uZWx9XSA9IHZhbHVlc1swXTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmKG9mZnNldCA9PSAxKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0WyR7Y2hhbm5lbH1dID0gdmFsdWVzWzFdO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYob2Zmc2V0ID09IDIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRbJHtjaGFubmVsfV0gPSB2YWx1ZXNbMl07XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0WyR7Y2hhbm5lbH1dID0gdmFsdWVzWzNdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICBgO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAke3NoYWRlcl91dGlsLmdldEZsYXRJbmRleEZyb20zRChvdXRwdXRTaGFwZSl9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzMgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG5cbiAgICAgICAgdmVjNCByZXN1bHQgPSB2ZWM0KDAuKTtcbiAgICAgICAgaW50IGZsYXRJbmRleCwgciwgYywgb2Zmc2V0O1xuICAgICAgICBpdmVjMyBsb2NhbENvb3JkcztcbiAgICAgICAgdmVjMiB1djtcbiAgICAgICAgdmVjNCB2YWx1ZXM7XG5cbiAgICAgICAgJHttYWluTG9vcH1cblxuICAgICAgICAke2dsc2wub3V0cHV0fSA9ICR7b3V0cHV0fTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVuY29kZV9tYXRyaXhfcGFja2VkX2dwdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5leHBvcnQgY2xhc3MgRkZUUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoY29tcG9uZW50LCBpbnB1dFNoYXBlLCBpbnZlcnNlKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsncmVhbCcsICdpbWFnJ107XG4gICAgICAgIGNvbnN0IGlubmVyRGltID0gaW5wdXRTaGFwZVsxXTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IGlucHV0U2hhcGU7XG4gICAgICAgIGNvbnN0IGV4cG9uZW50TXVsdGlwbGllclNuaXBwZXQgPSBpbnZlcnNlID8gYDIuMCAqICR7TWF0aC5QSX1gIDogYC0yLjAgKiAke01hdGguUEl9YDtcbiAgICAgICAgY29uc3QgcmVzdWx0RGVub21pbmF0b3IgPSBpbnZlcnNlID8gYCR7aW5uZXJEaW19LjBgIDogJzEuMCc7XG4gICAgICAgIGxldCBvcFN0cmluZztcbiAgICAgICAgaWYgKGNvbXBvbmVudCA9PT0gJ3JlYWwnKSB7XG4gICAgICAgICAgICBvcFN0cmluZyA9ICdyZXR1cm4gcmVhbCAqIGV4cFIgLSBpbWFnICogZXhwSTsnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvbXBvbmVudCA9PT0gJ2ltYWcnKSB7XG4gICAgICAgICAgICBvcFN0cmluZyA9ICdyZXR1cm4gcmVhbCAqIGV4cEkgKyBpbWFnICogZXhwUjsnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGRlQgY29tcG9uZW50IG11c3QgYmUgZWl0aGVyIFwicmVhbFwiIG9yIFwiaW1hZ1wiLCBnb3QgJHtjb21wb25lbnR9LmApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCBmbG9hdCBleHBvbmVudE11bHRpcGxpZXIgPSAke2V4cG9uZW50TXVsdGlwbGllclNuaXBwZXR9O1xuXG4gICAgICBmbG9hdCB1bmFyeU9wQ29tcGxleChmbG9hdCByZWFsLCBmbG9hdCBleHBSLCBmbG9hdCBpbWFnLCBmbG9hdCBleHBJKSB7XG4gICAgICAgICR7b3BTdHJpbmd9XG4gICAgICB9XG5cbiAgICAgIGZsb2F0IG11bE1hdERGVChpbnQgYmF0Y2gsIGludCBpbmRleCkge1xuICAgICAgICBmbG9hdCBpbmRleFJhdGlvID0gZmxvYXQoaW5kZXgpIC8gZmxvYXQoJHtpbm5lckRpbX0pO1xuICAgICAgICBmbG9hdCBleHBvbmVudE11bHRpcGxpZXJUaW1lc0luZGV4UmF0aW8gPVxuICAgICAgICAgICAgZXhwb25lbnRNdWx0aXBsaWVyICogaW5kZXhSYXRpbztcblxuICAgICAgICBmbG9hdCByZXN1bHQgPSAwLjA7XG5cbiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAke2lubmVyRGltfTsgaSsrKSB7XG4gICAgICAgICAgLy8geCA9ICgtMnwyICogUEkgLyBOKSAqIGluZGV4ICogaTtcbiAgICAgICAgICBmbG9hdCB4ID0gZXhwb25lbnRNdWx0aXBsaWVyVGltZXNJbmRleFJhdGlvICogZmxvYXQoaSk7XG4gICAgICAgICAgZmxvYXQgZXhwUiA9IGNvcyh4KTtcbiAgICAgICAgICBmbG9hdCBleHBJID0gc2luKHgpO1xuICAgICAgICAgIGZsb2F0IHJlYWwgPSBnZXRSZWFsKGJhdGNoLCBpKTtcbiAgICAgICAgICBmbG9hdCBpbWFnID0gZ2V0SW1hZyhiYXRjaCwgaSk7XG5cbiAgICAgICAgICByZXN1bHQgKz1cbiAgICAgICAgICAgICAgdW5hcnlPcENvbXBsZXgocmVhbCwgZXhwUiwgaW1hZywgZXhwSSkgLyAke3Jlc3VsdERlbm9taW5hdG9yfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzIgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIHNldE91dHB1dChtdWxNYXRERlQoY29vcmRzWzBdLCBjb29yZHNbMV0pKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZmdF9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuZXhwb3J0IGNsYXNzIEZpbGxQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3RvcihzaGFwZSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IFtdO1xuICAgICAgICB0aGlzLmN1c3RvbVVuaWZvcm1zID0gW3sgbmFtZTogJ3ZhbHVlJywgdHlwZTogJ2Zsb2F0JyB9XTtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWyd4J107XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBzaGFwZTtcbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgLy8gSW5wdXQgY2FuIGJlIG9idGFpbmVkIGZyb20gdW5pZm9ybSB2YWx1ZS5cbiAgICAgICAgc2V0T3V0cHV0KHZhbHVlKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZpbGxfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGRldmljZV91dGlsLCBlbnYgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgZ2V0TWF4VGV4dHVyZXNJblNoYWRlciwgZ2V0V2ViR0xEaXNqb2ludFF1ZXJ5VGltZXJWZXJzaW9uLCBnZXRXZWJHTE1heFRleHR1cmVTaXplLCBpc0NhcGFibGVPZlJlbmRlcmluZ1RvRmxvYXRUZXh0dXJlLCBpc0Rvd25sb2FkRmxvYXRUZXh0dXJlRW5hYmxlZCwgaXNXZWJHTEZlbmNlRW5hYmxlZCwgaXNXZWJHTFZlcnNpb25FbmFibGVkIH0gZnJvbSAnLi93ZWJnbF91dGlsJztcbmNvbnN0IEVOViA9IGVudigpO1xuLyoqXG4gKiBUaGlzIGZpbGUgY29udGFpbnMgV2ViR0wtc3BlY2lmaWMgZmxhZyByZWdpc3RyYXRpb25zLlxuICovXG4vKipcbiAqIFRydWUgaWYgV2ViR0wgaXMgc3VwcG9ydGVkLlxuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdIQVNfV0VCR0wnLCAoKSA9PiBFTlYuZ2V0TnVtYmVyKCdXRUJHTF9WRVJTSU9OJykgPiAwKTtcbi8qKiAwOiBObyBXZWJHTCwgMTogV2ViR0wgMS4wLCAyOiBXZWJHTCAyLjAuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdXRUJHTF9WRVJTSU9OJywgKCkgPT4ge1xuICAgIGlmIChpc1dlYkdMVmVyc2lvbkVuYWJsZWQoMikpIHtcbiAgICAgICAgcmV0dXJuIDI7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzV2ViR0xWZXJzaW9uRW5hYmxlZCgxKSkge1xuICAgICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG59KTtcbi8qKiBXaGV0aGVyIHRvIGNoZWNrIGZvciBudW1lcmljYWwgcmVwcmVzZW50YXRpb24gcHJvYmxlbXMuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdXRUJHTF9DSEVDS19OVU1FUklDQUxfUFJPQkxFTVMnLCAoKSA9PiBmYWxzZSk7XG5FTlYucmVnaXN0ZXJGbGFnKCdXRUJHTF9CVUZGRVJfU1VQUE9SVEVEJywgKCkgPT4gRU5WLmdldCgnV0VCR0xfVkVSU0lPTicpID09PSAyKTtcbi8qKiBXaGV0aGVyIHRoZSBXZWJHTCBiYWNrZW5kIHdpbGwgc29tZXRpbWVzIGZvcndhcmQgb3BzIHRvIHRoZSBDUFUuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdXRUJHTF9DUFVfRk9SV0FSRCcsICgpID0+IHRydWUpO1xuLyoqIFdoZXRoZXIgdGhlIFdlYkdMIGJhY2tlbmQgd2lsbCBhbHdheXMgdXNlIGYxNiB0ZXh0dXJlcyBmb3IgcmVuZGVyaW5nLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfRk9SQ0VfRjE2X1RFWFRVUkVTJywgKCkgPT4gZmFsc2UpO1xuLyoqIFdoZXRoZXIgdG8gdHVybiBhbGwgcGFja2luZyByZWxhdGVkIGZsYWdzIG9uLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfUEFDSycsICgpID0+IEVOVi5nZXRCb29sKCdIQVNfV0VCR0wnKSk7XG4vKiogV2hldGhlciB3ZSB3aWxsIHBhY2sgdGhlIGJhdGNobm9ybWFsaXphdGlvbiBvcC4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1dFQkdMX1BBQ0tfTk9STUFMSVpBVElPTicsICgpID0+IEVOVi5nZXRCb29sKCdXRUJHTF9QQUNLJykpO1xuLyoqIFdoZXRoZXIgd2Ugd2lsbCBwYWNrIHRoZSBjbGlwIG9wLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfUEFDS19DTElQJywgKCkgPT4gRU5WLmdldEJvb2woJ1dFQkdMX1BBQ0snKSk7XG4vKiogV2hldGhlciB3ZSB3aWxsIHBhY2sgdGhlIGRlcHRod2lzZSBjb252IG9wLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfUEFDS19ERVBUSFdJU0VDT05WJywgKCkgPT4gRU5WLmdldEJvb2woJ1dFQkdMX1BBQ0snKSk7XG4vKiogV2hldGhlciB3ZSB3aWxsIHBhY2sgYmluYXJ5IG9wcy4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1dFQkdMX1BBQ0tfQklOQVJZX09QRVJBVElPTlMnLCAoKSA9PiBFTlYuZ2V0Qm9vbCgnV0VCR0xfUEFDSycpKTtcbi8qKiBXaGV0aGVyIHdlIHdpbGwgcGFjayB1bmFyeSBvcHMuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdXRUJHTF9QQUNLX1VOQVJZX09QRVJBVElPTlMnLCAoKSA9PiBFTlYuZ2V0Qm9vbCgnV0VCR0xfUEFDSycpKTtcbi8qKiBXaGV0aGVyIHdlIHdpbGwgcGFjayBhcnJheSBvcHMuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdXRUJHTF9QQUNLX0FSUkFZX09QRVJBVElPTlMnLCAoKSA9PiBFTlYuZ2V0Qm9vbCgnV0VCR0xfUEFDSycpKTtcbi8qKiBXaGV0aGVyIHdlIHdpbGwgcGFjayBpbWFnZSBvcHMuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdXRUJHTF9QQUNLX0lNQUdFX09QRVJBVElPTlMnLCAoKSA9PiBFTlYuZ2V0Qm9vbCgnV0VCR0xfUEFDSycpKTtcbi8qKiBXaGV0aGVyIHdlIHdpbGwgcGFjayByZWR1Y2Ugb3BzLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfUEFDS19SRURVQ0UnLCAoKSA9PiBFTlYuZ2V0Qm9vbCgnV0VCR0xfUEFDSycpKTtcbi8qKiBXaGV0aGVyIHBhY2tlZCBXZWJHTCBrZXJuZWxzIGxhemlseSB1bnBhY2sgdGhlaXIgb3V0cHV0cy4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1dFQkdMX0xBWklMWV9VTlBBQ0snLCAoKSA9PiBFTlYuZ2V0Qm9vbCgnV0VCR0xfUEFDSycpKTtcbi8qKiBXaGV0aGVyIHdlIHdpbGwgdXNlIHRoZSBpbTJjb2wgYWxnb3JpdGhtIHRvIHNwZWVkIHVwIGNvbnZvbHV0aW9ucy4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1dFQkdMX0NPTlZfSU0yQ09MJywgKCkgPT4gRU5WLmdldEJvb2woJ1dFQkdMX1BBQ0snKSk7XG4vKiogVGhlIG1heGltdW0gdGV4dHVyZSBkaW1lbnNpb24uICovXG5FTlYucmVnaXN0ZXJGbGFnKCdXRUJHTF9NQVhfVEVYVFVSRV9TSVpFJywgKCkgPT4gZ2V0V2ViR0xNYXhUZXh0dXJlU2l6ZShFTlYuZ2V0TnVtYmVyKCdXRUJHTF9WRVJTSU9OJykpKTtcbi8qKiBUaGUgbWF4aW11bSB0ZXh0dXJlIGRpbWVuc2lvbi4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1dFQkdMX01BWF9URVhUVVJFU19JTl9TSEFERVInLCAoKSA9PiBnZXRNYXhUZXh0dXJlc0luU2hhZGVyKEVOVi5nZXROdW1iZXIoJ1dFQkdMX1ZFUlNJT04nKSkpO1xuLyoqXG4gKiBUaGUgZGlzam9pbnRfcXVlcnlfdGltZXIgZXh0ZW5zaW9uIHZlcnNpb24uXG4gKiAwOiBkaXNhYmxlZCwgMTogRVhUX2Rpc2pvaW50X3RpbWVyX3F1ZXJ5LCAyOlxuICogRVhUX2Rpc2pvaW50X3RpbWVyX3F1ZXJ5X3dlYmdsMi5cbiAqIEluIEZpcmVmb3ggd2l0aCBXZWJHTCAyLjAsXG4gKiBFWFRfZGlzam9pbnRfdGltZXJfcXVlcnlfd2ViZ2wyIGlzIG5vdCBhdmFpbGFibGUsIHNvIHdlIG11c3QgdXNlIHRoZVxuICogV2ViR0wgMS4wIGV4dGVuc2lvbi5cbiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1ZFUlNJT04nLCAoKSA9PiB7XG4gICAgY29uc3Qgd2ViR0xWZXJzaW9uID0gRU5WLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpO1xuICAgIGlmICh3ZWJHTFZlcnNpb24gPT09IDApIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHJldHVybiBnZXRXZWJHTERpc2pvaW50UXVlcnlUaW1lclZlcnNpb24od2ViR0xWZXJzaW9uKTtcbn0pO1xuLyoqXG4gKiBXaGV0aGVyIHRoZSB0aW1lciBvYmplY3QgZnJvbSB0aGUgZGlzam9pbnRfcXVlcnlfdGltZXIgZXh0ZW5zaW9uIGdpdmVzXG4gKiB0aW1pbmcgaW5mb3JtYXRpb24gdGhhdCBpcyByZWxpYWJsZS5cbiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1JFTElBQkxFJywgKCkgPT4gRU5WLmdldE51bWJlcignV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1ZFUlNJT04nKSA+IDAgJiZcbiAgICAhZGV2aWNlX3V0aWwuaXNNb2JpbGUoKSk7XG4vKipcbiAqIFdoZXRoZXIgdGhlIGRldmljZSBpcyBwaHlzaWNhbGx5IGNhcGFibGUgb2YgcmVuZGVyaW5nIHRvIGZsb2F0MzIgdGV4dHVyZXMuXG4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1dFQkdMX1JFTkRFUl9GTE9BVDMyX0NBUEFCTEUnLCAoKSA9PiBpc0NhcGFibGVPZlJlbmRlcmluZ1RvRmxvYXRUZXh0dXJlKEVOVi5nZXROdW1iZXIoJ1dFQkdMX1ZFUlNJT04nKSkpO1xuLyoqXG4gKiBXaGV0aGVyIHJlbmRlcmluZyB0byBmbG9hdDMyIHRleHR1cmVzIGlzIGVuYWJsZWQuIElmIGRpc2FibGVkLCByZW5kZXJzIHRvXG4gKiBmbG9hdDE2IHRleHR1cmVzLlxuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdXRUJHTF9SRU5ERVJfRkxPQVQzMl9FTkFCTEVEJywgKCkgPT4ge1xuICAgIHJldHVybiBFTlYuZ2V0Qm9vbCgnV0VCR0xfRk9SQ0VfRjE2X1RFWFRVUkVTJykgP1xuICAgICAgICBmYWxzZSA6XG4gICAgICAgIEVOVi5nZXRCb29sKCdXRUJHTF9SRU5ERVJfRkxPQVQzMl9DQVBBQkxFJyk7XG59KTtcbi8qKlxuICogV2hldGhlciBkb3dubG9hZGluZyBmbG9hdCB0ZXh0dXJlcyBpcyBlbmFibGVkICgxNiBvciAzMiBiaXQpLiBJZiBkaXNhYmxlZCxcbiAqIHVzZXMgSUVFRSA3NTQgZW5jb2Rpbmcgb2YgdGhlIGZsb2F0MzIgdmFsdWVzIHRvIDQgdWludDggd2hlbiBkb3dubG9hZGluZy5cbiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfRE9XTkxPQURfRkxPQVRfRU5BQkxFRCcsICgpID0+IGlzRG93bmxvYWRGbG9hdFRleHR1cmVFbmFibGVkKEVOVi5nZXROdW1iZXIoJ1dFQkdMX1ZFUlNJT04nKSkpO1xuLyoqIFdoZXRoZXIgdGhlIGZlbmNlIEFQSSBpcyBhdmFpbGFibGUuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdXRUJHTF9GRU5DRV9BUElfRU5BQkxFRCcsICgpID0+IGlzV2ViR0xGZW5jZUVuYWJsZWQoRU5WLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpKSk7XG4vKipcbiAqIFRlbnNvcnMgd2l0aCBzaXplIDw9IHRoYW4gdGhpcyB3aWxsIGJlIHVwbG9hZGVkIGFzIHVuaWZvcm1zLCBub3QgdGV4dHVyZXMuXG4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1dFQkdMX1NJWkVfVVBMT0FEX1VOSUZPUk0nLCAoKSA9PiB7XG4gICAgLy8gVXNlIHVuaWZvcm0gdXBsb2FkcyBvbmx5IHdoZW4gMzJiaXQgZmxvYXRzIGFyZSBzdXBwb3J0ZWQuIEluXG4gICAgLy8gMTZiaXRcbiAgICAvLyBlbnZpcm9ubWVudHMgdGhlcmUgYXJlIHByb2JsZW1zIHdpdGggY29tcGFyaW5nIGEgMTZiaXQgdGV4dHVyZSB2YWx1ZVxuICAgIC8vIHdpdGggYSAzMmJpdCB1bmlmb3JtIHZhbHVlLlxuICAgIGNvbnN0IHVzZVVuaWZvcm1zID0gRU5WLmdldEJvb2woJ1dFQkdMX1JFTkRFUl9GTE9BVDMyX0VOQUJMRUQnKTtcbiAgICByZXR1cm4gdXNlVW5pZm9ybXMgPyA0IDogMDtcbn0pO1xuLyoqXG4gKiBJZiB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIGFsbG9jYXRlZCBvbiB0aGUgR1BVIGlzIGdyZWF0ZXIgdGhhbiB0aGlzXG4gKiBudW1iZXIsIHdlIHdpbGwgYWdncmVzc2l2ZWx5IGRlbGV0ZSB0ZXh0dXJlcyB1cG9uIGRpc3Bvc2FsIHdpdGhcbiAqIGdsLmRlbGV0ZU1hdHJpeFRleHR1cmUsIHJhdGhlciB0aGFuIG1ha2luZyB0aGVtIGF2YWlsYWJsZSBmb3IgcmV1c2UuXG4gKlxuICogRGVmYXVsdCB2YWx1ZSAtMSBpbmRpY2F0ZXMgdGhhdCB3ZSB3aWxsIG5ldmVyIGFnZ3Jlc3NpdmVseSBkZWxldGUgdGV4dHVyZXMuXG4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1dFQkdMX0RFTEVURV9URVhUVVJFX1RIUkVTSE9MRCcsICgpID0+IHtcbiAgICByZXR1cm4gLTE7XG59LCB0aHJlc2hvbGQgPT4ge1xuICAgIGlmICh0aHJlc2hvbGQgPCAwICYmIHRocmVzaG9sZCAhPT0gLTEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBXRUJHTF9ERUxFVEVfVEVYVFVSRV9USFJFU0hPTEQgbXVzdCBiZSAtMSAoaW5kaWNhdGluZyBuZXZlciBgICtcbiAgICAgICAgICAgIGBkZWxldGUpIG9yIGF0IGxlYXN0IDAsIGJ1dCBnb3QgJHt0aHJlc2hvbGR9LmApO1xuICAgIH1cbn0pO1xuLyoqXG4gKiBUcmlnZ2VyIGEgbWFudWFsIEdMIGNvbW1hbmQgZmx1c2ggaWYgdGhlIHRocmVzaG9sZCBvZiB0aW1lIGhhcyBwYXNzZWQgc2luY2VcbiAqIHByZXZpb3VzIEtlcm5lbCBleGVjdXRpb24uIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgQW5kb3JpZCBkZXZpY2Ugd2hlcmUgR0xcbiAqIGNvbW1hbmQgZmx1c2ggYXJlIGRlbGF5ZWQgdW4gdGlsIHRoZSBlbmQgb2YgamF2YXNjcmlwdCB0YXNrLiBUaGlzIHZhbHVlIGlzXG4gKiBtZWFzdXJlZCBpbiBtaWxsaXNlY29uZC4gVHlwaWNhbGx5IHlvdSB3YW50IHRvIHNldCB0aGlzIHZhbHVlIHRvIGNsb3NlIHRvIDEuXG4gKlxuICogRGVmYXVsdCB2YWx1ZSAxIGZvciBtb2JpbGUgY2hyb21lLCBhbmQgLTEgZm9yIHJlc3QgY2FzZXMuIC0xIGluZGljYXRlcyB0aGF0XG4gKiB3ZSB3aWxsIG5vdCBlbmZvcmNlIG1hbnVhbCBmbHVzaCBhbmQgZGVwZW5kIG9uIHN5c3RlbSBkZWZhdWx0IGZsdXNoIHNjaGVkdWxlLlxuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdXRUJHTF9GTFVTSF9USFJFU0hPTEQnLCAoKSA9PiB7XG4gICAgcmV0dXJuIGRldmljZV91dGlsLmlzTW9iaWxlKCkgJiYgRU5WLmdldEJvb2woJ0lTX0NIUk9NRScpID8gMSA6IC0xO1xufSwgdGhyZXNob2xkID0+IHtcbiAgICBpZiAodGhyZXNob2xkIDwgMCAmJiB0aHJlc2hvbGQgIT09IC0xKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgV0VCR0xfRkxVU0hfVEhSRVNIT0xEIG11c3QgYmUgLTEgKGluZGljYXRpbmcgbmV2ZXIgYCArXG4gICAgICAgICAgICBgbWFudWFsIGZsdXNoKSBvciBhdCBsZWFzdCAwLCBidXQgZ290ICR7dGhyZXNob2xkfS5gKTtcbiAgICB9XG59KTtcbi8qKlxuICogVGhyZXNob2xkIGZvciBpbnB1dCB0ZW5zb3Igc2l6ZSB0aGF0IGRldGVybWluZXMgd2hldGhlciBXZWJHTCBiYWNrZW5kIHdpbGxcbiAqIGRlbGVnYXRlIGNvbXB1dGF0aW9uIHRvIENQVS5cbiAqXG4gKiBEZWZhdWx0IHZhbHVlIGlzIDEyOC5cbiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnQ1BVX0hBTkRPRkZfU0laRV9USFJFU0hPTEQnLCAoKSA9PiAxMjgpO1xuLyoqIFdoZXRoZXIgd2Ugd2lsbCB1c2Ugc2hhcGVzIHVuaWZvcm1zLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfVVNFX1NIQVBFU19VTklGT1JNUycsICgpID0+IGZhbHNlKTtcbi8qKlxuICogVGhyZXNob2xkIGZvciBsYXN0IGRpbWVuc2lvbiBvZiBpbnB1dCB0ZW5zb3IgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXJcbiAqIFdlYkdMIGJhY2tlbmQgZm9yIHRoZSBUb3AgSyBvcCB3aWxsIGRlbGVnYXRlIGNvbXB1dGF0aW9uIHRvIENQVS4gSWYgaW5wdXRcbiAqIGlzIHNtYWxsZXIgdGhhbiB0aHJlc2hvbGQgdGhlbiBDUFUgd2lsbCBiZSB1c2VkXG4gKlxuICogRGVmYXVsdCB2YWx1ZSBpcyAxMDAwMDAuXG4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1RPUEtfTEFTVF9ESU1fQ1BVX0hBTkRPRkZfU0laRV9USFJFU0hPTEQnLCAoKSA9PiAxMDAwMDApO1xuLyoqXG4gKiBUaHJlc2hvbGQgZm9yIEsgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXJcbiAqIFdlYkdMIGJhY2tlbmQgZm9yIHRoZSBUb3AgSyBvcCB3aWxsIGRlbGVnYXRlIGNvbXB1dGF0aW9uIHRvIENQVS4gSWYga1xuICogaXMgbGFyZ2VyIHRoYW4gdGhyZXNob2xkIHRoZW4gQ1BVIHdpbGwgYmUgdXNlZFxuICpcbiAqIERlZmF1bHQgdmFsdWUgaXMgMTI4LlxuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdUT1BLX0tfQ1BVX0hBTkRPRkZfVEhSRVNIT0xEJywgKCkgPT4gMTI4KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZsYWdzX3dlYmdsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmV4cG9ydCBjbGFzcyBGbGlwTGVmdFJpZ2h0UHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoaW1hZ2VTaGFwZSkge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ0ltYWdlJ107XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBbXTtcbiAgICAgICAgY29uc3QgaW1hZ2VXaWR0aCA9IGltYWdlU2hhcGVbMl07XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBpbWFnZVNoYXBlO1xuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgICAgaW50IHggPSBjb29yZHNbMl07XG5cbiAgICAgICAgICBpbnQgY29vcmRYID0gJHtpbWFnZVdpZHRofSAtIHggLSAxO1xuICAgICAgICAgIGZsb2F0IG91dHB1dFZhbHVlO1xuICAgICAgICAgIGlmKGNvb3JkWCA+PSAwICYmIGNvb3JkWCA8ICR7aW1hZ2VXaWR0aH0pIHtcbiAgICAgICAgICAgIG91dHB1dFZhbHVlID0gZ2V0SW1hZ2UoY29vcmRzWzBdLCBjb29yZHNbMV0sIGNvb3JkWCwgY29vcmRzWzNdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0cHV0VmFsdWUgPSBnZXRJbWFnZShjb29yZHNbMF0sIGNvb3Jkc1sxXSwgY29vcmRzWzJdLCBjb29yZHNbM10pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZXRPdXRwdXQob3V0cHV0VmFsdWUpO1xuICAgICAgICB9XG4gICAgYDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mbGlwX2xlZnRfcmlnaHRfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGdldENvb3Jkc0RhdGFUeXBlIH0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuZXhwb3J0IGNsYXNzIEdhdGhlclByb2dyYW0ge1xuICAgIGNvbnN0cnVjdG9yKGFTaGFwZSwgb3V0cHV0U2hhcGUpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWydBJywgJ2luZGljZXMnXTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IG91dHB1dFNoYXBlO1xuICAgICAgICB0aGlzLnJhbmsgPSBvdXRwdXRTaGFwZS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGR0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUodGhpcy5yYW5rKTtcbiAgICAgICAgY29uc3Qgc291cmNlQ29vcmRzID0gZ2V0U291cmNlQ29vcmRzKGFTaGFwZSwgMik7XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICR7ZHR5cGV9IHJlc1JDID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIHNldE91dHB1dChnZXRBKCR7c291cmNlQ29vcmRzfSkpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuLy8gVGhlIGlucHV0IGFuZCBvdXRwdXQgYXJlIGFsd2F5cyBmbGF0dGVuZWQgaW50byByYW5rIDQgdGVuc29ycy5cbmZ1bmN0aW9uIGdldFNvdXJjZUNvb3JkcyhhU2hhcGUsIGF4aXMpIHtcbiAgICBjb25zdCBjdXJyZW50Q29vcmRzID0gWydyZXNSQy54JywgJ3Jlc1JDLnknLCAncmVzUkMueicsICdyZXNSQy53J107XG4gICAgY29uc3Qgc291cmNlQ29vcmRzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhU2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGkgPT09IDIpIHtcbiAgICAgICAgICAgIHNvdXJjZUNvb3Jkcy5wdXNoKCdpbnQoZ2V0SW5kaWNlcyhyZXNSQy54LCByZXNSQy56KSknKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNvdXJjZUNvb3Jkcy5wdXNoKGAke2N1cnJlbnRDb29yZHNbaV19YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNvdXJjZUNvb3Jkcy5qb2luKCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nYXRoZXJfZ3B1LmpzLm1hcCIsImltcG9ydCB7IGdldENvb3Jkc0RhdGFUeXBlIH0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuZXhwb3J0IGNsYXNzIEdhdGhlck5EUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3Ioc2xpY2VEaW0sIHN0cmlkZXMsIHNoYXBlKSB7XG4gICAgICAgIHRoaXMuc2xpY2VEaW0gPSBzbGljZURpbTtcbiAgICAgICAgdGhpcy5zdHJpZGVzID0gc3RyaWRlcztcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWyd4JywgJ2luZGljZXMnXTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IHNoYXBlO1xuICAgICAgICBjb25zdCBzdHJpZGVzVHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHN0cmlkZXMubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgZHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShzaGFwZS5sZW5ndGgpO1xuICAgICAgICBjb25zdCBzdHJpZGVTdHJpbmcgPSB0aGlzLnNsaWNlRGltID4gMSA/ICdzdHJpZGVzW2pdJyA6ICdzdHJpZGVzJztcbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICAgJHtzdHJpZGVzVHlwZX0gc3RyaWRlcyA9ICR7c3RyaWRlc1R5cGV9KCR7dGhpcy5zdHJpZGVzfSk7XG4gICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgJHtkdHlwZX0gY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgICAgaW50IGZsYXR0ZW5JbmRleCA9IDA7XG4gICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAke3RoaXMuc2xpY2VEaW19OyBqKyspIHtcbiAgICAgICAgICAgIGludCBpbmRleCA9IHJvdW5kKGdldEluZGljZXMoY29vcmRzWzBdLCBqKSk7XG4gICAgICAgICAgICBmbGF0dGVuSW5kZXggKz0gaW5kZXggKiAke3N0cmlkZVN0cmluZ307XG4gICAgICAgICAgfVxuICAgICAgICAgIHNldE91dHB1dChnZXRYKGZsYXR0ZW5JbmRleCwgY29vcmRzWzFdKSk7XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2F0aGVyX25kX2dwdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBlbnYgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIGdldEdsc2xEaWZmZXJlbmNlcygpIHtcbiAgICBsZXQgdmVyc2lvbjtcbiAgICBsZXQgYXR0cmlidXRlO1xuICAgIGxldCB2YXJ5aW5nVnM7XG4gICAgbGV0IHZhcnlpbmdGcztcbiAgICBsZXQgdGV4dHVyZTJEO1xuICAgIGxldCBvdXRwdXQ7XG4gICAgbGV0IGRlZmluZU91dHB1dDtcbiAgICBsZXQgZGVmaW5lU3BlY2lhbE5hTjtcbiAgICBsZXQgZGVmaW5lU3BlY2lhbEluZjtcbiAgICBsZXQgZGVmaW5lUm91bmQ7XG4gICAgaWYgKGVudigpLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpID09PSAyKSB7XG4gICAgICAgIHZlcnNpb24gPSAnI3ZlcnNpb24gMzAwIGVzJztcbiAgICAgICAgYXR0cmlidXRlID0gJ2luJztcbiAgICAgICAgdmFyeWluZ1ZzID0gJ291dCc7XG4gICAgICAgIHZhcnlpbmdGcyA9ICdpbic7XG4gICAgICAgIHRleHR1cmUyRCA9ICd0ZXh0dXJlJztcbiAgICAgICAgb3V0cHV0ID0gJ291dHB1dENvbG9yJztcbiAgICAgICAgZGVmaW5lT3V0cHV0ID0gJ291dCB2ZWM0IG91dHB1dENvbG9yOyc7XG4gICAgICAgIC8vIFVzZSBjdXN0b20gaXNuYW4gZGVmaW5pdGlvbiB0byB3b3JrIGFjcm9zcyBkaWZmZXJlbmNlcyBiZXR3ZWVuXG4gICAgICAgIC8vIGltcGxlbWVudGF0aW9ucyBvbiB2YXJpb3VzIHBsYXRmb3Jtcy4gV2hpbGUgdGhpcyBzaG91bGQgaGFwcGVuIGluIEFOR0xFXG4gICAgICAgIC8vIHdlIHN0aWxsIHNlZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGFuZHJvaWQgYW5kIHdpbmRvd3MgKG9uIGNocm9tZSkgd2hlblxuICAgICAgICAvLyB1c2luZyBpc25hbiBkaXJlY3RseS5cbiAgICAgICAgZGVmaW5lU3BlY2lhbE5hTiA9IGBcbiAgICAgIGJvb2wgaXNuYW5fY3VzdG9tKGZsb2F0IHZhbCkge1xuICAgICAgICByZXR1cm4gKHZhbCA+IDAuMCB8fCB2YWwgPCAwLjApID8gZmFsc2UgOiB2YWwgIT0gMC4wO1xuICAgICAgfVxuXG4gICAgICBidmVjNCBpc25hbl9jdXN0b20odmVjNCB2YWwpIHtcbiAgICAgICAgcmV0dXJuIGJ2ZWM0KGlzbmFuX2N1c3RvbSh2YWwueCksXG4gICAgICAgICAgaXNuYW5fY3VzdG9tKHZhbC55KSwgaXNuYW5fY3VzdG9tKHZhbC56KSwgaXNuYW5fY3VzdG9tKHZhbC53KSk7XG4gICAgICB9XG5cbiAgICAgICNkZWZpbmUgaXNuYW4odmFsdWUpIGlzbmFuX2N1c3RvbSh2YWx1ZSlcbiAgICBgO1xuICAgICAgICAvLyBJbiB3ZWJnbCAyIHdlIGRvIG5vdCBuZWVkIHRvIHNwZWNpZnkgYSBjdXN0b20gaXNpbmYgc28gdGhlcmUgaXMgbm9cbiAgICAgICAgLy8gbmVlZCBmb3IgYSBzcGVjaWFsIElORklOSVRZIGNvbnN0YW50LlxuICAgICAgICBkZWZpbmVTcGVjaWFsSW5mID0gYGA7XG4gICAgICAgIGRlZmluZVJvdW5kID0gYFxuICAgICAgI2RlZmluZSByb3VuZCh2YWx1ZSkgbmV3Um91bmQodmFsdWUpXG4gICAgICBpbnQgbmV3Um91bmQoZmxvYXQgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGludChmbG9vcih2YWx1ZSArIDAuNSkpO1xuICAgICAgfVxuXG4gICAgICBpdmVjNCBuZXdSb3VuZCh2ZWM0IHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBpdmVjNChmbG9vcih2YWx1ZSArIHZlYzQoMC41KSkpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2ZXJzaW9uID0gJyc7XG4gICAgICAgIGF0dHJpYnV0ZSA9ICdhdHRyaWJ1dGUnO1xuICAgICAgICB2YXJ5aW5nVnMgPSAndmFyeWluZyc7XG4gICAgICAgIHZhcnlpbmdGcyA9ICd2YXJ5aW5nJztcbiAgICAgICAgdGV4dHVyZTJEID0gJ3RleHR1cmUyRCc7XG4gICAgICAgIG91dHB1dCA9ICdnbF9GcmFnQ29sb3InO1xuICAgICAgICBkZWZpbmVPdXRwdXQgPSAnJztcbiAgICAgICAgLy8gV2ViR0wxIGhhcyBubyBidWlsdCBpbiBpc25hbiBzbyB3ZSBkZWZpbmUgb25lIGhlcmUuXG4gICAgICAgIGRlZmluZVNwZWNpYWxOYU4gPSBgXG4gICAgICAjZGVmaW5lIGlzbmFuKHZhbHVlKSBpc25hbl9jdXN0b20odmFsdWUpXG4gICAgICBib29sIGlzbmFuX2N1c3RvbShmbG9hdCB2YWwpIHtcbiAgICAgICAgcmV0dXJuICh2YWwgPiAwLiB8fCB2YWwgPCAxLiB8fCB2YWwgPT0gMC4pID8gZmFsc2UgOiB0cnVlO1xuICAgICAgfVxuICAgICAgYnZlYzQgaXNuYW5fY3VzdG9tKHZlYzQgdmFsKSB7XG4gICAgICAgIHJldHVybiBidmVjNChpc25hbih2YWwueCksIGlzbmFuKHZhbC55KSwgaXNuYW4odmFsLnopLCBpc25hbih2YWwudykpO1xuICAgICAgfVxuICAgIGA7XG4gICAgICAgIGRlZmluZVNwZWNpYWxJbmYgPSBgXG4gICAgICB1bmlmb3JtIGZsb2F0IElORklOSVRZO1xuXG4gICAgICBib29sIGlzaW5mKGZsb2F0IHZhbCkge1xuICAgICAgICByZXR1cm4gYWJzKHZhbCkgPT0gSU5GSU5JVFk7XG4gICAgICB9XG4gICAgICBidmVjNCBpc2luZih2ZWM0IHZhbCkge1xuICAgICAgICByZXR1cm4gZXF1YWwoYWJzKHZhbCksIHZlYzQoSU5GSU5JVFkpKTtcbiAgICAgIH1cbiAgICBgO1xuICAgICAgICBkZWZpbmVSb3VuZCA9IGBcbiAgICAgIGludCByb3VuZChmbG9hdCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gaW50KGZsb29yKHZhbHVlICsgMC41KSk7XG4gICAgICB9XG5cbiAgICAgIGl2ZWM0IHJvdW5kKHZlYzQgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGl2ZWM0KGZsb29yKHZhbHVlICsgdmVjNCgwLjUpKSk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdmVyc2lvbixcbiAgICAgICAgYXR0cmlidXRlLFxuICAgICAgICB2YXJ5aW5nVnMsXG4gICAgICAgIHZhcnlpbmdGcyxcbiAgICAgICAgdGV4dHVyZTJELFxuICAgICAgICBvdXRwdXQsXG4gICAgICAgIGRlZmluZU91dHB1dCxcbiAgICAgICAgZGVmaW5lU3BlY2lhbE5hTixcbiAgICAgICAgZGVmaW5lU3BlY2lhbEluZixcbiAgICAgICAgZGVmaW5lUm91bmRcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2xzbF92ZXJzaW9uLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGVudiwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBnZXRXZWJHTENvbnRleHQsIHNldFdlYkdMQ29udGV4dCB9IGZyb20gJy4vY2FudmFzX3V0aWwnO1xuaW1wb3J0ICogYXMgZ3BncHVfdXRpbCBmcm9tICcuL2dwZ3B1X3V0aWwnO1xuaW1wb3J0ICogYXMgdGV4X3V0aWwgZnJvbSAnLi90ZXhfdXRpbCc7XG5pbXBvcnQgKiBhcyB3ZWJnbF91dGlsIGZyb20gJy4vd2ViZ2xfdXRpbCc7XG5leHBvcnQgY2xhc3MgR1BHUFVDb250ZXh0IHtcbiAgICBjb25zdHJ1Y3RvcihnbCkge1xuICAgICAgICB0aGlzLm91dHB1dFRleHR1cmUgPSBudWxsO1xuICAgICAgICB0aGlzLnByb2dyYW0gPSBudWxsO1xuICAgICAgICB0aGlzLmRpc3Bvc2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMudmVydGV4QXR0cnNBcmVCb3VuZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLml0ZW1zVG9Qb2xsID0gW107XG4gICAgICAgIGNvbnN0IGdsVmVyc2lvbiA9IGVudigpLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpO1xuICAgICAgICBpZiAoZ2wgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5nbCA9IGdsO1xuICAgICAgICAgICAgc2V0V2ViR0xDb250ZXh0KGdsVmVyc2lvbiwgZ2wpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5nbCA9IGdldFdlYkdMQ29udGV4dChnbFZlcnNpb24pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlYkdMIDIuMCBlbmFibGVzIHRleHR1cmUgZmxvYXRzIHdpdGhvdXQgYW4gZXh0ZW5zaW9uLlxuICAgICAgICBsZXQgQ09MT1JfQlVGRkVSX0ZMT0FUID0gJ1dFQkdMX2NvbG9yX2J1ZmZlcl9mbG9hdCc7XG4gICAgICAgIGNvbnN0IENPTE9SX0JVRkZFUl9IQUxGX0ZMT0FUID0gJ0VYVF9jb2xvcl9idWZmZXJfaGFsZl9mbG9hdCc7XG4gICAgICAgIGlmIChlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX1ZFUlNJT04nKSA9PT0gMSkge1xuICAgICAgICAgICAgY29uc3QgVEVYVFVSRV9GTE9BVCA9ICdPRVNfdGV4dHVyZV9mbG9hdCc7XG4gICAgICAgICAgICBjb25zdCBURVhUVVJFX0hBTEZfRkxPQVQgPSAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdCc7XG4gICAgICAgICAgICB0aGlzLnRleHR1cmVGbG9hdEV4dGVuc2lvbiA9XG4gICAgICAgICAgICAgICAgd2ViZ2xfdXRpbC5nZXRFeHRlbnNpb25PclRocm93KHRoaXMuZ2wsIFRFWFRVUkVfRkxPQVQpO1xuICAgICAgICAgICAgaWYgKHdlYmdsX3V0aWwuaGFzRXh0ZW5zaW9uKHRoaXMuZ2wsIFRFWFRVUkVfSEFMRl9GTE9BVCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRleHR1cmVIYWxmRmxvYXRFeHRlbnNpb24gPVxuICAgICAgICAgICAgICAgICAgICB3ZWJnbF91dGlsLmdldEV4dGVuc2lvbk9yVGhyb3codGhpcy5nbCwgVEVYVFVSRV9IQUxGX0ZMT0FUKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGVudigpLmdldCgnV0VCR0xfRk9SQ0VfRjE2X1RFWFRVUkVTJykpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dMIGNvbnRleHQgZG9lcyBub3Qgc3VwcG9ydCBoYWxmIGZsb2F0IHRleHR1cmVzLCB5ZXQgdGhlICcgK1xuICAgICAgICAgICAgICAgICAgICAnZW52aXJvbm1lbnQgZmxhZyBXRUJHTF9GT1JDRV9GMTZfVEVYVFVSRVMgaXMgc2V0IHRvIHRydWUuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbG9yQnVmZmVyRmxvYXRFeHRlbnNpb24gPSB0aGlzLmdsLmdldEV4dGVuc2lvbihDT0xPUl9CVUZGRVJfRkxPQVQpO1xuICAgICAgICAgICAgaWYgKHdlYmdsX3V0aWwuaGFzRXh0ZW5zaW9uKHRoaXMuZ2wsIENPTE9SX0JVRkZFUl9IQUxGX0ZMT0FUKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29sb3JCdWZmZXJIYWxmRmxvYXRFeHRlbnNpb24gPVxuICAgICAgICAgICAgICAgICAgICB3ZWJnbF91dGlsLmdldEV4dGVuc2lvbk9yVGhyb3codGhpcy5nbCwgQ09MT1JfQlVGRkVSX0hBTEZfRkxPQVQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZW52KCkuZ2V0KCdXRUJHTF9GT1JDRV9GMTZfVEVYVFVSRVMnKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignR0wgY29udGV4dCBkb2VzIG5vdCBzdXBwb3J0IGNvbG9yIHJlbmRlcmFibGUgaGFsZiBmbG9hdHMsIHlldCAnICtcbiAgICAgICAgICAgICAgICAgICAgJ3RoZSBlbnZpcm9ubWVudCBmbGFnIFdFQkdMX0ZPUkNFX0YxNl9URVhUVVJFUyBpcyBzZXQgdG8gdHJ1ZS4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIENPTE9SX0JVRkZFUl9GTE9BVCA9ICdFWFRfY29sb3JfYnVmZmVyX2Zsb2F0JztcbiAgICAgICAgICAgIGlmICh3ZWJnbF91dGlsLmhhc0V4dGVuc2lvbih0aGlzLmdsLCBDT0xPUl9CVUZGRVJfRkxPQVQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb2xvckJ1ZmZlckZsb2F0RXh0ZW5zaW9uID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nbC5nZXRFeHRlbnNpb24oQ09MT1JfQlVGRkVSX0ZMT0FUKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHdlYmdsX3V0aWwuaGFzRXh0ZW5zaW9uKHRoaXMuZ2wsIENPTE9SX0JVRkZFUl9IQUxGX0ZMT0FUKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29sb3JCdWZmZXJIYWxmRmxvYXRFeHRlbnNpb24gPVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdsLmdldEV4dGVuc2lvbihDT0xPUl9CVUZGRVJfSEFMRl9GTE9BVCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dMIGNvbnRleHQgZG9lcyBub3Qgc3VwcG9ydCBjb2xvciByZW5kZXJhYmxlIGZsb2F0cycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudmVydGV4QnVmZmVyID0gZ3BncHVfdXRpbC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5nbCk7XG4gICAgICAgIHRoaXMuaW5kZXhCdWZmZXIgPSBncGdwdV91dGlsLmNyZWF0ZUluZGV4QnVmZmVyKHRoaXMuZ2wpO1xuICAgICAgICB0aGlzLmZyYW1lYnVmZmVyID0gd2ViZ2xfdXRpbC5jcmVhdGVGcmFtZWJ1ZmZlcih0aGlzLmdsKTtcbiAgICAgICAgdGhpcy50ZXh0dXJlQ29uZmlnID1cbiAgICAgICAgICAgIHRleF91dGlsLmdldFRleHR1cmVDb25maWcodGhpcy5nbCwgdGhpcy50ZXh0dXJlSGFsZkZsb2F0RXh0ZW5zaW9uKTtcbiAgICB9XG4gICAgZ2V0IGRlYnVnKCkge1xuICAgICAgICByZXR1cm4gZW52KCkuZ2V0Qm9vbCgnREVCVUcnKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wcm9ncmFtICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignRGlzcG9zaW5nIGEgR1BHUFVDb250ZXh0IHRoYXQgc3RpbGwgaGFzIGEgYm91bmQgV2ViR0xQcm9ncmFtLicgK1xuICAgICAgICAgICAgICAgICcgVGhpcyBpcyBwcm9iYWJseSBhIHJlc291cmNlIGxlYWssIGRlbGV0ZSB0aGUgcHJvZ3JhbSB3aXRoICcgK1xuICAgICAgICAgICAgICAgICdHUEdQVUNvbnRleHQuZGVsZXRlUHJvZ3JhbSBiZWZvcmUgZGlzcG9zaW5nLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm91dHB1dFRleHR1cmUgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdEaXNwb3NpbmcgYSBHUEdQVUNvbnRleHQgdGhhdCBzdGlsbCBoYXMgYSBib3VuZCBvdXRwdXQgbWF0cml4ICcgK1xuICAgICAgICAgICAgICAgICd0ZXh0dXJlLiAgVGhpcyBpcyBwcm9iYWJseSBhIHJlc291cmNlIGxlYWssIGRlbGV0ZSB0aGUgb3V0cHV0ICcgK1xuICAgICAgICAgICAgICAgICdtYXRyaXggdGV4dHVyZSB3aXRoIEdQR1BVQ29udGV4dC5kZWxldGVNYXRyaXhUZXh0dXJlIGJlZm9yZSAnICtcbiAgICAgICAgICAgICAgICAnZGlzcG9zaW5nLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICAgICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmZpbmlzaCgpKTtcbiAgICAgICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgbnVsbCkpO1xuICAgICAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuZGVsZXRlRnJhbWVidWZmZXIodGhpcy5mcmFtZWJ1ZmZlcikpO1xuICAgICAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIG51bGwpKTtcbiAgICAgICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJpbmRCdWZmZXIoZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIG51bGwpKTtcbiAgICAgICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmRlbGV0ZUJ1ZmZlcih0aGlzLmluZGV4QnVmZmVyKSk7XG4gICAgICAgIHRoaXMuZGlzcG9zZWQgPSB0cnVlO1xuICAgIH1cbiAgICBjcmVhdGVGbG9hdDMyTWF0cml4VGV4dHVyZShyb3dzLCBjb2x1bW5zKSB7XG4gICAgICAgIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gICAgICAgIHJldHVybiBncGdwdV91dGlsLmNyZWF0ZUZsb2F0MzJNYXRyaXhUZXh0dXJlKHRoaXMuZ2wsIHJvd3MsIGNvbHVtbnMsIHRoaXMudGV4dHVyZUNvbmZpZyk7XG4gICAgfVxuICAgIGNyZWF0ZUZsb2F0MTZNYXRyaXhUZXh0dXJlKHJvd3MsIGNvbHVtbnMpIHtcbiAgICAgICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICAgICAgcmV0dXJuIGdwZ3B1X3V0aWwuY3JlYXRlRmxvYXQxNk1hdHJpeFRleHR1cmUodGhpcy5nbCwgcm93cywgY29sdW1ucywgdGhpcy50ZXh0dXJlQ29uZmlnKTtcbiAgICB9XG4gICAgY3JlYXRlVW5zaWduZWRCeXRlc01hdHJpeFRleHR1cmUocm93cywgY29sdW1ucykge1xuICAgICAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgICAgICByZXR1cm4gZ3BncHVfdXRpbC5jcmVhdGVVbnNpZ25lZEJ5dGVzTWF0cml4VGV4dHVyZSh0aGlzLmdsLCByb3dzLCBjb2x1bW5zLCB0aGlzLnRleHR1cmVDb25maWcpO1xuICAgIH1cbiAgICB1cGxvYWRQaXhlbERhdGFUb1RleHR1cmUodGV4dHVyZSwgcGl4ZWxzKSB7XG4gICAgICAgIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gICAgICAgIGdwZ3B1X3V0aWwudXBsb2FkUGl4ZWxEYXRhVG9UZXh0dXJlKHRoaXMuZ2wsIHRleHR1cmUsIHBpeGVscyk7XG4gICAgfVxuICAgIHVwbG9hZERlbnNlTWF0cml4VG9UZXh0dXJlKHRleHR1cmUsIHdpZHRoLCBoZWlnaHQsIGRhdGEpIHtcbiAgICAgICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICAgICAgZ3BncHVfdXRpbC51cGxvYWREZW5zZU1hdHJpeFRvVGV4dHVyZSh0aGlzLmdsLCB0ZXh0dXJlLCB3aWR0aCwgaGVpZ2h0LCBkYXRhLCB0aGlzLnRleHR1cmVDb25maWcpO1xuICAgIH1cbiAgICBjcmVhdGVGbG9hdDE2UGFja2VkTWF0cml4VGV4dHVyZShyb3dzLCBjb2x1bW5zKSB7XG4gICAgICAgIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gICAgICAgIHJldHVybiBncGdwdV91dGlsLmNyZWF0ZUZsb2F0MTZQYWNrZWRNYXRyaXhUZXh0dXJlKHRoaXMuZ2wsIHJvd3MsIGNvbHVtbnMsIHRoaXMudGV4dHVyZUNvbmZpZyk7XG4gICAgfVxuICAgIGNyZWF0ZVBhY2tlZE1hdHJpeFRleHR1cmUocm93cywgY29sdW1ucykge1xuICAgICAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgICAgICByZXR1cm4gZ3BncHVfdXRpbC5jcmVhdGVQYWNrZWRNYXRyaXhUZXh0dXJlKHRoaXMuZ2wsIHJvd3MsIGNvbHVtbnMsIHRoaXMudGV4dHVyZUNvbmZpZyk7XG4gICAgfVxuICAgIGRlbGV0ZU1hdHJpeFRleHR1cmUodGV4dHVyZSkge1xuICAgICAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgICAgICBpZiAodGhpcy5vdXRwdXRUZXh0dXJlID09PSB0ZXh0dXJlKSB7XG4gICAgICAgICAgICB3ZWJnbF91dGlsLnVuYmluZENvbG9yVGV4dHVyZUZyb21GcmFtZWJ1ZmZlcih0aGlzLmdsLCB0aGlzLmZyYW1lYnVmZmVyKTtcbiAgICAgICAgICAgIHRoaXMub3V0cHV0VGV4dHVyZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2sodGhpcy5nbCwgKCkgPT4gdGhpcy5nbC5kZWxldGVUZXh0dXJlKHRleHR1cmUpKTtcbiAgICB9XG4gICAgZG93bmxvYWRCeXRlRW5jb2RlZEZsb2F0TWF0cml4RnJvbU91dHB1dFRleHR1cmUodGV4dHVyZSwgcm93cywgY29sdW1ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5kb3dubG9hZE1hdHJpeERyaXZlcih0ZXh0dXJlLCAoKSA9PiBncGdwdV91dGlsLmRvd25sb2FkQnl0ZUVuY29kZWRGbG9hdE1hdHJpeEZyb21PdXRwdXRUZXh0dXJlKHRoaXMuZ2wsIHJvd3MsIGNvbHVtbnMsIHRoaXMudGV4dHVyZUNvbmZpZykpO1xuICAgIH1cbiAgICBkb3dubG9hZFBhY2tlZE1hdHJpeEZyb21CdWZmZXIoYnVmZmVyLCBiYXRjaCwgcm93cywgY29sdW1ucywgcGh5c2ljYWxSb3dzLCBwaHlzaWNhbENvbHMpIHtcbiAgICAgICAgcmV0dXJuIGdwZ3B1X3V0aWwuZG93bmxvYWRQYWNrZWRNYXRyaXhGcm9tQnVmZmVyKHRoaXMuZ2wsIGJ1ZmZlciwgYmF0Y2gsIHJvd3MsIGNvbHVtbnMsIHBoeXNpY2FsUm93cywgcGh5c2ljYWxDb2xzLCB0aGlzLnRleHR1cmVDb25maWcpO1xuICAgIH1cbiAgICBkb3dubG9hZEZsb2F0MzJNYXRyaXhGcm9tQnVmZmVyKGJ1ZmZlciwgc2l6ZSkge1xuICAgICAgICByZXR1cm4gZ3BncHVfdXRpbC5kb3dubG9hZEZsb2F0MzJNYXRyaXhGcm9tQnVmZmVyKHRoaXMuZ2wsIGJ1ZmZlciwgc2l6ZSk7XG4gICAgfVxuICAgIGNyZWF0ZUJ1ZmZlckZyb21UZXh0dXJlKHRleHR1cmUsIHJvd3MsIGNvbHVtbnMpIHtcbiAgICAgICAgdGhpcy5iaW5kVGV4dHVyZVRvRnJhbWVCdWZmZXIodGV4dHVyZSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGdwZ3B1X3V0aWwuY3JlYXRlQnVmZmVyRnJvbU91dHB1dFRleHR1cmUodGhpcy5nbCwgcm93cywgY29sdW1ucywgdGhpcy50ZXh0dXJlQ29uZmlnKTtcbiAgICAgICAgdGhpcy51bmJpbmRUZXh0dXJlVG9GcmFtZUJ1ZmZlcigpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBjcmVhdGVBbmRXYWl0Rm9yRmVuY2UoKSB7XG4gICAgICAgIGNvbnN0IGZlbmNlQ29udGV4dCA9IHRoaXMuY3JlYXRlRmVuY2UodGhpcy5nbCk7XG4gICAgICAgIHJldHVybiB0aGlzLnBvbGxGZW5jZShmZW5jZUNvbnRleHQpO1xuICAgIH1cbiAgICBjcmVhdGVGZW5jZShnbCkge1xuICAgICAgICBsZXQgcXVlcnk7XG4gICAgICAgIGxldCBpc0ZlbmNlUGFzc2VkO1xuICAgICAgICBpZiAoZW52KCkuZ2V0Qm9vbCgnV0VCR0xfRkVOQ0VfQVBJX0VOQUJMRUQnKSkge1xuICAgICAgICAgICAgY29uc3QgZ2wyID0gZ2w7XG4gICAgICAgICAgICBjb25zdCBzeW5jID0gZ2wyLmZlbmNlU3luYyhnbDIuU1lOQ19HUFVfQ09NTUFORFNfQ09NUExFVEUsIDApO1xuICAgICAgICAgICAgZ2wuZmx1c2goKTtcbiAgICAgICAgICAgIGlzRmVuY2VQYXNzZWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdHVzID0gZ2wyLmNsaWVudFdhaXRTeW5jKHN5bmMsIDAsIDApO1xuICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXMgPT09IGdsMi5BTFJFQURZX1NJR05BTEVEIHx8XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9PT0gZ2wyLkNPTkRJVElPTl9TQVRJU0ZJRUQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcXVlcnkgPSBzeW5jO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGVudigpLmdldE51bWJlcignV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1ZFUlNJT04nKSA+IDApIHtcbiAgICAgICAgICAgIHF1ZXJ5ID0gdGhpcy5iZWdpblF1ZXJ5KCk7XG4gICAgICAgICAgICB0aGlzLmVuZFF1ZXJ5KCk7XG4gICAgICAgICAgICBpc0ZlbmNlUGFzc2VkID0gKCkgPT4gdGhpcy5pc1F1ZXJ5QXZhaWxhYmxlKHF1ZXJ5LCBlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX0RJU0pPSU5UX1FVRVJZX1RJTUVSX0VYVEVOU0lPTl9WRVJTSU9OJykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBubyB3YXkgdG8gZmVuY2UsIHJldHVybiB0cnVlIGltbWVkaWF0ZWx5LiBUaGlzIHdpbGwgZmlyZSBpblxuICAgICAgICAgICAgLy8gV2ViR0wgMS4wIHdoZW4gdGhlcmUgaXMgbm8gZGlzam9pbnQgcXVlcnkgdGltZXIuIEluIHRoaXMgY2FzZSwgYmVjYXVzZVxuICAgICAgICAgICAgLy8gdGhlIGZlbmNlIHBhc3NlcyBpbW1lZGlhdGVseSwgd2UnbGwgaW1tZWRpYXRlbHkgYXNrIGZvciBhIGRvd25sb2FkIG9mXG4gICAgICAgICAgICAvLyB0aGUgdGV4dHVyZSwgd2hpY2ggd2lsbCBjYXVzZSB0aGUgVUkgdGhyZWFkIHRvIGhhbmcuXG4gICAgICAgICAgICBpc0ZlbmNlUGFzc2VkID0gKCkgPT4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBxdWVyeSwgaXNGZW5jZVBhc3NlZCB9O1xuICAgIH1cbiAgICBkb3dubG9hZE1hdHJpeEZyb21QYWNrZWRUZXh0dXJlKHRleHR1cmUsIHBoeXNpY2FsUm93cywgcGh5c2ljYWxDb2xzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvd25sb2FkTWF0cml4RHJpdmVyKHRleHR1cmUsICgpID0+IGdwZ3B1X3V0aWwuZG93bmxvYWRNYXRyaXhGcm9tUGFja2VkT3V0cHV0VGV4dHVyZSh0aGlzLmdsLCBwaHlzaWNhbFJvd3MsIHBoeXNpY2FsQ29scykpO1xuICAgIH1cbiAgICBjcmVhdGVQcm9ncmFtKGZyYWdtZW50U2hhZGVyU291cmNlKSB7XG4gICAgICAgIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSB3ZWJnbF91dGlsLmNyZWF0ZUZyYWdtZW50U2hhZGVyKGdsLCBmcmFnbWVudFNoYWRlclNvdXJjZSk7XG4gICAgICAgIGlmICh0aGlzLnZlcnRleFNoYWRlciA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnZlcnRleFNoYWRlciA9IGdwZ3B1X3V0aWwuY3JlYXRlVmVydGV4U2hhZGVyKGdsKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9ncmFtID0gd2ViZ2xfdXRpbC5jcmVhdGVQcm9ncmFtKGdsKTtcbiAgICAgICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmF0dGFjaFNoYWRlcihwcm9ncmFtLCB0aGlzLnZlcnRleFNoYWRlcikpO1xuICAgICAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuYXR0YWNoU2hhZGVyKHByb2dyYW0sIGZyYWdtZW50U2hhZGVyKSk7XG4gICAgICAgIHdlYmdsX3V0aWwubGlua1Byb2dyYW0oZ2wsIHByb2dyYW0pO1xuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgd2ViZ2xfdXRpbC52YWxpZGF0ZVByb2dyYW0oZ2wsIHByb2dyYW0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy52ZXJ0ZXhBdHRyc0FyZUJvdW5kKSB7XG4gICAgICAgICAgICB0aGlzLnNldFByb2dyYW0ocHJvZ3JhbSk7XG4gICAgICAgICAgICB0aGlzLnZlcnRleEF0dHJzQXJlQm91bmQgPSBncGdwdV91dGlsLmJpbmRWZXJ0ZXhQcm9ncmFtQXR0cmlidXRlU3RyZWFtcyhnbCwgdGhpcy5wcm9ncmFtLCB0aGlzLnZlcnRleEJ1ZmZlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb2dyYW07XG4gICAgfVxuICAgIGRlbGV0ZVByb2dyYW0ocHJvZ3JhbSkge1xuICAgICAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgICAgICBpZiAocHJvZ3JhbSA9PT0gdGhpcy5wcm9ncmFtKSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyYW0gPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtICE9IG51bGwpIHtcbiAgICAgICAgICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKHRoaXMuZ2wsICgpID0+IHRoaXMuZ2wuZGVsZXRlUHJvZ3JhbShwcm9ncmFtKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0UHJvZ3JhbShwcm9ncmFtKSB7XG4gICAgICAgIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IHByb2dyYW07XG4gICAgICAgIGlmICgodGhpcy5wcm9ncmFtICE9IG51bGwpICYmIHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHdlYmdsX3V0aWwudmFsaWRhdGVQcm9ncmFtKHRoaXMuZ2wsIHRoaXMucHJvZ3JhbSk7XG4gICAgICAgIH1cbiAgICAgICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2sodGhpcy5nbCwgKCkgPT4gdGhpcy5nbC51c2VQcm9ncmFtKHByb2dyYW0pKTtcbiAgICB9XG4gICAgZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sIHVuaWZvcm1OYW1lLCBzaG91bGRUaHJvdyA9IHRydWUpIHtcbiAgICAgICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICAgICAgaWYgKHNob3VsZFRocm93KSB7XG4gICAgICAgICAgICByZXR1cm4gd2ViZ2xfdXRpbC5nZXRQcm9ncmFtVW5pZm9ybUxvY2F0aW9uT3JUaHJvdyh0aGlzLmdsLCBwcm9ncmFtLCB1bmlmb3JtTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gd2ViZ2xfdXRpbC5nZXRQcm9ncmFtVW5pZm9ybUxvY2F0aW9uKHRoaXMuZ2wsIHByb2dyYW0sIHVuaWZvcm1OYW1lKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRBdHRyaWJ1dGVMb2NhdGlvbihwcm9ncmFtLCBhdHRyaWJ1dGUpIHtcbiAgICAgICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICAgICAgcmV0dXJuIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKHRoaXMuZ2wsICgpID0+IHRoaXMuZ2wuZ2V0QXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgYXR0cmlidXRlKSk7XG4gICAgfVxuICAgIGdldFVuaWZvcm1Mb2NhdGlvbk5vVGhyb3cocHJvZ3JhbSwgdW5pZm9ybU5hbWUpIHtcbiAgICAgICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sIHVuaWZvcm1OYW1lKTtcbiAgICB9XG4gICAgc2V0SW5wdXRNYXRyaXhUZXh0dXJlKGlucHV0TWF0cml4VGV4dHVyZSwgdW5pZm9ybUxvY2F0aW9uLCB0ZXh0dXJlVW5pdCkge1xuICAgICAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgICAgICB0aGlzLnRocm93SWZOb1Byb2dyYW0oKTtcbiAgICAgICAgd2ViZ2xfdXRpbC5iaW5kVGV4dHVyZVRvUHJvZ3JhbVVuaWZvcm1TYW1wbGVyKHRoaXMuZ2wsIGlucHV0TWF0cml4VGV4dHVyZSwgdW5pZm9ybUxvY2F0aW9uLCB0ZXh0dXJlVW5pdCk7XG4gICAgfVxuICAgIHNldE91dHB1dE1hdHJpeFRleHR1cmUob3V0cHV0TWF0cml4VGV4dHVyZSwgcm93cywgY29sdW1ucykge1xuICAgICAgICB0aGlzLnNldE91dHB1dE1hdHJpeFRleHR1cmVEcml2ZXIob3V0cHV0TWF0cml4VGV4dHVyZSwgY29sdW1ucywgcm93cyk7XG4gICAgfVxuICAgIHNldE91dHB1dFBhY2tlZE1hdHJpeFRleHR1cmUob3V0cHV0UGFja2VkTWF0cml4VGV4dHVyZSwgcm93cywgY29sdW1ucykge1xuICAgICAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgICAgICBjb25zdCBbd2lkdGgsIGhlaWdodF0gPSB0ZXhfdXRpbC5nZXRQYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodChyb3dzLCBjb2x1bW5zKTtcbiAgICAgICAgdGhpcy5zZXRPdXRwdXRNYXRyaXhUZXh0dXJlRHJpdmVyKG91dHB1dFBhY2tlZE1hdHJpeFRleHR1cmUsIHdpZHRoLCBoZWlnaHQpO1xuICAgIH1cbiAgICBzZXRPdXRwdXRNYXRyaXhXcml0ZVJlZ2lvbihzdGFydFJvdywgbnVtUm93cywgc3RhcnRDb2x1bW4sIG51bUNvbHVtbnMpIHtcbiAgICAgICAgdGhpcy5zZXRPdXRwdXRNYXRyaXhXcml0ZVJlZ2lvbkRyaXZlcihzdGFydENvbHVtbiwgc3RhcnRSb3csIG51bUNvbHVtbnMsIG51bVJvd3MpO1xuICAgIH1cbiAgICBzZXRPdXRwdXRQYWNrZWRNYXRyaXhXcml0ZVJlZ2lvbihzdGFydFJvdywgbnVtUm93cywgc3RhcnRDb2x1bW4sIG51bUNvbHVtbnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzZXRPdXRwdXRQYWNrZWRNYXRyaXhXcml0ZVJlZ2lvbiBub3QgaW1wbGVtZW50ZWQuJyk7XG4gICAgfVxuICAgIGRlYnVnVmFsaWRhdGUoKSB7XG4gICAgICAgIGlmICh0aGlzLnByb2dyYW0gIT0gbnVsbCkge1xuICAgICAgICAgICAgd2ViZ2xfdXRpbC52YWxpZGF0ZVByb2dyYW0odGhpcy5nbCwgdGhpcy5wcm9ncmFtKTtcbiAgICAgICAgfVxuICAgICAgICB3ZWJnbF91dGlsLnZhbGlkYXRlRnJhbWVidWZmZXIodGhpcy5nbCk7XG4gICAgfVxuICAgIGV4ZWN1dGVQcm9ncmFtKCkge1xuICAgICAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgICAgICB0aGlzLnRocm93SWZOb1Byb2dyYW0oKTtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsO1xuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5kZWJ1Z1ZhbGlkYXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmRyYXdFbGVtZW50cyhnbC5UUklBTkdMRVMsIDYsIGdsLlVOU0lHTkVEX1NIT1JULCAwKSk7XG4gICAgfVxuICAgIGJsb2NrVW50aWxBbGxQcm9ncmFtc0NvbXBsZXRlZCgpIHtcbiAgICAgICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICAgICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2sodGhpcy5nbCwgKCkgPT4gdGhpcy5nbC5maW5pc2goKSk7XG4gICAgfVxuICAgIGdldFF1ZXJ5VGltZXJFeHRlbnNpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLmRpc2pvaW50UXVlcnlUaW1lckV4dGVuc2lvbiA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmRpc2pvaW50UXVlcnlUaW1lckV4dGVuc2lvbiA9XG4gICAgICAgICAgICAgICAgd2ViZ2xfdXRpbC5nZXRFeHRlbnNpb25PclRocm93KHRoaXMuZ2wsIGVudigpLmdldE51bWJlcignV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1ZFUlNJT04nKSA9PT0gMiA/XG4gICAgICAgICAgICAgICAgICAgICdFWFRfZGlzam9pbnRfdGltZXJfcXVlcnlfd2ViZ2wyJyA6XG4gICAgICAgICAgICAgICAgICAgICdFWFRfZGlzam9pbnRfdGltZXJfcXVlcnknKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5kaXNqb2ludFF1ZXJ5VGltZXJFeHRlbnNpb247XG4gICAgfVxuICAgIGdldFF1ZXJ5VGltZXJFeHRlbnNpb25XZWJHTDIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFF1ZXJ5VGltZXJFeHRlbnNpb24oKTtcbiAgICB9XG4gICAgZ2V0UXVlcnlUaW1lckV4dGVuc2lvbldlYkdMMSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UXVlcnlUaW1lckV4dGVuc2lvbigpO1xuICAgIH1cbiAgICBiZWdpblF1ZXJ5KCkge1xuICAgICAgICBpZiAoZW52KCkuZ2V0TnVtYmVyKCdXRUJHTF9ESVNKT0lOVF9RVUVSWV9USU1FUl9FWFRFTlNJT05fVkVSU0lPTicpID09PSAyKSB7XG4gICAgICAgICAgICBjb25zdCBnbDIgPSB0aGlzLmdsO1xuICAgICAgICAgICAgY29uc3QgZXh0ID0gdGhpcy5nZXRRdWVyeVRpbWVyRXh0ZW5zaW9uV2ViR0wyKCk7XG4gICAgICAgICAgICBjb25zdCBxdWVyeSA9IGdsMi5jcmVhdGVRdWVyeSgpO1xuICAgICAgICAgICAgZ2wyLmJlZ2luUXVlcnkoZXh0LlRJTUVfRUxBUFNFRF9FWFQsIHF1ZXJ5KTtcbiAgICAgICAgICAgIHJldHVybiBxdWVyeTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBleHQgPSB0aGlzLmdldFF1ZXJ5VGltZXJFeHRlbnNpb25XZWJHTDEoKTtcbiAgICAgICAgY29uc3QgcXVlcnkgPSBleHQuY3JlYXRlUXVlcnlFWFQoKTtcbiAgICAgICAgZXh0LmJlZ2luUXVlcnlFWFQoZXh0LlRJTUVfRUxBUFNFRF9FWFQsIHF1ZXJ5KTtcbiAgICAgICAgcmV0dXJuIHF1ZXJ5O1xuICAgIH1cbiAgICBlbmRRdWVyeSgpIHtcbiAgICAgICAgaWYgKGVudigpLmdldE51bWJlcignV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1ZFUlNJT04nKSA9PT0gMikge1xuICAgICAgICAgICAgY29uc3QgZ2wyID0gdGhpcy5nbDtcbiAgICAgICAgICAgIGNvbnN0IGV4dCA9IHRoaXMuZ2V0UXVlcnlUaW1lckV4dGVuc2lvbldlYkdMMigpO1xuICAgICAgICAgICAgZ2wyLmVuZFF1ZXJ5KGV4dC5USU1FX0VMQVBTRURfRVhUKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBleHQgPSB0aGlzLmdldFF1ZXJ5VGltZXJFeHRlbnNpb25XZWJHTDEoKTtcbiAgICAgICAgZXh0LmVuZFF1ZXJ5RVhUKGV4dC5USU1FX0VMQVBTRURfRVhUKTtcbiAgICB9XG4gICAgYXN5bmMgd2FpdEZvclF1ZXJ5QW5kR2V0VGltZShxdWVyeSkge1xuICAgICAgICBhd2FpdCB1dGlsLnJlcGVhdGVkVHJ5KCgpID0+IHRoaXMuZGlzcG9zZWQgfHwgLy8gd2hpbGUgdGVzdGluZyBjb250ZXh0cyBhcmUgY3JlYXRlZCAvIGRpc3Bvc2VkXG4gICAgICAgICAgICAvLyBpbiByYXBpZCBzdWNjZXNzaW9uLCBzbyB3aXRob3V0IHRoaXMgY2hlY2sgd2VcbiAgICAgICAgICAgIC8vIG1heSBwb2xsIGZvciB0aGUgcXVlcnkgdGltZXIgaW5kZWZpbml0ZWx5XG4gICAgICAgICAgICB0aGlzLmlzUXVlcnlBdmFpbGFibGUocXVlcnksIGVudigpLmdldE51bWJlcignV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1ZFUlNJT04nKSkpO1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRRdWVyeVRpbWUocXVlcnksIGVudigpLmdldE51bWJlcignV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1ZFUlNJT04nKSk7XG4gICAgfVxuICAgIGdldFF1ZXJ5VGltZShxdWVyeSwgcXVlcnlUaW1lclZlcnNpb24pIHtcbiAgICAgICAgaWYgKHF1ZXJ5VGltZXJWZXJzaW9uID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocXVlcnlUaW1lclZlcnNpb24gPT09IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IGdsMiA9IHRoaXMuZ2w7XG4gICAgICAgICAgICBjb25zdCB0aW1lRWxhcHNlZE5hbm9zID0gZ2wyLmdldFF1ZXJ5UGFyYW1ldGVyKHF1ZXJ5LCBnbDIuUVVFUllfUkVTVUxUKTtcbiAgICAgICAgICAgIC8vIFJldHVybiBtaWxsaXNlY29uZHMuXG4gICAgICAgICAgICByZXR1cm4gdGltZUVsYXBzZWROYW5vcyAvIDEwMDAwMDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBleHQgPSB0aGlzLmdldFF1ZXJ5VGltZXJFeHRlbnNpb25XZWJHTDEoKTtcbiAgICAgICAgICAgIGNvbnN0IHRpbWVFbGFwc2VkTmFub3MgPSBleHQuZ2V0UXVlcnlPYmplY3RFWFQocXVlcnksIGV4dC5RVUVSWV9SRVNVTFRfRVhUKTtcbiAgICAgICAgICAgIC8vIFJldHVybiBtaWxsaXNlY29uZHMuXG4gICAgICAgICAgICByZXR1cm4gdGltZUVsYXBzZWROYW5vcyAvIDEwMDAwMDA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaXNRdWVyeUF2YWlsYWJsZShxdWVyeSwgcXVlcnlUaW1lclZlcnNpb24pIHtcbiAgICAgICAgaWYgKHF1ZXJ5VGltZXJWZXJzaW9uID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocXVlcnlUaW1lclZlcnNpb24gPT09IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IGdsMiA9IHRoaXMuZ2w7XG4gICAgICAgICAgICBjb25zdCBleHQgPSB0aGlzLmdldFF1ZXJ5VGltZXJFeHRlbnNpb25XZWJHTDIoKTtcbiAgICAgICAgICAgIGNvbnN0IGF2YWlsYWJsZSA9IGdsMi5nZXRRdWVyeVBhcmFtZXRlcihxdWVyeSwgZ2wyLlFVRVJZX1JFU1VMVF9BVkFJTEFCTEUpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZGlzam9pbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzam9pbnQgPSB0aGlzLmdsLmdldFBhcmFtZXRlcihleHQuR1BVX0RJU0pPSU5UX0VYVCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXZhaWxhYmxlICYmICF0aGlzLmRpc2pvaW50O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZXh0ID0gdGhpcy5nZXRRdWVyeVRpbWVyRXh0ZW5zaW9uV2ViR0wxKCk7XG4gICAgICAgICAgICBjb25zdCBhdmFpbGFibGUgPSBleHQuZ2V0UXVlcnlPYmplY3RFWFQocXVlcnksIGV4dC5RVUVSWV9SRVNVTFRfQVZBSUxBQkxFX0VYVCk7XG4gICAgICAgICAgICBpZiAodGhpcy5kaXNqb2ludCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNqb2ludCA9IHRoaXMuZ2wuZ2V0UGFyYW1ldGVyKGV4dC5HUFVfRElTSk9JTlRfRVhUKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhdmFpbGFibGUgJiYgIXRoaXMuZGlzam9pbnQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcG9sbEZlbmNlKGZlbmNlQ29udGV4dCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFkZEl0ZW1Ub1BvbGwoKCkgPT4gZmVuY2VDb250ZXh0LmlzRmVuY2VQYXNzZWQoKSwgKCkgPT4gcmVzb2x2ZSgpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHBvbGxJdGVtcygpIHtcbiAgICAgICAgLy8gRmluZCB0aGUgbGFzdCBxdWVyeSB0aGF0IGhhcyBmaW5pc2hlZC5cbiAgICAgICAgY29uc3QgaW5kZXggPSBsaW5lYXJTZWFyY2hMYXN0VHJ1ZSh0aGlzLml0ZW1zVG9Qb2xsLm1hcCh4ID0+IHguaXNEb25lRm4pKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gaW5kZXg7ICsraSkge1xuICAgICAgICAgICAgY29uc3QgeyByZXNvbHZlRm4gfSA9IHRoaXMuaXRlbXNUb1BvbGxbaV07XG4gICAgICAgICAgICByZXNvbHZlRm4oKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLml0ZW1zVG9Qb2xsID0gdGhpcy5pdGVtc1RvUG9sbC5zbGljZShpbmRleCArIDEpO1xuICAgIH1cbiAgICBhZGRJdGVtVG9Qb2xsKGlzRG9uZUZuLCByZXNvbHZlRm4pIHtcbiAgICAgICAgdGhpcy5pdGVtc1RvUG9sbC5wdXNoKHsgaXNEb25lRm4sIHJlc29sdmVGbiB9KTtcbiAgICAgICAgaWYgKHRoaXMuaXRlbXNUb1BvbGwubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgLy8gV2UgYWxyZWFkeSBoYXZlIGEgcnVubmluZyBsb29wIHRoYXQgcG9sbHMuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gU3RhcnQgYSBuZXcgbG9vcCB0aGF0IHBvbGxzLlxuICAgICAgICB1dGlsLnJlcGVhdGVkVHJ5KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucG9sbEl0ZW1zKCk7XG4gICAgICAgICAgICAvLyBFbmQgdGhlIGxvb3AgaWYgbm8gbW9yZSBpdGVtcyB0byBwb2xsLlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXRlbXNUb1BvbGwubGVuZ3RoID09PSAwO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYmluZFRleHR1cmVUb0ZyYW1lQnVmZmVyKHRleHR1cmUpIHtcbiAgICAgICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICAgICAgd2ViZ2xfdXRpbC5iaW5kQ29sb3JUZXh0dXJlVG9GcmFtZWJ1ZmZlcih0aGlzLmdsLCB0ZXh0dXJlLCB0aGlzLmZyYW1lYnVmZmVyKTtcbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHdlYmdsX3V0aWwudmFsaWRhdGVGcmFtZWJ1ZmZlcih0aGlzLmdsKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB1bmJpbmRUZXh0dXJlVG9GcmFtZUJ1ZmZlcigpIHtcbiAgICAgICAgaWYgKHRoaXMub3V0cHV0VGV4dHVyZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB3ZWJnbF91dGlsLmJpbmRDb2xvclRleHR1cmVUb0ZyYW1lYnVmZmVyKHRoaXMuZ2wsIHRoaXMub3V0cHV0VGV4dHVyZSwgdGhpcy5mcmFtZWJ1ZmZlcik7XG4gICAgICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgICAgIHdlYmdsX3V0aWwudmFsaWRhdGVGcmFtZWJ1ZmZlcih0aGlzLmdsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHdlYmdsX3V0aWwudW5iaW5kQ29sb3JUZXh0dXJlRnJvbUZyYW1lYnVmZmVyKHRoaXMuZ2wsIHRoaXMuZnJhbWVidWZmZXIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRvd25sb2FkTWF0cml4RHJpdmVyKHRleHR1cmUsIGRvd25sb2FkQW5kRGVjb2RlKSB7XG4gICAgICAgIHRoaXMuYmluZFRleHR1cmVUb0ZyYW1lQnVmZmVyKHRleHR1cmUpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBkb3dubG9hZEFuZERlY29kZSgpO1xuICAgICAgICB0aGlzLnVuYmluZFRleHR1cmVUb0ZyYW1lQnVmZmVyKCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHNldE91dHB1dE1hdHJpeFRleHR1cmVEcml2ZXIob3V0cHV0TWF0cml4VGV4dHVyZU1heWJlUGFja2VkLCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICAgICAgd2ViZ2xfdXRpbC5iaW5kQ29sb3JUZXh0dXJlVG9GcmFtZWJ1ZmZlcihnbCwgb3V0cHV0TWF0cml4VGV4dHVyZU1heWJlUGFja2VkLCB0aGlzLmZyYW1lYnVmZmVyKTtcbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHdlYmdsX3V0aWwudmFsaWRhdGVGcmFtZWJ1ZmZlcihnbCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vdXRwdXRUZXh0dXJlID0gb3V0cHV0TWF0cml4VGV4dHVyZU1heWJlUGFja2VkO1xuICAgICAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wudmlld3BvcnQoMCwgMCwgd2lkdGgsIGhlaWdodCkpO1xuICAgICAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuc2Npc3NvcigwLCAwLCB3aWR0aCwgaGVpZ2h0KSk7XG4gICAgfVxuICAgIHNldE91dHB1dE1hdHJpeFdyaXRlUmVnaW9uRHJpdmVyKHgsIHksIHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICAgICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2sodGhpcy5nbCwgKCkgPT4gdGhpcy5nbC5zY2lzc29yKHgsIHksIHdpZHRoLCBoZWlnaHQpKTtcbiAgICB9XG4gICAgdGhyb3dJZkRpc3Bvc2VkKCkge1xuICAgICAgICBpZiAodGhpcy5kaXNwb3NlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdHRlbXB0ZWQgdG8gdXNlIGRpc3Bvc2VkIEdQR1BVQ29udGV4dC4nKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0aHJvd0lmTm9Qcm9ncmFtKCkge1xuICAgICAgICBpZiAodGhpcy5wcm9ncmFtID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gR1BVIHByb2dyYW0gaXMgY3VycmVudGx5IHNldC4nKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogRmluZHMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IHRydWUgZWxlbWVudCB1c2luZyBsaW5lYXIgc2VhcmNoLlxuICogTm90ZTogV2UgY2FuJ3QgZG8gYmluYXJ5IHNlYXJjaCBiZWNhdXNlIENocm9tZSBleHBlY3RzIHVzIHRvIGV4cGxpY2l0bHlcbiAqIHRlc3QgYWxsIGZlbmNlcyBiZWZvcmUgZG93bmxvYWQ6XG4gKiBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZmpzL2lzc3Vlcy8xMTQ1XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaW5lYXJTZWFyY2hMYXN0VHJ1ZShhcnIpIHtcbiAgICBsZXQgaSA9IDA7XG4gICAgZm9yICg7IGkgPCBhcnIubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3QgaXNEb25lID0gYXJyW2ldKCk7XG4gICAgICAgIGlmICghaXNEb25lKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaSAtIDE7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ncGdwdV9jb250ZXh0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgZW52LCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCAqIGFzIHNoYWRlcl9jb21waWxlciBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5leHBvcnQgZnVuY3Rpb24gY29tcGlsZVByb2dyYW0oZ3BncHUsIHByb2dyYW0sIGlucHV0cywgb3V0cHV0KSB7XG4gICAgY29uc3QgaW5wdXRJbmZvcyA9IGlucHV0cy5tYXAoKGlucHV0LCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IHNoYXBlSW5mbyA9IHtcbiAgICAgICAgICAgIGxvZ2ljYWxTaGFwZTogaW5wdXQuc2hhcGUsXG4gICAgICAgICAgICB0ZXhTaGFwZTogaW5wdXQuaXNVbmlmb3JtID8gbnVsbCA6IGlucHV0LnRleERhdGEudGV4U2hhcGUsXG4gICAgICAgICAgICBpc1VuaWZvcm06IGlucHV0LmlzVW5pZm9ybSxcbiAgICAgICAgICAgIGlzUGFja2VkOiBpbnB1dC5pc1VuaWZvcm0gPyBmYWxzZSA6IGlucHV0LnRleERhdGEuaXNQYWNrZWQsXG4gICAgICAgICAgICBmbGF0T2Zmc2V0OiBudWxsXG4gICAgICAgIH07XG4gICAgICAgIGlmIChpbnB1dC50ZXhEYXRhICE9IG51bGwgJiYgaW5wdXQudGV4RGF0YS5zbGljZSAhPSBudWxsICYmXG4gICAgICAgICAgICBpbnB1dC50ZXhEYXRhLnNsaWNlLmZsYXRPZmZzZXQgPiAwKSB7XG4gICAgICAgICAgICBzaGFwZUluZm8uZmxhdE9mZnNldCA9IGlucHV0LnRleERhdGEuc2xpY2UuZmxhdE9mZnNldDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBuYW1lOiBwcm9ncmFtLnZhcmlhYmxlTmFtZXNbaV0sIHNoYXBlSW5mbyB9O1xuICAgIH0pO1xuICAgIGNvbnN0IGluU2hhcGVJbmZvcyA9IGlucHV0SW5mb3MubWFwKHggPT4geC5zaGFwZUluZm8pO1xuICAgIGNvbnN0IG91dFNoYXBlSW5mbyA9IHtcbiAgICAgICAgbG9naWNhbFNoYXBlOiBvdXRwdXQuc2hhcGUsXG4gICAgICAgIHRleFNoYXBlOiBvdXRwdXQudGV4RGF0YS50ZXhTaGFwZSxcbiAgICAgICAgaXNVbmlmb3JtOiBmYWxzZSxcbiAgICAgICAgaXNQYWNrZWQ6IG91dHB1dC50ZXhEYXRhLmlzUGFja2VkLFxuICAgICAgICBmbGF0T2Zmc2V0OiBudWxsXG4gICAgfTtcbiAgICBjb25zdCBzb3VyY2UgPSBzaGFkZXJfY29tcGlsZXIubWFrZVNoYWRlcihpbnB1dEluZm9zLCBvdXRTaGFwZUluZm8sIHByb2dyYW0pO1xuICAgIGNvbnN0IHdlYkdMUHJvZ3JhbSA9IGdwZ3B1LmNyZWF0ZVByb2dyYW0oc291cmNlKTtcbiAgICAvLyBBZGQgc3BlY2lhbCB1bmlmb3JtcyAoTkFOLCBJTkZJTklUWSlcbiAgICBsZXQgaW5mTG9jID0gbnVsbDtcbiAgICBjb25zdCBuYW5Mb2MgPSBncGdwdS5nZXRVbmlmb3JtTG9jYXRpb24od2ViR0xQcm9ncmFtLCAnTkFOJywgZmFsc2UpO1xuICAgIGlmIChlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX1ZFUlNJT04nKSA9PT0gMSkge1xuICAgICAgICBpbmZMb2MgPSBncGdwdS5nZXRVbmlmb3JtTG9jYXRpb24od2ViR0xQcm9ncmFtLCAnSU5GSU5JVFknLCBmYWxzZSk7XG4gICAgfVxuICAgIC8vIEFkZCB1c2VyLWRlZmluZWQgdW5pZm9ybXNcbiAgICBjb25zdCBzaG91bGRUaHJvdyA9IGZhbHNlO1xuICAgIGNvbnN0IHVuaWZvcm1Mb2NhdGlvbnMgPSB7fTtcbiAgICBjb25zdCBpblNoYXBlc0xvY2F0aW9ucyA9IHt9O1xuICAgIGNvbnN0IGluVGV4U2hhcGVzTG9jYXRpb25zID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9ncmFtLnZhcmlhYmxlTmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgdmFyTmFtZSA9IHByb2dyYW0udmFyaWFibGVOYW1lc1tpXTtcbiAgICAgICAgdW5pZm9ybUxvY2F0aW9uc1t2YXJOYW1lXSA9XG4gICAgICAgICAgICBncGdwdS5nZXRVbmlmb3JtTG9jYXRpb24od2ViR0xQcm9ncmFtLCB2YXJOYW1lLCBzaG91bGRUaHJvdyk7XG4gICAgICAgIHVuaWZvcm1Mb2NhdGlvbnNbYG9mZnNldCR7dmFyTmFtZX1gXSA9XG4gICAgICAgICAgICBncGdwdS5nZXRVbmlmb3JtTG9jYXRpb24od2ViR0xQcm9ncmFtLCBgb2Zmc2V0JHt2YXJOYW1lfWAsIHNob3VsZFRocm93KTtcbiAgICAgICAgaWYgKHByb2dyYW0uZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgICAgICAgaW5TaGFwZXNMb2NhdGlvbnNbYCR7dmFyTmFtZX1TaGFwZWBdID0gZ3BncHUuZ2V0VW5pZm9ybUxvY2F0aW9uKHdlYkdMUHJvZ3JhbSwgYCR7dmFyTmFtZX1TaGFwZWAsIHNob3VsZFRocm93KTtcbiAgICAgICAgICAgIGluVGV4U2hhcGVzTG9jYXRpb25zW2Ake3Zhck5hbWV9VGV4U2hhcGVgXSA9IGdwZ3B1LmdldFVuaWZvcm1Mb2NhdGlvbih3ZWJHTFByb2dyYW0sIGAke3Zhck5hbWV9VGV4U2hhcGVgLCBzaG91bGRUaHJvdyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IG91dFNoYXBlTG9jYXRpb247XG4gICAgbGV0IG91dFRleFNoYXBlTG9jYXRpb247XG4gICAgbGV0IG91dFNoYXBlU3RyaWRlc0xvY2F0aW9uO1xuICAgIGlmIChwcm9ncmFtLmVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgICAgb3V0U2hhcGVMb2NhdGlvbiA9XG4gICAgICAgICAgICBncGdwdS5nZXRVbmlmb3JtTG9jYXRpb24od2ViR0xQcm9ncmFtLCAnb3V0U2hhcGUnLCBzaG91bGRUaHJvdyk7XG4gICAgICAgIG91dFNoYXBlU3RyaWRlc0xvY2F0aW9uID1cbiAgICAgICAgICAgIGdwZ3B1LmdldFVuaWZvcm1Mb2NhdGlvbih3ZWJHTFByb2dyYW0sICdvdXRTaGFwZVN0cmlkZXMnLCBzaG91bGRUaHJvdyk7XG4gICAgICAgIG91dFRleFNoYXBlTG9jYXRpb24gPVxuICAgICAgICAgICAgZ3BncHUuZ2V0VW5pZm9ybUxvY2F0aW9uKHdlYkdMUHJvZ3JhbSwgJ291dFRleFNoYXBlJywgc2hvdWxkVGhyb3cpO1xuICAgIH1cbiAgICBjb25zdCBjdXN0b21Vbmlmb3JtTG9jYXRpb25zID0gW107XG4gICAgaWYgKHByb2dyYW0uY3VzdG9tVW5pZm9ybXMpIHtcbiAgICAgICAgcHJvZ3JhbS5jdXN0b21Vbmlmb3Jtcy5mb3JFYWNoKChkLCBpKSA9PiB7XG4gICAgICAgICAgICBjdXN0b21Vbmlmb3JtTG9jYXRpb25zW2ldID1cbiAgICAgICAgICAgICAgICBncGdwdS5nZXRVbmlmb3JtTG9jYXRpb24od2ViR0xQcm9ncmFtLCBkLm5hbWUsIHNob3VsZFRocm93KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHByb2dyYW0sXG4gICAgICAgIHNvdXJjZSxcbiAgICAgICAgd2ViR0xQcm9ncmFtLFxuICAgICAgICB1bmlmb3JtTG9jYXRpb25zLFxuICAgICAgICBjdXN0b21Vbmlmb3JtTG9jYXRpb25zLFxuICAgICAgICBpblNoYXBlSW5mb3MsXG4gICAgICAgIG91dFNoYXBlSW5mbyxcbiAgICAgICAgaW5mTG9jLFxuICAgICAgICBuYW5Mb2MsXG4gICAgICAgIGluU2hhcGVzTG9jYXRpb25zLFxuICAgICAgICBpblRleFNoYXBlc0xvY2F0aW9ucyxcbiAgICAgICAgb3V0U2hhcGVMb2NhdGlvbixcbiAgICAgICAgb3V0U2hhcGVTdHJpZGVzTG9jYXRpb24sXG4gICAgICAgIG91dFRleFNoYXBlTG9jYXRpb25cbiAgICB9O1xufVxuZnVuY3Rpb24gdmFsaWRhdGVCaW5hcnlBbmRQcm9ncmFtKHNoYXBlSW5mb3MsIGlucHV0cykge1xuICAgIGlmIChzaGFwZUluZm9zLmxlbmd0aCAhPT0gaW5wdXRzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBFcnJvcihgQmluYXJ5IHdhcyBjb21waWxlZCB3aXRoICR7c2hhcGVJbmZvcy5sZW5ndGh9IGlucHV0cywgYnV0IGAgK1xuICAgICAgICAgICAgYHdhcyBleGVjdXRlZCB3aXRoICR7aW5wdXRzLmxlbmd0aH0gaW5wdXRzYCk7XG4gICAgfVxuICAgIHNoYXBlSW5mb3MuZm9yRWFjaCgocywgaSkgPT4ge1xuICAgICAgICBjb25zdCBzaGFwZUEgPSBzLmxvZ2ljYWxTaGFwZTtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBpbnB1dHNbaV07XG4gICAgICAgIGNvbnN0IHNoYXBlQiA9IGlucHV0LnNoYXBlO1xuICAgICAgICBpZiAoIXV0aWwuYXJyYXlzRXF1YWwoc2hhcGVBLCBzaGFwZUIpKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcihgQmluYXJ5IHdhcyBjb21waWxlZCB3aXRoIGRpZmZlcmVudCBzaGFwZXMgdGhhbiBgICtcbiAgICAgICAgICAgICAgICBgdGhlIGN1cnJlbnQgYXJncy4gU2hhcGVzICR7c2hhcGVBfSBhbmQgJHtzaGFwZUJ9IG11c3QgbWF0Y2hgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgaW5wdXQgaXMgdXBsb2FkZWQgYXMgdW5pZm9ybS5cbiAgICAgICAgaWYgKHMuaXNVbmlmb3JtICYmIGlucHV0LmlzVW5pZm9ybSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRleFNoYXBlQSA9IHMudGV4U2hhcGU7XG4gICAgICAgIGNvbnN0IHRleFNoYXBlQiA9IGlucHV0LmlzVW5pZm9ybSA/IG51bGwgOiBpbnB1dC50ZXhEYXRhLnRleFNoYXBlO1xuICAgICAgICBpZiAoIXV0aWwuYXJyYXlzRXF1YWwodGV4U2hhcGVBLCB0ZXhTaGFwZUIpKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcihgQmluYXJ5IHdhcyBjb21waWxlZCB3aXRoIGRpZmZlcmVudCB0ZXh0dXJlIHNoYXBlcyB0aGFuIHRoZWAgK1xuICAgICAgICAgICAgICAgIGAgY3VycmVudCBhcmdzLiBTaGFwZSAke3RleFNoYXBlQX0gYW5kICR7dGV4U2hhcGVCfSBtdXN0IG1hdGNoYCk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBydW5Qcm9ncmFtKGdwZ3B1LCBiaW5hcnksIGlucHV0cywgb3V0cHV0LCBjdXN0b21Vbmlmb3JtVmFsdWVzKSB7XG4gICAgaWYgKCFiaW5hcnkucHJvZ3JhbS5lbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICAgIHZhbGlkYXRlQmluYXJ5QW5kUHJvZ3JhbShiaW5hcnkuaW5TaGFwZUluZm9zLCBpbnB1dHMpO1xuICAgICAgICB2YWxpZGF0ZUJpbmFyeUFuZFByb2dyYW0oW2JpbmFyeS5vdXRTaGFwZUluZm9dLCBbb3V0cHV0XSk7XG4gICAgfVxuICAgIGNvbnN0IG91dFRleCA9IG91dHB1dC50ZXhEYXRhLnRleHR1cmU7XG4gICAgY29uc3Qgb3V0VGV4U2hhcGUgPSBvdXRwdXQudGV4RGF0YS50ZXhTaGFwZTtcbiAgICBpZiAob3V0cHV0LnRleERhdGEuaXNQYWNrZWQpIHtcbiAgICAgICAgZ3BncHUuc2V0T3V0cHV0UGFja2VkTWF0cml4VGV4dHVyZShvdXRUZXgsIG91dFRleFNoYXBlWzBdLCBvdXRUZXhTaGFwZVsxXSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBncGdwdS5zZXRPdXRwdXRNYXRyaXhUZXh0dXJlKG91dFRleCwgb3V0VGV4U2hhcGVbMF0sIG91dFRleFNoYXBlWzFdKTtcbiAgICB9XG4gICAgZ3BncHUuc2V0UHJvZ3JhbShiaW5hcnkud2ViR0xQcm9ncmFtKTtcbiAgICAvLyBTZXQgc3BlY2lhbCB1bmlmb3JtcyAoTkFOLCBJTkZJTklUWSlcbiAgICBpZiAoZW52KCkuZ2V0TnVtYmVyKCdXRUJHTF9WRVJTSU9OJykgPT09IDEpIHtcbiAgICAgICAgaWYgKGJpbmFyeS5pbmZMb2MgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGdwZ3B1LmdsLnVuaWZvcm0xZihiaW5hcnkuaW5mTG9jLCBJbmZpbml0eSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGJpbmFyeS5uYW5Mb2MgIT09IG51bGwpIHtcbiAgICAgICAgZ3BncHUuZ2wudW5pZm9ybTFmKGJpbmFyeS5uYW5Mb2MsIE5hTik7XG4gICAgfVxuICAgIC8vIFNldCB1c2VyLWRlZmluZWQgaW5wdXRzXG4gICAgaW5wdXRzLmZvckVhY2goKGlucHV0LCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhck5hbWUgPSBiaW5hcnkucHJvZ3JhbS52YXJpYWJsZU5hbWVzW2ldO1xuICAgICAgICBjb25zdCB2YXJMb2MgPSBiaW5hcnkudW5pZm9ybUxvY2F0aW9uc1t2YXJOYW1lXTtcbiAgICAgICAgY29uc3QgdmFyT2Zmc2V0TG9jID0gYmluYXJ5LnVuaWZvcm1Mb2NhdGlvbnNbYG9mZnNldCR7dmFyTmFtZX1gXTtcbiAgICAgICAgY29uc3QgdmFyU2hhcGVMb2MgPSBiaW5hcnkuaW5TaGFwZXNMb2NhdGlvbnNbYCR7dmFyTmFtZX1TaGFwZWBdO1xuICAgICAgICBjb25zdCB2YXJUZXhTaGFwZUxvYyA9IGJpbmFyeS5pblRleFNoYXBlc0xvY2F0aW9uc1tgJHt2YXJOYW1lfVRleFNoYXBlYF07XG4gICAgICAgIGlmICh2YXJTaGFwZUxvYykge1xuICAgICAgICAgICAgY29uc3QgeyB1bmlmb3JtU2hhcGUgfSA9IHNoYWRlcl9jb21waWxlci5nZXRVbmlmb3JtSW5mb0Zyb21TaGFwZShiaW5hcnkucHJvZ3JhbS5wYWNrZWRJbnB1dHMsIGlucHV0LnNoYXBlLCBpbnB1dC50ZXhEYXRhLnRleFNoYXBlKTtcbiAgICAgICAgICAgIHN3aXRjaCAodW5pZm9ybVNoYXBlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgZ3BncHUuZ2wudW5pZm9ybTFpdih2YXJTaGFwZUxvYywgbmV3IEludDMyQXJyYXkodW5pZm9ybVNoYXBlKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgZ3BncHUuZ2wudW5pZm9ybTJpdih2YXJTaGFwZUxvYywgbmV3IEludDMyQXJyYXkodW5pZm9ybVNoYXBlKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgZ3BncHUuZ2wudW5pZm9ybTNpdih2YXJTaGFwZUxvYywgbmV3IEludDMyQXJyYXkodW5pZm9ybVNoYXBlKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgZ3BncHUuZ2wudW5pZm9ybTRpdih2YXJTaGFwZUxvYywgbmV3IEludDMyQXJyYXkodW5pZm9ybVNoYXBlKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh2YXJUZXhTaGFwZUxvYykge1xuICAgICAgICAgICAgZ3BncHUuZ2wudW5pZm9ybTJpKHZhclRleFNoYXBlTG9jLCBpbnB1dC50ZXhEYXRhLnRleFNoYXBlWzBdLCBpbnB1dC50ZXhEYXRhLnRleFNoYXBlWzFdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFyTG9jID09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFRoZSBjb21waWxlciBpbmZlcnJlZCB0aGF0IHRoaXMgdmFyaWFibGUgaXMgbm90IHVzZWQgaW4gdGhpcyBzaGFkZXIuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlucHV0LmlzVW5pZm9ybSkge1xuICAgICAgICAgICAgLy8gVXBsb2FkIHRoZSB2YWx1ZXMgb2YgdGhlIHRlbnNvciBhcyB1bmlmb3JtLlxuICAgICAgICAgICAgaWYgKHV0aWwuc2l6ZUZyb21TaGFwZShpbnB1dC5zaGFwZSkgPCAyKSB7XG4gICAgICAgICAgICAgICAgZ3BncHUuZ2wudW5pZm9ybTFmKHZhckxvYywgaW5wdXQudW5pZm9ybVZhbHVlc1swXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgdmFscyA9IGlucHV0LnVuaWZvcm1WYWx1ZXM7XG4gICAgICAgICAgICAgICAgaWYgKCEodmFscyBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFscyA9IG5ldyBGbG9hdDMyQXJyYXkodmFscyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGdwZ3B1LmdsLnVuaWZvcm0xZnYodmFyTG9jLCB2YWxzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGUgaW5wdXQgd2FzIHNsaWNlZCwgdXBsb2FkIHRoZSBmbGF0IG9mZnNldCBpbmRleC5cbiAgICAgICAgaWYgKGlucHV0LnRleERhdGEuc2xpY2UgIT0gbnVsbCAmJiB2YXJPZmZzZXRMb2MgIT0gbnVsbCkge1xuICAgICAgICAgICAgZ3BncHUuZ2wudW5pZm9ybTFpKHZhck9mZnNldExvYywgaW5wdXQudGV4RGF0YS5zbGljZS5mbGF0T2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICBncGdwdS5zZXRJbnB1dE1hdHJpeFRleHR1cmUoaW5wdXQudGV4RGF0YS50ZXh0dXJlLCB2YXJMb2MsIGkpO1xuICAgIH0pO1xuICAgIGNvbnN0IG91dFNoYXBlTG9jID0gYmluYXJ5Lm91dFNoYXBlTG9jYXRpb247XG4gICAgaWYgKG91dFNoYXBlTG9jKSB7XG4gICAgICAgIHN3aXRjaCAob3V0cHV0LnNoYXBlLmxlbmd0aCkge1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIGdwZ3B1LmdsLnVuaWZvcm0xaXYob3V0U2hhcGVMb2MsIG5ldyBJbnQzMkFycmF5KG91dHB1dC5zaGFwZSkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIGdwZ3B1LmdsLnVuaWZvcm0yaXYob3V0U2hhcGVMb2MsIG5ldyBJbnQzMkFycmF5KG91dHB1dC5zaGFwZSkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgIGdwZ3B1LmdsLnVuaWZvcm0zaXYob3V0U2hhcGVMb2MsIG5ldyBJbnQzMkFycmF5KG91dHB1dC5zaGFwZSkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgIGdwZ3B1LmdsLnVuaWZvcm00aXYob3V0U2hhcGVMb2MsIG5ldyBJbnQzMkFycmF5KG91dHB1dC5zaGFwZSkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoYmluYXJ5Lm91dFNoYXBlU3RyaWRlc0xvY2F0aW9uKSB7XG4gICAgICAgIGNvbnN0IHN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKG91dHB1dC5zaGFwZSk7XG4gICAgICAgIHN3aXRjaCAob3V0cHV0LnNoYXBlLmxlbmd0aCkge1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIGdwZ3B1LmdsLnVuaWZvcm0xaXYoYmluYXJ5Lm91dFNoYXBlU3RyaWRlc0xvY2F0aW9uLCBuZXcgSW50MzJBcnJheShzdHJpZGVzKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgZ3BncHUuZ2wudW5pZm9ybTJpdihiaW5hcnkub3V0U2hhcGVTdHJpZGVzTG9jYXRpb24sIG5ldyBJbnQzMkFycmF5KHN0cmlkZXMpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICBncGdwdS5nbC51bmlmb3JtM2l2KGJpbmFyeS5vdXRTaGFwZVN0cmlkZXNMb2NhdGlvbiwgbmV3IEludDMyQXJyYXkoc3RyaWRlcykpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoYmluYXJ5Lm91dFRleFNoYXBlTG9jYXRpb24pIHtcbiAgICAgICAgZ3BncHUuZ2wudW5pZm9ybTJpKGJpbmFyeS5vdXRUZXhTaGFwZUxvY2F0aW9uLCBvdXRwdXQudGV4RGF0YS50ZXhTaGFwZVswXSwgb3V0cHV0LnRleERhdGEudGV4U2hhcGVbMV0pO1xuICAgIH1cbiAgICBpZiAoYmluYXJ5LnByb2dyYW0uY3VzdG9tVW5pZm9ybXMgJiYgY3VzdG9tVW5pZm9ybVZhbHVlcykge1xuICAgICAgICBiaW5hcnkucHJvZ3JhbS5jdXN0b21Vbmlmb3Jtcy5mb3JFYWNoKChkLCBpKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjdXN0b21Mb2MgPSBiaW5hcnkuY3VzdG9tVW5pZm9ybUxvY2F0aW9uc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGN1c3RvbVZhbHVlID0gY3VzdG9tVW5pZm9ybVZhbHVlc1tpXTtcbiAgICAgICAgICAgIGlmIChkLnR5cGUgPT09ICdmbG9hdCcpIHtcbiAgICAgICAgICAgICAgICBncGdwdS5nbC51bmlmb3JtMWZ2KGN1c3RvbUxvYywgY3VzdG9tVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZC50eXBlID09PSAndmVjMicpIHtcbiAgICAgICAgICAgICAgICBncGdwdS5nbC51bmlmb3JtMmZ2KGN1c3RvbUxvYywgY3VzdG9tVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZC50eXBlID09PSAndmVjMycpIHtcbiAgICAgICAgICAgICAgICBncGdwdS5nbC51bmlmb3JtM2Z2KGN1c3RvbUxvYywgY3VzdG9tVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZC50eXBlID09PSAndmVjNCcpIHtcbiAgICAgICAgICAgICAgICBncGdwdS5nbC51bmlmb3JtNGZ2KGN1c3RvbUxvYywgY3VzdG9tVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZC50eXBlID09PSAnaW50Jykge1xuICAgICAgICAgICAgICAgIGdwZ3B1LmdsLnVuaWZvcm0xaXYoY3VzdG9tTG9jLCBjdXN0b21WYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChkLnR5cGUgPT09ICdpdmVjMicpIHtcbiAgICAgICAgICAgICAgICBncGdwdS5nbC51bmlmb3JtMml2KGN1c3RvbUxvYywgY3VzdG9tVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZC50eXBlID09PSAnaXZlYzMnKSB7XG4gICAgICAgICAgICAgICAgZ3BncHUuZ2wudW5pZm9ybTNpdihjdXN0b21Mb2MsIGN1c3RvbVZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGQudHlwZSA9PT0gJ2l2ZWM0Jykge1xuICAgICAgICAgICAgICAgIGdwZ3B1LmdsLnVuaWZvcm00aXYoY3VzdG9tTG9jLCBjdXN0b21WYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgdW5pZm9ybSB0eXBlICR7ZC50eXBlfSBpcyBub3Qgc3VwcG9ydGVkIHlldC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdwZ3B1LmV4ZWN1dGVQcm9ncmFtKCk7XG59XG5leHBvcnQgZnVuY3Rpb24gbWFrZVNoYWRlcktleShwcm9ncmFtLCBpbnB1dHMsIG91dHB1dCkge1xuICAgIGxldCBrZXlJbnB1dHMgPSAnJztcbiAgICBpbnB1dHMuY29uY2F0KG91dHB1dCkuZm9yRWFjaCh4ID0+IHtcbiAgICAgICAgY29uc3QgaGFzT2Zmc2V0ID0geC50ZXhEYXRhICE9IG51bGwgJiYgeC50ZXhEYXRhLnNsaWNlICE9IG51bGwgJiZcbiAgICAgICAgICAgIHgudGV4RGF0YS5zbGljZS5mbGF0T2Zmc2V0ID4gMDtcbiAgICAgICAgLy8gVE9ETzogUmVtb3ZlIHRoZSBjb25kaXRpb24gb2YgIXguaXNVbmlmb3JtLlxuICAgICAgICBpZiAocHJvZ3JhbS5lbmFibGVTaGFwZVVuaWZvcm1zICYmICF4LmlzVW5pZm9ybSkge1xuICAgICAgICAgICAgY29uc3QgeFRleFNoYXBlID0geC50ZXhEYXRhLnRleFNoYXBlO1xuICAgICAgICAgICAgY29uc3QgeyB1c2VTcXVlZXplU2hhcGUsIHVuaWZvcm1TaGFwZSB9ID0gc2hhZGVyX2NvbXBpbGVyLmdldFVuaWZvcm1JbmZvRnJvbVNoYXBlKHByb2dyYW0ucGFja2VkSW5wdXRzLCB4LnNoYXBlLCB4VGV4U2hhcGUpO1xuICAgICAgICAgICAgbGV0IHJhbmsxID0gJycsIHJhbmsyID0gJycsIHJhbmszNCA9ICcnO1xuICAgICAgICAgICAgaWYgKHVuaWZvcm1TaGFwZS5sZW5ndGggPT09IDEgJiYgcHJvZ3JhbS5wYWNrZWRJbnB1dHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWNrZWRUZXhTaGFwZSA9IFtNYXRoLmNlaWwoeFRleFNoYXBlWzBdIC8gMiksIE1hdGguY2VpbCh4VGV4U2hhcGVbMV0gLyAyKV07XG4gICAgICAgICAgICAgICAgcmFuazEgPSBgJHtwYWNrZWRUZXhTaGFwZVswXSA+IDF9XyR7cGFja2VkVGV4U2hhcGVbMV0gPiAxfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh1bmlmb3JtU2hhcGUubGVuZ3RoID09PSAyICYmICFwcm9ncmFtLnBhY2tlZElucHV0cykge1xuICAgICAgICAgICAgICAgIHJhbmsyID0gYCR7dW5pZm9ybVNoYXBlWzBdID4gMX1fJHt1bmlmb3JtU2hhcGVbMV0gPiAxfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh1bmlmb3JtU2hhcGUubGVuZ3RoID4gMiAmJiAhcHJvZ3JhbS5wYWNrZWRJbnB1dHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyh1bmlmb3JtU2hhcGUpO1xuICAgICAgICAgICAgICAgIHJhbmszNCA9IGAke3N0cmlkZXNbMF0gPT09IHhUZXhTaGFwZVsxXX1fJHtzdHJpZGVzW3N0cmlkZXMubGVuZ3RoIC0gMV0gPT09IHhUZXhTaGFwZVsxXX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IGlzTG9naWNhbFNoYXBUZXhTaGFwZUVxdWFsID0geFJhbmsgPT09IDIgJiYgdXRpbC5hcnJheXNFcXVhbCh4LnNoYXBlLCB4VGV4U2hhcGUpO1xuICAgICAgICAgICAgY29uc3QgaXNTY2FsYXIgPSB1dGlsLnNpemVGcm9tU2hhcGUoeC5zaGFwZSkgPT09IDE7XG4gICAgICAgICAgICBjb25zdCBicm9hZGNhc3REaW1zID0gYmFja2VuZF91dGlsLmdldEJyb2FkY2FzdERpbXMoeC5zaGFwZSwgb3V0cHV0LnNoYXBlKTtcbiAgICAgICAgICAgIGNvbnN0IGlzSW5PdXRUZXhTaGFwZUVxdWFsID0gIXByb2dyYW0ucGFja2VkSW5wdXRzICYmXG4gICAgICAgICAgICAgICAgeFJhbmsgPT09IG91dHB1dC5zaGFwZS5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICB1dGlsLmFycmF5c0VxdWFsKHhUZXhTaGFwZSwgb3V0cHV0LnRleERhdGEudGV4U2hhcGUpO1xuICAgICAgICAgICAgY29uc3QgaXNUZXhTaGFwZUdyZWF0ZXJUaGFuT25lID0gcHJvZ3JhbS5wYWNrZWRJbnB1dHMgfHwgeFJhbmsgPiAyID9cbiAgICAgICAgICAgICAgICAnJyA6XG4gICAgICAgICAgICAgICAgYCR7eFRleFNoYXBlWzBdID4gMX1fJHt4VGV4U2hhcGVbMV0gPiAxfWA7XG4gICAgICAgICAgICAvLyBUaGVzZSBrZXkgY29tcG9uZW50cyBhcmUgbmVlZGVkIGR1ZSB0byBzaGFkZXJfY29tcGlsZXIgaXMgZW1iZWRkaW5nXG4gICAgICAgICAgICAvLyB0aGVtIGluIHRoZSBzaGFkZXIuXG4gICAgICAgICAgICAvLyB8eFJhbmt8IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBjb29yZHMgbGVuZ3RoLiBTZWVcbiAgICAgICAgICAgIC8vIGdldFtQYWNrZWRdU2FtcGxlckF0T3V0cHV0Q29vcmRzLlxuICAgICAgICAgICAgLy8gfGlzSW5PdXRUZXhTaGFwZUVxdWFsfCBpcyB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIGdvaW5nIHRvIGFuXG4gICAgICAgICAgICAvLyBvcHRpbWl6YXRpb24gcGF0aCBpbiBnZXRTYW1wbGVyQXRPdXRwdXRDb29yZHMuXG4gICAgICAgICAgICAvLyB8dXNlU3F1ZWV6ZVNoYXBlfCBpcyBleHRyYWN0ZWQgZnJvbSBzcXVlZXplSW5wdXRJbmZvIG9mXG4gICAgICAgICAgICAvLyBnZXRTYW1wbGVyWzJ8M3w0XUQvZ2V0UGFja2VkU2FtcGxlcjNELlxuICAgICAgICAgICAgLy8gfGlzU2NhbGFyfCBpcyBleHRyYWN0ZWQgZnJvbSBpc0lucHV0U2NhbGFyL2lzT3V0cHV0U2NhbGFyIGluXG4gICAgICAgICAgICAvLyBnZXRQYWNrZWRTYW1wbGVyQXRPdXRwdXRDb29yZHMuXG4gICAgICAgICAgICAvLyB8YnJvYWRjYXN0RGltc3wgaXMgZXh0cmFjdGVkIGZyb20gZ2V0W1BhY2tlZF1TYW1wbGVyQXRPdXRwdXRDb29yZHMuXG4gICAgICAgICAgICAvLyB8aXNMb2dpY2FsU2hhcFRleFNoYXBlRXF1YWx8IGlzIHVzZWQgaW5cbiAgICAgICAgICAgIC8vIGdldE91dHB1dFtQYWNrZWRdMkRDb29yZHMvZ2V0W1BhY2tlZF1TYW1wbGVyMkQuXG4gICAgICAgICAgICAvLyB8cmFuazF8IGlzIHVzZWQgaW4gZ2V0T3V0cHV0UGFja2VkMURDb29yZHMuXG4gICAgICAgICAgICAvLyB8cmFuazJ8IGlzIHVzZWQgaW4gZ2V0T3V0cHV0MkRDb29yZHMuXG4gICAgICAgICAgICAvLyB8cmFuazM0fCBpcyB1c2VkIGluIGdldFNhbXBsZXIzRC9nZXRTYW1wbGVyNEQuXG4gICAgICAgICAgICAvLyB8aXNUZXhTaGFwZUdyZWF0ZXJUaGFuT25lfCBhcmUgdXNlZCBpblxuICAgICAgICAgICAgLy8gZ2V0U2FtcGxlcltTY2FsYXJ8MUR8MkRdL2dldE91dHB1dDFEQ29vcmRzLlxuICAgICAgICAgICAga2V5SW5wdXRzICs9IGAke3hSYW5rfV8ke2lzSW5PdXRUZXhTaGFwZUVxdWFsfV8ke3VzZVNxdWVlemVTaGFwZX1fJHt1bmlmb3JtU2hhcGUubGVuZ3RofV8ke2lzU2NhbGFyfV8ke2Jyb2FkY2FzdERpbXN9XyR7aXNMb2dpY2FsU2hhcFRleFNoYXBlRXF1YWx9XyR7cmFuazF9XyR7cmFuazJ9XyR7cmFuazM0fV8ke2lzVGV4U2hhcGVHcmVhdGVyVGhhbk9uZX1fJHtoYXNPZmZzZXR9YDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHRleFNoYXBlID0geC5pc1VuaWZvcm0gPyAndW5pZm9ybScgOiB4LnRleERhdGEudGV4U2hhcGU7XG4gICAgICAgICAgICBrZXlJbnB1dHMgKz0gYCR7eC5zaGFwZX1fJHt0ZXhTaGFwZX1fJHtoYXNPZmZzZXR9YDtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGtleVVzZXJDb2RlID0gcHJvZ3JhbS51c2VyQ29kZTtcbiAgICBsZXQga2V5ID0gcHJvZ3JhbS5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgIC8vIEZhc3Qgc3RyaW5nIGNvbmNhdC4gU2VlIGh0dHBzOi8vanNwZXJmLmNvbS9zdHJpbmctY29uY2F0ZW5hdGlvbi8xNC5cbiAgICBrZXkgKz0gJ18nICsga2V5SW5wdXRzICsgJ18nICsga2V5VXNlckNvZGUgK1xuICAgICAgICBgJHtlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX1ZFUlNJT04nKX1gO1xuICAgIHJldHVybiBrZXk7XG59XG5leHBvcnQgZnVuY3Rpb24gdXNlU2hhcGVVbmlmb3JtcyhyYW5rKSB7XG4gICAgLy8gVE9ETzogUmVtb3ZlIHRoZSBsaW1pdGFpb24gb2YgcmFuayA8PSA0LlxuICAgIHJldHVybiBlbnYoKS5nZXRCb29sKCdXRUJHTF9VU0VfU0hBUEVTX1VOSUZPUk1TJykgJiYgcmFuayA8PSA0O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z3BncHVfbWF0aC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBnZXRHbHNsRGlmZmVyZW5jZXMgfSBmcm9tICcuL2dsc2xfdmVyc2lvbic7XG5pbXBvcnQgKiBhcyB0ZXhfdXRpbCBmcm9tICcuL3RleF91dGlsJztcbmltcG9ydCAqIGFzIHdlYmdsX3V0aWwgZnJvbSAnLi93ZWJnbF91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVWZXJ0ZXhTaGFkZXIoZ2wpIHtcbiAgICBjb25zdCBnbHNsID0gZ2V0R2xzbERpZmZlcmVuY2VzKCk7XG4gICAgY29uc3QgdmVydGV4U2hhZGVyU291cmNlID0gYCR7Z2xzbC52ZXJzaW9ufVxuICAgIHByZWNpc2lvbiBoaWdocCBmbG9hdDtcbiAgICAke2dsc2wuYXR0cmlidXRlfSB2ZWMzIGNsaXBTcGFjZVBvcztcbiAgICAke2dsc2wuYXR0cmlidXRlfSB2ZWMyIHV2O1xuICAgICR7Z2xzbC52YXJ5aW5nVnN9IHZlYzIgcmVzdWx0VVY7XG5cbiAgICB2b2lkIG1haW4oKSB7XG4gICAgICBnbF9Qb3NpdGlvbiA9IHZlYzQoY2xpcFNwYWNlUG9zLCAxKTtcbiAgICAgIHJlc3VsdFVWID0gdXY7XG4gICAgfWA7XG4gICAgcmV0dXJuIHdlYmdsX3V0aWwuY3JlYXRlVmVydGV4U2hhZGVyKGdsLCB2ZXJ0ZXhTaGFkZXJTb3VyY2UpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVZlcnRleEJ1ZmZlcihnbCkge1xuICAgIC8vIFt4IHkgeiB1IHZdICogW3VwcGVyLWxlZnQsIGxvd2VyLWxlZnQsIHVwcGVyLXJpZ2h0LCBsb3dlci1yaWdodF1cbiAgICBjb25zdCB2ZXJ0ZXhBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoWy0xLCAxLCAwLCAwLCAxLCAtMSwgLTEsIDAsIDAsIDAsIDEsIDEsIDAsIDEsIDEsIDEsIC0xLCAwLCAxLCAwXSk7XG4gICAgcmV0dXJuIHdlYmdsX3V0aWwuY3JlYXRlU3RhdGljVmVydGV4QnVmZmVyKGdsLCB2ZXJ0ZXhBcnJheSk7XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSW5kZXhCdWZmZXIoZ2wpIHtcbiAgICAvLyBPcGVuR0wgKGFuZCBXZWJHTCkgaGF2ZSBcIkNDVyA9PSBmcm9udFwiIHdpbmRpbmdcbiAgICBjb25zdCB0cmlhbmdsZVZlcnRleEluZGljZXMgPSBuZXcgVWludDE2QXJyYXkoWzAsIDEsIDIsIDIsIDEsIDNdKTtcbiAgICByZXR1cm4gd2ViZ2xfdXRpbC5jcmVhdGVTdGF0aWNJbmRleEJ1ZmZlcihnbCwgdHJpYW5nbGVWZXJ0ZXhJbmRpY2VzKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUFuZENvbmZpZ3VyZVRleHR1cmUoZ2wsIHdpZHRoLCBoZWlnaHQsIGludGVybmFsRm9ybWF0LCB0ZXh0dXJlRm9ybWF0LCB0ZXh0dXJlVHlwZSkge1xuICAgIHdlYmdsX3V0aWwudmFsaWRhdGVUZXh0dXJlU2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICBjb25zdCB0ZXh0dXJlID0gd2ViZ2xfdXRpbC5jcmVhdGVUZXh0dXJlKGdsKTtcbiAgICBjb25zdCB0ZXgyZCA9IGdsLlRFWFRVUkVfMkQ7XG4gICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJpbmRUZXh0dXJlKHRleDJkLCB0ZXh0dXJlKSk7XG4gICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLnRleFBhcmFtZXRlcmkodGV4MmQsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5DTEFNUF9UT19FREdFKSk7XG4gICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLnRleFBhcmFtZXRlcmkodGV4MmQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKSk7XG4gICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLnRleFBhcmFtZXRlcmkodGV4MmQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTkVBUkVTVCkpO1xuICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC50ZXhQYXJhbWV0ZXJpKHRleDJkLCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLk5FQVJFU1QpKTtcbiAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wudGV4SW1hZ2UyRCh0ZXgyZCwgMCwgaW50ZXJuYWxGb3JtYXQsIHdpZHRoLCBoZWlnaHQsIDAsIHRleHR1cmVGb3JtYXQsIHRleHR1cmVUeXBlLCBudWxsKSk7XG4gICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIG51bGwpKTtcbiAgICByZXR1cm4gdGV4dHVyZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnRlcm5hbEZvcm1hdEZvckZsb2F0MzJNYXRyaXhUZXh0dXJlKHRleHR1cmVDb25maWcpIHtcbiAgICByZXR1cm4gdGV4dHVyZUNvbmZpZy5pbnRlcm5hbEZvcm1hdEZsb2F0O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZsb2F0MzJNYXRyaXhUZXh0dXJlKGdsLCByb3dzLCBjb2x1bW5zLCB0ZXh0dXJlQ29uZmlnKSB7XG4gICAgY29uc3QgW3dpZHRoLCBoZWlnaHRdID0gdGV4X3V0aWwuZ2V0VW5wYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodChyb3dzLCBjb2x1bW5zKTtcbiAgICByZXR1cm4gY3JlYXRlQW5kQ29uZmlndXJlVGV4dHVyZShnbCwgd2lkdGgsIGhlaWdodCwgZ2V0SW50ZXJuYWxGb3JtYXRGb3JGbG9hdDMyTWF0cml4VGV4dHVyZSh0ZXh0dXJlQ29uZmlnKSwgdGV4dHVyZUNvbmZpZy50ZXh0dXJlRm9ybWF0RmxvYXQsIGdsLkZMT0FUKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnRlcm5hbEZvcm1hdEZvckZsb2F0MTZNYXRyaXhUZXh0dXJlKHRleHR1cmVDb25maWcpIHtcbiAgICByZXR1cm4gdGV4dHVyZUNvbmZpZy5pbnRlcm5hbEZvcm1hdEhhbGZGbG9hdDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGbG9hdDE2TWF0cml4VGV4dHVyZShnbCwgcm93cywgY29sdW1ucywgdGV4dHVyZUNvbmZpZykge1xuICAgIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IHRleF91dGlsLmdldFVucGFja2VkTWF0cml4VGV4dHVyZVNoYXBlV2lkdGhIZWlnaHQocm93cywgY29sdW1ucyk7XG4gICAgcmV0dXJuIGNyZWF0ZUFuZENvbmZpZ3VyZVRleHR1cmUoZ2wsIHdpZHRoLCBoZWlnaHQsIGdldEludGVybmFsRm9ybWF0Rm9yRmxvYXQxNk1hdHJpeFRleHR1cmUodGV4dHVyZUNvbmZpZyksIHRleHR1cmVDb25maWcudGV4dHVyZUZvcm1hdEZsb2F0LCB0ZXh0dXJlQ29uZmlnLnRleHR1cmVUeXBlSGFsZkZsb2F0KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnRlcm5hbEZvcm1hdEZvclVuc2lnbmVkQnl0ZXNNYXRyaXhUZXh0dXJlKHRleHR1cmVDb25maWcpIHtcbiAgICByZXR1cm4gdGV4dHVyZUNvbmZpZy5kb3dubG9hZFRleHR1cmVGb3JtYXQ7XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVW5zaWduZWRCeXRlc01hdHJpeFRleHR1cmUoZ2wsIHJvd3MsIGNvbHVtbnMsIHRleHR1cmVDb25maWcpIHtcbiAgICBjb25zdCBbd2lkdGgsIGhlaWdodF0gPSB0ZXhfdXRpbC5nZXRVbnBhY2tlZE1hdHJpeFRleHR1cmVTaGFwZVdpZHRoSGVpZ2h0KHJvd3MsIGNvbHVtbnMpO1xuICAgIHJldHVybiBjcmVhdGVBbmRDb25maWd1cmVUZXh0dXJlKGdsLCB3aWR0aCwgaGVpZ2h0LCBnZXRJbnRlcm5hbEZvcm1hdEZvclVuc2lnbmVkQnl0ZXNNYXRyaXhUZXh0dXJlKHRleHR1cmVDb25maWcpLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnRlcm5hbEZvcm1hdEZvclBhY2tlZE1hdHJpeFRleHR1cmUodGV4dHVyZUNvbmZpZykge1xuICAgIHJldHVybiB0ZXh0dXJlQ29uZmlnLmludGVybmFsRm9ybWF0UGFja2VkRmxvYXQ7XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUGFja2VkTWF0cml4VGV4dHVyZShnbCwgcm93cywgY29sdW1ucywgdGV4dHVyZUNvbmZpZykge1xuICAgIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IHRleF91dGlsLmdldFBhY2tlZE1hdHJpeFRleHR1cmVTaGFwZVdpZHRoSGVpZ2h0KHJvd3MsIGNvbHVtbnMpO1xuICAgIHJldHVybiBjcmVhdGVBbmRDb25maWd1cmVUZXh0dXJlKGdsLCB3aWR0aCwgaGVpZ2h0LCBnZXRJbnRlcm5hbEZvcm1hdEZvclBhY2tlZE1hdHJpeFRleHR1cmUodGV4dHVyZUNvbmZpZyksIGdsLlJHQkEsIGdsLkZMT0FUKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnRlcm5hbEZvcm1hdEZvckZsb2F0MTZQYWNrZWRNYXRyaXhUZXh0dXJlKHRleHR1cmVDb25maWcpIHtcbiAgICByZXR1cm4gdGV4dHVyZUNvbmZpZy5pbnRlcm5hbEZvcm1hdFBhY2tlZEhhbGZGbG9hdDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGbG9hdDE2UGFja2VkTWF0cml4VGV4dHVyZShnbCwgcm93cywgY29sdW1ucywgdGV4dHVyZUNvbmZpZykge1xuICAgIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IHRleF91dGlsLmdldFBhY2tlZE1hdHJpeFRleHR1cmVTaGFwZVdpZHRoSGVpZ2h0KHJvd3MsIGNvbHVtbnMpO1xuICAgIHJldHVybiBjcmVhdGVBbmRDb25maWd1cmVUZXh0dXJlKGdsLCB3aWR0aCwgaGVpZ2h0LCBnZXRJbnRlcm5hbEZvcm1hdEZvckZsb2F0MTZQYWNrZWRNYXRyaXhUZXh0dXJlKHRleHR1cmVDb25maWcpLCBnbC5SR0JBLCB0ZXh0dXJlQ29uZmlnLnRleHR1cmVUeXBlSGFsZkZsb2F0KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBiaW5kVmVydGV4UHJvZ3JhbUF0dHJpYnV0ZVN0cmVhbXMoZ2wsIHByb2dyYW0sIHZlcnRleEJ1ZmZlcikge1xuICAgIGNvbnN0IHBvc09mZnNldCA9IDA7IC8vIHggaXMgdGhlIGZpcnN0IGJ1ZmZlciBlbGVtZW50XG4gICAgY29uc3QgdXZPZmZzZXQgPSAzICogNDsgLy8gdXYgY29tZXMgYWZ0ZXIgW3ggeSB6XVxuICAgIGNvbnN0IHN0cmlkZSA9ICgzICogNCkgKyAoMiAqIDQpOyAvLyB4eXogKyB1diwgZWFjaCBlbnRyeSBpcyA0LWJ5dGUgZmxvYXQuXG4gICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCB2ZXJ0ZXhCdWZmZXIpKTtcbiAgICBjb25zdCBzdWNjZXNzID0gd2ViZ2xfdXRpbC5iaW5kVmVydGV4QnVmZmVyVG9Qcm9ncmFtQXR0cmlidXRlKGdsLCBwcm9ncmFtLCAnY2xpcFNwYWNlUG9zJywgdmVydGV4QnVmZmVyLCAzLCBzdHJpZGUsIHBvc09mZnNldCk7XG4gICAgcmV0dXJuIHN1Y2Nlc3MgJiZcbiAgICAgICAgd2ViZ2xfdXRpbC5iaW5kVmVydGV4QnVmZmVyVG9Qcm9ncmFtQXR0cmlidXRlKGdsLCBwcm9ncmFtLCAndXYnLCB2ZXJ0ZXhCdWZmZXIsIDIsIHN0cmlkZSwgdXZPZmZzZXQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVwbG9hZERlbnNlTWF0cml4VG9UZXh0dXJlKGdsLCB0ZXh0dXJlLCB3aWR0aCwgaGVpZ2h0LCBkYXRhLCB0ZXh0dXJlQ29uZmlnKSB7XG4gICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRleHR1cmUpKTtcbiAgICBsZXQgZGF0YUZvclVwbG9hZCwgdGV4ZWxEYXRhVHlwZSwgaW50ZXJuYWxGb3JtYXQ7XG4gICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgICAgIGRhdGFGb3JVcGxvYWQgPSBuZXcgVWludDhBcnJheSh3aWR0aCAqIGhlaWdodCAqIDQpO1xuICAgICAgICB0ZXhlbERhdGFUeXBlID0gZ2wuVU5TSUdORURfQllURTtcbiAgICAgICAgaW50ZXJuYWxGb3JtYXQgPSBnbC5SR0JBO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZGF0YUZvclVwbG9hZCA9IG5ldyBGbG9hdDMyQXJyYXkod2lkdGggKiBoZWlnaHQgKiA0KTtcbiAgICAgICAgdGV4ZWxEYXRhVHlwZSA9IGdsLkZMT0FUO1xuICAgICAgICBpbnRlcm5hbEZvcm1hdCA9IHRleHR1cmVDb25maWcuaW50ZXJuYWxGb3JtYXRQYWNrZWRGbG9hdDtcbiAgICB9XG4gICAgZGF0YUZvclVwbG9hZC5zZXQoZGF0YSk7XG4gICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgaW50ZXJuYWxGb3JtYXQsIHdpZHRoLCBoZWlnaHQsIDAsIGdsLlJHQkEsIHRleGVsRGF0YVR5cGUsIGRhdGFGb3JVcGxvYWQpKTtcbiAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgbnVsbCkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVwbG9hZFBpeGVsRGF0YVRvVGV4dHVyZShnbCwgdGV4dHVyZSwgcGl4ZWxzKSB7XG4gICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRleHR1cmUpKTtcbiAgICBpZiAocGl4ZWxzLmRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC50ZXhJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIGdsLlJHQkEsIHBpeGVscy53aWR0aCwgcGl4ZWxzLmhlaWdodCwgMCwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgcGl4ZWxzLmRhdGEpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC50ZXhJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIGdsLlJHQkEsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIHBpeGVscykpO1xuICAgIH1cbiAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgbnVsbCkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlckZyb21PdXRwdXRUZXh0dXJlKGdsMiwgcm93cywgY29sdW1ucywgdGV4dHVyZUNvbmZpZykge1xuICAgIC8vIENyZWF0ZSBhbmQgYmluZCB0aGUgYnVmZmVyLlxuICAgIGNvbnN0IGJ1ZmZlciA9IGdsMi5jcmVhdGVCdWZmZXIoKTtcbiAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhnbDIsICgpID0+IGdsMi5iaW5kQnVmZmVyKGdsMi5QSVhFTF9QQUNLX0JVRkZFUiwgYnVmZmVyKSk7XG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgYnVmZmVyIHRvIHRoZSBzaXplIG9mIHRoZSB0ZXh0dXJlIGluIGJ5dGVzLlxuICAgIGNvbnN0IGJ5dGVzUGVyRmxvYXQgPSA0O1xuICAgIGNvbnN0IHZhbHVlc1BlclRleGVsID0gNDtcbiAgICBjb25zdCBidWZmZXJTaXplQnl0ZXMgPSBieXRlc1BlckZsb2F0ICogdmFsdWVzUGVyVGV4ZWwgKiByb3dzICogY29sdW1ucztcbiAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhnbDIsICgpID0+IGdsMi5idWZmZXJEYXRhKGdsMi5QSVhFTF9QQUNLX0JVRkZFUiwgYnVmZmVyU2l6ZUJ5dGVzLCBnbDIuU1RSRUFNX1JFQUQpKTtcbiAgICAvLyBFbnF1ZXVlIGEgY29tbWFuZCBvbiB0aGUgR1BVIGNvbW1hbmQgcXVldWUgdG8gY29weSBvZiB0ZXh0dXJlIGludG8gdGhlXG4gICAgLy8gYnVmZmVyLlxuICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKGdsMiwgKCkgPT4gZ2wyLnJlYWRQaXhlbHMoMCwgMCwgY29sdW1ucywgcm93cywgZ2wyLlJHQkEsIGdsMi5GTE9BVCwgMCkpO1xuICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKGdsMiwgKCkgPT4gZ2wyLmJpbmRCdWZmZXIoZ2wyLlBJWEVMX1BBQ0tfQlVGRkVSLCBudWxsKSk7XG4gICAgcmV0dXJuIGJ1ZmZlcjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkb3dubG9hZEZsb2F0MzJNYXRyaXhGcm9tQnVmZmVyKGdsLCBidWZmZXIsIHNpemUpIHtcbiAgICBjb25zdCBnbDIgPSBnbDtcbiAgICBjb25zdCBkb3dubG9hZFRhcmdldCA9IG5ldyBGbG9hdDMyQXJyYXkoc2l6ZSk7XG4gICAgZ2wyLmJpbmRCdWZmZXIoZ2wyLlBJWEVMX1BBQ0tfQlVGRkVSLCBidWZmZXIpO1xuICAgIGdsMi5nZXRCdWZmZXJTdWJEYXRhKGdsMi5QSVhFTF9QQUNLX0JVRkZFUiwgMCwgZG93bmxvYWRUYXJnZXQpO1xuICAgIGdsMi5iaW5kQnVmZmVyKGdsMi5QSVhFTF9QQUNLX0JVRkZFUiwgbnVsbCk7XG4gICAgcmV0dXJuIGRvd25sb2FkVGFyZ2V0O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRvd25sb2FkQnl0ZUVuY29kZWRGbG9hdE1hdHJpeEZyb21PdXRwdXRUZXh0dXJlKGdsLCByb3dzLCBjb2x1bW5zLCB0ZXh0dXJlQ29uZmlnKSB7XG4gICAgY29uc3QgW3csIGhdID0gdGV4X3V0aWwuZ2V0VW5wYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodChyb3dzLCBjb2x1bW5zKTtcbiAgICBjb25zdCBudW1DaGFubmVscyA9IDQ7XG4gICAgY29uc3QgZG93bmxvYWRUYXJnZXQgPSBuZXcgVWludDhBcnJheSh0ZXhfdXRpbC5nZXRVbnBhY2tlZEFycmF5U2l6ZUZyb21NYXRyaXhTaXplKHJvd3MgKiBjb2x1bW5zLCBudW1DaGFubmVscykpO1xuICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5yZWFkUGl4ZWxzKDAsIDAsIHcsIGgsIHRleHR1cmVDb25maWcuZG93bmxvYWRUZXh0dXJlRm9ybWF0LCBnbC5VTlNJR05FRF9CWVRFLCBkb3dubG9hZFRhcmdldCkpO1xuICAgIC8vIEJ5IHdyYXBwaW5nIHRoZSBidWZmZXIgaW4gYSBGbG9hdDMyQXJyYXksIHdlIHVzZSBuYXRpdmUgYnJvd3NlciBJRUVFIDc1NFxuICAgIC8vIGRlY29kaW5nIG9mIHRoZSA0IGJ5dGVzIHRoYXQgYmFjayBlYWNoIDMyIGJpdCBmbG9hdC5cbiAgICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheShkb3dubG9hZFRhcmdldC5idWZmZXIpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRvd25sb2FkUGFja2VkTWF0cml4RnJvbUJ1ZmZlcihnbCwgYnVmZmVyLCBiYXRjaCwgcm93cywgY29scywgcGh5c2ljYWxSb3dzLCBwaHlzaWNhbENvbHMsIHRleHR1cmVDb25maWcpIHtcbiAgICBjb25zdCBnbDIgPSBnbDtcbiAgICBjb25zdCBkb3dubG9hZFRhcmdldCA9IG5ldyBGbG9hdDMyQXJyYXkodGV4X3V0aWwuZ2V0UGFja2VkUkdCQUFycmF5U2l6ZUZyb21NYXRyaXhTaGFwZShwaHlzaWNhbFJvd3MsIHBoeXNpY2FsQ29scykpO1xuICAgIGdsMi5iaW5kQnVmZmVyKGdsMi5QSVhFTF9QQUNLX0JVRkZFUiwgYnVmZmVyKTtcbiAgICBnbDIuZ2V0QnVmZmVyU3ViRGF0YShnbDIuUElYRUxfUEFDS19CVUZGRVIsIDAsIGRvd25sb2FkVGFyZ2V0KTtcbiAgICBnbDIuYmluZEJ1ZmZlcihnbDIuUElYRUxfUEFDS19CVUZGRVIsIG51bGwpO1xuICAgIHJldHVybiBkb3dubG9hZFRhcmdldDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkb3dubG9hZE1hdHJpeEZyb21QYWNrZWRPdXRwdXRUZXh0dXJlKGdsLCBwaHlzaWNhbFJvd3MsIHBoeXNpY2FsQ29scykge1xuICAgIGNvbnN0IHBhY2tlZFJHQkEgPSBuZXcgRmxvYXQzMkFycmF5KHBoeXNpY2FsUm93cyAqIHBoeXNpY2FsQ29scyAqIDQpO1xuICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5yZWFkUGl4ZWxzKDAsIDAsIHBoeXNpY2FsQ29scywgcGh5c2ljYWxSb3dzLCBnbC5SR0JBLCBnbC5GTE9BVCwgcGFja2VkUkdCQSkpO1xuICAgIHJldHVybiBwYWNrZWRSR0JBO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z3BncHVfdXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBnZXRHbHNsRGlmZmVyZW5jZXMgfSBmcm9tICcuL2dsc2xfdmVyc2lvbic7XG5leHBvcnQgY2xhc3MgSW0yQ29sUGFja2VkUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3Iob3V0cHV0U2hhcGUsIGlucHV0U2hhcGUsIGNvbnZJbmZvKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICAgICAgICB0aGlzLnBhY2tlZElucHV0cyA9IHRydWU7XG4gICAgICAgIHRoaXMucGFja2VkT3V0cHV0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IG91dHB1dFNoYXBlO1xuICAgICAgICBjb25zdCB7IGZpbHRlcldpZHRoLCBpbkNoYW5uZWxzLCBzdHJpZGVXaWR0aCwgc3RyaWRlSGVpZ2h0LCBwYWRJbmZvLCBvdXRXaWR0aCwgZGlsYXRpb25XaWR0aCwgZGlsYXRpb25IZWlnaHQsIGRhdGFGb3JtYXQgfSA9IGNvbnZJbmZvO1xuICAgICAgICBjb25zdCB7IGxlZnQsIHRvcCB9ID0gcGFkSW5mbztcbiAgICAgICAgY29uc3QgaXRlbXNQZXJCbG9ja1JvdyA9IGluQ2hhbm5lbHMgKiBmaWx0ZXJXaWR0aDtcbiAgICAgICAgY29uc3QgZ2xzbCA9IGdldEdsc2xEaWZmZXJlbmNlcygpO1xuICAgICAgICBjb25zdCBpc0NoYW5uZWxzTGFzdCA9IGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnO1xuICAgICAgICBjb25zdCByb3dEaW0gPSBpc0NoYW5uZWxzTGFzdCA/IDAgOiAxO1xuICAgICAgICBjb25zdCBjb2xEaW0gPSBpc0NoYW5uZWxzTGFzdCA/IDEgOiAyO1xuICAgICAgICBsZXQgdW5yb2xsZWQgPSBgYDtcbiAgICAgICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDw9IDE7IHJvdysrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPD0gMTsgY29sKyspIHtcbiAgICAgICAgICAgICAgICB1bnJvbGxlZCArPSBgXG4gICAgICAgICAgYmxvY2tJbmRleCA9IHJjLnkgKyAke2NvbH07XG4gICAgICAgICAgcG9zID0gcmMueCArICR7cm93fTtcblxuICAgICAgICAgIGlmKGJsb2NrSW5kZXggPCAke291dHB1dFNoYXBlWzFdfSAmJiBwb3MgPCAke291dHB1dFNoYXBlWzBdfSkge1xuICAgICAgICAgICAgb2Zmc2V0WSA9IGludChibG9ja0luZGV4IC8gKCR7b3V0V2lkdGh9KSkgKiAke3N0cmlkZUhlaWdodH0gLSAke3RvcH07XG4gICAgICAgICAgICBkMCA9IG9mZnNldFkgKyAke2RpbGF0aW9uSGVpZ2h0fSAqIChwb3MgLyAke2l0ZW1zUGVyQmxvY2tSb3d9KTtcblxuICAgICAgICAgICAgaWYoZDAgPCAke2lucHV0U2hhcGVbcm93RGltXX0gJiYgZDAgPj0gMCkge1xuXG4gICAgICAgICAgICAgIG9mZnNldFggPSBpbnQobW9kKGZsb2F0KGJsb2NrSW5kZXgpLCAke291dFdpZHRofS4pICogJHtzdHJpZGVXaWR0aH0uIC0gJHtsZWZ0fS4pO1xuICAgICAgICAgICAgICBkMSA9IG9mZnNldFggKyAke2RpbGF0aW9uV2lkdGh9ICogKGludChtb2QoZmxvYXQocG9zKSwgJHtpdGVtc1BlckJsb2NrUm93fS4pIC8gJHtpbkNoYW5uZWxzfS4pKTtcblxuICAgICAgICAgICAgICBpZihkMSA8ICR7aW5wdXRTaGFwZVtjb2xEaW1dfSAmJiBkMSA+PSAwKSB7XG5cbiAgICAgICAgICAgICAgICBjaCA9IGludChtb2QoZmxvYXQocG9zKSwgJHtpbkNoYW5uZWxzfS4pKTtcblxuICAgICAgICAgICAgICAgIGlmICgke2lzQ2hhbm5lbHNMYXN0fSkge1xuICAgICAgICAgICAgICAgICAgaW5uZXJEaW1zID0gdmVjMihkMSwgY2gpO1xuICAgICAgICAgICAgICAgICAgcmVzdWx0WyR7cm93ICogMiArIGNvbH1dID0gZ2V0Q2hhbm5lbChcbiAgICAgICAgICAgICAgICAgICAgZ2V0QShkMCwgaW50KGlubmVyRGltcy54KSxcbiAgICAgICAgICAgICAgICAgICAgaW50KGlubmVyRGltcy55KSksIGlubmVyRGltcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGlubmVyRGltcyA9IHZlYzIoZDAsIGQxKTtcbiAgICAgICAgICAgICAgICAgIHJlc3VsdFske3JvdyAqIDIgKyBjb2x9XSA9IGdldENoYW5uZWwoXG4gICAgICAgICAgICAgICAgICAgIGdldEEoY2gsIGludChpbm5lckRpbXMueCksXG4gICAgICAgICAgICAgICAgICAgIGludChpbm5lckRpbXMueSkpLCBpbm5lckRpbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMiByYyA9IGdldE91dHB1dENvb3JkcygpO1xuXG4gICAgICAgIHZlYzQgcmVzdWx0ID0gdmVjNCgwKTtcblxuICAgICAgICBpbnQgYmxvY2tJbmRleCwgcG9zLCBvZmZzZXRZLCBkMCwgb2Zmc2V0WCwgZDEsIGNoO1xuICAgICAgICB2ZWMyIGlubmVyRGltcztcblxuICAgICAgICAke3Vucm9sbGVkfVxuXG4gICAgICAgICR7Z2xzbC5vdXRwdXR9ID0gcmVzdWx0O1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW0yY29sX3BhY2tlZF9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLy8gQWxsIGV4cG9ydHMgZnJvbSB0aGlzIHBhY2thZ2Ugc2hvdWxkIGJlIGluIGJhc2UuXG5leHBvcnQgKiBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0ICcuL3JlZ2lzdGVyX2FsbF9rZXJuZWxzJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgZW52LCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IEFyZ01pbk1heFByb2dyYW0gfSBmcm9tICcuLi9hcmdtaW5tYXhfZ3B1JztcbmltcG9ydCB7IEFyZ01pbk1heFBhY2tlZFByb2dyYW0gfSBmcm9tICcuLi9hcmdtaW5tYXhfcGFja2VkX2dwdSc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi4va2VybmVscy9SZXNoYXBlJztcbmZ1bmN0aW9uIGFyZ1JlZHVjZShiYWNrZW5kLCB4LCByZWR1Y2VUeXBlLCBiZXN0SW5kaWNlc0EgPSBudWxsKSB7XG4gICAgbGV0IGJhdGNoU2l6ZSA9IHguc2hhcGVbMF07XG4gICAgbGV0IGluU2l6ZSA9IHguc2hhcGVbMV07XG4gICAgaWYgKGJlc3RJbmRpY2VzQSAhPSBudWxsKSB7XG4gICAgICAgIGJhdGNoU2l6ZSA9IGJlc3RJbmRpY2VzQS5zaGFwZVswXTtcbiAgICAgICAgaW5TaXplID0gYmVzdEluZGljZXNBLnNoYXBlWzFdO1xuICAgIH1cbiAgICBjb25zdCB3aW5kb3dTaXplID0gYmFja2VuZF91dGlsLmNvbXB1dGVPcHRpbWFsV2luZG93U2l6ZShpblNpemUpO1xuICAgIGNvbnN0IHJlZHVjZUluZm8gPSB7IHdpbmRvd1NpemUsIGluU2l6ZSwgYmF0Y2hTaXplLCBvdXRTaXplOiBNYXRoLmNlaWwoaW5TaXplIC8gd2luZG93U2l6ZSkgfTtcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IEFyZ01pbk1heFByb2dyYW0ocmVkdWNlSW5mbywgcmVkdWNlVHlwZSwgYmVzdEluZGljZXNBID09IG51bGwpO1xuICAgIGNvbnN0IGlucHV0cyA9IFt4XTtcbiAgICBpZiAoYmVzdEluZGljZXNBICE9IG51bGwpIHtcbiAgICAgICAgaW5wdXRzLnB1c2goYmVzdEluZGljZXNBKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0cHV0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgaW5wdXRzLCAnaW50MzInKTtcbiAgICAvLyBObyBuZWVkIHRvIHJ1biBhbm90aGVyIEdQR1BVIHByb2dyYW0uXG4gICAgaWYgKG91dHB1dC5zaGFwZVsxXSA9PT0gMSkge1xuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBhcmdSZWR1Y2UoYmFja2VuZCwgeCwgcmVkdWNlVHlwZSwgb3V0cHV0KTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG91dHB1dCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGFyZ1JlZHVjZVBhY2tlZChiYWNrZW5kLCB4LCByZWR1Y2VUeXBlLCBiZXN0SW5kaWNlc0EgPSBudWxsKSB7XG4gICAgY29uc3QgaW5TaGFwZSA9IGJlc3RJbmRpY2VzQSAhPSBudWxsID8gYmVzdEluZGljZXNBLnNoYXBlIDogeC5zaGFwZTtcbiAgICBjb25zdCBpblNpemUgPSBpblNoYXBlW2luU2hhcGUubGVuZ3RoIC0gMV07XG4gICAgY29uc3Qgd2luZG93U2l6ZSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3B0aW1hbFdpbmRvd1NpemUoaW5TaXplKTtcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IEFyZ01pbk1heFBhY2tlZFByb2dyYW0oaW5TaGFwZSwgd2luZG93U2l6ZSwgcmVkdWNlVHlwZSwgYmVzdEluZGljZXNBID09IG51bGwpO1xuICAgIGNvbnN0IGlucHV0cyA9IGJlc3RJbmRpY2VzQSA9PSBudWxsID8gW3hdIDogW3gsIGJlc3RJbmRpY2VzQV07XG4gICAgY29uc3Qgb3V0cHV0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgaW5wdXRzLCAnaW50MzInKTtcbiAgICBpZiAob3V0cHV0LnNoYXBlLmxlbmd0aCA9PT0geC5zaGFwZS5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXJnUmVkdWNlUGFja2VkKGJhY2tlbmQsIHgsIHJlZHVjZVR5cGUsIG91dHB1dCk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ob3V0cHV0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhcmdNaW5NYXhSZWR1Y2UoYmFja2VuZCwgeCwgYXhpcywgcmVkdWNlVHlwZSkge1xuICAgIGNvbnN0IGF4ZXMgPSBbYXhpc107XG4gICAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdhcmcnICsgcmVkdWNlVHlwZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHJlZHVjZVR5cGUuc2xpY2UoMSksIGF4ZXMsIHguc2hhcGUubGVuZ3RoKTtcbiAgICBpZiAoIWVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfUkVEVUNFJykgfHwgeC5zaGFwZS5sZW5ndGggPD0gMikge1xuICAgICAgICBjb25zdCBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcyA9IFtdO1xuICAgICAgICBjb25zdCBbb3V0U2hhcGUsIHJlZHVjZVNoYXBlXSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKHguc2hhcGUsIGF4ZXMpO1xuICAgICAgICBjb25zdCBpblNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuICAgICAgICBjb25zdCBhMkQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IFstMSwgaW5TaXplXSB9IH0pO1xuICAgICAgICBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcy5wdXNoKGEyRCk7XG4gICAgICAgIGNvbnN0IHJlZHVjZWQgPSBhcmdSZWR1Y2UoYmFja2VuZCwgYTJELCByZWR1Y2VUeXBlKTtcbiAgICAgICAgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MucHVzaChyZWR1Y2VkKTtcbiAgICAgICAgY29uc3QgcmVzaGFwZWQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHJlZHVjZWQgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IG91dFNoYXBlIH0gfSk7XG4gICAgICAgIGludGVybWVkaWF0ZVRlbnNvckluZm9zLmZvckVhY2godCA9PiBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHQpKTtcbiAgICAgICAgcmV0dXJuIHJlc2hhcGVkO1xuICAgIH1cbiAgICByZXR1cm4gYXJnUmVkdWNlUGFja2VkKGJhY2tlbmQsIHgsIHJlZHVjZVR5cGUpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXJnX21pbl9tYXguanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgVW5hcnlPcFByb2dyYW0gfSBmcm9tICcuLi91bmFyeW9wX2dwdSc7XG5jb25zdCBUT19JTlQgPSBgcmV0dXJuIGZsb2F0KGludCh4KSk7YDtcbmV4cG9ydCBmdW5jdGlvbiBpbnQoaW5wdXQsIGJhY2tlbmQpIHtcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IFVuYXJ5T3BQcm9ncmFtKGlucHV0LnNoYXBlLCBUT19JTlQpO1xuICAgIGNvbnN0IG91dHB1dCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtpbnB1dF0sICdpbnQzMicpO1xuICAgIHJldHVybiB7IGRhdGFJZDogb3V0cHV0LmRhdGFJZCwgc2hhcGU6IG91dHB1dC5zaGFwZSwgZHR5cGU6IG91dHB1dC5kdHlwZSB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW50LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgZW52LCB1cGNhc3RUeXBlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IEJpbmFyeU9wUHJvZ3JhbSB9IGZyb20gJy4uL2JpbmFyeW9wX2dwdSc7XG5pbXBvcnQgeyBCaW5hcnlPcFBhY2tlZFByb2dyYW0gfSBmcm9tICcuLi9iaW5hcnlvcF9wYWNrZWRfZ3B1JztcbmltcG9ydCB7IGNvbXBsZXggfSBmcm9tICcuLi9rZXJuZWxzL0NvbXBsZXgnO1xuaW1wb3J0IHsgTEVBS1lSRUxVLCBMRUFLWVJFTFVfUEFDS0VEIH0gZnJvbSAnLi4va2VybmVscy9MZWFreVJlbHUnO1xuaW1wb3J0IHsgUFJFTFUsIFBSRUxVX1BBQ0tFRCB9IGZyb20gJy4uL2tlcm5lbHMvUHJlbHUnO1xuaW1wb3J0ICogYXMgdW5hcnlfb3AgZnJvbSAnLi4vdW5hcnlvcF9ncHUnO1xuaW1wb3J0IHsgVW5hcnlPcFByb2dyYW0gfSBmcm9tICcuLi91bmFyeW9wX2dwdSc7XG5pbXBvcnQgKiBhcyB1bmFyeV9wYWNrZWRfb3AgZnJvbSAnLi4vdW5hcnlvcF9wYWNrZWRfZ3B1JztcbmltcG9ydCB7IFVuYXJ5T3BQYWNrZWRQcm9ncmFtIH0gZnJvbSAnLi4vdW5hcnlvcF9wYWNrZWRfZ3B1JztcbmV4cG9ydCBjb25zdCBDSEVDS19OQU5fU05JUFBFVF9VTkFSWSA9IGBpZiAoaXNuYW4oeCkpIHJldHVybiB4O2A7XG5leHBvcnQgY29uc3QgQ0hFQ0tfTkFOX1NOSVBQRVRfQklOQVJZID0gYFxuICBpZiAoaXNuYW4oYSkpIHJldHVybiBhO1xuICBpZiAoaXNuYW4oYikpIHJldHVybiBiO1xuYDtcbmV4cG9ydCBjb25zdCBDSEVDS19OQU5fU05JUFBFVF9CSU5BUllfUEFDS0VEID0gYFxuICByZXN1bHQuciA9IGlzTmFOLnIgPiAwLiA/IE5BTiA6IHJlc3VsdC5yO1xuICByZXN1bHQuZyA9IGlzTmFOLmcgPiAwLiA/IE5BTiA6IHJlc3VsdC5nO1xuICByZXN1bHQuYiA9IGlzTmFOLmIgPiAwLiA/IE5BTiA6IHJlc3VsdC5iO1xuICByZXN1bHQuYSA9IGlzTmFOLmEgPiAwLiA/IE5BTiA6IHJlc3VsdC5hO1xuYDtcbi8qKlxuICogVGVtcGxhdGUgdGhhdCBjcmVhdGVzIGEgYEtlcm5lbEZ1bmNgIGZvciB1bmFyeSBvcHMuXG4gKiBAcGFyYW0gb3BTbmlwcGV0IE9wIHNuaXBwZXQgdG8gY3JlYXRlIGBVbmFyeU9wUHJvZ3JhbWAuXG4gKiBAcGFyYW0gcGFja2VkT3BTbmlwcGV0IE9wIHNuaXBwZXQgdG8gY3JlYXRlIGBVbmFyeU9wUGFja2VkUHJvZ3JhbWAuXG4gKiBAcGFyYW0gZHR5cGUgT3B0aW9uYWwuIElmIHNldCwgdGhlIHJlc3VsdCBoYXMgdGhpcyBkdHlwZS4gT3RoZXJ3aXNlLCB0aGVcbiAqICAgICByZXN1bHQgaGFzIHRoZSBzYW1lIGR0eXBlIGFzIHRoZSBmaXJzdCBpbnB1dC4gVGhpcyBpcyBtYWlubHkgdXNlZCBpblxuICogICAgIGNvbXBhcmlzb24ga2VybmVscywgc3VjaCBhcyBFcXVhbCwgTGVzcywgR3JlYXRlciwgZXRjLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5hcnlLZXJuZWxGdW5jKHsgb3BTbmlwcGV0LCBwYWNrZWRPcFNuaXBwZXQsIGNwdUtlcm5lbEltcGwsIGR0eXBlIH0pIHtcbiAgICByZXR1cm4gKHsgaW5wdXRzLCBiYWNrZW5kIH0pID0+IHtcbiAgICAgICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgICAgIGNvbnN0IHdlYmdsQmFja2VuZCA9IGJhY2tlbmQ7XG4gICAgICAgIGNvbnN0ICRkdHlwZSA9IGR0eXBlIHx8IHguZHR5cGU7XG4gICAgICAgIGlmICh3ZWJnbEJhY2tlbmQuc2hvdWxkRXhlY3V0ZU9uQ1BVKFt4XSkgJiYgY3B1S2VybmVsSW1wbCAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCB4RGF0YSA9IHdlYmdsQmFja2VuZC50ZXhEYXRhLmdldCh4LmRhdGFJZCk7XG4gICAgICAgICAgICBjb25zdCBvdXRWYWx1ZXMgPSBjcHVLZXJuZWxJbXBsKHhEYXRhLnZhbHVlcywgJGR0eXBlKTtcbiAgICAgICAgICAgIHJldHVybiB3ZWJnbEJhY2tlbmQubWFrZVRlbnNvckluZm8oeC5zaGFwZSwgJGR0eXBlLCBvdXRWYWx1ZXMpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNob3VsZFVzZVBhY2tlZFByb2dyYW0gPSBlbnYoKS5nZXRCb29sKCdXRUJHTF9QQUNLX1VOQVJZX09QRVJBVElPTlMnKSAmJiBwYWNrZWRPcFNuaXBwZXQgIT0gbnVsbDtcbiAgICAgICAgbGV0IHByb2dyYW07XG4gICAgICAgIGlmIChzaG91bGRVc2VQYWNrZWRQcm9ncmFtKSB7XG4gICAgICAgICAgICBwcm9ncmFtID0gbmV3IFVuYXJ5T3BQYWNrZWRQcm9ncmFtKHguc2hhcGUsIHBhY2tlZE9wU25pcHBldCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwcm9ncmFtID0gbmV3IFVuYXJ5T3BQcm9ncmFtKHguc2hhcGUsIG9wU25pcHBldCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdlYmdsQmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3hdLCAkZHR5cGUpO1xuICAgIH07XG59XG4vKipcbiAqIFRlbXBsYXRlIHRoYXQgY3JlYXRlcyBhIGBLZXJuZWxGdW5jYCBmb3IgYmluYXJ5IG9wcy5cbiAqIEBwYXJhbSBvcFNuaXBwZXQgT3Agc25pcHBldCB0byBjcmVhdGUgYEJpbmFyeU9wUHJvZ3JhbWAuXG4gKiBAcGFyYW0gcGFja2VkT3BTbmlwcGV0IE9wIHNuaXBwZXQgdG8gY3JlYXRlIGBCaW5hcnlPcFBhY2tlZFByb2dyYW1gLlxuICogQHBhcmFtIGNoZWNrT3V0T2ZCb3VuZHNGb3JQYWNrZWRQcm9ncmFtIFdoZXRoZXIgdG8gc2V0IGNoZWNrT3V0T2ZCb3VuZHM9dHJ1ZVxuICogICAgIHdoZW4gY3JlYXRpbmcgQmluYXJ5T3BQYWNrZWRQcm9ncmFtLlxuICogQHBhcmFtIGR0eXBlIE9wdGlvbmFsLiBJZiBzZXQsIHRoZSByZXN1bHQgaGFzIHRoaXMgZHR5cGUuIE90aGVyd2lzZSwgdGhlXG4gKiAgICAgcmVzdWx0IGhhcyB0aGUgc2FtZSBkdHlwZSBhcyB0aGUgZmlyc3QgaW5wdXQuIFRoaXMgaXMgbWFpbmx5IHVzZWQgaW5cbiAqICAgICBjb21wYXJpc29uIGtlcm5lbHMsIHN1Y2ggYXMgRXF1YWwsIExlc3MsIEdyZWF0ZXIsIGV0Yy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmFyeUtlcm5lbEZ1bmMoeyBvcFNuaXBwZXQsIHBhY2tlZE9wU25pcHBldCwgY2hlY2tPdXRPZkJvdW5kcyA9IGZhbHNlLCBzdXBwb3J0c0NvbXBsZXggPSBmYWxzZSwgY3B1S2VybmVsSW1wbCwgZHR5cGUgfSkge1xuICAgIHJldHVybiAoeyBpbnB1dHMsIGJhY2tlbmQgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IGEsIGIgfSA9IGlucHV0cztcbiAgICAgICAgY29uc3Qgd2ViZ2xCYWNrZW5kID0gYmFja2VuZDtcbiAgICAgICAgaWYgKHN1cHBvcnRzQ29tcGxleCAmJiBhLmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICAgICAgY29uc3QgYURhdGEgPSB3ZWJnbEJhY2tlbmQudGV4RGF0YS5nZXQoYS5kYXRhSWQpO1xuICAgICAgICAgICAgY29uc3QgYkRhdGEgPSB3ZWJnbEJhY2tlbmQudGV4RGF0YS5nZXQoYi5kYXRhSWQpO1xuICAgICAgICAgICAgY29uc3QgW3JlYWwsIGltYWddID0gW1xuICAgICAgICAgICAgICAgIFthRGF0YS5jb21wbGV4VGVuc29ySW5mb3MucmVhbCwgYkRhdGEuY29tcGxleFRlbnNvckluZm9zLnJlYWxdLFxuICAgICAgICAgICAgICAgIFthRGF0YS5jb21wbGV4VGVuc29ySW5mb3MuaW1hZywgYkRhdGEuY29tcGxleFRlbnNvckluZm9zLmltYWddXG4gICAgICAgICAgICBdLm1hcChjb21wbGV4UGFydHMgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IFthUGFydCwgYlBhcnRdID0gY29tcGxleFBhcnRzO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFIYW5kbGUgPSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFJZDogYVBhcnQuZGF0YUlkLFxuICAgICAgICAgICAgICAgICAgICBkdHlwZTogYVBhcnQuZHR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHNoYXBlOiBhLnNoYXBlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCBiSGFuZGxlID0ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhSWQ6IGJQYXJ0LmRhdGFJZCxcbiAgICAgICAgICAgICAgICAgICAgZHR5cGU6IGJQYXJ0LmR0eXBlLFxuICAgICAgICAgICAgICAgICAgICBzaGFwZTogYi5zaGFwZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBCaW5hcnlPcFByb2dyYW0ob3BTbmlwcGV0LCBhLnNoYXBlLCBiLnNoYXBlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gd2ViZ2xCYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbYUhhbmRsZSwgYkhhbmRsZV0sIHVwY2FzdFR5cGUoYVBhcnQuZHR5cGUsIGJQYXJ0LmR0eXBlKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBsZXhPdXRwdXQgPSBjb21wbGV4KHsgaW5wdXRzOiB7IHJlYWwsIGltYWcgfSwgYmFja2VuZDogd2ViZ2xCYWNrZW5kIH0pO1xuICAgICAgICAgICAgd2ViZ2xCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlYWwpO1xuICAgICAgICAgICAgd2ViZ2xCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGltYWcpO1xuICAgICAgICAgICAgLy8gVE9ETyhhbm54aW5neXVhbik6IEltcGxlbWVudCBDUFUgZm9yd2FyZGluZyBmb3IgY29tcGxleCBpbnB1dHMuXG4gICAgICAgICAgICByZXR1cm4gY29tcGxleE91dHB1dDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCAkZHR5cGUgPSBkdHlwZSB8fCB1cGNhc3RUeXBlKGEuZHR5cGUsIGIuZHR5cGUpO1xuICAgICAgICBpZiAoKGEuZHR5cGUgPT09ICdzdHJpbmcnIHx8IGIuZHR5cGUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICB3ZWJnbEJhY2tlbmQuc2hvdWxkRXhlY3V0ZU9uQ1BVKFthLCBiXSkpICYmXG4gICAgICAgICAgICBjcHVLZXJuZWxJbXBsICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGFWYWxzID0gd2ViZ2xCYWNrZW5kLnRleERhdGEuZ2V0KGEuZGF0YUlkKS52YWx1ZXM7XG4gICAgICAgICAgICBjb25zdCBiVmFscyA9IHdlYmdsQmFja2VuZC50ZXhEYXRhLmdldChiLmRhdGFJZCkudmFsdWVzO1xuICAgICAgICAgICAgY29uc3QgZGVjb2RlZEFWYWxzID0gYS5kdHlwZSA9PT0gJ3N0cmluZycgP1xuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tYW55XG4gICAgICAgICAgICAgICAgYmFja2VuZF91dGlsLmZyb21VaW50OFRvU3RyaW5nQXJyYXkoYVZhbHMpIDpcbiAgICAgICAgICAgICAgICBhVmFscztcbiAgICAgICAgICAgIGNvbnN0IGRlY29kZWRCVmFscyA9IGEuZHR5cGUgPT09ICdzdHJpbmcnID9cbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWFueVxuICAgICAgICAgICAgICAgIGJhY2tlbmRfdXRpbC5mcm9tVWludDhUb1N0cmluZ0FycmF5KGJWYWxzKSA6XG4gICAgICAgICAgICAgICAgYlZhbHM7XG4gICAgICAgICAgICBjb25zdCBbb3V0VmFsdWVzLCBvdXRTaGFwZV0gPSBjcHVLZXJuZWxJbXBsKGEuc2hhcGUsIGIuc2hhcGUsIGRlY29kZWRBVmFscywgZGVjb2RlZEJWYWxzLCAkZHR5cGUpO1xuICAgICAgICAgICAgY29uc3Qgb3V0ID0gd2ViZ2xCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dFNoYXBlLCAkZHR5cGUpO1xuICAgICAgICAgICAgY29uc3Qgb3V0RGF0YSA9IHdlYmdsQmFja2VuZC50ZXhEYXRhLmdldChvdXQuZGF0YUlkKTtcbiAgICAgICAgICAgIG91dERhdGEudmFsdWVzID0gb3V0VmFsdWVzO1xuICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzaG91bGRVc2VQYWNrZWRQcm9ncmFtID0gZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19CSU5BUllfT1BFUkFUSU9OUycpICYmXG4gICAgICAgICAgICBwYWNrZWRPcFNuaXBwZXQgIT0gbnVsbDtcbiAgICAgICAgbGV0IHByb2dyYW07XG4gICAgICAgIGlmIChzaG91bGRVc2VQYWNrZWRQcm9ncmFtKSB7XG4gICAgICAgICAgICBwcm9ncmFtID0gbmV3IEJpbmFyeU9wUGFja2VkUHJvZ3JhbShwYWNrZWRPcFNuaXBwZXQsIGEuc2hhcGUsIGIuc2hhcGUsIGNoZWNrT3V0T2ZCb3VuZHMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcHJvZ3JhbSA9IG5ldyBCaW5hcnlPcFByb2dyYW0ob3BTbmlwcGV0LCBhLnNoYXBlLCBiLnNoYXBlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd2ViZ2xCYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbYSwgYl0sICRkdHlwZSk7XG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBtYXBBY3RpdmF0aW9uVG9TaGFkZXJQcm9ncmFtKGFjdGl2YXRpb24sIHBhY2tlZCA9IGZhbHNlKSB7XG4gICAgaWYgKGFjdGl2YXRpb24gPT09ICdsaW5lYXInKSB7XG4gICAgICAgIGlmIChwYWNrZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmFyeV9wYWNrZWRfb3AuTElORUFSO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmFyeV9vcC5MSU5FQVI7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdyZWx1Jykge1xuICAgICAgICBpZiAocGFja2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5hcnlfcGFja2VkX29wLlJFTFU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuYXJ5X29wLlJFTFU7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdlbHUnKSB7XG4gICAgICAgIGlmIChwYWNrZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmFyeV9wYWNrZWRfb3AuRUxVO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmFyeV9vcC5FTFU7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdyZWx1NicpIHtcbiAgICAgICAgaWYgKHBhY2tlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuYXJ5X3BhY2tlZF9vcC5SRUxVNjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5hcnlfb3AuUkVMVTY7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdwcmVsdScpIHtcbiAgICAgICAgaWYgKHBhY2tlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFBSRUxVX1BBQ0tFRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUFJFTFU7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdsZWFreXJlbHUnKSB7XG4gICAgICAgIGlmIChwYWNrZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBMRUFLWVJFTFVfUEFDS0VEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBMRUFLWVJFTFU7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdzaWdtb2lkJykge1xuICAgICAgICBpZiAocGFja2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5hcnlfcGFja2VkX29wLlNJR01PSUQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuYXJ5X29wLlNJR01PSUQ7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgQWN0aXZhdGlvbiAke2FjdGl2YXRpb259IGhhcyBub3QgYmVlbiBpbXBsZW1lbnRlZCBmb3IgdGhlIFdlYkdMIGJhY2tlbmQuYCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1rZXJuZWxfZnVuY3NfdXRpbHMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IE1lYW5Qcm9ncmFtIH0gZnJvbSAnLi4vbWVhbl9ncHUnO1xuaW1wb3J0IHsgUmVkdWNlUHJvZ3JhbSB9IGZyb20gJy4uL3JlZHVjZV9ncHUnO1xuLy8gUmV0dXJucyBhbiBhcnJheSBvZiBjb25maWd1cmF0aW9uIG9iamVjdHMgdGhhdCBkZXNjcmliZSBlYWNoIHN0YWdlIG9mIHRoZVxuLy8gcmVkdWN0aW9uLlxuZnVuY3Rpb24gZ2V0UmVkdWN0aW9uU3RhZ2VzKGluU2hhcGUpIHtcbiAgICBjb25zdCBzdGFnZXMgPSBbXTtcbiAgICB3aGlsZSAoc3RhZ2VzLmxlbmd0aCA9PT0gMCB8fCBzdGFnZXNbc3RhZ2VzLmxlbmd0aCAtIDFdLm91dFNpemUgIT09IDEpIHtcbiAgICAgICAgY29uc3Qgb3V0U2l6ZSA9IHN0YWdlcy5sZW5ndGggPyBzdGFnZXNbc3RhZ2VzLmxlbmd0aCAtIDFdLm91dFNpemUgOiBpblNoYXBlWzFdO1xuICAgICAgICBjb25zdCB3aW5kb3dTaXplID0gYmFja2VuZF91dGlsLmNvbXB1dGVPcHRpbWFsV2luZG93U2l6ZShvdXRTaXplKTtcbiAgICAgICAgc3RhZ2VzLnB1c2goe1xuICAgICAgICAgICAgaW5TaXplOiBvdXRTaXplLFxuICAgICAgICAgICAgd2luZG93U2l6ZSxcbiAgICAgICAgICAgIG91dFNpemU6IE1hdGguY2VpbChvdXRTaXplIC8gd2luZG93U2l6ZSlcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBzdGFnZXM7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVkdWNlKHgsIGR0eXBlLCByZWR1Y3Rpb25UeXBlLCBiYWNrZW5kKSB7XG4gICAgY29uc3QgcmVkdWN0aW9uU3RhZ2VzID0gZ2V0UmVkdWN0aW9uU3RhZ2VzKHguc2hhcGUpO1xuICAgIGxldCByZXN1bHQgPSB4O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVkdWN0aW9uU3RhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHsgaW5TaXplLCB3aW5kb3dTaXplLCBvdXRTaXplIH0gPSByZWR1Y3Rpb25TdGFnZXNbaV07XG4gICAgICAgIGxldCBwcm9ncmFtO1xuICAgICAgICBsZXQgcHJldmlvdXNSZXN1bHQ7XG4gICAgICAgIGlmIChyZWR1Y3Rpb25UeXBlID09PSAnbWVhbicpIHtcbiAgICAgICAgICAgIHByb2dyYW0gPSBpID09PSAwID9cbiAgICAgICAgICAgICAgICBuZXcgTWVhblByb2dyYW0oeyB3aW5kb3dTaXplLCBpblNpemUsIGJhdGNoU2l6ZTogeC5zaGFwZVswXSwgb3V0U2l6ZSB9LCBpblNpemUpIDpcbiAgICAgICAgICAgICAgICBuZXcgTWVhblByb2dyYW0oeyB3aW5kb3dTaXplLCBpblNpemUsIGJhdGNoU2l6ZTogeC5zaGFwZVswXSwgb3V0U2l6ZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHByb2dyYW0gPSBuZXcgUmVkdWNlUHJvZ3JhbSh7IHdpbmRvd1NpemUsIGluU2l6ZSwgYmF0Y2hTaXplOiB4LnNoYXBlWzBdLCBvdXRTaXplIH0sIHJlZHVjdGlvblR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIHByZXZpb3VzUmVzdWx0ID0gcmVzdWx0O1xuICAgICAgICByZXN1bHQgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbcmVzdWx0XSwgZHR5cGUpO1xuICAgICAgICBpZiAocHJldmlvdXNSZXN1bHQuZGF0YUlkICE9PSB4LmRhdGFJZCkge1xuICAgICAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhwcmV2aW91c1Jlc3VsdCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlZHVjZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBSZXNoYXBlUGFja2VkUHJvZ3JhbSB9IGZyb20gJy4uL3Jlc2hhcGVfcGFja2VkX2dwdSc7XG5pbXBvcnQgeyBnZXRCYXRjaERpbSwgZ2V0Um93c0NvbHMgfSBmcm9tICcuLi93ZWJnbF91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBwYWNrZWRSZXNoYXBlKGlucHV0LCBhZnRlclNoYXBlLCBiYWNrZW5kKSB7XG4gICAgY29uc3QgaW5wdXQzRFNoYXBlID0gW2dldEJhdGNoRGltKGlucHV0LnNoYXBlKSxcbiAgICAgICAgLi4uZ2V0Um93c0NvbHMoaW5wdXQuc2hhcGUpXTtcbiAgICBjb25zdCBpbnB1dDNEID0ge1xuICAgICAgICBkdHlwZTogaW5wdXQuZHR5cGUsXG4gICAgICAgIHNoYXBlOiBpbnB1dDNEU2hhcGUsXG4gICAgICAgIGRhdGFJZDogaW5wdXQuZGF0YUlkXG4gICAgfTtcbiAgICBjb25zdCBhZnRlclNoYXBlQXMzRCA9IFtnZXRCYXRjaERpbShhZnRlclNoYXBlKSxcbiAgICAgICAgLi4uZ2V0Um93c0NvbHMoYWZ0ZXJTaGFwZSldO1xuICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgUmVzaGFwZVBhY2tlZFByb2dyYW0oYWZ0ZXJTaGFwZUFzM0QsIGlucHV0M0RTaGFwZSk7XG4gICAgY29uc3QgcHJldmVudEVhZ2VyVW5wYWNraW5nT2ZPdXRwdXQgPSB0cnVlO1xuICAgIGNvbnN0IG91dHB1dCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtpbnB1dDNEXSwgaW5wdXQuZHR5cGUsIG51bGwgLyogY3VzdG9tU2V0dXAgKi8sIHByZXZlbnRFYWdlclVucGFja2luZ09mT3V0cHV0KTtcbiAgICByZXR1cm4geyBkYXRhSWQ6IG91dHB1dC5kYXRhSWQsIHNoYXBlOiBhZnRlclNoYXBlLCBkdHlwZTogb3V0cHV0LmR0eXBlIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZXNoYXBlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8vIEltcG9ydCBzaGFyZWQgZnVuY3Rpb25hbGl0eSBmcm9tIHRmanMtYmFja2VuZC1jcHUgd2l0aG91dCB0cmlnZ2VyaW5nXG4vLyBzaWRlIGVmZmVjdHMuXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWltcG9ydHMtZnJvbS1kaXN0XG5pbXBvcnQgKiBhcyBzaGFyZWQgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L3NoYXJlZCc7XG5jb25zdCB7IGFkZEltcGw6IGFkZEltcGxDUFUsIGJpbmNvdW50SW1wbDogYmluY291bnRJbXBsQ1BVLCBiaW5jb3VudFJlZHVjZUltcGw6IGJpbmNvdW50UmVkdWNlSW1wbENQVSwgY2VpbEltcGw6IGNlaWxJbXBsQ1BVLCBjb25jYXRJbXBsOiBjb25jYXRJbXBsQ1BVLCBlcXVhbEltcGw6IGVxdWFsSW1wbENQVSwgZXhwSW1wbDogZXhwSW1wbENQVSwgZXhwbTFJbXBsOiBleHBtMUltcGxDUFUsIGZsb29ySW1wbDogZmxvb3JJbXBsQ1BVLCBnYXRoZXJOZEltcGw6IGdhdGhlck5kSW1wbENQVSwgZ2F0aGVyVjJJbXBsOiBnYXRoZXJWMkltcGxDUFUsIGdyZWF0ZXJJbXBsOiBncmVhdGVySW1wbENQVSwgZ3JlYXRlckVxdWFsSW1wbDogZ3JlYXRlckVxdWFsSW1wbENQVSwgbGVzc0ltcGw6IGxlc3NJbXBsQ1BVLCBsZXNzRXF1YWxJbXBsOiBsZXNzRXF1YWxJbXBsQ1BVLCBsaW5TcGFjZUltcGw6IGxpblNwYWNlSW1wbENQVSwgbG9nSW1wbDogbG9nSW1wbENQVSwgbWF4SW1wbDogbWF4SW1wbENQVSwgbWF4aW11bUltcGw6IG1heGltdW1JbXBsQ1BVLCBtaW5pbXVtSW1wbDogbWluaW11bUltcGxDUFUsIG11bHRpcGx5SW1wbDogbXVsdGlwbHlJbXBsQ1BVLCBuZWdJbXBsOiBuZWdJbXBsQ1BVLCBub3RFcXVhbEltcGw6IG5vdEVxdWFsSW1wbENQVSwgcHJvZEltcGw6IHByb2RJbXBsQ1BVLCByYW5nZUltcGw6IHJhbmdlSW1wbENQVSwgcnNxcnRJbXBsOiByc3FydEltcGxDUFUsIHNpbXBsZUFic0ltcGw6IHNpbXBsZUFic0ltcGxDUFUsIHNsaWNlSW1wbDogc2xpY2VJbXBsQ1BVLCBzcGFyc2VGaWxsRW1wdHlSb3dzSW1wbDogc3BhcnNlRmlsbEVtcHR5Um93c0ltcGxDUFUsIHNwYXJzZVJlc2hhcGVJbXBsOiBzcGFyc2VSZXNoYXBlSW1wbENQVSwgc3BhcnNlU2VnbWVudFJlZHVjdGlvbkltcGw6IHNwYXJzZVNlZ21lbnRSZWR1Y3Rpb25JbXBsQ1BVLCBzdHJpZGVkU2xpY2VJbXBsOiBzdHJpZGVkU2xpY2VJbXBsQ1BVLCBzdHJpbmdOR3JhbXNJbXBsOiBzdHJpbmdOR3JhbXNJbXBsQ1BVLCBzdHJpbmdTcGxpdEltcGw6IHN0cmluZ1NwbGl0SW1wbENQVSwgc3RyaW5nVG9IYXNoQnVja2V0RmFzdEltcGw6IHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RJbXBsQ1BVLCBzdWJJbXBsOiBzdWJJbXBsQ1BVLCB0aWxlSW1wbDogdGlsZUltcGxDUFUsIHRvcEtJbXBsOiB0b3BLSW1wbENQVSwgdHJhbnNwb3NlSW1wbDogdHJhbnNwb3NlSW1wbENQVSwgdW5pcXVlSW1wbDogdW5pcXVlSW1wbENQVSwgfSA9IHNoYXJlZDtcbmV4cG9ydCB7IGFkZEltcGxDUFUsIGJpbmNvdW50SW1wbENQVSwgYmluY291bnRSZWR1Y2VJbXBsQ1BVLCBjZWlsSW1wbENQVSwgY29uY2F0SW1wbENQVSwgZXF1YWxJbXBsQ1BVLCBleHBJbXBsQ1BVLCBleHBtMUltcGxDUFUsIGZsb29ySW1wbENQVSwgZ2F0aGVyTmRJbXBsQ1BVLCBnYXRoZXJWMkltcGxDUFUsIGdyZWF0ZXJFcXVhbEltcGxDUFUsIGdyZWF0ZXJJbXBsQ1BVLCBsZXNzRXF1YWxJbXBsQ1BVLCBsZXNzSW1wbENQVSwgbGluU3BhY2VJbXBsQ1BVLCBsb2dJbXBsQ1BVLCBtYXhJbXBsQ1BVLCBtYXhpbXVtSW1wbENQVSwgbWluaW11bUltcGxDUFUsIG11bHRpcGx5SW1wbENQVSwgbmVnSW1wbENQVSwgbm90RXF1YWxJbXBsQ1BVLCBwcm9kSW1wbENQVSwgc2ltcGxlQWJzSW1wbENQVSwgc2xpY2VJbXBsQ1BVLCBzcGFyc2VGaWxsRW1wdHlSb3dzSW1wbENQVSwgc3BhcnNlUmVzaGFwZUltcGxDUFUsIHNwYXJzZVNlZ21lbnRSZWR1Y3Rpb25JbXBsQ1BVLCBzdHJpZGVkU2xpY2VJbXBsQ1BVLCBzdHJpbmdOR3JhbXNJbXBsQ1BVLCBzdHJpbmdTcGxpdEltcGxDUFUsIHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RJbXBsQ1BVLCBzdWJJbXBsQ1BVLCByYW5nZUltcGxDUFUsIHJzcXJ0SW1wbENQVSwgdGlsZUltcGxDUFUsIHRvcEtJbXBsQ1BVLCB0cmFuc3Bvc2VJbXBsQ1BVLCB1bmlxdWVJbXBsQ1BVLCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2hhcmVkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEFicywgZW52IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHNpbXBsZUFic0ltcGxDUFUgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmltcG9ydCB7IFVuYXJ5T3BQcm9ncmFtIH0gZnJvbSAnLi4vdW5hcnlvcF9ncHUnO1xuaW1wb3J0IHsgVW5hcnlPcFBhY2tlZFByb2dyYW0gfSBmcm9tICcuLi91bmFyeW9wX3BhY2tlZF9ncHUnO1xuY29uc3QgQUJTID0gYHJldHVybiBhYnMoeCk7YDtcbmV4cG9ydCBmdW5jdGlvbiBhYnMoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIC8vIFRPRE86IGhhbmRsZSBjYXNlcyB3aGVuIHggaXMgY29tcGxleC4gT25jZSB0aGUgY3B1IGltcGxlbWVudGF0aW9uXG4gICAgLy8gY2FuIGhhbmRsZSBjb21wbGV4IHZhbHVlcywgcmVmYWN0b3IgdG8gdXNlIHVuYXJ5S2VybmVsRnVuYy5cbiAgICBpZiAoYmFja2VuZC5zaG91bGRFeGVjdXRlT25DUFUoW3hdKSAmJiB4LmR0eXBlICE9PSAnY29tcGxleDY0Jykge1xuICAgICAgICBjb25zdCB4RGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQoeC5kYXRhSWQpO1xuICAgICAgICBjb25zdCBvdXRWYWx1ZXMgPSBzaW1wbGVBYnNJbXBsQ1BVKHhEYXRhLnZhbHVlcyk7XG4gICAgICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHguc2hhcGUsIHguZHR5cGUsIG91dFZhbHVlcyk7XG4gICAgfVxuICAgIGxldCBwcm9ncmFtO1xuICAgIGlmIChlbnYoKS5nZXRCb29sKCdXRUJHTF9QQUNLX1VOQVJZX09QRVJBVElPTlMnKSkge1xuICAgICAgICBwcm9ncmFtID0gbmV3IFVuYXJ5T3BQYWNrZWRQcm9ncmFtKHguc2hhcGUsIEFCUyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBwcm9ncmFtID0gbmV3IFVuYXJ5T3BQcm9ncmFtKHguc2hhcGUsIEFCUyk7XG4gICAgfVxuICAgIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeF0sIHguZHR5cGUpO1xufVxuZXhwb3J0IGNvbnN0IGFic0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBBYnMsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogYWJzXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QWJzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEFjb3MgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQgeyBDSEVDS19OQU5fU05JUFBFVCB9IGZyb20gJy4uL3VuYXJ5b3BfZ3B1JztcbmNvbnN0IEFDT1MgPSBDSEVDS19OQU5fU05JUFBFVCArIGBcbiAgaWYgKGFicyh4KSA+IDEuKSB7XG4gICAgcmV0dXJuIE5BTjtcbiAgfVxuICByZXR1cm4gYWNvcyh4KTtcbmA7XG5leHBvcnQgY29uc3QgYWNvcyA9IHVuYXJ5S2VybmVsRnVuYyh7IG9wU25pcHBldDogQUNPUyB9KTtcbmV4cG9ydCBjb25zdCBhY29zQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEFjb3MsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogYWNvcyxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BY29zLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEFjb3NoIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHsgQ0hFQ0tfTkFOX1NOSVBQRVQgfSBmcm9tICcuLi91bmFyeW9wX2dwdSc7XG5jb25zdCBBQ09TSCA9IENIRUNLX05BTl9TTklQUEVUICsgYFxuICBpZiAoeCA8IDEuMCkgcmV0dXJuIE5BTjtcbnJldHVybiBsb2coeCArIHNxcnQoeCAqIHggLSAxLjApKTtgO1xuZXhwb3J0IGNvbnN0IGFjb3NoID0gdW5hcnlLZXJuZWxGdW5jKHsgb3BTbmlwcGV0OiBBQ09TSCB9KTtcbmV4cG9ydCBjb25zdCBhY29zaENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBBY29zaCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBhY29zaCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BY29zaC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBZGQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYmluYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHsgYWRkSW1wbENQVSBhcyBjcHVBZGQgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmNvbnN0IEFERCA9ICdyZXR1cm4gYSArIGI7JztcbmV4cG9ydCBjb25zdCBhZGRLZXJuZWxGdW5jID0gYmluYXJ5S2VybmVsRnVuYyh7XG4gICAgb3BTbmlwcGV0OiBBREQsXG4gICAgcGFja2VkT3BTbmlwcGV0OiBBREQsXG4gICAgc3VwcG9ydHNDb21wbGV4OiB0cnVlLFxuICAgIGNwdUtlcm5lbEltcGw6IGNwdUFkZFxufSk7XG5leHBvcnQgY29uc3QgYWRkQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEFkZCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBhZGRLZXJuZWxGdW5jXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QWRkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEFkZE4sIGVudiwgdXBjYXN0VHlwZSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBBZGROUHJvZ3JhbSB9IGZyb20gJy4uL2FkZG5fZ3B1JztcbmltcG9ydCB7IEFkZE5QYWNrZWRQcm9ncmFtIH0gZnJvbSAnLi4vYWRkbl9wYWNrZWRfZ3B1JztcbmltcG9ydCB7IGlkZW50aXR5IH0gZnJvbSAnLi9JZGVudGl0eSc7XG5leHBvcnQgZnVuY3Rpb24gYWRkTihhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgdGVuc29ycyA9IGlucHV0cztcbiAgICBpZiAodGVuc29ycy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGlkZW50aXR5KHsgaW5wdXRzOiB7IHg6IHRlbnNvcnNbMF0gfSwgYmFja2VuZCB9KTtcbiAgICB9XG4gICAgLy8gTGltaXQgdGhlIG51bWJlciBvZiB1cGxvYWRlZCB0ZXh0dXJlcyBmb3Igb3B0aW1pemF0aW9uLlxuICAgIGlmICh0ZW5zb3JzLmxlbmd0aCA+IGVudigpLmdldCgnV0VCR0xfTUFYX1RFWFRVUkVTX0lOX1NIQURFUicpKSB7XG4gICAgICAgIGNvbnN0IG1pZEluZGV4ID0gTWF0aC5mbG9vcih0ZW5zb3JzLmxlbmd0aCAvIDIpO1xuICAgICAgICBjb25zdCBsZWZ0U2lkZSA9IGFkZE4oeyBpbnB1dHM6IHRlbnNvcnMuc2xpY2UoMCwgbWlkSW5kZXgpLCBiYWNrZW5kIH0pO1xuICAgICAgICBjb25zdCByaWdodFNpZGUgPSBhZGROKHsgaW5wdXRzOiB0ZW5zb3JzLnNsaWNlKG1pZEluZGV4KSwgYmFja2VuZCB9KTtcbiAgICAgICAgcmV0dXJuIGFkZE4oeyBpbnB1dHM6IFtsZWZ0U2lkZSwgcmlnaHRTaWRlXSwgYmFja2VuZCB9KTtcbiAgICB9XG4gICAgY29uc3QgZHR5cGUgPSB0ZW5zb3JzLm1hcCh0ID0+IHQuZHR5cGUpLnJlZHVjZSgoZDEsIGQyKSA9PiB1cGNhc3RUeXBlKGQxLCBkMikpO1xuICAgIGNvbnN0IHNoYXBlcyA9IHRlbnNvcnMubWFwKHQgPT4gdC5zaGFwZSk7XG4gICAgLy8gV2UgY2FuIG1ha2Ugc3VyZSBzaGFwZXMgYXJlIGlkZW50aWNhbCBpbiBvcCBsZXZlbC5cbiAgICBjb25zdCB1c2VQYWNrZWRPcCA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0snKTtcbiAgICBjb25zdCBwcm9ncmFtID0gdXNlUGFja2VkT3AgP1xuICAgICAgICBuZXcgQWRkTlBhY2tlZFByb2dyYW0odGVuc29yc1swXS5zaGFwZSwgc2hhcGVzKSA6XG4gICAgICAgIG5ldyBBZGROUHJvZ3JhbSh0ZW5zb3JzWzBdLnNoYXBlLCBzaGFwZXMpO1xuICAgIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCB0ZW5zb3JzLCBkdHlwZSk7XG59XG5leHBvcnQgY29uc3QgYWRkTkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBBZGROLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGFkZE5cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BZGROLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEFsbCwgYmFja2VuZF91dGlsLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHJlZHVjZSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9yZWR1Y2UnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQgeyB0cmFuc3Bvc2UgfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5leHBvcnQgZnVuY3Rpb24gYWxsKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBheGlzLCBrZWVwRGltcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBvcmlnQXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG4gICAgbGV0IGF4ZXMgPSBvcmlnQXhlcztcbiAgICBjb25zdCBwZXJtdXRlZEF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKGF4ZXMsIHhSYW5rKTtcbiAgICBsZXQgcGVybXV0ZWRYID0geDtcbiAgICBpZiAocGVybXV0ZWRBeGVzICE9IG51bGwpIHtcbiAgICAgICAgcGVybXV0ZWRYID0gdHJhbnNwb3NlKHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCwgYXR0cnM6IHsgcGVybTogcGVybXV0ZWRBeGVzIH0gfSk7XG4gICAgICAgIGF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0SW5uZXJNb3N0QXhlcyhheGVzLmxlbmd0aCwgeFJhbmspO1xuICAgIH1cbiAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoJ2FsbCcsIGF4ZXMsIHhSYW5rKTtcbiAgICBjb25zdCBbb3V0U2hhcGUsIHJlZHVjZVNoYXBlXSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKHBlcm11dGVkWC5zaGFwZSwgYXhlcyk7XG4gICAgY29uc3QgaW5TaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcbiAgICBjb25zdCBhMkQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHBlcm11dGVkWCB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogWy0xLCBpblNpemVdIH0gfSk7XG4gICAgY29uc3QgcmVkdWNlZCA9IHJlZHVjZShhMkQsIGEyRC5kdHlwZSwgJ2FsbCcsIGJhY2tlbmQpO1xuICAgIGxldCByZXM7XG4gICAgaWYgKGtlZXBEaW1zKSB7XG4gICAgICAgIGNvbnN0IG5ld1NoYXBlID0gYmFja2VuZF91dGlsLmV4cGFuZFNoYXBlVG9LZWVwRGltKG91dFNoYXBlLCBvcmlnQXhlcyk7XG4gICAgICAgIHJlcyA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogcmVkdWNlZCB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogbmV3U2hhcGUgfSB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlcyA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogcmVkdWNlZCB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogb3V0U2hhcGUgfSB9KTtcbiAgICB9XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhhMkQpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVkdWNlZCk7XG4gICAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocGVybXV0ZWRYKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydCBjb25zdCBhbGxDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQWxsLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGFsbFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFsbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBbnksIGJhY2tlbmRfdXRpbCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyByZWR1Y2UgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvcmVkdWNlJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHsgdHJhbnNwb3NlIH0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuZXhwb3J0IGZ1bmN0aW9uIGFueShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYXhpcywga2VlcERpbXMgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3Qgb3JpZ0F4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpO1xuICAgIGxldCBheGVzID0gb3JpZ0F4ZXM7XG4gICAgY29uc3QgcGVybXV0ZWRBeGVzID0gYmFja2VuZF91dGlsLmdldEF4ZXNQZXJtdXRhdGlvbihheGVzLCB4UmFuayk7XG4gICAgbGV0IHBlcm11dGVkWCA9IHg7XG4gICAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgICAgIHBlcm11dGVkWCA9IHRyYW5zcG9zZSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHBlcm06IHBlcm11dGVkQXhlcyB9IH0pO1xuICAgICAgICBheGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoYXhlcy5sZW5ndGgsIHhSYW5rKTtcbiAgICB9XG4gICAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdhbnknLCBheGVzLCB4UmFuayk7XG4gICAgY29uc3QgW291dFNoYXBlLCByZWR1Y2VTaGFwZV0gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcyhwZXJtdXRlZFguc2hhcGUsIGF4ZXMpO1xuICAgIGNvbnN0IGluU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShyZWR1Y2VTaGFwZSk7XG4gICAgY29uc3QgYTJEID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiBwZXJtdXRlZFggfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IFstMSwgaW5TaXplXSB9IH0pO1xuICAgIGNvbnN0IHJlZHVjZWQgPSByZWR1Y2UoYTJELCBhMkQuZHR5cGUsICdhbnknLCBiYWNrZW5kKTtcbiAgICBsZXQgcmVzO1xuICAgIGlmIChrZWVwRGltcykge1xuICAgICAgICBjb25zdCBuZXdTaGFwZSA9IGJhY2tlbmRfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbShvdXRTaGFwZSwgb3JpZ0F4ZXMpO1xuICAgICAgICByZXMgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHJlZHVjZWQgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IG5ld1NoYXBlIH0gfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXMgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHJlZHVjZWQgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IG91dFNoYXBlIH0gfSk7XG4gICAgfVxuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oYTJEKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlZHVjZWQpO1xuICAgIGlmIChwZXJtdXRlZEF4ZXMgIT0gbnVsbCkge1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHBlcm11dGVkWCk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5leHBvcnQgY29uc3QgYW55Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEFueSxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBhbnlcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BbnkuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQXJnTWF4LCBiYWNrZW5kX3V0aWwsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXJnTWluTWF4UmVkdWNlIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2FyZ19taW5fbWF4JztcbmltcG9ydCB7IHRyYW5zcG9zZSB9IGZyb20gJy4vVHJhbnNwb3NlJztcbmV4cG9ydCBmdW5jdGlvbiBhcmdNYXgoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGF4aXMgfSA9IGF0dHJzO1xuICAgIGxldCBheGVzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShheGlzLCB4LnNoYXBlKTtcbiAgICBjb25zdCBwZXJtdXRlZEF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKGF4ZXMsIHguc2hhcGUubGVuZ3RoKTtcbiAgICBsZXQgJHggPSB4O1xuICAgIGNvbnN0IGludGVybWVkaWF0ZVRlbnNvckluZm9zID0gW107XG4gICAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgICAgICR4ID0gdHJhbnNwb3NlKHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCwgYXR0cnM6IHsgcGVybTogcGVybXV0ZWRBeGVzIH0gfSk7XG4gICAgICAgIGludGVybWVkaWF0ZVRlbnNvckluZm9zLnB1c2goJHgpO1xuICAgICAgICBheGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoYXhlcy5sZW5ndGgsICR4LnNoYXBlLmxlbmd0aCk7XG4gICAgfVxuICAgIGJhY2tlbmRfdXRpbC5hc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcygnYXJnTWF4JywgW2F4ZXNbMF1dLCAkeC5zaGFwZS5sZW5ndGgpO1xuICAgIGNvbnN0IG91dCA9IGFyZ01pbk1heFJlZHVjZShiYWNrZW5kLCAkeCwgYXhlc1swXSwgJ21heCcpO1xuICAgIGludGVybWVkaWF0ZVRlbnNvckluZm9zLmZvckVhY2godCA9PiBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHQpKTtcbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IGFyZ01heENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBBcmdNYXgsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogYXJnTWF4XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXJnTWF4LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEFyZ01pbiwgYmFja2VuZF91dGlsLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFyZ01pbk1heFJlZHVjZSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9hcmdfbWluX21heCc7XG5pbXBvcnQgeyB0cmFuc3Bvc2UgfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5leHBvcnQgZnVuY3Rpb24gYXJnTWluKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBheGlzIH0gPSBhdHRycztcbiAgICBsZXQgYXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG4gICAgY29uc3QgcGVybXV0ZWRBeGVzID0gYmFja2VuZF91dGlsLmdldEF4ZXNQZXJtdXRhdGlvbihheGVzLCB4LnNoYXBlLmxlbmd0aCk7XG4gICAgbGV0ICR4ID0geDtcbiAgICBjb25zdCBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcyA9IFtdO1xuICAgIGlmIChwZXJtdXRlZEF4ZXMgIT0gbnVsbCkge1xuICAgICAgICAkeCA9IHRyYW5zcG9zZSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHBlcm06IHBlcm11dGVkQXhlcyB9IH0pO1xuICAgICAgICBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcy5wdXNoKCR4KTtcbiAgICAgICAgYXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRJbm5lck1vc3RBeGVzKGF4ZXMubGVuZ3RoLCAkeC5zaGFwZS5sZW5ndGgpO1xuICAgIH1cbiAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoJ2FyZ01pbicsIFtheGVzWzBdXSwgJHguc2hhcGUubGVuZ3RoKTtcbiAgICBjb25zdCBvdXQgPSBhcmdNaW5NYXhSZWR1Y2UoYmFja2VuZCwgJHgsIGF4ZXNbMF0sICdtaW4nKTtcbiAgICBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcy5mb3JFYWNoKHQgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0KSk7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBhcmdNaW5Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQXJnTWluLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGFyZ01pblxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFyZ01pbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBc2luIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHsgQ0hFQ0tfTkFOX1NOSVBQRVQgfSBmcm9tICcuLi91bmFyeW9wX2dwdSc7XG5jb25zdCBBU0lOID0gQ0hFQ0tfTkFOX1NOSVBQRVQgKyBgXG4gIGlmIChhYnMoeCkgPiAxLikge1xuICAgIHJldHVybiBOQU47XG4gIH1cbiAgcmV0dXJuIGFzaW4oeCk7XG5gO1xuZXhwb3J0IGNvbnN0IGFzaW4gPSB1bmFyeUtlcm5lbEZ1bmMoeyBvcFNuaXBwZXQ6IEFTSU4gfSk7XG5leHBvcnQgY29uc3QgYXNpbkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBBc2luLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGFzaW4sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXNpbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBc2luaCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7IENIRUNLX05BTl9TTklQUEVUIH0gZnJvbSAnLi4vdW5hcnlvcF9ncHUnO1xuY29uc3QgQVNJTkggPSBDSEVDS19OQU5fU05JUFBFVCArIGByZXR1cm4gbG9nKHggKyBzcXJ0KHggKiB4ICsgMS4wKSk7YDtcbmV4cG9ydCBjb25zdCBhc2luaCA9IHVuYXJ5S2VybmVsRnVuYyh7IG9wU25pcHBldDogQVNJTkggfSk7XG5leHBvcnQgY29uc3QgYXNpbmhDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQXNpbmgsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogYXNpbmgsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXNpbmguanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQXRhbiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7IENIRUNLX05BTl9TTklQUEVUIH0gZnJvbSAnLi4vdW5hcnlvcF9ncHUnO1xuY29uc3QgQVRBTiA9IENIRUNLX05BTl9TTklQUEVUICsgYFxuICByZXR1cm4gYXRhbih4KTtcbmA7XG5leHBvcnQgY29uc3QgYXRhbiA9IHVuYXJ5S2VybmVsRnVuYyh7IG9wU25pcHBldDogQVRBTiB9KTtcbmV4cG9ydCBjb25zdCBhdGFuQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEF0YW4sXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogYXRhbixcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BdGFuLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEF0YW4yIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMsIENIRUNLX05BTl9TTklQUEVUX0JJTkFSWSwgQ0hFQ0tfTkFOX1NOSVBQRVRfQklOQVJZX1BBQ0tFRCB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuY29uc3QgQVRBTjIgPSBDSEVDS19OQU5fU05JUFBFVF9CSU5BUlkgKyBgXG4gIHJldHVybiBhdGFuKGEsIGIpO1xuYDtcbmNvbnN0IEFUQU4yX1BBQ0tFRCA9IGBcbiAgdmVjNCByZXN1bHQgPSBhdGFuKGEsIGIpO1xuICB2ZWM0IGlzTmFOID0gbWluKHZlYzQoaXNuYW4oYSkpICsgdmVjNChpc25hbihiKSksIHZlYzQoMS4wKSk7XG4gIGAgK1xuICAgIENIRUNLX05BTl9TTklQUEVUX0JJTkFSWV9QQUNLRUQgKyBgXG4gIHJldHVybiByZXN1bHQ7XG5gO1xuZXhwb3J0IGNvbnN0IGF0YW4yID0gYmluYXJ5S2VybmVsRnVuYyh7IG9wU25pcHBldDogQVRBTjIsIHBhY2tlZE9wU25pcHBldDogQVRBTjJfUEFDS0VEIH0pO1xuZXhwb3J0IGNvbnN0IGF0YW4yQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEF0YW4yLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGF0YW4yLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUF0YW4yLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEF0YW5oIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHsgQ0hFQ0tfTkFOX1NOSVBQRVQgfSBmcm9tICcuLi91bmFyeW9wX2dwdSc7XG5jb25zdCBBVEFOSCA9IENIRUNLX05BTl9TTklQUEVUICsgYFxuICBpZiAoKHggPCAtMS4wKSB8fCAoeCA+IDEuMCkpIHJldHVybiBOQU47XG5yZXR1cm4gKGxvZygxLjAgKyB4KSAtIGxvZygxLjAgLSB4KSkgLyAyLjA7YDtcbmV4cG9ydCBjb25zdCBhdGFuaCA9IHVuYXJ5S2VybmVsRnVuYyh7IG9wU25pcHBldDogQVRBTkggfSk7XG5leHBvcnQgY29uc3QgYXRhbmhDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQXRhbmgsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogYXRhbmgsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXRhbmguanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQXZnUG9vbCwgYmFja2VuZF91dGlsLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IFBvb2wyRFByb2dyYW0gfSBmcm9tICcuLi9wb29sX2dwdSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vd2ViZ2xfdXRpbCc7XG5pbXBvcnQgeyBpZGVudGl0eSB9IGZyb20gJy4vSWRlbnRpdHknO1xuZXhwb3J0IGZ1bmN0aW9uIGF2Z1Bvb2woYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBhc3NlcnROb3RDb21wbGV4KHgsICdhdmdQb29sJyk7XG4gICAgY29uc3QgeyBmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSB9ID0gYXR0cnM7XG4gICAgY29uc3QgZGlsYXRpb25zID0gMTtcbiAgICB1dGlsLmFzc2VydChiYWNrZW5kX3V0aWwuZWl0aGVyU3RyaWRlc09yRGlsYXRpb25zQXJlT25lKHN0cmlkZXMsIGRpbGF0aW9ucyksICgpID0+ICdFcnJvciBpbiBhdmdQb29sOiBFaXRoZXIgc3RyaWRlcyBvciBkaWxhdGlvbnMgbXVzdCBiZSAxLiAnICtcbiAgICAgICAgYEdvdCBzdHJpZGVzICR7c3RyaWRlc30gYW5kIGRpbGF0aW9ucyAnJHtkaWxhdGlvbnN9J2ApO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVQb29sMkRJbmZvKHguc2hhcGUsIGZpbHRlclNpemUsIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpO1xuICAgIGlmIChjb252SW5mby5maWx0ZXJXaWR0aCA9PT0gMSAmJiBjb252SW5mby5maWx0ZXJIZWlnaHQgPT09IDEgJiZcbiAgICAgICAgdXRpbC5hcnJheXNFcXVhbChjb252SW5mby5pblNoYXBlLCBjb252SW5mby5vdXRTaGFwZSkpIHtcbiAgICAgICAgcmV0dXJuIGlkZW50aXR5KHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCB9KTtcbiAgICB9XG4gICAgY29uc3QgYXZnUG9vbFByb2dyYW0gPSBuZXcgUG9vbDJEUHJvZ3JhbShjb252SW5mbywgJ2F2ZycsIGZhbHNlKTtcbiAgICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0oYXZnUG9vbFByb2dyYW0sIFt4XSwgJ2Zsb2F0MzInKTtcbn1cbmV4cG9ydCBjb25zdCBhdmdQb29sQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEF2Z1Bvb2wsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogYXZnUG9vbFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUF2Z1Bvb2wuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQXZnUG9vbDNELCBiYWNrZW5kX3V0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgUG9vbDNEUHJvZ3JhbSB9IGZyb20gJy4uL3Bvb2xfZ3B1JztcbmV4cG9ydCBmdW5jdGlvbiBhdmdQb29sM0QoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCBkYXRhRm9ybWF0IH0gPSBhdHRycztcbiAgICBjb25zdCBkaWxhdGlvbnMgPSBbMSwgMSwgMV07XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wzREluZm8oeC5zaGFwZSwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgZGF0YUZvcm1hdCk7XG4gICAgY29uc3QgYXZnUG9vbFByb2dyYW0gPSBuZXcgUG9vbDNEUHJvZ3JhbShjb252SW5mbywgJ2F2ZycsIGZhbHNlKTtcbiAgICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0oYXZnUG9vbFByb2dyYW0sIFt4XSwgJ2Zsb2F0MzInKTtcbn1cbmV4cG9ydCBjb25zdCBhdmdQb29sM0RDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQXZnUG9vbDNELFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGF2Z1Bvb2wzRFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUF2Z1Bvb2wzRC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBdmdQb29sM0RHcmFkLCBiYWNrZW5kX3V0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgQXZnUG9vbDNEQmFja3Byb3BQcm9ncmFtIH0gZnJvbSAnLi4vYXZnX3Bvb2xfYmFja3Byb3BfZ3B1JztcbmV4cG9ydCBmdW5jdGlvbiBhdmdQb29sM0RHcmFkKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBkeSwgaW5wdXQgfSA9IGlucHV0cztcbiAgICBjb25zdCB4ID0gaW5wdXQ7XG4gICAgY29uc3QgeyBmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSB9ID0gYXR0cnM7XG4gICAgY29uc3QgZGlsYXRpb25zID0gWzEsIDEsIDFdO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVQb29sM0RJbmZvKHguc2hhcGUsIGZpbHRlclNpemUsIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpO1xuICAgIGNvbnN0IGF2Z1Bvb2xCYWNrcHJvcFByb2dyYW0gPSBuZXcgQXZnUG9vbDNEQmFja3Byb3BQcm9ncmFtKGNvbnZJbmZvKTtcbiAgICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0oYXZnUG9vbEJhY2twcm9wUHJvZ3JhbSwgW2R5XSwgeC5kdHlwZSk7XG59XG5leHBvcnQgY29uc3QgYXZnUG9vbEdyYWQzRENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBBdmdQb29sM0RHcmFkLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGF2Z1Bvb2wzREdyYWRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BdmdQb29sM0RHcmFkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEF2Z1Bvb2xHcmFkLCBiYWNrZW5kX3V0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgQXZnUG9vbDJEQmFja3Byb3BQcm9ncmFtIH0gZnJvbSAnLi4vYXZnX3Bvb2xfYmFja3Byb3BfZ3B1JztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi93ZWJnbF91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBhdmdQb29sR3JhZChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgZHksIGlucHV0IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeCA9IGlucHV0O1xuICAgIGFzc2VydE5vdENvbXBsZXgoW2R5LCBpbnB1dF0sICdhdmdQb29sR3JhZCcpO1xuICAgIGNvbnN0IHsgZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkIH0gPSBhdHRycztcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlUG9vbDJESW5mbyh4LnNoYXBlLCBmaWx0ZXJTaXplLCBzdHJpZGVzLCAxIC8qIGRpbGF0aW9ucyAqLywgcGFkKTtcbiAgICBjb25zdCBhdmdQb29sQmFja3Byb3BQcm9ncmFtID0gbmV3IEF2Z1Bvb2wyREJhY2twcm9wUHJvZ3JhbShjb252SW5mbyk7XG4gICAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKGF2Z1Bvb2xCYWNrcHJvcFByb2dyYW0sIFtkeV0sIHguZHR5cGUpO1xufVxuZXhwb3J0IGNvbnN0IGF2Z1Bvb2xHcmFkQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEF2Z1Bvb2xHcmFkLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGF2Z1Bvb2xHcmFkXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXZnUG9vbEdyYWQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQmF0Y2hNYXRNdWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYmF0Y2hNYXRNdWxJbXBsIH0gZnJvbSAnLi9CYXRjaE1hdE11bF9pbXBsJztcbmV4cG9ydCBmdW5jdGlvbiBiYXRjaE1hdE11bChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgYSwgYiB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgdHJhbnNwb3NlQSwgdHJhbnNwb3NlQiB9ID0gYXR0cnM7XG4gICAgcmV0dXJuIGJhdGNoTWF0TXVsSW1wbCh7IGEsIGIsIHRyYW5zcG9zZUEsIHRyYW5zcG9zZUIsIGJhY2tlbmQgfSk7XG59XG5leHBvcnQgY29uc3QgYmF0Y2hNYXRNdWxDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQmF0Y2hNYXRNdWwsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogYmF0Y2hNYXRNdWwsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QmF0Y2hNYXRNdWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgdXBjYXN0VHlwZSwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBtYXBBY3RpdmF0aW9uVG9TaGFkZXJQcm9ncmFtIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQgeyBNYXRNdWxQYWNrZWRQcm9ncmFtIH0gZnJvbSAnLi4vbXVsbWF0X3BhY2tlZF9ncHUnO1xuaW1wb3J0IHsgbXVsdGlwbHkgfSBmcm9tICcuL011bHRpcGx5JztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHsgc3VtIH0gZnJvbSAnLi9TdW0nO1xuaW1wb3J0IHsgdHJhbnNwb3NlIH0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuLy8gRW1waXJpY2FsbHkgZGV0ZXJtaW5lZCBtaW5pbWFsIHNoYXJlZCBkaW1lbnNpb24gaW4gbWF0bXVsIGJlZm9yZSB3ZSBmb3J3YXJkXG4vLyB0byBhLm11bChiKS5zdW0oKSBpbiBvcmRlciB0byB0YWtlIGFkdmFudGFnZSBvZiBHUFUgcGFyYWxsZWxpc20uIFNlZVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGZqcy1jb3JlL3B1bGwvMTM3OSBmb3IgYmVuY2htYXJrcy5cbmV4cG9ydCBjb25zdCBNQVRNVUxfU0hBUkVEX0RJTV9USFJFU0hPTEQgPSAxMDAwO1xuZXhwb3J0IGZ1bmN0aW9uIGJhdGNoTWF0TXVsSW1wbCh7IGEsIGIsIHRyYW5zcG9zZUEsIHRyYW5zcG9zZUIsIGJhY2tlbmQsIGJpYXMgPSBudWxsLCBwcmVsdUFjdGl2YXRpb25XZWlnaHRzID0gbnVsbCwgbGVha3lyZWx1QWxwaGEgPSAwLCBhY3RpdmF0aW9uID0gbnVsbCB9KSB7XG4gICAgY29uc3QgYVJhbmsgPSBhLnNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBiUmFuayA9IGIuc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IGlubmVyU2hhcGVBID0gdHJhbnNwb3NlQSA/IGEuc2hhcGVbYVJhbmsgLSAyXSA6IGEuc2hhcGVbYVJhbmsgLSAxXTtcbiAgICBjb25zdCBpbm5lclNoYXBlQiA9IHRyYW5zcG9zZUIgPyBiLnNoYXBlW2JSYW5rIC0gMV0gOiBiLnNoYXBlW2JSYW5rIC0gMl07XG4gICAgY29uc3Qgb3V0ZXJTaGFwZUEgPSB0cmFuc3Bvc2VBID8gYS5zaGFwZVthUmFuayAtIDFdIDogYS5zaGFwZVthUmFuayAtIDJdO1xuICAgIGNvbnN0IG91dGVyU2hhcGVCID0gdHJhbnNwb3NlQiA/IGIuc2hhcGVbYlJhbmsgLSAyXSA6IGIuc2hhcGVbYlJhbmsgLSAxXTtcbiAgICBjb25zdCBvdXRlckRpbXNBID0gYS5zaGFwZS5zbGljZSgwLCAtMik7XG4gICAgY29uc3Qgb3V0ZXJEaW1zQiA9IGIuc2hhcGUuc2xpY2UoMCwgLTIpO1xuICAgIGNvbnN0IGJhdGNoRGltQSA9IHV0aWwuc2l6ZUZyb21TaGFwZShvdXRlckRpbXNBKTtcbiAgICBjb25zdCBiYXRjaERpbUIgPSB1dGlsLnNpemVGcm9tU2hhcGUob3V0ZXJEaW1zQik7XG4gICAgY29uc3QgYmF0Y2hEaW1zQ29tcGF0aWJsZSA9IGJhdGNoRGltQSA9PT0gYmF0Y2hEaW1CIHx8IGJhdGNoRGltQSA9PT0gMSB8fCBiYXRjaERpbUIgPT09IDE7XG4gICAgdXRpbC5hc3NlcnQoYVJhbmsgPj0gMiAmJiBiUmFuayA+PSAyICYmIGJhdGNoRGltc0NvbXBhdGlibGUsICgpID0+IGBFcnJvciBpbiBtYXRNdWw6IHRoZSBpbnB1dCBiYXRjaCBkaW1lbnNpb25zIG11c3QgZWl0aGVyIGJlIHRoZSBgICtcbiAgICAgICAgYHNhbWUgb3IgYXQgbGVhc3Qgb25lIGlucHV0IGJhdGNoIGRpbWVuc2lvbiBtdXN0IGJlIDEuIEdvdCBpbnB1dCBgICtcbiAgICAgICAgYGJhdGNoIGRpbWVuc2lvbnMgb2YgKCR7b3V0ZXJEaW1zQX0pIGFuZCAoJHtvdXRlckRpbXNCfSkuYCk7XG4gICAgY29uc3Qgb3V0U2hhcGVPdXRlckRpbXMgPSBiYXRjaERpbUEgPiBiYXRjaERpbUIgPyBhLnNoYXBlLnNsaWNlKDAsIC0yKSA6IGIuc2hhcGUuc2xpY2UoMCwgLTIpO1xuICAgIGNvbnN0IG91dFNoYXBlID0gb3V0U2hhcGVPdXRlckRpbXMuY29uY2F0KFtvdXRlclNoYXBlQSwgb3V0ZXJTaGFwZUJdKTtcbiAgICB1dGlsLmFzc2VydChpbm5lclNoYXBlQSA9PT0gaW5uZXJTaGFwZUIsICgpID0+IGBFcnJvciBpbiBtYXRNdWw6IGlubmVyIHNoYXBlcyAoJHtpbm5lclNoYXBlQX0pIGFuZCAoYCArXG4gICAgICAgIGAke2lubmVyU2hhcGVCfSkgb2YgVGVuc29ycyB3aXRoIHNoYXBlcyAke2Euc2hhcGV9IGFuZCBgICtcbiAgICAgICAgYCR7Yi5zaGFwZX0gYW5kIHRyYW5zcG9zZUE9JHt0cmFuc3Bvc2VBfWAgK1xuICAgICAgICBgIGFuZCB0cmFuc3Bvc2VCPSR7dHJhbnNwb3NlQn0gbXVzdCBtYXRjaC5gKTtcbiAgICBjb25zdCBhM2RTaGFwZSA9IHRyYW5zcG9zZUEgP1xuICAgICAgICBbYmF0Y2hEaW1BLCBpbm5lclNoYXBlQSwgb3V0ZXJTaGFwZUFdIDpcbiAgICAgICAgW2JhdGNoRGltQSwgb3V0ZXJTaGFwZUEsIGlubmVyU2hhcGVBXTtcbiAgICBjb25zdCBiM2RTaGFwZSA9IHRyYW5zcG9zZUIgP1xuICAgICAgICBbYmF0Y2hEaW1CLCBvdXRlclNoYXBlQiwgaW5uZXJTaGFwZUJdIDpcbiAgICAgICAgW2JhdGNoRGltQiwgaW5uZXJTaGFwZUIsIG91dGVyU2hhcGVCXTtcbiAgICAvLyBUaGUgcmVzdCBvZiB0aGUgaW1wbGVtZW50YXRpb24gaXMgZGVzaWduZWQgdG8gb3BlcmF0ZSBvbiByYW5rLTMgdGVuc29yc1xuICAgIGNvbnN0IGEzZCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogYSB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogYTNkU2hhcGUgfSB9KTtcbiAgICBjb25zdCBiM2QgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IGIgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IGIzZFNoYXBlIH0gfSk7XG4gICAgY29uc3QgaW50ZXJtZWRpYXRlcyA9IFthM2QsIGIzZF07XG4gICAgY29uc3QgYmF0Y2hEaW0gPSBNYXRoLm1heChiYXRjaERpbUEsIGJhdGNoRGltQik7XG4gICAgY29uc3Qgc2hhcmVkRGltID0gdHJhbnNwb3NlQSA/IGEzZC5zaGFwZVsxXSA6IGEzZC5zaGFwZVsyXTtcbiAgICBjb25zdCBoYXNCaWFzID0gYmlhcyAhPSBudWxsO1xuICAgIGNvbnN0IGhhc1ByZWx1QWN0aXZhdGlvbldlaWdodHMgPSBwcmVsdUFjdGl2YXRpb25XZWlnaHRzICE9IG51bGw7XG4gICAgY29uc3QgaGFzTGVha3lyZWx1QWxwaGEgPSBhY3RpdmF0aW9uID09PSAnbGVha3lyZWx1JztcbiAgICBjb25zdCBmdXNlZEFjdGl2YXRpb24gPSBhY3RpdmF0aW9uICE9IG51bGwgP1xuICAgICAgICBtYXBBY3RpdmF0aW9uVG9TaGFkZXJQcm9ncmFtKGFjdGl2YXRpb24sIHRydWUpIDpcbiAgICAgICAgbnVsbDtcbiAgICBjb25zdCBjb250YWluc0Z1c2VkT3BzID0gaGFzQmlhcyB8fCBoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzIHx8XG4gICAgICAgIGhhc0xlYWt5cmVsdUFscGhhIHx8IGZ1c2VkQWN0aXZhdGlvbiAhPSBudWxsO1xuICAgIGxldCBvdXQ7XG4gICAgLy8gU2luY2UgdGhlIG1hdHJpY2VzIGFyZSB2ZWN0b3JzLCBpdCBpcyBmYXN0ZXIgdG8gY2FsbCBtdWwoKS5zdW0oKVxuICAgIC8vIGJlY2F1c2Ugc3VtKCkgaXMgTyhzcXJ0KE4pKSBkdWUgdG8gZGl2aWRlLWFuZC1jb25xdWVyLlxuICAgIGlmICgob3V0ZXJTaGFwZUEgPT09IDEgfHwgb3V0ZXJTaGFwZUIgPT09IDEpICYmXG4gICAgICAgIHNoYXJlZERpbSA+IE1BVE1VTF9TSEFSRURfRElNX1RIUkVTSE9MRCAmJiBjb250YWluc0Z1c2VkT3BzID09PSBmYWxzZSkge1xuICAgICAgICBsZXQgYVZlYyA9IGEzZDtcbiAgICAgICAgbGV0IGJWZWMgPSBiM2Q7XG4gICAgICAgIGlmICh0cmFuc3Bvc2VBKSB7XG4gICAgICAgICAgICBhVmVjID0gdHJhbnNwb3NlKHsgaW5wdXRzOiB7IHg6IGEzZCB9LCBiYWNrZW5kLCBhdHRyczogeyBwZXJtOiBbMCwgMiwgMV0gfSB9KTtcbiAgICAgICAgICAgIGludGVybWVkaWF0ZXMucHVzaChhVmVjKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhbnNwb3NlQikge1xuICAgICAgICAgICAgYlZlYyA9IHRyYW5zcG9zZSh7IGlucHV0czogeyB4OiBiM2QgfSwgYmFja2VuZCwgYXR0cnM6IHsgcGVybTogWzAsIDIsIDFdIH0gfSk7XG4gICAgICAgICAgICBpbnRlcm1lZGlhdGVzLnB1c2goYlZlYyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2hvdWxkUmVzaGFwZUEgPSBvdXRlclNoYXBlQiAhPT0gMTtcbiAgICAgICAgY29uc3Qgc2hvdWxkUmVzaGFwZUIgPSBvdXRlclNoYXBlQiA9PT0gMTtcbiAgICAgICAgbGV0IGFWZWMzZCA9IGFWZWM7XG4gICAgICAgIGlmIChzaG91bGRSZXNoYXBlQSkge1xuICAgICAgICAgICAgYVZlYzNkID0gcmVzaGFwZSh7XG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7IHg6IGFWZWMgfSxcbiAgICAgICAgICAgICAgICBiYWNrZW5kLFxuICAgICAgICAgICAgICAgIGF0dHJzOiB7IHNoYXBlOiBbYmF0Y2hEaW0sIHNoYXJlZERpbSwgMV0gfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpbnRlcm1lZGlhdGVzLnB1c2goYVZlYzNkKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBheGlzID0gb3V0ZXJTaGFwZUIgPT09IDEgPyAyIDogMTtcbiAgICAgICAgbGV0IGJWZWMzZCA9IGJWZWM7XG4gICAgICAgIGlmIChzaG91bGRSZXNoYXBlQikge1xuICAgICAgICAgICAgYlZlYzNkID0gcmVzaGFwZSh7XG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7IHg6IGJWZWMgfSxcbiAgICAgICAgICAgICAgICBiYWNrZW5kLFxuICAgICAgICAgICAgICAgIGF0dHJzOiB7IHNoYXBlOiBbYmF0Y2hEaW0sIDEsIHNoYXJlZERpbV0gfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpbnRlcm1lZGlhdGVzLnB1c2goYlZlYzNkKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9kdWN0ID0gbXVsdGlwbHkoeyBpbnB1dHM6IHsgYTogYVZlYzNkLCBiOiBiVmVjM2QgfSwgYmFja2VuZCB9KTtcbiAgICAgICAgb3V0ID0gc3VtKHsgaW5wdXRzOiB7IHg6IHByb2R1Y3QgfSwgYmFja2VuZCwgYXR0cnM6IHsgYXhpcywga2VlcERpbXM6IHRydWUgfSB9KTtcbiAgICAgICAgaW50ZXJtZWRpYXRlcy5wdXNoKHByb2R1Y3QpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgZHR5cGUgPSB1cGNhc3RUeXBlKGEuZHR5cGUsIGIuZHR5cGUpO1xuICAgICAgICBjb25zdCBwcm9ncmFtID0gbmV3IE1hdE11bFBhY2tlZFByb2dyYW0oYTNkU2hhcGUsIGIzZFNoYXBlLCBbYmF0Y2hEaW0sIG91dGVyU2hhcGVBLCBvdXRlclNoYXBlQl0sIHRyYW5zcG9zZUEsIHRyYW5zcG9zZUIsIGhhc0JpYXMsIGZ1c2VkQWN0aXZhdGlvbiwgaGFzUHJlbHVBY3RpdmF0aW9uV2VpZ2h0cywgaGFzTGVha3lyZWx1QWxwaGEpO1xuICAgICAgICBjb25zdCBpbnB1dHMgPSBbYTNkLCBiM2RdO1xuICAgICAgICBpZiAoYmlhcyAhPSBudWxsKSB7XG4gICAgICAgICAgICBpbnB1dHMucHVzaChiaWFzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzUHJlbHVBY3RpdmF0aW9uV2VpZ2h0cykge1xuICAgICAgICAgICAgaW5wdXRzLnB1c2gocHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc0xlYWt5cmVsdUFscGhhKSB7XG4gICAgICAgICAgICBjb25zdCAkbGVha3lyZWx1QWxwaGEgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtdLCAnZmxvYXQzMicsIHV0aWwuY3JlYXRlU2NhbGFyVmFsdWUobGVha3lyZWx1QWxwaGEsICdmbG9hdDMyJykpO1xuICAgICAgICAgICAgaW5wdXRzLnB1c2goJGxlYWt5cmVsdUFscGhhKTtcbiAgICAgICAgICAgIGludGVybWVkaWF0ZXMucHVzaCgkbGVha3lyZWx1QWxwaGEpO1xuICAgICAgICB9XG4gICAgICAgIG91dCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIGlucHV0cywgZHR5cGUpO1xuICAgIH1cbiAgICBjb25zdCBvdXRSZXNoYXBlZCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogb3V0IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBvdXRTaGFwZSB9IH0pO1xuICAgIGludGVybWVkaWF0ZXMucHVzaChvdXQpO1xuICAgIGZvciAoY29uc3QgaSBvZiBpbnRlcm1lZGlhdGVzKSB7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaSk7XG4gICAgfVxuICAgIHJldHVybiBvdXRSZXNoYXBlZDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJhdGNoTWF0TXVsX2ltcGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZW52LCBGdXNlZEJhdGNoTm9ybSwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBCYXRjaE5vcm1Qcm9ncmFtIH0gZnJvbSAnLi4vYmF0Y2hub3JtX2dwdSc7XG5pbXBvcnQgeyBCYXRjaE5vcm1QYWNrZWRQcm9ncmFtIH0gZnJvbSAnLi4vYmF0Y2hub3JtX3BhY2tlZF9ncHUnO1xuZXhwb3J0IGNvbnN0IGJhdGNoTm9ybSA9ICh7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSkgPT4ge1xuICAgIGNvbnN0IHsgeCwgbWVhbiwgdmFyaWFuY2UsIG9mZnNldCwgc2NhbGUgfSA9IGlucHV0cztcbiAgICB1dGlsLmFzc2VydChtZWFuLnNoYXBlLmxlbmd0aCA9PT0gdmFyaWFuY2Uuc2hhcGUubGVuZ3RoLCAoKSA9PiAnQmF0Y2ggbm9ybWFsaXphdGlvbiBncmFkaWVudCByZXF1aXJlcyBtZWFuIGFuZCB2YXJpYW5jZSB0byBoYXZlICcgK1xuICAgICAgICAnZXF1YWwgcmFua3MuJyk7XG4gICAgdXRpbC5hc3NlcnQob2Zmc2V0ID09IG51bGwgfHwgbWVhbi5zaGFwZS5sZW5ndGggPT09IG9mZnNldC5zaGFwZS5sZW5ndGgsICgpID0+ICdCYXRjaCBub3JtYWxpemF0aW9uIGdyYWRpZW50IHJlcXVpcmVzIG1lYW4gYW5kIG9mZnNldCB0byBoYXZlICcgK1xuICAgICAgICAnZXF1YWwgcmFua3MuJyk7XG4gICAgdXRpbC5hc3NlcnQoc2NhbGUgPT0gbnVsbCB8fCBtZWFuLnNoYXBlLmxlbmd0aCA9PT0gc2NhbGUuc2hhcGUubGVuZ3RoLCAoKSA9PiAnQmF0Y2ggbm9ybWFsaXphdGlvbiBncmFkaWVudCByZXF1aXJlcyBtZWFuIGFuZCBzY2FsZSB0byBoYXZlICcgK1xuICAgICAgICAnZXF1YWwgcmFua3MuJyk7XG4gICAgbGV0IHsgdmFyaWFuY2VFcHNpbG9uIH0gPSBhdHRycztcbiAgICBpZiAodmFyaWFuY2VFcHNpbG9uID09IG51bGwpIHtcbiAgICAgICAgdmFyaWFuY2VFcHNpbG9uID0gMC4wMDE7XG4gICAgfVxuICAgIGNvbnN0IGZpbmFsSW5wdXRzID0gW3gsIG1lYW4sIHZhcmlhbmNlXTtcbiAgICBsZXQgb2Zmc2V0U2hhcGUgPSBudWxsO1xuICAgIGlmIChvZmZzZXQgIT0gbnVsbCkge1xuICAgICAgICBvZmZzZXRTaGFwZSA9IG9mZnNldC5zaGFwZTtcbiAgICAgICAgZmluYWxJbnB1dHMucHVzaChvZmZzZXQpO1xuICAgIH1cbiAgICBsZXQgc2NhbGVTaGFwZSA9IG51bGw7XG4gICAgaWYgKHNjYWxlICE9IG51bGwpIHtcbiAgICAgICAgc2NhbGVTaGFwZSA9IHNjYWxlLnNoYXBlO1xuICAgICAgICBmaW5hbElucHV0cy5wdXNoKHNjYWxlKTtcbiAgICB9XG4gICAgY29uc3QgcHJvZ3JhbSA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfTk9STUFMSVpBVElPTicpID9cbiAgICAgICAgbmV3IEJhdGNoTm9ybVBhY2tlZFByb2dyYW0oeC5zaGFwZSwgbWVhbi5zaGFwZSwgdmFyaWFuY2Uuc2hhcGUsIG9mZnNldFNoYXBlLCBzY2FsZVNoYXBlLCB2YXJpYW5jZUVwc2lsb24pIDpcbiAgICAgICAgbmV3IEJhdGNoTm9ybVByb2dyYW0oeC5zaGFwZSwgbWVhbi5zaGFwZSwgdmFyaWFuY2Uuc2hhcGUsIG9mZnNldFNoYXBlLCBzY2FsZVNoYXBlLCB2YXJpYW5jZUVwc2lsb24pO1xuICAgIGNvbnN0IG91dHB1dCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIGZpbmFsSW5wdXRzLCBmaW5hbElucHV0c1swXS5kdHlwZSk7XG4gICAgcmV0dXJuIG91dHB1dDtcbn07XG5leHBvcnQgY29uc3QgYmF0Y2hOb3JtQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEZ1c2VkQmF0Y2hOb3JtLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGJhdGNoTm9ybSxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1CYXRjaE5vcm0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBCYXRjaFRvU3BhY2VORCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7IHNsaWNlIH0gZnJvbSAnLi9TbGljZSc7XG5pbXBvcnQgeyB0cmFuc3Bvc2UgfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5leHBvcnQgY29uc3QgYmF0Y2hUb1NwYWNlTkQgPSAoYXJncykgPT4ge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGJsb2NrU2hhcGUsIGNyb3BzIH0gPSBhdHRycztcbiAgICB1dGlsLmFzc2VydCh4LnNoYXBlLmxlbmd0aCA8PSA0LCAoKSA9PiAnYmF0Y2hUb1NwYWNlTkQgZm9yIHJhbmsgPiA0IHdpdGggYSBXZWJHTCBiYWNrZW5kIG5vdCAnICtcbiAgICAgICAgJ2ltcGxlbWVudGVkIHlldCcpO1xuICAgIGNvbnN0IHByb2QgPSBibG9ja1NoYXBlLnJlZHVjZSgoYSwgYikgPT4gYSAqIGIpO1xuICAgIGNvbnN0IHJlc2hhcGVkID0gYmFja2VuZF91dGlsLmdldFJlc2hhcGVkKHguc2hhcGUsIGJsb2NrU2hhcGUsIHByb2QpO1xuICAgIGNvbnN0IHBlcm11dGVkID0gYmFja2VuZF91dGlsLmdldFBlcm11dGVkKHJlc2hhcGVkLmxlbmd0aCwgYmxvY2tTaGFwZS5sZW5ndGgpO1xuICAgIGNvbnN0IHJlc2hhcGVkUGVybXV0ZWQgPSBiYWNrZW5kX3V0aWwuZ2V0UmVzaGFwZWRQZXJtdXRlZCh4LnNoYXBlLCBibG9ja1NoYXBlLCBwcm9kKTtcbiAgICBjb25zdCBzbGljZUJlZ2luQ29vcmRzID0gYmFja2VuZF91dGlsLmdldFNsaWNlQmVnaW5Db29yZHMoY3JvcHMsIGJsb2NrU2hhcGUubGVuZ3RoKTtcbiAgICBjb25zdCBzbGljZVNpemUgPSBiYWNrZW5kX3V0aWwuZ2V0U2xpY2VTaXplKHJlc2hhcGVkUGVybXV0ZWQsIGNyb3BzLCBibG9ja1NoYXBlLmxlbmd0aCk7XG4gICAgY29uc3QgdG9EaXNwb3NlID0gW107XG4gICAgY29uc3QgcmVzaGFwZWRJbnRlcm1lZGlhdGUgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IHJlc2hhcGVkIH0gfSk7XG4gICAgY29uc3QgdHJhbnNwb3NlZEludGVybWVkaWF0ZSA9IHRyYW5zcG9zZSh7IGlucHV0czogeyB4OiByZXNoYXBlZEludGVybWVkaWF0ZSB9LCBiYWNrZW5kLCBhdHRyczogeyBwZXJtOiBwZXJtdXRlZCB9IH0pO1xuICAgIGNvbnN0IHJlc2hhcGVkSW50ZXJtZWRpYXRlMiA9IHJlc2hhcGUoe1xuICAgICAgICBpbnB1dHM6IHsgeDogdHJhbnNwb3NlZEludGVybWVkaWF0ZSB9LFxuICAgICAgICBiYWNrZW5kLFxuICAgICAgICBhdHRyczogeyBzaGFwZTogcmVzaGFwZWRQZXJtdXRlZCB9XG4gICAgfSk7XG4gICAgY29uc3Qgc2xpY2VkID0gc2xpY2Uoe1xuICAgICAgICBpbnB1dHM6IHsgeDogcmVzaGFwZWRJbnRlcm1lZGlhdGUyIH0sXG4gICAgICAgIGJhY2tlbmQsXG4gICAgICAgIGF0dHJzOiB7IGJlZ2luOiBzbGljZUJlZ2luQ29vcmRzLCBzaXplOiBzbGljZVNpemUgfVxuICAgIH0pO1xuICAgIHRvRGlzcG9zZS5wdXNoKHJlc2hhcGVkSW50ZXJtZWRpYXRlKTtcbiAgICB0b0Rpc3Bvc2UucHVzaCh0cmFuc3Bvc2VkSW50ZXJtZWRpYXRlKTtcbiAgICB0b0Rpc3Bvc2UucHVzaChyZXNoYXBlZEludGVybWVkaWF0ZTIpO1xuICAgIHRvRGlzcG9zZS5mb3JFYWNoKHQgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0KSk7XG4gICAgcmV0dXJuIHNsaWNlZDtcbn07XG5leHBvcnQgY29uc3QgYmF0Y2hUb1NwYWNlTkRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQmF0Y2hUb1NwYWNlTkQsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogYmF0Y2hUb1NwYWNlTkRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1CYXRjaFRvU3BhY2VORC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBCaW5jb3VudCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBiaW5jb3VudEltcGxDUFUgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmV4cG9ydCBmdW5jdGlvbiBiaW5jb3VudChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCwgd2VpZ2h0cyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgc2l6ZSB9ID0gYXR0cnM7XG4gICAgY29uc3QgeFZhbHMgPSBiYWNrZW5kLnJlYWRTeW5jKHguZGF0YUlkKTtcbiAgICBjb25zdCB3ZWlnaHRzVmFscyA9IGJhY2tlbmQucmVhZFN5bmMod2VpZ2h0cy5kYXRhSWQpO1xuICAgIGNvbnN0IG91dFZhbHMgPSBiaW5jb3VudEltcGxDUFUoeFZhbHMsIHdlaWdodHNWYWxzLCB3ZWlnaHRzLmR0eXBlLCB3ZWlnaHRzLnNoYXBlLCBzaXplKTtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbc2l6ZV0sIHdlaWdodHMuZHR5cGUsIG91dFZhbHMpO1xufVxuZXhwb3J0IGNvbnN0IGJpbmNvdW50Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEJpbmNvdW50LFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGJpbmNvdW50XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QmluY291bnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IENhc3QsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY29tcGxleCB9IGZyb20gJy4vQ29tcGxleCc7XG5pbXBvcnQgeyBpZGVudGl0eSB9IGZyb20gJy4vSWRlbnRpdHknO1xuaW1wb3J0IHsgbm90RXF1YWwgfSBmcm9tICcuL05vdEVxdWFsJztcbmltcG9ydCB7IHJlYWwgfSBmcm9tICcuL1JlYWwnO1xuaW1wb3J0IHsgaW50IH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2ludCc7XG5leHBvcnQgZnVuY3Rpb24gY2FzdChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgZHR5cGUgfSA9IGF0dHJzO1xuICAgIC8vIENhc3RpbmcgdG8gY29tcGxleDY0LlxuICAgIGlmIChkdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgaWYgKHguZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICAgICAgICByZXR1cm4gaWRlbnRpdHkoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRPRE8oYW5ueGluZ3l1YW4pOiBJbXBvcnQga2VybmVsIGZ1bmN0aW9uIG9uY2UgemVyb3MgaXMgbW9kdWxhcml6ZWQuXG4gICAgICAgIGNvbnN0IHplcm9zVGVuc29yID0gdGYuemVyb3MoeC5zaGFwZSk7XG4gICAgICAgIGNvbnN0IGZsb2F0WCA9IGNhc3QoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kLCBhdHRyczogeyBkdHlwZTogJ2Zsb2F0MzInIH0gfSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBsZXgoeyBpbnB1dHM6IHsgcmVhbDogZmxvYXRYLCBpbWFnOiB6ZXJvc1RlbnNvciB9LCBiYWNrZW5kIH0pO1xuICAgICAgICB6ZXJvc1RlbnNvci5kaXNwb3NlKCk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oZmxvYXRYKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLy8gQ2FzdGluZyBmcm9tIGNvbXBsZXg2NFxuICAgIGlmICh4LmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICBjb25zdCByZWFsUGFydCA9IHJlYWwoeyBpbnB1dHM6IHsgaW5wdXQ6IHggfSwgYmFja2VuZCB9KTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY2FzdCh7IGlucHV0czogeyB4OiByZWFsUGFydCB9LCBiYWNrZW5kLCBhdHRyczogeyBkdHlwZSB9IH0pO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlYWxQYXJ0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgaWYgKCF1dGlsLmhhc0VuY29kaW5nTG9zcyh4LmR0eXBlLCBkdHlwZSkpIHtcbiAgICAgICAgLy8gV2UgZG9uJ3QgY2hhbmdlIHRoZSB1bmRlcmx5aW5nIGRhdGEsIHNpbmNlIHdlIGNhc3QgdG8gaGlnaGVyXG4gICAgICAgIC8vIHByZWNpc2lvbi5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gaWRlbnRpdHkoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kIH0pO1xuICAgICAgICByZXR1cm4geyBkYXRhSWQ6IHJlc3VsdC5kYXRhSWQsIHNoYXBlOiByZXN1bHQuc2hhcGUsIGR0eXBlIH07XG4gICAgfVxuICAgIGlmIChkdHlwZSA9PT0gJ2ludDMyJykge1xuICAgICAgICByZXR1cm4gaW50KHgsIGJhY2tlbmQpO1xuICAgIH1cbiAgICBpZiAoZHR5cGUgPT09ICdib29sJykge1xuICAgICAgICBjb25zdCB6ZXJvc1RlbnNvckluZm8gPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtdLCAnYm9vbCcsIHV0aWwuZ2V0VHlwZWRBcnJheUZyb21EVHlwZSgnYm9vbCcsIDEpKTtcbiAgICAgICAgY29uc3QgYmluYXJ5SW5wdXRzID0geyBhOiB4LCBiOiB6ZXJvc1RlbnNvckluZm8gfTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbm90RXF1YWwoeyBpbnB1dHM6IGJpbmFyeUlucHV0cywgYmFja2VuZCB9KTtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh6ZXJvc1RlbnNvckluZm8pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIENhc3Q6IGZhaWxlZCB0byBjYXN0ICR7eC5kdHlwZX0gdG8gJHtkdHlwZX1gKTtcbn1cbmV4cG9ydCBjb25zdCBjYXN0Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IENhc3QsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogY2FzdFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNhc3QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQ2VpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7IGNlaWxJbXBsQ1BVIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5jb25zdCBDRUlMID0gYHJldHVybiBjZWlsKHgpO2A7XG5leHBvcnQgY29uc3QgY2VpbCA9IHVuYXJ5S2VybmVsRnVuYyh7IG9wU25pcHBldDogQ0VJTCwgcGFja2VkT3BTbmlwcGV0OiBDRUlMLCBjcHVLZXJuZWxJbXBsOiBjZWlsSW1wbENQVSB9KTtcbmV4cG9ydCBjb25zdCBjZWlsQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IENlaWwsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogY2VpbFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNlaWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQ2xpcEJ5VmFsdWUsIGVudiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBDbGlwUHJvZ3JhbSB9IGZyb20gJy4uL2NsaXBfZ3B1JztcbmltcG9ydCB7IENsaXBQYWNrZWRQcm9ncmFtIH0gZnJvbSAnLi4vY2xpcF9wYWNrZWRfZ3B1JztcbmV4cG9ydCBmdW5jdGlvbiBjbGlwQnlWYWx1ZShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgY2xpcFZhbHVlTWluLCBjbGlwVmFsdWVNYXggfSA9IGF0dHJzO1xuICAgIGxldCBwcm9ncmFtO1xuICAgIGlmIChlbnYoKS5nZXRCb29sKCdXRUJHTF9QQUNLX0NMSVAnKSkge1xuICAgICAgICBwcm9ncmFtID0gbmV3IENsaXBQYWNrZWRQcm9ncmFtKHguc2hhcGUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcHJvZ3JhbSA9IG5ldyBDbGlwUHJvZ3JhbSh4LnNoYXBlKTtcbiAgICB9XG4gICAgY29uc3QgY3VzdG9tVmFsdWVzID0gW1tjbGlwVmFsdWVNaW5dLCBbY2xpcFZhbHVlTWF4XV07XG4gICAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4XSwgeC5kdHlwZSwgY3VzdG9tVmFsdWVzKTtcbn1cbmV4cG9ydCBjb25zdCBjbGlwQnlWYWx1ZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBDbGlwQnlWYWx1ZSxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBjbGlwQnlWYWx1ZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNsaXBCeVZhbHVlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IENvbXBsZXggfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgaWRlbnRpdHkgfSBmcm9tICcuL0lkZW50aXR5Jztcbi8qKlxuICogSW4gV2ViR0wgZGF0YSBpcyBzdG9yZWQgaW4gR1BVIHRleHR1cmVzIHdoaWNoIGNhbid0IGJlIGVmZmljaWVudGx5IGNvcGllZCwgc29cbiAqIGNvbXBsZXggdGVuc29ycyBzaGFyZSBkYXRhIHdpdGggdGhlaXIgcmVhbCBhbmQgaW1hZ2luYXJ5IGNvbXBvbmVudHMuIENvbXBsZXhcbiAqIHRlbnNvcnMnIHJlZmVyZW5jZSB0byB0aGUgY29tcG9uZW50cyBpcyB0cmFja2VkIGJ5IHJlZkNvdW50IG9uIHRoZSBpbmRpdmlkdWFsXG4gKiBjb21wb25lbnQuIFRoZSByZWZDb3VudHMgYXJlIGluY3JlYXNlZCBieSB0aGUgaWRlbnRpdHkgY2FsbC5cbiAqXG4gKiBXaGVuIGEgY29tcGxleCB0ZW5zb3IgaXMgZGlzcG9zZWQsIGl0IHdpbGwgcmVkdWNlIHRoZSByZWZDb3VudCBvbiB0aGVcbiAqIGNvbXBvbmVudHMgYnkgY2FsbGluZyBkaXNwb3NlRGF0YSBvbiBlYWNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcGxleChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyByZWFsLCBpbWFnIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgY29tcGxleEluZm8gPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHJlYWwuc2hhcGUsICdjb21wbGV4NjQnKTtcbiAgICBjb25zdCBjb21wbGV4ID0gYmFja2VuZC50ZXhEYXRhLmdldChjb21wbGV4SW5mby5kYXRhSWQpO1xuICAgIGNvbnN0IHJlYWxUZW5zb3JJbmZvID0gaWRlbnRpdHkoeyBpbnB1dHM6IHsgeDogcmVhbCB9LCBiYWNrZW5kIH0pO1xuICAgIGNvbnN0IGltYWdUZW5zb3JJbmZvID0gaWRlbnRpdHkoeyBpbnB1dHM6IHsgeDogaW1hZyB9LCBiYWNrZW5kIH0pO1xuICAgIGNvbXBsZXguY29tcGxleFRlbnNvckluZm9zID0geyByZWFsOiByZWFsVGVuc29ySW5mbywgaW1hZzogaW1hZ1RlbnNvckluZm8gfTtcbiAgICByZXR1cm4gY29tcGxleEluZm87XG59XG5leHBvcnQgY29uc3QgY29tcGxleENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBDb21wbGV4LFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGNvbXBsZXhcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db21wbGV4LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IENvbXBsZXhBYnMgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgQ29tcGxleEFic1Byb2dyYW0gfSBmcm9tICcuLi9jb21wbGV4X2Fic19ncHUnO1xuLy8gUmV0dXJucyBhIFRlbnNvckluZm8gd2l0aCB0aGUgY29tcGxleCBzaGFwZSBhbmQgdGhlIGRhdGFJZCBvZiB0aGVcbi8vIHVuZGVybHlpbmcgcGFydC4gV2UgbmVlZCB0byBkbyB0aGlzIGJlY2F1c2UgYSByZXNoYXBlZCBjb21wbGV4IHRlbnNvciBpc1xuLy8gbm90IHJlZmxlY3RlZCBpbiBpdHMgcGFydHMuXG5mdW5jdGlvbiBtYWtlQ29tcGxleENvbXBvbmVudFRlbnNvckluZm8oY29tcGxleFRlbnNvciwgY29tcGxleFBhcnQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBkYXRhSWQ6IGNvbXBsZXhQYXJ0LmRhdGFJZCxcbiAgICAgICAgZHR5cGU6IGNvbXBsZXhQYXJ0LmR0eXBlLFxuICAgICAgICBzaGFwZTogY29tcGxleFRlbnNvci5zaGFwZVxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gY29tcGxleEFicyhhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KHguZGF0YUlkKTtcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IENvbXBsZXhBYnNQcm9ncmFtKHguc2hhcGUpO1xuICAgIGNvbnN0IHByb2dyYW1JbnB1dHMgPSBbXG4gICAgICAgIG1ha2VDb21wbGV4Q29tcG9uZW50VGVuc29ySW5mbyh4LCB4RGF0YS5jb21wbGV4VGVuc29ySW5mb3MucmVhbCksXG4gICAgICAgIG1ha2VDb21wbGV4Q29tcG9uZW50VGVuc29ySW5mbyh4LCB4RGF0YS5jb21wbGV4VGVuc29ySW5mb3MuaW1hZyksXG4gICAgXTtcbiAgICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgcHJvZ3JhbUlucHV0cywgcHJvZ3JhbUlucHV0c1swXS5kdHlwZSk7XG59XG5leHBvcnQgY29uc3QgY29tcGxleEFic0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBDb21wbGV4QWJzLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGNvbXBsZXhBYnNcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db21wbGV4QWJzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgQ29uY2F0LCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNvbmNhdEltcGwgfSBmcm9tICcuL0NvbmNhdF9pbXBsJztcbmltcG9ydCB7IGlkZW50aXR5IH0gZnJvbSAnLi9JZGVudGl0eSc7XG5leHBvcnQgZnVuY3Rpb24gY29uY2F0KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBheGlzIH0gPSBhdHRycztcbiAgICBjb25zdCAkYXhpcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgaW5wdXRzWzBdLnNoYXBlKVswXTtcbiAgICBjb25zdCBvdXRTaGFwZSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0U2hhcGUoaW5wdXRzLm1hcCh0ID0+IHQuc2hhcGUpLCAkYXhpcyk7XG4gICAgaWYgKHV0aWwuc2l6ZUZyb21TaGFwZShvdXRTaGFwZSkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0U2hhcGUsIGlucHV0c1swXS5kdHlwZSwgW10pO1xuICAgIH1cbiAgICAvLyBLZWVwIG9ubHkgbm9uLWVtcHR5IHRlbnNvcnMgKGlnbm9yZSB0ZW5zb3JzIHdpdGggMCBpbiB0aGVpciBzaGFwZSkuXG4gICAgY29uc3QgJGlucHV0cyA9IGlucHV0cy5maWx0ZXIodCA9PiB1dGlsLnNpemVGcm9tU2hhcGUodC5zaGFwZSkgPiAwKTtcbiAgICBpZiAoJGlucHV0cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGlkZW50aXR5KHsgaW5wdXRzOiB7IHg6ICRpbnB1dHNbMF0gfSwgYmFja2VuZCB9KTtcbiAgICB9XG4gICAgY29uc3Qgc2hhcGVzID0gJGlucHV0cy5tYXAodCA9PiB0LnNoYXBlKTtcbiAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0UGFyYW1zQ29uc2lzdGVudChzaGFwZXMsICRheGlzKTtcbiAgICByZXR1cm4gY29uY2F0SW1wbCgkaW5wdXRzLCAkYXhpcywgYmFja2VuZCk7XG59XG5leHBvcnQgY29uc3QgY29uY2F0Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IENvbmNhdCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBjb25jYXRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db25jYXQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBlbnYsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgQ29uY2F0UHJvZ3JhbSB9IGZyb20gJy4uL2NvbmNhdF9ncHUnO1xuaW1wb3J0IHsgQ29uY2F0UGFja2VkUHJvZ3JhbSB9IGZyb20gJy4uL2NvbmNhdF9wYWNrZWRfZ3B1JztcbmltcG9ydCB7IGNvbmNhdEltcGxDUFUgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmltcG9ydCB7IGNvbXBsZXggfSBmcm9tICcuL0NvbXBsZXgnO1xuaW1wb3J0IHsgaW1hZyB9IGZyb20gJy4vSW1hZyc7XG5pbXBvcnQgeyByZWFsIH0gZnJvbSAnLi9SZWFsJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmNhdEltcGwoaW5wdXRzLCBheGlzLCBiYWNrZW5kKSB7XG4gICAgY29uc3QgZHR5cGUgPSBpbnB1dHNbMF0uZHR5cGU7XG4gICAgaWYgKGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICBjb25zdCByZWFscyA9IGlucHV0cy5tYXAoKHQpID0+IHJlYWwoeyBpbnB1dHM6IHsgaW5wdXQ6IHQgfSwgYmFja2VuZCB9KSk7XG4gICAgICAgIGNvbnN0IGltYWdzID0gaW5wdXRzLm1hcCgodCkgPT4gaW1hZyh7IGlucHV0czogeyBpbnB1dDogdCB9LCBiYWNrZW5kIH0pKTtcbiAgICAgICAgY29uc3QgcmVhbENvbmNhdGVkID0gY29uY2F0SW1wbChyZWFscywgYXhpcywgYmFja2VuZCk7XG4gICAgICAgIGNvbnN0IGltYWdDb25jYXRlZCA9IGNvbmNhdEltcGwoaW1hZ3MsIGF4aXMsIGJhY2tlbmQpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBjb21wbGV4KHsgaW5wdXRzOiB7IHJlYWw6IHJlYWxDb25jYXRlZCwgaW1hZzogaW1hZ0NvbmNhdGVkIH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIHJlYWxzLmZvckVhY2gociA9PiBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHIpKTtcbiAgICAgICAgaW1hZ3MuZm9yRWFjaChpID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaSkpO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlYWxDb25jYXRlZCk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaW1hZ0NvbmNhdGVkKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgbGV0IHJ1bk9uQ3B1ID0gYmFja2VuZC5zaG91bGRFeGVjdXRlT25DUFUoaW5wdXRzKTtcbiAgICAvLyBSdW4gb24gY3B1IGlmIGR0eXBlIGlzIHN0cmluZy4gRm9yIHN0cmluZywgdGhlIGJhY2tlbmQgcmVwcmVzZW50cyBpdFxuICAgIC8vIGFzIFVpbnQ4QXJyYXlbXSwgd2hlcmUgZWFjaCBVaW50OEFycmF5IGlzIGEgY2hhcmFjdGVyLiBHaXZlbiB0aGF0IHRoZVxuICAgIC8vIGNvbXB1dGF0aW9uIGlzIG9ubHkgb24gdGhlIG91dGVyIGFycmF5LCB1cGxvYWRpbmcgdGhlIHdob2xlIGRhdGEgb250b1xuICAgIC8vIGdwdSBpcyB3YXN0ZWZ1bC4gQWxzbywgY3VycmVudGx5IHdlYmdsIGRvZXNuJ3QgaGF2ZSBhIGRlc2lnbiB0b1xuICAgIC8vIHVwbG9hZCBhbmQgcmV0cmlldmUgVWludDhBcnJheVtdIGJldHdlZW4gY3B1IGFuZCBncHUuIFRoZXJlZm9yZSwgd2VcbiAgICAvLyBqdXN0IHJ1biB0aGUga2VybmVsIG9uIGNwdSBpZiBkdHlwZSBpcyBzdHJpbmcuXG4gICAgaWYgKGR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICBydW5PbkNwdSA9IHRydWU7XG4gICAgfVxuICAgIGlmIChydW5PbkNwdSkge1xuICAgICAgICAvLyBBbnkgY29uY2F0IG9mIG4tZGltZW5zaW9uYWwgdGVuc29ycyBhY3Jvc3MgYW55IGF4aXMgY2FuIGJlIHJlZHVjZWQgdG9cbiAgICAgICAgLy8gYSBjb25jYXRlbmF0aW9uIG9mIHR3by1kaW1lbnNpb25hbCB0ZW5zb3JzIGFjcm9zcyB0aGUgYXhpcyAxIGJ5IGZpcnN0XG4gICAgICAgIC8vIHBhcnRpdGlvbmluZyB0aGUgYXhlcyBvZiB0aGUgb3JpZ2luYWwgdGVuc29ycyBpbnRvIHRob3NlIGxlc3MgdGhhbiB0aGVcbiAgICAgICAgLy8gYXhpcyB0byBiZSBjb25jYXRlbmF0ZWQgYW5kIHRoZSByZXN0LiBUaGVuIHJlc2hhcGUgdGhlIHRlbnNvcnNcbiAgICAgICAgLy8gaW50byBhIHR3by1kaW1lbnNpb25hbCB0ZW5zb3IgYnkgY29sbGFwc2luZyB0aGVzZSB0d28gc2V0cyBvZiBheGVzIGFuZFxuICAgICAgICAvLyBjb25jYXRlbmF0ZSB0aGUgcmVzdWx0aW5nIG1hdHJpY2VzIGFjcm9zcyB0aGUgYXhpcyAxLCBmaW5hbGx5IHJlc2hhcGluZ1xuICAgICAgICAvLyB0aGUgcmVzdWx0IHRvIGhhdmUgdGhlIHByb3BlciBzaGFwZS5cbiAgICAgICAgY29uc3QgdGVuc29yczJEID0gaW5wdXRzLm1hcCh0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlubmVyU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSh0LnNoYXBlLnNsaWNlKGF4aXMpKTtcbiAgICAgICAgICAgIGNvbnN0IHNoYXBlID0gWy0xLCBpbm5lclNpemVdO1xuICAgICAgICAgICAgcmV0dXJuIHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogdCB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZSB9IH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgaW5wdXRzVmFsU2hhcGVzID0gdGVuc29yczJELm1hcCh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHM6IGJhY2tlbmQucmVhZFN5bmModC5kYXRhSWQpLCBzaGFwZTogdC5zaGFwZSB9O1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gQ29uY2F0cyAyZCB0ZW5zb3JzIGFsb25nIGF4aXM9MS5cbiAgICAgICAgY29uc3Qgb3V0U2hhcGUgPSBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dFNoYXBlKHRlbnNvcnMyRC5tYXAodCA9PiB0LnNoYXBlKSwgMSAvKiBheGlzICovKTtcbiAgICAgICAgY29uc3Qgc2ltcGx5Q29uY2F0ID0gdGVuc29yczJEWzBdLnNoYXBlWzBdID09PSAxO1xuICAgICAgICBjb25zdCBvdXRWYWxzID0gY29uY2F0SW1wbENQVShpbnB1dHNWYWxTaGFwZXMsIG91dFNoYXBlLCBkdHlwZSwgc2ltcGx5Q29uY2F0KTtcbiAgICAgICAgY29uc3QgZmluYWxPdXRTaGFwZSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0U2hhcGUoaW5wdXRzLm1hcCh0ID0+IHQuc2hhcGUpLCBheGlzKTtcbiAgICAgICAgY29uc3Qgb3V0SW5mbyA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8oZmluYWxPdXRTaGFwZSwgZHR5cGUsIG91dFZhbHMpO1xuICAgICAgICB0ZW5zb3JzMkQuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuICAgICAgICByZXR1cm4gb3V0SW5mbztcbiAgICB9XG4gICAgaWYgKGlucHV0cy5sZW5ndGggPiBlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX01BWF9URVhUVVJFU19JTl9TSEFERVInKSkge1xuICAgICAgICBjb25zdCBtaWRJbmRleCA9IE1hdGguZmxvb3IoaW5wdXRzLmxlbmd0aCAvIDIpO1xuICAgICAgICBjb25zdCBsZWZ0U2lkZSA9IGNvbmNhdEltcGwoaW5wdXRzLnNsaWNlKDAsIG1pZEluZGV4KSwgYXhpcywgYmFja2VuZCk7XG4gICAgICAgIGNvbnN0IHJpZ2h0U2lkZSA9IGNvbmNhdEltcGwoaW5wdXRzLnNsaWNlKG1pZEluZGV4KSwgYXhpcywgYmFja2VuZCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbmNhdEltcGwoW2xlZnRTaWRlLCByaWdodFNpZGVdLCBheGlzLCBiYWNrZW5kKTtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhsZWZ0U2lkZSk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmlnaHRTaWRlKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgaWYgKGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfQVJSQVlfT1BFUkFUSU9OUycpICYmXG4gICAgICAgIGlucHV0c1swXS5zaGFwZS5sZW5ndGggPiAxKSB7XG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgQ29uY2F0UGFja2VkUHJvZ3JhbShpbnB1dHMubWFwKHQgPT4gdC5zaGFwZSksIGF4aXMpO1xuICAgICAgICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgaW5wdXRzLCBkdHlwZSk7XG4gICAgfVxuICAgIGNvbnN0IHsgdGVuc29yczJELCBvdXRTaGFwZSB9ID0gY29tcHV0ZVRlbnNvcnMyRChpbnB1dHMsIGF4aXMsIGJhY2tlbmQpO1xuICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgQ29uY2F0UHJvZ3JhbSh0ZW5zb3JzMkQubWFwKHQgPT4gdC5zaGFwZSkpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIHRlbnNvcnMyRCwgZHR5cGUpO1xuICAgIHRlbnNvcnMyRC5mb3JFYWNoKHIgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyKSk7XG4gICAgY29uc3QgcmVzaGFwZWRSZXN1bHQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHJlc3VsdCB9LCBhdHRyczogeyBzaGFwZTogb3V0U2hhcGUgfSwgYmFja2VuZCB9KTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc2hhcGVkUmVzdWx0O1xufVxuZnVuY3Rpb24gY29tcHV0ZVRlbnNvcnMyRChpbnB1dHMsIGF4aXMsIGJhY2tlbmQpIHtcbiAgICAvLyBBbnkgY29uY2F0IG9mIG4tZGltZW5zaW9uYWwgdGVuc29ycyBhY3Jvc3MgYW55IGF4aXMgY2FuIGJlIHJlZHVjZWQgdG9cbiAgICAvLyBhIGNvbmNhdGVuYXRpb24gb2YgdHdvLWRpbWVuc2lvbmFsIHRlbnNvcnMgYWNyb3NzIHRoZSBheGlzIDEgYnkgZmlyc3RcbiAgICAvLyBwYXJ0aXRpb25pbmcgdGhlIGF4ZXMgb2YgdGhlIG9yaWdpbmFsIHRlbnNvcnMgaW50byB0aG9zZSBsZXNzIHRoYW4gdGhlXG4gICAgLy8gYXhpcyB0byBiZSBjb25jYXRlbmF0ZWQgYW5kIHRoZSByZXN0LiBUaGVuIHJlc2hhcGUgdGhlIHRlbnNvcnNcbiAgICAvLyBpbnRvIGEgdHdvLWRpbWVuc2lvbmFsIHRlbnNvciBieSBjb2xsYXBzaW5nIHRoZXNlIHR3byBzZXRzIG9mIGF4ZXMgYW5kXG4gICAgLy8gY29uY2F0ZW5hdGUgdGhlIHJlc3VsdGluZyBtYXRyaWNlcyBhY3Jvc3MgdGhlIGF4aXMgMSwgZmluYWxseSByZXNoYXBpbmdcbiAgICAvLyB0aGUgcmVzdWx0IHRvIGhhdmUgdGhlIHByb3BlciBzaGFwZS5cbiAgICBjb25zdCBvdXRTaGFwZSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0U2hhcGUoaW5wdXRzLm1hcCh0ID0+IHQuc2hhcGUpLCBheGlzKTtcbiAgICBjb25zdCB0ZW5zb3JzMkQgPSBpbnB1dHMubWFwKHggPT4gcmVzaGFwZSh7XG4gICAgICAgIGlucHV0czogeyB4IH0sXG4gICAgICAgIGF0dHJzOiB7IHNoYXBlOiBbLTEsIHV0aWwuc2l6ZUZyb21TaGFwZSh4LnNoYXBlLnNsaWNlKGF4aXMpKV0gfSxcbiAgICAgICAgYmFja2VuZFxuICAgIH0pKTtcbiAgICByZXR1cm4geyB0ZW5zb3JzMkQsIG91dFNoYXBlIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db25jYXRfaW1wbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIENvbnYyRCwgZW52IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IENvbnYyRFByb2dyYW0gfSBmcm9tICcuLi9jb252X2dwdSc7XG5pbXBvcnQgeyBjb252MmRCeU1hdE11bCwgY29udjJkV2l0aEltMlJvdyB9IGZyb20gJy4vQ29udjJEX2ltcGwnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5leHBvcnQgZnVuY3Rpb24gY29udjJkKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4LCBmaWx0ZXIgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGlsYXRpb25zLCBkaW1Sb3VuZGluZ01vZGUgfSA9IGF0dHJzO1xuICAgIGNvbnN0ICRkYXRhRm9ybWF0ID0gYmFja2VuZF91dGlsLmNvbnZlcnRDb252MkREYXRhRm9ybWF0KGRhdGFGb3JtYXQpO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252MkRJbmZvKHguc2hhcGUsIGZpbHRlci5zaGFwZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgZmFsc2UgLyogZGVwdGh3aXNlICovLCAkZGF0YUZvcm1hdCk7XG4gICAgbGV0IG91dDtcbiAgICBpZiAoY29udkluZm8uZmlsdGVySGVpZ2h0ID09PSAxICYmIGNvbnZJbmZvLmZpbHRlcldpZHRoID09PSAxICYmXG4gICAgICAgIGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0ID09PSAxICYmIGNvbnZJbmZvLmRpbGF0aW9uV2lkdGggPT09IDEgJiZcbiAgICAgICAgY29udkluZm8uc3RyaWRlSGVpZ2h0ID09PSAxICYmIGNvbnZJbmZvLnN0cmlkZVdpZHRoID09PSAxICYmXG4gICAgICAgIChjb252SW5mby5wYWRJbmZvLnR5cGUgPT09ICdTQU1FJyB8fCBjb252SW5mby5wYWRJbmZvLnR5cGUgPT09ICdWQUxJRCcpKSB7XG4gICAgICAgIG91dCA9IGNvbnYyZEJ5TWF0TXVsKHsgeCwgZmlsdGVyLCBjb252SW5mbywgYmFja2VuZCB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZW52KCkuZ2V0Qm9vbCgnV0VCR0xfQ09OVl9JTTJDT0wnKSAmJiB4LnNoYXBlWzBdID09PSAxKSB7XG4gICAgICAgIG91dCA9IGNvbnYyZFdpdGhJbTJSb3coeyB4LCBmaWx0ZXIsIGNvbnZJbmZvLCBiYWNrZW5kIH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBDb252MkRQcm9ncmFtKGNvbnZJbmZvKTtcbiAgICAgICAgb3V0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3gsIGZpbHRlcl0sICdmbG9hdDMyJyk7XG4gICAgfVxuICAgIGNvbnN0IG91dFJlc2hhcGVkID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiBvdXQgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IGNvbnZJbmZvLm91dFNoYXBlIH0gfSk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhvdXQpO1xuICAgIHJldHVybiBvdXRSZXNoYXBlZDtcbn1cbmV4cG9ydCBjb25zdCBjb252MkRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQ29udjJELFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGNvbnYyZCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db252MkQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBDb252MkRCYWNrcHJvcEZpbHRlciB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBDb252MkREZXJGaWx0ZXJQcm9ncmFtIH0gZnJvbSAnLi4vY29udl9iYWNrcHJvcF9ncHUnO1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnYyREJhY2twcm9wRmlsdGVyKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4LCBkeSB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0LCBkaW1Sb3VuZGluZ01vZGUsIGZpbHRlclNoYXBlIH0gPSBhdHRycztcbiAgICBjb25zdCAkZGF0YUZvcm1hdCA9IGJhY2tlbmRfdXRpbC5jb252ZXJ0Q29udjJERGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyh4LnNoYXBlLCBmaWx0ZXJTaGFwZSwgc3RyaWRlcywgMSAvKiBkaWxhdGlvbnMgKi8sIHBhZCwgZGltUm91bmRpbmdNb2RlLCBmYWxzZSAvKiBkZXB0aHdpc2UgKi8sICRkYXRhRm9ybWF0KTtcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IENvbnYyRERlckZpbHRlclByb2dyYW0oY29udkluZm8pO1xuICAgIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeCwgZHldLCAnZmxvYXQzMicpO1xufVxuZXhwb3J0IGNvbnN0IGNvbnYyREJhY2twcm9wRmlsdGVyQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IENvbnYyREJhY2twcm9wRmlsdGVyLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGNvbnYyREJhY2twcm9wRmlsdGVyLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbnYyREJhY2twcm9wRmlsdGVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgQ29udjJEQmFja3Byb3BJbnB1dCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBDb252MkREZXJJbnB1dFByb2dyYW0gfSBmcm9tICcuLi9jb252X2JhY2twcm9wX2dwdSc7XG5leHBvcnQgZnVuY3Rpb24gY29udjJEQmFja3Byb3BJbnB1dChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgZHksIGZpbHRlciB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgaW5wdXRTaGFwZSwgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0LCBkaW1Sb3VuZGluZ01vZGUgfSA9IGF0dHJzO1xuICAgIGNvbnN0ICRkYXRhRm9ybWF0ID0gYmFja2VuZF91dGlsLmNvbnZlcnRDb252MkREYXRhRm9ybWF0KGRhdGFGb3JtYXQpO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252MkRJbmZvKGlucHV0U2hhcGUsIGZpbHRlci5zaGFwZSwgc3RyaWRlcywgMSAvKiBkaWxhdGlvbnMgKi8sIHBhZCwgZGltUm91bmRpbmdNb2RlLCBmYWxzZSwgJGRhdGFGb3JtYXQpO1xuICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgQ29udjJERGVySW5wdXRQcm9ncmFtKGNvbnZJbmZvKTtcbiAgICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW2R5LCBmaWx0ZXJdLCAnZmxvYXQzMicpO1xufVxuZXhwb3J0IGNvbnN0IGNvbnYyREJhY2twcm9wSW5wdXRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQ29udjJEQmFja3Byb3BJbnB1dCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBjb252MkRCYWNrcHJvcElucHV0LFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbnYyREJhY2twcm9wSW5wdXQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZW52LCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IEltMkNvbFBhY2tlZFByb2dyYW0gfSBmcm9tICcuLi9pbTJjb2xfcGFja2VkX2dwdSc7XG5pbXBvcnQgeyBtYXBBY3RpdmF0aW9uVG9TaGFkZXJQcm9ncmFtIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQgeyBNYXRNdWxQYWNrZWRQcm9ncmFtIH0gZnJvbSAnLi4vbXVsbWF0X3BhY2tlZF9ncHUnO1xuaW1wb3J0ICogYXMgd2ViZ2xfdXRpbCBmcm9tICcuLi93ZWJnbF91dGlsJztcbmltcG9ydCB7IGJhdGNoTWF0TXVsSW1wbCwgTUFUTVVMX1NIQVJFRF9ESU1fVEhSRVNIT0xEIH0gZnJvbSAnLi9CYXRjaE1hdE11bF9pbXBsJztcbmltcG9ydCB7IGlkZW50aXR5IH0gZnJvbSAnLi9JZGVudGl0eSc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbi8vIEZvciAxeDEga2VybmVscyB0aGF0IGl0ZXJhdGUgdGhyb3VnaCBldmVyeSBwb2ludCBpbiB0aGUgaW5wdXQsIGNvbnZvbHV0aW9uXG4vLyBjYW4gYmUgZXhwcmVzc2VkIGFzIG1hdHJpeCBtdWx0aXBsaWNhdGlvbiAod2l0aG91dCBuZWVkIGZvciBtZW1vcnlcbi8vIHJlbWFwcGluZykuXG5leHBvcnQgZnVuY3Rpb24gY29udjJkQnlNYXRNdWwoeyB4LCBmaWx0ZXIsIGNvbnZJbmZvLCBiYWNrZW5kLCBiaWFzID0gbnVsbCwgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyA9IG51bGwsIGxlYWt5cmVsdUFscGhhID0gMCwgYWN0aXZhdGlvbiA9IG51bGwgfSkge1xuICAgIC8vIFJlc2hhcGVzIGNvbnYyRCBpbnB1dCB0byAyRCB0ZW5zb3JzLCB1c2VzIG1hdE11bCBhbmQgdGhlbiByZXNoYXBlIHRoZVxuICAgIC8vIHJlc3VsdCBmcm9tIDJEIHRvIDRELlxuICAgIGNvbnN0IHhTaGFwZSA9IHguc2hhcGU7XG4gICAgY29uc3QgeFRleERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KHguZGF0YUlkKTtcbiAgICBjb25zdCBzaGFyZWRNYXRNdWxEaW0gPSBjb252SW5mby5pbkNoYW5uZWxzO1xuICAgIGNvbnN0IG91dGVyU2hhcGVYID0geFNoYXBlWzBdICogeFNoYXBlWzFdICogeFNoYXBlWzJdO1xuICAgIGNvbnN0IG91dGVyU2hhcGVGaWx0ZXIgPSBjb252SW5mby5vdXRDaGFubmVscztcbiAgICBjb25zdCBpc0NoYW5uZWxzTGFzdCA9IGNvbnZJbmZvLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnO1xuICAgIGNvbnN0IHRyYW5zcG9zZUEgPSBmYWxzZTtcbiAgICBjb25zdCB0cmFuc3Bvc2VCID0gZmFsc2U7XG4gICAgbGV0IG91dDtcbiAgICBjb25zdCBpbnRlcm1lZGlhdGVzID0gW107XG4gICAgLy8gVE9ETzogT25jZSByZWR1Y3Rpb24gb3BzIGFyZSBwYWNrZWQsIGJhdGNoTWF0TXVsIHdpbGwgYWx3YXlzIGJlIHBhY2tlZFxuICAgIC8vIGFuZCB3ZSBjYW4gcmVtb3ZlIHRoaXMgY29uZGl0aW9uLlxuICAgIGNvbnN0IGJhdGNoTWF0TXVsV2lsbEJlVW5wYWNrZWQgPSAob3V0ZXJTaGFwZVggPT09IDEgfHwgb3V0ZXJTaGFwZUZpbHRlciA9PT0gMSkgJiZcbiAgICAgICAgc2hhcmVkTWF0TXVsRGltID4gTUFUTVVMX1NIQVJFRF9ESU1fVEhSRVNIT0xEO1xuICAgIGNvbnN0IHJlc2hhcGVXaWxsQmVFeHBlbnNpdmUgPSB4U2hhcGVbMl0gJSAyICE9PSAwICYmICEheFRleERhdGEuaXNQYWNrZWQ7XG4gICAgaWYgKGJhdGNoTWF0TXVsV2lsbEJlVW5wYWNrZWQgfHwgIWVudigpLmdldEJvb2woJ1dFQkdMX0xBWklMWV9VTlBBQ0snKSB8fFxuICAgICAgICAhZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19CSU5BUllfT1BFUkFUSU9OUycpIHx8XG4gICAgICAgICFyZXNoYXBlV2lsbEJlRXhwZW5zaXZlKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldFNoYXBlID0gaXNDaGFubmVsc0xhc3QgPyB4U2hhcGVbMF0gKiB4U2hhcGVbMV0gKiB4U2hhcGVbMl0gOlxuICAgICAgICAgICAgeFNoYXBlWzBdICogeFNoYXBlWzJdICogeFNoYXBlWzNdO1xuICAgICAgICBjb25zdCB4UmVzaGFwZWQgPSByZXNoYXBlKHtcbiAgICAgICAgICAgIGlucHV0czogeyB4IH0sXG4gICAgICAgICAgICBiYWNrZW5kLFxuICAgICAgICAgICAgYXR0cnM6IHsgc2hhcGU6IFsxLCB0YXJnZXRTaGFwZSwgY29udkluZm8uaW5DaGFubmVsc10gfVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZmlsdGVyUmVzaGFwZWQgPSByZXNoYXBlKHtcbiAgICAgICAgICAgIGlucHV0czogeyB4OiBmaWx0ZXIgfSxcbiAgICAgICAgICAgIGJhY2tlbmQsXG4gICAgICAgICAgICBhdHRyczogeyBzaGFwZTogWzEsIGNvbnZJbmZvLmluQ2hhbm5lbHMsIGNvbnZJbmZvLm91dENoYW5uZWxzXSB9XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBiYXRjaE1hdE11bEltcGwoe1xuICAgICAgICAgICAgYTogeFJlc2hhcGVkLFxuICAgICAgICAgICAgYjogZmlsdGVyUmVzaGFwZWQsXG4gICAgICAgICAgICB0cmFuc3Bvc2VBLFxuICAgICAgICAgICAgdHJhbnNwb3NlQixcbiAgICAgICAgICAgIGJhY2tlbmQsXG4gICAgICAgICAgICBiaWFzLFxuICAgICAgICAgICAgYWN0aXZhdGlvbixcbiAgICAgICAgICAgIHByZWx1QWN0aXZhdGlvbldlaWdodHMsXG4gICAgICAgICAgICBsZWFreXJlbHVBbHBoYVxuICAgICAgICB9KTtcbiAgICAgICAgb3V0ID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiByZXN1bHQgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IGNvbnZJbmZvLm91dFNoYXBlIH0gfSk7XG4gICAgICAgIGludGVybWVkaWF0ZXMucHVzaCh4UmVzaGFwZWQpO1xuICAgICAgICBpbnRlcm1lZGlhdGVzLnB1c2goZmlsdGVyUmVzaGFwZWQpO1xuICAgICAgICBpbnRlcm1lZGlhdGVzLnB1c2gocmVzdWx0KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIEZvbGxvd2luZyBvcHRpbWl6YXRpb24gaXMgc3BlY2lmaWMgdG8gcGFja2VkIHx4fCB3aXRoIG9kZCByb3cgY291bnRcbiAgICAgICAgLy8gKEZvciBleGFtcGxlLCBpbiBjaGFubmVsTGFzdCBtb2RlLCAncm93IGNvdW50JyByZWZlcnMgdG8geC5zaGFwZVsyXSk6XG4gICAgICAgIC8vIHdlIGF2b2lkIGV4cGVuc2l2ZSBwYWNrZWQgMngyIHJlc2hhcGUgYnkgcGFkZGluZyByb3cgY291bnQgdG8gbmV4dCxcbiAgICAgICAgLy8gZXZlbiBudW1iZXIuIFdoZW4geC5zaGFwZVsyXSBpcyBvZGQsIHRoZSByZXN1bHQgb2YgcGFja2VkIGJhdGNoTWF0TXVsIGlzXG4gICAgICAgIC8vIHRoZSBzYW1lIChoYXMgdGhlIHNhbWUgdGV4dHVyZSBsYXlvdXQgYW5kIGFuZCB2YWx1ZXMgaW4gdGhlIHRleHR1cmUpIGFzXG4gICAgICAgIC8vIGl0IGlzIGZvciBldmVuIHguc2hhcGVbMl0gKyAxLiBXZSBtYWtlIHRoZSBvZGQtcm93cyB0ZW5zb3IgdG8gbG9vayBsaWtlXG4gICAgICAgIC8vIGV2ZW4tcm93cyB0ZW5zb3IgYmVmb3JlIHRoZSBvcGVyYXRpb24gYW5kLCBhZnRlciB0aGUgYmF0Y2hNYXRNdWwsXG4gICAgICAgIC8vIGZpeCB0aGUgZXZlbi1yb3dzIHJlc3VsdCB0byBoYXZlIG9kZCBudW1iZXIgb2Ygcm93cy5cbiAgICAgICAgY29uc3QgdGFyZ2V0U2hhcGUgPSBpc0NoYW5uZWxzTGFzdCA/XG4gICAgICAgICAgICB4U2hhcGVbMF0gKiB4U2hhcGVbMV0gKiAoeFNoYXBlWzJdICsgMSkgOlxuICAgICAgICAgICAgeFNoYXBlWzBdICogeFNoYXBlWzJdICogKHhTaGFwZVszXSArIDEpO1xuICAgICAgICBjb25zdCB4UmVzaGFwZWQgPSB7XG4gICAgICAgICAgICBkYXRhSWQ6IHguZGF0YUlkLFxuICAgICAgICAgICAgc2hhcGU6IFsxLCB0YXJnZXRTaGFwZSwgY29udkluZm8uaW5DaGFubmVsc10sXG4gICAgICAgICAgICBkdHlwZTogeC5kdHlwZVxuICAgICAgICB9O1xuICAgICAgICAvLyB4VGV4RGF0YS5zaGFwZSBnZXRzIHJlZmVyZW5jZWQgZnJvbSBHUEdQVUJpbmFyeS5pblNoYXBlSW5mb3MuXG4gICAgICAgIC8vIERlY3JlbWVudGluZyByb3cgY291bnQsIGFmdGVyIGJhdGNoTWF0TXVsLT4uLi4tPmNvbXBpbGVQcm9ncmFtIGxlYWRzIHRvXG4gICAgICAgIC8vIGludmFsaWQgcm93IGNvdW50IHdpdGhpbiB0aGUgcmVmZXJlbmNlIGluIEdQR1BVQmluYXJ5LmluU2hhcGVJbmZvcy5cbiAgICAgICAgLy8gQWx0ZXJuYXRpdmUgZml4IHdvdWxkIGJlIHRvIHByb3ZpZGUgYSBjb3B5IHRvIEdQR1BVQmluYXJ5LmluU2hhcGVJbmZvc1xuICAgICAgICAvLyBpbiBjb21waWxlUHJvZ3JhbSBtZXRob2QsIGJ1dCB0aGF0IHdvdWxkIGFmZmVjdCBjb21waWxhdGlvbiBvZiBhbGxcbiAgICAgICAgLy8gcHJvZ3JhbXMgLSBpbnN0ZWFkLCBwcm92aWRlIGEgY29weSBoZXJlLCB3aXRoIGV2ZW4gcm93IGNvdW50LCBiZWZvcmVcbiAgICAgICAgLy8gY2FsbGluZyBiYXRjaE1hdE11bC0+Li4uLT5jb21waWxlUHJvZ3JhbSBhbmQgYWZ0ZXIgdGhhdCwgdGhlIG9yaWdpbmFsXG4gICAgICAgIC8vIHhUZXhEYXRhLnNoYXBlIGlzIHJlc3RvcmVkLlxuICAgICAgICBjb25zdCBvcmlnaW5hbFhUZXhEYXRhU2hhcGUgPSB4VGV4RGF0YS5zaGFwZTtcbiAgICAgICAgeFRleERhdGEuc2hhcGUgPSB4VGV4RGF0YS5zaGFwZS5zbGljZSgpO1xuICAgICAgICB4VGV4RGF0YS5zaGFwZVt4VGV4RGF0YS5zaGFwZS5sZW5ndGggLSAyXSsrO1xuICAgICAgICB1dGlsLmFzc2VydCh3ZWJnbF91dGlsLmlzUmVzaGFwZUZyZWUoeFRleERhdGEuc2hhcGUsIHhSZXNoYXBlZC5zaGFwZSksICgpID0+IGBwYWNrZWQgcmVzaGFwZSAke3hUZXhEYXRhLnNoYXBlfSB0byAke3hSZXNoYXBlZC5zaGFwZX0gaXNuJ3QgZnJlZWApO1xuICAgICAgICBjb25zdCBmaWx0ZXJSZXNoYXBlZCA9IHJlc2hhcGUoe1xuICAgICAgICAgICAgaW5wdXRzOiB7IHg6IGZpbHRlciB9LFxuICAgICAgICAgICAgYmFja2VuZCxcbiAgICAgICAgICAgIGF0dHJzOiB7IHNoYXBlOiBbMSwgY29udkluZm8uaW5DaGFubmVscywgY29udkluZm8ub3V0Q2hhbm5lbHNdIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGludGVybWVkaWF0ZXMucHVzaChmaWx0ZXJSZXNoYXBlZCk7XG4gICAgICAgIGNvbnN0IHBvaW50d2lzZUNvbnYgPSBiYXRjaE1hdE11bEltcGwoe1xuICAgICAgICAgICAgYTogeFJlc2hhcGVkLFxuICAgICAgICAgICAgYjogZmlsdGVyUmVzaGFwZWQsXG4gICAgICAgICAgICBiYWNrZW5kLFxuICAgICAgICAgICAgdHJhbnNwb3NlQSxcbiAgICAgICAgICAgIHRyYW5zcG9zZUIsXG4gICAgICAgICAgICBiaWFzLFxuICAgICAgICAgICAgYWN0aXZhdGlvbixcbiAgICAgICAgICAgIHByZWx1QWN0aXZhdGlvbldlaWdodHMsXG4gICAgICAgICAgICBsZWFreXJlbHVBbHBoYVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcG9pbnR3aXNlQ29udlRleERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KHBvaW50d2lzZUNvbnYuZGF0YUlkKTtcbiAgICAgICAgdXRpbC5hc3NlcnQocG9pbnR3aXNlQ29udlRleERhdGEuaXNQYWNrZWQsICgpID0+ICdiYXRjaE1hdE11bCByZXN1bHQgaXMgZXhwZWN0ZWQgdG8gYmUgcGFja2VkJyk7XG4gICAgICAgIC8vIFJlc3RvcmUgdGhlIGlucHV0IHNoYXBlIHRvIG9yaWdpbmFsLlxuICAgICAgICB4VGV4RGF0YS5zaGFwZSA9IG9yaWdpbmFsWFRleERhdGFTaGFwZTtcbiAgICAgICAgLy8gU2V0IHRoZSBvdXRwdXQgc2hhcGUgLSB0aGVyZSBpcyBubyBuZWVkIGZvciBleHBlbnNpdmUgcmVzaGFwZSBhcyBkYXRhXG4gICAgICAgIC8vIGxheW91dCBpcyBhbHJlYWR5IGNvcnJlY3QuXG4gICAgICAgIHBvaW50d2lzZUNvbnZUZXhEYXRhLnNoYXBlID0gY29udkluZm8ub3V0U2hhcGU7XG4gICAgICAgIG91dCA9IGlkZW50aXR5KHsgaW5wdXRzOiB7IHg6IHBvaW50d2lzZUNvbnYgfSwgYmFja2VuZCB9KTtcbiAgICAgICAgb3V0LnNoYXBlID0gY29udkluZm8ub3V0U2hhcGU7XG4gICAgICAgIGludGVybWVkaWF0ZXMucHVzaChwb2ludHdpc2VDb252KTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBpIG9mIGludGVybWVkaWF0ZXMpIHtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbi8vIEltcGxlbWVudHMgdGhlIGltMnJvdyBhbGdvcml0aG0gYXMgb3V0bGluZWQgaW4gXCJIaWdoIFBlcmZvcm1hbmNlXG4vLyBDb252b2x1dGlvbmFsIE5ldXJhbCBOZXR3b3JrcyBmb3IgRG9jdW1lbnQgUHJvY2Vzc2luZ1wiIChTdXZpc29mdCwgMjAwNilcbmV4cG9ydCBmdW5jdGlvbiBjb252MmRXaXRoSW0yUm93KHsgeCwgZmlsdGVyLCBjb252SW5mbywgYmFja2VuZCwgYmlhcyA9IG51bGwsIHByZWx1QWN0aXZhdGlvbldlaWdodHMgPSBudWxsLCBsZWFreXJlbHVBbHBoYSA9IDAsIGFjdGl2YXRpb24gPSBudWxsIH0pIHtcbiAgICAvLyBSZWFycmFuZ2VzIGNvbnYyZCBpbnB1dCBzbyBlYWNoIGJsb2NrIHRvIGJlIGNvbnZvbHZlZCBvdmVyIGZvcm1zIHRoZVxuICAgIC8vIGNvbHVtbiBvZiBhIG5ldyBtYXRyaXggd2l0aCBzaGFwZSBbZmlsdGVyV2lkdGggKiBmaWx0ZXJIZWlnaHQgKlxuICAgIC8vIGluQ2hhbm5lbHMsIG91dEhlaWdodCAqIG91dFdpZHRoXS4gVGhlIGZpbHRlciBpcyBhbHNvIHJlYXJyYW5nZWQgc28gZWFjaFxuICAgIC8vIG91dHB1dCBjaGFubmVsIGZvcm1zIGEgcm93IG9mIGEgbmV3IG1hdHJpeCB3aXRoIHNoYXBlIFtvdXRDaGFubmVscyxcbiAgICAvLyBmaWx0ZXJXaWR0aCAqIGZpbHRlckhlaWdodCAqIGluQ2hhbm5lbHNdLiBUaGUgY29udm9sdXRpb24gaXMgdGhlblxuICAgIC8vIGNvbXB1dGVkIGJ5IG11bHRpcGx5aW5nIHRoZXNlIG1hdHJpY2VzIGFuZCByZXNoYXBpbmcgdGhlIHJlc3VsdC5cbiAgICBjb25zdCB7IGZpbHRlcldpZHRoLCBmaWx0ZXJIZWlnaHQsIGluQ2hhbm5lbHMsIG91dFdpZHRoLCBvdXRIZWlnaHQsIGRhdGFGb3JtYXQgfSA9IGNvbnZJbmZvO1xuICAgIGNvbnN0IGlzQ2hhbm5lbHNMYXN0ID0gZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzTGFzdCc7XG4gICAgY29uc3Qgc2hhcmVkRGltID0gZmlsdGVyV2lkdGggKiBmaWx0ZXJIZWlnaHQgKiBpbkNoYW5uZWxzO1xuICAgIGNvbnN0IG51bUNvbHMgPSBvdXRIZWlnaHQgKiBvdXRXaWR0aDtcbiAgICBjb25zdCB4MkNvbFNoYXBlID0gW3NoYXJlZERpbSwgbnVtQ29sc107XG4gICAgY29uc3QgdHJhbnNwb3NlQSA9IHRydWU7XG4gICAgY29uc3QgdHJhbnNwb3NlQiA9IGZhbHNlO1xuICAgIGNvbnN0IGludGVybWVkaWF0ZXMgPSBbXTtcbiAgICBjb25zdCB4U3F1ZWV6ZWQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IHguc2hhcGUuc2xpY2UoMSkgfSB9KTtcbiAgICBjb25zdCB3MlJvdyA9IHJlc2hhcGUoe1xuICAgICAgICBpbnB1dHM6IHsgeDogZmlsdGVyIH0sXG4gICAgICAgIGJhY2tlbmQsXG4gICAgICAgIGF0dHJzOiB7IHNoYXBlOiBbMSwgc2hhcmVkRGltLCB1dGlsLnNpemVGcm9tU2hhcGUoZmlsdGVyLnNoYXBlKSAvIHNoYXJlZERpbV0gfVxuICAgIH0pO1xuICAgIGludGVybWVkaWF0ZXMucHVzaCh4U3F1ZWV6ZWQpO1xuICAgIGludGVybWVkaWF0ZXMucHVzaCh3MlJvdyk7XG4gICAgY29uc3QgaW0yQ29sUHJvZ3JhbSA9IG5ldyBJbTJDb2xQYWNrZWRQcm9ncmFtKHgyQ29sU2hhcGUsIHhTcXVlZXplZC5zaGFwZSwgY29udkluZm8pO1xuICAgIGNvbnN0IGltMkNvbCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKGltMkNvbFByb2dyYW0sIFt4U3F1ZWV6ZWRdLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IGltMkNvbFJlc2hhcGVkID0gcmVzaGFwZSh7XG4gICAgICAgIGlucHV0czogeyB4OiBpbTJDb2wgfSxcbiAgICAgICAgYmFja2VuZCxcbiAgICAgICAgYXR0cnM6IHsgc2hhcGU6IFsxLCB4MkNvbFNoYXBlWzBdLCB4MkNvbFNoYXBlWzFdXSB9XG4gICAgfSk7XG4gICAgaW50ZXJtZWRpYXRlcy5wdXNoKGltMkNvbCk7XG4gICAgaW50ZXJtZWRpYXRlcy5wdXNoKGltMkNvbFJlc2hhcGVkKTtcbiAgICBjb25zdCBoYXNCaWFzID0gYmlhcyAhPSBudWxsO1xuICAgIGNvbnN0IGhhc1ByZWx1QWN0aXZhdGlvbldlaWdodHMgPSBwcmVsdUFjdGl2YXRpb25XZWlnaHRzICE9IG51bGw7XG4gICAgY29uc3QgaGFzTGVha3lyZWx1QWxwaGEgPSBhY3RpdmF0aW9uID09PSAnbGVha3lyZWx1JztcbiAgICBjb25zdCBmdXNlZEFjdGl2YXRpb24gPSBhY3RpdmF0aW9uID8gbWFwQWN0aXZhdGlvblRvU2hhZGVyUHJvZ3JhbShhY3RpdmF0aW9uLCB0cnVlKSA6IG51bGw7XG4gICAgY29uc3QgbWF0bXVsUHJvZ3JhbSA9IG5ldyBNYXRNdWxQYWNrZWRQcm9ncmFtKGltMkNvbFJlc2hhcGVkLnNoYXBlLCB3MlJvdy5zaGFwZSwgWzEsIG51bUNvbHMsIGNvbnZJbmZvLm91dENoYW5uZWxzXSwgdHJhbnNwb3NlQSwgdHJhbnNwb3NlQiwgaGFzQmlhcywgZnVzZWRBY3RpdmF0aW9uLCBoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzLCBoYXNMZWFreXJlbHVBbHBoYSk7XG4gICAgY29uc3QgaW5wdXRzID0gW2ltMkNvbFJlc2hhcGVkLCB3MlJvd107XG4gICAgaWYgKGJpYXMpIHtcbiAgICAgICAgaW5wdXRzLnB1c2goYmlhcyk7XG4gICAgfVxuICAgIGlmIChoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzKSB7XG4gICAgICAgIGlucHV0cy5wdXNoKHByZWx1QWN0aXZhdGlvbldlaWdodHMpO1xuICAgIH1cbiAgICBpZiAoaGFzTGVha3lyZWx1QWxwaGEpIHtcbiAgICAgICAgY29uc3QgJGxlYWt5cmVsdUFscGhhID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbXSwgJ2Zsb2F0MzInLCB1dGlsLmNyZWF0ZVNjYWxhclZhbHVlKGxlYWt5cmVsdUFscGhhLCAnZmxvYXQzMicpKTtcbiAgICAgICAgaW5wdXRzLnB1c2goJGxlYWt5cmVsdUFscGhhKTtcbiAgICAgICAgaW50ZXJtZWRpYXRlcy5wdXNoKCRsZWFreXJlbHVBbHBoYSk7XG4gICAgfVxuICAgIGNvbnN0IHByb2R1Y3QgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShtYXRtdWxQcm9ncmFtLCBpbnB1dHMsICdmbG9hdDMyJyk7XG4gICAgY29uc3Qgb3V0U2hhcGUgPSBpc0NoYW5uZWxzTGFzdCA/XG4gICAgICAgIFsxLCBvdXRIZWlnaHQsIG91dFdpZHRoLCBjb252SW5mby5vdXRDaGFubmVsc10gOlxuICAgICAgICBbMSwgY29udkluZm8ub3V0Q2hhbm5lbHMsIG91dEhlaWdodCwgb3V0V2lkdGhdO1xuICAgIGNvbnN0IG91dCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogcHJvZHVjdCB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogb3V0U2hhcGUgfSB9KTtcbiAgICBpbnRlcm1lZGlhdGVzLnB1c2gocHJvZHVjdCk7XG4gICAgZm9yIChjb25zdCBpIG9mIGludGVybWVkaWF0ZXMpIHtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbnYyRF9pbXBsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgQ29udjNEIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IENvbnYzRFByb2dyYW0gfSBmcm9tICcuLi9jb252X2dwdSc7XG5leHBvcnQgZnVuY3Rpb24gY29udjNEKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4LCBmaWx0ZXIgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHN0cmlkZXMsIHBhZCwgZGlsYXRpb25zIH0gPSBhdHRycztcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjNESW5mbyh4LnNoYXBlLCBmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkKTtcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IENvbnYzRFByb2dyYW0oY29udkluZm8pO1xuICAgIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeCwgZmlsdGVyXSwgJ2Zsb2F0MzInKTtcbn1cbmV4cG9ydCBjb25zdCBjb252M0RDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQ29udjNELFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGNvbnYzRCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db252M0QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBDb252M0RCYWNrcHJvcEZpbHRlclYyIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IENvbnYzRERlckZpbHRlclByb2dyYW0gfSBmcm9tICcuLi9jb252X2JhY2twcm9wX2dwdSc7XG5leHBvcnQgZnVuY3Rpb24gY29udjNEQmFja3Byb3BGaWx0ZXJWMihhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCwgZHkgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHN0cmlkZXMsIHBhZCwgZmlsdGVyU2hhcGUgfSA9IGF0dHJzO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252M0RJbmZvKHguc2hhcGUsIGZpbHRlclNoYXBlLCBzdHJpZGVzLCAxIC8qIGRpbGF0aW9ucyAqLywgcGFkKTtcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IENvbnYzRERlckZpbHRlclByb2dyYW0oY29udkluZm8pO1xuICAgIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeCwgZHldLCAnZmxvYXQzMicpO1xufVxuZXhwb3J0IGNvbnN0IGNvbnYzREJhY2twcm9wRmlsdGVyVjJDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQ29udjNEQmFja3Byb3BGaWx0ZXJWMixcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBjb252M0RCYWNrcHJvcEZpbHRlclYyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29udjNEQmFja3Byb3BGaWx0ZXJWMi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIENvbnYzREJhY2twcm9wSW5wdXRWMiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBDb252M0REZXJJbnB1dFByb2dyYW0gfSBmcm9tICcuLi9jb252X2JhY2twcm9wX2dwdSc7XG5leHBvcnQgZnVuY3Rpb24gY29udjNEQmFja3Byb3BJbnB1dChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgZHksIGZpbHRlciB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgcGFkLCBzdHJpZGVzLCBpbnB1dFNoYXBlIH0gPSBhdHRycztcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjNESW5mbyhpbnB1dFNoYXBlLCBmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsIDEgLyogZGlsYXRpb25zICovLCBwYWQpO1xuICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgQ29udjNERGVySW5wdXRQcm9ncmFtKGNvbnZJbmZvKTtcbiAgICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW2R5LCBmaWx0ZXJdLCAnZmxvYXQzMicpO1xufVxuZXhwb3J0IGNvbnN0IGNvbnYzREJhY2twcm9wSW5wdXRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQ29udjNEQmFja3Byb3BJbnB1dFYyLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGNvbnYzREJhY2twcm9wSW5wdXQsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29udjNEQmFja3Byb3BJbnB1dFYyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IENvcyB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBDSEVDS19OQU5fU05JUFBFVF9VTkFSWSwgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5jb25zdCBDT1MgPSBDSEVDS19OQU5fU05JUFBFVF9VTkFSWSArIGBcbiAgcmV0dXJuIGNvcyh4KTtcbmA7XG5leHBvcnQgY29uc3QgY29zID0gdW5hcnlLZXJuZWxGdW5jKHsgb3BTbmlwcGV0OiBDT1MgfSk7XG5leHBvcnQgY29uc3QgY29zQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IENvcyxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBjb3MsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29zLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IENvc2ggfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5jb25zdCBDT1NIID0gYFxuICBmbG9hdCBlMnggPSBleHAoLXgpO1xuICByZXR1cm4gKGUyeCArIDEuMCAvIGUyeCkgLyAyLjA7XG5gO1xuZXhwb3J0IGNvbnN0IGNvc2ggPSB1bmFyeUtlcm5lbEZ1bmMoeyBvcFNuaXBwZXQ6IENPU0ggfSk7XG5leHBvcnQgY29uc3QgY29zaENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBDb3NoLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGNvc2gsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29zaC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBDcm9wQW5kUmVzaXplIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IENyb3BBbmRSZXNpemVQcm9ncmFtIH0gZnJvbSAnLi4vY3JvcF9hbmRfcmVzaXplX2dwdSc7XG5leHBvcnQgY29uc3QgY3JvcEFuZFJlc2l6ZSA9IChhcmdzKSA9PiB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW1hZ2UsIGJveGVzLCBib3hJbmQgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGNyb3BTaXplLCBtZXRob2QsIGV4dHJhcG9sYXRpb25WYWx1ZSB9ID0gYXR0cnM7XG4gICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBDcm9wQW5kUmVzaXplUHJvZ3JhbShpbWFnZS5zaGFwZSwgYm94ZXMuc2hhcGUsIGNyb3BTaXplLCBtZXRob2QsIGV4dHJhcG9sYXRpb25WYWx1ZSk7XG4gICAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtpbWFnZSwgYm94ZXMsIGJveEluZF0sICdmbG9hdDMyJyk7XG59O1xuZXhwb3J0IGNvbnN0IGNyb3BBbmRSZXNpemVDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQ3JvcEFuZFJlc2l6ZSxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBjcm9wQW5kUmVzaXplXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q3JvcEFuZFJlc2l6ZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIEN1bXN1bSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBDdW1TdW1Qcm9ncmFtIH0gZnJvbSAnLi4vY3Vtc3VtX2dwdSc7XG5pbXBvcnQgeyBpZGVudGl0eSB9IGZyb20gJy4vSWRlbnRpdHknO1xuaW1wb3J0IHsgdHJhbnNwb3NlIH0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuZXhwb3J0IGZ1bmN0aW9uIGN1bXN1bShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYXhpcywgZXhjbHVzaXZlLCByZXZlcnNlIH0gPSBhdHRycztcbiAgICBjb25zdCB4UmFuayA9IHguc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IHBlcm11dGF0aW9uID0gYmFja2VuZF91dGlsLmdldEF4ZXNQZXJtdXRhdGlvbihbYXhpc10sIHhSYW5rKTtcbiAgICBsZXQgcGVybXV0ZWRYID0geDtcbiAgICBpZiAocGVybXV0YXRpb24gIT0gbnVsbCkge1xuICAgICAgICBwZXJtdXRlZFggPSB0cmFuc3Bvc2UoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kLCBhdHRyczogeyBwZXJtOiBwZXJtdXRhdGlvbiB9IH0pO1xuICAgIH1cbiAgICBjb25zdCBwZXJtdXRlZEF4aXMgPSBiYWNrZW5kX3V0aWwuZ2V0SW5uZXJNb3N0QXhlcygxLCB4UmFuaylbMF07XG4gICAgaWYgKHBlcm11dGVkQXhpcyAhPT0geFJhbmsgLSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgV2ViR0wgY3Vtc3VtIHNoYWRlciBleHBlY3RzIGFuIGlubmVyLW1vc3QgYXhpcz0ke3guc2hhcGUubGVuZ3RoIC0gMX0gYCArXG4gICAgICAgICAgICBgYnV0IGdvdCBheGlzPSR7YXhpc31gKTtcbiAgICB9XG4gICAgY29uc3Qgc2l6ZSA9IHBlcm11dGVkWC5zaGFwZVtwZXJtdXRlZEF4aXNdO1xuICAgIGxldCByZXN1bHQgPSBpZGVudGl0eSh7IGlucHV0czogeyB4OiBwZXJtdXRlZFggfSwgYmFja2VuZCB9KTtcbiAgICAvLyBVc2UgY3Vtc3VtIHBhcmFsbGVsIGFsZ29yaXRobSwgcmVmOlxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm52aWRpYS5jb20vZ3B1Z2Vtcy9ncHVnZW1zMy9wYXJ0LXZpLWdwdS1jb21wdXRpbmcvY2hhcHRlci0zOS1wYXJhbGxlbC1wcmVmaXgtc3VtLXNjYW4tY3VkYVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IE1hdGguY2VpbChNYXRoLmxvZzIoc2l6ZSkpIC0gMTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgQ3VtU3VtUHJvZ3JhbShwZXJtdXRlZFguc2hhcGUsIGZhbHNlLCByZXZlcnNlKTtcbiAgICAgICAgY29uc3QgY3VzdG9tVmFsdWVzID0gW1tpXV07XG4gICAgICAgIGNvbnN0IHByZXZSZXN1bHQgPSByZXN1bHQ7XG4gICAgICAgIHJlc3VsdCA9XG4gICAgICAgICAgICBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbcmVzdWx0XSwgcmVzdWx0LmR0eXBlLCBjdXN0b21WYWx1ZXMpO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHByZXZSZXN1bHQpO1xuICAgIH1cbiAgICAvLyBGb3IgZXhjbHVzaXZlIGN1bXN1bSwgc2hpZnQgdGhlIGVuZCByZXN1bHQgaW4gdGhlIGRpcmVjdGlvbiBvZiBzdW1cbiAgICAvLyBhbmQgYWRkIDAgdG8gdGhlIGZyb250IGluZGV4LlxuICAgIGlmIChleGNsdXNpdmUpIHtcbiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBDdW1TdW1Qcm9ncmFtKHBlcm11dGVkWC5zaGFwZSwgZXhjbHVzaXZlLCByZXZlcnNlKTtcbiAgICAgICAgY29uc3QgcHJldlJlc3VsdCA9IHJlc3VsdDtcbiAgICAgICAgcmVzdWx0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3Jlc3VsdF0sIHJlc3VsdC5kdHlwZSk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocHJldlJlc3VsdCk7XG4gICAgfVxuICAgIGlmIChwZXJtdXRhdGlvbiAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHJldmVyc2VQZXJtdXRhdGlvbiA9IGJhY2tlbmRfdXRpbC5nZXRVbmRvQXhlc1Blcm11dGF0aW9uKHBlcm11dGF0aW9uKTtcbiAgICAgICAgY29uc3QgcmV2ZXJzZVRyYW5zcG9zZWRSZXN1bHQgPSB0cmFuc3Bvc2UoeyBpbnB1dHM6IHsgeDogcmVzdWx0IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHBlcm06IHJldmVyc2VQZXJtdXRhdGlvbiB9IH0pO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc3VsdCk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocGVybXV0ZWRYKTtcbiAgICAgICAgcmV0dXJuIHJldmVyc2VUcmFuc3Bvc2VkUmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGNvbnN0IGN1bXN1bUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBDdW1zdW0sXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogY3Vtc3VtXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q3Vtc3VtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IERlbnNlQmluY291bnQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYmluY291bnRJbXBsQ1BVLCBiaW5jb3VudFJlZHVjZUltcGxDUFUgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmV4cG9ydCBmdW5jdGlvbiBkZW5zZUJpbmNvdW50KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4LCB3ZWlnaHRzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBzaXplLCBiaW5hcnlPdXRwdXQgfSA9IGF0dHJzO1xuICAgIGlmICh4LnNoYXBlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCB4VmFscyA9IGJhY2tlbmQucmVhZFN5bmMoeC5kYXRhSWQpO1xuICAgICAgICBjb25zdCB3ZWlnaHRzVmFscyA9IGJhY2tlbmQucmVhZFN5bmMod2VpZ2h0cy5kYXRhSWQpO1xuICAgICAgICBjb25zdCBvdXRWYWxzID0gYmluY291bnRJbXBsQ1BVKHhWYWxzLCB3ZWlnaHRzVmFscywgd2VpZ2h0cy5kdHlwZSwgd2VpZ2h0cy5zaGFwZSwgc2l6ZSk7XG4gICAgICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtzaXplXSwgd2VpZ2h0cy5kdHlwZSwgb3V0VmFscyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHguc2hhcGUubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIGNvbnN0IHhCdWYgPSBiYWNrZW5kLmJ1ZmZlclN5bmMoeCk7XG4gICAgICAgIGNvbnN0IHdlaWdodHNCdWYgPSBiYWNrZW5kLmJ1ZmZlclN5bmMod2VpZ2h0cyk7XG4gICAgICAgIGNvbnN0IG91dEJ1ZiA9IGJpbmNvdW50UmVkdWNlSW1wbENQVSh4QnVmLCB3ZWlnaHRzQnVmLCBzaXplLCBiaW5hcnlPdXRwdXQpO1xuICAgICAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRCdWYuc2hhcGUsIHdlaWdodHMuZHR5cGUsIG91dEJ1Zi52YWx1ZXMpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIGRlbnNlQmluY291bnQ6IGlucHV0IG11c3QgYmUgYXQgbW9zdCByYW5rIDIsIGJ1dCBnb3QgcmFua2AgK1xuICAgICAgICBgJHt4LnNoYXBlLmxlbmd0aH0uYCk7XG59XG5leHBvcnQgY29uc3QgZGVuc2VCaW5jb3VudENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBEZW5zZUJpbmNvdW50LFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGRlbnNlQmluY291bnRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EZW5zZUJpbmNvdW50LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IERlcHRoVG9TcGFjZSwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBEZXB0aFRvU3BhY2VQcm9ncmFtIH0gZnJvbSAnLi4vZGVwdGhfdG9fc3BhY2VfZ3B1JztcbmV4cG9ydCBmdW5jdGlvbiBkZXB0aFRvU3BhY2UoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGJsb2NrU2l6ZSwgZGF0YUZvcm1hdCB9ID0gYXR0cnM7XG4gICAgdXRpbC5hc3NlcnQoYmxvY2tTaXplID4gMSwgKCkgPT4gYGJsb2NrU2l6ZSBzaG91bGQgYmUgPiAxIGZvciBkZXB0aFRvU3BhY2UsIGJ1dCB3YXM6ICR7YmxvY2tTaXplfWApO1xuICAgIGNvbnN0IGJhdGNoU2l6ZSA9IHguc2hhcGVbMF07XG4gICAgY29uc3QgaW5wdXRIZWlnaHQgPSAoZGF0YUZvcm1hdCA9PT0gJ05IV0MnKSA/IHguc2hhcGVbMV0gOiB4LnNoYXBlWzJdO1xuICAgIGNvbnN0IGlucHV0V2lkdGggPSAoZGF0YUZvcm1hdCA9PT0gJ05IV0MnKSA/IHguc2hhcGVbMl0gOiB4LnNoYXBlWzNdO1xuICAgIGNvbnN0IGlucHV0RGVwdGggPSAoZGF0YUZvcm1hdCA9PT0gJ05IV0MnKSA/IHguc2hhcGVbM10gOiB4LnNoYXBlWzFdO1xuICAgIGNvbnN0IG91dHB1dEhlaWdodCA9IGlucHV0SGVpZ2h0ICogYmxvY2tTaXplO1xuICAgIGNvbnN0IG91dHB1dFdpZHRoID0gaW5wdXRXaWR0aCAqIGJsb2NrU2l6ZTtcbiAgICBjb25zdCBvdXRwdXREZXB0aCA9IGlucHV0RGVwdGggLyAoYmxvY2tTaXplICogYmxvY2tTaXplKTtcbiAgICBjb25zdCBvdXRwdXRTaGFwZSA9IChkYXRhRm9ybWF0ID09PSAnTkhXQycpID9cbiAgICAgICAgW2JhdGNoU2l6ZSwgb3V0cHV0SGVpZ2h0LCBvdXRwdXRXaWR0aCwgb3V0cHV0RGVwdGhdIDpcbiAgICAgICAgW2JhdGNoU2l6ZSwgb3V0cHV0RGVwdGgsIG91dHB1dEhlaWdodCwgb3V0cHV0V2lkdGhdO1xuICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgRGVwdGhUb1NwYWNlUHJvZ3JhbShvdXRwdXRTaGFwZSwgYmxvY2tTaXplLCBkYXRhRm9ybWF0KTtcbiAgICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3hdLCB4LmR0eXBlKTtcbn1cbmV4cG9ydCBjb25zdCBkZXB0aFRvU3BhY2VDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRGVwdGhUb1NwYWNlLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGRlcHRoVG9TcGFjZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURlcHRoVG9TcGFjZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIERlcHRod2lzZUNvbnYyZE5hdGl2ZSwgZW52LCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IERlcHRod2lzZUNvbnYyRFByb2dyYW0gfSBmcm9tICcuLi9jb252X2dwdV9kZXB0aHdpc2UnO1xuaW1wb3J0IHsgRGVwdGh3aXNlQ29udlBhY2tlZDJEUHJvZ3JhbSB9IGZyb20gJy4uL2NvbnZfcGFja2VkX2dwdV9kZXB0aHdpc2UnO1xuZXhwb3J0IGZ1bmN0aW9uIGRlcHRod2lzZUNvbnYyZE5hdGl2ZShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCwgZmlsdGVyIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBzdHJpZGVzLCBwYWQsIGRpbGF0aW9ucywgZGltUm91bmRpbmdNb2RlIH0gPSBhdHRycztcbiAgICBsZXQgJGRpbGF0aW9ucyA9IGRpbGF0aW9ucztcbiAgICBpZiAoJGRpbGF0aW9ucyA9PSBudWxsKSB7XG4gICAgICAgICRkaWxhdGlvbnMgPSBbMSwgMV07XG4gICAgfVxuICAgIHV0aWwuYXNzZXJ0KGJhY2tlbmRfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgJGRpbGF0aW9ucyksICgpID0+ICdFcnJvciBpbiBkZXB0aHdpc2VDb252MmQ6IEVpdGhlciBzdHJpZGVzIG9yIGRpbGF0aW9ucyBtdXN0IGJlICcgK1xuICAgICAgICBgMS4gR290IHN0cmlkZXMgJHtzdHJpZGVzfSBhbmQgZGlsYXRpb25zICckeyRkaWxhdGlvbnN9J2ApO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252MkRJbmZvKHguc2hhcGUsIGZpbHRlci5zaGFwZSwgc3RyaWRlcywgJGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIHRydWUgLyogZGVwdGh3aXNlICovKTtcbiAgICBsZXQgcHJvZ3JhbTtcbiAgICBpZiAoZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19ERVBUSFdJU0VDT05WJykgJiYgY29udkluZm8uc3RyaWRlV2lkdGggPD0gMiAmJlxuICAgICAgICBjb252SW5mby5vdXRDaGFubmVscyAvIGNvbnZJbmZvLmluQ2hhbm5lbHMgPT09IDEpIHtcbiAgICAgICAgcHJvZ3JhbSA9IG5ldyBEZXB0aHdpc2VDb252UGFja2VkMkRQcm9ncmFtKGNvbnZJbmZvKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHByb2dyYW0gPSBuZXcgRGVwdGh3aXNlQ29udjJEUHJvZ3JhbShjb252SW5mbyk7XG4gICAgfVxuICAgIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeCwgZmlsdGVyXSwgJ2Zsb2F0MzInKTtcbn1cbmV4cG9ydCBjb25zdCBkZXB0aHdpc2VDb252MmROYXRpdmVDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRGVwdGh3aXNlQ29udjJkTmF0aXZlLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGRlcHRod2lzZUNvbnYyZE5hdGl2ZSxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EZXB0aHdpc2VDb252MmROYXRpdmUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlciB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBEZXB0aHdpc2VDb252MkREZXJGaWx0ZXJQcm9ncmFtIH0gZnJvbSAnLi4vY29udl9iYWNrcHJvcF9ncHVfZGVwdGh3aXNlJztcbmV4cG9ydCBmdW5jdGlvbiBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlcihhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCwgZHkgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGZpbHRlclNoYXBlIH0gPSBhdHRycztcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyh4LnNoYXBlLCBmaWx0ZXJTaGFwZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgdHJ1ZSAvKiBkZXB0aHdpc2UgKi8pO1xuICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgRGVwdGh3aXNlQ29udjJERGVyRmlsdGVyUHJvZ3JhbShjb252SW5mbyk7XG4gICAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4LCBkeV0sICdmbG9hdDMyJyk7XG59XG5leHBvcnQgY29uc3QgZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXJDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIERlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgRGVwdGh3aXNlQ29udjJERGVySW5wdXRQcm9ncmFtIH0gZnJvbSAnLi4vY29udl9iYWNrcHJvcF9ncHVfZGVwdGh3aXNlJztcbmV4cG9ydCBmdW5jdGlvbiBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBkeSwgZmlsdGVyIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBzdHJpZGVzLCBkaWxhdGlvbnMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCBpbnB1dFNoYXBlIH0gPSBhdHRycztcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyhpbnB1dFNoYXBlLCBmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIHRydWUgLyogZGVwdGh3aXNlICovKTtcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IERlcHRod2lzZUNvbnYyRERlcklucHV0UHJvZ3JhbShjb252SW5mbyk7XG4gICAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtkeSwgZmlsdGVyXSwgJ2Zsb2F0MzInKTtcbn1cbmV4cG9ydCBjb25zdCBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IERlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXQsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRGlhZywgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBEaWFnUHJvZ3JhbSB9IGZyb20gJy4uL2RpYWdfZ3B1JztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuZXhwb3J0IGZ1bmN0aW9uIGRpYWcoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IG91dFNoYXBlID0gWy4uLnguc2hhcGUsIC4uLnguc2hhcGVdO1xuICAgIGNvbnN0IHhTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHguc2hhcGUpO1xuICAgIGNvbnN0IGZsYXQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IFt4U2l6ZV0gfSB9KTtcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IERpYWdQcm9ncmFtKHhTaXplKTtcbiAgICBjb25zdCByZXMgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbZmxhdF0sIGZsYXQuZHR5cGUpO1xuICAgIGNvbnN0IG91dCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogcmVzIH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBvdXRTaGFwZSB9IH0pO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oZmxhdCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXMpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgZGlhZ0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBEaWFnLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGRpYWdcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EaWFnLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgRGlsYXRpb24yRCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBEaWxhdGlvbjJEUHJvZ3JhbSB9IGZyb20gJy4uL2RpbGF0aW9uX2dwdSc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmV4cG9ydCBmdW5jdGlvbiBkaWxhdGlvbjJEKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4LCBmaWx0ZXIgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHN0cmlkZXMsIHBhZCwgZGlsYXRpb25zIH0gPSBhdHRycztcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlRGlsYXRpb24yREluZm8oeC5zaGFwZSwgZmlsdGVyLnNoYXBlLCBzdHJpZGVzLCBwYWQsICdOSFdDJyAvKiBkYXRhRm9ybWF0ICovLCBkaWxhdGlvbnMpO1xuICAgIGxldCBvdXQ7XG4gICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBEaWxhdGlvbjJEUHJvZ3JhbShjb252SW5mbyk7XG4gICAgb3V0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3gsIGZpbHRlcl0sICdmbG9hdDMyJyk7XG4gICAgY29uc3Qgb3V0UmVzaGFwZWQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IG91dCB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogY29udkluZm8ub3V0U2hhcGUgfSB9KTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG91dCk7XG4gICAgcmV0dXJuIG91dFJlc2hhcGVkO1xufVxuZXhwb3J0IGNvbnN0IGRpbGF0aW9uMkRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRGlsYXRpb24yRCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBkaWxhdGlvbjJELFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURpbGF0aW9uMkQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBFaW5zdW0sIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgbXVsdGlwbHkgfSBmcm9tICcuL011bHRpcGx5JztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHsgc3VtIH0gZnJvbSAnLi9TdW0nO1xuaW1wb3J0IHsgdHJhbnNwb3NlIH0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuZXhwb3J0IGZ1bmN0aW9uIGVpbnN1bShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgZXF1YXRpb24gfSA9IGF0dHJzO1xuICAgIGNvbnN0IHRlbnNvcnMgPSBpbnB1dHM7XG4gICAgY29uc3QgeyBhbGxEaW1zLCBzdW1tZWREaW1zLCBpZERpbXMgfSA9IGJhY2tlbmRfdXRpbC5kZWNvZGVFaW5zdW1FcXVhdGlvbihlcXVhdGlvbiwgdGVuc29ycy5sZW5ndGgpO1xuICAgIGJhY2tlbmRfdXRpbC5jaGVja0VpbnN1bURpbVNpemVzKGFsbERpbXMubGVuZ3RoLCBpZERpbXMsIHRlbnNvcnMpO1xuICAgIGNvbnN0IHsgcGF0aCwgc3RlcHMgfSA9IGJhY2tlbmRfdXRpbC5nZXRFaW5zdW1Db21wdXRlUGF0aChzdW1tZWREaW1zLCBpZERpbXMpO1xuICAgIGNvbnN0IG5TdGVwcyA9IHN0ZXBzLmxlbmd0aDtcbiAgICBsZXQgb3V0ID0gbnVsbDtcbiAgICBsZXQgbnVtRGltc1JlbWFpbmluZyA9IGFsbERpbXMubGVuZ3RoO1xuICAgIGNvbnN0IHRlbnNvcnNUb0Rpc3Bvc2UgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5TdGVwczsgKytpKSB7XG4gICAgICAgIGZvciAoY29uc3QgaWRUZXJtIG9mIHN0ZXBzW2ldKSB7XG4gICAgICAgICAgICBjb25zdCB7IHBlcm11dGF0aW9uSW5kaWNlczogcGVybSwgZXhwYW5kRGltczogZGltc1RvRXhwYW5kIH0gPSBiYWNrZW5kX3V0aWwuZ2V0RWluc3VtUGVybXV0YXRpb24obnVtRGltc1JlbWFpbmluZywgaWREaW1zW2lkVGVybV0pO1xuICAgICAgICAgICAgbGV0IHg7XG4gICAgICAgICAgICBpZiAoYmFja2VuZF91dGlsLmlzSWRlbnRpdHlQZXJtdXRhdGlvbihwZXJtKSkge1xuICAgICAgICAgICAgICAgIHggPSB0ZW5zb3JzW2lkVGVybV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB4ID0gdHJhbnNwb3NlKHsgaW5wdXRzOiB7IHg6IHRlbnNvcnNbaWRUZXJtXSB9LCBiYWNrZW5kLCBhdHRyczogeyBwZXJtIH0gfSk7XG4gICAgICAgICAgICAgICAgdGVuc29yc1RvRGlzcG9zZS5wdXNoKHgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0U2hhcGUgPSB4LnNoYXBlLnNsaWNlKCk7XG4gICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGRpbXNUb0V4cGFuZC5sZW5ndGg7ICsraykge1xuICAgICAgICAgICAgICAgIHRhcmdldFNoYXBlLnNwbGljZShkaW1zVG9FeHBhbmRba10sIDAsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF1dGlsLmFycmF5c0VxdWFsKHguc2hhcGUsIHRhcmdldFNoYXBlKSkge1xuICAgICAgICAgICAgICAgIHggPSByZXNoYXBlKHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IHRhcmdldFNoYXBlIH0gfSk7XG4gICAgICAgICAgICAgICAgdGVuc29yc1RvRGlzcG9zZS5wdXNoKHgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG91dCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG91dCA9IHg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgICAgICAgICAgICAgb3V0ID0gbXVsdGlwbHkoeyBpbnB1dHM6IHsgYTogeCwgYjogb3V0IH0sIGJhY2tlbmQgfSk7XG4gICAgICAgICAgICAgICAgdGVuc29yc1RvRGlzcG9zZS5wdXNoKG91dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgPCBuU3RlcHMgLSAxKSB7XG4gICAgICAgICAgICBpZiAocGF0aFtpXSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgb3V0ID0gc3VtKHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiB7IHg6IG91dCB9LFxuICAgICAgICAgICAgICAgICAgICBiYWNrZW5kLFxuICAgICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXhpczogcGF0aFtpXSAtIChhbGxEaW1zLmxlbmd0aCAtIG51bURpbXNSZW1haW5pbmcpLFxuICAgICAgICAgICAgICAgICAgICAgICAga2VlcERpbXM6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0ZW5zb3JzVG9EaXNwb3NlLnB1c2gob3V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG51bURpbXNSZW1haW5pbmctLTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBDbGVhbiB1cCBpbnRlcm1lZGlhdGUgdGVuc29ycy5cbiAgICBmb3IgKGNvbnN0IHRlbnNvckluZm8gb2YgdGVuc29yc1RvRGlzcG9zZSkge1xuICAgICAgICBpZiAodGVuc29ySW5mbyA9PT0gb3V0KSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHRlbnNvckluZm8pO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IGVpbnN1bUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBFaW5zdW0sXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogZWluc3VtXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RWluc3VtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVsdSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmNvbnN0IEVMVSA9IGByZXR1cm4gKHggPj0gMC4wKSA/IHggOiAoZXhwKHgpIC0gMS4wKTtgO1xuY29uc3QgRUxVX1BBQ0tFRCA9IGBcbiAgdmVjNCByZXN1bHQ7XG5cbiAgcmVzdWx0LnIgPSAoeC5yID49IDAuMCkgPyB4LnIgOiAoZXhwKHgucikgLSAxLjApO1xuICByZXN1bHQuZyA9ICh4LmcgPj0gMC4wKSA/IHguZyA6IChleHAoeC5nKSAtIDEuMCk7XG4gIHJlc3VsdC5iID0gKHguYiA+PSAwLjApID8geC5iIDogKGV4cCh4LmIpIC0gMS4wKTtcbiAgcmVzdWx0LmEgPSAoeC5hID49IDAuMCkgPyB4LmEgOiAoZXhwKHguYSkgLSAxLjApO1xuXG4gIHJldHVybiByZXN1bHQ7XG5gO1xuY29uc3QgZWx1ID0gdW5hcnlLZXJuZWxGdW5jKHsgb3BTbmlwcGV0OiBFTFUsIHBhY2tlZE9wU25pcHBldDogRUxVX1BBQ0tFRCB9KTtcbmV4cG9ydCBjb25zdCBlbHVDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRWx1LFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGVsdVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUVsdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFbHVHcmFkLCBlbnYgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgQmluYXJ5T3BQcm9ncmFtIH0gZnJvbSAnLi4vYmluYXJ5b3BfZ3B1JztcbmltcG9ydCB7IEJpbmFyeU9wUGFja2VkUHJvZ3JhbSB9IGZyb20gJy4uL2JpbmFyeW9wX3BhY2tlZF9ncHUnO1xuY29uc3QgRUxVX0RFUiA9IGByZXR1cm4gKGIgPj0gMS4wKSA/IGEgOiBhICogKGIgKyAxLjApO2A7XG5jb25zdCBFTFVfREVSX1BBQ0tFRCA9IGBcbiAgdmVjNCBiR1RFWmVybyA9IHZlYzQoZ3JlYXRlclRoYW5FcXVhbChiLCB2ZWM0KDAuKSkpO1xuICByZXR1cm4gKGJHVEVaZXJvICogYSkgKyAoKHZlYzQoMS4wKSAtIGJHVEVaZXJvKSAqIChhICogKGIgKyB2ZWM0KDEuMCkpKSk7XG5gO1xuZXhwb3J0IGNvbnN0IGVsdUdyYWQgPSAoYXJncykgPT4ge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgZHksIHkgfSA9IGlucHV0cztcbiAgICBjb25zdCBwcm9ncmFtID0gZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19CSU5BUllfT1BFUkFUSU9OUycpID9cbiAgICAgICAgbmV3IEJpbmFyeU9wUGFja2VkUHJvZ3JhbShFTFVfREVSX1BBQ0tFRCwgZHkuc2hhcGUsIHkuc2hhcGUpIDpcbiAgICAgICAgbmV3IEJpbmFyeU9wUHJvZ3JhbShFTFVfREVSLCBkeS5zaGFwZSwgeS5zaGFwZSk7XG4gICAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtkeSwgeV0sIGR5LmR0eXBlKTtcbn07XG5leHBvcnQgY29uc3QgZWx1R3JhZENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBFbHVHcmFkLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGVsdUdyYWRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FbHVHcmFkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVxdWFsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7IGVxdWFsSW1wbENQVSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuY29uc3QgUEFDS0VEX0VRVUFMID0gYFxuICByZXR1cm4gdmVjNChlcXVhbChhLCBiKSk7XG5gO1xuY29uc3QgRVFVQUwgPSBgcmV0dXJuIGZsb2F0KGEgPT0gYik7YDtcbmV4cG9ydCBjb25zdCBlcXVhbCA9IGJpbmFyeUtlcm5lbEZ1bmMoe1xuICAgIG9wU25pcHBldDogRVFVQUwsXG4gICAgcGFja2VkT3BTbmlwcGV0OiBQQUNLRURfRVFVQUwsXG4gICAgZHR5cGU6ICdib29sJyxcbiAgICBjcHVLZXJuZWxJbXBsOiBlcXVhbEltcGxDUFUsXG59KTtcbmV4cG9ydCBjb25zdCBlcXVhbENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBFcXVhbCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBlcXVhbFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUVxdWFsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgRXJmIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuY29uc3QgRVJGID0gYFxuICAvLyBFcnJvciBmdW5jdGlvbiBpcyBjYWxjdWxhdGVkIGFwcHJveGltYXRlbHkgd2l0aCBlbGVtZW50YXJ5IGZ1bmN0aW9uLlxuICAvLyBTZWUgXCJIYW5kYm9vayBvZiBNYXRoZW1hdGljYWwgRnVuY3Rpb25zIHdpdGggRm9ybXVsYXMsXG4gIC8vIEdyYXBocywgYW5kIE1hdGhlbWF0aWNhbCBUYWJsZXNcIiwgQWJyYW1vd2l0eiBhbmQgU3RlZ3VuLlxuICBmbG9hdCBwID0gJHtiYWNrZW5kX3V0aWwuRVJGX1B9O1xuICBmbG9hdCBhMSA9ICR7YmFja2VuZF91dGlsLkVSRl9BMX07XG4gIGZsb2F0IGEyID0gJHtiYWNrZW5kX3V0aWwuRVJGX0EyfTtcbiAgZmxvYXQgYTMgPSAke2JhY2tlbmRfdXRpbC5FUkZfQTN9O1xuICBmbG9hdCBhNCA9ICR7YmFja2VuZF91dGlsLkVSRl9BNH07XG4gIGZsb2F0IGE1ID0gJHtiYWNrZW5kX3V0aWwuRVJGX0E1fTtcblxuICBmbG9hdCBzaWduID0gc2lnbih4KTtcbiAgeCA9IGFicyh4KTtcbiAgZmxvYXQgdCA9IDEuMCAvICgxLjAgKyBwICogeCk7XG4gIHJldHVybiBzaWduICogKDEuMCAtICgoKCgoYTUqdCArIGE0KSp0KSArIGEzKSp0ICsgYTIpKnQgKyBhMSkqdCpleHAoLXgqeCkpO1xuYDtcbmV4cG9ydCBjb25zdCBlcmYgPSB1bmFyeUtlcm5lbEZ1bmMoeyBvcFNuaXBwZXQ6IEVSRiB9KTtcbmV4cG9ydCBjb25zdCBlcmZDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRXJmLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGVyZixcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FcmYuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRXhwIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHsgZXhwSW1wbENQVSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuZXhwb3J0IGNvbnN0IEVYUCA9IGByZXR1cm4gZXhwKHgpO2A7XG5leHBvcnQgY29uc3QgZXhwID0gdW5hcnlLZXJuZWxGdW5jKHsgb3BTbmlwcGV0OiBFWFAsIHBhY2tlZE9wU25pcHBldDogRVhQLCBjcHVLZXJuZWxJbXBsOiBleHBJbXBsQ1BVIH0pO1xuZXhwb3J0IGNvbnN0IGV4cENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBFeHAsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogZXhwXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RXhwLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFeHBhbmREaW1zLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuZXhwb3J0IGZ1bmN0aW9uIGV4cGFuZERpbXMoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBhdHRycywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IGRpbSB9ID0gYXR0cnM7XG4gICAgY29uc3QgeyBpbnB1dCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IGlucHV0UmFuayA9IGlucHV0LnNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBuZXdTaGFwZSA9IGlucHV0LnNoYXBlLnNsaWNlKCk7XG4gICAgbGV0ICRkaW0gPSBkaW07XG4gICAgaWYgKGRpbSA8IDApIHtcbiAgICAgICAgLy8gTmVnYXRpdmUgdmFsdWUgaXMgY291bnRlZCBmcm9tIHRoZSB0YWlsIG9mIHJhbmsuXG4gICAgICAgIHV0aWwuYXNzZXJ0KC0oaW5wdXRSYW5rICsgMSkgPD0gZGltLCAoKSA9PiBgQXhpcyBtdXN0IGJlIGluIHRoZSBpbnRlcnZhbCBbJHstKGlucHV0UmFuayArIDEpfSwgJHtpbnB1dFJhbmt9XWApO1xuICAgICAgICAkZGltID0gaW5wdXRSYW5rICsgZGltICsgMTtcbiAgICB9XG4gICAgbmV3U2hhcGUuc3BsaWNlKCRkaW0sIDAsIDEpO1xuICAgIHJldHVybiByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IGlucHV0IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBuZXdTaGFwZSB9IH0pO1xufVxuZXhwb3J0IGNvbnN0IGV4cGFuZERpbXNDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRXhwYW5kRGltcyxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBleHBhbmREaW1zLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUV4cGFuZERpbXMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRXhwbTEgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQgeyBleHBtMUltcGxDUFUgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmNvbnN0IEVYUE0xID0gYHJldHVybiBleHAoeCkgLSAxLjA7YDtcbmV4cG9ydCBjb25zdCBleHBtMSA9IHVuYXJ5S2VybmVsRnVuYyh7IG9wU25pcHBldDogRVhQTTEsIHBhY2tlZE9wU25pcHBldDogRVhQTTEsIGNwdUtlcm5lbEltcGw6IGV4cG0xSW1wbENQVSB9KTtcbmV4cG9ydCBjb25zdCBleHBtMUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBFeHBtMSxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBleHBtMVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUV4cG0xLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEZGVCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBmZnRJbXBsIH0gZnJvbSAnLi9GRlRfaW1wbCc7XG5leHBvcnQgZnVuY3Rpb24gZmZ0KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IGlucHV0IH0gPSBpbnB1dHM7XG4gICAgcmV0dXJuIGZmdEltcGwoaW5wdXQsIGZhbHNlIC8qIGludmVyc2UgKi8sIGJhY2tlbmQpO1xufVxuZXhwb3J0IGNvbnN0IGZmdENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBGRlQsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogZmZ0XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RkZULmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgRkZUUHJvZ3JhbSB9IGZyb20gJy4uL2ZmdF9ncHUnO1xuaW1wb3J0IHsgY29tcGxleCB9IGZyb20gJy4vQ29tcGxleCc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmV4cG9ydCBmdW5jdGlvbiBmZnRJbXBsKHgsIGludmVyc2UsIGJhY2tlbmQpIHtcbiAgICBjb25zdCB4RGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQoeC5kYXRhSWQpO1xuICAgIGNvbnN0IGlucHV0U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSh4LnNoYXBlKTtcbiAgICAvLyBDb2xsYXBzZSBhbGwgb3V0ZXIgZGltZW5zaW9ucyB0byBhIHNpbmdsZSBiYXRjaCBkaW1lbnNpb24uXG4gICAgY29uc3QgaW5uZXJEaW1lbnNpb25TaXplID0geC5zaGFwZVt4LnNoYXBlLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IGJhdGNoID0gaW5wdXRTaXplIC8gaW5uZXJEaW1lbnNpb25TaXplO1xuICAgIGNvbnN0IGlucHV0MkQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IFtiYXRjaCwgaW5uZXJEaW1lbnNpb25TaXplXSB9IH0pO1xuICAgIGNvbnN0IHhTaGFwZSA9IGlucHV0MkQuc2hhcGU7XG4gICAgY29uc3QgcmVhbFByb2dyYW0gPSBuZXcgRkZUUHJvZ3JhbSgncmVhbCcsIHhTaGFwZSwgaW52ZXJzZSk7XG4gICAgY29uc3QgaW1hZ1Byb2dyYW0gPSBuZXcgRkZUUHJvZ3JhbSgnaW1hZycsIHhTaGFwZSwgaW52ZXJzZSk7XG4gICAgY29uc3QgaW5wdXRzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgICBkYXRhSWQ6IHhEYXRhLmNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsLmRhdGFJZCxcbiAgICAgICAgICAgIGR0eXBlOiB4RGF0YS5jb21wbGV4VGVuc29ySW5mb3MucmVhbC5kdHlwZSxcbiAgICAgICAgICAgIHNoYXBlOiB4U2hhcGVcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgZGF0YUlkOiB4RGF0YS5jb21wbGV4VGVuc29ySW5mb3MuaW1hZy5kYXRhSWQsXG4gICAgICAgICAgICBkdHlwZTogeERhdGEuY29tcGxleFRlbnNvckluZm9zLmltYWcuZHR5cGUsXG4gICAgICAgICAgICBzaGFwZTogeFNoYXBlXG4gICAgICAgIH1cbiAgICBdO1xuICAgIGNvbnN0IHJlYWxQYXJ0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocmVhbFByb2dyYW0sIGlucHV0cywgJ2Zsb2F0MzInKTtcbiAgICBjb25zdCBpbWFnUGFydCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKGltYWdQcm9ncmFtLCBpbnB1dHMsICdmbG9hdDMyJyk7XG4gICAgY29uc3QgY29tcGxleE91dHB1dCA9IGNvbXBsZXgoeyBpbnB1dHM6IHsgcmVhbDogcmVhbFBhcnQsIGltYWc6IGltYWdQYXJ0IH0sIGJhY2tlbmQgfSk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZWFsUGFydCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpbWFnUGFydCk7XG4gICAgY29uc3QgY29tcGxleE91dHB1dFJlc2hhcGVkID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiBjb21wbGV4T3V0cHV0IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiB4LnNoYXBlIH0gfSk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpbnB1dDJEKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGNvbXBsZXhPdXRwdXQpO1xuICAgIHJldHVybiBjb21wbGV4T3V0cHV0UmVzaGFwZWQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GRlRfaW1wbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBGaWxsLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IEZpbGxQcm9ncmFtIH0gZnJvbSAnLi4vZmlsbF9ncHUnO1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGwoYXJncykge1xuICAgIGNvbnN0IHsgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBzaGFwZSwgdmFsdWUgfSA9IGF0dHJzO1xuICAgIGxldCB7IGR0eXBlIH0gPSBhdHRycztcbiAgICBkdHlwZSA9IGR0eXBlIHx8IHV0aWwuaW5mZXJEdHlwZSh2YWx1ZSk7XG4gICAgaWYgKGR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBTdHJpbmcgdHlwZSBzaG91bGQgYmUgaGFuZGxlZCBpbiBDUFUgbWVtb3J5LlxuICAgICAgICBjb25zdCB2YWx1ZXMgPSB1dGlsLmdldEFycmF5RnJvbURUeXBlKGR0eXBlLCB1dGlsLnNpemVGcm9tU2hhcGUoc2hhcGUpKTtcbiAgICAgICAgdmFsdWVzLmZpbGwodmFsdWUpO1xuICAgICAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhzaGFwZSwgZHR5cGUsIHZhbHVlcyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBwcm9ncmFtID0gbmV3IEZpbGxQcm9ncmFtKHNoYXBlLCB2YWx1ZSk7XG4gICAgICAgIGNvbnN0IGN1c3RvbVZhbHVlcyA9IFtbdmFsdWVdXTtcbiAgICAgICAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtdLCBkdHlwZSwgY3VzdG9tVmFsdWVzKTtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgZmlsbENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBGaWxsLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGZpbGxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GaWxsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEZsaXBMZWZ0UmlnaHQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgRmxpcExlZnRSaWdodFByb2dyYW0gfSBmcm9tICcuLi9mbGlwX2xlZnRfcmlnaHRfZ3B1JztcbmV4cG9ydCBjb25zdCBmbGlwTGVmdFJpZ2h0Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEZsaXBMZWZ0UmlnaHQsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogKHsgaW5wdXRzLCBiYWNrZW5kIH0pID0+IHtcbiAgICAgICAgY29uc3QgeyBpbWFnZSB9ID0gaW5wdXRzO1xuICAgICAgICBjb25zdCB3ZWJnbEJhY2tlbmQgPSBiYWNrZW5kO1xuICAgICAgICBjb25zdCBwcm9ncmFtID0gbmV3IEZsaXBMZWZ0UmlnaHRQcm9ncmFtKGltYWdlLnNoYXBlKTtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gd2ViZ2xCYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbaW1hZ2VdLCBpbWFnZS5kdHlwZSk7XG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZsaXBMZWZ0UmlnaHQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRmxvb3IgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQgeyBmbG9vckltcGxDUFUgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmNvbnN0IEZMT09SID0gYHJldHVybiBmbG9vcih4KTtgO1xuZXhwb3J0IGNvbnN0IGZsb29yID0gdW5hcnlLZXJuZWxGdW5jKHsgb3BTbmlwcGV0OiBGTE9PUiwgcGFja2VkT3BTbmlwcGV0OiBGTE9PUiwgY3B1S2VybmVsSW1wbDogZmxvb3JJbXBsQ1BVIH0pO1xuZXhwb3J0IGNvbnN0IGZsb29yQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEZsb29yLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGZsb29yLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZsb29yLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEZsb29yRGl2IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbi8vIFdlIHVzZSBuYXRpdmUgaW50ZWdlciBkaXZpc2lvbiB0byBkZWFsIHdpdGggZmxvYXRpbmcgcG9pbnQgaW1wcmVjaXNpb24uIFNpbmNlXG4vLyB3ZSBpbXBsZW1lbnQgZmxvb3IgZGl2aXNpb24gYW5kIGdsc2wgaW1wbGVtZW50cyB0cnVuY2F0ZWQgZGl2aXNpb24sIHdlXG4vLyBjb3JyZWN0IGZvciB0aGlzIGJ5IHN1YnRyYWN0aW5nIDEgZnJvbSByZXN1bHQgd2hlbiB0aGUgcmVzdWx0IGlzIG5lZ2F0aXZlIGFuZFxuLy8gdGhlcmUgaXMgYSByZW1haW5kZXIuXG5jb25zdCBJTlRfRElWID0gYFxuICBmbG9hdCBzID0gc2lnbihhKSAqIHNpZ24oYik7XG4gIGludCBpYSA9IHJvdW5kKGEpO1xuICBpbnQgaWIgPSByb3VuZChiKTtcbiAgaWYgKGliICE9IDApIHtcbiAgICAvLyBXaW5kb3dzIChEM0QpIHdhbnRzIGd1YXJhbnRlZWQgbm9uLXplcm8gaW50IGRpdmlzaW9uIGF0IGNvbXBpbGUtdGltZS5cbiAgICByZXR1cm4gZmxvYXQoaWRpdihpYSwgaWIsIHMpKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gTkFOO1xuICB9XG5gO1xuY29uc3QgSU5UX0RJVl9QQUNLRUQgPSBgXG4gIGl2ZWM0IGlhID0gcm91bmQoYSk7XG4gIGl2ZWM0IGliID0gcm91bmQoYik7XG4gIGJ2ZWM0IGNvbmQgPSBub3RFcXVhbChpYiwgaXZlYzQoMCkpO1xuICBpdmVjNCByZXN1bHQgPSBpdmVjNCgwKTtcbiAgdmVjNCBzID0gc2lnbihhKSAqIHNpZ24oYik7XG5cbiAgLy8gV2luZG93cyAoRDNEKSB3YW50cyBndWFyYW50ZWVkIG5vbi16ZXJvIGludCBkaXZpc2lvbiBhdCBjb21waWxlLXRpbWUuXG4gIGlmIChjb25kWzBdKSB7XG4gICAgcmVzdWx0WzBdID0gaWRpdihpYVswXSwgaWJbMF0sIHNbMF0pO1xuICB9XG4gIGlmIChjb25kWzFdKSB7XG4gICAgcmVzdWx0WzFdID0gaWRpdihpYVsxXSwgaWJbMV0sIHNbMV0pO1xuICB9XG4gIGlmIChjb25kWzJdKSB7XG4gICAgcmVzdWx0WzJdID0gaWRpdihpYVsyXSwgaWJbMl0sIHNbMl0pO1xuICB9XG4gIGlmIChjb25kWzNdKSB7XG4gICAgcmVzdWx0WzNdID0gaWRpdihpYVszXSwgaWJbM10sIHNbM10pO1xuICB9XG4gIHJldHVybiB2ZWM0KHJlc3VsdCk7XG5gO1xuZXhwb3J0IGNvbnN0IGZsb29yRGl2ID0gYmluYXJ5S2VybmVsRnVuYyh7IG9wU25pcHBldDogSU5UX0RJViwgcGFja2VkT3BTbmlwcGV0OiBJTlRfRElWX1BBQ0tFRCwgZHR5cGU6ICdpbnQzMicgfSk7XG5leHBvcnQgY29uc3QgZmxvb3JEaXZDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRmxvb3JEaXYsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogZmxvb3JEaXZcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GbG9vckRpdi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBlbnYgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgRnJvbVBpeGVscyB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBUZXh0dXJlVXNhZ2UgfSBmcm9tICcuLi90ZXhfdXRpbCc7XG5pbXBvcnQgeyBGcm9tUGl4ZWxzUHJvZ3JhbSB9IGZyb20gJy4vRnJvbVBpeGVsc191dGlscy9mcm9tX3BpeGVsc19ncHUnO1xuaW1wb3J0IHsgRnJvbVBpeGVsc1BhY2tlZFByb2dyYW0gfSBmcm9tICcuL0Zyb21QaXhlbHNfdXRpbHMvZnJvbV9waXhlbHNfcGFja2VkX2dwdSc7XG5leHBvcnQgY29uc3QgZnJvbVBpeGVsc0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBGcm9tUGl4ZWxzLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGZyb21QaXhlbHMsXG59O1xubGV0IGZyb21QaXhlbHMyRENvbnRleHQ7XG5mdW5jdGlvbiBmcm9tUGl4ZWxzKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgbGV0IHsgcGl4ZWxzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBudW1DaGFubmVscyB9ID0gYXR0cnM7XG4gICAgY29uc3QgaXNWaWRlbyA9IHR5cGVvZiAoSFRNTFZpZGVvRWxlbWVudCkgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIHBpeGVscyBpbnN0YW5jZW9mIEhUTUxWaWRlb0VsZW1lbnQ7XG4gICAgY29uc3QgaXNJbWFnZSA9IHR5cGVvZiAoSFRNTEltYWdlRWxlbWVudCkgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIHBpeGVscyBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQ7XG4gICAgY29uc3QgW3dpZHRoLCBoZWlnaHRdID0gaXNWaWRlbyA/XG4gICAgICAgIFtcbiAgICAgICAgICAgIHBpeGVscy52aWRlb1dpZHRoLFxuICAgICAgICAgICAgcGl4ZWxzLnZpZGVvSGVpZ2h0XG4gICAgICAgIF0gOlxuICAgICAgICBbcGl4ZWxzLndpZHRoLCBwaXhlbHMuaGVpZ2h0XTtcbiAgICBjb25zdCB0ZXhTaGFwZSA9IFtoZWlnaHQsIHdpZHRoXTtcbiAgICBjb25zdCBvdXRTaGFwZSA9IFtoZWlnaHQsIHdpZHRoLCBudW1DaGFubmVsc107XG4gICAgaWYgKGlzSW1hZ2UgfHwgaXNWaWRlbykge1xuICAgICAgICBpZiAoZnJvbVBpeGVsczJEQ29udGV4dCA9PSBudWxsKSB7XG4gICAgICAgICAgICBmcm9tUGl4ZWxzMkRDb250ZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJykuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgfVxuICAgICAgICBmcm9tUGl4ZWxzMkRDb250ZXh0LmNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgICAgICBmcm9tUGl4ZWxzMkRDb250ZXh0LmNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIGZyb21QaXhlbHMyRENvbnRleHQuZHJhd0ltYWdlKHBpeGVscywgMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIHBpeGVscyA9IGZyb21QaXhlbHMyRENvbnRleHQuY2FudmFzO1xuICAgIH1cbiAgICBjb25zdCB0ZW1wUGl4ZWxIYW5kbGUgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHRleFNoYXBlLCAnaW50MzInKTtcbiAgICAvLyBUaGlzIGlzIGEgYnl0ZSB0ZXh0dXJlIHdpdGggcGl4ZWxzLlxuICAgIGJhY2tlbmQudGV4RGF0YS5nZXQodGVtcFBpeGVsSGFuZGxlLmRhdGFJZCkudXNhZ2UgPSBUZXh0dXJlVXNhZ2UuUElYRUxTO1xuICAgIGJhY2tlbmQuZ3BncHUudXBsb2FkUGl4ZWxEYXRhVG9UZXh0dXJlKGJhY2tlbmQuZ2V0VGV4dHVyZSh0ZW1wUGl4ZWxIYW5kbGUuZGF0YUlkKSwgcGl4ZWxzKTtcbiAgICBjb25zdCBwcm9ncmFtID0gZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDSycpID9cbiAgICAgICAgbmV3IEZyb21QaXhlbHNQYWNrZWRQcm9ncmFtKG91dFNoYXBlKSA6XG4gICAgICAgIG5ldyBGcm9tUGl4ZWxzUHJvZ3JhbShvdXRTaGFwZSk7XG4gICAgY29uc3QgcmVzID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3RlbXBQaXhlbEhhbmRsZV0sICdpbnQzMicpO1xuICAgIGJhY2tlbmQuZGlzcG9zZURhdGEodGVtcFBpeGVsSGFuZGxlLmRhdGFJZCk7XG4gICAgcmV0dXJuIHJlcztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZyb21QaXhlbHMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZ2V0R2xzbERpZmZlcmVuY2VzIH0gZnJvbSAnLi4vLi4vZ2xzbF92ZXJzaW9uJztcbmV4cG9ydCBjbGFzcyBGcm9tUGl4ZWxzUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3Iob3V0cHV0U2hhcGUpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWydBJ107XG4gICAgICAgIGNvbnN0IGdsc2wgPSBnZXRHbHNsRGlmZmVyZW5jZXMoKTtcbiAgICAgICAgY29uc3QgW2hlaWdodCwgd2lkdGgsXSA9IG91dHB1dFNoYXBlO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGU7XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWMzIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgdGV4UiA9IGNvb3Jkc1swXTtcbiAgICAgICAgaW50IHRleEMgPSBjb29yZHNbMV07XG4gICAgICAgIGludCBkZXB0aCA9IGNvb3Jkc1syXTtcbiAgICAgICAgdmVjMiB1diA9ICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvIHZlYzIoJHt3aWR0aH0uMCwgJHtoZWlnaHR9LjApO1xuXG4gICAgICAgIHZlYzQgdmFsdWVzID0gJHtnbHNsLnRleHR1cmUyRH0oQSwgdXYpO1xuICAgICAgICBmbG9hdCB2YWx1ZTtcbiAgICAgICAgaWYgKGRlcHRoID09IDApIHtcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlcy5yO1xuICAgICAgICB9IGVsc2UgaWYgKGRlcHRoID09IDEpIHtcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlcy5nO1xuICAgICAgICB9IGVsc2UgaWYgKGRlcHRoID09IDIpIHtcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlcy5iO1xuICAgICAgICB9IGVsc2UgaWYgKGRlcHRoID09IDMpIHtcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlcy5hO1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0T3V0cHV0KGZsb29yKHZhbHVlICogMjU1LjAgKyAwLjUpKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZyb21fcGl4ZWxzX2dwdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBnZXRHbHNsRGlmZmVyZW5jZXMgfSBmcm9tICcuLi8uLi9nbHNsX3ZlcnNpb24nO1xuZXhwb3J0IGNsYXNzIEZyb21QaXhlbHNQYWNrZWRQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3RvcihvdXRwdXRTaGFwZSkge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgICAgICAgdGhpcy5wYWNrZWRJbnB1dHMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wYWNrZWRPdXRwdXQgPSB0cnVlO1xuICAgICAgICBjb25zdCBnbHNsID0gZ2V0R2xzbERpZmZlcmVuY2VzKCk7XG4gICAgICAgIGNvbnN0IFtoZWlnaHQsIHdpZHRoLF0gPSBvdXRwdXRTaGFwZTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IG91dHB1dFNoYXBlO1xuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMyBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IHRleFIgPSBjb29yZHNbMF07XG4gICAgICAgIGludCB0ZXhDID0gY29vcmRzWzFdO1xuICAgICAgICBpbnQgZGVwdGggPSBjb29yZHNbMl07XG5cbiAgICAgICAgdmVjNCByZXN1bHQgPSB2ZWM0KDAuKTtcblxuICAgICAgICBmb3IoaW50IHJvdz0wOyByb3c8PTE7IHJvdysrKSB7XG4gICAgICAgICAgZm9yKGludCBjb2w9MDsgY29sPD0xOyBjb2wrKykge1xuICAgICAgICAgICAgdGV4QyA9IGNvb3Jkc1sxXSArIHJvdztcbiAgICAgICAgICAgIGRlcHRoID0gY29vcmRzWzJdICsgY29sO1xuXG4gICAgICAgICAgICB2ZWMyIHV2ID0gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC9cbiAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3dpZHRofS4wLCAke2hlaWdodH0uMCk7XG4gICAgICAgICAgICB2ZWM0IHZhbHVlcyA9ICR7Z2xzbC50ZXh0dXJlMkR9KEEsIHV2KTtcbiAgICAgICAgICAgIGZsb2F0IHZhbHVlO1xuICAgICAgICAgICAgaWYgKGRlcHRoID09IDApIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZXMucjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVwdGggPT0gMSkge1xuICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlcy5nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkZXB0aCA9PSAyKSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gdmFsdWVzLmI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRlcHRoID09IDMpIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZXMuYTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzdWx0W3JvdyAqIDIgKyBjb2xdID0gZmxvb3IodmFsdWUgKiAyNTUuMCArIDAuNSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgJHtnbHNsLm91dHB1dH0gPSByZXN1bHQ7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mcm9tX3BpeGVsc19wYWNrZWRfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgZW52LCBGdXNlZENvbnYyRCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBDb252MkRQcm9ncmFtIH0gZnJvbSAnLi4vY29udl9ncHUnO1xuaW1wb3J0IHsgbWFwQWN0aXZhdGlvblRvU2hhZGVyUHJvZ3JhbSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHsgY29udjJkQnlNYXRNdWwsIGNvbnYyZFdpdGhJbTJSb3cgfSBmcm9tICcuL0NvbnYyRF9pbXBsJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuZXhwb3J0IGZ1bmN0aW9uIGZ1c2VkQ29udjJkKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4LCBmaWx0ZXIsIGJpYXMsIHByZWx1QWN0aXZhdGlvbldlaWdodHMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGlsYXRpb25zLCBkaW1Sb3VuZGluZ01vZGUsIGFjdGl2YXRpb24sIGxlYWt5cmVsdUFscGhhIH0gPSBhdHRycztcbiAgICBjb25zdCAkZGF0YUZvcm1hdCA9IGJhY2tlbmRfdXRpbC5jb252ZXJ0Q29udjJERGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyh4LnNoYXBlLCBmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGZhbHNlIC8qIGRlcHRod2lzZSAqLywgJGRhdGFGb3JtYXQpO1xuICAgIGxldCBvdXQ7XG4gICAgY29uc3QgaW50ZXJtZWRpYXRlcyA9IFtdO1xuICAgIGlmIChjb252SW5mby5maWx0ZXJIZWlnaHQgPT09IDEgJiYgY29udkluZm8uZmlsdGVyV2lkdGggPT09IDEgJiZcbiAgICAgICAgY29udkluZm8uZGlsYXRpb25IZWlnaHQgPT09IDEgJiYgY29udkluZm8uZGlsYXRpb25XaWR0aCA9PT0gMSAmJlxuICAgICAgICBjb252SW5mby5zdHJpZGVIZWlnaHQgPT09IDEgJiYgY29udkluZm8uc3RyaWRlV2lkdGggPT09IDEgJiZcbiAgICAgICAgKGNvbnZJbmZvLnBhZEluZm8udHlwZSA9PT0gJ1NBTUUnIHx8IGNvbnZJbmZvLnBhZEluZm8udHlwZSA9PT0gJ1ZBTElEJykpIHtcbiAgICAgICAgb3V0ID0gY29udjJkQnlNYXRNdWwoe1xuICAgICAgICAgICAgeCxcbiAgICAgICAgICAgIGZpbHRlcixcbiAgICAgICAgICAgIGNvbnZJbmZvLFxuICAgICAgICAgICAgYmFja2VuZCxcbiAgICAgICAgICAgIGJpYXMsXG4gICAgICAgICAgICBhY3RpdmF0aW9uLFxuICAgICAgICAgICAgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyxcbiAgICAgICAgICAgIGxlYWt5cmVsdUFscGhhXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChlbnYoKS5nZXRCb29sKCdXRUJHTF9DT05WX0lNMkNPTCcpICYmIHguc2hhcGVbMF0gPT09IDEpIHtcbiAgICAgICAgb3V0ID0gY29udjJkV2l0aEltMlJvdyh7XG4gICAgICAgICAgICB4LFxuICAgICAgICAgICAgZmlsdGVyLFxuICAgICAgICAgICAgY29udkluZm8sXG4gICAgICAgICAgICBiYWNrZW5kLFxuICAgICAgICAgICAgYmlhcyxcbiAgICAgICAgICAgIGFjdGl2YXRpb24sXG4gICAgICAgICAgICBwcmVsdUFjdGl2YXRpb25XZWlnaHRzLFxuICAgICAgICAgICAgbGVha3lyZWx1QWxwaGFcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBoYXNCaWFzID0gYmlhcyAhPSBudWxsO1xuICAgICAgICBjb25zdCBoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzID0gcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyAhPSBudWxsO1xuICAgICAgICBjb25zdCBoYXNMZWFreXJlbHVBbHBoYSA9IGFjdGl2YXRpb24gPT09ICdsZWFreXJlbHUnO1xuICAgICAgICBjb25zdCBmdXNlZEFjdGl2YXRpb24gPSBhY3RpdmF0aW9uID8gbWFwQWN0aXZhdGlvblRvU2hhZGVyUHJvZ3JhbShhY3RpdmF0aW9uLCBmYWxzZSkgOiBudWxsO1xuICAgICAgICBjb25zdCBwcm9ncmFtID0gbmV3IENvbnYyRFByb2dyYW0oY29udkluZm8sIGhhc0JpYXMsIGZ1c2VkQWN0aXZhdGlvbiwgaGFzUHJlbHVBY3RpdmF0aW9uV2VpZ2h0cywgaGFzTGVha3lyZWx1QWxwaGEpO1xuICAgICAgICBjb25zdCBpbnB1dHMgPSBbeCwgZmlsdGVyXTtcbiAgICAgICAgaWYgKGJpYXMpIHtcbiAgICAgICAgICAgIGlucHV0cy5wdXNoKGJpYXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcmVsdUFjdGl2YXRpb25XZWlnaHRzKSB7XG4gICAgICAgICAgICBpbnB1dHMucHVzaChwcmVsdUFjdGl2YXRpb25XZWlnaHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzTGVha3lyZWx1QWxwaGEpIHtcbiAgICAgICAgICAgIGNvbnN0ICRsZWFreXJlbHVBbHBoYSA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8oW10sICdmbG9hdDMyJywgdXRpbC5jcmVhdGVTY2FsYXJWYWx1ZShsZWFreXJlbHVBbHBoYSwgJ2Zsb2F0MzInKSk7XG4gICAgICAgICAgICBpbnB1dHMucHVzaCgkbGVha3lyZWx1QWxwaGEpO1xuICAgICAgICAgICAgaW50ZXJtZWRpYXRlcy5wdXNoKCRsZWFreXJlbHVBbHBoYSk7XG4gICAgICAgIH1cbiAgICAgICAgb3V0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgaW5wdXRzLCAnZmxvYXQzMicpO1xuICAgIH1cbiAgICBjb25zdCBvdXRSZXNoYXBlZCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogb3V0IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBjb252SW5mby5vdXRTaGFwZSB9IH0pO1xuICAgIGludGVybWVkaWF0ZXMucHVzaChvdXQpO1xuICAgIGludGVybWVkaWF0ZXMuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuICAgIHJldHVybiBvdXRSZXNoYXBlZDtcbn1cbmV4cG9ydCBjb25zdCBmdXNlZENvbnYyRENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBGdXNlZENvbnYyRCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBmdXNlZENvbnYyZCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GdXNlZENvbnYyRC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIGVudiwgRnVzZWREZXB0aHdpc2VDb252MkQsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgRGVwdGh3aXNlQ29udjJEUHJvZ3JhbSB9IGZyb20gJy4uL2NvbnZfZ3B1X2RlcHRod2lzZSc7XG5pbXBvcnQgeyBEZXB0aHdpc2VDb252UGFja2VkMkRQcm9ncmFtIH0gZnJvbSAnLi4vY29udl9wYWNrZWRfZ3B1X2RlcHRod2lzZSc7XG5pbXBvcnQgeyBtYXBBY3RpdmF0aW9uVG9TaGFkZXJQcm9ncmFtIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5leHBvcnQgZnVuY3Rpb24gZnVzZWREZXB0aHdpc2VDb252MkQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHgsIGZpbHRlciwgYmlhcywgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgc3RyaWRlcywgcGFkLCBkaWxhdGlvbnMsIGRpbVJvdW5kaW5nTW9kZSwgYWN0aXZhdGlvbiwgbGVha3lyZWx1QWxwaGEgfSA9IGF0dHJzO1xuICAgIGNvbnN0IGludGVybWVkaWF0ZXMgPSBbXTtcbiAgICBsZXQgJGRpbGF0aW9ucyA9IGRpbGF0aW9ucztcbiAgICBpZiAoJGRpbGF0aW9ucyA9PSBudWxsKSB7XG4gICAgICAgICRkaWxhdGlvbnMgPSBbMSwgMV07XG4gICAgfVxuICAgIHV0aWwuYXNzZXJ0KGJhY2tlbmRfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgJGRpbGF0aW9ucyksICgpID0+ICdFcnJvciBpbiBkZXB0aHdpc2VDb252MmQ6IEVpdGhlciBzdHJpZGVzIG9yIGRpbGF0aW9ucyBtdXN0IGJlICcgK1xuICAgICAgICBgMS4gR290IHN0cmlkZXMgJHtzdHJpZGVzfSBhbmQgZGlsYXRpb25zICckeyRkaWxhdGlvbnN9J2ApO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252MkRJbmZvKHguc2hhcGUsIGZpbHRlci5zaGFwZSwgc3RyaWRlcywgJGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIHRydWUgLyogZGVwdGh3aXNlICovKTtcbiAgICBjb25zdCBzaG91bGRQYWNrRGVwdGh3aXNlQ29udiA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfREVQVEhXSVNFQ09OVicpICYmXG4gICAgICAgIGNvbnZJbmZvLnN0cmlkZVdpZHRoIDw9IDIgJiZcbiAgICAgICAgY29udkluZm8ub3V0Q2hhbm5lbHMgLyBjb252SW5mby5pbkNoYW5uZWxzID09PSAxO1xuICAgIGNvbnN0IGZ1c2VkQWN0aXZhdGlvbiA9IGFjdGl2YXRpb24gP1xuICAgICAgICBtYXBBY3RpdmF0aW9uVG9TaGFkZXJQcm9ncmFtKGFjdGl2YXRpb24sIHNob3VsZFBhY2tEZXB0aHdpc2VDb252KSA6XG4gICAgICAgIG51bGw7XG4gICAgY29uc3QgcHJvZ3JhbUlucHV0cyA9IFt4LCBmaWx0ZXJdO1xuICAgIGNvbnN0IGhhc0JpYXMgPSBiaWFzICE9IG51bGw7XG4gICAgY29uc3QgaGFzUHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyA9IHByZWx1QWN0aXZhdGlvbldlaWdodHMgIT0gbnVsbDtcbiAgICBjb25zdCBoYXNMZWFreXJlbHVBbHBoYSA9IGFjdGl2YXRpb24gPT09ICdsZWFreXJlbHUnO1xuICAgIGlmIChoYXNCaWFzKSB7XG4gICAgICAgIHByb2dyYW1JbnB1dHMucHVzaChiaWFzKTtcbiAgICB9XG4gICAgaWYgKGhhc1ByZWx1QWN0aXZhdGlvbldlaWdodHMpIHtcbiAgICAgICAgcHJvZ3JhbUlucHV0cy5wdXNoKHByZWx1QWN0aXZhdGlvbldlaWdodHMpO1xuICAgIH1cbiAgICBpZiAoaGFzTGVha3lyZWx1QWxwaGEpIHtcbiAgICAgICAgY29uc3QgJGxlYWt5cmVsdUFscGhhID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbXSwgJ2Zsb2F0MzInLCB1dGlsLmNyZWF0ZVNjYWxhclZhbHVlKGxlYWt5cmVsdUFscGhhLCAnZmxvYXQzMicpKTtcbiAgICAgICAgcHJvZ3JhbUlucHV0cy5wdXNoKCRsZWFreXJlbHVBbHBoYSk7XG4gICAgICAgIGludGVybWVkaWF0ZXMucHVzaCgkbGVha3lyZWx1QWxwaGEpO1xuICAgIH1cbiAgICBsZXQgcHJvZ3JhbTtcbiAgICBpZiAoc2hvdWxkUGFja0RlcHRod2lzZUNvbnYpIHtcbiAgICAgICAgcHJvZ3JhbSA9IG5ldyBEZXB0aHdpc2VDb252UGFja2VkMkRQcm9ncmFtKGNvbnZJbmZvLCBoYXNCaWFzLCBmdXNlZEFjdGl2YXRpb24sIGhhc1ByZWx1QWN0aXZhdGlvbldlaWdodHMsIGhhc0xlYWt5cmVsdUFscGhhKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHByb2dyYW0gPSBuZXcgRGVwdGh3aXNlQ29udjJEUHJvZ3JhbShjb252SW5mbywgaGFzQmlhcywgZnVzZWRBY3RpdmF0aW9uLCBoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzLCBoYXNMZWFreXJlbHVBbHBoYSk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIHByb2dyYW1JbnB1dHMsICdmbG9hdDMyJyk7XG4gICAgaW50ZXJtZWRpYXRlcy5mb3JFYWNoKHQgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0KSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBjb25zdCBmdXNlZERlcHRod2lzZUNvbnYyRENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBGdXNlZERlcHRod2lzZUNvbnYyRCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBmdXNlZERlcHRod2lzZUNvbnYyRCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GdXNlZERlcHRod2lzZUNvbnYyRC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIEdhdGhlck5kLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IEdhdGhlck5EUHJvZ3JhbSB9IGZyb20gJy4uL2dhdGhlcl9uZF9ncHUnO1xuaW1wb3J0IHsgZ2F0aGVyTmRJbXBsQ1BVIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmV4cG9ydCBmdW5jdGlvbiBnYXRoZXJOZChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBwYXJhbXMsIGluZGljZXMgfSA9IGlucHV0cztcbiAgICBjb25zdCBpbmRpY2VzU2hhcGUgPSBpbmRpY2VzLnNoYXBlO1xuICAgIGNvbnN0IHNsaWNlUmFuayA9IGluZGljZXNTaGFwZVtpbmRpY2VzU2hhcGUubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgcGFyYW1zU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShwYXJhbXMuc2hhcGUpO1xuICAgIGNvbnN0IFtyZXN1bHRTaGFwZSwgbnVtU2xpY2VzLCBzbGljZVNpemUsIHN0cmlkZXNdID0gYmFja2VuZF91dGlsLnByZXBhcmVBbmRWYWxpZGF0ZShwYXJhbXMsIGluZGljZXMpO1xuICAgIGNvbnN0IGZsYXR0ZW5JbmRpY2VzID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiBpbmRpY2VzIH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBbbnVtU2xpY2VzLCBzbGljZVJhbmtdIH0gfSk7XG4gICAgY29uc3QgZmxhdHRlblggPSByZXNoYXBlKHtcbiAgICAgICAgaW5wdXRzOiB7IHg6IHBhcmFtcyB9LFxuICAgICAgICBiYWNrZW5kLFxuICAgICAgICBhdHRyczogeyBzaGFwZTogWyh1dGlsLnNpemVGcm9tU2hhcGUocGFyYW1zLnNoYXBlKSAvIHNsaWNlU2l6ZSksIHNsaWNlU2l6ZV0gfVxuICAgIH0pO1xuICAgIGlmIChiYWNrZW5kLnNob3VsZEV4ZWN1dGVPbkNQVShbcGFyYW1zLCBpbmRpY2VzXSkgfHxcbiAgICAgICAgcGFyYW1zLmR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCBpbmRpY2VzRGF0YSA9IGJhY2tlbmQucmVhZFN5bmMoaW5kaWNlcy5kYXRhSWQpO1xuICAgICAgICBjb25zdCBwYXJhbXNCdWYgPSBiYWNrZW5kLmJ1ZmZlclN5bmMocGFyYW1zKTtcbiAgICAgICAgY29uc3Qgb3V0VmFsdWUgPSBnYXRoZXJOZEltcGxDUFUoaW5kaWNlc0RhdGEsIHBhcmFtc0J1ZiwgcGFyYW1zLmR0eXBlLCBudW1TbGljZXMsIHNsaWNlUmFuaywgc2xpY2VTaXplLCBzdHJpZGVzLCBwYXJhbXMuc2hhcGUsIHBhcmFtc1NpemUpO1xuICAgICAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhyZXN1bHRTaGFwZSwgcGFyYW1zLmR0eXBlLCBvdXRWYWx1ZS52YWx1ZXMpO1xuICAgIH1cbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IEdhdGhlck5EUHJvZ3JhbShzbGljZVJhbmssIHN0cmlkZXMsIFtudW1TbGljZXMsIHNsaWNlU2l6ZV0pO1xuICAgIGNvbnN0IHJlcyA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtmbGF0dGVuWCwgZmxhdHRlbkluZGljZXNdLCBmbGF0dGVuWC5kdHlwZSk7XG4gICAgY29uc3QgcmVzaGFwZWQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHJlcyB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogcmVzdWx0U2hhcGUgfSB9KTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGZsYXR0ZW5JbmRpY2VzKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGZsYXR0ZW5YKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlcyk7XG4gICAgcmV0dXJuIHJlc2hhcGVkO1xufVxuZXhwb3J0IGNvbnN0IGdhdGhlck5kQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEdhdGhlck5kLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGdhdGhlck5kXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9R2F0aGVyTmQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBHYXRoZXJWMiwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBHYXRoZXJQcm9ncmFtIH0gZnJvbSAnLi4vZ2F0aGVyX2dwdSc7XG5pbXBvcnQgeyBnYXRoZXJWMkltcGxDUFUgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuZXhwb3J0IGZ1bmN0aW9uIGdhdGhlclYyKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4LCBpbmRpY2VzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBheGlzLCBiYXRjaERpbXMgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHBhcnNlZEF4aXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpWzBdO1xuICAgIGNvbnN0IHNoYXBlSW5mbyA9IGJhY2tlbmRfdXRpbC5zZWdtZW50X3V0aWwuY29sbGVjdEdhdGhlck9wU2hhcGVJbmZvKHgsIGluZGljZXMsIHBhcnNlZEF4aXMsIGJhdGNoRGltcyk7XG4gICAgY29uc3QgaW5kaWNlc1NpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoaW5kaWNlcy5zaGFwZSk7XG4gICAgY29uc3QgdG9EaXNwb3NlID0gW107XG4gICAgY29uc3QgZmxhdHRlblggPSByZXNoYXBlKHtcbiAgICAgICAgaW5wdXRzOiB7IHggfSxcbiAgICAgICAgYmFja2VuZCxcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgIHNoYXBlOiBbXG4gICAgICAgICAgICAgICAgc2hhcGVJbmZvLmJhdGNoU2l6ZSwgc2hhcGVJbmZvLm91dGVyU2l6ZSwgc2hhcGVJbmZvLmRpbVNpemUsXG4gICAgICAgICAgICAgICAgc2hhcGVJbmZvLnNsaWNlU2l6ZVxuICAgICAgICAgICAgXVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgZmxhdHRlbkluZGV4ID0gcmVzaGFwZSh7XG4gICAgICAgIGlucHV0czogeyB4OiBpbmRpY2VzIH0sXG4gICAgICAgIGJhY2tlbmQsXG4gICAgICAgIGF0dHJzOiB7IHNoYXBlOiBbc2hhcGVJbmZvLmJhdGNoU2l6ZSwgaW5kaWNlc1NpemUgLyBzaGFwZUluZm8uYmF0Y2hTaXplXSB9XG4gICAgfSk7XG4gICAgdG9EaXNwb3NlLnB1c2goZmxhdHRlblgpO1xuICAgIHRvRGlzcG9zZS5wdXNoKGZsYXR0ZW5JbmRleCk7XG4gICAgY29uc3QgZmxhdHRlbk91dHB1dFNoYXBlID0gW1xuICAgICAgICBzaGFwZUluZm8uYmF0Y2hTaXplLCBzaGFwZUluZm8ub3V0ZXJTaXplLCBpbmRpY2VzU2l6ZSAvIHNoYXBlSW5mby5iYXRjaFNpemUsXG4gICAgICAgIHNoYXBlSW5mby5zbGljZVNpemVcbiAgICBdO1xuICAgIGlmIChiYWNrZW5kLnNob3VsZEV4ZWN1dGVPbkNQVShbeCwgaW5kaWNlc10pIHx8IHguZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IGluZGljZXNCdWYgPSBiYWNrZW5kLmJ1ZmZlclN5bmMoZmxhdHRlbkluZGV4KTtcbiAgICAgICAgY29uc3QgeEJ1ZiA9IGJhY2tlbmQuYnVmZmVyU3luYyhmbGF0dGVuWCk7XG4gICAgICAgIGNvbnN0IG91dEJ1ZiA9IGdhdGhlclYySW1wbENQVSh4QnVmLCBpbmRpY2VzQnVmLCBmbGF0dGVuT3V0cHV0U2hhcGUpO1xuICAgICAgICB0b0Rpc3Bvc2UuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuICAgICAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhzaGFwZUluZm8ub3V0cHV0U2hhcGUsIG91dEJ1Zi5kdHlwZSwgb3V0QnVmLnZhbHVlcyk7XG4gICAgfVxuICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgR2F0aGVyUHJvZ3JhbShmbGF0dGVuWC5zaGFwZSwgZmxhdHRlbk91dHB1dFNoYXBlKTtcbiAgICBjb25zdCByZXMgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbZmxhdHRlblgsIGZsYXR0ZW5JbmRleF0sIGZsYXR0ZW5YLmR0eXBlKTtcbiAgICB0b0Rpc3Bvc2UucHVzaChyZXMpO1xuICAgIGNvbnN0IHJlc2hhcGVkID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiByZXMgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IHNoYXBlSW5mby5vdXRwdXRTaGFwZSB9IH0pO1xuICAgIHRvRGlzcG9zZS5mb3JFYWNoKHQgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0KSk7XG4gICAgcmV0dXJuIHJlc2hhcGVkO1xufVxuZXhwb3J0IGNvbnN0IGdhdGhlclYyQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEdhdGhlclYyLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGdhdGhlclYyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9R2F0aGVyVjIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgR3JlYXRlciB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBiaW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQgeyBncmVhdGVySW1wbENQVSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuY29uc3QgR1JFQVRFUiA9IGByZXR1cm4gZmxvYXQoYSA+IGIpO2A7XG5jb25zdCBHUkVBVEVSX1BBQ0tFRCA9IGBcbiAgcmV0dXJuIHZlYzQoZ3JlYXRlclRoYW4oYSwgYikpO1xuYDtcbmV4cG9ydCBjb25zdCBncmVhdGVyID0gYmluYXJ5S2VybmVsRnVuYyh7XG4gICAgb3BTbmlwcGV0OiBHUkVBVEVSLFxuICAgIHBhY2tlZE9wU25pcHBldDogR1JFQVRFUl9QQUNLRUQsXG4gICAgY3B1S2VybmVsSW1wbDogZ3JlYXRlckltcGxDUFUsXG4gICAgZHR5cGU6ICdib29sJ1xufSk7XG5leHBvcnQgY29uc3QgZ3JlYXRlckNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBHcmVhdGVyLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGdyZWF0ZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1HcmVhdGVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEdyZWF0ZXJFcXVhbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBiaW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQgeyBncmVhdGVyRXF1YWxJbXBsQ1BVIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5jb25zdCBHUkVBVEVSX0VRVUFMID0gYHJldHVybiBmbG9hdChhID49IGIpO2A7XG5jb25zdCBHUkVBVEVSX0VRVUFMX1BBQ0tFRCA9IGBcbiAgcmV0dXJuIHZlYzQoZ3JlYXRlclRoYW5FcXVhbChhLCBiKSk7XG5gO1xuZXhwb3J0IGNvbnN0IGdyZWF0ZXJFcXVhbCA9IGJpbmFyeUtlcm5lbEZ1bmMoe1xuICAgIG9wU25pcHBldDogR1JFQVRFUl9FUVVBTCxcbiAgICBwYWNrZWRPcFNuaXBwZXQ6IEdSRUFURVJfRVFVQUxfUEFDS0VELFxuICAgIGR0eXBlOiAnYm9vbCcsXG4gICAgY3B1S2VybmVsSW1wbDogZ3JlYXRlckVxdWFsSW1wbENQVVxufSk7XG5leHBvcnQgY29uc3QgZ3JlYXRlckVxdWFsQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEdyZWF0ZXJFcXVhbCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBncmVhdGVyRXF1YWxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1HcmVhdGVyRXF1YWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgSUZGVCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBmZnRJbXBsIH0gZnJvbSAnLi9GRlRfaW1wbCc7XG5leHBvcnQgZnVuY3Rpb24gaWZmdChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBpbnB1dCB9ID0gaW5wdXRzO1xuICAgIHJldHVybiBmZnRJbXBsKGlucHV0LCB0cnVlIC8qIGludmVyc2UgKi8sIGJhY2tlbmQpO1xufVxuZXhwb3J0IGNvbnN0IGlmZnRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogSUZGVCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBpZmZ0XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SUZGVC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBJZGVudGl0eSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHkoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGJhY2tlbmQuaW5jUmVmKHguZGF0YUlkKTtcbiAgICByZXR1cm4geyBkYXRhSWQ6IHguZGF0YUlkLCBzaGFwZTogeC5zaGFwZSwgZHR5cGU6IHguZHR5cGUgfTtcbn1cbmV4cG9ydCBjb25zdCBpZGVudGl0eUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBJZGVudGl0eSxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBpZGVudGl0eVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUlkZW50aXR5LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEltYWcgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgaWRlbnRpdHkgfSBmcm9tICcuL0lkZW50aXR5JztcbmV4cG9ydCBmdW5jdGlvbiBpbWFnKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IGlucHV0IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgaW5wdXREYXRhID0gYmFja2VuZC50ZXhEYXRhLmdldChpbnB1dC5kYXRhSWQpO1xuICAgIHJldHVybiBpZGVudGl0eSh7IGlucHV0czogeyB4OiBpbnB1dERhdGEuY29tcGxleFRlbnNvckluZm9zLmltYWcgfSwgYmFja2VuZCB9KTtcbn1cbmV4cG9ydCBjb25zdCBpbWFnQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEltYWcsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogaW1hZ1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUltYWcuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgSXNGaW5pdGUgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5jb25zdCBJU19GSU5JVEUgPSBgcmV0dXJuIGZsb2F0KCFpc25hbih4KSAmJiAhaXNpbmYoeCkpO2A7XG5leHBvcnQgY29uc3QgaXNGaW5pdGUgPSB1bmFyeUtlcm5lbEZ1bmMoeyBvcFNuaXBwZXQ6IElTX0ZJTklURSwgZHR5cGU6ICdib29sJyB9KTtcbmV4cG9ydCBjb25zdCBpc0Zpbml0ZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBJc0Zpbml0ZSxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBpc0Zpbml0ZSxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Jc0Zpbml0ZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBJc0luZiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmNvbnN0IElTX0lORiA9IGByZXR1cm4gZmxvYXQoaXNpbmYoeCkpO2A7XG5leHBvcnQgY29uc3QgaXNJbmYgPSB1bmFyeUtlcm5lbEZ1bmMoeyBvcFNuaXBwZXQ6IElTX0lORiwgZHR5cGU6ICdib29sJyB9KTtcbmV4cG9ydCBjb25zdCBpc0luZkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBJc0luZixcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBpc0luZixcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Jc0luZi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBJc05hbiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmNvbnN0IElTX05BTiA9IGByZXR1cm4gZmxvYXQoaXNuYW4oeCkpO2A7XG5leHBvcnQgY29uc3QgaXNOYU4gPSB1bmFyeUtlcm5lbEZ1bmMoeyBvcFNuaXBwZXQ6IElTX05BTiwgZHR5cGU6ICdib29sJyB9KTtcbmV4cG9ydCBjb25zdCBpc05hTkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBJc05hbixcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBpc05hTixcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Jc05hTi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBlbnYsIExSTiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBMUk5Qcm9ncmFtIH0gZnJvbSAnLi4vbHJuX2dwdSc7XG5pbXBvcnQgeyBMUk5QYWNrZWRQcm9ncmFtIH0gZnJvbSAnLi4vbHJuX3BhY2tlZF9ncHUnO1xuZXhwb3J0IGNvbnN0IGxybiA9IChhcmdzKSA9PiB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgZGVwdGhSYWRpdXMsIGJpYXMsIGFscGhhLCBiZXRhIH0gPSBhdHRycztcbiAgICBjb25zdCBwcm9ncmFtID0gZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19OT1JNQUxJWkFUSU9OJykgP1xuICAgICAgICBuZXcgTFJOUGFja2VkUHJvZ3JhbSh4LnNoYXBlLCBkZXB0aFJhZGl1cywgYmlhcywgYWxwaGEsIGJldGEpIDpcbiAgICAgICAgbmV3IExSTlByb2dyYW0oeC5zaGFwZSwgZGVwdGhSYWRpdXMsIGJpYXMsIGFscGhhLCBiZXRhKTtcbiAgICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3hdLCB4LmR0eXBlKTtcbn07XG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHZhcmlhYmxlLW5hbWVcbmV4cG9ydCBjb25zdCBMUk5Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTFJOLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGxyblxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxSTi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBMUk5HcmFkIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IExSTkdyYWRQcm9ncmFtIH0gZnJvbSAnLi4vbHJuX2dyYWRfZ3B1JztcbmV4cG9ydCBjb25zdCBscm5HcmFkID0gKGFyZ3MpID0+IHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4LCB5LCBkeSB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgZGVwdGhSYWRpdXMsIGJpYXMsIGFscGhhLCBiZXRhIH0gPSBhdHRycztcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IExSTkdyYWRQcm9ncmFtKHguc2hhcGUsIGRlcHRoUmFkaXVzLCBiaWFzLCBhbHBoYSwgYmV0YSk7XG4gICAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4LCB5LCBkeV0sIHguZHR5cGUpO1xufTtcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogdmFyaWFibGUtbmFtZVxuZXhwb3J0IGNvbnN0IExSTkdyYWRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTFJOR3JhZCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBscm5HcmFkXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TFJOR3JhZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBlbnYsIExlYWt5UmVsdSwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBCaW5hcnlPcFByb2dyYW0gfSBmcm9tICcuLi9iaW5hcnlvcF9ncHUnO1xuaW1wb3J0IHsgQmluYXJ5T3BQYWNrZWRQcm9ncmFtIH0gZnJvbSAnLi4vYmluYXJ5b3BfcGFja2VkX2dwdSc7XG5leHBvcnQgY29uc3QgTEVBS1lSRUxVID0gYHJldHVybiAoYSA8IDAuKSA/IGIgKiBhIDogYTtgO1xuZXhwb3J0IGNvbnN0IExFQUtZUkVMVV9QQUNLRUQgPSBgXG4gIHZlYzQgYUxlc3NUaGFuWmVybyA9IHZlYzQobGVzc1RoYW4oYSwgdmVjNCgwLikpKTtcbiAgcmV0dXJuIChhTGVzc1RoYW5aZXJvICogKGIgKiBhKSkgKyAoKHZlYzQoMS4wKSAtIGFMZXNzVGhhblplcm8pICogYSk7XG5gO1xuZXhwb3J0IGZ1bmN0aW9uIGxlYWt5UmVsdShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYWxwaGEgfSA9IGF0dHJzO1xuICAgIGNvbnN0ICRhbHBoYSA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8oW10sICdmbG9hdDMyJywgdXRpbC5jcmVhdGVTY2FsYXJWYWx1ZShhbHBoYSwgJ2Zsb2F0MzInKSk7XG4gICAgY29uc3QgcHJvZ3JhbSA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfQklOQVJZX09QRVJBVElPTlMnKSA/XG4gICAgICAgIG5ldyBCaW5hcnlPcFBhY2tlZFByb2dyYW0oTEVBS1lSRUxVX1BBQ0tFRCwgeC5zaGFwZSwgJGFscGhhLnNoYXBlKSA6XG4gICAgICAgIG5ldyBCaW5hcnlPcFByb2dyYW0oTEVBS1lSRUxVLCB4LnNoYXBlLCAkYWxwaGEuc2hhcGUpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4LCAkYWxwaGFdLCB4LmR0eXBlKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKCRhbHBoYSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBjb25zdCBsZWFreVJlbHVDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTGVha3lSZWx1LFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGxlYWt5UmVsdVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxlYWt5UmVsdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBMZXNzIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7IGxlc3NJbXBsQ1BVIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5jb25zdCBMRVNTID0gYHJldHVybiBmbG9hdChhIDwgYik7YDtcbmNvbnN0IExFU1NfUEFDS0VEID0gYFxuICByZXR1cm4gdmVjNChsZXNzVGhhbihhLCBiKSk7XG5gO1xuZXhwb3J0IGNvbnN0IGxlc3MgPSBiaW5hcnlLZXJuZWxGdW5jKHtcbiAgICBvcFNuaXBwZXQ6IExFU1MsXG4gICAgcGFja2VkT3BTbmlwcGV0OiBMRVNTX1BBQ0tFRCxcbiAgICBjcHVLZXJuZWxJbXBsOiBsZXNzSW1wbENQVSxcbiAgICBkdHlwZTogJ2Jvb2wnXG59KTtcbmV4cG9ydCBjb25zdCBsZXNzQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IExlc3MsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogbGVzc1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxlc3MuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTGVzc0VxdWFsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7IGxlc3NFcXVhbEltcGxDUFUgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmV4cG9ydCBjb25zdCBMRVNTX0VRVUFMID0gYHJldHVybiBmbG9hdChhIDw9IGIpO2A7XG5leHBvcnQgY29uc3QgTEVTU19FUVVBTF9QQUNLRUQgPSBgXG4gIHJldHVybiB2ZWM0KGxlc3NUaGFuRXF1YWwoYSwgYikpO1xuYDtcbmV4cG9ydCBjb25zdCBsZXNzRXF1YWwgPSBiaW5hcnlLZXJuZWxGdW5jKHtcbiAgICBvcFNuaXBwZXQ6IExFU1NfRVFVQUwsXG4gICAgcGFja2VkT3BTbmlwcGV0OiBMRVNTX0VRVUFMX1BBQ0tFRCxcbiAgICBjcHVLZXJuZWxJbXBsOiBsZXNzRXF1YWxJbXBsQ1BVLFxuICAgIGR0eXBlOiAnYm9vbCdcbn0pO1xuZXhwb3J0IGNvbnN0IGxlc3NFcXVhbENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBMZXNzRXF1YWwsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogbGVzc0VxdWFsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TGVzc0VxdWFsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IExpblNwYWNlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGxpblNwYWNlSW1wbENQVSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuZXhwb3J0IGZ1bmN0aW9uIGxpblNwYWNlKGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgc3RhcnQsIHN0b3AsIG51bSB9ID0gYXR0cnM7XG4gICAgLy8gVE9ETzogVXNlIENQVSBpbXBsZW1lbnRhdGlvbiBkdWUgdG8gdGhlIHByZWNpc2lvbiBwcm9ibGVtIGluIFNhZmFyaS5cbiAgICBjb25zdCBvdXRWYWxzID0gbGluU3BhY2VJbXBsQ1BVKHN0YXJ0LCBzdG9wLCBudW0pO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtvdXRWYWxzLmxlbmd0aF0sICdmbG9hdDMyJywgb3V0VmFscyk7XG59XG5leHBvcnQgY29uc3QgbGluU3BhY2VDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTGluU3BhY2UsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogbGluU3BhY2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1MaW5TcGFjZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBMb2cgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQgeyBsb2dJbXBsQ1BVIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5jb25zdCBMT0cgPSBgaWYgKHggPCAwLjApIHJldHVybiBOQU47XG4gIHJldHVybiBsb2coeCk7YDtcbmNvbnN0IExPR19QQUNLRUQgPSBgXG4gIHZlYzQgcmVzdWx0ID0gbG9nKHgpO1xuICB2ZWM0IGlzTmFOID0gdmVjNChsZXNzVGhhbih4LCB2ZWM0KDAuMCkpKTtcbiAgcmVzdWx0LnIgPSBpc05hTi5yID09IDEuMCA/IE5BTiA6IHJlc3VsdC5yO1xuICByZXN1bHQuZyA9IGlzTmFOLmcgPT0gMS4wID8gTkFOIDogcmVzdWx0Lmc7XG4gIHJlc3VsdC5iID0gaXNOYU4uYiA9PSAxLjAgPyBOQU4gOiByZXN1bHQuYjtcbiAgcmVzdWx0LmEgPSBpc05hTi5hID09IDEuMCA/IE5BTiA6IHJlc3VsdC5hO1xuXG4gIHJldHVybiByZXN1bHQ7XG5gO1xuZXhwb3J0IGNvbnN0IGxvZyA9IHVuYXJ5S2VybmVsRnVuYyh7IG9wU25pcHBldDogTE9HLCBwYWNrZWRPcFNuaXBwZXQ6IExPR19QQUNLRUQsIGNwdUtlcm5lbEltcGw6IGxvZ0ltcGxDUFUgfSk7XG5leHBvcnQgY29uc3QgbG9nQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IExvZyxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBsb2dcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Mb2cuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTG9nMXAgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5jb25zdCBMT0cxUCA9IGByZXR1cm4gbG9nKDEuMCArIHgpO2A7XG5leHBvcnQgY29uc3QgbG9nMXAgPSB1bmFyeUtlcm5lbEZ1bmMoeyBvcFNuaXBwZXQ6IExPRzFQIH0pO1xuZXhwb3J0IGNvbnN0IGxvZzFwQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IExvZzFwLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGxvZzFwLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxvZzFwLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IExvZ2ljYWxBbmQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYmluYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuY29uc3QgTE9HSUNBTF9BTkQgPSBgcmV0dXJuIGZsb2F0KGEgPj0gMS4wICYmIGIgPj0gMS4wKTtgO1xuY29uc3QgTE9HSUNBTF9BTkRfUEFDS0VEID0gYFxuICByZXR1cm4gdmVjNChcbiAgICB2ZWM0KGdyZWF0ZXJUaGFuRXF1YWwoYSwgdmVjNCgxLjApKSkgKlxuICAgIHZlYzQoZ3JlYXRlclRoYW5FcXVhbChiLCB2ZWM0KDEuMCkpKSk7XG5gO1xuZXhwb3J0IGNvbnN0IGxvZ2ljYWxBbmQgPSBiaW5hcnlLZXJuZWxGdW5jKHtcbiAgICBvcFNuaXBwZXQ6IExPR0lDQUxfQU5ELFxuICAgIHBhY2tlZE9wU25pcHBldDogTE9HSUNBTF9BTkRfUEFDS0VELFxuICAgIGR0eXBlOiAnYm9vbCdcbn0pO1xuZXhwb3J0IGNvbnN0IGxvZ2ljYWxBbmRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTG9naWNhbEFuZCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBsb2dpY2FsQW5kXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TG9naWNhbEFuZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBMb2dpY2FsTm90IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuY29uc3QgTE9HSUNBTF9OT1QgPSBgcmV0dXJuIGZsb2F0KCEoeCA+PSAxLjApKTtgO1xuZXhwb3J0IGNvbnN0IGxvZ2ljYWxOb3QgPSB1bmFyeUtlcm5lbEZ1bmMoeyBvcFNuaXBwZXQ6IExPR0lDQUxfTk9UIH0pO1xuZXhwb3J0IGNvbnN0IGxvZ2ljYWxOb3RDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTG9naWNhbE5vdCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBsb2dpY2FsTm90LFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxvZ2ljYWxOb3QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTG9naWNhbE9yIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmNvbnN0IExPR0lDQUxfT1IgPSBgcmV0dXJuIGZsb2F0KGEgPj0gMS4wIHx8IGIgPj0gMS4wKTtgO1xuY29uc3QgTE9HSUNBTF9PUl9QQUNLRUQgPSBgXG4gIHJldHVybiBtaW4oXG4gICAgdmVjNChncmVhdGVyVGhhbkVxdWFsKGEsIHZlYzQoMS4wKSkpICtcbiAgICB2ZWM0KGdyZWF0ZXJUaGFuRXF1YWwoYiwgdmVjNCgxLjApKSksXG4gICAgdmVjNCgxLjApKTtcbmA7XG5leHBvcnQgY29uc3QgbG9naWNhbE9yID0gYmluYXJ5S2VybmVsRnVuYyh7IG9wU25pcHBldDogTE9HSUNBTF9PUiwgcGFja2VkT3BTbmlwcGV0OiBMT0dJQ0FMX09SX1BBQ0tFRCwgZHR5cGU6ICdib29sJyB9KTtcbmV4cG9ydCBjb25zdCBsb2dpY2FsT3JDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTG9naWNhbE9yLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGxvZ2ljYWxPclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxvZ2ljYWxPci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBNYXggfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IG1heEltcGxDUFUgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmltcG9ydCB7IG1heEltcGwgfSBmcm9tICcuL01heF9pbXBsJztcbmltcG9ydCB7IHRyYW5zcG9zZUltcGwsIHRyYW5zcG9zZUltcGxDUFUgfSBmcm9tICcuL1RyYW5zcG9zZV9pbXBsJztcbmV4cG9ydCBmdW5jdGlvbiBtYXgoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHJlZHVjdGlvbkluZGljZXMsIGtlZXBEaW1zIH0gPSBhdHRycztcbiAgICBjb25zdCB4UmFuayA9IHguc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IG9yaWdBeGVzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShyZWR1Y3Rpb25JbmRpY2VzLCB4LnNoYXBlKTtcbiAgICBsZXQgYXhlcyA9IG9yaWdBeGVzO1xuICAgIGNvbnN0IHBlcm11dGVkQXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oYXhlcywgeFJhbmspO1xuICAgIGNvbnN0IG1heElucHV0SXNUcmFuc3Bvc2VkID0gcGVybXV0ZWRBeGVzICE9IG51bGw7XG4gICAgY29uc3Qgc2hvdWxkRXhlY3V0ZU9uQ1BVID0gYmFja2VuZC5zaG91bGRFeGVjdXRlT25DUFUoW3hdKTtcbiAgICBsZXQgbWF4SW5wdXQgPSB4O1xuICAgIGlmIChtYXhJbnB1dElzVHJhbnNwb3NlZCkge1xuICAgICAgICBpZiAoc2hvdWxkRXhlY3V0ZU9uQ1BVKSB7XG4gICAgICAgICAgICBjb25zdCB4VGV4RGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQobWF4SW5wdXQuZGF0YUlkKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IHhUZXhEYXRhLnZhbHVlcztcbiAgICAgICAgICAgIGNvbnN0IG5ld1NoYXBlID0gbmV3IEFycmF5KHhSYW5rKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3U2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBuZXdTaGFwZVtpXSA9IHguc2hhcGVbcGVybXV0ZWRBeGVzW2ldXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG1heElucHV0VmFsdWVzID0gdHJhbnNwb3NlSW1wbENQVSh2YWx1ZXMsIHguc2hhcGUsIHguZHR5cGUsIHBlcm11dGVkQXhlcywgbmV3U2hhcGUpO1xuICAgICAgICAgICAgbWF4SW5wdXQgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG5ld1NoYXBlLCB4LmR0eXBlKTtcbiAgICAgICAgICAgIGNvbnN0IG1heElucHV0RGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQobWF4SW5wdXQuZGF0YUlkKTtcbiAgICAgICAgICAgIG1heElucHV0RGF0YS52YWx1ZXMgPSBtYXhJbnB1dFZhbHVlcztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG1heElucHV0ID0gdHJhbnNwb3NlSW1wbCh4LCBwZXJtdXRlZEF4ZXMsIGJhY2tlbmQpO1xuICAgICAgICB9XG4gICAgICAgIGF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0SW5uZXJNb3N0QXhlcyhheGVzLmxlbmd0aCwgeFJhbmspO1xuICAgIH1cbiAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoJ21heCcsIGF4ZXMsIHhSYW5rKTtcbiAgICBjb25zdCBbbWF4T3V0U2hhcGUsIHJlZHVjZVNoYXBlXSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKG1heElucHV0LnNoYXBlLCBheGVzKTtcbiAgICBsZXQgb3V0U2hhcGUgPSBtYXhPdXRTaGFwZTtcbiAgICBpZiAoa2VlcERpbXMpIHtcbiAgICAgICAgLy8gcmF0aGVyIHRoYW4gcmVzaGFwZSBhdCB0aGUgZW5kLCBzZXQgdGhlIHRhcmdldCBzaGFwZSBoZXJlLlxuICAgICAgICBvdXRTaGFwZSA9IGJhY2tlbmRfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbShtYXhPdXRTaGFwZSwgb3JpZ0F4ZXMpO1xuICAgIH1cbiAgICBsZXQgb3V0O1xuICAgIGlmIChzaG91bGRFeGVjdXRlT25DUFUpIHtcbiAgICAgICAgY29uc3QgeFRleERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KG1heElucHV0LmRhdGFJZCk7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHhUZXhEYXRhLnZhbHVlcztcbiAgICAgICAgY29uc3Qgb3V0VmFsdWVzID0gbWF4SW1wbENQVSh2YWx1ZXMsIHV0aWwuc2l6ZUZyb21TaGFwZShyZWR1Y2VTaGFwZSksIG91dFNoYXBlLCB4LmR0eXBlKTtcbiAgICAgICAgb3V0ID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRTaGFwZSwgeC5kdHlwZSk7XG4gICAgICAgIGNvbnN0IG91dERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KG91dC5kYXRhSWQpO1xuICAgICAgICBvdXREYXRhLnZhbHVlcyA9IG91dFZhbHVlcztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIG91dCA9IG1heEltcGwobWF4SW5wdXQsIHJlZHVjZVNoYXBlLCBvdXRTaGFwZSwgYmFja2VuZCk7XG4gICAgfVxuICAgIGlmIChtYXhJbnB1dElzVHJhbnNwb3NlZCkge1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG1heElucHV0KTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBtYXhDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTWF4LFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IG1heFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1heC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIE1heFBvb2wsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgUG9vbDJEUHJvZ3JhbSB9IGZyb20gJy4uL3Bvb2xfZ3B1JztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi93ZWJnbF91dGlsJztcbmltcG9ydCB7IGlkZW50aXR5IH0gZnJvbSAnLi9JZGVudGl0eSc7XG5leHBvcnQgZnVuY3Rpb24gbWF4UG9vbChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ21heFBvb2wnKTtcbiAgICBjb25zdCB7IGZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlIH0gPSBhdHRycztcbiAgICBjb25zdCBkaWxhdGlvbnMgPSAxO1xuICAgIHV0aWwuYXNzZXJ0KGJhY2tlbmRfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgZGlsYXRpb25zKSwgKCkgPT4gJ0Vycm9yIGluIG1heFBvb2w6IEVpdGhlciBzdHJpZGVzIG9yIGRpbGF0aW9ucyBtdXN0IGJlIDEuICcgK1xuICAgICAgICBgR290IHN0cmlkZXMgJHtzdHJpZGVzfSBhbmQgZGlsYXRpb25zICcke2RpbGF0aW9uc30nYCk7XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wyREluZm8oeC5zaGFwZSwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSk7XG4gICAgaWYgKGNvbnZJbmZvLmZpbHRlcldpZHRoID09PSAxICYmIGNvbnZJbmZvLmZpbHRlckhlaWdodCA9PT0gMSAmJlxuICAgICAgICB1dGlsLmFycmF5c0VxdWFsKGNvbnZJbmZvLmluU2hhcGUsIGNvbnZJbmZvLm91dFNoYXBlKSkge1xuICAgICAgICByZXR1cm4gaWRlbnRpdHkoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kIH0pO1xuICAgIH1cbiAgICBjb25zdCBtYXhQb29sUHJvZ3JhbSA9IG5ldyBQb29sMkRQcm9ncmFtKGNvbnZJbmZvLCAnbWF4JywgZmFsc2UpO1xuICAgIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShtYXhQb29sUHJvZ3JhbSwgW3hdLCB4LmR0eXBlKTtcbn1cbmV4cG9ydCBjb25zdCBtYXhQb29sQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE1heFBvb2wsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogbWF4UG9vbFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1heFBvb2wuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBNYXhQb29sM0QgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgUG9vbDNEUHJvZ3JhbSB9IGZyb20gJy4uL3Bvb2xfZ3B1JztcbmV4cG9ydCBmdW5jdGlvbiBtYXhQb29sM2QoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGltUm91bmRpbmdNb2RlIH0gPSBhdHRycztcbiAgICBjb25zdCBkaWxhdGlvbnMgPSBbMSwgMSwgMV07XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wzREluZm8oeC5zaGFwZSwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgZGF0YUZvcm1hdCk7XG4gICAgY29uc3QgbWF4UG9vbFByb2dyYW0gPSBuZXcgUG9vbDNEUHJvZ3JhbShjb252SW5mbywgJ21heCcsIGZhbHNlKTtcbiAgICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0obWF4UG9vbFByb2dyYW0sIFt4XSwgeC5kdHlwZSk7XG59XG5leHBvcnQgY29uc3QgbWF4UG9vbDNEQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE1heFBvb2wzRCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBtYXhQb29sM2Rcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NYXhQb29sM0QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBNYXhQb29sM0RHcmFkIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IE1heFBvb2wzREJhY2twcm9wUHJvZ3JhbSB9IGZyb20gJy4uL21heF9wb29sX2JhY2twcm9wX2dwdSc7XG5pbXBvcnQgeyBQb29sM0RQcm9ncmFtIH0gZnJvbSAnLi4vcG9vbF9ncHUnO1xuZXhwb3J0IGZ1bmN0aW9uIG1heFBvb2wzREdyYWQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGR5LCBpbnB1dCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHggPSBpbnB1dDtcbiAgICBjb25zdCB7IGZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlIH0gPSBhdHRycztcbiAgICBjb25zdCBkaWxhdGlvbnMgPSBbMSwgMSwgMV07XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wzREluZm8oeC5zaGFwZSwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSk7XG4gICAgY29uc3QgbWF4UG9vbDNkUG9zaXRpb25zUHJvZ3JhbSA9IG5ldyBQb29sM0RQcm9ncmFtKGNvbnZJbmZvLCAnbWF4JywgdHJ1ZSAvKiBnZXQgcG9zaXRpb25zICovKTtcbiAgICBjb25zdCBtYXhQb29sM2RQb3NpdGlvbnMgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShtYXhQb29sM2RQb3NpdGlvbnNQcm9ncmFtLCBbeF0sIHguZHR5cGUpO1xuICAgIGNvbnN0IG1heFBvb2xCYWNrcHJvcFByb2dyYW0gPSBuZXcgTWF4UG9vbDNEQmFja3Byb3BQcm9ncmFtKGNvbnZJbmZvKTtcbiAgICBjb25zdCByZXN1bHQgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShtYXhQb29sQmFja3Byb3BQcm9ncmFtLCBbZHksIG1heFBvb2wzZFBvc2l0aW9uc10sIHguZHR5cGUpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8obWF4UG9vbDNkUG9zaXRpb25zKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGNvbnN0IG1heFBvb2xHcmFkM0RDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTWF4UG9vbDNER3JhZCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBtYXhQb29sM0RHcmFkXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWF4UG9vbDNER3JhZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIE1heFBvb2xHcmFkIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IE1heFBvb2wyREJhY2twcm9wUHJvZ3JhbSB9IGZyb20gJy4uL21heF9wb29sX2JhY2twcm9wX2dwdSc7XG5pbXBvcnQgeyBQb29sMkRQcm9ncmFtIH0gZnJvbSAnLi4vcG9vbF9ncHUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL3dlYmdsX3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIG1heFBvb2xHcmFkKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBkeSwgaW5wdXQsIG91dHB1dCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHggPSBpbnB1dDtcbiAgICBhc3NlcnROb3RDb21wbGV4KFtpbnB1dCwgb3V0cHV0XSwgJ21heFBvb2xHcmFkJyk7XG4gICAgY29uc3QgeyBmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSB9ID0gYXR0cnM7XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wyREluZm8oeC5zaGFwZSwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgMSAvKiBkaWxhdGlvbnMgKi8sIHBhZCwgZGltUm91bmRpbmdNb2RlKTtcbiAgICBjb25zdCBnZXRQb3NpdGlvbnMgPSB0cnVlO1xuICAgIGNvbnN0IG1heFBvb2xQb3NpdGlvbnNQcm9ncmFtID0gbmV3IFBvb2wyRFByb2dyYW0oY29udkluZm8sICdtYXgnLCBnZXRQb3NpdGlvbnMpO1xuICAgIGNvbnN0IG1heFBvb2xQb3NpdGlvbnMgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShtYXhQb29sUG9zaXRpb25zUHJvZ3JhbSwgW3hdLCB4LmR0eXBlKTtcbiAgICBjb25zdCBtYXhQb29sQmFja1Byb3BQcm9ncmFtID0gbmV3IE1heFBvb2wyREJhY2twcm9wUHJvZ3JhbShjb252SW5mbyk7XG4gICAgY29uc3QgcmVzdWx0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0obWF4UG9vbEJhY2tQcm9wUHJvZ3JhbSwgW2R5LCBtYXhQb29sUG9zaXRpb25zXSwgeC5kdHlwZSk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhtYXhQb29sUG9zaXRpb25zKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGNvbnN0IG1heFBvb2xHcmFkQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE1heFBvb2xHcmFkLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IG1heFBvb2xHcmFkXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWF4UG9vbEdyYWQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTWF4UG9vbFdpdGhBcmdtYXggfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IG1heFBvb2xXaXRoQXJnbWF4SW1wbCB9IGZyb20gJy4vTWF4UG9vbFdpdGhBcmdtYXhfaW1wbCc7XG5leHBvcnQgY29uc3QgbWF4UG9vbFdpdGhBcmdtYXhDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTWF4UG9vbFdpdGhBcmdtYXgsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogKHsgaW5wdXRzLCBhdHRycywgYmFja2VuZCB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgICAgICBjb25zdCB7IGZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgaW5jbHVkZUJhdGNoSW5JbmRleCB9ID0gYXR0cnM7XG4gICAgICAgIGNvbnN0IHdlYmdsQmFja2VuZCA9IGJhY2tlbmQ7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHguc2hhcGUubGVuZ3RoID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gbWF4UG9vbDogaW5wdXQgbXVzdCBiZSByYW5rIDQgYnV0IGdvdCByYW5rICR7eC5zaGFwZS5sZW5ndGh9LmApO1xuICAgICAgICBjb25zdCBkaWxhdGlvbnMgPSBbMSwgMV07XG4gICAgICAgIHV0aWwuYXNzZXJ0KGJhY2tlbmRfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgZGlsYXRpb25zKSwgKCkgPT4gJ0Vycm9yIGluIG1heFBvb2w6IEVpdGhlciBzdHJpZGVzIG9yIGRpbGF0aW9ucyBtdXN0IGJlIDEuICcgK1xuICAgICAgICAgICAgYEdvdCBzdHJpZGVzICR7c3RyaWRlc30gYW5kIGRpbGF0aW9ucyAnJHtkaWxhdGlvbnN9J2ApO1xuICAgICAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlUG9vbDJESW5mbyh4LnNoYXBlLCBmaWx0ZXJTaXplLCBzdHJpZGVzLCBkaWxhdGlvbnMsIHBhZCk7XG4gICAgICAgIGNvbnN0IFtyZXN1bHQsIGluZGV4ZXNdID0gbWF4UG9vbFdpdGhBcmdtYXhJbXBsKHgsIGluY2x1ZGVCYXRjaEluSW5kZXgsIGNvbnZJbmZvLCB3ZWJnbEJhY2tlbmQpO1xuICAgICAgICByZXR1cm4gW3Jlc3VsdCwgaW5kZXhlc107XG4gICAgfVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1heFBvb2xXaXRoQXJnbWF4LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFBvb2wyRFByb2dyYW0gfSBmcm9tICcuLi9wb29sX2dwdSc7XG5leHBvcnQgZnVuY3Rpb24gbWF4UG9vbFdpdGhBcmdtYXhJbXBsKHgsIGluY2x1ZGVCYXRjaEluSW5kZXgsIGNvbnZJbmZvLCBiYWNrZW5kKSB7XG4gICAgbGV0IHByb2dyYW0gPSBuZXcgUG9vbDJEUHJvZ3JhbShjb252SW5mbywgJ21heCcsIGZhbHNlKTtcbiAgICBjb25zdCBwb29sT3V0cHV0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3hdLCAnZmxvYXQzMicpO1xuICAgIHByb2dyYW0gPSBuZXcgUG9vbDJEUHJvZ3JhbShjb252SW5mbywgJ21heCcsIHRydWUsIHRydWUsIGluY2x1ZGVCYXRjaEluSW5kZXgpO1xuICAgIGNvbnN0IGluZGV4T3V0cHV0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3hdLCAnZmxvYXQzMicpO1xuICAgIHJldHVybiBbcG9vbE91dHB1dCwgaW5kZXhPdXRwdXRdO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWF4UG9vbFdpdGhBcmdtYXhfaW1wbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHJlZHVjZSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9yZWR1Y2UnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4uL2tlcm5lbHMvUmVzaGFwZSc7XG5leHBvcnQgZnVuY3Rpb24gbWF4SW1wbCh4LCByZWR1Y2VTaGFwZSwgb3V0U2hhcGUsIGJhY2tlbmQpIHtcbiAgICBjb25zdCBpblNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuICAgIGNvbnN0IHhTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHguc2hhcGUpO1xuICAgIGNvbnN0IGJhdGNoU2l6ZSA9IHhTaXplIC8gaW5TaXplO1xuICAgIGNvbnN0IHJlc2hhcGVkSW5wdXQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHggfSwgYXR0cnM6IHsgc2hhcGU6IFtiYXRjaFNpemUsIGluU2l6ZV0gfSwgYmFja2VuZCB9KTtcbiAgICBjb25zdCByZWR1Y2VkID0gcmVkdWNlKHJlc2hhcGVkSW5wdXQsIHguZHR5cGUsICdtYXgnLCBiYWNrZW5kKTtcbiAgICBjb25zdCByZXNoYXBlZE91dHB1dCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogcmVkdWNlZCB9LCBhdHRyczogeyBzaGFwZTogb3V0U2hhcGUgfSwgYmFja2VuZCB9KTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc2hhcGVkSW5wdXQpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVkdWNlZCk7XG4gICAgcmV0dXJuIHJlc2hhcGVkT3V0cHV0O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWF4X2ltcGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTWF4aW11bSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBDSEVDS19OQU5fU05JUFBFVCB9IGZyb20gJy4uL2JpbmFyeW9wX2dwdSc7XG5pbXBvcnQgeyBDSEVDS19OQU5fU05JUFBFVCBhcyBDSEVDS19OQU5fU05JUFBFVF9QQUNLRUQgfSBmcm9tICcuLi9iaW5hcnlvcF9wYWNrZWRfZ3B1JztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7IG1heGltdW1JbXBsQ1BVIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5jb25zdCBNQVhJTVVNID0gQ0hFQ0tfTkFOX1NOSVBQRVQgKyBgXG4gIHJldHVybiBtYXgoYSwgYik7XG5gO1xuY29uc3QgTUFYSU1VTV9QQUNLRUQgPSBgXG4gIHZlYzQgcmVzdWx0ID0gdmVjNChtYXgoYSwgYikpO1xuICB2ZWM0IGlzTmFOID0gbWluKHZlYzQoaXNuYW4oYSkpICsgdmVjNChpc25hbihiKSksIHZlYzQoMS4wKSk7XG4gIGAgK1xuICAgIENIRUNLX05BTl9TTklQUEVUX1BBQ0tFRCArIGBcbiAgcmV0dXJuIHJlc3VsdDtcbmA7XG5leHBvcnQgY29uc3QgbWF4aW11bSA9IGJpbmFyeUtlcm5lbEZ1bmMoe1xuICAgIG9wU25pcHBldDogTUFYSU1VTSxcbiAgICBwYWNrZWRPcFNuaXBwZXQ6IE1BWElNVU1fUEFDS0VELFxuICAgIGNwdUtlcm5lbEltcGw6IG1heGltdW1JbXBsQ1BVXG59KTtcbmV4cG9ydCBjb25zdCBtYXhpbXVtQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE1heGltdW0sXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogbWF4aW11bVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1heGltdW0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBNZWFuLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IG1lYW5JbXBsIH0gZnJvbSAnLi9NZWFuX2ltcGwnO1xuaW1wb3J0IHsgdHJhbnNwb3NlSW1wbCwgdHJhbnNwb3NlSW1wbENQVSB9IGZyb20gJy4vVHJhbnNwb3NlX2ltcGwnO1xuZXhwb3J0IGNvbnN0IG1lYW5Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTWVhbixcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiAoeyBpbnB1dHMsIGF0dHJzLCBiYWNrZW5kIH0pID0+IHtcbiAgICAgICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgICAgIGNvbnN0IHsga2VlcERpbXMsIGF4aXMgfSA9IGF0dHJzO1xuICAgICAgICBjb25zdCB3ZWJnbEJhY2tlbmQgPSBiYWNrZW5kO1xuICAgICAgICBjb25zdCB4UmFuayA9IHguc2hhcGUubGVuZ3RoO1xuICAgICAgICBjb25zdCBvcmlnQXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG4gICAgICAgIGxldCBheGVzID0gb3JpZ0F4ZXM7XG4gICAgICAgIGNvbnN0IHBlcm11dGVkQXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oYXhlcywgeFJhbmspO1xuICAgICAgICBjb25zdCBtZWFuSW5wdXRJc1RyYW5zcG9zZWQgPSBwZXJtdXRlZEF4ZXMgIT0gbnVsbDtcbiAgICAgICAgY29uc3Qgc2hvdWxkRXhlY3V0ZU9uQ1BVID0gd2ViZ2xCYWNrZW5kLnNob3VsZEV4ZWN1dGVPbkNQVShbeF0pO1xuICAgICAgICBjb25zdCBpbnRlcm1lZGlhdGVzID0gW107XG4gICAgICAgIGxldCBtZWFuSW5wdXQgPSB4O1xuICAgICAgICBpZiAobWVhbklucHV0SXNUcmFuc3Bvc2VkKSB7XG4gICAgICAgICAgICBpZiAoc2hvdWxkRXhlY3V0ZU9uQ1BVKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeFRleERhdGEgPSB3ZWJnbEJhY2tlbmQudGV4RGF0YS5nZXQobWVhbklucHV0LmRhdGFJZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVzID0geFRleERhdGEudmFsdWVzO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1NoYXBlID0gbmV3IEFycmF5KHhSYW5rKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld1NoYXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld1NoYXBlW2ldID0geC5zaGFwZVtwZXJtdXRlZEF4ZXNbaV1dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBtZWFuSW5wdXRWYWx1ZXMgPSB0cmFuc3Bvc2VJbXBsQ1BVKHZhbHVlcywgeC5zaGFwZSwgeC5kdHlwZSwgcGVybXV0ZWRBeGVzLCBuZXdTaGFwZSk7XG4gICAgICAgICAgICAgICAgbWVhbklucHV0ID0gd2ViZ2xCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG5ld1NoYXBlLCB4LmR0eXBlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtZWFuSW5wdXREYXRhID0gd2ViZ2xCYWNrZW5kLnRleERhdGEuZ2V0KG1lYW5JbnB1dC5kYXRhSWQpO1xuICAgICAgICAgICAgICAgIG1lYW5JbnB1dERhdGEudmFsdWVzID0gbWVhbklucHV0VmFsdWVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbWVhbklucHV0ID0gdHJhbnNwb3NlSW1wbCh4LCBwZXJtdXRlZEF4ZXMsIHdlYmdsQmFja2VuZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbnRlcm1lZGlhdGVzLnB1c2gobWVhbklucHV0KTtcbiAgICAgICAgICAgIGF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0SW5uZXJNb3N0QXhlcyhheGVzLmxlbmd0aCwgeFJhbmspO1xuICAgICAgICB9XG4gICAgICAgIGJhY2tlbmRfdXRpbC5hc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcygnc3VtJywgYXhlcywgeFJhbmspO1xuICAgICAgICBjb25zdCBbbWVhbk91dFNoYXBlLCByZWR1Y2VTaGFwZV0gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcyhtZWFuSW5wdXQuc2hhcGUsIGF4ZXMpO1xuICAgICAgICBsZXQgb3V0U2hhcGUgPSBtZWFuT3V0U2hhcGU7XG4gICAgICAgIGlmIChrZWVwRGltcykge1xuICAgICAgICAgICAgLy8gcmF0aGVyIHRoYW4gcmVzaGFwZSBhdCB0aGUgZW5kLCBzZXQgdGhlIHRhcmdldCBzaGFwZSBoZXJlLlxuICAgICAgICAgICAgb3V0U2hhcGUgPSBiYWNrZW5kX3V0aWwuZXhwYW5kU2hhcGVUb0tlZXBEaW0obWVhbk91dFNoYXBlLCBvcmlnQXhlcyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3V0ID0gbWVhbkltcGwobWVhbklucHV0LCByZWR1Y2VTaGFwZSwgb3V0U2hhcGUsIHdlYmdsQmFja2VuZCk7XG4gICAgICAgIGZvciAoY29uc3QgaSBvZiBpbnRlcm1lZGlhdGVzKSB7XG4gICAgICAgICAgICB3ZWJnbEJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWVhbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHJlZHVjZSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9yZWR1Y2UnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4uL2tlcm5lbHMvUmVzaGFwZSc7XG5leHBvcnQgZnVuY3Rpb24gbWVhbkltcGwoeCwgcmVkdWNlU2hhcGUsIG91dFNoYXBlLCBiYWNrZW5kKSB7XG4gICAgY29uc3QgaW5TaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcbiAgICBjb25zdCB4U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSh4LnNoYXBlKTtcbiAgICBjb25zdCBiYXRjaFNpemUgPSB4U2l6ZSAvIGluU2l6ZTtcbiAgICBjb25zdCByZXNoYXBlZElucHV0ID0gcmVzaGFwZSh7IGlucHV0czogeyB4IH0sIGF0dHJzOiB7IHNoYXBlOiBbYmF0Y2hTaXplLCBpblNpemVdIH0sIGJhY2tlbmQgfSk7XG4gICAgY29uc3QgcmVkdWNlZCA9IHJlZHVjZShyZXNoYXBlZElucHV0LCAnZmxvYXQzMicsICdtZWFuJywgYmFja2VuZCk7XG4gICAgY29uc3QgcmVzaGFwZWRPdXRwdXQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHJlZHVjZWQgfSwgYXR0cnM6IHsgc2hhcGU6IG91dFNoYXBlIH0sIGJhY2tlbmQgfSk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXNoYXBlZElucHV0KTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlZHVjZWQpO1xuICAgIHJldHVybiByZXNoYXBlZE91dHB1dDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1lYW5faW1wbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIE1pbiwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyByZWR1Y2UgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvcmVkdWNlJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHsgdHJhbnNwb3NlIH0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuZXhwb3J0IGZ1bmN0aW9uIG1pbihhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYXhpcywga2VlcERpbXMgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3Qgb3JpZ0F4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpO1xuICAgIGxldCBheGVzID0gb3JpZ0F4ZXM7XG4gICAgY29uc3QgcGVybXV0ZWRBeGVzID0gYmFja2VuZF91dGlsLmdldEF4ZXNQZXJtdXRhdGlvbihheGVzLCB4UmFuayk7XG4gICAgbGV0IHBlcm11dGVkWCA9IHg7XG4gICAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgICAgIHBlcm11dGVkWCA9IHRyYW5zcG9zZSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHBlcm06IHBlcm11dGVkQXhlcyB9IH0pO1xuICAgICAgICBheGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoYXhlcy5sZW5ndGgsIHguc2hhcGUubGVuZ3RoKTtcbiAgICB9XG4gICAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdtaW4nLCBheGVzLCB4UmFuayk7XG4gICAgY29uc3QgW291dFNoYXBlLCByZWR1Y2VTaGFwZV0gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcyhwZXJtdXRlZFguc2hhcGUsIGF4ZXMpO1xuICAgIGNvbnN0IGluU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShyZWR1Y2VTaGFwZSk7XG4gICAgY29uc3QgYTJEID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiBwZXJtdXRlZFggfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IFstMSwgaW5TaXplXSB9IH0pO1xuICAgIGNvbnN0IHJlZHVjZWQgPSByZWR1Y2UoYTJELCBhMkQuZHR5cGUsICdtaW4nLCBiYWNrZW5kKTtcbiAgICBsZXQgcmVzO1xuICAgIGlmIChrZWVwRGltcykge1xuICAgICAgICBjb25zdCBuZXdTaGFwZSA9IGJhY2tlbmRfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbShvdXRTaGFwZSwgb3JpZ0F4ZXMpO1xuICAgICAgICByZXMgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHJlZHVjZWQgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IG5ld1NoYXBlIH0gfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXMgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHJlZHVjZWQgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IG91dFNoYXBlIH0gfSk7XG4gICAgfVxuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oYTJEKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlZHVjZWQpO1xuICAgIGlmIChwZXJtdXRlZEF4ZXMgIT0gbnVsbCkge1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHBlcm11dGVkWCk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5leHBvcnQgY29uc3QgbWluQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE1pbixcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBtaW5cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NaW4uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTWluaW11bSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBDSEVDS19OQU5fU05JUFBFVCB9IGZyb20gJy4uL2JpbmFyeW9wX2dwdSc7XG5pbXBvcnQgeyBDSEVDS19OQU5fU05JUFBFVCBhcyBDSEVDS19OQU5fU05JUFBFVF9QQUNLRUQgfSBmcm9tICcuLi9iaW5hcnlvcF9wYWNrZWRfZ3B1JztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7IG1pbmltdW1JbXBsQ1BVIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5jb25zdCBNSU5JTVVNID0gQ0hFQ0tfTkFOX1NOSVBQRVQgKyBgXG4gIHJldHVybiBtaW4oYSwgYik7XG5gO1xuY29uc3QgTUlOSU1VTV9QQUNLRUQgPSBgXG4gIHZlYzQgcmVzdWx0ID0gdmVjNChtaW4oYSwgYikpO1xuICB2ZWM0IGlzTmFOID0gbWluKHZlYzQoaXNuYW4oYSkpICsgdmVjNChpc25hbihiKSksIHZlYzQoMS4wKSk7XG4gIGAgK1xuICAgIENIRUNLX05BTl9TTklQUEVUX1BBQ0tFRCArIGBcbiAgcmV0dXJuIHJlc3VsdDtcbmA7XG5leHBvcnQgY29uc3QgbWluaW11bSA9IGJpbmFyeUtlcm5lbEZ1bmMoe1xuICAgIG9wU25pcHBldDogTUlOSU1VTSxcbiAgICBwYWNrZWRPcFNuaXBwZXQ6IE1JTklNVU1fUEFDS0VELFxuICAgIGNwdUtlcm5lbEltcGw6IG1pbmltdW1JbXBsQ1BVXG59KTtcbmV4cG9ydCBjb25zdCBtaW5pbXVtQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE1pbmltdW0sXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogbWluaW11bVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1pbmltdW0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZW52LCBNaXJyb3JQYWQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgTWlycm9yUGFkUHJvZ3JhbSB9IGZyb20gJy4uL21pcnJvcl9wYWRfZ3B1JztcbmltcG9ydCB7IE1pcnJvclBhZFBhY2tlZFByb2dyYW0gfSBmcm9tICcuLi9taXJyb3JfcGFkX3BhY2tlZF9ncHUnO1xuZXhwb3J0IGNvbnN0IG1pcnJvclBhZEtlcm5lbEZ1bmMgPSAoeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0pID0+IHtcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHBhZGRpbmdzLCBtb2RlIH0gPSBhdHRycztcbiAgICBjb25zdCBwcm9ncmFtID0gZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19BUlJBWV9PUEVSQVRJT05TJykgP1xuICAgICAgICBuZXcgTWlycm9yUGFkUGFja2VkUHJvZ3JhbSh4LnNoYXBlLCBwYWRkaW5ncywgbW9kZSkgOlxuICAgICAgICBuZXcgTWlycm9yUGFkUHJvZ3JhbSh4LnNoYXBlLCBwYWRkaW5ncywgbW9kZSk7XG4gICAgY29uc3Qgb3V0cHV0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3hdLCB4LmR0eXBlKTtcbiAgICByZXR1cm4gb3V0cHV0O1xufTtcbmV4cG9ydCBjb25zdCBtaXJyb3JQYWRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTWlycm9yUGFkLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IG1pcnJvclBhZEtlcm5lbEZ1bmMsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWlycm9yUGFkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IE1vZCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBDSEVDS19OQU5fU05JUFBFVCB9IGZyb20gJy4uL2JpbmFyeW9wX3BhY2tlZF9ncHUnO1xuaW1wb3J0IHsgYmluYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuY29uc3QgTU9EID0gYGlmIChiID09IDAuMCkgcmV0dXJuIE5BTjtcbiAgcmV0dXJuIG1vZChhLCBiKTtgO1xuY29uc3QgTU9EX1BBQ0tFRCA9IGBcbiAgdmVjNCByZXN1bHQgPSBtb2QoYSwgYik7XG4gIHZlYzQgaXNOYU4gPSB2ZWM0KGVxdWFsKGIsIHZlYzQoMC4wKSkpO1xuICBgICtcbiAgICBDSEVDS19OQU5fU05JUFBFVCArIGBcbiAgcmV0dXJuIHJlc3VsdDtcbmA7XG5leHBvcnQgY29uc3QgbW9kID0gYmluYXJ5S2VybmVsRnVuYyh7XG4gICAgb3BTbmlwcGV0OiBNT0QsXG4gICAgcGFja2VkT3BTbmlwcGV0OiBNT0RfUEFDS0VELFxufSk7XG5leHBvcnQgY29uc3QgbW9kQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE1vZCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBtb2Rcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Nb2QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTXVsdGlub21pYWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgTXVsdGlub21pYWxQcm9ncmFtIH0gZnJvbSAnLi4vbXVsdGlub21pYWxfZ3B1JztcbmltcG9ydCB7IHNvZnRtYXggfSBmcm9tICcuL1NvZnRtYXgnO1xuZXhwb3J0IGZ1bmN0aW9uIG11bHRpbm9taWFsKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBsb2dpdHMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IG51bVNhbXBsZXMsIHNlZWQsIG5vcm1hbGl6ZWQgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHByb2JzID0gbm9ybWFsaXplZCA/XG4gICAgICAgIGxvZ2l0cyA6XG4gICAgICAgIHNvZnRtYXgoeyBpbnB1dHM6IHsgbG9naXRzIH0sIGJhY2tlbmQsIGF0dHJzOiB7IGRpbTogbG9naXRzLnNoYXBlLmxlbmd0aCAtIDEgfSB9KTtcbiAgICBjb25zdCBiYXRjaFNpemUgPSBwcm9icy5zaGFwZVswXTtcbiAgICBjb25zdCBudW1PdXRjb21lcyA9IHByb2JzLnNoYXBlWzFdO1xuICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgTXVsdGlub21pYWxQcm9ncmFtKGJhdGNoU2l6ZSwgbnVtT3V0Y29tZXMsIG51bVNhbXBsZXMpO1xuICAgIGNvbnN0IGN1c3RvbVZhbHVlcyA9IFtbc2VlZF1dO1xuICAgIGNvbnN0IHJlcyA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtwcm9ic10sICdpbnQzMicsIGN1c3RvbVZhbHVlcyk7XG4gICAgaWYgKCFub3JtYWxpemVkKSB7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocHJvYnMpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IG11bHRpbm9taWFsQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE11bHRpbm9taWFsLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IG11bHRpbm9taWFsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TXVsdGlub21pYWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBlbnYsIE11bHRpcGx5IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCAqIGFzIGJpbmFyeW9wX2NvbXBsZXhfZ3B1IGZyb20gJy4uL2JpbmFyeW9wX2NvbXBsZXhfZ3B1JztcbmltcG9ydCB7IEJpbmFyeU9wQ29tcGxleFByb2dyYW0gfSBmcm9tICcuLi9iaW5hcnlvcF9jb21wbGV4X2dwdSc7XG5pbXBvcnQgeyBCaW5hcnlPcFByb2dyYW0gfSBmcm9tICcuLi9iaW5hcnlvcF9ncHUnO1xuaW1wb3J0IHsgQmluYXJ5T3BQYWNrZWRQcm9ncmFtIH0gZnJvbSAnLi4vYmluYXJ5b3BfcGFja2VkX2dwdSc7XG5pbXBvcnQgeyBtdWx0aXBseUltcGxDUFUgYXMgY3B1TXVsdGlwbHkgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmltcG9ydCB7IGNvbXBsZXggfSBmcm9tICcuL0NvbXBsZXgnO1xuY29uc3QgTVVMID0gJ3JldHVybiBhICogYjsnO1xuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IGEsIGIgfSA9IGlucHV0cztcbiAgICBjb25zdCBkdHlwZSA9IGJhY2tlbmRfdXRpbC51cGNhc3RUeXBlKGEuZHR5cGUsIGIuZHR5cGUpO1xuICAgIGlmIChhLmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICBjb25zdCBhRGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQoYS5kYXRhSWQpO1xuICAgICAgICBjb25zdCBiRGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQoYi5kYXRhSWQpO1xuICAgICAgICBjb25zdCByZWFsUHJvZ3JhbSA9IG5ldyBCaW5hcnlPcENvbXBsZXhQcm9ncmFtKGJpbmFyeW9wX2NvbXBsZXhfZ3B1LkNPTVBMRVhfTVVMVElQTFkuUkVBTCwgYS5zaGFwZSwgYi5zaGFwZSk7XG4gICAgICAgIGNvbnN0IGltYWdQcm9ncmFtID0gbmV3IEJpbmFyeU9wQ29tcGxleFByb2dyYW0oYmluYXJ5b3BfY29tcGxleF9ncHUuQ09NUExFWF9NVUxUSVBMWS5JTUFHLCBhLnNoYXBlLCBiLnNoYXBlKTtcbiAgICAgICAgY29uc3QgaW5wdXRzID0gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRhdGFJZDogYURhdGEuY29tcGxleFRlbnNvckluZm9zLnJlYWwuZGF0YUlkLFxuICAgICAgICAgICAgICAgIGR0eXBlOiBhRGF0YS5jb21wbGV4VGVuc29ySW5mb3MucmVhbC5kdHlwZSxcbiAgICAgICAgICAgICAgICBzaGFwZTogYS5zaGFwZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkYXRhSWQ6IGFEYXRhLmNvbXBsZXhUZW5zb3JJbmZvcy5pbWFnLmRhdGFJZCxcbiAgICAgICAgICAgICAgICBkdHlwZTogYURhdGEuY29tcGxleFRlbnNvckluZm9zLmltYWcuZHR5cGUsXG4gICAgICAgICAgICAgICAgc2hhcGU6IGEuc2hhcGVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGF0YUlkOiBiRGF0YS5jb21wbGV4VGVuc29ySW5mb3MucmVhbC5kYXRhSWQsXG4gICAgICAgICAgICAgICAgZHR5cGU6IGJEYXRhLmNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsLmR0eXBlLFxuICAgICAgICAgICAgICAgIHNoYXBlOiBiLnNoYXBlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRhdGFJZDogYkRhdGEuY29tcGxleFRlbnNvckluZm9zLmltYWcuZGF0YUlkLFxuICAgICAgICAgICAgICAgIGR0eXBlOiBiRGF0YS5jb21wbGV4VGVuc29ySW5mb3MuaW1hZy5kdHlwZSxcbiAgICAgICAgICAgICAgICBzaGFwZTogYi5zaGFwZVxuICAgICAgICAgICAgfVxuICAgICAgICBdO1xuICAgICAgICBjb25zdCByZWFsUGFydCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHJlYWxQcm9ncmFtLCBpbnB1dHMsICdmbG9hdDMyJyk7XG4gICAgICAgIGNvbnN0IGltYWdQYXJ0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0oaW1hZ1Byb2dyYW0sIGlucHV0cywgJ2Zsb2F0MzInKTtcbiAgICAgICAgY29uc3QgY29tcGxleE91dHB1dCA9IGNvbXBsZXgoeyBpbnB1dHM6IHsgcmVhbDogcmVhbFBhcnQsIGltYWc6IGltYWdQYXJ0IH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVhbFBhcnQpO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGltYWdQYXJ0KTtcbiAgICAgICAgLy8gVE9ETyhhbm54aW5neXVhbik6IENQVSBmb3J3YXJkaW5nIGZvciBjb21wbGV4IGlucHV0cy5cbiAgICAgICAgcmV0dXJuIGNvbXBsZXhPdXRwdXQ7XG4gICAgfVxuICAgIGlmIChiYWNrZW5kLnNob3VsZEV4ZWN1dGVPbkNQVShbYSwgYl0pKSB7XG4gICAgICAgIGNvbnN0IGFEYXRhID0gYmFja2VuZC50ZXhEYXRhLmdldChhLmRhdGFJZCk7XG4gICAgICAgIGNvbnN0IGJEYXRhID0gYmFja2VuZC50ZXhEYXRhLmdldChiLmRhdGFJZCk7XG4gICAgICAgIGNvbnN0IFtvdXRWYWx1ZXMsIG91dFNoYXBlXSA9IGNwdU11bHRpcGx5KGEuc2hhcGUsIGIuc2hhcGUsIGFEYXRhLnZhbHVlcywgYkRhdGEudmFsdWVzLCBkdHlwZSk7XG4gICAgICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0U2hhcGUsIGR0eXBlKTtcbiAgICAgICAgY29uc3Qgb3V0RGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQob3V0LmRhdGFJZCk7XG4gICAgICAgIG91dERhdGEudmFsdWVzID0gb3V0VmFsdWVzO1xuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cbiAgICBsZXQgcHJvZ3JhbTtcbiAgICBpZiAoZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19CSU5BUllfT1BFUkFUSU9OUycpKSB7XG4gICAgICAgIHByb2dyYW0gPSBuZXcgQmluYXJ5T3BQYWNrZWRQcm9ncmFtKE1VTCwgYS5zaGFwZSwgYi5zaGFwZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBwcm9ncmFtID0gbmV3IEJpbmFyeU9wUHJvZ3JhbShNVUwsIGEuc2hhcGUsIGIuc2hhcGUpO1xuICAgIH1cbiAgICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW2EsIGJdLCBkdHlwZSk7XG59XG5leHBvcnQgY29uc3QgbXVsdGlwbHlDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTXVsdGlwbHksXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogbXVsdGlwbHlcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NdWx0aXBseS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBlbnYsIE5lZyB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBuZWdJbXBsQ1BVIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5pbXBvcnQgeyBVbmFyeU9wUHJvZ3JhbSB9IGZyb20gJy4uL3VuYXJ5b3BfZ3B1JztcbmltcG9ydCB7IFVuYXJ5T3BQYWNrZWRQcm9ncmFtIH0gZnJvbSAnLi4vdW5hcnlvcF9wYWNrZWRfZ3B1JztcbmNvbnN0IE5FRyA9IGByZXR1cm4gLXg7YDtcbi8vIFRoaXMgZG9lc24ndCB1c2UgdW5hcnlLZXJuZWxGdW5jIGJlY2F1c2UgbmVnSW1wbENQVSBpcyBub3Qgb2YgdHlwZVxuLy8gU2ltcGxlVW5hcnlLZXJuZWxJbXBsQ1BVLlxuZXhwb3J0IGZ1bmN0aW9uIG5lZyhhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgaWYgKGJhY2tlbmQuc2hvdWxkRXhlY3V0ZU9uQ1BVKFt4XSkpIHtcbiAgICAgICAgY29uc3QgeERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KHguZGF0YUlkKTtcbiAgICAgICAgY29uc3QgW291dFZhbHVlcywgbmV3U2hhcGVdID0gbmVnSW1wbENQVSh4RGF0YS52YWx1ZXMsIHguc2hhcGUsIHguZHR5cGUpO1xuICAgICAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhuZXdTaGFwZSwgeC5kdHlwZSwgb3V0VmFsdWVzKTtcbiAgICB9XG4gICAgbGV0IHByb2dyYW07XG4gICAgaWYgKGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfVU5BUllfT1BFUkFUSU9OUycpKSB7XG4gICAgICAgIHByb2dyYW0gPSBuZXcgVW5hcnlPcFBhY2tlZFByb2dyYW0oeC5zaGFwZSwgTkVHKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHByb2dyYW0gPSBuZXcgVW5hcnlPcFByb2dyYW0oeC5zaGFwZSwgTkVHKTtcbiAgICB9XG4gICAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4XSwgeC5kdHlwZSk7XG59XG5leHBvcnQgY29uc3QgbmVnQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE5lZyxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBuZWdcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1OZWcuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBrZXJuZWxfaW1wbHMsIE5vbk1heFN1cHByZXNzaW9uVjMgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25WM0ltcGwgPSBrZXJuZWxfaW1wbHMubm9uTWF4U3VwcHJlc3Npb25WM0ltcGw7XG5leHBvcnQgZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25WMyhhcmdzKSB7XG4gICAgYmFja2VuZF91dGlsLndhcm4oJ3RmLm5vbk1heFN1cHByZXNzaW9uKCkgaW4gd2ViZ2wgbG9ja3MgdGhlIFVJIHRocmVhZC4gJyArXG4gICAgICAgICdDYWxsIHRmLm5vbk1heFN1cHByZXNzaW9uQXN5bmMoKSBpbnN0ZWFkJyk7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgYm94ZXMsIHNjb3JlcyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCB9ID0gYXR0cnM7XG4gICAgY29uc3QgYm94ZXNWYWxzID0gYmFja2VuZC5yZWFkU3luYyhib3hlcy5kYXRhSWQpO1xuICAgIGNvbnN0IHNjb3Jlc1ZhbHMgPSBiYWNrZW5kLnJlYWRTeW5jKHNjb3Jlcy5kYXRhSWQpO1xuICAgIGNvbnN0IHsgc2VsZWN0ZWRJbmRpY2VzIH0gPSBub25NYXhTdXBwcmVzc2lvblYzSW1wbChib3hlc1ZhbHMsIHNjb3Jlc1ZhbHMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQpO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtzZWxlY3RlZEluZGljZXMubGVuZ3RoXSwgJ2ludDMyJywgbmV3IEludDMyQXJyYXkoc2VsZWN0ZWRJbmRpY2VzKSk7XG59XG5leHBvcnQgY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25WM0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBOb25NYXhTdXBwcmVzc2lvblYzLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IG5vbk1heFN1cHByZXNzaW9uVjNcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ob25NYXhTdXBwcmVzc2lvblYzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwga2VybmVsX2ltcGxzLCBOb25NYXhTdXBwcmVzc2lvblY0IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmNvbnN0IG5vbk1heFN1cHByZXNzaW9uVjRJbXBsID0ga2VybmVsX2ltcGxzLm5vbk1heFN1cHByZXNzaW9uVjRJbXBsO1xuZXhwb3J0IGZ1bmN0aW9uIG5vbk1heFN1cHByZXNzaW9uVjQoYXJncykge1xuICAgIGJhY2tlbmRfdXRpbC53YXJuKCd0Zi5ub25NYXhTdXBwcmVzc2lvbigpIGluIHdlYmdsIGxvY2tzIHRoZSBVSSB0aHJlYWQuICcgK1xuICAgICAgICAnQ2FsbCB0Zi5ub25NYXhTdXBwcmVzc2lvbkFzeW5jKCkgaW5zdGVhZCcpO1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGJveGVzLCBzY29yZXMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsIHBhZFRvTWF4T3V0cHV0U2l6ZSB9ID0gYXR0cnM7XG4gICAgY29uc3QgYm94ZXNWYWxzID0gYmFja2VuZC5yZWFkU3luYyhib3hlcy5kYXRhSWQpO1xuICAgIGNvbnN0IHNjb3Jlc1ZhbHMgPSBiYWNrZW5kLnJlYWRTeW5jKHNjb3Jlcy5kYXRhSWQpO1xuICAgIGNvbnN0IHsgc2VsZWN0ZWRJbmRpY2VzLCB2YWxpZE91dHB1dHMgfSA9IG5vbk1heFN1cHByZXNzaW9uVjRJbXBsKGJveGVzVmFscywgc2NvcmVzVmFscywgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCwgcGFkVG9NYXhPdXRwdXRTaXplKTtcbiAgICByZXR1cm4gW1xuICAgICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtzZWxlY3RlZEluZGljZXMubGVuZ3RoXSwgJ2ludDMyJywgbmV3IEludDMyQXJyYXkoc2VsZWN0ZWRJbmRpY2VzKSksXG4gICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW10sICdpbnQzMicsIG5ldyBJbnQzMkFycmF5KFt2YWxpZE91dHB1dHNdKSlcbiAgICBdO1xufVxuZXhwb3J0IGNvbnN0IG5vbk1heFN1cHByZXNzaW9uVjRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTm9uTWF4U3VwcHJlc3Npb25WNCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBub25NYXhTdXBwcmVzc2lvblY0XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Tm9uTWF4U3VwcHJlc3Npb25WNC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIGtlcm5lbF9pbXBscywgTm9uTWF4U3VwcHJlc3Npb25WNSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5jb25zdCBub25NYXhTdXBwcmVzc2lvblY1SW1wbCA9IGtlcm5lbF9pbXBscy5ub25NYXhTdXBwcmVzc2lvblY1SW1wbDtcbmV4cG9ydCBmdW5jdGlvbiBub25NYXhTdXBwcmVzc2lvblY1KGFyZ3MpIHtcbiAgICBiYWNrZW5kX3V0aWwud2FybigndGYubm9uTWF4U3VwcHJlc3Npb24oKSBpbiB3ZWJnbCBsb2NrcyB0aGUgVUkgdGhyZWFkLiAnICtcbiAgICAgICAgJ0NhbGwgdGYubm9uTWF4U3VwcHJlc3Npb25Bc3luYygpIGluc3RlYWQnKTtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBib3hlcywgc2NvcmVzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBtYXhPdXRwdXRTaXplLCBpb3VUaHJlc2hvbGQsIHNjb3JlVGhyZXNob2xkLCBzb2Z0Tm1zU2lnbWEgfSA9IGF0dHJzO1xuICAgIGNvbnN0IGJveGVzVmFscyA9IGJhY2tlbmQucmVhZFN5bmMoYm94ZXMuZGF0YUlkKTtcbiAgICBjb25zdCBzY29yZXNWYWxzID0gYmFja2VuZC5yZWFkU3luYyhzY29yZXMuZGF0YUlkKTtcbiAgICBjb25zdCBtYXhPdXRwdXRTaXplVmFsID0gbWF4T3V0cHV0U2l6ZTtcbiAgICBjb25zdCBpb3VUaHJlc2hvbGRWYWwgPSBpb3VUaHJlc2hvbGQ7XG4gICAgY29uc3Qgc2NvcmVUaHJlc2hvbGRWYWwgPSBzY29yZVRocmVzaG9sZDtcbiAgICBjb25zdCBzb2Z0Tm1zU2lnbWFWYWwgPSBzb2Z0Tm1zU2lnbWE7XG4gICAgY29uc3QgeyBzZWxlY3RlZEluZGljZXMsIHNlbGVjdGVkU2NvcmVzIH0gPSBub25NYXhTdXBwcmVzc2lvblY1SW1wbChib3hlc1ZhbHMsIHNjb3Jlc1ZhbHMsIG1heE91dHB1dFNpemVWYWwsIGlvdVRocmVzaG9sZFZhbCwgc2NvcmVUaHJlc2hvbGRWYWwsIHNvZnRObXNTaWdtYVZhbCk7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbc2VsZWN0ZWRJbmRpY2VzLmxlbmd0aF0sICdpbnQzMicsIG5ldyBJbnQzMkFycmF5KHNlbGVjdGVkSW5kaWNlcykpLFxuICAgICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtzZWxlY3RlZFNjb3Jlcy5sZW5ndGhdLCAnZmxvYXQzMicsIG5ldyBGbG9hdDMyQXJyYXkoc2VsZWN0ZWRTY29yZXMpKVxuICAgIF07XG59XG5leHBvcnQgY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25WNUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBOb25NYXhTdXBwcmVzc2lvblY1LFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IG5vbk1heFN1cHByZXNzaW9uVjVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ob25NYXhTdXBwcmVzc2lvblY1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IE5vdEVxdWFsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7IG5vdEVxdWFsSW1wbENQVSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuY29uc3QgTk9UX0VRVUFMID0gYHJldHVybiBmbG9hdChhICE9IGIpO2A7XG5leHBvcnQgY29uc3Qgbm90RXF1YWwgPSBiaW5hcnlLZXJuZWxGdW5jKHsgb3BTbmlwcGV0OiBOT1RfRVFVQUwsIGNwdUtlcm5lbEltcGw6IG5vdEVxdWFsSW1wbENQVSwgZHR5cGU6ICdib29sJyB9KTtcbmV4cG9ydCBjb25zdCBub3RFcXVhbENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBOb3RFcXVhbCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBub3RFcXVhbCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ob3RFcXVhbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBPbmVIb3QsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgT25lSG90UHJvZ3JhbSB9IGZyb20gJy4uL29uZWhvdF9ncHUnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5leHBvcnQgY29uc3Qgb25lSG90ID0gKGFyZ3MpID0+IHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBpbmRpY2VzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBkZXB0aCwgb25WYWx1ZSwgb2ZmVmFsdWUgfSA9IGF0dHJzO1xuICAgIGNvbnN0IGluZGljZXNTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKGluZGljZXMuc2hhcGUpO1xuICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgT25lSG90UHJvZ3JhbShpbmRpY2VzU2l6ZSwgZGVwdGgsIG9uVmFsdWUsIG9mZlZhbHVlKTtcbiAgICBjb25zdCByZXNoYXBlZCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogaW5kaWNlcyB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogW2luZGljZXNTaXplXSB9IH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtyZXNoYXBlZF0sIGluZGljZXMuZHR5cGUpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVzaGFwZWQpO1xuICAgIGNvbnN0IG91dFNoYXBlID0gWy4uLmluZGljZXMuc2hhcGUsIGRlcHRoXTtcbiAgICBjb25zdCBvdXQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHJlc3VsdCB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogb3V0U2hhcGUgfSB9KTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc3VsdCk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5leHBvcnQgY29uc3Qgb25lSG90Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE9uZUhvdCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBvbmVIb3Rcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1PbmVIb3QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgT25lc0xpa2UgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY29tcGxleCB9IGZyb20gJy4vQ29tcGxleCc7XG5pbXBvcnQgeyBmaWxsIH0gZnJvbSAnLi9GaWxsJztcbmltcG9ydCB7IGltYWcgfSBmcm9tICcuL0ltYWcnO1xuaW1wb3J0IHsgcmVhbCB9IGZyb20gJy4vUmVhbCc7XG5pbXBvcnQgeyB6ZXJvc0xpa2UgfSBmcm9tICcuL1plcm9zTGlrZSc7XG5leHBvcnQgZnVuY3Rpb24gb25lc0xpa2UoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGlmICh4LmR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ29uZXNMaWtlIGlzIG5vdCBzdXBwb3J0ZWQgdW5kZXIgc3RyaW5nIGR0eXBlJyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHguZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICAgIGNvbnN0IHJlYWxQYXJ0ID0gcmVhbCh7IGlucHV0czogeyBpbnB1dDogeCB9LCBiYWNrZW5kIH0pO1xuICAgICAgICBjb25zdCByID0gb25lc0xpa2UoeyBpbnB1dHM6IHsgeDogcmVhbFBhcnQgfSwgYmFja2VuZCB9KTtcbiAgICAgICAgY29uc3QgaW1hZ1BhcnQgPSBpbWFnKHsgaW5wdXRzOiB7IGlucHV0OiB4IH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIGNvbnN0IGkgPSB6ZXJvc0xpa2UoeyBpbnB1dHM6IHsgeDogaW1hZ1BhcnQgfSwgYmFja2VuZCB9KTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY29tcGxleCh7IGlucHV0czogeyByZWFsOiByLCBpbWFnOiBpIH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVhbFBhcnQpO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHIpO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGltYWdQYXJ0KTtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIFRPRE8oY2Fpcywgc21pbGtvdik6IEFkZCBXZWJHTCBzaGFkZXIgZm9yIG9uZXNMaWtlOlxuICAgICAgICAvLyAgIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RmanMvaXNzdWVzLzEyOTNcbiAgICAgICAgcmV0dXJuIGZpbGwoeyBhdHRyczogeyBzaGFwZTogeC5zaGFwZSwgZHR5cGU6IHguZHR5cGUsIHZhbHVlOiAxIH0sIGJhY2tlbmQgfSk7XG4gICAgfVxufVxuZXhwb3J0IGNvbnN0IG9uZXNMaWtlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE9uZXNMaWtlLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IG9uZXNMaWtlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9T25lc0xpa2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUGFjaywgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjb25jYXQgfSBmcm9tICcuL0NvbmNhdCc7XG5pbXBvcnQgeyBleHBhbmREaW1zIH0gZnJvbSAnLi9FeHBhbmREaW1zJztcbmV4cG9ydCBmdW5jdGlvbiBwYWNrKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBheGlzIH0gPSBhdHRycztcbiAgICBpZiAoaW5wdXRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gZXhwYW5kRGltcyh7IGlucHV0czogeyBpbnB1dDogaW5wdXRzWzBdIH0sIGJhY2tlbmQsIGF0dHJzOiB7IGRpbTogYXhpcyB9IH0pO1xuICAgIH1cbiAgICBjb25zdCBzaGFwZSA9IGlucHV0c1swXS5zaGFwZTtcbiAgICBjb25zdCBkdHlwZSA9IGlucHV0c1swXS5kdHlwZTtcbiAgICBpbnB1dHMuZm9yRWFjaCh0ID0+IHtcbiAgICAgICAgdXRpbC5hc3NlcnRTaGFwZXNNYXRjaChzaGFwZSwgdC5zaGFwZSwgJ0FsbCB0ZW5zb3JzIHBhc3NlZCB0byBzdGFjayBtdXN0IGhhdmUgbWF0Y2hpbmcgc2hhcGVzJyk7XG4gICAgICAgIHV0aWwuYXNzZXJ0KGR0eXBlID09PSB0LmR0eXBlLCAoKSA9PiAnQWxsIHRlbnNvcnMgcGFzc2VkIHRvIHN0YWNrIG11c3QgaGF2ZSBtYXRjaGluZyBkdHlwZXMnKTtcbiAgICB9KTtcbiAgICBjb25zdCBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcyA9IFtdO1xuICAgIGNvbnN0IGV4cGFuZGVkVGVuc29ycyA9IGlucHV0cy5tYXAodCA9PiB7XG4gICAgICAgIGNvbnN0IGV4cGFuZGVkVCA9IGV4cGFuZERpbXMoeyBpbnB1dHM6IHsgaW5wdXQ6IHQgfSwgYmFja2VuZCwgYXR0cnM6IHsgZGltOiBheGlzIH0gfSk7XG4gICAgICAgIGludGVybWVkaWF0ZVRlbnNvckluZm9zLnB1c2goZXhwYW5kZWRUKTtcbiAgICAgICAgcmV0dXJuIGV4cGFuZGVkVDtcbiAgICB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBjb25jYXQoeyBpbnB1dHM6IGV4cGFuZGVkVGVuc29ycywgYmFja2VuZCwgYXR0cnM6IHsgYXhpcyB9IH0pO1xuICAgIGludGVybWVkaWF0ZVRlbnNvckluZm9zLmZvckVhY2godCA9PiBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHQpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGNvbnN0IHBhY2tDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUGFjayxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBwYWNrXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UGFjay5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBlbnYsIFBhZFYyIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IFBhZFByb2dyYW0gfSBmcm9tICcuLi9wYWRfZ3B1JztcbmltcG9ydCB7IFBhZFBhY2tlZFByb2dyYW0gfSBmcm9tICcuLi9wYWRfcGFja2VkX2dwdSc7XG5leHBvcnQgY29uc3QgcGFkVjIgPSAoYXJncykgPT4ge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHBhZGRpbmdzLCBjb25zdGFudFZhbHVlIH0gPSBhdHRycztcbiAgICBjb25zdCBwcm9ncmFtID0gZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19BUlJBWV9PUEVSQVRJT05TJykgP1xuICAgICAgICBuZXcgUGFkUGFja2VkUHJvZ3JhbSh4LnNoYXBlLCBwYWRkaW5ncywgY29uc3RhbnRWYWx1ZSkgOlxuICAgICAgICBuZXcgUGFkUHJvZ3JhbSh4LnNoYXBlLCBwYWRkaW5ncywgY29uc3RhbnRWYWx1ZSk7XG4gICAgY29uc3QgY3VzdG9tVmFsdWVzID0gW1tjb25zdGFudFZhbHVlXV07XG4gICAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4XSwgeC5kdHlwZSwgY3VzdG9tVmFsdWVzKTtcbn07XG5leHBvcnQgY29uc3QgcGFkVjJDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUGFkVjIsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogcGFkVjJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QYWRWMi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBQb3cgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgQ0hFQ0tfTkFOX1NOSVBQRVQgfSBmcm9tICcuLi9iaW5hcnlvcF9wYWNrZWRfZ3B1JztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmNvbnN0IFBPVyA9IGBcbiAgaWYoYSA8IDAuMCAmJiBmbG9vcihiKSA8IGIpe1xuICAgIHJldHVybiBOQU47XG4gIH1cbiAgaWYgKGIgPT0gMC4wKSB7XG4gICAgcmV0dXJuIDEuMDtcbiAgfVxuICByZXR1cm4gKHJvdW5kKG1vZChiLCAyLjApKSAhPSAxKSA/XG4gICAgICBwb3coYWJzKGEpLCBiKSA6IHNpZ24oYSkgKiBwb3coYWJzKGEpLCBiKTtcbmA7XG5jb25zdCBQT1dfUEFDS0VEID0gYFxuICAvLyBpc01vZFJvdW5kMSBoYXMgMSBmb3IgY29tcG9uZW50cyB3aXRoIHJvdW5kKG1vZChiLCAyLjApKSA9PSAxLCAwIG90aGVyd2lzZS5cbiAgdmVjNCBpc01vZFJvdW5kMSA9IHZlYzQoZXF1YWwocm91bmQobW9kKGIsIDIuMCkpLCBpdmVjNCgxKSkpO1xuICB2ZWM0IG11bHRpcGxpZXIgPSBzaWduKGEpICogaXNNb2RSb3VuZDEgKyAodmVjNCgxLjApIC0gaXNNb2RSb3VuZDEpO1xuICB2ZWM0IHJlc3VsdCA9IG11bHRpcGxpZXIgKiBwb3coYWJzKGEpLCBiKTtcblxuICAvLyBFbnN1cmUgdGhhdCBhXjAgPSAxLCBpbmNsdWRpbmcgMF4wID0gMSBhcyB0aGlzIGNvcnJlc3BvbmQgdG8gVEYgYW5kIEpTXG4gIGJ2ZWM0IGlzRXhwWmVybyA9IGVxdWFsKGIsIHZlYzQoMC4wKSk7XG4gIHJlc3VsdC5yID0gaXNFeHBaZXJvLnIgPyAxLjAgOiByZXN1bHQucjtcbiAgcmVzdWx0LmcgPSBpc0V4cFplcm8uZyA/IDEuMCA6IHJlc3VsdC5nO1xuICByZXN1bHQuYiA9IGlzRXhwWmVyby5iID8gMS4wIDogcmVzdWx0LmI7XG4gIHJlc3VsdC5hID0gaXNFeHBaZXJvLmEgPyAxLjAgOiByZXN1bHQuYTtcblxuICB2ZWM0IGlzTmFOID0gdmVjNChsZXNzVGhhbihhLCB2ZWM0KDAuMCkpKSAqIHZlYzQobGVzc1RoYW4oZmxvb3IoYiksIGIpKTtcbiAgYCArXG4gICAgQ0hFQ0tfTkFOX1NOSVBQRVQgKyBgXG4gIHJldHVybiByZXN1bHQ7XG5gO1xuZXhwb3J0IGNvbnN0IHBvdyA9IGJpbmFyeUtlcm5lbEZ1bmMoeyBvcFNuaXBwZXQ6IFBPVywgcGFja2VkT3BTbmlwcGV0OiBQT1dfUEFDS0VEIH0pO1xuZXhwb3J0IGNvbnN0IHBvd0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBQb3csXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogcG93XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UG93LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGVudiwgUHJlbHUgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgQmluYXJ5T3BQcm9ncmFtIH0gZnJvbSAnLi4vYmluYXJ5b3BfZ3B1JztcbmltcG9ydCB7IEJpbmFyeU9wUGFja2VkUHJvZ3JhbSB9IGZyb20gJy4uL2JpbmFyeW9wX3BhY2tlZF9ncHUnO1xuZXhwb3J0IGNvbnN0IFBSRUxVID0gYHJldHVybiAoYSA8IDAuKSA/IGIgKiBhIDogYTtgO1xuZXhwb3J0IGNvbnN0IFBSRUxVX1BBQ0tFRCA9IGBcbiAgdmVjNCBhTGVzc1RoYW5aZXJvID0gdmVjNChsZXNzVGhhbihhLCB2ZWM0KDAuKSkpO1xuICByZXR1cm4gKGFMZXNzVGhhblplcm8gKiAoYiAqIGEpKSArICgodmVjNCgxLjApIC0gYUxlc3NUaGFuWmVybykgKiBhKTtcbmA7XG5leHBvcnQgZnVuY3Rpb24gcHJlbHUoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCwgYWxwaGEgfSA9IGlucHV0cztcbiAgICBjb25zdCBwcm9ncmFtID0gZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19CSU5BUllfT1BFUkFUSU9OUycpID9cbiAgICAgICAgbmV3IEJpbmFyeU9wUGFja2VkUHJvZ3JhbShQUkVMVV9QQUNLRUQsIHguc2hhcGUsIGFscGhhLnNoYXBlKSA6XG4gICAgICAgIG5ldyBCaW5hcnlPcFByb2dyYW0oUFJFTFUsIHguc2hhcGUsIGFscGhhLnNoYXBlKTtcbiAgICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3gsIGFscGhhXSwgeC5kdHlwZSk7XG59XG5leHBvcnQgY29uc3QgcHJlbHVDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUHJlbHUsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogcHJlbHVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QcmVsdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIFByb2QsIHN1bU91dFR5cGUsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgcmVkdWNlIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3JlZHVjZSc7XG5pbXBvcnQgeyBwcm9kSW1wbENQVSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQgeyB0cmFuc3Bvc2UgfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5leHBvcnQgZnVuY3Rpb24gcHJvZChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYXhpcywga2VlcERpbXMgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgdG9EaXNwb3NlID0gW107XG4gICAgY29uc3Qgb3JpZ0F4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpO1xuICAgIGxldCBheGVzID0gb3JpZ0F4ZXM7XG4gICAgY29uc3QgcGVybXV0ZWRBeGVzID0gYmFja2VuZF91dGlsLmdldEF4ZXNQZXJtdXRhdGlvbihheGVzLCB4UmFuayk7XG4gICAgbGV0IHBlcm11dGVkWCA9IHg7XG4gICAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgICAgIHBlcm11dGVkWCA9IHRyYW5zcG9zZSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHBlcm06IHBlcm11dGVkQXhlcyB9IH0pO1xuICAgICAgICBheGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoYXhlcy5sZW5ndGgsIHhSYW5rKTtcbiAgICAgICAgdG9EaXNwb3NlLnB1c2gocGVybXV0ZWRYKTtcbiAgICB9XG4gICAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdwcm9kJywgYXhlcywgeFJhbmspO1xuICAgIGxldCByZXM7XG4gICAgaWYgKGJhY2tlbmQuc2hvdWxkRXhlY3V0ZU9uQ1BVKFtwZXJtdXRlZFhdKSkge1xuICAgICAgICBjb25zdCB4VmFscyA9IGJhY2tlbmQudGV4RGF0YS5nZXQocGVybXV0ZWRYLmRhdGFJZCkudmFsdWVzO1xuICAgICAgICBjb25zdCB7IG91dFZhbHMsIG91dFNoYXBlLCBvdXREdHlwZSB9ID0gcHJvZEltcGxDUFUocGVybXV0ZWRYLnNoYXBlLCBwZXJtdXRlZFguZHR5cGUsIHhWYWxzLCBheGVzKTtcbiAgICAgICAgcmVzID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRTaGFwZSwgb3V0RHR5cGUsIG91dFZhbHMpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgW291dFNoYXBlLCByZWR1Y2VTaGFwZV0gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcyhwZXJtdXRlZFguc2hhcGUsIGF4ZXMpO1xuICAgICAgICBjb25zdCBpblNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuICAgICAgICBjb25zdCBhMkQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHBlcm11dGVkWCB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogWy0xLCBpblNpemVdIH0gfSk7XG4gICAgICAgIGNvbnN0IG91dHB1dERUeXBlID0gc3VtT3V0VHlwZSh4LmR0eXBlKTtcbiAgICAgICAgY29uc3QgcmVkdWNlZCA9IHJlZHVjZShhMkQsIG91dHB1dERUeXBlLCAncHJvZCcsIGJhY2tlbmQpO1xuICAgICAgICByZXMgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHJlZHVjZWQgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IG91dFNoYXBlIH0gfSk7XG4gICAgICAgIHRvRGlzcG9zZS5wdXNoKGEyRCk7XG4gICAgICAgIHRvRGlzcG9zZS5wdXNoKHJlZHVjZWQpO1xuICAgIH1cbiAgICBpZiAoa2VlcERpbXMpIHtcbiAgICAgICAgdG9EaXNwb3NlLnB1c2gocmVzKTtcbiAgICAgICAgY29uc3QgbmV3U2hhcGUgPSBiYWNrZW5kX3V0aWwuZXhwYW5kU2hhcGVUb0tlZXBEaW0ocmVzLnNoYXBlLCBvcmlnQXhlcyk7XG4gICAgICAgIHJlcyA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogcmVzIH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBuZXdTaGFwZSB9IH0pO1xuICAgIH1cbiAgICB0b0Rpc3Bvc2UuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuICAgIHJldHVybiByZXM7XG59XG5leHBvcnQgY29uc3QgcHJvZENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBQcm9kLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IHByb2Rcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Qcm9kLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFJhbmdlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHJhbmdlSW1wbENQVSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuZXhwb3J0IGNvbnN0IHJhbmdlID0gKGFyZ3MpID0+IHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgc3RhcnQsIHN0b3AsIHN0ZXAsIGR0eXBlIH0gPSBhdHRycztcbiAgICBjb25zdCB2YWx1ZXMgPSByYW5nZUltcGxDUFUoc3RhcnQsIHN0b3AsIHN0ZXAsIGR0eXBlKTtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbdmFsdWVzLmxlbmd0aF0sIGR0eXBlLCB2YWx1ZXMpO1xufTtcbmV4cG9ydCBjb25zdCByYW5nZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBSYW5nZSxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiByYW5nZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJhbmdlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFJlYWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgaWRlbnRpdHkgfSBmcm9tICcuL0lkZW50aXR5JztcbmV4cG9ydCBmdW5jdGlvbiByZWFsKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IGlucHV0IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgaW5wdXREYXRhID0gYmFja2VuZC50ZXhEYXRhLmdldChpbnB1dC5kYXRhSWQpO1xuICAgIHJldHVybiBpZGVudGl0eSh7IGlucHV0czogeyB4OiBpbnB1dERhdGEuY29tcGxleFRlbnNvckluZm9zLnJlYWwgfSwgYmFja2VuZCB9KTtcbn1cbmV4cG9ydCBjb25zdCByZWFsQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJlYWwsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogcmVhbFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlYWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUmVhbERpdiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBiaW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG4vLyBXaXRob3V0IHRoZSBlcXVhbGl0eSBjaGVjayBkaXYgcHJvZHVjZXMgMC45OTk5IGZvciBhID0gYiwgd2hpY2ggd2hlblxuLy8gZmxvb3JlZCBjYW4gY2F1c2UgZXJyb3JzLlxuY29uc3QgRElWID0gYFxuaWYgKGEgPT0gYikge1xuICByZXR1cm4gMS4wO1xufTtcbnJldHVybiBhIC8gYjtgO1xuLy8gV2UgZG8gdGhlIHNhbWUgYXMgaW4gLi9iaW5hcnlvcF9ncHUsIHdpdGggdmVjNCBhbmQgaXZlYzQuXG4vLyBPbiBMaW51eCwgdGhlIHZlY3Rvcml6ZWQgaW1wbGVtZW50YXRpb24gcHJvZHVjZXMgTmFOcyB3aGVuIGEgYW5kIGIgYXJlIDAuXG5jb25zdCBESVZfUEFDS0VEID0gYFxuICAvLyB2ZWM0IG9uZSA9IHZlYzQoZXF1YWwoYSwgYikpO1xuICAvLyByZXR1cm4gb25lICsgKHZlYzQoMS4wKSAtIG9uZSkgKiBhIC8gYjtcbiAgdmVjNCByZXN1bHQgPSBhIC8gYjtcbiAgaWYoYS54ID09IGIueCkge1xuICAgIHJlc3VsdC54ID0gMS47XG4gIH1cbiAgaWYoYS55ID09IGIueSkge1xuICAgIHJlc3VsdC55ID0gMS47XG4gIH1cbiAgaWYoYS56ID09IGIueikge1xuICAgIHJlc3VsdC56ID0gMS47XG4gIH1cbiAgaWYoYS53ID09IGIudykge1xuICAgIHJlc3VsdC53ID0gMS47XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xuYDtcbmV4cG9ydCBjb25zdCByZWFsRGl2ID0gYmluYXJ5S2VybmVsRnVuYyh7IG9wU25pcHBldDogRElWLCBwYWNrZWRPcFNuaXBwZXQ6IERJVl9QQUNLRUQsIGNoZWNrT3V0T2ZCb3VuZHM6IHRydWUgfSk7XG5leHBvcnQgY29uc3QgcmVhbERpdkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBSZWFsRGl2LFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IHJlYWxEaXYsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVhbERpdi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBSZWNpcHJvY2FsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuY29uc3QgUkVDSVBST0NBTCA9IGByZXR1cm4gMS4wIC8geDtgO1xuZXhwb3J0IGNvbnN0IHJlY2lwcm9jYWwgPSB1bmFyeUtlcm5lbEZ1bmMoeyBvcFNuaXBwZXQ6IFJFQ0lQUk9DQUwgfSk7XG5leHBvcnQgY29uc3QgcmVjaXByb2NhbENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBSZWNpcHJvY2FsLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IHJlY2lwcm9jYWwsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVjaXByb2NhbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBSZWx1IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHsgQ0hFQ0tfTkFOX1NOSVBQRVQgfSBmcm9tICcuLi91bmFyeW9wX2dwdSc7XG5jb25zdCBSRUxVID0gQ0hFQ0tfTkFOX1NOSVBQRVQgKyBgXG4gIHJldHVybiAoeCA8IDAuMCkgPyAwLjAgOiB4O1xuYDtcbmNvbnN0IFJFTFVfUEFDS0VEID0gYFxuICB2ZWM0IHJlc3VsdCA9IHggKiB2ZWM0KGdyZWF0ZXJUaGFuRXF1YWwoeCwgdmVjNCgwLjApKSk7XG4gIGJ2ZWM0IGlzTmFOID0gaXNuYW4oeCk7XG5cbiAgcmVzdWx0LnIgPSBpc05hTi5yID8geC5yIDogcmVzdWx0LnI7XG4gIHJlc3VsdC5nID0gaXNOYU4uZyA/IHguZyA6IHJlc3VsdC5nO1xuICByZXN1bHQuYiA9IGlzTmFOLmIgPyB4LmIgOiByZXN1bHQuYjtcbiAgcmVzdWx0LmEgPSBpc05hTi5hID8geC5hIDogcmVzdWx0LmE7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbmA7XG5leHBvcnQgY29uc3QgcmVsdSA9IHVuYXJ5S2VybmVsRnVuYyh7IG9wU25pcHBldDogUkVMVSwgcGFja2VkT3BTbmlwcGV0OiBSRUxVX1BBQ0tFRCB9KTtcbmV4cG9ydCBjb25zdCByZWx1Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJlbHUsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogcmVsdVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlbHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUmVsdTYgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQgeyBDSEVDS19OQU5fU05JUFBFVCB9IGZyb20gJy4uL3VuYXJ5b3BfZ3B1JztcbmNvbnN0IFJFTFU2ID0gQ0hFQ0tfTkFOX1NOSVBQRVQgKyBgXG4gIHJldHVybiAoeCA8IDAuMCkgPyAwLjAgOiBtaW4oNi4wLCB4KTtcbmA7XG5jb25zdCBSRUxVNl9QQUNLRUQgPSBgXG4gIHZlYzQgcmVzdWx0ID0gbWluKHgsIHZlYzQoNi4pKSAqIHZlYzQoZ3JlYXRlclRoYW5FcXVhbCh4LCB2ZWM0KDAuMCkpKTtcbiAgYnZlYzQgaXNOYU4gPSBpc25hbih4KTtcblxuICByZXN1bHQuciA9IGlzTmFOLnIgPyB4LnIgOiByZXN1bHQucjtcbiAgcmVzdWx0LmcgPSBpc05hTi5nID8geC5nIDogcmVzdWx0Lmc7XG4gIHJlc3VsdC5iID0gaXNOYU4uYiA/IHguYiA6IHJlc3VsdC5iO1xuICByZXN1bHQuYSA9IGlzTmFOLmEgPyB4LmEgOiByZXN1bHQuYTtcblxuICByZXR1cm4gcmVzdWx0O1xuYDtcbmV4cG9ydCBjb25zdCByZWx1NiA9IHVuYXJ5S2VybmVsRnVuYyh7IG9wU25pcHBldDogUkVMVTYsIHBhY2tlZE9wU25pcHBldDogUkVMVTZfUEFDS0VEIH0pO1xuZXhwb3J0IGNvbnN0IHJlbHU2Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJlbHU2LFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IHJlbHU2XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVsdTYuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUmVzaGFwZSwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBwYWNrZWRSZXNoYXBlIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3Jlc2hhcGUnO1xuaW1wb3J0IHsgaXNSZXNoYXBlRnJlZSB9IGZyb20gJy4uL3dlYmdsX3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2hhcGUoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHNoYXBlIH0gPSBhdHRycztcbiAgICBjb25zdCB3ZWJnbEJhY2tlbmQgPSBiYWNrZW5kO1xuICAgIGNvbnN0IHhTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHguc2hhcGUpO1xuICAgIGNvbnN0ICRzaGFwZSA9IHV0aWwuaW5mZXJGcm9tSW1wbGljaXRTaGFwZShzaGFwZSwgeFNpemUpO1xuICAgIGNvbnN0ICR4U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSgkc2hhcGUpO1xuICAgIHV0aWwuYXNzZXJ0KHhTaXplID09PSAkeFNpemUsICgpID0+IGBUaGUgbmV3IHNoYXBlICgkeyRzaGFwZX0pIGhhcyAkeyR4U2l6ZX0gZWxlbWVudHMgYW5kIHRoZSBvbGQgYCArXG4gICAgICAgIGBzaGFwZSAoJHt4LnNoYXBlfSkgaGFzICR7eFNpemV9IGVsZW1lbnRzLiBUaGUgbmV3IHNoYXBlIGFuZCBvbGQgYCArXG4gICAgICAgIGBzaGFwZSBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGVsZW1lbnRzLmApO1xuICAgIGNvbnN0IHhUZXhEYXRhID0gd2ViZ2xCYWNrZW5kLnRleERhdGEuZ2V0KHguZGF0YUlkKTtcbiAgICBpZiAoeFRleERhdGEuaXNQYWNrZWQgJiYgIWlzUmVzaGFwZUZyZWUoeC5zaGFwZSwgJHNoYXBlKSAmJlxuICAgICAgICAhKHhUZXhEYXRhLnRleHR1cmUgIT09IG51bGwgJiYgaXNSZXNoYXBlRnJlZSh4VGV4RGF0YS5zaGFwZSwgJHNoYXBlKSkpIHtcbiAgICAgICAgcmV0dXJuIHBhY2tlZFJlc2hhcGUoeCwgJHNoYXBlLCB3ZWJnbEJhY2tlbmQpO1xuICAgIH1cbiAgICB3ZWJnbEJhY2tlbmQuaW5jUmVmKHguZGF0YUlkKTtcbiAgICByZXR1cm4geyBkYXRhSWQ6IHguZGF0YUlkLCBzaGFwZTogJHNoYXBlLCBkdHlwZTogeC5kdHlwZSB9O1xufVxuZXhwb3J0IGNvbnN0IHJlc2hhcGVDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUmVzaGFwZSxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiByZXNoYXBlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVzaGFwZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBlbnYsIFJlc2l6ZUJpbGluZWFyIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IFJlc2l6ZUJpbGluZWFyUHJvZ3JhbSB9IGZyb20gJy4uL3Jlc2l6ZV9iaWxpbmVhcl9ncHUnO1xuaW1wb3J0IHsgUmVzaXplQmlsaW5lYXJQYWNrZWRQcm9ncmFtIH0gZnJvbSAnLi4vcmVzaXplX2JpbGluZWFyX3BhY2tlZF9ncHUnO1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2l6ZUJpbGluZWFyKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBpbWFnZXMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGFsaWduQ29ybmVycywgaGFsZlBpeGVsQ2VudGVycywgc2l6ZSB9ID0gYXR0cnM7XG4gICAgY29uc3QgW25ld0hlaWdodCwgbmV3V2lkdGhdID0gc2l6ZTtcbiAgICBjb25zdCBwcm9ncmFtID0gZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19JTUFHRV9PUEVSQVRJT05TJykgP1xuICAgICAgICBuZXcgUmVzaXplQmlsaW5lYXJQYWNrZWRQcm9ncmFtKGltYWdlcy5zaGFwZSwgbmV3SGVpZ2h0LCBuZXdXaWR0aCwgYWxpZ25Db3JuZXJzLCBoYWxmUGl4ZWxDZW50ZXJzKSA6XG4gICAgICAgIG5ldyBSZXNpemVCaWxpbmVhclByb2dyYW0oaW1hZ2VzLnNoYXBlLCBuZXdIZWlnaHQsIG5ld1dpZHRoLCBhbGlnbkNvcm5lcnMsIGhhbGZQaXhlbENlbnRlcnMpO1xuICAgIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbaW1hZ2VzXSwgJ2Zsb2F0MzInKTtcbn1cbmV4cG9ydCBjb25zdCByZXNpemVCaWxpbmVhckNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBSZXNpemVCaWxpbmVhcixcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiByZXNpemVCaWxpbmVhclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlc2l6ZUJpbGluZWFyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFJlc2l6ZUJpbGluZWFyR3JhZCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBSZXNpemVCaWxpbmVhckJhY2twcm9wUHJvZ3JhbSB9IGZyb20gJy4uL3Jlc2l6ZV9iaWxpbmVhcl9iYWNrcHJvcF9ncHUnO1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2l6ZUJpbGluZWFyR3JhZChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW1hZ2VzLCBkeSB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYWxpZ25Db3JuZXJzIH0gPSBhdHRycztcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IFJlc2l6ZUJpbGluZWFyQmFja3Byb3BQcm9ncmFtKGR5LnNoYXBlLCBpbWFnZXMuc2hhcGUsIGFsaWduQ29ybmVycyk7XG4gICAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtkeV0sIGR5LmR0eXBlKTtcbn1cbmV4cG9ydCBjb25zdCByZXNpemVCaWxpbmVhckdyYWRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUmVzaXplQmlsaW5lYXJHcmFkLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IHJlc2l6ZUJpbGluZWFyR3JhZFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlc2l6ZUJpbGluZWFyR3JhZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBlbnYsIFJlc2l6ZU5lYXJlc3ROZWlnaGJvciB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBSZXNpemVOZWFyZXN0TmVpZ2hib3JQcm9ncmFtIH0gZnJvbSAnLi4vcmVzaXplX25lYXJlc3RfbmVpZ2hib3JfZ3B1JztcbmltcG9ydCB7IFJlc2l6ZU5lYXJlc3ROZWlnaGJvclBhY2tlZFByb2dyYW0gfSBmcm9tICcuLi9yZXNpemVfbmVhcmVzdF9uZWlnaGJvcl9wYWNrZWRfZ3B1JztcbmV4cG9ydCBmdW5jdGlvbiByZXNpemVOZWFyZXN0TmVpZ2hib3IoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGltYWdlcyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYWxpZ25Db3JuZXJzLCBoYWxmUGl4ZWxDZW50ZXJzLCBzaXplIH0gPSBhdHRycztcbiAgICBjb25zdCBbbmV3SGVpZ2h0LCBuZXdXaWR0aF0gPSBzaXplO1xuICAgIGNvbnN0IHByb2dyYW0gPSBlbnYoKS5nZXRCb29sKCdXRUJHTF9QQUNLX0lNQUdFX09QRVJBVElPTlMnKSA/XG4gICAgICAgIG5ldyBSZXNpemVOZWFyZXN0TmVpZ2hib3JQYWNrZWRQcm9ncmFtKGltYWdlcy5zaGFwZSwgbmV3SGVpZ2h0LCBuZXdXaWR0aCwgYWxpZ25Db3JuZXJzLCBoYWxmUGl4ZWxDZW50ZXJzKSA6XG4gICAgICAgIG5ldyBSZXNpemVOZWFyZXN0TmVpZ2hib3JQcm9ncmFtKGltYWdlcy5zaGFwZSwgbmV3SGVpZ2h0LCBuZXdXaWR0aCwgYWxpZ25Db3JuZXJzLCBoYWxmUGl4ZWxDZW50ZXJzKTtcbiAgICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW2ltYWdlc10sIGltYWdlcy5kdHlwZSk7XG59XG5leHBvcnQgY29uc3QgcmVzaXplTmVhcmVzdE5laWdoYm9yQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJlc2l6ZU5lYXJlc3ROZWlnaGJvcixcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiByZXNpemVOZWFyZXN0TmVpZ2hib3Jcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZXNpemVOZWFyZXN0TmVpZ2hib3IuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBSZXNpemVOZWFyZXN0TmVpZ2JvckJhY2twcm9wUHJvZ3JhbSB9IGZyb20gJy4uL3Jlc2l6ZV9uZWFyZXN0X25laWdoYm9yX2JhY2twcm9wX2dwdSc7XG5leHBvcnQgZnVuY3Rpb24gcmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW1hZ2VzLCBkeSB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYWxpZ25Db3JuZXJzIH0gPSBhdHRycztcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IFJlc2l6ZU5lYXJlc3ROZWlnYm9yQmFja3Byb3BQcm9ncmFtKGR5LnNoYXBlLCBpbWFnZXMuc2hhcGUsIGFsaWduQ29ybmVycyk7XG4gICAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtkeV0sIGR5LmR0eXBlKTtcbn1cbmV4cG9ydCBjb25zdCByZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWQsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogcmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZW52LCBSZXZlcnNlLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IFJldmVyc2VQcm9ncmFtIH0gZnJvbSAnLi4vcmV2ZXJzZV9ncHUnO1xuaW1wb3J0IHsgUmV2ZXJzZVBhY2tlZFByb2dyYW0gfSBmcm9tICcuLi9yZXZlcnNlX3BhY2tlZF9ncHUnO1xuaW1wb3J0IHsgaWRlbnRpdHkgfSBmcm9tICcuL0lkZW50aXR5JztcbmV4cG9ydCBmdW5jdGlvbiByZXZlcnNlKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBkaW1zIH0gPSBhdHRycztcbiAgICBjb25zdCB4UmFuayA9IHguc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0ICRkaW1zID0gdXRpbC5wYXJzZUF4aXNQYXJhbShkaW1zLCB4LnNoYXBlKTtcbiAgICBpZiAoeFJhbmsgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGlkZW50aXR5KHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCB9KTtcbiAgICB9XG4gICAgY29uc3QgcHJvZ3JhbSA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfQVJSQVlfT1BFUkFUSU9OUycpID9cbiAgICAgICAgbmV3IFJldmVyc2VQYWNrZWRQcm9ncmFtKHguc2hhcGUsICRkaW1zKSA6XG4gICAgICAgIG5ldyBSZXZlcnNlUHJvZ3JhbSh4LnNoYXBlLCAkZGltcyk7XG4gICAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4XSwgeC5kdHlwZSk7XG59XG5leHBvcnQgY29uc3QgcmV2ZXJzZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBSZXZlcnNlLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IHJldmVyc2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZXZlcnNlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBSb3RhdGVXaXRoT2Zmc2V0IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IFJvdGF0ZVByb2dyYW0gfSBmcm9tICcuLi9yb3RhdGVfZ3B1JztcbmV4cG9ydCBjb25zdCByb3RhdGVXaXRoT2Zmc2V0Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJvdGF0ZVdpdGhPZmZzZXQsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogKHsgaW5wdXRzLCBhdHRycywgYmFja2VuZCB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgaW1hZ2UgfSA9IGlucHV0cztcbiAgICAgICAgY29uc3QgeyByYWRpYW5zLCBmaWxsVmFsdWUsIGNlbnRlciB9ID0gYXR0cnM7XG4gICAgICAgIGNvbnN0IHdlYmdsQmFja2VuZCA9IGJhY2tlbmQ7XG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgUm90YXRlUHJvZ3JhbShpbWFnZS5zaGFwZSwgZmlsbFZhbHVlKTtcbiAgICAgICAgY29uc3QgW2NlbnRlclgsIGNlbnRlclldID0gYmFja2VuZF91dGlsLmdldEltYWdlQ2VudGVyKGNlbnRlciwgaW1hZ2Uuc2hhcGVbMV0sIGltYWdlLnNoYXBlWzJdKTtcbiAgICAgICAgY29uc3QgY3VzdG9tVmFsdWVzID0gW1tjZW50ZXJYLCBjZW50ZXJZLCBNYXRoLnNpbihyYWRpYW5zKSwgTWF0aC5jb3MocmFkaWFucyldXTtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gd2ViZ2xCYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbaW1hZ2VdLCBpbWFnZS5kdHlwZSwgY3VzdG9tVmFsdWVzKTtcbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Um90YXRlV2l0aE9mZnNldC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBSb3VuZCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmNvbnN0IFJPVU5EID0gYFxuICAvLyBPcGVuR0wgRVMgZG9lcyBub3Qgc3VwcG9ydCByb3VuZCBmdW5jdGlvbi5cbiAgLy8gVGhlIGFsZ29yaXRobSBpcyBiYXNlZCBvbiBiYW5rZXIncyByb3VuZGluZy5cbiAgZmxvYXQgYmFzZSA9IGZsb29yKHgpO1xuICBpZiAoKHggLSBiYXNlKSA8IDAuNSkge1xuICAgIHJldHVybiBmbG9vcih4KTtcbiAgfSBlbHNlIGlmICgoeCAtIGJhc2UpID4gMC41KSB7XG4gICAgcmV0dXJuIGNlaWwoeCk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKG1vZChiYXNlLCAyLjApID09IDAuMCkge1xuICAgICAgcmV0dXJuIGJhc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBiYXNlICsgMS4wO1xuICAgIH1cbiAgfVxuYDtcbmV4cG9ydCBjb25zdCByb3VuZCA9IHVuYXJ5S2VybmVsRnVuYyh7IG9wU25pcHBldDogUk9VTkQgfSk7XG5leHBvcnQgY29uc3Qgcm91bmRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUm91bmQsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogcm91bmQsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Um91bmQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUnNxcnQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQgeyByc3FydEltcGxDUFUgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmNvbnN0IFJTUVJUID0gYHJldHVybiBpbnZlcnNlc3FydCh4KTtgO1xuZXhwb3J0IGNvbnN0IHJzcXJ0ID0gdW5hcnlLZXJuZWxGdW5jKHsgb3BTbmlwcGV0OiBSU1FSVCwgY3B1S2VybmVsSW1wbDogcnNxcnRJbXBsQ1BVIH0pO1xuZXhwb3J0IGNvbnN0IHJzcXJ0Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJzcXJ0LFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IHJzcXJ0XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UnNxcnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBTY2F0dGVyTmQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgU2NhdHRlclByb2dyYW0gfSBmcm9tICcuLi9zY2F0dGVyX2dwdSc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmV4cG9ydCBmdW5jdGlvbiBzY2F0dGVyTmQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGluZGljZXMsIHVwZGF0ZXMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHNoYXBlIH0gPSBhdHRycztcbiAgICBjb25zdCB7IHNsaWNlUmFuaywgbnVtVXBkYXRlcywgc2xpY2VTaXplLCBzdHJpZGVzLCBvdXRwdXRTaXplIH0gPSBiYWNrZW5kX3V0aWwuY2FsY3VsYXRlU2hhcGVzKHVwZGF0ZXMsIGluZGljZXMsIHNoYXBlKTtcbiAgICBjb25zdCBmbGF0dGVuU2hhcGUgPSBbb3V0cHV0U2l6ZSAvIHNsaWNlU2l6ZSwgc2xpY2VTaXplXTtcbiAgICBpZiAob3V0cHV0U2l6ZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhzaGFwZSwgaW5kaWNlcy5kdHlwZSk7XG4gICAgfVxuICAgIGNvbnN0IGZsYXR0ZW5JbmRpY2VzID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiBpbmRpY2VzIH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBbbnVtVXBkYXRlcywgc2xpY2VSYW5rXSB9IH0pO1xuICAgIGNvbnN0IGZsYXR0ZW5YID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiB1cGRhdGVzIH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBbbnVtVXBkYXRlcywgc2xpY2VTaXplXSB9IH0pO1xuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8oW10sICdmbG9hdDMyJywgbmV3IEZsb2F0MzJBcnJheShbMF0pKTsgLy8gc2NhbGFyKDApXG4gICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBTY2F0dGVyUHJvZ3JhbShudW1VcGRhdGVzLCBzbGljZVJhbmssIGZsYXR0ZW5JbmRpY2VzLnNoYXBlLmxlbmd0aCwgZmxhdHRlblguc2hhcGUubGVuZ3RoLCBzdHJpZGVzLCBmbGF0dGVuU2hhcGUpO1xuICAgIGNvbnN0IHJlcyA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtmbGF0dGVuWCwgZmxhdHRlbkluZGljZXMsIGRlZmF1bHRWYWx1ZV0sIGZsYXR0ZW5YLmR0eXBlKTtcbiAgICBjb25zdCByZXNoYXBlZCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogcmVzIH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlIH0gfSk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhmbGF0dGVuSW5kaWNlcyk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhmbGF0dGVuWCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXMpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oZGVmYXVsdFZhbHVlKTtcbiAgICByZXR1cm4gcmVzaGFwZWQ7XG59XG5leHBvcnQgY29uc3Qgc2NhdHRlck5kQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNjYXR0ZXJOZCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBzY2F0dGVyTmRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TY2F0dGVyTmQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU2VsZWN0LCB1cGNhc3RUeXBlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IFNlbGVjdFByb2dyYW0gfSBmcm9tICcuLi9zZWxlY3RfZ3B1JztcbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3QoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgY29uZGl0aW9uLCB0LCBlIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBTZWxlY3RQcm9ncmFtKGNvbmRpdGlvbi5zaGFwZS5sZW5ndGgsIHQuc2hhcGUsIHQuc2hhcGUubGVuZ3RoKTtcbiAgICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW2NvbmRpdGlvbiwgdCwgZV0sIHVwY2FzdFR5cGUodC5kdHlwZSwgZS5kdHlwZSkpO1xufVxuZXhwb3J0IGNvbnN0IHNlbGVjdENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTZWxlY3QsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogc2VsZWN0XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2VsZWN0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgU2VsdSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmNvbnN0IFNFTFUgPSBgXG4gIC8vIFN0YWJsZSBhbmQgQXR0cmFjdGluZyBGaXhlZCBQb2ludCAoMCwgMSkgZm9yIE5vcm1hbGl6ZWQgV2VpZ2h0cy5cbiAgLy8gc2VlOiBodHRwczovL2FyeGl2Lm9yZy9hYnMvMTcwNi4wMjUxNVxuICBmbG9hdCBzY2FsZUFscGhhID0gJHtiYWNrZW5kX3V0aWwuU0VMVV9TQ0FMRUFMUEhBfTtcbiAgZmxvYXQgc2NhbGUgPSAke2JhY2tlbmRfdXRpbC5TRUxVX1NDQUxFfTtcbiAgcmV0dXJuICh4ID49IDAuMCkgPyBzY2FsZSAqIHggOiBzY2FsZUFscGhhICogKGV4cCh4KSAtIDEuMCk7XG5gO1xuZXhwb3J0IGNvbnN0IHNlbHUgPSB1bmFyeUtlcm5lbEZ1bmMoeyBvcFNuaXBwZXQ6IFNFTFUgfSk7XG5leHBvcnQgY29uc3Qgc2VsdUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTZWx1LFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IHNlbHUsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2VsdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTaWdtb2lkIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuY29uc3QgU0lHTU9JRCA9IGByZXR1cm4gMS4wIC8gKDEuMCArIGV4cCgtMS4wICogeCkpO2A7XG5leHBvcnQgY29uc3Qgc2lnbW9pZCA9IHVuYXJ5S2VybmVsRnVuYyh7IG9wU25pcHBldDogU0lHTU9JRCB9KTtcbmV4cG9ydCBjb25zdCBzaWdtb2lkQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNpZ21vaWQsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogc2lnbW9pZCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TaWdtb2lkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFNpZ24gfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG4vLyBTaWduIGRvZXMgbm90IHByb3BhZ2F0ZSBOQU5zLlxuY29uc3QgU0lHTiA9IGBcbiAgaWYgKGlzbmFuKHgpKSB7IHJldHVybiAwLjA7IH1cbiAgcmV0dXJuIHNpZ24oeCk7XG5gO1xuZXhwb3J0IGNvbnN0IHNpZ24gPSB1bmFyeUtlcm5lbEZ1bmMoeyBvcFNuaXBwZXQ6IFNJR04gfSk7XG5leHBvcnQgY29uc3Qgc2lnbkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTaWduLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IHNpZ24sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2lnbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTaW4gfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgQ0hFQ0tfTkFOX1NOSVBQRVRfVU5BUlksIHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuY29uc3QgU0lOID0gQ0hFQ0tfTkFOX1NOSVBQRVRfVU5BUlkgKyBgXG4gIHJldHVybiBzaW4oeCk7XG5gO1xuZXhwb3J0IGNvbnN0IHNpbiA9IHVuYXJ5S2VybmVsRnVuYyh7IG9wU25pcHBldDogU0lOIH0pO1xuZXhwb3J0IGNvbnN0IHNpbkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTaW4sXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogc2luLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNpbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTaW5oIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuY29uc3QgU0lOSCA9IGBcbiAgZmxvYXQgZTJ4ID0gZXhwKHgpO1xuICByZXR1cm4gKGUyeCAtIDEuMCAvIGUyeCkgLyAyLjA7XG5gO1xuZXhwb3J0IGNvbnN0IHNpbmggPSB1bmFyeUtlcm5lbEZ1bmMoeyBvcFNuaXBwZXQ6IFNJTkggfSk7XG5leHBvcnQgY29uc3Qgc2luaENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTaW5oLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IHNpbmgsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2luaC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBlbnYsIFNsaWNlLCBzbGljZV91dGlsLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHNsaWNlSW1wbENQVSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuaW1wb3J0IHsgU2xpY2VQcm9ncmFtIH0gZnJvbSAnLi4vc2xpY2VfZ3B1JztcbmltcG9ydCB7IFNsaWNlUGFja2VkUHJvZ3JhbSB9IGZyb20gJy4uL3NsaWNlX3BhY2tlZF9ncHUnO1xuZnVuY3Rpb24gc2hhbGxvd1NsaWNlKHgsIGJlZ2luLCBzaXplLCBiYWNrZW5kKSB7XG4gICAgY29uc3QgeFRleERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KHguZGF0YUlkKTtcbiAgICBjb25zdCB0ID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhzaXplLCB4LmR0eXBlKTtcbiAgICBjb25zdCBuZXdUZXhEYXRhID0gYmFja2VuZC50ZXhEYXRhLmdldCh0LmRhdGFJZCk7XG4gICAgLy8gQ29weSB0ZXh0dXJlIGRhdGEgZnJvbSB0aGUgb3JpZ2luYWwgdGVuc29yLlxuICAgIE9iamVjdC5hc3NpZ24obmV3VGV4RGF0YSwgeFRleERhdGEpO1xuICAgIG5ld1RleERhdGEucmVmQ291bnQgPSAxO1xuICAgIG5ld1RleERhdGEuc2hhcGUgPSBzaXplO1xuICAgIG5ld1RleERhdGEuZHR5cGUgPSB4LmR0eXBlO1xuICAgIGxldCBmbGF0T2Zmc2V0ID0gc2xpY2VfdXRpbC5jb21wdXRlRmxhdE9mZnNldChiZWdpbiwgdXRpbC5jb21wdXRlU3RyaWRlcyh4LnNoYXBlKSk7XG4gICAgaWYgKHhUZXhEYXRhLnNsaWNlKSB7XG4gICAgICAgIC8vIFdlIGFyZSBzbGljaW5nIGFuIGFscmVhZHkgc2xpY2VkIHRlbnNvciwgc28gd2UgaGF2ZSB0byBhY2N1bXVsYXRlXG4gICAgICAgIC8vIHRoZSBvZmZzZXQuXG4gICAgICAgIGZsYXRPZmZzZXQgKz0geFRleERhdGEuc2xpY2UuZmxhdE9mZnNldDtcbiAgICB9XG4gICAgbmV3VGV4RGF0YS5zbGljZSA9IHtcbiAgICAgICAgZmxhdE9mZnNldCxcbiAgICAgICAgLy8gUG9pbnQgdG8gdGhlIG9yaWdpbmFsIGRhdGFJZCwgd2hpY2ggaXMgdXNlZCB0byBkbyByZWYgY291bnRpbmcuXG4gICAgICAgIG9yaWdEYXRhSWQ6IHhUZXhEYXRhLnNsaWNlICYmIHhUZXhEYXRhLnNsaWNlLm9yaWdEYXRhSWQgfHwgeC5kYXRhSWRcbiAgICB9O1xuICAgIC8vIEluY3JlYXNlIHRoZSByZWYgY291bnQgZm9yIHRoYXQgZGF0YSBidWNrZXQuXG4gICAgY29uc3QgcmVmQ291bnQgPSBiYWNrZW5kLmRhdGFSZWZDb3VudC5nZXQobmV3VGV4RGF0YS5zbGljZS5vcmlnRGF0YUlkKSB8fCAxO1xuICAgIGJhY2tlbmQuZGF0YVJlZkNvdW50LnNldChuZXdUZXhEYXRhLnNsaWNlLm9yaWdEYXRhSWQsIHJlZkNvdW50ICsgMSk7XG4gICAgcmV0dXJuIHQ7XG59XG5leHBvcnQgZnVuY3Rpb24gc2xpY2UoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGJlZ2luLCBzaXplIH0gPSBhdHRycztcbiAgICBjb25zdCBbJGJlZ2luLCAkc2l6ZV0gPSBzbGljZV91dGlsLnBhcnNlU2xpY2VQYXJhbXMoeCwgYmVnaW4sIHNpemUpO1xuICAgIHNsaWNlX3V0aWwuYXNzZXJ0UGFyYW1zVmFsaWQoeCwgJGJlZ2luLCAkc2l6ZSk7XG4gICAgaWYgKHV0aWwuc2l6ZUZyb21TaGFwZSgkc2l6ZSkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oJHNpemUsIHguZHR5cGUsIFtdKTtcbiAgICB9XG4gICAgLy8gUnVuIG9uIGNwdSBpZiBkdHlwZSBpcyBzdHJpbmcuIEZvciBzdHJpbmcsIHRoZSBiYWNrZW5kIHJlcHJlc2VudHMgaXRcbiAgICAvLyBhcyBVaW50OEFycmF5W10sIHdoZXJlIGVhY2ggVWludDhBcnJheSBpcyBhIGNoYXJhY3Rlci4gR2l2ZW4gdGhhdCB0aGVcbiAgICAvLyBjb21wdXRhdGlvbiBpcyBvbmx5IG9uIHRoZSBvdXRlciBhcnJheSwgdXBsb2FkaW5nIHRoZSB3aG9sZSBkYXRhIG9udG9cbiAgICAvLyBncHUgaXMgd2FzdGVmdWwuIEFsc28sIGN1cnJlbnRseSB3ZWJnbCBkb2Vzbid0IGhhdmUgYSBkZXNpZ24gdG9cbiAgICAvLyB1cGxvYWQgYW5kIHJldHJpZXZlIFVpbnQ4QXJyYXlbXSBiZXR3ZWVuIGNwdSBhbmQgZ3B1LiBUaGVyZWZvcmUsIHdlXG4gICAgLy8ganVzdCBydW4gdGhlIGtlcm5lbCBvbiBjcHUgaWYgZHR5cGUgaXMgc3RyaW5nLlxuICAgIGlmIChiYWNrZW5kLnNob3VsZEV4ZWN1dGVPbkNQVShbeF0pIHx8IHguZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IHhUZXhEYXRhID0gYmFja2VuZC50ZXhEYXRhLmdldCh4LmRhdGFJZCk7XG4gICAgICAgIGNvbnN0IG91dFZhbHVlcyA9IHNsaWNlSW1wbENQVSh4VGV4RGF0YS52YWx1ZXMsICRiZWdpbiwgJHNpemUsIHguc2hhcGUsIHguZHR5cGUpO1xuICAgICAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbygkc2l6ZSwgeC5kdHlwZSwgb3V0VmFsdWVzKTtcbiAgICB9XG4gICAgY29uc3QgeyBpc1BhY2tlZCB9ID0gYmFja2VuZC50ZXhEYXRhLmdldCh4LmRhdGFJZCk7XG4gICAgY29uc3QgaXNDb250aW5vdXMgPSBzbGljZV91dGlsLmlzU2xpY2VDb250aW5vdXMoeC5zaGFwZSwgJGJlZ2luLCAkc2l6ZSk7XG4gICAgaWYgKGlzUGFja2VkIHx8ICFpc0NvbnRpbm91cykge1xuICAgICAgICBjb25zdCBwcm9ncmFtID0gZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19BUlJBWV9PUEVSQVRJT05TJykgP1xuICAgICAgICAgICAgbmV3IFNsaWNlUGFja2VkUHJvZ3JhbSgkc2l6ZSkgOlxuICAgICAgICAgICAgbmV3IFNsaWNlUHJvZ3JhbSgkc2l6ZSk7XG4gICAgICAgIGNvbnN0IGN1c3RvbVZhbHVlcyA9IFskYmVnaW5dO1xuICAgICAgICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3hdLCB4LmR0eXBlLCBjdXN0b21WYWx1ZXMpO1xuICAgIH1cbiAgICBiYWNrZW5kLnVwbG9hZFRvR1BVKHguZGF0YUlkKTtcbiAgICByZXR1cm4gc2hhbGxvd1NsaWNlKHgsICRiZWdpbiwgJHNpemUsIGJhY2tlbmQpO1xufVxuZXhwb3J0IGNvbnN0IHNsaWNlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNsaWNlLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IHNsaWNlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2xpY2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBTb2Z0bWF4LCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGV4cCB9IGZyb20gJy4vRXhwJztcbmltcG9ydCB7IG1heCB9IGZyb20gJy4vTWF4JztcbmltcG9ydCB7IHJlYWxEaXYgfSBmcm9tICcuL1JlYWxEaXYnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQgeyBzdWIgfSBmcm9tICcuL1N1Yic7XG5pbXBvcnQgeyBzdW0gfSBmcm9tICcuL1N1bSc7XG5leHBvcnQgZnVuY3Rpb24gc29mdG1heChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgbG9naXRzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBkaW0gfSA9IGF0dHJzO1xuICAgIGNvbnN0IGF4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKFtkaW1dLCBsb2dpdHMuc2hhcGUpO1xuICAgIGNvbnN0IG1heExvZ2l0ID0gbWF4KHtcbiAgICAgICAgaW5wdXRzOiB7IHg6IGxvZ2l0cyB9LFxuICAgICAgICBiYWNrZW5kLFxuICAgICAgICBhdHRyczogeyByZWR1Y3Rpb25JbmRpY2VzOiBheGVzLCBrZWVwRGltczogZmFsc2UgfVxuICAgIH0pO1xuICAgIGNvbnN0IGV4cGFuZGVkU2hhcGUgPSBiYWNrZW5kX3V0aWwuZXhwYW5kU2hhcGVUb0tlZXBEaW0obWF4TG9naXQuc2hhcGUsIGF4ZXMpO1xuICAgIGNvbnN0IG1heExvZ2l0c1Jlc2hhcGVkID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiBtYXhMb2dpdCB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogZXhwYW5kZWRTaGFwZSB9IH0pO1xuICAgIGNvbnN0IGEgPSBzdWIoeyBpbnB1dHM6IHsgYTogbG9naXRzLCBiOiBtYXhMb2dpdHNSZXNoYXBlZCB9LCBiYWNrZW5kIH0pO1xuICAgIGNvbnN0IGIgPSBleHAoeyBpbnB1dHM6IHsgeDogYSB9LCBiYWNrZW5kIH0pO1xuICAgIGNvbnN0IHN1bUV4cCA9IHN1bSh7IGlucHV0czogeyB4OiBiIH0sIGJhY2tlbmQsIGF0dHJzOiB7IGF4aXM6IGF4ZXMsIGtlZXBEaW1zOiBmYWxzZSB9IH0pO1xuICAgIGNvbnN0IHN1bUV4cFJlc2hhcGVkID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiBzdW1FeHAgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IGV4cGFuZGVkU2hhcGUgfSB9KTtcbiAgICBjb25zdCByZXMgPSByZWFsRGl2KHsgaW5wdXRzOiB7IGE6IGIsIGI6IHN1bUV4cFJlc2hhcGVkIH0sIGJhY2tlbmQgfSk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhtYXhMb2dpdCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhtYXhMb2dpdHNSZXNoYXBlZCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhhKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGIpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oc3VtRXhwKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHN1bUV4cFJlc2hhcGVkKTtcbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IHNvZnRtYXhDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU29mdG1heCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBzb2Z0bWF4XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U29mdG1heC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTb2Z0cGx1cyB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmNvbnN0IFNPRlRQTFVTID0gYFxuICBmbG9hdCBlcHNpbG9uID0gMS4xOTIwOTI4OTU1MDc4MTI1ZS03O1xuICBmbG9hdCB0aHJlc2hvbGQgPSBsb2coZXBzaWxvbikgKyAyLjA7XG5cbiAgYm9vbCB0b29fbGFyZ2UgPSB4ID4gLXRocmVzaG9sZDtcbiAgYm9vbCB0b29fc21hbGwgPSB4IDwgdGhyZXNob2xkO1xuXG4gIGZsb2F0IHJlc3VsdDtcbiAgZmxvYXQgZXhwX3ggPSBleHAoeCk7XG5cbiAgaWYgKHRvb19sYXJnZSl7XG4gICAgcmVzdWx0ID0geDtcbiAgfVxuICBlbHNlIGlmICh0b29fc21hbGwpe1xuICAgIHJlc3VsdCA9IGV4cF94O1xuICB9XG4gIGVsc2V7XG4gICAgcmVzdWx0ID0gbG9nKGV4cF94ICsgMS4wKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xuYDtcbmV4cG9ydCBjb25zdCBzb2Z0cGx1cyA9IHVuYXJ5S2VybmVsRnVuYyh7IG9wU25pcHBldDogU09GVFBMVVMgfSk7XG5leHBvcnQgY29uc3Qgc29mdHBsdXNDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU29mdHBsdXMsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogc29mdHBsdXMsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U29mdHBsdXMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBTcGFjZVRvQmF0Y2hORCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBwYWRWMiB9IGZyb20gJy4vUGFkVjInO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQgeyB0cmFuc3Bvc2UgfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5leHBvcnQgY29uc3Qgc3BhY2VUb0JhdGNoTkQgPSAoYXJncykgPT4ge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGJsb2NrU2hhcGUsIHBhZGRpbmdzIH0gPSBhdHRycztcbiAgICB1dGlsLmFzc2VydCh4LnNoYXBlLmxlbmd0aCA8PSA0LCAoKSA9PiAnc3BhY2VUb0JhdGNoTkQgZm9yIHJhbmsgPiA0IHdpdGggYSBXZWJHTCBiYWNrZW5kIG5vdCAnICtcbiAgICAgICAgJ2ltcGxlbWVudGVkIHlldCcpO1xuICAgIGNvbnN0IHByb2QgPSBibG9ja1NoYXBlLnJlZHVjZSgoYSwgYikgPT4gYSAqIGIpO1xuICAgIGNvbnN0IGNvbXBsZXRlUGFkZGluZ3MgPSBbWzAsIDBdXTtcbiAgICBjb21wbGV0ZVBhZGRpbmdzLnB1c2goLi4ucGFkZGluZ3MpO1xuICAgIGZvciAobGV0IGkgPSAxICsgYmxvY2tTaGFwZS5sZW5ndGg7IGkgPCB4LnNoYXBlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbXBsZXRlUGFkZGluZ3MucHVzaChbMCwgMF0pO1xuICAgIH1cbiAgICBjb25zdCB0b0Rpc3Bvc2UgPSBbXTtcbiAgICBjb25zdCBwYWRkZWRYID0gcGFkVjIoe1xuICAgICAgICBpbnB1dHM6IHsgeCB9LFxuICAgICAgICBiYWNrZW5kLFxuICAgICAgICBhdHRyczogeyBwYWRkaW5nczogY29tcGxldGVQYWRkaW5ncywgY29uc3RhbnRWYWx1ZTogMCB9XG4gICAgfSk7XG4gICAgY29uc3QgcmVzaGFwZWRQYWRkZWRTaGFwZSA9IGJhY2tlbmRfdXRpbC5nZXRSZXNoYXBlZChwYWRkZWRYLnNoYXBlLCBibG9ja1NoYXBlLCBwcm9kLCBmYWxzZSk7XG4gICAgY29uc3QgcGVybXV0ZWRSZXNoYXBlZFBhZGRlZFBlcm11dGF0aW9uID0gYmFja2VuZF91dGlsLmdldFBlcm11dGVkKHJlc2hhcGVkUGFkZGVkU2hhcGUubGVuZ3RoLCBibG9ja1NoYXBlLmxlbmd0aCwgZmFsc2UpO1xuICAgIGNvbnN0IGZsYXR0ZW5TaGFwZSA9IGJhY2tlbmRfdXRpbC5nZXRSZXNoYXBlZFBlcm11dGVkKHBhZGRlZFguc2hhcGUsIGJsb2NrU2hhcGUsIHByb2QsIGZhbHNlKTtcbiAgICBjb25zdCByZXNoYXBlZFBhZGRlZFggPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHBhZGRlZFggfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IHJlc2hhcGVkUGFkZGVkU2hhcGUgfSB9KTtcbiAgICBjb25zdCBwYWRkZWRYVCA9IHRyYW5zcG9zZSh7XG4gICAgICAgIGlucHV0czogeyB4OiByZXNoYXBlZFBhZGRlZFggfSxcbiAgICAgICAgYmFja2VuZCxcbiAgICAgICAgYXR0cnM6IHsgcGVybTogcGVybXV0ZWRSZXNoYXBlZFBhZGRlZFBlcm11dGF0aW9uIH1cbiAgICB9KTtcbiAgICBjb25zdCByZXN1bHQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHBhZGRlZFhUIH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBmbGF0dGVuU2hhcGUgfSB9KTtcbiAgICB0b0Rpc3Bvc2UucHVzaChwYWRkZWRYKTtcbiAgICB0b0Rpc3Bvc2UucHVzaChyZXNoYXBlZFBhZGRlZFgpO1xuICAgIHRvRGlzcG9zZS5wdXNoKHBhZGRlZFhUKTtcbiAgICB0b0Rpc3Bvc2UuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuZXhwb3J0IGNvbnN0IHNwYWNlVG9CYXRjaE5EQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNwYWNlVG9CYXRjaE5ELFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IHNwYWNlVG9CYXRjaE5EXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3BhY2VUb0JhdGNoTkQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3BhcnNlRmlsbEVtcHR5Um93cyB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBzcGFyc2VGaWxsRW1wdHlSb3dzSW1wbENQVSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuZXhwb3J0IGZ1bmN0aW9uIHNwYXJzZUZpbGxFbXB0eVJvd3MoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW5kaWNlcywgdmFsdWVzLCBkZW5zZVNoYXBlLCBkZWZhdWx0VmFsdWUgfSA9IGlucHV0cztcbiAgICBpZiAoZGVuc2VTaGFwZS5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEZW5zZSBzaGFwZSBtdXN0IGJlIGEgdmVjdG9yLCBzYXc6XG4gICAgICAgICAke2RlbnNlU2hhcGUuc2hhcGV9YCk7XG4gICAgfVxuICAgIGlmIChpbmRpY2VzLnNoYXBlLmxlbmd0aCAhPT0gMikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluZGljZXMgbXVzdCBiZSBhIG1hdHJpeCwgc2F3OlxuICAgICAgICAgJHtpbmRpY2VzLnNoYXBlfWApO1xuICAgIH1cbiAgICBpZiAodmFsdWVzLnNoYXBlLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFZhbHVlcyBtdXN0IGJlIGEgdmVjdG9yLCBzYXc6XG4gICAgICAgICAke3ZhbHVlcy5zaGFwZX1gKTtcbiAgICB9XG4gICAgaWYgKGRlZmF1bHRWYWx1ZS5zaGFwZS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEZWZhdWx0IHZhbHVlIG11c3QgYmUgYSBzY2FsYXIsIHNhdzpcbiAgICAgICAgJHtkZWZhdWx0VmFsdWUuc2hhcGV9YCk7XG4gICAgfVxuICAgIGNvbnN0ICRpbmRpY2VzID0gYmFja2VuZC5yZWFkU3luYyhpbmRpY2VzLmRhdGFJZCk7XG4gICAgY29uc3QgJHZhbHVlcyA9IGJhY2tlbmQucmVhZFN5bmModmFsdWVzLmRhdGFJZCk7XG4gICAgY29uc3QgJGRlbnNlU2hhcGUgPSBiYWNrZW5kLnJlYWRTeW5jKGRlbnNlU2hhcGUuZGF0YUlkKTtcbiAgICBjb25zdCAkZGVmYXVsdFZhbHVlID0gYmFja2VuZC5yZWFkU3luYyhkZWZhdWx0VmFsdWUuZGF0YUlkKVswXTtcbiAgICBjb25zdCBbb3V0cHV0SW5kaWNlcywgb3V0cHV0SW5kaWNlc1NoYXBlLCBvdXRwdXRWYWx1ZXMsIGVtcHR5Um93SW5kaWNhdG9yLCByZXZlcnNlSW5kZXhNYXBdID0gc3BhcnNlRmlsbEVtcHR5Um93c0ltcGxDUFUoJGluZGljZXMsIGluZGljZXMuc2hhcGUsIGluZGljZXMuZHR5cGUsICR2YWx1ZXMsIHZhbHVlcy5kdHlwZSwgJGRlbnNlU2hhcGUsICRkZWZhdWx0VmFsdWUpO1xuICAgIHJldHVybiBbXG4gICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0cHV0SW5kaWNlc1NoYXBlLCBpbmRpY2VzLmR0eXBlLCBvdXRwdXRJbmRpY2VzKSxcbiAgICAgICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbb3V0cHV0SW5kaWNlc1NoYXBlWzBdXSwgdmFsdWVzLmR0eXBlLCBvdXRwdXRWYWx1ZXMpLFxuICAgICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtlbXB0eVJvd0luZGljYXRvci5sZW5ndGhdLCAnYm9vbCcsIG5ldyBVaW50OEFycmF5KGVtcHR5Um93SW5kaWNhdG9yLm1hcCgodmFsdWUpID0+IE51bWJlcih2YWx1ZSkpKSksXG4gICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW3JldmVyc2VJbmRleE1hcC5sZW5ndGhdLCBpbmRpY2VzLmR0eXBlLCBuZXcgSW50MzJBcnJheShyZXZlcnNlSW5kZXhNYXApKSxcbiAgICBdO1xufVxuZXhwb3J0IGNvbnN0IHNwYXJzZUZpbGxFbXB0eVJvd3NDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU3BhcnNlRmlsbEVtcHR5Um93cyxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBzcGFyc2VGaWxsRW1wdHlSb3dzLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNwYXJzZUZpbGxFbXB0eVJvd3MuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3BhcnNlUmVzaGFwZSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBzcGFyc2VSZXNoYXBlSW1wbENQVSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuZXhwb3J0IGZ1bmN0aW9uIHNwYXJzZVJlc2hhcGUoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW5wdXRJbmRpY2VzLCBpbnB1dFNoYXBlLCBuZXdTaGFwZSB9ID0gaW5wdXRzO1xuICAgIGlmIChpbnB1dEluZGljZXMuc2hhcGUubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW5wdXQgaW5kaWNlcyBzaG91bGQgYmUgYSBtYXRyaXggYnV0IHJlY2VpdmVkIHNoYXBlICR7aW5wdXRJbmRpY2VzLnNoYXBlfWApO1xuICAgIH1cbiAgICBpZiAoaW5wdXRTaGFwZS5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnB1dCBzaGFwZSBzaG91bGQgYmUgYSB2ZWN0b3IgYnV0IHJlY2VpdmVkIHNoYXBlICR7aW5wdXRTaGFwZS5zaGFwZX1gKTtcbiAgICB9XG4gICAgaWYgKG5ld1NoYXBlLnNoYXBlLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRhcmdldCBzaGFwZSBzaG91bGQgYmUgYSB2ZWN0b3IgYnV0IHJlY2VpdmVkIHNoYXBlICR7bmV3U2hhcGUuc2hhcGV9YCk7XG4gICAgfVxuICAgIGNvbnN0ICRpbnB1dFNoYXBlID0gQXJyYXkuZnJvbShiYWNrZW5kLnJlYWRTeW5jKGlucHV0U2hhcGUuZGF0YUlkKSk7XG4gICAgY29uc3QgJGlucHV0SW5kaWNlcyA9IGJhY2tlbmQucmVhZFN5bmMoaW5wdXRJbmRpY2VzLmRhdGFJZCk7XG4gICAgY29uc3QgdGFyZ2V0U2hhcGUgPSBBcnJheS5mcm9tKGJhY2tlbmQucmVhZFN5bmMobmV3U2hhcGUuZGF0YUlkKSk7XG4gICAgY29uc3QgW25ld0luZGljZXMsIGluZGljZXNTaGFwZSwgb3V0cHV0U2hhcGVdID0gc3BhcnNlUmVzaGFwZUltcGxDUFUoJGlucHV0SW5kaWNlcywgaW5wdXRJbmRpY2VzLnNoYXBlLCBpbnB1dEluZGljZXMuZHR5cGUsICRpbnB1dFNoYXBlLCB0YXJnZXRTaGFwZSk7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhpbmRpY2VzU2hhcGUsIGlucHV0SW5kaWNlcy5kdHlwZSwgbmV3SW5kaWNlcyksXG4gICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW291dHB1dFNoYXBlLmxlbmd0aF0sIG5ld1NoYXBlLmR0eXBlLCBuZXcgSW50MzJBcnJheShvdXRwdXRTaGFwZSkpLFxuICAgIF07XG59XG5leHBvcnQgY29uc3Qgc3BhcnNlUmVzaGFwZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTcGFyc2VSZXNoYXBlLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IHNwYXJzZVJlc2hhcGUsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3BhcnNlUmVzaGFwZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTcGFyc2VTZWdtZW50TWVhbiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBzcGFyc2VTZWdtZW50UmVkdWN0aW9uSW1wbENQVSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuZXhwb3J0IGZ1bmN0aW9uIHNwYXJzZVNlZ21lbnRNZWFuKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IGRhdGEsIGluZGljZXMsIHNlZ21lbnRJZHMgfSA9IGlucHV0cztcbiAgICBpZiAoZGF0YS5zaGFwZS5sZW5ndGggPCAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRGF0YSBzaG91bGQgYmUgYXQgbGVhc3QgMSBkaW1lbnNpb25hbCBidXQgcmVjZWl2ZWQgc2NhbGFyYCk7XG4gICAgfVxuICAgIGlmIChpbmRpY2VzLnNoYXBlLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluZGljZXMgc2hvdWxkIGJlIGEgdmVjdG9yIGJ1dCByZWNlaXZlZCBzaGFwZVxuICAgICAgICAgICAgICAke2luZGljZXMuc2hhcGV9YCk7XG4gICAgfVxuICAgIGlmIChzZWdtZW50SWRzLnNoYXBlLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNlZ21lbnQgaWRzIHNob3VsZCBiZSBhIHZlY3RvciBidXQgcmVjZWl2ZWQgc2hhcGVcbiAgICAgICAgICAgICAgJHtzZWdtZW50SWRzLnNoYXBlfWApO1xuICAgIH1cbiAgICBjb25zdCAkZGF0YSA9IGJhY2tlbmQucmVhZFN5bmMoZGF0YS5kYXRhSWQpO1xuICAgIGNvbnN0ICRpbmRpY2VzID0gYmFja2VuZC5yZWFkU3luYyhpbmRpY2VzLmRhdGFJZCk7XG4gICAgY29uc3QgJHNlZ21lbnRJZHMgPSBiYWNrZW5kLnJlYWRTeW5jKHNlZ21lbnRJZHMuZGF0YUlkKTtcbiAgICBjb25zdCBbb3V0cHV0RGF0YSwgb3V0cHV0RGF0YVNoYXBlXSA9IHNwYXJzZVNlZ21lbnRSZWR1Y3Rpb25JbXBsQ1BVKCRkYXRhLCBkYXRhLnNoYXBlLCBkYXRhLmR0eXBlLCAkaW5kaWNlcywgJHNlZ21lbnRJZHMsIHRydWUpO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dHB1dERhdGFTaGFwZSwgZGF0YS5kdHlwZSwgb3V0cHV0RGF0YSk7XG59XG5leHBvcnQgY29uc3Qgc3BhcnNlU2VnbWVudE1lYW5Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU3BhcnNlU2VnbWVudE1lYW4sXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogc3BhcnNlU2VnbWVudE1lYW4sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3BhcnNlU2VnbWVudE1lYW4uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3BhcnNlU2VnbWVudFN1bSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBzcGFyc2VTZWdtZW50UmVkdWN0aW9uSW1wbENQVSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuZXhwb3J0IGZ1bmN0aW9uIHNwYXJzZVNlZ21lbnRTdW0oYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgZGF0YSwgaW5kaWNlcywgc2VnbWVudElkcyB9ID0gaW5wdXRzO1xuICAgIGlmIChkYXRhLnNoYXBlLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEYXRhIHNob3VsZCBiZSBhdCBsZWFzdCAxIGRpbWVuc2lvbmFsIGJ1dCByZWNlaXZlZCBzY2FsYXJgKTtcbiAgICB9XG4gICAgaWYgKGluZGljZXMuc2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW5kaWNlcyBzaG91bGQgYmUgYSB2ZWN0b3IgYnV0IHJlY2VpdmVkIHNoYXBlXG4gICAgICAgICAgICAgJHtpbmRpY2VzLnNoYXBlfWApO1xuICAgIH1cbiAgICBpZiAoc2VnbWVudElkcy5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZWdtZW50IGlkcyBzaG91bGQgYmUgYSB2ZWN0b3IgYnV0IHJlY2VpdmVkIHNoYXBlXG4gICAgICAgICAgICAgJHtzZWdtZW50SWRzLnNoYXBlfWApO1xuICAgIH1cbiAgICBjb25zdCAkZGF0YSA9IGJhY2tlbmQucmVhZFN5bmMoZGF0YS5kYXRhSWQpO1xuICAgIGNvbnN0ICRpbmRpY2VzID0gYmFja2VuZC5yZWFkU3luYyhpbmRpY2VzLmRhdGFJZCk7XG4gICAgY29uc3QgJHNlZ21lbnRJZHMgPSBiYWNrZW5kLnJlYWRTeW5jKHNlZ21lbnRJZHMuZGF0YUlkKTtcbiAgICBjb25zdCBbb3V0cHV0RGF0YSwgb3V0cHV0RGF0YVNoYXBlXSA9IHNwYXJzZVNlZ21lbnRSZWR1Y3Rpb25JbXBsQ1BVKCRkYXRhLCBkYXRhLnNoYXBlLCBkYXRhLmR0eXBlLCAkaW5kaWNlcywgJHNlZ21lbnRJZHMpO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dHB1dERhdGFTaGFwZSwgZGF0YS5kdHlwZSwgb3V0cHV0RGF0YSk7XG59XG5leHBvcnQgY29uc3Qgc3BhcnNlU2VnbWVudFN1bUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTcGFyc2VTZWdtZW50U3VtLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IHNwYXJzZVNlZ21lbnRTdW0sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3BhcnNlU2VnbWVudFN1bS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIFNwYXJzZVRvRGVuc2UgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgU2NhdHRlclByb2dyYW0gfSBmcm9tICcuLi9zY2F0dGVyX2dwdSc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmV4cG9ydCBmdW5jdGlvbiBzcGFyc2VUb0RlbnNlKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBzcGFyc2VJbmRpY2VzLCBzcGFyc2VWYWx1ZXMsIGRlZmF1bHRWYWx1ZSB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgb3V0cHV0U2hhcGUgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHsgc2xpY2VSYW5rLCBudW1VcGRhdGVzLCBzdHJpZGVzLCBvdXRwdXRTaXplIH0gPSBiYWNrZW5kX3V0aWwuY2FsY3VsYXRlU2hhcGVzKHNwYXJzZVZhbHVlcywgc3BhcnNlSW5kaWNlcywgb3V0cHV0U2hhcGUpO1xuICAgIGNvbnN0IHN1bUR1cGVJbmRpY2VzID0gZmFsc2U7XG4gICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBTY2F0dGVyUHJvZ3JhbShudW1VcGRhdGVzLCBzbGljZVJhbmssIHNwYXJzZUluZGljZXMuc2hhcGUubGVuZ3RoLCBzcGFyc2VWYWx1ZXMuc2hhcGUubGVuZ3RoLCBzdHJpZGVzLCBbb3V0cHV0U2l6ZSwgMV0sIHN1bUR1cGVJbmRpY2VzKTtcbiAgICBjb25zdCByZXMgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbc3BhcnNlVmFsdWVzLCBzcGFyc2VJbmRpY2VzLCBkZWZhdWx0VmFsdWVdLCBzcGFyc2VWYWx1ZXMuZHR5cGUpO1xuICAgIGNvbnN0IHJlc2hhcGVkID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiByZXMgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IG91dHB1dFNoYXBlIH0gfSk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXMpO1xuICAgIHJldHVybiByZXNoYXBlZDtcbn1cbmV4cG9ydCBjb25zdCBzcGFyc2VUb0RlbnNlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNwYXJzZVRvRGVuc2UsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogc3BhcnNlVG9EZW5zZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNwYXJzZVRvRGVuc2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBTcGxpdFYsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgc2xpY2UgfSBmcm9tICcuL1NsaWNlJztcbmV4cG9ydCBmdW5jdGlvbiBzcGxpdFYoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IG51bU9yU2l6ZVNwbGl0cywgYXhpcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgJGF4aXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpWzBdO1xuICAgIGNvbnN0IHNwbGl0U2l6ZXMgPSBiYWNrZW5kX3V0aWwucHJlcGFyZVNwbGl0U2l6ZSh4LCBudW1PclNpemVTcGxpdHMsICRheGlzKTtcbiAgICBjb25zdCB4UmFuayA9IHguc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IGJlZ2luID0gbmV3IEFycmF5KHhSYW5rKS5maWxsKDApO1xuICAgIGNvbnN0IHNpemUgPSB4LnNoYXBlLnNsaWNlKCk7XG4gICAgcmV0dXJuIHNwbGl0U2l6ZXMubWFwKHMgPT4ge1xuICAgICAgICBjb25zdCBzbGljZVNpemUgPSBbLi4uc2l6ZV07XG4gICAgICAgIHNsaWNlU2l6ZVskYXhpc10gPSBzO1xuICAgICAgICBjb25zdCBzbGljZVQgPSBzbGljZSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQsIGF0dHJzOiB7IGJlZ2luLCBzaXplOiBzbGljZVNpemUgfSB9KTtcbiAgICAgICAgYmVnaW5bJGF4aXNdICs9IHM7XG4gICAgICAgIHJldHVybiBzbGljZVQ7XG4gICAgfSk7XG59XG5leHBvcnQgY29uc3Qgc3BsaXRWQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNwbGl0VixcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBzcGxpdFZcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TcGxpdFYuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3FydCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmNvbnN0IFNRUlQgPSBgcmV0dXJuIHNxcnQoeCk7YDtcbmV4cG9ydCBjb25zdCBzcXJ0ID0gdW5hcnlLZXJuZWxGdW5jKHsgb3BTbmlwcGV0OiBTUVJUIH0pO1xuZXhwb3J0IGNvbnN0IHNxcnRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU3FydCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBzcXJ0XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3FydC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTcXVhcmUgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5jb25zdCBTUVVBUkUgPSBgcmV0dXJuIHggKiB4O2A7XG5leHBvcnQgY29uc3Qgc3F1YXJlID0gdW5hcnlLZXJuZWxGdW5jKHsgb3BTbmlwcGV0OiBTUVVBUkUgfSk7XG5leHBvcnQgY29uc3Qgc3F1YXJlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNxdWFyZSxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBzcXVhcmUsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3F1YXJlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFNxdWFyZWREaWZmZXJlbmNlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmNvbnN0IFNRVUFSRURfRElGRkVSRU5DRSA9ICdyZXR1cm4gKGEgLSBiKSAqIChhIC0gYik7JztcbmV4cG9ydCBjb25zdCBzcXVhcmVkRGlmZmVyZW5jZSA9IGJpbmFyeUtlcm5lbEZ1bmMoeyBvcFNuaXBwZXQ6IFNRVUFSRURfRElGRkVSRU5DRSwgcGFja2VkT3BTbmlwcGV0OiBTUVVBUkVEX0RJRkZFUkVOQ0UgfSk7XG5leHBvcnQgY29uc3Qgc3F1YXJlZERpZmZlcmVuY2VDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU3F1YXJlZERpZmZlcmVuY2UsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogc3F1YXJlZERpZmZlcmVuY2UsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3F1YXJlZERpZmZlcmVuY2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3RlcCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBDSEVDS19OQU5fU05JUFBFVCwgVW5hcnlPcFByb2dyYW0gfSBmcm9tICcuLi91bmFyeW9wX2dwdSc7XG5leHBvcnQgZnVuY3Rpb24gc3RlcCh7IGlucHV0cywgYXR0cnMsIGJhY2tlbmQgfSkge1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IG9wU25pcHBldCA9IENIRUNLX05BTl9TTklQUEVUICsgYFxuICAgIHJldHVybiB4ID4gMC4wID8gMS4wIDogZmxvYXQoJHthdHRycy5hbHBoYX0pO1xuICBgO1xuICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgVW5hcnlPcFByb2dyYW0oeC5zaGFwZSwgb3BTbmlwcGV0KTtcbiAgICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3hdLCB4LmR0eXBlKTtcbn1cbmV4cG9ydCBjb25zdCBzdGVwQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFN0ZXAsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogc3RlcCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdGVwLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJ1ZmZlciwgc2xpY2VfdXRpbCwgU3RyaWRlZFNsaWNlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHN0cmlkZWRTbGljZUltcGxDUFUgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmltcG9ydCB7IFN0cmlkZWRTbGljZVByb2dyYW0gfSBmcm9tICcuLi9zdHJpZGVkX3NsaWNlX2dwdSc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7IHNsaWNlIH0gZnJvbSAnLi9TbGljZSc7XG5leHBvcnQgZnVuY3Rpb24gc3RyaWRlZFNsaWNlKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBiZWdpbiwgZW5kLCBzdHJpZGVzLCBiZWdpbk1hc2ssIGVuZE1hc2ssIGVsbGlwc2lzTWFzaywgbmV3QXhpc01hc2ssIHNocmlua0F4aXNNYXNrIH0gPSBhdHRycztcbiAgICBjb25zdCB7IG5vblN0cmlkZWQsICRiZWdpbiwgJHN0cmlkZXMsIHNpemUsIG5ld1NoYXBlLCBvdXRTaGFwZSB9ID0gc2xpY2VfdXRpbC5zbGljZUluZm8oeC5zaGFwZSwgYmVnaW4sIGVuZCwgc3RyaWRlcywgYmVnaW5NYXNrLCBlbmRNYXNrLCBlbGxpcHNpc01hc2ssIG5ld0F4aXNNYXNrLCBzaHJpbmtBeGlzTWFzayk7XG4gICAgY29uc3QgJHggPSByZXNoYXBlKHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IG5ld1NoYXBlIH0gfSk7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBpZiAobm9uU3RyaWRlZCkge1xuICAgICAgICBjb25zdCBzbGljZWQgPSBzbGljZSh7IGlucHV0czogeyB4OiAkeCB9LCBiYWNrZW5kLCBhdHRyczogeyBiZWdpbjogJGJlZ2luLCBzaXplIH0gfSk7XG4gICAgICAgIHJlc3VsdCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogc2xpY2VkIH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBvdXRTaGFwZSB9IH0pO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHNsaWNlZCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKG91dFNoYXBlLnNvbWUoYXhpcyA9PiBheGlzID09PSAwKSkge1xuICAgICAgICByZXN1bHQgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dFNoYXBlLCB4LmR0eXBlLCBbXSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBzaG91bGRFeGVjdXRlT25DUFUgPSBiYWNrZW5kLnNob3VsZEV4ZWN1dGVPbkNQVShbJHhdKTtcbiAgICAgICAgaWYgKHNob3VsZEV4ZWN1dGVPbkNQVSkge1xuICAgICAgICAgICAgY29uc3QgeFRleERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KCR4LmRhdGFJZCk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSB4VGV4RGF0YS52YWx1ZXM7XG4gICAgICAgICAgICBjb25zdCB4QnVmID0gYnVmZmVyKCR4LnNoYXBlLCAkeC5kdHlwZSwgdmFsdWVzKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdFZhbHVlcyA9IHN0cmlkZWRTbGljZUltcGxDUFUob3V0U2hhcGUsIHhCdWYsICRzdHJpZGVzLCAkYmVnaW4pO1xuICAgICAgICAgICAgcmVzdWx0ID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRTaGFwZSwgJHguZHR5cGUsIHJlc3VsdFZhbHVlcy52YWx1ZXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBTdHJpZGVkU2xpY2VQcm9ncmFtKCRiZWdpbiwgJHN0cmlkZXMsIG91dFNoYXBlKTtcbiAgICAgICAgICAgIHJlc3VsdCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFskeF0sICR4LmR0eXBlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXN1bHRSZXNoYXBlZCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogcmVzdWx0IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBvdXRTaGFwZSB9IH0pO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oJHgpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0UmVzaGFwZWQ7XG59XG5leHBvcnQgY29uc3Qgc3RyaWRlZFNsaWNlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFN0cmlkZWRTbGljZSxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBzdHJpZGVkU2xpY2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdHJpZGVkU2xpY2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3RyaW5nTkdyYW1zIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHN0cmluZ05HcmFtc0ltcGxDUFUgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdOR3JhbXMoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHNlcGFyYXRvciwgbkdyYW1XaWR0aHMsIGxlZnRQYWQsIHJpZ2h0UGFkLCBwYWRXaWR0aCwgcHJlc2VydmVTaG9ydFNlcXVlbmNlcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgeyBkYXRhLCBkYXRhU3BsaXRzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgJGRhdGEgPSBiYWNrZW5kLnJlYWRTeW5jKGRhdGEuZGF0YUlkKTtcbiAgICBjb25zdCAkZGF0YVNwbGl0cyA9IGJhY2tlbmQucmVhZFN5bmMoZGF0YVNwbGl0cy5kYXRhSWQpO1xuICAgIGNvbnN0IFtuR3JhbXMsIG5HcmFtc1NwbGl0c10gPSBzdHJpbmdOR3JhbXNJbXBsQ1BVKCRkYXRhLCAkZGF0YVNwbGl0cywgc2VwYXJhdG9yLCBuR3JhbVdpZHRocywgbGVmdFBhZCwgcmlnaHRQYWQsIHBhZFdpZHRoLCBwcmVzZXJ2ZVNob3J0U2VxdWVuY2VzKTtcbiAgICByZXR1cm4gW1xuICAgICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtuR3JhbXMubGVuZ3RoXSwgJ3N0cmluZycsIG5HcmFtcyksXG4gICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oZGF0YVNwbGl0cy5zaGFwZSwgJ2ludDMyJywgbkdyYW1zU3BsaXRzKSxcbiAgICBdO1xufVxuZXhwb3J0IGNvbnN0IHN0cmluZ05HcmFtc0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTdHJpbmdOR3JhbXMsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogc3RyaW5nTkdyYW1zLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN0cmluZ05HcmFtcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTdHJpbmdTcGxpdCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBzdHJpbmdTcGxpdEltcGxDUFUgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdTcGxpdChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgc2tpcEVtcHR5IH0gPSBhdHRycztcbiAgICBjb25zdCB7IGlucHV0LCBkZWxpbWl0ZXIgfSA9IGlucHV0cztcbiAgICBpZiAoaW5wdXQuZHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW5wdXQgbXVzdCBiZSBvZiBkYXRhdHlwZSBzdHJpbmcnKTtcbiAgICB9XG4gICAgaWYgKGlucHV0LnNoYXBlLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYElucHV0IG11c3QgYmUgYSB2ZWN0b3IsIGdvdCBzaGFwZTogJHtpbnB1dC5zaGFwZX1gKTtcbiAgICB9XG4gICAgaWYgKGRlbGltaXRlci5zaGFwZS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEZWxpbWl0ZXIgbXVzdCBiZSBhIHNjYWxhciwgZ290IHNoYXBlOiAke2RlbGltaXRlci5zaGFwZX1gKTtcbiAgICB9XG4gICAgY29uc3QgJGlucHV0ID0gYmFja2VuZC5yZWFkU3luYyhpbnB1dC5kYXRhSWQpO1xuICAgIGNvbnN0ICRkZWxpbWl0ZXIgPSBiYWNrZW5kLnJlYWRTeW5jKGRlbGltaXRlci5kYXRhSWQpWzBdO1xuICAgIGNvbnN0IFtpbmRpY2VzLCB2YWx1ZXMsIHNoYXBlXSA9IHN0cmluZ1NwbGl0SW1wbENQVSgkaW5wdXQsICRkZWxpbWl0ZXIsIHNraXBFbXB0eSk7XG4gICAgY29uc3Qgb3V0cHV0U2l6ZSA9IHZhbHVlcy5sZW5ndGg7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbb3V0cHV0U2l6ZSwgMl0sICdpbnQzMicsIGluZGljZXMpLFxuICAgICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtvdXRwdXRTaXplXSwgJ3N0cmluZycsIHZhbHVlcyksXG4gICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oWzJdLCAnaW50MzInLCBuZXcgSW50MzJBcnJheShzaGFwZSkpXG4gICAgXTtcbn1cbmV4cG9ydCBjb25zdCBzdHJpbmdTcGxpdENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTdHJpbmdTcGxpdCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBzdHJpbmdTcGxpdCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdHJpbmdTcGxpdC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTdHJpbmdUb0hhc2hCdWNrZXRGYXN0IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RJbXBsQ1BVIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nVG9IYXNoQnVja2V0RmFzdChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgbnVtQnVja2V0cyB9ID0gYXR0cnM7XG4gICAgY29uc3QgeyBpbnB1dCB9ID0gaW5wdXRzO1xuICAgIGlmIChpbnB1dC5kdHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnB1dCBtdXN0IGJlIG9mIGRhdGF0eXBlIHN0cmluZycpO1xuICAgIH1cbiAgICBpZiAobnVtQnVja2V0cyA8PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTnVtYmVyIG9mIGJ1Y2tldHMgbXVzdCBiZSBhdCBsZWFzdCAxYCk7XG4gICAgfVxuICAgIGNvbnN0ICRpbnB1dCA9IGJhY2tlbmQucmVhZFN5bmMoaW5wdXQuZGF0YUlkKTtcbiAgICBjb25zdCBvdXRwdXQgPSBzdHJpbmdUb0hhc2hCdWNrZXRGYXN0SW1wbENQVSgkaW5wdXQsIG51bUJ1Y2tldHMpO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGlucHV0LnNoYXBlLCAnaW50MzInLCBvdXRwdXQpO1xufVxuZXhwb3J0IGNvbnN0IHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU3RyaW5nVG9IYXNoQnVja2V0RmFzdCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBzdHJpbmdUb0hhc2hCdWNrZXRGYXN0LFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN0cmluZ1RvSGFzaEJ1Y2tldEZhc3QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3ViIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7IHN1YkltcGxDUFUgYXMgY3B1U3ViIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5jb25zdCBTVUIgPSAncmV0dXJuIGEgLSBiOyc7XG5leHBvcnQgY29uc3Qgc3ViID0gYmluYXJ5S2VybmVsRnVuYyh7XG4gICAgb3BTbmlwcGV0OiBTVUIsXG4gICAgcGFja2VkT3BTbmlwcGV0OiBTVUIsXG4gICAgc3VwcG9ydHNDb21wbGV4OiB0cnVlLFxuICAgIGNwdUtlcm5lbEltcGw6IGNwdVN1YlxufSk7XG5leHBvcnQgY29uc3Qgc3ViQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFN1YixcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBzdWJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdWIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3VtIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHN1bUltcGwgfSBmcm9tICcuL1N1bV9pbXBsJztcbmV4cG9ydCBmdW5jdGlvbiBzdW0oYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGF4aXMsIGtlZXBEaW1zIH0gPSBhdHRycztcbiAgICByZXR1cm4gc3VtSW1wbCh4LCBheGlzLCBrZWVwRGltcywgYmFja2VuZCk7XG59XG5leHBvcnQgY29uc3Qgc3VtQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFN1bSxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBzdW1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdW0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBzdW1PdXRUeXBlLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHJlZHVjZSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9yZWR1Y2UnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQgeyB0cmFuc3Bvc2VJbXBsIH0gZnJvbSAnLi9UcmFuc3Bvc2VfaW1wbCc7XG5leHBvcnQgZnVuY3Rpb24gc3VtSW1wbCh4LCBheGlzLCBrZWVwRGltcywgYmFja2VuZCkge1xuICAgIGNvbnN0IHJlZHVjdGlvbkluZGljZXMgPSBheGlzO1xuICAgIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3Qgb3JpZ0F4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKHJlZHVjdGlvbkluZGljZXMsIHguc2hhcGUpO1xuICAgIGxldCBheGVzID0gb3JpZ0F4ZXM7XG4gICAgY29uc3QgcGVybXV0ZWRBeGVzID0gYmFja2VuZF91dGlsLmdldEF4ZXNQZXJtdXRhdGlvbihheGVzLCB4UmFuayk7XG4gICAgY29uc3Qgc3VtSW5wdXRJc1RyYW5zcG9zZWQgPSBwZXJtdXRlZEF4ZXMgIT0gbnVsbDtcbiAgICBsZXQgc3VtSW5wdXQgPSB4O1xuICAgIGlmIChzdW1JbnB1dElzVHJhbnNwb3NlZCkge1xuICAgICAgICBzdW1JbnB1dCA9IHRyYW5zcG9zZUltcGwoeCwgcGVybXV0ZWRBeGVzLCBiYWNrZW5kKTtcbiAgICAgICAgYXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRJbm5lck1vc3RBeGVzKGF4ZXMubGVuZ3RoLCB4UmFuayk7XG4gICAgfVxuICAgIGJhY2tlbmRfdXRpbC5hc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcygnc3VtJywgYXhlcywgeFJhbmspO1xuICAgIGNvbnN0IFtzdW1PdXRTaGFwZSwgcmVkdWNlU2hhcGVdID0gYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMoc3VtSW5wdXQuc2hhcGUsIGF4ZXMpO1xuICAgIGxldCBvdXRTaGFwZSA9IHN1bU91dFNoYXBlO1xuICAgIGlmIChrZWVwRGltcykge1xuICAgICAgICAvLyByYXRoZXIgdGhhbiByZXNoYXBlIGF0IHRoZSBlbmQsIHNldCB0aGUgdGFyZ2V0IHNoYXBlIGhlcmUuXG4gICAgICAgIG91dFNoYXBlID0gYmFja2VuZF91dGlsLmV4cGFuZFNoYXBlVG9LZWVwRGltKHN1bU91dFNoYXBlLCBvcmlnQXhlcyk7XG4gICAgfVxuICAgIGNvbnN0IGluU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShyZWR1Y2VTaGFwZSk7XG4gICAgY29uc3QgeFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoeC5zaGFwZSk7XG4gICAgY29uc3QgYmF0Y2hTaXplID0geFNpemUgLyBpblNpemU7XG4gICAgY29uc3QgcmVzaGFwZWRJbnB1dCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogc3VtSW5wdXQgfSwgYXR0cnM6IHsgc2hhcGU6IFtiYXRjaFNpemUsIGluU2l6ZV0gfSwgYmFja2VuZCB9KTtcbiAgICBjb25zdCBvdXRUeXBlID0gc3VtT3V0VHlwZSh4LmR0eXBlKTtcbiAgICBjb25zdCByZWR1Y2VkID0gcmVkdWNlKHJlc2hhcGVkSW5wdXQsIG91dFR5cGUsICdzdW0nLCBiYWNrZW5kKTtcbiAgICBjb25zdCBvdXQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHJlZHVjZWQgfSwgYXR0cnM6IHsgc2hhcGU6IG91dFNoYXBlIH0sIGJhY2tlbmQgfSk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXNoYXBlZElucHV0KTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlZHVjZWQpO1xuICAgIGlmIChzdW1JbnB1dElzVHJhbnNwb3NlZCkge1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHN1bUlucHV0KTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN1bV9pbXBsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFRhbiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmNvbnN0IFRBTiA9IGByZXR1cm4gdGFuKHgpO2A7XG5leHBvcnQgY29uc3QgdGFuID0gdW5hcnlLZXJuZWxGdW5jKHsgb3BTbmlwcGV0OiBUQU4gfSk7XG5leHBvcnQgY29uc3QgdGFuQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFRhbixcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiB0YW4sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VGFuLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFRhbmggfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5jb25zdCBUQU5IID0gYFxuICBmbG9hdCBlMnggPSBleHAoLTIuMCAqIGFicyh4KSk7XG4gIHJldHVybiBzaWduKHgpICogKDEuMCAtIGUyeCkgLyAoMS4wICsgZTJ4KTtcbmA7XG5leHBvcnQgY29uc3QgdGFuaCA9IHVuYXJ5S2VybmVsRnVuYyh7IG9wU25pcHBldDogVEFOSCB9KTtcbmV4cG9ydCBjb25zdCB0YW5oQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFRhbmgsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogdGFuaCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1UYW5oLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJ1ZmZlciwgVGlsZSwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB0aWxlSW1wbENQVSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuaW1wb3J0IHsgVGlsZVByb2dyYW0gfSBmcm9tICcuLi90aWxlX2dwdSc7XG5leHBvcnQgZnVuY3Rpb24gdGlsZShwYXJhbXMpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IHBhcmFtcztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHJlcHMgfSA9IGF0dHJzO1xuICAgIC8vIHRpbGUgZ3B1IHByb2dyYW0gY2Fubm90IGhhbmRsZSByYW5rID4gNSBjYXNlLlxuICAgIGlmICh4LmR0eXBlID09PSAnc3RyaW5nJyB8fCB4LnNoYXBlLmxlbmd0aCA+IDUpIHtcbiAgICAgICAgLy8gRXZlbiB0aG91Z2h0IHN0cmluZyB0ZW5zb3IgaXMgYWx3YXlzIG9uIENQVSwganVzdCB0byBiZSBjb25zaXN0ZW50IG9uIGhvd1xuICAgICAgICAvLyB0byBhY2Nlc3MgdGVuc29yIGRhdGEuXG4gICAgICAgIGNvbnN0IGRhdGEgPSBiYWNrZW5kLnJlYWRTeW5jKHguZGF0YUlkKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB4LmR0eXBlID09PSAnc3RyaW5nJyA/XG4gICAgICAgICAgICBkYXRhLm1hcChkID0+IHV0aWwuZGVjb2RlU3RyaW5nKGQpKSA6XG4gICAgICAgICAgICBkYXRhO1xuICAgICAgICBjb25zdCBidWYgPSBidWZmZXIoeC5zaGFwZSwgeC5kdHlwZSwgdmFsdWUpO1xuICAgICAgICBjb25zdCBvdXRCdWYgPSB0aWxlSW1wbENQVShidWYsIHJlcHMpO1xuICAgICAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRCdWYuc2hhcGUsIG91dEJ1Zi5kdHlwZSwgb3V0QnVmLnZhbHVlcyk7XG4gICAgfVxuICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgVGlsZVByb2dyYW0oeC5zaGFwZSwgcmVwcyk7XG4gICAgY29uc3Qgb3V0cHV0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3hdLCB4LmR0eXBlKTtcbiAgICByZXR1cm4gb3V0cHV0O1xufVxuZXhwb3J0IGNvbnN0IHRpbGVDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogVGlsZSxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiB0aWxlLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRpbGUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZW52LCBUb3BLLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHRvcEtJbXBsQ1BVIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5pbXBvcnQgeyBNZXJnZVByb2dyYW0sIFN3YXBQcm9ncmFtIH0gZnJvbSAnLi4vdG9wX2tfZ3B1JztcbmltcG9ydCB7IGZpbGwgfSBmcm9tICcuL0ZpbGwnO1xuaW1wb3J0IHsgZ2F0aGVyVjIgfSBmcm9tICcuL0dhdGhlclYyJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHsgc2xpY2UgfSBmcm9tICcuL1NsaWNlJztcbmZ1bmN0aW9uIGRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvT3JOdWxsKGJhY2tlbmQsIHRlbnNvckluZm8pIHtcbiAgICBpZiAodGVuc29ySW5mbyAhPT0gbnVsbCkge1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHRlbnNvckluZm8pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJvdW5kVXBUb1BvdzIobnVtKSB7XG4gICAgbGV0IHBvdzIgPSAxO1xuICAgIHdoaWxlIChwb3cyIDwgbnVtKSB7XG4gICAgICAgIHBvdzIgKj0gMjtcbiAgICB9XG4gICAgcmV0dXJuIHBvdzI7XG59XG4vLyBCYXNlZCBvbiBBbGdvcml0aG0gMiBvZiBCaXRvbmljIFRvcCBLLCByZWY6XG4vLyBodHRwczovL2FuaWxzaGFuYmhhZy5pbi9zdGF0aWMvcGFwZXJzL2dwdXRvcGtfc2lnbW9kMTgucGRmXG5leHBvcnQgZnVuY3Rpb24gdG9wSyhhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgaywgc29ydGVkIH0gPSBhdHRycztcbiAgICAvLyBFbXBpcmljYWxseSBkZXRlcm1pbmVkIGNvbnN0YW50IHVzZWQgdG8gZGV0ZXJtaW5lIGxhc3QgZGltIHRocmVzaG9sZCBmb3JcbiAgICAvLyBoYW5kaW5nIG9mZiBleGVjdXRpb24gdG8gdGhlIENQVS5cbiAgICBjb25zdCBUT1BLX0xBU1RfRElNX0NQVV9IQU5ET0ZGX1NJWkVfVEhSRVNIT0xEID0gZW52KCkuZ2V0TnVtYmVyKCdUT1BLX0xBU1RfRElNX0NQVV9IQU5ET0ZGX1NJWkVfVEhSRVNIT0xEJyk7XG4gICAgLy8gRW1waXJpY2FsbHkgZGV0ZXJtaW5lZCBjb25zdGFudCB1c2VkIHRvIGRldGVybWluZSBrIHRocmVzaG9sZCBmb3IgaGFuZGluZ1xuICAgIC8vIG9mZiBleGVjdXRpb24gdG8gdGhlIENQVS5cbiAgICBjb25zdCBUT1BLX0tfQ1BVX0hBTkRPRkZfVEhSRVNIT0xEID0gZW52KCkuZ2V0TnVtYmVyKCdUT1BLX0tfQ1BVX0hBTkRPRkZfVEhSRVNIT0xEJyk7XG4gICAgY29uc3QgeFNoYXBlID0geC5zaGFwZTtcbiAgICBjb25zdCBsYXN0RGltID0geFNoYXBlW3hTaGFwZS5sZW5ndGggLSAxXTtcbiAgICBpZiAoYmFja2VuZC5zaG91bGRFeGVjdXRlT25DUFUoW3hdKSB8fFxuICAgICAgICBsYXN0RGltIDwgVE9QS19MQVNUX0RJTV9DUFVfSEFORE9GRl9TSVpFX1RIUkVTSE9MRCB8fFxuICAgICAgICBrID4gVE9QS19LX0NQVV9IQU5ET0ZGX1RIUkVTSE9MRCkge1xuICAgICAgICBjb25zdCB4VmFscyA9IGJhY2tlbmQucmVhZFN5bmMoeC5kYXRhSWQpO1xuICAgICAgICBjb25zdCBbYWxsVG9wS1ZhbHMsIGFsbFRvcEtJbmRpY2VzXSA9IHRvcEtJbXBsQ1BVKHhWYWxzLCB4U2hhcGUsIHguZHR5cGUsIGssIHNvcnRlZCk7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGFsbFRvcEtWYWxzLnNoYXBlLCBhbGxUb3BLVmFscy5kdHlwZSwgYWxsVG9wS1ZhbHMudmFsdWVzKSxcbiAgICAgICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oYWxsVG9wS0luZGljZXMuc2hhcGUsIGFsbFRvcEtJbmRpY2VzLmR0eXBlLCBhbGxUb3BLSW5kaWNlcy52YWx1ZXMpXG4gICAgICAgIF07XG4gICAgfVxuICAgIGlmIChrID09PSAwKSB7XG4gICAgICAgIHhTaGFwZVt4U2hhcGUubGVuZ3RoIC0gMV0gPSAwO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyh4U2hhcGUsIHguZHR5cGUsIFtdKSxcbiAgICAgICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oeFNoYXBlLCAnaW50MzInLCBbXSlcbiAgICAgICAgXTtcbiAgICB9XG4gICAgaWYgKGxhc3REaW0gPT09IDEgLyogZmlyc3RQYXNzICovKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB4LCBmaWxsKHsgYXR0cnM6IHsgc2hhcGU6IHhTaGFwZSwgZHR5cGU6ICdpbnQzMicsIHZhbHVlOiAwIH0sIGJhY2tlbmQgfSlcbiAgICAgICAgXTtcbiAgICB9XG4gICAgLy8gRWFnZXJseSB1bnBhY2sgeCBpbnB1dCBzaW5jZSBpdCBpcyBwYXNzZWQgaW4gdG8gYWxsIHRoZSBzaGFkZXJzIHdoaWNoXG4gICAgLy8gcmVxdWlyZSB1bnBhY2tlZCBpbnB1dHMuXG4gICAgY29uc3QgeHRleERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KHguZGF0YUlkKTtcbiAgICBjb25zdCB4SXNQYWNrZWQgPSB4dGV4RGF0YSAhPT0gbnVsbCAmJiB4dGV4RGF0YS5pc1BhY2tlZDtcbiAgICBjb25zdCB4VW5QYWNrZWQgPSB4SXNQYWNrZWQgPyBiYWNrZW5kLnVucGFja1RlbnNvcih4KSA6IHg7XG4gICAgLy8gUmVzaGFwZSBpbnRvIGEgMmQgdGVuc29yIFtiYXRjaCwgbGFzdERpbV0gYW5kIGNvbXB1dGUgdG9wayBhbG9uZyBsYXN0RGltLlxuICAgIGNvbnN0IHhTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHhTaGFwZSk7XG4gICAgY29uc3QgYmF0Y2ggPSB4U2l6ZSAvIGxhc3REaW07XG4gICAgY29uc3QgeDJEID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiB4VW5QYWNrZWQgfSwgYXR0cnM6IHsgc2hhcGU6IFtiYXRjaCwgbGFzdERpbV0gfSwgYmFja2VuZCB9KTtcbiAgICBpZiAoeElzUGFja2VkKSB7XG4gICAgICAgIGRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvT3JOdWxsKGJhY2tlbmQsIHhVblBhY2tlZCk7XG4gICAgfVxuICAgIGNvbnN0IGtQb3cyID0gcm91bmRVcFRvUG93MihrKTtcbiAgICBjb25zdCBsYXN0RGltUG93MiA9IHJvdW5kVXBUb1BvdzIobGFzdERpbSk7XG4gICAgLy8gT25seSB0aGUgaW5kaWNlcyBjb250YWluaW5nIHRoZSB0b3AgSyBhcmUga2VwdCBhdCBldmVyeSBzdGVwIHRvIHJlZHVjZVxuICAgIC8vIG51bWJlciBvZiBvdXRwdXRzIGluIHRoZSBHUFUgYWxnb3JpdGhtcywgc28gb25jZSB0aGUgZmluYWwgc2V0IG9mIGluZGljZXNcbiAgICAvLyBpcyBjb21wdXRlZCB0aGVuIGdhdGhlciBpcyB1c2VkIHRvIGdyYWIgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzXG4gICAgLy8gZnJvbSB0aGUgb3JpZ2luYWwgaW5wdXQuXG4gICAgbGV0IGluZGljZXMgPSBudWxsO1xuICAgIC8vIEdQVSBhbGdvcml0aG0gYWx3YXlzIHRha2VzIGluIGFuIGluZGljZXMgaW5wdXQgYnV0IHRoaXMgaW5wdXQgaXMgbm90IHVzZWRcbiAgICAvLyBvbiB0aGUgZmlyc3QgcnVuIG9mIGEgR1BVIGFsZ29yaXRobSwgdGhlcmVmb3JlIGlmIGluZGljZXMgaXMgbnVsbCB3ZSBzaW1wbHlcbiAgICAvLyBwYXNzIGluIHgyRCBpbnN0ZWFkIG9mIGl0IGJ1dCB0aGUgdmFsdWUgd2lsbCBub3QgYWN0dWFsbHkgYmUgdXNlZFxuICAgIGNvbnN0IGdldElucHV0cyA9ICgpID0+IGluZGljZXMgPT09IG51bGwgPyBbeDJELCB4MkRdIDogW3gyRCwgaW5kaWNlc107XG4gICAgY29uc3QgcnVuU3dhcCA9IChkaXIsIGluYywgc2hhcGUpID0+IHtcbiAgICAgICAgY29uc3QgaW5wdXRzID0gZ2V0SW5wdXRzKCk7XG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgU3dhcFByb2dyYW0oc2hhcGUpO1xuICAgICAgICBjb25zdCBmaXN0UGFzcyA9IGluZGljZXMgPT09IG51bGwgPyAxIDogMDtcbiAgICAgICAgY29uc3QgY3VzdG9tVmFsdWVzID0gW1tsYXN0RGltXSwgW2Zpc3RQYXNzXSwgW051bWJlci5ORUdBVElWRV9JTkZJTklUWV0sIFtkaXJdLCBbaW5jXV07XG4gICAgICAgIGNvbnN0IHByZXZJbmRpY2VzID0gaW5kaWNlcztcbiAgICAgICAgaW5kaWNlcyA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIGlucHV0cywgJ2ludDMyJywgY3VzdG9tVmFsdWVzKTtcbiAgICAgICAgZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm9Pck51bGwoYmFja2VuZCwgcHJldkluZGljZXMpO1xuICAgIH07XG4gICAgLy8gU3RlcCAxOiBsb2NhbCBzb3J0XG4gICAgZm9yIChsZXQgbGVuID0gMTsgbGVuIDwga1BvdzI7IGxlbiAqPSAyKSB7XG4gICAgICAgIGNvbnN0IGRpciA9IGxlbiAqIDI7XG4gICAgICAgIGZvciAobGV0IGluYyA9IGxlbjsgaW5jID49IDE7IGluYyAvPSAyKSB7XG4gICAgICAgICAgICBydW5Td2FwKGRpciwgaW5jLCBbYmF0Y2gsIGxhc3REaW1Qb3cyXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gU3RlcCAyOiBtZXJnZVxuICAgIGZvciAobGV0IGluZGljZXNTaXplID0gbGFzdERpbVBvdzI7IGluZGljZXNTaXplID4ga1BvdzI7IGluZGljZXNTaXplIC89IDIpIHtcbiAgICAgICAgY29uc3QgaW5wdXRzID0gZ2V0SW5wdXRzKCk7XG4gICAgICAgIGNvbnN0IG1lcmdlUHJvZ3JhbSA9IG5ldyBNZXJnZVByb2dyYW0oW2JhdGNoLCBpbmRpY2VzU2l6ZSAvIDJdKTtcbiAgICAgICAgY29uc3QgZmlyc3RQYXNzID0gaW5kaWNlcyA9PT0gbnVsbCA/IDEgOiAwO1xuICAgICAgICBjb25zdCBjdXN0b21WYWx1ZXMgPSBbW2xhc3REaW1dLCBbZmlyc3RQYXNzXSwgW2tQb3cyXV07XG4gICAgICAgIGNvbnN0IHByZXZJbmRpY2VzID0gaW5kaWNlcztcbiAgICAgICAgaW5kaWNlcyA9XG4gICAgICAgICAgICBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShtZXJnZVByb2dyYW0sIGlucHV0cywgJ2ludDMyJywgY3VzdG9tVmFsdWVzKTtcbiAgICAgICAgZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm9Pck51bGwoYmFja2VuZCwgcHJldkluZGljZXMpO1xuICAgICAgICAvLyBTdGVwIDM6IHJlYnVpbGRcbiAgICAgICAgY29uc3QgbGVuID0ga1BvdzIgLyAyO1xuICAgICAgICBjb25zdCBkaXIgPSBsZW4gKiAyO1xuICAgICAgICBmb3IgKGxldCBpbmMgPSBsZW47IGluYyA+PSAxOyBpbmMgLz0gMikge1xuICAgICAgICAgICAgcnVuU3dhcChkaXIsIGluYywgaW5kaWNlcy5zaGFwZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gS2VlcCBvbmx5IHRoZSByZXF1ZXN0ZWQgdG9wIEsgcmVzdWx0cyBpbnN0ZWFkIG9mIGtQb3cyXG4gICAgbGV0IHByZXZJbmRpY2VzID0gaW5kaWNlcztcbiAgICBpbmRpY2VzID0gc2xpY2UoeyBpbnB1dHM6IHsgeDogaW5kaWNlcyB9LCBiYWNrZW5kLCBhdHRyczogeyBiZWdpbjogMCwgc2l6ZTogW2JhdGNoLCBrXSB9IH0pO1xuICAgIGRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvT3JOdWxsKGJhY2tlbmQsIHByZXZJbmRpY2VzKTtcbiAgICAvLyBHYXRoZXIgdmFsdWVzIG9uIGxhc3QgZGltZW5zaW9uXG4gICAgbGV0IHZhbHVlcyA9IGdhdGhlclYyKHsgaW5wdXRzOiB7IHg6IHgyRCwgaW5kaWNlcyB9LCBiYWNrZW5kLCBhdHRyczogeyBheGlzOiAxLCBiYXRjaERpbXM6IDEgfSB9KTtcbiAgICBkaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mb09yTnVsbChiYWNrZW5kLCB4MkQpO1xuICAgIC8vIFJlc2hhcGUgYmFjayB0byB0aGUgb3JpZ2luYWwgaW5wdXQgc2hhcGUsIGV4Y2VwdCB0aGF0IHRoZSBsYXN0XG4gICAgLy8gZGltZW5zaW9uIGlzIGsuXG4gICAgY29uc3QgbmV3U2hhcGUgPSB4U2hhcGUuc2xpY2UoMCwgLTEpO1xuICAgIG5ld1NoYXBlLnB1c2goayk7XG4gICAgcHJldkluZGljZXMgPSBpbmRpY2VzO1xuICAgIGluZGljZXMgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IGluZGljZXMgfSwgYXR0cnM6IHsgc2hhcGU6IG5ld1NoYXBlIH0sIGJhY2tlbmQgfSk7XG4gICAgZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm9Pck51bGwoYmFja2VuZCwgcHJldkluZGljZXMpO1xuICAgIGNvbnN0IHByZXZWYWx1ZXMgPSB2YWx1ZXM7XG4gICAgdmFsdWVzID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiB2YWx1ZXMgfSwgYXR0cnM6IHsgc2hhcGU6IG5ld1NoYXBlIH0sIGJhY2tlbmQgfSk7XG4gICAgZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm9Pck51bGwoYmFja2VuZCwgcHJldlZhbHVlcyk7XG4gICAgcmV0dXJuIFt2YWx1ZXMsIGluZGljZXNdO1xufVxuZXhwb3J0IGNvbnN0IHRvcEtDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogVG9wSyxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiB0b3BLXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VG9wSy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBUcmFuc2Zvcm0gfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgVHJhbnNmb3JtUHJvZ3JhbSB9IGZyb20gJy4uL3RyYW5zZm9ybV9ncHUnO1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW1hZ2UsIHRyYW5zZm9ybXMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGludGVycG9sYXRpb24sIGZpbGxNb2RlLCBmaWxsVmFsdWUsIG91dHB1dFNoYXBlIH0gPSBhdHRycztcbiAgICBjb25zdCBbYmF0Y2gsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBudW1DaGFubmVsc10gPSBpbWFnZS5zaGFwZTtcbiAgICBjb25zdCBbb3V0SGVpZ2h0LCBvdXRXaWR0aF0gPSBvdXRwdXRTaGFwZSAhPSBudWxsID8gb3V0cHV0U2hhcGUgOiBbaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGhdO1xuICAgIGNvbnN0IG91dFNoYXBlID0gW2JhdGNoLCBvdXRIZWlnaHQsIG91dFdpZHRoLFxuICAgICAgICBudW1DaGFubmVsc107XG4gICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBUcmFuc2Zvcm1Qcm9ncmFtKGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBpbnRlcnBvbGF0aW9uLCBmaWxsTW9kZSwgZmlsbFZhbHVlLCBvdXRTaGFwZSk7XG4gICAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtpbWFnZSwgdHJhbnNmb3Jtc10sICdmbG9hdDMyJyk7XG59XG5leHBvcnQgY29uc3QgdHJhbnNmb3JtQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFRyYW5zZm9ybSxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiB0cmFuc2Zvcm1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1UcmFuc2Zvcm0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgVHJhbnNwb3NlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHRyYW5zcG9zZUltcGwgfSBmcm9tICcuL1RyYW5zcG9zZV9pbXBsJztcbmltcG9ydCB7IHRyYW5zcG9zZUltcGxDUFUgYXMgY3B1VHJhbnNwb3NlIH0gZnJvbSAnLi9UcmFuc3Bvc2VfaW1wbCc7XG5leHBvcnQgZnVuY3Rpb24gdHJhbnNwb3NlKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBwZXJtIH0gPSBhdHRycztcbiAgICBjb25zdCB3ZWJnbEJhY2tlbmQgPSBiYWNrZW5kO1xuICAgIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgbmV3U2hhcGUgPSBuZXcgQXJyYXkoeFJhbmspO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3U2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbmV3U2hhcGVbaV0gPSB4LnNoYXBlW3Blcm1baV1dO1xuICAgIH1cbiAgICBsZXQgb3V0O1xuICAgIGlmICh3ZWJnbEJhY2tlbmQuc2hvdWxkRXhlY3V0ZU9uQ1BVKFt4XSkpIHtcbiAgICAgICAgY29uc3QgeFRleERhdGEgPSB3ZWJnbEJhY2tlbmQudGV4RGF0YS5nZXQoeC5kYXRhSWQpO1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSB4VGV4RGF0YS52YWx1ZXM7XG4gICAgICAgIGNvbnN0IG91dFZhbHVlcyA9IGNwdVRyYW5zcG9zZSh2YWx1ZXMsIHguc2hhcGUsIHguZHR5cGUsIHBlcm0sIG5ld1NoYXBlKTtcbiAgICAgICAgb3V0ID0gd2ViZ2xCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG5ld1NoYXBlLCB4LmR0eXBlKTtcbiAgICAgICAgY29uc3Qgb3V0RGF0YSA9IHdlYmdsQmFja2VuZC50ZXhEYXRhLmdldChvdXQuZGF0YUlkKTtcbiAgICAgICAgb3V0RGF0YS52YWx1ZXMgPSBvdXRWYWx1ZXM7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBvdXQgPSB0cmFuc3Bvc2VJbXBsKHgsIHBlcm0sIHdlYmdsQmFja2VuZCk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgdHJhbnNwb3NlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFRyYW5zcG9zZSxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiB0cmFuc3Bvc2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1UcmFuc3Bvc2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHRyYW5zcG9zZUltcGxDUFUgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmltcG9ydCB7IFRyYW5zcG9zZVByb2dyYW0gfSBmcm9tICcuLi90cmFuc3Bvc2VfZ3B1JztcbmltcG9ydCB7IFRyYW5zcG9zZVBhY2tlZFByb2dyYW0gfSBmcm9tICcuLi90cmFuc3Bvc2VfcGFja2VkX2dwdSc7XG5leHBvcnQgZnVuY3Rpb24gdHJhbnNwb3NlSW1wbCh4LCBwZXJtLCBiYWNrZW5kKSB7XG4gICAgY29uc3QgcHJvZ3JhbSA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfQVJSQVlfT1BFUkFUSU9OUycpID9cbiAgICAgICAgbmV3IFRyYW5zcG9zZVBhY2tlZFByb2dyYW0oeC5zaGFwZSwgcGVybSkgOlxuICAgICAgICBuZXcgVHJhbnNwb3NlUHJvZ3JhbSh4LnNoYXBlLCBwZXJtKTtcbiAgICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3hdLCB4LmR0eXBlKTtcbn1cbmV4cG9ydCB7IHRyYW5zcG9zZUltcGxDUFUgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRyYW5zcG9zZV9pbXBsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBVbmlxdWUgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5pcXVlSW1wbENQVSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL3dlYmdsX3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIHVuaXF1ZShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGF0dHJzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgYXhpcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleCh4LCAndW5pcXVlJyk7XG4gICAgLy8gRm9yIG5vdywgYWx3YXlzIGZvcndhcmQgY2FsY3VsYXRpb24gdG8gdGhlIENQVSBiYWNrZW5kLlxuICAgIGNvbnNvbGUud2FybignV0FSTklORzogJywgJ1VJIG1pZ2h0IGJlIGxvY2tlZCB0ZW1wb3JhcmlseSBhcyBkYXRhIGlzIGJlaW5nIGRvd25sb2FkZWQnKTtcbiAgICBjb25zdCB2YWx1ZXMgPSBiYWNrZW5kLnJlYWRTeW5jKHguZGF0YUlkKTtcbiAgICBjb25zdCB7IG91dHB1dFZhbHVlcywgb3V0cHV0U2hhcGUsIGluZGljZXMgfSA9IHVuaXF1ZUltcGxDUFUodmFsdWVzLCBheGlzLCB4LnNoYXBlLCB4LmR0eXBlKTtcbiAgICByZXR1cm4gW1xuICAgICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dHB1dFNoYXBlLCB4LmR0eXBlLCBvdXRwdXRWYWx1ZXMpLFxuICAgICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtpbmRpY2VzLmxlbmd0aF0sICdpbnQzMicsIGluZGljZXMpLFxuICAgIF07XG59XG5leHBvcnQgY29uc3QgdW5pcXVlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFVuaXF1ZSxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiB1bmlxdWUsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VW5pcXVlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFVucGFjayB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7IHNsaWNlIH0gZnJvbSAnLi9TbGljZSc7XG5leHBvcnQgZnVuY3Rpb24gdW5wYWNrKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB2YWx1ZSB9ID0gaW5wdXRzO1xuICAgIGxldCB7IGF4aXMgfSA9IGF0dHJzO1xuICAgIGlmIChheGlzIDwgMCkge1xuICAgICAgICBheGlzICs9IHZhbHVlLnNoYXBlLmxlbmd0aDtcbiAgICB9XG4gICAgY29uc3QgeCA9IHZhbHVlO1xuICAgIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgbnVtID0gdmFsdWUuc2hhcGVbYXhpc107XG4gICAgY29uc3Qgb3V0U2hhcGUgPSBuZXcgQXJyYXkoeFJhbmsgLSAxKTtcbiAgICBsZXQgb3V0SW5kZXggPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeFJhbms7IGkrKykge1xuICAgICAgICBpZiAoaSAhPT0gYXhpcykge1xuICAgICAgICAgICAgb3V0U2hhcGVbb3V0SW5kZXgrK10gPSB4LnNoYXBlW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHRvRGlzcG9zZSA9IFtdO1xuICAgIGNvbnN0IGJlZ2luID0gbmV3IEFycmF5KHhSYW5rKS5maWxsKDApO1xuICAgIGNvbnN0IHNpemUgPSB4LnNoYXBlLnNsaWNlKCk7XG4gICAgc2l6ZVtheGlzXSA9IDE7XG4gICAgY29uc3QgcmVzID0gbmV3IEFycmF5KG51bSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYmVnaW5bYXhpc10gPSBpO1xuICAgICAgICBjb25zdCBzbGljZWQgPSBzbGljZSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQsIGF0dHJzOiB7IGJlZ2luLCBzaXplIH0gfSk7XG4gICAgICAgIGNvbnN0IHJlc2hhcGVkID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiBzbGljZWQgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IG91dFNoYXBlIH0gfSk7XG4gICAgICAgIHJlc1tpXSA9IHJlc2hhcGVkO1xuICAgICAgICB0b0Rpc3Bvc2UucHVzaChzbGljZWQpO1xuICAgIH1cbiAgICB0b0Rpc3Bvc2UuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuICAgIHJldHVybiByZXM7XG59XG5leHBvcnQgY29uc3QgdW5wYWNrQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFVucGFjayxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiB1bnBhY2tcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1VbnBhY2suanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBzdW1PdXRUeXBlLCBVbnNvcnRlZFNlZ21lbnRTdW0sIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgU2VnbWVudE9wUHJvZ3JhbSB9IGZyb20gJy4uL3NlZ21lbnRfZ3B1JztcbmltcG9ydCB7IHJhbmdlIH0gZnJvbSAnLi9SYW5nZSc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7IHRpbGUgfSBmcm9tICcuL1RpbGUnO1xuaW1wb3J0IHsgdHJhbnNwb3NlIH0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuZXhwb3J0IGZ1bmN0aW9uIHVuc29ydGVkU2VnbWVudFN1bShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCwgc2VnbWVudElkcyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgbnVtU2VnbWVudHMgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgdG9EaXNwb3NlID0gW107XG4gICAgbGV0IGF4aXMgPSAwO1xuICAgIGNvbnN0IHBlcm11dGF0aW9uID0gYmFja2VuZF91dGlsLmdldEF4ZXNQZXJtdXRhdGlvbihbYXhpc10sIHhSYW5rKTtcbiAgICBsZXQgcGVybXV0ZWRYID0geDtcbiAgICBpZiAocGVybXV0YXRpb24gIT0gbnVsbCkge1xuICAgICAgICBwZXJtdXRlZFggPSB0cmFuc3Bvc2UoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kLCBhdHRyczogeyBwZXJtOiBwZXJtdXRhdGlvbiB9IH0pO1xuICAgICAgICB0b0Rpc3Bvc2UucHVzaChwZXJtdXRlZFgpO1xuICAgICAgICBheGlzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoMSwgeFJhbmspWzBdO1xuICAgIH1cbiAgICBjb25zdCBvdXRTaGFwZSA9IGJhY2tlbmRfdXRpbC5zZWdtZW50X3V0aWwuY29tcHV0ZU91dFNoYXBlKHBlcm11dGVkWC5zaGFwZSwgYXhpcywgbnVtU2VnbWVudHMpO1xuICAgIGNvbnN0IGluU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShbcGVybXV0ZWRYLnNoYXBlW2F4aXNdXSk7XG4gICAgY29uc3QgYTJEID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiBwZXJtdXRlZFggfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IFstMSwgaW5TaXplXSB9IH0pO1xuICAgIHRvRGlzcG9zZS5wdXNoKGEyRCk7XG4gICAgY29uc3Qgb3V0cHV0RFR5cGUgPSBzdW1PdXRUeXBlKHguZHR5cGUpO1xuICAgIGNvbnN0IHNlZ09wQ29tcHV0ZSA9ICh4LCBzZWdPcFR5cGUsIHNlZ21lbnRJZHMsIGR0eXBlLCBudW1TZWdtZW50cykgPT4ge1xuICAgICAgICBjb25zdCBiYXRjaFNpemUgPSB4LnNoYXBlWzBdO1xuICAgICAgICBjb25zdCBpblNpemUgPSB4LnNoYXBlWzFdO1xuICAgICAgICBjb25zdCB3aW5kb3dTaXplID0gYmFja2VuZF91dGlsLnNlZ21lbnRfdXRpbC5zZWdPcENvbXB1dGVPcHRpbWFsV2luZG93U2l6ZShpblNpemUsIG51bVNlZ21lbnRzKTtcbiAgICAgICAgY29uc3Qgc2VnT3BJbmZvID0geyB3aW5kb3dTaXplLCBpblNpemUsIGJhdGNoU2l6ZSwgbnVtU2VnbWVudHMgfTtcbiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBTZWdtZW50T3BQcm9ncmFtKHNlZ09wSW5mbywgc2VnT3BUeXBlKTtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gYmFja2VuZC5jb21waWxlQW5kUnVuKHByb2dyYW0sIFt4LCBzZWdtZW50SWRzXSwgZHR5cGUpO1xuICAgICAgICB0b0Rpc3Bvc2UucHVzaChvdXRwdXQpO1xuICAgICAgICAvLyBObyBuZWVkIHRvIHJ1biBhbm90aGVyIEdQR1BVIHByb2dyYW0uXG4gICAgICAgIGlmIChvdXRwdXQuc2hhcGVbMV0gPT09IG51bVNlZ21lbnRzKSB7XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJhbmdlSW5mbyA9IHJhbmdlKHtcbiAgICAgICAgICAgIGJhY2tlbmQsXG4gICAgICAgICAgICBhdHRyczogeyBzdGFydDogMCwgc3RvcDogbnVtU2VnbWVudHMsIHN0ZXA6IDEsIGR0eXBlOiAnZmxvYXQzMicgfVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgdGlsZUluZm8gPSB0aWxlKHtcbiAgICAgICAgICAgIGlucHV0czogeyB4OiByYW5nZUluZm8gfSxcbiAgICAgICAgICAgIGJhY2tlbmQsXG4gICAgICAgICAgICBhdHRyczogeyByZXBzOiBbaW5TaXplIC8gd2luZG93U2l6ZV0gfVxuICAgICAgICB9KTtcbiAgICAgICAgdG9EaXNwb3NlLnB1c2gocmFuZ2VJbmZvKTtcbiAgICAgICAgdG9EaXNwb3NlLnB1c2godGlsZUluZm8pO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBzZWdPcENvbXB1dGUob3V0cHV0LCBzZWdPcFR5cGUsIHRpbGVJbmZvLCBkdHlwZSwgbnVtU2VnbWVudHMpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgY29uc3Qgc2VnT3BSZXN1bHQgPSBzZWdPcENvbXB1dGUoYTJELCAndW5zb3J0ZWRTZWdtZW50U3VtJywgc2VnbWVudElkcywgb3V0cHV0RFR5cGUsIG51bVNlZ21lbnRzKTtcbiAgICBjb25zdCByZXNoYXBlZCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogc2VnT3BSZXN1bHQgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IG91dFNoYXBlIH0gfSk7XG4gICAgbGV0IHJlc3VsdCA9IHJlc2hhcGVkO1xuICAgIGlmIChwZXJtdXRhdGlvbiAhPSBudWxsKSB7XG4gICAgICAgIHRvRGlzcG9zZS5wdXNoKHJlc2hhcGVkKTtcbiAgICAgICAgY29uc3QgcGVybSA9IGJhY2tlbmRfdXRpbC5nZXRVbmRvQXhlc1Blcm11dGF0aW9uKHBlcm11dGF0aW9uKTtcbiAgICAgICAgcmVzdWx0ID0gdHJhbnNwb3NlKHsgaW5wdXRzOiB7IHg6IHJlc3VsdCB9LCBiYWNrZW5kLCBhdHRyczogeyBwZXJtIH0gfSk7XG4gICAgfVxuICAgIHRvRGlzcG9zZS5mb3JFYWNoKHQgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0KSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBjb25zdCB1bnNvcnRlZFNlZ21lbnRTdW1Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogVW5zb3J0ZWRTZWdtZW50U3VtLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IHVuc29ydGVkU2VnbWVudFN1bVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVVuc29ydGVkU2VnbWVudFN1bS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBaZXJvc0xpa2UgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY29tcGxleCB9IGZyb20gJy4vQ29tcGxleCc7XG5pbXBvcnQgeyBmaWxsIH0gZnJvbSAnLi9GaWxsJztcbmltcG9ydCB7IGltYWcgfSBmcm9tICcuL0ltYWcnO1xuaW1wb3J0IHsgcmVhbCB9IGZyb20gJy4vUmVhbCc7XG5leHBvcnQgZnVuY3Rpb24gemVyb3NMaWtlKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBpZiAoeC5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgY29uc3QgcmVhbFBhcnQgPSByZWFsKHsgaW5wdXRzOiB7IGlucHV0OiB4IH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIGNvbnN0IHIgPSB6ZXJvc0xpa2UoeyBpbnB1dHM6IHsgeDogcmVhbFBhcnQgfSwgYmFja2VuZCB9KTtcbiAgICAgICAgY29uc3QgaW1hZ1BhcnQgPSBpbWFnKHsgaW5wdXRzOiB7IGlucHV0OiB4IH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIGNvbnN0IGkgPSB6ZXJvc0xpa2UoeyBpbnB1dHM6IHsgeDogaW1hZ1BhcnQgfSwgYmFja2VuZCB9KTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY29tcGxleCh7IGlucHV0czogeyByZWFsOiByLCBpbWFnOiBpIH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVhbFBhcnQpO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHIpO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGltYWdQYXJ0KTtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBmaWxsKHtcbiAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgc2hhcGU6IHguc2hhcGUsXG4gICAgICAgICAgICAgICAgZHR5cGU6IHguZHR5cGUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHguZHR5cGUgPT09ICdzdHJpbmcnID8gJycgOiAwXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmFja2VuZFxuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgemVyb3NMaWtlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFplcm9zTGlrZSxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiB6ZXJvc0xpa2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1aZXJvc0xpa2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IF9GdXNlZE1hdE11bCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBiYXRjaE1hdE11bEltcGwgfSBmcm9tICcuL0JhdGNoTWF0TXVsX2ltcGwnO1xuZXhwb3J0IGZ1bmN0aW9uIF9mdXNlZE1hdE11bChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgYSwgYiwgYmlhcywgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgdHJhbnNwb3NlQSwgdHJhbnNwb3NlQiwgYWN0aXZhdGlvbiwgbGVha3lyZWx1QWxwaGEgfSA9IGF0dHJzO1xuICAgIHJldHVybiBiYXRjaE1hdE11bEltcGwoe1xuICAgICAgICBhLFxuICAgICAgICBiLFxuICAgICAgICB0cmFuc3Bvc2VBLFxuICAgICAgICB0cmFuc3Bvc2VCLFxuICAgICAgICBiYWNrZW5kLFxuICAgICAgICBiaWFzLFxuICAgICAgICBwcmVsdUFjdGl2YXRpb25XZWlnaHRzLFxuICAgICAgICBsZWFreXJlbHVBbHBoYSxcbiAgICAgICAgYWN0aXZhdGlvblxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IF9mdXNlZE1hdE11bENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBfRnVzZWRNYXRNdWwsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogX2Z1c2VkTWF0TXVsLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPV9GdXNlZE1hdE11bC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5leHBvcnQgY2xhc3MgTFJOUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoeFNoYXBlLCByYWRpdXMsIGJpYXMsIGFscGhhLCBiZXRhKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsneCddO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gW107XG4gICAgICAgIGNvbnN0IHJhZCA9IHJhZGl1cztcbiAgICAgICAgY29uc3QgbWF4RCA9IHhTaGFwZVszXSAtIDE7XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSB4U2hhcGU7XG4gICAgICAgIC8vIG9wdGltaXplIHBvdyhiaWFzICsgYWxwaGEgKiBzdW0sIC1iZXRhKVxuICAgICAgICAvLyBzcmM6IGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmZsb3cvLi5cbiAgICAgICAgLy8gYmxvYi8yNjAzM2ExNjQ0YTljNGE1ZmJlMzE3MGFiMmU4NjRiNmE0Y2NkNGNhLy4uXG4gICAgICAgIC8vIHRlbnNvcmZsb3cvY29yZS9rZXJuZWxzL21rbF9scm5fb3AuY2MjTDMyMFxuICAgICAgICBsZXQgcG93T3BlcmF0b3I7XG4gICAgICAgIGNvbnN0IGJhc2lzID0gYGZsb2F0KCR7Ymlhc30pICsgZmxvYXQoJHthbHBoYX0pICogc3VtYDtcbiAgICAgICAgaWYgKGJldGEgPT09IDAuNSkge1xuICAgICAgICAgICAgcG93T3BlcmF0b3IgPSBgaW52ZXJzZXNxcnQoJHtiYXNpc30pYDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChiZXRhID09PSAxLjApIHtcbiAgICAgICAgICAgIHBvd09wZXJhdG9yID0gYDEuMC8oJHtiYXNpc30pYDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHBvd09wZXJhdG9yID0gYGV4cChsb2coJHtiYXNpc30pICogZmxvYXQoLSR7YmV0YX0pKTtgO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYiA9IGNvb3Jkc1swXTtcbiAgICAgICAgaW50IHIgPSBjb29yZHNbMV07XG4gICAgICAgIGludCBjID0gY29vcmRzWzJdO1xuICAgICAgICBpbnQgZCA9IGNvb3Jkc1szXTtcbiAgICAgICAgZmxvYXQgeCA9IGdldFgoYiwgciwgYywgZCk7XG4gICAgICAgIGZsb2F0IHN1bSA9IDAuMDtcbiAgICAgICAgZm9yIChpbnQgaiA9IC0ke3JhZH07IGogPD0gJHtyYWR9OyBqKyspIHtcbiAgICAgICAgICBpbnQgaWR4ID0gZCArIGo7XG4gICAgICAgICAgaWYgKGlkeCA+PSAwICYmIGlkeCA8PSAgJHttYXhEfSkge1xuICAgICAgICAgICAgZmxvYXQgeiA9IGdldFgoYiwgciwgYywgaWR4KTtcbiAgICAgICAgICAgIHN1bSArPSB6ICogejtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmxvYXQgdmFsID0geCAqICR7cG93T3BlcmF0b3J9O1xuICAgICAgICBzZXRPdXRwdXQodmFsKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxybl9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuZXhwb3J0IGNsYXNzIExSTkdyYWRQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3RvcihpbnB1dFNoYXBlLCBkZXB0aFJhZGl1cywgYmlhcywgYWxwaGEsIGJldGEpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWydpbnB1dEltYWdlJywgJ291dHB1dEltYWdlJywgJ2R5J107XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBbXTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IGlucHV0U2hhcGU7XG4gICAgICAgIHRoaXMuZGVwdGggPSBpbnB1dFNoYXBlWzNdO1xuICAgICAgICB0aGlzLmRlcHRoUmFkaXVzID0gZGVwdGhSYWRpdXM7XG4gICAgICAgIHRoaXMuYmlhcyA9IGJpYXM7XG4gICAgICAgIHRoaXMuYWxwaGEgPSBhbHBoYTtcbiAgICAgICAgdGhpcy5iZXRhID0gYmV0YTtcbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgciA9IGNvb3Jkc1sxXTtcbiAgICAgICAgaW50IGMgPSBjb29yZHNbMl07XG5cbiAgICAgICAgZmxvYXQgcmVzdWx0ID0gMC4wO1xuICAgICAgICBmb3IgKGludCBkID0gMDsgZCA8ICR7dGhpcy5kZXB0aH07ICsrZCkge1xuICAgICAgICAgIGludCBkZXB0aEJlZ2luID0gaW50KG1heCgwLjAsIGZsb2F0KGQgLSAke2RlcHRoUmFkaXVzfSkpKTtcbiAgICAgICAgICBpbnQgZGVwdGhFbmQgPSBpbnQobWluKGZsb2F0KCR7dGhpcy5kZXB0aH0pLFxuICAgICAgICAgICAgICBmbG9hdChkICsgJHtkZXB0aFJhZGl1c30gKyAxKSkpO1xuXG4gICAgICAgICAgY29uc3QgaW50IE1JTl9ERVBUSF9CRUdJTiA9IDA7XG4gICAgICAgICAgY29uc3QgaW50IE1BWF9ERVBUSF9FTkQgPSAke3RoaXMuZGVwdGh9O1xuXG4gICAgICAgICAgZmxvYXQgbm9ybSA9IDAuMDtcbiAgICAgICAgICBmb3IgKGludCBrID0gTUlOX0RFUFRIX0JFR0lOOyBrIDwgTUFYX0RFUFRIX0VORDsgKytrKSB7XG4gICAgICAgICAgICBpZiAoayA8IGRlcHRoQmVnaW4pe1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGsgPj0gZGVwdGhCZWdpbiAmJiBrIDwgZGVwdGhFbmQpIHtcbiAgICAgICAgICAgICAgbm9ybSArPSBnZXRJbnB1dEltYWdlKGIsIHIsIGMsIGspICogZ2V0SW5wdXRJbWFnZShiLCByLCBjLCBrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBub3JtID0gZmxvYXQoJHthbHBoYX0pICogbm9ybSArIGZsb2F0KCR7Ymlhc30pO1xuXG4gICAgICAgICAgZm9yKGludCBrID0gTUlOX0RFUFRIX0JFR0lOOyBrIDwgTUFYX0RFUFRIX0VORDsgKytrKXtcbiAgICAgICAgICAgIGlmIChrIDwgZGVwdGhCZWdpbil7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoayA+PSBkZXB0aEJlZ2luICYmIGsgPCBkZXB0aEVuZCl7XG4gICAgICAgICAgICAgIGZsb2F0IGR5aSA9IC0yLjAgKiBmbG9hdCgke2FscGhhfSlcbiAgICAgICAgICAgICAgICAqIGZsb2F0KCR7YmV0YX0pXG4gICAgICAgICAgICAgICAgKiBnZXRJbnB1dEltYWdlKGIgLHIgLGMsIGspICogZ2V0T3V0cHV0SW1hZ2UoYiwgciwgYywgZClcbiAgICAgICAgICAgICAgICAvIG5vcm07XG4gICAgICAgICAgICAgIGlmIChrID09IGQpIHtcbiAgICAgICAgICAgICAgICBkeWkgKz0gcG93KG5vcm0sIC0xLjAgKiAke2JldGF9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoayA9PSBjb29yZHNbM10pIHtcbiAgICAgICAgICAgICAgICBkeWkgKj0gZ2V0RHkoYiwgciwgYywgZCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGR5aTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bHJuX2dyYWRfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmV4cG9ydCBjbGFzcyBMUk5QYWNrZWRQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3Rvcih4U2hhcGUsIHJhZGl1cywgYmlhcywgYWxwaGEsIGJldGEpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWyd4J107XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBbXTtcbiAgICAgICAgdGhpcy5wYWNrZWRJbnB1dHMgPSB0cnVlO1xuICAgICAgICB0aGlzLnBhY2tlZE91dHB1dCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHJhZCA9IHJhZGl1cztcbiAgICAgICAgY29uc3QgbWF4RCA9IHhTaGFwZVszXSAtIDE7XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSB4U2hhcGU7XG4gICAgICAgIC8vIG9wdGltaXplIHBvdyhiaWFzICsgYWxwaGEgKiBzdW0sIC1iZXRhKVxuICAgICAgICAvLyBzcmM6IGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmZsb3cvLi5cbiAgICAgICAgLy8gYmxvYi8yNjAzM2ExNjQ0YTljNGE1ZmJlMzE3MGFiMmU4NjRiNmE0Y2NkNGNhLy4uXG4gICAgICAgIC8vIHRlbnNvcmZsb3cvY29yZS9rZXJuZWxzL21rbF9scm5fb3AuY2MjTDMyMFxuICAgICAgICBsZXQgcG93T3BlcmF0b3I7XG4gICAgICAgIGNvbnN0IGJhc2lzID0gYGZsb2F0KCR7Ymlhc30pICsgZmxvYXQoJHthbHBoYX0pICogc3VtYDtcbiAgICAgICAgaWYgKGJldGEgPT09IDAuNSkge1xuICAgICAgICAgICAgcG93T3BlcmF0b3IgPSBgaW52ZXJzZXNxcnQoJHtiYXNpc30pYDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChiZXRhID09PSAxLjApIHtcbiAgICAgICAgICAgIHBvd09wZXJhdG9yID0gYDEuMC8oJHtiYXNpc30pYDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHBvd09wZXJhdG9yID0gYGV4cChsb2coJHtiYXNpc30pICogZmxvYXQoLSR7YmV0YX0pKTtgO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYiA9IGNvb3Jkcy54O1xuICAgICAgICBpbnQgciA9IGNvb3Jkcy55O1xuICAgICAgICBpbnQgYyA9IGNvb3Jkcy56O1xuICAgICAgICBpbnQgZCA9IGNvb3Jkcy53O1xuXG4gICAgICAgIGJvb2wgaGFzTmV4dENvbCA9IGQgPCAke3RoaXMub3V0cHV0U2hhcGVbM119O1xuICAgICAgICBib29sIGhhc05leHRSb3cgPSBjIDwgJHt0aGlzLm91dHB1dFNoYXBlWzJdfTtcblxuICAgICAgICB2ZWM0IHN1bSA9IHZlYzQoMC4pO1xuICAgICAgICB2ZWM0IHhGcmFnQXRPdXRwdXRDb29yZHMgPSBnZXRYKGIsIHIsIGMsIGQpO1xuXG4gICAgICAgIHZlYzQgeEF0T3V0cHV0Q29vcmRzID0gdmVjNChcbiAgICAgICAgICBnZXRDaGFubmVsKHhGcmFnQXRPdXRwdXRDb29yZHMsIHZlYzIoYywgZCkpLFxuICAgICAgICAgIGhhc05leHRDb2wgP1xuICAgICAgICAgICAgZ2V0Q2hhbm5lbCh4RnJhZ0F0T3V0cHV0Q29vcmRzLCB2ZWMyKGMsIGQgKyAxKSkgOiAwLjAsXG4gICAgICAgICAgaGFzTmV4dFJvdyA/XG4gICAgICAgICAgICBnZXRDaGFubmVsKHhGcmFnQXRPdXRwdXRDb29yZHMgLCB2ZWMyKGMgKyAxLCBkKSkgOiAwLjAsXG4gICAgICAgICAgKGhhc05leHRSb3cgJiYgaGFzTmV4dENvbCkgP1xuICAgICAgICAgICAgZ2V0Q2hhbm5lbCh4RnJhZ0F0T3V0cHV0Q29vcmRzLCB2ZWMyKGMgKyAxLCBkICsgMSkpIDogMC4wXG4gICAgICAgICk7XG5cbiAgICAgICAgaW50IGZpcnN0Q2hhbm5lbCA9IGQgLSAke3JhZH07XG4gICAgICAgIHZlYzIgY2FjaGUgPSB2ZWMyKDAuKTtcbiAgICAgICAgaWYoZmlyc3RDaGFubmVsID49IDApe1xuICAgICAgICAgIHZlYzQgZmlyc3RDaGFubmVsRnJhZyA9IGdldFgoYiwgciwgYywgZmlyc3RDaGFubmVsKTtcbiAgICAgICAgICBjYWNoZS54ID0gZ2V0Q2hhbm5lbChmaXJzdENoYW5uZWxGcmFnLCB2ZWMyKGMsIGZpcnN0Q2hhbm5lbCkpO1xuICAgICAgICAgICAgaWYoaGFzTmV4dFJvdyl7XG4gICAgICAgICAgICAgIGNhY2hlLnkgPSBnZXRDaGFubmVsKGZpcnN0Q2hhbm5lbEZyYWcsIHZlYzIoYyArIDEsIGZpcnN0Q2hhbm5lbCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaXZlYzIgZGVwdGggPSBpdmVjMihkLCBkICsgMSk7XG4gICAgICAgIGZvciAoaW50IGogPSAtICR7cmFkfTsgaiA8PSAke3JhZH07IGorKykge1xuICAgICAgICAgIGl2ZWMyIGlkeCA9IGRlcHRoICsgajtcbiAgICAgICAgICBidmVjMiBhYm92ZUxvd2VyQm91bmQgPSBncmVhdGVyVGhhbkVxdWFsKGlkeCwgaXZlYzIoMCkpO1xuICAgICAgICAgIGJ2ZWMyIGJlbG93VXBwZXJCb3VuZCA9IGxlc3NUaGFuRXF1YWwoaWR4LCBpdmVjMigke21heER9KSk7XG5cbiAgICAgICAgICBib29sIGRlcHRoSW5SYW5nZSA9IGFib3ZlTG93ZXJCb3VuZC54ICYmIGJlbG93VXBwZXJCb3VuZC54O1xuICAgICAgICAgIGJvb2wgZGVwdGhQbHVzT25lSW5SYW5nZSA9IGFib3ZlTG93ZXJCb3VuZC55ICYmIGJlbG93VXBwZXJCb3VuZC55O1xuXG4gICAgICAgICAgaWYoZGVwdGhJblJhbmdlIHx8IGRlcHRoUGx1c09uZUluUmFuZ2Upe1xuICAgICAgICAgICAgdmVjNCB6ID0gdmVjNCgwLik7XG4gICAgICAgICAgICB2ZWM0IHhGcmFnQXRDdXJyZW50RGVwdGg7XG4gICAgICAgICAgICB6Lnh6ID0gY2FjaGUueHk7XG4gICAgICAgICAgICBpZihkZXB0aFBsdXNPbmVJblJhbmdlICYmIGhhc05leHRDb2wpe1xuICAgICAgICAgICAgICB4RnJhZ0F0Q3VycmVudERlcHRoID0gaWR4LnkgIT0gZCA/XG4gICAgICAgICAgICAgICAgZ2V0WChiLCByLCBjLCBpZHgueSkgOiB4RnJhZ0F0T3V0cHV0Q29vcmRzO1xuICAgICAgICAgICAgICB6LnkgPSBnZXRDaGFubmVsKHhGcmFnQXRDdXJyZW50RGVwdGgsIHZlYzIoYywgaWR4LnkpKTtcbiAgICAgICAgICAgICAgaWYoaGFzTmV4dFJvdyl7XG4gICAgICAgICAgICAgICAgei53ID0gZ2V0Q2hhbm5lbCh4RnJhZ0F0Q3VycmVudERlcHRoLCB2ZWMyKGMgKyAxLCBpZHgueSkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYWNoZS54eSA9IHoueXc7XG4gICAgICAgICAgICBzdW0gKz0geiAqIHo7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZlYzQgcmVzdWx0ID0geEF0T3V0cHV0Q29vcmRzICogJHtwb3dPcGVyYXRvcn07XG4gICAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bHJuX3BhY2tlZF9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuZXhwb3J0IGNsYXNzIE1heFBvb2wyREJhY2twcm9wUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoY29udkluZm8pIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWydkeScsICdtYXhQb3MnXTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IGNvbnZJbmZvLmluU2hhcGU7XG4gICAgICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICAgICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICAgICAgY29uc3QgZGlsYXRpb25IZWlnaHQgPSBjb252SW5mby5kaWxhdGlvbkhlaWdodDtcbiAgICAgICAgY29uc3QgZWZmZWN0aXZlRmlsdGVySGVpZ2h0ID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVySGVpZ2h0O1xuICAgICAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoO1xuICAgICAgICBjb25zdCBwYWRUb3AgPSBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgLSAxIC0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgICAgIGNvbnN0IHBhZExlZnQgPSBlZmZlY3RpdmVGaWx0ZXJXaWR0aCAtIDEgLSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgICAgIGNvbnN0IGxhc3RJbmRleCA9IGVmZmVjdGl2ZUZpbHRlckhlaWdodCAqIGVmZmVjdGl2ZUZpbHRlcldpZHRoIC0gMTtcbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IGl2ZWMyIHBhZHMgPSBpdmVjMigke3BhZFRvcH0sICR7cGFkTGVmdH0pO1xuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYiA9IGNvb3Jkc1swXTtcbiAgICAgICAgaW50IGQgPSBjb29yZHNbM107XG5cbiAgICAgICAgaXZlYzIgZHlSQ0Nvcm5lciA9IGNvb3Jkcy55eiAtIHBhZHM7XG4gICAgICAgIGludCBkeVJDb3JuZXIgPSBkeVJDQ29ybmVyLng7XG4gICAgICAgIGludCBkeUNDb3JuZXIgPSBkeVJDQ29ybmVyLnk7XG5cbiAgICAgICAgLy8gQ29udm9sdmUgZHkoPywgPywgZCkgd2l0aCBwb3MgbWFzayg6LCA6LCBkKSB0byBnZXQgZHgoeFIsIHhDLCBkKS5cbiAgICAgICAgLy8gPyA9IHRvIGJlIGRldGVybWluZWQuIDogPSBhY3Jvc3MgYWxsIHZhbHVlcyBpbiB0aGF0IGF4aXMuXG4gICAgICAgIGZsb2F0IGRvdFByb2QgPSAwLjA7XG4gICAgICAgIGZvciAoaW50IHdSID0gMDsgd1IgPCAke2VmZmVjdGl2ZUZpbHRlckhlaWdodH07XG4gICAgICAgICAgd1IgKz0gJHtkaWxhdGlvbkhlaWdodH0pIHtcbiAgICAgICAgICBmbG9hdCBkeVIgPSBmbG9hdChkeVJDb3JuZXIgKyB3UikgLyAke3N0cmlkZUhlaWdodH0uMDtcblxuICAgICAgICAgIGlmIChkeVIgPCAwLjAgfHwgZHlSID49ICR7Y29udkluZm8ub3V0SGVpZ2h0fS4wIHx8IGZyYWN0KGR5UikgPiAwLjApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpbnQgaWR5UiA9IGludChkeVIpO1xuXG4gICAgICAgICAgZm9yIChpbnQgd0MgPSAwOyB3QyA8ICR7ZWZmZWN0aXZlRmlsdGVyV2lkdGh9OyB3QysrKSB7XG4gICAgICAgICAgICBmbG9hdCBkeUMgPSBmbG9hdChkeUNDb3JuZXIgKyB3QykgLyAke3N0cmlkZVdpZHRofS4wO1xuXG4gICAgICAgICAgICBpZiAoZHlDIDwgMC4wIHx8IGR5QyA+PSAke2NvbnZJbmZvLm91dFdpZHRofS4wIHx8XG4gICAgICAgICAgICAgICAgZnJhY3QoZHlDKSA+IDAuMCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGludCBpZHlDID0gaW50KGR5Qyk7XG5cbiAgICAgICAgICAgIGZsb2F0IGR5VmFsdWUgPSBnZXREeShiLCBpZHlSLCBpZHlDLCBkKTtcbiAgICAgICAgICAgIGludCBtYXhQb3NWYWx1ZSA9ICR7bGFzdEluZGV4fSAtIGludChnZXRNYXhQb3MoYiwgaWR5UiwgaWR5QywgZCkpO1xuXG4gICAgICAgICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgdmFsdWUsIGNoZWNrIGl0IGFnYWluc3QgdGhlIHZhbHVlIGZyb20gdGhlXG4gICAgICAgICAgICAvLyBwb3NpdGlvbiBtYXRyaXguXG4gICAgICAgICAgICBpbnQgY3VyUG9zVmFsdWUgPSB3UiAqICR7ZWZmZWN0aXZlRmlsdGVyV2lkdGh9ICsgd0M7XG4gICAgICAgICAgICBmbG9hdCBtYXNrID0gZmxvYXQobWF4UG9zVmFsdWUgPT0gY3VyUG9zVmFsdWUgPyAxLjAgOiAwLjApO1xuXG4gICAgICAgICAgICBkb3RQcm9kICs9IGR5VmFsdWUgKiBtYXNrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQoZG90UHJvZCk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgTWF4UG9vbDNEQmFja3Byb3BQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3Rvcihjb252SW5mbykge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ2R5JywgJ21heFBvcyddO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gY29udkluZm8uaW5TaGFwZTtcbiAgICAgICAgY29uc3Qgc3RyaWRlRGVwdGggPSBjb252SW5mby5zdHJpZGVEZXB0aDtcbiAgICAgICAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICAgICAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICAgICAgICBjb25zdCBkaWxhdGlvbkRlcHRoID0gY29udkluZm8uZGlsYXRpb25EZXB0aDtcbiAgICAgICAgY29uc3QgZGlsYXRpb25IZWlnaHQgPSBjb252SW5mby5kaWxhdGlvbkhlaWdodDtcbiAgICAgICAgY29uc3QgZGlsYXRpb25XaWR0aCA9IGNvbnZJbmZvLmRpbGF0aW9uV2lkdGg7XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckRlcHRoID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVyRGVwdGg7XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckhlaWdodDtcbiAgICAgICAgY29uc3QgZWZmZWN0aXZlRmlsdGVyV2lkdGggPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJXaWR0aDtcbiAgICAgICAgY29uc3QgcGFkRnJvbnQgPSBlZmZlY3RpdmVGaWx0ZXJEZXB0aCAtIDEgLSBjb252SW5mby5wYWRJbmZvLmZyb250O1xuICAgICAgICBjb25zdCBwYWRUb3AgPSBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgLSAxIC0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgICAgIGNvbnN0IHBhZExlZnQgPSBlZmZlY3RpdmVGaWx0ZXJXaWR0aCAtIDEgLSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgICAgIGNvbnN0IGxhc3RJbmRleCA9IGVmZmVjdGl2ZUZpbHRlckRlcHRoICogZWZmZWN0aXZlRmlsdGVySGVpZ2h0ICogZWZmZWN0aXZlRmlsdGVyV2lkdGggLSAxO1xuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgY29uc3QgaXZlYzMgcGFkcyA9IGl2ZWMzKCR7cGFkRnJvbnR9LCAke3BhZFRvcH0sICR7cGFkTGVmdH0pO1xuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM1IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHMueDtcbiAgICAgICAgaW50IGNoID0gY29vcmRzLnU7XG5cbiAgICAgICAgaXZlYzMgZHlDb3JuZXIgPSBpdmVjMyhjb29yZHMueSwgY29vcmRzLnosIGNvb3Jkcy53KSAtIHBhZHM7XG4gICAgICAgIGludCBkeURDb3JuZXIgPSBkeUNvcm5lci54O1xuICAgICAgICBpbnQgZHlSQ29ybmVyID0gZHlDb3JuZXIueTtcbiAgICAgICAgaW50IGR5Q0Nvcm5lciA9IGR5Q29ybmVyLno7XG5cbiAgICAgICAgLy8gQ29udm9sdmUgZHkoPywgPywgPywgY2gpIHdpdGggcG9zIG1hc2soOiwgOiwgOiwgZCkgdG8gZ2V0XG4gICAgICAgIC8vIGR4KHhELCB4UiwgeEMsIGNoKS5cbiAgICAgICAgLy8gPyA9IHRvIGJlIGRldGVybWluZWQuIDogPSBhY3Jvc3MgYWxsIHZhbHVlcyBpbiB0aGF0IGF4aXMuXG4gICAgICAgIGZsb2F0IGRvdFByb2QgPSAwLjA7XG5cbiAgICAgICAgZm9yIChpbnQgd0QgPSAwOyB3RCA8ICR7ZWZmZWN0aXZlRmlsdGVyRGVwdGh9O1xuICAgICAgICAgICB3RCArPSAke2RpbGF0aW9uRGVwdGh9KSB7XG4gICAgICAgICAgZmxvYXQgZHlEID0gZmxvYXQoZHlEQ29ybmVyICsgd0QpIC8gJHtzdHJpZGVEZXB0aH0uMDtcblxuICAgICAgICAgIGlmIChkeUQgPCAwLjAgfHwgZHlEID49ICR7Y29udkluZm8ub3V0RGVwdGh9LjAgfHwgZnJhY3QoZHlEKSA+IDAuMCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGludCBpZHlEID0gaW50KGR5RCk7XG5cbiAgICAgICAgICBmb3IgKGludCB3UiA9IDA7IHdSIDwgJHtlZmZlY3RpdmVGaWx0ZXJIZWlnaHR9O1xuICAgICAgICAgICAgICB3UiArPSAke2RpbGF0aW9uSGVpZ2h0fSkge1xuICAgICAgICAgICAgZmxvYXQgZHlSID0gZmxvYXQoZHlSQ29ybmVyICsgd1IpIC8gJHtzdHJpZGVIZWlnaHR9LjA7XG5cbiAgICAgICAgICAgIGlmIChkeVIgPCAwLjAgfHwgZHlSID49ICR7Y29udkluZm8ub3V0SGVpZ2h0fS4wIHx8XG4gICAgICAgICAgICAgICAgZnJhY3QoZHlSKSA+IDAuMCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGludCBpZHlSID0gaW50KGR5Uik7XG5cbiAgICAgICAgICAgIGZvciAoaW50IHdDID0gMDsgd0MgPCAke2VmZmVjdGl2ZUZpbHRlcldpZHRofTtcbiAgICAgICAgICAgICAgICB3QyArPSAke2RpbGF0aW9uV2lkdGh9KSB7XG4gICAgICAgICAgICAgIGZsb2F0IGR5QyA9IGZsb2F0KGR5Q0Nvcm5lciArIHdDKSAvICR7c3RyaWRlV2lkdGh9LjA7XG5cbiAgICAgICAgICAgICAgaWYgKGR5QyA8IDAuMCB8fCBkeUMgPj0gJHtjb252SW5mby5vdXRXaWR0aH0uMCB8fFxuICAgICAgICAgICAgICAgICAgZnJhY3QoZHlDKSA+IDAuMCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGludCBpZHlDID0gaW50KGR5Qyk7XG5cbiAgICAgICAgICAgICAgZmxvYXQgZHlWYWx1ZSA9IGdldER5KGJhdGNoLCBpZHlELCBpZHlSLCBpZHlDLCBjaCk7XG4gICAgICAgICAgICAgIGludCBtYXhQb3NWYWx1ZSA9ICR7bGFzdEluZGV4fSAtXG4gICAgICAgICAgICAgICAgICBpbnQoZ2V0TWF4UG9zKGJhdGNoLCBpZHlELCBpZHlSLCBpZHlDLCBjaCkpO1xuXG4gICAgICAgICAgICAgIC8vIEdldCB0aGUgY3VycmVudCB2YWx1ZSwgY2hlY2sgaXQgYWdhaW5zdCB0aGUgdmFsdWUgZnJvbSB0aGVcbiAgICAgICAgICAgICAgLy8gcG9zaXRpb24gbWF0cml4LlxuICAgICAgICAgICAgICBpbnQgY3VyUG9zVmFsdWUgPVxuICAgICAgICAgICAgICAgICAgd0QgKiAke2VmZmVjdGl2ZUZpbHRlckhlaWdodH0gKiAke2VmZmVjdGl2ZUZpbHRlcldpZHRofSArXG4gICAgICAgICAgICAgICAgICB3UiAqICR7ZWZmZWN0aXZlRmlsdGVyV2lkdGh9ICsgd0M7XG4gICAgICAgICAgICAgIGZsb2F0IG1hc2sgPSBmbG9hdChtYXhQb3NWYWx1ZSA9PSBjdXJQb3NWYWx1ZSA/IDEuMCA6IDAuMCk7XG5cbiAgICAgICAgICAgICAgZG90UHJvZCArPSBkeVZhbHVlICogbWFzaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0T3V0cHV0KGRvdFByb2QpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWF4X3Bvb2xfYmFja3Byb3BfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGNsYXNzIE1lYW5Qcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3RvcihyZWR1Y2VJbmZvLCBkaXZpc29yKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsneCddO1xuICAgICAgICBjb25zdCB7IHdpbmRvd1NpemUsIGJhdGNoU2l6ZSwgaW5TaXplLCBvdXRTaXplIH0gPSByZWR1Y2VJbmZvO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gW2JhdGNoU2l6ZSwgb3V0U2l6ZV07XG4gICAgICAgIGNvbnN0IHdpbmRvd1NpemVOZWFyZXN0VmVjNCA9IE1hdGguZmxvb3Iod2luZG93U2l6ZSAvIDQpICogNDtcbiAgICAgICAgY29uc3Qgd2luZG93U2l6ZVZlYzRSZW1haW5kZXIgPSB3aW5kb3dTaXplICUgNDtcbiAgICAgICAgbGV0IHVwZGF0ZVNuaXBwZXQgPSBgc3VtVmFsdWUgKz0gZG90KHZhbHVlcywgb25lcyk7YDtcbiAgICAgICAgaWYgKGRpdmlzb3IgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgZGVub21pbmF0b3IgPSAxIC8gZGl2aXNvcjtcbiAgICAgICAgICAgIHVwZGF0ZVNuaXBwZXQgPSBgc3VtVmFsdWUgKz0gZG90KHZhbHVlcyAqICR7dXRpbC5pc0ludChkZW5vbWluYXRvcikgPyBkZW5vbWluYXRvci50b1ByZWNpc2lvbigyKSA6XG4gICAgICAgICAgICAgICAgZGVub21pbmF0b3J9LCBvbmVzKTtgO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjaGVja091dE9mQm91bmRzID0gJyc7XG4gICAgICAgIGlmIChpblNpemUgJSB3aW5kb3dTaXplID4gMCkge1xuICAgICAgICAgICAgY2hlY2tPdXRPZkJvdW5kcyA9IGBcbiAgICAgICAgaWYgKGluSWR4IDwgMCB8fCBpbklkeCA+PSAke2luU2l6ZX0pIHtcbiAgICAgICAgICByZXR1cm4gMC4wO1xuICAgICAgICB9XG4gICAgICBgO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCB2ZWM0IG9uZXMgPSB2ZWM0KDEuMCwgMS4wLCAxLjAsIDEuMCk7XG5cbiAgICAgIGZsb2F0IGdldFZhbHVlKGludCBiYXRjaCwgaW50IGluSWR4KSB7XG4gICAgICAgICR7Y2hlY2tPdXRPZkJvdW5kc31cbiAgICAgICAgcmV0dXJuIGdldFgoYmF0Y2gsIGluSWR4KTtcbiAgICAgIH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMiBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgb3V0SWR4ID0gY29vcmRzWzFdO1xuICAgICAgICBpbnQgaW5PZmZzZXQgPSBvdXRJZHggKiAke3dpbmRvd1NpemV9O1xuXG4gICAgICAgIGZsb2F0IHN1bVZhbHVlID0gMC4wO1xuXG4gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgJHt3aW5kb3dTaXplTmVhcmVzdFZlYzR9OyBpICs9IDQpIHtcbiAgICAgICAgICBpbnQgaW5JZHggPSBpbk9mZnNldCArIGk7XG4gICAgICAgICAgdmVjNCB2YWx1ZXMgPSB2ZWM0KFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4KSxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDEpLFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4ICsgMiksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAzKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAke3VwZGF0ZVNuaXBwZXR9XG4gICAgICAgIH1cblxuICAgICAgICBpbnQgaW5JZHggPSBpbk9mZnNldCArICR7d2luZG93U2l6ZU5lYXJlc3RWZWM0fTtcbiAgICAgICAgaWYgKCR7d2luZG93U2l6ZVZlYzRSZW1haW5kZXIgPT09IDF9KSB7XG4gICAgICAgICAgdmVjNCB2YWx1ZXMgPSB2ZWM0KGdldFZhbHVlKGJhdGNoLCBpbklkeCksIDAuMCwgMC4wLCAwLjApO1xuXG4gICAgICAgICAgJHt1cGRhdGVTbmlwcGV0fVxuICAgICAgICB9IGVsc2UgaWYgKCR7d2luZG93U2l6ZVZlYzRSZW1haW5kZXIgPT09IDJ9KSB7XG4gICAgICAgICAgdmVjNCB2YWx1ZXMgPSB2ZWM0KFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4KSxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDEpLCAwLjAsIDAuMCk7XG5cbiAgICAgICAgICAke3VwZGF0ZVNuaXBwZXR9XG4gICAgICAgIH0gZWxzZSBpZiAoJHt3aW5kb3dTaXplVmVjNFJlbWFpbmRlciA9PT0gM30pIHtcbiAgICAgICAgICB2ZWM0IHZhbHVlcyA9IHZlYzQoXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHgpLFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4ICsgMSksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAyKSwgMC4wKTtcblxuICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQoc3VtVmFsdWUpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVhbl9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZ2V0Q29vcmRzRGF0YVR5cGUgfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5leHBvcnQgY2xhc3MgTWlycm9yUGFkUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoeFNoYXBlLCBwYWRkaW5ncywgbW9kZSkge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IHBhZGRpbmdzLm1hcCgocCwgaSkgPT4gcFswXSAvKiBiZWZvcmVQYWQgKi8gKyB4U2hhcGVbaV0gKyBwWzFdIC8qIGFmdGVyUGFkICovKTtcbiAgICAgICAgY29uc3QgcmFuayA9IHhTaGFwZS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGR0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUocmFuayk7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gcGFkZGluZ3MubWFwKHAgPT4gcFswXSkuam9pbignLCcpO1xuICAgICAgICBjb25zdCBlbmQgPSBwYWRkaW5ncy5tYXAoKHAsIGkpID0+IHBbMF0gKyB4U2hhcGVbaV0pLmpvaW4oJywnKTtcbiAgICAgICAgY29uc3QgdW5wYWNrZWRDb29yZHMgPSBbJ2Nvb3Jkc1swXScsICdjb29yZHNbMV0nLCAnY29vcmRzWzJdJywgJ2Nvb3Jkc1szXSddLnNsaWNlKDAsIHJhbmspO1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBtb2RlID09PSAncmVmbGVjdCcgPyAwIDogMTtcbiAgICAgICAgaWYgKHJhbmsgPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAgIGludCBzdGFydCA9ICR7c3RhcnR9O1xuICAgICAgICBpbnQgZW5kID0gJHtlbmR9O1xuXG4gICAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgICBpbnQgb3V0QyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgIGlmIChvdXRDIDwgc3RhcnQpIHtcbiAgICAgICAgICAgIG91dEMgPSBzdGFydCAqIDIgLSBvdXRDIC0gJHtvZmZzZXR9O1xuICAgICAgICAgIH0gZWxzZSBpZihvdXRDID49IGVuZCkge1xuICAgICAgICAgICAgb3V0QyA9IChlbmQgLSAxKSAqIDIgLSBvdXRDICsgJHtvZmZzZXR9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZXRPdXRwdXQoZ2V0WChvdXRDIC0gc3RhcnQpKTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgJHtkdHlwZX0gc3RhcnQgPSAke2R0eXBlfSgke3N0YXJ0fSk7XG4gICAgICAke2R0eXBlfSBlbmQgPSAke2R0eXBlfSgke2VuZH0pO1xuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICR7ZHR5cGV9IG91dEMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAke3Jhbmt9OyBpKyspIHtcbiAgICAgICAgICBpZiAob3V0Q1tpXSA8IHN0YXJ0W2ldKSB7XG4gICAgICAgICAgICBvdXRDW2ldID0gc3RhcnRbaV0gKiAyIC0gb3V0Q1tpXSAtICR7b2Zmc2V0fTtcbiAgICAgICAgICB9IGVsc2UgaWYob3V0Q1tpXSA+PSBlbmRbaV0pIHtcbiAgICAgICAgICAgIG91dENbaV0gPSAoZW5kW2ldIC0gMSkgKiAyIC0gb3V0Q1tpXSArICR7b2Zmc2V0fTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgJHtkdHlwZX0gY29vcmRzID0gb3V0QyAtIHN0YXJ0O1xuICAgICAgICBzZXRPdXRwdXQoZ2V0WCgke3VucGFja2VkQ29vcmRzfSkpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWlycm9yX3BhZF9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZ2V0Q2hhbm5lbHMgfSBmcm9tICcuL3BhY2tpbmdfdXRpbCc7XG5pbXBvcnQgeyBnZXRDb29yZHNEYXRhVHlwZSB9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcbi8qKlxuICogRXhhbXBsZSBzaGFkZXIgY29kZSBmb3JcbiAqIGBtaXJyb3JQYWQodGYudGVuc29yMWQoWzEsIDIsIDNdLCAnaW50MzInKSwgW1syLCAyXV0sICdyZWZsZWN0JylgXG4gKiBgYGBcbiAqICAgIGNvbnN0IGludCBzdGFydCA9IGludCgyKTtcbiAqICAgIGNvbnN0IGludCBlbmQgPSBpbnQoNSk7XG4gKlxuICogICAgdm9pZCBtYWluKCkge1xuICogICAgICAgaW50IG91dHB1dExvYyA9IGdldE91dHB1dENvb3JkcygpO1xuICogICAgICAgdmVjNCByZXN1bHQgPSB2ZWM0KDAuKTtcbiAqXG4gKiAgICAgICBpbnQgcmMgPSBvdXRwdXRMb2M7XG4gKlxuICogICAgICAgaW50IHNvdXJjZSA9IHJjO1xuICogICAgICAgaWYgKHNvdXJjZSA8IHN0YXJ0KSB7XG4gKiAgICAgICAgIHNvdXJjZSA9IHN0YXJ0ICogMiAtIHNvdXJjZSAtIDA7XG4gKiAgICAgICB9IGVsc2UgaWYgKHNvdXJjZSA+PSBlbmQpIHtcbiAqICAgICAgICAgc291cmNlID0gKGVuZCAtIDEpICogMiAtIHNvdXJjZSArIDA7XG4gKiAgICAgICB9XG4gKiAgICAgICBzb3VyY2UgLT0gc3RhcnQ7XG4gKlxuICogICAgICAgcmVzdWx0WzBdID0gZ2V0Q2hhbm5lbChnZXRYKHNvdXJjZSksIHNvdXJjZSk7XG4gKiAgICAgICByYyArPSAxO1xuICogICAgICAgaWYocmMgPCA2KSB7XG4gKiAgICAgICAgICBpbnQgc291cmNlID0gcmM7XG4gKiAgICAgICAgICBpZiAoc291cmNlIDwgc3RhcnQpIHtcbiAqICAgICAgICAgICAgc291cmNlID0gc3RhcnQgKiAyIC0gc291cmNlIC0gMDtcbiAqICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlID49IGVuZCkge1xuICogICAgICAgICAgICBzb3VyY2UgPSAoZW5kIC0gMSkgKiAyIC0gc291cmNlICsgMDtcbiAqICAgICAgICAgIH1cbiAqICAgICAgICAgIHNvdXJjZSAtPSBzdGFydDtcbiAqXG4gKiAgICAgICAgIHJlc3VsdFsxXSA9IGdldENoYW5uZWwoZ2V0WChzb3VyY2UpLCBzb3VyY2UpO1xuICogICAgICAgfVxuICpcbiAqICAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICogICAgIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgTWlycm9yUGFkUGFja2VkUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoeFNoYXBlLCBwYWRkaW5ncywgbW9kZSkge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgICAgICAgdGhpcy5wYWNrZWRJbnB1dHMgPSB0cnVlO1xuICAgICAgICB0aGlzLnBhY2tlZE91dHB1dCA9IHRydWU7XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBwYWRkaW5ncy5tYXAoKHAsIGkpID0+IHBbMF0gLyogYmVmb3JlUGFkICovICsgeFNoYXBlW2ldICsgcFsxXSAvKiBhZnRlclBhZCAqLyk7XG4gICAgICAgIGNvbnN0IHJhbmsgPSB4U2hhcGUubGVuZ3RoO1xuICAgICAgICBjb25zdCBkdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHJhbmspO1xuICAgICAgICBjb25zdCBzdGFydCA9IHBhZGRpbmdzLm1hcChwID0+IHBbMF0pLmpvaW4oJywnKTtcbiAgICAgICAgY29uc3QgZW5kID0gcGFkZGluZ3MubWFwKChwLCBpKSA9PiBwWzBdICsgeFNoYXBlW2ldKS5qb2luKCcsJyk7XG4gICAgICAgIGNvbnN0IGNvb3JkcyA9IGdldENoYW5uZWxzKCdyYycsIHJhbmspO1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBnZXRDaGFubmVscygnc291cmNlJywgcmFuayk7XG4gICAgICAgIGNvbnN0IGNMaW1pdCA9IGAke2Nvb3Jkc1tyYW5rIC0gMV19IDwgJHt0aGlzLm91dHB1dFNoYXBlW3JhbmsgLSAxXX1gO1xuICAgICAgICBjb25zdCBpbm5lckRpbXMgPSByYW5rID09PSAxID8gJ3NvdXJjZScgOiBgdmVjMigke3NvdXJjZS5zbGljZSgtMikuam9pbigpfSlgO1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBtb2RlID09PSAncmVmbGVjdCcgPyAwIDogMTtcbiAgICAgICAgbGV0IG1haW5Mb29wID0gJyc7XG4gICAgICAgIGlmIChyYW5rID09PSAxKSB7XG4gICAgICAgICAgICBjb25zdCBwYWRTZXR1cCA9IGBcbiAgICAgICAgJHtkdHlwZX0gc291cmNlID0gcmM7XG4gICAgICAgIGlmIChzb3VyY2UgPCBzdGFydCkge1xuICAgICAgICAgIHNvdXJjZSA9IHN0YXJ0ICogMiAtIHNvdXJjZSAtICR7b2Zmc2V0fTtcbiAgICAgICAgfSBlbHNlIGlmIChzb3VyY2UgPj0gZW5kKSB7XG4gICAgICAgICAgc291cmNlID0gKGVuZCAtIDEpICogMiAtIHNvdXJjZSArICR7b2Zmc2V0fTtcbiAgICAgICAgfVxuICAgICAgICBzb3VyY2UgLT0gc3RhcnQ7XG4gICAgICBgO1xuICAgICAgICAgICAgbWFpbkxvb3AgPSBgXG4gICAgICAgICR7ZHR5cGV9IHJjID0gb3V0cHV0TG9jO1xuICAgICAgICAke3BhZFNldHVwfVxuICAgICAgICByZXN1bHRbMF0gPSBnZXRDaGFubmVsKGdldFgoJHtzb3VyY2Uuam9pbigpfSksICR7aW5uZXJEaW1zfSk7XG4gICAgICAgICR7Y29vcmRzW3JhbmsgLSAxXX0gKz0gMTtcbiAgICAgICAgaWYoJHtjTGltaXR9KSB7XG4gICAgICAgICAgJHtwYWRTZXR1cH1cbiAgICAgICAgICByZXN1bHRbMV0gPSBnZXRDaGFubmVsKGdldFgoJHtzb3VyY2Uuam9pbigpfSksICR7aW5uZXJEaW1zfSk7XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBwYWRTZXR1cCA9IGBcbiAgICAgICAgJHtkdHlwZX0gc291cmNlID0gcmM7XG4gICAgICAgICR7ZHR5cGV9IGx0ID0gJHtkdHlwZX0obGVzc1RoYW4oc291cmNlLCBzdGFydCkpO1xuICAgICAgICAke2R0eXBlfSBndGUgPSAke2R0eXBlfShncmVhdGVyVGhhbkVxdWFsKHNvdXJjZSwgZW5kKSk7XG4gICAgICAgICR7ZHR5cGV9IG9yaWcgPSAxIC0gKGx0ICsgZ3RlKTtcbiAgICAgICAgc291cmNlID0gb3JpZyAqIHNvdXJjZSArXG4gICAgICAgICAgICAgICAgbHQgKiAoc3RhcnQgKiAyIC0gc291cmNlIC0gJHtvZmZzZXR9KSArXG4gICAgICAgICAgICAgICAgZ3RlICogKChlbmQgLSAxKSAqIDIgLSBzb3VyY2UgKyAke29mZnNldH0pO1xuICAgICAgICBzb3VyY2UgLT0gc3RhcnQ7XG4gICAgICBgO1xuICAgICAgICAgICAgbWFpbkxvb3AgPSBgXG4gICAgICAgICR7ZHR5cGV9IHJjID0gb3V0cHV0TG9jO1xuICAgICAgICAke3BhZFNldHVwfVxuICAgICAgICByZXN1bHRbMF0gPSBnZXRDaGFubmVsKGdldFgoJHtzb3VyY2Uuam9pbigpfSksICR7aW5uZXJEaW1zfSk7XG4gICAgICAgICR7Y29vcmRzW3JhbmsgLSAxXX0gKz0gMTtcbiAgICAgICAgaWYoJHtjTGltaXR9KSB7XG4gICAgICAgICAgJHtwYWRTZXR1cH1cbiAgICAgICAgICByZXN1bHRbMV0gPSBnZXRDaGFubmVsKGdldFgoJHtzb3VyY2Uuam9pbigpfSksICR7aW5uZXJEaW1zfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmMgPSBvdXRwdXRMb2M7XG4gICAgICAgICR7Y29vcmRzW3JhbmsgLSAyXX0gKz0gMTtcbiAgICAgICAgaWYoJHtjb29yZHNbcmFuayAtIDJdfSA8ICR7dGhpcy5vdXRwdXRTaGFwZVtyYW5rIC0gMl19KSB7XG4gICAgICAgICAgJHtwYWRTZXR1cH1cbiAgICAgICAgICByZXN1bHRbMl0gPSBnZXRDaGFubmVsKGdldFgoJHtzb3VyY2Uuam9pbigpfSksICR7aW5uZXJEaW1zfSk7XG4gICAgICAgICAgJHtjb29yZHNbcmFuayAtIDFdfSArPSAxO1xuICAgICAgICAgIGlmKCR7Y0xpbWl0fSkge1xuICAgICAgICAgICAgJHtwYWRTZXR1cH1cbiAgICAgICAgICAgIHJlc3VsdFszXSA9IGdldENoYW5uZWwoZ2V0WCgke3NvdXJjZS5qb2luKCl9KSwgJHtpbm5lckRpbXN9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0ICR7ZHR5cGV9IHN0YXJ0ID0gJHtkdHlwZX0oJHtzdGFydH0pO1xuICAgICAgY29uc3QgJHtkdHlwZX0gZW5kID0gJHtkdHlwZX0oJHtlbmR9KTtcblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke2R0eXBlfSBvdXRwdXRMb2MgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgdmVjNCByZXN1bHQgPSB2ZWM0KDAuKTtcbiAgICAgICAgJHttYWluTG9vcH1cbiAgICAgICAgc2V0T3V0cHV0KHJlc3VsdCk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1taXJyb3JfcGFkX3BhY2tlZF9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuZXhwb3J0IGNsYXNzIE1hdE11bFBhY2tlZFByb2dyYW0ge1xuICAgIGNvbnN0cnVjdG9yKGFTaGFwZSwgYlNoYXBlLCBvdXRwdXRTaGFwZSwgdHJhbnNwb3NlQSA9IGZhbHNlLCB0cmFuc3Bvc2VCID0gZmFsc2UsIGFkZEJpYXMgPSBmYWxzZSwgYWN0aXZhdGlvbiA9IG51bGwsIGhhc1ByZWx1QWN0aXZhdGlvbiA9IGZhbHNlLCBoYXNMZWFreXJlbHVBY3RpdmF0aW9uID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWydtYXRyaXhBJywgJ21hdHJpeEInXTtcbiAgICAgICAgdGhpcy5wYWNrZWRJbnB1dHMgPSB0cnVlO1xuICAgICAgICB0aGlzLnBhY2tlZE91dHB1dCA9IHRydWU7XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICAgICAgY29uc3Qgc2hhcmVkRGltID0gdHJhbnNwb3NlQSA/IGFTaGFwZVsxXSA6IGFTaGFwZVsyXTtcbiAgICAgICAgY29uc3Qgc2hhcmVkRGltZW5zaW9uUGFja2VkID0gTWF0aC5jZWlsKHNoYXJlZERpbSAvIDIpO1xuICAgICAgICBjb25zdCBhU2FtcGxlID0gdHJhbnNwb3NlQSA/ICdpICogMiwgcmMueScgOiAncmMueSwgaSAqIDInO1xuICAgICAgICBjb25zdCBiU2FtcGxlID0gdHJhbnNwb3NlQiA/ICdyYy56LCBpICogMicgOiAnaSAqIDIsIHJjLnonO1xuICAgICAgICBjb25zdCBhU3dpenpsZSA9IHRyYW5zcG9zZUEgPyBbJ2EueHh5eScsICdhLnp6d3cnXSA6IFsnYS54eHp6JywgJ2EueXl3dyddO1xuICAgICAgICBjb25zdCBiU3dpenpsZSA9IHRyYW5zcG9zZUIgPyBbJ2IueHp4eicsICdiLnl3eXcnXSA6IFsnYi54eXh5JywgJ2Iuend6dyddO1xuICAgICAgICBsZXQgYWN0aXZhdGlvblNuaXBwZXQgPSAnJywgYXBwbHlBY3RpdmF0aW9uU25pcHBldCA9ICcnO1xuICAgICAgICBpZiAoYWN0aXZhdGlvbikge1xuICAgICAgICAgICAgaWYgKGhhc1ByZWx1QWN0aXZhdGlvbikge1xuICAgICAgICAgICAgICAgIGFjdGl2YXRpb25TbmlwcGV0ID0gYHZlYzQgYWN0aXZhdGlvbih2ZWM0IGEpIHtcbiAgICAgICAgICB2ZWM0IGIgPSBnZXRQcmVsdUFjdGl2YXRpb25XZWlnaHRzQXRPdXRDb29yZHMoKTtcbiAgICAgICAgICAke2FjdGl2YXRpb259XG4gICAgICAgIH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaGFzTGVha3lyZWx1QWN0aXZhdGlvbikge1xuICAgICAgICAgICAgICAgIGFjdGl2YXRpb25TbmlwcGV0ID0gYHZlYzQgYWN0aXZhdGlvbih2ZWM0IGEpIHtcbiAgICAgICAgICB2ZWM0IGIgPSBnZXRMZWFreXJlbHVBbHBoYUF0T3V0Q29vcmRzKCk7XG4gICAgICAgICAgJHthY3RpdmF0aW9ufVxuICAgICAgICB9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGFjdGl2YXRpb25TbmlwcGV0ID0gYHZlYzQgYWN0aXZhdGlvbih2ZWM0IHgpIHtcbiAgICAgICAgICAke2FjdGl2YXRpb259XG4gICAgICAgIH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXBwbHlBY3RpdmF0aW9uU25pcHBldCA9IGByZXN1bHQgPSBhY3RpdmF0aW9uKHJlc3VsdCk7YDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhZGRCaWFzU25pcHBldCA9IGFkZEJpYXMgPyAncmVzdWx0ICs9IGdldEJpYXNBdE91dENvb3JkcygpOycgOiAnJztcbiAgICAgICAgaWYgKGFkZEJpYXMpIHtcbiAgICAgICAgICAgIHRoaXMudmFyaWFibGVOYW1lcy5wdXNoKCdiaWFzJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc1ByZWx1QWN0aXZhdGlvbikge1xuICAgICAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzLnB1c2goJ3ByZWx1QWN0aXZhdGlvbldlaWdodHMnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzTGVha3lyZWx1QWN0aXZhdGlvbikge1xuICAgICAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzLnB1c2goJ2xlYWt5cmVsdUFscGhhJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGJhdGNoQVNuaXBwZXQgPSAncmMueCc7XG4gICAgICAgIGxldCBiYXRjaEJTbmlwcGV0ID0gJ3JjLngnO1xuICAgICAgICBpZiAoYVNoYXBlWzBdIDwgYlNoYXBlWzBdKSB7XG4gICAgICAgICAgICBiYXRjaEFTbmlwcGV0ID0gYGludChtaW4oZmxvYXQocmMueCksICR7YVNoYXBlWzBdIC0gMX0uKSlgO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGJTaGFwZVswXSA8IGFTaGFwZVswXSkge1xuICAgICAgICAgICAgYmF0Y2hCU25pcHBldCA9IGBpbnQobWluKGZsb2F0KHJjLngpLCAke2JTaGFwZVswXSAtIDF9LikpYDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgJHthY3RpdmF0aW9uU25pcHBldH1cblxuICAgICAgY29uc3QgZmxvYXQgc2hhcmVkRGltZW5zaW9uID0gJHtzaGFyZWREaW1lbnNpb25QYWNrZWR9LjA7XG5cbiAgICAgIHZlYzQgZG90MngyQVJvd0JDb2woaXZlYzMgcmMpIHtcbiAgICAgICAgdmVjNCByZXN1bHQgPSB2ZWM0KDApO1xuICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8ICR7c2hhcmVkRGltZW5zaW9uUGFja2VkfTsgaSsrKSB7XG4gICAgICAgICAgaW50IGJhdGNoQSA9ICR7YmF0Y2hBU25pcHBldH07XG4gICAgICAgICAgaW50IGJhdGNoQiA9ICR7YmF0Y2hCU25pcHBldH07XG4gICAgICAgICAgdmVjNCBhID0gZ2V0TWF0cml4QShiYXRjaEEsICR7YVNhbXBsZX0pO1xuICAgICAgICAgIHZlYzQgYiA9IGdldE1hdHJpeEIoYmF0Y2hCLCAke2JTYW1wbGV9KTtcblxuICAgICAgICAgIC8vIFRoZXNlIHN3aXp6bGVkIHByb2R1Y3RzIG5lZWQgdG8gYmUgc2VwYXJhdGVseSBhZGRlZC5cbiAgICAgICAgICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RmanMvaXNzdWVzLzE3MzVcbiAgICAgICAgICByZXN1bHQgKz0gKCR7YVN3aXp6bGVbMF19ICogJHtiU3dpenpsZVswXX0pO1xuICAgICAgICAgIHJlc3VsdCArPSAoJHthU3dpenpsZVsxXX0gKiAke2JTd2l6emxlWzFdfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMyByYyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICB2ZWM0IHJlc3VsdCA9IGRvdDJ4MkFSb3dCQ29sKHJjKTtcblxuICAgICAgICAke2FkZEJpYXNTbmlwcGV0fVxuXG4gICAgICAgICR7YXBwbHlBY3RpdmF0aW9uU25pcHBldH1cblxuICAgICAgICBzZXRPdXRwdXQocmVzdWx0KTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW11bG1hdF9wYWNrZWRfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmV4cG9ydCBjbGFzcyBNdWx0aW5vbWlhbFByb2dyYW0ge1xuICAgIGNvbnN0cnVjdG9yKGJhdGNoU2l6ZSwgbnVtT3V0Y29tZXMsIG51bVNhbXBsZXMpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWydwcm9icyddO1xuICAgICAgICB0aGlzLmN1c3RvbVVuaWZvcm1zID0gW3sgbmFtZTogJ3NlZWQnLCB0eXBlOiAnZmxvYXQnIH1dO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gW2JhdGNoU2l6ZSwgbnVtU2FtcGxlc107XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWMyIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHNbMF07XG5cbiAgICAgICAgZmxvYXQgciA9IHJhbmRvbShzZWVkKTtcbiAgICAgICAgZmxvYXQgY2RmID0gMC4wO1xuXG4gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgJHtudW1PdXRjb21lcyAtIDF9OyBpKyspIHtcbiAgICAgICAgICBjZGYgKz0gZ2V0UHJvYnMoYmF0Y2gsIGkpO1xuXG4gICAgICAgICAgaWYgKHIgPCBjZGYpIHtcbiAgICAgICAgICAgIHNldE91dHB1dChmbG9hdChpKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgbm8gb3RoZXIgZXZlbnQgaGFwcGVuZWQsIGxhc3QgZXZlbnQgaGFwcGVuZWQuXG4gICAgICAgIHNldE91dHB1dChmbG9hdCgke251bU91dGNvbWVzIC0gMX0pKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW11bHRpbm9taWFsX2dwdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5leHBvcnQgY2xhc3MgT25lSG90UHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IobnVtSW5kaWNlcywgZGVwdGgsIG9uVmFsdWUsIG9mZlZhbHVlKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsnaW5kaWNlcyddO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gW251bUluZGljZXMsIGRlcHRoXTtcbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzIgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBpbmRleCA9IHJvdW5kKGdldEluZGljZXMoY29vcmRzLngpKTtcbiAgICAgICAgc2V0T3V0cHV0KG1peChmbG9hdCgke29mZlZhbHVlfSksIGZsb2F0KCR7b25WYWx1ZX0pLFxuICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KGluZGV4ID09IGNvb3Jkcy55KSkpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b25laG90X2dwdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBnZXRDaGFubmVscyB9IGZyb20gJy4vcGFja2luZ191dGlsJztcbmltcG9ydCB7IGdldENvb3Jkc0RhdGFUeXBlIH0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuZXhwb3J0IGNsYXNzIFBhY2tQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3RvcihvdXRwdXRTaGFwZSkge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgICAgICAgdGhpcy5wYWNrZWRJbnB1dHMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wYWNrZWRPdXRwdXQgPSB0cnVlO1xuICAgICAgICAvLyBPbmx5IGlucHV0IC8gb3V0cHV0IDNEIHRlbnNvcnMuXG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICAgICAgY29uc3QgcmFuayA9IG91dHB1dFNoYXBlLmxlbmd0aDtcbiAgICAgICAgaWYgKHJhbmsgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgICBzZXRPdXRwdXQodmVjNChnZXRBKCksIDAuLCAwLiwgMC4pKTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGNoYW5uZWxzID0gZ2V0Q2hhbm5lbHMoJ3JjJywgcmFuayk7XG4gICAgICAgICAgICBjb25zdCBkdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHJhbmspO1xuICAgICAgICAgICAgY29uc3Qgb3V0T2ZCb3VuZHNDb25kaXRpb24gPSBnZXRPdXRPZkJvdW5kc0NvbmRpdGlvbihyYW5rLCBvdXRwdXRTaGFwZSwgY2hhbm5lbHMpO1xuICAgICAgICAgICAgY29uc3Qgc2V0dXAgPSBnZXRTZXR1cChyYW5rLCBvdXRwdXRTaGFwZVtvdXRwdXRTaGFwZS5sZW5ndGggLSAxXSwgb3V0cHV0U2hhcGVbb3V0cHV0U2hhcGUubGVuZ3RoIC0gMl0sIGNoYW5uZWxzKTtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dCA9IGdldE91dHB1dChvdXRwdXRTaGFwZSwgY2hhbm5lbHMpO1xuICAgICAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgICR7ZHR5cGV9IHJjID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG5cbiAgICAgICAgICBpZigke291dE9mQm91bmRzQ29uZGl0aW9ufSkge1xuICAgICAgICAgICAgc2V0T3V0cHV0KHZlYzQoMCkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAke3NldHVwfVxuXG4gICAgICAgICAgICBzZXRPdXRwdXQodmVjNCgke291dHB1dH0pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBnZXRTb3VyY2VDb29yZHNBcnIocmFuaywgZGltcykge1xuICAgIGNvbnN0IGNvb3JkcyA9IFtdO1xuICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8PSAxOyByb3crKykge1xuICAgICAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPD0gMTsgY29sKyspIHtcbiAgICAgICAgICAgIGxldCBjb29yZCA9IGAke3JvdyA9PT0gMCA/ICdyJyA6ICdycDEnfSwgJHtjb2wgPT09IDAgPyAnYycgOiAnY3AxJ31gO1xuICAgICAgICAgICAgZm9yIChsZXQgZCA9IDI7IGQgPCByYW5rOyBkKyspIHtcbiAgICAgICAgICAgICAgICBjb29yZCA9IGAke2RpbXNbZGltcy5sZW5ndGggLSAxIC0gZF19LGAgKyBjb29yZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvb3Jkcy5wdXNoKGNvb3JkKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29vcmRzO1xufVxuZnVuY3Rpb24gZ2V0T3V0T2ZCb3VuZHNDb25kaXRpb24ocmFuaywgc2hhcGUsIGRpbXMpIHtcbiAgICBpZiAocmFuayA9PT0gMSkge1xuICAgICAgICByZXR1cm4gYHJjID4gJHtzaGFwZVswXX1gO1xuICAgIH1cbiAgICBsZXQgY29uZCA9ICcnO1xuICAgIGZvciAobGV0IGkgPSByYW5rIC0gMjsgaSA8IHJhbms7IGkrKykge1xuICAgICAgICBjb25kICs9IGAke2RpbXNbaV19ID49ICR7c2hhcGVbaV19YDtcbiAgICAgICAgaWYgKGkgPCByYW5rIC0gMSkge1xuICAgICAgICAgICAgY29uZCArPSAnfHwnO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb25kO1xufVxuZnVuY3Rpb24gZ2V0U2V0dXAocmFuaywgY29scywgcm93cywgZGltcykge1xuICAgIGlmIChyYW5rID09PSAxKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgY29uc3QgaW5uZXJEaW1zID0gZGltcy5zbGljZSgtMik7XG4gICAgcmV0dXJuIGBcbiAgICBpbnQgciA9ICR7aW5uZXJEaW1zWzBdfTtcbiAgICBpbnQgYyA9ICR7aW5uZXJEaW1zWzFdfTtcbiAgICBpbnQgcnAxID0gciArIDE7XG4gICAgaW50IGNwMSA9IGMgKyAxO1xuXG4gICAgYm9vbCBjRWRnZSA9IGNwMSA+PSAke2NvbHN9O1xuICAgIGJvb2wgckVkZ2UgPSBycDEgPj0gJHtyb3dzfTtcbiAgYDtcbn1cbmZ1bmN0aW9uIGdldE91dHB1dChzaGFwZSwgZGltcykge1xuICAgIGNvbnN0IHJhbmsgPSBzaGFwZS5sZW5ndGg7XG4gICAgY29uc3Qgc291cmNlQ29vcmRzID0gZ2V0U291cmNlQ29vcmRzQXJyKHJhbmssIGRpbXMpO1xuICAgIGlmIChyYW5rID09PSAxKSB7XG4gICAgICAgIHJldHVybiBgZ2V0QShyYyksXG4gICAgICAgICAgICByYyArIDEgPj0gJHtzaGFwZVswXX0gPyAwLiA6IGdldEEocmMgKyAxKSxcbiAgICAgICAgICAgIDAsIDBgO1xuICAgIH1cbiAgICByZXR1cm4gYGdldEEoJHtzb3VyY2VDb29yZHNbMF19KSxcbiAgICAgICAgICBjRWRnZSA/IDAuIDogZ2V0QSgke3NvdXJjZUNvb3Jkc1sxXX0pLFxuICAgICAgICAgIHJFZGdlID8gMC4gOiBnZXRBKCR7c291cmNlQ29vcmRzWzJdfSksXG4gICAgICAgICAgckVkZ2UgfHwgY0VkZ2UgPyAwLiA6IGdldEEoJHtzb3VyY2VDb29yZHNbM119KWA7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYWNrX2dwdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmVjQ2hhbm5lbHMobmFtZSwgcmFuaykge1xuICAgIHJldHVybiBbJ3gnLCAneScsICd6JywgJ3cnLCAndScsICd2J10uc2xpY2UoMCwgcmFuaykubWFwKGQgPT4gYCR7bmFtZX0uJHtkfWApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldENoYW5uZWxzKG5hbWUsIHJhbmspIHtcbiAgICBpZiAocmFuayA9PT0gMSkge1xuICAgICAgICByZXR1cm4gW25hbWVdO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0VmVjQ2hhbm5lbHMobmFtZSwgcmFuayk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0U291cmNlQ29vcmRzKHJhbmssIGRpbXMpIHtcbiAgICBpZiAocmFuayA9PT0gMSkge1xuICAgICAgICByZXR1cm4gJ3JjJztcbiAgICB9XG4gICAgbGV0IGNvb3JkcyA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuazsgaSsrKSB7XG4gICAgICAgIGNvb3JkcyArPSBkaW1zW2ldO1xuICAgICAgICBpZiAoaSA8IHJhbmsgLSAxKSB7XG4gICAgICAgICAgICBjb29yZHMgKz0gJywnO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb29yZHM7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYWNraW5nX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZ2V0Q29vcmRzRGF0YVR5cGUgfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5leHBvcnQgY2xhc3MgUGFkUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoeFNoYXBlLCBwYWRkaW5ncywgY29uc3RhbnRWYWx1ZSkge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgICAgICAgdGhpcy5jdXN0b21Vbmlmb3JtcyA9IFt7IG5hbWU6ICd2YWx1ZScsIHR5cGU6ICdmbG9hdCcgfV07XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBwYWRkaW5ncy5tYXAoKHAsIGkpID0+IHBbMF0gLyogYmVmb3JlUGFkICovICsgeFNoYXBlW2ldICsgcFsxXSAvKiBhZnRlclBhZCAqLyk7XG4gICAgICAgIGNvbnN0IHJhbmsgPSB4U2hhcGUubGVuZ3RoO1xuICAgICAgICBjb25zdCB0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUocmFuayk7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gcGFkZGluZ3MubWFwKHAgPT4gcFswXSkuam9pbignLCcpO1xuICAgICAgICBjb25zdCBlbmQgPSBwYWRkaW5ncy5tYXAoKHAsIGkpID0+IHBbMF0gKyB4U2hhcGVbaV0pLmpvaW4oJywnKTtcbiAgICAgICAgY29uc3QgdW5wYWNrZWRDb29yZHMgPSBbJ2Nvb3Jkc1swXScsICdjb29yZHNbMV0nLCAnY29vcmRzWzJdJywgJ2Nvb3Jkc1szXSddLnNsaWNlKDAsIHJhbmspO1xuICAgICAgICBpZiAocmFuayA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICAgaW50IHN0YXJ0ID0gJHtzdGFydH07XG4gICAgICAgIGludCBlbmQgPSAke2VuZH07XG5cbiAgICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgIGludCBvdXRDID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgICAgaWYgKG91dEMgPCBzdGFydCB8fCBvdXRDID49IGVuZCkge1xuICAgICAgICAgICAgc2V0T3V0cHV0KHZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2V0T3V0cHV0KGdldFgob3V0QyAtIHN0YXJ0KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBgO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAke3R5cGV9IHN0YXJ0ID0gJHt0eXBlfSgke3N0YXJ0fSk7XG4gICAgICAke3R5cGV9IGVuZCA9ICR7dHlwZX0oJHtlbmR9KTtcblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke3R5cGV9IG91dEMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaWYgKGFueShsZXNzVGhhbihvdXRDLCBzdGFydCkpIHx8IGFueShncmVhdGVyVGhhbkVxdWFsKG91dEMsIGVuZCkpKSB7XG4gICAgICAgICAgc2V0T3V0cHV0KHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAke3R5cGV9IGNvb3JkcyA9IG91dEMgLSBzdGFydDtcbiAgICAgICAgICBzZXRPdXRwdXQoZ2V0WCgke3VucGFja2VkQ29vcmRzfSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYWRfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGdldENoYW5uZWxzIH0gZnJvbSAnLi9wYWNraW5nX3V0aWwnO1xuaW1wb3J0IHsgZ2V0Q29vcmRzRGF0YVR5cGUgfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5leHBvcnQgY2xhc3MgUGFkUGFja2VkUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoeFNoYXBlLCBwYWRkaW5ncywgY29uc3RhbnRWYWx1ZSkge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgICAgICAgdGhpcy5wYWNrZWRJbnB1dHMgPSB0cnVlO1xuICAgICAgICB0aGlzLnBhY2tlZE91dHB1dCA9IHRydWU7XG4gICAgICAgIHRoaXMuY3VzdG9tVW5pZm9ybXMgPSBbeyBuYW1lOiAndmFsdWUnLCB0eXBlOiAnZmxvYXQnIH1dO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gcGFkZGluZ3MubWFwKChwLCBpKSA9PiBwWzBdIC8qIGJlZm9yZVBhZCAqLyArIHhTaGFwZVtpXSArIHBbMV0gLyogYWZ0ZXJQYWQgKi8pO1xuICAgICAgICBjb25zdCByYW5rID0geFNoYXBlLmxlbmd0aDtcbiAgICAgICAgY29uc3QgZHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShyYW5rKTtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBwYWRkaW5ncy5tYXAocCA9PiBwWzBdKS5qb2luKCcsJyk7XG4gICAgICAgIGNvbnN0IGVuZCA9IHBhZGRpbmdzLm1hcCgocCwgaSkgPT4gcFswXSArIHhTaGFwZVtpXSkuam9pbignLCcpO1xuICAgICAgICBjb25zdCBjb29yZHMgPSBnZXRDaGFubmVscygncmMnLCByYW5rKTtcbiAgICAgICAgY29uc3Qgc291cmNlID0gZ2V0Q2hhbm5lbHMoJ3NvdXJjZScsIHJhbmspO1xuICAgICAgICBjb25zdCBjTGltaXQgPSBgJHtjb29yZHNbcmFuayAtIDFdfSA8ICR7dGhpcy5vdXRwdXRTaGFwZVtyYW5rIC0gMV19YDtcbiAgICAgICAgY29uc3QgaW5uZXJEaW1zID0gcmFuayA9PT0gMSA/ICdzb3VyY2UnIDogYHZlYzIoJHtzb3VyY2Uuc2xpY2UoLTIpLmpvaW4oKX0pYDtcbiAgICAgICAgY29uc3QgY29tcG9uZW50U2V0dXAgPSBbXG4gICAgICAgICAgICBgJHtkdHlwZX0gcmMgPSBvdXRwdXRMb2M7YCwgYCR7Y29vcmRzW3JhbmsgLSAxXX0gKz0gMTtcbiAgICAgICBpZigke2NMaW1pdH0pIHtcbiAgICAgIGAsXG4gICAgICAgICAgICByYW5rID09PSAxID8gJycgOiBgfVxuICAgICAgIHJjID0gb3V0cHV0TG9jO1xuICAgICAgICR7Y29vcmRzW3JhbmsgLSAyXX0gKz0gMTtcbiAgICAgICBpZigke2Nvb3Jkc1tyYW5rIC0gMl19IDwgJHt0aGlzLm91dHB1dFNoYXBlW3JhbmsgLSAyXX0pIHtgLFxuICAgICAgICAgICAgcmFuayA9PT0gMSA/ICcnIDogYCAgJHtjb29yZHNbcmFuayAtIDFdfSArPSAxO1xuICAgICAgICAgaWYoJHtjTGltaXR9KSB7YFxuICAgICAgICBdO1xuICAgICAgICBjb25zdCBwYWRkaW5nQXJlYSA9IHJhbmsgPT09IDEgP1xuICAgICAgICAgICAgJ3JjIDwgc3RhcnQgfHwgcmMgPj0gZW5kJyA6XG4gICAgICAgICAgICAnYW55KGxlc3NUaGFuKHJjLCBzdGFydCkpIHx8IGFueShncmVhdGVyVGhhbkVxdWFsKHJjLCBlbmQpKSc7XG4gICAgICAgIGxldCBtYWluTG9vcCA9ICcnO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgaiA9IHJhbmsgPT09IDEgPyAyIDogNDsgaSA8IGo7IGkrKykge1xuICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAke2NvbXBvbmVudFNldHVwW2ldfVxuICAgICAgICBpZiAoJHtwYWRkaW5nQXJlYX0pIHtcbiAgICAgICAgICByZXN1bHRbJHtpfV0gPSBmbG9hdCh2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgJHtkdHlwZX0gc291cmNlID0gcmMgLSBzdGFydDtcbiAgICAgICAgICByZXN1bHRbJHtpfV0gPSBnZXRDaGFubmVsKGdldFgoJHtzb3VyY2Uuam9pbigpfSksICR7aW5uZXJEaW1zfSk7XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgICAgIH1cbiAgICAgICAgbWFpbkxvb3AgKz0gKHJhbmsgPT09IDEgPyBgfSBgIDogYH19YCk7XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCAke2R0eXBlfSBzdGFydCA9ICR7ZHR5cGV9KCR7c3RhcnR9KTtcbiAgICAgIGNvbnN0ICR7ZHR5cGV9IGVuZCA9ICR7ZHR5cGV9KCR7ZW5kfSk7XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgJHtkdHlwZX0gb3V0cHV0TG9jID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIHZlYzQgcmVzdWx0ID0gdmVjNCgwLik7XG4gICAgICAgICR7bWFpbkxvb3B9XG4gICAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGFkX3BhY2tlZF9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuZXhwb3J0IGNsYXNzIFBvb2wyRFByb2dyYW0ge1xuICAgIGNvbnN0cnVjdG9yKGNvbnZJbmZvLCBwb29sVHlwZSwgY29tcHV0ZVBvc2l0aW9ucywgZmxhdHRlblBvc2l0aW9ucyA9IGZhbHNlLCBpbmNsdWRlQmF0Y2hJbkluZGV4ID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWyd4J107XG4gICAgICAgIGlmIChwb29sVHlwZSA9PT0gJ2F2ZycgJiYgY29tcHV0ZVBvc2l0aW9ucykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29tcHV0ZSBwb3NpdGlvbnMgZm9yIGF2ZXJhZ2UgcG9vbC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmZpbHRlcldpZHRoO1xuICAgICAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgICAgIGNvbnN0IGRpbGF0aW9uSGVpZ2h0ID0gY29udkluZm8uZGlsYXRpb25IZWlnaHQ7XG4gICAgICAgIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICAgICAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJIZWlnaHQ7XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlcldpZHRoID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVyV2lkdGg7XG4gICAgICAgIGNvbnN0IHBhZFRvcCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgICAgICBjb25zdCBwYWRMZWZ0ID0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gY29udkluZm8ub3V0U2hhcGU7XG4gICAgICAgIGNvbnN0IGlzQXZnUG9vbCA9IHBvb2xUeXBlID09PSAnYXZnJztcbiAgICAgICAgY29uc3QgYmF0Y2hGbGF0dGVuUG9zaXRpb25TdHIgPSBgKChiYXRjaCAgKiAke2NvbnZJbmZvLmluSGVpZ2h0fSArIHhSKSAqICR7Y29udkluZm8uaW5XaWR0aH0gKyB4QykgKiAke2NvbnZJbmZvLmluQ2hhbm5lbHN9ICsgZGA7XG4gICAgICAgIGNvbnN0IGZsYXR0ZW5Qb3NpdGlvblN0ciA9IGAoeFIgKiAke2NvbnZJbmZvLmluV2lkdGh9ICsgeEMpICogJHtjb252SW5mby5pbkNoYW5uZWxzfSArIGRgO1xuICAgICAgICBsZXQgaW5pdGlhbGl6YXRpb25WYWx1ZSA9ICcwLjAnO1xuICAgICAgICBpZiAoIWlzQXZnUG9vbCkge1xuICAgICAgICAgICAgLy8gV2ViR0wgb24gRmlyZWZveCBMaW51eCBjYW4ndCBjb21waWxlIDEvMCBzbyB3ZSBkbyAxL2Vwcy5cbiAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUgPSAnLTEuMCAvIDFlLTIwJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tcHV0ZVBvc2l0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgY29tcGFyZU9wID0gJz49JztcbiAgICAgICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAgIGNvbnN0IGl2ZWMyIHN0cmlkZXMgPSBpdmVjMigke3N0cmlkZUhlaWdodH0sICR7c3RyaWRlV2lkdGh9KTtcbiAgICAgICAgY29uc3QgaXZlYzIgcGFkcyA9IGl2ZWMyKCR7cGFkVG9wfSwgJHtwYWRMZWZ0fSk7XG5cbiAgICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgIGludCBiYXRjaCA9IGNvb3Jkc1swXTtcbiAgICAgICAgICBpbnQgZCA9IGNvb3Jkc1szXTtcblxuICAgICAgICAgIGl2ZWMyIHhSQ0Nvcm5lciA9IGNvb3Jkcy55eiAqIHN0cmlkZXMgLSBwYWRzO1xuICAgICAgICAgIGludCB4UkNvcm5lciA9IHhSQ0Nvcm5lci54O1xuICAgICAgICAgIGludCB4Q0Nvcm5lciA9IHhSQ0Nvcm5lci55O1xuXG4gICAgICAgICAgLy8gbWF4L21pbiB4KD8sID8sIGQpIHRvIGdldCB5KHlSLCB5QywgZCkuXG4gICAgICAgICAgLy8gPyA9IHRvIGJlIGRldGVybWluZWRcbiAgICAgICAgICBmbG9hdCBtaW5NYXhWYWx1ZSA9IDAuMDtcbiAgICAgICAgICBmbG9hdCBtaW5NYXhWYWx1ZUZvdW5kID0gMC4wO1xuICAgICAgICAgIGludCBtaW5NYXhQb3NpdGlvbiA9IDA7XG4gICAgICAgICAgZmxvYXQgYXZnVmFsdWUgPSAwLjA7XG5cbiAgICAgICAgICBmb3IgKGludCB3UiA9IDA7IHdSIDwgJHtlZmZlY3RpdmVGaWx0ZXJIZWlnaHR9O1xuICAgICAgICAgICAgICB3UiArPSAke2RpbGF0aW9uSGVpZ2h0fSkge1xuICAgICAgICAgICAgaW50IHhSID0geFJDb3JuZXIgKyB3UjtcblxuICAgICAgICAgICAgaWYgKHhSIDwgMCB8fCB4UiA+PSAke2NvbnZJbmZvLmluSGVpZ2h0fSkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChpbnQgd0MgPSAwOyB3QyA8ICR7ZWZmZWN0aXZlRmlsdGVyV2lkdGh9O1xuICAgICAgICAgICAgICAgIHdDICs9ICR7ZGlsYXRpb25XaWR0aH0pIHtcbiAgICAgICAgICAgICAgaW50IHhDID0geENDb3JuZXIgKyB3QztcblxuICAgICAgICAgICAgICBpZiAoeEMgPCAwIHx8IHhDID49ICR7Y29udkluZm8uaW5XaWR0aH0pIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGZsb2F0IHZhbHVlID0gZ2V0WChiYXRjaCwgeFIsIHhDLCBkKTtcblxuICAgICAgICAgICAgICAvLyBJZiBhIG1pbiAvIG1heCB2YWx1ZSBoYXMgYWxyZWFkeSBiZWVuIGZvdW5kLCB1c2UgaXQuIElmIG5vdCxcbiAgICAgICAgICAgICAgLy8gdXNlIHRoZSBjdXJyZW50IHZhbHVlLlxuICAgICAgICAgICAgICBmbG9hdCBjdXJyTWluTWF4VmFsdWUgPSBtaXgoXG4gICAgICAgICAgICAgICAgICB2YWx1ZSwgbWluTWF4VmFsdWUsIG1pbk1heFZhbHVlRm91bmQpO1xuICAgICAgICAgICAgICBpZiAodmFsdWUgJHtjb21wYXJlT3B9IGN1cnJNaW5NYXhWYWx1ZSkge1xuICAgICAgICAgICAgICAgIG1pbk1heFZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgbWluTWF4VmFsdWVGb3VuZCA9IDEuMDtcbiAgICAgICAgICAgICAgICBtaW5NYXhQb3NpdGlvbiA9ICR7ZmxhdHRlblBvc2l0aW9ucyA/IChpbmNsdWRlQmF0Y2hJbkluZGV4ID8gYmF0Y2hGbGF0dGVuUG9zaXRpb25TdHIgOlxuICAgICAgICAgICAgICAgIGZsYXR0ZW5Qb3NpdGlvblN0cikgOlxuICAgICAgICAgICAgICAgIGB3UiAqICR7ZWZmZWN0aXZlRmlsdGVyV2lkdGh9ICsgd0NgfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBzZXRPdXRwdXQoZmxvYXQobWluTWF4UG9zaXRpb24pKTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb21wYXJlT3AgPSAnbWF4JztcbiAgICAgICAgbGV0IHJldHVyblZhbHVlID0gYCR7cG9vbFR5cGV9KCR7cG9vbFR5cGV9KCR7cG9vbFR5cGV9KGAgK1xuICAgICAgICAgICAgJ21pbk1heFZhbHVlWzBdLCBtaW5NYXhWYWx1ZVsxXSksIG1pbk1heFZhbHVlWzJdKSwgbWluTWF4VmFsdWVbM10pJztcbiAgICAgICAgaWYgKHBvb2xUeXBlID09PSAnYXZnJykge1xuICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBgYXZnVmFsdWUgLyBjb3VudGA7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmlsdGVyV2lkdGhOZWFyZXN0VmVjNCA9IE1hdGguZmxvb3IoZmlsdGVyV2lkdGggLyA0KSAqIDQ7XG4gICAgICAgIGNvbnN0IGZpbHRlcldpZHRoVmVjNFJlbWFpbmRlciA9IGZpbHRlcldpZHRoICUgNDtcbiAgICAgICAgY29uc3QgdXBkYXRlU25pcHBldCA9IGBcbiAgICAgIGlmICgke2lzQXZnUG9vbH0pIHtcbiAgICAgICAgYXZnVmFsdWUgKz0gZG90KHZhbHVlcywgb25lcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtaW5NYXhWYWx1ZSA9ICR7Y29tcGFyZU9wfSh2YWx1ZXMsIG1pbk1heFZhbHVlKTtcbiAgICAgIH1cbiAgICBgO1xuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgY29uc3QgaXZlYzIgc3RyaWRlcyA9IGl2ZWMyKCR7c3RyaWRlSGVpZ2h0fSwgJHtzdHJpZGVXaWR0aH0pO1xuICAgICAgY29uc3QgaXZlYzIgcGFkcyA9IGl2ZWMyKCR7cGFkVG9wfSwgJHtwYWRMZWZ0fSk7XG4gICAgICBjb25zdCBmbG9hdCBpbml0aWFsaXphdGlvblZhbHVlID0gJHtpbml0aWFsaXphdGlvblZhbHVlfTtcbiAgICAgIGNvbnN0IHZlYzQgb25lcyA9IHZlYzQoMS4wLCAxLjAsIDEuMCwgMS4wKTtcblxuICAgICAgZmxvYXQgY291bnQgPSAwLjA7XG5cbiAgICAgIGZsb2F0IGdldFZhbHVlKGludCBiYXRjaCwgaW50IHhSLCBpbnQgeEMsIGludCBkKSB7XG4gICAgICAgIGlmICh4QyA8IDAgfHwgeEMgPj0gJHtjb252SW5mby5pbldpZHRofSkge1xuICAgICAgICAgIHJldHVybiBpbml0aWFsaXphdGlvblZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGNvdW50ICs9IDEuMDtcbiAgICAgICAgcmV0dXJuIGdldFgoYmF0Y2gsIHhSLCB4QywgZCk7XG4gICAgICB9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiYXRjaCA9IGNvb3Jkc1swXTtcbiAgICAgICAgaW50IGQgPSBjb29yZHNbM107XG5cbiAgICAgICAgaXZlYzIgeFJDQ29ybmVyID0gY29vcmRzLnl6ICogc3RyaWRlcyAtIHBhZHM7XG4gICAgICAgIGludCB4UkNvcm5lciA9IHhSQ0Nvcm5lci54O1xuICAgICAgICBpbnQgeENDb3JuZXIgPSB4UkNDb3JuZXIueTtcblxuICAgICAgICAvLyBtYXgvbWluIHgoPywgPywgZCkgdG8gZ2V0IHkoeVIsIHlDLCBkKS5cbiAgICAgICAgLy8gPyA9IHRvIGJlIGRldGVybWluZWRcbiAgICAgICAgdmVjNCBtaW5NYXhWYWx1ZSA9IHZlYzQoJHtpbml0aWFsaXphdGlvblZhbHVlfSk7XG4gICAgICAgIGZsb2F0IGF2Z1ZhbHVlID0gMC4wO1xuICAgICAgICBjb3VudCA9IDAuMDtcblxuICAgICAgICBmb3IgKGludCB3UiA9IDA7IHdSIDwgJHtlZmZlY3RpdmVGaWx0ZXJIZWlnaHR9O1xuICAgICAgICAgICAgd1IgKz0gJHtkaWxhdGlvbkhlaWdodH0pIHtcbiAgICAgICAgICBpbnQgeFIgPSB4UkNvcm5lciArIHdSO1xuXG4gICAgICAgICAgaWYgKHhSIDwgMCB8fCB4UiA+PSAke2NvbnZJbmZvLmluSGVpZ2h0fSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yIChpbnQgd0MgPSAwOyB3QyA8ICR7ZmlsdGVyV2lkdGhOZWFyZXN0VmVjNH07IHdDICs9IDQpIHtcbiAgICAgICAgICAgIGludCB4QyA9IHhDQ29ybmVyICsgd0MgKiAke2RpbGF0aW9uV2lkdGh9O1xuXG4gICAgICAgICAgICB2ZWM0IHZhbHVlcyA9IHZlYzQoXG4gICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4UiwgeEMsIGQpLFxuICAgICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgeFIsIHhDICsgJHtkaWxhdGlvbldpZHRofSwgZCksXG4gICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4UiwgeEMgKyAyICogJHtkaWxhdGlvbldpZHRofSwgZCksXG4gICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4UiwgeEMgKyAzICogJHtkaWxhdGlvbldpZHRofSwgZClcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpbnQgeEMgPSB4Q0Nvcm5lciArICR7ZmlsdGVyV2lkdGhOZWFyZXN0VmVjNH07XG4gICAgICAgICAgaWYgKCR7ZmlsdGVyV2lkdGhWZWM0UmVtYWluZGVyID09PSAxfSkge1xuICAgICAgICAgICAgdmVjNCB2YWx1ZXMgPSB2ZWM0KFxuICAgICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgeFIsIHhDLCBkKSxcbiAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZSxcbiAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZSxcbiAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgJHt1cGRhdGVTbmlwcGV0fVxuICAgICAgICAgIH0gZWxzZSBpZiAoJHtmaWx0ZXJXaWR0aFZlYzRSZW1haW5kZXIgPT09IDJ9KSB7XG4gICAgICAgICAgICB2ZWM0IHZhbHVlcyA9IHZlYzQoXG4gICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4UiwgeEMsIGQpLFxuICAgICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgeFIsIHhDICsgJHtkaWxhdGlvbldpZHRofSwgZCksXG4gICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUsXG4gICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWVcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgICB9IGVsc2UgaWYgKCR7ZmlsdGVyV2lkdGhWZWM0UmVtYWluZGVyID09PSAzfSkge1xuICAgICAgICAgICAgdmVjNCB2YWx1ZXMgPSB2ZWM0KFxuICAgICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgeFIsIHhDLCBkKSxcbiAgICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIHhSLCB4QyArICR7ZGlsYXRpb25XaWR0aH0sIGQpLFxuICAgICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgeFIsIHhDICsgMiAqICR7ZGlsYXRpb25XaWR0aH0sIGQpLFxuICAgICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAke3VwZGF0ZVNuaXBwZXR9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNldE91dHB1dCgke3JldHVyblZhbHVlfSk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgUG9vbDNEUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoY29udkluZm8sIHBvb2xUeXBlLCBjb21wdXRlUG9zaXRpb25zLCBmbGF0dGVuUG9zaXRpb25zID0gZmFsc2UsIGluY2x1ZGVCYXRjaEluSW5kZXggPSBmYWxzZSkge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgICAgICAgaWYgKHBvb2xUeXBlID09PSAnYXZnJyAmJiBjb21wdXRlUG9zaXRpb25zKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjb21wdXRlIHBvc2l0aW9ucyBmb3IgYXZlcmFnZSBwb29sLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG4gICAgICAgIGNvbnN0IHN0cmlkZURlcHRoID0gY29udkluZm8uc3RyaWRlRGVwdGg7XG4gICAgICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICAgICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICAgICAgY29uc3QgZGlsYXRpb25EZXB0aCA9IGNvbnZJbmZvLmRpbGF0aW9uRGVwdGg7XG4gICAgICAgIGNvbnN0IGRpbGF0aW9uSGVpZ2h0ID0gY29udkluZm8uZGlsYXRpb25IZWlnaHQ7XG4gICAgICAgIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICAgICAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJEZXB0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckRlcHRoO1xuICAgICAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJIZWlnaHQ7XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlcldpZHRoID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVyV2lkdGg7XG4gICAgICAgIGNvbnN0IHBhZEZyb250ID0gY29udkluZm8ucGFkSW5mby5mcm9udDtcbiAgICAgICAgY29uc3QgcGFkVG9wID0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgICAgIGNvbnN0IHBhZExlZnQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5vdXRTaGFwZTtcbiAgICAgICAgY29uc3QgaXNBdmdQb29sID0gcG9vbFR5cGUgPT09ICdhdmcnO1xuICAgICAgICBsZXQgaW5pdGlhbGl6YXRpb25WYWx1ZSA9ICcwLjAnO1xuICAgICAgICBpZiAoIWlzQXZnUG9vbCkge1xuICAgICAgICAgICAgLy8gV2ViR0wgb24gRmlyZWZveCBMaW51eCBjYW4ndCBjb21waWxlIDEvMCBzbyB3ZSBkbyAxL2Vwcy5cbiAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUgPSAnLTEuMCAvIDFlLTIwJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tcHV0ZVBvc2l0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgY29tcGFyZU9wID0gJz49JztcbiAgICAgICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAgIGNvbnN0IGl2ZWMzIHN0cmlkZXMgPVxuICAgICAgICAgICAgaXZlYzMoJHtzdHJpZGVEZXB0aH0sICR7c3RyaWRlSGVpZ2h0fSwgJHtzdHJpZGVXaWR0aH0pO1xuICAgICAgICBjb25zdCBpdmVjMyBwYWRzID0gaXZlYzMoJHtwYWRGcm9udH0sICR7cGFkVG9wfSwgJHtwYWRMZWZ0fSk7XG5cbiAgICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgIGl2ZWM1IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgIGludCBiYXRjaCA9IGNvb3Jkcy54O1xuICAgICAgICAgIGludCBjaCA9IGNvb3Jkcy51O1xuXG4gICAgICAgICAgaXZlYzMgeENvcm5lciA9IGl2ZWMzKGNvb3Jkcy55LCBjb29yZHMueiwgY29vcmRzLncpICogc3RyaWRlcyAtIHBhZHM7XG4gICAgICAgICAgaW50IHhEQ29ybmVyID0geENvcm5lci54O1xuICAgICAgICAgIGludCB4UkNvcm5lciA9IHhDb3JuZXIueTtcbiAgICAgICAgICBpbnQgeENDb3JuZXIgPSB4Q29ybmVyLno7XG5cbiAgICAgICAgICAvLyBtYXgvbWluIHgoPywgPywgPywgY2gpIHRvIGdldCB5KHlELCB5UiwgeUMsIGNoKS5cbiAgICAgICAgICAvLyA/ID0gdG8gYmUgZGV0ZXJtaW5lZFxuICAgICAgICAgIGZsb2F0IG1pbk1heFZhbHVlID0gMC4wO1xuICAgICAgICAgIGZsb2F0IG1pbk1heFZhbHVlRm91bmQgPSAwLjA7XG4gICAgICAgICAgaW50IG1pbk1heFBvc2l0aW9uID0gMDtcblxuICAgICAgICAgIGZvciAoaW50IHdEID0gMDsgd0QgPCAke2VmZmVjdGl2ZUZpbHRlckRlcHRofTtcbiAgICAgICAgICAgICAgd0QgKz0gJHtkaWxhdGlvbkRlcHRofSkge1xuICAgICAgICAgICAgaW50IHhEID0geERDb3JuZXIgKyB3RDtcblxuICAgICAgICAgICAgaWYgKHhEIDwgMCB8fCB4RCA+PSAke2NvbnZJbmZvLmluRGVwdGh9KSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGludCB3UiA9IDA7IHdSIDwgJHtlZmZlY3RpdmVGaWx0ZXJIZWlnaHR9O1xuICAgICAgICAgICAgICAgIHdSICs9ICR7ZGlsYXRpb25IZWlnaHR9KSB7XG4gICAgICAgICAgICAgIGludCB4UiA9IHhSQ29ybmVyICsgd1I7XG5cbiAgICAgICAgICAgICAgaWYgKHhSIDwgMCB8fCB4UiA+PSAke2NvbnZJbmZvLmluSGVpZ2h0fSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZm9yIChpbnQgd0MgPSAwOyB3QyA8ICR7ZWZmZWN0aXZlRmlsdGVyV2lkdGh9O1xuICAgICAgICAgICAgICAgICAgd0MgKz0gJHtkaWxhdGlvbldpZHRofSkge1xuICAgICAgICAgICAgICAgIGludCB4QyA9IHhDQ29ybmVyICsgd0M7XG5cbiAgICAgICAgICAgICAgICBpZiAoeEMgPCAwIHx8IHhDID49ICR7Y29udkluZm8uaW5XaWR0aH0pIHtcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZsb2F0IHZhbHVlID0gZ2V0WChiYXRjaCwgeEQsIHhSLCB4QywgY2gpO1xuXG4gICAgICAgICAgICAgICAgLy8gSWYgYSBtaW4gLyBtYXggdmFsdWUgaGFzIGFscmVhZHkgYmVlbiBmb3VuZCwgdXNlIGl0LiBJZiBub3QsXG4gICAgICAgICAgICAgICAgLy8gdXNlIHRoZSBjdXJyZW50IHZhbHVlLlxuICAgICAgICAgICAgICAgIGZsb2F0IGN1cnJNaW5NYXhWYWx1ZSA9IG1peChcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsIG1pbk1heFZhbHVlLCBtaW5NYXhWYWx1ZUZvdW5kKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgJHtjb21wYXJlT3B9IGN1cnJNaW5NYXhWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgbWluTWF4VmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgIG1pbk1heFZhbHVlRm91bmQgPSAxLjA7XG4gICAgICAgICAgICAgICAgICBtaW5NYXhQb3NpdGlvbiA9ICR7ZmxhdHRlblBvc2l0aW9ucyA/XG4gICAgICAgICAgICAgICAgKGluY2x1ZGVCYXRjaEluSW5kZXggP1xuICAgICAgICAgICAgICAgICAgICBgKCgoYmF0Y2ggKiAke2NvbnZJbmZvLmluRGVwdGh9ICsgeEQpICogJHtjb252SW5mby5pbkhlaWdodH0gKyB4UikgKiAke2NvbnZJbmZvLmluV2lkdGh9ICsgeEMpICogJHtjb252SW5mby5pbkNoYW5uZWxzfSArIGNoYCA6XG4gICAgICAgICAgICAgICAgICAgIGAoKHhEICogJHtjb252SW5mby5pbkhlaWdodH0gKyB4UikgKiAke2NvbnZJbmZvLmluV2lkdGh9ICsgeEMpICogJHtjb252SW5mby5pbkNoYW5uZWxzfSArIGNoYCkgOlxuICAgICAgICAgICAgICAgIGB3RCAqICR7ZWZmZWN0aXZlRmlsdGVySGVpZ2h0fSAqICR7ZWZmZWN0aXZlRmlsdGVyV2lkdGh9ICtcbiAgICAgICAgICAgICAgICAgICAgICB3UiAqICR7ZWZmZWN0aXZlRmlsdGVyV2lkdGh9ICsgd0NgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgc2V0T3V0cHV0KGZsb2F0KG1pbk1heFBvc2l0aW9uKSk7XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tcGFyZU9wID0gJ21heCc7XG4gICAgICAgIGxldCByZXR1cm5WYWx1ZSA9IGAke3Bvb2xUeXBlfSgke3Bvb2xUeXBlfSgke3Bvb2xUeXBlfShgICtcbiAgICAgICAgICAgICdtaW5NYXhWYWx1ZVswXSwgbWluTWF4VmFsdWVbMV0pLCBtaW5NYXhWYWx1ZVsyXSksIG1pbk1heFZhbHVlWzNdKSc7XG4gICAgICAgIGlmIChwb29sVHlwZSA9PT0gJ2F2ZycpIHtcbiAgICAgICAgICAgIHJldHVyblZhbHVlID0gYGF2Z1ZhbHVlIC8gY291bnRgO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpbHRlcldpZHRoTmVhcmVzdFZlYzQgPSBNYXRoLmZsb29yKGZpbHRlcldpZHRoIC8gNCkgKiA0O1xuICAgICAgICBjb25zdCBmaWx0ZXJXaWR0aFZlYzRSZW1haW5kZXIgPSBmaWx0ZXJXaWR0aCAlIDQ7XG4gICAgICAgIGNvbnN0IHVwZGF0ZVNuaXBwZXQgPSBgXG4gICAgICBpZiAoJHtpc0F2Z1Bvb2x9KSB7XG4gICAgICAgIGF2Z1ZhbHVlICs9IGRvdCh2YWx1ZXMsIG9uZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWluTWF4VmFsdWUgPSAke2NvbXBhcmVPcH0odmFsdWVzLCBtaW5NYXhWYWx1ZSk7XG4gICAgICB9XG4gICAgYDtcbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IGl2ZWMzIHN0cmlkZXMgPVxuICAgICAgICBpdmVjMygke3N0cmlkZURlcHRofSwgJHtzdHJpZGVIZWlnaHR9LCAke3N0cmlkZVdpZHRofSk7XG4gICAgICBjb25zdCBpdmVjMyBwYWRzID0gaXZlYzMoJHtwYWRGcm9udH0sICR7cGFkVG9wfSwgJHtwYWRMZWZ0fSk7XG4gICAgICBjb25zdCBmbG9hdCBpbml0aWFsaXphdGlvblZhbHVlID0gJHtpbml0aWFsaXphdGlvblZhbHVlfTtcbiAgICAgIGNvbnN0IHZlYzQgb25lcyA9IHZlYzQoMS4wLCAxLjAsIDEuMCwgMS4wKTtcblxuICAgICAgZmxvYXQgY291bnQgPSAwLjA7XG5cbiAgICAgIGZsb2F0IGdldFZhbHVlKGludCBiYXRjaCwgaW50IHhELCBpbnQgeFIsIGludCB4QywgaW50IGNoKSB7XG4gICAgICAgIGlmICh4QyA8IDAgfHwgeEMgPj0gJHtjb252SW5mby5pbldpZHRofSkge1xuICAgICAgICAgIHJldHVybiBpbml0aWFsaXphdGlvblZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGNvdW50ICs9IDEuMDtcbiAgICAgICAgcmV0dXJuIGdldFgoYmF0Y2gsIHhELCB4UiwgeEMsIGNoKTtcbiAgICAgIH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjNSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzLng7XG4gICAgICAgIGludCBjaCA9IGNvb3Jkcy51O1xuXG4gICAgICAgIGl2ZWMzIHhDb3JuZXIgPSBpdmVjMyhjb29yZHMueSwgY29vcmRzLnosIGNvb3Jkcy53KSAqIHN0cmlkZXMgLSBwYWRzO1xuICAgICAgICBpbnQgeERDb3JuZXIgPSB4Q29ybmVyLng7XG4gICAgICAgIGludCB4UkNvcm5lciA9IHhDb3JuZXIueTtcbiAgICAgICAgaW50IHhDQ29ybmVyID0geENvcm5lci56O1xuXG4gICAgICAgIC8vIG1heC9taW4geCg/LCA/LCA/LCBkKSB0byBnZXQgeSh5RCwgeVIsIHlDLCBjaCkuXG4gICAgICAgIC8vID8gPSB0byBiZSBkZXRlcm1pbmVkXG4gICAgICAgIHZlYzQgbWluTWF4VmFsdWUgPSB2ZWM0KCR7aW5pdGlhbGl6YXRpb25WYWx1ZX0pO1xuICAgICAgICBmbG9hdCBhdmdWYWx1ZSA9IDAuMDtcbiAgICAgICAgY291bnQgPSAwLjA7XG5cbiAgICAgICAgZm9yIChpbnQgd0QgPSAwOyB3RCA8ICR7ZWZmZWN0aXZlRmlsdGVyRGVwdGh9O1xuICAgICAgICAgICAgd0QgKz0gJHtkaWxhdGlvbkRlcHRofSkge1xuICAgICAgICAgIGludCB4RCA9IHhEQ29ybmVyICsgd0Q7XG5cbiAgICAgICAgICBpZiAoeEQgPCAwIHx8IHhEID49ICR7Y29udkluZm8uaW5EZXB0aH0pIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAoaW50IHdSID0gMDsgd1IgPCAke2VmZmVjdGl2ZUZpbHRlckhlaWdodH07XG4gICAgICAgICAgICB3UiArPSAke2RpbGF0aW9uSGVpZ2h0fSkge1xuICAgICAgICAgICAgaW50IHhSID0geFJDb3JuZXIgKyB3UjtcblxuICAgICAgICAgICAgaWYgKHhSIDwgMCB8fCB4UiA+PSAke2NvbnZJbmZvLmluSGVpZ2h0fSkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChpbnQgd0MgPSAwOyB3QyA8ICR7ZmlsdGVyV2lkdGhOZWFyZXN0VmVjNH07IHdDICs9IDQpIHtcbiAgICAgICAgICAgICAgaW50IHhDID0geENDb3JuZXIgKyB3QyAqICR7ZGlsYXRpb25XaWR0aH07XG5cbiAgICAgICAgICAgICAgdmVjNCB2YWx1ZXMgPSB2ZWM0KFxuICAgICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4RCwgeFIsIHhDLCBjaCksXG4gICAgICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIHhELCB4UiwgeEMgKyAke2RpbGF0aW9uV2lkdGh9LCBjaCksXG4gICAgICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIHhELCB4UiwgeEMgKyAyICogJHtkaWxhdGlvbldpZHRofSwgY2gpLFxuICAgICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4RCwgeFIsIHhDICsgMyAqICR7ZGlsYXRpb25XaWR0aH0sIGNoKVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW50IHhDID0geENDb3JuZXIgKyAke2ZpbHRlcldpZHRoTmVhcmVzdFZlYzR9O1xuICAgICAgICAgICAgaWYgKCR7ZmlsdGVyV2lkdGhWZWM0UmVtYWluZGVyID09PSAxfSkge1xuICAgICAgICAgICAgICB2ZWM0IHZhbHVlcyA9IHZlYzQoXG4gICAgICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIHhELCB4UiwgeEMsIGNoKSxcbiAgICAgICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlLFxuICAgICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUsXG4gICAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoJHtmaWx0ZXJXaWR0aFZlYzRSZW1haW5kZXIgPT09IDJ9KSB7XG4gICAgICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgeEQsIHhSLCB4QywgY2gpLFxuICAgICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4RCwgeFIsIHhDICsgJHtkaWxhdGlvbldpZHRofSwgY2gpLFxuICAgICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUsXG4gICAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoJHtmaWx0ZXJXaWR0aFZlYzRSZW1haW5kZXIgPT09IDN9KSB7XG4gICAgICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgeEQsIHhSLCB4QywgY2gpLFxuICAgICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4RCwgeFIsIHhDICsgJHtkaWxhdGlvbldpZHRofSwgY2gpLFxuICAgICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4RCwgeFIsIHhDICsgMiAqICR7ZGlsYXRpb25XaWR0aH0sIGNoKSxcbiAgICAgICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgJHt1cGRhdGVTbmlwcGV0fVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBzZXRPdXRwdXQoJHtyZXR1cm5WYWx1ZX0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wb29sX2dwdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5leHBvcnQgY2xhc3MgUmVkdWNlUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IocmVkdWNlSW5mbywgcmVkdWNlVHlwZSkge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgICAgICAgY29uc3QgeyB3aW5kb3dTaXplLCBiYXRjaFNpemUsIGluU2l6ZSwgb3V0U2l6ZSB9ID0gcmVkdWNlSW5mbztcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IFtiYXRjaFNpemUsIG91dFNpemVdO1xuICAgICAgICBsZXQgaW5pdGlhbGl6YXRpb25WYWx1ZSA9ICcwLjAnO1xuICAgICAgICBsZXQgY29tcGFyZU9wID0gYGA7XG4gICAgICAgIGlmIChyZWR1Y2VUeXBlID09PSAncHJvZCcpIHtcbiAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUgPSAnMS4wJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChyZWR1Y2VUeXBlID09PSAnbWluJykge1xuICAgICAgICAgICAgLy8gV2ViR0wgb24gRmlyZWZveCBMaW51eCBjYW4ndCBjb21waWxlIDEvMCBzbyB3ZSBkbyAxL2Vwcy5cbiAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUgPSAnMS4wIC8gMWUtMjAnO1xuICAgICAgICAgICAgY29tcGFyZU9wID0gYG1pbmA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocmVkdWNlVHlwZSA9PT0gJ21heCcpIHtcbiAgICAgICAgICAgIC8vIFdlYkdMIG9uIEZpcmVmb3ggTGludXggY2FuJ3QgY29tcGlsZSAxLzAgc28gd2UgZG8gMS9lcHMuXG4gICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlID0gJy0xLjAgLyAxZS0yMCc7XG4gICAgICAgICAgICBjb21wYXJlT3AgPSBgbWF4YDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmV0dXJuVmFsdWUgPSBgJHtyZWR1Y2VUeXBlfSgke3JlZHVjZVR5cGV9KCR7cmVkdWNlVHlwZX0oYCArXG4gICAgICAgICAgICAnbWluTWF4VmFsdWVbMF0sIG1pbk1heFZhbHVlWzFdKSwgbWluTWF4VmFsdWVbMl0pLCBtaW5NYXhWYWx1ZVszXSknO1xuICAgICAgICBpZiAocmVkdWNlVHlwZSA9PT0gJ3N1bScpIHtcbiAgICAgICAgICAgIHJldHVyblZhbHVlID0gYHN1bVZhbHVlYDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChyZWR1Y2VUeXBlID09PSAncHJvZCcpIHtcbiAgICAgICAgICAgIHJldHVyblZhbHVlID0gYHByb2RWYWx1ZWA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocmVkdWNlVHlwZSA9PT0gJ2FsbCcpIHtcbiAgICAgICAgICAgIHJldHVyblZhbHVlID0gYGFsbFZhbHVlYDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChyZWR1Y2VUeXBlID09PSAnYW55Jykge1xuICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBgYW55VmFsdWVgO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHdpbmRvd1NpemVOZWFyZXN0VmVjNCA9IE1hdGguZmxvb3Iod2luZG93U2l6ZSAvIDQpICogNDtcbiAgICAgICAgY29uc3Qgd2luZG93U2l6ZVZlYzRSZW1haW5kZXIgPSB3aW5kb3dTaXplICUgNDtcbiAgICAgICAgbGV0IHVwZGF0ZVNuaXBwZXQgPSBgXG4gICAgICBpZiAoJHtyZWR1Y2VUeXBlID09PSAnc3VtJ30pIHtcbiAgICAgICAgc3VtVmFsdWUgKz0gZG90KHZhbHVlcywgb25lcyk7XG4gICAgICB9IGVsc2UgaWYgKCR7cmVkdWNlVHlwZSA9PT0gJ3Byb2QnfSkge1xuICAgICAgICB2ZWMyIHRtcCA9IHZlYzIodmFsdWVzWzBdLCB2YWx1ZXNbMV0pICogdmVjMih2YWx1ZXNbMl0sIHZhbHVlc1szXSk7XG4gICAgICAgIHByb2RWYWx1ZSAqPSB0bXBbMF0gKiB0bXBbMV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtaW5NYXhWYWx1ZSA9ICR7Y29tcGFyZU9wfSh2YWx1ZXMsIG1pbk1heFZhbHVlKTtcbiAgICAgICAgaWYgKCR7cmVkdWNlVHlwZSA9PT0gJ21pbid9IHx8ICR7cmVkdWNlVHlwZSA9PT0gJ21heCd9KSB7XG4gICAgICAgICAgbWluTWF4VmFsdWUgPSAke2NvbXBhcmVPcH0odmFsdWVzLCBtaW5NYXhWYWx1ZSk7XG4gICAgICAgICAgYnZlYzQgaXNOYU4gPSBpc25hbih2YWx1ZXMpO1xuICAgICAgICAgIGlmIChpc05hTi5yIHx8IGlzTmFOLmcgfHwgaXNOYU4uYiB8fCBpc05hTi5hKSB7XG4gICAgICAgICAgICBtaW5NYXhWYWx1ZSA9IHZlYzQoTkFOKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICBgO1xuICAgICAgICBsZXQgdmVjVHlwZSA9IGB2ZWM0YDtcbiAgICAgICAgaWYgKHJlZHVjZVR5cGUgPT09ICdhbGwnKSB7XG4gICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlID0gJzEuMCc7XG4gICAgICAgICAgICB1cGRhdGVTbmlwcGV0ID0gYFxuICAgICAgICBib29sIHJlZHVjZWRBbGxWYWx1ZSA9IGFsbCh2YWx1ZXMpO1xuICAgICAgICBmbG9hdCBmbG9hdGVkUmVkdWNlZEFsbFZhbHVlID0gZmxvYXQocmVkdWNlZEFsbFZhbHVlKTtcbiAgICAgICAgYWxsVmFsdWUgPSBmbG9hdChhbGxWYWx1ZSA+PSAxLjAgJiYgZmxvYXRlZFJlZHVjZWRBbGxWYWx1ZSA+PSAxLjApO1xuICAgICAgYDtcbiAgICAgICAgICAgIHZlY1R5cGUgPSBgYnZlYzRgO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHJlZHVjZVR5cGUgPT09ICdhbnknKSB7XG4gICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlID0gJzAuMCc7XG4gICAgICAgICAgICB1cGRhdGVTbmlwcGV0ID0gYFxuICAgICAgICBib29sIHJlZHVjZWRBbnlWYWx1ZSA9IGFueSh2YWx1ZXMpO1xuICAgICAgICBmbG9hdCBmbG9hdGVkUmVkdWNlZEFueVZhbHVlID0gZmxvYXQocmVkdWNlZEFueVZhbHVlKTtcbiAgICAgICAgYW55VmFsdWUgPSBmbG9hdChhbnlWYWx1ZSA+PSAxLjAgfHwgZmxvYXRlZFJlZHVjZWRBbnlWYWx1ZSA+PSAxLjApO1xuICAgICAgYDtcbiAgICAgICAgICAgIHZlY1R5cGUgPSBgYnZlYzRgO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjaGVja091dE9mQm91bmRzID0gJyc7XG4gICAgICAgIGlmIChpblNpemUgJSB3aW5kb3dTaXplID4gMCkge1xuICAgICAgICAgICAgY2hlY2tPdXRPZkJvdW5kcyA9IGBcbiAgICAgICAgaWYgKGluSWR4IDwgMCB8fCBpbklkeCA+PSAke2luU2l6ZX0pIHtcbiAgICAgICAgICByZXR1cm4gaW5pdGlhbGl6YXRpb25WYWx1ZTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgY29uc3QgZmxvYXQgaW5pdGlhbGl6YXRpb25WYWx1ZSA9ICR7aW5pdGlhbGl6YXRpb25WYWx1ZX07XG4gICAgICBjb25zdCB2ZWM0IG9uZXMgPSB2ZWM0KDEuMCwgMS4wLCAxLjAsIDEuMCk7XG5cbiAgICAgIGZsb2F0IGdldFZhbHVlKGludCBiYXRjaCwgaW50IGluSWR4KSB7XG4gICAgICAgICR7Y2hlY2tPdXRPZkJvdW5kc31cbiAgICAgICAgcmV0dXJuIGdldFgoYmF0Y2gsIGluSWR4KTtcbiAgICAgIH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMiBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgb3V0SWR4ID0gY29vcmRzWzFdO1xuICAgICAgICBpbnQgaW5PZmZzZXQgPSBvdXRJZHggKiAke3dpbmRvd1NpemV9O1xuXG4gICAgICAgIHZlYzQgbWluTWF4VmFsdWUgPSB2ZWM0KCR7aW5pdGlhbGl6YXRpb25WYWx1ZX0pO1xuICAgICAgICBmbG9hdCBwcm9kVmFsdWUgPSAxLjA7XG4gICAgICAgIGZsb2F0IHN1bVZhbHVlID0gMC4wO1xuICAgICAgICBmbG9hdCBhbGxWYWx1ZSA9IDEuMDtcbiAgICAgICAgZmxvYXQgYW55VmFsdWUgPSAwLjA7XG5cbiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAke3dpbmRvd1NpemVOZWFyZXN0VmVjNH07IGkgKz0gNCkge1xuICAgICAgICAgIGludCBpbklkeCA9IGluT2Zmc2V0ICsgaTtcbiAgICAgICAgICAke3ZlY1R5cGV9IHZhbHVlcyA9ICR7dmVjVHlwZX0oXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHgpLFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4ICsgMSksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAyKSxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDMpXG4gICAgICAgICAgKTtcblxuICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgfVxuXG4gICAgICAgIGludCBpbklkeCA9IGluT2Zmc2V0ICsgJHt3aW5kb3dTaXplTmVhcmVzdFZlYzR9O1xuICAgICAgICBpZiAoJHt3aW5kb3dTaXplVmVjNFJlbWFpbmRlciA9PT0gMX0pIHtcbiAgICAgICAgICAke3ZlY1R5cGV9IHZhbHVlcyA9ICR7dmVjVHlwZX0oXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHgpLFxuICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZSxcbiAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUsXG4gICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlXG4gICAgICAgICAgKTtcblxuICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgfSBlbHNlIGlmICgke3dpbmRvd1NpemVWZWM0UmVtYWluZGVyID09PSAyfSkge1xuICAgICAgICAgICR7dmVjVHlwZX0gdmFsdWVzID0gJHt2ZWNUeXBlfShcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAxKSxcbiAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUsXG4gICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlXG4gICAgICAgICAgKTtcblxuICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgfSBlbHNlIGlmICgke3dpbmRvd1NpemVWZWM0UmVtYWluZGVyID09PSAzfSkge1xuICAgICAgICAgICR7dmVjVHlwZX0gdmFsdWVzID0gJHt2ZWNUeXBlfShcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAxKSxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDIpLFxuICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAke3VwZGF0ZVNuaXBwZXR9XG4gICAgICAgIH1cbiAgICAgICAgc2V0T3V0cHV0KCR7cmV0dXJuVmFsdWV9KTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlZHVjZV9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgcmVnaXN0ZXJLZXJuZWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgX2Z1c2VkTWF0TXVsQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL19GdXNlZE1hdE11bCc7XG5pbXBvcnQgeyBhYnNDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQWJzJztcbmltcG9ydCB7IGFjb3NDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQWNvcyc7XG5pbXBvcnQgeyBhY29zaENvbmZpZyB9IGZyb20gJy4va2VybmVscy9BY29zaCc7XG5pbXBvcnQgeyBhZGRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQWRkJztcbmltcG9ydCB7IGFkZE5Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvQWRkTic7XG5pbXBvcnQgeyBhbGxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQWxsJztcbmltcG9ydCB7IGFueUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9BbnknO1xuaW1wb3J0IHsgYXJnTWF4Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0FyZ01heCc7XG5pbXBvcnQgeyBhcmdNaW5Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvQXJnTWluJztcbmltcG9ydCB7IGFzaW5Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvQXNpbic7XG5pbXBvcnQgeyBhc2luaENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Bc2luaCc7XG5pbXBvcnQgeyBhdGFuQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0F0YW4nO1xuaW1wb3J0IHsgYXRhbjJDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQXRhbjInO1xuaW1wb3J0IHsgYXRhbmhDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQXRhbmgnO1xuaW1wb3J0IHsgYXZnUG9vbENvbmZpZyB9IGZyb20gJy4va2VybmVscy9BdmdQb29sJztcbmltcG9ydCB7IGF2Z1Bvb2wzRENvbmZpZyB9IGZyb20gJy4va2VybmVscy9BdmdQb29sM0QnO1xuaW1wb3J0IHsgYXZnUG9vbEdyYWQzRENvbmZpZyB9IGZyb20gJy4va2VybmVscy9BdmdQb29sM0RHcmFkJztcbmltcG9ydCB7IGF2Z1Bvb2xHcmFkQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0F2Z1Bvb2xHcmFkJztcbmltcG9ydCB7IGJhdGNoTWF0TXVsQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0JhdGNoTWF0TXVsJztcbmltcG9ydCB7IGJhdGNoTm9ybUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9CYXRjaE5vcm0nO1xuaW1wb3J0IHsgYmF0Y2hUb1NwYWNlTkRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQmF0Y2hUb1NwYWNlTkQnO1xuaW1wb3J0IHsgYmluY291bnRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQmluY291bnQnO1xuaW1wb3J0IHsgY2FzdENvbmZpZyB9IGZyb20gJy4va2VybmVscy9DYXN0JztcbmltcG9ydCB7IGNlaWxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQ2VpbCc7XG5pbXBvcnQgeyBjbGlwQnlWYWx1ZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9DbGlwQnlWYWx1ZSc7XG5pbXBvcnQgeyBjb21wbGV4Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0NvbXBsZXgnO1xuaW1wb3J0IHsgY29tcGxleEFic0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9Db21wbGV4QWJzJztcbmltcG9ydCB7IGNvbmNhdENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Db25jYXQnO1xuaW1wb3J0IHsgY29udjJEQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0NvbnYyRCc7XG5pbXBvcnQgeyBjb252MkRCYWNrcHJvcEZpbHRlckNvbmZpZyB9IGZyb20gJy4va2VybmVscy9Db252MkRCYWNrcHJvcEZpbHRlcic7XG5pbXBvcnQgeyBjb252MkRCYWNrcHJvcElucHV0Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0NvbnYyREJhY2twcm9wSW5wdXQnO1xuaW1wb3J0IHsgY29udjNEQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0NvbnYzRCc7XG5pbXBvcnQgeyBjb252M0RCYWNrcHJvcEZpbHRlclYyQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0NvbnYzREJhY2twcm9wRmlsdGVyVjInO1xuaW1wb3J0IHsgY29udjNEQmFja3Byb3BJbnB1dENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Db252M0RCYWNrcHJvcElucHV0VjInO1xuaW1wb3J0IHsgY29zQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0Nvcyc7XG5pbXBvcnQgeyBjb3NoQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0Nvc2gnO1xuaW1wb3J0IHsgY3JvcEFuZFJlc2l6ZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9Dcm9wQW5kUmVzaXplJztcbmltcG9ydCB7IGN1bXN1bUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9DdW1zdW0nO1xuaW1wb3J0IHsgZGVuc2VCaW5jb3VudENvbmZpZyB9IGZyb20gJy4va2VybmVscy9EZW5zZUJpbmNvdW50JztcbmltcG9ydCB7IGRlcHRoVG9TcGFjZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9EZXB0aFRvU3BhY2UnO1xuaW1wb3J0IHsgZGVwdGh3aXNlQ29udjJkTmF0aXZlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0RlcHRod2lzZUNvbnYyZE5hdGl2ZSc7XG5pbXBvcnQgeyBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlckNvbmZpZyB9IGZyb20gJy4va2VybmVscy9EZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlcic7XG5pbXBvcnQgeyBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0RlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXQnO1xuaW1wb3J0IHsgZGlhZ0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9EaWFnJztcbmltcG9ydCB7IGRpbGF0aW9uMkRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRGlsYXRpb24yRCc7XG5pbXBvcnQgeyBlaW5zdW1Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvRWluc3VtJztcbmltcG9ydCB7IGVsdUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9FbHUnO1xuaW1wb3J0IHsgZWx1R3JhZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9FbHVHcmFkJztcbmltcG9ydCB7IGVxdWFsQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0VxdWFsJztcbmltcG9ydCB7IGVyZkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9FcmYnO1xuaW1wb3J0IHsgZXhwQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0V4cCc7XG5pbXBvcnQgeyBleHBhbmREaW1zQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0V4cGFuZERpbXMnO1xuaW1wb3J0IHsgZXhwbTFDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRXhwbTEnO1xuaW1wb3J0IHsgZmZ0Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0ZGVCc7XG5pbXBvcnQgeyBmaWxsQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0ZpbGwnO1xuaW1wb3J0IHsgZmxpcExlZnRSaWdodENvbmZpZyB9IGZyb20gJy4va2VybmVscy9GbGlwTGVmdFJpZ2h0JztcbmltcG9ydCB7IGZsb29yQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0Zsb29yJztcbmltcG9ydCB7IGZsb29yRGl2Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0Zsb29yRGl2JztcbmltcG9ydCB7IGZyb21QaXhlbHNDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRnJvbVBpeGVscyc7XG5pbXBvcnQgeyBmdXNlZENvbnYyRENvbmZpZyB9IGZyb20gJy4va2VybmVscy9GdXNlZENvbnYyRCc7XG5pbXBvcnQgeyBmdXNlZERlcHRod2lzZUNvbnYyRENvbmZpZyB9IGZyb20gJy4va2VybmVscy9GdXNlZERlcHRod2lzZUNvbnYyRCc7XG5pbXBvcnQgeyBnYXRoZXJOZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9HYXRoZXJOZCc7XG5pbXBvcnQgeyBnYXRoZXJWMkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9HYXRoZXJWMic7XG5pbXBvcnQgeyBncmVhdGVyQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0dyZWF0ZXInO1xuaW1wb3J0IHsgZ3JlYXRlckVxdWFsQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0dyZWF0ZXJFcXVhbCc7XG5pbXBvcnQgeyBpZGVudGl0eUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9JZGVudGl0eSc7XG5pbXBvcnQgeyBpZmZ0Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0lGRlQnO1xuaW1wb3J0IHsgaW1hZ0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9JbWFnJztcbmltcG9ydCB7IGlzRmluaXRlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0lzRmluaXRlJztcbmltcG9ydCB7IGlzSW5mQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0lzSW5mJztcbmltcG9ydCB7IGlzTmFOQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0lzTmFOJztcbmltcG9ydCB7IGxlYWt5UmVsdUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9MZWFreVJlbHUnO1xuaW1wb3J0IHsgbGVzc0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9MZXNzJztcbmltcG9ydCB7IGxlc3NFcXVhbENvbmZpZyB9IGZyb20gJy4va2VybmVscy9MZXNzRXF1YWwnO1xuaW1wb3J0IHsgbGluU3BhY2VDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTGluU3BhY2UnO1xuaW1wb3J0IHsgbG9nQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0xvZyc7XG5pbXBvcnQgeyBsb2cxcENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Mb2cxcCc7XG5pbXBvcnQgeyBsb2dpY2FsQW5kQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0xvZ2ljYWxBbmQnO1xuaW1wb3J0IHsgbG9naWNhbE5vdENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Mb2dpY2FsTm90JztcbmltcG9ydCB7IGxvZ2ljYWxPckNvbmZpZyB9IGZyb20gJy4va2VybmVscy9Mb2dpY2FsT3InO1xuaW1wb3J0IHsgTFJOQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0xSTic7XG5pbXBvcnQgeyBMUk5HcmFkQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0xSTkdyYWQnO1xuaW1wb3J0IHsgbWF4Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL01heCc7XG5pbXBvcnQgeyBtYXhpbXVtQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL01heGltdW0nO1xuaW1wb3J0IHsgbWF4UG9vbENvbmZpZyB9IGZyb20gJy4va2VybmVscy9NYXhQb29sJztcbmltcG9ydCB7IG1heFBvb2wzRENvbmZpZyB9IGZyb20gJy4va2VybmVscy9NYXhQb29sM0QnO1xuaW1wb3J0IHsgbWF4UG9vbEdyYWQzRENvbmZpZyB9IGZyb20gJy4va2VybmVscy9NYXhQb29sM0RHcmFkJztcbmltcG9ydCB7IG1heFBvb2xHcmFkQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL01heFBvb2xHcmFkJztcbmltcG9ydCB7IG1heFBvb2xXaXRoQXJnbWF4Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL01heFBvb2xXaXRoQXJnbWF4JztcbmltcG9ydCB7IG1lYW5Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvTWVhbic7XG5pbXBvcnQgeyBtaW5Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvTWluJztcbmltcG9ydCB7IG1pbmltdW1Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvTWluaW11bSc7XG5pbXBvcnQgeyBtaXJyb3JQYWRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTWlycm9yUGFkJztcbmltcG9ydCB7IG1vZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Nb2QnO1xuaW1wb3J0IHsgbXVsdGlub21pYWxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTXVsdGlub21pYWwnO1xuaW1wb3J0IHsgbXVsdGlwbHlDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTXVsdGlwbHknO1xuaW1wb3J0IHsgbmVnQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL05lZyc7XG5pbXBvcnQgeyBub25NYXhTdXBwcmVzc2lvblYzQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL05vbk1heFN1cHByZXNzaW9uVjMnO1xuaW1wb3J0IHsgbm9uTWF4U3VwcHJlc3Npb25WNENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Ob25NYXhTdXBwcmVzc2lvblY0JztcbmltcG9ydCB7IG5vbk1heFN1cHByZXNzaW9uVjVDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTm9uTWF4U3VwcHJlc3Npb25WNSc7XG5pbXBvcnQgeyBub3RFcXVhbENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Ob3RFcXVhbCc7XG5pbXBvcnQgeyBvbmVIb3RDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvT25lSG90JztcbmltcG9ydCB7IG9uZXNMaWtlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL09uZXNMaWtlJztcbmltcG9ydCB7IHBhY2tDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUGFjayc7XG5pbXBvcnQgeyBwYWRWMkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9QYWRWMic7XG5pbXBvcnQgeyBwb3dDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUG93JztcbmltcG9ydCB7IHByZWx1Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1ByZWx1JztcbmltcG9ydCB7IHByb2RDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUHJvZCc7XG5pbXBvcnQgeyByYW5nZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9SYW5nZSc7XG5pbXBvcnQgeyByZWFsQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1JlYWwnO1xuaW1wb3J0IHsgcmVhbERpdkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9SZWFsRGl2JztcbmltcG9ydCB7IHJlY2lwcm9jYWxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUmVjaXByb2NhbCc7XG5pbXBvcnQgeyByZWx1Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1JlbHUnO1xuaW1wb3J0IHsgcmVsdTZDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUmVsdTYnO1xuaW1wb3J0IHsgcmVzaGFwZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9SZXNoYXBlJztcbmltcG9ydCB7IHJlc2l6ZUJpbGluZWFyQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1Jlc2l6ZUJpbGluZWFyJztcbmltcG9ydCB7IHJlc2l6ZUJpbGluZWFyR3JhZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9SZXNpemVCaWxpbmVhckdyYWQnO1xuaW1wb3J0IHsgcmVzaXplTmVhcmVzdE5laWdoYm9yQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1Jlc2l6ZU5lYXJlc3ROZWlnaGJvcic7XG5pbXBvcnQgeyByZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1Jlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWQnO1xuaW1wb3J0IHsgcmV2ZXJzZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9SZXZlcnNlJztcbmltcG9ydCB7IHJvdGF0ZVdpdGhPZmZzZXRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUm90YXRlV2l0aE9mZnNldCc7XG5pbXBvcnQgeyByb3VuZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Sb3VuZCc7XG5pbXBvcnQgeyByc3FydENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Sc3FydCc7XG5pbXBvcnQgeyBzY2F0dGVyTmRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU2NhdHRlck5kJztcbmltcG9ydCB7IHNlbGVjdENvbmZpZyB9IGZyb20gJy4va2VybmVscy9TZWxlY3QnO1xuaW1wb3J0IHsgc2VsdUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9TZWx1JztcbmltcG9ydCB7IHNpZ21vaWRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU2lnbW9pZCc7XG5pbXBvcnQgeyBzaWduQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NpZ24nO1xuaW1wb3J0IHsgc2luQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1Npbic7XG5pbXBvcnQgeyBzaW5oQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NpbmgnO1xuaW1wb3J0IHsgc2xpY2VDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU2xpY2UnO1xuaW1wb3J0IHsgc29mdG1heENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Tb2Z0bWF4JztcbmltcG9ydCB7IHNvZnRwbHVzQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NvZnRwbHVzJztcbmltcG9ydCB7IHNwYWNlVG9CYXRjaE5EQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NwYWNlVG9CYXRjaE5EJztcbmltcG9ydCB7IHNwYXJzZUZpbGxFbXB0eVJvd3NDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3BhcnNlRmlsbEVtcHR5Um93cyc7XG5pbXBvcnQgeyBzcGFyc2VSZXNoYXBlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NwYXJzZVJlc2hhcGUnO1xuaW1wb3J0IHsgc3BhcnNlU2VnbWVudE1lYW5Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3BhcnNlU2VnbWVudE1lYW4nO1xuaW1wb3J0IHsgc3BhcnNlU2VnbWVudFN1bUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9TcGFyc2VTZWdtZW50U3VtJztcbmltcG9ydCB7IHNwYXJzZVRvRGVuc2VDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3BhcnNlVG9EZW5zZSc7XG5pbXBvcnQgeyBzcGxpdFZDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3BsaXRWJztcbmltcG9ydCB7IHNxcnRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3FydCc7XG5pbXBvcnQgeyBzcXVhcmVDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3F1YXJlJztcbmltcG9ydCB7IHNxdWFyZWREaWZmZXJlbmNlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NxdWFyZWREaWZmZXJlbmNlJztcbmltcG9ydCB7IHN0ZXBDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3RlcCc7XG5pbXBvcnQgeyBzdHJpZGVkU2xpY2VDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3RyaWRlZFNsaWNlJztcbmltcG9ydCB7IHN0cmluZ05HcmFtc0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9TdHJpbmdOR3JhbXMnO1xuaW1wb3J0IHsgc3RyaW5nU3BsaXRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3RyaW5nU3BsaXQnO1xuaW1wb3J0IHsgc3RyaW5nVG9IYXNoQnVja2V0RmFzdENvbmZpZyB9IGZyb20gJy4va2VybmVscy9TdHJpbmdUb0hhc2hCdWNrZXRGYXN0JztcbmltcG9ydCB7IHN1YkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9TdWInO1xuaW1wb3J0IHsgc3VtQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1N1bSc7XG5pbXBvcnQgeyB0YW5Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvVGFuJztcbmltcG9ydCB7IHRhbmhDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvVGFuaCc7XG5pbXBvcnQgeyB0aWxlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1RpbGUnO1xuaW1wb3J0IHsgdG9wS0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9Ub3BLJztcbmltcG9ydCB7IHRyYW5zZm9ybUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9UcmFuc2Zvcm0nO1xuaW1wb3J0IHsgdHJhbnNwb3NlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1RyYW5zcG9zZSc7XG5pbXBvcnQgeyB1bmlxdWVDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvVW5pcXVlJztcbmltcG9ydCB7IHVucGFja0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9VbnBhY2snO1xuaW1wb3J0IHsgdW5zb3J0ZWRTZWdtZW50U3VtQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1Vuc29ydGVkU2VnbWVudFN1bSc7XG5pbXBvcnQgeyB6ZXJvc0xpa2VDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvWmVyb3NMaWtlJztcbi8vIExpc3QgYWxsIGtlcm5lbCBjb25maWdzIGhlcmVcbmNvbnN0IGtlcm5lbENvbmZpZ3MgPSBbXG4gICAgTFJOQ29uZmlnLFxuICAgIExSTkdyYWRDb25maWcsXG4gICAgX2Z1c2VkTWF0TXVsQ29uZmlnLFxuICAgIGFic0NvbmZpZyxcbiAgICBhY29zQ29uZmlnLFxuICAgIGFjb3NoQ29uZmlnLFxuICAgIGFkZENvbmZpZyxcbiAgICBhZGROQ29uZmlnLFxuICAgIGFsbENvbmZpZyxcbiAgICBhbnlDb25maWcsXG4gICAgYXJnTWF4Q29uZmlnLFxuICAgIGFyZ01pbkNvbmZpZyxcbiAgICBhc2luQ29uZmlnLFxuICAgIGFzaW5oQ29uZmlnLFxuICAgIGF0YW4yQ29uZmlnLFxuICAgIGF0YW5Db25maWcsXG4gICAgYXRhbmhDb25maWcsXG4gICAgYXZnUG9vbDNEQ29uZmlnLFxuICAgIGF2Z1Bvb2xDb25maWcsXG4gICAgYXZnUG9vbEdyYWQzRENvbmZpZyxcbiAgICBhdmdQb29sR3JhZENvbmZpZyxcbiAgICBiYXRjaE1hdE11bENvbmZpZyxcbiAgICBiYXRjaE5vcm1Db25maWcsXG4gICAgYmF0Y2hUb1NwYWNlTkRDb25maWcsXG4gICAgYmluY291bnRDb25maWcsXG4gICAgY2FzdENvbmZpZyxcbiAgICBjZWlsQ29uZmlnLFxuICAgIGNsaXBCeVZhbHVlQ29uZmlnLFxuICAgIGNvbXBsZXhBYnNDb25maWcsXG4gICAgY29tcGxleENvbmZpZyxcbiAgICBjb25jYXRDb25maWcsXG4gICAgY29udjJEQmFja3Byb3BGaWx0ZXJDb25maWcsXG4gICAgY29udjJEQmFja3Byb3BJbnB1dENvbmZpZyxcbiAgICBjb252MkRDb25maWcsXG4gICAgY29udjNEQmFja3Byb3BGaWx0ZXJWMkNvbmZpZyxcbiAgICBjb252M0RCYWNrcHJvcElucHV0Q29uZmlnLFxuICAgIGNvbnYzRENvbmZpZyxcbiAgICBjb3NDb25maWcsXG4gICAgY29zaENvbmZpZyxcbiAgICBjcm9wQW5kUmVzaXplQ29uZmlnLFxuICAgIGN1bXN1bUNvbmZpZyxcbiAgICBkZW5zZUJpbmNvdW50Q29uZmlnLFxuICAgIGRlcHRoVG9TcGFjZUNvbmZpZyxcbiAgICBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlckNvbmZpZyxcbiAgICBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0Q29uZmlnLFxuICAgIGRlcHRod2lzZUNvbnYyZE5hdGl2ZUNvbmZpZyxcbiAgICBkaWFnQ29uZmlnLFxuICAgIGRpbGF0aW9uMkRDb25maWcsXG4gICAgZWluc3VtQ29uZmlnLFxuICAgIGVsdUNvbmZpZyxcbiAgICBlbHVHcmFkQ29uZmlnLFxuICAgIGVxdWFsQ29uZmlnLFxuICAgIGVyZkNvbmZpZyxcbiAgICBleHBDb25maWcsXG4gICAgZXhwYW5kRGltc0NvbmZpZyxcbiAgICBleHBtMUNvbmZpZyxcbiAgICBmZnRDb25maWcsXG4gICAgZmlsbENvbmZpZyxcbiAgICBmbGlwTGVmdFJpZ2h0Q29uZmlnLFxuICAgIGZsb29yQ29uZmlnLFxuICAgIGZsb29yRGl2Q29uZmlnLFxuICAgIGZyb21QaXhlbHNDb25maWcsXG4gICAgZnVzZWRDb252MkRDb25maWcsXG4gICAgZnVzZWREZXB0aHdpc2VDb252MkRDb25maWcsXG4gICAgZ2F0aGVyTmRDb25maWcsXG4gICAgZ2F0aGVyVjJDb25maWcsXG4gICAgZ3JlYXRlckNvbmZpZyxcbiAgICBncmVhdGVyRXF1YWxDb25maWcsXG4gICAgaWRlbnRpdHlDb25maWcsXG4gICAgaWZmdENvbmZpZyxcbiAgICBpbWFnQ29uZmlnLFxuICAgIGlzRmluaXRlQ29uZmlnLFxuICAgIGlzSW5mQ29uZmlnLFxuICAgIGlzTmFOQ29uZmlnLFxuICAgIGxlYWt5UmVsdUNvbmZpZyxcbiAgICBsZXNzQ29uZmlnLFxuICAgIGxlc3NFcXVhbENvbmZpZyxcbiAgICBsaW5TcGFjZUNvbmZpZyxcbiAgICBsb2cxcENvbmZpZyxcbiAgICBsb2dDb25maWcsXG4gICAgbG9naWNhbEFuZENvbmZpZyxcbiAgICBsb2dpY2FsTm90Q29uZmlnLFxuICAgIGxvZ2ljYWxPckNvbmZpZyxcbiAgICBtYXhDb25maWcsXG4gICAgbWF4UG9vbDNEQ29uZmlnLFxuICAgIG1heFBvb2xDb25maWcsXG4gICAgbWF4UG9vbEdyYWQzRENvbmZpZyxcbiAgICBtYXhQb29sR3JhZENvbmZpZyxcbiAgICBtYXhQb29sV2l0aEFyZ21heENvbmZpZyxcbiAgICBtYXhpbXVtQ29uZmlnLFxuICAgIG1lYW5Db25maWcsXG4gICAgbWluQ29uZmlnLFxuICAgIG1pbmltdW1Db25maWcsXG4gICAgbWlycm9yUGFkQ29uZmlnLFxuICAgIG1vZENvbmZpZyxcbiAgICBtdWx0aW5vbWlhbENvbmZpZyxcbiAgICBtdWx0aXBseUNvbmZpZyxcbiAgICBuZWdDb25maWcsXG4gICAgbm9uTWF4U3VwcHJlc3Npb25WM0NvbmZpZyxcbiAgICBub25NYXhTdXBwcmVzc2lvblY0Q29uZmlnLFxuICAgIG5vbk1heFN1cHByZXNzaW9uVjVDb25maWcsXG4gICAgbm90RXF1YWxDb25maWcsXG4gICAgb25lSG90Q29uZmlnLFxuICAgIG9uZXNMaWtlQ29uZmlnLFxuICAgIHBhY2tDb25maWcsXG4gICAgcGFkVjJDb25maWcsXG4gICAgcG93Q29uZmlnLFxuICAgIHByZWx1Q29uZmlnLFxuICAgIHByb2RDb25maWcsXG4gICAgcmFuZ2VDb25maWcsXG4gICAgcmVhbENvbmZpZyxcbiAgICByZWFsRGl2Q29uZmlnLFxuICAgIHJlY2lwcm9jYWxDb25maWcsXG4gICAgcmVsdTZDb25maWcsXG4gICAgcmVsdUNvbmZpZyxcbiAgICByZXNoYXBlQ29uZmlnLFxuICAgIHJlc2l6ZUJpbGluZWFyQ29uZmlnLFxuICAgIHJlc2l6ZUJpbGluZWFyR3JhZENvbmZpZyxcbiAgICByZXNpemVOZWFyZXN0TmVpZ2hib3JDb25maWcsXG4gICAgcmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZENvbmZpZyxcbiAgICByZXZlcnNlQ29uZmlnLFxuICAgIHJvdGF0ZVdpdGhPZmZzZXRDb25maWcsXG4gICAgcm91bmRDb25maWcsXG4gICAgcnNxcnRDb25maWcsXG4gICAgc2NhdHRlck5kQ29uZmlnLFxuICAgIHNlbGVjdENvbmZpZyxcbiAgICBzZWx1Q29uZmlnLFxuICAgIHNpZ21vaWRDb25maWcsXG4gICAgc2lnbkNvbmZpZyxcbiAgICBzaW5Db25maWcsXG4gICAgc2luaENvbmZpZyxcbiAgICBzbGljZUNvbmZpZyxcbiAgICBzb2Z0bWF4Q29uZmlnLFxuICAgIHNvZnRwbHVzQ29uZmlnLFxuICAgIHNwYWNlVG9CYXRjaE5EQ29uZmlnLFxuICAgIHNwYXJzZUZpbGxFbXB0eVJvd3NDb25maWcsXG4gICAgc3BhcnNlUmVzaGFwZUNvbmZpZyxcbiAgICBzcGFyc2VTZWdtZW50TWVhbkNvbmZpZyxcbiAgICBzcGFyc2VTZWdtZW50U3VtQ29uZmlnLFxuICAgIHNwYXJzZVRvRGVuc2VDb25maWcsXG4gICAgc3BsaXRWQ29uZmlnLFxuICAgIHNxcnRDb25maWcsXG4gICAgc3F1YXJlQ29uZmlnLFxuICAgIHNxdWFyZWREaWZmZXJlbmNlQ29uZmlnLFxuICAgIHN0ZXBDb25maWcsXG4gICAgc3RyaWRlZFNsaWNlQ29uZmlnLFxuICAgIHN0cmluZ05HcmFtc0NvbmZpZyxcbiAgICBzdHJpbmdTcGxpdENvbmZpZyxcbiAgICBzdHJpbmdUb0hhc2hCdWNrZXRGYXN0Q29uZmlnLFxuICAgIHN1YkNvbmZpZyxcbiAgICBzdW1Db25maWcsXG4gICAgdGFuQ29uZmlnLFxuICAgIHRhbmhDb25maWcsXG4gICAgdGlsZUNvbmZpZyxcbiAgICB0b3BLQ29uZmlnLFxuICAgIHRyYW5zZm9ybUNvbmZpZyxcbiAgICB0cmFuc3Bvc2VDb25maWcsXG4gICAgdW5pcXVlQ29uZmlnLFxuICAgIHVucGFja0NvbmZpZyxcbiAgICB1bnNvcnRlZFNlZ21lbnRTdW1Db25maWcsXG4gICAgemVyb3NMaWtlQ29uZmlnXG5dO1xuZm9yIChjb25zdCBrZXJuZWxDb25maWcgb2Yga2VybmVsQ29uZmlncykge1xuICAgIHJlZ2lzdGVyS2VybmVsKGtlcm5lbENvbmZpZyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWdpc3Rlcl9hbGxfa2VybmVscy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgKiBhcyBzaGFkZXJfdXRpbCBmcm9tICcuL3NoYWRlcl9jb21waWxlcl91dGlsJztcbmV4cG9ydCBjbGFzcyBSZXNoYXBlUGFja2VkUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3Iob3V0cHV0U2hhcGUsIGlucHV0U2hhcGUpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWydBJ107XG4gICAgICAgIHRoaXMucGFja2VkSW5wdXRzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wYWNrZWRPdXRwdXQgPSB0cnVlO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGU7XG4gICAgICAgIGxldCBtYWluTG9vcCA9IGBgO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgICAgICAgICAgbGV0IHRoaXNSQyA9IGB0aGlzUkMgPSByYztgO1xuICAgICAgICAgICAgaWYgKGkgJSAyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgdGhpc1JDICs9IGB0aGlzUkMueiArPSAxO2A7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaSA+IDEpIHtcbiAgICAgICAgICAgICAgICB0aGlzUkMgKz0gYHRoaXNSQy55ICs9IDE7YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1haW5Mb29wICs9IGBcbiAgICAgICAgJHt0aGlzUkN9XG4gICAgICAgICR7aSA+IDAgPyBgaWYodGhpc1JDLnkgPCByb3dzICYmIHRoaXNSQy56IDwgY29scyl7YCA6ICcnfVxuICAgICAgICAgIGludCBmbGF0SW5kZXggPSBnZXRGbGF0SW5kZXgodGhpc1JDKTtcblxuICAgICAgICAgIGl2ZWMzIGlucHV0UkMgPSBpbnB1dENvb3Jkc0Zyb21SZXNoYXBlZE91dENvb3JkcyhmbGF0SW5kZXgpO1xuICAgICAgICAgIHZlYzIgaW5wdXRSQ0lubmVyRGltcyA9IHZlYzIoZmxvYXQoaW5wdXRSQy55KSxmbG9hdChpbnB1dFJDLnopKTtcblxuICAgICAgICAgIHJlc3VsdFske2l9XSA9XG4gICAgICAgICAgICBnZXRDaGFubmVsKGdldEEoaW5wdXRSQy54LCBpbnB1dFJDLnksIGlucHV0UkMueiksIGlucHV0UkNJbm5lckRpbXMpO1xuICAgICAgICAke2kgPiAwID8gJ30nIDogJyd9XG4gICAgICBgO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAke2dldFJlc2hhcGVkSW5wdXRDb29yZHMoaW5wdXRTaGFwZSl9XG4gICAgICAke3NoYWRlcl91dGlsLmdldEZsYXRJbmRleEZyb20zRChvdXRwdXRTaGFwZSl9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzMgcmMgPSBnZXRPdXRwdXRDb29yZHMoKTtcblxuICAgICAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoMC4pO1xuXG4gICAgICAgIGl2ZWMzIHRoaXNSQztcbiAgICAgICAgaW50IHJvd3MgPSAke291dHB1dFNoYXBlWzFdfTtcbiAgICAgICAgaW50IGNvbHMgPSAke291dHB1dFNoYXBlWzJdfTtcblxuICAgICAgICAke21haW5Mb29wfVxuXG4gICAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0UmVzaGFwZWRJbnB1dENvb3JkcyhzaGFwZSkge1xuICAgIGNvbnN0IGNvb3Jkc0Zyb21JbmRleFNuaXBwZXQgPSBzaGFkZXJfdXRpbC5nZXRMb2dpY2FsQ29vcmRpbmF0ZXNGcm9tRmxhdEluZGV4KFsncicsICdjJywgJ2QnXSwgc2hhcGUpO1xuICAgIHJldHVybiBgXG4gICAgaXZlYzMgaW5wdXRDb29yZHNGcm9tUmVzaGFwZWRPdXRDb29yZHMoaW50IGluZGV4KSB7XG4gICAgICAke2Nvb3Jkc0Zyb21JbmRleFNuaXBwZXR9XG4gICAgICByZXR1cm4gaXZlYzMociwgYywgZCk7XG4gICAgfVxuICBgO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVzaGFwZV9wYWNrZWRfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmV4cG9ydCBjbGFzcyBSZXNpemVCaWxpbmVhckJhY2twcm9wUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoZHlTaGFwZSwgaW5wdXRTaGFwZSwgYWxpZ25Db3JuZXJzKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsnZHknXTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IFtdO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gaW5wdXRTaGFwZTtcbiAgICAgICAgY29uc3QgWywgeEhlaWdodCwgeFdpZHRoLF0gPSBpbnB1dFNoYXBlO1xuICAgICAgICBjb25zdCBbLCB5SGVpZ2h0LCB5V2lkdGhdID0gZHlTaGFwZTtcbiAgICAgICAgLy8gSW4gdGhlIGJhY2t3YXJkcyBwYXNzLCB3ZSB3YW50IHRvIGZpbmQgdGhlIHBpeGVscyB0aGF0IHdlcmUgZ2VuZXJhdGVkIGZvclxuICAgICAgICAvLyBlYWNoIHBpeGVsIGluIHRoZSBpbnB1dCBpbWFnZSB0aGUgZm9yd2FyZCBwYXNzIGFuZCBhZGQgdGhlIGNvcnJlc3BvbmRpbmdcbiAgICAgICAgLy8gY29lZmZpY2llbnQgZnJvbSBkeSB0byB0aGUgZ3JhZGllbnQgKHdpdGggc29tZSBpbnRlcnBvbGF0aW9uKS5cbiAgICAgICAgY29uc3QgZWZmZWN0aXZlWFNpemUgPSBbXG4gICAgICAgICAgICAoYWxpZ25Db3JuZXJzICYmIHlIZWlnaHQgPiAxKSA/IHhIZWlnaHQgLSAxIDogeEhlaWdodCxcbiAgICAgICAgICAgIChhbGlnbkNvcm5lcnMgJiYgeVdpZHRoID4gMSkgPyB4V2lkdGggLSAxIDogeFdpZHRoXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZVlTaXplID0gW1xuICAgICAgICAgICAgKGFsaWduQ29ybmVycyAmJiB5SGVpZ2h0ID4gMSkgPyB5SGVpZ2h0IC0gMSA6IHlIZWlnaHQsXG4gICAgICAgICAgICAoYWxpZ25Db3JuZXJzICYmIHlXaWR0aCA+IDEpID8geVdpZHRoIC0gMSA6IHlXaWR0aFxuICAgICAgICBdO1xuICAgICAgICBjb25zdCBoZWlnaHRTY2FsZSA9IGVmZmVjdGl2ZVhTaXplWzBdIC8gZWZmZWN0aXZlWVNpemVbMF07XG4gICAgICAgIGNvbnN0IHdpZHRoU2NhbGUgPSBlZmZlY3RpdmVYU2l6ZVsxXSAvIGVmZmVjdGl2ZVlTaXplWzFdO1xuICAgICAgICBjb25zdCBpbnZIZWlnaHRTY2FsZSA9IDEgLyBoZWlnaHRTY2FsZTtcbiAgICAgICAgY29uc3QgaW52V2lkdGhTY2FsZSA9IDEgLyB3aWR0aFNjYWxlO1xuICAgICAgICAvLyBUaGlzIGRlZmluZXMgdGhlIHNpemUgb2YgdGhlIHdpbmRvdyBvZiB2YWx1ZXMgYXJvdW5kIGEgcGFydGljdWxhclxuICAgICAgICAvLyBpbmRleCBpbiBkeSB0aGF0IHdlIHdhbnQgdG8gc2VhcmNoIGZvciBjb250cmlidXRpb25zIHRvIGR4LlxuICAgICAgICBjb25zdCB3aW5IZWlnaHQgPSAoTWF0aC5jZWlsKGludkhlaWdodFNjYWxlKSAqIDIpICsgMjtcbiAgICAgICAgY29uc3Qgd2luV2lkdGggPSAoTWF0aC5jZWlsKGludldpZHRoU2NhbGUpICogMikgKyAyO1xuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGIgPSBjb29yZHNbMF07XG4gICAgICAgIGludCBkID0gY29vcmRzWzNdO1xuICAgICAgICBpbnQgciA9IGNvb3Jkc1sxXTtcbiAgICAgICAgaW50IGMgPSBjb29yZHNbMl07XG5cbiAgICAgICAgZmxvYXQgYWNjdW11bGF0b3IgPSAwLjA7XG5cbiAgICAgICAgY29uc3QgZmxvYXQgaGVpZ2h0U2NhbGUgPSBmbG9hdCgke2hlaWdodFNjYWxlfSk7XG4gICAgICAgIGNvbnN0IGZsb2F0IHdpZHRoU2NhbGUgPSBmbG9hdCgke3dpZHRoU2NhbGV9KTtcblxuICAgICAgICBjb25zdCBmbG9hdCBpbnZIZWlnaHRTY2FsZSA9IGZsb2F0KCR7aW52SGVpZ2h0U2NhbGV9KTtcbiAgICAgICAgY29uc3QgZmxvYXQgaW52V2lkdGhTY2FsZSA9IGZsb2F0KCR7aW52V2lkdGhTY2FsZX0pO1xuXG4gICAgICAgIGNvbnN0IGludCB3aW5IZWlnaHQgPSBpbnQoJHt3aW5IZWlnaHR9KTtcbiAgICAgICAgY29uc3QgaW50IHdpbldpZHRoID0gaW50KCR7d2luV2lkdGh9KTtcblxuICAgICAgICAvLyBDb21wdXRlIGJvdW5kcyBmb3Igd2hlcmUgaW4gZHkgd2Ugd2lsbCBsb29rXG4gICAgICAgIGZsb2F0IHN0YXJ0UkxlcnAgPSBmbG9vcihmbG9hdChyKSAqIGludkhlaWdodFNjYWxlKTtcbiAgICAgICAgaW50IHN0YXJ0RHlSID0gaW50KHN0YXJ0UkxlcnAgLSBmbG9hdCh3aW5IZWlnaHQgLyAyKSk7XG5cbiAgICAgICAgZmxvYXQgc3RhcnRDTGVycCA9IGZsb29yKGZsb2F0KGMpICogaW52V2lkdGhTY2FsZSk7XG4gICAgICAgIGludCBzdGFydER5QyA9IGludChzdGFydENMZXJwIC0gZmxvYXQod2luV2lkdGggLyAyKSk7XG5cbiAgICAgICAgLy8gTG9vcCBvdmVyIGR5XG4gICAgICAgIGZvciAoaW50IGR5Uk9mZnNldCA9IDA7IGR5Uk9mZnNldCA8IHdpbkhlaWdodDsgZHlST2Zmc2V0KyspIHtcbiAgICAgICAgICBpbnQgZHlSID0gZHlST2Zmc2V0ICsgc3RhcnREeVI7XG5cbiAgICAgICAgICAvLyBHdWFyZCBhZ2FpbnN0IHRoZSB3aW5kb3cgZXhjZWVkaW5nIHRoZSBib3VuZHMgb2YgZHlcbiAgICAgICAgICBpZiAoZHlSIDwgMCB8fCBkeVIgPj0gJHt5SGVpZ2h0fSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yIChpbnQgZHlDT2Zmc2V0ID0gMDsgZHlDT2Zmc2V0IDwgd2luV2lkdGg7IGR5Q09mZnNldCsrKSB7XG4gICAgICAgICAgICBpbnQgZHlDID0gZHlDT2Zmc2V0ICsgc3RhcnREeUM7XG5cbiAgICAgICAgICAgIC8vIEd1YXJkIGFnYWluc3QgdGhlIHdpbmRvdyBleGNlZWRpbmcgdGhlIGJvdW5kcyBvZiBkeVxuICAgICAgICAgICAgaWYgKGR5QyA8IDAgfHwgZHlDID49ICR7eVdpZHRofSkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZmxvYXQgZHhSID0gZmxvYXQoZHlSKSAqIGhlaWdodFNjYWxlO1xuICAgICAgICAgICAgaW50IHRvcER4UkluZGV4ID0gaW50KGZsb29yKGR4UikpO1xuICAgICAgICAgICAgaW50IGJvdHRvbUR4UkluZGV4ID0gaW50KG1pbihjZWlsKGR4UiksICR7eEhlaWdodCAtIDF9LjApKTtcbiAgICAgICAgICAgIGZsb2F0IGR4UkxlcnAgPSBkeFIgLSBmbG9hdCh0b3BEeFJJbmRleCk7XG4gICAgICAgICAgICBmbG9hdCBpbnZlcnNlRHhSTGVycCA9IDEuMCAtIGR4UkxlcnA7XG5cbiAgICAgICAgICAgIGZsb2F0IGR4QyA9IGZsb2F0KGR5QykgKiB3aWR0aFNjYWxlO1xuICAgICAgICAgICAgaW50IGxlZnREeENJbmRleCA9IGludChmbG9vcihkeEMpKTtcbiAgICAgICAgICAgIGludCByaWdodER4Q0luZGV4ID0gaW50KG1pbihjZWlsKGR4QyksICR7eFdpZHRoIC0gMX0uMCkpO1xuICAgICAgICAgICAgZmxvYXQgZHhDTGVycCA9IGR4QyAtIGZsb2F0KGxlZnREeENJbmRleCk7XG4gICAgICAgICAgICBmbG9hdCBpbnZlcnNlRHhDTGVycCA9IDEuMCAtIGR4Q0xlcnA7XG5cbiAgICAgICAgICAgIGlmIChyID09IHRvcER4UkluZGV4ICYmIGMgPT0gbGVmdER4Q0luZGV4KSB7XG4gICAgICAgICAgICAgIC8vIHRvcExlZnRcbiAgICAgICAgICAgICAgYWNjdW11bGF0b3IgKz1cbiAgICAgICAgICAgICAgICBnZXREeShiLCBkeVIsIGR5QywgZCkgKiBpbnZlcnNlRHhSTGVycCAqIGludmVyc2VEeENMZXJwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAociA9PSB0b3BEeFJJbmRleCAmJiBjID09IHJpZ2h0RHhDSW5kZXgpIHtcbiAgICAgICAgICAgICAgLy8gdG9wUmlnaHRcbiAgICAgICAgICAgICAgYWNjdW11bGF0b3IgKz0gZ2V0RHkoYiwgZHlSLCBkeUMsIGQpICogaW52ZXJzZUR4UkxlcnAgKiBkeENMZXJwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAociA9PSBib3R0b21EeFJJbmRleCAmJiBjID09IGxlZnREeENJbmRleCkge1xuICAgICAgICAgICAgICAvLyBib3R0b21MZWZ0XG4gICAgICAgICAgICAgIGFjY3VtdWxhdG9yICs9IGdldER5KGIsIGR5UiwgZHlDLCBkKSAqIGR4UkxlcnAgKiBpbnZlcnNlRHhDTGVycDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHIgPT0gYm90dG9tRHhSSW5kZXggJiYgYyA9PSByaWdodER4Q0luZGV4KSB7XG4gICAgICAgICAgICAgIC8vIGJvdHRvbVJpZ2h0XG4gICAgICAgICAgICAgIGFjY3VtdWxhdG9yICs9IGdldER5KGIsIGR5UiwgZHlDLCBkKSAqIGR4UkxlcnAgKiBkeENMZXJwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBFbmQgbG9vcCBvdmVyIGR5XG5cbiAgICAgICAgc2V0T3V0cHV0KGFjY3VtdWxhdG9yKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlc2l6ZV9iaWxpbmVhcl9iYWNrcHJvcF9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuZXhwb3J0IGNsYXNzIFJlc2l6ZUJpbGluZWFyUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoaW5wdXRTaGFwZSwgbmV3SGVpZ2h0LCBuZXdXaWR0aCwgYWxpZ25Db3JuZXJzLCBoYWxmUGl4ZWxDZW50ZXJzKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gW107XG4gICAgICAgIGNvbnN0IFtiYXRjaCwgb2xkSGVpZ2h0LCBvbGRXaWR0aCwgZGVwdGhdID0gaW5wdXRTaGFwZTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IFtiYXRjaCwgbmV3SGVpZ2h0LCBuZXdXaWR0aCwgZGVwdGhdO1xuICAgICAgICBjb25zdCBlZmZlY3RpdmVJblNpemUgPSBbXG4gICAgICAgICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld0hlaWdodCA+IDEpID8gb2xkSGVpZ2h0IC0gMSA6IG9sZEhlaWdodCxcbiAgICAgICAgICAgIChhbGlnbkNvcm5lcnMgJiYgbmV3V2lkdGggPiAxKSA/IG9sZFdpZHRoIC0gMSA6IG9sZFdpZHRoXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZU91dFNpemUgPSBbXG4gICAgICAgICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld0hlaWdodCA+IDEpID8gbmV3SGVpZ2h0IC0gMSA6IG5ld0hlaWdodCxcbiAgICAgICAgICAgIChhbGlnbkNvcm5lcnMgJiYgbmV3V2lkdGggPiAxKSA/IG5ld1dpZHRoIC0gMSA6IG5ld1dpZHRoXG4gICAgICAgIF07XG4gICAgICAgIGxldCBzb3VyY2VGcmFjSW5kZXhSQztcbiAgICAgICAgaWYgKGhhbGZQaXhlbENlbnRlcnMpIHtcbiAgICAgICAgICAgIHNvdXJjZUZyYWNJbmRleFJDID1cbiAgICAgICAgICAgICAgICBgKHZlYzIoeVJDKSArIHZlYzIoMC41KSkgKiBlZmZlY3RpdmVJbnB1dE92ZXJPdXRwdXRSYXRpb1JDYCArXG4gICAgICAgICAgICAgICAgICAgIGAgLSB2ZWMyKDAuNSlgO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc291cmNlRnJhY0luZGV4UkMgPSBgdmVjMih5UkMpICogZWZmZWN0aXZlSW5wdXRPdmVyT3V0cHV0UmF0aW9SQ2A7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IHZlYzIgZWZmZWN0aXZlSW5wdXRPdmVyT3V0cHV0UmF0aW9SQyA9IHZlYzIoXG4gICAgICAgICAgJHtlZmZlY3RpdmVJblNpemVbMF0gLyBlZmZlY3RpdmVPdXRTaXplWzBdfSxcbiAgICAgICAgICAke2VmZmVjdGl2ZUluU2l6ZVsxXSAvIGVmZmVjdGl2ZU91dFNpemVbMV19KTtcbiAgICAgIGNvbnN0IHZlYzIgaW5wdXRTaGFwZVJDID0gdmVjMigke29sZEhlaWdodH0uMCwgJHtvbGRXaWR0aH0uMCk7XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgZCA9IGNvb3Jkc1szXTtcbiAgICAgICAgaXZlYzIgeVJDID0gY29vcmRzLnl6O1xuXG4gICAgICAgIC8vIEZyYWN0aW9uYWwgc291cmNlIGluZGV4LlxuICAgICAgICB2ZWMyIHNvdXJjZUZyYWNJbmRleFJDID0gJHtzb3VyY2VGcmFjSW5kZXhSQ307XG5cbiAgICAgICAgLy8gQ29tcHV0ZSB0aGUgZm91ciBpbnRlZ2VyIGluZGljZXMuXG4gICAgICAgIGl2ZWMyIHNvdXJjZUZsb29yUkMgPSBpdmVjMihtYXgoc291cmNlRnJhY0luZGV4UkMsIHZlYzIoMC4wKSkpO1xuICAgICAgICBpdmVjMiBzb3VyY2VDZWlsUkMgPSBpdmVjMihcbiAgICAgICAgICBtaW4oaW5wdXRTaGFwZVJDIC0gMS4wLCBjZWlsKHNvdXJjZUZyYWNJbmRleFJDKSkpO1xuXG4gICAgICAgIGZsb2F0IHRvcExlZnQgPSBnZXRBKGIsIHNvdXJjZUZsb29yUkMueCwgc291cmNlRmxvb3JSQy55LCBkKTtcbiAgICAgICAgZmxvYXQgYm90dG9tTGVmdCA9IGdldEEoYiwgc291cmNlQ2VpbFJDLngsIHNvdXJjZUZsb29yUkMueSwgZCk7XG4gICAgICAgIGZsb2F0IHRvcFJpZ2h0ID0gZ2V0QShiLCBzb3VyY2VGbG9vclJDLngsIHNvdXJjZUNlaWxSQy55LCBkKTtcbiAgICAgICAgZmxvYXQgYm90dG9tUmlnaHQgPSBnZXRBKGIsIHNvdXJjZUNlaWxSQy54LCBzb3VyY2VDZWlsUkMueSwgZCk7XG5cbiAgICAgICAgdmVjMiBmcmFjUkMgPSBzb3VyY2VGcmFjSW5kZXhSQyAtIHZlYzIoc291cmNlRmxvb3JSQyk7XG5cbiAgICAgICAgZmxvYXQgdG9wID0gdG9wTGVmdCArICh0b3BSaWdodCAtIHRvcExlZnQpICogZnJhY1JDLnk7XG4gICAgICAgIGZsb2F0IGJvdHRvbSA9IGJvdHRvbUxlZnQgKyAoYm90dG9tUmlnaHQgLSBib3R0b21MZWZ0KSAqIGZyYWNSQy55O1xuICAgICAgICBmbG9hdCBuZXdWYWx1ZSA9IHRvcCArIChib3R0b20gLSB0b3ApICogZnJhY1JDLng7XG5cbiAgICAgICAgc2V0T3V0cHV0KG5ld1ZhbHVlKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlc2l6ZV9iaWxpbmVhcl9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuZXhwb3J0IGNsYXNzIFJlc2l6ZUJpbGluZWFyUGFja2VkUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoaW5wdXRTaGFwZSwgbmV3SGVpZ2h0LCBuZXdXaWR0aCwgYWxpZ25Db3JuZXJzLCBoYWxmUGl4ZWxDZW50ZXJzKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICAgICAgICB0aGlzLnBhY2tlZElucHV0cyA9IHRydWU7XG4gICAgICAgIHRoaXMucGFja2VkT3V0cHV0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IFtdO1xuICAgICAgICBjb25zdCBbYmF0Y2gsIG9sZEhlaWdodCwgb2xkV2lkdGgsIGRlcHRoXSA9IGlucHV0U2hhcGU7XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBbYmF0Y2gsIG5ld0hlaWdodCwgbmV3V2lkdGgsIGRlcHRoXTtcbiAgICAgICAgY29uc3QgZWZmZWN0aXZlSW5TaXplID0gW1xuICAgICAgICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdIZWlnaHQgPiAxKSA/IG9sZEhlaWdodCAtIDEgOiBvbGRIZWlnaHQsXG4gICAgICAgICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld1dpZHRoID4gMSkgPyBvbGRXaWR0aCAtIDEgOiBvbGRXaWR0aFxuICAgICAgICBdO1xuICAgICAgICBjb25zdCBlZmZlY3RpdmVPdXRTaXplID0gW1xuICAgICAgICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdIZWlnaHQgPiAxKSA/IG5ld0hlaWdodCAtIDEgOiBuZXdIZWlnaHQsXG4gICAgICAgICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld1dpZHRoID4gMSkgPyBuZXdXaWR0aCAtIDEgOiBuZXdXaWR0aFxuICAgICAgICBdO1xuICAgICAgICBsZXQgc291cmNlRnJhY0luZGV4UkM7XG4gICAgICAgIGlmIChoYWxmUGl4ZWxDZW50ZXJzKSB7XG4gICAgICAgICAgICBzb3VyY2VGcmFjSW5kZXhSQyA9IGAodmVjMyh5UkMpICsgdmVjMygwLjUpKSAqIGAgK1xuICAgICAgICAgICAgICAgIGBlZmZlY3RpdmVJbnB1dE92ZXJPdXRwdXRSYXRpb1JDIC0gdmVjMygwLjUpYDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNvdXJjZUZyYWNJbmRleFJDID0gYHZlYzMoeVJDKSAqIGVmZmVjdGl2ZUlucHV0T3Zlck91dHB1dFJhdGlvUkNgO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCB2ZWMzIGVmZmVjdGl2ZUlucHV0T3Zlck91dHB1dFJhdGlvUkMgPSB2ZWMzKFxuICAgICAgICAgICR7ZWZmZWN0aXZlSW5TaXplWzBdIC8gZWZmZWN0aXZlT3V0U2l6ZVswXX0sXG4gICAgICAgICAgJHtlZmZlY3RpdmVJblNpemVbMV0gLyBlZmZlY3RpdmVPdXRTaXplWzFdfSxcbiAgICAgICAgICAke2VmZmVjdGl2ZUluU2l6ZVsxXSAvIGVmZmVjdGl2ZU91dFNpemVbMV19KTtcbiAgICAgIGNvbnN0IHZlYzMgaW5wdXRTaGFwZVJDID0gdmVjMygke29sZEhlaWdodH0uMCwgJHtvbGRXaWR0aH0uMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke29sZFdpZHRofS4wKTtcblxuICAgICAgZmxvYXQgZ2V0QVZhbHVlKGludCBiLCBpbnQgciwgaW50IGMsIGludCBkKSB7XG4gICAgICAgIHJldHVybiBnZXRDaGFubmVsKGdldEEoYiwgciwgYywgZCksIHZlYzIoYywgZCkpO1xuICAgICAgfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYiA9IGNvb3Jkc1swXTtcbiAgICAgICAgaW50IGQgPSBjb29yZHNbM107XG4gICAgICAgIC8vIENhbGN1bGF0ZSB2YWx1ZXMgZm9yIG5leHQgY29sdW1uIGluIHlSQy56LlxuICAgICAgICBpdmVjMyB5UkMgPSBjb29yZHMueXp6ICsgaXZlYzMoMCwgMCwgMSk7XG5cbiAgICAgICAgLy8gRnJhY3Rpb25hbCBzb3VyY2UgaW5kZXguXG4gICAgICAgIHZlYzMgc291cmNlRnJhY0luZGV4UkMgPSAke3NvdXJjZUZyYWNJbmRleFJDfTtcblxuICAgICAgICAvLyBDb21wdXRlIHRoZSBmb3VyIGludGVnZXIgaW5kaWNlcy5cbiAgICAgICAgaXZlYzMgc291cmNlRmxvb3JSQyA9IGl2ZWMzKG1heChzb3VyY2VGcmFjSW5kZXhSQywgdmVjMygwLjApKSk7XG4gICAgICAgIGl2ZWMzIHNvdXJjZUNlaWxSQyA9IGl2ZWMzKFxuICAgICAgICAgIG1pbihpbnB1dFNoYXBlUkMgLSAxLjAsIGNlaWwoc291cmNlRnJhY0luZGV4UkMpKSk7XG5cbiAgICAgICAgLy8gU2hvdWxkIHdlIGNhbGN1bGF0ZSBuZXh0IGNvbHVtbiBhbmQgcm93IGVsZW1lbnRzIGluIDJ4MiBwYWNrZWQgY2VsbC5cbiAgICAgICAgYm9vbCBoYXNOZXh0Q29sID0gZCA8ICR7ZGVwdGggLSAxfTtcbiAgICAgICAgYm9vbCBoYXNOZXh0Um93ID0gY29vcmRzLnogPCAke25ld1dpZHRoIC0gMX07XG5cbiAgICAgICAgLy8gSW4gcGFyYWxsZWwsIGNvbnN0cnVjdCBmb3VyIGNvcm5lcnMgZm9yIGFsbCBmb3VyIGNvbXBvbmVudHMgaW5cbiAgICAgICAgLy8gcGFja2VkIDJ4MiBjZWxsLlxuICAgICAgICB2ZWM0IHRvcExlZnQgPSB2ZWM0KFxuICAgICAgICAgIGdldEFWYWx1ZShiLCBzb3VyY2VGbG9vclJDLngsIHNvdXJjZUZsb29yUkMueSwgZCksXG4gICAgICAgICAgaGFzTmV4dENvbCA/IGdldEFWYWx1ZShiLCBzb3VyY2VGbG9vclJDLngsIHNvdXJjZUZsb29yUkMueSwgZCArIDEpXG4gICAgICAgICAgICAgICAgICAgICA6IDAuMCxcbiAgICAgICAgICBoYXNOZXh0Um93ID8gZ2V0QVZhbHVlKGIsIHNvdXJjZUZsb29yUkMueCwgc291cmNlRmxvb3JSQy56LCBkKVxuICAgICAgICAgICAgICAgICAgICAgOiAwLjAsXG4gICAgICAgICAgKGhhc05leHRSb3cgJiYgaGFzTmV4dENvbCkgP1xuICAgICAgICAgICAgZ2V0QVZhbHVlKGIsIHNvdXJjZUZsb29yUkMueCwgc291cmNlRmxvb3JSQy56LCBkICsgMSkgOiAwLjApO1xuXG4gICAgICAgIHZlYzQgYm90dG9tTGVmdCA9IHZlYzQoXG4gICAgICAgICAgZ2V0QVZhbHVlKGIsIHNvdXJjZUNlaWxSQy54LCBzb3VyY2VGbG9vclJDLnksIGQpLFxuICAgICAgICAgIGhhc05leHRDb2wgPyBnZXRBVmFsdWUoYiwgc291cmNlQ2VpbFJDLngsIHNvdXJjZUZsb29yUkMueSwgZCArIDEpXG4gICAgICAgICAgICAgICAgICAgICA6IDAuMCxcbiAgICAgICAgICBoYXNOZXh0Um93ID8gZ2V0QVZhbHVlKGIsIHNvdXJjZUNlaWxSQy54LCBzb3VyY2VGbG9vclJDLnosIGQpXG4gICAgICAgICAgICAgICAgICAgICA6IDAuMCxcbiAgICAgICAgICAoaGFzTmV4dFJvdyAmJiBoYXNOZXh0Q29sKSA/XG4gICAgICAgICAgICBnZXRBVmFsdWUoYiwgc291cmNlQ2VpbFJDLngsIHNvdXJjZUZsb29yUkMueiwgZCArIDEpIDogMC4wKTtcblxuICAgICAgICB2ZWM0IHRvcFJpZ2h0ID0gdmVjNChcbiAgICAgICAgICBnZXRBVmFsdWUoYiwgc291cmNlRmxvb3JSQy54LCBzb3VyY2VDZWlsUkMueSwgZCksXG4gICAgICAgICAgaGFzTmV4dENvbCA/IGdldEFWYWx1ZShiLCBzb3VyY2VGbG9vclJDLngsIHNvdXJjZUNlaWxSQy55LCBkICsgMSlcbiAgICAgICAgICAgICAgICAgICAgIDogMC4wLFxuICAgICAgICAgIGhhc05leHRSb3cgPyBnZXRBVmFsdWUoYiwgc291cmNlRmxvb3JSQy54LCBzb3VyY2VDZWlsUkMueiwgZClcbiAgICAgICAgICAgICAgICAgICAgIDogMC4wLFxuICAgICAgICAgIChoYXNOZXh0Um93ICYmIGhhc05leHRDb2wpID9cbiAgICAgICAgICAgIGdldEFWYWx1ZShiLCBzb3VyY2VGbG9vclJDLngsIHNvdXJjZUNlaWxSQy56LCBkICsgMSkgOiAwLjApO1xuXG4gICAgICAgIHZlYzQgYm90dG9tUmlnaHQgPSB2ZWM0KFxuICAgICAgICAgIGdldEFWYWx1ZShiLCBzb3VyY2VDZWlsUkMueCwgc291cmNlQ2VpbFJDLnksIGQpLFxuICAgICAgICAgIGhhc05leHRDb2wgPyBnZXRBVmFsdWUoYiwgc291cmNlQ2VpbFJDLngsIHNvdXJjZUNlaWxSQy55LCBkICsgMSlcbiAgICAgICAgICAgICAgICAgICAgIDogMC4wLFxuICAgICAgICAgIGhhc05leHRSb3cgPyBnZXRBVmFsdWUoYiwgc291cmNlQ2VpbFJDLngsIHNvdXJjZUNlaWxSQy56LCBkKVxuICAgICAgICAgICAgICAgICAgICAgOiAwLjAsXG4gICAgICAgICAgKGhhc05leHRSb3cgJiYgaGFzTmV4dENvbCkgP1xuICAgICAgICAgICAgZ2V0QVZhbHVlKGIsIHNvdXJjZUNlaWxSQy54LCBzb3VyY2VDZWlsUkMueiwgZCArIDEpIDogMC4wKTtcblxuICAgICAgICB2ZWMzIGZyYWNSQyA9IHNvdXJjZUZyYWNJbmRleFJDIC0gdmVjMyhzb3VyY2VGbG9vclJDKTtcblxuICAgICAgICB2ZWM0IHRvcCA9IG1peCh0b3BMZWZ0LCB0b3BSaWdodCwgZnJhY1JDLnl5enopO1xuICAgICAgICB2ZWM0IGJvdHRvbSA9IG1peChib3R0b21MZWZ0LCBib3R0b21SaWdodCwgZnJhY1JDLnl5enopO1xuICAgICAgICB2ZWM0IG5ld1ZhbHVlID0gbWl4KHRvcCwgYm90dG9tLCBmcmFjUkMueCk7XG5cbiAgICAgICAgc2V0T3V0cHV0KG5ld1ZhbHVlKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlc2l6ZV9iaWxpbmVhcl9wYWNrZWRfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmV4cG9ydCBjbGFzcyBSZXNpemVOZWFyZXN0TmVpZ2JvckJhY2twcm9wUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoZHlTaGFwZSwgaW5wdXRTaGFwZSwgYWxpZ25Db3JuZXJzKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsnZHknXTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IFtdO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gaW5wdXRTaGFwZTtcbiAgICAgICAgY29uc3QgWywgeEhlaWdodCwgeFdpZHRoLF0gPSBpbnB1dFNoYXBlO1xuICAgICAgICBjb25zdCBbLCB5SGVpZ2h0LCB5V2lkdGhdID0gZHlTaGFwZTtcbiAgICAgICAgLy8gSW4gdGhlIGJhY2t3YXJkcyBwYXNzLCB3ZSB3YW50IHRvIGZpbmQgdGhlIHBpeGVscyB0aGF0IHdlcmUgZ2VuZXJhdGVkIGZvclxuICAgICAgICAvLyBlYWNoIHBpeGVsIGluIHRoZSBpbnB1dCBpbWFnZSB0aGUgZm9yd2FyZCBwYXNzIGFuZCBhZGQgdGhlIGNvcnJlc3BvbmRpbmdcbiAgICAgICAgLy8gY29lZmZpY2llbnQgZnJvbSBkeSB0byB0aGUgZ3JhZGllbnQgKHdpdGggc29tZSBpbnRlcnBvbGF0aW9uKS5cbiAgICAgICAgY29uc3QgZWZmZWN0aXZlWFNpemUgPSBbXG4gICAgICAgICAgICAoYWxpZ25Db3JuZXJzICYmIHlIZWlnaHQgPiAxKSA/IHhIZWlnaHQgLSAxIDogeEhlaWdodCxcbiAgICAgICAgICAgIChhbGlnbkNvcm5lcnMgJiYgeVdpZHRoID4gMSkgPyB4V2lkdGggLSAxIDogeFdpZHRoXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZVlTaXplID0gW1xuICAgICAgICAgICAgKGFsaWduQ29ybmVycyAmJiB5SGVpZ2h0ID4gMSkgPyB5SGVpZ2h0IC0gMSA6IHlIZWlnaHQsXG4gICAgICAgICAgICAoYWxpZ25Db3JuZXJzICYmIHlXaWR0aCA+IDEpID8geVdpZHRoIC0gMSA6IHlXaWR0aFxuICAgICAgICBdO1xuICAgICAgICBjb25zdCBoZWlnaHRTY2FsZSA9IGVmZmVjdGl2ZVhTaXplWzBdIC8gZWZmZWN0aXZlWVNpemVbMF07XG4gICAgICAgIGNvbnN0IHdpZHRoU2NhbGUgPSBlZmZlY3RpdmVYU2l6ZVsxXSAvIGVmZmVjdGl2ZVlTaXplWzFdO1xuICAgICAgICBjb25zdCBpbnZIZWlnaHRTY2FsZSA9IDEgLyBoZWlnaHRTY2FsZTtcbiAgICAgICAgY29uc3QgaW52V2lkdGhTY2FsZSA9IDEgLyB3aWR0aFNjYWxlO1xuICAgICAgICAvLyBUaGlzIGRlZmluZXMgdGhlIHNpemUgb2YgdGhlIHdpbmRvdyBvZiB2YWx1ZXMgYXJvdW5kIGEgcGFydGljdWxhclxuICAgICAgICAvLyBpbmRleCBpbiBkeSB0aGF0IHdlIHdhbnQgdG8gc2VhcmNoIGZvciBjb250cmlidXRpb25zIHRvIGR4LlxuICAgICAgICBjb25zdCB3aW5IZWlnaHQgPSAoTWF0aC5jZWlsKGludkhlaWdodFNjYWxlKSAqIDIpICsgMjtcbiAgICAgICAgY29uc3Qgd2luV2lkdGggPSAoTWF0aC5jZWlsKGludldpZHRoU2NhbGUpICogMikgKyAyO1xuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGIgPSBjb29yZHNbMF07XG4gICAgICAgIGludCBkID0gY29vcmRzWzNdO1xuICAgICAgICBpbnQgciA9IGNvb3Jkc1sxXTtcbiAgICAgICAgaW50IGMgPSBjb29yZHNbMl07XG5cbiAgICAgICAgZmxvYXQgYWNjdW11bGF0b3IgPSAwLjA7XG5cbiAgICAgICAgY29uc3QgZmxvYXQgaGVpZ2h0U2NhbGUgPSBmbG9hdCgke2hlaWdodFNjYWxlfSk7XG4gICAgICAgIGNvbnN0IGZsb2F0IHdpZHRoU2NhbGUgPSBmbG9hdCgke3dpZHRoU2NhbGV9KTtcblxuICAgICAgICBjb25zdCBmbG9hdCBpbnZIZWlnaHRTY2FsZSA9IGZsb2F0KCR7aW52SGVpZ2h0U2NhbGV9KTtcbiAgICAgICAgY29uc3QgZmxvYXQgaW52V2lkdGhTY2FsZSA9IGZsb2F0KCR7aW52V2lkdGhTY2FsZX0pO1xuXG4gICAgICAgIGNvbnN0IGludCB3aW5IZWlnaHQgPSBpbnQoJHt3aW5IZWlnaHR9KTtcbiAgICAgICAgY29uc3QgaW50IHdpbldpZHRoID0gaW50KCR7d2luV2lkdGh9KTtcblxuICAgICAgICAvLyBDb21wdXRlIGJvdW5kcyBmb3Igd2hlcmUgaW4gZHkgd2Ugd2lsbCBsb29rXG4gICAgICAgIGZsb2F0IHN0YXJ0UkxlcnAgPSBmbG9vcihmbG9hdChyKSAqIGludkhlaWdodFNjYWxlKTtcbiAgICAgICAgaW50IHN0YXJ0RHlSID0gaW50KGZsb29yKHN0YXJ0UkxlcnAgLSBmbG9hdCh3aW5IZWlnaHQgLyAyKSkpO1xuXG4gICAgICAgIGZsb2F0IHN0YXJ0Q0xlcnAgPSBmbG9vcihmbG9hdChjKSAqIGludldpZHRoU2NhbGUpO1xuICAgICAgICBpbnQgc3RhcnREeUMgPSBpbnQoZmxvb3Ioc3RhcnRDTGVycCAtIGZsb2F0KHdpbldpZHRoIC8gMikpKTtcblxuICAgICAgICAvLyBMb29wIG92ZXIgZHlcbiAgICAgICAgZm9yIChpbnQgZHlST2Zmc2V0ID0gMDsgZHlST2Zmc2V0IDwgd2luSGVpZ2h0OyBkeVJPZmZzZXQrKykge1xuICAgICAgICAgIGludCBkeVIgPSBkeVJPZmZzZXQgKyBzdGFydER5UjtcblxuICAgICAgICAgIC8vIEd1YXJkIGFnYWluc3QgdGhlIHdpbmRvdyBleGNlZWRpbmcgdGhlIGJvdW5kcyBvZiBkeVxuICAgICAgICAgIGlmIChkeVIgPCAwIHx8IGR5UiA+PSAke3lIZWlnaHR9KSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKGludCBkeUNPZmZzZXQgPSAwOyBkeUNPZmZzZXQgPCB3aW5XaWR0aDsgZHlDT2Zmc2V0KyspIHtcbiAgICAgICAgICAgIGludCBkeUMgPSBkeUNPZmZzZXQgKyBzdGFydER5QztcblxuICAgICAgICAgICAgLy8gR3VhcmQgYWdhaW5zdCB0aGUgd2luZG93IGV4Y2VlZGluZyB0aGUgYm91bmRzIG9mIGR5XG4gICAgICAgICAgICBpZiAoZHlDIDwgMCB8fCBkeUMgPj0gJHt5V2lkdGh9KSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmbG9hdCBzb3VyY2VGcmFjUm93ID1cbiAgICAgICAgICAgICAgZmxvYXQoJHtlZmZlY3RpdmVYU2l6ZVswXX0pICpcbiAgICAgICAgICAgICAgICAoZmxvYXQoZHlSKSAvIGZsb2F0KCR7ZWZmZWN0aXZlWVNpemVbMF19KSk7XG5cbiAgICAgICAgICAgIGZsb2F0IHNvdXJjZUZyYWNDb2wgPVxuICAgICAgICAgICAgICAgIGZsb2F0KCR7ZWZmZWN0aXZlWFNpemVbMV19KSAqXG4gICAgICAgICAgICAgICAgICAoZmxvYXQoZHlDKSAvIGZsb2F0KCR7ZWZmZWN0aXZlWVNpemVbMV19KSk7XG5cbiAgICAgICAgICAgIGludCBzb3VyY2VOZWFyZXN0Um93ID0gaW50KG1pbihcbiAgICAgICAgICAgICAgICBmbG9hdChpbnQoJHt4SGVpZ2h0fSkgLSAxKSxcbiAgICAgICAgICAgICAgICAke2FsaWduQ29ybmVyc30gPyBmbG9hdChyb3VuZChzb3VyY2VGcmFjUm93KSkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KGZsb29yKHNvdXJjZUZyYWNSb3cpKSkpO1xuXG4gICAgICAgICAgICBpbnQgc291cmNlTmVhcmVzdENvbCA9IGludChtaW4oXG4gICAgICAgICAgICAgICAgZmxvYXQoaW50KCR7eFdpZHRofSkgLSAxKSxcbiAgICAgICAgICAgICAgICAke2FsaWduQ29ybmVyc30gPyBmbG9hdChyb3VuZChzb3VyY2VGcmFjQ29sKSkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KGZsb29yKHNvdXJjZUZyYWNDb2wpKSkpO1xuXG4gICAgICAgICAgICBpZiAociA9PSBzb3VyY2VOZWFyZXN0Um93ICYmIGMgPT0gc291cmNlTmVhcmVzdENvbCkge1xuICAgICAgICAgICAgICBhY2N1bXVsYXRvciArPSBnZXREeShiLCBkeVIsIGR5QywgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEVuZCBsb29wIG92ZXIgZHlcblxuICAgICAgICBzZXRPdXRwdXQoYWNjdW11bGF0b3IpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVzaXplX25lYXJlc3RfbmVpZ2hib3JfYmFja3Byb3BfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmV4cG9ydCBjbGFzcyBSZXNpemVOZWFyZXN0TmVpZ2hib3JQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3RvcihpbnB1dFNoYXBlLCBuZXdIZWlnaHQsIG5ld1dpZHRoLCBhbGlnbkNvcm5lcnMsIGhhbGZQaXhlbENlbnRlcnMpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWydBJ107XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBbXTtcbiAgICAgICAgY29uc3QgW2JhdGNoLCBvbGRIZWlnaHQsIG9sZFdpZHRoLCBkZXB0aF0gPSBpbnB1dFNoYXBlO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gW2JhdGNoLCBuZXdIZWlnaHQsIG5ld1dpZHRoLCBkZXB0aF07XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZUluU2l6ZSA9IFtcbiAgICAgICAgICAgIChhbGlnbkNvcm5lcnMgJiYgbmV3SGVpZ2h0ID4gMSkgPyBvbGRIZWlnaHQgLSAxIDogb2xkSGVpZ2h0LFxuICAgICAgICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdXaWR0aCA+IDEpID8gb2xkV2lkdGggLSAxIDogb2xkV2lkdGhcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgZWZmZWN0aXZlT3V0U2l6ZSA9IFtcbiAgICAgICAgICAgIChhbGlnbkNvcm5lcnMgJiYgbmV3SGVpZ2h0ID4gMSkgPyBuZXdIZWlnaHQgLSAxIDogbmV3SGVpZ2h0LFxuICAgICAgICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdXaWR0aCA+IDEpID8gbmV3V2lkdGggLSAxIDogbmV3V2lkdGhcbiAgICAgICAgXTtcbiAgICAgICAgLy8gV2hlbiBhbGlnbiBjb3JuZXJzIGlzIGZhbHNlLCB3ZSByb3VuZHMgdGhlIHZhbHVlIHdpdGggZmxvb3IuXG4gICAgICAgIGNvbnN0IHJvdW5kQmFzZSA9IGFsaWduQ29ybmVycyA/ICcwLjUnIDogJzAuMCc7XG4gICAgICAgIGxldCBzb3VyY2VGcmFjSW5kZXhSQztcbiAgICAgICAgaWYgKGhhbGZQaXhlbENlbnRlcnMpIHtcbiAgICAgICAgICAgIHNvdXJjZUZyYWNJbmRleFJDID1cbiAgICAgICAgICAgICAgICBgbWF4KCh2ZWMyKHlSQykgKyB2ZWMyKDAuNSkpICogZWZmZWN0aXZlSW5wdXRPdmVyT3V0cHV0UmF0aW9SQ2AgK1xuICAgICAgICAgICAgICAgICAgICBgLCB2ZWMyKDAuMCkpYDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNvdXJjZUZyYWNJbmRleFJDID0gYHZlYzIoeVJDKSAqIGVmZmVjdGl2ZUlucHV0T3Zlck91dHB1dFJhdGlvUkNgO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCB2ZWMyIGVmZmVjdGl2ZUlucHV0T3Zlck91dHB1dFJhdGlvUkMgPSB2ZWMyKFxuICAgICAgICAgICR7ZWZmZWN0aXZlSW5TaXplWzBdIC8gZWZmZWN0aXZlT3V0U2l6ZVswXX0sXG4gICAgICAgICAgJHtlZmZlY3RpdmVJblNpemVbMV0gLyBlZmZlY3RpdmVPdXRTaXplWzFdfSk7XG4gICAgICBjb25zdCB2ZWMyIGlucHV0U2hhcGVSQyA9IHZlYzIoJHtvbGRIZWlnaHR9LjAsICR7b2xkV2lkdGh9LjApO1xuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYiA9IGNvb3Jkc1swXTtcbiAgICAgICAgaW50IGQgPSBjb29yZHNbM107XG4gICAgICAgIGl2ZWMyIHlSQyA9IGNvb3Jkcy55ejtcblxuICAgICAgICAvLyBGcmFjdGlvbmFsIHNvdXJjZSBpbmRleC5cbiAgICAgICAgdmVjMiBzb3VyY2VGcmFjSW5kZXhSQyA9ICR7c291cmNlRnJhY0luZGV4UkN9O1xuXG4gICAgICAgIC8vIENvbXB1dGUgdGhlIGNvb3JkaW5hdG9ycyBvZiBuZWFyZXN0IG5laWdoYm9yIHBvaW50LlxuICAgICAgICBpdmVjMiBzb3VyY2VOZWFyZXN0UkMgPSBpdmVjMihcbiAgICAgICAgICBtaW4oaW5wdXRTaGFwZVJDIC0gMS4wLCBmbG9vcihzb3VyY2VGcmFjSW5kZXhSQyArICR7cm91bmRCYXNlfSkpKTtcbiAgICAgICAgZmxvYXQgbmV3VmFsdWUgPSBnZXRBKGIsIHNvdXJjZU5lYXJlc3RSQy54LCBzb3VyY2VOZWFyZXN0UkMueSwgZCk7XG5cbiAgICAgICAgc2V0T3V0cHV0KG5ld1ZhbHVlKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlc2l6ZV9uZWFyZXN0X25laWdoYm9yX2dwdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5leHBvcnQgY2xhc3MgUmVzaXplTmVhcmVzdE5laWdoYm9yUGFja2VkUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoaW5wdXRTaGFwZSwgbmV3SGVpZ2h0LCBuZXdXaWR0aCwgYWxpZ25Db3JuZXJzLCBoYWxmUGl4ZWxDZW50ZXJzKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICAgICAgICB0aGlzLnBhY2tlZElucHV0cyA9IHRydWU7XG4gICAgICAgIHRoaXMucGFja2VkT3V0cHV0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IFtdO1xuICAgICAgICBjb25zdCBbYmF0Y2gsIG9sZEhlaWdodCwgb2xkV2lkdGgsIGRlcHRoXSA9IGlucHV0U2hhcGU7XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBbYmF0Y2gsIG5ld0hlaWdodCwgbmV3V2lkdGgsIGRlcHRoXTtcbiAgICAgICAgY29uc3QgZWZmZWN0aXZlSW5TaXplID0gW1xuICAgICAgICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdIZWlnaHQgPiAxKSA/IG9sZEhlaWdodCAtIDEgOiBvbGRIZWlnaHQsXG4gICAgICAgICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld1dpZHRoID4gMSkgPyBvbGRXaWR0aCAtIDEgOiBvbGRXaWR0aFxuICAgICAgICBdO1xuICAgICAgICBjb25zdCBlZmZlY3RpdmVPdXRTaXplID0gW1xuICAgICAgICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdIZWlnaHQgPiAxKSA/IG5ld0hlaWdodCAtIDEgOiBuZXdIZWlnaHQsXG4gICAgICAgICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld1dpZHRoID4gMSkgPyBuZXdXaWR0aCAtIDEgOiBuZXdXaWR0aFxuICAgICAgICBdO1xuICAgICAgICAvLyBXaGVuIGFsaWduIGNvcm5lcnMgaXMgZmFsc2UsIHdlIHJvdW5kcyB0aGUgdmFsdWUgd2l0aCBmbG9vci5cbiAgICAgICAgY29uc3Qgcm91bmRCYXNlID0gYWxpZ25Db3JuZXJzID8gJzAuNScgOiAnMC4wJztcbiAgICAgICAgbGV0IHNvdXJjZUZyYWNJbmRleFJDO1xuICAgICAgICBpZiAoaGFsZlBpeGVsQ2VudGVycykge1xuICAgICAgICAgICAgc291cmNlRnJhY0luZGV4UkMgPSBgbWF4KCh2ZWMzKHlSQykgKyB2ZWMzKDAuNSkpICogYCArXG4gICAgICAgICAgICAgICAgYGVmZmVjdGl2ZUlucHV0T3Zlck91dHB1dFJhdGlvUkMsIHZlYzMoMC4wKSlgO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc291cmNlRnJhY0luZGV4UkMgPSBgdmVjMyh5UkMpICogZWZmZWN0aXZlSW5wdXRPdmVyT3V0cHV0UmF0aW9SQ2A7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IHZlYzMgZWZmZWN0aXZlSW5wdXRPdmVyT3V0cHV0UmF0aW9SQyA9IHZlYzMoXG4gICAgICAgICAgJHtlZmZlY3RpdmVJblNpemVbMF0gLyBlZmZlY3RpdmVPdXRTaXplWzBdfSxcbiAgICAgICAgICAke2VmZmVjdGl2ZUluU2l6ZVsxXSAvIGVmZmVjdGl2ZU91dFNpemVbMV19LFxuICAgICAgICAgICR7ZWZmZWN0aXZlSW5TaXplWzFdIC8gZWZmZWN0aXZlT3V0U2l6ZVsxXX0pO1xuICAgICAgY29uc3QgdmVjMyBpbnB1dFNoYXBlUkMgPSB2ZWMzKCR7b2xkSGVpZ2h0fS4wLCAke29sZFdpZHRofS4wLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7b2xkV2lkdGh9LjApO1xuXG4gICAgICBmbG9hdCBnZXRBVmFsdWUoaW50IGIsIGludCByLCBpbnQgYywgaW50IGQpIHtcbiAgICAgICAgcmV0dXJuIGdldENoYW5uZWwoZ2V0QShiLCByLCBjLCBkKSwgdmVjMihjLCBkKSk7XG4gICAgICB9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgZCA9IGNvb3Jkc1szXTtcbiAgICAgICAgLy8gQ2FsY3VsYXRlIHZhbHVlcyBmb3IgbmV4dCBjb2x1bW4gaW4geVJDLnouXG4gICAgICAgIGl2ZWMzIHlSQyA9IGNvb3Jkcy55enogKyBpdmVjMygwLCAwLCAxKTtcblxuICAgICAgICAvLyBGcmFjdGlvbmFsIHNvdXJjZSBpbmRleC5cbiAgICAgICAgdmVjMyBzb3VyY2VGcmFjSW5kZXhSQyA9ICR7c291cmNlRnJhY0luZGV4UkN9O1xuXG4gICAgICAgIC8vIENvbXB1dGUgdGhlIGNvb3JkaW5hdG9ycyBvZiBuZWFyZXN0IG5laWdoYm9yIHBvaW50LlxuICAgICAgICBpdmVjMyBzb3VyY2VOZWFyZXN0UkMgPSBpdmVjMyhcbiAgICAgICAgICBtaW4oaW5wdXRTaGFwZVJDIC0gMS4wLCBmbG9vcihzb3VyY2VGcmFjSW5kZXhSQyArICR7cm91bmRCYXNlfSkpKTtcblxuICAgICAgICAvLyBTaG91bGQgd2UgY2FsY3VsYXRlIG5leHQgY29sdW1uIGFuZCByb3cgZWxlbWVudHMgaW4gMngyIHBhY2tlZCBjZWxsLlxuICAgICAgICBib29sIGhhc05leHRDb2wgPSBkIDwgJHtkZXB0aCAtIDF9O1xuICAgICAgICBib29sIGhhc05leHRSb3cgPSBjb29yZHMueiA8ICR7bmV3V2lkdGggLSAxfTtcblxuICAgICAgICB2ZWM0IG5ld1ZhbHVlID0gdmVjNChcbiAgICAgICAgICBnZXRBVmFsdWUoYiwgc291cmNlTmVhcmVzdFJDLngsIHNvdXJjZU5lYXJlc3RSQy55LCBkKSxcbiAgICAgICAgICBoYXNOZXh0Q29sID8gZ2V0QVZhbHVlKGIsIHNvdXJjZU5lYXJlc3RSQy54LCBzb3VyY2VOZWFyZXN0UkMueSwgZCArIDEpXG4gICAgICAgICAgICAgICAgICAgICA6IDAuMCxcbiAgICAgICAgICBoYXNOZXh0Um93ID8gZ2V0QVZhbHVlKGIsIHNvdXJjZU5lYXJlc3RSQy54LCBzb3VyY2VOZWFyZXN0UkMueiwgZClcbiAgICAgICAgICAgICAgICAgICAgIDogMC4wLFxuICAgICAgICAgIChoYXNOZXh0Um93ICYmIGhhc05leHRDb2wpID9cbiAgICAgICAgICAgIGdldEFWYWx1ZShiLCBzb3VyY2VOZWFyZXN0UkMueCwgc291cmNlTmVhcmVzdFJDLnosIGQgKyAxKSA6IDAuMCk7XG5cbiAgICAgICAgc2V0T3V0cHV0KG5ld1ZhbHVlKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlc2l6ZV9uZWFyZXN0X25laWdoYm9yX3BhY2tlZF9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZ2V0Q29vcmRzRGF0YVR5cGUgfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5leHBvcnQgY2xhc3MgUmV2ZXJzZVByb2dyYW0ge1xuICAgIGNvbnN0cnVjdG9yKHhTaGFwZSwgYXhpcykge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgICAgICAgY29uc3QgcmFuayA9IHhTaGFwZS5sZW5ndGg7XG4gICAgICAgIGlmIChyYW5rID4gNCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBXZWJHTCBiYWNrZW5kOiBSZXZlcnNlIG9mIHJhbmstJHtyYW5rfSB0ZW5zb3IgaXMgbm90IHlldCBzdXBwb3J0ZWRgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0geFNoYXBlO1xuICAgICAgICBpZiAocmFuayA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgIGludCBjb29yZCA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgIHNldE91dHB1dChnZXRYKCR7eFNoYXBlWzBdfSAtIGNvb3JkIC0gMSkpO1xuICAgICAgICB9XG4gICAgICBgO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGdldEluQ29vcmQgPSAoaSkgPT4ge1xuICAgICAgICAgICAgaWYgKGF4aXMuaW5kZXhPZihpKSAhPT0gLTEgJiYgeFNoYXBlW2ldICE9PSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke3hTaGFwZVtpXX0gLSBjb29yZHNbJHtpfV0gLSAxYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBgY29vcmRzWyR7aX1dYDtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgaW5Db29yZHMgPSB4U2hhcGUubWFwKChfLCBpKSA9PiBnZXRJbkNvb3JkKGkpKS5qb2luKCcsJyk7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShyYW5rKTtcbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgJHt0eXBlfSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgc2V0T3V0cHV0KGdldFgoJHtpbkNvb3Jkc30pKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJldmVyc2VfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGdldENoYW5uZWxzIH0gZnJvbSAnLi9wYWNraW5nX3V0aWwnO1xuaW1wb3J0IHsgZ2V0Q29vcmRzRGF0YVR5cGUgfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5leHBvcnQgY2xhc3MgUmV2ZXJzZVBhY2tlZFByb2dyYW0ge1xuICAgIGNvbnN0cnVjdG9yKHhTaGFwZSwgYXhpcykge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgICAgICAgdGhpcy5wYWNrZWRJbnB1dHMgPSB0cnVlO1xuICAgICAgICB0aGlzLnBhY2tlZE91dHB1dCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHJhbmsgPSB4U2hhcGUubGVuZ3RoO1xuICAgICAgICBpZiAocmFuayA+IDQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgV2ViR0wgYmFja2VuZDogUmV2ZXJzZSBvZiByYW5rLSR7cmFua30gdGVuc29yIGlzIG5vdCB5ZXQgc3VwcG9ydGVkYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IHhTaGFwZTtcbiAgICAgICAgY29uc3QgY2hhbm5lbHMgPSBnZXRDaGFubmVscygncmMnLCByYW5rKTtcbiAgICAgICAgY29uc3QgbmV4dENvbHVtbiA9IGAke2NoYW5uZWxzW3JhbmsgLSAxXX0gKyAxIDwgJHt0aGlzLm91dHB1dFNoYXBlW3JhbmsgLSAxXX1gO1xuICAgICAgICBjb25zdCBuZXh0Um93ID0gYCR7Y2hhbm5lbHNbcmFuayAtIDJdfSArIDEgPCAke3RoaXMub3V0cHV0U2hhcGVbcmFuayAtIDJdfWA7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShyYW5rKTtcbiAgICAgICAgaWYgKHJhbmsgPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAgIHZvaWQgbWFpbigpe1xuICAgICAgICAgIGludCByYyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgIHZlYzQgcmVzdWx0ID0gdmVjNCgwLik7XG4gICAgICAgICAgcmVzdWx0LnIgPSBnZXRDaGFubmVsKGdldFgoJHt4U2hhcGVbMF19IC0gcmMgLSAxKSxcbiAgICAgICAgICAgICR7eFNoYXBlWzBdfSAtIHJjIC0gMSk7XG4gICAgICAgICAgaWYoJHtuZXh0Q29sdW1ufSl7XG4gICAgICAgICAgICAgIHJlc3VsdC5nID0gZ2V0Q2hhbm5lbChnZXRYKCR7eFNoYXBlWzBdfSAtIChyYyAgKyAxKSAtIDEpLFxuICAgICAgICAgICAgICAgICR7eFNoYXBlWzBdfSAtIChyYyAgKyAxKSAtIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZXRPdXRwdXQocmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgICAke3R5cGV9IHJjID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgICAgdmVjNCByZXN1bHQgPSB2ZWM0KDAuKTtcbiAgICAgICAgICByZXN1bHQuciA9ICR7Z2V0UihjaGFubmVscy5zbGljZSgpKX07XG4gICAgICAgICAgaWYoJHtuZXh0Q29sdW1ufSl7XG4gICAgICAgICAgICByZXN1bHQuZyA9ICR7Z2V0RyhjaGFubmVscy5zbGljZSgpKX07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKCR7bmV4dFJvd30pIHtcbiAgICAgICAgICAgIHJlc3VsdC5iID0gJHtnZXRCKGNoYW5uZWxzLnNsaWNlKCkpfTtcbiAgICAgICAgICAgIGlmKCR7bmV4dENvbHVtbn0pIHtcbiAgICAgICAgICAgICAgcmVzdWx0LmEgPSAke2dldEEoY2hhbm5lbHMuc2xpY2UoKSl9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBzZXRPdXRwdXQocmVzdWx0KTtcbiAgICAgICAgfVxuICAgIGA7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gZ2V0UihjaGFubmVscykge1xuICAgICAgICAgICAgcmV0dXJuIGdldENoYW5uZWwoY2hhbm5lbHMpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGdldEcoY2hhbm5lbHMpIHtcbiAgICAgICAgICAgIGNoYW5uZWxzW3JhbmsgLSAxXSA9ICcoJyArIGNoYW5uZWxzW3JhbmsgLSAxXSArIGAgKyAxKWA7XG4gICAgICAgICAgICByZXR1cm4gZ2V0Q2hhbm5lbChjaGFubmVscyk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gZ2V0QihjaGFubmVscykge1xuICAgICAgICAgICAgY2hhbm5lbHNbcmFuayAtIDJdID0gJygnICsgY2hhbm5lbHNbcmFuayAtIDJdICsgYCArIDEpYDtcbiAgICAgICAgICAgIHJldHVybiBnZXRDaGFubmVsKGNoYW5uZWxzKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBnZXRBKGNoYW5uZWxzKSB7XG4gICAgICAgICAgICBjaGFubmVsc1tyYW5rIC0gMV0gPSAnKCcgKyBjaGFubmVsc1tyYW5rIC0gMV0gKyBgICsgMSlgO1xuICAgICAgICAgICAgY2hhbm5lbHNbcmFuayAtIDJdID0gJygnICsgY2hhbm5lbHNbcmFuayAtIDJdICsgYCArIDEpYDtcbiAgICAgICAgICAgIHJldHVybiBnZXRDaGFubmVsKGNoYW5uZWxzKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBnZXRDaGFubmVsKGNoYW5uZWxzKSB7XG4gICAgICAgICAgICBjb25zdCBpbkNvb3Jkc0FycmF5ID0geFNoYXBlLm1hcCgoXywgaSkgPT4gZ2V0SW5Db29yZChpLCBjaGFubmVscykpO1xuICAgICAgICAgICAgY29uc3QgaW5Db29yZHMgPSBpbkNvb3Jkc0FycmF5LmpvaW4oJywnKTtcbiAgICAgICAgICAgIGNvbnN0IGlubmVyRGltcyA9IGluQ29vcmRzQXJyYXkuc2xpY2UoLTIpLmpvaW4oJywnKTtcbiAgICAgICAgICAgIHJldHVybiBgZ2V0Q2hhbm5lbChnZXRYKCR7aW5Db29yZHN9KSwgdmVjMigke2lubmVyRGltc30pKWA7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gZ2V0SW5Db29yZChpLCBjaGFubmVsczEpIHtcbiAgICAgICAgICAgIGlmIChheGlzLmluZGV4T2YoaSkgIT09IC0xICYmIHhTaGFwZVtpXSAhPT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBgJHt4U2hhcGVbaV19IC0gJHtjaGFubmVsczFbaV19IC0gMWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7Y2hhbm5lbHMxW2ldfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZXZlcnNlX3BhY2tlZF9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuZXhwb3J0IGNsYXNzIFJvdGF0ZVByb2dyYW0ge1xuICAgIGNvbnN0cnVjdG9yKGltYWdlU2hhcGUsIGZpbGxWYWx1ZSkge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ0ltYWdlJ107XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBbXTtcbiAgICAgICAgdGhpcy5jdXN0b21Vbmlmb3JtcyA9IFt7IG5hbWU6ICdwYXJhbXMnLCB0eXBlOiAndmVjNCcgfV07XG4gICAgICAgIGNvbnN0IGltYWdlSGVpZ2h0ID0gaW1hZ2VTaGFwZVsxXTtcbiAgICAgICAgY29uc3QgaW1hZ2VXaWR0aCA9IGltYWdlU2hhcGVbMl07XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBpbWFnZVNoYXBlO1xuICAgICAgICBsZXQgZmlsbFNuaXBwZXQgPSAnJztcbiAgICAgICAgaWYgKHR5cGVvZiBmaWxsVmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBmaWxsU25pcHBldCA9IGBmbG9hdCBvdXRwdXRWYWx1ZSA9ICR7ZmlsbFZhbHVlLnRvRml4ZWQoMil9O2A7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmaWxsU25pcHBldCA9IGBcbiAgICAgICAgdmVjMyBmaWxsID0gdmVjMygke2ZpbGxWYWx1ZS5qb2luKCcsJyl9KTtcbiAgICAgICAgZmxvYXQgb3V0cHV0VmFsdWUgPSBmaWxsW2Nvb3Jkc1szXV07YDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgICAgaW50IHggPSBjb29yZHNbMl07XG4gICAgICAgICAgaW50IHkgPSBjb29yZHNbMV07XG4gICAgICAgICAgZmxvYXQgY29vcmRYRmxvYXQgPSAoZmxvYXQoeCkgLSBwYXJhbXNbMF0pICogcGFyYW1zWzNdIC1cbiAgICAgICAgICAgIChmbG9hdCh5KSAtIHBhcmFtc1sxXSkgKiBwYXJhbXNbMl07XG4gICAgICAgICAgZmxvYXQgY29vcmRZRmxvYXQgPSAoZmxvYXQoeCkgLSBwYXJhbXNbMF0pICogcGFyYW1zWzJdICtcbiAgICAgICAgICAgIChmbG9hdCh5KSAtIHBhcmFtc1sxXSkgKiBwYXJhbXNbM107XG4gICAgICAgICAgaW50IGNvb3JkWCA9IGludChyb3VuZChjb29yZFhGbG9hdCArIHBhcmFtc1swXSkpO1xuICAgICAgICAgIGludCBjb29yZFkgPSBpbnQocm91bmQoY29vcmRZRmxvYXQgKyBwYXJhbXNbMV0pKTtcbiAgICAgICAgICAke2ZpbGxTbmlwcGV0fVxuICAgICAgICAgIGlmKGNvb3JkWCA+PSAwICYmIGNvb3JkWCA8ICR7aW1hZ2VXaWR0aH0gJiYgY29vcmRZID49IDAgJiYgY29vcmRZIDwgJHtpbWFnZUhlaWdodH0pIHtcbiAgICAgICAgICAgIG91dHB1dFZhbHVlID0gZ2V0SW1hZ2UoY29vcmRzWzBdLCBjb29yZFksIGNvb3JkWCwgY29vcmRzWzNdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2V0T3V0cHV0KG91dHB1dFZhbHVlKTtcbiAgICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cm90YXRlX2dwdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBnZXRDb29yZHNEYXRhVHlwZSB9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcbmV4cG9ydCBjbGFzcyBTY2F0dGVyUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IodXBkYXRlU2l6ZSwgc2xpY2VEaW0sIGluZGljZXNSYW5rLCB1cGRhdGVzUmFuaywgc3RyaWRlcywgc2hhcGUsIHN1bW1pbmdEdXBlSW5kZXggPSB0cnVlKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsndXBkYXRlcycsICdpbmRpY2VzJywgJ2RlZmF1bHRWYWx1ZSddO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gc2hhcGU7XG4gICAgICAgIGNvbnN0IHN0cmlkZXNUeXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUoc3RyaWRlcy5sZW5ndGgpO1xuICAgICAgICBjb25zdCBkdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHNoYXBlLmxlbmd0aCk7XG4gICAgICAgIGxldCBpbmRpY2VzU3RyaW5nID0gJyc7XG4gICAgICAgIGlmIChpbmRpY2VzUmFuayA9PT0gMSkge1xuICAgICAgICAgICAgaW5kaWNlc1N0cmluZyA9ICdpJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpbmRpY2VzUmFuayA9PT0gMikge1xuICAgICAgICAgICAgaW5kaWNlc1N0cmluZyA9ICdpLCBqJztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmRpY2VzU25pcHBldCA9IGBnZXRJbmRpY2VzKCR7aW5kaWNlc1N0cmluZ30pYDtcbiAgICAgICAgbGV0IHVwZGF0ZXNTdHJpbmcgPSAnJztcbiAgICAgICAgaWYgKHVwZGF0ZXNSYW5rID09PSAxKSB7XG4gICAgICAgICAgICB1cGRhdGVzU3RyaW5nID0gJ2knO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHVwZGF0ZXNSYW5rID09PSAyKSB7XG4gICAgICAgICAgICB1cGRhdGVzU3RyaW5nID0gJ2ksIGNvb3Jkc1sxXSc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXBkYXRlc1NuaXBwZXQgPSBgZ2V0VXBkYXRlcygke3VwZGF0ZXNTdHJpbmd9KWA7XG4gICAgICAgIGNvbnN0IHN0cmlkZVN0cmluZyA9IHNsaWNlRGltID4gMSA/ICdzdHJpZGVzW2pdJyA6ICdzdHJpZGVzJztcbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICAgJHtzdHJpZGVzVHlwZX0gc3RyaWRlcyA9ICR7c3RyaWRlc1R5cGV9KCR7c3RyaWRlc30pO1xuXG4gICAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgICAke2R0eXBlfSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgICBmbG9hdCBzdW0gPSAwLjA7XG4gICAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlO1xuICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgJHt1cGRhdGVTaXplfTsgaSsrKSB7XG4gICAgICAgICAgICBpbnQgZmxhdHRlbmVkSW5kZXggPSAwO1xuICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAke3NsaWNlRGltfTsgaisrKSB7XG4gICAgICAgICAgICAgIGludCBpbmRleCA9IHJvdW5kKCR7aW5kaWNlc1NuaXBwZXR9KTtcbiAgICAgICAgICAgICAgZmxhdHRlbmVkSW5kZXggKz0gaW5kZXggKiAke3N0cmlkZVN0cmluZ307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmxhdHRlbmVkSW5kZXggPT0gY29vcmRzWzBdKSB7XG4gICAgICAgICAgICAgIHN1bSArPSAke3VwZGF0ZXNTbmlwcGV0fTtcbiAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBzZXRPdXRwdXQobWl4KGdldERlZmF1bHRWYWx1ZSgpLCBzdW0sIGZsb2F0KGZvdW5kKSkpO1xuICAgICAgICB9XG4gICAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNjYXR0ZXJfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmV4cG9ydCBjbGFzcyBTZWdtZW50T3BQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3RvcihzZWdPcEluZm8sIHNlZ09wVHlwZSkge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ3gnLCAnc2VnbWVudElkcyddO1xuICAgICAgICBjb25zdCB3aW5kb3dTaXplID0gc2VnT3BJbmZvLndpbmRvd1NpemU7XG4gICAgICAgIGNvbnN0IGJhdGNoU2l6ZSA9IHNlZ09wSW5mby5iYXRjaFNpemU7XG4gICAgICAgIGNvbnN0IGluU2l6ZSA9IHNlZ09wSW5mby5pblNpemU7XG4gICAgICAgIGNvbnN0IG51bVNlZ21lbnRzID0gc2VnT3BJbmZvLm51bVNlZ21lbnRzO1xuICAgICAgICBjb25zdCBvdXRTaXplID0gbnVtU2VnbWVudHMgKiBNYXRoLmNlaWwoaW5TaXplIC8gd2luZG93U2l6ZSk7XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBbYmF0Y2hTaXplLCBvdXRTaXplXTtcbiAgICAgICAgY29uc3QgaW5pdGlhbGl6YXRpb25WYWx1ZSA9ICcwLjAnO1xuICAgICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IGBzdW1WYWx1ZWA7XG4gICAgICAgIGNvbnN0IHdpbmRvd1NpemVOZWFyZXN0VmVjNCA9IE1hdGguZmxvb3Iod2luZG93U2l6ZSAvIDQpICogNDtcbiAgICAgICAgY29uc3Qgd2luZG93U2l6ZVZlYzRSZW1haW5kZXIgPSB3aW5kb3dTaXplICUgNDtcbiAgICAgICAgY29uc3QgdXBkYXRlU25pcHBldCA9IGBcbiAgICAgICAgc3VtVmFsdWUgKz0gZG90KHZhbHVlcywgc2VnRmlsdGVyKTtcbiAgICBgO1xuICAgICAgICBsZXQgY2hlY2tWYWx1ZU91dE9mQm91bmRzID0gJyc7XG4gICAgICAgIGlmIChpblNpemUgJSB3aW5kb3dTaXplID4gMCkge1xuICAgICAgICAgICAgY2hlY2tWYWx1ZU91dE9mQm91bmRzID0gYFxuICAgICAgICBpZiAoaW5JZHggPCAwIHx8IGluSWR4ID49ICR7aW5TaXplfSkge1xuICAgICAgICAgIHJldHVybiBpbml0aWFsaXphdGlvblZhbHVlO1xuICAgICAgICB9XG4gICAgICBgO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjaGVja1NlZ21lbnRJZE91dE9mQm91bmRzID0gJyc7XG4gICAgICAgIGlmIChpblNpemUgJSB3aW5kb3dTaXplID4gMCkge1xuICAgICAgICAgICAgY2hlY2tTZWdtZW50SWRPdXRPZkJvdW5kcyA9IGBcbiAgICAgICAgaWYgKGluSWR4IDwgMCB8fCBpbklkeCA+PSAke2luU2l6ZX0pIHtcbiAgICAgICAgICByZXR1cm4gLTEuMDtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgY29uc3QgZmxvYXQgaW5pdGlhbGl6YXRpb25WYWx1ZSA9ICR7aW5pdGlhbGl6YXRpb25WYWx1ZX07XG5cbiAgICAgIGZsb2F0IGdldFZhbHVlKGludCBiYXRjaCwgaW50IGluSWR4KSB7XG4gICAgICAgICR7Y2hlY2tWYWx1ZU91dE9mQm91bmRzfVxuICAgICAgICByZXR1cm4gZ2V0WChiYXRjaCwgaW5JZHgpO1xuICAgICAgfVxuXG4gICAgICBmbG9hdCBnZXRTZWdtZW50SWRBdEluZGV4KGludCBpbklkeCkge1xuICAgICAgICAke2NoZWNrU2VnbWVudElkT3V0T2ZCb3VuZHN9XG4gICAgICAgIHJldHVybiBnZXRTZWdtZW50SWRzKGluSWR4KTtcbiAgICAgIH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMiBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgb3V0SWR4ID0gY29vcmRzWzFdO1xuICAgICAgICBpbnQgaW5PZmZzZXQgPSBpbnQoZmxvb3IoZmxvYXQob3V0SWR4KSAvIGZsb2F0KFxuICAgICAgICAgICR7bnVtU2VnbWVudHN9KSkgKiBmbG9hdCgke3dpbmRvd1NpemV9KSk7XG4gICAgICAgIGludCBjdXJyZW50U2VnID0gaW50KG1vZChmbG9hdChvdXRJZHgpLCBmbG9hdCgke251bVNlZ21lbnRzfSkpKTtcblxuICAgICAgICBmbG9hdCBzdW1WYWx1ZSA9IDAuMDtcblxuICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8ICR7d2luZG93U2l6ZU5lYXJlc3RWZWM0fTsgaSArPSA0KSB7XG4gICAgICAgICAgaW50IGluSWR4ID0gaW5PZmZzZXQgKyBpO1xuICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAxKSxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDIpLFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4ICsgMylcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgdmVjNCBzZWdGaWx0ZXIgPSB2ZWM0KFxuICAgICAgICAgICAgaW50KGdldFNlZ21lbnRJZEF0SW5kZXgoaW5JZHgpKSA9PSBjdXJyZW50U2VnID8gMSA6IDAsXG4gICAgICAgICAgICBpbnQoZ2V0U2VnbWVudElkQXRJbmRleChpbklkeCArIDEpKSA9PSBjdXJyZW50U2VnID8gMSA6IDAsXG4gICAgICAgICAgICBpbnQoZ2V0U2VnbWVudElkQXRJbmRleChpbklkeCArIDIpKSA9PSBjdXJyZW50U2VnID8gMSA6IDAsXG4gICAgICAgICAgICBpbnQoZ2V0U2VnbWVudElkQXRJbmRleChpbklkeCArIDMpKSA9PSBjdXJyZW50U2VnID8gMSA6IDBcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgJHt1cGRhdGVTbmlwcGV0fVxuICAgICAgICB9XG5cbiAgICAgICAgaW50IGluSWR4ID0gaW5PZmZzZXQgKyAke3dpbmRvd1NpemVOZWFyZXN0VmVjNH07XG4gICAgICAgIGlmICgke3dpbmRvd1NpemVWZWM0UmVtYWluZGVyID09PSAxfSkge1xuICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCksXG4gICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlLFxuICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZSxcbiAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWVcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaW50IGluSWR4U2VnID0gaW50KGdldFNlZ21lbnRJZEF0SW5kZXgoaW5JZHgpKTtcblxuICAgICAgICAgIHZlYzQgc2VnRmlsdGVyID0gdmVjNChcbiAgICAgICAgICAgIGludChnZXRTZWdtZW50SWRBdEluZGV4KGluSWR4KSkgPT0gY3VycmVudFNlZyA/IDEgOiAwLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAwXG4gICAgICAgICAgKTtcblxuICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgfSBlbHNlIGlmICgke3dpbmRvd1NpemVWZWM0UmVtYWluZGVyID09PSAyfSkge1xuICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAxKSxcbiAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUsXG4gICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHZlYzQgc2VnRmlsdGVyID0gdmVjNChcbiAgICAgICAgICAgIGludChnZXRTZWdtZW50SWRBdEluZGV4KGluSWR4KSkgPT0gY3VycmVudFNlZyA/IDEgOiAwLFxuICAgICAgICAgICAgaW50KGdldFNlZ21lbnRJZEF0SW5kZXgoaW5JZHggKyAxKSkgPT0gY3VycmVudFNlZyA/IDEgOiAwLFxuICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAwXG4gICAgICAgICAgKTtcblxuICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgfSBlbHNlIGlmICgke3dpbmRvd1NpemVWZWM0UmVtYWluZGVyID09PSAzfSkge1xuICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAxKSxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDIpLFxuICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICB2ZWM0IHNlZ0ZpbHRlciA9IHZlYzQoXG4gICAgICAgICAgICBpbnQoZ2V0U2VnbWVudElkQXRJbmRleChpbklkeCkpID09IGN1cnJlbnRTZWcgPyAxIDogMCxcbiAgICAgICAgICAgIGludChnZXRTZWdtZW50SWRBdEluZGV4KGluSWR4ICsgMSkpID09IGN1cnJlbnRTZWcgPyAxIDogMCxcbiAgICAgICAgICAgIGludChnZXRTZWdtZW50SWRBdEluZGV4KGluSWR4ICsgMikpID09IGN1cnJlbnRTZWcgPyAxIDogMCxcbiAgICAgICAgICAgIDBcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgJHt1cGRhdGVTbmlwcGV0fVxuICAgICAgICB9XG4gICAgICAgIHNldE91dHB1dCgke3JldHVyblZhbHVlfSk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zZWdtZW50X2dwdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBnZXRDb29yZHNEYXRhVHlwZSB9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcbmV4cG9ydCBjbGFzcyBTZWxlY3RQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3RvcihjUmFuaywgc2hhcGUsIHJhbmspIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWydjJywgJ2EnLCAnYiddO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gc2hhcGU7XG4gICAgICAgIGxldCBjQ29vcmRzO1xuICAgICAgICBsZXQgYWJDb29yZHM7XG4gICAgICAgIGlmIChyYW5rID4gNCkge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoYFdoZXJlIGZvciByYW5rICR7cmFua30gaXMgbm90IHlldCBzdXBwb3J0ZWRgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmFuayA9PT0gMSkge1xuICAgICAgICAgICAgYWJDb29yZHMgPSBgcmVzUkNgO1xuICAgICAgICAgICAgY0Nvb3JkcyA9IGByZXNSQ2A7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50Q29vcmRzID0gWydyZXNSQy54JywgJ3Jlc1JDLnknLCAncmVzUkMueicsICdyZXNSQy53J107XG4gICAgICAgICAgICBjb25zdCBjQ29vcmRWYXJzID0gW107XG4gICAgICAgICAgICBjb25zdCBhYkNvb3JkVmFycyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaGFwZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGFiQ29vcmRWYXJzLnB1c2goYCR7Y3VycmVudENvb3Jkc1tpXX1gKTtcbiAgICAgICAgICAgICAgICBpZiAoaSA8IGNSYW5rKSB7XG4gICAgICAgICAgICAgICAgICAgIGNDb29yZFZhcnMucHVzaChgJHtjdXJyZW50Q29vcmRzW2ldfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNDb29yZHMgPSBjQ29vcmRWYXJzLmpvaW4oKTtcbiAgICAgICAgICAgIGFiQ29vcmRzID0gYWJDb29yZFZhcnMuam9pbigpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGR0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUocmFuayk7XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICR7ZHR5cGV9IHJlc1JDID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGZsb2F0IGNWYWwgPSBnZXRDKCR7Y0Nvb3Jkc30pO1xuICAgICAgICBpZiAoY1ZhbCA+PSAxLjApIHtcbiAgICAgICAgICBzZXRPdXRwdXQoZ2V0QSgke2FiQ29vcmRzfSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldE91dHB1dChnZXRCKCR7YWJDb29yZHN9KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlbGVjdF9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLy8gUGxlYXNlIG1ha2Ugc3VyZSB0aGUgc2hha2VyIGtleSBpbiBtYWtlU2hhZGVyS2V5IGluIGdwZ3B1X21hdGgudHMgaXMgd2VsbFxuLy8gbWFwcGVkIGlmIGFueSBzaGFkZXIgc291cmNlIGNvZGUgaXMgY2hhbmdlZCBpbiB0aGlzIGZpbGUuXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuY29uc3QgeyBnZXRCcm9hZGNhc3REaW1zIH0gPSBiYWNrZW5kX3V0aWw7XG5pbXBvcnQgeyBnZXRHbHNsRGlmZmVyZW5jZXMgfSBmcm9tICcuL2dsc2xfdmVyc2lvbic7XG5pbXBvcnQgKiBhcyBzaGFkZXJfdXRpbCBmcm9tICcuL3NoYWRlcl9jb21waWxlcl91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBtYWtlU2hhZGVyKGlucHV0c0luZm8sIG91dHB1dFNoYXBlLCBwcm9ncmFtKSB7XG4gICAgY29uc3QgcHJlZml4U25pcHBldHMgPSBbXTtcbiAgICBpbnB1dHNJbmZvLmZvckVhY2goeCA9PiB7XG4gICAgICAgIGNvbnN0IHNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoeC5zaGFwZUluZm8ubG9naWNhbFNoYXBlKTtcbiAgICAgICAgLy8gU25pcHBldCB3aGVuIHdlIGRlY2lkZWQgdG8gdXBsb2FkIHRoZSB2YWx1ZXMgYXMgdW5pZm9ybS5cbiAgICAgICAgaWYgKHguc2hhcGVJbmZvLmlzVW5pZm9ybSkge1xuICAgICAgICAgICAgcHJlZml4U25pcHBldHMucHVzaChgdW5pZm9ybSBmbG9hdCAke3gubmFtZX0ke3NpemUgPiAxID8gYFske3NpemV9XWAgOiAnJ307YCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwcmVmaXhTbmlwcGV0cy5wdXNoKGB1bmlmb3JtIHNhbXBsZXIyRCAke3gubmFtZX07YCk7XG4gICAgICAgICAgICBwcmVmaXhTbmlwcGV0cy5wdXNoKGB1bmlmb3JtIGludCBvZmZzZXQke3gubmFtZX07YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW0uZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgICAgICAgY29uc3QgeyB1bmlmb3JtU2hhcGUgfSA9IGdldFVuaWZvcm1JbmZvRnJvbVNoYXBlKHByb2dyYW0ucGFja2VkSW5wdXRzLCB4LnNoYXBlSW5mby5sb2dpY2FsU2hhcGUsIHguc2hhcGVJbmZvLnRleFNoYXBlKTtcbiAgICAgICAgICAgIHN3aXRjaCAodW5pZm9ybVNoYXBlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgcHJlZml4U25pcHBldHMucHVzaChgdW5pZm9ybSBpbnQgJHt4Lm5hbWV9U2hhcGU7YCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgcHJlZml4U25pcHBldHMucHVzaChgdW5pZm9ybSBpdmVjMiAke3gubmFtZX1TaGFwZTtgKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBwcmVmaXhTbmlwcGV0cy5wdXNoKGB1bmlmb3JtIGl2ZWMzICR7eC5uYW1lfVNoYXBlO2ApO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIHByZWZpeFNuaXBwZXRzLnB1c2goYHVuaWZvcm0gaXZlYzQgJHt4Lm5hbWV9U2hhcGU7YCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJlZml4U25pcHBldHMucHVzaChgdW5pZm9ybSBpdmVjMiAke3gubmFtZX1UZXhTaGFwZTtgKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChwcm9ncmFtLmVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgICAgc3dpdGNoIChvdXRwdXRTaGFwZS5sb2dpY2FsU2hhcGUubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgcHJlZml4U25pcHBldHMucHVzaChgdW5pZm9ybSBpbnQgb3V0U2hhcGU7YCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgcHJlZml4U25pcHBldHMucHVzaChgdW5pZm9ybSBpdmVjMiBvdXRTaGFwZTtgKTtcbiAgICAgICAgICAgICAgICBwcmVmaXhTbmlwcGV0cy5wdXNoKGB1bmlmb3JtIGludCBvdXRTaGFwZVN0cmlkZXM7YCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgcHJlZml4U25pcHBldHMucHVzaChgdW5pZm9ybSBpdmVjMyBvdXRTaGFwZTtgKTtcbiAgICAgICAgICAgICAgICBwcmVmaXhTbmlwcGV0cy5wdXNoKGB1bmlmb3JtIGl2ZWMyIG91dFNoYXBlU3RyaWRlcztgKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICBwcmVmaXhTbmlwcGV0cy5wdXNoKGB1bmlmb3JtIGl2ZWM0IG91dFNoYXBlO2ApO1xuICAgICAgICAgICAgICAgIHByZWZpeFNuaXBwZXRzLnB1c2goYHVuaWZvcm0gaXZlYzMgb3V0U2hhcGVTdHJpZGVzO2ApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBwcmVmaXhTbmlwcGV0cy5wdXNoKGB1bmlmb3JtIGl2ZWMyIG91dFRleFNoYXBlO2ApO1xuICAgIH1cbiAgICBpZiAocHJvZ3JhbS5jdXN0b21Vbmlmb3Jtcykge1xuICAgICAgICBwcm9ncmFtLmN1c3RvbVVuaWZvcm1zLmZvckVhY2goKGQpID0+IHtcbiAgICAgICAgICAgIHByZWZpeFNuaXBwZXRzLnB1c2goYHVuaWZvcm0gJHtkLnR5cGV9ICR7ZC5uYW1lfSR7ZC5hcnJheUluZGV4ID8gYFske2QuYXJyYXlJbmRleH1dYCA6ICcnfTtgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0UHJlZml4U25pcHBldCA9IHByZWZpeFNuaXBwZXRzLmpvaW4oJ1xcbicpO1xuICAgIGNvbnN0IGlucHV0U2FtcGxpbmdTbmlwcGV0ID0gaW5wdXRzSW5mb1xuICAgICAgICAubWFwKHggPT4gZ2V0SW5wdXRTYW1wbGluZ1NuaXBwZXQoeCwgb3V0cHV0U2hhcGUsIHByb2dyYW0ucGFja2VkSW5wdXRzLCBwcm9ncmFtLmVuYWJsZVNoYXBlVW5pZm9ybXMpKVxuICAgICAgICAuam9pbignXFxuJyk7XG4gICAgY29uc3Qgb3V0VGV4U2hhcGUgPSBvdXRwdXRTaGFwZS50ZXhTaGFwZTtcbiAgICBjb25zdCBnbHNsID0gZ2V0R2xzbERpZmZlcmVuY2VzKCk7XG4gICAgY29uc3QgZmxvYXRUZXh0dXJlU2FtcGxlU25pcHBldCA9IGdldEZsb2F0VGV4dHVyZVNhbXBsZVNuaXBwZXQoZ2xzbCk7XG4gICAgbGV0IG91dHB1dFNhbXBsaW5nU25pcHBldDtcbiAgICBsZXQgZmxvYXRUZXh0dXJlU2V0T3V0cHV0U25pcHBldDtcbiAgICBsZXQgc2hhZGVyUHJlZml4ID0gZ2V0U2hhZGVyUHJlZml4KGdsc2wpO1xuICAgIGlmIChvdXRwdXRTaGFwZS5pc1BhY2tlZCkge1xuICAgICAgICBvdXRwdXRTYW1wbGluZ1NuaXBwZXQgPSBnZXRQYWNrZWRPdXRwdXRTYW1wbGluZ1NuaXBwZXQob3V0cHV0U2hhcGUubG9naWNhbFNoYXBlLCBvdXRUZXhTaGFwZSwgcHJvZ3JhbS5lbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICAgICAgZmxvYXRUZXh0dXJlU2V0T3V0cHV0U25pcHBldCA9IGdldEZsb2F0VGV4dHVyZVNldFJHQkFTbmlwcGV0KGdsc2wpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgb3V0cHV0U2FtcGxpbmdTbmlwcGV0ID0gZ2V0T3V0cHV0U2FtcGxpbmdTbmlwcGV0KG91dHB1dFNoYXBlLmxvZ2ljYWxTaGFwZSwgb3V0VGV4U2hhcGUsIHByb2dyYW0uZW5hYmxlU2hhcGVVbmlmb3Jtcyk7XG4gICAgICAgIGZsb2F0VGV4dHVyZVNldE91dHB1dFNuaXBwZXQgPSBnZXRGbG9hdFRleHR1cmVTZXRSU25pcHBldChnbHNsKTtcbiAgICB9XG4gICAgaWYgKHByb2dyYW0ucGFja2VkSW5wdXRzKSB7XG4gICAgICAgIHNoYWRlclByZWZpeCArPSBTSEFERVJfUEFDS0VEX1BSRUZJWDtcbiAgICB9XG4gICAgY29uc3Qgc291cmNlID0gW1xuICAgICAgICBzaGFkZXJQcmVmaXgsIGZsb2F0VGV4dHVyZVNhbXBsZVNuaXBwZXQsIGZsb2F0VGV4dHVyZVNldE91dHB1dFNuaXBwZXQsXG4gICAgICAgIGlucHV0UHJlZml4U25pcHBldCwgb3V0cHV0U2FtcGxpbmdTbmlwcGV0LCBpbnB1dFNhbXBsaW5nU25pcHBldCxcbiAgICAgICAgcHJvZ3JhbS51c2VyQ29kZVxuICAgIF0uam9pbignXFxuJyk7XG4gICAgcmV0dXJuIHNvdXJjZTtcbn1cbmZ1bmN0aW9uIGdldFNhbXBsZXJGcm9tSW5JbmZvKGluSW5mbywgZW5hYmxlU2hhcGVVbmlmb3JtcyA9IGZhbHNlKSB7XG4gICAgY29uc3Qgc2hhcGUgPSBpbkluZm8uc2hhcGVJbmZvLmxvZ2ljYWxTaGFwZTtcbiAgICBzd2l0Y2ggKHNoYXBlLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICByZXR1cm4gZ2V0U2FtcGxlclNjYWxhcihpbkluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICByZXR1cm4gZ2V0U2FtcGxlcjFEKGluSW5mbywgZW5hYmxlU2hhcGVVbmlmb3Jtcyk7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIHJldHVybiBnZXRTYW1wbGVyMkQoaW5JbmZvLCBlbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgcmV0dXJuIGdldFNhbXBsZXIzRChpbkluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICByZXR1cm4gZ2V0U2FtcGxlcjREKGluSW5mbywgZW5hYmxlU2hhcGVVbmlmb3Jtcyk7XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIHJldHVybiBnZXRTYW1wbGVyNUQoaW5JbmZvKTtcbiAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgcmV0dXJuIGdldFNhbXBsZXI2RChpbkluZm8pO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3NoYXBlLmxlbmd0aH0tRCBpbnB1dCBzYW1wbGluZ2AgK1xuICAgICAgICAgICAgICAgIGAgaXMgbm90IHlldCBzdXBwb3J0ZWRgKTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRQYWNrZWRTYW1wbGVyRnJvbUluSW5mbyhpbkluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICBjb25zdCBzaGFwZSA9IGluSW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlO1xuICAgIHN3aXRjaCAoc2hhcGUubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIHJldHVybiBnZXRQYWNrZWRTYW1wbGVyU2NhbGFyKGluSW5mbyk7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIHJldHVybiBnZXRQYWNrZWRTYW1wbGVyMUQoaW5JbmZvLCBlbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgcmV0dXJuIGdldFBhY2tlZFNhbXBsZXIyRChpbkluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICByZXR1cm4gZ2V0UGFja2VkU2FtcGxlcjNEKGluSW5mbywgZW5hYmxlU2hhcGVVbmlmb3Jtcyk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZ2V0UGFja2VkU2FtcGxlck5EKGluSW5mbywgZW5hYmxlU2hhcGVVbmlmb3Jtcyk7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0SW5wdXRTYW1wbGluZ1NuaXBwZXQoaW5JbmZvLCBvdXRTaGFwZUluZm8sIHVzZXNQYWNrZWRUZXh0dXJlcyA9IGZhbHNlLCBlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgbGV0IHJlcyA9ICcnO1xuICAgIGlmICh1c2VzUGFja2VkVGV4dHVyZXMpIHtcbiAgICAgICAgcmVzICs9IGdldFBhY2tlZFNhbXBsZXJGcm9tSW5JbmZvKGluSW5mbywgZW5hYmxlU2hhcGVVbmlmb3Jtcyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXMgKz0gZ2V0U2FtcGxlckZyb21JbkluZm8oaW5JbmZvLCBlbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICB9XG4gICAgY29uc3QgaW5TaGFwZSA9IGluSW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlO1xuICAgIGNvbnN0IG91dFNoYXBlID0gb3V0U2hhcGVJbmZvLmxvZ2ljYWxTaGFwZTtcbiAgICBpZiAoaW5TaGFwZS5sZW5ndGggPD0gb3V0U2hhcGUubGVuZ3RoKSB7XG4gICAgICAgIGlmICh1c2VzUGFja2VkVGV4dHVyZXMpIHtcbiAgICAgICAgICAgIHJlcyArPSBnZXRQYWNrZWRTYW1wbGVyQXRPdXRwdXRDb29yZHMoaW5JbmZvLCBvdXRTaGFwZUluZm8pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzICs9IGdldFNhbXBsZXJBdE91dHB1dENvb3JkcyhpbkluZm8sIG91dFNoYXBlSW5mbyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmZ1bmN0aW9uIGdldFBhY2tlZE91dHB1dFNhbXBsaW5nU25pcHBldChvdXRTaGFwZSwgb3V0VGV4U2hhcGUsIGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICBzd2l0Y2ggKG91dFNoYXBlLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICByZXR1cm4gZ2V0T3V0cHV0U2NhbGFyQ29vcmRzKCk7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIHJldHVybiBnZXRPdXRwdXRQYWNrZWQxRENvb3JkcyhvdXRTaGFwZSwgb3V0VGV4U2hhcGUsIGVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICByZXR1cm4gZ2V0T3V0cHV0UGFja2VkMkRDb29yZHMob3V0U2hhcGUsIG91dFRleFNoYXBlLCBlbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgcmV0dXJuIGdldE91dHB1dFBhY2tlZDNEQ29vcmRzKG91dFNoYXBlLCBvdXRUZXhTaGFwZSwgZW5hYmxlU2hhcGVVbmlmb3Jtcyk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZ2V0T3V0cHV0UGFja2VkTkRDb29yZHMob3V0U2hhcGUsIG91dFRleFNoYXBlLCBlbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRPdXRwdXRTYW1wbGluZ1NuaXBwZXQob3V0U2hhcGUsIG91dFRleFNoYXBlLCBlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgc3dpdGNoIChvdXRTaGFwZS5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgcmV0dXJuIGdldE91dHB1dFNjYWxhckNvb3JkcygpO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICByZXR1cm4gZ2V0T3V0cHV0MURDb29yZHMob3V0U2hhcGUsIG91dFRleFNoYXBlLCBlbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgcmV0dXJuIGdldE91dHB1dDJEQ29vcmRzKG91dFNoYXBlLCBvdXRUZXhTaGFwZSwgZW5hYmxlU2hhcGVVbmlmb3Jtcyk7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIHJldHVybiBnZXRPdXRwdXQzRENvb3JkcyhvdXRTaGFwZSwgb3V0VGV4U2hhcGUsIGVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICByZXR1cm4gZ2V0T3V0cHV0NERDb29yZHMob3V0U2hhcGUsIG91dFRleFNoYXBlLCBlbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgcmV0dXJuIGdldE91dHB1dDVEQ29vcmRzKG91dFNoYXBlLCBvdXRUZXhTaGFwZSk7XG4gICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgIHJldHVybiBnZXRPdXRwdXQ2RENvb3JkcyhvdXRTaGFwZSwgb3V0VGV4U2hhcGUpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke291dFNoYXBlLmxlbmd0aH0tRCBvdXRwdXQgc2FtcGxpbmcgaXMgbm90IHlldCBzdXBwb3J0ZWRgKTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRGbG9hdFRleHR1cmVTYW1wbGVTbmlwcGV0KGdsc2wpIHtcbiAgICByZXR1cm4gYFxuICAgIGZsb2F0IHNhbXBsZVRleHR1cmUoc2FtcGxlcjJEIHRleHR1cmVTYW1wbGVyLCB2ZWMyIHV2KSB7XG4gICAgICByZXR1cm4gJHtnbHNsLnRleHR1cmUyRH0odGV4dHVyZVNhbXBsZXIsIHV2KS5yO1xuICAgIH1cbiAgYDtcbn1cbmZ1bmN0aW9uIGdldEZsb2F0VGV4dHVyZVNldFJTbmlwcGV0KGdsc2wpIHtcbiAgICByZXR1cm4gYFxuICAgIHZvaWQgc2V0T3V0cHV0KGZsb2F0IHZhbCkge1xuICAgICAgJHtnbHNsLm91dHB1dH0gPSB2ZWM0KHZhbCwgMCwgMCwgMCk7XG4gICAgfVxuICBgO1xufVxuZnVuY3Rpb24gZ2V0RmxvYXRUZXh0dXJlU2V0UkdCQVNuaXBwZXQoZ2xzbCkge1xuICAgIHJldHVybiBgXG4gICAgdm9pZCBzZXRPdXRwdXQodmVjNCB2YWwpIHtcbiAgICAgICR7Z2xzbC5vdXRwdXR9ID0gdmFsO1xuICAgIH1cbiAgYDtcbn1cbmZ1bmN0aW9uIGdldFNoYWRlclByZWZpeChnbHNsKSB7XG4gICAgY29uc3QgU0hBREVSX1BSRUZJWCA9IGAke2dsc2wudmVyc2lvbn1cbiAgICBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7XG4gICAgcHJlY2lzaW9uIGhpZ2hwIGludDtcbiAgICBwcmVjaXNpb24gaGlnaHAgc2FtcGxlcjJEO1xuICAgICR7Z2xzbC52YXJ5aW5nRnN9IHZlYzIgcmVzdWx0VVY7XG4gICAgJHtnbHNsLmRlZmluZU91dHB1dH1cbiAgICBjb25zdCB2ZWMyIGhhbGZDUiA9IHZlYzIoMC41LCAwLjUpO1xuXG4gICAgc3RydWN0IGl2ZWM1XG4gICAge1xuICAgICAgaW50IHg7XG4gICAgICBpbnQgeTtcbiAgICAgIGludCB6O1xuICAgICAgaW50IHc7XG4gICAgICBpbnQgdTtcbiAgICB9O1xuXG4gICAgc3RydWN0IGl2ZWM2XG4gICAge1xuICAgICAgaW50IHg7XG4gICAgICBpbnQgeTtcbiAgICAgIGludCB6O1xuICAgICAgaW50IHc7XG4gICAgICBpbnQgdTtcbiAgICAgIGludCB2O1xuICAgIH07XG5cbiAgICB1bmlmb3JtIGZsb2F0IE5BTjtcbiAgICAke2dsc2wuZGVmaW5lU3BlY2lhbE5hTn1cbiAgICAke2dsc2wuZGVmaW5lU3BlY2lhbEluZn1cbiAgICAke2dsc2wuZGVmaW5lUm91bmR9XG5cbiAgICBpbnQgaW1vZChpbnQgeCwgaW50IHkpIHtcbiAgICAgIHJldHVybiB4IC0geSAqICh4IC8geSk7XG4gICAgfVxuXG4gICAgaW50IGlkaXYoaW50IGEsIGludCBiLCBmbG9hdCBzaWduKSB7XG4gICAgICBpbnQgcmVzID0gYSAvIGI7XG4gICAgICBpbnQgbW9kID0gaW1vZChhLCBiKTtcbiAgICAgIGlmIChzaWduIDwgMC4gJiYgbW9kICE9IDApIHtcbiAgICAgICAgcmVzIC09IDE7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8vQmFzZWQgb24gdGhlIHdvcmsgb2YgRGF2ZSBIb3NraW5zXG4gICAgLy9odHRwczovL3d3dy5zaGFkZXJ0b3kuY29tL3ZpZXcvNGRqU1JXXG4gICAgI2RlZmluZSBIQVNIU0NBTEUxIDQ0My44OTc1XG4gICAgZmxvYXQgcmFuZG9tKGZsb2F0IHNlZWQpe1xuICAgICAgdmVjMiBwID0gcmVzdWx0VVYgKiBzZWVkO1xuICAgICAgdmVjMyBwMyAgPSBmcmFjdCh2ZWMzKHAueHl4KSAqIEhBU0hTQ0FMRTEpO1xuICAgICAgcDMgKz0gZG90KHAzLCBwMy55enggKyAxOS4xOSk7XG4gICAgICByZXR1cm4gZnJhY3QoKHAzLnggKyBwMy55KSAqIHAzLnopO1xuICAgIH1cblxuICAgICR7U0FNUExFXzFEX1NOSVBQRVR9XG4gICAgJHtTQU1QTEVfMkRfU05JUFBFVH1cbiAgICAke1NBTVBMRV8zRF9TTklQUEVUfVxuICBgO1xuICAgIHJldHVybiBTSEFERVJfUFJFRklYO1xufVxuY29uc3QgU0FNUExFXzFEX1NOSVBQRVQgPSBgXG52ZWMyIHV2RnJvbUZsYXQoaW50IHRleE51bVIsIGludCB0ZXhOdW1DLCBpbnQgaW5kZXgpIHtcbiAgaW50IHRleFIgPSBpbmRleCAvIHRleE51bUM7XG4gIGludCB0ZXhDID0gaW5kZXggLSB0ZXhSICogdGV4TnVtQztcbiAgcmV0dXJuICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvIHZlYzIodGV4TnVtQywgdGV4TnVtUik7XG59XG52ZWMyIHBhY2tlZFVWZnJvbTFEKGludCB0ZXhOdW1SLCBpbnQgdGV4TnVtQywgaW50IGluZGV4KSB7XG4gIGludCB0ZXhlbEluZGV4ID0gaW5kZXggLyAyO1xuICBpbnQgdGV4UiA9IHRleGVsSW5kZXggLyB0ZXhOdW1DO1xuICBpbnQgdGV4QyA9IHRleGVsSW5kZXggLSB0ZXhSICogdGV4TnVtQztcbiAgcmV0dXJuICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvIHZlYzIodGV4TnVtQywgdGV4TnVtUik7XG59XG5gO1xuY29uc3QgU0FNUExFXzJEX1NOSVBQRVQgPSBgXG52ZWMyIHBhY2tlZFVWZnJvbTJEKGludCB0ZXhlbHNJbkxvZ2ljYWxSb3csIGludCB0ZXhOdW1SLFxuICBpbnQgdGV4TnVtQywgaW50IHJvdywgaW50IGNvbCkge1xuICBpbnQgdGV4ZWxJbmRleCA9IChyb3cgLyAyKSAqIHRleGVsc0luTG9naWNhbFJvdyArIChjb2wgLyAyKTtcbiAgaW50IHRleFIgPSB0ZXhlbEluZGV4IC8gdGV4TnVtQztcbiAgaW50IHRleEMgPSB0ZXhlbEluZGV4IC0gdGV4UiAqIHRleE51bUM7XG4gIHJldHVybiAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgLyB2ZWMyKHRleE51bUMsIHRleE51bVIpO1xufVxuYDtcbmNvbnN0IFNBTVBMRV8zRF9TTklQUEVUID0gYFxudmVjMiBwYWNrZWRVVmZyb20zRChpbnQgdGV4TnVtUiwgaW50IHRleE51bUMsXG4gICAgaW50IHRleGVsc0luQmF0Y2gsIGludCB0ZXhlbHNJbkxvZ2ljYWxSb3csIGludCBiLFxuICAgIGludCByb3csIGludCBjb2wpIHtcbiAgaW50IGluZGV4ID0gYiAqIHRleGVsc0luQmF0Y2ggKyAocm93IC8gMikgKiB0ZXhlbHNJbkxvZ2ljYWxSb3cgKyAoY29sIC8gMik7XG4gIGludCB0ZXhSID0gaW5kZXggLyB0ZXhOdW1DO1xuICBpbnQgdGV4QyA9IGluZGV4IC0gdGV4UiAqIHRleE51bUM7XG4gIHJldHVybiAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgLyB2ZWMyKHRleE51bUMsIHRleE51bVIpO1xufVxuYDtcbmNvbnN0IFNIQURFUl9QQUNLRURfUFJFRklYID0gYFxuICBmbG9hdCBnZXRDaGFubmVsKHZlYzQgZnJhZywgdmVjMiBpbm5lckRpbXMpIHtcbiAgICB2ZWMyIG1vZENvb3JkID0gbW9kKGlubmVyRGltcywgMi4pO1xuICAgIHJldHVybiBtb2RDb29yZC54ID09IDAuID9cbiAgICAgIChtb2RDb29yZC55ID09IDAuID8gZnJhZy5yIDogZnJhZy5nKSA6XG4gICAgICAobW9kQ29vcmQueSA9PSAwLiA/IGZyYWcuYiA6IGZyYWcuYSk7XG4gIH1cbiAgZmxvYXQgZ2V0Q2hhbm5lbCh2ZWM0IGZyYWcsIGludCBkaW0pIHtcbiAgICBmbG9hdCBtb2RDb29yZCA9IG1vZChmbG9hdChkaW0pLCAyLik7XG4gICAgcmV0dXJuIG1vZENvb3JkID09IDAuID8gZnJhZy5yIDogZnJhZy5nO1xuICB9XG5gO1xuZnVuY3Rpb24gZ2V0T3V0cHV0U2NhbGFyQ29vcmRzKCkge1xuICAgIHJldHVybiBgXG4gICAgaW50IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgYDtcbn1cbmZ1bmN0aW9uIGdldE91dHB1dFBhY2tlZDFEQ29vcmRzKHNoYXBlLCB0ZXhTaGFwZSwgZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgIGNvbnN0IHBhY2tlZFRleFNoYXBlID0gW01hdGguY2VpbCh0ZXhTaGFwZVswXSAvIDIpLCBNYXRoLmNlaWwodGV4U2hhcGVbMV0gLyAyKV07XG4gICAgaWYgKHBhY2tlZFRleFNoYXBlWzBdID09PSAxKSB7XG4gICAgICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICAgICAgICByZXR1cm4gYFxuICAgICAgaW50IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgcmV0dXJuIDIgKiBpbnQocmVzdWx0VVYueCAqIGNlaWwoZmxvYXQob3V0VGV4U2hhcGVbMV0pIC8gMi4wKSk7XG4gICAgICB9XG4gICAgYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYFxuICAgICAgaW50IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgcmV0dXJuIDIgKiBpbnQocmVzdWx0VVYueCAqICR7cGFja2VkVGV4U2hhcGVbMV19LjApO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIGlmIChwYWNrZWRUZXhTaGFwZVsxXSA9PT0gMSkge1xuICAgICAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgICAgICAgcmV0dXJuIGBcbiAgICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgIHJldHVybiAyICogaW50KHJlc3VsdFVWLnkgKiBjZWlsKGZsb2F0KG91dFRleFNoYXBlWzBdKSAvIDIuMCkpO1xuICAgICAgfVxuICAgIGA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGBcbiAgICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgIHJldHVybiAyICogaW50KHJlc3VsdFVWLnkgKiAke3BhY2tlZFRleFNoYXBlWzBdfS4wKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgICByZXR1cm4gYFxuICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiBwYWNrZWRUZXhTaGFwZSA9IGl2ZWMyKGNlaWwoZmxvYXQob3V0VGV4U2hhcGVbMF0pIC8gMi4wKSwgY2VpbChmbG9hdChvdXRUZXhTaGFwZVsxXSkgLyAyLjApKTtcbiAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIocmVzdWx0VVYueXggKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKHBhY2tlZFRleFNoYXBlWzBdLCBwYWNrZWRUZXhTaGFwZVsxXSkpO1xuICAgICAgcmV0dXJuIDIgKiAocmVzVGV4UkMueCAqIHBhY2tlZFRleFNoYXBlWzFdICsgcmVzVGV4UkMueSk7XG4gICAgfVxuICBgO1xuICAgIH1cbiAgICByZXR1cm4gYFxuICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3BhY2tlZFRleFNoYXBlWzBdfSwgJHtwYWNrZWRUZXhTaGFwZVsxXX0pKTtcbiAgICAgIHJldHVybiAyICogKHJlc1RleFJDLnggKiAke3BhY2tlZFRleFNoYXBlWzFdfSArIHJlc1RleFJDLnkpO1xuICAgIH1cbiAgYDtcbn1cbmZ1bmN0aW9uIGdldE91dHB1dDFEQ29vcmRzKHNoYXBlLCB0ZXhTaGFwZSwgZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgIGlmICh0ZXhTaGFwZVswXSA9PT0gMSkge1xuICAgICAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgICAgICAgcmV0dXJuIGBcbiAgICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgIHJldHVybiBpbnQocmVzdWx0VVYueCAqIGZsb2F0KG91dFRleFNoYXBlWzFdKSk7XG4gICAgICB9XG4gICAgYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYFxuICAgICAgaW50IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgcmV0dXJuIGludChyZXN1bHRVVi54ICogJHt0ZXhTaGFwZVsxXX0uMCk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG4gICAgaWYgKHRleFNoYXBlWzFdID09PSAxKSB7XG4gICAgICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICAgICAgICByZXR1cm4gYFxuICAgICAgaW50IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgcmV0dXJuIGludChyZXN1bHRVVi55ICogZmxvYXQob3V0VGV4U2hhcGVbMF0pKTtcbiAgICAgIH1cbiAgICBgO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgXG4gICAgICBpbnQgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgICByZXR1cm4gaW50KHJlc3VsdFVWLnkgKiAke3RleFNoYXBlWzBdfS4wKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgICByZXR1cm4gYFxuICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMihvdXRUZXhTaGFwZVswXSwgb3V0VGV4U2hhcGVbMV0pKTtcbiAgICAgIHJldHVybiByZXNUZXhSQy54ICogb3V0VGV4U2hhcGVbMV0gKyByZXNUZXhSQy55O1xuICAgIH1cbiAgYDtcbiAgICB9XG4gICAgcmV0dXJuIGBcbiAgICBpbnQgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihyZXN1bHRVVi55eCAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoJHt0ZXhTaGFwZVswXX0sICR7dGV4U2hhcGVbMV19KSk7XG4gICAgICByZXR1cm4gcmVzVGV4UkMueCAqICR7dGV4U2hhcGVbMV19ICsgcmVzVGV4UkMueTtcbiAgICB9XG4gIGA7XG59XG5mdW5jdGlvbiBnZXRPdXRwdXRQYWNrZWQzRENvb3JkcyhzaGFwZSwgdGV4U2hhcGUsIGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgICByZXR1cm4gYFxuICAgIGl2ZWMzIGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgIGl2ZWMyIHBhY2tlZFRleFNoYXBlID0gaXZlYzIoY2VpbChmbG9hdChvdXRUZXhTaGFwZVswXSkgLyAyLjApLCBjZWlsKGZsb2F0KG91dFRleFNoYXBlWzFdKSAvIDIuMCkpO1xuICAgICAgaW50IHRleGVsc0luTG9naWNhbFJvdyA9IGludChjZWlsKGZsb2F0KG91dFNoYXBlWzJdKSAvIDIuMCkpO1xuICAgICAgaW50IHRleGVsc0luQmF0Y2ggPSB0ZXhlbHNJbkxvZ2ljYWxSb3cgKiBpbnQoY2VpbChmbG9hdChvdXRTaGFwZVsxXSkgLyAyLjApKTtcbiAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIocmVzdWx0VVYueXggKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKHBhY2tlZFRleFNoYXBlWzBdLCBwYWNrZWRUZXhTaGFwZVsxXSkpO1xuICAgICAgaW50IGluZGV4ID0gcmVzVGV4UkMueCAqIHBhY2tlZFRleFNoYXBlWzFdICsgcmVzVGV4UkMueTtcblxuICAgICAgaW50IGIgPSBpbmRleCAvIHRleGVsc0luQmF0Y2g7XG4gICAgICBpbmRleCAtPSBiICogdGV4ZWxzSW5CYXRjaDtcblxuICAgICAgaW50IHIgPSAyICogKGluZGV4IC8gdGV4ZWxzSW5Mb2dpY2FsUm93KTtcbiAgICAgIGludCBjID0gaW1vZChpbmRleCwgdGV4ZWxzSW5Mb2dpY2FsUm93KSAqIDI7XG5cbiAgICAgIHJldHVybiBpdmVjMyhiLCByLCBjKTtcbiAgICB9XG4gIGA7XG4gICAgfVxuICAgIGNvbnN0IHBhY2tlZFRleFNoYXBlID0gW01hdGguY2VpbCh0ZXhTaGFwZVswXSAvIDIpLCBNYXRoLmNlaWwodGV4U2hhcGVbMV0gLyAyKV07XG4gICAgY29uc3QgdGV4ZWxzSW5Mb2dpY2FsUm93ID0gTWF0aC5jZWlsKHNoYXBlWzJdIC8gMik7XG4gICAgY29uc3QgdGV4ZWxzSW5CYXRjaCA9IHRleGVsc0luTG9naWNhbFJvdyAqIE1hdGguY2VpbChzaGFwZVsxXSAvIDIpO1xuICAgIHJldHVybiBgXG4gICAgaXZlYzMgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihyZXN1bHRVVi55eCAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoJHtwYWNrZWRUZXhTaGFwZVswXX0sICR7cGFja2VkVGV4U2hhcGVbMV19KSk7XG4gICAgICBpbnQgaW5kZXggPSByZXNUZXhSQy54ICogJHtwYWNrZWRUZXhTaGFwZVsxXX0gKyByZXNUZXhSQy55O1xuXG4gICAgICBpbnQgYiA9IGluZGV4IC8gJHt0ZXhlbHNJbkJhdGNofTtcbiAgICAgIGluZGV4IC09IGIgKiAke3RleGVsc0luQmF0Y2h9O1xuXG4gICAgICBpbnQgciA9IDIgKiAoaW5kZXggLyAke3RleGVsc0luTG9naWNhbFJvd30pO1xuICAgICAgaW50IGMgPSBpbW9kKGluZGV4LCAke3RleGVsc0luTG9naWNhbFJvd30pICogMjtcblxuICAgICAgcmV0dXJuIGl2ZWMzKGIsIHIsIGMpO1xuICAgIH1cbiAgYDtcbn1cbmZ1bmN0aW9uIGdldE91dHB1dDNEQ29vcmRzKHNoYXBlLCB0ZXhTaGFwZSwgZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICAgIGNvbnN0IGNvb3Jkc0Zyb21JbmRleFNuaXBwZXQgPSBzaGFkZXJfdXRpbC5nZXRMb2dpY2FsQ29vcmRpbmF0ZXNGcm9tRmxhdEluZGV4QnlVbmlmb3JtKFsncicsICdjJywgJ2QnXSwgc2hhcGUpO1xuICAgICAgICByZXR1cm4gYFxuICBpdmVjMyBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihyZXN1bHRVVi55eCAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKG91dFRleFNoYXBlWzBdLCBvdXRUZXhTaGFwZVsxXSkpO1xuICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiBvdXRUZXhTaGFwZVsxXSArIHJlc1RleFJDLnk7XG4gICAgJHtjb29yZHNGcm9tSW5kZXhTbmlwcGV0fVxuICAgIHJldHVybiBpdmVjMyhyLCBjLCBkKTtcbiAgfVxuYDtcbiAgICB9XG4gICAgY29uc3QgY29vcmRzRnJvbUluZGV4U25pcHBldCA9IHNoYWRlcl91dGlsLmdldExvZ2ljYWxDb29yZGluYXRlc0Zyb21GbGF0SW5kZXgoWydyJywgJ2MnLCAnZCddLCBzaGFwZSk7XG4gICAgcmV0dXJuIGBcbiAgICBpdmVjMyBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3RleFNoYXBlWzBdfSwgJHt0ZXhTaGFwZVsxXX0pKTtcbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiAke3RleFNoYXBlWzFdfSArIHJlc1RleFJDLnk7XG4gICAgICAke2Nvb3Jkc0Zyb21JbmRleFNuaXBwZXR9XG4gICAgICByZXR1cm4gaXZlYzMociwgYywgZCk7XG4gICAgfVxuICBgO1xufVxuZnVuY3Rpb24gZ2V0T3V0cHV0UGFja2VkTkRDb29yZHMoc2hhcGUsIHRleFNoYXBlLCBlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgICAgLy8gVE9ETzogc3VwcG9ydCA1ZCBhbmQgNmRcbiAgICAgICAgcmV0dXJuIGBcbiAgICBpdmVjNCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiBwYWNrZWRUZXhTaGFwZSA9IGl2ZWMyKGNlaWwoZmxvYXQob3V0VGV4U2hhcGVbMF0pIC8gMi4wKSwgY2VpbChmbG9hdChvdXRUZXhTaGFwZVsxXSkgLyAyLjApKTtcbiAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIocmVzdWx0VVYueXggKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKHBhY2tlZFRleFNoYXBlWzBdLCBwYWNrZWRUZXhTaGFwZVsxXSkpO1xuICAgICAgaW50IGluZGV4ID0gcmVzVGV4UkMueCAqIHBhY2tlZFRleFNoYXBlWzFdICsgcmVzVGV4UkMueTtcblxuICAgICAgaW50IHRleGVsc0luTG9naWNhbFJvdyA9IGludChjZWlsKGZsb2F0KG91dFNoYXBlWzNdKSAvIDIuMCkpO1xuICAgICAgaW50IHRleGVsc0luQmF0Y2ggPSB0ZXhlbHNJbkxvZ2ljYWxSb3cgKiBpbnQoY2VpbChmbG9hdChvdXRTaGFwZVsyXSkgLyAyLjApKTtcbiAgICAgIGludCB0ZXhlbHNJbkJhdGNoTiA9IHRleGVsc0luQmF0Y2ggKiBvdXRTaGFwZVsxXTtcblxuICAgICAgaW50IGIyID0gaW5kZXggLyB0ZXhlbHNJbkJhdGNoTjtcbiAgICAgIGluZGV4IC09IGIyICogdGV4ZWxzSW5CYXRjaE47XG5cbiAgICAgIGludCBiID0gaW5kZXggLyB0ZXhlbHNJbkJhdGNoO1xuICAgICAgaW5kZXggLT0gYiAqIHRleGVsc0luQmF0Y2g7XG5cbiAgICAgIGludCByID0gMiAqIChpbmRleCAvIHRleGVsc0luTG9naWNhbFJvdyk7XG4gICAgICBpbnQgYyA9IGltb2QoaW5kZXgsIHRleGVsc0luTG9naWNhbFJvdykgKiAyO1xuXG4gICAgICByZXR1cm4gaXZlYzQoYjIsIGIsIHIsIGMpO1xuICAgIH1cbiAgYDtcbiAgICB9XG4gICAgY29uc3QgcGFja2VkVGV4U2hhcGUgPSBbTWF0aC5jZWlsKHRleFNoYXBlWzBdIC8gMiksIE1hdGguY2VpbCh0ZXhTaGFwZVsxXSAvIDIpXTtcbiAgICBjb25zdCB0ZXhlbHNJbkxvZ2ljYWxSb3cgPSBNYXRoLmNlaWwoc2hhcGVbc2hhcGUubGVuZ3RoIC0gMV0gLyAyKTtcbiAgICBjb25zdCB0ZXhlbHNJbkJhdGNoID0gdGV4ZWxzSW5Mb2dpY2FsUm93ICogTWF0aC5jZWlsKHNoYXBlW3NoYXBlLmxlbmd0aCAtIDJdIC8gMik7XG4gICAgbGV0IHRleGVsc0luQmF0Y2hOID0gdGV4ZWxzSW5CYXRjaDtcbiAgICBsZXQgYmF0Y2hlcyA9IGBgO1xuICAgIGxldCBjb29yZHMgPSAnYiwgciwgYyc7XG4gICAgZm9yIChsZXQgYiA9IDI7IGIgPCBzaGFwZS5sZW5ndGggLSAxOyBiKyspIHtcbiAgICAgICAgdGV4ZWxzSW5CYXRjaE4gKj0gc2hhcGVbc2hhcGUubGVuZ3RoIC0gYiAtIDFdO1xuICAgICAgICBiYXRjaGVzID0gYFxuICAgICAgaW50IGIke2J9ID0gaW5kZXggLyAke3RleGVsc0luQmF0Y2hOfTtcbiAgICAgIGluZGV4IC09IGIke2J9ICogJHt0ZXhlbHNJbkJhdGNoTn07XG4gICAgYCArIGJhdGNoZXM7XG4gICAgICAgIGNvb3JkcyA9IGBiJHtifSwgYCArIGNvb3JkcztcbiAgICB9XG4gICAgcmV0dXJuIGBcbiAgICBpdmVjJHtzaGFwZS5sZW5ndGh9IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIocmVzdWx0VVYueXggKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKCR7cGFja2VkVGV4U2hhcGVbMF19LCAke3BhY2tlZFRleFNoYXBlWzFdfSkpO1xuICAgICAgaW50IGluZGV4ID0gcmVzVGV4UkMueCAqICR7cGFja2VkVGV4U2hhcGVbMV19ICsgcmVzVGV4UkMueTtcblxuICAgICAgJHtiYXRjaGVzfVxuXG4gICAgICBpbnQgYiA9IGluZGV4IC8gJHt0ZXhlbHNJbkJhdGNofTtcbiAgICAgIGluZGV4IC09IGIgKiAke3RleGVsc0luQmF0Y2h9O1xuXG4gICAgICBpbnQgciA9IDIgKiAoaW5kZXggLyAke3RleGVsc0luTG9naWNhbFJvd30pO1xuICAgICAgaW50IGMgPSBpbW9kKGluZGV4LCAke3RleGVsc0luTG9naWNhbFJvd30pICogMjtcblxuICAgICAgcmV0dXJuIGl2ZWMke3NoYXBlLmxlbmd0aH0oJHtjb29yZHN9KTtcbiAgICB9XG4gIGA7XG59XG5mdW5jdGlvbiBnZXRPdXRwdXQ0RENvb3JkcyhzaGFwZSwgdGV4U2hhcGUsIGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgICBjb25zdCBjb29yZHNGcm9tSW5kZXhTbmlwcGV0ID0gc2hhZGVyX3V0aWwuZ2V0TG9naWNhbENvb3JkaW5hdGVzRnJvbUZsYXRJbmRleEJ5VW5pZm9ybShbJ3InLCAnYycsICdkJywgJ2QyJ10sIHNoYXBlKTtcbiAgICAgICAgcmV0dXJuIGBcbiAgICBpdmVjNCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgdmVjMihvdXRUZXhTaGFwZVswXSwgb3V0VGV4U2hhcGVbMV0pKTtcbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiBvdXRUZXhTaGFwZVsxXSArIHJlc1RleFJDLnk7XG4gICAgICAke2Nvb3Jkc0Zyb21JbmRleFNuaXBwZXR9XG4gICAgICByZXR1cm4gaXZlYzQociwgYywgZCwgZDIpO1xuICAgIH1cbiAgYDtcbiAgICB9XG4gICAgY29uc3QgY29vcmRzRnJvbUluZGV4U25pcHBldCA9IHNoYWRlcl91dGlsLmdldExvZ2ljYWxDb29yZGluYXRlc0Zyb21GbGF0SW5kZXgoWydyJywgJ2MnLCAnZCcsICdkMiddLCBzaGFwZSk7XG4gICAgcmV0dXJuIGBcbiAgICBpdmVjNCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgdmVjMigke3RleFNoYXBlWzBdfSwgJHt0ZXhTaGFwZVsxXX0pKTtcbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiAke3RleFNoYXBlWzFdfSArIHJlc1RleFJDLnk7XG4gICAgICAke2Nvb3Jkc0Zyb21JbmRleFNuaXBwZXR9XG4gICAgICByZXR1cm4gaXZlYzQociwgYywgZCwgZDIpO1xuICAgIH1cbiAgYDtcbn1cbmZ1bmN0aW9uIGdldE91dHB1dDVEQ29vcmRzKHNoYXBlLCB0ZXhTaGFwZSkge1xuICAgIGNvbnN0IGNvb3Jkc0Zyb21JbmRleFNuaXBwZXQgPSBzaGFkZXJfdXRpbC5nZXRMb2dpY2FsQ29vcmRpbmF0ZXNGcm9tRmxhdEluZGV4KFsncicsICdjJywgJ2QnLCAnZDInLCAnZDMnXSwgc2hhcGUpO1xuICAgIHJldHVybiBgXG4gICAgaXZlYzUgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihyZXN1bHRVVi55eCAqIHZlYzIoJHt0ZXhTaGFwZVswXX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7dGV4U2hhcGVbMV19KSk7XG5cbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiAke3RleFNoYXBlWzFdfSArIHJlc1RleFJDLnk7XG5cbiAgICAgICR7Y29vcmRzRnJvbUluZGV4U25pcHBldH1cblxuICAgICAgaXZlYzUgb3V0U2hhcGUgPSBpdmVjNShyLCBjLCBkLCBkMiwgZDMpO1xuICAgICAgcmV0dXJuIG91dFNoYXBlO1xuICAgIH1cbiAgYDtcbn1cbmZ1bmN0aW9uIGdldE91dHB1dDZEQ29vcmRzKHNoYXBlLCB0ZXhTaGFwZSkge1xuICAgIGNvbnN0IGNvb3Jkc0Zyb21JbmRleFNuaXBwZXQgPSBzaGFkZXJfdXRpbC5nZXRMb2dpY2FsQ29vcmRpbmF0ZXNGcm9tRmxhdEluZGV4KFsncicsICdjJywgJ2QnLCAnZDInLCAnZDMnLCAnZDQnXSwgc2hhcGUpO1xuICAgIHJldHVybiBgXG4gICAgaXZlYzYgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihyZXN1bHRVVi55eCAqXG4gICAgICAgIHZlYzIoJHt0ZXhTaGFwZVswXX0sICR7dGV4U2hhcGVbMV19KSk7XG4gICAgICBpbnQgaW5kZXggPSByZXNUZXhSQy54ICogJHt0ZXhTaGFwZVsxXX0gKyByZXNUZXhSQy55O1xuXG4gICAgICAke2Nvb3Jkc0Zyb21JbmRleFNuaXBwZXR9XG5cbiAgICAgIGl2ZWM2IHJlc3VsdCA9IGl2ZWM2KHIsIGMsIGQsIGQyLCBkMywgZDQpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIGA7XG59XG5mdW5jdGlvbiBnZXRPdXRwdXRQYWNrZWQyRENvb3JkcyhzaGFwZSwgdGV4U2hhcGUsIGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICBjb25zdCBwYWNrZWRUZXhTaGFwZSA9IFtNYXRoLmNlaWwodGV4U2hhcGVbMF0gLyAyKSwgTWF0aC5jZWlsKHRleFNoYXBlWzFdIC8gMildO1xuICAgIGlmICh1dGlsLmFycmF5c0VxdWFsKHNoYXBlLCB0ZXhTaGFwZSkpIHtcbiAgICAgICAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgICAgICAgIHJldHVybiBgXG4gICAgICBpdmVjMiBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgIGl2ZWMyIHBhY2tlZFRleFNoYXBlID0gaXZlYzIoY2VpbChmbG9hdChvdXRUZXhTaGFwZVswXSkgLyAyLjApLCBjZWlsKGZsb2F0KG91dFRleFNoYXBlWzFdKSAvIDIuMCkpO1xuICAgICAgICByZXR1cm4gMiAqIGl2ZWMyKHJlc3VsdFVWLnl4ICogdmVjMihwYWNrZWRUZXhTaGFwZVswXSwgcGFja2VkVGV4U2hhcGVbMV0pKTtcbiAgICAgIH1cbiAgICBgO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgXG4gICAgICBpdmVjMiBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgIHJldHVybiAyICogaXZlYzIocmVzdWx0VVYueXggKiB2ZWMyKCR7cGFja2VkVGV4U2hhcGVbMF19LCAke3BhY2tlZFRleFNoYXBlWzFdfSkpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIC8vIHRleGVscyBuZWVkZWQgdG8gYWNjb21tb2RhdGUgYSBsb2dpY2FsIHJvd1xuICAgIGNvbnN0IHRleGVsc0luTG9naWNhbFJvdyA9IE1hdGguY2VpbChzaGFwZVsxXSAvIDIpO1xuICAgIC8qKlxuICAgICAqIGdldE91dHB1dENvb3Jkc1xuICAgICAqXG4gICAgICogcmVzVGV4UkM6IFRoZSByb3dzIGFuZCBjb2x1bW5zIG9mIHRoZSB0ZXhlbHMuIElmIHlvdSBtb3ZlIG92ZXIgb25lXG4gICAgICogdGV4ZWwgdG8gdGhlIHJpZ2h0IGluIHRoZSBwYWNrZWQgdGV4dHVyZSwgeW91IGFyZSBtb3Zpbmcgb3ZlciBvbmUgY29sdW1uXG4gICAgICogKG5vdCB0d28pLlxuICAgICAqXG4gICAgICogaW5kZXg6IFRoZSB0ZXhlbCBpbmRleFxuICAgICAqL1xuICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICAgIHJldHVybiBgXG4gICAgaXZlYzIgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgaXZlYzIgcGFja2VkVGV4U2hhcGUgPSBpdmVjMihjZWlsKGZsb2F0KG91dFRleFNoYXBlWzBdKSAvIDIuMCksIGNlaWwoZmxvYXQob3V0VGV4U2hhcGVbMV0pIC8gMi4wKSk7XG4gICAgICBpbnQgdGV4ZWxzSW5Mb2dpY2FsUm93ID0gaW50KGNlaWwoZmxvYXQob3V0U2hhcGVbMV0pIC8gMi4wKSk7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMihwYWNrZWRUZXhTaGFwZVswXSwgcGFja2VkVGV4U2hhcGVbMV0pKTtcblxuICAgICAgaW50IGluZGV4ID0gcmVzVGV4UkMueCAqIHBhY2tlZFRleFNoYXBlWzFdICsgcmVzVGV4UkMueTtcbiAgICAgIGludCByID0gMiAqIChpbmRleCAvIHRleGVsc0luTG9naWNhbFJvdyk7XG4gICAgICBpbnQgYyA9IGltb2QoaW5kZXgsIHRleGVsc0luTG9naWNhbFJvdykgKiAyO1xuXG4gICAgICByZXR1cm4gaXZlYzIociwgYyk7XG4gICAgfVxuICBgO1xuICAgIH1cbiAgICByZXR1cm4gYFxuICAgIGl2ZWMyIGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIocmVzdWx0VVYueXggKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKCR7cGFja2VkVGV4U2hhcGVbMF19LCAke3BhY2tlZFRleFNoYXBlWzFdfSkpO1xuXG4gICAgICBpbnQgaW5kZXggPSByZXNUZXhSQy54ICogJHtwYWNrZWRUZXhTaGFwZVsxXX0gKyByZXNUZXhSQy55O1xuICAgICAgaW50IHIgPSAyICogKGluZGV4IC8gJHt0ZXhlbHNJbkxvZ2ljYWxSb3d9KTtcbiAgICAgIGludCBjID0gaW1vZChpbmRleCwgJHt0ZXhlbHNJbkxvZ2ljYWxSb3d9KSAqIDI7XG5cbiAgICAgIHJldHVybiBpdmVjMihyLCBjKTtcbiAgICB9XG4gIGA7XG59XG5mdW5jdGlvbiBnZXRPdXRwdXQyRENvb3JkcyhzaGFwZSwgdGV4U2hhcGUsIGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICBpZiAodXRpbC5hcnJheXNFcXVhbChzaGFwZSwgdGV4U2hhcGUpKSB7XG4gICAgICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICAgICAgICByZXR1cm4gYFxuICAgICAgaXZlYzIgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgICByZXR1cm4gaXZlYzIocmVzdWx0VVYueXggKiB2ZWMyKG91dFRleFNoYXBlWzBdLCBvdXRUZXhTaGFwZVsxXSkpO1xuICAgICAgfVxuICAgIGA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGBcbiAgICAgIGl2ZWMyIGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgcmV0dXJuIGl2ZWMyKHJlc3VsdFVWLnl4ICogdmVjMigke3RleFNoYXBlWzBdfSwgJHt0ZXhTaGFwZVsxXX0pKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbiAgICBpZiAoc2hhcGVbMV0gPT09IDEpIHtcbiAgICAgICAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgICAgICAgIHJldHVybiBgXG4gICAgICBpdmVjMiBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIocmVzdWx0VVYueXggKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIob3V0VGV4U2hhcGVbMF0sIG91dFRleFNoYXBlWzFdKSk7XG4gICAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiBvdXRUZXhTaGFwZVsxXSArIHJlc1RleFJDLnk7XG4gICAgICAgIHJldHVybiBpdmVjMihpbmRleCwgMCk7XG4gICAgICB9XG4gICAgYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYFxuICAgICAgaXZlYzIgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKCR7dGV4U2hhcGVbMF19LCAke3RleFNoYXBlWzFdfSkpO1xuICAgICAgICBpbnQgaW5kZXggPSByZXNUZXhSQy54ICogJHt0ZXhTaGFwZVsxXX0gKyByZXNUZXhSQy55O1xuICAgICAgICByZXR1cm4gaXZlYzIoaW5kZXgsIDApO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIGlmIChzaGFwZVswXSA9PT0gMSkge1xuICAgICAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgICAgICAgcmV0dXJuIGBcbiAgICAgIGl2ZWMyIGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihyZXN1bHRVVi55eCAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMihvdXRUZXhTaGFwZVswXSwgb3V0VGV4U2hhcGVbMV0pKTtcbiAgICAgICAgaW50IGluZGV4ID0gcmVzVGV4UkMueCAqIG91dFRleFNoYXBlWzFdICsgcmVzVGV4UkMueTtcbiAgICAgICAgcmV0dXJuIGl2ZWMyKDAsIGluZGV4KTtcbiAgICAgIH1cbiAgICBgO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgXG4gICAgICBpdmVjMiBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIocmVzdWx0VVYueXggKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoJHt0ZXhTaGFwZVswXX0sICR7dGV4U2hhcGVbMV19KSk7XG4gICAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiAke3RleFNoYXBlWzFdfSArIHJlc1RleFJDLnk7XG4gICAgICAgIHJldHVybiBpdmVjMigwLCBpbmRleCk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG4gICAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgICAgcmV0dXJuIGBcbiAgICBpdmVjMiBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMihvdXRUZXhTaGFwZVswXSwgb3V0VGV4U2hhcGVbMV0pKTtcbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiBvdXRUZXhTaGFwZVsxXSArIHJlc1RleFJDLnk7XG4gICAgICBpbnQgciA9IGluZGV4IC8gb3V0U2hhcGVbMV07XG4gICAgICBpbnQgYyA9IGluZGV4IC0gciAqIG91dFNoYXBlWzFdO1xuICAgICAgcmV0dXJuIGl2ZWMyKHIsIGMpO1xuICAgIH1cbiAgYDtcbiAgICB9XG4gICAgcmV0dXJuIGBcbiAgICBpdmVjMiBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3RleFNoYXBlWzBdfSwgJHt0ZXhTaGFwZVsxXX0pKTtcbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiAke3RleFNoYXBlWzFdfSArIHJlc1RleFJDLnk7XG4gICAgICBpbnQgciA9IGluZGV4IC8gJHtzaGFwZVsxXX07XG4gICAgICBpbnQgYyA9IGluZGV4IC0gciAqICR7c2hhcGVbMV19O1xuICAgICAgcmV0dXJuIGl2ZWMyKHIsIGMpO1xuICAgIH1cbiAgYDtcbn1cbmZ1bmN0aW9uIGdldEZsYXRPZmZzZXRVbmlmb3JtTmFtZSh0ZXhOYW1lKSB7XG4gICAgcmV0dXJuIGBvZmZzZXQke3RleE5hbWV9YDtcbn1cbmZ1bmN0aW9uIGdldFBhY2tlZFNhbXBsZXJTY2FsYXIoaW5wdXRJbmZvKSB7XG4gICAgY29uc3QgdGV4TmFtZSA9IGlucHV0SW5mby5uYW1lO1xuICAgIGNvbnN0IGZ1bmNOYW1lID0gJ2dldCcgKyB0ZXhOYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGV4TmFtZS5zbGljZSgxKTtcbiAgICBjb25zdCBnbHNsID0gZ2V0R2xzbERpZmZlcmVuY2VzKCk7XG4gICAgcmV0dXJuIGBcbiAgICB2ZWM0ICR7ZnVuY05hbWV9KCkge1xuICAgICAgcmV0dXJuICR7Z2xzbC50ZXh0dXJlMkR9KCR7dGV4TmFtZX0sIGhhbGZDUik7XG4gICAgfVxuICBgO1xufVxuZnVuY3Rpb24gZ2V0U2FtcGxlclNjYWxhcihpbnB1dEluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICBjb25zdCB0ZXhOYW1lID0gaW5wdXRJbmZvLm5hbWU7XG4gICAgY29uc3QgZnVuY05hbWUgPSAnZ2V0JyArIHRleE5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0ZXhOYW1lLnNsaWNlKDEpO1xuICAgIGlmIChpbnB1dEluZm8uc2hhcGVJbmZvLmlzVW5pZm9ybSkge1xuICAgICAgICByZXR1cm4gYGZsb2F0ICR7ZnVuY05hbWV9KCkge3JldHVybiAke3RleE5hbWV9O31gO1xuICAgIH1cbiAgICBjb25zdCBbdGV4TnVtUiwgdGV4TnVtQ10gPSBpbnB1dEluZm8uc2hhcGVJbmZvLnRleFNoYXBlO1xuICAgIGlmICh0ZXhOdW1SID09PSAxICYmIHRleE51bUMgPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KCkge1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCBoYWxmQ1IpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIGNvbnN0IG9mZnNldCA9IGdldEZsYXRPZmZzZXRVbmlmb3JtTmFtZSh0ZXhOYW1lKTtcbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgICByZXR1cm4gYFxuICAgIGZsb2F0ICR7ZnVuY05hbWV9KCkge1xuICAgICAgdmVjMiB1diA9IHV2RnJvbUZsYXQoJHt0ZXhOYW1lfVRleFNoYXBlWzBdLCAke3RleE5hbWV9VGV4U2hhcGVbMV0sICR7b2Zmc2V0fSk7XG4gICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgfVxuICBgO1xuICAgIH1cbiAgICBjb25zdCBbdE51bVIsIHROdW1DXSA9IGlucHV0SW5mby5zaGFwZUluZm8udGV4U2hhcGU7XG4gICAgcmV0dXJuIGBcbiAgICBmbG9hdCAke2Z1bmNOYW1lfSgpIHtcbiAgICAgIHZlYzIgdXYgPSB1dkZyb21GbGF0KCR7dE51bVJ9LCAke3ROdW1DfSwgJHtvZmZzZXR9KTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG59XG5mdW5jdGlvbiBnZXRQYWNrZWRTYW1wbGVyMUQoaW5wdXRJbmZvLCBlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgY29uc3QgdGV4TmFtZSA9IGlucHV0SW5mby5uYW1lO1xuICAgIGNvbnN0IGZ1bmNOYW1lID0gJ2dldCcgKyB0ZXhOYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGV4TmFtZS5zbGljZSgxKTtcbiAgICBjb25zdCB0ZXhTaGFwZSA9IGlucHV0SW5mby5zaGFwZUluZm8udGV4U2hhcGU7XG4gICAgY29uc3QgZ2xzbCA9IGdldEdsc2xEaWZmZXJlbmNlcygpO1xuICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICAgIHJldHVybiBgXG4gICAgdmVjNCAke2Z1bmNOYW1lfShpbnQgaW5kZXgpIHtcbiAgICAgIGl2ZWMyIHBhY2tlZFRleFNoYXBlID0gaXZlYzIoY2VpbChmbG9hdCgke3RleE5hbWV9VGV4U2hhcGVbMF0pIC8gMi4wKSwgY2VpbChmbG9hdCgke3RleE5hbWV9VGV4U2hhcGVbMV0pIC8gMi4wKSk7XG4gICAgICB2ZWMyIHV2ID0gcGFja2VkVVZmcm9tMUQoXG4gICAgICAgIHBhY2tlZFRleFNoYXBlWzBdLCBwYWNrZWRUZXhTaGFwZVsxXSwgaW5kZXgpO1xuICAgICAgcmV0dXJuICR7Z2xzbC50ZXh0dXJlMkR9KCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG4gICAgfVxuICAgIGNvbnN0IHBhY2tlZFRleFNoYXBlID0gW01hdGguY2VpbCh0ZXhTaGFwZVswXSAvIDIpLCBNYXRoLmNlaWwodGV4U2hhcGVbMV0gLyAyKV07XG4gICAgcmV0dXJuIGBcbiAgICB2ZWM0ICR7ZnVuY05hbWV9KGludCBpbmRleCkge1xuICAgICAgdmVjMiB1diA9IHBhY2tlZFVWZnJvbTFEKFxuICAgICAgICAke3BhY2tlZFRleFNoYXBlWzBdfSwgJHtwYWNrZWRUZXhTaGFwZVsxXX0sIGluZGV4KTtcbiAgICAgIHJldHVybiAke2dsc2wudGV4dHVyZTJEfSgke3RleE5hbWV9LCB1dik7XG4gICAgfVxuICBgO1xufVxuZnVuY3Rpb24gZ2V0U2FtcGxlcjFEKGlucHV0SW5mbywgZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgIGNvbnN0IHRleE5hbWUgPSBpbnB1dEluZm8ubmFtZTtcbiAgICBjb25zdCBmdW5jTmFtZSA9ICdnZXQnICsgdGV4TmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRleE5hbWUuc2xpY2UoMSk7XG4gICAgaWYgKGlucHV0SW5mby5zaGFwZUluZm8uaXNVbmlmb3JtKSB7XG4gICAgICAgIC8vIFVuaWZvcm0gYXJyYXlzIHdpbGwgYmUgbGVzcyB0aGFuIDY1NTA1IChubyByaXNrIG9mIGZsb2F0MTYgb3ZlcmZsb3cpLlxuICAgICAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IGluZGV4KSB7XG4gICAgICAgICR7Z2V0VW5pZm9ybVNhbXBsZXIoaW5wdXRJbmZvKX1cbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbiAgICBjb25zdCB0ZXhTaGFwZSA9IGlucHV0SW5mby5zaGFwZUluZm8udGV4U2hhcGU7XG4gICAgY29uc3QgdE51bVIgPSB0ZXhTaGFwZVswXTtcbiAgICBjb25zdCB0TnVtQyA9IHRleFNoYXBlWzFdO1xuICAgIGlmICh0TnVtQyA9PT0gMSAmJiB0TnVtUiA9PT0gMSkge1xuICAgICAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IGluZGV4KSB7XG4gICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIGhhbGZDUik7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG4gICAgY29uc3Qgb2Zmc2V0ID0gZ2V0RmxhdE9mZnNldFVuaWZvcm1OYW1lKHRleE5hbWUpO1xuICAgIGlmICh0TnVtQyA9PT0gMSkge1xuICAgICAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgICAgICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCBpbmRleCkge1xuICAgICAgICB2ZWMyIHV2ID0gdmVjMigwLjUsIChmbG9hdChpbmRleCArICR7b2Zmc2V0fSkgKyAwLjUpIC8gZmxvYXQoJHt0ZXhOYW1lfVRleFNoYXBlWzBdKSk7XG4gICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICAgIH1cbiAgICBgO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgaW5kZXgpIHtcbiAgICAgICAgdmVjMiB1diA9IHZlYzIoMC41LCAoZmxvYXQoaW5kZXggKyAke29mZnNldH0pICsgMC41KSAvICR7dE51bVJ9LjApO1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG4gICAgaWYgKHROdW1SID09PSAxKSB7XG4gICAgICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICAgICAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IGluZGV4KSB7XG4gICAgICAgIHZlYzIgdXYgPSB2ZWMyKChmbG9hdChpbmRleCArICR7b2Zmc2V0fSkgKyAwLjUpIC8gZmxvYXQoJHt0ZXhOYW1lfVRleFNoYXBlWzFdKSwgMC41KTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCBpbmRleCkge1xuICAgICAgICB2ZWMyIHV2ID0gdmVjMigoZmxvYXQoaW5kZXggKyAke29mZnNldH0pICsgMC41KSAvICR7dE51bUN9LjAsIDAuNSk7XG4gICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgICByZXR1cm4gYFxuICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCBpbmRleCkge1xuICAgICAgdmVjMiB1diA9IHV2RnJvbUZsYXQoJHt0ZXhOYW1lfVRleFNoYXBlWzBdLCAke3RleE5hbWV9VGV4U2hhcGVbMV0sIGluZGV4ICsgJHtvZmZzZXR9KTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG4gICAgfVxuICAgIHJldHVybiBgXG4gICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IGluZGV4KSB7XG4gICAgICB2ZWMyIHV2ID0gdXZGcm9tRmxhdCgke3ROdW1SfSwgJHt0TnVtQ30sIGluZGV4ICsgJHtvZmZzZXR9KTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG59XG5mdW5jdGlvbiBnZXRQYWNrZWRTYW1wbGVyMkQoaW5wdXRJbmZvLCBlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgY29uc3Qgc2hhcGUgPSBpbnB1dEluZm8uc2hhcGVJbmZvLmxvZ2ljYWxTaGFwZTtcbiAgICBjb25zdCB0ZXhOYW1lID0gaW5wdXRJbmZvLm5hbWU7XG4gICAgY29uc3QgZnVuY05hbWUgPSAnZ2V0JyArIHRleE5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0ZXhOYW1lLnNsaWNlKDEpO1xuICAgIGNvbnN0IHRleFNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby50ZXhTaGFwZTtcbiAgICBjb25zdCB0ZXhOdW1SID0gdGV4U2hhcGVbMF07XG4gICAgY29uc3QgdGV4TnVtQyA9IHRleFNoYXBlWzFdO1xuICAgIGNvbnN0IGdsc2wgPSBnZXRHbHNsRGlmZmVyZW5jZXMoKTtcbiAgICBpZiAodGV4U2hhcGUgIT0gbnVsbCAmJiB1dGlsLmFycmF5c0VxdWFsKHNoYXBlLCB0ZXhTaGFwZSkpIHtcbiAgICAgICAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgICAgICAgIHJldHVybiBgXG4gICAgICB2ZWM0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wpIHtcbiAgICAgICAgdmVjMiB1diA9ICh2ZWMyKGNvbCwgcm93KSArIGhhbGZDUikgLyB2ZWMyKCR7dGV4TmFtZX1UZXhTaGFwZVsxXSwgJHt0ZXhOYW1lfVRleFNoYXBlWzBdKTtcblxuICAgICAgICByZXR1cm4gJHtnbHNsLnRleHR1cmUyRH0oJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGBcbiAgICAgIHZlYzQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgICB2ZWMyIHV2ID0gKHZlYzIoY29sLCByb3cpICsgaGFsZkNSKSAvIHZlYzIoJHt0ZXhOdW1DfS4wLCAke3RleE51bVJ9LjApO1xuXG4gICAgICAgIHJldHVybiAke2dsc2wudGV4dHVyZTJEfSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG4gICAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgICAgcmV0dXJuIGBcbiAgICB2ZWM0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wpIHtcbiAgICAgIGl2ZWMyIHBhY2tlZFRleFNoYXBlID0gaXZlYzIoY2VpbChmbG9hdCgke3RleE5hbWV9VGV4U2hhcGVbMF0pIC8gMi4wKSwgY2VpbChmbG9hdCgke3RleE5hbWV9VGV4U2hhcGVbMV0pIC8gMi4wKSk7XG4gICAgICBpbnQgdmFsdWVzUGVyUm93ID0gaW50KGNlaWwoZmxvYXQoJHt0ZXhOYW1lfVNoYXBlWzFdKSAvIDIuMCkpO1xuICAgICAgdmVjMiB1diA9IHBhY2tlZFVWZnJvbTJEKHZhbHVlc1BlclJvdywgcGFja2VkVGV4U2hhcGVbMF0sIHBhY2tlZFRleFNoYXBlWzFdLCByb3csIGNvbCk7XG4gICAgICByZXR1cm4gJHtnbHNsLnRleHR1cmUyRH0oJHt0ZXhOYW1lfSwgdXYpO1xuICAgIH1cbiAgYDtcbiAgICB9XG4gICAgY29uc3QgcGFja2VkVGV4U2hhcGUgPSBbTWF0aC5jZWlsKHRleFNoYXBlWzBdIC8gMiksIE1hdGguY2VpbCh0ZXhTaGFwZVsxXSAvIDIpXTtcbiAgICBjb25zdCB2YWx1ZXNQZXJSb3cgPSBNYXRoLmNlaWwoc2hhcGVbMV0gLyAyKTtcbiAgICByZXR1cm4gYFxuICAgIHZlYzQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgdmVjMiB1diA9IHBhY2tlZFVWZnJvbTJEKCR7dmFsdWVzUGVyUm93fSwgJHtwYWNrZWRUZXhTaGFwZVswXX0sICR7cGFja2VkVGV4U2hhcGVbMV19LCByb3csIGNvbCk7XG4gICAgICByZXR1cm4gJHtnbHNsLnRleHR1cmUyRH0oJHt0ZXhOYW1lfSwgdXYpO1xuICAgIH1cbiAgYDtcbn1cbmZ1bmN0aW9uIGdldFNhbXBsZXIyRChpbnB1dEluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICBjb25zdCBzaGFwZSA9IGlucHV0SW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlO1xuICAgIGNvbnN0IHRleE5hbWUgPSBpbnB1dEluZm8ubmFtZTtcbiAgICBjb25zdCBmdW5jTmFtZSA9ICdnZXQnICsgdGV4TmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRleE5hbWUuc2xpY2UoMSk7XG4gICAgY29uc3QgdGV4U2hhcGUgPSBpbnB1dEluZm8uc2hhcGVJbmZvLnRleFNoYXBlO1xuICAgIGlmICh0ZXhTaGFwZSAhPSBudWxsICYmIHV0aWwuYXJyYXlzRXF1YWwoc2hhcGUsIHRleFNoYXBlKSkge1xuICAgICAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgICAgICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wpIHtcbiAgICAgICAgdmVjMiB1diA9ICh2ZWMyKGNvbCwgcm93KSArIGhhbGZDUikgLyB2ZWMyKCR7dGV4TmFtZX1UZXhTaGFwZVsxXSwgJHt0ZXhOYW1lfVRleFNoYXBlWzBdKTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGV4TnVtUiA9IHRleFNoYXBlWzBdO1xuICAgICAgICBjb25zdCB0ZXhOdW1DID0gdGV4U2hhcGVbMV07XG4gICAgICAgIHJldHVybiBgXG4gICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgdmVjMiB1diA9ICh2ZWMyKGNvbCwgcm93KSArIGhhbGZDUikgLyB2ZWMyKCR7dGV4TnVtQ30uMCwgJHt0ZXhOdW1SfS4wKTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG4gICAgfVxuICAgIGNvbnN0IHsgbmV3U2hhcGUsIGtlcHREaW1zIH0gPSB1dGlsLnNxdWVlemVTaGFwZShzaGFwZSk7XG4gICAgY29uc3Qgc3F1ZWV6ZWRTaGFwZSA9IG5ld1NoYXBlO1xuICAgIGlmIChzcXVlZXplZFNoYXBlLmxlbmd0aCA8IHNoYXBlLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBuZXdJbnB1dEluZm8gPSBzcXVlZXplSW5wdXRJbmZvKGlucHV0SW5mbywgc3F1ZWV6ZWRTaGFwZSk7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IFsncm93JywgJ2NvbCddO1xuICAgICAgICByZXR1cm4gYFxuICAgICAgJHtnZXRTYW1wbGVyRnJvbUluSW5mbyhuZXdJbnB1dEluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpfVxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgICByZXR1cm4gJHtmdW5jTmFtZX0oJHtnZXRTcXVlZXplZFBhcmFtcyhwYXJhbXMsIGtlcHREaW1zKX0pO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIGlmIChpbnB1dEluZm8uc2hhcGVJbmZvLmlzVW5pZm9ybSkge1xuICAgICAgICAvLyBVbmlmb3JtIGFycmF5cyB3aWxsIGJlIGxlc3MgdGhhbiA2NTUwNSAobm8gcmlzayBvZiBmbG9hdDE2IG92ZXJmbG93KS5cbiAgICAgICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wpIHtcbiAgICAgICAgaW50IGluZGV4ID0gcm91bmQoZG90KHZlYzIocm93LCBjb2wpLCB2ZWMyKCR7c2hhcGVbMV19LCAxKSkpO1xuICAgICAgICAke2dldFVuaWZvcm1TYW1wbGVyKGlucHV0SW5mbyl9XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG4gICAgY29uc3QgdGV4TnVtUiA9IHRleFNoYXBlWzBdO1xuICAgIGNvbnN0IHRleE51bUMgPSB0ZXhTaGFwZVsxXTtcbiAgICBjb25zdCBvZmZzZXQgPSBnZXRGbGF0T2Zmc2V0VW5pZm9ybU5hbWUodGV4TmFtZSk7XG4gICAgaWYgKHRleE51bUMgPT09IDEpIHtcbiAgICAgICAgLy8gaW5kZXggaXMgdXNlZCBkaXJlY3RseSBhcyBwaHlzaWNhbCAobm8gcmlzayBvZiBmbG9hdDE2IG92ZXJmbG93KS5cbiAgICAgICAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgICAgICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICAgIGZsb2F0IGluZGV4ID0gZG90KHZlYzMocm93LCBjb2wsICR7b2Zmc2V0fSksIHZlYzMoJHt0ZXhOYW1lfVNoYXBlWzFdLCAxLCAxKSk7XG4gICAgICAgIHZlYzIgdXYgPSB2ZWMyKDAuNSwgKGluZGV4ICsgMC41KSAvIGZsb2F0KCR7dGV4TmFtZX1UZXhTaGFwZVswXSkpO1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gICAgYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYFxuICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wpIHtcbiAgICAgIGZsb2F0IGluZGV4ID0gZG90KHZlYzMocm93LCBjb2wsICR7b2Zmc2V0fSksIHZlYzMoJHtzaGFwZVsxXX0sIDEsIDEpKTtcbiAgICAgIHZlYzIgdXYgPSB2ZWMyKDAuNSwgKGluZGV4ICsgMC41KSAvICR7dGV4TnVtUn0uMCk7XG4gICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgfVxuICBgO1xuICAgIH1cbiAgICBpZiAodGV4TnVtUiA9PT0gMSkge1xuICAgICAgICAvLyBpbmRleCBpcyB1c2VkIGRpcmVjdGx5IGFzIHBoeXNpY2FsIChubyByaXNrIG9mIGZsb2F0MTYgb3ZlcmZsb3cpLlxuICAgICAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgICAgICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wpIHtcbiAgICAgICAgZmxvYXQgaW5kZXggPSBkb3QodmVjMyhyb3csIGNvbCwgJHtvZmZzZXR9KSwgdmVjMygke3RleE5hbWV9U2hhcGVbMV0sIDEsIDEpKTtcbiAgICAgICAgdmVjMiB1diA9IHZlYzIoKGluZGV4ICsgMC41KSAvIGZsb2F0KCR7dGV4TmFtZX1UZXhTaGFwZVsxXSksIDAuNSk7XG4gICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICAgIH1cbiAgICBgO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgXG4gICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgZmxvYXQgaW5kZXggPSBkb3QodmVjMyhyb3csIGNvbCwgJHtvZmZzZXR9KSwgdmVjMygke3NoYXBlWzFdfSwgMSwgMSkpO1xuICAgICAgdmVjMiB1diA9IHZlYzIoKGluZGV4ICsgMC41KSAvICR7dGV4TnVtQ30uMCwgMC41KTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG4gICAgfVxuICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICAgIC8vIEV4cGxpY2l0bHkgdXNlIGludGVnZXIgb3BlcmF0aW9ucyBhcyBkb3QoKSBvbmx5IHdvcmtzIG9uIGZsb2F0cy5cbiAgICAgICAgaW50IGluZGV4ID0gcm93ICogJHt0ZXhOYW1lfVNoYXBlWzFdICsgY29sICsgJHtvZmZzZXR9O1xuICAgICAgICB2ZWMyIHV2ID0gdXZGcm9tRmxhdCgke3RleE5hbWV9VGV4U2hhcGVbMF0sICR7dGV4TmFtZX1UZXhTaGFwZVsxXSwgaW5kZXgpO1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG4gICAgcmV0dXJuIGBcbiAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgIC8vIEV4cGxpY2l0bHkgdXNlIGludGVnZXIgb3BlcmF0aW9ucyBhcyBkb3QoKSBvbmx5IHdvcmtzIG9uIGZsb2F0cy5cbiAgICBpbnQgaW5kZXggPSByb3cgKiAke3NoYXBlWzFdfSArIGNvbCArICR7b2Zmc2V0fTtcbiAgICB2ZWMyIHV2ID0gdXZGcm9tRmxhdCgke3RleE51bVJ9LCAke3RleE51bUN9LCBpbmRleCk7XG4gICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICB9XG5gO1xufVxuZnVuY3Rpb24gZ2V0UGFja2VkU2FtcGxlcjNEKGlucHV0SW5mbywgZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgIGNvbnN0IHNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby5sb2dpY2FsU2hhcGU7XG4gICAgY29uc3QgdGV4TmFtZSA9IGlucHV0SW5mby5uYW1lO1xuICAgIGNvbnN0IGZ1bmNOYW1lID0gJ2dldCcgKyB0ZXhOYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGV4TmFtZS5zbGljZSgxKTtcbiAgICBjb25zdCB0ZXhTaGFwZSA9IGlucHV0SW5mby5zaGFwZUluZm8udGV4U2hhcGU7XG4gICAgY29uc3QgcGFja2VkVGV4U2hhcGUgPSBbTWF0aC5jZWlsKHRleFNoYXBlWzBdIC8gMiksIE1hdGguY2VpbCh0ZXhTaGFwZVsxXSAvIDIpXTtcbiAgICBpZiAoc2hhcGVbMF0gPT09IDEpIHtcbiAgICAgICAgY29uc3Qgc3F1ZWV6ZWRTaGFwZSA9IHNoYXBlLnNsaWNlKDEpO1xuICAgICAgICBjb25zdCBrZXB0RGltcyA9IFsxLCAyXTtcbiAgICAgICAgY29uc3QgbmV3SW5wdXRJbmZvID0gc3F1ZWV6ZUlucHV0SW5mbyhpbnB1dEluZm8sIHNxdWVlemVkU2hhcGUpO1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBbJ2InLCAncm93JywgJ2NvbCddO1xuICAgICAgICByZXR1cm4gYFxuICAgICAgICAke2dldFBhY2tlZFNhbXBsZXJGcm9tSW5JbmZvKG5ld0lucHV0SW5mbywgZW5hYmxlU2hhcGVVbmlmb3Jtcyl9XG4gICAgICAgIHZlYzQgJHtmdW5jTmFtZX0oaW50IGIsIGludCByb3csIGludCBjb2wpIHtcbiAgICAgICAgICByZXR1cm4gJHtmdW5jTmFtZX0oJHtnZXRTcXVlZXplZFBhcmFtcyhwYXJhbXMsIGtlcHREaW1zKX0pO1xuICAgICAgICB9XG4gICAgICBgO1xuICAgIH1cbiAgICBjb25zdCBnbHNsID0gZ2V0R2xzbERpZmZlcmVuY2VzKCk7XG4gICAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgICAgcmV0dXJuIGBcbiAgICB2ZWM0ICR7ZnVuY05hbWV9KGludCBiLCBpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICBpdmVjMiBwYWNrZWRUZXhTaGFwZSA9IGl2ZWMyKGNlaWwoZmxvYXQoJHt0ZXhOYW1lfVRleFNoYXBlWzBdKSAvIDIuMCksIGNlaWwoZmxvYXQoJHt0ZXhOYW1lfVRleFNoYXBlWzFdKSAvIDIuMCkpO1xuICAgICAgaW50IHZhbHVlc1BlclJvdyA9IGludChjZWlsKGZsb2F0KCR7dGV4TmFtZX1TaGFwZVsyXSkgLyAyLjApKTtcbiAgICAgIGludCB0ZXhlbHNJbkJhdGNoID0gdmFsdWVzUGVyUm93ICogaW50KGNlaWwoZmxvYXQoJHt0ZXhOYW1lfVNoYXBlWzFdKSAvIDIuMCkpO1xuICAgICAgdmVjMiB1diA9IHBhY2tlZFVWZnJvbTNEKFxuICAgICAgICBwYWNrZWRUZXhTaGFwZVswXSwgcGFja2VkVGV4U2hhcGVbMV0sIHRleGVsc0luQmF0Y2gsIHZhbHVlc1BlclJvdywgYiwgcm93LCBjb2wpO1xuICAgICAgcmV0dXJuICR7Z2xzbC50ZXh0dXJlMkR9KCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG4gICAgfVxuICAgIGNvbnN0IHRleE51bVIgPSBwYWNrZWRUZXhTaGFwZVswXTtcbiAgICBjb25zdCB0ZXhOdW1DID0gcGFja2VkVGV4U2hhcGVbMV07XG4gICAgY29uc3QgdmFsdWVzUGVyUm93ID0gTWF0aC5jZWlsKHNoYXBlWzJdIC8gMik7XG4gICAgY29uc3QgdGV4ZWxzSW5CYXRjaCA9IHZhbHVlc1BlclJvdyAqIE1hdGguY2VpbChzaGFwZVsxXSAvIDIpO1xuICAgIHJldHVybiBgXG4gICAgdmVjNCAke2Z1bmNOYW1lfShpbnQgYiwgaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgdmVjMiB1diA9IHBhY2tlZFVWZnJvbTNEKFxuICAgICAgICAke3RleE51bVJ9LCAke3RleE51bUN9LCAke3RleGVsc0luQmF0Y2h9LCAke3ZhbHVlc1BlclJvd30sIGIsIHJvdywgY29sKTtcbiAgICAgIHJldHVybiAke2dsc2wudGV4dHVyZTJEfSgke3RleE5hbWV9LCB1dik7XG4gICAgfVxuICBgO1xufVxuZnVuY3Rpb24gZ2V0U2FtcGxlcjNEKGlucHV0SW5mbywgZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgIGNvbnN0IHNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby5sb2dpY2FsU2hhcGU7XG4gICAgY29uc3QgdGV4TmFtZSA9IGlucHV0SW5mby5uYW1lO1xuICAgIGNvbnN0IGZ1bmNOYW1lID0gJ2dldCcgKyB0ZXhOYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGV4TmFtZS5zbGljZSgxKTtcbiAgICBjb25zdCBzdHJpZGUwID0gc2hhcGVbMV0gKiBzaGFwZVsyXTtcbiAgICBjb25zdCBzdHJpZGUxID0gc2hhcGVbMl07XG4gICAgY29uc3QgeyBuZXdTaGFwZSwga2VwdERpbXMgfSA9IHV0aWwuc3F1ZWV6ZVNoYXBlKHNoYXBlKTtcbiAgICBjb25zdCBzcXVlZXplZFNoYXBlID0gbmV3U2hhcGU7XG4gICAgaWYgKHNxdWVlemVkU2hhcGUubGVuZ3RoIDwgc2hhcGUubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IG5ld0lucHV0SW5mbyA9IHNxdWVlemVJbnB1dEluZm8oaW5wdXRJbmZvLCBzcXVlZXplZFNoYXBlKTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gWydyb3cnLCAnY29sJywgJ2RlcHRoJ107XG4gICAgICAgIHJldHVybiBgXG4gICAgICAgICR7Z2V0U2FtcGxlckZyb21JbkluZm8obmV3SW5wdXRJbmZvLCBlbmFibGVTaGFwZVVuaWZvcm1zKX1cbiAgICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoKSB7XG4gICAgICAgICAgcmV0dXJuICR7ZnVuY05hbWV9KCR7Z2V0U3F1ZWV6ZWRQYXJhbXMocGFyYW1zLCBrZXB0RGltcyl9KTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgICB9XG4gICAgaWYgKGlucHV0SW5mby5zaGFwZUluZm8uaXNVbmlmb3JtKSB7XG4gICAgICAgIC8vIFVuaWZvcm0gYXJyYXlzIHdpbGwgYmUgbGVzcyB0aGFuIDY1NTA1IChubyByaXNrIG9mIGZsb2F0MTYgb3ZlcmZsb3cpLlxuICAgICAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoKSB7XG4gICAgICAgIGludCBpbmRleCA9IHJvdW5kKGRvdCh2ZWMzKHJvdywgY29sLCBkZXB0aCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzMoJHtzdHJpZGUwfSwgJHtzdHJpZGUxfSwgMSkpKTtcbiAgICAgICAgJHtnZXRVbmlmb3JtU2FtcGxlcihpbnB1dEluZm8pfVxuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIGNvbnN0IHRleFNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby50ZXhTaGFwZTtcbiAgICBjb25zdCB0ZXhOdW1SID0gdGV4U2hhcGVbMF07XG4gICAgY29uc3QgdGV4TnVtQyA9IHRleFNoYXBlWzFdO1xuICAgIGNvbnN0IGZsYXRPZmZzZXQgPSBpbnB1dEluZm8uc2hhcGVJbmZvLmZsYXRPZmZzZXQ7XG4gICAgaWYgKHRleE51bUMgPT09IHN0cmlkZTAgJiYgZmxhdE9mZnNldCA9PSBudWxsKSB7XG4gICAgICAgIC8vIHRleEMgaXMgdXNlZCBkaXJlY3RseSBhcyBwaHlzaWNhbCAobm8gcmlzayBvZiBmbG9hdDE2IG92ZXJmbG93KS5cbiAgICAgICAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgICAgICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgpIHtcbiAgICAgICAgaW50IHN0cmlkZTEgPSAke3RleE5hbWV9U2hhcGVbMl07XG4gICAgICAgIGZsb2F0IHRleFIgPSBmbG9hdChyb3cpO1xuICAgICAgICBmbG9hdCB0ZXhDID0gZG90KHZlYzIoY29sLCBkZXB0aCksIHZlYzIoc3RyaWRlMSwgMSkpO1xuICAgICAgICB2ZWMyIHV2ID0gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC9cbiAgICAgICAgICAgICAgICAgICB2ZWMyKCR7dGV4TmFtZX1UZXhTaGFwZVsxXSwgJHt0ZXhOYW1lfVRleFNoYXBlWzBdKTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGBcbiAgICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoKSB7XG4gICAgICAgICAgZmxvYXQgdGV4UiA9IGZsb2F0KHJvdyk7XG4gICAgICAgICAgZmxvYXQgdGV4QyA9IGRvdCh2ZWMyKGNvbCwgZGVwdGgpLCB2ZWMyKCR7c3RyaWRlMX0sIDEpKTtcbiAgICAgICAgICB2ZWMyIHV2ID0gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC9cbiAgICAgICAgICAgICAgICAgICAgIHZlYzIoJHt0ZXhOdW1DfS4wLCAke3RleE51bVJ9LjApO1xuICAgICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgICB9XG4gICAgaWYgKHRleE51bUMgPT09IHN0cmlkZTEgJiYgZmxhdE9mZnNldCA9PSBudWxsKSB7XG4gICAgICAgIC8vIHRleFIgaXMgdXNlZCBkaXJlY3RseSBhcyBwaHlzaWNhbCAobm8gcmlzayBvZiBmbG9hdDE2IG92ZXJmbG93KS5cbiAgICAgICAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgICAgICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgpIHtcbiAgICAgICAgZmxvYXQgdGV4UiA9IGRvdCh2ZWMyKHJvdywgY29sKSwgdmVjMigke3RleE5hbWV9U2hhcGVbMV0sIDEpKTtcbiAgICAgICAgZmxvYXQgdGV4QyA9IGZsb2F0KGRlcHRoKTtcbiAgICAgICAgdmVjMiB1diA9ICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvIHZlYzIoJHt0ZXhOYW1lfVRleFNoYXBlWzFdLCAke3RleE5hbWV9VGV4U2hhcGVbMF0pO1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gICAgYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYFxuICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCkge1xuICAgICAgZmxvYXQgdGV4UiA9IGRvdCh2ZWMyKHJvdywgY29sKSwgdmVjMigke3NoYXBlWzFdfSwgMSkpO1xuICAgICAgZmxvYXQgdGV4QyA9IGZsb2F0KGRlcHRoKTtcbiAgICAgIHZlYzIgdXYgPSAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgLyB2ZWMyKCR7dGV4TnVtQ30uMCwgJHt0ZXhOdW1SfS4wKTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG4gICAgfVxuICAgIGNvbnN0IG9mZnNldCA9IGdldEZsYXRPZmZzZXRVbmlmb3JtTmFtZSh0ZXhOYW1lKTtcbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgICByZXR1cm4gYFxuICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCkge1xuICAgICAgLy8gRXhwbGljaXRseSB1c2UgaW50ZWdlciBvcGVyYXRpb25zIGFzIGRvdCgpIG9ubHkgd29ya3Mgb24gZmxvYXRzLlxuICAgICAgaW50IHN0cmlkZTAgPSAke3RleE5hbWV9U2hhcGVbMV0gKiAke3RleE5hbWV9U2hhcGVbMl07XG4gICAgICBpbnQgc3RyaWRlMSA9ICR7dGV4TmFtZX1TaGFwZVsyXTtcbiAgICAgIGludCBpbmRleCA9IHJvdyAqICR7c3RyaWRlMH0gKyBjb2wgKiAke3N0cmlkZTF9ICsgZGVwdGggKyAke29mZnNldH07XG4gICAgICB2ZWMyIHV2ID0gdXZGcm9tRmxhdCgke3RleE5hbWV9VGV4U2hhcGVbMF0sICR7dGV4TmFtZX1UZXhTaGFwZVsxXSwgaW5kZXgpO1xuICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgIH1cbiAgICBgO1xuICAgIH1cbiAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoKSB7XG4gICAgICAgIC8vIEV4cGxpY2l0bHkgdXNlIGludGVnZXIgb3BlcmF0aW9ucyBhcyBkb3QoKSBvbmx5IHdvcmtzIG9uIGZsb2F0cy5cbiAgICAgICAgaW50IGluZGV4ID0gcm93ICogJHtzdHJpZGUwfSArIGNvbCAqICR7c3RyaWRlMX0gKyBkZXB0aCArICR7b2Zmc2V0fTtcbiAgICAgICAgdmVjMiB1diA9IHV2RnJvbUZsYXQoJHt0ZXhOdW1SfSwgJHt0ZXhOdW1DfSwgaW5kZXgpO1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gIGA7XG59XG5mdW5jdGlvbiBnZXRQYWNrZWRTYW1wbGVyTkQoaW5wdXRJbmZvLCBlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgY29uc3QgdGV4TmFtZSA9IGlucHV0SW5mby5uYW1lO1xuICAgIGNvbnN0IGZ1bmNOYW1lID0gJ2dldCcgKyB0ZXhOYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGV4TmFtZS5zbGljZSgxKTtcbiAgICBjb25zdCBnbHNsID0gZ2V0R2xzbERpZmZlcmVuY2VzKCk7XG4gICAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgICAgLy8gVE9ETzogc3VwcG9ydCA1ZCBhbmQgNmRcbiAgICAgICAgcmV0dXJuIGBcbiAgICB2ZWM0ICR7ZnVuY05hbWV9KGludCBiMiwgaW50IGIsIGludCByb3csIGludCBjb2wpIHtcbiAgICAgIGludCB2YWx1ZXNQZXJSb3cgPSBpbnQoY2VpbChmbG9hdCgke3RleE5hbWV9U2hhcGVbM10pIC8gMi4wKSk7XG4gICAgICBpbnQgdGV4ZWxzSW5CYXRjaCA9IHZhbHVlc1BlclJvdyAqIGludChjZWlsKGZsb2F0KCR7dGV4TmFtZX1TaGFwZVsyXSkgLyAyLjApKTtcbiAgICAgIGludCBpbmRleCA9IGIgKiB0ZXhlbHNJbkJhdGNoICsgKHJvdyAvIDIpICogdmFsdWVzUGVyUm93ICsgKGNvbCAvIDIpO1xuICAgICAgdGV4ZWxzSW5CYXRjaCAqPSAke3RleE5hbWV9U2hhcGVbMV07XG4gICAgICBpbmRleCA9IGIyICogdGV4ZWxzSW5CYXRjaCArIGluZGV4O1xuICAgICAgaXZlYzIgcGFja2VkVGV4U2hhcGUgPSBpdmVjMihjZWlsKGZsb2F0KCR7dGV4TmFtZX1UZXhTaGFwZVswXSkgLyAyLjApLCBjZWlsKGZsb2F0KCR7dGV4TmFtZX1UZXhTaGFwZVsxXSkgLyAyLjApKTtcbiAgICAgIGludCB0ZXhSID0gaW5kZXggLyBwYWNrZWRUZXhTaGFwZVsxXTtcbiAgICAgIGludCB0ZXhDID0gaW5kZXggLSB0ZXhSICogcGFja2VkVGV4U2hhcGVbMV07XG4gICAgICB2ZWMyIHV2ID0gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC8gdmVjMihwYWNrZWRUZXhTaGFwZVsxXSwgcGFja2VkVGV4U2hhcGVbMF0pOyByZXR1cm4gJHtnbHNsLnRleHR1cmUyRH0oJHt0ZXhOYW1lfSwgdXYpO1xuICAgIH1cbiAgYDtcbiAgICB9XG4gICAgY29uc3Qgc2hhcGUgPSBpbnB1dEluZm8uc2hhcGVJbmZvLmxvZ2ljYWxTaGFwZTtcbiAgICBjb25zdCByYW5rID0gc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IHRleFNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby50ZXhTaGFwZTtcbiAgICBjb25zdCBwYWNrZWRUZXhTaGFwZSA9IFtNYXRoLmNlaWwodGV4U2hhcGVbMF0gLyAyKSwgTWF0aC5jZWlsKHRleFNoYXBlWzFdIC8gMildO1xuICAgIGNvbnN0IHRleE51bVIgPSBwYWNrZWRUZXhTaGFwZVswXTtcbiAgICBjb25zdCB0ZXhOdW1DID0gcGFja2VkVGV4U2hhcGVbMV07XG4gICAgY29uc3QgdmFsdWVzUGVyUm93ID0gTWF0aC5jZWlsKHNoYXBlW3JhbmsgLSAxXSAvIDIpO1xuICAgIGxldCB0ZXhlbHNJbkJhdGNoID0gdmFsdWVzUGVyUm93ICogTWF0aC5jZWlsKHNoYXBlW3JhbmsgLSAyXSAvIDIpO1xuICAgIGxldCBwYXJhbXMgPSBgaW50IGIsIGludCByb3csIGludCBjb2xgO1xuICAgIGxldCBpbmRleCA9IGBiICogJHt0ZXhlbHNJbkJhdGNofSArIChyb3cgLyAyKSAqICR7dmFsdWVzUGVyUm93fSArIChjb2wgLyAyKWA7XG4gICAgZm9yIChsZXQgYiA9IDI7IGIgPCByYW5rIC0gMTsgYisrKSB7XG4gICAgICAgIHBhcmFtcyA9IGBpbnQgYiR7Yn0sIGAgKyBwYXJhbXM7XG4gICAgICAgIHRleGVsc0luQmF0Y2ggKj0gc2hhcGVbcmFuayAtIGIgLSAxXTtcbiAgICAgICAgaW5kZXggPSBgYiR7Yn0gKiAke3RleGVsc0luQmF0Y2h9ICsgYCArIGluZGV4O1xuICAgIH1cbiAgICByZXR1cm4gYFxuICAgIHZlYzQgJHtmdW5jTmFtZX0oJHtwYXJhbXN9KSB7XG4gICAgICBpbnQgaW5kZXggPSAke2luZGV4fTtcbiAgICAgIGludCB0ZXhSID0gaW5kZXggLyAke3RleE51bUN9O1xuICAgICAgaW50IHRleEMgPSBpbmRleCAtIHRleFIgKiAke3RleE51bUN9O1xuICAgICAgdmVjMiB1diA9ICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvIHZlYzIoJHt0ZXhOdW1DfSwgJHt0ZXhOdW1SfSk7XG4gICAgICByZXR1cm4gJHtnbHNsLnRleHR1cmUyRH0oJHt0ZXhOYW1lfSwgdXYpO1xuICAgIH1cbiAgYDtcbn1cbmZ1bmN0aW9uIGdldFNhbXBsZXI0RChpbnB1dEluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICBjb25zdCBzaGFwZSA9IGlucHV0SW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlO1xuICAgIGNvbnN0IHRleE5hbWUgPSBpbnB1dEluZm8ubmFtZTtcbiAgICBjb25zdCBmdW5jTmFtZSA9ICdnZXQnICsgdGV4TmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRleE5hbWUuc2xpY2UoMSk7XG4gICAgY29uc3Qgc3RyaWRlMiA9IHNoYXBlWzNdO1xuICAgIGNvbnN0IHN0cmlkZTEgPSBzaGFwZVsyXSAqIHN0cmlkZTI7XG4gICAgY29uc3Qgc3RyaWRlMCA9IHNoYXBlWzFdICogc3RyaWRlMTtcbiAgICBjb25zdCB7IG5ld1NoYXBlLCBrZXB0RGltcyB9ID0gdXRpbC5zcXVlZXplU2hhcGUoc2hhcGUpO1xuICAgIGlmIChuZXdTaGFwZS5sZW5ndGggPCBzaGFwZS5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgbmV3SW5wdXRJbmZvID0gc3F1ZWV6ZUlucHV0SW5mbyhpbnB1dEluZm8sIG5ld1NoYXBlKTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gWydyb3cnLCAnY29sJywgJ2RlcHRoJywgJ2RlcHRoMiddO1xuICAgICAgICByZXR1cm4gYFxuICAgICAgJHtnZXRTYW1wbGVyRnJvbUluSW5mbyhuZXdJbnB1dEluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpfVxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLCBpbnQgZGVwdGgyKSB7XG4gICAgICAgIHJldHVybiAke2Z1bmNOYW1lfSgke2dldFNxdWVlemVkUGFyYW1zKHBhcmFtcywga2VwdERpbXMpfSk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG4gICAgaWYgKGlucHV0SW5mby5zaGFwZUluZm8uaXNVbmlmb3JtKSB7XG4gICAgICAgIC8vIFVuaWZvcm0gYXJyYXlzIHdpbGwgYmUgbGVzcyB0aGFuIDY1NTA1IChubyByaXNrIG9mIGZsb2F0MTYgb3ZlcmZsb3cpLlxuICAgICAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLCBpbnQgZGVwdGgyKSB7XG4gICAgICAgIGludCBpbmRleCA9IHJvdW5kKGRvdCh2ZWM0KHJvdywgY29sLCBkZXB0aCwgZGVwdGgyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjNCgke3N0cmlkZTB9LCAke3N0cmlkZTF9LCAke3N0cmlkZTJ9LCAxKSkpO1xuICAgICAgICAke2dldFVuaWZvcm1TYW1wbGVyKGlucHV0SW5mbyl9XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG4gICAgY29uc3QgZmxhdE9mZnNldCA9IGlucHV0SW5mby5zaGFwZUluZm8uZmxhdE9mZnNldDtcbiAgICBjb25zdCB0ZXhTaGFwZSA9IGlucHV0SW5mby5zaGFwZUluZm8udGV4U2hhcGU7XG4gICAgY29uc3QgdGV4TnVtUiA9IHRleFNoYXBlWzBdO1xuICAgIGNvbnN0IHRleE51bUMgPSB0ZXhTaGFwZVsxXTtcbiAgICBjb25zdCBzdHJpZGUyU3RyID0gYGludCBzdHJpZGUyID0gJHt0ZXhOYW1lfVNoYXBlWzNdO2A7XG4gICAgY29uc3Qgc3RyaWRlMVN0ciA9IGBpbnQgc3RyaWRlMSA9ICR7dGV4TmFtZX1TaGFwZVsyXSAqIHN0cmlkZTI7YDtcbiAgICBjb25zdCBzdHJpZGUwU3RyID0gYGludCBzdHJpZGUwID0gJHt0ZXhOYW1lfVNoYXBlWzFdICogc3RyaWRlMTtgO1xuICAgIGlmICh0ZXhOdW1DID09PSBzdHJpZGUwICYmIGZsYXRPZmZzZXQgPT0gbnVsbCkge1xuICAgICAgICAvLyB0ZXhDIGlzIHVzZWQgZGlyZWN0bHkgYXMgcGh5c2ljYWwgKG5vIHJpc2sgb2YgZmxvYXQxNiBvdmVyZmxvdykuXG4gICAgICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICAgICAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLCBpbnQgZGVwdGgyKSB7XG4gICAgICAgICR7c3RyaWRlMlN0cn1cbiAgICAgICAgJHtzdHJpZGUxU3RyfVxuICAgICAgICBmbG9hdCB0ZXhSID0gZmxvYXQocm93KTtcbiAgICAgICAgZmxvYXQgdGV4QyA9XG4gICAgICAgICAgICBkb3QodmVjMyhjb2wsIGRlcHRoLCBkZXB0aDIpLFxuICAgICAgICAgICAgICAgIHZlYzMoc3RyaWRlMSwgc3RyaWRlMiwgMSkpO1xuICAgICAgICB2ZWMyIHV2ID0gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC9cbiAgICAgICAgICAgICAgICAgICB2ZWMyKCR7dGV4TmFtZX1UZXhTaGFwZVsxXSwgJHt0ZXhOYW1lfVRleFNoYXBlWzBdKTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCwgaW50IGRlcHRoMikge1xuICAgICAgICBmbG9hdCB0ZXhSID0gZmxvYXQocm93KTtcbiAgICAgICAgZmxvYXQgdGV4QyA9XG4gICAgICAgICAgICBkb3QodmVjMyhjb2wsIGRlcHRoLCBkZXB0aDIpLFxuICAgICAgICAgICAgICAgIHZlYzMoJHtzdHJpZGUxfSwgJHtzdHJpZGUyfSwgMSkpO1xuICAgICAgICB2ZWMyIHV2ID0gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC9cbiAgICAgICAgICAgICAgICAgICB2ZWMyKCR7dGV4TnVtQ30uMCwgJHt0ZXhOdW1SfS4wKTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIGlmICh0ZXhOdW1DID09PSBzdHJpZGUyICYmIGZsYXRPZmZzZXQgPT0gbnVsbCkge1xuICAgICAgICAvLyB0ZXhSIGlzIHVzZWQgZGlyZWN0bHkgYXMgcGh5c2ljYWwgKG5vIHJpc2sgb2YgZmxvYXQxNiBvdmVyZmxvdykuXG4gICAgICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICAgICAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLCBpbnQgZGVwdGgyKSB7XG4gICAgICAgIGZsb2F0IHRleFIgPSBkb3QodmVjMyhyb3csIGNvbCwgZGVwdGgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzMoJHt0ZXhOYW1lfVNoYXBlWzFdICogJHt0ZXhOYW1lfVNoYXBlWzJdLCAke3RleE5hbWV9U2hhcGVbMl0sIDEpKTtcbiAgICAgICAgZmxvYXQgdGV4QyA9IGZsb2F0KGRlcHRoMik7XG4gICAgICAgIHZlYzIgdXYgPSAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgL1xuICAgICAgICAgICAgICAgICAgdmVjMigke3RleE5hbWV9VGV4U2hhcGVbMV0sICR7dGV4TmFtZX1UZXhTaGFwZVswXSk7XG4gICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICAgIH1cbiAgICBgO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsIGludCBkZXB0aDIpIHtcbiAgICAgICAgZmxvYXQgdGV4UiA9IGRvdCh2ZWMzKHJvdywgY29sLCBkZXB0aCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgdmVjMygke3NoYXBlWzFdICogc2hhcGVbMl19LCAke3NoYXBlWzJdfSwgMSkpO1xuICAgICAgICBmbG9hdCB0ZXhDID0gZmxvYXQoZGVwdGgyKTtcbiAgICAgICAgdmVjMiB1diA9ICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvXG4gICAgICAgICAgICAgICAgICB2ZWMyKCR7dGV4TnVtQ30uMCwgJHt0ZXhOdW1SfS4wKTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIGNvbnN0IG9mZnNldCA9IGdldEZsYXRPZmZzZXRVbmlmb3JtTmFtZSh0ZXhOYW1lKTtcbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgICByZXR1cm4gYFxuICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCwgaW50IGRlcHRoMikge1xuICAgICAgLy8gRXhwbGljaXRseSB1c2UgaW50ZWdlciBvcGVyYXRpb25zIGFzIGRvdCgpIG9ubHkgd29ya3Mgb24gZmxvYXRzLlxuICAgICAgJHtzdHJpZGUyU3RyfVxuICAgICAgJHtzdHJpZGUxU3RyfVxuICAgICAgJHtzdHJpZGUwU3RyfVxuICAgICAgaW50IGluZGV4ID0gcm93ICogc3RyaWRlMCArIGNvbCAqIHN0cmlkZTEgK1xuICAgICAgICAgIGRlcHRoICogc3RyaWRlMiArIGRlcHRoMjtcbiAgICAgIHZlYzIgdXYgPSB1dkZyb21GbGF0KCR7dGV4TmFtZX1UZXhTaGFwZVswXSwgJHt0ZXhOYW1lfVRleFNoYXBlWzFdLCBpbmRleCArICR7b2Zmc2V0fSk7XG4gICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgfVxuICBgO1xuICAgIH1cbiAgICByZXR1cm4gYFxuICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCwgaW50IGRlcHRoMikge1xuICAgICAgLy8gRXhwbGljaXRseSB1c2UgaW50ZWdlciBvcGVyYXRpb25zIGFzIGRvdCgpIG9ubHkgd29ya3Mgb24gZmxvYXRzLlxuICAgICAgaW50IGluZGV4ID0gcm93ICogJHtzdHJpZGUwfSArIGNvbCAqICR7c3RyaWRlMX0gK1xuICAgICAgICAgIGRlcHRoICogJHtzdHJpZGUyfSArIGRlcHRoMjtcbiAgICAgIHZlYzIgdXYgPSB1dkZyb21GbGF0KCR7dGV4TnVtUn0sICR7dGV4TnVtQ30sIGluZGV4ICsgJHtvZmZzZXR9KTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG59XG5mdW5jdGlvbiBnZXRTYW1wbGVyNUQoaW5wdXRJbmZvKSB7XG4gICAgY29uc3Qgc2hhcGUgPSBpbnB1dEluZm8uc2hhcGVJbmZvLmxvZ2ljYWxTaGFwZTtcbiAgICBjb25zdCB0ZXhOYW1lID0gaW5wdXRJbmZvLm5hbWU7XG4gICAgY29uc3QgZnVuY05hbWUgPSAnZ2V0JyArIHRleE5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0ZXhOYW1lLnNsaWNlKDEpO1xuICAgIGNvbnN0IHN0cmlkZTMgPSBzaGFwZVs0XTtcbiAgICBjb25zdCBzdHJpZGUyID0gc2hhcGVbM10gKiBzdHJpZGUzO1xuICAgIGNvbnN0IHN0cmlkZTEgPSBzaGFwZVsyXSAqIHN0cmlkZTI7XG4gICAgY29uc3Qgc3RyaWRlMCA9IHNoYXBlWzFdICogc3RyaWRlMTtcbiAgICBjb25zdCB7IG5ld1NoYXBlLCBrZXB0RGltcyB9ID0gdXRpbC5zcXVlZXplU2hhcGUoc2hhcGUpO1xuICAgIGlmIChuZXdTaGFwZS5sZW5ndGggPCBzaGFwZS5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgbmV3SW5wdXRJbmZvID0gc3F1ZWV6ZUlucHV0SW5mbyhpbnB1dEluZm8sIG5ld1NoYXBlKTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gWydyb3cnLCAnY29sJywgJ2RlcHRoJywgJ2RlcHRoMicsICdkZXB0aDMnXTtcbiAgICAgICAgcmV0dXJuIGBcbiAgICAgICR7Z2V0U2FtcGxlckZyb21JbkluZm8obmV3SW5wdXRJbmZvKX1cbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCwgaW50IGRlcHRoMiwgaW50IGRlcHRoMykge1xuICAgICAgICByZXR1cm4gJHtmdW5jTmFtZX0oJHtnZXRTcXVlZXplZFBhcmFtcyhwYXJhbXMsIGtlcHREaW1zKX0pO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIGlmIChpbnB1dEluZm8uc2hhcGVJbmZvLmlzVW5pZm9ybSkge1xuICAgICAgICAvLyBVbmlmb3JtIGFycmF5cyB3aWxsIGJlIGxlc3MgdGhhbiA2NTUwNSAobm8gcmlzayBvZiBmbG9hdDE2IG92ZXJmbG93KS5cbiAgICAgICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCwgaW50IGRlcHRoMiwgaW50IGRlcHRoMykge1xuICAgICAgICBmbG9hdCBpbmRleCA9IGRvdChcbiAgICAgICAgICB2ZWM0KHJvdywgY29sLCBkZXB0aCwgZGVwdGgyKSxcbiAgICAgICAgICB2ZWM0KCR7c3RyaWRlMH0sICR7c3RyaWRlMX0sICR7c3RyaWRlMn0sICR7c3RyaWRlM30pKSArXG4gICAgICAgICAgZGVwdGgzO1xuICAgICAgICAke2dldFVuaWZvcm1TYW1wbGVyKGlucHV0SW5mbyl9XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG4gICAgY29uc3QgZmxhdE9mZnNldCA9IGlucHV0SW5mby5zaGFwZUluZm8uZmxhdE9mZnNldDtcbiAgICBjb25zdCB0ZXhTaGFwZSA9IGlucHV0SW5mby5zaGFwZUluZm8udGV4U2hhcGU7XG4gICAgY29uc3QgdGV4TnVtUiA9IHRleFNoYXBlWzBdO1xuICAgIGNvbnN0IHRleE51bUMgPSB0ZXhTaGFwZVsxXTtcbiAgICBpZiAodGV4TnVtQyA9PT0gc3RyaWRlMCAmJiBmbGF0T2Zmc2V0ID09IG51bGwpIHtcbiAgICAgICAgLy8gdGV4QyBpcyB1c2VkIGRpcmVjdGx5IGFzIHBoeXNpY2FsIChubyByaXNrIG9mIGZsb2F0MTYgb3ZlcmZsb3cpLlxuICAgICAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLCBpbnQgZGVwdGgyLCBpbnQgZGVwdGgzKSB7XG4gICAgICAgIGludCB0ZXhSID0gcm93O1xuICAgICAgICBmbG9hdCB0ZXhDID0gZG90KHZlYzQoY29sLCBkZXB0aCwgZGVwdGgyLCBkZXB0aDMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzQoJHtzdHJpZGUxfSwgJHtzdHJpZGUyfSwgJHtzdHJpZGUzfSwgMSkpO1xuICAgICAgICB2ZWMyIHV2ID0gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC9cbiAgICAgICAgICAgICAgICAgICB2ZWMyKCR7dGV4TnVtQ30uMCwgJHt0ZXhOdW1SfS4wKTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIGlmICh0ZXhOdW1DID09PSBzdHJpZGUzICYmIGZsYXRPZmZzZXQgPT0gbnVsbCkge1xuICAgICAgICAvLyB0ZXhSIGlzIHVzZWQgZGlyZWN0bHkgYXMgcGh5c2ljYWwgKG5vIHJpc2sgb2YgZmxvYXQxNiBvdmVyZmxvdykuXG4gICAgICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsIGludCBkZXB0aDIsIGludCBkZXB0aDMpIHtcbiAgICAgICAgZmxvYXQgdGV4UiA9IGRvdChcbiAgICAgICAgICB2ZWM0KHJvdywgY29sLCBkZXB0aCwgZGVwdGgyKSxcbiAgICAgICAgICB2ZWM0KCR7c2hhcGVbMV0gKiBzaGFwZVsyXSAqIHNoYXBlWzNdfSxcbiAgICAgICAgICAgICAgICR7c2hhcGVbMl0gKiBzaGFwZVszXX0sICR7c2hhcGVbM119LCAxKSk7XG4gICAgICAgIGludCB0ZXhDID0gZGVwdGgzO1xuICAgICAgICB2ZWMyIHV2ID0gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC9cbiAgICAgICAgICAgICAgICAgIHZlYzIoJHt0ZXhOdW1DfS4wLCAke3RleE51bVJ9LjApO1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG4gICAgY29uc3Qgb2Zmc2V0ID0gZ2V0RmxhdE9mZnNldFVuaWZvcm1OYW1lKHRleE5hbWUpO1xuICAgIHJldHVybiBgXG4gICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLCBpbnQgZGVwdGgyLCBpbnQgZGVwdGgzKSB7XG4gICAgICAvLyBFeHBsaWNpdGx5IHVzZSBpbnRlZ2VyIG9wZXJhdGlvbnMgYXMgZG90KCkgb25seSB3b3JrcyBvbiBmbG9hdHMuXG4gICAgICBpbnQgaW5kZXggPSByb3cgKiAke3N0cmlkZTB9ICsgY29sICogJHtzdHJpZGUxfSArIGRlcHRoICogJHtzdHJpZGUyfSArXG4gICAgICAgICAgZGVwdGgyICogJHtzdHJpZGUzfSArIGRlcHRoMyArICR7b2Zmc2V0fTtcbiAgICAgIHZlYzIgdXYgPSB1dkZyb21GbGF0KCR7dGV4TnVtUn0sICR7dGV4TnVtQ30sIGluZGV4KTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG59XG5mdW5jdGlvbiBnZXRTYW1wbGVyNkQoaW5wdXRJbmZvKSB7XG4gICAgY29uc3Qgc2hhcGUgPSBpbnB1dEluZm8uc2hhcGVJbmZvLmxvZ2ljYWxTaGFwZTtcbiAgICBjb25zdCB0ZXhOYW1lID0gaW5wdXRJbmZvLm5hbWU7XG4gICAgY29uc3QgZnVuY05hbWUgPSAnZ2V0JyArIHRleE5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0ZXhOYW1lLnNsaWNlKDEpO1xuICAgIGNvbnN0IHsgbmV3U2hhcGUsIGtlcHREaW1zIH0gPSB1dGlsLnNxdWVlemVTaGFwZShzaGFwZSk7XG4gICAgaWYgKG5ld1NoYXBlLmxlbmd0aCA8IHNoYXBlLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBuZXdJbnB1dEluZm8gPSBzcXVlZXplSW5wdXRJbmZvKGlucHV0SW5mbywgbmV3U2hhcGUpO1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBbJ3JvdycsICdjb2wnLCAnZGVwdGgnLCAnZGVwdGgyJywgJ2RlcHRoMycsICdkZXB0aDQnXTtcbiAgICAgICAgcmV0dXJuIGBcbiAgICAgICR7Z2V0U2FtcGxlckZyb21JbkluZm8obmV3SW5wdXRJbmZvKX1cbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCxcbiAgICAgICAgICAgICAgICAgICAgaW50IGRlcHRoMiwgaW50IGRlcHRoMywgaW50IGRlcHRoNCkge1xuICAgICAgICByZXR1cm4gJHtmdW5jTmFtZX0oJHtnZXRTcXVlZXplZFBhcmFtcyhwYXJhbXMsIGtlcHREaW1zKX0pO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIGNvbnN0IHN0cmlkZTQgPSBzaGFwZVs1XTtcbiAgICBjb25zdCBzdHJpZGUzID0gc2hhcGVbNF0gKiBzdHJpZGU0O1xuICAgIGNvbnN0IHN0cmlkZTIgPSBzaGFwZVszXSAqIHN0cmlkZTM7XG4gICAgY29uc3Qgc3RyaWRlMSA9IHNoYXBlWzJdICogc3RyaWRlMjtcbiAgICBjb25zdCBzdHJpZGUwID0gc2hhcGVbMV0gKiBzdHJpZGUxO1xuICAgIGlmIChpbnB1dEluZm8uc2hhcGVJbmZvLmlzVW5pZm9ybSkge1xuICAgICAgICAvLyBVbmlmb3JtIGFycmF5cyB3aWxsIGJlIGxlc3MgdGhhbiA2NTUwNSAobm8gcmlzayBvZiBmbG9hdDE2IG92ZXJmbG93KS5cbiAgICAgICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCxcbiAgICAgICAgICAgICAgICAgIGludCBkZXB0aDIsIGludCBkZXB0aDMsIGludCBkZXB0aDQpIHtcbiAgICAgICAgaW50IGluZGV4ID0gcm91bmQoZG90KFxuICAgICAgICAgIHZlYzQocm93LCBjb2wsIGRlcHRoLCBkZXB0aDIpLFxuICAgICAgICAgIHZlYzQoJHtzdHJpZGUwfSwgJHtzdHJpZGUxfSwgJHtzdHJpZGUyfSwgJHtzdHJpZGUzfSkpICtcbiAgICAgICAgICBkb3QoXG4gICAgICAgICAgICB2ZWMyKGRlcHRoMywgZGVwdGg0KSxcbiAgICAgICAgICAgIHZlYzIoJHtzdHJpZGU0fSwgMSkpKTtcbiAgICAgICAgJHtnZXRVbmlmb3JtU2FtcGxlcihpbnB1dEluZm8pfVxuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIGNvbnN0IGZsYXRPZmZzZXQgPSBpbnB1dEluZm8uc2hhcGVJbmZvLmZsYXRPZmZzZXQ7XG4gICAgY29uc3QgdGV4U2hhcGUgPSBpbnB1dEluZm8uc2hhcGVJbmZvLnRleFNoYXBlO1xuICAgIGNvbnN0IHRleE51bVIgPSB0ZXhTaGFwZVswXTtcbiAgICBjb25zdCB0ZXhOdW1DID0gdGV4U2hhcGVbMV07XG4gICAgaWYgKHRleE51bUMgPT09IHN0cmlkZTAgJiYgZmxhdE9mZnNldCA9PSBudWxsKSB7XG4gICAgICAgIC8vIHRleEMgaXMgdXNlZCBkaXJlY3RseSBhcyBwaHlzaWNhbCAobm8gcmlzayBvZiBmbG9hdDE2IG92ZXJmbG93KS5cbiAgICAgICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCxcbiAgICAgICAgICAgICAgICAgICAgaW50IGRlcHRoMiwgaW50IGRlcHRoMywgaW50IGRlcHRoNCkge1xuICAgICAgICBpbnQgdGV4UiA9IHJvdztcbiAgICAgICAgZmxvYXQgdGV4QyA9IGRvdCh2ZWM0KGNvbCwgZGVwdGgsIGRlcHRoMiwgZGVwdGgzKSxcbiAgICAgICAgICB2ZWM0KCR7c3RyaWRlMX0sICR7c3RyaWRlMn0sICR7c3RyaWRlM30sICR7c3RyaWRlNH0pKSArXG4gICAgICAgICAgICAgICBmbG9hdChkZXB0aDQpO1xuICAgICAgICB2ZWMyIHV2ID0gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC9cbiAgICAgICAgICAgICAgICAgICB2ZWMyKCR7dGV4TnVtQ30uMCwgJHt0ZXhOdW1SfS4wKTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIGlmICh0ZXhOdW1DID09PSBzdHJpZGU0ICYmIGZsYXRPZmZzZXQgPT0gbnVsbCkge1xuICAgICAgICAvLyB0ZXhSIGlzIHVzZWQgZGlyZWN0bHkgYXMgcGh5c2ljYWwgKG5vIHJpc2sgb2YgZmxvYXQxNiBvdmVyZmxvdykuXG4gICAgICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsXG4gICAgICAgICAgICAgICAgICAgIGludCBkZXB0aDIsIGludCBkZXB0aDMsIGludCBkZXB0aDQpIHtcbiAgICAgICAgZmxvYXQgdGV4UiA9IGRvdCh2ZWM0KHJvdywgY29sLCBkZXB0aCwgZGVwdGgyKSxcbiAgICAgICAgICB2ZWM0KCR7c2hhcGVbMV0gKiBzaGFwZVsyXSAqIHNoYXBlWzNdICogc2hhcGVbNF19LFxuICAgICAgICAgICAgICAgJHtzaGFwZVsyXSAqIHNoYXBlWzNdICogc2hhcGVbNF19LFxuICAgICAgICAgICAgICAgJHtzaGFwZVszXSAqIHNoYXBlWzRdfSxcbiAgICAgICAgICAgICAgICR7c2hhcGVbNF19KSkgKyBmbG9hdChkZXB0aDMpO1xuICAgICAgICBpbnQgdGV4QyA9IGRlcHRoNDtcbiAgICAgICAgdmVjMiB1diA9ICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvXG4gICAgICAgICAgICAgICAgICB2ZWMyKCR7dGV4TnVtQ30uMCwgJHt0ZXhOdW1SfS4wKTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIGNvbnN0IG9mZnNldCA9IGdldEZsYXRPZmZzZXRVbmlmb3JtTmFtZSh0ZXhOYW1lKTtcbiAgICByZXR1cm4gYFxuICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCxcbiAgICAgICAgICAgICAgICAgIGludCBkZXB0aDIsIGludCBkZXB0aDMsIGludCBkZXB0aDQpIHtcbiAgICAgIC8vIEV4cGxpY2l0bHkgdXNlIGludGVnZXIgb3BlcmF0aW9ucyBhcyBkb3QoKSBvbmx5IHdvcmtzIG9uIGZsb2F0cy5cbiAgICAgIGludCBpbmRleCA9IHJvdyAqICR7c3RyaWRlMH0gKyBjb2wgKiAke3N0cmlkZTF9ICsgZGVwdGggKiAke3N0cmlkZTJ9ICtcbiAgICAgICAgICBkZXB0aDIgKiAke3N0cmlkZTN9ICsgZGVwdGgzICogJHtzdHJpZGU0fSArIGRlcHRoNCArICR7b2Zmc2V0fTtcbiAgICAgIHZlYzIgdXYgPSB1dkZyb21GbGF0KCR7dGV4TnVtUn0sICR7dGV4TnVtQ30sIGluZGV4KTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG59XG5mdW5jdGlvbiBnZXRVbmlmb3JtU2FtcGxlcihpbnB1dEluZm8pIHtcbiAgICBjb25zdCB0ZXhOYW1lID0gaW5wdXRJbmZvLm5hbWU7XG4gICAgY29uc3QgaW5TaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKGlucHV0SW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlKTtcbiAgICBpZiAoaW5TaXplIDwgMikge1xuICAgICAgICByZXR1cm4gYHJldHVybiAke3RleE5hbWV9O2A7XG4gICAgfVxuICAgIHJldHVybiBgXG4gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAke2luU2l6ZX07IGkrKykge1xuICAgICAgaWYgKGkgPT0gaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuICR7dGV4TmFtZX1baV07XG4gICAgICB9XG4gICAgfVxuICBgO1xufVxuZnVuY3Rpb24gZ2V0UGFja2VkU2FtcGxlckF0T3V0cHV0Q29vcmRzKGlucHV0SW5mbywgb3V0U2hhcGVJbmZvKSB7XG4gICAgY29uc3QgdGV4TmFtZSA9IGlucHV0SW5mby5uYW1lO1xuICAgIGNvbnN0IHRleEZ1bmNTbmlwcGV0ID0gdGV4TmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRleE5hbWUuc2xpY2UoMSk7XG4gICAgY29uc3QgZnVuY05hbWUgPSAnZ2V0JyArIHRleEZ1bmNTbmlwcGV0ICsgJ0F0T3V0Q29vcmRzJztcbiAgICBjb25zdCBpblJhbmsgPSBpbnB1dEluZm8uc2hhcGVJbmZvLmxvZ2ljYWxTaGFwZS5sZW5ndGg7XG4gICAgY29uc3Qgb3V0UmFuayA9IG91dFNoYXBlSW5mby5sb2dpY2FsU2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IGJyb2FkY2FzdERpbXMgPSBnZXRCcm9hZGNhc3REaW1zKGlucHV0SW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlLCBvdXRTaGFwZUluZm8ubG9naWNhbFNoYXBlKTtcbiAgICBjb25zdCB0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUob3V0UmFuayk7XG4gICAgY29uc3QgcmFua0RpZmYgPSBvdXRSYW5rIC0gaW5SYW5rO1xuICAgIGxldCBjb29yZHNTbmlwcGV0O1xuICAgIGNvbnN0IGZpZWxkcyA9IFsneCcsICd5JywgJ3onLCAndycsICd1JywgJ3YnXTtcbiAgICBpZiAoaW5SYW5rID09PSAwKSB7XG4gICAgICAgIGNvb3Jkc1NuaXBwZXQgPSAnJztcbiAgICB9XG4gICAgZWxzZSBpZiAob3V0UmFuayA8IDIgJiYgYnJvYWRjYXN0RGltcy5sZW5ndGggPj0gMSkge1xuICAgICAgICBjb29yZHNTbmlwcGV0ID0gJ2Nvb3JkcyA9IDA7JztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvb3Jkc1NuaXBwZXQgPVxuICAgICAgICAgICAgYnJvYWRjYXN0RGltcy5tYXAoZCA9PiBgY29vcmRzLiR7ZmllbGRzW2QgKyByYW5rRGlmZl19ID0gMDtgKVxuICAgICAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcbiAgICB9XG4gICAgbGV0IHVucGFja2VkQ29vcmRzU25pcHBldCA9ICcnO1xuICAgIGlmIChvdXRSYW5rIDwgMiAmJiBpblJhbmsgPiAwKSB7XG4gICAgICAgIHVucGFja2VkQ29vcmRzU25pcHBldCA9ICdjb29yZHMnO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdW5wYWNrZWRDb29yZHNTbmlwcGV0ID0gaW5wdXRJbmZvLnNoYXBlSW5mby5sb2dpY2FsU2hhcGVcbiAgICAgICAgICAgIC5tYXAoKHMsIGkpID0+IGBjb29yZHMuJHtmaWVsZHNbaSArIHJhbmtEaWZmXX1gKVxuICAgICAgICAgICAgLmpvaW4oJywgJyk7XG4gICAgfVxuICAgIGxldCBvdXRwdXQgPSBgcmV0dXJuIG91dHB1dFZhbHVlO2A7XG4gICAgY29uc3QgaW5TaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKGlucHV0SW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlKTtcbiAgICBjb25zdCBpc0lucHV0U2NhbGFyID0gaW5TaXplID09PSAxO1xuICAgIGNvbnN0IG91dFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUob3V0U2hhcGVJbmZvLmxvZ2ljYWxTaGFwZSk7XG4gICAgY29uc3QgaXNPdXRwdXRTY2FsYXIgPSBvdXRTaXplID09PSAxO1xuICAgIGlmIChpblJhbmsgPT09IDEgJiYgIWlzSW5wdXRTY2FsYXIgJiYgIWlzT3V0cHV0U2NhbGFyKSB7XG4gICAgICAgIG91dHB1dCA9IGBcbiAgICAgIHJldHVybiB2ZWM0KG91dHB1dFZhbHVlLnh5LCBvdXRwdXRWYWx1ZS54eSk7XG4gICAgYDtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNJbnB1dFNjYWxhciAmJiAhaXNPdXRwdXRTY2FsYXIpIHtcbiAgICAgICAgaWYgKG91dFJhbmsgPT09IDEpIHtcbiAgICAgICAgICAgIG91dHB1dCA9IGBcbiAgICAgICAgcmV0dXJuIHZlYzQob3V0cHV0VmFsdWUueCwgb3V0cHV0VmFsdWUueCwgMC4sIDAuKTtcbiAgICAgIGA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvdXRwdXQgPSBgXG4gICAgICAgIHJldHVybiB2ZWM0KG91dHB1dFZhbHVlLngpO1xuICAgICAgYDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChicm9hZGNhc3REaW1zLmxlbmd0aCkge1xuICAgICAgICBjb25zdCByb3dzID0gaW5SYW5rIC0gMjtcbiAgICAgICAgY29uc3QgY29scyA9IGluUmFuayAtIDE7XG4gICAgICAgIGlmIChicm9hZGNhc3REaW1zLmluZGV4T2Yocm93cykgPiAtMSAmJiBicm9hZGNhc3REaW1zLmluZGV4T2YoY29scykgPiAtMSkge1xuICAgICAgICAgICAgb3V0cHV0ID0gYHJldHVybiB2ZWM0KG91dHB1dFZhbHVlLngpO2A7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYnJvYWRjYXN0RGltcy5pbmRleE9mKHJvd3MpID4gLTEpIHtcbiAgICAgICAgICAgIG91dHB1dCA9IGByZXR1cm4gdmVjNChvdXRwdXRWYWx1ZS54LCBvdXRwdXRWYWx1ZS55LCBgICtcbiAgICAgICAgICAgICAgICBgb3V0cHV0VmFsdWUueCwgb3V0cHV0VmFsdWUueSk7YDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChicm9hZGNhc3REaW1zLmluZGV4T2YoY29scykgPiAtMSkge1xuICAgICAgICAgICAgb3V0cHV0ID0gYHJldHVybiB2ZWM0KG91dHB1dFZhbHVlLnh4LCBvdXRwdXRWYWx1ZS56eik7YDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYFxuICAgIHZlYzQgJHtmdW5jTmFtZX0oKSB7XG4gICAgICAke3R5cGV9IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgJHtjb29yZHNTbmlwcGV0fVxuICAgICAgdmVjNCBvdXRwdXRWYWx1ZSA9IGdldCR7dGV4RnVuY1NuaXBwZXR9KCR7dW5wYWNrZWRDb29yZHNTbmlwcGV0fSk7XG4gICAgICAke291dHB1dH1cbiAgICB9XG4gIGA7XG59XG5mdW5jdGlvbiBnZXRTYW1wbGVyQXRPdXRwdXRDb29yZHMoaW5wdXRJbmZvLCBvdXRTaGFwZUluZm8pIHtcbiAgICBjb25zdCB0ZXhOYW1lID0gaW5wdXRJbmZvLm5hbWU7XG4gICAgY29uc3QgdGV4RnVuY1NuaXBwZXQgPSB0ZXhOYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGV4TmFtZS5zbGljZSgxKTtcbiAgICBjb25zdCBmdW5jTmFtZSA9ICdnZXQnICsgdGV4RnVuY1NuaXBwZXQgKyAnQXRPdXRDb29yZHMnO1xuICAgIGNvbnN0IG91dFRleFNoYXBlID0gb3V0U2hhcGVJbmZvLnRleFNoYXBlO1xuICAgIGNvbnN0IGluVGV4U2hhcGUgPSBpbnB1dEluZm8uc2hhcGVJbmZvLnRleFNoYXBlO1xuICAgIGNvbnN0IGluUmFuayA9IGlucHV0SW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBvdXRSYW5rID0gb3V0U2hhcGVJbmZvLmxvZ2ljYWxTaGFwZS5sZW5ndGg7XG4gICAgaWYgKCFpbnB1dEluZm8uc2hhcGVJbmZvLmlzVW5pZm9ybSAmJiBpblJhbmsgPT09IG91dFJhbmsgJiZcbiAgICAgICAgaW5wdXRJbmZvLnNoYXBlSW5mby5mbGF0T2Zmc2V0ID09IG51bGwgJiZcbiAgICAgICAgdXRpbC5hcnJheXNFcXVhbChpblRleFNoYXBlLCBvdXRUZXhTaGFwZSkpIHtcbiAgICAgICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KCkge1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCByZXN1bHRVVik7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG4gICAgY29uc3QgdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKG91dFJhbmspO1xuICAgIGNvbnN0IGJyb2FkY2FzdERpbXMgPSBnZXRCcm9hZGNhc3REaW1zKGlucHV0SW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlLCBvdXRTaGFwZUluZm8ubG9naWNhbFNoYXBlKTtcbiAgICBjb25zdCByYW5rRGlmZiA9IG91dFJhbmsgLSBpblJhbms7XG4gICAgbGV0IGNvb3Jkc1NuaXBwZXQ7XG4gICAgY29uc3QgZmllbGRzID0gWyd4JywgJ3knLCAneicsICd3JywgJ3UnLCAndiddO1xuICAgIGlmIChpblJhbmsgPT09IDApIHtcbiAgICAgICAgY29vcmRzU25pcHBldCA9ICcnO1xuICAgIH1cbiAgICBlbHNlIGlmIChvdXRSYW5rIDwgMiAmJiBicm9hZGNhc3REaW1zLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgIGNvb3Jkc1NuaXBwZXQgPSAnY29vcmRzID0gMDsnO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29vcmRzU25pcHBldCA9XG4gICAgICAgICAgICBicm9hZGNhc3REaW1zLm1hcChkID0+IGBjb29yZHMuJHtmaWVsZHNbZCArIHJhbmtEaWZmXX0gPSAwO2ApXG4gICAgICAgICAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgIH1cbiAgICBsZXQgdW5wYWNrZWRDb29yZHNTbmlwcGV0ID0gJyc7XG4gICAgaWYgKG91dFJhbmsgPCAyICYmIGluUmFuayA+IDApIHtcbiAgICAgICAgdW5wYWNrZWRDb29yZHNTbmlwcGV0ID0gJ2Nvb3Jkcyc7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB1bnBhY2tlZENvb3Jkc1NuaXBwZXQgPSBpbnB1dEluZm8uc2hhcGVJbmZvLmxvZ2ljYWxTaGFwZVxuICAgICAgICAgICAgLm1hcCgocywgaSkgPT4gYGNvb3Jkcy4ke2ZpZWxkc1tpICsgcmFua0RpZmZdfWApXG4gICAgICAgICAgICAuam9pbignLCAnKTtcbiAgICB9XG4gICAgcmV0dXJuIGBcbiAgICBmbG9hdCAke2Z1bmNOYW1lfSgpIHtcbiAgICAgICR7dHlwZX0gY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAke2Nvb3Jkc1NuaXBwZXR9XG4gICAgICByZXR1cm4gZ2V0JHt0ZXhGdW5jU25pcHBldH0oJHt1bnBhY2tlZENvb3Jkc1NuaXBwZXR9KTtcbiAgICB9XG4gIGA7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29vcmRzRGF0YVR5cGUocmFuaykge1xuICAgIGlmIChyYW5rIDw9IDEpIHtcbiAgICAgICAgcmV0dXJuICdpbnQnO1xuICAgIH1cbiAgICBlbHNlIGlmIChyYW5rID09PSAyKSB7XG4gICAgICAgIHJldHVybiAnaXZlYzInO1xuICAgIH1cbiAgICBlbHNlIGlmIChyYW5rID09PSAzKSB7XG4gICAgICAgIHJldHVybiAnaXZlYzMnO1xuICAgIH1cbiAgICBlbHNlIGlmIChyYW5rID09PSA0KSB7XG4gICAgICAgIHJldHVybiAnaXZlYzQnO1xuICAgIH1cbiAgICBlbHNlIGlmIChyYW5rID09PSA1KSB7XG4gICAgICAgIHJldHVybiAnaXZlYzUnO1xuICAgIH1cbiAgICBlbHNlIGlmIChyYW5rID09PSA2KSB7XG4gICAgICAgIHJldHVybiAnaXZlYzYnO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoYEdQVSBmb3IgcmFuayAke3Jhbmt9IGlzIG5vdCB5ZXQgc3VwcG9ydGVkYCk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFVuaWZvcm1JbmZvRnJvbVNoYXBlKGlzUGFja2VkLCBzaGFwZSwgdGV4U2hhcGUpIHtcbiAgICBjb25zdCB7IG5ld1NoYXBlIH0gPSB1dGlsLnNxdWVlemVTaGFwZShzaGFwZSk7XG4gICAgY29uc3QgcmFuayA9IHNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCB1c2VTcXVlZXplUGFja2VkU2hhcGUgPSBpc1BhY2tlZCAmJiByYW5rID09PSAzICYmIHNoYXBlWzBdID09PSAxO1xuICAgIGNvbnN0IHNxdWVlemVTaGFwZSA9IHVzZVNxdWVlemVQYWNrZWRTaGFwZSA/IHNoYXBlLnNsaWNlKDEpIDogbmV3U2hhcGU7XG4gICAgY29uc3QgdXNlU3F1ZWV6ZVNoYXBlID0gKCFpc1BhY2tlZCAmJiByYW5rID4gMSAmJiAhdXRpbC5hcnJheXNFcXVhbChzaGFwZSwgdGV4U2hhcGUpICYmXG4gICAgICAgIG5ld1NoYXBlLmxlbmd0aCA8IHJhbmspIHx8XG4gICAgICAgIHVzZVNxdWVlemVQYWNrZWRTaGFwZTtcbiAgICBjb25zdCB1bmlmb3JtU2hhcGUgPSB1c2VTcXVlZXplU2hhcGUgPyBzcXVlZXplU2hhcGUgOiBzaGFwZTtcbiAgICByZXR1cm4geyB1c2VTcXVlZXplU2hhcGUsIHVuaWZvcm1TaGFwZSB9O1xufVxuLyoqIFJldHVybnMgYSBuZXcgaW5wdXQgaW5mbyAoYSBjb3B5KSB0aGF0IGhhcyBhIHNxdWVlemVkIGxvZ2ljYWwgc2hhcGUuICovXG5leHBvcnQgZnVuY3Rpb24gc3F1ZWV6ZUlucHV0SW5mbyhpbkluZm8sIHNxdWVlemVkU2hhcGUpIHtcbiAgICAvLyBEZWVwIGNvcHkuXG4gICAgY29uc3QgbmV3SW5wdXRJbmZvID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShpbkluZm8pKTtcbiAgICBuZXdJbnB1dEluZm8uc2hhcGVJbmZvLmxvZ2ljYWxTaGFwZSA9IHNxdWVlemVkU2hhcGU7XG4gICAgcmV0dXJuIG5ld0lucHV0SW5mbztcbn1cbmZ1bmN0aW9uIGdldFNxdWVlemVkUGFyYW1zKHBhcmFtcywga2VwdERpbXMpIHtcbiAgICByZXR1cm4ga2VwdERpbXMubWFwKGQgPT4gcGFyYW1zW2RdKS5qb2luKCcsICcpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2hhZGVyX2NvbXBpbGVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuLyoqXG4gKiBQcm9kdWNlcyBHTFNMIGNvZGUgdGhhdCBkZXJpdmVzIGxvZ2ljYWwgY29vcmRpbmF0ZXMgZnJvbSBhIGZsYXRcbiAqIGluZGV4LiBUaGUgY29kZSBwZXJmb3JtcyBpbnRlZ2VyIGRpdmlzaW9uIHdpdGggZWFjaCBzdHJpZGUgYW5kIGRlY3JlbWVudHNcbiAqIHRoZSBpbmRleCB1bnRpbCB0aGUgaW5kZXggZXF1YWxzIHRoZSBmaW5hbCBkaW1lbnNpb24gY29vcmRpbmF0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExvZ2ljYWxDb29yZGluYXRlc0Zyb21GbGF0SW5kZXgoY29vcmRzLCBzaGFwZSwgaW5kZXggPSAnaW5kZXgnKSB7XG4gICAgY29uc3Qgc3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoc2hhcGUpO1xuICAgIHJldHVybiBzdHJpZGVzXG4gICAgICAgIC5tYXAoKHN0cmlkZSwgaSkgPT4ge1xuICAgICAgICBjb25zdCBsaW5lMSA9IGBpbnQgJHtjb29yZHNbaV19ID0gJHtpbmRleH0gLyAke3N0cmlkZX1gO1xuICAgICAgICBjb25zdCBsaW5lMiA9IGkgPT09IHN0cmlkZXMubGVuZ3RoIC0gMSA/XG4gICAgICAgICAgICBgaW50ICR7Y29vcmRzW2kgKyAxXX0gPSAke2luZGV4fSAtICR7Y29vcmRzW2ldfSAqICR7c3RyaWRlfWAgOlxuICAgICAgICAgICAgYGluZGV4IC09ICR7Y29vcmRzW2ldfSAqICR7c3RyaWRlfWA7XG4gICAgICAgIHJldHVybiBgJHtsaW5lMX07ICR7bGluZTJ9O2A7XG4gICAgfSlcbiAgICAgICAgLmpvaW4oJycpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldExvZ2ljYWxDb29yZGluYXRlc0Zyb21GbGF0SW5kZXhCeVVuaWZvcm0oY29vcmRzLCBzaGFwZSwgaW5kZXggPSAnaW5kZXgnKSB7XG4gICAgY29uc3Qgc3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoc2hhcGUpO1xuICAgIHJldHVybiBzdHJpZGVzXG4gICAgICAgIC5tYXAoKF8sIGkpID0+IHtcbiAgICAgICAgY29uc3QgbGluZTEgPSBgaW50ICR7Y29vcmRzW2ldfSA9ICR7aW5kZXh9IC8gb3V0U2hhcGVTdHJpZGVzWyR7aX1dYDtcbiAgICAgICAgY29uc3QgbGluZTIgPSBpID09PSBzdHJpZGVzLmxlbmd0aCAtIDEgP1xuICAgICAgICAgICAgYGludCAke2Nvb3Jkc1tpICsgMV19ID0gJHtpbmRleH0gLSAke2Nvb3Jkc1tpXX0gKiBvdXRTaGFwZVN0cmlkZXNbJHtpfV1gIDpcbiAgICAgICAgICAgIGBpbmRleCAtPSAke2Nvb3Jkc1tpXX0gKiBvdXRTaGFwZVN0cmlkZXNbJHtpfV1gO1xuICAgICAgICByZXR1cm4gYCR7bGluZTF9OyAke2xpbmUyfTtgO1xuICAgIH0pXG4gICAgICAgIC5qb2luKCcnKTtcbn1cbmZ1bmN0aW9uIGJ1aWxkVmVjKHgpIHtcbiAgICBpZiAoeC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGAke3hbMF19YDtcbiAgICB9XG4gICAgcmV0dXJuIGB2ZWMke3gubGVuZ3RofSgke3guam9pbignLCcpfSlgO1xufVxuLyoqXG4gKiBQcm9kdWNlcyBHTFNMIGNvZGUgdGhhdCBjb21wdXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdGhlIGlucHV0IHggYW5kIHlcbiAqIHZlY3RvcnMuIEhhbmRsZXMgc3BsaXR0aW5nIGlucHV0cyBpbnRvIGluY3JlbWVudHMgb2YgdmVjNHMgd2hlbiBuZWNlc3NhcnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkb3RpZnkoeCwgeSkge1xuICAgIGlmICh4Lmxlbmd0aCAhPT0geS5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBWZWN0b3JzIHRvIGJlIGRvdHRlZCBtdXN0IGJlIG9mIHRoZSBzYW1lIGxlbmd0aCAtYCArXG4gICAgICAgICAgICBgZ290ICR7eC5sZW5ndGh9IGFuZCAke3kubGVuZ3RofWApO1xuICAgIH1cbiAgICBjb25zdCBzbGljZXMgPSBbXTtcbiAgICBjb25zdCBuZWFyZXN0VmVjNCA9IE1hdGguZmxvb3IoeC5sZW5ndGggLyA0KTtcbiAgICBjb25zdCBuZWFyZXN0VmVjNFJlbWFpbmRlciA9IHgubGVuZ3RoICUgNDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5lYXJlc3RWZWM0OyBpKyspIHtcbiAgICAgICAgY29uc3QgeFNsaWNlID0geC5zbGljZShpICogNCwgaSAqIDQgKyA0KTtcbiAgICAgICAgY29uc3QgeVNsaWNlID0geS5zbGljZShpICogNCwgaSAqIDQgKyA0KTtcbiAgICAgICAgc2xpY2VzLnB1c2goYCR7YnVpbGRWZWMoeFNsaWNlKX0sICR7YnVpbGRWZWMoeVNsaWNlKX1gKTtcbiAgICB9XG4gICAgaWYgKG5lYXJlc3RWZWM0UmVtYWluZGVyICE9PSAwKSB7XG4gICAgICAgIGxldCB4U2xpY2UgPSB4LnNsaWNlKG5lYXJlc3RWZWM0ICogNCk7XG4gICAgICAgIGxldCB5U2xpY2UgPSB5LnNsaWNlKG5lYXJlc3RWZWM0ICogNCk7XG4gICAgICAgIGlmICh4U2xpY2UubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICB4U2xpY2UgPSB4U2xpY2UubWFwKGQgPT4gYGZsb2F0KCR7ZH0pYCk7XG4gICAgICAgICAgICB5U2xpY2UgPSB5U2xpY2UubWFwKGQgPT4gYGZsb2F0KCR7ZH0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgc2xpY2VzLnB1c2goYCR7YnVpbGRWZWMoeFNsaWNlKX0sICR7YnVpbGRWZWMoeVNsaWNlKX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHNsaWNlcy5tYXAoKGQsIGkpID0+IGBkb3QoJHtkfSlgKS5qb2luKCcrJyk7XG59XG4vKipcbiAqIFByb2R1Y2VzIEdMU0wgdGhhdCBjb21wdXRlcyB0aGUgZmxhdCBpbmRleCBmcm9tIDNEIGNvb3JkaW5hdGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmxhdEluZGV4RnJvbTNEKHNoYXBlKSB7XG4gICAgY29uc3Qgc3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoc2hhcGUpLm1hcChkID0+IGQudG9TdHJpbmcoKSk7XG4gICAgcmV0dXJuIGBcbiAgaW50IGdldEZsYXRJbmRleChpdmVjMyBjb29yZHMpIHtcbiAgICByZXR1cm4gY29vcmRzLnggKiAke3N0cmlkZXNbMF19ICsgY29vcmRzLnkgKiAke3N0cmlkZXNbMV19ICsgY29vcmRzLno7XG4gIH1cbmA7XG59XG5leHBvcnQgY29uc3QgRU5DT0RFX0ZMT0FUX1NOSVBQRVQgPSBgXG4gIGNvbnN0IGZsb2F0IEZMT0FUX01BWCA9IDEuNzAxNDExODRlMzg7XG4gIGNvbnN0IGZsb2F0IEZMT0FUX01JTiA9IDEuMTc1NDk0MzVlLTM4O1xuXG4gIGxvd3AgdmVjNCBlbmNvZGVfZmxvYXQoaGlnaHAgZmxvYXQgdikge1xuICAgIGlmIChpc25hbih2KSkge1xuICAgICAgcmV0dXJuIHZlYzQoMjU1LCAyNTUsIDI1NSwgMjU1KTtcbiAgICB9XG5cbiAgICBoaWdocCBmbG9hdCBhdiA9IGFicyh2KTtcblxuICAgIGlmKGF2IDwgRkxPQVRfTUlOKSB7XG4gICAgICByZXR1cm4gdmVjNCgwLjAsIDAuMCwgMC4wLCAwLjApO1xuICAgIH0gZWxzZSBpZih2ID4gRkxPQVRfTUFYKSB7XG4gICAgICByZXR1cm4gdmVjNCgwLjAsIDAuMCwgMTI4LjAsIDEyNy4wKSAvIDI1NS4wO1xuICAgIH0gZWxzZSBpZih2IDwgLUZMT0FUX01BWCkge1xuICAgICAgcmV0dXJuIHZlYzQoMC4wLCAwLjAsICAxMjguMCwgMjU1LjApIC8gMjU1LjA7XG4gICAgfVxuXG4gICAgaGlnaHAgdmVjNCBjID0gdmVjNCgwLDAsMCwwKTtcblxuICAgIGhpZ2hwIGZsb2F0IGUgPSBmbG9vcihsb2cyKGF2KSk7XG4gICAgaGlnaHAgZmxvYXQgbSA9IGV4cDIoZnJhY3QobG9nMihhdikpKSAtIDEuMDtcblxuICAgIGNbMl0gPSBmbG9vcigxMjguMCAqIG0pO1xuICAgIG0gLT0gY1syXSAvIDEyOC4wO1xuICAgIGNbMV0gPSBmbG9vcigzMjc2OC4wICogbSk7XG4gICAgbSAtPSBjWzFdIC8gMzI3NjguMDtcbiAgICBjWzBdID0gZmxvb3IoODM4ODYwOC4wICogbSk7XG5cbiAgICBoaWdocCBmbG9hdCBlYmlhcyA9IGUgKyAxMjcuMDtcbiAgICBjWzNdID0gZmxvb3IoZWJpYXMgLyAyLjApO1xuICAgIGViaWFzIC09IGNbM10gKiAyLjA7XG4gICAgY1syXSArPSBmbG9vcihlYmlhcykgKiAxMjguMDtcblxuICAgIGNbM10gKz0gMTI4LjAgKiBzdGVwKDAuMCwgLXYpO1xuXG4gICAgcmV0dXJuIGMgLyAyNTUuMDtcbiAgfVxuYDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNoYWRlcl9jb21waWxlcl91dGlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGdldENvb3Jkc0RhdGFUeXBlIH0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuZXhwb3J0IGNsYXNzIFNsaWNlUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoZGVzdFNpemUpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWydzb3VyY2UnXTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IGRlc3RTaXplO1xuICAgICAgICB0aGlzLnJhbmsgPSBkZXN0U2l6ZS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGR0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUodGhpcy5yYW5rKTtcbiAgICAgICAgdGhpcy5jdXN0b21Vbmlmb3JtcyA9IFt7IG5hbWU6ICdzdGFydCcsIGFycmF5SW5kZXg6IHRoaXMucmFuaywgdHlwZTogJ2ludCcgfV07XG4gICAgICAgIGNvbnN0IHNvdXJjZUNvb3JkcyA9IGdldENvb3Jkcyh0aGlzLnJhbmspO1xuICAgICAgICBsZXQgYm9keTtcbiAgICAgICAgY29uc3QgY29vcmRTdW0gPSBkZXN0U2l6ZS5tYXAoKF8sIGkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgc291cmNlTG9jLiR7Y29vcmRzW2ldfSA9IHN0YXJ0WyR7aX1dICsgY29vcmRzLiR7Y29vcmRzW2ldfTtgO1xuICAgICAgICB9KTtcbiAgICAgICAgYm9keSA9IGBcbiAgICAgICAgJHtkdHlwZX0gc291cmNlTG9jO1xuICAgICAgICAke2R0eXBlfSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgJHtjb29yZFN1bS5qb2luKCdcXG4nKX1cbiAgICAgIGA7XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICR7Ym9keX1cbiAgICAgICAgc2V0T3V0cHV0KGdldFNvdXJjZSgke3NvdXJjZUNvb3Jkc30pKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbmNvbnN0IGNvb3JkcyA9IFsneCcsICd5JywgJ3onLCAndycsICd1JywgJ3YnXTtcbmZ1bmN0aW9uIGdldENvb3JkcyhyYW5rKSB7XG4gICAgaWYgKHJhbmsgPT09IDEpIHtcbiAgICAgICAgcmV0dXJuICdzb3VyY2VMb2MnO1xuICAgIH1cbiAgICBlbHNlIGlmIChyYW5rIDw9IDYpIHtcbiAgICAgICAgcmV0dXJuIGNvb3Jkcy5zbGljZSgwLCByYW5rKS5tYXAoeCA9PiAnc291cmNlTG9jLicgKyB4KS5qb2luKCcsJyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBFcnJvcihgU2xpY2luZyBmb3IgcmFuayAke3Jhbmt9IGlzIG5vdCB5ZXQgc3VwcG9ydGVkYCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2xpY2VfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGdldENoYW5uZWxzIH0gZnJvbSAnLi9wYWNraW5nX3V0aWwnO1xuaW1wb3J0IHsgZ2V0Q29vcmRzRGF0YVR5cGUgfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5leHBvcnQgY2xhc3MgU2xpY2VQYWNrZWRQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3RvcihkZXN0U2l6ZSkge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ3NvdXJjZSddO1xuICAgICAgICB0aGlzLnBhY2tlZElucHV0cyA9IHRydWU7XG4gICAgICAgIHRoaXMucGFja2VkT3V0cHV0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IGRlc3RTaXplO1xuICAgICAgICB0aGlzLnJhbmsgPSBkZXN0U2l6ZS5sZW5ndGg7XG4gICAgICAgIHRoaXMuY3VzdG9tVW5pZm9ybXMgPSBbeyBuYW1lOiAnc3RhcnQnLCBhcnJheUluZGV4OiB0aGlzLnJhbmssIHR5cGU6ICdpbnQnIH1dO1xuICAgICAgICBjb25zdCBkdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHRoaXMucmFuayk7XG4gICAgICAgIGNvbnN0IGNvb3JkcyA9IGdldENoYW5uZWxzKCdjb29yZHMnLCB0aGlzLnJhbmspO1xuICAgICAgICBjb25zdCBzb3VyY2VMb2MgPSBnZXRDaGFubmVscygnc291cmNlTG9jJywgdGhpcy5yYW5rKTtcbiAgICAgICAgY29uc3QgaW5uZXJEaW1zID0gdGhpcy5yYW5rID09PSAxID8gJ3NvdXJjZUxvYycgOiBgdmVjMigke3NvdXJjZUxvYy5zbGljZSgtMikuam9pbigpfSlgO1xuICAgICAgICBjb25zdCBnZXRDaGFubmVsID0gYGdldENoYW5uZWwoZ2V0U291cmNlKCR7c291cmNlTG9jLmpvaW4oKX0pLCAke2lubmVyRGltc30pYDtcbiAgICAgICAgY29uc3QgdXBwZXJSb3cgPSBgXG4gICAgICByZXN1bHQueCA9ICR7Z2V0Q2hhbm5lbH07XG4gICAgICBpZiAoKyske2Nvb3Jkc1t0aGlzLnJhbmsgLSAxXX0gPCAke2Rlc3RTaXplW3RoaXMucmFuayAtIDFdfSkge1xuICAgICAgICArKyR7c291cmNlTG9jW3RoaXMucmFuayAtIDFdfTtcbiAgICAgICAgcmVzdWx0LnkgPSAke2dldENoYW5uZWx9O1xuICAgICAgICAtLSR7c291cmNlTG9jW3RoaXMucmFuayAtIDFdfTtcbiAgICAgIH1cbiAgICBgO1xuICAgICAgICBjb25zdCBsb3dlclJvdyA9IHRoaXMucmFuayA9PT0gMSA/ICcnIDogYFxuICAgICAgLS0ke2Nvb3Jkc1t0aGlzLnJhbmsgLSAxXX07XG4gICAgICBpZiAoKyske2Nvb3Jkc1t0aGlzLnJhbmsgLSAyXX0gPCAke2Rlc3RTaXplW3RoaXMucmFuayAtIDJdfSkge1xuICAgICAgICArKyR7c291cmNlTG9jW3RoaXMucmFuayAtIDJdfTtcbiAgICAgICAgcmVzdWx0LnogPSAke2dldENoYW5uZWx9O1xuICAgICAgICBpZiAoKyske2Nvb3Jkc1t0aGlzLnJhbmsgLSAxXX0gPCAke2Rlc3RTaXplW3RoaXMucmFuayAtIDFdfSkge1xuICAgICAgICAgICsrJHtzb3VyY2VMb2NbdGhpcy5yYW5rIC0gMV19O1xuICAgICAgICAgIHJlc3VsdC53ID0gJHtnZXRDaGFubmVsfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIGA7XG4gICAgICAgIGNvbnN0IHNvdXJjZUxvY1NldHVwID0gdGhpcy5yYW5rIDw9IDQgP1xuICAgICAgICAgICAgYHNvdXJjZUxvYyA9IGNvb3JkcyArXG4gICAgICAgICAgICAke2R0eXBlfSgke2Rlc3RTaXplLm1hcCgoXywgaSkgPT4gYHN0YXJ0WyR7aX1dYCkuam9pbigpfSk7YCA6XG4gICAgICAgICAgICBkZXN0U2l6ZS5tYXAoKF8sIGkpID0+IGAke3NvdXJjZUxvY1tpXX0gPSAke2Nvb3Jkc1tpXX0gKyBzdGFydFske2l9XTtgKVxuICAgICAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgJHtkdHlwZX0gY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgICR7ZHR5cGV9IHNvdXJjZUxvYztcbiAgICAgICAgJHtzb3VyY2VMb2NTZXR1cH1cbiAgICAgICAgdmVjNCByZXN1bHQgPSB2ZWM0KDAuKTtcbiAgICAgICAgJHt1cHBlclJvd31cbiAgICAgICAgJHtsb3dlclJvd31cbiAgICAgICAgc2V0T3V0cHV0KHJlc3VsdCk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zbGljZV9wYWNrZWRfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGdldENvb3Jkc0RhdGFUeXBlIH0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuZXhwb3J0IGNsYXNzIFN0cmlkZWRTbGljZVByb2dyYW0ge1xuICAgIGNvbnN0cnVjdG9yKGJlZ2luLCBzdHJpZGVzLCBzaXplKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsneCddO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gc2l6ZTtcbiAgICAgICAgY29uc3QgcmFuayA9IHNpemUubGVuZ3RoO1xuICAgICAgICBjb25zdCBpbnB1dER0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUoc2l6ZS5sZW5ndGgpO1xuICAgICAgICBjb25zdCBkdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHNpemUubGVuZ3RoKTtcbiAgICAgICAgbGV0IG5ld0Nvb3JkcyA9ICcnO1xuICAgICAgICBpZiAocmFuayA9PT0gMSkge1xuICAgICAgICAgICAgbmV3Q29vcmRzID0gJ2Nvb3JkcyAqIHN0cmlkZXMgKyBiZWdpbic7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgb3V0cHV0QXhpcyA9IDA7XG4gICAgICAgICAgICBuZXdDb29yZHMgPVxuICAgICAgICAgICAgICAgIHNpemUubWFwKChfLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dEF4aXMrKztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpemUubGVuZ3RoID09PSAxID9cbiAgICAgICAgICAgICAgICAgICAgICAgIGBjb29yZHMgKiBzdHJpZGVzWyR7aX1dICsgYmVnaW5bJHtpfV1gIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGBjb29yZHNbJHtvdXRwdXRBeGlzIC0gMX1dICogc3RyaWRlc1ske2l9XSArIGJlZ2luWyR7aX1dYDtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuam9pbignLCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAke2lucHV0RHR5cGV9IGJlZ2luID0gJHtpbnB1dER0eXBlfSgke2JlZ2lufSk7XG4gICAgICAke2lucHV0RHR5cGV9IHN0cmlkZXMgPSAke2lucHV0RHR5cGV9KCR7c3RyaWRlc30pO1xuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICR7ZHR5cGV9IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBzZXRPdXRwdXQoZ2V0WCgke25ld0Nvb3Jkc30pKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN0cmlkZWRfc2xpY2VfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGVudiwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgdmFyIFBhY2tpbmdTY2hlbWU7XG4oZnVuY3Rpb24gKFBhY2tpbmdTY2hlbWUpIHtcbiAgICAvKipcbiAgICAgKiBBbGwgdmFsdWVzIGluIGEgc2luZ2xlIHRleGVsIGFyZSBkZW5zZWx5IHBhY2tlZCB3aXRob3V0IGFueSBjb25zdHJhaW50cy5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgaG93IHRoZSBzaGFkZXIgZW5jb2RlcyBhIHRlbnNvciB3aXRoIHNoYXBlID0gWzIsIDMsIDRdXG4gICAgICogKGluZGljZXMgYXJlIFtiYXRjaCwgcm93LCBjb2xdKS5cbiAgICAgKlxuICAgICAqIDAwMHwwMDEgICAwMTB8MDExICAgMDIwfDAyMVxuICAgICAqIC0tLS0tLS0gICAtLS0tLS0tICAgLS0tLS0tLVxuICAgICAqIDAwMnwwMDMgICAwMTJ8MDEzICAgMDIyfDAyM1xuICAgICAqXG4gICAgICogMTAwfDEwMSAgIDExMHwxMTEgICAxMjB8MTIxXG4gICAgICogLS0tLS0tLSAgIC0tLS0tLS0gICAtLS0tLS0tXG4gICAgICogMTAyfDEwMyAgIDExMnwxMTMgICAxMjJ8MTIzXG4gICAgICpcbiAgICAgKi9cbiAgICBQYWNraW5nU2NoZW1lW1BhY2tpbmdTY2hlbWVbXCJERU5TRVwiXSA9IDBdID0gXCJERU5TRVwiO1xuICAgIC8qKlxuICAgICAqIFNpbmdsZSB0ZXhlbHMgY29udGFpbiBvbmx5IHZhbHVlcyBmcm9tIHRoZSBzYW1lIGJhdGNoLCBhbmQgZnJvbSBhZGphY2VudFxuICAgICAqIHJvd3MgYW5kIGNvbHVtbnMuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIGhvdyB0aGUgc2hhZGVyIGVuY29kZXMgYSB0ZW5zb3Igd2l0aCBzaGFwZSA9IFsyLCAzLCA1XVxuICAgICAqIChpbmRpY2VzIGFyZSBbYmF0Y2gsIHJvdywgY29sXSkuXG4gICAgICpcbiAgICAgKiAwMDB8MDAxICAgMDAyfDAwMyAgIDAwNHx4eHggICAwMjB8MDIxICAgMDIyfDAyMyAgIDAyNHx4eHhcbiAgICAgKiAtLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS0gICAtLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS1cbiAgICAgKiAwMTB8MDExICAgMDEyfDAxMyAgIDAxNHx4eHggICB4eHh8eHh4ICAgeHh4fHh4eCAgIHh4eHx4eHhcbiAgICAgKlxuICAgICAqIDEwMHwxMDEgICAxMDJ8MTAzICAgMTA0fHh4eCAgIDEyMHwxMjEgICAxMjJ8MTIzICAgMTI0fHh4eFxuICAgICAqIC0tLS0tLS0gICAtLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS0gICAtLS0tLS0tICAgLS0tLS0tLVxuICAgICAqIDExMHwxMTEgICAxMTJ8MTEzICAgMTE0fHh4eCAgIHh4eHx4eHggICB4eHh8eHh4ICAgeHh4fHh4eFxuICAgICAqXG4gICAgICovXG4gICAgUGFja2luZ1NjaGVtZVtQYWNraW5nU2NoZW1lW1wiU0hBUkVEX0JBVENIXCJdID0gMV0gPSBcIlNIQVJFRF9CQVRDSFwiO1xufSkoUGFja2luZ1NjaGVtZSB8fCAoUGFja2luZ1NjaGVtZSA9IHt9KSk7XG5leHBvcnQgdmFyIFRleHR1cmVVc2FnZTtcbihmdW5jdGlvbiAoVGV4dHVyZVVzYWdlKSB7XG4gICAgVGV4dHVyZVVzYWdlW1RleHR1cmVVc2FnZVtcIlJFTkRFUlwiXSA9IDBdID0gXCJSRU5ERVJcIjtcbiAgICBUZXh0dXJlVXNhZ2VbVGV4dHVyZVVzYWdlW1wiVVBMT0FEXCJdID0gMV0gPSBcIlVQTE9BRFwiO1xuICAgIFRleHR1cmVVc2FnZVtUZXh0dXJlVXNhZ2VbXCJQSVhFTFNcIl0gPSAyXSA9IFwiUElYRUxTXCI7XG4gICAgVGV4dHVyZVVzYWdlW1RleHR1cmVVc2FnZVtcIkRPV05MT0FEXCJdID0gM10gPSBcIkRPV05MT0FEXCI7XG59KShUZXh0dXJlVXNhZ2UgfHwgKFRleHR1cmVVc2FnZSA9IHt9KSk7XG5leHBvcnQgdmFyIFBoeXNpY2FsVGV4dHVyZVR5cGU7XG4oZnVuY3Rpb24gKFBoeXNpY2FsVGV4dHVyZVR5cGUpIHtcbiAgICBQaHlzaWNhbFRleHR1cmVUeXBlW1BoeXNpY2FsVGV4dHVyZVR5cGVbXCJVTlBBQ0tFRF9GTE9BVDE2XCJdID0gMF0gPSBcIlVOUEFDS0VEX0ZMT0FUMTZcIjtcbiAgICBQaHlzaWNhbFRleHR1cmVUeXBlW1BoeXNpY2FsVGV4dHVyZVR5cGVbXCJVTlBBQ0tFRF9GTE9BVDMyXCJdID0gMV0gPSBcIlVOUEFDS0VEX0ZMT0FUMzJcIjtcbiAgICBQaHlzaWNhbFRleHR1cmVUeXBlW1BoeXNpY2FsVGV4dHVyZVR5cGVbXCJQQUNLRURfNFgxX1VOU0lHTkVEX0JZVEVcIl0gPSAyXSA9IFwiUEFDS0VEXzRYMV9VTlNJR05FRF9CWVRFXCI7XG4gICAgUGh5c2ljYWxUZXh0dXJlVHlwZVtQaHlzaWNhbFRleHR1cmVUeXBlW1wiUEFDS0VEXzJYMl9GTE9BVDMyXCJdID0gM10gPSBcIlBBQ0tFRF8yWDJfRkxPQVQzMlwiO1xuICAgIFBoeXNpY2FsVGV4dHVyZVR5cGVbUGh5c2ljYWxUZXh0dXJlVHlwZVtcIlBBQ0tFRF8yWDJfRkxPQVQxNlwiXSA9IDRdID0gXCJQQUNLRURfMlgyX0ZMT0FUMTZcIjtcbn0pKFBoeXNpY2FsVGV4dHVyZVR5cGUgfHwgKFBoeXNpY2FsVGV4dHVyZVR5cGUgPSB7fSkpO1xuZXhwb3J0IGZ1bmN0aW9uIGdldFVucGFja2VkTWF0cml4VGV4dHVyZVNoYXBlV2lkdGhIZWlnaHQocm93cywgY29sdW1ucykge1xuICAgIHJldHVybiBbY29sdW1ucywgcm93c107XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0VW5wYWNrZWRBcnJheVNpemVGcm9tTWF0cml4U2l6ZShtYXRyaXhTaXplLCBjaGFubmVsc1BlclRleHR1cmUpIHtcbiAgICByZXR1cm4gbWF0cml4U2l6ZSAqIGNoYW5uZWxzUGVyVGV4dHVyZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb2xvck1hdHJpeFRleHR1cmVTaGFwZVdpZHRoSGVpZ2h0KHJvd3MsIGNvbHVtbnMpIHtcbiAgICByZXR1cm4gW2NvbHVtbnMgKiA0LCByb3dzXTtcbn1cbi8qKlxuICogR2V0IHNoYXBlIGZvciBkZW5zZWx5IHBhY2tlZCBSR0JBIHRleHR1cmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZW5zZVRleFNoYXBlKHNoYXBlKSB7XG4gICAgY29uc3Qgc2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShzaGFwZSk7XG4gICAgY29uc3QgdGV4ZWxzTmVlZGVkID0gTWF0aC5jZWlsKHNpemUgLyA0KTtcbiAgICByZXR1cm4gdXRpbC5zaXplVG9TcXVhcmlzaFNoYXBlKHRleGVsc05lZWRlZCk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0TWF0cml4U2l6ZUZyb21VbnBhY2tlZEFycmF5U2l6ZSh1bnBhY2tlZFNpemUsIGNoYW5uZWxzUGVyVGV4dHVyZSkge1xuICAgIGlmICh1bnBhY2tlZFNpemUgJSBjaGFubmVsc1BlclRleHR1cmUgIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bnBhY2tlZFNpemUgKCR7dW5wYWNrZWRTaXplfSkgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGAgK1xuICAgICAgICAgICAgYCR7Y2hhbm5lbHNQZXJUZXh0dXJlfWApO1xuICAgIH1cbiAgICByZXR1cm4gdW5wYWNrZWRTaXplIC8gY2hhbm5lbHNQZXJUZXh0dXJlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZU1hdHJpeEZyb21VbnBhY2tlZENvbG9yUkdCQUFycmF5KHVucGFja2VkQXJyYXksIG1hdHJpeCwgY2hhbm5lbHMpIHtcbiAgICBjb25zdCByZXF1aXJlZFNpemUgPSB1bnBhY2tlZEFycmF5Lmxlbmd0aCAqIGNoYW5uZWxzIC8gNDtcbiAgICBpZiAobWF0cml4Lmxlbmd0aCA8IHJlcXVpcmVkU2l6ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG1hdHJpeCBsZW5ndGggKCR7bWF0cml4Lmxlbmd0aH0pIG11c3QgYmUgPj0gJHtyZXF1aXJlZFNpemV9YCk7XG4gICAgfVxuICAgIGxldCBkc3QgPSAwO1xuICAgIGZvciAobGV0IHNyYyA9IDA7IHNyYyA8IHVucGFja2VkQXJyYXkubGVuZ3RoOyBzcmMgKz0gNCkge1xuICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGNoYW5uZWxzOyBjKyspIHtcbiAgICAgICAgICAgIG1hdHJpeFtkc3QrK10gPSB1bnBhY2tlZEFycmF5W3NyYyArIGNdO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhY2tlZE1hdHJpeFRleHR1cmVTaGFwZVdpZHRoSGVpZ2h0KHJvd3MsIGNvbHVtbnMpIHtcbiAgICByZXR1cm4gW1xuICAgICAgICBNYXRoLm1heCgxLCBNYXRoLmNlaWwoY29sdW1ucyAvIDIpKSwgTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHJvd3MgLyAyKSlcbiAgICBdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhY2tlZFJHQkFBcnJheVNpemVGcm9tTWF0cml4U2hhcGUocm93cywgY29sdW1ucykge1xuICAgIGNvbnN0IFt3LCBoXSA9IGdldFBhY2tlZE1hdHJpeFRleHR1cmVTaGFwZVdpZHRoSGVpZ2h0KHJvd3MsIGNvbHVtbnMpO1xuICAgIHJldHVybiB3ICogaCAqIDQ7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0VGV4dHVyZUNvbmZpZyhcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbmdsLCB0ZXh0dXJlSGFsZkZsb2F0RXh0ZW5zaW9uKSB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgIGNvbnN0IGdsYW55ID0gZ2w7XG4gICAgbGV0IGludGVybmFsRm9ybWF0RmxvYXQ7XG4gICAgbGV0IGludGVybmFsRm9ybWF0SGFsZkZsb2F0O1xuICAgIGxldCBpbnRlcm5hbEZvcm1hdFBhY2tlZEhhbGZGbG9hdDtcbiAgICBsZXQgaW50ZXJuYWxGb3JtYXRQYWNrZWRGbG9hdDtcbiAgICBsZXQgdGV4dHVyZUZvcm1hdEZsb2F0O1xuICAgIGxldCBkb3dubG9hZFRleHR1cmVGb3JtYXQ7XG4gICAgbGV0IGRvd25sb2FkVW5wYWNrTnVtQ2hhbm5lbHM7XG4gICAgbGV0IGRlZmF1bHROdW1DaGFubmVscztcbiAgICBsZXQgdGV4dHVyZVR5cGVIYWxmRmxvYXQ7XG4gICAgbGV0IHRleHR1cmVUeXBlRmxvYXQ7XG4gICAgaWYgKGVudigpLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpID09PSAyKSB7XG4gICAgICAgIGludGVybmFsRm9ybWF0RmxvYXQgPSBnbGFueS5SMzJGO1xuICAgICAgICBpbnRlcm5hbEZvcm1hdEhhbGZGbG9hdCA9IGdsYW55LlIxNkY7XG4gICAgICAgIGludGVybmFsRm9ybWF0UGFja2VkSGFsZkZsb2F0ID0gZ2xhbnkuUkdCQTE2RjtcbiAgICAgICAgaW50ZXJuYWxGb3JtYXRQYWNrZWRGbG9hdCA9IGdsYW55LlJHQkEzMkY7XG4gICAgICAgIHRleHR1cmVGb3JtYXRGbG9hdCA9IGdsYW55LlJFRDtcbiAgICAgICAgZG93bmxvYWRVbnBhY2tOdW1DaGFubmVscyA9IDQ7XG4gICAgICAgIGRlZmF1bHROdW1DaGFubmVscyA9IDE7XG4gICAgICAgIHRleHR1cmVUeXBlSGFsZkZsb2F0ID0gZ2xhbnkuSEFMRl9GTE9BVDtcbiAgICAgICAgdGV4dHVyZVR5cGVGbG9hdCA9IGdsYW55LkZMT0FUO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaW50ZXJuYWxGb3JtYXRGbG9hdCA9IGdsLlJHQkE7XG4gICAgICAgIGludGVybmFsRm9ybWF0SGFsZkZsb2F0ID0gZ2wuUkdCQTtcbiAgICAgICAgaW50ZXJuYWxGb3JtYXRQYWNrZWRIYWxmRmxvYXQgPSBnbC5SR0JBO1xuICAgICAgICBpbnRlcm5hbEZvcm1hdFBhY2tlZEZsb2F0ID0gZ2xhbnkuUkdCQTtcbiAgICAgICAgdGV4dHVyZUZvcm1hdEZsb2F0ID0gZ2wuUkdCQTtcbiAgICAgICAgZG93bmxvYWRVbnBhY2tOdW1DaGFubmVscyA9IDQ7XG4gICAgICAgIGRlZmF1bHROdW1DaGFubmVscyA9IDQ7XG4gICAgICAgIHRleHR1cmVUeXBlSGFsZkZsb2F0ID0gdGV4dHVyZUhhbGZGbG9hdEV4dGVuc2lvbiAhPSBudWxsID9cbiAgICAgICAgICAgIHRleHR1cmVIYWxmRmxvYXRFeHRlbnNpb24uSEFMRl9GTE9BVF9PRVMgOlxuICAgICAgICAgICAgbnVsbDtcbiAgICAgICAgdGV4dHVyZVR5cGVGbG9hdCA9IGdsLkZMT0FUO1xuICAgIH1cbiAgICBkb3dubG9hZFRleHR1cmVGb3JtYXQgPSBnbC5SR0JBO1xuICAgIHJldHVybiB7XG4gICAgICAgIGludGVybmFsRm9ybWF0RmxvYXQsXG4gICAgICAgIGludGVybmFsRm9ybWF0SGFsZkZsb2F0LFxuICAgICAgICBpbnRlcm5hbEZvcm1hdFBhY2tlZEhhbGZGbG9hdCxcbiAgICAgICAgaW50ZXJuYWxGb3JtYXRQYWNrZWRGbG9hdCxcbiAgICAgICAgdGV4dHVyZUZvcm1hdEZsb2F0LFxuICAgICAgICBkb3dubG9hZFRleHR1cmVGb3JtYXQsXG4gICAgICAgIGRvd25sb2FkVW5wYWNrTnVtQ2hhbm5lbHMsXG4gICAgICAgIGRlZmF1bHROdW1DaGFubmVscyxcbiAgICAgICAgdGV4dHVyZVR5cGVIYWxmRmxvYXQsXG4gICAgICAgIHRleHR1cmVUeXBlRmxvYXRcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGV4X3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGdldEludGVybmFsRm9ybWF0Rm9yRmxvYXQxNk1hdHJpeFRleHR1cmUsIGdldEludGVybmFsRm9ybWF0Rm9yRmxvYXQxNlBhY2tlZE1hdHJpeFRleHR1cmUsIGdldEludGVybmFsRm9ybWF0Rm9yRmxvYXQzMk1hdHJpeFRleHR1cmUsIGdldEludGVybmFsRm9ybWF0Rm9yUGFja2VkTWF0cml4VGV4dHVyZSwgZ2V0SW50ZXJuYWxGb3JtYXRGb3JVbnNpZ25lZEJ5dGVzTWF0cml4VGV4dHVyZSB9IGZyb20gJy4vZ3BncHVfdXRpbCc7XG5pbXBvcnQgeyBnZXRQYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodCwgZ2V0VW5wYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodCwgUGh5c2ljYWxUZXh0dXJlVHlwZSwgVGV4dHVyZVVzYWdlIH0gZnJvbSAnLi90ZXhfdXRpbCc7XG5leHBvcnQgY2xhc3MgVGV4dHVyZU1hbmFnZXIge1xuICAgIGNvbnN0cnVjdG9yKGdwZ3B1KSB7XG4gICAgICAgIHRoaXMuZ3BncHUgPSBncGdwdTtcbiAgICAgICAgdGhpcy5udW1Vc2VkVGV4dHVyZXMgPSAwO1xuICAgICAgICB0aGlzLm51bUZyZWVUZXh0dXJlcyA9IDA7XG4gICAgICAgIHRoaXMuX251bUJ5dGVzQWxsb2NhdGVkID0gMDtcbiAgICAgICAgdGhpcy5fbnVtQnl0ZXNGcmVlID0gMDsgLy8gSG93IG1hbnkgYnl0ZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkXG4gICAgICAgIC8vIGFyZSBhdmFpbGFibGUgZm9yIHJldXNlLlxuICAgICAgICB0aGlzLmZyZWVUZXh0dXJlcyA9IHt9O1xuICAgICAgICB0aGlzLmxvZ0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy51c2VkVGV4dHVyZXMgPSB7fTtcbiAgICB9XG4gICAgYWNxdWlyZVRleHR1cmUoc2hhcGVSQywgdXNhZ2UsIGlzUGFja2VkKSB7XG4gICAgICAgIGNvbnN0IHBoeXNpY2FsVGV4VHlwZSA9IGdldFBoeXNpY2FsRnJvbUxvZ2ljYWxUZXh0dXJlVHlwZSh1c2FnZSwgaXNQYWNrZWQpO1xuICAgICAgICBjb25zdCBzaGFwZUtleSA9IGdldEtleUZyb21UZXh0dXJlU2hhcGUoc2hhcGVSQywgcGh5c2ljYWxUZXhUeXBlLCBpc1BhY2tlZCk7XG4gICAgICAgIGlmICghKHNoYXBlS2V5IGluIHRoaXMuZnJlZVRleHR1cmVzKSkge1xuICAgICAgICAgICAgdGhpcy5mcmVlVGV4dHVyZXNbc2hhcGVLZXldID0gW107XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEoc2hhcGVLZXkgaW4gdGhpcy51c2VkVGV4dHVyZXMpKSB7XG4gICAgICAgICAgICB0aGlzLnVzZWRUZXh0dXJlc1tzaGFwZUtleV0gPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0ZXhCeXRlcyA9IGNvbXB1dGVCeXRlcyhzaGFwZVJDLCBwaHlzaWNhbFRleFR5cGUsIHRoaXMuZ3BncHUuZ2wsIHRoaXMuZ3BncHUudGV4dHVyZUNvbmZpZywgaXNQYWNrZWQpO1xuICAgICAgICBpZiAodGhpcy5mcmVlVGV4dHVyZXNbc2hhcGVLZXldLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMubnVtRnJlZVRleHR1cmVzLS07XG4gICAgICAgICAgICB0aGlzLm51bVVzZWRUZXh0dXJlcysrO1xuICAgICAgICAgICAgdGhpcy5fbnVtQnl0ZXNGcmVlIC09IHRleEJ5dGVzO1xuICAgICAgICAgICAgdGhpcy5sb2coKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld1RleHR1cmUgPSB0aGlzLmZyZWVUZXh0dXJlc1tzaGFwZUtleV0uc2hpZnQoKTtcbiAgICAgICAgICAgIHRoaXMudXNlZFRleHR1cmVzW3NoYXBlS2V5XS5wdXNoKG5ld1RleHR1cmUpO1xuICAgICAgICAgICAgcmV0dXJuIG5ld1RleHR1cmU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG5ld1RleHR1cmU7XG4gICAgICAgIGlmIChwaHlzaWNhbFRleFR5cGUgPT09IFBoeXNpY2FsVGV4dHVyZVR5cGUuUEFDS0VEXzJYMl9GTE9BVDMyKSB7XG4gICAgICAgICAgICBuZXdUZXh0dXJlID0gdGhpcy5ncGdwdS5jcmVhdGVQYWNrZWRNYXRyaXhUZXh0dXJlKHNoYXBlUkNbMF0sIHNoYXBlUkNbMV0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBoeXNpY2FsVGV4VHlwZSA9PT0gUGh5c2ljYWxUZXh0dXJlVHlwZS5QQUNLRURfMlgyX0ZMT0FUMTYpIHtcbiAgICAgICAgICAgIG5ld1RleHR1cmUgPVxuICAgICAgICAgICAgICAgIHRoaXMuZ3BncHUuY3JlYXRlRmxvYXQxNlBhY2tlZE1hdHJpeFRleHR1cmUoc2hhcGVSQ1swXSwgc2hhcGVSQ1sxXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGh5c2ljYWxUZXhUeXBlID09PSBQaHlzaWNhbFRleHR1cmVUeXBlLlVOUEFDS0VEX0ZMT0FUMzIpIHtcbiAgICAgICAgICAgIG5ld1RleHR1cmUgPVxuICAgICAgICAgICAgICAgIHRoaXMuZ3BncHUuY3JlYXRlRmxvYXQzMk1hdHJpeFRleHR1cmUoc2hhcGVSQ1swXSwgc2hhcGVSQ1sxXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGh5c2ljYWxUZXhUeXBlID09PSBQaHlzaWNhbFRleHR1cmVUeXBlLlVOUEFDS0VEX0ZMT0FUMTYpIHtcbiAgICAgICAgICAgIG5ld1RleHR1cmUgPVxuICAgICAgICAgICAgICAgIHRoaXMuZ3BncHUuY3JlYXRlRmxvYXQxNk1hdHJpeFRleHR1cmUoc2hhcGVSQ1swXSwgc2hhcGVSQ1sxXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGh5c2ljYWxUZXhUeXBlID09PSBQaHlzaWNhbFRleHR1cmVUeXBlLlBBQ0tFRF80WDFfVU5TSUdORURfQllURSkge1xuICAgICAgICAgICAgbmV3VGV4dHVyZSA9XG4gICAgICAgICAgICAgICAgdGhpcy5ncGdwdS5jcmVhdGVVbnNpZ25lZEJ5dGVzTWF0cml4VGV4dHVyZShzaGFwZVJDWzBdLCBzaGFwZVJDWzFdKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVzZWRUZXh0dXJlc1tzaGFwZUtleV0ucHVzaChuZXdUZXh0dXJlKTtcbiAgICAgICAgdGhpcy5udW1Vc2VkVGV4dHVyZXMrKztcbiAgICAgICAgdGhpcy5fbnVtQnl0ZXNBbGxvY2F0ZWQgKz0gdGV4Qnl0ZXM7XG4gICAgICAgIHRoaXMubG9nKCk7XG4gICAgICAgIHJldHVybiBuZXdUZXh0dXJlO1xuICAgIH1cbiAgICByZWxlYXNlVGV4dHVyZSh0ZXh0dXJlLCBzaGFwZSwgbG9naWNhbFRleFR5cGUsIGlzUGFja2VkKSB7XG4gICAgICAgIGlmICh0aGlzLmZyZWVUZXh0dXJlcyA9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBBbHJlYWR5IGRpc3Bvc2VkLlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBoeXNpY2FsVGV4VHlwZSA9IGdldFBoeXNpY2FsRnJvbUxvZ2ljYWxUZXh0dXJlVHlwZShsb2dpY2FsVGV4VHlwZSwgaXNQYWNrZWQpO1xuICAgICAgICBjb25zdCBzaGFwZUtleSA9IGdldEtleUZyb21UZXh0dXJlU2hhcGUoc2hhcGUsIHBoeXNpY2FsVGV4VHlwZSwgaXNQYWNrZWQpO1xuICAgICAgICBpZiAoIShzaGFwZUtleSBpbiB0aGlzLmZyZWVUZXh0dXJlcykpIHtcbiAgICAgICAgICAgIHRoaXMuZnJlZVRleHR1cmVzW3NoYXBlS2V5XSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRleEJ5dGVzID0gY29tcHV0ZUJ5dGVzKHNoYXBlLCBwaHlzaWNhbFRleFR5cGUsIHRoaXMuZ3BncHUuZ2wsIHRoaXMuZ3BncHUudGV4dHVyZUNvbmZpZywgaXNQYWNrZWQpO1xuICAgICAgICBjb25zdCBkZWxldGVUZXhUaHJlc2hvbGQgPSBlbnYoKS5nZXQoJ1dFQkdMX0RFTEVURV9URVhUVVJFX1RIUkVTSE9MRCcpO1xuICAgICAgICBpZiAoZGVsZXRlVGV4VGhyZXNob2xkICE9PSAtMSAmJlxuICAgICAgICAgICAgdGhpcy5fbnVtQnl0ZXNBbGxvY2F0ZWQgPiBkZWxldGVUZXhUaHJlc2hvbGQpIHtcbiAgICAgICAgICAgIHRoaXMuZ3BncHUuZGVsZXRlTWF0cml4VGV4dHVyZSh0ZXh0dXJlKTtcbiAgICAgICAgICAgIHRoaXMuX251bUJ5dGVzQWxsb2NhdGVkIC09IHRleEJ5dGVzO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5mcmVlVGV4dHVyZXNbc2hhcGVLZXldLnB1c2godGV4dHVyZSk7XG4gICAgICAgICAgICB0aGlzLm51bUZyZWVUZXh0dXJlcysrO1xuICAgICAgICAgICAgdGhpcy5fbnVtQnl0ZXNGcmVlICs9IHRleEJ5dGVzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubnVtVXNlZFRleHR1cmVzLS07XG4gICAgICAgIGNvbnN0IHRleExpc3QgPSB0aGlzLnVzZWRUZXh0dXJlc1tzaGFwZUtleV07XG4gICAgICAgIGNvbnN0IHRleEluZGV4ID0gdGV4TGlzdC5pbmRleE9mKHRleHR1cmUpO1xuICAgICAgICBpZiAodGV4SW5kZXggPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZWxlYXNlIGEgdGV4dHVyZSB0aGF0IHdhcyBuZXZlciBwcm92aWRlZCBieSB0aGlzICcgK1xuICAgICAgICAgICAgICAgICd0ZXh0dXJlIG1hbmFnZXInKTtcbiAgICAgICAgfVxuICAgICAgICB0ZXhMaXN0LnNwbGljZSh0ZXhJbmRleCwgMSk7XG4gICAgICAgIHRoaXMubG9nKCk7XG4gICAgfVxuICAgIGxvZygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmxvZ0VuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b3RhbCA9IHRoaXMubnVtRnJlZVRleHR1cmVzICsgdGhpcy5udW1Vc2VkVGV4dHVyZXM7XG4gICAgICAgIGNvbnNvbGUubG9nKCdGcmVlL1VzZWQnLCBgJHt0aGlzLm51bUZyZWVUZXh0dXJlc30gLyAke3RoaXMubnVtVXNlZFRleHR1cmVzfWAsIGAoJHt0b3RhbH0pYCk7XG4gICAgICAgIGNvbnN0IGZyZWVSYXRpbyA9IHRoaXMuX251bUJ5dGVzRnJlZSAvIHRoaXMuX251bUJ5dGVzQWxsb2NhdGVkO1xuICAgICAgICBjb25zb2xlLmxvZyhgQnl0ZXMgYWxsb2NhdGVkOiAke3RoaXMuX251bUJ5dGVzQWxsb2NhdGVkfWApO1xuICAgICAgICBjb25zb2xlLmxvZyhgQnl0ZXMgdW51c2VkOiAke3RoaXMuX251bUJ5dGVzRnJlZX0gKCR7TWF0aC5yb3VuZCgxMDAgKiBmcmVlUmF0aW8pfSUpYCk7XG4gICAgfVxuICAgIGdldCBudW1CeXRlc0FsbG9jYXRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX251bUJ5dGVzQWxsb2NhdGVkO1xuICAgIH1cbiAgICBnZXQgbnVtQnl0ZXNGcmVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbnVtQnl0ZXNGcmVlO1xuICAgIH1cbiAgICBnZXROdW1Vc2VkVGV4dHVyZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm51bVVzZWRUZXh0dXJlcztcbiAgICB9XG4gICAgZ2V0TnVtRnJlZVRleHR1cmVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5udW1GcmVlVGV4dHVyZXM7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmZyZWVUZXh0dXJlcyA9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBBbHJlYWR5IGRpc3Bvc2VkLlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgdGV4U2hhcGUgaW4gdGhpcy5mcmVlVGV4dHVyZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZnJlZVRleHR1cmVzW3RleFNoYXBlXS5mb3JFYWNoKHRleCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5ncGdwdS5kZWxldGVNYXRyaXhUZXh0dXJlKHRleCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHRleFNoYXBlIGluIHRoaXMudXNlZFRleHR1cmVzKSB7XG4gICAgICAgICAgICB0aGlzLnVzZWRUZXh0dXJlc1t0ZXhTaGFwZV0uZm9yRWFjaCh0ZXggPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZ3BncHUuZGVsZXRlTWF0cml4VGV4dHVyZSh0ZXgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mcmVlVGV4dHVyZXMgPSBudWxsO1xuICAgICAgICB0aGlzLnVzZWRUZXh0dXJlcyA9IG51bGw7XG4gICAgICAgIHRoaXMubnVtVXNlZFRleHR1cmVzID0gMDtcbiAgICAgICAgdGhpcy5udW1GcmVlVGV4dHVyZXMgPSAwO1xuICAgICAgICB0aGlzLl9udW1CeXRlc0FsbG9jYXRlZCA9IDA7XG4gICAgICAgIHRoaXMuX251bUJ5dGVzRnJlZSA9IDA7XG4gICAgfVxufVxuZnVuY3Rpb24gbnVtQnl0ZXNGb3JJbnRlcm5hbEZvcm1hdChnbCwgaW50ZXJuYWxGb3JtYXQpIHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgY29uc3QgZ2xhbnkgPSBnbDtcbiAgICBpZiAoaW50ZXJuYWxGb3JtYXQgPT09IGdsYW55LlIzMkYpIHtcbiAgICAgICAgcmV0dXJuIDQ7XG4gICAgfVxuICAgIGVsc2UgaWYgKGludGVybmFsRm9ybWF0ID09PSBnbGFueS5SMTZGKSB7XG4gICAgICAgIHJldHVybiAyO1xuICAgIH1cbiAgICBlbHNlIGlmIChpbnRlcm5hbEZvcm1hdCA9PT0gZ2xhbnkuUkdCQTMyRikge1xuICAgICAgICByZXR1cm4gMTY7XG4gICAgfVxuICAgIGVsc2UgaWYgKGludGVybmFsRm9ybWF0ID09PSBnbC5SR0JBKSB7XG4gICAgICAgIHJldHVybiAxNjtcbiAgICB9XG4gICAgZWxzZSBpZiAoaW50ZXJuYWxGb3JtYXQgPT09IGdsYW55LlJHQkExNkYpIHtcbiAgICAgICAgcmV0dXJuIDg7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBpbnRlcm5hbCBmb3JtYXQgJHtpbnRlcm5hbEZvcm1hdH1gKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlQnl0ZXMoc2hhcGUsIHBoeXNpY2FsVGV4VHlwZSwgZ2wsIHRleHR1cmVDb25maWcsIGlzUGFja2VkKSB7XG4gICAgLy8gSXQgaXMgbm90IHBvc3NpYmxlIHRvIGluZmVyIHBhY2tlZCBzdGF0dXMgZnJvbSB0aGUgdGV4dHVyZSB0eXBlIGJlY2F1c2VcbiAgICAvLyBkZXBlbmRpbmcgb24gdGhlIHRleHR1cmVDb25maWcsIGRpZmZlcmVudCAgdGV4dHVyZSB0eXBlcyBtYXkgcmVzb2x2ZSB0byB0aGVcbiAgICAvLyBzYW1lIGludGVybmFsIGZvcm1hdCAoZS5nLiBpbiBXZWJHTDEsIHRoZSBpbnRlcm5hbCBmb3JtYXQgZm9yXG4gICAgLy8gVU5QQUNLRURfRkxPQVQxNiB0ZXh0dXJlcyBpcyBnbC5SR0JBKS4gVGhlcmVmb3JlIHdlIHBhc3MgaW4gYGlzUGFja2VkYFxuICAgIC8vIGV4cGxpY2l0bHkuXG4gICAgY29uc3QgaW50ZXJuYWxGb3JtYXQgPSBpbnRlcm5hbEZvcm1hdEZvclBoeXNpY2FsVGV4VHlwZShwaHlzaWNhbFRleFR5cGUsIHRleHR1cmVDb25maWcpO1xuICAgIGxldCBudW1FbGVtZW50cztcbiAgICBpZiAoaXNQYWNrZWQpIHtcbiAgICAgICAgY29uc3QgW3BhY2tlZFdpZHRoLCBwYWNrZWRIZWlnaHRdID0gZ2V0UGFja2VkTWF0cml4VGV4dHVyZVNoYXBlV2lkdGhIZWlnaHQoc2hhcGVbMF0sIHNoYXBlWzFdKTtcbiAgICAgICAgbnVtRWxlbWVudHMgPSBwYWNrZWRXaWR0aCAqIHBhY2tlZEhlaWdodDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IGdldFVucGFja2VkTWF0cml4VGV4dHVyZVNoYXBlV2lkdGhIZWlnaHQoc2hhcGVbMF0sIHNoYXBlWzFdKTtcbiAgICAgICAgbnVtRWxlbWVudHMgPSB3aWR0aCAqIGhlaWdodDtcbiAgICB9XG4gICAgY29uc3QgYnl0ZXNQZXJFbGVtZW50ID0gbnVtQnl0ZXNGb3JJbnRlcm5hbEZvcm1hdChnbCwgaW50ZXJuYWxGb3JtYXQpO1xuICAgIHJldHVybiBudW1FbGVtZW50cyAqIGJ5dGVzUGVyRWxlbWVudDtcbn1cbmZ1bmN0aW9uIGludGVybmFsRm9ybWF0Rm9yUGh5c2ljYWxUZXhUeXBlKHBoeXNpY2FsVGV4VHlwZSwgdGV4dHVyZUNvbmZpZykge1xuICAgIHN3aXRjaCAocGh5c2ljYWxUZXhUeXBlKSB7XG4gICAgICAgIGNhc2UgUGh5c2ljYWxUZXh0dXJlVHlwZS5QQUNLRURfMlgyX0ZMT0FUMzI6XG4gICAgICAgICAgICByZXR1cm4gZ2V0SW50ZXJuYWxGb3JtYXRGb3JQYWNrZWRNYXRyaXhUZXh0dXJlKHRleHR1cmVDb25maWcpO1xuICAgICAgICBjYXNlIFBoeXNpY2FsVGV4dHVyZVR5cGUuUEFDS0VEXzJYMl9GTE9BVDE2OlxuICAgICAgICAgICAgcmV0dXJuIGdldEludGVybmFsRm9ybWF0Rm9yRmxvYXQxNlBhY2tlZE1hdHJpeFRleHR1cmUodGV4dHVyZUNvbmZpZyk7XG4gICAgICAgIGNhc2UgUGh5c2ljYWxUZXh0dXJlVHlwZS5VTlBBQ0tFRF9GTE9BVDMyOlxuICAgICAgICAgICAgcmV0dXJuIGdldEludGVybmFsRm9ybWF0Rm9yRmxvYXQzMk1hdHJpeFRleHR1cmUodGV4dHVyZUNvbmZpZyk7XG4gICAgICAgIGNhc2UgUGh5c2ljYWxUZXh0dXJlVHlwZS5VTlBBQ0tFRF9GTE9BVDE2OlxuICAgICAgICAgICAgcmV0dXJuIGdldEludGVybmFsRm9ybWF0Rm9yRmxvYXQxNk1hdHJpeFRleHR1cmUodGV4dHVyZUNvbmZpZyk7XG4gICAgICAgIGNhc2UgUGh5c2ljYWxUZXh0dXJlVHlwZS5QQUNLRURfNFgxX1VOU0lHTkVEX0JZVEU6XG4gICAgICAgICAgICByZXR1cm4gZ2V0SW50ZXJuYWxGb3JtYXRGb3JVbnNpZ25lZEJ5dGVzTWF0cml4VGV4dHVyZSh0ZXh0dXJlQ29uZmlnKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwaHlzaWNhbCB0ZXh0dXJlIHR5cGUgJHtwaHlzaWNhbFRleFR5cGV9YCk7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0UGh5c2ljYWxUZXh0dXJlRm9yUmVuZGVyaW5nKGlzUGFja2VkKSB7XG4gICAgaWYgKGVudigpLmdldEJvb2woJ1dFQkdMX1JFTkRFUl9GTE9BVDMyX0VOQUJMRUQnKSkge1xuICAgICAgICBpZiAoaXNQYWNrZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBQaHlzaWNhbFRleHR1cmVUeXBlLlBBQ0tFRF8yWDJfRkxPQVQzMjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUGh5c2ljYWxUZXh0dXJlVHlwZS5VTlBBQ0tFRF9GTE9BVDMyO1xuICAgIH1cbiAgICBpZiAoaXNQYWNrZWQpIHtcbiAgICAgICAgcmV0dXJuIFBoeXNpY2FsVGV4dHVyZVR5cGUuUEFDS0VEXzJYMl9GTE9BVDE2O1xuICAgIH1cbiAgICByZXR1cm4gUGh5c2ljYWxUZXh0dXJlVHlwZS5VTlBBQ0tFRF9GTE9BVDE2O1xufVxuZnVuY3Rpb24gZ2V0UGh5c2ljYWxGcm9tTG9naWNhbFRleHR1cmVUeXBlKGxvZ2ljYWxUZXhUeXBlLCBpc1BhY2tlZCkge1xuICAgIGlmIChsb2dpY2FsVGV4VHlwZSA9PT0gVGV4dHVyZVVzYWdlLlVQTE9BRCkge1xuICAgICAgICByZXR1cm4gUGh5c2ljYWxUZXh0dXJlVHlwZS5QQUNLRURfMlgyX0ZMT0FUMzI7XG4gICAgfVxuICAgIGVsc2UgaWYgKGxvZ2ljYWxUZXhUeXBlID09PSBUZXh0dXJlVXNhZ2UuUkVOREVSIHx8IGxvZ2ljYWxUZXhUeXBlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGdldFBoeXNpY2FsVGV4dHVyZUZvclJlbmRlcmluZyhpc1BhY2tlZCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGxvZ2ljYWxUZXhUeXBlID09PSBUZXh0dXJlVXNhZ2UuRE9XTkxPQUQgfHxcbiAgICAgICAgbG9naWNhbFRleFR5cGUgPT09IFRleHR1cmVVc2FnZS5QSVhFTFMpIHtcbiAgICAgICAgcmV0dXJuIFBoeXNpY2FsVGV4dHVyZVR5cGUuUEFDS0VEXzRYMV9VTlNJR05FRF9CWVRFO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbG9naWNhbCB0ZXh0dXJlIHR5cGUgJHtsb2dpY2FsVGV4VHlwZX1gKTtcbn1cbmZ1bmN0aW9uIGdldEtleUZyb21UZXh0dXJlU2hhcGUoc2hhcGVSb3dzQ29sLCBwaHlzaWNhbFRleFR5cGUsIGlzUGFja2VkKSB7XG4gICAgcmV0dXJuIGAke3NoYXBlUm93c0NvbFswXX1fJHtzaGFwZVJvd3NDb2xbMV19XyR7cGh5c2ljYWxUZXhUeXBlfV8ke2lzUGFja2VkfWA7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD10ZXh0dXJlX21hbmFnZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZ2V0Q29vcmRzRGF0YVR5cGUgfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5leHBvcnQgY2xhc3MgVGlsZVByb2dyYW0ge1xuICAgIGNvbnN0cnVjdG9yKGFTaGFwZSwgcmVwcykge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgICAgICAgY29uc3Qgb3V0cHV0U2hhcGUgPSBuZXcgQXJyYXkoYVNoYXBlLmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0cHV0U2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIG91dHB1dFNoYXBlW2ldID0gYVNoYXBlW2ldICogcmVwc1tpXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGU7XG4gICAgICAgIHRoaXMucmFuayA9IG91dHB1dFNoYXBlLmxlbmd0aDtcbiAgICAgICAgY29uc3QgZHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZSh0aGlzLnJhbmspO1xuICAgICAgICBjb25zdCBzb3VyY2VDb29yZHMgPSBnZXRTb3VyY2VDb29yZHMoYVNoYXBlKTtcbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgJHtkdHlwZX0gcmVzUkMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgc2V0T3V0cHV0KGdldEEoJHtzb3VyY2VDb29yZHN9KSk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRTb3VyY2VDb29yZHMoYVNoYXBlKSB7XG4gICAgY29uc3QgcmFuayA9IGFTaGFwZS5sZW5ndGg7XG4gICAgaWYgKHJhbmsgPiA1KSB7XG4gICAgICAgIHRocm93IEVycm9yKGBUaWxlIGZvciByYW5rICR7cmFua30gaXMgbm90IHlldCBzdXBwb3J0ZWRgKTtcbiAgICB9XG4gICAgaWYgKHJhbmsgPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGBpbW9kKHJlc1JDLCAke2FTaGFwZVswXX0pYDtcbiAgICB9XG4gICAgY29uc3QgY3VycmVudENvb3JkcyA9IFsncmVzUkMueCcsICdyZXNSQy55JywgJ3Jlc1JDLnonLCAncmVzUkMudycsICdyZXNSQy51J107XG4gICAgY29uc3Qgc291cmNlQ29vcmRzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhU2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc291cmNlQ29vcmRzLnB1c2goYGltb2QoJHtjdXJyZW50Q29vcmRzW2ldfSwgJHthU2hhcGVbaV19KWApO1xuICAgIH1cbiAgICByZXR1cm4gc291cmNlQ29vcmRzLmpvaW4oKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRpbGVfZ3B1LmpzLm1hcCIsIi8vIEJhc2VkIG9uIEFsZ29yaXRobSAyIG9mIEJpdG9uaWMgVG9wIEssIHJlZjpcbi8vIGh0dHBzOi8vYW5pbHNoYW5iaGFnLmluL3N0YXRpYy9wYXBlcnMvZ3B1dG9wa19zaWdtb2QxOC5wZGZcbi8vIFRoZSBvcmlnaW5hbCBhbGdvcml0aG0gaXMgYmFzZWQgb24gY29tcHV0aW5nIHRoZSB0b3AgSyBvbmx5LCBob3dldmVyXG4vLyBzaW5jZSBmb3IgVEZKUyB3ZSByZXF1aXJlIHRoZSBpbmRpY2VzIG9mIHRoZSB0b3AgSyB2YWx1ZXMgYXMgd2VsbCB0aGVuIHRoZVxuLy8gYWxnb3JpdGhtIGZvdW5kIGhlcmUgaXMgYSBiaXQgbW9kaWZpZWQuIFJhdGhlciB0aGFuIHByb2R1Y2luZyB0aGUgdmFsdWVzXG4vLyBhdCBlYWNoIHN0ZXAsIHRoZSBpbmRpY2VzIGNvbnRhaW5pbmcgdGhlIHRvcCBLIGFyZSBnZW5lcmF0ZWQgaW5zdGVhZC5cbi8vIFRoZSBvdXRwdXQgdmFsdWVzIGFyZSBub3QgZ2VuZXJhdGVkIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIG91dHB1dHMgaW4gdGhlXG4vLyBHUFUsIHRoZSB2YWx1ZXMgY2FuIGVhc2lseSBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgaW5kaWNlcyB1c2luZyBhIGdhdGhlclxuLy8gb3AuXG5leHBvcnQgY2xhc3MgU3dhcFByb2dyYW0ge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBzaGFwZSBkZXNpcmVkIG91dHB1dCBzaGFwZSAoY2FuIGJlIGxhcmdlciB0aGFuIGlucHV0IHNoYXBlLCBvdXRwdXRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgcGFkZGVkIHdpdGggLUluZmluaXR5KVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHNoYXBlKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsneCcsICdpbmRpY2VzJ107XG4gICAgICAgIC8vIHxufCBTaXplIG9mIHRoZSBvcmlnaW5hbCBpbnB1dCBvZiBUb3BLLlxuICAgICAgICAvLyB8Zmlyc3RQYXNzfGluZGljYXRlcyBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHN3YXAgaXMgYmVpbmcgdXNlZCB3aGljaFxuICAgICAgICAvLyBtZWFucyBubyBpbmRpY2VzIGlucHV0IGNvbnRhaW5pbmcgdGhlIHRvcCBLIGlzIHByZXNlbnQgeWV0LlxuICAgICAgICAvLyB8aW5jfCBTd2FwcyBwYWlycyBvZiBpbmRpY2VzICgwLCBpbmMpLCAoMSwgaW5jICsgMSksICgyLCBpbmMgKyAyKSAuLi5cbiAgICAgICAgdGhpcy5jdXN0b21Vbmlmb3JtcyA9IFtcbiAgICAgICAgICAgIHsgbmFtZTogJ24nLCB0eXBlOiAnaW50JyB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnZmlyc3RQYXNzJywgdHlwZTogJ2ludCcgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ25lZ2F0aXZlSW5mJywgdHlwZTogJ2Zsb2F0JyB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnZGlyJywgdHlwZTogJ2ludCcgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ2luYycsIHR5cGU6ICdpbnQnIH1cbiAgICAgICAgXTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IHNoYXBlO1xuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgIGl2ZWMyIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgaW50IGJhdGNoID0gY29vcmRzWzBdO1xuICAgICAgICAgaW50IGVsZW1JZHggPSBjb29yZHNbMV07XG5cbiAgICAgICAgIC8vIFdlIGNvbXBhcmUgZWxlbWVudHMgcGFpci13aXNlIHdpdGhpbiBhIGdyb3VwIG9mIHNpemUgMiAqIGluYy5cbiAgICAgICAgIC8vIFRoZSBjb21wYXJpbmcgcnVsZSBmb3IgZWFjaCBncm91cCBhbHRlcm5hdGVzIGJldHdlZW4gYXNjZW5kaW5nXG4gICAgICAgICAvLyBhbmQgZGVzY2VuZGluZy4gV2l0aGluIGVhY2ggZ3JvdXAsIHdlIGNvbXBhcmUgZWFjaCBwYWlyIGF0XG4gICAgICAgICAvLyBwb3NpdGlvbnMgaSBhbmQgaStpbmMuIFRvIGRlY2lkZSB3aGV0aGVyIGFuIGVsZW1lbnQgYXQgcG9zaXRpb24gaVxuICAgICAgICAgLy8gaXMgeDAgb3IgeDEsIHdlIG1vZCBpdCBieSAyICogaW5jLCBpZiB0aGUgcmVzdWx0IGlzIHNtYWxsZXIgdGhhblxuICAgICAgICAgLy8gaW5jLCBpdCBpcyBpbiB0aGUgZmlyc3QgaGFsZiBvZiB0aGUgZ3JvdXAsIHdlIGRlbm90ZSBpdCBhcyB4MCxcbiAgICAgICAgIC8vIG90aGVyd2lzZSB3ZSBkZW5vdGUgaXQgYXMgeDEuXG4gICAgICAgICAvLyBGb3IgZXhhbXBsZSwgYXMgc2hvd24gaW4gdGhlIEJpdG9uaWMgdG9wIEsgcGFwZXIgcmVmZXJlbmNlZCBhYm92ZSxcbiAgICAgICAgIC8vIEZpZ3VyZTUoYSkgc2hvd3MgdGhhdCBlbGVtZW50WzFdIGlzIGluIHRoZVxuICAgICAgICAgLy8gc2Vjb25kIGhhbGYgb2YgdGhlIGdyb3VwIHdoZW4gZ3JvdXAgc2l6ZSBpcyAyLCBidXQgaXQgaXMgaW4gdGhlXG4gICAgICAgICAvLyBmaXJzdCBoYWxmIG9mIHRoZSBncm91cCB3aGVuIGdyb3VwIHNpemUgaXMgNC5cblxuICAgICAgICAgYm9vbCBpc0ZpcnN0SW5QYWlyID0gaW1vZChlbGVtSWR4LCAyICogaW5jKSA8IGluYztcbiAgICAgICAgIGludCBpID0gaXNGaXJzdEluUGFpciA/IGVsZW1JZHggOiBlbGVtSWR4IC0gaW5jO1xuXG4gICAgICAgICBpbnQgaTAgPSBmaXJzdFBhc3MgPT0gMSA/IGkgOiBpbnQoZ2V0SW5kaWNlcyhiYXRjaCwgaSkpO1xuICAgICAgICAgaW50IGkxID0gZmlyc3RQYXNzID09IDEgPyBpICsgaW5jIDogaW50KGdldEluZGljZXMoYmF0Y2gsIGkgKyBpbmMpKTtcbiAgICAgICAgIGZsb2F0IHgwID0gaTAgPCBuID8gZ2V0WChiYXRjaCwgaTApIDogbmVnYXRpdmVJbmY7XG4gICAgICAgICBmbG9hdCB4MSA9IGkxIDwgbiA/IGdldFgoYmF0Y2gsIGkxKSA6IG5lZ2F0aXZlSW5mO1xuXG4gICAgICAgICAvLyBEZW5vdGVzIHdoaWNoIGRpcmVjdGlvbiBpbmRpY2VzIGFyZSBpbiAoYXNjZW5kaW5nIG9yIGRlc2NlbmRpbmcpLlxuICAgICAgICAgYm9vbCByZXZlcnNlID0gaW1vZChlbGVtSWR4LCAyICogZGlyKSA+PSBkaXI7XG4gICAgICAgICBib29sIGlzR3JlYXRlciA9IHgwID4geDEgfHwgKHgwID09IHgxICYmIGkxID4gaTApO1xuICAgICAgICAgaWYgKHJldmVyc2UgPT0gaXNHcmVhdGVyKSB7IC8vIEVsZW1lbnRzIGluIG9wcG9zaXRlIG9yZGVyIG9mIGRpcmVjdGlvblxuICAgICAgICAgICBpbnQgaVRlbXAgPSBpMDtcbiAgICAgICAgICAgaTAgPSBpMTtcbiAgICAgICAgICAgaTEgPSBpVGVtcDtcbiAgICAgICAgIH1cbiAgICAgICAgIGlmIChpc0ZpcnN0SW5QYWlyKSB7XG4gICAgICAgICAgICBzZXRPdXRwdXQoZmxvYXQoaTApKTtcbiAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXRPdXRwdXQoZmxvYXQoaTEpKTtcbiAgICAgICAgIH1cbiAgICAgICB9XG4gICAgIGA7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIE1lcmdlUHJvZ3JhbSB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHNoYXBlIGRlc2lyZWQgb3V0cHV0IHNoYXBlIChtdXN0IGJlIGhhbGYgb2YgdGhlIGlucHV0IHNpemUpXG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioc2hhcGUpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWyd4JywgJ2luZGljZXMnXTtcbiAgICAgICAgLy8gfG58IFNpemUgb2YgdGhlIG9yaWdpbmFsIGlucHV0IG9mIFRvcEtcbiAgICAgICAgLy8gfGZpcnN0UGFzc3wgaW5kaWNhdGVzIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgc3dhcCBpcyBiZWluZyB1c2VkIHdoaWNoXG4gICAgICAgIC8vIG1lYW5zIG5vIGluZGljZXMgaW5wdXQgY29udGFpbmluZyB0aGUgdG9wIEsgaXMgcHJlc2VudCB5ZXQuXG4gICAgICAgIC8vIHxrfCBUb3AgayBlbGVtZW50cyBkZXNpcmVkXG4gICAgICAgIHRoaXMuY3VzdG9tVW5pZm9ybXMgPSBbXG4gICAgICAgICAgICB7IG5hbWU6ICduJywgdHlwZTogJ2ludCcgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ2ZpcnN0UGFzcycsIHR5cGU6ICdpbnQnIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdrJywgdHlwZTogJ2ludCcgfVxuICAgICAgICBdO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gc2hhcGU7XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgLy8gVGFrZXMgbWF4IG9mIGluZGljZXMgKDAsIGspLCAoMSwgayArIDEpLCAoMiwgayArIDIpIC4uLlxuICAgICAgICAgaXZlYzIgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHNbMF07XG4gICAgICAgICBpbnQgZWxlbUlkeCA9IGNvb3Jkc1sxXTtcblxuICAgICAgICAgLy8gVGhlIG91dHB1dCBzaXplIGlzIGhhbGYgb2YgdGhlIHByZXZpb3VzIHNpemUuXG4gICAgICAgICAvLyBJZiB0aGUgcHJldmlvdXMgc2VxdWVuY2UgaXMgfCB8IHwgfCBfIF8gXyBfICB8IHwgfCB8ICBfIF8gXyBfIChrPTQpLFxuICAgICAgICAgLy8gd2Ugb25seSBuZWVkIHRvIG91dHB1dCB0aGUgaW5kaWNlcyBhdCBwb3NpdGlvbnMgfCwgdGhlIGluZGljZXMgYXRcbiAgICAgICAgIC8vIHBvc2l0aW9ucyBfIGNhbiBiZSB0aHJvd24gYXdheSwgc2VlIEZpZ3VyZTUoYikgQWZ0ZXIgUGhhc2UgMlxuICAgICAgICAgLy8gKE1lcmdlIHBoYXNlKSBpbiB0aGUgQml0b25pYyBUb3AgSyBwYXBlciByZWZlcmVuY2VkIGFib3ZlLlxuICAgICAgICAgLy8gRm9yIGV4YW1wbGUsIHRoZSBwYXBlciBzaG93cyB3ZSBvbmx5IG5lZWQgdG8gb3V0cHV0IHRoZSBvcmFuZ2UgYmFycy5cbiAgICAgICAgIC8vIFRoZSBvdXRwdXQgc2VxdWVuY2Ugc2hvdWxkIGxvb2sgbGlrZSB0aGlzIHwgfCB8IHwgfCB8IHwgfC5cbiAgICAgICAgIC8vIEJlY2F1c2UgdGhlIHNlcXVlbmNlIGlzIGhhbHZlZCwgdG8gbWFwIHRoZSBvdXRwdXQgaW5kZXggYmFja1xuICAgICAgICAgLy8gdG8gdGhlIHByZXZpb3VzIHNlcXVlbmNlIHRvIGZpbmQgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUsXG4gICAgICAgICAvLyB3ZSBuZWVkIHRvIGRvdWJsZSB0aGUgaW5kZXguIFdoZW4gd2UgZG91YmxlIHRoZSBpbmRleCxcbiAgICAgICAgIC8vIHdlIGJhc2ljYWxseSBpbnRlcnBvbGF0ZSBhIHBvc2l0aW9uLCBzbyAyaSBsb29rcyBsaWtlXG4gICAgICAgICAvLyB8IF8gfCBfIHwgXyB8IF8gfCBfIHwgXyB8IF8uIFdlIG1vdmUgdGhlIHwgdG8gdGhlIGZpcnN0IGsgcG9zaXRpb25cbiAgICAgICAgIC8vIG9mIGVhY2ggMmsgcG9zaXRpb25zIGJ5IC0gZWxlbUlkeCAlIGsuIEUuZy4gZm9yIG91dHB1dCBhdFxuICAgICAgICAgLy8gaW5kZXggNCw1LDYsNywgd2Ugd2FudCB0byBnZXQgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBhdFxuICAgICAgICAgLy8gb3JpZ2luYWwgaW5kZXggOCw5LDEwLDExLCBmb3Igb3V0cHV0IGF0IGluZGV4IDgsOSwxMCwxMSxcbiAgICAgICAgIC8vIHdlIHdhbnQgdG8gZ2V0IHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgYXQgb3JpZ2luYWwgaW5kZXhcbiAgICAgICAgIC8vIDE2LDE3LDE4LDE5LCBzbyBvbiBhbmQgc28gZm9ydGguXG5cbiAgICAgICAgIGludCBpID0gZWxlbUlkeCA8IGsgPyBlbGVtSWR4IDogKGVsZW1JZHggKiAyIC0gaW1vZChlbGVtSWR4LCBrKSk7XG4gICAgICAgICBpbnQgaTAgPSBmaXJzdFBhc3MgPT0gMSA/IGkgOiBpbnQoZ2V0SW5kaWNlcyhiYXRjaCwgaSkpO1xuICAgICAgICAgaW50IGkxID0gZmlyc3RQYXNzID09IDEgPyBpICsgayA6IGludChnZXRJbmRpY2VzKGJhdGNoLCBpICsgaykpO1xuXG4gICAgICAgICBmbG9hdCB4MCA9IGdldFgoYmF0Y2gsIGkwKTtcbiAgICAgICAgIGZsb2F0IHgxID0gaTEgPCBuID8gZ2V0WChiYXRjaCwgaTEpIDogeDA7XG5cbiAgICAgICAgIHNldE91dHB1dCh4MCA+PSB4MSA/IGZsb2F0KGkwKSA6IGZsb2F0KGkxKSk7XG4gICAgICAgfVxuICAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRvcF9rX2dwdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5leHBvcnQgY2xhc3MgVHJhbnNmb3JtUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIGludGVycG9sYXRpb24sIGZpbGxNb2RlLCBmaWxsVmFsdWUsIG91dFNoYXBlKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsnSW1hZ2UnLCAnVHJhbnNmb3JtcyddO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gb3V0U2hhcGU7XG4gICAgICAgIGNvbnN0IGludGVycG9sYXRpb25Nb2RlSWQgPSBpbnRlcnBvbGF0aW9uID09PSAnbmVhcmVzdCcgPyAxIDogMjtcbiAgICAgICAgbGV0IGZpbGxNb2RlSWQ7XG4gICAgICAgIHN3aXRjaCAoZmlsbE1vZGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2NvbnN0YW50JzpcbiAgICAgICAgICAgICAgICBmaWxsTW9kZUlkID0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3JlZmxlY3QnOlxuICAgICAgICAgICAgICAgIGZpbGxNb2RlSWQgPSAyO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnd3JhcCc6XG4gICAgICAgICAgICAgICAgZmlsbE1vZGVJZCA9IDM7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICduZWFyZXN0JzpcbiAgICAgICAgICAgICAgICBmaWxsTW9kZUlkID0gNDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgZmlsbE1vZGVJZCA9IDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICAgICAgIGZsb2F0IG1hcENvb3JkKGZsb2F0IG91dENvb3JkLCBmbG9hdCBsZW4pIHtcbiAgICAgICAgICAgICAgZmxvYXQgaW5Db29yZCA9IG91dENvb3JkO1xuICAgICAgICAgICAgICBpZigke2ZpbGxNb2RlSWR9ID09IDIpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5Db29yZCA8IDAuMCkge1xuICAgICAgICAgICAgICAgICAgaWYgKGxlbiA8PSAxLjApIHtcbiAgICAgICAgICAgICAgICAgICAgaW5Db29yZCA9IDAuMDtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZsb2F0IHN6MiA9IDIuMCAqIGxlbjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluQ29vcmQgPCBzejIpIHtcbiAgICAgICAgICAgICAgICAgICAgICBpbkNvb3JkID0gc3oyICogZmxvYXQoaW50KGZsb2F0KC1pbkNvb3JkIC8gc3oyKSkpICtcbiAgICAgICAgICAgICAgICAgICAgICBpbkNvb3JkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGluQ29vcmQgPSBpbkNvb3JkIDwgLWxlbiA/IGluQ29vcmQgKyBzejIgOiAtaW5Db29yZCAtIDEuMDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluQ29vcmQgPiBsZW4gLSAxLjApIHtcbiAgICAgICAgICAgICAgICAgIGlmIChsZW4gPD0gMS4wKSB7XG4gICAgICAgICAgICAgICAgICAgIGluQ29vcmQgPSAwLjA7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmbG9hdCBzejIgPSAyLjAgKiBsZW47XG4gICAgICAgICAgICAgICAgICAgIGluQ29vcmQgLT0gc3oyICogZmxvYXQoaW50KGZsb2F0KGluQ29vcmQgLyBzejIpKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbkNvb3JkID49IGxlbikge1xuICAgICAgICAgICAgICAgICAgICAgIGluQ29vcmQgPSBzejIgLSBpbkNvb3JkIC0gMS4wO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjbGFtcChpbkNvb3JkLCAwLjAsIGxlbiAtIDEuMCk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoJHtmaWxsTW9kZUlkfSA9PSAzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGluQ29vcmQgPCAwLjApIHtcbiAgICAgICAgICAgICAgICAgIGlmIChsZW4gPD0gMS4wKSB7XG4gICAgICAgICAgICAgICAgICAgIGluQ29vcmQgPSAwLjA7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmbG9hdCBzeiA9IGxlbiAtIDEuMDtcbiAgICAgICAgICAgICAgICAgICAgaW5Db29yZCArPSBsZW4gKiAoZmxvYXQoaW50KGZsb2F0KC1pbkNvb3JkIC8gc3opKSkgKyAxLjApO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5Db29yZCA+IGxlbiAtIDEuMCkge1xuICAgICAgICAgICAgICAgICAgaWYgKGxlbiA8PSAxLjApIHtcbiAgICAgICAgICAgICAgICAgICAgaW5Db29yZCA9IDAuMDtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZsb2F0IHN6ID0gbGVuIC0gMS4wO1xuICAgICAgICAgICAgICAgICAgICBpbkNvb3JkIC09IGxlbiAqIGZsb2F0KGludChmbG9hdChpbkNvb3JkIC8gc3opKSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjbGFtcChpbkNvb3JkLCAwLjAsIGxlbiAtIDEuMCk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoJHtmaWxsTW9kZUlkfSA9PSA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNsYW1wKG91dENvb3JkLCAwLjAsIGxlbiAtIDEuMCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG91dENvb3JkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZsb2F0IHJlYWRXaXRoRmlsbFZhbHVlKGludCBiYXRjaCwgaW50IGNvb3JkWSwgaW50IGNvb3JkWCxcbiAgICAgICAgICAgICAgaW50IGNoYW5uZWwpIHtcbiAgICAgICAgICAgICAgZmxvYXQgb3V0cHV0VmFsdWU7XG4gICAgICAgICAgICAgIGlmICgwIDw9IGNvb3JkWSAmJiBjb29yZFkgPCAke2ltYWdlSGVpZ2h0fSAmJiAwIDw9IGNvb3JkWCAmJiBjb29yZFggPCAke2ltYWdlV2lkdGh9KSB7XG4gICAgICAgICAgICAgICAgICBvdXRwdXRWYWx1ZSA9IGdldEltYWdlKGJhdGNoLCBjb29yZFksIGNvb3JkWCwgY2hhbm5lbCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0VmFsdWUgPSBmbG9hdCgke2ZpbGxWYWx1ZX0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBvdXRwdXRWYWx1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgICAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgICAgICAgZmxvYXQgb3V0cHV0VmFsdWU7XG4gICAgICAgICAgICAgIGludCBiYXRjaCA9IGNvb3Jkc1swXTtcbiAgICAgICAgICAgICAgaW50IHggPSBjb29yZHNbMl07XG4gICAgICAgICAgICAgIGludCB5ID0gY29vcmRzWzFdO1xuICAgICAgICAgICAgICBpbnQgY2hhbm5lbCA9IGNvb3Jkc1szXTtcbiAgICAgICAgICAgICAgZmxvYXQgeGYgPSBmbG9hdCh4KTtcbiAgICAgICAgICAgICAgZmxvYXQgeWYgPSBmbG9hdCh5KTtcbiAgICAgICAgICAgICAgZmxvYXQgYTEgPSBnZXRUcmFuc2Zvcm1zKGJhdGNoLCAwKTtcbiAgICAgICAgICAgICAgZmxvYXQgYTIgPSBnZXRUcmFuc2Zvcm1zKGJhdGNoLCAxKTtcbiAgICAgICAgICAgICAgZmxvYXQgYTMgPSBnZXRUcmFuc2Zvcm1zKGJhdGNoLCAyKTtcbiAgICAgICAgICAgICAgZmxvYXQgYjEgPSBnZXRUcmFuc2Zvcm1zKGJhdGNoLCAzKTtcbiAgICAgICAgICAgICAgZmxvYXQgYjIgPSBnZXRUcmFuc2Zvcm1zKGJhdGNoLCA0KTtcbiAgICAgICAgICAgICAgZmxvYXQgYjMgPSBnZXRUcmFuc2Zvcm1zKGJhdGNoLCA1KTtcbiAgICAgICAgICAgICAgZmxvYXQgYzEgPSBnZXRUcmFuc2Zvcm1zKGJhdGNoLCA2KTtcbiAgICAgICAgICAgICAgZmxvYXQgYzIgPSBnZXRUcmFuc2Zvcm1zKGJhdGNoLCA3KTtcbiAgICAgICAgICAgICAgZmxvYXQgcHJvamVjdGlvbiA9IGMxICogeGYgKyBjMiAqIHlmICsgMS4wO1xuICAgICAgICAgICAgICBpZiAocHJvamVjdGlvbiA9PSAwLjApIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRWYWx1ZSA9IGZsb2F0KCR7ZmlsbFZhbHVlfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZmxvYXQgaW5YID0gKGExICogeGYgKyBhMiAqIHlmICsgYTMpIC8gcHJvamVjdGlvbjtcbiAgICAgICAgICAgICAgICBmbG9hdCBpblkgPSAoYjEgKiB4ZiArIGIyICogeWYgKyBiMykgLyBwcm9qZWN0aW9uO1xuICAgICAgICAgICAgICAgIGZsb2F0IG1hcFggPSBtYXBDb29yZChpblgsIGZsb2F0KCR7aW1hZ2VXaWR0aH0pKTtcbiAgICAgICAgICAgICAgICBmbG9hdCBtYXBZID0gbWFwQ29vcmQoaW5ZLCBmbG9hdCgke2ltYWdlSGVpZ2h0fSkpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCR7aW50ZXJwb2xhdGlvbk1vZGVJZH0gPT0gMSkge1xuICAgICAgICAgICAgICAgICAgaW50IGNvb3JkWSA9IGludChyb3VuZChtYXBZKSk7XG4gICAgICAgICAgICAgICAgICBpbnQgY29vcmRYID0gaW50KHJvdW5kKG1hcFgpKTtcbiAgICAgICAgICAgICAgICAgIG91dHB1dFZhbHVlID0gcmVhZFdpdGhGaWxsVmFsdWUoYmF0Y2gsIGNvb3JkWSwgY29vcmRYLFxuICAgICAgICAgICAgICAgICAgICBjaGFubmVsKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgZmxvYXQgeUZsb29yID0gZmxvb3IobWFwWSk7XG4gICAgICAgICAgICAgICAgICBmbG9hdCB4Rmxvb3IgPSBmbG9vcihtYXBYKTtcbiAgICAgICAgICAgICAgICAgIGZsb2F0IHlDZWlsID0geUZsb29yICsgMS4wO1xuICAgICAgICAgICAgICAgICAgZmxvYXQgeENlaWwgPSB4Rmxvb3IgKyAxLjA7XG4gICAgICAgICAgICAgICAgICBmbG9hdCB2YWx1ZVlGbG9vciA9ICh4Q2VpbCAtIG1hcFgpICpcbiAgICAgICAgICAgICAgICAgIHJlYWRXaXRoRmlsbFZhbHVlKGJhdGNoLCBpbnQoeUZsb29yKSwgaW50KHhGbG9vciksIGNoYW5uZWwpICtcbiAgICAgICAgICAgICAgICAgIChtYXBYIC0geEZsb29yKSAqXG4gICAgICAgICAgICAgICAgICByZWFkV2l0aEZpbGxWYWx1ZShiYXRjaCwgaW50KHlGbG9vciksIGludCh4Q2VpbCksIGNoYW5uZWwpO1xuICAgICAgICAgICAgICAgICAgZmxvYXQgdmFsdWVZQ2VpbCA9ICh4Q2VpbCAtIG1hcFgpICpcbiAgICAgICAgICAgICAgICAgIHJlYWRXaXRoRmlsbFZhbHVlKGJhdGNoLCBpbnQoeUNlaWwpLCBpbnQoeEZsb29yKSwgY2hhbm5lbCkgK1xuICAgICAgICAgICAgICAgICAgKG1hcFggLSB4Rmxvb3IpICpcbiAgICAgICAgICAgICAgICAgIHJlYWRXaXRoRmlsbFZhbHVlKGJhdGNoLCBpbnQoeUNlaWwpLCBpbnQoeENlaWwpLCBjaGFubmVsKTtcbiAgICAgICAgICAgICAgICAgIG91dHB1dFZhbHVlID0gKHlDZWlsIC0gbWFwWSkgKiB2YWx1ZVlGbG9vciArXG4gICAgICAgICAgICAgICAgICAobWFwWSAtIHlGbG9vcikgKiB2YWx1ZVlDZWlsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzZXRPdXRwdXQob3V0cHV0VmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRyYW5zZm9ybV9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZ2V0Q29vcmRzRGF0YVR5cGUgfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5leHBvcnQgY2xhc3MgVHJhbnNwb3NlUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoYVNoYXBlLCBuZXdEaW0pIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWydBJ107XG4gICAgICAgIGNvbnN0IG91dHB1dFNoYXBlID0gbmV3IEFycmF5KGFTaGFwZS5sZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dHB1dFNoYXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBvdXRwdXRTaGFwZVtpXSA9IGFTaGFwZVtuZXdEaW1baV1dO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICAgICAgdGhpcy5yYW5rID0gb3V0cHV0U2hhcGUubGVuZ3RoO1xuICAgICAgICBjb25zdCBkdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHRoaXMucmFuayk7XG4gICAgICAgIGNvbnN0IHN3aXRjaGVkID0gZ2V0U3dpdGNoZWRDb29yZHMobmV3RGltKTtcbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICB2b2lkIG1haW4oKSB7XG4gICAgICAke2R0eXBlfSByZXNSQyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgc2V0T3V0cHV0KGdldEEoJHtzd2l0Y2hlZH0pKTtcbiAgICB9XG4gICAgYDtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRTd2l0Y2hlZENvb3JkcyhuZXdEaW0pIHtcbiAgICBjb25zdCByYW5rID0gbmV3RGltLmxlbmd0aDtcbiAgICBpZiAocmFuayA+IDYpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoYFRyYW5zcG9zZSBmb3IgcmFuayAke3Jhbmt9IGlzIG5vdCB5ZXQgc3VwcG9ydGVkYCk7XG4gICAgfVxuICAgIGNvbnN0IG9yaWdpbmFsT3JkZXIgPSBbJ3Jlc1JDLngnLCAncmVzUkMueScsICdyZXNSQy56JywgJ3Jlc1JDLncnLCAncmVzUkMudScsICdyZXNSQy52J107XG4gICAgY29uc3Qgc3dpdGNoZWRDb29yZHMgPSBuZXcgQXJyYXkocmFuayk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdEaW0ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc3dpdGNoZWRDb29yZHNbbmV3RGltW2ldXSA9IG9yaWdpbmFsT3JkZXJbaV07XG4gICAgfVxuICAgIHJldHVybiBzd2l0Y2hlZENvb3Jkcy5qb2luKCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD10cmFuc3Bvc2VfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGdldFZlY0NoYW5uZWxzIH0gZnJvbSAnLi9wYWNraW5nX3V0aWwnO1xuaW1wb3J0IHsgZ2V0Q29vcmRzRGF0YVR5cGUgfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5leHBvcnQgY2xhc3MgVHJhbnNwb3NlUGFja2VkUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoYVNoYXBlLCBuZXdEaW0pIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWydBJ107XG4gICAgICAgIHRoaXMucGFja2VkSW5wdXRzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wYWNrZWRPdXRwdXQgPSB0cnVlO1xuICAgICAgICBjb25zdCBvdXRwdXRTaGFwZSA9IG5ldyBBcnJheShhU2hhcGUubGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRwdXRTaGFwZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgb3V0cHV0U2hhcGVbaV0gPSBhU2hhcGVbbmV3RGltW2ldXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGU7XG4gICAgICAgIHRoaXMucmFuayA9IG91dHB1dFNoYXBlLmxlbmd0aDtcbiAgICAgICAgaWYgKHRoaXMucmFuayA+IDYpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKGBQYWNrZWQgdHJhbnNwb3NlIGZvciByYW5rICR7dGhpcy5yYW5rfSBpcyBub3QgeWV0IHN1cHBvcnRlZC5gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHRoaXMucmFuayk7XG4gICAgICAgIGNvbnN0IG91dHB1dE9yZGVyID0gZ2V0VmVjQ2hhbm5lbHMoJ3JjJywgdGhpcy5yYW5rKTtcbiAgICAgICAgY29uc3Qgc3dpdGNoZWRPcmRlciA9IG5ldyBBcnJheSh0aGlzLnJhbmspO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld0RpbS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgc3dpdGNoZWRPcmRlcltuZXdEaW1baV1dID0gb3V0cHV0T3JkZXJbaV07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5uZXJEaW1zID0gYHZlYzIoJHtzd2l0Y2hlZE9yZGVyLnNsaWNlKC0yKS5qb2luKCl9KWA7XG4gICAgICAgIGNvbnN0IG5leHRDb2x1bW4gPSBgKyske291dHB1dE9yZGVyW3RoaXMucmFuayAtIDFdfSA8ICR7b3V0cHV0U2hhcGVbdGhpcy5yYW5rIC0gMV19YDtcbiAgICAgICAgY29uc3QgZ2V0YyA9IGBnZXRDaGFubmVsKGdldEEoJHtzd2l0Y2hlZE9yZGVyLmpvaW4oKX0pLCAke2lubmVyRGltc30pYDtcbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICB2b2lkIG1haW4oKSB7XG4gICAgICAke2R0eXBlfSByYyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgdmVjNCByZXN1bHQgPSB2ZWM0KDAuKTtcbiAgICAgIHJlc3VsdFswXSA9ICR7Z2V0Y307XG4gICAgICBpZigke25leHRDb2x1bW59KSB7XG4gICAgICAgIHJlc3VsdFsxXSA9ICR7Z2V0Y307XG4gICAgICB9XG4gICAgICAtLSR7b3V0cHV0T3JkZXJbdGhpcy5yYW5rIC0gMV19O1xuICAgICAgaWYoKyske291dHB1dE9yZGVyW3RoaXMucmFuayAtIDJdfSA8ICR7b3V0cHV0U2hhcGVbdGhpcy5yYW5rIC0gMl19KSB7XG4gICAgICAgIHJlc3VsdFsyXSA9ICR7Z2V0Y307XG4gICAgICAgIGlmKCR7bmV4dENvbHVtbn0pIHtcbiAgICAgICAgICByZXN1bHRbM10gPSAke2dldGN9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzZXRPdXRwdXQocmVzdWx0KTtcbiAgICB9XG4gICAgYDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD10cmFuc3Bvc2VfcGFja2VkX2dwdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyB1c2VTaGFwZVVuaWZvcm1zIH0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmV4cG9ydCBjbGFzcyBVbmFyeU9wUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoYVNoYXBlLCBvcFNuaXBwZXQpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWydBJ107XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBhU2hhcGU7XG4gICAgICAgIHRoaXMuZW5hYmxlU2hhcGVVbmlmb3JtcyA9IHVzZVNoYXBlVW5pZm9ybXModGhpcy5vdXRwdXRTaGFwZS5sZW5ndGgpO1xuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgZmxvYXQgdW5hcnlPcGVyYXRpb24oZmxvYXQgeCkge1xuICAgICAgICAke29wU25pcHBldH1cbiAgICAgIH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBmbG9hdCB4ID0gZ2V0QUF0T3V0Q29vcmRzKCk7XG4gICAgICAgIGZsb2F0IHkgPSB1bmFyeU9wZXJhdGlvbih4KTtcblxuICAgICAgICBzZXRPdXRwdXQoeSk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgQ0hFQ0tfTkFOX1NOSVBQRVQgPSBgaWYgKGlzbmFuKHgpKSByZXR1cm4geDtgO1xuZXhwb3J0IGNvbnN0IExJTkVBUiA9IGByZXR1cm4geDtgO1xuZXhwb3J0IGNvbnN0IEFCUyA9IGByZXR1cm4gYWJzKHgpO2A7XG5leHBvcnQgZnVuY3Rpb24gU1RFUChhbHBoYSA9IDAuMCkge1xuICAgIHJldHVybiBDSEVDS19OQU5fU05JUFBFVCArIGBcbiAgICByZXR1cm4geCA+IDAuMCA/IDEuMCA6IGZsb2F0KCR7YWxwaGF9KTtcbiAgYDtcbn1cbmV4cG9ydCBjb25zdCBFTFUgPSBgcmV0dXJuICh4ID49IDAuMCkgPyB4IDogKGV4cCh4KSAtIDEuMCk7YDtcbmV4cG9ydCBjb25zdCBSRUxVID0gQ0hFQ0tfTkFOX1NOSVBQRVQgKyBgXG4gIHJldHVybiAoeCA8IDAuMCkgPyAwLjAgOiB4O1xuYDtcbmV4cG9ydCBjb25zdCBSRUxVNiA9IENIRUNLX05BTl9TTklQUEVUICsgYFxuICByZXR1cm4gKHggPCAwLjApID8gMC4wIDogbWluKDYuMCwgeCk7XG5gO1xuZXhwb3J0IGNvbnN0IENMT05FID0gJ3JldHVybiB4Oyc7XG5leHBvcnQgY29uc3QgU0lHTU9JRCA9IGByZXR1cm4gMS4wIC8gKDEuMCArIGV4cCgtMS4wICogeCkpO2A7XG4vLyMgc291cmNlTWFwcGluZ1VSTD11bmFyeW9wX2dwdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyB1c2VTaGFwZVVuaWZvcm1zIH0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmV4cG9ydCBjb25zdCBMSU5FQVIgPSBgcmV0dXJuIHg7YDtcbmV4cG9ydCBjb25zdCBFTFUgPSBgXG4gIHZlYzQgcmVzdWx0O1xuXG4gIHJlc3VsdC5yID0gKHguciA+PSAwLjApID8geC5yIDogKGV4cCh4LnIpIC0gMS4wKTtcbiAgcmVzdWx0LmcgPSAoeC5nID49IDAuMCkgPyB4LmcgOiAoZXhwKHguZykgLSAxLjApO1xuICByZXN1bHQuYiA9ICh4LmIgPj0gMC4wKSA/IHguYiA6IChleHAoeC5iKSAtIDEuMCk7XG4gIHJlc3VsdC5hID0gKHguYSA+PSAwLjApID8geC5hIDogKGV4cCh4LmEpIC0gMS4wKTtcblxuICByZXR1cm4gcmVzdWx0O1xuYDtcbmV4cG9ydCBjb25zdCBSRUxVID0gYFxuICB2ZWM0IHJlc3VsdCA9IHggKiB2ZWM0KGdyZWF0ZXJUaGFuRXF1YWwoeCwgdmVjNCgwLjApKSk7XG4gIGJ2ZWM0IGlzTmFOID0gaXNuYW4oeCk7XG5cbiAgcmVzdWx0LnIgPSBpc05hTi5yID8geC5yIDogcmVzdWx0LnI7XG4gIHJlc3VsdC5nID0gaXNOYU4uZyA/IHguZyA6IHJlc3VsdC5nO1xuICByZXN1bHQuYiA9IGlzTmFOLmIgPyB4LmIgOiByZXN1bHQuYjtcbiAgcmVzdWx0LmEgPSBpc05hTi5hID8geC5hIDogcmVzdWx0LmE7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbmA7XG5leHBvcnQgY29uc3QgUkVMVTYgPSBgXG4gIHZlYzQgcmVzdWx0ID0gbWluKHgsIHZlYzQoNi4pKSAqIHZlYzQoZ3JlYXRlclRoYW5FcXVhbCh4LCB2ZWM0KDAuMCkpKTtcbiAgYnZlYzQgaXNOYU4gPSBpc25hbih4KTtcblxuICByZXN1bHQuciA9IGlzTmFOLnIgPyB4LnIgOiByZXN1bHQucjtcbiAgcmVzdWx0LmcgPSBpc05hTi5nID8geC5nIDogcmVzdWx0Lmc7XG4gIHJlc3VsdC5iID0gaXNOYU4uYiA/IHguYiA6IHJlc3VsdC5iO1xuICByZXN1bHQuYSA9IGlzTmFOLmEgPyB4LmEgOiByZXN1bHQuYTtcblxuICByZXR1cm4gcmVzdWx0O1xuYDtcbmV4cG9ydCBjb25zdCBTSUdNT0lEID0gYHJldHVybiAxLjAgLyAoMS4wICsgZXhwKC0xLjAgKiB4KSk7YDtcbmV4cG9ydCBjbGFzcyBVbmFyeU9wUGFja2VkUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoYVNoYXBlLCBvcFNuaXBwZXQpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWydBJ107XG4gICAgICAgIHRoaXMucGFja2VkSW5wdXRzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wYWNrZWRPdXRwdXQgPSB0cnVlO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gYVNoYXBlO1xuICAgICAgICB0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMgPSB1c2VTaGFwZVVuaWZvcm1zKHRoaXMub3V0cHV0U2hhcGUubGVuZ3RoKTtcbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZlYzQgdW5hcnlPcGVyYXRpb24odmVjNCB4KSB7XG4gICAgICAgICR7b3BTbmlwcGV0fVxuICAgICAgfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIHZlYzQgeCA9IGdldEFBdE91dENvb3JkcygpO1xuICAgICAgICB2ZWM0IHkgPSB1bmFyeU9wZXJhdGlvbih4KTtcblxuICAgICAgICBzZXRPdXRwdXQoeSk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11bmFyeW9wX3BhY2tlZF9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZ2V0Q2hhbm5lbHMsIGdldFNvdXJjZUNvb3JkcyB9IGZyb20gJy4vcGFja2luZ191dGlsJztcbmltcG9ydCB7IGdldENvb3Jkc0RhdGFUeXBlIH0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuZXhwb3J0IGNsYXNzIFVucGFja1Byb2dyYW0ge1xuICAgIGNvbnN0cnVjdG9yKG91dHB1dFNoYXBlKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICAgICAgICB0aGlzLnBhY2tlZElucHV0cyA9IHRydWU7XG4gICAgICAgIHRoaXMucGFja2VkT3V0cHV0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICAgICAgY29uc3QgcmFuayA9IG91dHB1dFNoYXBlLmxlbmd0aDtcbiAgICAgICAgY29uc3QgY2hhbm5lbHMgPSBnZXRDaGFubmVscygncmMnLCByYW5rKTtcbiAgICAgICAgY29uc3QgZHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShyYW5rKTtcbiAgICAgICAgY29uc3Qgc291cmNlQ29vcmRzID0gZ2V0U291cmNlQ29vcmRzKHJhbmssIGNoYW5uZWxzKTtcbiAgICAgICAgY29uc3QgaW5uZXJEaW1zID0gY2hhbm5lbHMuc2xpY2UoLTIpO1xuICAgICAgICBjb25zdCBjb29yZHMgPSByYW5rIDw9IDEgPyAncmMnIDogYHZlYzIoJHtpbm5lckRpbXMuam9pbignLCcpfSlgO1xuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke2R0eXBlfSByYyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICB2ZWM0IHBhY2tlZElucHV0ID0gZ2V0QSgke3NvdXJjZUNvb3Jkc30pO1xuXG4gICAgICAgIHNldE91dHB1dChnZXRDaGFubmVsKHBhY2tlZElucHV0LCAke2Nvb3Jkc30pKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVucGFja19ncHUuanMubWFwIiwiLyoqIEBsaWNlbnNlIFNlZSB0aGUgTElDRU5TRSBmaWxlLiAqL1xuLy8gVGhpcyBjb2RlIGlzIGF1dG8tZ2VuZXJhdGVkLCBkbyBub3QgbW9kaWZ5IHRoaXMgZmlsZSFcbmNvbnN0IHZlcnNpb24gPSAnMy44LjAnO1xuZXhwb3J0IHsgdmVyc2lvbiB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dmVyc2lvbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBlbnYgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0ICogYXMgZ3BncHVfdXRpbCBmcm9tICcuL2dwZ3B1X3V0aWwnO1xuaW1wb3J0ICogYXMgd2ViZ2xfdXRpbCBmcm9tICcuL3dlYmdsX3V0aWwnO1xuZXhwb3J0IHsgTWF0aEJhY2tlbmRXZWJHTCB9IGZyb20gJy4vYmFja2VuZF93ZWJnbCc7XG5leHBvcnQgeyBzZXRXZWJHTENvbnRleHQgfSBmcm9tICcuL2NhbnZhc191dGlsJztcbmV4cG9ydCB7IEdQR1BVQ29udGV4dCB9IGZyb20gJy4vZ3BncHVfY29udGV4dCc7XG4vLyBXZWJHTCBzcGVjaWZpYyB1dGlscy5cbmV4cG9ydCB7IGdwZ3B1X3V0aWwsIHdlYmdsX3V0aWwgfTtcbi8qKlxuICogRW5mb3JjZSB1c2Ugb2YgaGFsZiBwcmVjaXNpb24gdGV4dHVyZXMgaWYgYXZhaWxhYmxlIG9uIHRoZSBwbGF0Zm9ybS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnRW52aXJvbm1lbnQnLCBuYW1lc3BhY2U6ICd3ZWJnbCd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JjZUhhbGZGbG9hdCgpIHtcbiAgICBlbnYoKS5zZXQoJ1dFQkdMX0ZPUkNFX0YxNl9URVhUVVJFUycsIHRydWUpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d2ViZ2wuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZW52LCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGdldFdlYkdMQ29udGV4dCB9IGZyb20gJy4vY2FudmFzX3V0aWwnO1xuaW1wb3J0IHsgZ2V0VGV4dHVyZUNvbmZpZyB9IGZyb20gJy4vdGV4X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGxBbmRDaGVjayhnbCwgZnVuYykge1xuICAgIGNvbnN0IHJldHVyblZhbHVlID0gZnVuYygpO1xuICAgIGlmIChlbnYoKS5nZXRCb29sKCdERUJVRycpKSB7XG4gICAgICAgIGNoZWNrV2ViR0xFcnJvcihnbCk7XG4gICAgfVxuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbn1cbmZ1bmN0aW9uIGNoZWNrV2ViR0xFcnJvcihnbCkge1xuICAgIGNvbnN0IGVycm9yID0gZ2wuZ2V0RXJyb3IoKTtcbiAgICBpZiAoZXJyb3IgIT09IGdsLk5PX0VSUk9SKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignV2ViR0wgRXJyb3I6ICcgKyBnZXRXZWJHTEVycm9yTWVzc2FnZShnbCwgZXJyb3IpKTtcbiAgICB9XG59XG4vLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IYWxmLXByZWNpc2lvbl9mbG9hdGluZy1wb2ludF9mb3JtYXRcbmNvbnN0IE1JTl9GTE9BVDE2ID0gNS45NmUtODtcbmNvbnN0IE1BWF9GTE9BVDE2ID0gNjU1MDQ7XG5leHBvcnQgZnVuY3Rpb24gY2FuQmVSZXByZXNlbnRlZChudW0pIHtcbiAgICBpZiAoZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUkVOREVSX0ZMT0FUMzJfRU5BQkxFRCcpIHx8IG51bSA9PT0gMCB8fFxuICAgICAgICAoTUlOX0ZMT0FUMTYgPCBNYXRoLmFicyhudW0pICYmIE1hdGguYWJzKG51bSkgPCBNQVhfRkxPQVQxNikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRXZWJHTEVycm9yTWVzc2FnZShnbCwgc3RhdHVzKSB7XG4gICAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICAgICAgY2FzZSBnbC5OT19FUlJPUjpcbiAgICAgICAgICAgIHJldHVybiAnTk9fRVJST1InO1xuICAgICAgICBjYXNlIGdsLklOVkFMSURfRU5VTTpcbiAgICAgICAgICAgIHJldHVybiAnSU5WQUxJRF9FTlVNJztcbiAgICAgICAgY2FzZSBnbC5JTlZBTElEX1ZBTFVFOlxuICAgICAgICAgICAgcmV0dXJuICdJTlZBTElEX1ZBTFVFJztcbiAgICAgICAgY2FzZSBnbC5JTlZBTElEX09QRVJBVElPTjpcbiAgICAgICAgICAgIHJldHVybiAnSU5WQUxJRF9PUEVSQVRJT04nO1xuICAgICAgICBjYXNlIGdsLklOVkFMSURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OOlxuICAgICAgICAgICAgcmV0dXJuICdJTlZBTElEX0ZSQU1FQlVGRkVSX09QRVJBVElPTic7XG4gICAgICAgIGNhc2UgZ2wuT1VUX09GX01FTU9SWTpcbiAgICAgICAgICAgIHJldHVybiAnT1VUX09GX01FTU9SWSc7XG4gICAgICAgIGNhc2UgZ2wuQ09OVEVYVF9MT1NUX1dFQkdMOlxuICAgICAgICAgICAgcmV0dXJuICdDT05URVhUX0xPU1RfV0VCR0wnO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGBVbmtub3duIGVycm9yIGNvZGUgJHtzdGF0dXN9YDtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uT3JUaHJvdyhnbCwgZXh0ZW5zaW9uTmFtZSkge1xuICAgIHJldHVybiB0aHJvd0lmTnVsbChnbCwgKCkgPT4gZ2wuZ2V0RXh0ZW5zaW9uKGV4dGVuc2lvbk5hbWUpLCAnRXh0ZW5zaW9uIFwiJyArIGV4dGVuc2lvbk5hbWUgKyAnXCIgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGJyb3dzZXIuJyk7XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVmVydGV4U2hhZGVyKGdsLCB2ZXJ0ZXhTaGFkZXJTb3VyY2UpIHtcbiAgICBjb25zdCB2ZXJ0ZXhTaGFkZXIgPSB0aHJvd0lmTnVsbChnbCwgKCkgPT4gZ2wuY3JlYXRlU2hhZGVyKGdsLlZFUlRFWF9TSEFERVIpLCAnVW5hYmxlIHRvIGNyZWF0ZSB2ZXJ0ZXggV2ViR0xTaGFkZXIuJyk7XG4gICAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5zaGFkZXJTb3VyY2UodmVydGV4U2hhZGVyLCB2ZXJ0ZXhTaGFkZXJTb3VyY2UpKTtcbiAgICBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmNvbXBpbGVTaGFkZXIodmVydGV4U2hhZGVyKSk7XG4gICAgaWYgKGdsLmdldFNoYWRlclBhcmFtZXRlcih2ZXJ0ZXhTaGFkZXIsIGdsLkNPTVBJTEVfU1RBVFVTKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgY29uc29sZS5sb2coZ2wuZ2V0U2hhZGVySW5mb0xvZyh2ZXJ0ZXhTaGFkZXIpKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gY29tcGlsZSB2ZXJ0ZXggc2hhZGVyLicpO1xuICAgIH1cbiAgICByZXR1cm4gdmVydGV4U2hhZGVyO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZyYWdtZW50U2hhZGVyKGdsLCBmcmFnbWVudFNoYWRlclNvdXJjZSkge1xuICAgIGNvbnN0IGZyYWdtZW50U2hhZGVyID0gdGhyb3dJZk51bGwoZ2wsICgpID0+IGdsLmNyZWF0ZVNoYWRlcihnbC5GUkFHTUVOVF9TSEFERVIpLCAnVW5hYmxlIHRvIGNyZWF0ZSBmcmFnbWVudCBXZWJHTFNoYWRlci4nKTtcbiAgICBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLnNoYWRlclNvdXJjZShmcmFnbWVudFNoYWRlciwgZnJhZ21lbnRTaGFkZXJTb3VyY2UpKTtcbiAgICBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmNvbXBpbGVTaGFkZXIoZnJhZ21lbnRTaGFkZXIpKTtcbiAgICBpZiAoZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKGZyYWdtZW50U2hhZGVyLCBnbC5DT01QSUxFX1NUQVRVUykgPT09IGZhbHNlKSB7XG4gICAgICAgIGxvZ1NoYWRlclNvdXJjZUFuZEluZm9Mb2coZnJhZ21lbnRTaGFkZXJTb3VyY2UsIGdsLmdldFNoYWRlckluZm9Mb2coZnJhZ21lbnRTaGFkZXIpKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gY29tcGlsZSBmcmFnbWVudCBzaGFkZXIuJyk7XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudFNoYWRlcjtcbn1cbmNvbnN0IGxpbmVOdW1iZXJSZWdleCA9IC9FUlJPUjogWzAtOV0rOihbMC05XSspOi9nO1xuZnVuY3Rpb24gbG9nU2hhZGVyU291cmNlQW5kSW5mb0xvZyhzaGFkZXJTb3VyY2UsIHNoYWRlckluZm9Mb2cpIHtcbiAgICBjb25zdCBsaW5lTnVtYmVyUmVnZXhSZXN1bHQgPSBsaW5lTnVtYmVyUmVnZXguZXhlYyhzaGFkZXJJbmZvTG9nKTtcbiAgICBpZiAobGluZU51bWJlclJlZ2V4UmVzdWx0ID09IG51bGwpIHtcbiAgICAgICAgY29uc29sZS5sb2coYENvdWxkbid0IHBhcnNlIGxpbmUgbnVtYmVyIGluIGVycm9yOiAke3NoYWRlckluZm9Mb2d9YCk7XG4gICAgICAgIGNvbnNvbGUubG9nKHNoYWRlclNvdXJjZSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbGluZU51bWJlciA9ICtsaW5lTnVtYmVyUmVnZXhSZXN1bHRbMV07XG4gICAgY29uc3Qgc2hhZGVyTGluZXMgPSBzaGFkZXJTb3VyY2Uuc3BsaXQoJ1xcbicpO1xuICAgIGNvbnN0IHBhZCA9IHNoYWRlckxpbmVzLmxlbmd0aC50b1N0cmluZygpLmxlbmd0aCArIDI7XG4gICAgY29uc3QgbGluZXNXaXRoTGluZU51bWJlcnMgPSBzaGFkZXJMaW5lcy5tYXAoKGxpbmUsIGxpbmVOdW1iZXIpID0+IHV0aWwucmlnaHRQYWQoKGxpbmVOdW1iZXIgKyAxKS50b1N0cmluZygpLCBwYWQpICsgbGluZSk7XG4gICAgbGV0IG1heExpbmVMZW5ndGggPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXNXaXRoTGluZU51bWJlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbWF4TGluZUxlbmd0aCA9IE1hdGgubWF4KGxpbmVzV2l0aExpbmVOdW1iZXJzW2ldLmxlbmd0aCwgbWF4TGluZUxlbmd0aCk7XG4gICAgfVxuICAgIGNvbnN0IGJlZm9yZUVycm9yTGluZXMgPSBsaW5lc1dpdGhMaW5lTnVtYmVycy5zbGljZSgwLCBsaW5lTnVtYmVyIC0gMSk7XG4gICAgY29uc3QgZXJyb3JMaW5lID0gbGluZXNXaXRoTGluZU51bWJlcnMuc2xpY2UobGluZU51bWJlciAtIDEsIGxpbmVOdW1iZXIpO1xuICAgIGNvbnN0IGFmdGVyRXJyb3JMaW5lcyA9IGxpbmVzV2l0aExpbmVOdW1iZXJzLnNsaWNlKGxpbmVOdW1iZXIpO1xuICAgIGNvbnNvbGUubG9nKGJlZm9yZUVycm9yTGluZXMuam9pbignXFxuJykpO1xuICAgIGNvbnNvbGUubG9nKHNoYWRlckluZm9Mb2cuc3BsaXQoJ1xcbicpWzBdKTtcbiAgICBjb25zb2xlLmxvZyhgJWMgJHt1dGlsLnJpZ2h0UGFkKGVycm9yTGluZVswXSwgbWF4TGluZUxlbmd0aCl9YCwgJ2JvcmRlcjoxcHggc29saWQgcmVkOyBiYWNrZ3JvdW5kLWNvbG9yOiNlM2QyZDI7IGNvbG9yOiNhNjE3MTcnKTtcbiAgICBjb25zb2xlLmxvZyhhZnRlckVycm9yTGluZXMuam9pbignXFxuJykpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVByb2dyYW0oZ2wpIHtcbiAgICByZXR1cm4gdGhyb3dJZk51bGwoZ2wsICgpID0+IGdsLmNyZWF0ZVByb2dyYW0oKSwgJ1VuYWJsZSB0byBjcmVhdGUgV2ViR0xQcm9ncmFtLicpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGxpbmtQcm9ncmFtKGdsLCBwcm9ncmFtKSB7XG4gICAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5saW5rUHJvZ3JhbShwcm9ncmFtKSk7XG4gICAgaWYgKGdsLmdldFByb2dyYW1QYXJhbWV0ZXIocHJvZ3JhbSwgZ2wuTElOS19TVEFUVVMpID09PSBmYWxzZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhnbC5nZXRQcm9ncmFtSW5mb0xvZyhwcm9ncmFtKSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGxpbmsgdmVydGV4IGFuZCBmcmFnbWVudCBzaGFkZXJzLicpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVByb2dyYW0oZ2wsIHByb2dyYW0pIHtcbiAgICBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLnZhbGlkYXRlUHJvZ3JhbShwcm9ncmFtKSk7XG4gICAgaWYgKGdsLmdldFByb2dyYW1QYXJhbWV0ZXIocHJvZ3JhbSwgZ2wuVkFMSURBVEVfU1RBVFVTKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgY29uc29sZS5sb2coZ2wuZ2V0UHJvZ3JhbUluZm9Mb2cocHJvZ3JhbSkpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NoYWRlciBwcm9ncmFtIHZhbGlkYXRpb24gZmFpbGVkLicpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTdGF0aWNWZXJ0ZXhCdWZmZXIoZ2wsIGRhdGEpIHtcbiAgICBjb25zdCBidWZmZXIgPSB0aHJvd0lmTnVsbChnbCwgKCkgPT4gZ2wuY3JlYXRlQnVmZmVyKCksICdVbmFibGUgdG8gY3JlYXRlIFdlYkdMQnVmZmVyJyk7XG4gICAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgYnVmZmVyKSk7XG4gICAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgZGF0YSwgZ2wuU1RBVElDX0RSQVcpKTtcbiAgICByZXR1cm4gYnVmZmVyO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0YXRpY0luZGV4QnVmZmVyKGdsLCBkYXRhKSB7XG4gICAgY29uc3QgYnVmZmVyID0gdGhyb3dJZk51bGwoZ2wsICgpID0+IGdsLmNyZWF0ZUJ1ZmZlcigpLCAnVW5hYmxlIHRvIGNyZWF0ZSBXZWJHTEJ1ZmZlcicpO1xuICAgIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuYmluZEJ1ZmZlcihnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgYnVmZmVyKSk7XG4gICAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5idWZmZXJEYXRhKGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBkYXRhLCBnbC5TVEFUSUNfRFJBVykpO1xuICAgIHJldHVybiBidWZmZXI7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0TnVtQ2hhbm5lbHMoKSB7XG4gICAgaWYgKGVudigpLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpID09PSAyKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICByZXR1cm4gNDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUZXh0dXJlKGdsKSB7XG4gICAgcmV0dXJuIHRocm93SWZOdWxsKGdsLCAoKSA9PiBnbC5jcmVhdGVUZXh0dXJlKCksICdVbmFibGUgdG8gY3JlYXRlIFdlYkdMVGV4dHVyZS4nKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVRleHR1cmVTaXplKHdpZHRoLCBoZWlnaHQpIHtcbiAgICBjb25zdCBtYXhUZXh0dXJlU2l6ZSA9IGVudigpLmdldE51bWJlcignV0VCR0xfTUFYX1RFWFRVUkVfU0laRScpO1xuICAgIGlmICgod2lkdGggPD0gMCkgfHwgKGhlaWdodCA8PSAwKSkge1xuICAgICAgICBjb25zdCByZXF1ZXN0ZWQgPSBgWyR7d2lkdGh9eCR7aGVpZ2h0fV1gO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVlc3RlZCB0ZXh0dXJlIHNpemUgJyArIHJlcXVlc3RlZCArICcgaXMgaW52YWxpZC4nKTtcbiAgICB9XG4gICAgaWYgKCh3aWR0aCA+IG1heFRleHR1cmVTaXplKSB8fCAoaGVpZ2h0ID4gbWF4VGV4dHVyZVNpemUpKSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RlZCA9IGBbJHt3aWR0aH14JHtoZWlnaHR9XWA7XG4gICAgICAgIGNvbnN0IG1heCA9IGBbJHttYXhUZXh0dXJlU2l6ZX14JHttYXhUZXh0dXJlU2l6ZX1dYDtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1ZXN0ZWQgdGV4dHVyZSBzaXplICcgKyByZXF1ZXN0ZWQgK1xuICAgICAgICAgICAgJyBncmVhdGVyIHRoYW4gV2ViR0wgbWF4aW11bSBvbiB0aGlzIGJyb3dzZXIgLyBHUFUgJyArIG1heCArICcuJyk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZyYW1lYnVmZmVyKGdsKSB7XG4gICAgcmV0dXJuIHRocm93SWZOdWxsKGdsLCAoKSA9PiBnbC5jcmVhdGVGcmFtZWJ1ZmZlcigpLCAnVW5hYmxlIHRvIGNyZWF0ZSBXZWJHTEZyYW1lYnVmZmVyLicpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGJpbmRWZXJ0ZXhCdWZmZXJUb1Byb2dyYW1BdHRyaWJ1dGUoZ2wsIHByb2dyYW0sIGF0dHJpYnV0ZSwgYnVmZmVyLCBhcnJheUVudHJpZXNQZXJJdGVtLCBpdGVtU3RyaWRlSW5CeXRlcywgaXRlbU9mZnNldEluQnl0ZXMpIHtcbiAgICBjb25zdCBsb2MgPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCBhdHRyaWJ1dGUpO1xuICAgIGlmIChsb2MgPT09IC0xKSB7XG4gICAgICAgIC8vIFRoZSBHUFUgY29tcGlsZXIgZGVjaWRlZCB0byBzdHJpcCBvdXQgdGhpcyBhdHRyaWJ1dGUgYmVjYXVzZSBpdCdzIHVudXNlZCxcbiAgICAgICAgLy8gdGh1cyBubyBuZWVkIHRvIGJpbmQuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgYnVmZmVyKSk7XG4gICAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGxvYywgYXJyYXlFbnRyaWVzUGVySXRlbSwgZ2wuRkxPQVQsIGZhbHNlLCBpdGVtU3RyaWRlSW5CeXRlcywgaXRlbU9mZnNldEluQnl0ZXMpKTtcbiAgICBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGxvYykpO1xuICAgIHJldHVybiB0cnVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGJpbmRUZXh0dXJlVW5pdChnbCwgdGV4dHVyZSwgdGV4dHVyZVVuaXQpIHtcbiAgICB2YWxpZGF0ZVRleHR1cmVVbml0KGdsLCB0ZXh0dXJlVW5pdCk7XG4gICAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUwICsgdGV4dHVyZVVuaXQpKTtcbiAgICBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRleHR1cmUpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB1bmJpbmRUZXh0dXJlVW5pdChnbCwgdGV4dHVyZVVuaXQpIHtcbiAgICB2YWxpZGF0ZVRleHR1cmVVbml0KGdsLCB0ZXh0dXJlVW5pdCk7XG4gICAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUwICsgdGV4dHVyZVVuaXQpKTtcbiAgICBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIG51bGwpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcm9ncmFtVW5pZm9ybUxvY2F0aW9uT3JUaHJvdyhnbCwgcHJvZ3JhbSwgdW5pZm9ybU5hbWUpIHtcbiAgICByZXR1cm4gdGhyb3dJZk51bGwoZ2wsICgpID0+IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCB1bmlmb3JtTmFtZSksICd1bmlmb3JtIFwiJyArIHVuaWZvcm1OYW1lICsgJ1wiIG5vdCBwcmVzZW50IGluIHByb2dyYW0uJyk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvZ3JhbVVuaWZvcm1Mb2NhdGlvbihnbCwgcHJvZ3JhbSwgdW5pZm9ybU5hbWUpIHtcbiAgICByZXR1cm4gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sIHVuaWZvcm1OYW1lKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBiaW5kVGV4dHVyZVRvUHJvZ3JhbVVuaWZvcm1TYW1wbGVyKGdsLCB0ZXh0dXJlLCB1bmlmb3JtU2FtcGxlckxvY2F0aW9uLCB0ZXh0dXJlVW5pdCkge1xuICAgIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gYmluZFRleHR1cmVVbml0KGdsLCB0ZXh0dXJlLCB0ZXh0dXJlVW5pdCkpO1xuICAgIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wudW5pZm9ybTFpKHVuaWZvcm1TYW1wbGVyTG9jYXRpb24sIHRleHR1cmVVbml0KSk7XG59XG5leHBvcnQgZnVuY3Rpb24gYmluZENhbnZhc1RvRnJhbWVidWZmZXIoZ2wpIHtcbiAgICBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgbnVsbCkpO1xuICAgIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wudmlld3BvcnQoMCwgMCwgZ2wuY2FudmFzLndpZHRoLCBnbC5jYW52YXMuaGVpZ2h0KSk7XG4gICAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5zY2lzc29yKDAsIDAsIGdsLmNhbnZhcy53aWR0aCwgZ2wuY2FudmFzLmhlaWdodCkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGJpbmRDb2xvclRleHR1cmVUb0ZyYW1lYnVmZmVyKGdsLCB0ZXh0dXJlLCBmcmFtZWJ1ZmZlcikge1xuICAgIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBmcmFtZWJ1ZmZlcikpO1xuICAgIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCB0ZXh0dXJlLCAwKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gdW5iaW5kQ29sb3JUZXh0dXJlRnJvbUZyYW1lYnVmZmVyKGdsLCBmcmFtZWJ1ZmZlcikge1xuICAgIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBmcmFtZWJ1ZmZlcikpO1xuICAgIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCBudWxsLCAwKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVGcmFtZWJ1ZmZlcihnbCkge1xuICAgIGNvbnN0IHN0YXR1cyA9IGdsLmNoZWNrRnJhbWVidWZmZXJTdGF0dXMoZ2wuRlJBTUVCVUZGRVIpO1xuICAgIGlmIChzdGF0dXMgIT09IGdsLkZSQU1FQlVGRkVSX0NPTVBMRVRFKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXJyb3IgYmluZGluZyBmcmFtZWJ1ZmZlcjogJyArIGdldEZyYW1lYnVmZmVyRXJyb3JNZXNzYWdlKGdsLCBzdGF0dXMpKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0RnJhbWVidWZmZXJFcnJvck1lc3NhZ2UoZ2wsIHN0YXR1cykge1xuICAgIHN3aXRjaCAoc3RhdHVzKSB7XG4gICAgICAgIGNhc2UgZ2wuRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5UOlxuICAgICAgICAgICAgcmV0dXJuICdGUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0FUVEFDSE1FTlQnO1xuICAgICAgICBjYXNlIGdsLkZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTUlTU0lOR19BVFRBQ0hNRU5UOlxuICAgICAgICAgICAgcmV0dXJuICdGUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01JU1NJTkdfQVRUQUNITUVOVCc7XG4gICAgICAgIGNhc2UgZ2wuRlJBTUVCVUZGRVJfSU5DT01QTEVURV9ESU1FTlNJT05TOlxuICAgICAgICAgICAgcmV0dXJuICdGUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJTUVOU0lPTlMnO1xuICAgICAgICBjYXNlIGdsLkZSQU1FQlVGRkVSX1VOU1VQUE9SVEVEOlxuICAgICAgICAgICAgcmV0dXJuICdGUkFNRUJVRkZFUl9VTlNVUFBPUlRFRCc7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gYHVua25vd24gZXJyb3IgJHtzdGF0dXN9YDtcbiAgICB9XG59XG5mdW5jdGlvbiB0aHJvd0lmTnVsbChnbCwgcmV0dXJuVE9yTnVsbCwgZmFpbHVyZU1lc3NhZ2UpIHtcbiAgICBjb25zdCB0T3JOdWxsID0gY2FsbEFuZENoZWNrKGdsLCAoKSA9PiByZXR1cm5UT3JOdWxsKCkpO1xuICAgIGlmICh0T3JOdWxsID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGZhaWx1cmVNZXNzYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRPck51bGw7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZVRleHR1cmVVbml0KGdsLCB0ZXh0dXJlVW5pdCkge1xuICAgIGNvbnN0IG1heFRleHR1cmVVbml0ID0gZ2wuTUFYX0NPTUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFMgLSAxO1xuICAgIGNvbnN0IGdsVGV4dHVyZVVuaXQgPSB0ZXh0dXJlVW5pdCArIGdsLlRFWFRVUkUwO1xuICAgIGlmIChnbFRleHR1cmVVbml0IDwgZ2wuVEVYVFVSRTAgfHwgZ2xUZXh0dXJlVW5pdCA+IG1heFRleHR1cmVVbml0KSB7XG4gICAgICAgIGNvbnN0IHRleHR1cmVVbml0UmFuZ2UgPSBgW2dsLlRFWFRVUkUwLCBnbC5URVhUVVJFJHttYXhUZXh0dXJlVW5pdH1dYDtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB0ZXh0dXJlVW5pdCBtdXN0IGJlIGluICR7dGV4dHVyZVVuaXRSYW5nZX0uYCk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEJhdGNoRGltKHNoYXBlLCBkaW1zVG9Ta2lwID0gMikge1xuICAgIHJldHVybiB1dGlsLnNpemVGcm9tU2hhcGUoc2hhcGUuc2xpY2UoMCwgc2hhcGUubGVuZ3RoIC0gZGltc1RvU2tpcCkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFJvd3NDb2xzKHNoYXBlKSB7XG4gICAgaWYgKHNoYXBlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBFcnJvcignQ2Fubm90IGdldCByb3dzIGFuZCBjb2x1bW5zIG9mIGFuIGVtcHR5IHNoYXBlIGFycmF5LicpO1xuICAgIH1cbiAgICByZXR1cm4gW1xuICAgICAgICBzaGFwZS5sZW5ndGggPiAxID8gc2hhcGVbc2hhcGUubGVuZ3RoIC0gMl0gOiAxLCBzaGFwZVtzaGFwZS5sZW5ndGggLSAxXVxuICAgIF07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0U2hhcGVBczNEKHNoYXBlKSB7XG4gICAgbGV0IHNoYXBlQXMzRCA9IFsxLCAxLCAxXTtcbiAgICBjb25zdCBpc1NjYWxhciA9IHNoYXBlLmxlbmd0aCA9PT0gMCB8fCAoc2hhcGUubGVuZ3RoID09PSAxICYmIHNoYXBlWzBdID09PSAxKTtcbiAgICBpZiAoIWlzU2NhbGFyKSB7XG4gICAgICAgIHNoYXBlQXMzRCA9XG4gICAgICAgICAgICBbZ2V0QmF0Y2hEaW0oc2hhcGUpLCAuLi5nZXRSb3dzQ29scyhzaGFwZSldO1xuICAgIH1cbiAgICByZXR1cm4gc2hhcGVBczNEO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFRleHR1cmVTaGFwZUZyb21Mb2dpY2FsU2hhcGUobG9nU2hhcGUsIGlzUGFja2VkID0gZmFsc2UpIHtcbiAgICBsZXQgbWF4VGV4U2l6ZSA9IGVudigpLmdldE51bWJlcignV0VCR0xfTUFYX1RFWFRVUkVfU0laRScpO1xuICAgIGlmIChpc1BhY2tlZCkge1xuICAgICAgICBtYXhUZXhTaXplID0gbWF4VGV4U2l6ZSAqIDI7XG4gICAgICAgIC8vIFRoaXMgbG9naWMgZW5zdXJlcyB3ZSBhY2N1cmF0ZWx5IGNvdW50IHRoZSBudW1iZXIgb2YgcGFja2VkIHRleGVscyBuZWVkZWRcbiAgICAgICAgLy8gdG8gYWNjb21tb2RhdGUgdGhlIHRlbnNvci4gV2UgY2FuIG9ubHkgcGFjayB2YWx1ZXMgaW4gdGhlIHNhbWUgdGV4ZWwgaWZcbiAgICAgICAgLy8gdGhleSBhcmUgZnJvbSBhZGphY2VudCBwYWlycyBvZiByb3dzL2NvbHMgd2l0aGluIHRoZSBzYW1lIGJhdGNoLiBTbyBpZiBhXG4gICAgICAgIC8vIHRlbnNvciBoYXMgMyByb3dzLCB3ZSBwcmV0ZW5kIGl0IGhhcyA0IHJvd3MgaW4gb3JkZXIgdG8gYWNjb3VudCBmb3IgdGhlXG4gICAgICAgIC8vIGZhY3QgdGhhdCB0aGUgdGV4ZWxzIGNvbnRhaW5pbmcgdGhlIHRoaXJkIHJvdyBhcmUgaGFsZiBlbXB0eS5cbiAgICAgICAgbG9nU2hhcGUgPSBsb2dTaGFwZS5tYXAoKGQsIGkpID0+IGkgPj0gbG9nU2hhcGUubGVuZ3RoIC0gMiA/XG4gICAgICAgICAgICB1dGlsLm5lYXJlc3RMYXJnZXJFdmVuKGxvZ1NoYXBlW2ldKSA6XG4gICAgICAgICAgICBsb2dTaGFwZVtpXSk7XG4gICAgICAgIC8vIFBhY2tlZCB0ZXh0dXJlIGhlaWdodCBpcyBhdCBsZWFzdCAyICh0aGUgY2hhbm5lbCBoZWlnaHQgb2YgYSBzaW5nbGVcbiAgICAgICAgLy8gdGV4ZWwpLlxuICAgICAgICBpZiAobG9nU2hhcGUubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBsb2dTaGFwZSA9IFsyLCBsb2dTaGFwZVswXV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gSWYgbG9naWNhbCBzaGFwZSBpcyAyLCB3ZSBkb24ndCBzcXVlZXplLCBzaW5jZSB3ZSB3YW50IHRvIG1hdGNoIHBoeXNpY2FsLlxuICAgIGlmIChsb2dTaGFwZS5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgY29uc3Qgc3F1ZWV6ZVJlc3VsdCA9IHV0aWwuc3F1ZWV6ZVNoYXBlKGxvZ1NoYXBlKTtcbiAgICAgICAgbG9nU2hhcGUgPSBzcXVlZXplUmVzdWx0Lm5ld1NoYXBlO1xuICAgIH1cbiAgICBsZXQgc2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShsb2dTaGFwZSk7XG4gICAgaWYgKGxvZ1NoYXBlLmxlbmd0aCA8PSAxICYmIHNpemUgPD0gbWF4VGV4U2l6ZSkge1xuICAgICAgICByZXR1cm4gWzEsIHNpemVdO1xuICAgIH1cbiAgICBlbHNlIGlmIChsb2dTaGFwZS5sZW5ndGggPT09IDIgJiYgbG9nU2hhcGVbMF0gPD0gbWF4VGV4U2l6ZSAmJlxuICAgICAgICBsb2dTaGFwZVsxXSA8PSBtYXhUZXhTaXplKSB7XG4gICAgICAgIHJldHVybiBsb2dTaGFwZTtcbiAgICB9XG4gICAgZWxzZSBpZiAobG9nU2hhcGUubGVuZ3RoID09PSAzICYmIGxvZ1NoYXBlWzBdICogbG9nU2hhcGVbMV0gPD0gbWF4VGV4U2l6ZSAmJlxuICAgICAgICBsb2dTaGFwZVsyXSA8PSBtYXhUZXhTaXplKSB7XG4gICAgICAgIHJldHVybiBbbG9nU2hhcGVbMF0gKiBsb2dTaGFwZVsxXSwgbG9nU2hhcGVbMl1dO1xuICAgIH1cbiAgICBlbHNlIGlmIChsb2dTaGFwZS5sZW5ndGggPT09IDMgJiYgbG9nU2hhcGVbMF0gPD0gbWF4VGV4U2l6ZSAmJlxuICAgICAgICBsb2dTaGFwZVsxXSAqIGxvZ1NoYXBlWzJdIDw9IG1heFRleFNpemUpIHtcbiAgICAgICAgcmV0dXJuIFtsb2dTaGFwZVswXSwgbG9nU2hhcGVbMV0gKiBsb2dTaGFwZVsyXV07XG4gICAgfVxuICAgIGVsc2UgaWYgKGxvZ1NoYXBlLmxlbmd0aCA9PT0gNCAmJlxuICAgICAgICBsb2dTaGFwZVswXSAqIGxvZ1NoYXBlWzFdICogbG9nU2hhcGVbMl0gPD0gbWF4VGV4U2l6ZSAmJlxuICAgICAgICBsb2dTaGFwZVszXSA8PSBtYXhUZXhTaXplKSB7XG4gICAgICAgIHJldHVybiBbbG9nU2hhcGVbMF0gKiBsb2dTaGFwZVsxXSAqIGxvZ1NoYXBlWzJdLCBsb2dTaGFwZVszXV07XG4gICAgfVxuICAgIGVsc2UgaWYgKGxvZ1NoYXBlLmxlbmd0aCA9PT0gNCAmJiBsb2dTaGFwZVswXSA8PSBtYXhUZXhTaXplICYmXG4gICAgICAgIGxvZ1NoYXBlWzFdICogbG9nU2hhcGVbMl0gKiBsb2dTaGFwZVszXSA8PSBtYXhUZXhTaXplKSB7XG4gICAgICAgIHJldHVybiBbbG9nU2hhcGVbMF0sIGxvZ1NoYXBlWzFdICogbG9nU2hhcGVbMl0gKiBsb2dTaGFwZVszXV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoaXNQYWNrZWQpIHtcbiAgICAgICAgICAgIC8vIEZvciBwYWNrZWQgdGV4dHVyZXMgc2l6ZSBlcXVhbHMgdGhlIG51bWJlciBvZiBjaGFubmVscyByZXF1aXJlZCB0b1xuICAgICAgICAgICAgLy8gYWNjb21tb2RhdGUgdGhlIHRleHR1cmUgZGF0YS4gSG93ZXZlciBpbiBvcmRlciB0byBzcXVhcmlmeSBzdWNoIHRoYXRcbiAgICAgICAgICAgIC8vIGlubmVyIGRpbWVuc2lvbnMgc3RheSBldmVuLCB3ZSByZXdyaXRlIHNpemUgdG8gZXF1YWwgdGhlIG51bWJlciBvZlxuICAgICAgICAgICAgLy8gdGV4ZWxzLiBUaGVuIGluIHRoZSByZXR1cm4gc3RhdGVtZW50IHdlIHJlaHlkcmF0ZSB0aGUgc3F1YXJpZmllZFxuICAgICAgICAgICAgLy8gZGltZW5zaW9ucyB0byBjaGFubmVsIHVuaXRzLlxuICAgICAgICAgICAgY29uc3QgYmF0Y2hEaW0gPSBnZXRCYXRjaERpbShsb2dTaGFwZSk7XG4gICAgICAgICAgICBsZXQgcm93cyA9IDIsIGNvbHMgPSAyO1xuICAgICAgICAgICAgaWYgKGxvZ1NoYXBlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIFtyb3dzLCBjb2xzXSA9IGdldFJvd3NDb2xzKGxvZ1NoYXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNpemUgPSBiYXRjaERpbSAqIChyb3dzIC8gMikgKiAoY29scyAvIDIpO1xuICAgICAgICAgICAgcmV0dXJuIHV0aWwuc2l6ZVRvU3F1YXJpc2hTaGFwZShzaXplKS5tYXAoZCA9PiBkICogMik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHV0aWwuc2l6ZVRvU3F1YXJpc2hTaGFwZShzaXplKTtcbiAgICB9XG59XG5mdW5jdGlvbiBpc0V2ZW4obikge1xuICAgIHJldHVybiBuICUgMiA9PT0gMDtcbn1cbi8qKlxuICogVGhpcyBkZXRlcm1pbmVzIHdoZXRoZXIgcmVzaGFwaW5nIGEgcGFja2VkIHRleHR1cmUgcmVxdWlyZXMgcmVhcnJhbmdpbmdcbiAqIHRoZSBkYXRhIHdpdGhpbiB0aGUgdGV4dHVyZSwgYXNzdW1pbmcgMngyIHBhY2tpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Jlc2hhcGVGcmVlKHNoYXBlMSwgc2hhcGUyKSB7XG4gICAgc2hhcGUxID0gc2hhcGUxLnNsaWNlKC0yKTtcbiAgICBzaGFwZTIgPSBzaGFwZTIuc2xpY2UoLTIpO1xuICAgIGlmICh1dGlsLmFycmF5c0VxdWFsKHNoYXBlMSwgc2hhcGUyKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCFzaGFwZTEubGVuZ3RoIHx8ICFzaGFwZTIubGVuZ3RoKSB7IC8vIE9uZSBvZiB0aGUgc2hhcGVzIGlzIGEgc2NhbGFyLlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHNoYXBlMVswXSA9PT0gMCB8fCBzaGFwZTFbMV0gPT09IDAgfHwgc2hhcGUyWzBdID09PSAwIHx8XG4gICAgICAgIHNoYXBlMlsxXSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHNoYXBlMS5sZW5ndGggIT09IHNoYXBlMi5sZW5ndGgpIHsgLy8gT25lIG9mIHRoZSBzaGFwZXMgaXMgYSB2ZWN0b3IuXG4gICAgICAgIGNvbnN0IHNoYXBlMUNvbHMgPSBzaGFwZTEuc2xpY2UoLTEpWzBdO1xuICAgICAgICBjb25zdCBzaGFwZTJDb2xzID0gc2hhcGUyLnNsaWNlKC0xKVswXTtcbiAgICAgICAgaWYgKHNoYXBlMUNvbHMgPT09IHNoYXBlMkNvbHMpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0V2ZW4oc2hhcGUxQ29scykgJiYgaXNFdmVuKHNoYXBlMkNvbHMpICYmXG4gICAgICAgICAgICAoc2hhcGUxWzBdID09PSAxIHx8IHNoYXBlMlswXSA9PT0gMSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzaGFwZTFbMV0gPT09IHNoYXBlMlsxXSAmJiBpc0V2ZW4oc2hhcGUxWzBdKSAmJiBpc0V2ZW4oc2hhcGUyWzBdKTtcbn1cbi8vIFdlIGNhY2hlIHdlYmdsIHBhcmFtcyBiZWNhdXNlIHRoZSBlbnZpcm9ubWVudCBnZXRzIHJlc2V0IGJldHdlZW5cbi8vIHVuaXQgdGVzdHMgYW5kIHdlIGRvbid0IHdhbnQgdG8gY29uc3RhbnRseSBxdWVyeSB0aGUgV2ViR0xDb250ZXh0IGZvclxuLy8gTUFYX1RFWFRVUkVfU0laRS5cbmxldCBNQVhfVEVYVFVSRV9TSVpFO1xubGV0IE1BWF9URVhUVVJFU19JTl9TSEFERVI7XG5leHBvcnQgZnVuY3Rpb24gZ2V0V2ViR0xNYXhUZXh0dXJlU2l6ZSh3ZWJHTFZlcnNpb24pIHtcbiAgICBpZiAoTUFYX1RFWFRVUkVfU0laRSA9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGdsID0gZ2V0V2ViR0xDb250ZXh0KHdlYkdMVmVyc2lvbik7XG4gICAgICAgIE1BWF9URVhUVVJFX1NJWkUgPSBnbC5nZXRQYXJhbWV0ZXIoZ2wuTUFYX1RFWFRVUkVfU0laRSk7XG4gICAgfVxuICAgIHJldHVybiBNQVhfVEVYVFVSRV9TSVpFO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0TWF4VGV4dHVyZVNpemUoKSB7XG4gICAgTUFYX1RFWFRVUkVfU0laRSA9IG51bGw7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVzZXRNYXhUZXh0dXJlc0luU2hhZGVyKCkge1xuICAgIE1BWF9URVhUVVJFU19JTl9TSEFERVIgPSBudWxsO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldE1heFRleHR1cmVzSW5TaGFkZXIod2ViR0xWZXJzaW9uKSB7XG4gICAgaWYgKE1BWF9URVhUVVJFU19JTl9TSEFERVIgPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBnbCA9IGdldFdlYkdMQ29udGV4dCh3ZWJHTFZlcnNpb24pO1xuICAgICAgICBNQVhfVEVYVFVSRVNfSU5fU0hBREVSID0gZ2wuZ2V0UGFyYW1ldGVyKGdsLk1BWF9URVhUVVJFX0lNQUdFX1VOSVRTKTtcbiAgICB9XG4gICAgLy8gV2UgY2FwIGF0IDE2IHRvIGF2b2lkIHNwdXJpb3VzIHJ1bnRpbWUgXCJtZW1vcnkgZXhoYXVzdGVkXCIgZXJyb3IuXG4gICAgcmV0dXJuIE1hdGgubWluKDE2LCBNQVhfVEVYVFVSRVNfSU5fU0hBREVSKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRXZWJHTERpc2pvaW50UXVlcnlUaW1lclZlcnNpb24od2ViR0xWZXJzaW9uKSB7XG4gICAgaWYgKHdlYkdMVmVyc2lvbiA9PT0gMCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgbGV0IHF1ZXJ5VGltZXJWZXJzaW9uO1xuICAgIGNvbnN0IGdsID0gZ2V0V2ViR0xDb250ZXh0KHdlYkdMVmVyc2lvbik7XG4gICAgaWYgKGhhc0V4dGVuc2lvbihnbCwgJ0VYVF9kaXNqb2ludF90aW1lcl9xdWVyeV93ZWJnbDInKSAmJlxuICAgICAgICB3ZWJHTFZlcnNpb24gPT09IDIpIHtcbiAgICAgICAgcXVlcnlUaW1lclZlcnNpb24gPSAyO1xuICAgIH1cbiAgICBlbHNlIGlmIChoYXNFeHRlbnNpb24oZ2wsICdFWFRfZGlzam9pbnRfdGltZXJfcXVlcnknKSkge1xuICAgICAgICBxdWVyeVRpbWVyVmVyc2lvbiA9IDE7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBxdWVyeVRpbWVyVmVyc2lvbiA9IDA7XG4gICAgfVxuICAgIHJldHVybiBxdWVyeVRpbWVyVmVyc2lvbjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBoYXNFeHRlbnNpb24oZ2wsIGV4dGVuc2lvbk5hbWUpIHtcbiAgICBjb25zdCBleHQgPSBnbC5nZXRFeHRlbnNpb24oZXh0ZW5zaW9uTmFtZSk7XG4gICAgcmV0dXJuIGV4dCAhPSBudWxsO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzV2ViR0xWZXJzaW9uRW5hYmxlZCh3ZWJHTFZlcnNpb24pIHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBnbCA9IGdldFdlYkdMQ29udGV4dCh3ZWJHTFZlcnNpb24pO1xuICAgICAgICBpZiAoZ2wgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ0Vycm9yIHdoZW4gZ2V0dGluZyBXZWJHTCBjb250ZXh0OiAnLCBlKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNDYXBhYmxlT2ZSZW5kZXJpbmdUb0Zsb2F0VGV4dHVyZSh3ZWJHTFZlcnNpb24pIHtcbiAgICBpZiAod2ViR0xWZXJzaW9uID09PSAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgZ2wgPSBnZXRXZWJHTENvbnRleHQod2ViR0xWZXJzaW9uKTtcbiAgICBpZiAod2ViR0xWZXJzaW9uID09PSAxKSB7XG4gICAgICAgIGlmICghaGFzRXh0ZW5zaW9uKGdsLCAnT0VTX3RleHR1cmVfZmxvYXQnKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoIWhhc0V4dGVuc2lvbihnbCwgJ0VYVF9jb2xvcl9idWZmZXJfZmxvYXQnKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGlzRnJhbWVCdWZmZXJDb21wbGV0ZSA9IGNyZWF0ZUZsb2F0VGV4dHVyZUFuZEJpbmRUb0ZyYW1lYnVmZmVyKGdsKTtcbiAgICByZXR1cm4gaXNGcmFtZUJ1ZmZlckNvbXBsZXRlO1xufVxuLyoqXG4gKiBDaGVjayBpZiB3ZSBjYW4gZG93bmxvYWQgdmFsdWVzIGZyb20gYSBmbG9hdC9oYWxmLWZsb2F0IHRleHR1cmUuXG4gKlxuICogTm90ZSB0aGF0IGZvciBwZXJmb3JtYW5jZSByZWFzb25zIHdlIHVzZSBiaW5kaW5nIGEgdGV4dHVyZSB0byBhIGZyYW1lYnVmZmVyXG4gKiBhcyBhIHByb3h5IGZvciBhYmlsaXR5IHRvIGRvd25sb2FkIGZsb2F0IHZhbHVlcyBsYXRlciB1c2luZyByZWFkUGl4ZWxzLiBUaGVcbiAqIHRleHR1cmUgcGFyYW1zIG9mIHRoaXMgdGV4dHVyZSB3aWxsIG5vdCBtYXRjaCB0aG9zZSBpbiByZWFkUGl4ZWxzIGV4YWN0bHlcbiAqIGJ1dCBpZiB3ZSBhcmUgdW5hYmxlIHRvIGJpbmQgc29tZSBraW5kIG9mIGZsb2F0IHRleHR1cmUgdG8gdGhlIGZyYW1lQnVmZmVyXG4gKiB0aGVuIHdlIGRlZmluaXRlbHkgd2lsbCBub3QgYmUgYWJsZSB0byByZWFkIGZsb2F0IHZhbHVlcyBmcm9tIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEb3dubG9hZEZsb2F0VGV4dHVyZUVuYWJsZWQod2ViR0xWZXJzaW9uKSB7XG4gICAgaWYgKHdlYkdMVmVyc2lvbiA9PT0gMCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGdsID0gZ2V0V2ViR0xDb250ZXh0KHdlYkdMVmVyc2lvbik7XG4gICAgaWYgKHdlYkdMVmVyc2lvbiA9PT0gMSkge1xuICAgICAgICBpZiAoIWhhc0V4dGVuc2lvbihnbCwgJ09FU190ZXh0dXJlX2Zsb2F0JykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWhhc0V4dGVuc2lvbihnbCwgJ1dFQkdMX2NvbG9yX2J1ZmZlcl9mbG9hdCcpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmIChoYXNFeHRlbnNpb24oZ2wsICdFWFRfY29sb3JfYnVmZmVyX2Zsb2F0JykpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVGbG9hdFRleHR1cmVBbmRCaW5kVG9GcmFtZWJ1ZmZlcihnbCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgQ09MT1JfQlVGRkVSX0hBTEZfRkxPQVQgPSAnRVhUX2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0JztcbiAgICAgICAgaWYgKGhhc0V4dGVuc2lvbihnbCwgQ09MT1JfQlVGRkVSX0hBTEZfRkxPQVQpKSB7XG4gICAgICAgICAgICBjb25zdCB0ZXh0dXJlSGFsZkZsb2F0RXh0ZW5zaW9uID0gZ2wuZ2V0RXh0ZW5zaW9uKENPTE9SX0JVRkZFUl9IQUxGX0ZMT0FUKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVIYWxmRmxvYXRUZXh0dXJlQW5kQmluZFRvRnJhbWVidWZmZXIoZ2wsIHRleHR1cmVIYWxmRmxvYXRFeHRlbnNpb24pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgaXNGcmFtZUJ1ZmZlckNvbXBsZXRlID0gY3JlYXRlRmxvYXRUZXh0dXJlQW5kQmluZFRvRnJhbWVidWZmZXIoZ2wpO1xuICAgIHJldHVybiBpc0ZyYW1lQnVmZmVyQ29tcGxldGU7XG59XG5mdW5jdGlvbiBjcmVhdGVGbG9hdFRleHR1cmVBbmRCaW5kVG9GcmFtZWJ1ZmZlcihnbCkge1xuICAgIGNvbnN0IHRleENvbmZpZyA9IGdldFRleHR1cmVDb25maWcoZ2wpO1xuICAgIGNvbnN0IHRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7XG4gICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZSk7XG4gICAgY29uc3Qgd2lkdGggPSAxO1xuICAgIGNvbnN0IGhlaWdodCA9IDE7XG4gICAgZ2wudGV4SW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCB0ZXhDb25maWcuaW50ZXJuYWxGb3JtYXRGbG9hdCwgd2lkdGgsIGhlaWdodCwgMCwgdGV4Q29uZmlnLnRleHR1cmVGb3JtYXRGbG9hdCwgdGV4Q29uZmlnLnRleHR1cmVUeXBlRmxvYXQsIG51bGwpO1xuICAgIGNvbnN0IGZyYW1lQnVmZmVyID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTtcbiAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyKTtcbiAgICBnbC5mcmFtZWJ1ZmZlclRleHR1cmUyRChnbC5GUkFNRUJVRkZFUiwgZ2wuQ09MT1JfQVRUQUNITUVOVDAsIGdsLlRFWFRVUkVfMkQsIHRleHR1cmUsIDApO1xuICAgIGNvbnN0IGlzRnJhbWVCdWZmZXJDb21wbGV0ZSA9IGdsLmNoZWNrRnJhbWVidWZmZXJTdGF0dXMoZ2wuRlJBTUVCVUZGRVIpID09PSBnbC5GUkFNRUJVRkZFUl9DT01QTEVURTtcbiAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBudWxsKTtcbiAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIG51bGwpO1xuICAgIGdsLmRlbGV0ZVRleHR1cmUodGV4dHVyZSk7XG4gICAgZ2wuZGVsZXRlRnJhbWVidWZmZXIoZnJhbWVCdWZmZXIpO1xuICAgIHJldHVybiBpc0ZyYW1lQnVmZmVyQ29tcGxldGU7XG59XG5mdW5jdGlvbiBjcmVhdGVIYWxmRmxvYXRUZXh0dXJlQW5kQmluZFRvRnJhbWVidWZmZXIoXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG5nbCwgdGV4dHVyZUhhbGZGbG9hdEV4dGVuc2lvbikge1xuICAgIGNvbnN0IHRleENvbmZpZyA9IGdldFRleHR1cmVDb25maWcoZ2wsIHRleHR1cmVIYWxmRmxvYXRFeHRlbnNpb24pO1xuICAgIGNvbnN0IHRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7XG4gICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZSk7XG4gICAgY29uc3Qgd2lkdGggPSAxO1xuICAgIGNvbnN0IGhlaWdodCA9IDE7XG4gICAgZ2wudGV4SW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCB0ZXhDb25maWcuaW50ZXJuYWxGb3JtYXRIYWxmRmxvYXQsIHdpZHRoLCBoZWlnaHQsIDAsIHRleENvbmZpZy50ZXh0dXJlRm9ybWF0RmxvYXQsIHRleENvbmZpZy50ZXh0dXJlVHlwZUhhbGZGbG9hdCwgbnVsbCk7XG4gICAgY29uc3QgZnJhbWVCdWZmZXIgPSBnbC5jcmVhdGVGcmFtZWJ1ZmZlcigpO1xuICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgZnJhbWVCdWZmZXIpO1xuICAgIGdsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKGdsLkZSQU1FQlVGRkVSLCBnbC5DT0xPUl9BVFRBQ0hNRU5UMCwgZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZSwgMCk7XG4gICAgY29uc3QgaXNGcmFtZUJ1ZmZlckNvbXBsZXRlID0gZ2wuY2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyhnbC5GUkFNRUJVRkZFUikgPT09IGdsLkZSQU1FQlVGRkVSX0NPTVBMRVRFO1xuICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIG51bGwpO1xuICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgbnVsbCk7XG4gICAgZ2wuZGVsZXRlVGV4dHVyZSh0ZXh0dXJlKTtcbiAgICBnbC5kZWxldGVGcmFtZWJ1ZmZlcihmcmFtZUJ1ZmZlcik7XG4gICAgcmV0dXJuIGlzRnJhbWVCdWZmZXJDb21wbGV0ZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1dlYkdMRmVuY2VFbmFibGVkKHdlYkdMVmVyc2lvbikge1xuICAgIGlmICh3ZWJHTFZlcnNpb24gIT09IDIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBnbCA9IGdldFdlYkdMQ29udGV4dCh3ZWJHTFZlcnNpb24pO1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICBjb25zdCBpc0VuYWJsZWQgPSBnbC5mZW5jZVN5bmMgIT0gbnVsbDtcbiAgICByZXR1cm4gaXNFbmFibGVkO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE5vdENvbXBsZXgodGVuc29yLCBvcE5hbWUpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodGVuc29yKSkge1xuICAgICAgICB0ZW5zb3IgPSBbdGVuc29yXTtcbiAgICB9XG4gICAgdGVuc29yLmZvckVhY2godCA9PiB7XG4gICAgICAgIGlmICh0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHV0aWwuYXNzZXJ0KHQuZHR5cGUgIT09ICdjb21wbGV4NjQnLCAoKSA9PiBgJHtvcE5hbWV9IGRvZXMgbm90IHN1cHBvcnQgY29tcGxleDY0IHRlbnNvcnMgYCArXG4gICAgICAgICAgICAgICAgJ2luIHRoZSBXZWJHTCBiYWNrZW5kLicpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD13ZWJnbF91dGlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmV4cG9ydCBjb25zdCBFUFNJTE9OX0ZMT0FUMzIgPSAxZS03O1xuZXhwb3J0IGNvbnN0IEVQU0lMT05fRkxPQVQxNiA9IDFlLTQ7XG4vKiogQ29udmVuaWVudCBjbGFzcyBmb3Igc3RvcmluZyB0ZW5zb3ItcmVsYXRlZCBkYXRhLiAqL1xuZXhwb3J0IGNsYXNzIERhdGFTdG9yYWdlIHtcbiAgICBjb25zdHJ1Y3RvcihiYWNrZW5kLCBkYXRhTW92ZXIpIHtcbiAgICAgICAgdGhpcy5iYWNrZW5kID0gYmFja2VuZDtcbiAgICAgICAgdGhpcy5kYXRhTW92ZXIgPSBkYXRhTW92ZXI7XG4gICAgICAgIHRoaXMuZGF0YSA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIHRoaXMuZGF0YUlkc0NvdW50ID0gMDtcbiAgICB9XG4gICAgZ2V0KGRhdGFJZCkge1xuICAgICAgICBpZiAoIXRoaXMuZGF0YS5oYXMoZGF0YUlkKSkge1xuICAgICAgICAgICAgdGhpcy5kYXRhTW92ZXIubW92ZURhdGEodGhpcy5iYWNrZW5kLCBkYXRhSWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuZ2V0KGRhdGFJZCk7XG4gICAgfVxuICAgIHNldChkYXRhSWQsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuZGF0YUlkc0NvdW50Kys7XG4gICAgICAgIHRoaXMuZGF0YS5zZXQoZGF0YUlkLCB2YWx1ZSk7XG4gICAgfVxuICAgIGhhcyhkYXRhSWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5oYXMoZGF0YUlkKTtcbiAgICB9XG4gICAgZGVsZXRlKGRhdGFJZCkge1xuICAgICAgICB0aGlzLmRhdGFJZHNDb3VudC0tO1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmRlbGV0ZShkYXRhSWQpO1xuICAgIH1cbiAgICBudW1EYXRhSWRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhSWRzQ291bnQ7XG4gICAgfVxufVxuLyoqXG4gKiBUaGUgaW50ZXJmYWNlIHRoYXQgZGVmaW5lcyB0aGUga2VybmVscyB0aGF0IHNob3VsZCBiZSBpbXBsZW1lbnRlZCB3aGVuXG4gKiBhZGRpbmcgYSBuZXcgYmFja2VuZC4gTmV3IGJhY2tlbmRzIGRvbid0IG5lZWQgdG8gaW1wbGVtZW50IGV2ZXJ5IG9uZSBvZiB0aGVcbiAqIG1ldGhvZHMsIHRoaXMgY2FuIGJlIGRvbmUgZ3JhZHVhbGx5ICh0aHJvdyBhbiBlcnJvciBmb3IgdW5pbXBsZW1lbnRlZFxuICogbWV0aG9kcykuXG4gKi9cbmV4cG9ydCBjbGFzcyBLZXJuZWxCYWNrZW5kIHtcbiAgICByZWZDb3VudChkYXRhSWQpIHtcbiAgICAgICAgcmV0dXJuIG5vdFlldEltcGxlbWVudGVkKCdyZWZDb3VudCcpO1xuICAgIH1cbiAgICBpbmNSZWYoZGF0YUlkKSB7XG4gICAgICAgIHJldHVybiBub3RZZXRJbXBsZW1lbnRlZCgnaW5jUmVmJyk7XG4gICAgfVxuICAgIHRpbWVyQXZhaWxhYmxlKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdGltZShmKSB7XG4gICAgICAgIHJldHVybiBub3RZZXRJbXBsZW1lbnRlZCgndGltZScpO1xuICAgIH1cbiAgICByZWFkKGRhdGFJZCkge1xuICAgICAgICByZXR1cm4gbm90WWV0SW1wbGVtZW50ZWQoJ3JlYWQnKTtcbiAgICB9XG4gICAgcmVhZFN5bmMoZGF0YUlkKSB7XG4gICAgICAgIHJldHVybiBub3RZZXRJbXBsZW1lbnRlZCgncmVhZFN5bmMnKTtcbiAgICB9XG4gICAgbnVtRGF0YUlkcygpIHtcbiAgICAgICAgcmV0dXJuIG5vdFlldEltcGxlbWVudGVkKCdudW1EYXRhSWRzJyk7XG4gICAgfVxuICAgIGRpc3Bvc2VEYXRhKGRhdGFJZCwgZm9yY2UpIHtcbiAgICAgICAgcmV0dXJuIG5vdFlldEltcGxlbWVudGVkKCdkaXNwb3NlRGF0YScpO1xuICAgIH1cbiAgICB3cml0ZSh2YWx1ZXMsIHNoYXBlLCBkdHlwZSkge1xuICAgICAgICByZXR1cm4gbm90WWV0SW1wbGVtZW50ZWQoJ3dyaXRlJyk7XG4gICAgfVxuICAgIG1vdmUoZGF0YUlkLCB2YWx1ZXMsIHNoYXBlLCBkdHlwZSwgcmVmQ291bnQpIHtcbiAgICAgICAgcmV0dXJuIG5vdFlldEltcGxlbWVudGVkKCdtb3ZlJyk7XG4gICAgfVxuICAgIG1lbW9yeSgpIHtcbiAgICAgICAgcmV0dXJuIG5vdFlldEltcGxlbWVudGVkKCdtZW1vcnknKTtcbiAgICB9XG4gICAgLyoqIFJldHVybnMgdGhlIGhpZ2hlc3QgcHJlY2lzaW9uIGZvciBmbG9hdHMgaW4gYml0cyAoZS5nLiAxNiBvciAzMikgKi9cbiAgICBmbG9hdFByZWNpc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIG5vdFlldEltcGxlbWVudGVkKCdmbG9hdFByZWNpc2lvbicpO1xuICAgIH1cbiAgICAvKiogUmV0dXJucyB0aGUgc21hbGxlc3QgcmVwcmVzZW50YWJsZSBudW1iZXIuICAqL1xuICAgIGVwc2lsb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZsb2F0UHJlY2lzaW9uKCkgPT09IDMyID8gRVBTSUxPTl9GTE9BVDMyIDogRVBTSUxPTl9GTE9BVDE2O1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICByZXR1cm4gbm90WWV0SW1wbGVtZW50ZWQoJ2Rpc3Bvc2UnKTtcbiAgICB9XG59XG5mdW5jdGlvbiBub3RZZXRJbXBsZW1lbnRlZChrZXJuZWxOYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAnJHtrZXJuZWxOYW1lfScgbm90IHlldCBpbXBsZW1lbnRlZCBvciBub3QgZm91bmQgaW4gdGhlIHJlZ2lzdHJ5LiBgICtcbiAgICAgICAgYFRoaXMga2VybmVsIG1heSBub3QgYmUgc3VwcG9ydGVkIGJ5IHRoZSB0ZmpzIGJhY2tlbmQgeW91IGhhdmUgY2hvc2VuYCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iYWNrZW5kLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGRlY29kZVN0cmluZywgZW5jb2RlU3RyaW5nIH0gZnJvbSAnLi4vdXRpbCc7XG4vLyBVdGlsaXRpZXMgbmVlZGVkIGJ5IGJhY2tlbmQgY29uc3VtZXJzIG9mIHRmLWNvcmUuXG5leHBvcnQgKiBmcm9tICcuLi9vcHMvYXhpc191dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL29wcy9icm9hZGNhc3RfdXRpbCc7XG5leHBvcnQgKiBmcm9tICcuLi9vcHMvY29uY2F0X3V0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi4vb3BzL2NvbnZfdXRpbCc7XG5leHBvcnQgKiBmcm9tICcuLi9vcHMvZnVzZWRfdXRpbCc7XG5leHBvcnQgKiBmcm9tICcuLi9vcHMvcmVkdWNlX3V0aWwnO1xuaW1wb3J0ICogYXMgc2xpY2VfdXRpbCBmcm9tICcuLi9vcHMvc2xpY2VfdXRpbCc7XG5leHBvcnQgeyBzbGljZV91dGlsIH07XG5leHBvcnQgeyB1cGNhc3RUeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi4vb3BzL3JvdGF0ZV91dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL29wcy9hcnJheV9vcHNfdXRpbCc7XG5leHBvcnQgKiBmcm9tICcuLi9vcHMvZ2F0aGVyX25kX3V0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi4vb3BzL3NjYXR0ZXJfbmRfdXRpbCc7XG5leHBvcnQgKiBmcm9tICcuLi9vcHMvc2VsdV91dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL29wcy9mdXNlZF91dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL29wcy9lcmZfdXRpbCc7XG5leHBvcnQgKiBmcm9tICcuLi9sb2cnO1xuZXhwb3J0ICogZnJvbSAnLi4vYmFja2VuZHMvY29tcGxleF91dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL2JhY2tlbmRzL2VpbnN1bV91dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL29wcy9zcGxpdF91dGlsJztcbmltcG9ydCAqIGFzIHNlZ21lbnRfdXRpbCBmcm9tICcuLi9vcHMvc2VnbWVudF91dGlsJztcbmV4cG9ydCB7IHNlZ21lbnRfdXRpbCB9O1xuZXhwb3J0IGZ1bmN0aW9uIGZyb21VaW50OFRvU3RyaW5nQXJyYXkodmFscykge1xuICAgIHRyeSB7XG4gICAgICAgIC8vIERlY29kZSB0aGUgYnl0ZXMgaW50byBzdHJpbmcuXG4gICAgICAgIHJldHVybiB2YWxzLm1hcCh2YWwgPT4gZGVjb2RlU3RyaW5nKHZhbCkpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGRlY29kZSBlbmNvZGVkIHN0cmluZyBieXRlcyBpbnRvIHV0Zi04LCBlcnJvcjogJHtlcnJ9YCk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGZyb21TdHJpbmdBcnJheVRvVWludDgoc3RyaW5ncykge1xuICAgIHJldHVybiBzdHJpbmdzLm1hcChzID0+IGVuY29kZVN0cmluZyhzKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iYWNrZW5kX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLyoqXG4gKiBNZXJnZXMgcmVhbCBhbmQgaW1hZ2luYXJ5IEZsb2F0MzJBcnJheXMgaW50byBhIHNpbmdsZSBjb21wbGV4IEZsb2F0MzJBcnJheS5cbiAqXG4gKiBUaGUgbWVtb3J5IGxheW91dCBpcyBpbnRlcmxlYXZlZCBhcyBmb2xsb3dzOlxuICogcmVhbDogW3IwLCByMSwgcjJdXG4gKiBpbWFnOiBbaTAsIGkxLCBpMl1cbiAqIGNvbXBsZXg6IFtyMCwgaTAsIHIxLCBpMSwgcjIsIGkyXVxuICpcbiAqIFRoaXMgaXMgdGhlIGludmVyc2Ugb2Ygc3BsaXRSZWFsQW5kSW1hZ0FycmF5cy5cbiAqXG4gKiBAcGFyYW0gcmVhbCBUaGUgcmVhbCB2YWx1ZXMgb2YgdGhlIGNvbXBsZXggdGVuc29yIHZhbHVlcy5cbiAqIEBwYXJhbSBpbWFnIFRoZSBpbWFnIHZhbHVlcyBvZiB0aGUgY29tcGxleCB0ZW5zb3IgdmFsdWVzLlxuICogQHJldHVybnMgQSBjb21wbGV4IHRlbnNvciBhcyBhIEZsb2F0MzJBcnJheSB3aXRoIG1lcmdlZCB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVJlYWxBbmRJbWFnQXJyYXlzKHJlYWwsIGltYWcpIHtcbiAgICBpZiAocmVhbC5sZW5ndGggIT09IGltYWcubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IG1lcmdlIHJlYWwgYW5kIGltYWcgYXJyYXlzIG9mIGRpZmZlcmVudCBsZW5ndGhzLiByZWFsOmAgK1xuICAgICAgICAgICAgYCR7cmVhbC5sZW5ndGh9LCBpbWFnOiAke2ltYWcubGVuZ3RofS5gKTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IEZsb2F0MzJBcnJheShyZWFsLmxlbmd0aCAqIDIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgIHJlc3VsdFtpXSA9IHJlYWxbaSAvIDJdO1xuICAgICAgICByZXN1bHRbaSArIDFdID0gaW1hZ1tpIC8gMl07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIFNwbGl0cyBhIGNvbXBsZXggRmxvYXQzMkFycmF5IGludG8gcmVhbCBhbmQgaW1hZyBwYXJ0cy5cbiAqXG4gKiBUaGUgbWVtb3J5IGxheW91dCBpcyBpbnRlcmxlYXZlZCBhcyBmb2xsb3dzOlxuICogY29tcGxleDogW3IwLCBpMCwgcjEsIGkxLCByMiwgaTJdXG4gKiByZWFsOiBbcjAsIHIxLCByMl1cbiAqIGltYWc6IFtpMCwgaTEsIGkyXVxuICpcbiAqIFRoaXMgaXMgdGhlIGludmVyc2Ugb2YgbWVyZ2VSZWFsQW5kSW1hZ0FycmF5cy5cbiAqXG4gKiBAcGFyYW0gY29tcGxleCBUaGUgY29tcGxleCB0ZW5zb3IgdmFsdWVzLlxuICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggcmVhbCBhbmQgaW1hZyBGbG9hdDMyQXJyYXkgY29tcG9uZW50cyBvZiB0aGUgY29tcGxleFxuICogICAgIHRlbnNvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0UmVhbEFuZEltYWdBcnJheXMoY29tcGxleCkge1xuICAgIGNvbnN0IHJlYWwgPSBuZXcgRmxvYXQzMkFycmF5KGNvbXBsZXgubGVuZ3RoIC8gMik7XG4gICAgY29uc3QgaW1hZyA9IG5ldyBGbG9hdDMyQXJyYXkoY29tcGxleC5sZW5ndGggLyAyKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbXBsZXgubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgcmVhbFtpIC8gMl0gPSBjb21wbGV4W2ldO1xuICAgICAgICBpbWFnW2kgLyAyXSA9IGNvbXBsZXhbaSArIDFdO1xuICAgIH1cbiAgICByZXR1cm4geyByZWFsLCBpbWFnIH07XG59XG4vKipcbiAqIEV4dHJhY3RzIGV2ZW4gaW5kZXhlZCBjb21wbGV4IHZhbHVlcyBpbiB0aGUgZ2l2ZW4gYXJyYXkuXG4gKiBAcGFyYW0gY29tcGxleCBUaGUgY29tcGxleCB0ZW5zb3IgdmFsdWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wbGV4V2l0aEV2ZW5JbmRleChjb21wbGV4KSB7XG4gICAgY29uc3QgbGVuID0gTWF0aC5jZWlsKGNvbXBsZXgubGVuZ3RoIC8gNCk7XG4gICAgY29uc3QgcmVhbCA9IG5ldyBGbG9hdDMyQXJyYXkobGVuKTtcbiAgICBjb25zdCBpbWFnID0gbmV3IEZsb2F0MzJBcnJheShsZW4pO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tcGxleC5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgICByZWFsW01hdGguZmxvb3IoaSAvIDQpXSA9IGNvbXBsZXhbaV07XG4gICAgICAgIGltYWdbTWF0aC5mbG9vcihpIC8gNCldID0gY29tcGxleFtpICsgMV07XG4gICAgfVxuICAgIHJldHVybiB7IHJlYWwsIGltYWcgfTtcbn1cbi8qKlxuICogRXh0cmFjdHMgb2RkIGluZGV4ZWQgY29tcGxlIHZhbHVlcyBpbiB0aGUgZ2l2ZW4gYXJyYXkuXG4gKiBAcGFyYW0gY29tcGxleCBUaGUgY29tcGxleCB0ZW5zb3IgdmFsdWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wbGV4V2l0aE9kZEluZGV4KGNvbXBsZXgpIHtcbiAgICBjb25zdCBsZW4gPSBNYXRoLmZsb29yKGNvbXBsZXgubGVuZ3RoIC8gNCk7XG4gICAgY29uc3QgcmVhbCA9IG5ldyBGbG9hdDMyQXJyYXkobGVuKTtcbiAgICBjb25zdCBpbWFnID0gbmV3IEZsb2F0MzJBcnJheShsZW4pO1xuICAgIGZvciAobGV0IGkgPSAyOyBpIDwgY29tcGxleC5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgICByZWFsW01hdGguZmxvb3IoaSAvIDQpXSA9IGNvbXBsZXhbaV07XG4gICAgICAgIGltYWdbTWF0aC5mbG9vcihpIC8gNCldID0gY29tcGxleFtpICsgMV07XG4gICAgfVxuICAgIHJldHVybiB7IHJlYWwsIGltYWcgfTtcbn1cbi8qKlxuICogR2V0IHRoZSBtYXAgcmVwcmVzZW50aW5nIGEgY29tcGxleCB2YWx1ZSBpbiB0aGUgZ2l2ZW4gYXJyYXkuXG4gKiBAcGFyYW0gY29tcGxleCBUaGUgY29tcGxleCB0ZW5zb3IgdmFsdWVzLlxuICogQHBhcmFtIGluZGV4IEFuIGluZGV4IG9mIHRoZSB0YXJnZXQgY29tcGxleCB2YWx1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvbXBsZXhXaXRoSW5kZXgoY29tcGxleCwgaW5kZXgpIHtcbiAgICBjb25zdCByZWFsID0gY29tcGxleFtpbmRleCAqIDJdO1xuICAgIGNvbnN0IGltYWcgPSBjb21wbGV4W2luZGV4ICogMiArIDFdO1xuICAgIHJldHVybiB7IHJlYWwsIGltYWcgfTtcbn1cbi8qKlxuICogSW5zZXJ0IGEgZ2l2ZW4gY29tcGxleCB2YWx1ZSBpbnRvIHRoZSBUeXBlZEFycmF5LlxuICogQHBhcmFtIGRhdGEgVGhlIGFycmF5IGluIHdoaWNoIHRoZSBjb21wbGV4IHZhbHVlIGlzIGluc2VydGVkLlxuICogQHBhcmFtIGMgVGhlIGNvbXBsZXggdmFsdWUgdG8gYmUgaW5zZXJ0ZWQuXG4gKiBAcGFyYW0gaW5kZXggQW4gaW5kZXggb2YgdGhlIHRhcmdldCBjb21wbGV4IHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzaWduVG9UeXBlZEFycmF5KGRhdGEsIHJlYWwsIGltYWcsIGluZGV4KSB7XG4gICAgZGF0YVtpbmRleCAqIDJdID0gcmVhbDtcbiAgICBkYXRhW2luZGV4ICogMiArIDFdID0gaW1hZztcbn1cbi8qKlxuICogTWFrZSB0aGUgbGlzdCBvZiBleHBvbmVudCB0ZXJtcyB1c2VkIGJ5IEZGVC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4cG9uZW50cyhuLCBpbnZlcnNlKSB7XG4gICAgY29uc3QgcmVhbCA9IG5ldyBGbG9hdDMyQXJyYXkobiAvIDIpO1xuICAgIGNvbnN0IGltYWcgPSBuZXcgRmxvYXQzMkFycmF5KG4gLyAyKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGguY2VpbChuIC8gMik7IGkrKykge1xuICAgICAgICBjb25zdCB4ID0gKGludmVyc2UgPyAyIDogLTIpICogTWF0aC5QSSAqIChpIC8gbik7XG4gICAgICAgIHJlYWxbaV0gPSBNYXRoLmNvcyh4KTtcbiAgICAgICAgaW1hZ1tpXSA9IE1hdGguc2luKHgpO1xuICAgIH1cbiAgICByZXR1cm4geyByZWFsLCBpbWFnIH07XG59XG4vKipcbiAqIE1ha2UgdGhlIGV4cG9uZW50IHRlcm0gdXNlZCBieSBGRlQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHBvbmVudChrLCBuLCBpbnZlcnNlKSB7XG4gICAgY29uc3QgeCA9IChpbnZlcnNlID8gMiA6IC0yKSAqIE1hdGguUEkgKiAoayAvIG4pO1xuICAgIGNvbnN0IHJlYWwgPSBNYXRoLmNvcyh4KTtcbiAgICBjb25zdCBpbWFnID0gTWF0aC5zaW4oeCk7XG4gICAgcmV0dXJuIHsgcmVhbCwgaW1hZyB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29tcGxleF91dGlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWxfYmFzZSc7XG5jb25zdCBBUlJPVyA9ICctPic7XG5jb25zdCBBUlJPV19SRUdFWCA9IC8tPi9nO1xuY29uc3QgQ09NTUEgPSAnLCc7XG5jb25zdCBFTExJUFNJUyA9ICcuLi4nO1xuLyoqXG4gKiBQYXJzZSBhbiBlcXVhdGlvbiBmb3IgZWluc3VtLlxuICpcbiAqIEBwYXJhbSBlcXVhdGlvbiBUaGUgZWluc3VtIGVxdWF0aW9uIChlLmcuLCBcImlqLGprLT5pa1wiKS5cbiAqIEBwYXJhbSBudW1UZW5zb3JzIE51bWJlciBvZiB0ZW5zb3JzIHByb3ZpZGVkIGFsb25nIHdpdGggYGVxdWF0aW9uYC4gVXNlZCB0b1xuICogICBjaGVjayBtYXRjaGluZyBudW1iZXIgb2YgaW5wdXQgdGVuc29ycy5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCBjb25zaXN0aW5nIG9mIHRoZSBmb2xsb3dpbmcgZmllbGRzOlxuICogICAtIGFsbERpbXM6IGFsbCBkaW1lbnNpb24gbmFtZXMgYXMgc3RyaW5ncy5cbiAqICAgLSBzdW1tZWREaW1zOiBhIGxpc3Qgb2YgYWxsIGRpbWVuc2lvbnMgYmVpbmcgc3VtbWVkIG92ZXIsIGFzIGluZGljZXMgdG9cbiAqICAgICB0aGUgZWxlbWVudHMgb2YgYGFsbERpbXNgLlxuICogICAtIGlkRGltczogaW5kaWNlcyBvZiB0aGUgZGltZW5zaW9ucyBpbiBlYWNoIGlucHV0IHRlbnNvciwgYXMgaW5kaWNlcyB0b1xuICogICAgIHRoZSBlbGVtZW50cyBvZiBgYWxsRGltcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUVpbnN1bUVxdWF0aW9uKGVxdWF0aW9uLCBudW1UZW5zb3JzKSB7XG4gICAgZXF1YXRpb24gPSBlcXVhdGlvbi5yZXBsYWNlKC9cXHMvZywgJycpOyAvLyBSZW1vdmUgd2l0ZXNwYWNlIGluIGVxdWF0aW9uLlxuICAgIGNvbnN0IG51bUFycm93cyA9IChlcXVhdGlvbi5sZW5ndGggLSBlcXVhdGlvbi5yZXBsYWNlKEFSUk9XX1JFR0VYLCAnJykubGVuZ3RoKSAvXG4gICAgICAgIEFSUk9XLmxlbmd0aDtcbiAgICBpZiAobnVtQXJyb3dzIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VxdWF0aW9ucyB3aXRob3V0IGFuIGFycm93IGFyZSBub3Qgc3VwcG9ydGVkLicpO1xuICAgIH1cbiAgICBlbHNlIGlmIChudW1BcnJvd3MgPiAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXF1YXRpb24gbXVzdCBjb250YWluIGV4YWN0bHkgb25lIGFycm93IChcIiR7QVJST1d9XCIpLmApO1xuICAgIH1cbiAgICBjb25zdCBbaW5wdXRTdHJpbmcsIG91dHB1dFN0cmluZ10gPSBlcXVhdGlvbi5zcGxpdChBUlJPVyk7XG4gICAgYXNzZXJ0KGlucHV0U3RyaW5nLmluZGV4T2YoRUxMSVBTSVMpID09PSAtMSwgKCkgPT4gYFRoZSBlbGxpcHNpcyBub3RhdGlvbiAoXCIke0VMTElQU0lTfVwiKSBpcyBub3Qgc3VwcG9ydGVkIHlldC5gKTtcbiAgICBjb25zdCBpbnB1dFRlcm1zID0gaW5wdXRTdHJpbmcuc3BsaXQoQ09NTUEpO1xuICAgIGNvbnN0IG51bUlucHV0cyA9IGlucHV0VGVybXMubGVuZ3RoO1xuICAgIGlmIChudW1UZW5zb3JzICE9PSBudW1JbnB1dHMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke251bUlucHV0c30gaW5wdXQgdGVuc29ycywgcmVjZWl2ZWQgJHtudW1UZW5zb3JzfWApO1xuICAgIH1cbiAgICBpZiAobnVtSW5wdXRzID4gMikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N1cHBvcnQgZm9yIG1vcmUgdGhhbiAyIGlucHV0IHRlbnNvcnMgaXMgbm90IGltcGxlbWVudGVkIHlldC4nKTtcbiAgICB9XG4gICAgY29uc3QgYWxsRGltcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0cHV0U3RyaW5nLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IGRpbU5hbWUgPSBvdXRwdXRTdHJpbmdbaV07XG4gICAgICAgIGlmICghaW5wdXRUZXJtcy5zb21lKGlucHV0VGVybSA9PiBpbnB1dFRlcm0uaW5kZXhPZihkaW1OYW1lKSAhPT0gLTEpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE91dHB1dCBzdWJzY3JpcHRzIGNvbnRhaW4gdGhlIGxhYmVsICR7ZGltTmFtZX0gYCArXG4gICAgICAgICAgICAgICAgYG5vdCBwcmVzZW50IGluIHRoZSBpbnB1dCBzdWJzY3JpcHRzLmApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbGxEaW1zLmluZGV4T2YoZGltTmFtZSkgPT09IC0xKSB7XG4gICAgICAgICAgICBhbGxEaW1zLnB1c2goZGltTmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dFN0cmluZy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBkaW1OYW1lID0gaW5wdXRTdHJpbmdbaV07XG4gICAgICAgIGlmIChhbGxEaW1zLmluZGV4T2YoZGltTmFtZSkgPT09IC0xICYmIGRpbU5hbWUgIT09IENPTU1BKSB7XG4gICAgICAgICAgICBhbGxEaW1zLnB1c2goZGltTmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaWREaW1zID0gbmV3IEFycmF5KGlucHV0VGVybXMubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUlucHV0czsgKytpKSB7XG4gICAgICAgIGlmIChuZXcgU2V0KGlucHV0VGVybXNbaV0uc3BsaXQoJycpKS5zaXplICE9PSBpbnB1dFRlcm1zW2ldLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGb3VuZCBkdXBsaWNhdGUgYXhlcyBpbiBpbnB1dCBjb21wb25lbnQgJHtpbnB1dFRlcm1zW2ldfS4gYCArXG4gICAgICAgICAgICAgICAgYFN1cHBvcnQgZm9yIGR1cGxpY2F0ZSBheGVzIGluIGlucHV0IGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWREaW1zW2ldID0gW107XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaW5wdXRUZXJtc1tpXS5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgaWREaW1zW2ldLnB1c2goYWxsRGltcy5pbmRleE9mKGlucHV0VGVybXNbaV1bal0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBudW1EaW1zID0gYWxsRGltcy5sZW5ndGg7IC8vIE51bWJlciBvZiB1bmlxdWUgZGltZW5zaW9ucy5cbiAgICBjb25zdCBudW1PdXREaW1zID0gb3V0cHV0U3RyaW5nLmxlbmd0aDsgLy8gTnVtYmVyIG9mIG91dHB1dCBkaW1lbnNpb25zLlxuICAgIGNvbnN0IHN1bW1lZERpbXMgPSBbXTsgLy8gRGltZW5zaW9ucyBiZWluZyBzdW1tZWQgb3Zlci5cbiAgICBmb3IgKGxldCBpID0gbnVtT3V0RGltczsgaSA8IG51bURpbXM7ICsraSkge1xuICAgICAgICBzdW1tZWREaW1zLnB1c2goaSk7XG4gICAgfVxuICAgIHJldHVybiB7IGFsbERpbXMsIHN1bW1lZERpbXMsIGlkRGltcyB9O1xufVxuLyoqXG4gKiBHZXQgdGhlIHBlcm11dGF0aW9uIGZvciBhIGdpdmVuIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAcGFyYW0gbkRpbXMgVG90YWwgbnVtYmVyIG9mIGRpbWVuc2lvbiBvZiBhbGwgdGVuc29ycyBpbnZvbHZlZCBpbiB0aGUgZWluc3VtXG4gKiAgIG9wZXJhdGlvbi5cbiAqIEBwYXJhbSBpZERpbXMgRGltZW5zaW9uIGluZGljZXMgaW52b2x2ZSBpbiB0aGUgdGVuc29yIGluIHF1ZXN0aW9uLlxuICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnNpc3Rpbmcgb2YgdGhlIGZvbGxvd2luZyBmaWVsZHM6XG4gKiAgIC0gcGVybXV0YXRpb25JbmRpY2VzOiBJbmRpY2VzIHRvIHBlcm11dGUgdGhlIGF4ZXMgb2YgdGhlIHRlbnNvciB3aXRoLlxuICogICAtIGV4cGFuZERpbXM6IEluZGljZXMgdG8gdGhlIGRpbWVuc2lvbiB0aGF0IG5lZWQgdG8gYmUgZXhwYW5kZWQgZnJvbSB0aGVcbiAqICAgICB0ZW5zb3IgYWZ0ZXIgcGVybXV0YXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFaW5zdW1QZXJtdXRhdGlvbihuRGltcywgaWREaW1zKSB7XG4gICAgbGV0IHBlcm11dGF0aW9uSW5kaWNlcyA9IG5ldyBBcnJheShuRGltcyk7XG4gICAgcGVybXV0YXRpb25JbmRpY2VzLmZpbGwoLTEpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaWREaW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHBlcm11dGF0aW9uSW5kaWNlc1tpZERpbXNbaV1dID0gaTtcbiAgICB9XG4gICAgY29uc3QgZXhwYW5kRGltcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbkRpbXM7ICsraSkge1xuICAgICAgICBpZiAocGVybXV0YXRpb25JbmRpY2VzW2ldID09PSAtMSkge1xuICAgICAgICAgICAgZXhwYW5kRGltcy5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHBlcm11dGF0aW9uSW5kaWNlcyA9IHBlcm11dGF0aW9uSW5kaWNlcy5maWx0ZXIoZCA9PiBkICE9PSAtMSk7XG4gICAgcmV0dXJuIHsgcGVybXV0YXRpb25JbmRpY2VzLCBleHBhbmREaW1zIH07XG59XG4vKipcbiAqIENoZWNrcyB0aGF0IHRoZSBkaW1lbnNpb24gc2l6ZXMgZnJvbSBkaWZmZXJlbnQgaW5wdXQgdGVuc29ycyBtYXRjaCB0aGVcbiAqIGVxdWF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tFaW5zdW1EaW1TaXplcyhuRGltcywgaWREaW1zLCB0ZW5zb3JzKSB7XG4gICAgY29uc3QgZGltU2l6ZXMgPSBuZXcgQXJyYXkobkRpbXMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGVuc29ycy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBzaGFwZSA9IHRlbnNvcnNbaV0uc2hhcGU7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaWREaW1zW2ldLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICBpZiAoZGltU2l6ZXNbaWREaW1zW2ldW2pdXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZGltU2l6ZXNbaWREaW1zW2ldW2pdXSA9IHNoYXBlW2pdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KGRpbVNpemVzW2lkRGltc1tpXVtqXV0gPT09IHNoYXBlW2pdLCAoKSA9PiBgRXhwZWN0ZWQgZGltZW5zaW9uICR7ZGltU2l6ZXNbaWREaW1zW2ldW2pdXX0gYXQgYXhpcyAke2p9IGAgK1xuICAgICAgICAgICAgICAgICAgICBgb2YgaW5wdXQgc2hhcGVkICR7SlNPTi5zdHJpbmdpZnkoc2hhcGUpfSwgYCArXG4gICAgICAgICAgICAgICAgICAgIGBidXQgZ290IGRpbWVuc2lvbiAke3NoYXBlW2pdfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBHZXRzIHBhdGggb2YgY29tcHV0YXRpb24gZm9yIGVpbnN1bS5cbiAqXG4gKiBAcGFyYW0gc3VtbWVkRGltcyBpbmRpY2VzIHRvIHRoZSBkaW1lbnNpb25zIGJlaW5nIHN1bW1lZCBvdmVyLlxuICogQHBhcmFtIGlkRGltcyBBIGxvb2sgdXAgdGFibGUgZm9yIHRoZSBkaW1lbnNpb25zIHByZXNlbnQgaW4gZWFjaCBpbnB1dFxuICogICAgIHRlbnNvci4gRWFjaCBjb25zaXR1ZW50IGFycmF5IGNvbnRhaW5zIGluZGljZXMgZm9yIHRoZSBkaW1lbnNpb25zIGluIHRoZVxuICogICAgIGNvcnJlc3BvbmRpbmcgaW5wdXQgdGVuc29yLlxuICpcbiAqIEByZXR1cm4gQSBtYXAgd2l0aCB0d28gZmllbGRzOlxuICogICAtIHBhdGg6IFRoZSBwYXRoIG9mIGNvbXB1dGF0aW9uLCB3aXRoIGVhY2ggZWxlbWVudCBpbmRpY2F0aW5nIHRoZSBkaW1lbnNpb25cbiAqICAgICBiZWluZyBzdW1tZWQgb3ZlciBhZnRlciB0aGUgZWxlbWVudC13aXNlIG11bHRpcGxpY2F0aW9uIGluIHRoYXQgc3RlcC5cbiAqICAgLSBzdGVwczogV2l0aCB0aGUgc2FtZSBsZW5ndGggYXMgYHBhdGhgLiBFYWNoIGVsZW1lbnQgY29udGFpbnMgdGhlIGluZGljZXNcbiAqICAgICB0byB0aGUgaW5wdXQgdGVuc29ycyBiZWluZyB1c2VkIGZvciBlbGVtZW50LXdpc2UgbXVsdGlwbGljYXRpb24gaW4gdGhlXG4gKiAgICAgY29ycmVzcG9uZGluZyBzdGVwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWluc3VtQ29tcHV0ZVBhdGgoc3VtbWVkRGltcywgaWREaW1zKSB7XG4gICAgY29uc3QgcGF0aCA9IHN1bW1lZERpbXM7XG4gICAgY29uc3Qgc3RlcHMgPSBbXTtcbiAgICBsZXQgblN0ZXBzID0gMDtcbiAgICBpZiAoc3VtbWVkRGltcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gRWluc3VtIHRoYXQgaW52b2xlcyBubyBzdW1taW5nOiBlLmcuLCB0cmFuc3Bvc2UgYW5kIG91dGVyIHByb2R1Y3QuXG4gICAgICAgIHBhdGgucHVzaCgtMSk7XG4gICAgfVxuICAgIG5TdGVwcyA9IHN1bW1lZERpbXMubGVuZ3RoICsgMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5TdGVwczsgKytpKSB7XG4gICAgICAgIHN0ZXBzLnB1c2goW10pO1xuICAgIH1cbiAgICBjb25zdCBjb21wdXRlZFRlcm1JbmRpY2VzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IHN1bW1lZERpbSA9IHBhdGhbaV07XG4gICAgICAgIGNvbnN0IHRlcm1JbmRpY2VzID0gZmluZFRlcm1zV2l0aERpbShpZERpbXMsIHN1bW1lZERpbSk7XG4gICAgICAgIGZvciAoY29uc3QgdGVybUluZGV4IG9mIHRlcm1JbmRpY2VzKSB7XG4gICAgICAgICAgICBpZiAoY29tcHV0ZWRUZXJtSW5kaWNlcy5pbmRleE9mKHRlcm1JbmRleCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgc3RlcHNbaV0ucHVzaCh0ZXJtSW5kZXgpO1xuICAgICAgICAgICAgICAgIGNvbXB1dGVkVGVybUluZGljZXMucHVzaCh0ZXJtSW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IHBhdGgsIHN0ZXBzIH07XG59XG4vKiogRGV0ZXJtaW5lcyBpZiBhbiBheGVzIHBlcm11dGF0aW9uIGlzIHRoZSBpZGVudGl0eSBwZXJtdXRhdGlvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0lkZW50aXR5UGVybXV0YXRpb24ocGVybSkge1xuICAgIHJldHVybiBwZXJtLmV2ZXJ5KChkaW0sIGluZGV4KSA9PiBkaW0gPT09IGluZGV4KTtcbn1cbmZ1bmN0aW9uIGZpbmRUZXJtc1dpdGhEaW0oaWREaW1zLCBkaW0pIHtcbiAgICBjb25zdCB0ZXJtSW5kaWNlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaWREaW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmIChpZERpbXNbaV0ubGVuZ3RoID09PSAwIHx8IGlkRGltc1tpXS5pbmRleE9mKGRpbSkgIT09IC0xIHx8IGRpbSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRlcm1JbmRpY2VzLnB1c2goaSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRlcm1JbmRpY2VzO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZWluc3VtX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuZXhwb3J0IHsgbm9uTWF4U3VwcHJlc3Npb25WM0ltcGwsIG5vbk1heFN1cHByZXNzaW9uVjRJbXBsLCBub25NYXhTdXBwcmVzc2lvblY1SW1wbCB9IGZyb20gJy4vbm9uX21heF9zdXBwcmVzc2lvbl9pbXBsJztcbmV4cG9ydCB7IHdoZXJlSW1wbCB9IGZyb20gJy4vd2hlcmVfaW1wbCc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1rZXJuZWxfaW1wbHMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmluYXJ5SW5zZXJ0IH0gZnJvbSAnLi9ub25fbWF4X3N1cHByZXNzaW9uX3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIG5vbk1heFN1cHByZXNzaW9uVjNJbXBsKGJveGVzLCBzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQpIHtcbiAgICByZXR1cm4gbm9uTWF4U3VwcHJlc3Npb25JbXBsXyhib3hlcywgc2NvcmVzLCBtYXhPdXRwdXRTaXplLCBpb3VUaHJlc2hvbGQsIHNjb3JlVGhyZXNob2xkLCAwIC8qIHNvZnRObXNTaWdtYSAqLyk7XG59XG5leHBvcnQgZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25WNEltcGwoYm94ZXMsIHNjb3JlcywgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCwgcGFkVG9NYXhPdXRwdXRTaXplKSB7XG4gICAgcmV0dXJuIG5vbk1heFN1cHByZXNzaW9uSW1wbF8oYm94ZXMsIHNjb3JlcywgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCwgMCAvKiBzb2Z0Tm1zU2lnbWEgKi8sIGZhbHNlIC8qIHJldHVyblNjb3Jlc1RlbnNvciAqLywgcGFkVG9NYXhPdXRwdXRTaXplIC8qIHBhZFRvTWF4T3V0cHV0U2l6ZSAqLywgdHJ1ZVxuICAgIC8qIHJldHVyblZhbGlkT3V0cHV0cyAqLyApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG5vbk1heFN1cHByZXNzaW9uVjVJbXBsKGJveGVzLCBzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsIHNvZnRObXNTaWdtYSkge1xuICAgIHJldHVybiBub25NYXhTdXBwcmVzc2lvbkltcGxfKGJveGVzLCBzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsIHNvZnRObXNTaWdtYSwgdHJ1ZSAvKiByZXR1cm5TY29yZXNUZW5zb3IgKi8pO1xufVxuZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25JbXBsXyhib3hlcywgc2NvcmVzLCBtYXhPdXRwdXRTaXplLCBpb3VUaHJlc2hvbGQsIHNjb3JlVGhyZXNob2xkLCBzb2Z0Tm1zU2lnbWEsIHJldHVyblNjb3Jlc1RlbnNvciA9IGZhbHNlLCBwYWRUb01heE91dHB1dFNpemUgPSBmYWxzZSwgcmV0dXJuVmFsaWRPdXRwdXRzID0gZmFsc2UpIHtcbiAgICAvLyBUaGUgbGlzdCBpcyBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyLCBzbyB0aGF0IHdlIGNhbiBhbHdheXMgcG9wIHRoZVxuICAgIC8vIGNhbmRpZGF0ZSB3aXRoIHRoZSBsYXJnZXN0IHNjb3JlIGluIE8oMSkgdGltZS5cbiAgICBjb25zdCBjYW5kaWRhdGVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY29yZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHNjb3Jlc1tpXSA+IHNjb3JlVGhyZXNob2xkKSB7XG4gICAgICAgICAgICBjYW5kaWRhdGVzLnB1c2goeyBzY29yZTogc2NvcmVzW2ldLCBib3hJbmRleDogaSwgc3VwcHJlc3NCZWdpbkluZGV4OiAwIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhbmRpZGF0ZXMuc29ydChhc2NlbmRpbmdDb21wYXJhdG9yKTtcbiAgICAvLyBJZiBzb2Z0Tm1zU2lnbWEgaXMgMCwgdGhlIG91dGNvbWUgb2YgdGhpcyBhbGdvcml0aG0gaXMgZXhhY3RseSBzYW1lIGFzXG4gICAgLy8gYmVmb3JlLlxuICAgIGNvbnN0IHNjYWxlID0gc29mdE5tc1NpZ21hID4gMCA/ICgtMC41IC8gc29mdE5tc1NpZ21hKSA6IDAuMDtcbiAgICBjb25zdCBzZWxlY3RlZEluZGljZXMgPSBbXTtcbiAgICBjb25zdCBzZWxlY3RlZFNjb3JlcyA9IFtdO1xuICAgIHdoaWxlIChzZWxlY3RlZEluZGljZXMubGVuZ3RoIDwgbWF4T3V0cHV0U2l6ZSAmJiBjYW5kaWRhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gY2FuZGlkYXRlcy5wb3AoKTtcbiAgICAgICAgY29uc3QgeyBzY29yZTogb3JpZ2luYWxTY29yZSwgYm94SW5kZXgsIHN1cHByZXNzQmVnaW5JbmRleCB9ID0gY2FuZGlkYXRlO1xuICAgICAgICBpZiAob3JpZ2luYWxTY29yZSA8IHNjb3JlVGhyZXNob2xkKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLyBPdmVybGFwcGluZyBib3hlcyBhcmUgbGlrZWx5IHRvIGhhdmUgc2ltaWxhciBzY29yZXMsIHRoZXJlZm9yZSB3ZVxuICAgICAgICAvLyBpdGVyYXRlIHRocm91Z2ggdGhlIHByZXZpb3VzbHkgc2VsZWN0ZWQgYm94ZXMgYmFja3dhcmRzIGluIG9yZGVyIHRvXG4gICAgICAgIC8vIHNlZSBpZiBjYW5kaWRhdGUncyBzY29yZSBzaG91bGQgYmUgc3VwcHJlc3NlZC4gV2UgdXNlXG4gICAgICAgIC8vIHN1cHByZXNzQmVnaW5JbmRleCB0byB0cmFjayBhbmQgZW5zdXJlIGEgY2FuZGlkYXRlIGNhbiBiZSBzdXBwcmVzc2VkXG4gICAgICAgIC8vIGJ5IGEgc2VsZWN0ZWQgYm94IG5vIG1vcmUgdGhhbiBvbmNlLiBBbHNvLCBpZiB0aGUgb3ZlcmxhcCBleGNlZWRzXG4gICAgICAgIC8vIGlvdVRocmVzaG9sZCwgd2Ugc2ltcGx5IGlnbm9yZSB0aGUgY2FuZGlkYXRlLlxuICAgICAgICBsZXQgaWdub3JlQ2FuZGlkYXRlID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGogPSBzZWxlY3RlZEluZGljZXMubGVuZ3RoIC0gMTsgaiA+PSBzdXBwcmVzc0JlZ2luSW5kZXg7IC0taikge1xuICAgICAgICAgICAgY29uc3QgaW91ID0gaW50ZXJzZWN0aW9uT3ZlclVuaW9uKGJveGVzLCBib3hJbmRleCwgc2VsZWN0ZWRJbmRpY2VzW2pdKTtcbiAgICAgICAgICAgIGlmIChpb3UgPj0gaW91VGhyZXNob2xkKSB7XG4gICAgICAgICAgICAgICAgaWdub3JlQ2FuZGlkYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbmRpZGF0ZS5zY29yZSA9XG4gICAgICAgICAgICAgICAgY2FuZGlkYXRlLnNjb3JlICogc3VwcHJlc3NXZWlnaHQoaW91VGhyZXNob2xkLCBzY2FsZSwgaW91KTtcbiAgICAgICAgICAgIGlmIChjYW5kaWRhdGUuc2NvcmUgPD0gc2NvcmVUaHJlc2hvbGQpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCBpZiBgY2FuZGlkYXRlLnNjb3JlYCBoYXMgbm90IGRyb3BwZWQgYmVsb3dcbiAgICAgICAgLy8gYHNjb3JlVGhyZXNob2xkYCwgdGhlbiB3ZSBrbm93IHRoYXQgd2Ugd2VudCB0aHJvdWdoIGFsbCBvZiB0aGVcbiAgICAgICAgLy8gcHJldmlvdXMgc2VsZWN0aW9ucyBhbmQgY2FuIHNhZmVseSB1cGRhdGUgYHN1cHByZXNzQmVnaW5JbmRleGAgdG8gdGhlXG4gICAgICAgIC8vIGVuZCBvZiB0aGUgc2VsZWN0ZWQgYXJyYXkuIFRoZW4gd2UgY2FuIHJlLWluc2VydCB0aGUgY2FuZGlkYXRlIHdpdGhcbiAgICAgICAgLy8gdGhlIHVwZGF0ZWQgc2NvcmUgYW5kIHN1cHByZXNzQmVnaW5JbmRleCBiYWNrIGluIHRoZSBjYW5kaWRhdGUgbGlzdC5cbiAgICAgICAgLy8gSWYgb24gdGhlIG90aGVyIGhhbmQsIGBjYW5kaWRhdGUuc2NvcmVgIGhhcyBkcm9wcGVkIGJlbG93IHRoZSBzY29yZVxuICAgICAgICAvLyB0aHJlc2hvbGQsIHdlIHdpbGwgbm90IGFkZCBpdCBiYWNrIHRvIHRoZSBjYW5kaWRhdGVzIGxpc3QuXG4gICAgICAgIGNhbmRpZGF0ZS5zdXBwcmVzc0JlZ2luSW5kZXggPSBzZWxlY3RlZEluZGljZXMubGVuZ3RoO1xuICAgICAgICBpZiAoIWlnbm9yZUNhbmRpZGF0ZSkge1xuICAgICAgICAgICAgLy8gQ2FuZGlkYXRlIGhhcyBwYXNzZWQgYWxsIHRoZSB0ZXN0cywgYW5kIGlzIG5vdCBzdXBwcmVzc2VkLCBzb1xuICAgICAgICAgICAgLy8gc2VsZWN0IHRoZSBjYW5kaWRhdGUuXG4gICAgICAgICAgICBpZiAoY2FuZGlkYXRlLnNjb3JlID09PSBvcmlnaW5hbFNjb3JlKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRJbmRpY2VzLnB1c2goYm94SW5kZXgpO1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkU2NvcmVzLnB1c2goY2FuZGlkYXRlLnNjb3JlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNhbmRpZGF0ZS5zY29yZSA+IHNjb3JlVGhyZXNob2xkKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2FuZGlkYXRlJ3Mgc2NvcmUgaXMgc3VwcHJlc3NlZCBidXQgaXMgc3RpbGwgaGlnaCBlbm91Z2ggdG8gYmVcbiAgICAgICAgICAgICAgICAvLyBjb25zaWRlcmVkLCBzbyBhZGQgYmFjayB0byB0aGUgY2FuZGlkYXRlcyBsaXN0LlxuICAgICAgICAgICAgICAgIGJpbmFyeUluc2VydChjYW5kaWRhdGVzLCBjYW5kaWRhdGUsIGFzY2VuZGluZ0NvbXBhcmF0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIE5vbk1heFN1cHByZXNzaW9uVjQgZmVhdHVyZTogcGFkZGluZyBvdXRwdXQgdG8gbWF4T3V0cHV0U2l6ZS5cbiAgICBjb25zdCB2YWxpZE91dHB1dHMgPSBzZWxlY3RlZEluZGljZXMubGVuZ3RoO1xuICAgIGNvbnN0IGVsZW1zVG9QYWQgPSBtYXhPdXRwdXRTaXplIC0gdmFsaWRPdXRwdXRzO1xuICAgIGlmIChwYWRUb01heE91dHB1dFNpemUgJiYgZWxlbXNUb1BhZCA+IDApIHtcbiAgICAgICAgc2VsZWN0ZWRJbmRpY2VzLnB1c2goLi4ubmV3IEFycmF5KGVsZW1zVG9QYWQpLmZpbGwoMCkpO1xuICAgICAgICBzZWxlY3RlZFNjb3Jlcy5wdXNoKC4uLm5ldyBBcnJheShlbGVtc1RvUGFkKS5maWxsKDAuMCkpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSB7IHNlbGVjdGVkSW5kaWNlcyB9O1xuICAgIGlmIChyZXR1cm5TY29yZXNUZW5zb3IpIHtcbiAgICAgICAgcmVzdWx0WydzZWxlY3RlZFNjb3JlcyddID0gc2VsZWN0ZWRTY29yZXM7XG4gICAgfVxuICAgIGlmIChyZXR1cm5WYWxpZE91dHB1dHMpIHtcbiAgICAgICAgcmVzdWx0Wyd2YWxpZE91dHB1dHMnXSA9IHZhbGlkT3V0cHV0cztcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGludGVyc2VjdGlvbk92ZXJVbmlvbihib3hlcywgaSwgaikge1xuICAgIGNvbnN0IGlDb29yZCA9IGJveGVzLnN1YmFycmF5KGkgKiA0LCBpICogNCArIDQpO1xuICAgIGNvbnN0IGpDb29yZCA9IGJveGVzLnN1YmFycmF5KGogKiA0LCBqICogNCArIDQpO1xuICAgIGNvbnN0IHltaW5JID0gTWF0aC5taW4oaUNvb3JkWzBdLCBpQ29vcmRbMl0pO1xuICAgIGNvbnN0IHhtaW5JID0gTWF0aC5taW4oaUNvb3JkWzFdLCBpQ29vcmRbM10pO1xuICAgIGNvbnN0IHltYXhJID0gTWF0aC5tYXgoaUNvb3JkWzBdLCBpQ29vcmRbMl0pO1xuICAgIGNvbnN0IHhtYXhJID0gTWF0aC5tYXgoaUNvb3JkWzFdLCBpQ29vcmRbM10pO1xuICAgIGNvbnN0IHltaW5KID0gTWF0aC5taW4oakNvb3JkWzBdLCBqQ29vcmRbMl0pO1xuICAgIGNvbnN0IHhtaW5KID0gTWF0aC5taW4oakNvb3JkWzFdLCBqQ29vcmRbM10pO1xuICAgIGNvbnN0IHltYXhKID0gTWF0aC5tYXgoakNvb3JkWzBdLCBqQ29vcmRbMl0pO1xuICAgIGNvbnN0IHhtYXhKID0gTWF0aC5tYXgoakNvb3JkWzFdLCBqQ29vcmRbM10pO1xuICAgIGNvbnN0IGFyZWFJID0gKHltYXhJIC0geW1pbkkpICogKHhtYXhJIC0geG1pbkkpO1xuICAgIGNvbnN0IGFyZWFKID0gKHltYXhKIC0geW1pbkopICogKHhtYXhKIC0geG1pbkopO1xuICAgIGlmIChhcmVhSSA8PSAwIHx8IGFyZWFKIDw9IDApIHtcbiAgICAgICAgcmV0dXJuIDAuMDtcbiAgICB9XG4gICAgY29uc3QgaW50ZXJzZWN0aW9uWW1pbiA9IE1hdGgubWF4KHltaW5JLCB5bWluSik7XG4gICAgY29uc3QgaW50ZXJzZWN0aW9uWG1pbiA9IE1hdGgubWF4KHhtaW5JLCB4bWluSik7XG4gICAgY29uc3QgaW50ZXJzZWN0aW9uWW1heCA9IE1hdGgubWluKHltYXhJLCB5bWF4Sik7XG4gICAgY29uc3QgaW50ZXJzZWN0aW9uWG1heCA9IE1hdGgubWluKHhtYXhJLCB4bWF4Sik7XG4gICAgY29uc3QgaW50ZXJzZWN0aW9uQXJlYSA9IE1hdGgubWF4KGludGVyc2VjdGlvblltYXggLSBpbnRlcnNlY3Rpb25ZbWluLCAwLjApICpcbiAgICAgICAgTWF0aC5tYXgoaW50ZXJzZWN0aW9uWG1heCAtIGludGVyc2VjdGlvblhtaW4sIDAuMCk7XG4gICAgcmV0dXJuIGludGVyc2VjdGlvbkFyZWEgLyAoYXJlYUkgKyBhcmVhSiAtIGludGVyc2VjdGlvbkFyZWEpO1xufVxuLy8gQSBHYXVzc2lhbiBwZW5hbHR5IGZ1bmN0aW9uLCB0aGlzIG1ldGhvZCBhbHdheXMgcmV0dXJucyB2YWx1ZXMgaW4gWzAsIDFdLlxuLy8gVGhlIHdlaWdodCBpcyBhIGZ1bmN0aW9uIG9mIHNpbWlsYXJpdHksIHRoZSBtb3JlIG92ZXJsYXAgdHdvIGJveGVzIGFyZSwgdGhlXG4vLyBzbWFsbGVyIHRoZSB3ZWlnaHQgaXMsIG1lYW5pbmcgaGlnaGx5IG92ZXJsYXBwaW5nIGJveGUgd2lsbCBiZSBzaWduaWZpY2FudGx5XG4vLyBwZW5hbGl6ZWQuIE9uIHRoZSBvdGhlciBoYW5kLCBhIG5vbi1vdmVybGFwcGluZyBib3ggd2lsbCBub3QgYmUgcGVuYWxpemVkLlxuZnVuY3Rpb24gc3VwcHJlc3NXZWlnaHQoaW91VGhyZXNob2xkLCBzY2FsZSwgaW91KSB7XG4gICAgY29uc3Qgd2VpZ2h0ID0gTWF0aC5leHAoc2NhbGUgKiBpb3UgKiBpb3UpO1xuICAgIHJldHVybiBpb3UgPD0gaW91VGhyZXNob2xkID8gd2VpZ2h0IDogMC4wO1xufVxuZnVuY3Rpb24gYXNjZW5kaW5nQ29tcGFyYXRvcihjMSwgYzIpIHtcbiAgICAvLyBGb3Igb2JqZWN0cyB3aXRoIHNhbWUgc2NvcmVzLCB3ZSBtYWtlIHRoZSBvYmplY3Qgd2l0aCB0aGUgbGFyZ2VyIGluZGV4IGdvXG4gICAgLy8gZmlyc3QuIEluIGFuIGFycmF5IHRoYXQgcG9wcyBmcm9tIHRoZSBlbmQsIHRoaXMgbWVhbnMgdGhhdCB0aGUgb2JqZWN0IHdpdGhcbiAgICAvLyB0aGUgc21hbGxlciBpbmRleCB3aWxsIGJlIHBvcHBlZCBmaXJzdC4gVGhpcyBlbnN1cmVzIHRoZSBzYW1lIG91dHB1dCBhc1xuICAgIC8vIHRoZSBUZW5zb3JGbG93IHB5dGhvbiB2ZXJzaW9uLlxuICAgIHJldHVybiAoYzEuc2NvcmUgLSBjMi5zY29yZSkgfHxcbiAgICAgICAgKChjMS5zY29yZSA9PT0gYzIuc2NvcmUpICYmIChjMi5ib3hJbmRleCAtIGMxLmJveEluZGV4KSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ub25fbWF4X3N1cHByZXNzaW9uX2ltcGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLyoqXG4gKiBJbnNlcnRzIGEgdmFsdWUgaW50byBhIHNvcnRlZCBhcnJheS4gVGhpcyBtZXRob2QgYWxsb3dzIGR1cGxpY2F0ZSwgbWVhbmluZyBpdFxuICogYWxsb3dzIGluc2VydGluZyBkdXBsaWNhdGUgdmFsdWUsIGluIHdoaWNoIGNhc2UsIHRoZSBlbGVtZW50IHdpbGwgYmUgaW5zZXJ0ZWRcbiAqIGF0IHRoZSBsb3dlc3QgaW5kZXggb2YgdGhlIHZhbHVlLlxuICogQHBhcmFtIGFyciBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICogQHBhcmFtIGVsZW1lbnQgVGhlIGVsZW1lbnQgdG8gaW5zZXJ0LlxuICogQHBhcmFtIGNvbXBhcmF0b3IgT3B0aW9uYWwuIElmIG5vIGNvbXBhcmF0b3IgaXMgc3BlY2lmaWVkLCBlbGVtZW50cyBhcmVcbiAqIGNvbXBhcmVkIHVzaW5nIGFycmF5X3V0aWwuZGVmYXVsdENvbXBhcmF0b3IsIHdoaWNoIGlzIHN1aXRhYmxlIGZvciBTdHJpbmdzXG4gKiBhbmQgTnVtYmVycyBpbiBhc2NlbmRpbmcgYXJyYXlzLiBJZiB0aGUgYXJyYXkgY29udGFpbnMgbXVsdGlwbGUgaW5zdGFuY2VzIG9mXG4gKiB0aGUgdGFyZ2V0IHZhbHVlLCB0aGUgbGVmdC1tb3N0IGluc3RhbmNlIHdpbGwgYmUgcmV0dXJuZWQuIFRvIHByb3ZpZGUgYVxuICogY29tcGFyYXRvciwgaXQgc2hvdWxkIHRha2UgMiBhcmd1bWVudHMgdG8gY29tcGFyZSBhbmQgcmV0dXJuIGEgbmVnYXRpdmUsXG4gKiB6ZXJvLCBvciBhIHBvc2l0aXZlIG51bWJlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmFyeUluc2VydChhcnIsIGVsZW1lbnQsIGNvbXBhcmF0b3IpIHtcbiAgICBjb25zdCBpbmRleCA9IGJpbmFyeVNlYXJjaChhcnIsIGVsZW1lbnQsIGNvbXBhcmF0b3IpO1xuICAgIGNvbnN0IGluc2VydGlvblBvaW50ID0gaW5kZXggPCAwID8gLShpbmRleCArIDEpIDogaW5kZXg7XG4gICAgYXJyLnNwbGljZShpbnNlcnRpb25Qb2ludCwgMCwgZWxlbWVudCk7XG59XG4vKipcbiAqIFNlYXJjaGVzIHRoZSBhcnJheSBmb3IgdGhlIHRhcmdldCB1c2luZyBiaW5hcnkgc2VhcmNoLCByZXR1cm5zIHRoZSBpbmRleFxuICogb2YgdGhlIGZvdW5kIGVsZW1lbnQsIG9yIHBvc2l0aW9uIHRvIGluc2VydCBpZiBlbGVtZW50IG5vdCBmb3VuZC4gSWYgbm9cbiAqIGNvbXBhcmF0b3IgaXMgc3BlY2lmaWVkLCBlbGVtZW50cyBhcmUgY29tcGFyZWQgdXNpbmcgYXJyYXlfXG4gKiB1dGlsLmRlZmF1bHRDb21wYXJhdG9yLCB3aGljaCBpcyBzdWl0YWJsZSBmb3IgU3RyaW5ncyBhbmQgTnVtYmVycyBpblxuICogYXNjZW5kaW5nIGFycmF5cy4gSWYgdGhlIGFycmF5IGNvbnRhaW5zIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgdGFyZ2V0XG4gKiB2YWx1ZSwgdGhlIGxlZnQtbW9zdCBpbnN0YW5jZSB3aWxsIGJlIHJldHVybmVkLlxuICogQHBhcmFtIGFyciBUaGUgYXJyYXkgdG8gYmUgc2VhcmNoZWQgaW4uXG4gKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgdG8gYmUgc2VhcmNoZWQgZm9yLlxuICogQHBhcmFtIGNvbXBhcmF0b3IgU2hvdWxkIHRha2UgMiBhcmd1bWVudHMgdG8gY29tcGFyZSBhbmQgcmV0dXJuIGEgbmVnYXRpdmUsXG4gKiAgICB6ZXJvLCBvciBhIHBvc2l0aXZlIG51bWJlci5cbiAqIEByZXR1cm4gTG93ZXN0IGluZGV4IG9mIHRoZSB0YXJnZXQgdmFsdWUgaWYgZm91bmQsIG90aGVyd2lzZSB0aGUgaW5zZXJ0aW9uXG4gKiAgICBwb2ludCB3aGVyZSB0aGUgdGFyZ2V0IHNob3VsZCBiZSBpbnNlcnRlZCwgaW4gdGhlIGZvcm0gb2ZcbiAqICAgICgtaW5zZXJ0aW9uUG9pbnQgLSAxKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmFyeVNlYXJjaChhcnIsIHRhcmdldCwgY29tcGFyYXRvcikge1xuICAgIHJldHVybiBiaW5hcnlTZWFyY2hfKGFyciwgdGFyZ2V0LCBjb21wYXJhdG9yIHx8IGRlZmF1bHRDb21wYXJhdG9yKTtcbn1cbi8qKlxuICogQ29tcGFyZXMgaXRzIHR3byBhcmd1bWVudHMgZm9yIG9yZGVyLlxuICogQHBhcmFtIGEgVGhlIGZpcnN0IGVsZW1lbnQgdG8gYmUgY29tcGFyZWQuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIGVsZW1lbnQgdG8gYmUgY29tcGFyZWQuXG4gKiBAcmV0dXJuIEEgbmVnYXRpdmUgbnVtYmVyLCB6ZXJvLCBvciBhIHBvc2l0aXZlIG51bWJlciBhcyB0aGUgZmlyc3RcbiAqICAgICBhcmd1bWVudCBpcyBsZXNzIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIHNlY29uZC5cbiAqL1xuZnVuY3Rpb24gZGVmYXVsdENvbXBhcmF0b3IoYSwgYikge1xuICAgIHJldHVybiBhID4gYiA/IDEgOiBhIDwgYiA/IC0xIDogMDtcbn1cbmZ1bmN0aW9uIGJpbmFyeVNlYXJjaF8oYXJyLCB0YXJnZXQsIGNvbXBhcmF0b3IpIHtcbiAgICBsZXQgbGVmdCA9IDA7XG4gICAgbGV0IHJpZ2h0ID0gYXJyLmxlbmd0aDtcbiAgICBsZXQgbWlkZGxlID0gMDtcbiAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICB3aGlsZSAobGVmdCA8IHJpZ2h0KSB7XG4gICAgICAgIG1pZGRsZSA9IGxlZnQgKyAoKHJpZ2h0IC0gbGVmdCkgPj4+IDEpO1xuICAgICAgICBjb25zdCBjb21wYXJlUmVzdWx0ID0gY29tcGFyYXRvcih0YXJnZXQsIGFyclttaWRkbGVdKTtcbiAgICAgICAgaWYgKGNvbXBhcmVSZXN1bHQgPiAwKSB7XG4gICAgICAgICAgICBsZWZ0ID0gbWlkZGxlICsgMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJpZ2h0ID0gbWlkZGxlO1xuICAgICAgICAgICAgLy8gSWYgY29tcGFyZVJlc3VsdCBpcyAwLCB0aGUgdmFsdWUgaXMgZm91bmQuIFdlIHJlY29yZCBpdCBpcyBmb3VuZCxcbiAgICAgICAgICAgIC8vIGFuZCB0aGVuIGtlZXAgbG9va2luZyBiZWNhdXNlIHRoZXJlIG1heSBiZSBkdXBsaWNhdGUuXG4gICAgICAgICAgICBmb3VuZCA9ICFjb21wYXJlUmVzdWx0O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3VuZCA/IGxlZnQgOiAtbGVmdCAtIDE7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ub25fbWF4X3N1cHByZXNzaW9uX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLyoqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBXaGVyZSBrZXJuZWwgc2hhcmVkIGJldHdlZW4gY3B1IGFuZCB3ZWJnbCAqL1xuaW1wb3J0IHsgYnVmZmVyIH0gZnJvbSAnLi4vb3BzL2J1ZmZlcic7XG5leHBvcnQgZnVuY3Rpb24gd2hlcmVJbXBsKGNvbmRTaGFwZSwgY29uZFZhbHMpIHtcbiAgICBjb25zdCBpbmRpY2VzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25kVmFscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoY29uZFZhbHNbaV0pIHtcbiAgICAgICAgICAgIGluZGljZXMucHVzaChpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBpbkJ1ZmZlciA9IGJ1ZmZlcihjb25kU2hhcGUsICdpbnQzMicpO1xuICAgIGNvbnN0IG91dCA9IGJ1ZmZlcihbaW5kaWNlcy5sZW5ndGgsIGNvbmRTaGFwZS5sZW5ndGhdLCAnaW50MzInKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgbG9jID0gaW5CdWZmZXIuaW5kZXhUb0xvYyhpbmRpY2VzW2ldKTtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gaSAqIGNvbmRTaGFwZS5sZW5ndGg7XG4gICAgICAgIG91dC52YWx1ZXMuc2V0KGxvYywgb2Zmc2V0KTtcbiAgICB9XG4gICAgcmV0dXJuIG91dC50b1RlbnNvcigpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d2hlcmVfaW1wbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vLyBiYXNlLnRzIGlzIHRmanMtY29yZSB3aXRob3V0IGF1dG8gcmVnaXN0cmF0aW9uIG9mIHRoaW5ncyBsaWtlIGZsYWdzLFxuLy8gZ3JhZGllbnRzLCBjaGFpbmVkIG9wcyBvciB0aGUgb3BIYW5kbGVyLiBTZWUgYmFzZV9zaWRlX2VmZmVjdHMudHMgZm9yIHBhcnRzXG4vLyB0ZmpzIGNvcmUgdGhhdCBhcmUgcmVxdWlyZWQgc2lkZSBlZmZlY3RzLlxuLyoqXG4gKiBAZmlsZW92ZXJ2aWV3XG4gKiBAc3VwcHJlc3Mge3BhcnRpYWxBbGlhc30gT3B0aW1pemF0aW9uIGRpc2FibGVkIGR1ZSB0byBwYXNzaW5nIHRoZSBtb2R1bGVcbiAqIG9iamVjdCBpbnRvIGEgZnVuY3Rpb24gYmVsb3c6XG4gKlxuICogICBpbXBvcnQgKiBhcyBvcHMgZnJvbSAnLi9vcHMvb3BzJztcbiAqICAgc2V0T3BIYW5kbGVyKG9wcyk7XG4gKi9cbi8vIFNlcmlhbGl6YXRpb24uXG5pbXBvcnQgKiBhcyBpbyBmcm9tICcuL2lvL2lvJztcbmltcG9ydCAqIGFzIG1hdGggZnJvbSAnLi9tYXRoJztcbmltcG9ydCAqIGFzIGJyb3dzZXIgZnJvbSAnLi9vcHMvYnJvd3Nlcic7XG5pbXBvcnQgKiBhcyBnYXRoZXJfdXRpbCBmcm9tICcuL29wcy9nYXRoZXJfbmRfdXRpbCc7XG5pbXBvcnQgKiBhcyBzY2F0dGVyX3V0aWwgZnJvbSAnLi9vcHMvc2NhdHRlcl9uZF91dGlsJztcbmltcG9ydCAqIGFzIHNsaWNlX3V0aWwgZnJvbSAnLi9vcHMvc2xpY2VfdXRpbCc7XG5pbXBvcnQgKiBhcyBzZXJpYWxpemF0aW9uIGZyb20gJy4vc2VyaWFsaXphdGlvbic7XG5pbXBvcnQgKiBhcyB0ZW5zb3JfdXRpbCBmcm9tICcuL3RlbnNvcl91dGlsJztcbmltcG9ydCAqIGFzIHRlc3RfdXRpbCBmcm9tICcuL3Rlc3RfdXRpbCc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4vdXRpbCc7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi92ZXJzaW9uJztcbi8vIE9wdGltaXplcnMuXG5leHBvcnQgeyBBZGFkZWx0YU9wdGltaXplciB9IGZyb20gJy4vb3B0aW1pemVycy9hZGFkZWx0YV9vcHRpbWl6ZXInO1xuZXhwb3J0IHsgQWRhZ3JhZE9wdGltaXplciB9IGZyb20gJy4vb3B0aW1pemVycy9hZGFncmFkX29wdGltaXplcic7XG5leHBvcnQgeyBBZGFtT3B0aW1pemVyIH0gZnJvbSAnLi9vcHRpbWl6ZXJzL2FkYW1fb3B0aW1pemVyJztcbmV4cG9ydCB7IEFkYW1heE9wdGltaXplciB9IGZyb20gJy4vb3B0aW1pemVycy9hZGFtYXhfb3B0aW1pemVyJztcbmV4cG9ydCB7IE1vbWVudHVtT3B0aW1pemVyIH0gZnJvbSAnLi9vcHRpbWl6ZXJzL21vbWVudHVtX29wdGltaXplcic7XG5leHBvcnQgeyBPcHRpbWl6ZXIgfSBmcm9tICcuL29wdGltaXplcnMvb3B0aW1pemVyJztcbmV4cG9ydCB7IFJNU1Byb3BPcHRpbWl6ZXIgfSBmcm9tICcuL29wdGltaXplcnMvcm1zcHJvcF9vcHRpbWl6ZXInO1xuZXhwb3J0IHsgU0dET3B0aW1pemVyIH0gZnJvbSAnLi9vcHRpbWl6ZXJzL3NnZF9vcHRpbWl6ZXInO1xuZXhwb3J0IHsgVGVuc29yLCBUZW5zb3JCdWZmZXIsIFZhcmlhYmxlIH0gZnJvbSAnLi90ZW5zb3InO1xuZXhwb3J0IHsgUmFuaywgc3VtT3V0VHlwZSwgdXBjYXN0VHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9vcHMvb3BzJztcbmV4cG9ydCB7IFJlZHVjdGlvbiB9IGZyb20gJy4vb3BzL2xvc3Nfb3BzX3V0aWxzJztcbmV4cG9ydCAqIGZyb20gJy4vdHJhaW4nO1xuZXhwb3J0ICogZnJvbSAnLi9nbG9iYWxzJztcbmV4cG9ydCAqIGZyb20gJy4va2VybmVsX3JlZ2lzdHJ5JztcbmV4cG9ydCB7IGN1c3RvbUdyYWQsIGdyYWQsIGdyYWRzLCB2YWx1ZUFuZEdyYWQsIHZhbHVlQW5kR3JhZHMsIHZhcmlhYmxlR3JhZHMgfSBmcm9tICcuL2dyYWRpZW50cyc7XG5leHBvcnQgeyBFbnZpcm9ubWVudCwgZW52LCBFTlYgfSBmcm9tICcuL2Vudmlyb25tZW50JztcbmV4cG9ydCB7IHZlcnNpb24gYXMgdmVyc2lvbl9jb3JlIH07XG4vLyBUb3AtbGV2ZWwgbWV0aG9kIGV4cG9ydHMuXG5leHBvcnQgeyBuZXh0RnJhbWUgfSBmcm9tICcuL2Jyb3dzZXJfdXRpbCc7XG4vLyBTZWNvbmQgbGV2ZWwgZXhwb3J0cy5cbmltcG9ydCAqIGFzIGJhY2tlbmRfdXRpbCBmcm9tICcuL2JhY2tlbmRzL2JhY2tlbmRfdXRpbCc7XG5pbXBvcnQgKiBhcyBkZXZpY2VfdXRpbCBmcm9tICcuL2RldmljZV91dGlsJztcbmV4cG9ydCB7IGJyb3dzZXIsIGlvLCBtYXRoLCBzZXJpYWxpemF0aW9uLCB0ZXN0X3V0aWwsIHV0aWwsIGJhY2tlbmRfdXRpbCwgdGVuc29yX3V0aWwsIHNsaWNlX3V0aWwsIGdhdGhlcl91dGlsLCBzY2F0dGVyX3V0aWwsIGRldmljZV91dGlsIH07XG5pbXBvcnQgKiBhcyBrZXJuZWxfaW1wbHMgZnJvbSAnLi9iYWNrZW5kcy9rZXJuZWxfaW1wbHMnO1xuZXhwb3J0IHsga2VybmVsX2ltcGxzIH07XG4vLyBCYWNrZW5kIHNwZWNpZmljLlxuZXhwb3J0IHsgS2VybmVsQmFja2VuZCwgRGF0YVN0b3JhZ2UgfSBmcm9tICcuL2JhY2tlbmRzL2JhY2tlbmQnO1xuLy8gRXhwb3J0IGFsbCBrZXJuZWwgbmFtZXMgLyBpbmZvLlxuZXhwb3J0ICogZnJvbSAnLi9rZXJuZWxfbmFtZXMnO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmFzZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vLyBSZXF1aXJlZCBzaWRlIGVmZmVjdGZ1bCBjb2RlIGZvciB0ZmpzLWNvcmVcbi8vIFNldCB1cCBFbmdpbmUgYW5kIEVOVlxuaW1wb3J0IHsgZ2V0T3JNYWtlRW5naW5lIH0gZnJvbSAnLi9lbmdpbmUnO1xuZ2V0T3JNYWtlRW5naW5lKCk7XG4vLyBSZWdpc3RlciBiYWNrZW5kLWFnbm9zdGljIGZsYWdzLlxuaW1wb3J0ICcuL2ZsYWdzJztcbi8vIFJlZ2lzdGVyIHBsYXRmb3Jtc1xuaW1wb3J0ICcuL3BsYXRmb3Jtcy9wbGF0Zm9ybV9icm93c2VyJztcbmltcG9ydCAnLi9wbGF0Zm9ybXMvcGxhdGZvcm1fbm9kZSc7XG4vLyBTZXQgdXAgT3BIYW5kbGVyXG5pbXBvcnQgeyBidWZmZXIgfSBmcm9tICcuL29wcy9idWZmZXInO1xuaW1wb3J0IHsgY2FzdCB9IGZyb20gJy4vb3BzL2Nhc3QnO1xuaW1wb3J0IHsgY2xvbmUgfSBmcm9tICcuL29wcy9jbG9uZSc7XG5pbXBvcnQgeyBwcmludCB9IGZyb20gJy4vb3BzL3ByaW50JztcbmltcG9ydCB7IHNldE9wSGFuZGxlciB9IGZyb20gJy4vdGVuc29yJztcbmNvbnN0IG9wSGFuZGxlciA9IHtcbiAgICBidWZmZXIsXG4gICAgY2FzdCxcbiAgICBjbG9uZSxcbiAgICBwcmludFxufTtcbnNldE9wSGFuZGxlcihvcEhhbmRsZXIpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmFzZV9zaWRlX2VmZmVjdHMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuY29uc3QgZGVsYXlDYWxsYmFjayA9ICgoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiByZXF1ZXN0QW5pbWF0aW9uRnJhbWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBzZXRJbW1lZGlhdGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBzZXRJbW1lZGlhdGU7XG4gICAgfVxuICAgIHJldHVybiAoZikgPT4gZigpOyAvLyBubyBkZWxheXNcbn0pKCk7XG4vKipcbiAqIFJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZSB3aGVuIGEgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIGhhcyBjb21wbGV0ZWQuXG4gKlxuICogT24gTm9kZS5qcyB0aGlzIHVzZXMgc2V0SW1tZWRpYXRlIGluc3RlYWQgb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lLlxuICpcbiAqIFRoaXMgaXMgc2ltcGx5IGEgc3VnYXIgbWV0aG9kIHNvIHRoYXQgdXNlcnMgY2FuIGRvIHRoZSBmb2xsb3dpbmc6XG4gKiBgYXdhaXQgdGYubmV4dEZyYW1lKCk7YFxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdQZXJmb3JtYW5jZScsIHN1YmhlYWRpbmc6ICdUaW1pbmcnfVxuICovXG5mdW5jdGlvbiBuZXh0RnJhbWUoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gZGVsYXlDYWxsYmFjaygoKSA9PiByZXNvbHZlKCkpKTtcbn1cbmV4cG9ydCB7IG5leHRGcmFtZSB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YnJvd3Nlcl91dGlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbmZ1bmN0aW9uIF9pc05hdmlnYXRvckRlZmluZWQoKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvciAhPSBudWxsO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTW9iaWxlKG5hdikge1xuICAgIGlmIChuYXYgfHwgX2lzTmF2aWdhdG9yRGVmaW5lZCgpKSB7XG4gICAgICAgIGlmICghbmF2KSB7XG4gICAgICAgICAgICBuYXYgPSBuYXZpZ2F0b3I7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hdi5wcm9kdWN0ID09PSAnUmVhY3ROYXRpdmUnKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgICAgIGNvbnN0IGEgPSBuYXYudXNlckFnZW50IHx8IG5hdi52ZW5kb3IgfHwgd2luZG93Lm9wZXJhO1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgIHJldHVybiAvKGFuZHJvaWR8YmJcXGQrfG1lZWdvKS4rbW9iaWxlfGF2YW50Z298YmFkYVxcL3xibGFja2JlcnJ5fGJsYXplcnxjb21wYWx8ZWxhaW5lfGZlbm5lY3xoaXB0b3B8aWVtb2JpbGV8aXAoaG9uZXxvZCl8aXJpc3xraW5kbGV8bGdlIHxtYWVtb3xtaWRwfG1tcHxtb2JpbGUuK2ZpcmVmb3h8bmV0ZnJvbnR8b3BlcmEgbShvYnxpbilpfHBhbG0oIG9zKT98cGhvbmV8cChpeGl8cmUpXFwvfHBsdWNrZXJ8cG9ja2V0fHBzcHxzZXJpZXMoNHw2KTB8c3ltYmlhbnx0cmVvfHVwXFwuKGJyb3dzZXJ8bGluayl8dm9kYWZvbmV8d2FwfHdpbmRvd3MgY2V8eGRhfHhpaW5vL2lcbiAgICAgICAgICAgIC50ZXN0KGEpIHx8XG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgICAgICAvMTIwN3w2MzEwfDY1OTB8M2dzb3w0dGhwfDUwWzEtNl1pfDc3MHN8ODAyc3xhIHdhfGFiYWN8YWMoZXJ8b298c1xcLSl8YWkoa298cm4pfGFsKGF2fGNhfGNvKXxhbW9pfGFuKGV4fG55fHl3KXxhcHR1fGFyKGNofGdvKXxhcyh0ZXx1cyl8YXR0d3xhdShkaXxcXC1tfHIgfHMgKXxhdmFufGJlKGNrfGxsfG5xKXxiaShsYnxyZCl8YmwoYWN8YXopfGJyKGV8dil3fGJ1bWJ8YndcXC0obnx1KXxjNTVcXC98Y2FwaXxjY3dhfGNkbVxcLXxjZWxsfGNodG18Y2xkY3xjbWRcXC18Y28obXB8bmQpfGNyYXd8ZGEoaXR8bGx8bmcpfGRidGV8ZGNcXC1zfGRldml8ZGljYXxkbW9ifGRvKGN8cClvfGRzKDEyfFxcLWQpfGVsKDQ5fGFpKXxlbShsMnx1bCl8ZXIoaWN8azApfGVzbDh8ZXooWzQtN10wfG9zfHdhfHplKXxmZXRjfGZseShcXC18Xyl8ZzEgdXxnNTYwfGdlbmV8Z2ZcXC01fGdcXC1tb3xnbyhcXC53fG9kKXxncihhZHx1bil8aGFpZXxoY2l0fGhkXFwtKG18cHx0KXxoZWlcXC18aGkocHR8dGEpfGhwKCBpfGlwKXxoc1xcLWN8aHQoYyhcXC18IHxffGF8Z3xwfHN8dCl8dHApfGh1KGF3fHRjKXxpXFwtKDIwfGdvfG1hKXxpMjMwfGlhYyggfFxcLXxcXC8pfGlicm98aWRlYXxpZzAxfGlrb218aW0xa3xpbm5vfGlwYXF8aXJpc3xqYSh0fHYpYXxqYnJvfGplbXV8amlnc3xrZGRpfGtlaml8a2d0KCB8XFwvKXxrbG9ufGtwdCB8a3djXFwtfGt5byhjfGspfGxlKG5vfHhpKXxsZyggZ3xcXC8oa3xsfHUpfDUwfDU0fFxcLVthLXddKXxsaWJ3fGx5bnh8bTFcXC13fG0zZ2F8bTUwXFwvfG1hKHRlfHVpfHhvKXxtYygwMXwyMXxjYSl8bVxcLWNyfG1lKHJjfHJpKXxtaShvOHxvYXx0cyl8bW1lZnxtbygwMXwwMnxiaXxkZXxkb3x0KFxcLXwgfG98dil8enopfG10KDUwfHAxfHYgKXxtd2JwfG15d2F8bjEwWzAtMl18bjIwWzItM118bjMwKDB8Mil8bjUwKDB8Mnw1KXxuNygwKDB8MSl8MTApfG5lKChjfG0pXFwtfG9ufHRmfHdmfHdnfHd0KXxub2soNnxpKXxuenBofG8yaW18b3AodGl8d3YpfG9yYW58b3dnMXxwODAwfHBhbihhfGR8dCl8cGR4Z3xwZygxM3xcXC0oWzEtOF18YykpfHBoaWx8cGlyZXxwbChheXx1Yyl8cG5cXC0yfHBvKGNrfHJ0fHNlKXxwcm94fHBzaW98cHRcXC1nfHFhXFwtYXxxYygwN3wxMnwyMXwzMnw2MHxcXC1bMi03XXxpXFwtKXxxdGVrfHIzODB8cjYwMHxyYWtzfHJpbTl8cm8odmV8em8pfHM1NVxcL3xzYShnZXxtYXxtbXxtc3xueXx2YSl8c2MoMDF8aFxcLXxvb3xwXFwtKXxzZGtcXC98c2UoYyhcXC18MHwxKXw0N3xtY3xuZHxyaSl8c2doXFwtfHNoYXJ8c2llKFxcLXxtKXxza1xcLTB8c2woNDV8aWQpfHNtKGFsfGFyfGIzfGl0fHQ1KXxzbyhmdHxueSl8c3AoMDF8aFxcLXx2XFwtfHYgKXxzeSgwMXxtYil8dDIoMTh8NTApfHQ2KDAwfDEwfDE4KXx0YShndHxsayl8dGNsXFwtfHRkZ1xcLXx0ZWwoaXxtKXx0aW1cXC18dFxcLW1vfHRvKHBsfHNoKXx0cyg3MHxtXFwtfG0zfG01KXx0eFxcLTl8dXAoXFwuYnxnMXxzaSl8dXRzdHx2NDAwfHY3NTB8dmVyaXx2aShyZ3x0ZSl8dmsoNDB8NVswLTNdfFxcLXYpfHZtNDB8dm9kYXx2dWxjfHZ4KDUyfDUzfDYwfDYxfDcwfDgwfDgxfDgzfDg1fDk4KXx3M2MoXFwtfCApfHdlYmN8d2hpdHx3aShnIHxuY3xudyl8d21sYnx3b251fHg3MDB8eWFzXFwtfHlvdXJ8emV0b3x6dGVcXC0vaVxuICAgICAgICAgICAgICAgIC50ZXN0KGEuc3Vic3RyKDAsIDQpKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQnJvd3NlcigpIHtcbiAgICByZXR1cm4gKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5kb2N1bWVudCAhPSBudWxsKSB8fFxuICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgKHR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZSAhPT0gJ3VuZGVmaW5lZCcpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGV2aWNlX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgS2VybmVsQmFja2VuZCB9IGZyb20gJy4vYmFja2VuZHMvYmFja2VuZCc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudCwgc2V0RW52aXJvbm1lbnRHbG9iYWwgfSBmcm9tICcuL2Vudmlyb25tZW50JztcbmltcG9ydCB7IGdldEdsb2JhbE5hbWVzcGFjZSB9IGZyb20gJy4vZ2xvYmFsX3V0aWwnO1xuaW1wb3J0IHsgQWRkLCBDYXN0LCBJZGVudGl0eSB9IGZyb20gJy4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGdldEdyYWRpZW50LCBnZXRLZXJuZWwsIGdldEtlcm5lbHNGb3JCYWNrZW5kIH0gZnJvbSAnLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHsgUHJvZmlsZXIgfSBmcm9tICcuL3Byb2ZpbGVyJztcbmltcG9ydCB7IGJhY2twcm9wYWdhdGVHcmFkaWVudHMsIGdldEZpbHRlcmVkTm9kZXNYVG9ZIH0gZnJvbSAnLi90YXBlJztcbmltcG9ydCB7IHNldFRlbnNvclRyYWNrZXIsIFRlbnNvciwgVmFyaWFibGUgfSBmcm9tICcuL3RlbnNvcic7XG5pbXBvcnQgeyBnZXRUZW5zb3JzSW5Db250YWluZXIgfSBmcm9tICcuL3RlbnNvcl91dGlsJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi91dGlsJztcbmltcG9ydCB7IGJ5dGVzRnJvbVN0cmluZ0FycmF5LCBtYWtlT25lc1R5cGVkQXJyYXksIG5vdywgc2l6ZUZyb21TaGFwZSB9IGZyb20gJy4vdXRpbCc7XG5mdW5jdGlvbiBpc1JlZ2lzdGVyZWRLZXJuZWxJbnZvY2F0aW9uKGtlcm5lbEludm9jYXRpb24pIHtcbiAgICByZXR1cm4ga2VybmVsSW52b2NhdGlvbi5rZXJuZWxOYW1lICE9IG51bGw7XG59XG5jbGFzcyBFbmdpbmVTdGF0ZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8vIFB1YmxpYyBzaW5jZSBvcHRpbWl6ZXJzIHdpbGwgdXNlIGl0LlxuICAgICAgICB0aGlzLnJlZ2lzdGVyZWRWYXJpYWJsZXMgPSB7fTtcbiAgICAgICAgdGhpcy5uZXh0VGFwZU5vZGVJZCA9IDA7XG4gICAgICAgIHRoaXMubnVtQnl0ZXMgPSAwO1xuICAgICAgICB0aGlzLm51bVRlbnNvcnMgPSAwO1xuICAgICAgICB0aGlzLm51bVN0cmluZ1RlbnNvcnMgPSAwO1xuICAgICAgICB0aGlzLm51bURhdGFCdWZmZXJzID0gMDtcbiAgICAgICAgLy8gTnVtYmVyIG9mIG5lc3RlZCB0Zi5ncmFkKCkgc3RhdGVtZW50cyB3aGVuIGNvbXB1dGluZyBoaWdoZXItb3JkZXJcbiAgICAgICAgLy8gZ3JhZGllbnRzLiBFLmcuIGAxYCBmb3IgZmlyc3Qtb3JkZXIgZ3JhZGllbnRzIGFuZCBgMmAgZm9yIHNlY29uZC1vcmRlclxuICAgICAgICAvLyBncmFkaWVudHMuIFVzZWQgdG8gdHJhY2sgaWYgdGhlIHRhcGUgc2hvdWxkIGJlIHJlbW92ZWQgYWZ0ZXIgYSBiYWNrcHJvcC5cbiAgICAgICAgdGhpcy5ncmFkaWVudERlcHRoID0gMDtcbiAgICAgICAgLy8gTnVtYmVyIG9mIG5lc3RlZCBrZXJuZWwgY2FsbHMuIFdoZW4ga2VybmVsIGRlcHRoIGlzIGdyZWF0ZXIgdGhhbiAxLCB3ZSB0dXJuXG4gICAgICAgIC8vIG9mZiB0aGUgdGFwZS5cbiAgICAgICAgdGhpcy5rZXJuZWxEZXB0aCA9IDA7XG4gICAgICAgIHRoaXMuc2NvcGVTdGFjayA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogS2VlcHMgdHJhY2sgb2YgdGhlIG51bWJlciBvZiBkYXRhIG1vdmVzIGR1cmluZyBhIGtlcm5lbCBleGVjdXRpb24uIFdlXG4gICAgICAgICAqIG1haW50YWluIGEgc3RhY2sgc2luY2Uga2VybmVscyBjYW4gY2FsbCBvdGhlciBrZXJuZWxzLCByZWN1cnNpdmVseS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubnVtRGF0YU1vdmVzU3RhY2sgPSBbXTtcbiAgICAgICAgdGhpcy5uZXh0U2NvcGVJZCA9IDA7XG4gICAgICAgIHRoaXMudGVuc29ySW5mbyA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIHRoaXMucHJvZmlsaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYWN0aXZlUHJvZmlsZSA9IHtcbiAgICAgICAgICAgIG5ld0J5dGVzOiAwLFxuICAgICAgICAgICAgbmV3VGVuc29yczogMCxcbiAgICAgICAgICAgIHBlYWtCeXRlczogMCxcbiAgICAgICAgICAgIGtlcm5lbHM6IFtdLFxuICAgICAgICAgICAgcmVzdWx0OiBudWxsLFxuICAgICAgICAgICAgZ2V0IGtlcm5lbE5hbWVzKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQodGhpcy5rZXJuZWxzLm1hcChrID0+IGsubmFtZSkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgZm9yIChjb25zdCB2YXJpYWJsZU5hbWUgaW4gdGhpcy5yZWdpc3RlcmVkVmFyaWFibGVzKSB7XG4gICAgICAgICAgICB0aGlzLnJlZ2lzdGVyZWRWYXJpYWJsZXNbdmFyaWFibGVOYW1lXS5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgY2xhc3MgRW5naW5lIHtcbiAgICBjb25zdHJ1Y3RvcihFTlYpIHtcbiAgICAgICAgdGhpcy5FTlYgPSBFTlY7XG4gICAgICAgIHRoaXMucmVnaXN0cnkgPSB7fTtcbiAgICAgICAgdGhpcy5yZWdpc3RyeUZhY3RvcnkgPSB7fTtcbiAgICAgICAgdGhpcy5wZW5kaW5nQmFja2VuZEluaXRJZCA9IDA7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBuZXcgRW5naW5lU3RhdGUoKTtcbiAgICB9XG4gICAgYXN5bmMgcmVhZHkoKSB7XG4gICAgICAgIGlmICh0aGlzLnBlbmRpbmdCYWNrZW5kSW5pdCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wZW5kaW5nQmFja2VuZEluaXQudGhlbigoKSA9PiB7IH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmJhY2tlbmRJbnN0YW5jZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc29ydGVkQmFja2VuZHMgPSB0aGlzLmdldFNvcnRlZEJhY2tlbmRzKCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc29ydGVkQmFja2VuZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGJhY2tlbmROYW1lID0gc29ydGVkQmFja2VuZHNbaV07XG4gICAgICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgdGhpcy5pbml0aWFsaXplQmFja2VuZChiYWNrZW5kTmFtZSkuc3VjY2VzcztcbiAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRCYWNrZW5kKGJhY2tlbmROYW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgaW5pdGlhbGl6ZSBhbnkgYmFja2VuZHMsIGFsbCBiYWNrZW5kIGluaXRpYWxpemF0aW9ucyBgICtcbiAgICAgICAgICAgIGBmYWlsZWQuYCk7XG4gICAgfVxuICAgIGdldCBiYWNrZW5kKCkge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nQmFja2VuZEluaXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCYWNrZW5kICcke3RoaXMuYmFja2VuZE5hbWV9JyBoYXMgbm90IHlldCBiZWVuIGluaXRpYWxpemVkLiBNYWtlIGAgK1xuICAgICAgICAgICAgICAgIGBzdXJlIHRvIGF3YWl0IHRmLnJlYWR5KCkgb3IgYXdhaXQgdGYuc2V0QmFja2VuZCgpIGJlZm9yZSBjYWxsaW5nIGAgK1xuICAgICAgICAgICAgICAgIGBvdGhlciBtZXRob2RzYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYmFja2VuZEluc3RhbmNlID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgbmFtZSwgYXN5bmNJbml0IH0gPSB0aGlzLmluaXRpYWxpemVCYWNrZW5kc0FuZFJldHVybkJlc3QoKTtcbiAgICAgICAgICAgIGlmIChhc3luY0luaXQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBoaWdoZXN0IHByaW9yaXR5IGJhY2tlbmQgJyR7bmFtZX0nIGhhcyBub3QgeWV0IGJlZW4gYCArXG4gICAgICAgICAgICAgICAgICAgIGBpbml0aWFsaXplZC4gTWFrZSBzdXJlIHRvIGF3YWl0IHRmLnJlYWR5KCkgb3IgYCArXG4gICAgICAgICAgICAgICAgICAgIGBhd2FpdCB0Zi5zZXRCYWNrZW5kKCkgYmVmb3JlIGNhbGxpbmcgb3RoZXIgbWV0aG9kc2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZXRCYWNrZW5kKG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmJhY2tlbmRJbnN0YW5jZTtcbiAgICB9XG4gICAgYmFja2VuZE5hbWVzKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5yZWdpc3RyeUZhY3RvcnkpO1xuICAgIH1cbiAgICBmaW5kQmFja2VuZChiYWNrZW5kTmFtZSkge1xuICAgICAgICBpZiAoIShiYWNrZW5kTmFtZSBpbiB0aGlzLnJlZ2lzdHJ5KSkge1xuICAgICAgICAgICAgLy8gSWYgdGhlIGJhY2tlbmQgaGFzbid0IGJlZW4gaW5pdGlhbGl6ZWQgYnV0IHdlIGhhdmUgYSByZWdpc3RyeSBlbnRyeSBmb3JcbiAgICAgICAgICAgIC8vIGl0LCBpbml0aWFsaXplIGl0IGFuZCByZXR1cm4gaXQuXG4gICAgICAgICAgICBpZiAoYmFja2VuZE5hbWUgaW4gdGhpcy5yZWdpc3RyeUZhY3RvcnkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGFzeW5jSW5pdCB9ID0gdGhpcy5pbml0aWFsaXplQmFja2VuZChiYWNrZW5kTmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGFzeW5jSW5pdCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBCYWNrZW5kIGlzIG5vdCByZWFkeSB5ZXQuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5W2JhY2tlbmROYW1lXTtcbiAgICB9XG4gICAgZmluZEJhY2tlbmRGYWN0b3J5KGJhY2tlbmROYW1lKSB7XG4gICAgICAgIGlmICghKGJhY2tlbmROYW1lIGluIHRoaXMucmVnaXN0cnlGYWN0b3J5KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucmVnaXN0cnlGYWN0b3J5W2JhY2tlbmROYW1lXS5mYWN0b3J5O1xuICAgIH1cbiAgICByZWdpc3RlckJhY2tlbmQoYmFja2VuZE5hbWUsIGZhY3RvcnksIHByaW9yaXR5ID0gMSkge1xuICAgICAgICBpZiAoYmFja2VuZE5hbWUgaW4gdGhpcy5yZWdpc3RyeUZhY3RvcnkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgJHtiYWNrZW5kTmFtZX0gYmFja2VuZCB3YXMgYWxyZWFkeSByZWdpc3RlcmVkLiBgICtcbiAgICAgICAgICAgICAgICBgUmV1c2luZyBleGlzdGluZyBiYWNrZW5kIGZhY3RvcnkuYCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWdpc3RyeUZhY3RvcnlbYmFja2VuZE5hbWVdID0geyBmYWN0b3J5LCBwcmlvcml0eSB9O1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgYXN5bmMgc2V0QmFja2VuZChiYWNrZW5kTmFtZSkge1xuICAgICAgICBpZiAodGhpcy5yZWdpc3RyeUZhY3RvcnlbYmFja2VuZE5hbWVdID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQmFja2VuZCBuYW1lICcke2JhY2tlbmROYW1lfScgbm90IGZvdW5kIGluIHJlZ2lzdHJ5YCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5iYWNrZW5kTmFtZSA9IGJhY2tlbmROYW1lO1xuICAgICAgICBpZiAodGhpcy5yZWdpc3RyeVtiYWNrZW5kTmFtZV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5iYWNrZW5kSW5zdGFuY2UgPSBudWxsO1xuICAgICAgICAgICAgY29uc3QgeyBzdWNjZXNzLCBhc3luY0luaXQgfSA9IHRoaXMuaW5pdGlhbGl6ZUJhY2tlbmQoYmFja2VuZE5hbWUpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXN5bmNJbml0ID8gYXdhaXQgc3VjY2VzcyA6IHN1Y2Nlc3M7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJhY2tlbmRJbnN0YW5jZSA9IHRoaXMucmVnaXN0cnlbYmFja2VuZE5hbWVdO1xuICAgICAgICB0aGlzLnNldHVwUmVnaXN0ZXJlZEtlcm5lbHMoKTtcbiAgICAgICAgLy8gUmVzZXQgdGhlIHByb2ZpbGVyLlxuICAgICAgICB0aGlzLnByb2ZpbGVyID0gbmV3IFByb2ZpbGVyKHRoaXMuYmFja2VuZEluc3RhbmNlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHNldHVwUmVnaXN0ZXJlZEtlcm5lbHMoKSB7XG4gICAgICAgIGNvbnN0IGtlcm5lbHMgPSBnZXRLZXJuZWxzRm9yQmFja2VuZCh0aGlzLmJhY2tlbmROYW1lKTtcbiAgICAgICAga2VybmVscy5mb3JFYWNoKGtlcm5lbCA9PiB7XG4gICAgICAgICAgICBpZiAoa2VybmVsLnNldHVwRnVuYyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAga2VybmVsLnNldHVwRnVuYyh0aGlzLmJhY2tlbmRJbnN0YW5jZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBkaXNwb3NlUmVnaXN0ZXJlZEtlcm5lbHMoYmFja2VuZE5hbWUpIHtcbiAgICAgICAgY29uc3Qga2VybmVscyA9IGdldEtlcm5lbHNGb3JCYWNrZW5kKGJhY2tlbmROYW1lKTtcbiAgICAgICAga2VybmVscy5mb3JFYWNoKGtlcm5lbCA9PiB7XG4gICAgICAgICAgICBpZiAoa2VybmVsLmRpc3Bvc2VGdW5jICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBrZXJuZWwuZGlzcG9zZUZ1bmModGhpcy5yZWdpc3RyeVtiYWNrZW5kTmFtZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZXMgYSBiYWNrZW5kIGJ5IGxvb2tpbmcgdXAgdGhlIGJhY2tlbmQgbmFtZSBpbiB0aGUgZmFjdG9yeVxuICAgICAqIHJlZ2lzdHJ5IGFuZCBjYWxsaW5nIHRoZSBmYWN0b3J5IG1ldGhvZC4gUmV0dXJucyBhIGJvb2xlYW4gcmVwcmVzZW50aW5nXG4gICAgICogd2hldGhlciB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGJhY2tlbmQgc3VjZWVkZWQuIFRocm93cyBhbiBlcnJvciBpZlxuICAgICAqIHRoZXJlIGlzIG5vIGJhY2tlbmQgaW4gdGhlIGZhY3RvcnkgcmVnaXN0cnkuXG4gICAgICovXG4gICAgaW5pdGlhbGl6ZUJhY2tlbmQoYmFja2VuZE5hbWUpIHtcbiAgICAgICAgY29uc3QgcmVnaXN0cnlGYWN0b3J5RW50cnkgPSB0aGlzLnJlZ2lzdHJ5RmFjdG9yeVtiYWNrZW5kTmFtZV07XG4gICAgICAgIGlmIChyZWdpc3RyeUZhY3RvcnlFbnRyeSA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBpbml0aWFsaXplIGJhY2tlbmQgJHtiYWNrZW5kTmFtZX0sIG5vIHJlZ2lzdHJhdGlvbiBmb3VuZC5gKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgYmFja2VuZCA9IHJlZ2lzdHJ5RmFjdG9yeUVudHJ5LmZhY3RvcnkoKTtcbiAgICAgICAgICAgIC8qIFRlc3QgaWYgdGhlIGZhY3RvcnkgcmV0dXJucyBhIHByb21pc2UuXG4gICAgICAgICAgICBEb25lIGluIGEgbW9yZSBsaWJlcmFsIHdheSB0aGFuXG4gICAgICAgICAgICBwcmV2aW91cyAnUHJvbWlzZS5yZXNvbHZlKGJhY2tlbmQpPT09YmFja2VuZCdcbiAgICAgICAgICAgIGFzIHdlIG5lZWRlZCB0byBhY2NvdW50IGZvciBjdXN0b20gUHJvbWlzZVxuICAgICAgICAgICAgaW1wbGVtZW50YXRpb25zIChlLmcuIEFuZ3VsYXIpICovXG4gICAgICAgICAgICBpZiAoYmFja2VuZCAmJiAhKGJhY2tlbmQgaW5zdGFuY2VvZiBLZXJuZWxCYWNrZW5kKSAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBiYWNrZW5kLnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9taXNlSWQgPSArK3RoaXMucGVuZGluZ0JhY2tlbmRJbml0SWQ7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGJhY2tlbmRcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oYmFja2VuZEluc3RhbmNlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gT3V0ZGF0ZWQgcHJvbWlzZS4gQW5vdGhlciBiYWNrZW5kIHdhcyBzZXQgaW4gdGhlIG1lYW50aW1lLlxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvbWlzZUlkIDwgdGhpcy5wZW5kaW5nQmFja2VuZEluaXRJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVnaXN0cnlbYmFja2VuZE5hbWVdID0gYmFja2VuZEluc3RhbmNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdCYWNrZW5kSW5pdCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBPdXRkYXRlZCBwcm9taXNlLiBBbm90aGVyIGJhY2tlbmQgd2FzIHNldCBpbiB0aGUgbWVhbnRpbWUuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9taXNlSWQgPCB0aGlzLnBlbmRpbmdCYWNrZW5kSW5pdElkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nQmFja2VuZEluaXQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYEluaXRpYWxpemF0aW9uIG9mIGJhY2tlbmQgJHtiYWNrZW5kTmFtZX0gZmFpbGVkYCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihlcnIuc3RhY2sgfHwgZXJyLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nQmFja2VuZEluaXQgPSBzdWNjZXNzO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3MsIGFzeW5jSW5pdDogdHJ1ZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWdpc3RyeVtiYWNrZW5kTmFtZV0gPSBiYWNrZW5kO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGFzeW5jSW5pdDogZmFsc2UgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYEluaXRpYWxpemF0aW9uIG9mIGJhY2tlbmQgJHtiYWNrZW5kTmFtZX0gZmFpbGVkYCk7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oZXJyLnN0YWNrIHx8IGVyci5tZXNzYWdlKTtcbiAgICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBhc3luY0luaXQ6IGZhbHNlIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVtb3ZlQmFja2VuZChiYWNrZW5kTmFtZSkge1xuICAgICAgICBpZiAoIShiYWNrZW5kTmFtZSBpbiB0aGlzLnJlZ2lzdHJ5RmFjdG9yeSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtiYWNrZW5kTmFtZX0gYmFja2VuZCBub3QgZm91bmQgaW4gcmVnaXN0cnlgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5iYWNrZW5kTmFtZSA9PT0gYmFja2VuZE5hbWUgJiYgdGhpcy5wZW5kaW5nQmFja2VuZEluaXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gVGhlcmUgaXMgYSBwZW5kaW5nIHByb21pc2Ugb2YgdGhlIGJhY2tlbmQgd2Ugd2FudCB0byByZW1vdmUuIE1ha2UgaXRcbiAgICAgICAgICAgIC8vIG9ic29sZXRlLlxuICAgICAgICAgICAgdGhpcy5wZW5kaW5nQmFja2VuZEluaXRJZCsrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiYWNrZW5kTmFtZSBpbiB0aGlzLnJlZ2lzdHJ5KSB7XG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2VSZWdpc3RlcmVkS2VybmVscyhiYWNrZW5kTmFtZSk7XG4gICAgICAgICAgICB0aGlzLnJlZ2lzdHJ5W2JhY2tlbmROYW1lXS5kaXNwb3NlKCk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5yZWdpc3RyeVtiYWNrZW5kTmFtZV07XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIHRoaXMucmVnaXN0cnlGYWN0b3J5W2JhY2tlbmROYW1lXTtcbiAgICAgICAgLy8gVW5zZXQgdGhlIGJhY2tlbmQgaWYgaXQgaXMgYWN0aXZlLlxuICAgICAgICBpZiAodGhpcy5iYWNrZW5kTmFtZSA9PT0gYmFja2VuZE5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0JhY2tlbmRJbml0ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuYmFja2VuZE5hbWUgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5iYWNrZW5kSW5zdGFuY2UgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldFNvcnRlZEJhY2tlbmRzKCkge1xuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5yZWdpc3RyeUZhY3RvcnkpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBiYWNrZW5kIGZvdW5kIGluIHJlZ2lzdHJ5LicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLnJlZ2lzdHJ5RmFjdG9yeSkuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgLy8gSGlnaGVzdCBwcmlvcml0eSBjb21lcyBmaXJzdC5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5RmFjdG9yeVtiXS5wcmlvcml0eSAtXG4gICAgICAgICAgICAgICAgdGhpcy5yZWdpc3RyeUZhY3RvcnlbYV0ucHJpb3JpdHk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpbml0aWFsaXplQmFja2VuZHNBbmRSZXR1cm5CZXN0KCkge1xuICAgICAgICBjb25zdCBzb3J0ZWRCYWNrZW5kcyA9IHRoaXMuZ2V0U29ydGVkQmFja2VuZHMoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3J0ZWRCYWNrZW5kcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgYmFja2VuZE5hbWUgPSBzb3J0ZWRCYWNrZW5kc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IHsgc3VjY2VzcywgYXN5bmNJbml0IH0gPSB0aGlzLmluaXRpYWxpemVCYWNrZW5kKGJhY2tlbmROYW1lKTtcbiAgICAgICAgICAgIGlmIChhc3luY0luaXQgfHwgc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IG5hbWU6IGJhY2tlbmROYW1lLCBhc3luY0luaXQgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBpbml0aWFsaXplIGFueSBiYWNrZW5kcywgYWxsIGJhY2tlbmQgaW5pdGlhbGl6YXRpb25zIGAgK1xuICAgICAgICAgICAgYGZhaWxlZC5gKTtcbiAgICB9XG4gICAgbW92ZURhdGEoYmFja2VuZCwgZGF0YUlkKSB7XG4gICAgICAgIGNvbnN0IGluZm8gPSB0aGlzLnN0YXRlLnRlbnNvckluZm8uZ2V0KGRhdGFJZCk7XG4gICAgICAgIGNvbnN0IHNyY0JhY2tlbmQgPSBpbmZvLmJhY2tlbmQ7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMucmVhZFN5bmMoZGF0YUlkKTtcbiAgICAgICAgY29uc3QgcmVmQ291bnQgPSBzcmNCYWNrZW5kLnJlZkNvdW50KGRhdGFJZCk7XG4gICAgICAgIC8vIERlbGV0ZSB0aGUgdGVuc29yIGZyb20gdGhlIG9sZCBiYWNrZW5kIGFuZCBtb3ZlIGl0IHRvIHRoZSBuZXdcbiAgICAgICAgLy8gYmFja2VuZC5cbiAgICAgICAgc3JjQmFja2VuZC5kaXNwb3NlRGF0YShkYXRhSWQsIHRydWUpO1xuICAgICAgICBpbmZvLmJhY2tlbmQgPSBiYWNrZW5kO1xuICAgICAgICBiYWNrZW5kLm1vdmUoZGF0YUlkLCB2YWx1ZXMsIGluZm8uc2hhcGUsIGluZm8uZHR5cGUsIHJlZkNvdW50KTtcbiAgICAgICAgaWYgKHRoaXMuc2hvdWxkQ2hlY2tGb3JNZW1MZWFrcygpKSB7XG4gICAgICAgICAgICAvLyBUcmFjayB0aGUgbnVtYmVyIG9mIG1vdmVzIGR1cmluZyBhIGtlcm5lbCBleGVjdXRpb24gdG8gY29ycmVjdGx5XG4gICAgICAgICAgICAvLyBkZXRlY3QgbWVtb3J5IGxlYWtzLlxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5udW1EYXRhTW92ZXNTdGFja1t0aGlzLnN0YXRlLm51bURhdGFNb3Zlc1N0YWNrLmxlbmd0aCAtIDFdKys7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGlkeShuYW1lT3JGbiwgZm4pIHtcbiAgICAgICAgbGV0IG5hbWUgPSBudWxsO1xuICAgICAgICBpZiAoZm4gPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gQ2FsbGVkIHdpdGggb25seSAxIGFyZ3VtZW50LlxuICAgICAgICAgICAgaWYgKHR5cGVvZiBuYW1lT3JGbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIHByb3ZpZGUgYSBmdW5jdGlvbiB0byB0aWR5KCknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZuID0gbmFtZU9yRm47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBDYWxsZWQgd2l0aCAyIGFyZ3VtZW50cy5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgbmFtZU9yRm4gIT09ICdzdHJpbmcnICYmICEobmFtZU9yRm4gaW5zdGFuY2VvZiBTdHJpbmcpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXaGVuIGNhbGxpbmcgd2l0aCB0d28gYXJndW1lbnRzLCB0aGUgZmlyc3QgYXJndW1lbnQgJyArXG4gICAgICAgICAgICAgICAgICAgICd0byB0aWR5KCkgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV2hlbiBjYWxsaW5nIHdpdGggdHdvIGFyZ3VtZW50cywgdGhlIDJuZCBhcmd1bWVudCAnICtcbiAgICAgICAgICAgICAgICAgICAgJ3RvIHRpZHkoKSBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5hbWUgPSBuYW1lT3JGbjtcbiAgICAgICAgICAgIC8vIFRPRE8obnN0aG9yYXQsc21pbGtvdik6IERvIG9wZXJhdGlvbiBsb2dnaW5nIGFuZCBwZXJmb3JtYW5jZVxuICAgICAgICAgICAgLy8gcHJvZmlsaW5nLlxuICAgICAgICB9XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIHJldHVybiB0aGlzLnNjb3BlZFJ1bigoKSA9PiB0aGlzLnN0YXJ0U2NvcGUobmFtZSksICgpID0+IHRoaXMuZW5kU2NvcGUocmVzdWx0KSwgKCkgPT4ge1xuICAgICAgICAgICAgcmVzdWx0ID0gZm4oKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ2Fubm90IHJldHVybiBhIFByb21pc2UgaW5zaWRlIG9mIHRpZHkuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2NvcGVkUnVuKHN0YXJ0LCBlbmQsIGYpIHtcbiAgICAgICAgc3RhcnQoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGYoKTtcbiAgICAgICAgICAgIGVuZCgpO1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgIGVuZCgpO1xuICAgICAgICAgICAgdGhyb3cgZXg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmV4dFRlbnNvcklkKCkge1xuICAgICAgICByZXR1cm4gRW5naW5lLm5leHRUZW5zb3JJZCsrO1xuICAgIH1cbiAgICBuZXh0VmFyaWFibGVJZCgpIHtcbiAgICAgICAgcmV0dXJuIEVuZ2luZS5uZXh0VmFyaWFibGVJZCsrO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgaW5zdGVhZCBvZiB0aGUgcHVibGljLWZhY2luZyB0ZW5zb3IuY2xvbmUoKSB3aGVuXG4gICAgICogc2F2aW5nIGEgdGVuc29yIGZvciBiYWNrd2FyZHMgcGFzcy4gSXQgbWFrZXMgc3VyZSB0byBhZGQgdGhlIGNsb25lXG4gICAgICogb3BlcmF0aW9uIHRvIHRoZSB0YXBlIHJlZ2FyZGxlc3Mgb2YgYmVpbmcgY2FsbGVkIGluc2lkZSBhIGtlcm5lbFxuICAgICAqIGV4ZWN1dGlvbi5cbiAgICAgKi9cbiAgICBjbG9uZSh4KSB7XG4gICAgICAgIGNvbnN0IHkgPSBFTkdJTkUucnVuS2VybmVsKElkZW50aXR5LCB7IHggfSk7XG4gICAgICAgIGNvbnN0IGlucHV0cyA9IHsgeCB9O1xuICAgICAgICBjb25zdCBncmFkID0gKGR5KSA9PiAoe1xuICAgICAgICAgICAgeDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGR0eXBlID0gJ2Zsb2F0MzInO1xuICAgICAgICAgICAgICAgIGNvbnN0IGdyYWRJbnB1dHMgPSB7IHg6IGR5IH07XG4gICAgICAgICAgICAgICAgY29uc3QgYXR0cnMgPSB7IGR0eXBlIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoQ2FzdCwgZ3JhZElucHV0cywgXG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgICAgICAgICAgICAgIGF0dHJzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHNhdmVkID0gW107XG4gICAgICAgIHRoaXMuYWRkVGFwZU5vZGUodGhpcy5zdGF0ZS5hY3RpdmVTY29wZS5uYW1lLCBpbnB1dHMsIFt5XSwgZ3JhZCwgc2F2ZWQsIHt9KTtcbiAgICAgICAgcmV0dXJuIHk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGUgYSBrZXJuZWwgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgcmV0dXJuIHRoZSBvdXRwdXQgdGVuc29yLlxuICAgICAqXG4gICAgICogQHBhcmFtIGtlcm5lbE5hbWUgVGhlIG5hbWUgb2YgdGhlIGtlcm5lbCB0byBleGVjdXRlLlxuICAgICAqIEBwYXJhbSBpbnB1dHMgQSBtYXAgb2YgaW5wdXQgbmFtZXMgdG8gdGVuc29ycy5cbiAgICAgKiBAcGFyYW0gYXR0cnMgQSBtYXAgb2YgYXR0cmlidXRlIG5hbWVzIHRvIHRoZWlyIHZhbHVlcy4gQW4gYXR0cmlidXRlIGlzIGFcbiAgICAgKiAgICAgcHJpbWl0aXZlIChub24tdGVuc29yKSBpbnB1dCB0byB0aGUga2VybmVsLlxuICAgICAqIEBwYXJhbSBpbnB1dHNUb1NhdmUgQSBsaXN0IG9mIHRlbnNvcnMsIGlucHV0cyB0byBzYXZlIGZvciB0aGUgYmFja3Byb3BcbiAgICAgKiAgICAgY29tcHV0YXRpb24uXG4gICAgICogQHBhcmFtIG91dHB1dHNUb1NhdmUgQSBsaXN0IG9mIGJvb2xlYW5zLCBzcGVjaWZ5aW5nIHdoaWNoIG91dHB1dCB0byBzYXZlXG4gICAgICogICAgIGZvciB0aGUgYmFja3Byb3AgY29tcHV0YXRpb24uIFRoZXNlIGFyZSBib29sZWFucyBzaW5jZSB0aGUgb3V0cHV0XG4gICAgICogdGVuc29ycyBhcmUgbm90IHZpc2libGUgdG8gdGhlIHVzZXIuXG4gICAgICovXG4gICAgcnVuS2VybmVsKGtlcm5lbE5hbWUsIGlucHV0cywgYXR0cnMpIHtcbiAgICAgICAgaWYgKHRoaXMuYmFja2VuZE5hbWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gYmFja2VuZCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0IChiYWNrZW5kIGluaXRpYWxpemF0aW9uIGlzIGxhenlcbiAgICAgICAgICAgIC8vIGNhbiBiZSBkZWZlcnJlZCB1bnRpbCBhbiBvcC8ga2VybmVsIGlzIHJ1bikuXG4gICAgICAgICAgICAvLyBUaGUgYmVsb3cgZ2V0dGVyIGhhcyBzaWRlIGVmZmVjdHMgdGhhdCB3aWxsIHRyeSB0byBpbml0aWFsaXplIHRoZVxuICAgICAgICAgICAgLy8gYmFja2VuZCBhbmQgc2V0IHByb3BlcnRpZXMgbGlrZSB0aGlzLmJhY2tlbmROYW1lXG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVudXNlZC1leHByZXNzaW9uXG4gICAgICAgICAgICB0aGlzLmJhY2tlbmQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaGFzS2VybmVsID0gZ2V0S2VybmVsKGtlcm5lbE5hbWUsIHRoaXMuYmFja2VuZE5hbWUpICE9IG51bGw7XG4gICAgICAgIGlmICghaGFzS2VybmVsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEtlcm5lbCAnJHtrZXJuZWxOYW1lfScgbm90IHJlZ2lzdGVyZWQgZm9yIGJhY2tlbmQgJyR7dGhpcy5iYWNrZW5kTmFtZX0nYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucnVuS2VybmVsRnVuYyh7IGtlcm5lbE5hbWUsIGlucHV0cywgYXR0cnMgfSk7XG4gICAgfVxuICAgIHNob3VsZENoZWNrRm9yTWVtTGVha3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkVOVi5nZXRCb29sKCdJU19URVNUJyk7XG4gICAgfVxuICAgIGNoZWNrS2VybmVsRm9yTWVtTGVhayhrZXJuZWxOYW1lLCBudW1EYXRhSWRzQmVmb3JlLCBvdXRJbmZvcykge1xuICAgICAgICBjb25zdCBudW1EYXRhSWRzQWZ0ZXIgPSB0aGlzLmJhY2tlbmQubnVtRGF0YUlkcygpO1xuICAgICAgICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIGRhdGEgaWRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZSBrZXJuZWwuXG4gICAgICAgIGxldCBudW1PdXRwdXREYXRhSWRzID0gMDtcbiAgICAgICAgb3V0SW5mb3MuZm9yRWFjaChpbmZvID0+IHtcbiAgICAgICAgICAgIC8vIENvbXBsZXggbnVtYmVycyBhbGxvY2F0ZSAzIGRhdGEgaWRzLCBvbmUgZm9yICdyZWFsJywgb25lIGZvclxuICAgICAgICAgICAgLy8gJ2ltYWdpbmFyeScsIGFuZCBvbmUgZm9yIHRoZSBjb250YWluZXIgdGhhdCBob2xkcyB0aGUgZm9ybWVyIHR3by5cbiAgICAgICAgICAgIG51bU91dHB1dERhdGFJZHMgKz0gKGluZm8uZHR5cGUgPT09ICdjb21wbGV4NjQnID8gMyA6IDEpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gQWNjb3VudCBmb3IgdGhlIG51bWJlciBvZiBtb3ZlcyBkdXJpbmcga2VybmVsIGV4ZWN1dGlvbi4gQSBcImRhdGEgbW92ZVwiXG4gICAgICAgIC8vIGNhbiBoYXBwZW4gaW4gdGhlIG1pZGRsZSBvZiBhIGtlcm5lbCBleGVjdXRpb24sIHBsYWNpbmcgYSBuZXcgKGtleSx2YWx1ZSlcbiAgICAgICAgLy8gcGFpciBpbiB0aGUgZGF0YSBzdG9yYWdlLiBTaW5jZSBkYXRhIG1vdmVzIGhhdmUgbmV0IHplcm8gZWZmZWN0ICh3ZVxuICAgICAgICAvLyBhbHdheXMgcmVtb3ZlIHRoZSBkYXRhIGZyb20gdGhlIG9sZCBiYWNrZW5kKSwgd2UgaGF2ZSB0byBjYW5jZWwgdGhlbSBvdXRcbiAgICAgICAgLy8gd2hlbiBkZXRlY3RpbmcgbWVtb3J5IGxlYWtzLlxuICAgICAgICBjb25zdCBudW1Nb3ZlcyA9IHRoaXMuc3RhdGUubnVtRGF0YU1vdmVzU3RhY2tbdGhpcy5zdGF0ZS5udW1EYXRhTW92ZXNTdGFjay5sZW5ndGggLSAxXTtcbiAgICAgICAgY29uc3QgZGF0YUlkc0xlYWtlZCA9IG51bURhdGFJZHNBZnRlciAtIG51bURhdGFJZHNCZWZvcmUgLSBudW1PdXRwdXREYXRhSWRzIC0gbnVtTW92ZXM7XG4gICAgICAgIGlmIChkYXRhSWRzTGVha2VkID4gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCYWNrZW5kICcke3RoaXMuYmFja2VuZE5hbWV9JyBoYXMgYW4gaW50ZXJuYWwgbWVtb3J5IGxlYWsgYCArXG4gICAgICAgICAgICAgICAgYCgke2RhdGFJZHNMZWFrZWR9IGRhdGEgaWRzKSBhZnRlciBydW5uaW5nICcke2tlcm5lbE5hbWV9J2ApO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEludGVybmFsIGhlbHBlciBtZXRob2QgdG8gZXhlY3V0ZSBhIGtlcm5lbCBGdW5jXG4gICAgICpcbiAgICAgKiBVc2UgYHJ1bktlcm5lbGAgdG8gZXhlY3V0ZSBrZXJuZWxzIGZyb20gb3V0c2lkZSBvZiBlbmdpbmUuXG4gICAgICovXG4gICAgcnVuS2VybmVsRnVuYyhrZXJuZWxQYXJhbXMpIHtcbiAgICAgICAgbGV0IG91dHB1dHM7XG4gICAgICAgIGxldCBzYXZlZCA9IFtdO1xuICAgICAgICBjb25zdCBpc1RhcGVPbiA9IHRoaXMuaXNUYXBlT24oKTtcbiAgICAgICAgY29uc3Qgc3RhcnRpbmdCeXRlY291bnQgPSB0aGlzLnN0YXRlLm51bUJ5dGVzO1xuICAgICAgICBjb25zdCBzdGFydGluZ051bVRlbnNvcnMgPSB0aGlzLnN0YXRlLm51bVRlbnNvcnM7XG4gICAgICAgIGlmICh0aGlzLnNob3VsZENoZWNrRm9yTWVtTGVha3MoKSkge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS5udW1EYXRhTW92ZXNTdGFjay5wdXNoKDApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBrZXJuZWxGdW5jO1xuICAgICAgICBpZiAodGhpcy5iYWNrZW5kTmFtZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBiYWNrZW5kIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXQgKGJhY2tlbmQgaW5pdGlhbGl6YXRpb24gaXMgbGF6eVxuICAgICAgICAgICAgLy8gY2FuIGJlIGRlZmVycmVkIHVudGlsIGFuIG9wLyBrZXJuZWwgaXMgcnVuKS5cbiAgICAgICAgICAgIC8vIFRoZSBiZWxvdyBnZXR0ZXIgaGFzIHNpZGUgZWZmZWN0cyB0aGF0IHdpbGwgdHJ5IHRvIGluaXRpYWxpemUgdGhlXG4gICAgICAgICAgICAvLyBiYWNrZW5kIGFuZCBzZXQgcHJvcGVydGllcyBsaWtlIHRoaXMuYmFja2VuZE5hbWVcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW51c2VkLWV4cHJlc3Npb25cbiAgICAgICAgICAgIHRoaXMuYmFja2VuZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb3V0O1xuICAgICAgICBjb25zdCBrZXJuZWxPclNjb3BlTmFtZSA9IGlzUmVnaXN0ZXJlZEtlcm5lbEludm9jYXRpb24oa2VybmVsUGFyYW1zKSA/XG4gICAgICAgICAgICBrZXJuZWxQYXJhbXMua2VybmVsTmFtZSA6XG4gICAgICAgICAgICB0aGlzLnN0YXRlLmFjdGl2ZVNjb3BlICE9IG51bGwgPyB0aGlzLnN0YXRlLmFjdGl2ZVNjb3BlLm5hbWUgOiAnJztcbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBrZXJuZWxGdW5jIGZyb20gZWl0aGVyIGEgcmVnaXN0ZXJlZCBrZXJuZWwgT1IgcGFzc2VkIGluXG4gICAgICAgIC8vIGZvcndhcmQvYmFja3dhcmQgZnVuY3Rpb25zICh1c2VkIGJ5IGN1c3RvbSBncmFkKS4gSW4gdGhpcyBjb250ZXh0IGFcbiAgICAgICAgLy8ga2VybmVsRnVuYyB3cmFwcyBhIGtlcm5lbCBpbXBsZW1lbnRhdGlvbiB3aXRoIHNvbWUgYm9va2tlZXBpbmcuXG4gICAgICAgIGlmIChpc1JlZ2lzdGVyZWRLZXJuZWxJbnZvY2F0aW9uKGtlcm5lbFBhcmFtcykpIHtcbiAgICAgICAgICAgIGNvbnN0IHsga2VybmVsTmFtZSwgaW5wdXRzLCBhdHRycyB9ID0ga2VybmVsUGFyYW1zO1xuICAgICAgICAgICAgaWYgKHRoaXMuYmFja2VuZE5hbWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIGJhY2tlbmQgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIHlldCAoYmFja2VuZCBpbml0aWFsaXphdGlvbiBpcyBsYXp5XG4gICAgICAgICAgICAgICAgLy8gY2FuIGJlIGRlZmVycmVkIHVudGlsIGFuIG9wLyBrZXJuZWwgaXMgcnVuKS5cbiAgICAgICAgICAgICAgICAvLyBUaGUgYmVsb3cgZ2V0dGVyIGhhcyBzaWRlIGVmZmVjdHMgdGhhdCB3aWxsIHRyeSB0byBpbml0aWFsaXplIHRoZVxuICAgICAgICAgICAgICAgIC8vIGJhY2tlbmQgYW5kIHNldCBwcm9wZXJ0aWVzIGxpa2UgdGhpcy5iYWNrZW5kTmFtZVxuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW51c2VkLWV4cHJlc3Npb25cbiAgICAgICAgICAgICAgICB0aGlzLmJhY2tlbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBrZXJuZWwgPSBnZXRLZXJuZWwoa2VybmVsTmFtZSwgdGhpcy5iYWNrZW5kTmFtZSk7XG4gICAgICAgICAgICB1dGlsLmFzc2VydChrZXJuZWwgIT0gbnVsbCwgKCkgPT4gYENhbm5vdCBmaW5kIHJlZ2lzdGVyZWQga2VybmVsICcke2tlcm5lbE5hbWV9JyBmb3IgYmFja2VuZCAnJHt0aGlzLmJhY2tlbmROYW1lfSdgKTtcbiAgICAgICAgICAgIGtlcm5lbEZ1bmMgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbnVtRGF0YUlkc0JlZm9yZSA9IHRoaXMuYmFja2VuZC5udW1EYXRhSWRzKCk7XG4gICAgICAgICAgICAgICAgb3V0ID0ga2VybmVsLmtlcm5lbEZ1bmMoeyBpbnB1dHMsIGF0dHJzLCBiYWNrZW5kOiB0aGlzLmJhY2tlbmQgfSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3V0SW5mb3MgPSBBcnJheS5pc0FycmF5KG91dCkgPyBvdXQgOiBbb3V0XTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG91bGRDaGVja0Zvck1lbUxlYWtzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja0tlcm5lbEZvck1lbUxlYWsoa2VybmVsTmFtZSwgbnVtRGF0YUlkc0JlZm9yZSwgb3V0SW5mb3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBvdXRUZW5zb3JzID0gb3V0SW5mb3MubWFwKChvdXRJbmZvKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRvZG8gKHlhc3NvZ2JhKSByZW1vdmUgdGhpcyBvcHRpb24gKFRlbnNvcikgd2hlbiBub2RlIGJhY2tlbmRcbiAgICAgICAgICAgICAgICAgICAgLy8gbWV0aG9kcyBoYXZlIGJlZW4gbW9kdWxhcml6ZWQgYW5kIHRoZXkgYWxsIHJldHVybiB0ZW5zb3JJbmZvLlxuICAgICAgICAgICAgICAgICAgICAvLyBUZW5zb3JJbmZvcyBkbyBub3QgaGF2ZSBhIHJhbmsgYXR0cmlidXRlLlxuICAgICAgICAgICAgICAgICAgICBpZiAob3V0SW5mby5yYW5rICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvdXRJbmZvO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgZGF0YUlkLCBzaGFwZSwgZHR5cGUgfSA9IG91dEluZm87XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1ha2VUZW5zb3JGcm9tRGF0YUlkKGRhdGFJZCwgc2hhcGUsIGR0eXBlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAvLyBTYXZlIGFueSByZXF1aXJlZCBpbnB1dHMgYW5kIG91dHB1dHMuXG4gICAgICAgICAgICAgICAgLy8gRG8gbm90IHNhdmUgdW5sZXNzIHdlIGFyZSByZWNvcmRpbmcgdG8gdGhlIHRhcGUuIE90aGVyd2lzZSBpdCB3b3VsZFxuICAgICAgICAgICAgICAgIC8vIGNhdXNlIGEgbWVtIGxlYWsgc2luY2UgdGhlcmUgd291bGQgYmUgbm8gYmFja3Byb3AgZm9yIHRoZXNlIHRlbnNvcnNcbiAgICAgICAgICAgICAgICAvLyAod2hpY2ggd291bGQgb3RoZXJ3aXNlIGRpc3Bvc2UgdGhlbSkuXG4gICAgICAgICAgICAgICAgaWYgKGlzVGFwZU9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlbnNvcnNUb1NhdmUgPSB0aGlzLmdldFRlbnNvcnNGb3JHcmFkaWVudChrZXJuZWxOYW1lLCBpbnB1dHMsIG91dFRlbnNvcnMpO1xuICAgICAgICAgICAgICAgICAgICBzYXZlZCA9IHRoaXMuc2F2ZVRlbnNvcnNGb3JCYWNrd2FyZE1vZGUodGVuc29yc1RvU2F2ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBvdXRUZW5zb3JzO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHsgZm9yd2FyZEZ1bmMgfSA9IGtlcm5lbFBhcmFtcztcbiAgICAgICAgICAgIC8vIFJ1bm5pbmcgYSBjdXN0b21HcmFkIG9wLlxuICAgICAgICAgICAgY29uc3Qgc2F2ZUZ1bmMgPSAodGVuc29ycykgPT4ge1xuICAgICAgICAgICAgICAgIC8vIERvIG5vdCBzYXZlIHVubGVzcyB3ZSBhcmUgcmVjb3JkaW5nIHRvIHRoZSB0YXBlLiBPdGhlcndpc2UgaXQgd291bGRcbiAgICAgICAgICAgICAgICAvLyBjYXVzZSBhIG1lbSBsZWFrIHNpbmNlIHdlIHdvdWxkIG5ldmVyIHJ1biBiYWNrcHJvcCwgd2hpY2ggZGlzcG9zZXNcbiAgICAgICAgICAgICAgICAvLyB0aGUga2VwdCB0ZW5zb3JzLlxuICAgICAgICAgICAgICAgIGlmICghaXNUYXBlT24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzYXZlZCA9IHRlbnNvcnMubWFwKHRlbnNvciA9PiB0aGlzLmtlZXAodGhpcy5jbG9uZSh0ZW5zb3IpKSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAga2VybmVsRnVuYyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBudW1EYXRhSWRzQmVmb3JlID0gdGhpcy5iYWNrZW5kLm51bURhdGFJZHMoKTtcbiAgICAgICAgICAgICAgICBvdXQgPSB0aGlzLnRpZHkoKCkgPT4gZm9yd2FyZEZ1bmModGhpcy5iYWNrZW5kLCBzYXZlRnVuYykpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG91dHMgPSAoQXJyYXkuaXNBcnJheShvdXQpID8gb3V0IDogW291dF0pO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3VsZENoZWNrRm9yTWVtTGVha3MoKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTY29wZSBuYW1lIGlzIHVzZWQgdG8gcHJpbnQgYSBtb3JlIGhlbHBmdWwgZXJyb3IgbWVzc2FnZSBpZiBuZWVkZWQuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tLZXJuZWxGb3JNZW1MZWFrKGtlcm5lbE9yU2NvcGVOYW1lLCBudW1EYXRhSWRzQmVmb3JlLCBvdXRzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG91dHM7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIC8vXG4gICAgICAgIC8vIFJ1biB0aGUga2VybmVsRnVuYy4gT3B0aW9uYWxseSBwcm9maWxpbmcgaXQuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHsgaW5wdXRzLCBhdHRycyB9ID0ga2VybmVsUGFyYW1zO1xuICAgICAgICBjb25zdCBiYWNrd2FyZHNGdW5jID0gaXNSZWdpc3RlcmVkS2VybmVsSW52b2NhdGlvbihrZXJuZWxQYXJhbXMpID9cbiAgICAgICAgICAgIG51bGwgOlxuICAgICAgICAgICAga2VybmVsUGFyYW1zLmJhY2t3YXJkc0Z1bmM7XG4gICAgICAgIGxldCBrZXJuZWxQcm9maWxlO1xuICAgICAgICB0aGlzLnNjb3BlZFJ1bihcbiAgICAgICAgLy8gU3RvcCByZWNvcmRpbmcgdG8gYSB0YXBlIHdoZW4gcnVubmluZyBhIGtlcm5lbC5cbiAgICAgICAgKCkgPT4gdGhpcy5zdGF0ZS5rZXJuZWxEZXB0aCsrLCAoKSA9PiB0aGlzLnN0YXRlLmtlcm5lbERlcHRoLS0sICgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5FTlYuZ2V0Qm9vbCgnREVCVUcnKSAmJiAhdGhpcy5zdGF0ZS5wcm9maWxpbmcpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRzID0ga2VybmVsRnVuYygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAga2VybmVsUHJvZmlsZSA9IHRoaXMucHJvZmlsZXIucHJvZmlsZUtlcm5lbChrZXJuZWxPclNjb3BlTmFtZSwgaW5wdXRzLCAoKSA9PiBrZXJuZWxGdW5jKCkpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLkVOVi5nZXRCb29sKCdERUJVRycpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvZmlsZXIubG9nS2VybmVsUHJvZmlsZShrZXJuZWxQcm9maWxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3V0cHV0cyA9IGtlcm5lbFByb2ZpbGUub3V0cHV0cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChpc1RhcGVPbikge1xuICAgICAgICAgICAgdGhpcy5hZGRUYXBlTm9kZShrZXJuZWxPclNjb3BlTmFtZSwgaW5wdXRzLCBvdXRwdXRzLCBiYWNrd2FyZHNGdW5jLCBzYXZlZCwgYXR0cnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLnByb2ZpbGluZykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS5hY3RpdmVQcm9maWxlLmtlcm5lbHMucHVzaCh7XG4gICAgICAgICAgICAgICAgbmFtZToga2VybmVsT3JTY29wZU5hbWUsXG4gICAgICAgICAgICAgICAgYnl0ZXNBZGRlZDogdGhpcy5zdGF0ZS5udW1CeXRlcyAtIHN0YXJ0aW5nQnl0ZWNvdW50LFxuICAgICAgICAgICAgICAgIHRvdGFsQnl0ZXNTbmFwc2hvdDogdGhpcy5zdGF0ZS5udW1CeXRlcyxcbiAgICAgICAgICAgICAgICB0ZW5zb3JzQWRkZWQ6IHRoaXMuc3RhdGUubnVtVGVuc29ycyAtIHN0YXJ0aW5nTnVtVGVuc29ycyxcbiAgICAgICAgICAgICAgICB0b3RhbFRlbnNvcnNTbmFwc2hvdDogdGhpcy5zdGF0ZS5udW1UZW5zb3JzLFxuICAgICAgICAgICAgICAgIGlucHV0U2hhcGVzOiBPYmplY3Qua2V5cyhpbnB1dHMpLm1hcChrZXkgPT4gaW5wdXRzW2tleV0gIT0gbnVsbCA/IGlucHV0c1trZXldLnNoYXBlIDogbnVsbCksXG4gICAgICAgICAgICAgICAgb3V0cHV0U2hhcGVzOiBvdXRwdXRzLm1hcChpdGVtID0+IGl0ZW0uc2hhcGUpLFxuICAgICAgICAgICAgICAgIGtlcm5lbFRpbWVNczoga2VybmVsUHJvZmlsZS50aW1lTXMsXG4gICAgICAgICAgICAgICAgZXh0cmFJbmZvOiBrZXJuZWxQcm9maWxlLmV4dHJhSW5mb1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChBcnJheS5pc0FycmF5KG91dCkgPyBvdXRwdXRzIDogb3V0cHV0c1swXSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNhdmVzIHRlbnNvcnMgdXNlZCBpbiBmb3J3YXJkIG1vZGUgZm9yIHVzZSBpbiBiYWNrd2FyZCBtb2RlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRlbnNvcnMgdGhlIGxpc3Qgb2YgdGVuc29ycyB0byBzYXZlLlxuICAgICAqL1xuICAgIHNhdmVUZW5zb3JzRm9yQmFja3dhcmRNb2RlKHRlbnNvcnMpIHtcbiAgICAgICAgY29uc3Qgc2F2ZWQgPSB0ZW5zb3JzLm1hcCh0ZW5zb3IgPT4gdGhpcy5rZWVwKHRoaXMuY2xvbmUodGVuc29yKSkpO1xuICAgICAgICByZXR1cm4gc2F2ZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHRlbnNvcnMgdG8gc2F2ZSBmb3IgYSBnaXZlbiBncmFkaWVudCBjYWxjdWxhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBrZXJuZWxOYW1lIG5hbWUgb2Yga2VybmVsIHRvIGxvb2sgdXAgZ3JhZGllbnQgZm9yLlxuICAgICAqIEBwYXJhbSBpbnB1dHMgYSBtYXAgb2YgaW5wdXQgdGVuc29ycy5cbiAgICAgKiBAcGFyYW0gb3V0cHV0cyBhbiBhcnJheSBvZiBvdXRwdXQgdGVuc29ycyBmcm9tIGZvcndhcmQgbW9kZSBvZiBrZXJuZWwuXG4gICAgICovXG4gICAgZ2V0VGVuc29yc0ZvckdyYWRpZW50KGtlcm5lbE5hbWUsIGlucHV0cywgb3V0cHV0cykge1xuICAgICAgICBjb25zdCBncmFkQ29uZmlnID0gZ2V0R3JhZGllbnQoa2VybmVsTmFtZSk7XG4gICAgICAgIGlmIChncmFkQ29uZmlnICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0c1RvU2F2ZSA9IGdyYWRDb25maWcuaW5wdXRzVG9TYXZlIHx8IFtdO1xuICAgICAgICAgICAgY29uc3Qgb3V0cHV0c1RvU2F2ZSA9IGdyYWRDb25maWcub3V0cHV0c1RvU2F2ZSB8fCBbXTtcbiAgICAgICAgICAgIC8vIElmIHNhdmVBbGxJbnB1dHMgaXMgdHJ1ZSwgYWxsIGlucHV0cyB3aWxsIGJlIHNhdmVkLiBPdGhlcndpc2UsIGlucHV0c1xuICAgICAgICAgICAgLy8gc3BlY2lmaWVkIGluIGlucHV0c1RvU2F2ZSB3aWxsIGJlIHNhdmVkLlxuICAgICAgICAgICAgbGV0IGlucHV0VGVuc29yc1RvU2F2ZTtcbiAgICAgICAgICAgIGlmIChncmFkQ29uZmlnLnNhdmVBbGxJbnB1dHMpIHtcbiAgICAgICAgICAgICAgICB1dGlsLmFzc2VydChBcnJheS5pc0FycmF5KGlucHV0cyksICgpID0+ICdzYXZlQWxsSW5wdXRzIGlzIHRydWUsIGV4cGVjdGVkIGlucHV0cyB0byBiZSBhbiBhcnJheS4nKTtcbiAgICAgICAgICAgICAgICBpbnB1dFRlbnNvcnNUb1NhdmUgPSBPYmplY3Qua2V5cyhpbnB1dHMpLm1hcCgoa2V5KSA9PiBpbnB1dHNba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbnB1dFRlbnNvcnNUb1NhdmUgPSBpbnB1dHNUb1NhdmUubWFwKChpbnB1dE5hbWUpID0+IGlucHV0c1tpbnB1dE5hbWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG91dHB1dFRlbnNvcnNUb1NhdmUgPSBvdXRwdXRzLmZpbHRlcigoXywgaSkgPT4gb3V0cHV0c1RvU2F2ZVtpXSk7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXRUZW5zb3JzVG9TYXZlLmNvbmNhdChvdXRwdXRUZW5zb3JzVG9TYXZlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXZSByZXR1cm4gYW4gZW1wdHkgbGlzdCByYXRoZXIgdGhhbiB0aHJvdyBhbiBlcnJvciBiZWNhdXNlIHRoZSBrZXJuZWwgd2VcbiAgICAgICAgLy8gYXJlIGxvb2tpbmcgdXAgbWF5IG5vdCBhY3R1YWxseSBiZSByZWxldmFudCB0byBiYWNrcHJvcGluZyB0aHJvdWdoIHRoZVxuICAgICAgICAvLyBvdmVyYWxsIGZ1bmN0aW9uXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFNlZSAnZG9lcyBub3QgZXJyb3IgaWYgaXJyZWxldmFudCAocHJ1bmVkKSBvcHMgYXJlIG1pc3NpbmcgZ3JhZHMnIHRlc3RcbiAgICAgICAgLy8gaW4gZ3JhZGllbnRzX3Rlc3QudHMgZm9yIGFuIGV4YW1wbGUuXG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgbWV0aG9kIHVzZWQgYnkgcHVibGljIEFQSXMgZm9yIHRlbnNvciBjcmVhdGlvbi4gTWFrZXMgYSBuZXdcbiAgICAgKiB0ZW5zb3Igd2l0aCB0aGUgcHJvdmlkZWQgc2hhcGUsIGR0eXBlIGFuZCB2YWx1ZXMuIEl0IGFsd2F5c1xuICAgICAqIGNyZWF0ZXMgYSBuZXcgZGF0YSBpZCBhbmQgd3JpdGVzIHRoZSB2YWx1ZXMgdG8gdGhlIHVuZGVybHlpbmcgYmFja2VuZC5cbiAgICAgKi9cbiAgICBtYWtlVGVuc29yKHZhbHVlcywgc2hhcGUsIGR0eXBlLCBiYWNrZW5kKSB7XG4gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZXMgcGFzc2VkIHRvIGVuZ2luZS5tYWtlVGVuc29yKCkgYXJlIG51bGwnKTtcbiAgICAgICAgfVxuICAgICAgICBkdHlwZSA9IGR0eXBlIHx8ICdmbG9hdDMyJztcbiAgICAgICAgYmFja2VuZCA9IGJhY2tlbmQgfHwgdGhpcy5iYWNrZW5kO1xuICAgICAgICBsZXQgYmFja2VuZFZhbHMgPSB2YWx1ZXM7XG4gICAgICAgIGlmIChkdHlwZSA9PT0gJ3N0cmluZycgJiYgdXRpbC5pc1N0cmluZyh2YWx1ZXNbMF0pKSB7XG4gICAgICAgICAgICBiYWNrZW5kVmFscyA9IHZhbHVlcy5tYXAoZCA9PiB1dGlsLmVuY29kZVN0cmluZyhkKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YUlkID0gYmFja2VuZC53cml0ZShiYWNrZW5kVmFscywgc2hhcGUsIGR0eXBlKTtcbiAgICAgICAgY29uc3QgdCA9IG5ldyBUZW5zb3Ioc2hhcGUsIGR0eXBlLCBkYXRhSWQsIHRoaXMubmV4dFRlbnNvcklkKCkpO1xuICAgICAgICB0aGlzLnRyYWNrVGVuc29yKHQsIGJhY2tlbmQpO1xuICAgICAgICAvLyBDb3VudCBieXRlcyBmb3Igc3RyaW5nIHRlbnNvcnMuXG4gICAgICAgIGlmIChkdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZm8gPSB0aGlzLnN0YXRlLnRlbnNvckluZm8uZ2V0KGRhdGFJZCk7XG4gICAgICAgICAgICBjb25zdCBuZXdCeXRlcyA9IGJ5dGVzRnJvbVN0cmluZ0FycmF5KGJhY2tlbmRWYWxzKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUubnVtQnl0ZXMgKz0gbmV3Qnl0ZXMgLSBpbmZvLmJ5dGVzO1xuICAgICAgICAgICAgaW5mby5ieXRlcyA9IG5ld0J5dGVzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnRlcm5hbCBtZXRob2QgdXNlZCBieSBiYWNrZW5kcy4gTWFrZXMgYSBuZXcgdGVuc29yXG4gICAgICogdGhhdCBpcyBhIHdyYXBwZXIgYXJvdW5kIGFuIGV4aXN0aW5nIGRhdGEgaWQuIEl0IGRvZXNuJ3QgY3JlYXRlXG4gICAgICogYSBuZXcgZGF0YSBpZCwgb25seSBpbmNyZW1lbnRzIHRoZSByZWYgY291bnQgdXNlZCBpbiBtZW1vcnkgdHJhY2tpbmcuXG4gICAgICovXG4gICAgbWFrZVRlbnNvckZyb21EYXRhSWQoZGF0YUlkLCBzaGFwZSwgZHR5cGUsIGJhY2tlbmQpIHtcbiAgICAgICAgZHR5cGUgPSBkdHlwZSB8fCAnZmxvYXQzMic7XG4gICAgICAgIGNvbnN0IHQgPSBuZXcgVGVuc29yKHNoYXBlLCBkdHlwZSwgZGF0YUlkLCB0aGlzLm5leHRUZW5zb3JJZCgpKTtcbiAgICAgICAgdGhpcy50cmFja1RlbnNvcih0LCBiYWNrZW5kKTtcbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfVxuICAgIG1ha2VWYXJpYWJsZShpbml0aWFsVmFsdWUsIHRyYWluYWJsZSA9IHRydWUsIG5hbWUsIGR0eXBlKSB7XG4gICAgICAgIG5hbWUgPSBuYW1lIHx8IHRoaXMubmV4dFZhcmlhYmxlSWQoKS50b1N0cmluZygpO1xuICAgICAgICBpZiAoZHR5cGUgIT0gbnVsbCAmJiBkdHlwZSAhPT0gaW5pdGlhbFZhbHVlLmR0eXBlKSB7XG4gICAgICAgICAgICBpbml0aWFsVmFsdWUgPSBpbml0aWFsVmFsdWUuY2FzdChkdHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdiA9IG5ldyBWYXJpYWJsZShpbml0aWFsVmFsdWUsIHRyYWluYWJsZSwgbmFtZSwgdGhpcy5uZXh0VGVuc29ySWQoKSk7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLnJlZ2lzdGVyZWRWYXJpYWJsZXNbdi5uYW1lXSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFZhcmlhYmxlIHdpdGggbmFtZSAke3YubmFtZX0gd2FzIGFscmVhZHkgcmVnaXN0ZXJlZGApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdGUucmVnaXN0ZXJlZFZhcmlhYmxlc1t2Lm5hbWVdID0gdjtcbiAgICAgICAgdGhpcy5pbmNSZWYodiwgdGhpcy5iYWNrZW5kKTtcbiAgICAgICAgcmV0dXJuIHY7XG4gICAgfVxuICAgIHRyYWNrVGVuc29yKGEsIGJhY2tlbmQpIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5udW1UZW5zb3JzKys7XG4gICAgICAgIGlmIChhLmR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS5udW1TdHJpbmdUZW5zb3JzKys7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQnl0ZXMgZm9yIGNvbXBsZXggbnVtYmVycyBhcmUgY291bnRlZCBieSB0aGVpciBjb21wb25lbnRzLiBCeXRlcyBmb3JcbiAgICAgICAgLy8gc3RyaW5nIHRlbnNvcnMgYXJlIGNvdW50ZWQgd2hlbiB3cml0aW5nIHZhbHVlcy5cbiAgICAgICAgbGV0IGJ5dGVzID0gMDtcbiAgICAgICAgaWYgKGEuZHR5cGUgIT09ICdjb21wbGV4NjQnICYmIGEuZHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBieXRlcyA9IGEuc2l6ZSAqIHV0aWwuYnl0ZXNQZXJFbGVtZW50KGEuZHR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdGUubnVtQnl0ZXMgKz0gYnl0ZXM7XG4gICAgICAgIGlmICghdGhpcy5zdGF0ZS50ZW5zb3JJbmZvLmhhcyhhLmRhdGFJZCkpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUubnVtRGF0YUJ1ZmZlcnMrKztcbiAgICAgICAgICAgIHRoaXMuc3RhdGUudGVuc29ySW5mby5zZXQoYS5kYXRhSWQsIHtcbiAgICAgICAgICAgICAgICBiYWNrZW5kOiBiYWNrZW5kIHx8IHRoaXMuYmFja2VuZCxcbiAgICAgICAgICAgICAgICBkdHlwZTogYS5kdHlwZSxcbiAgICAgICAgICAgICAgICBzaGFwZTogYS5zaGFwZSxcbiAgICAgICAgICAgICAgICBieXRlc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEoYSBpbnN0YW5jZW9mIFZhcmlhYmxlKSkge1xuICAgICAgICAgICAgdGhpcy50cmFjayhhKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUcmFjayB0aGUgdGVuc29yIGJ5IGRhdGFJZCBhbmQgaW5jcmVhc2UgdGhlIHJlZkNvdW50IGZvciB0aGUgZGF0YUlkIGluIHRoZVxuICAgIC8vIGJhY2tlbmQuXG4gICAgLy8gVE9ETyhweXUxMDA1NSk6IFRoaXMgaXMgY3VycmVudGx5IHVzZWQgYnkgbWFrZVZhcmlhYmxlIG1ldGhvZCwgdG8gaW5jcmVhc2VcbiAgICAvLyByZWZDb3VudCBvbiB0aGUgYmFja2VuZCBmb3IgdGhlIGRhdGFJZC4gSXQgY2FuIHBvdGVudGlhbGx5IGJlIHJlcGxhY2VkIHdpdGhcbiAgICAvLyBJZGVudGl0eSBvcCBpbmRlYWQgb2YgY2FsbGluZyBiYWNrZW5kIGRpcmVjdGx5LlxuICAgIGluY1JlZihhLCBiYWNrZW5kKSB7XG4gICAgICAgIHRoaXMudHJhY2tUZW5zb3IoYSwgYmFja2VuZCk7XG4gICAgICAgIHRoaXMuYmFja2VuZC5pbmNSZWYoYS5kYXRhSWQpO1xuICAgIH1cbiAgICByZW1vdmVEYXRhSWQoZGF0YUlkLCBiYWNrZW5kKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLnRlbnNvckluZm8uaGFzKGRhdGFJZCkgJiZcbiAgICAgICAgICAgIHRoaXMuc3RhdGUudGVuc29ySW5mby5nZXQoZGF0YUlkKS5iYWNrZW5kID09PSBiYWNrZW5kKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlLnRlbnNvckluZm8uZGVsZXRlKGRhdGFJZCk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlLm51bURhdGFCdWZmZXJzLS07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGlzcG9zZVRlbnNvcihhKSB7XG4gICAgICAgIGlmICghdGhpcy5zdGF0ZS50ZW5zb3JJbmZvLmhhcyhhLmRhdGFJZCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmZvID0gdGhpcy5zdGF0ZS50ZW5zb3JJbmZvLmdldChhLmRhdGFJZCk7XG4gICAgICAgIHRoaXMuc3RhdGUubnVtVGVuc29ycy0tO1xuICAgICAgICBpZiAoYS5kdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUubnVtU3RyaW5nVGVuc29ycy0tO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS5udW1CeXRlcyAtPSBpbmZvLmJ5dGVzO1xuICAgICAgICB9XG4gICAgICAgIC8vIERvbid0IGNvdW50IGJ5dGVzIGZvciBjb21wbGV4IG51bWJlcnMgYXMgdGhleSBhcmUgY291bnRlZCBieSB0aGVpclxuICAgICAgICAvLyBjb21wb25lbnRzLlxuICAgICAgICBpZiAoYS5kdHlwZSAhPT0gJ2NvbXBsZXg2NCcgJiYgYS5kdHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnN0IGJ5dGVzID0gYS5zaXplICogdXRpbC5ieXRlc1BlckVsZW1lbnQoYS5kdHlwZSk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlLm51bUJ5dGVzIC09IGJ5dGVzO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlbW92ZSB0aGUgcmVmZXJlbmNlIHRvIGRhdGFJZCBpZiBiYWNrZW5kIGRpc3Bvc2UgdGhlIGRhdGEgc3VjY2Vzc2Z1bGx5XG4gICAgICAgIGlmIChpbmZvLmJhY2tlbmQuZGlzcG9zZURhdGEoYS5kYXRhSWQpKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZURhdGFJZChhLmRhdGFJZCwgaW5mby5iYWNrZW5kKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPKG5zdGhvcmF0KTogQ29uc3RydWN0IGFuIGVycm9yIGFuZCBzYXZlIHRoZSBzdGFjayB0cmFjZSBmb3JcbiAgICAgICAgLy8gZGVidWdnaW5nIHdoZW4gaW4gZGVidWcgbW9kZS4gQ3JlYXRpbmcgYSBzdGFjayB0cmFjZSBpcyB0b28gZXhwZW5zaXZlXG4gICAgICAgIC8vIHRvIGRvIHVuY29uZGl0aW9uYWxseS5cbiAgICB9XG4gICAgZGlzcG9zZVZhcmlhYmxlcygpIHtcbiAgICAgICAgZm9yIChjb25zdCB2YXJOYW1lIGluIHRoaXMuc3RhdGUucmVnaXN0ZXJlZFZhcmlhYmxlcykge1xuICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMuc3RhdGUucmVnaXN0ZXJlZFZhcmlhYmxlc1t2YXJOYW1lXTtcbiAgICAgICAgICAgIHRoaXMuZGlzcG9zZVZhcmlhYmxlKHYpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2VWYXJpYWJsZSh2KSB7XG4gICAgICAgIHRoaXMuZGlzcG9zZVRlbnNvcih2KTtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUucmVnaXN0ZXJlZFZhcmlhYmxlc1t2Lm5hbWVdICE9IG51bGwpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnN0YXRlLnJlZ2lzdGVyZWRWYXJpYWJsZXNbdi5uYW1lXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBtZW1vcnkoKSB7XG4gICAgICAgIGNvbnN0IGluZm8gPSB0aGlzLmJhY2tlbmQubWVtb3J5KCk7XG4gICAgICAgIGluZm8ubnVtVGVuc29ycyA9IHRoaXMuc3RhdGUubnVtVGVuc29ycztcbiAgICAgICAgaW5mby5udW1EYXRhQnVmZmVycyA9IHRoaXMuc3RhdGUubnVtRGF0YUJ1ZmZlcnM7XG4gICAgICAgIGluZm8ubnVtQnl0ZXMgPSB0aGlzLnN0YXRlLm51bUJ5dGVzO1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5udW1TdHJpbmdUZW5zb3JzID4gMCkge1xuICAgICAgICAgICAgaW5mby51bnJlbGlhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChpbmZvLnJlYXNvbnMgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGluZm8ucmVhc29ucyA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5mby5yZWFzb25zLnB1c2goJ01lbW9yeSB1c2FnZSBieSBzdHJpbmcgdGVuc29ycyBpcyBhcHByb3hpbWF0ZSAnICtcbiAgICAgICAgICAgICAgICAnKDIgYnl0ZXMgcGVyIGNoYXJhY3RlciknKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5mbztcbiAgICB9XG4gICAgYXN5bmMgcHJvZmlsZShxdWVyeSkge1xuICAgICAgICB0aGlzLnN0YXRlLnByb2ZpbGluZyA9IHRydWU7XG4gICAgICAgIGNvbnN0IHN0YXJ0Qnl0ZXMgPSB0aGlzLnN0YXRlLm51bUJ5dGVzO1xuICAgICAgICBjb25zdCBzdGFydE51bVRlbnNvcnMgPSB0aGlzLnN0YXRlLm51bVRlbnNvcnM7XG4gICAgICAgIHRoaXMuc3RhdGUuYWN0aXZlUHJvZmlsZS5rZXJuZWxzID0gW107XG4gICAgICAgIHRoaXMuc3RhdGUuYWN0aXZlUHJvZmlsZS5yZXN1bHQgPSBhd2FpdCBxdWVyeSgpO1xuICAgICAgICB0aGlzLnN0YXRlLnByb2ZpbGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnN0YXRlLmFjdGl2ZVByb2ZpbGUucGVha0J5dGVzID0gTWF0aC5tYXgoLi4udGhpcy5zdGF0ZS5hY3RpdmVQcm9maWxlLmtlcm5lbHMubWFwKGQgPT4gZC50b3RhbEJ5dGVzU25hcHNob3QpKTtcbiAgICAgICAgdGhpcy5zdGF0ZS5hY3RpdmVQcm9maWxlLm5ld0J5dGVzID0gdGhpcy5zdGF0ZS5udW1CeXRlcyAtIHN0YXJ0Qnl0ZXM7XG4gICAgICAgIHRoaXMuc3RhdGUuYWN0aXZlUHJvZmlsZS5uZXdUZW5zb3JzID1cbiAgICAgICAgICAgIHRoaXMuc3RhdGUubnVtVGVuc29ycyAtIHN0YXJ0TnVtVGVuc29ycztcbiAgICAgICAgZm9yIChjb25zdCBrZXJuZWwgb2YgdGhpcy5zdGF0ZS5hY3RpdmVQcm9maWxlLmtlcm5lbHMpIHtcbiAgICAgICAgICAgIGtlcm5lbC5rZXJuZWxUaW1lTXMgPSBhd2FpdCBrZXJuZWwua2VybmVsVGltZU1zO1xuICAgICAgICAgICAga2VybmVsLmV4dHJhSW5mbyA9IGF3YWl0IGtlcm5lbC5leHRyYUluZm87XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuYWN0aXZlUHJvZmlsZTtcbiAgICB9XG4gICAgaXNUYXBlT24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLmdyYWRpZW50RGVwdGggPiAwICYmIHRoaXMuc3RhdGUua2VybmVsRGVwdGggPT09IDA7XG4gICAgfVxuICAgIGFkZFRhcGVOb2RlKGtlcm5lbE5hbWUsIGlucHV0cywgb3V0cHV0cywgZ3JhZGllbnRzRnVuYywgc2F2ZWQsIGF0dHJzKSB7XG4gICAgICAgIGNvbnN0IHRhcGVOb2RlID0geyBpZDogdGhpcy5zdGF0ZS5uZXh0VGFwZU5vZGVJZCsrLCBrZXJuZWxOYW1lLCBpbnB1dHMsIG91dHB1dHMsIHNhdmVkIH07XG4gICAgICAgIGNvbnN0IGdyYWRDb25maWcgPSBnZXRHcmFkaWVudChrZXJuZWxOYW1lKTtcbiAgICAgICAgaWYgKGdyYWRDb25maWcgIT0gbnVsbCkge1xuICAgICAgICAgICAgZ3JhZGllbnRzRnVuYyA9IGdyYWRDb25maWcuZ3JhZEZ1bmM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdyYWRpZW50c0Z1bmMgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGFwZU5vZGUuZ3JhZGllbnQgPSAoZHlzKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETyhzbWlsa292KTogVG8gb3B0aW1pemUgYmFjay1wcm9wLCBwYXNzIGR5cyB0aGF0IGFyZSBub3QgdXNlZCBpblxuICAgICAgICAgICAgICAgIC8vIHRoZSBiYWNrcHJvcCBncmFwaCB0byB0aGUgdXNlciBhcyBudWxsIGluc3RlYWQgb2YgemVyb3NcbiAgICAgICAgICAgICAgICBkeXMgPSBkeXMubWFwKChkeSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZHkgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0ID0gb3V0cHV0c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHMgPSB1dGlsLm1ha2VaZXJvc1R5cGVkQXJyYXkob3V0cHV0LnNpemUsIG91dHB1dC5kdHlwZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tYWtlVGVuc29yKHZhbHMsIG91dHB1dC5zaGFwZSwgb3V0cHV0LmR0eXBlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZHk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gR3JhZCBmdW5jdGlvbnMgb2Ygb3BzIHdpdGggc2luZ2xlIG91dHB1dHMgZXhwZWN0IGEgZHksIHdoaWxlIG9wc1xuICAgICAgICAgICAgICAgIC8vIHdpdGggbXVsdGlwbGUgb3V0cHV0cyBleHBlY3QgZHlzIChhcnJheSBvZiBkeSkuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGdyYWRpZW50c0Z1bmMoZHlzLmxlbmd0aCA+IDEgPyBkeXMgOiBkeXNbMF0sIHNhdmVkLCBhdHRycyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdGUuYWN0aXZlVGFwZS5wdXNoKHRhcGVOb2RlKTtcbiAgICB9XG4gICAga2VlcChyZXN1bHQpIHtcbiAgICAgICAgcmVzdWx0LmtlcHQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBzdGFydFRhcGUoKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmdyYWRpZW50RGVwdGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuYWN0aXZlVGFwZSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdGUuZ3JhZGllbnREZXB0aCsrO1xuICAgIH1cbiAgICBlbmRUYXBlKCkge1xuICAgICAgICB0aGlzLnN0YXRlLmdyYWRpZW50RGVwdGgtLTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RhcnQgYSBzY29wZS4gVXNlIHRoaXMgd2l0aCBlbmRTY29wZSgpIHRvIGFjaGlldmUgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eVxuICAgICAqIGFzIHNjb3BlKCkgd2l0aG91dCB0aGUgbmVlZCBmb3IgYSBmdW5jdGlvbiBjbG9zdXJlLlxuICAgICAqL1xuICAgIHN0YXJ0U2NvcGUobmFtZSkge1xuICAgICAgICBjb25zdCBzY29wZUluZm8gPSB7XG4gICAgICAgICAgICB0cmFjazogW10sXG4gICAgICAgICAgICBuYW1lOiAndW5uYW1lZCBzY29wZScsXG4gICAgICAgICAgICBpZDogdGhpcy5zdGF0ZS5uZXh0U2NvcGVJZCsrXG4gICAgICAgIH07XG4gICAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgICAgICBzY29wZUluZm8ubmFtZSA9IG5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGF0ZS5zY29wZVN0YWNrLnB1c2goc2NvcGVJbmZvKTtcbiAgICAgICAgdGhpcy5zdGF0ZS5hY3RpdmVTY29wZSA9IHNjb3BlSW5mbztcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5kIGEgc2NvcGUuIFVzZSB0aGlzIHdpdGggc3RhcnRTY29wZSgpIHRvIGFjaGlldmUgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eVxuICAgICAqIGFzIHNjb3BlKCkgd2l0aG91dCB0aGUgbmVlZCBmb3IgYSBmdW5jdGlvbiBjbG9zdXJlLlxuICAgICAqL1xuICAgIGVuZFNjb3BlKHJlc3VsdCkge1xuICAgICAgICBjb25zdCB0ZW5zb3JzVG9UcmFja0luUGFyZW50ID0gZ2V0VGVuc29yc0luQ29udGFpbmVyKHJlc3VsdCk7XG4gICAgICAgIGNvbnN0IHRlbnNvcnNUb1RyYWNrSW5QYXJlbnRTZXQgPSBuZXcgU2V0KHRlbnNvcnNUb1RyYWNrSW5QYXJlbnQubWFwKHQgPT4gdC5pZCkpO1xuICAgICAgICAvLyBEaXNwb3NlIHRoZSBhcnJheXMgdHJhY2tlZCBpbiB0aGlzIHNjb3BlLlxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc3RhdGUuYWN0aXZlU2NvcGUudHJhY2subGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHRlbnNvciA9IHRoaXMuc3RhdGUuYWN0aXZlU2NvcGUudHJhY2tbaV07XG4gICAgICAgICAgICBpZiAoIXRlbnNvci5rZXB0ICYmICF0ZW5zb3JzVG9UcmFja0luUGFyZW50U2V0Lmhhcyh0ZW5zb3IuaWQpKSB7XG4gICAgICAgICAgICAgICAgdGVuc29yLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvbGRTY29wZSA9IHRoaXMuc3RhdGUuc2NvcGVTdGFjay5wb3AoKTtcbiAgICAgICAgdGhpcy5zdGF0ZS5hY3RpdmVTY29wZSA9IHRoaXMuc3RhdGUuc2NvcGVTdGFjay5sZW5ndGggPT09IDAgP1xuICAgICAgICAgICAgbnVsbCA6XG4gICAgICAgICAgICB0aGlzLnN0YXRlLnNjb3BlU3RhY2tbdGhpcy5zdGF0ZS5zY29wZVN0YWNrLmxlbmd0aCAtIDFdO1xuICAgICAgICAvLyBUcmFjayB0aGUgY3VycmVudCByZXN1bHQgaW4gdGhlIHBhcmVudCBzY29wZS5cbiAgICAgICAgdGVuc29yc1RvVHJhY2tJblBhcmVudC5mb3JFYWNoKHRlbnNvciA9PiB7XG4gICAgICAgICAgICAvLyBPbmx5IHRyYWNrIHRoZSB0ZW5zb3IgaWYgd2FzIGFsbG9jYXRlZCBpbiB0aGUgaW5uZXIgc2NvcGUgYW5kIGlzIG5vdFxuICAgICAgICAgICAgLy8gZ2xvYmFsbHkga2VwdC5cbiAgICAgICAgICAgIGlmICghdGVuc29yLmtlcHQgJiYgdGVuc29yLnNjb3BlSWQgPT09IG9sZFNjb3BlLmlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmFjayh0ZW5zb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBncmFkaWVudHMgb2YgYGZgIHdpdGggcmVzcGVjdCB0byBlYWNoIG9mIHRoZSBgeHNgLiBUaGUgZ3JhZGllbnRzXG4gICAgICogcmV0dXJuZWQgYXJlIG9mIHRoZSBzYW1lIGxlbmd0aCBhcyBgeHNgLCBidXQgc29tZSBtaWdodCBiZSBudWxsIGlmIGBmYFxuICAgICAqIHdhcyBub3QgYSBmdW5jdGlvbiBvZiB0aGF0IGB4YC4gSXQgYWxzbyB0YWtlcyBvcHRpb25hbCBkeSB0byBtdWx0aXBseSB0aGVcbiAgICAgKiBncmFkaWVudCwgd2hpY2ggZGVmYXVsdHMgdG8gYDFgLlxuICAgICAqL1xuICAgIGdyYWRpZW50cyhmLCB4cywgZHksIGFsbG93Tm9HcmFkaWVudHMgPSBmYWxzZSkge1xuICAgICAgICB1dGlsLmFzc2VydCh4cy5sZW5ndGggPiAwLCAoKSA9PiAnZ3JhZGllbnRzKCkgcmVjZWl2ZWQgYW4gZW1wdHkgbGlzdCBvZiB4cy4nKTtcbiAgICAgICAgaWYgKGR5ICE9IG51bGwgJiYgZHkuZHR5cGUgIT09ICdmbG9hdDMyJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBkeSBtdXN0IGhhdmUgJ2Zsb2F0MzInIGR0eXBlLCBidXQgaGFzICcke2R5LmR0eXBlfSdgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB5ID0gdGhpcy5zY29wZWRSdW4oKCkgPT4gdGhpcy5zdGFydFRhcGUoKSwgKCkgPT4gdGhpcy5lbmRUYXBlKCksICgpID0+IHRoaXMudGlkeSgnZm9yd2FyZCcsIGYpKTtcbiAgICAgICAgdXRpbC5hc3NlcnQoeSBpbnN0YW5jZW9mIFRlbnNvciwgKCkgPT4gJ1RoZSByZXN1bHQgeSByZXR1cm5lZCBieSBmKCkgbXVzdCBiZSBhIHRlbnNvci4nKTtcbiAgICAgICAgLy8gRmlsdGVyIG91dCB0aGUgbm9kZXMgdGhhdCBkb24ndCBjb25uZWN0IHggPT4geS5cbiAgICAgICAgY29uc3QgZmlsdGVyZWRUYXBlID0gZ2V0RmlsdGVyZWROb2Rlc1hUb1kodGhpcy5zdGF0ZS5hY3RpdmVUYXBlLCB4cywgeSk7XG4gICAgICAgIGlmICghYWxsb3dOb0dyYWRpZW50cyAmJiBmaWx0ZXJlZFRhcGUubGVuZ3RoID09PSAwICYmIHhzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNvbXB1dGUgZ3JhZGllbnQgb2YgeT1mKHgpIHdpdGggcmVzcGVjdCB0byB4LiBNYWtlIHN1cmUgJyArXG4gICAgICAgICAgICAgICAgJ3RoYXQgdGhlIGYgeW91IHBhc3NlZCBlbmNsb3NlcyBhbGwgb3BlcmF0aW9ucyB0aGF0IGxlYWQgZnJvbSB4ICcgK1xuICAgICAgICAgICAgICAgICd0byB5LicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnRpZHkoJ2JhY2t3YXJkJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYWNjdW11bGF0ZWRHcmFkaWVudE1hcCA9IHt9O1xuICAgICAgICAgICAgYWNjdW11bGF0ZWRHcmFkaWVudE1hcFt5LmlkXSA9IChkeSA9PSBudWxsKSA/IG9uZXMoeS5zaGFwZSkgOiBkeTtcbiAgICAgICAgICAgIC8vIEJhY2twcm9wIGdyYWRpZW50cyB0aHJvdWdoIHRoZSBmaWx0ZXJlZCBub2Rlcy5cbiAgICAgICAgICAgIGJhY2twcm9wYWdhdGVHcmFkaWVudHMoYWNjdW11bGF0ZWRHcmFkaWVudE1hcCwgZmlsdGVyZWRUYXBlLCBcbiAgICAgICAgICAgIC8vIFBhc3MgdGhlIHRpZHkgZnVuY3Rpb24gdG8gYXZvaWQgY2lyY3VsYXIgZGVwIHdpdGggYHRhcGUudHNgLlxuICAgICAgICAgICAgZiA9PiB0aGlzLnRpZHkoZiksIFxuICAgICAgICAgICAgLy8gUGFzcyBhbiBhZGQgZnVuY3Rpb24gdG8gYXZvaWRlIGEgY2lyY3VsYXIgZGVwIHdpdGggYHRhcGUudHNgLlxuICAgICAgICAgICAgYWRkKTtcbiAgICAgICAgICAgIGNvbnN0IGdyYWRzID0geHMubWFwKHggPT4gYWNjdW11bGF0ZWRHcmFkaWVudE1hcFt4LmlkXSk7XG4gICAgICAgICAgICBpZiAodGhpcy5zdGF0ZS5ncmFkaWVudERlcHRoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBtZWFucyB0aGF0IHdlIGFyZSBub3QgY29tcHV0aW5nIGhpZ2hlci1vcmRlciBncmFkaWVudHNcbiAgICAgICAgICAgICAgICAvLyBhbmQgY2FuIGNsZWFuIHVwIHRoZSB0YXBlLlxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUuYWN0aXZlVGFwZS5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRlbnNvciBvZiBub2RlLnNhdmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW5zb3IuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5hY3RpdmVUYXBlID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB5LCBncmFkcyB9O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgY3VzdG9tR3JhZChmKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNGdW5jdGlvbihmKSwgKCkgPT4gJ1RoZSBmIHBhc3NlZCBpbiBjdXN0b21HcmFkKGYpIG11c3QgYmUgYSBmdW5jdGlvbi4nKTtcbiAgICAgICAgcmV0dXJuICguLi5pbnB1dHMpID0+IHtcbiAgICAgICAgICAgIHV0aWwuYXNzZXJ0KGlucHV0cy5ldmVyeSh0ID0+IHQgaW5zdGFuY2VvZiBUZW5zb3IpLCAoKSA9PiAnVGhlIGFyZ3MgcGFzc2VkIGluIGN1c3RvbUdyYWQoZikoeDEsIHgyLC4uLikgbXVzdCBhbGwgYmUgJyArXG4gICAgICAgICAgICAgICAgJ3RlbnNvcnMnKTtcbiAgICAgICAgICAgIGxldCByZXM7XG4gICAgICAgICAgICBjb25zdCBpbnB1dE1hcCA9IHt9O1xuICAgICAgICAgICAgaW5wdXRzLmZvckVhY2goKGlucHV0LCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgaW5wdXRNYXBbaV0gPSBpbnB1dDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgZm9yd2FyZEZ1bmMgPSAoXywgc2F2ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJlcyA9IGYoLi4uWy4uLmlucHV0cywgc2F2ZV0pO1xuICAgICAgICAgICAgICAgIHV0aWwuYXNzZXJ0KHJlcy52YWx1ZSBpbnN0YW5jZW9mIFRlbnNvciwgKCkgPT4gJ1RoZSBmdW5jdGlvbiBmIHBhc3NlZCBpbiBjdXN0b21HcmFkKGYpIG11c3QgcmV0dXJuIGFuICcgK1xuICAgICAgICAgICAgICAgICAgICAnb2JqZWN0IHdoZXJlIGBvYmoudmFsdWVgIGlzIGEgdGVuc29yJyk7XG4gICAgICAgICAgICAgICAgdXRpbC5hc3NlcnQodXRpbC5pc0Z1bmN0aW9uKHJlcy5ncmFkRnVuYyksICgpID0+ICdUaGUgZnVuY3Rpb24gZiBwYXNzZWQgaW4gY3VzdG9tR3JhZChmKSBtdXN0IHJldHVybiBhbiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ29iamVjdCB3aGVyZSBgb2JqLmdyYWRGdW5jYCBpcyBhIGZ1bmN0aW9uLicpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXMudmFsdWU7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgYmFja3dhcmRzRnVuYyA9IChkeSwgc2F2ZWQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBncmFkUmVzID0gcmVzLmdyYWRGdW5jKGR5LCBzYXZlZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JhZHMgPSBBcnJheS5pc0FycmF5KGdyYWRSZXMpID8gZ3JhZFJlcyA6IFtncmFkUmVzXTtcbiAgICAgICAgICAgICAgICB1dGlsLmFzc2VydChncmFkcy5sZW5ndGggPT09IGlucHV0cy5sZW5ndGgsICgpID0+ICdUaGUgZnVuY3Rpb24gZiBwYXNzZWQgaW4gY3VzdG9tR3JhZChmKSBtdXN0IHJldHVybiBhbiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ29iamVjdCB3aGVyZSBgb2JqLmdyYWRGdW5jYCBpcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyAnICtcbiAgICAgICAgICAgICAgICAgICAgJ3RoZSBzYW1lIG51bWJlciBvZiB0ZW5zb3JzIGFzIGlucHV0cyBwYXNzZWQgdG8gZiguLi4pLicpO1xuICAgICAgICAgICAgICAgIHV0aWwuYXNzZXJ0KGdyYWRzLmV2ZXJ5KHQgPT4gdCBpbnN0YW5jZW9mIFRlbnNvciksICgpID0+ICdUaGUgZnVuY3Rpb24gZiBwYXNzZWQgaW4gY3VzdG9tR3JhZChmKSBtdXN0IHJldHVybiBhbiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ29iamVjdCB3aGVyZSBgb2JqLmdyYWRGdW5jYCBpcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyAnICtcbiAgICAgICAgICAgICAgICAgICAgJ2EgbGlzdCBvZiBvbmx5IHRlbnNvcnMuJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JhZE1hcCA9IHt9O1xuICAgICAgICAgICAgICAgIGdyYWRzLmZvckVhY2goKGdyYWQsIGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZ3JhZE1hcFtpXSA9ICgpID0+IGdyYWQ7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdyYWRNYXA7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucnVuS2VybmVsRnVuYyh7XG4gICAgICAgICAgICAgICAgZm9yd2FyZEZ1bmMsXG4gICAgICAgICAgICAgICAgYmFja3dhcmRzRnVuYyxcbiAgICAgICAgICAgICAgICBpbnB1dHM6IGlucHV0TWFwLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJlYWRTeW5jKGRhdGFJZCkge1xuICAgICAgICAvLyBSb3V0ZSB0aGUgcmVhZCB0byB0aGUgY29ycmVjdCBiYWNrZW5kLlxuICAgICAgICBjb25zdCBpbmZvID0gdGhpcy5zdGF0ZS50ZW5zb3JJbmZvLmdldChkYXRhSWQpO1xuICAgICAgICByZXR1cm4gaW5mby5iYWNrZW5kLnJlYWRTeW5jKGRhdGFJZCk7XG4gICAgfVxuICAgIHJlYWQoZGF0YUlkKSB7XG4gICAgICAgIC8vIFJvdXRlIHRoZSByZWFkIHRvIHRoZSBjb3JyZWN0IGJhY2tlbmQuXG4gICAgICAgIGNvbnN0IGluZm8gPSB0aGlzLnN0YXRlLnRlbnNvckluZm8uZ2V0KGRhdGFJZCk7XG4gICAgICAgIHJldHVybiBpbmZvLmJhY2tlbmQucmVhZChkYXRhSWQpO1xuICAgIH1cbiAgICBhc3luYyB0aW1lKHF1ZXJ5KSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gbm93KCk7XG4gICAgICAgIGNvbnN0IHRpbWluZ0luZm8gPSBhd2FpdCB0aGlzLmJhY2tlbmQudGltZShxdWVyeSk7XG4gICAgICAgIHRpbWluZ0luZm8ud2FsbE1zID0gbm93KCkgLSBzdGFydDtcbiAgICAgICAgcmV0dXJuIHRpbWluZ0luZm87XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRyYWNrcyBhIFRlbnNvciBpbiB0aGUgY3VycmVudCBzY29wZSB0byBiZSBhdXRvbWF0aWNhbGx5IGNsZWFuZWQgdXBcbiAgICAgKiB3aGVuIHRoZSBjdXJyZW50IHNjb3BlIGVuZHMsIGFuZCByZXR1cm5zIHRoZSB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXN1bHQgVGhlIFRlbnNvciB0byB0cmFjayBpbiB0aGUgY3VycmVudCBzY29wZS5cbiAgICAgKi9cbiAgICB0cmFjayhyZXN1bHQpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuYWN0aXZlU2NvcGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0LnNjb3BlSWQgPSB0aGlzLnN0YXRlLmFjdGl2ZVNjb3BlLmlkO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS5hY3RpdmVTY29wZS50cmFjay5wdXNoKHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZ2V0IHJlZ2lzdGVyZWRWYXJpYWJsZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLnJlZ2lzdGVyZWRWYXJpYWJsZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgZW5naW5lIHN0YXRlLiBSZW1vdmVzIGFsbCBiYWNrZW5kcyBidXQgZG9lcyBub3QgcmVtb3ZlXG4gICAgICogcmVnaXN0ZXJlZCBiYWNrZW5kIGZhY3Rvcmllcy5cbiAgICAgKi9cbiAgICByZXNldCgpIHtcbiAgICAgICAgLy8gTWFrZSBhbnkgcGVuZGluZyBwcm9taXNlIG9ic29sZXRlLlxuICAgICAgICB0aGlzLnBlbmRpbmdCYWNrZW5kSW5pdElkKys7XG4gICAgICAgIHRoaXMuc3RhdGUuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLkVOVi5yZXNldCgpO1xuICAgICAgICB0aGlzLnN0YXRlID0gbmV3IEVuZ2luZVN0YXRlKCk7XG4gICAgICAgIGZvciAoY29uc3QgYmFja2VuZE5hbWUgaW4gdGhpcy5yZWdpc3RyeSkge1xuICAgICAgICAgICAgdGhpcy5kaXNwb3NlUmVnaXN0ZXJlZEtlcm5lbHMoYmFja2VuZE5hbWUpO1xuICAgICAgICAgICAgdGhpcy5yZWdpc3RyeVtiYWNrZW5kTmFtZV0uZGlzcG9zZSgpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMucmVnaXN0cnlbYmFja2VuZE5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYmFja2VuZE5hbWUgPSBudWxsO1xuICAgICAgICB0aGlzLmJhY2tlbmRJbnN0YW5jZSA9IG51bGw7XG4gICAgICAgIHRoaXMucGVuZGluZ0JhY2tlbmRJbml0ID0gbnVsbDtcbiAgICB9XG59XG5FbmdpbmUubmV4dFRlbnNvcklkID0gMDtcbkVuZ2luZS5uZXh0VmFyaWFibGVJZCA9IDA7XG5mdW5jdGlvbiBvbmVzKHNoYXBlKSB7XG4gICAgY29uc3QgdmFsdWVzID0gbWFrZU9uZXNUeXBlZEFycmF5KHNpemVGcm9tU2hhcGUoc2hhcGUpLCAnZmxvYXQzMicpO1xuICAgIHJldHVybiBFTkdJTkUubWFrZVRlbnNvcih2YWx1ZXMsIHNoYXBlLCAnZmxvYXQzMicpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldE9yTWFrZUVuZ2luZSgpIHtcbiAgICBjb25zdCBucyA9IGdldEdsb2JhbE5hbWVzcGFjZSgpO1xuICAgIGlmIChucy5fdGZlbmdpbmUgPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBlbnZpcm9ubWVudCA9IG5ldyBFbnZpcm9ubWVudChucyk7XG4gICAgICAgIG5zLl90ZmVuZ2luZSA9IG5ldyBFbmdpbmUoZW52aXJvbm1lbnQpO1xuICAgIH1cbiAgICBzZXRFbnZpcm9ubWVudEdsb2JhbChucy5fdGZlbmdpbmUuRU5WKTtcbiAgICAvLyBUZWxsIHRoZSBjdXJyZW50IHRlbnNvciBpbnRlcmZhY2UgdGhhdCB0aGUgZ2xvYmFsIGVuZ2luZSBpcyByZXNwb25zaWJsZVxuICAgIC8vIGZvciB0cmFja2luZy5cbiAgICBzZXRUZW5zb3JUcmFja2VyKCgpID0+IG5zLl90ZmVuZ2luZSk7XG4gICAgcmV0dXJuIG5zLl90ZmVuZ2luZTtcbn1cbmV4cG9ydCBjb25zdCBFTkdJTkUgPSBnZXRPck1ha2VFbmdpbmUoKTtcbi8qKlxuICogQSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYWRkIG9wIGZvciB1c2Ugd2l0aGluIGVuZ2luZSBhbmQgdGFwZS5cbiAqXG4gKiBUaGlzIGFsbG93cyB1cyB0byBhdm9pZCBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgYmV0d2VlbiBhZGQudHMgYW5kIGVuZ2luZS5cbiAqIEl0IGlzIGV4cG9ydGVkIHRvIGJlIGF2YWlsYWJsZSBpbiB0YXBlIHRlc3RzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkKGEsIGIpIHtcbiAgICAvLyBXZSBkdXBsaWNhdGUgQWRkIGhlcmUgdG8gYXZvaWQgYSBjaXJjdWxhciBkZXBlbmRlbmN5IHdpdGggYWRkLnRzLlxuICAgIGNvbnN0IGlucHV0cyA9IHsgYSwgYiB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEFkZCwgaW5wdXRzKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVuZ2luZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBpc1Byb21pc2UgfSBmcm9tICcuL3V0aWxfYmFzZSc7XG4vLyBFeHBlY3RzIGZsYWdzIGZyb20gVVJMIGluIHRoZSBmb3JtYXQgP3RmanNmbGFncz1GTEFHMToxLEZMQUcyOnRydWUuXG5jb25zdCBURU5TT1JGTE9XSlNfRkxBR1NfUFJFRklYID0gJ3RmanNmbGFncyc7XG4vKipcbiAqIFRoZSBlbnZpcm9ubWVudCBjb250YWlucyBldmFsdWF0ZWQgZmxhZ3MgYXMgd2VsbCBhcyB0aGUgcmVnaXN0ZXJlZCBwbGF0Zm9ybS5cbiAqIFRoaXMgaXMgYWx3YXlzIHVzZWQgYXMgYSBnbG9iYWwgc2luZ2xldG9uIGFuZCBjYW4gYmUgcmV0cmlldmVkIHdpdGhcbiAqIGB0Zi5lbnYoKWAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0Vudmlyb25tZW50J31cbiAqL1xuZXhwb3J0IGNsYXNzIEVudmlyb25tZW50IHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWFueVxuICAgIGNvbnN0cnVjdG9yKGdsb2JhbCkge1xuICAgICAgICB0aGlzLmdsb2JhbCA9IGdsb2JhbDtcbiAgICAgICAgdGhpcy5mbGFncyA9IHt9O1xuICAgICAgICB0aGlzLmZsYWdSZWdpc3RyeSA9IHt9O1xuICAgICAgICB0aGlzLnVybEZsYWdzID0ge307XG4gICAgICAgIC8vIEphc21pbmUgc3BpZXMgb24gdGhpcyBpbiAnZW52aXJvbm1lbnRfdGVzdC50cydcbiAgICAgICAgdGhpcy5nZXRRdWVyeVBhcmFtcyA9IGdldFF1ZXJ5UGFyYW1zO1xuICAgICAgICB0aGlzLnBvcHVsYXRlVVJMRmxhZ3MoKTtcbiAgICB9XG4gICAgc2V0UGxhdGZvcm0ocGxhdGZvcm1OYW1lLCBwbGF0Zm9ybSkge1xuICAgICAgICBpZiAodGhpcy5wbGF0Zm9ybSAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFBsYXRmb3JtICR7dGhpcy5wbGF0Zm9ybU5hbWV9IGhhcyBhbHJlYWR5IGJlZW4gc2V0LiBgICtcbiAgICAgICAgICAgICAgICBgT3ZlcndyaXRpbmcgdGhlIHBsYXRmb3JtIHdpdGggJHtwbGF0Zm9ybX0uYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wbGF0Zm9ybU5hbWUgPSBwbGF0Zm9ybU5hbWU7XG4gICAgICAgIHRoaXMucGxhdGZvcm0gPSBwbGF0Zm9ybTtcbiAgICB9XG4gICAgcmVnaXN0ZXJGbGFnKGZsYWdOYW1lLCBldmFsdWF0aW9uRm4sIHNldEhvb2spIHtcbiAgICAgICAgdGhpcy5mbGFnUmVnaXN0cnlbZmxhZ05hbWVdID0geyBldmFsdWF0aW9uRm4sIHNldEhvb2sgfTtcbiAgICAgICAgLy8gT3ZlcnJpZGUgdGhlIGZsYWcgdmFsdWUgZnJvbSB0aGUgVVJMLiBUaGlzIGhhcyB0byBoYXBwZW4gaGVyZSBiZWNhdXNlIHRoZVxuICAgICAgICAvLyBlbnZpcm9ubWVudCBpcyBpbml0aWFsaXplZCBiZWZvcmUgZmxhZ3MgZ2V0IHJlZ2lzdGVyZWQuXG4gICAgICAgIGlmICh0aGlzLnVybEZsYWdzW2ZsYWdOYW1lXSAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBmbGFnVmFsdWUgPSB0aGlzLnVybEZsYWdzW2ZsYWdOYW1lXTtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgU2V0dGluZyBmZWF0dXJlIG92ZXJyaWRlIGZyb20gVVJMICR7ZmxhZ05hbWV9OiAke2ZsYWdWYWx1ZX0uYCk7XG4gICAgICAgICAgICB0aGlzLnNldChmbGFnTmFtZSwgZmxhZ1ZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBnZXRBc3luYyhmbGFnTmFtZSkge1xuICAgICAgICBpZiAoZmxhZ05hbWUgaW4gdGhpcy5mbGFncykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmxhZ3NbZmxhZ05hbWVdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmxhZ3NbZmxhZ05hbWVdID0gYXdhaXQgdGhpcy5ldmFsdWF0ZUZsYWcoZmxhZ05hbWUpO1xuICAgICAgICByZXR1cm4gdGhpcy5mbGFnc1tmbGFnTmFtZV07XG4gICAgfVxuICAgIGdldChmbGFnTmFtZSkge1xuICAgICAgICBpZiAoZmxhZ05hbWUgaW4gdGhpcy5mbGFncykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmxhZ3NbZmxhZ05hbWVdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZsYWdWYWx1ZSA9IHRoaXMuZXZhbHVhdGVGbGFnKGZsYWdOYW1lKTtcbiAgICAgICAgaWYgKGlzUHJvbWlzZShmbGFnVmFsdWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZsYWcgJHtmbGFnTmFtZX0gY2Fubm90IGJlIHN5bmNocm9ub3VzbHkgZXZhbHVhdGVkLiBgICtcbiAgICAgICAgICAgICAgICBgUGxlYXNlIHVzZSBnZXRBc3luYygpIGluc3RlYWQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mbGFnc1tmbGFnTmFtZV0gPSBmbGFnVmFsdWU7XG4gICAgICAgIHJldHVybiB0aGlzLmZsYWdzW2ZsYWdOYW1lXTtcbiAgICB9XG4gICAgZ2V0TnVtYmVyKGZsYWdOYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldChmbGFnTmFtZSk7XG4gICAgfVxuICAgIGdldEJvb2woZmxhZ05hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KGZsYWdOYW1lKTtcbiAgICB9XG4gICAgZ2V0RmxhZ3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZsYWdzO1xuICAgIH1cbiAgICAvLyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG4gICAgZ2V0IGZlYXR1cmVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mbGFncztcbiAgICB9XG4gICAgc2V0KGZsYWdOYW1lLCB2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5mbGFnUmVnaXN0cnlbZmxhZ05hbWVdID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHNldCBmbGFnICR7ZmxhZ05hbWV9IGFzIGl0IGhhcyBub3QgYmVlbiByZWdpc3RlcmVkLmApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmxhZ3NbZmxhZ05hbWVdID0gdmFsdWU7XG4gICAgICAgIGlmICh0aGlzLmZsYWdSZWdpc3RyeVtmbGFnTmFtZV0uc2V0SG9vayAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmZsYWdSZWdpc3RyeVtmbGFnTmFtZV0uc2V0SG9vayh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZXZhbHVhdGVGbGFnKGZsYWdOYW1lKSB7XG4gICAgICAgIGlmICh0aGlzLmZsYWdSZWdpc3RyeVtmbGFnTmFtZV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZXZhbHVhdGUgZmxhZyAnJHtmbGFnTmFtZX0nOiBubyBldmFsdWF0aW9uIGZ1bmN0aW9uIGZvdW5kLmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmZsYWdSZWdpc3RyeVtmbGFnTmFtZV0uZXZhbHVhdGlvbkZuKCk7XG4gICAgfVxuICAgIHNldEZsYWdzKGZsYWdzKSB7XG4gICAgICAgIHRoaXMuZmxhZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBmbGFncyk7XG4gICAgfVxuICAgIHJlc2V0KCkge1xuICAgICAgICB0aGlzLmZsYWdzID0ge307XG4gICAgICAgIHRoaXMudXJsRmxhZ3MgPSB7fTtcbiAgICAgICAgdGhpcy5wb3B1bGF0ZVVSTEZsYWdzKCk7XG4gICAgfVxuICAgIHBvcHVsYXRlVVJMRmxhZ3MoKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5nbG9iYWwgPT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5nbG9iYWwubG9jYXRpb24gPT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5nbG9iYWwubG9jYXRpb24uc2VhcmNoID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVybFBhcmFtcyA9IHRoaXMuZ2V0UXVlcnlQYXJhbXModGhpcy5nbG9iYWwubG9jYXRpb24uc2VhcmNoKTtcbiAgICAgICAgaWYgKFRFTlNPUkZMT1dKU19GTEFHU19QUkVGSVggaW4gdXJsUGFyYW1zKSB7XG4gICAgICAgICAgICBjb25zdCBrZXlWYWx1ZXMgPSB1cmxQYXJhbXNbVEVOU09SRkxPV0pTX0ZMQUdTX1BSRUZJWF0uc3BsaXQoJywnKTtcbiAgICAgICAgICAgIGtleVZhbHVlcy5mb3JFYWNoKGtleVZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBrZXlWYWx1ZS5zcGxpdCgnOicpO1xuICAgICAgICAgICAgICAgIHRoaXMudXJsRmxhZ3Nba2V5XSA9IHBhcnNlVmFsdWUoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRRdWVyeVBhcmFtcyhxdWVyeVN0cmluZykge1xuICAgIGNvbnN0IHBhcmFtcyA9IHt9O1xuICAgIHF1ZXJ5U3RyaW5nLnJlcGxhY2UoL1s/Jl0oW149PyZdKykoPzo9KFteJl0qKSk/L2csIChzLCAuLi50KSA9PiB7XG4gICAgICAgIGRlY29kZVBhcmFtKHBhcmFtcywgdFswXSwgdFsxXSk7XG4gICAgICAgIHJldHVybiB0LmpvaW4oJz0nKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcGFyYW1zO1xufVxuZnVuY3Rpb24gZGVjb2RlUGFyYW0ocGFyYW1zLCBuYW1lLCB2YWx1ZSkge1xuICAgIHBhcmFtc1tkZWNvZGVVUklDb21wb25lbnQobmFtZSldID0gZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlIHx8ICcnKTtcbn1cbmZ1bmN0aW9uIHBhcnNlVmFsdWUoZmxhZ05hbWUsIHZhbHVlKSB7XG4gICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICh2YWx1ZSA9PT0gJ3RydWUnIHx8IHZhbHVlID09PSAnZmFsc2UnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gJ3RydWUnO1xuICAgIH1cbiAgICBlbHNlIGlmIChgJHsrdmFsdWV9YCA9PT0gdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuICt2YWx1ZTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgcGFyc2UgdmFsdWUgZmxhZyB2YWx1ZSAke3ZhbHVlfSBmb3IgZmxhZyAke2ZsYWdOYW1lfS5gKTtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgY3VycmVudCBlbnZpcm9ubWVudCAoYSBnbG9iYWwgc2luZ2xldG9uKS5cbiAqXG4gKiBUaGUgZW52aXJvbm1lbnQgb2JqZWN0IGNvbnRhaW5zIHRoZSBldmFsdWF0ZWQgZmVhdHVyZSB2YWx1ZXMgYXMgd2VsbCBhcyB0aGVcbiAqIGFjdGl2ZSBwbGF0Zm9ybS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnRW52aXJvbm1lbnQnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZW52KCkge1xuICAgIHJldHVybiBFTlY7XG59XG5leHBvcnQgbGV0IEVOViA9IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gc2V0RW52aXJvbm1lbnRHbG9iYWwoZW52aXJvbm1lbnQpIHtcbiAgICBFTlYgPSBlbnZpcm9ubWVudDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVudmlyb25tZW50LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCAnLi9lbmdpbmUnO1xuaW1wb3J0ICogYXMgZGV2aWNlX3V0aWwgZnJvbSAnLi9kZXZpY2VfdXRpbCc7XG5pbXBvcnQgeyBlbnYgfSBmcm9tICcuL2Vudmlyb25tZW50JztcbmNvbnN0IEVOViA9IGVudigpO1xuLyoqXG4gKiBUaGlzIGZpbGUgY29udGFpbnMgZW52aXJvbm1lbnQtcmVsYXRlZCBmbGFnIHJlZ2lzdHJhdGlvbnMuXG4gKi9cbi8qKiBXaGV0aGVyIHRvIGVuYWJsZSBkZWJ1ZyBtb2RlLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnREVCVUcnLCAoKSA9PiBmYWxzZSwgZGVidWdWYWx1ZSA9PiB7XG4gICAgaWYgKGRlYnVnVmFsdWUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdEZWJ1Z2dpbmcgbW9kZSBpcyBPTi4gVGhlIG91dHB1dCBvZiBldmVyeSBtYXRoIGNhbGwgd2lsbCAnICtcbiAgICAgICAgICAgICdiZSBkb3dubG9hZGVkIHRvIENQVSBhbmQgY2hlY2tlZCBmb3IgTmFOcy4gJyArXG4gICAgICAgICAgICAnVGhpcyBzaWduaWZpY2FudGx5IGltcGFjdHMgcGVyZm9ybWFuY2UuJyk7XG4gICAgfVxufSk7XG4vKiogV2hldGhlciB3ZSBhcmUgaW4gYSBicm93c2VyIChhcyB2ZXJzdXMsIHNheSwgbm9kZS5qcykgZW52aXJvbm1lbnQuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdJU19CUk9XU0VSJywgKCkgPT4gZGV2aWNlX3V0aWwuaXNCcm93c2VyKCkpO1xuLyoqIFdoZXRoZXIgd2UgYXJlIGluIGEgYnJvd3NlciAoYXMgdmVyc3VzLCBzYXksIG5vZGUuanMpIGVudmlyb25tZW50LiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnSVNfTk9ERScsICgpID0+ICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcpICYmXG4gICAgKHR5cGVvZiBwcm9jZXNzLnZlcnNpb25zICE9PSAndW5kZWZpbmVkJykgJiZcbiAgICAodHlwZW9mIHByb2Nlc3MudmVyc2lvbnMubm9kZSAhPT0gJ3VuZGVmaW5lZCcpKTtcbi8qKiBXaGV0aGVyIHRoaXMgYnJvd3NlciBpcyBDaHJvbWUuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdJU19DSFJPTUUnLCAoKSA9PiB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IgIT0gbnVsbCAmJlxuICAgIG5hdmlnYXRvci51c2VyQWdlbnQgIT0gbnVsbCAmJiAvQ2hyb21lLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpICYmXG4gICAgL0dvb2dsZSBJbmMvLnRlc3QobmF2aWdhdG9yLnZlbmRvcikpO1xuLyoqXG4gKiBUcnVlIHdoZW4gdGhlIGVudmlyb25tZW50IGlzIFwicHJvZHVjdGlvblwiIHdoZXJlIHdlIGRpc2FibGUgc2FmZXR5IGNoZWNrc1xuICogdG8gZ2FpbiBwZXJmb3JtYW5jZS5cbiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnUFJPRCcsICgpID0+IGZhbHNlKTtcbi8qKlxuICogV2hldGhlciB0byBkbyBzYW5pdHkgY2hlY2tzIHdoZW4gaW5mZXJyaW5nIGEgc2hhcGUgZnJvbSB1c2VyLXByb3ZpZGVkXG4gKiB2YWx1ZXMsIHVzZWQgd2hlbiBjcmVhdGluZyBhIG5ldyB0ZW5zb3IuXG4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1RFTlNPUkxJS0VfQ0hFQ0tfU0hBUEVfQ09OU0lTVEVOQ1knLCAoKSA9PiBFTlYuZ2V0Qm9vbCgnREVCVUcnKSk7XG4vKiogV2hldGhlciBkZXByZWNhdGlvbiB3YXJuaW5ncyBhcmUgZW5hYmxlZC4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ0RFUFJFQ0FUSU9OX1dBUk5JTkdTX0VOQUJMRUQnLCAoKSA9PiB0cnVlKTtcbi8qKiBUcnVlIGlmIHJ1bm5pbmcgdW5pdCB0ZXN0cy4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ0lTX1RFU1QnLCAoKSA9PiBmYWxzZSk7XG4vKiogV2hldGhlciB0byBjaGVjayBjb21wdXRhdGlvbiByZXN1bHQgZm9yIGVycm9ycy4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ0NIRUNLX0NPTVBVVEFUSU9OX0ZPUl9FUlJPUlMnLCAoKSA9PiB0cnVlKTtcbi8qKiBXaGV0aGVyIHRoZSBiYWNrZW5kIG5lZWRzIHRvIHdyYXAgaW5wdXQgdG8gaW1hZ2VCaXRtYXAuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdXUkFQX1RPX0lNQUdFQklUTUFQJywgKCkgPT4gZmFsc2UpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmxhZ3MuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLy8gTm90ZSB0aGF0IHRoZSBpZGVudGlmaWVyIGdsb2JhbE5hbWVTcGFjZSBpcyBzY29wZWQgdG8gdGhpcyBtb2R1bGUsIGJ1dCB3aWxsXG4vLyBhbHdheXMgcmVzb2x2ZSB0byB0aGUgc2FtZSBnbG9iYWwgb2JqZWN0IHJlZ2FyZGxlc3Mgb2YgaG93IHRoZSBtb2R1bGUgaXNcbi8vIHJlc29sdmVkLlxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxubGV0IGdsb2JhbE5hbWVTcGFjZTtcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbmV4cG9ydCBmdW5jdGlvbiBnZXRHbG9iYWxOYW1lc3BhY2UoKSB7XG4gICAgaWYgKGdsb2JhbE5hbWVTcGFjZSA9PSBudWxsKSB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICAgICAgbGV0IG5zO1xuICAgICAgICBpZiAodHlwZW9mICh3aW5kb3cpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgbnMgPSB3aW5kb3c7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIChnbG9iYWwpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgbnMgPSBnbG9iYWw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIChwcm9jZXNzKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIG5zID0gcHJvY2VzcztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgKHNlbGYpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgbnMgPSBzZWxmO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCBhIGdsb2JhbCBvYmplY3QnKTtcbiAgICAgICAgfVxuICAgICAgICBnbG9iYWxOYW1lU3BhY2UgPSBucztcbiAgICB9XG4gICAgcmV0dXJuIGdsb2JhbE5hbWVTcGFjZTtcbn1cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbmZ1bmN0aW9uIGdldEdsb2JhbE1hcCgpIHtcbiAgICBjb25zdCBucyA9IGdldEdsb2JhbE5hbWVzcGFjZSgpO1xuICAgIGlmIChucy5fdGZHbG9iYWxzID09IG51bGwpIHtcbiAgICAgICAgbnMuX3RmR2xvYmFscyA9IG5ldyBNYXAoKTtcbiAgICB9XG4gICAgcmV0dXJuIG5zLl90Zkdsb2JhbHM7XG59XG4vKipcbiAqIFJldHVybnMgYSBnbG9iYWxseSBhY2Nlc3NpYmxlICdzaW5nbGV0b24nIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ga2V5IHRoZSBuYW1lIG9mIHRoZSBvYmplY3RcbiAqIEBwYXJhbSBpbml0IGEgZnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSB0byBpbml0aWFsaXplIHRoaXMgb2JqZWN0XG4gKiAgICAgICAgICAgICB0aGUgZmlyc3QgdGltZSBpdCBpcyBmZXRjaGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2xvYmFsKGtleSwgaW5pdCkge1xuICAgIGNvbnN0IGdsb2JhbE1hcCA9IGdldEdsb2JhbE1hcCgpO1xuICAgIGlmIChnbG9iYWxNYXAuaGFzKGtleSkpIHtcbiAgICAgICAgcmV0dXJuIGdsb2JhbE1hcC5nZXQoa2V5KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IHNpbmdsZXRvbiA9IGluaXQoKTtcbiAgICAgICAgZ2xvYmFsTWFwLnNldChrZXksIHNpbmdsZXRvbik7XG4gICAgICAgIHJldHVybiBnbG9iYWxNYXAuZ2V0KGtleSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2xvYmFsX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi9lbmdpbmUnO1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBzZXREZXByZWNhdGlvbldhcm5pbmdGbiB9IGZyb20gJy4vdGVuc29yJztcbmltcG9ydCB7IGdldFRlbnNvcnNJbkNvbnRhaW5lciB9IGZyb20gJy4vdGVuc29yX3V0aWwnO1xuLyoqXG4gKiBFbmFibGVzIHByb2R1Y3Rpb24gbW9kZSB3aGljaCBkaXNhYmxlcyBjb3JyZWN0bmVzcyBjaGVja3MgaW4gZmF2b3Igb2ZcbiAqIHBlcmZvcm1hbmNlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdFbnZpcm9ubWVudCd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmFibGVQcm9kTW9kZSgpIHtcbiAgICBlbnYoKS5zZXQoJ1BST0QnLCB0cnVlKTtcbn1cbi8qKlxuICogRW5hYmxlcyBkZWJ1ZyBtb2RlIHdoaWNoIHdpbGwgbG9nIGluZm9ybWF0aW9uIGFib3V0IGFsbCBleGVjdXRlZCBrZXJuZWxzOlxuICogdGhlIGVsYXBzZWQgdGltZSBvZiB0aGUga2VybmVsIGV4ZWN1dGlvbiwgYXMgd2VsbCBhcyB0aGUgcmFuaywgc2hhcGUsIGFuZFxuICogc2l6ZSBvZiB0aGUgb3V0cHV0IHRlbnNvci5cbiAqXG4gKiBEZWJ1ZyBtb2RlIHdpbGwgc2lnbmlmaWNhbnRseSBzbG93IGRvd24geW91ciBhcHBsaWNhdGlvbiBhcyBpdCB3aWxsXG4gKiBkb3dubG9hZCB0aGUgcmVzdWx0IG9mIGV2ZXJ5IG9wZXJhdGlvbiB0byB0aGUgQ1BVLiBUaGlzIHNob3VsZCBub3QgYmUgdXNlZCBpblxuICogcHJvZHVjdGlvbi4gRGVidWcgbW9kZSBkb2VzIG5vdCBhZmZlY3QgdGhlIHRpbWluZyBpbmZvcm1hdGlvbiBvZiB0aGUga2VybmVsXG4gKiBleGVjdXRpb24gYXMgd2UgZG8gbm90IG1lYXN1cmUgZG93bmxvYWQgdGltZSBpbiB0aGUga2VybmVsIGV4ZWN1dGlvbiB0aW1lLlxuICpcbiAqIFNlZSBhbHNvOiBgdGYucHJvZmlsZWAsIGB0Zi5tZW1vcnlgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdFbnZpcm9ubWVudCd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmFibGVEZWJ1Z01vZGUoKSB7XG4gICAgZW52KCkuc2V0KCdERUJVRycsIHRydWUpO1xufVxuLyoqIEdsb2JhbGx5IGRpc2FibGVzIGRlcHJlY2F0aW9uIHdhcm5pbmdzICovXG5leHBvcnQgZnVuY3Rpb24gZGlzYWJsZURlcHJlY2F0aW9uV2FybmluZ3MoKSB7XG4gICAgZW52KCkuc2V0KCdERVBSRUNBVElPTl9XQVJOSU5HU19FTkFCTEVEJywgZmFsc2UpO1xuICAgIGNvbnNvbGUud2FybihgVGVuc29yRmxvdy5qcyBkZXByZWNhdGlvbiB3YXJuaW5ncyBoYXZlIGJlZW4gZGlzYWJsZWQuYCk7XG59XG4vKiogV2FybiB1c2VycyBhYm91dCBkZXByZWNhdGVkIGZ1bmN0aW9uYWxpdHkuICovXG5leHBvcnQgZnVuY3Rpb24gZGVwcmVjYXRpb25XYXJuKG1zZykge1xuICAgIGlmIChlbnYoKS5nZXRCb29sKCdERVBSRUNBVElPTl9XQVJOSU5HU19FTkFCTEVEJykpIHtcbiAgICAgICAgY29uc29sZS53YXJuKG1zZyArICcgWW91IGNhbiBkaXNhYmxlIGRlcHJlY2F0aW9uIHdhcm5pbmdzIHdpdGggJyArXG4gICAgICAgICAgICAndGYuZGlzYWJsZURlcHJlY2F0aW9uV2FybmluZ3MoKS4nKTtcbiAgICB9XG59XG5zZXREZXByZWNhdGlvbldhcm5pbmdGbihkZXByZWNhdGlvbldhcm4pO1xuLyoqXG4gKiBEaXNwb3NlIGFsbCB2YXJpYWJsZXMga2VwdCBpbiBiYWNrZW5kIGVuZ2luZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnRW52aXJvbm1lbnQnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzcG9zZVZhcmlhYmxlcygpIHtcbiAgICBFTkdJTkUuZGlzcG9zZVZhcmlhYmxlcygpO1xufVxuLyoqXG4gKiBJdCByZXR1cm5zIHRoZSBnbG9iYWwgZW5naW5lIHRoYXQga2VlcHMgdHJhY2sgb2YgYWxsIHRlbnNvcnMgYW5kIGJhY2tlbmRzLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdFbnZpcm9ubWVudCd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmdpbmUoKSB7XG4gICAgcmV0dXJuIEVOR0lORTtcbn1cbi8qKlxuICogUmV0dXJucyBtZW1vcnkgaW5mbyBhdCB0aGUgY3VycmVudCB0aW1lIGluIHRoZSBwcm9ncmFtLiBUaGUgcmVzdWx0IGlzIGFuXG4gKiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogLSBgbnVtQnl0ZXNgOiBOdW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkICh1bmRpc3Bvc2VkKSBhdCB0aGlzIHRpbWUuXG4gKiAtIGBudW1UZW5zb3JzYDogTnVtYmVyIG9mIHVuaXF1ZSB0ZW5zb3JzIGFsbG9jYXRlZC5cbiAqIC0gYG51bURhdGFCdWZmZXJzYDogTnVtYmVyIG9mIHVuaXF1ZSBkYXRhIGJ1ZmZlcnMgYWxsb2NhdGVkXG4gKiAgICh1bmRpc3Bvc2VkKSBhdCB0aGlzIHRpbWUsIHdoaWNoIGlzIOKJpCB0aGUgbnVtYmVyIG9mIHRlbnNvcnNcbiAqICAgKGUuZy4gYGEucmVzaGFwZShuZXdTaGFwZSlgIG1ha2VzIGEgbmV3IFRlbnNvciB0aGF0IHNoYXJlcyB0aGUgc2FtZVxuICogICBkYXRhIGJ1ZmZlciB3aXRoIGBhYCkuXG4gKiAtIGB1bnJlbGlhYmxlYDogVHJ1ZSBpZiB0aGUgbWVtb3J5IHVzYWdlIGlzIHVucmVsaWFibGUuIFNlZSBgcmVhc29uc2Agd2hlblxuICogICAgYHVucmVsaWFibGVgIGlzIHRydWUuXG4gKiAtIGByZWFzb25zYDogYHN0cmluZ1tdYCwgcmVhc29ucyB3aHkgdGhlIG1lbW9yeSBpcyB1bnJlbGlhYmxlLCBwcmVzZW50IGlmXG4gKiAgICBgdW5yZWxpYWJsZWAgaXMgdHJ1ZS5cbiAqXG4gKiBXZWJHTCBQcm9wZXJ0aWVzOlxuICogLSBgbnVtQnl0ZXNJbkdQVWA6IE51bWJlciBvZiBieXRlcyBhbGxvY2F0ZWQgKHVuZGlzcG9zZWQpIGluIHRoZSBHUFUgb25seSBhdFxuICogICAgIHRoaXMgdGltZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnUGVyZm9ybWFuY2UnLCBzdWJoZWFkaW5nOiAnTWVtb3J5J31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lbW9yeSgpIHtcbiAgICByZXR1cm4gRU5HSU5FLm1lbW9yeSgpO1xufVxuLyoqXG4gKiBFeGVjdXRlcyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gYGYoKWAgYW5kIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXNcbiAqIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZ1bmN0aW9uJ3MgbWVtb3J5IHVzZTpcbiAqIC0gYG5ld0J5dGVzYDogdGhlIG51bWJlciBvZiBuZXcgYnl0ZXMgYWxsb2NhdGVkXG4gKiAtIGBuZXdUZW5zb3JzYDogdGhlIG51bWJlciBvZiBuZXcgdGVuc29ycyBjcmVhdGVkXG4gKiAtIGBwZWFrQnl0ZXNgOiB0aGUgcGVhayBudW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkXG4gKiAtIGBrZXJuZWxzYDogYW4gYXJyYXkgb2Ygb2JqZWN0cyBmb3IgZWFjaCBrZXJuZWwgaW52b2x2ZWQgdGhhdCByZXBvcnRzXG4gKiB0aGVpciBpbnB1dCBhbmQgb3V0cHV0IHNoYXBlcywgbnVtYmVyIG9mIGJ5dGVzIHVzZWQsIGFuZCBudW1iZXIgb2YgbmV3XG4gKiB0ZW5zb3JzIGNyZWF0ZWQuXG4gKiAtIGBrZXJuZWxOYW1lc2A6IGFuIGFycmF5IG9mIHVuaXF1ZSBzdHJpbmdzIHdpdGgganVzdCB0aGUgbmFtZXMgb2YgdGhlXG4gKiBrZXJuZWxzIGluIHRoZSBga2VybmVsc2AgYXJyYXkuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHByb2ZpbGUgPSBhd2FpdCB0Zi5wcm9maWxlKCgpID0+IHtcbiAqICAgY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKiAgIGxldCB4MiA9IHguc3F1YXJlKCk7XG4gKiAgIHgyLmRpc3Bvc2UoKTtcbiAqICAgeDIgPSB4LnNxdWFyZSgpO1xuICogICB4Mi5kaXNwb3NlKCk7XG4gKiAgIHJldHVybiB4O1xuICogfSk7XG4gKlxuICogY29uc29sZS5sb2coYG5ld0J5dGVzOiAke3Byb2ZpbGUubmV3Qnl0ZXN9YCk7XG4gKiBjb25zb2xlLmxvZyhgbmV3VGVuc29yczogJHtwcm9maWxlLm5ld1RlbnNvcnN9YCk7XG4gKiBjb25zb2xlLmxvZyhgYnl0ZSB1c2FnZSBvdmVyIGFsbCBrZXJuZWxzOiAke3Byb2ZpbGUua2VybmVscy5tYXAoayA9PlxuICogay50b3RhbEJ5dGVzU25hcHNob3QpfWApO1xuICogYGBgXG4gKlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdQZXJmb3JtYW5jZScsIHN1YmhlYWRpbmc6ICdQcm9maWxlJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb2ZpbGUoZikge1xuICAgIHJldHVybiBFTkdJTkUucHJvZmlsZShmKTtcbn1cbi8qKlxuICogRXhlY3V0ZXMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIGBmbmAgYW5kIGFmdGVyIGl0IGlzIGV4ZWN1dGVkLCBjbGVhbnMgdXAgYWxsXG4gKiBpbnRlcm1lZGlhdGUgdGVuc29ycyBhbGxvY2F0ZWQgYnkgYGZuYCBleGNlcHQgdGhvc2UgcmV0dXJuZWQgYnkgYGZuYC5cbiAqIGBmbmAgbXVzdCBub3QgcmV0dXJuIGEgUHJvbWlzZSAoYXN5bmMgZnVuY3Rpb25zIG5vdCBhbGxvd2VkKS4gVGhlIHJldHVybmVkXG4gKiByZXN1bHQgY2FuIGJlIGEgY29tcGxleCBvYmplY3QuXG4gKlxuICogVXNpbmcgdGhpcyBtZXRob2QgaGVscHMgYXZvaWQgbWVtb3J5IGxlYWtzLiBJbiBnZW5lcmFsLCB3cmFwIGNhbGxzIHRvXG4gKiBvcGVyYXRpb25zIGluIGB0Zi50aWR5YCBmb3IgYXV0b21hdGljIG1lbW9yeSBjbGVhbnVwLlxuICpcbiAqIE5PVEU6IFZhcmlhYmxlcyBkbyAqbm90KiBnZXQgY2xlYW5lZCB1cCB3aGVuIGluc2lkZSBhIHRpZHkoKS4gSWYgeW91IHdhbnQgdG9cbiAqIGRpc3Bvc2UgdmFyaWFibGVzLCBwbGVhc2UgdXNlIGB0Zi5kaXNwb3NlVmFyaWFibGVzYCBvciBjYWxsIGRpc3Bvc2UoKVxuICogZGlyZWN0bHkgb24gdmFyaWFibGVzLlxuICpcbiAqIGBgYGpzXG4gKiAvLyB5ID0gMiBeIDIgKyAxXG4gKiBjb25zdCB5ID0gdGYudGlkeSgoKSA9PiB7XG4gKiAgIC8vIGEsIGIsIGFuZCBvbmUgd2lsbCBiZSBjbGVhbmVkIHVwIHdoZW4gdGhlIHRpZHkgZW5kcy5cbiAqICAgY29uc3Qgb25lID0gdGYuc2NhbGFyKDEpO1xuICogICBjb25zdCBhID0gdGYuc2NhbGFyKDIpO1xuICogICBjb25zdCBiID0gYS5zcXVhcmUoKTtcbiAqXG4gKiAgIGNvbnNvbGUubG9nKCdudW1UZW5zb3JzIChpbiB0aWR5KTogJyArIHRmLm1lbW9yeSgpLm51bVRlbnNvcnMpO1xuICpcbiAqICAgLy8gVGhlIHZhbHVlIHJldHVybmVkIGluc2lkZSB0aGUgdGlkeSBmdW5jdGlvbiB3aWxsIHJldHVyblxuICogICAvLyB0aHJvdWdoIHRoZSB0aWR5LCBpbiB0aGlzIGNhc2UgdG8gdGhlIHZhcmlhYmxlIHkuXG4gKiAgIHJldHVybiBiLmFkZChvbmUpO1xuICogfSk7XG4gKlxuICogY29uc29sZS5sb2coJ251bVRlbnNvcnMgKG91dHNpZGUgdGlkeSk6ICcgKyB0Zi5tZW1vcnkoKS5udW1UZW5zb3JzKTtcbiAqIHkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBuYW1lT3JGbiBUaGUgbmFtZSBvZiB0aGUgY2xvc3VyZSwgb3IgdGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUuXG4gKiAgICAgSWYgYSBuYW1lIGlzIHByb3ZpZGVkLCB0aGUgMm5kIGFyZ3VtZW50IHNob3VsZCBiZSB0aGUgZnVuY3Rpb24uXG4gKiAgICAgSWYgZGVidWcgbW9kZSBpcyBvbiwgdGhlIHRpbWluZyBhbmQgdGhlIG1lbW9yeSB1c2FnZSBvZiB0aGUgZnVuY3Rpb25cbiAqICAgICB3aWxsIGJlIHRyYWNrZWQgYW5kIGRpc3BsYXllZCBvbiB0aGUgY29uc29sZSB1c2luZyB0aGUgcHJvdmlkZWQgbmFtZS5cbiAqIEBwYXJhbSBmbiBUaGUgZnVuY3Rpb24gdG8gZXhlY3V0ZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnUGVyZm9ybWFuY2UnLCBzdWJoZWFkaW5nOiAnTWVtb3J5J31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRpZHkobmFtZU9yRm4sIGZuKSB7XG4gICAgcmV0dXJuIEVOR0lORS50aWR5KG5hbWVPckZuLCBmbik7XG59XG4vKipcbiAqIERpc3Bvc2VzIGFueSBgdGYuVGVuc29yYHMgZm91bmQgd2l0aGluIHRoZSBwcm92aWRlZCBvYmplY3QuXG4gKlxuICogQHBhcmFtIGNvbnRhaW5lciBhbiBvYmplY3QgdGhhdCBtYXkgYmUgYSBgdGYuVGVuc29yYCBvciBtYXkgZGlyZWN0bHlcbiAqICAgICBjb250YWluIGB0Zi5UZW5zb3Jgcywgc3VjaCBhcyBhIGBUZW5zb3JbXWAgb3IgYHtrZXk6IFRlbnNvciwgLi4ufWAuIElmXG4gKiAgICAgdGhlIG9iamVjdCBpcyBub3QgYSBgdGYuVGVuc29yYCBvciBkb2VzIG5vdCBjb250YWluIGBUZW5zb3JzYCwgbm90aGluZ1xuICogICAgIGhhcHBlbnMuIEluIGdlbmVyYWwgaXQgaXMgc2FmZSB0byBwYXNzIGFueSBvYmplY3QgaGVyZSwgZXhjZXB0IHRoYXRcbiAqICAgICBgUHJvbWlzZWBzIGFyZSBub3Qgc3VwcG9ydGVkLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdQZXJmb3JtYW5jZScsIHN1YmhlYWRpbmc6ICdNZW1vcnknfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzcG9zZShjb250YWluZXIpIHtcbiAgICBjb25zdCB0ZW5zb3JzID0gZ2V0VGVuc29yc0luQ29udGFpbmVyKGNvbnRhaW5lcik7XG4gICAgdGVuc29ycy5mb3JFYWNoKHRlbnNvciA9PiB0ZW5zb3IuZGlzcG9zZSgpKTtcbn1cbi8qKlxuICogS2VlcHMgYSBgdGYuVGVuc29yYCBnZW5lcmF0ZWQgaW5zaWRlIGEgYHRmLnRpZHlgIGZyb20gYmVpbmcgZGlzcG9zZWRcbiAqIGF1dG9tYXRpY2FsbHkuXG4gKlxuICogYGBganNcbiAqIGxldCBiO1xuICogY29uc3QgeSA9IHRmLnRpZHkoKCkgPT4ge1xuICogICBjb25zdCBvbmUgPSB0Zi5zY2FsYXIoMSk7XG4gKiAgIGNvbnN0IGEgPSB0Zi5zY2FsYXIoMik7XG4gKlxuICogICAvLyBiIHdpbGwgbm90IGJlIGNsZWFuZWQgdXAgYnkgdGhlIHRpZHkuIGEgYW5kIG9uZSB3aWxsIGJlIGNsZWFuZWQgdXBcbiAqICAgLy8gd2hlbiB0aGUgdGlkeSBlbmRzLlxuICogICBiID0gdGYua2VlcChhLnNxdWFyZSgpKTtcbiAqXG4gKiAgIGNvbnNvbGUubG9nKCdudW1UZW5zb3JzIChpbiB0aWR5KTogJyArIHRmLm1lbW9yeSgpLm51bVRlbnNvcnMpO1xuICpcbiAqICAgLy8gVGhlIHZhbHVlIHJldHVybmVkIGluc2lkZSB0aGUgdGlkeSBmdW5jdGlvbiB3aWxsIHJldHVyblxuICogICAvLyB0aHJvdWdoIHRoZSB0aWR5LCBpbiB0aGlzIGNhc2UgdG8gdGhlIHZhcmlhYmxlIHkuXG4gKiAgIHJldHVybiBiLmFkZChvbmUpO1xuICogfSk7XG4gKlxuICogY29uc29sZS5sb2coJ251bVRlbnNvcnMgKG91dHNpZGUgdGlkeSk6ICcgKyB0Zi5tZW1vcnkoKS5udW1UZW5zb3JzKTtcbiAqIGNvbnNvbGUubG9nKCd5OicpO1xuICogeS5wcmludCgpO1xuICogY29uc29sZS5sb2coJ2I6Jyk7XG4gKiBiLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gcmVzdWx0IFRoZSB0ZW5zb3IgdG8ga2VlcCBmcm9tIGJlaW5nIGRpc3Bvc2VkLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdQZXJmb3JtYW5jZScsIHN1YmhlYWRpbmc6ICdNZW1vcnknfVxuICovXG5leHBvcnQgZnVuY3Rpb24ga2VlcChyZXN1bHQpIHtcbiAgICByZXR1cm4gRU5HSU5FLmtlZXAocmVzdWx0KTtcbn1cbi8qKlxuICogRXhlY3V0ZXMgYGYoKWAgYW5kIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aW1pbmdcbiAqIGluZm9ybWF0aW9uLlxuICpcbiAqIFRoZSByZXN1bHQgaXMgYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqIC0gYHdhbGxNc2A6IFdhbGwgZXhlY3V0aW9uIHRpbWUuXG4gKiAtIGBrZXJuZWxNc2A6IEtlcm5lbCBleGVjdXRpb24gdGltZSwgaWdub3JpbmcgZGF0YSB0cmFuc2Zlci4gSWYgdXNpbmcgdGhlXG4gKiBXZWJHTCBiYWNrZW5kIGFuZCB0aGUgcXVlcnkgdGltZXIgZXh0ZW5zaW9uIGlzIG5vdCBhdmFpbGFibGUsIHRoaXMgd2lsbFxuICogcmV0dXJuIGFuIGVycm9yIG9iamVjdC5cbiAqIC0gT24gYFdlYkdMYCBUaGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgcHJvcGVydGllcyBleGlzdDpcbiAqICAgLSBgdXBsb2FkV2FpdE1zYDogQ1BVIGJsb2NraW5nIHRpbWUgb24gdGV4dHVyZSB1cGxvYWRzLlxuICogICAtIGBkb3dubG9hZFdhaXRNc2A6IENQVSBibG9ja2luZyB0aW1lIG9uIHRleHR1cmUgZG93bmxvYWRzIChyZWFkUGl4ZWxzKS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnJhbmRvbU5vcm1hbChbMjAsIDIwXSk7XG4gKiBjb25zdCB0aW1lID0gYXdhaXQgdGYudGltZSgoKSA9PiB4Lm1hdE11bCh4KSk7XG4gKlxuICogY29uc29sZS5sb2coYGtlcm5lbE1zOiAke3RpbWUua2VybmVsTXN9LCB3YWxsVGltZU1zOiAke3RpbWUud2FsbE1zfWApO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGYgVGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgYW5kIHRpbWUuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1BlcmZvcm1hbmNlJywgc3ViaGVhZGluZzogJ1RpbWluZyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aW1lKGYpIHtcbiAgICByZXR1cm4gRU5HSU5FLnRpbWUoZik7XG59XG4vKipcbiAqIFNldHMgdGhlIGJhY2tlbmQgKGNwdSwgd2ViZ2wsIHdhc20sIGV0YykgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRlbnNvcnMgYW5kXG4gKiBleGVjdXRpbmcgb3BlcmF0aW9ucyBvbiB0aG9zZSB0ZW5zb3JzLiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzXG4gKiB0byBhIGJvb2xlYW4gaWYgdGhlIGJhY2tlbmQgaW5pdGlhbGl6YXRpb24gd2FzIHN1Y2Nlc3NmdWwuXG4gKlxuICogTm90ZSB0aGlzIGRpc3Bvc2VzIHRoZSBjdXJyZW50IGJhY2tlbmQsIGlmIGFueSwgYXMgd2VsbCBhcyBhbnkgdGVuc29yc1xuICogYXNzb2NpYXRlZCB3aXRoIGl0LiBBIG5ldyBiYWNrZW5kIGlzIGluaXRpYWxpemVkLCBldmVuIGlmIGl0IGlzIG9mIHRoZVxuICogc2FtZSB0eXBlIGFzIHRoZSBwcmV2aW91cyBvbmUuXG4gKlxuICogQHBhcmFtIGJhY2tlbmROYW1lIFRoZSBuYW1lIG9mIHRoZSBiYWNrZW5kLiBDdXJyZW50bHkgc3VwcG9ydHNcbiAqICAgICBgJ3dlYmdsJ3wnY3B1J2AgaW4gdGhlIGJyb3dzZXIsIGAndGVuc29yZmxvdydgIHVuZGVyIG5vZGUuanNcbiAqICAgICAocmVxdWlyZXMgdGZqcy1ub2RlKSwgYW5kIGAnd2FzbSdgIChyZXF1aXJlcyB0ZmpzLWJhY2tlbmQtd2FzbSkuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0JhY2tlbmRzJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEJhY2tlbmQoYmFja2VuZE5hbWUpIHtcbiAgICByZXR1cm4gRU5HSU5FLnNldEJhY2tlbmQoYmFja2VuZE5hbWUpO1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBiYWNrZW5kIChvciB0aGVcbiAqIGhpZ2hlc3QgcHJpb3JpdHkgb25lKSBoYXMgaW5pdGlhbGl6ZWQuIEF3YWl0IHRoaXMgcHJvbWlzZSB3aGVuIHlvdSBhcmUgdXNpbmdcbiAqIGEgYmFja2VuZCB0aGF0IGhhcyBhc3luYyBpbml0aWFsaXphdGlvbi5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnQmFja2VuZHMnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZHkoKSB7XG4gICAgcmV0dXJuIEVOR0lORS5yZWFkeSgpO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjdXJyZW50IGJhY2tlbmQgbmFtZSAoY3B1LCB3ZWJnbCwgZXRjKS4gVGhlIGJhY2tlbmQgaXNcbiAqIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0ZW5zb3JzIGFuZCBleGVjdXRpbmcgb3BlcmF0aW9ucyBvbiB0aG9zZSB0ZW5zb3JzLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdCYWNrZW5kcyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRCYWNrZW5kKCkge1xuICAgIHJldHVybiBFTkdJTkUuYmFja2VuZE5hbWU7XG59XG4vKipcbiAqIFJlbW92ZXMgYSBiYWNrZW5kIGFuZCB0aGUgcmVnaXN0ZXJlZCBmYWN0b3J5LlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdCYWNrZW5kcyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVCYWNrZW5kKG5hbWUpIHtcbiAgICBFTkdJTkUucmVtb3ZlQmFja2VuZChuYW1lKTtcbn1cbi8qKlxuICogRmluZHMgdGhlIGJhY2tlbmQgcmVnaXN0ZXJlZCB1bmRlciB0aGUgcHJvdmlkZWQgbmFtZS4gUmV0dXJucyBudWxsIGlmIHRoZVxuICogbmFtZSBpcyBub3QgaW4gdGhlIHJlZ2lzdHJ5LCBvciB0aGUgcmVnaXN0cmF0aW9uIGhhc24ndCBmaW5pc2hlZCB5ZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQmFja2VuZChuYW1lKSB7XG4gICAgcmV0dXJuIEVOR0lORS5maW5kQmFja2VuZChuYW1lKTtcbn1cbi8qKlxuICogRmluZHMgdGhlIGJhY2tlbmQgZmFjdG9yeSByZWdpc3RlcmVkIHVuZGVyIHRoZSBwcm92aWRlZCBuYW1lLiBSZXR1cm5zIGFcbiAqIGZ1bmN0aW9uIHRoYXQgcHJvZHVjZXMgYSBuZXcgYmFja2VuZCB3aGVuIGNhbGxlZC4gUmV0dXJucyBudWxsIGlmIHRoZSBuYW1lXG4gKiBpcyBub3QgaW4gdGhlIHJlZ2lzdHJ5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZEJhY2tlbmRGYWN0b3J5KG5hbWUpIHtcbiAgICByZXR1cm4gRU5HSU5FLmZpbmRCYWNrZW5kRmFjdG9yeShuYW1lKTtcbn1cbi8qKlxuICogUmVnaXN0ZXJzIGEgZ2xvYmFsIGJhY2tlbmQuIFRoZSByZWdpc3RyYXRpb24gc2hvdWxkIGhhcHBlbiB3aGVuIGltcG9ydGluZ1xuICogYSBtb2R1bGUgZmlsZSAoZS5nLiB3aGVuIGltcG9ydGluZyBgYmFja2VuZF93ZWJnbC50c2ApLCBhbmQgaXMgdXNlZCBmb3JcbiAqIG1vZHVsYXIgYnVpbGRzIChlLmcuIGN1c3RvbSB0ZmpzIGJ1bmRsZSB3aXRoIG9ubHkgd2ViZ2wgc3VwcG9ydCkuXG4gKlxuICogQHBhcmFtIGZhY3RvcnkgVGhlIGJhY2tlbmQgZmFjdG9yeSBmdW5jdGlvbi4gV2hlbiBjYWxsZWQsIGl0IHNob3VsZFxuICogcmV0dXJuIGEgYmFja2VuZCBpbnN0YW5jZSwgb3IgYSBwcm9taXNlIG9mIGFuIGluc3RhbmNlLlxuICogQHBhcmFtIHByaW9yaXR5IFRoZSBwcmlvcml0eSBvZiB0aGUgYmFja2VuZCAoaGlnaGVyID0gbW9yZSBpbXBvcnRhbnQpLlxuICogICAgIEluIGNhc2UgbXVsdGlwbGUgYmFja2VuZHMgYXJlIHJlZ2lzdGVyZWQsIHRoZSBwcmlvcml0eSBpcyB1c2VkIHRvIGZpbmRcbiAqICAgICB0aGUgYmVzdCBiYWNrZW5kLiBEZWZhdWx0cyB0byAxLlxuICogQHJldHVybiBGYWxzZSBpZiB0aGVyZSBpcyBhbHJlYWR5IGEgcmVnaXN0ZXJlZCBiYWNrZW5kIHVuZGVyIHRoaXMgbmFtZSwgdHJ1ZVxuICogICAgIGlmIG5vdC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnQmFja2VuZHMnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJCYWNrZW5kKG5hbWUsIGZhY3RvcnksIHByaW9yaXR5ID0gMSkge1xuICAgIHJldHVybiBFTkdJTkUucmVnaXN0ZXJCYWNrZW5kKG5hbWUsIGZhY3RvcnksIHByaW9yaXR5KTtcbn1cbi8qKlxuICogR2V0cyB0aGUgY3VycmVudCBiYWNrZW5kLiBJZiBubyBiYWNrZW5kcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQsIHRoaXMgd2lsbFxuICogYXR0ZW1wdCB0byBpbml0aWFsaXplIHRoZSBiZXN0IGJhY2tlbmQuIFdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgdGhlIGhpZ2hlc3RcbiAqIHByaW9yaXR5IGJhY2tlbmQgaGFzIGFzeW5jIGluaXRpYWxpemF0aW9uLCBpbiB3aGljaCBjYXNlLCB5b3Ugc2hvdWxkIGNhbGxcbiAqICdhd2FpdCB0Zi5yZWFkeSgpJyBiZWZvcmUgcnVubmluZyBvdGhlciBjb2RlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdCYWNrZW5kcyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiYWNrZW5kKCkge1xuICAgIHJldHVybiBFTkdJTkUuYmFja2VuZDtcbn1cbi8qKlxuICogU2V0cyB0aGUgZ2xvYmFsIHBsYXRmb3JtLlxuICpcbiAqIEBwYXJhbSBwbGF0Zm9ybU5hbWUgVGhlIG5hbWUgb2YgdGhpcyBwbGF0Zm9ybS5cbiAqIEBwYXJhbSBwbGF0Zm9ybSBBIHBsYXRmb3JtIGltcGxlbWVudGF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0UGxhdGZvcm0ocGxhdGZvcm1OYW1lLCBwbGF0Zm9ybSkge1xuICAgIGVudigpLnNldFBsYXRmb3JtKHBsYXRmb3JtTmFtZSwgcGxhdGZvcm0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2xvYmFscy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuL2VuZ2luZSc7XG5pbXBvcnQgeyBUZW5zb3IsIFZhcmlhYmxlIH0gZnJvbSAnLi90ZW5zb3InO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yLCBjb252ZXJ0VG9UZW5zb3JBcnJheSB9IGZyb20gJy4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi91dGlsJztcbi8qKlxuICogUHJvdmlkZWQgYGYoeClgLCByZXR1cm5zIGFub3RoZXIgZnVuY3Rpb24gYGcoeCwgZHk/KWAsIHdoaWNoIGdpdmVzIHRoZVxuICogZ3JhZGllbnQgb2YgYGYoeClgIHdpdGggcmVzcGVjdCB0byBgeGAuXG4gKlxuICogSWYgYGR5YCBpcyBwcm92aWRlZCwgdGhlIGdyYWRpZW50IG9mIGBmKHgpLm11bChkeSkuc3VtKClgIHdpdGggcmVzcGVjdCB0b1xuICogYHhgIGlzIGNvbXB1dGVkIGluc3RlYWQuIGBmKHgpYCBtdXN0IHRha2UgYSBzaW5nbGUgdGVuc29yIGB4YCBhbmQgcmV0dXJuIGFcbiAqIHNpbmdsZSB0ZW5zb3IgYHlgLiBJZiBgZigpYCB0YWtlcyBtdWx0aXBsZSBpbnB1dHMsIHVzZSBgdGYuZ3JhZHNgIGluc3RlYWQuXG4gKlxuICogYGBganNcbiAqIC8vIGYoeCkgPSB4IF4gMlxuICogY29uc3QgZiA9IHggPT4geC5zcXVhcmUoKTtcbiAqIC8vIGYnKHgpID0gMnhcbiAqIGNvbnN0IGcgPSB0Zi5ncmFkKGYpO1xuICpcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMiwgM10pO1xuICogZyh4KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogYGBganNcbiAqIC8vIGYoeCkgPSB4IF4gM1xuICogY29uc3QgZiA9IHggPT4geC5wb3codGYuc2NhbGFyKDMsICdpbnQzMicpKTtcbiAqIC8vIGYnKHgpID0gM3ggXiAyXG4gKiBjb25zdCBnID0gdGYuZ3JhZChmKTtcbiAqIC8vIGYnJyh4KSA9IDZ4XG4gKiBjb25zdCBnZyA9IHRmLmdyYWQoZyk7XG4gKlxuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsyLCAzXSk7XG4gKiBnZyh4KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGYgVGhlIGZ1bmN0aW9uIGYoeCksIHRvIGNvbXB1dGUgZ3JhZGllbnQgZm9yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdHcmFkaWVudHMnfVxuICovXG5mdW5jdGlvbiBncmFkKGYpIHtcbiAgICB1dGlsLmFzc2VydCh1dGlsLmlzRnVuY3Rpb24oZiksICgpID0+ICdUaGUgZiBwYXNzZWQgaW4gZ3JhZChmKSBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICByZXR1cm4gKHgsIGR5KSA9PiB7XG4gICAgICAgIC8vIHggY2FuIGJlIG9mIGFueSBkdHlwZSwgdGh1cyBudWxsIGFzIHRoZSBsYXN0IGFyZ3VtZW50LlxuICAgICAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICd0Zi5ncmFkJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG4gICAgICAgIGNvbnN0ICRkeSA9IChkeSAhPSBudWxsKSA/IGNvbnZlcnRUb1RlbnNvcihkeSwgJ2R5JywgJ3RmLmdyYWQnKSA6IG51bGw7XG4gICAgICAgIHJldHVybiBFTkdJTkUudGlkeSgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IHZhbHVlLCBncmFkcyB9ID0gRU5HSU5FLmdyYWRpZW50cygoKSA9PiBmKCR4KSwgWyR4XSwgJGR5KTtcbiAgICAgICAgICAgIGlmICgkZHkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHV0aWwuYXNzZXJ0U2hhcGVzTWF0Y2godmFsdWUuc2hhcGUsICRkeS5zaGFwZSwgJ1RoZSBzaGFwZSBvZiBkeSBwYXNzZWQgaW4gZ3JhZChmKSh4LCBkeSkgbXVzdCBtYXRjaCB0aGUgc2hhcGUgJyArXG4gICAgICAgICAgICAgICAgICAgICdyZXR1cm5lZCBieSBmKHgpJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaGVja0dyYWRzKGdyYWRzKTtcbiAgICAgICAgICAgIHJldHVybiBncmFkc1swXTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cbi8qKlxuICogUHJvdmlkZWQgYGYoeDEsIHgyLC4uLilgLCByZXR1cm5zIGFub3RoZXIgZnVuY3Rpb24gYGcoW3gxLCB4MiwuLi5dLCBkeT8pYCxcbiAqIHdoaWNoIGdpdmVzIGFuIGFycmF5IG9mIGdyYWRpZW50cyBvZiBgZigpYCB3aXRoIHJlc3BlY3QgdG8gZWFjaCBpbnB1dFxuICogW2B4MWAsYHgyYCwuLi5dLlxuICpcbiAqIElmIGBkeWAgaXMgcGFzc2VkIHdoZW4gY2FsbGluZyBgZygpYCwgdGhlIGdyYWRpZW50IG9mXG4gKiBgZih4MSwuLi4pLm11bChkeSkuc3VtKClgIHdpdGggcmVzcGVjdCB0byBlYWNoIGlucHV0IGlzIGNvbXB1dGVkIGluc3RlYWQuXG4gKiBUaGUgcHJvdmlkZWQgYGZgIG11c3QgdGFrZSBvbmUgb3IgbW9yZSB0ZW5zb3JzIGFuZCByZXR1cm4gYSBzaW5nbGUgdGVuc29yXG4gKiBgeWAuIElmIGBmKClgIHRha2VzIGEgc2luZ2xlIGlucHV0LCB3ZSByZWNvbW1lbmQgdXNpbmcgYHRmLmdyYWRgIGluc3RlYWQuXG4gKlxuICogYGBganNcbiAqIC8vIGYoYSwgYikgPSBhICogYlxuICogY29uc3QgZiA9IChhLCBiKSA9PiBhLm11bChiKTtcbiAqIC8vIGRmIC8gZGEgPSBiLCBkZiAvIGRiID0gYVxuICogY29uc3QgZyA9IHRmLmdyYWRzKGYpO1xuICpcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMiwgM10pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFstMiwgLTNdKTtcbiAqIGNvbnN0IFtkYSwgZGJdID0gZyhbYSwgYl0pO1xuICogY29uc29sZS5sb2coJ2RhJyk7XG4gKiBkYS5wcmludCgpO1xuICogY29uc29sZS5sb2coJ2RiJyk7XG4gKiBkYi5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGYgVGhlIGZ1bmN0aW9uIGBmKHgxLCB4MiwuLi4pYCB0byBjb21wdXRlIGdyYWRpZW50cyBmb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0dyYWRpZW50cyd9XG4gKi9cbmZ1bmN0aW9uIGdyYWRzKGYpIHtcbiAgICB1dGlsLmFzc2VydCh1dGlsLmlzRnVuY3Rpb24oZiksICgpID0+ICdUaGUgZiBwYXNzZWQgaW4gZ3JhZHMoZikgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgcmV0dXJuIChhcmdzLCBkeSkgPT4ge1xuICAgICAgICB1dGlsLmFzc2VydChBcnJheS5pc0FycmF5KGFyZ3MpLCAoKSA9PiAnVGhlIGFyZ3MgcGFzc2VkIGluIGdyYWRzKGYpKGFyZ3MpIG11c3QgYmUgYW4gYXJyYXkgJyArXG4gICAgICAgICAgICAnb2YgYFRlbnNvcmBzIG9yIGBUZW5zb3JMaWtlYHMnKTtcbiAgICAgICAgLy8gYXJncyBjYW4gYmUgb2YgYW55IGR0eXBlLCB0aHVzIG51bGwgYXMgdGhlIGxhc3QgYXJndW1lbnQuXG4gICAgICAgIGNvbnN0ICRhcmdzID0gY29udmVydFRvVGVuc29yQXJyYXkoYXJncywgJ2FyZ3MnLCAndGYuZ3JhZHMnLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgICAgICAgY29uc3QgJGR5ID0gKGR5ICE9IG51bGwpID8gY29udmVydFRvVGVuc29yKGR5LCAnZHknLCAndGYuZ3JhZHMnKSA6IG51bGw7XG4gICAgICAgIHJldHVybiBFTkdJTkUudGlkeSgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IHZhbHVlLCBncmFkcyB9ID0gRU5HSU5FLmdyYWRpZW50cygoKSA9PiBmKC4uLiRhcmdzKSwgJGFyZ3MsICRkeSk7XG4gICAgICAgICAgICBpZiAoJGR5ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB1dGlsLmFzc2VydFNoYXBlc01hdGNoKHZhbHVlLnNoYXBlLCAkZHkuc2hhcGUsICdUaGUgc2hhcGUgb2YgZHkgcGFzc2VkIGluIGdyYWRzKGYpKFt4MSwuLi5dLCBkeSkgbXVzdCAnICtcbiAgICAgICAgICAgICAgICAgICAgJ21hdGNoIHRoZSBzaGFwZSByZXR1cm5lZCBieSBmKFt4MSwuLi5dKScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2hlY2tHcmFkcyhncmFkcyk7XG4gICAgICAgICAgICByZXR1cm4gZ3JhZHM7XG4gICAgICAgIH0pO1xuICAgIH07XG59XG4vKipcbiAqIExpa2UgYHRmLmdyYWRgLCBidXQgYWxzbyByZXR1cm5zIHRoZSB2YWx1ZSBvZiBgZigpYC4gVXNlZnVsIHdoZW4gYGYoKWBcbiAqIHJldHVybnMgYSBtZXRyaWMgeW91IHdhbnQgdG8gc2hvdy5cbiAqXG4gKiBUaGUgcmVzdWx0IGlzIGEgcmljaCBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAtIGdyYWQ6IFRoZSBncmFkaWVudCBvZiBgZih4KWAgdy5yLnQgYHhgIChyZXN1bHQgb2YgYHRmLmdyYWRgKS5cbiAqIC0gdmFsdWU6IFRoZSB2YWx1ZSByZXR1cm5lZCBieSBgZih4KWAuXG4gKlxuICogYGBganNcbiAqIC8vIGYoeCkgPSB4IF4gMlxuICogY29uc3QgZiA9IHggPT4geC5zcXVhcmUoKTtcbiAqIC8vIGYnKHgpID0gMnhcbiAqIGNvbnN0IGcgPSB0Zi52YWx1ZUFuZEdyYWQoZik7XG4gKlxuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsyLCAzXSk7XG4gKiBjb25zdCB7dmFsdWUsIGdyYWR9ID0gZyh4KTtcbiAqXG4gKiBjb25zb2xlLmxvZygndmFsdWUnKTtcbiAqIHZhbHVlLnByaW50KCk7XG4gKiBjb25zb2xlLmxvZygnZ3JhZCcpO1xuICogZ3JhZC5wcmludCgpO1xuICogYGBgXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0dyYWRpZW50cyd9XG4gKi9cbmZ1bmN0aW9uIHZhbHVlQW5kR3JhZChmKSB7XG4gICAgdXRpbC5hc3NlcnQodXRpbC5pc0Z1bmN0aW9uKGYpLCAoKSA9PiAnVGhlIGYgcGFzc2VkIGluIHZhbHVlQW5kR3JhZChmKSBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICByZXR1cm4gKHgsIGR5KSA9PiB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHggaW5zdGFuY2VvZiBUZW5zb3IsICgpID0+ICdUaGUgeCBwYXNzZWQgaW4gdmFsdWVBbmRHcmFkKGYpKHgpIG11c3QgYmUgYSB0ZW5zb3InKTtcbiAgICAgICAgdXRpbC5hc3NlcnQoZHkgPT0gbnVsbCB8fCBkeSBpbnN0YW5jZW9mIFRlbnNvciwgKCkgPT4gJ1RoZSBkeSBwYXNzZWQgaW4gdmFsdWVBbmRHcmFkKGYpKHgsIGR5KSBtdXN0IGJlIGEgdGVuc29yJyk7XG4gICAgICAgIGNvbnN0IHsgZ3JhZHMsIHZhbHVlIH0gPSBFTkdJTkUuZ3JhZGllbnRzKCgpID0+IGYoeCksIFt4XSwgZHkpO1xuICAgICAgICBjaGVja0dyYWRzKGdyYWRzKTtcbiAgICAgICAgcmV0dXJuIHsgZ3JhZDogZ3JhZHNbMF0sIHZhbHVlIH07XG4gICAgfTtcbn1cbi8qKlxuICogTGlrZSBgdGYuZ3JhZHNgLCBidXQgcmV0dXJucyBhbHNvIHRoZSB2YWx1ZSBvZiBgZigpYC4gVXNlZnVsIHdoZW4gYGYoKWBcbiAqIHJldHVybnMgYSBtZXRyaWMgeW91IHdhbnQgdG8gc2hvdy5cbiAqXG4gKiBUaGUgcmVzdWx0IGlzIGEgcmljaCBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAtIGdyYWRzOiBUaGUgZ3JhZGllbnRzIG9mIGBmKClgIHcuci50IGVhY2ggaW5wdXQgKHJlc3VsdCBvZiBgdGYuZ3JhZHNgKS5cbiAqIC0gdmFsdWU6IFRoZSB2YWx1ZSByZXR1cm5lZCBieSBgZih4KWAuXG4gKlxuICogYGBganNcbiAqIC8vIGYoYSwgYikgPSBhICogYlxuICogY29uc3QgZiA9IChhLCBiKSA9PiBhLm11bChiKTtcbiAqIC8vIGRmL2RhID0gYiwgZGYvZGIgPSBhXG4gKiBjb25zdCBnID0gdGYudmFsdWVBbmRHcmFkcyhmKTtcbiAqXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzIsIDNdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbLTIsIC0zXSk7XG4gKiBjb25zdCB7dmFsdWUsIGdyYWRzfSA9IGcoW2EsIGJdKTtcbiAqXG4gKiBjb25zdCBbZGEsIGRiXSA9IGdyYWRzO1xuICpcbiAqIGNvbnNvbGUubG9nKCd2YWx1ZScpO1xuICogdmFsdWUucHJpbnQoKTtcbiAqXG4gKiBjb25zb2xlLmxvZygnZGEnKTtcbiAqIGRhLnByaW50KCk7XG4gKiBjb25zb2xlLmxvZygnZGInKTtcbiAqIGRiLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVHJhaW5pbmcnLCBzdWJoZWFkaW5nOiAnR3JhZGllbnRzJ31cbiAqL1xuZnVuY3Rpb24gdmFsdWVBbmRHcmFkcyhmKSB7XG4gICAgdXRpbC5hc3NlcnQodXRpbC5pc0Z1bmN0aW9uKGYpLCAoKSA9PiAnVGhlIGYgcGFzc2VkIGluIHZhbHVlQW5kR3JhZHMoZikgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgcmV0dXJuIChhcmdzLCBkeSkgPT4ge1xuICAgICAgICB1dGlsLmFzc2VydChBcnJheS5pc0FycmF5KGFyZ3MpICYmIGFyZ3MuZXZlcnkoYXJnID0+IGFyZyBpbnN0YW5jZW9mIFRlbnNvciksICgpID0+ICdUaGUgYXJncyBwYXNzZWQgaW4gdmFsdWVBbmRHcmFkcyhmKShhcmdzKSBtdXN0IGJlIGFycmF5IG9mICcgK1xuICAgICAgICAgICAgJ3RlbnNvcnMnKTtcbiAgICAgICAgdXRpbC5hc3NlcnQoZHkgPT0gbnVsbCB8fCBkeSBpbnN0YW5jZW9mIFRlbnNvciwgKCkgPT4gJ1RoZSBkeSBwYXNzZWQgaW4gdmFsdWVBbmRHcmFkcyhmKShhcmdzLCBkeSkgbXVzdCBiZSBhIHRlbnNvcicpO1xuICAgICAgICBjb25zdCByZXMgPSBFTkdJTkUuZ3JhZGllbnRzKCgpID0+IGYoLi4uYXJncyksIGFyZ3MsIGR5KTtcbiAgICAgICAgaWYgKGR5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHV0aWwuYXNzZXJ0U2hhcGVzTWF0Y2gocmVzLnZhbHVlLnNoYXBlLCBkeS5zaGFwZSwgJ1RoZSBzaGFwZSBvZiBkeSBwYXNzZWQgaW4gdmFsdWVBbmRHcmFkcyhmKShbeDEsLi4uXSwgZHkpIG11c3QgJyArXG4gICAgICAgICAgICAgICAgJ21hdGNoIHRoZSBzaGFwZSByZXR1cm5lZCBieSBmKFt4MSwuLi5dKScpO1xuICAgICAgICB9XG4gICAgICAgIGNoZWNrR3JhZHMocmVzLmdyYWRzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9O1xufVxuLyoqXG4gKiBDb21wdXRlcyBhbmQgcmV0dXJucyB0aGUgZ3JhZGllbnQgb2YgZih4KSB3aXRoIHJlc3BlY3QgdG8gdGhlIGxpc3Qgb2ZcbiAqIHRyYWluYWJsZSB2YXJpYWJsZXMgcHJvdmlkZWQgYnkgYHZhckxpc3RgLiBJZiBubyBsaXN0IGlzIHByb3ZpZGVkLCBpdFxuICogZGVmYXVsdHMgdG8gYWxsIHRyYWluYWJsZSB2YXJpYWJsZXMuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi52YXJpYWJsZSh0Zi50ZW5zb3IxZChbMywgNF0pKTtcbiAqIGNvbnN0IGIgPSB0Zi52YXJpYWJsZSh0Zi50ZW5zb3IxZChbNSwgNl0pKTtcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMl0pO1xuICpcbiAqIC8vIGYoYSwgYikgPSBhICogeCBeIDIgKyBiICogeFxuICogY29uc3QgZiA9ICgpID0+IGEubXVsKHguc3F1YXJlKCkpLmFkZChiLm11bCh4KSkuc3VtKCk7XG4gKiAvLyBkZi9kYSA9IHggXiAyLCBkZi9kYiA9IHhcbiAqIGNvbnN0IHt2YWx1ZSwgZ3JhZHN9ID0gdGYudmFyaWFibGVHcmFkcyhmKTtcbiAqXG4gKiBPYmplY3Qua2V5cyhncmFkcykuZm9yRWFjaCh2YXJOYW1lID0+IGdyYWRzW3Zhck5hbWVdLnByaW50KCkpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGYgVGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUuIGYoKSBzaG91bGQgcmV0dXJuIGEgc2NhbGFyLlxuICogQHBhcmFtIHZhckxpc3QgVGhlIGxpc3Qgb2YgdmFyaWFibGVzIHRvIGNvbXB1dGUgdGhlIGdyYWRpZW50cyB3aXRoIHJlc3BlY3RcbiAqICAgICB0by4gRGVmYXVsdHMgdG8gYWxsIHRyYWluYWJsZSB2YXJpYWJsZXMuXG4gKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIGtleXMgYW5kIHZhbHVlczpcbiAqICAgLSBgdmFsdWVgOiBUaGUgdmFsdWUgb2YgdGhlIGZ1bmN0aW9uIGBmYC5cbiAqICAgLSBgZ3JhZHNgOiBBIG1hcCBmcm9tIHRoZSBuYW1lcyBvZiB0aGUgdmFyaWFibGVzIHRvIHRoZSBncmFkaWVudHMuXG4gKiAgICAgSWYgdGhlIGB2YXJMaXN0YCBhcmd1bWVudCBpcyBwcm92aWRlZCBleHBsaWNpdGx5IGFuZCBjb250YWlucyBhIHN1YnNldCBvZlxuICogICAgIG5vbi10cmFpbmFibGUgdmFyaWFibGVzLCB0aGlzIG1hcCBpbiB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgY29udGFpbiBrZXlzXG4gKiAgICAgdGhhdCBtYXAgdGhlIG5hbWVzIG9mIHRoZSBub24tdHJhaW5hYmxlIHZhcmlhYmxlcyB0byBgbnVsbGAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0dyYWRpZW50cyd9XG4gKi9cbmZ1bmN0aW9uIHZhcmlhYmxlR3JhZHMoZiwgdmFyTGlzdCkge1xuICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNGdW5jdGlvbihmKSwgKCkgPT4gJ1RoZSBmIHBhc3NlZCBpbiB2YXJpYWJsZUdyYWRzKGYpIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgIHV0aWwuYXNzZXJ0KHZhckxpc3QgPT0gbnVsbCB8fFxuICAgICAgICBBcnJheS5pc0FycmF5KHZhckxpc3QpICYmIHZhckxpc3QuZXZlcnkodiA9PiB2IGluc3RhbmNlb2YgVmFyaWFibGUpLCAoKSA9PiAnVGhlIHZhckxpc3QgcGFzc2VkIGluIHZhcmlhYmxlR3JhZHMoZiwgdmFyTGlzdCkgbXVzdCBiZSBhbiBhcnJheSAnICtcbiAgICAgICAgJ29mIHZhcmlhYmxlcycpO1xuICAgIGNvbnN0IHNwZWNpZmllZFZhckxpc3QgPSB2YXJMaXN0ICE9IG51bGw7XG4gICAgaWYgKCFzcGVjaWZpZWRWYXJMaXN0KSB7XG4gICAgICAgIC8vIEdldCBhbGwgb2YgdGhlIHRyYWluYWJsZSB2YXJpYWJsZXMuXG4gICAgICAgIHZhckxpc3QgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCB2YXJOYW1lIGluIEVOR0lORS5yZWdpc3RlcmVkVmFyaWFibGVzKSB7XG4gICAgICAgICAgICB2YXJMaXN0LnB1c2goRU5HSU5FLnJlZ2lzdGVyZWRWYXJpYWJsZXNbdmFyTmFtZV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHNwZWNpZmllZE5vblRyYWluYWJsZSA9IHNwZWNpZmllZFZhckxpc3QgPyB2YXJMaXN0LmZpbHRlcih2YXJpYWJsZSA9PiAhdmFyaWFibGUudHJhaW5hYmxlKSA6IG51bGw7XG4gICAgLy8gUHJ1bmUgbm9uLXRyYWluYWJsZSB2YXJpYWJsZXMuXG4gICAgY29uc3Qgb3JpZ2luYWxWYXJDb3VudCA9IHZhckxpc3QubGVuZ3RoO1xuICAgIHZhckxpc3QgPSB2YXJMaXN0LmZpbHRlcih2YXJpYWJsZSA9PiB2YXJpYWJsZS50cmFpbmFibGUpO1xuICAgIHV0aWwuYXNzZXJ0KHZhckxpc3QubGVuZ3RoID4gMCwgKCkgPT4gYHZhcmlhYmxlR3JhZHMoKSBleHBlY3RzIGF0IGxlYXN0IG9uZSBvZiB0aGUgaW5wdXQgdmFyaWFibGVzIHRvIGAgK1xuICAgICAgICBgYmUgdHJhaW5hYmxlLCBidXQgbm9uZSBvZiB0aGUgJHtvcmlnaW5hbFZhckNvdW50fSB2YXJpYWJsZXMgaXMgYCArXG4gICAgICAgIGB0cmFpbmFibGUuYCk7XG4gICAgY29uc3QgYWxsb3dOb0dyYWRpZW50cyA9IHRydWU7XG4gICAgY29uc3QgeyB2YWx1ZSwgZ3JhZHMgfSA9IEVOR0lORS5ncmFkaWVudHMoZiwgdmFyTGlzdCwgbnVsbCwgYWxsb3dOb0dyYWRpZW50cyk7XG4gICAgdXRpbC5hc3NlcnQoZ3JhZHMuc29tZShnID0+IGcgIT0gbnVsbCksICgpID0+ICdDYW5ub3QgZmluZCBhIGNvbm5lY3Rpb24gYmV0d2VlbiBhbnkgdmFyaWFibGUgYW5kIHRoZSByZXN1bHQgb2YgJyArXG4gICAgICAgICd0aGUgbG9zcyBmdW5jdGlvbiB5PWYoeCkuIFBsZWFzZSBtYWtlIHN1cmUgdGhlIG9wZXJhdGlvbnMgdGhhdCAnICtcbiAgICAgICAgJ3VzZSB2YXJpYWJsZXMgYXJlIGluc2lkZSB0aGUgZnVuY3Rpb24gZiBwYXNzZWQgdG8gbWluaW1pemUoKS4nKTtcbiAgICB1dGlsLmFzc2VydCh2YWx1ZS5yYW5rID09PSAwLCAoKSA9PiBgVGhlIGYgcGFzc2VkIGluIHZhcmlhYmxlR3JhZHMoZikgbXVzdCByZXR1cm4gYSBzY2FsYXIsIGJ1dCBpdCBgICtcbiAgICAgICAgYHJldHVybmVkIGEgcmFuay0ke3ZhbHVlLnJhbmt9IHRlbnNvcmApO1xuICAgIGNvbnN0IG5hbWVkR3JhZHMgPSB7fTtcbiAgICB2YXJMaXN0LmZvckVhY2goKHYsIGkpID0+IHtcbiAgICAgICAgaWYgKGdyYWRzW2ldICE9IG51bGwpIHtcbiAgICAgICAgICAgIG5hbWVkR3JhZHNbdi5uYW1lXSA9IGdyYWRzW2ldO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHNwZWNpZmllZE5vblRyYWluYWJsZSAhPSBudWxsKSB7XG4gICAgICAgIC8vIElmIHZhckxpc3QgaXMgZXhwbGljaXRseSBwcm92aWRlZCBhbmQgY29udGFpbnMgbm9uLXRyYWluYWJsZSB2YWx1ZXMsXG4gICAgICAgIC8vIGFkZCB0aGVtIHRvIHRoZSByZXR1cm5lZCBncmFkaWVudHMgd2l0aCBgbnVsbGAgdmFsdWVzLlxuICAgICAgICBzcGVjaWZpZWROb25UcmFpbmFibGUuZm9yRWFjaCh2ID0+IG5hbWVkR3JhZHNbdi5uYW1lXSA9IG51bGwpO1xuICAgIH1cbiAgICByZXR1cm4geyB2YWx1ZSwgZ3JhZHM6IG5hbWVkR3JhZHMgfTtcbn1cbi8qKlxuICogT3ZlcnJpZGVzIHRoZSBncmFkaWVudCBjb21wdXRhdGlvbiBvZiBhIGZ1bmN0aW9uIGBmYC5cbiAqXG4gKiBUYWtlcyBhIGZ1bmN0aW9uXG4gKiBgZiguLi5pbnB1dHMsIHNhdmUpID0+IHt2YWx1ZTogVGVuc29yLCBncmFkRnVuYzogKGR5LCBzYXZlZCkgPT4gVGVuc29yW119YFxuICogYW5kIHJldHVybnMgYW5vdGhlciBmdW5jdGlvbiBgZyguLi5pbnB1dHMpYCB3aGljaCB0YWtlcyB0aGUgc2FtZSBpbnB1dHMgYXNcbiAqIGBmYC4gV2hlbiBjYWxsZWQsIGBnYCByZXR1cm5zIGBmKCkudmFsdWVgLiBJbiBiYWNrd2FyZCBtb2RlLCBjdXN0b20gZ3JhZGllbnRzXG4gKiB3aXRoIHJlc3BlY3QgdG8gZWFjaCBpbnB1dCBvZiBgZmAgYXJlIGNvbXB1dGVkIHVzaW5nIGBmKCkuZ3JhZEZ1bmNgLlxuICpcbiAqIFRoZSBgc2F2ZWAgZnVuY3Rpb24gcGFzc3NlZCB0byBgZmAgc2hvdWxkIGJlIHVzZWQgZm9yIHNhdmluZyB0ZW5zb3JzIG5lZWRlZFxuICogaW4gdGhlIGdyYWRpZW50LiBBbmQgdGhlIGBzYXZlZGAgcGFzc2VkIHRvIHRoZSBgZ3JhZEZ1bmNgIGlzIGFcbiAqIGBOYW1lZFRlbnNvck1hcGAsIHdoaWNoIGNvbnRhaW5zIHRob3NlIHNhdmVkIHRlbnNvci5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgY3VzdG9tT3AgPSB0Zi5jdXN0b21HcmFkKCh4LCBzYXZlKSA9PiB7XG4gKiAgIC8vIFNhdmUgeCB0byBtYWtlIHN1cmUgaXQncyBhdmFpbGFibGUgbGF0ZXIgZm9yIHRoZSBncmFkaWVudC5cbiAqICAgc2F2ZShbeF0pO1xuICogICAvLyBPdmVycmlkZSBncmFkaWVudCBvZiBvdXIgY3VzdG9tIHggXiAyIG9wIHRvIGJlIGR5ICogYWJzKHgpO1xuICogICByZXR1cm4ge1xuICogICAgIHZhbHVlOiB4LnNxdWFyZSgpLFxuICogICAgIC8vIE5vdGUgYHNhdmVkLnhgIHdoaWNoIHBvaW50cyB0byB0aGUgYHhgIHdlIHNhdmVkIGVhcmxpZXIuXG4gKiAgICAgZ3JhZEZ1bmM6IChkeSwgc2F2ZWQpID0+IFtkeS5tdWwoc2F2ZWRbMF0uYWJzKCkpXVxuICogICB9O1xuICogfSk7XG4gKlxuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFstMSwgLTIsIDNdKTtcbiAqIGNvbnN0IGR4ID0gdGYuZ3JhZCh4ID0+IGN1c3RvbU9wKHgpKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhgZih4KTpgKTtcbiAqIGN1c3RvbU9wKHgpLnByaW50KCk7XG4gKiBjb25zb2xlLmxvZyhgZicoeCk6YCk7XG4gKiBkeCh4KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGYgVGhlIGZ1bmN0aW9uIHRvIGV2YWx1YXRlIGluIGZvcndhcmQgbW9kZSwgd2hpY2ggc2hvdWxkIHJldHVyblxuICogICAgIGB7dmFsdWU6IFRlbnNvciwgZ3JhZEZ1bmM6IChkeSwgc2F2ZWQpID0+IFRlbnNvcltdfWAsIHdoZXJlIGBncmFkRnVuY2BcbiAqICAgICByZXR1cm5zIHRoZSBjdXN0b20gZ3JhZGllbnRzIG9mIGBmYCB3aXRoIHJlc3BlY3QgdG8gaXRzIGlucHV0cy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVHJhaW5pbmcnLCBzdWJoZWFkaW5nOiAnR3JhZGllbnRzJ31cbiAqL1xuZnVuY3Rpb24gY3VzdG9tR3JhZChmKSB7XG4gICAgcmV0dXJuIEVOR0lORS5jdXN0b21HcmFkKGYpO1xufVxuZnVuY3Rpb24gY2hlY2tHcmFkcyhncmFkcykge1xuICAgIGNvbnN0IG51bU51bGxHcmFkaWVudHMgPSBncmFkcy5maWx0ZXIoZyA9PiBnID09IG51bGwpLmxlbmd0aDtcbiAgICBpZiAobnVtTnVsbEdyYWRpZW50cyA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29tcHV0ZSBncmFkaWVudCBvZiB5PWYoeCkgd2l0aCByZXNwZWN0IHRvIHguIE1ha2Ugc3VyZSB0aGF0XG4gICAgdGhlIGYgeW91IHBhc3NlZCBlbmNsb3NlcyBhbGwgb3BlcmF0aW9ucyB0aGF0IGxlYWQgZnJvbSB4IHRvIHkuYCk7XG4gICAgfVxufVxuZXhwb3J0IHsgY3VzdG9tR3JhZCwgdmFyaWFibGVHcmFkcywgdmFsdWVBbmRHcmFkLCB2YWx1ZUFuZEdyYWRzLCBncmFkLCBncmFkcywgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdyYWRpZW50cy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vLyBXb3JrYXJvdW5kIGZvciBhbGxvd2luZyBjanMgbW9kdWxlIHRvIGJlIGluY2x1ZGVkIGluIGJ1bmRsZSBjcmVhdGVkIGJ5XG4vLyByb2xsdXAuXG5pbXBvcnQgKiBhcyBMb25nRXhwb3J0cyBmcm9tICdsb25nJztcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuY29uc3QgTG9uZyA9IFxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG5Mb25nRXhwb3J0cy5kZWZhdWx0IHx8IExvbmdFeHBvcnRzO1xuZXhwb3J0IGZ1bmN0aW9uIGhleFRvTG9uZyhoZXgpIHtcbiAgICByZXR1cm4gTG9uZy5mcm9tU3RyaW5nKGhleCwgdHJ1ZSwgMTYpO1xufVxuLy8gU29tZSBwcmltZXMgYmV0d2VlbiAyXjYzIGFuZCAyXjY0IGZvciB2YXJpb3VzIHVzZXMuXG4vLyBIZXggMHhjM2E1Yzg1Yzk3Y2IzMTI3XG5jb25zdCBrMCA9IGhleFRvTG9uZygnYzNhNWM4NWM5N2NiMzEyNycpO1xuLy8gSGV4IDB4YjQ5MmI2NmZiZTk4ZjI3M1xuY29uc3QgazEgPSBoZXhUb0xvbmcoJ2I0OTJiNjZmYmU5OGYyNzMnKTtcbi8vIEhleCAweDlhZTE2YTNiMmY5MDQwNGZcbmNvbnN0IGsyID0gaGV4VG9Mb25nKCc5YWUxNmEzYjJmOTA0MDRmJyk7XG5mdW5jdGlvbiBzaGlmdE1peCh2YWwpIHtcbiAgICByZXR1cm4gdmFsLnhvcih2YWwuc2hydSg0NykpO1xufVxuZnVuY3Rpb24gZmV0Y2gocywgb2Zmc2V0LCBudW1CeXRlcykge1xuICAgIGNvbnN0IGJ5dGVzID0gcy5zbGljZShvZmZzZXQsIG9mZnNldCArIG51bUJ5dGVzKTtcbiAgICByZXR1cm4gTG9uZy5mcm9tQnl0ZXMoQXJyYXkuZnJvbShieXRlcyksIHRydWUsIHRydWUpO1xufVxuZnVuY3Rpb24gZmV0Y2g2NChzLCBvZmZzZXQpIHtcbiAgICByZXR1cm4gZmV0Y2gocywgb2Zmc2V0LCA4KTtcbn1cbmZ1bmN0aW9uIGZldGNoMzIocywgb2Zmc2V0KSB7XG4gICAgcmV0dXJuIGZldGNoKHMsIG9mZnNldCwgNCk7XG59XG5mdW5jdGlvbiByb3RhdGU2NCh2YWwsIHNoaWZ0KSB7XG4gICAgLy8gQXZvaWQgc2hpZnRpbmcgYnkgNjQ6IGRvaW5nIHNvIHlpZWxkcyBhbiB1bmRlZmluZWQgcmVzdWx0LlxuICAgIHJldHVybiBzaGlmdCA9PT0gMCA/IHZhbCA6IHZhbC5zaHJ1KHNoaWZ0KS5vcih2YWwuc2hsKDY0IC0gc2hpZnQpKTtcbn1cbmZ1bmN0aW9uIGhhc2hMZW4xNih1LCB2LCBtdWwgPSBoZXhUb0xvbmcoJzlkZGZlYTA4ZWIzODJkNjknKSkge1xuICAgIC8vIE11cm11ci1pbnNwaXJlZCBoYXNoaW5nLlxuICAgIGxldCBhID0gdS54b3IodikubXVsKG11bCk7XG4gICAgYSA9IGEueG9yKGEuc2hydSg0NykpO1xuICAgIGxldCBiID0gdi54b3IoYSkubXVsKG11bCk7XG4gICAgYiA9IGIueG9yKGIuc2hydSg0NykpO1xuICAgIGIgPSBiLm11bChtdWwpO1xuICAgIHJldHVybiBiO1xufVxuLy8gUmV0dXJuIGEgMTYtYnl0ZSBoYXNoIGZvciA0OCBieXRlcy4gIFF1aWNrIGFuZCBkaXJ0eS5cbi8vIENhbGxlcnMgZG8gYmVzdCB0byB1c2UgXCJyYW5kb20tbG9va2luZ1wiIHZhbHVlcyBmb3IgYSBhbmQgYi5cbmZ1bmN0aW9uIHdlYWtIYXNoTGVuMzJXaXRoU2VlZHModywgeCwgeSwgeiwgYSwgYikge1xuICAgIGEgPSBhLmFkZCh3KTtcbiAgICBiID0gcm90YXRlNjQoYi5hZGQoYSkuYWRkKHopLCAyMSk7XG4gICAgY29uc3QgYyA9IGE7XG4gICAgYSA9IGEuYWRkKHgpO1xuICAgIGEgPSBhLmFkZCh5KTtcbiAgICBiID0gYi5hZGQocm90YXRlNjQoYSwgNDQpKTtcbiAgICByZXR1cm4gW2EuYWRkKHopLCBiLmFkZChjKV07XG59XG5mdW5jdGlvbiB3ZWFrSGFzaExlbjMyV2l0aFNlZWRzU3RyKHMsIG9mZnNldCwgYSwgYikge1xuICAgIHJldHVybiB3ZWFrSGFzaExlbjMyV2l0aFNlZWRzKGZldGNoNjQocywgb2Zmc2V0KSwgZmV0Y2g2NChzLCBvZmZzZXQgKyA4KSwgZmV0Y2g2NChzLCBvZmZzZXQgKyAxNiksIGZldGNoNjQocywgb2Zmc2V0ICsgMjQpLCBhLCBiKTtcbn1cbmZ1bmN0aW9uIGhhc2hMZW4wdG8xNihzLCBsZW4gPSBzLmxlbmd0aCkge1xuICAgIGlmIChsZW4gPj0gOCkge1xuICAgICAgICBjb25zdCBtdWwgPSBrMi5hZGQobGVuICogMik7XG4gICAgICAgIGNvbnN0IGEgPSBmZXRjaDY0KHMsIDApLmFkZChrMik7XG4gICAgICAgIGNvbnN0IGIgPSBmZXRjaDY0KHMsIGxlbiAtIDgpO1xuICAgICAgICBjb25zdCBjID0gcm90YXRlNjQoYiwgMzcpLm11bChtdWwpLmFkZChhKTtcbiAgICAgICAgY29uc3QgZCA9IHJvdGF0ZTY0KGEsIDI1KS5hZGQoYikubXVsKG11bCk7XG4gICAgICAgIHJldHVybiBoYXNoTGVuMTYoYywgZCwgbXVsKTtcbiAgICB9XG4gICAgaWYgKGxlbiA+PSA0KSB7XG4gICAgICAgIGNvbnN0IG11bCA9IGsyLmFkZChsZW4gKiAyKTtcbiAgICAgICAgY29uc3QgYSA9IGZldGNoMzIocywgMCk7XG4gICAgICAgIHJldHVybiBoYXNoTGVuMTYoYS5zaGwoMykuYWRkKGxlbiksIGZldGNoMzIocywgbGVuIC0gNCksIG11bCk7XG4gICAgfVxuICAgIGlmIChsZW4gPiAwKSB7XG4gICAgICAgIGNvbnN0IGEgPSBzWzBdO1xuICAgICAgICBjb25zdCBiID0gc1tsZW4gPj4gMV07XG4gICAgICAgIGNvbnN0IGMgPSBzW2xlbiAtIDFdO1xuICAgICAgICBjb25zdCB5ID0gYSArIChiIDw8IDgpO1xuICAgICAgICBjb25zdCB6ID0gbGVuICsgKGMgPDwgMik7XG4gICAgICAgIHJldHVybiBzaGlmdE1peChrMi5tdWwoeSkueG9yKGswLm11bCh6KSkpLm11bChrMik7XG4gICAgfVxuICAgIHJldHVybiBrMjtcbn1cbmZ1bmN0aW9uIGhhc2hMZW4xN3RvMzIocywgbGVuID0gcy5sZW5ndGgpIHtcbiAgICBjb25zdCBtdWwgPSBrMi5hZGQobGVuICogMik7XG4gICAgY29uc3QgYSA9IGZldGNoNjQocywgMCkubXVsKGsxKTtcbiAgICBjb25zdCBiID0gZmV0Y2g2NChzLCA4KTtcbiAgICBjb25zdCBjID0gZmV0Y2g2NChzLCBsZW4gLSA4KS5tdWwobXVsKTtcbiAgICBjb25zdCBkID0gZmV0Y2g2NChzLCBsZW4gLSAxNikubXVsKGsyKTtcbiAgICByZXR1cm4gaGFzaExlbjE2KHJvdGF0ZTY0KGEuYWRkKGIpLCA0MykuYWRkKHJvdGF0ZTY0KGMsIDMwKSkuYWRkKGQpLCBhLmFkZChyb3RhdGU2NChiLmFkZChrMiksIDE4KSkuYWRkKGMpLCBtdWwpO1xufVxuZnVuY3Rpb24gaGFzaExlbjMzdG82NChzLCBsZW4gPSBzLmxlbmd0aCkge1xuICAgIGNvbnN0IG11bCA9IGsyLmFkZChsZW4gKiAyKTtcbiAgICBjb25zdCBhID0gZmV0Y2g2NChzLCAwKS5tdWwoazIpO1xuICAgIGNvbnN0IGIgPSBmZXRjaDY0KHMsIDgpO1xuICAgIGNvbnN0IGMgPSBmZXRjaDY0KHMsIGxlbiAtIDgpLm11bChtdWwpO1xuICAgIGNvbnN0IGQgPSBmZXRjaDY0KHMsIGxlbiAtIDE2KS5tdWwoazIpO1xuICAgIGNvbnN0IHkgPSByb3RhdGU2NChhLmFkZChiKSwgNDMpLmFkZChyb3RhdGU2NChjLCAzMCkpLmFkZChkKTtcbiAgICBjb25zdCB6ID0gaGFzaExlbjE2KHksIGEuYWRkKHJvdGF0ZTY0KGIuYWRkKGsyKSwgMTgpKS5hZGQoYyksIG11bCk7XG4gICAgY29uc3QgZSA9IGZldGNoNjQocywgMTYpLm11bChtdWwpO1xuICAgIGNvbnN0IGYgPSBmZXRjaDY0KHMsIDI0KTtcbiAgICBjb25zdCBnID0geS5hZGQoZmV0Y2g2NChzLCBsZW4gLSAzMikpLm11bChtdWwpO1xuICAgIGNvbnN0IGggPSB6LmFkZChmZXRjaDY0KHMsIGxlbiAtIDI0KSkubXVsKG11bCk7XG4gICAgcmV0dXJuIGhhc2hMZW4xNihyb3RhdGU2NChlLmFkZChmKSwgNDMpLmFkZChyb3RhdGU2NChnLCAzMCkpLmFkZChoKSwgZS5hZGQocm90YXRlNjQoZi5hZGQoYSksIDE4KSkuYWRkKGcpLCBtdWwpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZpbmdlclByaW50NjQocywgbGVuID0gcy5sZW5ndGgpIHtcbiAgICBjb25zdCBzZWVkID0gTG9uZy5mcm9tTnVtYmVyKDgxLCB0cnVlKTtcbiAgICBpZiAobGVuIDw9IDMyKSB7XG4gICAgICAgIGlmIChsZW4gPD0gMTYpIHtcbiAgICAgICAgICAgIHJldHVybiBoYXNoTGVuMHRvMTYocywgbGVuKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBoYXNoTGVuMTd0bzMyKHMsIGxlbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAobGVuIDw9IDY0KSB7XG4gICAgICAgIHJldHVybiBoYXNoTGVuMzN0bzY0KHMsIGxlbik7XG4gICAgfVxuICAgIC8vIEZvciBzdHJpbmdzIG92ZXIgNjQgYnl0ZXMgd2UgbG9vcC4gIEludGVybmFsIHN0YXRlIGNvbnNpc3RzIG9mXG4gICAgLy8gNTYgYnl0ZXM6IHYsIHcsIHgsIHksIGFuZCB6LlxuICAgIGxldCB4ID0gc2VlZDtcbiAgICBsZXQgeSA9IHNlZWQubXVsKGsxKS5hZGQoMTEzKTtcbiAgICBsZXQgeiA9IHNoaWZ0TWl4KHkubXVsKGsyKS5hZGQoMTEzKSkubXVsKGsyKTtcbiAgICBsZXQgdiA9IFtMb25nLlVaRVJPLCBMb25nLlVaRVJPXTtcbiAgICBsZXQgdyA9IFtMb25nLlVaRVJPLCBMb25nLlVaRVJPXTtcbiAgICB4ID0geC5tdWwoazIpLmFkZChmZXRjaDY0KHMsIDApKTtcbiAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICAvLyBTZXQgZW5kIHNvIHRoYXQgYWZ0ZXIgdGhlIGxvb3Agd2UgaGF2ZSAxIHRvIDY0IGJ5dGVzIGxlZnQgdG8gcHJvY2Vzcy5cbiAgICBjb25zdCBlbmQgPSAoKGxlbiAtIDEpID4+IDYpICogNjQ7XG4gICAgY29uc3QgbGFzdDY0ID0gZW5kICsgKChsZW4gLSAxKSAmIDYzKSAtIDYzO1xuICAgIGRvIHtcbiAgICAgICAgeCA9IHJvdGF0ZTY0KHguYWRkKHkpLmFkZCh2WzBdKS5hZGQoZmV0Y2g2NChzLCBvZmZzZXQgKyA4KSksIDM3KS5tdWwoazEpO1xuICAgICAgICB5ID0gcm90YXRlNjQoeS5hZGQodlsxXSkuYWRkKGZldGNoNjQocywgb2Zmc2V0ICsgNDgpKSwgNDIpLm11bChrMSk7XG4gICAgICAgIHggPSB4Lnhvcih3WzFdKTtcbiAgICAgICAgeSA9IHkuYWRkKHZbMF0pLmFkZChmZXRjaDY0KHMsIG9mZnNldCArIDQwKSk7XG4gICAgICAgIHogPSByb3RhdGU2NCh6LmFkZCh3WzBdKSwgMzMpLm11bChrMSk7XG4gICAgICAgIHYgPSB3ZWFrSGFzaExlbjMyV2l0aFNlZWRzU3RyKHMsIG9mZnNldCwgdlsxXS5tdWwoazEpLCB4LmFkZCh3WzBdKSk7XG4gICAgICAgIHcgPSB3ZWFrSGFzaExlbjMyV2l0aFNlZWRzU3RyKHMsIG9mZnNldCArIDMyLCB6LmFkZCh3WzFdKSwgeS5hZGQoZmV0Y2g2NChzLCBvZmZzZXQgKyAxNikpKTtcbiAgICAgICAgW3osIHhdID0gW3gsIHpdO1xuICAgICAgICBvZmZzZXQgKz0gNjQ7XG4gICAgfSB3aGlsZSAob2Zmc2V0ICE9PSBlbmQpO1xuICAgIGNvbnN0IG11bCA9IGsxLmFkZCh6LmFuZCgweGZmKS5zaGwoMSkpO1xuICAgIC8vIFBvaW50IHRvIHRoZSBsYXN0IDY0IGJ5dGVzIG9mIGlucHV0LlxuICAgIG9mZnNldCA9IGxhc3Q2NDtcbiAgICB3WzBdID0gd1swXS5hZGQoKGxlbiAtIDEpICYgNjMpO1xuICAgIHZbMF0gPSB2WzBdLmFkZCh3WzBdKTtcbiAgICB3WzBdID0gd1swXS5hZGQodlswXSk7XG4gICAgeCA9IHJvdGF0ZTY0KHguYWRkKHkpLmFkZCh2WzBdKS5hZGQoZmV0Y2g2NChzLCBvZmZzZXQgKyA4KSksIDM3KS5tdWwobXVsKTtcbiAgICB5ID0gcm90YXRlNjQoeS5hZGQodlsxXSkuYWRkKGZldGNoNjQocywgb2Zmc2V0ICsgNDgpKSwgNDIpLm11bChtdWwpO1xuICAgIHggPSB4Lnhvcih3WzFdLm11bCg5KSk7XG4gICAgeSA9IHkuYWRkKHZbMF0ubXVsKDkpLmFkZChmZXRjaDY0KHMsIG9mZnNldCArIDQwKSkpO1xuICAgIHogPSByb3RhdGU2NCh6LmFkZCh3WzBdKSwgMzMpLm11bChtdWwpO1xuICAgIHYgPSB3ZWFrSGFzaExlbjMyV2l0aFNlZWRzU3RyKHMsIG9mZnNldCwgdlsxXS5tdWwobXVsKSwgeC5hZGQod1swXSkpO1xuICAgIHcgPSB3ZWFrSGFzaExlbjMyV2l0aFNlZWRzU3RyKHMsIG9mZnNldCArIDMyLCB6LmFkZCh3WzFdKSwgeS5hZGQoZmV0Y2g2NChzLCBvZmZzZXQgKyAxNikpKTtcbiAgICBbeiwgeF0gPSBbeCwgel07XG4gICAgcmV0dXJuIGhhc2hMZW4xNihoYXNoTGVuMTYodlswXSwgd1swXSwgbXVsKS5hZGQoc2hpZnRNaXgoeSkubXVsKGswKSkuYWRkKHopLCBoYXNoTGVuMTYodlsxXSwgd1sxXSwgbXVsKS5hZGQoeCksIG11bCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1oYXNoX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLy8gUmVxdWlyZWQgc2lkZSBlZmZlY3RmdWwgY29kZS5cbmltcG9ydCAnLi9iYXNlX3NpZGVfZWZmZWN0cyc7XG4vLyBBbGwgZXhwb3J0cyBmcm9tIHRoaXMgcGFja2FnZSBzaG91bGQgYmUgaW4gYmFzZS5cbmV4cG9ydCAqIGZyb20gJy4vYmFzZSc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vKipcbiAqIElPSGFuZGxlcnMgcmVsYXRlZCB0byBmaWxlcywgc3VjaCBhcyBicm93c2VyLXRyaWdnZXJlZCBmaWxlIGRvd25sb2FkcyxcbiAqIHVzZXItc2VsZWN0ZWQgZmlsZXMgaW4gYnJvd3Nlci5cbiAqL1xuaW1wb3J0ICcuLi9mbGFncyc7XG5pbXBvcnQgeyBlbnYgfSBmcm9tICcuLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBiYXNlbmFtZSwgY29uY2F0ZW5hdGVBcnJheUJ1ZmZlcnMsIGdldE1vZGVsQXJ0aWZhY3RzRm9ySlNPTiwgZ2V0TW9kZWxBcnRpZmFjdHNJbmZvRm9ySlNPTiwgZ2V0TW9kZWxKU09ORm9yTW9kZWxBcnRpZmFjdHMgfSBmcm9tICcuL2lvX3V0aWxzJztcbmltcG9ydCB7IElPUm91dGVyUmVnaXN0cnkgfSBmcm9tICcuL3JvdXRlcl9yZWdpc3RyeSc7XG5jb25zdCBERUZBVUxUX0ZJTEVfTkFNRV9QUkVGSVggPSAnbW9kZWwnO1xuY29uc3QgREVGQVVMVF9KU09OX0VYVEVOU0lPTl9OQU1FID0gJy5qc29uJztcbmNvbnN0IERFRkFVTFRfV0VJR0hUX0RBVEFfRVhURU5TSU9OX05BTUUgPSAnLndlaWdodHMuYmluJztcbmZ1bmN0aW9uIGRlZmVyKGYpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUpKS50aGVuKGYpO1xufVxuZXhwb3J0IGNsYXNzIEJyb3dzZXJEb3dubG9hZHMge1xuICAgIGNvbnN0cnVjdG9yKGZpbGVOYW1lUHJlZml4KSB7XG4gICAgICAgIGlmICghZW52KCkuZ2V0Qm9vbCgnSVNfQlJPV1NFUicpKSB7XG4gICAgICAgICAgICAvLyBUT0RPKGNhaXMpOiBQcm92aWRlIGluZm8gb24gd2hhdCBJT0hhbmRsZXJzIGFyZSBhdmFpbGFibGUgdW5kZXIgdGhlXG4gICAgICAgICAgICAvLyAgIGN1cnJlbnQgZW52aXJvbm1lbnQuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Jyb3dzZXJEb3dubG9hZHMoKSBjYW5ub3QgcHJvY2VlZCBiZWNhdXNlIHRoZSBjdXJyZW50IGVudmlyb25tZW50ICcgK1xuICAgICAgICAgICAgICAgICdpcyBub3QgYSBicm93c2VyLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWxlTmFtZVByZWZpeC5zdGFydHNXaXRoKEJyb3dzZXJEb3dubG9hZHMuVVJMX1NDSEVNRSkpIHtcbiAgICAgICAgICAgIGZpbGVOYW1lUHJlZml4ID0gZmlsZU5hbWVQcmVmaXguc2xpY2UoQnJvd3NlckRvd25sb2Fkcy5VUkxfU0NIRU1FLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbGVOYW1lUHJlZml4ID09IG51bGwgfHwgZmlsZU5hbWVQcmVmaXgubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBmaWxlTmFtZVByZWZpeCA9IERFRkFVTFRfRklMRV9OQU1FX1BSRUZJWDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1vZGVsSnNvbkZpbGVOYW1lID0gZmlsZU5hbWVQcmVmaXggKyBERUZBVUxUX0pTT05fRVhURU5TSU9OX05BTUU7XG4gICAgICAgIHRoaXMud2VpZ2h0RGF0YUZpbGVOYW1lID1cbiAgICAgICAgICAgIGZpbGVOYW1lUHJlZml4ICsgREVGQVVMVF9XRUlHSFRfREFUQV9FWFRFTlNJT05fTkFNRTtcbiAgICB9XG4gICAgYXN5bmMgc2F2ZShtb2RlbEFydGlmYWN0cykge1xuICAgICAgICBpZiAodHlwZW9mIChkb2N1bWVudCkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Jyb3dzZXIgZG93bmxvYWRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICcgK1xuICAgICAgICAgICAgICAgICd0aGlzIGVudmlyb25tZW50IHNpbmNlIGBkb2N1bWVudGAgaXMgbm90IHByZXNlbnQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB3ZWlnaHRzVVJMID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW21vZGVsQXJ0aWZhY3RzLndlaWdodERhdGFdLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nIH0pKTtcbiAgICAgICAgaWYgKG1vZGVsQXJ0aWZhY3RzLm1vZGVsVG9wb2xvZ3kgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCcm93c2VyRG93bmxvYWRzLnNhdmUoKSBkb2VzIG5vdCBzdXBwb3J0IHNhdmluZyBtb2RlbCB0b3BvbG9neSAnICtcbiAgICAgICAgICAgICAgICAnaW4gYmluYXJ5IGZvcm1hdHMgeWV0LicpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgd2VpZ2h0c01hbmlmZXN0ID0gW3tcbiAgICAgICAgICAgICAgICAgICAgcGF0aHM6IFsnLi8nICsgdGhpcy53ZWlnaHREYXRhRmlsZU5hbWVdLFxuICAgICAgICAgICAgICAgICAgICB3ZWlnaHRzOiBtb2RlbEFydGlmYWN0cy53ZWlnaHRTcGVjc1xuICAgICAgICAgICAgICAgIH1dO1xuICAgICAgICAgICAgY29uc3QgbW9kZWxKU09OID0gZ2V0TW9kZWxKU09ORm9yTW9kZWxBcnRpZmFjdHMobW9kZWxBcnRpZmFjdHMsIHdlaWdodHNNYW5pZmVzdCk7XG4gICAgICAgICAgICBjb25zdCBtb2RlbEpzb25VUkwgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkobW9kZWxKU09OKV0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nIH0pKTtcbiAgICAgICAgICAgIC8vIElmIGFuY2hvciBlbGVtZW50cyBhcmUgbm90IHByb3ZpZGVkLCBjcmVhdGUgdGhlbSB3aXRob3V0IGF0dGFjaGluZyB0aGVtXG4gICAgICAgICAgICAvLyB0byBwYXJlbnRzLCBzbyB0aGF0IHRoZSBkb3dubG9hZGVkIGZpbGUgbmFtZXMgY2FuIGJlIGNvbnRyb2xsZWQuXG4gICAgICAgICAgICBjb25zdCBqc29uQW5jaG9yID0gdGhpcy5tb2RlbEpzb25BbmNob3IgPT0gbnVsbCA/XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpIDpcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsSnNvbkFuY2hvcjtcbiAgICAgICAgICAgIGpzb25BbmNob3IuZG93bmxvYWQgPSB0aGlzLm1vZGVsSnNvbkZpbGVOYW1lO1xuICAgICAgICAgICAganNvbkFuY2hvci5ocmVmID0gbW9kZWxKc29uVVJMO1xuICAgICAgICAgICAgLy8gVHJpZ2dlciBkb3dubG9hZHMgYnkgZXZva2luZyBhIGNsaWNrIGV2ZW50IG9uIHRoZSBkb3dubG9hZCBhbmNob3JzLlxuICAgICAgICAgICAgLy8gV2hlbiBtdWx0aXBsZSBkb3dubG9hZHMgYXJlIHN0YXJ0ZWQgc3luY2hyb25vdXNseSwgRmlyZWZveCB3aWxsIG9ubHlcbiAgICAgICAgICAgIC8vIHNhdmUgdGhlIGxhc3Qgb25lLlxuICAgICAgICAgICAgYXdhaXQgZGVmZXIoKCkgPT4ganNvbkFuY2hvci5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KCdjbGljaycpKSk7XG4gICAgICAgICAgICBpZiAobW9kZWxBcnRpZmFjdHMud2VpZ2h0RGF0YSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2VpZ2h0RGF0YUFuY2hvciA9IHRoaXMud2VpZ2h0RGF0YUFuY2hvciA9PSBudWxsID9cbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpIDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53ZWlnaHREYXRhQW5jaG9yO1xuICAgICAgICAgICAgICAgIHdlaWdodERhdGFBbmNob3IuZG93bmxvYWQgPSB0aGlzLndlaWdodERhdGFGaWxlTmFtZTtcbiAgICAgICAgICAgICAgICB3ZWlnaHREYXRhQW5jaG9yLmhyZWYgPSB3ZWlnaHRzVVJMO1xuICAgICAgICAgICAgICAgIGF3YWl0IGRlZmVyKCgpID0+IHdlaWdodERhdGFBbmNob3IuZGlzcGF0Y2hFdmVudChuZXcgTW91c2VFdmVudCgnY2xpY2snKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgbW9kZWxBcnRpZmFjdHNJbmZvOiBnZXRNb2RlbEFydGlmYWN0c0luZm9Gb3JKU09OKG1vZGVsQXJ0aWZhY3RzKSB9O1xuICAgICAgICB9XG4gICAgfVxufVxuQnJvd3NlckRvd25sb2Fkcy5VUkxfU0NIRU1FID0gJ2Rvd25sb2FkczovLyc7XG5jbGFzcyBCcm93c2VyRmlsZXMge1xuICAgIGNvbnN0cnVjdG9yKGZpbGVzKSB7XG4gICAgICAgIGlmIChmaWxlcyA9PSBudWxsIHx8IGZpbGVzLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgV2hlbiBjYWxsaW5nIGJyb3dzZXJGaWxlcywgYXQgbGVhc3QgMSBmaWxlIGlzIHJlcXVpcmVkLCBgICtcbiAgICAgICAgICAgICAgICBgYnV0IHJlY2VpdmVkICR7ZmlsZXN9YCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5qc29uRmlsZSA9IGZpbGVzWzBdO1xuICAgICAgICB0aGlzLndlaWdodHNGaWxlcyA9IGZpbGVzLnNsaWNlKDEpO1xuICAgIH1cbiAgICBhc3luYyBsb2FkKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QganNvblJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgICAgICBqc29uUmVhZGVyLm9ubG9hZCA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICAgICAgICAgICAgICBjb25zdCBtb2RlbEpTT04gPSBKU09OLnBhcnNlKGV2ZW50LnRhcmdldC5yZXN1bHQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1vZGVsVG9wb2xvZ3kgPSBtb2RlbEpTT04ubW9kZWxUb3BvbG9neTtcbiAgICAgICAgICAgICAgICBpZiAobW9kZWxUb3BvbG9neSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYG1vZGVsVG9wb2xvZ3kgZmllbGQgaXMgbWlzc2luZyBmcm9tIGZpbGUgJHt0aGlzLmpzb25GaWxlLm5hbWV9YCkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHdlaWdodHNNYW5pZmVzdCA9IG1vZGVsSlNPTi53ZWlnaHRzTWFuaWZlc3Q7XG4gICAgICAgICAgICAgICAgaWYgKHdlaWdodHNNYW5pZmVzdCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYHdlaWdodE1hbmlmZXN0IGZpZWxkIGlzIG1pc3NpbmcgZnJvbSBmaWxlICR7dGhpcy5qc29uRmlsZS5uYW1lfWApKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy53ZWlnaHRzRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoeyBtb2RlbFRvcG9sb2d5IH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG1vZGVsQXJ0aWZhY3RzUHJvbWlzZSA9IGdldE1vZGVsQXJ0aWZhY3RzRm9ySlNPTihtb2RlbEpTT04sICh3ZWlnaHRzTWFuaWZlc3QpID0+IHRoaXMubG9hZFdlaWdodHMod2VpZ2h0c01hbmlmZXN0KSk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShtb2RlbEFydGlmYWN0c1Byb21pc2UpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGpzb25SZWFkZXIub25lcnJvciA9IGVycm9yID0+IHJlamVjdChgRmFpbGVkIHRvIHJlYWQgbW9kZWwgdG9wb2xvZ3kgYW5kIHdlaWdodHMgbWFuaWZlc3QgSlNPTiBgICtcbiAgICAgICAgICAgICAgICBgZnJvbSBmaWxlICcke3RoaXMuanNvbkZpbGUubmFtZX0nLiBCcm93c2VyRmlsZXMgc3VwcG9ydHMgbG9hZGluZyBgICtcbiAgICAgICAgICAgICAgICBgS2VyYXMtc3R5bGUgdGYuTW9kZWwgYXJ0aWZhY3RzIG9ubHkuYCk7XG4gICAgICAgICAgICBqc29uUmVhZGVyLnJlYWRBc1RleHQodGhpcy5qc29uRmlsZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBsb2FkV2VpZ2h0cyh3ZWlnaHRzTWFuaWZlc3QpIHtcbiAgICAgICAgY29uc3Qgd2VpZ2h0U3BlY3MgPSBbXTtcbiAgICAgICAgY29uc3QgcGF0aHMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiB3ZWlnaHRzTWFuaWZlc3QpIHtcbiAgICAgICAgICAgIHdlaWdodFNwZWNzLnB1c2goLi4uZW50cnkud2VpZ2h0cyk7XG4gICAgICAgICAgICBwYXRocy5wdXNoKC4uLmVudHJ5LnBhdGhzKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXRoVG9GaWxlID0gdGhpcy5jaGVja01hbmlmZXN0QW5kV2VpZ2h0RmlsZXMod2VpZ2h0c01hbmlmZXN0KTtcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBwYXRocy5tYXAocGF0aCA9PiB0aGlzLmxvYWRXZWlnaHRzRmlsZShwYXRoLCBwYXRoVG9GaWxlW3BhdGhdKSk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbihidWZmZXJzID0+IFt3ZWlnaHRTcGVjcywgY29uY2F0ZW5hdGVBcnJheUJ1ZmZlcnMoYnVmZmVycyldKTtcbiAgICB9XG4gICAgbG9hZFdlaWdodHNGaWxlKHBhdGgsIGZpbGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHdlaWdodEZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICAgICAgd2VpZ2h0RmlsZVJlYWRlci5vbmxvYWQgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgICAgICAgICAgICAgY29uc3Qgd2VpZ2h0RGF0YSA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh3ZWlnaHREYXRhKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB3ZWlnaHRGaWxlUmVhZGVyLm9uZXJyb3IgPSBlcnJvciA9PiByZWplY3QoYEZhaWxlZCB0byB3ZWlnaHRzIGRhdGEgZnJvbSBmaWxlIG9mIHBhdGggJyR7cGF0aH0nLmApO1xuICAgICAgICAgICAgd2VpZ2h0RmlsZVJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihmaWxlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrIHRoZSBjb21wYXRpYmlsaXR5IGJldHdlZW4gd2VpZ2h0cyBtYW5pZmVzdCBhbmQgd2VpZ2h0IGZpbGVzLlxuICAgICAqL1xuICAgIGNoZWNrTWFuaWZlc3RBbmRXZWlnaHRGaWxlcyhtYW5pZmVzdCkge1xuICAgICAgICBjb25zdCBiYXNlbmFtZXMgPSBbXTtcbiAgICAgICAgY29uc3QgZmlsZU5hbWVzID0gdGhpcy53ZWlnaHRzRmlsZXMubWFwKGZpbGUgPT4gYmFzZW5hbWUoZmlsZS5uYW1lKSk7XG4gICAgICAgIGNvbnN0IHBhdGhUb0ZpbGUgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBncm91cCBvZiBtYW5pZmVzdCkge1xuICAgICAgICAgICAgZ3JvdXAucGF0aHMuZm9yRWFjaChwYXRoID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRoQmFzZW5hbWUgPSBiYXNlbmFtZShwYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoYmFzZW5hbWVzLmluZGV4T2YocGF0aEJhc2VuYW1lKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEdXBsaWNhdGUgZmlsZSBiYXNlbmFtZSBmb3VuZCBpbiB3ZWlnaHRzIG1hbmlmZXN0OiBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAnJHtwYXRoQmFzZW5hbWV9J2ApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBiYXNlbmFtZXMucHVzaChwYXRoQmFzZW5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChmaWxlTmFtZXMuaW5kZXhPZihwYXRoQmFzZW5hbWUpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFdlaWdodCBmaWxlIHdpdGggYmFzZW5hbWUgJyR7cGF0aEJhc2VuYW1lfScgaXMgbm90IHByb3ZpZGVkLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcGF0aFRvRmlsZVtwYXRoXSA9IHRoaXMud2VpZ2h0c0ZpbGVzW2ZpbGVOYW1lcy5pbmRleE9mKHBhdGhCYXNlbmFtZSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiYXNlbmFtZXMubGVuZ3RoICE9PSB0aGlzLndlaWdodHNGaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzbWF0Y2ggaW4gdGhlIG51bWJlciBvZiBmaWxlcyBpbiB3ZWlnaHRzIG1hbmlmZXN0IGAgK1xuICAgICAgICAgICAgICAgIGAoJHtiYXNlbmFtZXMubGVuZ3RofSkgYW5kIHRoZSBudW1iZXIgb2Ygd2VpZ2h0IGZpbGVzIHByb3ZpZGVkIGAgK1xuICAgICAgICAgICAgICAgIGAoJHt0aGlzLndlaWdodHNGaWxlcy5sZW5ndGh9KS5gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF0aFRvRmlsZTtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgYnJvd3NlckRvd25sb2Fkc1JvdXRlciA9ICh1cmwpID0+IHtcbiAgICBpZiAoIWVudigpLmdldEJvb2woJ0lTX0JST1dTRVInKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh1cmwpICYmIHVybC5zdGFydHNXaXRoKEJyb3dzZXJEb3dubG9hZHMuVVJMX1NDSEVNRSkpIHtcbiAgICAgICAgICAgIHJldHVybiBicm93c2VyRG93bmxvYWRzKHVybC5zbGljZShCcm93c2VyRG93bmxvYWRzLlVSTF9TQ0hFTUUubGVuZ3RoKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn07XG5JT1JvdXRlclJlZ2lzdHJ5LnJlZ2lzdGVyU2F2ZVJvdXRlcihicm93c2VyRG93bmxvYWRzUm91dGVyKTtcbi8qKlxuICogQ3JlYXRlcyBhbiBJT0hhbmRsZXIgdGhhdCB0cmlnZ2VycyBmaWxlIGRvd25sb2FkcyBmcm9tIHRoZSBicm93c2VyLlxuICpcbiAqIFRoZSByZXR1cm5lZCBgSU9IYW5kbGVyYCBpbnN0YW5jZSBjYW4gYmUgdXNlZCBhcyBtb2RlbCBleHBvcnRpbmcgbWV0aG9kcyBzdWNoXG4gKiBhcyBgdGYuTW9kZWwuc2F2ZWAgYW5kIHN1cHBvcnRzIG9ubHkgc2F2aW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtb2RlbCA9IHRmLnNlcXVlbnRpYWwoKTtcbiAqIG1vZGVsLmFkZCh0Zi5sYXllcnMuZGVuc2UoXG4gKiAgICAge3VuaXRzOiAxLCBpbnB1dFNoYXBlOiBbMTBdLCBhY3RpdmF0aW9uOiAnc2lnbW9pZCd9KSk7XG4gKiBjb25zdCBzYXZlUmVzdWx0ID0gYXdhaXQgbW9kZWwuc2F2ZSgnZG93bmxvYWRzOi8vbXltb2RlbCcpO1xuICogLy8gVGhpcyB3aWxsIHRyaWdnZXIgZG93bmxvYWRpbmcgb2YgdHdvIGZpbGVzOlxuICogLy8gICAnbXltb2RlbC5qc29uJyBhbmQgJ215bW9kZWwud2VpZ2h0cy5iaW4nLlxuICogY29uc29sZS5sb2coc2F2ZVJlc3VsdCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gZmlsZU5hbWVQcmVmaXggUHJlZml4IG5hbWUgb2YgdGhlIGZpbGVzIHRvIGJlIGRvd25sb2FkZWQuIEZvciB1c2Ugd2l0aFxuICogICBgdGYuTW9kZWxgLCBgZmlsZU5hbWVQcmVmaXhgIHNob3VsZCBmb2xsb3cgZWl0aGVyIG9mIHRoZSBmb2xsb3dpbmcgdHdvXG4gKiAgIGZvcm1hdHM6XG4gKiAgIDEuIGBudWxsYCBvciBgdW5kZWZpbmVkYCwgaW4gd2hpY2ggY2FzZSB0aGUgZGVmYXVsdCBmaWxlXG4gKiAgICAgIG5hbWVzIHdpbGwgYmUgdXNlZDpcbiAqICAgICAgLSAnbW9kZWwuanNvbicgZm9yIHRoZSBKU09OIGZpbGUgY29udGFpbmluZyB0aGUgbW9kZWwgdG9wb2xvZ3kgYW5kXG4gKiAgICAgICAgd2VpZ2h0cyBtYW5pZmVzdC5cbiAqICAgICAgLSAnbW9kZWwud2VpZ2h0cy5iaW4nIGZvciB0aGUgYmluYXJ5IGZpbGUgY29udGFpbmluZyB0aGUgYmluYXJ5IHdlaWdodFxuICogICAgICAgIHZhbHVlcy5cbiAqICAgMi4gQSBzaW5nbGUgc3RyaW5nIG9yIGFuIEFycmF5IG9mIGEgc2luZ2xlIHN0cmluZywgYXMgdGhlIGZpbGUgbmFtZSBwcmVmaXguXG4gKiAgICAgIEZvciBleGFtcGxlLCBpZiBgJ2ZvbydgIGlzIHByb3ZpZGVkLCB0aGUgZG93bmxvYWRlZCBKU09OXG4gKiAgICAgIGZpbGUgYW5kIGJpbmFyeSB3ZWlnaHRzIGZpbGUgd2lsbCBiZSBuYW1lZCAnZm9vLmpzb24nIGFuZFxuICogICAgICAnZm9vLndlaWdodHMuYmluJywgcmVzcGVjdGl2ZWx5LlxuICogQHBhcmFtIGNvbmZpZyBBZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gZm9yIHRyaWdnZXJpbmcgZG93bmxvYWRzLlxuICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgYEJyb3dzZXJEb3dubG9hZHNgIGBJT0hhbmRsZXJgLlxuICpcbiAqIEBkb2Mge1xuICogICBoZWFkaW5nOiAnTW9kZWxzJyxcbiAqICAgc3ViaGVhZGluZzogJ0xvYWRpbmcnLFxuICogICBuYW1lc3BhY2U6ICdpbycsXG4gKiAgIGlnbm9yZUNJOiB0cnVlXG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBicm93c2VyRG93bmxvYWRzKGZpbGVOYW1lUHJlZml4ID0gJ21vZGVsJykge1xuICAgIHJldHVybiBuZXcgQnJvd3NlckRvd25sb2FkcyhmaWxlTmFtZVByZWZpeCk7XG59XG4vKipcbiAqIENyZWF0ZXMgYW4gSU9IYW5kbGVyIHRoYXQgbG9hZHMgbW9kZWwgYXJ0aWZhY3RzIGZyb20gdXNlci1zZWxlY3RlZCBmaWxlcy5cbiAqXG4gKiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCBmb3IgbG9hZGluZyBmcm9tIGZpbGVzIHN1Y2ggYXMgdXNlci1zZWxlY3RlZCBmaWxlc1xuICogaW4gdGhlIGJyb3dzZXIuXG4gKiBXaGVuIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBgdGYubG9hZExheWVyc01vZGVsYCwgYW4gaW5zdGFuY2Ugb2ZcbiAqIGB0Zi5MYXllcnNNb2RlbGAgKEtlcmFzLXN0eWxlKSBjYW4gYmUgY29uc3RydWN0ZWQgZnJvbSB0aGUgbG9hZGVkIGFydGlmYWN0cy5cbiAqXG4gKiBgYGBqc1xuICogLy8gTm90ZTogVGhpcyBjb2RlIHNuaXBwZXQgd29uJ3QgcnVuIHByb3Blcmx5IHdpdGhvdXQgdGhlIGFjdHVhbCBmaWxlIGlucHV0XG4gKiAvLyAgIGVsZW1lbnRzIGluIHRoZSBIVE1MIERPTS5cbiAqXG4gKiAvLyBTdXBwb3NlIHRoZXJlIGFyZSB0d28gSFRNTCBmaWxlIGlucHV0IChgPGlucHV0IHR5cGU9XCJmaWxlXCIgLi4uPmApXG4gKiAvLyBlbGVtZW50cy5cbiAqIGNvbnN0IHVwbG9hZEpTT05JbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGxvYWQtanNvbicpO1xuICogY29uc3QgdXBsb2FkV2VpZ2h0c0lucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwbG9hZC13ZWlnaHRzJyk7XG4gKiBjb25zdCBtb2RlbCA9IGF3YWl0IHRmLmxvYWRMYXllcnNNb2RlbCh0Zi5pby5icm93c2VyRmlsZXMoXG4gKiAgICAgW3VwbG9hZEpTT05JbnB1dC5maWxlc1swXSwgdXBsb2FkV2VpZ2h0c0lucHV0LmZpbGVzWzBdXSkpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGZpbGVzIGBGaWxlYHMgdG8gbG9hZCBmcm9tLiBDdXJyZW50bHksIHRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgb25seVxuICogICBsb2FkaW5nIGZyb20gZmlsZXMgdGhhdCBjb250YWluIEtlcmFzLXN0eWxlIG1vZGVscyAoaS5lLiwgYHRmLk1vZGVsYHMpLCBmb3JcbiAqICAgd2hpY2ggYW4gYEFycmF5YCBvZiBgRmlsZWBzIGlzIGV4cGVjdGVkIChpbiB0aGF0IG9yZGVyKTpcbiAqICAgLSBBIEpTT04gZmlsZSBjb250YWluaW5nIHRoZSBtb2RlbCB0b3BvbG9neSBhbmQgd2VpZ2h0IG1hbmlmZXN0LlxuICogICAtIE9wdGlvbmFsbHksIE9uZSBvciBtb3JlIGJpbmFyeSBmaWxlcyBjb250YWluaW5nIHRoZSBiaW5hcnkgd2VpZ2h0cy5cbiAqICAgICBUaGVzZSBmaWxlcyBtdXN0IGhhdmUgbmFtZXMgdGhhdCBtYXRjaCB0aGUgcGF0aHMgaW4gdGhlIGB3ZWlnaHRzTWFuaWZlc3RgXG4gKiAgICAgY29udGFpbmVkIGJ5IHRoZSBhZm9yZW1lbnRpb25lZCBKU09OIGZpbGUsIG9yIGVycm9ycyB3aWxsIGJlIHRocm93blxuICogICAgIGR1cmluZyBsb2FkaW5nLiBUaGVzZSB3ZWlnaHRzIGZpbGVzIGhhdmUgdGhlIHNhbWUgZm9ybWF0IGFzIHRoZSBvbmVzXG4gKiAgICAgZ2VuZXJhdGVkIGJ5IGB0ZW5zb3JmbG93anNfY29udmVydGVyYCB0aGF0IGNvbWVzIHdpdGggdGhlIGB0ZW5zb3JmbG93anNgXG4gKiAgICAgUHl0aG9uIFBJUCBwYWNrYWdlLiBJZiBubyB3ZWlnaHRzIGZpbGVzIGFyZSBwcm92aWRlZCwgb25seSB0aGUgbW9kZWxcbiAqICAgICB0b3BvbG9neSB3aWxsIGJlIGxvYWRlZCBmcm9tIHRoZSBKU09OIGZpbGUgYWJvdmUuXG4gKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiBgRmlsZXNgIGBJT0hhbmRsZXJgLlxuICpcbiAqIEBkb2Mge1xuICogICBoZWFkaW5nOiAnTW9kZWxzJyxcbiAqICAgc3ViaGVhZGluZzogJ0xvYWRpbmcnLFxuICogICBuYW1lc3BhY2U6ICdpbycsXG4gKiAgIGlnbm9yZUNJOiB0cnVlXG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBicm93c2VyRmlsZXMoZmlsZXMpIHtcbiAgICByZXR1cm4gbmV3IEJyb3dzZXJGaWxlcyhmaWxlcyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1icm93c2VyX2ZpbGVzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qKlxuICogSU9IYW5kbGVyIGltcGxlbWVudGF0aW9ucyBiYXNlZCBvbiBIVFRQIHJlcXVlc3RzIGluIHRoZSB3ZWIgYnJvd3Nlci5cbiAqXG4gKiBVc2VzIFtgZmV0Y2hgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRmV0Y2hfQVBJKS5cbiAqL1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi4vZW52aXJvbm1lbnQnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBjb25jYXRlbmF0ZUFycmF5QnVmZmVycywgZ2V0TW9kZWxBcnRpZmFjdHNGb3JKU09OLCBnZXRNb2RlbEFydGlmYWN0c0luZm9Gb3JKU09OLCBnZXRNb2RlbEpTT05Gb3JNb2RlbEFydGlmYWN0cyB9IGZyb20gJy4vaW9fdXRpbHMnO1xuaW1wb3J0IHsgSU9Sb3V0ZXJSZWdpc3RyeSB9IGZyb20gJy4vcm91dGVyX3JlZ2lzdHJ5JztcbmltcG9ydCB7IGxvYWRXZWlnaHRzQXNBcnJheUJ1ZmZlciB9IGZyb20gJy4vd2VpZ2h0c19sb2FkZXInO1xuY29uc3QgT0NURVRfU1RSRUFNX01JTUVfVFlQRSA9ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nO1xuY29uc3QgSlNPTl9UWVBFID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuZXhwb3J0IGNsYXNzIEhUVFBSZXF1ZXN0IHtcbiAgICBjb25zdHJ1Y3RvcihwYXRoLCBsb2FkT3B0aW9ucykge1xuICAgICAgICB0aGlzLkRFRkFVTFRfTUVUSE9EID0gJ1BPU1QnO1xuICAgICAgICBpZiAobG9hZE9wdGlvbnMgPT0gbnVsbCkge1xuICAgICAgICAgICAgbG9hZE9wdGlvbnMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndlaWdodFBhdGhQcmVmaXggPSBsb2FkT3B0aW9ucy53ZWlnaHRQYXRoUHJlZml4O1xuICAgICAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBsb2FkT3B0aW9ucy5vblByb2dyZXNzO1xuICAgICAgICB0aGlzLndlaWdodFVybENvbnZlcnRlciA9IGxvYWRPcHRpb25zLndlaWdodFVybENvbnZlcnRlcjtcbiAgICAgICAgaWYgKGxvYWRPcHRpb25zLmZldGNoRnVuYyAhPSBudWxsKSB7XG4gICAgICAgICAgICBhc3NlcnQodHlwZW9mIGxvYWRPcHRpb25zLmZldGNoRnVuYyA9PT0gJ2Z1bmN0aW9uJywgKCkgPT4gJ011c3QgcGFzcyBhIGZ1bmN0aW9uIHRoYXQgbWF0Y2hlcyB0aGUgc2lnbmF0dXJlIG9mICcgK1xuICAgICAgICAgICAgICAgICdgZmV0Y2hgIChzZWUgJyArXG4gICAgICAgICAgICAgICAgJ2h0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GZXRjaF9BUEkpJyk7XG4gICAgICAgICAgICB0aGlzLmZldGNoID0gbG9hZE9wdGlvbnMuZmV0Y2hGdW5jO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5mZXRjaCA9IGVudigpLnBsYXRmb3JtLmZldGNoO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydChwYXRoICE9IG51bGwgJiYgcGF0aC5sZW5ndGggPiAwLCAoKSA9PiAnVVJMIHBhdGggZm9yIGh0dHAgbXVzdCBub3QgYmUgbnVsbCwgdW5kZWZpbmVkIG9yICcgK1xuICAgICAgICAgICAgJ2VtcHR5LicpO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXRoKSkge1xuICAgICAgICAgICAgYXNzZXJ0KHBhdGgubGVuZ3RoID09PSAyLCAoKSA9PiAnVVJMIHBhdGhzIGZvciBodHRwIG11c3QgaGF2ZSBhIGxlbmd0aCBvZiAyLCAnICtcbiAgICAgICAgICAgICAgICBgKGFjdHVhbCBsZW5ndGggaXMgJHtwYXRoLmxlbmd0aH0pLmApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgICAgIGlmIChsb2FkT3B0aW9ucy5yZXF1ZXN0SW5pdCAhPSBudWxsICYmXG4gICAgICAgICAgICBsb2FkT3B0aW9ucy5yZXF1ZXN0SW5pdC5ib2R5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWVzdEluaXQgaXMgZXhwZWN0ZWQgdG8gaGF2ZSBubyBwcmUtZXhpc3RpbmcgYm9keSwgYnV0IGhhcyBvbmUuJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXF1ZXN0SW5pdCA9IGxvYWRPcHRpb25zLnJlcXVlc3RJbml0IHx8IHt9O1xuICAgIH1cbiAgICBhc3luYyBzYXZlKG1vZGVsQXJ0aWZhY3RzKSB7XG4gICAgICAgIGlmIChtb2RlbEFydGlmYWN0cy5tb2RlbFRvcG9sb2d5IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnJvd3NlckhUVFBSZXF1ZXN0LnNhdmUoKSBkb2VzIG5vdCBzdXBwb3J0IHNhdmluZyBtb2RlbCB0b3BvbG9neSAnICtcbiAgICAgICAgICAgICAgICAnaW4gYmluYXJ5IGZvcm1hdHMgeWV0LicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluaXQgPSBPYmplY3QuYXNzaWduKHsgbWV0aG9kOiB0aGlzLkRFRkFVTFRfTUVUSE9EIH0sIHRoaXMucmVxdWVzdEluaXQpO1xuICAgICAgICBpbml0LmJvZHkgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgY29uc3Qgd2VpZ2h0c01hbmlmZXN0ID0gW3tcbiAgICAgICAgICAgICAgICBwYXRoczogWycuL21vZGVsLndlaWdodHMuYmluJ10sXG4gICAgICAgICAgICAgICAgd2VpZ2h0czogbW9kZWxBcnRpZmFjdHMud2VpZ2h0U3BlY3MsXG4gICAgICAgICAgICB9XTtcbiAgICAgICAgY29uc3QgbW9kZWxUb3BvbG9neUFuZFdlaWdodE1hbmlmZXN0ID0gZ2V0TW9kZWxKU09ORm9yTW9kZWxBcnRpZmFjdHMobW9kZWxBcnRpZmFjdHMsIHdlaWdodHNNYW5pZmVzdCk7XG4gICAgICAgIGluaXQuYm9keS5hcHBlbmQoJ21vZGVsLmpzb24nLCBuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkobW9kZWxUb3BvbG9neUFuZFdlaWdodE1hbmlmZXN0KV0sIHsgdHlwZTogSlNPTl9UWVBFIH0pLCAnbW9kZWwuanNvbicpO1xuICAgICAgICBpZiAobW9kZWxBcnRpZmFjdHMud2VpZ2h0RGF0YSAhPSBudWxsKSB7XG4gICAgICAgICAgICBpbml0LmJvZHkuYXBwZW5kKCdtb2RlbC53ZWlnaHRzLmJpbicsIG5ldyBCbG9iKFttb2RlbEFydGlmYWN0cy53ZWlnaHREYXRhXSwgeyB0eXBlOiBPQ1RFVF9TVFJFQU1fTUlNRV9UWVBFIH0pLCAnbW9kZWwud2VpZ2h0cy5iaW4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZmV0Y2godGhpcy5wYXRoLCBpbml0KTtcbiAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG1vZGVsQXJ0aWZhY3RzSW5mbzogZ2V0TW9kZWxBcnRpZmFjdHNJbmZvRm9ySlNPTihtb2RlbEFydGlmYWN0cyksXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VzOiBbcmVzcG9uc2VdLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQnJvd3NlckhUVFBSZXF1ZXN0LnNhdmUoKSBmYWlsZWQgZHVlIHRvIEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGAgK1xuICAgICAgICAgICAgICAgIGAke3Jlc3BvbnNlLnN0YXR1c30uYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogTG9hZCBtb2RlbCBhcnRpZmFjdHMgdmlhIEhUVFAgcmVxdWVzdChzKS5cbiAgICAgKlxuICAgICAqIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiB0byBgdGYuaW8uaHR0cGAgZm9yIGRldGFpbHMgb24gdGhlIHNhdmVkXG4gICAgICogYXJ0aWZhY3RzLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIGxvYWRlZCBtb2RlbCBhcnRpZmFjdHMgKGlmIGxvYWRpbmcgc3VjY2VlZHMpLlxuICAgICAqL1xuICAgIGFzeW5jIGxvYWQoKSB7XG4gICAgICAgIGNvbnN0IG1vZGVsQ29uZmlnUmVxdWVzdCA9IGF3YWl0IHRoaXMuZmV0Y2godGhpcy5wYXRoLCB0aGlzLnJlcXVlc3RJbml0KTtcbiAgICAgICAgaWYgKCFtb2RlbENvbmZpZ1JlcXVlc3Qub2spIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVxdWVzdCB0byAke3RoaXMucGF0aH0gZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgYCArXG4gICAgICAgICAgICAgICAgYCR7bW9kZWxDb25maWdSZXF1ZXN0LnN0YXR1c30uIFBsZWFzZSB2ZXJpZnkgdGhpcyBVUkwgcG9pbnRzIHRvIGAgK1xuICAgICAgICAgICAgICAgIGB0aGUgbW9kZWwgSlNPTiBvZiB0aGUgbW9kZWwgdG8gbG9hZC5gKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbW9kZWxKU09OO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbW9kZWxKU09OID0gYXdhaXQgbW9kZWxDb25maWdSZXF1ZXN0Lmpzb24oKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBgRmFpbGVkIHRvIHBhcnNlIG1vZGVsIEpTT04gb2YgcmVzcG9uc2UgZnJvbSAke3RoaXMucGF0aH0uYDtcbiAgICAgICAgICAgIC8vIFRPRE8obnN0aG9yYXQpOiBSZW1vdmUgdGhpcyBhZnRlciBzb21lIHRpbWUgd2hlbiB3ZSdyZSBjb21mb3J0YWJsZSB0aGF0XG4gICAgICAgICAgICAvLyAucGIgZmlsZXMgYXJlIG1vc3RseSBnb25lLlxuICAgICAgICAgICAgaWYgKHRoaXMucGF0aC5lbmRzV2l0aCgnLnBiJykpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlICs9ICcgWW91ciBwYXRoIGNvbnRhaW5zIGEgLnBiIGZpbGUgZXh0ZW5zaW9uLiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ1N1cHBvcnQgZm9yIC5wYiBtb2RlbHMgaGF2ZSBiZWVuIHJlbW92ZWQgaW4gVGVuc29yRmxvdy5qcyAxLjAgJyArXG4gICAgICAgICAgICAgICAgICAgICdpbiBmYXZvciBvZiAuanNvbiBtb2RlbHMuIFlvdSBjYW4gcmUtY29udmVydCB5b3VyIFB5dGhvbiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ1RlbnNvckZsb3cgbW9kZWwgdXNpbmcgdGhlIFRlbnNvckZsb3cuanMgMS4wIGNvbnZlcnNpb24gc2NyaXB0cyAnICtcbiAgICAgICAgICAgICAgICAgICAgJ29yIHlvdSBjYW4gY29udmVydCB5b3VyLnBiIG1vZGVscyB3aXRoIHRoZSBcXCdwYjJqc29uXFwnJyArXG4gICAgICAgICAgICAgICAgICAgICdOUE0gc2NyaXB0IGluIHRoZSB0ZW5zb3JmbG93L3RmanMtY29udmVydGVyIHJlcG9zaXRvcnkuJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgKz0gJyBQbGVhc2UgbWFrZSBzdXJlIHRoZSBzZXJ2ZXIgaXMgc2VydmluZyB2YWxpZCAnICtcbiAgICAgICAgICAgICAgICAgICAgJ0pTT04gZm9yIHRoaXMgcmVxdWVzdC4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlIGRvIG5vdCBhbGxvdyBib3RoIG1vZGVsVG9wb2xvZ3kgYW5kIHdlaWdodHNNYW5pZmVzdCB0byBiZSBtaXNzaW5nLlxuICAgICAgICBjb25zdCBtb2RlbFRvcG9sb2d5ID0gbW9kZWxKU09OLm1vZGVsVG9wb2xvZ3k7XG4gICAgICAgIGNvbnN0IHdlaWdodHNNYW5pZmVzdCA9IG1vZGVsSlNPTi53ZWlnaHRzTWFuaWZlc3Q7XG4gICAgICAgIGlmIChtb2RlbFRvcG9sb2d5ID09IG51bGwgJiYgd2VpZ2h0c01hbmlmZXN0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIEpTT04gZnJvbSBIVFRQIHBhdGggJHt0aGlzLnBhdGh9IGNvbnRhaW5zIG5laXRoZXIgbW9kZWwgYCArXG4gICAgICAgICAgICAgICAgYHRvcG9sb2d5IG9yIG1hbmlmZXN0IGZvciB3ZWlnaHRzLmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnZXRNb2RlbEFydGlmYWN0c0ZvckpTT04obW9kZWxKU09OLCAod2VpZ2h0c01hbmlmZXN0KSA9PiB0aGlzLmxvYWRXZWlnaHRzKHdlaWdodHNNYW5pZmVzdCkpO1xuICAgIH1cbiAgICBhc3luYyBsb2FkV2VpZ2h0cyh3ZWlnaHRzTWFuaWZlc3QpIHtcbiAgICAgICAgY29uc3Qgd2VpZ2h0UGF0aCA9IEFycmF5LmlzQXJyYXkodGhpcy5wYXRoKSA/IHRoaXMucGF0aFsxXSA6IHRoaXMucGF0aDtcbiAgICAgICAgY29uc3QgW3ByZWZpeCwgc3VmZml4XSA9IHBhcnNlVXJsKHdlaWdodFBhdGgpO1xuICAgICAgICBjb25zdCBwYXRoUHJlZml4ID0gdGhpcy53ZWlnaHRQYXRoUHJlZml4IHx8IHByZWZpeDtcbiAgICAgICAgY29uc3Qgd2VpZ2h0U3BlY3MgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiB3ZWlnaHRzTWFuaWZlc3QpIHtcbiAgICAgICAgICAgIHdlaWdodFNwZWNzLnB1c2goLi4uZW50cnkud2VpZ2h0cyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmV0Y2hVUkxzID0gW107XG4gICAgICAgIGNvbnN0IHVybFByb21pc2VzID0gW107XG4gICAgICAgIGZvciAoY29uc3Qgd2VpZ2h0c0dyb3VwIG9mIHdlaWdodHNNYW5pZmVzdCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwYXRoIG9mIHdlaWdodHNHcm91cC5wYXRocykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLndlaWdodFVybENvbnZlcnRlciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHVybFByb21pc2VzLnB1c2godGhpcy53ZWlnaHRVcmxDb252ZXJ0ZXIocGF0aCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmV0Y2hVUkxzLnB1c2gocGF0aFByZWZpeCArIHBhdGggKyBzdWZmaXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy53ZWlnaHRVcmxDb252ZXJ0ZXIpIHtcbiAgICAgICAgICAgIGZldGNoVVJMcy5wdXNoKC4uLmF3YWl0IFByb21pc2UuYWxsKHVybFByb21pc2VzKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYnVmZmVycyA9IGF3YWl0IGxvYWRXZWlnaHRzQXNBcnJheUJ1ZmZlcihmZXRjaFVSTHMsIHtcbiAgICAgICAgICAgIHJlcXVlc3RJbml0OiB0aGlzLnJlcXVlc3RJbml0LFxuICAgICAgICAgICAgZmV0Y2hGdW5jOiB0aGlzLmZldGNoLFxuICAgICAgICAgICAgb25Qcm9ncmVzczogdGhpcy5vblByb2dyZXNzXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gW3dlaWdodFNwZWNzLCBjb25jYXRlbmF0ZUFycmF5QnVmZmVycyhidWZmZXJzKV07XG4gICAgfVxufVxuSFRUUFJlcXVlc3QuVVJMX1NDSEVNRV9SRUdFWCA9IC9eaHR0cHM/OlxcL1xcLy87XG4vKipcbiAqIEV4dHJhY3QgdGhlIHByZWZpeCBhbmQgc3VmZml4IG9mIHRoZSB1cmwsIHdoZXJlIHRoZSBwcmVmaXggaXMgdGhlIHBhdGggYmVmb3JlXG4gKiB0aGUgbGFzdCBmaWxlLCBhbmQgc3VmZml4IGlzIHRoZSBzZWFyY2ggcGFyYW1zIGFmdGVyIHRoZSBsYXN0IGZpbGUuXG4gKiBgYGBcbiAqIGNvbnN0IHVybCA9ICdodHRwOi8vdGZodWIuZGV2L21vZGVsLzEvdGVuc29yZmxvd2pzX21vZGVsLnBiP3RmanMtZm9ybWF0PWZpbGUnXG4gKiBbcHJlZml4LCBzdWZmaXhdID0gcGFyc2VVcmwodXJsKVxuICogLy8gcHJlZml4ID0gJ2h0dHA6Ly90Zmh1Yi5kZXYvbW9kZWwvMS8nXG4gKiAvLyBzdWZmaXggPSAnP3RmanMtZm9ybWF0PWZpbGUnXG4gKiBgYGBcbiAqIEBwYXJhbSB1cmwgdGhlIG1vZGVsIHVybCB0byBiZSBwYXJzZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVVybCh1cmwpIHtcbiAgICBjb25zdCBsYXN0U2xhc2ggPSB1cmwubGFzdEluZGV4T2YoJy8nKTtcbiAgICBjb25zdCBsYXN0U2VhcmNoUGFyYW0gPSB1cmwubGFzdEluZGV4T2YoJz8nKTtcbiAgICBjb25zdCBwcmVmaXggPSB1cmwuc3Vic3RyaW5nKDAsIGxhc3RTbGFzaCk7XG4gICAgY29uc3Qgc3VmZml4ID0gbGFzdFNlYXJjaFBhcmFtID4gbGFzdFNsYXNoID8gdXJsLnN1YnN0cmluZyhsYXN0U2VhcmNoUGFyYW0pIDogJyc7XG4gICAgcmV0dXJuIFtwcmVmaXggKyAnLycsIHN1ZmZpeF07XG59XG5leHBvcnQgZnVuY3Rpb24gaXNIVFRQU2NoZW1lKHVybCkge1xuICAgIHJldHVybiB1cmwubWF0Y2goSFRUUFJlcXVlc3QuVVJMX1NDSEVNRV9SRUdFWCkgIT0gbnVsbDtcbn1cbmV4cG9ydCBjb25zdCBodHRwUm91dGVyID0gKHVybCwgbG9hZE9wdGlvbnMpID0+IHtcbiAgICBpZiAodHlwZW9mIGZldGNoID09PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAobG9hZE9wdGlvbnMgPT0gbnVsbCB8fCBsb2FkT3B0aW9ucy5mZXRjaEZ1bmMgPT0gbnVsbCkpIHtcbiAgICAgICAgLy8gYGh0dHBgIHVzZXMgYGZldGNoYCBvciBgbm9kZS1mZXRjaGAsIGlmIG9uZSB3YW50cyB0byB1c2UgaXQgaW5cbiAgICAgICAgLy8gYW4gZW52aXJvbm1lbnQgdGhhdCBpcyBub3QgdGhlIGJyb3dzZXIgb3Igbm9kZSB0aGV5IGhhdmUgdG8gc2V0dXAgYVxuICAgICAgICAvLyBnbG9iYWwgZmV0Y2ggcG9seWZpbGwuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IGlzSFRUUCA9IHRydWU7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHVybCkpIHtcbiAgICAgICAgICAgIGlzSFRUUCA9IHVybC5ldmVyeSh1cmxJdGVtID0+IGlzSFRUUFNjaGVtZSh1cmxJdGVtKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpc0hUVFAgPSBpc0hUVFBTY2hlbWUodXJsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNIVFRQKSB7XG4gICAgICAgICAgICByZXR1cm4gaHR0cCh1cmwsIGxvYWRPcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn07XG5JT1JvdXRlclJlZ2lzdHJ5LnJlZ2lzdGVyU2F2ZVJvdXRlcihodHRwUm91dGVyKTtcbklPUm91dGVyUmVnaXN0cnkucmVnaXN0ZXJMb2FkUm91dGVyKGh0dHBSb3V0ZXIpO1xuLyoqXG4gKiBDcmVhdGVzIGFuIElPSGFuZGxlciBzdWJ0eXBlIHRoYXQgc2VuZHMgbW9kZWwgYXJ0aWZhY3RzIHRvIEhUVFAgc2VydmVyLlxuICpcbiAqIEFuIEhUVFAgcmVxdWVzdCBvZiB0aGUgYG11bHRpcGFydC9mb3JtLWRhdGFgIG1pbWUgdHlwZSB3aWxsIGJlIHNlbnQgdG8gdGhlXG4gKiBgcGF0aGAgVVJMLiBUaGUgZm9ybSBkYXRhIGluY2x1ZGVzIGFydGlmYWN0cyB0aGF0IHJlcHJlc2VudCB0aGUgdG9wb2xvZ3lcbiAqIGFuZC9vciB3ZWlnaHRzIG9mIHRoZSBtb2RlbC4gSW4gdGhlIGNhc2Ugb2YgS2VyYXMtc3R5bGUgYHRmLk1vZGVsYCwgdHdvXG4gKiBibG9icyAoZmlsZXMpIGV4aXN0IGluIGZvcm0tZGF0YTpcbiAqICAgLSBBIEpTT04gZmlsZSBjb25zaXN0aW5nIG9mIGBtb2RlbFRvcG9sb2d5YCBhbmQgYHdlaWdodHNNYW5pZmVzdGAuXG4gKiAgIC0gQSBiaW5hcnkgd2VpZ2h0cyBmaWxlIGNvbnNpc3Rpbmcgb2YgdGhlIGNvbmNhdGVuYXRlZCB3ZWlnaHQgdmFsdWVzLlxuICogVGhlc2UgZmlsZXMgYXJlIGluIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgb25lIGdlbmVyYXRlZCBieVxuICogW3RmanNfY29udmVydGVyXShodHRwczovL2pzLnRlbnNvcmZsb3cub3JnL3R1dG9yaWFscy9pbXBvcnQta2VyYXMuaHRtbCkuXG4gKlxuICogVGhlIGZvbGxvd2luZyBjb2RlIHNuaXBwZXQgZXhlbXBsaWZpZXMgdGhlIGNsaWVudC1zaWRlIGNvZGUgdGhhdCB1c2VzIHRoaXNcbiAqIGZ1bmN0aW9uOlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtb2RlbCA9IHRmLnNlcXVlbnRpYWwoKTtcbiAqIG1vZGVsLmFkZChcbiAqICAgICB0Zi5sYXllcnMuZGVuc2Uoe3VuaXRzOiAxLCBpbnB1dFNoYXBlOiBbMTAwXSwgYWN0aXZhdGlvbjogJ3NpZ21vaWQnfSkpO1xuICpcbiAqIGNvbnN0IHNhdmVSZXN1bHQgPSBhd2FpdCBtb2RlbC5zYXZlKHRmLmlvLmh0dHAoXG4gKiAgICAgJ2h0dHA6Ly9tb2RlbC1zZXJ2ZXI6NTAwMC91cGxvYWQnLCB7cmVxdWVzdEluaXQ6IHttZXRob2Q6ICdQVVQnfX0pKTtcbiAqIGNvbnNvbGUubG9nKHNhdmVSZXN1bHQpO1xuICogYGBgXG4gKlxuICogSWYgdGhlIGRlZmF1bHQgYFBPU1RgIG1ldGhvZCBpcyB0byBiZSB1c2VkLCB3aXRob3V0IGFueSBjdXN0b20gcGFyYW1ldGVyc1xuICogc3VjaCBhcyBoZWFkZXJzLCB5b3UgY2FuIHNpbXBseSBwYXNzIGFuIEhUVFAgb3IgSFRUUFMgVVJMIHRvIGBtb2RlbC5zYXZlYDpcbiAqXG4gKiBgYGBqc1xuICogY29uc3Qgc2F2ZVJlc3VsdCA9IGF3YWl0IG1vZGVsLnNhdmUoJ2h0dHA6Ly9tb2RlbC1zZXJ2ZXI6NTAwMC91cGxvYWQnKTtcbiAqIGBgYFxuICpcbiAqIFRoZSBmb2xsb3dpbmcgR2l0SHViIEdpc3RcbiAqIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2RzbWlsa292LzFiNjA0NmZkNjEzMmQ3NDA4ZDUyNTdiMDk3NmY3ODY0XG4gKiBpbXBsZW1lbnRzIGEgc2VydmVyIGJhc2VkIG9uIFtmbGFza10oaHR0cHM6Ly9naXRodWIuY29tL3BhbGxldHMvZmxhc2spIHRoYXRcbiAqIGNhbiByZWNlaXZlIHRoZSByZXF1ZXN0LiBVcG9uIHJlY2VpdmluZyB0aGUgbW9kZWwgYXJ0aWZhY3RzIHZpYSB0aGUgcmVxdXN0LFxuICogdGhpcyBwYXJ0aWN1bGFyIHNlcnZlciByZWNvbnNpc3R1dGVzIGluc3RhbmNlcyBvZiBbS2VyYXNcbiAqIE1vZGVsc10oaHR0cHM6Ly9rZXJhcy5pby9tb2RlbHMvbW9kZWwvKSBpbiBtZW1vcnkuXG4gKlxuICpcbiAqIEBwYXJhbSBwYXRoIEEgVVJMIHBhdGggdG8gdGhlIG1vZGVsLlxuICogICBDYW4gYmUgYW4gYWJzb2x1dGUgSFRUUCBwYXRoIChlLmcuLFxuICogICAnaHR0cDovL2xvY2FsaG9zdDo4MDAwL21vZGVsLXVwbG9hZCknKSBvciBhIHJlbGF0aXZlIHBhdGggKGUuZy4sXG4gKiAgICcuL21vZGVsLXVwbG9hZCcpLlxuICogQHBhcmFtIHJlcXVlc3RJbml0IFJlcXVlc3QgY29uZmlndXJhdGlvbnMgdG8gYmUgdXNlZCB3aGVuIHNlbmRpbmdcbiAqICAgIEhUVFAgcmVxdWVzdCB0byBzZXJ2ZXIgdXNpbmcgYGZldGNoYC4gSXQgY2FuIGNvbnRhaW4gZmllbGRzIHN1Y2ggYXNcbiAqICAgIGBtZXRob2RgLCBgY3JlZGVudGlhbHNgLCBgaGVhZGVyc2AsIGBtb2RlYCwgZXRjLiBTZWVcbiAqICAgIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9SZXF1ZXN0L1JlcXVlc3RcbiAqICAgIGZvciBtb3JlIGluZm9ybWF0aW9uLiBgcmVxdWVzdEluaXRgIG11c3Qgbm90IGhhdmUgYSBib2R5LCBiZWNhdXNlIHRoZVxuICogYm9keSB3aWxsIGJlIHNldCBieSBUZW5zb3JGbG93LmpzLiBGaWxlIGJsb2JzIHJlcHJlc2VudGluZyB0aGUgbW9kZWxcbiAqIHRvcG9sb2d5IChmaWxlbmFtZTogJ21vZGVsLmpzb24nKSBhbmQgdGhlIHdlaWdodHMgb2YgdGhlIG1vZGVsIChmaWxlbmFtZTpcbiAqICdtb2RlbC53ZWlnaHRzLmJpbicpIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGJvZHkuIElmIGByZXF1ZXN0SW5pdGAgaGFzIGFcbiAqIGBib2R5YCwgYW4gRXJyb3Igd2lsbCBiZSB0aHJvd24uXG4gKiBAcGFyYW0gbG9hZE9wdGlvbnMgT3B0aW9uYWwgY29uZmlndXJhdGlvbiBmb3IgdGhlIGxvYWRpbmcuIEl0IGluY2x1ZGVzIHRoZVxuICogICBmb2xsb3dpbmcgZmllbGRzOlxuICogICAtIHdlaWdodFBhdGhQcmVmaXggT3B0aW9uYWwsIHRoaXMgc3BlY2lmaWVzIHRoZSBwYXRoIHByZWZpeCBmb3Igd2VpZ2h0XG4gKiAgICAgZmlsZXMsIGJ5IGRlZmF1bHQgdGhpcyBpcyBjYWxjdWxhdGVkIGZyb20gdGhlIHBhdGggcGFyYW0uXG4gKiAgIC0gZmV0Y2hGdW5jIE9wdGlvbmFsLCBjdXN0b20gYGZldGNoYCBmdW5jdGlvbi4gRS5nLiwgaW4gTm9kZS5qcyxcbiAqICAgICB0aGUgYGZldGNoYCBmcm9tIG5vZGUtZmV0Y2ggY2FuIGJlIHVzZWQgaGVyZS5cbiAqICAgLSBvblByb2dyZXNzIE9wdGlvbmFsLCBwcm9ncmVzcyBjYWxsYmFjayBmdW5jdGlvbiwgZmlyZWQgcGVyaW9kaWNhbGx5XG4gKiAgICAgYmVmb3JlIHRoZSBsb2FkIGlzIGNvbXBsZXRlZC5cbiAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIGBJT0hhbmRsZXJgLlxuICpcbiAqIEBkb2Mge1xuICogICBoZWFkaW5nOiAnTW9kZWxzJyxcbiAqICAgc3ViaGVhZGluZzogJ0xvYWRpbmcnLFxuICogICBuYW1lc3BhY2U6ICdpbycsXG4gKiAgIGlnbm9yZUNJOiB0cnVlXG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBodHRwKHBhdGgsIGxvYWRPcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBIVFRQUmVxdWVzdChwYXRoLCBsb2FkT3B0aW9ucyk7XG59XG4vKipcbiAqIERlcHJlY2F0ZWQuIFVzZSBgdGYuaW8uaHR0cGAuXG4gKiBAcGFyYW0gcGF0aFxuICogQHBhcmFtIGxvYWRPcHRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBicm93c2VySFRUUFJlcXVlc3QocGF0aCwgbG9hZE9wdGlvbnMpIHtcbiAgICByZXR1cm4gaHR0cChwYXRoLCBsb2FkT3B0aW9ucyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1odHRwLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCAnLi4vZmxhZ3MnO1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi4vZW52aXJvbm1lbnQnO1xuaW1wb3J0IHsgZ2V0TW9kZWxBcnRpZmFjdHNJbmZvRm9ySlNPTiB9IGZyb20gJy4vaW9fdXRpbHMnO1xuaW1wb3J0IHsgSU9Sb3V0ZXJSZWdpc3RyeSB9IGZyb20gJy4vcm91dGVyX3JlZ2lzdHJ5JztcbmNvbnN0IERBVEFCQVNFX05BTUUgPSAndGVuc29yZmxvd2pzJztcbmNvbnN0IERBVEFCQVNFX1ZFUlNJT04gPSAxO1xuLy8gTW9kZWwgZGF0YSBhbmQgTW9kZWxBcnRpZmFjdHNJbmZvIChtZXRhZGF0YSkgYXJlIHN0b3JlZCBpbiB0d28gc2VwYXJhdGVcbi8vIHN0b3JlcyBmb3IgZWZmaWNpZW50IGFjY2VzcyBvZiB0aGUgbGlzdCBvZiBzdG9yZWQgbW9kZWxzIGFuZCB0aGVpciBtZXRhZGF0YS5cbi8vIDEuIFRoZSBvYmplY3Qgc3RvcmUgZm9yIG1vZGVsIGRhdGE6IHRvcG9sb2d5LCB3ZWlnaHRzIGFuZCB3ZWlnaHQgbWFuaWZlc3RzLlxuY29uc3QgTU9ERUxfU1RPUkVfTkFNRSA9ICdtb2RlbHNfc3RvcmUnO1xuLy8gMi4gVGhlIG9iamVjdCBzdG9yZSBmb3IgTW9kZWxBcnRpZmFjdHNJbmZvLCBpbmNsdWRpbmcgbWV0YS1pbmZvcm1hdGlvbiBzdWNoXG4vLyAgICBhcyB0aGUgdHlwZSBvZiB0b3BvbG9neSAoSlNPTiB2cyBiaW5hcnkpLCBieXRlIHNpemUgb2YgdGhlIHRvcG9sb2d5LCBieXRlXG4vLyAgICBzaXplIG9mIHRoZSB3ZWlnaHRzLCBldGMuXG5jb25zdCBJTkZPX1NUT1JFX05BTUUgPSAnbW9kZWxfaW5mb19zdG9yZSc7XG4vKipcbiAqIERlbGV0ZSB0aGUgZW50aXJlIGRhdGFiYXNlIGZvciB0ZW5zb3JmbG93LmpzLCBpbmNsdWRpbmcgdGhlIG1vZGVscyBzdG9yZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZURhdGFiYXNlKCkge1xuICAgIGNvbnN0IGlkYkZhY3RvcnkgPSBnZXRJbmRleGVkREJGYWN0b3J5KCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgZGVsZXRlUmVxdWVzdCA9IGlkYkZhY3RvcnkuZGVsZXRlRGF0YWJhc2UoREFUQUJBU0VfTkFNRSk7XG4gICAgICAgIGRlbGV0ZVJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4gcmVzb2x2ZSgpO1xuICAgICAgICBkZWxldGVSZXF1ZXN0Lm9uZXJyb3IgPSBlcnJvciA9PiByZWplY3QoZXJyb3IpO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gZ2V0SW5kZXhlZERCRmFjdG9yeSgpIHtcbiAgICBpZiAoIWVudigpLmdldEJvb2woJ0lTX0JST1dTRVInKSkge1xuICAgICAgICAvLyBUT0RPKGNhaXMpOiBBZGQgbW9yZSBpbmZvIGFib3V0IHdoYXQgSU9IYW5kbGVyIHN1YnR5cGVzIGFyZSBhdmFpbGFibGUuXG4gICAgICAgIC8vICAgTWF5YmUgcG9pbnQgdG8gYSBkb2MgcGFnZSBvbiB0aGUgd2ViIGFuZC9vciBhdXRvbWF0aWNhbGx5IGRldGVybWluZVxuICAgICAgICAvLyAgIHRoZSBhdmFpbGFibGUgSU9IYW5kbGVycyBhbmQgcHJpbnQgdGhlbSBpbiB0aGUgZXJyb3IgbWVzc2FnZS5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gb2J0YWluIEluZGV4ZWREQiBmYWN0b3J5IGJlY2F1c2UgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQnICtcbiAgICAgICAgICAgICdpcyBub3QgYSB3ZWIgYnJvd3Nlci4nKTtcbiAgICB9XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgIGNvbnN0IHRoZVdpbmRvdyA9IHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHdpbmRvdztcbiAgICBjb25zdCBmYWN0b3J5ID0gdGhlV2luZG93LmluZGV4ZWREQiB8fCB0aGVXaW5kb3cubW96SW5kZXhlZERCIHx8XG4gICAgICAgIHRoZVdpbmRvdy53ZWJraXRJbmRleGVkREIgfHwgdGhlV2luZG93Lm1zSW5kZXhlZERCIHx8XG4gICAgICAgIHRoZVdpbmRvdy5zaGltSW5kZXhlZERCO1xuICAgIGlmIChmYWN0b3J5ID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgY3VycmVudCBicm93c2VyIGRvZXMgbm90IGFwcGVhciB0byBzdXBwb3J0IEluZGV4ZWREQi4nKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhY3Rvcnk7XG59XG5mdW5jdGlvbiBzZXRVcERhdGFiYXNlKG9wZW5SZXF1ZXN0KSB7XG4gICAgY29uc3QgZGIgPSBvcGVuUmVxdWVzdC5yZXN1bHQ7XG4gICAgZGIuY3JlYXRlT2JqZWN0U3RvcmUoTU9ERUxfU1RPUkVfTkFNRSwgeyBrZXlQYXRoOiAnbW9kZWxQYXRoJyB9KTtcbiAgICBkYi5jcmVhdGVPYmplY3RTdG9yZShJTkZPX1NUT1JFX05BTUUsIHsga2V5UGF0aDogJ21vZGVsUGF0aCcgfSk7XG59XG4vKipcbiAqIElPSGFuZGxlciBzdWJjbGFzczogQnJvd3NlciBJbmRleGVkREIuXG4gKlxuICogU2VlIHRoZSBkb2Mgc3RyaW5nIG9mIGBicm93c2VySW5kZXhlZERCYCBmb3IgbW9yZSBkZXRhaWxzLlxuICovXG5leHBvcnQgY2xhc3MgQnJvd3NlckluZGV4ZWREQiB7XG4gICAgY29uc3RydWN0b3IobW9kZWxQYXRoKSB7XG4gICAgICAgIHRoaXMuaW5kZXhlZERCID0gZ2V0SW5kZXhlZERCRmFjdG9yeSgpO1xuICAgICAgICBpZiAobW9kZWxQYXRoID09IG51bGwgfHwgIW1vZGVsUGF0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3IgSW5kZXhlZERCLCBtb2RlbFBhdGggbXVzdCBub3QgYmUgbnVsbCwgdW5kZWZpbmVkIG9yIGVtcHR5LicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubW9kZWxQYXRoID0gbW9kZWxQYXRoO1xuICAgIH1cbiAgICBhc3luYyBzYXZlKG1vZGVsQXJ0aWZhY3RzKSB7XG4gICAgICAgIC8vIFRPRE8oY2Fpcyk6IFN1cHBvcnQgc2F2aW5nIEdyYXBoRGVmIG1vZGVscy5cbiAgICAgICAgaWYgKG1vZGVsQXJ0aWZhY3RzLm1vZGVsVG9wb2xvZ3kgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCcm93c2VyTG9jYWxTdG9yYWdlLnNhdmUoKSBkb2VzIG5vdCBzdXBwb3J0IHNhdmluZyBtb2RlbCB0b3BvbG9neSAnICtcbiAgICAgICAgICAgICAgICAnaW4gYmluYXJ5IGZvcm1hdHMgeWV0LicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlQWN0aW9uKHRoaXMubW9kZWxQYXRoLCBtb2RlbEFydGlmYWN0cyk7XG4gICAgfVxuICAgIGFzeW5jIGxvYWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlQWN0aW9uKHRoaXMubW9kZWxQYXRoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGVyZm9ybSBkYXRhYmFzZSBhY3Rpb24gdG8gcHV0IG1vZGVsIGFydGlmYWN0cyBpbnRvIG9yIHJlYWQgbW9kZWwgYXJ0aWZhY3RzXG4gICAgICogZnJvbSBJbmRleGVkREIgb2JqZWN0IHN0b3JlLlxuICAgICAqXG4gICAgICogV2hldGhlciB0aGUgYWN0aW9uIGlzIHB1dCBvciBnZXQgZGVwZW5kcyBvbiB3aGV0aGVyIGBtb2RlbEFydGlmYWN0c2AgaXNcbiAgICAgKiBzcGVjaWZpZWQuIElmIGl0IGlzIHNwZWNpZmllZCwgdGhlIGFjdGlvbiB3aWxsIGJlIHB1dDsgb3RoZXJ3aXNlIHRoZSBhY3Rpb25cbiAgICAgKiB3aWxsIGJlIGdldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtb2RlbFBhdGggQSB1bmlxdWUgc3RyaW5nIHBhdGggZm9yIHRoZSBtb2RlbC5cbiAgICAgKiBAcGFyYW0gbW9kZWxBcnRpZmFjdHMgSWYgc3BlY2lmaWVkLCBpdCB3aWxsIGJlIHRoZSBtb2RlbCBhcnRpZmFjdHMgdG8gYmVcbiAgICAgKiAgIHN0b3JlZCBpbiBJbmRleGVkREIuXG4gICAgICogQHJldHVybnMgQSBgUHJvbWlzZWAgb2YgYFNhdmVSZXN1bHRgLCBpZiB0aGUgYWN0aW9uIGlzIHB1dCwgb3IgYSBgUHJvbWlzZWBcbiAgICAgKiAgIG9mIGBNb2RlbEFydGlmYWN0c2AsIGlmIHRoZSBhY3Rpb24gaXMgZ2V0LlxuICAgICAqL1xuICAgIGRhdGFiYXNlQWN0aW9uKG1vZGVsUGF0aCwgbW9kZWxBcnRpZmFjdHMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9wZW5SZXF1ZXN0ID0gdGhpcy5pbmRleGVkREIub3BlbihEQVRBQkFTRV9OQU1FLCBEQVRBQkFTRV9WRVJTSU9OKTtcbiAgICAgICAgICAgIG9wZW5SZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9ICgpID0+IHNldFVwRGF0YWJhc2Uob3BlblJlcXVlc3QpO1xuICAgICAgICAgICAgb3BlblJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRiID0gb3BlblJlcXVlc3QucmVzdWx0O1xuICAgICAgICAgICAgICAgIGlmIChtb2RlbEFydGlmYWN0cyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJlYWQgbW9kZWwgb3V0IGZyb20gb2JqZWN0IHN0b3JlLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtb2RlbFR4ID0gZGIudHJhbnNhY3Rpb24oTU9ERUxfU1RPUkVfTkFNRSwgJ3JlYWRvbmx5Jyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1vZGVsU3RvcmUgPSBtb2RlbFR4Lm9iamVjdFN0b3JlKE1PREVMX1NUT1JFX05BTUUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBnZXRSZXF1ZXN0ID0gbW9kZWxTdG9yZS5nZXQodGhpcy5tb2RlbFBhdGgpO1xuICAgICAgICAgICAgICAgICAgICBnZXRSZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRSZXF1ZXN0LnJlc3VsdCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGIuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgbW9kZWwgd2l0aCBwYXRoICcke3RoaXMubW9kZWxQYXRofScgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBpbiBJbmRleGVkREIuYCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShnZXRSZXF1ZXN0LnJlc3VsdC5tb2RlbEFydGlmYWN0cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGdldFJlcXVlc3Qub25lcnJvciA9IGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KGdldFJlcXVlc3QuZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBtb2RlbFR4Lm9uY29tcGxldGUgPSAoKSA9PiBkYi5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUHV0IG1vZGVsIGludG8gb2JqZWN0IHN0b3JlLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtb2RlbEFydGlmYWN0c0luZm8gPSBnZXRNb2RlbEFydGlmYWN0c0luZm9Gb3JKU09OKG1vZGVsQXJ0aWZhY3RzKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gRmlyc3QsIHB1dCBNb2RlbEFydGlmYWN0c0luZm8gaW50byBpbmZvIHN0b3JlLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmZvVHggPSBkYi50cmFuc2FjdGlvbihJTkZPX1NUT1JFX05BTUUsICdyZWFkd3JpdGUnKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluZm9TdG9yZSA9IGluZm9UeC5vYmplY3RTdG9yZShJTkZPX1NUT1JFX05BTUUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwdXRJbmZvUmVxdWVzdCA9IGluZm9TdG9yZS5wdXQoeyBtb2RlbFBhdGg6IHRoaXMubW9kZWxQYXRoLCBtb2RlbEFydGlmYWN0c0luZm8gfSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtb2RlbFR4O1xuICAgICAgICAgICAgICAgICAgICBwdXRJbmZvUmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWNvbmQsIHB1dCBtb2RlbCBkYXRhIGludG8gbW9kZWwgc3RvcmUuXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbFR4ID0gZGIudHJhbnNhY3Rpb24oTU9ERUxfU1RPUkVfTkFNRSwgJ3JlYWR3cml0ZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9kZWxTdG9yZSA9IG1vZGVsVHgub2JqZWN0U3RvcmUoTU9ERUxfU1RPUkVfTkFNRSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwdXRNb2RlbFJlcXVlc3QgPSBtb2RlbFN0b3JlLnB1dCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxQYXRoOiB0aGlzLm1vZGVsUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbEFydGlmYWN0cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbEFydGlmYWN0c0luZm9cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHV0TW9kZWxSZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHJlc29sdmUoeyBtb2RlbEFydGlmYWN0c0luZm8gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwdXRNb2RlbFJlcXVlc3Qub25lcnJvciA9IGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcHV0LW1vZGVsIHJlcXVlc3QgZmFpbHMsIHJvbGwgYmFjayB0aGUgaW5mbyBlbnRyeSBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlbGwuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1N0b3JlID0gaW5mb1R4Lm9iamVjdFN0b3JlKElORk9fU1RPUkVfTkFNRSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVsZXRlSW5mb1JlcXVlc3QgPSBpbmZvU3RvcmUuZGVsZXRlKHRoaXMubW9kZWxQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVJbmZvUmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QocHV0TW9kZWxSZXF1ZXN0LmVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUluZm9SZXF1ZXN0Lm9uZXJyb3IgPSBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QocHV0TW9kZWxSZXF1ZXN0LmVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgcHV0SW5mb1JlcXVlc3Qub25lcnJvciA9IGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KHB1dEluZm9SZXF1ZXN0LmVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaW5mb1R4Lm9uY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kZWxUeCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGIuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsVHgub25jb21wbGV0ZSA9ICgpID0+IGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIG9wZW5SZXF1ZXN0Lm9uZXJyb3IgPSBlcnJvciA9PiByZWplY3Qob3BlblJlcXVlc3QuZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5Ccm93c2VySW5kZXhlZERCLlVSTF9TQ0hFTUUgPSAnaW5kZXhlZGRiOi8vJztcbmV4cG9ydCBjb25zdCBpbmRleGVkREJSb3V0ZXIgPSAodXJsKSA9PiB7XG4gICAgaWYgKCFlbnYoKS5nZXRCb29sKCdJU19CUk9XU0VSJykpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodXJsKSAmJiB1cmwuc3RhcnRzV2l0aChCcm93c2VySW5kZXhlZERCLlVSTF9TQ0hFTUUpKSB7XG4gICAgICAgICAgICByZXR1cm4gYnJvd3NlckluZGV4ZWREQih1cmwuc2xpY2UoQnJvd3NlckluZGV4ZWREQi5VUkxfU0NIRU1FLmxlbmd0aCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG59O1xuSU9Sb3V0ZXJSZWdpc3RyeS5yZWdpc3RlclNhdmVSb3V0ZXIoaW5kZXhlZERCUm91dGVyKTtcbklPUm91dGVyUmVnaXN0cnkucmVnaXN0ZXJMb2FkUm91dGVyKGluZGV4ZWREQlJvdXRlcik7XG4vKipcbiAqIENyZWF0ZXMgYSBicm93c2VyIEluZGV4ZWREQiBJT0hhbmRsZXIgZm9yIHNhdmluZyBhbmQgbG9hZGluZyBtb2RlbHMuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1vZGVsID0gdGYuc2VxdWVudGlhbCgpO1xuICogbW9kZWwuYWRkKFxuICogICAgIHRmLmxheWVycy5kZW5zZSh7dW5pdHM6IDEsIGlucHV0U2hhcGU6IFsxMDBdLCBhY3RpdmF0aW9uOiAnc2lnbW9pZCd9KSk7XG4gKlxuICogY29uc3Qgc2F2ZVJlc3VsdCA9IGF3YWl0IG1vZGVsLnNhdmUoJ2luZGV4ZWRkYjovL015TW9kZWwnKSk7XG4gKiBjb25zb2xlLmxvZyhzYXZlUmVzdWx0KTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBtb2RlbFBhdGggQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG1vZGVsIHRvIGJlIHNhdmVkLiBNdXN0IGJlIGFcbiAqICAgbm9uLWVtcHR5IHN0cmluZy5cbiAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIGBCcm93c2VySW5kZXhlZERCYCAoc3VibGNhc3Mgb2YgYElPSGFuZGxlcmApLFxuICogICB3aGljaCBjYW4gYmUgdXNlZCB3aXRoLCBlLmcuLCBgdGYuTW9kZWwuc2F2ZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBicm93c2VySW5kZXhlZERCKG1vZGVsUGF0aCkge1xuICAgIHJldHVybiBuZXcgQnJvd3NlckluZGV4ZWREQihtb2RlbFBhdGgpO1xufVxuZnVuY3Rpb24gbWF5YmVTdHJpcFNjaGVtZShrZXkpIHtcbiAgICByZXR1cm4ga2V5LnN0YXJ0c1dpdGgoQnJvd3NlckluZGV4ZWREQi5VUkxfU0NIRU1FKSA/XG4gICAgICAgIGtleS5zbGljZShCcm93c2VySW5kZXhlZERCLlVSTF9TQ0hFTUUubGVuZ3RoKSA6XG4gICAgICAgIGtleTtcbn1cbmV4cG9ydCBjbGFzcyBCcm93c2VySW5kZXhlZERCTWFuYWdlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuaW5kZXhlZERCID0gZ2V0SW5kZXhlZERCRmFjdG9yeSgpO1xuICAgIH1cbiAgICBhc3luYyBsaXN0TW9kZWxzKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3BlblJlcXVlc3QgPSB0aGlzLmluZGV4ZWREQi5vcGVuKERBVEFCQVNFX05BTUUsIERBVEFCQVNFX1ZFUlNJT04pO1xuICAgICAgICAgICAgb3BlblJlcXVlc3Qub251cGdyYWRlbmVlZGVkID0gKCkgPT4gc2V0VXBEYXRhYmFzZShvcGVuUmVxdWVzdCk7XG4gICAgICAgICAgICBvcGVuUmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGIgPSBvcGVuUmVxdWVzdC5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgY29uc3QgdHggPSBkYi50cmFuc2FjdGlvbihJTkZPX1NUT1JFX05BTUUsICdyZWFkb25seScpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0b3JlID0gdHgub2JqZWN0U3RvcmUoSU5GT19TVE9SRV9OQU1FKTtcbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZTptYXgtbGluZS1sZW5ndGhcbiAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIGNhc3QgYHN0b3JlYCBhcyBgYW55YCBoZXJlIGJlY2F1c2UgVHlwZVNjcmlwdCdzIERPTVxuICAgICAgICAgICAgICAgIC8vIGxpYnJhcnkgZG9lcyBub3QgaGF2ZSB0aGUgYGdldEFsbCgpYCBtZXRob2QgZXZlbiB0aG91Z2ggdGhlXG4gICAgICAgICAgICAgICAgLy8gbWV0aG9kIGlzIHN1cHBvcnRlZCBpbiB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgbW9zdCBtYWluc3RyZWFtXG4gICAgICAgICAgICAgICAgLy8gYnJvd3NlcnM6XG4gICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0lEQk9iamVjdFN0b3JlL2dldEFsbFxuICAgICAgICAgICAgICAgIC8vIHRzbGludDplbmFibGU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgICAgICAgICAgICAgIGNvbnN0IGdldEFsbEluZm9SZXF1ZXN0ID0gc3RvcmUuZ2V0QWxsKCk7XG4gICAgICAgICAgICAgICAgZ2V0QWxsSW5mb1JlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvdXQgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGdldEFsbEluZm9SZXF1ZXN0LnJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0W2l0ZW0ubW9kZWxQYXRoXSA9IGl0ZW0ubW9kZWxBcnRpZmFjdHNJbmZvO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUob3V0KTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGdldEFsbEluZm9SZXF1ZXN0Lm9uZXJyb3IgPSBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QoZ2V0QWxsSW5mb1JlcXVlc3QuZXJyb3IpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdHgub25jb21wbGV0ZSA9ICgpID0+IGRiLmNsb3NlKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgb3BlblJlcXVlc3Qub25lcnJvciA9IGVycm9yID0+IHJlamVjdChvcGVuUmVxdWVzdC5lcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyByZW1vdmVNb2RlbChwYXRoKSB7XG4gICAgICAgIHBhdGggPSBtYXliZVN0cmlwU2NoZW1lKHBhdGgpO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3BlblJlcXVlc3QgPSB0aGlzLmluZGV4ZWREQi5vcGVuKERBVEFCQVNFX05BTUUsIERBVEFCQVNFX1ZFUlNJT04pO1xuICAgICAgICAgICAgb3BlblJlcXVlc3Qub251cGdyYWRlbmVlZGVkID0gKCkgPT4gc2V0VXBEYXRhYmFzZShvcGVuUmVxdWVzdCk7XG4gICAgICAgICAgICBvcGVuUmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGIgPSBvcGVuUmVxdWVzdC5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5mb1R4ID0gZGIudHJhbnNhY3Rpb24oSU5GT19TVE9SRV9OQU1FLCAncmVhZHdyaXRlJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5mb1N0b3JlID0gaW5mb1R4Lm9iamVjdFN0b3JlKElORk9fU1RPUkVfTkFNRSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZ2V0SW5mb1JlcXVlc3QgPSBpbmZvU3RvcmUuZ2V0KHBhdGgpO1xuICAgICAgICAgICAgICAgIGxldCBtb2RlbFR4O1xuICAgICAgICAgICAgICAgIGdldEluZm9SZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGdldEluZm9SZXF1ZXN0LnJlc3VsdCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYi5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoYENhbm5vdCBmaW5kIG1vZGVsIHdpdGggcGF0aCAnJHtwYXRofScgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYGluIEluZGV4ZWREQi5gKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXJzdCwgZGVsZXRlIHRoZSBlbnRyeSBpbiB0aGUgaW5mbyBzdG9yZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbGV0ZUluZm9SZXF1ZXN0ID0gaW5mb1N0b3JlLmRlbGV0ZShwYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbGV0ZU1vZGVsRGF0YSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWNvbmQsIGRlbGV0ZSB0aGUgZW50cnkgaW4gdGhlIG1vZGVsIHN0b3JlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsVHggPSBkYi50cmFuc2FjdGlvbihNT0RFTF9TVE9SRV9OQU1FLCAncmVhZHdyaXRlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9kZWxTdG9yZSA9IG1vZGVsVHgub2JqZWN0U3RvcmUoTU9ERUxfU1RPUkVfTkFNRSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVsZXRlTW9kZWxSZXF1ZXN0ID0gbW9kZWxTdG9yZS5kZWxldGUocGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlTW9kZWxSZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHJlc29sdmUoZ2V0SW5mb1JlcXVlc3QucmVzdWx0Lm1vZGVsQXJ0aWZhY3RzSW5mbyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlTW9kZWxSZXF1ZXN0Lm9uZXJyb3IgPSBlcnJvciA9PiByZWplY3QoZ2V0SW5mb1JlcXVlc3QuZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByb2NlZWQgd2l0aCBkZWxldGluZyBtb2RlbCBkYXRhIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBkZWxldGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgaW5mbyBkYXRhIHN1Y2NlZWRzIG9yIG5vdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUluZm9SZXF1ZXN0Lm9uc3VjY2VzcyA9IGRlbGV0ZU1vZGVsRGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUluZm9SZXF1ZXN0Lm9uZXJyb3IgPSBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlTW9kZWxEYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGIuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KGdldEluZm9SZXF1ZXN0LmVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGdldEluZm9SZXF1ZXN0Lm9uZXJyb3IgPSBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QoZ2V0SW5mb1JlcXVlc3QuZXJyb3IpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaW5mb1R4Lm9uY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtb2RlbFR4ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbFR4Lm9uY29tcGxldGUgPSAoKSA9PiBkYi5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBvcGVuUmVxdWVzdC5vbmVycm9yID0gZXJyb3IgPT4gcmVqZWN0KG9wZW5SZXF1ZXN0LmVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXhlZF9kYi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vLyBJbXBvcnRpbmcgbG9jYWxfc3RvcmFnZSBhbmQgaW5kZXhlZF9kYiBpcyBuZWNlc3NhcnkgZm9yIHRoZSByb3V0ZXJzIHRvIGJlXG4vLyByZWdpc3RlcmVkLlxuaW1wb3J0ICcuL2luZGV4ZWRfZGInO1xuaW1wb3J0ICcuL2xvY2FsX3N0b3JhZ2UnO1xuaW1wb3J0IHsgYnJvd3NlckZpbGVzIH0gZnJvbSAnLi9icm93c2VyX2ZpbGVzJztcbmltcG9ydCB7IGJyb3dzZXJIVFRQUmVxdWVzdCwgaHR0cCwgaXNIVFRQU2NoZW1lIH0gZnJvbSAnLi9odHRwJztcbmltcG9ydCB7IGNvbmNhdGVuYXRlQXJyYXlCdWZmZXJzLCBkZWNvZGVXZWlnaHRzLCBlbmNvZGVXZWlnaHRzLCBnZXRNb2RlbEFydGlmYWN0c0ZvckpTT04sIGdldE1vZGVsQXJ0aWZhY3RzSW5mb0ZvckpTT04gfSBmcm9tICcuL2lvX3V0aWxzJztcbmltcG9ydCB7IGZyb21NZW1vcnksIHdpdGhTYXZlSGFuZGxlciB9IGZyb20gJy4vcGFzc3Rocm91Z2gnO1xuaW1wb3J0IHsgZ2V0TG9hZEhhbmRsZXJzLCBnZXRTYXZlSGFuZGxlcnMsIHJlZ2lzdGVyTG9hZFJvdXRlciwgcmVnaXN0ZXJTYXZlUm91dGVyIH0gZnJvbSAnLi9yb3V0ZXJfcmVnaXN0cnknO1xuaW1wb3J0IHsgbG9hZFdlaWdodHMsIHdlaWdodHNMb2FkZXJGYWN0b3J5IH0gZnJvbSAnLi93ZWlnaHRzX2xvYWRlcic7XG5leHBvcnQgeyBjb3B5TW9kZWwsIGxpc3RNb2RlbHMsIG1vdmVNb2RlbCwgcmVtb3ZlTW9kZWwgfSBmcm9tICcuL21vZGVsX21hbmFnZW1lbnQnO1xuZXhwb3J0IHsgYnJvd3NlckZpbGVzLCBicm93c2VySFRUUFJlcXVlc3QsIGNvbmNhdGVuYXRlQXJyYXlCdWZmZXJzLCBkZWNvZGVXZWlnaHRzLCBlbmNvZGVXZWlnaHRzLCBmcm9tTWVtb3J5LCBnZXRMb2FkSGFuZGxlcnMsIGdldE1vZGVsQXJ0aWZhY3RzRm9ySlNPTiwgZ2V0TW9kZWxBcnRpZmFjdHNJbmZvRm9ySlNPTiwgZ2V0U2F2ZUhhbmRsZXJzLCBodHRwLCBpc0hUVFBTY2hlbWUsIGxvYWRXZWlnaHRzLCByZWdpc3RlckxvYWRSb3V0ZXIsIHJlZ2lzdGVyU2F2ZVJvdXRlciwgd2VpZ2h0c0xvYWRlckZhY3RvcnksIHdpdGhTYXZlSGFuZGxlciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW8uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29tcGxleCB9IGZyb20gJy4uL29wcy9jb21wbGV4JztcbmltcG9ydCB7IHRlbnNvciB9IGZyb20gJy4uL29wcy90ZW5zb3InO1xuaW1wb3J0IHsgc2l6ZUZyb21TaGFwZSB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgRFRZUEVfVkFMVUVfU0laRV9NQVAgfSBmcm9tICcuL3R5cGVzJztcbi8qKiBOdW1iZXIgb2YgYnl0ZXMgcmVzZXJ2ZWQgZm9yIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZy4gKDMyYml0IGludGVnZXIpLiAqL1xuY29uc3QgTlVNX0JZVEVTX1NUUklOR19MRU5HVEggPSA0O1xuLyoqXG4gKiBFbmNvZGUgYSBtYXAgZnJvbSBuYW1lcyB0byB3ZWlnaHQgdmFsdWVzIGFzIGFuIEFycmF5QnVmZmVyLCBhbG9uZyB3aXRoIGFuXG4gKiBgQXJyYXlgIG9mIGBXZWlnaHRzTWFuaWZlc3RFbnRyeWAgYXMgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZW5jb2RlZCB3ZWlnaHRzLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcGVyZm9ybSBzaGFyZGluZy5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSByZXZlcnNlIG9mIGBkZWNvZGVXZWlnaHRzYC5cbiAqXG4gKiBAcGFyYW0gdGVuc29ycyBBIG1hcCAoXCJkaWN0XCIpIGZyb20gbmFtZXMgdG8gdGVuc29ycy5cbiAqIEBwYXJhbSBncm91cCBHcm91cCB0byB3aGljaCB0aGUgd2VpZ2h0cyBiZWxvbmcgKG9wdGlvbmFsKS5cbiAqIEByZXR1cm5zIEEgYFByb21pc2VgIG9mXG4gKiAgIC0gQSBmbGF0IGBBcnJheUJ1ZmZlcmAgd2l0aCBhbGwgdGhlIGJpbmFyeSB2YWx1ZXMgb2YgdGhlIGBUZW5zb3Jgc1xuICogICAgIGNvbmNhdGVuYXRlZC5cbiAqICAgLSBBbiBgQXJyYXlgIG9mIGBXZWlnaHRNYW5pZmVzdEVudHJ5YHMsIGNhcnJ5aW5nIGluZm9ybWF0aW9uIGluY2x1ZGluZ1xuICogICAgIHRlbnNvciBuYW1lcywgYGR0eXBlYHMgYW5kIHNoYXBlcy5cbiAqIEB0aHJvd3MgRXJyb3I6IG9uIHVuc3VwcG9ydGVkIHRlbnNvciBgZHR5cGVgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5jb2RlV2VpZ2h0cyh0ZW5zb3JzLCBncm91cCkge1xuICAgIC8vIFRPRE8oYWRhcm9iLCBjYWlzKTogU3VwcG9ydCBxdWFudGl6YXRpb24uXG4gICAgY29uc3Qgc3BlY3MgPSBbXTtcbiAgICBjb25zdCBkYXRhUHJvbWlzZXMgPSBbXTtcbiAgICBjb25zdCBuYW1lcyA9IEFycmF5LmlzQXJyYXkodGVuc29ycykgP1xuICAgICAgICB0ZW5zb3JzLm1hcCh0ZW5zb3IgPT4gdGVuc29yLm5hbWUpIDpcbiAgICAgICAgT2JqZWN0LmtleXModGVuc29ycyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBuYW1lID0gbmFtZXNbaV07XG4gICAgICAgIGNvbnN0IHQgPSBBcnJheS5pc0FycmF5KHRlbnNvcnMpID8gdGVuc29yc1tpXS50ZW5zb3IgOiB0ZW5zb3JzW25hbWVdO1xuICAgICAgICBpZiAodC5kdHlwZSAhPT0gJ2Zsb2F0MzInICYmIHQuZHR5cGUgIT09ICdpbnQzMicgJiYgdC5kdHlwZSAhPT0gJ2Jvb2wnICYmXG4gICAgICAgICAgICB0LmR0eXBlICE9PSAnc3RyaW5nJyAmJiB0LmR0eXBlICE9PSAnY29tcGxleDY0Jykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBkdHlwZSBpbiB3ZWlnaHQgJyR7bmFtZX0nOiAke3QuZHR5cGV9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3BlYyA9IHsgbmFtZSwgc2hhcGU6IHQuc2hhcGUsIGR0eXBlOiB0LmR0eXBlIH07XG4gICAgICAgIGlmICh0LmR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3QgdXRmOGJ5dGVzID0gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWxzID0gYXdhaXQgdC5ieXRlcygpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvdGFsTnVtQnl0ZXMgPSB2YWxzLnJlZHVjZSgocCwgYykgPT4gcCArIGMubGVuZ3RoLCAwKSArXG4gICAgICAgICAgICAgICAgICAgIE5VTV9CWVRFU19TVFJJTkdfTEVOR1RIICogdmFscy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheSh0b3RhbE51bUJ5dGVzKTtcbiAgICAgICAgICAgICAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gdmFsc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnl0ZXNPZkxlbmd0aCA9IG5ldyBVaW50OEFycmF5KG5ldyBVaW50MzJBcnJheShbdmFsLmxlbmd0aF0pLmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIGJ5dGVzLnNldChieXRlc09mTGVuZ3RoLCBvZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gTlVNX0JZVEVTX1NUUklOR19MRU5HVEg7XG4gICAgICAgICAgICAgICAgICAgIGJ5dGVzLnNldCh2YWwsIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSB2YWwubGVuZ3RoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXNvbHZlKGJ5dGVzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZGF0YVByb21pc2VzLnB1c2godXRmOGJ5dGVzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRhdGFQcm9taXNlcy5wdXNoKHQuZGF0YSgpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ3JvdXAgIT0gbnVsbCkge1xuICAgICAgICAgICAgc3BlYy5ncm91cCA9IGdyb3VwO1xuICAgICAgICB9XG4gICAgICAgIHNwZWNzLnB1c2goc3BlYyk7XG4gICAgfVxuICAgIGNvbnN0IHRlbnNvclZhbHVlcyA9IGF3YWl0IFByb21pc2UuYWxsKGRhdGFQcm9taXNlcyk7XG4gICAgcmV0dXJuIHsgZGF0YTogY29uY2F0ZW5hdGVUeXBlZEFycmF5cyh0ZW5zb3JWYWx1ZXMpLCBzcGVjcyB9O1xufVxuLyoqXG4gKiBEZWNvZGUgZmxhdCBBcnJheUJ1ZmZlciBhcyB3ZWlnaHRzLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaGFuZGxlIHNoYXJkaW5nLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaXMgdGhlIHJldmVyc2Ugb2YgYGVuY29kZVdlaWdodHNgLlxuICpcbiAqIEBwYXJhbSBidWZmZXIgQSBmbGF0IEFycmF5QnVmZmVyIGNhcnJ5aW5nIHRoZSBiaW5hcnkgdmFsdWVzIG9mIHRoZSB0ZW5zb3JzXG4gKiAgIGNvbmNhdGVuYXRlZCBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkIGluIGBzcGVjc2AuXG4gKiBAcGFyYW0gc3BlY3MgU3BlY2lmaWNhdGlvbnMgb2YgdGhlIG5hbWVzLCBkdHlwZXMgYW5kIHNoYXBlcyBvZiB0aGUgdGVuc29yc1xuICogICB3aG9zZSB2YWx1ZSBhcmUgZW5jb2RlZCBieSBgYnVmZmVyYC5cbiAqIEByZXR1cm4gQSBtYXAgZnJvbSB0ZW5zb3IgbmFtZSB0byB0ZW5zb3IgdmFsdWUsIHdpdGggdGhlIG5hbWVzIGNvcnJlc3BvbmRpbmdcbiAqICAgdG8gbmFtZXMgaW4gYHNwZWNzYC5cbiAqIEB0aHJvd3MgRXJyb3IsIGlmIGFueSBvZiB0aGUgdGVuc29ycyBoYXMgdW5zdXBwb3J0ZWQgZHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVXZWlnaHRzKGJ1ZmZlciwgc3BlY3MpIHtcbiAgICAvLyBUT0RPKGFkYXJvYiwgY2Fpcyk6IFN1cHBvcnQgcXVhbnRpemF0aW9uLlxuICAgIGNvbnN0IG91dCA9IHt9O1xuICAgIGxldCBmbG9hdDE2RGVjb2RlO1xuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIGZvciAoY29uc3Qgc3BlYyBvZiBzcGVjcykge1xuICAgICAgICBjb25zdCBuYW1lID0gc3BlYy5uYW1lO1xuICAgICAgICBjb25zdCBkdHlwZSA9IHNwZWMuZHR5cGU7XG4gICAgICAgIGNvbnN0IHNoYXBlID0gc3BlYy5zaGFwZTtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHNpemVGcm9tU2hhcGUoc2hhcGUpO1xuICAgICAgICBsZXQgdmFsdWVzO1xuICAgICAgICBpZiAoJ3F1YW50aXphdGlvbicgaW4gc3BlYykge1xuICAgICAgICAgICAgY29uc3QgcXVhbnRpemF0aW9uID0gc3BlYy5xdWFudGl6YXRpb247XG4gICAgICAgICAgICBpZiAocXVhbnRpemF0aW9uLmR0eXBlID09PSAndWludDgnIHx8IHF1YW50aXphdGlvbi5kdHlwZSA9PT0gJ3VpbnQxNicpIHtcbiAgICAgICAgICAgICAgICBpZiAoISgnbWluJyBpbiBxdWFudGl6YXRpb24gJiYgJ3NjYWxlJyBpbiBxdWFudGl6YXRpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgV2VpZ2h0ICR7c3BlYy5uYW1lfSB3aXRoIHF1YW50aXphdGlvbiAke3F1YW50aXphdGlvbi5kdHlwZX0gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgZG9lc24ndCBoYXZlIGNvcnJlc3BvbmRpbmcgbWV0YWRhdGEgbWluIGFuZCBzY2FsZS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChxdWFudGl6YXRpb24uZHR5cGUgPT09ICdmbG9hdDE2Jykge1xuICAgICAgICAgICAgICAgIGlmIChkdHlwZSAhPT0gJ2Zsb2F0MzInKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgV2VpZ2h0ICR7c3BlYy5uYW1lfSBpcyBxdWFudGl6ZWQgd2l0aCAke3F1YW50aXphdGlvbi5kdHlwZX0gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgd2hpY2ggb25seSBzdXBwb3J0cyB3ZWlnaHRzIG9mIHR5cGUgZmxvYXQzMiBub3QgJHtkdHlwZX0uYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBXZWlnaHQgJHtzcGVjLm5hbWV9IGhhcyB1bmtub3duIGAgK1xuICAgICAgICAgICAgICAgICAgICBgcXVhbnRpemF0aW9uIGR0eXBlICR7cXVhbnRpemF0aW9uLmR0eXBlfS4gYCArXG4gICAgICAgICAgICAgICAgICAgIGBTdXBwb3J0ZWQgcXVhbnRpemF0aW9uIGR0eXBlcyBhcmU6IGAgK1xuICAgICAgICAgICAgICAgICAgICBgJ3VpbnQ4JywgJ3VpbnQxNicsIGFuZCAnZmxvYXQxNicuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBxdWFudGl6YXRpb25TaXplRmFjdG9yID0gRFRZUEVfVkFMVUVfU0laRV9NQVBbcXVhbnRpemF0aW9uLmR0eXBlXTtcbiAgICAgICAgICAgIGNvbnN0IGJ5dGVCdWZmZXIgPSBidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBzaXplICogcXVhbnRpemF0aW9uU2l6ZUZhY3Rvcik7XG4gICAgICAgICAgICBjb25zdCBxdWFudGl6ZWRBcnJheSA9IChxdWFudGl6YXRpb24uZHR5cGUgPT09ICd1aW50OCcpID9cbiAgICAgICAgICAgICAgICBuZXcgVWludDhBcnJheShieXRlQnVmZmVyKSA6XG4gICAgICAgICAgICAgICAgbmV3IFVpbnQxNkFycmF5KGJ5dGVCdWZmZXIpO1xuICAgICAgICAgICAgaWYgKGR0eXBlID09PSAnZmxvYXQzMicpIHtcbiAgICAgICAgICAgICAgICBpZiAocXVhbnRpemF0aW9uLmR0eXBlID09PSAndWludDgnIHx8IHF1YW50aXphdGlvbi5kdHlwZSA9PT0gJ3VpbnQxNicpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gbmV3IEZsb2F0MzJBcnJheShxdWFudGl6ZWRBcnJheS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHF1YW50aXplZEFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ID0gcXVhbnRpemVkQXJyYXlbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbaV0gPSB2ICogcXVhbnRpemF0aW9uLnNjYWxlICsgcXVhbnRpemF0aW9uLm1pbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChxdWFudGl6YXRpb24uZHR5cGUgPT09ICdmbG9hdDE2Jykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmxvYXQxNkRlY29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdDE2RGVjb2RlID0gZ2V0RmxvYXQxNkRlY29kZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBmbG9hdDE2RGVjb2RlKHF1YW50aXplZEFycmF5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgcXVhbnRpemF0aW9uIHR5cGUgJHtxdWFudGl6YXRpb24uZHR5cGV9IGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYGZvciB3ZWlnaHQgdHlwZSBmbG9hdDMyLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGR0eXBlID09PSAnaW50MzInKSB7XG4gICAgICAgICAgICAgICAgaWYgKHF1YW50aXphdGlvbi5kdHlwZSAhPT0gJ3VpbnQ4JyAmJiBxdWFudGl6YXRpb24uZHR5cGUgIT09ICd1aW50MTYnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgcXVhbnRpemF0aW9uIHR5cGUgJHtxdWFudGl6YXRpb24uZHR5cGV9IGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYGZvciB3ZWlnaHQgdHlwZSBpbnQzMi5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFsdWVzID0gbmV3IEludDMyQXJyYXkocXVhbnRpemVkQXJyYXkubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHF1YW50aXplZEFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHYgPSBxdWFudGl6ZWRBcnJheVtpXTtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzW2ldID0gTWF0aC5yb3VuZCh2ICogcXVhbnRpemF0aW9uLnNjYWxlICsgcXVhbnRpemF0aW9uLm1pbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBkdHlwZSBpbiB3ZWlnaHQgJyR7bmFtZX0nOiAke2R0eXBlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2Zmc2V0ICs9IHNpemUgKiBxdWFudGl6YXRpb25TaXplRmFjdG9yO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IHNpemVGcm9tU2hhcGUoc3BlYy5zaGFwZSk7XG4gICAgICAgICAgICB2YWx1ZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYnl0ZUxlbmd0aCA9IG5ldyBVaW50MzJBcnJheShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBOVU1fQllURVNfU1RSSU5HX0xFTkdUSCkpWzBdO1xuICAgICAgICAgICAgICAgIG9mZnNldCArPSBOVU1fQllURVNfU1RSSU5HX0xFTkdUSDtcbiAgICAgICAgICAgICAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIGJ5dGVMZW5ndGgpKTtcbiAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaChieXRlcyk7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGJ5dGVMZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBkdHlwZUZhY3RvciA9IERUWVBFX1ZBTFVFX1NJWkVfTUFQW2R0eXBlXTtcbiAgICAgICAgICAgIGNvbnN0IGJ5dGVCdWZmZXIgPSBidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBzaXplICogZHR5cGVGYWN0b3IpO1xuICAgICAgICAgICAgaWYgKGR0eXBlID09PSAnZmxvYXQzMicpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgRmxvYXQzMkFycmF5KGJ5dGVCdWZmZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZHR5cGUgPT09ICdpbnQzMicpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgSW50MzJBcnJheShieXRlQnVmZmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGR0eXBlID09PSAnYm9vbCcpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgVWludDhBcnJheShieXRlQnVmZmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBGbG9hdDMyQXJyYXkoYnl0ZUJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVhbCA9IG5ldyBGbG9hdDMyQXJyYXkodmFsdWVzLmxlbmd0aCAvIDIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGltYWdlID0gbmV3IEZsb2F0MzJBcnJheSh2YWx1ZXMubGVuZ3RoIC8gMik7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlYWxbaV0gPSB2YWx1ZXNbaSAqIDJdO1xuICAgICAgICAgICAgICAgICAgICBpbWFnZVtpXSA9IHZhbHVlc1tpICogMiArIDFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCByZWFsVGVuc29yID0gdGVuc29yKHJlYWwsIHNoYXBlLCAnZmxvYXQzMicpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGltYWdlVGVuc29yID0gdGVuc29yKGltYWdlLCBzaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICAgICAgICAgICAgICBvdXRbbmFtZV0gPSBjb21wbGV4KHJlYWxUZW5zb3IsIGltYWdlVGVuc29yKTtcbiAgICAgICAgICAgICAgICByZWFsVGVuc29yLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgICAgICBpbWFnZVRlbnNvci5kaXNwb3NlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGR0eXBlIGluIHdlaWdodCAnJHtuYW1lfSc6ICR7ZHR5cGV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZSAqIGR0eXBlRmFjdG9yO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkdHlwZSAhPT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgICAgIG91dFtuYW1lXSA9IHRlbnNvcih2YWx1ZXMsIHNoYXBlLCBkdHlwZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ29uY2F0ZW5hdGUgVHlwZWRBcnJheXMgaW50byBhbiBBcnJheUJ1ZmZlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmNhdGVuYXRlVHlwZWRBcnJheXMoeHMpIHtcbiAgICAvLyBUT0RPKGFkYXJvYiwgY2Fpcyk6IFN1cHBvcnQgcXVhbnRpemF0aW9uLlxuICAgIGlmICh4cyA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaW5wdXQgdmFsdWU6ICR7SlNPTi5zdHJpbmdpZnkoeHMpfWApO1xuICAgIH1cbiAgICBsZXQgdG90YWxCeXRlTGVuZ3RoID0gMDtcbiAgICAvLyBgbm9ybWFsaXplZFhzYCBpcyBoZXJlIGZvciB0aGlzIHJlYXNvbjogYSBgVHlwZWRBcnJheWAncyBgYnVmZmVyJ1xuICAgIC8vIGNhbiBoYXZlIGEgZGlmZmVyZW50IGJ5dGUgbGVuZ3RoIGZyb20gdGhhdCBvZiB0aGUgYFR5cGVkQXJyYXlgIGl0c2VsZixcbiAgICAvLyBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgYFR5cGVkQXJyYXlgIGlzIGNyZWF0ZWQgZnJvbSBhbiBvZmZzZXQgaW4gYW5cbiAgICAvLyBgQXJyYXlCdWZmZXJgLiBgbm9ybWxpYXplZFhzYCBob2xkcyBgVHlwZWRBcnJheWBzIHdob3NlIGBidWZmZXJgcyBtYXRjaFxuICAgIC8vIHRoZSBgVHlwZWRBcnJheWAgaW4gYnl0ZSBsZW5ndGguIElmIGFuIGVsZW1lbnQgb2YgYHhzYCBkb2VzIG5vdCBzaG93XG4gICAgLy8gdGhpcyBwcm9wZXJ0eSwgYSBuZXcgYFR5cGVkQXJyYXlgIHRoYXQgc2F0aXNmeSB0aGlzIHByb3BlcnR5IHdpbGwgYmVcbiAgICAvLyBjb25zdHJ1Y3RlZCBhbmQgcHVzaGVkIGludG8gYG5vcm1hbGl6ZWRYc2AuXG4gICAgY29uc3Qgbm9ybWFsaXplZFhzID0gW107XG4gICAgeHMuZm9yRWFjaCgoeCkgPT4ge1xuICAgICAgICB0b3RhbEJ5dGVMZW5ndGggKz0geC5ieXRlTGVuZ3RoO1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby1hbnlcbiAgICAgICAgbm9ybWFsaXplZFhzLnB1c2goeC5ieXRlTGVuZ3RoID09PSB4LmJ1ZmZlci5ieXRlTGVuZ3RoID8geCA6XG4gICAgICAgICAgICBuZXcgeC5jb25zdHJ1Y3Rvcih4KSk7XG4gICAgICAgIGlmICghKHggaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkgfHwgeCBpbnN0YW5jZW9mIEludDMyQXJyYXkgfHxcbiAgICAgICAgICAgIHggaW5zdGFuY2VvZiBVaW50OEFycmF5KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBUeXBlZEFycmF5IHN1YnR5cGU6ICR7eC5jb25zdHJ1Y3Rvci5uYW1lfWApO1xuICAgICAgICB9XG4gICAgICAgIC8vIHRzbGludDplbmFibGU6bm8tYW55XG4gICAgfSk7XG4gICAgY29uc3QgeSA9IG5ldyBVaW50OEFycmF5KHRvdGFsQnl0ZUxlbmd0aCk7XG4gICAgbGV0IG9mZnNldCA9IDA7XG4gICAgbm9ybWFsaXplZFhzLmZvckVhY2goKHgpID0+IHtcbiAgICAgICAgeS5zZXQobmV3IFVpbnQ4QXJyYXkoeC5idWZmZXIpLCBvZmZzZXQpO1xuICAgICAgICBvZmZzZXQgKz0geC5ieXRlTGVuZ3RoO1xuICAgIH0pO1xuICAgIHJldHVybiB5LmJ1ZmZlcjtcbn1cbi8vIFVzZSBCdWZmZXIgb24gTm9kZS5qcyBpbnN0ZWFkIG9mIEJsb2IvYXRvYi9idG9hXG5jb25zdCB1c2VOb2RlQnVmZmVyID0gdHlwZW9mIEJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAodHlwZW9mIEJsb2IgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBhdG9iID09PSAndW5kZWZpbmVkJyB8fFxuICAgICAgICB0eXBlb2YgYnRvYSA9PT0gJ3VuZGVmaW5lZCcpO1xuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIGJ5dGUgbGVuZ3RoIG9mIGEgSmF2YVNjcmlwdCBzdHJpbmcuXG4gKlxuICogTm90ZSB0aGF0IGEgSmF2YVNjcmlwdCBzdHJpbmcgY2FuIGNvbnRhaW4gd2lkZSBjaGFyYWN0ZXJzLCB0aGVyZWZvcmUgdGhlXG4gKiBsZW5ndGggb2YgdGhlIHN0cmluZyBpcyBub3QgbmVjZXNzYXJpbHkgZXF1YWwgdG8gdGhlIGJ5dGUgbGVuZ3RoLlxuICpcbiAqIEBwYXJhbSBzdHIgSW5wdXQgc3RyaW5nLlxuICogQHJldHVybnMgQnl0ZSBsZW5ndGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdCeXRlTGVuZ3RoKHN0cikge1xuICAgIGlmICh1c2VOb2RlQnVmZmVyKSB7XG4gICAgICAgIHJldHVybiBCdWZmZXIuYnl0ZUxlbmd0aChzdHIpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEJsb2IoW3N0cl0pLnNpemU7XG59XG4vKipcbiAqIEVuY29kZSBhbiBBcnJheUJ1ZmZlciBhcyBhIGJhc2U2NCBlbmNvZGVkIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gYnVmZmVyIGBBcnJheUJ1ZmZlcmAgdG8gYmUgY29udmVydGVkLlxuICogQHJldHVybnMgQSBzdHJpbmcgdGhhdCBiYXNlNjQtZW5jb2RlcyBgYnVmZmVyYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFycmF5QnVmZmVyVG9CYXNlNjRTdHJpbmcoYnVmZmVyKSB7XG4gICAgaWYgKHVzZU5vZGVCdWZmZXIpIHtcbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGJ1ZmZlcikudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgIH1cbiAgICBjb25zdCBidWYgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xuICAgIGxldCBzID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSBidWYubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gYnRvYShzKTtcbn1cbi8qKlxuICogRGVjb2RlIGEgYmFzZTY0IHN0cmluZyBhcyBhbiBBcnJheUJ1ZmZlci5cbiAqXG4gKiBAcGFyYW0gc3RyIEJhc2U2NCBzdHJpbmcuXG4gKiBAcmV0dXJucyBEZWNvZGVkIGBBcnJheUJ1ZmZlcmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiYXNlNjRTdHJpbmdUb0FycmF5QnVmZmVyKHN0cikge1xuICAgIGlmICh1c2VOb2RlQnVmZmVyKSB7XG4gICAgICAgIGNvbnN0IGJ1ZiA9IEJ1ZmZlci5mcm9tKHN0ciwgJ2Jhc2U2NCcpO1xuICAgICAgICByZXR1cm4gYnVmLmJ1ZmZlci5zbGljZShidWYuYnl0ZU9mZnNldCwgYnVmLmJ5dGVPZmZzZXQgKyBidWYuYnl0ZUxlbmd0aCk7XG4gICAgfVxuICAgIGNvbnN0IHMgPSBhdG9iKHN0cik7XG4gICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkocy5sZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBidWZmZXIuc2V0KFtzLmNoYXJDb2RlQXQoaSldLCBpKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1ZmZlci5idWZmZXI7XG59XG4vKipcbiAqIENvbmNhdGVuYXRlIGEgbnVtYmVyIG9mIEFycmF5QnVmZmVycyBpbnRvIG9uZS5cbiAqXG4gKiBAcGFyYW0gYnVmZmVycyBBIG51bWJlciBvZiBhcnJheSBidWZmZXJzIHRvIGNvbmNhdGVuYXRlLlxuICogQHJldHVybnMgUmVzdWx0IG9mIGNvbmNhdGVuYXRpbmcgYGJ1ZmZlcnNgIGluIG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uY2F0ZW5hdGVBcnJheUJ1ZmZlcnMoYnVmZmVycykge1xuICAgIGlmIChidWZmZXJzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gYnVmZmVyc1swXTtcbiAgICB9XG4gICAgbGV0IHRvdGFsQnl0ZUxlbmd0aCA9IDA7XG4gICAgYnVmZmVycy5mb3JFYWNoKChidWZmZXIpID0+IHtcbiAgICAgICAgdG90YWxCeXRlTGVuZ3RoICs9IGJ1ZmZlci5ieXRlTGVuZ3RoO1xuICAgIH0pO1xuICAgIGNvbnN0IHRlbXAgPSBuZXcgVWludDhBcnJheSh0b3RhbEJ5dGVMZW5ndGgpO1xuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIGJ1ZmZlcnMuZm9yRWFjaCgoYnVmZmVyKSA9PiB7XG4gICAgICAgIHRlbXAuc2V0KG5ldyBVaW50OEFycmF5KGJ1ZmZlciksIG9mZnNldCk7XG4gICAgICAgIG9mZnNldCArPSBidWZmZXIuYnl0ZUxlbmd0aDtcbiAgICB9KTtcbiAgICByZXR1cm4gdGVtcC5idWZmZXI7XG59XG4vKipcbiAqIEdldCB0aGUgYmFzZW5hbWUgb2YgYSBwYXRoLlxuICpcbiAqIEJlaGF2ZXMgaW4gYSB3YXkgYW5hbG9nb3VzIHRvIExpbnV4J3MgYmFzZW5hbWUgY29tbWFuZC5cbiAqXG4gKiBAcGFyYW0gcGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gYmFzZW5hbWUocGF0aCkge1xuICAgIGNvbnN0IFNFUEFSQVRPUiA9ICcvJztcbiAgICBwYXRoID0gcGF0aC50cmltKCk7XG4gICAgd2hpbGUgKHBhdGguZW5kc1dpdGgoU0VQQVJBVE9SKSkge1xuICAgICAgICBwYXRoID0gcGF0aC5zbGljZSgwLCBwYXRoLmxlbmd0aCAtIDEpO1xuICAgIH1cbiAgICBjb25zdCBpdGVtcyA9IHBhdGguc3BsaXQoU0VQQVJBVE9SKTtcbiAgICByZXR1cm4gaXRlbXNbaXRlbXMubGVuZ3RoIC0gMV07XG59XG4vKipcbiAqIENyZWF0ZSBgTW9kZWxKU09OYCBmcm9tIGBNb2RlbEFydGlmYWN0c2AuXG4gKlxuICogQHBhcmFtIGFydGlmYWN0cyBNb2RlbCBhcnRpZmFjdHMsIGRlc2NyaWJpbmcgdGhlIG1vZGVsIGFuZCBpdHMgd2VpZ2h0cy5cbiAqIEBwYXJhbSBtYW5pZmVzdCBXZWlnaHQgbWFuaWZlc3QsIGRlc2NyaWJpbmcgd2hlcmUgdGhlIHdlaWdodHMgb2YgdGhlXG4gKiAgICAgYE1vZGVsQXJ0aWZhY3RzYCBhcmUgc3RvcmVkLCBhbmQgc29tZSBtZXRhZGF0YSBhYm91dCB0aGVtLlxuICogQHJldHVybnMgT2JqZWN0IHJlcHJlc2VudGluZyB0aGUgYG1vZGVsLmpzb25gIGZpbGUgZGVzY3JpYmluZyB0aGUgbW9kZWxcbiAqICAgICBhcnRpZmFjdHMgYW5kIHdlaWdodHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1vZGVsSlNPTkZvck1vZGVsQXJ0aWZhY3RzKGFydGlmYWN0cywgbWFuaWZlc3QpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgIG1vZGVsVG9wb2xvZ3k6IGFydGlmYWN0cy5tb2RlbFRvcG9sb2d5LFxuICAgICAgICBmb3JtYXQ6IGFydGlmYWN0cy5mb3JtYXQsXG4gICAgICAgIGdlbmVyYXRlZEJ5OiBhcnRpZmFjdHMuZ2VuZXJhdGVkQnksXG4gICAgICAgIGNvbnZlcnRlZEJ5OiBhcnRpZmFjdHMuY29udmVydGVkQnksXG4gICAgICAgIHdlaWdodHNNYW5pZmVzdDogbWFuaWZlc3RcbiAgICB9O1xuICAgIGlmIChhcnRpZmFjdHMuc2lnbmF0dXJlICE9IG51bGwpIHtcbiAgICAgICAgcmVzdWx0LnNpZ25hdHVyZSA9IGFydGlmYWN0cy5zaWduYXR1cmU7XG4gICAgfVxuICAgIGlmIChhcnRpZmFjdHMudXNlckRlZmluZWRNZXRhZGF0YSAhPSBudWxsKSB7XG4gICAgICAgIHJlc3VsdC51c2VyRGVmaW5lZE1ldGFkYXRhID0gYXJ0aWZhY3RzLnVzZXJEZWZpbmVkTWV0YWRhdGE7XG4gICAgfVxuICAgIGlmIChhcnRpZmFjdHMubW9kZWxJbml0aWFsaXplciAhPSBudWxsKSB7XG4gICAgICAgIHJlc3VsdC5tb2RlbEluaXRpYWxpemVyID0gYXJ0aWZhY3RzLm1vZGVsSW5pdGlhbGl6ZXI7XG4gICAgfVxuICAgIGlmIChhcnRpZmFjdHMudHJhaW5pbmdDb25maWcgIT0gbnVsbCkge1xuICAgICAgICByZXN1bHQudHJhaW5pbmdDb25maWcgPSBhcnRpZmFjdHMudHJhaW5pbmdDb25maWc7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIENyZWF0ZSBgTW9kZWxBcnRpZmFjdHNgIGZyb20gYSBKU09OIGZpbGUuXG4gKlxuICogQHBhcmFtIG1vZGVsSlNPTiBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyc2VkIEpTT04gb2YgYG1vZGVsLmpzb25gXG4gKiBAcGFyYW0gbG9hZFdlaWdodHMgRnVuY3Rpb24gdGhhdCB0YWtlcyB0aGUgSlNPTiBmaWxlJ3Mgd2VpZ2h0cyBtYW5pZmVzdCxcbiAqICAgICByZWFkcyB3ZWlnaHRzIGZyb20gdGhlIGxpc3RlZCBwYXRoKHMpLCBhbmQgcmV0dXJucyBhIFByb21pc2Ugb2YgdGhlXG4gKiAgICAgd2VpZ2h0IG1hbmlmZXN0IGVudHJpZXMgYWxvbmcgd2l0aCB0aGUgd2VpZ2h0cyBkYXRhLlxuICogQHJldHVybnMgQSBQcm9taXNlIG9mIHRoZSBgTW9kZWxBcnRpZmFjdHNgLCBhcyBkZXNjcmliZWQgYnkgdGhlIEpTT04gZmlsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE1vZGVsQXJ0aWZhY3RzRm9ySlNPTihtb2RlbEpTT04sIGxvYWRXZWlnaHRzKSB7XG4gICAgY29uc3QgbW9kZWxBcnRpZmFjdHMgPSB7XG4gICAgICAgIG1vZGVsVG9wb2xvZ3k6IG1vZGVsSlNPTi5tb2RlbFRvcG9sb2d5LFxuICAgICAgICBmb3JtYXQ6IG1vZGVsSlNPTi5mb3JtYXQsXG4gICAgICAgIGdlbmVyYXRlZEJ5OiBtb2RlbEpTT04uZ2VuZXJhdGVkQnksXG4gICAgICAgIGNvbnZlcnRlZEJ5OiBtb2RlbEpTT04uY29udmVydGVkQnlcbiAgICB9O1xuICAgIGlmIChtb2RlbEpTT04udHJhaW5pbmdDb25maWcgIT0gbnVsbCkge1xuICAgICAgICBtb2RlbEFydGlmYWN0cy50cmFpbmluZ0NvbmZpZyA9IG1vZGVsSlNPTi50cmFpbmluZ0NvbmZpZztcbiAgICB9XG4gICAgaWYgKG1vZGVsSlNPTi53ZWlnaHRzTWFuaWZlc3QgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBbd2VpZ2h0U3BlY3MsIHdlaWdodERhdGFdID0gYXdhaXQgbG9hZFdlaWdodHMobW9kZWxKU09OLndlaWdodHNNYW5pZmVzdCk7XG4gICAgICAgIG1vZGVsQXJ0aWZhY3RzLndlaWdodFNwZWNzID0gd2VpZ2h0U3BlY3M7XG4gICAgICAgIG1vZGVsQXJ0aWZhY3RzLndlaWdodERhdGEgPSB3ZWlnaHREYXRhO1xuICAgIH1cbiAgICBpZiAobW9kZWxKU09OLnNpZ25hdHVyZSAhPSBudWxsKSB7XG4gICAgICAgIG1vZGVsQXJ0aWZhY3RzLnNpZ25hdHVyZSA9IG1vZGVsSlNPTi5zaWduYXR1cmU7XG4gICAgfVxuICAgIGlmIChtb2RlbEpTT04udXNlckRlZmluZWRNZXRhZGF0YSAhPSBudWxsKSB7XG4gICAgICAgIG1vZGVsQXJ0aWZhY3RzLnVzZXJEZWZpbmVkTWV0YWRhdGEgPSBtb2RlbEpTT04udXNlckRlZmluZWRNZXRhZGF0YTtcbiAgICB9XG4gICAgaWYgKG1vZGVsSlNPTi5tb2RlbEluaXRpYWxpemVyICE9IG51bGwpIHtcbiAgICAgICAgbW9kZWxBcnRpZmFjdHMubW9kZWxJbml0aWFsaXplciA9IG1vZGVsSlNPTi5tb2RlbEluaXRpYWxpemVyO1xuICAgIH1cbiAgICByZXR1cm4gbW9kZWxBcnRpZmFjdHM7XG59XG4vKipcbiAqIFBvcHVsYXRlIE1vZGVsQXJ0aWZhY3RzSW5mbyBmaWVsZHMgZm9yIGEgbW9kZWwgd2l0aCBKU09OIHRvcG9sb2d5LlxuICogQHBhcmFtIG1vZGVsQXJ0aWZhY3RzXG4gKiBAcmV0dXJucyBBIE1vZGVsQXJ0aWZhY3RzSW5mbyBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNb2RlbEFydGlmYWN0c0luZm9Gb3JKU09OKG1vZGVsQXJ0aWZhY3RzKSB7XG4gICAgaWYgKG1vZGVsQXJ0aWZhY3RzLm1vZGVsVG9wb2xvZ3kgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIEpTT04gbW9kZWwgdG9wb2xvZ3ksIHJlY2VpdmVkIEFycmF5QnVmZmVyLicpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBkYXRlU2F2ZWQ6IG5ldyBEYXRlKCksXG4gICAgICAgIG1vZGVsVG9wb2xvZ3lUeXBlOiAnSlNPTicsXG4gICAgICAgIG1vZGVsVG9wb2xvZ3lCeXRlczogbW9kZWxBcnRpZmFjdHMubW9kZWxUb3BvbG9neSA9PSBudWxsID9cbiAgICAgICAgICAgIDAgOlxuICAgICAgICAgICAgc3RyaW5nQnl0ZUxlbmd0aChKU09OLnN0cmluZ2lmeShtb2RlbEFydGlmYWN0cy5tb2RlbFRvcG9sb2d5KSksXG4gICAgICAgIHdlaWdodFNwZWNzQnl0ZXM6IG1vZGVsQXJ0aWZhY3RzLndlaWdodFNwZWNzID09IG51bGwgP1xuICAgICAgICAgICAgMCA6XG4gICAgICAgICAgICBzdHJpbmdCeXRlTGVuZ3RoKEpTT04uc3RyaW5naWZ5KG1vZGVsQXJ0aWZhY3RzLndlaWdodFNwZWNzKSksXG4gICAgICAgIHdlaWdodERhdGFCeXRlczogbW9kZWxBcnRpZmFjdHMud2VpZ2h0RGF0YSA9PSBudWxsID9cbiAgICAgICAgICAgIDAgOlxuICAgICAgICAgICAgbW9kZWxBcnRpZmFjdHMud2VpZ2h0RGF0YS5ieXRlTGVuZ3RoLFxuICAgIH07XG59XG4vKipcbiAqIENvbXB1dGVzIG1hbnRpc2EgdGFibGUgZm9yIGNhc3RpbmcgRmxvYXQxNiB0byBGbG9hdDMyXG4gKiBTZWUgaHR0cDovL3d3dy5mb3gtdG9vbGtpdC5vcmcvZnRwL2Zhc3RoYWxmZmxvYXRjb252ZXJzaW9uLnBkZlxuICpcbiAqIEByZXR1cm5zIFVpbnQzMkFycmF5LCAyMDQ4IG1hbnRpc3NhIGxvb2t1cCB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVGbG9hdDE2TWFudGlzYVRhYmxlKCkge1xuICAgIGNvbnN0IGNvbnZlcnRNYW50aXNzYSA9IChpKSA9PiB7XG4gICAgICAgIGxldCBtID0gaSA8PCAxMztcbiAgICAgICAgbGV0IGUgPSAwO1xuICAgICAgICB3aGlsZSAoKG0gJiAweDAwODAwMDAwKSA9PT0gMCkge1xuICAgICAgICAgICAgZSAtPSAweDAwODAwMDAwO1xuICAgICAgICAgICAgbSA8PD0gMTtcbiAgICAgICAgfVxuICAgICAgICBtICY9IH4weDAwODAwMDAwO1xuICAgICAgICBlICs9IDB4Mzg4MDAwMDA7XG4gICAgICAgIHJldHVybiBtIHwgZTtcbiAgICB9O1xuICAgIGNvbnN0IG1hbnRpc2FUYWJsZSA9IG5ldyBVaW50MzJBcnJheSgyMDQ4KTtcbiAgICBtYW50aXNhVGFibGVbMF0gPSAwO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgMTAyNDsgaSsrKSB7XG4gICAgICAgIG1hbnRpc2FUYWJsZVtpXSA9IGNvbnZlcnRNYW50aXNzYShpKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDEwMjQ7IGkgPCAyMDQ4OyBpKyspIHtcbiAgICAgICAgbWFudGlzYVRhYmxlW2ldID0gMHgzODAwMDAwMCArICgoaSAtIDEwMjQpIDw8IDEzKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hbnRpc2FUYWJsZTtcbn1cbi8qKlxuICogQ29tcHV0ZXMgZXhwb25lbnQgdGFibGUgZm9yIGNhc3RpbmcgRmxvYXQxNiB0byBGbG9hdDMyXG4gKiBTZWUgaHR0cDovL3d3dy5mb3gtdG9vbGtpdC5vcmcvZnRwL2Zhc3RoYWxmZmxvYXRjb252ZXJzaW9uLnBkZlxuICpcbiAqIEByZXR1cm5zIFVpbnQzMkFycmF5LCA2NCBleHBvbmVudCBsb29rdXAgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBjb21wdXRlRmxvYXQxNkV4cG9uZW50VGFibGUoKSB7XG4gICAgY29uc3QgZXhwb25lbnRUYWJsZSA9IG5ldyBVaW50MzJBcnJheSg2NCk7XG4gICAgZXhwb25lbnRUYWJsZVswXSA9IDA7XG4gICAgZXhwb25lbnRUYWJsZVszMV0gPSAweDQ3ODAwMDAwO1xuICAgIGV4cG9uZW50VGFibGVbMzJdID0gMHg4MDAwMDAwMDtcbiAgICBleHBvbmVudFRhYmxlWzYzXSA9IDB4Yzc4MDAwMDA7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCAzMTsgaSsrKSB7XG4gICAgICAgIGV4cG9uZW50VGFibGVbaV0gPSBpIDw8IDIzO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMzM7IGkgPCA2MzsgaSsrKSB7XG4gICAgICAgIGV4cG9uZW50VGFibGVbaV0gPSAweDgwMDAwMDAwICsgKChpIC0gMzIpIDw8IDIzKTtcbiAgICB9XG4gICAgcmV0dXJuIGV4cG9uZW50VGFibGU7XG59XG4vKipcbiAqIENvbXB1dGVzIG9mZnNldCB0YWJsZSBmb3IgY2FzdGluZyBGbG9hdDE2IHRvIEZsb2F0MzJcbiAqIFNlZSBodHRwOi8vd3d3LmZveC10b29sa2l0Lm9yZy9mdHAvZmFzdGhhbGZmbG9hdGNvbnZlcnNpb24ucGRmXG4gKlxuICogQHJldHVybnMgVWludDMyQXJyYXksIDZkIG9mZnNldCB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVGbG9hdDE2T2Zmc2V0VGFibGUoKSB7XG4gICAgY29uc3Qgb2Zmc2V0VGFibGUgPSBuZXcgVWludDMyQXJyYXkoNjQpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNjQ7IGkrKykge1xuICAgICAgICBvZmZzZXRUYWJsZVtpXSA9IDEwMjQ7XG4gICAgfVxuICAgIG9mZnNldFRhYmxlWzBdID0gb2Zmc2V0VGFibGVbMzJdID0gMDtcbiAgICByZXR1cm4gb2Zmc2V0VGFibGU7XG59XG4vKipcbiAqIFJldHJpZXZlIGEgRmxvYXQxNiBkZWNvZGVyIHdoaWNoIHdpbGwgZGVjb2RlIGEgQnl0ZUFycmF5IG9mIEZsb2F0MTYgdmFsdWVzXG4gKiB0byBhIEZsb2F0MzJBcnJheS5cbiAqXG4gKiBAcmV0dXJucyBGdW5jdGlvbiAoYnVmZmVyOiBVaW50MTZBcnJheSkgPT4gRmxvYXQzMkFycmF5IHdoaWNoIGRlY29kZXNcbiAqICAgICAgICAgIHRoZSBVaW50MTZBcnJheSBvZiBGbG9hdDE2IGJ5dGVzIHRvIGEgRmxvYXQzMkFycmF5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmxvYXQxNkRlY29kZXIoKSB7XG4gICAgLy8gQWxnb3JpdGhtIGlzIGJhc2VkIG9mZiBvZlxuICAgIC8vIGh0dHA6Ly93d3cuZm94LXRvb2xraXQub3JnL2Z0cC9mYXN0aGFsZmZsb2F0Y29udmVyc2lvbi5wZGZcbiAgICAvLyBDYWNoZSBsb29rdXAgdGFibGVzXG4gICAgY29uc3QgbWFudGlzYVRhYmxlID0gY29tcHV0ZUZsb2F0MTZNYW50aXNhVGFibGUoKTtcbiAgICBjb25zdCBleHBvbmVudFRhYmxlID0gY29tcHV0ZUZsb2F0MTZFeHBvbmVudFRhYmxlKCk7XG4gICAgY29uc3Qgb2Zmc2V0VGFibGUgPSBjb21wdXRlRmxvYXQxNk9mZnNldFRhYmxlKCk7XG4gICAgcmV0dXJuIChxdWFudGl6ZWRBcnJheSkgPT4ge1xuICAgICAgICBjb25zdCBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoNCAqIHF1YW50aXplZEFycmF5Lmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IGJ1ZmZlclVpbnQzMlZpZXcgPSBuZXcgVWludDMyQXJyYXkoYnVmZmVyKTtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHF1YW50aXplZEFycmF5Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgZmxvYXQxNkJpdHMgPSBxdWFudGl6ZWRBcnJheVtpbmRleF07XG4gICAgICAgICAgICBjb25zdCBmbG9hdDMyQml0cyA9IG1hbnRpc2FUYWJsZVtvZmZzZXRUYWJsZVtmbG9hdDE2Qml0cyA+PiAxMF0gKyAoZmxvYXQxNkJpdHMgJiAweDNmZildICtcbiAgICAgICAgICAgICAgICBleHBvbmVudFRhYmxlW2Zsb2F0MTZCaXRzID4+IDEwXTtcbiAgICAgICAgICAgIGJ1ZmZlclVpbnQzMlZpZXdbaW5kZXhdID0gZmxvYXQzMkJpdHM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoYnVmZmVyKTtcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW9fdXRpbHMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0ICcuLi9mbGFncyc7XG5pbXBvcnQgeyBlbnYgfSBmcm9tICcuLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IGFycmF5QnVmZmVyVG9CYXNlNjRTdHJpbmcsIGJhc2U2NFN0cmluZ1RvQXJyYXlCdWZmZXIsIGdldE1vZGVsQXJ0aWZhY3RzSW5mb0ZvckpTT04gfSBmcm9tICcuL2lvX3V0aWxzJztcbmltcG9ydCB7IElPUm91dGVyUmVnaXN0cnkgfSBmcm9tICcuL3JvdXRlcl9yZWdpc3RyeSc7XG5jb25zdCBQQVRIX1NFUEFSQVRPUiA9ICcvJztcbmNvbnN0IFBBVEhfUFJFRklYID0gJ3RlbnNvcmZsb3dqc19tb2RlbHMnO1xuY29uc3QgSU5GT19TVUZGSVggPSAnaW5mbyc7XG5jb25zdCBNT0RFTF9UT1BPTE9HWV9TVUZGSVggPSAnbW9kZWxfdG9wb2xvZ3knO1xuY29uc3QgV0VJR0hUX1NQRUNTX1NVRkZJWCA9ICd3ZWlnaHRfc3BlY3MnO1xuY29uc3QgV0VJR0hUX0RBVEFfU1VGRklYID0gJ3dlaWdodF9kYXRhJztcbmNvbnN0IE1PREVMX01FVEFEQVRBX1NVRkZJWCA9ICdtb2RlbF9tZXRhZGF0YSc7XG4vKipcbiAqIFB1cmdlIGFsbCB0ZW5zb3JmbG93LmpzLXNhdmVkIG1vZGVsIGFydGlmYWN0cyBmcm9tIGxvY2FsIHN0b3JhZ2UuXG4gKlxuICogQHJldHVybnMgUGF0aHMgb2YgdGhlIG1vZGVscyBwdXJnZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwdXJnZUxvY2FsU3RvcmFnZUFydGlmYWN0cygpIHtcbiAgICBpZiAoIWVudigpLmdldEJvb2woJ0lTX0JST1dTRVInKSB8fCB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyB8fFxuICAgICAgICB0eXBlb2Ygd2luZG93LmxvY2FsU3RvcmFnZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwdXJnZUxvY2FsU3RvcmFnZU1vZGVscygpIGNhbm5vdCBwcm9jZWVkIGJlY2F1c2UgbG9jYWwgc3RvcmFnZSBpcyAnICtcbiAgICAgICAgICAgICd1bmF2YWlsYWJsZSBpbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudC4nKTtcbiAgICB9XG4gICAgY29uc3QgTFMgPSB3aW5kb3cubG9jYWxTdG9yYWdlO1xuICAgIGNvbnN0IHB1cmdlZE1vZGVsUGF0aHMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IExTLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IExTLmtleShpKTtcbiAgICAgICAgY29uc3QgcHJlZml4ID0gUEFUSF9QUkVGSVggKyBQQVRIX1NFUEFSQVRPUjtcbiAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKHByZWZpeCkgJiYga2V5Lmxlbmd0aCA+IHByZWZpeC5sZW5ndGgpIHtcbiAgICAgICAgICAgIExTLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgICAgICAgIGNvbnN0IG1vZGVsTmFtZSA9IGdldE1vZGVsUGF0aEZyb21LZXkoa2V5KTtcbiAgICAgICAgICAgIGlmIChwdXJnZWRNb2RlbFBhdGhzLmluZGV4T2YobW9kZWxOYW1lKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBwdXJnZWRNb2RlbFBhdGhzLnB1c2gobW9kZWxOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHVyZ2VkTW9kZWxQYXRocztcbn1cbmZ1bmN0aW9uIGdldE1vZGVsS2V5cyhwYXRoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaW5mbzogW1BBVEhfUFJFRklYLCBwYXRoLCBJTkZPX1NVRkZJWF0uam9pbihQQVRIX1NFUEFSQVRPUiksXG4gICAgICAgIHRvcG9sb2d5OiBbUEFUSF9QUkVGSVgsIHBhdGgsIE1PREVMX1RPUE9MT0dZX1NVRkZJWF0uam9pbihQQVRIX1NFUEFSQVRPUiksXG4gICAgICAgIHdlaWdodFNwZWNzOiBbUEFUSF9QUkVGSVgsIHBhdGgsIFdFSUdIVF9TUEVDU19TVUZGSVhdLmpvaW4oUEFUSF9TRVBBUkFUT1IpLFxuICAgICAgICB3ZWlnaHREYXRhOiBbUEFUSF9QUkVGSVgsIHBhdGgsIFdFSUdIVF9EQVRBX1NVRkZJWF0uam9pbihQQVRIX1NFUEFSQVRPUiksXG4gICAgICAgIG1vZGVsTWV0YWRhdGE6IFtQQVRIX1BSRUZJWCwgcGF0aCwgTU9ERUxfTUVUQURBVEFfU1VGRklYXS5qb2luKFBBVEhfU0VQQVJBVE9SKVxuICAgIH07XG59XG5mdW5jdGlvbiByZW1vdmVJdGVtcyhrZXlzKSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LnZhbHVlcyhrZXlzKSkge1xuICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICB9XG59XG4vKipcbiAqIEdldCBtb2RlbCBwYXRoIGZyb20gYSBsb2NhbC1zdG9yYWdlIGtleS5cbiAqXG4gKiBFLmcuLCAndGVuc29yZmxvd2pzX21vZGVscy9teS9tb2RlbC8xL2luZm8nIC0tPiAnbXkvbW9kZWwvMSdcbiAqXG4gKiBAcGFyYW0ga2V5XG4gKi9cbmZ1bmN0aW9uIGdldE1vZGVsUGF0aEZyb21LZXkoa2V5KSB7XG4gICAgY29uc3QgaXRlbXMgPSBrZXkuc3BsaXQoUEFUSF9TRVBBUkFUT1IpO1xuICAgIGlmIChpdGVtcy5sZW5ndGggPCAzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBrZXkgZm9ybWF0OiAke2tleX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zLnNsaWNlKDEsIGl0ZW1zLmxlbmd0aCAtIDEpLmpvaW4oUEFUSF9TRVBBUkFUT1IpO1xufVxuZnVuY3Rpb24gbWF5YmVTdHJpcFNjaGVtZShrZXkpIHtcbiAgICByZXR1cm4ga2V5LnN0YXJ0c1dpdGgoQnJvd3NlckxvY2FsU3RvcmFnZS5VUkxfU0NIRU1FKSA/XG4gICAgICAgIGtleS5zbGljZShCcm93c2VyTG9jYWxTdG9yYWdlLlVSTF9TQ0hFTUUubGVuZ3RoKSA6XG4gICAgICAgIGtleTtcbn1cbi8qKlxuICogSU9IYW5kbGVyIHN1YmNsYXNzOiBCcm93c2VyIExvY2FsIFN0b3JhZ2UuXG4gKlxuICogU2VlIHRoZSBkb2Mgc3RyaW5nIHRvIGBicm93c2VyTG9jYWxTdG9yYWdlYCBmb3IgbW9yZSBkZXRhaWxzLlxuICovXG5leHBvcnQgY2xhc3MgQnJvd3NlckxvY2FsU3RvcmFnZSB7XG4gICAgY29uc3RydWN0b3IobW9kZWxQYXRoKSB7XG4gICAgICAgIGlmICghZW52KCkuZ2V0Qm9vbCgnSVNfQlJPV1NFUicpIHx8IHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAgICAgICB0eXBlb2Ygd2luZG93LmxvY2FsU3RvcmFnZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIC8vIFRPRE8oY2Fpcyk6IEFkZCBtb3JlIGluZm8gYWJvdXQgd2hhdCBJT0hhbmRsZXIgc3VidHlwZXMgYXJlXG4gICAgICAgICAgICAvLyBhdmFpbGFibGUuXG4gICAgICAgICAgICAvLyAgIE1heWJlIHBvaW50IHRvIGEgZG9jIHBhZ2Ugb24gdGhlIHdlYiBhbmQvb3IgYXV0b21hdGljYWxseSBkZXRlcm1pbmVcbiAgICAgICAgICAgIC8vICAgdGhlIGF2YWlsYWJsZSBJT0hhbmRsZXJzIGFuZCBwcmludCB0aGVtIGluIHRoZSBlcnJvciBtZXNzYWdlLlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgY3VycmVudCBlbnZpcm9ubWVudCBkb2VzIG5vdCBzdXBwb3J0IGxvY2FsIHN0b3JhZ2UuJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5MUyA9IHdpbmRvdy5sb2NhbFN0b3JhZ2U7XG4gICAgICAgIGlmIChtb2RlbFBhdGggPT0gbnVsbCB8fCAhbW9kZWxQYXRoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvciBsb2NhbCBzdG9yYWdlLCBtb2RlbFBhdGggbXVzdCBub3QgYmUgbnVsbCwgdW5kZWZpbmVkIG9yIGVtcHR5LicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubW9kZWxQYXRoID0gbW9kZWxQYXRoO1xuICAgICAgICB0aGlzLmtleXMgPSBnZXRNb2RlbEtleXModGhpcy5tb2RlbFBhdGgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTYXZlIG1vZGVsIGFydGlmYWN0cyB0byBicm93c2VyIGxvY2FsIHN0b3JhZ2UuXG4gICAgICpcbiAgICAgKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gdG8gYGJyb3dzZXJMb2NhbFN0b3JhZ2VgIGZvciBkZXRhaWxzIG9uIHRoZSBzYXZlZFxuICAgICAqIGFydGlmYWN0cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtb2RlbEFydGlmYWN0cyBUaGUgbW9kZWwgYXJ0aWZhY3RzIHRvIGJlIHN0b3JlZC5cbiAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiBTYXZlUmVzdWx0LlxuICAgICAqL1xuICAgIGFzeW5jIHNhdmUobW9kZWxBcnRpZmFjdHMpIHtcbiAgICAgICAgaWYgKG1vZGVsQXJ0aWZhY3RzLm1vZGVsVG9wb2xvZ3kgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCcm93c2VyTG9jYWxTdG9yYWdlLnNhdmUoKSBkb2VzIG5vdCBzdXBwb3J0IHNhdmluZyBtb2RlbCB0b3BvbG9neSAnICtcbiAgICAgICAgICAgICAgICAnaW4gYmluYXJ5IGZvcm1hdHMgeWV0LicpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdG9wb2xvZ3kgPSBKU09OLnN0cmluZ2lmeShtb2RlbEFydGlmYWN0cy5tb2RlbFRvcG9sb2d5KTtcbiAgICAgICAgICAgIGNvbnN0IHdlaWdodFNwZWNzID0gSlNPTi5zdHJpbmdpZnkobW9kZWxBcnRpZmFjdHMud2VpZ2h0U3BlY3MpO1xuICAgICAgICAgICAgY29uc3QgbW9kZWxBcnRpZmFjdHNJbmZvID0gZ2V0TW9kZWxBcnRpZmFjdHNJbmZvRm9ySlNPTihtb2RlbEFydGlmYWN0cyk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuTFMuc2V0SXRlbSh0aGlzLmtleXMuaW5mbywgSlNPTi5zdHJpbmdpZnkobW9kZWxBcnRpZmFjdHNJbmZvKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5MUy5zZXRJdGVtKHRoaXMua2V5cy50b3BvbG9neSwgdG9wb2xvZ3kpO1xuICAgICAgICAgICAgICAgIHRoaXMuTFMuc2V0SXRlbSh0aGlzLmtleXMud2VpZ2h0U3BlY3MsIHdlaWdodFNwZWNzKTtcbiAgICAgICAgICAgICAgICB0aGlzLkxTLnNldEl0ZW0odGhpcy5rZXlzLndlaWdodERhdGEsIGFycmF5QnVmZmVyVG9CYXNlNjRTdHJpbmcobW9kZWxBcnRpZmFjdHMud2VpZ2h0RGF0YSkpO1xuICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBKU09OLnN0cmluZ2lmeSBkb2Vzbid0IHdyaXRlIG91dCBrZXlzIHRoYXQgaGF2ZSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAvLyB2YWx1ZXMsIHNvIGZvciBzb21lIGtleXMsIHdlIHNldCB1bmRlZmluZWQgaW5zdGVhZCBvZiBhIG51bGwtaXNoXG4gICAgICAgICAgICAgICAgLy8gdmFsdWUuXG4gICAgICAgICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdDogbW9kZWxBcnRpZmFjdHMuZm9ybWF0LFxuICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRCeTogbW9kZWxBcnRpZmFjdHMuZ2VuZXJhdGVkQnksXG4gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZEJ5OiBtb2RlbEFydGlmYWN0cy5jb252ZXJ0ZWRCeSxcbiAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlOiBtb2RlbEFydGlmYWN0cy5zaWduYXR1cmUgIT0gbnVsbCA/XG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbEFydGlmYWN0cy5zaWduYXR1cmUgOlxuICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICB1c2VyRGVmaW5lZE1ldGFkYXRhOiBtb2RlbEFydGlmYWN0cy51c2VyRGVmaW5lZE1ldGFkYXRhICE9IG51bGwgP1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxBcnRpZmFjdHMudXNlckRlZmluZWRNZXRhZGF0YSA6XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIG1vZGVsSW5pdGlhbGl6ZXI6IG1vZGVsQXJ0aWZhY3RzLm1vZGVsSW5pdGlhbGl6ZXIgIT0gbnVsbCA/XG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbEFydGlmYWN0cy5tb2RlbEluaXRpYWxpemVyIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgdHJhaW5pbmdDb25maWc6IG1vZGVsQXJ0aWZhY3RzLnRyYWluaW5nQ29uZmlnICE9IG51bGwgP1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxBcnRpZmFjdHMudHJhaW5pbmdDb25maWcgOlxuICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLkxTLnNldEl0ZW0odGhpcy5rZXlzLm1vZGVsTWV0YWRhdGEsIEpTT04uc3RyaW5naWZ5KG1ldGFkYXRhKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbW9kZWxBcnRpZmFjdHNJbmZvIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgc2F2aW5nIGZhaWxlZCwgY2xlYW4gdXAgYWxsIGl0ZW1zIHNhdmVkIHNvIGZhci5cbiAgICAgICAgICAgICAgICByZW1vdmVJdGVtcyh0aGlzLmtleXMpO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHNhdmUgbW9kZWwgJyR7dGhpcy5tb2RlbFBhdGh9JyB0byBsb2NhbCBzdG9yYWdlOiBgICtcbiAgICAgICAgICAgICAgICAgICAgYHNpemUgcXVvdGEgYmVpbmcgZXhjZWVkZWQgaXMgYSBwb3NzaWJsZSBjYXVzZSBvZiB0aGlzIGZhaWx1cmU6IGAgK1xuICAgICAgICAgICAgICAgICAgICBgbW9kZWxUb3BvbG9neUJ5dGVzPSR7bW9kZWxBcnRpZmFjdHNJbmZvLm1vZGVsVG9wb2xvZ3lCeXRlc30sIGAgK1xuICAgICAgICAgICAgICAgICAgICBgd2VpZ2h0U3BlY3NCeXRlcz0ke21vZGVsQXJ0aWZhY3RzSW5mby53ZWlnaHRTcGVjc0J5dGVzfSwgYCArXG4gICAgICAgICAgICAgICAgICAgIGB3ZWlnaHREYXRhQnl0ZXM9JHttb2RlbEFydGlmYWN0c0luZm8ud2VpZ2h0RGF0YUJ5dGVzfS5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb2FkIGEgbW9kZWwgZnJvbSBsb2NhbCBzdG9yYWdlLlxuICAgICAqXG4gICAgICogU2VlIHRoZSBkb2N1bWVudGF0aW9uIHRvIGBicm93c2VyTG9jYWxTdG9yYWdlYCBmb3IgZGV0YWlscyBvbiB0aGUgc2F2ZWRcbiAgICAgKiBhcnRpZmFjdHMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgbG9hZGVkIG1vZGVsIChpZiBsb2FkaW5nIHN1Y2NlZWRzKS5cbiAgICAgKi9cbiAgICBhc3luYyBsb2FkKCkge1xuICAgICAgICBjb25zdCBpbmZvID0gSlNPTi5wYXJzZSh0aGlzLkxTLmdldEl0ZW0odGhpcy5rZXlzLmluZm8pKTtcbiAgICAgICAgaWYgKGluZm8gPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBsb2NhbCBzdG9yYWdlLCB0aGVyZSBpcyBubyBtb2RlbCB3aXRoIG5hbWUgJyR7dGhpcy5tb2RlbFBhdGh9J2ApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbmZvLm1vZGVsVG9wb2xvZ3lUeXBlICE9PSAnSlNPTicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnJvd3NlckxvY2FsU3RvcmFnZSBkb2VzIG5vdCBzdXBwb3J0IGxvYWRpbmcgbm9uLUpTT04gbW9kZWwgJyArXG4gICAgICAgICAgICAgICAgJ3RvcG9sb2d5IHlldC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvdXQgPSB7fTtcbiAgICAgICAgLy8gTG9hZCB0b3BvbG9neS5cbiAgICAgICAgY29uc3QgdG9wb2xvZ3kgPSBKU09OLnBhcnNlKHRoaXMuTFMuZ2V0SXRlbSh0aGlzLmtleXMudG9wb2xvZ3kpKTtcbiAgICAgICAgaWYgKHRvcG9sb2d5ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW4gbG9jYWwgc3RvcmFnZSwgdGhlIHRvcG9sb2d5IG9mIG1vZGVsICcke3RoaXMubW9kZWxQYXRofScgYCArXG4gICAgICAgICAgICAgICAgYGlzIG1pc3NpbmcuYCk7XG4gICAgICAgIH1cbiAgICAgICAgb3V0Lm1vZGVsVG9wb2xvZ3kgPSB0b3BvbG9neTtcbiAgICAgICAgLy8gTG9hZCB3ZWlnaHQgc3BlY3MuXG4gICAgICAgIGNvbnN0IHdlaWdodFNwZWNzID0gSlNPTi5wYXJzZSh0aGlzLkxTLmdldEl0ZW0odGhpcy5rZXlzLndlaWdodFNwZWNzKSk7XG4gICAgICAgIGlmICh3ZWlnaHRTcGVjcyA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluIGxvY2FsIHN0b3JhZ2UsIHRoZSB3ZWlnaHQgc3BlY3Mgb2YgbW9kZWwgJyR7dGhpcy5tb2RlbFBhdGh9JyBgICtcbiAgICAgICAgICAgICAgICBgYXJlIG1pc3NpbmcuYCk7XG4gICAgICAgIH1cbiAgICAgICAgb3V0LndlaWdodFNwZWNzID0gd2VpZ2h0U3BlY3M7XG4gICAgICAgIC8vIExvYWQgbWV0YS1kYXRhIGZpZWxkcy5cbiAgICAgICAgY29uc3QgbWV0YWRhdGFTdHJpbmcgPSB0aGlzLkxTLmdldEl0ZW0odGhpcy5rZXlzLm1vZGVsTWV0YWRhdGEpO1xuICAgICAgICBpZiAobWV0YWRhdGFTdHJpbmcgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBKU09OLnBhcnNlKG1ldGFkYXRhU3RyaW5nKTtcbiAgICAgICAgICAgIG91dC5mb3JtYXQgPSBtZXRhZGF0YS5mb3JtYXQ7XG4gICAgICAgICAgICBvdXQuZ2VuZXJhdGVkQnkgPSBtZXRhZGF0YS5nZW5lcmF0ZWRCeTtcbiAgICAgICAgICAgIG91dC5jb252ZXJ0ZWRCeSA9IG1ldGFkYXRhLmNvbnZlcnRlZEJ5O1xuICAgICAgICAgICAgaWYgKG1ldGFkYXRhLnNpZ25hdHVyZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgb3V0LnNpZ25hdHVyZSA9IG1ldGFkYXRhLnNpZ25hdHVyZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXRhZGF0YS51c2VyRGVmaW5lZE1ldGFkYXRhICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBvdXQudXNlckRlZmluZWRNZXRhZGF0YSA9IG1ldGFkYXRhLnVzZXJEZWZpbmVkTWV0YWRhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWV0YWRhdGEubW9kZWxJbml0aWFsaXplciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgb3V0Lm1vZGVsSW5pdGlhbGl6ZXIgPSBtZXRhZGF0YS5tb2RlbEluaXRpYWxpemVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1ldGFkYXRhLnRyYWluaW5nQ29uZmlnICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBvdXQudHJhaW5pbmdDb25maWcgPSBtZXRhZGF0YS50cmFpbmluZ0NvbmZpZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBMb2FkIHdlaWdodCBkYXRhLlxuICAgICAgICBjb25zdCB3ZWlnaHREYXRhQmFzZTY0ID0gdGhpcy5MUy5nZXRJdGVtKHRoaXMua2V5cy53ZWlnaHREYXRhKTtcbiAgICAgICAgaWYgKHdlaWdodERhdGFCYXNlNjQgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBsb2NhbCBzdG9yYWdlLCB0aGUgYmluYXJ5IHdlaWdodCB2YWx1ZXMgb2YgbW9kZWwgYCArXG4gICAgICAgICAgICAgICAgYCcke3RoaXMubW9kZWxQYXRofScgYXJlIG1pc3NpbmcuYCk7XG4gICAgICAgIH1cbiAgICAgICAgb3V0LndlaWdodERhdGEgPSBiYXNlNjRTdHJpbmdUb0FycmF5QnVmZmVyKHdlaWdodERhdGFCYXNlNjQpO1xuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cbn1cbkJyb3dzZXJMb2NhbFN0b3JhZ2UuVVJMX1NDSEVNRSA9ICdsb2NhbHN0b3JhZ2U6Ly8nO1xuZXhwb3J0IGNvbnN0IGxvY2FsU3RvcmFnZVJvdXRlciA9ICh1cmwpID0+IHtcbiAgICBpZiAoIWVudigpLmdldEJvb2woJ0lTX0JST1dTRVInKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh1cmwpICYmIHVybC5zdGFydHNXaXRoKEJyb3dzZXJMb2NhbFN0b3JhZ2UuVVJMX1NDSEVNRSkpIHtcbiAgICAgICAgICAgIHJldHVybiBicm93c2VyTG9jYWxTdG9yYWdlKHVybC5zbGljZShCcm93c2VyTG9jYWxTdG9yYWdlLlVSTF9TQ0hFTUUubGVuZ3RoKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn07XG5JT1JvdXRlclJlZ2lzdHJ5LnJlZ2lzdGVyU2F2ZVJvdXRlcihsb2NhbFN0b3JhZ2VSb3V0ZXIpO1xuSU9Sb3V0ZXJSZWdpc3RyeS5yZWdpc3RlckxvYWRSb3V0ZXIobG9jYWxTdG9yYWdlUm91dGVyKTtcbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgbG9jYWwgc3RvcmFnZSBJT0hhbmRsZXIuXG4gKlxuICogVGhpcyBgSU9IYW5kbGVyYCBzdXBwb3J0cyBib3RoIGBzYXZlYCBhbmQgYGxvYWRgLlxuICpcbiAqIEZvciBlYWNoIG1vZGVsJ3Mgc2F2ZWQgYXJ0aWZhY3RzLCBmb3VyIGl0ZW1zIGFyZSBzYXZlZCB0byBsb2NhbCBzdG9yYWdlLlxuICogICAtIGAke1BBVEhfU0VQQVJBVE9SfS8ke21vZGVsUGF0aH0vaW5mb2A6IENvbnRhaW5zIG1ldGEtaW5mbyBhYm91dCB0aGVcbiAqICAgICBtb2RlbCwgc3VjaCBhcyBkYXRlIHNhdmVkLCB0eXBlIG9mIHRoZSB0b3BvbG9neSwgc2l6ZSBpbiBieXRlcywgZXRjLlxuICogICAtIGAke1BBVEhfU0VQQVJBVE9SfS8ke21vZGVsUGF0aH0vdG9wb2xvZ3lgOiBNb2RlbCB0b3BvbG9neS4gRm9yIEtlcmFzLVxuICogICAgIHN0eWxlIG1vZGVscywgdGhpcyBpcyBhIHN0cmluZ2l6ZWQgSlNPTi5cbiAqICAgLSBgJHtQQVRIX1NFUEFSQVRPUn0vJHttb2RlbFBhdGh9L3dlaWdodF9zcGVjc2A6IFdlaWdodCBzcGVjcyBvZiB0aGVcbiAqICAgICBtb2RlbCwgY2FuIGJlIHVzZWQgdG8gZGVjb2RlIHRoZSBzYXZlZCBiaW5hcnkgd2VpZ2h0IHZhbHVlcyAoc2VlXG4gKiAgICAgaXRlbSBiZWxvdykuXG4gKiAgIC0gYCR7UEFUSF9TRVBBUkFUT1J9LyR7bW9kZWxQYXRofS93ZWlnaHRfZGF0YWA6IENvbmNhdGVuYXRlZCBiaW5hcnlcbiAqICAgICB3ZWlnaHQgdmFsdWVzLCBzdG9yZWQgYXMgYSBiYXNlNjQtZW5jb2RlZCBzdHJpbmcuXG4gKlxuICogU2F2aW5nIG1heSB0aHJvdyBhbiBgRXJyb3JgIGlmIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBhcnRpZmFjdHMgZXhjZWVkIHRoZVxuICogYnJvd3Nlci1zcGVjaWZpYyBxdW90YS5cbiAqXG4gKiBAcGFyYW0gbW9kZWxQYXRoIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBtb2RlbCB0byBiZSBzYXZlZC4gTXVzdCBiZSBhXG4gKiAgIG5vbi1lbXB0eSBzdHJpbmcuXG4gKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiBgSU9IYW5kbGVyYCwgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCwgZS5nLixcbiAqICAgYHRmLk1vZGVsLnNhdmVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnJvd3NlckxvY2FsU3RvcmFnZShtb2RlbFBhdGgpIHtcbiAgICByZXR1cm4gbmV3IEJyb3dzZXJMb2NhbFN0b3JhZ2UobW9kZWxQYXRoKTtcbn1cbmV4cG9ydCBjbGFzcyBCcm93c2VyTG9jYWxTdG9yYWdlTWFuYWdlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGFzc2VydChlbnYoKS5nZXRCb29sKCdJU19CUk9XU0VSJyksICgpID0+ICdDdXJyZW50IGVudmlyb25tZW50IGlzIG5vdCBhIHdlYiBicm93c2VyJyk7XG4gICAgICAgIGFzc2VydCh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyB8fFxuICAgICAgICAgICAgdHlwZW9mIHdpbmRvdy5sb2NhbFN0b3JhZ2UgIT09ICd1bmRlZmluZWQnLCAoKSA9PiAnQ3VycmVudCBicm93c2VyIGRvZXMgbm90IGFwcGVhciB0byBzdXBwb3J0IGxvY2FsU3RvcmFnZScpO1xuICAgICAgICB0aGlzLkxTID0gd2luZG93LmxvY2FsU3RvcmFnZTtcbiAgICB9XG4gICAgYXN5bmMgbGlzdE1vZGVscygpIHtcbiAgICAgICAgY29uc3Qgb3V0ID0ge307XG4gICAgICAgIGNvbnN0IHByZWZpeCA9IFBBVEhfUFJFRklYICsgUEFUSF9TRVBBUkFUT1I7XG4gICAgICAgIGNvbnN0IHN1ZmZpeCA9IFBBVEhfU0VQQVJBVE9SICsgSU5GT19TVUZGSVg7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5MUy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5MUy5rZXkoaSk7XG4gICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgocHJlZml4KSAmJiBrZXkuZW5kc1dpdGgoc3VmZml4KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1vZGVsUGF0aCA9IGdldE1vZGVsUGF0aEZyb21LZXkoa2V5KTtcbiAgICAgICAgICAgICAgICBvdXRbbW9kZWxQYXRoXSA9IEpTT04ucGFyc2UodGhpcy5MUy5nZXRJdGVtKGtleSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuICAgIGFzeW5jIHJlbW92ZU1vZGVsKHBhdGgpIHtcbiAgICAgICAgcGF0aCA9IG1heWJlU3RyaXBTY2hlbWUocGF0aCk7XG4gICAgICAgIGNvbnN0IGtleXMgPSBnZXRNb2RlbEtleXMocGF0aCk7XG4gICAgICAgIGlmICh0aGlzLkxTLmdldEl0ZW0oa2V5cy5pbmZvKSA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBmaW5kIG1vZGVsIGF0IHBhdGggJyR7cGF0aH0nYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5mbyA9IEpTT04ucGFyc2UodGhpcy5MUy5nZXRJdGVtKGtleXMuaW5mbykpO1xuICAgICAgICByZW1vdmVJdGVtcyhrZXlzKTtcbiAgICAgICAgcmV0dXJuIGluZm87XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG9jYWxfc3RvcmFnZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vKipcbiAqIENsYXNzZXMgYW5kIGZ1bmN0aW9ucyBmb3IgbW9kZWwgbWFuYWdlbWVudCBhY3Jvc3MgbXVsdGlwbGUgc3RvcmFnZSBtZWRpdW1zLlxuICpcbiAqIFN1cHBvcnRlZCBjbGllbnQgYWN0aW9uczpcbiAqIC0gTGlzdGluZyBtb2RlbHMgb24gYWxsIHJlZ2lzdGVyZWQgc3RvcmFnZSBtZWRpdW1zLlxuICogLSBSZW1vdmUgbW9kZWwgYnkgVVJMIGZyb20gYW55IHJlZ2lzdGVyZWQgc3RvcmFnZSBtZWRpdW1zLCBieSB1c2luZyBVUkxcbiAqICAgc3RyaW5nLlxuICogLSBNb3Zpbmcgb3IgY29weWluZyBtb2RlbCBmcm9tIG9uZSBwYXRoIHRvIGFub3RoZXIgaW4gdGhlIHNhbWUgbWVkaXVtIG9yIGZyb21cbiAqICAgb25lIG1lZGl1bSB0byBhbm90aGVyLCBieSB1c2luZyBVUkwgc3RyaW5ncy5cbiAqL1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBJT1JvdXRlclJlZ2lzdHJ5IH0gZnJvbSAnLi9yb3V0ZXJfcmVnaXN0cnknO1xuY29uc3QgVVJMX1NDSEVNRV9TVUZGSVggPSAnOi8vJztcbmV4cG9ydCBjbGFzcyBNb2RlbFN0b3JlTWFuYWdlclJlZ2lzdHJ5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5tYW5hZ2VycyA9IHt9O1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0SW5zdGFuY2UoKSB7XG4gICAgICAgIGlmIChNb2RlbFN0b3JlTWFuYWdlclJlZ2lzdHJ5Lmluc3RhbmNlID09IG51bGwpIHtcbiAgICAgICAgICAgIE1vZGVsU3RvcmVNYW5hZ2VyUmVnaXN0cnkuaW5zdGFuY2UgPSBuZXcgTW9kZWxTdG9yZU1hbmFnZXJSZWdpc3RyeSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBNb2RlbFN0b3JlTWFuYWdlclJlZ2lzdHJ5Lmluc3RhbmNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlciBhIHNhdmUtaGFuZGxlciByb3V0ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2F2ZVJvdXRlciBBIGZ1bmN0aW9uIHRoYXQgbWFwcyBhIFVSTC1saWtlIHN0cmluZyBvbnRvIGFuIGluc3RhbmNlXG4gICAgICogb2YgYElPSGFuZGxlcmAgd2l0aCB0aGUgYHNhdmVgIG1ldGhvZCBkZWZpbmVkIG9yIGBudWxsYC5cbiAgICAgKi9cbiAgICBzdGF0aWMgcmVnaXN0ZXJNYW5hZ2VyKHNjaGVtZSwgbWFuYWdlcikge1xuICAgICAgICBhc3NlcnQoc2NoZW1lICE9IG51bGwsICgpID0+ICdzY2hlbWUgbXVzdCBub3QgYmUgdW5kZWZpbmVkIG9yIG51bGwuJyk7XG4gICAgICAgIGlmIChzY2hlbWUuZW5kc1dpdGgoVVJMX1NDSEVNRV9TVUZGSVgpKSB7XG4gICAgICAgICAgICBzY2hlbWUgPSBzY2hlbWUuc2xpY2UoMCwgc2NoZW1lLmluZGV4T2YoVVJMX1NDSEVNRV9TVUZGSVgpKTtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnQoc2NoZW1lLmxlbmd0aCA+IDAsICgpID0+ICdzY2hlbWUgbXVzdCBub3QgYmUgYW4gZW1wdHkgc3RyaW5nLicpO1xuICAgICAgICBjb25zdCByZWdpc3RyeSA9IE1vZGVsU3RvcmVNYW5hZ2VyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTtcbiAgICAgICAgYXNzZXJ0KHJlZ2lzdHJ5Lm1hbmFnZXJzW3NjaGVtZV0gPT0gbnVsbCwgKCkgPT4gYEEgbW9kZWwgc3RvcmUgbWFuYWdlciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIHNjaGVtZSAnJHtzY2hlbWV9Jy5gKTtcbiAgICAgICAgcmVnaXN0cnkubWFuYWdlcnNbc2NoZW1lXSA9IG1hbmFnZXI7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRNYW5hZ2VyKHNjaGVtZSkge1xuICAgICAgICBjb25zdCBtYW5hZ2VyID0gdGhpcy5nZXRJbnN0YW5jZSgpLm1hbmFnZXJzW3NjaGVtZV07XG4gICAgICAgIGlmIChtYW5hZ2VyID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgbW9kZWwgbWFuYWdlciBmb3Igc2NoZW1lICcke3NjaGVtZX0nYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1hbmFnZXI7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRTY2hlbWVzKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5nZXRJbnN0YW5jZSgpLm1hbmFnZXJzKTtcbiAgICB9XG59XG4vKipcbiAqIEhlbHBlciBtZXRob2QgZm9yIHBhcnNpbmcgYSBVUkwgc3RyaW5nIGludG8gYSBzY2hlbWUgYW5kIGEgcGF0aC5cbiAqXG4gKiBAcGFyYW0gdXJsIEUuZy4sICdsb2NhbHN0b3JhZ2U6Ly9teS1tb2RlbCdcbiAqIEByZXR1cm5zIEEgZGljdGlvbmFyeSB3aXRoIHR3byBmaWVsZHM6IHNjaGVtZSBhbmQgcGF0aC5cbiAqICAgU2NoZW1lOiBlLmcuLCAnbG9jYWxzdG9yYWdlJyBpbiB0aGUgZXhhbXBsZSBhYm92ZS5cbiAqICAgUGF0aDogZS5nLiwgJ215LW1vZGVsJyBpbiB0aGUgZXhhbXBsZSBhYm92ZS5cbiAqL1xuZnVuY3Rpb24gcGFyc2VVUkwodXJsKSB7XG4gICAgaWYgKHVybC5pbmRleE9mKFVSTF9TQ0hFTUVfU1VGRklYKSA9PT0gLTEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgdXJsIHN0cmluZyBwcm92aWRlZCBkb2VzIG5vdCBjb250YWluIGEgc2NoZW1lLiBgICtcbiAgICAgICAgICAgIGBTdXBwb3J0ZWQgc2NoZW1lcyBhcmU6IGAgK1xuICAgICAgICAgICAgYCR7TW9kZWxTdG9yZU1hbmFnZXJSZWdpc3RyeS5nZXRTY2hlbWVzKCkuam9pbignLCcpfWApO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBzY2hlbWU6IHVybC5zcGxpdChVUkxfU0NIRU1FX1NVRkZJWClbMF0sXG4gICAgICAgIHBhdGg6IHVybC5zcGxpdChVUkxfU0NIRU1FX1NVRkZJWClbMV0sXG4gICAgfTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGNsb25lTW9kZWxJbnRlcm5hbChzb3VyY2VVUkwsIGRlc3RVUkwsIGRlbGV0ZVNvdXJjZSA9IGZhbHNlKSB7XG4gICAgYXNzZXJ0KHNvdXJjZVVSTCAhPT0gZGVzdFVSTCwgKCkgPT4gYE9sZCBwYXRoIGFuZCBuZXcgcGF0aCBhcmUgdGhlIHNhbWU6ICcke3NvdXJjZVVSTH0nYCk7XG4gICAgY29uc3QgbG9hZEhhbmRsZXJzID0gSU9Sb3V0ZXJSZWdpc3RyeS5nZXRMb2FkSGFuZGxlcnMoc291cmNlVVJMKTtcbiAgICBhc3NlcnQobG9hZEhhbmRsZXJzLmxlbmd0aCA+IDAsICgpID0+IGBDb3B5aW5nIGZhaWxlZCBiZWNhdXNlIG5vIGxvYWQgaGFuZGxlciBpcyBmb3VuZCBmb3Igc291cmNlIFVSTCAke3NvdXJjZVVSTH0uYCk7XG4gICAgYXNzZXJ0KGxvYWRIYW5kbGVycy5sZW5ndGggPCAyLCAoKSA9PiBgQ29weWluZyBmYWlsZWQgYmVjYXVzZSBtb3JlIHRoYW4gb25lICgke2xvYWRIYW5kbGVycy5sZW5ndGh9KSBgICtcbiAgICAgICAgYGxvYWQgaGFuZGxlcnMgZm9yIHNvdXJjZSBVUkwgJHtzb3VyY2VVUkx9LmApO1xuICAgIGNvbnN0IGxvYWRIYW5kbGVyID0gbG9hZEhhbmRsZXJzWzBdO1xuICAgIGNvbnN0IHNhdmVIYW5kbGVycyA9IElPUm91dGVyUmVnaXN0cnkuZ2V0U2F2ZUhhbmRsZXJzKGRlc3RVUkwpO1xuICAgIGFzc2VydChzYXZlSGFuZGxlcnMubGVuZ3RoID4gMCwgKCkgPT4gYENvcHlpbmcgZmFpbGVkIGJlY2F1c2Ugbm8gc2F2ZSBoYW5kbGVyIGlzIGZvdW5kIGZvciBkZXN0aW5hdGlvbiBgICtcbiAgICAgICAgYFVSTCAke2Rlc3RVUkx9LmApO1xuICAgIGFzc2VydChzYXZlSGFuZGxlcnMubGVuZ3RoIDwgMiwgKCkgPT4gYENvcHlpbmcgZmFpbGVkIGJlY2F1c2UgbW9yZSB0aGFuIG9uZSAoJHtsb2FkSGFuZGxlcnMubGVuZ3RofSkgYCArXG4gICAgICAgIGBzYXZlIGhhbmRsZXJzIGZvciBkZXN0aW5hdGlvbiBVUkwgJHtkZXN0VVJMfS5gKTtcbiAgICBjb25zdCBzYXZlSGFuZGxlciA9IHNhdmVIYW5kbGVyc1swXTtcbiAgICBjb25zdCBzb3VyY2VTY2hlbWUgPSBwYXJzZVVSTChzb3VyY2VVUkwpLnNjaGVtZTtcbiAgICBjb25zdCBzb3VyY2VQYXRoID0gcGFyc2VVUkwoc291cmNlVVJMKS5wYXRoO1xuICAgIGNvbnN0IHNhbWVNZWRpdW0gPSBzb3VyY2VTY2hlbWUgPT09IHBhcnNlVVJMKHNvdXJjZVVSTCkuc2NoZW1lO1xuICAgIGNvbnN0IG1vZGVsQXJ0aWZhY3RzID0gYXdhaXQgbG9hZEhhbmRsZXIubG9hZCgpO1xuICAgIC8vIElmIG1vdmluZyB3aXRoaW4gdGhlIHNhbWUgc3RvcmFnZSBtZWRpdW0sIHJlbW92ZSB0aGUgb2xkIG1vZGVsIGFzIHNvb24gYXNcbiAgICAvLyB0aGUgbG9hZGluZyBpcyBkb25lLiBXaXRob3V0IGRvaW5nIHRoaXMsIGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIGNvbWJpbmVkXG4gICAgLy8gc2l6ZSBvZiB0aGUgdHdvIG1vZGVscyB3aWxsIGNhdXNlIHRoZSBjbG9uaW5nIHRvIGZhaWwuXG4gICAgaWYgKGRlbGV0ZVNvdXJjZSAmJiBzYW1lTWVkaXVtKSB7XG4gICAgICAgIGF3YWl0IE1vZGVsU3RvcmVNYW5hZ2VyUmVnaXN0cnkuZ2V0TWFuYWdlcihzb3VyY2VTY2hlbWUpXG4gICAgICAgICAgICAucmVtb3ZlTW9kZWwoc291cmNlUGF0aCk7XG4gICAgfVxuICAgIGNvbnN0IHNhdmVSZXN1bHQgPSBhd2FpdCBzYXZlSGFuZGxlci5zYXZlKG1vZGVsQXJ0aWZhY3RzKTtcbiAgICAvLyBJZiBtb3ZpbmcgYmV0d2VlbiBtZWRpdW1zLCB0aGUgZGVsZXRpb24gaXMgZG9uZSBhZnRlciB0aGUgc2F2ZSBzdWNjZWVkcy5cbiAgICAvLyBUaGlzIGd1YXJkcyBhZ2FpbnN0IHRoZSBjYXNlIGluIHdoaWNoIHNhdmluZyB0byB0aGUgZGVzdGluYXRpb24gbWVkaXVtXG4gICAgLy8gZmFpbHMuXG4gICAgaWYgKGRlbGV0ZVNvdXJjZSAmJiAhc2FtZU1lZGl1bSkge1xuICAgICAgICBhd2FpdCBNb2RlbFN0b3JlTWFuYWdlclJlZ2lzdHJ5LmdldE1hbmFnZXIoc291cmNlU2NoZW1lKVxuICAgICAgICAgICAgLnJlbW92ZU1vZGVsKHNvdXJjZVBhdGgpO1xuICAgIH1cbiAgICByZXR1cm4gc2F2ZVJlc3VsdC5tb2RlbEFydGlmYWN0c0luZm87XG59XG4vKipcbiAqIExpc3QgYWxsIG1vZGVscyBzdG9yZWQgaW4gcmVnaXN0ZXJlZCBzdG9yYWdlIG1lZGl1bXMuXG4gKlxuICogRm9yIGEgd2ViIGJyb3dzZXIgZW52aXJvbm1lbnQsIHRoZSByZWdpc3RlcmVkIG1lZGl1bXMgYXJlIExvY2FsIFN0b3JhZ2UgYW5kXG4gKiBJbmRleGVkREIuXG4gKlxuICogYGBganNcbiAqIC8vIEZpcnN0IGNyZWF0ZSBhbmQgc2F2ZSBhIG1vZGVsLlxuICogY29uc3QgbW9kZWwgPSB0Zi5zZXF1ZW50aWFsKCk7XG4gKiBtb2RlbC5hZGQodGYubGF5ZXJzLmRlbnNlKFxuICogICAgIHt1bml0czogMSwgaW5wdXRTaGFwZTogWzEwXSwgYWN0aXZhdGlvbjogJ3NpZ21vaWQnfSkpO1xuICogYXdhaXQgbW9kZWwuc2F2ZSgnbG9jYWxzdG9yYWdlOi8vZGVtby9tYW5hZ2VtZW50L21vZGVsMScpO1xuICpcbiAqIC8vIFRoZW4gbGlzdCBleGlzdGluZyBtb2RlbHMuXG4gKiBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShhd2FpdCB0Zi5pby5saXN0TW9kZWxzKCkpKTtcbiAqXG4gKiAvLyBEZWxldGUgdGhlIG1vZGVsLlxuICogYXdhaXQgdGYuaW8ucmVtb3ZlTW9kZWwoJ2xvY2Fsc3RvcmFnZTovL2RlbW8vbWFuYWdlbWVudC9tb2RlbDEnKTtcbiAqXG4gKiAvLyBMaXN0IG1vZGVscyBhZ2Fpbi5cbiAqIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGF3YWl0IHRmLmlvLmxpc3RNb2RlbHMoKSkpO1xuICogYGBgXG4gKlxuICogQHJldHVybnMgQSBgUHJvbWlzZWAgb2YgYSBkaWN0aW9uYXJ5IG1hcHBpbmcgVVJMcyBvZiBleGlzdGluZyBtb2RlbHMgdG9cbiAqIHRoZWlyIG1vZGVsIGFydGlmYWN0cyBpbmZvLiBVUkxzIGluY2x1ZGUgbWVkaXVtLXNwZWNpZmljIHNjaGVtZXMsIGUuZy4sXG4gKiAgICdpbmRleGVkZGI6Ly9teS9tb2RlbC8xJy4gTW9kZWwgYXJ0aWZhY3RzIGluZm8gaW5jbHVkZSB0eXBlIG9mIHRoZVxuICogbW9kZWwncyB0b3BvbG9neSwgYnl0ZSBzaXplcyBvZiB0aGUgdG9wb2xvZ3ksIHdlaWdodHMsIGV0Yy5cbiAqXG4gKiBAZG9jIHtcbiAqICAgaGVhZGluZzogJ01vZGVscycsXG4gKiAgIHN1YmhlYWRpbmc6ICdNYW5hZ2VtZW50JyxcbiAqICAgbmFtZXNwYWNlOiAnaW8nLFxuICogICBpZ25vcmVDSTogdHJ1ZVxuICogfVxuICovXG5hc3luYyBmdW5jdGlvbiBsaXN0TW9kZWxzKCkge1xuICAgIGNvbnN0IHNjaGVtZXMgPSBNb2RlbFN0b3JlTWFuYWdlclJlZ2lzdHJ5LmdldFNjaGVtZXMoKTtcbiAgICBjb25zdCBvdXQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IHNjaGVtZSBvZiBzY2hlbWVzKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtZU91dCA9IGF3YWl0IE1vZGVsU3RvcmVNYW5hZ2VyUmVnaXN0cnkuZ2V0TWFuYWdlcihzY2hlbWUpLmxpc3RNb2RlbHMoKTtcbiAgICAgICAgZm9yIChjb25zdCBwYXRoIGluIHNjaGVtZU91dCkge1xuICAgICAgICAgICAgY29uc3QgdXJsID0gc2NoZW1lICsgVVJMX1NDSEVNRV9TVUZGSVggKyBwYXRoO1xuICAgICAgICAgICAgb3V0W3VybF0gPSBzY2hlbWVPdXRbcGF0aF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUmVtb3ZlIGEgbW9kZWwgc3BlY2lmaWVkIGJ5IFVSTCBmcm9tIGEgcmVpZ3N0ZXJlZCBzdG9yYWdlIG1lZGl1bS5cbiAqXG4gKiBgYGBqc1xuICogLy8gRmlyc3QgY3JlYXRlIGFuZCBzYXZlIGEgbW9kZWwuXG4gKiBjb25zdCBtb2RlbCA9IHRmLnNlcXVlbnRpYWwoKTtcbiAqIG1vZGVsLmFkZCh0Zi5sYXllcnMuZGVuc2UoXG4gKiAgICAge3VuaXRzOiAxLCBpbnB1dFNoYXBlOiBbMTBdLCBhY3RpdmF0aW9uOiAnc2lnbW9pZCd9KSk7XG4gKiBhd2FpdCBtb2RlbC5zYXZlKCdsb2NhbHN0b3JhZ2U6Ly9kZW1vL21hbmFnZW1lbnQvbW9kZWwxJyk7XG4gKlxuICogLy8gVGhlbiBsaXN0IGV4aXN0aW5nIG1vZGVscy5cbiAqIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGF3YWl0IHRmLmlvLmxpc3RNb2RlbHMoKSkpO1xuICpcbiAqIC8vIERlbGV0ZSB0aGUgbW9kZWwuXG4gKiBhd2FpdCB0Zi5pby5yZW1vdmVNb2RlbCgnbG9jYWxzdG9yYWdlOi8vZGVtby9tYW5hZ2VtZW50L21vZGVsMScpO1xuICpcbiAqIC8vIExpc3QgbW9kZWxzIGFnYWluLlxuICogY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoYXdhaXQgdGYuaW8ubGlzdE1vZGVscygpKSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdXJsIEEgVVJMIHRvIGEgc3RvcmVkIG1vZGVsLCB3aXRoIGEgc2NoZW1lIHByZWZpeCwgZS5nLixcbiAqICAgJ2xvY2Fsc3RvcmFnZTovL215LW1vZGVsLTEnLCAnaW5kZXhlZGRiOi8vbXkvbW9kZWwvMicuXG4gKiBAcmV0dXJucyBNb2RlbEFydGlmYWN0c0luZm8gb2YgdGhlIGRlbGV0ZWQgbW9kZWwgKGlmIGFuZCBvbmx5IGlmIGRlbGV0aW9uXG4gKiAgIGlzIHN1Y2Nlc3NmdWwpLlxuICogQHRocm93cyBFcnJvciBpZiBkZWxldGlvbiBmYWlscywgZS5nLiwgaWYgbm8gbW9kZWwgZXhpc3RzIGF0IGBwYXRoYC5cbiAqXG4gKiBAZG9jIHtcbiAqICAgaGVhZGluZzogJ01vZGVscycsXG4gKiAgIHN1YmhlYWRpbmc6ICdNYW5hZ2VtZW50JyxcbiAqICAgbmFtZXNwYWNlOiAnaW8nLFxuICogICBpZ25vcmVDSTogdHJ1ZVxuICogfVxuICovXG5hc3luYyBmdW5jdGlvbiByZW1vdmVNb2RlbCh1cmwpIHtcbiAgICBjb25zdCBzY2hlbWVBbmRQYXRoID0gcGFyc2VVUkwodXJsKTtcbiAgICBjb25zdCBtYW5hZ2VyID0gTW9kZWxTdG9yZU1hbmFnZXJSZWdpc3RyeS5nZXRNYW5hZ2VyKHNjaGVtZUFuZFBhdGguc2NoZW1lKTtcbiAgICByZXR1cm4gbWFuYWdlci5yZW1vdmVNb2RlbChzY2hlbWVBbmRQYXRoLnBhdGgpO1xufVxuLyoqXG4gKiBDb3B5IGEgbW9kZWwgZnJvbSBvbmUgVVJMIHRvIGFub3RoZXIuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBzdXBwb3J0czpcbiAqXG4gKiAxLiBDb3B5aW5nIHdpdGhpbiBhIHN0b3JhZ2UgbWVkaXVtLCBlLmcuLFxuICogICAgYHRmLmlvLmNvcHlNb2RlbCgnbG9jYWxzdG9yYWdlOi8vbW9kZWwtMScsICdsb2NhbHN0b3JhZ2U6Ly9tb2RlbC0yJylgXG4gKiAyLiBDb3B5aW5nIGJldHdlZW4gdHdvIHN0b3JhZ2UgbWVkaXVtcywgZS5nLixcbiAqICAgIGB0Zi5pby5jb3B5TW9kZWwoJ2xvY2Fsc3RvcmFnZTovL21vZGVsLTEnLCAnaW5kZXhlZGRiOi8vbW9kZWwtMScpYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBGaXJzdCBjcmVhdGUgYW5kIHNhdmUgYSBtb2RlbC5cbiAqIGNvbnN0IG1vZGVsID0gdGYuc2VxdWVudGlhbCgpO1xuICogbW9kZWwuYWRkKHRmLmxheWVycy5kZW5zZShcbiAqICAgICB7dW5pdHM6IDEsIGlucHV0U2hhcGU6IFsxMF0sIGFjdGl2YXRpb246ICdzaWdtb2lkJ30pKTtcbiAqIGF3YWl0IG1vZGVsLnNhdmUoJ2xvY2Fsc3RvcmFnZTovL2RlbW8vbWFuYWdlbWVudC9tb2RlbDEnKTtcbiAqXG4gKiAvLyBUaGVuIGxpc3QgZXhpc3RpbmcgbW9kZWxzLlxuICogY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoYXdhaXQgdGYuaW8ubGlzdE1vZGVscygpKSk7XG4gKlxuICogLy8gQ29weSB0aGUgbW9kZWwsIGZyb20gTG9jYWwgU3RvcmFnZSB0byBJbmRleGVkREIuXG4gKiBhd2FpdCB0Zi5pby5jb3B5TW9kZWwoXG4gKiAgICAgJ2xvY2Fsc3RvcmFnZTovL2RlbW8vbWFuYWdlbWVudC9tb2RlbDEnLFxuICogICAgICdpbmRleGVkZGI6Ly9kZW1vL21hbmFnZW1lbnQvbW9kZWwxJyk7XG4gKlxuICogLy8gTGlzdCBtb2RlbHMgYWdhaW4uXG4gKiBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShhd2FpdCB0Zi5pby5saXN0TW9kZWxzKCkpKTtcbiAqXG4gKiAvLyBSZW1vdmUgYm90aCBtb2RlbHMuXG4gKiBhd2FpdCB0Zi5pby5yZW1vdmVNb2RlbCgnbG9jYWxzdG9yYWdlOi8vZGVtby9tYW5hZ2VtZW50L21vZGVsMScpO1xuICogYXdhaXQgdGYuaW8ucmVtb3ZlTW9kZWwoJ2luZGV4ZWRkYjovL2RlbW8vbWFuYWdlbWVudC9tb2RlbDEnKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBzb3VyY2VVUkwgU291cmNlIFVSTCBvZiBjb3B5aW5nLlxuICogQHBhcmFtIGRlc3RVUkwgRGVzdGluYXRpb24gVVJMIG9mIGNvcHlpbmcuXG4gKiBAcmV0dXJucyBNb2RlbEFydGlmYWN0c0luZm8gb2YgdGhlIGNvcGllZCBtb2RlbCAoaWYgYW5kIG9ubHkgaWYgY29weWluZ1xuICogICBpcyBzdWNjZXNzZnVsKS5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgY29weWluZyBmYWlscywgZS5nLiwgaWYgbm8gbW9kZWwgZXhpc3RzIGF0IGBzb3VyY2VVUkxgLCBvclxuICogICBpZiBgb2xkUGF0aGAgYW5kIGBuZXdQYXRoYCBhcmUgaWRlbnRpY2FsLlxuICpcbiAqIEBkb2Mge1xuICogICBoZWFkaW5nOiAnTW9kZWxzJyxcbiAqICAgc3ViaGVhZGluZzogJ01hbmFnZW1lbnQnLFxuICogICBuYW1lc3BhY2U6ICdpbycsXG4gKiAgIGlnbm9yZUNJOiB0cnVlXG4gKiB9XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvcHlNb2RlbChzb3VyY2VVUkwsIGRlc3RVUkwpIHtcbiAgICBjb25zdCBkZWxldGVTb3VyY2UgPSBmYWxzZTtcbiAgICByZXR1cm4gY2xvbmVNb2RlbEludGVybmFsKHNvdXJjZVVSTCwgZGVzdFVSTCwgZGVsZXRlU291cmNlKTtcbn1cbi8qKlxuICogTW92ZSBhIG1vZGVsIGZyb20gb25lIFVSTCB0byBhbm90aGVyLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHM6XG4gKlxuICogMS4gTW92aW5nIHdpdGhpbiBhIHN0b3JhZ2UgbWVkaXVtLCBlLmcuLFxuICogICAgYHRmLmlvLm1vdmVNb2RlbCgnbG9jYWxzdG9yYWdlOi8vbW9kZWwtMScsICdsb2NhbHN0b3JhZ2U6Ly9tb2RlbC0yJylgXG4gKiAyLiBNb3ZpbmcgYmV0d2VlbiB0d28gc3RvcmFnZSBtZWRpdW1zLCBlLmcuLFxuICogICAgYHRmLmlvLm1vdmVNb2RlbCgnbG9jYWxzdG9yYWdlOi8vbW9kZWwtMScsICdpbmRleGVkZGI6Ly9tb2RlbC0xJylgXG4gKlxuICogYGBganNcbiAqIC8vIEZpcnN0IGNyZWF0ZSBhbmQgc2F2ZSBhIG1vZGVsLlxuICogY29uc3QgbW9kZWwgPSB0Zi5zZXF1ZW50aWFsKCk7XG4gKiBtb2RlbC5hZGQodGYubGF5ZXJzLmRlbnNlKFxuICogICAgIHt1bml0czogMSwgaW5wdXRTaGFwZTogWzEwXSwgYWN0aXZhdGlvbjogJ3NpZ21vaWQnfSkpO1xuICogYXdhaXQgbW9kZWwuc2F2ZSgnbG9jYWxzdG9yYWdlOi8vZGVtby9tYW5hZ2VtZW50L21vZGVsMScpO1xuICpcbiAqIC8vIFRoZW4gbGlzdCBleGlzdGluZyBtb2RlbHMuXG4gKiBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShhd2FpdCB0Zi5pby5saXN0TW9kZWxzKCkpKTtcbiAqXG4gKiAvLyBNb3ZlIHRoZSBtb2RlbCwgZnJvbSBMb2NhbCBTdG9yYWdlIHRvIEluZGV4ZWREQi5cbiAqIGF3YWl0IHRmLmlvLm1vdmVNb2RlbChcbiAqICAgICAnbG9jYWxzdG9yYWdlOi8vZGVtby9tYW5hZ2VtZW50L21vZGVsMScsXG4gKiAgICAgJ2luZGV4ZWRkYjovL2RlbW8vbWFuYWdlbWVudC9tb2RlbDEnKTtcbiAqXG4gKiAvLyBMaXN0IG1vZGVscyBhZ2Fpbi5cbiAqIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGF3YWl0IHRmLmlvLmxpc3RNb2RlbHMoKSkpO1xuICpcbiAqIC8vIFJlbW92ZSB0aGUgbW92ZWQgbW9kZWwuXG4gKiBhd2FpdCB0Zi5pby5yZW1vdmVNb2RlbCgnaW5kZXhlZGRiOi8vZGVtby9tYW5hZ2VtZW50L21vZGVsMScpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHNvdXJjZVVSTCBTb3VyY2UgVVJMIG9mIG1vdmluZy5cbiAqIEBwYXJhbSBkZXN0VVJMIERlc3RpbmF0aW9uIFVSTCBvZiBtb3ZpbmcuXG4gKiBAcmV0dXJucyBNb2RlbEFydGlmYWN0c0luZm8gb2YgdGhlIGNvcGllZCBtb2RlbCAoaWYgYW5kIG9ubHkgaWYgY29weWluZ1xuICogICBpcyBzdWNjZXNzZnVsKS5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgbW92aW5nIGZhaWxzLCBlLmcuLCBpZiBubyBtb2RlbCBleGlzdHMgYXQgYHNvdXJjZVVSTGAsIG9yXG4gKiAgIGlmIGBvbGRQYXRoYCBhbmQgYG5ld1BhdGhgIGFyZSBpZGVudGljYWwuXG4gKlxuICogQGRvYyB7XG4gKiAgIGhlYWRpbmc6ICdNb2RlbHMnLFxuICogICBzdWJoZWFkaW5nOiAnTWFuYWdlbWVudCcsXG4gKiAgIG5hbWVzcGFjZTogJ2lvJyxcbiAqICAgaWdub3JlQ0k6IHRydWVcbiAqIH1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbW92ZU1vZGVsKHNvdXJjZVVSTCwgZGVzdFVSTCkge1xuICAgIGNvbnN0IGRlbGV0ZVNvdXJjZSA9IHRydWU7XG4gICAgcmV0dXJuIGNsb25lTW9kZWxJbnRlcm5hbChzb3VyY2VVUkwsIGRlc3RVUkwsIGRlbGV0ZVNvdXJjZSk7XG59XG5leHBvcnQgeyBtb3ZlTW9kZWwsIGNvcHlNb2RlbCwgcmVtb3ZlTW9kZWwsIGxpc3RNb2RlbHMgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1vZGVsX21hbmFnZW1lbnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuY2xhc3MgUGFzc3Rocm91Z2hMb2FkZXIge1xuICAgIGNvbnN0cnVjdG9yKG1vZGVsQXJ0aWZhY3RzKSB7XG4gICAgICAgIHRoaXMubW9kZWxBcnRpZmFjdHMgPSBtb2RlbEFydGlmYWN0cztcbiAgICB9XG4gICAgYXN5bmMgbG9hZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZWxBcnRpZmFjdHM7XG4gICAgfVxufVxuY2xhc3MgUGFzc3Rocm91Z2hTYXZlciB7XG4gICAgY29uc3RydWN0b3Ioc2F2ZUhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5zYXZlSGFuZGxlciA9IHNhdmVIYW5kbGVyO1xuICAgIH1cbiAgICBhc3luYyBzYXZlKG1vZGVsQXJ0aWZhY3RzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNhdmVIYW5kbGVyKG1vZGVsQXJ0aWZhY3RzKTtcbiAgICB9XG59XG4vKipcbiAqIENyZWF0ZXMgYW4gSU9IYW5kbGVyIHRoYXQgbG9hZHMgbW9kZWwgYXJ0aWZhY3RzIGZyb20gbWVtb3J5LlxuICpcbiAqIFdoZW4gdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGB0Zi5sb2FkTGF5ZXJzTW9kZWxgLCBhbiBpbnN0YW5jZSBvZlxuICogYHRmLkxheWVyc01vZGVsYCAoS2VyYXMtc3R5bGUpIGNhbiBiZSBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBsb2FkZWQgYXJ0aWZhY3RzLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtb2RlbCA9IGF3YWl0IHRmLmxvYWRMYXllcnNNb2RlbCh0Zi5pby5mcm9tTWVtb3J5KFxuICogICAgIG1vZGVsVG9wb2xvZ3ksIHdlaWdodFNwZWNzLCB3ZWlnaHREYXRhKSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gbW9kZWxBcnRpZmFjdHMgYSBvYmplY3QgY29udGFpbmluZyBtb2RlbCB0b3BvbG9neSAoaS5lLiwgcGFyc2VkIGZyb21cbiAqICAgdGhlIEpTT04gZm9ybWF0KS5cbiAqIEBwYXJhbSB3ZWlnaHRTcGVjcyBBbiBhcnJheSBvZiBgV2VpZ2h0c01hbmlmZXN0RW50cnlgIG9iamVjdHMgZGVzY3JpYmluZyB0aGVcbiAqICAgbmFtZXMsIHNoYXBlcywgdHlwZXMsIGFuZCBxdWFudGl6YXRpb24gb2YgdGhlIHdlaWdodCBkYXRhLlxuICogQHBhcmFtIHdlaWdodERhdGEgQSBzaW5nbGUgYEFycmF5QnVmZmVyYCBjb250YWluaW5nIHRoZSB3ZWlnaHQgZGF0YSxcbiAqICAgY29uY2F0ZW5hdGVkIGluIHRoZSBvcmRlciBkZXNjcmliZWQgYnkgdGhlIHdlaWdodFNwZWNzLlxuICogQHBhcmFtIHRyYWluaW5nQ29uZmlnIE1vZGVsIHRyYWluaW5nIGNvbmZpZ3VyYXRpb24uIE9wdGlvbmFsLlxuICpcbiAqIEByZXR1cm5zIEEgcGFzc3Rocm91Z2ggYElPSGFuZGxlcmAgdGhhdCBzaW1wbHkgbG9hZHMgdGhlIHByb3ZpZGVkIGRhdGEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tTWVtb3J5KG1vZGVsQXJ0aWZhY3RzLCB3ZWlnaHRTcGVjcywgd2VpZ2h0RGF0YSwgdHJhaW5pbmdDb25maWcpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCBpc01vZGVsQXJ0aWZhY3RzID0gbW9kZWxBcnRpZmFjdHMubW9kZWxUb3BvbG9neSAhPSBudWxsIHx8XG4gICAgICAgICAgICBtb2RlbEFydGlmYWN0cy53ZWlnaHRTcGVjcyAhPSBudWxsO1xuICAgICAgICBpZiAoaXNNb2RlbEFydGlmYWN0cykge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXNzdGhyb3VnaExvYWRlcihtb2RlbEFydGlmYWN0cyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBMZWdhY3kgc3VwcG9ydDogd2l0aCBvbmx5IG1vZGVsVG9wb2xvZ3kuXG4gICAgICAgICAgICAvLyBUT0RPKGNhaXMpOiBSZW1vdmUgdGhpcyBkZXByZWNhdGVkIEFQSS5cbiAgICAgICAgICAgIGNvbnNvbGUud2FybignUGxlYXNlIGNhbGwgdGYuaW8uZnJvbU1lbW9yeSgpIHdpdGggb25seSBvbmUgYXJndW1lbnQuICcgK1xuICAgICAgICAgICAgICAgICdUaGUgYXJndW1lbnQgc2hvdWxkIGJlIG9mIHR5cGUgTW9kZWxBcnRpZmFjdHMuICcgK1xuICAgICAgICAgICAgICAgICdUaGUgbXVsdGktYXJndW1lbnQgc2lnbmF0dXJlIG9mIHRmLmlvLmZyb21NZW1vcnkoKSBoYXMgYmVlbiAnICtcbiAgICAgICAgICAgICAgICAnZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuJyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBhc3N0aHJvdWdoTG9hZGVyKHsgbW9kZWxUb3BvbG9neTogbW9kZWxBcnRpZmFjdHMgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIExlZ2FjeSBzdXBwb3J0LlxuICAgICAgICAvLyBUT0RPKGNhaXMpOiBSZW1vdmUgdGhpcyBkZXByZWNhdGVkIEFQSS5cbiAgICAgICAgY29uc29sZS53YXJuKCdQbGVhc2UgY2FsbCB0Zi5pby5mcm9tTWVtb3J5KCkgd2l0aCBvbmx5IG9uZSBhcmd1bWVudC4gJyArXG4gICAgICAgICAgICAnVGhlIGFyZ3VtZW50IHNob3VsZCBiZSBvZiB0eXBlIE1vZGVsQXJ0aWZhY3RzLiAnICtcbiAgICAgICAgICAgICdUaGUgbXVsdGktYXJndW1lbnQgc2lnbmF0dXJlIG9mIHRmLmlvLmZyb21NZW1vcnkoKSBoYXMgYmVlbiAnICtcbiAgICAgICAgICAgICdkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4nKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQYXNzdGhyb3VnaExvYWRlcih7XG4gICAgICAgICAgICBtb2RlbFRvcG9sb2d5OiBtb2RlbEFydGlmYWN0cyxcbiAgICAgICAgICAgIHdlaWdodFNwZWNzLFxuICAgICAgICAgICAgd2VpZ2h0RGF0YSxcbiAgICAgICAgICAgIHRyYWluaW5nQ29uZmlnXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbi8qKlxuICogQ3JlYXRlcyBhbiBJT0hhbmRsZXIgdGhhdCBwYXNzZXMgc2F2ZWQgbW9kZWwgYXJ0aWZhY3RzIHRvIGEgY2FsbGJhY2suXG4gKlxuICogYGBganNcbiAqIGZ1bmN0aW9uIGhhbmRsZVNhdmUoYXJ0aWZhY3RzKSB7XG4gKiAgIC8vIC4uLiBkbyBzb21ldGhpbmcgd2l0aCB0aGUgYXJ0aWZhY3RzIC4uLlxuICogICByZXR1cm4ge21vZGVsQXJ0aWZhY3RzSW5mbzogey4uLn0sIC4uLn07XG4gKiB9XG4gKlxuICogY29uc3Qgc2F2ZVJlc3VsdCA9IG1vZGVsLnNhdmUodGYuaW8ud2l0aFNhdmVIYW5kbGVyKGhhbmRsZVNhdmUpKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBzYXZlSGFuZGxlciBBIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBhIGBNb2RlbEFydGlmYWN0c2AgYW5kIHJldHVybnMgYVxuICogICAgIGBTYXZlUmVzdWx0YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhTYXZlSGFuZGxlcihzYXZlSGFuZGxlcikge1xuICAgIHJldHVybiBuZXcgUGFzc3Rocm91Z2hTYXZlcihzYXZlSGFuZGxlcik7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXNzdGhyb3VnaC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsJztcbi8qKlxuICogTW9uaXRvciBQcm9taXNlLmFsbCBwcm9ncmVzcywgZmlyZSBvblByb2dyZXNzIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSBwcm9taXNlcyBQcm9taXNlIGxpc3QgZ29pbmcgdG8gYmUgbW9uaXRvcmVkXG4gKiBAcGFyYW0gb25Qcm9ncmVzcyBDYWxsYmFjayBmdW5jdGlvbi4gRmlyZWQgd2hlbiBhIHByb21pc2UgcmVzb2x2ZWQuXG4gKiBAcGFyYW0gc3RhcnRGcmFjdGlvbiBPcHRpb25hbCBmcmFjdGlvbiBzdGFydC4gRGVmYXVsdCB0byAwLlxuICogQHBhcmFtIGVuZEZyYWN0aW9uIE9wdGlvbmFsIGZyYWN0aW9uIGVuZC4gRGVmYXVsdCB0byAxLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbW9uaXRvclByb21pc2VzUHJvZ3Jlc3MocHJvbWlzZXMsIG9uUHJvZ3Jlc3MsIHN0YXJ0RnJhY3Rpb24sIGVuZEZyYWN0aW9uKSB7XG4gICAgY2hlY2tQcm9taXNlcyhwcm9taXNlcyk7XG4gICAgc3RhcnRGcmFjdGlvbiA9IHN0YXJ0RnJhY3Rpb24gPT0gbnVsbCA/IDAgOiBzdGFydEZyYWN0aW9uO1xuICAgIGVuZEZyYWN0aW9uID0gZW5kRnJhY3Rpb24gPT0gbnVsbCA/IDEgOiBlbmRGcmFjdGlvbjtcbiAgICBjaGVja0ZyYWN0aW9uKHN0YXJ0RnJhY3Rpb24sIGVuZEZyYWN0aW9uKTtcbiAgICBsZXQgcmVzb2x2ZWRQcm9taXNlID0gMDtcbiAgICBjb25zdCByZWdpc3Rlck1vbml0b3IgPSAocHJvbWlzZSkgPT4ge1xuICAgICAgICBwcm9taXNlLnRoZW4odmFsdWUgPT4ge1xuICAgICAgICAgICAgY29uc3QgZnJhY3Rpb24gPSBzdGFydEZyYWN0aW9uICtcbiAgICAgICAgICAgICAgICArK3Jlc29sdmVkUHJvbWlzZSAvIHByb21pc2VzLmxlbmd0aCAqIChlbmRGcmFjdGlvbiAtIHN0YXJ0RnJhY3Rpb24pO1xuICAgICAgICAgICAgLy8gcGFzcyBmcmFjdGlvbiBhcyBwYXJhbWV0ZXIgdG8gY2FsbGJhY2sgZnVuY3Rpb24uXG4gICAgICAgICAgICBvblByb2dyZXNzKGZyYWN0aW9uKTtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH07XG4gICAgZnVuY3Rpb24gY2hlY2tQcm9taXNlcyhwcm9taXNlcykge1xuICAgICAgICBhc3NlcnQocHJvbWlzZXMgIT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KHByb21pc2VzKSAmJiBwcm9taXNlcy5sZW5ndGggPiAwLCAoKSA9PiAncHJvbWlzZXMgbXVzdCBiZSBhIG5vbmUgZW1wdHkgYXJyYXknKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2hlY2tGcmFjdGlvbihzdGFydEZyYWN0aW9uLCBlbmRGcmFjdGlvbikge1xuICAgICAgICBhc3NlcnQoc3RhcnRGcmFjdGlvbiA+PSAwICYmIHN0YXJ0RnJhY3Rpb24gPD0gMSwgKCkgPT4gYFByb2dyZXNzIGZyYWN0aW9uIG11c3QgYmUgaW4gcmFuZ2UgWzAsIDFdLCBidXQgYCArXG4gICAgICAgICAgICBgZ290IHN0YXJ0RnJhY3Rpb24gJHtzdGFydEZyYWN0aW9ufWApO1xuICAgICAgICBhc3NlcnQoZW5kRnJhY3Rpb24gPj0gMCAmJiBlbmRGcmFjdGlvbiA8PSAxLCAoKSA9PiBgUHJvZ3Jlc3MgZnJhY3Rpb24gbXVzdCBiZSBpbiByYW5nZSBbMCwgMV0sIGJ1dCBgICtcbiAgICAgICAgICAgIGBnb3QgZW5kRnJhY3Rpb24gJHtlbmRGcmFjdGlvbn1gKTtcbiAgICAgICAgYXNzZXJ0KGVuZEZyYWN0aW9uID49IHN0YXJ0RnJhY3Rpb24sICgpID0+IGBzdGFydEZyYWN0aW9uIG11c3QgYmUgbm8gbW9yZSB0aGFuIGVuZEZyYWN0aW9uLCBidXQgYCArXG4gICAgICAgICAgICBgZ290IHN0YXJ0RnJhY3Rpb24gJHtzdGFydEZyYWN0aW9ufSBhbmQgZW5kRnJhY3Rpb24gYCArXG4gICAgICAgICAgICBgJHtlbmRGcmFjdGlvbn1gKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzLm1hcChyZWdpc3Rlck1vbml0b3IpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXByb2dyZXNzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmV4cG9ydCBjbGFzcyBJT1JvdXRlclJlZ2lzdHJ5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5zYXZlUm91dGVycyA9IFtdO1xuICAgICAgICB0aGlzLmxvYWRSb3V0ZXJzID0gW107XG4gICAgfVxuICAgIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHtcbiAgICAgICAgaWYgKElPUm91dGVyUmVnaXN0cnkuaW5zdGFuY2UgPT0gbnVsbCkge1xuICAgICAgICAgICAgSU9Sb3V0ZXJSZWdpc3RyeS5pbnN0YW5jZSA9IG5ldyBJT1JvdXRlclJlZ2lzdHJ5KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIElPUm91dGVyUmVnaXN0cnkuaW5zdGFuY2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIGEgc2F2ZS1oYW5kbGVyIHJvdXRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzYXZlUm91dGVyIEEgZnVuY3Rpb24gdGhhdCBtYXBzIGEgVVJMLWxpa2Ugc3RyaW5nIG9udG8gYW4gaW5zdGFuY2VcbiAgICAgKiBvZiBgSU9IYW5kbGVyYCB3aXRoIHRoZSBgc2F2ZWAgbWV0aG9kIGRlZmluZWQgb3IgYG51bGxgLlxuICAgICAqL1xuICAgIHN0YXRpYyByZWdpc3RlclNhdmVSb3V0ZXIoc2F2ZVJvdXRlcikge1xuICAgICAgICBJT1JvdXRlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuc2F2ZVJvdXRlcnMucHVzaChzYXZlUm91dGVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXIgYSBsb2FkLWhhbmRsZXIgcm91dGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIGxvYWRSb3V0ZXIgQSBmdW5jdGlvbiB0aGF0IG1hcHMgYSBVUkwtbGlrZSBzdHJpbmcgb250byBhbiBpbnN0YW5jZVxuICAgICAqIG9mIGBJT0hhbmRsZXJgIHdpdGggdGhlIGBsb2FkYCBtZXRob2QgZGVmaW5lZCBvciBgbnVsbGAuXG4gICAgICovXG4gICAgc3RhdGljIHJlZ2lzdGVyTG9hZFJvdXRlcihsb2FkUm91dGVyKSB7XG4gICAgICAgIElPUm91dGVyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5sb2FkUm91dGVycy5wdXNoKGxvYWRSb3V0ZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb29rIHVwIElPSGFuZGxlciBmb3Igc2F2aW5nLCBnaXZlbiBhIFVSTC1saWtlIHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB1cmxcbiAgICAgKiBAcmV0dXJucyBJZiBvbmx5IG9uZSBtYXRjaCBpcyBmb3VuZCwgYW4gaW5zdGFuY2Ugb2YgSU9IYW5kbGVyIHdpdGggdGhlXG4gICAgICogYHNhdmVgIG1ldGhvZCBkZWZpbmVkLiBJZiBubyBtYXRjaCBpcyBmb3VuZCwgYG51bGxgLlxuICAgICAqIEB0aHJvd3MgRXJyb3IsIGlmIG1vcmUgdGhhbiBvbmUgbWF0Y2ggaXMgZm91bmQuXG4gICAgICovXG4gICAgc3RhdGljIGdldFNhdmVIYW5kbGVycyh1cmwpIHtcbiAgICAgICAgcmV0dXJuIElPUm91dGVyUmVnaXN0cnkuZ2V0SGFuZGxlcnModXJsLCAnc2F2ZScpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb29rIHVwIElPSGFuZGxlciBmb3IgbG9hZGluZywgZ2l2ZW4gYSBVUkwtbGlrZSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdXJsXG4gICAgICogQHBhcmFtIGxvYWRPcHRpb25zIE9wdGlvbmFsLCBjdXN0b20gbG9hZCBvcHRpb25zLlxuICAgICAqIEByZXR1cm5zIEFsbCB2YWxpZCBoYW5kbGVycyBmb3IgYHVybGAsIGdpdmVuIHRoZSBjdXJyZW50bHkgcmVnaXN0ZXJlZFxuICAgICAqICAgaGFuZGxlciByb3V0ZXJzLlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRMb2FkSGFuZGxlcnModXJsLCBsb2FkT3B0aW9ucykge1xuICAgICAgICByZXR1cm4gSU9Sb3V0ZXJSZWdpc3RyeS5nZXRIYW5kbGVycyh1cmwsICdsb2FkJywgbG9hZE9wdGlvbnMpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0SGFuZGxlcnModXJsLCBoYW5kbGVyVHlwZSwgbG9hZE9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgdmFsaWRIYW5kbGVycyA9IFtdO1xuICAgICAgICBjb25zdCByb3V0ZXJzID0gaGFuZGxlclR5cGUgPT09ICdsb2FkJyA/XG4gICAgICAgICAgICBJT1JvdXRlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkubG9hZFJvdXRlcnMgOlxuICAgICAgICAgICAgSU9Sb3V0ZXJSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLnNhdmVSb3V0ZXJzO1xuICAgICAgICByb3V0ZXJzLmZvckVhY2gocm91dGVyID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSByb3V0ZXIodXJsLCBsb2FkT3B0aW9ucyk7XG4gICAgICAgICAgICBpZiAoaGFuZGxlciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZhbGlkSGFuZGxlcnMucHVzaChoYW5kbGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB2YWxpZEhhbmRsZXJzO1xuICAgIH1cbn1cbmV4cG9ydCBjb25zdCByZWdpc3RlclNhdmVSb3V0ZXIgPSAobG91ZFJvdXRlcikgPT4gSU9Sb3V0ZXJSZWdpc3RyeS5yZWdpc3RlclNhdmVSb3V0ZXIobG91ZFJvdXRlcik7XG5leHBvcnQgY29uc3QgcmVnaXN0ZXJMb2FkUm91dGVyID0gKGxvdWRSb3V0ZXIpID0+IElPUm91dGVyUmVnaXN0cnkucmVnaXN0ZXJMb2FkUm91dGVyKGxvdWRSb3V0ZXIpO1xuZXhwb3J0IGNvbnN0IGdldFNhdmVIYW5kbGVycyA9ICh1cmwpID0+IElPUm91dGVyUmVnaXN0cnkuZ2V0U2F2ZUhhbmRsZXJzKHVybCk7XG5leHBvcnQgY29uc3QgZ2V0TG9hZEhhbmRsZXJzID0gKHVybCwgbG9hZE9wdGlvbnMpID0+IElPUm91dGVyUmVnaXN0cnkuZ2V0TG9hZEhhbmRsZXJzKHVybCwgbG9hZE9wdGlvbnMpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cm91dGVyX3JlZ2lzdHJ5LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qIFR5cGUgZGVmaW5pdGlvbnMgZm9yIGV4cG9ydGluZyBhbmQgaW1wb3J0aW5nIG9mIG1vZGVscy4gKi9cbi8qKlxuICogQSBtYXAgZnJvbSBUZW5zb3IgZHR5cGUgdG8gbnVtYmVyIG9mIGJ5dGVzIHBlciBlbGVtZW50IG9mIHRoZSBUZW5zb3IuXG4gKi9cbmV4cG9ydCBjb25zdCBEVFlQRV9WQUxVRV9TSVpFX01BUCA9IHtcbiAgICAnZmxvYXQzMic6IDQsXG4gICAgJ2Zsb2F0MTYnOiAyLFxuICAgICdpbnQzMic6IDQsXG4gICAgJ3VpbnQxNic6IDIsXG4gICAgJ3VpbnQ4JzogMSxcbiAgICAnYm9vbCc6IDEsXG4gICAgJ2NvbXBsZXg2NCc6IDhcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD10eXBlcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBlbnYgfSBmcm9tICcuLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgZGVjb2RlV2VpZ2h0cyB9IGZyb20gJy4vaW9fdXRpbHMnO1xuaW1wb3J0IHsgbW9uaXRvclByb21pc2VzUHJvZ3Jlc3MgfSBmcm9tICcuL3Byb2dyZXNzJztcbmltcG9ydCB7IERUWVBFX1ZBTFVFX1NJWkVfTUFQIH0gZnJvbSAnLi90eXBlcyc7XG4vKipcbiAqIFJlYWRzIGJpbmFyeSB3ZWlnaHRzIGRhdGEgZnJvbSBhIG51bWJlciBvZiBVUkxzLlxuICpcbiAqIEBwYXJhbSBmZXRjaFVSTHMgVVJMcyB0byBzZW5kIHRoZSBIVFRQIHJlcXVlc3RzIGF0LCB1c2luZyBgZmV0Y2hgIGNhbGxzLlxuICogQHBhcmFtIHJlcXVlc3RPcHRpb25zIFJlcXVlc3RJbml0IChvcHRpb25zKSBmb3IgdGhlIEhUVFAgcmVxdWVzdHMuXG4gKiBAcGFyYW0gZmV0Y2hGdW5jIE9wdGlvbmFsIG92ZXJyaWRpbmcgdmFsdWUgZm9yIHRoZSBgd2luZG93LmZldGNoYCBmdW5jdGlvbi5cbiAqIEBwYXJhbSBvblByb2dyZXNzIE9wdGlvbmFsLCBwcm9ncmVzcyBjYWxsYmFjayBmdW5jdGlvbiwgZmlyZWQgcGVyaW9kaWNhbGx5XG4gKiAgIGJlZm9yZSB0aGUgbG9hZCBpcyBjb21wbGV0ZWQuXG4gKiBAcmV0dXJucyBBIGBQcm9taXNlYCBvZiBhbiBBcnJheSBvZiBgQXJyYXlCdWZmZXJgLiBUaGUgQXJyYXkgaGFzIHRoZSBzYW1lXG4gKiAgIGxlbmd0aCBhcyBgZmV0Y2hVUkxzYC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRXZWlnaHRzQXNBcnJheUJ1ZmZlcihmZXRjaFVSTHMsIGxvYWRPcHRpb25zKSB7XG4gICAgaWYgKGxvYWRPcHRpb25zID09IG51bGwpIHtcbiAgICAgICAgbG9hZE9wdGlvbnMgPSB7fTtcbiAgICB9XG4gICAgY29uc3QgZmV0Y2hGdW5jID0gbG9hZE9wdGlvbnMuZmV0Y2hGdW5jID09IG51bGwgPyBlbnYoKS5wbGF0Zm9ybS5mZXRjaCA6XG4gICAgICAgIGxvYWRPcHRpb25zLmZldGNoRnVuYztcbiAgICAvLyBDcmVhdGUgdGhlIHJlcXVlc3RzIGZvciBhbGwgb2YgdGhlIHdlaWdodHMgaW4gcGFyYWxsZWwuXG4gICAgY29uc3QgcmVxdWVzdHMgPSBmZXRjaFVSTHMubWFwKGZldGNoVVJMID0+IGZldGNoRnVuYyhmZXRjaFVSTCwgbG9hZE9wdGlvbnMucmVxdWVzdEluaXQsIHsgaXNCaW5hcnk6IHRydWUgfSkpO1xuICAgIGNvbnN0IGZldGNoU3RhcnRGcmFjdGlvbiA9IDA7XG4gICAgY29uc3QgZmV0Y2hFbmRGcmFjdGlvbiA9IDAuNTtcbiAgICBjb25zdCByZXNwb25zZXMgPSBsb2FkT3B0aW9ucy5vblByb2dyZXNzID09IG51bGwgP1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChyZXF1ZXN0cykgOlxuICAgICAgICBhd2FpdCBtb25pdG9yUHJvbWlzZXNQcm9ncmVzcyhyZXF1ZXN0cywgbG9hZE9wdGlvbnMub25Qcm9ncmVzcywgZmV0Y2hTdGFydEZyYWN0aW9uLCBmZXRjaEVuZEZyYWN0aW9uKTtcbiAgICBjb25zdCBidWZmZXJQcm9taXNlcyA9IHJlc3BvbnNlcy5tYXAocmVzcG9uc2UgPT4gcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSk7XG4gICAgY29uc3QgYnVmZmVyU3RhcnRGcmFjdGlvbiA9IDAuNTtcbiAgICBjb25zdCBidWZmZXJFbmRGcmFjdGlvbiA9IDE7XG4gICAgY29uc3QgYnVmZmVycyA9IGxvYWRPcHRpb25zLm9uUHJvZ3Jlc3MgPT0gbnVsbCA/XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKGJ1ZmZlclByb21pc2VzKSA6XG4gICAgICAgIGF3YWl0IG1vbml0b3JQcm9taXNlc1Byb2dyZXNzKGJ1ZmZlclByb21pc2VzLCBsb2FkT3B0aW9ucy5vblByb2dyZXNzLCBidWZmZXJTdGFydEZyYWN0aW9uLCBidWZmZXJFbmRGcmFjdGlvbik7XG4gICAgcmV0dXJuIGJ1ZmZlcnM7XG59XG4vKipcbiAqIFJlYWRzIGEgd2VpZ2h0cyBtYW5pZmVzdCBKU09OIGNvbmZpZ3VyYXRpb24sIGZldGNoZXMgdGhlIHdlaWdodHMgYW5kXG4gKiByZXR1cm5zIHRoZW0gYXMgYFRlbnNvcmBzLlxuICpcbiAqIEBwYXJhbSBtYW5pZmVzdCBUaGUgd2VpZ2h0cyBtYW5pZmVzdCBKU09OLlxuICogQHBhcmFtIGZpbGVQYXRoUHJlZml4IFRoZSBwYXRoIHByZWZpeCBmb3IgZmlsZW5hbWVzIGdpdmVuIGluIHRoZSBtYW5pZmVzdC5cbiAqICAgICBEZWZhdWx0cyB0byB0aGUgZW1wdHkgc3RyaW5nLlxuICogQHBhcmFtIHdlaWdodE5hbWVzIFRoZSBuYW1lcyBvZiB0aGUgd2VpZ2h0cyB0byBiZSBmZXRjaGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFdlaWdodHMobWFuaWZlc3QsIGZpbGVQYXRoUHJlZml4ID0gJycsIHdlaWdodE5hbWVzLCByZXF1ZXN0SW5pdCkge1xuICAgIC8vIFRPRE8obnN0aG9yYXQpOiBHcm91cHMgYXJlIGN1cnJlbnRseSBmZXRjaGVkIGF0b21pY2FsbHkuIElmIHlvdSBuZWVkIGFcbiAgICAvLyBzaW5nbGUgd2VpZ2h0IGZyb20gYSBncm91cCwgdGhlIHdob2xlIGdyb3VwIHdpbGwgYmUgZmV0Y2hlZC4gQXQgYSBmdXR1cmVcbiAgICAvLyBkYXRlLCB3ZSBzaG91bGQgc3VwcG9ydCBmZXRjaGluZyBvbmx5IHRoZSBpbmRpdmlkdWFsIHNoYXJkcyB3aXRoaW4gYVxuICAgIC8vIGdyb3VwIHRoYXQgYXJlIG5lZWRlZCB0byByZWNvbnN0cnVjdCB0aGUgcmVxdWVzdGVkIHdlaWdodC5cbiAgICAvLyBUT0RPKGNhaXMpOiBVc2UgYGRlY29kZVdlaWdodHNgIGZvciBpbXBsZW1lbnRhdGlvbi5cbiAgICBjb25zdCBmZXRjaFdlaWdodHMgPSAoZmV0Y2hVcmxzKSA9PiBsb2FkV2VpZ2h0c0FzQXJyYXlCdWZmZXIoZmV0Y2hVcmxzLCB7IHJlcXVlc3RJbml0IH0pO1xuICAgIGNvbnN0IGxvYWRXZWlnaHRzID0gd2VpZ2h0c0xvYWRlckZhY3RvcnkoZmV0Y2hXZWlnaHRzKTtcbiAgICByZXR1cm4gbG9hZFdlaWdodHMobWFuaWZlc3QsIGZpbGVQYXRoUHJlZml4LCB3ZWlnaHROYW1lcyk7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiwgd2hpY2ggcmVhZHMgYSB3ZWlnaHRzIG1hbmlmZXN0IEpTT04gY29uZmlndXJhdGlvbixcbiAqIGZldGNoZXMgdGhlIHdlaWdodCBmaWxlcyB1c2luZyB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIGFuZCByZXR1cm5zIHRoZW0gYXNcbiAqIGBUZW5zb3Jgcy5cbiAqXG4gKiBgYGBqc1xuICogLy8gZXhhbXBsZSBmb3IgY3JlYXRpbmcgYSBub2RlanMgd2VpZ2h0IGxvYWRlciwgd2hpY2ggcmVhZHMgdGhlIHdlaWdodCBmaWxlc1xuICogLy8gZnJvbSBkaXNrIHVzaW5nIGZzLnJlYWRGaWxlU3luY1xuICpcbiAqIGltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJ1xuICpcbiAqIGNvbnN0IGZldGNoV2VpZ2h0c0Zyb21EaXNrID0gKGZpbGVQYXRoczogc3RyaW5nW10pID0+XG4gKiAgIGZpbGVQYXRocy5tYXAoZmlsZVBhdGggPT4gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoKS5idWZmZXIpXG4gKlxuICogY29uc3QgbG9hZFdlaWdodHMgPSB0Zi5pby53ZWlnaHRzTG9hZGVyRmFjdG9yeShmZXRjaFdlaWdodHNGcm9tRGlzaylcbiAqXG4gKiBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoXG4gKiAgIGZzLnJlYWRGaWxlU3luYygnLi9teV9tb2RlbC13ZWlnaHRzX21hbmlmZXN0JykudG9TdHJpbmcoKVxuICogKVxuICogY29uc3Qgd2VpZ2h0TWFwID0gYXdhaXQgbG9hZFdlaWdodHMobWFuaWZlc3QsICcuLycpXG4gKiBgYGBcbiAqIEBwYXJhbSBmZXRjaFdlaWdodHNGdW5jdGlvbiBUaGUgZnVuY3Rpb24gdXNlZCBmb3IgZmV0Y2hpbmcgdGhlIHdlaWdodCBmaWxlcy5cbiAqIEByZXR1cm5zIFdlaWdodCBsb2FkaW5nIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2VpZ2h0c0xvYWRlckZhY3RvcnkoZmV0Y2hXZWlnaHRzRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gYXN5bmMgKG1hbmlmZXN0LCBmaWxlUGF0aFByZWZpeCA9ICcnLCB3ZWlnaHROYW1lcykgPT4ge1xuICAgICAgICAvLyBDb2xsZWN0IGFsbCB0aGUgZ3JvdXBzLCB3ZWlnaHRzLCBhbmQgdGhlaXIgcmVsYXRpdmUgb2Zmc2V0cyB0byBiZVxuICAgICAgICAvLyBmZXRjaGVkLlxuICAgICAgICBjb25zdCBncm91cEluZGljZXNUb0ZldGNoTWFwID0gbWFuaWZlc3QubWFwKCgpID0+IGZhbHNlKTtcbiAgICAgICAgY29uc3QgZ3JvdXBXZWlnaHRzVG9GZXRjaCA9IHt9O1xuICAgICAgICBjb25zdCB3ZWlnaHRzRm91bmQgPSB3ZWlnaHROYW1lcyAhPSBudWxsID8gd2VpZ2h0TmFtZXMubWFwKCgpID0+IGZhbHNlKSA6IFtdO1xuICAgICAgICBjb25zdCBhbGxNYW5pZmVzdFdlaWdodE5hbWVzID0gW107XG4gICAgICAgIG1hbmlmZXN0LmZvckVhY2goKG1hbmlmZXN0R3JvdXBDb25maWcsIGdyb3VwSW5kZXgpID0+IHtcbiAgICAgICAgICAgIGxldCBncm91cE9mZnNldCA9IDA7XG4gICAgICAgICAgICBtYW5pZmVzdEdyb3VwQ29uZmlnLndlaWdodHMuZm9yRWFjaCh3ZWlnaHRzRW50cnkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhd0R0eXBlID0gKCdxdWFudGl6YXRpb24nIGluIHdlaWdodHNFbnRyeSkgP1xuICAgICAgICAgICAgICAgICAgICB3ZWlnaHRzRW50cnkucXVhbnRpemF0aW9uLmR0eXBlIDpcbiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0c0VudHJ5LmR0eXBlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHdlaWdodHNCeXRlcyA9IERUWVBFX1ZBTFVFX1NJWkVfTUFQW3Jhd0R0eXBlXSAqXG4gICAgICAgICAgICAgICAgICAgIHV0aWwuc2l6ZUZyb21TaGFwZSh3ZWlnaHRzRW50cnkuc2hhcGUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVucXVldWVXZWlnaHRzRm9yRmV0Y2hpbmdGbiA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBJbmRpY2VzVG9GZXRjaE1hcFtncm91cEluZGV4XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChncm91cFdlaWdodHNUb0ZldGNoW2dyb3VwSW5kZXhdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwV2VpZ2h0c1RvRmV0Y2hbZ3JvdXBJbmRleF0gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBncm91cFdlaWdodHNUb0ZldGNoW2dyb3VwSW5kZXhdLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3RFbnRyeTogd2VpZ2h0c0VudHJ5LFxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBPZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplQnl0ZXM6IHdlaWdodHNCeXRlc1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmICh3ZWlnaHROYW1lcyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHdlaWdodE5hbWVzLmZvckVhY2goKHdlaWdodE5hbWUsIHdlaWdodEluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAod2VpZ2h0TmFtZSA9PT0gd2VpZ2h0c0VudHJ5Lm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnF1ZXVlV2VpZ2h0c0ZvckZldGNoaW5nRm4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRzRm91bmRbd2VpZ2h0SW5kZXhdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlbnF1ZXVlV2VpZ2h0c0ZvckZldGNoaW5nRm4oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYWxsTWFuaWZlc3RXZWlnaHROYW1lcy5wdXNoKHdlaWdodHNFbnRyeS5uYW1lKTtcbiAgICAgICAgICAgICAgICBncm91cE9mZnNldCArPSB3ZWlnaHRzQnl0ZXM7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghd2VpZ2h0c0ZvdW5kLmV2ZXJ5KGZvdW5kID0+IGZvdW5kKSkge1xuICAgICAgICAgICAgY29uc3Qgd2VpZ2h0c05vdEZvdW5kID0gd2VpZ2h0TmFtZXMuZmlsdGVyKChfLCBpKSA9PiAhd2VpZ2h0c0ZvdW5kW2ldKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgd2VpZ2h0cyBpbiBtYW5pZmVzdCB3aXRoIG5hbWVzOiBgICtcbiAgICAgICAgICAgICAgICBgJHt3ZWlnaHRzTm90Rm91bmQuam9pbignLCAnKX0uIFxcbmAgK1xuICAgICAgICAgICAgICAgIGBNYW5pZmVzdCBKU09OIGhhcyB3ZWlnaHRzIHdpdGggbmFtZXM6IGAgK1xuICAgICAgICAgICAgICAgIGAke2FsbE1hbmlmZXN0V2VpZ2h0TmFtZXMuam9pbignLCAnKX0uYCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ29udmVydCB0aGUgb25lLWhvdCBib29sZWFuIGdyb3VwSWQgPT4gc2hvdWxkRmV0Y2ggbWFwIHRvIGEgbGlzdCBvZiBncm91cFxuICAgICAgICAvLyBJRHMuXG4gICAgICAgIGNvbnN0IGdyb3VwSW5kaWNlc1RvRmV0Y2ggPSBncm91cEluZGljZXNUb0ZldGNoTWFwLnJlZHVjZSgoYWNjdW11bGF0b3IsIHNob3VsZEZldGNoLCBpKSA9PiB7XG4gICAgICAgICAgICBpZiAoc2hvdWxkRmV0Y2gpIHtcbiAgICAgICAgICAgICAgICBhY2N1bXVsYXRvci5wdXNoKGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICAgICAgICB9LCBbXSk7XG4gICAgICAgIGNvbnN0IGZldGNoVXJscyA9IFtdO1xuICAgICAgICBncm91cEluZGljZXNUb0ZldGNoLmZvckVhY2goaSA9PiB7XG4gICAgICAgICAgICBtYW5pZmVzdFtpXS5wYXRocy5mb3JFYWNoKGZpbGVwYXRoID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmZXRjaFVybCA9IGZpbGVQYXRoUHJlZml4ICtcbiAgICAgICAgICAgICAgICAgICAgKCFmaWxlUGF0aFByZWZpeC5lbmRzV2l0aCgnLycpID8gJy8nIDogJycpICsgZmlsZXBhdGg7XG4gICAgICAgICAgICAgICAgZmV0Y2hVcmxzLnB1c2goZmV0Y2hVcmwpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBidWZmZXJzID0gYXdhaXQgZmV0Y2hXZWlnaHRzRnVuY3Rpb24oZmV0Y2hVcmxzKTtcbiAgICAgICAgY29uc3Qgd2VpZ2h0c1RlbnNvck1hcCA9IHt9O1xuICAgICAgICBsZXQgYnVmZmVySW5kZXhPZmZzZXQgPSAwO1xuICAgICAgICBncm91cEluZGljZXNUb0ZldGNoLmZvckVhY2goaSA9PiB7XG4gICAgICAgICAgICBjb25zdCBudW1CdWZmZXJzID0gbWFuaWZlc3RbaV0ucGF0aHMubGVuZ3RoO1xuICAgICAgICAgICAgbGV0IGdyb3VwQnl0ZXMgPSAwO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1CdWZmZXJzOyBpKyspIHtcbiAgICAgICAgICAgICAgICBncm91cEJ5dGVzICs9IGJ1ZmZlcnNbYnVmZmVySW5kZXhPZmZzZXQgKyBpXS5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ3JlYXRlIGEgYnVmZmVyIGZvciB0aGUgd2hvbGUgZ3JvdXAuXG4gICAgICAgICAgICBjb25zdCBncm91cEJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihncm91cEJ5dGVzKTtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwQnl0ZUJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KGdyb3VwQnVmZmVyKTtcbiAgICAgICAgICAgIGxldCBncm91cEJ1ZmZlck9mZnNldCA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUJ1ZmZlcnM7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcnNbYnVmZmVySW5kZXhPZmZzZXQgKyBpXSk7XG4gICAgICAgICAgICAgICAgZ3JvdXBCeXRlQnVmZmVyLnNldChidWZmZXIsIGdyb3VwQnVmZmVyT2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBncm91cEJ1ZmZlck9mZnNldCArPSBidWZmZXIuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHdlaWdodHNFbnRyaWVzID0gZ3JvdXBXZWlnaHRzVG9GZXRjaFtpXTtcbiAgICAgICAgICAgIHdlaWdodHNFbnRyaWVzLmZvckVhY2god2VpZ2h0c0VudHJ5ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBieXRlQnVmZmVyID0gZ3JvdXBCdWZmZXIuc2xpY2Uod2VpZ2h0c0VudHJ5Lmdyb3VwT2Zmc2V0LCB3ZWlnaHRzRW50cnkuZ3JvdXBPZmZzZXQgKyB3ZWlnaHRzRW50cnkuc2l6ZUJ5dGVzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lVG9UZW5zb3JNYXAgPSBkZWNvZGVXZWlnaHRzKGJ5dGVCdWZmZXIsIFt3ZWlnaHRzRW50cnkubWFuaWZlc3RFbnRyeV0pO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBuYW1lVG9UZW5zb3JNYXApIHtcbiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0c1RlbnNvck1hcFtuYW1lXSA9IG5hbWVUb1RlbnNvck1hcFtuYW1lXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJ1ZmZlckluZGV4T2Zmc2V0ICs9IG51bUJ1ZmZlcnM7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gd2VpZ2h0c1RlbnNvck1hcDtcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d2VpZ2h0c19sb2FkZXIuanMubWFwIiwiZXhwb3J0IGNvbnN0IEFicyA9ICdBYnMnO1xuZXhwb3J0IGNvbnN0IEFjb3MgPSAnQWNvcyc7XG5leHBvcnQgY29uc3QgQWNvc2ggPSAnQWNvc2gnO1xuZXhwb3J0IGNvbnN0IEFkZCA9ICdBZGQnO1xuZXhwb3J0IGNvbnN0IEFkZE4gPSAnQWRkTic7XG5leHBvcnQgY29uc3QgQWxsID0gJ0FsbCc7XG5leHBvcnQgY29uc3QgQW55ID0gJ0FueSc7XG5leHBvcnQgY29uc3QgQXJnTWF4ID0gJ0FyZ01heCc7XG5leHBvcnQgY29uc3QgQXJnTWluID0gJ0FyZ01pbic7XG5leHBvcnQgY29uc3QgQXNpbiA9ICdBc2luJztcbmV4cG9ydCBjb25zdCBBc2luaCA9ICdBc2luaCc7XG5leHBvcnQgY29uc3QgQXRhbiA9ICdBdGFuJztcbmV4cG9ydCBjb25zdCBBdGFuaCA9ICdBdGFuaCc7XG5leHBvcnQgY29uc3QgQXRhbjIgPSAnQXRhbjInO1xuZXhwb3J0IGNvbnN0IEF2Z1Bvb2wgPSAnQXZnUG9vbCc7XG5leHBvcnQgY29uc3QgQXZnUG9vbEdyYWQgPSAnQXZnUG9vbEdyYWQnO1xuZXhwb3J0IGNvbnN0IEF2Z1Bvb2wzRCA9ICdBdmdQb29sM0QnO1xuZXhwb3J0IGNvbnN0IEF2Z1Bvb2wzREdyYWQgPSAnQXZnUG9vbDNER3JhZCc7XG5leHBvcnQgY29uc3QgQmF0Y2hNYXRNdWwgPSAnQmF0Y2hNYXRNdWwnO1xuZXhwb3J0IGNvbnN0IEJhdGNoVG9TcGFjZU5EID0gJ0JhdGNoVG9TcGFjZU5EJztcbmV4cG9ydCBjb25zdCBCaW5jb3VudCA9ICdCaW5jb3VudCc7XG5leHBvcnQgY29uc3QgQnJvYWRjYXN0VG8gPSAnQnJvYWRjYXN0VG8nO1xuZXhwb3J0IGNvbnN0IENhc3QgPSAnQ2FzdCc7XG5leHBvcnQgY29uc3QgQ2VpbCA9ICdDZWlsJztcbmV4cG9ydCBjb25zdCBDbGlwQnlWYWx1ZSA9ICdDbGlwQnlWYWx1ZSc7XG5leHBvcnQgY29uc3QgQ29tcGxleCA9ICdDb21wbGV4JztcbmV4cG9ydCBjb25zdCBDb21wbGV4QWJzID0gJ0NvbXBsZXhBYnMnO1xuZXhwb3J0IGNvbnN0IENvbmNhdCA9ICdDb25jYXQnO1xuZXhwb3J0IGNvbnN0IENvbnYyRCA9ICdDb252MkQnO1xuZXhwb3J0IGNvbnN0IENvbnYyREJhY2twcm9wRmlsdGVyID0gJ0NvbnYyREJhY2twcm9wRmlsdGVyJztcbmV4cG9ydCBjb25zdCBDb252MkRCYWNrcHJvcElucHV0ID0gJ0NvbnYyREJhY2twcm9wSW5wdXQnO1xuZXhwb3J0IGNvbnN0IENvbnYzRCA9ICdDb252M0QnO1xuZXhwb3J0IGNvbnN0IENvbnYzREJhY2twcm9wRmlsdGVyVjIgPSAnQ29udjNEQmFja3Byb3BGaWx0ZXJWMic7XG5leHBvcnQgY29uc3QgQ29udjNEQmFja3Byb3BJbnB1dFYyID0gJ0NvbnYzREJhY2twcm9wSW5wdXRWMic7XG5leHBvcnQgY29uc3QgQ29zID0gJ0Nvcyc7XG5leHBvcnQgY29uc3QgQ29zaCA9ICdDb3NoJztcbmV4cG9ydCBjb25zdCBDdW1zdW0gPSAnQ3Vtc3VtJztcbmV4cG9ydCBjb25zdCBDcm9wQW5kUmVzaXplID0gJ0Nyb3BBbmRSZXNpemUnO1xuZXhwb3J0IGNvbnN0IERlbnNlQmluY291bnQgPSAnRGVuc2VCaW5jb3VudCc7XG5leHBvcnQgY29uc3QgRGVwdGhUb1NwYWNlID0gJ0RlcHRoVG9TcGFjZSc7XG5leHBvcnQgY29uc3QgRGVwdGh3aXNlQ29udjJkTmF0aXZlID0gJ0RlcHRod2lzZUNvbnYyZE5hdGl2ZSc7XG5leHBvcnQgY29uc3QgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIgPSAnRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXInO1xuZXhwb3J0IGNvbnN0IERlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXQgPSAnRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCc7XG5leHBvcnQgY29uc3QgRGlhZyA9ICdEaWFnJztcbmV4cG9ydCBjb25zdCBEaWxhdGlvbjJEID0gJ0RpbGF0aW9uMkQnO1xuZXhwb3J0IGNvbnN0IERpbGF0aW9uMkRCYWNrcHJvcElucHV0ID0gJ0RpbGF0aW9uMkRCYWNrcHJvcElucHV0JztcbmV4cG9ydCBjb25zdCBEaWxhdGlvbjJEQmFja3Byb3BGaWx0ZXIgPSAnRGlsYXRpb24yREJhY2twcm9wRmlsdGVyJztcbmV4cG9ydCBjb25zdCBSZWFsRGl2ID0gJ1JlYWxEaXYnO1xuZXhwb3J0IGNvbnN0IEVpbnN1bSA9ICdFaW5zdW0nO1xuZXhwb3J0IGNvbnN0IEVsdSA9ICdFbHUnO1xuZXhwb3J0IGNvbnN0IEVsdUdyYWQgPSAnRWx1R3JhZCc7XG5leHBvcnQgY29uc3QgRXJmID0gJ0VyZic7XG5leHBvcnQgY29uc3QgRXF1YWwgPSAnRXF1YWwnO1xuZXhwb3J0IGNvbnN0IEV4cCA9ICdFeHAnO1xuZXhwb3J0IGNvbnN0IEV4cGFuZERpbXMgPSAnRXhwYW5kRGltcyc7XG5leHBvcnQgY29uc3QgRXhwbTEgPSAnRXhwbTEnO1xuZXhwb3J0IGNvbnN0IEZGVCA9ICdGRlQnO1xuZXhwb3J0IGNvbnN0IEZpbGwgPSAnRmlsbCc7XG5leHBvcnQgY29uc3QgRmxpcExlZnRSaWdodCA9ICdGbGlwTGVmdFJpZ2h0JztcbmV4cG9ydCBjb25zdCBGbG9vciA9ICdGbG9vcic7XG5leHBvcnQgY29uc3QgRmxvb3JEaXYgPSAnRmxvb3JEaXYnO1xuZXhwb3J0IGNvbnN0IEZ1c2VkQmF0Y2hOb3JtID0gJ0Z1c2VkQmF0Y2hOb3JtJztcbmV4cG9ydCBjb25zdCBHYXRoZXJWMiA9ICdHYXRoZXJWMic7XG5leHBvcnQgY29uc3QgR2F0aGVyTmQgPSAnR2F0aGVyTmQnO1xuZXhwb3J0IGNvbnN0IEdyZWF0ZXIgPSAnR3JlYXRlcic7XG5leHBvcnQgY29uc3QgR3JlYXRlckVxdWFsID0gJ0dyZWF0ZXJFcXVhbCc7XG5leHBvcnQgY29uc3QgSWRlbnRpdHkgPSAnSWRlbnRpdHknO1xuZXhwb3J0IGNvbnN0IElGRlQgPSAnSUZGVCc7XG5leHBvcnQgY29uc3QgSW1hZyA9ICdJbWFnJztcbmV4cG9ydCBjb25zdCBJc0Zpbml0ZSA9ICdJc0Zpbml0ZSc7XG5leHBvcnQgY29uc3QgSXNJbmYgPSAnSXNJbmYnO1xuZXhwb3J0IGNvbnN0IElzTmFuID0gJ0lzTmFuJztcbmV4cG9ydCBjb25zdCBMZWFreVJlbHUgPSAnTGVha3lSZWx1JztcbmV4cG9ydCBjb25zdCBMZXNzID0gJ0xlc3MnO1xuZXhwb3J0IGNvbnN0IExlc3NFcXVhbCA9ICdMZXNzRXF1YWwnO1xuZXhwb3J0IGNvbnN0IExpblNwYWNlID0gJ0xpblNwYWNlJztcbmV4cG9ydCBjb25zdCBMb2cgPSAnTG9nJztcbmV4cG9ydCBjb25zdCBMb2cxcCA9ICdMb2cxcCc7XG5leHBvcnQgY29uc3QgTG9naWNhbEFuZCA9ICdMb2dpY2FsQW5kJztcbmV4cG9ydCBjb25zdCBMb2dpY2FsTm90ID0gJ0xvZ2ljYWxOb3QnO1xuZXhwb3J0IGNvbnN0IExvZ2ljYWxPciA9ICdMb2dpY2FsT3InO1xuZXhwb3J0IGNvbnN0IExvZ1NvZnRtYXggPSAnTG9nU29mdG1heCc7XG5leHBvcnQgY29uc3QgTFJOID0gJ0xSTic7XG5leHBvcnQgY29uc3QgTFJOR3JhZCA9ICdMUk5HcmFkJztcbmV4cG9ydCBjb25zdCBNYXggPSAnTWF4JztcbmV4cG9ydCBjb25zdCBNYXhpbXVtID0gJ01heGltdW0nO1xuZXhwb3J0IGNvbnN0IE1heFBvb2wgPSAnTWF4UG9vbCc7XG5leHBvcnQgY29uc3QgTWF4UG9vbEdyYWQgPSAnTWF4UG9vbEdyYWQnO1xuZXhwb3J0IGNvbnN0IE1heFBvb2wzRCA9ICdNYXhQb29sM0QnO1xuZXhwb3J0IGNvbnN0IE1heFBvb2wzREdyYWQgPSAnTWF4UG9vbDNER3JhZCc7XG5leHBvcnQgY29uc3QgTWF4UG9vbFdpdGhBcmdtYXggPSAnTWF4UG9vbFdpdGhBcmdtYXgnO1xuZXhwb3J0IGNvbnN0IE1lYW4gPSAnTWVhbic7XG5leHBvcnQgY29uc3QgTWluID0gJ01pbic7XG5leHBvcnQgY29uc3QgTWluaW11bSA9ICdNaW5pbXVtJztcbmV4cG9ydCBjb25zdCBNaXJyb3JQYWQgPSAnTWlycm9yUGFkJztcbmV4cG9ydCBjb25zdCBNb2QgPSAnTW9kJztcbmV4cG9ydCBjb25zdCBNdWx0aW5vbWlhbCA9ICdNdWx0aW5vbWlhbCc7XG5leHBvcnQgY29uc3QgTXVsdGlwbHkgPSAnTXVsdGlwbHknO1xuZXhwb3J0IGNvbnN0IE5lZyA9ICdOZWcnO1xuZXhwb3J0IGNvbnN0IE5vdEVxdWFsID0gJ05vdEVxdWFsJztcbmV4cG9ydCBjb25zdCBOb25NYXhTdXBwcmVzc2lvblYzID0gJ05vbk1heFN1cHByZXNzaW9uVjMnO1xuZXhwb3J0IGNvbnN0IE5vbk1heFN1cHByZXNzaW9uVjQgPSAnTm9uTWF4U3VwcHJlc3Npb25WNCc7XG5leHBvcnQgY29uc3QgTm9uTWF4U3VwcHJlc3Npb25WNSA9ICdOb25NYXhTdXBwcmVzc2lvblY1JztcbmV4cG9ydCBjb25zdCBPbmVzTGlrZSA9ICdPbmVzTGlrZSc7XG5leHBvcnQgY29uc3QgT25lSG90ID0gJ09uZUhvdCc7XG5leHBvcnQgY29uc3QgUGFjayA9ICdQYWNrJztcbmV4cG9ydCBjb25zdCBQYWRWMiA9ICdQYWRWMic7XG5leHBvcnQgY29uc3QgUG9vbCA9ICdQb29sJztcbmV4cG9ydCBjb25zdCBQb3cgPSAnUG93JztcbmV4cG9ydCBjb25zdCBQcmVsdSA9ICdQcmVsdSc7XG5leHBvcnQgY29uc3QgUHJvZCA9ICdQcm9kJztcbmV4cG9ydCBjb25zdCBSYW5nZSA9ICdSYW5nZSc7XG5leHBvcnQgY29uc3QgUmVhbCA9ICdSZWFsJztcbmV4cG9ydCBjb25zdCBSZWNpcHJvY2FsID0gJ1JlY2lwcm9jYWwnO1xuZXhwb3J0IGNvbnN0IFJlbHUgPSAnUmVsdSc7XG5leHBvcnQgY29uc3QgUmVzaGFwZSA9ICdSZXNoYXBlJztcbmV4cG9ydCBjb25zdCBSZXNpemVOZWFyZXN0TmVpZ2hib3IgPSAnUmVzaXplTmVhcmVzdE5laWdoYm9yJztcbmV4cG9ydCBjb25zdCBSZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkID0gJ1Jlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWQnO1xuZXhwb3J0IGNvbnN0IFJlc2l6ZUJpbGluZWFyID0gJ1Jlc2l6ZUJpbGluZWFyJztcbmV4cG9ydCBjb25zdCBSZXNpemVCaWxpbmVhckdyYWQgPSAnUmVzaXplQmlsaW5lYXJHcmFkJztcbmV4cG9ydCBjb25zdCBSZWx1NiA9ICdSZWx1Nic7XG5leHBvcnQgY29uc3QgUmV2ZXJzZSA9ICdSZXZlcnNlJztcbmV4cG9ydCBjb25zdCBSb3VuZCA9ICdSb3VuZCc7XG5leHBvcnQgY29uc3QgUnNxcnQgPSAnUnNxcnQnO1xuZXhwb3J0IGNvbnN0IFNjYXR0ZXJOZCA9ICdTY2F0dGVyTmQnO1xuZXhwb3J0IGNvbnN0IFNlbGVjdCA9ICdTZWxlY3QnO1xuZXhwb3J0IGNvbnN0IFNlbHUgPSAnU2VsdSc7XG5leHBvcnQgY29uc3QgU2xpY2UgPSAnU2xpY2UnO1xuZXhwb3J0IGNvbnN0IFNpbiA9ICdTaW4nO1xuZXhwb3J0IGNvbnN0IFNpbmggPSAnU2luaCc7XG5leHBvcnQgY29uc3QgU2lnbiA9ICdTaWduJztcbmV4cG9ydCBjb25zdCBTaWdtb2lkID0gJ1NpZ21vaWQnO1xuZXhwb3J0IGNvbnN0IFNvZnRwbHVzID0gJ1NvZnRwbHVzJztcbmV4cG9ydCBjb25zdCBTcXJ0ID0gJ1NxcnQnO1xuZXhwb3J0IGNvbnN0IFN1bSA9ICdTdW0nO1xuZXhwb3J0IGNvbnN0IFNwYWNlVG9CYXRjaE5EID0gJ1NwYWNlVG9CYXRjaE5EJztcbmV4cG9ydCBjb25zdCBTcGxpdFYgPSAnU3BsaXRWJztcbmV4cG9ydCBjb25zdCBTb2Z0bWF4ID0gJ1NvZnRtYXgnO1xuZXhwb3J0IGNvbnN0IFNwYXJzZUZpbGxFbXB0eVJvd3MgPSAnU3BhcnNlRmlsbEVtcHR5Um93cyc7XG5leHBvcnQgY29uc3QgU3BhcnNlUmVzaGFwZSA9ICdTcGFyc2VSZXNoYXBlJztcbmV4cG9ydCBjb25zdCBTcGFyc2VTZWdtZW50TWVhbiA9ICdTcGFyc2VTZWdtZW50TWVhbic7XG5leHBvcnQgY29uc3QgU3BhcnNlU2VnbWVudFN1bSA9ICdTcGFyc2VTZWdtZW50U3VtJztcbmV4cG9ydCBjb25zdCBTcGFyc2VUb0RlbnNlID0gJ1NwYXJzZVRvRGVuc2UnO1xuZXhwb3J0IGNvbnN0IFNxdWFyZWREaWZmZXJlbmNlID0gJ1NxdWFyZWREaWZmZXJlbmNlJztcbmV4cG9ydCBjb25zdCBTcXVhcmUgPSAnU3F1YXJlJztcbmV4cG9ydCBjb25zdCBTdHJpZGVkU2xpY2UgPSAnU3RyaWRlZFNsaWNlJztcbmV4cG9ydCBjb25zdCBTdHJpbmdOR3JhbXMgPSAnU3RyaW5nTkdyYW1zJztcbmV4cG9ydCBjb25zdCBTdHJpbmdTcGxpdCA9ICdTdHJpbmdTcGxpdCc7XG5leHBvcnQgY29uc3QgU3RyaW5nVG9IYXNoQnVja2V0RmFzdCA9ICdTdHJpbmdUb0hhc2hCdWNrZXRGYXN0JztcbmV4cG9ydCBjb25zdCBTdWIgPSAnU3ViJztcbmV4cG9ydCBjb25zdCBUYW4gPSAnVGFuJztcbmV4cG9ydCBjb25zdCBUYW5oID0gJ1RhbmgnO1xuZXhwb3J0IGNvbnN0IFRpbGUgPSAnVGlsZSc7XG5leHBvcnQgY29uc3QgVG9wSyA9ICdUb3BLJztcbmV4cG9ydCBjb25zdCBUcmFuc2Zvcm0gPSAnVHJhbnNmb3JtJztcbmV4cG9ydCBjb25zdCBUcmFuc3Bvc2UgPSAnVHJhbnNwb3NlJztcbmV4cG9ydCBjb25zdCBVbmlxdWUgPSAnVW5pcXVlJztcbmV4cG9ydCBjb25zdCBVbnBhY2sgPSAnVW5wYWNrJztcbmV4cG9ydCBjb25zdCBVbnNvcnRlZFNlZ21lbnRTdW0gPSAnVW5zb3J0ZWRTZWdtZW50U3VtJztcbmV4cG9ydCBjb25zdCBaZXJvc0xpa2UgPSAnWmVyb3NMaWtlJztcbi8qKlxuICogVGVuc29yRmxvdy5qcy1vbmx5IGtlcm5lbHNcbiAqL1xuZXhwb3J0IGNvbnN0IFN0ZXAgPSAnU3RlcCc7XG5leHBvcnQgY29uc3QgRnJvbVBpeGVscyA9ICdGcm9tUGl4ZWxzJztcbmV4cG9ydCBjb25zdCBSb3RhdGVXaXRoT2Zmc2V0ID0gJ1JvdGF0ZVdpdGhPZmZzZXQnO1xuZXhwb3J0IGNvbnN0IF9GdXNlZE1hdE11bCA9ICdfRnVzZWRNYXRNdWwnO1xuZXhwb3J0IGNvbnN0IEZ1c2VkQ29udjJEID0gJ0Z1c2VkQ29udjJEJztcbmV4cG9ydCBjb25zdCBGdXNlZERlcHRod2lzZUNvbnYyRCA9ICdGdXNlZERlcHRod2lzZUNvbnYyRCc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1rZXJuZWxfbmFtZXMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBnZXRHbG9iYWwgfSBmcm9tICcuL2dsb2JhbF91dGlsJztcbmNvbnN0IGtlcm5lbFJlZ2lzdHJ5ID0gZ2V0R2xvYmFsKCdrZXJuZWxSZWdpc3RyeScsICgpID0+IG5ldyBNYXAoKSk7XG5jb25zdCBncmFkUmVnaXN0cnkgPSBnZXRHbG9iYWwoJ2dyYWRSZWdpc3RyeScsICgpID0+IG5ldyBNYXAoKSk7XG4vKipcbiAqIFJldHVybnMgdGhlIGtlcm5lbCBmdW5jdGlvbiAoY29kZSkgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBuYW1lcy5cbiAqXG4gKiBAcGFyYW0ga2VybmVsTmFtZSBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUga2VybmVsLlxuICogQHBhcmFtIGJhY2tlbmROYW1lIFRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBiYWNrZW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0S2VybmVsKGtlcm5lbE5hbWUsIGJhY2tlbmROYW1lKSB7XG4gICAgY29uc3Qga2V5ID0gbWFrZUtleShrZXJuZWxOYW1lLCBiYWNrZW5kTmFtZSk7XG4gICAgcmV0dXJuIGtlcm5lbFJlZ2lzdHJ5LmdldChrZXkpO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSByZWdpc3RlcmVkIGdyYWRpZW50IGluZm8gYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBrZXJuZWwuXG4gKiBAcGFyYW0ga2VybmVsTmFtZSBUaGUgb2ZmaWNpYWwgVEYga2VybmVsIG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRHcmFkaWVudChrZXJuZWxOYW1lKSB7XG4gICAgcmV0dXJuIGdyYWRSZWdpc3RyeS5nZXQoa2VybmVsTmFtZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0S2VybmVsc0ZvckJhY2tlbmQoYmFja2VuZE5hbWUpIHtcbiAgICBjb25zdCBpdCA9IGtlcm5lbFJlZ2lzdHJ5LmVudHJpZXMoKTtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBpdC5uZXh0KCk7XG4gICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBba2V5LCBjb25maWddID0gdmFsdWU7XG4gICAgICAgIGNvbnN0IFtiYWNrZW5kLF0gPSBrZXkuc3BsaXQoJ18nKTtcbiAgICAgICAgaWYgKGJhY2tlbmQgPT09IGJhY2tlbmROYW1lKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChjb25maWcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIFJlZ2lzdGVycyB0aGUgZnVuY3Rpb24gKGZvcndhcmQgcGFzcykgZm9yIHRoZSBrZXJuZWwgaW4gYSBnbG9iYWwgcmVnaXN0cnkuXG4gKlxuICogQHBhcmFtIGNvbmZpZyBBIGNvbmZpZyBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAtIGBrZXJuZWxOYW1lYCBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUga2VybmVsLlxuICogLSBgYmFja2VuZE5hbWVgIFRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBiYWNrZW5kLlxuICogLSBga2VybmVsRnVuY2AgVGhlIGZ1bmN0aW9uIHRvIHJ1biBkdXJpbmcgdGhlIGZvcndhcmQgcGFzcyBvZiB0aGUga2VybmVsLlxuICogLSBgc2V0dXBGdW5jYCBPcHRpb25hbC4gR2V0cyBjYWxsZWQgb25jZSwgYWZ0ZXIgdGhlIGJhY2tlbmQgaW5pdGlhbGl6ZXMuXG4gKiAtIGBkaXNwb3NlRnVuY2AgT3B0aW9uYWwuIEdldHMgY2FsbGVkIG9uY2UsIHJpZ2h0IGJlZm9yZSB0aGUgYmFja2VuZCBpc1xuICogZGlzcG9zZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3Rlcktlcm5lbChjb25maWcpIHtcbiAgICBjb25zdCB7IGtlcm5lbE5hbWUsIGJhY2tlbmROYW1lIH0gPSBjb25maWc7XG4gICAgY29uc3Qga2V5ID0gbWFrZUtleShrZXJuZWxOYW1lLCBiYWNrZW5kTmFtZSk7XG4gICAgaWYgKGtlcm5lbFJlZ2lzdHJ5LmhhcyhrZXkpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgVGhlIGtlcm5lbCAnJHtrZXJuZWxOYW1lfScgZm9yIGJhY2tlbmQgYCArXG4gICAgICAgICAgICBgJyR7YmFja2VuZE5hbWV9JyBpcyBhbHJlYWR5IHJlZ2lzdGVyZWRgKTtcbiAgICB9XG4gICAga2VybmVsUmVnaXN0cnkuc2V0KGtleSwgY29uZmlnKTtcbn1cbi8qKlxuICogUmVnaXN0ZXJzIGEgZ3JhZGllbnQgZnVuY3Rpb24gZm9yIGEgZ2l2ZW4ga2VybmVsIGluIHRoZSBnbG9iYWwgcmVnaXN0cnksXG4gKiB0byBiZSB1c2VkIGR1cmluZyB0aGUgYmFjay1wcm9wYWdhdGlvbiBvZiB0aGF0IGtlcm5lbC5cbiAqXG4gKiBAcGFyYW0gY29uZmlnIEFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqIC0gYGtlcm5lbE5hbWVgIFRoZSBuYW1lIG9mIHRoZSBrZXJuZWwgdGhhdCB0aGUgZ3JhZGllbnQgZnVuY3Rpb24gaXMgZm9yLlxuICogLSBgZ3JhZEZ1bmNgIFRoZSBmdW5jdGlvbiB0byBydW4gZHVyaW5nIGJhY2stcHJvcGFnYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckdyYWRpZW50KGNvbmZpZykge1xuICAgIGNvbnN0IHsga2VybmVsTmFtZSB9ID0gY29uZmlnO1xuICAgIGlmIChncmFkUmVnaXN0cnkuaGFzKGtlcm5lbE5hbWUpKSB7XG4gICAgICAgIC8vIFRPRE8gKHlhc3NvZ2JhKSBhZnRlciAzLjAgYXNzZXNzIHdoZXRoZXIgd2UgbmVlZCB0byBrZWVwIHRoaXMgZ2F0ZWRcbiAgICAgICAgLy8gdG8gZGVidWcgbW9kZS5cbiAgICAgICAgaWYgKGVudigpLmdldEJvb2woJ0RFQlVHJykpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgT3ZlcnJpZGluZyB0aGUgZ3JhZGllbnQgZm9yICcke2tlcm5lbE5hbWV9J2ApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdyYWRSZWdpc3RyeS5zZXQoa2VybmVsTmFtZSwgY29uZmlnKTtcbn1cbi8qKlxuICogUmVtb3ZlcyB0aGUga2VybmVsIGZ1bmN0aW9uIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICpcbiAqIEBwYXJhbSBrZXJuZWxOYW1lIFRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBrZXJuZWwuXG4gKiBAcGFyYW0gYmFja2VuZE5hbWUgVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGJhY2tlbmQuXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5yZWdpc3Rlcktlcm5lbChrZXJuZWxOYW1lLCBiYWNrZW5kTmFtZSkge1xuICAgIGNvbnN0IGtleSA9IG1ha2VLZXkoa2VybmVsTmFtZSwgYmFja2VuZE5hbWUpO1xuICAgIGlmICgha2VybmVsUmVnaXN0cnkuaGFzKGtleSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUga2VybmVsICcke2tlcm5lbE5hbWV9JyBmb3IgYmFja2VuZCBgICtcbiAgICAgICAgICAgIGAnJHtiYWNrZW5kTmFtZX0nIGlzIG5vdCByZWdpc3RlcmVkYCk7XG4gICAgfVxuICAgIGtlcm5lbFJlZ2lzdHJ5LmRlbGV0ZShrZXkpO1xufVxuLyoqIFJlbW92ZXMgdGhlIHJlZ2lzdGVyZWQgZ3JhZGllbnQgZnJvbSB0aGUgZ2xvYmFsIHJlZ2lzdHJ5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVucmVnaXN0ZXJHcmFkaWVudChrZXJuZWxOYW1lKSB7XG4gICAgaWYgKCFncmFkUmVnaXN0cnkuaGFzKGtlcm5lbE5hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGdyYWRpZW50ICcke2tlcm5lbE5hbWV9JyBmb3IgYmFja2VuZCBpcyBub3QgcmVnaXN0ZXJlZGApO1xuICAgIH1cbiAgICBncmFkUmVnaXN0cnkuZGVsZXRlKGtlcm5lbE5hbWUpO1xufVxuLyoqXG4gKiBGaW5kcyBrZXJuZWxzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCB0byBhIGJhY2tlbmQgYW5kIHJlLXJlZ2lzdGVyc1xuICogdGhlbSBmb3IgYSBuZXcgYmFja2VuZC4gVXNlZnVsIGZvciByZWdpc3RlcmluZyBjdXN0b20gYmFja2VuZHMuXG4gKiBAcGFyYW0gcmVnaXN0ZXJlZEJhY2tlbmROYW1lIEFscmVhZHkgcmVnaXN0ZXJlZCBiYWNrZW5kLlxuICogQHBhcmFtIG5ld0JhY2tlbmROYW1lIE5ldyBiYWNrZW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29weVJlZ2lzdGVyZWRLZXJuZWxzKHJlZ2lzdGVyZWRCYWNrZW5kTmFtZSwgbmV3QmFja2VuZE5hbWUpIHtcbiAgICBjb25zdCBrZXJuZWxzID0gZ2V0S2VybmVsc0ZvckJhY2tlbmQocmVnaXN0ZXJlZEJhY2tlbmROYW1lKTtcbiAgICBrZXJuZWxzLmZvckVhY2goa2VybmVsQ29uZmlnID0+IHtcbiAgICAgICAgY29uc3QgbmV3S2VybmVsQ29uZmlnID0gT2JqZWN0LmFzc2lnbih7fSwga2VybmVsQ29uZmlnLCB7IGJhY2tlbmROYW1lOiBuZXdCYWNrZW5kTmFtZSB9KTtcbiAgICAgICAgcmVnaXN0ZXJLZXJuZWwobmV3S2VybmVsQ29uZmlnKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIG1ha2VLZXkoa2VybmVsTmFtZSwgYmFja2VuZE5hbWUpIHtcbiAgICByZXR1cm4gYCR7YmFja2VuZE5hbWV9XyR7a2VybmVsTmFtZX1gO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9a2VybmVsX3JlZ2lzdHJ5LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGVudiB9IGZyb20gJy4vZW52aXJvbm1lbnQnO1xuZXhwb3J0IGZ1bmN0aW9uIHdhcm4oLi4ubXNnKSB7XG4gICAgaWYgKCFlbnYoKS5nZXRCb29sKCdJU19URVNUJykpIHtcbiAgICAgICAgY29uc29sZS53YXJuKC4uLm1zZyk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGxvZyguLi5tc2cpIHtcbiAgICBpZiAoIWVudigpLmdldEJvb2woJ0lTX1RFU1QnKSkge1xuICAgICAgICBjb25zb2xlLmxvZyguLi5tc2cpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxvZy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vKipcbiAqIEV4cG9ydHMgdW5kZXIgdGhlIHRmLm1hdGguKiBuYW1lc3BhY2UuXG4gKi9cbmltcG9ydCB7IGNvbmZ1c2lvbk1hdHJpeCB9IGZyb20gJy4vb3BzL2NvbmZ1c2lvbl9tYXRyaXgnO1xuZXhwb3J0IHsgY29uZnVzaW9uTWF0cml4IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tYXRoLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBBYnMsIENvbXBsZXhBYnMgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBhYnNvbHV0ZSB2YWx1ZSBlbGVtZW50LXdpc2U6IGBhYnMoeClgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbLTEsIDIsIC0zLCA0XSk7XG4gKlxuICogeC5hYnMoKS5wcmludCgpOyAgLy8gb3IgdGYuYWJzKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBgdGYuVGVuc29yYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gYWJzXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnYWJzJyk7XG4gICAgaWYgKCR4LmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKENvbXBsZXhBYnMsIGlucHV0cyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEFicywgaW5wdXRzKTtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgYWJzID0gb3AoeyBhYnNfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWJzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBBY29zIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgYWNvcyBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOiBgYWNvcyh4KWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFswLCAxLCAtMSwgLjddKTtcbiAqXG4gKiB4LmFjb3MoKS5wcmludCgpOyAgLy8gb3IgdGYuYWNvcyh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGFjb3NfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdhY29zJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEFjb3MsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgYWNvcyA9IG9wKHsgYWNvc18gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hY29zLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBBY29zaCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBpbnZlcnNlIGh5cGVyYm9saWMgY29zIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6XG4gKiBgYWNvc2goeClgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMTAsIDEsIDMsIDUuN10pO1xuICpcbiAqIHguYWNvc2goKS5wcmludCgpOyAgLy8gb3IgdGYuYWNvc2goeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gYWNvc2hfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdhY29zaCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChBY29zaCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBhY29zaCA9IG9wKHsgYWNvc2hfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWNvc2guanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEFkZCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBtYWtlVHlwZXNNYXRjaCB9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQWRkcyB0d28gYHRmLlRlbnNvcmBzIGVsZW1lbnQtd2lzZSwgQSArIEIuIFN1cHBvcnRzIGJyb2FkY2FzdGluZy5cbiAqXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMiwgMywgNF0pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFsxMCwgMjAsIDMwLCA0MF0pO1xuICpcbiAqIGEuYWRkKGIpLnByaW50KCk7ICAvLyBvciB0Zi5hZGQoYSwgYilcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBCcm9hZGNhc3QgYWRkIGEgd2l0aCBiLlxuICogY29uc3QgYSA9IHRmLnNjYWxhcig1KTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbMTAsIDIwLCAzMCwgNDBdKTtcbiAqXG4gKiBhLmFkZChiKS5wcmludCgpOyAgLy8gb3IgdGYuYWRkKGEsIGIpXG4gKiBgYGBcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBgdGYuVGVuc29yYCB0byBhZGQuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIGB0Zi5UZW5zb3JgIHRvIGFkZC4gTXVzdCBoYXZlIHRoZSBzYW1lIHR5cGUgYXMgYGFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0FyaXRobWV0aWMnfVxuICovXG5mdW5jdGlvbiBhZGRfKGEsIGIpIHtcbiAgICBsZXQgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnYWRkJyk7XG4gICAgbGV0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ2FkZCcpO1xuICAgIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGE6ICRhLCBiOiAkYiB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEFkZCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBhZGQgPSBvcCh7IGFkZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hZGQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEFkZE4gfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQWRkcyBhIGxpc3Qgb2YgYHRmLlRlbnNvcmBzIGVsZW1lbnQtd2lzZSwgZWFjaCB3aXRoIHRoZSBzYW1lIHNoYXBlIGFuZCBkdHlwZS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCAyXSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzMsIDRdKTtcbiAqIGNvbnN0IGMgPSB0Zi50ZW5zb3IxZChbNSwgNl0pO1xuICpcbiAqIHRmLmFkZE4oW2EsIGIsIGNdKS5wcmludCgpO1xuICogYGBgXG4gKiBAcGFyYW0gdGVuc29ycyBBIGxpc3Qgb2YgdGVuc29ycyB3aXRoIHRoZSBzYW1lIHNoYXBlIGFuZCBkdHlwZS5cbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0FyaXRobWV0aWMnfVxuICovXG5mdW5jdGlvbiBhZGROXyh0ZW5zb3JzKSB7XG4gICAgdXRpbC5hc3NlcnQoQXJyYXkuaXNBcnJheSh0ZW5zb3JzKSwgKCkgPT4gJ1RoZSBhcmd1bWVudCBwYXNzZWQgdG8gdGYuYWRkTigpIG11c3QgYmUgYSBsaXN0IG9mIHRlbnNvcnMnKTtcbiAgICB1dGlsLmFzc2VydCh0ZW5zb3JzLmxlbmd0aCA+PSAxLCAoKSA9PiBgTXVzdCBwYXNzIGF0IGxlYXN0IG9uZSB0ZW5zb3IgdG8gdGYuYWRkTigpLCBidXQgZ290IGAgK1xuICAgICAgICBgJHt0ZW5zb3JzLmxlbmd0aH1gKTtcbiAgICBjb25zdCAkdGVuc29ycyA9IHRlbnNvcnMubWFwKCh0LCBpKSA9PiBjb252ZXJ0VG9UZW5zb3IodCwgYHRlbnNvcnMke2l9YCwgJ2FkZE4nKSk7XG4gICAgY29uc3QgZmlyc3RUZW5zb3IgPSAkdGVuc29yc1swXTtcbiAgICAkdGVuc29ycy5mb3JFYWNoKHQgPT4ge1xuICAgICAgICBpZiAodC5kdHlwZSAhPT0gZmlyc3RUZW5zb3IuZHR5cGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQWxsIHRlbnNvcnMgcGFzc2VkIHRvIHRmLmFkZE4oKSBtdXN0IGhhdmUgdGhlIHNhbWUgZHR5cGUnKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgICR0ZW5zb3JzLmZvckVhY2godCA9PiB7XG4gICAgICAgIGlmICghdXRpbC5hcnJheXNFcXVhbCh0LnNoYXBlLCBmaXJzdFRlbnNvci5zaGFwZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQWxsIHRlbnNvcnMgcGFzc2VkIHRvIHRmLmFkZE4oKSBtdXN0IGhhdmUgdGhlIHNhbWUgc2hhcGUnKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGlucHV0cyA9ICR0ZW5zb3JzO1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEFkZE4sIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgYWRkTiA9IG9wKHsgYWRkTl8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hZGRfbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgQWxsIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIGxvZ2ljYWwgYW5kIG9mIGVsZW1lbnRzIGFjcm9zcyBkaW1lbnNpb25zIG9mIGEgYHRmLlRlbnNvcmAuXG4gKlxuICogUmVkdWNlcyB0aGUgaW5wdXQgYWxvbmcgdGhlIGRpbWVuc2lvbnMgZ2l2ZW4gaW4gYGF4ZXNgLiBVbmxlc3MgYGtlZXBEaW1zYFxuICogaXMgdHJ1ZSwgdGhlIHJhbmsgb2YgdGhlIGB0Zi5UZW5zb3JgIGlzIHJlZHVjZWQgYnkgMSBmb3IgZWFjaCBlbnRyeSBpblxuICogYGF4ZXNgLiBJZiBga2VlcERpbXNgIGlzIHRydWUsIHRoZSByZWR1Y2VkIGRpbWVuc2lvbnMgYXJlIHJldGFpbmVkIHdpdGhcbiAqIGxlbmd0aCAxLiBJZiBgYXhlc2AgaGFzIG5vIGVudHJpZXMsIGFsbCBkaW1lbnNpb25zIGFyZSByZWR1Y2VkLCBhbmQgYW5cbiAqIGB0Zi5UZW5zb3JgIHdpdGggYSBzaW5nbGUgZWxlbWVudCBpcyByZXR1cm5lZC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAxLCAxXSwgJ2Jvb2wnKTtcbiAqXG4gKiB4LmFsbCgpLnByaW50KCk7ICAvLyBvciB0Zi5hbGwoeClcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDEsIDAsIDBdLCBbMiwgMl0sICdib29sJyk7XG4gKlxuICogY29uc3QgYXhpcyA9IDE7XG4gKiB4LmFsbChheGlzKS5wcmludCgpOyAgLy8gb3IgdGYuYWxsKHgsIGF4aXMpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLiBNdXN0IGJlIG9mIGR0eXBlIGJvb2wuXG4gKiBAcGFyYW0gYXhpcyBUaGUgZGltZW5zaW9uKHMpIHRvIHJlZHVjZS4gQnkgZGVmYXVsdCBpdCByZWR1Y2VzXG4gKiAgICAgYWxsIGRpbWVuc2lvbnMuXG4gKiBAcGFyYW0ga2VlcERpbXMgSWYgdHJ1ZSwgcmV0YWlucyByZWR1Y2VkIGRpbWVuc2lvbnMgd2l0aCBzaXplIDEuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnUmVkdWN0aW9uJ31cbiAqL1xuZnVuY3Rpb24gYWxsXyh4LCBheGlzID0gbnVsbCwga2VlcERpbXMgPSBmYWxzZSkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2FsbCcsICdib29sJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBheGlzLCBrZWVwRGltcyB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEFsbCwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgYWxsID0gb3AoeyBhbGxfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWxsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBBbnkgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgbG9naWNhbCBvciBvZiBlbGVtZW50cyBhY3Jvc3MgZGltZW5zaW9ucyBvZiBhIGB0Zi5UZW5zb3JgLlxuICpcbiAqIFJlZHVjZXMgdGhlIGlucHV0IGFsb25nIHRoZSBkaW1lbnNpb25zIGdpdmVuIGluIGBheGVzYC4gVW5sZXNzIGBrZWVwRGltc2BcbiAqIGlzIHRydWUsIHRoZSByYW5rIG9mIHRoZSBgdGYuVGVuc29yYCBpcyByZWR1Y2VkIGJ5IDEgZm9yIGVhY2ggZW50cnkgaW5cbiAqIGBheGVzYC4gSWYgYGtlZXBEaW1zYCBpcyB0cnVlLCB0aGUgcmVkdWNlZCBkaW1lbnNpb25zIGFyZSByZXRhaW5lZCB3aXRoXG4gKiBsZW5ndGggMS4gSWYgYGF4ZXNgIGhhcyBubyBlbnRyaWVzLCBhbGwgZGltZW5zaW9ucyBhcmUgcmVkdWNlZCwgYW5kIGFuXG4gKiBgdGYuVGVuc29yYCB3aXRoIGEgc2luZ2xlIGVsZW1lbnQgaXMgcmV0dXJuZWQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMSwgMV0sICdib29sJyk7XG4gKlxuICogeC5hbnkoKS5wcmludCgpOyAgLy8gb3IgdGYuYW55KHgpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjJkKFsxLCAxLCAwLCAwXSwgWzIsIDJdLCAnYm9vbCcpO1xuICpcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5hbnkoYXhpcykucHJpbnQoKTsgIC8vIG9yIHRmLmFueSh4LCBheGlzKVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci4gTXVzdCBiZSBvZiBkdHlwZSBib29sLlxuICogQHBhcmFtIGF4aXMgVGhlIGRpbWVuc2lvbihzKSB0byByZWR1Y2UuIEJ5IGRlZmF1bHQgaXQgcmVkdWNlc1xuICogICAgIGFsbCBkaW1lbnNpb25zLlxuICogQHBhcmFtIGtlZXBEaW1zIElmIHRydWUsIHJldGFpbnMgcmVkdWNlZCBkaW1lbnNpb25zIHdpdGggc2l6ZSAxLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1JlZHVjdGlvbid9XG4gKi9cbmZ1bmN0aW9uIGFueV8oeCwgYXhpcyA9IG51bGwsIGtlZXBEaW1zID0gZmFsc2UpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdhbnknLCAnYm9vbCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICBjb25zdCBhdHRycyA9IHsgYXhpcywga2VlcERpbXMgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChBbnksIGlucHV0cywgYXR0cnMpO1xufVxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWVcbmV4cG9ydCBjb25zdCBhbnkgPSBvcCh7IGFueV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hbnkuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEFyZ01heCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIFJldHVybnMgdGhlIGluZGljZXMgb2YgdGhlIG1heGltdW0gdmFsdWVzIGFsb25nIGFuIGBheGlzYC5cbiAqXG4gKiBUaGUgcmVzdWx0IGhhcyB0aGUgc2FtZSBzaGFwZSBhcyBgaW5wdXRgIHdpdGggdGhlIGRpbWVuc2lvbiBhbG9uZyBgYXhpc2BcbiAqIHJlbW92ZWQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICpcbiAqIHguYXJnTWF4KCkucHJpbnQoKTsgIC8vIG9yIHRmLmFyZ01heCh4KVxuICogYGBgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IyZChbMSwgMiwgNCwgM10sIFsyLCAyXSk7XG4gKlxuICogY29uc3QgYXhpcyA9IDE7XG4gKiB4LmFyZ01heChheGlzKS5wcmludCgpOyAgLy8gb3IgdGYuYXJnTWF4KHgsIGF4aXMpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICogQHBhcmFtIGF4aXMgVGhlIGRpbWVuc2lvbiB0byByZWR1Y2UuIERlZmF1bHRzIHRvIDAgKG91dGVyLW1vc3QgZGltZW5zaW9uKS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdSZWR1Y3Rpb24nfVxuICovXG5mdW5jdGlvbiBhcmdNYXhfKHgsIGF4aXMgPSAwKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnYXJnTWF4Jyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBheGlzIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoQXJnTWF4LCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBhcmdNYXggPSBvcCh7IGFyZ01heF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hcmdfbWF4LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBBcmdNaW4gfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbmRpY2VzIG9mIHRoZSBtaW5pbXVtIHZhbHVlcyBhbG9uZyBhbiBgYXhpc2AuXG4gKlxuICogVGhlIHJlc3VsdCBoYXMgdGhlIHNhbWUgc2hhcGUgYXMgYGlucHV0YCB3aXRoIHRoZSBkaW1lbnNpb24gYWxvbmcgYGF4aXNgXG4gKiByZW1vdmVkLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqXG4gKiB4LmFyZ01pbigpLnByaW50KCk7ICAvLyBvciB0Zi5hcmdNaW4oeClcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDQsIDNdLCBbMiwgMl0pO1xuICpcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5hcmdNaW4oYXhpcykucHJpbnQoKTsgIC8vIG9yIHRmLmFyZ01pbih4LCBheGlzKVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBheGlzIFRoZSBkaW1lbnNpb24gdG8gcmVkdWNlLiBEZWZhdWx0cyB0byAwIChvdXRlci1tb3N0IGRpbWVuc2lvbikuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnUmVkdWN0aW9uJ31cbiAqL1xuZnVuY3Rpb24gYXJnTWluXyh4LCBheGlzID0gMCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2FyZ01pbicpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICBjb25zdCBhdHRycyA9IHsgYXhpcyB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEFyZ01pbiwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgYXJnTWluID0gb3AoeyBhcmdNaW5fIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXJnX21pbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vKipcbiAqIEdldHMgdGhlIG5ldyBzaGFwZSBvZiB0aGUgaW5wdXQgVGVuc29yIGFmdGVyIGl0J3MgYmVlbiByZXNoYXBlZFxuICogdG86XG4gKiBbYmxvY2tTaGFwZVswXSwgLi4uLCBibG9ja1NoYXBlW00tMV0sIGJhdGNoIC8gcHJvZChibG9ja1NoYXBlKSxcbiAqIGlucHV0U2hhcGVbMV0sIC4uLiwgaW5wdXRTaGFwZVtOLTFdXVxuICpcbiAqIFNlZSBzdGVwIDE6IGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9iYXRjaF90b19zcGFjZV9uZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVzaGFwZWQoaW5wdXRTaGFwZSwgYmxvY2tTaGFwZSwgcHJvZCwgYmF0Y2hUb1NwYWNlID0gdHJ1ZSkge1xuICAgIGxldCByZXNoYXBlZCA9IFtdO1xuICAgIGlmIChiYXRjaFRvU3BhY2UpIHtcbiAgICAgICAgcmVzaGFwZWQgPSByZXNoYXBlZC5jb25jYXQoYmxvY2tTaGFwZS5zbGljZSgwKSk7XG4gICAgICAgIHJlc2hhcGVkLnB1c2goaW5wdXRTaGFwZVswXSAvIHByb2QpO1xuICAgICAgICByZXNoYXBlZCA9IHJlc2hhcGVkLmNvbmNhdChpbnB1dFNoYXBlLnNsaWNlKDEpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlc2hhcGVkID0gcmVzaGFwZWQuY29uY2F0KGlucHV0U2hhcGVbMF0pO1xuICAgICAgICBjb25zdCBzcGF0aWFsTGVuZ3RoID0gYmxvY2tTaGFwZS5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BhdGlhbExlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICByZXNoYXBlZCA9XG4gICAgICAgICAgICAgICAgcmVzaGFwZWQuY29uY2F0KFtpbnB1dFNoYXBlW2kgKyAxXSAvIGJsb2NrU2hhcGVbaV0sIGJsb2NrU2hhcGVbaV1dKTtcbiAgICAgICAgfVxuICAgICAgICByZXNoYXBlZCA9IHJlc2hhcGVkLmNvbmNhdChpbnB1dFNoYXBlLnNsaWNlKHNwYXRpYWxMZW5ndGggKyAxKSk7XG4gICAgfVxuICAgIHJldHVybiByZXNoYXBlZDtcbn1cbi8qKlxuICogR2V0cyB0aGUgcGVybXV0YXRpb24gdGhhdCB3aWxsIHRyYW5zcG9zZSB0aGUgZGltZW5zaW9ucyBvZiB0aGVcbiAqIHJlc2hhcGVkIHRlbnNvciB0byBzaGFwZTpcbiAqXG4gKiBbYmF0Y2ggLyBwcm9kKGJsb2NrX3NoYXBlKSxpbnB1dFNoYXBlWzFdLCBibG9ja1NoYXBlWzBdLCAuLi4sXG4gKiBpbnB1dFNoYXBlW01dLCBibG9ja1NoYXBlW00tMV0saW5wdXRTaGFwZVtNKzFdLCAuLi4sIGlucHV0U2hhcGVbTi0xXV1cbiAqXG4gKiBzZWUgc3RlcCAyOiBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvYmF0Y2hfdG9fc3BhY2VfbmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBlcm11dGVkKHJlc2hhcGVkUmFuaywgYmxvY2tTaGFwZVJhbmssIGJhdGNoVG9TcGFjZSA9IHRydWUpIHtcbiAgICBjb25zdCBwZXJtdXRlZCA9IFtdO1xuICAgIGlmIChiYXRjaFRvU3BhY2UpIHtcbiAgICAgICAgcGVybXV0ZWQucHVzaChibG9ja1NoYXBlUmFuayk7XG4gICAgICAgIGZvciAobGV0IGkgPSBibG9ja1NoYXBlUmFuayArIDE7IGkgPCByZXNoYXBlZFJhbms7ICsraSkge1xuICAgICAgICAgICAgaWYgKGkgPD0gMiAqIGJsb2NrU2hhcGVSYW5rKSB7XG4gICAgICAgICAgICAgICAgcGVybXV0ZWQucHVzaChpKTtcbiAgICAgICAgICAgICAgICBwZXJtdXRlZC5wdXNoKGkgLSAoYmxvY2tTaGFwZVJhbmsgKyAxKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZXJtdXRlZC5wdXNoKGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBwZXJtdXRlZEJlZm9yZUJhdGNoID0gW107XG4gICAgICAgIGNvbnN0IHBlcm11dGVkQWZ0ZXJCYXRjaCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHJlc2hhcGVkUmFuazsgKytpKSB7XG4gICAgICAgICAgICBpZiAoaSA+PSBibG9ja1NoYXBlUmFuayAqIDIgKyAxIHx8IGkgJSAyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcGVybXV0ZWRBZnRlckJhdGNoLnB1c2goaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZXJtdXRlZEJlZm9yZUJhdGNoLnB1c2goaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcGVybXV0ZWQucHVzaCguLi5wZXJtdXRlZEJlZm9yZUJhdGNoKTtcbiAgICAgICAgcGVybXV0ZWQucHVzaCgwKTtcbiAgICAgICAgcGVybXV0ZWQucHVzaCguLi5wZXJtdXRlZEFmdGVyQmF0Y2gpO1xuICAgIH1cbiAgICByZXR1cm4gcGVybXV0ZWQ7XG59XG4vKipcbiAqIEdldHMgdGhlIHNoYXBlIG9mIHRoZSByZXNoYXBlZCBhbmQgcGVybXV0ZWQgaW5wdXQgVGVuc29yIGJlZm9yZSBhbnkgY3JvcHBpbmdcbiAqIGlzIGFwcGxpZWQuICBUaGUgbmV3IHNoYXBlIHdpbGwgYmU6XG4gKlxuICogW2JhdGNoIC8gcHJvZChibG9ja1NoYXBlKSxpbnB1dFNoYXBlWzFdICogYmxvY2tTaGFwZVswXSwgLi4uLFxuICogaW5wdXRTaGFwZVtNXSAqIGJsb2NrU2hhcGVbTS0xXSxpbnB1dFNoYXBlW00rMV0sIC4uLiwgaW5wdXRTaGFwZVtOLTFdXVxuICpcbiAqIFNlZSBzdGVwIDM6IGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9iYXRjaF90b19zcGFjZV9uZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVzaGFwZWRQZXJtdXRlZChpbnB1dFNoYXBlLCBibG9ja1NoYXBlLCBwcm9kLCBiYXRjaFRvU3BhY2UgPSB0cnVlKSB7XG4gICAgY29uc3QgcmVzaGFwZWRQZXJtdXRlZCA9IFtdO1xuICAgIGlmIChiYXRjaFRvU3BhY2UpIHtcbiAgICAgICAgcmVzaGFwZWRQZXJtdXRlZC5wdXNoKGlucHV0U2hhcGVbMF0gLyBwcm9kKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlc2hhcGVkUGVybXV0ZWQucHVzaChpbnB1dFNoYXBlWzBdICogcHJvZCk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgaW5wdXRTaGFwZS5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAoaSA8PSBibG9ja1NoYXBlLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGJhdGNoVG9TcGFjZSkge1xuICAgICAgICAgICAgICAgIHJlc2hhcGVkUGVybXV0ZWQucHVzaChibG9ja1NoYXBlW2kgLSAxXSAqIGlucHV0U2hhcGVbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzaGFwZWRQZXJtdXRlZC5wdXNoKGlucHV0U2hhcGVbaV0gLyBibG9ja1NoYXBlW2kgLSAxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXNoYXBlZFBlcm11dGVkLnB1c2goaW5wdXRTaGFwZVtpXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc2hhcGVkUGVybXV0ZWQ7XG59XG4vKipcbiAqIENvbnZlcnRzIHRoZSBjcm9wcyBhcmd1bWVudCBpbnRvIHRoZSBiZWdpbm5pbmcgY29vcmRpbmF0ZXMgb2YgYSBzbGljZVxuICogb3BlcmF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2xpY2VCZWdpbkNvb3Jkcyhjcm9wcywgYmxvY2tTaGFwZSkge1xuICAgIGNvbnN0IHNsaWNlQmVnaW5Db29yZHMgPSBbMF07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBibG9ja1NoYXBlOyArK2kpIHtcbiAgICAgICAgc2xpY2VCZWdpbkNvb3Jkcy5wdXNoKGNyb3BzW2ldWzBdKTtcbiAgICB9XG4gICAgcmV0dXJuIHNsaWNlQmVnaW5Db29yZHM7XG59XG4vKipcbiAqIENvbnZlcnRzIHRoZSBjcm9wcyBhcmd1bWVudCBpbnRvIHRoZSBzaXplIG9mIGEgc2xpY2Ugb3BlcmF0aW9uLiAgV2hlblxuICogY29tYmluZWQgd2l0aCBnZXRTbGljZUJlZ2luQ29vcmRzIHRoaXMgZnVuY3Rpb24gYWxsb3dzIHRoZSByZXNoYXBlZCBhbmRcbiAqIHBlcm11dGVkIFRlbnNvciB0byBiZSBjcm9wcGVkIHRvIGl0cyBmaW5hbCBvdXRwdXQgc2hhcGUgb2Y6XG4gKlxuICogaW5wdXRTaGFwZVsxXSAqIGJsb2NrU2hhcGVbMF0gLSBjcm9wc1swLDBdIC0gY3JvcHNbMCwxXSwgLi4uLFxuICogaW5wdXRTaGFwZVtNXSAqIGJsb2NrU2hhcGVbTS0xXSAtY3JvcHNbTS0xLDBdIC1cbiAqIGNyb3BzW00tMSwxXSxpbnB1dFNoYXBlW00rMV0sIC4uLiwgaW5wdXRTaGFwZVtOLTFdXVxuICpcbiAqIFNlZSBzdGVwIDQ6IGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9iYXRjaF90b19zcGFjZV9uZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2xpY2VTaXplKHVuY3JvcHBlZFNoYXBlLCBjcm9wcywgYmxvY2tTaGFwZSkge1xuICAgIGNvbnN0IHNsaWNlU2l6ZSA9IHVuY3JvcHBlZFNoYXBlLnNsaWNlKDAsIDEpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmxvY2tTaGFwZTsgKytpKSB7XG4gICAgICAgIHNsaWNlU2l6ZS5wdXNoKHVuY3JvcHBlZFNoYXBlW2kgKyAxXSAtIGNyb3BzW2ldWzBdIC0gY3JvcHNbaV1bMV0pO1xuICAgIH1cbiAgICByZXR1cm4gc2xpY2VTaXplO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXJyYXlfb3BzX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEFzaW4gfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBhc2luIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6IGBhc2luKHgpYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzAsIDEsIC0xLCAuN10pO1xuICpcbiAqIHguYXNpbigpLnByaW50KCk7ICAvLyBvciB0Zi5hc2luKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gYXNpbl8oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2FzaW4nKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoQXNpbiwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBhc2luID0gb3AoeyBhc2luXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFzaW4uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEFzaW5oIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgaW52ZXJzZSBoeXBlcmJvbGljIHNpbiBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOlxuICogYGFzaW5oKHgpYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzAsIDEsIC0xLCAuN10pO1xuICpcbiAqIHguYXNpbmgoKS5wcmludCgpOyAgLy8gb3IgdGYuYXNpbmgoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gYXNpbmhfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdhc2luaCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChBc2luaCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBhc2luaCA9IG9wKHsgYXNpbmhfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXNpbmguanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEF0YW4gfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBhdGFuIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6IGBhdGFuKHgpYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzAsIDEsIC0xLCAuN10pO1xuICpcbiAqIHguYXRhbigpLnByaW50KCk7ICAvLyBvciB0Zi5hdGFuKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGF0YW5fKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdhdGFuJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEF0YW4sIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgYXRhbiA9IG9wKHsgYXRhbl8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hdGFuLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBBdGFuMiB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBtYWtlVHlwZXNNYXRjaCB9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgYXJjdGFuZ2VudCBvZiBgdGYuVGVuc29yYHMgYSAvIGIgZWxlbWVudC13aXNlOiBgYXRhbjIoYSwgYilgLlxuICogU3VwcG9ydHMgYnJvYWRjYXN0aW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEuMCwgMS4wLCAtMS4wLCAuN10pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFsyLjAsIDEzLjAsIDMuNSwgLjIxXSk7XG4gKlxuICogdGYuYXRhbjIoYSwgYikucHJpbnQoKVxuICogYGBgXG4gKlxuICogQHBhcmFtIGEgVGhlIGZpcnN0IHRlbnNvci5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgdGVuc29yLiBNdXN0IGhhdmUgdGhlIHNhbWUgZHR5cGUgYXMgYGFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBhdGFuMl8oYSwgYikge1xuICAgIGxldCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdhdGFuMicpO1xuICAgIGxldCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdhdGFuMicpO1xuICAgIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGE6ICRhLCBiOiAkYiB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEF0YW4yLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGF0YW4yID0gb3AoeyBhdGFuMl8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hdGFuMi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgQXRhbmggfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBpbnZlcnNlIGh5cGVyYm9saWMgdGFuIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6XG4gKiBgYXRhbmgoeClgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMCwgLjEsIC0uMSwgLjddKTtcbiAqXG4gKiB4LmF0YW5oKCkucHJpbnQoKTsgIC8vIG9yIHRmLmF0YW5oKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGF0YW5oXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnYXRhbmgnKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoQXRhbmgsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgYXRhbmggPSBvcCh7IGF0YW5oXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWF0YW5oLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBBdmdQb29sIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgY2FzdCB9IGZyb20gJy4vY2FzdCc7XG5pbXBvcnQgKiBhcyBjb252X3V0aWwgZnJvbSAnLi9jb252X3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIDJEIGF2ZXJhZ2UgcG9vbGluZyBvZiBhbiBpbWFnZS5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDQgb3IgcmFuayAzIG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgaW5DaGFubmVsc11gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXJTaXplIFRoZSBmaWx0ZXIgc2l6ZTogYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoXWAuIElmXG4gKiAgICAgYGZpbHRlclNpemVgIGlzIGEgc2luZ2xlIG51bWJlciwgdGhlbiBgZmlsdGVySGVpZ2h0ID09IGZpbHRlcldpZHRoYC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBwb29saW5nOiBgW3N0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGhdYC4gSWZcbiAqICAgICBgc3RyaWRlc2AgaXMgYSBzaW5nbGUgbnVtYmVyLCB0aGVuIGBzdHJpZGVIZWlnaHQgPT0gc3RyaWRlV2lkdGhgLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobTpcbiAqICAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAgLSBGb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uXShcbiAqICAgICAgICAgaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uKVxuICogQHBhcmFtIGRpbVJvdW5kaW5nTW9kZSBBIHN0cmluZyBmcm9tOiAnY2VpbCcsICdyb3VuZCcsICdmbG9vcicuIElmIG5vbmUgaXNcbiAqICAgICBwcm92aWRlZCwgaXQgd2lsbCBkZWZhdWx0IHRvIHRydW5jYXRlLlxuICovXG5mdW5jdGlvbiBhdmdQb29sXyh4LCBmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2F2Z1Bvb2wnLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IGRpbGF0aW9ucyA9IDE7XG4gICAgdXRpbC5hc3NlcnQoY29udl91dGlsLmVpdGhlclN0cmlkZXNPckRpbGF0aW9uc0FyZU9uZShzdHJpZGVzLCBkaWxhdGlvbnMpLCAoKSA9PiAnRXJyb3IgaW4gYXZnUG9vbDogRWl0aGVyIHN0cmlkZXMgb3IgZGlsYXRpb25zIG11c3QgYmUgMS4gJyArXG4gICAgICAgIGBHb3Qgc3RyaWRlcyAke3N0cmlkZXN9IGFuZCBkaWxhdGlvbnMgJyR7ZGlsYXRpb25zfSdgKTtcbiAgICBsZXQgeDREID0gJHg7XG4gICAgbGV0IHJlc2hhcGVkVG80RCA9IGZhbHNlO1xuICAgIGlmICgkeC5yYW5rID09PSAzKSB7XG4gICAgICAgIHJlc2hhcGVkVG80RCA9IHRydWU7XG4gICAgICAgIHg0RCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV0sICR4LnNoYXBlWzJdXSk7XG4gICAgfVxuICAgIHV0aWwuYXNzZXJ0KHg0RC5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gYXZnUG9vbDogeCBtdXN0IGJlIHJhbmsgNCBidXQgZ290IHJhbmsgJHt4NEQucmFua30uYCk7XG4gICAgaWYgKGRpbVJvdW5kaW5nTW9kZSAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNJbnQocGFkKSwgKCkgPT4gYEVycm9yIGluIGF2Z1Bvb2w6IHBhZCBtdXN0IGJlIGFuIGludGVnZXIgd2hlbiB1c2luZywgYCArXG4gICAgICAgICAgICBgZGltUm91bmRpbmdNb2RlICR7ZGltUm91bmRpbmdNb2RlfSBidXQgZ290IHBhZCAke3BhZH0uYCk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogeDREIH07XG4gICAgY29uc3QgYXR0cnMgPSB7IGZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlIH07XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgIGxldCByZXMgPSBFTkdJTkUucnVuS2VybmVsKEF2Z1Bvb2wsIGlucHV0cywgYXR0cnMpO1xuICAgIHJlcyA9IGNhc3QocmVzLCAkeC5kdHlwZSk7XG4gICAgaWYgKHJlc2hhcGVkVG80RCkge1xuICAgICAgICByZXR1cm4gcmVzaGFwZShyZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdXSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5leHBvcnQgY29uc3QgYXZnUG9vbCA9IG9wKHsgYXZnUG9vbF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hdmdfcG9vbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgQXZnUG9vbDNEIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgY2FzdCB9IGZyb20gJy4vY2FzdCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL3Jlc2hhcGUnO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgM0QgYXZlcmFnZSBwb29saW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yNWQoWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDhdLCBbMSwgMiwgMiwgMiwgMV0pO1xuICogY29uc3QgcmVzdWx0ID0gdGYuYXZnUG9vbDNkKHgsIDIsIDEsICd2YWxpZCcpO1xuICogcmVzdWx0LnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDUgb3IgcmFuayA0IG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgZGVwdGgsIGhlaWdodCwgd2lkdGgsIGluQ2hhbm5lbHNdYC5cbiAqIEBwYXJhbSBmaWx0ZXJTaXplIFRoZSBmaWx0ZXIgc2l6ZTpcbiAqICAgICBgW2ZpbHRlckRlcHRoLCBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoXWAuXG4gKiAgICAgSWYgYGZpbHRlclNpemVgIGlzIGEgc2luZ2xlIG51bWJlcixcbiAqICAgICB0aGVuIGBmaWx0ZXJEZXB0aCA9PSBmaWx0ZXJIZWlnaHQgPT0gZmlsdGVyV2lkdGhgLlxuICogQHBhcmFtIHN0cmlkZXMgVGhlIHN0cmlkZXMgb2YgdGhlIHBvb2xpbmc6XG4gKiAgICAgYFtzdHJpZGVEZXB0aCwgc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aF1gLlxuICogICAgIElmIGBzdHJpZGVzYCBpcyBhIHNpbmdsZSBudW1iZXIsXG4gKiAgICAgdGhlbiBgc3RyaWRlRGVwdGggPT0gc3RyaWRlSGVpZ2h0ID09IHN0cmlkZVdpZHRoYC5cbiAqIEBwYXJhbSBwYWQgVGhlIHR5cGUgb2YgcGFkZGluZyBhbGdvcml0aG0uXG4gKiAgICAtIGBzYW1lYCBhbmQgc3RyaWRlIDE6IG91dHB1dCB3aWxsIGJlIG9mIHNhbWUgc2l6ZSBhcyBpbnB1dCxcbiAqICAgICAgIHJlZ2FyZGxlc3Mgb2YgZmlsdGVyIHNpemUuXG4gKiAgICAtIGB2YWxpZGA6IG91dHB1dCB3aWxsIGJlIHNtYWxsZXIgdGhhbiBpbnB1dCBpZiBmaWx0ZXIgaXMgbGFyZ2VyXG4gKiAgICAgICB0aGFuIDEqMXgxLlxuICogICAgLSBGb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uXShcbiAqICAgICAgICAgIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbilcbiAqIEBwYXJhbSBkaW1Sb3VuZGluZ01vZGUgQSBzdHJpbmcgZnJvbTogJ2NlaWwnLCAncm91bmQnLCAnZmxvb3InLiBJZiBub25lIGlzXG4gKiAgICAgcHJvdmlkZWQsIGl0IHdpbGwgZGVmYXVsdCB0byB0cnVuY2F0ZS5cbiAqIEBwYXJhbSBkYXRhRm9ybWF0IEFuIG9wdGlvbmFsIHN0cmluZyBmcm9tOiBcIk5ESFdDXCIsIFwiTkNESFdcIi4gRGVmYXVsdHMgdG9cbiAqICAgICBcIk5ESFdDXCIuIFNwZWNpZnkgdGhlIGRhdGEgZm9ybWF0IG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEuIFdpdGggdGhlXG4gKiAgICAgZGVmYXVsdCBmb3JtYXQgXCJOREhXQ1wiLCB0aGUgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIG9yZGVyIG9mOiBbYmF0Y2gsXG4gKiAgICAgZGVwdGgsIGhlaWdodCwgd2lkdGgsIGNoYW5uZWxzXS4gT25seSBcIk5ESFdDXCIgaXMgY3VycmVudGx5IHN1cHBvcnRlZC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdDb252b2x1dGlvbid9XG4gKi9cbmZ1bmN0aW9uIGF2Z1Bvb2wzZF8oeCwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGRhdGFGb3JtYXQgPSAnTkRIV0MnKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnYXZnUG9vbDNkJywgJ2Zsb2F0MzInKTtcbiAgICBsZXQgeDVEID0gJHg7XG4gICAgbGV0IHJlc2hhcGVkVG81RCA9IGZhbHNlO1xuICAgIGlmICgkeC5yYW5rID09PSA0KSB7XG4gICAgICAgIHJlc2hhcGVkVG81RCA9IHRydWU7XG4gICAgICAgIHg1RCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV0sICR4LnNoYXBlWzJdLCAkeC5zaGFwZVszXV0pO1xuICAgIH1cbiAgICB1dGlsLmFzc2VydCh4NUQucmFuayA9PT0gNSwgKCkgPT4gYEVycm9yIGluIGF2Z1Bvb2wzZDogeCBtdXN0IGJlIHJhbmsgNSBidXQgZ290IHJhbmsgJHt4NUQucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoZGF0YUZvcm1hdCA9PT0gJ05ESFdDJywgKCkgPT4gYEVycm9yIGluIGF2Z1Bvb2wzZDogT25seSBOREhXQyBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLCBgICtcbiAgICAgICAgYGJ1dCBnb3QgZGF0YUZvcm1hdCBvZiAke2RhdGFGb3JtYXR9YCk7XG4gICAgaWYgKGRpbVJvdW5kaW5nTW9kZSAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNJbnQocGFkKSwgKCkgPT4gYEVycm9yIGluIGF2Z1Bvb2wzZDogcGFkIG11c3QgYmUgYW4gaW50ZWdlciB3aGVuIHVzaW5nLCBgICtcbiAgICAgICAgICAgIGBkaW1Sb3VuZGluZ01vZGUgJHtkaW1Sb3VuZGluZ01vZGV9IGJ1dCBnb3QgcGFkICR7cGFkfS5gKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiB4NUQgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGRhdGFGb3JtYXQgfTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgbGV0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoQXZnUG9vbDNELCBpbnB1dHMsIGF0dHJzKTtcbiAgICByZXMgPSBjYXN0KHJlcywgeDVELmR0eXBlKTtcbiAgICBpZiAocmVzaGFwZWRUbzVEKSB7XG4gICAgICAgIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM10sIHJlcy5zaGFwZVs0XV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IGF2Z1Bvb2wzZCA9IG9wKHsgYXZnUG9vbDNkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWF2Z19wb29sXzNkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYXhpcyBzcGVjaWZpZXMgdGhlIGlubmVyIG1vc3QgZGltZW5zaW9ucyBvZiB0aGVcbiAqIGFycmF5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXhlc0FyZUlubmVyTW9zdERpbXMoYXhlcywgcmFuaykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXhlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAoYXhlc1theGVzLmxlbmd0aCAtIGkgLSAxXSAhPT0gcmFuayAtIDEgLSBpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5leHBvcnQgZnVuY3Rpb24gY29tYmluZUxvY2F0aW9ucyhvdXRwdXRMb2MsIHJlZHVjZUxvYywgYXhlcykge1xuICAgIGNvbnN0IHJhbmsgPSBvdXRwdXRMb2MubGVuZ3RoICsgcmVkdWNlTG9jLmxlbmd0aDtcbiAgICBjb25zdCBsb2MgPSBbXTtcbiAgICBsZXQgb3V0SWR4ID0gMDtcbiAgICBsZXQgcmVkdWNlSWR4ID0gMDtcbiAgICBmb3IgKGxldCBkaW0gPSAwOyBkaW0gPCByYW5rOyBkaW0rKykge1xuICAgICAgICBpZiAoYXhlcy5pbmRleE9mKGRpbSkgPT09IC0xKSB7XG4gICAgICAgICAgICBsb2MucHVzaChvdXRwdXRMb2Nbb3V0SWR4KytdKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxvYy5wdXNoKHJlZHVjZUxvY1tyZWR1Y2VJZHgrK10pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsb2M7XG59XG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcyhhU2hhcGUsIGF4ZXMpIHtcbiAgICBjb25zdCBvdXRTaGFwZSA9IFtdO1xuICAgIGNvbnN0IHJhbmsgPSBhU2hhcGUubGVuZ3RoO1xuICAgIGZvciAobGV0IGRpbSA9IDA7IGRpbSA8IHJhbms7IGRpbSsrKSB7XG4gICAgICAgIGlmIChheGVzLmluZGV4T2YoZGltKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIG91dFNoYXBlLnB1c2goYVNoYXBlW2RpbV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlZHVjZVNoYXBlID0gYXhlcy5tYXAoZGltID0+IGFTaGFwZVtkaW1dKTtcbiAgICByZXR1cm4gW291dFNoYXBlLCByZWR1Y2VTaGFwZV07XG59XG5leHBvcnQgZnVuY3Rpb24gZXhwYW5kU2hhcGVUb0tlZXBEaW0oc2hhcGUsIGF4ZXMpIHtcbiAgICBjb25zdCByZWR1Y2VTdWJTaGFwZSA9IGF4ZXMubWFwKHggPT4gMSk7XG4gICAgcmV0dXJuIGNvbWJpbmVMb2NhdGlvbnMoc2hhcGUsIHJlZHVjZVN1YlNoYXBlLCBheGVzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcyhtc2csIGF4ZXMsIHJhbmspIHtcbiAgICB1dGlsLmFzc2VydChheGVzQXJlSW5uZXJNb3N0RGltcyhheGVzLCByYW5rKSwgKCkgPT4gYCR7bXNnfSBzdXBwb3J0cyBvbmx5IGlubmVyLW1vc3QgYXhlcyBmb3Igbm93LiBgICtcbiAgICAgICAgYEdvdCBheGVzICR7YXhlc30gYW5kIHJhbmstJHtyYW5rfSBpbnB1dC5gKTtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgYXhlcyBwZXJtdXRhdGlvbiB0byBiZSB1c2VkIHdpdGggYHRmLnRyYW5zcG9zZWAsIGlmIHN1Y2hcbiAqIHBlcm11dGF0aW9uIGlzIG5lY2Vzc2FyeS4gT3RoZXJ3aXNlIGl0IHJldHVybnMgbnVsbC4gVGhpcyBtZXRob2QgaXMgdXNlZCBieVxuICogb3BlcmF0aW9ucyB0aGF0IG9wZXJhdGUgb25seSBvbiBpbm5lci1tb3N0IGF4ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBeGVzUGVybXV0YXRpb24oYXhlcywgcmFuaykge1xuICAgIGlmIChheGVzQXJlSW5uZXJNb3N0RGltcyhheGVzLCByYW5rKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5rOyArK2kpIHtcbiAgICAgICAgaWYgKGF4ZXMuaW5kZXhPZihpKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGF4ZXMuZm9yRWFjaChheGlzID0+IHJlc3VsdC5wdXNoKGF4aXMpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqIFJldHVybnMgdGhlIGF4ZXMgcGVybXV0YXRpb24gdGhhdCB1bmRvZXMgdGhlIG9yaWdpbmFsIHBlcm11dGF0aW9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFVuZG9BeGVzUGVybXV0YXRpb24oYXhlcykge1xuICAgIHJldHVybiBheGVzLm1hcCgoYXhpcywgaSkgPT4gW2ksIGF4aXNdKVxuICAgICAgICAuc29ydCgoYSwgYikgPT4gYVsxXSAtIGJbMV0pXG4gICAgICAgIC5tYXAoeCA9PiB4WzBdKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbm5lck1vc3RBeGVzKG51bUF4ZXMsIHJhbmspIHtcbiAgICBjb25zdCByZXMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gcmFuayAtIG51bUF4ZXM7IGkgPCByYW5rOyArK2kpIHtcbiAgICAgICAgcmVzLnB1c2goaSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1heGlzX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGFkZCB9IGZyb20gJy4vYWRkJztcbmltcG9ydCB7IGNvbmNhdCB9IGZyb20gJy4vY29uY2F0JztcbmltcG9ydCB7IG1hdE11bCB9IGZyb20gJy4vbWF0X211bCc7XG5pbXBvcnQgeyBtdWwgfSBmcm9tICcuL211bCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHNpZ21vaWQgfSBmcm9tICcuL3NpZ21vaWQnO1xuaW1wb3J0IHsgc2xpY2UgfSBmcm9tICcuL3NsaWNlJztcbmltcG9ydCB7IHRhbmggfSBmcm9tICcuL3RhbmgnO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgbmV4dCBzdGF0ZSBhbmQgb3V0cHV0IG9mIGEgQmFzaWNMU1RNQ2VsbC5cbiAqXG4gKiBSZXR1cm5zIGBbbmV3QywgbmV3SF1gLlxuICpcbiAqIERlcml2ZWQgZnJvbSB0Zi5jb250cmliLnJubi5CYXNpY0xTVE1DZWxsLlxuICpcbiAqIEBwYXJhbSBmb3JnZXRCaWFzIEZvcmdldCBiaWFzIGZvciB0aGUgY2VsbC5cbiAqIEBwYXJhbSBsc3RtS2VybmVsIFRoZSB3ZWlnaHRzIGZvciB0aGUgY2VsbC5cbiAqIEBwYXJhbSBsc3RtQmlhcyBUaGUgYmlhcyBmb3IgdGhlIGNlbGwuXG4gKiBAcGFyYW0gZGF0YSBUaGUgaW5wdXQgdG8gdGhlIGNlbGwuXG4gKiBAcGFyYW0gYyBQcmV2aW91cyBjZWxsIHN0YXRlLlxuICogQHBhcmFtIGggUHJldmlvdXMgY2VsbCBvdXRwdXQuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnUk5OJ31cbiAqL1xuZnVuY3Rpb24gYmFzaWNMU1RNQ2VsbF8oZm9yZ2V0QmlhcywgbHN0bUtlcm5lbCwgbHN0bUJpYXMsIGRhdGEsIGMsIGgpIHtcbiAgICBjb25zdCAkZm9yZ2V0QmlhcyA9IGNvbnZlcnRUb1RlbnNvcihmb3JnZXRCaWFzLCAnZm9yZ2V0QmlhcycsICdiYXNpY0xTVE1DZWxsJyk7XG4gICAgY29uc3QgJGxzdG1LZXJuZWwgPSBjb252ZXJ0VG9UZW5zb3IobHN0bUtlcm5lbCwgJ2xzdG1LZXJuZWwnLCAnYmFzaWNMU1RNQ2VsbCcpO1xuICAgIGNvbnN0ICRsc3RtQmlhcyA9IGNvbnZlcnRUb1RlbnNvcihsc3RtQmlhcywgJ2xzdG1CaWFzJywgJ2Jhc2ljTFNUTUNlbGwnKTtcbiAgICBjb25zdCAkZGF0YSA9IGNvbnZlcnRUb1RlbnNvcihkYXRhLCAnZGF0YScsICdiYXNpY0xTVE1DZWxsJyk7XG4gICAgY29uc3QgJGMgPSBjb252ZXJ0VG9UZW5zb3IoYywgJ2MnLCAnYmFzaWNMU1RNQ2VsbCcpO1xuICAgIGNvbnN0ICRoID0gY29udmVydFRvVGVuc29yKGgsICdoJywgJ2Jhc2ljTFNUTUNlbGwnKTtcbiAgICBjb25zdCBjb21iaW5lZCA9IGNvbmNhdChbJGRhdGEsICRoXSwgMSk7XG4gICAgY29uc3Qgd2VpZ2h0ZWQgPSBtYXRNdWwoY29tYmluZWQsICRsc3RtS2VybmVsKTtcbiAgICBjb25zdCByZXMgPSBhZGQod2VpZ2h0ZWQsICRsc3RtQmlhcyk7XG4gICAgLy8gaSA9IGlucHV0X2dhdGUsIGogPSBuZXdfaW5wdXQsIGYgPSBmb3JnZXRfZ2F0ZSwgbyA9IG91dHB1dF9nYXRlXG4gICAgY29uc3QgYmF0Y2hTaXplID0gcmVzLnNoYXBlWzBdO1xuICAgIGNvbnN0IHNsaWNlQ29scyA9IHJlcy5zaGFwZVsxXSAvIDQ7XG4gICAgY29uc3Qgc2xpY2VTaXplID0gW2JhdGNoU2l6ZSwgc2xpY2VDb2xzXTtcbiAgICBjb25zdCBpID0gc2xpY2UocmVzLCBbMCwgMF0sIHNsaWNlU2l6ZSk7XG4gICAgY29uc3QgaiA9IHNsaWNlKHJlcywgWzAsIHNsaWNlQ29sc10sIHNsaWNlU2l6ZSk7XG4gICAgY29uc3QgZiA9IHNsaWNlKHJlcywgWzAsIHNsaWNlQ29scyAqIDJdLCBzbGljZVNpemUpO1xuICAgIGNvbnN0IG8gPSBzbGljZShyZXMsIFswLCBzbGljZUNvbHMgKiAzXSwgc2xpY2VTaXplKTtcbiAgICBjb25zdCBuZXdDID0gYWRkKG11bChzaWdtb2lkKGkpLCB0YW5oKGopKSwgbXVsKCRjLCBzaWdtb2lkKGFkZCgkZm9yZ2V0QmlhcywgZikpKSk7XG4gICAgY29uc3QgbmV3SCA9IG11bCh0YW5oKG5ld0MpLCBzaWdtb2lkKG8pKTtcbiAgICByZXR1cm4gW25ld0MsIG5ld0hdO1xufVxuZXhwb3J0IGNvbnN0IGJhc2ljTFNUTUNlbGwgPSBvcCh7IGJhc2ljTFNUTUNlbGxfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmFzaWNfbHN0bV9jZWxsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBCYXRjaFRvU3BhY2VORCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBUaGlzIG9wZXJhdGlvbiByZXNoYXBlcyB0aGUgXCJiYXRjaFwiIGRpbWVuc2lvbiAwIGludG8gYE0gKyAxYCBkaW1lbnNpb25zIG9mXG4gKiBzaGFwZSBgYmxvY2tTaGFwZSArIFtiYXRjaF1gLCBpbnRlcmxlYXZlcyB0aGVzZSBibG9ja3MgYmFjayBpbnRvIHRoZSBncmlkXG4gKiBkZWZpbmVkIGJ5IHRoZSBzcGF0aWFsIGRpbWVuc2lvbnMgYFsxLCAuLi4sIE1dYCwgdG8gb2J0YWluIGEgcmVzdWx0IHdpdGhcbiAqIHRoZSBzYW1lIHJhbmsgYXMgdGhlIGlucHV0LiBUaGUgc3BhdGlhbCBkaW1lbnNpb25zIG9mIHRoaXMgaW50ZXJtZWRpYXRlXG4gKiByZXN1bHQgYXJlIHRoZW4gb3B0aW9uYWxseSBjcm9wcGVkIGFjY29yZGluZyB0byBgY3JvcHNgIHRvIHByb2R1Y2UgdGhlXG4gKiBvdXRwdXQuIFRoaXMgaXMgdGhlIHJldmVyc2Ugb2YgYHRmLnNwYWNlVG9CYXRjaE5EYC4gU2VlIGJlbG93IGZvciBhIHByZWNpc2VcbiAqIGRlc2NyaXB0aW9uLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yNGQoWzEsIDIsIDMsIDRdLCBbNCwgMSwgMSwgMV0pO1xuICogY29uc3QgYmxvY2tTaGFwZSA9IFsyLCAyXTtcbiAqIGNvbnN0IGNyb3BzID0gW1swLCAwXSwgWzAsIDBdXTtcbiAqXG4gKiB4LmJhdGNoVG9TcGFjZU5EKGJsb2NrU2hhcGUsIGNyb3BzKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHggQSBgdGYuVGVuc29yYC4gTi1EIHdpdGggYHguc2hhcGVgID0gYFtiYXRjaF0gKyBzcGF0aWFsU2hhcGUgK1xuICogcmVtYWluaW5nU2hhcGVgLCB3aGVyZSBzcGF0aWFsU2hhcGUgaGFzIGBNYCBkaW1lbnNpb25zLlxuICogQHBhcmFtIGJsb2NrU2hhcGUgQSAxLUQgYXJyYXkuIE11c3QgaGF2ZSBzaGFwZSBgW01dYCwgYWxsIHZhbHVlcyBtdXN0XG4gKiBiZSA+PSAxLlxuICogQHBhcmFtIGNyb3BzIEEgMi1EIGFycmF5LiAgTXVzdCBoYXZlIHNoYXBlIGBbTSwgMl1gLCBhbGwgdmFsdWVzIG11c3QgYmUgPj0gMC5cbiAqIGBjcm9wc1tpXSA9IFtjcm9wU3RhcnQsIGNyb3BFbmRdYCBzcGVjaWZpZXMgdGhlIGFtb3VudCB0byBjcm9wIGZyb20gaW5wdXRcbiAqIGRpbWVuc2lvbiBgaSArIDFgLCB3aGljaCBjb3JyZXNwb25kcyB0byBzcGF0aWFsIGRpbWVuc2lvbiBgaWAuIEl0IGlzIHJlcXVpcmVkXG4gKiB0aGF0IGBjcm9wU3RhcnRbaV0gKyBjcm9wRW5kW2ldIDw9IGJsb2NrU2hhcGVbaV0gKiBpbnB1dFNoYXBlW2kgKyAxXWBcbiAqXG4gKiBUaGlzIG9wZXJhdGlvbiBpcyBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmcgc3RlcHM6XG4gKlxuICogMS4gUmVzaGFwZSBgeGAgdG8gYHJlc2hhcGVkYCBvZiBzaGFwZTogYFtibG9ja1NoYXBlWzBdLCAuLi4sXG4gKiBibG9ja1NoYXBlW00tMV0sIGJhdGNoIC8gcHJvZChibG9ja1NoYXBlKSwgeC5zaGFwZVsxXSwgLi4uLFxuICogeC5zaGFwZVtOLTFdXWBcbiAqXG4gKiAyLiBQZXJtdXRlIGRpbWVuc2lvbnMgb2YgYHJlc2hhcGVkYHRvIHByb2R1Y2UgYHBlcm11dGVkYCBvZiBzaGFwZSBgW2JhdGNoIC9cbiAqIHByb2QoYmxvY2tTaGFwZSkseC5zaGFwZVsxXSwgYmxvY2tTaGFwZVswXSwgLi4uLCB4LnNoYXBlW01dLFxuICogYmxvY2tTaGFwZVtNLTFdLHguc2hhcGVbTSsxXSwgLi4uLCB4LnNoYXBlW04tMV1dYFxuICpcbiAqIDMuIFJlc2hhcGUgYHBlcm11dGVkYCB0byBwcm9kdWNlIGByZXNoYXBlZFBlcm11dGVkYCBvZiBzaGFwZSBgW2JhdGNoIC9cbiAqIHByb2QoYmxvY2tTaGFwZSkseC5zaGFwZVsxXSAqIGJsb2NrU2hhcGVbMF0sIC4uLiwgeC5zaGFwZVtNXSAqXG4gKiBibG9ja1NoYXBlW00tMV0seC5zaGFwZVtNKzFdLCAuLi4sIHguc2hhcGVbTi0xXV1gXG4gKlxuICogNC4gQ3JvcCB0aGUgc3RhcnQgYW5kIGVuZCBvZiBkaW1lbnNpb25zIGBbMSwgLi4uLCBNXWAgb2YgYHJlc2hhcGVkUGVybXV0ZWRgXG4gKiBhY2NvcmRpbmcgdG8gYGNyb3BzYCB0byBwcm9kdWNlIHRoZSBvdXRwdXQgb2Ygc2hhcGU6IGBbYmF0Y2ggL1xuICogcHJvZChibG9ja1NoYXBlKSx4LnNoYXBlWzFdICogYmxvY2tTaGFwZVswXSAtIGNyb3BzWzAsMF0gLSBjcm9wc1swLDFdLFxuICogLi4uLCB4LnNoYXBlW01dICogYmxvY2tTaGFwZVtNLTFdIC0gY3JvcHNbTS0xLDBdIC1cbiAqIGNyb3BzW00tMSwxXSx4LnNoYXBlW00rMV0sIC4uLiwgeC5zaGFwZVtOLTFdXWBcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdUcmFuc2Zvcm1hdGlvbnMnfVxuICovXG5mdW5jdGlvbiBiYXRjaFRvU3BhY2VORF8oeCwgYmxvY2tTaGFwZSwgY3JvcHMpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdiYXRjaFRvU3BhY2VORCcpO1xuICAgIGNvbnN0IHByb2QgPSBibG9ja1NoYXBlLnJlZHVjZSgoYSwgYikgPT4gYSAqIGIpO1xuICAgIHV0aWwuYXNzZXJ0KCR4LnJhbmsgPj0gMSArIGJsb2NrU2hhcGUubGVuZ3RoLCAoKSA9PiBgaW5wdXQgcmFuayBpcyAkeyR4LnJhbmt9IGJ1dCBzaG91bGQgYmUgPiB0aGFuIGJsb2NrU2hhcGUubGVuZ3RoICR7YmxvY2tTaGFwZS5sZW5ndGh9YCk7XG4gICAgdXRpbC5hc3NlcnQoY3JvcHMubGVuZ3RoID09PSBibG9ja1NoYXBlLmxlbmd0aCwgKCkgPT4gYGNyb3BzLmxlbmd0aCBpcyAke2Nyb3BzLmxlbmd0aH0gYnV0IHNob3VsZCBiZSBlcXVhbCB0byBibG9ja1NoYXBlLmxlbmd0aCAgJHtibG9ja1NoYXBlLmxlbmd0aH1gKTtcbiAgICB1dGlsLmFzc2VydCgkeC5zaGFwZVswXSAlIHByb2QgPT09IDAsICgpID0+IGBpbnB1dCB0ZW5zb3IgYmF0Y2ggaXMgJHskeC5zaGFwZVswXX0gYnV0IGlzIG5vdCBkaXZpc2libGUgYnkgdGhlIHByb2R1Y3Qgb2YgYCArXG4gICAgICAgIGB0aGUgZWxlbWVudHMgb2YgYmxvY2tTaGFwZSAke2Jsb2NrU2hhcGUuam9pbignICogJyl9ID09PSAke3Byb2R9YCk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBibG9ja1NoYXBlLCBjcm9wcyB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEJhdGNoVG9TcGFjZU5ELCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBiYXRjaFRvU3BhY2VORCA9IG9wKHsgYmF0Y2hUb1NwYWNlTkRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmF0Y2hfdG9fc3BhY2VfbmQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEZ1c2VkQmF0Y2hOb3JtIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgeEFzNEQgfSBmcm9tICcuL2JhdGNobm9ybV91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vcmVzaGFwZSc7XG4vKipcbiAqIEJhdGNoIG5vcm1hbGl6YXRpb24uXG4gKlxuICogQXMgZGVzY3JpYmVkIGluXG4gKiBbaHR0cDovL2FyeGl2Lm9yZy9hYnMvMTUwMi4wMzE2N10oaHR0cDovL2FyeGl2Lm9yZy9hYnMvMTUwMi4wMzE2NykuXG4gKlxuICogTWVhbiwgdmFyaWFuY2UsIHNjYWxlLCBhbmQgb2Zmc2V0IGNhbiBiZSBvZiB0d28gc2hhcGVzOlxuICogICAtIFRoZSBzYW1lIHNoYXBlIGFzIHRoZSBpbnB1dC5cbiAqICAgLSBJbiB0aGUgY29tbW9uIGNhc2UsIHRoZSBkZXB0aCBkaW1lbnNpb24gaXMgdGhlIGxhc3QgZGltZW5zaW9uIG9mIHgsIHNvXG4gKiAgICAgdGhlIHZhbHVlcyB3b3VsZCBiZSBhbiBgdGYuVGVuc29yMURgIG9mIHNoYXBlIFtkZXB0aF0uXG4gKlxuICogQWxzbyBhdmFpbGFibGUgYXJlIHN0cmljdGVyIHJhbmstc3BlY2lmaWMgbWV0aG9kcyB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZVxuICogYXMgdGhpcyBtZXRob2QgdGhhdCBhc3NlcnQgdGhhdCBwYXJhbWV0ZXJzIHBhc3NlZCBhcmUgb2YgZ2l2ZW4gcmFua1xuICogICAtIGB0Zi5iYXRjaE5vcm0yZGBcbiAqICAgLSBgdGYuYmF0Y2hOb3JtM2RgXG4gKiAgIC0gYHRmLmJhdGNoTm9ybTRkYFxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBUZW5zb3IuXG4gKiBAcGFyYW0gbWVhbiBBIG1lYW4gVGVuc29yLlxuICogQHBhcmFtIHZhcmlhbmNlIEEgdmFyaWFuY2UgVGVuc29yLlxuICogQHBhcmFtIG9mZnNldCBBbiBvZmZzZXQgVGVuc29yLlxuICogQHBhcmFtIHNjYWxlIEEgc2NhbGUgVGVuc29yLlxuICogQHBhcmFtIHZhcmlhbmNlRXBzaWxvbiBBIHNtYWxsIGZsb2F0IG51bWJlciB0byBhdm9pZCBkaXZpZGluZyBieSAwLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ05vcm1hbGl6YXRpb24nfVxuICovXG5mdW5jdGlvbiBiYXRjaE5vcm1fKHgsIG1lYW4sIHZhcmlhbmNlLCBvZmZzZXQsIHNjYWxlLCB2YXJpYW5jZUVwc2lsb24pIHtcbiAgICBpZiAodmFyaWFuY2VFcHNpbG9uID09IG51bGwpIHtcbiAgICAgICAgdmFyaWFuY2VFcHNpbG9uID0gMC4wMDE7XG4gICAgfVxuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2JhdGNoTm9ybScpO1xuICAgIGNvbnN0ICRtZWFuID0gY29udmVydFRvVGVuc29yKG1lYW4sICdtZWFuJywgJ2JhdGNoTm9ybScpO1xuICAgIGNvbnN0ICR2YXJpYW5jZSA9IGNvbnZlcnRUb1RlbnNvcih2YXJpYW5jZSwgJ3ZhcmlhbmNlJywgJ2JhdGNoTm9ybScpO1xuICAgIGxldCAkc2NhbGU7XG4gICAgaWYgKHNjYWxlICE9IG51bGwpIHtcbiAgICAgICAgJHNjYWxlID0gY29udmVydFRvVGVuc29yKHNjYWxlLCAnc2NhbGUnLCAnYmF0Y2hOb3JtJyk7XG4gICAgfVxuICAgIGxldCAkb2Zmc2V0O1xuICAgIGlmIChvZmZzZXQgIT0gbnVsbCkge1xuICAgICAgICAkb2Zmc2V0ID0gY29udmVydFRvVGVuc29yKG9mZnNldCwgJ29mZnNldCcsICdiYXRjaE5vcm0nKTtcbiAgICB9XG4gICAgdXRpbC5hc3NlcnQoJG1lYW4ucmFuayA9PT0gJHZhcmlhbmNlLnJhbmssICgpID0+ICdCYXRjaCBub3JtYWxpemF0aW9uIGdyYWRpZW50IHJlcXVpcmVzIG1lYW4gYW5kIHZhcmlhbmNlIHRvIGhhdmUgJyArXG4gICAgICAgICdlcXVhbCByYW5rcy4nKTtcbiAgICB1dGlsLmFzc2VydCgkb2Zmc2V0ID09IG51bGwgfHwgJG1lYW4ucmFuayA9PT0gJG9mZnNldC5yYW5rLCAoKSA9PiAnQmF0Y2ggbm9ybWFsaXphdGlvbiBncmFkaWVudCByZXF1aXJlcyBtZWFuIGFuZCBvZmZzZXQgdG8gaGF2ZSAnICtcbiAgICAgICAgJ2VxdWFsIHJhbmtzLicpO1xuICAgIHV0aWwuYXNzZXJ0KCRzY2FsZSA9PSBudWxsIHx8ICRtZWFuLnJhbmsgPT09ICRzY2FsZS5yYW5rLCAoKSA9PiAnQmF0Y2ggbm9ybWFsaXphdGlvbiBncmFkaWVudCByZXF1aXJlcyBtZWFuIGFuZCBzY2FsZSB0byBoYXZlICcgK1xuICAgICAgICAnZXF1YWwgcmFua3MuJyk7XG4gICAgY29uc3QgeDREID0geEFzNEQoJHgpO1xuICAgIGNvbnN0IGlucHV0cyA9IHtcbiAgICAgICAgeDogeDRELFxuICAgICAgICBzY2FsZTogJHNjYWxlLFxuICAgICAgICBvZmZzZXQ6ICRvZmZzZXQsXG4gICAgICAgIG1lYW46ICRtZWFuLFxuICAgICAgICB2YXJpYW5jZTogJHZhcmlhbmNlXG4gICAgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgdmFyaWFuY2VFcHNpbG9uIH07XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgIGNvbnN0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoRnVzZWRCYXRjaE5vcm0sIGlucHV0cywgYXR0cnMpO1xuICAgIHJldHVybiByZXNoYXBlKHJlcywgJHguc2hhcGUpO1xufVxuZXhwb3J0IGNvbnN0IGJhdGNoTm9ybSA9IG9wKHsgYmF0Y2hOb3JtXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJhdGNobm9ybS5qcy5tYXAiLCJpbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IGJhdGNoTm9ybSB9IGZyb20gJy4vYmF0Y2hub3JtJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBCYXRjaCBub3JtYWxpemF0aW9uLCBzdHJpY3RseSBmb3IgMkQuIEZvciB0aGUgbW9yZSByZWxheGVkIHZlcnNpb24sIHNlZVxuICogYHRmLmJhdGNoTm9ybWAuXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IFRlbnNvci5cbiAqIEBwYXJhbSBtZWFuIEEgbWVhbiBUZW5zb3IuXG4gKiBAcGFyYW0gdmFyaWFuY2UgQSB2YXJpYW5jZSBUZW5zb3IuXG4gKiBAcGFyYW0gb2Zmc2V0IEFuIG9mZnNldCBUZW5zb3IuXG4gKiBAcGFyYW0gc2NhbGUgQSBzY2FsZSBUZW5zb3IuXG4gKiBAcGFyYW0gdmFyaWFuY2VFcHNpbG9uIEEgc21hbGwgZmxvYXQgbnVtYmVyIHRvIGF2b2lkIGRpdmlkaW5nIGJ5IDAuXG4gKi9cbmZ1bmN0aW9uIGJhdGNoTm9ybTJkXyh4LCBtZWFuLCB2YXJpYW5jZSwgb2Zmc2V0LCBzY2FsZSwgdmFyaWFuY2VFcHNpbG9uKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnYmF0Y2hOb3JtJyk7XG4gICAgY29uc3QgJG1lYW4gPSBjb252ZXJ0VG9UZW5zb3IobWVhbiwgJ21lYW4nLCAnYmF0Y2hOb3JtJyk7XG4gICAgY29uc3QgJHZhcmlhbmNlID0gY29udmVydFRvVGVuc29yKHZhcmlhbmNlLCAndmFyaWFuY2UnLCAnYmF0Y2hOb3JtJyk7XG4gICAgbGV0ICRzY2FsZTtcbiAgICBpZiAoc2NhbGUgIT0gbnVsbCkge1xuICAgICAgICAkc2NhbGUgPSBjb252ZXJ0VG9UZW5zb3Ioc2NhbGUsICdzY2FsZScsICdiYXRjaE5vcm0nKTtcbiAgICB9XG4gICAgbGV0ICRvZmZzZXQ7XG4gICAgaWYgKG9mZnNldCAhPSBudWxsKSB7XG4gICAgICAgICRvZmZzZXQgPSBjb252ZXJ0VG9UZW5zb3Iob2Zmc2V0LCAnb2Zmc2V0JywgJ2JhdGNoTm9ybScpO1xuICAgIH1cbiAgICB1dGlsLmFzc2VydCgkeC5yYW5rID09PSAyLCAoKSA9PiBgRXJyb3IgaW4gYmF0Y2hOb3JtMkQ6IHggbXVzdCBiZSByYW5rIDIgYnV0IGdvdCByYW5rIGAgK1xuICAgICAgICBgJHskeC5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydCgkbWVhbi5yYW5rID09PSAyIHx8ICRtZWFuLnJhbmsgPT09IDEsICgpID0+IGBFcnJvciBpbiBiYXRjaE5vcm0yRDogbWVhbiBtdXN0IGJlIHJhbmsgMiBvciByYW5rIDEgYnV0IGAgK1xuICAgICAgICBgZ290IHJhbmsgJHskbWVhbi5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydCgkdmFyaWFuY2UucmFuayA9PT0gMiB8fCAkdmFyaWFuY2UucmFuayA9PT0gMSwgKCkgPT4gYEVycm9yIGluIGJhdGNoTm9ybTJEOiB2YXJpYW5jZSBtdXN0IGJlIHJhbmsgMiBvciByYW5rIDEgYCArXG4gICAgICAgIGBidXQgZ290IHJhbmsgJHskdmFyaWFuY2UucmFua30uYCk7XG4gICAgaWYgKCRzY2FsZSAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KCRzY2FsZS5yYW5rID09PSAyIHx8ICRzY2FsZS5yYW5rID09PSAxLCAoKSA9PiBgRXJyb3IgaW4gYmF0Y2hOb3JtMkQ6IHNjYWxlIG11c3QgYmUgcmFuayAyIG9yIHJhbmsgMSBgICtcbiAgICAgICAgICAgIGBidXQgZ290IHJhbmsgJHskc2NhbGUucmFua30uYCk7XG4gICAgfVxuICAgIGlmICgkb2Zmc2V0ICE9IG51bGwpIHtcbiAgICAgICAgdXRpbC5hc3NlcnQoJG9mZnNldC5yYW5rID09PSAyIHx8ICRvZmZzZXQucmFuayA9PT0gMSwgKCkgPT4gYEVycm9yIGluIGJhdGNoTm9ybTJEOiBvZmZzZXQgbXVzdCBiZSByYW5rIDIgb3IgcmFuayAxIGAgK1xuICAgICAgICAgICAgYGJ1dCBnb3QgcmFuayAkeyRvZmZzZXQucmFua30uYCk7XG4gICAgfVxuICAgIHJldHVybiBiYXRjaE5vcm0oJHgsICRtZWFuLCAkdmFyaWFuY2UsICRvZmZzZXQsICRzY2FsZSwgdmFyaWFuY2VFcHNpbG9uKTtcbn1cbmV4cG9ydCBjb25zdCBiYXRjaE5vcm0yZCA9IG9wKHsgYmF0Y2hOb3JtMmRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmF0Y2hub3JtMmQuanMubWFwIiwiaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBiYXRjaE5vcm0gfSBmcm9tICcuL2JhdGNobm9ybSc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQmF0Y2ggbm9ybWFsaXphdGlvbiwgc3RyaWN0bHkgZm9yIDNELiBGb3IgdGhlIG1vcmUgcmVsYXhlZCB2ZXJzaW9uLCBzZWVcbiAqIGB0Zi5iYXRjaE5vcm1gLlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBUZW5zb3IuXG4gKiBAcGFyYW0gbWVhbiBBIG1lYW4gVGVuc29yLlxuICogQHBhcmFtIHZhcmlhbmNlIEEgdmFyaWFuY2UgVGVuc29yLlxuICogQHBhcmFtIG9mZnNldCBBbiBvZmZzZXQgVGVuc29yLlxuICogQHBhcmFtIHNjYWxlIEEgc2NhbGUgVGVuc29yLlxuICogQHBhcmFtIHZhcmlhbmNlRXBzaWxvbiBBIHNtYWxsIGZsb2F0IG51bWJlciB0byBhdm9pZCBkaXZpZGluZyBieSAwLlxuICovXG5mdW5jdGlvbiBiYXRjaE5vcm0zZF8oeCwgbWVhbiwgdmFyaWFuY2UsIG9mZnNldCwgc2NhbGUsIHZhcmlhbmNlRXBzaWxvbikge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2JhdGNoTm9ybScpO1xuICAgIGNvbnN0ICRtZWFuID0gY29udmVydFRvVGVuc29yKG1lYW4sICdtZWFuJywgJ2JhdGNoTm9ybScpO1xuICAgIGNvbnN0ICR2YXJpYW5jZSA9IGNvbnZlcnRUb1RlbnNvcih2YXJpYW5jZSwgJ3ZhcmlhbmNlJywgJ2JhdGNoTm9ybScpO1xuICAgIGxldCAkc2NhbGU7XG4gICAgaWYgKHNjYWxlICE9IG51bGwpIHtcbiAgICAgICAgJHNjYWxlID0gY29udmVydFRvVGVuc29yKHNjYWxlLCAnc2NhbGUnLCAnYmF0Y2hOb3JtJyk7XG4gICAgfVxuICAgIGxldCAkb2Zmc2V0O1xuICAgIGlmIChvZmZzZXQgIT0gbnVsbCkge1xuICAgICAgICAkb2Zmc2V0ID0gY29udmVydFRvVGVuc29yKG9mZnNldCwgJ29mZnNldCcsICdiYXRjaE5vcm0nKTtcbiAgICB9XG4gICAgdXRpbC5hc3NlcnQoJHgucmFuayA9PT0gMywgKCkgPT4gYEVycm9yIGluIGJhdGNoTm9ybTNEOiB4IG11c3QgYmUgcmFuayAzIGJ1dCBnb3QgcmFuayBgICtcbiAgICAgICAgYCR7JHgucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoJG1lYW4ucmFuayA9PT0gMyB8fCAkbWVhbi5yYW5rID09PSAxLCAoKSA9PiBgRXJyb3IgaW4gYmF0Y2hOb3JtM0Q6IG1lYW4gbXVzdCBiZSByYW5rIDMgb3IgcmFuayAxIGJ1dCBgICtcbiAgICAgICAgYGdvdCByYW5rICR7JG1lYW4ucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoJHZhcmlhbmNlLnJhbmsgPT09IDMgfHwgJHZhcmlhbmNlLnJhbmsgPT09IDEsICgpID0+IGBFcnJvciBpbiBiYXRjaE5vcm0zRDogdmFyaWFuY2UgbXVzdCBiZSByYW5rIDMgb3IgcmFuayAxIGAgK1xuICAgICAgICBgYnV0IGdvdCByYW5rICR7JHZhcmlhbmNlLnJhbmt9LmApO1xuICAgIGlmICgkc2NhbGUgIT0gbnVsbCkge1xuICAgICAgICB1dGlsLmFzc2VydCgkc2NhbGUucmFuayA9PT0gMyB8fCAkc2NhbGUucmFuayA9PT0gMSwgKCkgPT4gYEVycm9yIGluIGJhdGNoTm9ybTNEOiBzY2FsZSBtdXN0IGJlIHJhbmsgMyBvciByYW5rIDEgYCArXG4gICAgICAgICAgICBgYnV0IGdvdCByYW5rICR7JHNjYWxlLnJhbmt9LmApO1xuICAgIH1cbiAgICBpZiAoJG9mZnNldCAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KCRvZmZzZXQucmFuayA9PT0gMyB8fCAkb2Zmc2V0LnJhbmsgPT09IDEsICgpID0+IGBFcnJvciBpbiBiYXRjaE5vcm0zRDogb2Zmc2V0IG11c3QgYmUgcmFuayAzIG9yIHJhbmsgMSBgICtcbiAgICAgICAgICAgIGBidXQgZ290IHJhbmsgJHskb2Zmc2V0LnJhbmt9LmApO1xuICAgIH1cbiAgICByZXR1cm4gYmF0Y2hOb3JtKCR4LCAkbWVhbiwgJHZhcmlhbmNlLCAkb2Zmc2V0LCAkc2NhbGUsIHZhcmlhbmNlRXBzaWxvbik7XG59XG5leHBvcnQgY29uc3QgYmF0Y2hOb3JtM2QgPSBvcCh7IGJhdGNoTm9ybTNkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJhdGNobm9ybTNkLmpzLm1hcCIsImltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgYmF0Y2hOb3JtIH0gZnJvbSAnLi9iYXRjaG5vcm0nO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIEJhdGNoIG5vcm1hbGl6YXRpb24sIHN0cmljdGx5IGZvciA0RC4gRm9yIHRoZSBtb3JlIHJlbGF4ZWQgdmVyc2lvbiwgc2VlXG4gKiBgdGYuYmF0Y2hOb3JtYC5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgVGVuc29yLlxuICogQHBhcmFtIG1lYW4gQSBtZWFuIFRlbnNvci5cbiAqIEBwYXJhbSB2YXJpYW5jZSBBIHZhcmlhbmNlIFRlbnNvci5cbiAqIEBwYXJhbSBvZmZzZXQgQW4gb2Zmc2V0IFRlbnNvci5cbiAqIEBwYXJhbSBzY2FsZSBBIHNjYWxlIFRlbnNvci5cbiAqIEBwYXJhbSB2YXJpYW5jZUVwc2lsb24gQSBzbWFsbCBmbG9hdCBudW1iZXIgdG8gYXZvaWQgZGl2aWRpbmcgYnkgMC5cbiAqL1xuZnVuY3Rpb24gYmF0Y2hOb3JtNGRfKHgsIG1lYW4sIHZhcmlhbmNlLCBvZmZzZXQsIHNjYWxlLCB2YXJpYW5jZUVwc2lsb24pIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdiYXRjaE5vcm0nKTtcbiAgICBjb25zdCAkbWVhbiA9IGNvbnZlcnRUb1RlbnNvcihtZWFuLCAnbWVhbicsICdiYXRjaE5vcm0nKTtcbiAgICBjb25zdCAkdmFyaWFuY2UgPSBjb252ZXJ0VG9UZW5zb3IodmFyaWFuY2UsICd2YXJpYW5jZScsICdiYXRjaE5vcm0nKTtcbiAgICBsZXQgJHNjYWxlO1xuICAgIGlmIChzY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICRzY2FsZSA9IGNvbnZlcnRUb1RlbnNvcihzY2FsZSwgJ3NjYWxlJywgJ2JhdGNoTm9ybScpO1xuICAgIH1cbiAgICBsZXQgJG9mZnNldDtcbiAgICBpZiAob2Zmc2V0ICE9IG51bGwpIHtcbiAgICAgICAgJG9mZnNldCA9IGNvbnZlcnRUb1RlbnNvcihvZmZzZXQsICdvZmZzZXQnLCAnYmF0Y2hOb3JtJyk7XG4gICAgfVxuICAgIHV0aWwuYXNzZXJ0KCR4LnJhbmsgPT09IDQsICgpID0+IGBFcnJvciBpbiBiYXRjaE5vcm00RDogeCBtdXN0IGJlIHJhbmsgNCBidXQgZ290IHJhbmsgYCArXG4gICAgICAgIGAkeyR4LnJhbmt9LmApO1xuICAgIHV0aWwuYXNzZXJ0KCRtZWFuLnJhbmsgPT09IDQgfHwgJG1lYW4ucmFuayA9PT0gMSwgKCkgPT4gYEVycm9yIGluIGJhdGNoTm9ybTREOiBtZWFuIG11c3QgYmUgcmFuayA0IG9yIHJhbmsgMSBidXQgYCArXG4gICAgICAgIGBnb3QgcmFuayAkeyRtZWFuLnJhbmt9LmApO1xuICAgIHV0aWwuYXNzZXJ0KCR2YXJpYW5jZS5yYW5rID09PSA0IHx8ICR2YXJpYW5jZS5yYW5rID09PSAxLCAoKSA9PiBgRXJyb3IgaW4gYmF0Y2hOb3JtNEQ6IHZhcmlhbmNlIG11c3QgYmUgcmFuayA0IG9yIHJhbmsgMSBgICtcbiAgICAgICAgYGJ1dCBnb3QgcmFuayAkeyR2YXJpYW5jZS5yYW5rfS5gKTtcbiAgICBpZiAoJHNjYWxlICE9IG51bGwpIHtcbiAgICAgICAgdXRpbC5hc3NlcnQoJHNjYWxlLnJhbmsgPT09IDQgfHwgJHNjYWxlLnJhbmsgPT09IDEsICgpID0+IGBFcnJvciBpbiBiYXRjaE5vcm00RDogc2NhbGUgbXVzdCBiZSByYW5rIDQgb3IgcmFuayAxIGAgK1xuICAgICAgICAgICAgYGJ1dCBnb3QgcmFuayAkeyRzY2FsZS5yYW5rfS5gKTtcbiAgICB9XG4gICAgaWYgKCRvZmZzZXQgIT0gbnVsbCkge1xuICAgICAgICB1dGlsLmFzc2VydCgkb2Zmc2V0LnJhbmsgPT09IDQgfHwgJG9mZnNldC5yYW5rID09PSAxLCAoKSA9PiBgRXJyb3IgaW4gYmF0Y2hOb3JtNEQ6IG9mZnNldCBtdXN0IGJlIHJhbmsgNCBvciByYW5rIDEgYCArXG4gICAgICAgICAgICBgYnV0IGdvdCByYW5rICR7JG9mZnNldC5yYW5rfS5gKTtcbiAgICB9XG4gICAgcmV0dXJuIGJhdGNoTm9ybSgkeCwgJG1lYW4sICR2YXJpYW5jZSwgJG9mZnNldCwgJHNjYWxlLCB2YXJpYW5jZUVwc2lsb24pO1xufVxuZXhwb3J0IGNvbnN0IGJhdGNoTm9ybTRkID0gb3AoeyBiYXRjaE5vcm00ZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iYXRjaG5vcm00ZC5qcy5tYXAiLCJpbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbmV4cG9ydCBmdW5jdGlvbiB4QXM0RCh4KSB7XG4gICAgbGV0IHg0RDtcbiAgICBpZiAoeC5yYW5rID09PSAwIHx8IHgucmFuayA9PT0gMSkge1xuICAgICAgICB4NEQgPSByZXNoYXBlKHgsIFsxLCAxLCAxLCB4LnNpemVdKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoeC5yYW5rID09PSAyKSB7XG4gICAgICAgIHg0RCA9IHJlc2hhcGUoeCwgWzEsIDEsIHguc2hhcGVbMF0sIHguc2hhcGVbMV1dKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoeC5yYW5rID09PSAzKSB7XG4gICAgICAgIHg0RCA9IHJlc2hhcGUoeCwgWzEsIHguc2hhcGVbMF0sIHguc2hhcGVbMV0sIHguc2hhcGVbMl1dKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHg0RCA9IHg7XG4gICAgfVxuICAgIHJldHVybiB4NEQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iYXRjaG5vcm1fdXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgQmluY291bnQgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogT3V0cHV0cyBhIHZlY3RvciB3aXRoIGxlbmd0aCBgc2l6ZWAgYW5kIHRoZSBzYW1lIGR0eXBlIGFzIGB3ZWlnaHRzYC5cbiAqXG4gKiBJZiBgd2VpZ2h0c2AgYXJlIGVtcHR5LCB0aGVuIGluZGV4IGBpYCBzdG9yZXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgdmFsdWVcbiAqIGBpYCBpcyBjb3VudGVkIGluIGB4YC4gSWYgYHdlaWdodHNgIGFyZSBub24tZW1wdHksIHRoZW4gaW5kZXggYGlgIHN0b3JlcyB0aGVcbiAqIHN1bSBvZiB0aGUgdmFsdWUgaW4gYHdlaWdodHNgIGF0IGVhY2ggaW5kZXggd2hlcmUgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgaW5cbiAqIGB4YCBpcyBgaWAuXG4gKlxuICogVmFsdWVzIGluIGB4YCBvdXRzaWRlIG9mIHRoZSByYW5nZSBbMCwgc2l6ZSkgYXJlIGlnbm9yZWQuXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IGludCB0ZW5zb3IsIHJhbmsgMS5cbiAqIEBwYXJhbSB3ZWlnaHRzIFRoZSB3ZWlnaHRzIHRlbnNvciwgbXVzdCBoYXZlIHRoZSBzYW1lIHNoYXBlIGFzIHgsIG9yIGFcbiAqICAgICBsZW5ndGgtMCBUZW5zb3IsIGluIHdoaWNoIGNhc2UgaXQgYWN0cyBhcyBhbGwgd2VpZ2h0cyBlcXVhbCB0byAxLlxuICogQHBhcmFtIHNpemUgTm9uLW5lZ2F0aXZlIGludGVnZXIuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnUmVkdWN0aW9uJ31cbiAqL1xuZnVuY3Rpb24gYmluY291bnRfKHgsIHdlaWdodHMsIHNpemUpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdiaW5jb3VudCcpO1xuICAgIGNvbnN0ICR3ZWlnaHRzID0gY29udmVydFRvVGVuc29yKHdlaWdodHMsICd3ZWlnaHRzJywgJ2JpbmNvdW50Jyk7XG4gICAgdXRpbC5hc3NlcnQoJHguZHR5cGUgPT09ICdpbnQzMicsICgpID0+IGBFcnJvciBpbiBiaW5jb3VudDogaW5wdXQgYCArXG4gICAgICAgIGBkdHlwZSBtdXN0IGJlIGludDMyLCBidXQgZ290ICR7JHguZHR5cGV9YCk7XG4gICAgdXRpbC5hc3NlcnQoc2l6ZSA+PSAwLCAoKSA9PiBgc2l6ZSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSwgYnV0IGdvdCAke3NpemV9LmApO1xuICAgIHV0aWwuYXNzZXJ0KCR3ZWlnaHRzLnNpemUgPT09ICR4LnNpemUgfHwgJHdlaWdodHMuc2l6ZSA9PT0gMCwgKCkgPT4gYEVycm9yIGluIGJpbmNvdW50OiB3ZWlnaHRzIG11c3QgaGF2ZSB0aGUgc2FtZSBzaXplIGFzIGlucHV0IG9yYCArXG4gICAgICAgIGAwLWxlbmd0aCwgYnV0IGdvdCBpbnB1dCBzaGFwZTogJHskeC5zaGFwZX0sIHdlaWdodHMgc2hhcGU6IGAgK1xuICAgICAgICBgJHskd2VpZ2h0cy5zaGFwZX0uYCk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCwgd2VpZ2h0czogJHdlaWdodHMgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgc2l6ZSB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEJpbmNvdW50LCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBiaW5jb3VudCA9IG9wKHsgYmluY291bnRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmluY291bnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBnYXRoZXIgfSBmcm9tICcuL2dhdGhlcic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbmltcG9ydCB7IHNxdWVlemUgfSBmcm9tICcuL3NxdWVlemUnO1xuaW1wb3J0IHsgd2hlcmVBc3luYyB9IGZyb20gJy4vd2hlcmVfYXN5bmMnO1xuLyoqXG4gKiBBcHBseSBib29sZWFuIG1hc2sgdG8gdGVuc29yLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB0ZW5zb3IgPSB0Zi50ZW5zb3IyZChbMSwgMiwgMywgNCwgNSwgNl0sIFszLCAyXSk7XG4gKiBjb25zdCBtYXNrID0gdGYudGVuc29yMWQoWzEsIDAsIDFdLCAnYm9vbCcpO1xuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGYuYm9vbGVhbk1hc2tBc3luYyh0ZW5zb3IsIG1hc2spO1xuICogcmVzdWx0LnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdGVuc29yIE4tRCB0ZW5zb3IuXG4gKiBAcGFyYW0gbWFzayBLLUQgYm9vbGVhbiB0ZW5zb3IsIEsgPD0gTiBhbmQgSyBtdXN0IGJlIGtub3duIHN0YXRpY2FsbHkuXG4gKiBAcGFyYW0gYXhpcyBBIDAtRCBpbnQgVGVuc29yIHJlcHJlc2VudGluZyB0aGUgYXhpcyBpbiB0ZW5zb3IgdG8gbWFzayBmcm9tLlxuICogICAgIEJ5IGRlZmF1bHQsIGF4aXMgaXMgMCB3aGljaCB3aWxsIG1hc2sgZnJvbSB0aGUgZmlyc3QgZGltZW5zaW9uLlxuICogICAgIE90aGVyd2lzZSBLICsgYXhpcyA8PSBOLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1NsaWNpbmcgYW5kIEpvaW5pbmcnfVxuICovXG5hc3luYyBmdW5jdGlvbiBib29sZWFuTWFza0FzeW5jXyh0ZW5zb3IsIG1hc2ssIGF4aXMpIHtcbiAgICBjb25zdCAkdGVuc29yID0gY29udmVydFRvVGVuc29yKHRlbnNvciwgJ3RlbnNvcicsICdib29sTWFzaycpO1xuICAgIGNvbnN0ICRtYXNrID0gY29udmVydFRvVGVuc29yKG1hc2ssICdtYXNrJywgJ2Jvb2xNYXNrJywgJ2Jvb2wnKTtcbiAgICBjb25zdCBheGlzRnJvbSA9IGF4aXMgPT0gbnVsbCA/IDAgOiBheGlzO1xuICAgIGNvbnN0IG1hc2tEaW0gPSAkbWFzay5yYW5rO1xuICAgIGNvbnN0IHRlbnNvclNoYXBlID0gJHRlbnNvci5zaGFwZTtcbiAgICB1dGlsLmFzc2VydChtYXNrRGltID4gMCwgKCkgPT4gJ21hc2sgY2Fubm90IGJlIHNjYWxhcicpO1xuICAgIHV0aWwuYXNzZXJ0U2hhcGVzTWF0Y2godGVuc29yU2hhcGUuc2xpY2UoYXhpc0Zyb20sIGF4aXNGcm9tICsgbWFza0RpbSksICRtYXNrLnNoYXBlLCBgbWFzaydzIHNoYXBlIG11c3QgbWF0Y2ggdGhlIGZpcnN0IEsgZGltZW5zaW9ucyBvZiB0ZW5zb3IncyBzaGFwZSxgKTtcbiAgICBsZXQgbGVhZGluZ1NpemUgPSAxO1xuICAgIGZvciAobGV0IGkgPSBheGlzRnJvbTsgaSA8IGF4aXNGcm9tICsgbWFza0RpbTsgaSsrKSB7XG4gICAgICAgIGxlYWRpbmdTaXplICo9IHRlbnNvclNoYXBlW2ldO1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXRUZW5zb3JTaGFwZSA9IHRlbnNvclNoYXBlLnNsaWNlKDAsIGF4aXNGcm9tKVxuICAgICAgICAuY29uY2F0KFtsZWFkaW5nU2l6ZV0sIHRlbnNvclNoYXBlLnNsaWNlKGF4aXNGcm9tICsgbWFza0RpbSkpO1xuICAgIGNvbnN0IHJlc2hhcGVkVGVuc29yID0gcmVzaGFwZSgkdGVuc29yLCB0YXJnZXRUZW5zb3JTaGFwZSk7XG4gICAgY29uc3QgcmVzaGFwZWRNYXNrID0gcmVzaGFwZSgkbWFzaywgWy0xXSk7XG4gICAgY29uc3QgcG9zaXRpdmVQb3NpdGlvbnMgPSBhd2FpdCB3aGVyZUFzeW5jKHJlc2hhcGVkTWFzayk7XG4gICAgY29uc3QgaW5kaWNlcyA9IHNxdWVlemUocG9zaXRpdmVQb3NpdGlvbnMsIFsxXSk7XG4gICAgY29uc3QgcmVzID0gZ2F0aGVyKHJlc2hhcGVkVGVuc29yLCBpbmRpY2VzLCBheGlzRnJvbSk7XG4gICAgLy8gRW5zdXJlIG5vIG1lbW9yeSBsZWFrLlxuICAgIGlmICh0ZW5zb3IgIT09ICR0ZW5zb3IpIHtcbiAgICAgICAgJHRlbnNvci5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGlmIChtYXNrICE9PSAkbWFzaykge1xuICAgICAgICAkbWFzay5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGluZGljZXMuZGlzcG9zZSgpO1xuICAgIHJlc2hhcGVkVGVuc29yLmRpc3Bvc2UoKTtcbiAgICByZXNoYXBlZE1hc2suZGlzcG9zZSgpO1xuICAgIHBvc2l0aXZlUG9zaXRpb25zLmRpc3Bvc2UoKTtcbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IGJvb2xlYW5NYXNrQXN5bmMgPSBib29sZWFuTWFza0FzeW5jXztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJvb2xlYW5fbWFzay5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgVGlsZSB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgY2xvbmUgfSBmcm9tICcuL2Nsb25lJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vcmVzaGFwZSc7XG4vKipcbiAqIEJyb2FkY2FzdCBhbiBhcnJheSB0byBhIGNvbXBhdGlibGUgc2hhcGUgTnVtUHktc3R5bGUuXG4gKlxuICogVGhlIHRlbnNvcidzIHNoYXBlIGlzIGNvbXBhcmVkIHRvIHRoZSBicm9hZGNhc3Qgc2hhcGUgZnJvbSBlbmQgdG8gYmVnaW5uaW5nLlxuICogT25lcyBhcmUgcHJlcGVuZGVkIHRvIHRoZSB0ZW5zb3IncyBzaGFwZSB1bnRpbCBpcyBoYXMgdGhlIHNhbWUgbGVuZ3RoIGFzXG4gKiB0aGUgYnJvYWRjYXN0IHNoYXBlLiBJZiBpbnB1dC5zaGFwZVtpXT09c2hhcGVbaV0sIHRoZSAoaSsxKS10aCBheGlzIGlzXG4gKiBhbHJlYWR5IGJyb2FkY2FzdC1jb21wYXRpYmxlLiBJZiBpbnB1dC5zaGFwZVtpXT09MSBhbmQgc2hhcGVbaV09PU4sIHRoZW5cbiAqIHRoZSBpbnB1dCB0ZW5zb3IgaXMgdGlsZWQgTiB0aW1lcyBhbG9uZyB0aGF0IGF4aXMgKHVzaW5nIHRmLnRpbGUpLlxuICpcbiAqIEBwYXJhbSBpbnB1dCBUaGUgdGVuc29yIHRoYXQgaXMgdG8gYmUgYnJvYWRjYXN0ZWQuXG4gKiBAcGFyYW0gc2hhcGUgVGhlIGlucHV0IGlzIHRvIGJlIGJyb2FkY2FzdCB0byB0aGlzIHNoYXBlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1RyYW5zZm9ybWF0aW9ucyd9XG4gKi9cbmZ1bmN0aW9uIGJyb2FkY2FzdFRvXyh4LCBzaGFwZSkge1xuICAgIGxldCBpbnB1dCA9IGNvbnZlcnRUb1RlbnNvcih4LCAnYnJvYWRjYXN0VG8nLCAneCcpO1xuICAgIGNvbnN0IHhTaGFwZSA9IGlucHV0LnNoYXBlO1xuICAgIGlmIChzaGFwZS5zb21lKGQgPT4gIShkID4gMCkgfHwgZCAlIDEgIT09IDApKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgYnJvYWRjYXN0VG8oKTogSW52YWxpZCBicm9hZGNhc3Qgc2hhcGUgWyR7c2hhcGV9XS5gKTtcbiAgICB9XG4gICAgaWYgKHNoYXBlLmxlbmd0aCA8IGlucHV0LnJhbmspIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBicm9hZGNhc3RUbygpOiBzaGFwZS5sZW5ndGg9JHtzaGFwZS5sZW5ndGh9IDwgaW5wdXQucmFuaz0ke2lucHV0LnJhbmt9LmApO1xuICAgIH1cbiAgICBpZiAoc2hhcGUubGVuZ3RoID4gaW5wdXQucmFuaykge1xuICAgICAgICBjb25zdCBuZXdTaGFwZSA9IGlucHV0LnNoYXBlLnNsaWNlKCk7XG4gICAgICAgIHdoaWxlIChuZXdTaGFwZS5sZW5ndGggPCBzaGFwZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIG5ld1NoYXBlLnVuc2hpZnQoMSk7XG4gICAgICAgIH1cbiAgICAgICAgaW5wdXQgPSByZXNoYXBlKGlucHV0LCBuZXdTaGFwZSk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0U2hhcGUgPSBpbnB1dC5zaGFwZTtcbiAgICBjb25zdCByZXBzID0gQXJyYXkuZnJvbShzaGFwZSk7XG4gICAgZm9yIChsZXQgaSA9IHNoYXBlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGlmIChpbnB1dFNoYXBlW2ldID09PSBzaGFwZVtpXSkge1xuICAgICAgICAgICAgcmVwc1tpXSA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaW5wdXQuc2hhcGVbaV0gIT09IDEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgYnJvYWRjYXN0VG8oKTogWyR7eFNoYXBlfV0gY2Fubm90IGJlIGJyb2FkY2FzdCB0byBbJHtzaGFwZX1dLmApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGF4ZXMgPSByZXBzLm1hcCgobiwgaSkgPT4gbiA+IDEgPyBpIDogLTEpLmZpbHRlcihpID0+IGkgPj0gMCk7XG4gICAgaWYgKGF4ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBjbG9uZShpbnB1dCk7XG4gICAgfVxuICAgIC8vIFRPRE8gY2FsbCBicm9hZGNhc3RUbyBrZXJuZWwgZGlyZWN0bHkgb25jZSBiYWNrZW5kcyBpbXBsZW1lbnQgYnJvYWRjc3RUb1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogaW5wdXQgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgcmVwcyB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFRpbGUsIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IGJyb2FkY2FzdFRvID0gb3AoeyBicm9hZGNhc3RUb18gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1icm9hZGNhc3RfdG8uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBkaW1lbnNpb25zIGluIHRoZSBpbnB1dCBzaGFwZSB0aGF0IGFyZSBicm9hZGNhc3RlZCB0b1xuICogcHJvZHVjZSB0aGUgcHJvdmlkZWQgb3V0cHV0IHNoYXBlLlxuICpcbiAqIFRoZSByZXR1cm5lZCBkaW1lbnNpb25zIGFyZSAwLWluZGV4ZWQgYW5kIHNvcnRlZC4gQW4gZXhhbXBsZTpcbiAqIGluU2hhcGUgPSBbNCwgMSwgM11cbiAqIG91dFNoYXBlID0gWzUsIDQsIDMsIDNdXG4gKiByZXN1bHQgPSBbMV0uIERpbWVuc2lvbiAxICgybmQgZGltZW5zaW9uIG9mIGlucHV0KSBnZXRzIGJyb2FkY2FzdGVkIDEgPT4gMy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJyb2FkY2FzdERpbXMoaW5TaGFwZSwgb3V0U2hhcGUpIHtcbiAgICBjb25zdCBpblJhbmsgPSBpblNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBkaW1zID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpblJhbms7IGkrKykge1xuICAgICAgICBjb25zdCBkaW0gPSBpblJhbmsgLSAxIC0gaTtcbiAgICAgICAgY29uc3QgYSA9IGluU2hhcGVbZGltXSB8fCAxO1xuICAgICAgICBjb25zdCBiID0gb3V0U2hhcGVbb3V0U2hhcGUubGVuZ3RoIC0gMSAtIGldIHx8IDE7XG4gICAgICAgIGlmIChiID4gMSAmJiBhID09PSAxKSB7XG4gICAgICAgICAgICBkaW1zLnVuc2hpZnQoZGltKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGltcztcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgYXhlcyBpbiB0aGUgb3V0cHV0IHNwYWNlIHRoYXQgc2hvdWxkIGJlIHJlZHVjZWQgdG8gcHJvZHVjZVxuICogdGhlIGlucHV0IHNwYWNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVkdWN0aW9uQXhlcyhpblNoYXBlLCBvdXRTaGFwZSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0U2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgaW5EaW0gPSBpblNoYXBlW2luU2hhcGUubGVuZ3RoIC0gaSAtIDFdO1xuICAgICAgICBjb25zdCBvdXRBeGlzID0gb3V0U2hhcGUubGVuZ3RoIC0gaSAtIDE7XG4gICAgICAgIGNvbnN0IG91dERpbSA9IG91dFNoYXBlW291dEF4aXNdO1xuICAgICAgICBpZiAoaW5EaW0gPT0gbnVsbCB8fCAoaW5EaW0gPT09IDEgJiYgb3V0RGltID4gMSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC51bnNoaWZ0KG91dEF4aXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoc2hhcGVBLCBzaGFwZUIpIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBjb25zdCBsID0gTWF0aC5tYXgoc2hhcGVBLmxlbmd0aCwgc2hhcGVCLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgbGV0IGEgPSBzaGFwZUFbc2hhcGVBLmxlbmd0aCAtIGkgLSAxXTtcbiAgICAgICAgaWYgKGEgPT0gbnVsbCkge1xuICAgICAgICAgICAgYSA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGIgPSBzaGFwZUJbc2hhcGVCLmxlbmd0aCAtIGkgLSAxXTtcbiAgICAgICAgaWYgKGIgPT0gbnVsbCkge1xuICAgICAgICAgICAgYiA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGEgPT09IDEpIHtcbiAgICAgICAgICAgIHJlc3VsdC51bnNoaWZ0KGIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGIgPT09IDEpIHtcbiAgICAgICAgICAgIHJlc3VsdC51bnNoaWZ0KGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGEgIT09IGIpIHtcbiAgICAgICAgICAgIGNvbnN0IGVyck1zZyA9IGBPcGVyYW5kcyBjb3VsZCBub3QgYmUgYnJvYWRjYXN0IHRvZ2V0aGVyIHdpdGggc2hhcGVzIGAgK1xuICAgICAgICAgICAgICAgIGAke3NoYXBlQX0gYW5kICR7c2hhcGVCfS5gO1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoZXJyTXNnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdC51bnNoaWZ0KGEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1icm9hZGNhc3RfdXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi4vZW52aXJvbm1lbnQnO1xuaW1wb3J0IHsgRnJvbVBpeGVscyB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBnZXRLZXJuZWwgfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHsgVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBjYXN0IH0gZnJvbSAnLi9jYXN0JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgdGVuc29yM2QgfSBmcm9tICcuL3RlbnNvcjNkJztcbmxldCBmcm9tUGl4ZWxzMkRDb250ZXh0O1xuLyoqXG4gKiBDcmVhdGVzIGEgYHRmLlRlbnNvcmAgZnJvbSBhbiBpbWFnZS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2VEYXRhKDEsIDEpO1xuICogaW1hZ2UuZGF0YVswXSA9IDEwMDtcbiAqIGltYWdlLmRhdGFbMV0gPSAxNTA7XG4gKiBpbWFnZS5kYXRhWzJdID0gMjAwO1xuICogaW1hZ2UuZGF0YVszXSA9IDI1NTtcbiAqXG4gKiB0Zi5icm93c2VyLmZyb21QaXhlbHMoaW1hZ2UpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gcGl4ZWxzIFRoZSBpbnB1dCBpbWFnZSB0byBjb25zdHJ1Y3QgdGhlIHRlbnNvciBmcm9tLiBUaGVcbiAqIHN1cHBvcnRlZCBpbWFnZSB0eXBlcyBhcmUgYWxsIDQtY2hhbm5lbC4gWW91IGNhbiBhbHNvIHBhc3MgaW4gYW4gaW1hZ2VcbiAqIG9iamVjdCB3aXRoIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuICogYHtkYXRhOiBVaW50OEFycmF5OyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlcn1gXG4gKiBAcGFyYW0gbnVtQ2hhbm5lbHMgVGhlIG51bWJlciBvZiBjaGFubmVscyBvZiB0aGUgb3V0cHV0IHRlbnNvci4gQVxuICogbnVtQ2hhbm5lbHMgdmFsdWUgbGVzcyB0aGFuIDQgYWxsb3dzIHlvdSB0byBpZ25vcmUgY2hhbm5lbHMuIERlZmF1bHRzIHRvXG4gKiAzIChpZ25vcmVzIGFscGhhIGNoYW5uZWwgb2YgaW5wdXQgaW1hZ2UpLlxuICpcbiAqIEByZXR1cm5zIEEgVGVuc29yM0Qgd2l0aCB0aGUgc2hhcGUgYFtoZWlnaHQsIHdpZHRoLCBudW1DaGFubmVsc11gLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdCcm93c2VyJywgbmFtZXNwYWNlOiAnYnJvd3NlcicsIGlnbm9yZUNJOiB0cnVlfVxuICovXG5mdW5jdGlvbiBmcm9tUGl4ZWxzXyhwaXhlbHMsIG51bUNoYW5uZWxzID0gMykge1xuICAgIC8vIFNhbml0eSBjaGVja3MuXG4gICAgaWYgKG51bUNoYW5uZWxzID4gNCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjb25zdHJ1Y3QgVGVuc29yIHdpdGggbW9yZSB0aGFuIDQgY2hhbm5lbHMgZnJvbSBwaXhlbHMuJyk7XG4gICAgfVxuICAgIGlmIChwaXhlbHMgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BpeGVscyBwYXNzZWQgdG8gdGYuYnJvd3Nlci5mcm9tUGl4ZWxzKCkgY2FuIG5vdCBiZSBudWxsJyk7XG4gICAgfVxuICAgIGxldCBpc1BpeGVsRGF0YSA9IGZhbHNlO1xuICAgIGxldCBpc0ltYWdlRGF0YSA9IGZhbHNlO1xuICAgIGxldCBpc1ZpZGVvID0gZmFsc2U7XG4gICAgbGV0IGlzSW1hZ2UgPSBmYWxzZTtcbiAgICBsZXQgaXNDYW52YXNMaWtlID0gZmFsc2U7XG4gICAgbGV0IGlzSW1hZ2VCaXRtYXAgPSBmYWxzZTtcbiAgICBpZiAocGl4ZWxzLmRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgICAgIGlzUGl4ZWxEYXRhID0gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIChJbWFnZURhdGEpICE9PSAndW5kZWZpbmVkJyAmJiBwaXhlbHMgaW5zdGFuY2VvZiBJbWFnZURhdGEpIHtcbiAgICAgICAgaXNJbWFnZURhdGEgPSB0cnVlO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgKEhUTUxWaWRlb0VsZW1lbnQpICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICBwaXhlbHMgaW5zdGFuY2VvZiBIVE1MVmlkZW9FbGVtZW50KSB7XG4gICAgICAgIGlzVmlkZW8gPSB0cnVlO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgKEhUTUxJbWFnZUVsZW1lbnQpICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICBwaXhlbHMgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50KSB7XG4gICAgICAgIGlzSW1hZ2UgPSB0cnVlO1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWFueVxuICAgIH1cbiAgICBlbHNlIGlmIChwaXhlbHMuZ2V0Q29udGV4dCAhPSBudWxsKSB7XG4gICAgICAgIGlzQ2FudmFzTGlrZSA9IHRydWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiAoSW1hZ2VCaXRtYXApICE9PSAndW5kZWZpbmVkJyAmJiBwaXhlbHMgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCkge1xuICAgICAgICBpc0ltYWdlQml0bWFwID0gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigncGl4ZWxzIHBhc3NlZCB0byB0Zi5icm93c2VyLmZyb21QaXhlbHMoKSBtdXN0IGJlIGVpdGhlciBhbiAnICtcbiAgICAgICAgICAgIGBIVE1MVmlkZW9FbGVtZW50LCBIVE1MSW1hZ2VFbGVtZW50LCBIVE1MQ2FudmFzRWxlbWVudCwgSW1hZ2VEYXRhIGAgK1xuICAgICAgICAgICAgYGluIGJyb3dzZXIsIG9yIE9mZnNjcmVlbkNhbnZhcywgSW1hZ2VEYXRhIGluIHdlYndvcmtlcmAgK1xuICAgICAgICAgICAgYCBvciB7ZGF0YTogVWludDMyQXJyYXksIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyfSwgYCArXG4gICAgICAgICAgICBgYnV0IHdhcyAke3BpeGVscy5jb25zdHJ1Y3Rvci5uYW1lfWApO1xuICAgIH1cbiAgICBpZiAoaXNWaWRlbykge1xuICAgICAgICBjb25zdCBIQVZFX0NVUlJFTlRfREFUQV9SRUFEWV9TVEFURSA9IDI7XG4gICAgICAgIGlmIChpc1ZpZGVvICYmXG4gICAgICAgICAgICBwaXhlbHMucmVhZHlTdGF0ZSA8XG4gICAgICAgICAgICAgICAgSEFWRV9DVVJSRU5UX0RBVEFfUkVBRFlfU1RBVEUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHZpZGVvIGVsZW1lbnQgaGFzIG5vdCBsb2FkZWQgZGF0YSB5ZXQuIFBsZWFzZSB3YWl0IGZvciAnICtcbiAgICAgICAgICAgICAgICAnYGxvYWRlZGRhdGFgIGV2ZW50IG9uIHRoZSA8dmlkZW8+IGVsZW1lbnQuJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gSWYgdGhlIGN1cnJlbnQgYmFja2VuZCBoYXMgJ0Zyb21QaXhlbHMnIHJlZ2lzdGVyZWQsIGl0IGhhcyBhIG1vcmVcbiAgICAvLyBlZmZpY2llbnQgd2F5IG9mIGhhbmRsaW5nIHBpeGVsIHVwbG9hZHMsIHNvIHdlIGNhbGwgdGhhdC5cbiAgICBjb25zdCBrZXJuZWwgPSBnZXRLZXJuZWwoRnJvbVBpeGVscywgRU5HSU5FLmJhY2tlbmROYW1lKTtcbiAgICBpZiAoa2VybmVsICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgaW5wdXRzID0geyBwaXhlbHMgfTtcbiAgICAgICAgY29uc3QgYXR0cnMgPSB7IG51bUNoYW5uZWxzIH07XG4gICAgICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEZyb21QaXhlbHMsIGlucHV0cywgYXR0cnMpO1xuICAgIH1cbiAgICBjb25zdCBbd2lkdGgsIGhlaWdodF0gPSBpc1ZpZGVvID9cbiAgICAgICAgW1xuICAgICAgICAgICAgcGl4ZWxzLnZpZGVvV2lkdGgsXG4gICAgICAgICAgICBwaXhlbHMudmlkZW9IZWlnaHRcbiAgICAgICAgXSA6XG4gICAgICAgIFtwaXhlbHMud2lkdGgsIHBpeGVscy5oZWlnaHRdO1xuICAgIGxldCB2YWxzO1xuICAgIGlmIChpc0NhbnZhc0xpa2UpIHtcbiAgICAgICAgdmFscyA9XG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgICAgICAgICBwaXhlbHMuZ2V0Q29udGV4dCgnMmQnKS5nZXRJbWFnZURhdGEoMCwgMCwgd2lkdGgsIGhlaWdodCkuZGF0YTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNJbWFnZURhdGEgfHwgaXNQaXhlbERhdGEpIHtcbiAgICAgICAgdmFscyA9IHBpeGVscy5kYXRhO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc0ltYWdlIHx8IGlzVmlkZW8gfHwgaXNJbWFnZUJpdG1hcCkge1xuICAgICAgICBpZiAoZnJvbVBpeGVsczJEQ29udGV4dCA9PSBudWxsKSB7XG4gICAgICAgICAgICBmcm9tUGl4ZWxzMkRDb250ZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJykuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgfVxuICAgICAgICBmcm9tUGl4ZWxzMkRDb250ZXh0LmNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgICAgICBmcm9tUGl4ZWxzMkRDb250ZXh0LmNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIGZyb21QaXhlbHMyRENvbnRleHQuZHJhd0ltYWdlKHBpeGVscywgMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIHZhbHMgPSBmcm9tUGl4ZWxzMkRDb250ZXh0LmdldEltYWdlRGF0YSgwLCAwLCB3aWR0aCwgaGVpZ2h0KS5kYXRhO1xuICAgIH1cbiAgICBsZXQgdmFsdWVzO1xuICAgIGlmIChudW1DaGFubmVscyA9PT0gNCkge1xuICAgICAgICB2YWx1ZXMgPSBuZXcgSW50MzJBcnJheSh2YWxzKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IG51bVBpeGVscyA9IHdpZHRoICogaGVpZ2h0O1xuICAgICAgICB2YWx1ZXMgPSBuZXcgSW50MzJBcnJheShudW1QaXhlbHMgKiBudW1DaGFubmVscyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtUGl4ZWxzOyBpKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgbnVtQ2hhbm5lbHM7ICsrY2hhbm5lbCkge1xuICAgICAgICAgICAgICAgIHZhbHVlc1tpICogbnVtQ2hhbm5lbHMgKyBjaGFubmVsXSA9IHZhbHNbaSAqIDQgKyBjaGFubmVsXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBvdXRTaGFwZSA9IFtoZWlnaHQsIHdpZHRoLCBudW1DaGFubmVsc107XG4gICAgcmV0dXJuIHRlbnNvcjNkKHZhbHVlcywgb3V0U2hhcGUsICdpbnQzMicpO1xufVxuLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgfGZyb21QaXhlbHNBc3luY3wgdG8gY2hlY2sgd2hldGhlciB0aGUgaW5wdXQgY2FuXG4vLyBiZSB3cmFwcGVkIGludG8gaW1hZ2VCaXRtYXAuXG5mdW5jdGlvbiBpc1BpeGVsRGF0YShwaXhlbHMpIHtcbiAgICByZXR1cm4gKHBpeGVscyAhPSBudWxsKSAmJiAocGl4ZWxzLmRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KTtcbn1cbmZ1bmN0aW9uIGlzSW1hZ2VCaXRtYXBGdWxseVN1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgdHlwZW9mIChJbWFnZUJpdG1hcCkgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIHdpbmRvdy5oYXNPd25Qcm9wZXJ0eSgnY3JlYXRlSW1hZ2VCaXRtYXAnKTtcbn1cbmZ1bmN0aW9uIGlzTm9uRW1wdHlQaXhlbHMocGl4ZWxzKSB7XG4gICAgcmV0dXJuIHBpeGVscyAhPSBudWxsICYmIHBpeGVscy53aWR0aCAhPT0gMCAmJiBwaXhlbHMuaGVpZ2h0ICE9PSAwO1xufVxuZnVuY3Rpb24gY2FuV3JhcFBpeGVsc1RvSW1hZ2VCaXRtYXAocGl4ZWxzKSB7XG4gICAgcmV0dXJuIGlzSW1hZ2VCaXRtYXBGdWxseVN1cHBvcnRlZCgpICYmICEocGl4ZWxzIGluc3RhbmNlb2YgSW1hZ2VCaXRtYXApICYmXG4gICAgICAgIGlzTm9uRW1wdHlQaXhlbHMocGl4ZWxzKSAmJiAhaXNQaXhlbERhdGEocGl4ZWxzKTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIGB0Zi5UZW5zb3JgIGZyb20gYW4gaW1hZ2UgaW4gYXN5bmMgd2F5LlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBpbWFnZSA9IG5ldyBJbWFnZURhdGEoMSwgMSk7XG4gKiBpbWFnZS5kYXRhWzBdID0gMTAwO1xuICogaW1hZ2UuZGF0YVsxXSA9IDE1MDtcbiAqIGltYWdlLmRhdGFbMl0gPSAyMDA7XG4gKiBpbWFnZS5kYXRhWzNdID0gMjU1O1xuICpcbiAqIChhd2FpdCB0Zi5icm93c2VyLmZyb21QaXhlbHNBc3luYyhpbWFnZSkpLnByaW50KCk7XG4gKiBgYGBcbiAqIFRoaXMgQVBJIGlzIHRoZSBhc3luYyB2ZXJzaW9uIG9mIGZyb21QaXhlbHMuIFRoZSBBUEkgd2lsbCBmaXJzdFxuICogY2hlY2sgfFdSQVBfVE9fSU1BR0VCSVRNQVB8IGZsYWcsIGFuZCB0cnkgdG8gd3JhcCB0aGUgaW5wdXQgdG9cbiAqIGltYWdlQml0bWFwIGlmIHRoZSBmbGFnIGlzIHNldCB0byB0cnVlLlxuICpcbiAqIEBwYXJhbSBwaXhlbHMgVGhlIGlucHV0IGltYWdlIHRvIGNvbnN0cnVjdCB0aGUgdGVuc29yIGZyb20uIFRoZVxuICogc3VwcG9ydGVkIGltYWdlIHR5cGVzIGFyZSBhbGwgNC1jaGFubmVsLiBZb3UgY2FuIGFsc28gcGFzcyBpbiBhbiBpbWFnZVxuICogb2JqZWN0IHdpdGggZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG4gKiBge2RhdGE6IFVpbnQ4QXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyfWBcbiAqIEBwYXJhbSBudW1DaGFubmVscyBUaGUgbnVtYmVyIG9mIGNoYW5uZWxzIG9mIHRoZSBvdXRwdXQgdGVuc29yLiBBXG4gKiBudW1DaGFubmVscyB2YWx1ZSBsZXNzIHRoYW4gNCBhbGxvd3MgeW91IHRvIGlnbm9yZSBjaGFubmVscy4gRGVmYXVsdHMgdG9cbiAqIDMgKGlnbm9yZXMgYWxwaGEgY2hhbm5lbCBvZiBpbnB1dCBpbWFnZSkuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0Jyb3dzZXInLCBuYW1lc3BhY2U6ICdicm93c2VyJywgaWdub3JlQ0k6IHRydWV9XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmcm9tUGl4ZWxzQXN5bmMocGl4ZWxzLCBudW1DaGFubmVscyA9IDMpIHtcbiAgICBsZXQgaW5wdXRzID0gbnVsbDtcbiAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBiYWNrZW5kIG5lZWRzIHRvIHdyYXAgfHBpeGVsc3wgdG8gaW1hZ2VCaXRtYXAgYW5kXG4gICAgLy8gd2hldGhlciB8cGl4ZWxzfCBjYW4gYmUgd3JhcHBlZCB0byBpbWFnZUJpdG1hcC5cbiAgICBpZiAoZW52KCkuZ2V0Qm9vbCgnV1JBUF9UT19JTUFHRUJJVE1BUCcpICYmXG4gICAgICAgIGNhbldyYXBQaXhlbHNUb0ltYWdlQml0bWFwKHBpeGVscykpIHtcbiAgICAgICAgLy8gRm9yY2UgdGhlIGltYWdlQml0bWFwIGNyZWF0aW9uIHRvIG5vdCBkbyBhbnkgcHJlbXVsdGlwbHkgYWxwaGFcbiAgICAgICAgLy8gb3BzLlxuICAgICAgICBsZXQgaW1hZ2VCaXRtYXA7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyB3cmFwIGluIHRyeS1jYXRjaCBibG9jaywgYmVjYXVzZSBjcmVhdGVJbWFnZUJpdG1hcCBtYXkgbm90IHdvcmtcbiAgICAgICAgICAgIC8vIHByb3Blcmx5IGluIHNvbWUgYnJvd3NlcnMsIGUuZy5cbiAgICAgICAgICAgIC8vIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTEzMzU1OTRcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tYW55XG4gICAgICAgICAgICBpbWFnZUJpdG1hcCA9IGF3YWl0IGNyZWF0ZUltYWdlQml0bWFwKHBpeGVscywgeyBwcmVtdWx0aXBseUFscGhhOiAnbm9uZScgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGltYWdlQml0bWFwID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBjcmVhdGVJbWFnZUJpdG1hcCB3aWxsIGNsaXAgdGhlIHNvdXJjZSBzaXplLlxuICAgICAgICAvLyBJbiBzb21lIGNhc2VzLCB0aGUgaW5wdXQgd2lsbCBoYXZlIGxhcmdlciBzaXplIHRoYW4gaXRzIGNvbnRlbnQuXG4gICAgICAgIC8vIEUuZy4gbmV3IEltYWdlKDEwLCAxMCkgYnV0IHdpdGggMSB4IDEgY29udGVudC4gVXNpbmdcbiAgICAgICAgLy8gY3JlYXRlSW1hZ2VCaXRtYXAgd2lsbCBjbGlwIHRoZSBzaXplIGZyb20gMTAgeCAxMCB0byAxIHggMSwgd2hpY2hcbiAgICAgICAgLy8gaXMgbm90IGNvcnJlY3QuIFdlIHNob3VsZCBhdm9pZCB3cmFwcGluZyBzdWNoIHJlc291Y2UgdG9cbiAgICAgICAgLy8gaW1hZ2VCaXRtYXAuXG4gICAgICAgIGlmIChpbWFnZUJpdG1hcCAhPSBudWxsICYmIGltYWdlQml0bWFwLndpZHRoID09PSBwaXhlbHMud2lkdGggJiZcbiAgICAgICAgICAgIGltYWdlQml0bWFwLmhlaWdodCA9PT0gcGl4ZWxzLmhlaWdodCkge1xuICAgICAgICAgICAgaW5wdXRzID0gaW1hZ2VCaXRtYXA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpbnB1dHMgPSBwaXhlbHM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlucHV0cyA9IHBpeGVscztcbiAgICB9XG4gICAgcmV0dXJuIGZyb21QaXhlbHNfKGlucHV0cywgbnVtQ2hhbm5lbHMpO1xufVxuLyoqXG4gKiBEcmF3cyBhIGB0Zi5UZW5zb3JgIG9mIHBpeGVsIHZhbHVlcyB0byBhIGJ5dGUgYXJyYXkgb3Igb3B0aW9uYWxseSBhXG4gKiBjYW52YXMuXG4gKlxuICogV2hlbiB0aGUgZHR5cGUgb2YgdGhlIGlucHV0IGlzICdmbG9hdDMyJywgd2UgYXNzdW1lIHZhbHVlcyBpbiB0aGUgcmFuZ2VcbiAqIFswLTFdLiBPdGhlcndpc2UsIHdoZW4gaW5wdXQgaXMgJ2ludDMyJywgd2UgYXNzdW1lIHZhbHVlcyBpbiB0aGUgcmFuZ2VcbiAqIFswLTI1NV0uXG4gKlxuICogUmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjYW52YXMgaGFzIGJlZW4gZHJhd24gdG8uXG4gKlxuICogQHBhcmFtIGltZyBBIHJhbmstMiB0ZW5zb3Igd2l0aCBzaGFwZSBgW2hlaWdodCwgd2lkdGhdYCwgb3IgYSByYW5rLTMgdGVuc29yXG4gKiBvZiBzaGFwZSBgW2hlaWdodCwgd2lkdGgsIG51bUNoYW5uZWxzXWAuIElmIHJhbmstMiwgZHJhd3MgZ3JheXNjYWxlLiBJZlxuICogcmFuay0zLCBtdXN0IGhhdmUgZGVwdGggb2YgMSwgMyBvciA0LiBXaGVuIGRlcHRoIG9mIDEsIGRyYXdzXG4gKiBncmF5c2NhbGUuIFdoZW4gZGVwdGggb2YgMywgd2UgZHJhdyB3aXRoIHRoZSBmaXJzdCB0aHJlZSBjb21wb25lbnRzIG9mXG4gKiB0aGUgZGVwdGggZGltZW5zaW9uIGNvcnJlc3BvbmRpbmcgdG8gciwgZywgYiBhbmQgYWxwaGEgPSAxLiBXaGVuIGRlcHRoIG9mXG4gKiA0LCBhbGwgZm91ciBjb21wb25lbnRzIG9mIHRoZSBkZXB0aCBkaW1lbnNpb24gY29ycmVzcG9uZCB0byByLCBnLCBiLCBhLlxuICogQHBhcmFtIGNhbnZhcyBUaGUgY2FudmFzIHRvIGRyYXcgdG8uXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0Jyb3dzZXInLCBuYW1lc3BhY2U6ICdicm93c2VyJ31cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRvUGl4ZWxzKGltZywgY2FudmFzKSB7XG4gICAgbGV0ICRpbWcgPSBjb252ZXJ0VG9UZW5zb3IoaW1nLCAnaW1nJywgJ3RvUGl4ZWxzJyk7XG4gICAgaWYgKCEoaW1nIGluc3RhbmNlb2YgVGVuc29yKSkge1xuICAgICAgICAvLyBBc3N1bWUgaW50MzIgaWYgdXNlciBwYXNzZWQgYSBuYXRpdmUgYXJyYXkuXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsSW1nVGVuc29yID0gJGltZztcbiAgICAgICAgJGltZyA9IGNhc3Qob3JpZ2luYWxJbWdUZW5zb3IsICdpbnQzMicpO1xuICAgICAgICBvcmlnaW5hbEltZ1RlbnNvci5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGlmICgkaW1nLnJhbmsgIT09IDIgJiYgJGltZy5yYW5rICE9PSAzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdG9QaXhlbHMgb25seSBzdXBwb3J0cyByYW5rIDIgb3IgMyB0ZW5zb3JzLCBnb3QgcmFuayAkeyRpbWcucmFua30uYCk7XG4gICAgfVxuICAgIGNvbnN0IFtoZWlnaHQsIHdpZHRoXSA9ICRpbWcuc2hhcGUuc2xpY2UoMCwgMik7XG4gICAgY29uc3QgZGVwdGggPSAkaW1nLnJhbmsgPT09IDIgPyAxIDogJGltZy5zaGFwZVsyXTtcbiAgICBpZiAoZGVwdGggPiA0IHx8IGRlcHRoID09PSAyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdG9QaXhlbHMgb25seSBzdXBwb3J0cyBkZXB0aCBvZiBzaXplIGAgK1xuICAgICAgICAgICAgYDEsIDMgb3IgNCBidXQgZ290ICR7ZGVwdGh9YCk7XG4gICAgfVxuICAgIGlmICgkaW1nLmR0eXBlICE9PSAnZmxvYXQzMicgJiYgJGltZy5kdHlwZSAhPT0gJ2ludDMyJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHR5cGUgZm9yIHRvUGl4ZWxzOiAkeyRpbWcuZHR5cGV9LmAgK1xuICAgICAgICAgICAgYCBQbGVhc2UgdXNlIGZsb2F0MzIgb3IgaW50MzIgdGVuc29ycy5gKTtcbiAgICB9XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0ICRpbWcuZGF0YSgpO1xuICAgIGNvbnN0IG11bHRpcGxpZXIgPSAkaW1nLmR0eXBlID09PSAnZmxvYXQzMicgPyAyNTUgOiAxO1xuICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHdpZHRoICogaGVpZ2h0ICogNCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWlnaHQgKiB3aWR0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IHJnYmEgPSBbMCwgMCwgMCwgMjU1XTtcbiAgICAgICAgZm9yIChsZXQgZCA9IDA7IGQgPCBkZXB0aDsgZCsrKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGRhdGFbaSAqIGRlcHRoICsgZF07XG4gICAgICAgICAgICBpZiAoJGltZy5kdHlwZSA9PT0gJ2Zsb2F0MzInKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUZW5zb3IgdmFsdWVzIGZvciBhIGZsb2F0MzIgVGVuc29yIG11c3QgYmUgaW4gdGhlIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYHJhbmdlIFswIC0gMV0gYnV0IGVuY291bnRlcmVkICR7dmFsdWV9LmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCRpbWcuZHR5cGUgPT09ICdpbnQzMicpIHtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gMjU1KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGVuc29yIHZhbHVlcyBmb3IgYSBpbnQzMiBUZW5zb3IgbXVzdCBiZSBpbiB0aGUgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgcmFuZ2UgWzAgLSAyNTVdIGJ1dCBlbmNvdW50ZXJlZCAke3ZhbHVlfS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGVwdGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZ2JhWzBdID0gdmFsdWUgKiBtdWx0aXBsaWVyO1xuICAgICAgICAgICAgICAgIHJnYmFbMV0gPSB2YWx1ZSAqIG11bHRpcGxpZXI7XG4gICAgICAgICAgICAgICAgcmdiYVsyXSA9IHZhbHVlICogbXVsdGlwbGllcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJnYmFbZF0gPSB2YWx1ZSAqIG11bHRpcGxpZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaiA9IGkgKiA0O1xuICAgICAgICBieXRlc1tqICsgMF0gPSBNYXRoLnJvdW5kKHJnYmFbMF0pO1xuICAgICAgICBieXRlc1tqICsgMV0gPSBNYXRoLnJvdW5kKHJnYmFbMV0pO1xuICAgICAgICBieXRlc1tqICsgMl0gPSBNYXRoLnJvdW5kKHJnYmFbMl0pO1xuICAgICAgICBieXRlc1tqICsgM10gPSBNYXRoLnJvdW5kKHJnYmFbM10pO1xuICAgIH1cbiAgICBpZiAoY2FudmFzICE9IG51bGwpIHtcbiAgICAgICAgY2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICBjb25zdCBpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKGJ5dGVzLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgY3R4LnB1dEltYWdlRGF0YShpbWFnZURhdGEsIDAsIDApO1xuICAgIH1cbiAgICBpZiAoJGltZyAhPT0gaW1nKSB7XG4gICAgICAgICRpbWcuZGlzcG9zZSgpO1xuICAgIH1cbiAgICByZXR1cm4gYnl0ZXM7XG59XG5leHBvcnQgY29uc3QgZnJvbVBpeGVscyA9IG9wKHsgZnJvbVBpeGVsc18gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1icm93c2VyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFRlbnNvckJ1ZmZlciB9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuLyoqXG4gKiBDcmVhdGVzIGFuIGVtcHR5IGB0Zi5UZW5zb3JCdWZmZXJgIHdpdGggdGhlIHNwZWNpZmllZCBgc2hhcGVgIGFuZCBgZHR5cGVgLlxuICpcbiAqIFRoZSB2YWx1ZXMgYXJlIHN0b3JlZCBpbiBDUFUgYXMgYFR5cGVkQXJyYXlgLiBGaWxsIHRoZSBidWZmZXIgdXNpbmdcbiAqIGBidWZmZXIuc2V0KClgLCBvciBieSBtb2RpZnlpbmcgZGlyZWN0bHkgYGJ1ZmZlci52YWx1ZXNgLlxuICpcbiAqIFdoZW4gZG9uZSwgY2FsbCBgYnVmZmVyLnRvVGVuc29yKClgIHRvIGdldCBhbiBpbW11dGFibGUgYHRmLlRlbnNvcmAgd2l0aFxuICogdGhvc2UgdmFsdWVzLlxuICpcbiAqIGBgYGpzXG4gKiAvLyBDcmVhdGUgYSBidWZmZXIgYW5kIHNldCB2YWx1ZXMgYXQgcGFydGljdWxhciBpbmRpY2VzLlxuICogY29uc3QgYnVmZmVyID0gdGYuYnVmZmVyKFsyLCAyXSk7XG4gKiBidWZmZXIuc2V0KDMsIDAsIDApO1xuICogYnVmZmVyLnNldCg1LCAxLCAwKTtcbiAqXG4gKiAvLyBDb252ZXJ0IHRoZSBidWZmZXIgYmFjayB0byBhIHRlbnNvci5cbiAqIGJ1ZmZlci50b1RlbnNvcigpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gc2hhcGUgQW4gYXJyYXkgb2YgaW50ZWdlcnMgZGVmaW5pbmcgdGhlIG91dHB1dCB0ZW5zb3Igc2hhcGUuXG4gKiBAcGFyYW0gZHR5cGUgVGhlIGR0eXBlIG9mIHRoZSBidWZmZXIuIERlZmF1bHRzIHRvICdmbG9hdDMyJy5cbiAqIEBwYXJhbSB2YWx1ZXMgVGhlIHZhbHVlcyBvZiB0aGUgYnVmZmVyIGFzIGBUeXBlZEFycmF5YC4gRGVmYXVsdHMgdG9cbiAqIHplcm9zLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1ZmZlcihzaGFwZSwgZHR5cGUgPSAnZmxvYXQzMicsIHZhbHVlcykge1xuICAgIGR0eXBlID0gZHR5cGUgfHwgJ2Zsb2F0MzInO1xuICAgIHV0aWwuYXNzZXJ0Tm9uTmVnYXRpdmVJbnRlZ2VyRGltZW5zaW9ucyhzaGFwZSk7XG4gICAgcmV0dXJuIG5ldyBUZW5zb3JCdWZmZXIoc2hhcGUsIGR0eXBlLCB2YWx1ZXMpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YnVmZmVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBDYXN0IH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENhc3RzIGEgYHRmLlRlbnNvcmAgdG8gYSBuZXcgZHR5cGUuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMS41LCAyLjUsIDNdKTtcbiAqIHRmLmNhc3QoeCwgJ2ludDMyJykucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciB0byBiZSBjYXN0ZWQuXG4gKiBAcGFyYW0gZHR5cGUgVGhlIGR0eXBlIHRvIGNhc3QgdGhlIGlucHV0IHRlbnNvciB0by5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdUcmFuc2Zvcm1hdGlvbnMnfVxuICovXG5mdW5jdGlvbiBjYXN0Xyh4LCBkdHlwZSkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2Nhc3QnKTtcbiAgICAvLyBTYW5pdHkgY2hlY2tzLlxuICAgIGlmICghdXRpbC5pc1ZhbGlkRHR5cGUoZHR5cGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGNhc3QgdG8gdW5rbm93biBkdHlwZSAke2R0eXBlfWApO1xuICAgIH1cbiAgICBpZiAoZHR5cGUgPT09ICdzdHJpbmcnICYmICR4LmR0eXBlICE9PSAnc3RyaW5nJyB8fFxuICAgICAgICBkdHlwZSAhPT0gJ3N0cmluZycgJiYgJHguZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignT25seSBzdHJpbmdzIGNhbiBiZSBjYXN0ZWQgdG8gc3RyaW5ncycpO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgY29uc3QgYXR0cnMgPSB7IGR0eXBlIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoQ2FzdCwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgY2FzdCA9IG9wKHsgY2FzdF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jYXN0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBDZWlsIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgY2VpbGluZyBvZiBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6IGBjZWlsKHgpYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWy42LCAxLjEsIC0zLjNdKTtcbiAqXG4gKiB4LmNlaWwoKS5wcmludCgpOyAgLy8gb3IgdGYuY2VpbCh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgVGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBjZWlsXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnY2VpbCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChDZWlsLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGNlaWwgPSBvcCh7IGNlaWxfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2VpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgQ2xpcEJ5VmFsdWUgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ2xpcHMgdmFsdWVzIGVsZW1lbnQtd2lzZS4gYG1heChtaW4oeCwgY2xpcFZhbHVlTWF4KSwgY2xpcFZhbHVlTWluKWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFstMSwgMiwgLTMsIDRdKTtcbiAqXG4gKiB4LmNsaXBCeVZhbHVlKC0yLCAzKS5wcmludCgpOyAgLy8gb3IgdGYuY2xpcEJ5VmFsdWUoeCwgLTIsIDMpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gY2xpcFZhbHVlTWluIExvd2VyLWJvdW5kIG9mIHJhbmdlIHRvIGJlIGNsaXBwZWQgdG8uXG4gKiBAcGFyYW0gY2xpcFZhbHVlTWF4IFVwcGVyLWJvdW5kIG9mIHJhbmdlIHRvIGJlIGNsaXBwZWQgdG8uXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGNsaXBCeVZhbHVlXyh4LCBjbGlwVmFsdWVNaW4sIGNsaXBWYWx1ZU1heCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2NsaXBCeVZhbHVlJyk7XG4gICAgdXRpbC5hc3NlcnQoKGNsaXBWYWx1ZU1pbiA8PSBjbGlwVmFsdWVNYXgpLCAoKSA9PiBgRXJyb3IgaW4gY2xpcDogbWluICgke2NsaXBWYWx1ZU1pbn0pIG11c3QgYmUgYCArXG4gICAgICAgIGBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gbWF4ICgke2NsaXBWYWx1ZU1heH0pLmApO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICBjb25zdCBhdHRycyA9IHsgY2xpcFZhbHVlTWluLCBjbGlwVmFsdWVNYXggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChDbGlwQnlWYWx1ZSwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgY2xpcEJ5VmFsdWUgPSBvcCh7IGNsaXBCeVZhbHVlXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNsaXBfYnlfdmFsdWUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IElkZW50aXR5IH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB0ZW5zb3Igd2l0aCB0aGUgc2FtZSB2YWx1ZXMgYW5kIHNoYXBlIGFzIHRoZSBzcGVjaWZpZWRcbiAqIHRlbnNvci5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcihbMSwgMl0pO1xuICpcbiAqIHguY2xvbmUoKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIHRlbnNvciB0byBjbG9uZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmZ1bmN0aW9uIGNsb25lXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnY2xvbmUnLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgLy8gTm90ZSB0aGlzIG9wIGlzIGNhbGxlZCB0Zi5pZGVudGl0eSBpbiBweXRob24uIEhlbmNlIHRoZSBrZXJuZWwgbmFtZSB1c2VkXG4gICAgLy8gaGVyZS5cbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChJZGVudGl0eSwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBjbG9uZSA9IG9wKHsgY2xvbmVfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2xvbmUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IENvbXBsZXggfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29udmVydHMgdHdvIHJlYWwgbnVtYmVycyB0byBhIGNvbXBsZXggbnVtYmVyLlxuICpcbiAqIEdpdmVuIGEgdGVuc29yIGByZWFsYCByZXByZXNlbnRpbmcgdGhlIHJlYWwgcGFydCBvZiBhIGNvbXBsZXggbnVtYmVyLCBhbmQgYVxuICogdGVuc29yIGBpbWFnYCByZXByZXNlbnRpbmcgdGhlIGltYWdpbmFyeSBwYXJ0IG9mIGEgY29tcGxleCBudW1iZXIsIHRoaXNcbiAqIG9wZXJhdGlvbiByZXR1cm5zIGNvbXBsZXggbnVtYmVycyBlbGVtZW50d2lzZSBvZiB0aGUgZm9ybSBbcjAsIGkwLCByMSwgaTFdLFxuICogd2hlcmUgciByZXByZXNlbnRzIHRoZSByZWFsIHBhcnQgYW5kIGkgcmVwcmVzZW50cyB0aGUgaW1hZyBwYXJ0LlxuICpcbiAqIFRoZSBpbnB1dCB0ZW5zb3JzIHJlYWwgYW5kIGltYWcgbXVzdCBoYXZlIHRoZSBzYW1lIHNoYXBlLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCByZWFsID0gdGYudGVuc29yMWQoWzIuMjUsIDMuMjVdKTtcbiAqIGNvbnN0IGltYWcgPSB0Zi50ZW5zb3IxZChbNC43NSwgNS43NV0pO1xuICogY29uc3QgY29tcGxleCA9IHRmLmNvbXBsZXgocmVhbCwgaW1hZyk7XG4gKlxuICogY29tcGxleC5wcmludCgpO1xuICogYGBgXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5mdW5jdGlvbiBjb21wbGV4XyhyZWFsLCBpbWFnKSB7XG4gICAgY29uc3QgJHJlYWwgPSBjb252ZXJ0VG9UZW5zb3IocmVhbCwgJ3JlYWwnLCAnY29tcGxleCcpO1xuICAgIGNvbnN0ICRpbWFnID0gY29udmVydFRvVGVuc29yKGltYWcsICdpbWFnJywgJ2NvbXBsZXgnKTtcbiAgICB1dGlsLmFzc2VydFNoYXBlc01hdGNoKCRyZWFsLnNoYXBlLCAkaW1hZy5zaGFwZSwgYHJlYWwgYW5kIGltYWcgc2hhcGVzLCAkeyRyZWFsLnNoYXBlfSBhbmQgJHskaW1hZy5zaGFwZX0sIGAgK1xuICAgICAgICBgbXVzdCBtYXRjaCBpbiBjYWxsIHRvIHRmLmNvbXBsZXgoKS5gKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHJlYWw6ICRyZWFsLCBpbWFnOiAkaW1hZyB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKENvbXBsZXgsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgY29tcGxleCA9IG9wKHsgY29tcGxleF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb21wbGV4LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBDb25jYXQgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yQXJyYXkgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBjbG9uZSB9IGZyb20gJy4vY2xvbmUnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbmNhdGVuYXRlcyBhIGxpc3Qgb2YgYHRmLlRlbnNvcmBzIGFsb25nIGEgZ2l2ZW4gYXhpcy5cbiAqXG4gKiBUaGUgdGVuc29ycyByYW5rcyBhbmQgdHlwZXMgbXVzdCBtYXRjaCwgYW5kIHRoZWlyIHNpemVzIG11c3QgbWF0Y2ggaW4gYWxsXG4gKiBkaW1lbnNpb25zIGV4Y2VwdCBgYXhpc2AuXG4gKlxuICogQWxzbyBhdmFpbGFibGUgYXJlIHN0cmljdGVyIHJhbmstc3BlY2lmaWMgbWV0aG9kcyB0aGF0IGFzc2VydCB0aGF0XG4gKiBgdGVuc29yc2AgYXJlIG9mIHRoZSBnaXZlbiByYW5rOlxuICogICAtIGB0Zi5jb25jYXQxZGBcbiAqICAgLSBgdGYuY29uY2F0MmRgXG4gKiAgIC0gYHRmLmNvbmNhdDNkYFxuICogICAtIGB0Zi5jb25jYXQ0ZGBcbiAqXG4gKiBFeGNlcHQgYHRmLmNvbmNhdDFkYCAod2hpY2ggZG9lcyBub3QgaGF2ZSBheGlzIHBhcmFtKSwgYWxsIG1ldGhvZHMgaGF2ZVxuICogc2FtZSBzaWduYXR1cmUgYXMgdGhpcyBtZXRob2QuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMl0pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFszLCA0XSk7XG4gKiBhLmNvbmNhdChiKS5wcmludCgpOyAgLy8gb3IgYS5jb25jYXQoYilcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDJdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbMywgNF0pO1xuICogY29uc3QgYyA9IHRmLnRlbnNvcjFkKFs1LCA2XSk7XG4gKiB0Zi5jb25jYXQoW2EsIGIsIGNdKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IyZChbWzEsIDJdLCBbMTAsIDIwXV0pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjJkKFtbMywgNF0sIFszMCwgNDBdXSk7XG4gKiBjb25zdCBheGlzID0gMTtcbiAqIHRmLmNvbmNhdChbYSwgYl0sIGF4aXMpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSB0ZW5zb3JzIEEgbGlzdCBvZiB0ZW5zb3JzIHRvIGNvbmNhdGVuYXRlLlxuICogQHBhcmFtIGF4aXMgVGhlIGF4aXMgdG8gY29uY2F0ZSBhbG9uZy4gRGVmYXVsdHMgdG8gMCAodGhlIGZpcnN0IGRpbSkuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnU2xpY2luZyBhbmQgSm9pbmluZyd9XG4gKi9cbmZ1bmN0aW9uIGNvbmNhdF8odGVuc29ycywgYXhpcyA9IDApIHtcbiAgICBhc3NlcnQodGVuc29ycy5sZW5ndGggPj0gMSwgKCkgPT4gJ1Bhc3MgYXQgbGVhc3Qgb25lIHRlbnNvciB0byBjb25jYXQnKTtcbiAgICBjb25zdCAkdGVuc29ycyA9IGNvbnZlcnRUb1RlbnNvckFycmF5KHRlbnNvcnMsICd0ZW5zb3JzJywgJ2NvbmNhdCcsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICAgIGlmICgkdGVuc29yc1swXS5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgJHRlbnNvcnMuZm9yRWFjaCh0ZW5zb3IgPT4ge1xuICAgICAgICAgICAgaWYgKHRlbnNvci5kdHlwZSAhPT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb25jYXRlbmF0ZSBjb21wbGV4NjQgdGVuc29ycyB3aXRoIGEgdGVuc29yXG4gICAgICAgICAgd2l0aCBkdHlwZSAke3RlbnNvci5kdHlwZX0uIGApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKCR0ZW5zb3JzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gY2xvbmUoJHRlbnNvcnNbMF0pO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dHMgPSAkdGVuc29ycztcbiAgICBjb25zdCBhdHRyID0geyBheGlzIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoQ29uY2F0LCBpbnB1dHMsIGF0dHIpO1xufVxuZXhwb3J0IGNvbnN0IGNvbmNhdCA9IG9wKHsgY29uY2F0XyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbmNhdC5qcy5tYXAiLCJpbXBvcnQgeyBjb25jYXQgfSBmcm9tICcuL2NvbmNhdCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29uY2F0ZW5hdGVzIGEgbGlzdCBvZmB0Zi5UZW5zb3IxRGBzIGFsb25nIGFuIGF4aXMuIFNlZSBgY29uY2F0YCBmb3IgZGV0YWlscy5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgaWY6XG4gKiBBOiBzaGFwZSgzKSA9IHxyMSwgZzEsIGIxfFxuICogQjogc2hhcGUoMikgPSB8cjIsIGcyfFxuICogQyA9IHRmLmNvbmNhdDFkKFtBLCBCXSkgPT0gfHIxLCBnMSwgYjEsIHIyLCBnMnxcbiAqXG4gKiBAcGFyYW0gdGVuc29ycyBBIGxpc3Qgb2ZgdGYuVGVuc29yYHMgdG8gY29uY2F0ZW5hdGUuXG4gKiBAcmV0dXJuIFRoZSBjb25jYXRlbmF0ZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGNvbmNhdDFkXyh0ZW5zb3JzKSB7XG4gICAgcmV0dXJuIGNvbmNhdCh0ZW5zb3JzLCAwIC8qIGF4aXMgKi8pO1xufVxuZXhwb3J0IGNvbnN0IGNvbmNhdDFkID0gb3AoeyBjb25jYXQxZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25jYXRfMWQuanMubWFwIiwiaW1wb3J0IHsgY29uY2F0IH0gZnJvbSAnLi9jb25jYXQnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbmNhdGVuYXRlcyBhIGxpc3Qgb2ZgdGYuVGVuc29yMkRgcyBhbG9uZyBhbiBheGlzLiBTZWUgYGNvbmNhdGAgZm9yIGRldGFpbHMuXG4gKlxuICogRm9yIGV4YW1wbGUsIGlmOlxuICogQTogc2hhcGUoMiwgMykgPSB8IHIxLCBnMSwgYjEgfFxuICogICAgICAgICAgICAgICAgICB8IHIyLCBnMiwgYjIgfFxuICpcbiAqIEI6IHNoYXBlKDIsIDMpID0gfCByMywgZzMsIGIzIHxcbiAqICAgICAgICAgICAgICAgICAgfCByNCwgZzQsIGI0IHxcbiAqXG4gKiBDID0gdGYuY29uY2F0MmQoW0EsIEJdLCBheGlzKVxuICpcbiAqIGlmIGF4aXMgPSAwOlxuICogQzogc2hhcGUoNCwgMykgPSB8IHIxLCBnMSwgYjEgfFxuICogICAgICAgICAgICAgICAgICB8IHIyLCBnMiwgYjIgfFxuICogICAgICAgICAgICAgICAgICB8IHIzLCBnMywgYjMgfFxuICogICAgICAgICAgICAgICAgICB8IHI0LCBnNCwgYjQgfFxuICpcbiAqIGlmIGF4aXMgPSAxOlxuICogQyA9IHNoYXBlKDIsIDYpID0gfCByMSwgZzEsIGIxLCByMywgZzMsIGIzIHxcbiAqICAgICAgICAgICAgICAgICAgIHwgcjIsIGcyLCBiMiwgcjQsIGc0LCBiNCB8XG4gKlxuICpcbiAqIEBwYXJhbSB0ZW5zb3JzIEEgbGlzdCBvZiBgdGYuVGVuc29yYHMgdG8gY29uY2F0ZW5hdGUuXG4gKiBAcGFyYW0gYXhpcyBUaGUgYXhpcyB0byBjb25jYXRlbmF0ZSBhbG9uZy5cbiAqIEByZXR1cm4gVGhlIGNvbmNhdGVuYXRlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gY29uY2F0MmRfKHRlbnNvcnMsIGF4aXMpIHtcbiAgICByZXR1cm4gY29uY2F0KHRlbnNvcnMsIGF4aXMpO1xufVxuZXhwb3J0IGNvbnN0IGNvbmNhdDJkID0gb3AoeyBjb25jYXQyZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25jYXRfMmQuanMubWFwIiwiaW1wb3J0IHsgY29uY2F0IH0gZnJvbSAnLi9jb25jYXQnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbmNhdGVuYXRlcyBhIGxpc3Qgb2YgYHRmLlRlbnNvcjNEYHMgYWxvbmcgYW4gYXhpcy5cbiAqIFNlZSBgY29uY2F0YCBmb3IgZGV0YWlscy5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgaWY6XG4gKiBBOiBzaGFwZSgyLCAxLCAzKSA9IHwgcjEsIGcxLCBiMSB8XG4gKiAgICAgICAgICAgICAgICAgICAgIHwgcjIsIGcyLCBiMiB8XG4gKlxuICogQjogc2hhcGUoMiwgMSwgMykgPSB8IHIzLCBnMywgYjMgfFxuICogICAgICAgICAgICAgICAgICAgICB8IHI0LCBnNCwgYjQgfFxuICpcbiAqIEMgPSB0Zi5jb25jYXQzZChbQSwgQl0sIGF4aXMpXG4gKlxuICogaWYgYXhpcyA9IDA6XG4gKiBDOiBzaGFwZSg0LCAxLCAzKSA9IHwgcjEsIGcxLCBiMSB8XG4gKiAgICAgICAgICAgICAgICAgICAgIHwgcjIsIGcyLCBiMiB8XG4gKiAgICAgICAgICAgICAgICAgICAgIHwgcjMsIGczLCBiMyB8XG4gKiAgICAgICAgICAgICAgICAgICAgIHwgcjQsIGc0LCBiNCB8XG4gKlxuICogaWYgYXhpcyA9IDE6XG4gKiBDOiBzaGFwZSgyLCAyLCAzKSA9IHwgcjEsIGcxLCBiMSwgcjMsIGczLCBiMyB8XG4gKiAgICAgICAgICAgICAgICAgICAgIHwgcjIsIGcyLCBiMiwgcjQsIGc0LCBiNCB8XG4gKlxuICogaWYgYXhpcyA9IDI6XG4gKiBDID0gc2hhcGUoMiwgMSwgNikgPSB8IHIxLCBnMSwgYjEsIHIzLCBnMywgYjMgfFxuICogICAgICAgICAgICAgICAgICAgICAgfCByMiwgZzIsIGIyLCByNCwgZzQsIGI0IHxcbiAqXG4gKiBAcGFyYW0gdGVuc29ycyBBIGxpc3Qgb2ZgdGYuVGVuc29yYHMgdG8gY29uY2F0ZW5hdGUuXG4gKiBAcGFyYW0gYXhpcyBUaGUgYXhpcyB0byBjb25jYXRlIGFsb25nLlxuICogQHJldHVybiBUaGUgY29uY2F0ZW5hdGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBjb25jYXQzZF8odGVuc29ycywgYXhpcykge1xuICAgIHJldHVybiBjb25jYXQodGVuc29ycywgYXhpcyk7XG59XG5leHBvcnQgY29uc3QgY29uY2F0M2QgPSBvcCh7IGNvbmNhdDNkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbmNhdF8zZC5qcy5tYXAiLCJpbXBvcnQgeyBjb25jYXQgfSBmcm9tICcuL2NvbmNhdCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29uY2F0ZW5hdGVzIGEgbGlzdCBvZiBgdGYuVGVuc29yNERgcyBhbG9uZyBhbiBheGlzLlxuICogU2VlIGBjb25jYXRgIGZvciBkZXRhaWxzLlxuICpcbiAqIEBwYXJhbSB0ZW5zb3JzIEEgbGlzdCBvZiBgdGYuVGVuc29yYHMgdG8gY29uY2F0ZW5hdGUuXG4gKiBAcGFyYW0gYXhpcyBUaGUgYXhpcyB0byBjb25jYXRlIGFsb25nLlxuICogQHJldHVybiBUaGUgY29uY2F0ZW5hdGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBjb25jYXQ0ZF8odGVuc29ycywgYXhpcykge1xuICAgIHJldHVybiBjb25jYXQodGVuc29ycywgYXhpcyk7XG59XG5leHBvcnQgY29uc3QgY29uY2F0NGQgPSBvcCh7IGNvbmNhdDRkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbmNhdF80ZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFBhcmFtc0NvbnNpc3RlbnQoc2hhcGVzLCBheGlzKSB7XG4gICAgY29uc3QgcmFuayA9IHNoYXBlc1swXS5sZW5ndGg7XG4gICAgc2hhcGVzLmZvckVhY2goKHNoYXBlLCBpKSA9PiB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHNoYXBlLmxlbmd0aCA9PT0gcmFuaywgKCkgPT4gYEVycm9yIGluIGNvbmNhdCR7cmFua31EOiByYW5rIG9mIHRlbnNvcnNbJHtpfV0gbXVzdCBiZSB0aGUgc2FtZSBgICtcbiAgICAgICAgICAgIGBhcyB0aGUgcmFuayBvZiB0aGUgcmVzdCAoJHtyYW5rfSlgKTtcbiAgICB9KTtcbiAgICB1dGlsLmFzc2VydChheGlzID49IDAgJiYgYXhpcyA8IHJhbmssICgpID0+IGBFcnJvciBpbiBjb25jYXQke3Jhbmt9RDogYXhpcyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgJHtyYW5rIC0gMX0uYCk7XG4gICAgY29uc3QgZmlyc3RTaGFwZSA9IHNoYXBlc1swXTtcbiAgICBzaGFwZXMuZm9yRWFjaCgoc2hhcGUsIGkpID0+IHtcbiAgICAgICAgZm9yIChsZXQgciA9IDA7IHIgPCByYW5rOyByKyspIHtcbiAgICAgICAgICAgIHV0aWwuYXNzZXJ0KChyID09PSBheGlzKSB8fCAoc2hhcGVbcl0gPT09IGZpcnN0U2hhcGVbcl0pLCAoKSA9PiBgRXJyb3IgaW4gY29uY2F0JHtyYW5rfUQ6IFNoYXBlIG9mIHRlbnNvcnNbJHtpfV0gKCR7c2hhcGV9KSBgICtcbiAgICAgICAgICAgICAgICBgZG9lcyBub3QgbWF0Y2ggdGhlIHNoYXBlIG9mIHRoZSByZXN0ICgke2ZpcnN0U2hhcGV9KSBgICtcbiAgICAgICAgICAgICAgICBgYWxvbmcgdGhlIG5vbi1jb25jYXRlbmF0ZWQgYXhpcyAke2l9LmApO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZU91dFNoYXBlKHNoYXBlcywgYXhpcykge1xuICAgIGNvbnN0IG91dHB1dFNoYXBlID0gc2hhcGVzWzBdLnNsaWNlKCk7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzaGFwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgb3V0cHV0U2hhcGVbYXhpc10gKz0gc2hhcGVzW2ldW2F4aXNdO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0U2hhcGU7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25jYXRfdXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IGNhc3QgfSBmcm9tICcuL2Nhc3QnO1xuaW1wb3J0IHsgbWF0TXVsIH0gZnJvbSAnLi9tYXRfbXVsJztcbmltcG9ydCB7IG9uZUhvdCB9IGZyb20gJy4vb25lX2hvdCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHRyYW5zcG9zZSB9IGZyb20gJy4vdHJhbnNwb3NlJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIGNvbmZ1c2lvbiBtYXRyaXggZnJvbSB0cnVlIGxhYmVscyBhbmQgcHJlZGljdGVkIGxhYmVscy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbGFiZWxzID0gdGYudGVuc29yMWQoWzAsIDEsIDIsIDEsIDBdLCAnaW50MzInKTtcbiAqIGNvbnN0IHByZWRpY3Rpb25zID0gdGYudGVuc29yMWQoWzAsIDIsIDIsIDEsIDBdLCAnaW50MzInKTtcbiAqIGNvbnN0IG51bUNsYXNzZXMgPSAzO1xuICogY29uc3Qgb3V0ID0gdGYubWF0aC5jb25mdXNpb25NYXRyaXgobGFiZWxzLCBwcmVkaWN0aW9ucywgbnVtQ2xhc3Nlcyk7XG4gKiBvdXQucHJpbnQoKTtcbiAqIC8vIEV4cGVjdGVkIG91dHB1dCBtYXRyaXg6XG4gKiAvLyBbWzIsIDAsIDBdLFxuICogLy8gIFswLCAxLCAxXSxcbiAqIC8vICBbMCwgMCwgMV1dXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gbGFiZWxzIFRoZSB0YXJnZXQgbGFiZWxzLCBhc3N1bWVkIHRvIGJlIDAtYmFzZWQgaW50ZWdlcnNcbiAqICAgZm9yIHRoZSBjbGFzc2VzLiBUaGUgc2hhcGUgaXMgYFtudW1FeGFtcGxlc11gLCB3aGVyZVxuICogICBgbnVtRXhhbXBsZXNgIGlzIHRoZSBudW1iZXIgb2YgZXhhbXBsZXMgaW5jbHVkZWQuXG4gKiBAcGFyYW0gcHJlZGljdGlvbnMgVGhlIHByZWRpY3RlZCBjbGFzc2VzLCBhc3N1bWVkIHRvIGJlXG4gKiAgIDAtYmFzZWQgaW50ZWdlcnMgZm9yIHRoZSBjbGFzc2VzLiBNdXN0IGhhdmUgdGhlIHNhbWUgc2hhcGUgYXMgYGxhYmVsc2AuXG4gKiBAcGFyYW0gbnVtQ2xhc3NlcyBOdW1iZXIgb2YgYWxsIGNsYXNzZXMsIGFzIGFuIGludGVnZXIuXG4gKiAgIEl0cyB2YWx1ZSBtdXN0IGJlIGxhcmdlciB0aGFuIHRoZSBsYXJnZXN0IGVsZW1lbnQgaW4gYGxhYmVsc2AgYW5kXG4gKiAgIGBwcmVkaWN0aW9uc2AuXG4gKiBAcmV0dXJucyBUaGUgY29uZnVzaW9uIG1hdHJpeCBhcyBhIGludDMyLXR5cGUgMkQgdGVuc29yLiBUaGUgdmFsdWUgYXRcbiAqICAgcm93IGByYCBhbmQgY29sdW1uIGBjYCBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIGV4YW1wbGVzIG9mIGFjdHVhbCBjbGFzc1xuICogICBgcmAgd2VyZSBwcmVkaWN0ZWQgYXMgY2xhc3MgYGNgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0V2YWx1YXRpb24nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uZnVzaW9uTWF0cml4XyhsYWJlbHMsIHByZWRpY3Rpb25zLCBudW1DbGFzc2VzKSB7XG4gICAgY29uc3QgJGxhYmVscyA9IGNvbnZlcnRUb1RlbnNvcihsYWJlbHMsICdsYWJlbHMnLCAnY29uZnVzaW9uTWF0cml4Jyk7XG4gICAgY29uc3QgJHByZWRpY3Rpb25zID0gY29udmVydFRvVGVuc29yKHByZWRpY3Rpb25zLCAncHJlZGljdGlvbnMnLCAnY29uZnVzaW9uTWF0cml4Jyk7XG4gICAgdXRpbC5hc3NlcnQobnVtQ2xhc3NlcyA9PSBudWxsIHx8IG51bUNsYXNzZXMgPiAwICYmIE51bWJlci5pc0ludGVnZXIobnVtQ2xhc3NlcyksICgpID0+IGBJZiBwcm92aWRlZCwgbnVtQ2xhc3NlcyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciwgYCArXG4gICAgICAgIGBidXQgZ290ICR7bnVtQ2xhc3Nlc31gKTtcbiAgICB1dGlsLmFzc2VydCgkbGFiZWxzLnJhbmsgPT09IDEsICgpID0+IGBFeHBlY3RlZCB0aGUgcmFuayBvZiBsYWJlbHMgdG8gYmUgMSwgYnV0IGdvdCAkeyRsYWJlbHMucmFua31gKTtcbiAgICB1dGlsLmFzc2VydCgkcHJlZGljdGlvbnMucmFuayA9PT0gMSwgKCkgPT4gYEV4cGVjdGVkIHRoZSByYW5rIG9mIHByZWRpY3Rpb25zIHRvIGJlIDEsIGAgK1xuICAgICAgICBgYnV0IGdvdCAkeyRwcmVkaWN0aW9ucy5yYW5rfWApO1xuICAgIHV0aWwuYXNzZXJ0KCRsYWJlbHMuc2hhcGVbMF0gPT09ICRwcmVkaWN0aW9ucy5zaGFwZVswXSwgKCkgPT4gYE1pc21hdGNoIGluIHRoZSBudW1iZXIgb2YgZXhhbXBsZXM6IGAgK1xuICAgICAgICBgJHskbGFiZWxzLnNoYXBlWzBdfSB2cy4gJHskcHJlZGljdGlvbnMuc2hhcGVbMF19LiBgICtcbiAgICAgICAgYExhYmVscyBhbmQgcHJlZGljdGlvbnMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGVsZW1lbnRzLmApO1xuICAgIHV0aWwuYXNzZXJ0KG51bUNsYXNzZXMgPiAwICYmIE51bWJlci5pc0ludGVnZXIobnVtQ2xhc3NlcyksICgpID0+IGBudW1DbGFzc2VzIGlzIHJlcXVpcmVkIHRvIGJlIGEgcG9zaXRpdmUgaW50ZWdlciwgYnV0IGdvdCBgICtcbiAgICAgICAgYCR7bnVtQ2xhc3Nlc31gKTtcbiAgICAvLyBUT0RPKGNhaXMpOiBJbiB0aGUgZnV0dXJlLCBpZiBvbmVIb3Qgc3VwcG9ydHMgdGVuc29ycyBpbnB1dHMgZm9yXG4gICAgLy8gICBgbnVtQ2xhc3Nlc2AsIGBjb25mdXNpb25NYXRyaXhgIGNhbiBtYWtlIGBudW1DbGFzc2VzYCBvcHRpb25hbC5cbiAgICBjb25zdCBvbmVIb3RMYWJlbHMgPSBvbmVIb3QoY2FzdCgkbGFiZWxzLCAnaW50MzInKSwgbnVtQ2xhc3Nlcyk7XG4gICAgY29uc3Qgb25lSG90UHJlZGljdGlvbnMgPSBvbmVIb3QoY2FzdCgkcHJlZGljdGlvbnMsICdpbnQzMicpLCBudW1DbGFzc2VzKTtcbiAgICBjb25zdCBvbmVIb3RMYWJlbHNUID0gdHJhbnNwb3NlKG9uZUhvdExhYmVscyk7XG4gICAgY29uc3QgcHJvZHVjdCA9IG1hdE11bChvbmVIb3RMYWJlbHNULCBvbmVIb3RQcmVkaWN0aW9ucyk7XG4gICAgcmV0dXJuIGNhc3QocHJvZHVjdCwgJ2ludDMyJyk7XG59XG5leHBvcnQgY29uc3QgY29uZnVzaW9uTWF0cml4ID0gb3AoeyBjb25mdXNpb25NYXRyaXhfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uZnVzaW9uX21hdHJpeC5qcy5tYXAiLCJpbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IGNvbnYyZCB9IGZyb20gJy4vY29udjJkJztcbmltcG9ydCAqIGFzIGNvbnZfdXRpbCBmcm9tICcuL2NvbnZfdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL3Jlc2hhcGUnO1xuLyoqXG4gKiBDb21wdXRlcyBhIDFEIGNvbnZvbHV0aW9uIG92ZXIgdGhlIGlucHV0IHguXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciwgb2YgcmFuayAzIG9yIHJhbmsgMiwgb2Ygc2hhcGVcbiAqICAgICBgW2JhdGNoLCB3aWR0aCwgaW5DaGFubmVsc11gLiBJZiByYW5rIDIsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciwgcmFuayAzLCBvZiBzaGFwZVxuICogICAgIGBbZmlsdGVyV2lkdGgsIGluRGVwdGgsIG91dERlcHRoXWAuXG4gKiBAcGFyYW0gc3RyaWRlIFRoZSBudW1iZXIgb2YgZW50cmllcyBieSB3aGljaCB0aGUgZmlsdGVyIGlzIG1vdmVkIHJpZ2h0IGF0XG4gKiAgICAgZWFjaCBzdGVwLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobS5cbiAqICAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAtIEZvciBtb3JlIGluZm8sIHNlZSB0aGlzIGd1aWRlOlxuICogICAgIFtodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb25dKFxuICogICAgICAgICAgaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uKVxuICogQHBhcmFtIGRhdGFGb3JtYXQgQW4gb3B0aW9uYWwgc3RyaW5nIGZyb20gXCJOV0NcIiwgXCJOQ1dcIi4gRGVmYXVsdHMgdG8gXCJOV0NcIixcbiAqICAgICB0aGUgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIG9yZGVyIG9mIFtiYXRjaCwgaW5fd2lkdGgsIGluX2NoYW5uZWxzXS4gT25seVxuICogICAgIFwiTldDXCIgaXMgY3VycmVudGx5IHN1cHBvcnRlZC5cbiAqIEBwYXJhbSBkaWxhdGlvbiBUaGUgZGlsYXRpb24gcmF0ZSBpbiB3aGljaCB3ZSBzYW1wbGUgaW5wdXQgdmFsdWVzIGluXG4gKiAgICAgYXRyb3VzIGNvbnZvbHV0aW9uLiBEZWZhdWx0cyB0byBgMWAuIElmIGl0IGlzIGdyZWF0ZXIgdGhhbiAxLCB0aGVuXG4gKiAgICAgc3RyaWRlIG11c3QgYmUgYDFgLlxuICogQHBhcmFtIGRpbVJvdW5kaW5nTW9kZSBBIHN0cmluZyBmcm9tOiAnY2VpbCcsICdyb3VuZCcsICdmbG9vcicuIElmIG5vbmUgaXNcbiAqICAgICBwcm92aWRlZCwgaXQgd2lsbCBkZWZhdWx0IHRvIHRydW5jYXRlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0NvbnZvbHV0aW9uJ31cbiAqL1xuZnVuY3Rpb24gY29udjFkXyh4LCBmaWx0ZXIsIHN0cmlkZSwgcGFkLCBkYXRhRm9ybWF0ID0gJ05XQycsIGRpbGF0aW9uID0gMSwgZGltUm91bmRpbmdNb2RlKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnY29udjFkJyk7XG4gICAgY29uc3QgJGZpbHRlciA9IGNvbnZlcnRUb1RlbnNvcihmaWx0ZXIsICdmaWx0ZXInLCAnY29udjFkJyk7XG4gICAgbGV0IHgzRCA9ICR4O1xuICAgIGxldCByZXNoYXBlZFRvM0QgPSBmYWxzZTtcbiAgICBpZiAoJHgucmFuayA9PT0gMikge1xuICAgICAgICByZXNoYXBlZFRvM0QgPSB0cnVlO1xuICAgICAgICB4M0QgPSByZXNoYXBlKCR4LCBbMSwgJHguc2hhcGVbMF0sICR4LnNoYXBlWzFdXSk7XG4gICAgfVxuICAgIHV0aWwuYXNzZXJ0KHgzRC5yYW5rID09PSAzLCAoKSA9PiBgRXJyb3IgaW4gY29udjFkOiBpbnB1dCBtdXN0IGJlIHJhbmsgMywgYnV0IGdvdCByYW5rICR7eDNELnJhbmt9LmApO1xuICAgIHV0aWwuYXNzZXJ0KCRmaWx0ZXIucmFuayA9PT0gMywgKCkgPT4gYEVycm9yIGluIGNvbnYxZDogZmlsdGVyIG11c3QgYmUgcmFuayAzLCBidXQgZ290IHJhbmsgYCArXG4gICAgICAgIGAkeyRmaWx0ZXIucmFua30uYCk7XG4gICAgaWYgKGRpbVJvdW5kaW5nTW9kZSAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNJbnQocGFkKSwgKCkgPT4gYEVycm9yIGluIGNvbnYxZDogcGFkIG11c3QgYmUgYW4gaW50ZWdlciB3aGVuIHVzaW5nLCBgICtcbiAgICAgICAgICAgIGBkaW1Sb3VuZGluZ01vZGUgJHtkaW1Sb3VuZGluZ01vZGV9IGJ1dCBnb3QgcGFkICR7cGFkfS5gKTtcbiAgICB9XG4gICAgdXRpbC5hc3NlcnQoeDNELnNoYXBlWzJdID09PSAkZmlsdGVyLnNoYXBlWzFdLCAoKSA9PiBgRXJyb3IgaW4gY29udjFkOiBkZXB0aCBvZiBpbnB1dCAoJHt4M0Quc2hhcGVbMl19KSBtdXN0IG1hdGNoIGAgK1xuICAgICAgICBgaW5wdXQgZGVwdGggZm9yIGZpbHRlciAkeyRmaWx0ZXIuc2hhcGVbMV19LmApO1xuICAgIHV0aWwuYXNzZXJ0KGNvbnZfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlLCBkaWxhdGlvbiksICgpID0+ICdFcnJvciBpbiBjb252MUQ6IEVpdGhlciBzdHJpZGUgb3IgZGlsYXRpb24gbXVzdCBiZSAxLiAnICtcbiAgICAgICAgYEdvdCBzdHJpZGUgJHtzdHJpZGV9IGFuZCBkaWxhdGlvbiAnJHtkaWxhdGlvbn0nYCk7XG4gICAgdXRpbC5hc3NlcnQoZGF0YUZvcm1hdCA9PT0gJ05XQycsICgpID0+IGBFcnJvciBpbiBjb252MWQ6IGdvdCBkYXRhRm9ybWF0IG9mICR7ZGF0YUZvcm1hdH0gYnV0IG9ubHkgTldDIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQuYCk7XG4gICAgY29uc3QgZmlsdGVyNEQgPSByZXNoYXBlKCRmaWx0ZXIsIFsxLCAkZmlsdGVyLnNoYXBlWzBdLCAkZmlsdGVyLnNoYXBlWzFdLCAkZmlsdGVyLnNoYXBlWzJdXSk7XG4gICAgY29uc3QgaW5wdXQ0RCA9IHJlc2hhcGUoeDNELCBbeDNELnNoYXBlWzBdLCAxLCB4M0Quc2hhcGVbMV0sIHgzRC5zaGFwZVsyXV0pO1xuICAgIGNvbnN0IHN0cmlkZXMgPSBbMSwgc3RyaWRlXTtcbiAgICBjb25zdCBkaWxhdGlvbnMgPSBbMSwgZGlsYXRpb25dO1xuICAgIGNvbnN0IGNvbnYyZERhdGFGb3JtYXQgPSAnTkhXQyc7XG4gICAgY29uc3QgcmVzID0gY29udjJkKGlucHV0NEQsIGZpbHRlcjRELCBzdHJpZGVzLCBwYWQsIGNvbnYyZERhdGFGb3JtYXQsIGRpbGF0aW9ucywgZGltUm91bmRpbmdNb2RlKTtcbiAgICBpZiAocmVzaGFwZWRUbzNEKSB7XG4gICAgICAgIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdXSk7XG4gICAgfVxuICAgIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVswXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKTtcbn1cbmV4cG9ydCBjb25zdCBjb252MWQgPSBvcCh7IGNvbnYxZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb252MWQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IENvbnYyRCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCAqIGFzIGNvbnZfdXRpbCBmcm9tICcuL2NvbnZfdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL3Jlc2hhcGUnO1xuLyoqXG4gKiBDb21wdXRlcyBhIDJEIGNvbnZvbHV0aW9uIG92ZXIgdGhlIGlucHV0IHguXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciwgb2YgcmFuayA0IG9yIHJhbmsgMywgb2Ygc2hhcGVcbiAqICAgICBgW2JhdGNoLCBoZWlnaHQsIHdpZHRoLCBpbkNoYW5uZWxzXWAuIElmIHJhbmsgMywgYmF0Y2ggb2YgMSBpc1xuICogYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciwgcmFuayA0LCBvZiBzaGFwZVxuICogICAgIGBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5EZXB0aCwgb3V0RGVwdGhdYC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBjb252b2x1dGlvbjogYFtzdHJpZGVIZWlnaHQsXG4gKiBzdHJpZGVXaWR0aF1gLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobS5cbiAqICAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAtIEZvciBtb3JlIGluZm8sIHNlZSB0aGlzIGd1aWRlOlxuICogICAgIFtodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb25dKFxuICogICAgICAgICAgaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uKVxuICogQHBhcmFtIGRhdGFGb3JtYXQ6IEFuIG9wdGlvbmFsIHN0cmluZyBmcm9tOiBcIk5IV0NcIiwgXCJOQ0hXXCIuIERlZmF1bHRzIHRvXG4gKiAgICAgXCJOSFdDXCIuIFNwZWNpZnkgdGhlIGRhdGEgZm9ybWF0IG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEuIFdpdGggdGhlXG4gKiAgICAgZGVmYXVsdCBmb3JtYXQgXCJOSFdDXCIsIHRoZSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgb3JkZXIgb2Y6IFtiYXRjaCxcbiAqICAgICBoZWlnaHQsIHdpZHRoLCBjaGFubmVsc10uXG4gKiBAcGFyYW0gZGlsYXRpb25zIFRoZSBkaWxhdGlvbiByYXRlczogYFtkaWxhdGlvbkhlaWdodCwgZGlsYXRpb25XaWR0aF1gXG4gKiAgICAgaW4gd2hpY2ggd2Ugc2FtcGxlIGlucHV0IHZhbHVlcyBhY3Jvc3MgdGhlIGhlaWdodCBhbmQgd2lkdGggZGltZW5zaW9uc1xuICogICAgIGluIGF0cm91cyBjb252b2x1dGlvbi4gRGVmYXVsdHMgdG8gYFsxLCAxXWAuIElmIGBkaWxhdGlvbnNgIGlzIGEgc2luZ2xlXG4gKiAgICAgbnVtYmVyLCB0aGVuIGBkaWxhdGlvbkhlaWdodCA9PSBkaWxhdGlvbldpZHRoYC4gSWYgaXQgaXMgZ3JlYXRlciB0aGFuXG4gKiAgICAgMSwgdGhlbiBhbGwgdmFsdWVzIG9mIGBzdHJpZGVzYCBtdXN0IGJlIDEuXG4gKiBAcGFyYW0gZGltUm91bmRpbmdNb2RlIEEgc3RyaW5nIGZyb206ICdjZWlsJywgJ3JvdW5kJywgJ2Zsb29yJy4gSWYgbm9uZSBpc1xuICogICAgIHByb3ZpZGVkLCBpdCB3aWxsIGRlZmF1bHQgdG8gdHJ1bmNhdGUuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQ29udm9sdXRpb24nfVxuICovXG5mdW5jdGlvbiBjb252MmRfKHgsIGZpbHRlciwgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0ID0gJ05IV0MnLCBkaWxhdGlvbnMgPSBbMSwgMV0sIGRpbVJvdW5kaW5nTW9kZSkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2NvbnYyZCcpO1xuICAgIGNvbnN0ICRmaWx0ZXIgPSBjb252ZXJ0VG9UZW5zb3IoZmlsdGVyLCAnZmlsdGVyJywgJ2NvbnYyZCcpO1xuICAgIGxldCB4NEQgPSAkeDtcbiAgICBsZXQgcmVzaGFwZWRUbzREID0gZmFsc2U7XG4gICAgaWYgKCR4LnJhbmsgPT09IDMpIHtcbiAgICAgICAgcmVzaGFwZWRUbzREID0gdHJ1ZTtcbiAgICAgICAgeDREID0gcmVzaGFwZSgkeCwgWzEsICR4LnNoYXBlWzBdLCAkeC5zaGFwZVsxXSwgJHguc2hhcGVbMl1dKTtcbiAgICB9XG4gICAgdXRpbC5hc3NlcnQoeDRELnJhbmsgPT09IDQsICgpID0+IGBFcnJvciBpbiBjb252MmQ6IGlucHV0IG11c3QgYmUgcmFuayA0LCBidXQgZ290IHJhbmsgJHt4NEQucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoJGZpbHRlci5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gY29udjJkOiBmaWx0ZXIgbXVzdCBiZSByYW5rIDQsIGJ1dCBnb3QgcmFuayBgICtcbiAgICAgICAgYCR7JGZpbHRlci5yYW5rfS5gKTtcbiAgICBpZiAoZGltUm91bmRpbmdNb2RlICE9IG51bGwpIHtcbiAgICAgICAgdXRpbC5hc3NlcnQodXRpbC5pc0ludChwYWQpLCAoKSA9PiBgRXJyb3IgaW4gY29udjJkOiBwYWQgbXVzdCBiZSBhbiBpbnRlZ2VyIHdoZW4gdXNpbmcsIGAgK1xuICAgICAgICAgICAgYGRpbVJvdW5kaW5nTW9kZSAke2RpbVJvdW5kaW5nTW9kZX0gYnV0IGdvdCBwYWQgJHtwYWR9LmApO1xuICAgIH1cbiAgICBjb25zdCBpbkRlcHRoID0gZGF0YUZvcm1hdCA9PT0gJ05IV0MnID8geDRELnNoYXBlWzNdIDogeDRELnNoYXBlWzFdO1xuICAgIHV0aWwuYXNzZXJ0KGluRGVwdGggPT09ICRmaWx0ZXIuc2hhcGVbMl0sICgpID0+IGBFcnJvciBpbiBjb252MmQ6IGRlcHRoIG9mIGlucHV0ICgke2luRGVwdGh9KSBtdXN0IG1hdGNoIGAgK1xuICAgICAgICBgaW5wdXQgZGVwdGggZm9yIGZpbHRlciAkeyRmaWx0ZXIuc2hhcGVbMl19LmApO1xuICAgIHV0aWwuYXNzZXJ0KGNvbnZfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgZGlsYXRpb25zKSwgKCkgPT4gJ0Vycm9yIGluIGNvbnYyRDogRWl0aGVyIHN0cmlkZXMgb3IgZGlsYXRpb25zIG11c3QgYmUgMS4gJyArXG4gICAgICAgIGBHb3Qgc3RyaWRlcyAke3N0cmlkZXN9IGFuZCBkaWxhdGlvbnMgJyR7ZGlsYXRpb25zfSdgKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6IHg0RCwgZmlsdGVyOiAkZmlsdGVyIH07XG4gICAgY29uc3QgYXR0cnMgPSB7IHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGlsYXRpb25zLCBkaW1Sb3VuZGluZ01vZGUgfTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgY29uc3QgcmVzID0gRU5HSU5FLnJ1bktlcm5lbChDb252MkQsIGlucHV0cywgYXR0cnMpO1xuICAgIGlmIChyZXNoYXBlZFRvNEQpIHtcbiAgICAgICAgcmV0dXJuIHJlc2hhcGUocmVzLCBbcmVzLnNoYXBlWzFdLCByZXMuc2hhcGVbMl0sIHJlcy5zaGFwZVszXV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IGNvbnYyZCA9IG9wKHsgY29udjJkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnYyZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgQ29udjJEQmFja3Byb3BGaWx0ZXIgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vcmVzaGFwZSc7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBkZXJpdmF0aXZlIG9mIHRoZSBmaWx0ZXIgb2YgYSAyRCBjb252b2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDQgb3IgcmFuayAzIG9mIHNoYXBlXG4gKiAgICAgW2JhdGNoLCBoZWlnaHQsIHdpZHRoLCBpbkNoYW5uZWxzXS4gSWYgcmFuayAzLCBiYXRjaCBvZiAxIGlzIGFzc3VtZWQuXG4gKiBAcGFyYW0gZHkgVGhlIGR5IGltYWdlLCBvZiByYW5rIDQgb3IgcmFuayAzLCBvZiBzaGFwZVxuICogICAgIFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgb3V0RGVwdGhdLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXJTaGFwZSBUaGUgc2hhcGUgb2YgdGhlIGZpbHRlciwgbGVuZ3RoIDQsXG4gKiAgICAgW2ZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGluRGVwdGgsIG91dERlcHRoXS5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBjb252b2x1dGlvbjogW3N0cmlkZUhlaWdodCxcbiAqIHN0cmlkZVdpZHRoXS5cbiAqIEBwYXJhbSBwYWQgQSBzdHJpbmcgZnJvbTogJ3NhbWUnLCAndmFsaWQnLiBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobVxuICogICAgIHVzZWQgaW4gdGhlIGZvcndhcmQgcHJvcCBvZiB0aGUgb3AuXG4gKiBAcGFyYW0gZGF0YUZvcm1hdDogQW4gb3B0aW9uYWwgc3RyaW5nIGZyb206IFwiTkhXQ1wiLCBcIk5DSFdcIi4gRGVmYXVsdHMgdG9cbiAqICAgICBcIk5IV0NcIi4gU3BlY2lmeSB0aGUgZGF0YSBmb3JtYXQgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YS4gV2l0aCB0aGVcbiAqICAgICBkZWZhdWx0IGZvcm1hdCBcIk5IV0NcIiwgdGhlIGRhdGEgaXMgc3RvcmVkIGluIHRoZSBvcmRlciBvZjogW2JhdGNoLFxuICogICAgIGhlaWdodCwgd2lkdGgsIGNoYW5uZWxzXS5cbiAqIEBwYXJhbSBkaW1Sb3VuZGluZ01vZGUgQSBzdHJpbmcgZnJvbTogJ2NlaWwnLCAncm91bmQnLCAnZmxvb3InLiBJZiBub25lIGlzXG4gKiAgICAgcHJvdmlkZWQsIGl0IHdpbGwgZGVmYXVsdCB0byB0cnVuY2F0ZS5cbiAqL1xuZnVuY3Rpb24gY29udjJEQmFja3Byb3BGaWx0ZXJfKHgsIGR5LCBmaWx0ZXJTaGFwZSwgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0ID0gJ05IV0MnLCBkaW1Sb3VuZGluZ01vZGUpIHtcbiAgICBsZXQgeDREID0geDtcbiAgICBpZiAoeC5yYW5rID09PSAzKSB7XG4gICAgICAgIHg0RCA9IHJlc2hhcGUoeCwgWzEsIHguc2hhcGVbMF0sIHguc2hhcGVbMV0sIHguc2hhcGVbMl1dKTtcbiAgICB9XG4gICAgbGV0IGR5NEQgPSBkeTtcbiAgICBpZiAoZHk0RC5yYW5rID09PSAzKSB7XG4gICAgICAgIGR5NEQgPSByZXNoYXBlKGR5LCBbMSwgZHkuc2hhcGVbMF0sIGR5LnNoYXBlWzFdLCBkeS5zaGFwZVsyXV0pO1xuICAgIH1cbiAgICB1dGlsLmFzc2VydCh4NEQucmFuayA9PT0gNCwgKCkgPT4gYEVycm9yIGluIGNvbnYyZERlckZpbHRlcjogaW5wdXQgbXVzdCBiZSByYW5rIDQsIGJ1dCBnb3Qgc2hhcGUgYCArXG4gICAgICAgIGAke3g0RC5zaGFwZX0uYCk7XG4gICAgdXRpbC5hc3NlcnQoZHk0RC5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gY29udjJkRGVyRmlsdGVyOiBkeSBtdXN0IGJlIHJhbmsgNCwgYnV0IGdvdCBzaGFwZSBgICtcbiAgICAgICAgYCR7ZHk0RC5zaGFwZX0uYCk7XG4gICAgdXRpbC5hc3NlcnQoZmlsdGVyU2hhcGUubGVuZ3RoID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gY29udjJkRGVyRmlsdGVyOiBmaWx0ZXJTaGFwZSBtdXN0IGJlIGxlbmd0aCA0LCBidXQgZ290IGAgK1xuICAgICAgICBgJHtmaWx0ZXJTaGFwZX0uYCk7XG4gICAgY29uc3QgaW5EZXB0aCA9IGRhdGFGb3JtYXQgPT09ICdOSFdDJyA/IHg0RC5zaGFwZVszXSA6IHg0RC5zaGFwZVsxXTtcbiAgICBjb25zdCBvdXREZXB0aCA9IGRhdGFGb3JtYXQgPT09ICdOSFdDJyA/IGR5NEQuc2hhcGVbM10gOiBkeTRELnNoYXBlWzFdO1xuICAgIHV0aWwuYXNzZXJ0KGluRGVwdGggPT09IGZpbHRlclNoYXBlWzJdLCAoKSA9PiBgRXJyb3IgaW4gY29udjJkRGVyRmlsdGVyOiBkZXB0aCBvZiBpbnB1dCAke2luRGVwdGh9KSBtdXN0IGAgK1xuICAgICAgICBgbWF0Y2ggaW5wdXQgZGVwdGggaW4gZmlsdGVyICgke2ZpbHRlclNoYXBlWzJdfS5gKTtcbiAgICB1dGlsLmFzc2VydChvdXREZXB0aCA9PT0gZmlsdGVyU2hhcGVbM10sICgpID0+IGBFcnJvciBpbiBjb252MmREZXJGaWx0ZXI6IGRlcHRoIG9mIGR5ICgke291dERlcHRofSkgbXVzdCBgICtcbiAgICAgICAgYG1hdGNoIG91dHB1dCBkZXB0aCBmb3IgZmlsdGVyICgke2ZpbHRlclNoYXBlWzNdfSkuYCk7XG4gICAgaWYgKGRpbVJvdW5kaW5nTW9kZSAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNJbnQocGFkKSwgKCkgPT4gYEVycm9yIGluIGNvbnYyZERlckZpbHRlcjogcGFkIG11c3QgYmUgYW4gaW50ZWdlciB3aGVuIHVzaW5nLCBgICtcbiAgICAgICAgICAgIGBkaW1Sb3VuZGluZ01vZGUgJHtkaW1Sb3VuZGluZ01vZGV9IGJ1dCBnb3QgcGFkICR7cGFkfS5gKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiB4NEQsIGR5OiBkeTREIH07XG4gICAgY29uc3QgYXR0cnMgPSB7IHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGltUm91bmRpbmdNb2RlLCBmaWx0ZXJTaGFwZSB9O1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChDb252MkRCYWNrcHJvcEZpbHRlciwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgY29udjJEQmFja3Byb3BGaWx0ZXIgPSBvcCh7IGNvbnYyREJhY2twcm9wRmlsdGVyXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnYyZF9iYWNrcHJvcF9maWx0ZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IENvbnYyREJhY2twcm9wSW5wdXQgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vcmVzaGFwZSc7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBkZXJpdmF0aXZlIG9mIHRoZSBpbnB1dCBvZiBhIDJEIGNvbnZvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB4U2hhcGUgVGhlIHNoYXBlIG9mIHRoZSBpbnB1dDogW2JhdGNoLCBoZWlnaHQsIHdpZHRoLCBpbkRlcHRoXS5cbiAqIElmIGxlbmd0aCBvZiAzLCBiYXRjaCBvZiAxIGlzIGFzc3VtZWQuXG4gKiBAcGFyYW0gZHkgVGhlIGRlcml2YXRpdmUgb2YgdGhlIG91dHB1dCwgb2YgcmFuayA0IG9yIHJhbmsgMyBvZiBzaGFwZVxuICogICBgW2JhdGNoLCBvdXRIZWlnaHQsIG91dFdpZHRoLCBvdXREZXB0aF1gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXNcbiAqIGFzc3VtZWQuXG4gKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIsIHJhbmsgNCwgb2Ygc2hhcGVcbiAqICAgICBgW2ZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGluRGVwdGgsIG91dERlcHRoXWAuXG4gKiBAcGFyYW0gc3RyaWRlcyBUaGUgc3RyaWRlcyBvZiB0aGUgY29udm9sdXRpb246IGBbc3RyaWRlSGVpZ2h0LFxuICogc3RyaWRlV2lkdGhdYC5cbiAqIEBwYXJhbSBwYWQgVGhlIHR5cGUgb2YgcGFkZGluZyBhbGdvcml0aG0gdXNlZDpcbiAqICAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogQHBhcmFtIGRhdGFGb3JtYXQ6IEFuIG9wdGlvbmFsIHN0cmluZyBmcm9tOiBcIk5IV0NcIiwgXCJOQ0hXXCIuIERlZmF1bHRzIHRvXG4gKiAgICAgXCJOSFdDXCIuIFNwZWNpZnkgdGhlIGRhdGEgZm9ybWF0IG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEuIFdpdGggdGhlXG4gKiAgICAgZGVmYXVsdCBmb3JtYXQgXCJOSFdDXCIsIHRoZSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgb3JkZXIgb2Y6IFtiYXRjaCxcbiAqICAgICBoZWlnaHQsIHdpZHRoLCBjaGFubmVsc10uXG4gKiBAcGFyYW0gZGltUm91bmRpbmdNb2RlIEEgc3RyaW5nIGZyb206ICdjZWlsJywgJ3JvdW5kJywgJ2Zsb29yJy4gSWYgbm9uZSBpc1xuICogICAgIHByb3ZpZGVkLCBpdCB3aWxsIGRlZmF1bHQgdG8gdHJ1bmNhdGUuXG4gKi9cbmZ1bmN0aW9uIGNvbnYyREJhY2twcm9wSW5wdXRfKHhTaGFwZSwgZHksIGZpbHRlciwgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0ID0gJ05IV0MnLCBkaW1Sb3VuZGluZ01vZGUpIHtcbiAgICB1dGlsLmFzc2VydCh4U2hhcGUubGVuZ3RoID09PSBkeS5yYW5rLCAoKSA9PiBgTGVuZ3RoIG9mIGluU2hhcGUgYCArXG4gICAgICAgIGAoJHt4U2hhcGUubGVuZ3RofSkgYW5kIHJhbmsgb2YgZHkgKCR7ZHkucmFua30pIG11c3QgbWF0Y2hgKTtcbiAgICBsZXQgeFNoYXBlNEQgPSB4U2hhcGU7XG4gICAgbGV0IGR5NEQgPSBkeTtcbiAgICBsZXQgcmVzaGFwZWRUbzREID0gZmFsc2U7XG4gICAgaWYgKGR5LnJhbmsgPT09IDMpIHtcbiAgICAgICAgcmVzaGFwZWRUbzREID0gdHJ1ZTtcbiAgICAgICAgZHk0RCA9IHJlc2hhcGUoZHksIFsxLCBkeS5zaGFwZVswXSwgZHkuc2hhcGVbMV0sIGR5LnNoYXBlWzJdXSk7XG4gICAgICAgIHhTaGFwZTREID0gWzEsIHhTaGFwZVswXSwgeFNoYXBlWzFdLCB4U2hhcGVbMl1dO1xuICAgIH1cbiAgICB1dGlsLmFzc2VydCh4U2hhcGU0RC5sZW5ndGggPT09IDQsICgpID0+IGBFcnJvciBpbiBjb252MmREZXJJbnB1dDogaW5TaGFwZSBtdXN0IGJlIGxlbmd0aCA0LCBidXQgZ290IGxlbmd0aCBgICtcbiAgICAgICAgYCR7eFNoYXBlNEQubGVuZ3RofS5gKTtcbiAgICB1dGlsLmFzc2VydChkeTRELnJhbmsgPT09IDQsICgpID0+IGBFcnJvciBpbiBjb252MmREZXJJbnB1dDogZHkgbXVzdCBiZSByYW5rIDQsIGJ1dCBnb3QgYCArXG4gICAgICAgIGByYW5rICR7ZHk0RC5yYW5rfWApO1xuICAgIHV0aWwuYXNzZXJ0KGZpbHRlci5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gY29udjJkRGVySW5wdXQ6IGZpbHRlciBtdXN0IGJlIHJhbmsgNCwgYnV0IGdvdCBgICtcbiAgICAgICAgYHJhbmsgJHtmaWx0ZXIucmFua31gKTtcbiAgICBjb25zdCBpbkRlcHRoID0gZGF0YUZvcm1hdCA9PT0gJ05IV0MnID8geFNoYXBlNERbM10gOiB4U2hhcGU0RFsxXTtcbiAgICBjb25zdCBvdXREZXB0aCA9IGRhdGFGb3JtYXQgPT09ICdOSFdDJyA/IGR5NEQuc2hhcGVbM10gOiBkeTRELnNoYXBlWzFdO1xuICAgIHV0aWwuYXNzZXJ0KGluRGVwdGggPT09IGZpbHRlci5zaGFwZVsyXSwgKCkgPT4gYEVycm9yIGluIGNvbnYyZERlcklucHV0OiBkZXB0aCBvZiBpbnB1dCAoJHtpbkRlcHRofSkgbXVzdCBgICtcbiAgICAgICAgYG1hdGNoIGlucHV0IGRlcHRoIGZvciBmaWx0ZXIgJHtmaWx0ZXIuc2hhcGVbMl19LmApO1xuICAgIHV0aWwuYXNzZXJ0KG91dERlcHRoID09PSBmaWx0ZXIuc2hhcGVbM10sICgpID0+IGBFcnJvciBpbiBjb252MmREZXJJbnB1dDogZGVwdGggb2Ygb3V0cHV0ICgke291dERlcHRofSkgbXVzdCBgICtcbiAgICAgICAgYG1hdGNoIG91dHB1dCBkZXB0aCBmb3IgZmlsdGVyICR7ZmlsdGVyLnNoYXBlWzNdfS5gKTtcbiAgICBpZiAoZGltUm91bmRpbmdNb2RlICE9IG51bGwpIHtcbiAgICAgICAgdXRpbC5hc3NlcnQodXRpbC5pc0ludChwYWQpLCAoKSA9PiBgRXJyb3IgaW4gY29udjJkRGVySW5wdXQ6IHBhZCBtdXN0IGJlIGFuIGludGVnZXIgd2hlbiB1c2luZywgYCArXG4gICAgICAgICAgICBgZGltUm91bmRpbmdNb2RlICR7ZGltUm91bmRpbmdNb2RlfSBidXQgZ290IHBhZCAke3BhZH0uYCk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0cyA9IHsgZHk6IGR5NEQsIGZpbHRlciB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQsIGRpbVJvdW5kaW5nTW9kZSwgaW5wdXRTaGFwZTogeFNoYXBlNEQgfTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgY29uc3QgcmVzID0gRU5HSU5FLnJ1bktlcm5lbChDb252MkRCYWNrcHJvcElucHV0LCBpbnB1dHMsIGF0dHJzKTtcbiAgICBpZiAocmVzaGFwZWRUbzREKSB7XG4gICAgICAgIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydCBjb25zdCBjb252MkRCYWNrcHJvcElucHV0ID0gb3AoeyBjb252MkRCYWNrcHJvcElucHV0XyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnYyZF9iYWNrcHJvcF9pbnB1dC5qcy5tYXAiLCJpbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgY29udjJEQmFja3Byb3BJbnB1dCB9IGZyb20gJy4vY29udjJkX2JhY2twcm9wX2lucHV0JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgdHJhbnNwb3NlZCAyRCBjb252b2x1dGlvbiBvZiBhbiBpbWFnZSwgYWxzbyBrbm93biBhcyBhXG4gKiBkZWNvbnZvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBpbWFnZSwgb2YgcmFuayA0IG9yIHJhbmsgMywgb2Ygc2hhcGVcbiAqICAgYFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgaW5EZXB0aF1gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciwgcmFuayA0LCBvZiBzaGFwZVxuICogICAgIGBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgb3V0RGVwdGgsIGluRGVwdGhdYC5cbiAqICAgICBgaW5EZXB0aGAgbXVzdCBtYXRjaCBgaW5EZXB0aGAgaW4gYHhgLlxuICogQHBhcmFtIG91dHB1dFNoYXBlIE91dHB1dCBzaGFwZSwgb2YgcmFuayA0IG9yIHJhbmsgMzpcbiAqICAgICBgW2JhdGNoLCBoZWlnaHQsIHdpZHRoLCBvdXREZXB0aF1gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBvcmlnaW5hbCBjb252b2x1dGlvbjpcbiAqICAgICBgW3N0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGhdYC5cbiAqIEBwYXJhbSBwYWQgIFRoZSB0eXBlIG9mIHBhZGRpbmcgYWxnb3JpdGhtIHVzZWQgaW4gdGhlIG5vbi10cmFuc3Bvc2UgdmVyc2lvblxuICogICAgb2YgdGhlIG9wLlxuICogQHBhcmFtIGRpbVJvdW5kaW5nTW9kZSBBIHN0cmluZyBmcm9tOiAnY2VpbCcsICdyb3VuZCcsICdmbG9vcicuIElmIG5vbmUgaXNcbiAqICAgICBwcm92aWRlZCwgaXQgd2lsbCBkZWZhdWx0IHRvIHRydW5jYXRlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0NvbnZvbHV0aW9uJ31cbiAqL1xuZnVuY3Rpb24gY29udjJkVHJhbnNwb3NlXyh4LCBmaWx0ZXIsIG91dHB1dFNoYXBlLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2NvbnYyZFRyYW5zcG9zZScpO1xuICAgIGNvbnN0ICRmaWx0ZXIgPSBjb252ZXJ0VG9UZW5zb3IoZmlsdGVyLCAnZmlsdGVyJywgJ2NvbnYyZFRyYW5zcG9zZScpO1xuICAgIHJldHVybiBjb252MkRCYWNrcHJvcElucHV0KG91dHB1dFNoYXBlLCAkeCwgJGZpbHRlciwgc3RyaWRlcywgcGFkLCAnTkhXQycsIGRpbVJvdW5kaW5nTW9kZSk7XG59XG5leHBvcnQgY29uc3QgY29udjJkVHJhbnNwb3NlID0gb3AoeyBjb252MmRUcmFuc3Bvc2VfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29udjJkX3RyYW5zcG9zZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgQ29udjNEIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgZWl0aGVyU3RyaWRlc09yRGlsYXRpb25zQXJlT25lIH0gZnJvbSAnLi9jb252X3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbi8qKlxuICogQ29tcHV0ZXMgYSAzRCBjb252b2x1dGlvbiBvdmVyIHRoZSBpbnB1dCB4LlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IsIG9mIHJhbmsgNSBvciByYW5rIDQsIG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgZGVwdGgsIGhlaWdodCwgd2lkdGgsIGNoYW5uZWxzXWAuIElmIHJhbmsgNCxcbiAqIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciwgcmFuayA1LCBvZiBzaGFwZVxuICogICAgIGBbZmlsdGVyRGVwdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGluQ2hhbm5lbHMsIG91dENoYW5uZWxzXWAuXG4gKiAgICAgIGluQ2hhbm5lbHMgbXVzdCBtYXRjaCBiZXR3ZWVuIGlucHV0IGFuZCBmaWx0ZXIuXG4gKiBAcGFyYW0gc3RyaWRlcyBUaGUgc3RyaWRlcyBvZiB0aGUgY29udm9sdXRpb246IGBbc3RyaWRlRGVwdGgsIHN0cmlkZUhlaWdodCxcbiAqIHN0cmlkZVdpZHRoXWAuXG4gKiBAcGFyYW0gcGFkIFRoZSB0eXBlIG9mIHBhZGRpbmcgYWxnb3JpdGhtLlxuICogICAgLSBgc2FtZWAgYW5kIHN0cmlkZSAxOiBvdXRwdXQgd2lsbCBiZSBvZiBzYW1lIHNpemUgYXMgaW5wdXQsXG4gKiAgICAgICByZWdhcmRsZXNzIG9mIGZpbHRlciBzaXplLlxuICogICAgLSBgdmFsaWRgOiBvdXRwdXQgd2lsbCBiZSBzbWFsbGVyIHRoYW4gaW5wdXQgaWYgZmlsdGVyIGlzIGxhcmdlclxuICogICAgICAgdGhhbiAxeDEuXG4gKiAgIC0gRm9yIG1vcmUgaW5mbywgc2VlIHRoaXMgZ3VpZGU6XG4gKiAgICAgW2h0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbl0oXG4gKiAgICAgICAgICBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb24pXG4gKiBAcGFyYW0gZGF0YUZvcm1hdDogQW4gb3B0aW9uYWwgc3RyaW5nIGZyb206IFwiTkRIV0NcIiwgXCJOQ0RIV1wiLiBEZWZhdWx0cyB0b1xuICogICAgIFwiTkRIV0NcIi4gU3BlY2lmeSB0aGUgZGF0YSBmb3JtYXQgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YS4gV2l0aCB0aGVcbiAqICAgICBkZWZhdWx0IGZvcm1hdCBcIk5ESFdDXCIsIHRoZSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgb3JkZXIgb2Y6IFtiYXRjaCxcbiAqICAgICBkZXB0aCwgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbHNdLiBPbmx5IFwiTkRIV0NcIiBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlxuICogQHBhcmFtIGRpbGF0aW9ucyBUaGUgZGlsYXRpb24gcmF0ZXM6IGBbZGlsYXRpb25EZXB0aCwgZGlsYXRpb25IZWlnaHQsXG4gKiAgICAgZGlsYXRpb25XaWR0aF1gIGluIHdoaWNoIHdlIHNhbXBsZSBpbnB1dCB2YWx1ZXMgYWNyb3NzIHRoZSBoZWlnaHRcbiAqICAgICBhbmQgd2lkdGggZGltZW5zaW9ucyBpbiBhdHJvdXMgY29udm9sdXRpb24uIERlZmF1bHRzIHRvIGBbMSwgMSwgMV1gLlxuICogICAgIElmIGBkaWxhdGlvbnNgIGlzIGEgc2luZ2xlIG51bWJlciwgdGhlblxuICogICAgIGBkaWxhdGlvbkRlcHRoID09IGRpbGF0aW9uSGVpZ2h0ID09IGRpbGF0aW9uV2lkdGhgLiBJZiBpdCBpcyBncmVhdGVyXG4gKiAgICAgdGhhbiAxLCB0aGVuIGFsbCB2YWx1ZXMgb2YgYHN0cmlkZXNgIG11c3QgYmUgMS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdDb252b2x1dGlvbid9XG4gKi9cbmZ1bmN0aW9uIGNvbnYzZF8oeCwgZmlsdGVyLCBzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQgPSAnTkRIV0MnLCBkaWxhdGlvbnMgPSBbMSwgMSwgMV0pIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdjb252M2QnKTtcbiAgICBjb25zdCAkZmlsdGVyID0gY29udmVydFRvVGVuc29yKGZpbHRlciwgJ2ZpbHRlcicsICdjb252M2QnKTtcbiAgICBsZXQgeDVEID0gJHg7XG4gICAgbGV0IHJlc2hhcGVkVG81RCA9IGZhbHNlO1xuICAgIGlmICgkeC5yYW5rID09PSA0KSB7XG4gICAgICAgIHJlc2hhcGVkVG81RCA9IHRydWU7XG4gICAgICAgIHg1RCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV0sICR4LnNoYXBlWzJdLCAkeC5zaGFwZVszXV0pO1xuICAgIH1cbiAgICB1dGlsLmFzc2VydCh4NUQucmFuayA9PT0gNSwgKCkgPT4gYEVycm9yIGluIGNvbnYzZDogaW5wdXQgbXVzdCBiZSByYW5rIDUsIGJ1dCBnb3QgcmFuayAke3g1RC5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydCgkZmlsdGVyLnJhbmsgPT09IDUsICgpID0+IGBFcnJvciBpbiBjb252M2Q6IGZpbHRlciBtdXN0IGJlIHJhbmsgNSwgYnV0IGdvdCByYW5rIGAgK1xuICAgICAgICBgJHskZmlsdGVyLnJhbmt9LmApO1xuICAgIHV0aWwuYXNzZXJ0KHg1RC5zaGFwZVs0XSA9PT0gJGZpbHRlci5zaGFwZVszXSwgKCkgPT4gYEVycm9yIGluIGNvbnYzZDogZGVwdGggb2YgaW5wdXQgKCR7eDVELnNoYXBlWzRdfSkgbXVzdCBtYXRjaCBgICtcbiAgICAgICAgYGlucHV0IGRlcHRoIGZvciBmaWx0ZXIgJHskZmlsdGVyLnNoYXBlWzNdfS5gKTtcbiAgICB1dGlsLmFzc2VydChlaXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgZGlsYXRpb25zKSwgKCkgPT4gJ0Vycm9yIGluIGNvbnYzRDogRWl0aGVyIHN0cmlkZXMgb3IgZGlsYXRpb25zIG11c3QgYmUgMS4gJyArXG4gICAgICAgIGBHb3Qgc3RyaWRlcyAke3N0cmlkZXN9IGFuZCBkaWxhdGlvbnMgJyR7ZGlsYXRpb25zfSdgKTtcbiAgICB1dGlsLmFzc2VydChkYXRhRm9ybWF0ID09PSAnTkRIV0MnLCAoKSA9PiBgRXJyb3IgaW4gY29udjNkOiBnb3QgZGF0YUZvcm1hdCBvZiAke2RhdGFGb3JtYXR9IGJ1dCBvbmx5IE5ESFdDIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQuYCk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiB4NUQsIGZpbHRlcjogJGZpbHRlciB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQsIGRpbGF0aW9ucyB9O1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICBjb25zdCByZXMgPSBFTkdJTkUucnVuS2VybmVsKENvbnYzRCwgaW5wdXRzLCBhdHRycyk7XG4gICAgaWYgKHJlc2hhcGVkVG81RCkge1xuICAgICAgICByZXR1cm4gcmVzaGFwZShyZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdLCByZXMuc2hhcGVbNF1dKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydCBjb25zdCBjb252M2QgPSBvcCh7IGNvbnYzZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb252M2QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IENvbnYzREJhY2twcm9wSW5wdXRWMiB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIGRlcml2YXRpdmUgb2YgdGhlIGlucHV0IG9mIGEgM0QgY29udm9sdXRpb24uXG4gKlxuICogQHBhcmFtIHhTaGFwZSBUaGUgc2hhcGUgb2YgdGhlIGlucHV0OiBbYmF0Y2gsIGRlcHRoLCBoZWlnaHQsIHdpZHRoLFxuICogaW5fY2hhbm5lbHNdLiBJZiBsZW5ndGggb2YgNCwgYmF0Y2ggb2YgMSBpcyBhc3N1bWVkLlxuICogQHBhcmFtIGR5IFRoZSBkZXJpdmF0aXZlIG9mIHRoZSBvdXRwdXQsIG9mIHJhbmsgNSBvciByYW5rIDQgb2Ygc2hhcGVcbiAqICAgYFtiYXRjaCwgb3V0RGVwdGgsIG91dEhlaWdodCwgb3V0V2lkdGgsIGluX2NoYW5uZWxzXWAuXG4gKiBJZiByYW5rIDQsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciwgcmFuayA1LCBvZiBzaGFwZVxuICogICAgIGBbZmlsdGVyRGVwdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGluRGVwdGgsIG91dERlcHRoXWAuXG4gKiBAcGFyYW0gc3RyaWRlcyBUaGUgc3RyaWRlcyBvZiB0aGUgY29udm9sdXRpb246IGBbc3RyaWRlRGVwdGgsIHN0cmlkZUhlaWdodCxcbiAqIHN0cmlkZVdpZHRoXWAuXG4gKiBAcGFyYW0gcGFkIFRoZSB0eXBlIG9mIHBhZGRpbmcgYWxnb3JpdGhtIHVzZWQ6XG4gKiAgICAtIGBzYW1lYCBhbmQgc3RyaWRlIDE6IG91dHB1dCB3aWxsIGJlIG9mIHNhbWUgc2l6ZSBhcyBpbnB1dCxcbiAqICAgICAgIHJlZ2FyZGxlc3Mgb2YgZmlsdGVyIHNpemUuXG4gKiAgICAtIGB2YWxpZGA6IG91dHB1dCB3aWxsIGJlIHNtYWxsZXIgdGhhbiBpbnB1dCBpZiBmaWx0ZXIgaXMgbGFyZ2VyXG4gKiAgICAgICB0aGFuIDF4MS5cbiAqL1xuZnVuY3Rpb24gY29udjNEQmFja3Byb3BJbnB1dF8oeFNoYXBlLCBkeSwgZmlsdGVyLCBzdHJpZGVzLCBwYWQpIHtcbiAgICB1dGlsLmFzc2VydCh4U2hhcGUubGVuZ3RoID09PSBkeS5yYW5rLCAoKSA9PiBgTGVuZ3RoIG9mIGluU2hhcGUgYCArXG4gICAgICAgIGAoJHt4U2hhcGUubGVuZ3RofSkgYW5kIHJhbmsgb2YgZHkgKCR7ZHkucmFua30pIG11c3QgbWF0Y2hgKTtcbiAgICBsZXQgeFNoYXBlNUQgPSB4U2hhcGU7XG4gICAgbGV0IGR5NUQgPSBkeTtcbiAgICBsZXQgcmVzaGFwZWRUbzVEID0gZmFsc2U7XG4gICAgaWYgKGR5LnJhbmsgPT09IDQpIHtcbiAgICAgICAgcmVzaGFwZWRUbzVEID0gdHJ1ZTtcbiAgICAgICAgZHk1RCA9IHJlc2hhcGUoZHksIFsxLCBkeS5zaGFwZVswXSwgZHkuc2hhcGVbMV0sIGR5LnNoYXBlWzJdLCBkeS5zaGFwZVszXV0pO1xuICAgICAgICB4U2hhcGU1RCA9IFsxLCB4U2hhcGVbMF0sIHhTaGFwZVsxXSwgeFNoYXBlWzJdLCB4U2hhcGVbM11dO1xuICAgIH1cbiAgICBjb25zdCBpbkRlcHRoID0geFNoYXBlNURbNF07XG4gICAgY29uc3Qgb3V0RGVwdGggPSBkeTVELnNoYXBlWzRdO1xuICAgIHV0aWwuYXNzZXJ0KHhTaGFwZTVELmxlbmd0aCA9PT0gNSwgKCkgPT4gYEVycm9yIGluIGNvbnYzZERlcklucHV0OiBpblNoYXBlIG11c3QgYmUgbGVuZ3RoIDUsIGJ1dCBnb3QgbGVuZ3RoIGAgK1xuICAgICAgICBgJHt4U2hhcGU1RC5sZW5ndGh9LmApO1xuICAgIHV0aWwuYXNzZXJ0KGR5NUQucmFuayA9PT0gNSwgKCkgPT4gYEVycm9yIGluIGNvbnYzZERlcklucHV0OiBkeSBtdXN0IGJlIHJhbmsgNSwgYnV0IGdvdCBgICtcbiAgICAgICAgYHJhbmsgJHtkeTVELnJhbmt9YCk7XG4gICAgdXRpbC5hc3NlcnQoZmlsdGVyLnJhbmsgPT09IDUsICgpID0+IGBFcnJvciBpbiBjb252M2REZXJJbnB1dDogZmlsdGVyIG11c3QgYmUgcmFuayA1LCBidXQgZ290IGAgK1xuICAgICAgICBgcmFuayAke2ZpbHRlci5yYW5rfWApO1xuICAgIHV0aWwuYXNzZXJ0KGluRGVwdGggPT09IGZpbHRlci5zaGFwZVszXSwgKCkgPT4gYEVycm9yIGluIGNvbnYzZERlcklucHV0OiBkZXB0aCBvZiBpbnB1dCAoJHtpbkRlcHRofSkgbXVzdCBgICtcbiAgICAgICAgYG1hdGNoIGlucHV0IGRlcHRoIGZvciBmaWx0ZXIgJHtmaWx0ZXIuc2hhcGVbM119LmApO1xuICAgIHV0aWwuYXNzZXJ0KG91dERlcHRoID09PSBmaWx0ZXIuc2hhcGVbNF0sICgpID0+IGBFcnJvciBpbiBjb252M2REZXJJbnB1dDogZGVwdGggb2Ygb3V0cHV0ICgke291dERlcHRofSkgbXVzdCBgICtcbiAgICAgICAgYG1hdGNoIG91dHB1dCBkZXB0aCBmb3IgZmlsdGVyICR7ZmlsdGVyLnNoYXBlWzRdfS5gKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGR5OiBkeTVELCBmaWx0ZXIgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgcGFkLCBzdHJpZGVzLCBpbnB1dFNoYXBlOiB4U2hhcGU1RCB9O1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICBjb25zdCByZXMgPSBFTkdJTkUucnVuS2VybmVsKENvbnYzREJhY2twcm9wSW5wdXRWMiwgaW5wdXRzLCBhdHRycyk7XG4gICAgaWYgKHJlc2hhcGVkVG81RCkge1xuICAgICAgICByZXR1cm4gcmVzaGFwZShyZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdLCByZXMuc2hhcGVbNF1dKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydCBjb25zdCBjb252M0RCYWNrcHJvcElucHV0ID0gb3AoeyBjb252M0RCYWNrcHJvcElucHV0XyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnYzZF9iYWNrcHJvcF9pbnB1dC5qcy5tYXAiLCJpbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgY29udjNEQmFja3Byb3BJbnB1dCB9IGZyb20gJy4vY29udjNkX2JhY2twcm9wX2lucHV0JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgdHJhbnNwb3NlZCAzRCBjb252b2x1dGlvbiBvZiBhIHZvbHVtZSwgYWxzbyBrbm93biBhcyBhXG4gKiBkZWNvbnZvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBpbWFnZSwgb2YgcmFuayA1IG9yIHJhbmsgNCwgb2Ygc2hhcGVcbiAqICAgYFtiYXRjaCwgZGVwdGgsIGhlaWdodCwgd2lkdGgsIGluRGVwdGhdYC4gSWYgcmFuayA0LCBiYXRjaCBvZiAxIGlzIGFzc3VtZWQuXG4gKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIsIHJhbmsgNCwgb2Ygc2hhcGVcbiAqICAgICBgW2RlcHRoLCBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBvdXREZXB0aCwgaW5EZXB0aF1gLlxuICogICAgIGBpbkRlcHRoYCBtdXN0IG1hdGNoIGBpbkRlcHRoYCBpbiBgeGAuXG4gKiBAcGFyYW0gb3V0cHV0U2hhcGUgT3V0cHV0IHNoYXBlLCBvZiByYW5rIDUgb3IgcmFuayA0OlxuICogICAgIGBbYmF0Y2gsIGRlcHRoLCBoZWlnaHQsIHdpZHRoLCBvdXREZXB0aF1gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXNcbiAqICAgIGFzc3VtZWQuXG4gKiBAcGFyYW0gc3RyaWRlcyBUaGUgc3RyaWRlcyBvZiB0aGUgb3JpZ2luYWwgY29udm9sdXRpb246XG4gKiAgICAgYFtzdHJpZGVEZXB0aCwgc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aF1gLlxuICogQHBhcmFtIHBhZCAgVGhlIHR5cGUgb2YgcGFkZGluZyBhbGdvcml0aG0gdXNlZCBpbiB0aGUgbm9uLXRyYW5zcG9zZSB2ZXJzaW9uXG4gKiAgICBvZiB0aGUgb3AuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQ29udm9sdXRpb24nfVxuICovXG5mdW5jdGlvbiBjb252M2RUcmFuc3Bvc2VfKHgsIGZpbHRlciwgb3V0cHV0U2hhcGUsIHN0cmlkZXMsIHBhZCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2NvbnYzZFRyYW5zcG9zZScpO1xuICAgIGNvbnN0ICRmaWx0ZXIgPSBjb252ZXJ0VG9UZW5zb3IoZmlsdGVyLCAnZmlsdGVyJywgJ2NvbnYzZFRyYW5zcG9zZScpO1xuICAgIHJldHVybiBjb252M0RCYWNrcHJvcElucHV0KG91dHB1dFNoYXBlLCAkeCwgJGZpbHRlciwgc3RyaWRlcywgcGFkKTtcbn1cbmV4cG9ydCBjb25zdCBjb252M2RUcmFuc3Bvc2UgPSBvcCh7IGNvbnYzZFRyYW5zcG9zZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb252M2RfdHJhbnNwb3NlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qKlxuICpcbiAqIEBwYXJhbSBpbnB1dFNoYXBlIElucHV0IHRlbnNvciBzaGFwZSBpcyBvZiB0aGUgZm9sbG93aW5nIGRpbWVuc2lvbnM6XG4gKiAgICAgYFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgaW5DaGFubmVsc11gLlxuICogQHBhcmFtIGZpbHRlclNoYXBlIFRoZSBmaWx0ZXIgc2hhcGUgaXMgb2YgdGhlIGZvbGxvd2luZyBkaW1lbnNpb25zOlxuICogICAgIGBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgZGVwdGhdYC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBzbGlkaW5nIHdpbmRvdyBmb3IgZWFjaCBkaW1lbnNpb24gb2YgdGhlXG4gKiAgICAgaW5wdXQgdGVuc29yOiBgW3N0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGhdYC5cbiAqICAgICBJZiBgc3RyaWRlc2AgaXMgYSBzaW5nbGUgbnVtYmVyLFxuICogICAgIHRoZW4gYHN0cmlkZUhlaWdodCA9PSBzdHJpZGVXaWR0aGAuXG4gKiBAcGFyYW0gcGFkIFRoZSB0eXBlIG9mIHBhZGRpbmcgYWxnb3JpdGhtLlxuICogICAgLSBgc2FtZWAgYW5kIHN0cmlkZSAxOiBvdXRwdXQgd2lsbCBiZSBvZiBzYW1lIHNpemUgYXMgaW5wdXQsXG4gKiAgICAgICByZWdhcmRsZXNzIG9mIGZpbHRlciBzaXplLlxuICogICAgLSBgdmFsaWRgOiBvdXRwdXQgd2lsbCBiZSBzbWFsbGVyIHRoYW4gaW5wdXQgaWYgZmlsdGVyIGlzIGxhcmdlclxuICogICAgICAgdGhhbiAxKjF4MS5cbiAqICAgIC0gRm9yIG1vcmUgaW5mbywgc2VlIHRoaXMgZ3VpZGU6XG4gKiAgICAgW2h0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbl0oXG4gKiAgICAgICAgICBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb24pXG4gKiBAcGFyYW0gZGF0YUZvcm1hdCBUaGUgZGF0YSBmb3JtYXQgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YS5cbiAqICAgICBEZWZhdWx0cyB0byAnTkhXQycuXG4gKiBAcGFyYW0gZGlsYXRpb25zIFRoZSBkaWxhdGlvbiByYXRlczogYFtkaWxhdGlvbkhlaWdodCwgZGlsYXRpb25XaWR0aF1gLlxuICogICAgIERlZmF1bHRzIHRvIGBbMSwgMV1gLiBJZiBgZGlsYXRpb25zYCBpcyBhIHNpbmdsZSBudW1iZXIsIHRoZW5cbiAqICAgICBgZGlsYXRpb25IZWlnaHQgPT0gZGlsYXRpb25XaWR0aGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlRGlsYXRpb24yREluZm8oaW5wdXRTaGFwZSwgZmlsdGVyU2hhcGUsIHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCA9ICdOSFdDJywgZGlsYXRpb25zKSB7XG4gICAgLy8gYGNvbXB1dGVyQ29udjJESW5mb2AgcmVxdWlyZSBmaWx0ZXJTaGFwZSB0byBiZSBpbiB0aGUgZGltZW5zaW9uIG9mOlxuICAgIC8vIGBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgZGVwdGgsIG91dERlcHRoXWAsIGRpbGF0aW9uMmQgZG9lc24ndCBoYXZlXG4gICAgLy8gb3V0RGVwdGgsIGl0IHNob3VsZCBoYXZlIHRoZSBzYW1lIGRlcHRoIGFzIHRoZSBpbnB1dC5cbiAgICAvLyBJbnB1dCBzaGFwZTogW2JhdGNoLCBoZWlnaHQsIHdpZHRoLCBpbkNoYW5uZWxzXVxuICAgIGNvbnN0IGlucHV0Q2hhbm5lbHMgPSBpbnB1dFNoYXBlWzNdO1xuICAgIGNvbnN0ICRmaWx0ZXJTaGFwZSA9IFsuLi5maWx0ZXJTaGFwZSwgaW5wdXRDaGFubmVsc107XG4gICAgY29uc3QgJGRhdGFGb3JtYXQgPSBjb252ZXJ0Q29udjJERGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcbiAgICByZXR1cm4gY29tcHV0ZUNvbnYyREluZm8oaW5wdXRTaGFwZSwgJGZpbHRlclNoYXBlLCBzdHJpZGVzLCBkaWxhdGlvbnMsIHBhZCwgbnVsbCAvKiByb3VuZGluZ01vZGUgKi8sIG51bGwgLyogZGVwdGhXaXNlICovLCAkZGF0YUZvcm1hdCk7XG59XG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVBvb2wyREluZm8oaW5TaGFwZSwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIHJvdW5kaW5nTW9kZSwgZGF0YUZvcm1hdCA9ICdjaGFubmVsc0xhc3QnKSB7XG4gICAgY29uc3QgW2ZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGhdID0gcGFyc2VUdXBsZVBhcmFtKGZpbHRlclNpemUpO1xuICAgIGxldCBmaWx0ZXJTaGFwZTtcbiAgICBpZiAoZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzTGFzdCcpIHtcbiAgICAgICAgZmlsdGVyU2hhcGUgPSBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5TaGFwZVszXSwgaW5TaGFwZVszXV07XG4gICAgfVxuICAgIGVsc2UgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0Jykge1xuICAgICAgICBmaWx0ZXJTaGFwZSA9IFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBpblNoYXBlWzFdLCBpblNoYXBlWzFdXTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBkYXRhRm9ybWF0ICR7ZGF0YUZvcm1hdH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbXB1dGVDb252MkRJbmZvKGluU2hhcGUsIGZpbHRlclNoYXBlLCBzdHJpZGVzLCBkaWxhdGlvbnMsIHBhZCwgcm91bmRpbmdNb2RlLCBmYWxzZSwgZGF0YUZvcm1hdCk7XG59XG4vKipcbiAqIENvbXB1dGVzIHRoZSBpbmZvcm1hdGlvbiBmb3IgYSBmb3J3YXJkIHBhc3Mgb2YgYSBwb29saW5nM0Qgb3BlcmF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVBvb2wzREluZm8oaW5TaGFwZSwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIHJvdW5kaW5nTW9kZSwgZGF0YUZvcm1hdCA9ICdOREhXQycpIHtcbiAgICBjb25zdCBbZmlsdGVyRGVwdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGhdID0gcGFyc2UzVHVwbGVQYXJhbShmaWx0ZXJTaXplKTtcbiAgICBsZXQgZmlsdGVyU2hhcGU7XG4gICAgbGV0ICRkYXRhRm9ybWF0O1xuICAgIGlmIChkYXRhRm9ybWF0ID09PSAnTkRIV0MnKSB7XG4gICAgICAgICRkYXRhRm9ybWF0ID0gJ2NoYW5uZWxzTGFzdCc7XG4gICAgICAgIGZpbHRlclNoYXBlID1cbiAgICAgICAgICAgIFtmaWx0ZXJEZXB0aCwgZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5TaGFwZVs0XSwgaW5TaGFwZVs0XV07XG4gICAgfVxuICAgIGVsc2UgaWYgKGRhdGFGb3JtYXQgPT09ICdOQ0RIVycpIHtcbiAgICAgICAgJGRhdGFGb3JtYXQgPSAnY2hhbm5lbHNGaXJzdCc7XG4gICAgICAgIGZpbHRlclNoYXBlID1cbiAgICAgICAgICAgIFtmaWx0ZXJEZXB0aCwgZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5TaGFwZVsxXSwgaW5TaGFwZVsxXV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZGF0YUZvcm1hdCAke2RhdGFGb3JtYXR9YCk7XG4gICAgfVxuICAgIHJldHVybiBjb21wdXRlQ29udjNESW5mbyhpblNoYXBlLCBmaWx0ZXJTaGFwZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGZhbHNlLCAkZGF0YUZvcm1hdCwgcm91bmRpbmdNb2RlKTtcbn1cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGluZm9ybWF0aW9uIGZvciBhIGZvcndhcmQgcGFzcyBvZiBhIGNvbnZvbHV0aW9uL3Bvb2xpbmdcbiAqIG9wZXJhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVDb252MkRJbmZvKGluU2hhcGUsIGZpbHRlclNoYXBlLCBzdHJpZGVzLCBkaWxhdGlvbnMsIHBhZCwgcm91bmRpbmdNb2RlLCBkZXB0aHdpc2UgPSBmYWxzZSwgZGF0YUZvcm1hdCA9ICdjaGFubmVsc0xhc3QnKSB7XG4gICAgbGV0IFtiYXRjaFNpemUsIGluSGVpZ2h0LCBpbldpZHRoLCBpbkNoYW5uZWxzXSA9IFstMSwgLTEsIC0xLCAtMV07XG4gICAgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnKSB7XG4gICAgICAgIFtiYXRjaFNpemUsIGluSGVpZ2h0LCBpbldpZHRoLCBpbkNoYW5uZWxzXSA9IGluU2hhcGU7XG4gICAgfVxuICAgIGVsc2UgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0Jykge1xuICAgICAgICBbYmF0Y2hTaXplLCBpbkNoYW5uZWxzLCBpbkhlaWdodCwgaW5XaWR0aF0gPSBpblNoYXBlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGRhdGFGb3JtYXQgJHtkYXRhRm9ybWF0fWApO1xuICAgIH1cbiAgICBjb25zdCBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgLCBmaWx0ZXJDaGFubmVsc10gPSBmaWx0ZXJTaGFwZTtcbiAgICBjb25zdCBbc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aF0gPSBwYXJzZVR1cGxlUGFyYW0oc3RyaWRlcyk7XG4gICAgY29uc3QgW2RpbGF0aW9uSGVpZ2h0LCBkaWxhdGlvbldpZHRoXSA9IHBhcnNlVHVwbGVQYXJhbShkaWxhdGlvbnMpO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckhlaWdodCA9IGdldEVmZmVjdGl2ZUZpbHRlclNpemUoZmlsdGVySGVpZ2h0LCBkaWxhdGlvbkhlaWdodCk7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVyV2lkdGggPSBnZXRFZmZlY3RpdmVGaWx0ZXJTaXplKGZpbHRlcldpZHRoLCBkaWxhdGlvbldpZHRoKTtcbiAgICBjb25zdCB7IHBhZEluZm8sIG91dEhlaWdodCwgb3V0V2lkdGggfSA9IGdldFBhZEFuZE91dEluZm8ocGFkLCBpbkhlaWdodCwgaW5XaWR0aCwgc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aCwgZWZmZWN0aXZlRmlsdGVySGVpZ2h0LCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCwgcm91bmRpbmdNb2RlLCBkYXRhRm9ybWF0KTtcbiAgICBjb25zdCBvdXRDaGFubmVscyA9IGRlcHRod2lzZSA/IGZpbHRlckNoYW5uZWxzICogaW5DaGFubmVscyA6IGZpbHRlckNoYW5uZWxzO1xuICAgIGxldCBvdXRTaGFwZTtcbiAgICBpZiAoZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzRmlyc3QnKSB7XG4gICAgICAgIG91dFNoYXBlID0gW2JhdGNoU2l6ZSwgb3V0Q2hhbm5lbHMsIG91dEhlaWdodCwgb3V0V2lkdGhdO1xuICAgIH1cbiAgICBlbHNlIGlmIChkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNMYXN0Jykge1xuICAgICAgICBvdXRTaGFwZSA9IFtiYXRjaFNpemUsIG91dEhlaWdodCwgb3V0V2lkdGgsIG91dENoYW5uZWxzXTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYmF0Y2hTaXplLFxuICAgICAgICBkYXRhRm9ybWF0LFxuICAgICAgICBpbkhlaWdodCxcbiAgICAgICAgaW5XaWR0aCxcbiAgICAgICAgaW5DaGFubmVscyxcbiAgICAgICAgb3V0SGVpZ2h0LFxuICAgICAgICBvdXRXaWR0aCxcbiAgICAgICAgb3V0Q2hhbm5lbHMsXG4gICAgICAgIHBhZEluZm8sXG4gICAgICAgIHN0cmlkZUhlaWdodCxcbiAgICAgICAgc3RyaWRlV2lkdGgsXG4gICAgICAgIGZpbHRlckhlaWdodCxcbiAgICAgICAgZmlsdGVyV2lkdGgsXG4gICAgICAgIGVmZmVjdGl2ZUZpbHRlckhlaWdodCxcbiAgICAgICAgZWZmZWN0aXZlRmlsdGVyV2lkdGgsXG4gICAgICAgIGRpbGF0aW9uSGVpZ2h0LFxuICAgICAgICBkaWxhdGlvbldpZHRoLFxuICAgICAgICBpblNoYXBlLFxuICAgICAgICBvdXRTaGFwZSxcbiAgICAgICAgZmlsdGVyU2hhcGVcbiAgICB9O1xufVxuLyoqXG4gKiBDb21wdXRlcyB0aGUgaW5mb3JtYXRpb24gZm9yIGEgZm9yd2FyZCBwYXNzIG9mIGEgM0QgY29udm9sdXRpb24vcG9vbGluZ1xuICogb3BlcmF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZUNvbnYzREluZm8oaW5TaGFwZSwgZmlsdGVyU2hhcGUsIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLCBkZXB0aHdpc2UgPSBmYWxzZSwgZGF0YUZvcm1hdCA9ICdjaGFubmVsc0xhc3QnLCByb3VuZGluZ01vZGUpIHtcbiAgICBsZXQgW2JhdGNoU2l6ZSwgaW5EZXB0aCwgaW5IZWlnaHQsIGluV2lkdGgsIGluQ2hhbm5lbHNdID0gWy0xLCAtMSwgLTEsIC0xLCAtMV07XG4gICAgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnKSB7XG4gICAgICAgIFtiYXRjaFNpemUsIGluRGVwdGgsIGluSGVpZ2h0LCBpbldpZHRoLCBpbkNoYW5uZWxzXSA9IGluU2hhcGU7XG4gICAgfVxuICAgIGVsc2UgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0Jykge1xuICAgICAgICBbYmF0Y2hTaXplLCBpbkNoYW5uZWxzLCBpbkRlcHRoLCBpbkhlaWdodCwgaW5XaWR0aF0gPSBpblNoYXBlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGRhdGFGb3JtYXQgJHtkYXRhRm9ybWF0fWApO1xuICAgIH1cbiAgICBjb25zdCBbZmlsdGVyRGVwdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsICwgZmlsdGVyQ2hhbm5lbHNdID0gZmlsdGVyU2hhcGU7XG4gICAgY29uc3QgW3N0cmlkZURlcHRoLCBzdHJpZGVIZWlnaHQsIHN0cmlkZVdpZHRoXSA9IHBhcnNlM1R1cGxlUGFyYW0oc3RyaWRlcyk7XG4gICAgY29uc3QgW2RpbGF0aW9uRGVwdGgsIGRpbGF0aW9uSGVpZ2h0LCBkaWxhdGlvbldpZHRoXSA9IHBhcnNlM1R1cGxlUGFyYW0oZGlsYXRpb25zKTtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJEZXB0aCA9IGdldEVmZmVjdGl2ZUZpbHRlclNpemUoZmlsdGVyRGVwdGgsIGRpbGF0aW9uRGVwdGgpO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckhlaWdodCA9IGdldEVmZmVjdGl2ZUZpbHRlclNpemUoZmlsdGVySGVpZ2h0LCBkaWxhdGlvbkhlaWdodCk7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVyV2lkdGggPSBnZXRFZmZlY3RpdmVGaWx0ZXJTaXplKGZpbHRlcldpZHRoLCBkaWxhdGlvbldpZHRoKTtcbiAgICBjb25zdCB7IHBhZEluZm8sIG91dERlcHRoLCBvdXRIZWlnaHQsIG91dFdpZHRoIH0gPSBnZXQzRFBhZEFuZE91dEluZm8ocGFkLCBpbkRlcHRoLCBpbkhlaWdodCwgaW5XaWR0aCwgc3RyaWRlRGVwdGgsIHN0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGgsIGVmZmVjdGl2ZUZpbHRlckRlcHRoLCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQsIGVmZmVjdGl2ZUZpbHRlcldpZHRoLCByb3VuZGluZ01vZGUpO1xuICAgIGNvbnN0IG91dENoYW5uZWxzID0gZGVwdGh3aXNlID8gZmlsdGVyQ2hhbm5lbHMgKiBpbkNoYW5uZWxzIDogZmlsdGVyQ2hhbm5lbHM7XG4gICAgbGV0IG91dFNoYXBlO1xuICAgIGlmIChkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNGaXJzdCcpIHtcbiAgICAgICAgb3V0U2hhcGUgPSBbYmF0Y2hTaXplLCBvdXRDaGFubmVscywgb3V0RGVwdGgsIG91dEhlaWdodCwgb3V0V2lkdGhdO1xuICAgIH1cbiAgICBlbHNlIGlmIChkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNMYXN0Jykge1xuICAgICAgICBvdXRTaGFwZSA9IFtiYXRjaFNpemUsIG91dERlcHRoLCBvdXRIZWlnaHQsIG91dFdpZHRoLCBvdXRDaGFubmVsc107XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGJhdGNoU2l6ZSxcbiAgICAgICAgZGF0YUZvcm1hdCxcbiAgICAgICAgaW5EZXB0aCxcbiAgICAgICAgaW5IZWlnaHQsXG4gICAgICAgIGluV2lkdGgsXG4gICAgICAgIGluQ2hhbm5lbHMsXG4gICAgICAgIG91dERlcHRoLFxuICAgICAgICBvdXRIZWlnaHQsXG4gICAgICAgIG91dFdpZHRoLFxuICAgICAgICBvdXRDaGFubmVscyxcbiAgICAgICAgcGFkSW5mbyxcbiAgICAgICAgc3RyaWRlRGVwdGgsXG4gICAgICAgIHN0cmlkZUhlaWdodCxcbiAgICAgICAgc3RyaWRlV2lkdGgsXG4gICAgICAgIGZpbHRlckRlcHRoLFxuICAgICAgICBmaWx0ZXJIZWlnaHQsXG4gICAgICAgIGZpbHRlcldpZHRoLFxuICAgICAgICBlZmZlY3RpdmVGaWx0ZXJEZXB0aCxcbiAgICAgICAgZWZmZWN0aXZlRmlsdGVySGVpZ2h0LFxuICAgICAgICBlZmZlY3RpdmVGaWx0ZXJXaWR0aCxcbiAgICAgICAgZGlsYXRpb25EZXB0aCxcbiAgICAgICAgZGlsYXRpb25IZWlnaHQsXG4gICAgICAgIGRpbGF0aW9uV2lkdGgsXG4gICAgICAgIGluU2hhcGUsXG4gICAgICAgIG91dFNoYXBlLFxuICAgICAgICBmaWx0ZXJTaGFwZVxuICAgIH07XG59XG5mdW5jdGlvbiBjb21wdXRlT3V0cHV0U2hhcGUyRChpblNoYXBlLCBmaWVsZFNpemUsIHN0cmlkZSwgemVyb1BhZCwgcm91bmRpbmdNb2RlKSB7XG4gICAgaWYgKHplcm9QYWQgPT0gbnVsbCkge1xuICAgICAgICB6ZXJvUGFkID0gY29tcHV0ZURlZmF1bHRQYWQoaW5TaGFwZSwgZmllbGRTaXplLCBzdHJpZGUpO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dFJvd3MgPSBpblNoYXBlWzBdO1xuICAgIGNvbnN0IGlucHV0Q29scyA9IGluU2hhcGVbMV07XG4gICAgY29uc3Qgb3V0cHV0Um93cyA9IHJvdW5kKChpbnB1dFJvd3MgLSBmaWVsZFNpemUgKyAyICogemVyb1BhZCkgLyBzdHJpZGUgKyAxLCByb3VuZGluZ01vZGUpO1xuICAgIGNvbnN0IG91dHB1dENvbHMgPSByb3VuZCgoaW5wdXRDb2xzIC0gZmllbGRTaXplICsgMiAqIHplcm9QYWQpIC8gc3RyaWRlICsgMSwgcm91bmRpbmdNb2RlKTtcbiAgICByZXR1cm4gW291dHB1dFJvd3MsIG91dHB1dENvbHNdO1xufVxuZnVuY3Rpb24gY29tcHV0ZU91dHB1dFNoYXBlNEQoaW5TaGFwZSwgZmllbGRTaXplLCBvdXRDaGFubmVscywgc3RyaWRlLCB6ZXJvUGFkLCByb3VuZGluZ01vZGUpIHtcbiAgICBpZiAoemVyb1BhZCA9PSBudWxsKSB7XG4gICAgICAgIHplcm9QYWQgPSBjb21wdXRlRGVmYXVsdFBhZChpblNoYXBlLCBmaWVsZFNpemUsIHN0cmlkZSk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0RGVwdGggPSBpblNoYXBlWzBdO1xuICAgIGNvbnN0IGlucHV0Um93cyA9IGluU2hhcGVbMV07XG4gICAgY29uc3QgaW5wdXRDb2xzID0gaW5TaGFwZVsyXTtcbiAgICBjb25zdCBvdXRwdXREZXB0aHMgPSByb3VuZCgoaW5wdXREZXB0aCAtIGZpZWxkU2l6ZSArIDIgKiB6ZXJvUGFkKSAvIHN0cmlkZSArIDEsIHJvdW5kaW5nTW9kZSk7XG4gICAgY29uc3Qgb3V0cHV0Um93cyA9IHJvdW5kKChpbnB1dFJvd3MgLSBmaWVsZFNpemUgKyAyICogemVyb1BhZCkgLyBzdHJpZGUgKyAxLCByb3VuZGluZ01vZGUpO1xuICAgIGNvbnN0IG91dHB1dENvbHMgPSByb3VuZCgoaW5wdXRDb2xzIC0gZmllbGRTaXplICsgMiAqIHplcm9QYWQpIC8gc3RyaWRlICsgMSwgcm91bmRpbmdNb2RlKTtcbiAgICByZXR1cm4gW291dHB1dERlcHRocywgb3V0cHV0Um93cywgb3V0cHV0Q29scywgb3V0Q2hhbm5lbHNdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVEZWZhdWx0UGFkKGlucHV0U2hhcGUsIGZpZWxkU2l6ZSwgc3RyaWRlLCBkaWxhdGlvbiA9IDEpIHtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWVsZFNpemUgPSBnZXRFZmZlY3RpdmVGaWx0ZXJTaXplKGZpZWxkU2l6ZSwgZGlsYXRpb24pO1xuICAgIHJldHVybiBNYXRoLmZsb29yKChpbnB1dFNoYXBlWzBdICogKHN0cmlkZSAtIDEpIC0gc3RyaWRlICsgZWZmZWN0aXZlRmllbGRTaXplKSAvIDIpO1xufVxuZnVuY3Rpb24gcGFyc2VUdXBsZVBhcmFtKHBhcmFtKSB7XG4gICAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIFtwYXJhbSwgcGFyYW0sIHBhcmFtXTtcbiAgICB9XG4gICAgaWYgKHBhcmFtLmxlbmd0aCA9PT0gMikge1xuICAgICAgICByZXR1cm4gW3BhcmFtWzBdLCBwYXJhbVsxXSwgMV07XG4gICAgfVxuICAgIHJldHVybiBwYXJhbTtcbn1cbmZ1bmN0aW9uIHBhcnNlM1R1cGxlUGFyYW0ocGFyYW0pIHtcbiAgICByZXR1cm4gdHlwZW9mIHBhcmFtID09PSAnbnVtYmVyJyA/IFtwYXJhbSwgcGFyYW0sIHBhcmFtXSA6IHBhcmFtO1xufVxuLyogU2VlIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9hdHJvdXNfY29udjJkXG4gKiBBdHJvdXMgY29udm9sdXRpb24gaXMgZXF1aXZhbGVudCB0byBzdGFuZGFyZCBjb252b2x1dGlvbiB3aXRoIHVwc2FtcGxlZFxuICogZmlsdGVycyB3aXRoIGVmZmVjdGl2ZV9maWx0ZXJfaGVpZ2h0ID1cbiAqIGZpbHRlcl9oZWlnaHQgKyAoZmlsdGVyX2hlaWdodCAtIDEpICogKGRpbGF0aW9uIC0gMSlcbiAqIGFuZCBlZmZlY3RpdmVfZmlsdGVyX3dpZHRoID1cbiAqIGZpbHRlcl93aWR0aCArIChmaWx0ZXJfd2lkdGggLSAxKSAqIChkaWxhdGlvbiAtIDEpLFxuICogcHJvZHVjZWQgYnkgaW5zZXJ0aW5nIGRpbGF0aW9uIC0gMSB6ZXJvcyBhbG9uZyBjb25zZWN1dGl2ZSBlbGVtZW50cyBhY3Jvc3NcbiAqIHRoZSBmaWx0ZXJzJyBzcGF0aWFsIGRpbWVuc2lvbnMuXG4gKiBXaGVuIHRoZXJlIGlzIGEgZGlsYXRpb24sIHRoaXMgY29udmVydHMgYSBmaWx0ZXIgZGltZW5zaW9uIHRvIHRoZVxuICogZWZmZWN0aXZlIGZpbHRlciBkaW1lbnNpb24sIHNvIGl0IGNhbiBiZSB1c2VkIGluIGEgc3RhbmRhcmQgY29udm9sdXRpb24uXG4gKi9cbmZ1bmN0aW9uIGdldEVmZmVjdGl2ZUZpbHRlclNpemUoZmlsdGVyU2l6ZSwgZGlsYXRpb24pIHtcbiAgICBpZiAoZGlsYXRpb24gPD0gMSkge1xuICAgICAgICByZXR1cm4gZmlsdGVyU2l6ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZpbHRlclNpemUgKyAoZmlsdGVyU2l6ZSAtIDEpICogKGRpbGF0aW9uIC0gMSk7XG59XG5mdW5jdGlvbiBnZXRQYWRBbmRPdXRJbmZvKHBhZCwgaW5IZWlnaHQsIGluV2lkdGgsIHN0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIHJvdW5kaW5nTW9kZSwgZGF0YUZvcm1hdCkge1xuICAgIGxldCBwYWRJbmZvO1xuICAgIGxldCBvdXRIZWlnaHQ7XG4gICAgbGV0IG91dFdpZHRoO1xuICAgIGlmICh0eXBlb2YgcGFkID09PSAnbnVtYmVyJykge1xuICAgICAgICBjb25zdCBwYWRUeXBlID0gKHBhZCA9PT0gMCkgPyAnVkFMSUQnIDogJ05VTUJFUic7XG4gICAgICAgIHBhZEluZm8gPSB7IHRvcDogcGFkLCBib3R0b206IHBhZCwgbGVmdDogcGFkLCByaWdodDogcGFkLCB0eXBlOiBwYWRUeXBlIH07XG4gICAgICAgIGNvbnN0IG91dFNoYXBlID0gY29tcHV0ZU91dHB1dFNoYXBlMkQoW2luSGVpZ2h0LCBpbldpZHRoXSwgZmlsdGVySGVpZ2h0LCBzdHJpZGVIZWlnaHQsIHBhZCwgcm91bmRpbmdNb2RlKTtcbiAgICAgICAgb3V0SGVpZ2h0ID0gb3V0U2hhcGVbMF07XG4gICAgICAgIG91dFdpZHRoID0gb3V0U2hhcGVbMV07XG4gICAgfVxuICAgIGVsc2UgaWYgKHBhZCA9PT0gJ3NhbWUnKSB7XG4gICAgICAgIG91dEhlaWdodCA9IE1hdGguY2VpbChpbkhlaWdodCAvIHN0cmlkZUhlaWdodCk7XG4gICAgICAgIG91dFdpZHRoID0gTWF0aC5jZWlsKGluV2lkdGggLyBzdHJpZGVXaWR0aCk7XG4gICAgICAgIGNvbnN0IHBhZEFsb25nSGVpZ2h0ID0gTWF0aC5tYXgoMCwgKG91dEhlaWdodCAtIDEpICogc3RyaWRlSGVpZ2h0ICsgZmlsdGVySGVpZ2h0IC0gaW5IZWlnaHQpO1xuICAgICAgICBjb25zdCBwYWRBbG9uZ1dpZHRoID0gTWF0aC5tYXgoMCwgKG91dFdpZHRoIC0gMSkgKiBzdHJpZGVXaWR0aCArIGZpbHRlcldpZHRoIC0gaW5XaWR0aCk7XG4gICAgICAgIGNvbnN0IHRvcCA9IE1hdGguZmxvb3IocGFkQWxvbmdIZWlnaHQgLyAyKTtcbiAgICAgICAgY29uc3QgYm90dG9tID0gcGFkQWxvbmdIZWlnaHQgLSB0b3A7XG4gICAgICAgIGNvbnN0IGxlZnQgPSBNYXRoLmZsb29yKHBhZEFsb25nV2lkdGggLyAyKTtcbiAgICAgICAgY29uc3QgcmlnaHQgPSBwYWRBbG9uZ1dpZHRoIC0gbGVmdDtcbiAgICAgICAgcGFkSW5mbyA9IHsgdG9wLCBib3R0b20sIGxlZnQsIHJpZ2h0LCB0eXBlOiAnU0FNRScgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAocGFkID09PSAndmFsaWQnKSB7XG4gICAgICAgIHBhZEluZm8gPSB7IHRvcDogMCwgYm90dG9tOiAwLCBsZWZ0OiAwLCByaWdodDogMCwgdHlwZTogJ1ZBTElEJyB9O1xuICAgICAgICBvdXRIZWlnaHQgPSBNYXRoLmNlaWwoKGluSGVpZ2h0IC0gZmlsdGVySGVpZ2h0ICsgMSkgLyBzdHJpZGVIZWlnaHQpO1xuICAgICAgICBvdXRXaWR0aCA9IE1hdGguY2VpbCgoaW5XaWR0aCAtIGZpbHRlcldpZHRoICsgMSkgLyBzdHJpZGVXaWR0aCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBwYWQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGNvbnN0IHRvcCA9IGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnID8gcGFkWzFdWzBdIDogcGFkWzJdWzBdO1xuICAgICAgICBjb25zdCBib3R0b20gPSBkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNMYXN0JyA/IHBhZFsxXVsxXSA6IHBhZFsyXVsxXTtcbiAgICAgICAgY29uc3QgbGVmdCA9IGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnID8gcGFkWzJdWzBdIDogcGFkWzNdWzBdO1xuICAgICAgICBjb25zdCByaWdodCA9IGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnID8gcGFkWzJdWzFdIDogcGFkWzNdWzFdO1xuICAgICAgICBjb25zdCBwYWRUeXBlID0gKHRvcCA9PT0gMCAmJiBib3R0b20gPT09IDAgJiYgbGVmdCA9PT0gMCAmJiByaWdodCA9PT0gMCkgP1xuICAgICAgICAgICAgJ1ZBTElEJyA6XG4gICAgICAgICAgICAnRVhQTElDSVQnO1xuICAgICAgICBwYWRJbmZvID0geyB0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHQsIHR5cGU6IHBhZFR5cGUgfTtcbiAgICAgICAgb3V0SGVpZ2h0ID0gcm91bmQoKGluSGVpZ2h0IC0gZmlsdGVySGVpZ2h0ICsgdG9wICsgYm90dG9tKSAvIHN0cmlkZUhlaWdodCArIDEsIHJvdW5kaW5nTW9kZSk7XG4gICAgICAgIG91dFdpZHRoID0gcm91bmQoKGluV2lkdGggLSBmaWx0ZXJXaWR0aCArIGxlZnQgKyByaWdodCkgLyBzdHJpZGVXaWR0aCArIDEsIHJvdW5kaW5nTW9kZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBFcnJvcihgVW5rbm93biBwYWRkaW5nIHBhcmFtZXRlcjogJHtwYWR9YCk7XG4gICAgfVxuICAgIHJldHVybiB7IHBhZEluZm8sIG91dEhlaWdodCwgb3V0V2lkdGggfTtcbn1cbmZ1bmN0aW9uIGdldDNEUGFkQW5kT3V0SW5mbyhwYWQsIGluRGVwdGgsIGluSGVpZ2h0LCBpbldpZHRoLCBzdHJpZGVEZXB0aCwgc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aCwgZmlsdGVyRGVwdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIHJvdW5kaW5nTW9kZSkge1xuICAgIGxldCBwYWRJbmZvO1xuICAgIGxldCBvdXREZXB0aDtcbiAgICBsZXQgb3V0SGVpZ2h0O1xuICAgIGxldCBvdXRXaWR0aDtcbiAgICBpZiAodHlwZW9mIHBhZCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgY29uc3QgcGFkVHlwZSA9IChwYWQgPT09IDApID8gJ1ZBTElEJyA6ICdOVU1CRVInO1xuICAgICAgICBwYWRJbmZvID0ge1xuICAgICAgICAgICAgdG9wOiBwYWQsXG4gICAgICAgICAgICBib3R0b206IHBhZCxcbiAgICAgICAgICAgIGxlZnQ6IHBhZCxcbiAgICAgICAgICAgIHJpZ2h0OiBwYWQsXG4gICAgICAgICAgICBmcm9udDogcGFkLFxuICAgICAgICAgICAgYmFjazogcGFkLFxuICAgICAgICAgICAgdHlwZTogcGFkVHlwZVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBvdXRTaGFwZSA9IGNvbXB1dGVPdXRwdXRTaGFwZTREKFtpbkRlcHRoLCBpbkhlaWdodCwgaW5XaWR0aCwgMV0sIGZpbHRlckRlcHRoLCAxLCBzdHJpZGVEZXB0aCwgcGFkLCByb3VuZGluZ01vZGUpO1xuICAgICAgICBvdXREZXB0aCA9IG91dFNoYXBlWzBdO1xuICAgICAgICBvdXRIZWlnaHQgPSBvdXRTaGFwZVsxXTtcbiAgICAgICAgb3V0V2lkdGggPSBvdXRTaGFwZVsyXTtcbiAgICB9XG4gICAgZWxzZSBpZiAocGFkID09PSAnc2FtZScpIHtcbiAgICAgICAgb3V0RGVwdGggPSBNYXRoLmNlaWwoaW5EZXB0aCAvIHN0cmlkZURlcHRoKTtcbiAgICAgICAgb3V0SGVpZ2h0ID0gTWF0aC5jZWlsKGluSGVpZ2h0IC8gc3RyaWRlSGVpZ2h0KTtcbiAgICAgICAgb3V0V2lkdGggPSBNYXRoLmNlaWwoaW5XaWR0aCAvIHN0cmlkZVdpZHRoKTtcbiAgICAgICAgY29uc3QgcGFkQWxvbmdEZXB0aCA9IChvdXREZXB0aCAtIDEpICogc3RyaWRlRGVwdGggKyBmaWx0ZXJEZXB0aCAtIGluRGVwdGg7XG4gICAgICAgIGNvbnN0IHBhZEFsb25nSGVpZ2h0ID0gKG91dEhlaWdodCAtIDEpICogc3RyaWRlSGVpZ2h0ICsgZmlsdGVySGVpZ2h0IC0gaW5IZWlnaHQ7XG4gICAgICAgIGNvbnN0IHBhZEFsb25nV2lkdGggPSAob3V0V2lkdGggLSAxKSAqIHN0cmlkZVdpZHRoICsgZmlsdGVyV2lkdGggLSBpbldpZHRoO1xuICAgICAgICBjb25zdCBmcm9udCA9IE1hdGguZmxvb3IocGFkQWxvbmdEZXB0aCAvIDIpO1xuICAgICAgICBjb25zdCBiYWNrID0gcGFkQWxvbmdEZXB0aCAtIGZyb250O1xuICAgICAgICBjb25zdCB0b3AgPSBNYXRoLmZsb29yKHBhZEFsb25nSGVpZ2h0IC8gMik7XG4gICAgICAgIGNvbnN0IGJvdHRvbSA9IHBhZEFsb25nSGVpZ2h0IC0gdG9wO1xuICAgICAgICBjb25zdCBsZWZ0ID0gTWF0aC5mbG9vcihwYWRBbG9uZ1dpZHRoIC8gMik7XG4gICAgICAgIGNvbnN0IHJpZ2h0ID0gcGFkQWxvbmdXaWR0aCAtIGxlZnQ7XG4gICAgICAgIHBhZEluZm8gPSB7IHRvcCwgYm90dG9tLCBsZWZ0LCByaWdodCwgZnJvbnQsIGJhY2ssIHR5cGU6ICdTQU1FJyB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChwYWQgPT09ICd2YWxpZCcpIHtcbiAgICAgICAgcGFkSW5mbyA9IHtcbiAgICAgICAgICAgIHRvcDogMCxcbiAgICAgICAgICAgIGJvdHRvbTogMCxcbiAgICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgICByaWdodDogMCxcbiAgICAgICAgICAgIGZyb250OiAwLFxuICAgICAgICAgICAgYmFjazogMCxcbiAgICAgICAgICAgIHR5cGU6ICdWQUxJRCdcbiAgICAgICAgfTtcbiAgICAgICAgb3V0RGVwdGggPSBNYXRoLmNlaWwoKGluRGVwdGggLSBmaWx0ZXJEZXB0aCArIDEpIC8gc3RyaWRlRGVwdGgpO1xuICAgICAgICBvdXRIZWlnaHQgPSBNYXRoLmNlaWwoKGluSGVpZ2h0IC0gZmlsdGVySGVpZ2h0ICsgMSkgLyBzdHJpZGVIZWlnaHQpO1xuICAgICAgICBvdXRXaWR0aCA9IE1hdGguY2VpbCgoaW5XaWR0aCAtIGZpbHRlcldpZHRoICsgMSkgLyBzdHJpZGVXaWR0aCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBFcnJvcihgVW5rbm93biBwYWRkaW5nIHBhcmFtZXRlcjogJHtwYWR9YCk7XG4gICAgfVxuICAgIHJldHVybiB7IHBhZEluZm8sIG91dERlcHRoLCBvdXRIZWlnaHQsIG91dFdpZHRoIH07XG59XG4vKipcbiAqIFJvdW5kcyBhIHZhbHVlIGRlcGVuZGluZyBvbiB0aGUgcm91bmRpbmcgbW9kZVxuICogQHBhcmFtIHZhbHVlXG4gKiBAcGFyYW0gcm91bmRpbmdNb2RlIEEgc3RyaW5nIGZyb206ICdjZWlsJywgJ3JvdW5kJywgJ2Zsb29yJy4gSWYgbm9uZSBpc1xuICogICAgIHByb3ZpZGVkLCBpdCB3aWxsIGRlZmF1bHQgdG8gdHJ1bmNhdGUuXG4gKi9cbmZ1bmN0aW9uIHJvdW5kKHZhbHVlLCByb3VuZGluZ01vZGUpIHtcbiAgICBpZiAoIXJvdW5kaW5nTW9kZSkge1xuICAgICAgICByZXR1cm4gTWF0aC50cnVuYyh2YWx1ZSk7XG4gICAgfVxuICAgIHN3aXRjaCAocm91bmRpbmdNb2RlKSB7XG4gICAgICAgIGNhc2UgJ3JvdW5kJzpcbiAgICAgICAgICAgIC8vIHVzZWQgZm9yIENhZmZlIENvbnZcbiAgICAgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlKTtcbiAgICAgICAgY2FzZSAnY2VpbCc6XG4gICAgICAgICAgICAvLyB1c2VkIGZvciBDYWZmZSBQb29sXG4gICAgICAgICAgICByZXR1cm4gTWF0aC5jZWlsKHZhbHVlKTtcbiAgICAgICAgY2FzZSAnZmxvb3InOlxuICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IodmFsdWUpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHJvdW5kaW5nTW9kZSAke3JvdW5kaW5nTW9kZX1gKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gdHVwbGVWYWx1ZXNBcmVPbmUocGFyYW0pIHtcbiAgICBjb25zdCBbZGltQSwgZGltQiwgZGltQ10gPSBwYXJzZVR1cGxlUGFyYW0ocGFyYW0pO1xuICAgIHJldHVybiBkaW1BID09PSAxICYmIGRpbUIgPT09IDEgJiYgZGltQyA9PT0gMTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBlaXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgZGlsYXRpb25zKSB7XG4gICAgcmV0dXJuIHR1cGxlVmFsdWVzQXJlT25lKHN0cmlkZXMpIHx8IHR1cGxlVmFsdWVzQXJlT25lKGRpbGF0aW9ucyk7XG59XG4vKipcbiAqIENvbnZlcnQgQ29udjJEIGRhdGFGb3JtYXQgZnJvbSAnTkhXQyd8J05DSFcnIHRvXG4gKiAgICAnY2hhbm5lbHNMYXN0J3wnY2hhbm5lbHNGaXJzdCdcbiAqIEBwYXJhbSBkYXRhRm9ybWF0IGluICdOSFdDJ3wnTkNIVycgbW9kZVxuICogQHJldHVybiBkYXRhRm9ybWF0IGluICdjaGFubmVsc0xhc3QnfCdjaGFubmVsc0ZpcnN0JyBtb2RlXG4gKiBAdGhyb3dzIHVua25vd24gZGF0YUZvcm1hdFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydENvbnYyRERhdGFGb3JtYXQoZGF0YUZvcm1hdCkge1xuICAgIGlmIChkYXRhRm9ybWF0ID09PSAnTkhXQycpIHtcbiAgICAgICAgcmV0dXJuICdjaGFubmVsc0xhc3QnO1xuICAgIH1cbiAgICBlbHNlIGlmIChkYXRhRm9ybWF0ID09PSAnTkNIVycpIHtcbiAgICAgICAgcmV0dXJuICdjaGFubmVsc0ZpcnN0JztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBkYXRhRm9ybWF0ICR7ZGF0YUZvcm1hdH1gKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb252X3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IENvcyB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIGNvcyBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOiBgY29zKHgpYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzAsIE1hdGguUEkgLyAyLCBNYXRoLlBJICogMyAvIDRdKTtcbiAqXG4gKiB4LmNvcygpLnByaW50KCk7ICAvLyBvciB0Zi5jb3MoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gY29zXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnY29zJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKENvcywgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBjb3MgPSBvcCh7IGNvc18gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb3MuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IENvc2ggfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBoeXBlcmJvbGljIGNvcyBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOiBgY29zaCh4KWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFswLCAxLCAtMSwgLjddKTtcbiAqXG4gKiB4LmNvc2goKS5wcmludCgpOyAgLy8gb3IgdGYuY29zaCh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBjb3NoXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnY29zaCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChDb3NoLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGNvc2ggPSBvcCh7IGNvc2hfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29zaC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgQ3Vtc3VtIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIGN1bXVsYXRpdmUgc3VtIG9mIGEgYHRmLlRlbnNvcmAgYWxvbmcgYGF4aXNgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yKFsxLCAyLCAzLCA0XSk7XG4gKiB4LmN1bXN1bSgpLnByaW50KCk7XG4gKiBgYGBcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yKFtbMSwgMl0sIFszLCA0XV0pO1xuICogeC5jdW1zdW0oKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciB0byBiZSBzdW1tZWQuXG4gKiBAcGFyYW0gYXhpcyBUaGUgYXhpcyBhbG9uZyB3aGljaCB0byBzdW0uIE9wdGlvbmFsLiBEZWZhdWx0cyB0byAwLlxuICogQHBhcmFtIGV4Y2x1c2l2ZSBXaGV0aGVyIHRvIHBlcmZvcm0gZXhjbHVzaXZlIGN1bXVsYXRpdmUgc3VtLiBPcHRpb25hbC5cbiAqICAgICBEZWZhdWx0cyB0byBmYWxzZS4gSWYgc2V0IHRvIHRydWUgdGhlbiB0aGUgc3VtIG9mIGVhY2ggdGVuc29yIGVudHJ5XG4gKiAgICAgZG9lcyBub3QgaW5jbHVkZSBpdHMgb3duIHZhbHVlLCBidXQgb25seSB0aGUgdmFsdWVzIHByZXZpb3VzIHRvIGl0XG4gKiAgICAgYWxvbmcgdGhlIHNwZWNpZmllZCBheGlzLlxuICogQHBhcmFtIHJldmVyc2UgV2hldGhlciB0byBzdW0gaW4gdGhlIG9wcG9zaXRlIGRpcmVjdGlvbi4gT3B0aW9uYWwuXG4gKiAgICAgRGVmYXVsdHMgdG8gZmFsc2UuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU2Nhbid9XG4gKi9cbmZ1bmN0aW9uIGN1bXN1bV8oeCwgYXhpcyA9IDAsIGV4Y2x1c2l2ZSA9IGZhbHNlLCByZXZlcnNlID0gZmFsc2UpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdjdW1zdW0nKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgY29uc3QgYXR0cnMgPSB7IGF4aXMsIGV4Y2x1c2l2ZSwgcmV2ZXJzZSB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEN1bXN1bSwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgY3Vtc3VtID0gb3AoeyBjdW1zdW1fIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y3Vtc3VtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBEZW5zZUJpbmNvdW50IH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIE91dHB1dHMgYSB2ZWN0b3Igd2l0aCBsZW5ndGggYHNpemVgIGFuZCB0aGUgc2FtZSBkdHlwZSBhcyBgd2VpZ2h0c2AuXG4gKlxuICogSWYgYHdlaWdodHNgIGFyZSBlbXB0eSwgdGhlbiBpbmRleCBgaWAgc3RvcmVzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIHZhbHVlXG4gKiBgaWAgaXMgY291bnRlZCBpbiBgeGAuIElmIGB3ZWlnaHRzYCBhcmUgbm9uLWVtcHR5LCB0aGVuIGluZGV4IGBpYCBzdG9yZXMgdGhlXG4gKiBzdW0gb2YgdGhlIHZhbHVlIGluIGB3ZWlnaHRzYCBhdCBlYWNoIGluZGV4IHdoZXJlIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGluXG4gKiBgeGAgaXMgYGlgLlxuICpcbiAqIFZhbHVlcyBpbiBgeGAgb3V0c2lkZSBvZiB0aGUgcmFuZ2UgWzAsIHNpemUpIGFyZSBpZ25vcmVkLlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBpbnQgdGVuc29yLCByYW5rIDEgb3IgcmFuayAyLlxuICogQHBhcmFtIHdlaWdodHMgVGhlIHdlaWdodHMgdGVuc29yLCBtdXN0IGhhdmUgdGhlIHNhbWUgc2hhcGUgYXMgeCwgb3IgYVxuICogICAgIGxlbmd0aC0wIFRlbnNvciwgaW4gd2hpY2ggY2FzZSBpdCBhY3RzIGFzIGFsbCB3ZWlnaHRzIGVxdWFsIHRvIDEuXG4gKiBAcGFyYW0gc2l6ZSBOb24tbmVnYXRpdmUgaW50ZWdlci5cbiAqIEBwYXJhbSBiaW5hcnlPdXRwdXQgT3B0aW9uYWwuIFdoZXRoZXIgdGhlIGtlcm5lbCBzaG91bGQgY291bnQgdGhlIGFwcGVhcmFuY2VcbiAqICAgICBvciBudW1iZXIgb2Ygb2NjdXJyZW5jZXMuIERlZmF1bHRzIHRvIEZhbHNlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1JlZHVjdGlvbid9XG4gKi9cbmZ1bmN0aW9uIGRlbnNlQmluY291bnRfKHgsIHdlaWdodHMsIHNpemUsIGJpbmFyeU91dHB1dCA9IGZhbHNlKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnZGVuc2VCaW5jb3VudCcpO1xuICAgIGNvbnN0ICR3ZWlnaHRzID0gY29udmVydFRvVGVuc29yKHdlaWdodHMsICd3ZWlnaHRzJywgJ2RlbnNlQmluY291bnQnKTtcbiAgICB1dGlsLmFzc2VydCgkeC5kdHlwZSA9PT0gJ2ludDMyJywgKCkgPT4gYEVycm9yIGluIGRlbnNlQmluY291bnQ6IGlucHV0IGAgK1xuICAgICAgICBgZHR5cGUgbXVzdCBiZSBpbnQzMiwgYnV0IGdvdCAkeyR4LmR0eXBlfWApO1xuICAgIHV0aWwuYXNzZXJ0KCR4LnJhbmsgPD0gMiwgKCkgPT4gYEVycm9yIGluIGRlbnNlQmluY291bnQ6IGlucHV0IG11c3QgYmUgYXQgbW9zdCByYW5rIDIsIGJ1dCBnb3QgYCArXG4gICAgICAgIGByYW5rICR7JHgucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoc2l6ZSA+PSAwLCAoKSA9PiBgc2l6ZSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSwgYnV0IGdvdCAke3NpemV9LmApO1xuICAgIHV0aWwuYXNzZXJ0KCR3ZWlnaHRzLnNpemUgPT09ICR4LnNpemUgfHwgJHdlaWdodHMuc2l6ZSA9PT0gMCwgKCkgPT4gYEVycm9yIGluIGRlbnNlQmluY291bnQ6IHdlaWdodHMgbXVzdCBoYXZlIHRoZSBzYW1lIHNoYXBlIGFzIHggb3IgYCArXG4gICAgICAgIGAwLWxlbmd0aCwgYnV0IGdvdCB4IHNoYXBlOiAkeyR4LnNoYXBlfSwgd2VpZ2h0cyBzaGFwZTogYCArXG4gICAgICAgIGAkeyR3ZWlnaHRzLnNoYXBlfS5gKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4LCB3ZWlnaHRzOiAkd2VpZ2h0cyB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBzaXplLCBiaW5hcnlPdXRwdXQgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChEZW5zZUJpbmNvdW50LCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBkZW5zZUJpbmNvdW50ID0gb3AoeyBkZW5zZUJpbmNvdW50XyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRlbnNlX2JpbmNvdW50LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBEZXB0aFRvU3BhY2UgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmVhcnJhbmdlcyBkYXRhIGZyb20gZGVwdGggaW50byBibG9ja3Mgb2Ygc3BhdGlhbCBkYXRhLiBNb3JlIHNwZWNpZmljYWxseSxcbiAqIHRoaXMgb3Agb3V0cHV0cyBhIGNvcHkgb2YgdGhlIGlucHV0IHRlbnNvciB3aGVyZSB2YWx1ZXMgZnJvbSB0aGUgYGRlcHRoYFxuICogZGltZW5zaW9uIGFyZSBtb3ZlZCBpbiBzcGF0aWFsIGJsb2NrcyB0byB0aGUgYGhlaWdodGAgYW5kIGB3aWR0aGAgZGltZW5zaW9ucy5cbiAqIFRoZSBhdHRyIGBibG9ja1NpemVgIGluZGljYXRlcyB0aGUgaW5wdXQgYmxvY2sgc2l6ZSBhbmQgaG93IHRoZSBkYXRhIGlzXG4gKiBtb3ZlZC5cbiAqXG4gKiAgLSBDaHVua3Mgb2YgZGF0YSBvZiBzaXplIGBibG9ja1NpemUgKiBibG9ja1NpemVgIGZyb20gZGVwdGggYXJlIHJlYXJyYW5nZWRcbiAqIGludG8gbm9uLW92ZXJsYXBwaW5nIGJsb2NrcyBvZiBzaXplIGBibG9ja1NpemUgeCBibG9ja1NpemVgXG4gKlxuICogIC0gVGhlIHdpZHRoIHRoZSBvdXRwdXQgdGVuc29yIGlzIGBpbnB1dFdpZHRoICogYmxvY2tTaXplYCwgd2hlcmVhcyB0aGVcbiAqIGhlaWdodCBpcyBgaW5wdXRIZWlnaHQgKiBibG9ja1NpemVgXG4gKlxuICogIC0gVGhlIFksIFggY29vcmRpbmF0ZXMgd2l0aGluIGVhY2ggYmxvY2sgb2YgdGhlIG91dHB1dCBpbWFnZSBhcmUgZGV0ZXJtaW5lZFxuICogYnkgdGhlIGhpZ2ggb3JkZXIgY29tcG9uZW50IG9mIHRoZSBpbnB1dCBjaGFubmVsIGluZGV4XG4gKlxuICogIC0gVGhlIGRlcHRoIG9mIHRoZSBpbnB1dCB0ZW5zb3IgbXVzdCBiZSBkaXZpc2libGUgYnkgYGJsb2NrU2l6ZSAqXG4gKiBibG9ja1NpemVgXG4gKlxuICogVGhlIGBkYXRhRm9ybWF0YCBhdHRyIHNwZWNpZmllcyB0aGUgbGF5b3V0IG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IHRlbnNvcnNcbiAqIHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zOiBcIk5IV0NcIjogWyBgYmF0Y2gsIGhlaWdodCwgd2lkdGgsIGNoYW5uZWxzYCBdXG4gKiBcIk5DSFdcIjogWyBgYmF0Y2gsIGNoYW5uZWxzLCBoZWlnaHQsIHdpZHRoYCBdXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3I0ZChbMSwgMiwgMywgNF0sIFsxLCAxLCAxLCA0XSk7XG4gKiBjb25zdCBibG9ja1NpemUgPSAyO1xuICogY29uc3QgZGF0YUZvcm1hdCA9IFwiTkhXQ1wiO1xuICpcbiAqIHRmLmRlcHRoVG9TcGFjZSh4LCBibG9ja1NpemUsIGRhdGFGb3JtYXQpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yIG9mIHJhbmsgNFxuICogQHBhcmFtIGJsb2NrU0l6ZSAgQW4gYGludGAgdGhhdCBpcyBgPj0gMmAuIFRoZSBzaXplIG9mIHRoZSBzcGF0aWFsIGJsb2NrXG4gKiBAcGFyYW0gZGF0YUZvcm1hdCBBbiBvcHRpb25hbCBzdHJpbmcgZnJvbTogXCJOSFdDXCIsIFwiTkNIV1wiLiBEZWZhdWx0cyB0byBcIk5IV0NcIlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1RyYW5zZm9ybWF0aW9ucyd9XG4gKi9cbmZ1bmN0aW9uIGRlcHRoVG9TcGFjZV8oeCwgYmxvY2tTaXplLCBkYXRhRm9ybWF0ID0gJ05IV0MnKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnZGVwdGhUb1NwYWNlJyk7XG4gICAgY29uc3QgaW5wdXRIZWlnaHQgPSAoZGF0YUZvcm1hdCA9PT0gJ05IV0MnKSA/ICR4LnNoYXBlWzFdIDogJHguc2hhcGVbMl07XG4gICAgY29uc3QgaW5wdXRXaWR0aCA9IChkYXRhRm9ybWF0ID09PSAnTkhXQycpID8gJHguc2hhcGVbMl0gOiAkeC5zaGFwZVszXTtcbiAgICBjb25zdCBpbnB1dERlcHRoID0gKGRhdGFGb3JtYXQgPT09ICdOSFdDJykgPyAkeC5zaGFwZVszXSA6ICR4LnNoYXBlWzFdO1xuICAgIHV0aWwuYXNzZXJ0KGlucHV0SGVpZ2h0ICogYmxvY2tTaXplID49IDAsICgpID0+IGBOZWdhdGl2ZSBkaW1lbnNpb24gc2l6ZSBjYXVzZWQgYnkgb3ZlcmZsb3cgd2hlbiBtdWx0aXBseWluZ1xuICAgICR7aW5wdXRIZWlnaHR9IGFuZCAke2Jsb2NrU2l6ZX0gIGZvciBkZXB0aFRvU3BhY2Ugd2l0aCBpbnB1dCBzaGFwZVxuICAgICR7JHguc2hhcGV9YCk7XG4gICAgdXRpbC5hc3NlcnQoaW5wdXRXaWR0aCAqIGJsb2NrU2l6ZSA+PSAwLCAoKSA9PiBgTmVnYXRpdmUgZGltZW5zaW9uIHNpemUgY2F1c2VkIGJ5IG92ZXJmbG93IHdoZW4gbXVsdGlwbHlpbmdcbiAgICAke2lucHV0V2lkdGh9IGFuZCAke2Jsb2NrU2l6ZX0gZm9yIGRlcHRoVG9TcGFjZSB3aXRoIGlucHV0IHNoYXBlXG4gICAgICAgICR7JHguc2hhcGV9YCk7XG4gICAgdXRpbC5hc3NlcnQoKGlucHV0RGVwdGggJSAoYmxvY2tTaXplICogYmxvY2tTaXplKSA9PT0gMCksICgpID0+IGBEaW1lbnNpb24gc2l6ZSBtdXN0IGJlIGV2ZW5seSBkaXZpc2libGUgYnkgJHtibG9ja1NpemUgKiBibG9ja1NpemV9IGJ1dCBpcyAke2lucHV0RGVwdGh9IGZvciBkZXB0aFRvU3BhY2Ugd2l0aCBpbnB1dCBzaGFwZSAkeyR4LnNoYXBlfWApO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICBjb25zdCBhdHRycyA9IHsgYmxvY2tTaXplLCBkYXRhRm9ybWF0IH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoRGVwdGhUb1NwYWNlLCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBkZXB0aFRvU3BhY2UgPSBvcCh7IGRlcHRoVG9TcGFjZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZXB0aF90b19zcGFjZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgRGVwdGh3aXNlQ29udjJkTmF0aXZlIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbi8qKlxuICogRGVwdGh3aXNlIDJEIGNvbnZvbHV0aW9uLlxuICpcbiAqIEdpdmVuIGEgNEQgYGlucHV0YCBhcnJheSBhbmQgYSBgZmlsdGVyYCBhcnJheSBvZiBzaGFwZVxuICogYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBpbkNoYW5uZWxzLCBjaGFubmVsTXVsdGlwbGllcl1gIGNvbnRhaW5pbmdcbiAqIGBpbkNoYW5uZWxzYCBjb252b2x1dGlvbmFsIGZpbHRlcnMgb2YgZGVwdGggMSwgdGhpcyBvcCBhcHBsaWVzIGFcbiAqIGRpZmZlcmVudCBmaWx0ZXIgdG8gZWFjaCBpbnB1dCBjaGFubmVsIChleHBhbmRpbmcgZnJvbSAxIGNoYW5uZWwgdG9cbiAqIGBjaGFubmVsTXVsdGlwbGllcmAgY2hhbm5lbHMgZm9yIGVhY2gpLCB0aGVuIGNvbmNhdGVuYXRlcyB0aGUgcmVzdWx0c1xuICogdG9nZXRoZXIuIFRoZSBvdXRwdXQgaGFzIGBpbkNoYW5uZWxzICogY2hhbm5lbE11bHRpcGxpZXJgIGNoYW5uZWxzLlxuICpcbiAqIFNlZVxuICogW2h0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9kZXB0aHdpc2VfY29udjJkXShcbiAqICAgICBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vZGVwdGh3aXNlX2NvbnYyZClcbiAqIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciwgb2YgcmFuayA0IG9yIHJhbmsgMywgb2Ygc2hhcGVcbiAqICAgICBgW2JhdGNoLCBoZWlnaHQsIHdpZHRoLCBpbkNoYW5uZWxzXWAuIElmIHJhbmsgMywgYmF0Y2ggb2YgMSBpc1xuICogYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciB0ZW5zb3IsIHJhbmsgNCwgb2Ygc2hhcGVcbiAqICAgICBgW2ZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGluQ2hhbm5lbHMsIGNoYW5uZWxNdWx0aXBsaWVyXWAuXG4gKiBAcGFyYW0gc3RyaWRlcyBUaGUgc3RyaWRlcyBvZiB0aGUgY29udm9sdXRpb246IGBbc3RyaWRlSGVpZ2h0LFxuICogc3RyaWRlV2lkdGhdYC4gSWYgc3RyaWRlcyBpcyBhIHNpbmdsZSBudW1iZXIsIHRoZW4gYHN0cmlkZUhlaWdodCA9PVxuICogc3RyaWRlV2lkdGhgLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobS5cbiAqICAgLSBgc2FtZWAgYW5kIHN0cmlkZSAxOiBvdXRwdXQgd2lsbCBiZSBvZiBzYW1lIHNpemUgYXMgaW5wdXQsXG4gKiAgICAgICByZWdhcmRsZXNzIG9mIGZpbHRlciBzaXplLlxuICogICAtIGB2YWxpZGA6IG91dHB1dCB3aWxsIGJlIHNtYWxsZXIgdGhhbiBpbnB1dCBpZiBmaWx0ZXIgaXMgbGFyZ2VyXG4gKiAgICAgICB0aGFuIDF4MS5cbiAqICAgLSBGb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uXShcbiAqICAgICAgICAgIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbilcbiAqIEBwYXJhbSBkaWxhdGlvbnMgVGhlIGRpbGF0aW9uIHJhdGVzOiBgW2RpbGF0aW9uSGVpZ2h0LCBkaWxhdGlvbldpZHRoXWBcbiAqICAgICBpbiB3aGljaCB3ZSBzYW1wbGUgaW5wdXQgdmFsdWVzIGFjcm9zcyB0aGUgaGVpZ2h0IGFuZCB3aWR0aCBkaW1lbnNpb25zXG4gKiAgICAgaW4gYXRyb3VzIGNvbnZvbHV0aW9uLiBEZWZhdWx0cyB0byBgWzEsIDFdYC4gSWYgYHJhdGVgIGlzIGEgc2luZ2xlXG4gKiAgICAgbnVtYmVyLCB0aGVuIGBkaWxhdGlvbkhlaWdodCA9PSBkaWxhdGlvbldpZHRoYC4gSWYgaXQgaXMgZ3JlYXRlciB0aGFuXG4gKiAgICAgMSwgdGhlbiBhbGwgdmFsdWVzIG9mIGBzdHJpZGVzYCBtdXN0IGJlIDEuXG4gKiBAcGFyYW0gZGF0YUZvcm1hdDogQW4gb3B0aW9uYWwgc3RyaW5nIGZyb206IFwiTkhXQ1wiLCBcIk5DSFdcIi4gRGVmYXVsdHMgdG9cbiAqICAgICBcIk5IV0NcIi4gU3BlY2lmeSB0aGUgZGF0YSBmb3JtYXQgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YS4gV2l0aCB0aGVcbiAqICAgICBkZWZhdWx0IGZvcm1hdCBcIk5IV0NcIiwgdGhlIGRhdGEgaXMgc3RvcmVkIGluIHRoZSBvcmRlciBvZjogW2JhdGNoLFxuICogICAgIGhlaWdodCwgd2lkdGgsIGNoYW5uZWxzXS4gT25seSBcIk5IV0NcIiBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlxuICogQHBhcmFtIGRpbVJvdW5kaW5nTW9kZSBBIHN0cmluZyBmcm9tOiAnY2VpbCcsICdyb3VuZCcsICdmbG9vcicuIElmIG5vbmUgaXNcbiAqICAgICBwcm92aWRlZCwgaXQgd2lsbCBkZWZhdWx0IHRvIHRydW5jYXRlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0NvbnZvbHV0aW9uJ31cbiAqL1xuZnVuY3Rpb24gZGVwdGh3aXNlQ29udjJkXyh4LCBmaWx0ZXIsIHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCA9ICdOSFdDJywgZGlsYXRpb25zID0gWzEsIDFdLCBkaW1Sb3VuZGluZ01vZGUpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdkZXB0aHdpc2VDb252MmQnKTtcbiAgICBjb25zdCAkZmlsdGVyID0gY29udmVydFRvVGVuc29yKGZpbHRlciwgJ2ZpbHRlcicsICdkZXB0aHdpc2VDb252MmQnKTtcbiAgICBsZXQgeDREID0gJHg7XG4gICAgbGV0IHJlc2hhcGVkVG80RCA9IGZhbHNlO1xuICAgIGlmICgkeC5yYW5rID09PSAzKSB7XG4gICAgICAgIHJlc2hhcGVkVG80RCA9IHRydWU7XG4gICAgICAgIHg0RCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV0sICR4LnNoYXBlWzJdXSk7XG4gICAgfVxuICAgIHV0aWwuYXNzZXJ0KHg0RC5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gZGVwdGh3aXNlQ29udjJkOiBpbnB1dCBtdXN0IGJlIHJhbmsgNCwgYnV0IGdvdCBgICtcbiAgICAgICAgYHJhbmsgJHt4NEQucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoJGZpbHRlci5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gZGVwdGh3aXNlQ29udjJkOiBmaWx0ZXIgbXVzdCBiZSByYW5rIDQsIGJ1dCBnb3QgcmFuayBgICtcbiAgICAgICAgYCR7JGZpbHRlci5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydCh4NEQuc2hhcGVbM10gPT09ICRmaWx0ZXIuc2hhcGVbMl0sICgpID0+IGBFcnJvciBpbiBkZXB0aHdpc2VDb252MmQ6IG51bWJlciBvZiBpbnB1dCBjaGFubmVscyBgICtcbiAgICAgICAgYCgke3g0RC5zaGFwZVszXX0pIG11c3QgbWF0Y2ggdGhlIGluQ2hhbm5lbHMgZGltZW5zaW9uIGluIGAgK1xuICAgICAgICBgZmlsdGVyICR7JGZpbHRlci5zaGFwZVsyXX0uYCk7XG4gICAgaWYgKGRpbVJvdW5kaW5nTW9kZSAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNJbnQocGFkKSwgKCkgPT4gYEVycm9yIGluIGRlcHRod2lzZUNvbnYyZDogcGFkIG11c3QgYmUgYW4gaW50ZWdlciB3aGVuIHVzaW5nLCBgICtcbiAgICAgICAgICAgIGBkaW1Sb3VuZGluZ01vZGUgJHtkaW1Sb3VuZGluZ01vZGV9IGJ1dCBnb3QgcGFkICR7cGFkfS5gKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiB4NEQsIGZpbHRlcjogJGZpbHRlciB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQsIGRpbGF0aW9ucywgZGltUm91bmRpbmdNb2RlIH07XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgIGNvbnN0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoRGVwdGh3aXNlQ29udjJkTmF0aXZlLCBpbnB1dHMsIGF0dHJzKTtcbiAgICBpZiAocmVzaGFwZWRUbzREKSB7XG4gICAgICAgIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydCBjb25zdCBkZXB0aHdpc2VDb252MmQgPSBvcCh7IGRlcHRod2lzZUNvbnYyZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZXB0aHdpc2VfY29udjJkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlciB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL3Jlc2hhcGUnO1xuZnVuY3Rpb24gZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXJfKHgsIGR5LCBmaWx0ZXJTaGFwZSwgc3RyaWRlcywgcGFkLCBkaWxhdGlvbnMgPSBbMSwgMV0sIGRpbVJvdW5kaW5nTW9kZSkge1xuICAgIGxldCB4NEQgPSB4O1xuICAgIGlmICh4LnJhbmsgPT09IDMpIHtcbiAgICAgICAgeDREID0gcmVzaGFwZSh4LCBbMSwgeC5zaGFwZVswXSwgeC5zaGFwZVsxXSwgeC5zaGFwZVsyXV0pO1xuICAgIH1cbiAgICBsZXQgZHk0RCA9IGR5O1xuICAgIGlmIChkeTRELnJhbmsgPT09IDMpIHtcbiAgICAgICAgZHk0RCA9IHJlc2hhcGUoZHksIFsxLCBkeS5zaGFwZVswXSwgZHkuc2hhcGVbMV0sIGR5LnNoYXBlWzJdXSk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogeDRELCBkeTogZHk0RCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgZGlsYXRpb25zLCBmaWx0ZXJTaGFwZSB9O1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlciwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIgPSBvcCh7IGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRlcHRod2lzZV9jb252MmRfbmF0aXZlX2JhY2twcm9wX2ZpbHRlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL3Jlc2hhcGUnO1xuZnVuY3Rpb24gZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dF8oeFNoYXBlLCBkeSwgZmlsdGVyLCBzdHJpZGVzLCBwYWQsIGRpbGF0aW9ucyA9IFsxLCAxXSwgZGltUm91bmRpbmdNb2RlKSB7XG4gICAgbGV0IGR5NEQgPSBkeTtcbiAgICBsZXQgcmVzaGFwZWRUbzREID0gZmFsc2U7XG4gICAgaWYgKGR5LnJhbmsgPT09IDMpIHtcbiAgICAgICAgcmVzaGFwZWRUbzREID0gdHJ1ZTtcbiAgICAgICAgZHk0RCA9IHJlc2hhcGUoZHksIFsxLCBkeS5zaGFwZVswXSwgZHkuc2hhcGVbMV0sIGR5LnNoYXBlWzJdXSk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0cyA9IHsgZHk6IGR5NEQsIGZpbHRlciB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgZGlsYXRpb25zLCBpbnB1dFNoYXBlOiB4U2hhcGUgfTtcbiAgICBjb25zdCByZXMgPSBcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgRU5HSU5FLnJ1bktlcm5lbChEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0LCBpbnB1dHMsIGF0dHJzKTtcbiAgICBpZiAocmVzaGFwZWRUbzREKSB7XG4gICAgICAgIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydCBjb25zdCBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0ID0gb3AoeyBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0XyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRlcHRod2lzZV9jb252MmRfbmF0aXZlX2JhY2twcm9wX2lucHV0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBEaWFnIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV0dXJucyBhIGRpYWdvbmFsIHRlbnNvciB3aXRoIGEgZ2l2ZW4gZGlhZ29uYWwgdmFsdWVzLlxuICpcbiAqIEdpdmVuIGEgZGlhZ29uYWwsIHRoaXMgb3BlcmF0aW9uIHJldHVybnMgYSB0ZW5zb3Igd2l0aCB0aGUgZGlhZ29uYWwgYW5kXG4gKiBldmVyeXRoaW5nIGVsc2UgcGFkZGVkIHdpdGggemVyb3MuXG4gKlxuICogQXNzdW1lIHRoZSBpbnB1dCBoYXMgZGltZW5zaW9ucyBgW0QxLC4uLiwgRGtdYCwgdGhlbiB0aGUgb3V0cHV0IGlzIGEgdGVuc29yXG4gKiBvZiByYW5rIDJrIHdpdGggZGltZW5zaW9ucyBgW0QxLC4uLiwgRGssIEQxLC4uLiwgRGtdYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDMsIDRdKTtcbiAqXG4gKiB0Zi5kaWFnKHgpLnByaW50KClcbiAqIGBgYFxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgMywgNCwgNSwgNiwgNiwgOF0sIFs0LCAyXSlcbiAqXG4gKiB0Zi5kaWFnKHgpLnByaW50KClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmZ1bmN0aW9uIGRpYWdfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdkaWFnJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKERpYWcsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgZGlhZyA9IG9wKHsgZGlhZ18gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaWFnLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBEaWxhdGlvbjJEIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIGdyYXlzY2FsZSBkaWxhdGlvbiBvdmVyIHRoZSBpbnB1dCBgeGAuXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciwgcmFuayAzIG9yIHJhbmsgNCBvZiBzaGFwZVxuICogICAgIGBbYmF0Y2gsIGhlaWdodCwgd2lkdGgsIGluQ2hhbm5lbHNdYC4gSWYgcmFuayAzLCBiYXRjaCBvZiAxIGlzIGFzc3VtZWQuXG4gKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgdGVuc29yLCByYW5rIDMsIG9mIHNoYXBlXG4gKiAgICAgYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBkZXB0aF1gLlxuICogQHBhcmFtIHN0cmlkZXMgVGhlIHN0cmlkZXMgb2YgdGhlIHNsaWRpbmcgd2luZG93IGZvciBlYWNoIGRpbWVuc2lvbiBvZiB0aGVcbiAqICAgICBpbnB1dCB0ZW5zb3I6IGBbc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aF1gLlxuICogICAgIElmIGBzdHJpZGVzYCBpcyBhIHNpbmdsZSBudW1iZXIsXG4gKiAgICAgdGhlbiBgc3RyaWRlSGVpZ2h0ID09IHN0cmlkZVdpZHRoYC5cbiAqIEBwYXJhbSBwYWQgVGhlIHR5cGUgb2YgcGFkZGluZyBhbGdvcml0aG0uXG4gKiAgICAtIGBzYW1lYCBhbmQgc3RyaWRlIDE6IG91dHB1dCB3aWxsIGJlIG9mIHNhbWUgc2l6ZSBhcyBpbnB1dCxcbiAqICAgICAgIHJlZ2FyZGxlc3Mgb2YgZmlsdGVyIHNpemUuXG4gKiAgICAtIGB2YWxpZGA6IG91dHB1dCB3aWxsIGJlIHNtYWxsZXIgdGhhbiBpbnB1dCBpZiBmaWx0ZXIgaXMgbGFyZ2VyXG4gKiAgICAgICB0aGFuIDEqMXgxLlxuICogICAgLSBGb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uXShcbiAqICAgICAgICAgIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbilcbiAqIEBwYXJhbSBkYXRhRm9ybWF0IFNwZWNpZnkgdGhlIGRhdGEgZm9ybWF0IG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEuXG4gKiAgICAgIERlZmF1bHRzIHRvICdOSFdDJy4gT25seSAnTkhXQycgaXMgY3VycmVudGx5IHN1cHBvcnRlZC4gV2l0aCB0aGVcbiAqICAgICAgZGVmYXVsdCBmb3JtYXQgXCJOSFdDXCIsIHRoZSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgb3JkZXIgb2Y6IFtiYXRjaCxcbiAqICAgICAgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbHNdLlxuICogQHBhcmFtIGRpbGF0aW9ucyBUaGUgZGlsYXRpb24gcmF0ZXM6IGBbZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGhdYFxuICogICAgIGluIHdoaWNoIHdlIHNhbXBsZSBpbnB1dCB2YWx1ZXMgYWNyb3NzIHRoZSBoZWlnaHQgYW5kIHdpZHRoIGRpbWVuc2lvbnNcbiAqICAgICBmb3IgYXRyb3VzIG1vcnBob2xvZ2ljYWwgZGlsYXRpb24uIERlZmF1bHRzIHRvIGBbMSwgMV1gLiBJZiBgZGlsYXRpb25zYFxuICogICAgIGlzIGEgc2luZ2xlIG51bWJlciwgdGhlbiBgZGlsYXRpb25IZWlnaHQgPT0gZGlsYXRpb25XaWR0aGAuIElmIGl0IGlzXG4gKiAgICAgZ3JlYXRlciB0aGFuIDEsIHRoZW4gYWxsIHZhbHVlcyBvZiBgc3RyaWRlc2AgbXVzdCBiZSAxLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0NvbnZvbHV0aW9uJ31cbiAqL1xuZnVuY3Rpb24gZGlsYXRpb24yZF8oeCwgZmlsdGVyLCBzdHJpZGVzLCBwYWQsIGRpbGF0aW9ucyA9IFsxLCAxXSwgZGF0YUZvcm1hdCA9ICdOSFdDJykge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2RpbGF0aW9uMmQnKTtcbiAgICBjb25zdCAkZmlsdGVyID0gY29udmVydFRvVGVuc29yKGZpbHRlciwgJ2ZpbHRlcicsICdkaWxhdGlvbjJkJyk7XG4gICAgdXRpbC5hc3NlcnQoJHgucmFuayA9PT0gMyB8fCAkeC5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gZGlsYXRpb24yZDogaW5wdXQgbXVzdCBiZSByYW5rIDMgb3IgNCwgYnV0IGdvdCByYW5rIGAgK1xuICAgICAgICBgJHskeC5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydCgkZmlsdGVyLnJhbmsgPT09IDMsICgpID0+IGBFcnJvciBpbiBkaWxhdGlvbjJkOiBmaWx0ZXIgbXVzdCBiZSByYW5rIDMsIGJ1dCBnb3QgcmFuayBgICtcbiAgICAgICAgYCR7JGZpbHRlci5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydChkYXRhRm9ybWF0ID09PSAnTkhXQycsICgpID0+IGBFcnJvciBpbiBkaWxhdGlvbjJkOiBPbmx5IE5IV0MgaXMgY3VycmVudGx5IHN1cHBvcnRlZCwgYCArXG4gICAgICAgIGBidXQgZ290IGRhdGFGb3JtYXQgb2YgJHtkYXRhRm9ybWF0fWApO1xuICAgIGxldCB4NEQgPSAkeDtcbiAgICBsZXQgcmVzaGFwZWRUbzREID0gZmFsc2U7XG4gICAgaWYgKCR4LnJhbmsgPT09IDMpIHtcbiAgICAgICAgeDREID0gcmVzaGFwZSgkeCwgWzEsICR4LnNoYXBlWzBdLCAkeC5zaGFwZVsxXSwgJHguc2hhcGVbMl1dKTtcbiAgICAgICAgcmVzaGFwZWRUbzREID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiB4NEQsIGZpbHRlcjogJGZpbHRlciB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBzdHJpZGVzLCBwYWQsIGRpbGF0aW9ucyB9O1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICBjb25zdCByZXMgPSBFTkdJTkUucnVuS2VybmVsKERpbGF0aW9uMkQsIGlucHV0cywgYXR0cnMpO1xuICAgIGlmIChyZXNoYXBlZFRvNEQpIHtcbiAgICAgICAgcmV0dXJuIHJlc2hhcGUocmVzLCBbcmVzLnNoYXBlWzFdLCByZXMuc2hhcGVbMl0sIHJlcy5zaGFwZVszXV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IGRpbGF0aW9uMmQgPSBvcCh7IGRpbGF0aW9uMmRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGlsYXRpb24yZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgUmVhbERpdiB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBtYWtlVHlwZXNNYXRjaCB9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBmbG9vckRpdiB9IGZyb20gJy4vZmxvb3JEaXYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIERpdmlkZXMgdHdvIGB0Zi5UZW5zb3JgcyBlbGVtZW50LXdpc2UsIEEgLyBCLiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgNCwgOSwgMTZdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbMSwgMiwgMywgNF0pO1xuICpcbiAqIGEuZGl2KGIpLnByaW50KCk7ICAvLyBvciB0Zi5kaXYoYSwgYilcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBCcm9hZGNhc3QgZGl2IGEgd2l0aCBiLlxuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsyLCA0LCA2LCA4XSk7XG4gKiBjb25zdCBiID0gdGYuc2NhbGFyKDIpO1xuICpcbiAqIGEuZGl2KGIpLnByaW50KCk7ICAvLyBvciB0Zi5kaXYoYSwgYilcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCB0ZW5zb3IgYXMgdGhlIG51bWVyYXRvci5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgdGVuc29yIGFzIHRoZSBkZW5vbWluYXRvci4gTXVzdCBoYXZlIHRoZSBzYW1lIGR0eXBlIGFzXG4gKiBgYWAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQXJpdGhtZXRpYyd9XG4gKi9cbmZ1bmN0aW9uIGRpdl8oYSwgYikge1xuICAgIGxldCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdkaXYnKTtcbiAgICBsZXQgJGIgPSBjb252ZXJ0VG9UZW5zb3IoYiwgJ2InLCAnZGl2Jyk7XG4gICAgWyRhLCAkYl0gPSBtYWtlVHlwZXNNYXRjaCgkYSwgJGIpO1xuICAgIGlmICgkYS5kdHlwZSA9PT0gJ2ludDMyJyAmJiAkYi5kdHlwZSA9PT0gJ2ludDMyJykge1xuICAgICAgICByZXR1cm4gZmxvb3JEaXYoJGEsICRiKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyBhOiAkYSwgYjogJGIgfTtcbiAgICBjb25zdCBhdHRycyA9IHt9O1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChSZWFsRGl2LCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBkaXYgPSBvcCh7IGRpdl8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaXYuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgbWFrZVR5cGVzTWF0Y2ggfSBmcm9tICcuLi90ZW5zb3JfdXRpbCc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgZGl2IH0gZnJvbSAnLi9kaXYnO1xuaW1wb3J0IHsgZXF1YWwgfSBmcm9tICcuL2VxdWFsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgd2hlcmUgfSBmcm9tICcuL3doZXJlJztcbmltcG9ydCB7IHplcm9zTGlrZSB9IGZyb20gJy4vemVyb3NfbGlrZSc7XG4vKipcbiAqIERpdmlkZXMgdHdvIGB0Zi5UZW5zb3JgcyBlbGVtZW50LXdpc2UsIEEgLyBCLiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuIFJldHVybiAwXG4gKiBpZiBkZW5vbWluYXRvciBpcyAwLlxuICpcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCA0LCA5LCAxNl0pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzLCA0XSk7XG4gKiBjb25zdCBjID0gdGYudGVuc29yMWQoWzAsIDAsIDAsIDBdKTtcbiAqXG4gKiBhLmRpdk5vTmFuKGIpLnByaW50KCk7ICAvLyBvciB0Zi5kaXZOb05hbihhLCBiKVxuICogYS5kaXZOb05hbihjKS5wcmludCgpOyAgLy8gb3IgdGYuZGl2Tm9OYW4oYSwgYylcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBCcm9hZGNhc3QgZGl2IGEgd2l0aCBiLlxuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsyLCA0LCA2LCA4XSk7XG4gKiBjb25zdCBiID0gdGYuc2NhbGFyKDIpO1xuICogY29uc3QgYyA9IHRmLnNjYWxhcigwKTtcbiAqXG4gKiBhLmRpdk5vTmFuKGIpLnByaW50KCk7ICAvLyBvciB0Zi5kaXZOb05hbihhLCBiKVxuICogYS5kaXZOb05hbihjKS5wcmludCgpOyAgLy8gb3IgdGYuZGl2Tm9OYW4oYSwgYylcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCB0ZW5zb3IgYXMgdGhlIG51bWVyYXRvci5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgdGVuc29yIGFzIHRoZSBkZW5vbWluYXRvci4gTXVzdCBoYXZlIHRoZSBzYW1lIGR0eXBlIGFzXG4gKiBgYWAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQXJpdGhtZXRpYyd9XG4gKi9cbmZ1bmN0aW9uIGRpdk5vTmFuXyhhLCBiKSB7XG4gICAgLy8gVE9ETzogTWFrZSB0aGlzIGludG8gaXRzIG93biBrZXJuZWwuXG4gICAgbGV0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ2RpdicpO1xuICAgIGxldCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdkaXYnKTtcbiAgICBbJGEsICRiXSA9IG1ha2VUeXBlc01hdGNoKCRhLCAkYik7XG4gICAgY29uc3QgZGl2UmVzdWx0ID0gZGl2KCRhLCAkYik7XG4gICAgY29uc3QgemVyb3MgPSB6ZXJvc0xpa2UoZGl2UmVzdWx0KTtcbiAgICBjb25zdCBiRXF1YWxzWmVybyA9IGVxdWFsKCRiLCB6ZXJvcyk7XG4gICAgcmV0dXJuIHdoZXJlKGJFcXVhbHNaZXJvLCB6ZXJvcywgZGl2UmVzdWx0KTtcbn1cbmV4cG9ydCBjb25zdCBkaXZOb05hbiA9IG9wKHsgZGl2Tm9OYW5fIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGl2X25vX25hbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG1hdE11bCB9IGZyb20gJy4vbWF0X211bCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL3Jlc2hhcGUnO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIG1hdHJpY2VzIGFuZC9vciB2ZWN0b3JzLCBgdDFgIGFuZCBgdDJgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDJdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IyZChbWzEsIDJdLCBbMywgNF1dKTtcbiAqIGNvbnN0IGMgPSB0Zi50ZW5zb3IyZChbWzEsIDIsIDNdLCBbNCwgNSwgNl1dKTtcbiAqXG4gKiBhLmRvdChiKS5wcmludCgpOyAgLy8gb3IgdGYuZG90KGEsIGIpXG4gKiBiLmRvdChhKS5wcmludCgpO1xuICogYi5kb3QoYykucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIHQxIFRoZSBmaXJzdCB0ZW5zb3IgaW4gdGhlIGRvdCBvcGVyYXRpb24uXG4gKiBAcGFyYW0gdDIgVGhlIHNlY29uZCB0ZW5zb3IgaW4gdGhlIGRvdCBvcGVyYXRpb24uXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTWF0cmljZXMnfVxuICovXG5mdW5jdGlvbiBkb3RfKHQxLCB0Mikge1xuICAgIGNvbnN0ICR0MSA9IGNvbnZlcnRUb1RlbnNvcih0MSwgJ3QxJywgJ2RvdCcpO1xuICAgIGNvbnN0ICR0MiA9IGNvbnZlcnRUb1RlbnNvcih0MiwgJ3QyJywgJ2RvdCcpO1xuICAgIHV0aWwuYXNzZXJ0KCgkdDEucmFuayA9PT0gMSB8fCAkdDEucmFuayA9PT0gMikgJiYgKCR0Mi5yYW5rID09PSAxIHx8ICR0Mi5yYW5rID09PSAyKSwgKCkgPT4gYEVycm9yIGluIGRvdDogaW5wdXRzIG11c3QgYWxsIGJlIHJhbmsgMSBvciAyLCBidXQgZ290IHJhbmtzIGAgK1xuICAgICAgICBgJHskdDEucmFua30gYW5kICR7JHQyLnJhbmt9LmApO1xuICAgIGNvbnN0IHQxSW5uZXIgPSAoJHQxLnJhbmsgPT09IDEgPyAkdDEuc2l6ZSA6ICR0MS5zaGFwZVsxXSk7XG4gICAgY29uc3QgdDJJbm5lciA9ICgkdDIucmFuayA9PT0gMSA/ICR0Mi5zaXplIDogJHQyLnNoYXBlWzBdKTtcbiAgICB1dGlsLmFzc2VydCh0MUlubmVyID09PSB0MklubmVyLCAoKSA9PiBgRXJyb3IgaW4gZG90OiBpbm5lciBkaW1lbnNpb25zIG9mIGlucHV0cyBtdXN0IG1hdGNoLCBidXQgZ290IGAgK1xuICAgICAgICBgJHt0MUlubmVyfSBhbmQgJHt0MklubmVyfS5gKTtcbiAgICBpZiAoJHQxLnJhbmsgPT09IDEgJiYgJHQyLnJhbmsgPT09IDEpIHtcbiAgICAgICAgY29uc3QgdDEyRCA9IHJlc2hhcGUoJHQxLCBbMSwgLTFdKTtcbiAgICAgICAgY29uc3QgdDIyRCA9IHJlc2hhcGUoJHQyLCBbLTEsIDFdKTtcbiAgICAgICAgY29uc3QgdDF0MiA9IG1hdE11bCh0MTJELCB0MjJEKTtcbiAgICAgICAgcmV0dXJuIHJlc2hhcGUodDF0MiwgW10pO1xuICAgIH1cbiAgICBlbHNlIGlmICgkdDEucmFuayA9PT0gMSAmJiAkdDIucmFuayA9PT0gMikge1xuICAgICAgICBjb25zdCB0MTJEID0gcmVzaGFwZSgkdDEsIFsxLCAtMV0pO1xuICAgICAgICBjb25zdCB0MjJEID0gcmVzaGFwZSgkdDIsIFskdDIuc2hhcGVbMF0sICR0Mi5zaGFwZVsxXV0pO1xuICAgICAgICBjb25zdCB0MXQyID0gbWF0TXVsKHQxMkQsIHQyMkQpO1xuICAgICAgICByZXR1cm4gcmVzaGFwZSh0MXQyLCBbdDF0Mi5zaXplXSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKCR0MS5yYW5rID09PSAyICYmICR0Mi5yYW5rID09PSAxKSB7XG4gICAgICAgIGNvbnN0IHQyMkQgPSByZXNoYXBlKCR0MiwgWy0xLCAxXSk7XG4gICAgICAgIGNvbnN0IHQxdDIgPSBtYXRNdWwoJHQxLCB0MjJEKTtcbiAgICAgICAgcmV0dXJuIHJlc2hhcGUodDF0MiwgW3QxdDIuc2l6ZV0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgdDIyRCA9IHJlc2hhcGUoJHQyLCBbJHQyLnNoYXBlWzBdLCAkdDIuc2hhcGVbMV1dKTtcbiAgICAgICAgY29uc3QgdDF0MiA9IG1hdE11bCgkdDEsIHQyMkQpO1xuICAgICAgICByZXR1cm4gdDF0MjtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgZG90ID0gb3AoeyBkb3RfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZG90LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFRlbnNvciB9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IGFkZCB9IGZyb20gJy4vYWRkJztcbmltcG9ydCB7IGRpdiB9IGZyb20gJy4vZGl2JztcbmltcG9ydCB7IGdldE5vaXNlU2hhcGUgfSBmcm9tICcuL2Ryb3BvdXRfdXRpbCc7XG5pbXBvcnQgeyBmbG9vciB9IGZyb20gJy4vZmxvb3InO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi9tdWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByYW5kb21Vbmlmb3JtIH0gZnJvbSAnLi9yYW5kb21fdW5pZm9ybSc7XG4vKipcbiAqIENvbXB1dGVzIGRyb3BvdXQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgMiwgMV0pO1xuICogY29uc3QgcmF0ZSA9IDAuNzU7XG4gKiBjb25zdCBvdXRwdXQgPSB0Zi5kcm9wb3V0KHgsIHJhdGUpO1xuICogb3V0cHV0LnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBBIGZsb2F0aW5nIHBvaW50IFRlbnNvciBvciBUZW5zb3JMaWtlLlxuICogQHBhcmFtIHJhdGUgQSBmbG9hdCBpbiB0aGUgcmFuZ2UgWzAsIDEpLiBUaGUgcHJvYmFiaWxpdHkgdGhhdCBlYWNoIGVsZW1lbnRcbiAqICAgb2YgeCBpcyBkaXNjYXJkZWQuXG4gKiBAcGFyYW0gbm9pc2VTaGFwZSBBbiBhcnJheSBvZiBudW1iZXJzIG9mIHR5cGUgaW50MzIsIHJlcHJlc2VudGluZyB0aGVcbiAqIHNoYXBlIGZvciByYW5kb21seSBnZW5lcmF0ZWQga2VlcC9kcm9wIGZsYWdzLiBJZiB0aGUgbm9pc2VTaGFwZSBoYXMgbnVsbFxuICogdmFsdWUsIGl0IHdpbGwgYmUgYXV0b21hdGljYWxseSByZXBsYWNlZCB3aXRoIHRoZSB4J3MgcmVsYXRpdmUgZGltZW5zaW9uXG4gKiBzaXplLiBPcHRpb25hbC5cbiAqIEBwYXJhbSBzZWVkIFVzZWQgdG8gY3JlYXRlIHJhbmRvbSBzZWVkcy4gT3B0aW9uYWwuXG4gKiBAcmV0dXJucyBBIFRlbnNvciBvZiB0aGUgc2FtZSBzaGFwZSBvZiB4LlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Ryb3BvdXQnfVxuICovXG5mdW5jdGlvbiBkcm9wb3V0Xyh4LCByYXRlLCBub2lzZVNoYXBlLCBzZWVkKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnZHJvcG91dCcpO1xuICAgIHV0aWwuYXNzZXJ0KCR4LmR0eXBlID09PSAnZmxvYXQzMicsICgpID0+IGB4IGhhcyB0byBiZSBhIGZsb2F0aW5nIHBvaW50IHRlbnNvciBzaW5jZSBpdCdzIGdvaW5nIHRvIGJlIGAgK1xuICAgICAgICBgc2NhbGVkLCBidXQgZ290IGEgJHskeC5kdHlwZX0gdGVuc29yIGluc3RlYWQuYCk7XG4gICAgdXRpbC5hc3NlcnQocmF0ZSA+PSAwICYmIHJhdGUgPCAxLCAoKSA9PiBgcmF0ZSBtdXN0IGJlIGEgZmxvYXQgaW4gdGhlIHJhbmdlIFswLCAxKSwgYnV0IGdvdCAke3JhdGV9LmApO1xuICAgIGlmIChyYXRlID09PSAwKSB7XG4gICAgICAgIHJldHVybiB4IGluc3RhbmNlb2YgVGVuc29yID8gJHguY2xvbmUoKSA6ICR4O1xuICAgIH1cbiAgICBjb25zdCAkbm9pc2VTaGFwZSA9IGdldE5vaXNlU2hhcGUoJHgsIG5vaXNlU2hhcGUpO1xuICAgIGNvbnN0IGtlZXBQcm9iID0gMSAtIHJhdGU7XG4gICAgY29uc3QgbXVsdGlwbGllciA9IGRpdihmbG9vcihhZGQocmFuZG9tVW5pZm9ybSgkbm9pc2VTaGFwZSwgMCwgMSwgJ2Zsb2F0MzInLCBzZWVkKSwga2VlcFByb2IpKSwga2VlcFByb2IpO1xuICAgIHJldHVybiBtdWwoJHgsIG11bHRpcGxpZXIpO1xufVxuZXhwb3J0IGNvbnN0IGRyb3BvdXQgPSBvcCh7IGRyb3BvdXRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZHJvcG91dC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuLyoqXG4gKiBOb3JtYWxpemUgbm9pc2Ugc2hhcGUgYmFzZWQgb24gcHJvdmlkZWQgdGVuc29yIGFuZCBub2lzZSBzaGFwZS5cbiAqXG4gKiBAcGFyYW0geCBUZW5zb3IuXG4gKiBAcGFyYW0gbm9pc2VTaGFwZSBUaGUgc2hhcGUgZm9yIHRoZSByYW5kb21seSBnZW5lcmF0ZWQga2VlcC9kcm9wIGZsYWdzLCBhc1xuICogICBhbiBhcnJheSBvZiBudW1iZXJzLiBPcHRpb25hbC5cbiAqIEByZXR1cm5zIE5vcm1hbGl6ZWQgbm9pc2Ugc2hhcGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROb2lzZVNoYXBlKHgsIG5vaXNlU2hhcGUpIHtcbiAgICBpZiAobm9pc2VTaGFwZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB4LnNoYXBlLnNsaWNlKCk7XG4gICAgfVxuICAgIGlmICh1dGlsLmFycmF5c0VxdWFsKHguc2hhcGUsIG5vaXNlU2hhcGUpKSB7XG4gICAgICAgIHJldHVybiBub2lzZVNoYXBlO1xuICAgIH1cbiAgICBpZiAoeC5zaGFwZS5sZW5ndGggPT09IG5vaXNlU2hhcGUubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IG5ld0RpbWVuc2lvbiA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHguc2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChub2lzZVNoYXBlW2ldID09IG51bGwgJiYgeC5zaGFwZVtpXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbmV3RGltZW5zaW9uLnB1c2goeC5zaGFwZVtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXdEaW1lbnNpb24ucHVzaChub2lzZVNoYXBlW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3RGltZW5zaW9uO1xuICAgIH1cbiAgICByZXR1cm4gbm9pc2VTaGFwZTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRyb3BvdXRfdXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgRWluc3VtIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogVGVuc29yIGNvbnRyYWN0aW9uIG92ZXIgc3BlY2lmaWVkIGluZGljZXMgYW5kIG91dGVyIHByb2R1Y3QuXG4gKlxuICogYGVpbnN1bWAgYWxsb3dzIGRlZmluaW5nIFRlbnNvcnMgYnkgZGVmaW5pbmcgdGhlaXIgZWxlbWVudC13aXNlIGNvbXB1dGF0aW9uLlxuICogVGhpcyBjb21wdXRhdGlvbiBpcyBiYXNlZCBvblxuICogW0VpbnN0ZWluIHN1bW1hdGlvbl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRWluc3RlaW5fbm90YXRpb24pLlxuICpcbiAqIFNvbWUgc3BlY2lhbCBjYXNlcyBpbmNsdWRlOlxuICpcbiAqIE1hdHJpeCBtdWx0aXBsaWNhdGlvbjpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoW1sxLCAyLCAzXSwgWzQsIDUsIDZdXSk7XG4gKiBjb25zdCB5ID0gdGYudGVuc29yMmQoW1swLCAxXSwgWzIsIDNdLCBbNCwgNV1dKTtcbiAqIHgucHJpbnQoKTtcbiAqIHkucHJpbnQoKTtcbiAqIHRmLmVpbnN1bSgnaWosamstPmlrJywgeCwgeSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIERvdCBwcm9kdWN0OlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICogY29uc3QgeSA9IHRmLnRlbnNvcjFkKFswLCAxLCAyXSk7XG4gKiB4LnByaW50KCk7XG4gKiB5LnByaW50KCk7XG4gKiB0Zi5laW5zdW0oJ2ksaS0+JywgeCwgeSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEJhdGNoIGRvdCBwcm9kdWN0OlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IyZChbWzEsIDIsIDNdLCBbNCwgNSwgNl1dKTtcbiAqIGNvbnN0IHkgPSB0Zi50ZW5zb3IyZChbWzAsIDEsIDJdLCBbMywgNCwgNV1dKTtcbiAqIHgucHJpbnQoKTtcbiAqIHkucHJpbnQoKTtcbiAqIHRmLmVpbnN1bSgnYmksYmktPmInLCB4LCB5KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogT3V0ZXIgcHJvdWR1Y3Q6XG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAzLCA1XSk7XG4gKiBjb25zdCB5ID0gdGYudGVuc29yMWQoWzIsIDQsIDZdKTtcbiAqIHgucHJpbnQoKTtcbiAqIHkucHJpbnQoKTtcbiAqIHRmLmVpbnN1bSgnaSxqLT5paicsIHgsIHkpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBNYXRyaXggdHJhbnNwb3NlOlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IyZChbWzEsIDJdLCBbMywgNF1dKTtcbiAqIHgucHJpbnQoKTtcbiAqIHRmLmVpbnN1bSgnaWotPmppJywgeCkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEJhdGNoIG1hdHJpeCB0cmFuc3Bvc2U6XG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjNkKFtbWzEsIDJdLCBbMywgNF1dLCBbWy0xLCAtMl0sIFstMywgLTRdXV0pO1xuICogeC5wcmludCgpO1xuICogdGYuZWluc3VtKCdiaWotPmJqaScsIHgpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBMaW1pdGF0aW9uczpcbiAqXG4gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIGVpbnN1bSBoYXMgdGhlIGZvbGxvd2luZyBsaW1pdGF0aW9uczpcbiAqXG4gKiAtIERvZXMgbm90IHN1cHBvcnQgPjIgaW5wdXQgdGVuc29ycy5cbiAqIC0gRG9lcyBub3Qgc3VwcG9ydCBkdXBsaWNhdGUgYXhlcyBmb3IgYW55IGdpdmVuIGlucHV0IHRlbnNvci4gRS5nLiwgZXF1YXRpb25cbiAqICAgJ2lpLT4nIGlzIG5vdCBzdXBwb3RlZC5cbiAqIC0gVGhlIGAuLi5gIG5vdGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuXG4gKlxuICogQHBhcmFtIGVxdWF0aW9uIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGNvbnRyYWN0aW9uLCBpbiB0aGUgc2FtZSBmb3JtYXQgYXNcbiAqIFtudW1weS5laW5zdW1dKGh0dHBzOi8vbnVtcHkub3JnL2RvYy9zdGFibGUvcmVmZXJlbmNlL2dlbmVyYXRlZC9udW1weS5laW5zdW0uaHRtbCkuXG4gKiBAcGFyYW0gdGVuc29ycyB0aGUgaW5wdXQocykgdG8gY29udHJhY3QgKGVhY2ggb25lIGEgVGVuc29yKSwgd2hvc2Ugc2hhcGVzXG4gKiAgICAgc2hvdWxkIGJlIGNvbnNpc3RlbnQgd2l0aCBlcXVhdGlvbi5cbiAqIEByZXR1cm5zIFRoZSBvdXRwdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ01hdHJpY2VzJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVpbnN1bV8oZXF1YXRpb24sIC4uLnRlbnNvcnMpIHtcbiAgICBjb25zdCAkdGVuc29ycyA9IHRlbnNvcnMubWFwKCh0LCBpKSA9PiBjb252ZXJ0VG9UZW5zb3IodCwgYHRlbnNvcnMke2l9YCwgJ2VpbnN1bScpKTtcbiAgICBjb25zdCBhdHRycyA9IHsgZXF1YXRpb24gfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChFaW5zdW0sICR0ZW5zb3JzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgZWluc3VtID0gb3AoeyBlaW5zdW1fIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZWluc3VtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBFbHUgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBleHBvbmVudGlhbCBsaW5lYXIgZWxlbWVudC13aXNlOiBgeCA+IDAgPyBlIF4geCAtIDEgOiAwYC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFstMSwgMSwgLTMsIDJdKTtcbiAqXG4gKiB4LmVsdSgpLnByaW50KCk7ICAvLyBvciB0Zi5lbHUoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gZWx1Xyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnZWx1Jyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEVsdSwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBlbHUgPSBvcCh7IGVsdV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lbHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEVxdWFsIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IG1ha2VUeXBlc01hdGNoIH0gZnJvbSAnLi4vdGVuc29yX3V0aWwnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlIH0gZnJvbSAnLi9icm9hZGNhc3RfdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV0dXJucyB0aGUgdHJ1dGggdmFsdWUgb2YgKGEgPT0gYikgZWxlbWVudC13aXNlLiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFsyLCAyLCAyXSk7XG4gKlxuICogYS5lcXVhbChiKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGEgVGhlIGZpcnN0IGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgaW5wdXQgdGVuc29yLiBNdXN0IGhhdmUgdGhlIHNhbWUgZHR5cGUgYXMgYGFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0xvZ2ljYWwnfVxuICovXG5mdW5jdGlvbiBlcXVhbF8oYSwgYikge1xuICAgIGxldCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdlcXVhbCcsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICAgIGxldCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdlcXVhbCcsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICAgIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcbiAgICBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSgkYS5zaGFwZSwgJGIuc2hhcGUpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgYTogJGEsIGI6ICRiIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoRXF1YWwsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgZXF1YWwgPSBvcCh7IGVxdWFsXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVxdWFsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBFcmYgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBjYXN0IH0gZnJvbSAnLi9jYXN0JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBnYXVzZSBlcnJvciBmdW5jdGlvbiBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOlxuICogYGVyZih4KWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFswLCAuMSwgLS4xLCAuN10pO1xuICpcbiAqIHguZXJmKCkucHJpbnQoKTsgLy8gb3IgdGYuZXJmKHgpO1xuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBlcmZfKHgpIHtcbiAgICBsZXQgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnZXJmJyk7XG4gICAgdXRpbC5hc3NlcnQoJHguZHR5cGUgPT09ICdpbnQzMicgfHwgJHguZHR5cGUgPT09ICdmbG9hdDMyJywgKCkgPT4gJ0lucHV0IGR0eXBlIG11c3QgYmUgYGludDMyYCBvciBgZmxvYXQzMmAuJyk7XG4gICAgaWYgKCR4LmR0eXBlID09PSAnaW50MzInKSB7XG4gICAgICAgICR4ID0gY2FzdCgkeCwgJ2Zsb2F0MzInKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEVyZiwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBlcmYgPSBvcCh7IGVyZl8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lcmYuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuZXhwb3J0IGNvbnN0IEVSRl9QID0gMC4zMjc1OTExO1xuZXhwb3J0IGNvbnN0IEVSRl9BMSA9IDAuMjU0ODI5NTkyO1xuZXhwb3J0IGNvbnN0IEVSRl9BMiA9IC0wLjI4NDQ5NjczNjtcbmV4cG9ydCBjb25zdCBFUkZfQTMgPSAxLjQyMTQxMzc0MTtcbmV4cG9ydCBjb25zdCBFUkZfQTQgPSAtMS40NTMxNTIwMjc7XG5leHBvcnQgY29uc3QgRVJGX0E1ID0gMS4wNjE0MDU0Mjk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lcmZfdXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgRXhwIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgZXhwb25lbnRpYWwgb2YgdGhlIGlucHV0IGB0Zi5UZW5zb3JgIGVsZW1lbnQtd2lzZS4gYGUgXiB4YFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIC0zXSk7XG4gKlxuICogeC5leHAoKS5wcmludCgpOyAgLy8gb3IgdGYuZXhwKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGV4cF8oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2V4cCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChFeHAsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgZXhwID0gb3AoeyBleHBfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXhwLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBFeHBhbmREaW1zIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIFJldHVybnMgYSBgdGYuVGVuc29yYCB0aGF0IGhhcyBleHBhbmRlZCByYW5rLCBieSBpbnNlcnRpbmcgYSBkaW1lbnNpb25cbiAqIGludG8gdGhlIHRlbnNvcidzIHNoYXBlLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDMsIDRdKTtcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5leHBhbmREaW1zKGF4aXMpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yIHdob3NlIGRpbWVuc2lvbnMgdG8gYmUgZXhwYW5kZWQuXG4gKiBAcGFyYW0gYXhpcyBUaGUgZGltZW5zaW9uIGluZGV4IGF0IHdoaWNoIHRvIGluc2VydCBzaGFwZSBvZiBgMWAuIERlZmF1bHRzXG4gKiAgICAgdG8gMCAodGhlIGZpcnN0IGRpbWVuc2lvbikuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnVHJhbnNmb3JtYXRpb25zJ31cbiAqL1xuZnVuY3Rpb24gZXhwYW5kRGltc18oeCwgYXhpcyA9IDApIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdleHBhbmREaW1zJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG4gICAgdXRpbC5hc3NlcnQoYXhpcyA8PSAkeC5yYW5rLCAoKSA9PiAnQXhpcyBtdXN0IGJlIDw9IHJhbmsgb2YgdGhlIHRlbnNvcicpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgaW5wdXQ6ICR4IH07XG4gICAgY29uc3QgYXR0cnMgPSB7IGRpbTogYXhpcyB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEV4cGFuZERpbXMsIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IGV4cGFuZERpbXMgPSBvcCh7IGV4cGFuZERpbXNfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXhwYW5kX2RpbXMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEV4cG0xIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgZXhwb25lbnRpYWwgb2YgdGhlIGlucHV0IGB0Zi5UZW5zb3JgIG1pbnVzIG9uZSBlbGVtZW50LXdpc2UuXG4gKiBgZSBeIHggLSAxYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIC0zXSk7XG4gKlxuICogeC5leHBtMSgpLnByaW50KCk7ICAvLyBvciB0Zi5leHBtMSh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBleHBtMV8oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2V4cG0xJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEV4cG0xLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGV4cG0xID0gb3AoeyBleHBtMV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1leHBtMS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBidWZmZXIgfSBmcm9tICcuL2J1ZmZlcic7XG5pbXBvcnQgeyBleHBhbmREaW1zIH0gZnJvbSAnLi9leHBhbmRfZGltcyc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL3Jlc2hhcGUnO1xuaW1wb3J0IHsgdGlsZSB9IGZyb20gJy4vdGlsZSc7XG4vKipcbiAqIENyZWF0ZSBhbiBpZGVudGl0eSBtYXRyaXguXG4gKlxuICogQHBhcmFtIG51bVJvd3MgTnVtYmVyIG9mIHJvd3MuXG4gKiBAcGFyYW0gbnVtQ29sdW1ucyBOdW1iZXIgb2YgY29sdW1ucy4gRGVmYXVsdHMgdG8gYG51bVJvd3NgLlxuICogQHBhcmFtIGJhdGNoU2hhcGUgSWYgcHJvdmlkZWQsIHdpbGwgYWRkIHRoZSBiYXRjaCBzaGFwZSB0byB0aGUgYmVnaW5uaW5nXG4gKiAgIG9mIHRoZSBzaGFwZSBvZiB0aGUgcmV0dXJuZWQgYHRmLlRlbnNvcmAgYnkgcmVwZWF0aW5nIHRoZSBpZGVudGl0eVxuICogICBtYXRyaXguXG4gKiBAcGFyYW0gZHR5cGUgRGF0YSB0eXBlLlxuICogQHJldHVybnMgSWRlbnRpdHkgbWF0cml4IG9mIHRoZSBzcGVjaWZpZWQgc2l6ZSBhbmQgZGF0YSB0eXBlLCBwb3NzaWJseVxuICogICB3aXRoIGJhdGNoIHJlcGV0aXRpb24gaWYgYGJhdGNoU2hhcGVgIGlzIHNwZWNpZmllZC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmZ1bmN0aW9uIGV5ZV8obnVtUm93cywgbnVtQ29sdW1ucywgYmF0Y2hTaGFwZSwgZHR5cGUgPSAnZmxvYXQzMicpIHtcbiAgICBpZiAobnVtQ29sdW1ucyA9PSBudWxsKSB7XG4gICAgICAgIG51bUNvbHVtbnMgPSBudW1Sb3dzO1xuICAgIH1cbiAgICBjb25zdCBidWZmID0gYnVmZmVyKFtudW1Sb3dzLCBudW1Db2x1bW5zXSwgZHR5cGUpO1xuICAgIGNvbnN0IG4gPSBudW1Sb3dzIDw9IG51bUNvbHVtbnMgPyBudW1Sb3dzIDogbnVtQ29sdW1ucztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgICBidWZmLnNldCgxLCBpLCBpKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0ID0gcmVzaGFwZShidWZmLnRvVGVuc29yKCksIFtudW1Sb3dzLCBudW1Db2x1bW5zXSk7XG4gICAgaWYgKGJhdGNoU2hhcGUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKGJhdGNoU2hhcGUubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gdGlsZShleHBhbmREaW1zKG91dCwgMCksIFtiYXRjaFNoYXBlWzBdLCAxLCAxXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYmF0Y2hTaGFwZS5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgICAgICAgICAgcmV0dXJuIHRpbGUoZXhwYW5kRGltcyhleHBhbmREaW1zKG91dCwgMCksIDApLCBbYmF0Y2hTaGFwZVswXSwgYmF0Y2hTaGFwZVsxXSwgMSwgMV0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGJhdGNoU2hhcGUubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICAgICAgICAgIHJldHVybiB0aWxlKGV4cGFuZERpbXMoZXhwYW5kRGltcyhleHBhbmREaW1zKG91dCwgMCksIDApLCAwKSwgW1xuICAgICAgICAgICAgICAgIGJhdGNoU2hhcGVbMF0sIGJhdGNoU2hhcGVbMV0sIGJhdGNoU2hhcGVbMl0sIDEsIDFcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBleWUoKSBjdXJyZW50bHkgc3VwcG9ydHMgb25seSAxRCBhbmQgMkQgYCArXG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgICAgICAgICAgICAgIGBiYXRjaFNoYXBlcywgYnV0IHJlY2VpdmVkICR7YmF0Y2hTaGFwZS5sZW5ndGh9RC5gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydCBjb25zdCBleWUgPSBvcCh7IGV5ZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1leWUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEZpbGwgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuLyoqXG4gKiBDcmVhdGVzIGEgYHRmLlRlbnNvcmAgZmlsbGVkIHdpdGggYSBzY2FsYXIgdmFsdWUuXG4gKlxuICogYGBganNcbiAqIHRmLmZpbGwoWzIsIDJdLCA0KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHNoYXBlIEFuIGFycmF5IG9mIGludGVnZXJzIGRlZmluaW5nIHRoZSBvdXRwdXQgdGVuc29yIHNoYXBlLlxuICogQHBhcmFtIHZhbHVlIFRoZSBzY2FsYXIgdmFsdWUgdG8gZmlsbCB0aGUgdGVuc29yIHdpdGguXG4gKiBAcGFyYW0gZHR5cGUgVGhlIHR5cGUgb2YgYW4gZWxlbWVudCBpbiB0aGUgcmVzdWx0aW5nIHRlbnNvci4gRGVmYXVsdHMgdG9cbiAqICdmbG9hdCcuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5mdW5jdGlvbiBmaWxsKHNoYXBlLCB2YWx1ZSwgZHR5cGUpIHtcbiAgICBjb25zdCBhdHRycyA9IHsgc2hhcGUsIHZhbHVlLCBkdHlwZSB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEZpbGwsIHt9LCBhdHRycyk7XG59XG5leHBvcnQgeyBmaWxsIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1maWxsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBGbG9vciB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIGZsb29yIG9mIGlucHV0IGB0Zi5UZW5zb3JgIGVsZW1lbnQtd2lzZTogYGZsb29yKHgpYC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsuNiwgMS4xLCAtMy4zXSk7XG4gKlxuICogeC5mbG9vcigpLnByaW50KCk7ICAvLyBvciB0Zi5mbG9vcih4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBmbG9vcl8oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2Zsb29yJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEZsb29yLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGZsb29yID0gb3AoeyBmbG9vcl8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mbG9vci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgRmxvb3JEaXYgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgbWFrZVR5cGVzTWF0Y2ggfSBmcm9tICcuLi90ZW5zb3JfdXRpbCc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIERpdmlkZXMgdHdvIGB0Zi5UZW5zb3JgcyBlbGVtZW50LXdpc2UsIEEgLyBCLiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuXG4gKiBUaGUgcmVzdWx0IGlzIHJvdW5kZWQgd2l0aCBmbG9vciBmdW5jdGlvbi5cbiAqXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgNCwgOSwgMTZdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbMSwgMiwgMywgNF0pO1xuICpcbiAqIGEuZmxvb3JEaXYoYikucHJpbnQoKTsgIC8vIG9yIHRmLmRpdihhLCBiKVxuICogYGBgXG4gKlxuICogYGBganNcbiAqIC8vIEJyb2FkY2FzdCBkaXYgYSB3aXRoIGIuXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzIsIDQsIDYsIDhdKTtcbiAqIGNvbnN0IGIgPSB0Zi5zY2FsYXIoMik7XG4gKlxuICogYS5mbG9vckRpdihiKS5wcmludCgpOyAgLy8gb3IgdGYuZmxvb3JEaXYoYSwgYilcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCB0ZW5zb3IgYXMgdGhlIG51bWVyYXRvci5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgdGVuc29yIGFzIHRoZSBkZW5vbWluYXRvci4gTXVzdCBoYXZlIHRoZSBzYW1lIGR0eXBlIGFzXG4gKiBgYWAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQXJpdGhtZXRpYyd9XG4gKi9cbmZ1bmN0aW9uIGZsb29yRGl2XyhhLCBiKSB7XG4gICAgbGV0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ2Zsb29yRGl2Jyk7XG4gICAgbGV0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ2Zsb29yRGl2Jyk7XG4gICAgWyRhLCAkYl0gPSBtYWtlVHlwZXNNYXRjaCgkYSwgJGIpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgYTogJGEsIGI6ICRiIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoRmxvb3JEaXYsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgZmxvb3JEaXYgPSBvcCh7IGZsb29yRGl2XyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZsb29yRGl2LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBjdXN0b21HcmFkIH0gZnJvbSAnLi4vLi4vZ3JhZGllbnRzJztcbmltcG9ydCB7IEZ1c2VkQ29udjJEIH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IG1ha2VUeXBlc01hdGNoIH0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWwnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgeyBhZGQgfSBmcm9tICcuLi9hZGQnO1xuaW1wb3J0ICogYXMgYnJvYWRjYXN0X3V0aWwgZnJvbSAnLi4vYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0IHsgY29udjJkIGFzIHVuZnVzZWRDb252MmQgfSBmcm9tICcuLi9jb252MmQnO1xuaW1wb3J0IHsgY29udjJEQmFja3Byb3BGaWx0ZXIgfSBmcm9tICcuLi9jb252MmRfYmFja3Byb3BfZmlsdGVyJztcbmltcG9ydCB7IGNvbnYyREJhY2twcm9wSW5wdXQgfSBmcm9tICcuLi9jb252MmRfYmFja3Byb3BfaW5wdXQnO1xuaW1wb3J0ICogYXMgY29udl91dGlsIGZyb20gJy4uL2NvbnZfdXRpbCc7XG5pbXBvcnQgeyBhcHBseUFjdGl2YXRpb24sIGdldEZ1c2VkQmlhc0dyYWRpZW50LCBnZXRGdXNlZER5QWN0aXZhdGlvbiwgc2hvdWxkRnVzZSB9IGZyb20gJy4uL2Z1c2VkX3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4uL3Jlc2hhcGUnO1xuLyoqXG4gKiBDb21wdXRlcyBhIDJEIGNvbnZvbHV0aW9uIG92ZXIgdGhlIGlucHV0IHgsIG9wdGlvbmFsbHkgZnVzZWQgd2l0aCBhZGRpbmcgYVxuICogYmlhcyBhbmQgYXBwbHlpbmcgYW4gYWN0aXZhdGlvbi5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgaW5wdXREZXB0aCA9IDI7XG4gKiBjb25zdCBpblNoYXBlID0gWzIsIDIsIDIsIGlucHV0RGVwdGhdO1xuICogY29uc3Qgb3V0cHV0RGVwdGggPSAyO1xuICogY29uc3QgZlNpemUgPSAxO1xuICogY29uc3QgcGFkID0gMDtcbiAqIGNvbnN0IHN0cmlkZXMgPSAxO1xuICpcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3I0ZCggWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsXG4gKiAxNl0sIGluU2hhcGUpO1xuICogY29uc3QgdyA9IHRmLnRlbnNvcjRkKFstMSwgMSwgLTIsIDAuNV0sIFtmU2l6ZSwgZlNpemUsIGlucHV0RGVwdGgsXG4gKiBvdXRwdXREZXB0aF0pO1xuICpcbiAqIHRmLmZ1c2VkLmNvbnYyZCh7IHgsIGZpbHRlcjogdywgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0OiAnTkhXQycsXG4gKiBkaWxhdGlvbnM6IFsxLCAxXSwgYmlhczogdGYuc2NhbGFyKDUpLCBhY3RpdmF0aW9uOiAncmVsdScgfSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBvYmogQW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciwgb2YgcmFuayA0IG9yIHJhbmsgMywgb2Ygc2hhcGVcbiAqICAgICBgW2JhdGNoLCBoZWlnaHQsIHdpZHRoLCBpbkNoYW5uZWxzXWAuIElmIHJhbmsgMywgYmF0Y2ggb2YgMSBpc1xuICogYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciwgcmFuayA0LCBvZiBzaGFwZVxuICogICAgIGBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5EZXB0aCwgb3V0RGVwdGhdYC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBjb252b2x1dGlvbjogYFtzdHJpZGVIZWlnaHQsXG4gKiBzdHJpZGVXaWR0aF1gLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobS5cbiAqICAgLSBgc2FtZWAgYW5kIHN0cmlkZSAxOiBvdXRwdXQgd2lsbCBiZSBvZiBzYW1lIHNpemUgYXMgaW5wdXQsXG4gKiAgICAgICByZWdhcmRsZXNzIG9mIGZpbHRlciBzaXplLlxuICogICAtIGB2YWxpZGAgb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAtIEZvciBtb3JlIGluZm8sIHNlZSB0aGlzIGd1aWRlOlxuICogICAgIFtodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb25dKFxuICogICAgICAgICAgaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uKVxuICogQHBhcmFtIGRhdGFGb3JtYXQgQW4gb3B0aW9uYWwgc3RyaW5nIGZyb206IFwiTkhXQ1wiLCBcIk5DSFdcIi4gRGVmYXVsdHMgdG9cbiAqICAgICBcIk5IV0NcIi4gU3BlY2lmeSB0aGUgZGF0YSBmb3JtYXQgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YS4gV2l0aCB0aGVcbiAqICAgICBkZWZhdWx0IGZvcm1hdCBcIk5IV0NcIiwgdGhlIGRhdGEgaXMgc3RvcmVkIGluIHRoZSBvcmRlciBvZjogW2JhdGNoLFxuICogICAgIGhlaWdodCwgd2lkdGgsIGNoYW5uZWxzXS4gT25seSBcIk5IV0NcIiBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlxuICogQHBhcmFtIGRpbGF0aW9ucyBUaGUgZGlsYXRpb24gcmF0ZXM6IGBbZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGhdYFxuICogICAgIGluIHdoaWNoIHdlIHNhbXBsZSBpbnB1dCB2YWx1ZXMgYWNyb3NzIHRoZSBoZWlnaHQgYW5kIHdpZHRoIGRpbWVuc2lvbnNcbiAqICAgICBpbiBhdHJvdXMgY29udm9sdXRpb24uIERlZmF1bHRzIHRvIGBbMSwgMV1gLiBJZiBgZGlsYXRpb25zYCBpcyBhIHNpbmdsZVxuICogICAgIG51bWJlciwgdGhlbiBgZGlsYXRpb25IZWlnaHQgPT0gZGlsYXRpb25XaWR0aGAuIElmIGl0IGlzIGdyZWF0ZXIgdGhhblxuICogICAgIDEsIHRoZW4gYWxsIHZhbHVlcyBvZiBgc3RyaWRlc2AgbXVzdCBiZSAxLlxuICogQHBhcmFtIGRpbVJvdW5kaW5nTW9kZSBBIHN0cmluZyBmcm9tOiAnY2VpbCcsICdyb3VuZCcsICdmbG9vcicuIElmIG5vbmUgaXNcbiAqICAgICBwcm92aWRlZCwgaXQgd2lsbCBkZWZhdWx0IHRvIHRydW5jYXRlLlxuICogQHBhcmFtIGJpYXMgVGVuc29yIHRvIGJlIGFkZGVkIHRvIHRoZSByZXN1bHQuXG4gKiBAcGFyYW0gYWN0aXZhdGlvbiBOYW1lIG9mIGFjdGl2YXRpb24ga2VybmVsIChkZWZhdWx0cyB0byBgbGluZWFyYCkgdG8gYmVcbiAqICAgICBhcHBsaWVkXG4gKiAgICAgIGFmdGVyIGJpYXNBZGQuXG4gKiBAcGFyYW0gcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyBUZW5zb3Igb2YgcHJlbHUgd2VpZ2h0cyB0byBiZSBhcHBsaWVkIGFzIHBhcnRcbiAqICAgICBvZiBhIGBwcmVsdWAgYWN0aXZhdGlvbiwgdHlwaWNhbGx5IHRoZSBzYW1lIHNoYXBlIGFzIGB4YC5cbiAqIEBwYXJhbSBsZWFreXJlbHVBbHBoYSBPcHRpb25hbC4gQWxwaGEgdG8gYmUgYXBwbGllZCBhcyBwYXJ0IG9mIGEgYGxlYWt5cmVsdWBcbiAqICAgICBhY3RpdmF0aW9uLlxuICovXG5mdW5jdGlvbiBmdXNlZENvbnYyZF8oeyB4LCBmaWx0ZXIsIHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCA9ICdOSFdDJywgZGlsYXRpb25zID0gWzEsIDFdLCBkaW1Sb3VuZGluZ01vZGUsIGJpYXMsIGFjdGl2YXRpb24gPSAnbGluZWFyJywgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cywgbGVha3lyZWx1QWxwaGEgfSkge1xuICAgIGFjdGl2YXRpb24gPSBhY3RpdmF0aW9uIHx8ICdsaW5lYXInO1xuICAgIGlmIChzaG91bGRGdXNlKEVOR0lORS5zdGF0ZS5ncmFkaWVudERlcHRoLCBhY3RpdmF0aW9uKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHVuZnVzZWRDb252MmQoeCwgZmlsdGVyLCBzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQsIGRpbGF0aW9ucywgZGltUm91bmRpbmdNb2RlKTtcbiAgICAgICAgaWYgKGJpYXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gYWRkKHJlc3VsdCwgYmlhcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwcGx5QWN0aXZhdGlvbihyZXN1bHQsIGFjdGl2YXRpb24sIHByZWx1QWN0aXZhdGlvbldlaWdodHMsIGxlYWt5cmVsdUFscGhhKTtcbiAgICB9XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnY29udjJkJyk7XG4gICAgY29uc3QgJGZpbHRlciA9IGNvbnZlcnRUb1RlbnNvcihmaWx0ZXIsICdmaWx0ZXInLCAnY29udjJkJyk7XG4gICAgbGV0IHg0RCA9ICR4O1xuICAgIGxldCByZXNoYXBlZFRvNEQgPSBmYWxzZTtcbiAgICBpZiAoJHgucmFuayA9PT0gMykge1xuICAgICAgICByZXNoYXBlZFRvNEQgPSB0cnVlO1xuICAgICAgICB4NEQgPSByZXNoYXBlKCR4LCBbMSwgJHguc2hhcGVbMF0sICR4LnNoYXBlWzFdLCAkeC5zaGFwZVsyXV0pO1xuICAgIH1cbiAgICB1dGlsLmFzc2VydCh4NEQucmFuayA9PT0gNCwgKCkgPT4gYEVycm9yIGluIGZ1c2VkIGNvbnYyZDogaW5wdXQgbXVzdCBiZSByYW5rIDQsIGJ1dCBnb3QgcmFuayBgICtcbiAgICAgICAgYCR7eDRELnJhbmt9LmApO1xuICAgIHV0aWwuYXNzZXJ0KCRmaWx0ZXIucmFuayA9PT0gNCwgKCkgPT4gYEVycm9yIGluIGZ1c2VkIGNvbnYyZDogZmlsdGVyIG11c3QgYmUgcmFuayA0LCBidXQgZ290IHJhbmsgYCArXG4gICAgICAgIGAkeyRmaWx0ZXIucmFua30uYCk7XG4gICAgaWYgKGRpbVJvdW5kaW5nTW9kZSAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNJbnQocGFkKSwgKCkgPT4gYEVycm9yIGluIGZ1c2VkIGNvbnYyZDogcGFkIG11c3QgYmUgYW4gaW50ZWdlciB3aGVuIHVzaW5nLCBgICtcbiAgICAgICAgICAgIGBkaW1Sb3VuZGluZ01vZGUgJHtkaW1Sb3VuZGluZ01vZGV9IGJ1dCBnb3QgcGFkICR7cGFkfS5gKTtcbiAgICB9XG4gICAgdXRpbC5hc3NlcnQoeDRELnNoYXBlWzNdID09PSAkZmlsdGVyLnNoYXBlWzJdLCAoKSA9PiBgRXJyb3IgaW4gY29udjJkOiBkZXB0aCBvZiBpbnB1dCAoJHt4NEQuc2hhcGVbM119KSBtdXN0IG1hdGNoIGAgK1xuICAgICAgICBgaW5wdXQgZGVwdGggZm9yIGZpbHRlciAkeyRmaWx0ZXIuc2hhcGVbMl19LmApO1xuICAgIHV0aWwuYXNzZXJ0KGNvbnZfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgZGlsYXRpb25zKSwgKCkgPT4gJ0Vycm9yIGluIGNvbnYyRDogRWl0aGVyIHN0cmlkZXMgb3IgZGlsYXRpb25zIG11c3QgYmUgMS4gJyArXG4gICAgICAgIGBHb3Qgc3RyaWRlcyAke3N0cmlkZXN9IGFuZCBkaWxhdGlvbnMgJyR7ZGlsYXRpb25zfSdgKTtcbiAgICB1dGlsLmFzc2VydChkYXRhRm9ybWF0ID09PSAnTkhXQycsICgpID0+IGBFcnJvciBpbiBjb252MmQ6IGdvdCBkYXRhRm9ybWF0IG9mICR7ZGF0YUZvcm1hdH0gYnV0IG9ubHkgTkhXQyBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLmApO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gY29udl91dGlsLmNvbXB1dGVDb252MkRJbmZvKHg0RC5zaGFwZSwgJGZpbHRlci5zaGFwZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSk7XG4gICAgbGV0ICRiaWFzO1xuICAgIGlmIChiaWFzICE9IG51bGwpIHtcbiAgICAgICAgJGJpYXMgPSBjb252ZXJ0VG9UZW5zb3IoYmlhcywgJ2JpYXMnLCAnZnVzZWQgY29udjJkJyk7XG4gICAgICAgIFskYmlhc10gPSBtYWtlVHlwZXNNYXRjaCgkYmlhcywgJHgpO1xuICAgICAgICBicm9hZGNhc3RfdXRpbC5hc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZShjb252SW5mby5vdXRTaGFwZSwgJGJpYXMuc2hhcGUpO1xuICAgIH1cbiAgICBsZXQgJHByZWx1QWN0aXZhdGlvbldlaWdodHM7XG4gICAgaWYgKHByZWx1QWN0aXZhdGlvbldlaWdodHMgIT0gbnVsbCkge1xuICAgICAgICAkcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyA9IGNvbnZlcnRUb1RlbnNvcihwcmVsdUFjdGl2YXRpb25XZWlnaHRzLCAncHJlbHUgd2VpZ2h0cycsICdmdXNlZCBjb252MmQnKTtcbiAgICB9XG4gICAgY29uc3QgZ3JhZCA9IChkeSwgc2F2ZWQpID0+IHtcbiAgICAgICAgY29uc3QgWyRmaWx0ZXIsIHg0RCwgeSwgJGJpYXNdID0gc2F2ZWQ7XG4gICAgICAgIGNvbnN0IGR5QWN0aXZhdGlvbiA9IGdldEZ1c2VkRHlBY3RpdmF0aW9uKGR5LCB5LCBhY3RpdmF0aW9uKTtcbiAgICAgICAgdXRpbC5hc3NlcnQoY29udl91dGlsLnR1cGxlVmFsdWVzQXJlT25lKGRpbGF0aW9ucyksICgpID0+ICdFcnJvciBpbiBncmFkaWVudCBvZiBmdXNlZCBjb252MkQ6ICcgK1xuICAgICAgICAgICAgYGRpbGF0aW9uIHJhdGVzIGdyZWF0ZXIgdGhhbiAxIGAgK1xuICAgICAgICAgICAgYGFyZSBub3QgeWV0IHN1cHBvcnRlZCBpbiBncmFkaWVudHMuIEdvdCBkaWxhdGlvbnMgJyR7ZGlsYXRpb25zfSdgKTtcbiAgICAgICAgY29uc3QgeERlciA9IGNvbnYyREJhY2twcm9wSW5wdXQoeDRELnNoYXBlLCBkeUFjdGl2YXRpb24sICRmaWx0ZXIsIHN0cmlkZXMsIHBhZCk7XG4gICAgICAgIGNvbnN0IGZpbHRlckRlciA9IGNvbnYyREJhY2twcm9wRmlsdGVyKHg0RCwgZHlBY3RpdmF0aW9uLCAkZmlsdGVyLnNoYXBlLCBzdHJpZGVzLCBwYWQpO1xuICAgICAgICBjb25zdCBkZXIgPSBbeERlciwgZmlsdGVyRGVyXTtcbiAgICAgICAgaWYgKCRiaWFzICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGJpYXNEZXIgPSBnZXRGdXNlZEJpYXNHcmFkaWVudCgkYmlhcywgZHlBY3RpdmF0aW9uKTtcbiAgICAgICAgICAgIGRlci5wdXNoKGJpYXNEZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZXI7XG4gICAgfTtcbiAgICBjb25zdCBpbnB1dHMgPSB7XG4gICAgICAgIHg6IHg0RCxcbiAgICAgICAgZmlsdGVyOiAkZmlsdGVyLFxuICAgICAgICBiaWFzOiAkYmlhcyxcbiAgICAgICAgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0czogJHByZWx1QWN0aXZhdGlvbldlaWdodHNcbiAgICB9O1xuICAgIGNvbnN0IGF0dHJzID0ge1xuICAgICAgICBzdHJpZGVzLFxuICAgICAgICBwYWQsXG4gICAgICAgIGRhdGFGb3JtYXQsXG4gICAgICAgIGRpbGF0aW9ucyxcbiAgICAgICAgZGltUm91bmRpbmdNb2RlLFxuICAgICAgICBhY3RpdmF0aW9uLFxuICAgICAgICBsZWFreXJlbHVBbHBoYVxuICAgIH07XG4gICAgLy8gRGVwZW5kaW5nIG9uIHRoZSB0aGUgcGFyYW1zIHBhc3NlZCBpbiB3ZSB3aWxsIGhhdmUgZGlmZmVyZW50IG51bWJlciBvZlxuICAgIC8vIGlucHV0cyBhbmQgdGh1cyBhIGEgZGlmZmVyZW50IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgZ3JhZGllbnQuXG4gICAgaWYgKGJpYXMgPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBjdXN0b21PcCA9IGN1c3RvbUdyYWQoKHg0RCwgZmlsdGVyLCBzYXZlKSA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzID0gXG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgICAgICAgICBFTkdJTkUucnVuS2VybmVsKEZ1c2VkQ29udjJELCBpbnB1dHMsIGF0dHJzKTtcbiAgICAgICAgICAgIHNhdmUoW2ZpbHRlciwgeDRELCByZXNdKTtcbiAgICAgICAgICAgIGlmIChyZXNoYXBlZFRvNEQpIHtcbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgICAgICAgICAgICAgcmVzID0gcmVzaGFwZShyZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogcmVzLCBncmFkRnVuYzogZ3JhZCB9O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGN1c3RvbU9wKHg0RCwgJGZpbHRlcik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBjdXN0b21PcFdpdGhCaWFzID0gY3VzdG9tR3JhZCgoeDRELCBmaWx0ZXIsIGJpYXMsIHNhdmUpID0+IHtcbiAgICAgICAgICAgIGxldCByZXMgPSBFTkdJTkUucnVuS2VybmVsKEZ1c2VkQ29udjJELCBpbnB1dHMsIGF0dHJzKTtcbiAgICAgICAgICAgIHNhdmUoW2ZpbHRlciwgeDRELCByZXMsIGJpYXNdKTtcbiAgICAgICAgICAgIGlmIChyZXNoYXBlZFRvNEQpIHtcbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgICAgICAgICAgICAgcmVzID0gcmVzaGFwZShyZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogcmVzLCBncmFkRnVuYzogZ3JhZCB9O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGN1c3RvbU9wV2l0aEJpYXMoeDRELCAkZmlsdGVyLCAkYmlhcyk7XG4gICAgfVxufVxuZXhwb3J0IGNvbnN0IGNvbnYyZCA9IG9wKHsgZnVzZWRDb252MmRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29udjJkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBjdXN0b21HcmFkIH0gZnJvbSAnLi4vLi4vZ3JhZGllbnRzJztcbmltcG9ydCB7IEZ1c2VkRGVwdGh3aXNlQ29udjJEIH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IG1ha2VUeXBlc01hdGNoIH0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWwnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgeyBhZGQgfSBmcm9tICcuLi9hZGQnO1xuaW1wb3J0ICogYXMgYnJvYWRjYXN0X3V0aWwgZnJvbSAnLi4vYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0ICogYXMgY29udl91dGlsIGZyb20gJy4uL2NvbnZfdXRpbCc7XG5pbXBvcnQgeyBkZXB0aHdpc2VDb252MmQgYXMgdW5mdXNlZERlcHRod2lzZUNvbnYyZCB9IGZyb20gJy4uL2RlcHRod2lzZV9jb252MmQnO1xuaW1wb3J0IHsgZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIgfSBmcm9tICcuLi9kZXB0aHdpc2VfY29udjJkX25hdGl2ZV9iYWNrcHJvcF9maWx0ZXInO1xuaW1wb3J0IHsgZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCB9IGZyb20gJy4uL2RlcHRod2lzZV9jb252MmRfbmF0aXZlX2JhY2twcm9wX2lucHV0JztcbmltcG9ydCB7IGFwcGx5QWN0aXZhdGlvbiwgZ2V0RnVzZWRCaWFzR3JhZGllbnQsIGdldEZ1c2VkRHlBY3RpdmF0aW9uLCBzaG91bGRGdXNlIH0gZnJvbSAnLi4vZnVzZWRfdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4uL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi4vcmVzaGFwZSc7XG4vKipcbiAqIENvbXB1dGVzIGRlcHRod2lzZSAyRCBjb252b2x1dGlvbiwgb3B0aW9uYWxseSBmdXNlZCB3aXRoIGFkZGluZyBhXG4gKiBiaWFzIGFuZCBhcHBseWluZyBhbiBhY3RpdmF0aW9uLlxuICpcbiAqIEdpdmVuIGEgNEQgYGlucHV0YCBhcnJheSBhbmQgYSBgZmlsdGVyYCBhcnJheSBvZiBzaGFwZVxuICogYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBpbkNoYW5uZWxzLCBjaGFubmVsTXVsdGlwbGllcl1gIGNvbnRhaW5pbmdcbiAqIGBpbkNoYW5uZWxzYCBjb252b2x1dGlvbmFsIGZpbHRlcnMgb2YgZGVwdGggMSwgdGhpcyBvcCBhcHBsaWVzIGFcbiAqIGRpZmZlcmVudCBmaWx0ZXIgdG8gZWFjaCBpbnB1dCBjaGFubmVsIChleHBhbmRpbmcgZnJvbSAxIGNoYW5uZWwgdG9cbiAqIGBjaGFubmVsTXVsdGlwbGllcmAgY2hhbm5lbHMgZm9yIGVhY2gpLCB0aGVuIGNvbmNhdGVuYXRlcyB0aGUgcmVzdWx0c1xuICogdG9nZXRoZXIuIFRoZSBvdXRwdXQgaGFzIGBpbkNoYW5uZWxzICogY2hhbm5lbE11bHRpcGxpZXJgIGNoYW5uZWxzLlxuICpcbiAqIFNlZVxuICogW2h0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9kZXB0aHdpc2VfY29udjJkXShcbiAqICAgICBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vZGVwdGh3aXNlX2NvbnYyZClcbiAqIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogQHBhcmFtIG9iaiBBbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDQgb3IgcmFuayAzLCBvZiBzaGFwZVxuICogICAgIGBbYmF0Y2gsIGhlaWdodCwgd2lkdGgsIGluQ2hhbm5lbHNdYC4gSWYgcmFuayAzLCBiYXRjaCBvZiAxIGlzXG4gKiBhc3N1bWVkLlxuICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyIHRlbnNvciwgcmFuayA0LCBvZiBzaGFwZVxuICogICAgIGBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5DaGFubmVscywgY2hhbm5lbE11bHRpcGxpZXJdYC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBjb252b2x1dGlvbjogYFtzdHJpZGVIZWlnaHQsXG4gKiBzdHJpZGVXaWR0aF1gLiBJZiBzdHJpZGVzIGlzIGEgc2luZ2xlIG51bWJlciwgdGhlbiBgc3RyaWRlSGVpZ2h0ID09XG4gKiBzdHJpZGVXaWR0aGAuXG4gKiBAcGFyYW0gcGFkIFRoZSB0eXBlIG9mIHBhZGRpbmcgYWxnb3JpdGhtLlxuICogICAtIGBzYW1lYCBhbmQgc3RyaWRlIDE6IG91dHB1dCB3aWxsIGJlIG9mIHNhbWUgc2l6ZSBhcyBpbnB1dCxcbiAqICAgICAgIHJlZ2FyZGxlc3Mgb2YgZmlsdGVyIHNpemUuXG4gKiAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAtIEZvciBtb3JlIGluZm8sIHNlZSB0aGlzIGd1aWRlOlxuICogICAgIFtodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb25dKFxuICogICAgICAgICAgaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uKVxuICogQHBhcmFtIGRpbGF0aW9ucyBUaGUgZGlsYXRpb24gcmF0ZXM6IGBbZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGhdYFxuICogICAgIGluIHdoaWNoIHdlIHNhbXBsZSBpbnB1dCB2YWx1ZXMgYWNyb3NzIHRoZSBoZWlnaHQgYW5kIHdpZHRoIGRpbWVuc2lvbnNcbiAqICAgICBpbiBhdHJvdXMgY29udm9sdXRpb24uIERlZmF1bHRzIHRvIGBbMSwgMV1gLiBJZiBgcmF0ZWAgaXMgYSBzaW5nbGVcbiAqICAgICBudW1iZXIsIHRoZW4gYGRpbGF0aW9uSGVpZ2h0ID09IGRpbGF0aW9uV2lkdGhgLiBJZiBpdCBpcyBncmVhdGVyIHRoYW5cbiAqICAgICAxLCB0aGVuIGFsbCB2YWx1ZXMgb2YgYHN0cmlkZXNgIG11c3QgYmUgMS5cbiAqIEBwYXJhbSBkYXRhRm9ybWF0OiBBbiBvcHRpb25hbCBzdHJpbmcgZnJvbTogXCJOSFdDXCIsIFwiTkNIV1wiLiBEZWZhdWx0cyB0b1xuICogICAgIFwiTkhXQ1wiLiBTcGVjaWZ5IHRoZSBkYXRhIGZvcm1hdCBvZiB0aGUgaW5wdXQgYW5kIG91dHB1dCBkYXRhLiBXaXRoIHRoZVxuICogICAgIGRlZmF1bHQgZm9ybWF0IFwiTkhXQ1wiLCB0aGUgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIG9yZGVyIG9mOiBbYmF0Y2gsXG4gKiAgICAgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbHNdLiBPbmx5IFwiTkhXQ1wiIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQuXG4gKiBAcGFyYW0gZGltUm91bmRpbmdNb2RlIEEgc3RyaW5nIGZyb206ICdjZWlsJywgJ3JvdW5kJywgJ2Zsb29yJy4gSWYgbm9uZSBpc1xuICogICAgIHByb3ZpZGVkLCBpdCB3aWxsIGRlZmF1bHQgdG8gdHJ1bmNhdGUuXG4gKiBAcGFyYW0gYmlhcyBUZW5zb3IgdG8gYmUgYWRkZWQgdG8gdGhlIHJlc3VsdC5cbiAqIEBwYXJhbSBhY3RpdmF0aW9uIE5hbWUgb2YgYWN0aXZhdGlvbiBrZXJuZWwgKGRlZmF1bHRzIHRvIGBsaW5lYXJgKS5cbiAqIEBwYXJhbSBwcmVsdUFjdGl2YXRpb25XZWlnaHRzIFRlbnNvciBvZiBwcmVsdSB3ZWlnaHRzIHRvIGJlIGFwcGxpZWQgYXMgcGFydFxuICogICAgIG9mIGEgYHByZWx1YCBhY3RpdmF0aW9uLCB0eXBpY2FsbHkgdGhlIHNhbWUgc2hhcGUgYXMgYHhgLlxuICogQHBhcmFtIGxlYWt5cmVsdUFscGhhIE9wdGlvbmFsLiBBbHBoYSB0byBiZSBhcHBsaWVkIGFzIHBhcnQgb2YgYSBgbGVha3lyZWx1YFxuICogICAgIGFjdGl2YXRpb24uXG4gKi9cbmZ1bmN0aW9uIGZ1c2VkRGVwdGh3aXNlQ29udjJkXyh7IHgsIGZpbHRlciwgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0ID0gJ05IV0MnLCBkaWxhdGlvbnMgPSBbMSwgMV0sIGRpbVJvdW5kaW5nTW9kZSwgYmlhcywgYWN0aXZhdGlvbiA9ICdsaW5lYXInLCBwcmVsdUFjdGl2YXRpb25XZWlnaHRzLCBsZWFreXJlbHVBbHBoYSB9KSB7XG4gICAgaWYgKHNob3VsZEZ1c2UoRU5HSU5FLnN0YXRlLmdyYWRpZW50RGVwdGgsIGFjdGl2YXRpb24pID09PSBmYWxzZSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gdW5mdXNlZERlcHRod2lzZUNvbnYyZCh4LCBmaWx0ZXIsIHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGlsYXRpb25zLCBkaW1Sb3VuZGluZ01vZGUpO1xuICAgICAgICBpZiAoYmlhcyAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBhZGQocmVzdWx0LCBiaWFzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXBwbHlBY3RpdmF0aW9uKHJlc3VsdCwgYWN0aXZhdGlvbiwgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cywgbGVha3lyZWx1QWxwaGEpO1xuICAgIH1cbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdkZXB0aHdpc2VDb252MmQnKTtcbiAgICBjb25zdCAkZmlsdGVyID0gY29udmVydFRvVGVuc29yKGZpbHRlciwgJ2ZpbHRlcicsICdkZXB0aHdpc2VDb252MmQnKTtcbiAgICBsZXQgeDREID0gJHg7XG4gICAgbGV0IHJlc2hhcGVkVG80RCA9IGZhbHNlO1xuICAgIGlmICgkeC5yYW5rID09PSAzKSB7XG4gICAgICAgIHJlc2hhcGVkVG80RCA9IHRydWU7XG4gICAgICAgIHg0RCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV0sICR4LnNoYXBlWzJdXSk7XG4gICAgfVxuICAgIHV0aWwuYXNzZXJ0KHg0RC5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gZnVzZWQgZGVwdGh3aXNlQ29udjJkOiBpbnB1dCBtdXN0IGJlIHJhbmsgNCwgYnV0IGdvdCBgICtcbiAgICAgICAgYHJhbmsgJHt4NEQucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoJGZpbHRlci5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gZnVzZWQgZGVwdGh3aXNlQ29udjJkOiBmaWx0ZXIgbXVzdCBiZSByYW5rIDQsIGAgK1xuICAgICAgICBgYnV0IGdvdCByYW5rICR7JGZpbHRlci5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydCh4NEQuc2hhcGVbM10gPT09ICRmaWx0ZXIuc2hhcGVbMl0sICgpID0+IGBFcnJvciBpbiBmdXNlZCBkZXB0aHdpc2VDb252MmQ6IG51bWJlciBvZiBpbnB1dCBjaGFubmVscyBgICtcbiAgICAgICAgYCgke3g0RC5zaGFwZVszXX0pIG11c3QgbWF0Y2ggdGhlIGluQ2hhbm5lbHMgZGltZW5zaW9uIGluIGAgK1xuICAgICAgICBgZmlsdGVyICR7JGZpbHRlci5zaGFwZVsyXX0uYCk7XG4gICAgaWYgKGRpbGF0aW9ucyA9PSBudWxsKSB7XG4gICAgICAgIGRpbGF0aW9ucyA9IFsxLCAxXTtcbiAgICB9XG4gICAgdXRpbC5hc3NlcnQoY29udl91dGlsLmVpdGhlclN0cmlkZXNPckRpbGF0aW9uc0FyZU9uZShzdHJpZGVzLCBkaWxhdGlvbnMpLCAoKSA9PiAnRXJyb3IgaW4gZnVzZWQgZGVwdGh3aXNlQ29udjJkOiBFaXRoZXIgc3RyaWRlcyBvciBkaWxhdGlvbnMgbXVzdCAnICtcbiAgICAgICAgYGJlIDEuIEdvdCBzdHJpZGVzICR7c3RyaWRlc30gYW5kIGRpbGF0aW9ucyAnJHtkaWxhdGlvbnN9J2ApO1xuICAgIGlmIChkaW1Sb3VuZGluZ01vZGUgIT0gbnVsbCkge1xuICAgICAgICB1dGlsLmFzc2VydCh1dGlsLmlzSW50KHBhZCksICgpID0+IGBFcnJvciBpbiBmdXNlZCBkZXB0aHdpc2VDb252MmQ6IHBhZCBtdXN0IGJlIGFuIGludGVnZXIgd2hlbiBgICtcbiAgICAgICAgICAgIGB1c2luZyBkaW1Sb3VuZGluZ01vZGUgJHtkaW1Sb3VuZGluZ01vZGV9IGJ1dCBnb3QgcGFkICR7cGFkfS5gKTtcbiAgICB9XG4gICAgY29uc3QgY29udkluZm8gPSBjb252X3V0aWwuY29tcHV0ZUNvbnYyREluZm8oeDRELnNoYXBlLCAkZmlsdGVyLnNoYXBlLCBzdHJpZGVzLCBkaWxhdGlvbnMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCB0cnVlIC8qIGRlcHRod2lzZSAqLyk7XG4gICAgbGV0ICRiaWFzO1xuICAgIGlmIChiaWFzICE9IG51bGwpIHtcbiAgICAgICAgJGJpYXMgPSBjb252ZXJ0VG9UZW5zb3IoYmlhcywgJ2JpYXMnLCAnZnVzZWQgY29udjJkJyk7XG4gICAgICAgIFskYmlhc10gPSBtYWtlVHlwZXNNYXRjaCgkYmlhcywgJHgpO1xuICAgICAgICBicm9hZGNhc3RfdXRpbC5hc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZShjb252SW5mby5vdXRTaGFwZSwgJGJpYXMuc2hhcGUpO1xuICAgIH1cbiAgICBsZXQgJHByZWx1QWN0aXZhdGlvbldlaWdodHM7XG4gICAgaWYgKHByZWx1QWN0aXZhdGlvbldlaWdodHMgIT0gbnVsbCkge1xuICAgICAgICAkcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyA9IGNvbnZlcnRUb1RlbnNvcihwcmVsdUFjdGl2YXRpb25XZWlnaHRzLCAncHJlbHUgd2VpZ2h0cycsICdmdXNlZCBkZXB0aHdpc2VDb252MmQnKTtcbiAgICB9XG4gICAgY29uc3QgZ3JhZCA9IChkeSwgc2F2ZWQpID0+IHtcbiAgICAgICAgdXRpbC5hc3NlcnQoY29udl91dGlsLnR1cGxlVmFsdWVzQXJlT25lKGRpbGF0aW9ucyksICgpID0+ICdFcnJvciBpbiBncmFkaWVudCBvZiBmdXNlZCBkZXB0aHdpc2VDb252MmQ6IGRpbGF0aW9uIHJhdGVzICcgK1xuICAgICAgICAgICAgYGdyZWF0ZXIgdGhhbiAxIGFyZSBub3QgeWV0IHN1cHBvcnRlZC4gR290IGRpbGF0aW9ucyBgICtcbiAgICAgICAgICAgIGAnJHtkaWxhdGlvbnN9J2ApO1xuICAgICAgICBjb25zdCBbJGZpbHRlciwgeDRELCB5LCBiaWFzXSA9IHNhdmVkO1xuICAgICAgICBjb25zdCBkeUFjdGl2YXRpb24gPSBnZXRGdXNlZER5QWN0aXZhdGlvbihkeSwgeSwgYWN0aXZhdGlvbik7XG4gICAgICAgIGNvbnN0IHhEZXIgPSBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0KHg0RC5zaGFwZSwgZHlBY3RpdmF0aW9uLCAkZmlsdGVyLCBzdHJpZGVzLCBwYWQsIGRpbGF0aW9ucywgZGltUm91bmRpbmdNb2RlKTtcbiAgICAgICAgY29uc3QgZmlsdGVyRGVyID0gZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIoeDRELCBkeUFjdGl2YXRpb24sICRmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsIHBhZCwgZGlsYXRpb25zLCBkaW1Sb3VuZGluZ01vZGUpO1xuICAgICAgICBpZiAoYmlhcyAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBiaWFzRGVyID0gZ2V0RnVzZWRCaWFzR3JhZGllbnQoJGJpYXMsIGR5QWN0aXZhdGlvbik7XG4gICAgICAgICAgICByZXR1cm4gW3hEZXIsIGZpbHRlckRlciwgYmlhc0Rlcl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFt4RGVyLCBmaWx0ZXJEZXJdO1xuICAgIH07XG4gICAgY29uc3QgaW5wdXRzID0ge1xuICAgICAgICB4OiB4NEQsXG4gICAgICAgIGZpbHRlcjogJGZpbHRlcixcbiAgICAgICAgYmlhczogJGJpYXMsXG4gICAgICAgIHByZWx1QWN0aXZhdGlvbldlaWdodHM6ICRwcmVsdUFjdGl2YXRpb25XZWlnaHRzXG4gICAgfTtcbiAgICBjb25zdCBhdHRycyA9IHtcbiAgICAgICAgc3RyaWRlcyxcbiAgICAgICAgcGFkLFxuICAgICAgICBkYXRhRm9ybWF0LFxuICAgICAgICBkaWxhdGlvbnMsXG4gICAgICAgIGRpbVJvdW5kaW5nTW9kZSxcbiAgICAgICAgYWN0aXZhdGlvbixcbiAgICAgICAgbGVha3lyZWx1QWxwaGFcbiAgICB9O1xuICAgIC8vIERlcGVuZGluZyBvbiB0aGUgdGhlIHBhcmFtcyBwYXNzZWQgaW4gd2Ugd2lsbCBoYXZlIGRpZmZlcmVudCBudW1iZXIgb2ZcbiAgICAvLyBpbnB1dHMgYW5kIHRodXMgYSBhIGRpZmZlcmVudCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGdyYWRpZW50LlxuICAgIGlmIChiaWFzID09IG51bGwpIHtcbiAgICAgICAgY29uc3QgY3VzdG9tT3AgPSBjdXN0b21HcmFkKCh4NEQsIGZpbHRlciwgc2F2ZSkgPT4ge1xuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgICAgICAgICAgbGV0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoRnVzZWREZXB0aHdpc2VDb252MkQsIGlucHV0cywgYXR0cnMpO1xuICAgICAgICAgICAgc2F2ZShbZmlsdGVyLCB4NEQsIHJlc10pO1xuICAgICAgICAgICAgaWYgKHJlc2hhcGVkVG80RCkge1xuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICAgICAgICAgICAgICByZXMgPSByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiByZXMsIGdyYWRGdW5jOiBncmFkIH07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY3VzdG9tT3AoeDRELCAkZmlsdGVyKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGN1c3RvbU9wV2l0aEJpYXMgPSBjdXN0b21HcmFkKCh4NEQsIGZpbHRlciwgYmlhcywgc2F2ZSkgPT4ge1xuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgICAgICAgICAgbGV0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoRnVzZWREZXB0aHdpc2VDb252MkQsIGlucHV0cywgYXR0cnMpO1xuICAgICAgICAgICAgc2F2ZShbZmlsdGVyLCB4NEQsIHJlcywgYmlhc10pO1xuICAgICAgICAgICAgaWYgKHJlc2hhcGVkVG80RCkge1xuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICAgICAgICAgICAgICByZXMgPSByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiByZXMsIGdyYWRGdW5jOiBncmFkIH07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY3VzdG9tT3BXaXRoQmlhcyh4NEQsICRmaWx0ZXIsICRiaWFzKTtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgZGVwdGh3aXNlQ29udjJkID0gb3AoeyBmdXNlZERlcHRod2lzZUNvbnYyZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZXB0aHdpc2VfY29udjJkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBjdXN0b21HcmFkIH0gZnJvbSAnLi4vLi4vZ3JhZGllbnRzJztcbmltcG9ydCB7IF9GdXNlZE1hdE11bCB9IGZyb20gJy4uLy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBtYWtlVHlwZXNNYXRjaCB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHsgYWRkIH0gZnJvbSAnLi4vYWRkJztcbmltcG9ydCAqIGFzIGJyb2FkY2FzdF91dGlsIGZyb20gJy4uL2Jyb2FkY2FzdF91dGlsJztcbmltcG9ydCB7IGFwcGx5QWN0aXZhdGlvbiwgZ2V0RnVzZWRCaWFzR3JhZGllbnQsIGdldEZ1c2VkRHlBY3RpdmF0aW9uLCBzaG91bGRGdXNlIH0gZnJvbSAnLi4vZnVzZWRfdXRpbCc7XG5pbXBvcnQgeyBtYXRNdWwgYXMgdW5mdXNlZE1hdE11bCB9IGZyb20gJy4uL21hdF9tdWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4uL3Jlc2hhcGUnO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIG1hdHJpY2VzIHdpdGggb3B0aW9uYWwgYWN0aXZhdGlvbiBhbmQgYmlhcy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjJkKFstMSwgLTJdLCBbMSwgMl0pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjJkKFsxLCAyLCAzLCA0XSwgWzIsIDJdKTtcbiAqIGNvbnN0IGJpYXMgPSB0Zi50ZW5zb3IyZChbMSwgMl0sIFsxLCAyXSk7XG4gKlxuICogdGYuZnVzZWQubWF0TXVsKHthLCBiLCBiaWFzLCBhY3RpdmF0aW9uOiAncmVsdSd9KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIG9iaiBBbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAtIGBhYCBGaXJzdCBtYXRyaXggaW4gZG90IHByb2R1Y3Qgb3BlcmF0aW9uLlxuICogLSBgYmAgU2Vjb25kIG1hdHJpeCBpbiBkb3QgcHJvZHVjdCBvcGVyYXRpb24uXG4gKiAtIGB0cmFuc3Bvc2VBYCBJZiB0cnVlLCBgYWAgaXMgdHJhbnNwb3NlZCBiZWZvcmUgbXVsdGlwbGljYXRpb24uXG4gKiAtIGB0cmFuc3Bvc2VCYCBJZiB0cnVlLCBgYmAgaXMgdHJhbnNwb3NlZCBiZWZvcmUgbXVsdGlwbGljYXRpb24uXG4gKiAtIGBiaWFzYCBNYXRyaXggdG8gYmUgYWRkZWQgdG8gdGhlIHJlc3VsdC5cbiAqIC0gYGFjdGl2YXRpb25gIE5hbWUgb2YgYWN0aXZhdGlvbiBrZXJuZWwgKGRlZmF1bHRzIHRvIGBsaW5lYXJgKS5cbiAqIC0gYHByZWx1QWN0aXZhdGlvbldlaWdodHNgIFRlbnNvciBvZiBwcmVsdSB3ZWlnaHRzLlxuICogLSBgbGVha3lyZWx1QWxwaGFgIEFscGhhIG9mIGxlYWt5cmVsdS5cbiAqL1xuZnVuY3Rpb24gZnVzZWRNYXRNdWxfKHsgYSwgYiwgdHJhbnNwb3NlQSA9IGZhbHNlLCB0cmFuc3Bvc2VCID0gZmFsc2UsIGJpYXMsIGFjdGl2YXRpb24gPSAnbGluZWFyJywgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cywgbGVha3lyZWx1QWxwaGEsIH0pIHtcbiAgICBpZiAoc2hvdWxkRnVzZShFTkdJTkUuc3RhdGUuZ3JhZGllbnREZXB0aCwgYWN0aXZhdGlvbikgPT09IGZhbHNlKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB1bmZ1c2VkTWF0TXVsKGEsIGIsIHRyYW5zcG9zZUEsIHRyYW5zcG9zZUIpO1xuICAgICAgICBpZiAoYmlhcyAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBhZGQocmVzdWx0LCBiaWFzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXBwbHlBY3RpdmF0aW9uKHJlc3VsdCwgYWN0aXZhdGlvbiwgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cywgbGVha3lyZWx1QWxwaGEpO1xuICAgIH1cbiAgICBsZXQgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnZnVzZWQgbWF0TXVsJyk7XG4gICAgbGV0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ2Z1c2VkIG1hdE11bCcpO1xuICAgIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcbiAgICBjb25zdCBpbm5lclNoYXBlQSA9IHRyYW5zcG9zZUEgPyAkYS5zaGFwZVskYS5yYW5rIC0gMl0gOiAkYS5zaGFwZVskYS5yYW5rIC0gMV07XG4gICAgY29uc3QgaW5uZXJTaGFwZUIgPSB0cmFuc3Bvc2VCID8gJGIuc2hhcGVbJGIucmFuayAtIDFdIDogJGIuc2hhcGVbJGIucmFuayAtIDJdO1xuICAgIGNvbnN0IG91dGVyU2hhcGVBID0gdHJhbnNwb3NlQSA/ICRhLnNoYXBlWyRhLnJhbmsgLSAxXSA6ICRhLnNoYXBlWyRhLnJhbmsgLSAyXTtcbiAgICBjb25zdCBvdXRlclNoYXBlQiA9IHRyYW5zcG9zZUIgPyAkYi5zaGFwZVskYi5yYW5rIC0gMl0gOiAkYi5zaGFwZVskYi5yYW5rIC0gMV07XG4gICAgY29uc3Qgb3V0ZXJEaW1zQSA9ICRhLnNoYXBlLnNsaWNlKDAsIC0yKTtcbiAgICBjb25zdCBvdXRlckRpbXNCID0gJGIuc2hhcGUuc2xpY2UoMCwgLTIpO1xuICAgIGNvbnN0IGJhdGNoRGltQSA9IHV0aWwuc2l6ZUZyb21TaGFwZShvdXRlckRpbXNBKTtcbiAgICBjb25zdCBiYXRjaERpbUIgPSB1dGlsLnNpemVGcm9tU2hhcGUob3V0ZXJEaW1zQik7XG4gICAgdXRpbC5hc3NlcnQoJGEucmFuayA+PSAyICYmICRiLnJhbmsgPj0gMiAmJiAkYS5yYW5rID09PSAkYi5yYW5rLCAoKSA9PiBgRXJyb3IgaW4gZnVzZWQgbWF0TXVsOiBpbnB1dHMgbXVzdCBoYXZlIHRoZSBzYW1lIHJhbmsgb2YgYXQgYCArXG4gICAgICAgIGBsZWFzdCAyLCBnb3QgcmFua3MgJHskYS5yYW5rfSBhbmQgJHskYi5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydCh1dGlsLmFycmF5c0VxdWFsKG91dGVyRGltc0EsIG91dGVyRGltc0IpLCAoKSA9PiBgRXJyb3IgaW4gZnVzZWQgbWF0TXVsOiBvdXRlciBkaW1lbnNpb25zICgke291dGVyRGltc0F9KSBhbmQgKGAgK1xuICAgICAgICBgJHtvdXRlckRpbXNCfSkgb2YgVGVuc29ycyB3aXRoIHNoYXBlcyAkeyRhLnNoYXBlfSBhbmQgYCArXG4gICAgICAgIGAkeyRiLnNoYXBlfSBtdXN0IG1hdGNoLmApO1xuICAgIHV0aWwuYXNzZXJ0KGlubmVyU2hhcGVBID09PSBpbm5lclNoYXBlQiwgKCkgPT4gYEVycm9yIGluIGZ1c2VkIG1hdE11bDogaW5uZXIgc2hhcGVzICgke2lubmVyU2hhcGVBfSkgYW5kIChgICtcbiAgICAgICAgYCR7aW5uZXJTaGFwZUJ9KSBvZiBUZW5zb3JzIHdpdGggc2hhcGVzICR7JGEuc2hhcGV9IGFuZCBgICtcbiAgICAgICAgYCR7JGIuc2hhcGV9IGFuZCB0cmFuc3Bvc2VBPSR7dHJhbnNwb3NlQX1gICtcbiAgICAgICAgYCBhbmQgdHJhbnNwb3NlQj0ke3RyYW5zcG9zZUJ9IG11c3QgbWF0Y2guYCk7XG4gICAgY29uc3Qgb3V0U2hhcGUgPSAkYS5zaGFwZS5zbGljZSgwLCAtMikuY29uY2F0KFtvdXRlclNoYXBlQSwgb3V0ZXJTaGFwZUJdKTtcbiAgICBjb25zdCBhM0QgPSB0cmFuc3Bvc2VBID9cbiAgICAgICAgcmVzaGFwZSgkYSwgW2JhdGNoRGltQSwgaW5uZXJTaGFwZUEsIG91dGVyU2hhcGVBXSkgOlxuICAgICAgICByZXNoYXBlKCRhLCBbYmF0Y2hEaW1BLCBvdXRlclNoYXBlQSwgaW5uZXJTaGFwZUFdKTtcbiAgICBjb25zdCBiM0QgPSB0cmFuc3Bvc2VCID9cbiAgICAgICAgcmVzaGFwZSgkYiwgW2JhdGNoRGltQiwgb3V0ZXJTaGFwZUIsIGlubmVyU2hhcGVCXSkgOlxuICAgICAgICByZXNoYXBlKCRiLCBbYmF0Y2hEaW1CLCBpbm5lclNoYXBlQiwgb3V0ZXJTaGFwZUJdKTtcbiAgICBsZXQgJGJpYXM7XG4gICAgaWYgKGJpYXMgIT0gbnVsbCkge1xuICAgICAgICAkYmlhcyA9IGNvbnZlcnRUb1RlbnNvcihiaWFzLCAnYmlhcycsICdmdXNlZCBtYXRNdWwnKTtcbiAgICAgICAgWyRiaWFzXSA9IG1ha2VUeXBlc01hdGNoKCRiaWFzLCAkYSk7XG4gICAgICAgIGJyb2FkY2FzdF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKG91dFNoYXBlLCAkYmlhcy5zaGFwZSk7XG4gICAgfVxuICAgIGxldCAkcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cztcbiAgICBpZiAocHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyAhPSBudWxsKSB7XG4gICAgICAgICRwcmVsdUFjdGl2YXRpb25XZWlnaHRzID0gY29udmVydFRvVGVuc29yKHByZWx1QWN0aXZhdGlvbldlaWdodHMsICdwcmVsdSB3ZWlnaHRzJywgJ2Z1c2VkIG1hdE11bCcpO1xuICAgIH1cbiAgICBjb25zdCBncmFkID0gKGR5LCBzYXZlZCkgPT4ge1xuICAgICAgICBjb25zdCBbYTNELCBiM0QsIHksICRiaWFzXSA9IHNhdmVkO1xuICAgICAgICAvLyB3ZSByZXNoYXBlIGR5IGJlY2F1c2UgdGhlIHJlc3VsdCBvZiB0aGUgZm9yd2FyZCBpcyBub3RcbiAgICAgICAgLy8gbmVjZXNzYXJpbHkgZ29pbmcgdG8gYmUgYSAzZCB0ZW5zb3IgZHVlIHRvIGEgcmVzaGFwZSBkb25lIGF0IHRoZSBlbmQgb2ZcbiAgICAgICAgLy8gdGhlIGN1c3RvbU9wLlxuICAgICAgICBjb25zdCBkeUFjdGl2YXRpb24gPSBnZXRGdXNlZER5QWN0aXZhdGlvbihyZXNoYXBlKGR5LCB5LnNoYXBlKSwgeSwgYWN0aXZhdGlvbik7XG4gICAgICAgIGxldCBhRGVyO1xuICAgICAgICBsZXQgYkRlcjtcbiAgICAgICAgaWYgKCF0cmFuc3Bvc2VBICYmICF0cmFuc3Bvc2VCKSB7XG4gICAgICAgICAgICBhRGVyID0gdW5mdXNlZE1hdE11bChkeUFjdGl2YXRpb24sIGIzRCwgZmFsc2UsIHRydWUpO1xuICAgICAgICAgICAgYkRlciA9IHVuZnVzZWRNYXRNdWwoYTNELCBkeUFjdGl2YXRpb24sIHRydWUsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghdHJhbnNwb3NlQSAmJiB0cmFuc3Bvc2VCKSB7XG4gICAgICAgICAgICBhRGVyID0gdW5mdXNlZE1hdE11bChkeUFjdGl2YXRpb24sIGIzRCwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgICAgIGJEZXIgPSB1bmZ1c2VkTWF0TXVsKGR5QWN0aXZhdGlvbiwgYTNELCB0cnVlLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHJhbnNwb3NlQSAmJiAhdHJhbnNwb3NlQikge1xuICAgICAgICAgICAgYURlciA9IHVuZnVzZWRNYXRNdWwoYjNELCBkeUFjdGl2YXRpb24sIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgICAgIGJEZXIgPSB1bmZ1c2VkTWF0TXVsKGEzRCwgZHlBY3RpdmF0aW9uLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYURlciA9IHVuZnVzZWRNYXRNdWwoYjNELCBkeUFjdGl2YXRpb24sIHRydWUsIHRydWUpO1xuICAgICAgICAgICAgYkRlciA9IHVuZnVzZWRNYXRNdWwoZHlBY3RpdmF0aW9uLCBhM0QsIHRydWUsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiaWFzICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGJpYXNEZXIgPSBnZXRGdXNlZEJpYXNHcmFkaWVudCgkYmlhcywgZHlBY3RpdmF0aW9uKTtcbiAgICAgICAgICAgIHJldHVybiBbYURlciwgYkRlciwgYmlhc0Rlcl07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW2FEZXIsIGJEZXJdO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBpbnB1dHMgPSB7XG4gICAgICAgIGE6IGEzRCxcbiAgICAgICAgYjogYjNELFxuICAgICAgICBiaWFzOiAkYmlhcyxcbiAgICAgICAgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0czogJHByZWx1QWN0aXZhdGlvbldlaWdodHNcbiAgICB9O1xuICAgIGNvbnN0IGF0dHJzID0geyB0cmFuc3Bvc2VBLCB0cmFuc3Bvc2VCLCBhY3RpdmF0aW9uLCBsZWFreXJlbHVBbHBoYSB9O1xuICAgIC8vIERlcGVuZGluZyBvbiB0aGUgdGhlIHBhcmFtcyBwYXNzZWQgaW4gd2Ugd2lsbCBoYXZlIGRpZmZlcmVudCBudW1iZXIgb2ZcbiAgICAvLyBpbnB1dHMgYW5kIHRodXMgYSBhIGRpZmZlcmVudCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGdyYWRpZW50LlxuICAgIGlmIChiaWFzID09IG51bGwpIHtcbiAgICAgICAgY29uc3QgY3VzdG9tT3AgPSBjdXN0b21HcmFkKChhM0QsIGIzRCwgc2F2ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzID0gXG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgICAgICAgICBFTkdJTkUucnVuS2VybmVsKF9GdXNlZE1hdE11bCwgaW5wdXRzLCBhdHRycyk7XG4gICAgICAgICAgICBzYXZlKFthM0QsIGIzRCwgcmVzXSk7XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogcmVzaGFwZShyZXMsIG91dFNoYXBlKSwgZ3JhZEZ1bmM6IGdyYWQgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjdXN0b21PcChhM0QsIGIzRCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBjdXN0b21PcFdpdGhCaWFzID0gY3VzdG9tR3JhZCgoYTNELCBiM0QsICRiaWFzLCBzYXZlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXMgPSBcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICAgICAgICAgIEVOR0lORS5ydW5LZXJuZWwoX0Z1c2VkTWF0TXVsLCBpbnB1dHMsIGF0dHJzKTtcbiAgICAgICAgICAgIHNhdmUoW2EzRCwgYjNELCByZXMsICRiaWFzXSk7XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogcmVzaGFwZShyZXMsIG91dFNoYXBlKSwgZ3JhZEZ1bmM6IGdyYWQgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjdXN0b21PcFdpdGhCaWFzKGEzRCwgYjNELCAkYmlhcyk7XG4gICAgfVxufVxuZXhwb3J0IGNvbnN0IG1hdE11bCA9IG9wKHsgZnVzZWRNYXRNdWxfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWF0X211bC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjb252MmQgfSBmcm9tICcuL2Z1c2VkL2NvbnYyZCc7XG5pbXBvcnQgeyBkZXB0aHdpc2VDb252MmQgfSBmcm9tICcuL2Z1c2VkL2RlcHRod2lzZV9jb252MmQnO1xuaW1wb3J0IHsgbWF0TXVsIH0gZnJvbSAnLi9mdXNlZC9tYXRfbXVsJztcbmV4cG9ydCB7IGNvbnYyZCwgZGVwdGh3aXNlQ29udjJkLCBtYXRNdWwgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZ1c2VkX29wcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgKiBhcyBicm9hZGNhc3RfdXRpbCBmcm9tICcuL2Jyb2FkY2FzdF91dGlsJztcbmltcG9ydCB7IGVsdSB9IGZyb20gJy4vZWx1JztcbmltcG9ydCB7IGxlYWt5UmVsdSB9IGZyb20gJy4vbGVha3lfcmVsdSc7XG5pbXBvcnQgeyBtdWwgfSBmcm9tICcuL211bCc7XG5pbXBvcnQgeyBwcmVsdSB9IGZyb20gJy4vcHJlbHUnO1xuaW1wb3J0IHsgcmVsdSB9IGZyb20gJy4vcmVsdSc7XG5pbXBvcnQgeyByZWx1NiB9IGZyb20gJy4vcmVsdTYnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vcmVzaGFwZSc7XG5pbXBvcnQgeyBzaWdtb2lkIH0gZnJvbSAnLi9zaWdtb2lkJztcbmltcG9ydCB7IHN0ZXAgfSBmcm9tICcuL3N0ZXAnO1xuaW1wb3J0IHsgc3VtIH0gZnJvbSAnLi9zdW0nO1xuLy8gUmV0dXJucyBncmFkaWVudCBmb3IgZnVzZWQgYWN0aXZhdGlvbi5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGdXNlZER5QWN0aXZhdGlvbihkeSwgeSwgYWN0aXZhdGlvbikge1xuICAgIGlmIChhY3RpdmF0aW9uID09IG51bGwgfHwgYWN0aXZhdGlvbiA9PT0gJ2xpbmVhcicpIHtcbiAgICAgICAgcmV0dXJuIGR5O1xuICAgIH1cbiAgICBpZiAoYWN0aXZhdGlvbiA9PT0gJ3JlbHUnKSB7XG4gICAgICAgIHJldHVybiBtdWwoZHksIHN0ZXAoeSkpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb21wdXRlIGdyYWRpZW50IGZvciBmdXNlZCBhY3RpdmF0aW9uICR7YWN0aXZhdGlvbn0uYCk7XG59XG4vLyBSZXR1cm5zIGdyYWRpZW50IGZvciBmdXNlZCBiaWFzLlxuZXhwb3J0IGZ1bmN0aW9uIGdldEZ1c2VkQmlhc0dyYWRpZW50KGJpYXMsIGR5QWN0aXZhdGlvbikge1xuICAgIGxldCByZXMgPSBkeUFjdGl2YXRpb247XG4gICAgY29uc3QgcmVkdWNlQXhlcyA9IGJyb2FkY2FzdF91dGlsLmdldFJlZHVjdGlvbkF4ZXMoYmlhcy5zaGFwZSwgZHlBY3RpdmF0aW9uLnNoYXBlKTtcbiAgICBpZiAocmVkdWNlQXhlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlcyA9IHN1bShyZXMsIHJlZHVjZUF4ZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzaGFwZShyZXMsIGJpYXMuc2hhcGUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5QWN0aXZhdGlvbih4LCBhY3RpdmF0aW9uLCBwcmVsdUFjdGl2YXRpb25XZWlnaHRzLCBsZWFreXJlbHVBbHBoYSkge1xuICAgIGlmIChhY3RpdmF0aW9uID09PSAnbGluZWFyJykge1xuICAgICAgICByZXR1cm4geDtcbiAgICB9XG4gICAgZWxzZSBpZiAoYWN0aXZhdGlvbiA9PT0gJ3JlbHUnKSB7XG4gICAgICAgIHJldHVybiByZWx1KHgpO1xuICAgIH1cbiAgICBlbHNlIGlmIChhY3RpdmF0aW9uID09PSAnZWx1Jykge1xuICAgICAgICByZXR1cm4gZWx1KHgpO1xuICAgIH1cbiAgICBlbHNlIGlmIChhY3RpdmF0aW9uID09PSAncmVsdTYnKSB7XG4gICAgICAgIHJldHVybiByZWx1Nih4KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYWN0aXZhdGlvbiA9PT0gJ3ByZWx1Jykge1xuICAgICAgICByZXR1cm4gcHJlbHUoeCwgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdsZWFreXJlbHUnKSB7XG4gICAgICAgIHJldHVybiBsZWFreVJlbHUoeCwgbGVha3lyZWx1QWxwaGEpO1xuICAgIH1cbiAgICBlbHNlIGlmIChhY3RpdmF0aW9uID09PSAnc2lnbW9pZCcpIHtcbiAgICAgICAgcmV0dXJuIHNpZ21vaWQoeCk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBmdXNlZCBhY3RpdmF0aW9uICR7YWN0aXZhdGlvbn0uYCk7XG59XG4vLyBXaGV0aGVyIHdlIHNob3VsZCBjYWxsIGZ1c2VkIG9wcy5cbmV4cG9ydCBjb25zdCBzaG91bGRGdXNlID0gKGdyYWRpZW50RGVwdGgsIGFjdGl2YXRpb24pID0+IHtcbiAgICBjb25zdCBncmFkaWVudE1vZGUgPSBncmFkaWVudERlcHRoID4gMDtcbiAgICByZXR1cm4gIWdyYWRpZW50TW9kZSB8fCBhY3RpdmF0aW9uID09PSAnbGluZWFyJztcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mdXNlZF91dGlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBHYXRoZXJWMiB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIEdhdGhlciBzbGljZXMgZnJvbSB0ZW5zb3IgYHhgJ3MgYXhpcyBgYXhpc2AgYWNjb3JkaW5nIHRvIGBpbmRpY2VzYC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzLCA0XSk7XG4gKiBjb25zdCBpbmRpY2VzID0gdGYudGVuc29yMWQoWzEsIDMsIDNdLCAnaW50MzInKTtcbiAqXG4gKiB4LmdhdGhlcihpbmRpY2VzKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IyZChbMSwgMiwgMywgNF0sIFsyLCAyXSk7XG4gKiBjb25zdCBpbmRpY2VzID0gdGYudGVuc29yMWQoWzEsIDEsIDBdLCAnaW50MzInKTtcbiAqXG4gKiB4LmdhdGhlcihpbmRpY2VzKS5wcmludCgpO1xuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yIHdob3NlIHNsaWNlcyB0byBiZSBnYXRoZXJlZC5cbiAqIEBwYXJhbSBpbmRpY2VzIFRoZSBpbmRpY2VzIG9mIHRoZSB2YWx1ZXMgdG8gZXh0cmFjdC5cbiAqIEBwYXJhbSBheGlzIFRoZSBheGlzIG92ZXIgd2hpY2ggdG8gc2VsZWN0IHZhbHVlcy4gRGVmYXVsdHMgdG8gMC5cbiAqIEBwYXJhbSBiYXRjaERpbXMgT3B0aW9uYWwuIFRoZSBudW1iZXIgb2YgYmF0Y2ggZGltZW5zaW9ucy4gSXQgbXVzdCBiZSBsZXNzXG4gKiAgICAgdGhhbiBvciBlcXVhbCB0byByYW5rKGluZGljZXMpLiBEZWZhdWx0cyB0byAwLlxuICogICAgIFRoZSBvdXRwdXQgdGVuc29yIHdpbGwgaGF2ZSBzaGFwZSBvZlxuICogICAgIGB4LnNoYXBlWzpheGlzXSArIGluZGljZXMuc2hhcGVbYmF0Y2hEaW1zOl0gKyB4LnNoYXBlW2F4aXMgKyAxOl1gXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnU2xpY2luZyBhbmQgSm9pbmluZyd9XG4gKi9cbmZ1bmN0aW9uIGdhdGhlcl8oeCwgaW5kaWNlcywgYXhpcyA9IDAsIGJhdGNoRGltcyA9IDApIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdnYXRoZXInKTtcbiAgICBjb25zdCAkaW5kaWNlcyA9IGNvbnZlcnRUb1RlbnNvcihpbmRpY2VzLCAnaW5kaWNlcycsICdnYXRoZXInLCAnaW50MzInKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4LCBpbmRpY2VzOiAkaW5kaWNlcyB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBheGlzLCBiYXRjaERpbXMgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChHYXRoZXJWMiwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgZ2F0aGVyID0gb3AoeyBnYXRoZXJfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2F0aGVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBHYXRoZXJOZCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIEdhdGhlciBzbGljZXMgZnJvbSBpbnB1dCB0ZW5zb3IgaW50byBhIFRlbnNvciB3aXRoIHNoYXBlIHNwZWNpZmllZCBieVxuICogYGluZGljZXNgLlxuICpcbiAqIGBpbmRpY2VzYCBpcyBhbiBLLWRpbWVuc2lvbmFsIGludGVnZXIgdGVuc29yLCBiZXN0IHRob3VnaHQgb2YgYXMgYVxuICogKEstMSktZGltZW5zaW9uYWwgdGVuc29yIG9mIGluZGljZXMgaW50byBpbnB1dCwgd2hlcmUgZWFjaCBlbGVtZW50IGRlZmluZXMgYVxuICogc2xpY2Ugb2YgaW5wdXQ6XG4gKiBvdXRwdXRbXFxcXChpXzAsIC4uLiwgaV97Sy0yfVxcXFwpXSA9IGlucHV0W2luZGljZXNbXFxcXChpXzAsIC4uLiwgaV97Sy0yfVxcXFwpXV1cbiAqXG4gKiBXaGVyZWFzIGluIGB0Zi5nYXRoZXJgLCBgaW5kaWNlc2AgZGVmaW5lcyBzbGljZXMgaW50byB0aGUgZmlyc3QgZGltZW5zaW9uIG9mXG4gKiBpbnB1dCwgaW4gYHRmLmdhdGhlck5EYCwgYGluZGljZXNgIGRlZmluZXMgc2xpY2VzIGludG8gdGhlIGZpcnN0IE4gZGltZW5zaW9uc1xuICogb2YgaW5wdXQsIHdoZXJlIE4gPSBpbmRpY2VzLnNoYXBlWy0xXS5cbiAqXG4gKiBUaGUgbGFzdCBkaW1lbnNpb24gb2YgaW5kaWNlcyBjYW4gYmUgYXQgbW9zdCB0aGUgcmFuayBvZiBpbnB1dDpcbiAqIGluZGljZXMuc2hhcGVbLTFdIDw9IGlucHV0LnJhbmtcbiAqXG4gKiBUaGUgbGFzdCBkaW1lbnNpb24gb2YgYGluZGljZXNgIGNvcnJlc3BvbmRzIHRvIGVsZW1lbnRzXG4gKiAoaWYgaW5kaWNlcy5zaGFwZVstMV0gPT0gaW5wdXQucmFuaykgb3Igc2xpY2VzXG4gKiAoaWYgaW5kaWNlcy5zaGFwZVstMV0gPCBpbnB1dC5yYW5rKSBhbG9uZyBkaW1lbnNpb24gaW5kaWNlcy5zaGFwZVstMV0gb2ZcbiAqIGlucHV0LlxuICogVGhlIG91dHB1dCB0ZW5zb3IgaGFzIHNoYXBlXG4gKiBpbmRpY2VzLnNoYXBlWzotMV0gKyBpbnB1dC5zaGFwZVtpbmRpY2VzLnNoYXBlWy0xXTpdXG4gKlxuICogTm90ZSB0aGF0IG9uIENQVSwgaWYgYW4gb3V0IG9mIGJvdW5kIGluZGV4IGlzIGZvdW5kLCBhbiBlcnJvciBpcyByZXR1cm5lZC4gT25cbiAqIEdQVSwgaWYgYW4gb3V0IG9mIGJvdW5kIGluZGV4IGlzIGZvdW5kLCBhIDAgaXMgc3RvcmVkIGluIHRoZSBjb3JyZXNwb25kaW5nXG4gKiBvdXRwdXQgdmFsdWUuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGluZGljZXMgPSB0Zi50ZW5zb3IyZChbMCwgMSwgMSwgMF0sIFsyLDJdLCAnaW50MzInKTtcbiAqIGNvbnN0IGlucHV0ID0gdGYudGVuc29yMmQoWzksIDEwLCAxMSwgMTJdLCBbMiwgMl0pO1xuICogdGYuZ2F0aGVyTkQoaW5wdXQsIGluZGljZXMpLnByaW50KCkgLy8gWzEwLCAxMV1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSB0ZW5zb3IgZnJvbSB3aGljaCB0byBnYXRoZXIgdmFsdWVzLlxuICogQHBhcmFtIGluZGljZXMgSW5kZXggdGVuc29yLCBtdXN0IGJlIG9mIHR5cGUgaW50MzIuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU2xpY2luZyBhbmQgSm9pbmluZyd9XG4gKi9cbmZ1bmN0aW9uIGdhdGhlck5EXyh4LCBpbmRpY2VzKSB7XG4gICAgY29uc3QgJGluZGljZXMgPSBjb252ZXJ0VG9UZW5zb3IoaW5kaWNlcywgJ2luZGljZXMnLCAnZ2F0aGVyTkQnLCAnaW50MzInKTtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdnYXRoZXJORCcsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgcGFyYW1zOiAkeCwgaW5kaWNlczogJGluZGljZXMgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChHYXRoZXJOZCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBnYXRoZXJORCA9IG9wKHsgZ2F0aGVyTkRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2F0aGVyX25kLmpzLm1hcCIsImltcG9ydCB7IGNvbXB1dGVTdHJpZGVzLCBzaXplRnJvbVNoYXBlIH0gZnJvbSAnLi4vdXRpbCc7XG4vKipcbiAqIFZhbGlkYXRlIGdhdGhlciBuZCBpbnB1dHMuXG4gKlxuICogQHBhcmFtIHRlbnNvciBUaGUgdGVuc29yIGNvbnRhaW5zIHRoZSBzb3VyY2UgdmFsdWVzLlxuICogQHBhcmFtIGluZGljZXMgVGhlIHRlbnNvciBjb250YWlucyB0aGUgaW5kaWNlcyB0byBzbGljZSB0aGUgc291cmNlLlxuICpcbiAqIEByZXR1cm5zIFtyZXN1bHRTaGFwZSwgbnVtVXBkYXRlcywgc2xpY2VTaXplLCBzdHJpZGVzXVxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZUFuZFZhbGlkYXRlKHRlbnNvciwgaW5kaWNlcykge1xuICAgIGNvbnN0IHRlbnNvclJhbmsgPSB0ZW5zb3Iuc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IGluZGljZXNSYW5rID0gaW5kaWNlcy5zaGFwZS5sZW5ndGg7XG4gICAgaWYgKHRlbnNvclJhbmsgPCAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGYuZ2F0aGVyTkQoKSBleHBlY3RzIHRoZSBpbnB1dCB0byBiZSByYW5rIDEgb3IgaGlnaGVyLCcgK1xuICAgICAgICAgICAgYCBidXQgdGhlIHJhbmsgd2FzICR7dGVuc29yUmFua30uYCk7XG4gICAgfVxuICAgIGlmIChpbmRpY2VzUmFuayA8IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0Zi5nYXRoZXJORCgpIGV4cGVjdHMgdGhlIGluZGljZXMgdG8gYmUgcmFuayAxIG9yIGhpZ2hlciwnICtcbiAgICAgICAgICAgIGAgYnV0IHRoZSByYW5rIHdhcyAke2luZGljZXNSYW5rfS5gKTtcbiAgICB9XG4gICAgaWYgKGluZGljZXMuZHR5cGUgIT09ICdpbnQzMicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0Zi5nYXRoZXJORCgpIGV4cGVjdHMgdGhlIGluZGljZXMgdG8gYmUgaW50MzIgdHlwZSwnICtcbiAgICAgICAgICAgIGAgYnV0IHRoZSBkdHlwZSB3YXMgJHtpbmRpY2VzLmR0eXBlfS5gKTtcbiAgICB9XG4gICAgaWYgKGluZGljZXMuc2hhcGVbaW5kaWNlc1JhbmsgLSAxXSA+IHRlbnNvclJhbmspIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbmRleCBpbm5lcm1vc3QgZGltZW5zaW9uIGxlbmd0aCBtdXN0IGJlIDw9IHRlbnNvciByYW5rOyBzYXc6ICcgK1xuICAgICAgICAgICAgYCR7aW5kaWNlcy5zaGFwZVtpbmRpY2VzUmFuayAtIDFdfSB2cy4gJHt0ZW5zb3JSYW5rfWApO1xuICAgIH1cbiAgICBpZiAoc2l6ZUZyb21TaGFwZSh0ZW5zb3Iuc2hhcGUpID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWVzdGVkIG1vcmUgdGhhbiAwIGVudHJpZXMsIGJ1dCBpbnB1dCBpcyBlbXB0eS4nICtcbiAgICAgICAgICAgIGAgSW5wdXQgc2hhcGU6ICR7dGVuc29yLnNoYXBlfS5gKTtcbiAgICB9XG4gICAgY29uc3QgaW5kaWNlc1NoYXBlID0gaW5kaWNlcy5zaGFwZTtcbiAgICBjb25zdCBzbGljZVJhbmsgPSBpbmRpY2VzU2hhcGVbaW5kaWNlc1NoYXBlLmxlbmd0aCAtIDFdO1xuICAgIC8vIFRoZSByZXN1bHQgc2hhcGUgaXNcbiAgICAvLyAgIGluZGljZXMuc2hhcGVbOi0xXSArIHBhcmFtcy5zaGFwZVtpbmRpY2VzLnNoYXBlWy0xXTpdXG4gICAgbGV0IG5SZXN1bHQgPSAxO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kaWNlc1NoYXBlLmxlbmd0aCAtIDE7ICsraSkge1xuICAgICAgICBuUmVzdWx0ICo9IGluZGljZXNTaGFwZVtpXTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRTaGFwZSA9IHRlbnNvci5zaGFwZTtcbiAgICBjb25zdCByZXN1bHRTaGFwZSA9IGluZGljZXNTaGFwZS5zbGljZSgpO1xuICAgIHJlc3VsdFNoYXBlLnBvcCgpO1xuICAgIGxldCBzbGljZVNpemUgPSAxO1xuICAgIGZvciAobGV0IGkgPSBzbGljZVJhbms7IGkgPCB0ZW5zb3JSYW5rOyArK2kpIHtcbiAgICAgICAgc2xpY2VTaXplICo9IGlucHV0U2hhcGVbaV07XG4gICAgICAgIHJlc3VsdFNoYXBlLnB1c2goaW5wdXRTaGFwZVtpXSk7XG4gICAgfVxuICAgIGNvbnN0IHN0cmlkZXMgPSBbLi4uY29tcHV0ZVN0cmlkZXModGVuc29yLnNoYXBlKS5tYXAoc3RyaWRlID0+IHN0cmlkZSAvIHNsaWNlU2l6ZSksXG4gICAgICAgIDFdLnNsaWNlKDAsIHNsaWNlUmFuayk7XG4gICAgcmV0dXJuIFtyZXN1bHRTaGFwZSwgblJlc3VsdCwgc2xpY2VTaXplLCBzdHJpZGVzXTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdhdGhlcl9uZF91dGlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBHcmVhdGVyIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IG1ha2VUeXBlc01hdGNoIH0gZnJvbSAnLi4vdGVuc29yX3V0aWwnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlIH0gZnJvbSAnLi9icm9hZGNhc3RfdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV0dXJucyB0aGUgdHJ1dGggdmFsdWUgb2YgKGEgPiBiKSBlbGVtZW50LXdpc2UuIFN1cHBvcnRzIGJyb2FkY2FzdGluZy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzIsIDIsIDJdKTtcbiAqXG4gKiBhLmdyZWF0ZXIoYikucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBpbnB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIGlucHV0IHRlbnNvci4gTXVzdCBoYXZlIHRoZSBzYW1lIGR0eXBlIGFzIGBhYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdMb2dpY2FsJ31cbiAqL1xuZnVuY3Rpb24gZ3JlYXRlcl8oYSwgYikge1xuICAgIGxldCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdncmVhdGVyJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG4gICAgbGV0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ2dyZWF0ZXInLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgICBbJGEsICRiXSA9IG1ha2VUeXBlc01hdGNoKCRhLCAkYik7XG4gICAgYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoJGEuc2hhcGUsICRiLnNoYXBlKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGE6ICRhLCBiOiAkYiB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEdyZWF0ZXIsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgZ3JlYXRlciA9IG9wKHsgZ3JlYXRlcl8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ncmVhdGVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBHcmVhdGVyRXF1YWwgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgbWFrZVR5cGVzTWF0Y2ggfSBmcm9tICcuLi90ZW5zb3JfdXRpbCc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUgfSBmcm9tICcuL2Jyb2FkY2FzdF91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSB0cnV0aCB2YWx1ZSBvZiAoYSA+PSBiKSBlbGVtZW50LXdpc2UuIFN1cHBvcnRzIGJyb2FkY2FzdGluZy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzIsIDIsIDJdKTtcbiAqXG4gKiBhLmdyZWF0ZXJFcXVhbChiKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGEgVGhlIGZpcnN0IGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgaW5wdXQgdGVuc29yLiBNdXN0IGhhdmUgdGhlIHNhbWUgZHR5cGUgYXMgYGFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0xvZ2ljYWwnfVxuICovXG5mdW5jdGlvbiBncmVhdGVyRXF1YWxfKGEsIGIpIHtcbiAgICBsZXQgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnZ3JlYXRlckVxdWFsJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG4gICAgbGV0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ2dyZWF0ZXJFcXVhbCcsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICAgIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcbiAgICBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSgkYS5zaGFwZSwgJGIuc2hhcGUpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgYTogJGEsIGI6ICRiIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoR3JlYXRlckVxdWFsLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGdyZWF0ZXJFcXVhbCA9IG9wKHsgZ3JlYXRlckVxdWFsXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdyZWF0ZXJfZXF1YWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEltYWcgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbWFnaW5hcnkgcGFydCBvZiBhIGNvbXBsZXggKG9yIHJlYWwpIHRlbnNvci5cbiAqXG4gKiBHaXZlbiBhIHRlbnNvciBpbnB1dCwgdGhpcyBvcGVyYXRpb24gcmV0dXJucyBhIHRlbnNvciBvZiB0eXBlIGZsb2F0IHRoYXQgaXNcbiAqIHRoZSBpbWFnaW5hcnkgcGFydCBvZiBlYWNoIGVsZW1lbnQgaW4gaW5wdXQgY29uc2lkZXJlZCBhcyBhIGNvbXBsZXggbnVtYmVyLlxuICogSWYgaW5wdXQgaXMgcmVhbCwgYSB0ZW5zb3Igb2YgYWxsIHplcm9zIGlzIHJldHVybmVkLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYuY29tcGxleChbLTIuMjUsIDMuMjVdLCBbNC43NSwgNS43NV0pO1xuICogdGYuaW1hZyh4KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5mdW5jdGlvbiBpbWFnXyhpbnB1dCkge1xuICAgIGNvbnN0ICRpbnB1dCA9IGNvbnZlcnRUb1RlbnNvcihpbnB1dCwgJ2lucHV0JywgJ2ltYWcnKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGlucHV0OiAkaW5wdXQgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChJbWFnLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGltYWcgPSBvcCh7IGltYWdfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW1hZy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgQ3JvcEFuZFJlc2l6ZSB9IGZyb20gJy4uLy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbi8qKlxuICogRXh0cmFjdHMgY3JvcHMgZnJvbSB0aGUgaW5wdXQgaW1hZ2UgdGVuc29yIGFuZCByZXNpemVzIHRoZW0gdXNpbmcgYmlsaW5lYXJcbiAqIHNhbXBsaW5nIG9yIG5lYXJlc3QgbmVpZ2hib3Igc2FtcGxpbmcgKHBvc3NpYmx5IHdpdGggYXNwZWN0IHJhdGlvIGNoYW5nZSlcbiAqIHRvIGEgY29tbW9uIG91dHB1dCBzaXplIHNwZWNpZmllZCBieSBjcm9wU2l6ZS5cbiAqXG4gKiBAcGFyYW0gaW1hZ2UgNGQgdGVuc29yIG9mIHNoYXBlIGBbYmF0Y2gsaW1hZ2VIZWlnaHQsaW1hZ2VXaWR0aCwgZGVwdGhdYCxcbiAqICAgICB3aGVyZSBpbWFnZUhlaWdodCBhbmQgaW1hZ2VXaWR0aCBtdXN0IGJlIHBvc2l0aXZlLCBzcGVjaWZ5aW5nIHRoZVxuICogICAgIGJhdGNoIG9mIGltYWdlcyBmcm9tIHdoaWNoIHRvIHRha2UgY3JvcHNcbiAqIEBwYXJhbSBib3hlcyAyZCBmbG9hdDMyIHRlbnNvciBvZiBzaGFwZSBgW251bUJveGVzLCA0XWAuIEVhY2ggZW50cnkgaXNcbiAqICAgICBgW3kxLCB4MSwgeTIsIHgyXWAsIHdoZXJlIGAoeTEsIHgxKWAgYW5kIGAoeTIsIHgyKWAgYXJlIHRoZSBub3JtYWxpemVkXG4gKiAgICAgY29vcmRpbmF0ZXMgb2YgdGhlIGJveCBpbiB0aGUgYm94SW5kW2ldJ3RoIGltYWdlIGluIHRoZSBiYXRjaFxuICogQHBhcmFtIGJveEluZCAxZCBpbnQzMiB0ZW5zb3Igb2Ygc2hhcGUgYFtudW1Cb3hlc11gIHdpdGggdmFsdWVzIGluIHJhbmdlXG4gKiAgICAgYFswLCBiYXRjaClgIHRoYXQgc3BlY2lmaWVzIHRoZSBpbWFnZSB0aGF0IHRoZSBgaWAtdGggYm94IHJlZmVycyB0by5cbiAqIEBwYXJhbSBjcm9wU2l6ZSAxZCBpbnQzMiB0ZW5zb3Igb2YgMiBlbGVtZW50cyBgW2Nyb3BIZWlnaCwgY3JvcFdpZHRoXWBcbiAqICAgICBzcGVjaWZ5aW5nIHRoZSBzaXplIHRvIHdoaWNoIGFsbCBjcm9wcyBhcmUgcmVzaXplZCB0by5cbiAqIEBwYXJhbSBtZXRob2QgT3B0aW9uYWwgc3RyaW5nIGZyb20gYCdiaWxpbmVhcicgfCAnbmVhcmVzdCdgLFxuICogICAgIGRlZmF1bHRzIHRvIGJpbGluZWFyLCB3aGljaCBzcGVjaWZpZXMgdGhlIHNhbXBsaW5nIG1ldGhvZCBmb3IgcmVzaXppbmdcbiAqIEBwYXJhbSBleHRyYXBvbGF0aW9uVmFsdWUgQSB0aHJlc2hvbGQgZm9yIGRlY2lkaW5nIHdoZW4gdG8gcmVtb3ZlIGJveGVzIGJhc2VkXG4gKiAgICAgb24gc2NvcmUuIERlZmF1bHRzIHRvIDAuXG4gKiBAcmV0dXJuIEEgNEQgdGVuc29yIG9mIHRoZSBzaGFwZSBgW251bUJveGVzLGNyb3BIZWlnaHQsY3JvcFdpZHRoLGRlcHRoXWBcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdJbWFnZXMnLCBuYW1lc3BhY2U6ICdpbWFnZSd9XG4gKi9cbmZ1bmN0aW9uIGNyb3BBbmRSZXNpemVfKGltYWdlLCBib3hlcywgYm94SW5kLCBjcm9wU2l6ZSwgbWV0aG9kID0gJ2JpbGluZWFyJywgZXh0cmFwb2xhdGlvblZhbHVlID0gMCkge1xuICAgIGNvbnN0ICRpbWFnZSA9IGNvbnZlcnRUb1RlbnNvcihpbWFnZSwgJ2ltYWdlJywgJ2Nyb3BBbmRSZXNpemUnKTtcbiAgICBjb25zdCAkYm94ZXMgPSBjb252ZXJ0VG9UZW5zb3IoYm94ZXMsICdib3hlcycsICdjcm9wQW5kUmVzaXplJywgJ2Zsb2F0MzInKTtcbiAgICBjb25zdCAkYm94SW5kID0gY29udmVydFRvVGVuc29yKGJveEluZCwgJ2JveEluZCcsICdjcm9wQW5kUmVzaXplJywgJ2ludDMyJyk7XG4gICAgY29uc3QgbnVtQm94ZXMgPSAkYm94ZXMuc2hhcGVbMF07XG4gICAgdXRpbC5hc3NlcnQoJGltYWdlLnJhbmsgPT09IDQsICgpID0+ICdFcnJvciBpbiBjcm9wQW5kUmVzaXplOiBpbWFnZSBtdXN0IGJlIHJhbmsgNCwnICtcbiAgICAgICAgYGJ1dCBnb3QgcmFuayAkeyRpbWFnZS5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydCgkYm94ZXMucmFuayA9PT0gMiAmJiAkYm94ZXMuc2hhcGVbMV0gPT09IDQsICgpID0+IGBFcnJvciBpbiBjcm9wQW5kUmVzaXplOiBib3hlcyBtdXN0IGJlIGhhdmUgc2l6ZSBbJHtudW1Cb3hlc30sNF0gYCArXG4gICAgICAgIGBidXQgaGFkIHNoYXBlICR7JGJveGVzLnNoYXBlfS5gKTtcbiAgICB1dGlsLmFzc2VydCgkYm94SW5kLnJhbmsgPT09IDEgJiYgJGJveEluZC5zaGFwZVswXSA9PT0gbnVtQm94ZXMsICgpID0+IGBFcnJvciBpbiBjcm9wQW5kUmVzaXplOiBib3hJbmQgbXVzdCBiZSBoYXZlIHNpemUgWyR7bnVtQm94ZXN9XSBgICtcbiAgICAgICAgYGJ1dCBoYWQgc2hhcGUgJHskYm94ZXMuc2hhcGV9LmApO1xuICAgIHV0aWwuYXNzZXJ0KGNyb3BTaXplLmxlbmd0aCA9PT0gMiwgKCkgPT4gYEVycm9yIGluIGNyb3BBbmRSZXNpemU6IGNyb3BTaXplIG11c3QgYmUgb2YgbGVuZ3RoIDIsIGJ1dCBnb3QgYCArXG4gICAgICAgIGBsZW5ndGggJHtjcm9wU2l6ZS5sZW5ndGh9LmApO1xuICAgIHV0aWwuYXNzZXJ0KGNyb3BTaXplWzBdID49IDEgJiYgY3JvcFNpemVbMV0gPj0gMSwgKCkgPT4gYGNyb3BTaXplIG11c3QgYmUgYXRsZWFzdCBbMSwxXSwgYnV0IHdhcyAke2Nyb3BTaXplfWApO1xuICAgIHV0aWwuYXNzZXJ0KG1ldGhvZCA9PT0gJ2JpbGluZWFyJyB8fCBtZXRob2QgPT09ICduZWFyZXN0JywgKCkgPT4gYG1ldGhvZCBtdXN0IGJlIGJpbGluZWFyIG9yIG5lYXJlc3QsIGJ1dCB3YXMgJHttZXRob2R9YCk7XG4gICAgY29uc3QgaW5wdXRzID0geyBpbWFnZTogJGltYWdlLCBib3hlczogJGJveGVzLCBib3hJbmQ6ICRib3hJbmQgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgbWV0aG9kLCBleHRyYXBvbGF0aW9uVmFsdWUsIGNyb3BTaXplIH07XG4gICAgY29uc3QgcmVzID0gRU5HSU5FLnJ1bktlcm5lbChDcm9wQW5kUmVzaXplLCBpbnB1dHMsIGF0dHJzKTtcbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IGNyb3BBbmRSZXNpemUgPSBvcCh7IGNyb3BBbmRSZXNpemVfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y3JvcF9hbmRfcmVzaXplLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBGbGlwTGVmdFJpZ2h0IH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBGbGlwcyB0aGUgaW1hZ2UgbGVmdCB0byByaWdodC4gQ3VycmVudGx5IGF2YWlsYWJsZSBpbiB0aGUgQ1BVLCBXZWJHTCwgYW5kXG4gKiBXQVNNIGJhY2tlbmRzLlxuICpcbiAqIEBwYXJhbSBpbWFnZSA0ZCB0ZW5zb3Igb2Ygc2hhcGUgYFtiYXRjaCwgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIGRlcHRoXWAuXG4gKi9cbi8qKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdJbWFnZXMnLCBuYW1lc3BhY2U6ICdpbWFnZSd9ICovXG5mdW5jdGlvbiBmbGlwTGVmdFJpZ2h0XyhpbWFnZSkge1xuICAgIGNvbnN0ICRpbWFnZSA9IGNvbnZlcnRUb1RlbnNvcihpbWFnZSwgJ2ltYWdlJywgJ2ZsaXBMZWZ0UmlnaHQnLCAnZmxvYXQzMicpO1xuICAgIHV0aWwuYXNzZXJ0KCRpbWFnZS5yYW5rID09PSA0LCAoKSA9PiAnRXJyb3IgaW4gZmxpcExlZnRSaWdodDogaW1hZ2UgbXVzdCBiZSByYW5rIDQsJyArXG4gICAgICAgIGBidXQgZ290IHJhbmsgJHskaW1hZ2UucmFua30uYCk7XG4gICAgY29uc3QgaW5wdXRzID0geyBpbWFnZTogJGltYWdlIH07XG4gICAgY29uc3QgcmVzID0gRU5HSU5FLnJ1bktlcm5lbChGbGlwTGVmdFJpZ2h0LCBpbnB1dHMsIHt9KTtcbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IGZsaXBMZWZ0UmlnaHQgPSBvcCh7IGZsaXBMZWZ0UmlnaHRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmxpcF9sZWZ0X3JpZ2h0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBOb25NYXhTdXBwcmVzc2lvblYzIH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBub25NYXhTdXBwU2FuaXR5Q2hlY2sgfSBmcm9tICcuLi9ub25tYXhfdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4uL29wZXJhdGlvbic7XG4vKipcbiAqIFBlcmZvcm1zIG5vbiBtYXhpbXVtIHN1cHByZXNzaW9uIG9mIGJvdW5kaW5nIGJveGVzIGJhc2VkIG9uXG4gKiBpb3UgKGludGVyc2VjdGlvbiBvdmVyIHVuaW9uKS5cbiAqXG4gKiBAcGFyYW0gYm94ZXMgYSAyZCB0ZW5zb3Igb2Ygc2hhcGUgYFtudW1Cb3hlcywgNF1gLiBFYWNoIGVudHJ5IGlzXG4gKiAgICAgYFt5MSwgeDEsIHkyLCB4Ml1gLCB3aGVyZSBgKHkxLCB4MSlgIGFuZCBgKHkyLCB4MilgIGFyZSB0aGUgY29ybmVycyBvZlxuICogICAgIHRoZSBib3VuZGluZyBib3guXG4gKiBAcGFyYW0gc2NvcmVzIGEgMWQgdGVuc29yIHByb3ZpZGluZyB0aGUgYm94IHNjb3JlcyBvZiBzaGFwZSBgW251bUJveGVzXWAuXG4gKiBAcGFyYW0gbWF4T3V0cHV0U2l6ZSBUaGUgbWF4aW11bSBudW1iZXIgb2YgYm94ZXMgdG8gYmUgc2VsZWN0ZWQuXG4gKiBAcGFyYW0gaW91VGhyZXNob2xkIEEgZmxvYXQgcmVwcmVzZW50aW5nIHRoZSB0aHJlc2hvbGQgZm9yIGRlY2lkaW5nIHdoZXRoZXJcbiAqICAgICBib3hlcyBvdmVybGFwIHRvbyBtdWNoIHdpdGggcmVzcGVjdCB0byBJT1UuIE11c3QgYmUgYmV0d2VlbiBbMCwgMV0uXG4gKiAgICAgRGVmYXVsdHMgdG8gMC41ICg1MCUgYm94IG92ZXJsYXApLlxuICogQHBhcmFtIHNjb3JlVGhyZXNob2xkIEEgdGhyZXNob2xkIGZvciBkZWNpZGluZyB3aGVuIHRvIHJlbW92ZSBib3hlcyBiYXNlZFxuICogICAgIG9uIHNjb3JlLiBEZWZhdWx0cyB0byAtaW5mLCB3aGljaCBtZWFucyBhbnkgc2NvcmUgaXMgYWNjZXB0ZWQuXG4gKiBAcmV0dXJuIEEgMUQgdGVuc29yIHdpdGggdGhlIHNlbGVjdGVkIGJveCBpbmRpY2VzLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0ltYWdlcycsIG5hbWVzcGFjZTogJ2ltYWdlJ31cbiAqL1xuZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25fKGJveGVzLCBzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCA9IDAuNSwgc2NvcmVUaHJlc2hvbGQgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpIHtcbiAgICBjb25zdCAkYm94ZXMgPSBjb252ZXJ0VG9UZW5zb3IoYm94ZXMsICdib3hlcycsICdub25NYXhTdXBwcmVzc2lvbicpO1xuICAgIGNvbnN0ICRzY29yZXMgPSBjb252ZXJ0VG9UZW5zb3Ioc2NvcmVzLCAnc2NvcmVzJywgJ25vbk1heFN1cHByZXNzaW9uJyk7XG4gICAgY29uc3QgaW5wdXRzID0gbm9uTWF4U3VwcFNhbml0eUNoZWNrKCRib3hlcywgJHNjb3JlcywgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCk7XG4gICAgbWF4T3V0cHV0U2l6ZSA9IGlucHV0cy5tYXhPdXRwdXRTaXplO1xuICAgIGlvdVRocmVzaG9sZCA9IGlucHV0cy5pb3VUaHJlc2hvbGQ7XG4gICAgc2NvcmVUaHJlc2hvbGQgPSBpbnB1dHMuc2NvcmVUaHJlc2hvbGQ7XG4gICAgY29uc3QgYXR0cnMgPSB7IG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChOb25NYXhTdXBwcmVzc2lvblYzLCB7IGJveGVzOiAkYm94ZXMsIHNjb3JlczogJHNjb3JlcyB9LCBhdHRycyk7XG59XG5leHBvcnQgY29uc3Qgbm9uTWF4U3VwcHJlc3Npb24gPSBvcCh7IG5vbk1heFN1cHByZXNzaW9uXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW5vbl9tYXhfc3VwcHJlc3Npb24uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgbm9uTWF4U3VwcHJlc3Npb25WM0ltcGwgfSBmcm9tICcuLi8uLi9iYWNrZW5kcy9ub25fbWF4X3N1cHByZXNzaW9uX2ltcGwnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG5vbk1heFN1cHBTYW5pdHlDaGVjayB9IGZyb20gJy4uL25vbm1heF91dGlsJztcbmltcG9ydCB7IHRlbnNvcjFkIH0gZnJvbSAnLi4vdGVuc29yMWQnO1xuLyoqXG4gKiBQZXJmb3JtcyBub24gbWF4aW11bSBzdXBwcmVzc2lvbiBvZiBib3VuZGluZyBib3hlcyBiYXNlZCBvblxuICogaW91IChpbnRlcnNlY3Rpb24gb3ZlciB1bmlvbikuXG4gKlxuICogVGhpcyBpcyB0aGUgYXN5bmMgdmVyc2lvbiBvZiBgbm9uTWF4U3VwcHJlc3Npb25gXG4gKlxuICogQHBhcmFtIGJveGVzIGEgMmQgdGVuc29yIG9mIHNoYXBlIGBbbnVtQm94ZXMsIDRdYC4gRWFjaCBlbnRyeSBpc1xuICogICAgIGBbeTEsIHgxLCB5MiwgeDJdYCwgd2hlcmUgYCh5MSwgeDEpYCBhbmQgYCh5MiwgeDIpYCBhcmUgdGhlIGNvcm5lcnMgb2ZcbiAqICAgICB0aGUgYm91bmRpbmcgYm94LlxuICogQHBhcmFtIHNjb3JlcyBhIDFkIHRlbnNvciBwcm92aWRpbmcgdGhlIGJveCBzY29yZXMgb2Ygc2hhcGUgYFtudW1Cb3hlc11gLlxuICogQHBhcmFtIG1heE91dHB1dFNpemUgVGhlIG1heGltdW0gbnVtYmVyIG9mIGJveGVzIHRvIGJlIHNlbGVjdGVkLlxuICogQHBhcmFtIGlvdVRocmVzaG9sZCBBIGZsb2F0IHJlcHJlc2VudGluZyB0aGUgdGhyZXNob2xkIGZvciBkZWNpZGluZyB3aGV0aGVyXG4gKiAgICAgYm94ZXMgb3ZlcmxhcCB0b28gbXVjaCB3aXRoIHJlc3BlY3QgdG8gSU9VLiBNdXN0IGJlIGJldHdlZW4gWzAsIDFdLlxuICogICAgIERlZmF1bHRzIHRvIDAuNSAoNTAlIGJveCBvdmVybGFwKS5cbiAqIEBwYXJhbSBzY29yZVRocmVzaG9sZCBBIHRocmVzaG9sZCBmb3IgZGVjaWRpbmcgd2hlbiB0byByZW1vdmUgYm94ZXMgYmFzZWRcbiAqICAgICBvbiBzY29yZS4gRGVmYXVsdHMgdG8gLWluZiwgd2hpY2ggbWVhbnMgYW55IHNjb3JlIGlzIGFjY2VwdGVkLlxuICogQHJldHVybiBBIDFEIHRlbnNvciB3aXRoIHRoZSBzZWxlY3RlZCBib3ggaW5kaWNlcy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdJbWFnZXMnLCBuYW1lc3BhY2U6ICdpbWFnZSd9XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG5vbk1heFN1cHByZXNzaW9uQXN5bmNfKGJveGVzLCBzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCA9IDAuNSwgc2NvcmVUaHJlc2hvbGQgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpIHtcbiAgICBjb25zdCAkYm94ZXMgPSBjb252ZXJ0VG9UZW5zb3IoYm94ZXMsICdib3hlcycsICdub25NYXhTdXBwcmVzc2lvbkFzeW5jJyk7XG4gICAgY29uc3QgJHNjb3JlcyA9IGNvbnZlcnRUb1RlbnNvcihzY29yZXMsICdzY29yZXMnLCAnbm9uTWF4U3VwcHJlc3Npb25Bc3luYycpO1xuICAgIGNvbnN0IGlucHV0cyA9IG5vbk1heFN1cHBTYW5pdHlDaGVjaygkYm94ZXMsICRzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQpO1xuICAgIG1heE91dHB1dFNpemUgPSBpbnB1dHMubWF4T3V0cHV0U2l6ZTtcbiAgICBpb3VUaHJlc2hvbGQgPSBpbnB1dHMuaW91VGhyZXNob2xkO1xuICAgIHNjb3JlVGhyZXNob2xkID0gaW5wdXRzLnNjb3JlVGhyZXNob2xkO1xuICAgIGNvbnN0IGJveGVzQW5kU2NvcmVzID0gYXdhaXQgUHJvbWlzZS5hbGwoWyRib3hlcy5kYXRhKCksICRzY29yZXMuZGF0YSgpXSk7XG4gICAgY29uc3QgYm94ZXNWYWxzID0gYm94ZXNBbmRTY29yZXNbMF07XG4gICAgY29uc3Qgc2NvcmVzVmFscyA9IGJveGVzQW5kU2NvcmVzWzFdO1xuICAgIC8vIFdlIGNhbGwgYSBjcHUgYmFzZWQgaW1wbCBkaXJlY3RseSB3aXRoIHRoZSB0eXBlZGFycmF5IGRhdGEgIGhlcmUgcmF0aGVyXG4gICAgLy8gdGhhbiBhIGtlcm5lbCBiZWNhdXNlIGFsbCBrZXJuZWxzIGFyZSBzeW5jaHJvbm91cyAoYW5kIHRodXMgY2Fubm90IGF3YWl0XG4gICAgLy8gLmRhdGEoKSkuXG4gICAgY29uc3QgeyBzZWxlY3RlZEluZGljZXMgfSA9IG5vbk1heFN1cHByZXNzaW9uVjNJbXBsKGJveGVzVmFscywgc2NvcmVzVmFscywgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCk7XG4gICAgaWYgKCRib3hlcyAhPT0gYm94ZXMpIHtcbiAgICAgICAgJGJveGVzLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgaWYgKCRzY29yZXMgIT09IHNjb3Jlcykge1xuICAgICAgICAkc2NvcmVzLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRlbnNvcjFkKHNlbGVjdGVkSW5kaWNlcywgJ2ludDMyJyk7XG59XG5leHBvcnQgY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25Bc3luYyA9IG5vbk1heFN1cHByZXNzaW9uQXN5bmNfO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bm9uX21heF9zdXBwcmVzc2lvbl9hc3luYy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgTm9uTWF4U3VwcHJlc3Npb25WNCB9IGZyb20gJy4uLy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgbm9uTWF4U3VwcFNhbml0eUNoZWNrIH0gZnJvbSAnLi4vbm9ubWF4X3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBBc3luY2hyb25vdXNseSBwZXJmb3JtcyBub24gbWF4aW11bSBzdXBwcmVzc2lvbiBvZiBib3VuZGluZyBib3hlcyBiYXNlZCBvblxuICogaW91IChpbnRlcnNlY3Rpb24gb3ZlciB1bmlvbiksIHdpdGggYW4gb3B0aW9uIHRvIHBhZCByZXN1bHRzLlxuICpcbiAqIEBwYXJhbSBib3hlcyBhIDJkIHRlbnNvciBvZiBzaGFwZSBgW251bUJveGVzLCA0XWAuIEVhY2ggZW50cnkgaXNcbiAqICAgICBgW3kxLCB4MSwgeTIsIHgyXWAsIHdoZXJlIGAoeTEsIHgxKWAgYW5kIGAoeTIsIHgyKWAgYXJlIHRoZSBjb3JuZXJzIG9mXG4gKiAgICAgdGhlIGJvdW5kaW5nIGJveC5cbiAqIEBwYXJhbSBzY29yZXMgYSAxZCB0ZW5zb3IgcHJvdmlkaW5nIHRoZSBib3ggc2NvcmVzIG9mIHNoYXBlIGBbbnVtQm94ZXNdYC5cbiAqIEBwYXJhbSBtYXhPdXRwdXRTaXplIFRoZSBtYXhpbXVtIG51bWJlciBvZiBib3hlcyB0byBiZSBzZWxlY3RlZC5cbiAqIEBwYXJhbSBpb3VUaHJlc2hvbGQgQSBmbG9hdCByZXByZXNlbnRpbmcgdGhlIHRocmVzaG9sZCBmb3IgZGVjaWRpbmcgd2hldGhlclxuICogICAgIGJveGVzIG92ZXJsYXAgdG9vIG11Y2ggd2l0aCByZXNwZWN0IHRvIElPVS4gTXVzdCBiZSBiZXR3ZWVuIFswLCAxXS5cbiAqICAgICBEZWZhdWx0cyB0byAwLjUgKDUwJSBib3ggb3ZlcmxhcCkuXG4gKiBAcGFyYW0gc2NvcmVUaHJlc2hvbGQgQSB0aHJlc2hvbGQgZm9yIGRlY2lkaW5nIHdoZW4gdG8gcmVtb3ZlIGJveGVzIGJhc2VkXG4gKiAgICAgb24gc2NvcmUuIERlZmF1bHRzIHRvIC1pbmYsIHdoaWNoIG1lYW5zIGFueSBzY29yZSBpcyBhY2NlcHRlZC5cbiAqIEBwYXJhbSBwYWRUb01heE91dHB1dFNpemUgRGVmYWx0cyB0byBmYWxzZS4gSWYgdHJ1ZSwgc2l6ZSBvZiBvdXRwdXRcbiAqICAgICBgc2VsZWN0ZWRJbmRpY2VzYCBpcyBwYWRkZWQgdG8gbWF4T3V0cHV0U2l6ZS5cbiAqIEByZXR1cm4gQSBtYXAgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAgICAgLSBzZWxlY3RlZEluZGljZXM6IEEgMUQgdGVuc29yIHdpdGggdGhlIHNlbGVjdGVkIGJveCBpbmRpY2VzLlxuICogICAgIC0gdmFsaWRPdXRwdXRzOiBBIHNjYWxhciBkZW5vdGluZyBob3cgbWFueSBlbGVtZW50cyBpbiBgc2VsZWN0ZWRJbmRpY2VzYFxuICogICAgICAgYXJlIHZhbGlkLiBWYWxpZCBlbGVtZW50cyBvY2N1ciBmaXJzdCwgdGhlbiBwYWRkaW5nLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0ltYWdlcycsIG5hbWVzcGFjZTogJ2ltYWdlJ31cbiAqL1xuZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25QYWRkZWRfKGJveGVzLCBzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCA9IDAuNSwgc2NvcmVUaHJlc2hvbGQgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksIHBhZFRvTWF4T3V0cHV0U2l6ZSA9IGZhbHNlKSB7XG4gICAgY29uc3QgJGJveGVzID0gY29udmVydFRvVGVuc29yKGJveGVzLCAnYm94ZXMnLCAnbm9uTWF4U3VwcHJlc3Npb24nKTtcbiAgICBjb25zdCAkc2NvcmVzID0gY29udmVydFRvVGVuc29yKHNjb3JlcywgJ3Njb3JlcycsICdub25NYXhTdXBwcmVzc2lvbicpO1xuICAgIGNvbnN0IHBhcmFtcyA9IG5vbk1heFN1cHBTYW5pdHlDaGVjaygkYm94ZXMsICRzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsIG51bGwgLyogc29mdE5tc1NpZ21hICovKTtcbiAgICBjb25zdCAkbWF4T3V0cHV0U2l6ZSA9IHBhcmFtcy5tYXhPdXRwdXRTaXplO1xuICAgIGNvbnN0ICRpb3VUaHJlc2hvbGQgPSBwYXJhbXMuaW91VGhyZXNob2xkO1xuICAgIGNvbnN0ICRzY29yZVRocmVzaG9sZCA9IHBhcmFtcy5zY29yZVRocmVzaG9sZDtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGJveGVzOiAkYm94ZXMsIHNjb3JlczogJHNjb3JlcyB9O1xuICAgIGNvbnN0IGF0dHJzID0ge1xuICAgICAgICBtYXhPdXRwdXRTaXplOiAkbWF4T3V0cHV0U2l6ZSxcbiAgICAgICAgaW91VGhyZXNob2xkOiAkaW91VGhyZXNob2xkLFxuICAgICAgICBzY29yZVRocmVzaG9sZDogJHNjb3JlVGhyZXNob2xkLFxuICAgICAgICBwYWRUb01heE91dHB1dFNpemVcbiAgICB9O1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICBjb25zdCByZXN1bHQgPSBFTkdJTkUucnVuS2VybmVsKE5vbk1heFN1cHByZXNzaW9uVjQsIGlucHV0cywgYXR0cnMpO1xuICAgIHJldHVybiB7IHNlbGVjdGVkSW5kaWNlczogcmVzdWx0WzBdLCB2YWxpZE91dHB1dHM6IHJlc3VsdFsxXSB9O1xufVxuZXhwb3J0IGNvbnN0IG5vbk1heFN1cHByZXNzaW9uUGFkZGVkID0gb3AoeyBub25NYXhTdXBwcmVzc2lvblBhZGRlZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ub25fbWF4X3N1cHByZXNzaW9uX3BhZGRlZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBub25NYXhTdXBwcmVzc2lvblY0SW1wbCB9IGZyb20gJy4uLy4uL2JhY2tlbmRzL25vbl9tYXhfc3VwcHJlc3Npb25faW1wbCc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgbm9uTWF4U3VwcFNhbml0eUNoZWNrIH0gZnJvbSAnLi4vbm9ubWF4X3V0aWwnO1xuaW1wb3J0IHsgc2NhbGFyIH0gZnJvbSAnLi4vc2NhbGFyJztcbmltcG9ydCB7IHRlbnNvcjFkIH0gZnJvbSAnLi4vdGVuc29yMWQnO1xuLyoqXG4gKiBBc3luY2hyb25vdXNseSBwZXJmb3JtcyBub24gbWF4aW11bSBzdXBwcmVzc2lvbiBvZiBib3VuZGluZyBib3hlcyBiYXNlZCBvblxuICogaW91IChpbnRlcnNlY3Rpb24gb3ZlciB1bmlvbiksIHdpdGggYW4gb3B0aW9uIHRvIHBhZCByZXN1bHRzLlxuICpcbiAqIEBwYXJhbSBib3hlcyBhIDJkIHRlbnNvciBvZiBzaGFwZSBgW251bUJveGVzLCA0XWAuIEVhY2ggZW50cnkgaXNcbiAqICAgICBgW3kxLCB4MSwgeTIsIHgyXWAsIHdoZXJlIGAoeTEsIHgxKWAgYW5kIGAoeTIsIHgyKWAgYXJlIHRoZSBjb3JuZXJzIG9mXG4gKiAgICAgdGhlIGJvdW5kaW5nIGJveC5cbiAqIEBwYXJhbSBzY29yZXMgYSAxZCB0ZW5zb3IgcHJvdmlkaW5nIHRoZSBib3ggc2NvcmVzIG9mIHNoYXBlIGBbbnVtQm94ZXNdYC5cbiAqIEBwYXJhbSBtYXhPdXRwdXRTaXplIFRoZSBtYXhpbXVtIG51bWJlciBvZiBib3hlcyB0byBiZSBzZWxlY3RlZC5cbiAqIEBwYXJhbSBpb3VUaHJlc2hvbGQgQSBmbG9hdCByZXByZXNlbnRpbmcgdGhlIHRocmVzaG9sZCBmb3IgZGVjaWRpbmcgd2hldGhlclxuICogICAgIGJveGVzIG92ZXJsYXAgdG9vIG11Y2ggd2l0aCByZXNwZWN0IHRvIElPVS4gTXVzdCBiZSBiZXR3ZWVuIFswLCAxXS5cbiAqICAgICBEZWZhdWx0cyB0byAwLjUgKDUwJSBib3ggb3ZlcmxhcCkuXG4gKiBAcGFyYW0gc2NvcmVUaHJlc2hvbGQgQSB0aHJlc2hvbGQgZm9yIGRlY2lkaW5nIHdoZW4gdG8gcmVtb3ZlIGJveGVzIGJhc2VkXG4gKiAgICAgb24gc2NvcmUuIERlZmF1bHRzIHRvIC1pbmYsIHdoaWNoIG1lYW5zIGFueSBzY29yZSBpcyBhY2NlcHRlZC5cbiAqIEBwYXJhbSBwYWRUb01heE91dHB1dFNpemUgRGVmYWx0cyB0byBmYWxzZS4gSWYgdHJ1ZSwgc2l6ZSBvZiBvdXRwdXRcbiAqICAgICBgc2VsZWN0ZWRJbmRpY2VzYCBpcyBwYWRkZWQgdG8gbWF4T3V0cHV0U2l6ZS5cbiAqIEByZXR1cm4gQSBtYXAgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAgICAgLSBzZWxlY3RlZEluZGljZXM6IEEgMUQgdGVuc29yIHdpdGggdGhlIHNlbGVjdGVkIGJveCBpbmRpY2VzLlxuICogICAgIC0gdmFsaWRPdXRwdXRzOiBBIHNjYWxhciBkZW5vdGluZyBob3cgbWFueSBlbGVtZW50cyBpbiBgc2VsZWN0ZWRJbmRpY2VzYFxuICogICAgICAgYXJlIHZhbGlkLiBWYWxpZCBlbGVtZW50cyBvY2N1ciBmaXJzdCwgdGhlbiBwYWRkaW5nLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0ltYWdlcycsIG5hbWVzcGFjZTogJ2ltYWdlJ31cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25QYWRkZWRBc3luY18oYm94ZXMsIHNjb3JlcywgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkID0gMC41LCBzY29yZVRocmVzaG9sZCA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSwgcGFkVG9NYXhPdXRwdXRTaXplID0gZmFsc2UpIHtcbiAgICBjb25zdCAkYm94ZXMgPSBjb252ZXJ0VG9UZW5zb3IoYm94ZXMsICdib3hlcycsICdub25NYXhTdXBwcmVzc2lvbkFzeW5jJyk7XG4gICAgY29uc3QgJHNjb3JlcyA9IGNvbnZlcnRUb1RlbnNvcihzY29yZXMsICdzY29yZXMnLCAnbm9uTWF4U3VwcHJlc3Npb25Bc3luYycpO1xuICAgIGNvbnN0IHBhcmFtcyA9IG5vbk1heFN1cHBTYW5pdHlDaGVjaygkYm94ZXMsICRzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsIG51bGwgLyogc29mdE5tc1NpZ21hICovKTtcbiAgICBjb25zdCAkbWF4T3V0cHV0U2l6ZSA9IHBhcmFtcy5tYXhPdXRwdXRTaXplO1xuICAgIGNvbnN0ICRpb3VUaHJlc2hvbGQgPSBwYXJhbXMuaW91VGhyZXNob2xkO1xuICAgIGNvbnN0ICRzY29yZVRocmVzaG9sZCA9IHBhcmFtcy5zY29yZVRocmVzaG9sZDtcbiAgICBjb25zdCBbYm94ZXNWYWxzLCBzY29yZXNWYWxzXSA9IGF3YWl0IFByb21pc2UuYWxsKFskYm94ZXMuZGF0YSgpLCAkc2NvcmVzLmRhdGEoKV0pO1xuICAgIC8vIFdlIGNhbGwgYSBjcHUgYmFzZWQgaW1wbCBkaXJlY3RseSB3aXRoIHRoZSB0eXBlZGFycmF5IGRhdGEgaGVyZSByYXRoZXJcbiAgICAvLyB0aGFuIGEga2VybmVsIGJlY2F1c2UgYWxsIGtlcm5lbHMgYXJlIHN5bmNocm9ub3VzIChhbmQgdGh1cyBjYW5ub3QgYXdhaXRcbiAgICAvLyAuZGF0YSgpKS5cbiAgICBjb25zdCB7IHNlbGVjdGVkSW5kaWNlcywgdmFsaWRPdXRwdXRzIH0gPSBub25NYXhTdXBwcmVzc2lvblY0SW1wbChib3hlc1ZhbHMsIHNjb3Jlc1ZhbHMsICRtYXhPdXRwdXRTaXplLCAkaW91VGhyZXNob2xkLCAkc2NvcmVUaHJlc2hvbGQsIHBhZFRvTWF4T3V0cHV0U2l6ZSk7XG4gICAgaWYgKCRib3hlcyAhPT0gYm94ZXMpIHtcbiAgICAgICAgJGJveGVzLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgaWYgKCRzY29yZXMgIT09IHNjb3Jlcykge1xuICAgICAgICAkc2NvcmVzLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2VsZWN0ZWRJbmRpY2VzOiB0ZW5zb3IxZChzZWxlY3RlZEluZGljZXMsICdpbnQzMicpLFxuICAgICAgICB2YWxpZE91dHB1dHM6IHNjYWxhcih2YWxpZE91dHB1dHMsICdpbnQzMicpXG4gICAgfTtcbn1cbmV4cG9ydCBjb25zdCBub25NYXhTdXBwcmVzc2lvblBhZGRlZEFzeW5jID0gbm9uTWF4U3VwcHJlc3Npb25QYWRkZWRBc3luY187XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ub25fbWF4X3N1cHByZXNzaW9uX3BhZGRlZF9hc3luYy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgTm9uTWF4U3VwcHJlc3Npb25WNSB9IGZyb20gJy4uLy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgbm9uTWF4U3VwcFNhbml0eUNoZWNrIH0gZnJvbSAnLi4vbm9ubWF4X3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBQZXJmb3JtcyBub24gbWF4aW11bSBzdXBwcmVzc2lvbiBvZiBib3VuZGluZyBib3hlcyBiYXNlZCBvblxuICogaW91IChpbnRlcnNlY3Rpb24gb3ZlciB1bmlvbikuXG4gKlxuICogVGhpcyBvcCBhbHNvIHN1cHBvcnRzIGEgU29mdC1OTVMgbW9kZSAoYy5mLlxuICogQm9kbGEgZXQgYWwsIGh0dHBzOi8vYXJ4aXYub3JnL2Ficy8xNzA0LjA0NTAzKSB3aGVyZSBib3hlcyByZWR1Y2UgdGhlIHNjb3JlXG4gKiBvZiBvdGhlciBvdmVybGFwcGluZyBib3hlcywgdGhlcmVmb3JlIGZhdm9yaW5nIGRpZmZlcmVudCByZWdpb25zIG9mIHRoZSBpbWFnZVxuICogd2l0aCBoaWdoIHNjb3Jlcy4gVG8gZW5hYmxlIHRoaXMgU29mdC1OTVMgbW9kZSwgc2V0IHRoZSBgc29mdE5tc1NpZ21hYFxuICogcGFyYW1ldGVyIHRvIGJlIGxhcmdlciB0aGFuIDAuXG4gKlxuICogQHBhcmFtIGJveGVzIGEgMmQgdGVuc29yIG9mIHNoYXBlIGBbbnVtQm94ZXMsIDRdYC4gRWFjaCBlbnRyeSBpc1xuICogICAgIGBbeTEsIHgxLCB5MiwgeDJdYCwgd2hlcmUgYCh5MSwgeDEpYCBhbmQgYCh5MiwgeDIpYCBhcmUgdGhlIGNvcm5lcnMgb2ZcbiAqICAgICB0aGUgYm91bmRpbmcgYm94LlxuICogQHBhcmFtIHNjb3JlcyBhIDFkIHRlbnNvciBwcm92aWRpbmcgdGhlIGJveCBzY29yZXMgb2Ygc2hhcGUgYFtudW1Cb3hlc11gLlxuICogQHBhcmFtIG1heE91dHB1dFNpemUgVGhlIG1heGltdW0gbnVtYmVyIG9mIGJveGVzIHRvIGJlIHNlbGVjdGVkLlxuICogQHBhcmFtIGlvdVRocmVzaG9sZCBBIGZsb2F0IHJlcHJlc2VudGluZyB0aGUgdGhyZXNob2xkIGZvciBkZWNpZGluZyB3aGV0aGVyXG4gKiAgICAgYm94ZXMgb3ZlcmxhcCB0b28gbXVjaCB3aXRoIHJlc3BlY3QgdG8gSU9VLiBNdXN0IGJlIGJldHdlZW4gWzAsIDFdLlxuICogICAgIERlZmF1bHRzIHRvIDAuNSAoNTAlIGJveCBvdmVybGFwKS5cbiAqIEBwYXJhbSBzY29yZVRocmVzaG9sZCBBIHRocmVzaG9sZCBmb3IgZGVjaWRpbmcgd2hlbiB0byByZW1vdmUgYm94ZXMgYmFzZWRcbiAqICAgICBvbiBzY29yZS4gRGVmYXVsdHMgdG8gLWluZiwgd2hpY2ggbWVhbnMgYW55IHNjb3JlIGlzIGFjY2VwdGVkLlxuICogQHBhcmFtIHNvZnRObXNTaWdtYSBBIGZsb2F0IHJlcHJlc2VudGluZyB0aGUgc2lnbWEgcGFyYW1ldGVyIGZvciBTb2Z0IE5NUy5cbiAqICAgICBXaGVuIHNpZ21hIGlzIDAsIGl0IGZhbGxzIGJhY2sgdG8gbm9uTWF4U3VwcHJlc3Npb24uXG4gKiBAcmV0dXJuIEEgbWFwIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICogICAgIC0gc2VsZWN0ZWRJbmRpY2VzOiBBIDFEIHRlbnNvciB3aXRoIHRoZSBzZWxlY3RlZCBib3ggaW5kaWNlcy5cbiAqICAgICAtIHNlbGVjdGVkU2NvcmVzOiBBIDFEIHRlbnNvciB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHNjb3JlcyBmb3IgZWFjaFxuICogICAgICAgc2VsZWN0ZWQgYm94LlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0ltYWdlcycsIG5hbWVzcGFjZTogJ2ltYWdlJ31cbiAqL1xuZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25XaXRoU2NvcmVfKGJveGVzLCBzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCA9IDAuNSwgc2NvcmVUaHJlc2hvbGQgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksIHNvZnRObXNTaWdtYSA9IDAuMCkge1xuICAgIGNvbnN0ICRib3hlcyA9IGNvbnZlcnRUb1RlbnNvcihib3hlcywgJ2JveGVzJywgJ25vbk1heFN1cHByZXNzaW9uJyk7XG4gICAgY29uc3QgJHNjb3JlcyA9IGNvbnZlcnRUb1RlbnNvcihzY29yZXMsICdzY29yZXMnLCAnbm9uTWF4U3VwcHJlc3Npb24nKTtcbiAgICBjb25zdCBwYXJhbXMgPSBub25NYXhTdXBwU2FuaXR5Q2hlY2soJGJveGVzLCAkc2NvcmVzLCBtYXhPdXRwdXRTaXplLCBpb3VUaHJlc2hvbGQsIHNjb3JlVGhyZXNob2xkLCBzb2Z0Tm1zU2lnbWEpO1xuICAgIG1heE91dHB1dFNpemUgPSBwYXJhbXMubWF4T3V0cHV0U2l6ZTtcbiAgICBpb3VUaHJlc2hvbGQgPSBwYXJhbXMuaW91VGhyZXNob2xkO1xuICAgIHNjb3JlVGhyZXNob2xkID0gcGFyYW1zLnNjb3JlVGhyZXNob2xkO1xuICAgIHNvZnRObXNTaWdtYSA9IHBhcmFtcy5zb2Z0Tm1zU2lnbWE7XG4gICAgY29uc3QgaW5wdXRzID0geyBib3hlczogJGJveGVzLCBzY29yZXM6ICRzY29yZXMgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCwgc29mdE5tc1NpZ21hIH07XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgIGNvbnN0IHJlc3VsdCA9IEVOR0lORS5ydW5LZXJuZWwoTm9uTWF4U3VwcHJlc3Npb25WNSwgaW5wdXRzLCBhdHRycyk7XG4gICAgcmV0dXJuIHsgc2VsZWN0ZWRJbmRpY2VzOiByZXN1bHRbMF0sIHNlbGVjdGVkU2NvcmVzOiByZXN1bHRbMV0gfTtcbn1cbmV4cG9ydCBjb25zdCBub25NYXhTdXBwcmVzc2lvbldpdGhTY29yZSA9IG9wKHsgbm9uTWF4U3VwcHJlc3Npb25XaXRoU2NvcmVfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bm9uX21heF9zdXBwcmVzc2lvbl93aXRoX3Njb3JlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IG5vbk1heFN1cHByZXNzaW9uVjVJbXBsIH0gZnJvbSAnLi4vLi4vYmFja2VuZHMvbm9uX21heF9zdXBwcmVzc2lvbl9pbXBsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBub25NYXhTdXBwU2FuaXR5Q2hlY2sgfSBmcm9tICcuLi9ub25tYXhfdXRpbCc7XG5pbXBvcnQgeyB0ZW5zb3IxZCB9IGZyb20gJy4uL3RlbnNvcjFkJztcbi8qKlxuICogQXN5bmNocm9ub3VzbHkgcGVyZm9ybXMgbm9uIG1heGltdW0gc3VwcHJlc3Npb24gb2YgYm91bmRpbmcgYm94ZXMgYmFzZWQgb25cbiAqIGlvdSAoaW50ZXJzZWN0aW9uIG92ZXIgdW5pb24pLlxuICpcbiAqIFRoaXMgb3AgYWxzbyBzdXBwb3J0cyBhIFNvZnQtTk1TIG1vZGUgKGMuZi5cbiAqIEJvZGxhIGV0IGFsLCBodHRwczovL2FyeGl2Lm9yZy9hYnMvMTcwNC4wNDUwMykgd2hlcmUgYm94ZXMgcmVkdWNlIHRoZSBzY29yZVxuICogb2Ygb3RoZXIgb3ZlcmxhcHBpbmcgYm94ZXMsIHRoZXJlZm9yZSBmYXZvcmluZyBkaWZmZXJlbnQgcmVnaW9ucyBvZiB0aGUgaW1hZ2VcbiAqIHdpdGggaGlnaCBzY29yZXMuIFRvIGVuYWJsZSB0aGlzIFNvZnQtTk1TIG1vZGUsIHNldCB0aGUgYHNvZnRObXNTaWdtYWBcbiAqIHBhcmFtZXRlciB0byBiZSBsYXJnZXIgdGhhbiAwLlxuICpcbiAqIEBwYXJhbSBib3hlcyBhIDJkIHRlbnNvciBvZiBzaGFwZSBgW251bUJveGVzLCA0XWAuIEVhY2ggZW50cnkgaXNcbiAqICAgICBgW3kxLCB4MSwgeTIsIHgyXWAsIHdoZXJlIGAoeTEsIHgxKWAgYW5kIGAoeTIsIHgyKWAgYXJlIHRoZSBjb3JuZXJzIG9mXG4gKiAgICAgdGhlIGJvdW5kaW5nIGJveC5cbiAqIEBwYXJhbSBzY29yZXMgYSAxZCB0ZW5zb3IgcHJvdmlkaW5nIHRoZSBib3ggc2NvcmVzIG9mIHNoYXBlIGBbbnVtQm94ZXNdYC5cbiAqIEBwYXJhbSBtYXhPdXRwdXRTaXplIFRoZSBtYXhpbXVtIG51bWJlciBvZiBib3hlcyB0byBiZSBzZWxlY3RlZC5cbiAqIEBwYXJhbSBpb3VUaHJlc2hvbGQgQSBmbG9hdCByZXByZXNlbnRpbmcgdGhlIHRocmVzaG9sZCBmb3IgZGVjaWRpbmcgd2hldGhlclxuICogICAgIGJveGVzIG92ZXJsYXAgdG9vIG11Y2ggd2l0aCByZXNwZWN0IHRvIElPVS4gTXVzdCBiZSBiZXR3ZWVuIFswLCAxXS5cbiAqICAgICBEZWZhdWx0cyB0byAwLjUgKDUwJSBib3ggb3ZlcmxhcCkuXG4gKiBAcGFyYW0gc2NvcmVUaHJlc2hvbGQgQSB0aHJlc2hvbGQgZm9yIGRlY2lkaW5nIHdoZW4gdG8gcmVtb3ZlIGJveGVzIGJhc2VkXG4gKiAgICAgb24gc2NvcmUuIERlZmF1bHRzIHRvIC1pbmYsIHdoaWNoIG1lYW5zIGFueSBzY29yZSBpcyBhY2NlcHRlZC5cbiAqIEBwYXJhbSBzb2Z0Tm1zU2lnbWEgQSBmbG9hdCByZXByZXNlbnRpbmcgdGhlIHNpZ21hIHBhcmFtZXRlciBmb3IgU29mdCBOTVMuXG4gKiAgICAgV2hlbiBzaWdtYSBpcyAwLCBpdCBmYWxscyBiYWNrIHRvIG5vbk1heFN1cHByZXNzaW9uLlxuICogQHJldHVybiBBIG1hcCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqICAgICAtIHNlbGVjdGVkSW5kaWNlczogQSAxRCB0ZW5zb3Igd2l0aCB0aGUgc2VsZWN0ZWQgYm94IGluZGljZXMuXG4gKiAgICAgLSBzZWxlY3RlZFNjb3JlczogQSAxRCB0ZW5zb3Igd2l0aCB0aGUgY29ycmVzcG9uZGluZyBzY29yZXMgZm9yIGVhY2hcbiAqICAgICAgIHNlbGVjdGVkIGJveC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdJbWFnZXMnLCBuYW1lc3BhY2U6ICdpbWFnZSd9XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG5vbk1heFN1cHByZXNzaW9uV2l0aFNjb3JlQXN5bmNfKGJveGVzLCBzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCA9IDAuNSwgc2NvcmVUaHJlc2hvbGQgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksIHNvZnRObXNTaWdtYSA9IDAuMCkge1xuICAgIGNvbnN0ICRib3hlcyA9IGNvbnZlcnRUb1RlbnNvcihib3hlcywgJ2JveGVzJywgJ25vbk1heFN1cHByZXNzaW9uQXN5bmMnKTtcbiAgICBjb25zdCAkc2NvcmVzID0gY29udmVydFRvVGVuc29yKHNjb3JlcywgJ3Njb3JlcycsICdub25NYXhTdXBwcmVzc2lvbkFzeW5jJyk7XG4gICAgY29uc3QgcGFyYW1zID0gbm9uTWF4U3VwcFNhbml0eUNoZWNrKCRib3hlcywgJHNjb3JlcywgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCwgc29mdE5tc1NpZ21hKTtcbiAgICBtYXhPdXRwdXRTaXplID0gcGFyYW1zLm1heE91dHB1dFNpemU7XG4gICAgaW91VGhyZXNob2xkID0gcGFyYW1zLmlvdVRocmVzaG9sZDtcbiAgICBzY29yZVRocmVzaG9sZCA9IHBhcmFtcy5zY29yZVRocmVzaG9sZDtcbiAgICBzb2Z0Tm1zU2lnbWEgPSBwYXJhbXMuc29mdE5tc1NpZ21hO1xuICAgIGNvbnN0IGJveGVzQW5kU2NvcmVzID0gYXdhaXQgUHJvbWlzZS5hbGwoWyRib3hlcy5kYXRhKCksICRzY29yZXMuZGF0YSgpXSk7XG4gICAgY29uc3QgYm94ZXNWYWxzID0gYm94ZXNBbmRTY29yZXNbMF07XG4gICAgY29uc3Qgc2NvcmVzVmFscyA9IGJveGVzQW5kU2NvcmVzWzFdO1xuICAgIC8vIFdlIGNhbGwgYSBjcHUgYmFzZWQgaW1wbCBkaXJlY3RseSB3aXRoIHRoZSB0eXBlZGFycmF5IGRhdGEgIGhlcmUgcmF0aGVyXG4gICAgLy8gdGhhbiBhIGtlcm5lbCBiZWNhdXNlIGFsbCBrZXJuZWxzIGFyZSBzeW5jaHJvbm91cyAoYW5kIHRodXMgY2Fubm90IGF3YWl0XG4gICAgLy8gLmRhdGEoKSkuXG4gICAgY29uc3QgeyBzZWxlY3RlZEluZGljZXMsIHNlbGVjdGVkU2NvcmVzIH0gPSBub25NYXhTdXBwcmVzc2lvblY1SW1wbChib3hlc1ZhbHMsIHNjb3Jlc1ZhbHMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsIHNvZnRObXNTaWdtYSk7XG4gICAgaWYgKCRib3hlcyAhPT0gYm94ZXMpIHtcbiAgICAgICAgJGJveGVzLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgaWYgKCRzY29yZXMgIT09IHNjb3Jlcykge1xuICAgICAgICAkc2NvcmVzLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2VsZWN0ZWRJbmRpY2VzOiB0ZW5zb3IxZChzZWxlY3RlZEluZGljZXMsICdpbnQzMicpLFxuICAgICAgICBzZWxlY3RlZFNjb3JlczogdGVuc29yMWQoc2VsZWN0ZWRTY29yZXMpXG4gICAgfTtcbn1cbmV4cG9ydCBjb25zdCBub25NYXhTdXBwcmVzc2lvbldpdGhTY29yZUFzeW5jID0gbm9uTWF4U3VwcHJlc3Npb25XaXRoU2NvcmVBc3luY187XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ub25fbWF4X3N1cHByZXNzaW9uX3dpdGhfc2NvcmVfYXN5bmMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IFJlc2l6ZUJpbGluZWFyIH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4uL3Jlc2hhcGUnO1xuLyoqXG4gKiBCaWxpbmVhciByZXNpemUgYSBzaW5nbGUgM0QgaW1hZ2Ugb3IgYSBiYXRjaCBvZiAzRCBpbWFnZXMgdG8gYSBuZXcgc2hhcGUuXG4gKlxuICogQHBhcmFtIGltYWdlcyBUaGUgaW1hZ2VzLCBvZiByYW5rIDQgb3IgcmFuayAzLCBvZiBzaGFwZVxuICogICAgIGBbYmF0Y2gsIGhlaWdodCwgd2lkdGgsIGluQ2hhbm5lbHNdYC4gSWYgcmFuayAzLCBiYXRjaCBvZiAxIGlzIGFzc3VtZWQuXG4gKiBAcGFyYW0gc2l6ZSBUaGUgbmV3IHNoYXBlIGBbbmV3SGVpZ2h0LCBuZXdXaWR0aF1gIHRvIHJlc2l6ZSB0aGVcbiAqICAgICBpbWFnZXMgdG8uIEVhY2ggY2hhbm5lbCBpcyByZXNpemVkIGluZGl2aWR1YWxseS5cbiAqIEBwYXJhbSBhbGlnbkNvcm5lcnMgRGVmYXVsdHMgdG8gYGZhbHNlYC4gSWYgdHJ1ZSwgcmVzY2FsZVxuICogICAgIGlucHV0IGJ5IGAobmV3X2hlaWdodCAtIDEpIC8gKGhlaWdodCAtIDEpYCwgd2hpY2ggZXhhY3RseSBhbGlnbnMgdGhlIDRcbiAqICAgICBjb3JuZXJzIG9mIGltYWdlcyBhbmQgcmVzaXplZCBpbWFnZXMuIElmIGZhbHNlLCByZXNjYWxlIGJ5XG4gKiAgICAgYG5ld19oZWlnaHQgLyBoZWlnaHRgLiBUcmVhdCBzaW1pbGFybHkgdGhlIHdpZHRoIGRpbWVuc2lvbi5cbiAqIEBwYXJhbSBoYWxmUGl4ZWxDZW50ZXJzIERlZmF1bHRzIHRvIGBmYWxzZWAuIFdoZXRoZXIgdG8gYXNzdW1lIHBpeGVsIGNlbnRlcnNcbiAqICAgICBhcmUgYXQgMC41LCB3aGljaCB3b3VsZCBtYWtlIHRoZSBmbG9hdGluZyBwb2ludCBjb29yZGluYXRlcyBvZiB0aGUgdG9wXG4gKiAgICAgbGVmdCBwaXhlbCAwLjUsIDAuNS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdJbWFnZXMnLCBuYW1lc3BhY2U6ICdpbWFnZSd9XG4gKi9cbmZ1bmN0aW9uIHJlc2l6ZUJpbGluZWFyXyhpbWFnZXMsIHNpemUsIGFsaWduQ29ybmVycyA9IGZhbHNlLCBoYWxmUGl4ZWxDZW50ZXJzID0gZmFsc2UpIHtcbiAgICBjb25zdCAkaW1hZ2VzID0gY29udmVydFRvVGVuc29yKGltYWdlcywgJ2ltYWdlcycsICdyZXNpemVCaWxpbmVhcicpO1xuICAgIHV0aWwuYXNzZXJ0KCRpbWFnZXMucmFuayA9PT0gMyB8fCAkaW1hZ2VzLnJhbmsgPT09IDQsICgpID0+IGBFcnJvciBpbiByZXNpemVCaWxpbmVhcjogeCBtdXN0IGJlIHJhbmsgMyBvciA0LCBidXQgZ290IGAgK1xuICAgICAgICBgcmFuayAkeyRpbWFnZXMucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoc2l6ZS5sZW5ndGggPT09IDIsICgpID0+IGBFcnJvciBpbiByZXNpemVCaWxpbmVhcjogbmV3IHNoYXBlIG11c3QgMkQsIGJ1dCBnb3Qgc2hhcGUgYCArXG4gICAgICAgIGAke3NpemV9LmApO1xuICAgIHV0aWwuYXNzZXJ0KGhhbGZQaXhlbENlbnRlcnMgPT09IGZhbHNlIHx8IGFsaWduQ29ybmVycyA9PT0gZmFsc2UsICgpID0+IGBFcnJvciBpbiByZXNpemVCaWxpbmVhcjogSWYgaGFsZlBpeGVsQ2VudGVycyBpcyB0cnVlLCBgICtcbiAgICAgICAgYGFsaWduQ29ybmVycyBtdXN0IGJlIGZhbHNlLmApO1xuICAgIGxldCBiYXRjaEltYWdlcyA9ICRpbWFnZXM7XG4gICAgbGV0IHJlc2hhcGVkVG80RCA9IGZhbHNlO1xuICAgIGlmICgkaW1hZ2VzLnJhbmsgPT09IDMpIHtcbiAgICAgICAgcmVzaGFwZWRUbzREID0gdHJ1ZTtcbiAgICAgICAgYmF0Y2hJbWFnZXMgPSByZXNoYXBlKCRpbWFnZXMsIFsxLCAkaW1hZ2VzLnNoYXBlWzBdLCAkaW1hZ2VzLnNoYXBlWzFdLCAkaW1hZ2VzLnNoYXBlWzJdXSk7XG4gICAgfVxuICAgIGNvbnN0IFtdID0gc2l6ZTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGltYWdlczogYmF0Y2hJbWFnZXMgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgYWxpZ25Db3JuZXJzLCBoYWxmUGl4ZWxDZW50ZXJzLCBzaXplIH07XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgIGNvbnN0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoUmVzaXplQmlsaW5lYXIsIGlucHV0cywgYXR0cnMpO1xuICAgIGlmIChyZXNoYXBlZFRvNEQpIHtcbiAgICAgICAgcmV0dXJuIHJlc2hhcGUocmVzLCBbcmVzLnNoYXBlWzFdLCByZXMuc2hhcGVbMl0sIHJlcy5zaGFwZVszXV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IHJlc2l6ZUJpbGluZWFyID0gb3AoeyByZXNpemVCaWxpbmVhcl8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZXNpemVfYmlsaW5lYXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IFJlc2l6ZU5lYXJlc3ROZWlnaGJvciB9IGZyb20gJy4uLy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuLi9yZXNoYXBlJztcbi8qKlxuICogTmVhcmVzdE5laWdoYm9yIHJlc2l6ZSBhIGJhdGNoIG9mIDNEIGltYWdlcyB0byBhIG5ldyBzaGFwZS5cbiAqXG4gKiBAcGFyYW0gaW1hZ2VzIFRoZSBpbWFnZXMsIG9mIHJhbmsgNCBvciByYW5rIDMsIG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgaW5DaGFubmVsc11gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBzaXplIFRoZSBuZXcgc2hhcGUgYFtuZXdIZWlnaHQsIG5ld1dpZHRoXWAgdG8gcmVzaXplIHRoZVxuICogICAgIGltYWdlcyB0by4gRWFjaCBjaGFubmVsIGlzIHJlc2l6ZWQgaW5kaXZpZHVhbGx5LlxuICogQHBhcmFtIGFsaWduQ29ybmVycyBEZWZhdWx0cyB0byBGYWxzZS4gSWYgdHJ1ZSwgcmVzY2FsZVxuICogICAgIGlucHV0IGJ5IGAobmV3X2hlaWdodCAtIDEpIC8gKGhlaWdodCAtIDEpYCwgd2hpY2ggZXhhY3RseSBhbGlnbnMgdGhlIDRcbiAqICAgICBjb3JuZXJzIG9mIGltYWdlcyBhbmQgcmVzaXplZCBpbWFnZXMuIElmIGZhbHNlLCByZXNjYWxlIGJ5XG4gKiAgICAgYG5ld19oZWlnaHQgLyBoZWlnaHRgLiBUcmVhdCBzaW1pbGFybHkgdGhlIHdpZHRoIGRpbWVuc2lvbi5cbiAqIEBwYXJhbSBoYWxmUGl4ZWxDZW50ZXJzIERlZmF1bHRzIHRvIGBmYWxzZWAuIFdoZXRoZXIgdG8gYXNzdW1lcyBwaXhlbHMgYXJlIG9mXG4gKiAgICAgIGhhbGYgdGhlIGFjdHVhbCBkaW1lbnNpb25zLCBhbmQgeWllbGRzIG1vcmUgYWNjdXJhdGUgcmVzaXplcy4gVGhpcyBmbGFnXG4gKiAgICAgIHdvdWxkIGFsc28gbWFrZSB0aGUgZmxvYXRpbmcgcG9pbnQgY29vcmRpbmF0ZXMgb2YgdGhlIHRvcCBsZWZ0IHBpeGVsXG4gKiAgICAgIDAuNSwgMC41LlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0ltYWdlcycsIG5hbWVzcGFjZTogJ2ltYWdlJ31cbiAqL1xuZnVuY3Rpb24gcmVzaXplTmVhcmVzdE5laWdoYm9yXyhpbWFnZXMsIHNpemUsIGFsaWduQ29ybmVycyA9IGZhbHNlLCBoYWxmUGl4ZWxDZW50ZXJzID0gZmFsc2UpIHtcbiAgICBjb25zdCAkaW1hZ2VzID0gY29udmVydFRvVGVuc29yKGltYWdlcywgJ2ltYWdlcycsICdyZXNpemVOZWFyZXN0TmVpZ2hib3InKTtcbiAgICB1dGlsLmFzc2VydCgkaW1hZ2VzLnJhbmsgPT09IDMgfHwgJGltYWdlcy5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gcmVzaXplTmVhcmVzdE5laWdoYm9yOiB4IG11c3QgYmUgcmFuayAzIG9yIDQsIGJ1dCBnb3QgYCArXG4gICAgICAgIGByYW5rICR7JGltYWdlcy5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydChzaXplLmxlbmd0aCA9PT0gMiwgKCkgPT4gYEVycm9yIGluIHJlc2l6ZU5lYXJlc3ROZWlnaGJvcjogbmV3IHNoYXBlIG11c3QgMkQsIGJ1dCBnb3Qgc2hhcGUgYCArXG4gICAgICAgIGAke3NpemV9LmApO1xuICAgIHV0aWwuYXNzZXJ0KCRpbWFnZXMuZHR5cGUgPT09ICdmbG9hdDMyJyB8fCAkaW1hZ2VzLmR0eXBlID09PSAnaW50MzInLCAoKSA9PiAnYGltYWdlc2AgbXVzdCBoYXZlIGBpbnQzMmAgb3IgYGZsb2F0MzJgIGFzIGR0eXBlJyk7XG4gICAgdXRpbC5hc3NlcnQoaGFsZlBpeGVsQ2VudGVycyA9PT0gZmFsc2UgfHwgYWxpZ25Db3JuZXJzID09PSBmYWxzZSwgKCkgPT4gYEVycm9yIGluIHJlc2l6ZU5lYXJlc3ROZWlnaGJvcjogSWYgaGFsZlBpeGVsQ2VudGVycyBpcyB0cnVlLCBgICtcbiAgICAgICAgYGFsaWduQ29ybmVycyBtdXN0IGJlIGZhbHNlLmApO1xuICAgIGxldCBiYXRjaEltYWdlcyA9ICRpbWFnZXM7XG4gICAgbGV0IHJlc2hhcGVkVG80RCA9IGZhbHNlO1xuICAgIGlmICgkaW1hZ2VzLnJhbmsgPT09IDMpIHtcbiAgICAgICAgcmVzaGFwZWRUbzREID0gdHJ1ZTtcbiAgICAgICAgYmF0Y2hJbWFnZXMgPSByZXNoYXBlKCRpbWFnZXMsIFsxLCAkaW1hZ2VzLnNoYXBlWzBdLCAkaW1hZ2VzLnNoYXBlWzFdLCAkaW1hZ2VzLnNoYXBlWzJdXSk7XG4gICAgfVxuICAgIGNvbnN0IFtdID0gc2l6ZTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGltYWdlczogYmF0Y2hJbWFnZXMgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgYWxpZ25Db3JuZXJzLCBoYWxmUGl4ZWxDZW50ZXJzLCBzaXplIH07XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgIGNvbnN0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoUmVzaXplTmVhcmVzdE5laWdoYm9yLCBpbnB1dHMsIGF0dHJzKTtcbiAgICBpZiAocmVzaGFwZWRUbzREKSB7XG4gICAgICAgIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydCBjb25zdCByZXNpemVOZWFyZXN0TmVpZ2hib3IgPSBvcCh7IHJlc2l6ZU5lYXJlc3ROZWlnaGJvcl8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZXNpemVfbmVhcmVzdF9uZWlnaGJvci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgUm90YXRlV2l0aE9mZnNldCB9IGZyb20gJy4uLy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbi8qKlxuICogUm90YXRlcyB0aGUgaW5wdXQgaW1hZ2UgdGVuc29yIGNvdW50ZXItY2xvY2t3aXNlIHdpdGggYW4gb3B0aW9uYWwgb2Zmc2V0XG4gKiBjZW50ZXIgb2Ygcm90YXRpb24uIEN1cnJlbnRseSBhdmFpbGFibGUgaW4gdGhlIENQVSwgV2ViR0wsIGFuZCBXQVNNIGJhY2tlbmRzLlxuICpcbiAqIEBwYXJhbSBpbWFnZSA0ZCB0ZW5zb3Igb2Ygc2hhcGUgYFtiYXRjaCwgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIGRlcHRoXWAuXG4gKiBAcGFyYW0gcmFkaWFucyBUaGUgYW1vdW50IG9mIHJvdGF0aW9uLlxuICogQHBhcmFtIGZpbGxWYWx1ZSBUaGUgdmFsdWUgdG8gZmlsbCBpbiB0aGUgZW1wdHkgc3BhY2UgbGVmdG92ZXJcbiAqICAgICBhZnRlciByb3RhdGlvbi4gQ2FuIGJlIGVpdGhlciBhIHNpbmdsZSBncmF5c2NhbGUgdmFsdWUgKDAtMjU1KSwgb3IgYW5cbiAqICAgICBhcnJheSBvZiB0aHJlZSBudW1iZXJzIGBbcmVkLCBncmVlbiwgYmx1ZV1gIHNwZWNpZnlpbmcgdGhlIHJlZCwgZ3JlZW4sXG4gKiAgICAgYW5kIGJsdWUgY2hhbm5lbHMuIERlZmF1bHRzIHRvIGAwYCAoYmxhY2spLlxuICogQHBhcmFtIGNlbnRlciBUaGUgY2VudGVyIG9mIHJvdGF0aW9uLiBDYW4gYmUgZWl0aGVyIGEgc2luZ2xlIHZhbHVlICgwLTEpLCBvclxuICogICAgIGFuIGFycmF5IG9mIHR3byBudW1iZXJzIGBbY2VudGVyWCwgY2VudGVyWV1gLiBEZWZhdWx0cyB0byBgMC41YCAocm90YXRlc1xuICogICAgIHRoZSBpbWFnZSBhcm91bmQgaXRzIGNlbnRlcikuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnSW1hZ2VzJywgbmFtZXNwYWNlOiAnaW1hZ2UnfVxuICovXG5mdW5jdGlvbiByb3RhdGVXaXRoT2Zmc2V0XyhpbWFnZSwgcmFkaWFucywgZmlsbFZhbHVlID0gMCwgY2VudGVyID0gMC41KSB7XG4gICAgY29uc3QgJGltYWdlID0gY29udmVydFRvVGVuc29yKGltYWdlLCAnaW1hZ2UnLCAncm90YXRlV2l0aE9mZnNldCcsICdmbG9hdDMyJyk7XG4gICAgdXRpbC5hc3NlcnQoJGltYWdlLnJhbmsgPT09IDQsICgpID0+ICdFcnJvciBpbiByb3RhdGVXaXRoT2Zmc2V0OiBpbWFnZSBtdXN0IGJlIHJhbmsgNCwnICtcbiAgICAgICAgYGJ1dCBnb3QgcmFuayAkeyRpbWFnZS5yYW5rfS5gKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGltYWdlOiAkaW1hZ2UgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgcmFkaWFucywgZmlsbFZhbHVlLCBjZW50ZXIgfTtcbiAgICBjb25zdCByZXMgPSBFTkdJTkUucnVuS2VybmVsKFJvdGF0ZVdpdGhPZmZzZXQsIGlucHV0cywgYXR0cnMpO1xuICAgIHJldHVybiByZXM7XG59XG5leHBvcnQgY29uc3Qgcm90YXRlV2l0aE9mZnNldCA9IG9wKHsgcm90YXRlV2l0aE9mZnNldF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yb3RhdGVfd2l0aF9vZmZzZXQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IHRlbnNvcjFkIH0gZnJvbSAnLi4vdGVuc29yMWQnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgY2FzdCB9IGZyb20gJy4uL2Nhc3QnO1xuaW1wb3J0IHsgc3BsaXQgfSBmcm9tICcuLi9zcGxpdCc7XG5pbXBvcnQgeyBiaW5jb3VudCB9IGZyb20gJy4uL2JpbmNvdW50JztcbmltcG9ydCB7IGxlc3NFcXVhbCB9IGZyb20gJy4uL2xlc3NfZXF1YWwnO1xuaW1wb3J0IHsgZ3JlYXRlciB9IGZyb20gJy4uL2dyZWF0ZXInO1xuaW1wb3J0IHsgc3VtIH0gZnJvbSAnLi4vc3VtJztcbmltcG9ydCB7IGFkZCB9IGZyb20gJy4uL2FkZCc7XG5pbXBvcnQgeyBtdWwgfSBmcm9tICcuLi9tdWwnO1xuaW1wb3J0IHsgZGl2IH0gZnJvbSAnLi4vZGl2JztcbmltcG9ydCB7IHN1YiB9IGZyb20gJy4uL3N1Yic7XG5pbXBvcnQgeyByb3VuZCB9IGZyb20gJy4uL3JvdW5kJztcbmltcG9ydCB7IHdoZXJlIH0gZnJvbSAnLi4vd2hlcmUnO1xuaW1wb3J0IHsgZmlsbCB9IGZyb20gJy4uL2ZpbGwnO1xuaW1wb3J0IHsgc2xpY2UgfSBmcm9tICcuLi9zbGljZSc7XG5pbXBvcnQgeyByYW5nZSB9IGZyb20gJy4uL3JhbmdlJztcbmltcG9ydCB7IHRlbnNvciB9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52Jztcbi8qKlxuICogUGVyZm9ybXMgaW1hZ2UgYmluYXJpemF0aW9uIHdpdGggY29ycmVzcG9uZGluZyB0aHJlc2hvbGRcbiAqIChkZXBlbmRzIG9uIHRoZSBtZXRob2QpdmFsdWUsIHdoaWNoIGNyZWF0ZXMgYSBiaW5hcnkgaW1hZ2UgZnJvbSBhIGdyYXlzY2FsZS5cbiAqIEBwYXJhbSBpbWFnZSAzZCB0ZW5zb3Igb2Ygc2hhcGUgW2ltYWdlSGVpZ2h0LGltYWdlV2lkdGgsIGRlcHRoXSxcbiAqIHdoZXJlIGltYWdlSGVpZ2h0IGFuZCBpbWFnZVdpZHRoIG11c3QgYmUgcG9zaXRpdmUuVGhlIGltYWdlIGNvbG9yXG4gKiByYW5nZSBzaG91bGQgYmUgWzAsIDI1NV0uXG4gKiBAcGFyYW0gbWV0aG9kIE9wdGlvbmFsIHN0cmluZyBmcm9tIGAnYmluYXJ5JyB8ICdvdHN1J2BcbiAqIHdoaWNoIHNwZWNpZmllcyB0aGUgbWV0aG9kIGZvciB0aHJlc2hvbGRpbmcuIERlZmF1bHRzIHRvICdiaW5hcnknLlxuICogQHBhcmFtIGludmVydGVkIE9wdGlvbmFsIGJvb2xlYW4gd2hpY2hzcGVjaWZpZXNcbiAqIGlmIGNvbG91cnMgc2hvdWxkIGJlIGludmVydGVkLiBEZWZhdWx0cyB0byBmYWxzZS5cbiAqIEBwYXJhbSB0aHJlc2hWYWx1ZSBPcHRpb25hbCBudW1iZXIgd2hpY2ggZGVmaW5lcyB0aHJlc2hvbGQgdmFsdWUgZnJvbSAwIHRvIDEuXG4gKiBEZWZhdWx0cyB0byAwLjUuXG4gKiBAcmV0dXJuIEEgM2QgdGVuc29yIG9mIHNoYXBlIFtpbWFnZUhlaWdodCxpbWFnZVdpZHRoLCBkZXB0aF0sIHdoaWNoXG4gKiBjb250YWlucyBiaW5hcml6ZWQgaW1hZ2UuXG4gKi9cbmZ1bmN0aW9uIHRocmVzaG9sZF8oaW1hZ2UsIG1ldGhvZCA9ICdiaW5hcnknLCBpbnZlcnRlZCA9IGZhbHNlLCB0aHJlc2hWYWx1ZSA9IDAuNSkge1xuICAgIGNvbnN0ICRpbWFnZSA9IGNvbnZlcnRUb1RlbnNvcihpbWFnZSwgJ2ltYWdlJywgJ3RocmVzaG9sZCcpO1xuICAgIC8qIDAuMjk4OSwgMC41ODcwLCAwLjExNDAgYXJlIHJlcHJlc2VudCBsdW1hIGNvZWZmaWNpZW50cyBpbiBDQ0lSNjAxLlxuICAgIFJlZmVyZW5jZSBmb3IgY29udmVydGluZyBiZXR3ZWVuIFJHQiBhbmQgZ3JheXNjYWxlOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MdW1hXyUyOHZpZGVvJTI5ICAqL1xuICAgIGNvbnN0IFJFRF9JTlRFTkNJVFlfQ09FRiA9IDAuMjk4OTtcbiAgICBjb25zdCBHUkVFTl9JTlRFTkNJVFlfQ09FRiA9IDAuNTg3MDtcbiAgICBjb25zdCBCTFVFX0lOVEVOQ0lUWV9DT0VGID0gMC4xMTQwO1xuICAgIGNvbnN0IHRvdGFsUGl4ZWxzSW5JbWFnZSA9ICRpbWFnZS5zaGFwZVswXSAqICRpbWFnZS5zaGFwZVsxXTtcbiAgICBsZXQgJHRocmVzaG9sZCA9IG11bCh0ZW5zb3IxZChbdGhyZXNoVmFsdWVdKSwgMjU1KTtcbiAgICBsZXQgciwgZywgYiwgZ3JheXNjYWxlO1xuICAgIHV0aWwuYXNzZXJ0KCRpbWFnZS5yYW5rID09PSAzLCAoKSA9PiAnRXJyb3IgaW4gdGhyZXNob2xkOiBpbWFnZSBtdXN0IGJlIHJhbmsgMywnICtcbiAgICAgICAgYGJ1dCBnb3QgcmFuayAkeyRpbWFnZS5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydCgkaW1hZ2Uuc2hhcGVbMl0gPT09IDMgfHwgJGltYWdlLnNoYXBlWzJdID09PSAxLCAoKSA9PiAnRXJyb3IgaW4gdGhyZXNob2xkOiAnICtcbiAgICAgICAgJ2ltYWdlIGNvbG9yIGNoYW5uZWwgbXVzdCBiZSBlcXVhbCB0byAzIG9yIDEnICtcbiAgICAgICAgYGJ1dCBnb3QgJHskaW1hZ2Uuc2hhcGVbMl19LmApO1xuICAgIHV0aWwuYXNzZXJ0KCRpbWFnZS5kdHlwZSA9PT0gJ2ludDMyJyB8fCAkaW1hZ2UuZHR5cGUgPT09ICdmbG9hdDMyJywgKCkgPT4gJ0Vycm9yIGluIGR0eXBlOiBpbWFnZSBkdHlwZSBtdXN0IGJlIGludDMyIG9yIGZsb2F0MzIsJyArXG4gICAgICAgIGBidXQgZ290IGR0eXBlICR7JGltYWdlLmR0eXBlfS5gKTtcbiAgICB1dGlsLmFzc2VydChtZXRob2QgPT09ICdvdHN1JyB8fCBtZXRob2QgPT09ICdiaW5hcnknLCAoKSA9PiBgTWV0aG9kIG11c3QgYmUgYmluYXJ5IG9yIG90c3UsIGJ1dCB3YXMgJHttZXRob2R9YCk7XG4gICAgaWYgKCRpbWFnZS5zaGFwZVsyXSA9PT0gMykge1xuICAgICAgICBbciwgZywgYl0gPSBzcGxpdCgkaW1hZ2UsIFsxLCAxLCAxXSwgLTEpO1xuICAgICAgICBjb25zdCAkciA9IG11bChyLCBSRURfSU5URU5DSVRZX0NPRUYpO1xuICAgICAgICBjb25zdCAkZyA9IG11bChnLCBHUkVFTl9JTlRFTkNJVFlfQ09FRik7XG4gICAgICAgIGNvbnN0ICRiID0gbXVsKGIsIEJMVUVfSU5URU5DSVRZX0NPRUYpO1xuICAgICAgICBncmF5c2NhbGUgPSBhZGQoYWRkKCRyLCAkZyksICRiKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGdyYXlzY2FsZSA9IGltYWdlO1xuICAgIH1cbiAgICBpZiAobWV0aG9kID09PSAnb3RzdScpIHtcbiAgICAgICAgY29uc3QgJGhpc3RvZ3JhbSA9IGJpbmNvdW50KGNhc3Qocm91bmQoZ3JheXNjYWxlKSwgJ2ludDMyJyksIHRlbnNvcihbXSksIDI1Nik7XG4gICAgICAgICR0aHJlc2hvbGQgPSBvdHN1KCRoaXN0b2dyYW0sIHRvdGFsUGl4ZWxzSW5JbWFnZSk7XG4gICAgfVxuICAgIGNvbnN0IGludkNvbmRpdGlvbiA9IGludmVydGVkID9cbiAgICAgICAgbGVzc0VxdWFsKGdyYXlzY2FsZSwgJHRocmVzaG9sZCkgOiBncmVhdGVyKGdyYXlzY2FsZSwgJHRocmVzaG9sZCk7XG4gICAgY29uc3QgcmVzdWx0ID0gY2FzdChtdWwoaW52Q29uZGl0aW9uLCAyNTUpLCAnaW50MzInKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gb3RzdShoaXN0b2dyYW0sIHRvdGFsKSB7XG4gICAgbGV0IGJlc3RUaHJlc2ggPSB0ZW5zb3IxZChbLTFdKTtcbiAgICBsZXQgYmVzdEluQmV0VmFyID0gdGVuc29yMWQoWzBdKTtcbiAgICBsZXQgY0luQmV0VmFyID0gdGVuc29yMWQoWzBdKTtcbiAgICBsZXQgY2xhc3NGaXJzdCwgY2xhc3NTZWNvbmQsIG1lYW5GaXJzdCwgbWVhblNlYywgd2VpZ2h0Rm9yZWdyb3VuZCwgd2VpZ2h0QmFjaztcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgaGlzdG9ncmFtLnNpemUgLSAxOyBpbmRleCsrKSB7XG4gICAgICAgIGNsYXNzRmlyc3QgPSBzbGljZShoaXN0b2dyYW0sIDAsIGluZGV4ICsgMSk7XG4gICAgICAgIGNsYXNzU2Vjb25kID0gc2xpY2UoaGlzdG9ncmFtLCBpbmRleCArIDEpO1xuICAgICAgICB3ZWlnaHRGb3JlZ3JvdW5kID0gZGl2KHN1bShjbGFzc0ZpcnN0KSwgdG90YWwpO1xuICAgICAgICB3ZWlnaHRCYWNrID0gZGl2KHN1bShjbGFzc1NlY29uZCksIHRvdGFsKTtcbiAgICAgICAgY29uc3QgbWVhbkZpcnN0RGl2QSA9IHN1bShtdWwoY2xhc3NGaXJzdCwgcmFuZ2UoMCwgY2xhc3NGaXJzdC5zaXplKSkpO1xuICAgICAgICBtZWFuRmlyc3QgPSBkaXYobWVhbkZpcnN0RGl2QSwgc3VtKGNsYXNzRmlyc3QpKTtcbiAgICAgICAgY29uc3QgbWVhblNlY0ZpbGwgPSBmaWxsKGNsYXNzU2Vjb25kLnNoYXBlLCBjbGFzc0ZpcnN0LnNpemUpO1xuICAgICAgICBjb25zdCBtZWFuU2VjQWRkID0gYWRkKHJhbmdlKDAsIGNsYXNzU2Vjb25kLnNpemUpLCBtZWFuU2VjRmlsbCk7XG4gICAgICAgIGNvbnN0IG1lYW5TZWNNdWwgPSBtdWwoY2xhc3NTZWNvbmQsIChtZWFuU2VjQWRkKSk7XG4gICAgICAgIG1lYW5TZWMgPSBkaXYoc3VtKG1lYW5TZWNNdWwpLCBzdW0oY2xhc3NTZWNvbmQpKTtcbiAgICAgICAgY29uc3QgY0luQmV0VmFyU3ViQSA9IHN1YihtZWFuRmlyc3QsIG1lYW5TZWMpO1xuICAgICAgICBjb25zdCBjSW5CZXRWYXJTdWJCID0gc3ViKG1lYW5GaXJzdCwgbWVhblNlYyk7XG4gICAgICAgIGNvbnN0IGNJbkJldFZhck11bCA9IG11bCh3ZWlnaHRGb3JlZ3JvdW5kLCB3ZWlnaHRCYWNrKTtcbiAgICAgICAgY0luQmV0VmFyID0gbXVsKG11bChjSW5CZXRWYXJNdWwsIGNJbkJldFZhclN1YkEpLCBjSW5CZXRWYXJTdWJCKTtcbiAgICAgICAgY29uc3QgY29uZGl0aW9uID0gZ3JlYXRlcihjSW5CZXRWYXIsIGJlc3RJbkJldFZhcik7XG4gICAgICAgIGJlc3RJbkJldFZhciA9IHdoZXJlKGNvbmRpdGlvbiwgY0luQmV0VmFyLCBiZXN0SW5CZXRWYXIpO1xuICAgICAgICBiZXN0VGhyZXNoID0gd2hlcmUoY29uZGl0aW9uLCB0ZW5zb3IxZChbaW5kZXhdKSwgYmVzdFRocmVzaCk7XG4gICAgfVxuICAgIHJldHVybiBiZXN0VGhyZXNoO1xufVxuZXhwb3J0IGNvbnN0IHRocmVzaG9sZCA9IG9wKHsgdGhyZXNob2xkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRocmVzaG9sZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgVHJhbnNmb3JtIH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBBcHBsaWVzIHRoZSBnaXZlbiB0cmFuc2Zvcm0ocykgdG8gdGhlIGltYWdlKHMpLlxuICpcbiAqIEBwYXJhbSBpbWFnZSA0ZCB0ZW5zb3Igb2Ygc2hhcGUgYFtiYXRjaCwgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIGRlcHRoXWAuXG4gKiBAcGFyYW0gdHJhbnNmb3JtcyBQcm9qZWN0aXZlIHRyYW5zZm9ybSBtYXRyaXgvbWF0cmljZXMuIEEgdGVuc29yMWQgb2YgbGVuZ3RoXG4gKiAgICAgOCBvciB0ZW5zb3Igb2Ygc2l6ZSBOIHggOC4gSWYgb25lIHJvdyBvZiB0cmFuc2Zvcm1zIGlzIFthMCwgYTEsIGEyLCBiMFxuICogICAgIGIxLCBiMiwgYzAsIGMxXSwgdGhlbiBpdCBtYXBzIHRoZSBvdXRwdXQgcG9pbnQgKHgsIHkpIHRvIGEgdHJhbnNmb3JtZWRcbiAqICAgICBpbnB1dCBwb2ludCAoeCcsIHknKSA9ICgoYTAgeCArIGExIHkgKyBhMikgLyBrLCAoYjAgeCArIGIxIHkgKyBiMikgLyBrKSxcbiAqICAgICB3aGVyZSBrID0gYzAgeCArIGMxIHkgKyAxLiBUaGUgdHJhbnNmb3JtcyBhcmUgaW52ZXJ0ZWQgY29tcGFyZWQgdG8gdGhlXG4gKiAgICAgdHJhbnNmb3JtIG1hcHBpbmcgaW5wdXQgcG9pbnRzIHRvIG91dHB1dCBwb2ludHMuXG4gKiBAcGFyYW0gaW50ZXJwb2xhdGlvbiBJbnRlcnBvbGF0aW9uIG1vZGUuXG4gKiAgICAgU3VwcG9ydGVkIHZhbHVlczogJ25lYXJlc3QnLCAnYmlsaW5lYXInLiBEZWZhdWx0IHRvICduZWFyZXN0Jy5cbiAqIEBwYXJhbSBmaWxsTW9kZSBQb2ludHMgb3V0c2lkZSB0aGUgYm91bmRhcmllcyBvZiB0aGUgaW5wdXQgYXJlIGZpbGxlZFxuICogICAgIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gbW9kZSwgb25lIG9mICdjb25zdGFudCcsICdyZWZsZWN0JywgJ3dyYXAnLFxuICogICAgICduZWFyZXN0Jy4gRGVmYXVsdCB0byAnY29uc3RhbnQnLlxuICogICAgICdyZWZsZWN0JzogKGQgYyBiIGEgfCBhIGIgYyBkIHwgZCBjIGIgYSApIFRoZSBpbnB1dCBpcyBleHRlbmRlZCBieVxuICogICAgIHJlZmxlY3RpbmcgYWJvdXQgdGhlIGVkZ2Ugb2YgdGhlIGxhc3QgcGl4ZWwuXG4gKiAgICAgJ2NvbnN0YW50JzogKGsgayBrIGsgfCBhIGIgYyBkIHwgayBrIGsgaykgVGhlIGlucHV0IGlzIGV4dGVuZGVkIGJ5XG4gKiAgICAgZmlsbGluZyBhbGwgdmFsdWVzIGJleW9uZCB0aGUgZWRnZSB3aXRoIHRoZSBzYW1lIGNvbnN0YW50IHZhbHVlIGsuXG4gKiAgICAgJ3dyYXAnOiAoYSBiIGMgZCB8IGEgYiBjIGQgfCBhIGIgYyBkKSBUaGUgaW5wdXQgaXMgZXh0ZW5kZWQgYnlcbiAqICAgICB3cmFwcGluZyBhcm91bmQgdG8gdGhlIG9wcG9zaXRlIGVkZ2UuXG4gKiAgICAgJ25lYXJlc3QnOiAoYSBhIGEgYSB8IGEgYiBjIGQgfCBkIGQgZCBkKSBUaGUgaW5wdXQgaXMgZXh0ZW5kZWQgYnlcbiAqICAgICB0aGUgbmVhcmVzdCBwaXhlbC5cbiAqIEBwYXJhbSBmaWxsVmFsdWUgQSBmbG9hdCByZXByZXNlbnRzIHRoZSB2YWx1ZSB0byBiZSBmaWxsZWQgb3V0c2lkZSB0aGVcbiAqICAgICBib3VuZGFyaWVzIHdoZW4gZmlsbE1vZGUgaXMgJ2NvbnN0YW50Jy5cbiAqIEBwYXJhbSBPdXRwdXQgZGltZW5zaW9uIGFmdGVyIHRoZSB0cmFuc2Zvcm0sIFtoZWlnaHQsIHdpZHRoXS4gSWYgdW5kZWZpbmVkLFxuICogICAgIG91dHB1dCBpcyB0aGUgc2FtZSBzaXplIGFzIGlucHV0IGltYWdlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0ltYWdlcycsIG5hbWVzcGFjZTogJ2ltYWdlJ31cbiAqL1xuZnVuY3Rpb24gdHJhbnNmb3JtXyhpbWFnZSwgdHJhbnNmb3JtcywgaW50ZXJwb2xhdGlvbiA9ICduZWFyZXN0JywgZmlsbE1vZGUgPSAnY29uc3RhbnQnLCBmaWxsVmFsdWUgPSAwLCBvdXRwdXRTaGFwZSkge1xuICAgIGNvbnN0ICRpbWFnZSA9IGNvbnZlcnRUb1RlbnNvcihpbWFnZSwgJ2ltYWdlJywgJ3RyYW5zZm9ybScsICdmbG9hdDMyJyk7XG4gICAgY29uc3QgJHRyYW5zZm9ybXMgPSBjb252ZXJ0VG9UZW5zb3IodHJhbnNmb3JtcywgJ3RyYW5zZm9ybXMnLCAndHJhbnNmb3JtJywgJ2Zsb2F0MzInKTtcbiAgICB1dGlsLmFzc2VydCgkaW1hZ2UucmFuayA9PT0gNCwgKCkgPT4gJ0Vycm9yIGluIHRyYW5zZm9ybTogaW1hZ2UgbXVzdCBiZSByYW5rIDQsJyArXG4gICAgICAgIGBidXQgZ290IHJhbmsgJHskaW1hZ2UucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoJHRyYW5zZm9ybXMucmFuayA9PT0gMiAmJlxuICAgICAgICAoJHRyYW5zZm9ybXMuc2hhcGVbMF0gPT09ICRpbWFnZS5zaGFwZVswXSB8fFxuICAgICAgICAgICAgJHRyYW5zZm9ybXMuc2hhcGVbMF0gPT09IDEpICYmXG4gICAgICAgICR0cmFuc2Zvcm1zLnNoYXBlWzFdID09PSA4LCAoKSA9PiBgRXJyb3IgaW4gdHJhbnNmb3JtOiBJbnB1dCB0cmFuc2Zvcm0gc2hvdWxkIGJlIGJhdGNoIHggOCBvciAxIHggOGApO1xuICAgIHV0aWwuYXNzZXJ0KG91dHB1dFNoYXBlID09IG51bGwgfHwgb3V0cHV0U2hhcGUubGVuZ3RoID09PSAyLCAoKSA9PiAnRXJyb3IgaW4gdHJhbnNmb3JtOiBvdXRwdXRTaGFwZSBtdXN0IGJlIFtoZWlnaHQsIHdpZHRoXSBvciBudWxsLCAnICtcbiAgICAgICAgYGJ1dCBnb3QgJHtvdXRwdXRTaGFwZX0uYCk7XG4gICAgY29uc3QgaW5wdXRzID0geyBpbWFnZTogJGltYWdlLCB0cmFuc2Zvcm1zOiAkdHJhbnNmb3JtcyB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBpbnRlcnBvbGF0aW9uLCBmaWxsTW9kZSwgZmlsbFZhbHVlLCBvdXRwdXRTaGFwZSB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFRyYW5zZm9ybSwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgdHJhbnNmb3JtID0gb3AoeyB0cmFuc2Zvcm1fIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHJhbnNmb3JtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnQsIGFzc2VydFNoYXBlc01hdGNoLCBnZXRUeXBlZEFycmF5RnJvbURUeXBlIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyB0ZW5zb3IgfSBmcm9tICcuL3RlbnNvcic7XG4vKipcbiAqIFJldHVybnMgd2hldGhlciB0aGUgdGFyZ2V0cyBhcmUgaW4gdGhlIHRvcCBLIHByZWRpY3Rpb25zLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBwcmVkaWN0aW9ucyA9IHRmLnRlbnNvcjJkKFtbMjAsIDEwLCA0MCwgMzBdLCBbMzAsIDUwLCAtMjAsIDEwXV0pO1xuICogY29uc3QgdGFyZ2V0cyA9IHRmLnRlbnNvcjFkKFsyLCAwXSk7XG4gKiBjb25zdCBwcmVjaXNpb24gPSBhd2FpdCB0Zi5pblRvcEtBc3luYyhwcmVkaWN0aW9ucywgdGFyZ2V0cyk7XG4gKiBwcmVjaXNpb24ucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIHByZWRpY3Rpb25zIDItRCBvciBoaWdoZXIgYHRmLlRlbnNvcmAgd2l0aCBsYXN0IGRpbWVuc2lvbiBiZWluZ1xuICogICAgIGF0IGxlYXN0IGBrYC5cbiAqIEBwYXJhbSB0YXJnZXRzIDEtRCBvciBoaWdoZXIgYHRmLlRlbnNvcmAuXG4gKiBAcGFyYW0gayBPcHRpb25hbCBOdW1iZXIgb2YgdG9wIGVsZW1lbnRzIHRvIGxvb2sgYXQgZm9yIGNvbXB1dGluZyBwcmVjaXNpb24sXG4gKiAgICAgZGVmYXVsdCB0byAxLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0V2YWx1YXRpb24nfVxuICovXG5hc3luYyBmdW5jdGlvbiBpblRvcEtBc3luY18ocHJlZGljdGlvbnMsIHRhcmdldHMsIGsgPSAxKSB7XG4gICAgY29uc3QgJHByZWRpY3Rpb25zID0gY29udmVydFRvVGVuc29yKHByZWRpY3Rpb25zLCAncHJlZGljdGlvbnMnLCAnaW5Ub3BLJyk7XG4gICAgY29uc3QgJHRhcmdldHMgPSBjb252ZXJ0VG9UZW5zb3IodGFyZ2V0cywgJ3RhcmdldHMnLCAnaW5Ub3BLJyk7XG4gICAgYXNzZXJ0KCRwcmVkaWN0aW9ucy5yYW5rID4gMSwgKCkgPT4gJ2luVG9wSygpIGV4cGVjdHMgdGhlIHByZWRpY3Rpb25zIHRvIGJlIG9mIHJhbmsgMiBvciBoaWdoZXIsICcgK1xuICAgICAgICBgYnV0IGdvdCAkeyRwcmVkaWN0aW9ucy5yYW5rfWApO1xuICAgIGFzc2VydCgkcHJlZGljdGlvbnMucmFuayAtIDEgPT09ICR0YXJnZXRzLnJhbmssICgpID0+IGBwcmVkaWN0aW9ucyByYW5rIHNob3VsZCBiZSAxIGxhcmdlciB0aGFuIGAgK1xuICAgICAgICBgdGFyZ2V0cyByYW5rLCBidXQgZ290IHByZWRpY3Rpb25zIHJhbmsgYCArXG4gICAgICAgIGAkeyRwcmVkaWN0aW9ucy5yYW5rfSBhbmQgdGFyZ2V0cyByYW5rICR7JHRhcmdldHMucmFua31gKTtcbiAgICBhc3NlcnRTaGFwZXNNYXRjaCgkcHJlZGljdGlvbnMuc2hhcGUuc2xpY2UoMCwgJHByZWRpY3Rpb25zLnNoYXBlLmxlbmd0aCAtIDEpLCAkdGFyZ2V0cy5zaGFwZSwgYHByZWRpY3Rpb25zJ3Mgc2hhcGUgc2hvdWxkIGJlIGFsaWduIHdpdGggdGhlIHRhcmdldHMnIHNoYXBlLCBgICtcbiAgICAgICAgJ2V4Y2VwdCB0aGUgbGFzdCBkaW1lbnNpb24uJyk7XG4gICAgY29uc3QgbGFzdERpbSA9ICRwcmVkaWN0aW9ucy5zaGFwZVskcHJlZGljdGlvbnMuc2hhcGUubGVuZ3RoIC0gMV07XG4gICAgYXNzZXJ0KGsgPiAwICYmIGsgPD0gbGFzdERpbSwgKCkgPT4gYCdrJyBwYXNzZWQgdG8gaW5Ub3BLKCkgbXVzdCBiZSA+IDAgJiYgPD0gdGhlIHByZWRpY3Rpb25zIGxhc3QgYCArXG4gICAgICAgIGBkaW1lbnNpb24gKCR7bGFzdERpbX0pLCBidXQgZ290ICR7a31gKTtcbiAgICBjb25zdCBwcmVkaWN0aW9uc1ZhbHMgPSBhd2FpdCAkcHJlZGljdGlvbnMuZGF0YSgpO1xuICAgIGNvbnN0IHRhcmdldHNWYWxzID0gYXdhaXQgJHRhcmdldHMuZGF0YSgpO1xuICAgIC8vIFJlc2hhcGUgcHJlZGljdGlvbnNWYWxzIGludG8gYSAyZCB0ZW5zb3IgW2JhdGNoLCBsYXN0RGltXVxuICAgIC8vIGFuZCBsb29rIHVwIHRvcEsgYWxvbmcgbGFzdERpbS5cbiAgICBjb25zdCBbYmF0Y2gsIHNpemVdID0gW3ByZWRpY3Rpb25zVmFscy5sZW5ndGggLyBsYXN0RGltLCBsYXN0RGltXTtcbiAgICBjb25zdCBwcmVjaXNpb24gPSBnZXRUeXBlZEFycmF5RnJvbURUeXBlKCdib29sJywgYmF0Y2gpO1xuICAgIGZvciAobGV0IGIgPSAwOyBiIDwgYmF0Y2g7IGIrKykge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBiICogc2l6ZTtcbiAgICAgICAgY29uc3QgdmFscyA9IHByZWRpY3Rpb25zVmFscy5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIHNpemUpO1xuICAgICAgICBjb25zdCB2YWxBbmRJbmQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YWxBbmRJbmQucHVzaCh7IHZhbHVlOiB2YWxzW2ldLCBpbmRleDogaSB9KTtcbiAgICAgICAgfVxuICAgICAgICB2YWxBbmRJbmQuc29ydCgoYSwgYikgPT4gYi52YWx1ZSAtIGEudmFsdWUpO1xuICAgICAgICBwcmVjaXNpb25bYl0gPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGs7IGkrKykge1xuICAgICAgICAgICAgaWYgKHZhbEFuZEluZFtpXS5pbmRleCA9PT0gdGFyZ2V0c1ZhbHNbYl0pIHtcbiAgICAgICAgICAgICAgICBwcmVjaXNpb25bYl0gPSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChwcmVkaWN0aW9ucyAhPT0gJHByZWRpY3Rpb25zKSB7XG4gICAgICAgICRwcmVkaWN0aW9ucy5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGlmICh0YXJnZXRzICE9PSAkdGFyZ2V0cykge1xuICAgICAgICAkdGFyZ2V0cy5kaXNwb3NlKCk7XG4gICAgfVxuICAgIC8vIE91dHB1dCBwcmVjaXNpb24gaGFzIHRoZSBzYW1lIHNoYXBlIGFzIHRhcmdldHMuXG4gICAgcmV0dXJuIHRlbnNvcihwcmVjaXNpb24sICR0YXJnZXRzLnNoYXBlLCAnYm9vbCcpO1xufVxuZXhwb3J0IGNvbnN0IGluVG9wS0FzeW5jID0gaW5Ub3BLQXN5bmNfO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5fdG9wX2suanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IElzRmluaXRlIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV0dXJucyB3aGljaCBlbGVtZW50cyBvZiB4IGFyZSBmaW5pdGUuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbTmFOLCBJbmZpbml0eSwgLUluZmluaXR5LCAwLCAxXSk7XG4gKlxuICogeC5pc0Zpbml0ZSgpLnByaW50KCk7ICAvLyBvciB0Zi5pc05hTih4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgVGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBpc0Zpbml0ZV8oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2lzRmluaXRlJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKElzRmluaXRlLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGlzRmluaXRlID0gb3AoeyBpc0Zpbml0ZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pc19maW5pdGUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IElzSW5mIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV0dXJucyB3aGljaCBlbGVtZW50cyBvZiB4IGFyZSBJbmZpbml0eSBvciAtSW5maW5pdHkuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbTmFOLCBJbmZpbml0eSwgLUluZmluaXR5LCAwLCAxXSk7XG4gKlxuICogeC5pc0luZigpLnByaW50KCk7ICAvLyBvciB0Zi5pc05hTih4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgVGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBpc0luZl8oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2lzSW5mJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKElzSW5mLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGlzSW5mID0gb3AoeyBpc0luZl8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pc19pbmYuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IElzTmFuIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUlJldHVybnMgd2hpY2ggZWxlbWVudHMgb2YgeCBhcmUgTmFOLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoW05hTiwgSW5maW5pdHksIC1JbmZpbml0eSwgMCwgMV0pO1xuICpcbiAqIHguaXNOYU4oKS5wcmludCgpOyAgLy8gb3IgdGYuaXNOYU4oeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IFRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gaXNOYU5fKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdpc05hTicpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChJc05hbiwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBpc05hTiA9IG9wKHsgaXNOYU5fIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXNfbmFuLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBMZWFreVJlbHUgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBsZWFreSByZWN0aWZpZWQgbGluZWFyIGVsZW1lbnQtd2lzZS5cbiAqXG4gKiBTZWVcbiAqIFtodHRwOi8vd2ViLnN0YW5mb3JkLmVkdS9+YXduaS9wYXBlcnMvcmVsdV9oeWJyaWRfaWNtbDIwMTNfZmluYWwucGRmXShcbiAqICAgICBodHRwOi8vd2ViLnN0YW5mb3JkLmVkdS9+YXduaS9wYXBlcnMvcmVsdV9oeWJyaWRfaWNtbDIwMTNfZmluYWwucGRmKVxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWy0xLCAyLCAtMywgNF0pO1xuICpcbiAqIHgubGVha3lSZWx1KDAuMSkucHJpbnQoKTsgIC8vIG9yIHRmLmxlYWt5UmVsdSh4LCAwLjEpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gYWxwaGEgVGhlIHNjYWxpbmcgZmFjdG9yIGZvciBuZWdhdGl2ZSB2YWx1ZXMsIGRlZmF1bHRzIHRvIDAuMi5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gbGVha3lSZWx1Xyh4LCBhbHBoYSA9IDAuMikge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2xlYWt5UmVsdScpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICBjb25zdCBhdHRycyA9IHsgYWxwaGEgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChMZWFreVJlbHUsIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IGxlYWt5UmVsdSA9IG9wKHsgbGVha3lSZWx1XyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxlYWt5X3JlbHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IExlc3MgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgbWFrZVR5cGVzTWF0Y2ggfSBmcm9tICcuLi90ZW5zb3JfdXRpbCc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUgfSBmcm9tICcuL2Jyb2FkY2FzdF91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSB0cnV0aCB2YWx1ZSBvZiAoYSA8IGIpIGVsZW1lbnQtd2lzZS4gU3VwcG9ydHMgYnJvYWRjYXN0aW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbMiwgMiwgMl0pO1xuICpcbiAqIGEubGVzcyhiKS5wcmludCgpO1xuICogYGBgXG4gKiBAcGFyYW0gYSBUaGUgZmlyc3QgaW5wdXQgdGVuc29yLlxuICogQHBhcmFtIGIgVGhlIHNlY29uZCBpbnB1dCB0ZW5zb3IuIE11c3QgaGF2ZSB0aGUgc2FtZSBkdHlwZSBhcyBgYWAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTG9naWNhbCd9XG4gKi9cbmZ1bmN0aW9uIGxlc3NfKGEsIGIpIHtcbiAgICBsZXQgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnbGVzcycsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICAgIGxldCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdsZXNzJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG4gICAgWyRhLCAkYl0gPSBtYWtlVHlwZXNNYXRjaCgkYSwgJGIpO1xuICAgIGFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKCRhLnNoYXBlLCAkYi5zaGFwZSk7XG4gICAgY29uc3QgaW5wdXRzID0geyBhOiAkYSwgYjogJGIgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChMZXNzLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGxlc3MgPSBvcCh7IGxlc3NfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bGVzcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTGVzc0VxdWFsIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IG1ha2VUeXBlc01hdGNoIH0gZnJvbSAnLi4vdGVuc29yX3V0aWwnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlIH0gZnJvbSAnLi9icm9hZGNhc3RfdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV0dXJucyB0aGUgdHJ1dGggdmFsdWUgb2YgKGEgPD0gYikgZWxlbWVudC13aXNlLiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFsyLCAyLCAyXSk7XG4gKlxuICogYS5sZXNzRXF1YWwoYikucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBpbnB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIGlucHV0IHRlbnNvci4gTXVzdCBoYXZlIHRoZSBzYW1lIGR0eXBlIGFzIGBhYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdMb2dpY2FsJ31cbiAqL1xuZnVuY3Rpb24gbGVzc0VxdWFsXyhhLCBiKSB7XG4gICAgbGV0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ2xlc3NFcXVhbCcsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICAgIGxldCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdsZXNzRXF1YWwnLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgICBbJGEsICRiXSA9IG1ha2VUeXBlc01hdGNoKCRhLCAkYik7XG4gICAgYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoJGEuc2hhcGUsICRiLnNoYXBlKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGE6ICRhLCBiOiAkYiB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKExlc3NFcXVhbCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBsZXNzRXF1YWwgPSBvcCh7IGxlc3NFcXVhbF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sZXNzX2VxdWFsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IGdyZWF0ZXJFcXVhbCB9IGZyb20gJy4uL2dyZWF0ZXJfZXF1YWwnO1xuaW1wb3J0IHsgbGVzc0VxdWFsIH0gZnJvbSAnLi4vbGVzc19lcXVhbCc7XG5pbXBvcnQgeyBsb2dpY2FsQW5kIH0gZnJvbSAnLi4vbG9naWNhbF9hbmQnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmFuZ2UgfSBmcm9tICcuLi9yYW5nZSc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi4vcmVzaGFwZSc7XG5pbXBvcnQgeyBzY2FsYXIgfSBmcm9tICcuLi9zY2FsYXInO1xuaW1wb3J0IHsgc3RhY2sgfSBmcm9tICcuLi9zdGFjayc7XG5pbXBvcnQgeyBzdWIgfSBmcm9tICcuLi9zdWInO1xuaW1wb3J0IHsgdW5zdGFjayB9IGZyb20gJy4uL3Vuc3RhY2snO1xuaW1wb3J0IHsgd2hlcmUgfSBmcm9tICcuLi93aGVyZSc7XG5pbXBvcnQgeyB6ZXJvcyB9IGZyb20gJy4uL3plcm9zJztcbi8qKlxuICogQ29weSBhIHRlbnNvciBzZXR0aW5nIGV2ZXJ5dGhpbmcgb3V0c2lkZSBhIGNlbnRyYWwgYmFuZCBpbiBlYWNoIGlubmVybW9zdFxuICogbWF0cml4IHRvIHplcm8uXG4gKlxuICogVGhlIGJhbmQgcGFydCBpcyBjb21wdXRlZCBhcyBmb2xsb3dzOiBBc3N1bWUgaW5wdXQgaGFzIGBrYCBkaW1lbnNpb25zXG4gKiBgW0ksIEosIEssIC4uLiwgTSwgTl1gLCB0aGVuIHRoZSBvdXRwdXQgaXMgYSB0ZW5zb3Igd2l0aCB0aGUgc2FtZSBzaGFwZSB3aGVyZVxuICogYGJhbmRbaSwgaiwgaywgLi4uLCBtLCBuXSA9IGluX2JhbmQobSwgbikgKiBpbnB1dFtpLCBqLCBrLCAuLi4sIG0sIG5dYC5cbiAqIFRoZSBpbmRpY2F0b3IgZnVuY3Rpb25cbiAqIGBpbl9iYW5kKG0sIG4pID0gKG51bV9sb3dlciA8IDAgfHwgKG0tbikgPD0gbnVtX2xvd2VyKSlgXG4gKiBgJiYgKG51bV91cHBlciA8IDAgfHwgKG4tbSkgPD0gbnVtX3VwcGVyKWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjJkKFtbIDAsICAxLCAgMiwgM10sXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIFstMSwgIDAsICAxLCAyXSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgWy0yLCAtMSwgIDAsIDFdLFxuICogICAgICAgICAgICAgICAgICAgICAgICBbLTMsIC0yLCAtMSwgMF1dKTtcbiAqIGxldCB5ID0gdGYubGluYWxnLmJhbmRQYXJ0KHgsIDEsIC0xKTtcbiAqIHkucHJpbnQoKTsgLy8gW1sgMCwgIDEsICAyLCAzXSxcbiAqICAgICAgICAgICAgLy8gIFstMSwgIDAsICAxLCAyXSxcbiAqICAgICAgICAgICAgLy8gIFsgMCwgLTEsICAwLCAxXSxcbiAqICAgICAgICAgICAgLy8gIFsgMCwgMCAsIC0xLCAwXV1cbiAqIGxldCB6ID0gdGYubGluYWxnLmJhbmRQYXJ0KHgsIDIsIDEpO1xuICogei5wcmludCgpOyAvLyBbWyAwLCAgMSwgIDAsIDBdLFxuICogICAgICAgICAgICAvLyAgWy0xLCAgMCwgIDEsIDBdLFxuICogICAgICAgICAgICAvLyAgWy0yLCAtMSwgIDAsIDFdLFxuICogICAgICAgICAgICAvLyAgWyAwLCAtMiwgLTEsIDBdXVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggUmFuayBga2AgdGVuc29yXG4gKiBAcGFyYW0gbnVtTG93ZXIgTnVtYmVyIG9mIHN1YmRpYWdvbmFscyB0byBrZWVwLlxuICogICBJZiBuZWdhdGl2ZSwga2VlcCBlbnRpcmUgbG93ZXIgdHJpYW5nbGUuXG4gKiBAcGFyYW0gbnVtVXBwZXIgTnVtYmVyIG9mIHN1YmRpYWdvbmFscyB0byBrZWVwLlxuICogICBJZiBuZWdhdGl2ZSwga2VlcCBlbnRpcmUgdXBwZXIgdHJpYW5nbGUuXG4gKiBAcmV0dXJucyBSYW5rIGBrYCB0ZW5zb3Igb2YgdGhlIHNhbWUgc2hhcGUgYXMgaW5wdXQuXG4gKiAgIFRoZSBleHRyYWN0ZWQgYmFuZGVkIHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOidPcGVyYXRpb25zJywgc3ViaGVhZGluZzonTGluZWFyIEFsZ2VicmEnLCBuYW1lc3BhY2U6J2xpbmFsZyd9XG4gKi9cbmZ1bmN0aW9uIGJhbmRQYXJ0XyhhLCBudW1Mb3dlciwgbnVtVXBwZXIpIHtcbiAgICBhc3NlcnQobnVtTG93ZXIgJSAxID09PSAwLCAoKSA9PiBgYmFuZFBhcnQoKTogbnVtTG93ZXIgbXVzdCBiZSBhbiBpbnRlZ2VyLCBnb3QgJHtudW1Mb3dlcn0uYCk7XG4gICAgYXNzZXJ0KG51bVVwcGVyICUgMSA9PT0gMCwgKCkgPT4gYGJhbmRQYXJ0KCk6IG51bVVwcGVyIG11c3QgYmUgYW4gaW50ZWdlciwgZ290ICR7bnVtVXBwZXJ9LmApO1xuICAgIGNvbnN0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ2JhbmRQYXJ0Jyk7XG4gICAgYXNzZXJ0KCRhLnJhbmsgPj0gMiwgKCkgPT4gYGJhbmRQYXJ0KCk6IFJhbmsgbXVzdCBiZSBhdCBsZWFzdCAyLCBnb3QgJHskYS5yYW5rfS5gKTtcbiAgICBjb25zdCBzaGFwZSA9ICRhLnNoYXBlO1xuICAgIGNvbnN0IFtNLCBOXSA9ICRhLnNoYXBlLnNsaWNlKC0yKTtcbiAgICBpZiAoIShudW1Mb3dlciA8PSBNKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGJhbmRQYXJ0KCk6IG51bUxvd2VyICgke251bUxvd2VyfSlgICtcbiAgICAgICAgICAgIGAgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2Ygcm93cyAoJHtNfSkuYCk7XG4gICAgfVxuICAgIGlmICghKG51bVVwcGVyIDw9IE4pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgYmFuZFBhcnQoKTogbnVtVXBwZXIgKCR7bnVtVXBwZXJ9KWAgK1xuICAgICAgICAgICAgYCBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBjb2x1bW5zICgke059KS5gKTtcbiAgICB9XG4gICAgaWYgKG51bUxvd2VyIDwgMCkge1xuICAgICAgICBudW1Mb3dlciA9IE07XG4gICAgfVxuICAgIGlmIChudW1VcHBlciA8IDApIHtcbiAgICAgICAgbnVtVXBwZXIgPSBOO1xuICAgIH1cbiAgICBjb25zdCBpID0gcmVzaGFwZShyYW5nZSgwLCBNLCAxLCAnaW50MzInKSwgWy0xLCAxXSk7XG4gICAgY29uc3QgaiA9IHJhbmdlKDAsIE4sIDEsICdpbnQzMicpO1xuICAgIGNvbnN0IGlqID0gc3ViKGksIGopO1xuICAgIGNvbnN0IGluQmFuZCA9IGxvZ2ljYWxBbmQobGVzc0VxdWFsKGlqLCBzY2FsYXIoK251bUxvd2VyLCAnaW50MzInKSksIGdyZWF0ZXJFcXVhbChpaiwgc2NhbGFyKC1udW1VcHBlciwgJ2ludDMyJykpKTtcbiAgICBjb25zdCB6ZXJvID0gemVyb3MoW00sIE5dLCAkYS5kdHlwZSk7XG4gICAgcmV0dXJuIHJlc2hhcGUoc3RhY2sodW5zdGFjayhyZXNoYXBlKCRhLCBbLTEsIE0sIE5dKSlcbiAgICAgICAgLm1hcChtYXQgPT4gd2hlcmUoaW5CYW5kLCBtYXQsIHplcm8pKSksIHNoYXBlKTtcbn1cbmV4cG9ydCBjb25zdCBiYW5kUGFydCA9IG9wKHsgYmFuZFBhcnRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmFuZF9wYXJ0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IGRpdiB9IGZyb20gJy4uL2Rpdic7XG5pbXBvcnQgeyBtdWwgfSBmcm9tICcuLi9tdWwnO1xuaW1wb3J0IHsgbm9ybSB9IGZyb20gJy4uL25vcm0nO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgc3BsaXQgfSBmcm9tICcuLi9zcGxpdCc7XG5pbXBvcnQgeyBzcXVlZXplIH0gZnJvbSAnLi4vc3F1ZWV6ZSc7XG5pbXBvcnQgeyBzdGFjayB9IGZyb20gJy4uL3N0YWNrJztcbmltcG9ydCB7IHN1YiB9IGZyb20gJy4uL3N1Yic7XG5pbXBvcnQgeyBzdW0gfSBmcm9tICcuLi9zdW0nO1xuLyoqXG4gKiBHcmFtLVNjaG1pZHQgb3J0aG9nb25hbGl6YXRpb24uXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IyZChbWzEsIDJdLCBbMywgNF1dKTtcbiAqIGxldCB5ID0gdGYubGluYWxnLmdyYW1TY2htaWR0KHgpO1xuICogeS5wcmludCgpO1xuICogY29uc29sZS5sb2coJ090aG9nb25hbGl6ZWQ6Jyk7XG4gKiB5LmRvdCh5LnRyYW5zcG9zZSgpKS5wcmludCgpOyAgLy8gc2hvdWxkIGJlIG5lYXJseSB0aGUgaWRlbnRpdHkgbWF0cml4LlxuICogY29uc29sZS5sb2coJ0ZpcnN0IHJvdyBkaXJlY3Rpb24gbWFpbnRhaW5lZDonKTtcbiAqIGNvbnN0IGRhdGEgPSBhd2FpdCB5LmFycmF5KCk7XG4gKiBjb25zb2xlLmxvZyhkYXRhWzBdWzFdIC8gZGF0YVswXVswXSk7ICAvLyBzaG91bGQgYmUgbmVhcmx5IDIuXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geHMgVGhlIHZlY3RvcnMgdG8gYmUgb3J0aG9nb25hbGl6ZWQsIGluIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZ1xuICogICBmb3JtYXRzOlxuICogICAtIEFuIEFycmF5IG9mIGB0Zi5UZW5zb3IxRGAuXG4gKiAgIC0gQSBgdGYuVGVuc29yMkRgLCBpLmUuLCBhIG1hdHJpeCwgaW4gd2hpY2ggY2FzZSB0aGUgdmVjdG9ycyBhcmUgdGhlIHJvd3NcbiAqICAgICBvZiBgeHNgLlxuICogICBJbiBlYWNoIGNhc2UsIGFsbCB0aGUgdmVjdG9ycyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFuZCB0aGUgbGVuZ3RoXG4gKiAgIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgdmVjdG9ycy5cbiAqIEByZXR1cm5zIFRoZSBvcnRob2dvbmFsaXplZCBhbmQgbm9ybWFsaXplZCB2ZWN0b3JzIG9yIG1hdHJpeC5cbiAqICAgT3J0aG9nb25hbGl6YXRpb24gbWVhbnMgdGhhdCB0aGUgdmVjdG9ycyBvciB0aGUgcm93cyBvZiB0aGUgbWF0cml4XG4gKiAgIGFyZSBvcnRob2dvbmFsICh6ZXJvIGlubmVyIHByb2R1Y3RzKS4gTm9ybWFsaXphdGlvbiBtZWFucyB0aGF0IGVhY2hcbiAqICAgdmVjdG9yIG9yIGVhY2ggcm93IG9mIHRoZSBtYXRyaXggaGFzIGFuIEwyIG5vcm0gdGhhdCBlcXVhbHMgYDFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6J09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOidMaW5lYXIgQWxnZWJyYScsIG5hbWVzcGFjZTonbGluYWxnJ31cbiAqL1xuZnVuY3Rpb24gZ3JhbVNjaG1pZHRfKHhzKSB7XG4gICAgbGV0IGlucHV0SXNUZW5zb3IyRDtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh4cykpIHtcbiAgICAgICAgaW5wdXRJc1RlbnNvcjJEID0gZmFsc2U7XG4gICAgICAgIGFzc2VydCh4cyAhPSBudWxsICYmIHhzLmxlbmd0aCA+IDAsICgpID0+ICdHcmFtLVNjaG1pZHQgcHJvY2VzczogaW5wdXQgbXVzdCBub3QgYmUgbnVsbCwgdW5kZWZpbmVkLCBvciAnICtcbiAgICAgICAgICAgICdlbXB0eScpO1xuICAgICAgICBjb25zdCBkaW0gPSB4c1swXS5zaGFwZVswXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCB4cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgYXNzZXJ0KHhzW2ldLnNoYXBlWzBdID09PSBkaW0sICgpID0+ICdHcmFtLVNjaG1pZHQ6IE5vbi11bmlxdWUgbGVuZ3RocyBmb3VuZCBpbiB0aGUgaW5wdXQgdmVjdG9yczogJyArXG4gICAgICAgICAgICAgICAgYCgke3hzW2ldLnNoYXBlWzBdfSB2cy4gJHtkaW19KWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpbnB1dElzVGVuc29yMkQgPSB0cnVlO1xuICAgICAgICB4cyA9IHNwbGl0KHhzLCB4cy5zaGFwZVswXSwgMCkubWFwKHggPT4gc3F1ZWV6ZSh4LCBbMF0pKTtcbiAgICB9XG4gICAgYXNzZXJ0KHhzLmxlbmd0aCA8PSB4c1swXS5zaGFwZVswXSwgKCkgPT4gYEdyYW0tU2NobWlkdDogTnVtYmVyIG9mIHZlY3RvcnMgKCR7eHMubGVuZ3RofSkgZXhjZWVkcyBgICtcbiAgICAgICAgYG51bWJlciBvZiBkaW1lbnNpb25zICgke3hzWzBdLnNoYXBlWzBdfSkuYCk7XG4gICAgY29uc3QgeXMgPSBbXTtcbiAgICBjb25zdCB4czFkID0geHM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB4cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB5cy5wdXNoKEVOR0lORS50aWR5KCgpID0+IHtcbiAgICAgICAgICAgIGxldCB4ID0geHMxZFtpXTtcbiAgICAgICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaTsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb2ogPSBtdWwoc3VtKG11bCh5c1tqXSwgeCkpLCB5c1tqXSk7XG4gICAgICAgICAgICAgICAgICAgIHggPSBzdWIoeCwgcHJvaik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRpdih4LCBub3JtKHgsICdldWNsaWRlYW4nKSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgaWYgKGlucHV0SXNUZW5zb3IyRCkge1xuICAgICAgICByZXR1cm4gc3RhY2soeXMsIDApO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHlzO1xuICAgIH1cbn1cbmV4cG9ydCBjb25zdCBncmFtU2NobWlkdCA9IG9wKHsgZ3JhbVNjaG1pZHRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z3JhbV9zY2htaWR0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBkaXNwb3NlIH0gZnJvbSAnLi4vLi4vZ2xvYmFscyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IGNsb25lIH0gZnJvbSAnLi4vY2xvbmUnO1xuaW1wb3J0IHsgY29uY2F0IH0gZnJvbSAnLi4vY29uY2F0JztcbmltcG9ydCB7IGRpdiB9IGZyb20gJy4uL2Rpdic7XG5pbXBvcnQgeyBleWUgfSBmcm9tICcuLi9leWUnO1xuaW1wb3J0IHsgZ3JlYXRlciB9IGZyb20gJy4uL2dyZWF0ZXInO1xuaW1wb3J0IHsgbWF0TXVsIH0gZnJvbSAnLi4vbWF0X211bCc7XG5pbXBvcnQgeyBtdWwgfSBmcm9tICcuLi9tdWwnO1xuaW1wb3J0IHsgbmVnIH0gZnJvbSAnLi4vbmVnJztcbmltcG9ydCB7IG5vcm0gfSBmcm9tICcuLi9ub3JtJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuLi9yZXNoYXBlJztcbmltcG9ydCB7IHNsaWNlIH0gZnJvbSAnLi4vc2xpY2UnO1xuaW1wb3J0IHsgc3RhY2sgfSBmcm9tICcuLi9zdGFjayc7XG5pbXBvcnQgeyBzdWIgfSBmcm9tICcuLi9zdWInO1xuaW1wb3J0IHsgdGVuc29yMmQgfSBmcm9tICcuLi90ZW5zb3IyZCc7XG5pbXBvcnQgeyB0cmFuc3Bvc2UgfSBmcm9tICcuLi90cmFuc3Bvc2UnO1xuaW1wb3J0IHsgdW5zdGFjayB9IGZyb20gJy4uL3Vuc3RhY2snO1xuaW1wb3J0IHsgd2hlcmUgfSBmcm9tICcuLi93aGVyZSc7XG4vKipcbiAqIENvbXB1dGUgUVIgZGVjb21wb3NpdGlvbiBvZiBtLWJ5LW4gbWF0cml4IHVzaW5nIEhvdXNlaG9sZGVyIHRyYW5zZm9ybWF0aW9uLlxuICpcbiAqIEltcGxlbWVudGF0aW9uIGJhc2VkIG9uXG4gKiAgIFtodHRwOi8vd3d3LmNzLmNvcm5lbGwuZWR1L35iaW5kZWwvY2xhc3MvY3M2MjEwLWYwOS9sZWMxOC5wZGZdXG4gKiAoaHR0cDovL3d3dy5jcy5jb3JuZWxsLmVkdS9+YmluZGVsL2NsYXNzL2NzNjIxMC1mMDkvbGVjMTgucGRmKVxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMmQoW1sxLCAyXSwgWzMsIDRdXSk7XG4gKiBsZXQgW3EsIHJdID0gdGYubGluYWxnLnFyKGEpO1xuICogY29uc29sZS5sb2coJ1EnKTtcbiAqIHEucHJpbnQoKTtcbiAqIGNvbnNvbGUubG9nKCdSJyk7XG4gKiByLnByaW50KCk7XG4gKiBjb25zb2xlLmxvZygnT3J0aG9nb25hbGl6ZWQnKTtcbiAqIHEuZG90KHEudHJhbnNwb3NlKCkpLnByaW50KCkgIC8vIHNob3VsZCBiZSBuZWFybHkgdGhlIGlkZW50aXR5IG1hdHJpeC5cbiAqIGNvbnNvbGUubG9nKCdSZWNvbnN0cnVjdGVkJyk7XG4gKiBxLmRvdChyKS5wcmludCgpOyAvLyBzaG91bGQgYmUgbmVhcmx5IFtbMSwgMl0sIFszLCA0XV07XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgYHRmLlRlbnNvcmAgdG8gYmUgUVItZGVjb21wb3NlZC4gTXVzdCBoYXZlIHJhbmsgPj0gMi4gU3VwcG9zZVxuICogICBpdCBoYXMgdGhlIHNoYXBlIGBbLi4uLCBNLCBOXWAuXG4gKiBAcGFyYW0gZnVsbE1hdHJpY2VzIEFuIG9wdGlvbmFsIGJvb2xlYW4gcGFyYW1ldGVyLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICogICBJZiBgdHJ1ZWAsIGNvbXB1dGUgZnVsbC1zaXplZCBgUWAuIElmIGBmYWxzZWAgKHRoZSBkZWZhdWx0KSxcbiAqICAgY29tcHV0ZSBvbmx5IHRoZSBsZWFkaW5nIE4gY29sdW1ucyBvZiBgUWAgYW5kIGBSYC5cbiAqIEByZXR1cm5zIEFuIGBBcnJheWAgb2YgdHdvIGB0Zi5UZW5zb3JgczogYFtRLCBSXWAuIGBRYCBpcyBhIHVuaXRhcnkgbWF0cml4LFxuICogICBpLmUuLCBpdHMgY29sdW1ucyBhbGwgaGF2ZSB1bml0IG5vcm0gYW5kIGFyZSBtdXR1YWxseSBvcnRob2dvbmFsLlxuICogICBJZiBgTSA+PSBOYCxcbiAqICAgICBJZiBgZnVsbE1hdHJpY2VzYCBpcyBgZmFsc2VgIChkZWZhdWx0KSxcbiAqICAgICAgIC0gYFFgIGhhcyBhIHNoYXBlIG9mIGBbLi4uLCBNLCBOXWAsXG4gKiAgICAgICAtIGBSYCBoYXMgYSBzaGFwZSBvZiBgWy4uLiwgTiwgTl1gLlxuICogICAgIElmIGBmdWxsTWF0cmljZXNgIGlzIGB0cnVlYCAoZGVmYXVsdCksXG4gKiAgICAgICAtIGBRYCBoYXMgYSBzaGFwZSBvZiBgWy4uLiwgTSwgTV1gLFxuICogICAgICAgLSBgUmAgaGFzIGEgc2hhcGUgb2YgYFsuLi4sIE0sIE5dYC5cbiAqICAgSWYgYE0gPCBOYCxcbiAqICAgICAtIGBRYCBoYXMgYSBzaGFwZSBvZiBgWy4uLiwgTSwgTV1gLFxuICogICAgIC0gYFJgIGhhcyBhIHNoYXBlIG9mIGBbLi4uLCBNLCBOXWAuXG4gKiBAdGhyb3dzIElmIHRoZSByYW5rIG9mIGB4YCBpcyBsZXNzIHRoYW4gMi5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOidPcGVyYXRpb25zJyxcbiAqICAgICAgIHN1YmhlYWRpbmc6J0xpbmVhciBBbGdlYnJhJyxcbiAqICAgICAgIG5hbWVzcGFjZTonbGluYWxnJ31cbiAqL1xuZnVuY3Rpb24gcXJfKHgsIGZ1bGxNYXRyaWNlcyA9IGZhbHNlKSB7XG4gICAgYXNzZXJ0KHgucmFuayA+PSAyLCAoKSA9PiBgcXIoKSByZXF1aXJlcyBpbnB1dCB0ZW5zb3IgdG8gaGF2ZSBhIHJhbmsgPj0gMiwgYnV0IGdvdCByYW5rICR7eC5yYW5rfWApO1xuICAgIGlmICh4LnJhbmsgPT09IDIpIHtcbiAgICAgICAgcmV0dXJuIHFyMmQoeCwgZnVsbE1hdHJpY2VzKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIFJhbmsgPiAyLlxuICAgICAgICAvLyBUT0RPKGNhaXMpOiBCZWxvdyB3ZSBzcGxpdCB0aGUgaW5wdXQgaW50byBpbmRpdmlkdWFsIDJEIHRlbnNvcnMsXG4gICAgICAgIC8vICAgcGVyZm9ybSBRUiBkZWNvbXBvc2l0aW9uIG9uIHRoZW0gYW5kIHRoZW4gc3RhY2sgdGhlIHJlc3VsdHMgYmFja1xuICAgICAgICAvLyAgIHRvZ2V0aGVyLiBXZSBzaG91bGQgZXhwbG9yZSB3aGV0aGVyIHRoaXMgY2FuIGJlIHBhcmFsbGVsaXplZC5cbiAgICAgICAgY29uc3Qgb3V0ZXJEaW1zUHJvZCA9IHguc2hhcGUuc2xpY2UoMCwgeC5zaGFwZS5sZW5ndGggLSAyKVxuICAgICAgICAgICAgLnJlZHVjZSgodmFsdWUsIHByZXYpID0+IHZhbHVlICogcHJldik7XG4gICAgICAgIGNvbnN0IHgyZHMgPSB1bnN0YWNrKHJlc2hhcGUoeCwgW1xuICAgICAgICAgICAgb3V0ZXJEaW1zUHJvZCwgeC5zaGFwZVt4LnNoYXBlLmxlbmd0aCAtIDJdLFxuICAgICAgICAgICAgeC5zaGFwZVt4LnNoYXBlLmxlbmd0aCAtIDFdXG4gICAgICAgIF0pLCAwKTtcbiAgICAgICAgY29uc3QgcTJkcyA9IFtdO1xuICAgICAgICBjb25zdCByMmRzID0gW107XG4gICAgICAgIHgyZHMuZm9yRWFjaCh4MmQgPT4ge1xuICAgICAgICAgICAgY29uc3QgW3EyZCwgcjJkXSA9IHFyMmQoeDJkLCBmdWxsTWF0cmljZXMpO1xuICAgICAgICAgICAgcTJkcy5wdXNoKHEyZCk7XG4gICAgICAgICAgICByMmRzLnB1c2gocjJkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHEgPSByZXNoYXBlKHN0YWNrKHEyZHMsIDApLCB4LnNoYXBlKTtcbiAgICAgICAgY29uc3QgciA9IHJlc2hhcGUoc3RhY2socjJkcywgMCksIHguc2hhcGUpO1xuICAgICAgICByZXR1cm4gW3EsIHJdO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHFyMmQoeCwgZnVsbE1hdHJpY2VzID0gZmFsc2UpIHtcbiAgICByZXR1cm4gRU5HSU5FLnRpZHkoKCkgPT4ge1xuICAgICAgICBhc3NlcnQoeC5zaGFwZS5sZW5ndGggPT09IDIsICgpID0+IGBxcjJkKCkgcmVxdWlyZXMgYSAyRCBUZW5zb3IsIGJ1dCBnb3QgYSAke3guc2hhcGUubGVuZ3RofUQgVGVuc29yLmApO1xuICAgICAgICBjb25zdCBtID0geC5zaGFwZVswXTtcbiAgICAgICAgY29uc3QgbiA9IHguc2hhcGVbMV07XG4gICAgICAgIGxldCBxID0gZXllKG0pOyAvLyBPcnRob2dvbmFsIHRyYW5zZm9ybSBzbyBmYXIuXG4gICAgICAgIGxldCByID0gY2xvbmUoeCk7IC8vIFRyYW5zZm9ybWVkIG1hdHJpeCBzbyBmYXIuXG4gICAgICAgIGNvbnN0IG9uZTJEID0gdGVuc29yMmQoW1sxXV0sIFsxLCAxXSk7XG4gICAgICAgIGxldCB3ID0gY2xvbmUob25lMkQpO1xuICAgICAgICBjb25zdCBpdGVycyA9IG0gPj0gbiA/IG4gOiBtO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGl0ZXJzOyArK2opIHtcbiAgICAgICAgICAgIC8vIFRoaXMgdGlkeSB3aXRoaW4gdGhlIGZvci1sb29wIGVuc3VyZXMgd2UgY2xlYW4gdXAgdGVtcG9yYXJ5XG4gICAgICAgICAgICAvLyB0ZW5zb3JzIGFzIHNvb24gYXMgdGhleSBhcmUgbm8gbG9uZ2VyIG5lZWRlZC5cbiAgICAgICAgICAgIGNvbnN0IHJUZW1wID0gcjtcbiAgICAgICAgICAgIGNvbnN0IHdUZW1wID0gdztcbiAgICAgICAgICAgIGNvbnN0IHFUZW1wID0gcTtcbiAgICAgICAgICAgIFt3LCByLCBxXSA9IEVOR0lORS50aWR5KCgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBGaW5kIEggPSBJIC0gdGF1ICogdyAqIHcnLCB0byBwdXQgemVyb3MgYmVsb3cgUihqLCBqKS5cbiAgICAgICAgICAgICAgICBjb25zdCByakVuZDEgPSBzbGljZShyLCBbaiwgal0sIFttIC0gaiwgMV0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vcm1YID0gbm9ybShyakVuZDEpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJqaiA9IHNsaWNlKHIsIFtqLCBqXSwgWzEsIDFdKTtcbiAgICAgICAgICAgICAgICAvLyBUaGUgc2lnbigpIGZ1bmN0aW9uIHJldHVybnMgMCBvbiAwLCB3aGljaCBjYXVzZXMgZGl2aXNpb24gYnkgemVyby5cbiAgICAgICAgICAgICAgICBjb25zdCBzID0gd2hlcmUoZ3JlYXRlcihyamosIDApLCB0ZW5zb3IyZChbWy0xXV0pLCB0ZW5zb3IyZChbWzFdXSkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHUxID0gc3ViKHJqaiwgbXVsKHMsIG5vcm1YKSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgd1ByZSA9IGRpdihyakVuZDEsIHUxKTtcbiAgICAgICAgICAgICAgICBpZiAod1ByZS5zaGFwZVswXSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICB3ID0gY2xvbmUob25lMkQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdyA9IGNvbmNhdChbXG4gICAgICAgICAgICAgICAgICAgICAgICBvbmUyRCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlKHdQcmUsIFsxLCAwXSwgW3dQcmUuc2hhcGVbMF0gLSAxLCB3UHJlLnNoYXBlWzFdXSlcbiAgICAgICAgICAgICAgICAgICAgXSwgMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHRhdSA9IG5lZyhkaXYobWF0TXVsKHMsIHUxKSwgbm9ybVgpKTtcbiAgICAgICAgICAgICAgICAvLyAtLSBSIDo9IEhSLCBRIDo9IFFILlxuICAgICAgICAgICAgICAgIGNvbnN0IHJqRW5kQWxsID0gc2xpY2UociwgW2osIDBdLCBbbSAtIGosIG5dKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0YXVUaW1lc1cgPSBtdWwodGF1LCB3KTtcbiAgICAgICAgICAgICAgICBjb25zdCB3VCA9IHRyYW5zcG9zZSh3KTtcbiAgICAgICAgICAgICAgICBpZiAoaiA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByID0gc3ViKHJqRW5kQWxsLCBtYXRNdWwodGF1VGltZXNXLCBtYXRNdWwod1QsIHJqRW5kQWxsKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgclRpbWVzVGF1ID0gc3ViKHJqRW5kQWxsLCBtYXRNdWwodGF1VGltZXNXLCBtYXRNdWwod1QsIHJqRW5kQWxsKSkpO1xuICAgICAgICAgICAgICAgICAgICByID0gY29uY2F0KFtzbGljZShyLCBbMCwgMF0sIFtqLCBuXSksIHJUaW1lc1RhdV0sIDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB0YXdUaW1lc1dUID0gdHJhbnNwb3NlKHRhdVRpbWVzVyk7XG4gICAgICAgICAgICAgICAgY29uc3QgcUFsbEpFbmQgPSBzbGljZShxLCBbMCwgal0sIFttLCBxLnNoYXBlWzFdIC0gal0pO1xuICAgICAgICAgICAgICAgIGlmIChqID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHEgPSBzdWIocUFsbEpFbmQsIG1hdE11bChtYXRNdWwocUFsbEpFbmQsIHcpLCB0YXdUaW1lc1dUKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBxVGltZXNUYXUgPSBzdWIocUFsbEpFbmQsIG1hdE11bChtYXRNdWwocUFsbEpFbmQsIHcpLCB0YXdUaW1lc1dUKSk7XG4gICAgICAgICAgICAgICAgICAgIHEgPSBjb25jYXQoW3NsaWNlKHEsIFswLCAwXSwgW20sIGpdKSwgcVRpbWVzVGF1XSwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBbdywgciwgcV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRpc3Bvc2UoW3JUZW1wLCB3VGVtcCwgcVRlbXBdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZ1bGxNYXRyaWNlcyAmJiBtID4gbikge1xuICAgICAgICAgICAgcSA9IHNsaWNlKHEsIFswLCAwXSwgW20sIG5dKTtcbiAgICAgICAgICAgIHIgPSBzbGljZShyLCBbMCwgMF0sIFtuLCBuXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtxLCByXTtcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBxciA9IG9wKHsgcXJfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IExpblNwYWNlIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbi8qKlxuICogUmV0dXJuIGFuIGV2ZW5seSBzcGFjZWQgc2VxdWVuY2Ugb2YgbnVtYmVycyBvdmVyIHRoZSBnaXZlbiBpbnRlcnZhbC5cbiAqXG4gKiBgYGBqc1xuICogdGYubGluc3BhY2UoMCwgOSwgMTApLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSBzdGFydCBUaGUgc3RhcnQgdmFsdWUgb2YgdGhlIHNlcXVlbmNlLlxuICogQHBhcmFtIHN0b3AgVGhlIGVuZCB2YWx1ZSBvZiB0aGUgc2VxdWVuY2UuXG4gKiBAcGFyYW0gbnVtIFRoZSBudW1iZXIgb2YgdmFsdWVzIHRvIGdlbmVyYXRlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpbnNwYWNlKHN0YXJ0LCBzdG9wLCBudW0pIHtcbiAgICBpZiAobnVtIDw9IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgbnVtYmVyIG9mIHZhbHVlcyBzaG91bGQgYmUgcG9zaXRpdmUuJyk7XG4gICAgfVxuICAgIGNvbnN0IGF0dHJzID0geyBzdGFydCwgc3RvcCwgbnVtIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoTGluU3BhY2UsIHt9LCBhdHRycyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1saW5zcGFjZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTFJOIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbi8qKlxuICogTm9ybWFsaXplcyB0aGUgYWN0aXZhdGlvbiBvZiBhIGxvY2FsIG5laWdoYm9yaG9vZCBhY3Jvc3Mgb3Igd2l0aGluXG4gKiBjaGFubmVscy5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLiBUaGUgNC1EIGlucHV0IHRlbnNvciBpcyB0cmVhdGVkIGFzIGEgMy1EIGFycmF5XG4gKiAgICAgb2YgMUQgdmVjdG9ycyAoYWxvbmcgdGhlIGxhc3QgZGltZW5zaW9uKSwgYW5kIGVhY2ggdmVjdG9yIGlzXG4gKiAgICAgbm9ybWFsaXplZCBpbmRlcGVuZGVudGx5LlxuICogQHBhcmFtIGRlcHRoUmFkaXVzIFRoZSBudW1iZXIgb2YgYWRqYWNlbnQgY2hhbm5lbHMgaW4gdGhlIDFEIG5vcm1hbGl6YXRpb25cbiAqICAgICB3aW5kb3cuXG4gKiBAcGFyYW0gYmlhcyBBIGNvbnN0YW50IGJpYXMgdGVybSBmb3IgdGhlIGJhc2lzLlxuICogQHBhcmFtIGFscGhhIEEgc2NhbGUgZmFjdG9yLCB1c3VhbGx5IHBvc2l0aXZlLlxuICogQHBhcmFtIGJldGEgQW4gZXhwb25lbnQuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTm9ybWFsaXphdGlvbid9XG4gKi9cbmZ1bmN0aW9uIGxvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uXyh4LCBkZXB0aFJhZGl1cyA9IDUsIGJpYXMgPSAxLCBhbHBoYSA9IDEsIGJldGEgPSAwLjUpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdsb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbicpO1xuICAgIHV0aWwuYXNzZXJ0KCR4LnJhbmsgPT09IDQgfHwgJHgucmFuayA9PT0gMywgKCkgPT4gYEVycm9yIGluIGxvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uOiB4IG11c3QgYmUgcmFuayAzIG9yIDQgYnV0IGdvdFxuICAgICAgICAgICAgICAgcmFuayAkeyR4LnJhbmt9LmApO1xuICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNJbnQoZGVwdGhSYWRpdXMpLCAoKSA9PiBgRXJyb3IgaW4gbG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb246IGRlcHRoUmFkaXVzIG11c3QgYmUgYW4gYCArXG4gICAgICAgIGBpbnRlZ2VyIGJ1dCBnb3QgZGVwdGhSYWRpdXMgJHtkZXB0aFJhZGl1c30uYCk7XG4gICAgbGV0IHg0RCA9ICR4O1xuICAgIGxldCByZXNoYXBlZFRvNEQgPSBmYWxzZTtcbiAgICBpZiAoJHgucmFuayA9PT0gMykge1xuICAgICAgICByZXNoYXBlZFRvNEQgPSB0cnVlO1xuICAgICAgICB4NEQgPSByZXNoYXBlKCR4LCBbMSwgJHguc2hhcGVbMF0sICR4LnNoYXBlWzFdLCAkeC5zaGFwZVsyXV0pO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6IHg0RCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBkZXB0aFJhZGl1cywgYmlhcywgYWxwaGEsIGJldGEgfTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgY29uc3QgcmVzID0gRU5HSU5FLnJ1bktlcm5lbChMUk4sIGlucHV0cywgYXR0cnMpO1xuICAgIGlmIChyZXNoYXBlZFRvNEQpIHtcbiAgICAgICAgcmV0dXJuIHJlc2hhcGUocmVzLCBbcmVzLnNoYXBlWzFdLCByZXMuc2hhcGVbMl0sIHJlcy5zaGFwZVszXV0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG59XG5leHBvcnQgY29uc3QgbG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb24gPSBvcCh7IGxvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxvY2FsX3Jlc3BvbnNlX25vcm1hbGl6YXRpb24uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IExvZyB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIG5hdHVyYWwgbG9nYXJpdGhtIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6IGBsbih4KWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCBNYXRoLkVdKTtcbiAqXG4gKiB4LmxvZygpLnByaW50KCk7ICAvLyBvciB0Zi5sb2coeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gbG9nXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnbG9nJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKExvZywgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBsb2cgPSBvcCh7IGxvZ18gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sb2cuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IExvZzFwIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgbmF0dXJhbCBsb2dhcml0aG0gb2YgdGhlIGlucHV0IGB0Zi5UZW5zb3JgIHBsdXMgb25lXG4gKiBlbGVtZW50LXdpc2U6IGBsbigxICsgeClgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgTWF0aC5FIC0gMV0pO1xuICpcbiAqIHgubG9nMXAoKS5wcmludCgpOyAgLy8gb3IgdGYubG9nMXAoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gbG9nMXBfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdsb2cxcCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChMb2cxcCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBsb2cxcCA9IG9wKHsgbG9nMXBfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG9nMXAuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY3VzdG9tR3JhZCB9IGZyb20gJy4uL2dyYWRpZW50cyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi9tdWwnO1xuaW1wb3J0IHsgbmVnIH0gZnJvbSAnLi9uZWcnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyBzaWdtb2lkIH0gZnJvbSAnLi9zaWdtb2lkJztcbmltcG9ydCB7IHNvZnRwbHVzIH0gZnJvbSAnLi9zb2Z0cGx1cyc7XG4vKipcbiAqIENvbXB1dGVzIGxvZyBzaWdtb2lkIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6XG4gKiBgbG9nU2lnbW9pZCh4KWAuIEZvciBudW1lcmljYWwgc3RhYmlsaXR5LCB3ZSB1c2UgYC10Zi5zb2Z0cGx1cygteClgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzAsIDEsIC0xLCAuN10pO1xuICpcbiAqIHgubG9nU2lnbW9pZCgpLnByaW50KCk7ICAvLyBvciB0Zi5sb2dTaWdtb2lkKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGxvZ1NpZ21vaWRfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdsb2dTaWdtb2lkJyk7XG4gICAgLy8gVXNlIGEgY3VzdG9tIGdyYWRpZW50IHRvIG1haW50YWluIHByZXZpb3VzIGltcGxlbWVudGF0aW9uLlxuICAgIC8vIFRoZXJlIGlzIG5vIExvZ1NpZ21vaWQga2VybmVsIGluIFRGIHNvIHdlIGNhbid0IHVzZSBlbmdpbmUucnVuS2VybmVsXG4gICAgLy8gZGlyZWN0bHlcbiAgICBjb25zdCBjdXN0b21PcCA9IGN1c3RvbUdyYWQoKHgpID0+IHtcbiAgICAgICAgLy8gVE9ETyh5YXNzb2diYSkgd2UgY2FuIHJlbW92ZSB0aGUgY2hhaW5lZCBzb2Z0cGx1cyBjYWxsIGhlcmUgb25seVxuICAgICAgICAvLyBhZnRlciBiYWNrZW5kcyBoYXZlIG1vZHVhbHJpemVkIHNvZnRwbHVzIGF0IHdoaWNoIHBvaW50IHdlIGNhbiBjYWxsXG4gICAgICAgIC8vIGVuZ2luZSBydW5LZXJuZWwoLi4uLCBTb3RmcGx1cywgLi4uKSBkaXJlY3RseS5cbiAgICAgICAgY29uc3QgdmFsdWUgPSBuZWcoc29mdHBsdXMobmVnKHgpKSk7XG4gICAgICAgIGNvbnN0IGdyYWRGdW5jID0gKGR5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkZXJYID0gbXVsKGR5LCBzaWdtb2lkKG5lZyh4KSkpO1xuICAgICAgICAgICAgcmV0dXJuIGRlclg7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB7IHZhbHVlLCBncmFkRnVuYyB9O1xuICAgIH0pO1xuICAgIHJldHVybiBjdXN0b21PcCgkeCk7XG59XG5leHBvcnQgY29uc3QgbG9nU2lnbW9pZCA9IG9wKHsgbG9nU2lnbW9pZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sb2dfc2lnbW9pZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjdXN0b21HcmFkIH0gZnJvbSAnLi4vZ3JhZGllbnRzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBjYXN0IH0gZnJvbSAnLi9jYXN0JztcbmltcG9ydCB7IGV4cCB9IGZyb20gJy4vZXhwJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nJztcbmltcG9ydCB7IG1heCB9IGZyb20gJy4vbWF4JztcbmltcG9ydCB7IG11bCB9IGZyb20gJy4vbXVsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgc3ViIH0gZnJvbSAnLi9zdWInO1xuaW1wb3J0IHsgc3VtIH0gZnJvbSAnLi9zdW0nO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgbG9nIHNvZnRtYXguXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICpcbiAqIGEubG9nU29mdG1heCgpLnByaW50KCk7ICAvLyBvciB0Zi5sb2dTb2Z0bWF4KGEpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjJkKFsyLCA0LCA2LCAxLCAyLCAzXSwgWzIsIDNdKTtcbiAqXG4gKiBhLmxvZ1NvZnRtYXgoKS5wcmludCgpOyAgLy8gb3IgdGYubG9nU29mdG1heChhKVxuICogYGBgXG4gKlxuICogQHBhcmFtIGxvZ2l0cyBUaGUgbG9naXRzIGFycmF5LlxuICogQHBhcmFtIGF4aXMgVGhlIGRpbWVuc2lvbiBzb2Z0bWF4IHdvdWxkIGJlIHBlcmZvcm1lZCBvbi4gRGVmYXVsdHMgdG8gYC0xYFxuICogICAgIHdoaWNoIGluZGljYXRlcyB0aGUgbGFzdCBkaW1lbnNpb24uXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTm9ybWFsaXphdGlvbid9XG4gKi9cbmZ1bmN0aW9uIGxvZ1NvZnRtYXhfKGxvZ2l0cywgYXhpcyA9IC0xKSB7XG4gICAgY29uc3QgJGxvZ2l0cyA9IGNvbnZlcnRUb1RlbnNvcihsb2dpdHMsICdsb2dpdHMnLCAnbG9nU29mdG1heCcpO1xuICAgIGlmIChheGlzID09PSAtMSkge1xuICAgICAgICBheGlzID0gJGxvZ2l0cy5yYW5rIC0gMTtcbiAgICB9XG4gICAgaWYgKGF4aXMgIT09ICRsb2dpdHMucmFuayAtIDEpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJ0xvZyBTb2Z0bWF4IGFsb25nIGEgbm9uLWxhc3QgZGltZW5zaW9uIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiAnICtcbiAgICAgICAgICAgIGBMb2dpdHMgd2FzIHJhbmsgJHskbG9naXRzLnJhbmt9IGFuZCBheGlzIHdhcyAke2F4aXN9YCk7XG4gICAgfVxuICAgIC8vIGNvbnN0IGZvcndhcmQ6IEZvcndhcmRGdW5jPFRlbnNvcj4gPSAoYmFja2VuZCwgc2F2ZSkgPT4ge1xuICAgIC8vICAgY29uc3Qga2VlcERpbXMgPSB0cnVlO1xuICAgIC8vICAgY29uc3QgeE1heCA9IG1heChsb2dpdHMsIGF4aXMsIHRydWUpO1xuICAgIC8vICAgY29uc3Qgc2hpZnRlZCA9IHN1Yihsb2dpdHMsIHhNYXgpO1xuICAgIC8vICAgY29uc3QgdmFsdWUgPVxuICAgIC8vICAgICAgIHN1YihjYXN0KHNoaWZ0ZWQsICdmbG9hdDMyJyksIGxvZyhzdW0oZXhwKHNoaWZ0ZWQpLCBheGlzLFxuICAgIC8vICAgICAgIGtlZXBEaW1zKSkpO1xuICAgIC8vICAgc2F2ZShbdmFsdWVdKTtcbiAgICAvLyAgIHJldHVybiB2YWx1ZTtcbiAgICAvLyB9O1xuICAgIC8vIFVzZSBhIGN1c3RvbSBncmFkaWVudCBmb3IgbnVtZXJpY2FsIHN0YWJpbGl0eS5cbiAgICBjb25zdCBjdXN0b21PcCA9IGN1c3RvbUdyYWQoKGxvZ2l0cywgc2F2ZSkgPT4ge1xuICAgICAgICBjb25zdCBrZWVwRGltcyA9IHRydWU7XG4gICAgICAgIGNvbnN0IHhNYXggPSBtYXgobG9naXRzLCBheGlzLCB0cnVlKTtcbiAgICAgICAgY29uc3Qgc2hpZnRlZCA9IHN1Yihsb2dpdHMsIHhNYXgpO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHN1YihjYXN0KHNoaWZ0ZWQsICdmbG9hdDMyJyksIGxvZyhzdW0oZXhwKHNoaWZ0ZWQpLCBheGlzLCBrZWVwRGltcykpKTtcbiAgICAgICAgc2F2ZShbdmFsdWVdKTtcbiAgICAgICAgY29uc3QgZ3JhZEZ1bmMgPSAoZHksIHNhdmVkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBbdmFsdWVdID0gc2F2ZWQ7XG4gICAgICAgICAgICBjb25zdCBrZWVwRGltcyA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCBzb2Z0bWF4ID0gZXhwKHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiBzdWIoZHksIG11bChzdW0oZHksIGF4aXMsIGtlZXBEaW1zKSwgc29mdG1heCkpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4geyB2YWx1ZSwgZ3JhZEZ1bmMgfTtcbiAgICB9KTtcbiAgICByZXR1cm4gY3VzdG9tT3AoJGxvZ2l0cyk7XG4gICAgLy8gVE9ETyBVc2UgRW5naW5lLnJ1bktlcm5lbCB3aGVuIENQVS9XZWJHTC9XQVNNIGJhY2tlbmRzIGltcGxlbWVudCB0aGlzLlxuICAgIC8vIGNvbnN0IGlucHV0czogTG9nU29mdG1heElucHV0cyA9IHtsb2dpdHM6ICRsb2dpdHN9O1xuICAgIC8vIGNvbnN0IGF0dHJzOiBMb2dTb2Z0bWF4QXR0cnMgPSB7YXhpc307XG4gICAgLy8gcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgLy8gICAgICAgICAgICBMb2dTb2Z0bWF4LCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsXG4gICAgLy8gICAgICAgICAgICBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApO1xufVxuZXhwb3J0IGNvbnN0IGxvZ1NvZnRtYXggPSBvcCh7IGxvZ1NvZnRtYXhfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG9nX3NvZnRtYXguanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IHBhcnNlQXhpc1BhcmFtIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBhZGQgfSBmcm9tICcuL2FkZCc7XG5pbXBvcnQgeyBleHBhbmRTaGFwZVRvS2VlcERpbSB9IGZyb20gJy4vYXhpc191dGlsJztcbmltcG9ydCB7IGV4cCB9IGZyb20gJy4vZXhwJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nJztcbmltcG9ydCB7IG1heCB9IGZyb20gJy4vbWF4JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vcmVzaGFwZSc7XG5pbXBvcnQgeyBzdWIgfSBmcm9tICcuL3N1Yic7XG5pbXBvcnQgeyBzdW0gfSBmcm9tICcuL3N1bSc7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBsb2coc3VtKGV4cChlbGVtZW50cyBhY3Jvc3MgdGhlIHJlZHVjdGlvbiBkaW1lbnNpb25zKSkuXG4gKlxuICogUmVkdWNlcyB0aGUgaW5wdXQgYWxvbmcgdGhlIGRpbWVuc2lvbnMgZ2l2ZW4gaW4gYGF4aXNgLiBVbmxlc3MgYGtlZXBEaW1zYFxuICogaXMgdHJ1ZSwgdGhlIHJhbmsgb2YgdGhlIGFycmF5IGlzIHJlZHVjZWQgYnkgMSBmb3IgZWFjaCBlbnRyeSBpbiBgYXhpc2AuXG4gKiBJZiBga2VlcERpbXNgIGlzIHRydWUsIHRoZSByZWR1Y2VkIGRpbWVuc2lvbnMgYXJlIHJldGFpbmVkIHdpdGggbGVuZ3RoIDEuXG4gKiBJZiBgYXhpc2AgaGFzIG5vIGVudHJpZXMsIGFsbCBkaW1lbnNpb25zIGFyZSByZWR1Y2VkLCBhbmQgYW4gYXJyYXkgd2l0aCBhXG4gKiBzaW5nbGUgZWxlbWVudCBpcyByZXR1cm5lZC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKlxuICogeC5sb2dTdW1FeHAoKS5wcmludCgpOyAgLy8gb3IgdGYubG9nU3VtRXhwKHgpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjJkKFsxLCAyLCAzLCA0XSwgWzIsIDJdKTtcbiAqXG4gKiBjb25zdCBheGlzID0gMTtcbiAqIHgubG9nU3VtRXhwKGF4aXMpLnByaW50KCk7ICAvLyBvciB0Zi5sb2dTdW1FeHAoYSwgYXhpcylcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBheGlzIFRoZSBkaW1lbnNpb24ocykgdG8gcmVkdWNlLiBJZiBudWxsICh0aGUgZGVmYXVsdCksXG4gKiAgICAgcmVkdWNlcyBhbGwgZGltZW5zaW9ucy5cbiAqIEBwYXJhbSBrZWVwRGltcyBJZiB0cnVlLCByZXRhaW5zIHJlZHVjZWQgZGltZW5zaW9ucyB3aXRoIGxlbmd0aFxuICogICAgIG9mIDEuIERlZmF1bHRzIHRvIGZhbHNlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1JlZHVjdGlvbid9XG4gKi9cbmZ1bmN0aW9uIGxvZ1N1bUV4cF8oeCwgYXhpcyA9IG51bGwsIGtlZXBEaW1zID0gZmFsc2UpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdsb2dTdW1FeHAnKTtcbiAgICBjb25zdCBheGVzID0gcGFyc2VBeGlzUGFyYW0oYXhpcywgJHguc2hhcGUpO1xuICAgIGNvbnN0IHhNYXggPSBtYXgoJHgsIGF4ZXMsIHRydWUgLyoga2VlcERpbXMgKi8pO1xuICAgIGNvbnN0IGEgPSBzdWIoJHgsIHhNYXgpO1xuICAgIGNvbnN0IGIgPSBleHAoYSk7XG4gICAgY29uc3QgYyA9IHN1bShiLCBheGVzKTtcbiAgICBjb25zdCBkID0gbG9nKGMpO1xuICAgIGNvbnN0IHJlcyA9IGFkZChyZXNoYXBlKHhNYXgsIGQuc2hhcGUpLCBkKTtcbiAgICBpZiAoa2VlcERpbXMpIHtcbiAgICAgICAgY29uc3QgbmV3U2hhcGUgPSBleHBhbmRTaGFwZVRvS2VlcERpbShyZXMuc2hhcGUsIGF4ZXMpO1xuICAgICAgICByZXR1cm4gcmVzaGFwZShyZXMsIG5ld1NoYXBlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydCBjb25zdCBsb2dTdW1FeHAgPSBvcCh7IGxvZ1N1bUV4cF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sb2dfc3VtX2V4cC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTG9naWNhbEFuZCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUgfSBmcm9tICcuL2Jyb2FkY2FzdF91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSB0cnV0aCB2YWx1ZSBvZiBgYSBBTkQgYmAgZWxlbWVudC13aXNlLiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbZmFsc2UsIGZhbHNlLCB0cnVlLCB0cnVlXSwgJ2Jvb2wnKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbZmFsc2UsIHRydWUsIGZhbHNlLCB0cnVlXSwgJ2Jvb2wnKTtcbiAqXG4gKiBhLmxvZ2ljYWxBbmQoYikucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBpbnB1dCB0ZW5zb3IuIE11c3QgYmUgb2YgZHR5cGUgYm9vbC5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgaW5wdXQgdGVuc29yLiBNdXN0IGJlIG9mIGR0eXBlIGJvb2wuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTG9naWNhbCd9XG4gKi9cbmZ1bmN0aW9uIGxvZ2ljYWxBbmRfKGEsIGIpIHtcbiAgICBjb25zdCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdsb2dpY2FsQW5kJywgJ2Jvb2wnKTtcbiAgICBjb25zdCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdsb2dpY2FsQW5kJywgJ2Jvb2wnKTtcbiAgICBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSgkYS5zaGFwZSwgJGIuc2hhcGUpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgYTogJGEsIGI6ICRiIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoTG9naWNhbEFuZCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBsb2dpY2FsQW5kID0gb3AoeyBsb2dpY2FsQW5kXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxvZ2ljYWxfYW5kLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBMb2dpY2FsTm90IH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV0dXJucyB0aGUgdHJ1dGggdmFsdWUgb2YgYE5PVCB4YCBlbGVtZW50LXdpc2UuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbZmFsc2UsIHRydWVdLCAnYm9vbCcpO1xuICpcbiAqIGEubG9naWNhbE5vdCgpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLiBNdXN0IGJlIG9mIGR0eXBlICdib29sJy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdMb2dpY2FsJ31cbiAqL1xuZnVuY3Rpb24gbG9naWNhbE5vdF8oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2xvZ2ljYWxOb3QnLCAnYm9vbCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChMb2dpY2FsTm90LCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGxvZ2ljYWxOb3QgPSBvcCh7IGxvZ2ljYWxOb3RfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG9naWNhbF9ub3QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IExvZ2ljYWxPciB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUgfSBmcm9tICcuL2Jyb2FkY2FzdF91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSB0cnV0aCB2YWx1ZSBvZiBgYSBPUiBiYCBlbGVtZW50LXdpc2UuIFN1cHBvcnRzIGJyb2FkY2FzdGluZy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFtmYWxzZSwgZmFsc2UsIHRydWUsIHRydWVdLCAnYm9vbCcpO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFtmYWxzZSwgdHJ1ZSwgZmFsc2UsIHRydWVdLCAnYm9vbCcpO1xuICpcbiAqIGEubG9naWNhbE9yKGIpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBpbnB1dCB0ZW5zb3IuIE11c3QgYmUgb2YgZHR5cGUgYm9vbC5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgaW5wdXQgdGVuc29yLiBNdXN0IGJlIG9mIGR0eXBlIGJvb2wuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTG9naWNhbCd9XG4gKi9cbmZ1bmN0aW9uIGxvZ2ljYWxPcl8oYSwgYikge1xuICAgIGNvbnN0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ2xvZ2ljYWxPcicsICdib29sJyk7XG4gICAgY29uc3QgJGIgPSBjb252ZXJ0VG9UZW5zb3IoYiwgJ2InLCAnbG9naWNhbE9yJywgJ2Jvb2wnKTtcbiAgICBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSgkYS5zaGFwZSwgJGIuc2hhcGUpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgYTogJGEsIGI6ICRiIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoTG9naWNhbE9yLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGxvZ2ljYWxPciA9IG9wKHsgbG9naWNhbE9yXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxvZ2ljYWxfb3IuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlIH0gZnJvbSAnLi9icm9hZGNhc3RfdXRpbCc7XG5pbXBvcnQgeyBsb2dpY2FsQW5kIH0gZnJvbSAnLi9sb2dpY2FsX2FuZCc7XG5pbXBvcnQgeyBsb2dpY2FsTm90IH0gZnJvbSAnLi9sb2dpY2FsX25vdCc7XG5pbXBvcnQgeyBsb2dpY2FsT3IgfSBmcm9tICcuL2xvZ2ljYWxfb3InO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIFJldHVybnMgdGhlIHRydXRoIHZhbHVlIG9mIGBhIFhPUiBiYCBlbGVtZW50LXdpc2UuIFN1cHBvcnRzIGJyb2FkY2FzdGluZy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFtmYWxzZSwgZmFsc2UsIHRydWUsIHRydWVdLCAnYm9vbCcpO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFtmYWxzZSwgdHJ1ZSwgZmFsc2UsIHRydWVdLCAnYm9vbCcpO1xuICpcbiAqIGEubG9naWNhbFhvcihiKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGEgVGhlIGZpcnN0IGlucHV0IHRlbnNvci4gTXVzdCBiZSBvZiBkdHlwZSBib29sLlxuICogQHBhcmFtIGIgVGhlIHNlY29uZCBpbnB1dCB0ZW5zb3IuIE11c3QgYmUgb2YgZHR5cGUgYm9vbC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdMb2dpY2FsJ31cbiAqL1xuZnVuY3Rpb24gbG9naWNhbFhvcl8oYSwgYikge1xuICAgIGNvbnN0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ2xvZ2ljYWxYb3InLCAnYm9vbCcpO1xuICAgIGNvbnN0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ2xvZ2ljYWxYb3InLCAnYm9vbCcpO1xuICAgIGFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKCRhLnNoYXBlLCAkYi5zaGFwZSk7XG4gICAgLy8geCBeIHkgPSAoeCB8IHkpICYgfih4ICYgeSlcbiAgICByZXR1cm4gbG9naWNhbEFuZChsb2dpY2FsT3IoYSwgYiksIGxvZ2ljYWxOb3QobG9naWNhbEFuZChhLCBiKSkpO1xufVxuZXhwb3J0IGNvbnN0IGxvZ2ljYWxYb3IgPSBvcCh7IGxvZ2ljYWxYb3JfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG9naWNhbF94b3IuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuZXhwb3J0IHZhciBSZWR1Y3Rpb247XG4oZnVuY3Rpb24gKFJlZHVjdGlvbikge1xuICAgIFJlZHVjdGlvbltSZWR1Y3Rpb25bXCJOT05FXCJdID0gMF0gPSBcIk5PTkVcIjtcbiAgICBSZWR1Y3Rpb25bUmVkdWN0aW9uW1wiTUVBTlwiXSA9IDFdID0gXCJNRUFOXCI7XG4gICAgUmVkdWN0aW9uW1JlZHVjdGlvbltcIlNVTVwiXSA9IDJdID0gXCJTVU1cIjtcbiAgICBSZWR1Y3Rpb25bUmVkdWN0aW9uW1wiU1VNX0JZX05PTlpFUk9fV0VJR0hUU1wiXSA9IDNdID0gXCJTVU1fQllfTk9OWkVST19XRUlHSFRTXCI7XG59KShSZWR1Y3Rpb24gfHwgKFJlZHVjdGlvbiA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sb3NzX29wc191dGlscy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0U2hhcGVzTWF0Y2ggfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IGFicyB9IGZyb20gJy4uL2Ficyc7XG5pbXBvcnQgeyBSZWR1Y3Rpb24gfSBmcm9tICcuLi9sb3NzX29wc191dGlscyc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4uL29wZXJhdGlvbic7XG5pbXBvcnQgeyBzdWIgfSBmcm9tICcuLi9zdWInO1xuaW1wb3J0IHsgY29tcHV0ZVdlaWdodGVkTG9zcyB9IGZyb20gJy4vY29tcHV0ZV93ZWlnaHRlZF9sb3NzJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIGFic29sdXRlIGRpZmZlcmVuY2UgbG9zcyBiZXR3ZWVuIHR3byB0ZW5zb3JzLlxuICpcbiAqIEBwYXJhbSBsYWJlbHMgVGhlIGdyb3VuZCB0cnV0aCBvdXRwdXQgdGVuc29yLCBzYW1lIGRpbWVuc2lvbnMgYXNcbiAqICAgICdwcmVkaWN0aW9ucycuXG4gKiBAcGFyYW0gcHJlZGljdGlvbnMgVGhlIHByZWRpY3RlZCBvdXRwdXRzLlxuICogQHBhcmFtIHdlaWdodHMgVGVuc29yIHdob3NlIHJhbmsgaXMgZWl0aGVyIDAsIG9yIHRoZSBzYW1lIHJhbmsgYXNcbiAqICAgIGBsYWJlbHNgLCBhbmQgbXVzdCBiZSBicm9hZGNhc3RhYmxlIHRvIGBsYWJlbHNgIChpLmUuLCBhbGwgZGltZW5zaW9uc1xuICogICAgbXVzdCBiZSBlaXRoZXIgYDFgLCBvciB0aGUgc2FtZSBhcyB0aGUgY29ycmVzcG9uZGluZyBgbG9zc2VzYFxuICogICAgZGltZW5zaW9uKS5cbiAqIEBwYXJhbSByZWR1Y3Rpb24gVHlwZSBvZiByZWR1Y3Rpb24gdG8gYXBwbHkgdG8gbG9zcy4gU2hvdWxkIGJlIG9mIHR5cGVcbiAqICAgIGBSZWR1Y3Rpb25gXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0xvc3NlcycsIG5hbWVzcGFjZTogJ2xvc3Nlcyd9XG4gKi9cbmZ1bmN0aW9uIGFic29sdXRlRGlmZmVyZW5jZV8obGFiZWxzLCBwcmVkaWN0aW9ucywgd2VpZ2h0cywgcmVkdWN0aW9uID0gUmVkdWN0aW9uLlNVTV9CWV9OT05aRVJPX1dFSUdIVFMpIHtcbiAgICBjb25zdCAkbGFiZWxzID0gY29udmVydFRvVGVuc29yKGxhYmVscywgJ2xhYmVscycsICdhYnNvbHV0ZURpZmZlcmVuY2UnKTtcbiAgICBjb25zdCAkcHJlZGljdGlvbnMgPSBjb252ZXJ0VG9UZW5zb3IocHJlZGljdGlvbnMsICdwcmVkaWN0aW9ucycsICdhYnNvbHV0ZURpZmZlcmVuY2UnKTtcbiAgICBsZXQgJHdlaWdodHMgPSBudWxsO1xuICAgIGlmICh3ZWlnaHRzICE9IG51bGwpIHtcbiAgICAgICAgJHdlaWdodHMgPSBjb252ZXJ0VG9UZW5zb3Iod2VpZ2h0cywgJ3dlaWdodHMnLCAnYWJzb2x1dGVEaWZmZXJlbmNlJyk7XG4gICAgfVxuICAgIGFzc2VydFNoYXBlc01hdGNoKCRsYWJlbHMuc2hhcGUsICRwcmVkaWN0aW9ucy5zaGFwZSwgJ0Vycm9yIGluIGFic29sdXRlRGlmZmVyZW5jZTogJyk7XG4gICAgY29uc3QgbG9zc2VzID0gYWJzKHN1YigkbGFiZWxzLCAkcHJlZGljdGlvbnMpKTtcbiAgICByZXR1cm4gY29tcHV0ZVdlaWdodGVkTG9zcyhsb3NzZXMsICR3ZWlnaHRzLCByZWR1Y3Rpb24pO1xufVxuZXhwb3J0IGNvbnN0IGFic29sdXRlRGlmZmVyZW5jZSA9IG9wKHsgYWJzb2x1dGVEaWZmZXJlbmNlXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFic29sdXRlX2RpZmZlcmVuY2UuanMubWFwIiwiaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGNhc3QgfSBmcm9tICcuLi9jYXN0JztcbmltcG9ydCB7IGRpdiB9IGZyb20gJy4uL2Rpdic7XG5pbXBvcnQgeyBSZWR1Y3Rpb24gfSBmcm9tICcuLi9sb3NzX29wc191dGlscyc7XG5pbXBvcnQgeyBtZWFuIH0gZnJvbSAnLi4vbWVhbic7XG5pbXBvcnQgeyBtdWwgfSBmcm9tICcuLi9tdWwnO1xuaW1wb3J0IHsgbm90RXF1YWwgfSBmcm9tICcuLi9ub3RfZXF1YWwnO1xuaW1wb3J0IHsgb25lcyB9IGZyb20gJy4uL29uZXMnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgc2NhbGFyIH0gZnJvbSAnLi4vc2NhbGFyJztcbmltcG9ydCB7IHN1bSB9IGZyb20gJy4uL3N1bSc7XG4vKipcbiAqIENvbXB1dGVzIHRoZSB3ZWlnaHRlZCBsb3NzIGJldHdlZW4gdHdvIHRlbnNvcnMuXG4gKlxuICogQHBhcmFtIGxvc3NlcyBUZW5zb3Igb2Ygc2hhcGUgYFtiYXRjaF9zaXplLCBkMSwgLi4uIGROXWAuXG4gKiBAcGFyYW0gd2VpZ2h0cyBUZW5zb3Igd2hvc2UgcmFuayBpcyBlaXRoZXIgMCwgb3IgdGhlIHNhbWUgcmFuayBhc1xuICogICAgYGxvc3Nlc2AsIGFuZCBtdXN0IGJlIGJyb2FkY2FzdGFibGUgdG8gYGxvc3Nlc2AgKGkuZS4sIGFsbFxuICogICAgZGltZW5zaW9ucyBtdXN0IGJlIGVpdGhlciBgMWAsIG9yIHRoZSBzYW1lIGFzIHRoZSBjb3JyZXNwb25kaW5nXG4gKiAgICBgbG9zc2VzYCBkaW1lbnNpb24pLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdMb3NzZXMnLCBuYW1lc3BhY2U6ICdsb3NzZXMnfVxuICovXG5mdW5jdGlvbiBjb21wdXRlV2VpZ2h0ZWRMb3NzXyhsb3NzZXMsIHdlaWdodHMsIHJlZHVjdGlvbiA9IFJlZHVjdGlvbi5TVU1fQllfTk9OWkVST19XRUlHSFRTKSB7XG4gICAgY29uc3QgJGxvc3NlcyA9IGNvbnZlcnRUb1RlbnNvcihsb3NzZXMsICdsb3NzZXMnLCAnY29tcHV0ZVdlaWdodGVkTG9zcycpO1xuICAgIGxldCAkd2VpZ2h0cyA9IG51bGw7XG4gICAgaWYgKHdlaWdodHMgIT0gbnVsbCkge1xuICAgICAgICAkd2VpZ2h0cyA9IGNvbnZlcnRUb1RlbnNvcih3ZWlnaHRzLCAnd2VpZ2h0cycsICdjb21wdXRlV2VpZ2h0ZWRMb3NzJyk7XG4gICAgfVxuICAgIGNvbnN0IHdlaWdodGVkTG9zcyA9ICgkd2VpZ2h0cyA9PSBudWxsKSA/ICRsb3NzZXMgOiBtdWwoJGxvc3NlcywgJHdlaWdodHMpO1xuICAgIGlmIChyZWR1Y3Rpb24gPT09IFJlZHVjdGlvbi5OT05FKSB7XG4gICAgICAgIHJldHVybiB3ZWlnaHRlZExvc3M7XG4gICAgfVxuICAgIGlmIChyZWR1Y3Rpb24gPT09IFJlZHVjdGlvbi5TVU0pIHtcbiAgICAgICAgcmV0dXJuIHN1bSh3ZWlnaHRlZExvc3MpO1xuICAgIH1cbiAgICBpZiAocmVkdWN0aW9uID09PSBSZWR1Y3Rpb24uTUVBTikge1xuICAgICAgICBpZiAoJHdlaWdodHMgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG1lYW4od2VpZ2h0ZWRMb3NzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGJyb2FkY2FzdEZhY3RvciA9ICRsb3NzZXMuc2l6ZSAvICR3ZWlnaHRzLnNpemU7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBkaXYoc3VtKHdlaWdodGVkTG9zcyksIHN1bSgkd2VpZ2h0cykpO1xuICAgICAgICAgICAgcmV0dXJuIGJyb2FkY2FzdEZhY3RvciA+IDEgPyBkaXYocmVzdWx0LCBzY2FsYXIoYnJvYWRjYXN0RmFjdG9yKSkgOlxuICAgICAgICAgICAgICAgIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVkdWN0aW9uID09PSBSZWR1Y3Rpb24uU1VNX0JZX05PTlpFUk9fV0VJR0hUUykge1xuICAgICAgICBpZiAoJHdlaWdodHMgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGRpdihzdW0od2VpZ2h0ZWRMb3NzKSwgc2NhbGFyKCRsb3NzZXMuc2l6ZSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgYnJvYWRjYXN0ZWRXZWlnaHRzID0gbXVsKCR3ZWlnaHRzLCBvbmVzKCRsb3NzZXMuc2hhcGUpKTtcbiAgICAgICAgICAgIGNvbnN0IG51bU5vblplcm9zID0gY2FzdChzdW0obm90RXF1YWwoYnJvYWRjYXN0ZWRXZWlnaHRzLCBzY2FsYXIoMCkpKSwgJ2Zsb2F0MzInKTtcbiAgICAgICAgICAgIHJldHVybiBkaXYoc3VtKHdlaWdodGVkTG9zcyksIG51bU5vblplcm9zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBFcnJvcihgVW5rbm93biByZWR1Y3Rpb246ICR7cmVkdWN0aW9ufWApO1xufVxuZXhwb3J0IGNvbnN0IGNvbXB1dGVXZWlnaHRlZExvc3MgPSBvcCh7IGNvbXB1dGVXZWlnaHRlZExvc3NfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29tcHV0ZV93ZWlnaHRlZF9sb3NzLmpzLm1hcCIsImltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnRTaGFwZXNNYXRjaCB9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHsgUmVkdWN0aW9uIH0gZnJvbSAnLi4vbG9zc19vcHNfdXRpbHMnO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi4vbXVsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHNjYWxhciB9IGZyb20gJy4uL3NjYWxhcic7XG5pbXBvcnQgeyBzdWIgfSBmcm9tICcuLi9zdWInO1xuaW1wb3J0IHsgc3VtIH0gZnJvbSAnLi4vc3VtJztcbmltcG9ydCB7IGNvbXB1dGVXZWlnaHRlZExvc3MgfSBmcm9tICcuL2NvbXB1dGVfd2VpZ2h0ZWRfbG9zcyc7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBjb3NpbmUgZGlzdGFuY2UgbG9zcyBiZXR3ZWVuIHR3byB0ZW5zb3JzLlxuICpcbiAqIEBwYXJhbSBsYWJlbHMgVGhlIGdyb3VuZCB0cnV0aCBvdXRwdXQgdGVuc29yLCBzYW1lIGRpbWVuc2lvbnMgYXNcbiAqICAgICdwcmVkaWN0aW9ucycuXG4gKiBAcGFyYW0gcHJlZGljdGlvbnMgVGhlIHByZWRpY3RlZCBvdXRwdXRzLlxuICogQHBhcmFtIGF4aXMgVGhlIGRpbWVuc2lvbiBhbG9uZyB3aGljaCB0aGUgY29zaW5lIGRpc3RhbmNlIGlzIGNvbXB1dGVkLlxuICogQHBhcmFtIHdlaWdodHMgVGVuc29yIHdob3NlIHJhbmsgaXMgZWl0aGVyIDAsIG9yIHRoZSBzYW1lIHJhbmsgYXNcbiAqICAgIGBsYWJlbHNgLCBhbmQgbXVzdCBiZSBicm9hZGNhc3RhYmxlIHRvIGBsYWJlbHNgIChpLmUuLCBhbGwgZGltZW5zaW9uc1xuICogICAgbXVzdCBiZSBlaXRoZXIgYDFgLCBvciB0aGUgc2FtZSBhcyB0aGUgY29ycmVzcG9uZGluZyBgbG9zc2VzYFxuICogICAgZGltZW5zaW9uKS5cbiAqIEBwYXJhbSByZWR1Y3Rpb24gVHlwZSBvZiByZWR1Y3Rpb24gdG8gYXBwbHkgdG8gbG9zcy4gU2hvdWxkIGJlIG9mIHR5cGVcbiAqICAgIGBSZWR1Y3Rpb25gXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0xvc3NlcycsIG5hbWVzcGFjZTogJ2xvc3Nlcyd9XG4gKi9cbmZ1bmN0aW9uIGNvc2luZURpc3RhbmNlXyhsYWJlbHMsIHByZWRpY3Rpb25zLCBheGlzLCB3ZWlnaHRzLCByZWR1Y3Rpb24gPSBSZWR1Y3Rpb24uU1VNX0JZX05PTlpFUk9fV0VJR0hUUykge1xuICAgIGNvbnN0ICRsYWJlbHMgPSBjb252ZXJ0VG9UZW5zb3IobGFiZWxzLCAnbGFiZWxzJywgJ2Nvc2luZURpc3RhbmNlJyk7XG4gICAgY29uc3QgJHByZWRpY3Rpb25zID0gY29udmVydFRvVGVuc29yKHByZWRpY3Rpb25zLCAncHJlZGljdGlvbnMnLCAnY29zaW5lRGlzdGFuY2UnKTtcbiAgICBsZXQgJHdlaWdodHMgPSBudWxsO1xuICAgIGlmICh3ZWlnaHRzICE9IG51bGwpIHtcbiAgICAgICAgJHdlaWdodHMgPSBjb252ZXJ0VG9UZW5zb3Iod2VpZ2h0cywgJ3dlaWdodHMnLCAnY29zaW5lRGlzdGFuY2UnKTtcbiAgICB9XG4gICAgYXNzZXJ0U2hhcGVzTWF0Y2goJGxhYmVscy5zaGFwZSwgJHByZWRpY3Rpb25zLnNoYXBlLCAnRXJyb3IgaW4gY29zaW5lRGlzdGFuY2U6ICcpO1xuICAgIGNvbnN0IG9uZSA9IHNjYWxhcigxKTtcbiAgICBjb25zdCBsb3NzZXMgPSBzdWIob25lLCBzdW0obXVsKCRsYWJlbHMsICRwcmVkaWN0aW9ucyksIGF4aXMsIHRydWUpKTtcbiAgICByZXR1cm4gY29tcHV0ZVdlaWdodGVkTG9zcyhsb3NzZXMsICR3ZWlnaHRzLCByZWR1Y3Rpb24pO1xufVxuZXhwb3J0IGNvbnN0IGNvc2luZURpc3RhbmNlID0gb3AoeyBjb3NpbmVEaXN0YW5jZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb3NpbmVfZGlzdGFuY2UuanMubWFwIiwiaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGFzc2VydFNoYXBlc01hdGNoIH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgeyBSZWR1Y3Rpb24gfSBmcm9tICcuLi9sb3NzX29wc191dGlscyc7XG5pbXBvcnQgeyBtdWwgfSBmcm9tICcuLi9tdWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVsdSB9IGZyb20gJy4uL3JlbHUnO1xuaW1wb3J0IHsgc2NhbGFyIH0gZnJvbSAnLi4vc2NhbGFyJztcbmltcG9ydCB7IHN1YiB9IGZyb20gJy4uL3N1Yic7XG5pbXBvcnQgeyBjb21wdXRlV2VpZ2h0ZWRMb3NzIH0gZnJvbSAnLi9jb21wdXRlX3dlaWdodGVkX2xvc3MnO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgSGluZ2UgbG9zcyBiZXR3ZWVuIHR3byB0ZW5zb3JzLlxuICpcbiAqIEBwYXJhbSBsYWJlbHMgVGhlIGdyb3VuZCB0cnV0aCBvdXRwdXQgdGVuc29yLCBzYW1lIGRpbWVuc2lvbnMgYXNcbiAqICAgICdwcmVkaWN0aW9ucycuXG4gKiBAcGFyYW0gcHJlZGljdGlvbnMgVGhlIHByZWRpY3RlZCBvdXRwdXRzLlxuICogQHBhcmFtIHdlaWdodHMgVGVuc29yIHdob3NlIHJhbmsgaXMgZWl0aGVyIDAsIG9yIHRoZSBzYW1lIHJhbmsgYXNcbiAqICAgIGBsYWJlbHNgLCBhbmQgbXVzdCBiZSBicm9hZGNhc3RhYmxlIHRvIGBsYWJlbHNgIChpLmUuLCBhbGwgZGltZW5zaW9uc1xuICogICAgbXVzdCBiZSBlaXRoZXIgYDFgLCBvciB0aGUgc2FtZSBhcyB0aGUgY29ycmVzcG9uZGluZyBgbG9zc2VzYFxuICogICAgZGltZW5zaW9uKS5cbiAqIEBwYXJhbSByZWR1Y3Rpb24gVHlwZSBvZiByZWR1Y3Rpb24gdG8gYXBwbHkgdG8gbG9zcy4gU2hvdWxkIGJlIG9mIHR5cGVcbiAqICAgIGBSZWR1Y3Rpb25gXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0xvc3NlcycsIG5hbWVzcGFjZTogJ2xvc3Nlcyd9XG4gKi9cbmZ1bmN0aW9uIGhpbmdlTG9zc18obGFiZWxzLCBwcmVkaWN0aW9ucywgd2VpZ2h0cywgcmVkdWN0aW9uID0gUmVkdWN0aW9uLlNVTV9CWV9OT05aRVJPX1dFSUdIVFMpIHtcbiAgICBsZXQgJGxhYmVscyA9IGNvbnZlcnRUb1RlbnNvcihsYWJlbHMsICdsYWJlbHMnLCAnaGluZ2VMb3NzJyk7XG4gICAgY29uc3QgJHByZWRpY3Rpb25zID0gY29udmVydFRvVGVuc29yKHByZWRpY3Rpb25zLCAncHJlZGljdGlvbnMnLCAnaGluZ2VMb3NzJyk7XG4gICAgbGV0ICR3ZWlnaHRzID0gbnVsbDtcbiAgICBpZiAod2VpZ2h0cyAhPSBudWxsKSB7XG4gICAgICAgICR3ZWlnaHRzID0gY29udmVydFRvVGVuc29yKHdlaWdodHMsICd3ZWlnaHRzJywgJ2hpbmdlTG9zcycpO1xuICAgIH1cbiAgICBhc3NlcnRTaGFwZXNNYXRjaCgkbGFiZWxzLnNoYXBlLCAkcHJlZGljdGlvbnMuc2hhcGUsICdFcnJvciBpbiBoaW5nZUxvc3M6ICcpO1xuICAgIGNvbnN0IG9uZSA9IHNjYWxhcigxKTtcbiAgICAvLyBDb252ZXJ0IGJpbmFyeSBsYWJlbHMgdG8gKC0xLCAxKVxuICAgICRsYWJlbHMgPSBzdWIobXVsKHNjYWxhcigyKSwgJGxhYmVscyksIG9uZSk7XG4gICAgY29uc3QgbG9zc2VzID0gcmVsdShzdWIob25lLCBtdWwoJGxhYmVscywgJHByZWRpY3Rpb25zKSkpO1xuICAgIHJldHVybiBjb21wdXRlV2VpZ2h0ZWRMb3NzKGxvc3NlcywgJHdlaWdodHMsIHJlZHVjdGlvbik7XG59XG5leHBvcnQgY29uc3QgaGluZ2VMb3NzID0gb3AoeyBoaW5nZUxvc3NfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGluZ2VfbG9zcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0U2hhcGVzTWF0Y2ggfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IGFicyB9IGZyb20gJy4uL2Ficyc7XG5pbXBvcnQgeyBhZGQgfSBmcm9tICcuLi9hZGQnO1xuaW1wb3J0IHsgUmVkdWN0aW9uIH0gZnJvbSAnLi4vbG9zc19vcHNfdXRpbHMnO1xuaW1wb3J0IHsgbWluaW11bSB9IGZyb20gJy4uL21pbmltdW0nO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi4vbXVsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHNjYWxhciB9IGZyb20gJy4uL3NjYWxhcic7XG5pbXBvcnQgeyBzcXVhcmUgfSBmcm9tICcuLi9zcXVhcmUnO1xuaW1wb3J0IHsgc3ViIH0gZnJvbSAnLi4vc3ViJztcbmltcG9ydCB7IGNvbXB1dGVXZWlnaHRlZExvc3MgfSBmcm9tICcuL2NvbXB1dGVfd2VpZ2h0ZWRfbG9zcyc7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBodWJlciBsb3NzIGJldHdlZW4gdHdvIHRlbnNvcnMuXG4gKlxuICogQHBhcmFtIGxhYmVscyBUaGUgZ3JvdW5kIHRydXRoIG91dHB1dCB0ZW5zb3IsIHNhbWUgZGltZW5zaW9ucyBhc1xuICogICAgJ3ByZWRpY3Rpb25zJy5cbiAqIEBwYXJhbSBwcmVkaWN0aW9ucyBUaGUgcHJlZGljdGVkIG91dHB1dHMuXG4gKiBAcGFyYW0gd2VpZ2h0cyBUZW5zb3Igd2hvc2UgcmFuayBpcyBlaXRoZXIgMCwgb3IgdGhlIHNhbWUgcmFuayBhc1xuICogICAgYGxhYmVsc2AsIGFuZCBtdXN0IGJlIGJyb2FkY2FzdGFibGUgdG8gYGxhYmVsc2AgKGkuZS4sIGFsbCBkaW1lbnNpb25zXG4gKiAgICBtdXN0IGJlIGVpdGhlciBgMWAsIG9yIHRoZSBzYW1lIGFzIHRoZSBjb3JyZXNwb25kaW5nIGBsb3NzZXNgXG4gKiAgICBkaW1lbnNpb24pLlxuICogQHBhcmFtIGRlbHRhIFBvaW50IHdoZXJlIGh1YmVyIGxvc3MgY2hhbmdlcyBmcm9tIHF1YWRyYXRpYyB0byBsaW5lYXIuXG4gKiBAcGFyYW0gcmVkdWN0aW9uIFR5cGUgb2YgcmVkdWN0aW9uIHRvIGFwcGx5IHRvIGxvc3MuIFNob3VsZCBiZSBvZiB0eXBlXG4gKiAgICBgUmVkdWN0aW9uYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVHJhaW5pbmcnLCBzdWJoZWFkaW5nOiAnTG9zc2VzJywgbmFtZXNwYWNlOiAnbG9zc2VzJ31cbiAqL1xuZnVuY3Rpb24gaHViZXJMb3NzXyhsYWJlbHMsIHByZWRpY3Rpb25zLCB3ZWlnaHRzLCBkZWx0YSA9IDEuMCwgcmVkdWN0aW9uID0gUmVkdWN0aW9uLlNVTV9CWV9OT05aRVJPX1dFSUdIVFMpIHtcbiAgICBjb25zdCAkbGFiZWxzID0gY29udmVydFRvVGVuc29yKGxhYmVscywgJ2xhYmVscycsICdodWJlckxvc3MnKTtcbiAgICBjb25zdCAkcHJlZGljdGlvbnMgPSBjb252ZXJ0VG9UZW5zb3IocHJlZGljdGlvbnMsICdwcmVkaWN0aW9ucycsICdodWJlckxvc3MnKTtcbiAgICBsZXQgJHdlaWdodHMgPSBudWxsO1xuICAgIGlmICh3ZWlnaHRzICE9IG51bGwpIHtcbiAgICAgICAgJHdlaWdodHMgPSBjb252ZXJ0VG9UZW5zb3Iod2VpZ2h0cywgJ3dlaWdodHMnLCAnaHViZXJMb3NzJyk7XG4gICAgfVxuICAgIGFzc2VydFNoYXBlc01hdGNoKCRsYWJlbHMuc2hhcGUsICRwcmVkaWN0aW9ucy5zaGFwZSwgJ0Vycm9yIGluIGh1YmVyTG9zczogJyk7XG4gICAgY29uc3QgZGVsdGFTY2FsYXIgPSBzY2FsYXIoZGVsdGEpO1xuICAgIGNvbnN0IGVycm9yID0gYWJzKHN1YigkcHJlZGljdGlvbnMsICRsYWJlbHMpKTtcbiAgICBjb25zdCBxdWFkcmF0aWMgPSBtaW5pbXVtKGVycm9yLCBkZWx0YVNjYWxhcik7XG4gICAgY29uc3QgbGluZWFyID0gc3ViKGVycm9yLCBxdWFkcmF0aWMpO1xuICAgIGNvbnN0IGxvc3NlcyA9IGFkZChtdWwoc2NhbGFyKDAuNSksIHNxdWFyZShxdWFkcmF0aWMpKSwgbXVsKGRlbHRhU2NhbGFyLCBsaW5lYXIpKTtcbiAgICByZXR1cm4gY29tcHV0ZVdlaWdodGVkTG9zcyhsb3NzZXMsICR3ZWlnaHRzLCByZWR1Y3Rpb24pO1xufVxuZXhwb3J0IGNvbnN0IGh1YmVyTG9zcyA9IG9wKHsgaHViZXJMb3NzXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWh1YmVyX2xvc3MuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGFzc2VydFNoYXBlc01hdGNoIH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgeyBhZGQgfSBmcm9tICcuLi9hZGQnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi4vbG9nJztcbmltcG9ydCB7IFJlZHVjdGlvbiB9IGZyb20gJy4uL2xvc3Nfb3BzX3V0aWxzJztcbmltcG9ydCB7IG11bCB9IGZyb20gJy4uL211bCc7XG5pbXBvcnQgeyBuZWcgfSBmcm9tICcuLi9uZWcnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgc2NhbGFyIH0gZnJvbSAnLi4vc2NhbGFyJztcbmltcG9ydCB7IHN1YiB9IGZyb20gJy4uL3N1Yic7XG5pbXBvcnQgeyBjb21wdXRlV2VpZ2h0ZWRMb3NzIH0gZnJvbSAnLi9jb21wdXRlX3dlaWdodGVkX2xvc3MnO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgbG9nIGxvc3MgYmV0d2VlbiB0d28gdGVuc29ycy5cbiAqXG4gKiBAcGFyYW0gbGFiZWxzIFRoZSBncm91bmQgdHJ1dGggb3V0cHV0IHRlbnNvciwgc2FtZSBkaW1lbnNpb25zIGFzXG4gKiAgICAncHJlZGljdGlvbnMnLlxuICogQHBhcmFtIHByZWRpY3Rpb25zIFRoZSBwcmVkaWN0ZWQgb3V0cHV0cy5cbiAqIEBwYXJhbSB3ZWlnaHRzIFRlbnNvciB3aG9zZSByYW5rIGlzIGVpdGhlciAwLCBvciB0aGUgc2FtZSByYW5rIGFzXG4gKiAgICBgbGFiZWxzYCwgYW5kIG11c3QgYmUgYnJvYWRjYXN0YWJsZSB0byBgbGFiZWxzYCAoaS5lLiwgYWxsIGRpbWVuc2lvbnNcbiAqICAgIG11c3QgYmUgZWl0aGVyIGAxYCwgb3IgdGhlIHNhbWUgYXMgdGhlIGNvcnJlc3BvbmRpbmcgYGxvc3Nlc2BcbiAqICAgIGRpbWVuc2lvbikuXG4gKiBAcGFyYW0gZXBzaWxvbiBBIHNtYWxsIGluY3JlbWVudCB0byBhdm9pZCB0YWtpbmcgbG9nIG9mIHplcm9cbiAqIEBwYXJhbSByZWR1Y3Rpb24gVHlwZSBvZiByZWR1Y3Rpb24gdG8gYXBwbHkgdG8gbG9zcy4gU2hvdWxkIGJlIG9mIHR5cGVcbiAqICAgIGBSZWR1Y3Rpb25gXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0xvc3NlcycsIG5hbWVzcGFjZTogJ2xvc3Nlcyd9XG4gKi9cbmZ1bmN0aW9uIGxvZ0xvc3NfKGxhYmVscywgcHJlZGljdGlvbnMsIHdlaWdodHMsIGVwc2lsb24gPSAxZS03LCByZWR1Y3Rpb24gPSBSZWR1Y3Rpb24uU1VNX0JZX05PTlpFUk9fV0VJR0hUUykge1xuICAgIGNvbnN0ICRsYWJlbHMgPSBjb252ZXJ0VG9UZW5zb3IobGFiZWxzLCAnbGFiZWxzJywgJ2xvZ0xvc3MnKTtcbiAgICBjb25zdCAkcHJlZGljdGlvbnMgPSBjb252ZXJ0VG9UZW5zb3IocHJlZGljdGlvbnMsICdwcmVkaWN0aW9ucycsICdsb2dMb3NzJyk7XG4gICAgbGV0ICR3ZWlnaHRzID0gbnVsbDtcbiAgICBpZiAod2VpZ2h0cyAhPSBudWxsKSB7XG4gICAgICAgICR3ZWlnaHRzID0gY29udmVydFRvVGVuc29yKHdlaWdodHMsICd3ZWlnaHRzJywgJ2xvZ0xvc3MnKTtcbiAgICB9XG4gICAgYXNzZXJ0U2hhcGVzTWF0Y2goJGxhYmVscy5zaGFwZSwgJHByZWRpY3Rpb25zLnNoYXBlLCAnRXJyb3IgaW4gbG9nTG9zczogJyk7XG4gICAgY29uc3Qgb25lID0gc2NhbGFyKDEpO1xuICAgIGNvbnN0IGVwc2lsb25TY2FsYXIgPSBzY2FsYXIoZXBzaWxvbik7XG4gICAgY29uc3QgbDEgPSBuZWcobXVsKCRsYWJlbHMsIGxvZyhhZGQoJHByZWRpY3Rpb25zLCBlcHNpbG9uU2NhbGFyKSkpKTtcbiAgICBjb25zdCBsMiA9IG11bChzdWIob25lLCAkbGFiZWxzKSwgbG9nKGFkZChzdWIob25lLCAkcHJlZGljdGlvbnMpLCBlcHNpbG9uU2NhbGFyKSkpO1xuICAgIGNvbnN0IGxvc3NlcyA9IHN1YihsMSwgbDIpO1xuICAgIHJldHVybiBjb21wdXRlV2VpZ2h0ZWRMb3NzKGxvc3NlcywgJHdlaWdodHMsIHJlZHVjdGlvbik7XG59XG5leHBvcnQgY29uc3QgbG9nTG9zcyA9IG9wKHsgbG9nTG9zc18gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sb2dfbG9zcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0U2hhcGVzTWF0Y2ggfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IFJlZHVjdGlvbiB9IGZyb20gJy4uL2xvc3Nfb3BzX3V0aWxzJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHNxdWFyZWREaWZmZXJlbmNlIH0gZnJvbSAnLi4vc3F1YXJlZF9kaWZmZXJlbmNlJztcbmltcG9ydCB7IGNvbXB1dGVXZWlnaHRlZExvc3MgfSBmcm9tICcuL2NvbXB1dGVfd2VpZ2h0ZWRfbG9zcyc7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBtZWFuIHNxdWFyZWQgZXJyb3IgYmV0d2VlbiB0d28gdGVuc29ycy5cbiAqXG4gKiBAcGFyYW0gbGFiZWxzIFRoZSBncm91bmQgdHJ1dGggb3V0cHV0IHRlbnNvciwgc2FtZSBkaW1lbnNpb25zIGFzXG4gKiAgICAncHJlZGljdGlvbnMnLlxuICogQHBhcmFtIHByZWRpY3Rpb25zIFRoZSBwcmVkaWN0ZWQgb3V0cHV0cy5cbiAqIEBwYXJhbSB3ZWlnaHRzIFRlbnNvciB3aG9zZSByYW5rIGlzIGVpdGhlciAwLCBvciB0aGUgc2FtZSByYW5rIGFzXG4gKiAgICBgbGFiZWxzYCwgYW5kIG11c3QgYmUgYnJvYWRjYXN0YWJsZSB0byBgbGFiZWxzYCAoaS5lLiwgYWxsIGRpbWVuc2lvbnNcbiAqICAgIG11c3QgYmUgZWl0aGVyIGAxYCwgb3IgdGhlIHNhbWUgYXMgdGhlIGNvcnJlc3BvbmRpbmcgYGxvc3Nlc2BcbiAqICAgIGRpbWVuc2lvbikuXG4gKiBAcGFyYW0gcmVkdWN0aW9uIFR5cGUgb2YgcmVkdWN0aW9uIHRvIGFwcGx5IHRvIGxvc3MuIFNob3VsZCBiZSBvZiB0eXBlXG4gKiAgICBgUmVkdWN0aW9uYFxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdMb3NzZXMnLCBuYW1lc3BhY2U6ICdsb3NzZXMnfVxuICovXG5mdW5jdGlvbiBtZWFuU3F1YXJlZEVycm9yXyhsYWJlbHMsIHByZWRpY3Rpb25zLCB3ZWlnaHRzLCByZWR1Y3Rpb24gPSBSZWR1Y3Rpb24uU1VNX0JZX05PTlpFUk9fV0VJR0hUUykge1xuICAgIGNvbnN0ICRsYWJlbHMgPSBjb252ZXJ0VG9UZW5zb3IobGFiZWxzLCAnbGFiZWxzJywgJ21lYW5TcXVhcmVkRXJyb3InKTtcbiAgICBjb25zdCAkcHJlZGljdGlvbnMgPSBjb252ZXJ0VG9UZW5zb3IocHJlZGljdGlvbnMsICdwcmVkaWN0aW9ucycsICdtZWFuU3F1YXJlZEVycm9yJyk7XG4gICAgbGV0ICR3ZWlnaHRzID0gbnVsbDtcbiAgICBpZiAod2VpZ2h0cyAhPSBudWxsKSB7XG4gICAgICAgICR3ZWlnaHRzID0gY29udmVydFRvVGVuc29yKHdlaWdodHMsICd3ZWlnaHRzJywgJ21lYW5TcXVhcmVkRXJyb3InKTtcbiAgICB9XG4gICAgYXNzZXJ0U2hhcGVzTWF0Y2goJGxhYmVscy5zaGFwZSwgJHByZWRpY3Rpb25zLnNoYXBlLCAnRXJyb3IgaW4gbWVhblNxdWFyZWRFcnJvcjogJyk7XG4gICAgY29uc3QgbG9zc2VzID0gc3F1YXJlZERpZmZlcmVuY2UoJGxhYmVscywgJHByZWRpY3Rpb25zKTtcbiAgICByZXR1cm4gY29tcHV0ZVdlaWdodGVkTG9zcyhsb3NzZXMsICR3ZWlnaHRzLCByZWR1Y3Rpb24pO1xufVxuZXhwb3J0IGNvbnN0IG1lYW5TcXVhcmVkRXJyb3IgPSBvcCh7IG1lYW5TcXVhcmVkRXJyb3JfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVhbl9zcXVhcmVkX2Vycm9yLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnRTaGFwZXNNYXRjaCB9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHsgYWJzIH0gZnJvbSAnLi4vYWJzJztcbmltcG9ydCB7IGFkZCB9IGZyb20gJy4uL2FkZCc7XG5pbXBvcnQgeyBleHAgfSBmcm9tICcuLi9leHAnO1xuaW1wb3J0IHsgbG9nMXAgfSBmcm9tICcuLi9sb2cxcCc7XG5pbXBvcnQgeyBSZWR1Y3Rpb24gfSBmcm9tICcuLi9sb3NzX29wc191dGlscyc7XG5pbXBvcnQgeyBtdWwgfSBmcm9tICcuLi9tdWwnO1xuaW1wb3J0IHsgbmVnIH0gZnJvbSAnLi4vbmVnJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlbHUgfSBmcm9tICcuLi9yZWx1JztcbmltcG9ydCB7IHNjYWxhciB9IGZyb20gJy4uL3NjYWxhcic7XG5pbXBvcnQgeyBzdWIgfSBmcm9tICcuLi9zdWInO1xuaW1wb3J0IHsgY29tcHV0ZVdlaWdodGVkTG9zcyB9IGZyb20gJy4vY29tcHV0ZV93ZWlnaHRlZF9sb3NzJztcbmZ1bmN0aW9uIHNpZ21vaWRDcm9zc0VudHJvcHlXaXRoTG9naXRzXyhsYWJlbHMsIGxvZ2l0cykge1xuICAgIGNvbnN0ICRsYWJlbHMgPSBjb252ZXJ0VG9UZW5zb3IobGFiZWxzLCAnbGFiZWxzJywgJ3NpZ21vaWRDcm9zc0VudHJvcHlXaXRoTG9naXRzJyk7XG4gICAgY29uc3QgJGxvZ2l0cyA9IGNvbnZlcnRUb1RlbnNvcihsb2dpdHMsICdsb2dpdHMnLCAnc2lnbW9pZENyb3NzRW50cm9weVdpdGhMb2dpdHMnKTtcbiAgICBhc3NlcnRTaGFwZXNNYXRjaCgkbGFiZWxzLnNoYXBlLCAkbG9naXRzLnNoYXBlLCAnRXJyb3IgaW4gc2lnbW9pZENyb3NzRW50cm9weVdpdGhMb2dpdHM6ICcpO1xuICAgIC8qKlxuICAgICAqIEltcGxlbWVudGF0aW9uIERldGFpbHM6XG4gICAgICpcbiAgICAgKiBGb3IgYnJldml0eSwgbGV0IGB4ID0gbG9naXRzYCwgYHogPSBsYWJlbHNgLiAgVGhlIGxvZ2lzdGljIGxvc3MgaXNcbiAgICAgKiAgICAgeiAqIC1sb2coc2lnbW9pZCh4KSkgKyAoMSAtIHopICogLWxvZygxIC0gc2lnbW9pZCh4KSlcbiAgICAgKiAgID0geiAqIC1sb2coMSAvICgxICsgZXhwKC14KSkpICsgKDEgLSB6KSAqIC1sb2coZXhwKC14KSAvICgxICsgZXhwKC14KSkpXG4gICAgICogICA9IHogKiBsb2coMSArIGV4cCgteCkpICsgKDEgLSB6KSAqICgtbG9nKGV4cCgteCkpICsgbG9nKDEgKyBleHAoLXgpKSlcbiAgICAgKiAgID0geiAqIGxvZygxICsgZXhwKC14KSkgKyAoMSAtIHopICogKHggKyBsb2coMSArIGV4cCgteCkpXG4gICAgICogICA9ICgxIC0geikgKiB4ICsgbG9nKDEgKyBleHAoLXgpKVxuICAgICAqICAgPSB4IC0geCAqIHogKyBsb2coMSArIGV4cCgteCkpXG4gICAgICpcbiAgICAgKiAgIEZvciB4IDwgMCwgdG8gYXZvaWQgb3ZlcmZsb3cgaW4gZXhwKC14KSwgd2UgcmVmb3JtdWxhdGUgdGhlIGFib3ZlXG4gICAgICogICAgIHggLSB4ICogeiArIGxvZygxICsgZXhwKC14KSlcbiAgICAgKiAgID0gbG9nKGV4cCh4KSkgLSB4ICogeiArIGxvZygxICsgZXhwKC14KSlcbiAgICAgKiAgID0gLSB4ICogeiArIGxvZygxICsgZXhwKHgpKVxuICAgICAqXG4gICAgICogSGVuY2UsIHRvIGVuc3VyZSBzdGFiaWxpdHkgYW5kIGF2b2lkIG92ZXJmbG93LCB0aGUgaW1wbGVtZW50YXRpb24gdXNlc1xuICAgICAqIHRoaXMgZXF1aXZhbGVudCBmb3JtdWxhdGlvbjpcbiAgICAgKiAgICAgbWF4KHgsIDApIC0geCAqIHogKyBsb2coMSArIGV4cCgtYWJzKHgpKSlcbiAgICAgKi9cbiAgICBjb25zdCBtYXhPdXRwdXQgPSByZWx1KCRsb2dpdHMpO1xuICAgIGNvbnN0IG91dHB1dFhUYXJnZXQgPSBtdWwoJGxvZ2l0cywgJGxhYmVscyk7XG4gICAgY29uc3Qgc2lnbW9pZE91dHB1dCA9IGxvZzFwKGV4cChuZWcoYWJzKCRsb2dpdHMpKSkpO1xuICAgIHJldHVybiBhZGQoc3ViKG1heE91dHB1dCwgb3V0cHV0WFRhcmdldCksIHNpZ21vaWRPdXRwdXQpO1xufVxuLyoqXG4gKiBDb21wdXRlcyB0aGUgc2lnbW9pZCBjcm9zcyBlbnRyb3B5IGxvc3MgYmV0d2VlbiB0d28gdGVuc29ycy5cbiAqXG4gKiBJZiBsYWJlbFNtb290aGluZyBpcyBub256ZXJvLCBzbW9vdGggdGhlIGxhYmVscyB0b3dhcmRzIDEvMjpcbiAqXG4gKiAgIG5ld011bHRpY2xhc3NMYWJlbHMgPSBtdWx0aWNsYXNzTGFiZWxzICogKDEgLSBsYWJlbFNtb290aGluZylcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICsgMC41ICogbGFiZWxTbW9vdGhpbmdcbiAqXG4gKiBAcGFyYW0gbXVsdGlDbGFzc0xhYmVscyBUaGUgZ3JvdW5kIHRydXRoIG91dHB1dCB0ZW5zb3Igb2Ygc2hhcGVcbiAqIFtiYXRjaF9zaXplLCBudW1fY2xhc3Nlc10sIHNhbWUgZGltZW5zaW9ucyBhcyAncHJlZGljdGlvbnMnLlxuICogQHBhcmFtIGxvZ2l0cyBUaGUgcHJlZGljdGVkIG91dHB1dHMuXG4gKiBAcGFyYW0gd2VpZ2h0cyBUZW5zb3Igd2hvc2UgcmFuayBpcyBlaXRoZXIgMCwgb3IgdGhlIHNhbWUgcmFuayBhc1xuICogICAgYGxhYmVsc2AsIGFuZCBtdXN0IGJlIGJyb2FkY2FzdGFibGUgdG8gYGxhYmVsc2AgKGkuZS4sIGFsbCBkaW1lbnNpb25zXG4gKiAgICBtdXN0IGJlIGVpdGhlciBgMWAsIG9yIHRoZSBzYW1lIGFzIHRoZSBjb3JyZXNwb25kaW5nIGBsb3NzZXNgXG4gKiAgICBkaW1lbnNpb24pLlxuICogQHBhcmFtIGxhYmVsU21vb3RoaW5nIElmIGdyZWF0ZXIgdGhhbiAwLCB0aGVuIHNtb290aCB0aGUgbGFiZWxzLlxuICogQHBhcmFtIHJlZHVjdGlvbiBUeXBlIG9mIHJlZHVjdGlvbiB0byBhcHBseSB0byBsb3NzLiBTaG91bGQgYmUgb2YgdHlwZVxuICogICAgYFJlZHVjdGlvbmBcbiAqXG4gKiBAZG9jIHsgaGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0xvc3NlcycsIG5hbWVzcGFjZTogJ2xvc3NlcycgfVxuICovXG5mdW5jdGlvbiBzaWdtb2lkQ3Jvc3NFbnRyb3B5XyhtdWx0aUNsYXNzTGFiZWxzLCBsb2dpdHMsIHdlaWdodHMsIGxhYmVsU21vb3RoaW5nID0gMCwgcmVkdWN0aW9uID0gUmVkdWN0aW9uLlNVTV9CWV9OT05aRVJPX1dFSUdIVFMpIHtcbiAgICBsZXQgJG11bHRpQ2xhc3NMYWJlbHMgPSBjb252ZXJ0VG9UZW5zb3IobXVsdGlDbGFzc0xhYmVscywgJ211bHRpQ2xhc3NMYWJlbHMnLCAnc2lnbW9pZENyb3NzRW50cm9weScpO1xuICAgIGNvbnN0ICRsb2dpdHMgPSBjb252ZXJ0VG9UZW5zb3IobG9naXRzLCAnbG9naXRzJywgJ3NpZ21vaWRDcm9zc0VudHJvcHknKTtcbiAgICBsZXQgJHdlaWdodHMgPSBudWxsO1xuICAgIGlmICh3ZWlnaHRzICE9IG51bGwpIHtcbiAgICAgICAgJHdlaWdodHMgPSBjb252ZXJ0VG9UZW5zb3Iod2VpZ2h0cywgJ3dlaWdodHMnLCAnc2lnbW9pZENyb3NzRW50cm9weScpO1xuICAgIH1cbiAgICBhc3NlcnRTaGFwZXNNYXRjaCgkbXVsdGlDbGFzc0xhYmVscy5zaGFwZSwgJGxvZ2l0cy5zaGFwZSwgJ0Vycm9yIGluIHNpZ21vaWRDcm9zc0VudHJvcHk6ICcpO1xuICAgIGlmIChsYWJlbFNtb290aGluZyA+IDApIHtcbiAgICAgICAgY29uc3QgbGFiZWxTbW9vdGhpbmdTY2FsYXIgPSBzY2FsYXIobGFiZWxTbW9vdGhpbmcpO1xuICAgICAgICBjb25zdCBvbmUgPSBzY2FsYXIoMSk7XG4gICAgICAgIGNvbnN0IGhhbGYgPSBzY2FsYXIoMC41KTtcbiAgICAgICAgJG11bHRpQ2xhc3NMYWJlbHMgPVxuICAgICAgICAgICAgYWRkKG11bCgkbXVsdGlDbGFzc0xhYmVscywgc3ViKG9uZSwgbGFiZWxTbW9vdGhpbmdTY2FsYXIpKSwgbXVsKGhhbGYsIGxhYmVsU21vb3RoaW5nU2NhbGFyKSk7XG4gICAgfVxuICAgIGNvbnN0IGxvc3NlcyA9IHNpZ21vaWRDcm9zc0VudHJvcHlXaXRoTG9naXRzXygkbXVsdGlDbGFzc0xhYmVscywgJGxvZ2l0cyk7XG4gICAgcmV0dXJuIGNvbXB1dGVXZWlnaHRlZExvc3MobG9zc2VzLCAkd2VpZ2h0cywgcmVkdWN0aW9uKTtcbn1cbmV4cG9ydCBjb25zdCBzaWdtb2lkQ3Jvc3NFbnRyb3B5ID0gb3AoeyBzaWdtb2lkQ3Jvc3NFbnRyb3B5XyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNpZ21vaWRfY3Jvc3NfZW50cm9weS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjdXN0b21HcmFkIH0gZnJvbSAnLi4vLi4vZ3JhZGllbnRzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnRTaGFwZXNNYXRjaCB9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHsgYWRkIH0gZnJvbSAnLi4vYWRkJztcbmltcG9ydCB7IGV4cGFuZFNoYXBlVG9LZWVwRGltIH0gZnJvbSAnLi4vYXhpc191dGlsJztcbmltcG9ydCB7IGNhc3QgfSBmcm9tICcuLi9jYXN0JztcbmltcG9ydCB7IGRpdiB9IGZyb20gJy4uL2Rpdic7XG5pbXBvcnQgeyBleHAgfSBmcm9tICcuLi9leHAnO1xuaW1wb3J0IHsgbG9nU3VtRXhwIH0gZnJvbSAnLi4vbG9nX3N1bV9leHAnO1xuaW1wb3J0IHsgUmVkdWN0aW9uIH0gZnJvbSAnLi4vbG9zc19vcHNfdXRpbHMnO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi4vbXVsJztcbmltcG9ydCB7IG5lZyB9IGZyb20gJy4uL25lZyc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4uL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi4vcmVzaGFwZSc7XG5pbXBvcnQgeyBzY2FsYXIgfSBmcm9tICcuLi9zY2FsYXInO1xuaW1wb3J0IHsgc3ViIH0gZnJvbSAnLi4vc3ViJztcbmltcG9ydCB7IHN1bSB9IGZyb20gJy4uL3N1bSc7XG5pbXBvcnQgeyBjb21wdXRlV2VpZ2h0ZWRMb3NzIH0gZnJvbSAnLi9jb21wdXRlX3dlaWdodGVkX2xvc3MnO1xuLyoqXG4gKiBDb21wdXRlcyBzb2Z0bWF4IGNyb3NzIGVudHJvcHkgYmV0d2VlbiBsb2dpdHMgYW5kIGxhYmVscy5cbiAqXG4gKiBNZWFzdXJlcyB0aGUgcHJvYmFiaWxpdHkgZXJyb3IgaW4gZGlzY3JldGUgY2xhc3NpZmljYXRpb24gdGFza3MgaW4gd2hpY2hcbiAqIHRoZSBjbGFzc2VzIGFyZSBtdXR1YWxseSBleGNsdXNpdmUgKGVhY2ggZW50cnkgaXMgaW4gZXhhY3RseSBvbmUgY2xhc3MpLlxuICogRm9yIGV4YW1wbGUsIGVhY2ggQ0lGQVItMTAgaW1hZ2UgaXMgbGFiZWxlZCB3aXRoIG9uZSBhbmQgb25seSBvbmUgbGFiZWw6IGFuXG4gKiBpbWFnZSBjYW4gYmUgYSBkb2cgb3IgYSB0cnVjaywgYnV0IG5vdCBib3RoLlxuICpcbiAqIGBOT1RFYDogV2hpbGUgdGhlIGNsYXNzZXMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSwgdGhlaXIgcHJvYmFiaWxpdGllcyBuZWVkXG4gKiBub3QgYmUuIEFsbCB0aGF0IGlzIHJlcXVpcmVkIGlzIHRoYXQgZWFjaCByb3cgb2YgbGFiZWxzIGlzIGEgdmFsaWRcbiAqIHByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbi4gSWYgdGhleSBhcmUgbm90LCB0aGUgY29tcHV0YXRpb24gb2YgdGhlIGdyYWRpZW50XG4gKiB3aWxsIGJlIGluY29ycmVjdC5cbiAqXG4gKiBgV0FSTklOR2A6IFRoaXMgb3AgZXhwZWN0cyB1bnNjYWxlZCBsb2dpdHMsIHNpbmNlIGl0IHBlcmZvcm1zIGEgc29mdG1heCBvblxuICogbG9naXRzIGludGVybmFsbHkgZm9yIGVmZmljaWVuY3kuIERvIG5vdCBjYWxsIHRoaXMgb3Agd2l0aCB0aGUgb3V0cHV0IG9mXG4gKiBzb2Z0bWF4LCBhcyBpdCB3aWxsIHByb2R1Y2UgaW5jb3JyZWN0IHJlc3VsdHMuXG4gKlxuICogbG9naXRzIGFuZCBsYWJlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIHNoYXBlLCBlLmcuIFtiYXRjaF9zaXplLCBudW1fY2xhc3Nlc11cbiAqIGFuZCB0aGUgc2FtZSBkdHlwZS5cbiAqIEBwYXJhbSBsYWJlbHMgVGhlIGxhYmVscyBhcnJheS5cbiAqIEBwYXJhbSBsb2dpdHMgVGhlIGxvZ2l0cyBhcnJheS5cbiAqIEBwYXJhbSBkaW0gVGhlIGRpbWVuc2lvbiBzb2Z0bWF4IHdvdWxkIGJlIHBlcmZvcm1lZCBvbi4gRGVmYXVsdHMgdG8gYC0xYFxuICogICAgIHdoaWNoIGluZGljYXRlcyB0aGUgbGFzdCBkaW1lbnNpb24uXG4gKi9cbmZ1bmN0aW9uIHNvZnRtYXhDcm9zc0VudHJvcHlXaXRoTG9naXRzXyhsYWJlbHMsIGxvZ2l0cywgZGltID0gLTEpIHtcbiAgICBpZiAoZGltID09PSAtMSkge1xuICAgICAgICBkaW0gPSBsb2dpdHMucmFuayAtIDE7XG4gICAgfVxuICAgIGlmIChkaW0gIT09IGxvZ2l0cy5yYW5rIC0gMSkge1xuICAgICAgICB0aHJvdyBFcnJvcihgU29mdG1heCBjcm9zcyBlbnRyb3B5IGFsb25nIGEgbm9uLWxhc3QgZGltZW5zaW9uIGlzIG5vdCB5ZXQgYCArXG4gICAgICAgICAgICBgc3VwcG9ydGVkLiBMYWJlbHMgLyBsb2dpdHMgd2FzIHJhbmsgJHtsb2dpdHMucmFua30gYCArXG4gICAgICAgICAgICBgYW5kIGRpbSB3YXMgJHtkaW19YCk7XG4gICAgfVxuICAgIC8vIFVzZSBhIGN1c3RvbSBncmFkaWVudCBmb3IgbnVtZXJpY2FsIHN0YWJpbGl0eS5cbiAgICBjb25zdCBjdXN0b21PcCA9IGN1c3RvbUdyYWQoKGxhYmVscywgbG9naXRzLCBzYXZlKSA9PiB7XG4gICAgICAgIC8vIFJlZmVyZW5jZTpcbiAgICAgICAgLy8gICAxLiBodHRwOi8vY3MyMzFuLmdpdGh1Yi5pby9saW5lYXItY2xhc3NpZnkvI3NvZnRtYXhcbiAgICAgICAgLy8gICAyLiBodHRwczovL2Jsb2cuZmVlZGx5LmNvbS90cmlja3Mtb2YtdGhlLXRyYWRlLWxvZ3N1bWV4cC9cbiAgICAgICAgY29uc3Qga2VlcERpbXMgPSB0cnVlO1xuICAgICAgICBjb25zdCBsc2UgPSBsb2dTdW1FeHAobG9naXRzLCBbZGltXSwga2VlcERpbXMpO1xuICAgICAgICBjb25zdCBsb2dSZXN1bHQgPSBzdWIoY2FzdChsb2dpdHMsICdmbG9hdDMyJyksIGxzZSk7XG4gICAgICAgIHNhdmUoW2xhYmVscywgbG9nUmVzdWx0XSk7XG4gICAgICAgIGNvbnN0IGNvc3RWZWN0b3IgPSBuZWcobXVsKGxvZ1Jlc3VsdCwgbGFiZWxzKSk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gc3VtKGNvc3RWZWN0b3IsIFtkaW1dKTtcbiAgICAgICAgY29uc3QgZ3JhZEZ1bmMgPSAoZHksIHNhdmVkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBbbGFiZWxzLCBsb2dSZXN1bHRdID0gc2F2ZWQ7XG4gICAgICAgICAgICBjb25zdCBkeVNoYXBlID0gZXhwYW5kU2hhcGVUb0tlZXBEaW0oZHkuc2hhcGUsIFtkaW1dKTtcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgbXVsKHJlc2hhcGUoZHksIGR5U2hhcGUpLCBzdWIoY2FzdChsYWJlbHMsICdmbG9hdDMyJyksIGV4cChsb2dSZXN1bHQpKSksXG4gICAgICAgICAgICAgICAgbXVsKHJlc2hhcGUoZHksIGR5U2hhcGUpLCBzdWIoZXhwKGxvZ1Jlc3VsdCksIGNhc3QobGFiZWxzLCAnZmxvYXQzMicpKSksXG4gICAgICAgICAgICBdO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4geyB2YWx1ZSwgZ3JhZEZ1bmMgfTtcbiAgICB9KTtcbiAgICByZXR1cm4gY3VzdG9tT3AobGFiZWxzLCBsb2dpdHMpO1xufVxuLyoqXG4gKiBDb21wdXRlcyB0aGUgc29mdG1heCBjcm9zcyBlbnRyb3B5IGxvc3MgYmV0d2VlbiB0d28gdGVuc29ycy5cbiAqXG4gKiBJZiBsYWJlbFNtb290aGluZyBpcyBub256ZXJvLCBzbW9vdGggdGhlIGxhYmVscyB0b3dhcmRzIDEvMjpcbiAqXG4gKiAgIG5ld09uZWhvdExhYmVscyA9IG9uZWhvdExhYmVscyAqICgxIC0gbGFiZWxTbW9vdGhpbmcpXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICArIGxhYmVsU21vb3RoaW5nIC8gbnVtQ2xhc3Nlc1xuICpcbiAqIEBwYXJhbSBvbmVob3RMYWJlbHMgT25lIGhvdCBlbmNvZGVkIGxhYmVsc1xuICogICAgW2JhdGNoX3NpemUsIG51bV9jbGFzc2VzXSwgc2FtZSBkaW1lbnNpb25zIGFzICdwcmVkaWN0aW9ucycuXG4gKiBAcGFyYW0gbG9naXRzIFRoZSBwcmVkaWN0ZWQgb3V0cHV0cy5cbiAqIEBwYXJhbSB3ZWlnaHRzIFRlbnNvciB3aG9zZSByYW5rIGlzIGVpdGhlciAwLCBvciAxLCBhbmQgbXVzdCBiZVxuICogICAgYnJvYWRjYXN0YWJsZSB0byBgbG9zc2AgIG9mIHNoYXBlIFtiYXRjaF9zaXplXVxuICogQHBhcmFtIGxhYmVsU21vb3RoaW5nIElmIGdyZWF0ZXIgdGhhbiAwLCB0aGVuIHNtb290aCB0aGUgbGFiZWxzLlxuICogQHBhcmFtIHJlZHVjdGlvbiBUeXBlIG9mIHJlZHVjdGlvbiB0byBhcHBseSB0byBsb3NzLiBTaG91bGQgYmUgb2YgdHlwZVxuICogICAgYFJlZHVjdGlvbmBcbiAqXG4gKiBAZG9jIHsgaGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0xvc3NlcycsIG5hbWVzcGFjZTogJ2xvc3NlcycgfVxuICovXG5mdW5jdGlvbiBzb2Z0bWF4Q3Jvc3NFbnRyb3B5XyhvbmVob3RMYWJlbHMsIGxvZ2l0cywgd2VpZ2h0cywgbGFiZWxTbW9vdGhpbmcgPSAwLCByZWR1Y3Rpb24gPSBSZWR1Y3Rpb24uU1VNX0JZX05PTlpFUk9fV0VJR0hUUykge1xuICAgIGxldCAkb25laG90TGFiZWxzID0gY29udmVydFRvVGVuc29yKG9uZWhvdExhYmVscywgJ29uZWhvdExhYmVscycsICdzb2Z0bWF4Q3Jvc3NFbnRyb3B5Jyk7XG4gICAgY29uc3QgJGxvZ2l0cyA9IGNvbnZlcnRUb1RlbnNvcihsb2dpdHMsICdsb2dpdHMnLCAnc29mdG1heENyb3NzRW50cm9weScpO1xuICAgIGxldCAkd2VpZ2h0cyA9IG51bGw7XG4gICAgaWYgKHdlaWdodHMgIT0gbnVsbCkge1xuICAgICAgICAkd2VpZ2h0cyA9IGNvbnZlcnRUb1RlbnNvcih3ZWlnaHRzLCAnd2VpZ2h0cycsICdzb2Z0bWF4Q3Jvc3NFbnRyb3B5Jyk7XG4gICAgfVxuICAgIGFzc2VydFNoYXBlc01hdGNoKCRvbmVob3RMYWJlbHMuc2hhcGUsICRsb2dpdHMuc2hhcGUsICdFcnJvciBpbiBzb2Z0bWF4Q3Jvc3NFbnRyb3B5OiAnKTtcbiAgICBpZiAobGFiZWxTbW9vdGhpbmcgPiAwKSB7XG4gICAgICAgIGNvbnN0IGxhYmVsU21vb3RoaW5nU2NhbGFyID0gc2NhbGFyKGxhYmVsU21vb3RoaW5nKTtcbiAgICAgICAgY29uc3Qgb25lID0gc2NhbGFyKDEpO1xuICAgICAgICBjb25zdCBudW1DbGFzc2VzID0gc2NhbGFyKCRvbmVob3RMYWJlbHMuc2hhcGVbMV0pO1xuICAgICAgICAkb25laG90TGFiZWxzID1cbiAgICAgICAgICAgIGFkZChtdWwoJG9uZWhvdExhYmVscywgc3ViKG9uZSwgbGFiZWxTbW9vdGhpbmdTY2FsYXIpKSwgZGl2KGxhYmVsU21vb3RoaW5nU2NhbGFyLCBudW1DbGFzc2VzKSk7XG4gICAgfVxuICAgIGNvbnN0IGxvc3NlcyA9IHNvZnRtYXhDcm9zc0VudHJvcHlXaXRoTG9naXRzXygkb25laG90TGFiZWxzLCAkbG9naXRzKTtcbiAgICByZXR1cm4gY29tcHV0ZVdlaWdodGVkTG9zcyhsb3NzZXMsICR3ZWlnaHRzLCByZWR1Y3Rpb24pO1xufVxuZXhwb3J0IGNvbnN0IHNvZnRtYXhDcm9zc0VudHJvcHkgPSBvcCh7IHNvZnRtYXhDcm9zc0VudHJvcHlfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c29mdG1heF9jcm9zc19lbnRyb3B5LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBCYXRjaE1hdE11bCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBtYWtlVHlwZXNNYXRjaCB9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHR3byBtYXRyaWNlcywgQSAqIEIuIFRoZXNlIG11c3QgYmUgbWF0cmljZXMuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IyZChbMSwgMl0sIFsxLCAyXSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pO1xuICpcbiAqIGEubWF0TXVsKGIpLnByaW50KCk7ICAvLyBvciB0Zi5tYXRNdWwoYSwgYilcbiAqIGBgYFxuICogQHBhcmFtIGEgRmlyc3QgbWF0cml4IGluIGRvdCBwcm9kdWN0IG9wZXJhdGlvbi5cbiAqIEBwYXJhbSBiIFNlY29uZCBtYXRyaXggaW4gZG90IHByb2R1Y3Qgb3BlcmF0aW9uLlxuICogQHBhcmFtIHRyYW5zcG9zZUEgSWYgdHJ1ZSwgYGFgIGlzIHRyYW5zcG9zZWQgYmVmb3JlIG11bHRpcGxpY2F0aW9uLlxuICogQHBhcmFtIHRyYW5zcG9zZUIgSWYgdHJ1ZSwgYGJgIGlzIHRyYW5zcG9zZWQgYmVmb3JlIG11bHRpcGxpY2F0aW9uLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ01hdHJpY2VzJ31cbiAqL1xuZnVuY3Rpb24gbWF0TXVsXyhhLCBiLCB0cmFuc3Bvc2VBID0gZmFsc2UsIHRyYW5zcG9zZUIgPSBmYWxzZSkge1xuICAgIGxldCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdtYXRNdWwnKTtcbiAgICBsZXQgJGIgPSBjb252ZXJ0VG9UZW5zb3IoYiwgJ2InLCAnbWF0TXVsJyk7XG4gICAgWyRhLCAkYl0gPSBtYWtlVHlwZXNNYXRjaCgkYSwgJGIpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgYTogJGEsIGI6ICRiIH07XG4gICAgY29uc3QgYXR0cnMgPSB7IHRyYW5zcG9zZUEsIHRyYW5zcG9zZUIgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChCYXRjaE1hdE11bCwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgbWF0TXVsID0gb3AoeyBtYXRNdWxfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWF0X211bC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTWF4IH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIG1heGltdW0gb2YgZWxlbWVudHMgYWNyb3NzIGRpbWVuc2lvbnMgb2YgYSBgdGYuVGVuc29yYC5cbiAqXG4gKiBSZWR1Y2VzIHRoZSBpbnB1dCBhbG9uZyB0aGUgZGltZW5zaW9ucyBnaXZlbiBpbiBgYXhlc2AuIFVubGVzcyBga2VlcERpbXNgXG4gKiBpcyB0cnVlLCB0aGUgcmFuayBvZiB0aGUgYHRmLlRlbnNvcmAgaXMgcmVkdWNlZCBieSAxIGZvciBlYWNoIGVudHJ5IGluXG4gKiBgYXhlc2AuIElmIGBrZWVwRGltc2AgaXMgdHJ1ZSwgdGhlIHJlZHVjZWQgZGltZW5zaW9ucyBhcmUgcmV0YWluZWQgd2l0aFxuICogbGVuZ3RoIDEuIElmIGBheGVzYCBoYXMgbm8gZW50cmllcywgYWxsIGRpbWVuc2lvbnMgYXJlIHJlZHVjZWQsIGFuZCBhblxuICogYHRmLlRlbnNvcmAgd2l0aCBhIHNpbmdsZSBlbGVtZW50IGlzIHJldHVybmVkLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqXG4gKiB4Lm1heCgpLnByaW50KCk7ICAvLyBvciB0Zi5tYXgoeClcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pO1xuICpcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5tYXgoYXhpcykucHJpbnQoKTsgIC8vIG9yIHRmLm1heCh4LCBheGlzKVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBheGlzIFRoZSBkaW1lbnNpb24ocykgdG8gcmVkdWNlLiBCeSBkZWZhdWx0IGl0IHJlZHVjZXNcbiAqICAgICBhbGwgZGltZW5zaW9ucy5cbiAqIEBwYXJhbSBrZWVwRGltcyBJZiB0cnVlLCByZXRhaW5zIHJlZHVjZWQgZGltZW5zaW9ucyB3aXRoIHNpemUgMS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdSZWR1Y3Rpb24nfVxuICovXG5mdW5jdGlvbiBtYXhfKHgsIGF4aXMgPSBudWxsLCBrZWVwRGltcyA9IGZhbHNlKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnbWF4Jyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyByZWR1Y3Rpb25JbmRpY2VzOiBheGlzLCBrZWVwRGltcyB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKE1heCwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgbWF4ID0gb3AoeyBtYXhfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWF4LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBNYXhQb29sIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0ICogYXMgY29udl91dGlsIGZyb20gJy4vY29udl91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vcmVzaGFwZSc7XG4vKipcbiAqIENvbXB1dGVzIHRoZSAyRCBtYXggcG9vbGluZyBvZiBhbiBpbWFnZS5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDQgb3IgcmFuayAzIG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgaW5DaGFubmVsc11gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXJTaXplIFRoZSBmaWx0ZXIgc2l6ZTogYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoXWAuIElmXG4gKiAgICAgYGZpbHRlclNpemVgIGlzIGEgc2luZ2xlIG51bWJlciwgdGhlbiBgZmlsdGVySGVpZ2h0ID09IGZpbHRlcldpZHRoYC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBwb29saW5nOiBgW3N0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGhdYC4gSWZcbiAqICAgICBgc3RyaWRlc2AgaXMgYSBzaW5nbGUgbnVtYmVyLCB0aGVuIGBzdHJpZGVIZWlnaHQgPT0gc3RyaWRlV2lkdGhgLlxuICogQHBhcmFtIGRpbGF0aW9ucyBUaGUgZGlsYXRpb24gcmF0ZXM6IGBbZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGhdYFxuICogICAgIGluIHdoaWNoIHdlIHNhbXBsZSBpbnB1dCB2YWx1ZXMgYWNyb3NzIHRoZSBoZWlnaHQgYW5kIHdpZHRoIGRpbWVuc2lvbnNcbiAqICAgICBpbiBkaWxhdGVkIHBvb2xpbmcuIERlZmF1bHRzIHRvIGBbMSwgMV1gLiBJZiBgZGlsYXRpb25zYCBpcyBhIHNpbmdsZVxuICogICAgIG51bWJlciwgdGhlbiBgZGlsYXRpb25IZWlnaHQgPT0gZGlsYXRpb25XaWR0aGAuIElmIGl0IGlzIGdyZWF0ZXIgdGhhblxuICogICAgIDEsIHRoZW4gYWxsIHZhbHVlcyBvZiBgc3RyaWRlc2AgbXVzdCBiZSAxLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobS5cbiAqICAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAgLSBGb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uXShcbiAqICAgICAgICAgIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbilcbiAqIEBwYXJhbSBkaW1Sb3VuZGluZ01vZGUgQSBzdHJpbmcgZnJvbTogJ2NlaWwnLCAncm91bmQnLCAnZmxvb3InLiBJZiBub25lIGlzXG4gKiAgICAgcHJvdmlkZWQsIGl0IHdpbGwgZGVmYXVsdCB0byB0cnVuY2F0ZS5cbiAqL1xuZnVuY3Rpb24gbWF4UG9vbF8oeCwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdtYXhQb29sJyk7XG4gICAgY29uc3QgZGlsYXRpb25zID0gMTtcbiAgICBsZXQgeDREID0gJHg7XG4gICAgbGV0IHJlc2hhcGVkVG80RCA9IGZhbHNlO1xuICAgIGlmICgkeC5yYW5rID09PSAzKSB7XG4gICAgICAgIHJlc2hhcGVkVG80RCA9IHRydWU7XG4gICAgICAgIHg0RCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV0sICR4LnNoYXBlWzJdXSk7XG4gICAgfVxuICAgIHV0aWwuYXNzZXJ0KHg0RC5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gbWF4UG9vbDogaW5wdXQgbXVzdCBiZSByYW5rIDQgYnV0IGdvdCByYW5rICR7eDRELnJhbmt9LmApO1xuICAgIHV0aWwuYXNzZXJ0KGNvbnZfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgZGlsYXRpb25zKSwgKCkgPT4gJ0Vycm9yIGluIG1heFBvb2w6IEVpdGhlciBzdHJpZGVzIG9yIGRpbGF0aW9ucyBtdXN0IGJlIDEuICcgK1xuICAgICAgICBgR290IHN0cmlkZXMgJHtzdHJpZGVzfSBhbmQgZGlsYXRpb25zICcke2RpbGF0aW9uc30nYCk7XG4gICAgaWYgKGRpbVJvdW5kaW5nTW9kZSAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNJbnQocGFkKSwgKCkgPT4gYEVycm9yIGluIG1heFBvb2w6IHBhZCBtdXN0IGJlIGFuIGludGVnZXIgd2hlbiB1c2luZywgYCArXG4gICAgICAgICAgICBgZGltUm91bmRpbmdNb2RlICR7ZGltUm91bmRpbmdNb2RlfSBidXQgZ290IHBhZCAke3BhZH0uYCk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogeDREIH07XG4gICAgY29uc3QgYXR0cnMgPSB7IGZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlIH07XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgIGNvbnN0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoTWF4UG9vbCwgaW5wdXRzLCBhdHRycyk7XG4gICAgaWYgKHJlc2hhcGVkVG80RCkge1xuICAgICAgICByZXR1cm4gcmVzaGFwZShyZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdXSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5leHBvcnQgY29uc3QgbWF4UG9vbCA9IG9wKHsgbWF4UG9vbF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tYXhfcG9vbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTWF4UG9vbDNEIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIDNEIG1heCBwb29saW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yNWQoWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDhdLCBbMSwgMiwgMiwgMiwgMV0pO1xuICogY29uc3QgcmVzdWx0ID0gdGYubWF4UG9vbDNkKHgsIDIsIDEsICd2YWxpZCcpO1xuICogcmVzdWx0LnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDUgb3IgcmFuayA0IG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgZGVwdGgsIGhlaWdodCwgd2lkdGgsIGluQ2hhbm5lbHNdYC5cbiAqIEBwYXJhbSBmaWx0ZXJTaXplIFRoZSBmaWx0ZXIgc2l6ZTpcbiAqICAgICBgW2ZpbHRlckRlcHRoLCBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoXWAuXG4gKiAgICAgSWYgYGZpbHRlclNpemVgIGlzIGEgc2luZ2xlIG51bWJlcixcbiAqICAgICB0aGVuIGBmaWx0ZXJEZXB0aCA9PSBmaWx0ZXJIZWlnaHQgPT0gZmlsdGVyV2lkdGhgLlxuICogQHBhcmFtIHN0cmlkZXMgVGhlIHN0cmlkZXMgb2YgdGhlIHBvb2xpbmc6XG4gKiAgICAgYFtzdHJpZGVEZXB0aCwgc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aF1gLlxuICogICAgIElmIGBzdHJpZGVzYCBpcyBhIHNpbmdsZSBudW1iZXIsXG4gKiAgICAgdGhlbiBgc3RyaWRlRGVwdGggPT0gc3RyaWRlSGVpZ2h0ID09IHN0cmlkZVdpZHRoYC5cbiAqIEBwYXJhbSBwYWQgVGhlIHR5cGUgb2YgcGFkZGluZyBhbGdvcml0aG0uXG4gKiAgICAtIGBzYW1lYCBhbmQgc3RyaWRlIDE6IG91dHB1dCB3aWxsIGJlIG9mIHNhbWUgc2l6ZSBhcyBpbnB1dCxcbiAqICAgICAgIHJlZ2FyZGxlc3Mgb2YgZmlsdGVyIHNpemUuXG4gKiAgICAtIGB2YWxpZGA6IG91dHB1dCB3aWxsIGJlIHNtYWxsZXIgdGhhbiBpbnB1dCBpZiBmaWx0ZXIgaXMgbGFyZ2VyXG4gKiAgICAgICB0aGFuIDEqMXgxLlxuICogICAgLSBGb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uXShcbiAqICAgICAgICAgIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbilcbiAqIEBwYXJhbSBkaW1Sb3VuZGluZ01vZGUgQSBzdHJpbmcgZnJvbTogJ2NlaWwnLCAncm91bmQnLCAnZmxvb3InLiBJZiBub25lIGlzXG4gKiAgICAgcHJvdmlkZWQsIGl0IHdpbGwgZGVmYXVsdCB0byB0cnVuY2F0ZS5cbiAqIEBwYXJhbSBkYXRhRm9ybWF0IEFuIG9wdGlvbmFsIHN0cmluZyBmcm9tOiBcIk5ESFdDXCIsIFwiTkNESFdcIi4gRGVmYXVsdHMgdG9cbiAqICAgICBcIk5ESFdDXCIuIFNwZWNpZnkgdGhlIGRhdGEgZm9ybWF0IG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEuIFdpdGggdGhlXG4gKiAgICAgZGVmYXVsdCBmb3JtYXQgXCJOREhXQ1wiLCB0aGUgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIG9yZGVyIG9mOiBbYmF0Y2gsXG4gKiAgICAgZGVwdGgsIGhlaWdodCwgd2lkdGgsIGNoYW5uZWxzXS4gT25seSBcIk5ESFdDXCIgaXMgY3VycmVudGx5IHN1cHBvcnRlZC5cbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0NvbnZvbHV0aW9uJ31cbiAqL1xuZnVuY3Rpb24gbWF4UG9vbDNkXyh4LCBmaWx0ZXJTaXplID0gWzEsIDEsIDFdLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgZGF0YUZvcm1hdCA9ICdOREhXQycpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdtYXhQb29sM2QnKTtcbiAgICBsZXQgeDVEID0gJHg7XG4gICAgbGV0IHJlc2hhcGVkVG81RCA9IGZhbHNlO1xuICAgIGlmICgkeC5yYW5rID09PSA0KSB7XG4gICAgICAgIHJlc2hhcGVkVG81RCA9IHRydWU7XG4gICAgICAgIHg1RCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV0sICR4LnNoYXBlWzJdLCAkeC5zaGFwZVszXV0pO1xuICAgIH1cbiAgICB1dGlsLmFzc2VydCh4NUQucmFuayA9PT0gNSwgKCkgPT4gYEVycm9yIGluIG1heFBvb2wzZDogeCBtdXN0IGJlIHJhbmsgNSBidXQgZ290IHJhbmsgJHt4NUQucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoZGF0YUZvcm1hdCA9PT0gJ05ESFdDJywgKCkgPT4gYEVycm9yIGluIG1heFBvb2wzZDogT25seSBOREhXQyBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLCBgICtcbiAgICAgICAgYGJ1dCBnb3QgZGF0YUZvcm1hdCBvZiAke2RhdGFGb3JtYXR9YCk7XG4gICAgaWYgKGRpbVJvdW5kaW5nTW9kZSAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNJbnQocGFkKSwgKCkgPT4gYEVycm9yIGluIG1heFBvb2wzZDogcGFkIG11c3QgYmUgYW4gaW50ZWdlciB3aGVuIHVzaW5nLCBgICtcbiAgICAgICAgICAgIGBkaW1Sb3VuZGluZ01vZGUgJHtkaW1Sb3VuZGluZ01vZGV9IGJ1dCBnb3QgcGFkICR7cGFkfS5gKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiB4NUQgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGRhdGFGb3JtYXQgfTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgY29uc3QgcmVzID0gRU5HSU5FLnJ1bktlcm5lbChNYXhQb29sM0QsIGlucHV0cywgYXR0cnMpO1xuICAgIGlmIChyZXNoYXBlZFRvNUQpIHtcbiAgICAgICAgcmV0dXJuIHJlc2hhcGUocmVzLCBbcmVzLnNoYXBlWzFdLCByZXMuc2hhcGVbMl0sIHJlcy5zaGFwZVszXSwgcmVzLnNoYXBlWzRdXSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5leHBvcnQgY29uc3QgbWF4UG9vbDNkID0gb3AoeyBtYXhQb29sM2RfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWF4X3Bvb2xfM2QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IE1heFBvb2xXaXRoQXJnbWF4IH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIDJEIG1heCBwb29saW5nIG9mIGFuIGltYWdlIHdpdGggQXJnbWF4IGluZGV4LlxuICogVGhlIGluZGljZXMgaW4gYXJnbWF4IGFyZSBmbGF0dGVuZWQsIHNvIHRoYXQgYSBtYXhpbXVtIHZhbHVlIGF0IHBvc2l0aW9uIGBbYixcbiAqIHksIHgsIGNdYCBiZWNvbWVzIGZsYXR0ZW5lZCBpbmRleDogYCh5ICogd2lkdGggKyB4KSAqIGNoYW5uZWxzICsgY2AgaWZcbiAqIGluY2x1ZGVfYmF0Y2hfaW5faW5kZXggaXMgRmFsc2U7IGAoKGIgKiBoZWlnaHQgKyB5KSAqIHdpZHRoICsgeCkgKiBjaGFubmVsc1xuICogK2NgIGlmIGluY2x1ZGVfYmF0Y2hfaW5faW5kZXggaXMgVHJ1ZS5cbiAqXG4gKiBUaGUgaW5kaWNlcyByZXR1cm5lZCBhcmUgYWx3YXlzIGluIGBbMCwgaGVpZ2h0KSB4IFswLCB3aWR0aClgIGJlZm9yZVxuICogZmxhdHRlbmluZy5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDQgb3IgcmFuayAzIG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgaW5DaGFubmVsc11gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXJTaXplIFRoZSBmaWx0ZXIgc2l6ZTogYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoXWAuIElmXG4gKiAgICAgYGZpbHRlclNpemVgIGlzIGEgc2luZ2xlIG51bWJlciwgdGhlbiBgZmlsdGVySGVpZ2h0ID09IGZpbHRlcldpZHRoYC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBwb29saW5nOiBgW3N0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGhdYC4gSWZcbiAqICAgICBgc3RyaWRlc2AgaXMgYSBzaW5nbGUgbnVtYmVyLCB0aGVuIGBzdHJpZGVIZWlnaHQgPT0gc3RyaWRlV2lkdGhgLlxuICogQHBhcmFtIGRhdGFGb3JtYXQgQW4gb3B0aW9uYWwgc3RyaW5nIGZyb206IFwiTkRIV0NcIiwgXCJOQ0RIV1wiLiBEZWZhdWx0cyB0b1xuICogICAgIFwiTkRIV0NcIi4gU3BlY2lmeSB0aGUgZGF0YSBmb3JtYXQgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YS4gV2l0aCB0aGVcbiAqICAgICBkZWZhdWx0IGZvcm1hdCBcIk5ESFdDXCIsIHRoZSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgb3JkZXIgb2Y6IFtiYXRjaCxcbiAqICAgICBkZXB0aCwgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbHNdLiBPbmx5IFwiTkRIV0NcIiBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobS5cbiAqICAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAgLSBGb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uXShcbiAqICAgICAgICAgIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbilcbiAqIEBwYXJhbSBpbmNsdWRlQmF0Y2hJbmRleCBEZWZhdWx0cyB0byBGYWxzZS4gV2hldGhlciB0byBpbmNsdWRlIGJhdGNoXG4gKiAgICBkaW1lbnNpb24gaW4gZmxhdHRlbmVkIGluZGV4IG9mIGFyZ21heC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdDb252b2x1dGlvbid9XG4gKi9cbmZ1bmN0aW9uIG1heFBvb2xXaXRoQXJnbWF4Xyh4LCBmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGluY2x1ZGVCYXRjaEluSW5kZXggPSBmYWxzZSkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ21heFBvb2xXaXRoQXJnbWF4Jyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGluY2x1ZGVCYXRjaEluSW5kZXggfTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgY29uc3QgcmVzdWx0ID0gRU5HSU5FLnJ1bktlcm5lbChNYXhQb29sV2l0aEFyZ21heCwgaW5wdXRzLCBhdHRycyk7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiByZXN1bHRbMF0sIGluZGV4ZXM6IHJlc3VsdFsxXSB9O1xufVxuZXhwb3J0IGNvbnN0IG1heFBvb2xXaXRoQXJnbWF4ID0gb3AoeyBtYXhQb29sV2l0aEFyZ21heF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tYXhfcG9vbF93aXRoX2FyZ21heC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTWF4aW11bSB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBtYWtlVHlwZXNNYXRjaCB9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSB9IGZyb20gJy4vYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0IHsgY2FzdCB9IGZyb20gJy4vY2FzdCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV0dXJucyB0aGUgbWF4IG9mIGEgYW5kIGIgKGBhID4gYiA/IGEgOiBiYCkgZWxlbWVudC13aXNlLlxuICogU3VwcG9ydHMgYnJvYWRjYXN0aW5nLlxuICpcbiAqIFdlIGFsc28gZXhwb3NlIGB0Zi5tYXhpbXVtU3RyaWN0YCB3aGljaCBoYXMgdGhlIHNhbWUgc2lnbmF0dXJlIGFzIHRoaXMgb3AgYW5kXG4gKiBhc3NlcnRzIHRoYXQgYGFgIGFuZCBgYmAgYXJlIHRoZSBzYW1lIHNoYXBlIChkb2VzIG5vdCBicm9hZGNhc3QpLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDQsIDMsIDE2XSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzEsIDIsIDksIDRdKTtcbiAqXG4gKiBhLm1heGltdW0oYikucHJpbnQoKTsgIC8vIG9yIHRmLm1heGltdW0oYSwgYilcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBCcm9hZGNhc3QgbWF4aW11bSBhIHdpdGggYi5cbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMiwgNCwgNiwgOF0pO1xuICogY29uc3QgYiA9IHRmLnNjYWxhcig1KTtcbiAqXG4gKiBhLm1heGltdW0oYikucHJpbnQoKTsgIC8vIG9yIHRmLm1heGltdW0oYSwgYilcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCB0ZW5zb3IuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIHRlbnNvci4gTXVzdCBoYXZlIHRoZSBzYW1lIHR5cGUgYXMgYGFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0FyaXRobWV0aWMnfVxuICovXG5mdW5jdGlvbiBtYXhpbXVtXyhhLCBiKSB7XG4gICAgbGV0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ21heGltdW0nKTtcbiAgICBsZXQgJGIgPSBjb252ZXJ0VG9UZW5zb3IoYiwgJ2InLCAnbWF4aW11bScpO1xuICAgIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcbiAgICBpZiAoJGEuZHR5cGUgPT09ICdib29sJykge1xuICAgICAgICAkYSA9IGNhc3QoJGEsICdpbnQzMicpO1xuICAgICAgICAkYiA9IGNhc3QoJGIsICdpbnQzMicpO1xuICAgIH1cbiAgICBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSgkYS5zaGFwZSwgJGIuc2hhcGUpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgYTogJGEsIGI6ICRiIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoTWF4aW11bSwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBtYXhpbXVtID0gb3AoeyBtYXhpbXVtXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1heGltdW0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IE1lYW4gfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgbWVhbiBvZiBlbGVtZW50cyBhY3Jvc3MgZGltZW5zaW9ucyBvZiBhIGB0Zi5UZW5zb3JgLlxuICpcbiAqIFJlZHVjZXMgYHhgIGFsb25nIHRoZSBkaW1lbnNpb25zIGdpdmVuIGluIGBheGlzYC4gVW5sZXNzIGBrZWVwRGltc2AgaXNcbiAqIHRydWUsIHRoZSByYW5rIG9mIHRoZSBgdGYuVGVuc29yYCBpcyByZWR1Y2VkIGJ5IDEgZm9yIGVhY2ggZW50cnkgaW4gYGF4aXNgLlxuICogSWYgYGtlZXBEaW1zYCBpcyB0cnVlLCB0aGUgcmVkdWNlZCBkaW1lbnNpb25zIGFyZSByZXRhaW5lZCB3aXRoIGxlbmd0aCAxLlxuICogSWYgYGF4aXNgIGhhcyBubyBlbnRyaWVzLCBhbGwgZGltZW5zaW9ucyBhcmUgcmVkdWNlZCwgYW5kIGEgYHRmLlRlbnNvcmAgd2l0aFxuICogYSBzaW5nbGUgZWxlbWVudCBpcyByZXR1cm5lZC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKlxuICogeC5tZWFuKCkucHJpbnQoKTsgIC8vIG9yIHRmLm1lYW4oYSlcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pO1xuICpcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5tZWFuKGF4aXMpLnByaW50KCk7ICAvLyBvciB0Zi5tZWFuKHgsIGF4aXMpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICogQHBhcmFtIGF4aXMgVGhlIGRpbWVuc2lvbihzKSB0byByZWR1Y2UuIEJ5IGRlZmF1bHQgaXQgcmVkdWNlc1xuICogICAgIGFsbCBkaW1lbnNpb25zLlxuICogQHBhcmFtIGtlZXBEaW1zIElmIHRydWUsIHJldGFpbnMgcmVkdWNlZCBkaW1lbnNpb25zIHdpdGggc2l6ZSAxLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1JlZHVjdGlvbid9XG4gKi9cbmZ1bmN0aW9uIG1lYW5fKHgsIGF4aXMgPSBudWxsLCBrZWVwRGltcyA9IGZhbHNlKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnbWVhbicpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICBjb25zdCBhdHRycyA9IHsgYXhpcywga2VlcERpbXMgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChNZWFuLCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBtZWFuID0gb3AoeyBtZWFuXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1lYW4uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgbWF0TXVsIH0gZnJvbSAnLi9tYXRfbXVsJztcbmltcG9ydCB7IG9uZXMgfSBmcm9tICcuL29uZXMnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vcmVzaGFwZSc7XG5pbXBvcnQgeyBUZW5zb3IgfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IHNpemVGcm9tU2hhcGUgfSBmcm9tICcuLi91dGlsX2Jhc2UnO1xuLyoqXG4gKiBCcm9hZGNhc3RzIHBhcmFtZXRlcnMgZm9yIGV2YWx1YXRpb24gb24gYW4gTi1EIGdyaWQuXG4gKlxuICogR2l2ZW4gTiBvbmUtZGltZW5zaW9uYWwgY29vcmRpbmF0ZSBhcnJheXMgYCphcmdzYCwgcmV0dXJucyBhIGxpc3QgYG91dHB1dHNgXG4gKiBvZiBOLUQgY29vcmRpbmF0ZSBhcnJheXMgZm9yIGV2YWx1YXRpbmcgZXhwcmVzc2lvbnMgb24gYW4gTi1EIGdyaWQuXG4gKlxuICogTm90ZXM6XG4gKiBgbWVzaGdyaWRgIHN1cHBvcnRzIGNhcnRlc2lhbiAoJ3h5JykgYW5kIG1hdHJpeCAoJ2lqJykgaW5kZXhpbmcgY29udmVudGlvbnMuXG4gKiBXaGVuIHRoZSBgaW5kZXhpbmdgIGFyZ3VtZW50IGlzIHNldCB0byAneHknICh0aGUgZGVmYXVsdCksIHRoZSBicm9hZGNhc3RpbmdcbiAqIGluc3RydWN0aW9ucyBmb3IgdGhlIGZpcnN0IHR3byBkaW1lbnNpb25zIGFyZSBzd2FwcGVkLlxuICogRXhhbXBsZXM6XG4gKiBDYWxsaW5nIGBjb25zdCBbWCwgWV0gPSBtZXNoZ3JpZCh4LCB5KWAgd2l0aCB0aGUgdGVuc29yc1xuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGNvbnN0IHggPSBbMSwgMiwgM107XG4gKiBjb25zdCB5ID0gWzQsIDUsIDZdO1xuICogY29uc3QgW1gsIFldID0gdGYubWVzaGdyaWQoeCwgeSk7XG4gKiAvLyBYID0gW1sxLCAyLCAzXSxcbiAqIC8vICAgICAgWzEsIDIsIDNdLFxuICogLy8gICAgICBbMSwgMiwgM11dXG4gKiAvLyBZID0gW1s0LCA0LCA0XSxcbiAqIC8vICAgICAgWzUsIDUsIDVdLFxuICogLy8gICAgICBbNiwgNiwgNl1dXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUZW5zb3Igd2l0aCByYW5rIGdlcSAxLlxuICogQHBhcmFtIHkgVGVuc29yIHdpdGggcmFuayBnZXEgMS5cbiAqIEBwYXJhbSBpbmRleGluZ1xuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1NsaWNpbmcgYW5kIEpvaW5pbmcnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVzaGdyaWQoeCwgeSwgeyBpbmRleGluZyA9ICd4eScgfSA9IHt9KSB7XG4gICAgaWYgKGluZGV4aW5nICE9PSAneHknICYmIGluZGV4aW5nICE9PSAnaWonKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7aW5kZXhpbmd9IGlzIG5vdCBhIHZhbGlkIHRoaXJkIGFyZ3VtZW50IHRvIG1lc2hncmlkYCk7XG4gICAgfVxuICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBsZXQgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnbWVzaGdyaWQnLCB4IGluc3RhbmNlb2YgVGVuc29yID8geC5kdHlwZSA6ICdmbG9hdDMyJyk7XG4gICAgaWYgKHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gWyR4XTtcbiAgICB9XG4gICAgbGV0ICR5ID0gY29udmVydFRvVGVuc29yKHksICd5JywgJ21lc2hncmlkJywgeSBpbnN0YW5jZW9mIFRlbnNvciA/IHkuZHR5cGUgOiAnZmxvYXQzMicpO1xuICAgIGNvbnN0IHcgPSBzaXplRnJvbVNoYXBlKCR4LnNoYXBlKTtcbiAgICBjb25zdCBoID0gc2l6ZUZyb21TaGFwZSgkeS5zaGFwZSk7XG4gICAgaWYgKGluZGV4aW5nID09PSAneHknKSB7XG4gICAgICAgICR4ID0gcmVzaGFwZSgkeCwgWzEsIC0xXSk7XG4gICAgICAgICR5ID0gcmVzaGFwZSgkeSwgWy0xLCAxXSk7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBtYXRNdWwob25lcyhbaCwgMV0sICR4LmR0eXBlKSwgJHgpLFxuICAgICAgICAgICAgbWF0TXVsKCR5LCBvbmVzKFsxLCB3XSwgJHkuZHR5cGUpKSxcbiAgICAgICAgXTtcbiAgICB9XG4gICAgJHggPSByZXNoYXBlKCR4LCBbLTEsIDFdKTtcbiAgICAkeSA9IHJlc2hhcGUoJHksIFsxLCAtMV0pO1xuICAgIHJldHVybiBbXG4gICAgICAgIG1hdE11bCgkeCwgb25lcyhbMSwgaF0sICR4LmR0eXBlKSksXG4gICAgICAgIG1hdE11bChvbmVzKFt3LCAxXSwgJHkuZHR5cGUpLCAkeSksXG4gICAgXTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1lc2hncmlkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBNaW4gfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgbWluaW11bSB2YWx1ZSBmcm9tIHRoZSBpbnB1dC5cbiAqXG4gKiBSZWR1Y2VzIHRoZSBpbnB1dCBhbG9uZyB0aGUgZGltZW5zaW9ucyBnaXZlbiBpbiBgYXhlc2AuIFVubGVzcyBga2VlcERpbXNgXG4gKiBpcyB0cnVlLCB0aGUgcmFuayBvZiB0aGUgYXJyYXkgaXMgcmVkdWNlZCBieSAxIGZvciBlYWNoIGVudHJ5IGluIGBheGVzYC5cbiAqIElmIGBrZWVwRGltc2AgaXMgdHJ1ZSwgdGhlIHJlZHVjZWQgZGltZW5zaW9ucyBhcmUgcmV0YWluZWQgd2l0aCBsZW5ndGggMS5cbiAqIElmIGBheGVzYCBoYXMgbm8gZW50cmllcywgYWxsIGRpbWVuc2lvbnMgYXJlIHJlZHVjZWQsIGFuZCBhbiBhcnJheSB3aXRoIGFcbiAqIHNpbmdsZSBlbGVtZW50IGlzIHJldHVybmVkLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqXG4gKiB4Lm1pbigpLnByaW50KCk7ICAvLyBvciB0Zi5taW4oeClcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pO1xuICpcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5taW4oYXhpcykucHJpbnQoKTsgIC8vIG9yIHRmLm1pbih4LCBheGlzKVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IFRlbnNvci5cbiAqIEBwYXJhbSBheGlzIFRoZSBkaW1lbnNpb24ocykgdG8gcmVkdWNlLiBCeSBkZWZhdWx0IGl0IHJlZHVjZXNcbiAqICAgICBhbGwgZGltZW5zaW9ucy5cbiAqIEBwYXJhbSBrZWVwRGltcyBJZiB0cnVlLCByZXRhaW5zIHJlZHVjZWQgZGltZW5zaW9ucyB3aXRoIHNpemUgMS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdSZWR1Y3Rpb24nfVxuICovXG5mdW5jdGlvbiBtaW5fKHgsIGF4aXMgPSBudWxsLCBrZWVwRGltcyA9IGZhbHNlKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnbWluJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBheGlzLCBrZWVwRGltcyB9O1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChNaW4sIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IG1pbiA9IG9wKHsgbWluXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1pbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTWluaW11bSB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBtYWtlVHlwZXNNYXRjaCB9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSB9IGZyb20gJy4vYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0IHsgY2FzdCB9IGZyb20gJy4vY2FzdCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV0dXJucyB0aGUgbWluIG9mIGEgYW5kIGIgKGBhIDwgYiA/IGEgOiBiYCkgZWxlbWVudC13aXNlLlxuICogU3VwcG9ydHMgYnJvYWRjYXN0aW5nLlxuICpcbiAqIFdlIGFsc28gZXhwb3NlIGBtaW5pbXVtU3RyaWN0YCB3aGljaCBoYXMgdGhlIHNhbWUgc2lnbmF0dXJlIGFzIHRoaXMgb3AgYW5kXG4gKiBhc3NlcnRzIHRoYXQgYGFgIGFuZCBgYmAgYXJlIHRoZSBzYW1lIHNoYXBlIChkb2VzIG5vdCBicm9hZGNhc3QpLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDQsIDMsIDE2XSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzEsIDIsIDksIDRdKTtcbiAqXG4gKiBhLm1pbmltdW0oYikucHJpbnQoKTsgIC8vIG9yIHRmLm1pbmltdW0oYSwgYilcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBCcm9hZGNhc3QgbWluaW11bSBhIHdpdGggYi5cbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMiwgNCwgNiwgOF0pO1xuICogY29uc3QgYiA9IHRmLnNjYWxhcig1KTtcbiAqXG4gKiBhLm1pbmltdW0oYikucHJpbnQoKTsgIC8vIG9yIHRmLm1pbmltdW0oYSwgYilcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCB0ZW5zb3IuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIHRlbnNvci4gTXVzdCBoYXZlIHRoZSBzYW1lIHR5cGUgYXMgYGFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0FyaXRobWV0aWMnfVxuICovXG5mdW5jdGlvbiBtaW5pbXVtXyhhLCBiKSB7XG4gICAgbGV0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ21pbmltdW0nKTtcbiAgICBsZXQgJGIgPSBjb252ZXJ0VG9UZW5zb3IoYiwgJ2InLCAnbWluaW11bScpO1xuICAgIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcbiAgICBpZiAoJGEuZHR5cGUgPT09ICdib29sJykge1xuICAgICAgICAkYSA9IGNhc3QoJGEsICdpbnQzMicpO1xuICAgICAgICAkYiA9IGNhc3QoJGIsICdpbnQzMicpO1xuICAgIH1cbiAgICBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSgkYS5zaGFwZSwgJGIuc2hhcGUpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgYTogJGEsIGI6ICRiIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoTWluaW11bSwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBtaW5pbXVtID0gb3AoeyBtaW5pbXVtXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1pbmltdW0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IE1pcnJvclBhZCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBQYWRzIGEgYHRmLlRlbnNvcmAgdXNpbmcgbWlycm9yIHBhZGRpbmcuXG4gKlxuICogVGhpcyBvcGVyYXRpb24gaW1wbGVtZW50cyB0aGUgYFJFRkxFQ1RgIGFuZCBgU1lNTUVUUklDYCBtb2RlcyBvZiBwYWQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi5yYW5nZSgwLCA5KS5yZXNoYXBlKFsxLCAxLCAzLCAzXSk7XG4gKiB4Lm1pcnJvclBhZChbWzAsIDBdLCBbMCwgMF0sIFsyLCAyXSwgWzIsIDJdXSwgJ3JlZmxlY3QnKS5wcmludCgpO1xuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgdGVuc29yIHRvIHBhZC5cbiAqIEBwYXJhbSBwYWRkaW5ncyBBbiBhcnJheSBvZiBsZW5ndGggYFJgICh0aGUgcmFuayBvZiB0aGUgdGVuc29yKSwgd2hlcmVcbiAqIGVhY2ggZWxlbWVudCBpcyBhIGxlbmd0aC0yIHR1cGxlIG9mIGludHMgYFtwYWRCZWZvcmUsIHBhZEFmdGVyXWAsXG4gKiBzcGVjaWZ5aW5nIGhvdyBtdWNoIHRvIHBhZCBhbG9uZyBlYWNoIGRpbWVuc2lvbiBvZiB0aGUgdGVuc29yLlxuICogSW4gXCJyZWZsZWN0XCIgbW9kZSwgdGhlIHBhZGRlZCByZWdpb25zIGRvIG5vdCBpbmNsdWRlIHRoZSBib3JkZXJzLFxuICogd2hpbGUgaW4gXCJzeW1tZXRyaWNcIiBtb2RlIHRoZSBwYWRkZWQgcmVnaW9ucyBkbyBpbmNsdWRlIHRoZSBib3JkZXJzLlxuICogRm9yIGV4YW1wbGUsIGlmIHRoZSBpbnB1dCBpcyBgWzEsIDIsIDNdYCBhbmQgcGFkZGluZ3MgaXMgYFswLCAyXWAsXG4gKiB0aGVuIHRoZSBvdXRwdXQgaXMgYFsxLCAyLCAzLCAyLCAxXWAgaW4gXCJyZWZsZWN0XCIgbW9kZSwgYW5kXG4gKiBgWzEsIDIsIDMsIDMsIDJdYCBpbiBcInN5bW1ldHJpY1wiIG1vZGUuXG4gKiBJZiBgbW9kZWAgaXMgXCJyZWZsZWN0XCIgdGhlbiBib3RoIGBwYWRkaW5nc1tELCAwXWAgYW5kIGBwYWRkaW5nc1tELCAxXWBcbiAqIG11c3QgYmUgbm8gZ3JlYXRlciB0aGFuIGB4LnNoYXBlW0RdIC0gMWAuIElmIG1vZGUgaXMgXCJzeW1tZXRyaWNcIlxuICogdGhlbiBib3RoIGBwYWRkaW5nc1tELCAwXWAgYW5kIGBwYWRkaW5nc1tELCAxXWAgbXVzdCBiZSBubyBncmVhdGVyIHRoYW5cbiAqIGB4LnNoYXBlW0RdYFxuICogQHBhcmFtIG1vZGUgU3RyaW5nIHRvIHNwZWNpZnkgcGFkZGluZyBtb2RlLiBDYW4gYmUgYCdyZWZsZWN0JyB8ICdzeW1tZXRyaWMnYFxuICovXG4vKiogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnVHJhbnNmb3JtYXRpb25zJ30gKi9cbmZ1bmN0aW9uIG1pcnJvclBhZF8oeCwgcGFkZGluZ3MsIG1vZGUpIHtcbiAgICB1dGlsLmFzc2VydChtb2RlID09PSAncmVmbGVjdCcgfHwgbW9kZSA9PT0gJ3N5bW1ldHJpYycsICgpID0+IGBJbnZhbGlkIG1vZGUuIE1vZGUgbXVzdCBiZSBlaXRoZXIgcmVmbGVjdCBvciBzeW1tZXRyaWMuIGAgK1xuICAgICAgICBgR290ICR7bW9kZX0uYCk7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnbWlycm9yUGFkJyk7XG4gICAgaWYgKCR4LnJhbmsgPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXJyb3JQYWQoc2NhbGFyKSBpcyBub3QgZGVmaW5lZC4gJyArXG4gICAgICAgICAgICAnUGFzcyBub24tc2NhbGFyIHRvIG1pcnJvclBhZCcpO1xuICAgIH1cbiAgICB1dGlsLmFzc2VydChwYWRkaW5ncy5sZW5ndGggPT09ICR4LnJhbmssICgpID0+IGBQYWRkaW5nIGRvZXNuJ3QgbWF0Y2ggaW5wdXQuIE11c3QgYmUgJHskeC5yYW5rfS4gYCArXG4gICAgICAgIGBHb3QgJHtwYWRkaW5ncy5sZW5ndGh9LmApO1xuICAgIGNvbnN0IHNoYXBlT2Zmc2V0ID0gbW9kZSA9PT0gJ3JlZmxlY3QnID8gMSA6IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAkeC5yYW5rOyBpKyspIHtcbiAgICAgICAgdXRpbC5hc3NlcnQocGFkZGluZ3NbaV0ubGVuZ3RoID09PSAyLCAoKSA9PiBgSW52YWxpZCBudW1iZXIgb2YgcGFkZGluZ3MuIE11c3QgYmUgbGVuZ3RoIG9mIDIgZWFjaC5gKTtcbiAgICAgICAgdXRpbC5hc3NlcnQocGFkZGluZ3NbaV1bMF0gPj0gMCAmJiBwYWRkaW5nc1tpXVswXSA8PSAkeC5zaGFwZVtpXSAtIHNoYXBlT2Zmc2V0ICYmXG4gICAgICAgICAgICBwYWRkaW5nc1tpXVsxXSA+PSAwICYmIHBhZGRpbmdzW2ldWzFdIDw9ICR4LnNoYXBlW2ldIC0gc2hhcGVPZmZzZXQsICgpID0+IGBQYWRkaW5nIGluIGRpbWVuc2lvbiAke2l9IGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgYCArXG4gICAgICAgICAgICBgdG8gJHskeC5zaGFwZVtpXSAtIHNoYXBlT2Zmc2V0fSBvciBsZXNzIHRoYW4gMCBmb3IgaW5wdXQgb2YgYCArXG4gICAgICAgICAgICBgc2hhcGUgJHskeC5zaGFwZX1gKTtcbiAgICB9XG4gICAgY29uc3QgYXR0cnMgPSB7IHBhZGRpbmdzLCBtb2RlIH07XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKE1pcnJvclBhZCwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgbWlycm9yUGFkID0gb3AoeyBtaXJyb3JQYWRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWlycm9yX3BhZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTW9kIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IG1ha2VUeXBlc01hdGNoIH0gZnJvbSAnLi4vdGVuc29yX3V0aWwnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBtb2Qgb2YgYSBhbmQgYiBlbGVtZW50LXdpc2UuXG4gKiBgZmxvb3IoeCAvIHkpICogeSArIG1vZCh4LCB5KSA9IHhgXG4gKiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuXG4gKlxuICogV2UgYWxzbyBleHBvc2UgYHRmLm1vZFN0cmljdGAgd2hpY2ggaGFzIHRoZSBzYW1lIHNpZ25hdHVyZSBhcyB0aGlzIG9wIGFuZFxuICogYXNzZXJ0cyB0aGF0IGBhYCBhbmQgYGJgIGFyZSB0aGUgc2FtZSBzaGFwZSAoZG9lcyBub3QgYnJvYWRjYXN0KS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCA0LCAzLCAxNl0pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFsxLCAyLCA5LCA0XSk7XG4gKlxuICogYS5tb2QoYikucHJpbnQoKTsgIC8vIG9yIHRmLm1vZChhLCBiKVxuICogYGBgXG4gKlxuICogYGBganNcbiAqIC8vIEJyb2FkY2FzdCBhIG1vZCBiLlxuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsyLCA0LCA2LCA4XSk7XG4gKiBjb25zdCBiID0gdGYuc2NhbGFyKDUpO1xuICpcbiAqIGEubW9kKGIpLnByaW50KCk7ICAvLyBvciB0Zi5tb2QoYSwgYilcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCB0ZW5zb3IuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIHRlbnNvci4gTXVzdCBoYXZlIHRoZSBzYW1lIHR5cGUgYXMgYGFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0FyaXRobWV0aWMnfVxuICovXG5mdW5jdGlvbiBtb2RfKGEsIGIpIHtcbiAgICBsZXQgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnbW9kJyk7XG4gICAgbGV0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ21vZCcpO1xuICAgIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGE6ICRhLCBiOiAkYiB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKE1vZCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBtb2QgPSBvcCh7IG1vZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tb2QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IHBhcnNlQXhpc1BhcmFtIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBleHBhbmRTaGFwZVRvS2VlcERpbSB9IGZyb20gJy4vYXhpc191dGlsJztcbmltcG9ydCB7IGNhc3QgfSBmcm9tICcuL2Nhc3QnO1xuaW1wb3J0IHsgbWVhbiB9IGZyb20gJy4vbWVhbic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL3Jlc2hhcGUnO1xuaW1wb3J0IHsgc3F1YXJlIH0gZnJvbSAnLi9zcXVhcmUnO1xuaW1wb3J0IHsgc3ViIH0gZnJvbSAnLi9zdWInO1xuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBtZWFuIGFuZCB2YXJpYW5jZSBvZiBgeGAuIFRoZSBtZWFuIGFuZCB2YXJpYW5jZSBhcmVcbiAqIGNhbGN1bGF0ZWQgYnkgYWdncmVnYXRpbmcgdGhlIGNvbnRlbnRzIG9mIGB4YCBhY3Jvc3MgYGF4ZXNgLiBJZiBgeGAgaXNcbiAqIDEtRCBhbmQgYGF4ZXMgPSBbMF1gIHRoaXMgaXMganVzdCB0aGUgbWVhbiBhbmQgdmFyaWFuY2Ugb2YgYSB2ZWN0b3IuXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBheGlzIFRoZSBkaW1lbnNpb24ocykgYWxvbmcgd2l0aCB0byBjb21wdXRlIG1lYW4gYW5kXG4gKiAgICAgdmFyaWFuY2UuIEJ5IGRlZmF1bHQgaXQgcmVkdWNlcyBhbGwgZGltZW5zaW9ucy5cbiAqIEBwYXJhbSBrZWVwRGltcyBJZiB0cnVlLCB0aGUgbW9tZW50cyBoYXZlIHRoZSBzYW1lIGRpbWVuc2lvbmFsaXR5IGFzIHRoZVxuICogICAgIGlucHV0LlxuICogQHJldHVybiBBbiBvYmplY3Qgd2l0aCB0d28ga2V5czogYG1lYW5gIGFuZCBgdmFyaWFuY2VgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ05vcm1hbGl6YXRpb24nfVxuICovXG5mdW5jdGlvbiBtb21lbnRzXyh4LCBheGlzID0gbnVsbCwga2VlcERpbXMgPSBmYWxzZSkge1xuICAgIHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnbW9tZW50cycpO1xuICAgIGNvbnN0IGF4ZXMgPSBwYXJzZUF4aXNQYXJhbShheGlzLCB4LnNoYXBlKTtcbiAgICBjb25zdCB4TWVhbiA9IG1lYW4oeCwgYXhlcywga2VlcERpbXMpO1xuICAgIGxldCBrZWVwRGltc1NoYXBlID0geE1lYW4uc2hhcGU7XG4gICAgaWYgKCFrZWVwRGltcykge1xuICAgICAgICBrZWVwRGltc1NoYXBlID0gZXhwYW5kU2hhcGVUb0tlZXBEaW0oeE1lYW4uc2hhcGUsIGF4ZXMpO1xuICAgIH1cbiAgICBjb25zdCBkZXZTcXVhcmVkID0gc3F1YXJlKHN1YihjYXN0KHgsICdmbG9hdDMyJyksIHJlc2hhcGUoeE1lYW4sIGtlZXBEaW1zU2hhcGUpKSk7XG4gICAgY29uc3QgdmFyaWFuY2UgPSBtZWFuKGRldlNxdWFyZWQsIGF4ZXMsIGtlZXBEaW1zKTtcbiAgICByZXR1cm4geyBtZWFuOiB4TWVhbiwgdmFyaWFuY2UgfTtcbn1cbmV4cG9ydCBjb25zdCBtb21lbnRzID0gb3AoeyBtb21lbnRzXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1vbWVudHMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYXNzZXJ0VHlwZXNNYXRjaCB9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgYWRkIH0gZnJvbSAnLi9hZGQnO1xuaW1wb3J0IHsgZGl2IH0gZnJvbSAnLi9kaXYnO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi9tdWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyBwb3cgfSBmcm9tICcuL3Bvdyc7XG5pbXBvcnQgeyBzY2FsYXIgfSBmcm9tICcuL3NjYWxhcic7XG5pbXBvcnQgeyBzdWIgfSBmcm9tICcuL3N1Yic7XG4vKipcbiAqIENvbXB1dGUgdGhlIG1vdmluZyBhdmVyYWdlIG9mIGEgdmFyaWFibGUuXG4gKlxuICogV2l0aG91dCB6ZXJvRGViaWFzLCB0aGUgbW92aW5nIGF2ZXJhZ2Ugb3BlcmF0aW9uIGlzIGRlZmluZWQgYnk6XG4gKiAgIGB2ICs9IGRlbHRhYFxuICogd2hlcmVcbiAqICAgYGRlbHRhID0gKDEgLSBkZWNheSkgKiAoeCAtIHYpYFxuICpcbiAqIFdpdGggemVyb0RlYmlhcyAoZGVmYXVsdCksIHRoZSBgZGVsdGFgIHRlcm0gaXMgc2NhbGVkIHRvIGRlYmlhcyB0aGVcbiAqIGVmZmVjdCBvZiB0aGUgKGFzc3VtZWQpIHplcm8taW5pdGlhbGl6YXRpb24gb2YgYHZgLlxuICogICBgZGVsdGEgLz0gKDEgLSBkZWNheSBeIHN0ZXApYFxuICpcbiAqIEZvciBtb3JlIGRldGFpbHMgb24gdGhlIHplcm8tZGViaWFzaW5nIGFsZ29yaXRobSwgc2VlOlxuICogICBodHRwczovL2FyeGl2Lm9yZy9hYnMvMTQxMi42OTgwXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgY29tcGxldGVseSBzdGF0ZWxlc3MgYW5kIGRvZXMgbm90IGtlZXAgdHJhY2sgb2ZcbiAqIHN0ZXAgY291bnQuIFRoZSBzdGVwIGNvdW50IG5lZWRzIHRvIGJlIG1haW50YWluZWQgYnkgdGhlIGNhbGxlciBhbmQgcGFzc2VkXG4gKiBpbiBhcyBgc3RlcGAuXG4gKlxuICogQHBhcmFtIHYgVGhlIGN1cnJlbnQgbW92aW5nIGF2ZXJhZ2UgdmFsdWUuXG4gKiBAcGFyYW0geCBOZXcgaW5wdXQgdmFsdWUsIG11c3QgaGF2ZSB0aGUgc2FtZSBzaGFwZSBhbmQgZHR5cGUgYXMgYHZgLlxuICogQHBhcmFtIGRlY2F5IFRoZSBkZWNheSBmYWN0b3IuIFR5cGljYWwgdmFsdWVzIGFyZSAwLjk1IGFuZCAwLjk5LlxuICogQHBhcmFtIHN0ZXAgU3RlcCBjb3VudC5cbiAqIEBwYXJhbSB6ZXJvRGViaWFzOiBXaGV0aGVyIHplcm9EZWJpYXMgaXMgdG8gYmUgcGVyZm9ybWVkIChkZWZhdWx0OiBgdHJ1ZWApLlxuICogQHJldHVybnMgVGhlIG5ldyBtb3ZpbmcgYXZlcmFnZSB2YWx1ZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdNb3ZpbmcgQXZlcmFnZSd9XG4gKi9cbmZ1bmN0aW9uIG1vdmluZ0F2ZXJhZ2VfKHYsIHgsIGRlY2F5LCBzdGVwLCB6ZXJvRGViaWFzID0gdHJ1ZSkge1xuICAgIGNvbnN0ICR2ID0gY29udmVydFRvVGVuc29yKHYsICd2JywgJ21vdmluZ0F2ZXJhZ2UnKTtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdtb3ZpbmdBdmVyYWdlJyk7XG4gICAgY29uc3QgJGRlY2F5ID0gY29udmVydFRvVGVuc29yKGRlY2F5LCAnZGVjYXknLCAnbW92aW5nQXZlcmFnZScpO1xuICAgIGFzc2VydFR5cGVzTWF0Y2goJHYsICR4KTtcbiAgICB1dGlsLmFzc2VydCh1dGlsLmFycmF5c0VxdWFsKCR2LnNoYXBlLCAkeC5zaGFwZSksICgpID0+ICdTaGFwZSBtaXNtYXRjaCBpbiB2IGFuZCB4Jyk7XG4gICAgY29uc3Qgb25lID0gc2NhbGFyKDEpO1xuICAgIGNvbnN0IG9uZU1pbnVzRGVjYXkgPSBzdWIob25lLCAkZGVjYXkpO1xuICAgIGxldCB1cGRhdGUgPSBtdWwoc3ViKCR4LCAkdiksIG9uZU1pbnVzRGVjYXkpO1xuICAgIGlmICh6ZXJvRGViaWFzKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHN0ZXAgIT0gbnVsbCwgKCkgPT4gJ1doZW4gdXNpbmcgemVyb0RlYmlhczogdHJ1ZSwgc3RlcCBpcyByZXF1aXJlZC4nKTtcbiAgICAgICAgY29uc3QgJHN0ZXAgPSBjb252ZXJ0VG9UZW5zb3Ioc3RlcCwgJ3N0ZXAnLCAnbW92aW5nQXZlcmFnZScpO1xuICAgICAgICB1cGRhdGUgPSBkaXYodXBkYXRlLCBzdWIob25lLCBwb3coJGRlY2F5LCAkc3RlcCkpKTtcbiAgICB9XG4gICAgcmV0dXJuIGFkZCgkdiwgdXBkYXRlKTtcbn1cbmV4cG9ydCBjb25zdCBtb3ZpbmdBdmVyYWdlID0gb3AoeyBtb3ZpbmdBdmVyYWdlXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1vdmluZ19hdmVyYWdlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBNdWx0aXBseSB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBtYWtlVHlwZXNNYXRjaCB9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogTXVsdGlwbGllcyB0d28gYHRmLlRlbnNvcmBzIGVsZW1lbnQtd2lzZSwgQSAqIEIuIFN1cHBvcnRzIGJyb2FkY2FzdGluZy5cbiAqXG4gKiBXZSBhbHNvIGV4cG9zZSBgdGYubXVsU3RyaWN0YCB3aGljaCBoYXMgdGhlIHNhbWUgc2lnbmF0dXJlIGFzIHRoaXMgb3AgYW5kXG4gKiBhc3NlcnRzIHRoYXQgYGFgIGFuZCBgYmAgYXJlIHRoZSBzYW1lIHNoYXBlIChkb2VzIG5vdCBicm9hZGNhc3QpLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDIsIDMsIDRdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbMiwgMywgNCwgNV0pO1xuICpcbiAqIGEubXVsKGIpLnByaW50KCk7ICAvLyBvciB0Zi5tdWwoYSwgYilcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBCcm9hZGNhc3QgbXVsIGEgd2l0aCBiLlxuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzLCA0XSk7XG4gKiBjb25zdCBiID0gdGYuc2NhbGFyKDUpO1xuICpcbiAqIGEubXVsKGIpLnByaW50KCk7ICAvLyBvciB0Zi5tdWwoYSwgYilcbiAqIGBgYFxuICogQHBhcmFtIGEgVGhlIGZpcnN0IHRlbnNvciB0byBtdWx0aXBseS5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgdGVuc29yIHRvIG11bHRpcGx5LiBNdXN0IGhhdmUgdGhlIHNhbWUgZHR5cGUgYXMgYGFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0FyaXRobWV0aWMnfVxuICovXG5mdW5jdGlvbiBtdWxfKGEsIGIpIHtcbiAgICBsZXQgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnbXVsJyk7XG4gICAgbGV0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ211bCcpO1xuICAgIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGE6ICRhLCBiOiAkYiB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKE11bHRpcGx5LCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IG11bCA9IG9wKHsgbXVsXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW11bC5qcy5tYXAiLCJpbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IsIGNvbnZlcnRUb1RlbnNvckFycmF5IH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgbmV4dCBzdGF0ZXMgYW5kIG91dHB1dHMgb2YgYSBzdGFjayBvZiBMU1RNQ2VsbHMuXG4gKlxuICogRWFjaCBjZWxsIG91dHB1dCBpcyB1c2VkIGFzIGlucHV0IHRvIHRoZSBuZXh0IGNlbGwuXG4gKlxuICogUmV0dXJucyBgW2NlbGxTdGF0ZSwgY2VsbE91dHB1dF1gLlxuICpcbiAqIERlcml2ZWQgZnJvbSB0Zi5jb250cmliLnJuLk11bHRpUk5OQ2VsbC5cbiAqXG4gKiBAcGFyYW0gbHN0bUNlbGxzIEFycmF5IG9mIExTVE1DZWxsIGZ1bmN0aW9ucy5cbiAqIEBwYXJhbSBkYXRhIFRoZSBpbnB1dCB0byB0aGUgY2VsbC5cbiAqIEBwYXJhbSBjIEFycmF5IG9mIHByZXZpb3VzIGNlbGwgc3RhdGVzLlxuICogQHBhcmFtIGggQXJyYXkgb2YgcHJldmlvdXMgY2VsbCBvdXRwdXRzLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1JOTid9XG4gKi9cbmZ1bmN0aW9uIG11bHRpUk5OQ2VsbF8obHN0bUNlbGxzLCBkYXRhLCBjLCBoKSB7XG4gICAgY29uc3QgJGRhdGEgPSBjb252ZXJ0VG9UZW5zb3IoZGF0YSwgJ2RhdGEnLCAnbXVsdGlSTk5DZWxsJyk7XG4gICAgY29uc3QgJGMgPSBjb252ZXJ0VG9UZW5zb3JBcnJheShjLCAnYycsICdtdWx0aVJOTkNlbGwnKTtcbiAgICBjb25zdCAkaCA9IGNvbnZlcnRUb1RlbnNvckFycmF5KGgsICdoJywgJ211bHRpUk5OQ2VsbCcpO1xuICAgIGxldCBpbnB1dCA9ICRkYXRhO1xuICAgIGNvbnN0IG5ld1N0YXRlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbHN0bUNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IGxzdG1DZWxsc1tpXShpbnB1dCwgJGNbaV0sICRoW2ldKTtcbiAgICAgICAgbmV3U3RhdGVzLnB1c2gob3V0cHV0WzBdKTtcbiAgICAgICAgbmV3U3RhdGVzLnB1c2gob3V0cHV0WzFdKTtcbiAgICAgICAgaW5wdXQgPSBvdXRwdXRbMV07XG4gICAgfVxuICAgIGNvbnN0IG5ld0MgPSBbXTtcbiAgICBjb25zdCBuZXdIID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdTdGF0ZXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgbmV3Qy5wdXNoKG5ld1N0YXRlc1tpXSk7XG4gICAgICAgIG5ld0gucHVzaChuZXdTdGF0ZXNbaSArIDFdKTtcbiAgICB9XG4gICAgcmV0dXJuIFtuZXdDLCBuZXdIXTtcbn1cbmV4cG9ydCBjb25zdCBtdWx0aVJOTkNlbGwgPSBvcCh7IG11bHRpUk5OQ2VsbF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tdWx0aV9ybm5fY2VsbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTXVsdGlub21pYWwgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vcmVzaGFwZSc7XG4vKipcbiAqIENyZWF0ZXMgYSBgdGYuVGVuc29yYCB3aXRoIHZhbHVlcyBkcmF3biBmcm9tIGEgbXVsdGlub21pYWwgZGlzdHJpYnV0aW9uLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBwcm9icyA9IHRmLnRlbnNvcihbLjc1LCAuMjVdKTtcbiAqIHRmLm11bHRpbm9taWFsKHByb2JzLCAzKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGxvZ2l0cyAxRCBhcnJheSB3aXRoIHVubm9ybWFsaXplZCBsb2ctcHJvYmFiaWxpdGllcywgb3JcbiAqICAgICAyRCBhcnJheSBvZiBzaGFwZSBgW2JhdGNoU2l6ZSwgbnVtT3V0Y29tZXNdYC4gU2VlIHRoZSBgbm9ybWFsaXplZGBcbiAqICAgICBwYXJhbWV0ZXIuXG4gKiBAcGFyYW0gbnVtU2FtcGxlcyBOdW1iZXIgb2Ygc2FtcGxlcyB0byBkcmF3IGZvciBlYWNoIHJvdyBzbGljZS5cbiAqIEBwYXJhbSBzZWVkIFRoZSBzZWVkIG51bWJlci5cbiAqIEBwYXJhbSBub3JtYWxpemVkIFdoZXRoZXIgdGhlIHByb3ZpZGVkIGBsb2dpdHNgIGFyZSBub3JtYWxpemVkIHRydWVcbiAqICAgICBwcm9iYWJpbGl0aWVzIChzdW0gdG8gMSkuIERlZmF1bHRzIHRvIGZhbHNlLlxuICogQHJldHVybiAxRCBhcnJheSBvZiBzaGFwZSBgW251bVNhbXBsZXNdYCwgb3IgMkQgYXJyYXkgb2Ygc2hhcGVcbiAqICAgICBgW2JhdGNoU2l6ZSwgbnVtU2FtcGxlc11gLCBkZXBlbmRpbmcgb24gdGhlIHJhbmsgb2YgdGhlIGlucHV0LlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1JhbmRvbSd9XG4gKi9cbmZ1bmN0aW9uIG11bHRpbm9taWFsXyhsb2dpdHMsIG51bVNhbXBsZXMsIHNlZWQsIG5vcm1hbGl6ZWQgPSBmYWxzZSkge1xuICAgIGNvbnN0ICRsb2dpdHMgPSBjb252ZXJ0VG9UZW5zb3IobG9naXRzLCAnbG9naXRzJywgJ211bHRpbm9taWFsJyk7XG4gICAgY29uc3QgbnVtT3V0Y29tZXMgPSAkbG9naXRzLnNpemU7XG4gICAgY29uc3Qgb3JpZ1JhbmsgPSAkbG9naXRzLnJhbms7XG4gICAgaWYgKG51bU91dGNvbWVzIDwgMikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIG11bHRpbm9taWFsOiB5b3UgbmVlZCBhdCBsZWFzdCAyIG91dGNvbWVzLCBidXQgZ290IGAgK1xuICAgICAgICAgICAgYCR7bnVtT3V0Y29tZXN9LmApO1xuICAgIH1cbiAgICBpZiAob3JpZ1JhbmsgPiAyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUmFuayBvZiBwcm9iYWJpbGl0aWVzIG11c3QgYmUgMSBvciAyLCBidXQgaXMgJHtvcmlnUmFua31gKTtcbiAgICB9XG4gICAgLy8gVE9ETyhsaW5hMTI4KTogSW52ZXN0aWdhdGUgY29ycmVjdCBzZWVkIGJlaGF2aW9yLiBUaGUgY29kZSBzZWVtcyBub3QgYWxsb3dcbiAgICAvLyBzZXR0aW5nIHNlZSB0byAwLlxuICAgIHNlZWQgPSBzZWVkIHx8IE1hdGgucmFuZG9tKCk7XG4gICAgLy8gVGhlIGtlcm5lbCBvbmx5IGFjY2VwdHMgKGFuZCByZXR1cm5zKSByYW5rIDIgdGVuc29ycy5cbiAgICBjb25zdCBsb2dpdHMyRCA9IG9yaWdSYW5rID09PSAxID8gcmVzaGFwZSgkbG9naXRzLCBbMSwgLTFdKSA6ICRsb2dpdHM7XG4gICAgY29uc3QgaW5wdXRzID0geyBsb2dpdHM6IGxvZ2l0czJEIH07XG4gICAgY29uc3QgYXR0cnMgPSB7IG51bVNhbXBsZXMsIHNlZWQsIG5vcm1hbGl6ZWQgfTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgY29uc3QgcmVzID0gRU5HSU5FLnJ1bktlcm5lbChNdWx0aW5vbWlhbCwgaW5wdXRzLCBhdHRycyk7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgcmV0dXJuIG9yaWdSYW5rID09PSAxID8gcmVzaGFwZShyZXMsIFtyZXMuc2l6ZV0pIDogcmVzO1xufVxuZXhwb3J0IGNvbnN0IG11bHRpbm9taWFsID0gb3AoeyBtdWx0aW5vbWlhbF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tdWx0aW5vbWlhbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTmVnIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgYC0xICogeGAgZWxlbWVudC13aXNlLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIC0yLCAwXSwgWzIsIDJdKTtcbiAqXG4gKiB4Lm5lZygpLnByaW50KCk7ICAvLyBvciB0Zi5uZWcoeClcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIG5lZ18oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ25lZycpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChOZWcsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgbmVnID0gb3AoeyBuZWdfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bmVnLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5mdW5jdGlvbiBub25NYXhTdXBwU2FuaXR5Q2hlY2soYm94ZXMsIHNjb3JlcywgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCwgc29mdE5tc1NpZ21hKSB7XG4gICAgaWYgKGlvdVRocmVzaG9sZCA9PSBudWxsKSB7XG4gICAgICAgIGlvdVRocmVzaG9sZCA9IDAuNTtcbiAgICB9XG4gICAgaWYgKHNjb3JlVGhyZXNob2xkID09IG51bGwpIHtcbiAgICAgICAgc2NvcmVUaHJlc2hvbGQgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gICAgfVxuICAgIGlmIChzb2Z0Tm1zU2lnbWEgPT0gbnVsbCkge1xuICAgICAgICBzb2Z0Tm1zU2lnbWEgPSAwLjA7XG4gICAgfVxuICAgIGNvbnN0IG51bUJveGVzID0gYm94ZXMuc2hhcGVbMF07XG4gICAgbWF4T3V0cHV0U2l6ZSA9IE1hdGgubWluKG1heE91dHB1dFNpemUsIG51bUJveGVzKTtcbiAgICB1dGlsLmFzc2VydCgwIDw9IGlvdVRocmVzaG9sZCAmJiBpb3VUaHJlc2hvbGQgPD0gMSwgKCkgPT4gYGlvdVRocmVzaG9sZCBtdXN0IGJlIGluIFswLCAxXSwgYnV0IHdhcyAnJHtpb3VUaHJlc2hvbGR9J2ApO1xuICAgIHV0aWwuYXNzZXJ0KGJveGVzLnJhbmsgPT09IDIsICgpID0+IGBib3hlcyBtdXN0IGJlIGEgMkQgdGVuc29yLCBidXQgd2FzIG9mIHJhbmsgJyR7Ym94ZXMucmFua30nYCk7XG4gICAgdXRpbC5hc3NlcnQoYm94ZXMuc2hhcGVbMV0gPT09IDQsICgpID0+IGBib3hlcyBtdXN0IGhhdmUgNCBjb2x1bW5zLCBidXQgMm5kIGRpbWVuc2lvbiB3YXMgJHtib3hlcy5zaGFwZVsxXX1gKTtcbiAgICB1dGlsLmFzc2VydChzY29yZXMucmFuayA9PT0gMSwgKCkgPT4gJ3Njb3JlcyBtdXN0IGJlIGEgMUQgdGVuc29yJyk7XG4gICAgdXRpbC5hc3NlcnQoc2NvcmVzLnNoYXBlWzBdID09PSBudW1Cb3hlcywgKCkgPT4gYHNjb3JlcyBoYXMgaW5jb21wYXRpYmxlIHNoYXBlIHdpdGggYm94ZXMuIEV4cGVjdGVkICR7bnVtQm94ZXN9LCBgICtcbiAgICAgICAgYGJ1dCB3YXMgJHtzY29yZXMuc2hhcGVbMF19YCk7XG4gICAgdXRpbC5hc3NlcnQoMCA8PSBzb2Z0Tm1zU2lnbWEgJiYgc29mdE5tc1NpZ21hIDw9IDEsICgpID0+IGBzb2Z0Tm1zU2lnbWEgbXVzdCBiZSBpbiBbMCwgMV0sIGJ1dCB3YXMgJyR7c29mdE5tc1NpZ21hfSdgKTtcbiAgICByZXR1cm4geyBtYXhPdXRwdXRTaXplLCBpb3VUaHJlc2hvbGQsIHNjb3JlVGhyZXNob2xkLCBzb2Z0Tm1zU2lnbWEgfTtcbn1cbmV4cG9ydCB7IG5vbk1heFN1cHBTYW5pdHlDaGVjayB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bm9ubWF4X3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IHBhcnNlQXhpc1BhcmFtIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBhYnMgfSBmcm9tICcuL2Ficyc7XG5pbXBvcnQgKiBhcyBheGlzX3V0aWwgZnJvbSAnLi9heGlzX3V0aWwnO1xuaW1wb3J0IHsgbWF4IH0gZnJvbSAnLi9tYXgnO1xuaW1wb3J0IHsgbWluIH0gZnJvbSAnLi9taW4nO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyBwb3cgfSBmcm9tICcuL3Bvdyc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbmltcG9ydCB7IHNjYWxhciB9IGZyb20gJy4vc2NhbGFyJztcbmltcG9ydCB7IHNxcnQgfSBmcm9tICcuL3NxcnQnO1xuaW1wb3J0IHsgc3F1YXJlIH0gZnJvbSAnLi9zcXVhcmUnO1xuaW1wb3J0IHsgc3VtIH0gZnJvbSAnLi9zdW0nO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgbm9ybSBvZiBzY2FsYXIsIHZlY3RvcnMsIGFuZCBtYXRyaWNlcy5cbiAqIFRoaXMgZnVuY3Rpb24gY2FuIGNvbXB1dGUgc2V2ZXJhbCBkaWZmZXJlbnQgdmVjdG9yIG5vcm1zICh0aGUgMS1ub3JtLCB0aGVcbiAqIEV1Y2xpZGVhbiBvciAyLW5vcm0sIHRoZSBpbmYtbm9ybSwgYW5kIGluIGdlbmVyYWwgdGhlIHAtbm9ybSBmb3IgcCA+IDApXG4gKiBhbmQgbWF0cml4IG5vcm1zIChGcm9iZW5pdXMsIDEtbm9ybSwgYW5kIGluZi1ub3JtKS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzLCA0XSk7XG4gKlxuICogeC5ub3JtKCkucHJpbnQoKTsgIC8vIG9yIHRmLm5vcm0oeClcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBhcnJheS5cbiAqIEBwYXJhbSBvcmQgT3B0aW9uYWwuIE9yZGVyIG9mIHRoZSBub3JtLiBTdXBwb3J0ZWQgbm9ybSB0eXBlcyBhcmVcbiAqIGZvbGxvd2luZzpcbiAqXG4gKiAgfCBvcmQgICAgICAgIHwgbm9ybSBmb3IgbWF0cmljZXMgICAgICAgICB8IG5vcm0gZm9yIHZlY3RvcnNcbiAqICB8LS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICB8J2V1Y2xpZGVhbicgfEZyb2Jlbml1cyBub3JtICAgICAgICAgICAgIHwyLW5vcm1cbiAqICB8J2ZybycgICAgICAgfEZyb2Jlbml1cyBub3JtXHQgICAgICAgICAgIHxcbiAqICB8SW5maW5pdHkgICAgfG1heChzdW0oYWJzKHgpLCBheGlzPTEpKSAgIHxtYXgoYWJzKHgpKVxuICogIHwtSW5maW5pdHkgICB8bWluKHN1bShhYnMoeCksIGF4aXM9MSkpICAgfG1pbihhYnMoeCkpXG4gKiAgfDEgICAgICAgICAgIHxtYXgoc3VtKGFicyh4KSwgYXhpcz0wKSkgICB8c3VtKGFicyh4KSlcbiAqICB8MiAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxzdW0oYWJzKHgpXjIpXjEvMipcbiAqXG4gKiBAcGFyYW0gYXhpcyBPcHRpb25hbC4gSWYgYXhpcyBpcyBudWxsICh0aGUgZGVmYXVsdCksIHRoZSBpbnB1dCBpc1xuICogY29uc2lkZXJlZCBhIHZlY3RvciBhbmQgYSBzaW5nbGUgdmVjdG9yIG5vcm0gaXMgY29tcHV0ZWQgb3ZlciB0aGUgZW50aXJlXG4gKiBzZXQgb2YgdmFsdWVzIGluIHRoZSBUZW5zb3IsIGkuZS4gbm9ybSh4LCBvcmQpIGlzIGVxdWl2YWxlbnRcbiAqIHRvIG5vcm0oeC5yZXNoYXBlKFstMV0pLCBvcmQpLiBJZiBheGlzIGlzIGEgaW50ZWdlciwgdGhlIGlucHV0XG4gKiBpcyBjb25zaWRlcmVkIGEgYmF0Y2ggb2YgdmVjdG9ycywgYW5kIGF4aXMgZGV0ZXJtaW5lcyB0aGUgYXhpcyBpbiB4XG4gKiBvdmVyIHdoaWNoIHRvIGNvbXB1dGUgdmVjdG9yIG5vcm1zLiBJZiBheGlzIGlzIGEgMi10dXBsZSBvZiBpbnRlZ2VyIGl0IGlzXG4gKiBjb25zaWRlcmVkIGEgYmF0Y2ggb2YgbWF0cmljZXMgYW5kIGF4aXMgZGV0ZXJtaW5lcyB0aGUgYXhlcyBpbiBOREFycmF5XG4gKiBvdmVyIHdoaWNoIHRvIGNvbXB1dGUgYSBtYXRyaXggbm9ybS5cbiAqIEBwYXJhbSBrZWVwRGltcyBPcHRpb25hbC4gSWYgdHJ1ZSwgdGhlIG5vcm0gaGF2ZSB0aGUgc2FtZSBkaW1lbnNpb25hbGl0eVxuICogYXMgdGhlIGlucHV0LlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ01hdHJpY2VzJ31cbiAqL1xuZnVuY3Rpb24gbm9ybV8oeCwgb3JkID0gJ2V1Y2xpZGVhbicsIGF4aXMgPSBudWxsLCBrZWVwRGltcyA9IGZhbHNlKSB7XG4gICAgeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdub3JtJyk7XG4gICAgY29uc3Qgbm9ybSA9IG5vcm1JbXBsKHgsIG9yZCwgYXhpcyk7XG4gICAgbGV0IGtlZXBEaW1zU2hhcGUgPSBub3JtLnNoYXBlO1xuICAgIGlmIChrZWVwRGltcykge1xuICAgICAgICBjb25zdCBheGVzID0gcGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG4gICAgICAgIGtlZXBEaW1zU2hhcGUgPSBheGlzX3V0aWwuZXhwYW5kU2hhcGVUb0tlZXBEaW0obm9ybS5zaGFwZSwgYXhlcyk7XG4gICAgfVxuICAgIHJldHVybiByZXNoYXBlKG5vcm0sIGtlZXBEaW1zU2hhcGUpO1xufVxuZnVuY3Rpb24gbm9ybUltcGwoeCwgcCwgYXhpcyA9IG51bGwpIHtcbiAgICBpZiAoeC5yYW5rID09PSAwKSB7XG4gICAgICAgIHJldHVybiBhYnMoeCk7XG4gICAgfVxuICAgIC8vIGNvbnNpZGVyIHZlY3RvciB3aGVuIG5vIGF4aXMgaXMgc3BlY2lmaWVkXG4gICAgaWYgKHgucmFuayAhPT0gMSAmJiBheGlzID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBub3JtSW1wbChyZXNoYXBlKHgsIFstMV0pLCBwLCBheGlzKTtcbiAgICB9XG4gICAgLy8gdmVjdG9yXG4gICAgaWYgKHgucmFuayA9PT0gMSB8fCB0eXBlb2YgYXhpcyA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheShheGlzKSAmJiBheGlzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBpZiAocCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIHN1bShhYnMoeCksIGF4aXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwID09PSBJbmZpbml0eSkge1xuICAgICAgICAgICAgcmV0dXJuIG1heChhYnMoeCksIGF4aXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwID09PSAtSW5maW5pdHkpIHtcbiAgICAgICAgICAgIHJldHVybiBtaW4oYWJzKHgpLCBheGlzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocCA9PT0gJ2V1Y2xpZGVhbicgfHwgcCA9PT0gMikge1xuICAgICAgICAgICAgLy8gbm9ybSh4LCAyKSA9IHN1bShhYnMoeGkpIF4gMikgXiAxLzJcbiAgICAgICAgICAgIHJldHVybiBzcXJ0KHN1bShwb3coYWJzKHgpLCBzY2FsYXIoMiwgJ2ludDMyJykpLCBheGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBpbiBub3JtOiBpbnZhbGlkIG9yZCB2YWx1ZTogJHtwfWApO1xuICAgIH1cbiAgICAvLyBtYXRyaXggKGFzc3VtcHRpb24gYXhpc1swXSA8IGF4aXNbMV0pXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXhpcykgJiYgYXhpcy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgaWYgKHAgPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXgoc3VtKGFicyh4KSwgYXhpc1swXSksIGF4aXNbMV0gLSAxKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocCA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXgoc3VtKGFicyh4KSwgYXhpc1sxXSksIGF4aXNbMF0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwID09PSAtSW5maW5pdHkpIHtcbiAgICAgICAgICAgIHJldHVybiBtaW4oc3VtKGFicyh4KSwgYXhpc1sxXSksIGF4aXNbMF0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwID09PSAnZnJvJyB8fCBwID09PSAnZXVjbGlkZWFuJykge1xuICAgICAgICAgICAgLy8gbm9ybSh4KSA9IHNxcnQoc3VtKHBvdyh4LCAyKSkpXG4gICAgICAgICAgICByZXR1cm4gc3FydChzdW0oc3F1YXJlKHgpLCBheGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBpbiBub3JtOiBpbnZhbGlkIG9yZCB2YWx1ZTogJHtwfWApO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIG5vcm06IGludmFsaWQgYXhpczogJHtheGlzfWApO1xufVxuZXhwb3J0IGNvbnN0IG5vcm0gPSBvcCh7IG5vcm1fIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bm9ybS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTm90RXF1YWwgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgbWFrZVR5cGVzTWF0Y2ggfSBmcm9tICcuLi90ZW5zb3JfdXRpbCc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUgfSBmcm9tICcuL2Jyb2FkY2FzdF91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSB0cnV0aCB2YWx1ZSBvZiAoYSAhPSBiKSBlbGVtZW50LXdpc2UuIFN1cHBvcnRzIGJyb2FkY2FzdGluZy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzAsIDIsIDNdKTtcbiAqXG4gKiBhLm5vdEVxdWFsKGIpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBpbnB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIGlucHV0IHRlbnNvci4gTXVzdCBoYXZlIHRoZSBzYW1lIGR0eXBlIGFzIGBhYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdMb2dpY2FsJ31cbiAqL1xuZnVuY3Rpb24gbm90RXF1YWxfKGEsIGIpIHtcbiAgICBsZXQgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnbm90RXF1YWwnLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgICBsZXQgJGIgPSBjb252ZXJ0VG9UZW5zb3IoYiwgJ2InLCAnbm90RXF1YWwnLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgICBbJGEsICRiXSA9IG1ha2VUeXBlc01hdGNoKCRhLCAkYik7XG4gICAgYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoJGEuc2hhcGUsICRiLnNoYXBlKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGE6ICRhLCBiOiAkYiB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKE5vdEVxdWFsLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IG5vdEVxdWFsID0gb3AoeyBub3RFcXVhbF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ub3RfZXF1YWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IE9uZUhvdCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENyZWF0ZXMgYSBvbmUtaG90IGB0Zi5UZW5zb3JgLiBUaGUgbG9jYXRpb25zIHJlcHJlc2VudGVkIGJ5IGBpbmRpY2VzYCB0YWtlXG4gKiB2YWx1ZSBgb25WYWx1ZWAgKGRlZmF1bHRzIHRvIDEpLCB3aGlsZSBhbGwgb3RoZXIgbG9jYXRpb25zIHRha2UgdmFsdWVcbiAqIGBvZmZWYWx1ZWAgKGRlZmF1bHRzIHRvIDApLiBJZiBgaW5kaWNlc2AgaXMgcmFuayBgUmAsIHRoZSBvdXRwdXQgaGFzIHJhbmtcbiAqIGBSKzFgIHdpdGggdGhlIGxhc3QgYXhpcyBvZiBzaXplIGBkZXB0aGAuXG4gKlxuICogYGBganNcbiAqIHRmLm9uZUhvdCh0Zi50ZW5zb3IxZChbMCwgMV0sICdpbnQzMicpLCAzKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGluZGljZXMgYHRmLlRlbnNvcmAgb2YgaW5kaWNlcyB3aXRoIGR0eXBlIGBpbnQzMmAuXG4gKiBAcGFyYW0gZGVwdGggVGhlIGRlcHRoIG9mIHRoZSBvbmUgaG90IGRpbWVuc2lvbi5cbiAqIEBwYXJhbSBvblZhbHVlIEEgbnVtYmVyIHVzZWQgdG8gZmlsbCBpbiB0aGUgb3V0cHV0IHdoZW4gdGhlIGluZGV4IG1hdGNoZXNcbiAqIHRoZSBsb2NhdGlvbi5cbiAqIEBwYXJhbSBvZmZWYWx1ZSBBIG51bWJlciB1c2VkIHRvIGZpbGwgaW4gdGhlIG91dHB1dCB3aGVuIHRoZSBpbmRleCBkb2VzXG4gKiAgICAgbm90IG1hdGNoIHRoZSBsb2NhdGlvbi5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmZ1bmN0aW9uIG9uZUhvdF8oaW5kaWNlcywgZGVwdGgsIG9uVmFsdWUgPSAxLCBvZmZWYWx1ZSA9IDApIHtcbiAgICBpZiAoZGVwdGggPCAyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgaW4gb25lSG90OiBkZXB0aCBtdXN0IGJlID49MiwgYnV0IGl0IGlzICR7ZGVwdGh9YCk7XG4gICAgfVxuICAgIGNvbnN0ICRpbmRpY2VzID0gY29udmVydFRvVGVuc29yKGluZGljZXMsICdpbmRpY2VzJywgJ29uZUhvdCcsICdpbnQzMicpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgaW5kaWNlczogJGluZGljZXMgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgZGVwdGgsIG9uVmFsdWUsIG9mZlZhbHVlIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoT25lSG90LCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBvbmVIb3QgPSBvcCh7IG9uZUhvdF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1vbmVfaG90LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBtYWtlT25lc1R5cGVkQXJyYXksIHNpemVGcm9tU2hhcGUgfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IGNvbXBsZXggfSBmcm9tICcuL2NvbXBsZXgnO1xuaW1wb3J0IHsgemVyb3MgfSBmcm9tICcuL3plcm9zJztcbi8qKlxuICogQ3JlYXRlcyBhIGB0Zi5UZW5zb3JgIHdpdGggYWxsIGVsZW1lbnRzIHNldCB0byAxLlxuICpcbiAqIGBgYGpzXG4gKiB0Zi5vbmVzKFsyLCAyXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBzaGFwZSBBbiBhcnJheSBvZiBpbnRlZ2VycyBkZWZpbmluZyB0aGUgb3V0cHV0IHRlbnNvciBzaGFwZS5cbiAqIEBwYXJhbSBkdHlwZSBUaGUgdHlwZSBvZiBhbiBlbGVtZW50IGluIHRoZSByZXN1bHRpbmcgdGVuc29yLiBEZWZhdWx0cyB0b1xuICogICAgICdmbG9hdCcuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gb25lcyhzaGFwZSwgZHR5cGUgPSAnZmxvYXQzMicpIHtcbiAgICBpZiAoZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICAgIGNvbnN0IHJlYWwgPSBvbmVzKHNoYXBlLCAnZmxvYXQzMicpO1xuICAgICAgICBjb25zdCBpbWFnID0gemVyb3Moc2hhcGUsICdmbG9hdDMyJyk7XG4gICAgICAgIHJldHVybiBjb21wbGV4KHJlYWwsIGltYWcpO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZXMgPSBtYWtlT25lc1R5cGVkQXJyYXkoc2l6ZUZyb21TaGFwZShzaGFwZSksIGR0eXBlKTtcbiAgICByZXR1cm4gRU5HSU5FLm1ha2VUZW5zb3IodmFsdWVzLCBzaGFwZSwgZHR5cGUpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b25lcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgT25lc0xpa2UgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDcmVhdGVzIGEgYHRmLlRlbnNvcmAgd2l0aCBhbGwgZWxlbWVudHMgc2V0IHRvIDEgd2l0aCB0aGUgc2FtZSBzaGFwZSBhcyB0aGVcbiAqIGdpdmVuIHRlbnNvci5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcihbMSwgMl0pO1xuICogdGYub25lc0xpa2UoeCkucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIHggQSB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5mdW5jdGlvbiBvbmVzTGlrZV8oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ29uZXNMaWtlJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKE9uZXNMaWtlLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IG9uZXNMaWtlID0gb3AoeyBvbmVzTGlrZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1vbmVzX2xpa2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IGlzUHJvbWlzZSB9IGZyb20gJy4uL3V0aWwnO1xuZXhwb3J0IGNvbnN0IE9QX1NDT1BFX1NVRkZJWCA9ICdfX29wJztcbi8qKlxuICogVXNlZCBmb3Igd3JhcHBpbmcgZnVuY3Rpb25zIHRoYXQgcGVyZm9ybSBtYXRoIG9wZXJhdGlvbnMgb25cbiAqIFRlbnNvcnMuIFRoZSBmdW5jdGlvbiB3aWxsIGJlIHdyYXBwZWQgaW4gYSBuYW1lZCBzY29wZSB0aGF0IGNsZWFucyBhbGxcbiAqIG1lbW9yeSB1c2FnZSBhZnRlciB0aGUgZnVuY3Rpb24gaXMgZG9uZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wKGYpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZik7XG4gICAgaWYgKGtleXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUGxlYXNlIHByb3ZpZGUgYW4gb2JqZWN0IHdpdGggYSBzaW5nbGUga2V5IGAgK1xuICAgICAgICAgICAgYChvcGVyYXRpb24gbmFtZSkgbWFwcGluZyB0byBhIGZ1bmN0aW9uLiBHb3QgYW4gb2JqZWN0IHdpdGggYCArXG4gICAgICAgICAgICBgJHtrZXlzLmxlbmd0aH0ga2V5cy5gKTtcbiAgICB9XG4gICAgbGV0IG9wTmFtZSA9IGtleXNbMF07XG4gICAgY29uc3QgZm4gPSBmW29wTmFtZV07XG4gICAgLy8gU3RyaXAgdGhlIHVuZGVyc2NvcmUgZnJvbSB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbiBuYW1lLlxuICAgIGlmIChvcE5hbWUuZW5kc1dpdGgoJ18nKSkge1xuICAgICAgICBvcE5hbWUgPSBvcE5hbWUuc3Vic3RyaW5nKDAsIG9wTmFtZS5sZW5ndGggLSAxKTtcbiAgICB9XG4gICAgLy8gYWRkIGFuIF9fb3Agc3VmZml4IHRvIGRpc3Rpbmd1aXNoIG9wcyBmcm9tIGtlcm5lbHMgaW4gdGYucHJvZmlsZVxuICAgIG9wTmFtZSA9IG9wTmFtZSArIE9QX1NDT1BFX1NVRkZJWDtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgY29uc3QgZjIgPSAoLi4uYXJncykgPT4ge1xuICAgICAgICBFTkdJTkUuc3RhcnRTY29wZShvcE5hbWUpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZm4oLi4uYXJncyk7XG4gICAgICAgICAgICBpZiAoaXNQcm9taXNlKHJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdDYW5ub3QgcmV0dXJuIGEgUHJvbWlzZSBpbnNpZGUgb2YgdGlkeS4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEVOR0lORS5lbmRTY29wZShyZXN1bHQpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgIEVOR0lORS5lbmRTY29wZShudWxsKTtcbiAgICAgICAgICAgIHRocm93IGV4O1xuICAgICAgICB9XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZjIsICduYW1lJywgeyB2YWx1ZTogb3BOYW1lLCBjb25maWd1cmFibGU6IHRydWUgfSk7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgIHJldHVybiBmMjtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW9wZXJhdGlvbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vLyBNb2R1bGFyaXplZCBvcHMuXG5leHBvcnQgeyBhYnMgfSBmcm9tICcuL2Ficyc7XG5leHBvcnQgeyBhY29zIH0gZnJvbSAnLi9hY29zJztcbmV4cG9ydCB7IGFjb3NoIH0gZnJvbSAnLi9hY29zaCc7XG5leHBvcnQgeyBhZGQgfSBmcm9tICcuL2FkZCc7XG5leHBvcnQgeyBhZGROIH0gZnJvbSAnLi9hZGRfbic7XG5leHBvcnQgeyBhbGwgfSBmcm9tICcuL2FsbCc7XG5leHBvcnQgeyBhbnkgfSBmcm9tICcuL2FueSc7XG5leHBvcnQgeyBhcmdNYXggfSBmcm9tICcuL2FyZ19tYXgnO1xuZXhwb3J0IHsgYXJnTWluIH0gZnJvbSAnLi9hcmdfbWluJztcbmV4cG9ydCB7IGFzaW4gfSBmcm9tICcuL2FzaW4nO1xuZXhwb3J0IHsgYXNpbmggfSBmcm9tICcuL2FzaW5oJztcbmV4cG9ydCB7IGF0YW4gfSBmcm9tICcuL2F0YW4nO1xuZXhwb3J0IHsgYXRhbjIgfSBmcm9tICcuL2F0YW4yJztcbmV4cG9ydCB7IGF0YW5oIH0gZnJvbSAnLi9hdGFuaCc7XG5leHBvcnQgeyBhdmdQb29sIH0gZnJvbSAnLi9hdmdfcG9vbCc7XG5leHBvcnQgeyBhdmdQb29sM2QgfSBmcm9tICcuL2F2Z19wb29sXzNkJztcbmV4cG9ydCB7IGJhc2ljTFNUTUNlbGwgfSBmcm9tICcuL2Jhc2ljX2xzdG1fY2VsbCc7XG5leHBvcnQgeyBiYXRjaFRvU3BhY2VORCB9IGZyb20gJy4vYmF0Y2hfdG9fc3BhY2VfbmQnO1xuZXhwb3J0IHsgYmF0Y2hOb3JtIH0gZnJvbSAnLi9iYXRjaG5vcm0nO1xuZXhwb3J0IHsgYmF0Y2hOb3JtMmQgfSBmcm9tICcuL2JhdGNobm9ybTJkJztcbmV4cG9ydCB7IGJhdGNoTm9ybTNkIH0gZnJvbSAnLi9iYXRjaG5vcm0zZCc7XG5leHBvcnQgeyBiYXRjaE5vcm00ZCB9IGZyb20gJy4vYmF0Y2hub3JtNGQnO1xuZXhwb3J0IHsgYmluY291bnQgfSBmcm9tICcuL2JpbmNvdW50JztcbmV4cG9ydCB7IGJyb2FkY2FzdFRvIH0gZnJvbSAnLi9icm9hZGNhc3RfdG8nO1xuZXhwb3J0IHsgYnVmZmVyIH0gZnJvbSAnLi9idWZmZXInO1xuZXhwb3J0IHsgY2FzdCB9IGZyb20gJy4vY2FzdCc7XG5leHBvcnQgeyBjZWlsIH0gZnJvbSAnLi9jZWlsJztcbmV4cG9ydCB7IGNsaXBCeVZhbHVlIH0gZnJvbSAnLi9jbGlwX2J5X3ZhbHVlJztcbmV4cG9ydCB7IGNsb25lIH0gZnJvbSAnLi9jbG9uZSc7XG5leHBvcnQgeyBjb21wbGV4IH0gZnJvbSAnLi9jb21wbGV4JztcbmV4cG9ydCB7IGNvbmNhdCB9IGZyb20gJy4vY29uY2F0JztcbmV4cG9ydCB7IGNvbmNhdDFkIH0gZnJvbSAnLi9jb25jYXRfMWQnO1xuZXhwb3J0IHsgY29uY2F0MmQgfSBmcm9tICcuL2NvbmNhdF8yZCc7XG5leHBvcnQgeyBjb25jYXQzZCB9IGZyb20gJy4vY29uY2F0XzNkJztcbmV4cG9ydCB7IGNvbmNhdDRkIH0gZnJvbSAnLi9jb25jYXRfNGQnO1xuZXhwb3J0IHsgY29udjFkIH0gZnJvbSAnLi9jb252MWQnO1xuZXhwb3J0IHsgY29udjJkIH0gZnJvbSAnLi9jb252MmQnO1xuZXhwb3J0IHsgY29udjJkVHJhbnNwb3NlIH0gZnJvbSAnLi9jb252MmRfdHJhbnNwb3NlJztcbmV4cG9ydCB7IGNvbnYzZCB9IGZyb20gJy4vY29udjNkJztcbmV4cG9ydCB7IGNvbnYzZFRyYW5zcG9zZSB9IGZyb20gJy4vY29udjNkX3RyYW5zcG9zZSc7XG5leHBvcnQgeyBjb3MgfSBmcm9tICcuL2Nvcyc7XG5leHBvcnQgeyBjb3NoIH0gZnJvbSAnLi9jb3NoJztcbmV4cG9ydCB7IGN1bXN1bSB9IGZyb20gJy4vY3Vtc3VtJztcbmV4cG9ydCB7IGRlbnNlQmluY291bnQgfSBmcm9tICcuL2RlbnNlX2JpbmNvdW50JztcbmV4cG9ydCB7IGRlcHRoVG9TcGFjZSB9IGZyb20gJy4vZGVwdGhfdG9fc3BhY2UnO1xuZXhwb3J0IHsgZGVwdGh3aXNlQ29udjJkIH0gZnJvbSAnLi9kZXB0aHdpc2VfY29udjJkJztcbmV4cG9ydCB7IGRpYWcgfSBmcm9tICcuL2RpYWcnO1xuZXhwb3J0IHsgZGlsYXRpb24yZCB9IGZyb20gJy4vZGlsYXRpb24yZCc7XG5leHBvcnQgeyBkaXYgfSBmcm9tICcuL2Rpdic7XG5leHBvcnQgeyBkaXZOb05hbiB9IGZyb20gJy4vZGl2X25vX25hbic7XG5leHBvcnQgeyBkb3QgfSBmcm9tICcuL2RvdCc7XG5leHBvcnQgeyBlaW5zdW0gfSBmcm9tICcuL2VpbnN1bSc7XG5leHBvcnQgeyBlbHUgfSBmcm9tICcuL2VsdSc7XG5leHBvcnQgeyBlcXVhbCB9IGZyb20gJy4vZXF1YWwnO1xuZXhwb3J0IHsgZXJmIH0gZnJvbSAnLi9lcmYnO1xuZXhwb3J0IHsgZXhwIH0gZnJvbSAnLi9leHAnO1xuZXhwb3J0IHsgZXhwYW5kRGltcyB9IGZyb20gJy4vZXhwYW5kX2RpbXMnO1xuZXhwb3J0IHsgZXhwbTEgfSBmcm9tICcuL2V4cG0xJztcbmV4cG9ydCB7IGV5ZSB9IGZyb20gJy4vZXllJztcbmV4cG9ydCB7IGZpbGwgfSBmcm9tICcuL2ZpbGwnO1xuZXhwb3J0IHsgZmxvb3IgfSBmcm9tICcuL2Zsb29yJztcbmV4cG9ydCB7IGZsb29yRGl2IH0gZnJvbSAnLi9mbG9vckRpdic7XG5leHBvcnQgeyBnYXRoZXIgfSBmcm9tICcuL2dhdGhlcic7XG5leHBvcnQgeyBncmVhdGVyIH0gZnJvbSAnLi9ncmVhdGVyJztcbmV4cG9ydCB7IGdyZWF0ZXJFcXVhbCB9IGZyb20gJy4vZ3JlYXRlcl9lcXVhbCc7XG5leHBvcnQgeyBpbWFnIH0gZnJvbSAnLi9pbWFnJztcbmV4cG9ydCB7IGlzRmluaXRlIH0gZnJvbSAnLi9pc19maW5pdGUnO1xuZXhwb3J0IHsgaXNJbmYgfSBmcm9tICcuL2lzX2luZic7XG5leHBvcnQgeyBpc05hTiB9IGZyb20gJy4vaXNfbmFuJztcbmV4cG9ydCB7IGxlYWt5UmVsdSB9IGZyb20gJy4vbGVha3lfcmVsdSc7XG5leHBvcnQgeyBsZXNzIH0gZnJvbSAnLi9sZXNzJztcbmV4cG9ydCB7IGxlc3NFcXVhbCB9IGZyb20gJy4vbGVzc19lcXVhbCc7XG5leHBvcnQgeyBsaW5zcGFjZSB9IGZyb20gJy4vbGluc3BhY2UnO1xuZXhwb3J0IHsgbG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb24gfSBmcm9tICcuL2xvY2FsX3Jlc3BvbnNlX25vcm1hbGl6YXRpb24nO1xuZXhwb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cnO1xuZXhwb3J0IHsgbG9nMXAgfSBmcm9tICcuL2xvZzFwJztcbmV4cG9ydCB7IGxvZ1NpZ21vaWQgfSBmcm9tICcuL2xvZ19zaWdtb2lkJztcbmV4cG9ydCB7IGxvZ1NvZnRtYXggfSBmcm9tICcuL2xvZ19zb2Z0bWF4JztcbmV4cG9ydCB7IGxvZ1N1bUV4cCB9IGZyb20gJy4vbG9nX3N1bV9leHAnO1xuZXhwb3J0IHsgbG9naWNhbEFuZCB9IGZyb20gJy4vbG9naWNhbF9hbmQnO1xuZXhwb3J0IHsgbG9naWNhbE5vdCB9IGZyb20gJy4vbG9naWNhbF9ub3QnO1xuZXhwb3J0IHsgbG9naWNhbE9yIH0gZnJvbSAnLi9sb2dpY2FsX29yJztcbmV4cG9ydCB7IGxvZ2ljYWxYb3IgfSBmcm9tICcuL2xvZ2ljYWxfeG9yJztcbmV4cG9ydCB7IG1hdE11bCB9IGZyb20gJy4vbWF0X211bCc7XG5leHBvcnQgeyBtYXggfSBmcm9tICcuL21heCc7XG5leHBvcnQgeyBtYXhQb29sIH0gZnJvbSAnLi9tYXhfcG9vbCc7XG5leHBvcnQgeyBtYXhQb29sM2QgfSBmcm9tICcuL21heF9wb29sXzNkJztcbmV4cG9ydCB7IG1heFBvb2xXaXRoQXJnbWF4IH0gZnJvbSAnLi9tYXhfcG9vbF93aXRoX2FyZ21heCc7XG5leHBvcnQgeyBtYXhpbXVtIH0gZnJvbSAnLi9tYXhpbXVtJztcbmV4cG9ydCB7IG1lYW4gfSBmcm9tICcuL21lYW4nO1xuZXhwb3J0IHsgbWVzaGdyaWQgfSBmcm9tICcuL21lc2hncmlkJztcbmV4cG9ydCB7IG1pbiB9IGZyb20gJy4vbWluJztcbmV4cG9ydCB7IG1pbmltdW0gfSBmcm9tICcuL21pbmltdW0nO1xuZXhwb3J0IHsgbWlycm9yUGFkIH0gZnJvbSAnLi9taXJyb3JfcGFkJztcbmV4cG9ydCB7IG1vZCB9IGZyb20gJy4vbW9kJztcbmV4cG9ydCB7IG1vbWVudHMgfSBmcm9tICcuL21vbWVudHMnO1xuZXhwb3J0IHsgbXVsIH0gZnJvbSAnLi9tdWwnO1xuZXhwb3J0IHsgbXVsdGlSTk5DZWxsIH0gZnJvbSAnLi9tdWx0aV9ybm5fY2VsbCc7XG5leHBvcnQgeyBtdWx0aW5vbWlhbCB9IGZyb20gJy4vbXVsdGlub21pYWwnO1xuZXhwb3J0IHsgbmVnIH0gZnJvbSAnLi9uZWcnO1xuZXhwb3J0IHsgbm90RXF1YWwgfSBmcm9tICcuL25vdF9lcXVhbCc7XG5leHBvcnQgeyBvbmVIb3QgfSBmcm9tICcuL29uZV9ob3QnO1xuZXhwb3J0IHsgb25lcyB9IGZyb20gJy4vb25lcyc7XG5leHBvcnQgeyBvbmVzTGlrZSB9IGZyb20gJy4vb25lc19saWtlJztcbmV4cG9ydCB7IG91dGVyUHJvZHVjdCB9IGZyb20gJy4vb3V0ZXJfcHJvZHVjdCc7XG5leHBvcnQgeyBwYWQgfSBmcm9tICcuL3BhZCc7XG5leHBvcnQgeyBwYWQxZCB9IGZyb20gJy4vcGFkMWQnO1xuZXhwb3J0IHsgcGFkMmQgfSBmcm9tICcuL3BhZDJkJztcbmV4cG9ydCB7IHBhZDNkIH0gZnJvbSAnLi9wYWQzZCc7XG5leHBvcnQgeyBwYWQ0ZCB9IGZyb20gJy4vcGFkNGQnO1xuZXhwb3J0IHsgcG9vbCB9IGZyb20gJy4vcG9vbCc7XG5leHBvcnQgeyBwb3cgfSBmcm9tICcuL3Bvdyc7XG5leHBvcnQgeyBwcmVsdSB9IGZyb20gJy4vcHJlbHUnO1xuZXhwb3J0IHsgcHJpbnQgfSBmcm9tICcuL3ByaW50JztcbmV4cG9ydCB7IHByb2QgfSBmcm9tICcuL3Byb2QnO1xuZXhwb3J0IHsgcmFuZCB9IGZyb20gJy4vcmFuZCc7XG5leHBvcnQgeyByYW5kb21HYW1tYSB9IGZyb20gJy4vcmFuZG9tX2dhbW1hJztcbmV4cG9ydCB7IHJhbmRvbU5vcm1hbCB9IGZyb20gJy4vcmFuZG9tX25vcm1hbCc7XG5leHBvcnQgeyByYW5kb21Vbmlmb3JtIH0gZnJvbSAnLi9yYW5kb21fdW5pZm9ybSc7XG5leHBvcnQgeyByYW5nZSB9IGZyb20gJy4vcmFuZ2UnO1xuZXhwb3J0IHsgcmVhbCB9IGZyb20gJy4vcmVhbCc7XG5leHBvcnQgeyByZWNpcHJvY2FsIH0gZnJvbSAnLi9yZWNpcHJvY2FsJztcbmV4cG9ydCB7IHJlbHUgfSBmcm9tICcuL3JlbHUnO1xuZXhwb3J0IHsgcmVsdTYgfSBmcm9tICcuL3JlbHU2JztcbmV4cG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL3Jlc2hhcGUnO1xuZXhwb3J0IHsgcmV2ZXJzZSB9IGZyb20gJy4vcmV2ZXJzZSc7XG5leHBvcnQgeyByZXZlcnNlMWQgfSBmcm9tICcuL3JldmVyc2VfMWQnO1xuZXhwb3J0IHsgcmV2ZXJzZTJkIH0gZnJvbSAnLi9yZXZlcnNlXzJkJztcbmV4cG9ydCB7IHJldmVyc2UzZCB9IGZyb20gJy4vcmV2ZXJzZV8zZCc7XG5leHBvcnQgeyByZXZlcnNlNGQgfSBmcm9tICcuL3JldmVyc2VfNGQnO1xuZXhwb3J0IHsgcm91bmQgfSBmcm9tICcuL3JvdW5kJztcbmV4cG9ydCB7IHJzcXJ0IH0gZnJvbSAnLi9yc3FydCc7XG5leHBvcnQgeyBzY2FsYXIgfSBmcm9tICcuL3NjYWxhcic7XG5leHBvcnQgeyBzZWx1IH0gZnJvbSAnLi9zZWx1JztcbmV4cG9ydCB7IHNlcGFyYWJsZUNvbnYyZCB9IGZyb20gJy4vc2VwYXJhYmxlX2NvbnYyZCc7XG5leHBvcnQgeyBzZXRkaWZmMWRBc3luYyB9IGZyb20gJy4vc2V0ZGlmZjFkX2FzeW5jJztcbmV4cG9ydCB7IHNpZ21vaWQgfSBmcm9tICcuL3NpZ21vaWQnO1xuZXhwb3J0IHsgc2lnbiB9IGZyb20gJy4vc2lnbic7XG5leHBvcnQgeyBzaW4gfSBmcm9tICcuL3Npbic7XG5leHBvcnQgeyBzaW5oIH0gZnJvbSAnLi9zaW5oJztcbmV4cG9ydCB7IHNsaWNlIH0gZnJvbSAnLi9zbGljZSc7XG5leHBvcnQgeyBzbGljZTFkIH0gZnJvbSAnLi9zbGljZTFkJztcbmV4cG9ydCB7IHNsaWNlMmQgfSBmcm9tICcuL3NsaWNlMmQnO1xuZXhwb3J0IHsgc2xpY2UzZCB9IGZyb20gJy4vc2xpY2UzZCc7XG5leHBvcnQgeyBzbGljZTRkIH0gZnJvbSAnLi9zbGljZTRkJztcbmV4cG9ydCB7IHNvZnRtYXggfSBmcm9tICcuL3NvZnRtYXgnO1xuZXhwb3J0IHsgc29mdHBsdXMgfSBmcm9tICcuL3NvZnRwbHVzJztcbmV4cG9ydCB7IHNwYWNlVG9CYXRjaE5EIH0gZnJvbSAnLi9zcGFjZV90b19iYXRjaF9uZCc7XG5leHBvcnQgeyBmZnQgfSBmcm9tICcuL3NwZWN0cmFsL2ZmdCc7XG5leHBvcnQgeyBpZmZ0IH0gZnJvbSAnLi9zcGVjdHJhbC9pZmZ0JztcbmV4cG9ydCB7IGlyZmZ0IH0gZnJvbSAnLi9zcGVjdHJhbC9pcmZmdCc7XG5leHBvcnQgeyByZmZ0IH0gZnJvbSAnLi9zcGVjdHJhbC9yZmZ0JztcbmV4cG9ydCB7IHNwbGl0IH0gZnJvbSAnLi9zcGxpdCc7XG5leHBvcnQgeyBzcXJ0IH0gZnJvbSAnLi9zcXJ0JztcbmV4cG9ydCB7IHNxdWFyZSB9IGZyb20gJy4vc3F1YXJlJztcbmV4cG9ydCB7IHNxdWFyZWREaWZmZXJlbmNlIH0gZnJvbSAnLi9zcXVhcmVkX2RpZmZlcmVuY2UnO1xuZXhwb3J0IHsgc3F1ZWV6ZSB9IGZyb20gJy4vc3F1ZWV6ZSc7XG5leHBvcnQgeyBzdGFjayB9IGZyb20gJy4vc3RhY2snO1xuZXhwb3J0IHsgc3RlcCB9IGZyb20gJy4vc3RlcCc7XG5leHBvcnQgeyBzdHJpZGVkU2xpY2UgfSBmcm9tICcuL3N0cmlkZWRfc2xpY2UnO1xuZXhwb3J0IHsgc3ViIH0gZnJvbSAnLi9zdWInO1xuZXhwb3J0IHsgc3VtIH0gZnJvbSAnLi9zdW0nO1xuZXhwb3J0IHsgdGFuIH0gZnJvbSAnLi90YW4nO1xuZXhwb3J0IHsgdGFuaCB9IGZyb20gJy4vdGFuaCc7XG5leHBvcnQgeyB0ZW5zb3IgfSBmcm9tICcuL3RlbnNvcic7XG5leHBvcnQgeyB0ZW5zb3IxZCB9IGZyb20gJy4vdGVuc29yMWQnO1xuZXhwb3J0IHsgdGVuc29yMmQgfSBmcm9tICcuL3RlbnNvcjJkJztcbmV4cG9ydCB7IHRlbnNvcjNkIH0gZnJvbSAnLi90ZW5zb3IzZCc7XG5leHBvcnQgeyB0ZW5zb3I0ZCB9IGZyb20gJy4vdGVuc29yNGQnO1xuZXhwb3J0IHsgdGVuc29yNWQgfSBmcm9tICcuL3RlbnNvcjVkJztcbmV4cG9ydCB7IHRlbnNvcjZkIH0gZnJvbSAnLi90ZW5zb3I2ZCc7XG5leHBvcnQgeyB0aWxlIH0gZnJvbSAnLi90aWxlJztcbmV4cG9ydCB7IHRvcGsgfSBmcm9tICcuL3RvcGsnO1xuZXhwb3J0IHsgdHJ1bmNhdGVkTm9ybWFsIH0gZnJvbSAnLi90cnVuY2F0ZWRfbm9ybWFsJztcbmV4cG9ydCB7IHVuaXF1ZSB9IGZyb20gJy4vdW5pcXVlJztcbmV4cG9ydCB7IHVuc29ydGVkU2VnbWVudFN1bSB9IGZyb20gJy4vdW5zb3J0ZWRfc2VnbWVudF9zdW0nO1xuZXhwb3J0IHsgdW5zdGFjayB9IGZyb20gJy4vdW5zdGFjayc7XG5leHBvcnQgeyB2YXJpYWJsZSB9IGZyb20gJy4vdmFyaWFibGUnO1xuZXhwb3J0IHsgd2hlcmUgfSBmcm9tICcuL3doZXJlJztcbmV4cG9ydCB7IHdoZXJlQXN5bmMgfSBmcm9tICcuL3doZXJlX2FzeW5jJztcbmV4cG9ydCB7IHplcm9zIH0gZnJvbSAnLi96ZXJvcyc7XG5leHBvcnQgeyB6ZXJvc0xpa2UgfSBmcm9tICcuL3plcm9zX2xpa2UnO1xuZXhwb3J0ICogZnJvbSAnLi9ib29sZWFuX21hc2snO1xuZXhwb3J0ICogZnJvbSAnLi90cmFuc3Bvc2UnO1xuZXhwb3J0ICogZnJvbSAnLi9ub3JtJztcbmV4cG9ydCAqIGZyb20gJy4vbW92aW5nX2F2ZXJhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9zY2F0dGVyX25kJztcbmV4cG9ydCAqIGZyb20gJy4vc3BhcnNlX3RvX2RlbnNlJztcbmV4cG9ydCAqIGZyb20gJy4vZ2F0aGVyX25kJztcbmV4cG9ydCAqIGZyb20gJy4vZHJvcG91dCc7XG5leHBvcnQgKiBmcm9tICcuL3NpZ25hbF9vcHNfdXRpbCc7XG5leHBvcnQgKiBmcm9tICcuL2luX3RvcF9rJztcbmV4cG9ydCB7IG9wLCBPUF9TQ09QRV9TVUZGSVggfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZmZ0IH0gZnJvbSAnLi9zcGVjdHJhbC9yZmZ0JztcbmltcG9ydCB7IGZmdCB9IGZyb20gJy4vc3BlY3RyYWwvZmZ0JztcbmltcG9ydCB7IGlmZnQgfSBmcm9tICcuL3NwZWN0cmFsL2lmZnQnO1xuaW1wb3J0IHsgaXJmZnQgfSBmcm9tICcuL3NwZWN0cmFsL2lyZmZ0JztcbmNvbnN0IHNwZWN0cmFsID0ge1xuICAgIGZmdCxcbiAgICBpZmZ0LFxuICAgIHJmZnQsXG4gICAgaXJmZnRcbn07XG5pbXBvcnQgKiBhcyBmdXNlZCBmcm9tICcuL2Z1c2VkX29wcyc7XG5pbXBvcnQgeyBoYW1taW5nV2luZG93IH0gZnJvbSAnLi9zaWduYWwvaGFtbWluZ193aW5kb3cnO1xuaW1wb3J0IHsgaGFubldpbmRvdyB9IGZyb20gJy4vc2lnbmFsL2hhbm5fd2luZG93JztcbmltcG9ydCB7IGZyYW1lIH0gZnJvbSAnLi9zaWduYWwvZnJhbWUnO1xuaW1wb3J0IHsgc3RmdCB9IGZyb20gJy4vc2lnbmFsL3N0ZnQnO1xuY29uc3Qgc2lnbmFsID0ge1xuICAgIGhhbW1pbmdXaW5kb3csXG4gICAgaGFubldpbmRvdyxcbiAgICBmcmFtZSxcbiAgICBzdGZ0LFxufTtcbi8vIEltYWdlIE9wcyBuYW1lc3BhY2VcbmltcG9ydCB7IGNyb3BBbmRSZXNpemUgfSBmcm9tICcuL2ltYWdlL2Nyb3BfYW5kX3Jlc2l6ZSc7XG5pbXBvcnQgeyBmbGlwTGVmdFJpZ2h0IH0gZnJvbSAnLi9pbWFnZS9mbGlwX2xlZnRfcmlnaHQnO1xuaW1wb3J0IHsgcm90YXRlV2l0aE9mZnNldCB9IGZyb20gJy4vaW1hZ2Uvcm90YXRlX3dpdGhfb2Zmc2V0JztcbmltcG9ydCB7IG5vbk1heFN1cHByZXNzaW9uIH0gZnJvbSAnLi9pbWFnZS9ub25fbWF4X3N1cHByZXNzaW9uJztcbmltcG9ydCB7IG5vbk1heFN1cHByZXNzaW9uQXN5bmMgfSBmcm9tICcuL2ltYWdlL25vbl9tYXhfc3VwcHJlc3Npb25fYXN5bmMnO1xuaW1wb3J0IHsgbm9uTWF4U3VwcHJlc3Npb25XaXRoU2NvcmUgfSBmcm9tICcuL2ltYWdlL25vbl9tYXhfc3VwcHJlc3Npb25fd2l0aF9zY29yZSc7XG5pbXBvcnQgeyBub25NYXhTdXBwcmVzc2lvbldpdGhTY29yZUFzeW5jIH0gZnJvbSAnLi9pbWFnZS9ub25fbWF4X3N1cHByZXNzaW9uX3dpdGhfc2NvcmVfYXN5bmMnO1xuaW1wb3J0IHsgbm9uTWF4U3VwcHJlc3Npb25QYWRkZWQgfSBmcm9tICcuL2ltYWdlL25vbl9tYXhfc3VwcHJlc3Npb25fcGFkZGVkJztcbmltcG9ydCB7IG5vbk1heFN1cHByZXNzaW9uUGFkZGVkQXN5bmMgfSBmcm9tICcuL2ltYWdlL25vbl9tYXhfc3VwcHJlc3Npb25fcGFkZGVkX2FzeW5jJztcbmltcG9ydCB7IHJlc2l6ZUJpbGluZWFyIH0gZnJvbSAnLi9pbWFnZS9yZXNpemVfYmlsaW5lYXInO1xuaW1wb3J0IHsgcmVzaXplTmVhcmVzdE5laWdoYm9yIH0gZnJvbSAnLi9pbWFnZS9yZXNpemVfbmVhcmVzdF9uZWlnaGJvcic7XG5pbXBvcnQgeyB0aHJlc2hvbGQgfSBmcm9tICcuL2ltYWdlL3RocmVzaG9sZCc7XG5pbXBvcnQgeyB0cmFuc2Zvcm0gfSBmcm9tICcuL2ltYWdlL3RyYW5zZm9ybSc7XG5jb25zdCBpbWFnZSA9IHtcbiAgICBmbGlwTGVmdFJpZ2h0LFxuICAgIHJlc2l6ZU5lYXJlc3ROZWlnaGJvcixcbiAgICByZXNpemVCaWxpbmVhcixcbiAgICByb3RhdGVXaXRoT2Zmc2V0LFxuICAgIGNyb3BBbmRSZXNpemUsXG4gICAgbm9uTWF4U3VwcHJlc3Npb24sXG4gICAgbm9uTWF4U3VwcHJlc3Npb25Bc3luYyxcbiAgICBub25NYXhTdXBwcmVzc2lvbldpdGhTY29yZSxcbiAgICBub25NYXhTdXBwcmVzc2lvbldpdGhTY29yZUFzeW5jLFxuICAgIG5vbk1heFN1cHByZXNzaW9uUGFkZGVkLFxuICAgIG5vbk1heFN1cHByZXNzaW9uUGFkZGVkQXN5bmMsXG4gICAgdGhyZXNob2xkLFxuICAgIHRyYW5zZm9ybVxufTtcbi8vIGxpbmFsZyBuYW1lc3BhY2VcbmltcG9ydCB7IGJhbmRQYXJ0IH0gZnJvbSAnLi9saW5hbGcvYmFuZF9wYXJ0JztcbmltcG9ydCB7IGdyYW1TY2htaWR0IH0gZnJvbSAnLi9saW5hbGcvZ3JhbV9zY2htaWR0JztcbmltcG9ydCB7IHFyIH0gZnJvbSAnLi9saW5hbGcvcXInO1xuY29uc3QgbGluYWxnID0ge1xuICAgIGJhbmRQYXJ0LFxuICAgIGdyYW1TY2htaWR0LFxuICAgIHFyXG59O1xuLy8gbG9zc2VzIG5hbWVzcGFjZTtcbmltcG9ydCB7IGFic29sdXRlRGlmZmVyZW5jZSB9IGZyb20gJy4vbG9zc2VzL2Fic29sdXRlX2RpZmZlcmVuY2UnO1xuaW1wb3J0IHsgY29tcHV0ZVdlaWdodGVkTG9zcyB9IGZyb20gJy4vbG9zc2VzL2NvbXB1dGVfd2VpZ2h0ZWRfbG9zcyc7XG5pbXBvcnQgeyBjb3NpbmVEaXN0YW5jZSB9IGZyb20gJy4vbG9zc2VzL2Nvc2luZV9kaXN0YW5jZSc7XG5pbXBvcnQgeyBoaW5nZUxvc3MgfSBmcm9tICcuL2xvc3Nlcy9oaW5nZV9sb3NzJztcbmltcG9ydCB7IGh1YmVyTG9zcyB9IGZyb20gJy4vbG9zc2VzL2h1YmVyX2xvc3MnO1xuaW1wb3J0IHsgbG9nTG9zcyB9IGZyb20gJy4vbG9zc2VzL2xvZ19sb3NzJztcbmltcG9ydCB7IG1lYW5TcXVhcmVkRXJyb3IgfSBmcm9tICcuL2xvc3Nlcy9tZWFuX3NxdWFyZWRfZXJyb3InO1xuaW1wb3J0IHsgc2lnbW9pZENyb3NzRW50cm9weSB9IGZyb20gJy4vbG9zc2VzL3NpZ21vaWRfY3Jvc3NfZW50cm9weSc7XG5pbXBvcnQgeyBzb2Z0bWF4Q3Jvc3NFbnRyb3B5IH0gZnJvbSAnLi9sb3NzZXMvc29mdG1heF9jcm9zc19lbnRyb3B5JztcbmNvbnN0IGxvc3NlcyA9IHtcbiAgICBhYnNvbHV0ZURpZmZlcmVuY2UsXG4gICAgY29tcHV0ZVdlaWdodGVkTG9zcyxcbiAgICBjb3NpbmVEaXN0YW5jZSxcbiAgICBoaW5nZUxvc3MsXG4gICAgaHViZXJMb3NzLFxuICAgIGxvZ0xvc3MsXG4gICAgbWVhblNxdWFyZWRFcnJvcixcbiAgICBzaWdtb2lkQ3Jvc3NFbnRyb3B5LFxuICAgIHNvZnRtYXhDcm9zc0VudHJvcHlcbn07XG5pbXBvcnQgeyBzcGFyc2VGaWxsRW1wdHlSb3dzIH0gZnJvbSAnLi9zcGFyc2Uvc3BhcnNlX2ZpbGxfZW1wdHlfcm93cyc7XG5pbXBvcnQgeyBzcGFyc2VSZXNoYXBlIH0gZnJvbSAnLi9zcGFyc2Uvc3BhcnNlX3Jlc2hhcGUnO1xuaW1wb3J0IHsgc3BhcnNlU2VnbWVudE1lYW4gfSBmcm9tICcuL3NwYXJzZS9zcGFyc2Vfc2VnbWVudF9tZWFuJztcbmltcG9ydCB7IHNwYXJzZVNlZ21lbnRTdW0gfSBmcm9tICcuL3NwYXJzZS9zcGFyc2Vfc2VnbWVudF9zdW0nO1xuY29uc3Qgc3BhcnNlID0ge1xuICAgIHNwYXJzZUZpbGxFbXB0eVJvd3MsXG4gICAgc3BhcnNlUmVzaGFwZSxcbiAgICBzcGFyc2VTZWdtZW50TWVhbixcbiAgICBzcGFyc2VTZWdtZW50U3VtXG59O1xuaW1wb3J0IHsgc3RyaW5nTkdyYW1zIH0gZnJvbSAnLi9zdHJpbmcvc3RyaW5nX25fZ3JhbXMnO1xuaW1wb3J0IHsgc3RyaW5nU3BsaXQgfSBmcm9tICcuL3N0cmluZy9zdHJpbmdfc3BsaXQnO1xuaW1wb3J0IHsgc3RyaW5nVG9IYXNoQnVja2V0RmFzdCB9IGZyb20gJy4vc3RyaW5nL3N0cmluZ190b19oYXNoX2J1Y2tldF9mYXN0Jztcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXG5jb25zdCBzdHJpbmcgPSB7XG4gICAgc3RyaW5nTkdyYW1zLFxuICAgIHN0cmluZ1NwbGl0LFxuICAgIHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3Rcbn07XG4vLyBTZWNvbmQgbGV2ZWwgZXhwb3J0cy5cbmV4cG9ydCB7IGltYWdlLCBsaW5hbGcsIGxvc3Nlcywgc3BlY3RyYWwsIGZ1c2VkLCBzaWduYWwsIHNwYXJzZSwgc3RyaW5nIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1vcHMuanMubWFwIiwiaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBtYXRNdWwgfSBmcm9tICcuL21hdF9tdWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIG91dGVyIHByb2R1Y3Qgb2YgdHdvIHZlY3RvcnMsIGB2MWAgYW5kIGB2MmAuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFszLCA0LCA1XSk7XG4gKlxuICogdGYub3V0ZXJQcm9kdWN0KGEsIGIpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSB2MSBUaGUgZmlyc3QgdmVjdG9yIGluIHRoZSBvdXRlciBwcm9kdWN0IG9wZXJhdGlvbi5cbiAqIEBwYXJhbSB2MiBUaGUgc2Vjb25kIHZlY3RvciBpbiB0aGUgb3V0ZXIgcHJvZHVjdCBvcGVyYXRpb24uXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTWF0cmljZXMnfVxuICovXG5mdW5jdGlvbiBvdXRlclByb2R1Y3RfKHYxLCB2Mikge1xuICAgIGNvbnN0ICR2MSA9IGNvbnZlcnRUb1RlbnNvcih2MSwgJ3YxJywgJ291dGVyUHJvZHVjdCcpO1xuICAgIGNvbnN0ICR2MiA9IGNvbnZlcnRUb1RlbnNvcih2MiwgJ3YyJywgJ291dGVyUHJvZHVjdCcpO1xuICAgIHV0aWwuYXNzZXJ0KCR2MS5yYW5rID09PSAxICYmICR2Mi5yYW5rID09PSAxLCAoKSA9PiBgRXJyb3IgaW4gb3V0ZXJQcm9kdWN0OiBpbnB1dHMgbXVzdCBiZSByYW5rIDEsIGJ1dCBnb3QgcmFua3MgYCArXG4gICAgICAgIGAkeyR2MS5yYW5rfSBhbmQgJHskdjIucmFua30uYCk7XG4gICAgY29uc3QgdjEyRCA9IHJlc2hhcGUoJHYxLCBbLTEsIDFdKTtcbiAgICBjb25zdCB2MjJEID0gcmVzaGFwZSgkdjIsIFsxLCAtMV0pO1xuICAgIHJldHVybiBtYXRNdWwodjEyRCwgdjIyRCk7XG59XG5leHBvcnQgY29uc3Qgb3V0ZXJQcm9kdWN0ID0gb3AoeyBvdXRlclByb2R1Y3RfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b3V0ZXJfcHJvZHVjdC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgUGFkVjIgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBQYWRzIGEgYHRmLlRlbnNvcmAgd2l0aCBhIGdpdmVuIHZhbHVlIGFuZCBwYWRkaW5ncy5cbiAqXG4gKiBUaGlzIG9wZXJhdGlvbiBpbXBsZW1lbnRzIGBDT05TVEFOVGAgbW9kZS4gRm9yIGBSRUZMRUNUYCBhbmQgYFNZTU1FVFJJQ2AsXG4gKiByZWZlciB0byBgdGYubWlycm9yUGFkYFxuICpcbiAqIEFsc28gYXZhaWxhYmxlIGFyZSBzdHJpY3RlciByYW5rLXNwZWNpZmljIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmVcbiAqIGFzIHRoaXMgbWV0aG9kIHRoYXQgYXNzZXJ0IHRoYXQgYHBhZGRpbmdzYCBpcyBvZiBnaXZlbiBsZW5ndGguXG4gKiAgIC0gYHRmLnBhZDFkYFxuICogICAtIGB0Zi5wYWQyZGBcbiAqICAgLSBgdGYucGFkM2RgXG4gKiAgIC0gYHRmLnBhZDRkYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDMsIDRdKTtcbiAqIHgucGFkKFtbMSwgMl1dKS5wcmludCgpO1xuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgdGVuc29yIHRvIHBhZC5cbiAqIEBwYXJhbSBwYWRkaW5ncyBBbiBhcnJheSBvZiBsZW5ndGggYFJgICh0aGUgcmFuayBvZiB0aGUgdGVuc29yKSwgd2hlcmVcbiAqIGVhY2ggZWxlbWVudCBpcyBhIGxlbmd0aC0yIHR1cGxlIG9mIGludHMgYFtwYWRCZWZvcmUsIHBhZEFmdGVyXWAsXG4gKiBzcGVjaWZ5aW5nIGhvdyBtdWNoIHRvIHBhZCBhbG9uZyBlYWNoIGRpbWVuc2lvbiBvZiB0aGUgdGVuc29yLlxuICogQHBhcmFtIGNvbnN0YW50VmFsdWUgVGhlIHBhZCB2YWx1ZSB0byB1c2UuIERlZmF1bHRzIHRvIDAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnVHJhbnNmb3JtYXRpb25zJ31cbiAqL1xuZnVuY3Rpb24gcGFkXyh4LCBwYWRkaW5ncywgY29uc3RhbnRWYWx1ZSA9IDApIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdwYWQnKTtcbiAgICBpZiAoJHgucmFuayA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BhZChzY2FsYXIpIGlzIG5vdCBkZWZpbmVkLiBQYXNzIG5vbi1zY2FsYXIgdG8gcGFkJyk7XG4gICAgfVxuICAgIGNvbnN0IGF0dHJzID0geyBwYWRkaW5ncywgY29uc3RhbnRWYWx1ZSB9O1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChQYWRWMiwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgcGFkID0gb3AoeyBwYWRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGFkLmpzLm1hcCIsImltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyBwYWQgfSBmcm9tICcuL3BhZCc7XG4vKipcbiAqIFBhZHMgYSBgdGYuVGVuc29yMURgIHdpdGggYSBnaXZlbiB2YWx1ZSBhbmQgcGFkZGluZ3MuIFNlZSBgcGFkYCBmb3IgZGV0YWlscy5cbiAqL1xuZnVuY3Rpb24gcGFkMWRfKHgsIHBhZGRpbmdzLCBjb25zdGFudFZhbHVlID0gMCkge1xuICAgIGFzc2VydChwYWRkaW5ncy5sZW5ndGggPT09IDIsICgpID0+ICdJbnZhbGlkIG51bWJlciBvZiBwYWRkaW5ncy4gTXVzdCBiZSBsZW5ndGggb2YgMi4nKTtcbiAgICByZXR1cm4gcGFkKHgsIFtwYWRkaW5nc10sIGNvbnN0YW50VmFsdWUpO1xufVxuZXhwb3J0IGNvbnN0IHBhZDFkID0gb3AoeyBwYWQxZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYWQxZC5qcy5tYXAiLCJpbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcGFkIH0gZnJvbSAnLi9wYWQnO1xuLyoqXG4gKiBQYWRzIGEgYHRmLlRlbnNvcjJEYCB3aXRoIGEgZ2l2ZW4gdmFsdWUgYW5kIHBhZGRpbmdzLiBTZWUgYHBhZGAgZm9yIGRldGFpbHMuXG4gKi9cbmZ1bmN0aW9uIHBhZDJkXyh4LCBwYWRkaW5ncywgY29uc3RhbnRWYWx1ZSA9IDApIHtcbiAgICBhc3NlcnQocGFkZGluZ3MubGVuZ3RoID09PSAyICYmIHBhZGRpbmdzWzBdLmxlbmd0aCA9PT0gMiAmJlxuICAgICAgICBwYWRkaW5nc1sxXS5sZW5ndGggPT09IDIsICgpID0+ICdJbnZhbGlkIG51bWJlciBvZiBwYWRkaW5ncy4gTXVzdCBiZSBsZW5ndGggb2YgMiBlYWNoLicpO1xuICAgIHJldHVybiBwYWQoeCwgcGFkZGluZ3MsIGNvbnN0YW50VmFsdWUpO1xufVxuZXhwb3J0IGNvbnN0IHBhZDJkID0gb3AoeyBwYWQyZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYWQyZC5qcy5tYXAiLCJpbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcGFkIH0gZnJvbSAnLi9wYWQnO1xuLyoqXG4gKiBQYWRzIGEgYHRmLlRlbnNvcjNEYCB3aXRoIGEgZ2l2ZW4gdmFsdWUgYW5kIHBhZGRpbmdzLiBTZWUgYHBhZGAgZm9yIGRldGFpbHMuXG4gKi9cbmZ1bmN0aW9uIHBhZDNkXyh4LCBwYWRkaW5ncywgY29uc3RhbnRWYWx1ZSA9IDApIHtcbiAgICBhc3NlcnQocGFkZGluZ3MubGVuZ3RoID09PSAzICYmIHBhZGRpbmdzWzBdLmxlbmd0aCA9PT0gMiAmJlxuICAgICAgICBwYWRkaW5nc1sxXS5sZW5ndGggPT09IDIgJiYgcGFkZGluZ3NbMl0ubGVuZ3RoID09PSAyLCAoKSA9PiAnSW52YWxpZCBudW1iZXIgb2YgcGFkZGluZ3MuIE11c3QgYmUgbGVuZ3RoIG9mIDIgZWFjaC4nKTtcbiAgICByZXR1cm4gcGFkKHgsIHBhZGRpbmdzLCBjb25zdGFudFZhbHVlKTtcbn1cbmV4cG9ydCBjb25zdCBwYWQzZCA9IG9wKHsgcGFkM2RfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGFkM2QuanMubWFwIiwiaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHBhZCB9IGZyb20gJy4vcGFkJztcbi8qKlxuICogUGFkcyBhIGB0Zi5UZW5zb3I0RGAgd2l0aCBhIGdpdmVuIHZhbHVlIGFuZCBwYWRkaW5ncy4gU2VlIGBwYWRgIGZvciBkZXRhaWxzLlxuICovXG5mdW5jdGlvbiBwYWQ0ZF8oeCwgcGFkZGluZ3MsIGNvbnN0YW50VmFsdWUgPSAwKSB7XG4gICAgYXNzZXJ0KHBhZGRpbmdzLmxlbmd0aCA9PT0gNCAmJiBwYWRkaW5nc1swXS5sZW5ndGggPT09IDIgJiZcbiAgICAgICAgcGFkZGluZ3NbMV0ubGVuZ3RoID09PSAyICYmIHBhZGRpbmdzWzJdLmxlbmd0aCA9PT0gMiAmJlxuICAgICAgICBwYWRkaW5nc1szXS5sZW5ndGggPT09IDIsICgpID0+ICdJbnZhbGlkIG51bWJlciBvZiBwYWRkaW5ncy4gTXVzdCBiZSBsZW5ndGggb2YgMiBlYWNoLicpO1xuICAgIHJldHVybiBwYWQoeCwgcGFkZGluZ3MsIGNvbnN0YW50VmFsdWUpO1xufVxuZXhwb3J0IGNvbnN0IHBhZDRkID0gb3AoeyBwYWQ0ZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYWQ0ZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IGF2Z1Bvb2wgfSBmcm9tICcuL2F2Z19wb29sJztcbmltcG9ydCB7IGJhdGNoVG9TcGFjZU5EIH0gZnJvbSAnLi9iYXRjaF90b19zcGFjZV9uZCc7XG5pbXBvcnQgKiBhcyBjb252X3V0aWwgZnJvbSAnLi9jb252X3V0aWwnO1xuaW1wb3J0IHsgbWF4UG9vbCB9IGZyb20gJy4vbWF4X3Bvb2wnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbmltcG9ydCB7IHNwYWNlVG9CYXRjaE5EIH0gZnJvbSAnLi9zcGFjZV90b19iYXRjaF9uZCc7XG4vKipcbiAqIFBlcmZvcm1zIGFuIE4tRCBwb29saW5nIG9wZXJhdGlvblxuICpcbiAqIEBwYXJhbSBpbnB1dCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDQgb3IgcmFuayAzIG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgaW5DaGFubmVsc11gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSB3aW5kb3dTaGFwZSBUaGUgZmlsdGVyIHNpemU6IGBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aF1gLiBJZlxuICogICAgIGBmaWx0ZXJTaXplYCBpcyBhIHNpbmdsZSBudW1iZXIsIHRoZW4gYGZpbHRlckhlaWdodCA9PSBmaWx0ZXJXaWR0aGAuXG4gKiBAcGFyYW0gcG9vbGluZ1R5cGUgVGhlIHR5cGUgb2YgcG9vbGluZywgZWl0aGVyICdtYXgnIG9yICdhdmcnLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobTpcbiAqICAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAgLSBGb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2d1aWRlcy9weXRob24vbm4jQ29udm9sdXRpb25dKFxuICogICAgICAgICBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZ3VpZGVzL3B5dGhvbi9ubiNDb252b2x1dGlvbilcbiAqIEBwYXJhbSBkaWxhdGlvbnMgVGhlIGRpbGF0aW9uIHJhdGVzOiBgW2RpbGF0aW9uSGVpZ2h0LCBkaWxhdGlvbldpZHRoXWBcbiAqICAgICBpbiB3aGljaCB3ZSBzYW1wbGUgaW5wdXQgdmFsdWVzIGFjcm9zcyB0aGUgaGVpZ2h0IGFuZCB3aWR0aCBkaW1lbnNpb25zXG4gKiAgICAgaW4gZGlsYXRlZCBwb29saW5nLiBEZWZhdWx0cyB0byBgWzEsIDFdYC4gSWYgYGRpbGF0aW9uUmF0ZWAgaXMgYSBzaW5nbGVcbiAqICAgICBudW1iZXIsIHRoZW4gYGRpbGF0aW9uSGVpZ2h0ID09IGRpbGF0aW9uV2lkdGhgLiBJZiBpdCBpcyBncmVhdGVyIHRoYW5cbiAqICAgICAxLCB0aGVuIGFsbCB2YWx1ZXMgb2YgYHN0cmlkZXNgIG11c3QgYmUgMS5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBwb29saW5nOiBgW3N0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGhdYC4gSWZcbiAqICAgICBgc3RyaWRlc2AgaXMgYSBzaW5nbGUgbnVtYmVyLCB0aGVuIGBzdHJpZGVIZWlnaHQgPT0gc3RyaWRlV2lkdGhgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0NvbnZvbHV0aW9uJ31cbiAqL1xuZnVuY3Rpb24gcG9vbF8oaW5wdXQsIHdpbmRvd1NoYXBlLCBwb29saW5nVHlwZSwgcGFkLCBkaWxhdGlvbnMsIHN0cmlkZXMpIHtcbiAgICBpZiAoZGlsYXRpb25zID09IG51bGwpIHtcbiAgICAgICAgZGlsYXRpb25zID0gWzEsIDFdO1xuICAgIH1cbiAgICBpZiAoc3RyaWRlcyA9PSBudWxsKSB7XG4gICAgICAgIHN0cmlkZXMgPSAxO1xuICAgIH1cbiAgICBpZiAocGFkID09PSAwKSB7XG4gICAgICAgIHBhZCA9ICd2YWxpZCc7XG4gICAgfVxuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKGlucHV0LCAneCcsICdtYXhQb29sJyk7XG4gICAgbGV0IHg0RCA9ICR4O1xuICAgIGxldCByZXNoYXBlZFRvNEQgPSBmYWxzZTtcbiAgICBpZiAoJHgucmFuayA9PT0gMykge1xuICAgICAgICByZXNoYXBlZFRvNEQgPSB0cnVlO1xuICAgICAgICB4NEQgPSByZXNoYXBlKCR4LCBbMSwgJHguc2hhcGVbMF0sICR4LnNoYXBlWzFdLCAkeC5zaGFwZVsyXV0pO1xuICAgIH1cbiAgICB1dGlsLmFzc2VydChjb252X3V0aWwuZWl0aGVyU3RyaWRlc09yRGlsYXRpb25zQXJlT25lKHN0cmlkZXMsIGRpbGF0aW9ucyksICgpID0+ICdFcnJvciBpbiBwb29sOiBFaXRoZXIgc3RyaWRlcyBvciBkaWxhdGlvbnMgbXVzdCBiZSAxLiAnICtcbiAgICAgICAgYEdvdCBzdHJpZGVzICR7c3RyaWRlc30gYW5kIGRpbGF0aW9ucyAnJHtkaWxhdGlvbnN9J2ApO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gY29udl91dGlsLmNvbXB1dGVQb29sMkRJbmZvKHg0RC5zaGFwZSwgd2luZG93U2hhcGUsIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkKTtcbiAgICBjb25zdCBkaWxhdGlvbiA9IFtjb252SW5mby5kaWxhdGlvbkhlaWdodCwgY29udkluZm8uZGlsYXRpb25XaWR0aF07XG4gICAgLy8gVGhlIGZvbGxvd2luZyBpbXBsZW1lbnRhdGlvbiBkb2VzIGJhdGNoVG9TcGFjZShwb29sKHNwYWNlVG9CYXRjaCh4KSkpXG4gICAgLy8gd2hlbmV2ZXIgZGlsYXRpb24gPiAxIHNpbmNlIHRoZSBURiBrZXJuZWxzIGRvIG5vdCBzdXBwb3J0IGRpbGF0aW9uID4gMS5cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yZmxvdy9ibG9iLzUwZjZiYjY3ZGM5OGM5Yjc0NjMwYjYwNDdhYWU3YTRmOGE0MGZkMDIvdGVuc29yZmxvdy9weXRob24vb3BzL25uX29wcy5weSNMMTAzN1xuICAgIGxldCBiYXNlUGFkZGluZztcbiAgICBpZiAocGFkID09PSAnc2FtZScpIHtcbiAgICAgICAgYmFzZVBhZGRpbmcgPSB3aXRoU3BhY2VUb0JhdGNoQmFzZVBhZGRpbmdzKFtjb252SW5mby5maWx0ZXJIZWlnaHQsIGNvbnZJbmZvLmZpbHRlcldpZHRoXSwgZGlsYXRpb24pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgYmFzZVBhZGRpbmcgPSBbWzAsIDBdLCBbMCwgMF1dO1xuICAgIH1cbiAgICBjb25zdCBpc0RpbGF0aW9uT25lID0gZGlsYXRpb25bMF0gPT09IDEgJiYgZGlsYXRpb25bMV0gPT09IDE7XG4gICAgY29uc3QgW2FkanVzdGVkUGFkZGluZywgYWRqdXN0ZWRDcm9wc10gPSByZXF1aXJlZFNwYWNlVG9CYXRjaFBhZGRpbmdzKFtjb252SW5mby5pbkhlaWdodCwgY29udkluZm8uaW5XaWR0aF0sIGRpbGF0aW9uLCBiYXNlUGFkZGluZyk7XG4gICAgY29uc3QgY29udmVydGVkUGFkID0gaXNEaWxhdGlvbk9uZSA/IHBhZCA6ICd2YWxpZCc7XG4gICAgY29uc3QgY29udmVydGVkWCA9IGlzRGlsYXRpb25PbmUgPyB4NEQgOiBzcGFjZVRvQmF0Y2hORCh4NEQsIGRpbGF0aW9uLCBhZGp1c3RlZFBhZGRpbmcpO1xuICAgIGNvbnN0IGZvcndhcmRPcCA9IHBvb2xpbmdUeXBlID09PSAnYXZnJyA/XG4gICAgICAgICgpID0+IGF2Z1Bvb2woY29udmVydGVkWCwgd2luZG93U2hhcGUsIHN0cmlkZXMsIGNvbnZlcnRlZFBhZCkgOlxuICAgICAgICAoKSA9PiBtYXhQb29sKGNvbnZlcnRlZFgsIHdpbmRvd1NoYXBlLCBzdHJpZGVzLCBjb252ZXJ0ZWRQYWQpO1xuICAgIGNvbnN0IHkgPSBmb3J3YXJkT3AoKTtcbiAgICBjb25zdCByZXMgPSBpc0RpbGF0aW9uT25lID8geSA6IGJhdGNoVG9TcGFjZU5EKHksIGRpbGF0aW9uLCBhZGp1c3RlZENyb3BzKTtcbiAgICBpZiAocmVzaGFwZWRUbzREKSB7XG4gICAgICAgIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbi8vIEhlbHBlciBmdW5jdGlvbiB0byBjb21wdXRlIGNyb3BzIGFuZCBwYWRkaW5ncyBmb3IgcG9vbCB3aXRoIGRpbGF0aW9uID4gMS5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmZsb3cvYmxvYi81MGY2YmI2N2RjOThjOWI3NDYzMGI2MDQ3YWFlN2E0ZjhhNDBmZDAyL3RlbnNvcmZsb3cvcHl0aG9uL29wcy9hcnJheV9vcHMucHkjTDIxODRcbmZ1bmN0aW9uIHJlcXVpcmVkU3BhY2VUb0JhdGNoUGFkZGluZ3MoaW5wdXRTaGFwZSwgYmxvY2tTaGFwZSwgYmFzZVBhZGRpbmcpIHtcbiAgICBjb25zdCBwYWRTdGFydCA9IGJhc2VQYWRkaW5nLm1hcChiID0+IGJbMF0pO1xuICAgIGNvbnN0IG9yaWdQYWRFbmQgPSBiYXNlUGFkZGluZy5tYXAoYiA9PiBiWzFdKTtcbiAgICBjb25zdCBmdWxsSW5wdXRTaGFwZSA9IGlucHV0U2hhcGUuY29uY2F0KHBhZFN0YXJ0LCBvcmlnUGFkRW5kKTtcbiAgICBjb25zdCBwYWRFbmRFeHRyYSA9IGJsb2NrU2hhcGUubWFwKChiLCBpKSA9PiAoYiAtIGZ1bGxJbnB1dFNoYXBlW2ldICUgYikgJSBiKTtcbiAgICBjb25zdCBwYWRFbmQgPSBvcmlnUGFkRW5kLm1hcCgocywgaSkgPT4gcyArIHBhZEVuZEV4dHJhW2ldKTtcbiAgICBjb25zdCBwYWRkaW5ncyA9IGJsb2NrU2hhcGUubWFwKChfLCBpKSA9PiBbcGFkU3RhcnRbaV0sIHBhZEVuZFtpXV0pO1xuICAgIGNvbnN0IGNyb3BzID0gYmxvY2tTaGFwZS5tYXAoKF8sIGkpID0+IFswLCBwYWRFbmRFeHRyYVtpXV0pO1xuICAgIHJldHVybiBbcGFkZGluZ3MsIGNyb3BzXTtcbn1cbi8vIEhlbHBlciBmdW5jdGlvbiB0byBjb21wdXRlIGJhc2UgcGFkZGluZ3MgZm9yIHBvb2wgd2l0aCBkaWxhdGlvbiA+IDEuXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3JmbG93L2Jsb2IvNTBmNmJiNjdkYzk4YzliNzQ2MzBiNjA0N2FhZTdhNGY4YTQwZmQwMi90ZW5zb3JmbG93L3B5dGhvbi9vcHMvbm5fb3BzLnB5I0w1MjRcbmZ1bmN0aW9uIHdpdGhTcGFjZVRvQmF0Y2hCYXNlUGFkZGluZ3MoZmlsdGVyU2hhcGUsIGRpbGF0aW9uKSB7XG4gICAgLy8gU3BhdGlhbCBkaW1lbnNpb25zIG9mIHRoZSBmaWx0ZXJzIGFuZCB0aGUgdXBzYW1wbGVkIGZpbHRlcnMgaW4gd2hpY2ggd2VcbiAgICAvLyBpbnRyb2R1Y2UgKHJhdGUgLSAxKSB6ZXJvcyBiZXR3ZWVuIGNvbnNlY3V0aXZlIGZpbHRlciB2YWx1ZXMuXG4gICAgY29uc3QgZGlsYXRlZEZpbHRlclNoYXBlID0gZmlsdGVyU2hhcGUubWFwKChzLCBpKSA9PiB7XG4gICAgICAgIHJldHVybiBzICsgKHMgLSAxKSAqIChkaWxhdGlvbltpXSAtIDEpO1xuICAgIH0pO1xuICAgIGNvbnN0IHBhZEV4dHJhU2hhcGUgPSBkaWxhdGVkRmlsdGVyU2hhcGUubWFwKHMgPT4gcyAtIDEpO1xuICAgIC8vIFdoZW4gcGFkZGluZyBpcyBvZGQsIHdlIHBhZCBtb3JlIGF0IGVuZCwgZm9sbG93aW5nIHRoZSBzYW1lXG4gICAgLy8gY29udmVudGlvbiBhcyBjb252MmQuXG4gICAgY29uc3QgcGFkRXh0cmFTdGFydCA9IHBhZEV4dHJhU2hhcGUubWFwKHMgPT4gTWF0aC5mbG9vcihzIC8gMikpO1xuICAgIGNvbnN0IHBhZEV4dHJhRW5kID0gcGFkRXh0cmFTaGFwZS5tYXAoKHMsIGkpID0+IHMgLSBwYWRFeHRyYVN0YXJ0W2ldKTtcbiAgICByZXR1cm4gcGFkRXh0cmFTaGFwZS5tYXAoKF8sIGkpID0+IHtcbiAgICAgICAgcmV0dXJuIFtwYWRFeHRyYVN0YXJ0W2ldLCBwYWRFeHRyYUVuZFtpXV07XG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgcG9vbCA9IG9wKHsgcG9vbF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wb29sLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBQb3cgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgbWFrZVR5cGVzTWF0Y2ggfSBmcm9tICcuLi90ZW5zb3JfdXRpbCc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBwb3dlciBvZiBvbmUgYHRmLlRlbnNvcmAgdG8gYW5vdGhlci4gU3VwcG9ydHMgYnJvYWRjYXN0aW5nLlxuICpcbiAqIEdpdmVuIGEgYHRmLlRlbnNvcmAgeCBhbmQgYSBgdGYuVGVuc29yYCB5LCB0aGlzIG9wZXJhdGlvbiBjb21wdXRlcyB4XnkgZm9yXG4gKiBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIGluIHggYW5kIHkuIFRoZSByZXN1bHQncyBkdHlwZSB3aWxsIGJlIHRoZSB1cGNhc3RlZFxuICogdHlwZSBvZiB0aGUgYGJhc2VgIGFuZCBgZXhwYCBkdHlwZXMuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IoW1syLCAzXSwgWzQsIDVdXSlcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IoW1sxLCAyXSwgWzMsIDBdXSkudG9JbnQoKTtcbiAqXG4gKiBhLnBvdyhiKS5wcmludCgpOyAgLy8gb3IgdGYucG93KGEsIGIpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcihbWzEsIDJdLCBbMywgNF1dKVxuICogY29uc3QgYiA9IHRmLnRlbnNvcigyKS50b0ludCgpO1xuICpcbiAqIGEucG93KGIpLnByaW50KCk7ICAvLyBvciB0Zi5wb3coYSwgYilcbiAqIGBgYFxuICogV2UgYWxzbyBleHBvc2UgYHBvd1N0cmljdGAgd2hpY2ggaGFzIHRoZSBzYW1lIHNpZ25hdHVyZSBhcyB0aGlzIG9wIGFuZFxuICogYXNzZXJ0cyB0aGF0IGBiYXNlYCBhbmQgYGV4cGAgYXJlIHRoZSBzYW1lIHNoYXBlIChkb2VzIG5vdCBicm9hZGNhc3QpLlxuICpcbiAqIEBwYXJhbSBiYXNlIFRoZSBiYXNlIGB0Zi5UZW5zb3JgIHRvIHBvdyBlbGVtZW50LXdpc2UuXG4gKiBAcGFyYW0gZXhwIFRoZSBleHBvbmVudCBgdGYuVGVuc29yYCB0byBwb3cgZWxlbWVudC13aXNlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0FyaXRobWV0aWMnfVxuICovXG5mdW5jdGlvbiBwb3dfKGJhc2UsIGV4cCkge1xuICAgIGxldCAkYmFzZSA9IGNvbnZlcnRUb1RlbnNvcihiYXNlLCAnYmFzZScsICdwb3cnKTtcbiAgICBsZXQgJGV4cCA9IGNvbnZlcnRUb1RlbnNvcihleHAsICdleHAnLCAncG93Jyk7XG4gICAgWyRiYXNlLCAkZXhwXSA9IG1ha2VUeXBlc01hdGNoKCRiYXNlLCAkZXhwKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGE6ICRiYXNlLCBiOiAkZXhwIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoUG93LCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IHBvdyA9IG9wKHsgcG93XyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBvdy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgUHJlbHUgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBsZWFreSByZWN0aWZpZWQgbGluZWFyIGVsZW1lbnQtd2lzZSB3aXRoIHBhcmFtZXRyaWMgYWxwaGFzLlxuICpcbiAqIGB4IDwgMCA/IGFscGhhICogeCA6IGYoeCkgPSB4YFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWy0xLCAyLCAtMywgNF0pO1xuICogY29uc3QgYWxwaGEgPSB0Zi5zY2FsYXIoMC4xKTtcbiAqXG4gKiB4LnByZWx1KGFscGhhKS5wcmludCgpOyAgLy8gb3IgdGYucHJlbHUoeCwgYWxwaGEpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gYWxwaGEgU2NhbGluZyBmYWN0b3IgZm9yIG5lZ2F0aXZlIHZhbHVlcy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gcHJlbHVfKHgsIGFscGhhKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAncHJlbHUnKTtcbiAgICBjb25zdCAkYWxwaGEgPSBjb252ZXJ0VG9UZW5zb3IoYWxwaGEsICdhbHBoYScsICdwcmVsdScpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHgsIGFscGhhOiAkYWxwaGEgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChQcmVsdSwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBwcmVsdSA9IG9wKHsgcHJlbHVfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHJlbHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLyoqXG4gKiBQcmludHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGB0Zi5UZW5zb3JgIGluY2x1ZGluZyBpdHMgZGF0YS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgdmVyYm9zZSA9IHRydWU7XG4gKiB0Zi50ZW5zb3IyZChbMSwgMiwgMywgNF0sIFsyLCAyXSkucHJpbnQodmVyYm9zZSk7XG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSB0ZW5zb3IgdG8gYmUgcHJpbnRlZC5cbiAqIEBwYXJhbSB2ZXJib3NlIFdoZXRoZXIgdG8gcHJpbnQgdmVyYm9zZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYCBUZW5zb3JgLFxuICogaW5jbHVkaW5nIGR0eXBlIGFuZCBzaXplLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByaW50KHgsIHZlcmJvc2UgPSBmYWxzZSkge1xuICAgIGNvbnNvbGUubG9nKHgudG9TdHJpbmcodmVyYm9zZSkpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHJpbnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFByb2QgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGNhc3QgfSBmcm9tICcuL2Nhc3QnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBwcm9kdWN0IG9mIGVsZW1lbnRzIGFjcm9zcyBkaW1lbnNpb25zIG9mIGEgYHRmLlRlbnNvcmAuXG4gKlxuICogUmVkdWNlcyB0aGUgaW5wdXQgYWxvbmcgdGhlIGRpbWVuc2lvbnMgZ2l2ZW4gaW4gYGF4ZXNgLiBVbmxlc3MgYGtlZXBEaW1zYFxuICogaXMgdHJ1ZSwgdGhlIHJhbmsgb2YgdGhlIGB0Zi5UZW5zb3JgIGlzIHJlZHVjZWQgYnkgMSBmb3IgZWFjaCBlbnRyeSBpblxuICogYGF4ZXNgLiBJZiBga2VlcERpbXNgIGlzIHRydWUsIHRoZSByZWR1Y2VkIGRpbWVuc2lvbnMgYXJlIHJldGFpbmVkIHdpdGhcbiAqIGxlbmd0aCAxLiBJZiBgYXhlc2AgaGFzIG5vIGVudHJpZXMsIGFsbCBkaW1lbnNpb25zIGFyZSByZWR1Y2VkLCBhbmQgYVxuICogYHRmLlRlbnNvcmAgd2l0aCBhIHNpbmdsZSBlbGVtZW50IGlzIHJldHVybmVkLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqXG4gKiB4LnByb2QoKS5wcmludCgpOyAgLy8gb3IgdGYucHJvZCh4KVxuICogYGBgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IyZChbMSwgMiwgMywgNF0sIFsyLCAyXSk7XG4gKlxuICogY29uc3QgYXhpcyA9IDE7XG4gKiB4LnByb2QoYXhpcykucHJpbnQoKTsgIC8vIG9yIHRmLnByb2QoeCwgYXhpcylcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IgdG8gY29tcHV0ZSB0aGUgcHJvZHVjdCBvdmVyLiBJZiB0aGUgZHR5cGUgaXMgYGJvb2xgXG4gKiAgIGl0IHdpbGwgYmUgY29udmVydGVkIHRvIGBpbnQzMmAgYW5kIHRoZSBvdXRwdXQgZHR5cGUgd2lsbCBiZSBgaW50MzJgLlxuICogQHBhcmFtIGF4aXMgVGhlIGRpbWVuc2lvbihzKSB0byByZWR1Y2UuIEJ5IGRlZmF1bHQgaXQgcmVkdWNlc1xuICogICAgIGFsbCBkaW1lbnNpb25zLlxuICogQHBhcmFtIGtlZXBEaW1zIElmIHRydWUsIHJldGFpbnMgcmVkdWNlZCBkaW1lbnNpb25zIHdpdGggc2l6ZSAxLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1JlZHVjdGlvbid9XG4gKi9cbmZ1bmN0aW9uIHByb2RfKHgsIGF4aXMgPSBudWxsLCBrZWVwRGltcyA9IGZhbHNlKSB7XG4gICAgbGV0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3Byb2QnKTtcbiAgICBpZiAoJHguZHR5cGUgPT09ICdib29sJykge1xuICAgICAgICAvLyBib29sIGlzIG5vdCBhbiBhbGxvd2VkIHR5cGUgZm9yIHRoZSB1bmRlcmx5aW5nIGtlcm5lbC5cbiAgICAgICAgJHggPSBjYXN0KCR4LCAnaW50MzInKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBheGlzLCBrZWVwRGltcyB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFByb2QsIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IHByb2QgPSBvcCh7IHByb2RfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHJvZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgc2l6ZUZyb21TaGFwZSB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENyZWF0ZXMgYSBgdGYuVGVuc29yYCB3aXRoIHZhbHVlcyBzYW1wbGVkIGZyb20gYSByYW5kb20gbnVtYmVyIGdlbmVyYXRvclxuICogZnVuY3Rpb24gZGVmaW5lZCBieSB0aGUgdXNlci5cbiAqXG4gKiBAcGFyYW0gc2hhcGUgQW4gYXJyYXkgb2YgaW50ZWdlcnMgZGVmaW5pbmcgdGhlIG91dHB1dCB0ZW5zb3Igc2hhcGUuXG4gKiBAcGFyYW0gcmFuZEZ1bmN0aW9uIEEgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkXG4gKiBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSBvdXRwdXQgdGVuc29yLlxuICogQHBhcmFtIGR0eXBlIFRoZSBkYXRhIHR5cGUgb2YgdGhlIG91dHB1dCB0ZW5zb3IuIERlZmF1bHRzIHRvICdmbG9hdDMyJy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdSYW5kb20nfVxuICovXG5mdW5jdGlvbiByYW5kXyhzaGFwZSwgcmFuZEZ1bmN0aW9uLCBkdHlwZSkge1xuICAgIGNvbnN0IHNpemUgPSBzaXplRnJvbVNoYXBlKHNoYXBlKTtcbiAgICBsZXQgdmFsdWVzID0gbnVsbDtcbiAgICBpZiAoZHR5cGUgPT0gbnVsbCB8fCBkdHlwZSA9PT0gJ2Zsb2F0MzInKSB7XG4gICAgICAgIHZhbHVlcyA9IG5ldyBGbG9hdDMyQXJyYXkoc2l6ZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGR0eXBlID09PSAnaW50MzInKSB7XG4gICAgICAgIHZhbHVlcyA9IG5ldyBJbnQzMkFycmF5KHNpemUpO1xuICAgIH1cbiAgICBlbHNlIGlmIChkdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgICAgIHZhbHVlcyA9IG5ldyBVaW50OEFycmF5KHNpemUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGRhdGEgdHlwZSAke2R0eXBlfWApO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICB2YWx1ZXNbaV0gPSByYW5kRnVuY3Rpb24oKTtcbiAgICB9XG4gICAgcmV0dXJuIEVOR0lORS5tYWtlVGVuc29yKHZhbHVlcywgc2hhcGUsIGR0eXBlKTtcbn1cbmV4cG9ydCBjb25zdCByYW5kID0gb3AoeyByYW5kXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJhbmQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0ICogYXMgc2VlZHJhbmRvbSBmcm9tICdzZWVkcmFuZG9tJztcbmltcG9ydCB7IGV4cGVjdE51bWJlcnNDbG9zZSwgdGVzdEVwc2lsb24gfSBmcm9tICcuLi90ZXN0X3V0aWwnO1xuLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTWFyc2FnbGlhX3BvbGFyX21ldGhvZFxuZXhwb3J0IGNsYXNzIE1QUmFuZEdhdXNzIHtcbiAgICBjb25zdHJ1Y3RvcihtZWFuLCBzdGREZXZpYXRpb24sIGR0eXBlLCB0cnVuY2F0ZWQsIHNlZWQpIHtcbiAgICAgICAgdGhpcy5tZWFuID0gbWVhbjtcbiAgICAgICAgdGhpcy5zdGREZXYgPSBzdGREZXZpYXRpb247XG4gICAgICAgIHRoaXMuZHR5cGUgPSBkdHlwZTtcbiAgICAgICAgdGhpcy5uZXh0VmFsID0gTmFOO1xuICAgICAgICB0aGlzLnRydW5jYXRlZCA9IHRydW5jYXRlZDtcbiAgICAgICAgaWYgKHRoaXMudHJ1bmNhdGVkKSB7XG4gICAgICAgICAgICB0aGlzLnVwcGVyID0gdGhpcy5tZWFuICsgdGhpcy5zdGREZXYgKiAyO1xuICAgICAgICAgICAgdGhpcy5sb3dlciA9IHRoaXMubWVhbiAtIHRoaXMuc3RkRGV2ICogMjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZWVkVmFsdWUgPSBzZWVkID8gc2VlZCA6IE1hdGgucmFuZG9tKCk7XG4gICAgICAgIHRoaXMucmFuZG9tID0gc2VlZHJhbmRvbS5hbGVhKHNlZWRWYWx1ZS50b1N0cmluZygpKTtcbiAgICB9XG4gICAgLyoqIFJldHVybnMgbmV4dCBzYW1wbGUgZnJvbSBhIEdhdXNzaWFuIGRpc3RyaWJ1dGlvbi4gKi9cbiAgICBuZXh0VmFsdWUoKSB7XG4gICAgICAgIGlmICghaXNOYU4odGhpcy5uZXh0VmFsKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLm5leHRWYWw7XG4gICAgICAgICAgICB0aGlzLm5leHRWYWwgPSBOYU47XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlc3VsdFgsIHJlc3VsdFk7XG4gICAgICAgIGxldCBpc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgIHdoaWxlICghaXNWYWxpZCkge1xuICAgICAgICAgICAgbGV0IHYxLCB2MiwgcztcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICB2MSA9IDIgKiB0aGlzLnJhbmRvbSgpIC0gMTtcbiAgICAgICAgICAgICAgICB2MiA9IDIgKiB0aGlzLnJhbmRvbSgpIC0gMTtcbiAgICAgICAgICAgICAgICBzID0gdjEgKiB2MSArIHYyICogdjI7XG4gICAgICAgICAgICB9IHdoaWxlIChzID49IDEgfHwgcyA9PT0gMCk7XG4gICAgICAgICAgICBjb25zdCBtdWwgPSBNYXRoLnNxcnQoLTIuMCAqIE1hdGgubG9nKHMpIC8gcyk7XG4gICAgICAgICAgICByZXN1bHRYID0gdGhpcy5tZWFuICsgdGhpcy5zdGREZXYgKiB2MSAqIG11bDtcbiAgICAgICAgICAgIHJlc3VsdFkgPSB0aGlzLm1lYW4gKyB0aGlzLnN0ZERldiAqIHYyICogbXVsO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnRydW5jYXRlZCB8fCB0aGlzLmlzVmFsaWRUcnVuY2F0ZWQocmVzdWx0WCkpIHtcbiAgICAgICAgICAgICAgICBpc1ZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMudHJ1bmNhdGVkIHx8IHRoaXMuaXNWYWxpZFRydW5jYXRlZChyZXN1bHRZKSkge1xuICAgICAgICAgICAgdGhpcy5uZXh0VmFsID0gdGhpcy5jb252ZXJ0VmFsdWUocmVzdWx0WSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydFZhbHVlKHJlc3VsdFgpO1xuICAgIH1cbiAgICAvKiogSGFuZGxlcyBwcm9wZXIgcm91bmRpbmcgZm9yIG5vbi1mbG9hdGluZy1wb2ludCBudW1iZXJzLiAqL1xuICAgIGNvbnZlcnRWYWx1ZSh2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5kdHlwZSA9PSBudWxsIHx8IHRoaXMuZHR5cGUgPT09ICdmbG9hdDMyJykge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlKTtcbiAgICB9XG4gICAgLyoqIFJldHVybnMgdHJ1ZSBpZiBsZXNzIHRoYW4gMi1zdGFuZGFyZC1kZXZpYXRpb25zIGZyb20gdGhlIG1lYW4uICovXG4gICAgaXNWYWxpZFRydW5jYXRlZCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPD0gdGhpcy51cHBlciAmJiB2YWx1ZSA+PSB0aGlzLmxvd2VyO1xuICAgIH1cbn1cbi8vIE1hcnNhZ2xpYSwgR2VvcmdlLCBhbmQgV2FpIFdhbiBUc2FuZy4gMjAwMC4gXCJBIFNpbXBsZSBNZXRob2QgZm9yIEdlbmVyYXRpbmdcbi8vIEdhbW1hIFZhcmlhYmxlcy5cIlxuZXhwb3J0IGNsYXNzIFJhbmRHYW1tYSB7XG4gICAgY29uc3RydWN0b3IoYWxwaGEsIGJldGEsIGR0eXBlLCBzZWVkKSB7XG4gICAgICAgIHRoaXMuYWxwaGEgPSBhbHBoYTtcbiAgICAgICAgdGhpcy5iZXRhID0gMSAvIGJldGE7IC8vIGNvbnZlcnQgcmF0ZSB0byBzY2FsZSBwYXJhbWV0ZXJcbiAgICAgICAgdGhpcy5kdHlwZSA9IGR0eXBlO1xuICAgICAgICBjb25zdCBzZWVkVmFsdWUgPSBzZWVkID8gc2VlZCA6IE1hdGgucmFuZG9tKCk7XG4gICAgICAgIHRoaXMucmFuZHUgPSBzZWVkcmFuZG9tLmFsZWEoc2VlZFZhbHVlLnRvU3RyaW5nKCkpO1xuICAgICAgICB0aGlzLnJhbmRuID0gbmV3IE1QUmFuZEdhdXNzKDAsIDEsIGR0eXBlLCBmYWxzZSwgdGhpcy5yYW5kdSgpKTtcbiAgICAgICAgaWYgKGFscGhhIDwgMSkge1xuICAgICAgICAgICAgdGhpcy5kID0gYWxwaGEgKyAoMiAvIDMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kID0gYWxwaGEgLSAoMSAvIDMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYyA9IDEgLyBNYXRoLnNxcnQoOSAqIHRoaXMuZCk7XG4gICAgfVxuICAgIC8qKiBSZXR1cm5zIG5leHQgc2FtcGxlIGZyb20gYSBnYW1tYSBkaXN0cmlidXRpb24uICovXG4gICAgbmV4dFZhbHVlKCkge1xuICAgICAgICBsZXQgeDIsIHYwLCB2MSwgeCwgdSwgdjtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICB4ID0gdGhpcy5yYW5kbi5uZXh0VmFsdWUoKTtcbiAgICAgICAgICAgICAgICB2ID0gMSArICh0aGlzLmMgKiB4KTtcbiAgICAgICAgICAgIH0gd2hpbGUgKHYgPD0gMCk7XG4gICAgICAgICAgICB2ICo9IHYgKiB2O1xuICAgICAgICAgICAgeDIgPSB4ICogeDtcbiAgICAgICAgICAgIHYwID0gMSAtICgwLjMzMSAqIHgyICogeDIpO1xuICAgICAgICAgICAgdjEgPSAoMC41ICogeDIpICsgKHRoaXMuZCAqICgxIC0gdiArIE1hdGgubG9nKHYpKSk7XG4gICAgICAgICAgICB1ID0gdGhpcy5yYW5kdSgpO1xuICAgICAgICAgICAgaWYgKHUgPCB2MCB8fCBNYXRoLmxvZyh1KSA8IHYxKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdiA9ICgxIC8gdGhpcy5iZXRhKSAqIHRoaXMuZCAqIHY7XG4gICAgICAgIGlmICh0aGlzLmFscGhhIDwgMSkge1xuICAgICAgICAgICAgdiAqPSBNYXRoLnBvdyh0aGlzLnJhbmR1KCksIDEgLyB0aGlzLmFscGhhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0VmFsdWUodik7XG4gICAgfVxuICAgIC8qKiBIYW5kbGVzIHByb3BlciByb3VuZGluZyBmb3Igbm9uLWZsb2F0aW5nLXBvaW50IG51bWJlcnMuICovXG4gICAgY29udmVydFZhbHVlKHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLmR0eXBlID09PSAnZmxvYXQzMicpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCh2YWx1ZSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIFVuaWZvcm1SYW5kb20ge1xuICAgIGNvbnN0cnVjdG9yKG1pbiA9IDAsIG1heCA9IDEsIGR0eXBlLCBzZWVkKSB7XG4gICAgICAgIC8qKiBIYW5kbGVzIHByb3BlciByb3VuZGluZyBmb3Igbm9uIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuICovXG4gICAgICAgIHRoaXMuY2FuUmV0dXJuRmxvYXQgPSAoKSA9PiAodGhpcy5kdHlwZSA9PSBudWxsIHx8IHRoaXMuZHR5cGUgPT09ICdmbG9hdDMyJyk7XG4gICAgICAgIHRoaXMubWluID0gbWluO1xuICAgICAgICB0aGlzLnJhbmdlID0gbWF4IC0gbWluO1xuICAgICAgICB0aGlzLmR0eXBlID0gZHR5cGU7XG4gICAgICAgIGlmIChzZWVkID09IG51bGwpIHtcbiAgICAgICAgICAgIHNlZWQgPSBNYXRoLnJhbmRvbSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2VlZCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHNlZWQgPSBzZWVkLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmNhblJldHVybkZsb2F0KCkgJiYgdGhpcy5yYW5nZSA8PSAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gJHttaW59IC0gJHttYXh9IDw9IDEgYW5kIGR0eXBlIGlzIG5vdCBmbG9hdGApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmFuZG9tID0gc2VlZHJhbmRvbS5hbGVhKHNlZWQpO1xuICAgIH1cbiAgICBjb252ZXJ0VmFsdWUodmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuY2FuUmV0dXJuRmxvYXQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlKTtcbiAgICB9XG4gICAgbmV4dFZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0VmFsdWUodGhpcy5taW4gKyB0aGlzLnJhbmdlICogdGhpcy5yYW5kb20oKSk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGphcnF1ZUJlcmFOb3JtYWxpdHlUZXN0KHZhbHVlcykge1xuICAgIC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0phcnF1ZSVFMiU4MCU5M0JlcmFfdGVzdFxuICAgIGNvbnN0IG4gPSB2YWx1ZXMubGVuZ3RoO1xuICAgIGNvbnN0IHMgPSBza2V3bmVzcyh2YWx1ZXMpO1xuICAgIGNvbnN0IGsgPSBrdXJ0b3Npcyh2YWx1ZXMpO1xuICAgIGNvbnN0IGpiID0gbiAvIDYgKiAoTWF0aC5wb3cocywgMikgKyAwLjI1ICogTWF0aC5wb3coayAtIDMsIDIpKTtcbiAgICAvLyBKQiB0ZXN0IHJlcXVpcmVzIDItZGVncmVzcyBvZiBmcmVlZG9tIGZyb20gQ2hpLVNxdWFyZSBAIDAuOTU6XG4gICAgLy8gaHR0cDovL3d3dy5pdGwubmlzdC5nb3YvZGl2ODk4L2hhbmRib29rL2VkYS9zZWN0aW9uMy9lZGEzNjc0Lmh0bVxuICAgIGNvbnN0IENISV9TUVVBUkVfMkRFRyA9IDUuOTkxO1xuICAgIGlmIChqYiA+IENISV9TUVVBUkVfMkRFRykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcC12YWx1ZSBmb3IgSkI6ICR7amJ9YCk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGV4cGVjdEFycmF5SW5NZWFuU3RkUmFuZ2UoYWN0dWFsLCBleHBlY3RlZE1lYW4sIGV4cGVjdGVkU3RkRGV2LCBlcHNpbG9uKSB7XG4gICAgaWYgKGVwc2lsb24gPT0gbnVsbCkge1xuICAgICAgICBlcHNpbG9uID0gdGVzdEVwc2lsb24oKTtcbiAgICB9XG4gICAgY29uc3QgYWN0dWFsTWVhbiA9IG1lYW4oYWN0dWFsKTtcbiAgICBleHBlY3ROdW1iZXJzQ2xvc2UoYWN0dWFsTWVhbiwgZXhwZWN0ZWRNZWFuLCBlcHNpbG9uKTtcbiAgICBleHBlY3ROdW1iZXJzQ2xvc2Uoc3RhbmRhcmREZXZpYXRpb24oYWN0dWFsLCBhY3R1YWxNZWFuKSwgZXhwZWN0ZWRTdGREZXYsIGVwc2lsb24pO1xufVxuZnVuY3Rpb24gbWVhbih2YWx1ZXMpIHtcbiAgICBsZXQgc3VtID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBzdW0gKz0gdmFsdWVzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gc3VtIC8gdmFsdWVzLmxlbmd0aDtcbn1cbmZ1bmN0aW9uIHN0YW5kYXJkRGV2aWF0aW9uKHZhbHVlcywgbWVhbikge1xuICAgIGxldCBzcXVhcmVEaWZmU3VtID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBkaWZmID0gdmFsdWVzW2ldIC0gbWVhbjtcbiAgICAgICAgc3F1YXJlRGlmZlN1bSArPSBkaWZmICogZGlmZjtcbiAgICB9XG4gICAgcmV0dXJuIE1hdGguc3FydChzcXVhcmVEaWZmU3VtIC8gdmFsdWVzLmxlbmd0aCk7XG59XG5mdW5jdGlvbiBrdXJ0b3Npcyh2YWx1ZXMpIHtcbiAgICAvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9LdXJ0b3Npc1xuICAgIGNvbnN0IHZhbHVlc01lYW4gPSBtZWFuKHZhbHVlcyk7XG4gICAgY29uc3QgbiA9IHZhbHVlcy5sZW5ndGg7XG4gICAgbGV0IHN1bTIgPSAwO1xuICAgIGxldCBzdW00ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICBjb25zdCB2ID0gdmFsdWVzW2ldIC0gdmFsdWVzTWVhbjtcbiAgICAgICAgc3VtMiArPSBNYXRoLnBvdyh2LCAyKTtcbiAgICAgICAgc3VtNCArPSBNYXRoLnBvdyh2LCA0KTtcbiAgICB9XG4gICAgcmV0dXJuICgxIC8gbikgKiBzdW00IC8gTWF0aC5wb3coKDEgLyBuKSAqIHN1bTIsIDIpO1xufVxuZnVuY3Rpb24gc2tld25lc3ModmFsdWVzKSB7XG4gICAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU2tld25lc3NcbiAgICBjb25zdCB2YWx1ZXNNZWFuID0gbWVhbih2YWx1ZXMpO1xuICAgIGNvbnN0IG4gPSB2YWx1ZXMubGVuZ3RoO1xuICAgIGxldCBzdW0yID0gMDtcbiAgICBsZXQgc3VtMyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgY29uc3QgdiA9IHZhbHVlc1tpXSAtIHZhbHVlc01lYW47XG4gICAgICAgIHN1bTIgKz0gTWF0aC5wb3codiwgMik7XG4gICAgICAgIHN1bTMgKz0gTWF0aC5wb3codiwgMyk7XG4gICAgfVxuICAgIHJldHVybiAoMSAvIG4pICogc3VtMyAvIE1hdGgucG93KCgxIC8gKG4gLSAxKSkgKiBzdW0yLCAzIC8gMik7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yYW5kX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYnVmZmVyIH0gZnJvbSAnLi9idWZmZXInO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyBSYW5kR2FtbWEgfSBmcm9tICcuL3JhbmRfdXRpbCc7XG4vKipcbiAqIENyZWF0ZXMgYSBgdGYuVGVuc29yYCB3aXRoIHZhbHVlcyBzYW1wbGVkIGZyb20gYSBnYW1tYSBkaXN0cmlidXRpb24uXG4gKlxuICogYGBganNcbiAqIHRmLnJhbmRvbUdhbW1hKFsyLCAyXSwgMSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBzaGFwZSBBbiBhcnJheSBvZiBpbnRlZ2VycyBkZWZpbmluZyB0aGUgb3V0cHV0IHRlbnNvciBzaGFwZS5cbiAqIEBwYXJhbSBhbHBoYSBUaGUgc2hhcGUgcGFyYW1ldGVyIG9mIHRoZSBnYW1tYSBkaXN0cmlidXRpb24uXG4gKiBAcGFyYW0gYmV0YSBUaGUgaW52ZXJzZSBzY2FsZSBwYXJhbWV0ZXIgb2YgdGhlIGdhbW1hIGRpc3RyaWJ1dGlvbi4gRGVmYXVsdHNcbiAqICAgICB0byAxLlxuICogQHBhcmFtIGR0eXBlIFRoZSBkYXRhIHR5cGUgb2YgdGhlIG91dHB1dC4gRGVmYXVsdHMgdG8gZmxvYXQzMi5cbiAqIEBwYXJhbSBzZWVkIFRoZSBzZWVkIGZvciB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnUmFuZG9tJ31cbiAqL1xuZnVuY3Rpb24gcmFuZG9tR2FtbWFfKHNoYXBlLCBhbHBoYSwgYmV0YSA9IDEsIGR0eXBlID0gJ2Zsb2F0MzInLCBzZWVkKSB7XG4gICAgaWYgKGJldGEgPT0gbnVsbCkge1xuICAgICAgICBiZXRhID0gMTtcbiAgICB9XG4gICAgaWYgKGR0eXBlID09IG51bGwpIHtcbiAgICAgICAgZHR5cGUgPSAnZmxvYXQzMic7XG4gICAgfVxuICAgIGlmIChkdHlwZSAhPT0gJ2Zsb2F0MzInICYmIGR0eXBlICE9PSAnaW50MzInKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgZGF0YSB0eXBlICR7ZHR5cGV9YCk7XG4gICAgfVxuICAgIGNvbnN0IHJnYW1tYSA9IG5ldyBSYW5kR2FtbWEoYWxwaGEsIGJldGEsIGR0eXBlLCBzZWVkKTtcbiAgICBjb25zdCByZXMgPSBidWZmZXIoc2hhcGUsIGR0eXBlKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlcy52YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzLnZhbHVlc1tpXSA9IHJnYW1tYS5uZXh0VmFsdWUoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy50b1RlbnNvcigpO1xufVxuZXhwb3J0IGNvbnN0IHJhbmRvbUdhbW1hID0gb3AoeyByYW5kb21HYW1tYV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yYW5kb21fZ2FtbWEuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYnVmZmVyIH0gZnJvbSAnLi9idWZmZXInO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyBNUFJhbmRHYXVzcyB9IGZyb20gJy4vcmFuZF91dGlsJztcbi8qKlxuICogQ3JlYXRlcyBhIGB0Zi5UZW5zb3JgIHdpdGggdmFsdWVzIHNhbXBsZWQgZnJvbSBhIG5vcm1hbCBkaXN0cmlidXRpb24uXG4gKlxuICogYGBganNcbiAqIHRmLnJhbmRvbU5vcm1hbChbMiwgMl0pLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gc2hhcGUgQW4gYXJyYXkgb2YgaW50ZWdlcnMgZGVmaW5pbmcgdGhlIG91dHB1dCB0ZW5zb3Igc2hhcGUuXG4gKiBAcGFyYW0gbWVhbiBUaGUgbWVhbiBvZiB0aGUgbm9ybWFsIGRpc3RyaWJ1dGlvbi5cbiAqIEBwYXJhbSBzdGREZXYgVGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgbm9ybWFsIGRpc3RyaWJ1dGlvbi5cbiAqIEBwYXJhbSBkdHlwZSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBvdXRwdXQuXG4gKiBAcGFyYW0gc2VlZCBUaGUgc2VlZCBmb3IgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1JhbmRvbSd9XG4gKi9cbmZ1bmN0aW9uIHJhbmRvbU5vcm1hbF8oc2hhcGUsIG1lYW4gPSAwLCBzdGREZXYgPSAxLCBkdHlwZSwgc2VlZCkge1xuICAgIGlmIChkdHlwZSAhPSBudWxsICYmIGR0eXBlID09PSAnYm9vbCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBkYXRhIHR5cGUgJHtkdHlwZX1gKTtcbiAgICB9XG4gICAgY29uc3QgcmFuZEdhdXNzID0gbmV3IE1QUmFuZEdhdXNzKG1lYW4sIHN0ZERldiwgZHR5cGUsIGZhbHNlIC8qIHRydW5jYXRlZCAqLywgc2VlZCk7XG4gICAgY29uc3QgcmVzID0gYnVmZmVyKHNoYXBlLCBkdHlwZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXMudmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlcy52YWx1ZXNbaV0gPSByYW5kR2F1c3MubmV4dFZhbHVlKCk7XG4gICAgfVxuICAgIHJldHVybiByZXMudG9UZW5zb3IoKTtcbn1cbmV4cG9ydCBjb25zdCByYW5kb21Ob3JtYWwgPSBvcCh7IHJhbmRvbU5vcm1hbF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yYW5kb21fbm9ybWFsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJ1ZmZlciB9IGZyb20gJy4vYnVmZmVyJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgVW5pZm9ybVJhbmRvbSB9IGZyb20gJy4vcmFuZF91dGlsJztcbi8qKlxuICogQ3JlYXRlcyBhIGB0Zi5UZW5zb3JgIHdpdGggdmFsdWVzIHNhbXBsZWQgZnJvbSBhIHVuaWZvcm0gZGlzdHJpYnV0aW9uLlxuICpcbiAqIFRoZSBnZW5lcmF0ZWQgdmFsdWVzIGZvbGxvdyBhIHVuaWZvcm0gZGlzdHJpYnV0aW9uIGluIHRoZSByYW5nZSBbbWludmFsLFxuICogbWF4dmFsKS4gVGhlIGxvd2VyIGJvdW5kIG1pbnZhbCBpcyBpbmNsdWRlZCBpbiB0aGUgcmFuZ2UsIHdoaWxlIHRoZSB1cHBlclxuICogYm91bmQgbWF4dmFsIGlzIGV4Y2x1ZGVkLlxuICpcbiAqIGBgYGpzXG4gKiB0Zi5yYW5kb21Vbmlmb3JtKFsyLCAyXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBzaGFwZSBBbiBhcnJheSBvZiBpbnRlZ2VycyBkZWZpbmluZyB0aGUgb3V0cHV0IHRlbnNvciBzaGFwZS5cbiAqIEBwYXJhbSBtaW52YWwgVGhlIGxvd2VyIGJvdW5kIG9uIHRoZSByYW5nZSBvZiByYW5kb20gdmFsdWVzIHRvIGdlbmVyYXRlLlxuICogICBEZWZhdWx0cyB0byAwLlxuICogQHBhcmFtIG1heHZhbCBUaGUgdXBwZXIgYm91bmQgb24gdGhlIHJhbmdlIG9mIHJhbmRvbSB2YWx1ZXMgdG8gZ2VuZXJhdGUuXG4gKiAgIERlZmF1bHRzIHRvIDEuXG4gKiBAcGFyYW0gZHR5cGUgVGhlIGRhdGEgdHlwZSBvZiB0aGUgb3V0cHV0IHRlbnNvci4gRGVmYXVsdHMgdG8gJ2Zsb2F0MzInLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1JhbmRvbSd9XG4gKi9cbmZ1bmN0aW9uIHJhbmRvbVVuaWZvcm1fKHNoYXBlLCBtaW52YWwgPSAwLCBtYXh2YWwgPSAxLCBkdHlwZSA9ICdmbG9hdDMyJywgc2VlZCkge1xuICAgIGNvbnN0IHJlcyA9IGJ1ZmZlcihzaGFwZSwgZHR5cGUpO1xuICAgIGNvbnN0IHJhbmRvbSA9IG5ldyBVbmlmb3JtUmFuZG9tKG1pbnZhbCwgbWF4dmFsLCBudWxsLCBzZWVkKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlcy52YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzLnZhbHVlc1tpXSA9IHJhbmRvbS5uZXh0VmFsdWUoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy50b1RlbnNvcigpO1xufVxuZXhwb3J0IGNvbnN0IHJhbmRvbVVuaWZvcm0gPSBvcCh7IHJhbmRvbVVuaWZvcm1fIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmFuZG9tX3VuaWZvcm0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFJhbmdlIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBgdGYuVGVuc29yMURgIGZpbGxlZCB3aXRoIHRoZSBudW1iZXJzIGluIHRoZSByYW5nZSBwcm92aWRlZC5cbiAqXG4gKiBUaGUgdGVuc29yIGlzIGEgaXMgaGFsZi1vcGVuIGludGVydmFsIG1lYW5pbmcgaXQgaW5jbHVkZXMgc3RhcnQsIGJ1dFxuICogZXhjbHVkZXMgc3RvcC4gRGVjcmVtZW50aW5nIHJhbmdlcyBhbmQgbmVnYXRpdmUgc3RlcCB2YWx1ZXMgYXJlIGFsc29cbiAqIHN1cHBvcnRlZC5zdlxuICpcbiAqXG4gKiBgYGBqc1xuICogdGYucmFuZ2UoMCwgOSwgMikucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBzdGFydCBBbiBpbnRlZ2VyIHN0YXJ0IHZhbHVlXG4gKiBAcGFyYW0gc3RvcCBBbiBpbnRlZ2VyIHN0b3AgdmFsdWVcbiAqIEBwYXJhbSBzdGVwIEFuIGludGVnZXIgaW5jcmVtZW50ICh3aWxsIGRlZmF1bHQgdG8gMSBvciAtMSlcbiAqIEBwYXJhbSBkdHlwZSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBvdXRwdXQgdGVuc29yLiBEZWZhdWx0cyB0byAnZmxvYXQzMicuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmFuZ2Uoc3RhcnQsIHN0b3AsIHN0ZXAgPSAxLCBkdHlwZSA9ICdmbG9hdDMyJykge1xuICAgIGlmIChzdGVwID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGhhdmUgYSBzdGVwIG9mIHplcm8nKTtcbiAgICB9XG4gICAgY29uc3QgYXR0cnMgPSB7IHN0YXJ0LCBzdG9wLCBzdGVwLCBkdHlwZSB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFJhbmdlLCB7fSAvKiBpbnB1dHMgKi8sIGF0dHJzKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJhbmdlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBSZWFsIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV0dXJucyB0aGUgcmVhbCBwYXJ0IG9mIGEgY29tcGxleCAob3IgcmVhbCkgdGVuc29yLlxuICpcbiAqIEdpdmVuIGEgdGVuc29yIGlucHV0LCB0aGlzIG9wZXJhdGlvbiByZXR1cm5zIGEgdGVuc29yIG9mIHR5cGUgZmxvYXQgdGhhdCBpc1xuICogdGhlIHJlYWwgcGFydCBvZiBlYWNoIGVsZW1lbnQgaW4gaW5wdXQgY29uc2lkZXJlZCBhcyBhIGNvbXBsZXggbnVtYmVyLlxuICpcbiAqIElmIHRoZSBpbnB1dCBpcyByZWFsLCBpdCBzaW1wbHkgbWFrZXMgYSBjbG9uZS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLmNvbXBsZXgoWy0yLjI1LCAzLjI1XSwgWzQuNzUsIDUuNzVdKTtcbiAqIHRmLnJlYWwoeCkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZnVuY3Rpb24gcmVhbF8oaW5wdXQpIHtcbiAgICBjb25zdCAkaW5wdXQgPSBjb252ZXJ0VG9UZW5zb3IoaW5wdXQsICdpbnB1dCcsICdyZWFsJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyBpbnB1dDogJGlucHV0IH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoUmVhbCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCByZWFsID0gb3AoeyByZWFsXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlYWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFJlY2lwcm9jYWwgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyByZWNpcHJvY2FsIG9mIHggZWxlbWVudC13aXNlOiBgMSAvIHhgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMCwgMSwgMl0pO1xuICpcbiAqIHgucmVjaXByb2NhbCgpLnByaW50KCk7ICAvLyBvciB0Zi5yZWNpcHJvY2FsKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIHJlY2lwcm9jYWxfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdyZWNpcHJvY2FsJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFJlY2lwcm9jYWwsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgcmVjaXByb2NhbCA9IG9wKHsgcmVjaXByb2NhbF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWNpcHJvY2FsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qKlxuICogSW5wdXRzIG9mIHNpemUgYWJvdmUgdGhpcyB0aHJlc2hvbGQgd2lsbCBiZSBwYXJhbGxlbGl6ZWQgYnkgY2FsbGluZyBtdWx0aXBsZVxuICogc2hhZGVyIHByb2dyYW1zLlxuICovXG5pbXBvcnQgeyBuZWFyZXN0RGl2aXNvciB9IGZyb20gJy4uL3V0aWwnO1xuZXhwb3J0IGNvbnN0IFBBUkFMTEVMSVpFX1RIUkVTSE9MRCA9IDMwO1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVPcHRpbWFsV2luZG93U2l6ZShpblNpemUpIHtcbiAgICBpZiAoaW5TaXplIDw9IFBBUkFMTEVMSVpFX1RIUkVTSE9MRCkge1xuICAgICAgICByZXR1cm4gaW5TaXplO1xuICAgIH1cbiAgICByZXR1cm4gbmVhcmVzdERpdmlzb3IoaW5TaXplLCBNYXRoLmZsb29yKE1hdGguc3FydChpblNpemUpKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWR1Y2VfdXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgUmVsdSB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIHJlY3RpZmllZCBsaW5lYXIgZWxlbWVudC13aXNlOiBgbWF4KHgsIDApYC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFstMSwgMiwgLTMsIDRdKTtcbiAqXG4gKiB4LnJlbHUoKS5wcmludCgpOyAgLy8gb3IgdGYucmVsdSh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLiBJZiB0aGUgZHR5cGUgaXMgYGJvb2xgLCB0aGUgb3V0cHV0IGR0eXBlIHdpbGwgYmVcbiAqICAgICBgaW50MzInLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiByZWx1Xyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAncmVsdScpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChSZWx1LCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IHJlbHUgPSBvcCh7IHJlbHVfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVsdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgUmVsdTYgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyByZWN0aWZpZWQgbGluZWFyIDYgZWxlbWVudC13aXNlOiBgbWluKG1heCh4LCAwKSwgNilgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWy0xLCAyLCAtMywgOF0pO1xuICpcbiAqIHgucmVsdTYoKS5wcmludCgpOyAgLy8gb3IgdGYucmVsdTYoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci4gSWYgdGhlIGR0eXBlIGlzIGBib29sYCwgdGhlIG91dHB1dCBkdHlwZSB3aWxsIGJlXG4gKiAgICAgYGludDMyJy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gcmVsdTZfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdyZWx1NicpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChSZWx1NiwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCByZWx1NiA9IG9wKHsgcmVsdTZfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVsdTYuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFJlc2hhcGUgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBSZXNoYXBlcyBhIGB0Zi5UZW5zb3JgIHRvIGEgZ2l2ZW4gc2hhcGUuXG4gKlxuICogR2l2ZW4gYW4gaW5wdXQgdGVuc29yLCByZXR1cm5zIGEgbmV3IHRlbnNvciB3aXRoIHRoZSBzYW1lIHZhbHVlcyBhcyB0aGVcbiAqIGlucHV0IHRlbnNvciB3aXRoIHNoYXBlIGBzaGFwZWAuXG4gKlxuICogSWYgb25lIGNvbXBvbmVudCBvZiBzaGFwZSBpcyB0aGUgc3BlY2lhbCB2YWx1ZSAtMSwgdGhlIHNpemUgb2YgdGhhdFxuICogZGltZW5zaW9uIGlzIGNvbXB1dGVkIHNvIHRoYXQgdGhlIHRvdGFsIHNpemUgcmVtYWlucyBjb25zdGFudC4gSW5cbiAqIHBhcnRpY3VsYXIsIGEgc2hhcGUgb2YgWy0xXSBmbGF0dGVucyBpbnRvIDEtRC4gQXQgbW9zdCBvbmUgY29tcG9uZW50IG9mXG4gKiBzaGFwZSBjYW4gYmUgLTEuXG4gKlxuICogSWYgc2hhcGUgaXMgMS1EIG9yIGhpZ2hlciwgdGhlbiB0aGUgb3BlcmF0aW9uIHJldHVybnMgYSB0ZW5zb3Igd2l0aCBzaGFwZVxuICogc2hhcGUgZmlsbGVkIHdpdGggdGhlIHZhbHVlcyBvZiB0ZW5zb3IuIEluIHRoaXMgY2FzZSwgdGhlIG51bWJlciBvZlxuICogZWxlbWVudHMgaW1wbGllZCBieSBzaGFwZSBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW5cbiAqIHRlbnNvci5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzLCA0XSk7XG4gKiB4LnJlc2hhcGUoWzIsIDJdKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciB0byBiZSByZXNoYXBlZC5cbiAqIEBwYXJhbSBzaGFwZSBBbiBhcnJheSBvZiBpbnRlZ2VycyBkZWZpbmluZyB0aGUgb3V0cHV0IHRlbnNvciBzaGFwZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdUcmFuc2Zvcm1hdGlvbnMnfVxuICovXG5mdW5jdGlvbiByZXNoYXBlXyh4LCBzaGFwZSkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3Jlc2hhcGUnLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgY29uc3QgYXR0cnMgPSB7IHNoYXBlIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoUmVzaGFwZSwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgcmVzaGFwZSA9IG9wKHsgcmVzaGFwZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZXNoYXBlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBSZXZlcnNlIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV2ZXJzZXMgYSBgdGYuVGVuc29yYCBhbG9uZyBhIHNwZWNpZmllZCBheGlzLlxuICpcbiAqIEFsc28gYXZhaWxhYmxlIGFyZSBzdHJpY3RlciByYW5rLXNwZWNpZmljIG1ldGhvZHMgdGhhdCBhc3NlcnQgdGhhdCBgeGAgaXNcbiAqIG9mIHRoZSBnaXZlbiByYW5rOlxuICogICAtIGB0Zi5yZXZlcnNlMWRgXG4gKiAgIC0gYHRmLnJldmVyc2UyZGBcbiAqICAgLSBgdGYucmV2ZXJzZTNkYFxuICogICAtIGB0Zi5yZXZlcnNlNGRgXG4gKlxuICogRXhjZXB0IGB0Zi5yZXZlcnNlMWRgICh3aGljaCBkb2VzIG5vdCBoYXZlIGF4aXMgcGFyYW0pLCBhbGwgbWV0aG9kcyBoYXZlXG4gKiBzYW1lIHNpZ25hdHVyZSBhcyB0aGlzIG1ldGhvZC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzLCA0XSk7XG4gKlxuICogeC5yZXZlcnNlKCkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pO1xuICpcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5yZXZlcnNlKGF4aXMpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IgdG8gYmUgcmV2ZXJzZWQuXG4gKiBAcGFyYW0gYXhpcyBUaGUgc2V0IG9mIGRpbWVuc2lvbnMgdG8gcmV2ZXJzZS4gTXVzdCBiZSBpbiB0aGVcbiAqICAgICByYW5nZSBbLXJhbmsoeCksIHJhbmsoeCkpLiBEZWZhdWx0cyB0byBhbGwgYXhlcy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdTbGljaW5nIGFuZCBKb2luaW5nJ31cbiAqL1xuZnVuY3Rpb24gcmV2ZXJzZV8oeCwgYXhpcykge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3JldmVyc2UnKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgY29uc3QgYXR0cnMgPSB7IGRpbXM6IGF4aXMgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChSZXZlcnNlLCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCByZXZlcnNlID0gb3AoeyByZXZlcnNlXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJldmVyc2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJldmVyc2UgfSBmcm9tICcuL3JldmVyc2UnO1xuLyoqXG4gKiBSZXZlcnNlcyBhIGB0Zi5UZW5zb3IxRGAuXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqL1xuZnVuY3Rpb24gcmV2ZXJzZTFkXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAncmV2ZXJzZScpO1xuICAgIHV0aWwuYXNzZXJ0KCR4LnJhbmsgPT09IDEsICgpID0+IGBFcnJvciBpbiByZXZlcnNlMUQ6IHggbXVzdCBiZSByYW5rIDEgYnV0IGdvdCByYW5rICR7JHgucmFua30uYCk7XG4gICAgcmV0dXJuIHJldmVyc2UoJHgsIDApO1xufVxuZXhwb3J0IGNvbnN0IHJldmVyc2UxZCA9IG9wKHsgcmV2ZXJzZTFkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJldmVyc2VfMWQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJldmVyc2UgfSBmcm9tICcuL3JldmVyc2UnO1xuLyoqXG4gKiBSZXZlcnNlcyBhIGB0Zi5UZW5zb3IyRGAgYWxvbmcgYSBzcGVjaWZpZWQgYXhpcy5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICogQHBhcmFtIGF4aXMgVGhlIHNldCBvZiBkaW1lbnNpb25zIHRvIHJldmVyc2UuIE11c3QgYmUgaW4gdGhlXG4gKiAgICAgcmFuZ2UgWy1yYW5rKHgpLCByYW5rKHgpKS4gRGVmYXVsdHMgdG8gYWxsIGF4ZXMuXG4gKi9cbmZ1bmN0aW9uIHJldmVyc2UyZF8oeCwgYXhpcykge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3JldmVyc2UnKTtcbiAgICB1dGlsLmFzc2VydCgkeC5yYW5rID09PSAyLCAoKSA9PiBgRXJyb3IgaW4gcmV2ZXJzZTJEOiB4IG11c3QgYmUgcmFuayAyIGJ1dCBnb3QgcmFuayAkeyR4LnJhbmt9LmApO1xuICAgIHJldHVybiByZXZlcnNlKCR4LCBheGlzKTtcbn1cbmV4cG9ydCBjb25zdCByZXZlcnNlMmQgPSBvcCh7IHJldmVyc2UyZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZXZlcnNlXzJkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXZlcnNlIH0gZnJvbSAnLi9yZXZlcnNlJztcbi8qKlxuICogUmV2ZXJzZXMgYSBgdGYuVGVuc29yM0RgIGFsb25nIGEgc3BlY2lmaWVkIGF4aXMuXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBheGlzIFRoZSBzZXQgb2YgZGltZW5zaW9ucyB0byByZXZlcnNlLiBNdXN0IGJlIGluIHRoZVxuICogICAgIHJhbmdlIFstcmFuayh4KSwgcmFuayh4KSkuIERlZmF1bHRzIHRvIGFsbCBheGVzLlxuICovXG5mdW5jdGlvbiByZXZlcnNlM2RfKHgsIGF4aXMpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdyZXZlcnNlJyk7XG4gICAgdXRpbC5hc3NlcnQoJHgucmFuayA9PT0gMywgKCkgPT4gYEVycm9yIGluIHJldmVyc2UzRDogeCBtdXN0IGJlIHJhbmsgMyBidXQgZ290IHJhbmsgJHskeC5yYW5rfS5gKTtcbiAgICByZXR1cm4gcmV2ZXJzZSgkeCwgYXhpcyk7XG59XG5leHBvcnQgY29uc3QgcmV2ZXJzZTNkID0gb3AoeyByZXZlcnNlM2RfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmV2ZXJzZV8zZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmV2ZXJzZSB9IGZyb20gJy4vcmV2ZXJzZSc7XG4vKipcbiAqIFJldmVyc2VzIGEgYHRmLlRlbnNvcjREYCBhbG9uZyBhIHNwZWNpZmllZCBheGlzLlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gYXhpcyBUaGUgc2V0IG9mIGRpbWVuc2lvbnMgdG8gcmV2ZXJzZS4gTXVzdCBiZSBpbiB0aGVcbiAqICAgICByYW5nZSBbLXJhbmsoeCksIHJhbmsoeCkpLiBEZWZhdWx0cyB0byBhbGwgYXhlcy5cbiAqL1xuZnVuY3Rpb24gcmV2ZXJzZTRkXyh4LCBheGlzKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAncmV2ZXJzZScpO1xuICAgIHV0aWwuYXNzZXJ0KCR4LnJhbmsgPT09IDQsICgpID0+IGBFcnJvciBpbiByZXZlcnNlNEQ6IHggbXVzdCBiZSByYW5rIDQgYnV0IGdvdCByYW5rICR7JHgucmFua30uYCk7XG4gICAgcmV0dXJuIHJldmVyc2UoJHgsIGF4aXMpO1xufVxuZXhwb3J0IGNvbnN0IHJldmVyc2U0ZCA9IG9wKHsgcmV2ZXJzZTRkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJldmVyc2VfNGQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLy8gUmV0dXJucyB0aGUgaW1hZ2UgY2VudGVyIGluIHBpeGVscy5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbWFnZUNlbnRlcihjZW50ZXIsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoKSB7XG4gICAgY29uc3QgY2VudGVyWCA9IGltYWdlV2lkdGggKiAodHlwZW9mIGNlbnRlciA9PT0gJ251bWJlcicgPyBjZW50ZXIgOiBjZW50ZXJbMF0pO1xuICAgIGNvbnN0IGNlbnRlclkgPSBpbWFnZUhlaWdodCAqICh0eXBlb2YgY2VudGVyID09PSAnbnVtYmVyJyA/IGNlbnRlciA6IGNlbnRlclsxXSk7XG4gICAgcmV0dXJuIFtjZW50ZXJYLCBjZW50ZXJZXTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJvdGF0ZV91dGlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBSb3VuZCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIHJvdW5kIG9mIGlucHV0IGB0Zi5UZW5zb3JgIGVsZW1lbnQtd2lzZTogYHJvdW5kKHgpYC5cbiAqIEl0IGltcGxlbWVudHMgYmFua2VyJ3Mgcm91bmRpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbLjYsIDEuMSwgLTMuM10pO1xuICpcbiAqIHgucm91bmQoKS5wcmludCgpOyAgLy8gb3IgdGYucm91bmQoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gcm91bmRfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdyb3VuZCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChSb3VuZCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCByb3VuZCA9IG9wKHsgcm91bmRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cm91bmQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFJzcXJ0IH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgcmVjaXByb2NhbCBvZiBzcXVhcmUgcm9vdCBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOlxuICogYHkgPSAxIC8gc3FydCh4KWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCA0LCAtMV0pO1xuICpcbiAqIHgucnNxcnQoKS5wcmludCgpOyAgLy8gb3IgdGYucnNxcnQoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gcnNxcnRfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdyc3FydCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChSc3FydCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCByc3FydCA9IG9wKHsgcnNxcnRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cnNxcnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgaXNUeXBlZEFycmF5IH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBtYWtlVGVuc29yIH0gZnJvbSAnLi90ZW5zb3Jfb3BzX3V0aWwnO1xuLyoqXG4gKiBDcmVhdGVzIHJhbmstMCBgdGYuVGVuc29yYCAoc2NhbGFyKSB3aXRoIHRoZSBwcm92aWRlZCB2YWx1ZSBhbmQgZHR5cGUuXG4gKlxuICogVGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBjYW4gYmUgYWNoaWV2ZWQgd2l0aCBgdGYudGVuc29yYCwgYnV0IGluIGdlbmVyYWxcbiAqIHdlIHJlY29tbWVuZCB1c2luZyBgdGYuc2NhbGFyYCBhcyBpdCBtYWtlcyB0aGUgY29kZSBtb3JlIHJlYWRhYmxlLlxuICpcbiAqIGBgYGpzXG4gKiB0Zi5zY2FsYXIoMy4xNCkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIHNjYWxhci5cbiAqIEBwYXJhbSBkdHlwZSBUaGUgZGF0YSB0eXBlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjYWxhcih2YWx1ZSwgZHR5cGUpIHtcbiAgICBpZiAoKChpc1R5cGVkQXJyYXkodmFsdWUpICYmIGR0eXBlICE9PSAnc3RyaW5nJykgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpICYmXG4gICAgICAgIGR0eXBlICE9PSAnY29tcGxleDY0Jykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vycm9yIGNyZWF0aW5nIGEgbmV3IFNjYWxhcjogdmFsdWUgbXVzdCBiZSBhIHByaW1pdGl2ZSAnICtcbiAgICAgICAgICAgICcobnVtYmVyfGJvb2xlYW58c3RyaW5nKScpO1xuICAgIH1cbiAgICBpZiAoZHR5cGUgPT09ICdzdHJpbmcnICYmIGlzVHlwZWRBcnJheSh2YWx1ZSkgJiZcbiAgICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignV2hlbiBtYWtpbmcgYSBzY2FsYXIgZnJvbSBlbmNvZGVkIHN0cmluZywgJyArXG4gICAgICAgICAgICAndGhlIHZhbHVlIG11c3QgYmUgYFVpbnQ4QXJyYXlgLicpO1xuICAgIH1cbiAgICBjb25zdCBzaGFwZSA9IFtdO1xuICAgIGNvbnN0IGluZmVycmVkU2hhcGUgPSBbXTtcbiAgICByZXR1cm4gbWFrZVRlbnNvcih2YWx1ZSwgc2hhcGUsIGluZmVycmVkU2hhcGUsIGR0eXBlKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNjYWxhci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgU2NhdHRlck5kIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCAqIGFzIHNjYXR0ZXJfbmRfdXRpbCBmcm9tICcuL3NjYXR0ZXJfbmRfdXRpbCc7XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdGVuc29yIGJ5IGFwcGx5aW5nIHNwYXJzZSB1cGRhdGVzIHRvIGluZGl2aWR1YWxcbiAqIHZhbHVlcyBvciBzbGljZXMgd2l0aGluIGEgemVybyB0ZW5zb3Igb2YgdGhlIGdpdmVuIHNoYXBlIHRlbnNvciBhY2NvcmRpbmcgdG9cbiAqIGluZGljZXMuIFRoaXMgb3BlcmF0b3IgaXMgdGhlIGludmVyc2Ugb2YgdGhlIGB0Zi5nYXRoZXJORGAgb3BlcmF0b3Igd2hpY2hcbiAqIGV4dHJhY3RzIHZhbHVlcyBvciBzbGljZXMgZnJvbSBhIGdpdmVuIHRlbnNvci5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgaW5kaWNlcyA9IHRmLnRlbnNvcjJkKFs0LCAzLCAxLCA3XSwgWzQsIDFdLCAnaW50MzInKTtcbiAqIGNvbnN0IHVwZGF0ZXMgPSB0Zi50ZW5zb3IxZChbOSwgMTAsIDExLCAxMl0pO1xuICogY29uc3Qgc2hhcGUgPSBbOF07XG4gKiB0Zi5zY2F0dGVyTkQoaW5kaWNlcywgdXBkYXRlcywgc2hhcGUpLnByaW50KCkgLy9bMCwgMTEsIDAsIDEwLCA5LCAwLCAwLCAxMl1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBpbmRpY2VzIFRoZSB0ZW5zb3IgY29udGFpbnMgdGhlIGluZGljZXMgaW50byB0aGUgb3V0cHV0IHRlbnNvci5cbiAqIEBwYXJhbSB1cGRhdGVzIFRoZSB0ZW5zb3IgY29udGFpbnMgdGhlIHZhbHVlIGZvciB0aGUgaW5kaWNlcy5cbiAqIEBwYXJhbSBzaGFwZTogVGhlIHNoYXBlIG9mIHRoZSBvdXRwdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1NsaWNpbmcgYW5kIEpvaW5pbmcnfVxuICovXG5mdW5jdGlvbiBzY2F0dGVyTkRfKGluZGljZXMsIHVwZGF0ZXMsIHNoYXBlKSB7XG4gICAgY29uc3QgJGluZGljZXMgPSBjb252ZXJ0VG9UZW5zb3IoaW5kaWNlcywgJ2luZGljZXMnLCAnc2NhdHRlck5EJywgJ2ludDMyJyk7XG4gICAgY29uc3QgJHVwZGF0ZXMgPSBjb252ZXJ0VG9UZW5zb3IodXBkYXRlcywgJ3VwZGF0ZXMnLCAnc2NhdHRlck5EJyk7XG4gICAgc2NhdHRlcl9uZF91dGlsLnZhbGlkYXRlSW5wdXQoJHVwZGF0ZXMsICRpbmRpY2VzLCBzaGFwZSk7XG4gICAgY29uc3QgaW5wdXRzID0geyBpbmRpY2VzOiAkaW5kaWNlcywgdXBkYXRlczogJHVwZGF0ZXMgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgc2hhcGUgfTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoU2NhdHRlck5kLCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBzY2F0dGVyTkQgPSBvcCh7IHNjYXR0ZXJORF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zY2F0dGVyX25kLmpzLm1hcCIsImltcG9ydCB7IGNvbXB1dGVTdHJpZGVzLCBzaXplRnJvbVNoYXBlIH0gZnJvbSAnLi4vdXRpbCc7XG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdXBkYXRlcy5zaGFwZSA9IGluZGljZXMuc2hhcGVbOmJhdGNoRGltXSArXG4gKiBzaGFwZVtzbGljZURpbTpdXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlVXBkYXRlU2hhcGUoc2hhcGUsIGluZGljZXMsIHVwZGF0ZXMpIHtcbiAgICBjb25zdCBzbGljZURpbSA9IChpbmRpY2VzLnJhbmsgPiAxKSA/IGluZGljZXMuc2hhcGVbaW5kaWNlcy5yYW5rIC0gMV0gOiAxO1xuICAgIGNvbnN0IGJhdGNoRGltID0gKGluZGljZXMucmFuayA+IDEpID8gaW5kaWNlcy5yYW5rIC0gMSA6IDE7XG4gICAgY29uc3Qgc2hhcGVFcnJvciA9ICdNdXN0IGhhdmUgdXBkYXRlcy5zaGFwZSA9IGluZGljZXMuc2hhcGVbOmJhdGNoRGltXSArICcgK1xuICAgICAgICBgc2hhcGVbc2xpY2VEaW06XSwgZ290IHVwZGF0ZXMuc2hhcGU6ICR7dXBkYXRlcy5zaGFwZX1gICtcbiAgICAgICAgYCwgaW5kaWNlcy5zaGFwZTogJHtpbmRpY2VzLnNoYXBlfSwgc2hhcGU6ICR7c2hhcGV9YCArXG4gICAgICAgIGAsIHNsaWNlRGltOiAke3NsaWNlRGltfSwgYW5kIGJhdGNoRGltOiAke2JhdGNoRGltfS5gO1xuICAgIGlmICh1cGRhdGVzLnJhbmsgPCBiYXRjaERpbSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3Ioc2hhcGVFcnJvciArIGAgdXBkYXRlLnJhbmsgPCAke2JhdGNoRGltfS4gYCk7XG4gICAgfVxuICAgIGlmIChzaGFwZS5sZW5ndGggPCBzbGljZURpbSArICh1cGRhdGVzLnJhbmsgLSBiYXRjaERpbSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHNoYXBlRXJyb3IgK1xuICAgICAgICAgICAgYCBPdXRwdXQgc2hhcGUgbGVuZ3RoIDwgJHtzbGljZURpbSArICh1cGRhdGVzLnJhbmsgLSBiYXRjaERpbSl9YCk7XG4gICAgfVxuICAgIGlmICh1cGRhdGVzLnJhbmsgIT09IGJhdGNoRGltICsgc2hhcGUubGVuZ3RoIC0gc2xpY2VEaW0pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHNoYXBlRXJyb3IgKyBgIHVwZGF0ZS5yYW5rICE9ICR7YmF0Y2hEaW0gKyBzaGFwZS5sZW5ndGggLSBzbGljZURpbX1gKTtcbiAgICB9XG4gICAgZm9yIChsZXQgZCA9IDA7IGQgPCBiYXRjaERpbTsgKytkKSB7XG4gICAgICAgIGlmICh1cGRhdGVzLnNoYXBlW2RdICE9PSBpbmRpY2VzLnNoYXBlW2RdKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3Ioc2hhcGVFcnJvciArXG4gICAgICAgICAgICAgICAgYCB1cGRhdGVzLnNoYXBlWyR7ZH1dICgke3VwZGF0ZXMuc2hhcGVbZF19KSAhPSBpbmRpY2VzLnNoYXBlWyR7ZH1dICgke2luZGljZXMuc2hhcGVbZF19KS5gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCBkID0gMDsgZCA8IHVwZGF0ZXMucmFuayAtIGJhdGNoRGltOyArK2QpIHtcbiAgICAgICAgaWYgKHVwZGF0ZXMuc2hhcGVbZCArIGJhdGNoRGltXSAhPT0gc2hhcGVbZCArIHNsaWNlRGltXSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHNoYXBlRXJyb3IgK1xuICAgICAgICAgICAgICAgIGAgdXBkYXRlcy5zaGFwZVske2QgKyBiYXRjaERpbX1dICgke3VwZGF0ZXMuc2hhcGVbZCArIGJhdGNoRGltXX0pICE9IHNoYXBlWyR7ZCArIGJhdGNoRGltfV0gKCR7c2hhcGVbZCArIGJhdGNoRGltXX0pYCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIFZhbGlkYXRlIHNjYXR0ZXIgbmQgaW5wdXRzLlxuICpcbiAqIEBwYXJhbSB1cGRhdGUgVGhlIHRlbnNvciBjb250YWlucyB0aGUgdXBkYXRlIHZhbHVlcy5cbiAqIEBwYXJhbSBpbmRpY2VzIFRoZSB0ZW5zb3IgY29udGFpbnMgdGhlIGluZGljZXMgZm9yIHRoZSB1cGRhdGUgdmFsdWVzLlxuICogQHBhcmFtIHNoYXBlIFRoZSBzaGFwZSBvZiB0aGUgb3V0cHV0IHRlbnNvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlSW5wdXQodXBkYXRlcywgaW5kaWNlcywgc2hhcGUpIHtcbiAgICBpZiAoaW5kaWNlcy5yYW5rIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RmLnNjYXR0ZXJORCgpIGV4cGVjdHMgdGhlIGluZGljZXMgdG8gYmUgcmFuayAxIG9yIGhpZ2hlciwnICtcbiAgICAgICAgICAgIGAgYnV0IHRoZSByYW5rIHdhcyAke2luZGljZXMucmFua30uYCk7XG4gICAgfVxuICAgIGlmICh1cGRhdGVzLnJhbmsgPCAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGYuc2NhdHRlck5EKCkgZXhwZWN0cyB0aGUgdXBkYXRlcyB0byBiZSByYW5rIDEgb3IgaGlnaGVyLCcgK1xuICAgICAgICAgICAgYCBidXQgdGhlIHJhbmsgd2FzICR7dXBkYXRlcy5yYW5rfS5gKTtcbiAgICB9XG4gICAgaWYgKGluZGljZXMuZHR5cGUgIT09ICdpbnQzMicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgZHR5cGUgb2YgJ2luZGljZXMnIHNob3VsZCBiZSBpbnQzMiwgYnV0IGdvdCBkdHlwZTogJHtpbmRpY2VzLmR0eXBlfWApO1xuICAgIH1cbiAgICBpZiAoc2hhcGUubGVuZ3RoIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE91dHB1dCByYW5rIG11c3QgYmUgZ3JlYXRlciBvciBlcXVhbCB0byAxLCBidXQgZ290IHNoYXBlOiAke3NoYXBlfWApO1xuICAgIH1cbiAgICBpZiAoc2hhcGUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGlmIChpbmRpY2VzLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW5kaWNlcyBzcGVjaWZpZWQgZm9yIGVtcHR5IG91dHB1dC4gaW5kaWNlcyBzaGFwZTogJHtpbmRpY2VzLnNoYXBlfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVzLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVXBkYXRlcyBzcGVjaWZpZWQgZm9yIGVtcHR5IG91dHB1dC4gdXBkYXRlcyBzaGFwZTogJHt1cGRhdGVzLnNoYXBlfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhbGlkYXRlVXBkYXRlU2hhcGUoc2hhcGUsIGluZGljZXMsIHVwZGF0ZXMpO1xufVxuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIHNoYXBlIGluZm9ybWF0aW9uIGZvciB0aGUgb3V0cHV0LlxuICpcbiAqIEBwYXJhbSB1cGRhdGUgVGhlIHRlbnNvciBjb250YWlucyB0aGUgdXBkYXRlIHZhbHVlcy5cbiAqIEBwYXJhbSBpbmRpY2VzIFRoZSB0ZW5zb3IgY29udGFpbnMgdGhlIGluZGljZXMgZm9yIHRoZSB1cGRhdGUgdmFsdWVzLlxuICogQHBhcmFtIHNoYXBlIFRoZSBzaGFwZSBvZiB0aGUgb3V0cHV0IHRlbnNvci5cbiAqXG4gKiBAcmV0dXJucyBTY2F0dGVyU2hhcGVJbmZvXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVTaGFwZXModXBkYXRlcywgaW5kaWNlcywgc2hhcGUpIHtcbiAgICAvLyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIGluIGluZGljZXNcbiAgICBjb25zdCBpbmRpY2VzUmFuayA9IGluZGljZXMuc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IHNsaWNlUmFuayA9IChpbmRpY2VzUmFuayA+IDEpID8gaW5kaWNlcy5zaGFwZVtpbmRpY2VzUmFuayAtIDFdIDogMTtcbiAgICAvLyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBlbGVtZW50cyB0aGF0IG1ha2UgdXAgZWFjaCBzbGljZSBvZiBvdXIgdXBkYXRlZFxuICAgIC8vIHRlbnNvci4gVGhpcyBhbGxvd3MgdXMgdG8gd29yayB3aXRoIGZsYXR0ZW5lZCB0ZW5zb3JzIGFuZCBjb3B5IG92ZXIgd2hvbGVcbiAgICAvLyBzbGljZXMgYXQgYSB0aW1lLlxuICAgIGNvbnN0IHRvdGFsTmQgPSBzaGFwZS5sZW5ndGg7XG4gICAgbGV0IHNsaWNlU2l6ZSA9IDE7XG4gICAgZm9yIChsZXQgaSA9IHNsaWNlUmFuazsgaSA8IHRvdGFsTmQ7ICsraSkge1xuICAgICAgICBzbGljZVNpemUgKj0gc2hhcGVbaV07XG4gICAgfVxuICAgIGNvbnN0IHNhZmVTbGljZURpbSA9IChzbGljZVJhbmsgPCAxKSA/IDEgOiBzbGljZVJhbms7XG4gICAgY29uc3QgbnVtVXBkYXRlcyA9IHNpemVGcm9tU2hhcGUoaW5kaWNlcy5zaGFwZSkgLyBzYWZlU2xpY2VEaW07XG4gICAgY29uc3Qgc3RyaWRlcyA9IFsuLi5jb21wdXRlU3RyaWRlcyhzaGFwZS5zbGljZSgwLCBzbGljZVJhbmspKSwgMV07XG4gICAgY29uc3Qgb3V0cHV0U2l6ZSA9IHNpemVGcm9tU2hhcGUoc2hhcGUpO1xuICAgIHJldHVybiB7IHNsaWNlUmFuaywgbnVtVXBkYXRlcywgc2xpY2VTaXplLCBzdHJpZGVzLCBvdXRwdXRTaXplIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zY2F0dGVyX25kX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgbmVhcmVzdERpdmlzb3IgfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IFBBUkFMTEVMSVpFX1RIUkVTSE9MRCB9IGZyb20gJy4vcmVkdWNlX3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIHNlZ09wQ29tcHV0ZU9wdGltYWxXaW5kb3dTaXplKGluU2l6ZSwgbnVtU2VnbWVudHMpIHtcbiAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgIGxldCByZXM7XG4gICAgaWYgKGluU2l6ZSA8PSBQQVJBTExFTElaRV9USFJFU0hPTEQpIHtcbiAgICAgICAgcmVzID0gaW5TaXplO1xuICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlcyA9IG5lYXJlc3REaXZpc29yKGluU2l6ZSwgTWF0aC5mbG9vcihNYXRoLnNxcnQoaW5TaXplKSkpO1xuICAgIH1cbiAgICB3aGlsZSAoIWRvbmUpIHtcbiAgICAgICAgaWYgKHJlcyA+IG51bVNlZ21lbnRzIHx8IHJlcyA9PT0gaW5TaXplKSB7XG4gICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlcyA9IG5lYXJlc3REaXZpc29yKGluU2l6ZSwgcmVzICsgMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlT3V0U2hhcGUoYVNoYXBlLCBheGlzLCBudW1TZWdtZW50cykge1xuICAgIGNvbnN0IG91dFNoYXBlID0gW107XG4gICAgY29uc3QgcmFuayA9IGFTaGFwZS5sZW5ndGg7XG4gICAgZm9yIChsZXQgZGltID0gMDsgZGltIDwgcmFuazsgZGltKyspIHtcbiAgICAgICAgaWYgKGRpbSAhPT0gYXhpcykge1xuICAgICAgICAgICAgb3V0U2hhcGUucHVzaChhU2hhcGVbZGltXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvdXRTaGFwZS5wdXNoKG51bVNlZ21lbnRzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0U2hhcGU7XG59XG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdEdhdGhlck9wU2hhcGVJbmZvKHgsIGluZGljZXMsIGF4aXMsIGJhdGNoRGltcykge1xuICAgIGNvbnN0IGluZGljZXNSYW5rID0gaW5kaWNlcy5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcbiAgICBpZiAoYmF0Y2hEaW1zICE9PSAwKSB7XG4gICAgICAgIGlmIChiYXRjaERpbXMgPCAtaW5kaWNlc1JhbmsgfHwgYmF0Y2hEaW1zID4gaW5kaWNlc1JhbmspIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0IGJhdGNoRGltcyBpbiB0aGUgcmFuZ2Ugb2YgWy0ke2luZGljZXNSYW5rfSwgJHtpbmRpY2VzUmFua31dLCBidXQgZ290ICR7YmF0Y2hEaW1zfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChiYXRjaERpbXMgPCAwKSB7XG4gICAgICAgIGJhdGNoRGltcyArPSBpbmRpY2VzUmFuaztcbiAgICB9XG4gICAgaWYgKGJhdGNoRGltcyA+IHhSYW5rKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgYmF0Y2hEaW1zICgke2JhdGNoRGltc30pIG11c3QgYmUgbGVzcyB0aGFuIHJhbmsoeCkgKFxuICAgICR7eFJhbmt9KS5gKTtcbiAgICB9XG4gICAgaWYgKGF4aXMgPCBiYXRjaERpbXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBiYXRjaERpbXMgKCR7YmF0Y2hEaW1zfSkgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYXhpcyAoJHtheGlzfSkuYCk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmF0Y2hEaW1zOyArK2kpIHtcbiAgICAgICAgaWYgKHguc2hhcGVbaV0gIT09IGluZGljZXMuc2hhcGVbaV0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgeC5zaGFwZVske2l9XTogJHt4LnNoYXBlW2ldfSBzaG91bGQgYmUgZXF1YWwgdG8gaW5kaWNlcy5zaGFwZVske2l9XTogJHtpbmRpY2VzLnNoYXBlW2ldfS5gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBkaW1TaXplID0geC5zaGFwZVtheGlzXTtcbiAgICBjb25zdCBvdXRwdXRTaGFwZSA9IFtdO1xuICAgIGxldCBiYXRjaFNpemUgPSAxO1xuICAgIGxldCBvdXRlclNpemUgPSAxO1xuICAgIGxldCBzbGljZVNpemUgPSAxO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmF0Y2hEaW1zOyArK2kpIHtcbiAgICAgICAgb3V0cHV0U2hhcGUucHVzaCh4LnNoYXBlW2ldKTtcbiAgICAgICAgYmF0Y2hTaXplICo9IHguc2hhcGVbaV07XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSBiYXRjaERpbXM7IGkgPCBheGlzOyBpKyspIHtcbiAgICAgICAgb3V0cHV0U2hhcGUucHVzaCh4LnNoYXBlW2ldKTtcbiAgICAgICAgb3V0ZXJTaXplICo9IHguc2hhcGVbaV07XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSBiYXRjaERpbXM7IGkgPCBpbmRpY2VzUmFuazsgaSsrKSB7XG4gICAgICAgIG91dHB1dFNoYXBlLnB1c2goaW5kaWNlcy5zaGFwZVtpXSk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSBheGlzICsgMTsgaSA8IHhSYW5rOyBpKyspIHtcbiAgICAgICAgb3V0cHV0U2hhcGUucHVzaCh4LnNoYXBlW2ldKTtcbiAgICAgICAgc2xpY2VTaXplICo9IHguc2hhcGVbaV07XG4gICAgfVxuICAgIHJldHVybiB7IGJhdGNoU2l6ZSwgc2xpY2VTaXplLCBvdXRlclNpemUsIGRpbVNpemUsIG91dHB1dFNoYXBlIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zZWdtZW50X3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFNlbHUgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBzY2FsZWQgZXhwb25lbnRpYWwgbGluZWFyIGVsZW1lbnQtd2lzZS5cbiAqXG4gKiBgeCA8IDAgPyBzY2FsZSAqIGFscGhhICogKGV4cCh4KSAtIDEpIDogeGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFstMSwgMiwgLTMsIDRdKTtcbiAqXG4gKiB4LnNlbHUoKS5wcmludCgpOyAgLy8gb3IgdGYuc2VsdSh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBzZWx1Xyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc2VsdScpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChTZWx1LCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IHNlbHUgPSBvcCh7IHNlbHVfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2VsdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5leHBvcnQgY29uc3QgU0VMVV9TQ0FMRUFMUEhBID0gMS43NTgwOTkzNDA4NDczNzY4NTk5NDAyMTc1MjA4MTIzO1xuZXhwb3J0IGNvbnN0IFNFTFVfU0NBTEUgPSAxLjA1MDcwMDk4NzM1NTQ4MDQ5MzQxOTMzNDk4NTI5NDY7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zZWx1X3V0aWwuanMubWFwIiwiaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBjb252MmQgfSBmcm9tICcuL2NvbnYyZCc7XG5pbXBvcnQgeyBkZXB0aHdpc2VDb252MmQgfSBmcm9tICcuL2RlcHRod2lzZV9jb252MmQnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbi8qKlxuICogMi1EIGNvbnZvbHV0aW9uIHdpdGggc2VwYXJhYmxlIGZpbHRlcnMuXG4gKlxuICogUGVyZm9ybXMgYSBkZXB0aHdpc2UgY29udm9sdXRpb24gdGhhdCBhY3RzIHNlcGFyYXRlbHkgb24gY2hhbm5lbHMgZm9sbG93ZWRcbiAqIGJ5IGEgcG9pbnR3aXNlIGNvbnZvbHV0aW9uIHRoYXQgbWl4ZXMgY2hhbm5lbHMuIE5vdGUgdGhhdCB0aGlzIGlzXG4gKiBzZXBhcmFiaWxpdHkgYmV0d2VlbiBkaW1lbnNpb25zIFsxLCAyXSBhbmQgMywgbm90IHNwYXRpYWwgc2VwYXJhYmlsaXR5XG4gKiBiZXR3ZWVuIGRpbWVuc2lvbnMgMSBhbmQgMi5cbiAqXG4gKiBTZWVcbiAqIFtodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vc2VwYXJhYmxlX2NvbnYyZF0oXG4gKiAgICAgaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL3NlcGFyYWJsZV9jb252MmQpXG4gKiBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IsIG9mIHJhbmsgNCBvciByYW5rIDMsIG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgaW5DaGFubmVsc11gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXNcbiAqIGFzc3VtZWQuXG4gKiBAcGFyYW0gZGVwdGh3aXNlRmlsdGVyIFRoZSBkZXB0aHdpc2UgZmlsdGVyIHRlbnNvciwgcmFuayA0LCBvZiBzaGFwZVxuICogICAgIGBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5DaGFubmVscywgY2hhbm5lbE11bHRpcGxpZXJdYC4gVGhpcyBpc1xuICogICAgIHRoZSBmaWx0ZXIgdXNlZCBpbiB0aGUgZmlyc3Qgc3RlcC5cbiAqIEBwYXJhbSBwb2ludHdpc2VGaWx0ZXIgVGhlIHBvaW50d2lzZSBmaWx0ZXIgdGVuc29yLCByYW5rIDQsIG9mIHNoYXBlXG4gKiAgICAgYFsxLCAxLCBpbkNoYW5uZWxzICogY2hhbm5lbE11bHRpcGxpZXIsIG91dENoYW5uZWxzXWAuIFRoaXMgaXNcbiAqICAgICB0aGUgZmlsdGVyIHVzZWQgaW4gdGhlIHNlY29uZCBzdGVwLlxuICogQHBhcmFtIHN0cmlkZXMgVGhlIHN0cmlkZXMgb2YgdGhlIGNvbnZvbHV0aW9uOiBgW3N0cmlkZUhlaWdodCxcbiAqIHN0cmlkZVdpZHRoXWAuIElmIHN0cmlkZXMgaXMgYSBzaW5nbGUgbnVtYmVyLCB0aGVuIGBzdHJpZGVIZWlnaHQgPT1cbiAqIHN0cmlkZVdpZHRoYC5cbiAqIEBwYXJhbSBwYWQgVGhlIHR5cGUgb2YgcGFkZGluZyBhbGdvcml0aG0uXG4gKiAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgLSBgdmFsaWRgOiBvdXRwdXQgd2lsbCBiZSBzbWFsbGVyIHRoYW4gaW5wdXQgaWYgZmlsdGVyIGlzIGxhcmdlclxuICogICAgICAgdGhhbiAxeDEuXG4gKiAgIC0gRm9yIG1vcmUgaW5mbywgc2VlIHRoaXMgZ3VpZGU6XG4gKiAgICAgW2h0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbl0oXG4gKiAgICAgICAgICBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb24pXG4gKiBAcGFyYW0gZGlsYXRpb25zIFRoZSBkaWxhdGlvbiByYXRlczogYFtkaWxhdGlvbkhlaWdodCwgZGlsYXRpb25XaWR0aF1gXG4gKiAgICAgaW4gd2hpY2ggd2Ugc2FtcGxlIGlucHV0IHZhbHVlcyBhY3Jvc3MgdGhlIGhlaWdodCBhbmQgd2lkdGggZGltZW5zaW9uc1xuICogICAgIGluIGF0cm91cyBjb252b2x1dGlvbi4gRGVmYXVsdHMgdG8gYFsxLCAxXWAuIElmIGByYXRlYCBpcyBhIHNpbmdsZVxuICogICAgIG51bWJlciwgdGhlbiBgZGlsYXRpb25IZWlnaHQgPT0gZGlsYXRpb25XaWR0aGAuIElmIGl0IGlzIGdyZWF0ZXIgdGhhblxuICogICAgIDEsIHRoZW4gYWxsIHZhbHVlcyBvZiBgc3RyaWRlc2AgbXVzdCBiZSAxLlxuICogQHBhcmFtIGRhdGFGb3JtYXQ6IEFuIG9wdGlvbmFsIHN0cmluZyBmcm9tOiBcIk5IV0NcIiwgXCJOQ0hXXCIuIERlZmF1bHRzIHRvXG4gKiAgICAgXCJOSFdDXCIuIFNwZWNpZnkgdGhlIGRhdGEgZm9ybWF0IG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEuIFdpdGggdGhlXG4gKiAgICAgZGVmYXVsdCBmb3JtYXQgXCJOSFdDXCIsIHRoZSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgb3JkZXIgb2Y6IFtiYXRjaCxcbiAqICAgICBoZWlnaHQsIHdpZHRoLCBjaGFubmVsc10uIE9ubHkgXCJOSFdDXCIgaXMgY3VycmVudGx5IHN1cHBvcnRlZC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdDb252b2x1dGlvbid9XG4gKi9cbmZ1bmN0aW9uIHNlcGFyYWJsZUNvbnYyZF8oeCwgZGVwdGh3aXNlRmlsdGVyLCBwb2ludHdpc2VGaWx0ZXIsIHN0cmlkZXMsIHBhZCwgZGlsYXRpb24gPSBbMSwgMV0sIGRhdGFGb3JtYXQgPSAnTkhXQycpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzZXBhcmFibGVDb252MmQnKTtcbiAgICBjb25zdCAkZGVwdGh3aXNlRmlsdGVyID0gY29udmVydFRvVGVuc29yKGRlcHRod2lzZUZpbHRlciwgJ2RlcHRod2lzZUZpbHRlcicsICdzZXBhcmFibGVDb252MmQnKTtcbiAgICBjb25zdCAkcG9pbnR3aXNlRmlsdGVyID0gY29udmVydFRvVGVuc29yKHBvaW50d2lzZUZpbHRlciwgJ3BvaW50d2lzZUZpbHRlcicsICdzZXBhcmFibGVDb252MmQnKTtcbiAgICBsZXQgeDREID0gJHg7XG4gICAgbGV0IHJlc2hhcGVkVG80RCA9IGZhbHNlO1xuICAgIGlmICgkeC5yYW5rID09PSAzKSB7XG4gICAgICAgIHJlc2hhcGVkVG80RCA9IHRydWU7XG4gICAgICAgIHg0RCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV0sICR4LnNoYXBlWzJdXSk7XG4gICAgfVxuICAgIGlmIChkYXRhRm9ybWF0ID09PSAnTkNIVycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzZXBhcmFibGVDb252MmQgY3VycmVudGx5IGRvZXMgbm90IHN1cHBvcnQgZGF0YUZvcm1hdCBOQ0hXOyBvbmx5ICcgK1xuICAgICAgICAgICAgJ05IV0MgaXMgc3VwcG9ydGVkJyk7XG4gICAgfVxuICAgIHV0aWwuYXNzZXJ0KHg0RC5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gc2VwYXJhYmxlQ29udjJkOiBpbnB1dCBtdXN0IGJlIHJhbmsgNCwgYnV0IGdvdCBgICtcbiAgICAgICAgYHJhbmsgJHt4NEQucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoJGRlcHRod2lzZUZpbHRlci5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gc2VwYXJhYmxlQ29udjJkOiBkZXB0aHdpc2UgZmlsdGVyIG11c3QgYmUgcmFuayA0LCBidXQgYCArXG4gICAgICAgIGBnb3QgcmFuayAkeyRkZXB0aHdpc2VGaWx0ZXIucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoJHBvaW50d2lzZUZpbHRlci5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gc2VwYXJhYmxlQ29udjJkOiBwb2ludHdpc2UgZmlsdGVyIG11c3QgYmUgcmFuayA0LCBidXQgYCArXG4gICAgICAgIGBnb3QgcmFuayAkeyRkZXB0aHdpc2VGaWx0ZXIucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoJHBvaW50d2lzZUZpbHRlci5zaGFwZVswXSA9PT0gMSwgKCkgPT4gYEVycm9yIGluIHNlcGFyYWJsZUNvbnYyZDogdGhlIGZpcnN0IGRpbWVuc2lvbiBvZiBwb2ludHdpc2UgZmlsdGVyIGAgK1xuICAgICAgICBgIG11c3QgYmUgMSwgYnV0IGdvdCAkeyRwb2ludHdpc2VGaWx0ZXIuc2hhcGVbMF19LmApO1xuICAgIHV0aWwuYXNzZXJ0KCRwb2ludHdpc2VGaWx0ZXIuc2hhcGVbMV0gPT09IDEsICgpID0+IGBFcnJvciBpbiBzZXBhcmFibGVDb252MmQ6IHRoZSBzZWNvbmQgZGltZW5zaW9uIG9mIHBvaW50d2lzZSBgICtcbiAgICAgICAgYGZpbHRlciBtdXN0IGJlIDEsIGJ1dCBnb3QgJHskcG9pbnR3aXNlRmlsdGVyLnNoYXBlWzFdfS5gKTtcbiAgICBjb25zdCBpbkNoYW5uZWxzID0gJGRlcHRod2lzZUZpbHRlci5zaGFwZVsyXTtcbiAgICBjb25zdCBjaGFubmVsTXVsdGlwbGllciA9ICRkZXB0aHdpc2VGaWx0ZXIuc2hhcGVbM107XG4gICAgdXRpbC5hc3NlcnQoJHBvaW50d2lzZUZpbHRlci5zaGFwZVsyXSA9PT0gaW5DaGFubmVscyAqIGNoYW5uZWxNdWx0aXBsaWVyLCAoKSA9PiBgRXJyb3IgaW4gc2VwYXJhYmxlQ29udjJkOiB0aGUgdGhpcmQgZGltZW5zaW9uIG9mIHBvaW50d2lzZSBmaWx0ZXIgYCArXG4gICAgICAgIGBtdXN0IGJlICR7aW5DaGFubmVscyAqIGNoYW5uZWxNdWx0aXBsaWVyfSwgYCArXG4gICAgICAgIGBidXQgZ290ICR7JHBvaW50d2lzZUZpbHRlci5zaGFwZVsyXX0uYCk7XG4gICAgY29uc3QgZGVwdGh3aXNlID0gZGVwdGh3aXNlQ29udjJkKHg0RCwgJGRlcHRod2lzZUZpbHRlciwgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0LCBkaWxhdGlvbik7XG4gICAgY29uc3QgcG9pbnR3aXNlU3RyaWRlID0gMTtcbiAgICBjb25zdCByZXMgPSBjb252MmQoZGVwdGh3aXNlLCAkcG9pbnR3aXNlRmlsdGVyLCBwb2ludHdpc2VTdHJpZGUsICd2YWxpZCcsIGRhdGFGb3JtYXQpO1xuICAgIGlmIChyZXNoYXBlZFRvNEQpIHtcbiAgICAgICAgcmV0dXJuIHJlc2hhcGUocmVzLCBbcmVzLnNoYXBlWzFdLCByZXMuc2hhcGVbMl0sIHJlcy5zaGFwZVszXV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IHNlcGFyYWJsZUNvbnYyZCA9IG9wKHsgc2VwYXJhYmxlQ29udjJkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlcGFyYWJsZV9jb252MmQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgVGVuc29yQnVmZmVyIH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBsaXN0cyBvZiBudW1iZXJzLlxuICpcbiAqIEdpdmVuIGEgVGVuc29yIGB4YCBhbmQgYSBUZW5zb3IgYHlgLCB0aGlzIG9wZXJhdGlvbiByZXR1cm5zIGEgVGVuc29yIGBvdXRgXG4gKiB0aGF0IHJlcHJlc2VudHMgYWxsIHZhbHVlcyB0aGF0IGFyZSBpbiBgeGAgYnV0IG5vdCBpbiBgeWAuIFRoZSByZXR1cm5lZFxuICogVGVuc29yIGBvdXRgIGlzIHNvcnRlZCBpbiB0aGUgc2FtZSBvcmRlciB0aGF0IHRoZSBudW1iZXJzIGFwcGVhciBpbiBgeGBcbiAqIChkdXBsaWNhdGVzIGFyZSBwcmVzZXJ2ZWQpLiBUaGlzIG9wZXJhdGlvbiBhbHNvIHJldHVybnMgYSBUZW5zb3IgaW5kaWNlcyB0aGF0XG4gKiByZXByZXNlbnRzIHRoZSBwb3NpdGlvbiBvZiBlYWNoIG91dCBlbGVtZW50IGluIGB4YC4gSW4gb3RoZXIgd29yZHM6XG4gKlxuICogYG91dFtpXSA9IHhbaWR4W2ldXSBmb3IgaSBpbiBbMCwgMSwgLi4uLCBvdXQubGVuZ3RoIC0gMV1gXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSBbMSwgMiwgMywgNCwgNSwgNl07XG4gKiBjb25zdCB5ID0gWzEsIDMsIDVdO1xuICpcbiAqIGNvbnN0IFtvdXQsIGluZGljZXNdID0gYXdhaXQgdGYuc2V0ZGlmZjFkQXN5bmMoeCwgeSk7XG4gKiBvdXQucHJpbnQoKTsgLy8gWzIsIDQsIDZdXG4gKiBpbmRpY2VzLnByaW50KCk7IC8vIFsxLCAzLCA1XVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggMS1EIFRlbnNvci4gVmFsdWVzIHRvIGtlZXAuXG4gKiBAcGFyYW0geSAxLUQgVGVuc29yLiBNdXN0IGhhdmUgdGhlIHNhbWUgdHlwZSBhcyB4LiBWYWx1ZXMgdG8gZXhjbHVkZSBpbiB0aGVcbiAqICAgICBvdXRwdXQuXG4gKiBAcmV0dXJucyBQcm9taXNlIG9mIFRlbnNvciB0dXBsZSBbb3V0LCBpbmRpY2VzXS5cbiAqICBvdXQ6IFRlbnNvciB3aXRoIHRoZSBzYW1lIHR5cGUgYXMgeC5cbiAqICBpbmRpY2VzOiBBIFRlbnNvciBvZiB0eXBlIGludDMyLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1RyYW5zZm9ybWF0aW9ucyd9XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNldGRpZmYxZEFzeW5jXyh4LCB5KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc2V0ZGlmZjFkJyk7XG4gICAgY29uc3QgJHkgPSBjb252ZXJ0VG9UZW5zb3IoeSwgJ3knLCAnc2V0ZGlmZjFkJyk7XG4gICAgdXRpbC5hc3NlcnQoJHguZHR5cGUgPT09ICR5LmR0eXBlLCAoKSA9PiBgeCBhbmQgeSBzaG91bGQgaGF2ZSB0aGUgc2FtZSBkdHlwZSwgYnV0IGdvdCB4ICgkeyR4LmR0eXBlfSkgYW5kIHkgKCR7JHkuZHR5cGV9KS5gKTtcbiAgICB1dGlsLmFzc2VydCgkeC5yYW5rID09PSAxLCAoKSA9PiBgeCBzaG91bGQgYmUgMUQgdGVuc29yLCBidXQgZ290IHggKCR7JHguc2hhcGV9KS5gKTtcbiAgICB1dGlsLmFzc2VydCgkeS5yYW5rID09PSAxLCAoKSA9PiBgeSBzaG91bGQgYmUgMUQgdGVuc29yLCBidXQgZ290IHkgKCR7JHkuc2hhcGV9KS5gKTtcbiAgICBjb25zdCB4VmFscyA9IGF3YWl0ICR4LmRhdGEoKTtcbiAgICBjb25zdCB5VmFscyA9IGF3YWl0ICR5LmRhdGEoKTtcbiAgICBjb25zdCB5U2V0ID0gbmV3IFNldCh5VmFscyk7XG4gICAgbGV0IG91dHB1dFNpemUgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeFZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCF5U2V0Lmhhcyh4VmFsc1tpXSkpIHtcbiAgICAgICAgICAgIG91dHB1dFNpemUrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBidWZmZXIgPSBuZXcgVGVuc29yQnVmZmVyKFtvdXRwdXRTaXplXSwgJHguZHR5cGUpO1xuICAgIGNvbnN0IGluZGljZXMgPSBuZXcgVGVuc29yQnVmZmVyKFtvdXRwdXRTaXplXSwgJ2ludDMyJyk7XG4gICAgZm9yIChsZXQgaSA9IDAsIHAgPSAwOyBpIDwgeFZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCF5U2V0Lmhhcyh4VmFsc1tpXSkpIHtcbiAgICAgICAgICAgIGJ1ZmZlci52YWx1ZXNbcF0gPSB4VmFsc1tpXTtcbiAgICAgICAgICAgIGluZGljZXMudmFsdWVzW3BdID0gaTtcbiAgICAgICAgICAgIHArKztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW2J1ZmZlci50b1RlbnNvcigpLCBpbmRpY2VzLnRvVGVuc29yKCldO1xufVxuZXhwb3J0IGNvbnN0IHNldGRpZmYxZEFzeW5jID0gc2V0ZGlmZjFkQXN5bmNfO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2V0ZGlmZjFkX2FzeW5jLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBTaWdtb2lkIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgc2lnbW9pZCBlbGVtZW50LXdpc2UsIGAxIC8gKDEgKyBleHAoLXgpKWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFswLCAtMSwgMiwgLTNdKTtcbiAqXG4gKiB4LnNpZ21vaWQoKS5wcmludCgpOyAgLy8gb3IgdGYuc2lnbW9pZCh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBzaWdtb2lkXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc2lnbW9pZCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChTaWdtb2lkLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IHNpZ21vaWQgPSBvcCh7IHNpZ21vaWRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2lnbW9pZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgU2lnbiB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIFJldHVybnMgYW4gZWxlbWVudC13aXNlIGluZGljYXRpb24gb2YgdGhlIHNpZ24gb2YgYSBudW1iZXIuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbLjYsIDEuMSwgLTMuMywgTmFOLCAwXSk7XG4gKlxuICogeC5zaWduKCkucHJpbnQoKTsgIC8vIG9yIHRmLnNpZ24oeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IFRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gc2lnbl8oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3NpZ24nKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoU2lnbiwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBzaWduID0gb3AoeyBzaWduXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNpZ24uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29uY2F0IH0gZnJvbSAnLi4vY29uY2F0JztcbmltcG9ydCB7IGZpbGwgfSBmcm9tICcuLi9maWxsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuLi9yZXNoYXBlJztcbmltcG9ydCB7IHNsaWNlIH0gZnJvbSAnLi4vc2xpY2UnO1xuaW1wb3J0IHsgdGVuc29yMmQgfSBmcm9tICcuLi90ZW5zb3IyZCc7XG4vKipcbiAqIEV4cGFuZHMgaW5wdXQgaW50byBmcmFtZXMgb2YgZnJhbWVMZW5ndGguXG4gKiBTbGlkZXMgYSB3aW5kb3cgc2l6ZSB3aXRoIGZyYW1lU3RlcC5cbiAqXG4gKiBgYGBqc1xuICogdGYuc2lnbmFsLmZyYW1lKFsxLCAyLCAzXSwgMiwgMSkucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIHNpZ25hbCBUaGUgaW5wdXQgdGVuc29yIHRvIGJlIGV4cGFuZGVkXG4gKiBAcGFyYW0gZnJhbWVMZW5ndGggTGVuZ3RoIG9mIGVhY2ggZnJhbWVcbiAqIEBwYXJhbSBmcmFtZVN0ZXAgVGhlIGZyYW1lIGhvcCBzaXplIGluIHNhbXBsZXMuXG4gKiBAcGFyYW0gcGFkRW5kIFdoZXRoZXIgdG8gcGFkIHRoZSBlbmQgb2Ygc2lnbmFsIHdpdGggcGFkVmFsdWUuXG4gKiBAcGFyYW0gcGFkVmFsdWUgQW4gbnVtYmVyIHRvIHVzZSB3aGVyZSB0aGUgaW5wdXQgc2lnbmFsIGRvZXNcbiAqICAgICBub3QgZXhpc3Qgd2hlbiBwYWRFbmQgaXMgVHJ1ZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTaWduYWwnLCBuYW1lc3BhY2U6ICdzaWduYWwnfVxuICovXG5mdW5jdGlvbiBmcmFtZV8oc2lnbmFsLCBmcmFtZUxlbmd0aCwgZnJhbWVTdGVwLCBwYWRFbmQgPSBmYWxzZSwgcGFkVmFsdWUgPSAwKSB7XG4gICAgbGV0IHN0YXJ0ID0gMDtcbiAgICBjb25zdCBvdXRwdXQgPSBbXTtcbiAgICB3aGlsZSAoc3RhcnQgKyBmcmFtZUxlbmd0aCA8PSBzaWduYWwuc2l6ZSkge1xuICAgICAgICBvdXRwdXQucHVzaChzbGljZShzaWduYWwsIHN0YXJ0LCBmcmFtZUxlbmd0aCkpO1xuICAgICAgICBzdGFydCArPSBmcmFtZVN0ZXA7XG4gICAgfVxuICAgIGlmIChwYWRFbmQpIHtcbiAgICAgICAgd2hpbGUgKHN0YXJ0IDwgc2lnbmFsLnNpemUpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhZExlbiA9IChzdGFydCArIGZyYW1lTGVuZ3RoKSAtIHNpZ25hbC5zaXplO1xuICAgICAgICAgICAgY29uc3QgcGFkID0gY29uY2F0KFtcbiAgICAgICAgICAgICAgICBzbGljZShzaWduYWwsIHN0YXJ0LCBmcmFtZUxlbmd0aCAtIHBhZExlbiksIGZpbGwoW3BhZExlbl0sIHBhZFZhbHVlKVxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICBvdXRwdXQucHVzaChwYWQpO1xuICAgICAgICAgICAgc3RhcnQgKz0gZnJhbWVTdGVwO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChvdXRwdXQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0ZW5zb3IyZChbXSwgWzAsIGZyYW1lTGVuZ3RoXSk7XG4gICAgfVxuICAgIHJldHVybiByZXNoYXBlKGNvbmNhdChvdXRwdXQpLCBbb3V0cHV0Lmxlbmd0aCwgZnJhbWVMZW5ndGhdKTtcbn1cbmV4cG9ydCBjb25zdCBmcmFtZSA9IG9wKHsgZnJhbWVfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZnJhbWUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgY29zaW5lV2luZG93IH0gZnJvbSAnLi4vc2lnbmFsX29wc191dGlsJztcbi8qKlxuICogR2VuZXJhdGUgYSBoYW1taW5nIHdpbmRvdy5cbiAqXG4gKiBTZWU6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1dpbmRvd19mdW5jdGlvbiNIYW5uX2FuZF9IYW1taW5nX3dpbmRvd3NcbiAqXG4gKiBgYGBqc1xuICogdGYuc2lnbmFsLmhhbW1pbmdXaW5kb3coMTApLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSBUaGUgbGVuZ3RoIG9mIHdpbmRvd1xuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1NpZ25hbCcsIG5hbWVzcGFjZTogJ3NpZ25hbCd9XG4gKi9cbmZ1bmN0aW9uIGhhbW1pbmdXaW5kb3dfKHdpbmRvd0xlbmd0aCkge1xuICAgIHJldHVybiBjb3NpbmVXaW5kb3cod2luZG93TGVuZ3RoLCAwLjU0LCAwLjQ2KTtcbn1cbmV4cG9ydCBjb25zdCBoYW1taW5nV2luZG93ID0gb3AoeyBoYW1taW5nV2luZG93XyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhhbW1pbmdfd2luZG93LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7IGNvc2luZVdpbmRvdyB9IGZyb20gJy4uL3NpZ25hbF9vcHNfdXRpbCc7XG4vKipcbiAqIEdlbmVyYXRlIGEgSGFubiB3aW5kb3cuXG4gKlxuICogU2VlOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9XaW5kb3dfZnVuY3Rpb24jSGFubl9hbmRfSGFtbWluZ193aW5kb3dzXG4gKlxuICogYGBganNcbiAqIHRmLnNpZ25hbC5oYW5uV2luZG93KDEwKS5wcmludCgpO1xuICogYGBgXG4gKiBAcGFyYW0gVGhlIGxlbmd0aCBvZiB3aW5kb3dcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTaWduYWwnLCBuYW1lc3BhY2U6ICdzaWduYWwnfVxuICovXG5mdW5jdGlvbiBoYW5uV2luZG93Xyh3aW5kb3dMZW5ndGgpIHtcbiAgICByZXR1cm4gY29zaW5lV2luZG93KHdpbmRvd0xlbmd0aCwgMC41LCAwLjUpO1xufVxuZXhwb3J0IGNvbnN0IGhhbm5XaW5kb3cgPSBvcCh7IGhhbm5XaW5kb3dfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGFubl93aW5kb3cuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi4vbXVsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7IGVuY2xvc2luZ1Bvd2VyT2ZUd28gfSBmcm9tICcuLi9zaWduYWxfb3BzX3V0aWwnO1xuaW1wb3J0IHsgcmZmdCB9IGZyb20gJy4uL3NwZWN0cmFsL3JmZnQnO1xuaW1wb3J0IHsgZnJhbWUgfSBmcm9tICcuL2ZyYW1lJztcbmltcG9ydCB7IGhhbm5XaW5kb3cgfSBmcm9tICcuL2hhbm5fd2luZG93Jztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIFNob3J0LXRpbWUgRm91cmllciBUcmFuc2Zvcm0gb2Ygc2lnbmFsc1xuICogU2VlOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TaG9ydC10aW1lX0ZvdXJpZXJfdHJhbnNmb3JtXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGlucHV0ID0gdGYudGVuc29yMWQoWzEsIDEsIDEsIDEsIDFdKVxuICogdGYuc2lnbmFsLnN0ZnQoaW5wdXQsIDMsIDEpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSBzaWduYWwgMS1kaW1lbnNpb25hbCByZWFsIHZhbHVlIHRlbnNvci5cbiAqIEBwYXJhbSBmcmFtZUxlbmd0aCBUaGUgd2luZG93IGxlbmd0aCBvZiBzYW1wbGVzLlxuICogQHBhcmFtIGZyYW1lU3RlcCBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gc3RlcC5cbiAqIEBwYXJhbSBmZnRMZW5ndGggVGhlIHNpemUgb2YgdGhlIEZGVCB0byBhcHBseS5cbiAqIEBwYXJhbSB3aW5kb3dGbiBBIGNhbGxhYmxlIHRoYXQgdGFrZXMgYSB3aW5kb3cgbGVuZ3RoIGFuZCByZXR1cm5zIDEtZCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU2lnbmFsJywgbmFtZXNwYWNlOiAnc2lnbmFsJ31cbiAqL1xuZnVuY3Rpb24gc3RmdF8oc2lnbmFsLCBmcmFtZUxlbmd0aCwgZnJhbWVTdGVwLCBmZnRMZW5ndGgsIHdpbmRvd0ZuID0gaGFubldpbmRvdykge1xuICAgIGlmIChmZnRMZW5ndGggPT0gbnVsbCkge1xuICAgICAgICBmZnRMZW5ndGggPSBlbmNsb3NpbmdQb3dlck9mVHdvKGZyYW1lTGVuZ3RoKTtcbiAgICB9XG4gICAgY29uc3QgZnJhbWVkU2lnbmFsID0gZnJhbWUoc2lnbmFsLCBmcmFtZUxlbmd0aCwgZnJhbWVTdGVwKTtcbiAgICBjb25zdCB3aW5kb3dlZFNpZ25hbCA9IG11bChmcmFtZWRTaWduYWwsIHdpbmRvd0ZuKGZyYW1lTGVuZ3RoKSk7XG4gICAgcmV0dXJuIHJmZnQod2luZG93ZWRTaWduYWwsIGZmdExlbmd0aCk7XG59XG5leHBvcnQgY29uc3Qgc3RmdCA9IG9wKHsgc3RmdF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdGZ0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IHRlbnNvcjFkIH0gZnJvbSAnLi90ZW5zb3IxZCc7XG5leHBvcnQgZnVuY3Rpb24gZW5jbG9zaW5nUG93ZXJPZlR3byh2YWx1ZSkge1xuICAgIC8vIFJldHVybiAyKipOIGZvciBpbnRlZ2VyIE4gc3VjaCB0aGF0IDIqKk4gPj0gdmFsdWUuXG4gICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5wb3coMiwgTWF0aC5jZWlsKE1hdGgubG9nKHZhbHVlKSAvIE1hdGgubG9nKDIuMCkpKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gY29zaW5lV2luZG93KHdpbmRvd0xlbmd0aCwgYSwgYikge1xuICAgIGNvbnN0IGV2ZW4gPSAxIC0gd2luZG93TGVuZ3RoICUgMjtcbiAgICBjb25zdCBuZXdWYWx1ZXMgPSBuZXcgRmxvYXQzMkFycmF5KHdpbmRvd0xlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3aW5kb3dMZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBjb3NBcmcgPSAoMi4wICogTWF0aC5QSSAqIGkpIC8gKHdpbmRvd0xlbmd0aCArIGV2ZW4gLSAxKTtcbiAgICAgICAgbmV3VmFsdWVzW2ldID0gYSAtIGIgKiBNYXRoLmNvcyhjb3NBcmcpO1xuICAgIH1cbiAgICByZXR1cm4gdGVuc29yMWQobmV3VmFsdWVzLCAnZmxvYXQzMicpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2lnbmFsX29wc191dGlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBTaW4gfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBzaW4gb2YgdGhlIGlucHV0IFRlbnNvciBlbGVtZW50LXdpc2U6IGBzaW4oeClgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMCwgTWF0aC5QSSAvIDIsIE1hdGguUEkgKiAzIC8gNF0pO1xuICpcbiAqIHguc2luKCkucHJpbnQoKTsgIC8vIG9yIHRmLnNpbih4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBzaW5fKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzaW4nKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoU2luLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IHNpbiA9IG9wKHsgc2luXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNpbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgU2luaCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIGh5cGVyYm9saWMgc2luIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6IGBzaW5oKHgpYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzAsIDEsIC0xLCAuN10pO1xuICpcbiAqIHguc2luaCgpLnByaW50KCk7ICAvLyBvciB0Zi5zaW5oKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIHNpbmhfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzaW5oJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFNpbmgsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3Qgc2luaCA9IG9wKHsgc2luaF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zaW5oLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBTbGljZSB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIEV4dHJhY3RzIGEgc2xpY2UgZnJvbSBhIGB0Zi5UZW5zb3JgIHN0YXJ0aW5nIGF0IGNvb3JkaW5hdGVzIGBiZWdpbmBcbiAqIGFuZCBpcyBvZiBzaXplIGBzaXplYC5cbiAqXG4gKiBBbHNvIGF2YWlsYWJsZSBhcmUgc3RyaWN0ZXIgcmFuay1zcGVjaWZpYyBtZXRob2RzIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlXG4gKiBhcyB0aGlzIG1ldGhvZCB0aGF0IGFzc2VydCB0aGF0IGB4YCBpcyBvZiB0aGUgZ2l2ZW4gcmFuazpcbiAqICAgLSBgdGYuc2xpY2UxZGBcbiAqICAgLSBgdGYuc2xpY2UyZGBcbiAqICAgLSBgdGYuc2xpY2UzZGBcbiAqICAgLSBgdGYuc2xpY2U0ZGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzLCA0XSk7XG4gKlxuICogeC5zbGljZShbMV0sIFsyXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pO1xuICpcbiAqIHguc2xpY2UoWzEsIDBdLCBbMSwgMl0pLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBgdGYuVGVuc29yYCB0byBzbGljZSBmcm9tLlxuICogQHBhcmFtIGJlZ2luIFRoZSBjb29yZGluYXRlcyB0byBzdGFydCB0aGUgc2xpY2UgZnJvbS4gVGhlIGxlbmd0aCBjYW4gYmVcbiAqICAgICBsZXNzIHRoYW4gdGhlIHJhbmsgb2YgeCAtIHRoZSByZXN0IG9mIHRoZSBheGVzIHdpbGwgaGF2ZSBpbXBsaWNpdCAwIGFzXG4gKiAgICAgc3RhcnQuIENhbiBhbHNvIGJlIGEgc2luZ2xlIG51bWJlciwgaW4gd2hpY2ggY2FzZSBpdCBzcGVjaWZpZXMgdGhlXG4gKiAgICAgZmlyc3QgYXhpcy5cbiAqIEBwYXJhbSBzaXplIFRoZSBzaXplIG9mIHRoZSBzbGljZS4gVGhlIGxlbmd0aCBjYW4gYmUgbGVzcyB0aGFuIHRoZSByYW5rIG9mXG4gKiAgICAgeCAtIHRoZSByZXN0IG9mIHRoZSBheGVzIHdpbGwgaGF2ZSBpbXBsaWNpdCAtMS4gQSB2YWx1ZSBvZiAtMSByZXF1ZXN0c1xuICogICAgIHRoZSByZXN0IG9mIHRoZSBkaW1lbnNpb25zIGluIHRoZSBheGlzLiBDYW4gYWxzbyBiZSBhIHNpbmdsZSBudW1iZXIsXG4gKiAgICAgaW4gd2hpY2ggY2FzZSBpdCBzcGVjaWZpZXMgdGhlIHNpemUgb2YgdGhlIGZpcnN0IGF4aXMuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnU2xpY2luZyBhbmQgSm9pbmluZyd9XG4gKi9cbmZ1bmN0aW9uIHNsaWNlXyh4LCBiZWdpbiwgc2l6ZSkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3NsaWNlJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG4gICAgaWYgKCR4LnJhbmsgPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTbGljaW5nIHNjYWxhciBpcyBub3QgcG9zc2libGUnKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBiZWdpbiwgc2l6ZSB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFNsaWNlLCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBzbGljZSA9IG9wKHsgc2xpY2VfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2xpY2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHNsaWNlIH0gZnJvbSAnLi9zbGljZSc7XG4vKipcbiAqIEV4dHJhY3RzIGEgMUQgc2xpY2UgZnJvbSAxRCBhcnJheSBzdGFydGluZyBhdCBjb29yZGluYXRlcyBgYmVnaW5gIGFuZCBpc1xuICogb2YgbGVuZ3RoIGBzaXplYC4gU2VlIGBzbGljZWAgZm9yIGRldGFpbHMuXG4gKi9cbmZ1bmN0aW9uIHNsaWNlMWRfKHgsIGJlZ2luLCBzaXplKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc2xpY2UxZCcpO1xuICAgIHV0aWwuYXNzZXJ0KCR4LnJhbmsgPT09IDEsICgpID0+IGBzbGljZTFkIGV4cGVjdHMgYSByYW5rLTEgdGVuc29yLCBidXQgZ290IGEgcmFuay0keyR4LnJhbmt9IHRlbnNvcmApO1xuICAgIHJldHVybiBzbGljZSgkeCwgW2JlZ2luXSwgW3NpemVdKTtcbn1cbmV4cG9ydCBjb25zdCBzbGljZTFkID0gb3AoeyBzbGljZTFkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNsaWNlMWQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHNsaWNlIH0gZnJvbSAnLi9zbGljZSc7XG4vKipcbiAqIEV4dHJhY3RzIGEgMkQgc2xpY2UgZnJvbSBhIDJEIGFycmF5IHN0YXJ0aW5nIGF0IGNvb3JkaW5hdGVzIGBiZWdpbmAgYW5kXG4gKiBpcyBvZiBzaXplIGBzaXplYC4gU2VlIGBzbGljZWAgZm9yIGRldGFpbHMuXG4gKi9cbmZ1bmN0aW9uIHNsaWNlMmRfKHgsIGJlZ2luLCBzaXplKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc2xpY2UyZCcpO1xuICAgIHV0aWwuYXNzZXJ0KCR4LnJhbmsgPT09IDIsICgpID0+IGBzbGljZTJkIGV4cGVjdHMgYSByYW5rLTIgdGVuc29yLCBidXQgZ290IGEgcmFuay0keyR4LnJhbmt9IHRlbnNvcmApO1xuICAgIHJldHVybiBzbGljZSgkeCwgYmVnaW4sIHNpemUpO1xufVxuZXhwb3J0IGNvbnN0IHNsaWNlMmQgPSBvcCh7IHNsaWNlMmRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2xpY2UyZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgc2xpY2UgfSBmcm9tICcuL3NsaWNlJztcbi8qKlxuICogRXh0cmFjdHMgYSAzRCBzbGljZSBmcm9tIGEgM0QgYXJyYXkgc3RhcnRpbmcgYXQgY29vcmRpbmF0ZXMgYGJlZ2luYCBhbmRcbiAqIGlzIG9mIHNpemUgYHNpemVgLiBTZWUgYHNsaWNlYCBmb3IgZGV0YWlscy5cbiAqL1xuZnVuY3Rpb24gc2xpY2UzZF8oeCwgYmVnaW4sIHNpemUpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzbGljZTNkJyk7XG4gICAgdXRpbC5hc3NlcnQoJHgucmFuayA9PT0gMywgKCkgPT4gYHNsaWNlM2QgZXhwZWN0cyBhIHJhbmstMyB0ZW5zb3IsIGJ1dCBnb3QgYSByYW5rLSR7JHgucmFua30gdGVuc29yYCk7XG4gICAgcmV0dXJuIHNsaWNlKCR4LCBiZWdpbiwgc2l6ZSk7XG59XG5leHBvcnQgY29uc3Qgc2xpY2UzZCA9IG9wKHsgc2xpY2UzZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zbGljZTNkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyBzbGljZSB9IGZyb20gJy4vc2xpY2UnO1xuLyoqXG4gKiBFeHRyYWN0cyBhIDREIHNsaWNlIGZyb20gYSA0RCBhcnJheSBzdGFydGluZyBhdCBjb29yZGluYXRlcyBgYmVnaW5gIGFuZFxuICogaXMgb2Ygc2l6ZSBgc2l6ZWAuIFNlZSBgc2xpY2VgIGZvciBkZXRhaWxzLlxuICovXG5mdW5jdGlvbiBzbGljZTRkXyh4LCBiZWdpbiwgc2l6ZSkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3NsaWNlNGQnKTtcbiAgICB1dGlsLmFzc2VydCgkeC5yYW5rID09PSA0LCAoKSA9PiBgc2xpY2U0ZCBleHBlY3RzIGEgcmFuay00IHRlbnNvciwgYnV0IGdvdCBhIHJhbmstJHskeC5yYW5rfSB0ZW5zb3JgKTtcbiAgICByZXR1cm4gc2xpY2UoJHgsIGJlZ2luLCBzaXplKTtcbn1cbmV4cG9ydCBjb25zdCBzbGljZTRkID0gb3AoeyBzbGljZTRkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNsaWNlNGQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRQYXJhbXNWYWxpZChpbnB1dCwgYmVnaW4sIHNpemUpIHtcbiAgICBjb25zdCBpbnB1dFJhbmsgPSBpbnB1dC5zaGFwZS5sZW5ndGg7XG4gICAgdXRpbC5hc3NlcnQoaW5wdXRSYW5rID09PSBiZWdpbi5sZW5ndGgsICgpID0+IGBFcnJvciBpbiBzbGljZSR7aW5wdXRSYW5rfUQ6IExlbmd0aCBvZiBiZWdpbiAke2JlZ2lufSBtdXN0IGAgK1xuICAgICAgICBgbWF0Y2ggdGhlIHJhbmsgb2YgdGhlIGFycmF5ICgke2lucHV0UmFua30pLmApO1xuICAgIHV0aWwuYXNzZXJ0KGlucHV0UmFuayA9PT0gc2l6ZS5sZW5ndGgsICgpID0+IGBFcnJvciBpbiBzbGljZSR7aW5wdXRSYW5rfUQ6IExlbmd0aCBvZiBzaXplICR7c2l6ZX0gbXVzdCBgICtcbiAgICAgICAgYG1hdGNoIHRoZSByYW5rIG9mIHRoZSBhcnJheSAoJHtpbnB1dFJhbmt9KS5gKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0UmFuazsgKytpKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KGJlZ2luW2ldICsgc2l6ZVtpXSA8PSBpbnB1dC5zaGFwZVtpXSwgKCkgPT4gYEVycm9yIGluIHNsaWNlJHtpbnB1dFJhbmt9RDogYmVnaW5bJHtpfV0gKyBzaXplWyR7aX1dIGAgK1xuICAgICAgICAgICAgYCgke2JlZ2luW2ldICsgc2l6ZVtpXX0pIHdvdWxkIG92ZXJmbG93IGlucHV0LnNoYXBlWyR7aX1dICgke2lucHV0LnNoYXBlW2ldfSlgKTtcbiAgICB9XG59XG4vKiogQ29udmVydHMgYSBiaW5hcnkgbWFzayB0byBhbiBhcnJheSBvZiBheGVzLiBVc2VkIGluIHN0cmlkZWRTbGljZSgpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hc2tUb0F4ZXMobWFzaykge1xuICAgIGNvbnN0IGF4ZXMgPSBbXTtcbiAgICBsZXQgYXhpcyA9IDA7XG4gICAgd2hpbGUgKG1hc2sgPiAwKSB7XG4gICAgICAgIGlmIChtYXNrICYgMSkge1xuICAgICAgICAgICAgYXhlcy5wdXNoKGF4aXMpO1xuICAgICAgICB9XG4gICAgICAgIG1hc2sgLz0gMjtcbiAgICAgICAgYXhpcysrO1xuICAgIH1cbiAgICByZXR1cm4gYXhlcztcbn1cbi8qKiBDb21wdXRlcyB0aGUgb3V0cHV0IHNoYXBlIGdpdmVuIHRoZSBzdHJpZGVkIHNsaWNlIHBhcmFtcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlT3V0U2hhcGUoYmVnaW4sIGVuZCwgc3RyaWRlcykge1xuICAgIGNvbnN0IHNpemUgPSBbXTtcbiAgICBmb3IgKGxldCBheGlzID0gMDsgYXhpcyA8IGJlZ2luLmxlbmd0aDsgYXhpcysrKSB7XG4gICAgICAgIHNpemVbYXhpc10gPSBNYXRoLmNlaWwoKGVuZFtheGlzXSAtIGJlZ2luW2F4aXNdKSAvIHN0cmlkZXNbYXhpc10pO1xuICAgIH1cbiAgICByZXR1cm4gc2l6ZTtcbn1cbi8vIENyZWF0ZXMgZnVsbCBzZWxlY3Rpb24gYXQgdGhlIGVsaWRlZCBkaW1lbnNpb25zLiBJZiB0aGUgZGltZW5zaW9uIG1hdGNoZXNcbi8vIHRoZSBlbGxpcHNpcyBtYXNrLCBvdmVycmlkZSB0aGUgY3VycmVudCBzdHJpZGUgdmFsdWUuIE90aGVyd2lzZSwgaW5zZXJ0LlxuZXhwb3J0IGZ1bmN0aW9uIHN0cmlkZXNXaXRoRWxpZGVkRGltcyhzdHJpZGVzLCBlbGxpcHNpc0luc2VydGlvbkluZGV4LCBudW1FbGlkZWRBeGVzLCBpbnB1dFNoYXBlKSB7XG4gICAgY29uc3QgbmV3U3RyaWRlcyA9IFsuLi5zdHJpZGVzXTtcbiAgICBmb3IgKGxldCBpID0gbmV3U3RyaWRlcy5sZW5ndGg7IGkgPCBpbnB1dFNoYXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG5ld1N0cmlkZXMucHVzaCgxKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1FbGlkZWRBeGVzOyBpKyspIHtcbiAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAgIG5ld1N0cmlkZXNbZWxsaXBzaXNJbnNlcnRpb25JbmRleF0gPSAxO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbmV3U3RyaWRlcy5zcGxpY2UoZWxsaXBzaXNJbnNlcnRpb25JbmRleCwgMCAvKiBudW0gZWxlbWVudHMgdG8gZGVsZXRlICovLCAxIC8qIGVsZW1lbnQgdG8gYWRkICovKTtcbiAgICAgICAgICAgIG5ld1N0cmlkZXMucG9wKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ld1N0cmlkZXM7XG59XG5mdW5jdGlvbiB1bm5vcm1hbGl6ZUF4aXMoZWxsaXBzaXNJbnNlcnRpb25JbmRleCwgbnVtRWxpZGVkQXhlcywgbm9ybWFsaXplZEF4aXMpIHtcbiAgICBpZiAobm9ybWFsaXplZEF4aXMgPD0gZWxsaXBzaXNJbnNlcnRpb25JbmRleCkge1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplZEF4aXM7XG4gICAgfVxuICAgIHJldHVybiBub3JtYWxpemVkQXhpcyAtIChudW1FbGlkZWRBeGVzIC0gMSk7XG59XG5mdW5jdGlvbiBnZXRFbGlkZWRBeGVzKG51bUVsaWRlZEF4ZXMsIGVsbGlwc2lzSW5zZXJ0aW9uSW5kZXgpIHtcbiAgICBjb25zdCBlbGlkZWRBeGVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1FbGlkZWRBeGVzOyBpKyspIHtcbiAgICAgICAgZWxpZGVkQXhlcy5wdXNoKGVsbGlwc2lzSW5zZXJ0aW9uSW5kZXggKyBpKTtcbiAgICB9XG4gICAgcmV0dXJuIGVsaWRlZEF4ZXM7XG59XG4vLyBOb3JtYWxpemUgdGhlIHN0YXJ0LCBlbmQgYW5kIHN0cmlkZXMuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Tm9ybWFsaXplZEF4ZXMoaW5wdXRTaGFwZSwgZWxsaXBzaXNBeGVzLCBudW1JbnRlcnBvbGF0ZWRBeGVzLCBiZWdpbiwgZW5kLCBzdHJpZGVzLCBiZWdpbk1hc2ssIGVuZE1hc2ssIGVsbGlwc2lzTWFzaykge1xuICAgIGNvbnN0IGlucHV0UmFuayA9IGlucHV0U2hhcGUubGVuZ3RoO1xuICAgIGxldCBub3JtYWxpemVkQmVnaW4gPSBuZXcgQXJyYXkoaW5wdXRSYW5rKSwgbm9ybWFsaXplZEVuZCA9IG5ldyBBcnJheShpbnB1dFJhbmspLCBub3JtYWxpemVkU3RyaWRlcyA9IG5ldyBBcnJheShpbnB1dFJhbmspO1xuICAgIGlmIChlbGxpcHNpc0F4ZXMubGVuZ3RoICYmIG51bUludGVycG9sYXRlZEF4ZXMgPiAwKSB7XG4gICAgICAgIGNvbnN0IGZ1bGxJbmRleCA9IGVsbGlwc2lzQXhlc1swXTtcbiAgICAgICAgLy8gVGhlIGVsbGlwc2lzIGFwcGxpZXMgdG8gdGhlIG1hc2tlZCBpbmRleCBhcyB3ZWxsIGFzIGFueSBkaW1lbnNpb25zXG4gICAgICAgIC8vIHRoYXQgYXJlIGludGVycG9sYXRlZC5cbiAgICAgICAgY29uc3QgbnVtRWxpZGVkQXhlcyA9IG51bUludGVycG9sYXRlZEF4ZXMgKyAxO1xuICAgICAgICBub3JtYWxpemVkQmVnaW4gPSBzdGFydEluZGljZXNXaXRoRWxpZGVkRGltcyhiZWdpbk1hc2ssIGZ1bGxJbmRleCwgbnVtRWxpZGVkQXhlcywgYmVnaW4sIGlucHV0U2hhcGUpO1xuICAgICAgICBub3JtYWxpemVkRW5kID0gc3RvcEluZGljZXNXaXRoRWxpZGVkRGltcyhlbmRNYXNrLCBmdWxsSW5kZXgsIG51bUVsaWRlZEF4ZXMsIGVuZCwgaW5wdXRTaGFwZSk7XG4gICAgICAgIG5vcm1hbGl6ZWRTdHJpZGVzID1cbiAgICAgICAgICAgIHN0cmlkZXNXaXRoRWxpZGVkRGltcyhzdHJpZGVzLCBmdWxsSW5kZXgsIG51bUVsaWRlZEF4ZXMsIGlucHV0U2hhcGUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZm9yIChsZXQgYXhpcyA9IDA7IGF4aXMgPCBpbnB1dFJhbms7IGF4aXMrKykge1xuICAgICAgICAgICAgbm9ybWFsaXplZEJlZ2luW2F4aXNdID0gc3RhcnRGb3JBeGlzKGJlZ2luTWFzaywgYmVnaW4sIHN0cmlkZXMsIGlucHV0U2hhcGUsIGF4aXMsIGVsbGlwc2lzTWFzayk7XG4gICAgICAgICAgICBub3JtYWxpemVkRW5kW2F4aXNdID1cbiAgICAgICAgICAgICAgICBzdG9wRm9yQXhpcyhlbmRNYXNrLCBlbmQsIHN0cmlkZXMsIGlucHV0U2hhcGUsIGF4aXMsIGVsbGlwc2lzTWFzayk7XG4gICAgICAgICAgICBub3JtYWxpemVkU3RyaWRlc1theGlzXSA9IHN0cmlkZXNGb3JBeGlzKHN0cmlkZXMsIGF4aXMsIGVsbGlwc2lzTWFzayk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYmVnaW46IG5vcm1hbGl6ZWRCZWdpbixcbiAgICAgICAgZW5kOiBub3JtYWxpemVkRW5kLFxuICAgICAgICBzdHJpZGVzOiBub3JtYWxpemVkU3RyaWRlc1xuICAgIH07XG59XG4vLyBDcmVhdGVzIGZ1bGwgc2VsZWN0aW9uIGF0IHRoZSBlbGlkZWQgZGltZW5zaW9ucy4gSWYgdGhlIGRpbWVuc2lvbiBtYXRjaGVzXG4vLyB0aGUgZWxsaXBzaXMgbWFzaywgb3ZlcnJpZGUgdGhlIGN1cnJlbnQgc3RhcnQgdmFsdWUuIE90aGVyd2lzZSwgaW5zZXJ0LlxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0SW5kaWNlc1dpdGhFbGlkZWREaW1zKGJlZ2luTWFzaywgZWxsaXBzaXNJbnNlcnRpb25JbmRleCwgbnVtRWxpZGVkQXhlcywgb3JpZ2luYWxCZWdpbiwgaW5wdXRTaGFwZSkge1xuICAgIGNvbnN0IG5ld0luZGljZXMgPSBbLi4uaW5wdXRTaGFwZV07XG4gICAgY29uc3QgZWxpZGVkQXhlcyA9IGdldEVsaWRlZEF4ZXMobnVtRWxpZGVkQXhlcywgZWxsaXBzaXNJbnNlcnRpb25JbmRleCk7XG4gICAgZm9yIChsZXQgYXhpcyA9IDA7IGF4aXMgPCBuZXdJbmRpY2VzLmxlbmd0aDsgYXhpcysrKSB7XG4gICAgICAgIGlmIChlbGlkZWRBeGVzLmluZGV4T2YoYXhpcykgPiAtMSkge1xuICAgICAgICAgICAgbmV3SW5kaWNlc1theGlzXSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbEF4aXMgPSB1bm5vcm1hbGl6ZUF4aXMoZWxsaXBzaXNJbnNlcnRpb25JbmRleCwgbnVtRWxpZGVkQXhlcywgYXhpcyk7XG4gICAgICAgICAgICBsZXQgb3JpZ2luYWxWYWx1ZSA9IG9yaWdpbmFsQmVnaW5bb3JpZ2luYWxBeGlzXTtcbiAgICAgICAgICAgIGlmIChiZWdpbk1hc2sgJiAxIDw8IG9yaWdpbmFsQXhpcykge1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsVmFsdWUgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV3SW5kaWNlc1theGlzXSA9IG9yaWdpbmFsVmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ld0luZGljZXM7XG59XG4vLyBDcmVhdGVzIGZ1bGwgc2VsZWN0aW9uIGF0IHRoZSBlbGlkZWQgZGltZW5zaW9ucy4gSWYgdGhlIGRpbWVuc2lvbiBtYXRjaGVzXG4vLyB0aGUgZWxsaXBzaXMgbWFzaywgb3ZlcnJpZGUgdGhlIGN1cnJlbnQgc3RvcCB2YWx1ZS4gT3RoZXJ3aXNlLCBpbnNlcnQuXG5leHBvcnQgZnVuY3Rpb24gc3RvcEluZGljZXNXaXRoRWxpZGVkRGltcyhlbmRNYXNrLCBlbGxpcHNpc0luc2VydGlvbkluZGV4LCBudW1FbGlkZWRBeGVzLCBvcmlnaW5hbEVuZCwgaW5wdXRTaGFwZSkge1xuICAgIGNvbnN0IG5ld0luZGljZXMgPSBbLi4uaW5wdXRTaGFwZV07XG4gICAgY29uc3QgZWxpZGVkQXhlcyA9IGdldEVsaWRlZEF4ZXMobnVtRWxpZGVkQXhlcywgZWxsaXBzaXNJbnNlcnRpb25JbmRleCk7XG4gICAgZm9yIChsZXQgYXhpcyA9IDA7IGF4aXMgPCBuZXdJbmRpY2VzLmxlbmd0aDsgYXhpcysrKSB7XG4gICAgICAgIGlmIChlbGlkZWRBeGVzLmluZGV4T2YoYXhpcykgPiAtMSkge1xuICAgICAgICAgICAgbmV3SW5kaWNlc1theGlzXSA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxBeGlzID0gdW5ub3JtYWxpemVBeGlzKGVsbGlwc2lzSW5zZXJ0aW9uSW5kZXgsIG51bUVsaWRlZEF4ZXMsIGF4aXMpO1xuICAgICAgICAgICAgbGV0IG9yaWdpbmFsVmFsdWUgPSBvcmlnaW5hbEVuZFtvcmlnaW5hbEF4aXNdO1xuICAgICAgICAgICAgaWYgKGVuZE1hc2sgJiAxIDw8IG9yaWdpbmFsQXhpcykge1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsVmFsdWUgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5ld0luZGljZXNbYXhpc10gPSBvcmlnaW5hbFZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3SW5kaWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyBIYW5kbGUgbmVnYXRpdmUgaW5kaWNlc1xuICAgICAgICBjb25zdCBheGlzU2l6ZSA9IGlucHV0U2hhcGVbaV07XG4gICAgICAgIGlmIChuZXdJbmRpY2VzW2ldIDwgMCkge1xuICAgICAgICAgICAgbmV3SW5kaWNlc1tpXSArPSBheGlzU2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBuZXdJbmRpY2VzW2ldID0gdXRpbC5jbGFtcCgwLCBuZXdJbmRpY2VzW2ldLCBpbnB1dFNoYXBlW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld0luZGljZXM7XG59XG5leHBvcnQgZnVuY3Rpb24gc3RyaWRlc0ZvckF4aXMoc3RyaWRlcywgYXhpcywgZWxsaXBzaXNNYXNrKSB7XG4gICAgbGV0IHN0cmlkZSA9IHN0cmlkZXNbYXhpc107XG4gICAgaWYgKGVsbGlwc2lzTWFzayAmICgxIDw8IGF4aXMpIHx8IHN0cmlkZSA9PSBudWxsKSB7XG4gICAgICAgIHN0cmlkZSA9IDE7XG4gICAgfVxuICAgIHJldHVybiBzdHJpZGU7XG59XG5leHBvcnQgZnVuY3Rpb24gc3RhcnRGb3JBeGlzKGJlZ2luTWFzaywgc3RhcnRJbmRpY2VzLCBzdHJpZGVzLCBpbnB1dFNoYXBlLCBheGlzLCBlbGxpcHNpc01hc2spIHtcbiAgICAvLyBCZWdpbiB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXhcbiAgICBsZXQgc3RhcnQgPSBzdGFydEluZGljZXNbYXhpc107XG4gICAgY29uc3Qgc3RyaWRlID0gc3RyaWRlc1theGlzXSB8fCAxO1xuICAgIC8vIENoZWNrIHRoZSBheGlzIGJpdCBmcm9tIHJpZ2h0IG9mIG1hc2tlZCBheGVzLCBvciB0aGUgYmVnaW4gaW5kZXggaXMgbm90IHNldFxuICAgIC8vIGZvciB0aGUgYXhpcy5cbiAgICBpZiAoYmVnaW5NYXNrICYgMSA8PCBheGlzIHx8IGVsbGlwc2lzTWFzayAmIDEgPDwgYXhpcyB8fCBzdGFydCA9PSBudWxsKSB7XG4gICAgICAgIGlmIChzdHJpZGUgPiAwKSB7XG4gICAgICAgICAgICAvLyBGb3J3YXJkIGl0ZXJhdGlvbiAtIHVzZSB0aGUgZmlyc3QgZWxlbWVudC4gVGhlc2UgdmFsdWVzIHdpbGwgZ2V0XG4gICAgICAgICAgICAvLyBjbGFtcGVkIGJlbG93IChOb3RlOiBXZSBjb3VsZCBoYXZlIHNldCB0aGVtIHRvIDAgYW5kIGF4aXNfc2l6ZS0xLCBidXRcbiAgICAgICAgICAgIC8vIHVzZSBsb3dlc3QoKSBhbmQgbWF4KCkgdG8gbWFpbnRhaW4gc3ltbWV0cnkgd2l0aCBTdG9wRm9yQXhpcygpKVxuICAgICAgICAgICAgc3RhcnQgPSBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIEJhY2t3YXJkIGl0ZXJhdGlvbiAtIHVzZSB0aGUgbGFzdCBlbGVtZW50LlxuICAgICAgICAgICAgc3RhcnQgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBIYW5kbGUgbmVnYXRpdmUgaW5kaWNlc1xuICAgIGNvbnN0IGF4aXNTaXplID0gaW5wdXRTaGFwZVtheGlzXTtcbiAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgIHN0YXJ0ICs9IGF4aXNTaXplO1xuICAgIH1cbiAgICAvLyBDbGFtcGluZ1xuICAgIHN0YXJ0ID0gdXRpbC5jbGFtcCgwLCBzdGFydCwgYXhpc1NpemUgLSAxKTtcbiAgICByZXR1cm4gc3RhcnQ7XG59XG5leHBvcnQgZnVuY3Rpb24gc3RvcEZvckF4aXMoZW5kTWFzaywgc3RvcEluZGljZXMsIHN0cmlkZXMsIGlucHV0U2hhcGUsIGF4aXMsIGVsbGlwc2lzTWFzaykge1xuICAgIC8vIEJlZ2luIHdpdGggdGhlIHNwZWNpZmllZCBpbmRleFxuICAgIGxldCBzdG9wID0gc3RvcEluZGljZXNbYXhpc107XG4gICAgY29uc3Qgc3RyaWRlID0gc3RyaWRlc1theGlzXSB8fCAxO1xuICAgIC8vIENoZWNrIHRoZSBheGlzIGJpdCBmcm9tIHJpZ2h0IG9mIG1hc2tlZCBheGVzLCBvciBpZiB0aGUgc3RvcCBpbmRleCBpcyBub3RcbiAgICAvLyBzZXQgZm9yIHRoaXMgYXhpcy5cbiAgICBpZiAoZW5kTWFzayAmICgxIDw8IGF4aXMpIHx8IGVsbGlwc2lzTWFzayAmICgxIDw8IGF4aXMpIHx8IHN0b3AgPT0gbnVsbCkge1xuICAgICAgICBpZiAoc3RyaWRlID4gMCkge1xuICAgICAgICAgICAgLy8gRm9yd2FyZCBpdGVyYXRpb24gLSB1c2UgdGhlIGxhc3QgZWxlbWVudC4gVGhlc2UgdmFsdWVzIHdpbGwgZ2V0XG4gICAgICAgICAgICAvLyBjbGFtcGVkIGJlbG93XG4gICAgICAgICAgICBzdG9wID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBCYWNrd2FyZCBpdGVyYXRpb24gLSB1c2UgdGhlIGZpcnN0IGVsZW1lbnQuXG4gICAgICAgICAgICBzdG9wID0gTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gSGFuZGxlIG5lZ2F0aXZlIGluZGljZXNcbiAgICBjb25zdCBheGlzU2l6ZSA9IGlucHV0U2hhcGVbYXhpc107XG4gICAgaWYgKHN0b3AgPCAwKSB7XG4gICAgICAgIHN0b3AgKz0gYXhpc1NpemU7XG4gICAgfVxuICAgIC8vIENsYW1waW5nXG4gICAgLy8gQmVjYXVzZSB0aGUgZW5kIGluZGV4IHBvaW50cyBvbmUgcGFzdCB0aGUgbGFzdCBlbGVtZW50LCB3ZSBuZWVkIHNsaWdodGx5XG4gICAgLy8gZGlmZmVyZW50IGNsYW1waW5nIHJhbmdlcyBkZXBlbmRpbmcgb24gdGhlIGRpcmVjdGlvbi5cbiAgICBpZiAoc3RyaWRlID4gMCkge1xuICAgICAgICAvLyBGb3J3YXJkIGl0ZXJhdGlvblxuICAgICAgICBzdG9wID0gdXRpbC5jbGFtcCgwLCBzdG9wLCBheGlzU2l6ZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBCYWNrd2FyZCBpdGVyYXRpb25cbiAgICAgICAgc3RvcCA9IHV0aWwuY2xhbXAoLTEsIHN0b3AsIGF4aXNTaXplIC0gMSk7XG4gICAgfVxuICAgIHJldHVybiBzdG9wO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNsaWNlIG9jY3VwaWVzIGEgY29udGlub3VzIHNldCBvZiBlbGVtZW50cyBpbiB0aGVcbiAqICdmbGF0JyBzcGFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2xpY2VDb250aW5vdXMoc2hhcGUsIGJlZ2luLCBzaXplKSB7XG4gICAgLy8gSW5kZXggb2YgdGhlIGZpcnN0IGF4aXMgdGhhdCBoYXMgc2l6ZSA+IDEuXG4gICAgbGV0IGZpcnN0Tm9uT25lQXhpcyA9IHNpemUubGVuZ3RoO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoc2l6ZVtpXSA+IDEpIHtcbiAgICAgICAgICAgIGZpcnN0Tm9uT25lQXhpcyA9IGk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCBpID0gZmlyc3ROb25PbmVBeGlzICsgMTsgaSA8IHNpemUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGJlZ2luW2ldID4gMCB8fCBzaXplW2ldICE9PSBzaGFwZVtpXSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVGbGF0T2Zmc2V0KGJlZ2luLCBzdHJpZGVzKSB7XG4gICAgbGV0IGZsYXRPZmZzZXQgPSBiZWdpbi5sZW5ndGggPiAwID8gYmVnaW5bYmVnaW4ubGVuZ3RoIC0gMV0gOiAxO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmVnaW4ubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIGZsYXRPZmZzZXQgKz0gYmVnaW5baV0gKiBzdHJpZGVzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gZmxhdE9mZnNldDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNsaWNlUGFyYW1zKHgsIGJlZ2luLCBzaXplKSB7XG4gICAgLy8gVGhlIGZvbGxvd2luZyBsb2dpYyBhbGxvd3MgZm9yIG1vcmUgZXJnb25vbWljIGNhbGxzLlxuICAgIGxldCBiZWdpbl87XG4gICAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcbiAgICBpZiAodHlwZW9mIGJlZ2luID09PSAnbnVtYmVyJykge1xuICAgICAgICBiZWdpbl8gPSBbYmVnaW4sIC4uLm5ldyBBcnJheSh4UmFuayAtIDEpLmZpbGwoMCldO1xuICAgIH1cbiAgICBlbHNlIGlmIChiZWdpbi5sZW5ndGggPCB4UmFuaykge1xuICAgICAgICBiZWdpbl8gPSBiZWdpbi5jb25jYXQobmV3IEFycmF5KHhSYW5rIC0gYmVnaW4ubGVuZ3RoKS5maWxsKDApKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGJlZ2luXyA9IGJlZ2luLnNsaWNlKCk7XG4gICAgfVxuICAgIGJlZ2luXy5mb3JFYWNoKGQgPT4ge1xuICAgICAgICB1dGlsLmFzc2VydChkICE9PSAtMSwgKCkgPT4gJ3NsaWNlKCkgZG9lcyBub3Qgc3VwcG9ydCBuZWdhdGl2ZSBiZWdpbiBpbmRleGluZy4nKTtcbiAgICB9KTtcbiAgICBsZXQgc2l6ZV87XG4gICAgaWYgKHNpemUgPT0gbnVsbCkge1xuICAgICAgICBzaXplXyA9IG5ldyBBcnJheSh4UmFuaykuZmlsbCgtMSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBzaXplID09PSAnbnVtYmVyJykge1xuICAgICAgICBzaXplXyA9IFtzaXplLCAuLi5uZXcgQXJyYXkoeFJhbmsgLSAxKS5maWxsKC0xKV07XG4gICAgfVxuICAgIGVsc2UgaWYgKHNpemUubGVuZ3RoIDwgeFJhbmspIHtcbiAgICAgICAgc2l6ZV8gPSBzaXplLmNvbmNhdChuZXcgQXJyYXkoeFJhbmsgLSBzaXplLmxlbmd0aCkuZmlsbCgtMSkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgc2l6ZV8gPSBzaXplO1xuICAgIH1cbiAgICBzaXplXyA9IHNpemVfLm1hcCgoZCwgaSkgPT4ge1xuICAgICAgICBpZiAoZCA+PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHV0aWwuYXNzZXJ0KGQgPT09IC0xLCAoKSA9PiBgTmVnYXRpdmUgc2l6ZSB2YWx1ZXMgc2hvdWxkIGJlIGV4YWN0bHkgLTEgYnV0IGdvdCBgICtcbiAgICAgICAgICAgICAgICBgJHtkfSBmb3IgdGhlIHNsaWNlKCkgc2l6ZSBhdCBpbmRleCAke2l9LmApO1xuICAgICAgICAgICAgcmV0dXJuIHguc2hhcGVbaV0gLSBiZWdpbl9baV07XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gW2JlZ2luXywgc2l6ZV9dO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNsaWNlSW5mbyh4U2hhcGUsIGJlZ2luLCBlbmQsIHN0cmlkZXMsIGJlZ2luTWFzaywgZW5kTWFzaywgZWxsaXBzaXNNYXNrLCBuZXdBeGlzTWFzaywgc2hyaW5rQXhpc01hc2spIHtcbiAgICAvLyBtYWtlIGEgY29weSBiZWNhdXNlIGl0IG1heSBiZSBtb2RpZmllZCBmdXJ0aGVyIGRvd24uXG4gICAgbGV0ICRiZWdpbiA9IGJlZ2luLnNsaWNlKCk7XG4gICAgbGV0ICRlbmQgPSBlbmQuc2xpY2UoKTtcbiAgICBsZXQgJHN0cmlkZXMgPSBzdHJpZGVzO1xuICAgIGlmIChzdHJpZGVzID09IG51bGwpIHtcbiAgICAgICAgJHN0cmlkZXMgPSBuZXcgQXJyYXkoJGJlZ2luLmxlbmd0aCk7XG4gICAgfVxuICAgIGNvbnN0IGVsbGlwc2lzQXhlcyA9IG1hc2tUb0F4ZXMoZWxsaXBzaXNNYXNrKTtcbiAgICBpZiAoZWxsaXBzaXNBeGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNdWx0aXBsZSBlbGxpcHNlcyBpbiBzbGljZSBpcyBub3QgYWxsb3dlZC4nKTtcbiAgICB9XG4gICAgaWYgKGVsbGlwc2lzTWFzayAhPT0gMCAmJiBuZXdBeGlzTWFzayAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzaW5nIGJvdGggZWxsaXBzaXNNYXNrIGFuZCBuZXdBeGlzTWFzayBpcyBub3QgeWV0IHN1cHBvcnRlZC4nKTtcbiAgICB9XG4gICAgaWYgKGVsbGlwc2lzTWFzayAhPT0gMCAmJiBzaHJpbmtBeGlzTWFzayAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzaW5nIGJvdGggZWxsaXBzaXNNYXNrIGFuZCBzaHJpbmtBeGlzTWFzayBpcyBub3QgeWV0IHN1cHBvcnRlZC4nKTtcbiAgICB9XG4gICAgY29uc3QgbnVtSW50ZXJwb2xhdGVkQXhlcyA9IHhTaGFwZS5sZW5ndGggLSAkYmVnaW4ubGVuZ3RoO1xuICAgIC8vIEV4cGFuZCB0aGUgZGltcyBvZiB4IGJhc2VkIG9uIHRoZSBuZXdBeGlzTWFzay5cbiAgICBjb25zdCBleHBhbmRBeGVzID0gbWFza1RvQXhlcyhuZXdBeGlzTWFzayk7XG4gICAgY29uc3QgbmV3U2hhcGUgPSB4U2hhcGUuc2xpY2UoKTtcbiAgICBleHBhbmRBeGVzLmZvckVhY2goYXhpcyA9PiB7XG4gICAgICAgICRiZWdpbltheGlzXSA9IDA7XG4gICAgICAgICRlbmRbYXhpc10gPSAxO1xuICAgICAgICBuZXdTaGFwZS5zcGxpY2UoYXhpcywgMCwgMSk7XG4gICAgfSk7XG4gICAgY29uc3QgeyBiZWdpbjogbm9ybWFsaXplZEJlZ2luLCBlbmQ6IG5vcm1hbGl6ZWRFbmQsIHN0cmlkZXM6IG5vcm1hbGl6ZWRTdHJpZGVzIH0gPSBnZXROb3JtYWxpemVkQXhlcyhuZXdTaGFwZSwgZWxsaXBzaXNBeGVzLCBudW1JbnRlcnBvbGF0ZWRBeGVzLCAkYmVnaW4sICRlbmQsICRzdHJpZGVzLCBiZWdpbk1hc2ssIGVuZE1hc2ssIGVsbGlwc2lzTWFzayk7XG4gICAgJGJlZ2luID0gbm9ybWFsaXplZEJlZ2luO1xuICAgICRlbmQgPSBub3JtYWxpemVkRW5kO1xuICAgICRzdHJpZGVzID0gbm9ybWFsaXplZFN0cmlkZXM7XG4gICAgY29uc3Qgc2hyaW5rQXhlcyA9IG1hc2tUb0F4ZXMoc2hyaW5rQXhpc01hc2spO1xuICAgIC8vIEFkanVzdCB0aGUgZW5kcyBiYXNlZCBvbiB0aGUgc2hyaW5rIG1hc2suXG4gICAgc2hyaW5rQXhlcy5mb3JFYWNoKGF4aXMgPT4ge1xuICAgICAgICAkZW5kW2F4aXNdID0gJGJlZ2luW2F4aXNdICsgMTtcbiAgICAgICAgJHN0cmlkZXNbYXhpc10gPSAxO1xuICAgIH0pO1xuICAgIC8vIEZpZ3VyZSBvdXQgdGhlIG91dHB1dCBzaGFwZS5cbiAgICBjb25zdCBzaXplID0gY29tcHV0ZU91dFNoYXBlKCRiZWdpbiwgJGVuZCwgJHN0cmlkZXMpO1xuICAgIC8vIFJlbW92ZSB0aGUgYXhlcyBiYXNlZCBvbiBzaHJpbmtNYXNrLlxuICAgIGNvbnN0IG91dFNoYXBlID0gc2l6ZS5maWx0ZXIoKF8sIGF4aXMpID0+IHNocmlua0F4ZXMuaW5kZXhPZihheGlzKSA9PT0gLTEpO1xuICAgIGNvbnN0IG5vblN0cmlkZWQgPSAkc3RyaWRlcy5ldmVyeSh2ID0+IHYgPT09IDEpO1xuICAgIHJldHVybiB7IG5vblN0cmlkZWQsICRiZWdpbiwgJGVuZCwgJHN0cmlkZXMsIHNpemUsIG5ld1NoYXBlLCBvdXRTaGFwZSB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2xpY2VfdXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgU29mdG1heCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBzb2Z0bWF4IG5vcm1hbGl6ZWQgdmVjdG9yIGdpdmVuIHRoZSBsb2dpdHMuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICpcbiAqIGEuc29mdG1heCgpLnByaW50KCk7ICAvLyBvciB0Zi5zb2Z0bWF4KGEpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjJkKFsyLCA0LCA2LCAxLCAyLCAzXSwgWzIsIDNdKTtcbiAqXG4gKiBhLnNvZnRtYXgoKS5wcmludCgpOyAgLy8gb3IgdGYuc29mdG1heChhKVxuICogYGBgXG4gKlxuICogQHBhcmFtIGxvZ2l0cyBUaGUgbG9naXRzIGFycmF5LlxuICogQHBhcmFtIGRpbSBUaGUgZGltZW5zaW9uIHNvZnRtYXggd291bGQgYmUgcGVyZm9ybWVkIG9uLiBEZWZhdWx0cyB0byBgLTFgXG4gKiAgICAgd2hpY2ggaW5kaWNhdGVzIHRoZSBsYXN0IGRpbWVuc2lvbi5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdOb3JtYWxpemF0aW9uJ31cbiAqL1xuZnVuY3Rpb24gc29mdG1heF8obG9naXRzLCBkaW0gPSAtMSkge1xuICAgIGNvbnN0ICRsb2dpdHMgPSBjb252ZXJ0VG9UZW5zb3IobG9naXRzLCAnbG9naXRzJywgJ3NvZnRtYXgnLCAnZmxvYXQzMicpO1xuICAgIGlmIChkaW0gPT09IC0xKSB7XG4gICAgICAgIGRpbSA9ICRsb2dpdHMucmFuayAtIDE7XG4gICAgfVxuICAgIGlmIChkaW0gIT09ICRsb2dpdHMucmFuayAtIDEpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJ1NvZnRtYXggYWxvbmcgYSBub24tbGFzdCBkaW1lbnNpb24gaXMgbm90IHlldCBzdXBwb3J0ZWQuICcgK1xuICAgICAgICAgICAgYExvZ2l0cyB3YXMgcmFuayAkeyRsb2dpdHMucmFua30gYW5kIGRpbSB3YXMgJHtkaW19YCk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0cyA9IHsgbG9naXRzOiAkbG9naXRzIH07XG4gICAgY29uc3QgYXR0cnMgPSB7IGRpbSB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFNvZnRtYXgsIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IHNvZnRtYXggPSBvcCh7IHNvZnRtYXhfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c29mdG1heC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgU29mdHBsdXMgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBzb2Z0cGx1cyBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOiBgbG9nKGV4cCh4KSArIDEpYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzAsIDEsIC0xLCAuN10pO1xuICpcbiAqIHguc29mdHBsdXMoKS5wcmludCgpOyAgLy8gb3IgdGYuc29mdHBsdXMoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gc29mdHBsdXNfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzb2Z0cGx1cycpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChTb2Z0cGx1cywgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBzb2Z0cGx1cyA9IG9wKHsgc29mdHBsdXNfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c29mdHBsdXMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFNwYWNlVG9CYXRjaE5EIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIFRoaXMgb3BlcmF0aW9uIGRpdmlkZXMgXCJzcGF0aWFsXCIgZGltZW5zaW9ucyBgWzEsIC4uLiwgTV1gIG9mIHRoZSBpbnB1dCBpbnRvXG4gKiBhIGdyaWQgb2YgYmxvY2tzIG9mIHNoYXBlIGBibG9ja1NoYXBlYCwgYW5kIGludGVybGVhdmVzIHRoZXNlIGJsb2NrcyB3aXRoXG4gKiB0aGUgXCJiYXRjaFwiIGRpbWVuc2lvbiAoMCkgc3VjaCB0aGF0IGluIHRoZSBvdXRwdXQsIHRoZSBzcGF0aWFsXG4gKiBkaW1lbnNpb25zIGBbMSwgLi4uLCBNXWAgY29ycmVzcG9uZCB0byB0aGUgcG9zaXRpb24gd2l0aGluIHRoZSBncmlkLFxuICogYW5kIHRoZSBiYXRjaCBkaW1lbnNpb24gY29tYmluZXMgYm90aCB0aGUgcG9zaXRpb24gd2l0aGluIGEgc3BhdGlhbCBibG9ja1xuICogYW5kIHRoZSBvcmlnaW5hbCBiYXRjaCBwb3NpdGlvbi4gUHJpb3IgdG8gZGl2aXNpb24gaW50byBibG9ja3MsXG4gKiB0aGUgc3BhdGlhbCBkaW1lbnNpb25zIG9mIHRoZSBpbnB1dCBhcmUgb3B0aW9uYWxseSB6ZXJvIHBhZGRlZFxuICogYWNjb3JkaW5nIHRvIGBwYWRkaW5nc2AuIFNlZSBiZWxvdyBmb3IgYSBwcmVjaXNlIGRlc2NyaXB0aW9uLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yNGQoWzEsIDIsIDMsIDRdLCBbMSwgMiwgMiwgMV0pO1xuICogY29uc3QgYmxvY2tTaGFwZSA9IFsyLCAyXTtcbiAqIGNvbnN0IHBhZGRpbmdzID0gW1swLCAwXSwgWzAsIDBdXTtcbiAqXG4gKiB4LnNwYWNlVG9CYXRjaE5EKGJsb2NrU2hhcGUsIHBhZGRpbmdzKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHggQSBgdGYuVGVuc29yYC4gTi1EIHdpdGggYHguc2hhcGVgID0gYFtiYXRjaF0gKyBzcGF0aWFsU2hhcGUgK1xuICogcmVtYWluaW5nU2hhcGVgLCB3aGVyZSBzcGF0aWFsU2hhcGUgaGFzIGBNYCBkaW1lbnNpb25zLlxuICogQHBhcmFtIGJsb2NrU2hhcGUgQSAxLUQgYXJyYXkuIE11c3QgaGF2ZSBzaGFwZSBgW01dYCwgYWxsIHZhbHVlcyBtdXN0XG4gKiBiZSA+PSAxLlxuICogQHBhcmFtIHBhZGRpbmdzIEEgMi1EIGFycmF5LiBNdXN0IGhhdmUgc2hhcGUgYFtNLCAyXWAsIGFsbCB2YWx1ZXMgbXVzdCBiZSA+PVxuICogICAgIDAuIGBwYWRkaW5nc1tpXSA9IFtwYWRTdGFydCwgcGFkRW5kXWAgc3BlY2lmaWVzIHRoZSBhbW91bnQgdG8gemVyby1wYWRcbiAqIGZyb20gaW5wdXQgZGltZW5zaW9uIGBpICsgMWAsIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHNwYXRpYWwgZGltZW5zaW9uIGBpYC4gSXRcbiAqIGlzIHJlcXVpcmVkIHRoYXRcbiAqIGAoaW5wdXRTaGFwZVtpICsgMV0gKyBwYWRTdGFydCArIHBhZEVuZCkgJSBibG9ja1NoYXBlW2ldID09PSAwYFxuICpcbiAqIFRoaXMgb3BlcmF0aW9uIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZyBzdGVwczpcbiAqXG4gKiAxLiBaZXJvLXBhZCB0aGUgc3RhcnQgYW5kIGVuZCBvZiBkaW1lbnNpb25zIGBbMSwgLi4uLCBNXWAgb2YgdGhlIGlucHV0XG4gKiBhY2NvcmRpbmcgdG8gYHBhZGRpbmdzYCB0byBwcm9kdWNlIGBwYWRkZWRgIG9mIHNoYXBlIHBhZGRlZFNoYXBlLlxuICpcbiAqIDIuIFJlc2hhcGUgYHBhZGRlZGAgdG8gYHJlc2hhcGVkUGFkZGVkYCBvZiBzaGFwZTpcbiAqIGBbYmF0Y2hdICsgW3BhZGRlZFNoYXBlWzFdIC8gYmxvY2tTaGFwZVswXSwgYmxvY2tTaGFwZVswXSwgLi4uLFxuICogcGFkZGVkU2hhcGVbTV0gLyBibG9ja1NoYXBlW00tMV0sIGJsb2NrU2hhcGVbTS0xXV0gKyByZW1haW5pbmdTaGFwZWBcbiAqXG4gKiAzLiBQZXJtdXRlIGRpbWVuc2lvbnMgb2YgYHJlc2hhcGVkUGFkZGVkYCB0byBwcm9kdWNlIGBwZXJtdXRlZFJlc2hhcGVkUGFkZGVkYFxuICogb2Ygc2hhcGU6IGBibG9ja1NoYXBlICsgW2JhdGNoXSArIFtwYWRkZWRTaGFwZVsxXSAvIGJsb2NrU2hhcGVbMF0sIC4uLixcbiAqIHBhZGRlZFNoYXBlW01dIC8gYmxvY2tTaGFwZVtNLTFdXSArIHJlbWFpbmluZ1NoYXBlYFxuICpcbiAqIDQuIFJlc2hhcGUgYHBlcm11dGVkUmVzaGFwZWRQYWRkZWRgIHRvIGZsYXR0ZW4gYGJsb2NrU2hhcGVgIGludG8gdGhlXG4gKiBiYXRjaCBkaW1lbnNpb24sIHByb2R1Y2luZyBhbiBvdXRwdXQgdGVuc29yIG9mIHNoYXBlOlxuICogYFtiYXRjaCAqIHByb2QoYmxvY2tTaGFwZSldICsgW3BhZGRlZFNoYXBlWzFdIC8gYmxvY2tTaGFwZVswXSwgLi4uLFxuICogcGFkZGVkU2hhcGVbTV0gLyBibG9ja1NoYXBlW00tMV1dICsgcmVtYWluaW5nU2hhcGVgXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnVHJhbnNmb3JtYXRpb25zJ31cbiAqL1xuZnVuY3Rpb24gc3BhY2VUb0JhdGNoTkRfKHgsIGJsb2NrU2hhcGUsIHBhZGRpbmdzKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc3BhY2VUb0JhdGNoTkQnKTtcbiAgICB1dGlsLmFzc2VydCgkeC5yYW5rID49IDEgKyBibG9ja1NoYXBlLmxlbmd0aCwgKCkgPT4gYGlucHV0IHJhbmsgJHskeC5yYW5rfSBzaG91bGQgYmUgPiB0aGFuIFtibG9ja1NoYXBlXSAke2Jsb2NrU2hhcGUubGVuZ3RofWApO1xuICAgIHV0aWwuYXNzZXJ0KHBhZGRpbmdzLmxlbmd0aCA9PT0gYmxvY2tTaGFwZS5sZW5ndGgsICgpID0+IGBwYWRkaW5ncy5zaGFwZVswXSAke3BhZGRpbmdzLmxlbmd0aH0gbXVzdCBiZSBlcXVhbCB0byBbYmxvY2tTaGFwZV0gJHtibG9ja1NoYXBlLmxlbmd0aH1gKTtcbiAgICB1dGlsLmFzc2VydCgkeC5zaGFwZS5yZWR1Y2UoKGEsIGIsIGkpID0+IHtcbiAgICAgICAgaWYgKGkgPiAwICYmIGkgPD0gYmxvY2tTaGFwZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBhICYmXG4gICAgICAgICAgICAgICAgKChiICsgcGFkZGluZ3NbaSAtIDFdWzBdICsgcGFkZGluZ3NbaSAtIDFdWzFdKSAlXG4gICAgICAgICAgICAgICAgICAgIGJsb2NrU2hhcGVbaSAtIDFdID09PVxuICAgICAgICAgICAgICAgICAgICAwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYTtcbiAgICB9LCB0cnVlKSwgKCkgPT4gYGlucHV0IHNwYXRpYWwgZGltZW5zaW9ucyAkeyR4LnNoYXBlLnNsaWNlKDEpfSB3aXRoIHBhZGRpbmdzICR7cGFkZGluZ3MudG9TdHJpbmcoKX0gbXVzdCBiZSBkaXZpc2libGUgYnkgYmxvY2tTaGFwZXMgJHtibG9ja1NoYXBlLnRvU3RyaW5nKCl9YCk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBibG9ja1NoYXBlLCBwYWRkaW5ncyB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFNwYWNlVG9CYXRjaE5ELCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBzcGFjZVRvQmF0Y2hORCA9IG9wKHsgc3BhY2VUb0JhdGNoTkRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3BhY2VfdG9fYmF0Y2hfbmQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IFNwYXJzZUZpbGxFbXB0eVJvd3MgfSBmcm9tICcuLi8uLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbi8qKlxuICogVGhlIGlucHV0IFNwYXJzZVRlbnNvciBpcyByZXByZXNlbnRlZCB2aWEgdGhlIG1hcCBvZiBpbnB1dHMge2BpbmRpY2VzYCxcbiAqIGB2YWx1ZXNgLCBgZGVuc2VTaGFwZWB9LiBUaGUgb3V0cHV0IFNwYXJzZVRlbnNvciBoYXMgdGhlIHNhbWUgYGRlbnNlU2hhcGVgXG4gKiBidXQgd2l0aCBpbmRpY2VzIGBvdXRwdXRJbmRpY2VzYCBhbmQgdmFsdWVzIGBvdXRwdXRWYWx1ZXNgLiBUaGlzIG9wIGluc2VydHMgYVxuICogc2luZ2xlIGVudHJ5IGZvciBldmVyeSByb3cgdGhhdCBkb2Vzbid0IGhhdmUgYW55IHZhbHVlcy4gVGhlIGluZGV4IGlzIGNyZWF0ZWRcbiAqIGFzIGBbcm93LCAwLCAuLi4sIDBdYCBhbmQgdGhlIGluc2VydGVkIHZhbHVlIGlzIGBkZWZhdWx0VmFsdWVgLlxuICpcbiAqIEZvciBleGFtcGxlLCBzdXBwb3NlIGBzcElucHV0YCBoYXMgc2hhcGUgWzUsIDZdIGFuZCBub24tZW1wdHkgdmFsdWVzOlxuICogWzAsIDFdOiBhXG4gKiBbMCwgM106IGJcbiAqIFsyLCAwXTogY1xuICogWzMsIDFdOiBkXG4gKlxuICogUm93cyAxIGFuZCA0IGFyZSBlbXB0eSwgc28gdGhlIG91dHB1dCB3aWxsIGJlIG9mIHNoYXBlIFs1LCA2XSB3aXRoIHZhbHVlczpcbiAqIFswLCAxXTogYVxuICogWzAsIDNdOiBiXG4gKiBbMSwgMF06IGBkZWZhdWx0VmFsdWVgXG4gKiBbMiwgMF06IGNcbiAqIFszLCAxXTogZFxuICogWzQsIDBdOiBgZGVmYXVsdFZhbHVlYFxuICpcbiAqIFRoZSBvdXRwdXQgU3BhcnNlVGVuc29yIHdpbGwgYmUgaW4gcm93LW1ham9yIG9yZGVyIGFuZCB3aWxsIGhhdmUgdGhlIHNhbWVcbiAqIHNoYXBlIGFzIHRoZSBpbnB1dC5cbiAqXG4gKiBUaGlzIG9wIGFsc28gcmV0dXJucyBhbiBpbmRpY2F0b3IgdmVjdG9yIHNoYXBlZCBbZGVuc2Vfc2hhcGVbMF1dIHN1Y2ggdGhhdFxuICogZW1wdHlSb3dJbmRpY2F0b3JbaV0gPSBUcnVlIGlmZiByb3cgaSB3YXMgYW4gZW1wdHkgcm93LlxuICpcbiAqIEFuZCBhIHJldmVyc2UgaW5kZXggbWFwIHZlY3RvciBzaGFwZWQgW2luZGljZXMuc2hhcGVbMF1dIHRoYXQgaXMgdXNlZCBkdXJpbmdcbiAqIGJhY2twcm9wYWdhdGlvbiwgcmV2ZXJzZUluZGV4TWFwW2ldID0gb3V0aSBzLnQuIGluZGljZXNbaSwgal0gPT1cbiAqIG91dHB1dEluZGljZXNbb3V0aSwgal0gZm9yIGFsbCBqXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHJlc3VsdCA9IHRmLnNwYXJzZS5zcGFyc2VGaWxsRW1wdHlSb3dzKFxuICogICBbWzAsIDBdLCBbMSwgMF0sIFsxLCAzXSwgWzEsIDRdLCBbMywgMl0sIFszLCAzXV0sXG4gKiAgIFswLCAxMCwgMTMsIDE0LCAzMiwgMzNdLCBbNSwgNl0sIC0xKTtcbiAqIGNvbnNvbGUubG9nKHJlc3VsdCk7XG4gKiByZXN1bHRbJ291dHB1dEluZGljZXMnXS5wcmludCgpOyAvLyBbWzAsIDBdLCBbMSwgMF0sIFsxLCAzXSwgWzEsIDRdLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIFsyLCAwXSwgWzMsIDJdLCBbMywgM10sIFs0LCAwXV1cbiAqIHJlc3VsdFsnb3V0cHV0VmFsdWVzJ10ucHJpbnQoKTsgLy8gWzAsIDEwLCAxMywgMTQsLTEsIDMyLCAzMywgLTFdXG4gKiByZXN1bHRbJ2VtcHR5Um93SW5kaWNhdG9yJ10ucHJpbnQoKTsgLy8gW2ZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIHRydWVdXG4gKiByZXN1bHRbJ3JldmVyc2VJbmRleE1hcCddLnByaW50KCk7IC8vIFswLCAxLCAyLCAzLCA1LCA2XVxuICogYGBgXG4gKiBAcGFyYW0gaW5kaWNlczogMi1ELiB0aGUgaW5kaWNlcyBvZiB0aGUgc3BhcnNlIHRlbnNvci5cbiAqIEBwYXJhbSB2YWx1ZXM6IDEtRC4gdGhlIHZhbHVlcyBvZiB0aGUgc3BhcnNlIHRlbnNvci5cbiAqIEBwYXJhbSBkZW5zZVNoYXBlOiAxLUQuIHRoZSBzaGFwZSBvZiB0aGUgc3BhcnNlIHRlbnNvci5cbiAqIEBwYXJhbSBkZWZhdWx0VmFsdWU6IDAtRC4gZGVmYXVsdCB2YWx1ZSB0byBpbnNlcnQgaW50byBsb2NhdGlvbiBbcm93LCAwLCAuLi4sXG4gKiAgICAgMF0gZm9yIHJvd3MgbWlzc2luZyBmcm9tIHRoZSBpbnB1dCBzcGFyc2UgdGVuc29yLlxuICogQHJldHVybiBBIG1hcCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqICAgICAtIG91dHB1dEluZGljZXNcbiAqICAgICAtIG91dHB1dFZhbHVlczogMS1ELiB0aGUgdmFsdWVzIG9mIHRoZSBmaWxsZWQgc3BhcnNlIHRlbnNvci5cbiAqICAgICAtIGVtcHR5Um93SW5kaWNhdG9yOiAxLUQuIHdoZXRoZXIgdGhlIGRlbnNlIHJvdyB3YXMgbWlzc2luZyBpbiB0aGUgaW5wdXRcbiAqIHNwYXJzZSB0ZW5zb3IuXG4gKiAgICAgLSByZXZlcnNlSW5kZXhNYXA6IDEtRC4gYSBtYXAgZnJvbSB0aGUgaW5wdXQgaW5kaWNlcyB0byB0aGUgb3V0cHV0XG4gKiBpbmRpY2VzLlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU3BhcnNlJ31cbiAqL1xuZnVuY3Rpb24gc3BhcnNlRmlsbEVtcHR5Um93c18oaW5kaWNlcywgdmFsdWVzLCBkZW5zZVNoYXBlLCBkZWZhdWx0VmFsdWUpIHtcbiAgICBjb25zdCAkaW5kaWNlcyA9IGNvbnZlcnRUb1RlbnNvcihpbmRpY2VzLCAnaW5kaWNlcycsICdzcGFyc2VGaWxsRW1wdHlSb3dzJyk7XG4gICAgY29uc3QgJHZhbHVlcyA9IGNvbnZlcnRUb1RlbnNvcih2YWx1ZXMsICd2YWx1ZXMnLCAnc3BhcnNlRmlsbEVtcHR5Um93cycpO1xuICAgIGNvbnN0ICRkZW5zZVNoYXBlID0gY29udmVydFRvVGVuc29yKGRlbnNlU2hhcGUsICdkZW5zZVNoYXBlJywgJ3NwYXJzZUZpbGxFbXB0eVJvd3MnKTtcbiAgICBjb25zdCAkZGVmYXVsdFZhbHVlID0gY29udmVydFRvVGVuc29yKGRlZmF1bHRWYWx1ZSwgJ2RlZmF1bHRWYWx1ZScsICdzcGFyc2VGaWxsRW1wdHlSb3dzJywgJHZhbHVlcy5kdHlwZSk7XG4gICAgaWYgKCRpbmRpY2VzLnJhbmsgIT09IDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbmRpY2VzIHNob3VsZCBiZSBUZW5zb3IyRCBidXQgcmVjZWl2ZWQgc2hhcGVcbiAgICAgICAgJHskaW5kaWNlcy5zaGFwZX1gKTtcbiAgICB9XG4gICAgaWYgKCR2YWx1ZXMucmFuayAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFZhbHVlcyBzaG91bGQgYmUgVGVuc29yMUQgYnV0IHJlY2VpdmVkIHNoYXBlICR7JHZhbHVlcy5zaGFwZX1gKTtcbiAgICB9XG4gICAgaWYgKCRkZW5zZVNoYXBlLnJhbmsgIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEZW5zZSBzaGFwZSBzaG91bGQgYmUgVGVuc29yMUQgYnV0IHJlY2VpdmVkIHNoYXBlICR7JGRlbnNlU2hhcGUuc2hhcGV9YCk7XG4gICAgfVxuICAgIGlmICgkZGVmYXVsdFZhbHVlLnJhbmsgIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEZWZhdWx0IHZhbHVlIHNob3VsZCBiZSBhIHNjYWxhciBidXQgcmVjZWl2ZWQgc2hhcGUgJHskZGVmYXVsdFZhbHVlLnNoYXBlfWApO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dHMgPSB7XG4gICAgICAgIGluZGljZXM6ICRpbmRpY2VzLFxuICAgICAgICB2YWx1ZXM6ICR2YWx1ZXMsXG4gICAgICAgIGRlbnNlU2hhcGU6ICRkZW5zZVNoYXBlLFxuICAgICAgICBkZWZhdWx0VmFsdWU6ICRkZWZhdWx0VmFsdWVcbiAgICB9O1xuICAgIGNvbnN0IHJlc3VsdCA9IEVOR0lORS5ydW5LZXJuZWwoU3BhcnNlRmlsbEVtcHR5Um93cywgaW5wdXRzKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBvdXRwdXRJbmRpY2VzOiByZXN1bHRbMF0sXG4gICAgICAgIG91dHB1dFZhbHVlczogcmVzdWx0WzFdLFxuICAgICAgICBlbXB0eVJvd0luZGljYXRvcjogcmVzdWx0WzJdLFxuICAgICAgICByZXZlcnNlSW5kZXhNYXA6IHJlc3VsdFszXVxuICAgIH07XG59XG5leHBvcnQgY29uc3Qgc3BhcnNlRmlsbEVtcHR5Um93cyA9IG9wKHsgc3BhcnNlRmlsbEVtcHR5Um93c18gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zcGFyc2VfZmlsbF9lbXB0eV9yb3dzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBTcGFyc2VSZXNoYXBlIH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4uL29wZXJhdGlvbic7XG4vKipcbiAqIFRoaXMgb3BlcmF0aW9uIGhhcyB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgcmVzaGFwZSBvbiB0aGUgcmVwcmVzZW50ZWQgZGVuc2VcbiAqIHRlbnNvci4gVGhlIGBpbnB1dEluZGljZXNgIGFyZSByZWNvbXB1dGVkIGJhc2VkIG9uIHRoZSByZXF1ZXN0ZWQgYG5ld1NoYXBlYC5cbiAqIElmIG9uZSBjb21wb25lbnQgb2YgYG5ld1NoYXBlYCBpcyB0aGUgc3BlY2lhbCB2YWx1ZSAtMSwgdGhlIHNpemUgb2YgdGhhdFxuICogZGltZW5zaW9uIGlzIGNvbXB1dGVkIHNvIHRoYXQgdGhlIHRvdGFsIGRlbnNlIHNpemUgcmVtYWlucyBjb25zdGFudC4gQXQgbW9zdFxuICogb25lIGNvbXBvbmVudCBvZiBgbmV3U2hhcGVgIGNhbiBiZSAtMS4gVGhlIG51bWJlciBvZiBkZW5zZSBlbGVtZW50cyBpbXBsaWVkXG4gKiBieSBgbmV3U2hhcGVgIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBkZW5zZSBlbGVtZW50cyBvcmlnaW5hbGx5XG4gKiBpbXBsaWVkIGJ5IGBpbnB1dFNoYXBlYC4gUmVzaGFwaW5nIGRvZXMgbm90IGFmZmVjdCB0aGUgb3JkZXIgb2YgdmFsdWVzIGluIHRoZVxuICogU3BhcnNlVGVuc29yLiBJZiB0aGUgaW5wdXQgdGVuc29yIGhhcyByYW5rIFJfaW4gYW5kIE4gbm9uLWVtcHR5IHZhbHVlcywgYW5kXG4gKiBgbmV3U2hhcGVgIGhhcyBsZW5ndGggUl9vdXQsIHRoZW4gYGlucHV0SW5kaWNlc2AgaGFzIHNoYXBlIFtOLCBSX2luXSxcbiAqIGBpbnB1dFNoYXBlYCBoYXMgbGVuZ3RoIFJfaW4sIGBvdXRwdXRJbmRpY2VzYCBoYXMgc2hhcGUgW04sIFJfb3V0XSwgYW5kXG4gKiBgb3V0cHV0U2hhcGVgIGhhcyBsZW5ndGggUl9vdXQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHJlc3VsdCA9IHRmLnNwYXJzZS5zcGFyc2VSZXNoYXBlKFxuICogICBbWzAsIDAsIDBdLCBbMCwgMCwgMV0sIFswLCAxLCAwXSwgWzEsIDAsIDBdLCBbMSwgMiwgM11dLFxuICogICBbMiwgMywgNl0sIFs5LCAtMV0pO1xuICogY29uc29sZS5sb2cocmVzdWx0KTtcbiAqIHJlc3VsdFsnb3V0cHV0SW5kaWNlcyddLnByaW50KCk7IC8vW1swLCAwXSwgWzAsIDFdLCBbMSwgMl0sIFs0LCAyXSwgWzgsIDFdXVxuICogcmVzdWx0WydvdXRwdXRTaGFwZSddLnByaW50KCk7IC8vIFs5LCA0XVxuICogYGBgXG4gKiBAcGFyYW0gaW5wdXRJbmRpY2VzOiAyLUQuIE4geCBSX2luIG1hdHJpeCB3aXRoIHRoZSBpbmRpY2VzIG9mIG5vbi1lbXB0eVxuICogdmFsdWVzIGluIGEgU3BhcnNlVGVuc29yLlxuICogQHBhcmFtIGlucHV0U2hhcGU6IDEtRC4gUl9pbiBUZW5zb3IxRCB3aXRoIHRoZSBpbnB1dCBTcGFyc2VUZW5zb3IncyBkZW5zZVxuICogc2hhcGUuXG4gKiBAcGFyYW0gbmV3U2hhcGU6IDEtRC4gUl9vdXQgVGVuc29yMUQgd2l0aCB0aGUgcmVxdWVzdGVkIG5ldyBkZW5zZSBzaGFwZS5cbiAqIEByZXR1cm4gQSBtYXAgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAgICAgLSBvdXRwdXRJbmRpY2VzOiAyLUQuIE4geCBSX291dCBtYXRyaXggd2l0aCB0aGUgdXBkYXRlZCBpbmRpY2VzIG9mXG4gKiAgICAgICBub24tZW1wdHkgdmFsdWVzIGluIHRoZSBvdXRwdXQgU3BhcnNlVGVuc29yLlxuICogICAgIC0gb3V0cHV0U2hhcGU6IDEtRC4gUl9vdXQgdmVjdG9yIHdpdGggdGhlIGZ1bGwgZGVuc2Ugc2hhcGUgb2YgdGhlIG91dHB1dFxuICogICAgICAgU3BhcnNlVGVuc29yLiBUaGlzIGlzIHRoZSBzYW1lIGFzIG5ld1NoYXBlIGJ1dCB3aXRoIGFueSAtMSBkaW1lbnNpb25zXG4gKiAgICAgICAgZmlsbGVkIGluLlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU3BhcnNlJ31cbiAqL1xuZnVuY3Rpb24gc3BhcnNlUmVzaGFwZV8oaW5wdXRJbmRpY2VzLCBpbnB1dFNoYXBlLCBuZXdTaGFwZSkge1xuICAgIGNvbnN0ICRpbnB1dEluZGljZXMgPSBjb252ZXJ0VG9UZW5zb3IoaW5wdXRJbmRpY2VzLCAnaW5wdXRJbmRpY2VzJywgJ3NwYXJzZVJlc2hhcGUnKTtcbiAgICBjb25zdCAkaW5wdXRTaGFwZSA9IGNvbnZlcnRUb1RlbnNvcihpbnB1dFNoYXBlLCAnaW5wdXRTaGFwZScsICdzcGFyc2VSZXNoYXBlJyk7XG4gICAgY29uc3QgJG5ld1NoYXBlID0gY29udmVydFRvVGVuc29yKG5ld1NoYXBlLCAnbmV3U2hhcGUnLCAnc3BhcnNlUmVzaGFwZScpO1xuICAgIGlmICgkaW5wdXRJbmRpY2VzLnJhbmsgIT09IDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnB1dCBpbmRpY2VzIHNob3VsZCBiZSBUZW5zb3IyRCBidXQgcmVjZWl2ZWQgc2hhcGVcbiAgICAgICAgJHskaW5wdXRJbmRpY2VzLnNoYXBlfWApO1xuICAgIH1cbiAgICBpZiAoJGlucHV0U2hhcGUucmFuayAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYElucHV0IHNoYXBlIHNob3VsZCBiZSBUZW5zb3IxRCBidXQgcmVjZWl2ZWQgc2hhcGUgJHskaW5wdXRTaGFwZS5zaGFwZX1gKTtcbiAgICB9XG4gICAgaWYgKCRuZXdTaGFwZS5yYW5rICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTmV3IHNoYXBlIHNob3VsZCBiZSBUZW5zb3IxRCBidXQgcmVjZWl2ZWQgc2hhcGUgJHskbmV3U2hhcGUuc2hhcGV9YCk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0cyA9IHtcbiAgICAgICAgaW5wdXRJbmRpY2VzOiAkaW5wdXRJbmRpY2VzLFxuICAgICAgICBpbnB1dFNoYXBlOiAkaW5wdXRTaGFwZSxcbiAgICAgICAgbmV3U2hhcGU6ICRuZXdTaGFwZVxuICAgIH07XG4gICAgY29uc3QgcmVzdWx0ID0gRU5HSU5FLnJ1bktlcm5lbChTcGFyc2VSZXNoYXBlLCBpbnB1dHMpO1xuICAgIHJldHVybiB7IG91dHB1dEluZGljZXM6IHJlc3VsdFswXSwgb3V0cHV0U2hhcGU6IHJlc3VsdFsxXSB9O1xufVxuZXhwb3J0IGNvbnN0IHNwYXJzZVJlc2hhcGUgPSBvcCh7IHNwYXJzZVJlc2hhcGVfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3BhcnNlX3Jlc2hhcGUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IFNwYXJzZVNlZ21lbnRNZWFuIH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4uL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBtZWFuIGFsb25nIHNwYXJzZSBzZWdtZW50cyBvZiBhIHRlbnNvci5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYyA9IHRmLnRlbnNvcjJkKFtbMSwyLDMsNF0sIFstMSwtMiwtMywtNF0sIFs2LDcsOCw5XV0pO1xuICogLy8gU2VsZWN0IHR3byByb3dzLCBvbmUgc2VnbWVudC5cbiAqIGNvbnN0IHJlc3VsdDEgPSB0Zi5zcGFyc2Uuc3BhcnNlU2VnbWVudE1lYW4oYyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmLnRlbnNvcjFkKFswLCAxXSwgJ2ludDMyJyksXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Zi50ZW5zb3IxZChbMCwgMF0sICdpbnQzMicpKTtcbiAqIHJlc3VsdDEucHJpbnQoKTsgLy8gW1swLCAwLCAwLCAwXV1cbiAqXG4gKiAvLyBTZWxlY3QgdHdvIHJvd3MsIHR3byBzZWdtZW50cy5cbiAqIGNvbnN0IHJlc3VsdDIgPSB0Zi5zcGFyc2Uuc3BhcnNlU2VnbWVudE1lYW4oYyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGYudGVuc29yMWQoWzAsIDFdLCAnaW50MzInKSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGYudGVuc29yMWQoWzAsIDFdLCAnaW50MzInKSk7XG4gKiByZXN1bHQyLnByaW50KCk7IC8vIFtbMSwgMiwgMywgNF0sIFstMSwgLTIsIC0zLCAtNF1dXG4gKlxuICogLy8gU2VsZWN0IGFsbCByb3dzLCB0d28gc2VnbWVudHMuXG4gKiBjb25zdCByZXN1bHQzID0gdGYuc3BhcnNlLnNwYXJzZVNlZ21lbnRNZWFuKGMsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmLnRlbnNvcjFkKFswLCAxLCAyXSwgJ2ludDMyJyksXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmLnRlbnNvcjFkKFswLCAxLCAxXSwgJ2ludDMyJykpO1xuICogcmVzdWx0My5wcmludCgpOyAvLyBbWzEuMCwgMi4wLCAzLjAsIDQuMF0sIFsyLjUsIDIuNSwgMi41LCAyLjVdXVxuICogYGBgXG4gKiBAcGFyYW0gZGF0YTogQSBUZW5zb3Igb2YgYXQgbGVhc3Qgb25lIGRpbWVuc2lvbiB3aXRoIGRhdGEgdGhhdCB3aWxsIGJlXG4gKiAgICAgYXNzZW1ibGVkIGluIHRoZSBvdXRwdXQuXG4gKiBAcGFyYW0gaW5kaWNlczogQSAxLUQgVGVuc29yIHdpdGggaW5kaWNlcyBpbnRvIGRhdGEuIEhhcyBzYW1lIHJhbmsgYXNcbiAqICAgICBzZWdtZW50SWRzLlxuICogQHBhcmFtIHNlZ21lbnRJZHM6IEEgMS1EIFRlbnNvciB3aXRoIGluZGljZXMgaW50byB0aGUgb3V0cHV0IFRlbnNvci4gVmFsdWVzXG4gKiAgICAgc2hvdWxkIGJlIHNvcnRlZCBhbmQgY2FuIGJlIHJlcGVhdGVkLlxuICogQHJldHVybiBIYXMgc2FtZSBzaGFwZSBhcyBkYXRhLCBleGNlcHQgZm9yIGRpbWVuc2lvbiAwIHdoaWNoIGhhcyBlcXVhbCB0b1xuICogICAgICAgICB0aGUgbnVtYmVyIG9mIHNlZ21lbnRzLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1NwYXJzZSd9XG4gKi9cbmZ1bmN0aW9uIHNwYXJzZVNlZ21lbnRNZWFuXyhkYXRhLCBpbmRpY2VzLCBzZWdtZW50SWRzKSB7XG4gICAgY29uc3QgJGRhdGEgPSBjb252ZXJ0VG9UZW5zb3IoZGF0YSwgJ2RhdGEnLCAnc3BhcnNlU2VnbWVudE1lYW4nKTtcbiAgICBjb25zdCAkaW5kaWNlcyA9IGNvbnZlcnRUb1RlbnNvcihpbmRpY2VzLCAnaW5kaWNlcycsICdzcGFyc2VTZWdtZW50TWVhbicpO1xuICAgIGNvbnN0ICRzZWdtZW50SWRzID0gY29udmVydFRvVGVuc29yKHNlZ21lbnRJZHMsICdzZWdtZW50SWRzJywgJ3NwYXJzZVNlZ21lbnRNZWFuJyk7XG4gICAgaWYgKCRkYXRhLnJhbmsgPCAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRGF0YSBzaG91bGQgYmUgYXQgbGVhc3QgMSBkaW1lbnNpb25hbCBidXQgcmVjZWl2ZWQgc2NhbGFyYCk7XG4gICAgfVxuICAgIGlmICgkaW5kaWNlcy5yYW5rICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW5kaWNlcyBzaG91bGQgYmUgVGVuc29yMUQgYnV0IHJlY2VpdmVkIHNoYXBlXG4gICAgICAgICAgJHskaW5kaWNlcy5zaGFwZX1gKTtcbiAgICB9XG4gICAgaWYgKCRzZWdtZW50SWRzLnJhbmsgIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZWdtZW50IGlkcyBzaG91bGQgYmUgVGVuc29yMUQgYnV0IHJlY2VpdmVkIHNoYXBlXG4gICAgICAgICAgJHskc2VnbWVudElkcy5zaGFwZX1gKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0ge1xuICAgICAgICBkYXRhOiAkZGF0YSxcbiAgICAgICAgaW5kaWNlczogJGluZGljZXMsXG4gICAgICAgIHNlZ21lbnRJZHM6ICRzZWdtZW50SWRzXG4gICAgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChTcGFyc2VTZWdtZW50TWVhbiwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBzcGFyc2VTZWdtZW50TWVhbiA9IG9wKHsgc3BhcnNlU2VnbWVudE1lYW5fIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3BhcnNlX3NlZ21lbnRfbWVhbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgU3BhcnNlU2VnbWVudFN1bSB9IGZyb20gJy4uLy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgc3VtIGFsb25nIHNwYXJzZSBzZWdtZW50cyBvZiBhIHRlbnNvci5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYyA9IHRmLnRlbnNvcjJkKFtbMSwyLDMsNF0sIFstMSwtMiwtMywtNF0sIFs1LDYsNyw4XV0pO1xuICogLy8gU2VsZWN0IHR3byByb3dzLCBvbmUgc2VnbWVudC5cbiAqIGNvbnN0IHJlc3VsdDEgPSB0Zi5zcGFyc2Uuc3BhcnNlU2VnbWVudFN1bShjLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGYudGVuc29yMWQoWzAsIDFdLCAnaW50MzInKSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmLnRlbnNvcjFkKFswLCAwXSwgJ2ludDMyJykpO1xuICogcmVzdWx0MS5wcmludCgpOyAvLyBbWzAsIDAsIDAsIDBdXVxuICpcbiAqIC8vIFNlbGVjdCB0d28gcm93cywgdHdvIHNlZ21lbnQuXG4gKiBjb25zdCByZXN1bHQyID0gdGYuc3BhcnNlLnNwYXJzZVNlZ21lbnRTdW0oYyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmLnRlbnNvcjFkKFswLCAxXSwgJ2ludDMyJyksXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Zi50ZW5zb3IxZChbMCwgMV0sICdpbnQzMicpKTtcbiAqIHJlc3VsdDIucHJpbnQoKTsgLy8gW1sxLCAyLCAzLCA0XSwgWy0xLCAtMiwgLTMsIC00XV1cbiAqXG4gKiAvLyBTZWxlY3QgYWxsIHJvd3MsIHR3byBzZWdtZW50cy5cbiAqIGNvbnN0IHJlc3VsdDMgPSB0Zi5zcGFyc2Uuc3BhcnNlU2VnbWVudFN1bShjLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGYudGVuc29yMWQoWzAsIDEsIDJdLCAnaW50MzInKSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmLnRlbnNvcjFkKFswLCAwLCAxXSwgJ2ludDMyJykpO1xuICogcmVzdWx0My5wcmludCgpOyAvLyBbWzAsIDAsIDAsIDBdLCBbNSwgNiwgNywgOF1dXG4gKiBgYGBcbiAqIEBwYXJhbSBkYXRhOiBBIFRlbnNvciBvZiBhdCBsZWFzdCBvbmUgZGltZW5zaW9uIHdpdGggZGF0YSB0aGF0IHdpbGwgYmVcbiAqICAgICBhc3NlbWJsZWQgaW4gdGhlIG91dHB1dC5cbiAqIEBwYXJhbSBpbmRpY2VzOiBBIDEtRCBUZW5zb3Igd2l0aCBpbmRpY2VzIGludG8gZGF0YS4gSGFzIHNhbWUgcmFuayBhc1xuICogICAgIHNlZ21lbnRJZHMuXG4gKiBAcGFyYW0gc2VnbWVudElkczogQSAxLUQgVGVuc29yIHdpdGggaW5kaWNlcyBpbnRvIHRoZSBvdXRwdXQgVGVuc29yLiBWYWx1ZXNcbiAqICAgICBzaG91bGQgYmUgc29ydGVkIGFuZCBjYW4gYmUgcmVwZWF0ZWQuXG4gKiBAcmV0dXJuIEhhcyBzYW1lIHNoYXBlIGFzIGRhdGEsIGV4Y2VwdCBmb3IgZGltZW5zaW9uIDAgd2hpY2ggaGFzIGVxdWFsIHRvXG4gKiAgICAgICAgIHRoZSBudW1iZXIgb2Ygc2VnbWVudHMuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU3BhcnNlJ31cbiAqL1xuZnVuY3Rpb24gc3BhcnNlU2VnbWVudFN1bV8oZGF0YSwgaW5kaWNlcywgc2VnbWVudElkcykge1xuICAgIGNvbnN0ICRkYXRhID0gY29udmVydFRvVGVuc29yKGRhdGEsICdkYXRhJywgJ3NwYXJzZVNlZ21lbnRTdW0nKTtcbiAgICBjb25zdCAkaW5kaWNlcyA9IGNvbnZlcnRUb1RlbnNvcihpbmRpY2VzLCAnaW5kaWNlcycsICdzcGFyc2VTZWdtZW50U3VtJyk7XG4gICAgY29uc3QgJHNlZ21lbnRJZHMgPSBjb252ZXJ0VG9UZW5zb3Ioc2VnbWVudElkcywgJ3NlZ21lbnRJZHMnLCAnc3BhcnNlU2VnbWVudFN1bScpO1xuICAgIGlmICgkZGF0YS5yYW5rIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERhdGEgc2hvdWxkIGJlIGF0IGxlYXN0IDEgZGltZW5zaW9uYWwgYnV0IHJlY2VpdmVkIHNjYWxhcmApO1xuICAgIH1cbiAgICBpZiAoJGluZGljZXMucmFuayAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluZGljZXMgc2hvdWxkIGJlIFRlbnNvcjFEIGJ1dCByZWNlaXZlZCBzaGFwZVxuICAgICAgICAgJHskaW5kaWNlcy5zaGFwZX1gKTtcbiAgICB9XG4gICAgaWYgKCRzZWdtZW50SWRzLnJhbmsgIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZWdtZW50IGlkcyBzaG91bGQgYmUgVGVuc29yMUQgYnV0IHJlY2VpdmVkIHNoYXBlXG4gICAgICAgICAkeyRzZWdtZW50SWRzLnNoYXBlfWApO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dHMgPSB7XG4gICAgICAgIGRhdGE6ICRkYXRhLFxuICAgICAgICBpbmRpY2VzOiAkaW5kaWNlcyxcbiAgICAgICAgc2VnbWVudElkczogJHNlZ21lbnRJZHNcbiAgICB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFNwYXJzZVNlZ21lbnRTdW0sIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3Qgc3BhcnNlU2VnbWVudFN1bSA9IG9wKHsgc3BhcnNlU2VnbWVudFN1bV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zcGFyc2Vfc2VnbWVudF9zdW0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFNwYXJzZVRvRGVuc2UgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0ICogYXMgc3BhcnNlX3RvX2RlbnNlIGZyb20gJy4uL29wcy9zcGFyc2VfdG9fZGVuc2VfdXRpbCc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbnZlcnRzIGEgc3BhcnNlIHJlcHJlc2VudGF0aW9uIGludG8gYSBkZW5zZSB0ZW5zb3IuXG4gKlxuICogQnVpbGRzIGFuIGFycmF5IGRlbnNlIHdpdGggc2hhcGUgb3V0cHV0U2hhcGUgc3VjaCB0aGF0OlxuICpcbiAqIC8vIElmIHNwYXJzZUluZGljZXMgaXMgc2NhbGFyXG4gKiBkZW5zZVtpXSA9IChpID09IHNwYXJzZUluZGljZXMgPyBzcGFyc2VWYWx1ZXMgOiBkZWZhdWx0VmFsdWUpXG4gKlxuICogLy8gSWYgc3BhcnNlSW5kaWNlcyBpcyBhIHZlY3RvciwgdGhlbiBmb3IgZWFjaCBpXG4gKiBkZW5zZVtzcGFyc2VJbmRpY2VzW2ldXSA9IHNwYXJzZVZhbHVlc1tpXVxuICpcbiAqIC8vIElmIHNwYXJzZUluZGljZXMgaXMgYW4gbiBieSBkIG1hdHJpeCwgdGhlbiBmb3IgZWFjaCBpIGluIFswLCBuKVxuICogZGVuc2Vbc3BhcnNlSW5kaWNlc1tpXVswXSwgLi4uLCBzcGFyc2VJbmRpY2VzW2ldW2QtMV1dID0gc3BhcnNlVmFsdWVzW2ldXG4gKiBBbGwgb3RoZXIgdmFsdWVzIGluIGRlbnNlIGFyZSBzZXQgdG8gZGVmYXVsdFZhbHVlLiBJZiBzcGFyc2VWYWx1ZXMgaXMgYVxuICogc2NhbGFyLCBhbGwgc3BhcnNlIGluZGljZXMgYXJlIHNldCB0byB0aGlzIHNpbmdsZSB2YWx1ZS5cbiAqXG4gKiBJZiBpbmRpY2VzIGFyZSByZXBlYXRlZCB0aGUgZmluYWwgdmFsdWUgaXMgc3VtbWVkIG92ZXIgYWxsIHZhbHVlcyBmb3IgdGhvc2VcbiAqIGluZGljZXMuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGluZGljZXMgPSB0Zi50ZW5zb3IxZChbNCwgNSwgNiwgMSwgMiwgM10sICdpbnQzMicpO1xuICogY29uc3QgdmFsdWVzID0gdGYudGVuc29yMWQoWzEwLCAxMSwgMTIsIDEzLCAxNCwgMTVdLCAnZmxvYXQzMicpO1xuICogY29uc3Qgc2hhcGUgPSBbOF07XG4gKiB0Zi5zcGFyc2VUb0RlbnNlKGluZGljZXMsIHZhbHVlcywgc2hhcGUpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gc3BhcnNlSW5kaWNlcyBBIDAtRCwgMS1ELCBvciAyLUQgVGVuc29yIG9mIHR5cGUgaW50MzIuXG4gKiBzcGFyc2VJbmRpY2VzW2ldIGNvbnRhaW5zIHRoZSBjb21wbGV0ZSBpbmRleCB3aGVyZSBzcGFyc2VWYWx1ZXNbaV0gd2lsbCBiZVxuICogcGxhY2VkLlxuICogQHBhcmFtIHNwYXJzZVZhbHVlcyBBIDAtRCBvciAxLUQgVGVuc29yLiBWYWx1ZXNcbiAqIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCByb3cgb2Ygc3BhcnNlSW5kaWNlcywgb3IgYSBzY2FsYXIgdmFsdWUgdG8gYmUgdXNlZCBmb3JcbiAqIGFsbCBzcGFyc2UgaW5kaWNlcy5cbiAqIEBwYXJhbSBvdXRwdXRTaGFwZSBTaGFwZSBvZiB0aGUgZGVuc2Ugb3V0cHV0IHRlbnNvci4gdGhlIHR5cGUgaXMgaW5mZXJyZWQuXG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFNjYWxhci4gVmFsdWUgdG8gc2V0IGZvciBpbmRpY2VzIG5vdCBzcGVjaWZpZWQgaW5cbiAqIHNwYXJzZUluZGljZXMuIERlZmF1bHRzIHRvIHplcm8uXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTm9ybWFsaXphdGlvbid9XG4gKi9cbmZ1bmN0aW9uIHNwYXJzZVRvRGVuc2VfKHNwYXJzZUluZGljZXMsIHNwYXJzZVZhbHVlcywgb3V0cHV0U2hhcGUsIGRlZmF1bHRWYWx1ZSA9IDApIHtcbiAgICBjb25zdCAkc3BhcnNlSW5kaWNlcyA9IGNvbnZlcnRUb1RlbnNvcihzcGFyc2VJbmRpY2VzLCAnc3BhcnNlSW5kaWNlcycsICdzcGFyc2VUb0RlbnNlJywgJ2ludDMyJyk7XG4gICAgY29uc3QgJHNwYXJzZVZhbHVlcyA9IGNvbnZlcnRUb1RlbnNvcihzcGFyc2VWYWx1ZXMsICdzcGFyc2VWYWx1ZXMnLCAnc3BhcnNlVG9EZW5zZScpO1xuICAgIGNvbnN0ICRkZWZhdWx0VmFsdWUgPSBjb252ZXJ0VG9UZW5zb3IoZGVmYXVsdFZhbHVlLCAnZGVmYXVsdFZhbHVlJywgJ3NwYXJzZVRvRGVuc2UnLCAkc3BhcnNlVmFsdWVzLmR0eXBlKTtcbiAgICBzcGFyc2VfdG9fZGVuc2UudmFsaWRhdGVJbnB1dCgkc3BhcnNlSW5kaWNlcywgJHNwYXJzZVZhbHVlcywgb3V0cHV0U2hhcGUsICRkZWZhdWx0VmFsdWUpO1xuICAgIGNvbnN0IGlucHV0cyA9IHtcbiAgICAgICAgc3BhcnNlSW5kaWNlczogJHNwYXJzZUluZGljZXMsXG4gICAgICAgIHNwYXJzZVZhbHVlczogJHNwYXJzZVZhbHVlcyxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiAkZGVmYXVsdFZhbHVlXG4gICAgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgb3V0cHV0U2hhcGUgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChTcGFyc2VUb0RlbnNlLCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBzcGFyc2VUb0RlbnNlID0gb3AoeyBzcGFyc2VUb0RlbnNlXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNwYXJzZV90b19kZW5zZS5qcy5tYXAiLCIvKipcbiAqIFZhbGlkYXRlIHNwYXJzZVRvRGVuc2UgaW5wdXRzLlxuICpcbiAqIEBwYXJhbSBzcGFyc2VJbmRpY2VzIEEgMC1ELCAxLUQsIG9yIDItRCBUZW5zb3Igb2YgdHlwZSBpbnQzMi5cbiAqIHNwYXJzZUluZGljZXNbaV0gY29udGFpbnMgdGhlIGNvbXBsZXRlIGluZGV4IHdoZXJlIHNwYXJzZVZhbHVlc1tpXSB3aWxsIGJlXG4gKiBwbGFjZWQuXG4gKiBAcGFyYW0gc3BhcnNlVmFsdWVzIEEgMC1EIG9yIDEtRCBUZW5zb3IuIFZhbHVlc1xuICogY29ycmVzcG9uZGluZyB0byBlYWNoIHJvdyBvZiBzcGFyc2VJbmRpY2VzLCBvciBhIHNjYWxhciB2YWx1ZSB0byBiZSB1c2VkIGZvclxuICogYWxsIHNwYXJzZSBpbmRpY2VzLlxuICogQHBhcmFtIG91dHB1dFNoYXBlIG51bWJlcltdLiBTaGFwZSBvZiB0aGUgZGVuc2Ugb3V0cHV0IHRlbnNvci5cbiAqIEBwYXJhbSB2YWxpZGF0ZUluZGljZXMgYm9vbGVhbi4gaW5kaWNlIHZhbGlkYXRpb24gaXMgbm90IHN1cHBvcnRlZCwgZXJyb3JcbiAqIHdpbGwgYmUgdGhyb3duIGlmIGl0IGlzIHNldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlSW5wdXQoc3BhcnNlSW5kaWNlcywgc3BhcnNlVmFsdWVzLCBvdXRwdXRTaGFwZSwgZGVmYXVsdFZhbHVlcykge1xuICAgIGlmIChzcGFyc2VJbmRpY2VzLmR0eXBlICE9PSAnaW50MzInKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGYuc3BhcnNlVG9EZW5zZSgpIGV4cGVjdHMgdGhlIGluZGljZXMgdG8gYmUgaW50MzIgdHlwZSwnICtcbiAgICAgICAgICAgIGAgYnV0IHRoZSBkdHlwZSB3YXMgJHtzcGFyc2VJbmRpY2VzLmR0eXBlfS5gKTtcbiAgICB9XG4gICAgaWYgKHNwYXJzZUluZGljZXMucmFuayA+IDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzcGFyc2VJbmRpY2VzIHNob3VsZCBiZSBhIHNjYWxhciwgdmVjdG9yLCBvciBtYXRyaXgsJyArXG4gICAgICAgICAgICBgIGJ1dCBnb3Qgc2hhcGUgJHtzcGFyc2VJbmRpY2VzLnNoYXBlfS5gKTtcbiAgICB9XG4gICAgY29uc3QgbnVtRWxlbXMgPSBzcGFyc2VJbmRpY2VzLnJhbmsgPiAwID8gc3BhcnNlSW5kaWNlcy5zaGFwZVswXSA6IDE7XG4gICAgY29uc3QgbnVtRGltcyA9IHNwYXJzZUluZGljZXMucmFuayA+IDEgPyBzcGFyc2VJbmRpY2VzLnNoYXBlWzFdIDogMTtcbiAgICBpZiAob3V0cHV0U2hhcGUubGVuZ3RoICE9PSBudW1EaW1zKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignb3V0cHV0U2hhcGUgaGFzIGluY29ycmVjdCBudW1iZXIgb2YgZWxlbWVudHM6LCcgK1xuICAgICAgICAgICAgYCAke291dHB1dFNoYXBlLmxlbmd0aH0sIHNob3VsZCBiZTogJHtudW1EaW1zfS5gKTtcbiAgICB9XG4gICAgY29uc3QgbnVtVmFsdWVzID0gc3BhcnNlVmFsdWVzLnNpemU7XG4gICAgaWYgKCEoc3BhcnNlVmFsdWVzLnJhbmsgPT09IDAgfHxcbiAgICAgICAgc3BhcnNlVmFsdWVzLnJhbmsgPT09IDEgJiYgbnVtVmFsdWVzID09PSBudW1FbGVtcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzcGFyc2VWYWx1ZXMgaGFzIGluY29ycmVjdCBzaGFwZSAnICtcbiAgICAgICAgICAgIGAke3NwYXJzZVZhbHVlcy5zaGFwZX0sIHNob3VsZCBiZSBbXSBvciBbJHtudW1FbGVtc31dYCk7XG4gICAgfVxuICAgIGlmIChzcGFyc2VWYWx1ZXMuZHR5cGUgIT09IGRlZmF1bHRWYWx1ZXMuZHR5cGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzcGFyc2VWYWx1ZXMuZHR5cGUgbXVzdCBtYXRjaCBkZWZhdWx0VmFsdWVzLmR0eXBlJyk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3BhcnNlX3RvX2RlbnNlX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IEZGVCB9IGZyb20gJy4uLy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbi8qKlxuICogRmFzdCBGb3VyaWVyIHRyYW5zZm9ybS5cbiAqXG4gKiBDb21wdXRlcyB0aGUgMS1kaW1lbnNpb25hbCBkaXNjcmV0ZSBGb3VyaWVyIHRyYW5zZm9ybSBvdmVyIHRoZSBpbm5lci1tb3N0XG4gKiBkaW1lbnNpb24gb2YgaW5wdXQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHJlYWwgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICogY29uc3QgaW1hZyA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKiBjb25zdCB4ID0gdGYuY29tcGxleChyZWFsLCBpbWFnKTtcbiAqXG4gKiB4LmZmdCgpLnByaW50KCk7ICAvLyB0Zi5zcGVjdHJhbC5mZnQoeCkucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIGlucHV0IFRoZSBjb21wbGV4IGlucHV0IHRvIGNvbXB1dGUgYW4gZmZ0IG92ZXIuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU3BlY3RyYWwnLCBuYW1lc3BhY2U6ICdzcGVjdHJhbCd9XG4gKi9cbmZ1bmN0aW9uIGZmdF8oaW5wdXQpIHtcbiAgICBhc3NlcnQoaW5wdXQuZHR5cGUgPT09ICdjb21wbGV4NjQnLCAoKSA9PiBgVGhlIGR0eXBlIGZvciB0Zi5zcGVjdHJhbC5mZnQoKSBtdXN0IGJlIGNvbXBsZXg2NCBgICtcbiAgICAgICAgYGJ1dCBnb3QgJHtpbnB1dC5kdHlwZX0uYCk7XG4gICAgY29uc3QgaW5wdXRzID0geyBpbnB1dCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEZGVCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBmZnQgPSBvcCh7IGZmdF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mZnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IElGRlQgfSBmcm9tICcuLi8uLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4uL29wZXJhdGlvbic7XG4vKipcbiAqIEludmVyc2UgZmFzdCBGb3VyaWVyIHRyYW5zZm9ybS5cbiAqXG4gKiBDb21wdXRlcyB0aGUgaW52ZXJzZSAxLWRpbWVuc2lvbmFsIGRpc2NyZXRlIEZvdXJpZXIgdHJhbnNmb3JtIG92ZXIgdGhlXG4gKiBpbm5lci1tb3N0IGRpbWVuc2lvbiBvZiBpbnB1dC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgcmVhbCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKiBjb25zdCBpbWFnID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqIGNvbnN0IHggPSB0Zi5jb21wbGV4KHJlYWwsIGltYWcpO1xuICpcbiAqIHguaWZmdCgpLnByaW50KCk7ICAvLyB0Zi5zcGVjdHJhbC5pZmZ0KHgpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSBpbnB1dCBUaGUgY29tcGxleCBpbnB1dCB0byBjb21wdXRlIGFuIGlmZnQgb3Zlci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTcGVjdHJhbCcsIG5hbWVzcGFjZTogJ3NwZWN0cmFsJ31cbiAqL1xuZnVuY3Rpb24gaWZmdF8oaW5wdXQpIHtcbiAgICBhc3NlcnQoaW5wdXQuZHR5cGUgPT09ICdjb21wbGV4NjQnLCAoKSA9PiBgVGhlIGR0eXBlIGZvciB0Zi5zcGVjdHJhbC5pZmZ0KCkgbXVzdCBiZSBjb21wbGV4NjQgYCArXG4gICAgICAgIGBidXQgZ290ICR7aW5wdXQuZHR5cGV9LmApO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgaW5wdXQgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChJRkZULCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGlmZnQgPSBvcCh7IGlmZnRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aWZmdC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjb21wbGV4IH0gZnJvbSAnLi4vY29tcGxleCc7XG5pbXBvcnQgeyBjb25jYXQgfSBmcm9tICcuLi9jb25jYXQnO1xuaW1wb3J0IHsgaW1hZyB9IGZyb20gJy4uL2ltYWcnO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi4vbXVsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlYWwgfSBmcm9tICcuLi9yZWFsJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuLi9yZXNoYXBlJztcbmltcG9ydCB7IHJldmVyc2UgfSBmcm9tICcuLi9yZXZlcnNlJztcbmltcG9ydCB7IHNjYWxhciB9IGZyb20gJy4uL3NjYWxhcic7XG5pbXBvcnQgeyBzbGljZSB9IGZyb20gJy4uL3NsaWNlJztcbmltcG9ydCB7IGlmZnQgfSBmcm9tICcuL2lmZnQnO1xuLyoqXG4gKiBJbnZlcnNlZCByZWFsIHZhbHVlIGlucHV0IGZhc3QgRm91cmllciB0cmFuc2Zvcm0uXG4gKlxuICogQ29tcHV0ZXMgdGhlIDEtZGltZW5zaW9uYWwgaW52ZXJzZWQgZGlzY3JldGUgRm91cmllciB0cmFuc2Zvcm0gb3ZlciB0aGVcbiAqIGlubmVyLW1vc3QgZGltZW5zaW9uIG9mIHRoZSByZWFsIGlucHV0LlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCByZWFsID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqIGNvbnN0IGltYWcgPSB0Zi50ZW5zb3IxZChbMCwgMCwgMF0pO1xuICogY29uc3QgeCA9IHRmLmNvbXBsZXgocmVhbCwgaW1hZyk7XG4gKlxuICogeC5pcmZmdCgpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSBpbnB1dCBUaGUgcmVhbCB2YWx1ZSBpbnB1dCB0byBjb21wdXRlIGFuIGlyZmZ0IG92ZXIuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU3BlY3RyYWwnLCBuYW1lc3BhY2U6ICdzcGVjdHJhbCd9XG4gKi9cbmZ1bmN0aW9uIGlyZmZ0XyhpbnB1dCkge1xuICAgIGNvbnN0IGlubmVyRGltZW5zaW9uU2l6ZSA9IGlucHV0LnNoYXBlW2lucHV0LnNoYXBlLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IGJhdGNoID0gaW5wdXQuc2l6ZSAvIGlubmVyRGltZW5zaW9uU2l6ZTtcbiAgICBsZXQgcmV0O1xuICAgIGlmIChpbm5lckRpbWVuc2lvblNpemUgPD0gMikge1xuICAgICAgICBjb25zdCBjb21wbGV4SW5wdXQgPSByZXNoYXBlKGlucHV0LCBbYmF0Y2gsIGlubmVyRGltZW5zaW9uU2l6ZV0pO1xuICAgICAgICByZXQgPSBpZmZ0KGNvbXBsZXhJbnB1dCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBUaGUgbGVuZ3RoIG9mIHVuaXF1ZSBjb21wb25lbnRzIG9mIHRoZSBERlQgb2YgYSByZWFsLXZhbHVlZCBzaWduYWxcbiAgICAgICAgLy8gaXMgMiAqIChpbnB1dF9sZW4gLSAxKVxuICAgICAgICBjb25zdCBvdXRwdXRTaGFwZSA9IFtiYXRjaCwgMiAqIChpbm5lckRpbWVuc2lvblNpemUgLSAxKV07XG4gICAgICAgIGNvbnN0IHJlYWxJbnB1dCA9IHJlc2hhcGUocmVhbChpbnB1dCksIFtiYXRjaCwgaW5uZXJEaW1lbnNpb25TaXplXSk7XG4gICAgICAgIGNvbnN0IGltYWdJbnB1dCA9IHJlc2hhcGUoaW1hZyhpbnB1dCksIFtiYXRjaCwgaW5uZXJEaW1lbnNpb25TaXplXSk7XG4gICAgICAgIGNvbnN0IHJlYWxDb25qdWdhdGUgPSByZXZlcnNlKHNsaWNlKHJlYWxJbnB1dCwgWzAsIDFdLCBbYmF0Y2gsIGlubmVyRGltZW5zaW9uU2l6ZSAtIDJdKSwgMSk7XG4gICAgICAgIGNvbnN0IGltYWdDb25qdWdhdGUgPSBtdWwocmV2ZXJzZShzbGljZShpbWFnSW5wdXQsIFswLCAxXSwgW2JhdGNoLCBpbm5lckRpbWVuc2lvblNpemUgLSAyXSksIDEpLCBzY2FsYXIoLTEpKTtcbiAgICAgICAgY29uc3QgciA9IGNvbmNhdChbcmVhbElucHV0LCByZWFsQ29uanVnYXRlXSwgMSk7XG4gICAgICAgIGNvbnN0IGkgPSBjb25jYXQoW2ltYWdJbnB1dCwgaW1hZ0Nvbmp1Z2F0ZV0sIDEpO1xuICAgICAgICBjb25zdCBjb21wbGV4SW5wdXQgPSByZXNoYXBlKGNvbXBsZXgociwgaSksIFtvdXRwdXRTaGFwZVswXSwgb3V0cHV0U2hhcGVbMV1dKTtcbiAgICAgICAgcmV0ID0gaWZmdChjb21wbGV4SW5wdXQpO1xuICAgIH1cbiAgICByZXQgPSByZWFsKHJldCk7XG4gICAgLy8gcmVzaGFwZSB0aGUgcmVzdWx0IGlmIHRoZSBpbnB1dCBpcyAzRCB0ZW5zb3IuXG4gICAgaWYgKGlucHV0LnJhbmsgPT09IDMgJiYgaW5wdXQuc2hhcGVbMF0gIT09IDApIHtcbiAgICAgICAgY29uc3QgdGVtcCA9IHJldDtcbiAgICAgICAgY29uc3QgYmF0Y2ggPSBpbnB1dC5zaGFwZVswXTtcbiAgICAgICAgcmV0ID0gcmVzaGFwZShyZXQsIFtiYXRjaCwgcmV0LnNoYXBlWzBdIC8gYmF0Y2gsIHJldC5zaGFwZVsxXV0pO1xuICAgICAgICB0ZW1wLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn1cbmV4cG9ydCBjb25zdCBpcmZmdCA9IG9wKHsgaXJmZnRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXJmZnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgeyBjb21wbGV4IH0gZnJvbSAnLi4vY29tcGxleCc7XG5pbXBvcnQgeyBjb25jYXQgfSBmcm9tICcuLi9jb25jYXQnO1xuaW1wb3J0IHsgaW1hZyB9IGZyb20gJy4uL2ltYWcnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVhbCB9IGZyb20gJy4uL3JlYWwnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4uL3Jlc2hhcGUnO1xuaW1wb3J0IHsgc2xpY2UgfSBmcm9tICcuLi9zbGljZSc7XG5pbXBvcnQgeyBzcGxpdCB9IGZyb20gJy4uL3NwbGl0JztcbmltcG9ydCB7IHplcm9zIH0gZnJvbSAnLi4vemVyb3MnO1xuaW1wb3J0IHsgemVyb3NMaWtlIH0gZnJvbSAnLi4vemVyb3NfbGlrZSc7XG5pbXBvcnQgeyBmZnQgfSBmcm9tICcuL2ZmdCc7XG4vKipcbiAqIFJlYWwgdmFsdWUgaW5wdXQgZmFzdCBGb3VyaWVyIHRyYW5zZm9ybS5cbiAqXG4gKiBDb21wdXRlcyB0aGUgMS1kaW1lbnNpb25hbCBkaXNjcmV0ZSBGb3VyaWVyIHRyYW5zZm9ybSBvdmVyIHRoZVxuICogaW5uZXItbW9zdCBkaW1lbnNpb24gb2YgdGhlIHJlYWwgaW5wdXQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHJlYWwgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICpcbiAqIHJlYWwucmZmdCgpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSBpbnB1dCBUaGUgcmVhbCB2YWx1ZSBpbnB1dCB0byBjb21wdXRlIGFuIHJmZnQgb3Zlci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTcGVjdHJhbCcsIG5hbWVzcGFjZTogJ3NwZWN0cmFsJ31cbiAqL1xuZnVuY3Rpb24gcmZmdF8oaW5wdXQsIGZmdExlbmd0aCkge1xuICAgIGFzc2VydChpbnB1dC5kdHlwZSA9PT0gJ2Zsb2F0MzInLCAoKSA9PiBgVGhlIGR0eXBlIGZvciByZmZ0KCkgbXVzdCBiZSByZWFsIHZhbHVlIGJ1dCBnb3QgJHtpbnB1dC5kdHlwZX1gKTtcbiAgICBsZXQgaW5uZXJEaW1lbnNpb25TaXplID0gaW5wdXQuc2hhcGVbaW5wdXQuc2hhcGUubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgYmF0Y2ggPSBpbnB1dC5zaXplIC8gaW5uZXJEaW1lbnNpb25TaXplO1xuICAgIGxldCBhZGp1c3RlZElucHV0O1xuICAgIGlmIChmZnRMZW5ndGggIT0gbnVsbCAmJiBmZnRMZW5ndGggPCBpbm5lckRpbWVuc2lvblNpemUpIHtcbiAgICAgICAgLy8gTmVlZCB0byBjcm9wXG4gICAgICAgIGNvbnN0IGJlZ2luID0gaW5wdXQuc2hhcGUubWFwKHYgPT4gMCk7XG4gICAgICAgIGNvbnN0IHNpemUgPSBpbnB1dC5zaGFwZS5tYXAodiA9PiB2KTtcbiAgICAgICAgc2l6ZVtpbnB1dC5zaGFwZS5sZW5ndGggLSAxXSA9IGZmdExlbmd0aDtcbiAgICAgICAgYWRqdXN0ZWRJbnB1dCA9IHNsaWNlKGlucHV0LCBiZWdpbiwgc2l6ZSk7XG4gICAgICAgIGlubmVyRGltZW5zaW9uU2l6ZSA9IGZmdExlbmd0aDtcbiAgICB9XG4gICAgZWxzZSBpZiAoZmZ0TGVuZ3RoICE9IG51bGwgJiYgZmZ0TGVuZ3RoID4gaW5uZXJEaW1lbnNpb25TaXplKSB7XG4gICAgICAgIC8vIE5lZWQgdG8gcGFkIHdpdGggemVyb3NcbiAgICAgICAgY29uc3QgemVyb3NTaGFwZSA9IGlucHV0LnNoYXBlLm1hcCh2ID0+IHYpO1xuICAgICAgICB6ZXJvc1NoYXBlW2lucHV0LnNoYXBlLmxlbmd0aCAtIDFdID0gZmZ0TGVuZ3RoIC0gaW5uZXJEaW1lbnNpb25TaXplO1xuICAgICAgICBhZGp1c3RlZElucHV0ID0gY29uY2F0KFtpbnB1dCwgemVyb3MoemVyb3NTaGFwZSldLCBpbnB1dC5zaGFwZS5sZW5ndGggLSAxKTtcbiAgICAgICAgaW5uZXJEaW1lbnNpb25TaXplID0gZmZ0TGVuZ3RoO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgYWRqdXN0ZWRJbnB1dCA9IGlucHV0O1xuICAgIH1cbiAgICAvLyBDb21wbGVtZW50IHRoZSBpbnB1dCB3aXRoIHplcm8gaW1hZ2luYXJ5IG51bWJlcnMuXG4gICAgY29uc3QgemVyb3NJbnB1dCA9IHplcm9zTGlrZShhZGp1c3RlZElucHV0KTtcbiAgICBjb25zdCBjb21wbGV4SW5wdXQgPSByZXNoYXBlKGNvbXBsZXgoYWRqdXN0ZWRJbnB1dCwgemVyb3NJbnB1dCksIFtiYXRjaCwgaW5uZXJEaW1lbnNpb25TaXplXSk7XG4gICAgY29uc3QgcmV0ID0gZmZ0KGNvbXBsZXhJbnB1dCk7XG4gICAgLy8gRXhjbHVkZSBjb21wbGV4IGNvbmp1Z2F0aW9ucy4gVGhlc2UgY29uanVnYXRpb25zIGFyZSBwdXQgc3ltbWV0cmljYWxseS5cbiAgICBjb25zdCBoYWxmID0gTWF0aC5mbG9vcihpbm5lckRpbWVuc2lvblNpemUgLyAyKSArIDE7XG4gICAgY29uc3QgcmVhbFZhbHVlcyA9IHJlYWwocmV0KTtcbiAgICBjb25zdCBpbWFnVmFsdWVzID0gaW1hZyhyZXQpO1xuICAgIGNvbnN0IHJlYWxDb21wbGV4Q29uanVnYXRlID0gc3BsaXQocmVhbFZhbHVlcywgW2hhbGYsIGlubmVyRGltZW5zaW9uU2l6ZSAtIGhhbGZdLCByZWFsVmFsdWVzLnNoYXBlLmxlbmd0aCAtIDEpO1xuICAgIGNvbnN0IGltYWdDb21wbGV4Q29uanVnYXRlID0gc3BsaXQoaW1hZ1ZhbHVlcywgW2hhbGYsIGlubmVyRGltZW5zaW9uU2l6ZSAtIGhhbGZdLCBpbWFnVmFsdWVzLnNoYXBlLmxlbmd0aCAtIDEpO1xuICAgIGNvbnN0IG91dHB1dFNoYXBlID0gYWRqdXN0ZWRJbnB1dC5zaGFwZS5zbGljZSgpO1xuICAgIG91dHB1dFNoYXBlW2FkanVzdGVkSW5wdXQuc2hhcGUubGVuZ3RoIC0gMV0gPSBoYWxmO1xuICAgIHJldHVybiByZXNoYXBlKGNvbXBsZXgocmVhbENvbXBsZXhDb25qdWdhdGVbMF0sIGltYWdDb21wbGV4Q29uanVnYXRlWzBdKSwgb3V0cHV0U2hhcGUpO1xufVxuZXhwb3J0IGNvbnN0IHJmZnQgPSBvcCh7IHJmZnRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmZmdC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgU3BsaXRWIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogU3BsaXRzIGEgYHRmLlRlbnNvcmAgaW50byBzdWIgdGVuc29ycy5cbiAqXG4gKiBJZiBgbnVtT3JTaXplU3BsaXRzYCBpcyBhIG51bWJlciwgc3BsaXRzIGB4YCBhbG9uZyBkaW1lbnNpb24gYGF4aXNgXG4gKiBpbnRvIGBudW1PclNpemVTcGxpdHNgIHNtYWxsZXIgdGVuc29ycy5cbiAqIFJlcXVpcmVzIHRoYXQgYG51bU9yU2l6ZVNwbGl0c2AgZXZlbmx5IGRpdmlkZXMgYHguc2hhcGVbYXhpc11gLlxuICpcbiAqIElmIGBudW1PclNpemVTcGxpdHNgIGlzIGEgbnVtYmVyIGFycmF5LCBzcGxpdHMgYHhgIGludG9cbiAqIGBudW1PclNpemVTcGxpdHMubGVuZ3RoYCBwaWVjZXMuIFRoZSBzaGFwZSBvZiB0aGUgYGlgLXRoIHBpZWNlIGhhcyB0aGVcbiAqIHNhbWUgc2l6ZSBhcyBgeGAgZXhjZXB0IGFsb25nIGRpbWVuc2lvbiBgYXhpc2Agd2hlcmUgdGhlIHNpemUgaXNcbiAqIGBudW1PclNpemVTcGxpdHNbaV1gLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDhdLCBbMiwgNF0pO1xuICogY29uc3QgW2EsIGJdID0gdGYuc3BsaXQoeCwgMiwgMSk7XG4gKiBhLnByaW50KCk7XG4gKiBiLnByaW50KCk7XG4gKlxuICogY29uc3QgW2MsIGQsIGVdID0gdGYuc3BsaXQoeCwgWzEsIDIsIDFdLCAxKTtcbiAqIGMucHJpbnQoKTtcbiAqIGQucHJpbnQoKTtcbiAqIGUucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IgdG8gc3BsaXQuXG4gKiBAcGFyYW0gbnVtT3JTaXplU3BsaXRzIEVpdGhlciBhbiBpbnRlZ2VyIGluZGljYXRpbmcgdGhlIG51bWJlciBvZlxuICogc3BsaXRzIGFsb25nIHRoZSBheGlzIG9yIGFuIGFycmF5IG9mIGludGVnZXJzIGNvbnRhaW5pbmcgdGhlIHNpemVzIG9mXG4gKiBlYWNoIG91dHB1dCB0ZW5zb3IgYWxvbmcgdGhlIGF4aXMuIElmIGEgbnVtYmVyIHRoZW4gaXQgbXVzdCBldmVubHkgZGl2aWRlXG4gKiBgeC5zaGFwZVtheGlzXWA7IG90aGVyd2lzZSB0aGUgc3VtIG9mIHNpemVzIG11c3QgbWF0Y2ggYHguc2hhcGVbYXhpc11gLlxuICogQ2FuIGNvbnRhaW4gb25lIC0xIGluZGljYXRpbmcgdGhhdCBkaW1lbnNpb24gaXMgdG8gYmUgaW5mZXJyZWQuXG4gKiBAcGFyYW0gYXhpcyBUaGUgZGltZW5zaW9uIGFsb25nIHdoaWNoIHRvIHNwbGl0LiBEZWZhdWx0cyB0byAwICh0aGUgZmlyc3RcbiAqIGRpbSkuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnU2xpY2luZyBhbmQgSm9pbmluZyd9XG4gKi9cbmZ1bmN0aW9uIHNwbGl0Xyh4LCBudW1PclNpemVTcGxpdHMsIGF4aXMgPSAwKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc3BsaXQnKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgY29uc3QgYXR0ciA9IHsgbnVtT3JTaXplU3BsaXRzLCBheGlzIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoU3BsaXRWLCBpbnB1dHMsIGF0dHIpO1xufVxuZXhwb3J0IGNvbnN0IHNwbGl0ID0gb3AoeyBzcGxpdF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zcGxpdC5qcy5tYXAiLCJpbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsJztcbi8qKlxuICogUHJlcGFyZSB0aGUgc3BsaXQgc2l6ZSBhcnJheS4gV2hlbiB0aGUgaW5wdXQgaXMgYSBudW1iZXIsIHRoZSBheGlzIGlzIGV2ZW5seVxuICogZGl2aWRlZCBhbW9uZyB0aGUgc3BsaXQgc2l6ZS4gV2hlbiB0aGUgaW5wdXQgY29udGFpbnMgdGhlIG5lZ2F0aXZlIHZhbHVlLCB0aGVcbiAqIHJlc3Qgb2YgdGhlIGF4aXMgaXMgYWxsb2NhdGVkIHRvd2FyZCB0aGF0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZVNwbGl0U2l6ZSh4LCBudW1PclNpemVTcGxpdHMsIGF4aXMgPSAwKSB7XG4gICAgbGV0IHNwbGl0U2l6ZXMgPSBbXTtcbiAgICBpZiAodHlwZW9mIChudW1PclNpemVTcGxpdHMpID09PSAnbnVtYmVyJykge1xuICAgICAgICBhc3NlcnQoeC5zaGFwZVtheGlzXSAlIG51bU9yU2l6ZVNwbGl0cyA9PT0gMCwgKCkgPT4gJ051bWJlciBvZiBzcGxpdHMgbXVzdCBldmVubHkgZGl2aWRlIHRoZSBheGlzLicpO1xuICAgICAgICBzcGxpdFNpemVzID1cbiAgICAgICAgICAgIG5ldyBBcnJheShudW1PclNpemVTcGxpdHMpLmZpbGwoeC5zaGFwZVtheGlzXSAvIG51bU9yU2l6ZVNwbGl0cyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBudW1PZk5lZ3MgPSBudW1PclNpemVTcGxpdHMucmVkdWNlKChjb3VudCwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjb3VudCArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvdW50O1xuICAgICAgICB9LCAwKTtcbiAgICAgICAgYXNzZXJ0KG51bU9mTmVncyA8PSAxLCAoKSA9PiAnVGhlcmUgc2hvdWxkIGJlIG9ubHkgb25lIG5lZ2F0aXZlIHZhbHVlIGluIHNwbGl0IGFycmF5LicpO1xuICAgICAgICBjb25zdCBuZWdJbmRleCA9IG51bU9yU2l6ZVNwbGl0cy5pbmRleE9mKC0xKTtcbiAgICAgICAgLy8gQWxsb3cgdGhlIG51bWJlciBvZiBzcGxpdCBhcnJheSB0byBiZSAtMSwgd2hpY2ggaW5kaWNhdGVzIHRoZSByZXN0XG4gICAgICAgIC8vIG9mIGRpbWVuc2lvbiBpcyBhbGxvY2F0ZWQgdG8gdGhhdCBzcGxpdC5cbiAgICAgICAgaWYgKG5lZ0luZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgY29uc3QgdG90YWwgPSBudW1PclNpemVTcGxpdHMucmVkdWNlKChhLCBiKSA9PiBiID4gMCA/IGEgKyBiIDogYSk7XG4gICAgICAgICAgICBudW1PclNpemVTcGxpdHNbbmVnSW5kZXhdID0geC5zaGFwZVtheGlzXSAtIHRvdGFsO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydCh4LnNoYXBlW2F4aXNdID09PSBudW1PclNpemVTcGxpdHMucmVkdWNlKChhLCBiKSA9PiBhICsgYiksICgpID0+ICdUaGUgc3VtIG9mIHNpemVzIG11c3QgbWF0Y2ggdGhlIHNpemUgb2YgdGhlIGF4aXMgZGltZW5zaW9uLicpO1xuICAgICAgICBzcGxpdFNpemVzID0gbnVtT3JTaXplU3BsaXRzO1xuICAgIH1cbiAgICByZXR1cm4gc3BsaXRTaXplcztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNwbGl0X3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFNxcnQgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBzcXVhcmUgcm9vdCBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOiBgeSA9IHNxcnQoeClgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgNCwgLTFdKTtcbiAqXG4gKiB4LnNxcnQoKS5wcmludCgpOyAgLy8gb3IgdGYuc3FydCh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBzcXJ0Xyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc3FydCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChTcXJ0LCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IHNxcnQgPSBvcCh7IHNxcnRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3FydC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBzcXVhcmUgb2YgYHhgIGVsZW1lbnQtd2lzZTogYHggXiAyYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIE1hdGguc3FydCgyKSwgLTFdKTtcbiAqXG4gKiB4LnNxdWFyZSgpLnByaW50KCk7ICAvLyBvciB0Zi5zcXVhcmUoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IFRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gc3F1YXJlXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc3F1YXJlJyk7XG4gICAgY29uc3QgYXR0cnMgPSB7fTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbCgnU3F1YXJlJywgeyB4OiAkeCB9LCBhdHRycyk7XG59XG5leHBvcnQgY29uc3Qgc3F1YXJlID0gb3AoeyBzcXVhcmVfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3F1YXJlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBTcXVhcmVkRGlmZmVyZW5jZSB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBtYWtlVHlwZXNNYXRjaCB9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSB9IGZyb20gJy4vYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIFJldHVybnMgKGEgLSBiKSAqIChhIC0gYikgZWxlbWVudC13aXNlLlxuICogU3VwcG9ydHMgYnJvYWRjYXN0aW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDQsIDMsIDE2XSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzEsIDIsIDksIDRdKTtcbiAqXG4gKiBhLnNxdWFyZWREaWZmZXJlbmNlKGIpLnByaW50KCk7ICAvLyBvciB0Zi5zcXVhcmVkRGlmZmVyZW5jZShhLCBiKVxuICogYGBgXG4gKlxuICogYGBganNcbiAqIC8vIEJyb2FkY2FzdCBzcXVhcmVkIGRpZmZlcmVuY2UgIGEgd2l0aCBiLlxuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsyLCA0LCA2LCA4XSk7XG4gKiBjb25zdCBiID0gdGYuc2NhbGFyKDUpO1xuICpcbiAqIGEuc3F1YXJlZERpZmZlcmVuY2UoYikucHJpbnQoKTsgIC8vIG9yIHRmLnNxdWFyZWREaWZmZXJlbmNlKGEsIGIpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYSBUaGUgZmlyc3QgdGVuc29yLlxuICogQHBhcmFtIGIgVGhlIHNlY29uZCB0ZW5zb3IuIE11c3QgaGF2ZSB0aGUgc2FtZSB0eXBlIGFzIGBhYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdBcml0aG1ldGljJ31cbiAqL1xuZnVuY3Rpb24gc3F1YXJlZERpZmZlcmVuY2VfKGEsIGIpIHtcbiAgICBsZXQgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnc3F1YXJlZERpZmZlcmVuY2UnKTtcbiAgICBsZXQgJGIgPSBjb252ZXJ0VG9UZW5zb3IoYiwgJ2InLCAnc3F1YXJlZERpZmZlcmVuY2UnKTtcbiAgICBbJGEsICRiXSA9IG1ha2VUeXBlc01hdGNoKCRhLCAkYik7XG4gICAgYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoJGEuc2hhcGUsICRiLnNoYXBlKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGE6ICRhLCBiOiAkYiB9O1xuICAgIGNvbnN0IGF0dHJzID0ge307XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoU3F1YXJlZERpZmZlcmVuY2UsIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IHNxdWFyZWREaWZmZXJlbmNlID0gb3AoeyBzcXVhcmVkRGlmZmVyZW5jZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zcXVhcmVkX2RpZmZlcmVuY2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IHNxdWVlemVTaGFwZSB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbi8qKlxuICogUmVtb3ZlcyBkaW1lbnNpb25zIG9mIHNpemUgMSBmcm9tIHRoZSBzaGFwZSBvZiBhIGB0Zi5UZW5zb3JgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yKFsxLCAyLCAzLCA0XSwgWzEsIDEsIDRdKTtcbiAqIHguc3F1ZWV6ZSgpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yIHRvIGJlIHNxdWVlemVkLlxuICogQHBhcmFtIGF4aXMgQW4gb3B0aW9uYWwgbGlzdCBvZiBudW1iZXJzLiBJZiBzcGVjaWZpZWQsIG9ubHlcbiAqICAgICBzcXVlZXplcyB0aGUgZGltZW5zaW9ucyBsaXN0ZWQuIFRoZSBkaW1lbnNpb24gaW5kZXggc3RhcnRzIGF0IDAuIEl0XG4gKiBpcyBhbiBlcnJvciB0byBzcXVlZXplIGEgZGltZW5zaW9uIHRoYXQgaXMgbm90IDEuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnVHJhbnNmb3JtYXRpb25zJ31cbiAqL1xuZnVuY3Rpb24gc3F1ZWV6ZV8oeCwgYXhpcykge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3NxdWVlemUnKTtcbiAgICByZXR1cm4gcmVzaGFwZSgkeCwgc3F1ZWV6ZVNoYXBlKCR4LnNoYXBlLCBheGlzKS5uZXdTaGFwZSk7XG59XG5leHBvcnQgY29uc3Qgc3F1ZWV6ZSA9IG9wKHsgc3F1ZWV6ZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zcXVlZXplLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBQYWNrIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvckFycmF5IH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogU3RhY2tzIGEgbGlzdCBvZiByYW5rLWBSYCBgdGYuVGVuc29yYHMgaW50byBvbmUgcmFuay1gKFIrMSlgIGB0Zi5UZW5zb3JgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDJdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbMywgNF0pO1xuICogY29uc3QgYyA9IHRmLnRlbnNvcjFkKFs1LCA2XSk7XG4gKiB0Zi5zdGFjayhbYSwgYiwgY10pLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdGVuc29ycyBBIGxpc3Qgb2YgdGVuc29yIG9iamVjdHMgd2l0aCB0aGUgc2FtZSBzaGFwZSBhbmQgZHR5cGUuXG4gKiBAcGFyYW0gYXhpcyBUaGUgYXhpcyB0byBzdGFjayBhbG9uZy4gRGVmYXVsdHMgdG8gMCAodGhlIGZpcnN0IGRpbSkuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnU2xpY2luZyBhbmQgSm9pbmluZyd9XG4gKi9cbmZ1bmN0aW9uIHN0YWNrXyh0ZW5zb3JzLCBheGlzID0gMCkge1xuICAgIGNvbnN0ICR0ZW5zb3JzID0gY29udmVydFRvVGVuc29yQXJyYXkodGVuc29ycywgJ3RlbnNvcnMnLCAnc3RhY2snLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgICB1dGlsLmFzc2VydCgkdGVuc29ycy5sZW5ndGggPj0gMSwgKCkgPT4gJ1Bhc3MgYXQgbGVhc3Qgb25lIHRlbnNvciB0byB0Zi5zdGFjaycpO1xuICAgIGlmICgkdGVuc29ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KGF4aXMgPD0gJHRlbnNvcnNbMF0ucmFuaywgKCkgPT4gJ0F4aXMgbXVzdCBiZSA8PSByYW5rIG9mIHRoZSB0ZW5zb3InKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0gJHRlbnNvcnM7XG4gICAgY29uc3QgYXR0cnMgPSB7IGF4aXMgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChQYWNrLCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBzdGFjayA9IG9wKHsgc3RhY2tfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RhY2suanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFN0ZXAgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBzdGVwIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6IGB4ID4gMCA/IDEgOiBhbHBoYSAqIHhgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMCwgMiwgLTEsIC0zXSk7XG4gKlxuICogeC5zdGVwKC41KS5wcmludCgpOyAgLy8gb3IgdGYuc3RlcCh4LCAuNSlcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBhbHBoYSBUaGUgZ3JhZGllbnQgd2hlbiBpbnB1dCBpcyBuZWdhdGl2ZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gc3RlcF8oeCwgYWxwaGEgPSAwLjApIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzdGVwJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBhbHBoYSB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFN0ZXAsIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IHN0ZXAgPSBvcCh7IHN0ZXBfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RlcC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgU3RyaWRlZFNsaWNlIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogRXh0cmFjdHMgYSBzdHJpZGVkIHNsaWNlIG9mIGEgdGVuc29yLlxuICpcbiAqIFJvdWdobHkgc3BlYWtpbmcsIHRoaXMgb3AgZXh0cmFjdHMgYSBzbGljZSBvZiBzaXplIChlbmQtYmVnaW4pL3N0cmlkZSBmcm9tXG4gKiB0aGUgZ2l2ZW4gaW5wdXQgdGVuc29yICh4KS4gU3RhcnRpbmcgYXQgdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBieSBiZWdpbiB0aGVcbiAqIHNsaWNlIGNvbnRpbnVlcyBieSBhZGRpbmcgc3RyaWRlIHRvIHRoZSBpbmRleCB1bnRpbCBhbGwgZGltZW5zaW9ucyBhcmUgbm90XG4gKiBsZXNzIHRoYW4gZW5kLiBOb3RlIHRoYXQgYSBzdHJpZGUgY2FuIGJlIG5lZ2F0aXZlLCB3aGljaCBjYXVzZXMgYSByZXZlcnNlXG4gKiBzbGljZS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgdCA9IHRmLnRlbnNvcjNkKFsxLCAxLCAxICwyLCAyLCAyLCAzLCAzLCAzLCA0LCA0LCA0LCA1LCA1LCA1LCA2LCA2LCA2XSxcbiAqICAgIFszLCAyLCAzXSk7XG4gKiB0LnN0cmlkZWRTbGljZShbMSwgMCwgMF0sIFsyLCAxLCAzXSwgWzEsIDEsIDFdKS5wcmludCgpICAvLyBbW1szLCAzLCAzXV1dXG4gKiB0LnN0cmlkZWRTbGljZShbMSwgMCwgMF0sIFsyLCAyLCAzXSwgWzEsIDEsIDFdKS5wcmludCgpICAvLyBbW1szLCAzLCAzXSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBbNCwgNCwgNF1dXVxuICogdC5zdHJpZGVkU2xpY2UoWzEsIC0xLCAwXSwgWzIsIC0zLCAzXSwgWzEsIC0xLCAxXSkucHJpbnQoKSAvLyBbW1s0LCA0LCA0XSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBbMywgMywgM11dXVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIHRlbnNvciB0byBzdHJpZGUgc2xpY2UuXG4gKiBAcGFyYW0gYmVnaW4gVGhlIGNvb3JkaW5hdGVzIHRvIHN0YXJ0IHRoZSBzbGljZSBmcm9tLlxuICogQHBhcmFtIGVuZDogVGhlIGNvb3JkaW5hdGVzIHRvIGVuZCB0aGUgc2xpY2UgYXQuXG4gKiBAcGFyYW0gc3RyaWRlczogVGhlIHNpemUgb2YgdGhlIHNsaWNlLlxuICogQHBhcmFtIGJlZ2luTWFzazogSWYgdGhlIGl0aCBiaXQgb2YgYmVnaW5NYXNrIGlzIHNldCwgYmVnaW5baV0gaXMgaWdub3JlZFxuICogICAgICBhbmQgdGhlIGZ1bGxlc3QgcG9zc2libGUgcmFuZ2UgaW4gdGhhdCBkaW1lbnNpb24gaXMgdXNlZCBpbnN0ZWFkLlxuICogQHBhcmFtIGVuZE1hc2s6IElmIHRoZSBpdGggYml0IG9mIGVuZE1hc2sgaXMgc2V0LCBlbmRbaV0gaXMgaWdub3JlZFxuICogICAgICBhbmQgdGhlIGZ1bGxlc3QgcG9zc2libGUgcmFuZ2UgaW4gdGhhdCBkaW1lbnNpb24gaXMgdXNlZCBpbnN0ZWFkLlxuICogQHBhcmFtIHNocmlua0F4aXNNYXNrOiBhIGJpdG1hc2sgd2hlcmUgYml0IGkgaW1wbGllcyB0aGF0XG4gKiB0aGUgaXRoIHNwZWNpZmljYXRpb24gc2hvdWxkIHNocmluayB0aGUgZGltZW5zaW9uYWxpdHkuIGJlZ2luIGFuZCBlbmQgbXVzdFxuICogaW1wbHkgYSBzbGljZSBvZiBzaXplIDEgaW4gdGhlIGRpbWVuc2lvbi5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTbGljaW5nIGFuZCBKb2luaW5nJ31cbiAqL1xuZnVuY3Rpb24gc3RyaWRlZFNsaWNlXyh4LCBiZWdpbiwgZW5kLCBzdHJpZGVzLCBiZWdpbk1hc2sgPSAwLCBlbmRNYXNrID0gMCwgZWxsaXBzaXNNYXNrID0gMCwgbmV3QXhpc01hc2sgPSAwLCBzaHJpbmtBeGlzTWFzayA9IDApIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzdHJpZGVkU2xpY2UnLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgY29uc3QgYXR0cnMgPSB7XG4gICAgICAgIGJlZ2luLFxuICAgICAgICBlbmQsXG4gICAgICAgIHN0cmlkZXMsXG4gICAgICAgIGJlZ2luTWFzayxcbiAgICAgICAgZW5kTWFzayxcbiAgICAgICAgZWxsaXBzaXNNYXNrLFxuICAgICAgICBuZXdBeGlzTWFzayxcbiAgICAgICAgc2hyaW5rQXhpc01hc2tcbiAgICB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFN0cmlkZWRTbGljZSwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3Qgc3RyaWRlZFNsaWNlID0gb3AoeyBzdHJpZGVkU2xpY2VfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RyaWRlZF9zbGljZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgU3RyaW5nTkdyYW1zIH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4uL29wZXJhdGlvbic7XG4vKipcbiAqIENyZWF0ZXMgbmdyYW1zIGZyb20gcmFnZ2VkIHN0cmluZyBkYXRhLlxuICpcbiAqIFRoaXMgb3AgYWNjZXB0cyBhIHJhZ2dlZCB0ZW5zb3Igd2l0aCAxIHJhZ2dlZCBkaW1lbnNpb24gY29udGFpbmluZyBvbmx5XG4gKiBzdHJpbmdzIGFuZCBvdXRwdXRzIGEgcmFnZ2VkIHRlbnNvciB3aXRoIDEgcmFnZ2VkIGRpbWVuc2lvbiBjb250YWluaW5nIG5ncmFtc1xuICogb2YgdGhhdCBzdHJpbmcsIGpvaW5lZCBhbG9uZyB0aGUgaW5uZXJtb3N0IGF4aXMuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHJlc3VsdCA9IHRmLnN0cmluZy5zdHJpbmdOR3JhbXMoXG4gKiAgIFsnYScsICdiJywgJ2MnLCAnZCddLCB0Zi50ZW5zb3IxZChbMCwgMiwgNF0sICdpbnQzMicpLFxuICogICAnfCcsIFsxLCAyXSwgJ0xQJywgJ1JQJywgLTEsIGZhbHNlKTtcbiAqIHJlc3VsdFsnbkdyYW1zJ10ucHJpbnQoKTsgLy8gWydhJywgJ2InLCAnTFB8YScsICdhfGInLCAnYnxSUCcsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAnYycsICdkJywgJ0xQfGMnLCAnY3xkJywgJ2R8UlAnXVxuICogcmVzdWx0WyduR3JhbXNTcGxpdHMnXS5wcmludCgpOyAvLyBbMCwgNSwgMTBdXG4gKiBgYGBcbiAqIEBwYXJhbSBkYXRhOiBUaGUgdmFsdWVzIHRlbnNvciBvZiB0aGUgcmFnZ2VkIHN0cmluZyB0ZW5zb3IgdG8gbWFrZSBuZ3JhbXMgb3V0XG4gKiAgICAgb2YuIE11c3QgYmUgYSAxRCBzdHJpbmcgdGVuc29yLlxuICogQHBhcmFtIGRhdGFTcGxpdHM6IFRoZSBzcGxpdHMgdGVuc29yIG9mIHRoZSByYWdnZWQgc3RyaW5nIHRlbnNvciB0byBtYWtlXG4gKiAgICAgbmdyYW1zIG91dCBvZi5cbiAqIEBwYXJhbSBzZXBhcmF0b3I6IFRoZSBzdHJpbmcgdG8gYXBwZW5kIGJldHdlZW4gZWxlbWVudHMgb2YgdGhlIHRva2VuLiBVc2UgXCJcIlxuICogICAgIGZvciBubyBzZXBhcmF0b3IuXG4gKiBAcGFyYW0gbkdyYW1XaWR0aHM6IFRoZSBzaXplcyBvZiB0aGUgbmdyYW1zIHRvIGNyZWF0ZS5cbiAqIEBwYXJhbSBsZWZ0UGFkOiBUaGUgc3RyaW5nIHRvIHVzZSB0byBwYWQgdGhlIGxlZnQgc2lkZSBvZiB0aGUgbmdyYW0gc2VxdWVuY2UuXG4gKiAgICAgT25seSB1c2VkIGlmIHBhZF93aWR0aCAhPT0gMC5cbiAqIEBwYXJhbSByaWdodFBhZDogVGhlIHN0cmluZyB0byB1c2UgdG8gcGFkIHRoZSByaWdodCBzaWRlIG9mIHRoZSBuZ3JhbVxuICogICAgIHNlcXVlbmNlLiBPbmx5IHVzZWQgaWYgcGFkX3dpZHRoICE9PSAwLlxuICogQHBhcmFtIHBhZFdpZHRoOiBUaGUgbnVtYmVyIG9mIHBhZGRpbmcgZWxlbWVudHMgdG8gYWRkIHRvIGVhY2ggc2lkZSBvZiBlYWNoXG4gKiAgICAgc2VxdWVuY2UuIE5vdGUgdGhhdCBwYWRkaW5nIHdpbGwgbmV2ZXIgYmUgZ3JlYXRlciB0aGFuIGBuR3JhbVdpZHRoc2AtMVxuICogICAgIHJlZ2FyZGxlc3Mgb2YgdGhpcyB2YWx1ZS4gSWYgYHBhZFdpZHRoYD0tMSAsIHRoZW4gYWRkIG1heChgbkdyYW1XaWR0aHMpLTFcbiAqICAgICBlbGVtZW50cy5cbiAqIEBwYXJhbSBwcmVzZXJ2ZVNob3J0U2VxdWVuY2VzOiBJZiB0cnVlLCB0aGVuIGVuc3VyZSB0aGF0IGF0IGxlYXN0IG9uZSBuZ3JhbVxuICogICAgIGlzIGdlbmVyYXRlZCBmb3IgZWFjaCBpbnB1dCBzZXF1ZW5jZS4gSW4gcGFydGljdWxhciwgaWYgYW4gaW5wdXQgc2VxdWVuY2VcbiAqICAgICBpcyBzaG9ydGVyIHRoYW4gbWluKG5ncmFtV2lkdGgpICsgMipwYWRXaWR0aCwgdGhlbiBnZW5lcmF0ZSBhIHNpbmdsZVxuICogICAgIG5ncmFtIGNvbnRhaW5pbmcgdGhlIGVudGlyZSBzZXF1ZW5jZS4gSWYgZmFsc2UsIHRoZW4gbm8gbmdyYW1zIGFyZVxuICogICAgIGdlbmVyYXRlZCBmb3IgdGhlc2Ugc2hvcnQgaW5wdXQgc2VxdWVuY2VzLlxuICogQHJldHVybiBBIG1hcCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqICAgICAtIG5HcmFtczogVGhlIHZhbHVlcyB0ZW5zb3Igb2YgdGhlIG91dHB1dCBuZ3JhbXMgcmFnZ2VkIHRlbnNvci5cbiAqICAgICAtIG5HcmFtc1NwbGl0czogVGhlIHNwbGl0cyB0ZW5zb3Igb2YgdGhlIG91dHB1dCBuZ3JhbXMgcmFnZ2VkIHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTdHJpbmcnfVxuICovXG5mdW5jdGlvbiBzdHJpbmdOR3JhbXNfKGRhdGEsIGRhdGFTcGxpdHMsIHNlcGFyYXRvciwgbkdyYW1XaWR0aHMsIGxlZnRQYWQsIHJpZ2h0UGFkLCBwYWRXaWR0aCwgcHJlc2VydmVTaG9ydFNlcXVlbmNlcykge1xuICAgIGNvbnN0ICRkYXRhID0gY29udmVydFRvVGVuc29yKGRhdGEsICdkYXRhJywgJ3N0cmluZ05HcmFtcycsICdzdHJpbmcnKTtcbiAgICBpZiAoJGRhdGEuZHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRGF0YSBtdXN0IGJlIG9mIGRhdGF0eXBlIHN0cmluZycpO1xuICAgIH1cbiAgICBpZiAoJGRhdGEuc2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRGF0YSBtdXN0IGJlIGEgdmVjdG9yLCBzYXc6ICR7JGRhdGEuc2hhcGV9YCk7XG4gICAgfVxuICAgIGNvbnN0ICRkYXRhU3BsaXRzID0gY29udmVydFRvVGVuc29yKGRhdGFTcGxpdHMsICdkYXRhU3BsaXRzJywgJ3N0cmluZ05HcmFtcycpO1xuICAgIGlmICgkZGF0YVNwbGl0cy5kdHlwZSAhPT0gJ2ludDMyJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RhdGEgc3BsaXRzIG11c3QgYmUgb2YgZGF0YXR5cGUgaW50MzInKTtcbiAgICB9XG4gICAgY29uc3QgYXR0cnMgPSB7XG4gICAgICAgIHNlcGFyYXRvcixcbiAgICAgICAgbkdyYW1XaWR0aHMsXG4gICAgICAgIGxlZnRQYWQsXG4gICAgICAgIHJpZ2h0UGFkLFxuICAgICAgICBwYWRXaWR0aCxcbiAgICAgICAgcHJlc2VydmVTaG9ydFNlcXVlbmNlc1xuICAgIH07XG4gICAgY29uc3QgaW5wdXRzID0geyBkYXRhOiAkZGF0YSwgZGF0YVNwbGl0czogJGRhdGFTcGxpdHMgfTtcbiAgICBjb25zdCByZXN1bHQgPSBFTkdJTkUucnVuS2VybmVsKFN0cmluZ05HcmFtcywgaW5wdXRzLCBhdHRycyk7XG4gICAgcmV0dXJuIHsgbkdyYW1zOiByZXN1bHRbMF0sIG5HcmFtc1NwbGl0czogcmVzdWx0WzFdIH07XG59XG5leHBvcnQgY29uc3Qgc3RyaW5nTkdyYW1zID0gb3AoeyBzdHJpbmdOR3JhbXNfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RyaW5nX25fZ3JhbXMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IFN0cmluZ1NwbGl0IH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4uL29wZXJhdGlvbic7XG4vKipcbiAqIFNwbGl0IGVsZW1lbnRzIG9mIGBpbnB1dGAgYmFzZWQgb24gYGRlbGltaXRlcmAgaW50byBhIFNwYXJzZVRlbnNvciAuXG4gKlxuICogTGV0IE4gYmUgdGhlIHNpemUgb2Ygc291cmNlICh0eXBpY2FsbHkgTiB3aWxsIGJlIHRoZSBiYXRjaCBzaXplKS4gU3BsaXQgZWFjaFxuICogZWxlbWVudCBvZiBgaW5wdXRgIGJhc2VkIG9uIGBkZWxpbWl0ZXJgIGFuZCByZXR1cm4gYSBTcGFyc2VUZW5zb3IgY29udGFpbmluZ1xuICogdGhlIHNwbGl0dGVkIHRva2Vucy4gRW1wdHkgdG9rZW5zIGFyZSBpZ25vcmVkIGlmIGBza2lwRW1wdHlgIGlzIHNldCB0byBUcnVlLlxuICpcbiAqIGBkZWxpbWl0ZXJgIGNhbiBiZSBlbXB0eSwgb3IgYSBzdHJpbmcgb2Ygc3BsaXQgY2hhcmFjdGVycy4gSWYgYGRlbGltaXRlcmAgaXNcbiAqIGFuIGVtcHR5IHN0cmluZywgZWFjaCBlbGVtZW50IG9mIGBpbnB1dGAgaXMgc3BsaXQgaW50byBpbmRpdmlkdWFsXG4gKiBjaGFyYWN0ZXIgc3RyaW5ncy4gT3RoZXJ3aXNlIGV2ZXJ5IGNoYXJhY3RlciBvZiBgZGVsaW1pdGVyYCBpcyBhIHBvdGVudGlhbFxuICogc3BsaXQgcG9pbnQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHJlc3VsdCA9IHRmLnN0cmluZy5zdHJpbmdTcGxpdChbJ2hlbGxvIHdvcmxkJywgICdhIGIgYyddLCAnICcpO1xuICogcmVzdWx0WydpbmRpY2VzJ10ucHJpbnQoKTsgLy8gW1swLCAwXSwgWzAsIDFdLCBbMSwgMF0sIFsxLCAxXSwgWzEsIDJdXVxuICogcmVzdWx0Wyd2YWx1ZXMnXS5wcmludCgpOyAvLyBbJ2hlbGxvJywgJ3dvcmxkJywgJ2EnLCAnYicsICdjJ11cbiAqIHJlc3VsdFsnc2hhcGUnXS5wcmludCgpOyAvLyBbMiwgM11cbiAqIGBgYFxuICogQHBhcmFtIGlucHV0OiAxLUQuIFN0cmluZ3MgdG8gc3BsaXQuXG4gKiBAcGFyYW0gZGVsaW1pdGVyOiAwLUQuIERlbGltaXRlciBjaGFyYWN0ZXJzLCBvciBlbXB0eSBzdHJpbmcuXG4gKiBAcGFyYW0gc2tpcEVtcHR5OiBPcHRpb25hbC4gSWYgdHJ1ZSwgc2tpcCB0aGUgZW1wdHkgc3RyaW5ncyBmcm9tIHRoZSByZXN1bHQuXG4gKiAgICAgRGVmYXVsdHMgdG8gdHJ1ZS5cbiAqIEByZXR1cm4gQSBtYXAgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAgICAgLSBpbmRpY2VzOiBBIGRlbnNlIG1hdHJpeCBvZiBpbnQzMiByZXByZXNlbnRpbmcgdGhlIGluZGljZXMgb2YgdGhlIHNwYXJzZVxuICogICAgICAgdGVuc29yLlxuICogICAgIC0gdmFsdWVzOiBBIHZlY3RvciBvZiBzdHJpbmdzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwbGl0ZWQgdmFsdWVzLlxuICogICAgIC0gc2hhcGU6IGEgbGVuZ3RoLTIgdmVjdG9yIG9mIGludDMyIHJlcHJlc2VudGluZyB0aGUgc2hhcGUgb2YgdGhlIHNwYXJzZVxuICogdGVuc29yLCB3aGVyZSB0aGUgZmlyc3QgdmFsdWUgaXMgTiBhbmQgdGhlIHNlY29uZCB2YWx1ZSBpcyB0aGUgbWF4aW11bSBudW1iZXJcbiAqIG9mIHRva2VucyBpbiBhIHNpbmdsZSBpbnB1dCBlbnRyeS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTdHJpbmcnfVxuICovXG5mdW5jdGlvbiBzdHJpbmdTcGxpdF8oaW5wdXQsIGRlbGltaXRlciwgc2tpcEVtcHR5ID0gdHJ1ZSkge1xuICAgIGNvbnN0ICRpbnB1dCA9IGNvbnZlcnRUb1RlbnNvcihpbnB1dCwgJ2lucHV0JywgJ3N0cmluZ1NwbGl0JywgJ3N0cmluZycpO1xuICAgIGNvbnN0ICRkZWxpbWl0ZXIgPSBjb252ZXJ0VG9UZW5zb3IoZGVsaW1pdGVyLCAnZGVsaW1pdGVyJywgJ3N0cmluZ1NwbGl0JywgJ3N0cmluZycpO1xuICAgIGlmICgkaW5wdXQucmFuayAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYElucHV0IHNob3VsZCBiZSBUZW5zb3IxRCBidXQgcmVjZWl2ZWQgc2hhcGUgJHskaW5wdXQuc2hhcGV9YCk7XG4gICAgfVxuICAgIGlmICgkZGVsaW1pdGVyLnJhbmsgIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEZWxpbWl0ZXIgc2hvdWxkIGJlIGEgc2NhbGFyIGJ1dCByZWNlaXZlZCBzaGFwZSAkeyRkZWxpbWl0ZXIuc2hhcGV9YCk7XG4gICAgfVxuICAgIGNvbnN0IGF0dHJzID0geyBza2lwRW1wdHkgfTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGlucHV0OiAkaW5wdXQsIGRlbGltaXRlcjogJGRlbGltaXRlciB9O1xuICAgIGNvbnN0IHJlc3VsdCA9IEVOR0lORS5ydW5LZXJuZWwoU3RyaW5nU3BsaXQsIGlucHV0cywgYXR0cnMpO1xuICAgIHJldHVybiB7IGluZGljZXM6IHJlc3VsdFswXSwgdmFsdWVzOiByZXN1bHRbMV0sIHNoYXBlOiByZXN1bHRbMl0gfTtcbn1cbmV4cG9ydCBjb25zdCBzdHJpbmdTcGxpdCA9IG9wKHsgc3RyaW5nU3BsaXRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RyaW5nX3NwbGl0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBTdHJpbmdUb0hhc2hCdWNrZXRGYXN0IH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4uL29wZXJhdGlvbic7XG4vKipcbiAqIENvbnZlcnRzIGVhY2ggc3RyaW5nIGluIHRoZSBpbnB1dCBUZW5zb3IgdG8gaXRzIGhhc2ggbW9kIGJ5IGEgbnVtYmVyIG9mXG4gKiBidWNrZXRzLlxuICpcbiAqIFRoZSBoYXNoIGZ1bmN0aW9uIGlzIGRldGVybWluaXN0aWMgb24gdGhlIGNvbnRlbnQgb2YgdGhlIHN0cmluZyB3aXRoaW4gdGhlXG4gKiBwcm9jZXNzIGFuZCB3aWxsIG5ldmVyIGNoYW5nZS4gSG93ZXZlciwgaXQgaXMgbm90IHN1aXRhYmxlIGZvciBjcnlwdG9ncmFwaHkuXG4gKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSB1c2VkIHdoZW4gQ1BVIHRpbWUgaXMgc2NhcmNlIGFuZCBpbnB1dHMgYXJlIHRydXN0ZWQgb3JcbiAqIHVuaW1wb3J0YW50LiBUaGVyZSBpcyBhIHJpc2sgb2YgYWR2ZXJzYXJpZXMgY29uc3RydWN0aW5nIGlucHV0cyB0aGF0IGFsbCBoYXNoXG4gKiB0byB0aGUgc2FtZSBidWNrZXQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHJlc3VsdCA9IHRmLnN0cmluZy5zdHJpbmdUb0hhc2hCdWNrZXRGYXN0KFxuICogICBbJ0hlbGxvJywgJ1RlbnNvckZsb3cnLCAnMi54J10sIDMpO1xuICogcmVzdWx0LnByaW50KCk7IC8vIFswLCAyLCAyXVxuICogYGBgXG4gKiBAcGFyYW0gaW5wdXQ6IFRoZSBzdHJpbmdzIHRvIGFzc2lnbiBhIGhhc2ggYnVja2V0LlxuICogQHBhcmFtIG51bUJ1Y2tldHM6IFRoZSBudW1iZXIgb2YgYnVja2V0cy5cbiAqIEByZXR1cm4gQSBUZW5zb3Igb2YgdGhlIHNhbWUgc2hhcGUgYXMgdGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTdHJpbmcnfVxuICovXG5mdW5jdGlvbiBzdHJpbmdUb0hhc2hCdWNrZXRGYXN0XyhpbnB1dCwgbnVtQnVja2V0cykge1xuICAgIGNvbnN0ICRpbnB1dCA9IGNvbnZlcnRUb1RlbnNvcihpbnB1dCwgJ2lucHV0JywgJ3N0cmluZ1RvSGFzaEJ1Y2tldEZhc3QnLCAnc3RyaW5nJyk7XG4gICAgY29uc3QgYXR0cnMgPSB7IG51bUJ1Y2tldHMgfTtcbiAgICBpZiAobnVtQnVja2V0cyA8PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTnVtYmVyIG9mIGJ1Y2tldHMgbXVzdCBiZSBhdCBsZWFzdCAxYCk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0cyA9IHsgaW5wdXQ6ICRpbnB1dCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFN0cmluZ1RvSGFzaEJ1Y2tldEZhc3QsIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3QgPSBvcCh7IHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RyaW5nX3RvX2hhc2hfYnVja2V0X2Zhc3QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFN1YiB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBtYWtlVHlwZXNNYXRjaCB9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogU3VidHJhY3RzIHR3byBgdGYuVGVuc29yYHMgZWxlbWVudC13aXNlLCBBIC0gQi4gU3VwcG9ydHMgYnJvYWRjYXN0aW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEwLCAyMCwgMzAsIDQwXSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzEsIDIsIDMsIDRdKTtcbiAqXG4gKiBhLnN1YihiKS5wcmludCgpOyAgLy8gb3IgdGYuc3ViKGEsIGIpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogLy8gQnJvYWRjYXN0IHN1YnRyYWN0IGEgd2l0aCBiLlxuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxMCwgMjAsIDMwLCA0MF0pO1xuICogY29uc3QgYiA9IHRmLnNjYWxhcig1KTtcbiAqXG4gKiBhLnN1YihiKS5wcmludCgpOyAgLy8gb3IgdGYuc3ViKGEsIGIpXG4gKiBgYGBcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBgdGYuVGVuc29yYCB0byBzdWJ0cmFjdCBmcm9tLlxuICogQHBhcmFtIGIgVGhlIHNlY29uZCBgdGYuVGVuc29yYCB0byBiZSBzdWJ0cmFjdGVkLiBNdXN0IGhhdmUgdGhlIHNhbWUgZHR5cGUgYXNcbiAqIGBhYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdBcml0aG1ldGljJ31cbiAqL1xuZnVuY3Rpb24gc3ViXyhhLCBiKSB7XG4gICAgbGV0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ3N1YicpO1xuICAgIGxldCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdzdWInKTtcbiAgICBbJGEsICRiXSA9IG1ha2VUeXBlc01hdGNoKCRhLCAkYik7XG4gICAgY29uc3QgaW5wdXRzID0geyBhOiAkYSwgYjogJGIgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChTdWIsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3Qgc3ViID0gb3AoeyBzdWJfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3ViLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBTdW0gfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGNhc3QgfSBmcm9tICcuL2Nhc3QnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBzdW0gb2YgZWxlbWVudHMgYWNyb3NzIGRpbWVuc2lvbnMgb2YgYSBgdGYuVGVuc29yYC5cbiAqXG4gKiBSZWR1Y2VzIHRoZSBpbnB1dCBhbG9uZyB0aGUgZGltZW5zaW9ucyBnaXZlbiBpbiBgYXhlc2AuIFVubGVzcyBga2VlcERpbXNgXG4gKiBpcyB0cnVlLCB0aGUgcmFuayBvZiB0aGUgYHRmLlRlbnNvcmAgaXMgcmVkdWNlZCBieSAxIGZvciBlYWNoIGVudHJ5IGluXG4gKiBgYXhlc2AuIElmIGBrZWVwRGltc2AgaXMgdHJ1ZSwgdGhlIHJlZHVjZWQgZGltZW5zaW9ucyBhcmUgcmV0YWluZWQgd2l0aFxuICogbGVuZ3RoIDEuIElmIGF4ZXMgaGFzIG5vIGVudHJpZXMsIGFsbCBkaW1lbnNpb25zIGFyZSByZWR1Y2VkLCBhbmQgYVxuICogYHRmLlRlbnNvcmAgd2l0aCBhIHNpbmdsZSBlbGVtZW50IGlzIHJldHVybmVkLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqXG4gKiB4LnN1bSgpLnByaW50KCk7ICAvLyBvciB0Zi5zdW0oeClcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pO1xuICpcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5zdW0oYXhpcykucHJpbnQoKTsgIC8vIG9yIHRmLnN1bSh4LCBheGlzKVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciB0byBjb21wdXRlIHRoZSBzdW0gb3Zlci4gSWYgdGhlIGR0eXBlIGlzIGBib29sYFxuICogICBpdCB3aWxsIGJlIGNvbnZlcnRlZCB0byBgaW50MzJgIGFuZCB0aGUgb3V0cHV0IGR0eXBlIHdpbGwgYmUgYGludDMyYC5cbiAqIEBwYXJhbSBheGlzIFRoZSBkaW1lbnNpb24ocykgdG8gcmVkdWNlLiBCeSBkZWZhdWx0IGl0IHJlZHVjZXNcbiAqICAgICBhbGwgZGltZW5zaW9ucy5cbiAqIEBwYXJhbSBrZWVwRGltcyBJZiB0cnVlLCByZXRhaW5zIHJlZHVjZWQgZGltZW5zaW9ucyB3aXRoIHNpemUgMS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdSZWR1Y3Rpb24nfVxuICovXG5mdW5jdGlvbiBzdW1fKHgsIGF4aXMgPSBudWxsLCBrZWVwRGltcyA9IGZhbHNlKSB7XG4gICAgbGV0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3N1bScpO1xuICAgIGlmICgkeC5kdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgICAgICR4ID0gY2FzdCgkeCwgJ2ludDMyJyk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICBjb25zdCBhdHRycyA9IHsgYXhpcywga2VlcERpbXMgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChTdW0sIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IHN1bSA9IG9wKHsgc3VtXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN1bS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgVGFuIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgdGFuIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2UsIGB0YW4oeClgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMCwgTWF0aC5QSSAvIDIsIE1hdGguUEkgKiAzIC8gNF0pO1xuICpcbiAqIHgudGFuKCkucHJpbnQoKTsgIC8vIG9yIHRmLnRhbih4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiB0YW5fKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICd0YW4nKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoVGFuLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IHRhbiA9IG9wKHsgdGFuXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRhbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgVGFuaCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIGh5cGVyYm9saWMgdGFuZ2VudCBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOiBgdGFuaCh4KWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFswLCAxLCAtMSwgNzBdKTtcbiAqXG4gKiB4LnRhbmgoKS5wcmludCgpOyAgLy8gb3IgdGYudGFuaCh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiB0YW5oXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAndGFuaCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChUYW5oLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IHRhbmggPSBvcCh7IHRhbmhfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGFuaC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBpbmZlclNoYXBlIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG1ha2VUZW5zb3IgfSBmcm9tICcuL3RlbnNvcl9vcHNfdXRpbCc7XG4vKipcbiAqIENyZWF0ZXMgYSBgdGYuVGVuc29yYCB3aXRoIHRoZSBwcm92aWRlZCB2YWx1ZXMsIHNoYXBlIGFuZCBkdHlwZS5cbiAqXG4gKiBgYGBqc1xuICogLy8gUGFzcyBhbiBhcnJheSBvZiB2YWx1ZXMgdG8gY3JlYXRlIGEgdmVjdG9yLlxuICogdGYudGVuc29yKFsxLCAyLCAzLCA0XSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBQYXNzIGEgbmVzdGVkIGFycmF5IG9mIHZhbHVlcyB0byBtYWtlIGEgbWF0cml4IG9yIGEgaGlnaGVyXG4gKiAvLyBkaW1lbnNpb25hbCB0ZW5zb3IuXG4gKiB0Zi50ZW5zb3IoW1sxLCAyXSwgWzMsIDRdXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBQYXNzIGEgZmxhdCBhcnJheSBhbmQgc3BlY2lmeSBhIHNoYXBlIHlvdXJzZWxmLlxuICogdGYudGVuc29yKFsxLCAyLCAzLCA0XSwgWzIsIDJdKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHZhbHVlcyBUaGUgdmFsdWVzIG9mIHRoZSB0ZW5zb3IuIENhbiBiZSBuZXN0ZWQgYXJyYXkgb2YgbnVtYmVycyxcbiAqICAgICBvciBhIGZsYXQgYXJyYXksIG9yIGEgYFR5cGVkQXJyYXlgLiBJZiB0aGUgdmFsdWVzIGFyZSBzdHJpbmdzLFxuICogICAgIHRoZXkgd2lsbCBiZSBlbmNvZGVkIGFzIHV0Zi04IGFuZCBrZXB0IGFzIGBVaW50OEFycmF5W11gLlxuICogQHBhcmFtIHNoYXBlIFRoZSBzaGFwZSBvZiB0aGUgdGVuc29yLiBPcHRpb25hbC4gSWYgbm90IHByb3ZpZGVkLFxuICogICBpdCBpcyBpbmZlcnJlZCBmcm9tIGB2YWx1ZXNgLlxuICogQHBhcmFtIGR0eXBlIFRoZSBkYXRhIHR5cGUuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdGVuc29yKHZhbHVlcywgc2hhcGUsIGR0eXBlKSB7XG4gICAgY29uc3QgaW5mZXJyZWRTaGFwZSA9IGluZmVyU2hhcGUodmFsdWVzLCBkdHlwZSk7XG4gICAgcmV0dXJuIG1ha2VUZW5zb3IodmFsdWVzLCBzaGFwZSwgaW5mZXJyZWRTaGFwZSwgZHR5cGUpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGVuc29yLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGluZmVyU2hhcGUgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0Tm9uTnVsbCB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgbWFrZVRlbnNvciB9IGZyb20gJy4vdGVuc29yX29wc191dGlsJztcbi8qKlxuICogQ3JlYXRlcyByYW5rLTEgYHRmLlRlbnNvcmAgd2l0aCB0aGUgcHJvdmlkZWQgdmFsdWVzLCBzaGFwZSBhbmQgZHR5cGUuXG4gKlxuICogVGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBjYW4gYmUgYWNoaWV2ZWQgd2l0aCBgdGYudGVuc29yYCwgYnV0IGluIGdlbmVyYWxcbiAqIHdlIHJlY29tbWVuZCB1c2luZyBgdGYudGVuc29yMWRgIGFzIGl0IG1ha2VzIHRoZSBjb2RlIG1vcmUgcmVhZGFibGUuXG4gKlxuICogYGBganNcbiAqIHRmLnRlbnNvcjFkKFsxLCAyLCAzXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB2YWx1ZXMgVGhlIHZhbHVlcyBvZiB0aGUgdGVuc29yLiBDYW4gYmUgYXJyYXkgb2YgbnVtYmVycyxcbiAqICAgICBvciBhIGBUeXBlZEFycmF5YC5cbiAqIEBwYXJhbSBkdHlwZSBUaGUgZGF0YSB0eXBlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlbnNvcjFkKHZhbHVlcywgZHR5cGUpIHtcbiAgICBhc3NlcnROb25OdWxsKHZhbHVlcyk7XG4gICAgY29uc3QgaW5mZXJyZWRTaGFwZSA9IGluZmVyU2hhcGUodmFsdWVzLCBkdHlwZSk7XG4gICAgaWYgKGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGVuc29yMWQoKSByZXF1aXJlcyB2YWx1ZXMgdG8gYmUgYSBmbGF0L1R5cGVkQXJyYXknKTtcbiAgICB9XG4gICAgY29uc3Qgc2hhcGUgPSBudWxsO1xuICAgIHJldHVybiBtYWtlVGVuc29yKHZhbHVlcywgc2hhcGUsIGluZmVycmVkU2hhcGUsIGR0eXBlKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRlbnNvcjFkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGluZmVyU2hhcGUgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0Tm9uTnVsbCB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgbWFrZVRlbnNvciB9IGZyb20gJy4vdGVuc29yX29wc191dGlsJztcbi8qKlxuICogQ3JlYXRlcyByYW5rLTIgYHRmLlRlbnNvcmAgd2l0aCB0aGUgcHJvdmlkZWQgdmFsdWVzLCBzaGFwZSBhbmQgZHR5cGUuXG4gKlxuICogVGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBjYW4gYmUgYWNoaWV2ZWQgd2l0aCBgdGYudGVuc29yYCwgYnV0IGluIGdlbmVyYWxcbiAqIHdlIHJlY29tbWVuZCB1c2luZyBgdGYudGVuc29yMmRgIGFzIGl0IG1ha2VzIHRoZSBjb2RlIG1vcmUgcmVhZGFibGUuXG4gKlxuICogIGBgYGpzXG4gKiAvLyBQYXNzIGEgbmVzdGVkIGFycmF5LlxuICogdGYudGVuc29yMmQoW1sxLCAyXSwgWzMsIDRdXSkucHJpbnQoKTtcbiAqIGBgYFxuICogYGBganNcbiAqIC8vIFBhc3MgYSBmbGF0IGFycmF5IGFuZCBzcGVjaWZ5IGEgc2hhcGUuXG4gKiB0Zi50ZW5zb3IyZChbMSwgMiwgMywgNF0sIFsyLCAyXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB2YWx1ZXMgVGhlIHZhbHVlcyBvZiB0aGUgdGVuc29yLiBDYW4gYmUgbmVzdGVkIGFycmF5IG9mIG51bWJlcnMsXG4gKiAgICAgb3IgYSBmbGF0IGFycmF5LCBvciBhIGBUeXBlZEFycmF5YC5cbiAqIEBwYXJhbSBzaGFwZSBUaGUgc2hhcGUgb2YgdGhlIHRlbnNvci4gSWYgbm90IHByb3ZpZGVkLCBpdCBpcyBpbmZlcnJlZCBmcm9tXG4gKiAgICAgYHZhbHVlc2AuXG4gKiBAcGFyYW0gZHR5cGUgVGhlIGRhdGEgdHlwZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZW5zb3IyZCh2YWx1ZXMsIHNoYXBlLCBkdHlwZSkge1xuICAgIGFzc2VydE5vbk51bGwodmFsdWVzKTtcbiAgICBpZiAoc2hhcGUgIT0gbnVsbCAmJiBzaGFwZS5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0ZW5zb3IyZCgpIHJlcXVpcmVzIHNoYXBlIHRvIGhhdmUgdHdvIG51bWJlcnMnKTtcbiAgICB9XG4gICAgY29uc3QgaW5mZXJyZWRTaGFwZSA9IGluZmVyU2hhcGUodmFsdWVzLCBkdHlwZSk7XG4gICAgaWYgKGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSAyICYmIGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGVuc29yMmQoKSByZXF1aXJlcyB2YWx1ZXMgdG8gYmUgbnVtYmVyW11bXSBvciBmbGF0L1R5cGVkQXJyYXknKTtcbiAgICB9XG4gICAgaWYgKGluZmVycmVkU2hhcGUubGVuZ3RoID09PSAxICYmIHNoYXBlID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0ZW5zb3IyZCgpIHJlcXVpcmVzIHNoYXBlIHRvIGJlIHByb3ZpZGVkIHdoZW4gYHZhbHVlc2AgJyArXG4gICAgICAgICAgICAnYXJlIGEgZmxhdC9UeXBlZEFycmF5Jyk7XG4gICAgfVxuICAgIHJldHVybiBtYWtlVGVuc29yKHZhbHVlcywgc2hhcGUsIGluZmVycmVkU2hhcGUsIGR0eXBlKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRlbnNvcjJkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGluZmVyU2hhcGUgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0Tm9uTnVsbCB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgbWFrZVRlbnNvciB9IGZyb20gJy4vdGVuc29yX29wc191dGlsJztcbi8qKlxuICogQ3JlYXRlcyByYW5rLTMgYHRmLlRlbnNvcmAgd2l0aCB0aGUgcHJvdmlkZWQgdmFsdWVzLCBzaGFwZSBhbmQgZHR5cGUuXG4gKlxuICogVGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBjYW4gYmUgYWNoaWV2ZWQgd2l0aCBgdGYudGVuc29yYCwgYnV0IGluIGdlbmVyYWxcbiAqIHdlIHJlY29tbWVuZCB1c2luZyBgdGYudGVuc29yM2RgIGFzIGl0IG1ha2VzIHRoZSBjb2RlIG1vcmUgcmVhZGFibGUuXG4gKlxuICogIGBgYGpzXG4gKiAvLyBQYXNzIGEgbmVzdGVkIGFycmF5LlxuICogdGYudGVuc29yM2QoW1tbMV0sIFsyXV0sIFtbM10sIFs0XV1dKS5wcmludCgpO1xuICogYGBgXG4gKiBgYGBqc1xuICogLy8gUGFzcyBhIGZsYXQgYXJyYXkgYW5kIHNwZWNpZnkgYSBzaGFwZS5cbiAqIHRmLnRlbnNvcjNkKFsxLCAyLCAzLCA0XSwgWzIsIDIsIDFdKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHZhbHVlcyBUaGUgdmFsdWVzIG9mIHRoZSB0ZW5zb3IuIENhbiBiZSBuZXN0ZWQgYXJyYXkgb2YgbnVtYmVycyxcbiAqICAgICBvciBhIGZsYXQgYXJyYXksIG9yIGEgYFR5cGVkQXJyYXlgLlxuICogQHBhcmFtIHNoYXBlIFRoZSBzaGFwZSBvZiB0aGUgdGVuc29yLiBJZiBub3QgcHJvdmlkZWQsICBpdCBpcyBpbmZlcnJlZCBmcm9tXG4gKiAgICAgYHZhbHVlc2AuXG4gKiBAcGFyYW0gZHR5cGUgVGhlIGRhdGEgdHlwZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZW5zb3IzZCh2YWx1ZXMsIHNoYXBlLCBkdHlwZSkge1xuICAgIGFzc2VydE5vbk51bGwodmFsdWVzKTtcbiAgICBpZiAoc2hhcGUgIT0gbnVsbCAmJiBzaGFwZS5sZW5ndGggIT09IDMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0ZW5zb3IzZCgpIHJlcXVpcmVzIHNoYXBlIHRvIGhhdmUgdGhyZWUgbnVtYmVycycpO1xuICAgIH1cbiAgICBjb25zdCBpbmZlcnJlZFNoYXBlID0gaW5mZXJTaGFwZSh2YWx1ZXMsIGR0eXBlKTtcbiAgICBpZiAoaW5mZXJyZWRTaGFwZS5sZW5ndGggIT09IDMgJiYgaW5mZXJyZWRTaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0ZW5zb3IzZCgpIHJlcXVpcmVzIHZhbHVlcyB0byBiZSBudW1iZXJbXVtdW10gb3IgZmxhdC9UeXBlZEFycmF5Jyk7XG4gICAgfVxuICAgIGlmIChpbmZlcnJlZFNoYXBlLmxlbmd0aCA9PT0gMSAmJiBzaGFwZSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGVuc29yM2QoKSByZXF1aXJlcyBzaGFwZSB0byBiZSBwcm92aWRlZCB3aGVuIGB2YWx1ZXNgICcgK1xuICAgICAgICAgICAgJ2FyZSBhIGZsYXQgYXJyYXknKTtcbiAgICB9XG4gICAgcmV0dXJuIG1ha2VUZW5zb3IodmFsdWVzLCBzaGFwZSwgaW5mZXJyZWRTaGFwZSwgZHR5cGUpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGVuc29yM2QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgaW5mZXJTaGFwZSB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnROb25OdWxsIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBtYWtlVGVuc29yIH0gZnJvbSAnLi90ZW5zb3Jfb3BzX3V0aWwnO1xuLyoqXG4gKiBDcmVhdGVzIHJhbmstNCBgdGYuVGVuc29yYCB3aXRoIHRoZSBwcm92aWRlZCB2YWx1ZXMsIHNoYXBlIGFuZCBkdHlwZS5cbiAqXG4gKiBUaGUgc2FtZSBmdW5jdGlvbmFsaXR5IGNhbiBiZSBhY2hpZXZlZCB3aXRoIGB0Zi50ZW5zb3JgLCBidXQgaW4gZ2VuZXJhbFxuICogd2UgcmVjb21tZW5kIHVzaW5nIGB0Zi50ZW5zb3I0ZGAgYXMgaXQgbWFrZXMgdGhlIGNvZGUgbW9yZSByZWFkYWJsZS5cbiAqXG4gKiAgYGBganNcbiAqIC8vIFBhc3MgYSBuZXN0ZWQgYXJyYXkuXG4gKiB0Zi50ZW5zb3I0ZChbW1tbMV0sIFsyXV0sIFtbM10sIFs0XV1dXSkucHJpbnQoKTtcbiAqIGBgYFxuICogYGBganNcbiAqIC8vIFBhc3MgYSBmbGF0IGFycmF5IGFuZCBzcGVjaWZ5IGEgc2hhcGUuXG4gKiB0Zi50ZW5zb3I0ZChbMSwgMiwgMywgNF0sIFsxLCAyLCAyLCAxXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB2YWx1ZXMgVGhlIHZhbHVlcyBvZiB0aGUgdGVuc29yLiBDYW4gYmUgbmVzdGVkIGFycmF5IG9mIG51bWJlcnMsXG4gKiAgICAgb3IgYSBmbGF0IGFycmF5LCBvciBhIGBUeXBlZEFycmF5YC5cbiAqIEBwYXJhbSBzaGFwZSBUaGUgc2hhcGUgb2YgdGhlIHRlbnNvci4gT3B0aW9uYWwuIElmIG5vdCBwcm92aWRlZCxcbiAqICAgaXQgaXMgaW5mZXJyZWQgZnJvbSBgdmFsdWVzYC5cbiAqIEBwYXJhbSBkdHlwZSBUaGUgZGF0YSB0eXBlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlbnNvcjRkKHZhbHVlcywgc2hhcGUsIGR0eXBlKSB7XG4gICAgYXNzZXJ0Tm9uTnVsbCh2YWx1ZXMpO1xuICAgIGlmIChzaGFwZSAhPSBudWxsICYmIHNoYXBlLmxlbmd0aCAhPT0gNCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RlbnNvcjRkKCkgcmVxdWlyZXMgc2hhcGUgdG8gaGF2ZSBmb3VyIG51bWJlcnMnKTtcbiAgICB9XG4gICAgY29uc3QgaW5mZXJyZWRTaGFwZSA9IGluZmVyU2hhcGUodmFsdWVzLCBkdHlwZSk7XG4gICAgaWYgKGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSA0ICYmIGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGVuc29yNGQoKSByZXF1aXJlcyB2YWx1ZXMgdG8gYmUgbnVtYmVyW11bXVtdW10gb3IgZmxhdC9UeXBlZEFycmF5Jyk7XG4gICAgfVxuICAgIGlmIChpbmZlcnJlZFNoYXBlLmxlbmd0aCA9PT0gMSAmJiBzaGFwZSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGVuc29yNGQoKSByZXF1aXJlcyBzaGFwZSB0byBiZSBwcm92aWRlZCB3aGVuIGB2YWx1ZXNgICcgK1xuICAgICAgICAgICAgJ2FyZSBhIGZsYXQgYXJyYXknKTtcbiAgICB9XG4gICAgcmV0dXJuIG1ha2VUZW5zb3IodmFsdWVzLCBzaGFwZSwgaW5mZXJyZWRTaGFwZSwgZHR5cGUpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGVuc29yNGQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgaW5mZXJTaGFwZSB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnROb25OdWxsIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBtYWtlVGVuc29yIH0gZnJvbSAnLi90ZW5zb3Jfb3BzX3V0aWwnO1xuLyoqXG4gKiBDcmVhdGVzIHJhbmstNSBgdGYuVGVuc29yYCB3aXRoIHRoZSBwcm92aWRlZCB2YWx1ZXMsIHNoYXBlIGFuZCBkdHlwZS5cbiAqXG4gKiBUaGUgc2FtZSBmdW5jdGlvbmFsaXR5IGNhbiBiZSBhY2hpZXZlZCB3aXRoIGB0Zi50ZW5zb3JgLCBidXQgaW4gZ2VuZXJhbFxuICogd2UgcmVjb21tZW5kIHVzaW5nIGB0Zi50ZW5zb3I1ZGAgYXMgaXQgbWFrZXMgdGhlIGNvZGUgbW9yZSByZWFkYWJsZS5cbiAqXG4gKiAgYGBganNcbiAqIC8vIFBhc3MgYSBuZXN0ZWQgYXJyYXkuXG4gKiB0Zi50ZW5zb3I1ZChbW1tbWzFdLFsyXV0sW1szXSxbNF1dXSxbW1s1XSxbNl1dLFtbN10sWzhdXV1dXSkucHJpbnQoKTtcbiAqIGBgYFxuICogYGBganNcbiAqIC8vIFBhc3MgYSBmbGF0IGFycmF5IGFuZCBzcGVjaWZ5IGEgc2hhcGUuXG4gKiB0Zi50ZW5zb3I1ZChbMSwgMiwgMywgNCwgNSwgNiwgNywgOF0sIFsxLCAyLCAyLCAyLCAxXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB2YWx1ZXMgVGhlIHZhbHVlcyBvZiB0aGUgdGVuc29yLiBDYW4gYmUgbmVzdGVkIGFycmF5IG9mIG51bWJlcnMsXG4gKiAgICAgb3IgYSBmbGF0IGFycmF5LCBvciBhIGBUeXBlZEFycmF5YC5cbiAqIEBwYXJhbSBzaGFwZSBUaGUgc2hhcGUgb2YgdGhlIHRlbnNvci4gT3B0aW9uYWwuIElmIG5vdCBwcm92aWRlZCxcbiAqICAgaXQgaXMgaW5mZXJyZWQgZnJvbSBgdmFsdWVzYC5cbiAqIEBwYXJhbSBkdHlwZSBUaGUgZGF0YSB0eXBlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlbnNvcjVkKHZhbHVlcywgc2hhcGUsIGR0eXBlKSB7XG4gICAgYXNzZXJ0Tm9uTnVsbCh2YWx1ZXMpO1xuICAgIGlmIChzaGFwZSAhPSBudWxsICYmIHNoYXBlLmxlbmd0aCAhPT0gNSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RlbnNvcjVkKCkgcmVxdWlyZXMgc2hhcGUgdG8gaGF2ZSBmaXZlIG51bWJlcnMnKTtcbiAgICB9XG4gICAgY29uc3QgaW5mZXJyZWRTaGFwZSA9IGluZmVyU2hhcGUodmFsdWVzLCBkdHlwZSk7XG4gICAgaWYgKGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSA1ICYmIGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGVuc29yNWQoKSByZXF1aXJlcyB2YWx1ZXMgdG8gYmUgJyArXG4gICAgICAgICAgICAnbnVtYmVyW11bXVtdW11bXSBvciBmbGF0L1R5cGVkQXJyYXknKTtcbiAgICB9XG4gICAgaWYgKGluZmVycmVkU2hhcGUubGVuZ3RoID09PSAxICYmIHNoYXBlID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0ZW5zb3I1ZCgpIHJlcXVpcmVzIHNoYXBlIHRvIGJlIHByb3ZpZGVkIHdoZW4gYHZhbHVlc2AgJyArXG4gICAgICAgICAgICAnYXJlIGEgZmxhdCBhcnJheScpO1xuICAgIH1cbiAgICByZXR1cm4gbWFrZVRlbnNvcih2YWx1ZXMsIHNoYXBlLCBpbmZlcnJlZFNoYXBlLCBkdHlwZSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD10ZW5zb3I1ZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBpbmZlclNoYXBlIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGFzc2VydE5vbk51bGwgfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG1ha2VUZW5zb3IgfSBmcm9tICcuL3RlbnNvcl9vcHNfdXRpbCc7XG4vKipcbiAqIENyZWF0ZXMgcmFuay02IGB0Zi5UZW5zb3JgIHdpdGggdGhlIHByb3ZpZGVkIHZhbHVlcywgc2hhcGUgYW5kIGR0eXBlLlxuICpcbiAqIFRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgY2FuIGJlIGFjaGlldmVkIHdpdGggYHRmLnRlbnNvcmAsIGJ1dCBpbiBnZW5lcmFsXG4gKiB3ZSByZWNvbW1lbmQgdXNpbmcgYHRmLnRlbnNvcjZkYCBhcyBpdCBtYWtlcyB0aGUgY29kZSBtb3JlIHJlYWRhYmxlLlxuICpcbiAqICBgYGBqc1xuICogLy8gUGFzcyBhIG5lc3RlZCBhcnJheS5cbiAqIHRmLnRlbnNvcjZkKFtbW1tbWzFdLFsyXV0sW1szXSxbNF1dXSxbW1s1XSxbNl1dLFtbN10sWzhdXV1dXV0pLnByaW50KCk7XG4gKiBgYGBcbiAqIGBgYGpzXG4gKiAvLyBQYXNzIGEgZmxhdCBhcnJheSBhbmQgc3BlY2lmeSBhIHNoYXBlLlxuICogdGYudGVuc29yNmQoWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDhdLCBbMSwgMSwgMiwgMiwgMiwgMV0pLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdmFsdWVzIFRoZSB2YWx1ZXMgb2YgdGhlIHRlbnNvci4gQ2FuIGJlIG5lc3RlZCBhcnJheSBvZiBudW1iZXJzLFxuICogICAgIG9yIGEgZmxhdCBhcnJheSwgb3IgYSBgVHlwZWRBcnJheWAuXG4gKiBAcGFyYW0gc2hhcGUgVGhlIHNoYXBlIG9mIHRoZSB0ZW5zb3IuIE9wdGlvbmFsLiBJZiBub3QgcHJvdmlkZWQsXG4gKiAgIGl0IGlzIGluZmVycmVkIGZyb20gYHZhbHVlc2AuXG4gKiBAcGFyYW0gZHR5cGUgVGhlIGRhdGEgdHlwZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZW5zb3I2ZCh2YWx1ZXMsIHNoYXBlLCBkdHlwZSkge1xuICAgIGFzc2VydE5vbk51bGwodmFsdWVzKTtcbiAgICBpZiAoc2hhcGUgIT0gbnVsbCAmJiBzaGFwZS5sZW5ndGggIT09IDYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0ZW5zb3I2ZCgpIHJlcXVpcmVzIHNoYXBlIHRvIGhhdmUgc2l4IG51bWJlcnMnKTtcbiAgICB9XG4gICAgY29uc3QgaW5mZXJyZWRTaGFwZSA9IGluZmVyU2hhcGUodmFsdWVzLCBkdHlwZSk7XG4gICAgaWYgKGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSA2ICYmIGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGVuc29yNmQoKSByZXF1aXJlcyB2YWx1ZXMgdG8gYmUgbnVtYmVyW11bXVtdW11bXVtdIG9yICcgK1xuICAgICAgICAgICAgJ2ZsYXQvVHlwZWRBcnJheScpO1xuICAgIH1cbiAgICBpZiAoaW5mZXJyZWRTaGFwZS5sZW5ndGggPT09IDEgJiYgc2hhcGUgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RlbnNvcjZkKCkgcmVxdWlyZXMgc2hhcGUgdG8gYmUgcHJvdmlkZWQgd2hlbiBgdmFsdWVzYCAnICtcbiAgICAgICAgICAgICdhcmUgYSBmbGF0IGFycmF5Jyk7XG4gICAgfVxuICAgIHNoYXBlID0gc2hhcGUgfHxcbiAgICAgICAgaW5mZXJyZWRTaGFwZTtcbiAgICByZXR1cm4gbWFrZVRlbnNvcih2YWx1ZXMsIHNoYXBlLCBpbmZlcnJlZFNoYXBlLCBkdHlwZSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD10ZW5zb3I2ZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgYXNzZXJ0LCBhc3NlcnROb25OZWdhdGl2ZUludGVnZXJEaW1lbnNpb25zLCBmbGF0dGVuLCBpbmZlckR0eXBlLCBpc1R5cGVkQXJyYXksIHNpemVGcm9tU2hhcGUsIHRvVHlwZWRBcnJheSB9IGZyb20gJy4uL3V0aWwnO1xuLyoqIFRoaXMgaXMgc2hhcmVkIGNvZGUgYWNyb3NzIGFsbCB0ZW5zb3IgY3JlYXRpb24gbWV0aG9kcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlVGVuc29yKHZhbHVlcywgc2hhcGUsIGluZmVycmVkU2hhcGUsIGR0eXBlKSB7XG4gICAgaWYgKGR0eXBlID09IG51bGwpIHtcbiAgICAgICAgZHR5cGUgPSBpbmZlckR0eXBlKHZhbHVlcyk7XG4gICAgfVxuICAgIGlmIChkdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29uc3RydWN0IGEgY29tcGxleDY0IHRlbnNvciBkaXJlY3RseS4gYCArXG4gICAgICAgICAgICBgUGxlYXNlIHVzZSB0Zi5jb21wbGV4KHJlYWwsIGltYWcpLmApO1xuICAgIH1cbiAgICBpZiAoIWlzVHlwZWRBcnJheSh2YWx1ZXMpICYmICFBcnJheS5pc0FycmF5KHZhbHVlcykgJiZcbiAgICAgICAgdHlwZW9mIHZhbHVlcyAhPT0gJ251bWJlcicgJiYgdHlwZW9mIHZhbHVlcyAhPT0gJ2Jvb2xlYW4nICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZXMgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndmFsdWVzIHBhc3NlZCB0byB0ZW5zb3IodmFsdWVzKSBtdXN0IGJlIGEgbnVtYmVyL2Jvb2xlYW4vc3RyaW5nIG9yICcgK1xuICAgICAgICAgICAgJ2FuIGFycmF5IG9mIG51bWJlcnMvYm9vbGVhbnMvc3RyaW5ncywgb3IgYSBUeXBlZEFycmF5Jyk7XG4gICAgfVxuICAgIGlmIChzaGFwZSAhPSBudWxsKSB7XG4gICAgICAgIGFzc2VydE5vbk5lZ2F0aXZlSW50ZWdlckRpbWVuc2lvbnMoc2hhcGUpO1xuICAgICAgICBjb25zdCBwcm92aWRlZFNpemUgPSBzaXplRnJvbVNoYXBlKHNoYXBlKTtcbiAgICAgICAgY29uc3QgaW5mZXJyZWRTaXplID0gc2l6ZUZyb21TaGFwZShpbmZlcnJlZFNoYXBlKTtcbiAgICAgICAgYXNzZXJ0KHByb3ZpZGVkU2l6ZSA9PT0gaW5mZXJyZWRTaXplLCAoKSA9PiBgQmFzZWQgb24gdGhlIHByb3ZpZGVkIHNoYXBlLCBbJHtzaGFwZX1dLCB0aGUgdGVuc29yIHNob3VsZCBoYXZlIGAgK1xuICAgICAgICAgICAgYCR7cHJvdmlkZWRTaXplfSB2YWx1ZXMgYnV0IGhhcyAke2luZmVycmVkU2l6ZX1gKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmZlcnJlZFNoYXBlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBjb25zdCBpbmZlcnJlZCA9IGluZmVycmVkU2hhcGVbaV07XG4gICAgICAgICAgICBjb25zdCBmbGF0RGltc0RvbnRNYXRjaCA9IGkgPT09IGluZmVycmVkU2hhcGUubGVuZ3RoIC0gMSA/XG4gICAgICAgICAgICAgICAgaW5mZXJyZWQgIT09IHNpemVGcm9tU2hhcGUoc2hhcGUuc2xpY2UoaSkpIDpcbiAgICAgICAgICAgICAgICB0cnVlO1xuICAgICAgICAgICAgYXNzZXJ0KGluZmVycmVkU2hhcGVbaV0gPT09IHNoYXBlW2ldIHx8ICFmbGF0RGltc0RvbnRNYXRjaCwgKCkgPT4gYEVycm9yIGNyZWF0aW5nIGEgbmV3IFRlbnNvci4gSW5mZXJyZWQgc2hhcGUgYCArXG4gICAgICAgICAgICAgICAgYCgke2luZmVycmVkU2hhcGV9KSBkb2VzIG5vdCBtYXRjaCB0aGUgcHJvdmlkZWQgYCArXG4gICAgICAgICAgICAgICAgYHNoYXBlICgke3NoYXBlfSkuIGApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghaXNUeXBlZEFycmF5KHZhbHVlcykgJiYgIUFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgICAgICB2YWx1ZXMgPSBbdmFsdWVzXTtcbiAgICB9XG4gICAgc2hhcGUgPSBzaGFwZSB8fCBpbmZlcnJlZFNoYXBlO1xuICAgIHZhbHVlcyA9IGR0eXBlICE9PSAnc3RyaW5nJyA/XG4gICAgICAgIHRvVHlwZWRBcnJheSh2YWx1ZXMsIGR0eXBlKSA6XG4gICAgICAgIGZsYXR0ZW4odmFsdWVzLCBbXSwgdHJ1ZSk7XG4gICAgcmV0dXJuIEVOR0lORS5tYWtlVGVuc29yKHZhbHVlcywgc2hhcGUsIGR0eXBlKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRlbnNvcl9vcHNfdXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgVGlsZSB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb25zdHJ1Y3QgYSB0ZW5zb3IgYnkgcmVwZWF0aW5nIGl0IHRoZSBudW1iZXIgb2YgdGltZXMgZ2l2ZW4gYnkgcmVwcy5cbiAqXG4gKiBUaGlzIG9wZXJhdGlvbiBjcmVhdGVzIGEgbmV3IHRlbnNvciBieSByZXBsaWNhdGluZyBgaW5wdXRgIGByZXBzYFxuICogdGltZXMuIFRoZSBvdXRwdXQgdGVuc29yJ3MgaSd0aCBkaW1lbnNpb24gaGFzIGBpbnB1dC5zaGFwZVtpXSAqXG4gKiByZXBzW2ldYCBlbGVtZW50cywgYW5kIHRoZSB2YWx1ZXMgb2YgYGlucHV0YCBhcmUgcmVwbGljYXRlZFxuICogYHJlcHNbaV1gIHRpbWVzIGFsb25nIHRoZSBpJ3RoIGRpbWVuc2lvbi4gRm9yIGV4YW1wbGUsIHRpbGluZ1xuICogYFthLCBiLCBjLCBkXWAgYnkgYFsyXWAgcHJvZHVjZXMgYFthLCBiLCBjLCBkLCBhLCBiLCBjLCBkXWAuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMl0pO1xuICpcbiAqIGEudGlsZShbMl0pLnByaW50KCk7ICAgIC8vIG9yIGEudGlsZShbMl0pXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjJkKFsxLCAyLCAzLCA0XSwgWzIsIDJdKTtcbiAqXG4gKiBhLnRpbGUoWzEsIDJdKS5wcmludCgpOyAgLy8gb3IgYS50aWxlKFsxLCAyXSlcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIHRlbnNvciB0byB0aWxlLlxuICogQHBhcmFtIHJlcHMgRGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIHJlcGxpY2F0aW9ucyBwZXIgZGltZW5zaW9uLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1NsaWNpbmcgYW5kIEpvaW5pbmcnfVxuICovXG5mdW5jdGlvbiB0aWxlXyh4LCByZXBzKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAndGlsZScsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICAgIHV0aWwuYXNzZXJ0KCR4LnJhbmsgPT09IHJlcHMubGVuZ3RoLCAoKSA9PiBgRXJyb3IgaW4gdHJhbnNwb3NlOiByYW5rIG9mIGlucHV0ICR7JHgucmFua30gYCArXG4gICAgICAgIGBtdXN0IG1hdGNoIGxlbmd0aCBvZiByZXBzICR7cmVwc30uYCk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyByZXBzIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoVGlsZSwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgdGlsZSA9IG9wKHsgdGlsZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10aWxlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBUb3BLIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogRmluZHMgdGhlIHZhbHVlcyBhbmQgaW5kaWNlcyBvZiB0aGUgYGtgIGxhcmdlc3QgZW50cmllcyBhbG9uZyB0aGUgbGFzdFxuICogZGltZW5zaW9uLlxuICpcbiAqIElmIHRoZSBpbnB1dCBpcyBhIHZlY3RvciAocmFuaz0xKSwgZmluZHMgdGhlIGsgbGFyZ2VzdCBlbnRyaWVzIGluIHRoZSB2ZWN0b3JcbiAqIGFuZCBvdXRwdXRzIHRoZWlyIHZhbHVlcyBhbmQgaW5kaWNlcyBhcyB2ZWN0b3JzLiBUaHVzIHZhbHVlc1tqXSBpcyB0aGUgai10aFxuICogbGFyZ2VzdCBlbnRyeSBpbiBpbnB1dCwgYW5kIGl0cyBpbmRleCBpcyBpbmRpY2VzW2pdLlxuICogRm9yIGhpZ2hlciByYW5rIGlucHV0cywgY29tcHV0ZXMgdGhlIHRvcCBrIGVudHJpZXMgYWxvbmcgdGhlIGxhc3QgZGltZW5zaW9uLlxuICpcbiAqIElmIHR3byBlbGVtZW50cyBhcmUgZXF1YWwsIHRoZSBsb3dlci1pbmRleCBlbGVtZW50IGFwcGVhcnMgZmlyc3QuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IyZChbWzEsIDVdLCBbNCwgM11dKTtcbiAqIGNvbnN0IHt2YWx1ZXMsIGluZGljZXN9ID0gdGYudG9wayhhKTtcbiAqIHZhbHVlcy5wcmludCgpO1xuICogaW5kaWNlcy5wcmludCgpO1xuICogYGBgXG4gKiBAcGFyYW0geCAxLUQgb3IgaGlnaGVyIGB0Zi5UZW5zb3JgIHdpdGggbGFzdCBkaW1lbnNpb24gYmVpbmcgYXQgbGVhc3QgYGtgLlxuICogQHBhcmFtIGsgTnVtYmVyIG9mIHRvcCBlbGVtZW50cyB0byBsb29rIGZvciBhbG9uZyB0aGUgbGFzdCBkaW1lbnNpb24uXG4gKiBAcGFyYW0gc29ydGVkIElmIHRydWUsIHRoZSByZXN1bHRpbmcgYGtgIGVsZW1lbnRzIHdpbGwgYmUgc29ydGVkIGJ5IHRoZVxuICogICAgIHZhbHVlcyBpbiBkZXNjZW5kaW5nIG9yZGVyLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0V2YWx1YXRpb24nfVxuICovXG5mdW5jdGlvbiB0b3BrXyh4LCBrID0gMSwgc29ydGVkID0gdHJ1ZSkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3RvcGsnKTtcbiAgICBpZiAoJHgucmFuayA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RvcGsoKSBleHBlY3RzIHRoZSBpbnB1dCB0byBiZSBvZiByYW5rIDEgb3IgaGlnaGVyJyk7XG4gICAgfVxuICAgIGNvbnN0IGxhc3REaW0gPSAkeC5zaGFwZVskeC5zaGFwZS5sZW5ndGggLSAxXTtcbiAgICBpZiAoayA8IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAnaycgcGFzc2VkIHRvIHRvcGsoKSBtdXN0IGJlID49IDAgYnV0IGdvdCAke2t9YCk7XG4gICAgfVxuICAgIGlmIChrID4gbGFzdERpbSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCdrJyBwYXNzZWQgdG8gdG9waygpIG11c3QgYmUgPD0gdGhlIGxhc3QgZGltZW5zaW9uICgke2xhc3REaW19KSBgICtcbiAgICAgICAgICAgIGBidXQgZ290ICR7a31gKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBrLCBzb3J0ZWQgfTtcbiAgICBjb25zdCBbdmFsdWVzLCBpbmRpY2VzXSA9IEVOR0lORS5ydW5LZXJuZWwoVG9wSywgaW5wdXRzLCBhdHRycyk7XG4gICAgcmV0dXJuIHsgdmFsdWVzLCBpbmRpY2VzIH07XG59XG5leHBvcnQgY29uc3QgdG9wayA9IG9wKHsgdG9wa18gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10b3BrLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBUcmFuc3Bvc2UgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogVHJhbnNwb3NlcyB0aGUgYHRmLlRlbnNvcmAuIFBlcm11dGVzIHRoZSBkaW1lbnNpb25zIGFjY29yZGluZyB0byBgcGVybWAuXG4gKlxuICogVGhlIHJldHVybmVkIGB0Zi5UZW5zb3JgJ3MgZGltZW5zaW9uIGBpYCB3aWxsIGNvcnJlc3BvbmQgdG8gdGhlIGlucHV0XG4gKiBkaW1lbnNpb24gYHBlcm1baV1gLiBJZiBgcGVybWAgaXMgbm90IGdpdmVuLCBpdCBpcyBzZXQgdG8gYFtuLTEuLi4wXWAsXG4gKiB3aGVyZSBgbmAgaXMgdGhlIHJhbmsgb2YgdGhlIGlucHV0IGB0Zi5UZW5zb3JgLiBIZW5jZSBieSBkZWZhdWx0LCB0aGlzXG4gKiBvcGVyYXRpb24gcGVyZm9ybXMgYSByZWd1bGFyIG1hdHJpeCB0cmFuc3Bvc2Ugb24gMi1EIGlucHV0IGB0Zi5UZW5zb3Jgcy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjJkKFsxLCAyLCAzLCA0LCA1LCA2XSwgWzIsIDNdKTtcbiAqXG4gKiBhLnRyYW5zcG9zZSgpLnByaW50KCk7ICAvLyBvciB0Zi50cmFuc3Bvc2UoYSlcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSB0ZW5zb3IgdG8gdHJhbnNwb3NlLlxuICogQHBhcmFtIHBlcm0gVGhlIHBlcm11dGF0aW9uIG9mIHRoZSBkaW1lbnNpb25zIG9mIGEuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTWF0cmljZXMnfVxuICovXG5mdW5jdGlvbiB0cmFuc3Bvc2VfKHgsIHBlcm0pIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICd0cmFuc3Bvc2UnKTtcbiAgICBpZiAocGVybSA9PSBudWxsKSB7XG4gICAgICAgIHBlcm0gPSAkeC5zaGFwZS5tYXAoKHMsIGkpID0+IGkpLnJldmVyc2UoKTtcbiAgICB9XG4gICAgdXRpbC5hc3NlcnQoJHgucmFuayA9PT0gcGVybS5sZW5ndGgsICgpID0+IGBFcnJvciBpbiB0cmFuc3Bvc2U6IHJhbmsgb2YgaW5wdXQgJHskeC5yYW5rfSBgICtcbiAgICAgICAgYG11c3QgbWF0Y2ggbGVuZ3RoIG9mIHBlcm0gJHtwZXJtfS5gKTtcbiAgICBwZXJtLmZvckVhY2goYXhpcyA9PiB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KGF4aXMgPj0gMCAmJiBheGlzIDwgJHgucmFuaywgKCkgPT4gYEFsbCBlbnRyaWVzIGluICdwZXJtJyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgJHskeC5yYW5rIC0gMX1gICtcbiAgICAgICAgICAgIGAgYnV0IGdvdCAke3Blcm19YCk7XG4gICAgfSk7XG4gICAgaWYgKCR4LnJhbmsgPD0gMSkge1xuICAgICAgICByZXR1cm4gJHguY2xvbmUoKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBwZXJtIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoVHJhbnNwb3NlLCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCB0cmFuc3Bvc2UgPSBvcCh7IHRyYW5zcG9zZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10cmFuc3Bvc2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYnVmZmVyIH0gZnJvbSAnLi9idWZmZXInO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyBNUFJhbmRHYXVzcyB9IGZyb20gJy4vcmFuZF91dGlsJztcbi8qKlxuICogQ3JlYXRlcyBhIGB0Zi5UZW5zb3JgIHdpdGggdmFsdWVzIHNhbXBsZWQgZnJvbSBhIHRydW5jYXRlZCBub3JtYWxcbiAqIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiBgYGBqc1xuICogdGYudHJ1bmNhdGVkTm9ybWFsKFsyLCAyXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIFRoZSBnZW5lcmF0ZWQgdmFsdWVzIGZvbGxvdyBhIG5vcm1hbCBkaXN0cmlidXRpb24gd2l0aCBzcGVjaWZpZWQgbWVhbiBhbmRcbiAqIHN0YW5kYXJkIGRldmlhdGlvbiwgZXhjZXB0IHRoYXQgdmFsdWVzIHdob3NlIG1hZ25pdHVkZSBpcyBtb3JlIHRoYW4gMlxuICogc3RhbmRhcmQgZGV2aWF0aW9ucyBmcm9tIHRoZSBtZWFuIGFyZSBkcm9wcGVkIGFuZCByZS1waWNrZWQuXG4gKlxuICogQHBhcmFtIHNoYXBlIEFuIGFycmF5IG9mIGludGVnZXJzIGRlZmluaW5nIHRoZSBvdXRwdXQgdGVuc29yIHNoYXBlLlxuICogQHBhcmFtIG1lYW4gVGhlIG1lYW4gb2YgdGhlIG5vcm1hbCBkaXN0cmlidXRpb24uXG4gKiBAcGFyYW0gc3RkRGV2IFRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIG5vcm1hbCBkaXN0cmlidXRpb24uXG4gKiBAcGFyYW0gZHR5cGUgVGhlIGRhdGEgdHlwZSBvZiB0aGUgb3V0cHV0IHRlbnNvci5cbiAqIEBwYXJhbSBzZWVkIFRoZSBzZWVkIGZvciB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5mdW5jdGlvbiB0cnVuY2F0ZWROb3JtYWxfKHNoYXBlLCBtZWFuID0gMCwgc3RkRGV2ID0gMSwgZHR5cGUsIHNlZWQpIHtcbiAgICBpZiAoZHR5cGUgIT0gbnVsbCAmJiBkdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgZGF0YSB0eXBlICQgeyBkdHlwZSB9YCk7XG4gICAgfVxuICAgIGNvbnN0IHJhbmRHYXVzcyA9IG5ldyBNUFJhbmRHYXVzcyhtZWFuLCBzdGREZXYsIGR0eXBlLCB0cnVlIC8qIHRydW5jYXRlZCAqLywgc2VlZCk7XG4gICAgY29uc3QgcmVzID0gYnVmZmVyKHNoYXBlLCBkdHlwZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXMudmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlcy52YWx1ZXNbaV0gPSByYW5kR2F1c3MubmV4dFZhbHVlKCk7XG4gICAgfVxuICAgIHJldHVybiByZXMudG9UZW5zb3IoKTtcbn1cbmV4cG9ydCBjb25zdCB0cnVuY2F0ZWROb3JtYWwgPSBvcCh7IHRydW5jYXRlZE5vcm1hbF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10cnVuY2F0ZWRfbm9ybWFsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBVbmlxdWUgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIEZpbmRzIHVuaXF1ZSBlbGVtZW50cyBhbG9uZyBhbiBheGlzIG9mIGEgdGVuc29yLlxuICpcbiAqIEl0IHJldHVybnMgYSB0ZW5zb3IgYHZhbHVlc2AgY29udGFpbmluZyBhbGwgb2YgdGhlIHVuaXF1ZSBlbGVtZW50cyBhbG9uZyB0aGVcbiAqIGBheGlzYCBvZiB0aGUgZ2l2ZW4gdGVuc29yIGB4YCBpbiB0aGUgc2FtZSBvcmRlciB0aGF0IHRoZXkgb2NjdXIgYWxvbmcgdGhlXG4gKiBgYXhpc2AgaW4gYHhgOyBgeGAgZG9lcyBub3QgbmVlZCB0byBiZSBzb3J0ZWQuIEl0IGFsc28gcmV0dXJucyBhIHRlbnNvclxuICogYGluZGljZXNgIHRoZSBzYW1lIHNpemUgYXMgdGhlIG51bWJlciBvZiB0aGUgZWxlbWVudHMgaW4gYHhgIGFsb25nIHRoZSBgYXhpc2BcbiAqIGRpbWVuc2lvbi4gSXQgY29udGFpbnMgdGhlIGluZGV4IGluIHRoZSB1bmlxdWUgb3V0cHV0IGB2YWx1ZXNgLlxuICpcbiAqIGBgYGpzXG4gKiAvLyBBIDEtRCB0ZW5zb3JcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMSwgMiwgNCwgNCwgNCwgNywgOCwgOF0pO1xuICogY29uc3Qge3ZhbHVlcywgaW5kaWNlc30gPSB0Zi51bmlxdWUoYSk7XG4gKiB2YWx1ZXMucHJpbnQoKTsgICAvLyBbMSwgMiwgNCwgNywgOCxdXG4gKiBpbmRpY2VzLnByaW50KCk7ICAvLyBbMCwgMCwgMSwgMiwgMiwgMiwgMywgNCwgNF1cbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBBIDItRCB0ZW5zb3Igd2l0aCBheGlzPTBcbiAqIC8vXG4gKiAvLyAnYScgaXM6IFtbMSwgMCwgMF0sXG4gKiAvLyAgICAgICAgICBbMSwgMCwgMF0sXG4gKiAvLyAgICAgICAgICBbMiwgMCwgMF1dXG4gKiBjb25zdCBhID0gdGYudGVuc29yMmQoW1sxLCAwLCAwXSwgWzEsIDAsIDBdLCBbMiwgMCwgMF1dKTtcbiAqIGNvbnN0IHt2YWx1ZXMsIGluZGljZXN9ID0gdGYudW5pcXVlKGEsIDApXG4gKiB2YWx1ZXMucHJpbnQoKTsgICAvLyBbWzEsIDAsIDBdLFxuICogICAgICAgICAgICAgICAgICAgLy8gIFsyLCAwLCAwXV1cbiAqIGluZGljZXMucHJpbnQoKTsgIC8vIFswLCAwLCAxXVxuICogYGBgXG4gKlxuICogYGBganNcbiAqIC8vIEEgMi1EIHRlbnNvciB3aXRoIGF4aXM9MVxuICogLy9cbiAqIC8vICdhJyBpczogW1sxLCAwLCAwXSxcbiAqIC8vICAgICAgICAgIFsxLCAwLCAwXSxcbiAqIC8vICAgICAgICAgIFsyLCAwLCAwXV1cbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IyZChbWzEsIDAsIDBdLCBbMSwgMCwgMF0sIFsyLCAwLCAwXV0pO1xuICogY29uc3Qge3ZhbHVlcywgaW5kaWNlc30gPSB0Zi51bmlxdWUoYSwgMSlcbiAqIHZhbHVlcy5wcmludCgpOyAgIC8vIFtbMSwgMF0sXG4gKiAgICAgICAgICAgICAgICAgICAvLyAgWzEsIDBdLFxuICogICAgICAgICAgICAgICAgICAgLy8gIFsyLCAwXV1cbiAqIGluZGljZXMucHJpbnQoKTsgIC8vIFswLCAxLCAxXVxuICogYGBgXG4gKiBAcGFyYW0geCBBIHRlbnNvciAoaW50MzIsIHN0cmluZywgYm9vbCkuXG4gKiBAcGFyYW0gYXhpcyBUaGUgYXhpcyBvZiB0aGUgdGVuc29yIHRvIGZpbmQgdGhlIHVuaXF1ZSBlbGVtZW50cy5cbiAqIEByZXR1cm5zIFt1bmlxdWVFbGVtZW50cywgaW5kaWNlc10gKHNlZSBhYm92ZSBmb3IgZGV0YWlscylcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdFdmFsdWF0aW9uJ31cbiAqL1xuZnVuY3Rpb24gdW5pcXVlXyh4LCBheGlzID0gMCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3VuaXF1ZScsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICAgIGFzc2VydCgkeC5yYW5rID4gMCwgKCkgPT4gJ1RoZSBpbnB1dCB0ZW5zb3IgbXVzdCBiZSBhdCBsZWFzdCAxRCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICBjb25zdCBhdHRycyA9IHsgYXhpcyB9O1xuICAgIGNvbnN0IFt2YWx1ZXMsIGluZGljZXNdID0gRU5HSU5FLnJ1bktlcm5lbChVbmlxdWUsIGlucHV0cywgYXR0cnMpO1xuICAgIHJldHVybiB7IHZhbHVlcywgaW5kaWNlcyB9O1xufVxuZXhwb3J0IGNvbnN0IHVuaXF1ZSA9IG9wKHsgdW5pcXVlXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVuaXF1ZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgVW5zb3J0ZWRTZWdtZW50U3VtIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnQsIGlzSW50IH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIHN1bSBhbG9uZyBzZWdtZW50cyBvZiBhIGB0Zi5UZW5zb3JgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDMsIDRdKTtcbiAqIGNvbnN0IHNlZ21lbnRJZHMgPSB0Zi50ZW5zb3IxZChbMSwgMiwgMCwgMV0sICdpbnQzMicpO1xuICogY29uc3QgbnVtU2VnbWVudHMgPSAzO1xuICpcbiAqIHgudW5zb3J0ZWRTZWdtZW50U3VtKHNlZ21lbnRJZHMsIG51bVNlZ21lbnRzKS5wcmludCgpXG4gKiAvL29yIHRmLnVuc29ydGVkU2VnbWVudFN1bSh4LCBzZWdtZW50SWRzLCBudW1TZWdtZW50cylcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGB0Zi5UZW5zb3JgIHRoYXQgd2lsbCBiZSBzdW1tZWQgYWxvbmcgaXRzIHNlZ21lbnRzLlxuICogQHBhcmFtIHNlZ21lbnRJZHMgQSBgdGYuVGVuc29yMURgIHdob3NlIHJhbmsgaXMgZXF1YWwgdG8gdGhlIHJhbmsgb2YgYHhgJ3NcbiAqIGRpbWVuc2lvbiBhbG9uZyB0aGUgYGF4aXNgLiAgTWFwcyBlYWNoIGVsZW1lbnQgb2YgYHhgIHRvIGEgc2VnbWVudC5cbiAqIEBwYXJhbSBudW1TZWdtZW50cyBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IGBzZWdtZW50SWRzYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTZWdtZW50J31cbiAqL1xuZnVuY3Rpb24gdW5zb3J0ZWRTZWdtZW50U3VtXyh4LCBzZWdtZW50SWRzLCBudW1TZWdtZW50cykge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3Vuc29ydGVkU2VnbWVudFN1bScpO1xuICAgIGNvbnN0ICRzZWdtZW50SWRzID0gY29udmVydFRvVGVuc29yKHNlZ21lbnRJZHMsICdzZWdtZW50SWRzJywgJ3Vuc29ydGVkU2VnbWVudFN1bScsICdpbnQzMicpO1xuICAgIGFzc2VydChpc0ludChudW1TZWdtZW50cyksICgpID0+ICdudW1TZWdtZW50cyBtdXN0IGJlIG9mIGR0eXBlIGludCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHgsIHNlZ21lbnRJZHM6ICRzZWdtZW50SWRzIH07XG4gICAgY29uc3QgYXR0cnMgPSB7IG51bVNlZ21lbnRzIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoVW5zb3J0ZWRTZWdtZW50U3VtLCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCB1bnNvcnRlZFNlZ21lbnRTdW0gPSBvcCh7IHVuc29ydGVkU2VnbWVudFN1bV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD11bnNvcnRlZF9zZWdtZW50X3N1bS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgVW5wYWNrIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIFVuc3RhY2tzIGEgYHRmLlRlbnNvcmAgb2YgcmFuay1gUmAgaW50byBhIGxpc3Qgb2YgcmFuay1gKFItMSlgIGB0Zi5UZW5zb3Jgcy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjJkKFsxLCAyLCAzLCA0XSwgWzIsIDJdKTtcbiAqXG4gKiB0Zi51bnN0YWNrKGEpLmZvckVhY2godGVuc29yID0+IHRlbnNvci5wcmludCgpKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IEEgdGVuc29yIG9iamVjdC5cbiAqIEBwYXJhbSBheGlzIFRoZSBheGlzIHRvIHVuc3RhY2sgYWxvbmcuIERlZmF1bHRzIHRvIDAgKHRoZSBmaXJzdCBkaW0pLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1NsaWNpbmcgYW5kIEpvaW5pbmcnfVxuICovXG5mdW5jdGlvbiB1bnN0YWNrXyh4LCBheGlzID0gMCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3Vuc3RhY2snLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgICB1dGlsLmFzc2VydChheGlzID49IC0keC5zaGFwZS5sZW5ndGggJiYgYXhpcyA8ICR4LnNoYXBlLmxlbmd0aCwgKCkgPT4gYEF4aXMgPSAke2F4aXN9IGlzIG5vdCBpbiBbLSR7JHguc2hhcGUubGVuZ3RofSwgJHskeC5zaGFwZS5sZW5ndGh9KWApO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgdmFsdWU6ICR4IH07XG4gICAgY29uc3QgYXR0cnMgPSB7IGF4aXMgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChVbnBhY2ssIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IHVuc3RhY2sgPSBvcCh7IHVuc3RhY2tfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dW5zdGFjay5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHZhcmlhYmxlIHdpdGggdGhlIHByb3ZpZGVkIGluaXRpYWwgdmFsdWUuXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnZhcmlhYmxlKHRmLnRlbnNvcihbMSwgMiwgM10pKTtcbiAqIHguYXNzaWduKHRmLnRlbnNvcihbNCwgNSwgNl0pKTtcbiAqXG4gKiB4LnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gaW5pdGlhbFZhbHVlIEluaXRpYWwgdmFsdWUgZm9yIHRoZSB0ZW5zb3IuXG4gKiBAcGFyYW0gdHJhaW5hYmxlIElmIHRydWUsIG9wdGltaXplcnMgYXJlIGFsbG93ZWQgdG8gdXBkYXRlIGl0LlxuICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdmFyaWFibGUuIERlZmF1bHRzIHRvIGEgdW5pcXVlIGlkLlxuICogQHBhcmFtIGR0eXBlIElmIHNldCwgaW5pdGlhbFZhbHVlIHdpbGwgYmUgY29udmVydGVkIHRvIHRoZSBnaXZlbiB0eXBlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhcmlhYmxlKGluaXRpYWxWYWx1ZSwgdHJhaW5hYmxlID0gdHJ1ZSwgbmFtZSwgZHR5cGUpIHtcbiAgICByZXR1cm4gRU5HSU5FLm1ha2VWYXJpYWJsZShpbml0aWFsVmFsdWUsIHRyYWluYWJsZSwgbmFtZSwgZHR5cGUpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dmFyaWFibGUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFNlbGVjdCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYnJvYWRjYXN0VG8gfSBmcm9tICcuL2Jyb2FkY2FzdF90byc7XG5pbXBvcnQgeyBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSB9IGZyb20gJy4vYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIFJldHVybnMgdGhlIGVsZW1lbnRzLCBlaXRoZXIgYGFgIG9yIGBiYCBkZXBlbmRpbmcgb24gdGhlIGBjb25kaXRpb25gLlxuICpcbiAqIElmIHRoZSBjb25kaXRpb24gaXMgdHJ1ZSwgc2VsZWN0IGZyb20gYGFgLCBvdGhlcndpc2Ugc2VsZWN0IGZyb20gYGJgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBjb25kID0gdGYudGVuc29yMWQoW2ZhbHNlLCBmYWxzZSwgdHJ1ZV0sICdib29sJyk7XG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEgLCAyLCAzXSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWy0xLCAtMiwgLTNdKTtcbiAqXG4gKiBhLndoZXJlKGNvbmQsIGIpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gY29uZGl0aW9uIFRoZSBpbnB1dCBjb25kaXRpb24uIE11c3QgYmUgb2YgZHR5cGUgYm9vbC5cbiAqIEBwYXJhbSBhIElmIGBjb25kaXRpb25gIGlzIHJhbmsgMSwgYGFgIG1heSBoYXZlIGEgaGlnaGVyIHJhbmsgYnV0XG4gKiAgICAgaXRzIGZpcnN0IGRpbWVuc2lvbiBtdXN0IG1hdGNoIHRoZSBzaXplIG9mIGBjb25kaXRpb25gLlxuICogQHBhcmFtIGIgQSB0ZW5zb3Igd2l0aCB0aGUgc2FtZSBkdHlwZSBhcyBgYWAgYW5kIHdpdGggc2hhcGUgdGhhdCBpc1xuICogICAgIGNvbXBhdGlibGUgd2l0aCBgYWAuXG4gKiBAcmV0dXJuIEEgdGVuc29yIHdpdGggc2FtZSBkdHlwZSBhcyBgYWAgYW5kIGBiYCwgYW5kIHNoYXBlIHRoYXQgaXNcbiAqICAgICBicm9hZGNhc3RhYmxlIGZyb20gYGFgIGFuZCBgYmAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTG9naWNhbCd9XG4gKi9cbmZ1bmN0aW9uIHdoZXJlXyhjb25kaXRpb24sIGEsIGIpIHtcbiAgICBjb25zdCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICd3aGVyZScpO1xuICAgIGNvbnN0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ3doZXJlJyk7XG4gICAgY29uc3QgJGNvbmRpdGlvbiA9IGNvbnZlcnRUb1RlbnNvcihjb25kaXRpb24sICdjb25kaXRpb24nLCAnd2hlcmUnLCAnYm9vbCcpO1xuICAgIC8vIFRPRE86IG1vdmUgdGhpcyBsb2dpYyB0byBmb3J3YXJkIGZ1bmN0aW9uIHdoZW4gdGhlIGJyb2FkY2FzdFRvIG9wIGlzXG4gICAgLy8gaW1wbGVtZW50ZWQgaW4gV0FTTS5cbiAgICAvLyBGaW5kIHRoZSBicm9hZGNhc3RhYmxlIHNoYXBlIGZvciAkY29uZGl0aW9uLCAkYSwgYW5kICRiLlxuICAgIGNvbnN0IGJyb2FkY2FzdFNoYXBlID0gYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoJGNvbmRpdGlvbi5zaGFwZSwgJGEuc2hhcGUpLCAkYi5zaGFwZSk7XG4gICAgY29uc3QgJGJyb2FkY2FzdGVkQ29uZGl0aW9uID0gYnJvYWRjYXN0VG8oJGNvbmRpdGlvbiwgYnJvYWRjYXN0U2hhcGUpO1xuICAgIGNvbnN0ICRicm9hZGNhc3RlZEEgPSBicm9hZGNhc3RUbygkYSwgYnJvYWRjYXN0U2hhcGUpO1xuICAgIGNvbnN0ICRicm9hZGNhc3RlZEIgPSBicm9hZGNhc3RUbygkYiwgYnJvYWRjYXN0U2hhcGUpO1xuICAgIGNvbnN0IGlucHV0cyA9IHtcbiAgICAgICAgY29uZGl0aW9uOiAkYnJvYWRjYXN0ZWRDb25kaXRpb24sXG4gICAgICAgIHQ6ICRicm9hZGNhc3RlZEEsXG4gICAgICAgIGU6ICRicm9hZGNhc3RlZEJcbiAgICB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFNlbGVjdCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCB3aGVyZSA9IG9wKHsgd2hlcmVfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d2hlcmUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgd2hlcmVJbXBsIH0gZnJvbSAnLi4vYmFja2VuZHMvd2hlcmVfaW1wbCc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBjb29yZGluYXRlcyBvZiB0cnVlIGVsZW1lbnRzIG9mIGNvbmRpdGlvbi5cbiAqXG4gKiBUaGUgY29vcmRpbmF0ZXMgYXJlIHJldHVybmVkIGluIGEgMi1EIHRlbnNvciB3aGVyZSB0aGUgZmlyc3QgZGltZW5zaW9uIChyb3dzKVxuICogcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIHRydWUgZWxlbWVudHMsIGFuZCB0aGUgc2Vjb25kIGRpbWVuc2lvbiAoY29sdW1ucylcbiAqIHJlcHJlc2VudHMgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSB0cnVlIGVsZW1lbnRzLiBLZWVwIGluIG1pbmQsIHRoZSBzaGFwZSBvZlxuICogdGhlIG91dHB1dCB0ZW5zb3IgY2FuIHZhcnkgZGVwZW5kaW5nIG9uIGhvdyBtYW55IHRydWUgdmFsdWVzIHRoZXJlIGFyZSBpblxuICogaW5wdXQuIEluZGljZXMgYXJlIG91dHB1dCBpbiByb3ctbWFqb3Igb3JkZXIuIFRoZSByZXN1bHRpbmcgdGVuc29yIGhhcyB0aGVcbiAqIHNoYXBlIGBbbnVtVHJ1ZUVsZW1zLCBjb25kaXRpb24ucmFua11gLlxuICpcbiAqIFRoaXMgaXMgYW5hbG9nb3VzIHRvIGNhbGxpbmcgdGhlIHB5dGhvbiBgdGYud2hlcmUoY29uZClgIHdpdGhvdXQgYW4geCBvciB5LlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBjb25kID0gdGYudGVuc29yMWQoW2ZhbHNlLCBmYWxzZSwgdHJ1ZV0sICdib29sJyk7XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCB0Zi53aGVyZUFzeW5jKGNvbmQpO1xuICogcmVzdWx0LnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdMb2dpY2FsJ31cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd2hlcmVBc3luY18oY29uZGl0aW9uKSB7XG4gICAgY29uc3QgJGNvbmRpdGlvbiA9IGNvbnZlcnRUb1RlbnNvcihjb25kaXRpb24sICdjb25kaXRpb24nLCAnd2hlcmVBc3luYycsICdib29sJyk7XG4gICAgY29uc3QgdmFscyA9IGF3YWl0ICRjb25kaXRpb24uZGF0YSgpO1xuICAgIGNvbnN0IHJlcyA9IHdoZXJlSW1wbCgkY29uZGl0aW9uLnNoYXBlLCB2YWxzKTtcbiAgICBpZiAoY29uZGl0aW9uICE9PSAkY29uZGl0aW9uKSB7XG4gICAgICAgICRjb25kaXRpb24uZGlzcG9zZSgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IHdoZXJlQXN5bmMgPSB3aGVyZUFzeW5jXztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXdoZXJlX2FzeW5jLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBtYWtlWmVyb3NUeXBlZEFycmF5LCBzaXplRnJvbVNoYXBlIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBjb21wbGV4IH0gZnJvbSAnLi9jb21wbGV4Jztcbi8qKlxuICogQ3JlYXRlcyBhIGB0Zi5UZW5zb3JgIHdpdGggYWxsIGVsZW1lbnRzIHNldCB0byAwLlxuICpcbiAqIGBgYGpzXG4gKiB0Zi56ZXJvcyhbMiwgMl0pLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gc2hhcGUgQW4gYXJyYXkgb2YgaW50ZWdlcnMgZGVmaW5pbmcgdGhlIG91dHB1dCB0ZW5zb3Igc2hhcGUuXG4gKiBAcGFyYW0gZHR5cGUgVGhlIHR5cGUgb2YgYW4gZWxlbWVudCBpbiB0aGUgcmVzdWx0aW5nIHRlbnNvci4gQ2FuXG4gKiAgICAgYmUgJ2Zsb2F0MzInLCAnaW50MzInIG9yICdib29sJy4gRGVmYXVsdHMgdG8gJ2Zsb2F0Jy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB6ZXJvcyhzaGFwZSwgZHR5cGUgPSAnZmxvYXQzMicpIHtcbiAgICBpZiAoZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICAgIGNvbnN0IHJlYWwgPSB6ZXJvcyhzaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICAgICAgY29uc3QgaW1hZyA9IHplcm9zKHNoYXBlLCAnZmxvYXQzMicpO1xuICAgICAgICByZXR1cm4gY29tcGxleChyZWFsLCBpbWFnKTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWVzID0gbWFrZVplcm9zVHlwZWRBcnJheShzaXplRnJvbVNoYXBlKHNoYXBlKSwgZHR5cGUpO1xuICAgIHJldHVybiBFTkdJTkUubWFrZVRlbnNvcih2YWx1ZXMsIHNoYXBlLCBkdHlwZSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD16ZXJvcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgWmVyb3NMaWtlIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ3JlYXRlcyBhIGB0Zi5UZW5zb3JgIHdpdGggYWxsIGVsZW1lbnRzIHNldCB0byAwIHdpdGggdGhlIHNhbWUgc2hhcGUgYXMgdGhlXG4gKiBnaXZlbiB0ZW5zb3IuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IoWzEsIDJdKTtcbiAqIHRmLnplcm9zTGlrZSh4KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIHRlbnNvciBvZiByZXF1aXJlZCBzaGFwZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmZ1bmN0aW9uIHplcm9zTGlrZV8oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3plcm9zTGlrZScpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChaZXJvc0xpa2UsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgemVyb3NMaWtlID0gb3AoeyB6ZXJvc0xpa2VfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9emVyb3NfbGlrZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgZGlzcG9zZSwgdGlkeSB9IGZyb20gJy4uL2dsb2JhbHMnO1xuaW1wb3J0IHsgYWRkIH0gZnJvbSAnLi4vb3BzL2FkZCc7XG5pbXBvcnQgeyBkaXYgfSBmcm9tICcuLi9vcHMvZGl2JztcbmltcG9ydCB7IG11bCB9IGZyb20gJy4uL29wcy9tdWwnO1xuaW1wb3J0IHsgc3FydCB9IGZyb20gJy4uL29wcy9vcHMnO1xuaW1wb3J0IHsgc3F1YXJlIH0gZnJvbSAnLi4vb3BzL3NxdWFyZSc7XG5pbXBvcnQgeyB6ZXJvc0xpa2UgfSBmcm9tICcuLi9vcHMvemVyb3NfbGlrZSc7XG5pbXBvcnQgeyByZWdpc3RlckNsYXNzIH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbic7XG5pbXBvcnQgeyBPcHRpbWl6ZXIgfSBmcm9tICcuL29wdGltaXplcic7XG4vKiogQGRvY2xpbmsgT3B0aW1pemVyICovXG5leHBvcnQgY2xhc3MgQWRhZGVsdGFPcHRpbWl6ZXIgZXh0ZW5kcyBPcHRpbWl6ZXIge1xuICAgIGNvbnN0cnVjdG9yKGxlYXJuaW5nUmF0ZSwgcmhvLCBlcHNpbG9uID0gbnVsbCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmxlYXJuaW5nUmF0ZSA9IGxlYXJuaW5nUmF0ZTtcbiAgICAgICAgdGhpcy5yaG8gPSByaG87XG4gICAgICAgIHRoaXMuZXBzaWxvbiA9IGVwc2lsb247XG4gICAgICAgIHRoaXMuYWNjdW11bGF0ZWRHcmFkcyA9IFtdO1xuICAgICAgICB0aGlzLmFjY3VtdWxhdGVkVXBkYXRlcyA9IFtdO1xuICAgICAgICBpZiAoZXBzaWxvbiA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmVwc2lsb24gPSBFTkdJTkUuYmFja2VuZC5lcHNpbG9uKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXBwbHlHcmFkaWVudHModmFyaWFibGVHcmFkaWVudHMpIHtcbiAgICAgICAgY29uc3QgdmFyaWFibGVOYW1lcyA9IEFycmF5LmlzQXJyYXkodmFyaWFibGVHcmFkaWVudHMpID9cbiAgICAgICAgICAgIHZhcmlhYmxlR3JhZGllbnRzLm1hcChpdGVtID0+IGl0ZW0ubmFtZSkgOlxuICAgICAgICAgICAgT2JqZWN0LmtleXModmFyaWFibGVHcmFkaWVudHMpO1xuICAgICAgICB2YXJpYWJsZU5hbWVzLmZvckVhY2goKG5hbWUsIGkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gRU5HSU5FLnJlZ2lzdGVyZWRWYXJpYWJsZXNbbmFtZV07XG4gICAgICAgICAgICBjb25zdCB0cmFpbmFibGUgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkR3JhZHNbaV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWNjdW11bGF0ZWRHcmFkc1tpXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lOiBgJHtuYW1lfS9hY2N1bV9ncmFkYCxcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGU6IHRpZHkoKCkgPT4gemVyb3NMaWtlKHZhbHVlKS52YXJpYWJsZSh0cmFpbmFibGUpKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5hY2N1bXVsYXRlZFVwZGF0ZXNbaV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWNjdW11bGF0ZWRVcGRhdGVzW2ldID0ge1xuICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbE5hbWU6IGAke25hbWV9L2FjY3VtX3ZhcmAsXG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlOiB0aWR5KCgpID0+IHplcm9zTGlrZSh2YWx1ZSkudmFyaWFibGUodHJhaW5hYmxlKSlcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZ3JhZGllbnQgPSBBcnJheS5pc0FycmF5KHZhcmlhYmxlR3JhZGllbnRzKSA/XG4gICAgICAgICAgICAgICAgdmFyaWFibGVHcmFkaWVudHNbaV0udGVuc29yIDpcbiAgICAgICAgICAgICAgICB2YXJpYWJsZUdyYWRpZW50c1tuYW1lXTtcbiAgICAgICAgICAgIGlmIChncmFkaWVudCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYWNjdW11bGF0ZWRHcmFkID0gdGhpcy5hY2N1bXVsYXRlZEdyYWRzW2ldLnZhcmlhYmxlO1xuICAgICAgICAgICAgY29uc3QgYWNjdW11bGF0ZWRVcGRhdGUgPSB0aGlzLmFjY3VtdWxhdGVkVXBkYXRlc1tpXS52YXJpYWJsZTtcbiAgICAgICAgICAgIHRpZHkoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0FjY3VtdWxhdGVkR3JhZCA9IGFkZChtdWwoYWNjdW11bGF0ZWRHcmFkLCB0aGlzLnJobyksIG11bChzcXVhcmUoZ3JhZGllbnQpLCAxIC0gdGhpcy5yaG8pKTtcbiAgICAgICAgICAgICAgICBjb25zdCB1cGRhdGVzID0gbXVsKGRpdihzcXJ0KGFkZChhY2N1bXVsYXRlZFVwZGF0ZSwgdGhpcy5lcHNpbG9uKSksIHNxcnQoYWRkKGFjY3VtdWxhdGVkR3JhZCwgdGhpcy5lcHNpbG9uKSkpLCBncmFkaWVudCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3QWNjdW11bGF0ZWRVcGRhdGUgPSBhZGQobXVsKGFjY3VtdWxhdGVkVXBkYXRlLCB0aGlzLnJobyksIG11bChzcXVhcmUodXBkYXRlcyksIDEgLSB0aGlzLnJobykpO1xuICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkR3JhZC5hc3NpZ24obmV3QWNjdW11bGF0ZWRHcmFkKTtcbiAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZFVwZGF0ZS5hc3NpZ24obmV3QWNjdW11bGF0ZWRVcGRhdGUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gYWRkKG11bCh1cGRhdGVzLCAtdGhpcy5sZWFybmluZ1JhdGUpLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgdmFsdWUuYXNzaWduKG5ld1ZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5pbmNyZW1lbnRJdGVyYXRpb25zKCk7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkVXBkYXRlcyAhPSBudWxsKSB7XG4gICAgICAgICAgICBkaXNwb3NlKHRoaXMuYWNjdW11bGF0ZWRHcmFkcy5tYXAodiA9PiB2LnZhcmlhYmxlKSk7XG4gICAgICAgICAgICBkaXNwb3NlKHRoaXMuYWNjdW11bGF0ZWRVcGRhdGVzLm1hcCh2ID0+IHYudmFyaWFibGUpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBnZXRXZWlnaHRzKCkge1xuICAgICAgICAvLyBPcmRlciBtYXR0ZXJzIGZvciBQeXRob24gY29tcGF0aWJpbGl0eS5cbiAgICAgICAgY29uc3QgdmFyaWFibGVzID0gWy4uLnRoaXMuYWNjdW11bGF0ZWRHcmFkcywgLi4udGhpcy5hY2N1bXVsYXRlZFVwZGF0ZXNdO1xuICAgICAgICByZXR1cm4gW2F3YWl0IHRoaXMuc2F2ZUl0ZXJhdGlvbnMoKV0uY29uY2F0KHZhcmlhYmxlcy5tYXAodiA9PiAoeyBuYW1lOiB2Lm9yaWdpbmFsTmFtZSwgdGVuc29yOiB2LnZhcmlhYmxlIH0pKSk7XG4gICAgfVxuICAgIGFzeW5jIHNldFdlaWdodHMod2VpZ2h0VmFsdWVzKSB7XG4gICAgICAgIHdlaWdodFZhbHVlcyA9IGF3YWl0IHRoaXMuZXh0cmFjdEl0ZXJhdGlvbnMod2VpZ2h0VmFsdWVzKTtcbiAgICAgICAgY29uc3QgdmFyaWFibGVDb3VudCA9IHdlaWdodFZhbHVlcy5sZW5ndGggLyAyO1xuICAgICAgICBjb25zdCB0cmFpbmFibGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hY2N1bXVsYXRlZEdyYWRzID1cbiAgICAgICAgICAgIHdlaWdodFZhbHVlcy5zbGljZSgwLCB2YXJpYWJsZUNvdW50KS5tYXAodiA9PiAoe1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogdi5uYW1lLFxuICAgICAgICAgICAgICAgIHZhcmlhYmxlOiB2LnRlbnNvci52YXJpYWJsZSh0cmFpbmFibGUpXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIHRoaXMuYWNjdW11bGF0ZWRVcGRhdGVzID1cbiAgICAgICAgICAgIHdlaWdodFZhbHVlcy5zbGljZSh2YXJpYWJsZUNvdW50LCB2YXJpYWJsZUNvdW50ICogMilcbiAgICAgICAgICAgICAgICAubWFwKHYgPT4gKHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbE5hbWU6IHYubmFtZSxcbiAgICAgICAgICAgICAgICB2YXJpYWJsZTogdi50ZW5zb3IudmFyaWFibGUodHJhaW5hYmxlKVxuICAgICAgICAgICAgfSkpO1xuICAgIH1cbiAgICBnZXRDb25maWcoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnbGVhcm5pbmdSYXRlJzogdGhpcy5sZWFybmluZ1JhdGUsXG4gICAgICAgICAgICAncmhvJzogdGhpcy5yaG8sXG4gICAgICAgICAgICAnZXBzaWxvbic6IHRoaXMuZXBzaWxvblxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBzdGF0aWMgZnJvbUNvbmZpZyhjbHMsIGNvbmZpZykge1xuICAgICAgICByZXR1cm4gbmV3IGNscyhjb25maWdbJ2xlYXJuaW5nUmF0ZSddLCBjb25maWdbJ3JobyddLCBjb25maWdbJ2Vwc2lsb24nXSk7XG4gICAgfVxufVxuLyoqIEBub2NvbGxhcHNlICovXG5BZGFkZWx0YU9wdGltaXplci5jbGFzc05hbWUgPSAnQWRhZGVsdGEnOyAvLyBOYW1lIG1hdHRlcnMgZm9yIFB5dGhvbiBjb21wYXRpYmlsaXR5LlxucmVnaXN0ZXJDbGFzcyhBZGFkZWx0YU9wdGltaXplcik7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hZGFkZWx0YV9vcHRpbWl6ZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IGRpc3Bvc2UsIHRpZHkgfSBmcm9tICcuLi9nbG9iYWxzJztcbmltcG9ydCB7IGFkZCB9IGZyb20gJy4uL29wcy9hZGQnO1xuaW1wb3J0IHsgZGl2IH0gZnJvbSAnLi4vb3BzL2Rpdic7XG5pbXBvcnQgeyBmaWxsIH0gZnJvbSAnLi4vb3BzL2ZpbGwnO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQgeyBzcXJ0IH0gZnJvbSAnLi4vb3BzL3NxcnQnO1xuaW1wb3J0IHsgc3F1YXJlIH0gZnJvbSAnLi4vb3BzL3NxdWFyZSc7XG5pbXBvcnQgeyByZWdpc3RlckNsYXNzIH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbic7XG5pbXBvcnQgeyBPcHRpbWl6ZXIgfSBmcm9tICcuL29wdGltaXplcic7XG4vKiogQGRvY2xpbmsgT3B0aW1pemVyICovXG5leHBvcnQgY2xhc3MgQWRhZ3JhZE9wdGltaXplciBleHRlbmRzIE9wdGltaXplciB7XG4gICAgY29uc3RydWN0b3IobGVhcm5pbmdSYXRlLCBpbml0aWFsQWNjdW11bGF0b3JWYWx1ZSA9IDAuMSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmxlYXJuaW5nUmF0ZSA9IGxlYXJuaW5nUmF0ZTtcbiAgICAgICAgdGhpcy5pbml0aWFsQWNjdW11bGF0b3JWYWx1ZSA9IGluaXRpYWxBY2N1bXVsYXRvclZhbHVlO1xuICAgICAgICB0aGlzLmFjY3VtdWxhdGVkR3JhZHMgPSBbXTtcbiAgICB9XG4gICAgYXBwbHlHcmFkaWVudHModmFyaWFibGVHcmFkaWVudHMpIHtcbiAgICAgICAgY29uc3QgdmFyaWFibGVOYW1lcyA9IEFycmF5LmlzQXJyYXkodmFyaWFibGVHcmFkaWVudHMpID9cbiAgICAgICAgICAgIHZhcmlhYmxlR3JhZGllbnRzLm1hcChpdGVtID0+IGl0ZW0ubmFtZSkgOlxuICAgICAgICAgICAgT2JqZWN0LmtleXModmFyaWFibGVHcmFkaWVudHMpO1xuICAgICAgICB2YXJpYWJsZU5hbWVzLmZvckVhY2goKG5hbWUsIGkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gRU5HSU5FLnJlZ2lzdGVyZWRWYXJpYWJsZXNbbmFtZV07XG4gICAgICAgICAgICBpZiAodGhpcy5hY2N1bXVsYXRlZEdyYWRzW2ldID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0cmFpbmFibGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmFjY3VtdWxhdGVkR3JhZHNbaV0gPSB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogYCR7bmFtZX0vYWNjdW11bGF0b3JgLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogdGlkeSgoKSA9PiBmaWxsKHZhbHVlLnNoYXBlLCB0aGlzLmluaXRpYWxBY2N1bXVsYXRvclZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnZhcmlhYmxlKHRyYWluYWJsZSkpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGdyYWRpZW50ID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JhZGllbnRzW2ldLnRlbnNvciA6XG4gICAgICAgICAgICAgICAgdmFyaWFibGVHcmFkaWVudHNbbmFtZV07XG4gICAgICAgICAgICBpZiAoZ3JhZGllbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFjY3VtdWxhdGVkR3JhZCA9IHRoaXMuYWNjdW11bGF0ZWRHcmFkc1tpXS52YXJpYWJsZTtcbiAgICAgICAgICAgIHRpZHkoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0FjY3VtdWxhdGVkR3JhZCA9IGFkZChhY2N1bXVsYXRlZEdyYWQsIHNxdWFyZShncmFkaWVudCkpO1xuICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkR3JhZC5hc3NpZ24obmV3QWNjdW11bGF0ZWRHcmFkKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IGFkZChtdWwoZGl2KGdyYWRpZW50LCBzcXJ0KGFkZChuZXdBY2N1bXVsYXRlZEdyYWQsIEVOR0lORS5iYWNrZW5kLmVwc2lsb24oKSkpKSwgLXRoaXMubGVhcm5pbmdSYXRlKSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIHZhbHVlLmFzc2lnbihuZXdWYWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaW5jcmVtZW50SXRlcmF0aW9ucygpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICBpZiAodGhpcy5hY2N1bXVsYXRlZEdyYWRzICE9IG51bGwpIHtcbiAgICAgICAgICAgIGRpc3Bvc2UodGhpcy5hY2N1bXVsYXRlZEdyYWRzLm1hcCh2ID0+IHYudmFyaWFibGUpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBnZXRXZWlnaHRzKCkge1xuICAgICAgICAvLyBPcmRlciBtYXR0ZXJzIGZvciBQeXRob24gY29tcGF0aWJpbGl0eS5cbiAgICAgICAgcmV0dXJuIFthd2FpdCB0aGlzLnNhdmVJdGVyYXRpb25zKCldLmNvbmNhdCh0aGlzLmFjY3VtdWxhdGVkR3JhZHMubWFwKHYgPT4gKHsgbmFtZTogdi5vcmlnaW5hbE5hbWUsIHRlbnNvcjogdi52YXJpYWJsZSB9KSkpO1xuICAgIH1cbiAgICBhc3luYyBzZXRXZWlnaHRzKHdlaWdodFZhbHVlcykge1xuICAgICAgICB3ZWlnaHRWYWx1ZXMgPSBhd2FpdCB0aGlzLmV4dHJhY3RJdGVyYXRpb25zKHdlaWdodFZhbHVlcyk7XG4gICAgICAgIGNvbnN0IHRyYWluYWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFjY3VtdWxhdGVkR3JhZHMgPSB3ZWlnaHRWYWx1ZXMubWFwKHYgPT4gKHsgb3JpZ2luYWxOYW1lOiB2Lm5hbWUsIHZhcmlhYmxlOiB2LnRlbnNvci52YXJpYWJsZSh0cmFpbmFibGUpIH0pKTtcbiAgICB9XG4gICAgZ2V0Q29uZmlnKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ2xlYXJuaW5nUmF0ZSc6IHRoaXMubGVhcm5pbmdSYXRlLFxuICAgICAgICAgICAgJ2luaXRpYWxBY2N1bXVsYXRvclZhbHVlJzogdGhpcy5pbml0aWFsQWNjdW11bGF0b3JWYWx1ZSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgc3RhdGljIGZyb21Db25maWcoY2xzLCBjb25maWcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBjbHMoY29uZmlnWydsZWFybmluZ1JhdGUnXSwgY29uZmlnWydpbml0aWFsQWNjdW11bGF0b3JWYWx1ZSddKTtcbiAgICB9XG59XG4vKiogQG5vY29sbGFwc2UgKi9cbkFkYWdyYWRPcHRpbWl6ZXIuY2xhc3NOYW1lID0gJ0FkYWdyYWQnOyAvLyBOb3RlOiBOYW1lIG1hdHRlcnMgZm9yIFB5dGhvbiBjb21wYXRpYmlsaXR5LlxucmVnaXN0ZXJDbGFzcyhBZGFncmFkT3B0aW1pemVyKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFkYWdyYWRfb3B0aW1pemVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBkaXNwb3NlLCB0aWR5IH0gZnJvbSAnLi4vZ2xvYmFscyc7XG5pbXBvcnQgeyBhZGQgfSBmcm9tICcuLi9vcHMvYWRkJztcbmltcG9ydCB7IGRpdiB9IGZyb20gJy4uL29wcy9kaXYnO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQgeyBwb3cgfSBmcm9tICcuLi9vcHMvcG93JztcbmltcG9ydCB7IHNjYWxhciB9IGZyb20gJy4uL29wcy9zY2FsYXInO1xuaW1wb3J0IHsgc3FydCB9IGZyb20gJy4uL29wcy9zcXJ0JztcbmltcG9ydCB7IHNxdWFyZSB9IGZyb20gJy4uL29wcy9zcXVhcmUnO1xuaW1wb3J0IHsgc3ViIH0gZnJvbSAnLi4vb3BzL3N1Yic7XG5pbXBvcnQgeyB6ZXJvc0xpa2UgfSBmcm9tICcuLi9vcHMvemVyb3NfbGlrZSc7XG5pbXBvcnQgeyByZWdpc3RlckNsYXNzIH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbic7XG5pbXBvcnQgeyBPcHRpbWl6ZXIgfSBmcm9tICcuL29wdGltaXplcic7XG5leHBvcnQgY2xhc3MgQWRhbU9wdGltaXplciBleHRlbmRzIE9wdGltaXplciB7XG4gICAgY29uc3RydWN0b3IobGVhcm5pbmdSYXRlLCBiZXRhMSwgYmV0YTIsIGVwc2lsb24gPSBudWxsKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMubGVhcm5pbmdSYXRlID0gbGVhcm5pbmdSYXRlO1xuICAgICAgICB0aGlzLmJldGExID0gYmV0YTE7XG4gICAgICAgIHRoaXMuYmV0YTIgPSBiZXRhMjtcbiAgICAgICAgdGhpcy5lcHNpbG9uID0gZXBzaWxvbjtcbiAgICAgICAgdGhpcy5hY2N1bXVsYXRlZEZpcnN0TW9tZW50ID0gW107XG4gICAgICAgIHRoaXMuYWNjdW11bGF0ZWRTZWNvbmRNb21lbnQgPSBbXTtcbiAgICAgICAgdGlkeSgoKSA9PiB7XG4gICAgICAgICAgICAvLyBhY2NCKiB3aWxsIGJlIHVwZGF0ZWQgYnkgYmF0Y2guXG4gICAgICAgICAgICB0aGlzLmFjY0JldGExID0gc2NhbGFyKGJldGExKS52YXJpYWJsZSgpO1xuICAgICAgICAgICAgdGhpcy5hY2NCZXRhMiA9IHNjYWxhcihiZXRhMikudmFyaWFibGUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChlcHNpbG9uID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZXBzaWxvbiA9IEVOR0lORS5iYWNrZW5kLmVwc2lsb24oKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhcHBseUdyYWRpZW50cyh2YXJpYWJsZUdyYWRpZW50cykge1xuICAgICAgICBjb25zdCB2YXJOYW1lcyA9IEFycmF5LmlzQXJyYXkodmFyaWFibGVHcmFkaWVudHMpID9cbiAgICAgICAgICAgIHZhcmlhYmxlR3JhZGllbnRzLm1hcCh2ID0+IHYubmFtZSkgOlxuICAgICAgICAgICAgT2JqZWN0LmtleXModmFyaWFibGVHcmFkaWVudHMpO1xuICAgICAgICB0aWR5KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9uZU1pbnVzQWNjQmV0YTEgPSBzdWIoMSwgdGhpcy5hY2NCZXRhMSk7XG4gICAgICAgICAgICBjb25zdCBvbmVNaW51c0FjY0JldGEyID0gc3ViKDEsIHRoaXMuYWNjQmV0YTIpO1xuICAgICAgICAgICAgdmFyTmFtZXMuZm9yRWFjaCgobmFtZSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gRU5HSU5FLnJlZ2lzdGVyZWRWYXJpYWJsZXNbbmFtZV07XG4gICAgICAgICAgICAgICAgY29uc3QgdHJhaW5hYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWNjdW11bGF0ZWRGaXJzdE1vbWVudFtpXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWNjdW11bGF0ZWRGaXJzdE1vbWVudFtpXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogYCR7bmFtZX0vbWAsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogdGlkeSgoKSA9PiB6ZXJvc0xpa2UodmFsdWUpLnZhcmlhYmxlKHRyYWluYWJsZSkpXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkU2Vjb25kTW9tZW50W2ldID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY2N1bXVsYXRlZFNlY29uZE1vbWVudFtpXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogYCR7bmFtZX0vdmAsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogdGlkeSgoKSA9PiB6ZXJvc0xpa2UodmFsdWUpLnZhcmlhYmxlKHRyYWluYWJsZSkpXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGdyYWRpZW50ID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyYWRpZW50c1tpXS50ZW5zb3IgOlxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyYWRpZW50c1tuYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAoZ3JhZGllbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0TW9tZW50ID0gdGhpcy5hY2N1bXVsYXRlZEZpcnN0TW9tZW50W2ldLnZhcmlhYmxlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlY29uZE1vbWVudCA9IHRoaXMuYWNjdW11bGF0ZWRTZWNvbmRNb21lbnRbaV0udmFyaWFibGU7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Rmlyc3RNb21lbnQgPSBhZGQobXVsKGZpcnN0TW9tZW50LCB0aGlzLmJldGExKSwgbXVsKGdyYWRpZW50LCAxIC0gdGhpcy5iZXRhMSkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1NlY29uZE1vbWVudCA9IGFkZChtdWwoc2Vjb25kTW9tZW50LCB0aGlzLmJldGEyKSwgbXVsKHNxdWFyZShncmFkaWVudCksIDEgLSB0aGlzLmJldGEyKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgYmlhc0NvcnJlY3RlZEZpcnN0TW9tZW50ID0gZGl2KG5ld0ZpcnN0TW9tZW50LCBvbmVNaW51c0FjY0JldGExKTtcbiAgICAgICAgICAgICAgICBjb25zdCBiaWFzQ29ycmVjdGVkU2Vjb25kTW9tZW50ID0gZGl2KG5ld1NlY29uZE1vbWVudCwgb25lTWludXNBY2NCZXRhMik7XG4gICAgICAgICAgICAgICAgZmlyc3RNb21lbnQuYXNzaWduKG5ld0ZpcnN0TW9tZW50KTtcbiAgICAgICAgICAgICAgICBzZWNvbmRNb21lbnQuYXNzaWduKG5ld1NlY29uZE1vbWVudCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBhZGQobXVsKGRpdihiaWFzQ29ycmVjdGVkRmlyc3RNb21lbnQsIGFkZChzcXJ0KGJpYXNDb3JyZWN0ZWRTZWNvbmRNb21lbnQpLCB0aGlzLmVwc2lsb24pKSwgLXRoaXMubGVhcm5pbmdSYXRlKSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIHZhbHVlLmFzc2lnbihuZXdWYWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuYWNjQmV0YTEuYXNzaWduKG11bCh0aGlzLmFjY0JldGExLCB0aGlzLmJldGExKSk7XG4gICAgICAgICAgICB0aGlzLmFjY0JldGEyLmFzc2lnbihtdWwodGhpcy5hY2NCZXRhMiwgdGhpcy5iZXRhMikpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5pbmNyZW1lbnRJdGVyYXRpb25zKCk7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIHRoaXMuYWNjQmV0YTEuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmFjY0JldGEyLmRpc3Bvc2UoKTtcbiAgICAgICAgaWYgKHRoaXMuYWNjdW11bGF0ZWRGaXJzdE1vbWVudCAhPSBudWxsKSB7XG4gICAgICAgICAgICBkaXNwb3NlKHRoaXMuYWNjdW11bGF0ZWRGaXJzdE1vbWVudC5tYXAodiA9PiB2LnZhcmlhYmxlKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYWNjdW11bGF0ZWRTZWNvbmRNb21lbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgZGlzcG9zZSh0aGlzLmFjY3VtdWxhdGVkU2Vjb25kTW9tZW50Lm1hcCh2ID0+IHYudmFyaWFibGUpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBnZXRXZWlnaHRzKCkge1xuICAgICAgICAvLyBPcmRlciBtYXR0ZXJzIGZvciBQeXRob24gY29tcGF0aWJpbGl0eS5cbiAgICAgICAgY29uc3QgdmFyaWFibGVzID0gWy4uLnRoaXMuYWNjdW11bGF0ZWRGaXJzdE1vbWVudCwgLi4udGhpcy5hY2N1bXVsYXRlZFNlY29uZE1vbWVudF07XG4gICAgICAgIHJldHVybiBbYXdhaXQgdGhpcy5zYXZlSXRlcmF0aW9ucygpXS5jb25jYXQodmFyaWFibGVzLm1hcCh2ID0+ICh7IG5hbWU6IHYub3JpZ2luYWxOYW1lLCB0ZW5zb3I6IHYudmFyaWFibGUgfSkpKTtcbiAgICB9XG4gICAgYXN5bmMgc2V0V2VpZ2h0cyh3ZWlnaHRWYWx1ZXMpIHtcbiAgICAgICAgd2VpZ2h0VmFsdWVzID0gYXdhaXQgdGhpcy5leHRyYWN0SXRlcmF0aW9ucyh3ZWlnaHRWYWx1ZXMpO1xuICAgICAgICB0aWR5KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWNjQmV0YTEuYXNzaWduKHBvdyh0aGlzLmJldGExLCB0aGlzLml0ZXJhdGlvbnNfICsgMSkpO1xuICAgICAgICAgICAgdGhpcy5hY2NCZXRhMi5hc3NpZ24ocG93KHRoaXMuYmV0YTIsIHRoaXMuaXRlcmF0aW9uc18gKyAxKSk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB2YXJpYWJsZUNvdW50ID0gd2VpZ2h0VmFsdWVzLmxlbmd0aCAvIDI7XG4gICAgICAgIGNvbnN0IHRyYWluYWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFjY3VtdWxhdGVkRmlyc3RNb21lbnQgPVxuICAgICAgICAgICAgd2VpZ2h0VmFsdWVzLnNsaWNlKDAsIHZhcmlhYmxlQ291bnQpLm1hcCh2ID0+ICh7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lOiB2Lm5hbWUsXG4gICAgICAgICAgICAgICAgdmFyaWFibGU6IHYudGVuc29yLnZhcmlhYmxlKHRyYWluYWJsZSlcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgdGhpcy5hY2N1bXVsYXRlZFNlY29uZE1vbWVudCA9XG4gICAgICAgICAgICB3ZWlnaHRWYWx1ZXMuc2xpY2UodmFyaWFibGVDb3VudCwgdmFyaWFibGVDb3VudCAqIDIpXG4gICAgICAgICAgICAgICAgLm1hcCh2ID0+ICh7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lOiB2Lm5hbWUsXG4gICAgICAgICAgICAgICAgdmFyaWFibGU6IHYudGVuc29yLnZhcmlhYmxlKHRyYWluYWJsZSlcbiAgICAgICAgICAgIH0pKTtcbiAgICB9XG4gICAgZ2V0Q29uZmlnKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ2xlYXJuaW5nUmF0ZSc6IHRoaXMubGVhcm5pbmdSYXRlLFxuICAgICAgICAgICAgJ2JldGExJzogdGhpcy5iZXRhMSxcbiAgICAgICAgICAgICdiZXRhMic6IHRoaXMuYmV0YTIsXG4gICAgICAgICAgICAnZXBzaWxvbic6IHRoaXMuZXBzaWxvbixcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgc3RhdGljIGZyb21Db25maWcoY2xzLCBjb25maWcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBjbHMoY29uZmlnWydsZWFybmluZ1JhdGUnXSwgY29uZmlnWydiZXRhMSddLCBjb25maWdbJ2JldGEyJ10sIGNvbmZpZ1snZXBzaWxvbiddKTtcbiAgICB9XG59XG4vKiogQG5vY29sbGFwc2UgKi9cbkFkYW1PcHRpbWl6ZXIuY2xhc3NOYW1lID0gJ0FkYW0nOyAvLyBOb3RlOiBOYW1lIG1hdHRlcnMgZm9yIFB5dGhvbiBjb21wYXRpYmlsaXR5LlxucmVnaXN0ZXJDbGFzcyhBZGFtT3B0aW1pemVyKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFkYW1fb3B0aW1pemVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBkaXNwb3NlLCB0aWR5IH0gZnJvbSAnLi4vZ2xvYmFscyc7XG5pbXBvcnQgeyBhYnMgfSBmcm9tICcuLi9vcHMvYWJzJztcbmltcG9ydCB7IGFkZCB9IGZyb20gJy4uL29wcy9hZGQnO1xuaW1wb3J0IHsgZGl2IH0gZnJvbSAnLi4vb3BzL2Rpdic7XG5pbXBvcnQgeyBtYXhpbXVtIH0gZnJvbSAnLi4vb3BzL21heGltdW0nO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQgeyBzY2FsYXIgfSBmcm9tICcuLi9vcHMvc2NhbGFyJztcbmltcG9ydCB7IHN1YiB9IGZyb20gJy4uL29wcy9zdWInO1xuaW1wb3J0IHsgemVyb3NMaWtlIH0gZnJvbSAnLi4vb3BzL3plcm9zX2xpa2UnO1xuaW1wb3J0IHsgcmVnaXN0ZXJDbGFzcyB9IGZyb20gJy4uL3NlcmlhbGl6YXRpb24nO1xuaW1wb3J0IHsgT3B0aW1pemVyIH0gZnJvbSAnLi9vcHRpbWl6ZXInO1xuZXhwb3J0IGNsYXNzIEFkYW1heE9wdGltaXplciBleHRlbmRzIE9wdGltaXplciB7XG4gICAgY29uc3RydWN0b3IobGVhcm5pbmdSYXRlLCBiZXRhMSwgYmV0YTIsIGVwc2lsb24gPSBudWxsLCBkZWNheSA9IDAuMCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmxlYXJuaW5nUmF0ZSA9IGxlYXJuaW5nUmF0ZTtcbiAgICAgICAgdGhpcy5iZXRhMSA9IGJldGExO1xuICAgICAgICB0aGlzLmJldGEyID0gYmV0YTI7XG4gICAgICAgIHRoaXMuZXBzaWxvbiA9IGVwc2lsb247XG4gICAgICAgIHRoaXMuZGVjYXkgPSBkZWNheTtcbiAgICAgICAgdGhpcy5hY2N1bXVsYXRlZEZpcnN0TW9tZW50ID0gW107XG4gICAgICAgIHRoaXMuYWNjdW11bGF0ZWRXZWlnaHRlZEluZk5vcm0gPSBbXTtcbiAgICAgICAgdGlkeSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLml0ZXJhdGlvbiA9IHNjYWxhcigwKS52YXJpYWJsZSgpO1xuICAgICAgICAgICAgdGhpcy5hY2NCZXRhMSA9IHNjYWxhcihiZXRhMSkudmFyaWFibGUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChlcHNpbG9uID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZXBzaWxvbiA9IEVOR0lORS5iYWNrZW5kLmVwc2lsb24oKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhcHBseUdyYWRpZW50cyh2YXJpYWJsZUdyYWRpZW50cykge1xuICAgICAgICBjb25zdCB2YXJpYWJsZU5hbWVzID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICAgICAgdmFyaWFibGVHcmFkaWVudHMubWFwKGl0ZW0gPT4gaXRlbS5uYW1lKSA6XG4gICAgICAgICAgICBPYmplY3Qua2V5cyh2YXJpYWJsZUdyYWRpZW50cyk7XG4gICAgICAgIHRpZHkoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb25lTWludXNBY2NCZXRhMSA9IHN1YigxLCB0aGlzLmFjY0JldGExKTtcbiAgICAgICAgICAgIGNvbnN0IGxyID0gZGl2KC10aGlzLmxlYXJuaW5nUmF0ZSwgYWRkKG11bCh0aGlzLml0ZXJhdGlvbiwgdGhpcy5kZWNheSksIDEpKTtcbiAgICAgICAgICAgIHZhcmlhYmxlTmFtZXMuZm9yRWFjaCgobmFtZSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gRU5HSU5FLnJlZ2lzdGVyZWRWYXJpYWJsZXNbbmFtZV07XG4gICAgICAgICAgICAgICAgY29uc3QgdHJhaW5hYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWNjdW11bGF0ZWRGaXJzdE1vbWVudFtpXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWNjdW11bGF0ZWRGaXJzdE1vbWVudFtpXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogYCR7bmFtZX0vbWAsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogemVyb3NMaWtlKHZhbHVlKS52YXJpYWJsZSh0cmFpbmFibGUpXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkV2VpZ2h0ZWRJbmZOb3JtW2ldID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY2N1bXVsYXRlZFdlaWdodGVkSW5mTm9ybVtpXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogYCR7bmFtZX0vdmAsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogemVyb3NMaWtlKHZhbHVlKS52YXJpYWJsZSh0cmFpbmFibGUpXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGdyYWRpZW50ID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyYWRpZW50c1tpXS50ZW5zb3IgOlxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyYWRpZW50c1tuYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAoZ3JhZGllbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0TW9tZW50ID0gdGhpcy5hY2N1bXVsYXRlZEZpcnN0TW9tZW50W2ldLnZhcmlhYmxlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHdlaWdodGVkSW5mTm9ybSA9IHRoaXMuYWNjdW11bGF0ZWRXZWlnaHRlZEluZk5vcm1baV0udmFyaWFibGU7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Rmlyc3RNb21lbnQgPSBhZGQobXVsKGZpcnN0TW9tZW50LCB0aGlzLmJldGExKSwgbXVsKGdyYWRpZW50LCAxIC0gdGhpcy5iZXRhMSkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHV0MCA9IG11bCh3ZWlnaHRlZEluZk5vcm0sIHRoaXMuYmV0YTIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHV0MSA9IGFicyhncmFkaWVudCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3V2VpZ2h0ZWRJbmZOb3JtID0gbWF4aW11bSh1dDAsIHV0MSk7XG4gICAgICAgICAgICAgICAgZmlyc3RNb21lbnQuYXNzaWduKG5ld0ZpcnN0TW9tZW50KTtcbiAgICAgICAgICAgICAgICB3ZWlnaHRlZEluZk5vcm0uYXNzaWduKG5ld1dlaWdodGVkSW5mTm9ybSk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBhZGQobXVsKGRpdihsciwgb25lTWludXNBY2NCZXRhMSksIGRpdihuZXdGaXJzdE1vbWVudCwgYWRkKG5ld1dlaWdodGVkSW5mTm9ybSwgdGhpcy5lcHNpbG9uKSkpLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgdmFsdWUuYXNzaWduKG5ld1ZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5pdGVyYXRpb24uYXNzaWduKGFkZCh0aGlzLml0ZXJhdGlvbiwgMSkpO1xuICAgICAgICAgICAgdGhpcy5hY2NCZXRhMS5hc3NpZ24obXVsKHRoaXMuYWNjQmV0YTEsIHRoaXMuYmV0YTEpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaW5jcmVtZW50SXRlcmF0aW9ucygpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLmFjY0JldGExLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5pdGVyYXRpb24uZGlzcG9zZSgpO1xuICAgICAgICBpZiAodGhpcy5hY2N1bXVsYXRlZEZpcnN0TW9tZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGRpc3Bvc2UodGhpcy5hY2N1bXVsYXRlZEZpcnN0TW9tZW50Lm1hcCh2ID0+IHYudmFyaWFibGUpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hY2N1bXVsYXRlZFdlaWdodGVkSW5mTm9ybSAhPSBudWxsKSB7XG4gICAgICAgICAgICBkaXNwb3NlKHRoaXMuYWNjdW11bGF0ZWRXZWlnaHRlZEluZk5vcm0ubWFwKHYgPT4gdi52YXJpYWJsZSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGdldFdlaWdodHMoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZ2V0V2VpZ2h0cygpIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgQWRhbWF4IHlldC4nKTtcbiAgICB9XG4gICAgYXN5bmMgc2V0V2VpZ2h0cyh3ZWlnaHRWYWx1ZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzZXRXZWlnaHRzKCkgaXMgbm90IGltcGxlbWVudGVkIGZvciBBZGFtYXggeWV0LicpO1xuICAgIH1cbiAgICBnZXRDb25maWcoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnbGVhcm5pbmdSYXRlJzogdGhpcy5sZWFybmluZ1JhdGUsXG4gICAgICAgICAgICAnYmV0YTEnOiB0aGlzLmJldGExLFxuICAgICAgICAgICAgJ2JldGEyJzogdGhpcy5iZXRhMixcbiAgICAgICAgICAgICdlcHNpbG9uJzogdGhpcy5lcHNpbG9uLFxuICAgICAgICAgICAgJ2RlY2F5JzogdGhpcy5kZWNheVxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBzdGF0aWMgZnJvbUNvbmZpZyhjbHMsIGNvbmZpZykge1xuICAgICAgICByZXR1cm4gbmV3IGNscyhjb25maWdbJ2xlYXJuaW5nUmF0ZSddLCBjb25maWdbJ2JldGExJ10sIGNvbmZpZ1snYmV0YTInXSwgY29uZmlnWydlcHNpbG9uJ10sIGNvbmZpZ1snZGVjYXknXSk7XG4gICAgfVxufVxuLyoqIEBub2NvbGxhcHNlICovXG5BZGFtYXhPcHRpbWl6ZXIuY2xhc3NOYW1lID0gJ0FkYW1heCc7IC8vIE5vdGU6IE5hbWUgbWF0dGVycyBmb3IgUHl0aG9uIGNvbXBhdGJpbGl0eS5cbnJlZ2lzdGVyQ2xhc3MoQWRhbWF4T3B0aW1pemVyKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFkYW1heF9vcHRpbWl6ZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IGRpc3Bvc2UsIHRpZHkgfSBmcm9tICcuLi9nbG9iYWxzJztcbmltcG9ydCB7IGFkZCB9IGZyb20gJy4uL29wcy9hZGQnO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQgeyBzY2FsYXIgfSBmcm9tICcuLi9vcHMvc2NhbGFyJztcbmltcG9ydCB7IHplcm9zTGlrZSB9IGZyb20gJy4uL29wcy96ZXJvc19saWtlJztcbmltcG9ydCB7IHJlZ2lzdGVyQ2xhc3MgfSBmcm9tICcuLi9zZXJpYWxpemF0aW9uJztcbmltcG9ydCB7IFNHRE9wdGltaXplciB9IGZyb20gJy4vc2dkX29wdGltaXplcic7XG4vKiogQGRvY2xpbmsgT3B0aW1pemVyICovXG5leHBvcnQgY2xhc3MgTW9tZW50dW1PcHRpbWl6ZXIgZXh0ZW5kcyBTR0RPcHRpbWl6ZXIge1xuICAgIGNvbnN0cnVjdG9yKGxlYXJuaW5nUmF0ZSwgbW9tZW50dW0sIHVzZU5lc3Rlcm92ID0gZmFsc2UpIHtcbiAgICAgICAgc3VwZXIobGVhcm5pbmdSYXRlKTtcbiAgICAgICAgdGhpcy5sZWFybmluZ1JhdGUgPSBsZWFybmluZ1JhdGU7XG4gICAgICAgIHRoaXMubW9tZW50dW0gPSBtb21lbnR1bTtcbiAgICAgICAgdGhpcy51c2VOZXN0ZXJvdiA9IHVzZU5lc3Rlcm92O1xuICAgICAgICB0aGlzLmFjY3VtdWxhdGlvbnMgPSBbXTtcbiAgICAgICAgdGhpcy5tID0gc2NhbGFyKHRoaXMubW9tZW50dW0pO1xuICAgIH1cbiAgICBhcHBseUdyYWRpZW50cyh2YXJpYWJsZUdyYWRpZW50cykge1xuICAgICAgICBjb25zdCB2YXJpYWJsZU5hbWVzID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICAgICAgdmFyaWFibGVHcmFkaWVudHMubWFwKGl0ZW0gPT4gaXRlbS5uYW1lKSA6XG4gICAgICAgICAgICBPYmplY3Qua2V5cyh2YXJpYWJsZUdyYWRpZW50cyk7XG4gICAgICAgIHZhcmlhYmxlTmFtZXMuZm9yRWFjaCgobmFtZSwgaSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBFTkdJTkUucmVnaXN0ZXJlZFZhcmlhYmxlc1tuYW1lXTtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGlvbnNbaV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRyYWluYWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuYWNjdW11bGF0aW9uc1tpXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lOiBgJHtuYW1lfS9tb21lbnR1bWAsXG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlOiB0aWR5KCgpID0+IHplcm9zTGlrZSh2YWx1ZSkudmFyaWFibGUodHJhaW5hYmxlKSlcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYWNjdW11bGF0aW9uID0gdGhpcy5hY2N1bXVsYXRpb25zW2ldLnZhcmlhYmxlO1xuICAgICAgICAgICAgY29uc3QgZ3JhZGllbnQgPSBBcnJheS5pc0FycmF5KHZhcmlhYmxlR3JhZGllbnRzKSA/XG4gICAgICAgICAgICAgICAgdmFyaWFibGVHcmFkaWVudHNbaV0udGVuc29yIDpcbiAgICAgICAgICAgICAgICB2YXJpYWJsZUdyYWRpZW50c1tuYW1lXTtcbiAgICAgICAgICAgIGlmIChncmFkaWVudCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGlkeSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IG5ld1ZhbHVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0FjY3VtdWxhdGlvbiA9IGFkZChtdWwodGhpcy5tLCBhY2N1bXVsYXRpb24pLCBncmFkaWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudXNlTmVzdGVyb3YpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWUgPSBhZGQobXVsKHRoaXMuYywgYWRkKGdyYWRpZW50LCBtdWwobmV3QWNjdW11bGF0aW9uLCB0aGlzLm0pKSksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gYWRkKG11bCh0aGlzLmMsIG5ld0FjY3VtdWxhdGlvbiksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYWNjdW11bGF0aW9uLmFzc2lnbihuZXdBY2N1bXVsYXRpb24pO1xuICAgICAgICAgICAgICAgIHZhbHVlLmFzc2lnbihuZXdWYWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaW5jcmVtZW50SXRlcmF0aW9ucygpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLm0uZGlzcG9zZSgpO1xuICAgICAgICBpZiAodGhpcy5hY2N1bXVsYXRpb25zICE9IG51bGwpIHtcbiAgICAgICAgICAgIGRpc3Bvc2UodGhpcy5hY2N1bXVsYXRpb25zLm1hcCh2ID0+IHYudmFyaWFibGUpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBtb21lbnR1bSBvZiB0aGUgb3B0aW1pemVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIG1vbWVudHVtXG4gICAgICovXG4gICAgc2V0TW9tZW50dW0obW9tZW50dW0pIHtcbiAgICAgICAgdGhpcy5tb21lbnR1bSA9IG1vbWVudHVtO1xuICAgIH1cbiAgICBhc3luYyBnZXRXZWlnaHRzKCkge1xuICAgICAgICAvLyBPcmRlciBtYXR0ZXJzIGZvciBQeXRob24gY29tcGF0aWJpbGl0eS5cbiAgICAgICAgcmV0dXJuIFthd2FpdCB0aGlzLnNhdmVJdGVyYXRpb25zKCldLmNvbmNhdCh0aGlzLmFjY3VtdWxhdGlvbnMubWFwKHYgPT4gKHsgbmFtZTogdi5vcmlnaW5hbE5hbWUsIHRlbnNvcjogdi52YXJpYWJsZSB9KSkpO1xuICAgIH1cbiAgICBhc3luYyBzZXRXZWlnaHRzKHdlaWdodFZhbHVlcykge1xuICAgICAgICB3ZWlnaHRWYWx1ZXMgPSBhd2FpdCB0aGlzLmV4dHJhY3RJdGVyYXRpb25zKHdlaWdodFZhbHVlcyk7XG4gICAgICAgIGNvbnN0IHRyYWluYWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFjY3VtdWxhdGlvbnMgPSB3ZWlnaHRWYWx1ZXMubWFwKHYgPT4gKHsgb3JpZ2luYWxOYW1lOiB2Lm5hbWUsIHZhcmlhYmxlOiB2LnRlbnNvci52YXJpYWJsZSh0cmFpbmFibGUpIH0pKTtcbiAgICB9XG4gICAgZ2V0Q29uZmlnKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ2xlYXJuaW5nUmF0ZSc6IHRoaXMubGVhcm5pbmdSYXRlLFxuICAgICAgICAgICAgJ21vbWVudHVtJzogdGhpcy5tb21lbnR1bSxcbiAgICAgICAgICAgICd1c2VOZXN0ZXJvdic6IHRoaXMudXNlTmVzdGVyb3ZcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgc3RhdGljIGZyb21Db25maWcoY2xzLCBjb25maWcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBjbHMoY29uZmlnWydsZWFybmluZ1JhdGUnXSwgY29uZmlnWydtb21lbnR1bSddLCBjb25maWdbJ3VzZU5lc3Rlcm92J10pO1xuICAgIH1cbn1cbi8qKiBAbm9jb2xsYXBzZSAqL1xuTW9tZW50dW1PcHRpbWl6ZXIuY2xhc3NOYW1lID0gJ01vbWVudHVtJzsgLy8gTmFtZSBtYXR0ZXJzIGZvciBQeXRob24gY29tcGF0aWJpbGl0eS5cbnJlZ2lzdGVyQ2xhc3MoTW9tZW50dW1PcHRpbWl6ZXIpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bW9tZW50dW1fb3B0aW1pemVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGRpc3Bvc2UgfSBmcm9tICcuLi9nbG9iYWxzJztcbmltcG9ydCB7IHZhcmlhYmxlR3JhZHMgfSBmcm9tICcuLi9ncmFkaWVudHMnO1xuaW1wb3J0IHsgc2NhbGFyIH0gZnJvbSAnLi4vb3BzL29wcyc7XG5pbXBvcnQgeyBTZXJpYWxpemFibGUgfSBmcm9tICcuLi9zZXJpYWxpemF0aW9uJztcbi8qKiBAZG9jIHtoZWFkaW5nOiAnVHJhaW5pbmcnLCBzdWJoZWFkaW5nOiAnQ2xhc3NlcycsIG5hbWVzcGFjZTogJ3RyYWluJ30gKi9cbmV4cG9ydCBjbGFzcyBPcHRpbWl6ZXIgZXh0ZW5kcyBTZXJpYWxpemFibGUge1xuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIGBmKClgIGFuZCBtaW5pbWl6ZXMgdGhlIHNjYWxhciBvdXRwdXQgb2YgYGYoKWAgYnkgY29tcHV0aW5nXG4gICAgICogZ3JhZGllbnRzIG9mIHkgd2l0aCByZXNwZWN0IHRvIHRoZSBsaXN0IG9mIHRyYWluYWJsZSB2YXJpYWJsZXMgcHJvdmlkZWQgYnlcbiAgICAgKiBgdmFyTGlzdGAuIElmIG5vIGxpc3QgaXMgcHJvdmlkZWQsIGl0IGRlZmF1bHRzIHRvIGFsbCB0cmFpbmFibGUgdmFyaWFibGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGYgVGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgYW5kIHdob3NlIG91dHB1dCB0byBtaW5pbWl6ZS5cbiAgICAgKiBAcGFyYW0gcmV0dXJuQ29zdCBXaGV0aGVyIHRvIHJldHVybiB0aGUgc2NhbGFyIGNvc3QgdmFsdWUgcHJvZHVjZWQgYnlcbiAgICAgKiBleGVjdXRpbmcgYGYoKWAuXG4gICAgICogQHBhcmFtIHZhckxpc3QgQW4gb3B0aW9uYWwgbGlzdCBvZiB2YXJpYWJsZXMgdG8gdXBkYXRlLiBJZiBzcGVjaWZpZWQsIG9ubHlcbiAgICAgKiB0aGUgdHJhaW5hYmxlIHZhcmlhYmxlcyBpbiB2YXJMaXN0IHdpbGwgYmUgdXBkYXRlZCBieSBtaW5pbWl6ZS4gRGVmYXVsdHMgdG9cbiAgICAgKiBhbGwgdHJhaW5hYmxlIHZhcmlhYmxlcy5cbiAgICAgKlxuICAgICAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdPcHRpbWl6ZXJzJ31cbiAgICAgKi9cbiAgICBtaW5pbWl6ZShmLCByZXR1cm5Db3N0ID0gZmFsc2UsIHZhckxpc3QpIHtcbiAgICAgICAgY29uc3QgeyB2YWx1ZSwgZ3JhZHMgfSA9IHRoaXMuY29tcHV0ZUdyYWRpZW50cyhmLCB2YXJMaXN0KTtcbiAgICAgICAgaWYgKHZhckxpc3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgZ3JhZEFycmF5ID0gdmFyTGlzdC5tYXAodiA9PiAoeyBuYW1lOiB2Lm5hbWUsIHRlbnNvcjogZ3JhZHNbdi5uYW1lXSB9KSk7XG4gICAgICAgICAgICB0aGlzLmFwcGx5R3JhZGllbnRzKGdyYWRBcnJheSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFwcGx5R3JhZGllbnRzKGdyYWRzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBEaXNwb3NlIGdyYWRpZW50cy5cbiAgICAgICAgZGlzcG9zZShncmFkcyk7XG4gICAgICAgIGlmIChyZXR1cm5Db3N0KSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZS5kaXNwb3NlKCk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgdGhhdCB0aGlzIG9wdGltaXplciBpbnN0YW5jZSBoYXMgYmVlbiBpbnZva2VkIGZvci5cbiAgICAgKi9cbiAgICBnZXQgaXRlcmF0aW9ucygpIHtcbiAgICAgICAgaWYgKHRoaXMuaXRlcmF0aW9uc18gPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5pdGVyYXRpb25zXyA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlcmF0aW9uc187XG4gICAgfVxuICAgIGluY3JlbWVudEl0ZXJhdGlvbnMoKSB7XG4gICAgICAgIHRoaXMuaXRlcmF0aW9uc18gPSB0aGlzLml0ZXJhdGlvbnMgKyAxO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyBmKCkgYW5kIGNvbXB1dGVzIHRoZSBncmFkaWVudCBvZiB0aGUgc2NhbGFyIG91dHB1dCBvZiBmKCkgd2l0aFxuICAgICAqIHJlc3BlY3QgdG8gdGhlIGxpc3Qgb2YgdHJhaW5hYmxlIHZhcmlhYmxlcyBwcm92aWRlZCBieSBgdmFyTGlzdGAuIElmIG5vXG4gICAgICogbGlzdCBpcyBwcm92aWRlZCwgaXQgZGVmYXVsdHMgdG8gYWxsIHRyYWluYWJsZSB2YXJpYWJsZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZiBUaGUgZnVuY3Rpb24gdG8gZXhlY3V0ZSBhbmQgd2hvc2Ugb3V0cHV0IHRvIHVzZSBmb3IgY29tcHV0aW5nXG4gICAgICogZ3JhZGllbnRzIHdpdGggcmVzcGVjdCB0byB2YXJpYWJsZXMuXG4gICAgICogQHBhcmFtIHZhckxpc3QgQW4gb3B0aW9uYWwgbGlzdCBvZiB2YXJpYWJsZXMgdG8gY29tcHV0ZSBncmFkaWVudHMgd2l0aFxuICAgICAqIHJlc3BlY3QgdG8uIElmIHNwZWNpZmllZCwgb25seSB0aGUgdHJhaW5hYmxlIHZhcmlhYmxlcyBpbiB2YXJMaXN0IHdpbGwgaGF2ZVxuICAgICAqIGdyYWRpZW50cyBjb21wdXRlZCB3aXRoIHJlc3BlY3QgdG8uIERlZmF1bHRzIHRvIGFsbCB0cmFpbmFibGUgdmFyaWFibGVzLlxuICAgICAqXG4gICAgICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ09wdGltaXplcnMnfVxuICAgICAqL1xuICAgIGNvbXB1dGVHcmFkaWVudHMoZiwgdmFyTGlzdCkge1xuICAgICAgICByZXR1cm4gdmFyaWFibGVHcmFkcyhmLCB2YXJMaXN0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGlzcG9zZSB0aGUgdmFyaWFibGVzIChpZiBhbnkpIG93bmVkIGJ5IHRoaXMgb3B0aW1pemVyIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLml0ZXJhdGlvbnNfICE9IG51bGwpIHtcbiAgICAgICAgICAgIGRpc3Bvc2UodGhpcy5pdGVyYXRpb25zXyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgc2F2ZUl0ZXJhdGlvbnMoKSB7XG4gICAgICAgIGlmICh0aGlzLml0ZXJhdGlvbnNfID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuaXRlcmF0aW9uc18gPSAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnaXRlcicsXG4gICAgICAgICAgICAvLyBUT0RPKGNhaXMpOiBVc2UgJ2ludDY0JyB0eXBlIHdoZW4gYXZhaWxhYmxlLlxuICAgICAgICAgICAgdGVuc29yOiBzY2FsYXIodGhpcy5pdGVyYXRpb25zXywgJ2ludDMyJylcbiAgICAgICAgfTtcbiAgICB9XG4gICAgYXN5bmMgZ2V0V2VpZ2h0cygpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdnZXRXZWlnaHRzKCkgaXMgbm90IGltcGxlbWVudGVkIGZvciB0aGlzIG9wdGltaXplciB5ZXQuJyk7XG4gICAgfVxuICAgIGFzeW5jIHNldFdlaWdodHMod2VpZ2h0VmFsdWVzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgc2V0V2VpZ2h0cygpIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgdGhpcyBvcHRpbWl6ZXIgY2xhc3MgYCArXG4gICAgICAgICAgICBgJHt0aGlzLmdldENsYXNzTmFtZSgpfWApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0IHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSB3ZWlnaHQgdmFsdWVzIGFuZCBzZXQgaXRcbiAgICAgKiBhcyB0aGUgaXRlcmF0aW9ucyBjb3VudGVyIHZhcmlhYmxlIG9mIHRoaXMgaW5zdGFuY2Ugb2Ygb3B0aW1pemVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHdlaWdodFZhbHVlc1xuICAgICAqIEByZXR1cm5zIFdlaWdodCB2YWx1ZXMgd2l0aCB0aGUgZmlyc3QgZWxlbWVudCBjb25zdW1lZCBhbmQgZXhjbHVkZWQuXG4gICAgICovXG4gICAgYXN5bmMgZXh0cmFjdEl0ZXJhdGlvbnMod2VpZ2h0VmFsdWVzKSB7XG4gICAgICAgIHRoaXMuaXRlcmF0aW9uc18gPSAoYXdhaXQgd2VpZ2h0VmFsdWVzWzBdLnRlbnNvci5kYXRhKCkpWzBdO1xuICAgICAgICByZXR1cm4gd2VpZ2h0VmFsdWVzLnNsaWNlKDEpO1xuICAgIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShPcHRpbWl6ZXIsIFN5bWJvbC5oYXNJbnN0YW5jZSwge1xuICAgIHZhbHVlOiAoaW5zdGFuY2UpID0+IHtcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlLm1pbmltaXplICE9IG51bGwgJiYgaW5zdGFuY2UuY29tcHV0ZUdyYWRpZW50cyAhPSBudWxsICYmXG4gICAgICAgICAgICBpbnN0YW5jZS5hcHBseUdyYWRpZW50cyAhPSBudWxsO1xuICAgIH1cbn0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b3B0aW1pemVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEFkYWRlbHRhT3B0aW1pemVyIH0gZnJvbSAnLi9hZGFkZWx0YV9vcHRpbWl6ZXInO1xuaW1wb3J0IHsgQWRhZ3JhZE9wdGltaXplciB9IGZyb20gJy4vYWRhZ3JhZF9vcHRpbWl6ZXInO1xuaW1wb3J0IHsgQWRhbU9wdGltaXplciB9IGZyb20gJy4vYWRhbV9vcHRpbWl6ZXInO1xuaW1wb3J0IHsgQWRhbWF4T3B0aW1pemVyIH0gZnJvbSAnLi9hZGFtYXhfb3B0aW1pemVyJztcbmltcG9ydCB7IE1vbWVudHVtT3B0aW1pemVyIH0gZnJvbSAnLi9tb21lbnR1bV9vcHRpbWl6ZXInO1xuaW1wb3J0IHsgUk1TUHJvcE9wdGltaXplciB9IGZyb20gJy4vcm1zcHJvcF9vcHRpbWl6ZXInO1xuaW1wb3J0IHsgU0dET3B0aW1pemVyIH0gZnJvbSAnLi9zZ2Rfb3B0aW1pemVyJztcbmV4cG9ydCBjbGFzcyBPcHRpbWl6ZXJDb25zdHJ1Y3RvcnMge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBgdGYuU0dET3B0aW1pemVyYCB0aGF0IHVzZXMgc3RvY2hhc3RpYyBncmFkaWVudCBkZXNjZW50LlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiAvLyBGaXQgYSBxdWFkcmF0aWMgZnVuY3Rpb24gYnkgbGVhcm5pbmcgdGhlIGNvZWZmaWNpZW50cyBhLCBiLCBjLlxuICAgICAqIGNvbnN0IHhzID0gdGYudGVuc29yMWQoWzAsIDEsIDIsIDNdKTtcbiAgICAgKiBjb25zdCB5cyA9IHRmLnRlbnNvcjFkKFsxLjEsIDUuOSwgMTYuOCwgMzMuOV0pO1xuICAgICAqXG4gICAgICogY29uc3QgYSA9IHRmLnNjYWxhcihNYXRoLnJhbmRvbSgpKS52YXJpYWJsZSgpO1xuICAgICAqIGNvbnN0IGIgPSB0Zi5zY2FsYXIoTWF0aC5yYW5kb20oKSkudmFyaWFibGUoKTtcbiAgICAgKiBjb25zdCBjID0gdGYuc2NhbGFyKE1hdGgucmFuZG9tKCkpLnZhcmlhYmxlKCk7XG4gICAgICpcbiAgICAgKiAvLyB5ID0gYSAqIHheMiArIGIgKiB4ICsgYy5cbiAgICAgKiBjb25zdCBmID0geCA9PiBhLm11bCh4LnNxdWFyZSgpKS5hZGQoYi5tdWwoeCkpLmFkZChjKTtcbiAgICAgKiBjb25zdCBsb3NzID0gKHByZWQsIGxhYmVsKSA9PiBwcmVkLnN1YihsYWJlbCkuc3F1YXJlKCkubWVhbigpO1xuICAgICAqXG4gICAgICogY29uc3QgbGVhcm5pbmdSYXRlID0gMC4wMTtcbiAgICAgKiBjb25zdCBvcHRpbWl6ZXIgPSB0Zi50cmFpbi5zZ2QobGVhcm5pbmdSYXRlKTtcbiAgICAgKlxuICAgICAqIC8vIFRyYWluIHRoZSBtb2RlbC5cbiAgICAgKiBmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHtcbiAgICAgKiAgIG9wdGltaXplci5taW5pbWl6ZSgoKSA9PiBsb3NzKGYoeHMpLCB5cykpO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIC8vIE1ha2UgcHJlZGljdGlvbnMuXG4gICAgICogY29uc29sZS5sb2coXG4gICAgICogICAgIGBhOiAke2EuZGF0YVN5bmMoKX0sIGI6ICR7Yi5kYXRhU3luYygpfSwgYzogJHtjLmRhdGFTeW5jKCl9YCk7XG4gICAgICogY29uc3QgcHJlZHMgPSBmKHhzKS5kYXRhU3luYygpO1xuICAgICAqIHByZWRzLmZvckVhY2goKHByZWQsIGkpID0+IHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGB4OiAke2l9LCBwcmVkOiAke3ByZWR9YCk7XG4gICAgICogfSk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGVhcm5pbmdSYXRlIFRoZSBsZWFybmluZyByYXRlIHRvIHVzZSBmb3IgdGhlIFNHRCBhbGdvcml0aG0uXG4gICAgICpcbiAgICAgKiBAZG9jIHtoZWFkaW5nOiAnVHJhaW5pbmcnLCBzdWJoZWFkaW5nOiAnT3B0aW1pemVycycsIG5hbWVzcGFjZTogJ3RyYWluJ31cbiAgICAgKi9cbiAgICBzdGF0aWMgc2dkKGxlYXJuaW5nUmF0ZSkge1xuICAgICAgICByZXR1cm4gbmV3IFNHRE9wdGltaXplcihsZWFybmluZ1JhdGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgYHRmLk1vbWVudHVtT3B0aW1pemVyYCB0aGF0IHVzZXMgbW9tZW50dW0gZ3JhZGllbnRcbiAgICAgKiBkZXNjZW50LlxuICAgICAqXG4gICAgICogU2VlXG4gICAgICogW2h0dHA6Ly9wcm9jZWVkaW5ncy5tbHIucHJlc3MvdjI4L3N1dHNrZXZlcjEzLnBkZl0oXG4gICAgICogaHR0cDovL3Byb2NlZWRpbmdzLm1sci5wcmVzcy92Mjgvc3V0c2tldmVyMTMucGRmKVxuICAgICAqXG4gICAgICogQHBhcmFtIGxlYXJuaW5nUmF0ZSBUaGUgbGVhcm5pbmcgcmF0ZSB0byB1c2UgZm9yIHRoZSBNb21lbnR1bSBncmFkaWVudFxuICAgICAqIGRlc2NlbnQgYWxnb3JpdGhtLlxuICAgICAqIEBwYXJhbSBtb21lbnR1bSBUaGUgbW9tZW50dW0gdG8gdXNlIGZvciB0aGUgbW9tZW50dW0gZ3JhZGllbnQgZGVzY2VudFxuICAgICAqIGFsZ29yaXRobS5cbiAgICAgKlxuICAgICAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdPcHRpbWl6ZXJzJywgbmFtZXNwYWNlOiAndHJhaW4nfVxuICAgICAqL1xuICAgIHN0YXRpYyBtb21lbnR1bShsZWFybmluZ1JhdGUsIG1vbWVudHVtLCB1c2VOZXN0ZXJvdiA9IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBuZXcgTW9tZW50dW1PcHRpbWl6ZXIobGVhcm5pbmdSYXRlLCBtb21lbnR1bSwgdXNlTmVzdGVyb3YpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgYHRmLlJNU1Byb3BPcHRpbWl6ZXJgIHRoYXQgdXNlcyBSTVNQcm9wIGdyYWRpZW50XG4gICAgICogZGVzY2VudC4gVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIHBsYWluIG1vbWVudHVtIGFuZCBpcyBub3QgY2VudGVyZWRcbiAgICAgKiB2ZXJzaW9uIG9mIFJNU1Byb3AuXG4gICAgICpcbiAgICAgKiBTZWVcbiAgICAgKiBbaHR0cDovL3d3dy5jcy50b3JvbnRvLmVkdS9+dGlqbWVuL2NzYzMyMS9zbGlkZXMvbGVjdHVyZV9zbGlkZXNfbGVjNi5wZGZdKFxuICAgICAqIGh0dHA6Ly93d3cuY3MudG9yb250by5lZHUvfnRpam1lbi9jc2MzMjEvc2xpZGVzL2xlY3R1cmVfc2xpZGVzX2xlYzYucGRmKVxuICAgICAqXG4gICAgICogQHBhcmFtIGxlYXJuaW5nUmF0ZSBUaGUgbGVhcm5pbmcgcmF0ZSB0byB1c2UgZm9yIHRoZSBSTVNQcm9wIGdyYWRpZW50XG4gICAgICogZGVzY2VudCBhbGdvcml0aG0uXG4gICAgICogQHBhcmFtIGRlY2F5IFRoZSBkaXNjb3VudGluZyBmYWN0b3IgZm9yIHRoZSBoaXN0b3J5L2NvbWluZyBncmFkaWVudC5cbiAgICAgKiBAcGFyYW0gbW9tZW50dW0gVGhlIG1vbWVudHVtIHRvIHVzZSBmb3IgdGhlIFJNU1Byb3AgZ3JhZGllbnQgZGVzY2VudFxuICAgICAqIGFsZ29yaXRobS5cbiAgICAgKiBAcGFyYW0gZXBzaWxvbiBTbWFsbCB2YWx1ZSB0byBhdm9pZCB6ZXJvIGRlbm9taW5hdG9yLlxuICAgICAqIEBwYXJhbSBjZW50ZXJlZCBJZiB0cnVlLCBncmFkaWVudHMgYXJlIG5vcm1hbGl6ZWQgYnkgdGhlIGVzdGltYXRlZFxuICAgICAqIHZhcmlhbmNlIG9mIHRoZSBncmFkaWVudC5cbiAgICAgKlxuICAgICAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdPcHRpbWl6ZXJzJywgbmFtZXNwYWNlOiAndHJhaW4nfVxuICAgICAqL1xuICAgIHN0YXRpYyBybXNwcm9wKGxlYXJuaW5nUmF0ZSwgZGVjYXkgPSAuOSwgbW9tZW50dW0gPSAwLjAsIGVwc2lsb24gPSBudWxsLCBjZW50ZXJlZCA9IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBuZXcgUk1TUHJvcE9wdGltaXplcihsZWFybmluZ1JhdGUsIGRlY2F5LCBtb21lbnR1bSwgZXBzaWxvbiwgY2VudGVyZWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgYHRmLkFkYW1PcHRpbWl6ZXJgIHRoYXQgdXNlcyB0aGUgQWRhbSBhbGdvcml0aG0uXG4gICAgICogU2VlIFtodHRwczovL2FyeGl2Lm9yZy9hYnMvMTQxMi42OTgwXShodHRwczovL2FyeGl2Lm9yZy9hYnMvMTQxMi42OTgwKVxuICAgICAqXG4gICAgICogQHBhcmFtIGxlYXJuaW5nUmF0ZSBUaGUgbGVhcm5pbmcgcmF0ZSB0byB1c2UgZm9yIHRoZSBBZGFtIGdyYWRpZW50XG4gICAgICogZGVzY2VudCBhbGdvcml0aG0uXG4gICAgICogQHBhcmFtIGJldGExIFRoZSBleHBvbmVudGlhbCBkZWNheSByYXRlIGZvciB0aGUgMXN0IG1vbWVudCBlc3RpbWF0ZXMuXG4gICAgICogQHBhcmFtIGJldGEyIFRoZSBleHBvbmVudGlhbCBkZWNheSByYXRlIGZvciB0aGUgMm5kIG1vbWVudCBlc3RpbWF0ZXMuXG4gICAgICogQHBhcmFtIGVwc2lsb24gQSBzbWFsbCBjb25zdGFudCBmb3IgbnVtZXJpY2FsIHN0YWJpbGl0eS5cbiAgICAgKlxuICAgICAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdPcHRpbWl6ZXJzJywgbmFtZXNwYWNlOiAndHJhaW4nfVxuICAgICAqL1xuICAgIHN0YXRpYyBhZGFtKGxlYXJuaW5nUmF0ZSA9IDAuMDAxLCBiZXRhMSA9IDAuOSwgYmV0YTIgPSAwLjk5OSwgZXBzaWxvbiA9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBZGFtT3B0aW1pemVyKGxlYXJuaW5nUmF0ZSwgYmV0YTEsIGJldGEyLCBlcHNpbG9uKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIGB0Zi5BZGFkZWx0YU9wdGltaXplcmAgdGhhdCB1c2VzIHRoZSBBZGFkZWx0YSBhbGdvcml0aG0uXG4gICAgICogU2VlIFtodHRwczovL2FyeGl2Lm9yZy9hYnMvMTIxMi41NzAxXShodHRwczovL2FyeGl2Lm9yZy9hYnMvMTIxMi41NzAxKVxuICAgICAqXG4gICAgICogQHBhcmFtIGxlYXJuaW5nUmF0ZSBUaGUgbGVhcm5pbmcgcmF0ZSB0byB1c2UgZm9yIHRoZSBBZGFkZWx0YSBncmFkaWVudFxuICAgICAqIGRlc2NlbnQgYWxnb3JpdGhtLlxuICAgICAqIEBwYXJhbSByaG8gVGhlIGxlYXJuaW5nIHJhdGUgZGVjYXkgb3ZlciBlYWNoIHVwZGF0ZS5cbiAgICAgKiBAcGFyYW0gZXBzaWxvbiBBIGNvbnN0YW50IGVwc2lsb24gdXNlZCB0byBiZXR0ZXIgY29uZGl0aW9uIHRoZSBncmFkXG4gICAgICogdXBkYXRlLlxuICAgICAqXG4gICAgICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ09wdGltaXplcnMnLCBuYW1lc3BhY2U6ICd0cmFpbid9XG4gICAgICovXG4gICAgc3RhdGljIGFkYWRlbHRhKGxlYXJuaW5nUmF0ZSA9IC4wMDEsIHJobyA9IC45NSwgZXBzaWxvbiA9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBZGFkZWx0YU9wdGltaXplcihsZWFybmluZ1JhdGUsIHJobywgZXBzaWxvbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBgdGYuQWRhbWF4T3B0aW1pemVyYCB0aGF0IHVzZXMgdGhlIEFkYW1heCBhbGdvcml0aG0uXG4gICAgICogU2VlIFtodHRwczovL2FyeGl2Lm9yZy9hYnMvMTQxMi42OTgwXShodHRwczovL2FyeGl2Lm9yZy9hYnMvMTQxMi42OTgwKVxuICAgICAqXG4gICAgICogQHBhcmFtIGxlYXJuaW5nUmF0ZSBUaGUgbGVhcm5pbmcgcmF0ZSB0byB1c2UgZm9yIHRoZSBBZGFtYXggZ3JhZGllbnRcbiAgICAgKiBkZXNjZW50IGFsZ29yaXRobS5cbiAgICAgKiBAcGFyYW0gYmV0YTEgVGhlIGV4cG9uZW50aWFsIGRlY2F5IHJhdGUgZm9yIHRoZSAxc3QgbW9tZW50IGVzdGltYXRlcy5cbiAgICAgKiBAcGFyYW0gYmV0YTIgVGhlIGV4cG9uZW50aWFsIGRlY2F5IHJhdGUgZm9yIHRoZSAybmQgbW9tZW50IGVzdGltYXRlcy5cbiAgICAgKiBAcGFyYW0gZXBzaWxvbiBBIHNtYWxsIGNvbnN0YW50IGZvciBudW1lcmljYWwgc3RhYmlsaXR5LlxuICAgICAqIEBwYXJhbSBkZWNheSBUaGUgbGVhcm5pbmcgcmF0ZSBkZWNheSBvdmVyIGVhY2ggdXBkYXRlLlxuICAgICAqXG4gICAgICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ09wdGltaXplcnMnLCBuYW1lc3BhY2U6ICd0cmFpbid9XG4gICAgICovXG4gICAgc3RhdGljIGFkYW1heChsZWFybmluZ1JhdGUgPSAwLjAwMiwgYmV0YTEgPSAwLjksIGJldGEyID0gMC45OTksIGVwc2lsb24gPSBudWxsLCBkZWNheSA9IDAuMCkge1xuICAgICAgICByZXR1cm4gbmV3IEFkYW1heE9wdGltaXplcihsZWFybmluZ1JhdGUsIGJldGExLCBiZXRhMiwgZXBzaWxvbiwgZGVjYXkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgYHRmLkFkYWdyYWRPcHRpbWl6ZXJgIHRoYXQgdXNlcyB0aGUgQWRhZ3JhZCBhbGdvcml0aG0uXG4gICAgICogU2VlXG4gICAgICogW2h0dHA6Ly93d3cuam1sci5vcmcvcGFwZXJzL3ZvbHVtZTEyL2R1Y2hpMTFhL2R1Y2hpMTFhLnBkZl0oXG4gICAgICogaHR0cDovL3d3dy5qbWxyLm9yZy9wYXBlcnMvdm9sdW1lMTIvZHVjaGkxMWEvZHVjaGkxMWEucGRmKVxuICAgICAqIG9yXG4gICAgICogW2h0dHA6Ly9ydWRlci5pby9vcHRpbWl6aW5nLWdyYWRpZW50LWRlc2NlbnQvaW5kZXguaHRtbCNhZGFncmFkXShcbiAgICAgKiBodHRwOi8vcnVkZXIuaW8vb3B0aW1pemluZy1ncmFkaWVudC1kZXNjZW50L2luZGV4Lmh0bWwjYWRhZ3JhZClcbiAgICAgKlxuICAgICAqIEBwYXJhbSBsZWFybmluZ1JhdGUgVGhlIGxlYXJuaW5nIHJhdGUgdG8gdXNlIGZvciB0aGUgQWRhZ3JhZCBncmFkaWVudFxuICAgICAqIGRlc2NlbnQgYWxnb3JpdGhtLlxuICAgICAqIEBwYXJhbSBpbml0aWFsQWNjdW11bGF0b3JWYWx1ZSBTdGFydGluZyB2YWx1ZSBmb3IgdGhlIGFjY3VtdWxhdG9ycywgbXVzdCBiZVxuICAgICAqIHBvc2l0aXZlLlxuICAgICAqXG4gICAgICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ09wdGltaXplcnMnLCBuYW1lc3BhY2U6ICd0cmFpbid9XG4gICAgICovXG4gICAgc3RhdGljIGFkYWdyYWQobGVhcm5pbmdSYXRlLCBpbml0aWFsQWNjdW11bGF0b3JWYWx1ZSA9IDAuMSkge1xuICAgICAgICByZXR1cm4gbmV3IEFkYWdyYWRPcHRpbWl6ZXIobGVhcm5pbmdSYXRlLCBpbml0aWFsQWNjdW11bGF0b3JWYWx1ZSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b3B0aW1pemVyX2NvbnN0cnVjdG9ycy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgZGlzcG9zZSwgdGlkeSB9IGZyb20gJy4uL2dsb2JhbHMnO1xuaW1wb3J0IHsgYWRkIH0gZnJvbSAnLi4vb3BzL2FkZCc7XG5pbXBvcnQgeyBkaXYgfSBmcm9tICcuLi9vcHMvZGl2JztcbmltcG9ydCB7IG11bCB9IGZyb20gJy4uL29wcy9tdWwnO1xuaW1wb3J0IHsgc3FydCB9IGZyb20gJy4uL29wcy9zcXJ0JztcbmltcG9ydCB7IHNxdWFyZSB9IGZyb20gJy4uL29wcy9zcXVhcmUnO1xuaW1wb3J0IHsgc3ViIH0gZnJvbSAnLi4vb3BzL3N1Yic7XG5pbXBvcnQgeyB6ZXJvc0xpa2UgfSBmcm9tICcuLi9vcHMvemVyb3NfbGlrZSc7XG5pbXBvcnQgeyByZWdpc3RlckNsYXNzIH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbic7XG5pbXBvcnQgeyBPcHRpbWl6ZXIgfSBmcm9tICcuL29wdGltaXplcic7XG4vKiogQGRvY2xpbmsgT3B0aW1pemVyICovXG5leHBvcnQgY2xhc3MgUk1TUHJvcE9wdGltaXplciBleHRlbmRzIE9wdGltaXplciB7XG4gICAgY29uc3RydWN0b3IobGVhcm5pbmdSYXRlLCBkZWNheSA9IDAuOSwgbW9tZW50dW0gPSAwLjAsIGVwc2lsb24gPSBudWxsLCBjZW50ZXJlZCA9IGZhbHNlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMubGVhcm5pbmdSYXRlID0gbGVhcm5pbmdSYXRlO1xuICAgICAgICB0aGlzLmRlY2F5ID0gZGVjYXk7XG4gICAgICAgIHRoaXMubW9tZW50dW0gPSBtb21lbnR1bTtcbiAgICAgICAgdGhpcy5lcHNpbG9uID0gZXBzaWxvbjtcbiAgICAgICAgdGhpcy5hY2N1bXVsYXRlZE1lYW5TcXVhcmVzID0gW107XG4gICAgICAgIHRoaXMuYWNjdW11bGF0ZWRNb21lbnRzID0gW107XG4gICAgICAgIHRoaXMuYWNjdW11bGF0ZWRNZWFuR3JhZHMgPSBbXTtcbiAgICAgICAgdGhpcy5jZW50ZXJlZCA9IGNlbnRlcmVkO1xuICAgICAgICBpZiAoZXBzaWxvbiA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmVwc2lsb24gPSBFTkdJTkUuYmFja2VuZC5lcHNpbG9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxlYXJuaW5nUmF0ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGxlYXJuaW5nUmF0ZSBmb3IgUk1TUHJvcE9wdGltaXplciBtdXN0IGJlIGRlZmluZWQuYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXBwbHlHcmFkaWVudHModmFyaWFibGVHcmFkaWVudHMpIHtcbiAgICAgICAgY29uc3QgdmFyaWFibGVOYW1lcyA9IEFycmF5LmlzQXJyYXkodmFyaWFibGVHcmFkaWVudHMpID9cbiAgICAgICAgICAgIHZhcmlhYmxlR3JhZGllbnRzLm1hcChpdGVtID0+IGl0ZW0ubmFtZSkgOlxuICAgICAgICAgICAgT2JqZWN0LmtleXModmFyaWFibGVHcmFkaWVudHMpO1xuICAgICAgICB2YXJpYWJsZU5hbWVzLmZvckVhY2goKG5hbWUsIGkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gRU5HSU5FLnJlZ2lzdGVyZWRWYXJpYWJsZXNbbmFtZV07XG4gICAgICAgICAgICBjb25zdCB0cmFpbmFibGUgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkTWVhblNxdWFyZXNbaV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWNjdW11bGF0ZWRNZWFuU3F1YXJlc1tpXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lOiBgJHtuYW1lfS9ybXNgLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogdGlkeSgoKSA9PiB6ZXJvc0xpa2UodmFsdWUpLnZhcmlhYmxlKHRyYWluYWJsZSkpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkTW9tZW50c1tpXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hY2N1bXVsYXRlZE1vbWVudHNbaV0gPSB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogYCR7bmFtZX0vbW9tZW50dW1gLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogdGlkeSgoKSA9PiB6ZXJvc0xpa2UodmFsdWUpLnZhcmlhYmxlKHRyYWluYWJsZSkpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkTWVhbkdyYWRzW2ldID09IG51bGwgJiYgdGhpcy5jZW50ZXJlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWNjdW11bGF0ZWRNZWFuR3JhZHNbaV0gPSB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogYCR7bmFtZX0vbWdgLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogdGlkeSgoKSA9PiB6ZXJvc0xpa2UodmFsdWUpLnZhcmlhYmxlKHRyYWluYWJsZSkpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGdyYWRpZW50ID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JhZGllbnRzW2ldLnRlbnNvciA6XG4gICAgICAgICAgICAgICAgdmFyaWFibGVHcmFkaWVudHNbbmFtZV07XG4gICAgICAgICAgICBpZiAoZ3JhZGllbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFjY3VtdWxhdGVkTWVhblNxdWFyZSA9IHRoaXMuYWNjdW11bGF0ZWRNZWFuU3F1YXJlc1tpXS52YXJpYWJsZTtcbiAgICAgICAgICAgIGNvbnN0IGFjY3VtdWxhdGVkTW9tZW50cyA9IHRoaXMuYWNjdW11bGF0ZWRNb21lbnRzW2ldLnZhcmlhYmxlO1xuICAgICAgICAgICAgdGlkeSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3QWNjdW11bGF0ZWRNZWFuU3F1YXJlID0gYWRkKG11bChhY2N1bXVsYXRlZE1lYW5TcXVhcmUsIHRoaXMuZGVjYXkpLCBtdWwoc3F1YXJlKGdyYWRpZW50KSwgMSAtIHRoaXMuZGVjYXkpKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jZW50ZXJlZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhY2N1bXVsYXRlZE1lYW5HcmFkID0gdGhpcy5hY2N1bXVsYXRlZE1lYW5HcmFkc1tpXS52YXJpYWJsZTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2VudGVyZWQgZ3JhZGllbnRcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3QWNjdW11bGF0ZWRNZWFuR3JhZCA9IGFkZChtdWwoYWNjdW11bGF0ZWRNZWFuR3JhZCwgdGhpcy5kZWNheSksIG11bChncmFkaWVudCwgMSAtIHRoaXMuZGVjYXkpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JhZENvbnRyaWJ1dGlvbiA9IGRpdihtdWwoZ3JhZGllbnQsIHRoaXMubGVhcm5pbmdSYXRlKSwgc3FydChzdWIobmV3QWNjdW11bGF0ZWRNZWFuU3F1YXJlLCBhZGQoc3F1YXJlKG5ld0FjY3VtdWxhdGVkTWVhbkdyYWQpLCB0aGlzLmVwc2lsb24pKSkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdBY2N1bXVsYXRlZE1vbWVudHMgPSBhZGQobXVsKGFjY3VtdWxhdGVkTW9tZW50cywgdGhpcy5tb21lbnR1bSksIGdyYWRDb250cmlidXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZE1lYW5TcXVhcmUuYXNzaWduKG5ld0FjY3VtdWxhdGVkTWVhblNxdWFyZSk7XG4gICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkTWVhbkdyYWQuYXNzaWduKG5ld0FjY3VtdWxhdGVkTWVhbkdyYWQpO1xuICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZE1vbWVudHMuYXNzaWduKG5ld0FjY3VtdWxhdGVkTW9tZW50cyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gc3ViKHZhbHVlLCBuZXdBY2N1bXVsYXRlZE1vbWVudHMpO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZS5hc3NpZ24obmV3VmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUGxhaW4gZ3JhZGllbnRcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3QWNjdW11bGF0ZWRNZWFuU3F1YXJlID0gYWRkKG11bChhY2N1bXVsYXRlZE1lYW5TcXVhcmUsIHRoaXMuZGVjYXkpLCBtdWwoc3F1YXJlKGdyYWRpZW50KSwgMSAtIHRoaXMuZGVjYXkpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3QWNjdW11bGF0ZWRNb21lbnRzID0gYWRkKG11bChhY2N1bXVsYXRlZE1vbWVudHMsIHRoaXMubW9tZW50dW0pLCBkaXYobXVsKGdyYWRpZW50LCB0aGlzLmxlYXJuaW5nUmF0ZSksIHNxcnQoYWRkKG5ld0FjY3VtdWxhdGVkTWVhblNxdWFyZSwgdGhpcy5lcHNpbG9uKSkpKTtcbiAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0ZWRNZWFuU3F1YXJlLmFzc2lnbihuZXdBY2N1bXVsYXRlZE1lYW5TcXVhcmUpO1xuICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZE1vbWVudHMuYXNzaWduKG5ld0FjY3VtdWxhdGVkTW9tZW50cyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gc3ViKHZhbHVlLCBuZXdBY2N1bXVsYXRlZE1vbWVudHMpO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZS5hc3NpZ24obmV3VmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5pbmNyZW1lbnRJdGVyYXRpb25zKCk7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkTWVhblNxdWFyZXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgZGlzcG9zZSh0aGlzLmFjY3VtdWxhdGVkTWVhblNxdWFyZXMubWFwKHYgPT4gdi52YXJpYWJsZSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkTWVhbkdyYWRzICE9IG51bGwgJiYgdGhpcy5jZW50ZXJlZCkge1xuICAgICAgICAgICAgZGlzcG9zZSh0aGlzLmFjY3VtdWxhdGVkTWVhbkdyYWRzLm1hcCh2ID0+IHYudmFyaWFibGUpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hY2N1bXVsYXRlZE1vbWVudHMgIT0gbnVsbCkge1xuICAgICAgICAgICAgZGlzcG9zZSh0aGlzLmFjY3VtdWxhdGVkTW9tZW50cy5tYXAodiA9PiB2LnZhcmlhYmxlKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgZ2V0V2VpZ2h0cygpIHtcbiAgICAgICAgLy8gT3JkZXIgbWF0dGVycyBmb3IgUHl0aG9uIGNvbXBhdGliaWxpdHkuXG4gICAgICAgIGNvbnN0IHZhcmlhYmxlcyA9IFsuLi50aGlzLmFjY3VtdWxhdGVkTWVhblNxdWFyZXMsIC4uLnRoaXMuYWNjdW11bGF0ZWRNb21lbnRzXTtcbiAgICAgICAgaWYgKHRoaXMuY2VudGVyZWQpIHtcbiAgICAgICAgICAgIHZhcmlhYmxlcy5wdXNoKC4uLnRoaXMuYWNjdW11bGF0ZWRNZWFuR3JhZHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbYXdhaXQgdGhpcy5zYXZlSXRlcmF0aW9ucygpXS5jb25jYXQodmFyaWFibGVzLm1hcCh2ID0+ICh7IG5hbWU6IHYub3JpZ2luYWxOYW1lLCB0ZW5zb3I6IHYudmFyaWFibGUgfSkpKTtcbiAgICB9XG4gICAgYXN5bmMgc2V0V2VpZ2h0cyh3ZWlnaHRWYWx1ZXMpIHtcbiAgICAgICAgd2VpZ2h0VmFsdWVzID0gYXdhaXQgdGhpcy5leHRyYWN0SXRlcmF0aW9ucyh3ZWlnaHRWYWx1ZXMpO1xuICAgICAgICBjb25zdCB2YXJpYWJsZUNvdW50ID0gdGhpcy5jZW50ZXJlZCA/IHdlaWdodFZhbHVlcy5sZW5ndGggLyAzIDogd2VpZ2h0VmFsdWVzLmxlbmd0aCAvIDI7XG4gICAgICAgIGNvbnN0IHRyYWluYWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFjY3VtdWxhdGVkTWVhblNxdWFyZXMgPVxuICAgICAgICAgICAgd2VpZ2h0VmFsdWVzLnNsaWNlKDAsIHZhcmlhYmxlQ291bnQpLm1hcCh2ID0+ICh7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lOiB2Lm5hbWUsXG4gICAgICAgICAgICAgICAgdmFyaWFibGU6IHYudGVuc29yLnZhcmlhYmxlKHRyYWluYWJsZSlcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgdGhpcy5hY2N1bXVsYXRlZE1vbWVudHMgPVxuICAgICAgICAgICAgd2VpZ2h0VmFsdWVzLnNsaWNlKHZhcmlhYmxlQ291bnQsIHZhcmlhYmxlQ291bnQgKiAyKVxuICAgICAgICAgICAgICAgIC5tYXAodiA9PiAoe1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogdi5uYW1lLFxuICAgICAgICAgICAgICAgIHZhcmlhYmxlOiB2LnRlbnNvci52YXJpYWJsZSh0cmFpbmFibGUpXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIGlmICh0aGlzLmNlbnRlcmVkKSB7XG4gICAgICAgICAgICB0aGlzLmFjY3VtdWxhdGVkTWVhbkdyYWRzID1cbiAgICAgICAgICAgICAgICB3ZWlnaHRWYWx1ZXMuc2xpY2UodmFyaWFibGVDb3VudCAqIDIsIHZhcmlhYmxlQ291bnQgKiAzKVxuICAgICAgICAgICAgICAgICAgICAubWFwKHYgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lOiB2Lm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlOiB2LnRlbnNvci52YXJpYWJsZSh0cmFpbmFibGUpXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldENvbmZpZygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICdsZWFybmluZ1JhdGUnOiB0aGlzLmxlYXJuaW5nUmF0ZSxcbiAgICAgICAgICAgICdkZWNheSc6IHRoaXMuZGVjYXksXG4gICAgICAgICAgICAnbW9tZW50dW0nOiB0aGlzLm1vbWVudHVtLFxuICAgICAgICAgICAgJ2Vwc2lsb24nOiB0aGlzLmVwc2lsb24sXG4gICAgICAgICAgICAnY2VudGVyZWQnOiB0aGlzLmNlbnRlcmVkXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgIHN0YXRpYyBmcm9tQ29uZmlnKGNscywgY29uZmlnKSB7XG4gICAgICAgIHJldHVybiBuZXcgY2xzKGNvbmZpZ1snbGVhcm5pbmdSYXRlJ10sIGNvbmZpZ1snZGVjYXknXSwgY29uZmlnWydtb21lbnR1bSddLCBjb25maWdbJ2Vwc2lsb24nXSwgY29uZmlnWydjZW50ZXJlZCddKTtcbiAgICB9XG59XG4vKiogQG5vY29sbGFwc2UgKi9cblJNU1Byb3BPcHRpbWl6ZXIuY2xhc3NOYW1lID0gJ1JNU1Byb3AnOyAvLyBOb3RlOiBOYW1lIG1hdHRlcnMgZm9yIFB5dGhvbiBjb21wYXRpYmlsaXR5LlxucmVnaXN0ZXJDbGFzcyhSTVNQcm9wT3B0aW1pemVyKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJtc3Byb3Bfb3B0aW1pemVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBrZWVwLCB0aWR5IH0gZnJvbSAnLi4vZ2xvYmFscyc7XG5pbXBvcnQgeyBhZGQgfSBmcm9tICcuLi9vcHMvYWRkJztcbmltcG9ydCB7IG11bCB9IGZyb20gJy4uL29wcy9tdWwnO1xuaW1wb3J0IHsgc2NhbGFyIH0gZnJvbSAnLi4vb3BzL3NjYWxhcic7XG5pbXBvcnQgeyByZWdpc3RlckNsYXNzIH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbic7XG5pbXBvcnQgeyBPcHRpbWl6ZXIgfSBmcm9tICcuL29wdGltaXplcic7XG4vKiogQGRvY2xpbmsgT3B0aW1pemVyICovXG5leHBvcnQgY2xhc3MgU0dET3B0aW1pemVyIGV4dGVuZHMgT3B0aW1pemVyIHtcbiAgICBjb25zdHJ1Y3RvcihsZWFybmluZ1JhdGUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5sZWFybmluZ1JhdGUgPSBsZWFybmluZ1JhdGU7XG4gICAgICAgIHRoaXMuc2V0TGVhcm5pbmdSYXRlKGxlYXJuaW5nUmF0ZSk7XG4gICAgfVxuICAgIGFwcGx5R3JhZGllbnRzKHZhcmlhYmxlR3JhZGllbnRzKSB7XG4gICAgICAgIGNvbnN0IHZhck5hbWVzID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICAgICAgdmFyaWFibGVHcmFkaWVudHMubWFwKHYgPT4gdi5uYW1lKSA6XG4gICAgICAgICAgICBPYmplY3Qua2V5cyh2YXJpYWJsZUdyYWRpZW50cyk7XG4gICAgICAgIHZhck5hbWVzLmZvckVhY2goKG5hbWUsIGkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGdyYWRpZW50ID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JhZGllbnRzW2ldLnRlbnNvciA6XG4gICAgICAgICAgICAgICAgdmFyaWFibGVHcmFkaWVudHNbbmFtZV07XG4gICAgICAgICAgICBpZiAoZ3JhZGllbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gRU5HSU5FLnJlZ2lzdGVyZWRWYXJpYWJsZXNbbmFtZV07XG4gICAgICAgICAgICB0aWR5KCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IGFkZChtdWwodGhpcy5jLCBncmFkaWVudCksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB2YWx1ZS5hc3NpZ24obmV3VmFsdWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmluY3JlbWVudEl0ZXJhdGlvbnMoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbGVhcm5pbmcgcmF0ZSBvZiB0aGUgb3B0aW1pemVyLlxuICAgICAqL1xuICAgIHNldExlYXJuaW5nUmF0ZShsZWFybmluZ1JhdGUpIHtcbiAgICAgICAgdGhpcy5sZWFybmluZ1JhdGUgPSBsZWFybmluZ1JhdGU7XG4gICAgICAgIGlmICh0aGlzLmMgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5jLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmMgPSBrZWVwKHNjYWxhcigtbGVhcm5pbmdSYXRlKSk7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIHRoaXMuYy5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGFzeW5jIGdldFdlaWdodHMoKSB7XG4gICAgICAgIHJldHVybiBbYXdhaXQgdGhpcy5zYXZlSXRlcmF0aW9ucygpXTtcbiAgICB9XG4gICAgYXN5bmMgc2V0V2VpZ2h0cyh3ZWlnaHRWYWx1ZXMpIHtcbiAgICAgICAgd2VpZ2h0VmFsdWVzID0gYXdhaXQgdGhpcy5leHRyYWN0SXRlcmF0aW9ucyh3ZWlnaHRWYWx1ZXMpO1xuICAgICAgICBpZiAod2VpZ2h0VmFsdWVzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTR0Qgb3B0aW1pemVyIGRvZXMgbm90IGhhdmUgc2V0dGFibGUgd2VpZ2h0cy4nKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRDb25maWcoKSB7XG4gICAgICAgIHJldHVybiB7ICdsZWFybmluZ1JhdGUnOiB0aGlzLmxlYXJuaW5nUmF0ZSB9O1xuICAgIH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBzdGF0aWMgZnJvbUNvbmZpZyhjbHMsIGNvbmZpZykge1xuICAgICAgICByZXR1cm4gbmV3IGNscyhjb25maWdbJ2xlYXJuaW5nUmF0ZSddKTtcbiAgICB9XG59XG4vKiogQG5vY29sbGFwc2UgKi9cblNHRE9wdGltaXplci5jbGFzc05hbWUgPSAnU0dEJzsgLy8gTm90ZTogTmFtZSBtYXR0ZXJzIGZvciBQeXRob24gY29tcGF0aWJpbGl0eS5cbnJlZ2lzdGVyQ2xhc3MoU0dET3B0aW1pemVyKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNnZF9vcHRpbWl6ZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0ICcuLi9mbGFncyc7XG5pbXBvcnQgeyBlbnYgfSBmcm9tICcuLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBCcm93c2VySW5kZXhlZERCLCBCcm93c2VySW5kZXhlZERCTWFuYWdlciB9IGZyb20gJy4uL2lvL2luZGV4ZWRfZGInO1xuaW1wb3J0IHsgQnJvd3NlckxvY2FsU3RvcmFnZSwgQnJvd3NlckxvY2FsU3RvcmFnZU1hbmFnZXIgfSBmcm9tICcuLi9pby9sb2NhbF9zdG9yYWdlJztcbmltcG9ydCB7IE1vZGVsU3RvcmVNYW5hZ2VyUmVnaXN0cnkgfSBmcm9tICcuLi9pby9tb2RlbF9tYW5hZ2VtZW50JztcbmV4cG9ydCBjbGFzcyBQbGF0Zm9ybUJyb3dzZXIge1xuICAgIGZldGNoKHBhdGgsIGluaXQpIHtcbiAgICAgICAgcmV0dXJuIGZldGNoKHBhdGgsIGluaXQpO1xuICAgIH1cbiAgICBub3coKSB7XG4gICAgICAgIHJldHVybiBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICB9XG4gICAgZW5jb2RlKHRleHQsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmIChlbmNvZGluZyAhPT0gJ3V0Zi04JyAmJiBlbmNvZGluZyAhPT0gJ3V0ZjgnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJyb3dzZXIncyBlbmNvZGVyIG9ubHkgc3VwcG9ydHMgdXRmLTgsIGJ1dCBnb3QgJHtlbmNvZGluZ31gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy50ZXh0RW5jb2RlciA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnRleHRFbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dEVuY29kZXIuZW5jb2RlKHRleHQpO1xuICAgIH1cbiAgICBkZWNvZGUoYnl0ZXMsIGVuY29kaW5nKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGV4dERlY29kZXIoZW5jb2RpbmcpLmRlY29kZShieXRlcyk7XG4gICAgfVxufVxuaWYgKGVudigpLmdldCgnSVNfQlJPV1NFUicpKSB7XG4gICAgZW52KCkuc2V0UGxhdGZvcm0oJ2Jyb3dzZXInLCBuZXcgUGxhdGZvcm1Ccm93c2VyKCkpO1xuICAgIC8vIFJlZ2lzdGVyIExvY2FsU3RvcmFnZSBJT0hhbmRsZXJcbiAgICB0cnkge1xuICAgICAgICBNb2RlbFN0b3JlTWFuYWdlclJlZ2lzdHJ5LnJlZ2lzdGVyTWFuYWdlcihCcm93c2VyTG9jYWxTdG9yYWdlLlVSTF9TQ0hFTUUsIG5ldyBCcm93c2VyTG9jYWxTdG9yYWdlTWFuYWdlcigpKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgIH1cbiAgICAvLyBSZWdpc3RlciBJbmRleGVkREIgSU9IYW5kbGVyXG4gICAgdHJ5IHtcbiAgICAgICAgTW9kZWxTdG9yZU1hbmFnZXJSZWdpc3RyeS5yZWdpc3Rlck1hbmFnZXIoQnJvd3NlckluZGV4ZWREQi5VUkxfU0NIRU1FLCBuZXcgQnJvd3NlckluZGV4ZWREQk1hbmFnZXIoKSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wbGF0Zm9ybV9icm93c2VyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGVudiB9IGZyb20gJy4uL2Vudmlyb25tZW50Jztcbi8vIFdlIGFyZSB3cmFwcGluZyB0aGlzIHdpdGhpbiBhbiBvYmplY3Qgc28gaXQgY2FuIGJlIHN0dWJiZWQgYnkgSmFzbWluZS5cbmV4cG9ydCBjb25zdCBnZXROb2RlRmV0Y2ggPSB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXJlcXVpcmUtaW1wb3J0c1xuICAgIGltcG9ydEZldGNoOiAoKSA9PiByZXF1aXJlKCdub2RlLWZldGNoJylcbn07XG5sZXQgc3lzdGVtRmV0Y2g7XG4vLyBUaGVzZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzIGFyZSBmb3IgdGVzdGluZyBzbyB3ZSBkb24ndCBleHBvcnQgYSBtdXRhYmxlXG4vLyB2YXJpYWJsZS5cbmV4cG9ydCBmdW5jdGlvbiByZXNldFN5c3RlbUZldGNoKCkge1xuICAgIHN5c3RlbUZldGNoID0gbnVsbDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzZXRTeXN0ZW1GZXRjaChmZXRjaEZuKSB7XG4gICAgc3lzdGVtRmV0Y2ggPSBmZXRjaEZuO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFN5c3RlbUZldGNoKCkge1xuICAgIHJldHVybiBzeXN0ZW1GZXRjaDtcbn1cbmV4cG9ydCBjbGFzcyBQbGF0Zm9ybU5vZGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tcmVxdWlyZS1pbXBvcnRzXG4gICAgICAgIHRoaXMudXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbiAgICAgICAgLy8gQWNjb3JkaW5nIHRvIHRoZSBzcGVjLCB0aGUgYnVpbHQtaW4gZW5jb2RlciBjYW4gZG8gb25seSBVVEYtOCBlbmNvZGluZy5cbiAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1RleHRFbmNvZGVyL1RleHRFbmNvZGVyXG4gICAgICAgIHRoaXMudGV4dEVuY29kZXIgPSBuZXcgdGhpcy51dGlsLlRleHRFbmNvZGVyKCk7XG4gICAgfVxuICAgIGZldGNoKHBhdGgsIHJlcXVlc3RJbml0cykge1xuICAgICAgICBpZiAoZW52KCkuZ2xvYmFsLmZldGNoICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBlbnYoKS5nbG9iYWwuZmV0Y2gocGF0aCwgcmVxdWVzdEluaXRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3lzdGVtRmV0Y2ggPT0gbnVsbCkge1xuICAgICAgICAgICAgc3lzdGVtRmV0Y2ggPSBnZXROb2RlRmV0Y2guaW1wb3J0RmV0Y2goKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3lzdGVtRmV0Y2gocGF0aCwgcmVxdWVzdEluaXRzKTtcbiAgICB9XG4gICAgbm93KCkge1xuICAgICAgICBjb25zdCB0aW1lID0gcHJvY2Vzcy5ocnRpbWUoKTtcbiAgICAgICAgcmV0dXJuIHRpbWVbMF0gKiAxMDAwICsgdGltZVsxXSAvIDEwMDAwMDA7XG4gICAgfVxuICAgIGVuY29kZSh0ZXh0LCBlbmNvZGluZykge1xuICAgICAgICBpZiAoZW5jb2RpbmcgIT09ICd1dGYtOCcgJiYgZW5jb2RpbmcgIT09ICd1dGY4Jykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb2RlIGJ1aWx0LWluIGVuY29kZXIgb25seSBzdXBwb3J0cyB1dGYtOCwgYnV0IGdvdCAke2VuY29kaW5nfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnRleHRFbmNvZGVyLmVuY29kZSh0ZXh0KTtcbiAgICB9XG4gICAgZGVjb2RlKGJ5dGVzLCBlbmNvZGluZykge1xuICAgICAgICBpZiAoYnl0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyB0aGlzLnV0aWwuVGV4dERlY29kZXIoZW5jb2RpbmcpLmRlY29kZShieXRlcyk7XG4gICAgfVxufVxuaWYgKGVudigpLmdldCgnSVNfTk9ERScpKSB7XG4gICAgZW52KCkuc2V0UGxhdGZvcm0oJ25vZGUnLCBuZXcgUGxhdGZvcm1Ob2RlKCkpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGxhdGZvcm1fbm9kZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBlbnYgfSBmcm9tICcuL2Vudmlyb25tZW50JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi91dGlsJztcbmV4cG9ydCBjbGFzcyBQcm9maWxlciB7XG4gICAgY29uc3RydWN0b3IoYmFja2VuZFRpbWVyLCBsb2dnZXIpIHtcbiAgICAgICAgdGhpcy5iYWNrZW5kVGltZXIgPSBiYWNrZW5kVGltZXI7XG4gICAgICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyO1xuICAgICAgICBpZiAobG9nZ2VyID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyID0gbmV3IExvZ2dlcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByb2ZpbGVLZXJuZWwoa2VybmVsTmFtZSwgaW5wdXRzLCBmKSB7XG4gICAgICAgIGxldCBvdXRwdXRzO1xuICAgICAgICBjb25zdCBob2xkUmVzdWx0V3JhcHBlckZuID0gKCkgPT4ge1xuICAgICAgICAgICAgb3V0cHV0cyA9IGYoKTtcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHRpbWVyO1xuICAgICAgICBjb25zdCBzdGFydCA9IHV0aWwubm93KCk7XG4gICAgICAgIGlmICh0aGlzLmJhY2tlbmRUaW1lci50aW1lckF2YWlsYWJsZSgpKSB7XG4gICAgICAgICAgICB0aW1lciA9IHRoaXMuYmFja2VuZFRpbWVyLnRpbWUoaG9sZFJlc3VsdFdyYXBwZXJGbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBob2xkUmVzdWx0V3JhcHBlckZuKCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG91dHB1dCBvZiBvdXRwdXRzKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0LmRhdGFTeW5jKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aW1lciA9IFByb21pc2UucmVzb2x2ZSh7IGtlcm5lbE1zOiB1dGlsLm5vdygpIC0gc3RhcnQgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVudigpLmdldEJvb2woJ0NIRUNLX0NPTVBVVEFUSU9OX0ZPUl9FUlJPUlMnKSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRwdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0ID0gb3V0cHV0c1tpXTtcbiAgICAgICAgICAgICAgICAvLyBEYW5nbGluZyBwcm9taXNlIGhlcmUgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIHByb3BhZ2F0ZSB1cFxuICAgICAgICAgICAgICAgIC8vIGFzeW5jaHJvbmljaXR5LlxuICAgICAgICAgICAgICAgIG91dHB1dC5kYXRhKCkudGhlbih0ZW5zb3JWYWxzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tDb21wdXRhdGlvbkZvckVycm9ycyh0ZW5zb3JWYWxzLCBvdXRwdXQuZHR5cGUsIGtlcm5lbE5hbWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGtlcm5lbFByb2ZpbGUgPSB7XG4gICAgICAgICAgICBrZXJuZWxOYW1lLFxuICAgICAgICAgICAgb3V0cHV0cyxcbiAgICAgICAgICAgIGlucHV0cyxcbiAgICAgICAgICAgIHRpbWVNczogdGltZXIudGhlbih0aW1pbmcgPT4gdGltaW5nLmtlcm5lbE1zKSxcbiAgICAgICAgICAgIGV4dHJhSW5mbzogdGltZXIudGhlbih0aW1pbmcgPT4gdGltaW5nLmdldEV4dHJhUHJvZmlsZUluZm8gIT0gbnVsbCA/XG4gICAgICAgICAgICAgICAgdGltaW5nLmdldEV4dHJhUHJvZmlsZUluZm8oKSA6XG4gICAgICAgICAgICAgICAgJycpXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBrZXJuZWxQcm9maWxlO1xuICAgIH1cbiAgICBsb2dLZXJuZWxQcm9maWxlKGtlcm5lbFByb2ZpbGUpIHtcbiAgICAgICAgY29uc3QgeyBrZXJuZWxOYW1lLCBvdXRwdXRzLCB0aW1lTXMsIGlucHV0cywgZXh0cmFJbmZvIH0gPSBrZXJuZWxQcm9maWxlO1xuICAgICAgICBvdXRwdXRzLmZvckVhY2gocmVzdWx0ID0+IHtcbiAgICAgICAgICAgIFByb21pc2UuYWxsKFtyZXN1bHQuZGF0YSgpLCB0aW1lTXMsIGV4dHJhSW5mb10pLnRoZW4odmFsdWVDb250YWluZXIgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZ0tlcm5lbFByb2ZpbGUoa2VybmVsTmFtZSwgcmVzdWx0LCB2YWx1ZUNvbnRhaW5lclswXSwgdmFsdWVDb250YWluZXJbMV0sIGlucHV0cywgdmFsdWVDb250YWluZXJbMl0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0NvbXB1dGF0aW9uRm9yRXJyb3JzKHZhbHMsIGR0eXBlLCBrZXJuZWxOYW1lKSB7XG4gICAgaWYgKGR0eXBlICE9PSAnZmxvYXQzMicpIHtcbiAgICAgICAgLy8gT25seSBmbG9hdGluZyBwb2ludCBjb21wdXRhdGlvbnMgd2lsbCBnZW5lcmF0ZSBOYU4gdmFsdWVzXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IG51bSA9IHZhbHNbaV07XG4gICAgICAgIGlmIChpc05hTihudW0pIHx8ICFpc0Zpbml0ZShudW0pKSB7XG4gICAgICAgICAgICAvLyBUaHJvd2luZyBjdXN0b20gZXhjZXB0aW9uIHNvIGJlaGF2aW9yIGlzIHRlc3RhYmxlLlxuICAgICAgICAgICAgY29uc29sZS53YXJuKGBGb3VuZCAke251bX0gaW4gdGhlIHJlc3VsdCBvZiAnJHtrZXJuZWxOYW1lfSdgKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmV4cG9ydCBjbGFzcyBMb2dnZXIge1xuICAgIGxvZ0tlcm5lbFByb2ZpbGUobmFtZSwgcmVzdWx0LCB2YWxzLCB0aW1lTXMsIGlucHV0cywgZXh0cmFJbmZvKSB7XG4gICAgICAgIGNvbnN0IHRpbWUgPSB0eXBlb2YgdGltZU1zID09PSAnbnVtYmVyJyA/IHV0aWwucmlnaHRQYWQoYCR7dGltZU1zfW1zYCwgOSkgOlxuICAgICAgICAgICAgdGltZU1zWydlcnJvciddO1xuICAgICAgICBjb25zdCBwYWRkZWROYW1lID0gdXRpbC5yaWdodFBhZChuYW1lLCAyNSk7XG4gICAgICAgIGNvbnN0IHJhbmsgPSByZXN1bHQucmFuaztcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHJlc3VsdC5zaXplO1xuICAgICAgICBjb25zdCBzaGFwZSA9IHV0aWwucmlnaHRQYWQocmVzdWx0LnNoYXBlLnRvU3RyaW5nKCksIDE0KTtcbiAgICAgICAgbGV0IGlucHV0U2hhcGVzRGVzY3JpcHRpb24gPSAnJztcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIGluIGlucHV0cykge1xuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBpbnB1dHNbbmFtZV07XG4gICAgICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBpbnB1dCBtaWdodCBiZSBhIG5vbi10ZW5zb3IgKGUuZyBIVE1MSW1hZ2VFbGVtZW50KSwgaW4gd2hpY2ggY2FzZVxuICAgICAgICAgICAgICAgIC8vIHdlIGNsYWltIHRoZSBvdXRwdXQgc2hhcGUgYXMgaW5wdXQgc2hhcGUuXG4gICAgICAgICAgICAgICAgY29uc3QgaW5wdXRTaGFwZSA9IGlucHV0LnNoYXBlIHx8IHJlc3VsdC5zaGFwZTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnB1dFJhbmsgPSBpbnB1dFNoYXBlLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpbnB1dFNoYXBlc0Rlc2NyaXB0aW9uICs9XG4gICAgICAgICAgICAgICAgICAgIGAke25hbWV9OiAke2lucHV0UmFua31EICR7aW5wdXRSYW5rID4gMCA/IGlucHV0U2hhcGUgOiAnJ30gYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgJWMke3BhZGRlZE5hbWV9XFx0JWMke3RpbWV9XFx0JWMke3Jhbmt9RCAke3NoYXBlfVxcdCVjJHtzaXplfVxcdCVjJHtpbnB1dFNoYXBlc0Rlc2NyaXB0aW9ufVxcdCVjJHtleHRyYUluZm99YCwgJ2ZvbnQtd2VpZ2h0OmJvbGQnLCAnY29sb3I6cmVkJywgJ2NvbG9yOmJsdWUnLCAnY29sb3I6IG9yYW5nZScsICdjb2xvcjogZ3JlZW4nLCAnY29sb3I6IHN0ZWVsYmx1ZScpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXByb2ZpbGVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4vdXRpbCc7XG4vKipcbiAqIFNlcmlhbGl6YWJsZSBkZWZpbmVzIHRoZSBzZXJpYWxpemF0aW9uIGNvbnRyYWN0LlxuICpcbiAqIFRGSlMgcmVxdWlyZXMgc2VyaWFsaXphYmxlIGNsYXNzZXMgdG8gcmV0dXJuIHRoZWlyIGNsYXNzTmFtZSB3aGVuIGFza2VkXG4gKiB0byBhdm9pZCBpc3N1ZXMgd2l0aCBtaW5pZmljYXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXJpYWxpemFibGUge1xuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgY2xhc3MgbmFtZSBmb3IgdGhpcyBjbGFzcyB0byB1c2UgaW4gc2VyaWFsaXphdGlvbiBjb250ZXh0cy5cbiAgICAgKlxuICAgICAqIEdlbmVyYWxseSBzcGVha2luZyB0aGlzIHdpbGwgYmUgdGhlIHNhbWUgdGhpbmcgdGhhdCBjb25zdHJ1Y3Rvci5uYW1lXG4gICAgICogd291bGQgaGF2ZSByZXR1cm5lZC4gIEhvd2V2ZXIsIHRoZSBjbGFzcyBuYW1lIG5lZWRzIHRvIGJlIHJvYnVzdFxuICAgICAqIGFnYWluc3QgbWluaWZpY2F0aW9uIGZvciBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiB0byB3b3JrIHByb3Blcmx5LlxuICAgICAqXG4gICAgICogVGhlcmUncyBhbHNvIHBsYWNlcyBzdWNoIGFzIGluaXRpYWxpemVycy5WYXJpYW5jZVNjYWxpbmcsIHdoZXJlXG4gICAgICogaW1wbGVtZW50YXRpb24gZGV0YWlscyBiZXR3ZWVuIGRpZmZlcmVudCBsYW5ndWFnZXMgbGVkIHRvIGRpZmZlcmVudFxuICAgICAqIGNsYXNzIGhpZXJhcmNoaWVzIGFuZCBhIG5vbi1sZWFmIG5vZGUgaXMgdXNlZCBmb3Igc2VyaWFsaXphdGlvbiBwdXJwb3Nlcy5cbiAgICAgKi9cbiAgICBnZXRDbGFzc05hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yXG4gICAgICAgICAgICAuY2xhc3NOYW1lO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFQgZnJvbSBhIENvbmZpZ0RpY3QuXG4gICAgICpcbiAgICAgKiBUaGlzIHdvcmtzIGZvciBtb3N0IGRlc2NlbmRhbnRzIG9mIHNlcmlhbGl6YWJsZS4gIEEgZmV3IG5lZWQgdG9cbiAgICAgKiBwcm92aWRlIHNwZWNpYWwgaGFuZGxpbmcuXG4gICAgICogQHBhcmFtIGNscyBBIENvbnN0cnVjdG9yIGZvciB0aGUgY2xhc3MgdG8gaW5zdGFudGlhdGUuXG4gICAgICogQHBhcmFtIGNvbmZpZyBUaGUgQ29uZmlndXJhdGlvbiBmb3IgdGhlIG9iamVjdC5cbiAgICAgKi9cbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBzdGF0aWMgZnJvbUNvbmZpZyhjbHMsIGNvbmZpZykge1xuICAgICAgICByZXR1cm4gbmV3IGNscyhjb25maWcpO1xuICAgIH1cbn1cbi8qKlxuICogTWFwcyBzdHJpbmcga2V5cyB0byBjbGFzcyBjb25zdHJ1Y3RvcnMuXG4gKlxuICogVXNlZCBkdXJpbmcgKGRlKXNlcmlhbGl6YXRpb24gZnJvbSB0aGUgY3Jvc3MtbGFuZ3VhZ2UgSlNPTiBmb3JtYXQsIHdoaWNoXG4gKiByZXF1aXJlcyB0aGUgY2xhc3MgbmFtZSBpbiB0aGUgc2VyaWFsaXphdGlvbiBmb3JtYXQgbWF0Y2hlcyB0aGUgY2xhc3NcbiAqIG5hbWVzIGFzIHVzZWQgaW4gUHl0aG9uLCBzaG91bGQgaXQgZXhpc3QuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXJpYWxpemF0aW9uTWFwIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5jbGFzc05hbWVNYXAgPSB7fTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBtYXAuXG4gICAgICovXG4gICAgc3RhdGljIGdldE1hcCgpIHtcbiAgICAgICAgaWYgKFNlcmlhbGl6YXRpb25NYXAuaW5zdGFuY2UgPT0gbnVsbCkge1xuICAgICAgICAgICAgU2VyaWFsaXphdGlvbk1hcC5pbnN0YW5jZSA9IG5ldyBTZXJpYWxpemF0aW9uTWFwKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFNlcmlhbGl6YXRpb25NYXAuaW5zdGFuY2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVycyB0aGUgY2xhc3MgYXMgc2VyaWFsaXphYmxlLlxuICAgICAqL1xuICAgIHN0YXRpYyByZWdpc3RlcihjbHMpIHtcbiAgICAgICAgU2VyaWFsaXphdGlvbk1hcC5nZXRNYXAoKS5jbGFzc05hbWVNYXBbY2xzLmNsYXNzTmFtZV0gPVxuICAgICAgICAgICAgW2NscywgY2xzLmZyb21Db25maWddO1xuICAgIH1cbn1cbi8qKlxuICogUmVnaXN0ZXIgYSBjbGFzcyB3aXRoIHRoZSBzZXJpYWxpemF0aW9uIG1hcCBvZiBUZW5zb3JGbG93LmpzLlxuICpcbiAqIFRoaXMgaXMgb2Z0ZW4gdXNlZCBmb3IgcmVnaXN0ZXJpbmcgY3VzdG9tIExheWVycywgc28gdGhleSBjYW4gYmVcbiAqIHNlcmlhbGl6ZWQgYW5kIGRlc2VyaWFsaXplZC5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYGpzXG4gKiBjbGFzcyBNeUN1c3RvbUxheWVyIGV4dGVuZHMgdGYubGF5ZXJzLkxheWVyIHtcbiAqICAgc3RhdGljIGNsYXNzTmFtZSA9ICdNeUN1c3RvbUxheWVyJztcbiAqXG4gKiAgIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICogICAgIHN1cGVyKGNvbmZpZyk7XG4gKiAgIH1cbiAqIH1cbiAqIHRmLnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhNeUN1c3RvbUxheWVyKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBjbHMgVGhlIGNsYXNzIHRvIGJlIHJlZ2lzdGVyZWQuIEl0IG11c3QgaGF2ZSBhIHB1YmxpYyBzdGF0aWMgbWVtYmVyXG4gKiAgIGNhbGxlZCBgY2xhc3NOYW1lYCBkZWZpbmVkIGFuZCB0aGUgdmFsdWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ01vZGVscycsIHN1YmhlYWRpbmc6ICdTZXJpYWxpemF0aW9uJywgaWdub3JlQ0k6IHRydWV9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckNsYXNzKGNscykge1xuICAgIGFzc2VydChjbHMuY2xhc3NOYW1lICE9IG51bGwsICgpID0+IGBDbGFzcyBiZWluZyByZWdpc3RlcmVkIGRvZXMgbm90IGhhdmUgdGhlIHN0YXRpYyBjbGFzc05hbWUgYCArXG4gICAgICAgIGBwcm9wZXJ0eSBkZWZpbmVkLmApO1xuICAgIGFzc2VydCh0eXBlb2YgY2xzLmNsYXNzTmFtZSA9PT0gJ3N0cmluZycsICgpID0+IGBjbGFzc05hbWUgaXMgcmVxdWlyZWQgdG8gYmUgYSBzdHJpbmcsIGJ1dCBnb3QgdHlwZSBgICtcbiAgICAgICAgdHlwZW9mIGNscy5jbGFzc05hbWUpO1xuICAgIGFzc2VydChjbHMuY2xhc3NOYW1lLmxlbmd0aCA+IDAsICgpID0+IGBDbGFzcyBiZWluZyByZWdpc3RlcmVkIGhhcyBhbiBlbXB0eS1zdHJpbmcgYXMgaXRzIGNsYXNzTmFtZSwgYCArXG4gICAgICAgIGB3aGljaCBpcyBkaXNhbGxvd2VkLmApO1xuICAgIFNlcmlhbGl6YXRpb25NYXAucmVnaXN0ZXIoY2xzKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlcmlhbGl6YXRpb24uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuL3V0aWwnO1xuLyoqXG4gKiBDb21wdXRlcyBhIGxpc3Qgb2YgVGFwZU5vZGVzIHRoYXQgY29ubmVjdCB4IHRvIHksIGZpbHRlcmluZyBldmVyeXRoaW5nIGVsc2VcbiAqIG91dCBhbmQgcHJlc2VydmluZyB0aGUgb3JkZXIgb2YgdGhlIG9yaWdpbmFsIHRhcGUgZWxlbWVudHMuXG4gKlxuICogQHBhcmFtIHRhcGUgVGhlIHRhcGUgZWxlbWVudHMgdG8gZmlsdGVyLlxuICogQHBhcmFtIHhzIFRoZSBpbnB1dCBUZW5zb3JzLlxuICogQHBhcmFtIHkgVGhlIG91dHB1dCBUZW5zb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWx0ZXJlZE5vZGVzWFRvWSh0YXBlLCB4cywgeSkge1xuICAgIC8vIEZvcndhcmQgcGFzcyB0byBjb21wdXRlIGFsbCB0aGUgbm9kZXMgYW5kIFRlbnNvcnMgdGhhdCBhcmUgdHJhbnNpdGl2ZWx5IGFcbiAgICAvLyBmdW5jdGlvbiBvZiB4LlxuICAgIGNvbnN0IHRlbnNvcnNGcm9tWCA9IHt9O1xuICAgIGNvbnN0IG5vZGVzRnJvbVggPSB7fTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRlbnNvcnNGcm9tWFt4c1tpXS5pZF0gPSB0cnVlO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRhcGVbaV07XG4gICAgICAgIGNvbnN0IG5vZGVJbnB1dHMgPSBub2RlLmlucHV0cztcbiAgICAgICAgZm9yIChjb25zdCBpbnB1dE5hbWUgaW4gbm9kZUlucHV0cykge1xuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBub2RlSW5wdXRzW2lucHV0TmFtZV07XG4gICAgICAgICAgICBsZXQgYW55SW5wdXRGcm9tWCA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB4cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGlmICh0ZW5zb3JzRnJvbVhbaW5wdXQuaWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUub3V0cHV0cy5mb3JFYWNoKG91dHB1dCA9PiB0ZW5zb3JzRnJvbVhbb3V0cHV0LmlkXSA9IHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBhbnlJbnB1dEZyb21YID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbm9kZXNGcm9tWFtub2RlLmlkXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhbnlJbnB1dEZyb21YKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQmFja3dhcmQgcGFzcyB0byBmaW5kIGFsbCBvZiB0aGUgbm9kZXMgYW5kIFRlbnNvcnMgdGhhdCBsZWFkIHRvIHkuXG4gICAgY29uc3QgdGVuc29yc0xlYWRUb1kgPSB7fTtcbiAgICB0ZW5zb3JzTGVhZFRvWVt5LmlkXSA9IHRydWU7XG4gICAgY29uc3Qgbm9kZXNUb1kgPSB7fTtcbiAgICBmb3IgKGxldCBpID0gdGFwZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBjb25zdCBub2RlID0gdGFwZVtpXTtcbiAgICAgICAgY29uc3Qgbm9kZUlucHV0cyA9IG5vZGUuaW5wdXRzO1xuICAgICAgICAvLyBJZiBhbnkgb2YgdGhlIG91dHB1dHMgbGVhZCB0byB5LCBtYXJrIGFsbCBvZiB0aGUgaW5wdXRzIGFzIGxlYWRpbmcgdG8geS5cbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBub2RlLm91dHB1dHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmICh0ZW5zb3JzTGVhZFRvWVtub2RlLm91dHB1dHNbal0uaWRdKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpbnB1dE5hbWUgaW4gbm9kZUlucHV0cykge1xuICAgICAgICAgICAgICAgICAgICB0ZW5zb3JzTGVhZFRvWVtub2RlSW5wdXRzW2lucHV0TmFtZV0uaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbm9kZXNUb1lbbm9kZS5pZF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBSZXR1cm4gdGhlIHBhdGhzIHRoYXQgY29tZSBmcm9tIHggYW5kIGxlYWQgdG8geS5cbiAgICBjb25zdCBmaWx0ZXJlZFRhcGUgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRhcGVbaV07XG4gICAgICAgIGlmIChub2Rlc0Zyb21YW25vZGUuaWRdICYmIG5vZGVzVG9ZW25vZGUuaWRdKSB7XG4gICAgICAgICAgICAvLyBQcnVuZSB0aGUgaW5wdXRzIGZyb20gdGhlIG5vZGUgdGhhdCBhcmVuJ3QgYSBmdW5jdGlvbiBvZiB4LlxuICAgICAgICAgICAgY29uc3QgcHJ1bmVkSW5wdXRzID0ge307XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlucHV0TmFtZSBpbiBub2RlLmlucHV0cykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVJbnB1dCA9IG5vZGUuaW5wdXRzW2lucHV0TmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKHRlbnNvcnNGcm9tWFtub2RlSW5wdXQuaWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIHBydW5lZElucHV0c1tpbnB1dE5hbWVdID0gbm9kZUlucHV0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENvcHkgdGhlIG5vZGUgYW5kIG92ZXJ3cml0ZSBpbnB1dHNBbmRBcmdzIHRvIHRoZSBwcnVuZWQgdmVyc2lvbi5cbiAgICAgICAgICAgIGNvbnN0IHBydW5lZE5vZGUgPSBPYmplY3QuYXNzaWduKHt9LCBub2RlKTtcbiAgICAgICAgICAgIHBydW5lZE5vZGUuaW5wdXRzID0gcHJ1bmVkSW5wdXRzO1xuICAgICAgICAgICAgcHJ1bmVkTm9kZS5vdXRwdXRzID0gbm9kZS5vdXRwdXRzO1xuICAgICAgICAgICAgZmlsdGVyZWRUYXBlLnB1c2gocHJ1bmVkTm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZpbHRlcmVkVGFwZTtcbn1cbi8qKlxuICogQmFja3Byb3BhZ2F0ZSBncmFkaWVudHMgdGhyb3VnaCB0aGUgZmlsdGVyZWQgVGFwZU5vZGVzLlxuICpcbiAqIEBwYXJhbSB0ZW5zb3JBY2N1bXVsYXRlZEdyYWRpZW50TWFwIEEgbWFwIG9mIFRlbnNvciB0byBpdHMgZ3JhZGllbnQuIFRoaXMgbWFwXG4gKiBpcyBtdXRhdGVkIGJ5IHRoaXMgbWV0aG9kLlxuICogQHBhcmFtIGZpbHRlcmVkVGFwZSBUaGUgZmlsdGVyZWQgVGFwZU5vZGVzIHRvIGJhY2twcm9wIHRocm91Z2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiYWNrcHJvcGFnYXRlR3JhZGllbnRzKHRlbnNvckFjY3VtdWxhdGVkR3JhZGllbnRNYXAsIGZpbHRlcmVkVGFwZSwgdGlkeSwgYWRkKSB7XG4gICAgLy8gV2FsayB0aGUgdGFwZSBiYWNrd2FyZCBhbmQga2VlcCBhIG1hcCBvZiBUZW5zb3IgdG8gaXRzIGdyYWRpZW50LlxuICAgIGZvciAobGV0IGkgPSBmaWx0ZXJlZFRhcGUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IGZpbHRlcmVkVGFwZVtpXTtcbiAgICAgICAgY29uc3QgZHlzID0gW107XG4gICAgICAgIG5vZGUub3V0cHV0cy5mb3JFYWNoKG8gPT4ge1xuICAgICAgICAgICAgY29uc3QgZ3JhZFRlbnNvciA9IHRlbnNvckFjY3VtdWxhdGVkR3JhZGllbnRNYXBbby5pZF07XG4gICAgICAgICAgICBpZiAoZ3JhZFRlbnNvciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZHlzLnB1c2goZ3JhZFRlbnNvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIHBhcnRpY3VsYXIgb3V0cHV0IGlzIG5vdCBpbiB0aGUgYmFjay1wcm9wYWdhdGlvbiBzdWJncmFwaCwgc28gaXRcbiAgICAgICAgICAgICAgICAvLyBkb2VzIG5vdCBhZmZlY3QgdGhlIGZpbmFsIG91dHB1dCwgdGh1cyB3ZSBwdXQgbnVsbCBmb3IgaXRzIGR5LlxuICAgICAgICAgICAgICAgIGR5cy5wdXNoKG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKG5vZGUuZ3JhZGllbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29tcHV0ZSBncmFkaWVudDogZ3JhZGllbnQgZnVuY3Rpb24gbm90IGZvdW5kIGAgK1xuICAgICAgICAgICAgICAgIGBmb3IgJHtub2RlLmtlcm5lbE5hbWV9LmApO1xuICAgICAgICB9XG4gICAgICAgIC8vIEJhY2twcm9wIGR5IHRocm91Z2ggdGhpcyBub2RlIGFuZCBhY2N1bXVsYXRlIGdyYWRpZW50cyBvdmVyIHRoZSBpbnB1dHMuXG4gICAgICAgIGNvbnN0IGlucHV0R3JhZGllbnRzID0gbm9kZS5ncmFkaWVudChkeXMpO1xuICAgICAgICBmb3IgKGNvbnN0IGlucHV0TmFtZSBpbiBub2RlLmlucHV0cykge1xuICAgICAgICAgICAgaWYgKCEoaW5wdXROYW1lIGluIGlucHV0R3JhZGllbnRzKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGJhY2twcm9wIHRocm91Z2ggaW5wdXQgJHtpbnB1dE5hbWV9LiBgICtcbiAgICAgICAgICAgICAgICAgICAgYEF2YWlsYWJsZSBncmFkaWVudHMgZm91bmQ6ICR7T2JqZWN0LmtleXMoaW5wdXRHcmFkaWVudHMpfS5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENhbGwgdGhlIGdyYWRpZW50IGZ1bmN0aW9uLlxuICAgICAgICAgICAgY29uc3QgZHggPSB0aWR5KCgpID0+IGlucHV0R3JhZGllbnRzW2lucHV0TmFtZV0oKSk7XG4gICAgICAgICAgICBpZiAoZHguZHR5cGUgIT09ICdmbG9hdDMyJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgaW4gZ3JhZGllbnQgZm9yIG9wICR7bm9kZS5rZXJuZWxOYW1lfS4gVGhlIGdyYWRpZW50IG9mIGlucHV0IGAgK1xuICAgICAgICAgICAgICAgICAgICBgJHtpbnB1dE5hbWV9IG11c3QgaGF2ZSAnZmxvYXQzMicgZHR5cGUsIGJ1dCBoYXMgJyR7ZHguZHR5cGV9J2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeCA9IG5vZGUuaW5wdXRzW2lucHV0TmFtZV07XG4gICAgICAgICAgICBpZiAoIXV0aWwuYXJyYXlzRXF1YWwoZHguc2hhcGUsIHguc2hhcGUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBpbiBncmFkaWVudCBmb3Igb3AgJHtub2RlLmtlcm5lbE5hbWV9LiBUaGUgZ3JhZGllbnQgb2YgaW5wdXQgYCArXG4gICAgICAgICAgICAgICAgICAgIGAnJHtpbnB1dE5hbWV9JyBoYXMgc2hhcGUgJyR7ZHguc2hhcGV9Jywgd2hpY2ggZG9lcyBub3QgbWF0Y2ggYCArXG4gICAgICAgICAgICAgICAgICAgIGB0aGUgc2hhcGUgb2YgdGhlIGlucHV0ICcke3guc2hhcGV9J2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRlbnNvckFjY3VtdWxhdGVkR3JhZGllbnRNYXBbeC5pZF0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRlbnNvckFjY3VtdWxhdGVkR3JhZGllbnRNYXBbeC5pZF0gPSBkeDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1ckdyYWRpZW50ID0gdGVuc29yQWNjdW11bGF0ZWRHcmFkaWVudE1hcFt4LmlkXTtcbiAgICAgICAgICAgICAgICB0ZW5zb3JBY2N1bXVsYXRlZEdyYWRpZW50TWFwW3guaWRdID0gYWRkKGN1ckdyYWRpZW50LCBkeCk7XG4gICAgICAgICAgICAgICAgY3VyR3JhZGllbnQuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGFwZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBnZXRHbG9iYWwgfSBmcm9tICcuL2dsb2JhbF91dGlsJztcbmltcG9ydCB7IHRlbnNvclRvU3RyaW5nIH0gZnJvbSAnLi90ZW5zb3JfZm9ybWF0JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi91dGlsJztcbmltcG9ydCB7IGNvbXB1dGVTdHJpZGVzLCB0b05lc3RlZEFycmF5IH0gZnJvbSAnLi91dGlsJztcbi8qKlxuICogQSBtdXRhYmxlIG9iamVjdCwgc2ltaWxhciB0byBgdGYuVGVuc29yYCwgdGhhdCBhbGxvd3MgdXNlcnMgdG8gc2V0IHZhbHVlc1xuICogYXQgbG9jYXRpb25zIGJlZm9yZSBjb252ZXJ0aW5nIHRvIGFuIGltbXV0YWJsZSBgdGYuVGVuc29yYC5cbiAqXG4gKiBTZWUgYHRmLmJ1ZmZlcmAgZm9yIGNyZWF0aW5nIGEgdGVuc29yIGJ1ZmZlci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAqL1xuZXhwb3J0IGNsYXNzIFRlbnNvckJ1ZmZlciB7XG4gICAgY29uc3RydWN0b3Ioc2hhcGUsIGR0eXBlLCB2YWx1ZXMpIHtcbiAgICAgICAgdGhpcy5kdHlwZSA9IGR0eXBlO1xuICAgICAgICB0aGlzLnNoYXBlID0gc2hhcGUuc2xpY2UoKTtcbiAgICAgICAgdGhpcy5zaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHNoYXBlKTtcbiAgICAgICAgaWYgKHZhbHVlcyAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gdmFsdWVzLmxlbmd0aDtcbiAgICAgICAgICAgIHV0aWwuYXNzZXJ0KG4gPT09IHRoaXMuc2l6ZSwgKCkgPT4gYExlbmd0aCBvZiB2YWx1ZXMgJyR7bn0nIGRvZXMgbm90IG1hdGNoIHRoZSBzaXplIGAgK1xuICAgICAgICAgICAgICAgIGBpbmZlcnJlZCBieSB0aGUgc2hhcGUgJyR7dGhpcy5zaXplfScuYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBjb21wbGV4NjQgZHR5cGUgVGVuc29yQnVmZmVycyBhcmUgbm90IHN1cHBvcnRlZC4gUGxlYXNlIGNyZWF0ZSBgICtcbiAgICAgICAgICAgICAgICBgYSBUZW5zb3JCdWZmZXIgZm9yIHRoZSByZWFsIGFuZCBpbWFnaW5hcnkgcGFydHMgc2VwYXJhdGVseSBhbmQgYCArXG4gICAgICAgICAgICAgICAgYGNhbGwgdGYuY29tcGxleChyZWFsLCBpbWFnKS5gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbHVlcyA9IHZhbHVlcyB8fCB1dGlsLmdldEFycmF5RnJvbURUeXBlKGR0eXBlLCB0aGlzLnNpemUpO1xuICAgICAgICB0aGlzLnN0cmlkZXMgPSBjb21wdXRlU3RyaWRlcyhzaGFwZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgYSB2YWx1ZSBpbiB0aGUgYnVmZmVyIGF0IGEgZ2l2ZW4gbG9jYXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcGFyYW0gbG9jcyAgVGhlIGxvY2F0aW9uIGluZGljZXMuXG4gICAgICpcbiAgICAgKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gICAgICovXG4gICAgc2V0KHZhbHVlLCAuLi5sb2NzKSB7XG4gICAgICAgIGlmIChsb2NzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgbG9jcyA9IFswXTtcbiAgICAgICAgfVxuICAgICAgICB1dGlsLmFzc2VydChsb2NzLmxlbmd0aCA9PT0gdGhpcy5yYW5rLCAoKSA9PiBgVGhlIG51bWJlciBvZiBwcm92aWRlZCBjb29yZGluYXRlcyAoJHtsb2NzLmxlbmd0aH0pIG11c3QgYCArXG4gICAgICAgICAgICBgbWF0Y2ggdGhlIHJhbmsgKCR7dGhpcy5yYW5rfSlgKTtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmxvY1RvSW5kZXgobG9jcyk7XG4gICAgICAgIHRoaXMudmFsdWVzW2luZGV4XSA9IHZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBpbiB0aGUgYnVmZmVyIGF0IHRoZSBwcm92aWRlZCBsb2NhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsb2NzIFRoZSBsb2NhdGlvbiBpbmRpY2VzLlxuICAgICAqXG4gICAgICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICAgICAqL1xuICAgIGdldCguLi5sb2NzKSB7XG4gICAgICAgIGlmIChsb2NzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgbG9jcyA9IFswXTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgbG9jIG9mIGxvY3MpIHtcbiAgICAgICAgICAgIGlmIChsb2MgPCAwIHx8IGxvYyA+PSB0aGlzLnNoYXBlW2ldKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXNnID0gYFJlcXVlc3RlZCBvdXQgb2YgcmFuZ2UgZWxlbWVudCBhdCAke2xvY3N9LiBgICtcbiAgICAgICAgICAgICAgICAgICAgYCAgQnVmZmVyIHNoYXBlPSR7dGhpcy5zaGFwZX1gO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIGxldCBpbmRleCA9IGxvY3NbbG9jcy5sZW5ndGggLSAxXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NzLmxlbmd0aCAtIDE7ICsraSkge1xuICAgICAgICAgICAgaW5kZXggKz0gdGhpcy5zdHJpZGVzW2ldICogbG9jc1tpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZXNbaW5kZXhdO1xuICAgIH1cbiAgICBsb2NUb0luZGV4KGxvY3MpIHtcbiAgICAgICAgaWYgKHRoaXMucmFuayA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5yYW5rID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jc1swXTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaW5kZXggPSBsb2NzW2xvY3MubGVuZ3RoIC0gMV07XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9jcy5sZW5ndGggLSAxOyArK2kpIHtcbiAgICAgICAgICAgIGluZGV4ICs9IHRoaXMuc3RyaWRlc1tpXSAqIGxvY3NbaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgICBpbmRleFRvTG9jKGluZGV4KSB7XG4gICAgICAgIGlmICh0aGlzLnJhbmsgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnJhbmsgPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBbaW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxvY3MgPSBuZXcgQXJyYXkodGhpcy5zaGFwZS5sZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvY3MubGVuZ3RoIC0gMTsgKytpKSB7XG4gICAgICAgICAgICBsb2NzW2ldID0gTWF0aC5mbG9vcihpbmRleCAvIHRoaXMuc3RyaWRlc1tpXSk7XG4gICAgICAgICAgICBpbmRleCAtPSBsb2NzW2ldICogdGhpcy5zdHJpZGVzW2ldO1xuICAgICAgICB9XG4gICAgICAgIGxvY3NbbG9jcy5sZW5ndGggLSAxXSA9IGluZGV4O1xuICAgICAgICByZXR1cm4gbG9jcztcbiAgICB9XG4gICAgZ2V0IHJhbmsoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNoYXBlLmxlbmd0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbW11dGFibGUgYHRmLlRlbnNvcmAgb2JqZWN0IGZyb20gdGhlIGJ1ZmZlci5cbiAgICAgKlxuICAgICAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAgICAgKi9cbiAgICB0b1RlbnNvcigpIHtcbiAgICAgICAgcmV0dXJuIHRyYWNrZXJGbigpLm1ha2VUZW5zb3IodGhpcy52YWx1ZXMsIHRoaXMuc2hhcGUsIHRoaXMuZHR5cGUpO1xuICAgIH1cbn1cbi8vIEZvciB0cmFja2luZyB0ZW5zb3IgY3JlYXRpb24gYW5kIGRpc3Bvc2FsLlxubGV0IHRyYWNrZXJGbiA9IG51bGw7XG4vLyBVc2VkIGJ5IGNoYWluaW5nIG1ldGhvZHMgdG8gY2FsbCBpbnRvIG9wcy5cbmxldCBvcEhhbmRsZXIgPSBudWxsO1xuLy8gVXNlZCB0byB3YXJuIGFib3V0IGRlcHJlY2F0ZWQgbWV0aG9kcy5cbmxldCBkZXByZWNhdGlvbldhcm5pbmdGbiA9IG51bGw7XG4vLyBUaGlzIGhlcmUgc28gdGhhdCB3ZSBjYW4gdXNlIHRoaXMgbWV0aG9kIG9uIGRldiBicmFuY2hlcyBhbmQga2VlcCB0aGVcbi8vIGZ1bmN0aW9uYWxpdHkgYXQgbWFzdGVyLlxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVudXNlZC1leHByZXNzaW9uXG5bZGVwcmVjYXRpb25XYXJuaW5nRm5dO1xuLyoqXG4gKiBBbiBleHRlcm5hbCBjb25zdW1lciBjYW4gcmVnaXN0ZXIgaXRzZWxmIGFzIHRoZSB0ZW5zb3IgdHJhY2tlci4gVGhpcyB3YXlcbiAqIHRoZSBUZW5zb3IgY2xhc3MgY2FuIG5vdGlmeSB0aGUgdHJhY2tlciBmb3IgZXZlcnkgdGVuc29yIGNyZWF0ZWQgYW5kXG4gKiBkaXNwb3NlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFRlbnNvclRyYWNrZXIoZm4pIHtcbiAgICB0cmFja2VyRm4gPSBmbjtcbn1cbi8qKlxuICogQW4gZXh0ZXJuYWwgY29uc3VtZXIgY2FuIHJlZ2lzdGVyIGl0c2VsZiBhcyB0aGUgb3AgaGFuZGxlci4gVGhpcyB3YXkgdGhlXG4gKiBUZW5zb3IgY2xhc3MgY2FuIGhhdmUgY2hhaW5pbmcgbWV0aG9kcyB0aGF0IGNhbGwgaW50byBvcHMgdmlhIHRoZSBvcFxuICogaGFuZGxlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldE9wSGFuZGxlcihoYW5kbGVyKSB7XG4gICAgb3BIYW5kbGVyID0gaGFuZGxlcjtcbn1cbi8qKlxuICogU2V0cyB0aGUgZGVwcmVjYXRpb24gd2FybmluZyBmdW5jdGlvbiB0byBiZSB1c2VkIGJ5IHRoaXMgZmlsZS4gVGhpcyB3YXkgdGhlXG4gKiBUZW5zb3IgY2xhc3MgY2FuIGJlIGEgbGVhZiBidXQgc3RpbGwgdXNlIHRoZSBlbnZpcm9ubWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldERlcHJlY2F0aW9uV2FybmluZ0ZuKGZuKSB7XG4gICAgZGVwcmVjYXRpb25XYXJuaW5nRm4gPSBmbjtcbn1cbi8qKlxuICogQSBgdGYuVGVuc29yYCBvYmplY3QgcmVwcmVzZW50cyBhbiBpbW11dGFibGUsIG11bHRpZGltZW5zaW9uYWwgYXJyYXkgb2ZcbiAqIG51bWJlcnMgdGhhdCBoYXMgYSBzaGFwZSBhbmQgYSBkYXRhIHR5cGUuXG4gKlxuICogRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIGZ1bmN0aW9ucyB0aGF0IGNyZWF0ZSB0ZW5zb3JzIGRvIG5vdCBuZWNlc3NhcmlseVxuICogcGVyZm9ybSBhIGNvcHkgb2YgdGhlIGRhdGEgcGFzc2VkIHRvIHRoZW0gKGUuZy4gaWYgdGhlIGRhdGEgaXMgcGFzc2VkIGFzIGFcbiAqIGBGbG9hdDMyQXJyYXlgKSwgYW5kIGNoYW5nZXMgdG8gdGhlIGRhdGEgd2lsbCBjaGFuZ2UgdGhlIHRlbnNvci4gVGhpcyBpcyBub3RcbiAqIGEgZmVhdHVyZSBhbmQgaXMgbm90IHN1cHBvcnRlZC4gVG8gYXZvaWQgdGhpcyBiZWhhdmlvciwgdXNlIHRoZSB0ZW5zb3IgYmVmb3JlXG4gKiBjaGFuZ2luZyB0aGUgaW5wdXQgZGF0YSBvciBjcmVhdGUgYSBjb3B5IHdpdGggYGNvcHkgPSB0Zi5hZGQoeW91clRlbnNvciwgMClgLlxuICpcbiAqIFNlZSBgdGYudGVuc29yYCBmb3IgZGV0YWlscyBvbiBob3cgdG8gY3JlYXRlIGEgYHRmLlRlbnNvcmAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gKi9cbmV4cG9ydCBjbGFzcyBUZW5zb3Ige1xuICAgIGNvbnN0cnVjdG9yKHNoYXBlLCBkdHlwZSwgZGF0YUlkLCBpZCkge1xuICAgICAgICAvKiogV2hldGhlciB0aGlzIHRlbnNvciBoYXMgYmVlbiBnbG9iYWxseSBrZXB0LiAqL1xuICAgICAgICB0aGlzLmtlcHQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc0Rpc3Bvc2VkSW50ZXJuYWwgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zaGFwZSA9IHNoYXBlLnNsaWNlKCk7XG4gICAgICAgIHRoaXMuZHR5cGUgPSBkdHlwZSB8fCAnZmxvYXQzMic7XG4gICAgICAgIHRoaXMuc2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShzaGFwZSk7XG4gICAgICAgIHRoaXMuc3RyaWRlcyA9IGNvbXB1dGVTdHJpZGVzKHNoYXBlKTtcbiAgICAgICAgdGhpcy5kYXRhSWQgPSBkYXRhSWQ7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5yYW5rVHlwZSA9ICh0aGlzLnJhbmsgPCA1ID8gdGhpcy5yYW5rLnRvU3RyaW5nKCkgOiAnaGlnaGVyJyk7XG4gICAgfVxuICAgIGdldCByYW5rKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zaGFwZS5sZW5ndGg7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBwcm9taXNlIG9mIGB0Zi5UZW5zb3JCdWZmZXJgIHRoYXQgaG9sZHMgdGhlIHVuZGVybHlpbmcgZGF0YS5cbiAgICAgKlxuICAgICAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NsYXNzZXMnfVxuICAgICAqL1xuICAgIGFzeW5jIGJ1ZmZlcigpIHtcbiAgICAgICAgY29uc3QgdmFscyA9IGF3YWl0IHRoaXMuZGF0YSgpO1xuICAgICAgICByZXR1cm4gb3BIYW5kbGVyLmJ1ZmZlcih0aGlzLnNoYXBlLCB0aGlzLmR0eXBlLCB2YWxzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGB0Zi5UZW5zb3JCdWZmZXJgIHRoYXQgaG9sZHMgdGhlIHVuZGVybHlpbmcgZGF0YS5cbiAgICAgKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICAgKi9cbiAgICBidWZmZXJTeW5jKCkge1xuICAgICAgICByZXR1cm4gb3BIYW5kbGVyLmJ1ZmZlcih0aGlzLnNoYXBlLCB0aGlzLmR0eXBlLCB0aGlzLmRhdGFTeW5jKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB0ZW5zb3IgZGF0YSBhcyBhIG5lc3RlZCBhcnJheS4gVGhlIHRyYW5zZmVyIG9mIGRhdGEgaXMgZG9uZVxuICAgICAqIGFzeW5jaHJvbm91c2x5LlxuICAgICAqXG4gICAgICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAgICovXG4gICAgYXN5bmMgYXJyYXkoKSB7XG4gICAgICAgIGNvbnN0IHZhbHMgPSBhd2FpdCB0aGlzLmRhdGEoKTtcbiAgICAgICAgcmV0dXJuIHRvTmVzdGVkQXJyYXkodGhpcy5zaGFwZSwgdmFscywgdGhpcy5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB0ZW5zb3IgZGF0YSBhcyBhIG5lc3RlZCBhcnJheS4gVGhlIHRyYW5zZmVyIG9mIGRhdGEgaXMgZG9uZVxuICAgICAqIHN5bmNocm9ub3VzbHkuXG4gICAgICpcbiAgICAgKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICAgKi9cbiAgICBhcnJheVN5bmMoKSB7XG4gICAgICAgIHJldHVybiB0b05lc3RlZEFycmF5KHRoaXMuc2hhcGUsIHRoaXMuZGF0YVN5bmMoKSwgdGhpcy5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBc3luY2hyb25vdXNseSBkb3dubG9hZHMgdGhlIHZhbHVlcyBmcm9tIHRoZSBgdGYuVGVuc29yYC4gUmV0dXJucyBhXG4gICAgICogcHJvbWlzZSBvZiBgVHlwZWRBcnJheWAgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjb21wdXRhdGlvbiBoYXMgZmluaXNoZWQuXG4gICAgICpcbiAgICAgKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICAgKi9cbiAgICBhc3luYyBkYXRhKCkge1xuICAgICAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgICAgICBjb25zdCBkYXRhID0gdHJhY2tlckZuKCkucmVhZCh0aGlzLmRhdGFJZCk7XG4gICAgICAgIGlmICh0aGlzLmR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSBhd2FpdCBkYXRhO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYnl0ZXMubWFwKGIgPT4gdXRpbC5kZWNvZGVTdHJpbmcoYikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZGVjb2RlIHRoZSBzdHJpbmcgYnl0ZXMgaW50byB1dGYtOC4gJyArXG4gICAgICAgICAgICAgICAgICAgICdUbyBnZXQgdGhlIG9yaWdpbmFsIGJ5dGVzLCBjYWxsIHRlbnNvci5ieXRlcygpLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTeW5jaHJvbm91c2x5IGRvd25sb2FkcyB0aGUgdmFsdWVzIGZyb20gdGhlIGB0Zi5UZW5zb3JgLiBUaGlzIGJsb2NrcyB0aGVcbiAgICAgKiBVSSB0aHJlYWQgdW50aWwgdGhlIHZhbHVlcyBhcmUgcmVhZHksIHdoaWNoIGNhbiBjYXVzZSBwZXJmb3JtYW5jZSBpc3N1ZXMuXG4gICAgICpcbiAgICAgKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICAgKi9cbiAgICBkYXRhU3luYygpIHtcbiAgICAgICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRyYWNrZXJGbigpLnJlYWRTeW5jKHRoaXMuZGF0YUlkKTtcbiAgICAgICAgaWYgKHRoaXMuZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhLm1hcChiID0+IHV0aWwuZGVjb2RlU3RyaW5nKGIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChfYSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGRlY29kZSB0aGUgc3RyaW5nIGJ5dGVzIGludG8gdXRmLTguICcgK1xuICAgICAgICAgICAgICAgICAgICAnVG8gZ2V0IHRoZSBvcmlnaW5hbCBieXRlcywgY2FsbCB0ZW5zb3IuYnl0ZXMoKS4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgLyoqIFJldHVybnMgdGhlIHVuZGVybHlpbmcgYnl0ZXMgb2YgdGhlIHRlbnNvcidzIGRhdGEuICovXG4gICAgYXN5bmMgYnl0ZXMoKSB7XG4gICAgICAgIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0cmFja2VyRm4oKS5yZWFkKHRoaXMuZGF0YUlkKTtcbiAgICAgICAgaWYgKHRoaXMuZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShkYXRhLmJ1ZmZlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRGlzcG9zZXMgYHRmLlRlbnNvcmAgZnJvbSBtZW1vcnkuXG4gICAgICpcbiAgICAgKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICAgKi9cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICBpZiAodGhpcy5pc0Rpc3Bvc2VkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdHJhY2tlckZuKCkuZGlzcG9zZVRlbnNvcih0aGlzKTtcbiAgICAgICAgdGhpcy5pc0Rpc3Bvc2VkSW50ZXJuYWwgPSB0cnVlO1xuICAgIH1cbiAgICBnZXQgaXNEaXNwb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNEaXNwb3NlZEludGVybmFsO1xuICAgIH1cbiAgICB0aHJvd0lmRGlzcG9zZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGVuc29yIGlzIGRpc3Bvc2VkLmApO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByaW50cyB0aGUgYHRmLlRlbnNvcmAuIFNlZSBgdGYucHJpbnRgIGZvciBkZXRhaWxzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZlcmJvc2UgV2hldGhlciB0byBwcmludCB2ZXJib3NlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0ZW5zb3IsXG4gICAgICogICAgaW5jbHVkaW5nIGR0eXBlIGFuZCBzaXplLlxuICAgICAqXG4gICAgICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAgICovXG4gICAgcHJpbnQodmVyYm9zZSA9IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBvcEhhbmRsZXIucHJpbnQodGhpcywgdmVyYm9zZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBjb3B5IG9mIHRoZSB0ZW5zb3IuIFNlZSBgdGYuY2xvbmVgIGZvciBkZXRhaWxzLlxuICAgICAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NsYXNzZXMnfVxuICAgICAqL1xuICAgIGNsb25lKCkge1xuICAgICAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgICAgICByZXR1cm4gb3BIYW5kbGVyLmNsb25lKHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIHRlbnNvci4gVXNlZnVsIGZvciBsb2dnaW5nLlxuICAgICAqXG4gICAgICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAgICovXG4gICAgdG9TdHJpbmcodmVyYm9zZSA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IHZhbHMgPSB0aGlzLmRhdGFTeW5jKCk7XG4gICAgICAgIHJldHVybiB0ZW5zb3JUb1N0cmluZyh2YWxzLCB0aGlzLnNoYXBlLCB0aGlzLmR0eXBlLCB2ZXJib3NlKTtcbiAgICB9XG4gICAgY2FzdChkdHlwZSkge1xuICAgICAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgICAgICByZXR1cm4gb3BIYW5kbGVyLmNhc3QodGhpcywgZHR5cGUpO1xuICAgIH1cbiAgICB2YXJpYWJsZSh0cmFpbmFibGUgPSB0cnVlLCBuYW1lLCBkdHlwZSkge1xuICAgICAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgICAgICByZXR1cm4gdHJhY2tlckZuKCkubWFrZVZhcmlhYmxlKHRoaXMsIHRyYWluYWJsZSwgbmFtZSwgZHR5cGUpO1xuICAgIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShUZW5zb3IsIFN5bWJvbC5oYXNJbnN0YW5jZSwge1xuICAgIHZhbHVlOiAoaW5zdGFuY2UpID0+IHtcbiAgICAgICAgLy8gSW1wbGVtZW50YXRpb24gbm90ZTogd2Ugc2hvdWxkIHVzZSBwcm9wZXJ0aWVzIG9mIHRoZSBvYmplY3QgdGhhdCB3aWxsIGJlXG4gICAgICAgIC8vIGRlZmluZWQgYmVmb3JlIHRoZSBjb25zdHJ1Y3RvciBib2R5IGhhcyBmaW5pc2hlZCBleGVjdXRpbmcgKG1ldGhvZHMpLlxuICAgICAgICAvLyBUaGlzIGlzIGJlY2F1c2Ugd2hlbiB0aGlzIGNvZGUgaXMgdHJhbnNwaWxlZCBieSBiYWJlbCwgYmFiZWwgd2lsbCBjYWxsXG4gICAgICAgIC8vIGNsYXNzQ2FsbENoZWNrIGJlZm9yZSB0aGUgY29uc3RydWN0b3IgYm9keSBpcyBydW4uXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZmpzL2lzc3Vlcy8zMzg0IGZvciBiYWNrc3RvcnkuXG4gICAgICAgIHJldHVybiAhIWluc3RhbmNlICYmIGluc3RhbmNlLmRhdGEgIT0gbnVsbCAmJiBpbnN0YW5jZS5kYXRhU3luYyAhPSBudWxsICYmXG4gICAgICAgICAgICBpbnN0YW5jZS50aHJvd0lmRGlzcG9zZWQgIT0gbnVsbDtcbiAgICB9XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBnZXRHbG9iYWxUZW5zb3JDbGFzcygpIHtcbiAgICAvLyBVc2UgZ2V0R2xvYmFsIHNvIHRoYXQgd2UgY2FuIGF1Z21lbnQgdGhlIFRlbnNvciBjbGFzcyBhY3Jvc3MgcGFja2FnZVxuICAgIC8vIGJvdW5kYXJpZXMgYmVjYXNlIHRoZSBub2RlIHJlc29sdXRpb24gYWxnIG1heSByZXN1bHQgaW4gZGlmZmVyZW50IG1vZHVsZXNcbiAgICAvLyBiZWluZyByZXR1cm5lZCBmb3IgdGhpcyBmaWxlIGRlcGVuZGluZyBvbiB0aGUgcGF0aCB0aGV5IGFyZSBsb2FkZWQgZnJvbS5cbiAgICByZXR1cm4gZ2V0R2xvYmFsKCdUZW5zb3InLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiBUZW5zb3I7XG4gICAgfSk7XG59XG4vLyBHbG9iYWwgc2lkZSBlZmZlY3QuIENhY2hlIGdsb2JhbCByZWZlcmVuY2UgdG8gVGVuc29yIGNsYXNzXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpO1xuLyoqXG4gKiBBIG11dGFibGUgYHRmLlRlbnNvcmAsIHVzZWZ1bCBmb3IgcGVyc2lzdGluZyBzdGF0ZSwgZS5nLiBmb3IgdHJhaW5pbmcuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gKi9cbmV4cG9ydCBjbGFzcyBWYXJpYWJsZSBleHRlbmRzIFRlbnNvciB7XG4gICAgY29uc3RydWN0b3IoaW5pdGlhbFZhbHVlLCB0cmFpbmFibGUsIG5hbWUsIHRlbnNvcklkKSB7XG4gICAgICAgIHN1cGVyKGluaXRpYWxWYWx1ZS5zaGFwZSwgaW5pdGlhbFZhbHVlLmR0eXBlLCBpbml0aWFsVmFsdWUuZGF0YUlkLCB0ZW5zb3JJZCk7XG4gICAgICAgIHRoaXMudHJhaW5hYmxlID0gdHJhaW5hYmxlO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBc3NpZ24gYSBuZXcgYHRmLlRlbnNvcmAgdG8gdGhpcyB2YXJpYWJsZS4gVGhlIG5ldyBgdGYuVGVuc29yYCBtdXN0IGhhdmVcbiAgICAgKiB0aGUgc2FtZSBzaGFwZSBhbmQgZHR5cGUgYXMgdGhlIG9sZCBgdGYuVGVuc29yYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuZXdWYWx1ZSBOZXcgdGVuc29yIHRvIGJlIGFzc2lnbmVkIHRvIHRoaXMgdmFyaWFibGUuXG4gICAgICpcbiAgICAgKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICAgKi9cbiAgICBhc3NpZ24obmV3VmFsdWUpIHtcbiAgICAgICAgaWYgKG5ld1ZhbHVlLmR0eXBlICE9PSB0aGlzLmR0eXBlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGR0eXBlIG9mIHRoZSBuZXcgdmFsdWUgKCR7bmV3VmFsdWUuZHR5cGV9KSBhbmQgYCArXG4gICAgICAgICAgICAgICAgYHByZXZpb3VzIHZhbHVlICgke3RoaXMuZHR5cGV9KSBtdXN0IG1hdGNoYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF1dGlsLmFycmF5c0VxdWFsKG5ld1ZhbHVlLnNoYXBlLCB0aGlzLnNoYXBlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzaGFwZSBvZiB0aGUgbmV3IHZhbHVlICgke25ld1ZhbHVlLnNoYXBlfSkgYW5kIGAgK1xuICAgICAgICAgICAgICAgIGBwcmV2aW91cyB2YWx1ZSAoJHt0aGlzLnNoYXBlfSkgbXVzdCBtYXRjaGApO1xuICAgICAgICB9XG4gICAgICAgIHRyYWNrZXJGbigpLmRpc3Bvc2VUZW5zb3IodGhpcyk7XG4gICAgICAgIHRoaXMuZGF0YUlkID0gbmV3VmFsdWUuZGF0YUlkO1xuICAgICAgICB0cmFja2VyRm4oKS5pbmNSZWYodGhpcywgbnVsbCAvKiBiYWNrZW5kICovKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdHJhY2tlckZuKCkuZGlzcG9zZVZhcmlhYmxlKHRoaXMpO1xuICAgICAgICB0aGlzLmlzRGlzcG9zZWRJbnRlcm5hbCA9IHRydWU7XG4gICAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZhcmlhYmxlLCBTeW1ib2wuaGFzSW5zdGFuY2UsIHtcbiAgICB2YWx1ZTogKGluc3RhbmNlKSA9PiB7XG4gICAgICAgIHJldHVybiBpbnN0YW5jZSBpbnN0YW5jZW9mIFRlbnNvciAmJiBpbnN0YW5jZS5hc3NpZ24gIT0gbnVsbCAmJlxuICAgICAgICAgICAgaW5zdGFuY2UuYXNzaWduIGluc3RhbmNlb2YgRnVuY3Rpb247XG4gICAgfVxufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10ZW5zb3IuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29tcHV0ZVN0cmlkZXMsIGlzU3RyaW5nLCByaWdodFBhZCwgc2l6ZUZyb21TaGFwZSB9IGZyb20gJy4vdXRpbCc7XG4vLyBNYXhpbXVtIG51bWJlciBvZiB2YWx1ZXMgYmVmb3JlIHdlIGRlY2lkZSB0byBzaG93IGVsbGlwc2lzLlxuY29uc3QgRk9STUFUX0xJTUlUX05VTV9WQUxTID0gMjA7XG4vLyBOdW1iZXIgb2YgZmlyc3QgYW5kIGxhc3QgdmFsdWVzIHRvIHNob3cgd2hlbiBkaXNwbGF5aW5nIGEsIGIsLi4uLHksIHouXG5jb25zdCBGT1JNQVRfTlVNX0ZJUlNUX0xBU1RfVkFMUyA9IDM7XG4vLyBOdW1iZXIgb2Ygc2lnbmlmaWNhbnQgZGlnaXRzIHRvIHNob3cuXG5jb25zdCBGT1JNQVRfTlVNX1NJR19ESUdJVFMgPSA3O1xuZXhwb3J0IGZ1bmN0aW9uIHRlbnNvclRvU3RyaW5nKHZhbHMsIHNoYXBlLCBkdHlwZSwgdmVyYm9zZSkge1xuICAgIGNvbnN0IHN0cmlkZXMgPSBjb21wdXRlU3RyaWRlcyhzaGFwZSk7XG4gICAgY29uc3QgcGFkUGVyQ29sID0gY29tcHV0ZU1heFNpemVQZXJDb2x1bW4odmFscywgc2hhcGUsIGR0eXBlLCBzdHJpZGVzKTtcbiAgICBjb25zdCByYW5rID0gc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IHZhbHNMaW5lcyA9IHN1YlRlbnNvclRvU3RyaW5nKHZhbHMsIHNoYXBlLCBkdHlwZSwgc3RyaWRlcywgcGFkUGVyQ29sKTtcbiAgICBjb25zdCBsaW5lcyA9IFsnVGVuc29yJ107XG4gICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgbGluZXMucHVzaChgICBkdHlwZTogJHtkdHlwZX1gKTtcbiAgICAgICAgbGluZXMucHVzaChgICByYW5rOiAke3Jhbmt9YCk7XG4gICAgICAgIGxpbmVzLnB1c2goYCAgc2hhcGU6IFske3NoYXBlfV1gKTtcbiAgICAgICAgbGluZXMucHVzaChgICB2YWx1ZXM6YCk7XG4gICAgfVxuICAgIGxpbmVzLnB1c2godmFsc0xpbmVzLm1hcChsID0+ICcgICAgJyArIGwpLmpvaW4oJ1xcbicpKTtcbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG59XG5mdW5jdGlvbiBjb21wdXRlTWF4U2l6ZVBlckNvbHVtbih2YWxzLCBzaGFwZSwgZHR5cGUsIHN0cmlkZXMpIHtcbiAgICBjb25zdCBuID0gc2l6ZUZyb21TaGFwZShzaGFwZSk7XG4gICAgY29uc3QgbnVtQ29scyA9IHN0cmlkZXNbc3RyaWRlcy5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBwYWRQZXJDb2wgPSBuZXcgQXJyYXkobnVtQ29scykuZmlsbCgwKTtcbiAgICBjb25zdCByYW5rID0gc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IHZhbHVlc09yVHVwbGVzID0gZHR5cGUgPT09ICdjb21wbGV4NjQnID8gY3JlYXRlQ29tcGxleFR1cGxlcyh2YWxzKSA6IHZhbHM7XG4gICAgaWYgKHJhbmsgPiAxKSB7XG4gICAgICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IG4gLyBudW1Db2xzOyByb3crKykge1xuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gcm93ICogbnVtQ29scztcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbnVtQ29sczsgaisrKSB7XG4gICAgICAgICAgICAgICAgcGFkUGVyQ29sW2pdID0gTWF0aC5tYXgocGFkUGVyQ29sW2pdLCB2YWxUb1N0cmluZyh2YWx1ZXNPclR1cGxlc1tvZmZzZXQgKyBqXSwgMCwgZHR5cGUpLmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhZFBlckNvbDtcbn1cbmZ1bmN0aW9uIHZhbFRvU3RyaW5nKHZhbCwgcGFkLCBkdHlwZSkge1xuICAgIGxldCB2YWxTdHI7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICB2YWxTdHIgPSBgJHtwYXJzZUZsb2F0KHZhbFswXS50b0ZpeGVkKEZPUk1BVF9OVU1fU0lHX0RJR0lUUykpfSArIGAgK1xuICAgICAgICAgICAgYCR7cGFyc2VGbG9hdCh2YWxbMV0udG9GaXhlZChGT1JNQVRfTlVNX1NJR19ESUdJVFMpKX1qYDtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNTdHJpbmcodmFsKSkge1xuICAgICAgICB2YWxTdHIgPSBgJyR7dmFsfSdgO1xuICAgIH1cbiAgICBlbHNlIGlmIChkdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgICAgIHZhbFN0ciA9IGJvb2xOdW1Ub1N0cmluZyh2YWwpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdmFsU3RyID0gcGFyc2VGbG9hdCh2YWwudG9GaXhlZChGT1JNQVRfTlVNX1NJR19ESUdJVFMpKS50b1N0cmluZygpO1xuICAgIH1cbiAgICByZXR1cm4gcmlnaHRQYWQodmFsU3RyLCBwYWQpO1xufVxuZnVuY3Rpb24gYm9vbE51bVRvU3RyaW5nKHYpIHtcbiAgICByZXR1cm4gdiA9PT0gMCA/ICdmYWxzZScgOiAndHJ1ZSc7XG59XG5mdW5jdGlvbiBzdWJUZW5zb3JUb1N0cmluZyh2YWxzLCBzaGFwZSwgZHR5cGUsIHN0cmlkZXMsIHBhZFBlckNvbCwgaXNMYXN0ID0gdHJ1ZSkge1xuICAgIGNvbnN0IHN0b3JhZ2VQZXJFbGVtZW50ID0gZHR5cGUgPT09ICdjb21wbGV4NjQnID8gMiA6IDE7XG4gICAgY29uc3Qgc2l6ZSA9IHNoYXBlWzBdO1xuICAgIGNvbnN0IHJhbmsgPSBzaGFwZS5sZW5ndGg7XG4gICAgaWYgKHJhbmsgPT09IDApIHtcbiAgICAgICAgaWYgKGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICAgICAgY29uc3QgY29tcGxleFR1cGxlID0gY3JlYXRlQ29tcGxleFR1cGxlcyh2YWxzKTtcbiAgICAgICAgICAgIHJldHVybiBbdmFsVG9TdHJpbmcoY29tcGxleFR1cGxlWzBdLCAwLCBkdHlwZSldO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgICAgICAgICByZXR1cm4gW2Jvb2xOdW1Ub1N0cmluZyh2YWxzWzBdKV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFt2YWxzWzBdLnRvU3RyaW5nKCldO1xuICAgIH1cbiAgICBpZiAocmFuayA9PT0gMSkge1xuICAgICAgICBpZiAoc2l6ZSA+IEZPUk1BVF9MSU1JVF9OVU1fVkFMUykge1xuICAgICAgICAgICAgY29uc3QgZmlyc3RWYWxzU2l6ZSA9IEZPUk1BVF9OVU1fRklSU1RfTEFTVF9WQUxTICogc3RvcmFnZVBlckVsZW1lbnQ7XG4gICAgICAgICAgICBsZXQgZmlyc3RWYWxzID0gQXJyYXkuZnJvbSh2YWxzLnNsaWNlKDAsIGZpcnN0VmFsc1NpemUpKTtcbiAgICAgICAgICAgIGxldCBsYXN0VmFscyA9IEFycmF5LmZyb20odmFscy5zbGljZSgoc2l6ZSAtIEZPUk1BVF9OVU1fRklSU1RfTEFTVF9WQUxTKSAqIHN0b3JhZ2VQZXJFbGVtZW50LCBzaXplICogc3RvcmFnZVBlckVsZW1lbnQpKTtcbiAgICAgICAgICAgIGlmIChkdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgICAgICAgICBmaXJzdFZhbHMgPSBjcmVhdGVDb21wbGV4VHVwbGVzKGZpcnN0VmFscyk7XG4gICAgICAgICAgICAgICAgbGFzdFZhbHMgPSBjcmVhdGVDb21wbGV4VHVwbGVzKGxhc3RWYWxzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgJ1snICtcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RWYWxzLm1hcCgoeCwgaSkgPT4gdmFsVG9TdHJpbmcoeCwgcGFkUGVyQ29sW2ldLCBkdHlwZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAuam9pbignLCAnKSArXG4gICAgICAgICAgICAgICAgICAgICcsIC4uLiwgJyArXG4gICAgICAgICAgICAgICAgICAgIGxhc3RWYWxzXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKCh4LCBpKSA9PiB2YWxUb1N0cmluZyh4LCBwYWRQZXJDb2xbc2l6ZSAtIEZPUk1BVF9OVU1fRklSU1RfTEFTVF9WQUxTICsgaV0sIGR0eXBlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKCcsICcpICtcbiAgICAgICAgICAgICAgICAgICAgJ10nXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRpc3BsYXlWYWxzID0gZHR5cGUgPT09ICdjb21wbGV4NjQnID8gY3JlYXRlQ29tcGxleFR1cGxlcyh2YWxzKSA6XG4gICAgICAgICAgICBBcnJheS5mcm9tKHZhbHMpO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ1snICtcbiAgICAgICAgICAgICAgICBkaXNwbGF5VmFscy5tYXAoKHgsIGkpID0+IHZhbFRvU3RyaW5nKHgsIHBhZFBlckNvbFtpXSwgZHR5cGUpKVxuICAgICAgICAgICAgICAgICAgICAuam9pbignLCAnKSArXG4gICAgICAgICAgICAgICAgJ10nXG4gICAgICAgIF07XG4gICAgfVxuICAgIC8vIFRoZSBhcnJheSBpcyByYW5rIDIgb3IgbW9yZS5cbiAgICBjb25zdCBzdWJzaGFwZSA9IHNoYXBlLnNsaWNlKDEpO1xuICAgIGNvbnN0IHN1YnN0cmlkZXMgPSBzdHJpZGVzLnNsaWNlKDEpO1xuICAgIGNvbnN0IHN0cmlkZSA9IHN0cmlkZXNbMF0gKiBzdG9yYWdlUGVyRWxlbWVudDtcbiAgICBjb25zdCBsaW5lcyA9IFtdO1xuICAgIGlmIChzaXplID4gRk9STUFUX0xJTUlUX05VTV9WQUxTKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgRk9STUFUX05VTV9GSVJTVF9MQVNUX1ZBTFM7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBpICogc3RyaWRlO1xuICAgICAgICAgICAgY29uc3QgZW5kID0gc3RhcnQgKyBzdHJpZGU7XG4gICAgICAgICAgICBsaW5lcy5wdXNoKC4uLnN1YlRlbnNvclRvU3RyaW5nKHZhbHMuc2xpY2Uoc3RhcnQsIGVuZCksIHN1YnNoYXBlLCBkdHlwZSwgc3Vic3RyaWRlcywgcGFkUGVyQ29sLCBmYWxzZSAvKiBpc0xhc3QgKi8pKTtcbiAgICAgICAgfVxuICAgICAgICBsaW5lcy5wdXNoKCcuLi4nKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHNpemUgLSBGT1JNQVRfTlVNX0ZJUlNUX0xBU1RfVkFMUzsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBpICogc3RyaWRlO1xuICAgICAgICAgICAgY29uc3QgZW5kID0gc3RhcnQgKyBzdHJpZGU7XG4gICAgICAgICAgICBsaW5lcy5wdXNoKC4uLnN1YlRlbnNvclRvU3RyaW5nKHZhbHMuc2xpY2Uoc3RhcnQsIGVuZCksIHN1YnNoYXBlLCBkdHlwZSwgc3Vic3RyaWRlcywgcGFkUGVyQ29sLCBpID09PSBzaXplIC0gMSAvKiBpc0xhc3QgKi8pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gaSAqIHN0cmlkZTtcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgc3RyaWRlO1xuICAgICAgICAgICAgbGluZXMucHVzaCguLi5zdWJUZW5zb3JUb1N0cmluZyh2YWxzLnNsaWNlKHN0YXJ0LCBlbmQpLCBzdWJzaGFwZSwgZHR5cGUsIHN1YnN0cmlkZXMsIHBhZFBlckNvbCwgaSA9PT0gc2l6ZSAtIDEgLyogaXNMYXN0ICovKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgc2VwID0gcmFuayA9PT0gMiA/ICcsJyA6ICcnO1xuICAgIGxpbmVzWzBdID0gJ1snICsgbGluZXNbMF0gKyBzZXA7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBsaW5lcy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgbGluZXNbaV0gPSAnICcgKyBsaW5lc1tpXSArIHNlcDtcbiAgICB9XG4gICAgbGV0IG5ld0xpbmVTZXAgPSAnLFxcbic7XG4gICAgZm9yIChsZXQgaSA9IDI7IGkgPCByYW5rOyBpKyspIHtcbiAgICAgICAgbmV3TGluZVNlcCArPSAnXFxuJztcbiAgICB9XG4gICAgbGluZXNbbGluZXMubGVuZ3RoIC0gMV0gPVxuICAgICAgICAnICcgKyBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSArICddJyArIChpc0xhc3QgPyAnJyA6IG5ld0xpbmVTZXApO1xuICAgIHJldHVybiBsaW5lcztcbn1cbmZ1bmN0aW9uIGNyZWF0ZUNvbXBsZXhUdXBsZXModmFscykge1xuICAgIGNvbnN0IGNvbXBsZXhUdXBsZXMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgY29tcGxleFR1cGxlcy5wdXNoKFt2YWxzW2ldLCB2YWxzW2kgKyAxXV0pO1xuICAgIH1cbiAgICByZXR1cm4gY29tcGxleFR1cGxlcztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRlbnNvcl9mb3JtYXQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgVGVuc29yIH0gZnJvbSAnLi90ZW5zb3InO1xuaW1wb3J0IHsgdXBjYXN0VHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBtYWtlVHlwZXNNYXRjaChhLCBiKSB7XG4gICAgaWYgKGEuZHR5cGUgPT09IGIuZHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIFthLCBiXTtcbiAgICB9XG4gICAgY29uc3QgZHR5cGUgPSB1cGNhc3RUeXBlKGEuZHR5cGUsIGIuZHR5cGUpO1xuICAgIHJldHVybiBbYS5jYXN0KGR0eXBlKSwgYi5jYXN0KGR0eXBlKV07XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VHlwZXNNYXRjaChhLCBiKSB7XG4gICAgYXNzZXJ0KGEuZHR5cGUgPT09IGIuZHR5cGUsICgpID0+IGBUaGUgZHR5cGVzIG9mIHRoZSBmaXJzdCgke2EuZHR5cGV9KSBhbmRgICtcbiAgICAgICAgYCBzZWNvbmQoJHtiLmR0eXBlfSkgaW5wdXQgbXVzdCBtYXRjaGApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVGVuc29ySW5MaXN0KHRlbnNvciwgdGVuc29yTGlzdCkge1xuICAgIHJldHVybiB0ZW5zb3JMaXN0LnNvbWUoeCA9PiB4LmlkID09PSB0ZW5zb3IuaWQpO1xufVxuLyoqXG4gKiBFeHRyYWN0cyBhbnkgYFRlbnNvcmBzIGZvdW5kIHdpdGhpbiB0aGUgcHJvdmlkZWQgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBjb250YWluZXIgYW4gb2JqZWN0IHRoYXQgbWF5IGJlIGEgYFRlbnNvcmAgb3IgbWF5IGRpcmVjdGx5IGNvbnRhaW5cbiAqICAgYFRlbnNvcmBzLCBzdWNoIGFzIGEgYFRlbnNvcltdYCBvciBge2tleTogVGVuc29yLCAuLi59YC4gSW4gZ2VuZXJhbCBpdFxuICogICBpcyBzYWZlIHRvIHBhc3MgYW55IG9iamVjdCBoZXJlLCBleGNlcHQgdGhhdCBgUHJvbWlzZWBzIGFyZSBub3RcbiAqICAgc3VwcG9ydGVkLlxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgYFRlbnNvcnNgIGZvdW5kIHdpdGhpbiB0aGUgcGFzc2VkIG9iamVjdC4gSWYgdGhlXG4gKiAgIGFyZ3VtZW50IGlzIHNpbXBseSBhIGBUZW5zb3InLCBhIGxpc3QgY29udGFpbmluZyB0aGF0IGBUZW5zb3JgIGlzXG4gKiAgIHJldHVybmVkLiBJZiB0aGUgb2JqZWN0IGlzIG5vdCBhIGBUZW5zb3JgIG9yIGRvZXMgbm90XG4gKiAgIGNvbnRhaW4gYFRlbnNvcnNgLCBhbiBlbXB0eSBsaXN0IGlzIHJldHVybmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGVuc29yc0luQ29udGFpbmVyKHJlc3VsdCkge1xuICAgIGNvbnN0IGxpc3QgPSBbXTtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldCgpO1xuICAgIHdhbGtUZW5zb3JDb250YWluZXIocmVzdWx0LCBsaXN0LCBzZWVuKTtcbiAgICByZXR1cm4gbGlzdDtcbn1cbmZ1bmN0aW9uIHdhbGtUZW5zb3JDb250YWluZXIoY29udGFpbmVyLCBsaXN0LCBzZWVuKSB7XG4gICAgaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFRlbnNvcikge1xuICAgICAgICBsaXN0LnB1c2goY29udGFpbmVyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWlzSXRlcmFibGUoY29udGFpbmVyKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEl0ZXJhdGlvbiBvdmVyIGtleXMgd29ya3MgYWxzbyBmb3IgYXJyYXlzLlxuICAgIGNvbnN0IGl0ZXJhYmxlID0gY29udGFpbmVyO1xuICAgIGZvciAoY29uc3QgayBpbiBpdGVyYWJsZSkge1xuICAgICAgICBjb25zdCB2YWwgPSBpdGVyYWJsZVtrXTtcbiAgICAgICAgaWYgKCFzZWVuLmhhcyh2YWwpKSB7XG4gICAgICAgICAgICBzZWVuLmFkZCh2YWwpO1xuICAgICAgICAgICAgd2Fsa1RlbnNvckNvbnRhaW5lcih2YWwsIGxpc3QsIHNlZW4pO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuZnVuY3Rpb24gaXNJdGVyYWJsZShvYmopIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShvYmopIHx8IHR5cGVvZiBvYmogPT09ICdvYmplY3QnO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGVuc29yX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi9lbmdpbmUnO1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBUZW5zb3IgfSBmcm9tICcuL3RlbnNvcic7XG5pbXBvcnQgeyBhc3NlcnQsIGZsYXR0ZW4sIGluZmVyRHR5cGUsIGlzVHlwZWRBcnJheSwgdG9UeXBlZEFycmF5IH0gZnJvbSAnLi91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBpbmZlclNoYXBlKHZhbCwgZHR5cGUpIHtcbiAgICBsZXQgZmlyc3RFbGVtID0gdmFsO1xuICAgIGlmIChpc1R5cGVkQXJyYXkodmFsKSkge1xuICAgICAgICByZXR1cm4gZHR5cGUgPT09ICdzdHJpbmcnID8gW10gOiBbdmFsLmxlbmd0aF07XG4gICAgfVxuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgIHJldHVybiBbXTsgLy8gU2NhbGFyLlxuICAgIH1cbiAgICBjb25zdCBzaGFwZSA9IFtdO1xuICAgIHdoaWxlIChBcnJheS5pc0FycmF5KGZpcnN0RWxlbSkgfHxcbiAgICAgICAgaXNUeXBlZEFycmF5KGZpcnN0RWxlbSkgJiYgZHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHNoYXBlLnB1c2goZmlyc3RFbGVtLmxlbmd0aCk7XG4gICAgICAgIGZpcnN0RWxlbSA9IGZpcnN0RWxlbVswXTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSAmJlxuICAgICAgICBlbnYoKS5nZXRCb29sKCdURU5TT1JMSUtFX0NIRUNLX1NIQVBFX0NPTlNJU1RFTkNZJykpIHtcbiAgICAgICAgZGVlcEFzc2VydFNoYXBlQ29uc2lzdGVuY3kodmFsLCBzaGFwZSwgW10pO1xuICAgIH1cbiAgICByZXR1cm4gc2hhcGU7XG59XG5mdW5jdGlvbiBkZWVwQXNzZXJ0U2hhcGVDb25zaXN0ZW5jeSh2YWwsIHNoYXBlLCBpbmRpY2VzKSB7XG4gICAgaW5kaWNlcyA9IGluZGljZXMgfHwgW107XG4gICAgaWYgKCEoQXJyYXkuaXNBcnJheSh2YWwpKSAmJiAhaXNUeXBlZEFycmF5KHZhbCkpIHtcbiAgICAgICAgYXNzZXJ0KHNoYXBlLmxlbmd0aCA9PT0gMCwgKCkgPT4gYEVsZW1lbnQgYXJyWyR7aW5kaWNlcy5qb2luKCddWycpfV0gaXMgYSBwcmltaXRpdmUsIGAgK1xuICAgICAgICAgICAgYGJ1dCBzaG91bGQgYmUgYW4gYXJyYXkvVHlwZWRBcnJheSBvZiAke3NoYXBlWzBdfSBlbGVtZW50c2ApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGFzc2VydChzaGFwZS5sZW5ndGggPiAwLCAoKSA9PiBgRWxlbWVudCBhcnJbJHtpbmRpY2VzLmpvaW4oJ11bJyl9XSBzaG91bGQgYmUgYSBwcmltaXRpdmUsIGAgK1xuICAgICAgICBgYnV0IGlzIGFuIGFycmF5IG9mICR7dmFsLmxlbmd0aH0gZWxlbWVudHNgKTtcbiAgICBhc3NlcnQodmFsLmxlbmd0aCA9PT0gc2hhcGVbMF0sICgpID0+IGBFbGVtZW50IGFyclske2luZGljZXMuam9pbignXVsnKX1dIHNob3VsZCBoYXZlICR7c2hhcGVbMF19IGAgK1xuICAgICAgICBgZWxlbWVudHMsIGJ1dCBoYXMgJHt2YWwubGVuZ3RofSBlbGVtZW50c2ApO1xuICAgIGNvbnN0IHN1YlNoYXBlID0gc2hhcGUuc2xpY2UoMSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgZGVlcEFzc2VydFNoYXBlQ29uc2lzdGVuY3kodmFsW2ldLCBzdWJTaGFwZSwgaW5kaWNlcy5jb25jYXQoaSkpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFzc2VydER0eXBlKGV4cGVjdGVkRHR5cGUsIGFjdHVhbERUeXBlLCBhcmdOYW1lLCBmdW5jdGlvbk5hbWUpIHtcbiAgICBpZiAoZXhwZWN0ZWREdHlwZSA9PT0gJ3N0cmluZ19vcl9udW1lcmljJykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChleHBlY3RlZER0eXBlID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBkdHlwZSBjYW5ub3QgYmUgbnVsbC5gKTtcbiAgICB9XG4gICAgaWYgKGV4cGVjdGVkRHR5cGUgIT09ICdudW1lcmljJyAmJiBleHBlY3RlZER0eXBlICE9PSBhY3R1YWxEVHlwZSB8fFxuICAgICAgICBleHBlY3RlZER0eXBlID09PSAnbnVtZXJpYycgJiYgYWN0dWFsRFR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQXJndW1lbnQgJyR7YXJnTmFtZX0nIHBhc3NlZCB0byAnJHtmdW5jdGlvbk5hbWV9JyBtdXN0IGAgK1xuICAgICAgICAgICAgYGJlICR7ZXhwZWN0ZWREdHlwZX0gdGVuc29yLCBidXQgZ290ICR7YWN0dWFsRFR5cGV9IHRlbnNvcmApO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0VG9UZW5zb3IoeCwgYXJnTmFtZSwgZnVuY3Rpb25OYW1lLCBwYXJzZUFzRHR5cGUgPSAnbnVtZXJpYycpIHtcbiAgICBpZiAoeCBpbnN0YW5jZW9mIFRlbnNvcikge1xuICAgICAgICBhc3NlcnREdHlwZShwYXJzZUFzRHR5cGUsIHguZHR5cGUsIGFyZ05hbWUsIGZ1bmN0aW9uTmFtZSk7XG4gICAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgICBsZXQgaW5mZXJyZWREdHlwZSA9IGluZmVyRHR5cGUoeCk7XG4gICAgLy8gSWYgdGhlIHVzZXIgZXhwZWN0cyBhIGJvb2wvaW50L2Zsb2F0LCB1c2UgdGhhdCBpbmZvIHRvIHVwZGF0ZSB0aGVcbiAgICAvLyBpbmZlcnJlZER0eXBlIHdoZW4gaXQgaXMgbm90IGEgc3RyaW5nLlxuICAgIGlmIChpbmZlcnJlZER0eXBlICE9PSAnc3RyaW5nJyAmJlxuICAgICAgICBbJ2Jvb2wnLCAnaW50MzInLCAnZmxvYXQzMiddLmluZGV4T2YocGFyc2VBc0R0eXBlKSA+PSAwKSB7XG4gICAgICAgIGluZmVycmVkRHR5cGUgPSBwYXJzZUFzRHR5cGU7XG4gICAgfVxuICAgIGFzc2VydER0eXBlKHBhcnNlQXNEdHlwZSwgaW5mZXJyZWREdHlwZSwgYXJnTmFtZSwgZnVuY3Rpb25OYW1lKTtcbiAgICBpZiAoKHggPT0gbnVsbCkgfHxcbiAgICAgICAgKCFpc1R5cGVkQXJyYXkoeCkgJiYgIUFycmF5LmlzQXJyYXkoeCkgJiYgdHlwZW9mIHggIT09ICdudW1iZXInICYmXG4gICAgICAgICAgICB0eXBlb2YgeCAhPT0gJ2Jvb2xlYW4nICYmIHR5cGVvZiB4ICE9PSAnc3RyaW5nJykpIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IHggPT0gbnVsbCA/ICdudWxsJyA6IHguY29uc3RydWN0b3IubmFtZTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBcmd1bWVudCAnJHthcmdOYW1lfScgcGFzc2VkIHRvICcke2Z1bmN0aW9uTmFtZX0nIG11c3QgYmUgYSBgICtcbiAgICAgICAgICAgIGBUZW5zb3Igb3IgVGVuc29yTGlrZSwgYnV0IGdvdCAnJHt0eXBlfSdgKTtcbiAgICB9XG4gICAgY29uc3QgaW5mZXJyZWRTaGFwZSA9IGluZmVyU2hhcGUoeCwgaW5mZXJyZWREdHlwZSk7XG4gICAgaWYgKCFpc1R5cGVkQXJyYXkoeCkgJiYgIUFycmF5LmlzQXJyYXkoeCkpIHtcbiAgICAgICAgeCA9IFt4XTtcbiAgICB9XG4gICAgY29uc3Qgc2tpcFR5cGVkQXJyYXkgPSB0cnVlO1xuICAgIGNvbnN0IHZhbHVlcyA9IGluZmVycmVkRHR5cGUgIT09ICdzdHJpbmcnID9cbiAgICAgICAgdG9UeXBlZEFycmF5KHgsIGluZmVycmVkRHR5cGUpIDpcbiAgICAgICAgZmxhdHRlbih4LCBbXSwgc2tpcFR5cGVkQXJyYXkpO1xuICAgIHJldHVybiBFTkdJTkUubWFrZVRlbnNvcih2YWx1ZXMsIGluZmVycmVkU2hhcGUsIGluZmVycmVkRHR5cGUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUb1RlbnNvckFycmF5KGFyZywgYXJnTmFtZSwgZnVuY3Rpb25OYW1lLCBwYXJzZUFzRHR5cGUgPSAnbnVtZXJpYycpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJnKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFyZ3VtZW50ICR7YXJnTmFtZX0gcGFzc2VkIHRvICR7ZnVuY3Rpb25OYW1lfSBtdXN0IGJlIGEgYCArXG4gICAgICAgICAgICAnYFRlbnNvcltdYCBvciBgVGVuc29yTGlrZVtdYCcpO1xuICAgIH1cbiAgICBjb25zdCB0ZW5zb3JzID0gYXJnO1xuICAgIHJldHVybiB0ZW5zb3JzLm1hcCgodCwgaSkgPT4gY29udmVydFRvVGVuc29yKHQsIGAke2FyZ05hbWV9WyR7aX1dYCwgZnVuY3Rpb25OYW1lLCBwYXJzZUFzRHR5cGUpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRlbnNvcl91dGlsX2Vudi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuL2VuZ2luZSc7XG5pbXBvcnQgeyBpbmZlclNoYXBlIH0gZnJvbSAnLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXJyYXlzRXF1YWwsIGVuY29kZVN0cmluZywgZmxhdHRlbiwgaXNTdHJpbmcsIGlzVHlwZWRBcnJheSB9IGZyb20gJy4vdXRpbCc7XG5jb25zdCBURVNUX0VQU0lMT05fRkxPQVQzMiA9IDFlLTM7XG5leHBvcnQgY29uc3QgVEVTVF9FUFNJTE9OX0ZMT0FUMTYgPSAxZS0xO1xuZXhwb3J0IGZ1bmN0aW9uIGV4cGVjdEFycmF5c0Nsb3NlKGFjdHVhbCwgZXhwZWN0ZWQsIGVwc2lsb24pIHtcbiAgICBpZiAoZXBzaWxvbiA9PSBudWxsKSB7XG4gICAgICAgIGVwc2lsb24gPSB0ZXN0RXBzaWxvbigpO1xuICAgIH1cbiAgICByZXR1cm4gZXhwZWN0QXJyYXlzUHJlZGljYXRlKGFjdHVhbCwgZXhwZWN0ZWQsIChhLCBiKSA9PiBhcmVDbG9zZShhLCBiLCBlcHNpbG9uKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gdGVzdEVwc2lsb24oKSB7XG4gICAgcmV0dXJuIEVOR0lORS5iYWNrZW5kLmZsb2F0UHJlY2lzaW9uKCkgPT09IDMyID8gVEVTVF9FUFNJTE9OX0ZMT0FUMzIgOlxuICAgICAgICBURVNUX0VQU0lMT05fRkxPQVQxNjtcbn1cbmZ1bmN0aW9uIGV4cGVjdEFycmF5c1ByZWRpY2F0ZShhY3R1YWwsIGV4cGVjdGVkLCBwcmVkaWNhdGUpIHtcbiAgICBsZXQgY2hlY2tDbGFzc1R5cGUgPSB0cnVlO1xuICAgIGlmIChpc1R5cGVkQXJyYXkoYWN0dWFsKSB8fCBpc1R5cGVkQXJyYXkoZXhwZWN0ZWQpKSB7XG4gICAgICAgIGNoZWNrQ2xhc3NUeXBlID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChpc1R5cGVkQXJyYXkoYWN0dWFsKSAmJiBpc1R5cGVkQXJyYXkoZXhwZWN0ZWQpKSB7XG4gICAgICAgIGNoZWNrQ2xhc3NUeXBlID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGNoZWNrQ2xhc3NUeXBlKSB7XG4gICAgICAgIGNvbnN0IGFUeXBlID0gYWN0dWFsLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgICAgIGNvbnN0IGJUeXBlID0gZXhwZWN0ZWQuY29uc3RydWN0b3IubmFtZTtcbiAgICAgICAgaWYgKGFUeXBlICE9PSBiVHlwZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBcnJheXMgYXJlIG9mIGRpZmZlcmVudCB0eXBlLiBBY3R1YWw6ICR7YVR5cGV9LiBgICtcbiAgICAgICAgICAgICAgICBgRXhwZWN0ZWQ6ICR7YlR5cGV9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYWN0dWFsKSAmJiBBcnJheS5pc0FycmF5KGV4cGVjdGVkKSkge1xuICAgICAgICBjb25zdCBhY3R1YWxTaGFwZSA9IGluZmVyU2hhcGUoYWN0dWFsKTtcbiAgICAgICAgY29uc3QgZXhwZWN0ZWRTaGFwZSA9IGluZmVyU2hhcGUoZXhwZWN0ZWQpO1xuICAgICAgICBpZiAoIWFycmF5c0VxdWFsKGFjdHVhbFNoYXBlLCBleHBlY3RlZFNoYXBlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBcnJheXMgaGF2ZSBkaWZmZXJlbnQgc2hhcGVzLiBgICtcbiAgICAgICAgICAgICAgICBgQWN0dWFsOiBbJHthY3R1YWxTaGFwZX1dLiBFeHBlY3RlZDogWyR7ZXhwZWN0ZWRTaGFwZX1dYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgYWN0dWFsRmxhdCA9IGlzVHlwZWRBcnJheShhY3R1YWwpID8gYWN0dWFsIDogZmxhdHRlbihhY3R1YWwpO1xuICAgIGNvbnN0IGV4cGVjdGVkRmxhdCA9IGlzVHlwZWRBcnJheShleHBlY3RlZCkgP1xuICAgICAgICBleHBlY3RlZCA6XG4gICAgICAgIGZsYXR0ZW4oZXhwZWN0ZWQpO1xuICAgIGlmIChhY3R1YWxGbGF0Lmxlbmd0aCAhPT0gZXhwZWN0ZWRGbGF0Lmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFycmF5cyBoYXZlIGRpZmZlcmVudCBsZW5ndGhzIGFjdHVhbDogJHthY3R1YWxGbGF0Lmxlbmd0aH0gdnMgYCArXG4gICAgICAgICAgICBgZXhwZWN0ZWQ6ICR7ZXhwZWN0ZWRGbGF0Lmxlbmd0aH0uXFxuYCArXG4gICAgICAgICAgICBgQWN0dWFsOiAgICR7YWN0dWFsRmxhdH0uXFxuYCArXG4gICAgICAgICAgICBgRXhwZWN0ZWQ6ICR7ZXhwZWN0ZWRGbGF0fS5gKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHBlY3RlZEZsYXQubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3QgYSA9IGFjdHVhbEZsYXRbaV07XG4gICAgICAgIGNvbnN0IGUgPSBleHBlY3RlZEZsYXRbaV07XG4gICAgICAgIGlmICghcHJlZGljYXRlKGEsIGUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFycmF5cyBkaWZmZXI6IGFjdHVhbFske2l9XSA9ICR7YX0sIGV4cGVjdGVkWyR7aX1dID0gJHtlfS5cXG5gICtcbiAgICAgICAgICAgICAgICBgQWN0dWFsOiAgICR7YWN0dWFsRmxhdH0uXFxuYCArXG4gICAgICAgICAgICAgICAgYEV4cGVjdGVkOiAke2V4cGVjdGVkRmxhdH0uYCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gZXhwZWN0UHJvbWlzZVRvRmFpbChmbiwgZG9uZSkge1xuICAgIGZuKCkudGhlbigoKSA9PiBkb25lLmZhaWwoKSwgKCkgPT4gZG9uZSgpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3RBcnJheXNFcXVhbChhY3R1YWwsIGV4cGVjdGVkKSB7XG4gICAgY29uc3QgZXhwID0gdHlwZW9mIGV4cGVjdGVkID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgZXhwZWN0ZWQgPT09ICdudW1iZXInIHx8XG4gICAgICAgIHR5cGVvZiBleHBlY3RlZCA9PT0gJ2Jvb2xlYW4nID9cbiAgICAgICAgW2V4cGVjdGVkXSA6XG4gICAgICAgIGV4cGVjdGVkO1xuICAgIGlmIChpc1N0cmluZyhhY3R1YWwpIHx8IGlzU3RyaW5nKGFjdHVhbFswXSkgfHxcbiAgICAgICAgaXNTdHJpbmcoZXhwZWN0ZWQpIHx8IGlzU3RyaW5nKGV4cGVjdGVkWzBdKSkge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHRyaXBsZS1lcXVhbHNcbiAgICAgICAgcmV0dXJuIGV4cGVjdEFycmF5c1ByZWRpY2F0ZShhY3R1YWwsIGV4cCwgKGEsIGIpID0+IGEgPT0gYik7XG4gICAgfVxuICAgIHJldHVybiBleHBlY3RBcnJheXNQcmVkaWNhdGUoYWN0dWFsLCBleHBlY3RlZCwgKGEsIGIpID0+IGFyZUNsb3NlKGEsIGIsIDApKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3ROdW1iZXJzQ2xvc2UoYSwgZSwgZXBzaWxvbikge1xuICAgIGlmIChlcHNpbG9uID09IG51bGwpIHtcbiAgICAgICAgZXBzaWxvbiA9IHRlc3RFcHNpbG9uKCk7XG4gICAgfVxuICAgIGlmICghYXJlQ2xvc2UoYSwgZSwgZXBzaWxvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOdW1iZXJzIGRpZmZlcjogYWN0dWFsID09PSAke2F9LCBleHBlY3RlZCA9PT0gJHtlfWApO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFyZUNsb3NlKGEsIGUsIGVwc2lsb24pIHtcbiAgICBpZiAoIWlzRmluaXRlKGEpICYmICFpc0Zpbml0ZShlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGlzTmFOKGEpIHx8IGlzTmFOKGUpIHx8IE1hdGguYWJzKGEgLSBlKSA+IGVwc2lsb24pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3RWYWx1ZXNJblJhbmdlKGFjdHVhbCwgbG93LCBoaWdoKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhY3R1YWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGFjdHVhbFtpXSA8IGxvdyB8fCBhY3R1YWxbaV0gPiBoaWdoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFZhbHVlIG91dCBvZiByYW5nZToke2FjdHVhbFtpXX0gbG93OiAke2xvd30sIGhpZ2g6ICR7aGlnaH1gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3RBcnJheUJ1ZmZlcnNFcXVhbChhY3R1YWwsIGV4cGVjdGVkKSB7XG4gICAgLy8gU2FmYXJpICYgSmFzbWluZSBkb24ndCBsaWtlIGNvbXBhcmluZyBBcnJheUJ1ZmZlcnMgZGlyZWN0bHkuIFdyYXBwaW5nIGluXG4gICAgLy8gYSBGbG9hdDMyQXJyYXkgc29sdmVzIHRoaXMgaXNzdWUuXG4gICAgZXhwZWN0KG5ldyBGbG9hdDMyQXJyYXkoYWN0dWFsKSkudG9FcXVhbChuZXcgRmxvYXQzMkFycmF5KGV4cGVjdGVkKSk7XG59XG4vKiogRW5jb2RlcyBzdHJpbmdzIGludG8gdXRmLTggYnl0ZXMuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlU3RyaW5ncyhhKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHZhbCA9IGFbaV07XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgICAgIGVuY29kZVN0cmluZ3ModmFsKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGFbaV0gPSBlbmNvZGVTdHJpbmcodmFsKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRlc3RfdXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vLyBTbyB0eXBpbmdzIGNhbiBwcm9wYWdhdGUuXG5pbXBvcnQgeyBBZGFkZWx0YU9wdGltaXplciB9IGZyb20gJy4vb3B0aW1pemVycy9hZGFkZWx0YV9vcHRpbWl6ZXInO1xuaW1wb3J0IHsgQWRhZ3JhZE9wdGltaXplciB9IGZyb20gJy4vb3B0aW1pemVycy9hZGFncmFkX29wdGltaXplcic7XG5pbXBvcnQgeyBBZGFtT3B0aW1pemVyIH0gZnJvbSAnLi9vcHRpbWl6ZXJzL2FkYW1fb3B0aW1pemVyJztcbmltcG9ydCB7IEFkYW1heE9wdGltaXplciB9IGZyb20gJy4vb3B0aW1pemVycy9hZGFtYXhfb3B0aW1pemVyJztcbmltcG9ydCB7IE1vbWVudHVtT3B0aW1pemVyIH0gZnJvbSAnLi9vcHRpbWl6ZXJzL21vbWVudHVtX29wdGltaXplcic7XG5pbXBvcnQgeyBPcHRpbWl6ZXJDb25zdHJ1Y3RvcnMgfSBmcm9tICcuL29wdGltaXplcnMvb3B0aW1pemVyX2NvbnN0cnVjdG9ycyc7XG5pbXBvcnQgeyBSTVNQcm9wT3B0aW1pemVyIH0gZnJvbSAnLi9vcHRpbWl6ZXJzL3Jtc3Byb3Bfb3B0aW1pemVyJztcbmltcG9ydCB7IFNHRE9wdGltaXplciB9IGZyb20gJy4vb3B0aW1pemVycy9zZ2Rfb3B0aW1pemVyJztcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bnVzZWQtZXhwcmVzc2lvblxuW01vbWVudHVtT3B0aW1pemVyLCBTR0RPcHRpbWl6ZXIsIEFkYWRlbHRhT3B0aW1pemVyLCBBZGFncmFkT3B0aW1pemVyLFxuICAgIFJNU1Byb3BPcHRpbWl6ZXIsIEFkYW1heE9wdGltaXplciwgQWRhbU9wdGltaXplcl07XG5leHBvcnQgY29uc3QgdHJhaW4gPSB7XG4gICAgc2dkOiBPcHRpbWl6ZXJDb25zdHJ1Y3RvcnMuc2dkLFxuICAgIG1vbWVudHVtOiBPcHRpbWl6ZXJDb25zdHJ1Y3RvcnMubW9tZW50dW0sXG4gICAgYWRhZGVsdGE6IE9wdGltaXplckNvbnN0cnVjdG9ycy5hZGFkZWx0YSxcbiAgICBhZGFncmFkOiBPcHRpbWl6ZXJDb25zdHJ1Y3RvcnMuYWRhZ3JhZCxcbiAgICBybXNwcm9wOiBPcHRpbWl6ZXJDb25zdHJ1Y3RvcnMucm1zcHJvcCxcbiAgICBhZGFtYXg6IE9wdGltaXplckNvbnN0cnVjdG9ycy5hZGFtYXgsXG4gICAgYWRhbTogT3B0aW1pemVyQ29uc3RydWN0b3JzLmFkYW1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD10cmFpbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5leHBvcnQgdmFyIFJhbms7XG4oZnVuY3Rpb24gKFJhbmspIHtcbiAgICBSYW5rW1wiUjBcIl0gPSBcIlIwXCI7XG4gICAgUmFua1tcIlIxXCJdID0gXCJSMVwiO1xuICAgIFJhbmtbXCJSMlwiXSA9IFwiUjJcIjtcbiAgICBSYW5rW1wiUjNcIl0gPSBcIlIzXCI7XG4gICAgUmFua1tcIlI0XCJdID0gXCJSNFwiO1xuICAgIFJhbmtbXCJSNVwiXSA9IFwiUjVcIjtcbiAgICBSYW5rW1wiUjZcIl0gPSBcIlI2XCI7XG59KShSYW5rIHx8IChSYW5rID0ge30pKTtcbi8vIExvb2tzIGZvciB1cGNhc3RpbmcgdHlwZXMuIFVzZWQsIGZvciBleGFtcGxlLCBpbiBvcGVyYXRpb25zIHdpdGggbWl4ZWQgZHR5cGVcbi8vIGlucHV0cy5cbnZhciBVcGNhc3RJbnQzMkFuZE1hcDtcbihmdW5jdGlvbiAoVXBjYXN0SW50MzJBbmRNYXApIHtcbiAgICBVcGNhc3RJbnQzMkFuZE1hcFtcImZsb2F0MzJcIl0gPSBcImZsb2F0MzJcIjtcbiAgICBVcGNhc3RJbnQzMkFuZE1hcFtcImludDMyXCJdID0gXCJpbnQzMlwiO1xuICAgIFVwY2FzdEludDMyQW5kTWFwW1wiYm9vbFwiXSA9IFwiaW50MzJcIjtcbiAgICBVcGNhc3RJbnQzMkFuZE1hcFtcImNvbXBsZXg2NFwiXSA9IFwiY29tcGxleDY0XCI7XG59KShVcGNhc3RJbnQzMkFuZE1hcCB8fCAoVXBjYXN0SW50MzJBbmRNYXAgPSB7fSkpO1xudmFyIFVwY2FzdEJvb2xBbmRNYXA7XG4oZnVuY3Rpb24gKFVwY2FzdEJvb2xBbmRNYXApIHtcbiAgICBVcGNhc3RCb29sQW5kTWFwW1wiZmxvYXQzMlwiXSA9IFwiZmxvYXQzMlwiO1xuICAgIFVwY2FzdEJvb2xBbmRNYXBbXCJpbnQzMlwiXSA9IFwiaW50MzJcIjtcbiAgICBVcGNhc3RCb29sQW5kTWFwW1wiYm9vbFwiXSA9IFwiYm9vbFwiO1xuICAgIFVwY2FzdEJvb2xBbmRNYXBbXCJjb21wbGV4NjRcIl0gPSBcImNvbXBsZXg2NFwiO1xufSkoVXBjYXN0Qm9vbEFuZE1hcCB8fCAoVXBjYXN0Qm9vbEFuZE1hcCA9IHt9KSk7XG52YXIgVXBjYXN0RmxvYXQzMkFuZE1hcDtcbihmdW5jdGlvbiAoVXBjYXN0RmxvYXQzMkFuZE1hcCkge1xuICAgIFVwY2FzdEZsb2F0MzJBbmRNYXBbXCJmbG9hdDMyXCJdID0gXCJmbG9hdDMyXCI7XG4gICAgVXBjYXN0RmxvYXQzMkFuZE1hcFtcImludDMyXCJdID0gXCJmbG9hdDMyXCI7XG4gICAgVXBjYXN0RmxvYXQzMkFuZE1hcFtcImJvb2xcIl0gPSBcImZsb2F0MzJcIjtcbiAgICBVcGNhc3RGbG9hdDMyQW5kTWFwW1wiY29tcGxleDY0XCJdID0gXCJjb21wbGV4NjRcIjtcbn0pKFVwY2FzdEZsb2F0MzJBbmRNYXAgfHwgKFVwY2FzdEZsb2F0MzJBbmRNYXAgPSB7fSkpO1xudmFyIFVwY2FzdENvbXBsZXg2NEFuZE1hcDtcbihmdW5jdGlvbiAoVXBjYXN0Q29tcGxleDY0QW5kTWFwKSB7XG4gICAgVXBjYXN0Q29tcGxleDY0QW5kTWFwW1wiZmxvYXQzMlwiXSA9IFwiY29tcGxleDY0XCI7XG4gICAgVXBjYXN0Q29tcGxleDY0QW5kTWFwW1wiaW50MzJcIl0gPSBcImNvbXBsZXg2NFwiO1xuICAgIFVwY2FzdENvbXBsZXg2NEFuZE1hcFtcImJvb2xcIl0gPSBcImNvbXBsZXg2NFwiO1xuICAgIFVwY2FzdENvbXBsZXg2NEFuZE1hcFtcImNvbXBsZXg2NFwiXSA9IFwiY29tcGxleDY0XCI7XG59KShVcGNhc3RDb21wbGV4NjRBbmRNYXAgfHwgKFVwY2FzdENvbXBsZXg2NEFuZE1hcCA9IHt9KSk7XG5jb25zdCB1cGNhc3RUeXBlTWFwID0ge1xuICAgICdmbG9hdDMyJzogVXBjYXN0RmxvYXQzMkFuZE1hcCxcbiAgICAnaW50MzInOiBVcGNhc3RJbnQzMkFuZE1hcCxcbiAgICAnYm9vbCc6IFVwY2FzdEJvb2xBbmRNYXAsXG4gICAgJ2NvbXBsZXg2NCc6IFVwY2FzdENvbXBsZXg2NEFuZE1hcFxufTtcbmV4cG9ydCBmdW5jdGlvbiB1cGNhc3RUeXBlKHR5cGVBLCB0eXBlQikge1xuICAgIGlmICh0eXBlQSA9PT0gJ3N0cmluZycgfHwgdHlwZUIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmICh0eXBlQSA9PT0gJ3N0cmluZycgJiYgdHlwZUIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3N0cmluZyc7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4gbm90IHVwY2FzdCAke3R5cGVBfSB3aXRoICR7dHlwZUJ9YCk7XG4gICAgfVxuICAgIHJldHVybiB1cGNhc3RUeXBlTWFwW3R5cGVBXVt0eXBlQl07XG59XG4vKiogUmV0dXJucyB0aGUgb3V0cHV0IHR5cGUgYWZ0ZXIgc3VtbWF0aW9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1bU91dFR5cGUodHlwZSkge1xuICAgIHJldHVybiB1cGNhc3RUeXBlKHR5cGUsICdpbnQzMicpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHlwZXMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgKiBhcyBiYXNlIGZyb20gJy4vdXRpbF9iYXNlJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbF9iYXNlJztcbmV4cG9ydCAqIGZyb20gJy4vaGFzaF91dGlsJztcbi8qKlxuICogQ3JlYXRlIHR5cGVkIGFycmF5IGZvciBzY2FsYXIgdmFsdWUuIFVzZWQgZm9yIHN0b3JpbmcgaW4gYERhdGFTdG9yYWdlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNjYWxhclZhbHVlKHZhbHVlLCBkdHlwZSkge1xuICAgIGlmIChkdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGVuY29kZVN0cmluZyh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB0b1R5cGVkQXJyYXkoW3ZhbHVlXSwgZHR5cGUpO1xufVxuZnVuY3Rpb24gbm9Db252ZXJzaW9uTmVlZGVkKGEsIGR0eXBlKSB7XG4gICAgcmV0dXJuIChhIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5ICYmIGR0eXBlID09PSAnZmxvYXQzMicpIHx8XG4gICAgICAgIChhIGluc3RhbmNlb2YgSW50MzJBcnJheSAmJiBkdHlwZSA9PT0gJ2ludDMyJykgfHxcbiAgICAgICAgKGEgaW5zdGFuY2VvZiBVaW50OEFycmF5ICYmIGR0eXBlID09PSAnYm9vbCcpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRvVHlwZWRBcnJheShhLCBkdHlwZSkge1xuICAgIGlmIChkdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29udmVydCBhIHN0cmluZ1tdIHRvIGEgVHlwZWRBcnJheScpO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgICBhID0gYmFzZS5mbGF0dGVuKGEpO1xuICAgIH1cbiAgICBpZiAoZW52KCkuZ2V0Qm9vbCgnREVCVUcnKSkge1xuICAgICAgICBiYXNlLmNoZWNrQ29udmVyc2lvbkZvckVycm9ycyhhLCBkdHlwZSk7XG4gICAgfVxuICAgIGlmIChub0NvbnZlcnNpb25OZWVkZWQoYSwgZHR5cGUpKSB7XG4gICAgICAgIHJldHVybiBhO1xuICAgIH1cbiAgICBpZiAoZHR5cGUgPT0gbnVsbCB8fCBkdHlwZSA9PT0gJ2Zsb2F0MzInIHx8IGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheShhKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZHR5cGUgPT09ICdpbnQzMicpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnQzMkFycmF5KGEpO1xuICAgIH1cbiAgICBlbHNlIGlmIChkdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgICAgIGNvbnN0IGJvb2wgPSBuZXcgVWludDhBcnJheShhLmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYm9vbC5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKE1hdGgucm91bmQoYVtpXSkgIT09IDApIHtcbiAgICAgICAgICAgICAgICBib29sW2ldID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYm9vbDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBkYXRhIHR5cGUgJHtkdHlwZX1gKTtcbiAgICB9XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGN1cnJlbnQgaGlnaC1yZXNvbHV0aW9uIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHJlbGF0aXZlIHRvIGFuXG4gKiBhcmJpdHJhcnkgdGltZSBpbiB0aGUgcGFzdC4gSXQgd29ya3MgYWNyb3NzIGRpZmZlcmVudCBwbGF0Zm9ybXMgKG5vZGUuanMsXG4gKiBicm93c2VycykuXG4gKlxuICogYGBganNcbiAqIGNvbnNvbGUubG9nKHRmLnV0aWwubm93KCkpO1xuICogYGBgXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1V0aWwnLCBuYW1lc3BhY2U6ICd1dGlsJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vdygpIHtcbiAgICByZXR1cm4gZW52KCkucGxhdGZvcm0ubm93KCk7XG59XG4vKipcbiAqIFJldHVybnMgYSBwbGF0Zm9ybS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZlxuICogW2BmZXRjaGBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GZXRjaF9BUEkpLlxuICpcbiAqIElmIGBmZXRjaGAgaXMgZGVmaW5lZCBvbiB0aGUgZ2xvYmFsIG9iamVjdCAoYHdpbmRvd2AsIGBwcm9jZXNzYCwgZXRjLiksXG4gKiBgdGYudXRpbC5mZXRjaGAgcmV0dXJucyB0aGF0IGZ1bmN0aW9uLlxuICpcbiAqIElmIG5vdCwgYHRmLnV0aWwuZmV0Y2hgIHJldHVybnMgYSBwbGF0Zm9ybS1zcGVjaWZpYyBzb2x1dGlvbi5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgcmVzb3VyY2UgPSBhd2FpdCB0Zi51dGlsLmZldGNoKCdodHRwczovL3VucGtnLmNvbS9AdGVuc29yZmxvdy90ZmpzJyk7XG4gKiAvLyBoYW5kbGUgcmVzcG9uc2VcbiAqIGBgYFxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdVdGlsJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZldGNoKHBhdGgsIHJlcXVlc3RJbml0cykge1xuICAgIHJldHVybiBlbnYoKS5wbGF0Zm9ybS5mZXRjaChwYXRoLCByZXF1ZXN0SW5pdHMpO1xufVxuLyoqXG4gKiBFbmNvZGVzIHRoZSBwcm92aWRlZCBzdHJpbmcgaW50byBieXRlcyB1c2luZyB0aGUgcHJvdmlkZWQgZW5jb2Rpbmcgc2NoZW1lLlxuICpcbiAqIEBwYXJhbSBzIFRoZSBzdHJpbmcgdG8gZW5jb2RlLlxuICogQHBhcmFtIGVuY29kaW5nIFRoZSBlbmNvZGluZyBzY2hlbWUuIERlZmF1bHRzIHRvIHV0Zi04LlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdVdGlsJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVN0cmluZyhzLCBlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICBlbmNvZGluZyA9IGVuY29kaW5nIHx8ICd1dGYtOCc7XG4gICAgcmV0dXJuIGVudigpLnBsYXRmb3JtLmVuY29kZShzLCBlbmNvZGluZyk7XG59XG4vKipcbiAqIERlY29kZXMgdGhlIHByb3ZpZGVkIGJ5dGVzIGludG8gYSBzdHJpbmcgdXNpbmcgdGhlIHByb3ZpZGVkIGVuY29kaW5nIHNjaGVtZS5cbiAqIEBwYXJhbSBieXRlcyBUaGUgYnl0ZXMgdG8gZGVjb2RlLlxuICpcbiAqIEBwYXJhbSBlbmNvZGluZyBUaGUgZW5jb2Rpbmcgc2NoZW1lLiBEZWZhdWx0cyB0byB1dGYtOC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVXRpbCd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVTdHJpbmcoYnl0ZXMsIGVuY29kaW5nID0gJ3V0Zi04Jykge1xuICAgIGVuY29kaW5nID0gZW5jb2RpbmcgfHwgJ3V0Zi04JztcbiAgICByZXR1cm4gZW52KCkucGxhdGZvcm0uZGVjb2RlKGJ5dGVzLCBlbmNvZGluZyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qKlxuICogU2h1ZmZsZXMgdGhlIGFycmF5IGluLXBsYWNlIHVzaW5nIEZpc2hlci1ZYXRlcyBhbGdvcml0aG0uXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSBbMSwgMiwgMywgNCwgNV07XG4gKiB0Zi51dGlsLnNodWZmbGUoYSk7XG4gKiBjb25zb2xlLmxvZyhhKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhcnJheSBUaGUgYXJyYXkgdG8gc2h1ZmZsZSBpbi1wbGFjZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVXRpbCcsIG5hbWVzcGFjZTogJ3V0aWwnfVxuICovXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG5leHBvcnQgZnVuY3Rpb24gc2h1ZmZsZShhcnJheSkge1xuICAgIGxldCBjb3VudGVyID0gYXJyYXkubGVuZ3RoO1xuICAgIGxldCBpbmRleCA9IDA7XG4gICAgLy8gV2hpbGUgdGhlcmUgYXJlIGVsZW1lbnRzIGluIHRoZSBhcnJheVxuICAgIHdoaWxlIChjb3VudGVyID4gMCkge1xuICAgICAgICAvLyBQaWNrIGEgcmFuZG9tIGluZGV4XG4gICAgICAgIGluZGV4ID0gKE1hdGgucmFuZG9tKCkgKiBjb3VudGVyKSB8IDA7XG4gICAgICAgIC8vIERlY3JlYXNlIGNvdW50ZXIgYnkgMVxuICAgICAgICBjb3VudGVyLS07XG4gICAgICAgIC8vIEFuZCBzd2FwIHRoZSBsYXN0IGVsZW1lbnQgd2l0aCBpdFxuICAgICAgICBzd2FwKGFycmF5LCBjb3VudGVyLCBpbmRleCk7XG4gICAgfVxufVxuLyoqXG4gKiBTaHVmZmxlcyB0d28gYXJyYXlzIGluLXBsYWNlIHRoZSBzYW1lIHdheSB1c2luZyBGaXNoZXItWWF0ZXMgYWxnb3JpdGhtLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gWzEsMiwzLDQsNV07XG4gKiBjb25zdCBiID0gWzExLDIyLDMzLDQ0LDU1XTtcbiAqIHRmLnV0aWwuc2h1ZmZsZUNvbWJvKGEsIGIpO1xuICogY29uc29sZS5sb2coYSwgYik7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYXJyYXkgVGhlIGZpcnN0IGFycmF5IHRvIHNodWZmbGUgaW4tcGxhY2UuXG4gKiBAcGFyYW0gYXJyYXkyIFRoZSBzZWNvbmQgYXJyYXkgdG8gc2h1ZmZsZSBpbi1wbGFjZSB3aXRoIHRoZSBzYW1lIHBlcm11dGF0aW9uXG4gKiAgICAgYXMgdGhlIGZpcnN0IGFycmF5LlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdVdGlsJywgbmFtZXNwYWNlOiAndXRpbCd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaHVmZmxlQ29tYm8oXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG5hcnJheSwgXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG5hcnJheTIpIHtcbiAgICBpZiAoYXJyYXkubGVuZ3RoICE9PSBhcnJheTIubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQXJyYXkgc2l6ZXMgbXVzdCBtYXRjaCB0byBiZSBzaHVmZmxlZCB0b2dldGhlciBgICtcbiAgICAgICAgICAgIGBGaXJzdCBhcnJheSBsZW5ndGggd2FzICR7YXJyYXkubGVuZ3RofWAgK1xuICAgICAgICAgICAgYFNlY29uZCBhcnJheSBsZW5ndGggd2FzICR7YXJyYXkyLmxlbmd0aH1gKTtcbiAgICB9XG4gICAgbGV0IGNvdW50ZXIgPSBhcnJheS5sZW5ndGg7XG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICAvLyBXaGlsZSB0aGVyZSBhcmUgZWxlbWVudHMgaW4gdGhlIGFycmF5XG4gICAgd2hpbGUgKGNvdW50ZXIgPiAwKSB7XG4gICAgICAgIC8vIFBpY2sgYSByYW5kb20gaW5kZXhcbiAgICAgICAgaW5kZXggPSAoTWF0aC5yYW5kb20oKSAqIGNvdW50ZXIpIHwgMDtcbiAgICAgICAgLy8gRGVjcmVhc2UgY291bnRlciBieSAxXG4gICAgICAgIGNvdW50ZXItLTtcbiAgICAgICAgLy8gQW5kIHN3YXAgdGhlIGxhc3QgZWxlbWVudCBvZiBlYWNoIGFycmF5IHdpdGggaXRcbiAgICAgICAgc3dhcChhcnJheSwgY291bnRlciwgaW5kZXgpO1xuICAgICAgICBzd2FwKGFycmF5MiwgY291bnRlciwgaW5kZXgpO1xuICAgIH1cbn1cbi8qKiBDbGFtcHMgYSB2YWx1ZSB0byBhIHNwZWNpZmllZCByYW5nZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFtcChtaW4sIHgsIG1heCkge1xuICAgIHJldHVybiBNYXRoLm1heChtaW4sIE1hdGgubWluKHgsIG1heCkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG5lYXJlc3RMYXJnZXJFdmVuKHZhbCkge1xuICAgIHJldHVybiB2YWwgJSAyID09PSAwID8gdmFsIDogdmFsICsgMTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzd2FwKG9iamVjdCwgbGVmdCwgcmlnaHQpIHtcbiAgICBjb25zdCB0ZW1wID0gb2JqZWN0W2xlZnRdO1xuICAgIG9iamVjdFtsZWZ0XSA9IG9iamVjdFtyaWdodF07XG4gICAgb2JqZWN0W3JpZ2h0XSA9IHRlbXA7XG59XG5leHBvcnQgZnVuY3Rpb24gc3VtKGFycikge1xuICAgIGxldCBzdW0gPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHN1bSArPSBhcnJbaV07XG4gICAgfVxuICAgIHJldHVybiBzdW07XG59XG4vKipcbiAqIFJldHVybnMgYSBzYW1wbGUgZnJvbSBhIHVuaWZvcm0gW2EsIGIpIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiBAcGFyYW0gYSBUaGUgbWluaW11bSBzdXBwb3J0IChpbmNsdXNpdmUpLlxuICogQHBhcmFtIGIgVGhlIG1heGltdW0gc3VwcG9ydCAoZXhjbHVzaXZlKS5cbiAqIEByZXR1cm4gQSBwc2V1ZG9yYW5kb20gbnVtYmVyIG9uIHRoZSBoYWxmLW9wZW4gaW50ZXJ2YWwgW2EsYikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYW5kVW5pZm9ybShhLCBiKSB7XG4gICAgY29uc3QgciA9IE1hdGgucmFuZG9tKCk7XG4gICAgcmV0dXJuIChiICogcikgKyAoMSAtIHIpICogYTtcbn1cbi8qKiBSZXR1cm5zIHRoZSBzcXVhcmVkIEV1Y2xpZGVhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWN0b3JzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc3RTcXVhcmVkKGEsIGIpIHtcbiAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgZGlmZiA9IE51bWJlcihhW2ldKSAtIE51bWJlcihiW2ldKTtcbiAgICAgICAgcmVzdWx0ICs9IGRpZmYgKiBkaWZmO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgdGhlIGV4cHJlc3Npb24gaXMgdHJ1ZS4gT3RoZXJ3aXNlIHRocm93cyBhbiBlcnJvciB3aXRoIHRoZVxuICogcHJvdmlkZWQgbWVzc2FnZS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IDI7XG4gKiB0Zi51dGlsLmFzc2VydCh4ID09PSAyLCAneCBpcyBub3QgMicpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGV4cHIgVGhlIGV4cHJlc3Npb24gdG8gYXNzZXJ0IChhcyBhIGJvb2xlYW4pLlxuICogQHBhcmFtIG1zZyBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbWVzc2FnZSB0byByZXBvcnQgd2hlbiB0aHJvd2luZyBhblxuICogICAgIGVycm9yLiBXZSB1c2UgYSBmdW5jdGlvbiBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVXRpbCcsIG5hbWVzcGFjZTogJ3V0aWwnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0KGV4cHIsIG1zZykge1xuICAgIGlmICghZXhwcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IodHlwZW9mIG1zZyA9PT0gJ3N0cmluZycgPyBtc2cgOiBtc2coKSk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFNoYXBlc01hdGNoKHNoYXBlQSwgc2hhcGVCLCBlcnJvck1lc3NhZ2VQcmVmaXggPSAnJykge1xuICAgIGFzc2VydChhcnJheXNFcXVhbChzaGFwZUEsIHNoYXBlQiksICgpID0+IGVycm9yTWVzc2FnZVByZWZpeCArIGAgU2hhcGVzICR7c2hhcGVBfSBhbmQgJHtzaGFwZUJ9IG11c3QgbWF0Y2hgKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnROb25OdWxsKGEpIHtcbiAgICBhc3NlcnQoYSAhPSBudWxsLCAoKSA9PiBgVGhlIGlucHV0IHRvIHRoZSB0ZW5zb3IgY29uc3RydWN0b3IgbXVzdCBiZSBhIG5vbi1udWxsIHZhbHVlLmApO1xufVxuLy8gTk9URTogV2UgZXhwbGljaXRseSB0eXBlIG91dCB3aGF0IFQgZXh0ZW5kcyBpbnN0ZWFkIG9mIGFueSBzbyB0aGF0XG4vLyB1dGlsLmZsYXR0ZW4gb24gYSBuZXN0ZWQgYXJyYXkgb2YgbnVtYmVyIGRvZXNuJ3QgdHJ5IHRvIGluZmVyIFQgYXMgYVxuLy8gbnVtYmVyW11bXSwgY2F1c2luZyB1cyB0byBleHBsaWNpdGx5IHR5cGUgdXRpbC5mbGF0dGVuPG51bWJlcj4oKS5cbi8qKlxuICogIEZsYXR0ZW5zIGFuIGFyYml0cmFyaWx5IG5lc3RlZCBhcnJheS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IFtbMSwgMl0sIFszLCA0XSwgWzUsIFs2LCBbN11dXV07XG4gKiBjb25zdCBmbGF0ID0gdGYudXRpbC5mbGF0dGVuKGEpO1xuICogY29uc29sZS5sb2coZmxhdCk7XG4gKiBgYGBcbiAqXG4gKiAgQHBhcmFtIGFyciBUaGUgbmVzdGVkIGFycmF5IHRvIGZsYXR0ZW4uXG4gKiAgQHBhcmFtIHJlc3VsdCBUaGUgZGVzdGluYXRpb24gYXJyYXkgd2hpY2ggaG9sZHMgdGhlIGVsZW1lbnRzLlxuICogIEBwYXJhbSBza2lwVHlwZWRBcnJheSBJZiB0cnVlLCBhdm9pZHMgZmxhdHRlbmluZyB0aGUgdHlwZWQgYXJyYXlzLiBEZWZhdWx0c1xuICogICAgICB0byBmYWxzZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVXRpbCcsIG5hbWVzcGFjZTogJ3V0aWwnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZmxhdHRlbihhcnIsIHJlc3VsdCA9IFtdLCBza2lwVHlwZWRBcnJheSA9IGZhbHNlKSB7XG4gICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7XG4gICAgICAgIHJlc3VsdCA9IFtdO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcnIpIHx8IGlzVHlwZWRBcnJheShhcnIpICYmICFza2lwVHlwZWRBcnJheSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgZmxhdHRlbihhcnJbaV0sIHJlc3VsdCwgc2tpcFR5cGVkQXJyYXkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXN1bHQucHVzaChhcnIpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzaXplIChudW1iZXIgb2YgZWxlbWVudHMpIG9mIHRoZSB0ZW5zb3IgZ2l2ZW4gaXRzIHNoYXBlLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBzaGFwZSA9IFszLCA0LCAyXTtcbiAqIGNvbnN0IHNpemUgPSB0Zi51dGlsLnNpemVGcm9tU2hhcGUoc2hhcGUpO1xuICogY29uc29sZS5sb2coc2l6ZSk7XG4gKiBgYGBcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVXRpbCcsIG5hbWVzcGFjZTogJ3V0aWwnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2l6ZUZyb21TaGFwZShzaGFwZSkge1xuICAgIGlmIChzaGFwZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gU2NhbGFyLlxuICAgICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgbGV0IHNpemUgPSBzaGFwZVswXTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHNoYXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHNpemUgKj0gc2hhcGVbaV07XG4gICAgfVxuICAgIHJldHVybiBzaXplO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzU2NhbGFyU2hhcGUoc2hhcGUpIHtcbiAgICByZXR1cm4gc2hhcGUubGVuZ3RoID09PSAwO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFycmF5c0VxdWFsKG4xLCBuMikge1xuICAgIGlmIChuMSA9PT0gbjIpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChuMSA9PSBudWxsIHx8IG4yID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobjEubGVuZ3RoICE9PSBuMi5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG4xLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChuMVtpXSAhPT0gbjJbaV0pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0ludChhKSB7XG4gICAgcmV0dXJuIGEgJSAxID09PSAwO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRhbmgoeCkge1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICBpZiAoTWF0aC50YW5oICE9IG51bGwpIHtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgICAgICByZXR1cm4gTWF0aC50YW5oKHgpO1xuICAgIH1cbiAgICBpZiAoeCA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIGVsc2UgaWYgKHggPT09IC1JbmZpbml0eSkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBlMnggPSBNYXRoLmV4cCgyICogeCk7XG4gICAgICAgIHJldHVybiAoZTJ4IC0gMSkgLyAoZTJ4ICsgMSk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHNpemVUb1NxdWFyaXNoU2hhcGUoc2l6ZSkge1xuICAgIGNvbnN0IHdpZHRoID0gTWF0aC5jZWlsKE1hdGguc3FydChzaXplKSk7XG4gICAgcmV0dXJuIFt3aWR0aCwgTWF0aC5jZWlsKHNpemUgLyB3aWR0aCldO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGFycmF5IHdpdGggcmFuZG9taXplZCBpbmRpY2llcyB0byBhIGdpdmVuIHF1YW50aXR5LlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCByYW5kb21UZW4gPSB0Zi51dGlsLmNyZWF0ZVNodWZmbGVkSW5kaWNlcygxMCk7XG4gKiBjb25zb2xlLmxvZyhyYW5kb21UZW4pO1xuICogYGBgXG4gKlxuICogQHBhcmFtIG51bWJlciBRdWFudGl0eSBvZiBob3cgbWFueSBzaHVmZmxlZCBpbmRpY2llcyB0byBjcmVhdGUuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1V0aWwnLCBuYW1lc3BhY2U6ICd1dGlsJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNodWZmbGVkSW5kaWNlcyhuKSB7XG4gICAgY29uc3Qgc2h1ZmZsZWRJbmRpY2VzID0gbmV3IFVpbnQzMkFycmF5KG4pO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIHNodWZmbGVkSW5kaWNlc1tpXSA9IGk7XG4gICAgfVxuICAgIHNodWZmbGUoc2h1ZmZsZWRJbmRpY2VzKTtcbiAgICByZXR1cm4gc2h1ZmZsZWRJbmRpY2VzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJpZ2h0UGFkKGEsIHNpemUpIHtcbiAgICBpZiAoc2l6ZSA8PSBhLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gYTtcbiAgICB9XG4gICAgcmV0dXJuIGEgKyAnICcucmVwZWF0KHNpemUgLSBhLmxlbmd0aCk7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVwZWF0ZWRUcnkoY2hlY2tGbiwgZGVsYXlGbiA9IChjb3VudGVyKSA9PiAwLCBtYXhDb3VudGVyKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgbGV0IHRyeUNvdW50ID0gMDtcbiAgICAgICAgY29uc3QgdHJ5Rm4gPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoY2hlY2tGbigpKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeUNvdW50Kys7XG4gICAgICAgICAgICBjb25zdCBuZXh0QmFja29mZiA9IGRlbGF5Rm4odHJ5Q291bnQpO1xuICAgICAgICAgICAgaWYgKG1heENvdW50ZXIgIT0gbnVsbCAmJiB0cnlDb3VudCA+PSBtYXhDb3VudGVyKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0VGltZW91dCh0cnlGbiwgbmV4dEJhY2tvZmYpO1xuICAgICAgICB9O1xuICAgICAgICB0cnlGbigpO1xuICAgIH0pO1xufVxuLyoqXG4gKiBHaXZlbiB0aGUgZnVsbCBzaXplIG9mIHRoZSBhcnJheSBhbmQgYSBzaGFwZSB0aGF0IG1heSBjb250YWluIC0xIGFzIHRoZVxuICogaW1wbGljaXQgZGltZW5zaW9uLCByZXR1cm5zIHRoZSBpbmZlcnJlZCBzaGFwZSB3aGVyZSAtMSBpcyByZXBsYWNlZC5cbiAqIEUuZy4gRm9yIHNoYXBlPVsyLCAtMSwgM10gYW5kIHNpemU9MjQsIGl0IHdpbGwgcmV0dXJuIFsyLCA0LCAzXS5cbiAqXG4gKiBAcGFyYW0gc2hhcGUgVGhlIHNoYXBlLCB3aGljaCBtYXkgY29udGFpbiAtMSBpbiBzb21lIGRpbWVuc2lvbi5cbiAqIEBwYXJhbSBzaXplIFRoZSBmdWxsIHNpemUgKG51bWJlciBvZiBlbGVtZW50cykgb2YgdGhlIGFycmF5LlxuICogQHJldHVybiBUaGUgaW5mZXJyZWQgc2hhcGUgd2hlcmUgLTEgaXMgcmVwbGFjZWQgd2l0aCB0aGUgaW5mZXJyZWQgc2l6ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluZmVyRnJvbUltcGxpY2l0U2hhcGUoc2hhcGUsIHNpemUpIHtcbiAgICBsZXQgc2hhcGVQcm9kID0gMTtcbiAgICBsZXQgaW1wbGljaXRJZHggPSAtMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNoYXBlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmIChzaGFwZVtpXSA+PSAwKSB7XG4gICAgICAgICAgICBzaGFwZVByb2QgKj0gc2hhcGVbaV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc2hhcGVbaV0gPT09IC0xKSB7XG4gICAgICAgICAgICBpZiAoaW1wbGljaXRJZHggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoYFNoYXBlcyBjYW4gb25seSBoYXZlIDEgaW1wbGljaXQgc2l6ZS4gYCArXG4gICAgICAgICAgICAgICAgICAgIGBGb3VuZCAtMSBhdCBkaW0gJHtpbXBsaWNpdElkeH0gYW5kIGRpbSAke2l9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbXBsaWNpdElkeCA9IGk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc2hhcGVbaV0gPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcihgU2hhcGVzIGNhbiBub3QgYmUgPCAwLiBGb3VuZCAke3NoYXBlW2ldfSBhdCBkaW0gJHtpfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpbXBsaWNpdElkeCA9PT0gLTEpIHtcbiAgICAgICAgaWYgKHNpemUgPiAwICYmIHNpemUgIT09IHNoYXBlUHJvZCkge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoYFNpemUoJHtzaXplfSkgbXVzdCBtYXRjaCB0aGUgcHJvZHVjdCBvZiBzaGFwZSAke3NoYXBlfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaGFwZTtcbiAgICB9XG4gICAgaWYgKHNoYXBlUHJvZCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBFcnJvcihgQ2Fubm90IGluZmVyIHRoZSBtaXNzaW5nIHNpemUgaW4gWyR7c2hhcGV9XSB3aGVuIGAgK1xuICAgICAgICAgICAgYHRoZXJlIGFyZSAwIGVsZW1lbnRzYCk7XG4gICAgfVxuICAgIGlmIChzaXplICUgc2hhcGVQcm9kICE9PSAwKSB7XG4gICAgICAgIHRocm93IEVycm9yKGBUaGUgaW1wbGljaXQgc2hhcGUgY2FuJ3QgYmUgYSBmcmFjdGlvbmFsIG51bWJlci4gYCArXG4gICAgICAgICAgICBgR290ICR7c2l6ZX0gLyAke3NoYXBlUHJvZH1gKTtcbiAgICB9XG4gICAgY29uc3QgbmV3U2hhcGUgPSBzaGFwZS5zbGljZSgpO1xuICAgIG5ld1NoYXBlW2ltcGxpY2l0SWR4XSA9IHNpemUgLyBzaGFwZVByb2Q7XG4gICAgcmV0dXJuIG5ld1NoYXBlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQXhpc1BhcmFtKGF4aXMsIHNoYXBlKSB7XG4gICAgY29uc3QgcmFuayA9IHNoYXBlLmxlbmd0aDtcbiAgICAvLyBOb3JtYWxpemUgaW5wdXRcbiAgICBheGlzID0gYXhpcyA9PSBudWxsID8gc2hhcGUubWFwKChzLCBpKSA9PiBpKSA6IFtdLmNvbmNhdChheGlzKTtcbiAgICAvLyBDaGVjayBmb3IgdmFsaWQgcmFuZ2VcbiAgICBhc3NlcnQoYXhpcy5ldmVyeShheCA9PiBheCA+PSAtcmFuayAmJiBheCA8IHJhbmspLCAoKSA9PiBgQWxsIHZhbHVlcyBpbiBheGlzIHBhcmFtIG11c3QgYmUgaW4gcmFuZ2UgWy0ke3Jhbmt9LCAke3Jhbmt9KSBidXQgYCArXG4gICAgICAgIGBnb3QgYXhpcyAke2F4aXN9YCk7XG4gICAgLy8gQ2hlY2sgZm9yIG9ubHkgaW50ZWdlcnNcbiAgICBhc3NlcnQoYXhpcy5ldmVyeShheCA9PiBpc0ludChheCkpLCAoKSA9PiBgQWxsIHZhbHVlcyBpbiBheGlzIHBhcmFtIG11c3QgYmUgaW50ZWdlcnMgYnV0IGAgK1xuICAgICAgICBgZ290IGF4aXMgJHtheGlzfWApO1xuICAgIC8vIEhhbmRsZSBuZWdhdGl2ZSBheGlzLlxuICAgIHJldHVybiBheGlzLm1hcChhID0+IGEgPCAwID8gcmFuayArIGEgOiBhKTtcbn1cbi8qKiBSZWR1Y2VzIHRoZSBzaGFwZSBieSByZW1vdmluZyBhbGwgZGltZW5zaW9ucyBvZiBzaGFwZSAxLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNxdWVlemVTaGFwZShzaGFwZSwgYXhpcykge1xuICAgIGNvbnN0IG5ld1NoYXBlID0gW107XG4gICAgY29uc3Qga2VwdERpbXMgPSBbXTtcbiAgICBjb25zdCBpc0VtcHR5QXJyYXkgPSBheGlzICE9IG51bGwgJiYgQXJyYXkuaXNBcnJheShheGlzKSAmJiBheGlzLmxlbmd0aCA9PT0gMDtcbiAgICBjb25zdCBheGVzID0gKGF4aXMgPT0gbnVsbCB8fCBpc0VtcHR5QXJyYXkpID9cbiAgICAgICAgbnVsbCA6XG4gICAgICAgIHBhcnNlQXhpc1BhcmFtKGF4aXMsIHNoYXBlKS5zb3J0KCk7XG4gICAgbGV0IGogPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2hhcGUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgaWYgKGF4ZXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGF4ZXNbal0gPT09IGkgJiYgc2hhcGVbaV0gIT09IDEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IHNxdWVlemUgYXhpcyAke2l9IHNpbmNlIGl0cyBkaW0gJyR7c2hhcGVbaV19JyBpcyBub3QgMWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChheGVzW2pdID09IG51bGwgfHwgYXhlc1tqXSA+IGkpICYmIHNoYXBlW2ldID09PSAxKSB7XG4gICAgICAgICAgICAgICAgbmV3U2hhcGUucHVzaChzaGFwZVtpXSk7XG4gICAgICAgICAgICAgICAga2VwdERpbXMucHVzaChpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChheGVzW2pdIDw9IGkpIHtcbiAgICAgICAgICAgICAgICBqKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNoYXBlW2ldICE9PSAxKSB7XG4gICAgICAgICAgICBuZXdTaGFwZS5wdXNoKHNoYXBlW2ldKTtcbiAgICAgICAgICAgIGtlcHREaW1zLnB1c2goaSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgbmV3U2hhcGUsIGtlcHREaW1zIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0VHlwZWRBcnJheUZyb21EVHlwZShkdHlwZSwgc2l6ZSkge1xuICAgIGxldCB2YWx1ZXMgPSBudWxsO1xuICAgIGlmIChkdHlwZSA9PSBudWxsIHx8IGR0eXBlID09PSAnZmxvYXQzMicpIHtcbiAgICAgICAgdmFsdWVzID0gbmV3IEZsb2F0MzJBcnJheShzaXplKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZHR5cGUgPT09ICdpbnQzMicpIHtcbiAgICAgICAgdmFsdWVzID0gbmV3IEludDMyQXJyYXkoc2l6ZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGR0eXBlID09PSAnYm9vbCcpIHtcbiAgICAgICAgdmFsdWVzID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZGF0YSB0eXBlICR7ZHR5cGV9YCk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZXM7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0QXJyYXlGcm9tRFR5cGUoZHR5cGUsIHNpemUpIHtcbiAgICBsZXQgdmFsdWVzID0gbnVsbDtcbiAgICBpZiAoZHR5cGUgPT0gbnVsbCB8fCBkdHlwZSA9PT0gJ2Zsb2F0MzInKSB7XG4gICAgICAgIHZhbHVlcyA9IG5ldyBGbG9hdDMyQXJyYXkoc2l6ZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGR0eXBlID09PSAnaW50MzInKSB7XG4gICAgICAgIHZhbHVlcyA9IG5ldyBJbnQzMkFycmF5KHNpemUpO1xuICAgIH1cbiAgICBlbHNlIGlmIChkdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgICAgIHZhbHVlcyA9IG5ldyBVaW50OEFycmF5KHNpemUpO1xuICAgIH1cbiAgICBlbHNlIGlmIChkdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFsdWVzID0gbmV3IEFycmF5KHNpemUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGRhdGEgdHlwZSAke2R0eXBlfWApO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrQ29udmVyc2lvbkZvckVycm9ycyh2YWxzLCBkdHlwZSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBudW0gPSB2YWxzW2ldO1xuICAgICAgICBpZiAoaXNOYU4obnVtKSB8fCAhaXNGaW5pdGUobnVtKSkge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoYEEgdGVuc29yIG9mIHR5cGUgJHtkdHlwZX0gYmVpbmcgdXBsb2FkZWQgY29udGFpbnMgJHtudW19LmApO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZHR5cGUgaXMgdmFsaWQuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZER0eXBlKGR0eXBlKSB7XG4gICAgcmV0dXJuIGR0eXBlID09PSAnYm9vbCcgfHwgZHR5cGUgPT09ICdjb21wbGV4NjQnIHx8IGR0eXBlID09PSAnZmxvYXQzMicgfHxcbiAgICAgICAgZHR5cGUgPT09ICdpbnQzMicgfHwgZHR5cGUgPT09ICdzdHJpbmcnO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIG5ldyB0eXBlIGNhbid0IGVuY29kZSB0aGUgb2xkIHR5cGUgd2l0aG91dCBsb3NzIG9mXG4gKiBwcmVjaXNpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNFbmNvZGluZ0xvc3Mob2xkVHlwZSwgbmV3VHlwZSkge1xuICAgIGlmIChuZXdUeXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChuZXdUeXBlID09PSAnZmxvYXQzMicgJiYgb2xkVHlwZSAhPT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobmV3VHlwZSA9PT0gJ2ludDMyJyAmJiBvbGRUeXBlICE9PSAnZmxvYXQzMicgJiYgb2xkVHlwZSAhPT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobmV3VHlwZSA9PT0gJ2Jvb2wnICYmIG9sZFR5cGUgPT09ICdib29sJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVHlwZWRBcnJheShhKSB7XG4gICAgcmV0dXJuIGEgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkgfHwgYSBpbnN0YW5jZW9mIEludDMyQXJyYXkgfHxcbiAgICAgICAgYSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXk7XG59XG5leHBvcnQgZnVuY3Rpb24gYnl0ZXNQZXJFbGVtZW50KGR0eXBlKSB7XG4gICAgaWYgKGR0eXBlID09PSAnZmxvYXQzMicgfHwgZHR5cGUgPT09ICdpbnQzMicpIHtcbiAgICAgICAgcmV0dXJuIDQ7XG4gICAgfVxuICAgIGVsc2UgaWYgKGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICByZXR1cm4gODtcbiAgICB9XG4gICAgZWxzZSBpZiAoZHR5cGUgPT09ICdib29sJykge1xuICAgICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBkdHlwZSAke2R0eXBlfWApO1xuICAgIH1cbn1cbi8qKlxuICogUmV0dXJucyB0aGUgYXBwcm94aW1hdGUgbnVtYmVyIG9mIGJ5dGVzIGFsbG9jYXRlZCBpbiB0aGUgc3RyaW5nIGFycmF5IC0gMlxuICogYnl0ZXMgcGVyIGNoYXJhY3Rlci4gQ29tcHV0aW5nIHRoZSBleGFjdCBieXRlcyBmb3IgYSBuYXRpdmUgc3RyaW5nIGluIEpTIGlzXG4gKiBub3QgcG9zc2libGUgc2luY2UgaXQgZGVwZW5kcyBvbiB0aGUgZW5jb2Rpbmcgb2YgdGhlIGh0bWwgcGFnZSB0aGF0IHNlcnZlc1xuICogdGhlIHdlYnNpdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBieXRlc0Zyb21TdHJpbmdBcnJheShhcnIpIHtcbiAgICBpZiAoYXJyID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGxldCBieXRlcyA9IDA7XG4gICAgYXJyLmZvckVhY2goeCA9PiBieXRlcyArPSB4Lmxlbmd0aCk7XG4gICAgcmV0dXJuIGJ5dGVzO1xufVxuLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSBzdHJpbmcuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZztcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0Jvb2xlYW4odmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbic7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXIodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJztcbn1cbmV4cG9ydCBmdW5jdGlvbiBpbmZlckR0eXBlKHZhbHVlcykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICAgICAgcmV0dXJuIGluZmVyRHR5cGUodmFsdWVzWzBdKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlcyBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSkge1xuICAgICAgICByZXR1cm4gJ2Zsb2F0MzInO1xuICAgIH1cbiAgICBlbHNlIGlmICh2YWx1ZXMgaW5zdGFuY2VvZiBJbnQzMkFycmF5IHx8IHZhbHVlcyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgcmV0dXJuICdpbnQzMic7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzTnVtYmVyKHZhbHVlcykpIHtcbiAgICAgICAgcmV0dXJuICdmbG9hdDMyJztcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNTdHJpbmcodmFsdWVzKSkge1xuICAgICAgICByZXR1cm4gJ3N0cmluZyc7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzQm9vbGVhbih2YWx1ZXMpKSB7XG4gICAgICAgIHJldHVybiAnYm9vbCc7XG4gICAgfVxuICAgIHJldHVybiAnZmxvYXQzMic7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNGdW5jdGlvbihmKSB7XG4gICAgcmV0dXJuICEhKGYgJiYgZi5jb25zdHJ1Y3RvciAmJiBmLmNhbGwgJiYgZi5hcHBseSk7XG59XG5leHBvcnQgZnVuY3Rpb24gbmVhcmVzdERpdmlzb3Ioc2l6ZSwgc3RhcnQpIHtcbiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzaXplOyArK2kpIHtcbiAgICAgICAgaWYgKHNpemUgJSBpID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2l6ZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlU3RyaWRlcyhzaGFwZSkge1xuICAgIGNvbnN0IHJhbmsgPSBzaGFwZS5sZW5ndGg7XG4gICAgaWYgKHJhbmsgPCAyKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgLy8gTGFzdCBkaW1lbnNpb24gaGFzIGltcGxpY2l0IHN0cmlkZSBvZiAxLCB0aHVzIGhhdmluZyBELTEgKGluc3RlYWQgb2YgRClcbiAgICAvLyBzdHJpZGVzLlxuICAgIGNvbnN0IHN0cmlkZXMgPSBuZXcgQXJyYXkocmFuayAtIDEpO1xuICAgIHN0cmlkZXNbcmFuayAtIDJdID0gc2hhcGVbcmFuayAtIDFdO1xuICAgIGZvciAobGV0IGkgPSByYW5rIC0gMzsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgc3RyaWRlc1tpXSA9IHN0cmlkZXNbaSArIDFdICogc2hhcGVbaSArIDFdO1xuICAgIH1cbiAgICByZXR1cm4gc3RyaWRlcztcbn1cbmZ1bmN0aW9uIGNyZWF0ZU5lc3RlZEFycmF5KG9mZnNldCwgc2hhcGUsIGEsIGlzQ29tcGxleCA9IGZhbHNlKSB7XG4gICAgY29uc3QgcmV0ID0gbmV3IEFycmF5KCk7XG4gICAgaWYgKHNoYXBlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCBkID0gc2hhcGVbMF0gKiAoaXNDb21wbGV4ID8gMiA6IDEpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGQ7IGkrKykge1xuICAgICAgICAgICAgcmV0W2ldID0gYVtvZmZzZXQgKyBpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgZCA9IHNoYXBlWzBdO1xuICAgICAgICBjb25zdCByZXN0ID0gc2hhcGUuc2xpY2UoMSk7XG4gICAgICAgIGNvbnN0IGxlbiA9IHJlc3QucmVkdWNlKChhY2MsIGMpID0+IGFjYyAqIGMpICogKGlzQ29tcGxleCA/IDIgOiAxKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkOyBpKyspIHtcbiAgICAgICAgICAgIHJldFtpXSA9IGNyZWF0ZU5lc3RlZEFycmF5KG9mZnNldCArIGkgKiBsZW4sIHJlc3QsIGEsIGlzQ29tcGxleCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn1cbi8vIFByb3ZpZGUgYSBuZXN0ZWQgYXJyYXkgb2YgVHlwZWRBcnJheSBpbiBnaXZlbiBzaGFwZS5cbmV4cG9ydCBmdW5jdGlvbiB0b05lc3RlZEFycmF5KHNoYXBlLCBhLCBpc0NvbXBsZXggPSBmYWxzZSkge1xuICAgIGlmIChzaGFwZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gU2NhbGFyIHR5cGUgc2hvdWxkIHJldHVybiBhIHNpbmdsZSBudW1iZXIuXG4gICAgICAgIHJldHVybiBhWzBdO1xuICAgIH1cbiAgICBjb25zdCBzaXplID0gc2hhcGUucmVkdWNlKChhY2MsIGMpID0+IGFjYyAqIGMpICogKGlzQ29tcGxleCA/IDIgOiAxKTtcbiAgICBpZiAoc2l6ZSA9PT0gMCkge1xuICAgICAgICAvLyBBIHRlbnNvciB3aXRoIHNoYXBlIHplcm8gc2hvdWxkIGJlIHR1cm5lZCBpbnRvIGVtcHR5IGxpc3QuXG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgaWYgKHNpemUgIT09IGEubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWyR7c2hhcGV9XSBkb2VzIG5vdCBtYXRjaCB0aGUgaW5wdXQgc2l6ZSAke2EubGVuZ3RofSR7aXNDb21wbGV4ID8gJyBmb3IgYSBjb21wbGV4IHRlbnNvcicgOiAnJ30uYCk7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVOZXN0ZWRBcnJheSgwLCBzaGFwZSwgYSwgaXNDb21wbGV4KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBtYWtlT25lc1R5cGVkQXJyYXkoc2l6ZSwgZHR5cGUpIHtcbiAgICBjb25zdCBhcnJheSA9IG1ha2VaZXJvc1R5cGVkQXJyYXkoc2l6ZSwgZHR5cGUpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYXJyYXlbaV0gPSAxO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG59XG5leHBvcnQgZnVuY3Rpb24gbWFrZVplcm9zVHlwZWRBcnJheShzaXplLCBkdHlwZSkge1xuICAgIGlmIChkdHlwZSA9PSBudWxsIHx8IGR0eXBlID09PSAnZmxvYXQzMicgfHwgZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KHNpemUpO1xuICAgIH1cbiAgICBlbHNlIGlmIChkdHlwZSA9PT0gJ2ludDMyJykge1xuICAgICAgICByZXR1cm4gbmV3IEludDMyQXJyYXkoc2l6ZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGR0eXBlID09PSAnYm9vbCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHNpemUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGRhdGEgdHlwZSAke2R0eXBlfWApO1xuICAgIH1cbn1cbi8qKlxuICogTWFrZSBuZXN0ZWQgYFR5cGVkQXJyYXlgIGZpbGxlZCB3aXRoIHplcm9zLlxuICogQHBhcmFtIHNoYXBlIFRoZSBzaGFwZSBpbmZvcm1hdGlvbiBmb3IgdGhlIG5lc3RlZCBhcnJheS5cbiAqIEBwYXJhbSBkdHlwZSBkdHlwZSBvZiB0aGUgYXJyYXkgZWxlbWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VaZXJvc05lc3RlZFR5cGVkQXJyYXkoc2hhcGUsIGR0eXBlKSB7XG4gICAgY29uc3Qgc2l6ZSA9IHNoYXBlLnJlZHVjZSgocHJldiwgY3VycikgPT4gcHJldiAqIGN1cnIsIDEpO1xuICAgIGlmIChkdHlwZSA9PSBudWxsIHx8IGR0eXBlID09PSAnZmxvYXQzMicpIHtcbiAgICAgICAgcmV0dXJuIHRvTmVzdGVkQXJyYXkoc2hhcGUsIG5ldyBGbG9hdDMyQXJyYXkoc2l6ZSkpO1xuICAgIH1cbiAgICBlbHNlIGlmIChkdHlwZSA9PT0gJ2ludDMyJykge1xuICAgICAgICByZXR1cm4gdG9OZXN0ZWRBcnJheShzaGFwZSwgbmV3IEludDMyQXJyYXkoc2l6ZSkpO1xuICAgIH1cbiAgICBlbHNlIGlmIChkdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgICAgIHJldHVybiB0b05lc3RlZEFycmF5KHNoYXBlLCBuZXcgVWludDhBcnJheShzaXplKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZGF0YSB0eXBlICR7ZHR5cGV9YCk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE5vbk5lZ2F0aXZlSW50ZWdlckRpbWVuc2lvbnMoc2hhcGUpIHtcbiAgICBzaGFwZS5mb3JFYWNoKGRpbVNpemUgPT4ge1xuICAgICAgICBhc3NlcnQoTnVtYmVyLmlzSW50ZWdlcihkaW1TaXplKSAmJiBkaW1TaXplID49IDAsICgpID0+IGBUZW5zb3IgbXVzdCBoYXZlIGEgc2hhcGUgY29tcHJpc2VkIG9mIHBvc2l0aXZlIGludGVnZXJzIGJ1dCBnb3QgYCArXG4gICAgICAgICAgICBgc2hhcGUgWyR7c2hhcGV9XS5gKTtcbiAgICB9KTtcbn1cbi8qKlxuICogQ29tcHV0ZXMgZmxhdCBpbmRleCBmb3IgYSBnaXZlbiBsb2NhdGlvbiAobXVsdGlkaW1lbnRpb25zYWwgaW5kZXgpIGluIGFcbiAqIFRlbnNvci9tdWx0aWRpbWVuc2lvbmFsIGFycmF5LlxuICpcbiAqIEBwYXJhbSBsb2NzIExvY2F0aW9uIGluIHRoZSB0ZW5zb3IuXG4gKiBAcGFyYW0gcmFuayBSYW5rIG9mIHRoZSB0ZW5zb3IuXG4gKiBAcGFyYW0gc3RyaWRlcyBUZW5zb3Igc3RyaWRlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvY1RvSW5kZXgobG9jcywgcmFuaywgc3RyaWRlcykge1xuICAgIGlmIChyYW5rID09PSAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBlbHNlIGlmIChyYW5rID09PSAxKSB7XG4gICAgICAgIHJldHVybiBsb2NzWzBdO1xuICAgIH1cbiAgICBsZXQgaW5kZXggPSBsb2NzW2xvY3MubGVuZ3RoIC0gMV07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NzLmxlbmd0aCAtIDE7ICsraSkge1xuICAgICAgICBpbmRleCArPSBzdHJpZGVzW2ldICogbG9jc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIGluZGV4O1xufVxuLyoqXG4gKiBDb21wdXRlcyB0aGUgbG9jYXRpb24gKG11bHRpZGltZW5zaW9uYWwgaW5kZXgpIGluIGEgdGVuc29yL211bHRpZGltZW50aW9uYWxcbiAqIGFycmF5IGZvciBhIGdpdmVuIGZsYXQgaW5kZXguXG4gKlxuICogQHBhcmFtIGluZGV4IEluZGV4IGluIGZsYXQgYXJyYXkuXG4gKiBAcGFyYW0gcmFuayBSYW5rIG9mIHRlbnNvci5cbiAqIEBwYXJhbSBzdHJpZGVzIFN0cmlkZXMgb2YgdGVuc29yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5kZXhUb0xvYyhpbmRleCwgcmFuaywgc3RyaWRlcykge1xuICAgIGlmIChyYW5rID09PSAwKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgZWxzZSBpZiAocmFuayA9PT0gMSkge1xuICAgICAgICByZXR1cm4gW2luZGV4XTtcbiAgICB9XG4gICAgY29uc3QgbG9jcyA9IG5ldyBBcnJheShyYW5rKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvY3MubGVuZ3RoIC0gMTsgKytpKSB7XG4gICAgICAgIGxvY3NbaV0gPSBNYXRoLmZsb29yKGluZGV4IC8gc3RyaWRlc1tpXSk7XG4gICAgICAgIGluZGV4IC09IGxvY3NbaV0gKiBzdHJpZGVzW2ldO1xuICAgIH1cbiAgICBsb2NzW2xvY3MubGVuZ3RoIC0gMV0gPSBpbmRleDtcbiAgICByZXR1cm4gbG9jcztcbn1cbi8qKlxuICogVGhpcyBtZXRob2QgYXNzZXJ0cyB3aGV0aGVyIGFuIG9iamVjdCBpcyBhIFByb21pc2UgaW5zdGFuY2UuXG4gKiBAcGFyYW0gb2JqZWN0XG4gKi9cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tYW55XG5leHBvcnQgZnVuY3Rpb24gaXNQcm9taXNlKG9iamVjdCkge1xuICAgIC8vICBXZSBjaG9zZSB0byBub3QgdXNlICdvYmogaW5zdGFuY2VPZiBQcm9taXNlJyBmb3IgdHdvIHJlYXNvbnM6XG4gICAgLy8gIDEuIEl0IG9ubHkgcmVsaWFibHkgd29ya3MgZm9yIGVzNiBQcm9taXNlLCBub3Qgb3RoZXIgUHJvbWlzZVxuICAgIC8vICBpbXBsZW1lbnRhdGlvbnMuXG4gICAgLy8gIDIuIEl0IGRvZXNuJ3Qgd29yayB3aXRoIGZyYW1ld29yayB0aGF0IHVzZXMgem9uZS5qcy4gem9uZS5qcyBtb25rZXkgcGF0Y2hcbiAgICAvLyAgdGhlIGFzeW5jIGNhbGxzLCBzbyBpdCBpcyBwb3NzaWJsZSB0aGUgb2JqIChwYXRjaGVkKSBpcyBjb21wYXJpbmcgdG8gYVxuICAgIC8vICBwcmUtcGF0Y2hlZCBQcm9taXNlLlxuICAgIHJldHVybiBvYmplY3QgJiYgb2JqZWN0LnRoZW4gJiYgdHlwZW9mIG9iamVjdC50aGVuID09PSAnZnVuY3Rpb24nO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbF9iYXNlLmpzLm1hcCIsIi8qKiBAbGljZW5zZSBTZWUgdGhlIExJQ0VOU0UgZmlsZS4gKi9cbi8vIFRoaXMgY29kZSBpcyBhdXRvLWdlbmVyYXRlZCwgZG8gbm90IG1vZGlmeSB0aGlzIGZpbGUhXG5jb25zdCB2ZXJzaW9uID0gJzMuOC4wJztcbmV4cG9ydCB7IHZlcnNpb24gfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZlcnNpb24uanMubWFwIiwiJ3VzZSBzdHJpY3QnXG5cbmV4cG9ydHMuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhcbmV4cG9ydHMudG9CeXRlQXJyYXkgPSB0b0J5dGVBcnJheVxuZXhwb3J0cy5mcm9tQnl0ZUFycmF5ID0gZnJvbUJ5dGVBcnJheVxuXG52YXIgbG9va3VwID0gW11cbnZhciByZXZMb29rdXAgPSBbXVxudmFyIEFyciA9IHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJyA/IFVpbnQ4QXJyYXkgOiBBcnJheVxuXG52YXIgY29kZSA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJ1xuZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNvZGUubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgbG9va3VwW2ldID0gY29kZVtpXVxuICByZXZMb29rdXBbY29kZS5jaGFyQ29kZUF0KGkpXSA9IGlcbn1cblxuLy8gU3VwcG9ydCBkZWNvZGluZyBVUkwtc2FmZSBiYXNlNjQgc3RyaW5ncywgYXMgTm9kZS5qcyBkb2VzLlxuLy8gU2VlOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CYXNlNjQjVVJMX2FwcGxpY2F0aW9uc1xucmV2TG9va3VwWyctJy5jaGFyQ29kZUF0KDApXSA9IDYyXG5yZXZMb29rdXBbJ18nLmNoYXJDb2RlQXQoMCldID0gNjNcblxuZnVuY3Rpb24gZ2V0TGVucyAoYjY0KSB7XG4gIHZhciBsZW4gPSBiNjQubGVuZ3RoXG5cbiAgaWYgKGxlbiAlIDQgPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0JylcbiAgfVxuXG4gIC8vIFRyaW0gb2ZmIGV4dHJhIGJ5dGVzIGFmdGVyIHBsYWNlaG9sZGVyIGJ5dGVzIGFyZSBmb3VuZFxuICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9iZWF0Z2FtbWl0L2Jhc2U2NC1qcy9pc3N1ZXMvNDJcbiAgdmFyIHZhbGlkTGVuID0gYjY0LmluZGV4T2YoJz0nKVxuICBpZiAodmFsaWRMZW4gPT09IC0xKSB2YWxpZExlbiA9IGxlblxuXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSB2YWxpZExlbiA9PT0gbGVuXG4gICAgPyAwXG4gICAgOiA0IC0gKHZhbGlkTGVuICUgNClcblxuICByZXR1cm4gW3ZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW5dXG59XG5cbi8vIGJhc2U2NCBpcyA0LzMgKyB1cCB0byB0d28gY2hhcmFjdGVycyBvZiB0aGUgb3JpZ2luYWwgZGF0YVxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoYjY0KSB7XG4gIHZhciBsZW5zID0gZ2V0TGVucyhiNjQpXG4gIHZhciB2YWxpZExlbiA9IGxlbnNbMF1cbiAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IGxlbnNbMV1cbiAgcmV0dXJuICgodmFsaWRMZW4gKyBwbGFjZUhvbGRlcnNMZW4pICogMyAvIDQpIC0gcGxhY2VIb2xkZXJzTGVuXG59XG5cbmZ1bmN0aW9uIF9ieXRlTGVuZ3RoIChiNjQsIHZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW4pIHtcbiAgcmV0dXJuICgodmFsaWRMZW4gKyBwbGFjZUhvbGRlcnNMZW4pICogMyAvIDQpIC0gcGxhY2VIb2xkZXJzTGVuXG59XG5cbmZ1bmN0aW9uIHRvQnl0ZUFycmF5IChiNjQpIHtcbiAgdmFyIHRtcFxuICB2YXIgbGVucyA9IGdldExlbnMoYjY0KVxuICB2YXIgdmFsaWRMZW4gPSBsZW5zWzBdXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSBsZW5zWzFdXG5cbiAgdmFyIGFyciA9IG5ldyBBcnIoX2J5dGVMZW5ndGgoYjY0LCB2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuKSlcblxuICB2YXIgY3VyQnl0ZSA9IDBcblxuICAvLyBpZiB0aGVyZSBhcmUgcGxhY2Vob2xkZXJzLCBvbmx5IGdldCB1cCB0byB0aGUgbGFzdCBjb21wbGV0ZSA0IGNoYXJzXG4gIHZhciBsZW4gPSBwbGFjZUhvbGRlcnNMZW4gPiAwXG4gICAgPyB2YWxpZExlbiAtIDRcbiAgICA6IHZhbGlkTGVuXG5cbiAgdmFyIGlcbiAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7XG4gICAgdG1wID1cbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDE4KSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgMTIpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA8PCA2KSB8XG4gICAgICByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDMpXVxuICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA+PiAxNikgJiAweEZGXG4gICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgaWYgKHBsYWNlSG9sZGVyc0xlbiA9PT0gMikge1xuICAgIHRtcCA9XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAyKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPj4gNClcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIGlmIChwbGFjZUhvbGRlcnNMZW4gPT09IDEpIHtcbiAgICB0bXAgPVxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTApIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCA0KSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPj4gMilcbiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gOCkgJiAweEZGXG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICByZXR1cm4gYXJyXG59XG5cbmZ1bmN0aW9uIHRyaXBsZXRUb0Jhc2U2NCAobnVtKSB7XG4gIHJldHVybiBsb29rdXBbbnVtID4+IDE4ICYgMHgzRl0gK1xuICAgIGxvb2t1cFtudW0gPj4gMTIgJiAweDNGXSArXG4gICAgbG9va3VwW251bSA+PiA2ICYgMHgzRl0gK1xuICAgIGxvb2t1cFtudW0gJiAweDNGXVxufVxuXG5mdW5jdGlvbiBlbmNvZGVDaHVuayAodWludDgsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHRtcFxuICB2YXIgb3V0cHV0ID0gW11cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IDMpIHtcbiAgICB0bXAgPVxuICAgICAgKCh1aW50OFtpXSA8PCAxNikgJiAweEZGMDAwMCkgK1xuICAgICAgKCh1aW50OFtpICsgMV0gPDwgOCkgJiAweEZGMDApICtcbiAgICAgICh1aW50OFtpICsgMl0gJiAweEZGKVxuICAgIG91dHB1dC5wdXNoKHRyaXBsZXRUb0Jhc2U2NCh0bXApKVxuICB9XG4gIHJldHVybiBvdXRwdXQuam9pbignJylcbn1cblxuZnVuY3Rpb24gZnJvbUJ5dGVBcnJheSAodWludDgpIHtcbiAgdmFyIHRtcFxuICB2YXIgbGVuID0gdWludDgubGVuZ3RoXG4gIHZhciBleHRyYUJ5dGVzID0gbGVuICUgMyAvLyBpZiB3ZSBoYXZlIDEgYnl0ZSBsZWZ0LCBwYWQgMiBieXRlc1xuICB2YXIgcGFydHMgPSBbXVxuICB2YXIgbWF4Q2h1bmtMZW5ndGggPSAxNjM4MyAvLyBtdXN0IGJlIG11bHRpcGxlIG9mIDNcblxuICAvLyBnbyB0aHJvdWdoIHRoZSBhcnJheSBldmVyeSB0aHJlZSBieXRlcywgd2UnbGwgZGVhbCB3aXRoIHRyYWlsaW5nIHN0dWZmIGxhdGVyXG4gIGZvciAodmFyIGkgPSAwLCBsZW4yID0gbGVuIC0gZXh0cmFCeXRlczsgaSA8IGxlbjI7IGkgKz0gbWF4Q2h1bmtMZW5ndGgpIHtcbiAgICBwYXJ0cy5wdXNoKGVuY29kZUNodW5rKHVpbnQ4LCBpLCAoaSArIG1heENodW5rTGVuZ3RoKSA+IGxlbjIgPyBsZW4yIDogKGkgKyBtYXhDaHVua0xlbmd0aCkpKVxuICB9XG5cbiAgLy8gcGFkIHRoZSBlbmQgd2l0aCB6ZXJvcywgYnV0IG1ha2Ugc3VyZSB0byBub3QgZm9yZ2V0IHRoZSBleHRyYSBieXRlc1xuICBpZiAoZXh0cmFCeXRlcyA9PT0gMSkge1xuICAgIHRtcCA9IHVpbnQ4W2xlbiAtIDFdXG4gICAgcGFydHMucHVzaChcbiAgICAgIGxvb2t1cFt0bXAgPj4gMl0gK1xuICAgICAgbG9va3VwWyh0bXAgPDwgNCkgJiAweDNGXSArXG4gICAgICAnPT0nXG4gICAgKVxuICB9IGVsc2UgaWYgKGV4dHJhQnl0ZXMgPT09IDIpIHtcbiAgICB0bXAgPSAodWludDhbbGVuIC0gMl0gPDwgOCkgKyB1aW50OFtsZW4gLSAxXVxuICAgIHBhcnRzLnB1c2goXG4gICAgICBsb29rdXBbdG1wID4+IDEwXSArXG4gICAgICBsb29rdXBbKHRtcCA+PiA0KSAmIDB4M0ZdICtcbiAgICAgIGxvb2t1cFsodG1wIDw8IDIpICYgMHgzRl0gK1xuICAgICAgJz0nXG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIHBhcnRzLmpvaW4oJycpXG59XG4iLCIvKiFcbiAqIFRoZSBidWZmZXIgbW9kdWxlIGZyb20gbm9kZS5qcywgZm9yIHRoZSBicm93c2VyLlxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbnZhciBiYXNlNjQgPSByZXF1aXJlKCdiYXNlNjQtanMnKVxudmFyIGllZWU3NTQgPSByZXF1aXJlKCdpZWVlNzU0JylcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnaXNhcnJheScpXG5cbmV4cG9ydHMuQnVmZmVyID0gQnVmZmVyXG5leHBvcnRzLlNsb3dCdWZmZXIgPSBTbG93QnVmZmVyXG5leHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTID0gNTBcblxuLyoqXG4gKiBJZiBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgOlxuICogICA9PT0gdHJ1ZSAgICBVc2UgVWludDhBcnJheSBpbXBsZW1lbnRhdGlvbiAoZmFzdGVzdClcbiAqICAgPT09IGZhbHNlICAgVXNlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiAobW9zdCBjb21wYXRpYmxlLCBldmVuIElFNilcbiAqXG4gKiBCcm93c2VycyB0aGF0IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGFyZSBJRSAxMCssIEZpcmVmb3ggNCssIENocm9tZSA3KywgU2FmYXJpIDUuMSssXG4gKiBPcGVyYSAxMS42KywgaU9TIDQuMisuXG4gKlxuICogRHVlIHRvIHZhcmlvdXMgYnJvd3NlciBidWdzLCBzb21ldGltZXMgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIHVzZWQgZXZlblxuICogd2hlbiB0aGUgYnJvd3NlciBzdXBwb3J0cyB0eXBlZCBhcnJheXMuXG4gKlxuICogTm90ZTpcbiAqXG4gKiAgIC0gRmlyZWZveCA0LTI5IGxhY2tzIHN1cHBvcnQgZm9yIGFkZGluZyBuZXcgcHJvcGVydGllcyB0byBgVWludDhBcnJheWAgaW5zdGFuY2VzLFxuICogICAgIFNlZTogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk1NDM4LlxuICpcbiAqICAgLSBDaHJvbWUgOS0xMCBpcyBtaXNzaW5nIHRoZSBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uLlxuICpcbiAqICAgLSBJRTEwIGhhcyBhIGJyb2tlbiBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYXJyYXlzIG9mXG4gKiAgICAgaW5jb3JyZWN0IGxlbmd0aCBpbiBzb21lIHNpdHVhdGlvbnMuXG5cbiAqIFdlIGRldGVjdCB0aGVzZSBidWdneSBicm93c2VycyBhbmQgc2V0IGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGAgdG8gYGZhbHNlYCBzbyB0aGV5XG4gKiBnZXQgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaXMgc2xvd2VyIGJ1dCBiZWhhdmVzIGNvcnJlY3RseS5cbiAqL1xuQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgPSBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVCAhPT0gdW5kZWZpbmVkXG4gID8gZ2xvYmFsLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgOiB0eXBlZEFycmF5U3VwcG9ydCgpXG5cbi8qXG4gKiBFeHBvcnQga01heExlbmd0aCBhZnRlciB0eXBlZCBhcnJheSBzdXBwb3J0IGlzIGRldGVybWluZWQuXG4gKi9cbmV4cG9ydHMua01heExlbmd0aCA9IGtNYXhMZW5ndGgoKVxuXG5mdW5jdGlvbiB0eXBlZEFycmF5U3VwcG9ydCAoKSB7XG4gIHRyeSB7XG4gICAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KDEpXG4gICAgYXJyLl9fcHJvdG9fXyA9IHtfX3Byb3RvX186IFVpbnQ4QXJyYXkucHJvdG90eXBlLCBmb286IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDQyIH19XG4gICAgcmV0dXJuIGFyci5mb28oKSA9PT0gNDIgJiYgLy8gdHlwZWQgYXJyYXkgaW5zdGFuY2VzIGNhbiBiZSBhdWdtZW50ZWRcbiAgICAgICAgdHlwZW9mIGFyci5zdWJhcnJheSA9PT0gJ2Z1bmN0aW9uJyAmJiAvLyBjaHJvbWUgOS0xMCBsYWNrIGBzdWJhcnJheWBcbiAgICAgICAgYXJyLnN1YmFycmF5KDEsIDEpLmJ5dGVMZW5ndGggPT09IDAgLy8gaWUxMCBoYXMgYnJva2VuIGBzdWJhcnJheWBcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmZ1bmN0aW9uIGtNYXhMZW5ndGggKCkge1xuICByZXR1cm4gQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgICA/IDB4N2ZmZmZmZmZcbiAgICA6IDB4M2ZmZmZmZmZcbn1cblxuZnVuY3Rpb24gY3JlYXRlQnVmZmVyICh0aGF0LCBsZW5ndGgpIHtcbiAgaWYgKGtNYXhMZW5ndGgoKSA8IGxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHR5cGVkIGFycmF5IGxlbmd0aCcpXG4gIH1cbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aClcbiAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICAvLyBGYWxsYmFjazogUmV0dXJuIGFuIG9iamVjdCBpbnN0YW5jZSBvZiB0aGUgQnVmZmVyIGNsYXNzXG4gICAgaWYgKHRoYXQgPT09IG51bGwpIHtcbiAgICAgIHRoYXQgPSBuZXcgQnVmZmVyKGxlbmd0aClcbiAgICB9XG4gICAgdGhhdC5sZW5ndGggPSBsZW5ndGhcbiAgfVxuXG4gIHJldHVybiB0aGF0XG59XG5cbi8qKlxuICogVGhlIEJ1ZmZlciBjb25zdHJ1Y3RvciByZXR1cm5zIGluc3RhbmNlcyBvZiBgVWludDhBcnJheWAgdGhhdCBoYXZlIHRoZWlyXG4gKiBwcm90b3R5cGUgY2hhbmdlZCB0byBgQnVmZmVyLnByb3RvdHlwZWAuIEZ1cnRoZXJtb3JlLCBgQnVmZmVyYCBpcyBhIHN1YmNsYXNzIG9mXG4gKiBgVWludDhBcnJheWAsIHNvIHRoZSByZXR1cm5lZCBpbnN0YW5jZXMgd2lsbCBoYXZlIGFsbCB0aGUgbm9kZSBgQnVmZmVyYCBtZXRob2RzXG4gKiBhbmQgdGhlIGBVaW50OEFycmF5YCBtZXRob2RzLiBTcXVhcmUgYnJhY2tldCBub3RhdGlvbiB3b3JrcyBhcyBleHBlY3RlZCAtLSBpdFxuICogcmV0dXJucyBhIHNpbmdsZSBvY3RldC5cbiAqXG4gKiBUaGUgYFVpbnQ4QXJyYXlgIHByb3RvdHlwZSByZW1haW5zIHVubW9kaWZpZWQuXG4gKi9cblxuZnVuY3Rpb24gQnVmZmVyIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmICEodGhpcyBpbnN0YW5jZW9mIEJ1ZmZlcikpIHtcbiAgICByZXR1cm4gbmV3IEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIC8vIENvbW1vbiBjYXNlLlxuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nT3JPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZydcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIGFsbG9jVW5zYWZlKHRoaXMsIGFyZylcbiAgfVxuICByZXR1cm4gZnJvbSh0aGlzLCBhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnBvb2xTaXplID0gODE5MiAvLyBub3QgdXNlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uXG5cbi8vIFRPRE86IExlZ2FjeSwgbm90IG5lZWRlZCBhbnltb3JlLiBSZW1vdmUgaW4gbmV4dCBtYWpvciB2ZXJzaW9uLlxuQnVmZmVyLl9hdWdtZW50ID0gZnVuY3Rpb24gKGFycikge1xuICBhcnIuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICByZXR1cm4gYXJyXG59XG5cbmZ1bmN0aW9uIGZyb20gKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZyb21TdHJpbmcodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQpXG4gIH1cblxuICByZXR1cm4gZnJvbU9iamVjdCh0aGF0LCB2YWx1ZSlcbn1cblxuLyoqXG4gKiBGdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBCdWZmZXIoYXJnLCBlbmNvZGluZykgYnV0IHRocm93cyBhIFR5cGVFcnJvclxuICogaWYgdmFsdWUgaXMgYSBudW1iZXIuXG4gKiBCdWZmZXIuZnJvbShzdHJbLCBlbmNvZGluZ10pXG4gKiBCdWZmZXIuZnJvbShhcnJheSlcbiAqIEJ1ZmZlci5mcm9tKGJ1ZmZlcilcbiAqIEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyWywgYnl0ZU9mZnNldFssIGxlbmd0aF1dKVxuICoqL1xuQnVmZmVyLmZyb20gPSBmdW5jdGlvbiAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gZnJvbShudWxsLCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5pZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgQnVmZmVyLnByb3RvdHlwZS5fX3Byb3RvX18gPSBVaW50OEFycmF5LnByb3RvdHlwZVxuICBCdWZmZXIuX19wcm90b19fID0gVWludDhBcnJheVxuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnNwZWNpZXMgJiZcbiAgICAgIEJ1ZmZlcltTeW1ib2wuc3BlY2llc10gPT09IEJ1ZmZlcikge1xuICAgIC8vIEZpeCBzdWJhcnJheSgpIGluIEVTMjAxNi4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9wdWxsLzk3XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlciwgU3ltYm9sLnNwZWNpZXMsIHtcbiAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSlcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRTaXplIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfSBlbHNlIGlmIChzaXplIDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWxsb2MgKHRoYXQsIHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgaWYgKHNpemUgPD0gMCkge1xuICAgIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSlcbiAgfVxuICBpZiAoZmlsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT25seSBwYXkgYXR0ZW50aW9uIHRvIGVuY29kaW5nIGlmIGl0J3MgYSBzdHJpbmcuIFRoaXNcbiAgICAvLyBwcmV2ZW50cyBhY2NpZGVudGFsbHkgc2VuZGluZyBpbiBhIG51bWJlciB0aGF0IHdvdWxkXG4gICAgLy8gYmUgaW50ZXJwcmV0dGVkIGFzIGEgc3RhcnQgb2Zmc2V0LlxuICAgIHJldHVybiB0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnXG4gICAgICA/IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKS5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgICAgOiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSkuZmlsbChmaWxsKVxuICB9XG4gIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSlcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiBhbGxvYyhzaXplWywgZmlsbFssIGVuY29kaW5nXV0pXG4gKiovXG5CdWZmZXIuYWxsb2MgPSBmdW5jdGlvbiAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGFsbG9jKG51bGwsIHNpemUsIGZpbGwsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBhbGxvY1Vuc2FmZSAodGhhdCwgc2l6ZSkge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSA8IDAgPyAwIDogY2hlY2tlZChzaXplKSB8IDApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7ICsraSkge1xuICAgICAgdGhhdFtpXSA9IDBcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIEJ1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufVxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIFNsb3dCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufVxuXG5mdW5jdGlvbiBmcm9tU3RyaW5nICh0aGF0LCBzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnIHx8IGVuY29kaW5nID09PSAnJykge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gIH1cblxuICBpZiAoIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiZW5jb2RpbmdcIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVuY29kaW5nJylcbiAgfVxuXG4gIHZhciBsZW5ndGggPSBieXRlTGVuZ3RoKHN0cmluZywgZW5jb2RpbmcpIHwgMFxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbmd0aClcblxuICB2YXIgYWN0dWFsID0gdGhhdC53cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuXG4gIGlmIChhY3R1YWwgIT09IGxlbmd0aCkge1xuICAgIC8vIFdyaXRpbmcgYSBoZXggc3RyaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMgd2lsbFxuICAgIC8vIGNhdXNlIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGZpcnN0IGludmFsaWQgY2hhcmFjdGVyIHRvIGJlIGlnbm9yZWQuIChlLmcuXG4gICAgLy8gJ2FieHhjZCcgd2lsbCBiZSB0cmVhdGVkIGFzICdhYicpXG4gICAgdGhhdCA9IHRoYXQuc2xpY2UoMCwgYWN0dWFsKVxuICB9XG5cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5TGlrZSAodGhhdCwgYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCA8IDAgPyAwIDogY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMFxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbmd0aClcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIHRoYXRbaV0gPSBhcnJheVtpXSAmIDI1NVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUJ1ZmZlciAodGhhdCwgYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICBhcnJheS5ieXRlTGVuZ3RoIC8vIHRoaXMgdGhyb3dzIGlmIGBhcnJheWAgaXMgbm90IGEgdmFsaWQgQXJyYXlCdWZmZXJcblxuICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXFwnb2Zmc2V0XFwnIGlzIG91dCBvZiBib3VuZHMnKVxuICB9XG5cbiAgaWYgKGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0ICsgKGxlbmd0aCB8fCAwKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcXCdsZW5ndGhcXCcgaXMgb3V0IG9mIGJvdW5kcycpXG4gIH1cblxuICBpZiAoYnl0ZU9mZnNldCA9PT0gdW5kZWZpbmVkICYmIGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSlcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQpXG4gIH0gZWxzZSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IGFycmF5XG4gICAgdGhhdC5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIHRoYXQgPSBmcm9tQXJyYXlMaWtlKHRoYXQsIGFycmF5KVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21PYmplY3QgKHRoYXQsIG9iaikge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKG9iaikpIHtcbiAgICB2YXIgbGVuID0gY2hlY2tlZChvYmoubGVuZ3RoKSB8IDBcbiAgICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbilcblxuICAgIGlmICh0aGF0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoYXRcbiAgICB9XG5cbiAgICBvYmouY29weSh0aGF0LCAwLCAwLCBsZW4pXG4gICAgcmV0dXJuIHRoYXRcbiAgfVxuXG4gIGlmIChvYmopIHtcbiAgICBpZiAoKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgb2JqLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB8fCAnbGVuZ3RoJyBpbiBvYmopIHtcbiAgICAgIGlmICh0eXBlb2Ygb2JqLmxlbmd0aCAhPT0gJ251bWJlcicgfHwgaXNuYW4ob2JqLmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCAwKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2UodGhhdCwgb2JqKVxuICAgIH1cblxuICAgIGlmIChvYmoudHlwZSA9PT0gJ0J1ZmZlcicgJiYgaXNBcnJheShvYmouZGF0YSkpIHtcbiAgICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKHRoYXQsIG9iai5kYXRhKVxuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBhcnJheS1saWtlIG9iamVjdC4nKVxufVxuXG5mdW5jdGlvbiBjaGVja2VkIChsZW5ndGgpIHtcbiAgLy8gTm90ZTogY2Fubm90IHVzZSBgbGVuZ3RoIDwga01heExlbmd0aCgpYCBoZXJlIGJlY2F1c2UgdGhhdCBmYWlscyB3aGVuXG4gIC8vIGxlbmd0aCBpcyBOYU4gKHdoaWNoIGlzIG90aGVyd2lzZSBjb2VyY2VkIHRvIHplcm8uKVxuICBpZiAobGVuZ3RoID49IGtNYXhMZW5ndGgoKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICdzaXplOiAweCcgKyBrTWF4TGVuZ3RoKCkudG9TdHJpbmcoMTYpICsgJyBieXRlcycpXG4gIH1cbiAgcmV0dXJuIGxlbmd0aCB8IDBcbn1cblxuZnVuY3Rpb24gU2xvd0J1ZmZlciAobGVuZ3RoKSB7XG4gIGlmICgrbGVuZ3RoICE9IGxlbmd0aCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcVxuICAgIGxlbmd0aCA9IDBcbiAgfVxuICByZXR1cm4gQnVmZmVyLmFsbG9jKCtsZW5ndGgpXG59XG5cbkJ1ZmZlci5pc0J1ZmZlciA9IGZ1bmN0aW9uIGlzQnVmZmVyIChiKSB7XG4gIHJldHVybiAhIShiICE9IG51bGwgJiYgYi5faXNCdWZmZXIpXG59XG5cbkJ1ZmZlci5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAoYSwgYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihhKSB8fCAhQnVmZmVyLmlzQnVmZmVyKGIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIG11c3QgYmUgQnVmZmVycycpXG4gIH1cblxuICBpZiAoYSA9PT0gYikgcmV0dXJuIDBcblxuICB2YXIgeCA9IGEubGVuZ3RoXG4gIHZhciB5ID0gYi5sZW5ndGhcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gTWF0aC5taW4oeCwgeSk7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICB4ID0gYVtpXVxuICAgICAgeSA9IGJbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG5CdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIGlzRW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gIHN3aXRjaCAoU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgY2FzZSAnYXNjaWknOlxuICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgY2FzZSAnYmluYXJ5JzpcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5CdWZmZXIuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0IChsaXN0LCBsZW5ndGgpIHtcbiAgaWYgKCFpc0FycmF5KGxpc3QpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBCdWZmZXIuYWxsb2MoMClcbiAgfVxuXG4gIHZhciBpXG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGxlbmd0aCA9IDBcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgbGVuZ3RoICs9IGxpc3RbaV0ubGVuZ3RoXG4gICAgfVxuICB9XG5cbiAgdmFyIGJ1ZmZlciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShsZW5ndGgpXG4gIHZhciBwb3MgPSAwXG4gIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGJ1ZiA9IGxpc3RbaV1cbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICAgIH1cbiAgICBidWYuY29weShidWZmZXIsIHBvcylcbiAgICBwb3MgKz0gYnVmLmxlbmd0aFxuICB9XG4gIHJldHVybiBidWZmZXJcbn1cblxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHN0cmluZykpIHtcbiAgICByZXR1cm4gc3RyaW5nLmxlbmd0aFxuICB9XG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgIChBcnJheUJ1ZmZlci5pc1ZpZXcoc3RyaW5nKSB8fCBzdHJpbmcgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpIHtcbiAgICByZXR1cm4gc3RyaW5nLmJ5dGVMZW5ndGhcbiAgfVxuICBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICBzdHJpbmcgPSAnJyArIHN0cmluZ1xuICB9XG5cbiAgdmFyIGxlbiA9IHN0cmluZy5sZW5ndGhcbiAgaWYgKGxlbiA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBVc2UgYSBmb3IgbG9vcCB0byBhdm9pZCByZWN1cnNpb25cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGVuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiBsZW4gKiAyXG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gbGVuID4+PiAxXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGggLy8gYXNzdW1lIHV0ZjhcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cbkJ1ZmZlci5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuXG5mdW5jdGlvbiBzbG93VG9TdHJpbmcgKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG5cbiAgLy8gTm8gbmVlZCB0byB2ZXJpZnkgdGhhdCBcInRoaXMubGVuZ3RoIDw9IE1BWF9VSU5UMzJcIiBzaW5jZSBpdCdzIGEgcmVhZC1vbmx5XG4gIC8vIHByb3BlcnR5IG9mIGEgdHlwZWQgYXJyYXkuXG5cbiAgLy8gVGhpcyBiZWhhdmVzIG5laXRoZXIgbGlrZSBTdHJpbmcgbm9yIFVpbnQ4QXJyYXkgaW4gdGhhdCB3ZSBzZXQgc3RhcnQvZW5kXG4gIC8vIHRvIHRoZWlyIHVwcGVyL2xvd2VyIGJvdW5kcyBpZiB0aGUgdmFsdWUgcGFzc2VkIGlzIG91dCBvZiByYW5nZS5cbiAgLy8gdW5kZWZpbmVkIGlzIGhhbmRsZWQgc3BlY2lhbGx5IGFzIHBlciBFQ01BLTI2MiA2dGggRWRpdGlvbixcbiAgLy8gU2VjdGlvbiAxMy4zLjMuNyBSdW50aW1lIFNlbWFudGljczogS2V5ZWRCaW5kaW5nSW5pdGlhbGl6YXRpb24uXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkIHx8IHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIC8vIFJldHVybiBlYXJseSBpZiBzdGFydCA+IHRoaXMubGVuZ3RoLiBEb25lIGhlcmUgdG8gcHJldmVudCBwb3RlbnRpYWwgdWludDMyXG4gIC8vIGNvZXJjaW9uIGZhaWwgYmVsb3cuXG4gIGlmIChzdGFydCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKGVuZCA8PSAwKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICAvLyBGb3JjZSBjb2Vyc2lvbiB0byB1aW50MzIuIFRoaXMgd2lsbCBhbHNvIGNvZXJjZSBmYWxzZXkvTmFOIHZhbHVlcyB0byAwLlxuICBlbmQgPj4+PSAwXG4gIHN0YXJ0ID4+Pj0gMFxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9IChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG4vLyBUaGUgcHJvcGVydHkgaXMgdXNlZCBieSBgQnVmZmVyLmlzQnVmZmVyYCBhbmQgYGlzLWJ1ZmZlcmAgKGluIFNhZmFyaSA1LTcpIHRvIGRldGVjdFxuLy8gQnVmZmVyIGluc3RhbmNlcy5cbkJ1ZmZlci5wcm90b3R5cGUuX2lzQnVmZmVyID0gdHJ1ZVxuXG5mdW5jdGlvbiBzd2FwIChiLCBuLCBtKSB7XG4gIHZhciBpID0gYltuXVxuICBiW25dID0gYlttXVxuICBiW21dID0gaVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAxNiA9IGZ1bmN0aW9uIHN3YXAxNiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgMiAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gMikge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDEpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMzIgPSBmdW5jdGlvbiBzd2FwMzIgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDQgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAzKVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyAyKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDY0ID0gZnVuY3Rpb24gc3dhcDY0ICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSA4ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA4KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgNylcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgNilcbiAgICBzd2FwKHRoaXMsIGkgKyAyLCBpICsgNSlcbiAgICBzd2FwKHRoaXMsIGkgKyAzLCBpICsgNClcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGggfCAwXG4gIGlmIChsZW5ndGggPT09IDApIHJldHVybiAnJ1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCAwLCBsZW5ndGgpXG4gIHJldHVybiBzbG93VG9TdHJpbmcuYXBwbHkodGhpcywgYXJndW1lbnRzKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyAoYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIGlmICh0aGlzID09PSBiKSByZXR1cm4gdHJ1ZVxuICByZXR1cm4gQnVmZmVyLmNvbXBhcmUodGhpcywgYikgPT09IDBcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCAoKSB7XG4gIHZhciBzdHIgPSAnJ1xuICB2YXIgbWF4ID0gZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFU1xuICBpZiAodGhpcy5sZW5ndGggPiAwKSB7XG4gICAgc3RyID0gdGhpcy50b1N0cmluZygnaGV4JywgMCwgbWF4KS5tYXRjaCgvLnsyfS9nKS5qb2luKCcgJylcbiAgICBpZiAodGhpcy5sZW5ndGggPiBtYXgpIHN0ciArPSAnIC4uLiAnXG4gIH1cbiAgcmV0dXJuICc8QnVmZmVyICcgKyBzdHIgKyAnPidcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAodGFyZ2V0LCBzdGFydCwgZW5kLCB0aGlzU3RhcnQsIHRoaXNFbmQpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGFyZ2V0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICB9XG5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmQgPSB0YXJnZXQgPyB0YXJnZXQubGVuZ3RoIDogMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNTdGFydCA9IDBcbiAgfVxuICBpZiAodGhpc0VuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc0VuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoc3RhcnQgPCAwIHx8IGVuZCA+IHRhcmdldC5sZW5ndGggfHwgdGhpc1N0YXJ0IDwgMCB8fCB0aGlzRW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCAmJiBzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCkge1xuICAgIHJldHVybiAtMVxuICB9XG4gIGlmIChzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMVxuICB9XG5cbiAgc3RhcnQgPj4+PSAwXG4gIGVuZCA+Pj49IDBcbiAgdGhpc1N0YXJ0ID4+Pj0gMFxuICB0aGlzRW5kID4+Pj0gMFxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQpIHJldHVybiAwXG5cbiAgdmFyIHggPSB0aGlzRW5kIC0gdGhpc1N0YXJ0XG4gIHZhciB5ID0gZW5kIC0gc3RhcnRcbiAgdmFyIGxlbiA9IE1hdGgubWluKHgsIHkpXG5cbiAgdmFyIHRoaXNDb3B5ID0gdGhpcy5zbGljZSh0aGlzU3RhcnQsIHRoaXNFbmQpXG4gIHZhciB0YXJnZXRDb3B5ID0gdGFyZ2V0LnNsaWNlKHN0YXJ0LCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgIGlmICh0aGlzQ29weVtpXSAhPT0gdGFyZ2V0Q29weVtpXSkge1xuICAgICAgeCA9IHRoaXNDb3B5W2ldXG4gICAgICB5ID0gdGFyZ2V0Q29weVtpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbi8vIEZpbmRzIGVpdGhlciB0aGUgZmlyc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0ID49IGBieXRlT2Zmc2V0YCxcbi8vIE9SIHRoZSBsYXN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA8PSBgYnl0ZU9mZnNldGAuXG4vL1xuLy8gQXJndW1lbnRzOlxuLy8gLSBidWZmZXIgLSBhIEJ1ZmZlciB0byBzZWFyY2hcbi8vIC0gdmFsIC0gYSBzdHJpbmcsIEJ1ZmZlciwgb3IgbnVtYmVyXG4vLyAtIGJ5dGVPZmZzZXQgLSBhbiBpbmRleCBpbnRvIGBidWZmZXJgOyB3aWxsIGJlIGNsYW1wZWQgdG8gYW4gaW50MzJcbi8vIC0gZW5jb2RpbmcgLSBhbiBvcHRpb25hbCBlbmNvZGluZywgcmVsZXZhbnQgaXMgdmFsIGlzIGEgc3RyaW5nXG4vLyAtIGRpciAtIHRydWUgZm9yIGluZGV4T2YsIGZhbHNlIGZvciBsYXN0SW5kZXhPZlxuZnVuY3Rpb24gYmlkaXJlY3Rpb25hbEluZGV4T2YgKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIC8vIEVtcHR5IGJ1ZmZlciBtZWFucyBubyBtYXRjaFxuICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIC0xXG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXRcbiAgaWYgKHR5cGVvZiBieXRlT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gYnl0ZU9mZnNldFxuICAgIGJ5dGVPZmZzZXQgPSAwXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA+IDB4N2ZmZmZmZmYpIHtcbiAgICBieXRlT2Zmc2V0ID0gMHg3ZmZmZmZmZlxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAtMHg4MDAwMDAwMCkge1xuICAgIGJ5dGVPZmZzZXQgPSAtMHg4MDAwMDAwMFxuICB9XG4gIGJ5dGVPZmZzZXQgPSArYnl0ZU9mZnNldCAgLy8gQ29lcmNlIHRvIE51bWJlci5cbiAgaWYgKGlzTmFOKGJ5dGVPZmZzZXQpKSB7XG4gICAgLy8gYnl0ZU9mZnNldDogaXQgaXQncyB1bmRlZmluZWQsIG51bGwsIE5hTiwgXCJmb29cIiwgZXRjLCBzZWFyY2ggd2hvbGUgYnVmZmVyXG4gICAgYnl0ZU9mZnNldCA9IGRpciA/IDAgOiAoYnVmZmVyLmxlbmd0aCAtIDEpXG4gIH1cblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldDogbmVnYXRpdmUgb2Zmc2V0cyBzdGFydCBmcm9tIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlclxuICBpZiAoYnl0ZU9mZnNldCA8IDApIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoICsgYnl0ZU9mZnNldFxuICBpZiAoYnl0ZU9mZnNldCA+PSBidWZmZXIubGVuZ3RoKSB7XG4gICAgaWYgKGRpcikgcmV0dXJuIC0xXG4gICAgZWxzZSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCAtIDFcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgMCkge1xuICAgIGlmIChkaXIpIGJ5dGVPZmZzZXQgPSAwXG4gICAgZWxzZSByZXR1cm4gLTFcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSB2YWxcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFsID0gQnVmZmVyLmZyb20odmFsLCBlbmNvZGluZylcbiAgfVxuXG4gIC8vIEZpbmFsbHksIHNlYXJjaCBlaXRoZXIgaW5kZXhPZiAoaWYgZGlyIGlzIHRydWUpIG9yIGxhc3RJbmRleE9mXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsKSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogbG9va2luZyBmb3IgZW1wdHkgc3RyaW5nL2J1ZmZlciBhbHdheXMgZmFpbHNcbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAweEZGIC8vIFNlYXJjaCBmb3IgYSBieXRlIHZhbHVlIFswLTI1NV1cbiAgICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiZcbiAgICAgICAgdHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmIChkaXIpIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgWyB2YWwgXSwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlcicpXG59XG5cbmZ1bmN0aW9uIGFycmF5SW5kZXhPZiAoYXJyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgdmFyIGluZGV4U2l6ZSA9IDFcbiAgdmFyIGFyckxlbmd0aCA9IGFyci5sZW5ndGhcbiAgdmFyIHZhbExlbmd0aCA9IHZhbC5sZW5ndGhcblxuICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgaWYgKGVuY29kaW5nID09PSAndWNzMicgfHwgZW5jb2RpbmcgPT09ICd1Y3MtMicgfHxcbiAgICAgICAgZW5jb2RpbmcgPT09ICd1dGYxNmxlJyB8fCBlbmNvZGluZyA9PT0gJ3V0Zi0xNmxlJykge1xuICAgICAgaWYgKGFyci5sZW5ndGggPCAyIHx8IHZhbC5sZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiAtMVxuICAgICAgfVxuICAgICAgaW5kZXhTaXplID0gMlxuICAgICAgYXJyTGVuZ3RoIC89IDJcbiAgICAgIHZhbExlbmd0aCAvPSAyXG4gICAgICBieXRlT2Zmc2V0IC89IDJcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWFkIChidWYsIGkpIHtcbiAgICBpZiAoaW5kZXhTaXplID09PSAxKSB7XG4gICAgICByZXR1cm4gYnVmW2ldXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBidWYucmVhZFVJbnQxNkJFKGkgKiBpbmRleFNpemUpXG4gICAgfVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGRpcikge1xuICAgIHZhciBmb3VuZEluZGV4ID0gLTFcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpIDwgYXJyTGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChyZWFkKGFyciwgaSkgPT09IHJlYWQodmFsLCBmb3VuZEluZGV4ID09PSAtMSA/IDAgOiBpIC0gZm91bmRJbmRleCkpIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggPT09IC0xKSBmb3VuZEluZGV4ID0gaVxuICAgICAgICBpZiAoaSAtIGZvdW5kSW5kZXggKyAxID09PSB2YWxMZW5ndGgpIHJldHVybiBmb3VuZEluZGV4ICogaW5kZXhTaXplXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZm91bmRJbmRleCAhPT0gLTEpIGkgLT0gaSAtIGZvdW5kSW5kZXhcbiAgICAgICAgZm91bmRJbmRleCA9IC0xXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChieXRlT2Zmc2V0ICsgdmFsTGVuZ3RoID4gYXJyTGVuZ3RoKSBieXRlT2Zmc2V0ID0gYXJyTGVuZ3RoIC0gdmFsTGVuZ3RoXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBmb3VuZCA9IHRydWVcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdmFsTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKHJlYWQoYXJyLCBpICsgaikgIT09IHJlYWQodmFsLCBqKSkge1xuICAgICAgICAgIGZvdW5kID0gZmFsc2VcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZm91bmQpIHJldHVybiBpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gdGhpcy5pbmRleE9mKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpICE9PSAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCB0cnVlKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmxhc3RJbmRleE9mID0gZnVuY3Rpb24gbGFzdEluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGZhbHNlKVxufVxuXG5mdW5jdGlvbiBoZXhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIG9mZnNldCA9IE51bWJlcihvZmZzZXQpIHx8IDBcbiAgdmFyIHJlbWFpbmluZyA9IGJ1Zi5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKVxuICAgIGlmIChsZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICAgIH1cbiAgfVxuXG4gIC8vIG11c3QgYmUgYW4gZXZlbiBudW1iZXIgb2YgZGlnaXRzXG4gIHZhciBzdHJMZW4gPSBzdHJpbmcubGVuZ3RoXG4gIGlmIChzdHJMZW4gJSAyICE9PSAwKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGhleCBzdHJpbmcnKVxuXG4gIGlmIChsZW5ndGggPiBzdHJMZW4gLyAyKSB7XG4gICAgbGVuZ3RoID0gc3RyTGVuIC8gMlxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgcGFyc2VkID0gcGFyc2VJbnQoc3RyaW5nLnN1YnN0cihpICogMiwgMiksIDE2KVxuICAgIGlmIChpc05hTihwYXJzZWQpKSByZXR1cm4gaVxuICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHBhcnNlZFxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIHV0ZjhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjhUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGFzY2lpV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihhc2NpaVRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gbGF0aW4xV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYXNjaWlXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGJhc2U2NFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYmFzZTY0VG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiB1Y3MyV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGYxNmxlVG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gd3JpdGUgKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKSB7XG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcpXG4gIGlmIChvZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBvZmZzZXRcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgb2Zmc2V0WywgbGVuZ3RoXVssIGVuY29kaW5nXSlcbiAgfSBlbHNlIGlmIChpc0Zpbml0ZShvZmZzZXQpKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICAgIGlmIChpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICBsZW5ndGggPSBsZW5ndGggfCAwXG4gICAgICBpZiAoZW5jb2RpbmcgPT09IHVuZGVmaW5lZCkgZW5jb2RpbmcgPSAndXRmOCdcbiAgICB9IGVsc2Uge1xuICAgICAgZW5jb2RpbmcgPSBsZW5ndGhcbiAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZFxuICAgIH1cbiAgLy8gbGVnYWN5IHdyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldCwgbGVuZ3RoKSAtIHJlbW92ZSBpbiB2MC4xM1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCdcbiAgICApXG4gIH1cblxuICB2YXIgcmVtYWluaW5nID0gdGhpcy5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IGxlbmd0aCA+IHJlbWFpbmluZykgbGVuZ3RoID0gcmVtYWluaW5nXG5cbiAgaWYgKChzdHJpbmcubGVuZ3RoID4gMCAmJiAobGVuZ3RoIDwgMCB8fCBvZmZzZXQgPCAwKSkgfHwgb2Zmc2V0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsYXRpbjFXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICAvLyBXYXJuaW5nOiBtYXhMZW5ndGggbm90IHRha2VuIGludG8gYWNjb3VudCBpbiBiYXNlNjRXcml0ZVxuICAgICAgICByZXR1cm4gYmFzZTY0V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHVjczJXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04gKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdCdWZmZXInLFxuICAgIGRhdGE6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2FyciB8fCB0aGlzLCAwKVxuICB9XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKHN0YXJ0ID09PSAwICYmIGVuZCA9PT0gYnVmLmxlbmd0aCkge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1Zi5zbGljZShzdGFydCwgZW5kKSlcbiAgfVxufVxuXG5mdW5jdGlvbiB1dGY4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG4gIHZhciByZXMgPSBbXVxuXG4gIHZhciBpID0gc3RhcnRcbiAgd2hpbGUgKGkgPCBlbmQpIHtcbiAgICB2YXIgZmlyc3RCeXRlID0gYnVmW2ldXG4gICAgdmFyIGNvZGVQb2ludCA9IG51bGxcbiAgICB2YXIgYnl0ZXNQZXJTZXF1ZW5jZSA9IChmaXJzdEJ5dGUgPiAweEVGKSA/IDRcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4REYpID8gM1xuICAgICAgOiAoZmlyc3RCeXRlID4gMHhCRikgPyAyXG4gICAgICA6IDFcblxuICAgIGlmIChpICsgYnl0ZXNQZXJTZXF1ZW5jZSA8PSBlbmQpIHtcbiAgICAgIHZhciBzZWNvbmRCeXRlLCB0aGlyZEJ5dGUsIGZvdXJ0aEJ5dGUsIHRlbXBDb2RlUG9pbnRcblxuICAgICAgc3dpdGNoIChieXRlc1BlclNlcXVlbmNlKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBpZiAoZmlyc3RCeXRlIDwgMHg4MCkge1xuICAgICAgICAgICAgY29kZVBvaW50ID0gZmlyc3RCeXRlXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4MUYpIDw8IDB4NiB8IChzZWNvbmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3Rikge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweEMgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4NiB8ICh0aGlyZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGRiAmJiAodGVtcENvZGVQb2ludCA8IDB4RDgwMCB8fCB0ZW1wQ29kZVBvaW50ID4gMHhERkZGKSkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBmb3VydGhCeXRlID0gYnVmW2kgKyAzXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAoZm91cnRoQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHgxMiB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHhDIHwgKHRoaXJkQnl0ZSAmIDB4M0YpIDw8IDB4NiB8IChmb3VydGhCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHhGRkZGICYmIHRlbXBDb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb2RlUG9pbnQgPT09IG51bGwpIHtcbiAgICAgIC8vIHdlIGRpZCBub3QgZ2VuZXJhdGUgYSB2YWxpZCBjb2RlUG9pbnQgc28gaW5zZXJ0IGFcbiAgICAgIC8vIHJlcGxhY2VtZW50IGNoYXIgKFUrRkZGRCkgYW5kIGFkdmFuY2Ugb25seSAxIGJ5dGVcbiAgICAgIGNvZGVQb2ludCA9IDB4RkZGRFxuICAgICAgYnl0ZXNQZXJTZXF1ZW5jZSA9IDFcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA+IDB4RkZGRikge1xuICAgICAgLy8gZW5jb2RlIHRvIHV0ZjE2IChzdXJyb2dhdGUgcGFpciBkYW5jZSlcbiAgICAgIGNvZGVQb2ludCAtPSAweDEwMDAwXG4gICAgICByZXMucHVzaChjb2RlUG9pbnQgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApXG4gICAgICBjb2RlUG9pbnQgPSAweERDMDAgfCBjb2RlUG9pbnQgJiAweDNGRlxuICAgIH1cblxuICAgIHJlcy5wdXNoKGNvZGVQb2ludClcbiAgICBpICs9IGJ5dGVzUGVyU2VxdWVuY2VcbiAgfVxuXG4gIHJldHVybiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkocmVzKVxufVxuXG4vLyBCYXNlZCBvbiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMjc0NzI3Mi82ODA3NDIsIHRoZSBicm93c2VyIHdpdGhcbi8vIHRoZSBsb3dlc3QgbGltaXQgaXMgQ2hyb21lLCB3aXRoIDB4MTAwMDAgYXJncy5cbi8vIFdlIGdvIDEgbWFnbml0dWRlIGxlc3MsIGZvciBzYWZldHlcbnZhciBNQVhfQVJHVU1FTlRTX0xFTkdUSCA9IDB4MTAwMFxuXG5mdW5jdGlvbiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkgKGNvZGVQb2ludHMpIHtcbiAgdmFyIGxlbiA9IGNvZGVQb2ludHMubGVuZ3RoXG4gIGlmIChsZW4gPD0gTUFYX0FSR1VNRU5UU19MRU5HVEgpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGNvZGVQb2ludHMpIC8vIGF2b2lkIGV4dHJhIHNsaWNlKClcbiAgfVxuXG4gIC8vIERlY29kZSBpbiBjaHVua3MgdG8gYXZvaWQgXCJjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIi5cbiAgdmFyIHJlcyA9ICcnXG4gIHZhciBpID0gMFxuICB3aGlsZSAoaSA8IGxlbikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFxuICAgICAgU3RyaW5nLFxuICAgICAgY29kZVBvaW50cy5zbGljZShpLCBpICs9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKVxuICAgIClcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldICYgMHg3RilcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGxhdGluMVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGhleFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGhcblxuICBpZiAoIXN0YXJ0IHx8IHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIGlmICghZW5kIHx8IGVuZCA8IDAgfHwgZW5kID4gbGVuKSBlbmQgPSBsZW5cblxuICB2YXIgb3V0ID0gJydcbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICBvdXQgKz0gdG9IZXgoYnVmW2ldKVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGJ5dGVzID0gYnVmLnNsaWNlKHN0YXJ0LCBlbmQpXG4gIHZhciByZXMgPSAnJ1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0gKyBieXRlc1tpICsgMV0gKiAyNTYpXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIHN0YXJ0ID0gfn5zdGFydFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IH5+ZW5kXG5cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ICs9IGxlblxuICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMFxuICB9IGVsc2UgaWYgKHN0YXJ0ID4gbGVuKSB7XG4gICAgc3RhcnQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCAwKSB7XG4gICAgZW5kICs9IGxlblxuICAgIGlmIChlbmQgPCAwKSBlbmQgPSAwXG4gIH0gZWxzZSBpZiAoZW5kID4gbGVuKSB7XG4gICAgZW5kID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgdmFyIG5ld0J1ZlxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBuZXdCdWYgPSB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpXG4gICAgbmV3QnVmLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICB2YXIgc2xpY2VMZW4gPSBlbmQgLSBzdGFydFxuICAgIG5ld0J1ZiA9IG5ldyBCdWZmZXIoc2xpY2VMZW4sIHVuZGVmaW5lZClcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWNlTGVuOyArK2kpIHtcbiAgICAgIG5ld0J1ZltpXSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdCdWZcbn1cblxuLypcbiAqIE5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYnVmZmVyIGlzbid0IHRyeWluZyB0byB3cml0ZSBvdXQgb2YgYm91bmRzLlxuICovXG5mdW5jdGlvbiBjaGVja09mZnNldCAob2Zmc2V0LCBleHQsIGxlbmd0aCkge1xuICBpZiAoKG9mZnNldCAlIDEpICE9PSAwIHx8IG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdvZmZzZXQgaXMgbm90IHVpbnQnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gbGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRMRSA9IGZ1bmN0aW9uIHJlYWRVSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRCRSA9IGZ1bmN0aW9uIHJlYWRVSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG4gIH1cblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdXG4gIHZhciBtdWwgPSAxXG4gIHdoaWxlIChieXRlTGVuZ3RoID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDggPSBmdW5jdGlvbiByZWFkVUludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2QkUgPSBmdW5jdGlvbiByZWFkVUludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgOCkgfCB0aGlzW29mZnNldCArIDFdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkxFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICgodGhpc1tvZmZzZXRdKSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikpICtcbiAgICAgICh0aGlzW29mZnNldCArIDNdICogMHgxMDAwMDAwKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdICogMHgxMDAwMDAwKSArXG4gICAgKCh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgIHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludExFID0gZnVuY3Rpb24gcmVhZEludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludEJFID0gZnVuY3Rpb24gcmVhZEludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoXG4gIHZhciBtdWwgPSAxXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0taV1cbiAgd2hpbGUgKGkgPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1pXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDggPSBmdW5jdGlvbiByZWFkSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICBpZiAoISh0aGlzW29mZnNldF0gJiAweDgwKSkgcmV0dXJuICh0aGlzW29mZnNldF0pXG4gIHJldHVybiAoKDB4ZmYgLSB0aGlzW29mZnNldF0gKyAxKSAqIC0xKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkxFID0gZnVuY3Rpb24gcmVhZEludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIDFdIHwgKHRoaXNbb2Zmc2V0XSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyTEUgPSBmdW5jdGlvbiByZWFkSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdKSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10gPDwgMjQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyQkUgPSBmdW5jdGlvbiByZWFkSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDI0KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0TEUgPSBmdW5jdGlvbiByZWFkRmxvYXRMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0QkUgPSBmdW5jdGlvbiByZWFkRmxvYXRCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVMRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgNTIsIDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUJFID0gZnVuY3Rpb24gcmVhZERvdWJsZUJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgNTIsIDgpXG59XG5cbmZ1bmN0aW9uIGNoZWNrSW50IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJidWZmZXJcIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJylcbiAgaWYgKHZhbHVlID4gbWF4IHx8IHZhbHVlIDwgbWluKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50OCA9IGZ1bmN0aW9uIHdyaXRlVUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHhmZiwgMClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQxNiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmYgKyB2YWx1ZSArIDFcbiAgZm9yICh2YXIgaSA9IDAsIGogPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gb2Zmc2V0LCAyKTsgaSA8IGo7ICsraSkge1xuICAgIGJ1ZltvZmZzZXQgKyBpXSA9ICh2YWx1ZSAmICgweGZmIDw8ICg4ICogKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkpKSkgPj4+XG4gICAgICAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSAqIDhcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQzMiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgNCk7IGkgPCBqOyArK2kpIHtcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSAodmFsdWUgPj4+IChsaXR0bGVFbmRpYW4gPyBpIDogMyAtIGkpICogOCkgJiAweGZmXG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50TEUgPSBmdW5jdGlvbiB3cml0ZUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gMFxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgLSAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50QkUgPSBmdW5jdGlvbiB3cml0ZUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IDBcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgKyAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50OCA9IGZ1bmN0aW9uIHdyaXRlSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweDdmLCAtMHg4MClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmYgKyB2YWx1ZSArIDFcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuZnVuY3Rpb24gY2hlY2tJRUVFNzU0IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxuICBpZiAob2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRmxvYXQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgNCwgMy40MDI4MjM0NjYzODUyODg2ZSszOCwgLTMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgMjMsIDQpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdExFID0gZnVuY3Rpb24gd3JpdGVGbG9hdExFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0QkUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuZnVuY3Rpb24gd3JpdGVEb3VibGUgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgOCwgMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgsIC0xLjc5NzY5MzEzNDg2MjMxNTdFKzMwOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCA1MiwgOClcbiAgcmV0dXJuIG9mZnNldCArIDhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUxFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlQkUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG4vLyBjb3B5KHRhcmdldEJ1ZmZlciwgdGFyZ2V0U3RhcnQ9MCwgc291cmNlU3RhcnQ9MCwgc291cmNlRW5kPWJ1ZmZlci5sZW5ndGgpXG5CdWZmZXIucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5ICh0YXJnZXQsIHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKSB7XG4gIGlmICghc3RhcnQpIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCAmJiBlbmQgIT09IDApIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXRTdGFydCA+PSB0YXJnZXQubGVuZ3RoKSB0YXJnZXRTdGFydCA9IHRhcmdldC5sZW5ndGhcbiAgaWYgKCF0YXJnZXRTdGFydCkgdGFyZ2V0U3RhcnQgPSAwXG4gIGlmIChlbmQgPiAwICYmIGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIC8vIENvcHkgMCBieXRlczsgd2UncmUgZG9uZVxuICBpZiAoZW5kID09PSBzdGFydCkgcmV0dXJuIDBcbiAgaWYgKHRhcmdldC5sZW5ndGggPT09IDAgfHwgdGhpcy5sZW5ndGggPT09IDApIHJldHVybiAwXG5cbiAgLy8gRmF0YWwgZXJyb3IgY29uZGl0aW9uc1xuICBpZiAodGFyZ2V0U3RhcnQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3RhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICB9XG4gIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgaWYgKGVuZCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcycpXG5cbiAgLy8gQXJlIHdlIG9vYj9cbiAgaWYgKGVuZCA+IHRoaXMubGVuZ3RoKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0IDwgZW5kIC0gc3RhcnQpIHtcbiAgICBlbmQgPSB0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgKyBzdGFydFxuICB9XG5cbiAgdmFyIGxlbiA9IGVuZCAtIHN0YXJ0XG4gIHZhciBpXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCAmJiBzdGFydCA8IHRhcmdldFN0YXJ0ICYmIHRhcmdldFN0YXJ0IDwgZW5kKSB7XG4gICAgLy8gZGVzY2VuZGluZyBjb3B5IGZyb20gZW5kXG4gICAgZm9yIChpID0gbGVuIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2UgaWYgKGxlbiA8IDEwMDAgfHwgIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gYXNjZW5kaW5nIGNvcHkgZnJvbSBzdGFydFxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoXG4gICAgICB0YXJnZXQsXG4gICAgICB0aGlzLnN1YmFycmF5KHN0YXJ0LCBzdGFydCArIGxlbiksXG4gICAgICB0YXJnZXRTdGFydFxuICAgIClcbiAgfVxuXG4gIHJldHVybiBsZW5cbn1cblxuLy8gVXNhZ2U6XG4vLyAgICBidWZmZXIuZmlsbChudW1iZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKGJ1ZmZlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoc3RyaW5nWywgb2Zmc2V0WywgZW5kXV1bLCBlbmNvZGluZ10pXG5CdWZmZXIucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbiBmaWxsICh2YWwsIHN0YXJ0LCBlbmQsIGVuY29kaW5nKSB7XG4gIC8vIEhhbmRsZSBzdHJpbmcgY2FzZXM6XG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIGlmICh0eXBlb2Ygc3RhcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IHN0YXJ0XG4gICAgICBzdGFydCA9IDBcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZW5kID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBlbmRcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfVxuICAgIGlmICh2YWwubGVuZ3RoID09PSAxKSB7XG4gICAgICB2YXIgY29kZSA9IHZhbC5jaGFyQ29kZUF0KDApXG4gICAgICBpZiAoY29kZSA8IDI1Nikge1xuICAgICAgICB2YWwgPSBjb2RlXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2VuY29kaW5nIG11c3QgYmUgYSBzdHJpbmcnKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJyAmJiAhQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMjU1XG4gIH1cblxuICAvLyBJbnZhbGlkIHJhbmdlcyBhcmUgbm90IHNldCB0byBhIGRlZmF1bHQsIHNvIGNhbiByYW5nZSBjaGVjayBlYXJseS5cbiAgaWYgKHN0YXJ0IDwgMCB8fCB0aGlzLmxlbmd0aCA8IHN0YXJ0IHx8IHRoaXMubGVuZ3RoIDwgZW5kKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ091dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHN0YXJ0ID0gc3RhcnQgPj4+IDBcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyB0aGlzLmxlbmd0aCA6IGVuZCA+Pj4gMFxuXG4gIGlmICghdmFsKSB2YWwgPSAwXG5cbiAgdmFyIGlcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgdGhpc1tpXSA9IHZhbFxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgYnl0ZXMgPSBCdWZmZXIuaXNCdWZmZXIodmFsKVxuICAgICAgPyB2YWxcbiAgICAgIDogdXRmOFRvQnl0ZXMobmV3IEJ1ZmZlcih2YWwsIGVuY29kaW5nKS50b1N0cmluZygpKVxuICAgIHZhciBsZW4gPSBieXRlcy5sZW5ndGhcbiAgICBmb3IgKGkgPSAwOyBpIDwgZW5kIC0gc3RhcnQ7ICsraSkge1xuICAgICAgdGhpc1tpICsgc3RhcnRdID0gYnl0ZXNbaSAlIGxlbl1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpc1xufVxuXG4vLyBIRUxQRVIgRlVOQ1RJT05TXG4vLyA9PT09PT09PT09PT09PT09XG5cbnZhciBJTlZBTElEX0JBU0U2NF9SRSA9IC9bXitcXC8wLTlBLVphLXotX10vZ1xuXG5mdW5jdGlvbiBiYXNlNjRjbGVhbiAoc3RyKSB7XG4gIC8vIE5vZGUgc3RyaXBzIG91dCBpbnZhbGlkIGNoYXJhY3RlcnMgbGlrZSBcXG4gYW5kIFxcdCBmcm9tIHRoZSBzdHJpbmcsIGJhc2U2NC1qcyBkb2VzIG5vdFxuICBzdHIgPSBzdHJpbmd0cmltKHN0cikucmVwbGFjZShJTlZBTElEX0JBU0U2NF9SRSwgJycpXG4gIC8vIE5vZGUgY29udmVydHMgc3RyaW5ncyB3aXRoIGxlbmd0aCA8IDIgdG8gJydcbiAgaWYgKHN0ci5sZW5ndGggPCAyKSByZXR1cm4gJydcbiAgLy8gTm9kZSBhbGxvd3MgZm9yIG5vbi1wYWRkZWQgYmFzZTY0IHN0cmluZ3MgKG1pc3NpbmcgdHJhaWxpbmcgPT09KSwgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHdoaWxlIChzdHIubGVuZ3RoICUgNCAhPT0gMCkge1xuICAgIHN0ciA9IHN0ciArICc9J1xuICB9XG4gIHJldHVybiBzdHJcbn1cblxuZnVuY3Rpb24gc3RyaW5ndHJpbSAoc3RyKSB7XG4gIGlmIChzdHIudHJpbSkgcmV0dXJuIHN0ci50cmltKClcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJylcbn1cblxuZnVuY3Rpb24gdG9IZXggKG4pIHtcbiAgaWYgKG4gPCAxNikgcmV0dXJuICcwJyArIG4udG9TdHJpbmcoMTYpXG4gIHJldHVybiBuLnRvU3RyaW5nKDE2KVxufVxuXG5mdW5jdGlvbiB1dGY4VG9CeXRlcyAoc3RyaW5nLCB1bml0cykge1xuICB1bml0cyA9IHVuaXRzIHx8IEluZmluaXR5XG4gIHZhciBjb2RlUG9pbnRcbiAgdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGhcbiAgdmFyIGxlYWRTdXJyb2dhdGUgPSBudWxsXG4gIHZhciBieXRlcyA9IFtdXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGNvZGVQb2ludCA9IHN0cmluZy5jaGFyQ29kZUF0KGkpXG5cbiAgICAvLyBpcyBzdXJyb2dhdGUgY29tcG9uZW50XG4gICAgaWYgKGNvZGVQb2ludCA+IDB4RDdGRiAmJiBjb2RlUG9pbnQgPCAweEUwMDApIHtcbiAgICAgIC8vIGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoIWxlYWRTdXJyb2dhdGUpIHtcbiAgICAgICAgLy8gbm8gbGVhZCB5ZXRcbiAgICAgICAgaWYgKGNvZGVQb2ludCA+IDB4REJGRikge1xuICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgdHJhaWxcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9IGVsc2UgaWYgKGkgKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICAvLyB1bnBhaXJlZCBsZWFkXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHZhbGlkIGxlYWRcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIDIgbGVhZHMgaW4gYSByb3dcbiAgICAgIGlmIChjb2RlUG9pbnQgPCAweERDMDApIHtcbiAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gdmFsaWQgc3Vycm9nYXRlIHBhaXJcbiAgICAgIGNvZGVQb2ludCA9IChsZWFkU3Vycm9nYXRlIC0gMHhEODAwIDw8IDEwIHwgY29kZVBvaW50IC0gMHhEQzAwKSArIDB4MTAwMDBcbiAgICB9IGVsc2UgaWYgKGxlYWRTdXJyb2dhdGUpIHtcbiAgICAgIC8vIHZhbGlkIGJtcCBjaGFyLCBidXQgbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgIH1cblxuICAgIGxlYWRTdXJyb2dhdGUgPSBudWxsXG5cbiAgICAvLyBlbmNvZGUgdXRmOFxuICAgIGlmIChjb2RlUG9pbnQgPCAweDgwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDEpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goY29kZVBvaW50KVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHg4MDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiB8IDB4QzAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDMpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgfCAweEUwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSA0KSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHgxMiB8IDB4RjAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29kZSBwb2ludCcpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpVG9CeXRlcyAoc3RyKSB7XG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIC8vIE5vZGUncyBjb2RlIHNlZW1zIHRvIGJlIGRvaW5nIHRoaXMgYW5kIG5vdCAmIDB4N0YuLlxuICAgIGJ5dGVBcnJheS5wdXNoKHN0ci5jaGFyQ29kZUF0KGkpICYgMHhGRilcbiAgfVxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVUb0J5dGVzIChzdHIsIHVuaXRzKSB7XG4gIHZhciBjLCBoaSwgbG9cbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG5cbiAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSlcbiAgICBoaSA9IGMgPj4gOFxuICAgIGxvID0gYyAlIDI1NlxuICAgIGJ5dGVBcnJheS5wdXNoKGxvKVxuICAgIGJ5dGVBcnJheS5wdXNoKGhpKVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiBiYXNlNjRUb0J5dGVzIChzdHIpIHtcbiAgcmV0dXJuIGJhc2U2NC50b0J5dGVBcnJheShiYXNlNjRjbGVhbihzdHIpKVxufVxuXG5mdW5jdGlvbiBibGl0QnVmZmVyIChzcmMsIGRzdCwgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGlmICgoaSArIG9mZnNldCA+PSBkc3QubGVuZ3RoKSB8fCAoaSA+PSBzcmMubGVuZ3RoKSkgYnJlYWtcbiAgICBkc3RbaSArIG9mZnNldF0gPSBzcmNbaV1cbiAgfVxuICByZXR1cm4gaVxufVxuXG5mdW5jdGlvbiBpc25hbiAodmFsKSB7XG4gIHJldHVybiB2YWwgIT09IHZhbCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxufVxuIiwiLyohIGllZWU3NTQuIEJTRC0zLUNsYXVzZSBMaWNlbnNlLiBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmcvb3BlbnNvdXJjZT4gKi9cbmV4cG9ydHMucmVhZCA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtXG4gIHZhciBlTGVuID0gKG5CeXRlcyAqIDgpIC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBuQml0cyA9IC03XG4gIHZhciBpID0gaXNMRSA/IChuQnl0ZXMgLSAxKSA6IDBcbiAgdmFyIGQgPSBpc0xFID8gLTEgOiAxXG4gIHZhciBzID0gYnVmZmVyW29mZnNldCArIGldXG5cbiAgaSArPSBkXG5cbiAgZSA9IHMgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgcyA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gZUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBlID0gKGUgKiAyNTYpICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgbSA9IGUgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgZSA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gbUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gKG0gKiAyNTYpICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgaWYgKGUgPT09IDApIHtcbiAgICBlID0gMSAtIGVCaWFzXG4gIH0gZWxzZSBpZiAoZSA9PT0gZU1heCkge1xuICAgIHJldHVybiBtID8gTmFOIDogKChzID8gLTEgOiAxKSAqIEluZmluaXR5KVxuICB9IGVsc2Uge1xuICAgIG0gPSBtICsgTWF0aC5wb3coMiwgbUxlbilcbiAgICBlID0gZSAtIGVCaWFzXG4gIH1cbiAgcmV0dXJuIChzID8gLTEgOiAxKSAqIG0gKiBNYXRoLnBvdygyLCBlIC0gbUxlbilcbn1cblxuZXhwb3J0cy53cml0ZSA9IGZ1bmN0aW9uIChidWZmZXIsIHZhbHVlLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbSwgY1xuICB2YXIgZUxlbiA9IChuQnl0ZXMgKiA4KSAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgcnQgPSAobUxlbiA9PT0gMjMgPyBNYXRoLnBvdygyLCAtMjQpIC0gTWF0aC5wb3coMiwgLTc3KSA6IDApXG4gIHZhciBpID0gaXNMRSA/IDAgOiAobkJ5dGVzIC0gMSlcbiAgdmFyIGQgPSBpc0xFID8gMSA6IC0xXG4gIHZhciBzID0gdmFsdWUgPCAwIHx8ICh2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPCAwKSA/IDEgOiAwXG5cbiAgdmFsdWUgPSBNYXRoLmFicyh2YWx1ZSlcblxuICBpZiAoaXNOYU4odmFsdWUpIHx8IHZhbHVlID09PSBJbmZpbml0eSkge1xuICAgIG0gPSBpc05hTih2YWx1ZSkgPyAxIDogMFxuICAgIGUgPSBlTWF4XG4gIH0gZWxzZSB7XG4gICAgZSA9IE1hdGguZmxvb3IoTWF0aC5sb2codmFsdWUpIC8gTWF0aC5MTjIpXG4gICAgaWYgKHZhbHVlICogKGMgPSBNYXRoLnBvdygyLCAtZSkpIDwgMSkge1xuICAgICAgZS0tXG4gICAgICBjICo9IDJcbiAgICB9XG4gICAgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICB2YWx1ZSArPSBydCAvIGNcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgKz0gcnQgKiBNYXRoLnBvdygyLCAxIC0gZUJpYXMpXG4gICAgfVxuICAgIGlmICh2YWx1ZSAqIGMgPj0gMikge1xuICAgICAgZSsrXG4gICAgICBjIC89IDJcbiAgICB9XG5cbiAgICBpZiAoZSArIGVCaWFzID49IGVNYXgpIHtcbiAgICAgIG0gPSAwXG4gICAgICBlID0gZU1heFxuICAgIH0gZWxzZSBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIG0gPSAoKHZhbHVlICogYykgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gZSArIGVCaWFzXG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIE1hdGgucG93KDIsIGVCaWFzIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IDBcbiAgICB9XG4gIH1cblxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBtICYgMHhmZiwgaSArPSBkLCBtIC89IDI1NiwgbUxlbiAtPSA4KSB7fVxuXG4gIGUgPSAoZSA8PCBtTGVuKSB8IG1cbiAgZUxlbiArPSBtTGVuXG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjhcbn1cbiIsInZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKGFycikge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChhcnIpID09ICdbb2JqZWN0IEFycmF5XSc7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBMb25nO1xyXG5cclxuLyoqXHJcbiAqIHdhc20gb3B0aW1pemF0aW9ucywgdG8gZG8gbmF0aXZlIGk2NCBtdWx0aXBsaWNhdGlvbiBhbmQgZGl2aWRlXHJcbiAqL1xyXG52YXIgd2FzbSA9IG51bGw7XHJcblxyXG50cnkge1xyXG4gIHdhc20gPSBuZXcgV2ViQXNzZW1ibHkuSW5zdGFuY2UobmV3IFdlYkFzc2VtYmx5Lk1vZHVsZShuZXcgVWludDhBcnJheShbXHJcbiAgICAwLCA5NywgMTE1LCAxMDksIDEsIDAsIDAsIDAsIDEsIDEzLCAyLCA5NiwgMCwgMSwgMTI3LCA5NiwgNCwgMTI3LCAxMjcsIDEyNywgMTI3LCAxLCAxMjcsIDMsIDcsIDYsIDAsIDEsIDEsIDEsIDEsIDEsIDYsIDYsIDEsIDEyNywgMSwgNjUsIDAsIDExLCA3LCA1MCwgNiwgMywgMTA5LCAxMTcsIDEwOCwgMCwgMSwgNSwgMTAwLCAxMDUsIDExOCwgOTUsIDExNSwgMCwgMiwgNSwgMTAwLCAxMDUsIDExOCwgOTUsIDExNywgMCwgMywgNSwgMTE0LCAxMDEsIDEwOSwgOTUsIDExNSwgMCwgNCwgNSwgMTE0LCAxMDEsIDEwOSwgOTUsIDExNywgMCwgNSwgOCwgMTAzLCAxMDEsIDExNiwgOTUsIDEwNCwgMTA1LCAxMDMsIDEwNCwgMCwgMCwgMTAsIDE5MSwgMSwgNiwgNCwgMCwgMzUsIDAsIDExLCAzNiwgMSwgMSwgMTI2LCAzMiwgMCwgMTczLCAzMiwgMSwgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAzMiwgMiwgMTczLCAzMiwgMywgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAxMjYsIDM0LCA0LCA2NiwgMzIsIDEzNSwgMTY3LCAzNiwgMCwgMzIsIDQsIDE2NywgMTEsIDM2LCAxLCAxLCAxMjYsIDMyLCAwLCAxNzMsIDMyLCAxLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDMyLCAyLCAxNzMsIDMyLCAzLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDEyNywgMzQsIDQsIDY2LCAzMiwgMTM1LCAxNjcsIDM2LCAwLCAzMiwgNCwgMTY3LCAxMSwgMzYsIDEsIDEsIDEyNiwgMzIsIDAsIDE3MywgMzIsIDEsIDE3MywgNjYsIDMyLCAxMzQsIDEzMiwgMzIsIDIsIDE3MywgMzIsIDMsIDE3MywgNjYsIDMyLCAxMzQsIDEzMiwgMTI4LCAzNCwgNCwgNjYsIDMyLCAxMzUsIDE2NywgMzYsIDAsIDMyLCA0LCAxNjcsIDExLCAzNiwgMSwgMSwgMTI2LCAzMiwgMCwgMTczLCAzMiwgMSwgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAzMiwgMiwgMTczLCAzMiwgMywgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAxMjksIDM0LCA0LCA2NiwgMzIsIDEzNSwgMTY3LCAzNiwgMCwgMzIsIDQsIDE2NywgMTEsIDM2LCAxLCAxLCAxMjYsIDMyLCAwLCAxNzMsIDMyLCAxLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDMyLCAyLCAxNzMsIDMyLCAzLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDEzMCwgMzQsIDQsIDY2LCAzMiwgMTM1LCAxNjcsIDM2LCAwLCAzMiwgNCwgMTY3LCAxMVxyXG4gIF0pKSwge30pLmV4cG9ydHM7XHJcbn0gY2F0Y2ggKGUpIHtcclxuICAvLyBubyB3YXNtIHN1cHBvcnQgOihcclxufVxyXG5cclxuLyoqXHJcbiAqIENvbnN0cnVjdHMgYSA2NCBiaXQgdHdvJ3MtY29tcGxlbWVudCBpbnRlZ2VyLCBnaXZlbiBpdHMgbG93IGFuZCBoaWdoIDMyIGJpdCB2YWx1ZXMgYXMgKnNpZ25lZCogaW50ZWdlcnMuXHJcbiAqICBTZWUgdGhlIGZyb20qIGZ1bmN0aW9ucyBiZWxvdyBmb3IgbW9yZSBjb252ZW5pZW50IHdheXMgb2YgY29uc3RydWN0aW5nIExvbmdzLlxyXG4gKiBAZXhwb3J0cyBMb25nXHJcbiAqIEBjbGFzcyBBIExvbmcgY2xhc3MgZm9yIHJlcHJlc2VudGluZyBhIDY0IGJpdCB0d28ncy1jb21wbGVtZW50IGludGVnZXIgdmFsdWUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBsb3cgVGhlIGxvdyAoc2lnbmVkKSAzMiBiaXRzIG9mIHRoZSBsb25nXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBoaWdoIFRoZSBoaWdoIChzaWduZWQpIDMyIGJpdHMgb2YgdGhlIGxvbmdcclxuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxyXG4gKiBAY29uc3RydWN0b3JcclxuICovXHJcbmZ1bmN0aW9uIExvbmcobG93LCBoaWdoLCB1bnNpZ25lZCkge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGxvdyAzMiBiaXRzIGFzIGEgc2lnbmVkIHZhbHVlLlxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xyXG4gICAgdGhpcy5sb3cgPSBsb3cgfCAwO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGhpZ2ggMzIgYml0cyBhcyBhIHNpZ25lZCB2YWx1ZS5cclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cclxuICAgIHRoaXMuaGlnaCA9IGhpZ2ggfCAwO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hldGhlciB1bnNpZ25lZCBvciBub3QuXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgdGhpcy51bnNpZ25lZCA9ICEhdW5zaWduZWQ7XHJcbn1cclxuXHJcbi8vIFRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBhIGxvbmcgaXMgdGhlIHR3byBnaXZlbiBzaWduZWQsIDMyLWJpdCB2YWx1ZXMuXHJcbi8vIFdlIHVzZSAzMi1iaXQgcGllY2VzIGJlY2F1c2UgdGhlc2UgYXJlIHRoZSBzaXplIG9mIGludGVnZXJzIG9uIHdoaWNoXHJcbi8vIEphdmFzY3JpcHQgcGVyZm9ybXMgYml0LW9wZXJhdGlvbnMuICBGb3Igb3BlcmF0aW9ucyBsaWtlIGFkZGl0aW9uIGFuZFxyXG4vLyBtdWx0aXBsaWNhdGlvbiwgd2Ugc3BsaXQgZWFjaCBudW1iZXIgaW50byAxNiBiaXQgcGllY2VzLCB3aGljaCBjYW4gZWFzaWx5IGJlXHJcbi8vIG11bHRpcGxpZWQgd2l0aGluIEphdmFzY3JpcHQncyBmbG9hdGluZy1wb2ludCByZXByZXNlbnRhdGlvbiB3aXRob3V0IG92ZXJmbG93XHJcbi8vIG9yIGNoYW5nZSBpbiBzaWduLlxyXG4vL1xyXG4vLyBJbiB0aGUgYWxnb3JpdGhtcyBiZWxvdywgd2UgZnJlcXVlbnRseSByZWR1Y2UgdGhlIG5lZ2F0aXZlIGNhc2UgdG8gdGhlXHJcbi8vIHBvc2l0aXZlIGNhc2UgYnkgbmVnYXRpbmcgdGhlIGlucHV0KHMpIGFuZCB0aGVuIHBvc3QtcHJvY2Vzc2luZyB0aGUgcmVzdWx0LlxyXG4vLyBOb3RlIHRoYXQgd2UgbXVzdCBBTFdBWVMgY2hlY2sgc3BlY2lhbGx5IHdoZXRoZXIgdGhvc2UgdmFsdWVzIGFyZSBNSU5fVkFMVUVcclxuLy8gKC0yXjYzKSBiZWNhdXNlIC1NSU5fVkFMVUUgPT0gTUlOX1ZBTFVFIChzaW5jZSAyXjYzIGNhbm5vdCBiZSByZXByZXNlbnRlZCBhc1xyXG4vLyBhIHBvc2l0aXZlIG51bWJlciwgaXQgb3ZlcmZsb3dzIGJhY2sgaW50byBhIG5lZ2F0aXZlKS4gIE5vdCBoYW5kbGluZyB0aGlzXHJcbi8vIGNhc2Ugd291bGQgb2Z0ZW4gcmVzdWx0IGluIGluZmluaXRlIHJlY3Vyc2lvbi5cclxuLy9cclxuLy8gQ29tbW9uIGNvbnN0YW50IHZhbHVlcyBaRVJPLCBPTkUsIE5FR19PTkUsIGV0Yy4gYXJlIGRlZmluZWQgYmVsb3cgdGhlIGZyb20qXHJcbi8vIG1ldGhvZHMgb24gd2hpY2ggdGhleSBkZXBlbmQuXHJcblxyXG4vKipcclxuICogQW4gaW5kaWNhdG9yIHVzZWQgdG8gcmVsaWFibHkgZGV0ZXJtaW5lIGlmIGFuIG9iamVjdCBpcyBhIExvbmcgb3Igbm90LlxyXG4gKiBAdHlwZSB7Ym9vbGVhbn1cclxuICogQGNvbnN0XHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5Mb25nLnByb3RvdHlwZS5fX2lzTG9uZ19fO1xyXG5cclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KExvbmcucHJvdG90eXBlLCBcIl9faXNMb25nX19cIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxuXHJcbi8qKlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHsqfSBvYmogT2JqZWN0XHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKiBAaW5uZXJcclxuICovXHJcbmZ1bmN0aW9uIGlzTG9uZyhvYmopIHtcclxuICAgIHJldHVybiAob2JqICYmIG9ialtcIl9faXNMb25nX19cIl0pID09PSB0cnVlO1xyXG59XHJcblxyXG4vKipcclxuICogVGVzdHMgaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgYSBMb25nLlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHsqfSBvYmogT2JqZWN0XHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxuTG9uZy5pc0xvbmcgPSBpc0xvbmc7XHJcblxyXG4vKipcclxuICogQSBjYWNoZSBvZiB0aGUgTG9uZyByZXByZXNlbnRhdGlvbnMgb2Ygc21hbGwgaW50ZWdlciB2YWx1ZXMuXHJcbiAqIEB0eXBlIHshT2JqZWN0fVxyXG4gKiBAaW5uZXJcclxuICovXHJcbnZhciBJTlRfQ0FDSEUgPSB7fTtcclxuXHJcbi8qKlxyXG4gKiBBIGNhY2hlIG9mIHRoZSBMb25nIHJlcHJlc2VudGF0aW9ucyBvZiBzbWFsbCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlcy5cclxuICogQHR5cGUgeyFPYmplY3R9XHJcbiAqIEBpbm5lclxyXG4gKi9cclxudmFyIFVJTlRfQ0FDSEUgPSB7fTtcclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcclxuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWRcclxuICogQHJldHVybnMgeyFMb25nfVxyXG4gKiBAaW5uZXJcclxuICovXHJcbmZ1bmN0aW9uIGZyb21JbnQodmFsdWUsIHVuc2lnbmVkKSB7XHJcbiAgICB2YXIgb2JqLCBjYWNoZWRPYmosIGNhY2hlO1xyXG4gICAgaWYgKHVuc2lnbmVkKSB7XHJcbiAgICAgICAgdmFsdWUgPj4+PSAwO1xyXG4gICAgICAgIGlmIChjYWNoZSA9ICgwIDw9IHZhbHVlICYmIHZhbHVlIDwgMjU2KSkge1xyXG4gICAgICAgICAgICBjYWNoZWRPYmogPSBVSU5UX0NBQ0hFW3ZhbHVlXTtcclxuICAgICAgICAgICAgaWYgKGNhY2hlZE9iailcclxuICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZWRPYmo7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9iaiA9IGZyb21CaXRzKHZhbHVlLCAodmFsdWUgfCAwKSA8IDAgPyAtMSA6IDAsIHRydWUpO1xyXG4gICAgICAgIGlmIChjYWNoZSlcclxuICAgICAgICAgICAgVUlOVF9DQUNIRVt2YWx1ZV0gPSBvYmo7XHJcbiAgICAgICAgcmV0dXJuIG9iajtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdmFsdWUgfD0gMDtcclxuICAgICAgICBpZiAoY2FjaGUgPSAoLTEyOCA8PSB2YWx1ZSAmJiB2YWx1ZSA8IDEyOCkpIHtcclxuICAgICAgICAgICAgY2FjaGVkT2JqID0gSU5UX0NBQ0hFW3ZhbHVlXTtcclxuICAgICAgICAgICAgaWYgKGNhY2hlZE9iailcclxuICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZWRPYmo7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9iaiA9IGZyb21CaXRzKHZhbHVlLCB2YWx1ZSA8IDAgPyAtMSA6IDAsIGZhbHNlKTtcclxuICAgICAgICBpZiAoY2FjaGUpXHJcbiAgICAgICAgICAgIElOVF9DQUNIRVt2YWx1ZV0gPSBvYmo7XHJcbiAgICAgICAgcmV0dXJuIG9iajtcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSBMb25nIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gMzIgYml0IGludGVnZXIgdmFsdWUuXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVGhlIDMyIGJpdCBpbnRlZ2VyIGluIHF1ZXN0aW9uXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcclxuICogQHJldHVybnMgeyFMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXHJcbiAqL1xyXG5Mb25nLmZyb21JbnQgPSBmcm9tSW50O1xyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxyXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZFxyXG4gKiBAcmV0dXJucyB7IUxvbmd9XHJcbiAqIEBpbm5lclxyXG4gKi9cclxuZnVuY3Rpb24gZnJvbU51bWJlcih2YWx1ZSwgdW5zaWduZWQpIHtcclxuICAgIGlmIChpc05hTih2YWx1ZSkpXHJcbiAgICAgICAgcmV0dXJuIHVuc2lnbmVkID8gVVpFUk8gOiBaRVJPO1xyXG4gICAgaWYgKHVuc2lnbmVkKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlIDwgMClcclxuICAgICAgICAgICAgcmV0dXJuIFVaRVJPO1xyXG4gICAgICAgIGlmICh2YWx1ZSA+PSBUV09fUFdSXzY0X0RCTClcclxuICAgICAgICAgICAgcmV0dXJuIE1BWF9VTlNJR05FRF9WQUxVRTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKHZhbHVlIDw9IC1UV09fUFdSXzYzX0RCTClcclxuICAgICAgICAgICAgcmV0dXJuIE1JTl9WQUxVRTtcclxuICAgICAgICBpZiAodmFsdWUgKyAxID49IFRXT19QV1JfNjNfREJMKVxyXG4gICAgICAgICAgICByZXR1cm4gTUFYX1ZBTFVFO1xyXG4gICAgfVxyXG4gICAgaWYgKHZhbHVlIDwgMClcclxuICAgICAgICByZXR1cm4gZnJvbU51bWJlcigtdmFsdWUsIHVuc2lnbmVkKS5uZWcoKTtcclxuICAgIHJldHVybiBmcm9tQml0cygodmFsdWUgJSBUV09fUFdSXzMyX0RCTCkgfCAwLCAodmFsdWUgLyBUV09fUFdSXzMyX0RCTCkgfCAwLCB1bnNpZ25lZCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgTG9uZyByZXByZXNlbnRpbmcgdGhlIGdpdmVuIHZhbHVlLCBwcm92aWRlZCB0aGF0IGl0IGlzIGEgZmluaXRlIG51bWJlci4gT3RoZXJ3aXNlLCB6ZXJvIGlzIHJldHVybmVkLlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFRoZSBudW1iZXIgaW4gcXVlc3Rpb25cclxuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxyXG4gKiBAcmV0dXJucyB7IUxvbmd9IFRoZSBjb3JyZXNwb25kaW5nIExvbmcgdmFsdWVcclxuICovXHJcbkxvbmcuZnJvbU51bWJlciA9IGZyb21OdW1iZXI7XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtudW1iZXJ9IGxvd0JpdHNcclxuICogQHBhcmFtIHtudW1iZXJ9IGhpZ2hCaXRzXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkXHJcbiAqIEByZXR1cm5zIHshTG9uZ31cclxuICogQGlubmVyXHJcbiAqL1xyXG5mdW5jdGlvbiBmcm9tQml0cyhsb3dCaXRzLCBoaWdoQml0cywgdW5zaWduZWQpIHtcclxuICAgIHJldHVybiBuZXcgTG9uZyhsb3dCaXRzLCBoaWdoQml0cywgdW5zaWduZWQpO1xyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIExvbmcgcmVwcmVzZW50aW5nIHRoZSA2NCBiaXQgaW50ZWdlciB0aGF0IGNvbWVzIGJ5IGNvbmNhdGVuYXRpbmcgdGhlIGdpdmVuIGxvdyBhbmQgaGlnaCBiaXRzLiBFYWNoIGlzXHJcbiAqICBhc3N1bWVkIHRvIHVzZSAzMiBiaXRzLlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtudW1iZXJ9IGxvd0JpdHMgVGhlIGxvdyAzMiBiaXRzXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBoaWdoQml0cyBUaGUgaGlnaCAzMiBiaXRzXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcclxuICogQHJldHVybnMgeyFMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXHJcbiAqL1xyXG5Mb25nLmZyb21CaXRzID0gZnJvbUJpdHM7XHJcblxyXG4vKipcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBiYXNlXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBleHBvbmVudFxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gKiBAaW5uZXJcclxuICovXHJcbnZhciBwb3dfZGJsID0gTWF0aC5wb3c7IC8vIFVzZWQgNCB0aW1lcyAoNCo4IHRvIDE1KzQpXHJcblxyXG4vKipcclxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxyXG4gKiBAcGFyYW0geyhib29sZWFufG51bWJlcik9fSB1bnNpZ25lZFxyXG4gKiBAcGFyYW0ge251bWJlcj19IHJhZGl4XHJcbiAqIEByZXR1cm5zIHshTG9uZ31cclxuICogQGlubmVyXHJcbiAqL1xyXG5mdW5jdGlvbiBmcm9tU3RyaW5nKHN0ciwgdW5zaWduZWQsIHJhZGl4KSB7XHJcbiAgICBpZiAoc3RyLmxlbmd0aCA9PT0gMClcclxuICAgICAgICB0aHJvdyBFcnJvcignZW1wdHkgc3RyaW5nJyk7XHJcbiAgICBpZiAoc3RyID09PSBcIk5hTlwiIHx8IHN0ciA9PT0gXCJJbmZpbml0eVwiIHx8IHN0ciA9PT0gXCIrSW5maW5pdHlcIiB8fCBzdHIgPT09IFwiLUluZmluaXR5XCIpXHJcbiAgICAgICAgcmV0dXJuIFpFUk87XHJcbiAgICBpZiAodHlwZW9mIHVuc2lnbmVkID09PSAnbnVtYmVyJykge1xyXG4gICAgICAgIC8vIEZvciBnb29nLm1hdGgubG9uZyBjb21wYXRpYmlsaXR5XHJcbiAgICAgICAgcmFkaXggPSB1bnNpZ25lZCxcclxuICAgICAgICB1bnNpZ25lZCA9IGZhbHNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICB1bnNpZ25lZCA9ICEhIHVuc2lnbmVkO1xyXG4gICAgfVxyXG4gICAgcmFkaXggPSByYWRpeCB8fCAxMDtcclxuICAgIGlmIChyYWRpeCA8IDIgfHwgMzYgPCByYWRpeClcclxuICAgICAgICB0aHJvdyBSYW5nZUVycm9yKCdyYWRpeCcpO1xyXG5cclxuICAgIHZhciBwO1xyXG4gICAgaWYgKChwID0gc3RyLmluZGV4T2YoJy0nKSkgPiAwKVxyXG4gICAgICAgIHRocm93IEVycm9yKCdpbnRlcmlvciBoeXBoZW4nKTtcclxuICAgIGVsc2UgaWYgKHAgPT09IDApIHtcclxuICAgICAgICByZXR1cm4gZnJvbVN0cmluZyhzdHIuc3Vic3RyaW5nKDEpLCB1bnNpZ25lZCwgcmFkaXgpLm5lZygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIERvIHNldmVyYWwgKDgpIGRpZ2l0cyBlYWNoIHRpbWUgdGhyb3VnaCB0aGUgbG9vcCwgc28gYXMgdG9cclxuICAgIC8vIG1pbmltaXplIHRoZSBjYWxscyB0byB0aGUgdmVyeSBleHBlbnNpdmUgZW11bGF0ZWQgZGl2LlxyXG4gICAgdmFyIHJhZGl4VG9Qb3dlciA9IGZyb21OdW1iZXIocG93X2RibChyYWRpeCwgOCkpO1xyXG5cclxuICAgIHZhciByZXN1bHQgPSBaRVJPO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpICs9IDgpIHtcclxuICAgICAgICB2YXIgc2l6ZSA9IE1hdGgubWluKDgsIHN0ci5sZW5ndGggLSBpKSxcclxuICAgICAgICAgICAgdmFsdWUgPSBwYXJzZUludChzdHIuc3Vic3RyaW5nKGksIGkgKyBzaXplKSwgcmFkaXgpO1xyXG4gICAgICAgIGlmIChzaXplIDwgOCkge1xyXG4gICAgICAgICAgICB2YXIgcG93ZXIgPSBmcm9tTnVtYmVyKHBvd19kYmwocmFkaXgsIHNpemUpKTtcclxuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0Lm11bChwb3dlcikuYWRkKGZyb21OdW1iZXIodmFsdWUpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQubXVsKHJhZGl4VG9Qb3dlcik7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5hZGQoZnJvbU51bWJlcih2YWx1ZSkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJlc3VsdC51bnNpZ25lZCA9IHVuc2lnbmVkO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSBMb25nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBzdHJpbmcsIHdyaXR0ZW4gdXNpbmcgdGhlIHNwZWNpZmllZCByYWRpeC5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgVGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIExvbmdcclxuICogQHBhcmFtIHsoYm9vbGVhbnxudW1iZXIpPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxyXG4gKiBAcGFyYW0ge251bWJlcj19IHJhZGl4IFRoZSByYWRpeCBpbiB3aGljaCB0aGUgdGV4dCBpcyB3cml0dGVuICgyLTM2KSwgZGVmYXVsdHMgdG8gMTBcclxuICogQHJldHVybnMgeyFMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXHJcbiAqL1xyXG5Mb25nLmZyb21TdHJpbmcgPSBmcm9tU3RyaW5nO1xyXG5cclxuLyoqXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd8IXtsb3c6IG51bWJlciwgaGlnaDogbnVtYmVyLCB1bnNpZ25lZDogYm9vbGVhbn19IHZhbFxyXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZFxyXG4gKiBAcmV0dXJucyB7IUxvbmd9XHJcbiAqIEBpbm5lclxyXG4gKi9cclxuZnVuY3Rpb24gZnJvbVZhbHVlKHZhbCwgdW5zaWduZWQpIHtcclxuICAgIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJylcclxuICAgICAgICByZXR1cm4gZnJvbU51bWJlcih2YWwsIHVuc2lnbmVkKTtcclxuICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJylcclxuICAgICAgICByZXR1cm4gZnJvbVN0cmluZyh2YWwsIHVuc2lnbmVkKTtcclxuICAgIC8vIFRocm93cyBmb3Igbm9uLW9iamVjdHMsIGNvbnZlcnRzIG5vbi1pbnN0YW5jZW9mIExvbmc6XHJcbiAgICByZXR1cm4gZnJvbUJpdHModmFsLmxvdywgdmFsLmhpZ2gsIHR5cGVvZiB1bnNpZ25lZCA9PT0gJ2Jvb2xlYW4nID8gdW5zaWduZWQgOiB2YWwudW5zaWduZWQpO1xyXG59XHJcblxyXG4vKipcclxuICogQ29udmVydHMgdGhlIHNwZWNpZmllZCB2YWx1ZSB0byBhIExvbmcgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIGZyb20qIGZ1bmN0aW9uIGZvciBpdHMgdHlwZS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ3whe2xvdzogbnVtYmVyLCBoaWdoOiBudW1iZXIsIHVuc2lnbmVkOiBib29sZWFufX0gdmFsIFZhbHVlXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcclxuICogQHJldHVybnMgeyFMb25nfVxyXG4gKi9cclxuTG9uZy5mcm9tVmFsdWUgPSBmcm9tVmFsdWU7XHJcblxyXG4vLyBOT1RFOiB0aGUgY29tcGlsZXIgc2hvdWxkIGlubGluZSB0aGVzZSBjb25zdGFudCB2YWx1ZXMgYmVsb3cgYW5kIHRoZW4gcmVtb3ZlIHRoZXNlIHZhcmlhYmxlcywgc28gdGhlcmUgc2hvdWxkIGJlXHJcbi8vIG5vIHJ1bnRpbWUgcGVuYWx0eSBmb3IgdGhlc2UuXHJcblxyXG4vKipcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0XHJcbiAqIEBpbm5lclxyXG4gKi9cclxudmFyIFRXT19QV1JfMTZfREJMID0gMSA8PCAxNjtcclxuXHJcbi8qKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RcclxuICogQGlubmVyXHJcbiAqL1xyXG52YXIgVFdPX1BXUl8yNF9EQkwgPSAxIDw8IDI0O1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdFxyXG4gKiBAaW5uZXJcclxuICovXHJcbnZhciBUV09fUFdSXzMyX0RCTCA9IFRXT19QV1JfMTZfREJMICogVFdPX1BXUl8xNl9EQkw7XHJcblxyXG4vKipcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0XHJcbiAqIEBpbm5lclxyXG4gKi9cclxudmFyIFRXT19QV1JfNjRfREJMID0gVFdPX1BXUl8zMl9EQkwgKiBUV09fUFdSXzMyX0RCTDtcclxuXHJcbi8qKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RcclxuICogQGlubmVyXHJcbiAqL1xyXG52YXIgVFdPX1BXUl82M19EQkwgPSBUV09fUFdSXzY0X0RCTCAvIDI7XHJcblxyXG4vKipcclxuICogQHR5cGUgeyFMb25nfVxyXG4gKiBAY29uc3RcclxuICogQGlubmVyXHJcbiAqL1xyXG52YXIgVFdPX1BXUl8yNCA9IGZyb21JbnQoVFdPX1BXUl8yNF9EQkwpO1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlIHshTG9uZ31cclxuICogQGlubmVyXHJcbiAqL1xyXG52YXIgWkVSTyA9IGZyb21JbnQoMCk7XHJcblxyXG4vKipcclxuICogU2lnbmVkIHplcm8uXHJcbiAqIEB0eXBlIHshTG9uZ31cclxuICovXHJcbkxvbmcuWkVSTyA9IFpFUk87XHJcblxyXG4vKipcclxuICogQHR5cGUgeyFMb25nfVxyXG4gKiBAaW5uZXJcclxuICovXHJcbnZhciBVWkVSTyA9IGZyb21JbnQoMCwgdHJ1ZSk7XHJcblxyXG4vKipcclxuICogVW5zaWduZWQgemVyby5cclxuICogQHR5cGUgeyFMb25nfVxyXG4gKi9cclxuTG9uZy5VWkVSTyA9IFVaRVJPO1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlIHshTG9uZ31cclxuICogQGlubmVyXHJcbiAqL1xyXG52YXIgT05FID0gZnJvbUludCgxKTtcclxuXHJcbi8qKlxyXG4gKiBTaWduZWQgb25lLlxyXG4gKiBAdHlwZSB7IUxvbmd9XHJcbiAqL1xyXG5Mb25nLk9ORSA9IE9ORTtcclxuXHJcbi8qKlxyXG4gKiBAdHlwZSB7IUxvbmd9XHJcbiAqIEBpbm5lclxyXG4gKi9cclxudmFyIFVPTkUgPSBmcm9tSW50KDEsIHRydWUpO1xyXG5cclxuLyoqXHJcbiAqIFVuc2lnbmVkIG9uZS5cclxuICogQHR5cGUgeyFMb25nfVxyXG4gKi9cclxuTG9uZy5VT05FID0gVU9ORTtcclxuXHJcbi8qKlxyXG4gKiBAdHlwZSB7IUxvbmd9XHJcbiAqIEBpbm5lclxyXG4gKi9cclxudmFyIE5FR19PTkUgPSBmcm9tSW50KC0xKTtcclxuXHJcbi8qKlxyXG4gKiBTaWduZWQgbmVnYXRpdmUgb25lLlxyXG4gKiBAdHlwZSB7IUxvbmd9XHJcbiAqL1xyXG5Mb25nLk5FR19PTkUgPSBORUdfT05FO1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlIHshTG9uZ31cclxuICogQGlubmVyXHJcbiAqL1xyXG52YXIgTUFYX1ZBTFVFID0gZnJvbUJpdHMoMHhGRkZGRkZGRnwwLCAweDdGRkZGRkZGfDAsIGZhbHNlKTtcclxuXHJcbi8qKlxyXG4gKiBNYXhpbXVtIHNpZ25lZCB2YWx1ZS5cclxuICogQHR5cGUgeyFMb25nfVxyXG4gKi9cclxuTG9uZy5NQVhfVkFMVUUgPSBNQVhfVkFMVUU7XHJcblxyXG4vKipcclxuICogQHR5cGUgeyFMb25nfVxyXG4gKiBAaW5uZXJcclxuICovXHJcbnZhciBNQVhfVU5TSUdORURfVkFMVUUgPSBmcm9tQml0cygweEZGRkZGRkZGfDAsIDB4RkZGRkZGRkZ8MCwgdHJ1ZSk7XHJcblxyXG4vKipcclxuICogTWF4aW11bSB1bnNpZ25lZCB2YWx1ZS5cclxuICogQHR5cGUgeyFMb25nfVxyXG4gKi9cclxuTG9uZy5NQVhfVU5TSUdORURfVkFMVUUgPSBNQVhfVU5TSUdORURfVkFMVUU7XHJcblxyXG4vKipcclxuICogQHR5cGUgeyFMb25nfVxyXG4gKiBAaW5uZXJcclxuICovXHJcbnZhciBNSU5fVkFMVUUgPSBmcm9tQml0cygwLCAweDgwMDAwMDAwfDAsIGZhbHNlKTtcclxuXHJcbi8qKlxyXG4gKiBNaW5pbXVtIHNpZ25lZCB2YWx1ZS5cclxuICogQHR5cGUgeyFMb25nfVxyXG4gKi9cclxuTG9uZy5NSU5fVkFMVUUgPSBNSU5fVkFMVUU7XHJcblxyXG4vKipcclxuICogQGFsaWFzIExvbmcucHJvdG90eXBlXHJcbiAqIEBpbm5lclxyXG4gKi9cclxudmFyIExvbmdQcm90b3R5cGUgPSBMb25nLnByb3RvdHlwZTtcclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyB0aGUgTG9uZyB0byBhIDMyIGJpdCBpbnRlZ2VyLCBhc3N1bWluZyBpdCBpcyBhIDMyIGJpdCBpbnRlZ2VyLlxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS50b0ludCA9IGZ1bmN0aW9uIHRvSW50KCkge1xyXG4gICAgcmV0dXJuIHRoaXMudW5zaWduZWQgPyB0aGlzLmxvdyA+Pj4gMCA6IHRoaXMubG93O1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIHRoZSBMb25nIHRvIGEgdGhlIG5lYXJlc3QgZmxvYXRpbmctcG9pbnQgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB2YWx1ZSAoZG91YmxlLCA1MyBiaXQgbWFudGlzc2EpLlxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS50b051bWJlciA9IGZ1bmN0aW9uIHRvTnVtYmVyKCkge1xyXG4gICAgaWYgKHRoaXMudW5zaWduZWQpXHJcbiAgICAgICAgcmV0dXJuICgodGhpcy5oaWdoID4+PiAwKSAqIFRXT19QV1JfMzJfREJMKSArICh0aGlzLmxvdyA+Pj4gMCk7XHJcbiAgICByZXR1cm4gdGhpcy5oaWdoICogVFdPX1BXUl8zMl9EQkwgKyAodGhpcy5sb3cgPj4+IDApO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIHRoZSBMb25nIHRvIGEgc3RyaW5nIHdyaXR0ZW4gaW4gdGhlIHNwZWNpZmllZCByYWRpeC5cclxuICogQHBhcmFtIHtudW1iZXI9fSByYWRpeCBSYWRpeCAoMi0zNiksIGRlZmF1bHRzIHRvIDEwXHJcbiAqIEByZXR1cm5zIHtzdHJpbmd9XHJcbiAqIEBvdmVycmlkZVxyXG4gKiBAdGhyb3dzIHtSYW5nZUVycm9yfSBJZiBgcmFkaXhgIGlzIG91dCBvZiByYW5nZVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKHJhZGl4KSB7XHJcbiAgICByYWRpeCA9IHJhZGl4IHx8IDEwO1xyXG4gICAgaWYgKHJhZGl4IDwgMiB8fCAzNiA8IHJhZGl4KVxyXG4gICAgICAgIHRocm93IFJhbmdlRXJyb3IoJ3JhZGl4Jyk7XHJcbiAgICBpZiAodGhpcy5pc1plcm8oKSlcclxuICAgICAgICByZXR1cm4gJzAnO1xyXG4gICAgaWYgKHRoaXMuaXNOZWdhdGl2ZSgpKSB7IC8vIFVuc2lnbmVkIExvbmdzIGFyZSBuZXZlciBuZWdhdGl2ZVxyXG4gICAgICAgIGlmICh0aGlzLmVxKE1JTl9WQUxVRSkpIHtcclxuICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBjaGFuZ2UgdGhlIExvbmcgdmFsdWUgYmVmb3JlIGl0IGNhbiBiZSBuZWdhdGVkLCBzbyB3ZSByZW1vdmVcclxuICAgICAgICAgICAgLy8gdGhlIGJvdHRvbS1tb3N0IGRpZ2l0IGluIHRoaXMgYmFzZSBhbmQgdGhlbiByZWN1cnNlIHRvIGRvIHRoZSByZXN0LlxyXG4gICAgICAgICAgICB2YXIgcmFkaXhMb25nID0gZnJvbU51bWJlcihyYWRpeCksXHJcbiAgICAgICAgICAgICAgICBkaXYgPSB0aGlzLmRpdihyYWRpeExvbmcpLFxyXG4gICAgICAgICAgICAgICAgcmVtMSA9IGRpdi5tdWwocmFkaXhMb25nKS5zdWIodGhpcyk7XHJcbiAgICAgICAgICAgIHJldHVybiBkaXYudG9TdHJpbmcocmFkaXgpICsgcmVtMS50b0ludCgpLnRvU3RyaW5nKHJhZGl4KTtcclxuICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgcmV0dXJuICctJyArIHRoaXMubmVnKCkudG9TdHJpbmcocmFkaXgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIERvIHNldmVyYWwgKDYpIGRpZ2l0cyBlYWNoIHRpbWUgdGhyb3VnaCB0aGUgbG9vcCwgc28gYXMgdG9cclxuICAgIC8vIG1pbmltaXplIHRoZSBjYWxscyB0byB0aGUgdmVyeSBleHBlbnNpdmUgZW11bGF0ZWQgZGl2LlxyXG4gICAgdmFyIHJhZGl4VG9Qb3dlciA9IGZyb21OdW1iZXIocG93X2RibChyYWRpeCwgNiksIHRoaXMudW5zaWduZWQpLFxyXG4gICAgICAgIHJlbSA9IHRoaXM7XHJcbiAgICB2YXIgcmVzdWx0ID0gJyc7XHJcbiAgICB3aGlsZSAodHJ1ZSkge1xyXG4gICAgICAgIHZhciByZW1EaXYgPSByZW0uZGl2KHJhZGl4VG9Qb3dlciksXHJcbiAgICAgICAgICAgIGludHZhbCA9IHJlbS5zdWIocmVtRGl2Lm11bChyYWRpeFRvUG93ZXIpKS50b0ludCgpID4+PiAwLFxyXG4gICAgICAgICAgICBkaWdpdHMgPSBpbnR2YWwudG9TdHJpbmcocmFkaXgpO1xyXG4gICAgICAgIHJlbSA9IHJlbURpdjtcclxuICAgICAgICBpZiAocmVtLmlzWmVybygpKVxyXG4gICAgICAgICAgICByZXR1cm4gZGlnaXRzICsgcmVzdWx0O1xyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB3aGlsZSAoZGlnaXRzLmxlbmd0aCA8IDYpXHJcbiAgICAgICAgICAgICAgICBkaWdpdHMgPSAnMCcgKyBkaWdpdHM7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9ICcnICsgZGlnaXRzICsgcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufTtcclxuXHJcbi8qKlxyXG4gKiBHZXRzIHRoZSBoaWdoIDMyIGJpdHMgYXMgYSBzaWduZWQgaW50ZWdlci5cclxuICogQHJldHVybnMge251bWJlcn0gU2lnbmVkIGhpZ2ggYml0c1xyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5nZXRIaWdoQml0cyA9IGZ1bmN0aW9uIGdldEhpZ2hCaXRzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaGlnaDtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBHZXRzIHRoZSBoaWdoIDMyIGJpdHMgYXMgYW4gdW5zaWduZWQgaW50ZWdlci5cclxuICogQHJldHVybnMge251bWJlcn0gVW5zaWduZWQgaGlnaCBiaXRzXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmdldEhpZ2hCaXRzVW5zaWduZWQgPSBmdW5jdGlvbiBnZXRIaWdoQml0c1Vuc2lnbmVkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaGlnaCA+Pj4gMDtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBHZXRzIHRoZSBsb3cgMzIgYml0cyBhcyBhIHNpZ25lZCBpbnRlZ2VyLlxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBTaWduZWQgbG93IGJpdHNcclxuICovXHJcbkxvbmdQcm90b3R5cGUuZ2V0TG93Qml0cyA9IGZ1bmN0aW9uIGdldExvd0JpdHMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5sb3c7XHJcbn07XHJcblxyXG4vKipcclxuICogR2V0cyB0aGUgbG93IDMyIGJpdHMgYXMgYW4gdW5zaWduZWQgaW50ZWdlci5cclxuICogQHJldHVybnMge251bWJlcn0gVW5zaWduZWQgbG93IGJpdHNcclxuICovXHJcbkxvbmdQcm90b3R5cGUuZ2V0TG93Qml0c1Vuc2lnbmVkID0gZnVuY3Rpb24gZ2V0TG93Qml0c1Vuc2lnbmVkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubG93ID4+PiAwO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEdldHMgdGhlIG51bWJlciBvZiBiaXRzIG5lZWRlZCB0byByZXByZXNlbnQgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoaXMgTG9uZy5cclxuICogQHJldHVybnMge251bWJlcn1cclxuICovXHJcbkxvbmdQcm90b3R5cGUuZ2V0TnVtQml0c0FicyA9IGZ1bmN0aW9uIGdldE51bUJpdHNBYnMoKSB7XHJcbiAgICBpZiAodGhpcy5pc05lZ2F0aXZlKCkpIC8vIFVuc2lnbmVkIExvbmdzIGFyZSBuZXZlciBuZWdhdGl2ZVxyXG4gICAgICAgIHJldHVybiB0aGlzLmVxKE1JTl9WQUxVRSkgPyA2NCA6IHRoaXMubmVnKCkuZ2V0TnVtQml0c0FicygpO1xyXG4gICAgdmFyIHZhbCA9IHRoaXMuaGlnaCAhPSAwID8gdGhpcy5oaWdoIDogdGhpcy5sb3c7XHJcbiAgICBmb3IgKHZhciBiaXQgPSAzMTsgYml0ID4gMDsgYml0LS0pXHJcbiAgICAgICAgaWYgKCh2YWwgJiAoMSA8PCBiaXQpKSAhPSAwKVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgIHJldHVybiB0aGlzLmhpZ2ggIT0gMCA/IGJpdCArIDMzIDogYml0ICsgMTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBlcXVhbHMgemVyby5cclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmlzWmVybyA9IGZ1bmN0aW9uIGlzWmVybygpIHtcclxuICAgIHJldHVybiB0aGlzLmhpZ2ggPT09IDAgJiYgdGhpcy5sb3cgPT09IDA7XHJcbn07XHJcblxyXG4vKipcclxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgZXF1YWxzIHplcm8uIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjaXNaZXJvfS5cclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmVxeiA9IExvbmdQcm90b3R5cGUuaXNaZXJvO1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIG5lZ2F0aXZlLlxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbkxvbmdQcm90b3R5cGUuaXNOZWdhdGl2ZSA9IGZ1bmN0aW9uIGlzTmVnYXRpdmUoKSB7XHJcbiAgICByZXR1cm4gIXRoaXMudW5zaWduZWQgJiYgdGhpcy5oaWdoIDwgMDtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBwb3NpdGl2ZS5cclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmlzUG9zaXRpdmUgPSBmdW5jdGlvbiBpc1Bvc2l0aXZlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudW5zaWduZWQgfHwgdGhpcy5oaWdoID49IDA7XHJcbn07XHJcblxyXG4vKipcclxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgb2RkLlxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbkxvbmdQcm90b3R5cGUuaXNPZGQgPSBmdW5jdGlvbiBpc09kZCgpIHtcclxuICAgIHJldHVybiAodGhpcy5sb3cgJiAxKSA9PT0gMTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBldmVuLlxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbkxvbmdQcm90b3R5cGUuaXNFdmVuID0gZnVuY3Rpb24gaXNFdmVuKCkge1xyXG4gICAgcmV0dXJuICh0aGlzLmxvdyAmIDEpID09PSAwO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGVxdWFscyB0aGUgc3BlY2lmaWVkJ3MuXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyhvdGhlcikge1xyXG4gICAgaWYgKCFpc0xvbmcob3RoZXIpKVxyXG4gICAgICAgIG90aGVyID0gZnJvbVZhbHVlKG90aGVyKTtcclxuICAgIGlmICh0aGlzLnVuc2lnbmVkICE9PSBvdGhlci51bnNpZ25lZCAmJiAodGhpcy5oaWdoID4+PiAzMSkgPT09IDEgJiYgKG90aGVyLmhpZ2ggPj4+IDMxKSA9PT0gMSlcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICByZXR1cm4gdGhpcy5oaWdoID09PSBvdGhlci5oaWdoICYmIHRoaXMubG93ID09PSBvdGhlci5sb3c7XHJcbn07XHJcblxyXG4vKipcclxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgZXF1YWxzIHRoZSBzcGVjaWZpZWQncy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNlcXVhbHN9LlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbkxvbmdQcm90b3R5cGUuZXEgPSBMb25nUHJvdG90eXBlLmVxdWFscztcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIHNwZWNpZmllZCdzLlxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5ub3RFcXVhbHMgPSBmdW5jdGlvbiBub3RFcXVhbHMob3RoZXIpIHtcclxuICAgIHJldHVybiAhdGhpcy5lcSgvKiB2YWxpZGF0ZXMgKi8gb3RoZXIpO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbm90RXF1YWxzfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLm5lcSA9IExvbmdQcm90b3R5cGUubm90RXF1YWxzO1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbm90RXF1YWxzfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLm5lID0gTG9uZ1Byb3RvdHlwZS5ub3RFcXVhbHM7XHJcblxyXG4vKipcclxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQncy5cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbkxvbmdQcm90b3R5cGUubGVzc1RoYW4gPSBmdW5jdGlvbiBsZXNzVGhhbihvdGhlcikge1xyXG4gICAgcmV0dXJuIHRoaXMuY29tcCgvKiB2YWxpZGF0ZXMgKi8gb3RoZXIpIDwgMDtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2xlc3NUaGFufS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmx0ID0gTG9uZ1Byb3RvdHlwZS5sZXNzVGhhbjtcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdGhlIHNwZWNpZmllZCdzLlxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5sZXNzVGhhbk9yRXF1YWwgPSBmdW5jdGlvbiBsZXNzVGhhbk9yRXF1YWwob3RoZXIpIHtcclxuICAgIHJldHVybiB0aGlzLmNvbXAoLyogdmFsaWRhdGVzICovIG90aGVyKSA8PSAwO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbGVzc1RoYW5PckVxdWFsfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmx0ZSA9IExvbmdQcm90b3R5cGUubGVzc1RoYW5PckVxdWFsO1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbGVzc1RoYW5PckVxdWFsfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmxlID0gTG9uZ1Byb3RvdHlwZS5sZXNzVGhhbk9yRXF1YWw7XHJcblxyXG4vKipcclxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBzcGVjaWZpZWQncy5cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbkxvbmdQcm90b3R5cGUuZ3JlYXRlclRoYW4gPSBmdW5jdGlvbiBncmVhdGVyVGhhbihvdGhlcikge1xyXG4gICAgcmV0dXJuIHRoaXMuY29tcCgvKiB2YWxpZGF0ZXMgKi8gb3RoZXIpID4gMDtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2dyZWF0ZXJUaGFufS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmd0ID0gTG9uZ1Byb3RvdHlwZS5ncmVhdGVyVGhhbjtcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdGhlIHNwZWNpZmllZCdzLlxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5ncmVhdGVyVGhhbk9yRXF1YWwgPSBmdW5jdGlvbiBncmVhdGVyVGhhbk9yRXF1YWwob3RoZXIpIHtcclxuICAgIHJldHVybiB0aGlzLmNvbXAoLyogdmFsaWRhdGVzICovIG90aGVyKSA+PSAwO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjZ3JlYXRlclRoYW5PckVxdWFsfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmd0ZSA9IExvbmdQcm90b3R5cGUuZ3JlYXRlclRoYW5PckVxdWFsO1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjZ3JlYXRlclRoYW5PckVxdWFsfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmdlID0gTG9uZ1Byb3RvdHlwZS5ncmVhdGVyVGhhbk9yRXF1YWw7XHJcblxyXG4vKipcclxuICogQ29tcGFyZXMgdGhpcyBMb25nJ3MgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkJ3MuXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge251bWJlcn0gMCBpZiB0aGV5IGFyZSB0aGUgc2FtZSwgMSBpZiB0aGUgdGhpcyBpcyBncmVhdGVyIGFuZCAtMVxyXG4gKiAgaWYgdGhlIGdpdmVuIG9uZSBpcyBncmVhdGVyXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlKG90aGVyKSB7XHJcbiAgICBpZiAoIWlzTG9uZyhvdGhlcikpXHJcbiAgICAgICAgb3RoZXIgPSBmcm9tVmFsdWUob3RoZXIpO1xyXG4gICAgaWYgKHRoaXMuZXEob3RoZXIpKVxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgdmFyIHRoaXNOZWcgPSB0aGlzLmlzTmVnYXRpdmUoKSxcclxuICAgICAgICBvdGhlck5lZyA9IG90aGVyLmlzTmVnYXRpdmUoKTtcclxuICAgIGlmICh0aGlzTmVnICYmICFvdGhlck5lZylcclxuICAgICAgICByZXR1cm4gLTE7XHJcbiAgICBpZiAoIXRoaXNOZWcgJiYgb3RoZXJOZWcpXHJcbiAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAvLyBBdCB0aGlzIHBvaW50IHRoZSBzaWduIGJpdHMgYXJlIHRoZSBzYW1lXHJcbiAgICBpZiAoIXRoaXMudW5zaWduZWQpXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ViKG90aGVyKS5pc05lZ2F0aXZlKCkgPyAtMSA6IDE7XHJcbiAgICAvLyBCb3RoIGFyZSBwb3NpdGl2ZSBpZiBhdCBsZWFzdCBvbmUgaXMgdW5zaWduZWRcclxuICAgIHJldHVybiAob3RoZXIuaGlnaCA+Pj4gMCkgPiAodGhpcy5oaWdoID4+PiAwKSB8fCAob3RoZXIuaGlnaCA9PT0gdGhpcy5oaWdoICYmIChvdGhlci5sb3cgPj4+IDApID4gKHRoaXMubG93ID4+PiAwKSkgPyAtMSA6IDE7XHJcbn07XHJcblxyXG4vKipcclxuICogQ29tcGFyZXMgdGhpcyBMb25nJ3MgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjY29tcGFyZX0uXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXHJcbiAqIEByZXR1cm5zIHtudW1iZXJ9IDAgaWYgdGhleSBhcmUgdGhlIHNhbWUsIDEgaWYgdGhlIHRoaXMgaXMgZ3JlYXRlciBhbmQgLTFcclxuICogIGlmIHRoZSBnaXZlbiBvbmUgaXMgZ3JlYXRlclxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5jb21wID0gTG9uZ1Byb3RvdHlwZS5jb21wYXJlO1xyXG5cclxuLyoqXHJcbiAqIE5lZ2F0ZXMgdGhpcyBMb25nJ3MgdmFsdWUuXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gTmVnYXRlZCBMb25nXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLm5lZ2F0ZSA9IGZ1bmN0aW9uIG5lZ2F0ZSgpIHtcclxuICAgIGlmICghdGhpcy51bnNpZ25lZCAmJiB0aGlzLmVxKE1JTl9WQUxVRSkpXHJcbiAgICAgICAgcmV0dXJuIE1JTl9WQUxVRTtcclxuICAgIHJldHVybiB0aGlzLm5vdCgpLmFkZChPTkUpO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIE5lZ2F0ZXMgdGhpcyBMb25nJ3MgdmFsdWUuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbmVnYXRlfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gTmVnYXRlZCBMb25nXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLm5lZyA9IExvbmdQcm90b3R5cGUubmVnYXRlO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIHN1bSBvZiB0aGlzIGFuZCB0aGUgc3BlY2lmaWVkIExvbmcuXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gYWRkZW5kIEFkZGVuZFxyXG4gKiBAcmV0dXJucyB7IUxvbmd9IFN1bVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBhZGQoYWRkZW5kKSB7XHJcbiAgICBpZiAoIWlzTG9uZyhhZGRlbmQpKVxyXG4gICAgICAgIGFkZGVuZCA9IGZyb21WYWx1ZShhZGRlbmQpO1xyXG5cclxuICAgIC8vIERpdmlkZSBlYWNoIG51bWJlciBpbnRvIDQgY2h1bmtzIG9mIDE2IGJpdHMsIGFuZCB0aGVuIHN1bSB0aGUgY2h1bmtzLlxyXG5cclxuICAgIHZhciBhNDggPSB0aGlzLmhpZ2ggPj4+IDE2O1xyXG4gICAgdmFyIGEzMiA9IHRoaXMuaGlnaCAmIDB4RkZGRjtcclxuICAgIHZhciBhMTYgPSB0aGlzLmxvdyA+Pj4gMTY7XHJcbiAgICB2YXIgYTAwID0gdGhpcy5sb3cgJiAweEZGRkY7XHJcblxyXG4gICAgdmFyIGI0OCA9IGFkZGVuZC5oaWdoID4+PiAxNjtcclxuICAgIHZhciBiMzIgPSBhZGRlbmQuaGlnaCAmIDB4RkZGRjtcclxuICAgIHZhciBiMTYgPSBhZGRlbmQubG93ID4+PiAxNjtcclxuICAgIHZhciBiMDAgPSBhZGRlbmQubG93ICYgMHhGRkZGO1xyXG5cclxuICAgIHZhciBjNDggPSAwLCBjMzIgPSAwLCBjMTYgPSAwLCBjMDAgPSAwO1xyXG4gICAgYzAwICs9IGEwMCArIGIwMDtcclxuICAgIGMxNiArPSBjMDAgPj4+IDE2O1xyXG4gICAgYzAwICY9IDB4RkZGRjtcclxuICAgIGMxNiArPSBhMTYgKyBiMTY7XHJcbiAgICBjMzIgKz0gYzE2ID4+PiAxNjtcclxuICAgIGMxNiAmPSAweEZGRkY7XHJcbiAgICBjMzIgKz0gYTMyICsgYjMyO1xyXG4gICAgYzQ4ICs9IGMzMiA+Pj4gMTY7XHJcbiAgICBjMzIgJj0gMHhGRkZGO1xyXG4gICAgYzQ4ICs9IGE0OCArIGI0ODtcclxuICAgIGM0OCAmPSAweEZGRkY7XHJcbiAgICByZXR1cm4gZnJvbUJpdHMoKGMxNiA8PCAxNikgfCBjMDAsIChjNDggPDwgMTYpIHwgYzMyLCB0aGlzLnVuc2lnbmVkKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBkaWZmZXJlbmNlIG9mIHRoaXMgYW5kIHRoZSBzcGVjaWZpZWQgTG9uZy5cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBzdWJ0cmFoZW5kIFN1YnRyYWhlbmRcclxuICogQHJldHVybnMgeyFMb25nfSBEaWZmZXJlbmNlXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLnN1YnRyYWN0ID0gZnVuY3Rpb24gc3VidHJhY3Qoc3VidHJhaGVuZCkge1xyXG4gICAgaWYgKCFpc0xvbmcoc3VidHJhaGVuZCkpXHJcbiAgICAgICAgc3VidHJhaGVuZCA9IGZyb21WYWx1ZShzdWJ0cmFoZW5kKTtcclxuICAgIHJldHVybiB0aGlzLmFkZChzdWJ0cmFoZW5kLm5lZygpKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBkaWZmZXJlbmNlIG9mIHRoaXMgYW5kIHRoZSBzcGVjaWZpZWQgTG9uZy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNzdWJ0cmFjdH0uXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IHN1YnRyYWhlbmQgU3VidHJhaGVuZFxyXG4gKiBAcmV0dXJucyB7IUxvbmd9IERpZmZlcmVuY2VcclxuICovXHJcbkxvbmdQcm90b3R5cGUuc3ViID0gTG9uZ1Byb3RvdHlwZS5zdWJ0cmFjdDtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBwcm9kdWN0IG9mIHRoaXMgYW5kIHRoZSBzcGVjaWZpZWQgTG9uZy5cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBtdWx0aXBsaWVyIE11bHRpcGxpZXJcclxuICogQHJldHVybnMgeyFMb25nfSBQcm9kdWN0XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLm11bHRpcGx5ID0gZnVuY3Rpb24gbXVsdGlwbHkobXVsdGlwbGllcikge1xyXG4gICAgaWYgKHRoaXMuaXNaZXJvKCkpXHJcbiAgICAgICAgcmV0dXJuIFpFUk87XHJcbiAgICBpZiAoIWlzTG9uZyhtdWx0aXBsaWVyKSlcclxuICAgICAgICBtdWx0aXBsaWVyID0gZnJvbVZhbHVlKG11bHRpcGxpZXIpO1xyXG5cclxuICAgIC8vIHVzZSB3YXNtIHN1cHBvcnQgaWYgcHJlc2VudFxyXG4gICAgaWYgKHdhc20pIHtcclxuICAgICAgICB2YXIgbG93ID0gd2FzbS5tdWwodGhpcy5sb3csXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGlnaCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGllci5sb3csXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxpZXIuaGlnaCk7XHJcbiAgICAgICAgcmV0dXJuIGZyb21CaXRzKGxvdywgd2FzbS5nZXRfaGlnaCgpLCB0aGlzLnVuc2lnbmVkKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobXVsdGlwbGllci5pc1plcm8oKSlcclxuICAgICAgICByZXR1cm4gWkVSTztcclxuICAgIGlmICh0aGlzLmVxKE1JTl9WQUxVRSkpXHJcbiAgICAgICAgcmV0dXJuIG11bHRpcGxpZXIuaXNPZGQoKSA/IE1JTl9WQUxVRSA6IFpFUk87XHJcbiAgICBpZiAobXVsdGlwbGllci5lcShNSU5fVkFMVUUpKVxyXG4gICAgICAgIHJldHVybiB0aGlzLmlzT2RkKCkgPyBNSU5fVkFMVUUgOiBaRVJPO1xyXG5cclxuICAgIGlmICh0aGlzLmlzTmVnYXRpdmUoKSkge1xyXG4gICAgICAgIGlmIChtdWx0aXBsaWVyLmlzTmVnYXRpdmUoKSlcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubmVnKCkubXVsKG11bHRpcGxpZXIubmVnKCkpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubmVnKCkubXVsKG11bHRpcGxpZXIpLm5lZygpO1xyXG4gICAgfSBlbHNlIGlmIChtdWx0aXBsaWVyLmlzTmVnYXRpdmUoKSlcclxuICAgICAgICByZXR1cm4gdGhpcy5tdWwobXVsdGlwbGllci5uZWcoKSkubmVnKCk7XHJcblxyXG4gICAgLy8gSWYgYm90aCBsb25ncyBhcmUgc21hbGwsIHVzZSBmbG9hdCBtdWx0aXBsaWNhdGlvblxyXG4gICAgaWYgKHRoaXMubHQoVFdPX1BXUl8yNCkgJiYgbXVsdGlwbGllci5sdChUV09fUFdSXzI0KSlcclxuICAgICAgICByZXR1cm4gZnJvbU51bWJlcih0aGlzLnRvTnVtYmVyKCkgKiBtdWx0aXBsaWVyLnRvTnVtYmVyKCksIHRoaXMudW5zaWduZWQpO1xyXG5cclxuICAgIC8vIERpdmlkZSBlYWNoIGxvbmcgaW50byA0IGNodW5rcyBvZiAxNiBiaXRzLCBhbmQgdGhlbiBhZGQgdXAgNHg0IHByb2R1Y3RzLlxyXG4gICAgLy8gV2UgY2FuIHNraXAgcHJvZHVjdHMgdGhhdCB3b3VsZCBvdmVyZmxvdy5cclxuXHJcbiAgICB2YXIgYTQ4ID0gdGhpcy5oaWdoID4+PiAxNjtcclxuICAgIHZhciBhMzIgPSB0aGlzLmhpZ2ggJiAweEZGRkY7XHJcbiAgICB2YXIgYTE2ID0gdGhpcy5sb3cgPj4+IDE2O1xyXG4gICAgdmFyIGEwMCA9IHRoaXMubG93ICYgMHhGRkZGO1xyXG5cclxuICAgIHZhciBiNDggPSBtdWx0aXBsaWVyLmhpZ2ggPj4+IDE2O1xyXG4gICAgdmFyIGIzMiA9IG11bHRpcGxpZXIuaGlnaCAmIDB4RkZGRjtcclxuICAgIHZhciBiMTYgPSBtdWx0aXBsaWVyLmxvdyA+Pj4gMTY7XHJcbiAgICB2YXIgYjAwID0gbXVsdGlwbGllci5sb3cgJiAweEZGRkY7XHJcblxyXG4gICAgdmFyIGM0OCA9IDAsIGMzMiA9IDAsIGMxNiA9IDAsIGMwMCA9IDA7XHJcbiAgICBjMDAgKz0gYTAwICogYjAwO1xyXG4gICAgYzE2ICs9IGMwMCA+Pj4gMTY7XHJcbiAgICBjMDAgJj0gMHhGRkZGO1xyXG4gICAgYzE2ICs9IGExNiAqIGIwMDtcclxuICAgIGMzMiArPSBjMTYgPj4+IDE2O1xyXG4gICAgYzE2ICY9IDB4RkZGRjtcclxuICAgIGMxNiArPSBhMDAgKiBiMTY7XHJcbiAgICBjMzIgKz0gYzE2ID4+PiAxNjtcclxuICAgIGMxNiAmPSAweEZGRkY7XHJcbiAgICBjMzIgKz0gYTMyICogYjAwO1xyXG4gICAgYzQ4ICs9IGMzMiA+Pj4gMTY7XHJcbiAgICBjMzIgJj0gMHhGRkZGO1xyXG4gICAgYzMyICs9IGExNiAqIGIxNjtcclxuICAgIGM0OCArPSBjMzIgPj4+IDE2O1xyXG4gICAgYzMyICY9IDB4RkZGRjtcclxuICAgIGMzMiArPSBhMDAgKiBiMzI7XHJcbiAgICBjNDggKz0gYzMyID4+PiAxNjtcclxuICAgIGMzMiAmPSAweEZGRkY7XHJcbiAgICBjNDggKz0gYTQ4ICogYjAwICsgYTMyICogYjE2ICsgYTE2ICogYjMyICsgYTAwICogYjQ4O1xyXG4gICAgYzQ4ICY9IDB4RkZGRjtcclxuICAgIHJldHVybiBmcm9tQml0cygoYzE2IDw8IDE2KSB8IGMwMCwgKGM0OCA8PCAxNikgfCBjMzIsIHRoaXMudW5zaWduZWQpO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIHByb2R1Y3Qgb2YgdGhpcyBhbmQgdGhlIHNwZWNpZmllZCBMb25nLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI211bHRpcGx5fS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gbXVsdGlwbGllciBNdWx0aXBsaWVyXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gUHJvZHVjdFxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5tdWwgPSBMb25nUHJvdG90eXBlLm11bHRpcGx5O1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhpcyBMb25nIGRpdmlkZWQgYnkgdGhlIHNwZWNpZmllZC4gVGhlIHJlc3VsdCBpcyBzaWduZWQgaWYgdGhpcyBMb25nIGlzIHNpZ25lZCBvclxyXG4gKiAgdW5zaWduZWQgaWYgdGhpcyBMb25nIGlzIHVuc2lnbmVkLlxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IGRpdmlzb3IgRGl2aXNvclxyXG4gKiBAcmV0dXJucyB7IUxvbmd9IFF1b3RpZW50XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmRpdmlkZSA9IGZ1bmN0aW9uIGRpdmlkZShkaXZpc29yKSB7XHJcbiAgICBpZiAoIWlzTG9uZyhkaXZpc29yKSlcclxuICAgICAgICBkaXZpc29yID0gZnJvbVZhbHVlKGRpdmlzb3IpO1xyXG4gICAgaWYgKGRpdmlzb3IuaXNaZXJvKCkpXHJcbiAgICAgICAgdGhyb3cgRXJyb3IoJ2RpdmlzaW9uIGJ5IHplcm8nKTtcclxuXHJcbiAgICAvLyB1c2Ugd2FzbSBzdXBwb3J0IGlmIHByZXNlbnRcclxuICAgIGlmICh3YXNtKSB7XHJcbiAgICAgICAgLy8gZ3VhcmQgYWdhaW5zdCBzaWduZWQgZGl2aXNpb24gb3ZlcmZsb3c6IHRoZSBsYXJnZXN0XHJcbiAgICAgICAgLy8gbmVnYXRpdmUgbnVtYmVyIC8gLTEgd291bGQgYmUgMSBsYXJnZXIgdGhhbiB0aGUgbGFyZ2VzdFxyXG4gICAgICAgIC8vIHBvc2l0aXZlIG51bWJlciwgZHVlIHRvIHR3bydzIGNvbXBsZW1lbnQuXHJcbiAgICAgICAgaWYgKCF0aGlzLnVuc2lnbmVkICYmXHJcbiAgICAgICAgICAgIHRoaXMuaGlnaCA9PT0gLTB4ODAwMDAwMDAgJiZcclxuICAgICAgICAgICAgZGl2aXNvci5sb3cgPT09IC0xICYmIGRpdmlzb3IuaGlnaCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgLy8gYmUgY29uc2lzdGVudCB3aXRoIG5vbi13YXNtIGNvZGUgcGF0aFxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGxvdyA9ICh0aGlzLnVuc2lnbmVkID8gd2FzbS5kaXZfdSA6IHdhc20uZGl2X3MpKFxyXG4gICAgICAgICAgICB0aGlzLmxvdyxcclxuICAgICAgICAgICAgdGhpcy5oaWdoLFxyXG4gICAgICAgICAgICBkaXZpc29yLmxvdyxcclxuICAgICAgICAgICAgZGl2aXNvci5oaWdoXHJcbiAgICAgICAgKTtcclxuICAgICAgICByZXR1cm4gZnJvbUJpdHMobG93LCB3YXNtLmdldF9oaWdoKCksIHRoaXMudW5zaWduZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmlzWmVybygpKVxyXG4gICAgICAgIHJldHVybiB0aGlzLnVuc2lnbmVkID8gVVpFUk8gOiBaRVJPO1xyXG4gICAgdmFyIGFwcHJveCwgcmVtLCByZXM7XHJcbiAgICBpZiAoIXRoaXMudW5zaWduZWQpIHtcclxuICAgICAgICAvLyBUaGlzIHNlY3Rpb24gaXMgb25seSByZWxldmFudCBmb3Igc2lnbmVkIGxvbmdzIGFuZCBpcyBkZXJpdmVkIGZyb20gdGhlXHJcbiAgICAgICAgLy8gY2xvc3VyZSBsaWJyYXJ5IGFzIGEgd2hvbGUuXHJcbiAgICAgICAgaWYgKHRoaXMuZXEoTUlOX1ZBTFVFKSkge1xyXG4gICAgICAgICAgICBpZiAoZGl2aXNvci5lcShPTkUpIHx8IGRpdmlzb3IuZXEoTkVHX09ORSkpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gTUlOX1ZBTFVFOyAgLy8gcmVjYWxsIHRoYXQgLU1JTl9WQUxVRSA9PSBNSU5fVkFMVUVcclxuICAgICAgICAgICAgZWxzZSBpZiAoZGl2aXNvci5lcShNSU5fVkFMVUUpKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIE9ORTtcclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlIHxvdGhlcnwgPj0gMiwgc28gfHRoaXMvb3RoZXJ8IDwgfE1JTl9WQUxVRXwuXHJcbiAgICAgICAgICAgICAgICB2YXIgaGFsZlRoaXMgPSB0aGlzLnNocigxKTtcclxuICAgICAgICAgICAgICAgIGFwcHJveCA9IGhhbGZUaGlzLmRpdihkaXZpc29yKS5zaGwoMSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYXBwcm94LmVxKFpFUk8pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRpdmlzb3IuaXNOZWdhdGl2ZSgpID8gT05FIDogTkVHX09ORTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVtID0gdGhpcy5zdWIoZGl2aXNvci5tdWwoYXBwcm94KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzID0gYXBwcm94LmFkZChyZW0uZGl2KGRpdmlzb3IpKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChkaXZpc29yLmVxKE1JTl9WQUxVRSkpXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnVuc2lnbmVkID8gVVpFUk8gOiBaRVJPO1xyXG4gICAgICAgIGlmICh0aGlzLmlzTmVnYXRpdmUoKSkge1xyXG4gICAgICAgICAgICBpZiAoZGl2aXNvci5pc05lZ2F0aXZlKCkpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5uZWcoKS5kaXYoZGl2aXNvci5uZWcoKSk7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm5lZygpLmRpdihkaXZpc29yKS5uZWcoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGRpdmlzb3IuaXNOZWdhdGl2ZSgpKVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kaXYoZGl2aXNvci5uZWcoKSkubmVnKCk7XHJcbiAgICAgICAgcmVzID0gWkVSTztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gVGhlIGFsZ29yaXRobSBiZWxvdyBoYXMgbm90IGJlZW4gbWFkZSBmb3IgdW5zaWduZWQgbG9uZ3MuIEl0J3MgdGhlcmVmb3JlXHJcbiAgICAgICAgLy8gcmVxdWlyZWQgdG8gdGFrZSBzcGVjaWFsIGNhcmUgb2YgdGhlIE1TQiBwcmlvciB0byBydW5uaW5nIGl0LlxyXG4gICAgICAgIGlmICghZGl2aXNvci51bnNpZ25lZClcclxuICAgICAgICAgICAgZGl2aXNvciA9IGRpdmlzb3IudG9VbnNpZ25lZCgpO1xyXG4gICAgICAgIGlmIChkaXZpc29yLmd0KHRoaXMpKVxyXG4gICAgICAgICAgICByZXR1cm4gVVpFUk87XHJcbiAgICAgICAgaWYgKGRpdmlzb3IuZ3QodGhpcy5zaHJ1KDEpKSkgLy8gMTUgPj4+IDEgPSA3IDsgd2l0aCBkaXZpc29yID0gOCA7IHRydWVcclxuICAgICAgICAgICAgcmV0dXJuIFVPTkU7XHJcbiAgICAgICAgcmVzID0gVVpFUk87XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVwZWF0IHRoZSBmb2xsb3dpbmcgdW50aWwgdGhlIHJlbWFpbmRlciBpcyBsZXNzIHRoYW4gb3RoZXI6ICBmaW5kIGFcclxuICAgIC8vIGZsb2F0aW5nLXBvaW50IHRoYXQgYXBwcm94aW1hdGVzIHJlbWFpbmRlciAvIG90aGVyICpmcm9tIGJlbG93KiwgYWRkIHRoaXNcclxuICAgIC8vIGludG8gdGhlIHJlc3VsdCwgYW5kIHN1YnRyYWN0IGl0IGZyb20gdGhlIHJlbWFpbmRlci4gIEl0IGlzIGNyaXRpY2FsIHRoYXRcclxuICAgIC8vIHRoZSBhcHByb3hpbWF0ZSB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHJlYWwgdmFsdWUgc28gdGhhdCB0aGVcclxuICAgIC8vIHJlbWFpbmRlciBuZXZlciBiZWNvbWVzIG5lZ2F0aXZlLlxyXG4gICAgcmVtID0gdGhpcztcclxuICAgIHdoaWxlIChyZW0uZ3RlKGRpdmlzb3IpKSB7XHJcbiAgICAgICAgLy8gQXBwcm94aW1hdGUgdGhlIHJlc3VsdCBvZiBkaXZpc2lvbi4gVGhpcyBtYXkgYmUgYSBsaXR0bGUgZ3JlYXRlciBvclxyXG4gICAgICAgIC8vIHNtYWxsZXIgdGhhbiB0aGUgYWN0dWFsIHZhbHVlLlxyXG4gICAgICAgIGFwcHJveCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3IocmVtLnRvTnVtYmVyKCkgLyBkaXZpc29yLnRvTnVtYmVyKCkpKTtcclxuXHJcbiAgICAgICAgLy8gV2Ugd2lsbCB0d2VhayB0aGUgYXBwcm94aW1hdGUgcmVzdWx0IGJ5IGNoYW5naW5nIGl0IGluIHRoZSA0OC10aCBkaWdpdCBvclxyXG4gICAgICAgIC8vIHRoZSBzbWFsbGVzdCBub24tZnJhY3Rpb25hbCBkaWdpdCwgd2hpY2hldmVyIGlzIGxhcmdlci5cclxuICAgICAgICB2YXIgbG9nMiA9IE1hdGguY2VpbChNYXRoLmxvZyhhcHByb3gpIC8gTWF0aC5MTjIpLFxyXG4gICAgICAgICAgICBkZWx0YSA9IChsb2cyIDw9IDQ4KSA/IDEgOiBwb3dfZGJsKDIsIGxvZzIgLSA0OCksXHJcblxyXG4gICAgICAgIC8vIERlY3JlYXNlIHRoZSBhcHByb3hpbWF0aW9uIHVudGlsIGl0IGlzIHNtYWxsZXIgdGhhbiB0aGUgcmVtYWluZGVyLiAgTm90ZVxyXG4gICAgICAgIC8vIHRoYXQgaWYgaXQgaXMgdG9vIGxhcmdlLCB0aGUgcHJvZHVjdCBvdmVyZmxvd3MgYW5kIGlzIG5lZ2F0aXZlLlxyXG4gICAgICAgICAgICBhcHByb3hSZXMgPSBmcm9tTnVtYmVyKGFwcHJveCksXHJcbiAgICAgICAgICAgIGFwcHJveFJlbSA9IGFwcHJveFJlcy5tdWwoZGl2aXNvcik7XHJcbiAgICAgICAgd2hpbGUgKGFwcHJveFJlbS5pc05lZ2F0aXZlKCkgfHwgYXBwcm94UmVtLmd0KHJlbSkpIHtcclxuICAgICAgICAgICAgYXBwcm94IC09IGRlbHRhO1xyXG4gICAgICAgICAgICBhcHByb3hSZXMgPSBmcm9tTnVtYmVyKGFwcHJveCwgdGhpcy51bnNpZ25lZCk7XHJcbiAgICAgICAgICAgIGFwcHJveFJlbSA9IGFwcHJveFJlcy5tdWwoZGl2aXNvcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBXZSBrbm93IHRoZSBhbnN3ZXIgY2FuJ3QgYmUgemVyby4uLiBhbmQgYWN0dWFsbHksIHplcm8gd291bGQgY2F1c2VcclxuICAgICAgICAvLyBpbmZpbml0ZSByZWN1cnNpb24gc2luY2Ugd2Ugd291bGQgbWFrZSBubyBwcm9ncmVzcy5cclxuICAgICAgICBpZiAoYXBwcm94UmVzLmlzWmVybygpKVxyXG4gICAgICAgICAgICBhcHByb3hSZXMgPSBPTkU7XHJcblxyXG4gICAgICAgIHJlcyA9IHJlcy5hZGQoYXBwcm94UmVzKTtcclxuICAgICAgICByZW0gPSByZW0uc3ViKGFwcHJveFJlbSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhpcyBMb25nIGRpdmlkZWQgYnkgdGhlIHNwZWNpZmllZC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNkaXZpZGV9LlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBkaXZpc29yIERpdmlzb3JcclxuICogQHJldHVybnMgeyFMb25nfSBRdW90aWVudFxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5kaXYgPSBMb25nUHJvdG90eXBlLmRpdmlkZTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyBtb2R1bG8gdGhlIHNwZWNpZmllZC5cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBkaXZpc29yIERpdmlzb3JcclxuICogQHJldHVybnMgeyFMb25nfSBSZW1haW5kZXJcclxuICovXHJcbkxvbmdQcm90b3R5cGUubW9kdWxvID0gZnVuY3Rpb24gbW9kdWxvKGRpdmlzb3IpIHtcclxuICAgIGlmICghaXNMb25nKGRpdmlzb3IpKVxyXG4gICAgICAgIGRpdmlzb3IgPSBmcm9tVmFsdWUoZGl2aXNvcik7XHJcblxyXG4gICAgLy8gdXNlIHdhc20gc3VwcG9ydCBpZiBwcmVzZW50XHJcbiAgICBpZiAod2FzbSkge1xyXG4gICAgICAgIHZhciBsb3cgPSAodGhpcy51bnNpZ25lZCA/IHdhc20ucmVtX3UgOiB3YXNtLnJlbV9zKShcclxuICAgICAgICAgICAgdGhpcy5sb3csXHJcbiAgICAgICAgICAgIHRoaXMuaGlnaCxcclxuICAgICAgICAgICAgZGl2aXNvci5sb3csXHJcbiAgICAgICAgICAgIGRpdmlzb3IuaGlnaFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgcmV0dXJuIGZyb21CaXRzKGxvdywgd2FzbS5nZXRfaGlnaCgpLCB0aGlzLnVuc2lnbmVkKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5zdWIodGhpcy5kaXYoZGl2aXNvcikubXVsKGRpdmlzb3IpKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyBtb2R1bG8gdGhlIHNwZWNpZmllZC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNtb2R1bG99LlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBkaXZpc29yIERpdmlzb3JcclxuICogQHJldHVybnMgeyFMb25nfSBSZW1haW5kZXJcclxuICovXHJcbkxvbmdQcm90b3R5cGUubW9kID0gTG9uZ1Byb3RvdHlwZS5tb2R1bG87XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGlzIExvbmcgbW9kdWxvIHRoZSBzcGVjaWZpZWQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbW9kdWxvfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gZGl2aXNvciBEaXZpc29yXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gUmVtYWluZGVyXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLnJlbSA9IExvbmdQcm90b3R5cGUubW9kdWxvO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGJpdHdpc2UgTk9UIG9mIHRoaXMgTG9uZy5cclxuICogQHJldHVybnMgeyFMb25nfVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5ub3QgPSBmdW5jdGlvbiBub3QoKSB7XHJcbiAgICByZXR1cm4gZnJvbUJpdHMofnRoaXMubG93LCB+dGhpcy5oaWdoLCB0aGlzLnVuc2lnbmVkKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBiaXR3aXNlIEFORCBvZiB0aGlzIExvbmcgYW5kIHRoZSBzcGVjaWZpZWQuXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgTG9uZ1xyXG4gKiBAcmV0dXJucyB7IUxvbmd9XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmFuZCA9IGZ1bmN0aW9uIGFuZChvdGhlcikge1xyXG4gICAgaWYgKCFpc0xvbmcob3RoZXIpKVxyXG4gICAgICAgIG90aGVyID0gZnJvbVZhbHVlKG90aGVyKTtcclxuICAgIHJldHVybiBmcm9tQml0cyh0aGlzLmxvdyAmIG90aGVyLmxvdywgdGhpcy5oaWdoICYgb3RoZXIuaGlnaCwgdGhpcy51bnNpZ25lZCk7XHJcbn07XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgYml0d2lzZSBPUiBvZiB0aGlzIExvbmcgYW5kIHRoZSBzcGVjaWZpZWQuXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgTG9uZ1xyXG4gKiBAcmV0dXJucyB7IUxvbmd9XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLm9yID0gZnVuY3Rpb24gb3Iob3RoZXIpIHtcclxuICAgIGlmICghaXNMb25nKG90aGVyKSlcclxuICAgICAgICBvdGhlciA9IGZyb21WYWx1ZShvdGhlcik7XHJcbiAgICByZXR1cm4gZnJvbUJpdHModGhpcy5sb3cgfCBvdGhlci5sb3csIHRoaXMuaGlnaCB8IG90aGVyLmhpZ2gsIHRoaXMudW5zaWduZWQpO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGJpdHdpc2UgWE9SIG9mIHRoaXMgTG9uZyBhbmQgdGhlIGdpdmVuIG9uZS5cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBvdGhlciBPdGhlciBMb25nXHJcbiAqIEByZXR1cm5zIHshTG9uZ31cclxuICovXHJcbkxvbmdQcm90b3R5cGUueG9yID0gZnVuY3Rpb24geG9yKG90aGVyKSB7XHJcbiAgICBpZiAoIWlzTG9uZyhvdGhlcikpXHJcbiAgICAgICAgb3RoZXIgPSBmcm9tVmFsdWUob3RoZXIpO1xyXG4gICAgcmV0dXJuIGZyb21CaXRzKHRoaXMubG93IF4gb3RoZXIubG93LCB0aGlzLmhpZ2ggXiBvdGhlci5oaWdoLCB0aGlzLnVuc2lnbmVkKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgc2hpZnRlZCB0byB0aGUgbGVmdCBieSB0aGUgZ2l2ZW4gYW1vdW50LlxyXG4gKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xyXG4gKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5zaGlmdExlZnQgPSBmdW5jdGlvbiBzaGlmdExlZnQobnVtQml0cykge1xyXG4gICAgaWYgKGlzTG9uZyhudW1CaXRzKSlcclxuICAgICAgICBudW1CaXRzID0gbnVtQml0cy50b0ludCgpO1xyXG4gICAgaWYgKChudW1CaXRzICY9IDYzKSA9PT0gMClcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIGVsc2UgaWYgKG51bUJpdHMgPCAzMilcclxuICAgICAgICByZXR1cm4gZnJvbUJpdHModGhpcy5sb3cgPDwgbnVtQml0cywgKHRoaXMuaGlnaCA8PCBudW1CaXRzKSB8ICh0aGlzLmxvdyA+Pj4gKDMyIC0gbnVtQml0cykpLCB0aGlzLnVuc2lnbmVkKTtcclxuICAgIGVsc2VcclxuICAgICAgICByZXR1cm4gZnJvbUJpdHMoMCwgdGhpcy5sb3cgPDwgKG51bUJpdHMgLSAzMiksIHRoaXMudW5zaWduZWQpO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyBzaGlmdGVkIHRvIHRoZSBsZWZ0IGJ5IHRoZSBnaXZlbiBhbW91bnQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjc2hpZnRMZWZ0fS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gU2hpZnRlZCBMb25nXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLnNobCA9IExvbmdQcm90b3R5cGUuc2hpZnRMZWZ0O1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyBhcml0aG1ldGljYWxseSBzaGlmdGVkIHRvIHRoZSByaWdodCBieSB0aGUgZ2l2ZW4gYW1vdW50LlxyXG4gKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xyXG4gKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5zaGlmdFJpZ2h0ID0gZnVuY3Rpb24gc2hpZnRSaWdodChudW1CaXRzKSB7XHJcbiAgICBpZiAoaXNMb25nKG51bUJpdHMpKVxyXG4gICAgICAgIG51bUJpdHMgPSBudW1CaXRzLnRvSW50KCk7XHJcbiAgICBpZiAoKG51bUJpdHMgJj0gNjMpID09PSAwKVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgZWxzZSBpZiAobnVtQml0cyA8IDMyKVxyXG4gICAgICAgIHJldHVybiBmcm9tQml0cygodGhpcy5sb3cgPj4+IG51bUJpdHMpIHwgKHRoaXMuaGlnaCA8PCAoMzIgLSBudW1CaXRzKSksIHRoaXMuaGlnaCA+PiBudW1CaXRzLCB0aGlzLnVuc2lnbmVkKTtcclxuICAgIGVsc2VcclxuICAgICAgICByZXR1cm4gZnJvbUJpdHModGhpcy5oaWdoID4+IChudW1CaXRzIC0gMzIpLCB0aGlzLmhpZ2ggPj0gMCA/IDAgOiAtMSwgdGhpcy51bnNpZ25lZCk7XHJcbn07XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIGFyaXRobWV0aWNhbGx5IHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0IGJ5IHRoZSBnaXZlbiBhbW91bnQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjc2hpZnRSaWdodH0uXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xyXG4gKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5zaHIgPSBMb25nUHJvdG90eXBlLnNoaWZ0UmlnaHQ7XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIGxvZ2ljYWxseSBzaGlmdGVkIHRvIHRoZSByaWdodCBieSB0aGUgZ2l2ZW4gYW1vdW50LlxyXG4gKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xyXG4gKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5zaGlmdFJpZ2h0VW5zaWduZWQgPSBmdW5jdGlvbiBzaGlmdFJpZ2h0VW5zaWduZWQobnVtQml0cykge1xyXG4gICAgaWYgKGlzTG9uZyhudW1CaXRzKSlcclxuICAgICAgICBudW1CaXRzID0gbnVtQml0cy50b0ludCgpO1xyXG4gICAgbnVtQml0cyAmPSA2MztcclxuICAgIGlmIChudW1CaXRzID09PSAwKVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgdmFyIGhpZ2ggPSB0aGlzLmhpZ2g7XHJcbiAgICAgICAgaWYgKG51bUJpdHMgPCAzMikge1xyXG4gICAgICAgICAgICB2YXIgbG93ID0gdGhpcy5sb3c7XHJcbiAgICAgICAgICAgIHJldHVybiBmcm9tQml0cygobG93ID4+PiBudW1CaXRzKSB8IChoaWdoIDw8ICgzMiAtIG51bUJpdHMpKSwgaGlnaCA+Pj4gbnVtQml0cywgdGhpcy51bnNpZ25lZCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChudW1CaXRzID09PSAzMilcclxuICAgICAgICAgICAgcmV0dXJuIGZyb21CaXRzKGhpZ2gsIDAsIHRoaXMudW5zaWduZWQpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgcmV0dXJuIGZyb21CaXRzKGhpZ2ggPj4+IChudW1CaXRzIC0gMzIpLCAwLCB0aGlzLnVuc2lnbmVkKTtcclxuICAgIH1cclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgbG9naWNhbGx5IHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0IGJ5IHRoZSBnaXZlbiBhbW91bnQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjc2hpZnRSaWdodFVuc2lnbmVkfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gU2hpZnRlZCBMb25nXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLnNocnUgPSBMb25nUHJvdG90eXBlLnNoaWZ0UmlnaHRVbnNpZ25lZDtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgbG9naWNhbGx5IHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0IGJ5IHRoZSBnaXZlbiBhbW91bnQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjc2hpZnRSaWdodFVuc2lnbmVkfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gU2hpZnRlZCBMb25nXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLnNocl91ID0gTG9uZ1Byb3RvdHlwZS5zaGlmdFJpZ2h0VW5zaWduZWQ7XHJcblxyXG4vKipcclxuICogQ29udmVydHMgdGhpcyBMb25nIHRvIHNpZ25lZC5cclxuICogQHJldHVybnMgeyFMb25nfSBTaWduZWQgbG9uZ1xyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS50b1NpZ25lZCA9IGZ1bmN0aW9uIHRvU2lnbmVkKCkge1xyXG4gICAgaWYgKCF0aGlzLnVuc2lnbmVkKVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgcmV0dXJuIGZyb21CaXRzKHRoaXMubG93LCB0aGlzLmhpZ2gsIGZhbHNlKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyB0aGlzIExvbmcgdG8gdW5zaWduZWQuXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gVW5zaWduZWQgbG9uZ1xyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS50b1Vuc2lnbmVkID0gZnVuY3Rpb24gdG9VbnNpZ25lZCgpIHtcclxuICAgIGlmICh0aGlzLnVuc2lnbmVkKVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgcmV0dXJuIGZyb21CaXRzKHRoaXMubG93LCB0aGlzLmhpZ2gsIHRydWUpO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIHRoaXMgTG9uZyB0byBpdHMgYnl0ZSByZXByZXNlbnRhdGlvbi5cclxuICogQHBhcmFtIHtib29sZWFuPX0gbGUgV2hldGhlciBsaXR0bGUgb3IgYmlnIGVuZGlhbiwgZGVmYXVsdHMgdG8gYmlnIGVuZGlhblxyXG4gKiBAcmV0dXJucyB7IUFycmF5LjxudW1iZXI+fSBCeXRlIHJlcHJlc2VudGF0aW9uXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLnRvQnl0ZXMgPSBmdW5jdGlvbiB0b0J5dGVzKGxlKSB7XHJcbiAgICByZXR1cm4gbGUgPyB0aGlzLnRvQnl0ZXNMRSgpIDogdGhpcy50b0J5dGVzQkUoKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyB0aGlzIExvbmcgdG8gaXRzIGxpdHRsZSBlbmRpYW4gYnl0ZSByZXByZXNlbnRhdGlvbi5cclxuICogQHJldHVybnMgeyFBcnJheS48bnVtYmVyPn0gTGl0dGxlIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLnRvQnl0ZXNMRSA9IGZ1bmN0aW9uIHRvQnl0ZXNMRSgpIHtcclxuICAgIHZhciBoaSA9IHRoaXMuaGlnaCxcclxuICAgICAgICBsbyA9IHRoaXMubG93O1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgICBsbyAgICAgICAgJiAweGZmLFxyXG4gICAgICAgIGxvID4+PiAgOCAmIDB4ZmYsXHJcbiAgICAgICAgbG8gPj4+IDE2ICYgMHhmZixcclxuICAgICAgICBsbyA+Pj4gMjQgICAgICAgLFxyXG4gICAgICAgIGhpICAgICAgICAmIDB4ZmYsXHJcbiAgICAgICAgaGkgPj4+ICA4ICYgMHhmZixcclxuICAgICAgICBoaSA+Pj4gMTYgJiAweGZmLFxyXG4gICAgICAgIGhpID4+PiAyNFxyXG4gICAgXTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyB0aGlzIExvbmcgdG8gaXRzIGJpZyBlbmRpYW4gYnl0ZSByZXByZXNlbnRhdGlvbi5cclxuICogQHJldHVybnMgeyFBcnJheS48bnVtYmVyPn0gQmlnIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLnRvQnl0ZXNCRSA9IGZ1bmN0aW9uIHRvQnl0ZXNCRSgpIHtcclxuICAgIHZhciBoaSA9IHRoaXMuaGlnaCxcclxuICAgICAgICBsbyA9IHRoaXMubG93O1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgICBoaSA+Pj4gMjQgICAgICAgLFxyXG4gICAgICAgIGhpID4+PiAxNiAmIDB4ZmYsXHJcbiAgICAgICAgaGkgPj4+ICA4ICYgMHhmZixcclxuICAgICAgICBoaSAgICAgICAgJiAweGZmLFxyXG4gICAgICAgIGxvID4+PiAyNCAgICAgICAsXHJcbiAgICAgICAgbG8gPj4+IDE2ICYgMHhmZixcclxuICAgICAgICBsbyA+Pj4gIDggJiAweGZmLFxyXG4gICAgICAgIGxvICAgICAgICAmIDB4ZmZcclxuICAgIF07XHJcbn07XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIExvbmcgZnJvbSBpdHMgYnl0ZSByZXByZXNlbnRhdGlvbi5cclxuICogQHBhcmFtIHshQXJyYXkuPG51bWJlcj59IGJ5dGVzIEJ5dGUgcmVwcmVzZW50YXRpb25cclxuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxyXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBsZSBXaGV0aGVyIGxpdHRsZSBvciBiaWcgZW5kaWFuLCBkZWZhdWx0cyB0byBiaWcgZW5kaWFuXHJcbiAqIEByZXR1cm5zIHtMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXHJcbiAqL1xyXG5Mb25nLmZyb21CeXRlcyA9IGZ1bmN0aW9uIGZyb21CeXRlcyhieXRlcywgdW5zaWduZWQsIGxlKSB7XHJcbiAgICByZXR1cm4gbGUgPyBMb25nLmZyb21CeXRlc0xFKGJ5dGVzLCB1bnNpZ25lZCkgOiBMb25nLmZyb21CeXRlc0JFKGJ5dGVzLCB1bnNpZ25lZCk7XHJcbn07XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIExvbmcgZnJvbSBpdHMgbGl0dGxlIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uLlxyXG4gKiBAcGFyYW0geyFBcnJheS48bnVtYmVyPn0gYnl0ZXMgTGl0dGxlIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcclxuICogQHJldHVybnMge0xvbmd9IFRoZSBjb3JyZXNwb25kaW5nIExvbmcgdmFsdWVcclxuICovXHJcbkxvbmcuZnJvbUJ5dGVzTEUgPSBmdW5jdGlvbiBmcm9tQnl0ZXNMRShieXRlcywgdW5zaWduZWQpIHtcclxuICAgIHJldHVybiBuZXcgTG9uZyhcclxuICAgICAgICBieXRlc1swXSAgICAgICB8XHJcbiAgICAgICAgYnl0ZXNbMV0gPDwgIDggfFxyXG4gICAgICAgIGJ5dGVzWzJdIDw8IDE2IHxcclxuICAgICAgICBieXRlc1szXSA8PCAyNCxcclxuICAgICAgICBieXRlc1s0XSAgICAgICB8XHJcbiAgICAgICAgYnl0ZXNbNV0gPDwgIDggfFxyXG4gICAgICAgIGJ5dGVzWzZdIDw8IDE2IHxcclxuICAgICAgICBieXRlc1s3XSA8PCAyNCxcclxuICAgICAgICB1bnNpZ25lZFxyXG4gICAgKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgTG9uZyBmcm9tIGl0cyBiaWcgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb24uXHJcbiAqIEBwYXJhbSB7IUFycmF5LjxudW1iZXI+fSBieXRlcyBCaWcgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb25cclxuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxyXG4gKiBAcmV0dXJucyB7TG9uZ30gVGhlIGNvcnJlc3BvbmRpbmcgTG9uZyB2YWx1ZVxyXG4gKi9cclxuTG9uZy5mcm9tQnl0ZXNCRSA9IGZ1bmN0aW9uIGZyb21CeXRlc0JFKGJ5dGVzLCB1bnNpZ25lZCkge1xyXG4gICAgcmV0dXJuIG5ldyBMb25nKFxyXG4gICAgICAgIGJ5dGVzWzRdIDw8IDI0IHxcclxuICAgICAgICBieXRlc1s1XSA8PCAxNiB8XHJcbiAgICAgICAgYnl0ZXNbNl0gPDwgIDggfFxyXG4gICAgICAgIGJ5dGVzWzddLFxyXG4gICAgICAgIGJ5dGVzWzBdIDw8IDI0IHxcclxuICAgICAgICBieXRlc1sxXSA8PCAxNiB8XHJcbiAgICAgICAgYnl0ZXNbMl0gPDwgIDggfFxyXG4gICAgICAgIGJ5dGVzWzNdLFxyXG4gICAgICAgIHVuc2lnbmVkXHJcbiAgICApO1xyXG59O1xyXG4iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwiLy8gQSBsaWJyYXJ5IG9mIHNlZWRhYmxlIFJOR3MgaW1wbGVtZW50ZWQgaW4gSmF2YXNjcmlwdC5cbi8vXG4vLyBVc2FnZTpcbi8vXG4vLyB2YXIgc2VlZHJhbmRvbSA9IHJlcXVpcmUoJ3NlZWRyYW5kb20nKTtcbi8vIHZhciByYW5kb20gPSBzZWVkcmFuZG9tKDEpOyAvLyBvciBhbnkgc2VlZC5cbi8vIHZhciB4ID0gcmFuZG9tKCk7ICAgICAgIC8vIDAgPD0geCA8IDEuICBFdmVyeSBiaXQgaXMgcmFuZG9tLlxuLy8gdmFyIHggPSByYW5kb20ucXVpY2soKTsgLy8gMCA8PSB4IDwgMS4gIDMyIGJpdHMgb2YgcmFuZG9tbmVzcy5cblxuLy8gYWxlYSwgYSA1My1iaXQgbXVsdGlwbHktd2l0aC1jYXJyeSBnZW5lcmF0b3IgYnkgSm9oYW5uZXMgQmFhZ8O4ZS5cbi8vIFBlcmlvZDogfjJeMTE2XG4vLyBSZXBvcnRlZCB0byBwYXNzIGFsbCBCaWdDcnVzaCB0ZXN0cy5cbnZhciBhbGVhID0gcmVxdWlyZSgnLi9saWIvYWxlYScpO1xuXG4vLyB4b3IxMjgsIGEgcHVyZSB4b3Itc2hpZnQgZ2VuZXJhdG9yIGJ5IEdlb3JnZSBNYXJzYWdsaWEuXG4vLyBQZXJpb2Q6IDJeMTI4LTEuXG4vLyBSZXBvcnRlZCB0byBmYWlsOiBNYXRyaXhSYW5rIGFuZCBMaW5lYXJDb21wLlxudmFyIHhvcjEyOCA9IHJlcXVpcmUoJy4vbGliL3hvcjEyOCcpO1xuXG4vLyB4b3J3b3csIEdlb3JnZSBNYXJzYWdsaWEncyAxNjAtYml0IHhvci1zaGlmdCBjb21iaW5lZCBwbHVzIHdleWwuXG4vLyBQZXJpb2Q6IDJeMTkyLTJeMzJcbi8vIFJlcG9ydGVkIHRvIGZhaWw6IENvbGxpc2lvbk92ZXIsIFNpbXBQb2tlciwgYW5kIExpbmVhckNvbXAuXG52YXIgeG9yd293ID0gcmVxdWlyZSgnLi9saWIveG9yd293Jyk7XG5cbi8vIHhvcnNoaWZ0NywgYnkgRnJhbsOnb2lzIFBhbm5ldG9uIGFuZCBQaWVycmUgTCdlY3V5ZXIsIHRha2VzXG4vLyBhIGRpZmZlcmVudCBhcHByb2FjaDogaXQgYWRkcyByb2J1c3RuZXNzIGJ5IGFsbG93aW5nIG1vcmUgc2hpZnRzXG4vLyB0aGFuIE1hcnNhZ2xpYSdzIG9yaWdpbmFsIHRocmVlLiAgSXQgaXMgYSA3LXNoaWZ0IGdlbmVyYXRvclxuLy8gd2l0aCAyNTYgYml0cywgdGhhdCBwYXNzZXMgQmlnQ3J1c2ggd2l0aCBubyBzeXN0bWF0aWMgZmFpbHVyZXMuXG4vLyBQZXJpb2QgMl4yNTYtMS5cbi8vIE5vIHN5c3RlbWF0aWMgQmlnQ3J1c2ggZmFpbHVyZXMgcmVwb3J0ZWQuXG52YXIgeG9yc2hpZnQ3ID0gcmVxdWlyZSgnLi9saWIveG9yc2hpZnQ3Jyk7XG5cbi8vIHhvcjQwOTYsIGJ5IFJpY2hhcmQgQnJlbnQsIGlzIGEgNDA5Ni1iaXQgeG9yLXNoaWZ0IHdpdGggYVxuLy8gdmVyeSBsb25nIHBlcmlvZCB0aGF0IGFsc28gYWRkcyBhIFdleWwgZ2VuZXJhdG9yLiBJdCBhbHNvIHBhc3Nlc1xuLy8gQmlnQ3J1c2ggd2l0aCBubyBzeXN0ZW1hdGljIGZhaWx1cmVzLiAgSXRzIGxvbmcgcGVyaW9kIG1heVxuLy8gYmUgdXNlZnVsIGlmIHlvdSBoYXZlIG1hbnkgZ2VuZXJhdG9ycyBhbmQgbmVlZCB0byBhdm9pZFxuLy8gY29sbGlzaW9ucy5cbi8vIFBlcmlvZDogMl40MTI4LTJeMzIuXG4vLyBObyBzeXN0ZW1hdGljIEJpZ0NydXNoIGZhaWx1cmVzIHJlcG9ydGVkLlxudmFyIHhvcjQwOTYgPSByZXF1aXJlKCcuL2xpYi94b3I0MDk2Jyk7XG5cbi8vIFR5Y2hlLWksIGJ5IFNhbXVlbCBOZXZlcyBhbmQgRmlsaXBlIEFyYXVqbywgaXMgYSBiaXQtc2hpZnRpbmcgcmFuZG9tXG4vLyBudW1iZXIgZ2VuZXJhdG9yIGRlcml2ZWQgZnJvbSBDaGFDaGEsIGEgbW9kZXJuIHN0cmVhbSBjaXBoZXIuXG4vLyBodHRwczovL2VkZW4uZGVpLnVjLnB0L35zbmV2ZXMvcHVicy8yMDExLXNuZmEyLnBkZlxuLy8gUGVyaW9kOiB+Ml4xMjdcbi8vIE5vIHN5c3RlbWF0aWMgQmlnQ3J1c2ggZmFpbHVyZXMgcmVwb3J0ZWQuXG52YXIgdHljaGVpID0gcmVxdWlyZSgnLi9saWIvdHljaGVpJyk7XG5cbi8vIFRoZSBvcmlnaW5hbCBBUkM0LWJhc2VkIHBybmcgaW5jbHVkZWQgaW4gdGhpcyBsaWJyYXJ5LlxuLy8gUGVyaW9kOiB+Ml4xNjAwXG52YXIgc3IgPSByZXF1aXJlKCcuL3NlZWRyYW5kb20nKTtcblxuc3IuYWxlYSA9IGFsZWE7XG5zci54b3IxMjggPSB4b3IxMjg7XG5zci54b3J3b3cgPSB4b3J3b3c7XG5zci54b3JzaGlmdDcgPSB4b3JzaGlmdDc7XG5zci54b3I0MDk2ID0geG9yNDA5NjtcbnNyLnR5Y2hlaSA9IHR5Y2hlaTtcblxubW9kdWxlLmV4cG9ydHMgPSBzcjtcbiIsIi8vIEEgcG9ydCBvZiBhbiBhbGdvcml0aG0gYnkgSm9oYW5uZXMgQmFhZ8O4ZSA8YmFhZ29lQGJhYWdvZS5jb20+LCAyMDEwXG4vLyBodHRwOi8vYmFhZ29lLmNvbS9lbi9SYW5kb21NdXNpbmdzL2phdmFzY3JpcHQvXG4vLyBodHRwczovL2dpdGh1Yi5jb20vbnF1aW5sYW4vYmV0dGVyLXJhbmRvbS1udW1iZXJzLWZvci1qYXZhc2NyaXB0LW1pcnJvclxuLy8gT3JpZ2luYWwgd29yayBpcyB1bmRlciBNSVQgbGljZW5zZSAtXG5cbi8vIENvcHlyaWdodCAoQykgMjAxMCBieSBKb2hhbm5lcyBCYWFnw7hlIDxiYWFnb2VAYmFhZ29lLm9yZz5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vLyBcbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vIFxuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cblxuXG4oZnVuY3Rpb24oZ2xvYmFsLCBtb2R1bGUsIGRlZmluZSkge1xuXG5mdW5jdGlvbiBBbGVhKHNlZWQpIHtcbiAgdmFyIG1lID0gdGhpcywgbWFzaCA9IE1hc2goKTtcblxuICBtZS5uZXh0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHQgPSAyMDkxNjM5ICogbWUuczAgKyBtZS5jICogMi4zMjgzMDY0MzY1Mzg2OTYzZS0xMDsgLy8gMl4tMzJcbiAgICBtZS5zMCA9IG1lLnMxO1xuICAgIG1lLnMxID0gbWUuczI7XG4gICAgcmV0dXJuIG1lLnMyID0gdCAtIChtZS5jID0gdCB8IDApO1xuICB9O1xuXG4gIC8vIEFwcGx5IHRoZSBzZWVkaW5nIGFsZ29yaXRobSBmcm9tIEJhYWdvZS5cbiAgbWUuYyA9IDE7XG4gIG1lLnMwID0gbWFzaCgnICcpO1xuICBtZS5zMSA9IG1hc2goJyAnKTtcbiAgbWUuczIgPSBtYXNoKCcgJyk7XG4gIG1lLnMwIC09IG1hc2goc2VlZCk7XG4gIGlmIChtZS5zMCA8IDApIHsgbWUuczAgKz0gMTsgfVxuICBtZS5zMSAtPSBtYXNoKHNlZWQpO1xuICBpZiAobWUuczEgPCAwKSB7IG1lLnMxICs9IDE7IH1cbiAgbWUuczIgLT0gbWFzaChzZWVkKTtcbiAgaWYgKG1lLnMyIDwgMCkgeyBtZS5zMiArPSAxOyB9XG4gIG1hc2ggPSBudWxsO1xufVxuXG5mdW5jdGlvbiBjb3B5KGYsIHQpIHtcbiAgdC5jID0gZi5jO1xuICB0LnMwID0gZi5zMDtcbiAgdC5zMSA9IGYuczE7XG4gIHQuczIgPSBmLnMyO1xuICByZXR1cm4gdDtcbn1cblxuZnVuY3Rpb24gaW1wbChzZWVkLCBvcHRzKSB7XG4gIHZhciB4ZyA9IG5ldyBBbGVhKHNlZWQpLFxuICAgICAgc3RhdGUgPSBvcHRzICYmIG9wdHMuc3RhdGUsXG4gICAgICBwcm5nID0geGcubmV4dDtcbiAgcHJuZy5pbnQzMiA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gKHhnLm5leHQoKSAqIDB4MTAwMDAwMDAwKSB8IDA7IH1cbiAgcHJuZy5kb3VibGUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gcHJuZygpICsgKHBybmcoKSAqIDB4MjAwMDAwIHwgMCkgKiAxLjExMDIyMzAyNDYyNTE1NjVlLTE2OyAvLyAyXi01M1xuICB9O1xuICBwcm5nLnF1aWNrID0gcHJuZztcbiAgaWYgKHN0YXRlKSB7XG4gICAgaWYgKHR5cGVvZihzdGF0ZSkgPT0gJ29iamVjdCcpIGNvcHkoc3RhdGUsIHhnKTtcbiAgICBwcm5nLnN0YXRlID0gZnVuY3Rpb24oKSB7IHJldHVybiBjb3B5KHhnLCB7fSk7IH1cbiAgfVxuICByZXR1cm4gcHJuZztcbn1cblxuZnVuY3Rpb24gTWFzaCgpIHtcbiAgdmFyIG4gPSAweGVmYzgyNDlkO1xuXG4gIHZhciBtYXNoID0gZnVuY3Rpb24oZGF0YSkge1xuICAgIGRhdGEgPSBkYXRhLnRvU3RyaW5nKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBuICs9IGRhdGEuY2hhckNvZGVBdChpKTtcbiAgICAgIHZhciBoID0gMC4wMjUxOTYwMzI4MjQxNjkzOCAqIG47XG4gICAgICBuID0gaCA+Pj4gMDtcbiAgICAgIGggLT0gbjtcbiAgICAgIGggKj0gbjtcbiAgICAgIG4gPSBoID4+PiAwO1xuICAgICAgaCAtPSBuO1xuICAgICAgbiArPSBoICogMHgxMDAwMDAwMDA7IC8vIDJeMzJcbiAgICB9XG4gICAgcmV0dXJuIChuID4+PiAwKSAqIDIuMzI4MzA2NDM2NTM4Njk2M2UtMTA7IC8vIDJeLTMyXG4gIH07XG5cbiAgcmV0dXJuIG1hc2g7XG59XG5cblxuaWYgKG1vZHVsZSAmJiBtb2R1bGUuZXhwb3J0cykge1xuICBtb2R1bGUuZXhwb3J0cyA9IGltcGw7XG59IGVsc2UgaWYgKGRlZmluZSAmJiBkZWZpbmUuYW1kKSB7XG4gIGRlZmluZShmdW5jdGlvbigpIHsgcmV0dXJuIGltcGw7IH0pO1xufSBlbHNlIHtcbiAgdGhpcy5hbGVhID0gaW1wbDtcbn1cblxufSkoXG4gIHRoaXMsXG4gICh0eXBlb2YgbW9kdWxlKSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUsICAgIC8vIHByZXNlbnQgaW4gbm9kZS5qc1xuICAodHlwZW9mIGRlZmluZSkgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUgICAvLyBwcmVzZW50IHdpdGggYW4gQU1EIGxvYWRlclxuKTtcblxuXG4iLCIvLyBBIEphdmFzY3JpcHQgaW1wbGVtZW50YWlvbiBvZiB0aGUgXCJUeWNoZS1pXCIgcHJuZyBhbGdvcml0aG0gYnlcbi8vIFNhbXVlbCBOZXZlcyBhbmQgRmlsaXBlIEFyYXVqby5cbi8vIFNlZSBodHRwczovL2VkZW4uZGVpLnVjLnB0L35zbmV2ZXMvcHVicy8yMDExLXNuZmEyLnBkZlxuXG4oZnVuY3Rpb24oZ2xvYmFsLCBtb2R1bGUsIGRlZmluZSkge1xuXG5mdW5jdGlvbiBYb3JHZW4oc2VlZCkge1xuICB2YXIgbWUgPSB0aGlzLCBzdHJzZWVkID0gJyc7XG5cbiAgLy8gU2V0IHVwIGdlbmVyYXRvciBmdW5jdGlvbi5cbiAgbWUubmV4dCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBiID0gbWUuYiwgYyA9IG1lLmMsIGQgPSBtZS5kLCBhID0gbWUuYTtcbiAgICBiID0gKGIgPDwgMjUpIF4gKGIgPj4+IDcpIF4gYztcbiAgICBjID0gKGMgLSBkKSB8IDA7XG4gICAgZCA9IChkIDw8IDI0KSBeIChkID4+PiA4KSBeIGE7XG4gICAgYSA9IChhIC0gYikgfCAwO1xuICAgIG1lLmIgPSBiID0gKGIgPDwgMjApIF4gKGIgPj4+IDEyKSBeIGM7XG4gICAgbWUuYyA9IGMgPSAoYyAtIGQpIHwgMDtcbiAgICBtZS5kID0gKGQgPDwgMTYpIF4gKGMgPj4+IDE2KSBeIGE7XG4gICAgcmV0dXJuIG1lLmEgPSAoYSAtIGIpIHwgMDtcbiAgfTtcblxuICAvKiBUaGUgZm9sbG93aW5nIGlzIG5vbi1pbnZlcnRlZCB0eWNoZSwgd2hpY2ggaGFzIGJldHRlciBpbnRlcm5hbFxuICAgKiBiaXQgZGlmZnVzaW9uLCBidXQgd2hpY2ggaXMgYWJvdXQgMjUlIHNsb3dlciB0aGFuIHR5Y2hlLWkgaW4gSlMuXG4gIG1lLm5leHQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgYSA9IG1lLmEsIGIgPSBtZS5iLCBjID0gbWUuYywgZCA9IG1lLmQ7XG4gICAgYSA9IChtZS5hICsgbWUuYiB8IDApID4+PiAwO1xuICAgIGQgPSBtZS5kIF4gYTsgZCA9IGQgPDwgMTYgXiBkID4+PiAxNjtcbiAgICBjID0gbWUuYyArIGQgfCAwO1xuICAgIGIgPSBtZS5iIF4gYzsgYiA9IGIgPDwgMTIgXiBkID4+PiAyMDtcbiAgICBtZS5hID0gYSA9IGEgKyBiIHwgMDtcbiAgICBkID0gZCBeIGE7IG1lLmQgPSBkID0gZCA8PCA4IF4gZCA+Pj4gMjQ7XG4gICAgbWUuYyA9IGMgPSBjICsgZCB8IDA7XG4gICAgYiA9IGIgXiBjO1xuICAgIHJldHVybiBtZS5iID0gKGIgPDwgNyBeIGIgPj4+IDI1KTtcbiAgfVxuICAqL1xuXG4gIG1lLmEgPSAwO1xuICBtZS5iID0gMDtcbiAgbWUuYyA9IDI2NTQ0MzU3NjkgfCAwO1xuICBtZS5kID0gMTM2NzEzMDU1MTtcblxuICBpZiAoc2VlZCA9PT0gTWF0aC5mbG9vcihzZWVkKSkge1xuICAgIC8vIEludGVnZXIgc2VlZC5cbiAgICBtZS5hID0gKHNlZWQgLyAweDEwMDAwMDAwMCkgfCAwO1xuICAgIG1lLmIgPSBzZWVkIHwgMDtcbiAgfSBlbHNlIHtcbiAgICAvLyBTdHJpbmcgc2VlZC5cbiAgICBzdHJzZWVkICs9IHNlZWQ7XG4gIH1cblxuICAvLyBNaXggaW4gc3RyaW5nIHNlZWQsIHRoZW4gZGlzY2FyZCBhbiBpbml0aWFsIGJhdGNoIG9mIDY0IHZhbHVlcy5cbiAgZm9yICh2YXIgayA9IDA7IGsgPCBzdHJzZWVkLmxlbmd0aCArIDIwOyBrKyspIHtcbiAgICBtZS5iIF49IHN0cnNlZWQuY2hhckNvZGVBdChrKSB8IDA7XG4gICAgbWUubmV4dCgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvcHkoZiwgdCkge1xuICB0LmEgPSBmLmE7XG4gIHQuYiA9IGYuYjtcbiAgdC5jID0gZi5jO1xuICB0LmQgPSBmLmQ7XG4gIHJldHVybiB0O1xufTtcblxuZnVuY3Rpb24gaW1wbChzZWVkLCBvcHRzKSB7XG4gIHZhciB4ZyA9IG5ldyBYb3JHZW4oc2VlZCksXG4gICAgICBzdGF0ZSA9IG9wdHMgJiYgb3B0cy5zdGF0ZSxcbiAgICAgIHBybmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuICh4Zy5uZXh0KCkgPj4+IDApIC8gMHgxMDAwMDAwMDA7IH07XG4gIHBybmcuZG91YmxlID0gZnVuY3Rpb24oKSB7XG4gICAgZG8ge1xuICAgICAgdmFyIHRvcCA9IHhnLm5leHQoKSA+Pj4gMTEsXG4gICAgICAgICAgYm90ID0gKHhnLm5leHQoKSA+Pj4gMCkgLyAweDEwMDAwMDAwMCxcbiAgICAgICAgICByZXN1bHQgPSAodG9wICsgYm90KSAvICgxIDw8IDIxKTtcbiAgICB9IHdoaWxlIChyZXN1bHQgPT09IDApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIHBybmcuaW50MzIgPSB4Zy5uZXh0O1xuICBwcm5nLnF1aWNrID0gcHJuZztcbiAgaWYgKHN0YXRlKSB7XG4gICAgaWYgKHR5cGVvZihzdGF0ZSkgPT0gJ29iamVjdCcpIGNvcHkoc3RhdGUsIHhnKTtcbiAgICBwcm5nLnN0YXRlID0gZnVuY3Rpb24oKSB7IHJldHVybiBjb3B5KHhnLCB7fSk7IH1cbiAgfVxuICByZXR1cm4gcHJuZztcbn1cblxuaWYgKG1vZHVsZSAmJiBtb2R1bGUuZXhwb3J0cykge1xuICBtb2R1bGUuZXhwb3J0cyA9IGltcGw7XG59IGVsc2UgaWYgKGRlZmluZSAmJiBkZWZpbmUuYW1kKSB7XG4gIGRlZmluZShmdW5jdGlvbigpIHsgcmV0dXJuIGltcGw7IH0pO1xufSBlbHNlIHtcbiAgdGhpcy50eWNoZWkgPSBpbXBsO1xufVxuXG59KShcbiAgdGhpcyxcbiAgKHR5cGVvZiBtb2R1bGUpID09ICdvYmplY3QnICYmIG1vZHVsZSwgICAgLy8gcHJlc2VudCBpbiBub2RlLmpzXG4gICh0eXBlb2YgZGVmaW5lKSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZSAgIC8vIHByZXNlbnQgd2l0aCBhbiBBTUQgbG9hZGVyXG4pO1xuXG5cbiIsIi8vIEEgSmF2YXNjcmlwdCBpbXBsZW1lbnRhaW9uIG9mIHRoZSBcInhvcjEyOFwiIHBybmcgYWxnb3JpdGhtIGJ5XG4vLyBHZW9yZ2UgTWFyc2FnbGlhLiAgU2VlIGh0dHA6Ly93d3cuanN0YXRzb2Z0Lm9yZy92MDgvaTE0L3BhcGVyXG5cbihmdW5jdGlvbihnbG9iYWwsIG1vZHVsZSwgZGVmaW5lKSB7XG5cbmZ1bmN0aW9uIFhvckdlbihzZWVkKSB7XG4gIHZhciBtZSA9IHRoaXMsIHN0cnNlZWQgPSAnJztcblxuICBtZS54ID0gMDtcbiAgbWUueSA9IDA7XG4gIG1lLnogPSAwO1xuICBtZS53ID0gMDtcblxuICAvLyBTZXQgdXAgZ2VuZXJhdG9yIGZ1bmN0aW9uLlxuICBtZS5uZXh0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHQgPSBtZS54IF4gKG1lLnggPDwgMTEpO1xuICAgIG1lLnggPSBtZS55O1xuICAgIG1lLnkgPSBtZS56O1xuICAgIG1lLnogPSBtZS53O1xuICAgIHJldHVybiBtZS53IF49IChtZS53ID4+PiAxOSkgXiB0IF4gKHQgPj4+IDgpO1xuICB9O1xuXG4gIGlmIChzZWVkID09PSAoc2VlZCB8IDApKSB7XG4gICAgLy8gSW50ZWdlciBzZWVkLlxuICAgIG1lLnggPSBzZWVkO1xuICB9IGVsc2Uge1xuICAgIC8vIFN0cmluZyBzZWVkLlxuICAgIHN0cnNlZWQgKz0gc2VlZDtcbiAgfVxuXG4gIC8vIE1peCBpbiBzdHJpbmcgc2VlZCwgdGhlbiBkaXNjYXJkIGFuIGluaXRpYWwgYmF0Y2ggb2YgNjQgdmFsdWVzLlxuICBmb3IgKHZhciBrID0gMDsgayA8IHN0cnNlZWQubGVuZ3RoICsgNjQ7IGsrKykge1xuICAgIG1lLnggXj0gc3Ryc2VlZC5jaGFyQ29kZUF0KGspIHwgMDtcbiAgICBtZS5uZXh0KCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29weShmLCB0KSB7XG4gIHQueCA9IGYueDtcbiAgdC55ID0gZi55O1xuICB0LnogPSBmLno7XG4gIHQudyA9IGYudztcbiAgcmV0dXJuIHQ7XG59XG5cbmZ1bmN0aW9uIGltcGwoc2VlZCwgb3B0cykge1xuICB2YXIgeGcgPSBuZXcgWG9yR2VuKHNlZWQpLFxuICAgICAgc3RhdGUgPSBvcHRzICYmIG9wdHMuc3RhdGUsXG4gICAgICBwcm5nID0gZnVuY3Rpb24oKSB7IHJldHVybiAoeGcubmV4dCgpID4+PiAwKSAvIDB4MTAwMDAwMDAwOyB9O1xuICBwcm5nLmRvdWJsZSA9IGZ1bmN0aW9uKCkge1xuICAgIGRvIHtcbiAgICAgIHZhciB0b3AgPSB4Zy5uZXh0KCkgPj4+IDExLFxuICAgICAgICAgIGJvdCA9ICh4Zy5uZXh0KCkgPj4+IDApIC8gMHgxMDAwMDAwMDAsXG4gICAgICAgICAgcmVzdWx0ID0gKHRvcCArIGJvdCkgLyAoMSA8PCAyMSk7XG4gICAgfSB3aGlsZSAocmVzdWx0ID09PSAwKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICBwcm5nLmludDMyID0geGcubmV4dDtcbiAgcHJuZy5xdWljayA9IHBybmc7XG4gIGlmIChzdGF0ZSkge1xuICAgIGlmICh0eXBlb2Yoc3RhdGUpID09ICdvYmplY3QnKSBjb3B5KHN0YXRlLCB4Zyk7XG4gICAgcHJuZy5zdGF0ZSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gY29weSh4Zywge30pOyB9XG4gIH1cbiAgcmV0dXJuIHBybmc7XG59XG5cbmlmIChtb2R1bGUgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBpbXBsO1xufSBlbHNlIGlmIChkZWZpbmUgJiYgZGVmaW5lLmFtZCkge1xuICBkZWZpbmUoZnVuY3Rpb24oKSB7IHJldHVybiBpbXBsOyB9KTtcbn0gZWxzZSB7XG4gIHRoaXMueG9yMTI4ID0gaW1wbDtcbn1cblxufSkoXG4gIHRoaXMsXG4gICh0eXBlb2YgbW9kdWxlKSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUsICAgIC8vIHByZXNlbnQgaW4gbm9kZS5qc1xuICAodHlwZW9mIGRlZmluZSkgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUgICAvLyBwcmVzZW50IHdpdGggYW4gQU1EIGxvYWRlclxuKTtcblxuXG4iLCIvLyBBIEphdmFzY3JpcHQgaW1wbGVtZW50YWlvbiBvZiBSaWNoYXJkIEJyZW50J3MgWG9yZ2VucyB4b3I0MDk2IGFsZ29yaXRobS5cbi8vXG4vLyBUaGlzIGZhc3Qgbm9uLWNyeXB0b2dyYXBoaWMgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgaXMgZGVzaWduZWQgZm9yXG4vLyB1c2UgaW4gTW9udGUtQ2FybG8gYWxnb3JpdGhtcy4gSXQgY29tYmluZXMgYSBsb25nLXBlcmlvZCB4b3JzaGlmdFxuLy8gZ2VuZXJhdG9yIHdpdGggYSBXZXlsIGdlbmVyYXRvciwgYW5kIGl0IHBhc3NlcyBhbGwgY29tbW9uIGJhdHRlcmllc1xuLy8gb2Ygc3Rhc3RpY2lhbCB0ZXN0cyBmb3IgcmFuZG9tbmVzcyB3aGlsZSBjb25zdW1pbmcgb25seSBhIGZldyBuYW5vc2Vjb25kc1xuLy8gZm9yIGVhY2ggcHJuZyBnZW5lcmF0ZWQuICBGb3IgYmFja2dyb3VuZCBvbiB0aGUgZ2VuZXJhdG9yLCBzZWUgQnJlbnQnc1xuLy8gcGFwZXI6IFwiU29tZSBsb25nLXBlcmlvZCByYW5kb20gbnVtYmVyIGdlbmVyYXRvcnMgdXNpbmcgc2hpZnRzIGFuZCB4b3JzLlwiXG4vLyBodHRwOi8vYXJ4aXYub3JnL3BkZi8xMDA0LjMxMTV2MS5wZGZcbi8vXG4vLyBVc2FnZTpcbi8vXG4vLyB2YXIgeG9yNDA5NiA9IHJlcXVpcmUoJ3hvcjQwOTYnKTtcbi8vIHJhbmRvbSA9IHhvcjQwOTYoMSk7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VlZCB3aXRoIGludDMyIG9yIHN0cmluZy5cbi8vIGFzc2VydC5lcXVhbChyYW5kb20oKSwgMC4xNTIwNDM2NDUwNTM4NTQ3KTsgLy8gKDAsIDEpIHJhbmdlLCA1MyBiaXRzLlxuLy8gYXNzZXJ0LmVxdWFsKHJhbmRvbS5pbnQzMigpLCAxODA2NTM0ODk3KTsgICAvLyBzaWduZWQgaW50MzIsIDMyIGJpdHMuXG4vL1xuLy8gRm9yIG5vbnplcm8gbnVtZXJpYyBrZXlzLCB0aGlzIGltcGVsZW1lbnRhdGlvbiBwcm92aWRlcyBhIHNlcXVlbmNlXG4vLyBpZGVudGljYWwgdG8gdGhhdCBieSBCcmVudCdzIHhvcmdlbnMgMyBpbXBsZW1lbnRhaW9uIGluIEMuICBUaGlzXG4vLyBpbXBsZW1lbnRhdGlvbiBhbHNvIHByb3ZpZGVzIGZvciBpbml0YWxpemluZyB0aGUgZ2VuZXJhdG9yIHdpdGhcbi8vIHN0cmluZyBzZWVkcywgb3IgZm9yIHNhdmluZyBhbmQgcmVzdG9yaW5nIHRoZSBzdGF0ZSBvZiB0aGUgZ2VuZXJhdG9yLlxuLy9cbi8vIE9uIENocm9tZSwgdGhpcyBwcm5nIGJlbmNobWFya3MgYWJvdXQgMi4xIHRpbWVzIHNsb3dlciB0aGFuXG4vLyBKYXZhc2NyaXB0J3MgYnVpbHQtaW4gTWF0aC5yYW5kb20oKS5cblxuKGZ1bmN0aW9uKGdsb2JhbCwgbW9kdWxlLCBkZWZpbmUpIHtcblxuZnVuY3Rpb24gWG9yR2VuKHNlZWQpIHtcbiAgdmFyIG1lID0gdGhpcztcblxuICAvLyBTZXQgdXAgZ2VuZXJhdG9yIGZ1bmN0aW9uLlxuICBtZS5uZXh0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHcgPSBtZS53LFxuICAgICAgICBYID0gbWUuWCwgaSA9IG1lLmksIHQsIHY7XG4gICAgLy8gVXBkYXRlIFdleWwgZ2VuZXJhdG9yLlxuICAgIG1lLncgPSB3ID0gKHcgKyAweDYxYzg4NjQ3KSB8IDA7XG4gICAgLy8gVXBkYXRlIHhvciBnZW5lcmF0b3IuXG4gICAgdiA9IFhbKGkgKyAzNCkgJiAxMjddO1xuICAgIHQgPSBYW2kgPSAoKGkgKyAxKSAmIDEyNyldO1xuICAgIHYgXj0gdiA8PCAxMztcbiAgICB0IF49IHQgPDwgMTc7XG4gICAgdiBePSB2ID4+PiAxNTtcbiAgICB0IF49IHQgPj4+IDEyO1xuICAgIC8vIFVwZGF0ZSBYb3IgZ2VuZXJhdG9yIGFycmF5IHN0YXRlLlxuICAgIHYgPSBYW2ldID0gdiBeIHQ7XG4gICAgbWUuaSA9IGk7XG4gICAgLy8gUmVzdWx0IGlzIHRoZSBjb21iaW5hdGlvbi5cbiAgICByZXR1cm4gKHYgKyAodyBeICh3ID4+PiAxNikpKSB8IDA7XG4gIH07XG5cbiAgZnVuY3Rpb24gaW5pdChtZSwgc2VlZCkge1xuICAgIHZhciB0LCB2LCBpLCBqLCB3LCBYID0gW10sIGxpbWl0ID0gMTI4O1xuICAgIGlmIChzZWVkID09PSAoc2VlZCB8IDApKSB7XG4gICAgICAvLyBOdW1lcmljIHNlZWRzIGluaXRpYWxpemUgdiwgd2hpY2ggaXMgdXNlZCB0byBnZW5lcmF0ZXMgWC5cbiAgICAgIHYgPSBzZWVkO1xuICAgICAgc2VlZCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFN0cmluZyBzZWVkcyBhcmUgbWl4ZWQgaW50byB2IGFuZCBYIG9uZSBjaGFyYWN0ZXIgYXQgYSB0aW1lLlxuICAgICAgc2VlZCA9IHNlZWQgKyAnXFwwJztcbiAgICAgIHYgPSAwO1xuICAgICAgbGltaXQgPSBNYXRoLm1heChsaW1pdCwgc2VlZC5sZW5ndGgpO1xuICAgIH1cbiAgICAvLyBJbml0aWFsaXplIGNpcmN1bGFyIGFycmF5IGFuZCB3ZXlsIHZhbHVlLlxuICAgIGZvciAoaSA9IDAsIGogPSAtMzI7IGogPCBsaW1pdDsgKytqKSB7XG4gICAgICAvLyBQdXQgdGhlIHVuaWNvZGUgY2hhcmFjdGVycyBpbnRvIHRoZSBhcnJheSwgYW5kIHNodWZmbGUgdGhlbS5cbiAgICAgIGlmIChzZWVkKSB2IF49IHNlZWQuY2hhckNvZGVBdCgoaiArIDMyKSAlIHNlZWQubGVuZ3RoKTtcbiAgICAgIC8vIEFmdGVyIDMyIHNodWZmbGVzLCB0YWtlIHYgYXMgdGhlIHN0YXJ0aW5nIHcgdmFsdWUuXG4gICAgICBpZiAoaiA9PT0gMCkgdyA9IHY7XG4gICAgICB2IF49IHYgPDwgMTA7XG4gICAgICB2IF49IHYgPj4+IDE1O1xuICAgICAgdiBePSB2IDw8IDQ7XG4gICAgICB2IF49IHYgPj4+IDEzO1xuICAgICAgaWYgKGogPj0gMCkge1xuICAgICAgICB3ID0gKHcgKyAweDYxYzg4NjQ3KSB8IDA7ICAgICAvLyBXZXlsLlxuICAgICAgICB0ID0gKFhbaiAmIDEyN10gXj0gKHYgKyB3KSk7ICAvLyBDb21iaW5lIHhvciBhbmQgd2V5bCB0byBpbml0IGFycmF5LlxuICAgICAgICBpID0gKDAgPT0gdCkgPyBpICsgMSA6IDA7ICAgICAvLyBDb3VudCB6ZXJvZXMuXG4gICAgICB9XG4gICAgfVxuICAgIC8vIFdlIGhhdmUgZGV0ZWN0ZWQgYWxsIHplcm9lczsgbWFrZSB0aGUga2V5IG5vbnplcm8uXG4gICAgaWYgKGkgPj0gMTI4KSB7XG4gICAgICBYWyhzZWVkICYmIHNlZWQubGVuZ3RoIHx8IDApICYgMTI3XSA9IC0xO1xuICAgIH1cbiAgICAvLyBSdW4gdGhlIGdlbmVyYXRvciA1MTIgdGltZXMgdG8gZnVydGhlciBtaXggdGhlIHN0YXRlIGJlZm9yZSB1c2luZyBpdC5cbiAgICAvLyBGYWN0b3JpbmcgdGhpcyBhcyBhIGZ1bmN0aW9uIHNsb3dzIHRoZSBtYWluIGdlbmVyYXRvciwgc28gaXQgaXMganVzdFxuICAgIC8vIHVucm9sbGVkIGhlcmUuICBUaGUgd2V5bCBnZW5lcmF0b3IgaXMgbm90IGFkdmFuY2VkIHdoaWxlIHdhcm1pbmcgdXAuXG4gICAgaSA9IDEyNztcbiAgICBmb3IgKGogPSA0ICogMTI4OyBqID4gMDsgLS1qKSB7XG4gICAgICB2ID0gWFsoaSArIDM0KSAmIDEyN107XG4gICAgICB0ID0gWFtpID0gKChpICsgMSkgJiAxMjcpXTtcbiAgICAgIHYgXj0gdiA8PCAxMztcbiAgICAgIHQgXj0gdCA8PCAxNztcbiAgICAgIHYgXj0gdiA+Pj4gMTU7XG4gICAgICB0IF49IHQgPj4+IDEyO1xuICAgICAgWFtpXSA9IHYgXiB0O1xuICAgIH1cbiAgICAvLyBTdG9yaW5nIHN0YXRlIGFzIG9iamVjdCBtZW1iZXJzIGlzIGZhc3RlciB0aGFuIHVzaW5nIGNsb3N1cmUgdmFyaWFibGVzLlxuICAgIG1lLncgPSB3O1xuICAgIG1lLlggPSBYO1xuICAgIG1lLmkgPSBpO1xuICB9XG5cbiAgaW5pdChtZSwgc2VlZCk7XG59XG5cbmZ1bmN0aW9uIGNvcHkoZiwgdCkge1xuICB0LmkgPSBmLmk7XG4gIHQudyA9IGYudztcbiAgdC5YID0gZi5YLnNsaWNlKCk7XG4gIHJldHVybiB0O1xufTtcblxuZnVuY3Rpb24gaW1wbChzZWVkLCBvcHRzKSB7XG4gIGlmIChzZWVkID09IG51bGwpIHNlZWQgPSArKG5ldyBEYXRlKTtcbiAgdmFyIHhnID0gbmV3IFhvckdlbihzZWVkKSxcbiAgICAgIHN0YXRlID0gb3B0cyAmJiBvcHRzLnN0YXRlLFxuICAgICAgcHJuZyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gKHhnLm5leHQoKSA+Pj4gMCkgLyAweDEwMDAwMDAwMDsgfTtcbiAgcHJuZy5kb3VibGUgPSBmdW5jdGlvbigpIHtcbiAgICBkbyB7XG4gICAgICB2YXIgdG9wID0geGcubmV4dCgpID4+PiAxMSxcbiAgICAgICAgICBib3QgPSAoeGcubmV4dCgpID4+PiAwKSAvIDB4MTAwMDAwMDAwLFxuICAgICAgICAgIHJlc3VsdCA9ICh0b3AgKyBib3QpIC8gKDEgPDwgMjEpO1xuICAgIH0gd2hpbGUgKHJlc3VsdCA9PT0gMCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgcHJuZy5pbnQzMiA9IHhnLm5leHQ7XG4gIHBybmcucXVpY2sgPSBwcm5nO1xuICBpZiAoc3RhdGUpIHtcbiAgICBpZiAoc3RhdGUuWCkgY29weShzdGF0ZSwgeGcpO1xuICAgIHBybmcuc3RhdGUgPSBmdW5jdGlvbigpIHsgcmV0dXJuIGNvcHkoeGcsIHt9KTsgfVxuICB9XG4gIHJldHVybiBwcm5nO1xufVxuXG5pZiAobW9kdWxlICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gaW1wbDtcbn0gZWxzZSBpZiAoZGVmaW5lICYmIGRlZmluZS5hbWQpIHtcbiAgZGVmaW5lKGZ1bmN0aW9uKCkgeyByZXR1cm4gaW1wbDsgfSk7XG59IGVsc2Uge1xuICB0aGlzLnhvcjQwOTYgPSBpbXBsO1xufVxuXG59KShcbiAgdGhpcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2luZG93IG9iamVjdCBvciBnbG9iYWxcbiAgKHR5cGVvZiBtb2R1bGUpID09ICdvYmplY3QnICYmIG1vZHVsZSwgICAgLy8gcHJlc2VudCBpbiBub2RlLmpzXG4gICh0eXBlb2YgZGVmaW5lKSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZSAgIC8vIHByZXNlbnQgd2l0aCBhbiBBTUQgbG9hZGVyXG4pO1xuIiwiLy8gQSBKYXZhc2NyaXB0IGltcGxlbWVudGFpb24gb2YgdGhlIFwieG9yc2hpZnQ3XCIgYWxnb3JpdGhtIGJ5XG4vLyBGcmFuw6dvaXMgUGFubmV0b24gYW5kIFBpZXJyZSBMJ2VjdXllcjpcbi8vIFwiT24gdGhlIFhvcmdzaGlmdCBSYW5kb20gTnVtYmVyIEdlbmVyYXRvcnNcIlxuLy8gaHR0cDovL3NhbHVjLmVuZ3IudWNvbm4uZWR1L3JlZnMvY3J5cHRvL3JuZy9wYW5uZXRvbjA1b250aGV4b3JzaGlmdC5wZGZcblxuKGZ1bmN0aW9uKGdsb2JhbCwgbW9kdWxlLCBkZWZpbmUpIHtcblxuZnVuY3Rpb24gWG9yR2VuKHNlZWQpIHtcbiAgdmFyIG1lID0gdGhpcztcblxuICAvLyBTZXQgdXAgZ2VuZXJhdG9yIGZ1bmN0aW9uLlxuICBtZS5uZXh0ID0gZnVuY3Rpb24oKSB7XG4gICAgLy8gVXBkYXRlIHhvciBnZW5lcmF0b3IuXG4gICAgdmFyIFggPSBtZS54LCBpID0gbWUuaSwgdCwgdiwgdztcbiAgICB0ID0gWFtpXTsgdCBePSAodCA+Pj4gNyk7IHYgPSB0IF4gKHQgPDwgMjQpO1xuICAgIHQgPSBYWyhpICsgMSkgJiA3XTsgdiBePSB0IF4gKHQgPj4+IDEwKTtcbiAgICB0ID0gWFsoaSArIDMpICYgN107IHYgXj0gdCBeICh0ID4+PiAzKTtcbiAgICB0ID0gWFsoaSArIDQpICYgN107IHYgXj0gdCBeICh0IDw8IDcpO1xuICAgIHQgPSBYWyhpICsgNykgJiA3XTsgdCA9IHQgXiAodCA8PCAxMyk7IHYgXj0gdCBeICh0IDw8IDkpO1xuICAgIFhbaV0gPSB2O1xuICAgIG1lLmkgPSAoaSArIDEpICYgNztcbiAgICByZXR1cm4gdjtcbiAgfTtcblxuICBmdW5jdGlvbiBpbml0KG1lLCBzZWVkKSB7XG4gICAgdmFyIGosIHcsIFggPSBbXTtcblxuICAgIGlmIChzZWVkID09PSAoc2VlZCB8IDApKSB7XG4gICAgICAvLyBTZWVkIHN0YXRlIGFycmF5IHVzaW5nIGEgMzItYml0IGludGVnZXIuXG4gICAgICB3ID0gWFswXSA9IHNlZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNlZWQgc3RhdGUgdXNpbmcgYSBzdHJpbmcuXG4gICAgICBzZWVkID0gJycgKyBzZWVkO1xuICAgICAgZm9yIChqID0gMDsgaiA8IHNlZWQubGVuZ3RoOyArK2opIHtcbiAgICAgICAgWFtqICYgN10gPSAoWFtqICYgN10gPDwgMTUpIF5cbiAgICAgICAgICAgIChzZWVkLmNoYXJDb2RlQXQoaikgKyBYWyhqICsgMSkgJiA3XSA8PCAxMyk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEVuZm9yY2UgYW4gYXJyYXkgbGVuZ3RoIG9mIDgsIG5vdCBhbGwgemVyb2VzLlxuICAgIHdoaWxlIChYLmxlbmd0aCA8IDgpIFgucHVzaCgwKTtcbiAgICBmb3IgKGogPSAwOyBqIDwgOCAmJiBYW2pdID09PSAwOyArK2opO1xuICAgIGlmIChqID09IDgpIHcgPSBYWzddID0gLTE7IGVsc2UgdyA9IFhbal07XG5cbiAgICBtZS54ID0gWDtcbiAgICBtZS5pID0gMDtcblxuICAgIC8vIERpc2NhcmQgYW4gaW5pdGlhbCAyNTYgdmFsdWVzLlxuICAgIGZvciAoaiA9IDI1NjsgaiA+IDA7IC0taikge1xuICAgICAgbWUubmV4dCgpO1xuICAgIH1cbiAgfVxuXG4gIGluaXQobWUsIHNlZWQpO1xufVxuXG5mdW5jdGlvbiBjb3B5KGYsIHQpIHtcbiAgdC54ID0gZi54LnNsaWNlKCk7XG4gIHQuaSA9IGYuaTtcbiAgcmV0dXJuIHQ7XG59XG5cbmZ1bmN0aW9uIGltcGwoc2VlZCwgb3B0cykge1xuICBpZiAoc2VlZCA9PSBudWxsKSBzZWVkID0gKyhuZXcgRGF0ZSk7XG4gIHZhciB4ZyA9IG5ldyBYb3JHZW4oc2VlZCksXG4gICAgICBzdGF0ZSA9IG9wdHMgJiYgb3B0cy5zdGF0ZSxcbiAgICAgIHBybmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuICh4Zy5uZXh0KCkgPj4+IDApIC8gMHgxMDAwMDAwMDA7IH07XG4gIHBybmcuZG91YmxlID0gZnVuY3Rpb24oKSB7XG4gICAgZG8ge1xuICAgICAgdmFyIHRvcCA9IHhnLm5leHQoKSA+Pj4gMTEsXG4gICAgICAgICAgYm90ID0gKHhnLm5leHQoKSA+Pj4gMCkgLyAweDEwMDAwMDAwMCxcbiAgICAgICAgICByZXN1bHQgPSAodG9wICsgYm90KSAvICgxIDw8IDIxKTtcbiAgICB9IHdoaWxlIChyZXN1bHQgPT09IDApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIHBybmcuaW50MzIgPSB4Zy5uZXh0O1xuICBwcm5nLnF1aWNrID0gcHJuZztcbiAgaWYgKHN0YXRlKSB7XG4gICAgaWYgKHN0YXRlLngpIGNvcHkoc3RhdGUsIHhnKTtcbiAgICBwcm5nLnN0YXRlID0gZnVuY3Rpb24oKSB7IHJldHVybiBjb3B5KHhnLCB7fSk7IH1cbiAgfVxuICByZXR1cm4gcHJuZztcbn1cblxuaWYgKG1vZHVsZSAmJiBtb2R1bGUuZXhwb3J0cykge1xuICBtb2R1bGUuZXhwb3J0cyA9IGltcGw7XG59IGVsc2UgaWYgKGRlZmluZSAmJiBkZWZpbmUuYW1kKSB7XG4gIGRlZmluZShmdW5jdGlvbigpIHsgcmV0dXJuIGltcGw7IH0pO1xufSBlbHNlIHtcbiAgdGhpcy54b3JzaGlmdDcgPSBpbXBsO1xufVxuXG59KShcbiAgdGhpcyxcbiAgKHR5cGVvZiBtb2R1bGUpID09ICdvYmplY3QnICYmIG1vZHVsZSwgICAgLy8gcHJlc2VudCBpbiBub2RlLmpzXG4gICh0eXBlb2YgZGVmaW5lKSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZSAgIC8vIHByZXNlbnQgd2l0aCBhbiBBTUQgbG9hZGVyXG4pO1xuXG4iLCIvLyBBIEphdmFzY3JpcHQgaW1wbGVtZW50YWlvbiBvZiB0aGUgXCJ4b3J3b3dcIiBwcm5nIGFsZ29yaXRobSBieVxuLy8gR2VvcmdlIE1hcnNhZ2xpYS4gIFNlZSBodHRwOi8vd3d3LmpzdGF0c29mdC5vcmcvdjA4L2kxNC9wYXBlclxuXG4oZnVuY3Rpb24oZ2xvYmFsLCBtb2R1bGUsIGRlZmluZSkge1xuXG5mdW5jdGlvbiBYb3JHZW4oc2VlZCkge1xuICB2YXIgbWUgPSB0aGlzLCBzdHJzZWVkID0gJyc7XG5cbiAgLy8gU2V0IHVwIGdlbmVyYXRvciBmdW5jdGlvbi5cbiAgbWUubmV4dCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0ID0gKG1lLnggXiAobWUueCA+Pj4gMikpO1xuICAgIG1lLnggPSBtZS55OyBtZS55ID0gbWUuejsgbWUueiA9IG1lLnc7IG1lLncgPSBtZS52O1xuICAgIHJldHVybiAobWUuZCA9IChtZS5kICsgMzYyNDM3IHwgMCkpICtcbiAgICAgICAobWUudiA9IChtZS52IF4gKG1lLnYgPDwgNCkpIF4gKHQgXiAodCA8PCAxKSkpIHwgMDtcbiAgfTtcblxuICBtZS54ID0gMDtcbiAgbWUueSA9IDA7XG4gIG1lLnogPSAwO1xuICBtZS53ID0gMDtcbiAgbWUudiA9IDA7XG5cbiAgaWYgKHNlZWQgPT09IChzZWVkIHwgMCkpIHtcbiAgICAvLyBJbnRlZ2VyIHNlZWQuXG4gICAgbWUueCA9IHNlZWQ7XG4gIH0gZWxzZSB7XG4gICAgLy8gU3RyaW5nIHNlZWQuXG4gICAgc3Ryc2VlZCArPSBzZWVkO1xuICB9XG5cbiAgLy8gTWl4IGluIHN0cmluZyBzZWVkLCB0aGVuIGRpc2NhcmQgYW4gaW5pdGlhbCBiYXRjaCBvZiA2NCB2YWx1ZXMuXG4gIGZvciAodmFyIGsgPSAwOyBrIDwgc3Ryc2VlZC5sZW5ndGggKyA2NDsgaysrKSB7XG4gICAgbWUueCBePSBzdHJzZWVkLmNoYXJDb2RlQXQoaykgfCAwO1xuICAgIGlmIChrID09IHN0cnNlZWQubGVuZ3RoKSB7XG4gICAgICBtZS5kID0gbWUueCA8PCAxMCBeIG1lLnggPj4+IDQ7XG4gICAgfVxuICAgIG1lLm5leHQoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb3B5KGYsIHQpIHtcbiAgdC54ID0gZi54O1xuICB0LnkgPSBmLnk7XG4gIHQueiA9IGYuejtcbiAgdC53ID0gZi53O1xuICB0LnYgPSBmLnY7XG4gIHQuZCA9IGYuZDtcbiAgcmV0dXJuIHQ7XG59XG5cbmZ1bmN0aW9uIGltcGwoc2VlZCwgb3B0cykge1xuICB2YXIgeGcgPSBuZXcgWG9yR2VuKHNlZWQpLFxuICAgICAgc3RhdGUgPSBvcHRzICYmIG9wdHMuc3RhdGUsXG4gICAgICBwcm5nID0gZnVuY3Rpb24oKSB7IHJldHVybiAoeGcubmV4dCgpID4+PiAwKSAvIDB4MTAwMDAwMDAwOyB9O1xuICBwcm5nLmRvdWJsZSA9IGZ1bmN0aW9uKCkge1xuICAgIGRvIHtcbiAgICAgIHZhciB0b3AgPSB4Zy5uZXh0KCkgPj4+IDExLFxuICAgICAgICAgIGJvdCA9ICh4Zy5uZXh0KCkgPj4+IDApIC8gMHgxMDAwMDAwMDAsXG4gICAgICAgICAgcmVzdWx0ID0gKHRvcCArIGJvdCkgLyAoMSA8PCAyMSk7XG4gICAgfSB3aGlsZSAocmVzdWx0ID09PSAwKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICBwcm5nLmludDMyID0geGcubmV4dDtcbiAgcHJuZy5xdWljayA9IHBybmc7XG4gIGlmIChzdGF0ZSkge1xuICAgIGlmICh0eXBlb2Yoc3RhdGUpID09ICdvYmplY3QnKSBjb3B5KHN0YXRlLCB4Zyk7XG4gICAgcHJuZy5zdGF0ZSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gY29weSh4Zywge30pOyB9XG4gIH1cbiAgcmV0dXJuIHBybmc7XG59XG5cbmlmIChtb2R1bGUgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBpbXBsO1xufSBlbHNlIGlmIChkZWZpbmUgJiYgZGVmaW5lLmFtZCkge1xuICBkZWZpbmUoZnVuY3Rpb24oKSB7IHJldHVybiBpbXBsOyB9KTtcbn0gZWxzZSB7XG4gIHRoaXMueG9yd293ID0gaW1wbDtcbn1cblxufSkoXG4gIHRoaXMsXG4gICh0eXBlb2YgbW9kdWxlKSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUsICAgIC8vIHByZXNlbnQgaW4gbm9kZS5qc1xuICAodHlwZW9mIGRlZmluZSkgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUgICAvLyBwcmVzZW50IHdpdGggYW4gQU1EIGxvYWRlclxuKTtcblxuXG4iLCIvKlxuQ29weXJpZ2h0IDIwMTQgRGF2aWQgQmF1LlxuXG5QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmdcbmEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG53aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG5kaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG9cbnBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0b1xudGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG5UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZVxuaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsXG5FWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbk1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC5cbklOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZXG5DTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULFxuVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEVcblNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4qL1xuXG4oZnVuY3Rpb24gKHBvb2wsIG1hdGgpIHtcbi8vXG4vLyBUaGUgZm9sbG93aW5nIGNvbnN0YW50cyBhcmUgcmVsYXRlZCB0byBJRUVFIDc1NCBsaW1pdHMuXG4vL1xudmFyIGdsb2JhbCA9IHRoaXMsXG4gICAgd2lkdGggPSAyNTYsICAgICAgICAvLyBlYWNoIFJDNCBvdXRwdXQgaXMgMCA8PSB4IDwgMjU2XG4gICAgY2h1bmtzID0gNiwgICAgICAgICAvLyBhdCBsZWFzdCBzaXggUkM0IG91dHB1dHMgZm9yIGVhY2ggZG91YmxlXG4gICAgZGlnaXRzID0gNTIsICAgICAgICAvLyB0aGVyZSBhcmUgNTIgc2lnbmlmaWNhbnQgZGlnaXRzIGluIGEgZG91YmxlXG4gICAgcm5nbmFtZSA9ICdyYW5kb20nLCAvLyBybmduYW1lOiBuYW1lIGZvciBNYXRoLnJhbmRvbSBhbmQgTWF0aC5zZWVkcmFuZG9tXG4gICAgc3RhcnRkZW5vbSA9IG1hdGgucG93KHdpZHRoLCBjaHVua3MpLFxuICAgIHNpZ25pZmljYW5jZSA9IG1hdGgucG93KDIsIGRpZ2l0cyksXG4gICAgb3ZlcmZsb3cgPSBzaWduaWZpY2FuY2UgKiAyLFxuICAgIG1hc2sgPSB3aWR0aCAtIDEsXG4gICAgbm9kZWNyeXB0bzsgICAgICAgICAvLyBub2RlLmpzIGNyeXB0byBtb2R1bGUsIGluaXRpYWxpemVkIGF0IHRoZSBib3R0b20uXG5cbi8vXG4vLyBzZWVkcmFuZG9tKClcbi8vIFRoaXMgaXMgdGhlIHNlZWRyYW5kb20gZnVuY3Rpb24gZGVzY3JpYmVkIGFib3ZlLlxuLy9cbmZ1bmN0aW9uIHNlZWRyYW5kb20oc2VlZCwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgdmFyIGtleSA9IFtdO1xuICBvcHRpb25zID0gKG9wdGlvbnMgPT0gdHJ1ZSkgPyB7IGVudHJvcHk6IHRydWUgfSA6IChvcHRpb25zIHx8IHt9KTtcblxuICAvLyBGbGF0dGVuIHRoZSBzZWVkIHN0cmluZyBvciBidWlsZCBvbmUgZnJvbSBsb2NhbCBlbnRyb3B5IGlmIG5lZWRlZC5cbiAgdmFyIHNob3J0c2VlZCA9IG1peGtleShmbGF0dGVuKFxuICAgIG9wdGlvbnMuZW50cm9weSA/IFtzZWVkLCB0b3N0cmluZyhwb29sKV0gOlxuICAgIChzZWVkID09IG51bGwpID8gYXV0b3NlZWQoKSA6IHNlZWQsIDMpLCBrZXkpO1xuXG4gIC8vIFVzZSB0aGUgc2VlZCB0byBpbml0aWFsaXplIGFuIEFSQzQgZ2VuZXJhdG9yLlxuICB2YXIgYXJjNCA9IG5ldyBBUkM0KGtleSk7XG5cbiAgLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcmFuZG9tIGRvdWJsZSBpbiBbMCwgMSkgdGhhdCBjb250YWluc1xuICAvLyByYW5kb21uZXNzIGluIGV2ZXJ5IGJpdCBvZiB0aGUgbWFudGlzc2Egb2YgdGhlIElFRUUgNzU0IHZhbHVlLlxuICB2YXIgcHJuZyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBuID0gYXJjNC5nKGNodW5rcyksICAgICAgICAgICAgIC8vIFN0YXJ0IHdpdGggYSBudW1lcmF0b3IgbiA8IDIgXiA0OFxuICAgICAgICBkID0gc3RhcnRkZW5vbSwgICAgICAgICAgICAgICAgIC8vICAgYW5kIGRlbm9taW5hdG9yIGQgPSAyIF4gNDguXG4gICAgICAgIHggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBhbmQgbm8gJ2V4dHJhIGxhc3QgYnl0ZScuXG4gICAgd2hpbGUgKG4gPCBzaWduaWZpY2FuY2UpIHsgICAgICAgICAgLy8gRmlsbCB1cCBhbGwgc2lnbmlmaWNhbnQgZGlnaXRzIGJ5XG4gICAgICBuID0gKG4gKyB4KSAqIHdpZHRoOyAgICAgICAgICAgICAgLy8gICBzaGlmdGluZyBudW1lcmF0b3IgYW5kXG4gICAgICBkICo9IHdpZHRoOyAgICAgICAgICAgICAgICAgICAgICAgLy8gICBkZW5vbWluYXRvciBhbmQgZ2VuZXJhdGluZyBhXG4gICAgICB4ID0gYXJjNC5nKDEpOyAgICAgICAgICAgICAgICAgICAgLy8gICBuZXcgbGVhc3Qtc2lnbmlmaWNhbnQtYnl0ZS5cbiAgICB9XG4gICAgd2hpbGUgKG4gPj0gb3ZlcmZsb3cpIHsgICAgICAgICAgICAgLy8gVG8gYXZvaWQgcm91bmRpbmcgdXAsIGJlZm9yZSBhZGRpbmdcbiAgICAgIG4gLz0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGxhc3QgYnl0ZSwgc2hpZnQgZXZlcnl0aGluZ1xuICAgICAgZCAvPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgcmlnaHQgdXNpbmcgaW50ZWdlciBtYXRoIHVudGlsXG4gICAgICB4ID4+Pj0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICB3ZSBoYXZlIGV4YWN0bHkgdGhlIGRlc2lyZWQgYml0cy5cbiAgICB9XG4gICAgcmV0dXJuIChuICsgeCkgLyBkOyAgICAgICAgICAgICAgICAgLy8gRm9ybSB0aGUgbnVtYmVyIHdpdGhpbiBbMCwgMSkuXG4gIH07XG5cbiAgcHJuZy5pbnQzMiA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJjNC5nKDQpIHwgMDsgfVxuICBwcm5nLnF1aWNrID0gZnVuY3Rpb24oKSB7IHJldHVybiBhcmM0LmcoNCkgLyAweDEwMDAwMDAwMDsgfVxuICBwcm5nLmRvdWJsZSA9IHBybmc7XG5cbiAgLy8gTWl4IHRoZSByYW5kb21uZXNzIGludG8gYWNjdW11bGF0ZWQgZW50cm9weS5cbiAgbWl4a2V5KHRvc3RyaW5nKGFyYzQuUyksIHBvb2wpO1xuXG4gIC8vIENhbGxpbmcgY29udmVudGlvbjogd2hhdCB0byByZXR1cm4gYXMgYSBmdW5jdGlvbiBvZiBwcm5nLCBzZWVkLCBpc19tYXRoLlxuICByZXR1cm4gKG9wdGlvbnMucGFzcyB8fCBjYWxsYmFjayB8fFxuICAgICAgZnVuY3Rpb24ocHJuZywgc2VlZCwgaXNfbWF0aF9jYWxsLCBzdGF0ZSkge1xuICAgICAgICBpZiAoc3RhdGUpIHtcbiAgICAgICAgICAvLyBMb2FkIHRoZSBhcmM0IHN0YXRlIGZyb20gdGhlIGdpdmVuIHN0YXRlIGlmIGl0IGhhcyBhbiBTIGFycmF5LlxuICAgICAgICAgIGlmIChzdGF0ZS5TKSB7IGNvcHkoc3RhdGUsIGFyYzQpOyB9XG4gICAgICAgICAgLy8gT25seSBwcm92aWRlIHRoZSAuc3RhdGUgbWV0aG9kIGlmIHJlcXVlc3RlZCB2aWEgb3B0aW9ucy5zdGF0ZS5cbiAgICAgICAgICBwcm5nLnN0YXRlID0gZnVuY3Rpb24oKSB7IHJldHVybiBjb3B5KGFyYzQsIHt9KTsgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgY2FsbGVkIGFzIGEgbWV0aG9kIG9mIE1hdGggKE1hdGguc2VlZHJhbmRvbSgpKSwgbXV0YXRlXG4gICAgICAgIC8vIE1hdGgucmFuZG9tIGJlY2F1c2UgdGhhdCBpcyBob3cgc2VlZHJhbmRvbS5qcyBoYXMgd29ya2VkIHNpbmNlIHYxLjAuXG4gICAgICAgIGlmIChpc19tYXRoX2NhbGwpIHsgbWF0aFtybmduYW1lXSA9IHBybmc7IHJldHVybiBzZWVkOyB9XG5cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCBpdCBpcyBhIG5ld2VyIGNhbGxpbmcgY29udmVudGlvbiwgc28gcmV0dXJuIHRoZVxuICAgICAgICAvLyBwcm5nIGRpcmVjdGx5LlxuICAgICAgICBlbHNlIHJldHVybiBwcm5nO1xuICAgICAgfSkoXG4gIHBybmcsXG4gIHNob3J0c2VlZCxcbiAgJ2dsb2JhbCcgaW4gb3B0aW9ucyA/IG9wdGlvbnMuZ2xvYmFsIDogKHRoaXMgPT0gbWF0aCksXG4gIG9wdGlvbnMuc3RhdGUpO1xufVxubWF0aFsnc2VlZCcgKyBybmduYW1lXSA9IHNlZWRyYW5kb207XG5cbi8vXG4vLyBBUkM0XG4vL1xuLy8gQW4gQVJDNCBpbXBsZW1lbnRhdGlvbi4gIFRoZSBjb25zdHJ1Y3RvciB0YWtlcyBhIGtleSBpbiB0aGUgZm9ybSBvZlxuLy8gYW4gYXJyYXkgb2YgYXQgbW9zdCAod2lkdGgpIGludGVnZXJzIHRoYXQgc2hvdWxkIGJlIDAgPD0geCA8ICh3aWR0aCkuXG4vL1xuLy8gVGhlIGcoY291bnQpIG1ldGhvZCByZXR1cm5zIGEgcHNldWRvcmFuZG9tIGludGVnZXIgdGhhdCBjb25jYXRlbmF0ZXNcbi8vIHRoZSBuZXh0IChjb3VudCkgb3V0cHV0cyBmcm9tIEFSQzQuICBJdHMgcmV0dXJuIHZhbHVlIGlzIGEgbnVtYmVyIHhcbi8vIHRoYXQgaXMgaW4gdGhlIHJhbmdlIDAgPD0geCA8ICh3aWR0aCBeIGNvdW50KS5cbi8vXG5mdW5jdGlvbiBBUkM0KGtleSkge1xuICB2YXIgdCwga2V5bGVuID0ga2V5Lmxlbmd0aCxcbiAgICAgIG1lID0gdGhpcywgaSA9IDAsIGogPSBtZS5pID0gbWUuaiA9IDAsIHMgPSBtZS5TID0gW107XG5cbiAgLy8gVGhlIGVtcHR5IGtleSBbXSBpcyB0cmVhdGVkIGFzIFswXS5cbiAgaWYgKCFrZXlsZW4pIHsga2V5ID0gW2tleWxlbisrXTsgfVxuXG4gIC8vIFNldCB1cCBTIHVzaW5nIHRoZSBzdGFuZGFyZCBrZXkgc2NoZWR1bGluZyBhbGdvcml0aG0uXG4gIHdoaWxlIChpIDwgd2lkdGgpIHtcbiAgICBzW2ldID0gaSsrO1xuICB9XG4gIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7XG4gICAgc1tpXSA9IHNbaiA9IG1hc2sgJiAoaiArIGtleVtpICUga2V5bGVuXSArICh0ID0gc1tpXSkpXTtcbiAgICBzW2pdID0gdDtcbiAgfVxuXG4gIC8vIFRoZSBcImdcIiBtZXRob2QgcmV0dXJucyB0aGUgbmV4dCAoY291bnQpIG91dHB1dHMgYXMgb25lIG51bWJlci5cbiAgKG1lLmcgPSBmdW5jdGlvbihjb3VudCkge1xuICAgIC8vIFVzaW5nIGluc3RhbmNlIG1lbWJlcnMgaW5zdGVhZCBvZiBjbG9zdXJlIHN0YXRlIG5lYXJseSBkb3VibGVzIHNwZWVkLlxuICAgIHZhciB0LCByID0gMCxcbiAgICAgICAgaSA9IG1lLmksIGogPSBtZS5qLCBzID0gbWUuUztcbiAgICB3aGlsZSAoY291bnQtLSkge1xuICAgICAgdCA9IHNbaSA9IG1hc2sgJiAoaSArIDEpXTtcbiAgICAgIHIgPSByICogd2lkdGggKyBzW21hc2sgJiAoKHNbaV0gPSBzW2ogPSBtYXNrICYgKGogKyB0KV0pICsgKHNbal0gPSB0KSldO1xuICAgIH1cbiAgICBtZS5pID0gaTsgbWUuaiA9IGo7XG4gICAgcmV0dXJuIHI7XG4gICAgLy8gRm9yIHJvYnVzdCB1bnByZWRpY3RhYmlsaXR5LCB0aGUgZnVuY3Rpb24gY2FsbCBiZWxvdyBhdXRvbWF0aWNhbGx5XG4gICAgLy8gZGlzY2FyZHMgYW4gaW5pdGlhbCBiYXRjaCBvZiB2YWx1ZXMuICBUaGlzIGlzIGNhbGxlZCBSQzQtZHJvcFsyNTZdLlxuICAgIC8vIFNlZSBodHRwOi8vZ29vZ2xlLmNvbS9zZWFyY2g/cT1yc2ErZmx1aHJlcityZXNwb25zZSZidG5JXG4gIH0pKHdpZHRoKTtcbn1cblxuLy9cbi8vIGNvcHkoKVxuLy8gQ29waWVzIGludGVybmFsIHN0YXRlIG9mIEFSQzQgdG8gb3IgZnJvbSBhIHBsYWluIG9iamVjdC5cbi8vXG5mdW5jdGlvbiBjb3B5KGYsIHQpIHtcbiAgdC5pID0gZi5pO1xuICB0LmogPSBmLmo7XG4gIHQuUyA9IGYuUy5zbGljZSgpO1xuICByZXR1cm4gdDtcbn07XG5cbi8vXG4vLyBmbGF0dGVuKClcbi8vIENvbnZlcnRzIGFuIG9iamVjdCB0cmVlIHRvIG5lc3RlZCBhcnJheXMgb2Ygc3RyaW5ncy5cbi8vXG5mdW5jdGlvbiBmbGF0dGVuKG9iaiwgZGVwdGgpIHtcbiAgdmFyIHJlc3VsdCA9IFtdLCB0eXAgPSAodHlwZW9mIG9iaiksIHByb3A7XG4gIGlmIChkZXB0aCAmJiB0eXAgPT0gJ29iamVjdCcpIHtcbiAgICBmb3IgKHByb3AgaW4gb2JqKSB7XG4gICAgICB0cnkgeyByZXN1bHQucHVzaChmbGF0dGVuKG9ialtwcm9wXSwgZGVwdGggLSAxKSk7IH0gY2F0Y2ggKGUpIHt9XG4gICAgfVxuICB9XG4gIHJldHVybiAocmVzdWx0Lmxlbmd0aCA/IHJlc3VsdCA6IHR5cCA9PSAnc3RyaW5nJyA/IG9iaiA6IG9iaiArICdcXDAnKTtcbn1cblxuLy9cbi8vIG1peGtleSgpXG4vLyBNaXhlcyBhIHN0cmluZyBzZWVkIGludG8gYSBrZXkgdGhhdCBpcyBhbiBhcnJheSBvZiBpbnRlZ2VycywgYW5kXG4vLyByZXR1cm5zIGEgc2hvcnRlbmVkIHN0cmluZyBzZWVkIHRoYXQgaXMgZXF1aXZhbGVudCB0byB0aGUgcmVzdWx0IGtleS5cbi8vXG5mdW5jdGlvbiBtaXhrZXkoc2VlZCwga2V5KSB7XG4gIHZhciBzdHJpbmdzZWVkID0gc2VlZCArICcnLCBzbWVhciwgaiA9IDA7XG4gIHdoaWxlIChqIDwgc3RyaW5nc2VlZC5sZW5ndGgpIHtcbiAgICBrZXlbbWFzayAmIGpdID1cbiAgICAgIG1hc2sgJiAoKHNtZWFyIF49IGtleVttYXNrICYgal0gKiAxOSkgKyBzdHJpbmdzZWVkLmNoYXJDb2RlQXQoaisrKSk7XG4gIH1cbiAgcmV0dXJuIHRvc3RyaW5nKGtleSk7XG59XG5cbi8vXG4vLyBhdXRvc2VlZCgpXG4vLyBSZXR1cm5zIGFuIG9iamVjdCBmb3IgYXV0b3NlZWRpbmcsIHVzaW5nIHdpbmRvdy5jcnlwdG8gYW5kIE5vZGUgY3J5cHRvXG4vLyBtb2R1bGUgaWYgYXZhaWxhYmxlLlxuLy9cbmZ1bmN0aW9uIGF1dG9zZWVkKCkge1xuICB0cnkge1xuICAgIHZhciBvdXQ7XG4gICAgaWYgKG5vZGVjcnlwdG8gJiYgKG91dCA9IG5vZGVjcnlwdG8ucmFuZG9tQnl0ZXMpKSB7XG4gICAgICAvLyBUaGUgdXNlIG9mICdvdXQnIHRvIHJlbWVtYmVyIHJhbmRvbUJ5dGVzIG1ha2VzIHRpZ2h0IG1pbmlmaWVkIGNvZGUuXG4gICAgICBvdXQgPSBvdXQod2lkdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgPSBuZXcgVWludDhBcnJheSh3aWR0aCk7XG4gICAgICAoZ2xvYmFsLmNyeXB0byB8fCBnbG9iYWwubXNDcnlwdG8pLmdldFJhbmRvbVZhbHVlcyhvdXQpO1xuICAgIH1cbiAgICByZXR1cm4gdG9zdHJpbmcob3V0KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHZhciBicm93c2VyID0gZ2xvYmFsLm5hdmlnYXRvcixcbiAgICAgICAgcGx1Z2lucyA9IGJyb3dzZXIgJiYgYnJvd3Nlci5wbHVnaW5zO1xuICAgIHJldHVybiBbK25ldyBEYXRlLCBnbG9iYWwsIHBsdWdpbnMsIGdsb2JhbC5zY3JlZW4sIHRvc3RyaW5nKHBvb2wpXTtcbiAgfVxufVxuXG4vL1xuLy8gdG9zdHJpbmcoKVxuLy8gQ29udmVydHMgYW4gYXJyYXkgb2YgY2hhcmNvZGVzIHRvIGEgc3RyaW5nXG4vL1xuZnVuY3Rpb24gdG9zdHJpbmcoYSkge1xuICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseSgwLCBhKTtcbn1cblxuLy9cbi8vIFdoZW4gc2VlZHJhbmRvbS5qcyBpcyBsb2FkZWQsIHdlIGltbWVkaWF0ZWx5IG1peCBhIGZldyBiaXRzXG4vLyBmcm9tIHRoZSBidWlsdC1pbiBSTkcgaW50byB0aGUgZW50cm9weSBwb29sLiAgQmVjYXVzZSB3ZSBkb1xuLy8gbm90IHdhbnQgdG8gaW50ZXJmZXJlIHdpdGggZGV0ZXJtaW5pc3RpYyBQUk5HIHN0YXRlIGxhdGVyLFxuLy8gc2VlZHJhbmRvbSB3aWxsIG5vdCBjYWxsIG1hdGgucmFuZG9tIG9uIGl0cyBvd24gYWdhaW4gYWZ0ZXJcbi8vIGluaXRpYWxpemF0aW9uLlxuLy9cbm1peGtleShtYXRoLnJhbmRvbSgpLCBwb29sKTtcblxuLy9cbi8vIE5vZGVqcyBhbmQgQU1EIHN1cHBvcnQ6IGV4cG9ydCB0aGUgaW1wbGVtZW50YXRpb24gYXMgYSBtb2R1bGUgdXNpbmdcbi8vIGVpdGhlciBjb252ZW50aW9uLlxuLy9cbmlmICgodHlwZW9mIG1vZHVsZSkgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBzZWVkcmFuZG9tO1xuICAvLyBXaGVuIGluIG5vZGUuanMsIHRyeSB1c2luZyBjcnlwdG8gcGFja2FnZSBmb3IgYXV0b3NlZWRpbmcuXG4gIHRyeSB7XG4gICAgbm9kZWNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuICB9IGNhdGNoIChleCkge31cbn0gZWxzZSBpZiAoKHR5cGVvZiBkZWZpbmUpID09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICBkZWZpbmUoZnVuY3Rpb24oKSB7IHJldHVybiBzZWVkcmFuZG9tOyB9KTtcbn1cblxuLy8gRW5kIGFub255bW91cyBzY29wZSwgYW5kIHBhc3MgaW5pdGlhbCB2YWx1ZXMuXG59KShcbiAgW10sICAgICAvLyBwb29sOiBlbnRyb3B5IHBvb2wgc3RhcnRzIGVtcHR5XG4gIE1hdGggICAgLy8gbWF0aDogcGFja2FnZSBjb250YWluaW5nIHJhbmRvbSwgcG93LCBhbmQgc2VlZHJhbmRvbVxuKTtcbiIsIihmdW5jdGlvbiAoZ2xvYmFsLCB1bmRlZmluZWQpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIGlmIChnbG9iYWwuc2V0SW1tZWRpYXRlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgbmV4dEhhbmRsZSA9IDE7IC8vIFNwZWMgc2F5cyBncmVhdGVyIHRoYW4gemVyb1xuICAgIHZhciB0YXNrc0J5SGFuZGxlID0ge307XG4gICAgdmFyIGN1cnJlbnRseVJ1bm5pbmdBVGFzayA9IGZhbHNlO1xuICAgIHZhciBkb2MgPSBnbG9iYWwuZG9jdW1lbnQ7XG4gICAgdmFyIHJlZ2lzdGVySW1tZWRpYXRlO1xuXG4gICAgZnVuY3Rpb24gc2V0SW1tZWRpYXRlKGNhbGxiYWNrKSB7XG4gICAgICAvLyBDYWxsYmFjayBjYW4gZWl0aGVyIGJlIGEgZnVuY3Rpb24gb3IgYSBzdHJpbmdcbiAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBjYWxsYmFjayA9IG5ldyBGdW5jdGlvbihcIlwiICsgY2FsbGJhY2spO1xuICAgICAgfVxuICAgICAgLy8gQ29weSBmdW5jdGlvbiBhcmd1bWVudHNcbiAgICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGFyZ3NbaV0gPSBhcmd1bWVudHNbaSArIDFdO1xuICAgICAgfVxuICAgICAgLy8gU3RvcmUgYW5kIHJlZ2lzdGVyIHRoZSB0YXNrXG4gICAgICB2YXIgdGFzayA9IHsgY2FsbGJhY2s6IGNhbGxiYWNrLCBhcmdzOiBhcmdzIH07XG4gICAgICB0YXNrc0J5SGFuZGxlW25leHRIYW5kbGVdID0gdGFzaztcbiAgICAgIHJlZ2lzdGVySW1tZWRpYXRlKG5leHRIYW5kbGUpO1xuICAgICAgcmV0dXJuIG5leHRIYW5kbGUrKztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbGVhckltbWVkaWF0ZShoYW5kbGUpIHtcbiAgICAgICAgZGVsZXRlIHRhc2tzQnlIYW5kbGVbaGFuZGxlXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBydW4odGFzaykge1xuICAgICAgICB2YXIgY2FsbGJhY2sgPSB0YXNrLmNhbGxiYWNrO1xuICAgICAgICB2YXIgYXJncyA9IHRhc2suYXJncztcbiAgICAgICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIGNhbGxiYWNrKGFyZ3NbMF0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIGNhbGxiYWNrKGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIGNhbGxiYWNrKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBjYWxsYmFjay5hcHBseSh1bmRlZmluZWQsIGFyZ3MpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBydW5JZlByZXNlbnQoaGFuZGxlKSB7XG4gICAgICAgIC8vIEZyb20gdGhlIHNwZWM6IFwiV2FpdCB1bnRpbCBhbnkgaW52b2NhdGlvbnMgb2YgdGhpcyBhbGdvcml0aG0gc3RhcnRlZCBiZWZvcmUgdGhpcyBvbmUgaGF2ZSBjb21wbGV0ZWQuXCJcbiAgICAgICAgLy8gU28gaWYgd2UncmUgY3VycmVudGx5IHJ1bm5pbmcgYSB0YXNrLCB3ZSdsbCBuZWVkIHRvIGRlbGF5IHRoaXMgaW52b2NhdGlvbi5cbiAgICAgICAgaWYgKGN1cnJlbnRseVJ1bm5pbmdBVGFzaykge1xuICAgICAgICAgICAgLy8gRGVsYXkgYnkgZG9pbmcgYSBzZXRUaW1lb3V0LiBzZXRJbW1lZGlhdGUgd2FzIHRyaWVkIGluc3RlYWQsIGJ1dCBpbiBGaXJlZm94IDcgaXQgZ2VuZXJhdGVkIGFcbiAgICAgICAgICAgIC8vIFwidG9vIG11Y2ggcmVjdXJzaW9uXCIgZXJyb3IuXG4gICAgICAgICAgICBzZXRUaW1lb3V0KHJ1bklmUHJlc2VudCwgMCwgaGFuZGxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciB0YXNrID0gdGFza3NCeUhhbmRsZVtoYW5kbGVdO1xuICAgICAgICAgICAgaWYgKHRhc2spIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50bHlSdW5uaW5nQVRhc2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJ1bih0YXNrKTtcbiAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICBjbGVhckltbWVkaWF0ZShoYW5kbGUpO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50bHlSdW5uaW5nQVRhc2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsTmV4dFRpY2tJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkgeyBydW5JZlByZXNlbnQoaGFuZGxlKTsgfSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2FuVXNlUG9zdE1lc3NhZ2UoKSB7XG4gICAgICAgIC8vIFRoZSB0ZXN0IGFnYWluc3QgYGltcG9ydFNjcmlwdHNgIHByZXZlbnRzIHRoaXMgaW1wbGVtZW50YXRpb24gZnJvbSBiZWluZyBpbnN0YWxsZWQgaW5zaWRlIGEgd2ViIHdvcmtlcixcbiAgICAgICAgLy8gd2hlcmUgYGdsb2JhbC5wb3N0TWVzc2FnZWAgbWVhbnMgc29tZXRoaW5nIGNvbXBsZXRlbHkgZGlmZmVyZW50IGFuZCBjYW4ndCBiZSB1c2VkIGZvciB0aGlzIHB1cnBvc2UuXG4gICAgICAgIGlmIChnbG9iYWwucG9zdE1lc3NhZ2UgJiYgIWdsb2JhbC5pbXBvcnRTY3JpcHRzKSB7XG4gICAgICAgICAgICB2YXIgcG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cyA9IHRydWU7XG4gICAgICAgICAgICB2YXIgb2xkT25NZXNzYWdlID0gZ2xvYmFsLm9ubWVzc2FnZTtcbiAgICAgICAgICAgIGdsb2JhbC5vbm1lc3NhZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZUlzQXN5bmNocm9ub3VzID0gZmFsc2U7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKFwiXCIsIFwiKlwiKTtcbiAgICAgICAgICAgIGdsb2JhbC5vbm1lc3NhZ2UgPSBvbGRPbk1lc3NhZ2U7XG4gICAgICAgICAgICByZXR1cm4gcG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxQb3N0TWVzc2FnZUltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICAvLyBJbnN0YWxscyBhbiBldmVudCBoYW5kbGVyIG9uIGBnbG9iYWxgIGZvciB0aGUgYG1lc3NhZ2VgIGV2ZW50OiBzZWVcbiAgICAgICAgLy8gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9ET00vd2luZG93LnBvc3RNZXNzYWdlXG4gICAgICAgIC8vICogaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay9tdWx0aXBhZ2UvY29tbXMuaHRtbCNjcm9zc0RvY3VtZW50TWVzc2FnZXNcblxuICAgICAgICB2YXIgbWVzc2FnZVByZWZpeCA9IFwic2V0SW1tZWRpYXRlJFwiICsgTWF0aC5yYW5kb20oKSArIFwiJFwiO1xuICAgICAgICB2YXIgb25HbG9iYWxNZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChldmVudC5zb3VyY2UgPT09IGdsb2JhbCAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBldmVudC5kYXRhID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICAgICAgZXZlbnQuZGF0YS5pbmRleE9mKG1lc3NhZ2VQcmVmaXgpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcnVuSWZQcmVzZW50KCtldmVudC5kYXRhLnNsaWNlKG1lc3NhZ2VQcmVmaXgubGVuZ3RoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgICAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgb25HbG9iYWxNZXNzYWdlLCBmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnbG9iYWwuYXR0YWNoRXZlbnQoXCJvbm1lc3NhZ2VcIiwgb25HbG9iYWxNZXNzYWdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBnbG9iYWwucG9zdE1lc3NhZ2UobWVzc2FnZVByZWZpeCArIGhhbmRsZSwgXCIqXCIpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxNZXNzYWdlQ2hhbm5lbEltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgICAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gZXZlbnQuZGF0YTtcbiAgICAgICAgICAgIHJ1bklmUHJlc2VudChoYW5kbGUpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBjaGFubmVsLnBvcnQyLnBvc3RNZXNzYWdlKGhhbmRsZSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbFJlYWR5U3RhdGVDaGFuZ2VJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgdmFyIGh0bWwgPSBkb2MuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgLy8gQ3JlYXRlIGEgPHNjcmlwdD4gZWxlbWVudDsgaXRzIHJlYWR5c3RhdGVjaGFuZ2UgZXZlbnQgd2lsbCBiZSBmaXJlZCBhc3luY2hyb25vdXNseSBvbmNlIGl0IGlzIGluc2VydGVkXG4gICAgICAgICAgICAvLyBpbnRvIHRoZSBkb2N1bWVudC4gRG8gc28sIHRodXMgcXVldWluZyB1cCB0aGUgdGFzay4gUmVtZW1iZXIgdG8gY2xlYW4gdXAgb25jZSBpdCdzIGJlZW4gY2FsbGVkLlxuICAgICAgICAgICAgdmFyIHNjcmlwdCA9IGRvYy5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO1xuICAgICAgICAgICAgc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBydW5JZlByZXNlbnQoaGFuZGxlKTtcbiAgICAgICAgICAgICAgICBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBodG1sLnJlbW92ZUNoaWxkKHNjcmlwdCk7XG4gICAgICAgICAgICAgICAgc2NyaXB0ID0gbnVsbDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBodG1sLmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbFNldFRpbWVvdXRJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQocnVuSWZQcmVzZW50LCAwLCBoYW5kbGUpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIElmIHN1cHBvcnRlZCwgd2Ugc2hvdWxkIGF0dGFjaCB0byB0aGUgcHJvdG90eXBlIG9mIGdsb2JhbCwgc2luY2UgdGhhdCBpcyB3aGVyZSBzZXRUaW1lb3V0IGV0IGFsLiBsaXZlLlxuICAgIHZhciBhdHRhY2hUbyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZ2xvYmFsKTtcbiAgICBhdHRhY2hUbyA9IGF0dGFjaFRvICYmIGF0dGFjaFRvLnNldFRpbWVvdXQgPyBhdHRhY2hUbyA6IGdsb2JhbDtcblxuICAgIC8vIERvbid0IGdldCBmb29sZWQgYnkgZS5nLiBicm93c2VyaWZ5IGVudmlyb25tZW50cy5cbiAgICBpZiAoe30udG9TdHJpbmcuY2FsbChnbG9iYWwucHJvY2VzcykgPT09IFwiW29iamVjdCBwcm9jZXNzXVwiKSB7XG4gICAgICAgIC8vIEZvciBOb2RlLmpzIGJlZm9yZSAwLjlcbiAgICAgICAgaW5zdGFsbE5leHRUaWNrSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSBpZiAoY2FuVXNlUG9zdE1lc3NhZ2UoKSkge1xuICAgICAgICAvLyBGb3Igbm9uLUlFMTAgbW9kZXJuIGJyb3dzZXJzXG4gICAgICAgIGluc3RhbGxQb3N0TWVzc2FnZUltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2UgaWYgKGdsb2JhbC5NZXNzYWdlQ2hhbm5lbCkge1xuICAgICAgICAvLyBGb3Igd2ViIHdvcmtlcnMsIHdoZXJlIHN1cHBvcnRlZFxuICAgICAgICBpbnN0YWxsTWVzc2FnZUNoYW5uZWxJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIGlmIChkb2MgJiYgXCJvbnJlYWR5c3RhdGVjaGFuZ2VcIiBpbiBkb2MuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKSkge1xuICAgICAgICAvLyBGb3IgSUUgNuKAkzhcbiAgICAgICAgaW5zdGFsbFJlYWR5U3RhdGVDaGFuZ2VJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRm9yIG9sZGVyIGJyb3dzZXJzXG4gICAgICAgIGluc3RhbGxTZXRUaW1lb3V0SW1wbGVtZW50YXRpb24oKTtcbiAgICB9XG5cbiAgICBhdHRhY2hUby5zZXRJbW1lZGlhdGUgPSBzZXRJbW1lZGlhdGU7XG4gICAgYXR0YWNoVG8uY2xlYXJJbW1lZGlhdGUgPSBjbGVhckltbWVkaWF0ZTtcbn0odHlwZW9mIHNlbGYgPT09IFwidW5kZWZpbmVkXCIgPyB0eXBlb2YgZ2xvYmFsID09PSBcInVuZGVmaW5lZFwiID8gdGhpcyA6IGdsb2JhbCA6IHNlbGYpKTtcbiIsInZhciBzY29wZSA9ICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiICYmIGdsb2JhbCkgfHxcbiAgICAgICAgICAgICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzZWxmKSB8fFxuICAgICAgICAgICAgd2luZG93O1xudmFyIGFwcGx5ID0gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5O1xuXG4vLyBET00gQVBJcywgZm9yIGNvbXBsZXRlbmVzc1xuXG5leHBvcnRzLnNldFRpbWVvdXQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBUaW1lb3V0KGFwcGx5LmNhbGwoc2V0VGltZW91dCwgc2NvcGUsIGFyZ3VtZW50cyksIGNsZWFyVGltZW91dCk7XG59O1xuZXhwb3J0cy5zZXRJbnRlcnZhbCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFRpbWVvdXQoYXBwbHkuY2FsbChzZXRJbnRlcnZhbCwgc2NvcGUsIGFyZ3VtZW50cyksIGNsZWFySW50ZXJ2YWwpO1xufTtcbmV4cG9ydHMuY2xlYXJUaW1lb3V0ID1cbmV4cG9ydHMuY2xlYXJJbnRlcnZhbCA9IGZ1bmN0aW9uKHRpbWVvdXQpIHtcbiAgaWYgKHRpbWVvdXQpIHtcbiAgICB0aW1lb3V0LmNsb3NlKCk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIFRpbWVvdXQoaWQsIGNsZWFyRm4pIHtcbiAgdGhpcy5faWQgPSBpZDtcbiAgdGhpcy5fY2xlYXJGbiA9IGNsZWFyRm47XG59XG5UaW1lb3V0LnByb3RvdHlwZS51bnJlZiA9IFRpbWVvdXQucHJvdG90eXBlLnJlZiA9IGZ1bmN0aW9uKCkge307XG5UaW1lb3V0LnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9jbGVhckZuLmNhbGwoc2NvcGUsIHRoaXMuX2lkKTtcbn07XG5cbi8vIERvZXMgbm90IHN0YXJ0IHRoZSB0aW1lLCBqdXN0IHNldHMgdXAgdGhlIG1lbWJlcnMgbmVlZGVkLlxuZXhwb3J0cy5lbnJvbGwgPSBmdW5jdGlvbihpdGVtLCBtc2Vjcykge1xuICBjbGVhclRpbWVvdXQoaXRlbS5faWRsZVRpbWVvdXRJZCk7XG4gIGl0ZW0uX2lkbGVUaW1lb3V0ID0gbXNlY3M7XG59O1xuXG5leHBvcnRzLnVuZW5yb2xsID0gZnVuY3Rpb24oaXRlbSkge1xuICBjbGVhclRpbWVvdXQoaXRlbS5faWRsZVRpbWVvdXRJZCk7XG4gIGl0ZW0uX2lkbGVUaW1lb3V0ID0gLTE7XG59O1xuXG5leHBvcnRzLl91bnJlZkFjdGl2ZSA9IGV4cG9ydHMuYWN0aXZlID0gZnVuY3Rpb24oaXRlbSkge1xuICBjbGVhclRpbWVvdXQoaXRlbS5faWRsZVRpbWVvdXRJZCk7XG5cbiAgdmFyIG1zZWNzID0gaXRlbS5faWRsZVRpbWVvdXQ7XG4gIGlmIChtc2VjcyA+PSAwKSB7XG4gICAgaXRlbS5faWRsZVRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gb25UaW1lb3V0KCkge1xuICAgICAgaWYgKGl0ZW0uX29uVGltZW91dClcbiAgICAgICAgaXRlbS5fb25UaW1lb3V0KCk7XG4gICAgfSwgbXNlY3MpO1xuICB9XG59O1xuXG4vLyBzZXRpbW1lZGlhdGUgYXR0YWNoZXMgaXRzZWxmIHRvIHRoZSBnbG9iYWwgb2JqZWN0XG5yZXF1aXJlKFwic2V0aW1tZWRpYXRlXCIpO1xuLy8gT24gc29tZSBleG90aWMgZW52aXJvbm1lbnRzLCBpdCdzIG5vdCBjbGVhciB3aGljaCBvYmplY3QgYHNldGltbWVkaWF0ZWAgd2FzXG4vLyBhYmxlIHRvIGluc3RhbGwgb250by4gIFNlYXJjaCBlYWNoIHBvc3NpYmlsaXR5IGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZVxuLy8gYHNldGltbWVkaWF0ZWAgbGlicmFyeS5cbmV4cG9ydHMuc2V0SW1tZWRpYXRlID0gKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiICYmIHNlbGYuc2V0SW1tZWRpYXRlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBnbG9iYWwuc2V0SW1tZWRpYXRlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAodGhpcyAmJiB0aGlzLnNldEltbWVkaWF0ZSk7XG5leHBvcnRzLmNsZWFySW1tZWRpYXRlID0gKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiICYmIHNlbGYuY2xlYXJJbW1lZGlhdGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgJiYgZ2xvYmFsLmNsZWFySW1tZWRpYXRlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzICYmIHRoaXMuY2xlYXJJbW1lZGlhdGUpO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcblx0dGhyb3cgbmV3IEVycm9yKFwiZGVmaW5lIGNhbm5vdCBiZSB1c2VkIGluZGlyZWN0XCIpO1xufTtcbiIsIi8qIGdsb2JhbHMgX193ZWJwYWNrX2FtZF9vcHRpb25zX18gKi9cbm1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX2FtZF9vcHRpb25zX187XG4iLCJ2YXIgZztcblxuLy8gVGhpcyB3b3JrcyBpbiBub24tc3RyaWN0IG1vZGVcbmcgPSAoZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzO1xufSkoKTtcblxudHJ5IHtcblx0Ly8gVGhpcyB3b3JrcyBpZiBldmFsIGlzIGFsbG93ZWQgKHNlZSBDU1ApXG5cdGcgPSBnIHx8IG5ldyBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCk7XG59IGNhdGNoIChlKSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlXG5cdGlmICh0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKSBnID0gd2luZG93O1xufVxuXG4vLyBnIGNhbiBzdGlsbCBiZSB1bmRlZmluZWQsIGJ1dCBub3RoaW5nIHRvIGRvIGFib3V0IGl0Li4uXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xuLy8gZWFzaWVyIHRvIGhhbmRsZSB0aGlzIGNhc2UuIGlmKCFnbG9iYWwpIHsgLi4ufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGc7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuXHRpZiAoIW1vZHVsZS53ZWJwYWNrUG9seWZpbGwpIHtcblx0XHRtb2R1bGUuZGVwcmVjYXRlID0gZnVuY3Rpb24oKSB7fTtcblx0XHRtb2R1bGUucGF0aHMgPSBbXTtcblx0XHQvLyBtb2R1bGUucGFyZW50ID0gdW5kZWZpbmVkIGJ5IGRlZmF1bHRcblx0XHRpZiAoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgXCJsb2FkZWRcIiwge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBtb2R1bGUubDtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImlkXCIsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gbW9kdWxlLmk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0bW9kdWxlLndlYnBhY2tQb2x5ZmlsbCA9IDE7XG5cdH1cblx0cmV0dXJuIG1vZHVsZTtcbn07XG4iLCJpbXBvcnQge01MfSBmcm9tICcuL21sJztcbmltcG9ydCB7TUxDb250ZXh0fSBmcm9tICcuL25uL2NvbnRleHQnO1xuaW1wb3J0IHtNTEdyYXBofSBmcm9tICcuL25uL2dyYXBoJztcbmltcG9ydCB7TUxHcmFwaEJ1aWxkZXJ9IGZyb20gJy4vbm4vZ3JhcGhfYnVpbGRlcic7XG5pbXBvcnQge01MT3BlcmFuZH0gZnJvbSAnLi9ubi9vcGVyYW5kJztcblxuaWYgKG5hdmlnYXRvci5tbCA9PSBudWxsKSB7XG4gIG5hdmlnYXRvci5tbCA9IG5ldyBNTCgpO1xufVxuXG5pZiAoZ2xvYmFsLk1MID09IG51bGwpIHtcbiAgZ2xvYmFsLk1MID0gTUw7XG59XG5cbmlmIChnbG9iYWwuTUxDb250ZXh0ID09IG51bGwpIHtcbiAgZ2xvYmFsLk1MQ29udGV4dCA9IE1MQ29udGV4dDtcbn1cblxuaWYgKGdsb2JhbC5NTEdyYXBoQnVpbGRlciA9PSBudWxsKSB7XG4gIGdsb2JhbC5NTEdyYXBoQnVpbGRlciA9IE1MR3JhcGhCdWlsZGVyO1xufVxuXG5pZiAoZ2xvYmFsLk1MR3JhcGggPT0gbnVsbCkge1xuICBnbG9iYWwuTUxHcmFwaCA9IE1MR3JhcGg7XG59XG5cbmlmIChnbG9iYWwuTUxPcGVyYW5kID09IG51bGwpIHtcbiAgZ2xvYmFsLk1MT3BlcmFuZCA9IE1MT3BlcmFuZDtcbn1cbiIsImltcG9ydCB7TUxDb250ZXh0LCBNTENvbnRleHRPcHRpb25zfSBmcm9tICcuL25uL2NvbnRleHQnO1xuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI21sKVxuICovXG5leHBvcnQgY2xhc3MgTUwge1xuICAvKiogQGlnbm9yZSAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBjcmVhdGVDb250ZXh0KG9wdGlvbnM6IE1MQ29udGV4dE9wdGlvbnMgPSB7fSk6IE1MQ29udGV4dCB7XG4gICAgcmV0dXJuIG5ldyBNTENvbnRleHQob3B0aW9ucyk7XG4gIH1cbn1cbiIsImltcG9ydCAnQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsJztcbmltcG9ydCAnQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdSc7XG5pbXBvcnQgKiBhcyB3YXNtIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtJztcblxuaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZW51bWRlZi1tbHBvd2VycHJlZmVyZW5jZSlcbiAqL1xuZXhwb3J0IGVudW0gTUxQb3dlclByZWZlcmVuY2Uge1xuICAnZGVmYXVsdCcgPSAnZGVmYXVsdCcsXG4gICdoaWdoLXBlcmZvcm1hbmNlJyA9ICdoaWdoLXBlcmZvcm1hbmNlJyxcbiAgJ2xvdy1wb3dlcicgPSAnbG93LXBvd2VyJ1xufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2VudW1kZWYtbWxkZXZpY2VwcmVmZXJlbmNlKVxuICovXG5leHBvcnQgZW51bSBNTERldmljZVByZWZlcmVuY2Uge1xuICAnZGVmYXVsdCcgPSAnZGVmYXVsdCcsXG4gICdncHUnID0gJ2dwdScsXG4gICdjcHUnID0gJ2NwdSdcbn1cblxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RpY3RkZWYtbWxjb250ZXh0b3B0aW9ucylcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNTENvbnRleHRPcHRpb25zIHtcbiAgLyoqICovXG4gIHBvd2VyUHJlZmVyZW5jZT86IE1MUG93ZXJQcmVmZXJlbmNlO1xuICAvKiogKi9cbiAgZGV2aWNlUHJlZmVyZW5jZT86IE1MRGV2aWNlUHJlZmVyZW5jZTtcbn1cblxuLyoqXG4gKiBbQVBJIHNwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jbWxjb250ZXh0KVxuICovXG5leHBvcnQgY2xhc3MgTUxDb250ZXh0IHtcbiAgcHJpdmF0ZSBvcHRpb25zXzogTUxDb250ZXh0T3B0aW9ucztcblxuICAvKiogQGludGVybmFsICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgY29uc3RydWN0b3Iob3B0aW9uczogTUxDb250ZXh0T3B0aW9ucyA9IHt9KSB7XG4gICAgdXRpbHMuYXNzZXJ0KG9wdGlvbnMgaW5zdGFuY2VvZiBPYmplY3QsICdJbnZhbGlkIG9wdGlvbnMuJyk7XG4gICAgaWYgKG9wdGlvbnMucG93ZXJQcmVmZXJlbmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgICBvcHRpb25zLnBvd2VyUHJlZmVyZW5jZSBpbiBNTFBvd2VyUHJlZmVyZW5jZSxcbiAgICAgICAgICAnSW52YWxpZCBwb3dlciBwcmVmZXJlbmNlLicpO1xuICAgIH1cbiAgICB0aGlzLm9wdGlvbnNfID0gb3B0aW9ucztcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0IG9wdGlvbnMoKTogTUxDb250ZXh0T3B0aW9ucyB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9uc187XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIC8vIEV4cG9zZSB0Zi5qcyBmb3IgYmFja2VuZCBkZWJ1Z2dpbmcuXG4gIGdldCB0ZigpOiB1bmtub3duIHtcbiAgICAvLyBTZXQgZGlyZWN0b3J5IG9mIHdhc20gYmluYXJpZXMgZm9yICd3YXNtJyBiYWNrZW5kXG4gICAgd2FzbS5zZXRXYXNtUGF0aHMoYGh0dHBzOi8vdW5wa2cuY29tL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtQCR7XG4gICAgICAgIHRmLnZlcnNpb25fY29yZX0vZGlzdC9gKTtcbiAgICByZXR1cm4gdGY7XG4gIH1cbn1cbiIsImltcG9ydCAnQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsJztcbmltcG9ydCAnQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdSc7XG5pbXBvcnQgJ0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtJztcblxuaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNTEJ1ZmZlclZpZXcsIE1MTmFtZWRPcGVyYW5kc30gZnJvbSAnLi9ncmFwaF9idWlsZGVyJztcbmltcG9ydCB7Q29uc3RhbnRPcGVyYW5kLCBJbnB1dE9wZXJhbmQsIE1MT3BlcmFuZCwgTUxPcGVyYW5kRGVzY3JpcHRvciwgT3V0cHV0T3BlcmFuZH0gZnJvbSAnLi9vcGVyYW5kJztcbmltcG9ydCB7T3BlcmF0aW9ufSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge0FycmF5QnVmZmVyVmlld30gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IHR5cGUgTUxSZXNvdXJjY2UgPSBNTEJ1ZmZlclZpZXd8V2ViR0xUZXh0dXJlO1xuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RpY3RkZWYtbWxpbnB1dClcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNTElucHV0IHtcbiAgcmVzb3VyY2U6IE1MUmVzb3VyY2NlO1xuICBkaW1lbnNpb25zOiBudW1iZXJbXTtcbn1cblxuLyoqXG4gKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyN0eXBlZGVmZGVmLW1sbmFtZWRpbnB1dHMpXG4gKi9cbmV4cG9ydCB0eXBlIE1MTmFtZWRJbnB1dHMgPSBSZWNvcmQ8c3RyaW5nLCBNTElucHV0fE1MUmVzb3VyY2NlPjtcblxuLyoqXG4gKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyN0eXBlZGVmZGVmLW1sbmFtZWRvdXRwdXRzKVxuICovXG5leHBvcnQgdHlwZSBNTE5hbWVkT3V0cHV0cyA9IFJlY29yZDxzdHJpbmcsIE1MUmVzb3VyY2NlPjtcblxuLyoqIEBpbnRlcm5hbCAqL1xuY2xhc3MgT3BlcmFuZFRlbnNvciB7XG4gIHJlZjogbnVtYmVyO1xuICB0ZW5zb3I6IHRmLlRlbnNvcjtcbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGNsYXNzIEV4ZWN1dGlvbkNvbnRleHQge1xuICBwcml2YXRlIGNvbnN0YW50VGVub3Nyc186IE1hcDxDb25zdGFudE9wZXJhbmQsIHRmLlRlbnNvcj47XG4gIHByaXZhdGUgaW5wdXRUZW5zb3JzXzogTWFwPElucHV0T3BlcmFuZCwgT3BlcmFuZFRlbnNvcj47XG4gIHByaXZhdGUgb3V0cHV0VGVuc29yc186IE1hcDxPdXRwdXRPcGVyYW5kLCBPcGVyYW5kVGVuc29yPjtcbiAgcHJpdmF0ZSBvcGVyYW5kUmVmc186IE1hcDxNTE9wZXJhbmQsIG51bWJlcj47XG4gIHByaXZhdGUgb3V0cHV0T3BlcmFuZHNfOiBTZXQ8T3V0cHV0T3BlcmFuZD47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBjb25zdGFudFRlbnNvcnM6IE1hcDxDb25zdGFudE9wZXJhbmQsIHRmLlRlbnNvcj4sXG4gICAgICBpbnB1dE9wZXJhbmRzOiBNYXA8c3RyaW5nLCBJbnB1dE9wZXJhbmQ+LFxuICAgICAgaW5wdXRzOiBNTE5hbWVkSW5wdXRzLFxuICAgICAgb3BlcmFuZFJlZnM6IE1hcDxNTE9wZXJhbmQsIG51bWJlcj4sXG4gICkge1xuICAgIHRoaXMuY29uc3RhbnRUZW5vc3JzXyA9IGNvbnN0YW50VGVuc29ycztcbiAgICB0aGlzLm9wZXJhbmRSZWZzXyA9IG9wZXJhbmRSZWZzO1xuICAgIHRoaXMuYWxsb2NhdGVJbnB1dFRlbnNvcnMoaW5wdXRPcGVyYW5kcywgaW5wdXRzKTtcbiAgICB0aGlzLm91dHB1dFRlbnNvcnNfID0gbmV3IE1hcCgpO1xuICAgIHRoaXMub3V0cHV0T3BlcmFuZHNfID0gbmV3IFNldCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhbGxvY2F0ZUlucHV0VGVuc29ycyhcbiAgICAgIGlucHV0T3BlcmFuZHM6IE1hcDxzdHJpbmcsIElucHV0T3BlcmFuZD4sIGlucHV0czogTUxOYW1lZElucHV0cykge1xuICAgIHRoaXMuaW5wdXRUZW5zb3JzXyA9IG5ldyBNYXAoKTtcbiAgICBmb3IgKGNvbnN0IGlucHV0TmFtZSBpbiBpbnB1dHMpIHtcbiAgICAgIGNvbnN0IGlucHV0ID0gaW5wdXRzW2lucHV0TmFtZV07XG4gICAgICBjb25zdCBpbnB1dE9wZXJhbmQgPSBpbnB1dE9wZXJhbmRzLmdldChpbnB1dE5hbWUpO1xuICAgICAgbGV0IGRlc2M6IE1MT3BlcmFuZERlc2NyaXB0b3I7XG4gICAgICBsZXQgcmVzb3VyY2U7XG4gICAgICBpZiAoKGlucHV0IGFzIE1MSW5wdXQpLmRpbWVuc2lvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZXNjID0ge1xuICAgICAgICAgIHR5cGU6IGlucHV0T3BlcmFuZC5kZXNjLnR5cGUsXG4gICAgICAgICAgZGltZW5zaW9uczogKGlucHV0IGFzIE1MSW5wdXQpLmRpbWVuc2lvbnNcbiAgICAgICAgfSBhcyBNTE9wZXJhbmREZXNjcmlwdG9yO1xuICAgICAgICByZXNvdXJjZSA9IChpbnB1dCBhcyBNTElucHV0KS5yZXNvdXJjZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlc2MgPSBpbnB1dE9wZXJhbmQuZGVzYztcbiAgICAgICAgcmVzb3VyY2UgPSBpbnB1dDtcbiAgICAgIH1cbiAgICAgIHRoaXMuaW5wdXRUZW5zb3JzXy5zZXQoaW5wdXRPcGVyYW5kLCB7XG4gICAgICAgIHJlZjogdGhpcy5vcGVyYW5kUmVmc18uZ2V0KGlucHV0T3BlcmFuZCksXG4gICAgICAgIHRlbnNvcjogdXRpbHMuY3JlYXRlVGVuc29yKGRlc2MsIHJlc291cmNlIGFzIEFycmF5QnVmZmVyVmlldylcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGNvbXB1dGUob3V0cHV0czogTWFwPHN0cmluZywgT3V0cHV0T3BlcmFuZD4pOiB0Zi5UZW5zb3JDb250YWluZXJPYmplY3Qge1xuICAgIGZvciAoY29uc3Qgb3V0cHV0IG9mIG91dHB1dHMudmFsdWVzKCkpIHtcbiAgICAgIHRoaXMub3V0cHV0T3BlcmFuZHNfLmFkZChvdXRwdXQpO1xuICAgIH1cbiAgICBjb25zdCBvdXRwdXRUZW5zb3JzOiB0Zi5UZW5zb3JDb250YWluZXJPYmplY3QgPSB7fTtcbiAgICBmb3IgKGNvbnN0IG91dHB1dE5hbWUgb2Ygb3V0cHV0cy5rZXlzKCkpIHtcbiAgICAgIG91dHB1dFRlbnNvcnNbb3V0cHV0TmFtZV0gPSB0aGlzLmdldFRlbnNvcihvdXRwdXRzLmdldChvdXRwdXROYW1lKSk7XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXRUZW5zb3JzO1xuICB9XG5cbiAgc2V0T3V0cHV0VGVuc29yKG91dHB1dDogT3V0cHV0T3BlcmFuZCwgdGVuc29yOiB0Zi5UZW5zb3IpOiB2b2lkIHtcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgICF0aGlzLm91dHB1dFRlbnNvcnNfLmhhcyhvdXRwdXQpLCAnTUxPdXRwdXQgYWxyZWFkeSBoYXMgdGVuc29yLicpO1xuICAgIHRoaXMub3V0cHV0VGVuc29yc18uc2V0KFxuICAgICAgICBvdXRwdXQsIHtyZWY6IHRoaXMub3BlcmFuZFJlZnNfLmdldChvdXRwdXQpLCB0ZW5zb3J9KTtcbiAgfVxuXG4gIHJlbGVhc2VUZW5zb3Iob3BlcmFuZDogTUxPcGVyYW5kKTogdm9pZCB7XG4gICAgbGV0IG9wZXJhbmRUZW5zb3JNYXA6IE1hcDxNTE9wZXJhbmQsIE9wZXJhbmRUZW5zb3I+O1xuICAgIGlmIChvcGVyYW5kIGluc3RhbmNlb2YgSW5wdXRPcGVyYW5kKSB7XG4gICAgICBvcGVyYW5kVGVuc29yTWFwID0gdGhpcy5pbnB1dFRlbnNvcnNfO1xuICAgIH0gZWxzZSBpZiAob3BlcmFuZCBpbnN0YW5jZW9mIE91dHB1dE9wZXJhbmQpIHtcbiAgICAgIGlmICh0aGlzLm91dHB1dE9wZXJhbmRzXy5oYXMob3BlcmFuZCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgb3BlcmFuZFRlbnNvck1hcCA9IHRoaXMub3V0cHV0VGVuc29yc187XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb3BlcmFuZFRlbnNvcjogT3BlcmFuZFRlbnNvciA9IG9wZXJhbmRUZW5zb3JNYXAuZ2V0KG9wZXJhbmQpO1xuICAgIHV0aWxzLmFzc2VydChvcGVyYW5kVGVuc29yICE9PSB1bmRlZmluZWQsICdObyB0ZW5zb3IgZm91bmQgZm9yIG9wZXJhbmQuJyk7XG4gICAgb3BlcmFuZFRlbnNvci5yZWYtLTtcbiAgICBpZiAob3BlcmFuZFRlbnNvci5yZWYgPT09IDApIHtcbiAgICAgIHRmLmRpc3Bvc2Uob3BlcmFuZFRlbnNvci50ZW5zb3IpO1xuICAgICAgb3BlcmFuZFRlbnNvck1hcC5kZWxldGUob3BlcmFuZCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0VGVuc29yKG9wZXJhbmQ6IE1MT3BlcmFuZCk6IHRmLlRlbnNvciB7XG4gICAgaWYgKG9wZXJhbmQgaW5zdGFuY2VvZiBDb25zdGFudE9wZXJhbmQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnN0YW50VGVub3Nyc18uZ2V0KG9wZXJhbmQpO1xuICAgIH0gZWxzZSBpZiAob3BlcmFuZCBpbnN0YW5jZW9mIElucHV0T3BlcmFuZCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5wdXRUZW5zb3JzXy5nZXQob3BlcmFuZCkudGVuc29yO1xuICAgIH0gZWxzZSBpZiAob3BlcmFuZCBpbnN0YW5jZW9mIE91dHB1dE9wZXJhbmQpIHtcbiAgICAgIGlmICh0aGlzLm91dHB1dFRlbnNvcnNfLmhhcyhvcGVyYW5kKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5vdXRwdXRUZW5zb3JzXy5nZXQob3BlcmFuZCkudGVuc29yO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3BlcmFuZC5vcGVyYXRpb24uY29tcHV0ZSh0aGlzKTtcbiAgICAgICAgdXRpbHMuYXNzZXJ0KHRoaXMub3V0cHV0VGVuc29yc18uaGFzKG9wZXJhbmQpLCAnTm8gb3V0cHV0IGlzIHNldC4nKTtcbiAgICAgICAgcmV0dXJuIHRoaXMub3V0cHV0VGVuc29yc18uZ2V0KG9wZXJhbmQpLnRlbnNvcjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgb3BlcmFuZCBpcyBpbnZhbGlkLicpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2FwaS1tbGdyYXBoKVxuICovXG5leHBvcnQgY2xhc3MgTUxHcmFwaCB7XG4gIHByaXZhdGUgaW5wdXRzXzogTWFwPHN0cmluZywgSW5wdXRPcGVyYW5kPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBvdXRwdXRzXzogTWFwPHN0cmluZywgT3V0cHV0T3BlcmFuZD4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgY29uc3RhbnRzXzogU2V0PENvbnN0YW50T3BlcmFuZD4gPSBuZXcgU2V0KCk7XG4gIHByaXZhdGUgb3BlcmFuZFJlZnNfOiBNYXA8TUxPcGVyYW5kLCBudW1iZXI+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIGNvbnN0YW50VGVuc29yc186IE1hcDxDb25zdGFudE9wZXJhbmQsIHRmLlRlbnNvcj4gPSBuZXcgTWFwKCk7XG5cbiAgY29tcHV0ZShpbnB1dHM6IE1MTmFtZWRJbnB1dHMsIG91dHB1dHM6IE1MTmFtZWRPdXRwdXRzKTogdm9pZCB7XG4gICAgdGhpcy52YWxpZGF0ZUlucHV0cyhpbnB1dHMpO1xuXG4gICAgLy8gVmFsaWRhdGUgYW5kIGZpbHRlciB0aGUgcmVxdWlyZWQgb3V0cHV0IG9wZXJhbmRzLlxuICAgIHV0aWxzLmFzc2VydChPYmplY3Qua2V5cyhvdXRwdXRzKS5sZW5ndGggIT09IDAsICdUaGUgb3V0cHV0cyBpcyBpbnZhbGlkLicpO1xuICAgIGNvbnN0IG91dHB1dE9wZXJhbmRzOiBNYXA8c3RyaW5nLCBPdXRwdXRPcGVyYW5kPiA9IG5ldyBNYXAoKTtcbiAgICBmb3IgKGNvbnN0IG91dHB1dE5hbWUgaW4gb3V0cHV0cykge1xuICAgICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgIHR5cGVvZiBvdXRwdXROYW1lID09PSAnc3RyaW5nJyAmJiB0aGlzLm91dHB1dHNfLmhhcyhvdXRwdXROYW1lKSxcbiAgICAgICAgICAnVGhlIG5hbWUgb2YgdGhlIG91dHB1dCBpcyBpbnZhbGlkLicpO1xuICAgICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgIHV0aWxzLmlzVHlwZWRBcnJheShvdXRwdXRzW291dHB1dE5hbWVdKSxcbiAgICAgICAgICAnT25seSBvdXRwdXQgb2YgQXJyYXlCdWZmZXJWaWV3IHR5cGUgaXMgc3VwcG9ydGVkLicpO1xuICAgICAgb3V0cHV0T3BlcmFuZHMuc2V0KG91dHB1dE5hbWUsIHRoaXMub3V0cHV0c18uZ2V0KG91dHB1dE5hbWUpKTtcbiAgICB9XG5cbiAgICAvLyBDb21wdXRlIHRoZSBvdXRwdXQgdGVuc29ycy5cbiAgICBjb25zdCBvdXRwdXRUZW5zb3JzOiB0Zi5UZW5zb3JDb250YWluZXJPYmplY3QgPSB0Zi50aWR5KCgpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBuZXcgRXhlY3V0aW9uQ29udGV4dChcbiAgICAgICAgICB0aGlzLmNvbnN0YW50VGVuc29yc18sIHRoaXMuaW5wdXRzXywgaW5wdXRzLCB0aGlzLm9wZXJhbmRSZWZzXyk7XG4gICAgICAvLyBUaGUgaW5wdXQgYW5kIGltbWVkaWF0ZSB0ZW5zb3JzIHdpbGwgYmUgY2xlYW5lZCB1cC5cbiAgICAgIHJldHVybiBjb250ZXh0LmNvbXB1dGUob3V0cHV0T3BlcmFuZHMpO1xuICAgIH0pO1xuXG4gICAgLy8gU2V0dXAgdGhlIG91dHB1dHMuXG4gICAgZm9yIChjb25zdCBvdXRwdXROYW1lIG9mIE9iamVjdC5rZXlzKG91dHB1dFRlbnNvcnMpKSB7XG4gICAgICBjb25zdCB0ZW5zb3IgPSBvdXRwdXRUZW5zb3JzW291dHB1dE5hbWVdIGFzIHRmLlRlbnNvcjtcbiAgICAgIGNvbnN0IGRlc2MgPSB1dGlscy5jcmVhdGVPcGVyYW5kRGVzY3JpcHRvckZyb21UZW5zb3IodGVuc29yKTtcbiAgICAgIGNvbnN0IHJlc291cmNlID0gb3V0cHV0c1tvdXRwdXROYW1lXSBhcyBBcnJheUJ1ZmZlclZpZXc7XG4gICAgICB1dGlscy52YWxpZGF0ZVR5cGVkQXJyYXkocmVzb3VyY2UsIGRlc2MudHlwZSwgZGVzYy5kaW1lbnNpb25zKTtcbiAgICAgIHJlc291cmNlLnNldCh0ZW5zb3IuZGF0YVN5bmMoKSk7XG4gICAgICB0Zi5kaXNwb3NlKHRlbnNvcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZUlucHV0cyhpbnB1dHM6IE1MTmFtZWRJbnB1dHMpIHtcbiAgICBmb3IgKGNvbnN0IG5hbWUgaW4gaW5wdXRzKSB7XG4gICAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgICAgdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnICYmIHRoaXMuaW5wdXRzXy5oYXMobmFtZSksXG4gICAgICAgICAgJ1RoZSBuYW1lIG9mIHRoZSBpbnB1dCBpcyBpbnZhbGlkLicpO1xuICAgICAgY29uc3QgaW5wdXRPcGVyYW5kID0gdGhpcy5pbnB1dHNfLmdldChuYW1lKTtcbiAgICAgIGxldCByZXNvdXJjZTtcbiAgICAgIGxldCBkaW1lbnNpb25zO1xuICAgICAgaWYgKChpbnB1dHNbbmFtZV0gYXMgTUxJbnB1dCkuZGltZW5zaW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gaW5wdXRzW25hbWVdIGFzIE1MSW5wdXQ7XG4gICAgICAgIHJlc291cmNlID0gaW5wdXQucmVzb3VyY2U7XG4gICAgICAgIGRpbWVuc2lvbnMgPSBpbnB1dC5kaW1lbnNpb25zO1xuICAgICAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgICAgICByZXNvdXJjZSAhPT0gdW5kZWZpbmVkLCAnVGhlIHJlc291cmNlIG9mIGlucHV0IGlzIHVuZGVmaW5lZC4nKTtcbiAgICAgICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgICAgdXRpbHMuaXNJbnRlZ2VyQXJyYXkoZGltZW5zaW9ucykgPT09IHRydWUsXG4gICAgICAgICAgICAnVGhlIHR5cGUgb2YgdGhlIGlucHV0IGRpbWVuc2lvbnMgaXMgaW52YWxpZC4nKTtcbiAgICAgICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgICAgZGltZW5zaW9ucy5sZW5ndGggPT09IGlucHV0T3BlcmFuZC5kZXNjLmRpbWVuc2lvbnMubGVuZ3RoLFxuICAgICAgICAgICAgJ1RoZSByYW5rIG9mIHRoZSBpbnB1dCBkaW1lbnNpb25zIGlzIGludmFsaWQuJyk7XG4gICAgICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgICAgICF1dGlscy5pc0R5YW5taWNTaGFwZShkaW1lbnNpb25zKSxcbiAgICAgICAgICAgICdUaGUgdmFsdWUgb2YgaW5wdXQgZGltZW5zaW9ucyBpcyBuZWdhdGl2ZS4nKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dE9wZXJhbmQuZGVzYy5kaW1lbnNpb25zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgY29uc3QgZCA9IGlucHV0T3BlcmFuZC5kZXNjLmRpbWVuc2lvbnNbaV07XG4gICAgICAgICAgaWYgKGQgPiAwKSB7XG4gICAgICAgICAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgICAgICAgICAgZCA9PT0gZGltZW5zaW9uc1tpXSxcbiAgICAgICAgICAgICAgICAnVGhlIHZhbHVlIG9mIHRoZSBpbnB1dCBkaW1lbnNpb25zIGlzIGludmFsaWQuJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvdXJjZSA9IGlucHV0c1tuYW1lXSBhcyBNTFJlc291cmNjZTtcbiAgICAgICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgICAgIXV0aWxzLmlzRHlhbm1pY1NoYXBlKGlucHV0T3BlcmFuZC5kZXNjLmRpbWVuc2lvbnMpLFxuICAgICAgICAgICAgJ1RoZSBpbnB1dCBkaW1lbnNpb25zIGlzIG5vdCBzcGVjaWZpZWQuJyk7XG4gICAgICAgIGRpbWVuc2lvbnMgPSBpbnB1dE9wZXJhbmQuZGVzYy5kaW1lbnNpb25zO1xuICAgICAgfVxuICAgICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgIHV0aWxzLmlzVHlwZWRBcnJheShyZXNvdXJjZSksXG4gICAgICAgICAgJ09ubHkgcmVzb3VyY2Ugb2YgQXJyYXlCdWZmZXJWaWV3IHR5cGUgaXMgc3VwcG9ydGVkLicpO1xuICAgICAgdXRpbHMudmFsaWRhdGVUeXBlZEFycmF5KFxuICAgICAgICAgIHJlc291cmNlIGFzIEFycmF5QnVmZmVyVmlldywgaW5wdXRPcGVyYW5kLmRlc2MudHlwZSwgZGltZW5zaW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgY29uc3RydWN0b3Iob3V0cHV0cz86IE1MTmFtZWRPcGVyYW5kcykge1xuICAgIHV0aWxzLmFzc2VydChvdXRwdXRzICE9PSB1bmRlZmluZWQsICdJbnZhbGlkIGFyZ3VtZW50Jyk7XG4gICAgZm9yIChjb25zdCBuYW1lIGluIG91dHB1dHMpIHtcbiAgICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgICB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycgJiYgb3V0cHV0c1tuYW1lXSBpbnN0YW5jZW9mIE91dHB1dE9wZXJhbmQsXG4gICAgICAgICAgJ1RoZSBvdXRwdXRzIHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgICAgdGhpcy5vdXRwdXRzXy5zZXQobmFtZSwgb3V0cHV0c1tuYW1lXSBhcyBPdXRwdXRPcGVyYW5kKTtcbiAgICB9XG4gICAgdXRpbHMuYXNzZXJ0KHRoaXMub3V0cHV0c18uc2l6ZSAhPT0gMCwgJ1RoZSBvdXRwdXRzIGlzIGVtcHR5Jyk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHN0YXRpYyBidWlsZEFuZENvbXBpbGUob3V0cHV0cz86IE1MTmFtZWRPcGVyYW5kcyk6IE1MR3JhcGgge1xuICAgIGNvbnN0IGdyYXBoID0gbmV3IE1MR3JhcGgob3V0cHV0cyk7XG4gICAgZ3JhcGguYnVpbGQoKTtcbiAgICBncmFwaC5jb21waWxlKCk7XG4gICAgcmV0dXJuIGdyYXBoO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZCgpOiB2b2lkIHtcbiAgICBjb25zdCB2aXNpdGVkT3BzOiBTZXQ8T3BlcmF0aW9uPiA9IG5ldyBTZXQoKTtcbiAgICBmb3IgKGNvbnN0IG91dHB1dCBvZiB0aGlzLm91dHB1dHNfLnZhbHVlcygpKSB7XG4gICAgICB0aGlzLmJ1aWxkT3BlcmF0aW9uKG91dHB1dC5vcGVyYXRpb24sIHZpc2l0ZWRPcHMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRPcGVyYXRpb24ob3BlcmF0aW9uOiBPcGVyYXRpb24sIHZpc2l0ZWRPcHM6IFNldDxPcGVyYXRpb24+KTpcbiAgICAgIHZvaWQge1xuICAgIGlmICh2aXNpdGVkT3BzLmhhcyhvcGVyYXRpb24pKSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIHZpc2l0ZWRPcHMuYWRkKG9wZXJhdGlvbik7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgb3BlcmFuZCBvZiBvcGVyYXRpb24uaW5wdXRzKCkpIHtcbiAgICAgIGlmICghdGhpcy5vcGVyYW5kUmVmc18uaGFzKG9wZXJhbmQpKSB7XG4gICAgICAgIHRoaXMub3BlcmFuZFJlZnNfLnNldChvcGVyYW5kLCAxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCByZWYgPSB0aGlzLm9wZXJhbmRSZWZzXy5nZXQob3BlcmFuZCk7XG4gICAgICAgIHJlZisrO1xuICAgICAgICB0aGlzLm9wZXJhbmRSZWZzXy5zZXQob3BlcmFuZCwgcmVmKTtcbiAgICAgIH1cbiAgICAgIGlmIChvcGVyYW5kIGluc3RhbmNlb2YgSW5wdXRPcGVyYW5kKSB7XG4gICAgICAgIGlmICh0aGlzLmlucHV0c18uaGFzKG9wZXJhbmQubmFtZSkpIHtcbiAgICAgICAgICBpZiAodGhpcy5pbnB1dHNfLmdldChvcGVyYW5kLm5hbWUpICE9PSBvcGVyYW5kKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBuYW1lIG9mIHRoaXMgaW5wdXQgaXMgZXhpc3RlZC4nKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5wdXRzXy5zZXQob3BlcmFuZC5uYW1lLCBvcGVyYW5kKTtcbiAgICAgIH0gZWxzZSBpZiAob3BlcmFuZCBpbnN0YW5jZW9mIENvbnN0YW50T3BlcmFuZCkge1xuICAgICAgICBpZiAoIXRoaXMuY29uc3RhbnRzXy5oYXMob3BlcmFuZCkpIHtcbiAgICAgICAgICB0aGlzLmNvbnN0YW50c18uYWRkKG9wZXJhbmQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG9wZXJhbmQgaW5zdGFuY2VvZiBPdXRwdXRPcGVyYW5kKSB7XG4gICAgICAgIHRoaXMuYnVpbGRPcGVyYXRpb24ob3BlcmFuZC5vcGVyYXRpb24sIHZpc2l0ZWRPcHMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY29tcGlsZSgpOiB2b2lkIHtcbiAgICB0aGlzLmFsbG9jYXRlQ29uc3RhbnRzKCk7XG4gICAgdGhpcy5jb21wdXRlT25jZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhbGxvY2F0ZUNvbnN0YW50cygpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGNvbnN0YW50IG9mIHRoaXMuY29uc3RhbnRzXykge1xuICAgICAgdGhpcy5jb25zdGFudFRlbnNvcnNfLnNldChcbiAgICAgICAgICBjb25zdGFudCwgdXRpbHMuY3JlYXRlVGVuc29yKGNvbnN0YW50LmRlc2MsIGNvbnN0YW50LnZhbHVlKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb21wdXRlT25jZSgpOiB2b2lkIHtcbiAgICBjb25zdCBpbnB1dHM6IE1MTmFtZWRJbnB1dHMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGlucHV0TmFtZSBvZiB0aGlzLmlucHV0c18ua2V5cygpKSB7XG4gICAgICBjb25zdCBpbnB1dE9wZXJhbmQgPSB0aGlzLmlucHV0c18uZ2V0KGlucHV0TmFtZSk7XG4gICAgICAvLyBhc3N1bWUgMSBmb3IgbmVnYXRpdmUgZGltIHZhbHVlLlxuICAgICAgY29uc3Qgc2hhcGUgPSBpbnB1dE9wZXJhbmQuZGVzYy5kaW1lbnNpb25zLm1hcCh4ID0+IHggPCAwID8gMSA6IHgpO1xuICAgICAgY29uc3QgdHlwZWRBcnJheUNvbnN0cnVjdG9yID0gdXRpbHMuZ2V0VHlwZWRBcnJheShpbnB1dE9wZXJhbmQuZGVzYy50eXBlKTtcbiAgICAgIGNvbnN0IGlucHV0QnVmZmVyID0gbmV3IHR5cGVkQXJyYXlDb25zdHJ1Y3RvcihcbiAgICAgICAgICB1dGlscy5zaXplRnJvbURpbWVuc2lvbnMoaW5wdXRPcGVyYW5kLmRlc2MuZGltZW5zaW9ucykpO1xuICAgICAgaW5wdXRzW2lucHV0TmFtZV0gPSB7cmVzb3VyY2U6IGlucHV0QnVmZmVyLCBkaW1lbnNpb25zOiBzaGFwZX0gYXMgTUxJbnB1dDtcbiAgICB9XG4gICAgY29uc3Qgb3V0cHV0VGVuc29yczogdGYuVGVuc29yQ29udGFpbmVyT2JqZWN0ID0gdGYudGlkeSgoKSA9PiB7XG4gICAgICBjb25zdCBjb250ZXh0ID0gbmV3IEV4ZWN1dGlvbkNvbnRleHQoXG4gICAgICAgICAgdGhpcy5jb25zdGFudFRlbnNvcnNfLCB0aGlzLmlucHV0c18sIGlucHV0cywgdGhpcy5vcGVyYW5kUmVmc18pO1xuICAgICAgLy8gVGhlIGlucHV0IGFuZCBpbW1lZGlhdGUgdGVuc29ycyB3aWxsIGJlIGNsZWFuZWQgdXAuXG4gICAgICByZXR1cm4gY29udGV4dC5jb21wdXRlKHRoaXMub3V0cHV0c18pO1xuICAgIH0pO1xuICAgIGZvciAoY29uc3Qgb3V0cHV0TmFtZSBvZiBPYmplY3Qua2V5cyhvdXRwdXRUZW5zb3JzKSkge1xuICAgICAgY29uc3QgdGVuc29yID0gb3V0cHV0VGVuc29yc1tvdXRwdXROYW1lXSBhcyB0Zi5UZW5zb3I7XG4gICAgICB0ZW5zb3IuZGF0YVN5bmMoKTtcbiAgICAgIHRmLmRpc3Bvc2UodGVuc29yKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICAvLyBGb3IgbWVtb3J5IGxlYWsgdGVzdGluZy5cbiAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHRlbnNvciBvZiB0aGlzLmNvbnN0YW50VGVuc29yc18udmFsdWVzKCkpIHtcbiAgICAgIHRmLmRpc3Bvc2UodGVuc29yKTtcbiAgICB9XG4gICAgY29uc3QgdmlzaXRlZE9wczogU2V0PE9wZXJhdGlvbj4gPSBuZXcgU2V0KCk7XG4gICAgZm9yIChjb25zdCBvdXRwdXQgb2YgdGhpcy5vdXRwdXRzXy52YWx1ZXMoKSkge1xuICAgICAgdGhpcy5kaXNwb3NlT3BlcmF0aW9uKG91dHB1dC5vcGVyYXRpb24sIHZpc2l0ZWRPcHMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZGlzcG9zZU9wZXJhdGlvbihvcGVyYXRpb246IE9wZXJhdGlvbiwgdmlzaXRlZE9wczogU2V0PE9wZXJhdGlvbj4pOlxuICAgICAgdm9pZCB7XG4gICAgaWYgKHZpc2l0ZWRPcHMuaGFzKG9wZXJhdGlvbikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgb3BlcmF0aW9uLmRpc3Bvc2UoKTtcbiAgICAgIHZpc2l0ZWRPcHMuYWRkKG9wZXJhdGlvbik7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgb3BlcmFuZCBvZiBvcGVyYXRpb24uaW5wdXRzKCkpIHtcbiAgICAgIGlmIChvcGVyYW5kIGluc3RhbmNlb2YgT3V0cHV0T3BlcmFuZCkge1xuICAgICAgICB0aGlzLmRpc3Bvc2VPcGVyYXRpb24ob3BlcmFuZC5vcGVyYXRpb24sIHZpc2l0ZWRPcHMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHtNTENvbnRleHR9IGZyb20gJy4vY29udGV4dCc7XG5pbXBvcnQge01MR3JhcGh9IGZyb20gJy4vZ3JhcGgnO1xuaW1wb3J0IHtDb25zdGFudE9wZXJhbmQsIElucHV0T3BlcmFuZCwgTUxPcGVyYW5kLCBNTE9wZXJhbmREZXNjcmlwdG9yLCBNTE9wZXJhbmRUeXBlfSBmcm9tICcuL29wZXJhbmQnO1xuaW1wb3J0IHtNTE9wZXJhdG9yfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge0JhdGNoTm9ybWFsaXphdGlvbn0gZnJvbSAnLi9vcHMvYmF0Y2hfbm9ybSc7XG5pbXBvcnQge0FkZCwgRGl2LCBNYXRNdWwsIE1heCwgTWluLCBNdWwsIFBvdywgU3VifSBmcm9tICcuL29wcy9iaW5hcnknO1xuaW1wb3J0IHtDbGFtcH0gZnJvbSAnLi9vcHMvY2xhbXAnO1xuaW1wb3J0IHtDb25jYXR9IGZyb20gJy4vb3BzL2NvbmNhdCc7XG5pbXBvcnQge0NvbnYyZH0gZnJvbSAnLi9vcHMvY29udjJkJztcbmltcG9ydCB7R2VtbX0gZnJvbSAnLi9vcHMvZ2VtbSc7XG5pbXBvcnQge0dydSwgR3J1Q2VsbH0gZnJvbSAnLi9vcHMvZ3J1JztcbmltcG9ydCB7SW5zdGFuY2VOb3JtYWxpemF0aW9ufSBmcm9tICcuL29wcy9pbnN0YW5jZV9ub3JtJztcbmltcG9ydCB7TGVha3lSZWx1fSBmcm9tICcuL29wcy9sZWFreV9yZWx1JztcbmltcG9ydCB7UGFkfSBmcm9tICcuL29wcy9wYWQnO1xuaW1wb3J0IHtBdmVyYWdlUG9vbDJkLCBMMlBvb2wyZCwgTWF4UG9vbDJkfSBmcm9tICcuL29wcy9wb29sMmQnO1xuaW1wb3J0IHtSZWR1Y2VMMSwgUmVkdWNlTDIsIFJlZHVjZUxvZ1N1bUV4cCwgUmVkdWNlTWF4LCBSZWR1Y2VNZWFuLCBSZWR1Y2VNaW4sIFJlZHVjZVByb2R1Y3QsIFJlZHVjZVN1bX0gZnJvbSAnLi9vcHMvcmVkdWNlJztcbmltcG9ydCB7UmVzYW1wbGV9IGZyb20gJy4vb3BzL3Jlc2FtcGxlJztcbmltcG9ydCB7UmVzaGFwZX0gZnJvbSAnLi9vcHMvcmVzaGFwZSc7XG5pbXBvcnQge1NsaWNlfSBmcm9tICcuL29wcy9zbGljZSc7XG5pbXBvcnQge1NvZnRtYXh9IGZyb20gJy4vb3BzL3NvZnRtYXgnO1xuaW1wb3J0IHtTcGxpdH0gZnJvbSAnLi9vcHMvc3BsaXQnO1xuaW1wb3J0IHtTcXVlZXplfSBmcm9tICcuL29wcy9zcXVlZXplJztcbmltcG9ydCB7VHJhbnNwb3NlfSBmcm9tICcuL29wcy90cmFuc3Bvc2UnO1xuaW1wb3J0IHtFeHAsIEhhcmRTd2lzaCwgUmVsdSwgU2lnbW9pZCwgVGFuaH0gZnJvbSAnLi9vcHMvdW5hcnknO1xuaW1wb3J0IHtBcnJheUJ1ZmZlclZpZXd9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZW51bWRlZi1tbGlucHV0b3BlcmFuZGxheW91dClcbiAqL1xuZXhwb3J0IGVudW0gTUxJbnB1dE9wZXJhbmRMYXlvdXQge1xuICAnbmNodycgPSAnbmNodycsXG4gICduaHdjJyA9ICduaHdjJ1xufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RpY3RkZWYtbWxiYXRjaG5vcm1hbGl6YXRpb25vcHRpb25zKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1MQmF0Y2hOb3JtYWxpemF0aW9uT3B0aW9ucyB7XG4gIHNjYWxlPzogTUxPcGVyYW5kO1xuICBiaWFzPzogTUxPcGVyYW5kO1xuICBheGlzPzogbnVtYmVyO1xuICBlcHNpbG9uPzogbnVtYmVyO1xuICBhY3RpdmF0aW9uPzogTUxPcGVyYXRvcjtcbn1cblxuLyoqXG4gKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkaWN0ZGVmLW1sY2xhbXBvcHRpb25zKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1MQ2xhbXBPcHRpb25zIHtcbiAgbWluVmFsdWU/OiBNTE9wZXJhbmQ7XG4gIG1heFZhbHVlPzogTUxPcGVyYW5kO1xufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2VudW1kZWYtbWxmaWx0ZXJvcGVyYW5kbGF5b3V0KVxuICovXG5leHBvcnQgZW51bSBNTEZpbHRlck9wZXJhbmRMYXlvdXQge1xuICAnb2lodycgPSAnb2lodycsXG4gICdod2lvJyA9ICdod2lvJyxcbiAgJ29od2knID0gJ29od2knLFxuICAnaWh3bycgPSAnaWh3bycsXG59XG5cbi8qKlxuICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZW51bWRlZi1tbGF1dG9wYWQpXG4gKi9cbmV4cG9ydCBlbnVtIE1MQXV0b1BhZCB7XG4gICdleHBsaWNpdCcgPSAnZXhwbGljaXQnLFxuICAnc2FtZS11cHBlcicgPSAnc2FtZS11cHBlcicsXG4gICdzYW1lLWxvd2VyJyA9ICdzYW1lLWxvd2VyJyxcbn1cblxuLyoqXG4gKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkaWN0ZGVmLW1sY29udjJkb3B0aW9ucylcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNTENvbnYyZE9wdGlvbnMge1xuICBwYWRkaW5nPzogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG4gIHN0cmlkZXM/OiBbbnVtYmVyLCBudW1iZXJdO1xuICBkaWxhdGlvbnM/OiBbbnVtYmVyLCBudW1iZXJdO1xuICBvdXRwdXRQYWRkaW5nPzogW251bWJlciwgbnVtYmVyXTtcbiAgb3V0cHV0U2l6ZXM/OiBbbnVtYmVyLCBudW1iZXJdO1xuICBhdXRvUGFkPzogTUxBdXRvUGFkO1xuICB0cmFuc3Bvc2U/OiBib29sZWFuO1xuICBncm91cHM/OiBudW1iZXI7XG4gIGlucHV0TGF5b3V0PzogTUxJbnB1dE9wZXJhbmRMYXlvdXQ7XG4gIGZpbHRlckxheW91dD86IE1MRmlsdGVyT3BlcmFuZExheW91dDtcbiAgYmlhcz86IE1MT3BlcmFuZDtcbiAgYWN0aXZhdGlvbj86IE1MT3BlcmF0b3I7XG59XG5cbi8qKlxuICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZGljdGRlZi1tbGdlbW1vcHRpb25zKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1MR2VtbU9wdGlvbnMge1xuICBjPzogTUxPcGVyYW5kO1xuICBhbHBoYT86IG51bWJlcjtcbiAgYmV0YT86IG51bWJlcjtcbiAgYVRyYW5zcG9zZT86IGJvb2xlYW47XG4gIGJUcmFuc3Bvc2U/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2VudW1kZWYtbWxyZWN1cnJlbnRuZXR3b3Jrd2VpZ2h0bGF5b3V0KVxuICovXG5leHBvcnQgZW51bSBNTFJlY3VycmVudE5ldHdvcmtXZWlnaHRMYXlvdXQge1xuICAnenJuJyA9ICd6cm4nLFxuICAncnpuJyA9ICdyem4nLFxufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2VudW1kZWYtbWxyZWN1cnJlbnRuZXR3b3JrZGlyZWN0aW9uKVxuICovXG5leHBvcnQgZW51bSBNTFJlY3VycmVudE5ldHdvcmtEaXJlY3Rpb24ge1xuICAnZm9yd2FyZCcgPSAnZm9yd2FyZCcsXG4gICdiYWNrd2FyZCcgPSAnYmFja3dhcmQnLFxuICAnYm90aCcgPSAnYm90aCcsXG59XG5cbi8qKlxuICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZGljdGRlZi1tbGdydW9wdGlvbnMpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTUxHcnVPcHRpb25zIHtcbiAgYmlhcz86IE1MT3BlcmFuZDtcbiAgcmVjdXJyZW50Qmlhcz86IE1MT3BlcmFuZDtcbiAgaW5pdGlhbEhpZGRlblN0YXRlPzogTUxPcGVyYW5kO1xuICByZXNldEFmdGVyPzogYm9vbGVhbjtcbiAgcmV0dXJuU2VxdWVuY2U/OiBib29sZWFuO1xuICBkaXJlY3Rpb24/OiBNTFJlY3VycmVudE5ldHdvcmtEaXJlY3Rpb247XG4gIGxheW91dD86IE1MUmVjdXJyZW50TmV0d29ya1dlaWdodExheW91dDtcbiAgYWN0aXZhdGlvbnM/OiBNTE9wZXJhdG9yW107XG59XG5cbi8qKlxuICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZGljdGRlZi1tbGdydWNlbGxvcHRpb25zKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1MR3J1Q2VsbE9wdGlvbnMge1xuICBiaWFzPzogTUxPcGVyYW5kO1xuICByZWN1cnJlbnRCaWFzPzogTUxPcGVyYW5kO1xuICByZXNldEFmdGVyPzogYm9vbGVhbjtcbiAgbGF5b3V0PzogTUxSZWN1cnJlbnROZXR3b3JrV2VpZ2h0TGF5b3V0O1xuICBhY3RpdmF0aW9ucz86IE1MT3BlcmF0b3JbXTtcbn1cblxuLyoqXG4gKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkaWN0ZGVmLW1saW5zdGFuY2Vub3JtYWxpemF0aW9ub3B0aW9ucylcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNTEluc3RhbmNlTm9ybWFsaXphdGlvbk9wdGlvbnMge1xuICBzY2FsZT86IE1MT3BlcmFuZDtcbiAgYmlhcz86IE1MT3BlcmFuZDtcbiAgZXBzaWxvbj86IG51bWJlcjtcbiAgbGF5b3V0PzogTUxJbnB1dE9wZXJhbmRMYXlvdXQ7XG59XG5cbi8qKlxuICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZGljdGRlZi1tbGxlYWt5cmVsdW9wdGlvbnMpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTUxMZWFreVJlbHVPcHRpb25zIHtcbiAgYWxwaGE/OiBudW1iZXI7XG59XG5cbi8qKlxuICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZW51bWRlZi1tbHBhZGRpbmdtb2RlKVxuICovXG5leHBvcnQgZW51bSBNTFBhZGRpbmdNb2RlIHtcbiAgJ2NvbnN0YW50JyA9ICdjb25zdGFudCcsXG4gICdlZGdlJyA9ICdlZGdlJyxcbiAgJ3JlZmxlY3Rpb24nID0gJ3JlZmxlY3Rpb24nLFxuICAnc3ltbWV0cmljJyA9ICdzeW1tZXRyaWMnXG59XG5cbi8qKlxuICogW3NwZWNdKGhodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RpY3RkZWYtbWxwYWRvcHRpb25zKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1MUGFkT3B0aW9ucyB7XG4gIG1vZGU/OiBNTFBhZGRpbmdNb2RlO1xuICB2YWx1ZT86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkaWN0ZGVmLW1scG9vbDJkb3B0aW9ucylcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNTFBvb2xpbmcyZE9wdGlvbnMge1xuICB3aW5kb3dEaW1lbnNpb25zPzogW251bWJlciwgbnVtYmVyXTtcbiAgcGFkZGluZz86IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICBzdHJpZGVzPzogW251bWJlciwgbnVtYmVyXTtcbiAgZGlsYXRpb25zPzogW251bWJlciwgbnVtYmVyXTtcbiAgYXV0b1BhZD86IE1MQXV0b1BhZDtcbiAgbGF5b3V0PzogTUxJbnB1dE9wZXJhbmRMYXlvdXQ7XG59XG5cbi8qKlxuICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZGljdGRlZi1tbHJlZHVjZW9wdGlvbnMpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTUxSZWR1Y2VPcHRpb25zIHtcbiAgYXhlcz86IG51bWJlcltdO1xuICBrZWVwRGltZW5zaW9ucz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZW51bWRlZi1tbGludGVycG9sYXRpb25tb2RlKVxuICovXG5leHBvcnQgZW51bSBNTEludGVycG9sYXRpb25Nb2RlIHtcbiAgJ25lYXJlc3QtbmVpZ2hib3InID0gJ25lYXJlc3QtbmVpZ2hib3InLFxuICAnbGluZWFyJyA9ICdsaW5lYXInXG59XG5cbi8qKlxuICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZGljdGRlZi1tbHJlc2FtcGxlb3B0aW9ucylcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNTFJlc2FtcGxlT3B0aW9ucyB7XG4gIG1vZGU/OiBNTEludGVycG9sYXRpb25Nb2RlO1xuICBzY2FsZXM/OiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgc2l6ZXM/OiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbn1cblxuLyoqXG4gKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkaWN0ZGVmLW1sc2xpY2VvcHRpb25zKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1MU2xpY2VPcHRpb25zIHtcbiAgYXhlcz86IG51bWJlcltdO1xufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RpY3RkZWYtbWxzcGxpdG9wdGlvbnMpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTUxTcGxpdE9wdGlvbnMge1xuICBheGlzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RpY3RkZWYtbWxzcXVlZXplb3B0aW9ucylcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNTFNxdWVlemVPcHRpb25zIHtcbiAgYXhlcz86IG51bWJlcltdO1xufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RpY3RkZWYtbWx0cmFuc3Bvc2VvcHRpb25zKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1MVHJhbnNwb3NlT3B0aW9ucyB7XG4gIHBlcm11dGF0aW9uPzogbnVtYmVyW107XG59XG5cbi8qKlxuICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jdHlwZWRlZmRlZi1tbG5hbWVkb3BlcmFuZHMpXG4gKi9cbmV4cG9ydCB0eXBlIE1MTmFtZWRPcGVyYW5kcyA9IFJlY29yZDxzdHJpbmcsIE1MT3BlcmFuZD47XG5cbi8qKlxuICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZGljdGRlZi1tbGJ1ZmZlcnJlc291cmNldmlldylcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNTEJ1ZmZlclJlc291cmNlVmlldyB7XG4gIHJlc291cmNlOiBXZWJHTEJ1ZmZlcjtcbiAgb2Zmc2V0PzogbnVtYmVyO1xuICBzaXplPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI3R5cGVkZWZkZWYtbWxidWZmZXJ2aWV3KVxuICovXG5leHBvcnQgdHlwZSBNTEJ1ZmZlclZpZXcgPSBBcnJheUJ1ZmZlclZpZXd8TUxCdWZmZXJSZXNvdXJjZVZpZXc7XG5cbi8qKlxuICogW3NwZWNdKGhodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2FwaS1tbGdyYXBoYnVpbGRlcilcbiAqL1xuZXhwb3J0IGNsYXNzIE1MR3JhcGhCdWlsZGVyIHtcbiAgcHJpdmF0ZSBjb250ZXh0XzogTUxDb250ZXh0O1xuXG4gIGNvbnN0cnVjdG9yKGNvbnRleHQ6IE1MQ29udGV4dCkge1xuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgY29udGV4dCBpbnN0YW5jZW9mIE1MQ29udGV4dCwgJ1RoZSBjb250ZXh0IHBhcmFtdGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5jb250ZXh0XyA9IGNvbnRleHQ7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldCBjb250ZXh0KCk6IE1MQ29udGV4dCB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dF87XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLWJ1aWxkKVxuICAgKi9cbiAgYnVpbGQob3V0cHV0czogTUxOYW1lZE9wZXJhbmRzKTogTUxHcmFwaCB7XG4gICAgcmV0dXJuIE1MR3JhcGguYnVpbGRBbmRDb21waWxlKG91dHB1dHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1pbnB1dClcbiAgICovXG4gIGlucHV0KG5hbWU6IHN0cmluZywgZGVzYzogTUxPcGVyYW5kRGVzY3JpcHRvcik6IE1MT3BlcmFuZCB7XG4gICAgcmV0dXJuIG5ldyBJbnB1dE9wZXJhbmQobmFtZSwgZGVzYywgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLWNvbnN0YW50KVxuICAgKi9cbiAgY29uc3RhbnQoZGVzYzogTUxPcGVyYW5kRGVzY3JpcHRvciwgYnVmZmVyVmlldzogTUxCdWZmZXJWaWV3KTogTUxPcGVyYW5kO1xuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLWNvbnN0YW50LXZhbHVlLXR5cGUpXG4gICAqL1xuICBjb25zdGFudCh2YWx1ZTogbnVtYmVyLCB0eXBlPzogTUxPcGVyYW5kVHlwZSk6IE1MT3BlcmFuZDtcbiAgY29uc3RhbnQoXG4gICAgICBkZXNjT3JWYWx1ZTogTUxPcGVyYW5kRGVzY3JpcHRvcnxudW1iZXIsXG4gICAgICB2YWx1ZU9yVHlwZTogTUxCdWZmZXJWaWV3fE1MT3BlcmFuZFR5cGUpOiBDb25zdGFudE9wZXJhbmQge1xuICAgIGlmICh0eXBlb2YgZGVzY09yVmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICBpZiAodmFsdWVPclR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWx1ZU9yVHlwZSA9IE1MT3BlcmFuZFR5cGUuZmxvYXQzMjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBDb25zdGFudE9wZXJhbmQuY3JlYXRlU2NhbGFyKFxuICAgICAgICAgIGRlc2NPclZhbHVlLCB2YWx1ZU9yVHlwZSBhcyBNTE9wZXJhbmRUeXBlLCB0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIENvbnN0YW50T3BlcmFuZC5jcmVhdGVUZW5zb3IoXG4gICAgICAgICAgZGVzY09yVmFsdWUsIHZhbHVlT3JUeXBlIGFzIE1MQnVmZmVyVmlldywgdGhpcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1iYXRjaG5vcm1hbGl6YXRpb24pXG4gICAqL1xuICBiYXRjaE5vcm1hbGl6YXRpb24oXG4gICAgICBpbnB1dDogTUxPcGVyYW5kLCBtZWFuOiBNTE9wZXJhbmQsIHZhcmlhbmNlOiBNTE9wZXJhbmQsXG4gICAgICBvcHRpb25zOiBNTEJhdGNoTm9ybWFsaXphdGlvbk9wdGlvbnMgPSB7fSk6IE1MT3BlcmFuZCB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFxuICAgICAgICBbaW5wdXQsIG1lYW4sIHZhcmlhbmNlLCBvcHRpb25zLnNjYWxlLCBvcHRpb25zLmJpYXNdKTtcbiAgICByZXR1cm4gKG5ldyBCYXRjaE5vcm1hbGl6YXRpb24oaW5wdXQsIG1lYW4sIHZhcmlhbmNlLCBvcHRpb25zKSlcbiAgICAgICAgLmdldEZ1c2VkT3V0cHV0cygpWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1jbGFtcClcbiAgICovXG4gIGNsYW1wKHg6IE1MT3BlcmFuZCwgb3B0aW9uczogTUxDbGFtcE9wdGlvbnMpOiBNTE9wZXJhbmQ7XG4gIGNsYW1wKG9wdGlvbnM6IE1MQ2xhbXBPcHRpb25zKTogTUxPcGVyYXRvcjtcbiAgY2xhbXAoXG4gICAgICBvcGVyYW5kT3JPcHRpb25zOiBNTE9wZXJhbmR8TUxDbGFtcE9wdGlvbnMgPSB7fSxcbiAgICAgIG9wdGlvbnM6IE1MQ2xhbXBPcHRpb25zID0ge30pOiBNTE9wZXJhbmR8TUxPcGVyYXRvciB7XG4gICAgaWYgKG9wZXJhbmRPck9wdGlvbnMgaW5zdGFuY2VvZiBNTE9wZXJhbmQpIHtcbiAgICAgIGNvbnN0IHggPSBvcGVyYW5kT3JPcHRpb25zO1xuICAgICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFt4LCBvcHRpb25zLm1pblZhbHVlLCBvcHRpb25zLm1heFZhbHVlXSk7XG4gICAgICByZXR1cm4gKG5ldyBDbGFtcCh4LCBvcHRpb25zKSkub3V0cHV0O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBvcHRpb25zID0gb3BlcmFuZE9yT3B0aW9ucztcbiAgICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihbb3B0aW9ucy5taW5WYWx1ZSwgb3B0aW9ucy5tYXhWYWx1ZV0pO1xuICAgICAgcmV0dXJuIChuZXcgQ2xhbXAodW5kZWZpbmVkLCBvcHRpb25zKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1jb25jYXQpXG4gICAqL1xuICBjb25jYXQoaW5wdXRzOiBNTE9wZXJhbmRbXSwgYXhpczogbnVtYmVyKTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoaW5wdXRzKTtcbiAgICByZXR1cm4gKG5ldyBDb25jYXQoaW5wdXRzLCBheGlzKSkub3V0cHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1jb252MmQpXG4gICAqL1xuICBjb252MmQoaW5wdXQ6IE1MT3BlcmFuZCwgZmlsdGVyOiBNTE9wZXJhbmQsIG9wdGlvbnM6IE1MQ29udjJkT3B0aW9ucyA9IHt9KTpcbiAgICAgIE1MT3BlcmFuZCB7XG4gICAgY29uc3QgaW5wdXRzID0gW2lucHV0LCBmaWx0ZXJdO1xuICAgIGlmIChvcHRpb25zLmJpYXMpIHtcbiAgICAgIGlucHV0cy5wdXNoKG9wdGlvbnMuYmlhcyk7XG4gICAgfVxuICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihpbnB1dHMpO1xuICAgIHJldHVybiAobmV3IENvbnYyZChpbnB1dCwgZmlsdGVyLCBvcHRpb25zKSkuZ2V0RnVzZWRPdXRwdXRzKClbMF07XG4gIH1cblxuICAvLyBzdGFydCBvZiBlbGVtZW50LXdpc2UgYmluYXJ5IG9wZXJhdGlvbnNcbiAgLy8gaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNhcGktbWxncmFwaGJ1aWxkZXItYmluYXJ5XG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItYWRkKVxuICAgKi9cbiAgYWRkKGE6IE1MT3BlcmFuZCwgYjogTUxPcGVyYW5kKTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW2EsIGJdKTtcbiAgICByZXR1cm4gKG5ldyBBZGQoYSwgYikpLm91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItc3ViKVxuICAgKi9cbiAgc3ViKGE6IE1MT3BlcmFuZCwgYjogTUxPcGVyYW5kKTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW2EsIGJdKTtcbiAgICByZXR1cm4gKG5ldyBTdWIoYSwgYikpLm91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItbXVsKVxuICAgKi9cbiAgbXVsKGE6IE1MT3BlcmFuZCwgYjogTUxPcGVyYW5kKTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW2EsIGJdKTtcbiAgICByZXR1cm4gKG5ldyBNdWwoYSwgYikpLm91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItZGl2KVxuICAgKi9cbiAgZGl2KGE6IE1MT3BlcmFuZCwgYjogTUxPcGVyYW5kKTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW2EsIGJdKTtcbiAgICByZXR1cm4gKG5ldyBEaXYoYSwgYikpLm91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItbWF4KVxuICAgKi9cbiAgbWF4KGE6IE1MT3BlcmFuZCwgYjogTUxPcGVyYW5kKTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW2EsIGJdKTtcbiAgICByZXR1cm4gKG5ldyBNYXgoYSwgYikpLm91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItbWluKVxuICAgKi9cbiAgbWluKGE6IE1MT3BlcmFuZCwgYjogTUxPcGVyYW5kKTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW2EsIGJdKTtcbiAgICByZXR1cm4gKG5ldyBNaW4oYSwgYikpLm91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItcG93KVxuICAgKlxuICAgKi9cbiAgcG93KGE6IE1MT3BlcmFuZCwgYjogTUxPcGVyYW5kKTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW2EsIGJdKTtcbiAgICByZXR1cm4gKG5ldyBQb3coYSwgYikpLm91dHB1dDtcbiAgfVxuICAvLyBlbmQgb2YgZWxlbWVudC13aXNlIGJpbmFyeSBvcGVyYXRpb25zXG5cbiAgLy8gc3RhcnQgb2YgZWxlbWVudC13aXNlIHVuYXJ5IG9wZXJhdGlvbnNcbiAgLy8gaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItdW5hcnlcbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1leHApXG4gICAqL1xuICBleHAoeDogTUxPcGVyYW5kKTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW3hdKTtcbiAgICByZXR1cm4gKG5ldyBFeHAoeCkpLm91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItaGFyZC1zd2lzaClcbiAgICovXG4gIGhhcmRTd2lzaChpbnB1dDogTUxPcGVyYW5kKTogTUxPcGVyYW5kO1xuICBoYXJkU3dpc2goKTogTUxPcGVyYXRvcjtcbiAgaGFyZFN3aXNoKGlucHV0OiBNTE9wZXJhbmQgPSB1bmRlZmluZWQpOiBNTE9wZXJhbmR8TUxPcGVyYXRvciB7XG4gICAgaWYgKGlucHV0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBuZXcgSGFyZFN3aXNoKHVuZGVmaW5lZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihbaW5wdXRdKTtcbiAgICAgIHJldHVybiAobmV3IEhhcmRTd2lzaChpbnB1dCkpLm91dHB1dDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLXJlbHUpXG4gICAqL1xuICByZWx1KGlucHV0OiBNTE9wZXJhbmQpOiBNTE9wZXJhbmQ7XG4gIHJlbHUoKTogTUxPcGVyYXRvcjtcbiAgcmVsdShpbnB1dDogTUxPcGVyYW5kID0gdW5kZWZpbmVkKTogTUxPcGVyYW5kfE1MT3BlcmF0b3Ige1xuICAgIGlmIChpbnB1dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbmV3IFJlbHUodW5kZWZpbmVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFtpbnB1dF0pO1xuICAgICAgcmV0dXJuIChuZXcgUmVsdShpbnB1dCkpLm91dHB1dDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLXNpZ21vaWQpXG4gICAqL1xuICBzaWdtb2lkKGlucHV0OiBNTE9wZXJhbmQpOiBNTE9wZXJhbmQ7XG4gIHNpZ21vaWQoKTogTUxPcGVyYXRvcjtcbiAgc2lnbW9pZChpbnB1dDogTUxPcGVyYW5kID0gdW5kZWZpbmVkKTogTUxPcGVyYW5kfE1MT3BlcmF0b3Ige1xuICAgIGlmIChpbnB1dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbmV3IFNpZ21vaWQodW5kZWZpbmVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFtpbnB1dF0pO1xuICAgICAgcmV0dXJuIChuZXcgU2lnbW9pZChpbnB1dCkpLm91dHB1dDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLXRhbmgpXG4gICAqL1xuICB0YW5oKGlucHV0OiBNTE9wZXJhbmQpOiBNTE9wZXJhbmQ7XG4gIHRhbmgoKTogTUxPcGVyYXRvcjtcbiAgdGFuaChpbnB1dDogTUxPcGVyYW5kID0gdW5kZWZpbmVkKTogTUxPcGVyYW5kfE1MT3BlcmF0b3Ige1xuICAgIGlmIChpbnB1dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbmV3IFRhbmgodW5kZWZpbmVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFtpbnB1dF0pO1xuICAgICAgcmV0dXJuIChuZXcgVGFuaChpbnB1dCkpLm91dHB1dDtcbiAgICB9XG4gIH1cbiAgLy8gZW5kIG9mIGVsZW1lbnQtd2lzZSB1bmFyeSBvcGVyYXRpb25zXG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1nZW1tKVxuICAgKi9cbiAgZ2VtbShhOiBNTE9wZXJhbmQsIGI6IE1MT3BlcmFuZCwgb3B0aW9uczogTUxHZW1tT3B0aW9ucyA9IHt9KTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW2EsIGIsIG9wdGlvbnMuY10pO1xuICAgIHJldHVybiBHZW1tLmJ1aWxkKHRoaXMsIGEsIGIsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1ncnUpXG4gICAqL1xuICBncnUoaW5wdXQ6IE1MT3BlcmFuZCwgd2VpZ2h0OiBNTE9wZXJhbmQsIHJlY3VycmVudFdlaWdodDogTUxPcGVyYW5kLFxuICAgICAgc3RlcHM6IG51bWJlciwgaGlkZGVuU2l6ZTogbnVtYmVyLFxuICAgICAgb3B0aW9uczogTUxHcnVPcHRpb25zID0ge30pOiBNTE9wZXJhbmRbXSB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFtcbiAgICAgIGlucHV0LCB3ZWlnaHQsIHJlY3VycmVudFdlaWdodCwgb3B0aW9ucy5iaWFzLCBvcHRpb25zLnJlY3VycmVudEJpYXMsXG4gICAgICBvcHRpb25zLmluaXRpYWxIaWRkZW5TdGF0ZVxuICAgIF0pO1xuICAgIHJldHVybiAobmV3IEdydShpbnB1dCwgd2VpZ2h0LCByZWN1cnJlbnRXZWlnaHQsIHN0ZXBzLCBoaWRkZW5TaXplLCBvcHRpb25zKSlcbiAgICAgICAgLm91dHB1dHM7XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLWdydWNlbGwpXG4gICAqL1xuICBncnVDZWxsKFxuICAgICAgaW5wdXQ6IE1MT3BlcmFuZCwgd2VpZ2h0OiBNTE9wZXJhbmQsIHJlY3VycmVudFdlaWdodDogTUxPcGVyYW5kLFxuICAgICAgaGlkZGVuU3RhdGU6IE1MT3BlcmFuZCwgaGlkZGVuU2l6ZTogbnVtYmVyLFxuICAgICAgb3B0aW9uczogTUxHcnVDZWxsT3B0aW9ucyA9IHt9KTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW1xuICAgICAgaW5wdXQsIHdlaWdodCwgcmVjdXJyZW50V2VpZ2h0LCBoaWRkZW5TdGF0ZSwgb3B0aW9ucy5iaWFzLFxuICAgICAgb3B0aW9ucy5yZWN1cnJlbnRCaWFzXG4gICAgXSk7XG4gICAgcmV0dXJuIChuZXcgR3J1Q2VsbChcbiAgICAgICAgICAgICAgICBpbnB1dCwgd2VpZ2h0LCByZWN1cnJlbnRXZWlnaHQsIGhpZGRlblN0YXRlLCBoaWRkZW5TaXplLFxuICAgICAgICAgICAgICAgIG9wdGlvbnMpKVxuICAgICAgICAub3V0cHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2FwaS1tbGdyYXBoYnVpbGRlci1pbnN0YW5jZW5vcm0pXG4gICAqL1xuICBpbnN0YW5jZU5vcm1hbGl6YXRpb24oXG4gICAgICBpbnB1dDogTUxPcGVyYW5kLFxuICAgICAgb3B0aW9uczogTUxJbnN0YW5jZU5vcm1hbGl6YXRpb25PcHRpb25zID0ge30pOiBNTE9wZXJhbmQge1xuICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihbaW5wdXQsIG9wdGlvbnMuYmlhcywgb3B0aW9ucy5zY2FsZV0pO1xuICAgIHJldHVybiAobmV3IEluc3RhbmNlTm9ybWFsaXphdGlvbihpbnB1dCwgb3B0aW9ucykpLm91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItbGVha3lyZWx1KVxuICAgKi9cbiAgbGVha3lSZWx1KHg6IE1MT3BlcmFuZCwgb3B0aW9uczogTUxMZWFreVJlbHVPcHRpb25zKTogTUxPcGVyYW5kO1xuICBsZWFreVJlbHUob3B0aW9uczogTUxMZWFreVJlbHVPcHRpb25zKTogTUxPcGVyYXRvcjtcbiAgbGVha3lSZWx1KFxuICAgICAgb3BlcmFuZE9yT3B0aW9uczogTUxPcGVyYW5kfE1MTGVha3lSZWx1T3B0aW9ucyA9IHt9LFxuICAgICAgb3B0aW9uczogTUxMZWFreVJlbHVPcHRpb25zID0ge30pOiBNTE9wZXJhbmR8TUxPcGVyYXRvciB7XG4gICAgaWYgKG9wZXJhbmRPck9wdGlvbnMgaW5zdGFuY2VvZiBNTE9wZXJhbmQpIHtcbiAgICAgIGNvbnN0IHggPSBvcGVyYW5kT3JPcHRpb25zO1xuICAgICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFt4XSk7XG4gICAgICByZXR1cm4gKG5ldyBMZWFreVJlbHUoeCwgb3B0aW9ucy5hbHBoYSkpLm91dHB1dDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IG9wZXJhbmRPck9wdGlvbnM7XG4gICAgICByZXR1cm4gKG5ldyBMZWFreVJlbHUodW5kZWZpbmVkLCBvcHRpb25zLmFscGhhKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1tYXRtdWwpXG4gICAqL1xuICBtYXRtdWwoYTogTUxPcGVyYW5kLCBiOiBNTE9wZXJhbmQpOiBNTE9wZXJhbmQge1xuICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihbYSwgYl0pO1xuICAgIHJldHVybiAobmV3IE1hdE11bChhLCBiKSkub3V0cHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2FwaS1tbGdyYXBoYnVpbGRlci1wYWQpXG4gICAqL1xuICBwYWQoaW5wdXQ6IE1MT3BlcmFuZCwgcGFkZGluZzogTUxPcGVyYW5kLFxuICAgICAgb3B0aW9uczogTUxQYWRPcHRpb25zID0ge30pOiBNTE9wZXJhbmQge1xuICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihbaW5wdXQsIHBhZGRpbmddKTtcbiAgICByZXR1cm4gKG5ldyBQYWQoaW5wdXQsIHBhZGRpbmcsIG9wdGlvbnMpKS5vdXRwdXQ7XG4gIH1cblxuICAvLyBzdGFydCBvZiBwb29saW5nIG9wZXJhdGlvbnNcbiAgLy8gaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItcG9vbDJkXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItYXZlcmFnZXBvb2wyZClcbiAgICovXG4gIGF2ZXJhZ2VQb29sMmQoaW5wdXQ6IE1MT3BlcmFuZCwgb3B0aW9uczogTUxQb29saW5nMmRPcHRpb25zID0ge30pOiBNTE9wZXJhbmQge1xuICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihbaW5wdXRdKTtcbiAgICByZXR1cm4gKG5ldyBBdmVyYWdlUG9vbDJkKGlucHV0LCBvcHRpb25zKSkub3V0cHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1sMnBvb2wyZClcbiAgICovXG4gIGwyUG9vbDJkKGlucHV0OiBNTE9wZXJhbmQsIG9wdGlvbnM6IE1MUG9vbGluZzJkT3B0aW9ucyA9IHt9KTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW2lucHV0XSk7XG4gICAgcmV0dXJuIChuZXcgTDJQb29sMmQoaW5wdXQsIG9wdGlvbnMpKS5vdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLW1heHBvb2wyZClcbiAgICovXG4gIG1heFBvb2wyZChpbnB1dDogTUxPcGVyYW5kLCBvcHRpb25zOiBNTFBvb2xpbmcyZE9wdGlvbnMgPSB7fSk6IE1MT3BlcmFuZCB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFtpbnB1dF0pO1xuICAgIHJldHVybiAobmV3IE1heFBvb2wyZChpbnB1dCwgb3B0aW9ucykpLm91dHB1dDtcbiAgfVxuICAvLyBlbmQgb2YgcG9vbGluZyBvcGVyYXRpb25zXG5cbiAgLy8gc3RhcnQgb2YgcmVkdWN0aW9uIG9wZXJhdGlvbnNcbiAgLy8gaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNhcGktbWxncmFwaGJ1aWxkZXItcmVkdWNlXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItcmVkdWNlbDEpXG4gICAqL1xuICByZWR1Y2VMMShpbnB1dDogTUxPcGVyYW5kLCBvcHRpb25zOiBNTFJlZHVjZU9wdGlvbnMgPSB7fSk6IE1MT3BlcmFuZCB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFtpbnB1dF0pO1xuICAgIHJldHVybiAobmV3IFJlZHVjZUwxKGlucHV0LCBvcHRpb25zKSkub3V0cHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1yZWR1Y2VsMilcbiAgICovXG4gIHJlZHVjZUwyKGlucHV0OiBNTE9wZXJhbmQsIG9wdGlvbnM6IE1MUmVkdWNlT3B0aW9ucyA9IHt9KTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW2lucHV0XSk7XG4gICAgcmV0dXJuIChuZXcgUmVkdWNlTDIoaW5wdXQsIG9wdGlvbnMpKS5vdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLXJlZHVjZWxvZ3N1bWV4cClcbiAgICovXG4gIHJlZHVjZUxvZ1N1bUV4cChpbnB1dDogTUxPcGVyYW5kLCBvcHRpb25zOiBNTFJlZHVjZU9wdGlvbnMgPSB7fSk6IE1MT3BlcmFuZCB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFtpbnB1dF0pO1xuICAgIHJldHVybiAobmV3IFJlZHVjZUxvZ1N1bUV4cChpbnB1dCwgb3B0aW9ucykpLm91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItcmVkdWNlbWF4KVxuICAgKi9cbiAgcmVkdWNlTWF4KGlucHV0OiBNTE9wZXJhbmQsIG9wdGlvbnM6IE1MUmVkdWNlT3B0aW9ucyA9IHt9KTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW2lucHV0XSk7XG4gICAgcmV0dXJuIChuZXcgUmVkdWNlTWF4KGlucHV0LCBvcHRpb25zKSkub3V0cHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1yZWR1Y2VtZWFuKVxuICAgKi9cbiAgcmVkdWNlTWVhbihpbnB1dDogTUxPcGVyYW5kLCBvcHRpb25zOiBNTFJlZHVjZU9wdGlvbnMgPSB7fSk6IE1MT3BlcmFuZCB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFtpbnB1dF0pO1xuICAgIHJldHVybiAobmV3IFJlZHVjZU1lYW4oaW5wdXQsIG9wdGlvbnMpKS5vdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLXJlZHVjZW1pbilcbiAgICovXG4gIHJlZHVjZU1pbihpbnB1dDogTUxPcGVyYW5kLCBvcHRpb25zOiBNTFJlZHVjZU9wdGlvbnMgPSB7fSk6IE1MT3BlcmFuZCB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFtpbnB1dF0pO1xuICAgIHJldHVybiAobmV3IFJlZHVjZU1pbihpbnB1dCwgb3B0aW9ucykpLm91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItcmVkdWNlcHJvZHVjdClcbiAgICovXG4gIHJlZHVjZVByb2R1Y3QoaW5wdXQ6IE1MT3BlcmFuZCwgb3B0aW9uczogTUxSZWR1Y2VPcHRpb25zID0ge30pOiBNTE9wZXJhbmQge1xuICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihbaW5wdXRdKTtcbiAgICByZXR1cm4gKG5ldyBSZWR1Y2VQcm9kdWN0KGlucHV0LCBvcHRpb25zKSkub3V0cHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1yZWR1Y2VzdW0pXG4gICAqL1xuICByZWR1Y2VTdW0oaW5wdXQ6IE1MT3BlcmFuZCwgb3B0aW9uczogTUxSZWR1Y2VPcHRpb25zID0ge30pOiBNTE9wZXJhbmQge1xuICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihbaW5wdXRdKTtcbiAgICByZXR1cm4gKG5ldyBSZWR1Y2VTdW0oaW5wdXQsIG9wdGlvbnMpKS5vdXRwdXQ7XG4gIH1cbiAgLy8gZW5kIG9mIHJlZHVjdGlvbiBvcGVyYXRpb25zXG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2FwaS1tbGdyYXBoYnVpbGRlci1yZXNhbXBsZSlcbiAgICovXG4gIHJlc2FtcGxlKGlucHV0OiBNTE9wZXJhbmQsIG9wdGlvbnM6IE1MUmVzYW1wbGVPcHRpb25zID0ge30pOiBNTE9wZXJhbmQge1xuICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihbaW5wdXRdKTtcbiAgICByZXR1cm4gKG5ldyBSZXNhbXBsZShpbnB1dCwgb3B0aW9ucykpLm91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItcmVzaGFwZSlcbiAgICovXG4gIHJlc2hhcGUoaW5wdXQ6IE1MT3BlcmFuZCwgbmV3U2hhcGU6IG51bWJlcltdKTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW2lucHV0XSk7XG4gICAgcmV0dXJuIChuZXcgUmVzaGFwZShpbnB1dCwgbmV3U2hhcGUpKS5vdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLXNsaWNlKVxuICAgKi9cbiAgc2xpY2UoXG4gICAgICBpbnB1dDogTUxPcGVyYW5kLCBzdGFydHM6IG51bWJlcltdLCBzaXplczogbnVtYmVyW10sXG4gICAgICBvcHRpb25zOiBNTFNsaWNlT3B0aW9ucyA9IHt9KTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW2lucHV0XSk7XG4gICAgcmV0dXJuIChuZXcgU2xpY2UoaW5wdXQsIHN0YXJ0cywgc2l6ZXMsIG9wdGlvbnMuYXhlcykpLm91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItc29mdG1heClcbiAgICovXG4gIHNvZnRtYXgoeDogTUxPcGVyYW5kKTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW3hdKTtcbiAgICByZXR1cm4gKG5ldyBTb2Z0bWF4KHgpKS5vdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLXNwbGl0KVxuICAgKi9cbiAgc3BsaXQoXG4gICAgICBpbnB1dDogTUxPcGVyYW5kLCBzcGxpdHM6IG51bWJlcnxudW1iZXJbXSxcbiAgICAgIG9wdGlvbnM6IE1MU3BsaXRPcHRpb25zID0ge30pOiBNTE9wZXJhbmRbXSB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFtpbnB1dF0pO1xuICAgIHJldHVybiAobmV3IFNwbGl0KGlucHV0LCBzcGxpdHMsIG9wdGlvbnMpKS5vdXRwdXRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1zcXVlZXplKVxuICAgKi9cbiAgc3F1ZWV6ZShpbnB1dDogTUxPcGVyYW5kLCBvcHRpb25zOiBNTFNxdWVlemVPcHRpb25zID0ge30pOiBNTE9wZXJhbmQge1xuICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihbaW5wdXRdKTtcbiAgICByZXR1cm4gKG5ldyBTcXVlZXplKGlucHV0LCBvcHRpb25zLmF4ZXMpKS5vdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLXRyYW5zcG9zZSlcbiAgICovXG4gIHRyYW5zcG9zZShpbnB1dDogTUxPcGVyYW5kLCBvcHRpb25zOiBNTFRyYW5zcG9zZU9wdGlvbnMgPSB7fSk6IE1MT3BlcmFuZCB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFtpbnB1dF0pO1xuICAgIHJldHVybiAobmV3IFRyYW5zcG9zZShpbnB1dCwgb3B0aW9ucy5wZXJtdXRhdGlvbikpLm91dHB1dDtcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVPcGVyYW5kQnVpbGRlcihvcGVyYW5kczogTUxPcGVyYW5kW10pIHtcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIG9wZXJhbmRzLmV2ZXJ5KFxuICAgICAgICAgICAgb3BlcmFuZCA9PiBvcGVyYW5kID9cbiAgICAgICAgICAgICAgICAob3BlcmFuZCBpbnN0YW5jZW9mIE1MT3BlcmFuZCAmJiBvcGVyYW5kLmJ1aWxkZXIgPT09IHRoaXMpIDpcbiAgICAgICAgICAgICAgICB0cnVlKSxcbiAgICAgICAgJ1RoZSBvcGVyYW5kIGlzIG5vdCBidWlsdCBieSB0aGlzIGJ1aWxkZXIuJyk7XG4gIH1cbn1cbiIsImltcG9ydCB7TUxCdWZmZXJWaWV3LCBNTEdyYXBoQnVpbGRlcn0gZnJvbSAnLi9ncmFwaF9idWlsZGVyJztcbmltcG9ydCB7T3BlcmF0aW9ufSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge0FycmF5QnVmZmVyVmlld30gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNlbnVtZGVmLW1sb3BlcmFuZHR5cGUpXG4gKi9cbmV4cG9ydCBlbnVtIE1MT3BlcmFuZFR5cGUge1xuICAnZmxvYXQzMicgPSAnZmxvYXQzMicsXG4gICdmbG9hdDE2JyA9ICdmbG9hdDE2JyxcbiAgJ2ludDMyJyA9ICdpbnQzMicsXG4gICd1aW50MzInID0gJ3VpbnQzMicsXG4gICdpbnQ4JyA9ICdpbnQ4JyxcbiAgJ3VpbnQ4JyA9ICd1aW50OCdcbn1cblxuLyoqXG4gKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkaWN0ZGVmLW1sb3BlcmFuZGRlc2NyaXB0b3IpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTUxPcGVyYW5kRGVzY3JpcHRvciB7XG4gIHR5cGU6IE1MT3BlcmFuZFR5cGU7XG4gIGRpbWVuc2lvbnM6IG51bWJlcltdO1xufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2FwaS1tbG9wZXJhbmQpXG4gKi9cbmV4cG9ydCBjbGFzcyBNTE9wZXJhbmQge1xuICBwcml2YXRlIHJlYWRvbmx5IGJ1aWxkZXJfOiBNTEdyYXBoQnVpbGRlcjtcblxuICAvKiogQGludGVybmFsICovXG4gIGdldCBidWlsZGVyKCk6IE1MR3JhcGhCdWlsZGVyIHtcbiAgICByZXR1cm4gdGhpcy5idWlsZGVyXztcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgY29uc3RydWN0b3IoYnVpbGRlcjogTUxHcmFwaEJ1aWxkZXIpIHtcbiAgICB0aGlzLmJ1aWxkZXJfID0gYnVpbGRlcjtcbiAgfVxufVxuXG4vKiogQGludGVybmFsICovXG5leHBvcnQgY2xhc3MgSW5wdXRPcGVyYW5kIGV4dGVuZHMgTUxPcGVyYW5kIHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBkZXNjOiBNTE9wZXJhbmREZXNjcmlwdG9yO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgbmFtZTogc3RyaW5nLCBkZXNjOiBNTE9wZXJhbmREZXNjcmlwdG9yLCBidWlsZGVyOiBNTEdyYXBoQnVpbGRlcikge1xuICAgIHN1cGVyKGJ1aWxkZXIpO1xuICAgIHV0aWxzLmFzc2VydCh0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycsICdUaGUgbmFtZSBwYXJhbWV0ZXIgaXMgaW52YWxpZCcpO1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kRGVzY3JpcHRvcihkZXNjKTtcbiAgICB0aGlzLmRlc2MgPSBkZXNjO1xuICB9XG59XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBjbGFzcyBDb25zdGFudE9wZXJhbmQgZXh0ZW5kcyBNTE9wZXJhbmQge1xuICByZWFkb25seSBkZXNjOiBNTE9wZXJhbmREZXNjcmlwdG9yO1xuICByZWFkb25seSB2YWx1ZTogbnVtYmVyfEFycmF5QnVmZmVyVmlldztcblxuICBzdGF0aWMgY3JlYXRlU2NhbGFyKFxuICAgICAgdmFsdWU6IG51bWJlciwgdHlwZTogTUxPcGVyYW5kVHlwZSA9IE1MT3BlcmFuZFR5cGUuZmxvYXQzMixcbiAgICAgIGJ1aWxkZXI6IE1MR3JhcGhCdWlsZGVyKTogQ29uc3RhbnRPcGVyYW5kIHtcbiAgICB1dGlscy5hc3NlcnQodHlwZSBpbiBNTE9wZXJhbmRUeXBlLCAnVGhlIG9wZXJhbmQgdHlwZSBpcyBpbnZhbGlkLicpO1xuICAgIHV0aWxzLnZhbGlkYXRlVmFsdWVUeXBlKHZhbHVlLCB0eXBlKTtcbiAgICByZXR1cm4gbmV3IENvbnN0YW50T3BlcmFuZCh7dHlwZX0gYXMgTUxPcGVyYW5kRGVzY3JpcHRvciwgdmFsdWUsIGJ1aWxkZXIpO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVRlbnNvcihcbiAgICAgIGRlc2M6IE1MT3BlcmFuZERlc2NyaXB0b3IsIHZhbHVlOiBNTEJ1ZmZlclZpZXcsXG4gICAgICBidWlsZGVyOiBNTEdyYXBoQnVpbGRlcik6IENvbnN0YW50T3BlcmFuZCB7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICB1dGlscy5pc1R5cGVkQXJyYXkodmFsdWUpLFxuICAgICAgICAnT25seSBBcnJheUJ1ZmZlclZpZXcgdmFsdWUgdHlwZSBpcyBzdXBwb3J0ZWQuJyk7XG4gICAgY29uc3QgYXJyYXkgPSB2YWx1ZSBhcyBBcnJheUJ1ZmZlclZpZXc7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kRGVzY3JpcHRvcihkZXNjKTtcbiAgICB1dGlscy52YWxpZGF0ZVR5cGVkQXJyYXkoYXJyYXksIGRlc2MudHlwZSwgZGVzYy5kaW1lbnNpb25zKTtcbiAgICByZXR1cm4gbmV3IENvbnN0YW50T3BlcmFuZChkZXNjLCBhcnJheSwgYnVpbGRlcik7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgICAgZGVzYzogTUxPcGVyYW5kRGVzY3JpcHRvciwgdmFsdWU6IG51bWJlcnxBcnJheUJ1ZmZlclZpZXcsXG4gICAgICBidWlsZGVyOiBNTEdyYXBoQnVpbGRlcikge1xuICAgIHN1cGVyKGJ1aWxkZXIpO1xuICAgIHRoaXMuZGVzYyA9IGRlc2M7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9XG59XG5cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgT3V0cHV0T3BlcmFuZCBleHRlbmRzIE1MT3BlcmFuZCB7XG4gIHJlYWRvbmx5IG9wZXJhdGlvbjogT3BlcmF0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKG9wZXJhdGlvbjogT3BlcmF0aW9uKSB7XG4gICAgc3VwZXIob3BlcmF0aW9uLmJ1aWxkZXIpO1xuICAgIHRoaXMub3BlcmF0aW9uID0gb3BlcmF0aW9uO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyB0ZiBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge0V4ZWN1dGlvbkNvbnRleHR9IGZyb20gJy4vZ3JhcGgnO1xuaW1wb3J0IHtNTEdyYXBoQnVpbGRlcn0gZnJvbSAnLi9ncmFwaF9idWlsZGVyJztcbmltcG9ydCB7TUxPcGVyYW5kLCBPdXRwdXRPcGVyYW5kfSBmcm9tICcuL29wZXJhbmQnO1xuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2FwaS1tbG9wZXJhdG9yKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1MT3BlcmF0b3Ige1xuICAvKiogQGludGVybmFsICovXG4gIGFwcGx5KGlucHV0OiBNTE9wZXJhbmQpOiBPdXRwdXRPcGVyYW5kO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcnVuT3AoeDogdGYuVGVuc29yKTogdGYuVGVuc29yO1xufVxuXG4vKiogQGludGVybmFsICovXG5leHBvcnQgaW50ZXJmYWNlIEZ1c2VkT3BlcmF0aW9uIHtcbiAgZ2V0RnVzZWRPdXRwdXRzKCk6IE91dHB1dE9wZXJhbmRbXTtcbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE9wZXJhdGlvbiB7XG4gIHByb3RlY3RlZCBidWlsZGVyXzogTUxHcmFwaEJ1aWxkZXI7XG4gIHByb3RlY3RlZCBvdXRwdXRzXzogT3V0cHV0T3BlcmFuZFtdID0gW107XG5cbiAgZ2V0IGJ1aWxkZXIoKTogTUxHcmFwaEJ1aWxkZXIge1xuICAgIHJldHVybiB0aGlzLmJ1aWxkZXJfO1xuICB9XG5cbiAgZ2V0IG91dHB1dHMoKTogT3V0cHV0T3BlcmFuZFtdIHtcbiAgICByZXR1cm4gdGhpcy5vdXRwdXRzXztcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGJ1aWxkZXI6IE1MR3JhcGhCdWlsZGVyKSB7XG4gICAgdGhpcy5idWlsZGVyXyA9IGJ1aWxkZXI7XG4gIH1cblxuICBhYnN0cmFjdCBpbnB1dHMoKTogTUxPcGVyYW5kW107XG5cbiAgY29tcHV0ZShjb250ZXh0OiBFeGVjdXRpb25Db250ZXh0KTogdm9pZCB7XG4gICAgY29uc3QgaW5wdXRUZW5zb3JzOiBNYXA8TUxPcGVyYW5kLCB0Zi5UZW5zb3I+ID0gbmV3IE1hcCgpO1xuICAgIGZvciAoY29uc3QgaW5wdXRPcGVyYW5kIG9mIHRoaXMuaW5wdXRzKCkpIHtcbiAgICAgIGlucHV0VGVuc29ycy5zZXQoaW5wdXRPcGVyYW5kLCBjb250ZXh0LmdldFRlbnNvcihpbnB1dE9wZXJhbmQpKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0cHV0VGVuc29ycyA9IHRmLnRpZHkoKCkgPT4gdGhpcy5jb21wdXRlSW1wbChpbnB1dFRlbnNvcnMpKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3V0cHV0c18ubGVuZ3RoOyArK2kpIHtcbiAgICAgIGNvbnRleHQuc2V0T3V0cHV0VGVuc29yKHRoaXMub3V0cHV0c19baV0sIG91dHB1dFRlbnNvcnNbaV0pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGlucHV0T3BlcmFuZCBvZiB0aGlzLmlucHV0cygpKSB7XG4gICAgICBjb250ZXh0LnJlbGVhc2VUZW5zb3IoaW5wdXRPcGVyYW5kKTtcbiAgICB9XG4gIH1cblxuICBhYnN0cmFjdCBjb21wdXRlSW1wbChpbnB1dFRlbnNvcnM6IE1hcDxNTE9wZXJhbmQsIHRmLlRlbnNvcj4pOiB0Zi5UZW5zb3JbXTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIGRpc3Bvc2UoKTogdm9pZCB7fVxufVxuXG4vKiogQGludGVybmFsICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgU2luZ2xlT3V0cHV0T3BlcmF0aW9uIGV4dGVuZHMgT3BlcmF0aW9uIHtcbiAgY29uc3RydWN0b3IoYnVpbGRlcjogTUxHcmFwaEJ1aWxkZXIpIHtcbiAgICBzdXBlcihidWlsZGVyKTtcbiAgICBpZiAoYnVpbGRlcikge1xuICAgICAgdGhpcy5jcmVhdGVPdXRwdXQoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlT3V0cHV0KCk6IHZvaWQge1xuICAgIC8vIE9wZXJhdGlvbiBwcm9kdWNlcyAxIG91dHB1dCBvcGVyYW5kIGJ5IGRlZmF1bHQuXG4gICAgdGhpcy5vdXRwdXRzXy5wdXNoKG5ldyBPdXRwdXRPcGVyYW5kKHRoaXMpKTtcbiAgfVxuXG4gIGdldCBvdXRwdXQoKTogT3V0cHV0T3BlcmFuZCB7XG4gICAgcmV0dXJuIHRoaXMub3V0cHV0c19bMF07XG4gIH1cblxuICBjb21wdXRlSW1wbChpbnB1dFRlbnNvcnM6IE1hcDxNTE9wZXJhbmQsIHRmLlRlbnNvcj4pOiB0Zi5UZW5zb3JbXSB7XG4gICAgcmV0dXJuIFt0aGlzLnJ1bihpbnB1dFRlbnNvcnMpXTtcbiAgfVxuXG4gIGFic3RyYWN0IHJ1bihpbnB1dFRlbnNvcnM6IE1hcDxNTE9wZXJhbmQsIHRmLlRlbnNvcj4pOiB0Zi5UZW5zb3I7XG59IiwiaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNTEJhdGNoTm9ybWFsaXphdGlvbk9wdGlvbnN9IGZyb20gJy4uL2dyYXBoX2J1aWxkZXInO1xuaW1wb3J0IHtNTE9wZXJhbmQsIE91dHB1dE9wZXJhbmR9IGZyb20gJy4uL29wZXJhbmQnO1xuaW1wb3J0IHtGdXNlZE9wZXJhdGlvbiwgTUxPcGVyYXRvciwgU2luZ2xlT3V0cHV0T3BlcmF0aW9ufSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgQmF0Y2hOb3JtYWxpemF0aW9uIGV4dGVuZHMgU2luZ2xlT3V0cHV0T3BlcmF0aW9uIGltcGxlbWVudHNcbiAgICBGdXNlZE9wZXJhdGlvbiB7XG4gIHByaXZhdGUgaW5wdXRfOiBNTE9wZXJhbmQ7XG4gIHByaXZhdGUgbWVhbl86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSB2YXJpYW5jZV86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSBzY2FsZV8/OiBNTE9wZXJhbmQ7XG4gIHByaXZhdGUgYmlhc18/OiBNTE9wZXJhbmQ7XG4gIHByaXZhdGUgYXhpc18/OiBudW1iZXI7XG4gIHByaXZhdGUgZXBzaWxvbl8/OiBudW1iZXI7XG4gIHByaXZhdGUgYWN0aXZhdGlvbl8/OiBNTE9wZXJhdG9yO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgaW5wdXQ6IE1MT3BlcmFuZCwgbWVhbjogTUxPcGVyYW5kLCB2YXJpYW5jZTogTUxPcGVyYW5kLFxuICAgICAgb3B0aW9uczogTUxCYXRjaE5vcm1hbGl6YXRpb25PcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihpbnB1dC5idWlsZGVyKTtcbiAgICB1dGlscy52YWxpZGF0ZU9wZXJhbmQoaW5wdXQpO1xuICAgIHRoaXMuaW5wdXRfID0gaW5wdXQ7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKG1lYW4pO1xuICAgIHRoaXMubWVhbl8gPSBtZWFuO1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZCh2YXJpYW5jZSk7XG4gICAgdGhpcy52YXJpYW5jZV8gPSB2YXJpYW5jZTtcbiAgICB1dGlscy52YWxpZGF0ZU9wdGlvbmFsT3BlcmFuZChvcHRpb25zLnNjYWxlKTtcbiAgICB0aGlzLnNjYWxlXyA9IG9wdGlvbnMuc2NhbGU7XG4gICAgdXRpbHMudmFsaWRhdGVPcHRpb25hbE9wZXJhbmQob3B0aW9ucy5iaWFzKTtcbiAgICB0aGlzLmJpYXNfID0gb3B0aW9ucy5iaWFzO1xuICAgIGlmIChvcHRpb25zLmF4aXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgYXhpcyA9IG9wdGlvbnMuYXhpcztcbiAgICAgIHV0aWxzLmFzc2VydCh1dGlscy5pc0ludGVnZXIoYXhpcyksICdUaGUgYXhpcyBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICAgIHRoaXMuYXhpc18gPSBheGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmF4aXNfID0gMTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuZXBzaWxvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBlcHNpbG9uID0gb3B0aW9ucy5lcHNpbG9uO1xuICAgICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgIHR5cGVvZiBlcHNpbG9uID09PSAnbnVtYmVyJywgJ1RoZSBlcHNpbG9uIHBhcmFtZXRlciBpcyBpbnZhbGlkJyk7XG4gICAgICB0aGlzLmVwc2lsb25fID0gZXBzaWxvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lcHNpbG9uXyA9IDFlLTU7XG4gICAgfVxuICAgIHRoaXMuYWN0aXZhdGlvbl8gPSBvcHRpb25zLmFjdGl2YXRpb247XG4gIH1cblxuICBpbnB1dHMoKTogTUxPcGVyYW5kW10ge1xuICAgIGNvbnN0IGlucHV0czogTUxPcGVyYW5kW10gPSBbdGhpcy5pbnB1dF8sIHRoaXMubWVhbl8sIHRoaXMudmFyaWFuY2VfXTtcbiAgICBpZiAodGhpcy5zY2FsZV8pIHtcbiAgICAgIGlucHV0cy5wdXNoKHRoaXMuc2NhbGVfKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYmlhc18pIHtcbiAgICAgIGlucHV0cy5wdXNoKHRoaXMuYmlhc18pO1xuICAgIH1cbiAgICByZXR1cm4gaW5wdXRzO1xuICB9XG5cbiAgZ2V0RnVzZWRPdXRwdXRzKCk6IE91dHB1dE9wZXJhbmRbXSB7XG4gICAgaWYgKHRoaXMuYWN0aXZhdGlvbl8pIHtcbiAgICAgIHJldHVybiBbdGhpcy5hY3RpdmF0aW9uXy5hcHBseSh0aGlzLm91dHB1dCldO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW3RoaXMub3V0cHV0XTtcbiAgICB9XG4gIH1cblxuICBydW4oaW5wdXRUZW5zb3JzOiBNYXA8TUxPcGVyYW5kLCB0Zi5UZW5zb3I+KTogdGYuVGVuc29yIHtcbiAgICBjb25zdCBpbnB1dDogdGYuVGVuc29yID0gaW5wdXRUZW5zb3JzLmdldCh0aGlzLmlucHV0Xyk7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICB0aGlzLmF4aXNfIDwgaW5wdXQucmFuayAmJiB0aGlzLmF4aXNfID49IC1pbnB1dC5yYW5rLFxuICAgICAgICAnVGhlIGF4aXMgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgY29uc3QgYXhpcyA9IHRoaXMuYXhpc18gPj0gMCA/IHRoaXMuYXhpc18gOiBpbnB1dC5yYW5rICsgdGhpcy5heGlzXztcbiAgICBjb25zdCBtZWFuOiB0Zi5UZW5zb3IgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMubWVhbl8pO1xuICAgIHV0aWxzLmFzc2VydChtZWFuLnJhbmsgPT09IDEsICdUaGUgbWVhbiBvcGVyYW5kIGlzIG5vdCAxLUQuJyk7XG4gICAgY29uc3QgdmFyaWFuY2U6IHRmLlRlbnNvciA9IGlucHV0VGVuc29ycy5nZXQodGhpcy52YXJpYW5jZV8pO1xuICAgIHV0aWxzLmFzc2VydCh2YXJpYW5jZS5yYW5rID09PSAxLCAnVGhlIG1lYW4gb3BlcmFuZCBpcyBub3QgMS1ELicpO1xuICAgIGxldCBzY2FsZTogdGYuVGVuc29yO1xuICAgIGlmICh0aGlzLnNjYWxlXykge1xuICAgICAgc2NhbGUgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuc2NhbGVfKTtcbiAgICAgIHV0aWxzLmFzc2VydChzY2FsZS5yYW5rID09PSAxLCAnVGhlIHNjYWxlIG9wZXJhbmQgaXMgbm90IDEtRC4nKTtcbiAgICB9XG4gICAgbGV0IGJpYXM6IHRmLlRlbnNvcjtcbiAgICBpZiAodGhpcy5iaWFzXykge1xuICAgICAgYmlhcyA9IGlucHV0VGVuc29ycy5nZXQodGhpcy5iaWFzXyk7XG4gICAgICB1dGlscy5hc3NlcnQoYmlhcy5yYW5rID09PSAxLCAnVGhlIGJpYXMgb3BlcmFuZCBpcyBub3QgMS1ELicpO1xuICAgIH1cbiAgICAvLyB0Zi5iYXRjaE5vcm0gb25seSBjb21wdXRlcyBmb3IgdGhlIGxhc3QgZGltZW5zaW9uLlxuICAgIGNvbnN0IHBlcm11dGF0aW9uID0gQXJyYXkuZnJvbShBcnJheShpbnB1dC5yYW5rKS5rZXlzKCkpO1xuICAgIHBlcm11dGF0aW9uW2F4aXNdID0gaW5wdXQucmFuayAtIDE7XG4gICAgcGVybXV0YXRpb25baW5wdXQucmFuayAtIDFdID0gYXhpcztcbiAgICByZXR1cm4gdGYudHJhbnNwb3NlKFxuICAgICAgICB0Zi5iYXRjaE5vcm0oXG4gICAgICAgICAgICB0Zi50cmFuc3Bvc2UoaW5wdXQsIHBlcm11dGF0aW9uKSwgbWVhbiwgdmFyaWFuY2UsIGJpYXMsIHNjYWxlLFxuICAgICAgICAgICAgdGhpcy5lcHNpbG9uXyksXG4gICAgICAgIHBlcm11dGF0aW9uKTtcbiAgfVxufSIsImltcG9ydCAqIGFzIHRmIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TUxPcGVyYW5kfSBmcm9tICcuLi9vcGVyYW5kJztcbmltcG9ydCB7U2luZ2xlT3V0cHV0T3BlcmF0aW9ufSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmluYXJ5IGV4dGVuZHMgU2luZ2xlT3V0cHV0T3BlcmF0aW9uIHtcbiAgcHJpdmF0ZSBhXzogTUxPcGVyYW5kO1xuICBwcml2YXRlIGJfOiBNTE9wZXJhbmQ7XG5cbiAgY29uc3RydWN0b3IoYTogTUxPcGVyYW5kLCBiOiBNTE9wZXJhbmQpIHtcbiAgICBzdXBlcihhLmJ1aWxkZXIpO1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZChhKTtcbiAgICB0aGlzLmFfID0gYTtcbiAgICB1dGlscy52YWxpZGF0ZU9wZXJhbmQoYik7XG4gICAgdGhpcy5iXyA9IGI7XG4gIH1cblxuICBpbnB1dHMoKTogTUxPcGVyYW5kW10ge1xuICAgIHJldHVybiBbdGhpcy5hXywgdGhpcy5iX107XG4gIH1cblxuICBydW4oaW5wdXRUZW5zb3JzOiBNYXA8TUxPcGVyYW5kLCB0Zi5UZW5zb3I+KTogdGYuVGVuc29yIHtcbiAgICBjb25zdCBhOiB0Zi5UZW5zb3IgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuYV8pO1xuICAgIGNvbnN0IGI6IHRmLlRlbnNvciA9IGlucHV0VGVuc29ycy5nZXQodGhpcy5iXyk7XG4gICAgcmV0dXJuIHRoaXMucnVuT3AoYSwgYik7XG4gIH1cblxuICBhYnN0cmFjdCBydW5PcChhOiB0Zi5UZW5zb3IsIGI6IHRmLlRlbnNvcik6IHRmLlRlbnNvcjtcbn1cblxuZXhwb3J0IGNsYXNzIEFkZCBleHRlbmRzIEJpbmFyeSB7XG4gIHJ1bk9wKGE6IHRmLlRlbnNvciwgYjogdGYuVGVuc29yKTogdGYuVGVuc29yIHtcbiAgICByZXR1cm4gdGYuYWRkKGEsIGIpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdWIgZXh0ZW5kcyBCaW5hcnkge1xuICBydW5PcChhOiB0Zi5UZW5zb3IsIGI6IHRmLlRlbnNvcik6IHRmLlRlbnNvciB7XG4gICAgcmV0dXJuIHRmLnN1YihhLCBiKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTXVsIGV4dGVuZHMgQmluYXJ5IHtcbiAgcnVuT3AoYTogdGYuVGVuc29yLCBiOiB0Zi5UZW5zb3IpOiB0Zi5UZW5zb3Ige1xuICAgIHJldHVybiB0Zi5tdWwoYSwgYik7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERpdiBleHRlbmRzIEJpbmFyeSB7XG4gIHJ1bk9wKGE6IHRmLlRlbnNvciwgYjogdGYuVGVuc29yKTogdGYuVGVuc29yIHtcbiAgICByZXR1cm4gdGYuZGl2KGEsIGIpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNYXggZXh0ZW5kcyBCaW5hcnkge1xuICBydW5PcChhOiB0Zi5UZW5zb3IsIGI6IHRmLlRlbnNvcik6IHRmLlRlbnNvciB7XG4gICAgcmV0dXJuIHRmLm1heGltdW0oYSwgYik7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1pbiBleHRlbmRzIEJpbmFyeSB7XG4gIHJ1bk9wKGE6IHRmLlRlbnNvciwgYjogdGYuVGVuc29yKTogdGYuVGVuc29yIHtcbiAgICByZXR1cm4gdGYubWluaW11bShhLCBiKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUG93IGV4dGVuZHMgQmluYXJ5IHtcbiAgcnVuT3AoYTogdGYuVGVuc29yLCBiOiB0Zi5UZW5zb3IpOiB0Zi5UZW5zb3Ige1xuICAgIHJldHVybiB0Zi5wb3coYSwgYik7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1hdE11bCBleHRlbmRzIEJpbmFyeSB7XG4gIHJ1bk9wKGE6IHRmLlRlbnNvciwgYjogdGYuVGVuc29yKTogdGYuVGVuc29yIHtcbiAgICBpZiAoYS5yYW5rID09PSAxKSB7XG4gICAgICBpZiAoYi5yYW5rID09PSAxKSB7XG4gICAgICAgIHJldHVybiB0Zi5kb3QoYSwgYik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhIGlzIDEtRCwgY29udmVydCB0byBhIDItRCB0ZW5zb3IgYnkgcHJlcGVuZGluZyBhIDEgdG8gaXRzIGRpbWVzaW9uc1xuICAgICAgICByZXR1cm4gdGYubWF0TXVsKHRmLnJlc2hhcGUoYSwgWzEsIC0xXSksIGIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoYi5yYW5rID09PSAxKSB7XG4gICAgICAgIC8vIGIgaXMgMS1ELCBjb252ZXJ0IHRvIGEgMi1EIHRlbnNvciBieSBhcHBlbmRpbmcgYSAxIHRvIGl0cyBkaW1lc2lvbnNcbiAgICAgICAgcmV0dXJuIHRmLm1hdE11bChhLCB0Zi5yZXNoYXBlKGIsIFstMSwgMV0pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJhbmsgPSBhLnJhbmsgPiBiLnJhbmsgPyBhLnJhbmsgOiBiLnJhbms7XG4gICAgICAgIGxldCBjID0gdGYubWF0TXVsKGEsIGIpO1xuICAgICAgICAvLyB3b3JrYXJvdW5kIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RmanMvaXNzdWVzLzQxOTJcbiAgICAgICAgaWYgKGMucmFuayAhPT0gcmFuaykge1xuICAgICAgICAgIGMgPSB0Zi5yZXNoYXBlKGMsIFsxXS5jb25jYXQoYy5zaGFwZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjO1xuICAgICAgfVxuICAgIH1cbiAgfVxufSIsImltcG9ydCAqIGFzIHRmIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TUxDbGFtcE9wdGlvbnN9IGZyb20gJy4uL2dyYXBoX2J1aWxkZXInO1xuaW1wb3J0IHtDb25zdGFudE9wZXJhbmQsIE1MT3BlcmFuZCwgT3V0cHV0T3BlcmFuZH0gZnJvbSAnLi4vb3BlcmFuZCc7XG5pbXBvcnQge1NpbmdsZU91dHB1dE9wZXJhdGlvbn0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIENsYW1wIGV4dGVuZHMgU2luZ2xlT3V0cHV0T3BlcmF0aW9uIHtcbiAgcHJpdmF0ZSB4XzogTUxPcGVyYW5kO1xuICBwcml2YXRlIG1pbk9wZXJhbmRfPzogTUxPcGVyYW5kO1xuICBwcml2YXRlIG1heE9wZXJhbmRfPzogTUxPcGVyYW5kO1xuICBwcml2YXRlIG1pblNjYWxhclZhbHVlXz86IG51bWJlcjtcbiAgcHJpdmF0ZSBtYXhTY2FsYXJWYWx1ZV8/OiBudW1iZXI7XG5cbiAgZ2V0IG1pblNjYWxhclZhbHVlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubWluU2NhbGFyVmFsdWVfO1xuICB9XG4gIGdldCBtYXhTY2FsYXJWYWx1ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm1heFNjYWxhclZhbHVlXztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2NhbGFyVmFsdWUob3BlcmFuZDogTUxPcGVyYW5kLCBtaW51cyA9IGZhbHNlKTogbnVtYmVyIHtcbiAgICBpZiAob3BlcmFuZCBpbnN0YW5jZW9mIENvbnN0YW50T3BlcmFuZCkge1xuICAgICAgY29uc3QgbWluQ29uc3RhbnQgPSBvcGVyYW5kO1xuICAgICAgaWYgKHR5cGVvZiBtaW5Db25zdGFudC52YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIG1pbkNvbnN0YW50LnZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAob3BlcmFuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbWludXMgPyAtSW5maW5pdHkgOiArSW5maW5pdHk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcih4OiBNTE9wZXJhbmQsIG9wdGlvbnM6IE1MQ2xhbXBPcHRpb25zID0ge30pIHtcbiAgICBpZiAoeCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzdXBlcih4LmJ1aWxkZXIpO1xuICAgICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKHgpO1xuICAgICAgdGhpcy54XyA9IHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1cGVyKHVuZGVmaW5lZCk7XG4gICAgICB0aGlzLnhfID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB1dGlscy52YWxpZGF0ZU9wdGlvbmFsT3BlcmFuZChvcHRpb25zLm1pblZhbHVlKTtcbiAgICB0aGlzLm1pbk9wZXJhbmRfID0gb3B0aW9ucy5taW5WYWx1ZTtcbiAgICB0aGlzLm1pblNjYWxhclZhbHVlXyA9IHRoaXMuZ2V0U2NhbGFyVmFsdWUodGhpcy5taW5PcGVyYW5kXywgdHJ1ZSk7XG4gICAgdXRpbHMudmFsaWRhdGVPcHRpb25hbE9wZXJhbmQob3B0aW9ucy5tYXhWYWx1ZSk7XG4gICAgdGhpcy5tYXhPcGVyYW5kXyA9IG9wdGlvbnMubWF4VmFsdWU7XG4gICAgdGhpcy5tYXhTY2FsYXJWYWx1ZV8gPSB0aGlzLmdldFNjYWxhclZhbHVlKHRoaXMubWF4T3BlcmFuZF8pO1xuICB9XG5cbiAgaW5wdXRzKCk6IE1MT3BlcmFuZFtdIHtcbiAgICBjb25zdCBpbnB1dHMgPSBbdGhpcy54X107XG4gICAgaWYgKHRoaXMubWluT3BlcmFuZF8pIHtcbiAgICAgIGlucHV0cy5wdXNoKHRoaXMubWluT3BlcmFuZF8pO1xuICAgIH1cbiAgICBpZiAodGhpcy5tYXhPcGVyYW5kXykge1xuICAgICAgaW5wdXRzLnB1c2godGhpcy5tYXhPcGVyYW5kXyk7XG4gICAgfVxuICAgIHJldHVybiBpbnB1dHM7XG4gIH1cblxuICBydW4oaW5wdXRUZW5zb3JzOiBNYXA8TUxPcGVyYW5kLCB0Zi5UZW5zb3I+KTogdGYuVGVuc29yIHtcbiAgICBjb25zdCB4OiB0Zi5UZW5zb3IgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMueF8pO1xuICAgIGlmICh0aGlzLm1pbk9wZXJhbmRfKSB7XG4gICAgICBpZiAodGhpcy5tYXhPcGVyYW5kXykge1xuICAgICAgICByZXR1cm4gdGYubWluaW11bShcbiAgICAgICAgICAgIHRmLm1heGltdW0oeCwgaW5wdXRUZW5zb3JzLmdldCh0aGlzLm1pbk9wZXJhbmRfKSksXG4gICAgICAgICAgICBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMubWF4T3BlcmFuZF8pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0Zi5tYXhpbXVtKHgsIGlucHV0VGVuc29ycy5nZXQodGhpcy5taW5PcGVyYW5kXykpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5tYXhPcGVyYW5kXykge1xuICAgICAgICByZXR1cm4gdGYubWluaW11bSh4LCBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMubWF4T3BlcmFuZF8pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0Zi5jbG9uZSh4KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhcHBseSh4OiBNTE9wZXJhbmQpOiBPdXRwdXRPcGVyYW5kIHtcbiAgICB0aGlzLmJ1aWxkZXJfID0geC5idWlsZGVyO1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZCh4KTtcbiAgICB0aGlzLnhfID0geDtcbiAgICB0aGlzLmNyZWF0ZU91dHB1dCgpO1xuICAgIHJldHVybiB0aGlzLm91dHB1dDtcbiAgfVxuXG4gIHJ1bk9wKHg6IHRmLlRlbnNvcik6IHRmLlRlbnNvciB7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICB0aGlzLm1pblNjYWxhclZhbHVlXyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICB0aGlzLm1heFNjYWxhclZhbHVlXyAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAndGYuanMgb25seSBzdXBwb3J0cyBjbGlwQnlWYWx1ZS4nKTtcbiAgICByZXR1cm4gdGYuY2xpcEJ5VmFsdWUoeCwgdGhpcy5taW5TY2FsYXJWYWx1ZV8sIHRoaXMubWF4U2NhbGFyVmFsdWVfKTtcbiAgfVxufSIsImltcG9ydCAqIGFzIHRmIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TUxPcGVyYW5kfSBmcm9tICcuLi9vcGVyYW5kJztcbmltcG9ydCB7U2luZ2xlT3V0cHV0T3BlcmF0aW9ufSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgQ29uY2F0IGV4dGVuZHMgU2luZ2xlT3V0cHV0T3BlcmF0aW9uIHtcbiAgcHJpdmF0ZSBpbnB1dHNfOiBNTE9wZXJhbmRbXTtcbiAgcHJpdmF0ZSBheGlzXzogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGlucHV0czogTUxPcGVyYW5kW10sIGF4aXM6IG51bWJlcikge1xuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgaW5wdXRzLmV2ZXJ5KGlucHV0ID0+IGlucHV0IGluc3RhbmNlb2YgTUxPcGVyYW5kKSxcbiAgICAgICAgJ1RoZSBwYXJhbWV0ZXIgaXMgbm90IGFuIG9wZXJhbmQuJyk7XG4gICAgc3VwZXIoaW5wdXRzWzBdLmJ1aWxkZXIpO1xuICAgIHRoaXMuaW5wdXRzXyA9IGlucHV0cztcbiAgICB1dGlscy5hc3NlcnQodXRpbHMuaXNJbnRlZ2VyKGF4aXMpLCAnVGhlIGF4aXMgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5heGlzXyA9IGF4aXM7XG4gIH1cblxuICBpbnB1dHMoKTogTUxPcGVyYW5kW10ge1xuICAgIHJldHVybiB0aGlzLmlucHV0c187XG4gIH1cblxuICBydW4oaW5wdXRUZW5zb3JzOiBNYXA8TUxPcGVyYW5kLCB0Zi5UZW5zb3I+KTogdGYuVGVuc29yIHtcbiAgICBjb25zdCBpbnB1dHM6IHRmLlRlbnNvcltdID0gW107XG4gICAgZm9yIChjb25zdCBpbnB1dCBvZiB0aGlzLmlucHV0cygpKSB7XG4gICAgICBpbnB1dHMucHVzaChpbnB1dFRlbnNvcnMuZ2V0KGlucHV0KSk7XG4gICAgfVxuICAgIHJldHVybiB0Zi5jb25jYXQoaW5wdXRzLCB0aGlzLmF4aXNfKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7RXhwbGljaXRQYWRkaW5nfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvY29udl91dGlsJztcblxuaW1wb3J0IHtNTEF1dG9QYWQsIE1MQ29udjJkT3B0aW9ucywgTUxGaWx0ZXJPcGVyYW5kTGF5b3V0LCBNTElucHV0T3BlcmFuZExheW91dH0gZnJvbSAnLi4vZ3JhcGhfYnVpbGRlcic7XG5pbXBvcnQge0NvbnN0YW50T3BlcmFuZCwgTUxPcGVyYW5kLCBPdXRwdXRPcGVyYW5kfSBmcm9tICcuLi9vcGVyYW5kJztcbmltcG9ydCB7RnVzZWRPcGVyYXRpb24sIE1MT3BlcmF0b3IsIFNpbmdsZU91dHB1dE9wZXJhdGlvbn0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4uL3V0aWxzJztcblxuaW1wb3J0IHtDbGFtcH0gZnJvbSAnLi9jbGFtcCc7XG5pbXBvcnQge0xlYWt5UmVsdX0gZnJvbSAnLi9sZWFreV9yZWx1JztcbmltcG9ydCB7UmVsdSwgU2lnbW9pZH0gZnJvbSAnLi91bmFyeSc7XG5cbmV4cG9ydCBjbGFzcyBDb252MmQgZXh0ZW5kcyBTaW5nbGVPdXRwdXRPcGVyYXRpb24gaW1wbGVtZW50cyBGdXNlZE9wZXJhdGlvbiB7XG4gIHByaXZhdGUgaW5wdXRfOiBNTE9wZXJhbmQ7XG4gIHByaXZhdGUgZmlsdGVyXzogTUxPcGVyYW5kO1xuICBwcml2YXRlIGJpYXNfOiBNTE9wZXJhbmQ7XG4gIHByaXZhdGUgcGFkZGluZ18/OiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgcHJpdmF0ZSBzdHJpZGVzXz86IFtudW1iZXIsIG51bWJlcl07XG4gIHByaXZhdGUgZGlsYXRpb25zXz86IFtudW1iZXIsIG51bWJlcl07XG4gIHByaXZhdGUgZ3JvdXBzXz86IG51bWJlcjtcbiAgcHJpdmF0ZSBpbnB1dExheW91dF8/OiBNTElucHV0T3BlcmFuZExheW91dDtcbiAgcHJpdmF0ZSBmaWx0ZXJMYXlvdXRfPzogTUxGaWx0ZXJPcGVyYW5kTGF5b3V0O1xuICBwcml2YXRlIGF1dG9QYWRfPzogTUxBdXRvUGFkO1xuICBwcml2YXRlIG91dHB1dFBhZGRpbmdfPzogW251bWJlciwgbnVtYmVyXTtcbiAgcHJpdmF0ZSBvdXRwdXRTaXplc18/OiBbbnVtYmVyLCBudW1iZXJdO1xuICBwcml2YXRlIHRyYW5zcG9zZV8/OiBib29sZWFuO1xuICBwcml2YXRlIGFjdGl2YXRpb25fPzogTUxPcGVyYXRvcjtcbiAgcHJpdmF0ZSBmdXNlZEFjdGl2YXRpb25fPzogdGYuZnVzZWQuQWN0aXZhdGlvbjtcbiAgcHJpdmF0ZSBsZWFreXJlbHVBbHBoYV8/OiBudW1iZXI7XG4gIHByaXZhdGUgZmlsdGVyVGVuc29yXz86IHRmLlRlbnNvcjREO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgaW5wdXQ6IE1MT3BlcmFuZCwgZmlsdGVyOiBNTE9wZXJhbmQsIG9wdGlvbnM6IE1MQ29udjJkT3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIoaW5wdXQuYnVpbGRlcik7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKGlucHV0KTtcbiAgICB0aGlzLmlucHV0XyA9IGlucHV0O1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZChmaWx0ZXIpO1xuICAgIHRoaXMuZmlsdGVyXyA9IGZpbHRlcjtcblxuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgIShvcHRpb25zLmF1dG9QYWQgPT09IE1MQXV0b1BhZC5leHBsaWNpdCAmJlxuICAgICAgICAgIG9wdGlvbnMucGFkZGluZyA9PT0gdW5kZWZpbmVkKSxcbiAgICAgICAgJ1RoZSBwYWRkaW5nIHBhcmFtZXRlciBzaG91bGQgYmUgYXNzaWduZWQgd2hlbiBhdXRvUGFkIGlzIGV4cGxpY2l0LicpO1xuXG4gICAgdGhpcy5pbml0T3B0aW9ucyhcbiAgICAgICAgb3B0aW9ucy5wYWRkaW5nLCBvcHRpb25zLnN0cmlkZXMsIG9wdGlvbnMuZGlsYXRpb25zLCBvcHRpb25zLmdyb3VwcyxcbiAgICAgICAgb3B0aW9ucy5pbnB1dExheW91dCwgb3B0aW9ucy5maWx0ZXJMYXlvdXQsIG9wdGlvbnMuYXV0b1BhZCxcbiAgICAgICAgb3B0aW9ucy50cmFuc3Bvc2UsIG9wdGlvbnMub3V0cHV0UGFkZGluZywgb3B0aW9ucy5vdXRwdXRTaXplcyxcbiAgICAgICAgb3B0aW9ucy5iaWFzLCBvcHRpb25zLmFjdGl2YXRpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0T3B0aW9ucyhcbiAgICAgIHBhZGRpbmc6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0gWzAsIDAsIDAsIDBdLFxuICAgICAgc3RyaWRlczogW251bWJlciwgbnVtYmVyXSA9IFsxLCAxXSwgZGlsYXRpb25zOiBbbnVtYmVyLCBudW1iZXJdID0gWzEsIDFdLFxuICAgICAgZ3JvdXBzID0gMSwgaW5wdXRMYXlvdXQ6IE1MSW5wdXRPcGVyYW5kTGF5b3V0ID0gTUxJbnB1dE9wZXJhbmRMYXlvdXQubmNodyxcbiAgICAgIGZpbHRlckxheW91dDogTUxGaWx0ZXJPcGVyYW5kTGF5b3V0ID0gTUxGaWx0ZXJPcGVyYW5kTGF5b3V0Lm9paHcsXG4gICAgICBhdXRvUGFkOiBNTEF1dG9QYWQgPSBNTEF1dG9QYWQuZXhwbGljaXQsIHRyYW5zcG9zZSA9IGZhbHNlLFxuICAgICAgb3V0cHV0UGFkZGluZzogW251bWJlciwgbnVtYmVyXSA9IFswLCAwXSxcbiAgICAgIG91dHB1dFNpemVzOiBbbnVtYmVyLCBudW1iZXJdID0gdW5kZWZpbmVkLCBiaWFzOiBNTE9wZXJhbmQgPSB1bmRlZmluZWQsXG4gICAgICBhY3RpdmF0aW9uOiBNTE9wZXJhdG9yID0gdW5kZWZpbmVkKSB7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICB1dGlscy5pc0ludGVnZXJBcnJheShwYWRkaW5nKSAmJiBwYWRkaW5nLmxlbmd0aCA9PT0gNCxcbiAgICAgICAgJ1RoZSBwYWRkaW5nIHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgIHRoaXMucGFkZGluZ18gPSBwYWRkaW5nO1xuXG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICB1dGlscy5pc0ludGVnZXJBcnJheShzdHJpZGVzKSAmJiBzdHJpZGVzLmxlbmd0aCA9PT0gMixcbiAgICAgICAgJ1RoZSBzdHJpZGVzIHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgIHRoaXMuc3RyaWRlc18gPSBzdHJpZGVzO1xuXG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICB1dGlscy5pc0ludGVnZXJBcnJheShkaWxhdGlvbnMpICYmIGRpbGF0aW9ucy5sZW5ndGggPT09IDIsXG4gICAgICAgICdUaGUgZGlsYXRpb25zIHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgIHRoaXMuZGlsYXRpb25zXyA9IGRpbGF0aW9ucztcblxuICAgIHV0aWxzLmFzc2VydCh1dGlscy5pc0ludGVnZXIoZ3JvdXBzKSwgJ1RoZSBnb3VycHMgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5ncm91cHNfID0gZ3JvdXBzO1xuXG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICBpbnB1dExheW91dCBpbiBNTElucHV0T3BlcmFuZExheW91dCxcbiAgICAgICAgJ1RoZSBpbnB1dCBsYXlvdXQgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5pbnB1dExheW91dF8gPSBpbnB1dExheW91dDtcblxuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgZmlsdGVyTGF5b3V0IGluIE1MRmlsdGVyT3BlcmFuZExheW91dCxcbiAgICAgICAgJ1RoZSBmaWx0ZXIgbGF5b3V0IHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgIHRoaXMuZmlsdGVyTGF5b3V0XyA9IGZpbHRlckxheW91dDtcblxuICAgIHV0aWxzLmFzc2VydChhdXRvUGFkIGluIE1MQXV0b1BhZCwgJ1RoZSBhdXRvUGFkIHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgIHRoaXMuYXV0b1BhZF8gPSBhdXRvUGFkO1xuXG4gICAgdGhpcy50cmFuc3Bvc2VfID0gdHJhbnNwb3NlO1xuXG4gICAgaWYgKHRoaXMudHJhbnNwb3NlXykge1xuICAgICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgIHV0aWxzLmlzSW50ZWdlckFycmF5KG91dHB1dFBhZGRpbmcpICYmIG91dHB1dFBhZGRpbmcubGVuZ3RoID09PSAyLFxuICAgICAgICAgICdUaGUgb3V0cHV0UGFkZGluZyBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICAgIHRoaXMub3V0cHV0UGFkZGluZ18gPSBvdXRwdXRQYWRkaW5nO1xuXG4gICAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgICAgb3V0cHV0U2l6ZXMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICAodXRpbHMuaXNJbnRlZ2VyQXJyYXkob3V0cHV0U2l6ZXMpICYmIG91dHB1dFNpemVzLmxlbmd0aCA9PT0gMiksXG4gICAgICAgICAgJ1RoZSBvdXRwdXRTaXplcyBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICAgIHRoaXMub3V0cHV0U2l6ZXNfID0gb3V0cHV0U2l6ZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub3V0cHV0UGFkZGluZ18gPSBbMCwgMF07XG4gICAgICB0aGlzLm91dHB1dFNpemVzXyA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICB0aGlzLmJpYXNfID0gYmlhcztcbiAgICBpZiAodGhpcy5iaWFzXykge1xuICAgICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKHRoaXMuYmlhc18pO1xuICAgIH1cblxuICAgIGlmIChhY3RpdmF0aW9uIGluc3RhbmNlb2YgUmVsdSkge1xuICAgICAgdGhpcy5mdXNlZEFjdGl2YXRpb25fID0gJ3JlbHUnO1xuICAgICAgdGhpcy5hY3RpdmF0aW9uXyA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNSZWx1NihhY3RpdmF0aW9uKSkge1xuICAgICAgdGhpcy5mdXNlZEFjdGl2YXRpb25fID0gJ3JlbHU2JztcbiAgICAgIHRoaXMuYWN0aXZhdGlvbl8gPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIGlmIChhY3RpdmF0aW9uIGluc3RhbmNlb2YgTGVha3lSZWx1KSB7XG4gICAgICB0aGlzLmZ1c2VkQWN0aXZhdGlvbl8gPSAnbGVha3lyZWx1JztcbiAgICAgIHRoaXMubGVha3lyZWx1QWxwaGFfID0gKGFjdGl2YXRpb24pLmFscGhhO1xuICAgICAgdGhpcy5hY3RpdmF0aW9uXyA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKGFjdGl2YXRpb24gaW5zdGFuY2VvZiBTaWdtb2lkKSB7XG4gICAgICB0aGlzLmZ1c2VkQWN0aXZhdGlvbl8gPSAnc2lnbW9pZCc7XG4gICAgICB0aGlzLmFjdGl2YXRpb25fID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZ1c2VkQWN0aXZhdGlvbl8gPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmFjdGl2YXRpb25fID0gYWN0aXZhdGlvbjtcbiAgICB9XG4gIH1cblxuICBpc1JlbHU2KGFjdGl2YXRpb246IE1MT3BlcmF0b3IpOiBib29sZWFuIHtcbiAgICBpZiAoYWN0aXZhdGlvbiBpbnN0YW5jZW9mIENsYW1wKSB7XG4gICAgICBjb25zdCBjbGFtcCA9IGFjdGl2YXRpb247XG4gICAgICBpZiAoTWF0aC5hYnMoY2xhbXAubWluU2NhbGFyVmFsdWUgLSAwLjApIDwgMWUtNSAmJlxuICAgICAgICAgIE1hdGguYWJzKGNsYW1wLm1heFNjYWxhclZhbHVlIC0gNi4wKSA8IDFlLTUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdldEZ1c2VkT3V0cHV0cygpOiBPdXRwdXRPcGVyYW5kW10ge1xuICAgIGlmICh0aGlzLmFjdGl2YXRpb25fKSB7XG4gICAgICByZXR1cm4gW3RoaXMuYWN0aXZhdGlvbl8uYXBwbHkodGhpcy5vdXRwdXQpXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFt0aGlzLm91dHB1dF07XG4gICAgfVxuICB9XG5cbiAgaW5wdXRzKCk6IE1MT3BlcmFuZFtdIHtcbiAgICBjb25zdCBpbnB1dHMgPSBbdGhpcy5pbnB1dF8sIHRoaXMuZmlsdGVyX107XG4gICAgaWYgKHRoaXMuYmlhc18pIHtcbiAgICAgIGlucHV0cy5wdXNoKHRoaXMuYmlhc18pO1xuICAgIH1cbiAgICByZXR1cm4gaW5wdXRzO1xuICB9XG5cbiAgcnVuKGlucHV0VGVuc29yczogTWFwPE1MT3BlcmFuZCwgdGYuVGVuc29yPik6IHRmLlRlbnNvciB7XG4gICAgbGV0IGlucHV0OiB0Zi5UZW5zb3I0RCA9IGlucHV0VGVuc29ycy5nZXQodGhpcy5pbnB1dF8pIGFzIHRmLlRlbnNvcjREO1xuICAgIGxldCBmaWx0ZXI6IHRmLlRlbnNvcjREO1xuICAgIGxldCBiaWFzOiB0Zi5UZW5zb3IxRDtcbiAgICBsZXQgZnVzZWQgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5iaWFzXykge1xuICAgICAgYmlhcyA9IGlucHV0VGVuc29ycy5nZXQodGhpcy5iaWFzXykgYXMgdGYuVGVuc29yMUQ7XG4gICAgfVxuXG4gICAgLy8gdGYuY29udjJkIGlucHV0IGxheW91dCAobmh3Yyk6IFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgaW5EZXB0aF1cbiAgICBpZiAodGhpcy5pbnB1dExheW91dF8gPT09IE1MSW5wdXRPcGVyYW5kTGF5b3V0Lm5jaHcpIHtcbiAgICAgIC8vIG5jaHcgLT4gbmh3Y1xuICAgICAgaW5wdXQgPSB0Zi50cmFuc3Bvc2UoaW5wdXQsIFswLCAyLCAzLCAxXSk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0Q2hhbm5lbHMgPSBpbnB1dC5zaGFwZVszXTtcbiAgICBpZiAodGhpcy5maWx0ZXJUZW5zb3JfID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGZpbHRlciA9IGlucHV0VGVuc29ycy5nZXQodGhpcy5maWx0ZXJfKSBhcyB0Zi5UZW5zb3I0RDtcbiAgICAgIGlmICh0aGlzLnRyYW5zcG9zZV8gPT09IGZhbHNlKSB7XG4gICAgICAgIC8vIHRmLmNvbnYyZCBmaWx0ZXIgbGF5b3V0IChod2lvKTogW2ZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGluRGVwdGgsXG4gICAgICAgIC8vIG91dERlcHRoXVxuICAgICAgICBpZiAodGhpcy5maWx0ZXJMYXlvdXRfID09PSBNTEZpbHRlck9wZXJhbmRMYXlvdXQub2lodykge1xuICAgICAgICAgIGZpbHRlciA9IHRmLnRyYW5zcG9zZShmaWx0ZXIsIFsyLCAzLCAxLCAwXSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5maWx0ZXJMYXlvdXRfID09PSBNTEZpbHRlck9wZXJhbmRMYXlvdXQub2h3aSkge1xuICAgICAgICAgIGZpbHRlciA9IHRmLnRyYW5zcG9zZShmaWx0ZXIsIFsxLCAyLCAzLCAwXSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5maWx0ZXJMYXlvdXRfID09PSBNTEZpbHRlck9wZXJhbmRMYXlvdXQuaWh3bykge1xuICAgICAgICAgIGZpbHRlciA9IHRmLnRyYW5zcG9zZShmaWx0ZXIsIFsxLCAyLCAwLCAzXSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHRmLmNvbnYyZFRyYW5zcG9zZSBmaWx0ZXIgbGF5b3V0IChod29pKTogW2ZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsXG4gICAgICAgIC8vIG91dERlcHRoLCBpbkRlcHRoXVxuICAgICAgICBpZiAodGhpcy5maWx0ZXJMYXlvdXRfID09PSBNTEZpbHRlck9wZXJhbmRMYXlvdXQub2lodykge1xuICAgICAgICAgIGZpbHRlciA9IHRmLnRyYW5zcG9zZShmaWx0ZXIsIFsyLCAzLCAwLCAxXSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5maWx0ZXJMYXlvdXRfID09PSBNTEZpbHRlck9wZXJhbmRMYXlvdXQuaHdpbykge1xuICAgICAgICAgIGZpbHRlciA9IHRmLnRyYW5zcG9zZShmaWx0ZXIsIFswLCAxLCAzLCAyXSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5maWx0ZXJMYXlvdXRfID09PSBNTEZpbHRlck9wZXJhbmRMYXlvdXQub2h3aSkge1xuICAgICAgICAgIGZpbHRlciA9IHRmLnRyYW5zcG9zZShmaWx0ZXIsIFsxLCAyLCAwLCAzXSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5maWx0ZXJMYXlvdXRfID09PSBNTEZpbHRlck9wZXJhbmRMYXlvdXQuaWh3bykge1xuICAgICAgICAgIGZpbHRlciA9IHRmLnRyYW5zcG9zZShmaWx0ZXIsIFsxLCAyLCAzLCAwXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmdyb3Vwc18gIT09IDEpIHtcbiAgICAgICAgLy8gZmlsdGVyIGxheW91dCBod2lvXG4gICAgICAgIC8vIHRmLmRlcHRod2lzZUNvbnYyZCBmaWx0ZXIgbGF5b3V0OiBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCxcbiAgICAgICAgLy8gaW5DaGFubmVscywgY2hhbm5lbE11bHRpcGxpZXJdXG4gICAgICAgIGZpbHRlciA9IHRmLnRyYW5zcG9zZShmaWx0ZXIsIFswLCAxLCAzLCAyXSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5maWx0ZXJfIGluc3RhbmNlb2YgQ29uc3RhbnRPcGVyYW5kKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyVGVuc29yXyA9IGZpbHRlcjtcbiAgICAgICAgdGYua2VlcCh0aGlzLmZpbHRlclRlbnNvcl8pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmaWx0ZXIgPSB0aGlzLmZpbHRlclRlbnNvcl87XG4gICAgfVxuICAgIGNvbnN0IHBhZGRpbmc6ICd2YWxpZCd8J3NhbWUnfEV4cGxpY2l0UGFkZGluZyA9IHV0aWxzLmdldFBhZGRpbmdzKFxuICAgICAgICBpbnB1dCwgZmlsdGVyLCB0aGlzLnBhZGRpbmdfLCB0aGlzLnN0cmlkZXNfLCB0aGlzLm91dHB1dFBhZGRpbmdfLFxuICAgICAgICB0aGlzLmRpbGF0aW9uc18sIHRoaXMuYXV0b1BhZF8pO1xuICAgIGxldCBvdXRwdXQ7XG4gICAgaWYgKHRoaXMudHJhbnNwb3NlXyA9PT0gZmFsc2UpIHtcbiAgICAgIGlmICh0aGlzLmdyb3Vwc18gPT09IDEpIHtcbiAgICAgICAgb3V0cHV0ID0gdGYuZnVzZWQuY29udjJkKHtcbiAgICAgICAgICB4OiBpbnB1dCxcbiAgICAgICAgICBmaWx0ZXIsXG4gICAgICAgICAgc3RyaWRlczogdGhpcy5zdHJpZGVzXyxcbiAgICAgICAgICBwYWQ6IHBhZGRpbmcsXG4gICAgICAgICAgZGF0YUZvcm1hdDogJ05IV0MnLFxuICAgICAgICAgIGRpbGF0aW9uczogdGhpcy5kaWxhdGlvbnNfLFxuICAgICAgICAgIGJpYXMsXG4gICAgICAgICAgYWN0aXZhdGlvbjogdGhpcy5mdXNlZEFjdGl2YXRpb25fLFxuICAgICAgICAgIGxlYWt5cmVsdUFscGhhOiB0aGlzLmxlYWt5cmVsdUFscGhhX1xuICAgICAgICB9KTtcbiAgICAgICAgZnVzZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICB0aGlzLmdyb3Vwc18gPT09IGlucHV0Q2hhbm5lbHMgJiYgdGhpcy5ncm91cHNfID09PSBmaWx0ZXIuc2hhcGVbMl0pIHtcbiAgICAgICAgaWYgKHBhZGRpbmcgPT09ICd2YWxpZCcgfHwgcGFkZGluZyA9PT0gJ3NhbWUnIHx8XG4gICAgICAgICAgICAocGFkZGluZyBpbnN0YW5jZW9mIEFycmF5ICYmIHBhZGRpbmdbMV1bMF0gPT09IHBhZGRpbmdbMV1bMV0gJiZcbiAgICAgICAgICAgICBwYWRkaW5nWzFdWzBdID09PSBwYWRkaW5nWzJdWzBdICYmXG4gICAgICAgICAgICAgcGFkZGluZ1sxXVswXSA9PT0gcGFkZGluZ1syXVsxXSkpIHtcbiAgICAgICAgICBsZXQgZnVzZWREZXB0aHdpc2VQYWQ6ICd2YWxpZCd8J3NhbWUnfG51bWJlcjtcbiAgICAgICAgICBpZiAocGFkZGluZyA9PT0gJ3ZhbGlkJyB8fCBwYWRkaW5nID09PSAnc2FtZScpIHtcbiAgICAgICAgICAgIGZ1c2VkRGVwdGh3aXNlUGFkID0gcGFkZGluZztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZnVzZWREZXB0aHdpc2VQYWQgPSBwYWRkaW5nWzFdWzBdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvdXRwdXQgPSB0Zi5mdXNlZC5kZXB0aHdpc2VDb252MmQoe1xuICAgICAgICAgICAgeDogaW5wdXQsXG4gICAgICAgICAgICBmaWx0ZXIsXG4gICAgICAgICAgICBzdHJpZGVzOiB0aGlzLnN0cmlkZXNfLFxuICAgICAgICAgICAgcGFkOiBmdXNlZERlcHRod2lzZVBhZCxcbiAgICAgICAgICAgIGRhdGFGb3JtYXQ6ICdOSFdDJyxcbiAgICAgICAgICAgIGRpbGF0aW9uczogdGhpcy5kaWxhdGlvbnNfLFxuICAgICAgICAgICAgYmlhcyxcbiAgICAgICAgICAgIGFjdGl2YXRpb246IHRoaXMuZnVzZWRBY3RpdmF0aW9uXyxcbiAgICAgICAgICAgIGxlYWt5cmVsdUFscGhhOiB0aGlzLmxlYWt5cmVsdUFscGhhX1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGZ1c2VkID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXRwdXQgPSB0Zi5kZXB0aHdpc2VDb252MmQoXG4gICAgICAgICAgICAgIGlucHV0LCBmaWx0ZXIsIHRoaXMuc3RyaWRlc18sIHBhZGRpbmcsICdOSFdDJywgdGhpcy5kaWxhdGlvbnNfKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ1RoZSB0Zi5qcyBjb252b2x1dGlvbiBkb2VzblxcJ3Qgc3VwcG9ydCBncm91cHMgcGFyYW1ldGVyJyArXG4gICAgICAgICAgICBgICR7dGhpcy5ncm91cHNffWApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0cmFuc3Bvc2UgPT0gdHJ1ZVxuICAgICAgaWYgKHRoaXMuYXV0b1BhZF8gIT09IE1MQXV0b1BhZC5leHBsaWNpdCkge1xuICAgICAgICB0aGlzLm91dHB1dFNpemVzXyA9IFtcbiAgICAgICAgICBpbnB1dC5zaGFwZVsxXSAqIHRoaXMuc3RyaWRlc19bMF0sXG4gICAgICAgICAgaW5wdXQuc2hhcGVbMl0gKiB0aGlzLnN0cmlkZXNfWzFdLFxuICAgICAgICBdO1xuICAgICAgfVxuICAgICAgLy8gdGYuY29udjJkVHJhbnNwb3NlIG91dHB1dFNoYXBlOiBbYmF0Y2gsIGhlaWdodCwgd2lkdGgsIG91dERlcHRoXVxuICAgICAgY29uc3Qgb3V0cHV0U2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID1cbiAgICAgICAgICBbaW5wdXQuc2hhcGVbMF0sIDAsIDAsIGZpbHRlci5zaGFwZVsyXV07XG4gICAgICBpZiAodGhpcy5vdXRwdXRTaXplc18gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI7ICsraSkge1xuICAgICAgICAgIG91dHB1dFNoYXBlW2kgKyAxXSA9IHRoaXMuc3RyaWRlc19baV0gKiAoaW5wdXQuc2hhcGVbaSArIDFdIC0gMSkgK1xuICAgICAgICAgICAgICB0aGlzLm91dHB1dFBhZGRpbmdfW2ldICtcbiAgICAgICAgICAgICAgKChmaWx0ZXIuc2hhcGVbaV0gLSAxKSAqIHRoaXMuZGlsYXRpb25zX1tpXSArIDEpIC1cbiAgICAgICAgICAgICAgdGhpcy5wYWRkaW5nX1tpICogMl0gLSB0aGlzLnBhZGRpbmdfW2kgKiAyICsgMV07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dHB1dFNoYXBlWzFdID0gdGhpcy5vdXRwdXRTaXplc19bMF07XG4gICAgICAgIG91dHB1dFNoYXBlWzJdID0gdGhpcy5vdXRwdXRTaXplc19bMV07XG4gICAgICB9XG4gICAgICBvdXRwdXQgPSB0Zi5jb252MmRUcmFuc3Bvc2UoXG4gICAgICAgICAgaW5wdXQsIGZpbHRlciwgb3V0cHV0U2hhcGUsIHRoaXMuc3RyaWRlc18sIHBhZGRpbmcpO1xuICAgIH1cbiAgICBpZiAoIWZ1c2VkKSB7XG4gICAgICBpZiAoYmlhcykge1xuICAgICAgICAvLyBvdXRwdXQgaXMgc3RpbGwgbmh3Y1xuICAgICAgICBvdXRwdXQgPSB0Zi5hZGQob3V0cHV0LCBiaWFzKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmZ1c2VkQWN0aXZhdGlvbl8gPT09ICdyZWx1Jykge1xuICAgICAgICBvdXRwdXQgPSB0Zi5yZWx1KG91dHB1dCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZnVzZWRBY3RpdmF0aW9uXyA9PT0gJ3JlbHU2Jykge1xuICAgICAgICBvdXRwdXQgPSB0Zi5jbGlwQnlWYWx1ZShvdXRwdXQsIDAsIDYpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmZ1c2VkQWN0aXZhdGlvbl8gPT09ICdsZWFreXJlbHUnKSB7XG4gICAgICAgIG91dHB1dCA9IHRmLmxlYWt5UmVsdShvdXRwdXQsIHRoaXMubGVha3lyZWx1QWxwaGFfKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5mdXNlZEFjdGl2YXRpb25fID09PSAnc2lnbW9pZCcpIHtcbiAgICAgICAgb3V0cHV0ID0gdGYuc2lnbW9pZChvdXRwdXQpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmZ1c2VkQWN0aXZhdGlvbl8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB1dGlscy5hc3NlcnQoZmFsc2UsIGBUaGUgJHt0aGlzLmZ1c2VkQWN0aXZhdGlvbl99IGlzIHVuIHN1cHBvcnRlZC5gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuaW5wdXRMYXlvdXRfID09PSBNTElucHV0T3BlcmFuZExheW91dC5uY2h3KSB7XG4gICAgICAvLyBuaHdjIC0+IG5jaHdcbiAgICAgIG91dHB1dCA9IHRmLnRyYW5zcG9zZShvdXRwdXQsIFswLCAzLCAxLCAyXSk7XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cblxuICBkaXNwb3NlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZpbHRlclRlbnNvcl8pIHtcbiAgICAgIHRmLmRpc3Bvc2UodGhpcy5maWx0ZXJUZW5zb3JfKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7TUxHZW1tT3B0aW9ucywgTUxHcmFwaEJ1aWxkZXJ9IGZyb20gJy4uL2dyYXBoX2J1aWxkZXInO1xuaW1wb3J0IHtNTE9wZXJhbmR9IGZyb20gJy4uL29wZXJhbmQnO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgR2VtbSB7XG4gIHN0YXRpYyBidWlsZChcbiAgICAgIGJ1aWxkZXI6IE1MR3JhcGhCdWlsZGVyLCBhOiBNTE9wZXJhbmQsIGI6IE1MT3BlcmFuZCxcbiAgICAgIG9wdGlvbnM6IE1MR2VtbU9wdGlvbnMgPSB7fSk6IE1MT3BlcmFuZCB7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKGEpO1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZChiKTtcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIG9wdGlvbnMuYyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zLmMgPT09ICdudW1iZXInIHx8XG4gICAgICAgICAgICBvcHRpb25zLmMgaW5zdGFuY2VvZiBNTE9wZXJhbmQsXG4gICAgICAgICdUaGUgb3B0aW9ucy5jIGlzIGludmFsaWQuJyk7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICBvcHRpb25zLmFUcmFuc3Bvc2UgPT09IHVuZGVmaW5lZCB8fCB1dGlscy5pc0Jvb2xlYW4ob3B0aW9ucy5hVHJhbnNwb3NlKSxcbiAgICAgICAgJ1RoZSBvcHRpb25zLmFUcmFuc3Bvc2UgaXMgaW52YWxpZC4nKTtcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIG9wdGlvbnMuYlRyYW5zcG9zZSA9PT0gdW5kZWZpbmVkIHx8IHV0aWxzLmlzQm9vbGVhbihvcHRpb25zLmJUcmFuc3Bvc2UpLFxuICAgICAgICAnVGhlIG9wdGlvbnMuYlRyYW5zcG9zZSBpcyBpbnZhbGlkLicpO1xuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgb3B0aW9ucy5hbHBoYSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zLmFscGhhID09PSAnbnVtYmVyJyxcbiAgICAgICAgJ1RoZSBvcHRpb25zLmFscGhhIGlzIGludmFsaWQuJyk7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICBvcHRpb25zLmJldGEgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2Ygb3B0aW9ucy5iZXRhID09PSAnbnVtYmVyJyxcbiAgICAgICAgJ1RoZSBvcHRpb25zLmJldGEgaXMgaW52YWxpZC4nKTtcblxuICAgIC8vIGJ1aWxkIGdyYXBoXG4gICAgaWYgKG9wdGlvbnMuYVRyYW5zcG9zZSkge1xuICAgICAgYSA9IGJ1aWxkZXIudHJhbnNwb3NlKGEpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmJUcmFuc3Bvc2UpIHtcbiAgICAgIGIgPSBidWlsZGVyLnRyYW5zcG9zZShiKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbHBoYSA9XG4gICAgICAgIGJ1aWxkZXIuY29uc3RhbnQob3B0aW9ucy5hbHBoYSA9PT0gdW5kZWZpbmVkID8gMS4wIDogb3B0aW9ucy5hbHBoYSk7XG4gICAgY29uc3QgYmV0YSA9XG4gICAgICAgIGJ1aWxkZXIuY29uc3RhbnQob3B0aW9ucy5iZXRhID09PSB1bmRlZmluZWQgPyAxLjAgOiBvcHRpb25zLmJldGEpO1xuXG4gICAgY29uc3QgYWIgPSBidWlsZGVyLm1hdG11bChidWlsZGVyLm11bChhbHBoYSwgYSksIGIpO1xuICAgIHJldHVybiAob3B0aW9ucy5jID8gYnVpbGRlci5hZGQoYWIsIGJ1aWxkZXIubXVsKGJldGEsIG9wdGlvbnMuYykpIDogYWIpO1xuICB9XG59IiwiaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNTEdydUNlbGxPcHRpb25zLCBNTEdydU9wdGlvbnMsIE1MUmVjdXJyZW50TmV0d29ya0RpcmVjdGlvbiwgTUxSZWN1cnJlbnROZXR3b3JrV2VpZ2h0TGF5b3V0fSBmcm9tICcuLi9ncmFwaF9idWlsZGVyJztcbmltcG9ydCB7TUxPcGVyYW5kLCBPdXRwdXRPcGVyYW5kfSBmcm9tICcuLi9vcGVyYW5kJztcbmltcG9ydCB7TUxPcGVyYXRvciwgT3BlcmF0aW9uLCBTaW5nbGVPdXRwdXRPcGVyYXRpb259IGZyb20gJy4uL29wZXJhdGlvbic7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQge1VuYXJ5TUxPcGVyYXRvcn0gZnJvbSAnLi91bmFyeSc7XG5cbmV4cG9ydCBjbGFzcyBHcnUgZXh0ZW5kcyBPcGVyYXRpb24ge1xuICBwcml2YXRlIGlucHV0XzogTUxPcGVyYW5kO1xuICBwcml2YXRlIHdlaWdodF86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSByZWN1cnJlbnRXZWlnaHRfOiBNTE9wZXJhbmQ7XG4gIHByaXZhdGUgc3RlcHNfOiBudW1iZXI7XG4gIHByaXZhdGUgaGlkZGVuU2l6ZV86IG51bWJlcjtcbiAgcHJpdmF0ZSBiaWFzXz86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSByZWN1cnJlbnRCaWFzXz86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSBpbml0aWFsSGlkZGVuU3RhdGVfPzogTUxPcGVyYW5kO1xuICBwcml2YXRlIHJlc2V0QWZ0ZXJfOiBib29sZWFuO1xuICBwcml2YXRlIHJldHVyblNlcXVlbmNlXzogYm9vbGVhbjtcbiAgcHJpdmF0ZSBkaXJlY3Rpb25fOiBNTFJlY3VycmVudE5ldHdvcmtEaXJlY3Rpb247XG4gIHByaXZhdGUgbGF5b3V0XzogTUxSZWN1cnJlbnROZXR3b3JrV2VpZ2h0TGF5b3V0O1xuICBwcml2YXRlIGFjdGl2YXRpb25zXzogTUxPcGVyYXRvcltdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgaW5wdXQ6IE1MT3BlcmFuZCwgd2VpZ2h0OiBNTE9wZXJhbmQsIHJlY3VycmVudFdlaWdodDogTUxPcGVyYW5kLFxuICAgICAgc3RlcHM6IG51bWJlciwgaGlkZGVuU2l6ZTogbnVtYmVyLCBvcHRpb25zOiBNTEdydU9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKGlucHV0LmJ1aWxkZXIpO1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZChpbnB1dCk7XG4gICAgdGhpcy5pbnB1dF8gPSBpbnB1dDtcbiAgICB1dGlscy52YWxpZGF0ZU9wZXJhbmQod2VpZ2h0KTtcbiAgICB0aGlzLndlaWdodF8gPSB3ZWlnaHQ7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKHJlY3VycmVudFdlaWdodCk7XG4gICAgdGhpcy5yZWN1cnJlbnRXZWlnaHRfID0gcmVjdXJyZW50V2VpZ2h0O1xuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgdXRpbHMuaXNJbnRlZ2VyKHN0ZXBzKSAmJiBzdGVwcyA+IDAsICdUaGUgc3RlcHMgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5zdGVwc18gPSBzdGVwcztcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIHV0aWxzLmlzSW50ZWdlcihoaWRkZW5TaXplKSAmJiBoaWRkZW5TaXplID4gMCxcbiAgICAgICAgJ1RoZSBoaWRkZW5TaXplIHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgIHRoaXMuaGlkZGVuU2l6ZV8gPSBoaWRkZW5TaXplO1xuICAgIHRoaXMuaW5pdE9wdGlvbnMoXG4gICAgICAgIG9wdGlvbnMuYmlhcywgb3B0aW9ucy5yZWN1cnJlbnRCaWFzLCBvcHRpb25zLmluaXRpYWxIaWRkZW5TdGF0ZSxcbiAgICAgICAgb3B0aW9ucy5yZXNldEFmdGVyLCBvcHRpb25zLnJldHVyblNlcXVlbmNlLCBvcHRpb25zLmRpcmVjdGlvbixcbiAgICAgICAgb3B0aW9ucy5sYXlvdXQsIG9wdGlvbnMuYWN0aXZhdGlvbnMpO1xuXG4gICAgdGhpcy5vdXRwdXRzLnB1c2gobmV3IE91dHB1dE9wZXJhbmQodGhpcykpO1xuICAgIGlmICh0aGlzLnJldHVyblNlcXVlbmNlXykge1xuICAgICAgdGhpcy5vdXRwdXRzXy5wdXNoKG5ldyBPdXRwdXRPcGVyYW5kKHRoaXMpKTtcbiAgICB9XG4gIH1cblxuICBpbml0T3B0aW9ucyhcbiAgICAgIGJpYXM/OiBNTE9wZXJhbmQsIHJlY3VycmVudEJpYXM/OiBNTE9wZXJhbmQsXG4gICAgICBpbml0aWFsSGlkZGVuU3RhdGU/OiBNTE9wZXJhbmQsIHJlc2V0QWZ0ZXIgPSB0cnVlLCByZXR1cm5TZXF1ZW5jZSA9IGZhbHNlLFxuICAgICAgZGlyZWN0aW9uOlxuICAgICAgICAgIE1MUmVjdXJyZW50TmV0d29ya0RpcmVjdGlvbiA9IE1MUmVjdXJyZW50TmV0d29ya0RpcmVjdGlvbi5mb3J3YXJkLFxuICAgICAgbGF5b3V0OlxuICAgICAgICAgIE1MUmVjdXJyZW50TmV0d29ya1dlaWdodExheW91dCA9IE1MUmVjdXJyZW50TmV0d29ya1dlaWdodExheW91dC56cm4sXG4gICAgICBhY3RpdmF0aW9uczpcbiAgICAgICAgICBNTE9wZXJhdG9yW10gPSBbdGhpcy5idWlsZGVyLnNpZ21vaWQoKSwgdGhpcy5idWlsZGVyLnRhbmgoKV0pOiB2b2lkIHtcbiAgICB1dGlscy52YWxpZGF0ZU9wdGlvbmFsT3BlcmFuZChiaWFzKTtcbiAgICB0aGlzLmJpYXNfID0gYmlhcztcbiAgICB1dGlscy52YWxpZGF0ZU9wdGlvbmFsT3BlcmFuZChyZWN1cnJlbnRCaWFzKTtcbiAgICB0aGlzLnJlY3VycmVudEJpYXNfID0gcmVjdXJyZW50QmlhcztcbiAgICB1dGlscy52YWxpZGF0ZU9wdGlvbmFsT3BlcmFuZChpbml0aWFsSGlkZGVuU3RhdGUpO1xuICAgIHRoaXMuaW5pdGlhbEhpZGRlblN0YXRlXyA9IGluaXRpYWxIaWRkZW5TdGF0ZTtcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIHV0aWxzLmlzQm9vbGVhbihyZXNldEFmdGVyKSxcbiAgICAgICAgJ1RoZSByZXNldEFmdGVyIHBhcmFtZXRlciBpcyBub3QgYSBib29sZWFuLicpO1xuICAgIHRoaXMucmVzZXRBZnRlcl8gPSByZXNldEFmdGVyO1xuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgdXRpbHMuaXNCb29sZWFuKHJldHVyblNlcXVlbmNlKSxcbiAgICAgICAgJ1RoZSByZXNldEFmdGVyIHBhcmFtZXRlciBpcyBub3QgYSBib29sZWFuLicpO1xuICAgIHRoaXMucmV0dXJuU2VxdWVuY2VfID0gcmV0dXJuU2VxdWVuY2U7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICBkaXJlY3Rpb24gaW4gTUxSZWN1cnJlbnROZXR3b3JrRGlyZWN0aW9uLFxuICAgICAgICAnVGhlIGRpcmVjdGlvbiBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICB0aGlzLmRpcmVjdGlvbl8gPSBkaXJlY3Rpb247XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICBsYXlvdXQgaW4gTUxSZWN1cnJlbnROZXR3b3JrV2VpZ2h0TGF5b3V0LFxuICAgICAgICAnVGhlIGxheW91dCBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICB0aGlzLmxheW91dF8gPSBsYXlvdXQ7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICBhY3RpdmF0aW9ucyBpbnN0YW5jZW9mIEFycmF5ICYmIGFjdGl2YXRpb25zLmxlbmd0aCA9PT0gMiAmJlxuICAgICAgICAgICAgYWN0aXZhdGlvbnMuZXZlcnkoYSA9PiBhIGluc3RhbmNlb2YgVW5hcnlNTE9wZXJhdG9yKSxcbiAgICAgICAgJ1RoZSBhY3RpdmF0aW9ucyBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICB0aGlzLmFjdGl2YXRpb25zXyA9IGFjdGl2YXRpb25zO1xuICB9XG5cbiAgaW5wdXRzKCk6IE1MT3BlcmFuZFtdIHtcbiAgICBjb25zdCBpbnB1dHM6IE1MT3BlcmFuZFtdID1cbiAgICAgICAgW3RoaXMuaW5wdXRfLCB0aGlzLndlaWdodF8sIHRoaXMucmVjdXJyZW50V2VpZ2h0X107XG4gICAgaWYgKHRoaXMuYmlhc18pIHtcbiAgICAgIGlucHV0cy5wdXNoKHRoaXMuYmlhc18pO1xuICAgIH1cbiAgICBpZiAodGhpcy5yZWN1cnJlbnRCaWFzXykge1xuICAgICAgaW5wdXRzLnB1c2godGhpcy5yZWN1cnJlbnRCaWFzXyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmluaXRpYWxIaWRkZW5TdGF0ZV8pIHtcbiAgICAgIGlucHV0cy5wdXNoKHRoaXMuaW5pdGlhbEhpZGRlblN0YXRlXyk7XG4gICAgfVxuICAgIHJldHVybiBpbnB1dHM7XG4gIH1cblxuICBjb21wdXRlSW1wbChpbnB1dFRlbnNvcnM6IE1hcDxNTE9wZXJhbmQsIHRmLlRlbnNvcj4pOiB0Zi5UZW5zb3JbXSB7XG4gICAgY29uc3QgaW5wdXQgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuaW5wdXRfKTtcbiAgICBjb25zdCB3ZWlnaHQgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMud2VpZ2h0Xyk7XG4gICAgY29uc3QgcmVjdXJyZW50V2VpZ2h0ID0gaW5wdXRUZW5zb3JzLmdldCh0aGlzLnJlY3VycmVudFdlaWdodF8pO1xuICAgIGNvbnN0IGJpYXMgPSB0aGlzLmJpYXNfID8gaW5wdXRUZW5zb3JzLmdldCh0aGlzLmJpYXNfKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCByZWN1cnJlbnRCaWFzID0gdGhpcy5yZWN1cnJlbnRXZWlnaHRfID9cbiAgICAgICAgaW5wdXRUZW5zb3JzLmdldCh0aGlzLnJlY3VycmVudEJpYXNfKSA6XG4gICAgICAgIHVuZGVmaW5lZDtcbiAgICBjb25zdCBpbml0aWFsSGlkZGVuU3RhdGUgPSB0aGlzLmluaXRpYWxIaWRkZW5TdGF0ZV8gP1xuICAgICAgICBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuaW5pdGlhbEhpZGRlblN0YXRlXykgOlxuICAgICAgICB1bmRlZmluZWQ7XG4gICAgY29uc3Qgc3RlcHMgPSB0aGlzLnN0ZXBzXztcbiAgICBjb25zdCBoaWRkZW5TaXplID0gdGhpcy5oaWRkZW5TaXplXztcbiAgICBjb25zdCByZXNldEFmdGVyID0gdGhpcy5yZXNldEFmdGVyXztcbiAgICBjb25zdCByZXR1cm5TZXF1ZW5jZSA9IHRoaXMucmV0dXJuU2VxdWVuY2VfO1xuICAgIGNvbnN0IGxheW91dCA9IHRoaXMubGF5b3V0XztcbiAgICBjb25zdCBhY3RpdmF0aW9ucyA9IHRoaXMuYWN0aXZhdGlvbnNfO1xuICAgIGNvbnN0IGRpcmVjdGlvbiA9IHRoaXMuZGlyZWN0aW9uXztcblxuICAgIGNvbnN0IG51bURpcmVjdGlvbnMgPVxuICAgICAgICAoZGlyZWN0aW9uID09PSBNTFJlY3VycmVudE5ldHdvcmtEaXJlY3Rpb24uYm90aCA/IDIgOiAxKTtcbiAgICBsZXQgaGlkZGVuU3RhdGUgPSBpbml0aWFsSGlkZGVuU3RhdGU7XG5cbiAgICBpZiAoaGlkZGVuU3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaGlkZGVuU3RhdGUgPSB0Zi56ZXJvcyhbbnVtRGlyZWN0aW9ucywgMSwgaGlkZGVuU2l6ZV0pO1xuICAgIH1cblxuICAgIGxldCBzZXF1ZW5jZTogdGYuVGVuc29yO1xuICAgIGNvbnN0IGNlbGxXZWlnaHQ6IHRmLlRlbnNvcltdID0gW107XG4gICAgY29uc3QgY2VsbFJlY3VycmVudFdlaWdodDogdGYuVGVuc29yW10gPSBbXTtcbiAgICBjb25zdCBjZWxsQmlhczogdGYuVGVuc29yW10gPSBbXTtcbiAgICBjb25zdCBjZWxsUmVjdXJyZW50QmlhczogdGYuVGVuc29yW10gPSBbXTtcblxuICAgIGZvciAobGV0IHNsb3QgPSAwOyBzbG90IDwgbnVtRGlyZWN0aW9uczsgKytzbG90KSB7XG4gICAgICBjZWxsV2VpZ2h0LnB1c2goXG4gICAgICAgICAgdGYuc3F1ZWV6ZSh0Zi5zbGljZSh3ZWlnaHQsIFtzbG90LCAwLCAwXSwgWzEsIC0xLCAtMV0pLCBbMF0pKTtcbiAgICAgIGNlbGxSZWN1cnJlbnRXZWlnaHQucHVzaCh0Zi5zcXVlZXplKFxuICAgICAgICAgIHRmLnNsaWNlKHJlY3VycmVudFdlaWdodCwgW3Nsb3QsIDAsIDBdLCBbMSwgLTEsIC0xXSksIFswXSkpO1xuICAgICAgY2VsbEJpYXMucHVzaChcbiAgICAgICAgICBiaWFzID8gKHRmLnNxdWVlemUodGYuc2xpY2UoYmlhcywgW3Nsb3QsIDBdLCBbMSwgLTFdKSwgWzBdKSkgOlxuICAgICAgICAgICAgICAgICB1bmRlZmluZWQpO1xuICAgICAgY2VsbFJlY3VycmVudEJpYXMucHVzaChcbiAgICAgICAgICByZWN1cnJlbnRCaWFzID9cbiAgICAgICAgICAgICAgKHRmLnNxdWVlemUodGYuc2xpY2UocmVjdXJyZW50QmlhcywgW3Nsb3QsIDBdLCBbMSwgLTFdKSwgWzBdKSkgOlxuICAgICAgICAgICAgICB1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIGZvciAobGV0IHN0ZXAgPSAwOyBzdGVwIDwgc3RlcHM7ICsrc3RlcCkge1xuICAgICAgY29uc3QgY2VsbEhpZGRlbjogdGYuVGVuc29yW10gPSBbXTtcbiAgICAgIGxldCBjZWxsT3V0cHV0OiB0Zi5UZW5zb3I7XG5cbiAgICAgIGZvciAobGV0IHNsb3QgPSAwOyBzbG90IDwgbnVtRGlyZWN0aW9uczsgKytzbG90KSB7XG4gICAgICAgIGNlbGxIaWRkZW4ucHVzaChcbiAgICAgICAgICAgIHRmLnNxdWVlemUodGYuc2xpY2UoaGlkZGVuU3RhdGUsIFtzbG90LCAwLCAwXSwgWzEsIC0xLCAtMV0pLCBbMF0pKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgc2xvdCA9IDA7IHNsb3QgPCBudW1EaXJlY3Rpb25zOyArK3Nsb3QpIHtcbiAgICAgICAgY29uc3Qgc2xpY2UgPVxuICAgICAgICAgICAgKHNsb3QgPT09IDEgfHwgZGlyZWN0aW9uID09PSBNTFJlY3VycmVudE5ldHdvcmtEaXJlY3Rpb24uYmFja3dhcmQgP1xuICAgICAgICAgICAgICAgICBzdGVwcyAtIHN0ZXAgLSAxIDpcbiAgICAgICAgICAgICAgICAgc3RlcCk7XG4gICAgICAgIGNvbnN0IGNlbGxJbnB1dCA9XG4gICAgICAgICAgICB0Zi5zcXVlZXplKHRmLnNsaWNlKGlucHV0LCBbc2xpY2UsIDAsIDBdLCBbMSwgLTEsIC0xXSksIFswXSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGYucmVzaGFwZShcbiAgICAgICAgICAgIEdydUNlbGwuY29tcHV0ZShcbiAgICAgICAgICAgICAgICBjZWxsSW5wdXQsIGNlbGxXZWlnaHRbc2xvdF0sIGNlbGxSZWN1cnJlbnRXZWlnaHRbc2xvdF0sXG4gICAgICAgICAgICAgICAgY2VsbEhpZGRlbltzbG90XSwgaGlkZGVuU2l6ZSwgYWN0aXZhdGlvbnMsIGNlbGxCaWFzW3Nsb3RdLFxuICAgICAgICAgICAgICAgIGNlbGxSZWN1cnJlbnRCaWFzW3Nsb3RdLCByZXNldEFmdGVyLCBsYXlvdXQpLFxuICAgICAgICAgICAgWzEsIC0xLCBoaWRkZW5TaXplXSk7XG5cbiAgICAgICAgY2VsbE91dHB1dCA9IChjZWxsT3V0cHV0ID8gdGYuY29uY2F0KFtjZWxsT3V0cHV0LCByZXN1bHRdLCAwKSA6IHJlc3VsdCk7XG4gICAgICB9XG5cbiAgICAgIGhpZGRlblN0YXRlID0gY2VsbE91dHB1dDtcblxuICAgICAgaWYgKHJldHVyblNlcXVlbmNlKSB7XG4gICAgICAgIGNlbGxPdXRwdXQgPSB0Zi5yZXNoYXBlKGNlbGxPdXRwdXQsIFsxLCBudW1EaXJlY3Rpb25zLCAtMSwgaGlkZGVuU2l6ZV0pO1xuICAgICAgICBzZXF1ZW5jZSA9XG4gICAgICAgICAgICAoc2VxdWVuY2UgPyB0Zi5jb25jYXQoW3NlcXVlbmNlLCBjZWxsT3V0cHV0XSwgMCkgOiBjZWxsT3V0cHV0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gW2hpZGRlblN0YXRlLCBzZXF1ZW5jZV07XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdydUNlbGwgZXh0ZW5kcyBTaW5nbGVPdXRwdXRPcGVyYXRpb24ge1xuICBwcml2YXRlIGlucHV0XzogTUxPcGVyYW5kO1xuICBwcml2YXRlIHdlaWdodF86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSByZWN1cnJlbnRXZWlnaHRfOiBNTE9wZXJhbmQ7XG4gIHByaXZhdGUgaGlkZGVuU3RhdGVfOiBNTE9wZXJhbmQ7XG4gIHByaXZhdGUgaGlkZGVuU2l6ZV86IG51bWJlcjtcbiAgcHJpdmF0ZSBiaWFzXz86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSByZWN1cnJlbnRCaWFzXz86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSByZXNldEFmdGVyXzogYm9vbGVhbjtcbiAgcHJpdmF0ZSBsYXlvdXRfOiBNTFJlY3VycmVudE5ldHdvcmtXZWlnaHRMYXlvdXQ7XG4gIHByaXZhdGUgYWN0aXZhdGlvbnNfOiBNTE9wZXJhdG9yW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBpbnB1dDogTUxPcGVyYW5kLCB3ZWlnaHQ6IE1MT3BlcmFuZCwgcmVjdXJyZW50V2VpZ2h0OiBNTE9wZXJhbmQsXG4gICAgICBoaWRkZW5TdGF0ZTogTUxPcGVyYW5kLCBoaWRkZW5TaXplOiBudW1iZXIsXG4gICAgICBvcHRpb25zOiBNTEdydUNlbGxPcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihpbnB1dC5idWlsZGVyKTtcbiAgICB1dGlscy52YWxpZGF0ZU9wZXJhbmQoaW5wdXQpO1xuICAgIHRoaXMuaW5wdXRfID0gaW5wdXQ7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKHdlaWdodCk7XG4gICAgdGhpcy53ZWlnaHRfID0gd2VpZ2h0O1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZChyZWN1cnJlbnRXZWlnaHQpO1xuICAgIHRoaXMucmVjdXJyZW50V2VpZ2h0XyA9IHJlY3VycmVudFdlaWdodDtcbiAgICB1dGlscy52YWxpZGF0ZU9wZXJhbmQoaGlkZGVuU3RhdGUpO1xuICAgIHRoaXMuaGlkZGVuU3RhdGVfID0gaGlkZGVuU3RhdGU7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICB1dGlscy5pc0ludGVnZXIoaGlkZGVuU2l6ZSkgJiYgaGlkZGVuU2l6ZSA+IDAsXG4gICAgICAgICdUaGUgaGlkZGVuU2l6ZSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICB0aGlzLmhpZGRlblNpemVfID0gaGlkZGVuU2l6ZTtcbiAgICB0aGlzLmluaXRPcHRpb25zKFxuICAgICAgICBvcHRpb25zLmJpYXMsIG9wdGlvbnMucmVjdXJyZW50Qmlhcywgb3B0aW9ucy5yZXNldEFmdGVyLCBvcHRpb25zLmxheW91dCxcbiAgICAgICAgb3B0aW9ucy5hY3RpdmF0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIGluaXRPcHRpb25zKFxuICAgICAgYmlhcz86IE1MT3BlcmFuZCwgcmVjdXJyZW50Qmlhcz86IE1MT3BlcmFuZCwgcmVzZXRBZnRlciA9IHRydWUsXG4gICAgICBsYXlvdXQ6XG4gICAgICAgICAgTUxSZWN1cnJlbnROZXR3b3JrV2VpZ2h0TGF5b3V0ID0gTUxSZWN1cnJlbnROZXR3b3JrV2VpZ2h0TGF5b3V0LnpybixcbiAgICAgIGFjdGl2YXRpb25zOlxuICAgICAgICAgIE1MT3BlcmF0b3JbXSA9IFt0aGlzLmJ1aWxkZXIuc2lnbW9pZCgpLCB0aGlzLmJ1aWxkZXIudGFuaCgpXSkge1xuICAgIHV0aWxzLnZhbGlkYXRlT3B0aW9uYWxPcGVyYW5kKGJpYXMpO1xuICAgIHRoaXMuYmlhc18gPSBiaWFzO1xuICAgIHV0aWxzLnZhbGlkYXRlT3B0aW9uYWxPcGVyYW5kKHJlY3VycmVudEJpYXMpO1xuICAgIHRoaXMucmVjdXJyZW50Qmlhc18gPSByZWN1cnJlbnRCaWFzO1xuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgdXRpbHMuaXNCb29sZWFuKHJlc2V0QWZ0ZXIpLFxuICAgICAgICAnVGhlIHJlc2V0QWZ0ZXIgcGFyYW1ldGVyIGlzIG5vdCBhIGJvb2xlYW4uJyk7XG4gICAgdGhpcy5yZXNldEFmdGVyXyA9IHJlc2V0QWZ0ZXI7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICBsYXlvdXQgaW4gTUxSZWN1cnJlbnROZXR3b3JrV2VpZ2h0TGF5b3V0LFxuICAgICAgICAnVGhlIGxheW91dCBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICB0aGlzLmxheW91dF8gPSBsYXlvdXQ7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICBhY3RpdmF0aW9ucyBpbnN0YW5jZW9mIEFycmF5ICYmIGFjdGl2YXRpb25zLmxlbmd0aCA9PT0gMiAmJlxuICAgICAgICAgICAgYWN0aXZhdGlvbnMuZXZlcnkoYSA9PiBhIGluc3RhbmNlb2YgVW5hcnlNTE9wZXJhdG9yKSxcbiAgICAgICAgJ1RoZSBhY3RpdmF0aW9ucyBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICB0aGlzLmFjdGl2YXRpb25zXyA9IGFjdGl2YXRpb25zO1xuICB9XG5cbiAgaW5wdXRzKCk6IE1MT3BlcmFuZFtdIHtcbiAgICBjb25zdCBpbnB1dHM6IE1MT3BlcmFuZFtdID1cbiAgICAgICAgW3RoaXMuaW5wdXRfLCB0aGlzLndlaWdodF8sIHRoaXMucmVjdXJyZW50V2VpZ2h0XywgdGhpcy5oaWRkZW5TdGF0ZV9dO1xuICAgIGlmICh0aGlzLmJpYXNfKSB7XG4gICAgICBpbnB1dHMucHVzaCh0aGlzLmJpYXNfKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucmVjdXJyZW50Qmlhc18pIHtcbiAgICAgIGlucHV0cy5wdXNoKHRoaXMucmVjdXJyZW50Qmlhc18pO1xuICAgIH1cbiAgICByZXR1cm4gaW5wdXRzO1xuICB9XG5cbiAgc3RhdGljIGNvbXB1dGUoXG4gICAgICBpbnB1dDogdGYuVGVuc29yLCB3ZWlnaHQ6IHRmLlRlbnNvciwgcmVjdXJyZW50V2VpZ2h0OiB0Zi5UZW5zb3IsXG4gICAgICBoaWRkZW5TdGF0ZTogdGYuVGVuc29yLCBoaWRkZW5TaXplOiBudW1iZXIsIGFjdGl2YXRpb25zOiBNTE9wZXJhdG9yW10sXG4gICAgICBiaWFzPzogdGYuVGVuc29yLCByZWN1cnJlbnRCaWFzPzogdGYuVGVuc29yLCByZXNldEFmdGVyID0gdHJ1ZSxcbiAgICAgIGxheW91dDpcbiAgICAgICAgICBNTFJlY3VycmVudE5ldHdvcmtXZWlnaHRMYXlvdXQgPSBNTFJlY3VycmVudE5ldHdvcmtXZWlnaHRMYXlvdXQuenJuKTpcbiAgICAgIHRmLlRlbnNvciB7XG4gICAgY29uc3Qgb25lID0gdGYuc2NhbGFyKDEpO1xuICAgIGNvbnN0IHplcm8gPSB0Zi5zY2FsYXIoMCk7XG4gICAgY29uc3Qgc3RhcnRzID0gbGF5b3V0ID09PSBNTFJlY3VycmVudE5ldHdvcmtXZWlnaHRMYXlvdXQuenJuID9cbiAgICAgICAge3o6IDAsIHI6IGhpZGRlblNpemUsIG46IDIgKiBoaWRkZW5TaXplfSA6XG4gICAgICAgIC8qcnpuKi8ge3I6IDAsIHo6IGhpZGRlblNpemUsIG46IDIgKiBoaWRkZW5TaXplfTtcbiAgICBjb25zdCBhY3RpdmF0aW9uMDogVW5hcnlNTE9wZXJhdG9yID0gYWN0aXZhdGlvbnNbMF0gYXMgVW5hcnlNTE9wZXJhdG9yO1xuICAgIGNvbnN0IGFjdGl2YXRpb24xOiBVbmFyeU1MT3BlcmF0b3IgPSBhY3RpdmF0aW9uc1sxXSBhcyBVbmFyeU1MT3BlcmF0b3I7XG4gICAgLy8gdXBkYXRlIGdhdGVcbiAgICBjb25zdCB6ID0gYWN0aXZhdGlvbjAucnVuT3AodGYuYWRkKFxuICAgICAgICB0Zi5hZGQoXG4gICAgICAgICAgICAoYmlhcyA/IHRmLnNsaWNlKGJpYXMsIFtzdGFydHMuel0sIFtoaWRkZW5TaXplXSkgOiB6ZXJvKSxcbiAgICAgICAgICAgIChyZWN1cnJlbnRCaWFzID8gdGYuc2xpY2UocmVjdXJyZW50QmlhcywgW3N0YXJ0cy56XSwgW2hpZGRlblNpemVdKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHplcm8pKSxcbiAgICAgICAgdGYuYWRkKFxuICAgICAgICAgICAgdGYubWF0TXVsKFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIHRmLnRyYW5zcG9zZShcbiAgICAgICAgICAgICAgICAgICAgdGYuc2xpY2Uod2VpZ2h0LCBbc3RhcnRzLnosIDBdLCBbaGlkZGVuU2l6ZSwgLTFdKSkpLFxuICAgICAgICAgICAgdGYubWF0TXVsKFxuICAgICAgICAgICAgICAgIGhpZGRlblN0YXRlLFxuICAgICAgICAgICAgICAgIHRmLnRyYW5zcG9zZSh0Zi5zbGljZShcbiAgICAgICAgICAgICAgICAgICAgcmVjdXJyZW50V2VpZ2h0LCBbc3RhcnRzLnosIDBdLCBbaGlkZGVuU2l6ZSwgLTFdKSkpKSkpO1xuICAgIC8vIHJlc2V0IGdhdGVcbiAgICBjb25zdCByID0gYWN0aXZhdGlvbjAucnVuT3AodGYuYWRkKFxuICAgICAgICB0Zi5hZGQoXG4gICAgICAgICAgICAoYmlhcyA/IHRmLnNsaWNlKGJpYXMsIFtzdGFydHMucl0sIFtoaWRkZW5TaXplXSkgOiB6ZXJvKSxcbiAgICAgICAgICAgIChyZWN1cnJlbnRCaWFzID8gdGYuc2xpY2UocmVjdXJyZW50QmlhcywgW3N0YXJ0cy5yXSwgW2hpZGRlblNpemVdKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHplcm8pKSxcbiAgICAgICAgdGYuYWRkKFxuICAgICAgICAgICAgdGYubWF0TXVsKFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIHRmLnRyYW5zcG9zZShcbiAgICAgICAgICAgICAgICAgICAgdGYuc2xpY2Uod2VpZ2h0LCBbc3RhcnRzLnIsIDBdLCBbaGlkZGVuU2l6ZSwgLTFdKSkpLFxuICAgICAgICAgICAgdGYubWF0TXVsKFxuICAgICAgICAgICAgICAgIGhpZGRlblN0YXRlLFxuICAgICAgICAgICAgICAgIHRmLnRyYW5zcG9zZSh0Zi5zbGljZShcbiAgICAgICAgICAgICAgICAgICAgcmVjdXJyZW50V2VpZ2h0LCBbc3RhcnRzLnIsIDBdLCBbaGlkZGVuU2l6ZSwgLTFdKSkpKSkpO1xuICAgIC8vIG5ldyBnYXRlXG4gICAgbGV0IG47XG4gICAgaWYgKHJlc2V0QWZ0ZXIpIHtcbiAgICAgIG4gPSBhY3RpdmF0aW9uMS5ydW5PcCh0Zi5hZGQoXG4gICAgICAgICAgKGJpYXMgPyB0Zi5zbGljZShiaWFzLCBbc3RhcnRzLm5dLCBbaGlkZGVuU2l6ZV0pIDogemVybyksXG4gICAgICAgICAgdGYuYWRkKFxuICAgICAgICAgICAgICB0Zi5tYXRNdWwoXG4gICAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICAgIHRmLnRyYW5zcG9zZShcbiAgICAgICAgICAgICAgICAgICAgICB0Zi5zbGljZSh3ZWlnaHQsIFtzdGFydHMubiwgMF0sIFtoaWRkZW5TaXplLCAtMV0pKSksXG4gICAgICAgICAgICAgIHRmLm11bChcbiAgICAgICAgICAgICAgICAgIHIsXG4gICAgICAgICAgICAgICAgICB0Zi5hZGQoXG4gICAgICAgICAgICAgICAgICAgICAgKHJlY3VycmVudEJpYXMgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgdGYuc2xpY2UocmVjdXJyZW50QmlhcywgW3N0YXJ0cy5uXSwgW2hpZGRlblNpemVdKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICB6ZXJvKSxcbiAgICAgICAgICAgICAgICAgICAgICB0Zi5tYXRNdWwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlblN0YXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0Zi50cmFuc3Bvc2UodGYuc2xpY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN1cnJlbnRXZWlnaHQsIFtzdGFydHMubiwgMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZGVuU2l6ZSwgLTFdKSkpKSkpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG4gPSBhY3RpdmF0aW9uMS5ydW5PcCh0Zi5hZGQoXG4gICAgICAgICAgdGYuYWRkKFxuICAgICAgICAgICAgICAoYmlhcyA/IHRmLnNsaWNlKGJpYXMsIFtzdGFydHMubl0sIFtoaWRkZW5TaXplXSkgOiB6ZXJvKSxcbiAgICAgICAgICAgICAgKHJlY3VycmVudEJpYXMgP1xuICAgICAgICAgICAgICAgICAgIHRmLnNsaWNlKHJlY3VycmVudEJpYXMsIFtzdGFydHMubl0sIFtoaWRkZW5TaXplXSkgOlxuICAgICAgICAgICAgICAgICAgIHplcm8pKSxcbiAgICAgICAgICB0Zi5hZGQoXG4gICAgICAgICAgICAgIHRmLm1hdE11bChcbiAgICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgICAgdGYudHJhbnNwb3NlKFxuICAgICAgICAgICAgICAgICAgICAgIHRmLnNsaWNlKHdlaWdodCwgW3N0YXJ0cy5uLCAwXSwgW2hpZGRlblNpemUsIC0xXSkpKSxcbiAgICAgICAgICAgICAgdGYubWF0TXVsKFxuICAgICAgICAgICAgICAgICAgdGYubXVsKHIsIGhpZGRlblN0YXRlKSxcbiAgICAgICAgICAgICAgICAgIHRmLnRyYW5zcG9zZSh0Zi5zbGljZShcbiAgICAgICAgICAgICAgICAgICAgICByZWN1cnJlbnRXZWlnaHQsIFtzdGFydHMubiwgMF0sIFtoaWRkZW5TaXplLCAtMV0pKSkpKSk7XG4gICAgfVxuICAgIC8vIGNvbXB1dGUgdGhlIG5ldyBoaWRkZW4gc3RhdGVcbiAgICByZXR1cm4gdGYuYWRkKHRmLm11bCh6LCBoaWRkZW5TdGF0ZSksIHRmLm11bChuLCB0Zi5zdWIob25lLCB6KSkpO1xuICB9XG5cbiAgcnVuKGlucHV0VGVuc29yczogTWFwPE1MT3BlcmFuZCwgdGYuVGVuc29yPik6IHRmLlRlbnNvciB7XG4gICAgcmV0dXJuIEdydUNlbGwuY29tcHV0ZShcbiAgICAgICAgaW5wdXRUZW5zb3JzLmdldCh0aGlzLmlucHV0XyksIGlucHV0VGVuc29ycy5nZXQodGhpcy53ZWlnaHRfKSxcbiAgICAgICAgaW5wdXRUZW5zb3JzLmdldCh0aGlzLnJlY3VycmVudFdlaWdodF8pLFxuICAgICAgICBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuaGlkZGVuU3RhdGVfKSwgdGhpcy5oaWRkZW5TaXplXyxcbiAgICAgICAgdGhpcy5hY3RpdmF0aW9uc18sXG4gICAgICAgIHRoaXMuYmlhc18gPyBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuYmlhc18pIDogdW5kZWZpbmVkLFxuICAgICAgICB0aGlzLnJlY3VycmVudEJpYXNfID8gaW5wdXRUZW5zb3JzLmdldCh0aGlzLnJlY3VycmVudEJpYXNfKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgdGhpcy5yZXNldEFmdGVyXywgdGhpcy5sYXlvdXRfKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNTElucHV0T3BlcmFuZExheW91dCwgTUxJbnN0YW5jZU5vcm1hbGl6YXRpb25PcHRpb25zfSBmcm9tICcuLi9ncmFwaF9idWlsZGVyJztcbmltcG9ydCB7TUxPcGVyYW5kfSBmcm9tICcuLi9vcGVyYW5kJztcbmltcG9ydCB7U2luZ2xlT3V0cHV0T3BlcmF0aW9ufSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgSW5zdGFuY2VOb3JtYWxpemF0aW9uIGV4dGVuZHMgU2luZ2xlT3V0cHV0T3BlcmF0aW9uIHtcbiAgcHJpdmF0ZSBpbnB1dF86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSBzY2FsZV8/OiBNTE9wZXJhbmQ7XG4gIHByaXZhdGUgYmlhc18/OiBNTE9wZXJhbmQ7XG4gIHByaXZhdGUgZXBzaWxvbl8/OiBudW1iZXI7XG4gIHByaXZhdGUgbGF5b3V0XzogTUxJbnB1dE9wZXJhbmRMYXlvdXQ7XG5cbiAgY29uc3RydWN0b3IoaW5wdXQ6IE1MT3BlcmFuZCwgb3B0aW9uczogTUxJbnN0YW5jZU5vcm1hbGl6YXRpb25PcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihpbnB1dC5idWlsZGVyKTtcbiAgICB1dGlscy52YWxpZGF0ZU9wZXJhbmQoaW5wdXQpO1xuICAgIHRoaXMuaW5wdXRfID0gaW5wdXQ7XG4gICAgdXRpbHMudmFsaWRhdGVPcHRpb25hbE9wZXJhbmQob3B0aW9ucy5zY2FsZSk7XG4gICAgdGhpcy5zY2FsZV8gPSBvcHRpb25zLnNjYWxlO1xuICAgIHV0aWxzLnZhbGlkYXRlT3B0aW9uYWxPcGVyYW5kKG9wdGlvbnMuYmlhcyk7XG4gICAgdGhpcy5iaWFzXyA9IG9wdGlvbnMuYmlhcztcbiAgICBpZiAob3B0aW9ucy5lcHNpbG9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGVwc2lsb24gPSBvcHRpb25zLmVwc2lsb247XG4gICAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgICAgdHlwZW9mIGVwc2lsb24gPT09ICdudW1iZXInLCAnVGhlIGVwc2lsb24gcGFyYW1ldGVyIGlzIGludmFsaWQnKTtcbiAgICAgIHRoaXMuZXBzaWxvbl8gPSBlcHNpbG9uO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVwc2lsb25fID0gMWUtNTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMubGF5b3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgICBvcHRpb25zLmxheW91dCBpbiBNTElucHV0T3BlcmFuZExheW91dCxcbiAgICAgICAgICAnVGhlIGxheW91dCBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICAgIHRoaXMubGF5b3V0XyA9IG9wdGlvbnMubGF5b3V0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxheW91dF8gPSBNTElucHV0T3BlcmFuZExheW91dC5uY2h3O1xuICAgIH1cbiAgfVxuXG4gIGlucHV0cygpOiBNTE9wZXJhbmRbXSB7XG4gICAgY29uc3QgaW5wdXRzOiBNTE9wZXJhbmRbXSA9IFt0aGlzLmlucHV0X107XG4gICAgaWYgKHRoaXMuc2NhbGVfKSB7XG4gICAgICBpbnB1dHMucHVzaCh0aGlzLnNjYWxlXyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmJpYXNfKSB7XG4gICAgICBpbnB1dHMucHVzaCh0aGlzLmJpYXNfKTtcbiAgICB9XG4gICAgcmV0dXJuIGlucHV0cztcbiAgfVxuXG4gIHJ1bihpbnB1dFRlbnNvcnM6IE1hcDxNTE9wZXJhbmQsIHRmLlRlbnNvcj4pOiB0Zi5UZW5zb3Ige1xuICAgIGNvbnN0IGlucHV0OiB0Zi5UZW5zb3IgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuaW5wdXRfKTtcbiAgICB1dGlscy5hc3NlcnQoaW5wdXQucmFuayA9PT0gNCwgJ1RoZSBpbnB1dCBvcGVyYW5kIGlzIG5vdCA0LUQuJyk7XG4gICAgbGV0IGF4ZXMgPSBbMiwgM107XG4gICAgbGV0IHNoYXBlID0gWzEsIC0xLCAxLCAxXTtcbiAgICBsZXQgaW5wdXRDaGFubmVscyA9IGlucHV0LnNoYXBlWzFdO1xuICAgIGlmICh0aGlzLmxheW91dF8gPT09IE1MSW5wdXRPcGVyYW5kTGF5b3V0Lm5od2MpIHtcbiAgICAgIGF4ZXMgPSBbMSwgMl07XG4gICAgICBzaGFwZSA9IFsxLCAxLCAxLCAtMV07XG4gICAgICBpbnB1dENoYW5uZWxzID0gaW5wdXQuc2hhcGVbM107XG4gICAgfVxuICAgIGxldCBzY2FsZTogdGYuVGVuc29yO1xuICAgIGlmICh0aGlzLnNjYWxlXykge1xuICAgICAgc2NhbGUgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuc2NhbGVfKTtcbiAgICAgIHV0aWxzLmFzc2VydChzY2FsZS5yYW5rID09PSAxLCAnVGhlIHNjYWxlIG9wZXJhbmQgaXMgbm90IDEtRC4nKTtcbiAgICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgICBzY2FsZS5zaGFwZVswXSA9PT0gaW5wdXRDaGFubmVscyxcbiAgICAgICAgICAnVGhlIGxlbmd0aCBvZiBzY2FsZSBpcyBub3QgZXF1YWwgdG8gdGhlIHNpemUgb2YgdGhlIGZlYXR1cmUgJyArXG4gICAgICAgICAgICAgICdkaW1lbnNpb24gb2YgdGhlIGlucHV0LicpO1xuICAgIH0gZWxzZSB7XG4gICAgfVxuICAgIGxldCBiaWFzOiB0Zi5UZW5zb3I7XG4gICAgaWYgKHRoaXMuYmlhc18pIHtcbiAgICAgIGJpYXMgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuYmlhc18pO1xuICAgICAgdXRpbHMuYXNzZXJ0KGJpYXMucmFuayA9PT0gMSwgJ1RoZSBiaWFzIG9wZXJhbmQgaXMgbm90IDEtRC4nKTtcbiAgICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgICBiaWFzLnNoYXBlWzBdID09PSBpbnB1dENoYW5uZWxzLFxuICAgICAgICAgICdUaGUgbGVuZ3RoIG9mIGJpYXMgaXMgbm90IGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoZSBmZWF0dXJlICcgK1xuICAgICAgICAgICAgICAnZGltZW5zaW9uIG9mIHRoZSBpbnB1dC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBtZWFuID0gdGYubWVhbihpbnB1dCwgYXhlcywgdHJ1ZSk7XG4gICAgY29uc3QgdmFyaWFuY2UgPSB0Zi5tZWFuKHRmLnBvdyh0Zi5zdWIoaW5wdXQsIG1lYW4pLCAyKSwgYXhlcywgdHJ1ZSk7XG4gICAgY29uc3Qgbm9ybSA9IHRmLmRpdihcbiAgICAgICAgdGYuc3ViKGlucHV0LCBtZWFuKSwgdGYuc3FydCh0Zi5hZGQodmFyaWFuY2UsIHRoaXMuZXBzaWxvbl8pKSk7XG4gICAgY29uc3Qgc2NhbGVkID0gc2NhbGUgPyB0Zi5tdWwodGYucmVzaGFwZShzY2FsZSwgc2hhcGUpLCBub3JtKSA6IG5vcm07XG4gICAgcmV0dXJuIGJpYXMgPyB0Zi5hZGQodGYucmVzaGFwZShiaWFzLCBzaGFwZSksIHNjYWxlZCkgOiBzY2FsZWQ7XG4gIH1cbn0iLCJpbXBvcnQgKiBhcyB0ZiBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01MT3BlcmFuZH0gZnJvbSAnLi4vb3BlcmFuZCc7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuLi91dGlscyc7XG5cbmltcG9ydCB7VW5hcnlNTE9wZXJhdG9yfSBmcm9tICcuL3VuYXJ5JztcblxuZXhwb3J0IGNsYXNzIExlYWt5UmVsdSBleHRlbmRzIFVuYXJ5TUxPcGVyYXRvciB7XG4gIHByaXZhdGUgYWxwaGFfPzogbnVtYmVyO1xuXG4gIGdldCBhbHBoYSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmFscGhhXztcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHg6IE1MT3BlcmFuZCwgYWxwaGEgPSAwLjAxKSB7XG4gICAgc3VwZXIoeCk7XG4gICAgdXRpbHMuYXNzZXJ0KHR5cGVvZiBhbHBoYSA9PT0gJ251bWJlcicsICdUaGUgYWxwaGEgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5hbHBoYV8gPSBhbHBoYTtcbiAgfVxuXG4gIHJ1bk9wKHg6IHRmLlRlbnNvcik6IHRmLlRlbnNvciB7XG4gICAgcmV0dXJuIHRmLmxlYWt5UmVsdSh4LCB0aGlzLmFscGhhXyk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIHRmIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TUxQYWRkaW5nTW9kZSwgTUxQYWRPcHRpb25zfSBmcm9tICcuLi9ncmFwaF9idWlsZGVyJztcbmltcG9ydCB7TUxPcGVyYW5kfSBmcm9tICcuLi9vcGVyYW5kJztcbmltcG9ydCB7U2luZ2xlT3V0cHV0T3BlcmF0aW9ufSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgUGFkIGV4dGVuZHMgU2luZ2xlT3V0cHV0T3BlcmF0aW9uIHtcbiAgcHJpdmF0ZSBpbnB1dF86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSBwYWRkaW5nXzogTUxPcGVyYW5kO1xuICBwcml2YXRlIG1vZGVfOiBNTFBhZGRpbmdNb2RlID0gTUxQYWRkaW5nTW9kZS5jb25zdGFudDtcbiAgcHJpdmF0ZSB2YWx1ZV8gPSAwO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgaW5wdXQ6IE1MT3BlcmFuZCwgcGFkZGluZzogTUxPcGVyYW5kLCBvcHRpb25zOiBNTFBhZE9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKGlucHV0LmJ1aWxkZXIpO1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZChpbnB1dCk7XG4gICAgdGhpcy5pbnB1dF8gPSBpbnB1dDtcbiAgICB1dGlscy52YWxpZGF0ZU9wZXJhbmQocGFkZGluZyk7XG4gICAgdGhpcy5wYWRkaW5nXyA9IHBhZGRpbmc7XG4gICAgaWYgKG9wdGlvbnMubW9kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgICAgb3B0aW9ucy5tb2RlIGluIE1MUGFkZGluZ01vZGUsICdUaGUgbW9kZSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICAgIHRoaXMubW9kZV8gPSBvcHRpb25zLm1vZGU7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMudmFsdWVfID0gb3B0aW9ucy52YWx1ZTtcbiAgICB9XG4gIH1cblxuICBpbnB1dHMoKTogTUxPcGVyYW5kW10ge1xuICAgIHJldHVybiBbdGhpcy5pbnB1dF8sIHRoaXMucGFkZGluZ19dO1xuICB9XG5cbiAgcnVuKGlucHV0VGVuc29yczogTWFwPE1MT3BlcmFuZCwgdGYuVGVuc29yPik6IHRmLlRlbnNvciB7XG4gICAgY29uc3QgaW5wdXQ6IHRmLlRlbnNvciA9IGlucHV0VGVuc29ycy5nZXQodGhpcy5pbnB1dF8pO1xuICAgIGNvbnN0IHBhZGRpbmc6IHRmLlRlbnNvciA9IGlucHV0VGVuc29ycy5nZXQodGhpcy5wYWRkaW5nXyk7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICBwYWRkaW5nLnJhbmsgPT09IDIgJiYgcGFkZGluZy5kdHlwZSA9PT0gJ2ludDMyJyAmJlxuICAgICAgICAgICAgcGFkZGluZy5zaGFwZVswXSA9PT0gaW5wdXQucmFuayxcbiAgICAgICAgJ1RoZSBwYWRkaW5nIG9wZXJhbmQgaXMgaW52YWxpZC4nKTtcbiAgICBjb25zdCBwYWRkaW5nQXJyYXkgPSBwYWRkaW5nLmFycmF5U3luYygpIGFzIEFycmF5PFtudW1iZXIsIG51bWJlcl0+O1xuICAgIGlmICh0aGlzLm1vZGVfID09PSBNTFBhZGRpbmdNb2RlLmNvbnN0YW50KSB7XG4gICAgICByZXR1cm4gdGYucGFkKGlucHV0LCBwYWRkaW5nQXJyYXksIHRoaXMudmFsdWVfKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMubW9kZV8gPT09IE1MUGFkZGluZ01vZGUuZWRnZSkge1xuICAgICAgICBjb25zdCBlZGdlUGFkZGluZ3M6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+ID1cbiAgICAgICAgICAgIG5ldyBBcnJheShwYWRkaW5nQXJyYXkubGVuZ3RoKTtcbiAgICAgICAgbGV0IHBhZGRlZDogdGYuVGVuc29yID0gaW5wdXQ7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhZGRpbmdBcnJheS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgZWRnZVBhZGRpbmdzW2ldID0gWzAsIDBdO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCAyOyArK2opIHtcbiAgICAgICAgICAgICAgaWYgKHBhZGRpbmdBcnJheVtpXVtqXSA+IDApIHtcbiAgICAgICAgICAgICAgICBlZGdlUGFkZGluZ3NbaV1bal0gPSAxO1xuICAgICAgICAgICAgICAgIHBhZGRpbmdBcnJheVtpXVtqXSAtPSAxO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGVkZ2VQYWRkaW5nc1tpXVtqXSA9IDA7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGVkZ2VQYWRkaW5ncy5ldmVyeSh2YWx1ZSA9PiB2YWx1ZVswXSA9PT0gMCAmJiB2YWx1ZVsxXSA9PT0gMCkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYWRkZWQgPSB0Zi5taXJyb3JQYWQocGFkZGVkLCBlZGdlUGFkZGluZ3MsICdzeW1tZXRyaWMnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFkZGVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IG1vZGU6ICdyZWZsZWN0J3wnc3ltbWV0cmljJztcbiAgICAgICAgaWYgKHRoaXMubW9kZV8gPT09IE1MUGFkZGluZ01vZGUucmVmbGVjdGlvbikge1xuICAgICAgICAgIG1vZGUgPSAncmVmbGVjdCc7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5tb2RlXyA9PT0gTUxQYWRkaW5nTW9kZS5zeW1tZXRyaWMpIHtcbiAgICAgICAgICBtb2RlID0gJ3N5bW1ldHJpYyc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRmLm1pcnJvclBhZChpbnB1dCwgcGFkZGluZ0FycmF5LCBtb2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0iLCJpbXBvcnQgKiBhcyB0ZiBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtFeHBsaWNpdFBhZGRpbmd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9jb252X3V0aWwnO1xuXG5pbXBvcnQge01MQXV0b1BhZCwgTUxJbnB1dE9wZXJhbmRMYXlvdXQsIE1MUG9vbGluZzJkT3B0aW9uc30gZnJvbSAnLi4vZ3JhcGhfYnVpbGRlcic7XG5pbXBvcnQge01MT3BlcmFuZH0gZnJvbSAnLi4vb3BlcmFuZCc7XG5pbXBvcnQge1NpbmdsZU91dHB1dE9wZXJhdGlvbn0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4uL3V0aWxzJztcblxudHlwZSBQb29saW5nVHlwZSA9ICdhdmcnfCdsMid8J21heCc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBQb29sIGV4dGVuZHMgU2luZ2xlT3V0cHV0T3BlcmF0aW9uIHtcbiAgcHJvdGVjdGVkIGlucHV0XzogTUxPcGVyYW5kO1xuICBwcm90ZWN0ZWQgd2luZG93RGltZW5zaW9uc18/OiBbbnVtYmVyLCBudW1iZXJdO1xuICBwcm90ZWN0ZWQgcGFkZGluZ18/OiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgcHJvdGVjdGVkIHN0cmlkZXNfPzogW251bWJlciwgbnVtYmVyXTtcbiAgcHJvdGVjdGVkIGRpbGF0aW9uc18/OiBbbnVtYmVyLCBudW1iZXJdO1xuICBwcm90ZWN0ZWQgZ3JvdXBzXz86IG51bWJlcjtcbiAgcHJvdGVjdGVkIGxheW91dF8/OiBNTElucHV0T3BlcmFuZExheW91dDtcbiAgcHJpdmF0ZSBhdXRvUGFkXz86IE1MQXV0b1BhZDtcblxuICBjb25zdHJ1Y3RvcihpbnB1dDogTUxPcGVyYW5kLCBvcHRpb25zOiBNTFBvb2xpbmcyZE9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKGlucHV0LmJ1aWxkZXIpO1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZChpbnB1dCk7XG4gICAgdGhpcy5pbnB1dF8gPSBpbnB1dDtcbiAgICB0aGlzLmluaXRPcHRpb25zKFxuICAgICAgICBvcHRpb25zLndpbmRvd0RpbWVuc2lvbnMsIG9wdGlvbnMucGFkZGluZywgb3B0aW9ucy5zdHJpZGVzLFxuICAgICAgICBvcHRpb25zLmRpbGF0aW9ucywgb3B0aW9ucy5sYXlvdXQsIG9wdGlvbnMuYXV0b1BhZCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRPcHRpb25zKFxuICAgICAgd2luZG93RGltZW5zaW9uczogW251bWJlciwgbnVtYmVyXSA9IFstMSwgLTFdLFxuICAgICAgcGFkZGluZzogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPSBbMCwgMCwgMCwgMF0sXG4gICAgICBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdID0gWzEsIDFdLCBkaWxhdGlvbnM6IFtudW1iZXIsIG51bWJlcl0gPSBbMSwgMV0sXG4gICAgICBsYXlvdXQ6IE1MSW5wdXRPcGVyYW5kTGF5b3V0ID0gTUxJbnB1dE9wZXJhbmRMYXlvdXQubmNodyxcbiAgICAgIGF1dG9QYWQ6IE1MQXV0b1BhZCA9IE1MQXV0b1BhZC5leHBsaWNpdCkge1xuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgdXRpbHMuaXNJbnRlZ2VyQXJyYXkod2luZG93RGltZW5zaW9ucykgJiYgd2luZG93RGltZW5zaW9ucy5sZW5ndGggPT09IDIsXG4gICAgICAgICdUaGUgcGFkZGluZyBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICB0aGlzLndpbmRvd0RpbWVuc2lvbnNfID0gd2luZG93RGltZW5zaW9ucztcblxuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgdXRpbHMuaXNJbnRlZ2VyQXJyYXkocGFkZGluZykgJiYgcGFkZGluZy5sZW5ndGggPT09IDQsXG4gICAgICAgICdUaGUgcGFkZGluZyBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICB0aGlzLnBhZGRpbmdfID0gcGFkZGluZztcblxuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgdXRpbHMuaXNJbnRlZ2VyQXJyYXkoc3RyaWRlcykgJiYgc3RyaWRlcy5sZW5ndGggPT09IDIsXG4gICAgICAgICdUaGUgc3RyaWRlcyBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICB0aGlzLnN0cmlkZXNfID0gc3RyaWRlcztcblxuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgdXRpbHMuaXNJbnRlZ2VyQXJyYXkoZGlsYXRpb25zKSAmJiBkaWxhdGlvbnMubGVuZ3RoID09PSAyLFxuICAgICAgICAnVGhlIGRpbGF0aW9ucyBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICB0aGlzLmRpbGF0aW9uc18gPSBkaWxhdGlvbnM7XG5cbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIGxheW91dCBpbiBNTElucHV0T3BlcmFuZExheW91dCwgJ1RoZSBsYXlvdXQgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5sYXlvdXRfID0gbGF5b3V0O1xuXG4gICAgdXRpbHMuYXNzZXJ0KGF1dG9QYWQgaW4gTUxBdXRvUGFkLCAnVGhlIGF1dG9QYWQgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5hdXRvUGFkXyA9IGF1dG9QYWQ7XG4gIH1cblxuICBpbnB1dHMoKTogTUxPcGVyYW5kW10ge1xuICAgIHJldHVybiBbdGhpcy5pbnB1dF9dO1xuICB9XG5cbiAgcnVuKGlucHV0VGVuc29yczogTWFwPE1MT3BlcmFuZCwgdGYuVGVuc29yPik6IHRmLlRlbnNvciB7XG4gICAgbGV0IGlucHV0OiB0Zi5UZW5zb3I0RCA9IGlucHV0VGVuc29ycy5nZXQodGhpcy5pbnB1dF8pIGFzIHRmLlRlbnNvcjREO1xuICAgIGNvbnN0IHBvb2xpbmdUeXBlID0gdGhpcy5nZXRQb29saW5nVHlwZSgpO1xuICAgIGlmICh0aGlzLmxheW91dF8gPT09IE1MSW5wdXRPcGVyYW5kTGF5b3V0Lm5jaHcpIHtcbiAgICAgIC8vIG5jaHcgLT4gbmh3Y1xuICAgICAgaW5wdXQgPSB0Zi50cmFuc3Bvc2UoaW5wdXQsIFswLCAyLCAzLCAxXSk7XG4gICAgfVxuICAgIGNvbnN0IHdpbmRvd0RpbWVuc2lvbnMgPSB0aGlzLndpbmRvd0RpbWVuc2lvbnNfO1xuICAgIGlmICh3aW5kb3dEaW1lbnNpb25zWzBdID09PSAtMSAmJiB3aW5kb3dEaW1lbnNpb25zWzFdID09PSAtMSkge1xuICAgICAgd2luZG93RGltZW5zaW9uc1swXSA9IGlucHV0LnNoYXBlWzFdO1xuICAgICAgd2luZG93RGltZW5zaW9uc1sxXSA9IGlucHV0LnNoYXBlWzJdO1xuICAgIH1cbiAgICBsZXQgcGFkZGluZzogJ3ZhbGlkJ3wnc2FtZSd8RXhwbGljaXRQYWRkaW5nO1xuICAgIGlmICh0aGlzLmF1dG9QYWRfID09PSBNTEF1dG9QYWQuZXhwbGljaXQpIHtcbiAgICAgIGlmICh0aGlzLnBhZGRpbmdfLmV2ZXJ5KHYgPT4gdiA9PT0gMCkpIHtcbiAgICAgICAgcGFkZGluZyA9ICd2YWxpZCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYWRkaW5nID0gW1xuICAgICAgICAgIFswLCAwXSwgW3RoaXMucGFkZGluZ19bMF0sIHRoaXMucGFkZGluZ19bMV1dLFxuICAgICAgICAgIFt0aGlzLnBhZGRpbmdfWzJdLCB0aGlzLnBhZGRpbmdfWzNdXSwgWzAsIDBdXG4gICAgICAgIF0gYXMgRXhwbGljaXRQYWRkaW5nO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5hdXRvUGFkXyA9PT0gTUxBdXRvUGFkWydzYW1lLXVwcGVyJ10pIHtcbiAgICAgICAgcGFkZGluZyA9ICdzYW1lJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgZXhwbGljaXQgcGFkZGluZ3MgZm9yICdzYW1lLWxvd2VyJ1xuICAgICAgICBwYWRkaW5nID0gW1swLCAwXSwgWzAsIDBdLCBbMCwgMF0sIFswLCAwXV07XG4gICAgICAgIGNvbnN0IG91dHB1dFNpemVzID0gWzAsIDBdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI7ICsraSkge1xuICAgICAgICAgIG91dHB1dFNpemVzW2ldID0gTWF0aC5jZWlsKGlucHV0LnNoYXBlWzEgKyBpXSAvIHRoaXMuc3RyaWRlc19baV0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRvdGFsUGFkZGluZzogW251bWJlciwgbnVtYmVyXSA9IFswLCAwXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyOyArK2kpIHtcbiAgICAgICAgICB0b3RhbFBhZGRpbmdbaV0gPSB0aGlzLnN0cmlkZXNfW2ldICogKG91dHB1dFNpemVzW2ldIC0gMSkgK1xuICAgICAgICAgICAgICAoKHdpbmRvd0RpbWVuc2lvbnNbaV0gLSAxKSAqIHRoaXMuZGlsYXRpb25zX1tpXSArIDEpIC1cbiAgICAgICAgICAgICAgaW5wdXQuc2hhcGVbMSArIGldO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjsgKytpKSB7XG4gICAgICAgICAgcGFkZGluZ1tpICsgMV1bMF0gPSB0b3RhbFBhZGRpbmdbaV0gLSBNYXRoLmZsb29yKHRvdGFsUGFkZGluZ1tpXSAvIDIpO1xuICAgICAgICAgIHBhZGRpbmdbaSArIDFdWzFdID0gTWF0aC5mbG9vcih0b3RhbFBhZGRpbmdbaV0gLyAyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBvdXRwdXQ7XG4gICAgaWYgKHBvb2xpbmdUeXBlID09PSAnbDInKSB7XG4gICAgICBpbnB1dCA9IHRmLnBvdyhpbnB1dCwgMik7XG4gICAgICBvdXRwdXQgPSB0Zi5zcXJ0KFxuICAgICAgICB0Zi5wb29sKGlucHV0LCB0aGlzLndpbmRvd0RpbWVuc2lvbnNfLCAnYXZnJywgcGFkZGluZywgdGhpcy5kaWxhdGlvbnNfLFxuICAgICAgICB0aGlzLnN0cmlkZXNfKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dCA9IHRmLnBvb2woXG4gICAgICAgIGlucHV0LCB0aGlzLndpbmRvd0RpbWVuc2lvbnNfLCBwb29saW5nVHlwZSwgcGFkZGluZywgdGhpcy5kaWxhdGlvbnNfLFxuICAgICAgICB0aGlzLnN0cmlkZXNfKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5sYXlvdXRfID09PSBNTElucHV0T3BlcmFuZExheW91dC5uY2h3KSB7XG4gICAgICAvLyBuaHdjIC0+IG5jaHdcbiAgICAgIG91dHB1dCA9IHRmLnRyYW5zcG9zZShvdXRwdXQsIFswLCAzLCAxLCAyXSk7XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cblxuICBhYnN0cmFjdCBnZXRQb29saW5nVHlwZSgpOiBQb29saW5nVHlwZTtcbn1cblxuZXhwb3J0IGNsYXNzIEF2ZXJhZ2VQb29sMmQgZXh0ZW5kcyBQb29sIHtcbiAgZ2V0UG9vbGluZ1R5cGUoKTogUG9vbGluZ1R5cGUge1xuICAgIHJldHVybiAnYXZnJztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWF4UG9vbDJkIGV4dGVuZHMgUG9vbCB7XG4gIGdldFBvb2xpbmdUeXBlKCk6IFBvb2xpbmdUeXBlIHtcbiAgICByZXR1cm4gJ21heCc7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEwyUG9vbDJkIGV4dGVuZHMgUG9vbCB7XG4gIGdldFBvb2xpbmdUeXBlKCk6IFBvb2xpbmdUeXBlIHtcbiAgICByZXR1cm4gJ2wyJztcbiAgfVxufSIsImltcG9ydCAqIGFzIHRmIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TUxSZWR1Y2VPcHRpb25zfSBmcm9tICcuLi9ncmFwaF9idWlsZGVyJztcbmltcG9ydCB7TUxPcGVyYW5kfSBmcm9tICcuLi9vcGVyYW5kJztcbmltcG9ydCB7U2luZ2xlT3V0cHV0T3BlcmF0aW9ufSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi4vdXRpbHMnO1xuXG5hYnN0cmFjdCBjbGFzcyBSZWR1Y2UgZXh0ZW5kcyBTaW5nbGVPdXRwdXRPcGVyYXRpb24ge1xuICBwcml2YXRlIGlucHV0XzogTUxPcGVyYW5kO1xuICBwcml2YXRlIGF4ZXNfPzogbnVtYmVyW107XG4gIHByaXZhdGUga2VlcERpbWVuc2lvbnNfPzogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihpbnB1dDogTUxPcGVyYW5kLCBvcHRpb25zOiBNTFJlZHVjZU9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKGlucHV0LmJ1aWxkZXIpO1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZChpbnB1dCk7XG4gICAgdGhpcy5pbnB1dF8gPSBpbnB1dDtcbiAgICBpZiAob3B0aW9ucy5heGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgICB1dGlscy5pc0ludGVnZXJBcnJheShvcHRpb25zLmF4ZXMpLCAnVGhlIGF4ZXMgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgICB0aGlzLmF4ZXNfID0gb3B0aW9ucy5heGVzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmF4ZXNfID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5rZWVwRGltZW5zaW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgICAgdXRpbHMuaXNCb29sZWFuKG9wdGlvbnMua2VlcERpbWVuc2lvbnMpLFxuICAgICAgICAgICdUaGUga2VlcERpbWVuc2lvbnMgcGFyYW1ldGVyIGlzIG5vdCBhIGJvb2xlYW4uJyk7XG4gICAgICB0aGlzLmtlZXBEaW1lbnNpb25zXyA9IG9wdGlvbnMua2VlcERpbWVuc2lvbnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMua2VlcERpbWVuc2lvbnNfID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgaW5wdXRzKCk6IE1MT3BlcmFuZFtdIHtcbiAgICByZXR1cm4gW3RoaXMuaW5wdXRfXTtcbiAgfVxuXG4gIHJ1bihpbnB1dFRlbnNvcnM6IE1hcDxNTE9wZXJhbmQsIHRmLlRlbnNvcj4pOiB0Zi5UZW5zb3Ige1xuICAgIGNvbnN0IGlucHV0OiB0Zi5UZW5zb3IgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuaW5wdXRfKTtcbiAgICAvLyBhY2NlcHRzIGF4aXMgcmFuZ2UgWy1yLCByKVxuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgdXRpbHMudmFsaWRhdGVBeGVzKHRoaXMuYXhlc18sIGlucHV0LnJhbmspLFxuICAgICAgICBgVGhlIGF4ZXMgbXVzdCBiZSBpbiByYW5nZSBbLSR7aW5wdXQucmFua30sICR7aW5wdXQucmFua30pYCk7XG4gICAgcmV0dXJuIHRoaXMucnVuT3AoaW5wdXQsIHRoaXMuYXhlc18sIHRoaXMua2VlcERpbWVuc2lvbnNfKTtcbiAgfVxuXG4gIGFic3RyYWN0IHJ1bk9wKGlucHV0OiB0Zi5UZW5zb3IsIGF4ZXM6IG51bWJlcltdLCBrZWVwRGltZW5zaW9uczogYm9vbGVhbik6XG4gICAgICB0Zi5UZW5zb3I7XG59XG5cbmV4cG9ydCBjbGFzcyBSZWR1Y2VMb2dTdW1FeHAgZXh0ZW5kcyBSZWR1Y2Uge1xuICBydW5PcChpbnB1dDogdGYuVGVuc29yLCBheGVzOiBudW1iZXJbXSwga2VlcERpbWVuc2lvbnM6IGJvb2xlYW4pOiB0Zi5UZW5zb3Ige1xuICAgIHJldHVybiB0Zi5sb2dTdW1FeHAoaW5wdXQsIGF4ZXMsIGtlZXBEaW1lbnNpb25zKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVkdWNlTWF4IGV4dGVuZHMgUmVkdWNlIHtcbiAgcnVuT3AoaW5wdXQ6IHRmLlRlbnNvciwgYXhlczogbnVtYmVyW10sIGtlZXBEaW1lbnNpb25zOiBib29sZWFuKTogdGYuVGVuc29yIHtcbiAgICByZXR1cm4gdGYubWF4KGlucHV0LCBheGVzLCBrZWVwRGltZW5zaW9ucyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlZHVjZU1lYW4gZXh0ZW5kcyBSZWR1Y2Uge1xuICBydW5PcChpbnB1dDogdGYuVGVuc29yLCBheGVzOiBudW1iZXJbXSwga2VlcERpbWVuc2lvbnM6IGJvb2xlYW4pOiB0Zi5UZW5zb3Ige1xuICAgIHJldHVybiB0Zi5tZWFuKGlucHV0LCBheGVzLCBrZWVwRGltZW5zaW9ucyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlZHVjZU1pbiBleHRlbmRzIFJlZHVjZSB7XG4gIHJ1bk9wKGlucHV0OiB0Zi5UZW5zb3IsIGF4ZXM6IG51bWJlcltdLCBrZWVwRGltZW5zaW9uczogYm9vbGVhbik6IHRmLlRlbnNvciB7XG4gICAgcmV0dXJuIHRmLm1pbihpbnB1dCwgYXhlcywga2VlcERpbWVuc2lvbnMpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWR1Y2VQcm9kdWN0IGV4dGVuZHMgUmVkdWNlIHtcbiAgcnVuT3AoaW5wdXQ6IHRmLlRlbnNvciwgYXhlczogbnVtYmVyW10sIGtlZXBEaW1lbnNpb25zOiBib29sZWFuKTogdGYuVGVuc29yIHtcbiAgICByZXR1cm4gdGYucHJvZChpbnB1dCwgYXhlcywga2VlcERpbWVuc2lvbnMpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWR1Y2VTdW0gZXh0ZW5kcyBSZWR1Y2Uge1xuICBydW5PcChpbnB1dDogdGYuVGVuc29yLCBheGVzOiBudW1iZXJbXSwga2VlcERpbWVuc2lvbnM6IGJvb2xlYW4pOiB0Zi5UZW5zb3Ige1xuICAgIHJldHVybiB0Zi5zdW0oaW5wdXQsIGF4ZXMsIGtlZXBEaW1lbnNpb25zKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVkdWNlTDEgZXh0ZW5kcyBSZWR1Y2Uge1xuICBydW5PcChpbnB1dDogdGYuVGVuc29yLCBheGVzOiBudW1iZXJbXSwga2VlcERpbWVuc2lvbnM6IGJvb2xlYW4pOiB0Zi5UZW5zb3Ige1xuICAgIHJldHVybiB0Zi5zdW0odGYuYWJzKGlucHV0KSwgYXhlcywga2VlcERpbWVuc2lvbnMpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWR1Y2VMMiBleHRlbmRzIFJlZHVjZSB7XG4gIHJ1bk9wKGlucHV0OiB0Zi5UZW5zb3IsIGF4ZXM6IG51bWJlcltdLCBrZWVwRGltZW5zaW9uczogYm9vbGVhbik6IHRmLlRlbnNvciB7XG4gICAgcmV0dXJuIHRmLnNxcnQodGYuc3VtKHRmLnBvdyhpbnB1dCwgMiksIGF4ZXMsIGtlZXBEaW1lbnNpb25zKSk7XG4gIH1cbn0iLCJpbXBvcnQgKiBhcyB0ZiBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01MSW50ZXJwb2xhdGlvbk1vZGUsIE1MUmVzYW1wbGVPcHRpb25zfSBmcm9tICcuLi9ncmFwaF9idWlsZGVyJztcbmltcG9ydCB7TUxPcGVyYW5kfSBmcm9tICcuLi9vcGVyYW5kJztcbmltcG9ydCB7U2luZ2xlT3V0cHV0T3BlcmF0aW9ufSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgUmVzYW1wbGUgZXh0ZW5kcyBTaW5nbGVPdXRwdXRPcGVyYXRpb24ge1xuICBwcml2YXRlIGlucHV0XzogTUxPcGVyYW5kO1xuICBwcml2YXRlIG1vZGVfOiBNTEludGVycG9sYXRpb25Nb2RlID0gTUxJbnRlcnBvbGF0aW9uTW9kZVsnbmVhcmVzdC1uZWlnaGJvciddO1xuICBwcml2YXRlIHNjYWxlc186IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICBwcml2YXRlIHNpemVzXzogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG5cbiAgY29uc3RydWN0b3IoaW5wdXQ6IE1MT3BlcmFuZCwgb3B0aW9uczogTUxSZXNhbXBsZU9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKGlucHV0LmJ1aWxkZXIpO1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZChpbnB1dCk7XG4gICAgdGhpcy5pbnB1dF8gPSBpbnB1dDtcbiAgICBpZiAob3B0aW9ucy5zY2FsZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgYXJyYXkgPSBvcHRpb25zLnNjYWxlcztcbiAgICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgICBhcnJheSBpbnN0YW5jZW9mIEFycmF5ICYmIGFycmF5LmV2ZXJ5KHYgPT4gdHlwZW9mIHYgPT09ICdudW1iZXInKSAmJlxuICAgICAgICAgICAgICBhcnJheS5sZW5ndGggPT09IDQsXG4gICAgICAgICAgJ1RoZSBzY2FsZXMgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgICB0aGlzLnNjYWxlc18gPSBvcHRpb25zLnNjYWxlcztcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuc2l6ZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgIHV0aWxzLmlzSW50ZWdlckFycmF5KG9wdGlvbnMuc2l6ZXMpICYmIG9wdGlvbnMuc2l6ZXMubGVuZ3RoID09PSA0LFxuICAgICAgICAgICdUaGUgc2l6ZXMgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgICB0aGlzLnNpemVzXyA9IG9wdGlvbnMuc2l6ZXM7XG4gICAgICB0aGlzLnNjYWxlc18gPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgdGhpcy5zY2FsZXNfICE9PSB1bmRlZmluZWQgfHwgdGhpcy5zaXplc18gIT09IHVuZGVmaW5lZCxcbiAgICAgICAgJ1RoZSBzY2FsZXMgb3Igc2l6ZXMgcGFyYW1ldGVyIGlzIG5vdCBwcm92aWVkLicpO1xuICAgIGlmIChvcHRpb25zLm1vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgIG9wdGlvbnMubW9kZSBpbiBNTEludGVycG9sYXRpb25Nb2RlLFxuICAgICAgICAgICdUaGUgbW9kZSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICAgIHRoaXMubW9kZV8gPSBvcHRpb25zLm1vZGU7XG4gICAgfVxuICB9XG5cbiAgaW5wdXRzKCk6IE1MT3BlcmFuZFtdIHtcbiAgICByZXR1cm4gW3RoaXMuaW5wdXRfXTtcbiAgfVxuXG4gIHJ1bihpbnB1dFRlbnNvcnM6IE1hcDxNTE9wZXJhbmQsIHRmLlRlbnNvcj4pOiB0Zi5UZW5zb3Ige1xuICAgIGxldCBpbnB1dDogdGYuVGVuc29yNEQgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuaW5wdXRfKSBhcyB0Zi5UZW5zb3I0RDtcbiAgICB1dGlscy5hc3NlcnQoaW5wdXQucmFuayA9PT0gNCwgJ1RoZSBpbnB1dCB0ZW5zb3IgaXMgbm90IDQtRC4nKTtcbiAgICBjb25zdCBzaXplczogW251bWJlciwgbnVtYmVyXSA9IFswLCAwXTtcbiAgICBsZXQgdHJhbnNwb3NlZCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLnNpemVzXyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodGhpcy5zaXplc19bMF0gPT09IGlucHV0LnNoYXBlWzBdICYmXG4gICAgICAgICAgdGhpcy5zaXplc19bMV0gPT09IGlucHV0LnNoYXBlWzFdKSB7XG4gICAgICAgIHNpemVzWzBdID0gdGhpcy5zaXplc19bMl07XG4gICAgICAgIHNpemVzWzFdID0gdGhpcy5zaXplc19bM107XG4gICAgICAgIC8vIGFzc3VtZSBuY2h3IC0+IG5od2NcbiAgICAgICAgaW5wdXQgPSB0Zi50cmFuc3Bvc2UoaW5wdXQsIFswLCAyLCAzLCAxXSk7XG4gICAgICAgIHRyYW5zcG9zZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICB0aGlzLnNpemVzX1swXSA9PT0gaW5wdXQuc2hhcGVbMF0gJiZcbiAgICAgICAgICB0aGlzLnNpemVzX1szXSA9PT0gaW5wdXQuc2hhcGVbM10pIHtcbiAgICAgICAgLy8gYXNzdW1lIG5od2NcbiAgICAgICAgc2l6ZXNbMF0gPSB0aGlzLnNpemVzX1sxXTtcbiAgICAgICAgc2l6ZXNbMV0gPSB0aGlzLnNpemVzX1syXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICd0Zi5pbWFnZS5yZXNpemUgZG9lc25cXCd0IHN1cHBvcnQgdGhlIHNpemVzIHBhcmFtZXRlci4nKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuc2NhbGVzXyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodGhpcy5zY2FsZXNfWzBdID09PSAxLjAgJiYgdGhpcy5zY2FsZXNfWzFdID09PSAxLjApIHtcbiAgICAgICAgc2l6ZXNbMF0gPSBNYXRoLmZsb29yKGlucHV0LnNoYXBlWzJdICogdGhpcy5zY2FsZXNfWzJdKTtcbiAgICAgICAgc2l6ZXNbMV0gPSBNYXRoLmZsb29yKGlucHV0LnNoYXBlWzNdICogdGhpcy5zY2FsZXNfWzNdKTtcbiAgICAgICAgLy8gYXNzdW1lIG5jaHcgLT4gbmh3Y1xuICAgICAgICBpbnB1dCA9IHRmLnRyYW5zcG9zZShpbnB1dCwgWzAsIDIsIDMsIDFdKTtcbiAgICAgICAgdHJhbnNwb3NlZCA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc2NhbGVzX1swXSA9PT0gMS4wICYmIHRoaXMuc2NhbGVzX1szXSA9PT0gMS4wKSB7XG4gICAgICAgIC8vIGFzc3VtZSBuaHdjXG4gICAgICAgIHNpemVzWzBdID0gTWF0aC5mbG9vcihpbnB1dC5zaGFwZVsxXSAqIHRoaXMuc2NhbGVzX1sxXSk7XG4gICAgICAgIHNpemVzWzFdID0gTWF0aC5mbG9vcihpbnB1dC5zaGFwZVsyXSAqIHRoaXMuc2NhbGVzX1syXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAndGYuaW1hZ2UucmVzaXplIGRvZXNuXFwndCBzdXBwb3J0IHRoZSBzY2FsZXMgcGFyYW1ldGVyLicpO1xuICAgICAgfVxuICAgIH1cbiAgICBsZXQgb3V0cHV0OiB0Zi5UZW5zb3I7XG4gICAgaWYgKHRoaXMubW9kZV8gPT09IE1MSW50ZXJwb2xhdGlvbk1vZGVbJ25lYXJlc3QtbmVpZ2hib3InXSkge1xuICAgICAgb3V0cHV0ID0gdGYuaW1hZ2UucmVzaXplTmVhcmVzdE5laWdoYm9yKGlucHV0LCBzaXplcywgZmFsc2UsIHRydWUpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5tb2RlXyA9PT0gTUxJbnRlcnBvbGF0aW9uTW9kZS5saW5lYXIpIHtcbiAgICAgIG91dHB1dCA9IHRmLmltYWdlLnJlc2l6ZUJpbGluZWFyKGlucHV0LCBzaXplcywgZmFsc2UsIHRydWUpO1xuICAgIH1cbiAgICBpZiAodHJhbnNwb3NlZCkge1xuICAgICAgLy8gbmh3YyAtPiBuY2h3XG4gICAgICBvdXRwdXQgPSB0Zi50cmFuc3Bvc2Uob3V0cHV0LCBbMCwgMywgMSwgMl0pO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xuICB9XG59IiwiaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNTE9wZXJhbmR9IGZyb20gJy4uL29wZXJhbmQnO1xuaW1wb3J0IHtTaW5nbGVPdXRwdXRPcGVyYXRpb259IGZyb20gJy4uL29wZXJhdGlvbic7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuLi91dGlscyc7XG5cbmV4cG9ydCBjbGFzcyBSZXNoYXBlIGV4dGVuZHMgU2luZ2xlT3V0cHV0T3BlcmF0aW9uIHtcbiAgcHJpdmF0ZSBpbnB1dF86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSBuZXdTaGFwZV86IG51bWJlcltdO1xuXG4gIGNvbnN0cnVjdG9yKGlucHV0OiBNTE9wZXJhbmQsIG5ld1NoYXBlOiBudW1iZXJbXSkge1xuICAgIHN1cGVyKGlucHV0LmJ1aWxkZXIpO1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZChpbnB1dCk7XG4gICAgdGhpcy5pbnB1dF8gPSBpbnB1dDtcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIHV0aWxzLmlzSW50ZWdlckFycmF5KG5ld1NoYXBlKSAmJiBuZXdTaGFwZS5sZW5ndGggIT09IDAsXG4gICAgICAgICdUaGUgbmV3U2hhcGUgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5uZXdTaGFwZV8gPSBuZXdTaGFwZTtcbiAgfVxuXG4gIGlucHV0cygpOiBNTE9wZXJhbmRbXSB7XG4gICAgcmV0dXJuIFt0aGlzLmlucHV0X107XG4gIH1cblxuICBydW4oaW5wdXRUZW5zb3JzOiBNYXA8TUxPcGVyYW5kLCB0Zi5UZW5zb3I+KTogdGYuVGVuc29yIHtcbiAgICBjb25zdCBpbnB1dDogdGYuVGVuc29yID0gaW5wdXRUZW5zb3JzLmdldCh0aGlzLmlucHV0Xyk7XG4gICAgcmV0dXJuIHRmLnJlc2hhcGUoaW5wdXQsIHRoaXMubmV3U2hhcGVfKTtcbiAgfVxufSIsImltcG9ydCAqIGFzIHRmIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TUxPcGVyYW5kfSBmcm9tICcuLi9vcGVyYW5kJztcbmltcG9ydCB7U2luZ2xlT3V0cHV0T3BlcmF0aW9ufSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgU2xpY2UgZXh0ZW5kcyBTaW5nbGVPdXRwdXRPcGVyYXRpb24ge1xuICBwcml2YXRlIGlucHV0XzogTUxPcGVyYW5kO1xuICBwcml2YXRlIHN0YXJ0c186IG51bWJlcltdO1xuICBwcml2YXRlIHNpemVzXzogbnVtYmVyW107XG4gIHByaXZhdGUgYXhlc18/OiBudW1iZXJbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIGlucHV0OiBNTE9wZXJhbmQsIHN0YXJ0czogbnVtYmVyW10sIHNpemVzOiBudW1iZXJbXSwgYXhlcz86IG51bWJlcltdKSB7XG4gICAgc3VwZXIoaW5wdXQuYnVpbGRlcik7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKGlucHV0KTtcbiAgICB0aGlzLmlucHV0XyA9IGlucHV0O1xuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgdXRpbHMuaXNJbnRlZ2VyQXJyYXkoc3RhcnRzKSwgJ1RoZSBzdGFydHMgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5zdGFydHNfID0gc3RhcnRzO1xuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgdXRpbHMuaXNJbnRlZ2VyQXJyYXkoc2l6ZXMpICYmIHNpemVzLmV2ZXJ5KHYgPT4gdiA+IDAgfHwgdiA9PT0gLTEpLFxuICAgICAgICAnVGhlIHNpemVzIHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgIHRoaXMuc2l6ZXNfID0gc2l6ZXM7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICBzaXplcy5sZW5ndGggPT09IHNpemVzLmxlbmd0aCxcbiAgICAgICAgJ1RoZSBsZW5ndGggb2Ygc2l6ZXMgaXMgbm90IGVxdWFsIHRvIHRoZSBsZW5ndGggb2Ygc2l6ZXMuKSknKTtcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIGF4ZXMgPT09IHVuZGVmaW5lZCB8fCB1dGlscy5pc0ludGVnZXJBcnJheShheGVzKSxcbiAgICAgICAgJ1RoZSBheGVzIHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgIGlmIChheGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgICBzaXplcy5sZW5ndGggPT09IGF4ZXMubGVuZ3RoLCAnVGhlIGxlbmd0aCBvZiBheGVzIGlzIGludmFsaWQuKSknKTtcbiAgICB9XG4gICAgdGhpcy5heGVzXyA9IGF4ZXM7XG4gIH1cblxuICBpbnB1dHMoKTogTUxPcGVyYW5kW10ge1xuICAgIHJldHVybiBbdGhpcy5pbnB1dF9dO1xuICB9XG5cbiAgcnVuKGlucHV0VGVuc29yczogTWFwPE1MT3BlcmFuZCwgdGYuVGVuc29yPik6IHRmLlRlbnNvciB7XG4gICAgY29uc3QgaW5wdXQ6IHRmLlRlbnNvcjREID0gaW5wdXRUZW5zb3JzLmdldCh0aGlzLmlucHV0XykgYXMgdGYuVGVuc29yNEQ7XG4gICAgY29uc3QgcmFuayA9IGlucHV0LnNoYXBlLmxlbmd0aDtcbiAgICBpZiAodGhpcy5heGVzXyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBhc3N1bWUgYXhlcyBpcyBbMCwgMSwuLi5yLTFdIGlmIGl0IGlzIG5vdCBkZWZpbmVkLlxuICAgICAgdGhpcy5heGVzXyA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5rOyArK2kpIHtcbiAgICAgICAgdGhpcy5heGVzXy5wdXNoKGkpO1xuICAgICAgfVxuICAgIH1cbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIHRoaXMuYXhlc18uZXZlcnkoYXhpcyA9PiBheGlzIDwgcmFuayAmJiBheGlzID49IC1yYW5rKSxcbiAgICAgICAgJ1RoZSB2YWx1ZSBvZiBheGVzIGlzIGludmFsaWQuJyk7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICB0aGlzLnN0YXJ0c18ubGVuZ3RoID09PSB0aGlzLmF4ZXNfLmxlbmd0aCxcbiAgICAgICAgJ1RoZSBsZW5ndGggb2Ygc3RhcnRzIGlzIGludmFsaWQuJyk7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICB0aGlzLnNpemVzXy5sZW5ndGggPT09IHRoaXMuYXhlc18ubGVuZ3RoLFxuICAgICAgICAnVGhlIGxlbmd0aCBvZiBzaXplcyBpcyBpbnZhbGlkLicpO1xuXG4gICAgY29uc3QgYmVnaW46IG51bWJlcltdID0gbmV3IEFycmF5KHRoaXMuYXhlc18ubGVuZ3RoKS5maWxsKDApO1xuICAgIGNvbnN0IHNpemU6IG51bWJlcltdID0gbmV3IEFycmF5KHRoaXMuYXhlc18ubGVuZ3RoKS5maWxsKC0xKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYXhlc18ubGVuZ3RoOyArK2kpIHtcbiAgICAgIGxldCBheGlzID0gdGhpcy5heGVzX1tpXTtcbiAgICAgIGlmIChheGlzIDwgMCkge1xuICAgICAgICBheGlzID0gcmFuayArIGF4aXM7XG4gICAgICB9XG4gICAgICBiZWdpbltheGlzXSA9IHRoaXMuc3RhcnRzX1tpXTtcbiAgICAgIHNpemVbYXhpc10gPSB0aGlzLnNpemVzX1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIHRmLnNsaWNlKGlucHV0LCBiZWdpbiwgc2l6ZSk7XG4gIH1cbn0iLCJpbXBvcnQgKiBhcyB0ZiBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01MT3BlcmFuZH0gZnJvbSAnLi4vb3BlcmFuZCc7XG5pbXBvcnQge1NpbmdsZU91dHB1dE9wZXJhdGlvbn0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIFNvZnRtYXggZXh0ZW5kcyBTaW5nbGVPdXRwdXRPcGVyYXRpb24ge1xuICBwcml2YXRlIHhfOiBNTE9wZXJhbmQ7XG5cbiAgY29uc3RydWN0b3IoeDogTUxPcGVyYW5kKSB7XG4gICAgc3VwZXIoeC5idWlsZGVyKTtcbiAgICB1dGlscy52YWxpZGF0ZU9wZXJhbmQoeCk7XG4gICAgdGhpcy54XyA9IHg7XG4gIH1cblxuICBpbnB1dHMoKTogTUxPcGVyYW5kW10ge1xuICAgIHJldHVybiBbdGhpcy54X107XG4gIH1cblxuICBydW4oaW5wdXRUZW5zb3JzOiBNYXA8TUxPcGVyYW5kLCB0Zi5UZW5zb3I+KTogdGYuVGVuc29yIHtcbiAgICBjb25zdCB4OiB0Zi5UZW5zb3IgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMueF8pO1xuICAgIGlmICh4LnJhbmsgIT09IDIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHJhbmsgb2YgeCBwYXJhbWV0ZXIgc2hvdWxkIGJlIDIuJyk7XG4gICAgfVxuICAgIHJldHVybiB0Zi5zb2Z0bWF4KHgpO1xuICB9XG59IiwiaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNTFNwbGl0T3B0aW9uc30gZnJvbSAnLi4vZ3JhcGhfYnVpbGRlcic7XG5pbXBvcnQge01MT3BlcmFuZCwgT3V0cHV0T3BlcmFuZH0gZnJvbSAnLi4vb3BlcmFuZCc7XG5pbXBvcnQge09wZXJhdGlvbn0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIFNwbGl0IGV4dGVuZHMgT3BlcmF0aW9uIHtcbiAgcHJpdmF0ZSBpbnB1dF86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSBzcGxpdHNfOiBudW1iZXJ8bnVtYmVyW107XG4gIHByaXZhdGUgYXhpc18/OiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBpbnB1dDogTUxPcGVyYW5kLCBzcGxpdHM6IG51bWJlcnxudW1iZXJbXSwgb3B0aW9uczogTUxTcGxpdE9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKGlucHV0LmJ1aWxkZXIpO1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZChpbnB1dCk7XG4gICAgdGhpcy5pbnB1dF8gPSBpbnB1dDtcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIHV0aWxzLmlzSW50ZWdlcihzcGxpdHMpIHx8IHV0aWxzLmlzSW50ZWdlckFycmF5KHNwbGl0cyBhcyBudW1iZXJbXSksXG4gICAgICAgICdUaGUgc3BsaXRzIHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgIHRoaXMuc3BsaXRzXyA9IHNwbGl0cztcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIG9wdGlvbnMuYXhpcyA9PT0gdW5kZWZpbmVkIHx8IHV0aWxzLmlzSW50ZWdlcihvcHRpb25zLmF4aXMpLFxuICAgICAgICAnVGhlIG9wdGlvbnMuYXhpcyBpcyBpbnZhbGlkLicpO1xuICAgIHRoaXMuYXhpc18gPSBvcHRpb25zLmF4aXM7XG5cbiAgICAvLyBQcmVwYXJlIG91dHB1dHMuXG4gICAgY29uc3QgbnVtT3V0cHV0cyA9XG4gICAgICAgIHV0aWxzLmlzSW50ZWdlcihzcGxpdHMpID8gc3BsaXRzIDogKHNwbGl0cyBhcyBudW1iZXJbXSkubGVuZ3RoO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtT3V0cHV0czsgKytpKSB7XG4gICAgICB0aGlzLm91dHB1dHMucHVzaChuZXcgT3V0cHV0T3BlcmFuZCh0aGlzKSk7XG4gICAgfVxuICB9XG5cbiAgaW5wdXRzKCk6IE1MT3BlcmFuZFtdIHtcbiAgICByZXR1cm4gW3RoaXMuaW5wdXRfXTtcbiAgfVxuXG4gIGNvbXB1dGVJbXBsKGlucHV0VGVuc29yczogTWFwPE1MT3BlcmFuZCwgdGYuVGVuc29yPik6IHRmLlRlbnNvcltdIHtcbiAgICBjb25zdCBpbnB1dDogdGYuVGVuc29yID0gaW5wdXRUZW5zb3JzLmdldCh0aGlzLmlucHV0Xyk7XG4gICAgcmV0dXJuIHRmLnNwbGl0KGlucHV0LCB0aGlzLnNwbGl0c18sIHRoaXMuYXhpc18pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyB0ZiBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01MT3BlcmFuZH0gZnJvbSAnLi4vb3BlcmFuZCc7XG5pbXBvcnQge1NpbmdsZU91dHB1dE9wZXJhdGlvbn0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIFNxdWVlemUgZXh0ZW5kcyBTaW5nbGVPdXRwdXRPcGVyYXRpb24ge1xuICBwcml2YXRlIGlucHV0XzogTUxPcGVyYW5kO1xuICBwcml2YXRlIGF4ZXNfPzogbnVtYmVyW107XG5cbiAgY29uc3RydWN0b3IoaW5wdXQ6IE1MT3BlcmFuZCwgYXhlcz86IG51bWJlcltdKSB7XG4gICAgc3VwZXIoaW5wdXQuYnVpbGRlcik7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKGlucHV0KTtcbiAgICB0aGlzLmlucHV0XyA9IGlucHV0O1xuICAgIGlmIChheGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgICB1dGlscy5pc0ludGVnZXJBcnJheShheGVzKSAmJiBheGVzLmxlbmd0aCAhPT0gMCxcbiAgICAgICAgICAnVGhlIGF4ZXMgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgfVxuICAgIHRoaXMuYXhlc18gPSBheGVzO1xuICB9XG5cbiAgaW5wdXRzKCk6IE1MT3BlcmFuZFtdIHtcbiAgICByZXR1cm4gW3RoaXMuaW5wdXRfXTtcbiAgfVxuXG4gIHJ1bihpbnB1dFRlbnNvcnM6IE1hcDxNTE9wZXJhbmQsIHRmLlRlbnNvcj4pOiB0Zi5UZW5zb3Ige1xuICAgIGNvbnN0IGlucHV0OiB0Zi5UZW5zb3IgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuaW5wdXRfKTtcbiAgICByZXR1cm4gdGYuc3F1ZWV6ZShpbnB1dCwgdGhpcy5heGVzXyk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIHRmIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TUxPcGVyYW5kfSBmcm9tICcuLi9vcGVyYW5kJztcbmltcG9ydCB7U2luZ2xlT3V0cHV0T3BlcmF0aW9ufSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNwb3NlIGV4dGVuZHMgU2luZ2xlT3V0cHV0T3BlcmF0aW9uIHtcbiAgcHJpdmF0ZSBpbnB1dF86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSBwZXJtdXRhdGlvbl8/OiBudW1iZXJbXTtcblxuICBjb25zdHJ1Y3RvcihpbnB1dDogTUxPcGVyYW5kLCBwZXJtdXRhdGlvbj86IG51bWJlcltdKSB7XG4gICAgc3VwZXIoaW5wdXQuYnVpbGRlcik7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKGlucHV0KTtcbiAgICB0aGlzLmlucHV0XyA9IGlucHV0O1xuICAgIGlmIChwZXJtdXRhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgICAgdXRpbHMuaXNJbnRlZ2VyQXJyYXkocGVybXV0YXRpb24pICYmIHBlcm11dGF0aW9uLmxlbmd0aCAhPT0gMCxcbiAgICAgICAgICAnVGhlIHBlcm11dGF0aW9uIHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgIH1cbiAgICB0aGlzLnBlcm11dGF0aW9uXyA9IHBlcm11dGF0aW9uO1xuICB9XG5cbiAgaW5wdXRzKCk6IE1MT3BlcmFuZFtdIHtcbiAgICByZXR1cm4gW3RoaXMuaW5wdXRfXTtcbiAgfVxuXG4gIHJ1bihpbnB1dFRlbnNvcnM6IE1hcDxNTE9wZXJhbmQsIHRmLlRlbnNvcj4pOiB0Zi5UZW5zb3Ige1xuICAgIGNvbnN0IGlucHV0OiB0Zi5UZW5zb3IgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuaW5wdXRfKTtcbiAgICByZXR1cm4gdGYudHJhbnNwb3NlKGlucHV0LCB0aGlzLnBlcm11dGF0aW9uXyk7XG4gIH1cbn0iLCJpbXBvcnQgKiBhcyB0ZiBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01MT3BlcmFuZCwgT3V0cHV0T3BlcmFuZH0gZnJvbSAnLi4vb3BlcmFuZCc7XG5pbXBvcnQge01MT3BlcmF0b3IsIFNpbmdsZU91dHB1dE9wZXJhdGlvbn0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFVuYXJ5IGV4dGVuZHMgU2luZ2xlT3V0cHV0T3BlcmF0aW9uIHtcbiAgcHJvdGVjdGVkIHhfOiBNTE9wZXJhbmQ7XG5cbiAgY29uc3RydWN0b3IoeDogTUxPcGVyYW5kKSB7XG4gICAgaWYgKHggIT09IHVuZGVmaW5lZCkge1xuICAgICAgc3VwZXIoeC5idWlsZGVyKTtcbiAgICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZCh4KTtcbiAgICAgIHRoaXMueF8gPSB4O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdXBlcih1bmRlZmluZWQpO1xuICAgICAgdGhpcy54XyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBpbnB1dHMoKTogTUxPcGVyYW5kW10ge1xuICAgIHJldHVybiBbdGhpcy54X107XG4gIH1cblxuICBydW4oaW5wdXRUZW5zb3JzOiBNYXA8TUxPcGVyYW5kLCB0Zi5UZW5zb3I+KTogdGYuVGVuc29yIHtcbiAgICBjb25zdCB4OiB0Zi5UZW5zb3IgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMueF8pO1xuICAgIHJldHVybiB0aGlzLnJ1bk9wKHgpO1xuICB9XG5cbiAgYWJzdHJhY3QgcnVuT3AoeDogdGYuVGVuc29yKTogdGYuVGVuc29yO1xufVxuXG5leHBvcnQgY2xhc3MgRXhwIGV4dGVuZHMgVW5hcnkge1xuICBydW5PcCh4OiB0Zi5UZW5zb3IpOiB0Zi5UZW5zb3Ige1xuICAgIHJldHVybiB0Zi5leHAoeCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNxcnQgZXh0ZW5kcyBVbmFyeSB7XG4gIHJ1bk9wKHg6IHRmLlRlbnNvcik6IHRmLlRlbnNvciB7XG4gICAgcmV0dXJuIHRmLnNxcnQoeCk7XG4gIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFVuYXJ5TUxPcGVyYXRvciBleHRlbmRzIFVuYXJ5IGltcGxlbWVudHMgTUxPcGVyYXRvciB7XG4gIGFwcGx5KHg6IE1MT3BlcmFuZCk6IE91dHB1dE9wZXJhbmQge1xuICAgIHRoaXMuYnVpbGRlcl8gPSB4LmJ1aWxkZXI7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKHgpO1xuICAgIHRoaXMueF8gPSB4O1xuICAgIHRoaXMuY3JlYXRlT3V0cHV0KCk7XG4gICAgcmV0dXJuIHRoaXMub3V0cHV0O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTaWdtb2lkIGV4dGVuZHMgVW5hcnlNTE9wZXJhdG9yIHtcbiAgcnVuT3AoeDogdGYuVGVuc29yKTogdGYuVGVuc29yIHtcbiAgICByZXR1cm4gdGYuc2lnbW9pZCh4KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGFuaCBleHRlbmRzIFVuYXJ5TUxPcGVyYXRvciB7XG4gIHJ1bk9wKHg6IHRmLlRlbnNvcik6IHRmLlRlbnNvciB7XG4gICAgcmV0dXJuIHRmLnRhbmgoeCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlbHUgZXh0ZW5kcyBVbmFyeU1MT3BlcmF0b3Ige1xuICBydW5PcCh4OiB0Zi5UZW5zb3IpOiB0Zi5UZW5zb3Ige1xuICAgIHJldHVybiB0Zi5yZWx1KHgpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBIYXJkU3dpc2ggZXh0ZW5kcyBVbmFyeU1MT3BlcmF0b3Ige1xuICBydW5PcCh4OiB0Zi5UZW5zb3IpOiB0Zi5UZW5zb3Ige1xuICAgIHJldHVybiB0Zi5kaXYoXG4gICAgICB0Zi5tdWwoXG4gICAgICAgICAgeCxcbiAgICAgICAgICB0Zi5tYXhpbXVtKFxuICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICB0Zi5taW5pbXVtKFxuICAgICAgICAgICAgICAgICAgNixcbiAgICAgICAgICAgICAgICAgIHRmLmFkZCh4LCAzKSkpKSxcbiAgICAgIDYpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyB0ZiBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtFeHBsaWNpdFBhZGRpbmd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9jb252X3V0aWwnO1xuXG5pbXBvcnQge01MQXV0b1BhZCwgTUxCdWZmZXJWaWV3fSBmcm9tICcuL2dyYXBoX2J1aWxkZXInO1xuaW1wb3J0IHtNTE9wZXJhbmQsIE1MT3BlcmFuZERlc2NyaXB0b3IsIE1MT3BlcmFuZFR5cGV9IGZyb20gJy4vb3BlcmFuZCc7XG5pbXBvcnQge0FycmF5QnVmZmVyVmlldyBhcyBUeXBlZEFycmF5fSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydChleHByOiBib29sZWFuLCBtc2c6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoIWV4cHIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNCb29sZWFuKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSW50ZWdlcih2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSW50ZWdlckFycmF5KGFycmF5OiBudW1iZXJbXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gYXJyYXkgaW5zdGFuY2VvZiBBcnJheSAmJiBhcnJheS5ldmVyeSh2ID0+IGlzSW50ZWdlcih2KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1R5cGVkQXJyYXkoYXJyYXk6IE1MQnVmZmVyVmlld3xXZWJHTFRleHR1cmUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGFycmF5IGluc3RhbmNlb2YgRmxvYXQzMkFycmF5IHx8IGFycmF5IGluc3RhbmNlb2YgSW50MzJBcnJheSB8fFxuICAgICAgYXJyYXkgaW5zdGFuY2VvZiBVaW50MzJBcnJheSB8fCBhcnJheSBpbnN0YW5jZW9mIEludDE2QXJyYXkgfHxcbiAgICAgIGFycmF5IGluc3RhbmNlb2YgVWludDE2QXJyYXkgfHwgYXJyYXkgaW5zdGFuY2VvZiBJbnQ4QXJyYXkgfHxcbiAgICAgIGFycmF5IGluc3RhbmNlb2YgVWludDhBcnJheTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFR5cGVkQXJyYXkodHlwZTogTUxPcGVyYW5kVHlwZSk6IEZsb2F0MzJBcnJheUNvbnN0cnVjdG9yfFxuICAgIEludDMyQXJyYXlDb25zdHJ1Y3RvcnxVaW50MzJBcnJheUNvbnN0cnVjdG9yfFVpbnQxNkFycmF5Q29uc3RydWN0b3J8XG4gICAgSW50OEFycmF5Q29uc3RydWN0b3J8VWludDhBcnJheUNvbnN0cnVjdG9yIHtcbiAgaWYgKHR5cGUgPT09ICdmbG9hdDMyJykge1xuICAgIHJldHVybiBGbG9hdDMyQXJyYXk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2ludDMyJykge1xuICAgIHJldHVybiBJbnQzMkFycmF5O1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICd1aW50MzInKSB7XG4gICAgcmV0dXJuIFVpbnQzMkFycmF5O1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdmbG9hdDE2Jykge1xuICAgIHJldHVybiBVaW50MTZBcnJheTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnaW50OCcpIHtcbiAgICByZXR1cm4gSW50OEFycmF5O1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICd1aW50OCcpIHtcbiAgICByZXR1cm4gVWludDhBcnJheTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1R5cGUgaXMgbm90IHN1cHBvcnRlZC4nKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xvbmVUeXBlZEFycmF5KHZhbHVlOiBUeXBlZEFycmF5KTogVHlwZWRBcnJheSB7XG4gIGxldCBhcnJheTtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5KSB7XG4gICAgYXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KHZhbHVlLmxlbmd0aCk7XG4gIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnQzMkFycmF5KSB7XG4gICAgYXJyYXkgPSBuZXcgSW50MzJBcnJheSh2YWx1ZS5sZW5ndGgpO1xuICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgVWludDMyQXJyYXkpIHtcbiAgICBhcnJheSA9IG5ldyBVaW50MzJBcnJheSh2YWx1ZS5sZW5ndGgpO1xuICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgVWludDE2QXJyYXkpIHtcbiAgICBhcnJheSA9IG5ldyBVaW50MTZBcnJheSh2YWx1ZS5sZW5ndGgpO1xuICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgSW50OEFycmF5KSB7XG4gICAgYXJyYXkgPSBuZXcgSW50OEFycmF5KHZhbHVlLmxlbmd0aCk7XG4gIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheSh2YWx1ZS5sZW5ndGgpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignVHlwZSBpcyBub3Qgc3VwcG9ydGVkLicpO1xuICB9XG4gIGFycmF5LnNldCh2YWx1ZSk7XG4gIHJldHVybiBhcnJheTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERhdGFUeXBlKHR5cGU6IE1MT3BlcmFuZFR5cGUpOiB0Zi5EYXRhVHlwZSB7XG4gIGlmICh0eXBlID09PSAnZmxvYXQzMicpIHtcbiAgICByZXR1cm4gJ2Zsb2F0MzInO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdpbnQzMicpIHtcbiAgICByZXR1cm4gJ2ludDMyJztcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBvcGVyYW5kIHR5cGUgaXMgbm90IHN1cHBvcnRlZCBieSBURi5qcy4nKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlT3BlcmFuZERlc2NyaXB0b3JGcm9tVGVuc29yKHRlbnNvcjogdGYuVGVuc29yKTpcbiAgICBNTE9wZXJhbmREZXNjcmlwdG9yIHtcbiAgbGV0IHR5cGU6IE1MT3BlcmFuZFR5cGU7XG4gIGlmICh0ZW5zb3IuZHR5cGUgPT09ICdmbG9hdDMyJykge1xuICAgIHR5cGUgPSBNTE9wZXJhbmRUeXBlLmZsb2F0MzI7XG4gIH0gZWxzZSBpZiAodGVuc29yLmR0eXBlID09PSAnaW50MzInKSB7XG4gICAgdHlwZSA9IE1MT3BlcmFuZFR5cGUuaW50MzI7XG4gIH1cbiAgcmV0dXJuIHt0eXBlLCBkaW1lbnNpb25zOiB0ZW5zb3Iuc2hhcGV9IGFzIE1MT3BlcmFuZERlc2NyaXB0b3I7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZU9wZXJhbmREZXNjcmlwdG9yKGRlc2M6IE1MT3BlcmFuZERlc2NyaXB0b3IpOiB2b2lkIHtcbiAgYXNzZXJ0KGRlc2MudHlwZSBpbiBNTE9wZXJhbmRUeXBlLCAnVGhlIG9wZXJhbmQgdHlwZSBpcyBpbnZhbGlkLicpO1xuICBpZiAoZGVzYy5kaW1lbnNpb25zKSB7XG4gICAgYXNzZXJ0KGlzSW50ZWdlckFycmF5KGRlc2MuZGltZW5zaW9ucyksICdUaGUgZGltZW5zaW9ucyBpcyBpbnZhbGlkLicpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0R5YW5taWNTaGFwZShkaW1lbnNpb25zOiBudW1iZXJbXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gIWRpbWVuc2lvbnMuZXZlcnkoeCA9PiB4ID4gMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVR5cGVkQXJyYXkoXG4gICAgdmFsdWU6IFR5cGVkQXJyYXksIHR5cGU6IE1MT3BlcmFuZFR5cGUsIGRpbWVuc2lvbnM6IG51bWJlcltdKTogdm9pZCB7XG4gIGFzc2VydChpc1R5cGVkQXJyYXkodmFsdWUpLCAnVGhlIHZhbHVlIGlzIG5vdCBhIHR5cGVkIGFycmF5LicpO1xuICBhc3NlcnQodmFsdWUgaW5zdGFuY2VvZiBnZXRUeXBlZEFycmF5KHR5cGUpLCAnVGhlIHR5cGUgb2YgdmFsdWUgaXMgaW52YWxpZC4nKTtcbiAgYXNzZXJ0KFxuICAgICAgdmFsdWUubGVuZ3RoID09PSBzaXplRnJvbURpbWVuc2lvbnMoZGltZW5zaW9ucyksXG4gICAgICBgdGhlIHZhbHVlIGxlbmd0aCAke3ZhbHVlLmxlbmd0aH0gaXMgaW52YWxpZCwgc2l6ZSBvZiBgICtcbiAgICAgICAgICBgWyR7ZGltZW5zaW9uc31dICR7c2l6ZUZyb21EaW1lbnNpb25zKGRpbWVuc2lvbnMpfSBgICtcbiAgICAgICAgICAnaXMgZXhwZWN0ZWQuJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVZhbHVlVHlwZSh2YWx1ZTogbnVtYmVyLCB0eXBlOiBNTE9wZXJhbmRUeXBlKTogdm9pZCB7XG4gIGlmICh0eXBlID09PSBNTE9wZXJhbmRUeXBlLmludDMyKSB7XG4gICAgYXNzZXJ0KE51bWJlci5pc0ludGVnZXIodmFsdWUpLCAndGhlIHZhbHVlIGlzIG5vdCBhbiBpbnQzMi4nKTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNTE9wZXJhbmRUeXBlLnVpbnQzMikge1xuICAgIGFzc2VydChcbiAgICAgICAgTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkgJiYgdmFsdWUgPj0gMCwgJ3RoZSB2YWx1ZSBpcyBub3QgYW4gdWludDMyLicpO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1MT3BlcmFuZFR5cGUuaW50OCkge1xuICAgIGFzc2VydChcbiAgICAgICAgTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkgJiYgdmFsdWUgPj0gLTEyOCAmJiB2YWx1ZSA8PSAxMjcsXG4gICAgICAgICd0aGUgdmFsdWUgaXMgbm90IGFuIGludDguJyk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTUxPcGVyYW5kVHlwZS51aW50OCkge1xuICAgIGFzc2VydChcbiAgICAgICAgTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkgJiYgdmFsdWUgPj0gMCAmJiB2YWx1ZSA8PSAyNTUsXG4gICAgICAgICd0aGUgdmFsdWUgaXMgbm90IGFuIHVpbnQ4LicpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUZW5zb3IoXG4gICAgZGVzYzogTUxPcGVyYW5kRGVzY3JpcHRvcixcbiAgICB2YWx1ZTogTUxCdWZmZXJWaWV3fFdlYkdMVGV4dHVyZXxudW1iZXIpOiB0Zi5UZW5zb3Ige1xuICBjb25zdCBkdHlwZTogdGYuRGF0YVR5cGUgPSBnZXREYXRhVHlwZShkZXNjLnR5cGUpO1xuICBpZiAoZGVzYy5kaW1lbnNpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnQoXG4gICAgICAgIGlzVHlwZWRBcnJheSh2YWx1ZSBhcyBNTEJ1ZmZlclZpZXcgfCBXZWJHTFRleHR1cmUpLFxuICAgICAgICAnT25seSBBcnJheUJ1ZmZlclZpZXcgdmFsdWUgaXMgc3VwcG9ydGVkLicpO1xuICAgIGNvbnN0IGFycmF5ID0gdmFsdWUgYXMgVHlwZWRBcnJheTtcbiAgICB2YWxpZGF0ZVR5cGVkQXJyYXkoYXJyYXksIGRlc2MudHlwZSwgZGVzYy5kaW1lbnNpb25zKTtcbiAgICBjb25zdCBjbG9uZWRBcnJheSA9IGNsb25lVHlwZWRBcnJheShhcnJheSk7XG4gICAgcmV0dXJuIHRmLnRlbnNvcihjbG9uZWRBcnJheSwgZGVzYy5kaW1lbnNpb25zLCBkdHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHZhbGlkYXRlVmFsdWVUeXBlKHZhbHVlLCBkZXNjLnR5cGUpO1xuICAgICAgcmV0dXJuIHRmLnNjYWxhcih2YWx1ZSwgZHR5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWxpZGF0ZVR5cGVkQXJyYXkodmFsdWUgYXMgVHlwZWRBcnJheSwgZGVzYy50eXBlLCBkZXNjLmRpbWVuc2lvbnMpO1xuICAgICAgcmV0dXJuIHRmLnNjYWxhcigodmFsdWUgYXMgVHlwZWRBcnJheSlbMF0sIGR0eXBlKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNpemVGcm9tRGltZW5zaW9ucyhkaW06IG51bWJlcltdKTogbnVtYmVyIHtcbiAgaWYgKGRpbSA9PT0gdW5kZWZpbmVkIHx8IChpc0ludGVnZXJBcnJheShkaW0pICYmIGRpbS5sZW5ndGggPT09IDApKSB7XG4gICAgLy8gc2NhbGFyXG4gICAgcmV0dXJuIDE7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGRpbS5yZWR1Y2UoXG4gICAgICAgIChhY2N1bXVsYXRvciwgY3VycmVudFZhbHVlKSA9PlxuICAgICAgICAgICAgY3VycmVudFZhbHVlID4gMCA/IGFjY3VtdWxhdG9yICogY3VycmVudFZhbHVlIDogYWNjdW11bGF0b3IsXG4gICAgICAgIDEpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZU9wZXJhbmQoaW5wdXQ6IE1MT3BlcmFuZCwgbmFtZSA9ICcnKTogdm9pZCB7XG4gIGFzc2VydChcbiAgICAgIGlucHV0IGluc3RhbmNlb2YgTUxPcGVyYW5kLCBgVGhlIHBhcmFtZXRlciAke25hbWV9IGlzIG5vdCBhbiBvcGVyYW5kLmApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVPcHRpb25hbE9wZXJhbmQoaW5wdXQ6IE1MT3BlcmFuZCwgbmFtZSA9ICcnKTogdm9pZCB7XG4gIGFzc2VydChcbiAgICAgIGlucHV0ID09PSB1bmRlZmluZWQgfHwgaW5wdXQgaW5zdGFuY2VvZiBNTE9wZXJhbmQsXG4gICAgICBgVGhlIHBhcmFtZXRlciAke25hbWV9IGlzIG5vdCBhbiBvcHRpb25hbCBvcGVyYW5kLmApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVBeGVzKGF4ZXM6IG51bWJlcltdLCByYW5rOiBudW1iZXIpOiBib29sZWFuIHtcbiAgaWYgKHR5cGVvZiBheGVzICE9PSAndW5kZWZpbmVkJyAmJiBheGVzLmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF4ZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIGlmIChheGVzW2ldID49IHJhbmsgfHwgYXhlc1tpXSA8IC1yYW5rKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYWRkaW5ncyhcbiAgICBpbnB1dDogdGYuVGVuc29yNEQsIGZpbHRlcjogdGYuVGVuc29yNEQsXG4gICAgcGFkZGluZzogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgb3V0cHV0UGFkZGluZzogW251bWJlciwgbnVtYmVyXSwgZGlsYXRpb25zOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgIGF1dG9QYWQ6IE1MQXV0b1BhZCk6ICd2YWxpZCd8J3NhbWUnfEV4cGxpY2l0UGFkZGluZyB7XG4gIC8vIFdlYk5OIHBhZGRpbmc6XG4gIC8vICAgW2JlZ2lubmluZ19oZWlnaHQsIGVuZGluZ19oZWlnaHQsIGJlZ2lubmluZ193aWR0aCwgZW5kaW5nX3dpZHRoXVxuICAvLyB0Zi5jb252MmQgTkhXQyBzaG91bGQgYmUgaW4gdGhlIGZvbGxvd2luZyBmb3JtOlxuICAvLyAgIFtbMCwgMF0sIFtwYWRfdG9wLHBhZF9ib3R0b21dLCBbcGFkX2xlZnQsIHBhZF9yaWdodF0sIFswLCAwXV1cbiAgbGV0IHJlc3VsdFBhZGRpbmc6ICd2YWxpZCd8J3NhbWUnfEV4cGxpY2l0UGFkZGluZztcbiAgaWYgKGF1dG9QYWQgPT09IE1MQXV0b1BhZC5leHBsaWNpdCkge1xuICAgIGlmIChwYWRkaW5nLmV2ZXJ5KHYgPT4gdiA9PT0gMCkpIHtcbiAgICAgIHJlc3VsdFBhZGRpbmcgPSAndmFsaWQnO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRQYWRkaW5nID0gW1xuICAgICAgICBbMCwgMF0sIFtwYWRkaW5nWzBdLCBwYWRkaW5nWzFdXSwgW3BhZGRpbmdbMl0sIHBhZGRpbmdbM11dLCBbMCwgMF1cbiAgICAgIF0gYXMgRXhwbGljaXRQYWRkaW5nO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoYXV0b1BhZCA9PT0gTUxBdXRvUGFkWydzYW1lLXVwcGVyJ10pIHtcbiAgICAgIHJlc3VsdFBhZGRpbmcgPSAnc2FtZSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENhbGN1bGF0ZSB0aGUgZXhwbGljaXQgcGFkZGluZ3MgZm9yICdzYW1lLWxvd2VyJ1xuICAgICAgcmVzdWx0UGFkZGluZyA9IFtbMCwgMF0sIFswLCAwXSwgWzAsIDBdLCBbMCwgMF1dO1xuICAgICAgY29uc3Qgb3V0cHV0U2l6ZXMgPSBbMCwgMF07XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI7ICsraSkge1xuICAgICAgICBvdXRwdXRTaXplc1tpXSA9IE1hdGguY2VpbChpbnB1dC5zaGFwZVsxICsgaV0gLyBzdHJpZGVzW2ldKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRvdGFsUGFkZGluZzogW251bWJlciwgbnVtYmVyXSA9IFswLCAwXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjsgKytpKSB7XG4gICAgICAgIHRvdGFsUGFkZGluZ1tpXSA9IHN0cmlkZXNbaV0gKiAob3V0cHV0U2l6ZXNbaV0gLSAxKSArIG91dHB1dFBhZGRpbmdbaV0gK1xuICAgICAgICAgICAgKChmaWx0ZXIuc2hhcGVbaV0gLSAxKSAqIGRpbGF0aW9uc1tpXSArIDEpIC0gaW5wdXQuc2hhcGVbMSArIGldO1xuICAgICAgfVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyOyArK2kpIHtcbiAgICAgICAgcmVzdWx0UGFkZGluZ1tpICsgMV1bMF0gPVxuICAgICAgICAgICAgdG90YWxQYWRkaW5nW2ldIC0gTWF0aC5mbG9vcih0b3RhbFBhZGRpbmdbaV0gLyAyKTtcbiAgICAgICAgcmVzdWx0UGFkZGluZ1tpICsgMV1bMV0gPSBNYXRoLmZsb29yKHRvdGFsUGFkZGluZ1tpXSAvIDIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0UGFkZGluZztcbn0iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/html/tflite-webnn-deeplab/index.html b/html/tflite-webnn-deeplab/index.html index d4df267..1c89c3c 100644 --- a/html/tflite-webnn-deeplab/index.html +++ b/html/tflite-webnn-deeplab/index.html @@ -805,7 +805,7 @@ - + From 149210f167ec00ca9bf2b5c23790a1fe55c2f268 Mon Sep 17 00:00:00 2001 From: Wanming Lin Date: Tue, 28 Sep 2021 12:54:15 +0800 Subject: [PATCH 3/3] Fixed bug in worker --- html/js/owt/owtstream.js | 86 +- html/js/tflite/deeplab/webnn/webnnworker.js | 3 +- html/js/webnn-polyfill.js | 7495 ++++++++++--------- 3 files changed, 3788 insertions(+), 3796 deletions(-) diff --git a/html/js/owt/owtstream.js b/html/js/owt/owtstream.js index 23e6e0e..b9fef77 100644 --- a/html/js/owt/owtstream.js +++ b/html/js/owt/owtstream.js @@ -1,11 +1,9 @@ let instanceType = "deeplabtflite"; -let isFirstTimeLoad = true; -let loadTime = 0; -let buildTime = 0; let computeTime = 0; -let outputDimensions = [1,321, 321, 21]; +let computeStart = 0; +const outputDimensions = [1, 321, 321, 21]; -let inputOptions = { +const inputOptions = { mean: [127.5, 127.5, 127.5], std: [127.5, 127.5, 127.5], scaledFlag: false, @@ -15,7 +13,10 @@ let inputOptions = { }; let outputBuffer; -let continueinputvideo = true +let continueinputvideo = true; +console.log("not in worker create context: ", navigator.ml); + +const worker = new Worker('../js/tflite/deeplab/webnn/webnnworker.js'); const pipeline2 = buildWebGL2Pipeline( inputvideo, @@ -23,7 +24,7 @@ const pipeline2 = buildWebGL2Pipeline( "none", [321, 321], outputcanvas, - null + null, ); function stopCamera() { @@ -34,12 +35,13 @@ function stopCamera() { }); } -async function renderCamStream() { +function renderCamStream() { const inputBuffer = getInputTensor(inputvideo, inputOptions); let obj = { task: 'nncompute', - value: inputBuffer + value: inputBuffer, } + computeStart = performance.now(); worker.postMessage(obj); } @@ -69,7 +71,7 @@ async function drawOutput(outputBuffer, srcElement) { ); const postProcessingConfig = { smoothSegmentationMask: true, - jointBilateralFilter: {sigmaSpace: 1, sigmaColor: 0.1}, + jointBilateralFilter: { sigmaSpace: 1, sigmaColor: 0.1 }, coverage: [0.5, 0.75], lightWrapping: 0.3, blendMode: 'screen', @@ -81,26 +83,24 @@ async function drawOutput(outputBuffer, srcElement) { const createOWTStream = async () => { stream = await Owt.Base.MediaStreamFactory.createMediaStream( avTrackConstraint - ) - console.log(inputvideo) + ); if ("srcObject" in inputvideo) { - inputvideo.srcObject = stream + inputvideo.srcObject = stream; } else { - inputvideo.src = URL.createObjectURL(stream) + inputvideo.src = URL.createObjectURL(stream); } - inputvideo.autoplay = true - console.log(inputvideo.srcObject) + inputvideo.autoplay = true; } const videoCanvasOnFrame = async () => { - if(continueinputvideo) { + if (continueinputvideo) { window.requestAnimationFrame(videoCanvasOnFrame); // ctx2d.drawImage(inputvideo, 0, 0, cW, cH); - if(stream) { + if (stream) { const postProcessingConfig2 = { smoothSegmentationMask: true, - jointBilateralFilter: {sigmaSpace: 1, sigmaColor: 0.1}, + jointBilateralFilter: { sigmaSpace: 1, sigmaColor: 0.1 }, coverage: [0.5, 0.75], lightWrapping: 0.3, blendMode: 'screen', @@ -111,13 +111,11 @@ const videoCanvasOnFrame = async () => { } } -let worker; -worker = new Worker('../js/tflite/deeplab/webnn/webnnworker.js'); const oneWebMeetOWT = async () => { - await createOWTStream() - backgroundType = "blur" - continueinputvideo = true + await createOWTStream(); + backgroundType = "blur"; + continueinputvideo = true; await videoCanvasOnFrame(); getProcessedStream(); initConference(); @@ -126,7 +124,7 @@ const oneWebMeetOWT = async () => { let obj = { task: 'nnwarmup', - value: null + value: null, } worker.postMessage(obj); @@ -136,7 +134,7 @@ const oneWebMeetOWT = async () => { // console.log("^^^^^^^^^^^^^^^^^ WIN ^^^^^^^^^^^^^^^^^^^^") // let worker = new Worker('../js/tflite/deeplab/webnn/webnnworker.js'); // worker.postMessage(['loadtask', 'computetask']); - + // worker.addEventListener('message', (e) => { // const { msg } = e.data; // $("#worker").html(msg); @@ -155,37 +153,31 @@ worker.addEventListener('message', async (e) => { $("#tbb").removeClass('disabled'); $("#tbr").removeClass('disabled'); } else { - console.log('Msg from worker: ', e.data) + // Start receiving computed outputBuffer outputBuffer = e.data; + computeTime = (performance.now() - computeStart).toFixed(2); await drawOutput(outputBuffer, inputvideo); + console.log(` done in ${computeTime} ms.`); - console.log('- Computing... '); - const start = performance.now(); - computeTime = (performance.now() - start).toFixed(2); - console.log(` done in ${computeTime} ms.`); - // await drawOutput(outputBuffer, inputvideo); - - if(continueAnimating) - { - rafReq = requestAnimationFrame(renderCamStream); - spaninference.html(computeTime) - let ct = parseInt(computeTime) - $("#fps").html((1000/ct).toFixed(0)) + if (continueAnimating) { + renderCamStream(); + spaninference.html(computeTime); + let ct = parseInt(computeTime); + $("#fps").html((1000 / ct).toFixed(0)); + } } -} - }); const ssConfig = async (isSS, effect) => { - if(isSS && effect) { + if (isSS && effect) { backgroundImageSource.src = '../../assets/img/ssbg/0.jpg' continueinputvideo = false console.log(isSS + ' ' + effect) backgroundType = effect; - continueAnimating = true + continueAnimating = true; try { - inputvideo.onloadedmediadata = await renderCamStream(); + inputvideo.onloadedmediadata = renderCamStream(); } catch (error) { console.log(error); } @@ -193,8 +185,8 @@ const ssConfig = async (isSS, effect) => { // gl = outputcanvas.getContext("2d"); backgroundImageSource.src = ''; continueAnimating = false; - continueinputvideo = true - backgroundType = "none" - await videoCanvasOnFrame() + continueinputvideo = true; + backgroundType = "none"; + await videoCanvasOnFrame(); } } \ No newline at end of file diff --git a/html/js/tflite/deeplab/webnn/webnnworker.js b/html/js/tflite/deeplab/webnn/webnnworker.js index 66d3824..48c236c 100644 --- a/html/js/tflite/deeplab/webnn/webnnworker.js +++ b/html/js/tflite/deeplab/webnn/webnnworker.js @@ -20,7 +20,6 @@ let warmup = async () => { let nncompute = (inputBuffer) => { let outputBuffer = compute(modelRunner, inputBuffer); outputBuffer = new Float32Array(outputBuffer); - console.log('outputBuffer in worker: ', outputBuffer); postMessage(outputBuffer, [outputBuffer.buffer]); } @@ -29,7 +28,7 @@ addEventListener('message', async (e) => { const value = e.data.value; if(task === "nnwarmup") { await warmup(); - self.postMessage({msg: "modelloaded"}); + postMessage({msg: "modelloaded"}); } if(task === "nncompute") { nncompute(value); diff --git a/html/js/webnn-polyfill.js b/html/js/webnn-polyfill.js index e348689..bcb0bd6 100644 --- a/html/js/webnn-polyfill.js +++ b/html/js/webnn-polyfill.js @@ -1,11 +1,11 @@ -!function(e){var t={};function n(s){if(t[s])return t[s].exports;var o=t[s]={i:s,l:!1,exports:{}};return e[s].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,s){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:s})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var s=Object.create(null);if(n.r(s),Object.defineProperty(s,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(s,o,function(t){return e[t]}.bind(null,o));return s},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=0)}({"./node_modules/@tensorflow/tfjs-backend-cpu/dist/backend_cpu.js": -/*!***********************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/backend_cpu.js ***! - \***********************************************************************/ -/*! exports provided: MathBackendCPU */function(e,t,n){"use strict";n.r(t),n.d(t,"MathBackendCPU",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +!function(e){var t={};function n(s){if(t[s])return t[s].exports;var o=t[s]={i:s,l:!1,exports:{}};return e[s].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,s){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:s})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var s=Object.create(null);if(n.r(s),Object.defineProperty(s,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(s,o,function(t){return e[t]}.bind(null,o));return s},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=0)}({"./.yalc/@tensorflow/tfjs-backend-webgl/dist/addn_gpu.js": +/*!***************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/addn_gpu.js ***! + \***************************************************************/ +/*! exports provided: AddNProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"AddNProgram",(function(){return s})); /** * @license - * Copyright 2021 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -19,14 +19,14 @@ * limitations under the License. * ============================================================================= */ -const r=s.kernel_impls.whereImpl;class i extends s.KernelBackend{constructor(){super(),this.blockSize=48,this.firstUse=!0,this.data=new s.DataStorage(this,Object(s.engine)())}nextDataId(){return i.nextDataId++}write(e,t,n){this.firstUse&&(this.firstUse=!1,Object(s.env)().get("IS_NODE")&&s.backend_util.warn("\n============================\nHi there 👋. Looks like you are running TensorFlow.js in Node.js. To speed things up dramatically, install our node backend, which binds to TensorFlow C++, by running npm i @tensorflow/tfjs-node, or npm i @tensorflow/tfjs-node-gpu if you have CUDA. Then call require('@tensorflow/tfjs-node'); (-gpu suffix for CUDA) at the start of your program. Visit https://github.com/tensorflow/tfjs-node for more details.\n============================"));const o={id:this.nextDataId()};return this.data.set(o,{values:e,dtype:n,refCount:1}),o}makeTensorInfo(e,t,n){let o;if("string"===t&&null!=n&&n.length>0&&s.util.isString(n[0])){const r=n.map((e=>s.util.encodeString(e)));o=this.write(r,e,t)}else o=this.write(n,e,t);return{dataId:o,shape:e,dtype:t}}refCount(e){if(this.data.has(e)){return this.data.get(e).refCount}return 0}incRef(e){this.data.get(e).refCount++}decRef(e){if(this.data.has(e)){this.data.get(e).refCount--}}move(e,t,n,s,o){this.data.set(e,{values:t,dtype:s,refCount:o})}numDataIds(){return this.data.numDataIds()}async read(e){return this.readSync(e)}readSync(e){const{dtype:t,complexTensorInfos:n}=this.data.get(e);if("complex64"===t){const e=this.readSync(n.real.dataId),t=this.readSync(n.imag.dataId);return s.backend_util.mergeRealAndImagArrays(e,t)}return this.data.get(e).values}bufferSync(e){const t=this.readSync(e.dataId);let n=t;if("string"===e.dtype)try{n=t.map((e=>s.util.decodeString(e)))}catch(e){throw new Error("Failed to decode encoded string bytes into utf-8")}return Object(s.buffer)(e.shape,e.dtype,n)}makeOutput(e,t,n){const o=this.write(e,t,n);return Object(s.engine)().makeTensorFromDataId(o,t,n,this)}disposeData(e,t=!1){if(this.data.has(e)){if(this.data.get(e).refCount--,!t&&this.data.get(e).refCount>0)return!1;const{complexTensorInfos:n}=this.data.get(e);null!=n&&(this.disposeData(n.real.dataId,!0),this.disposeData(n.imag.dataId,!0)),this.data.delete(e)}return!0}disposeIntermediateTensorInfo(e){this.disposeData(e.dataId)}async time(e){const t=s.util.now();e();return{kernelMs:s.util.now()-t}}memory(){return{unreliable:!0,reasons:["The reported memory is an upper bound. Due to automatic garbage collection, the true allocated memory may be less."]}}where(e){Object(o.assertNotComplex)([e],"where");const t=this.readSync(e.dataId);return r(e.shape,t)}dispose(){}floatPrecision(){return 32}epsilon(){return super.epsilon()}}i.nextDataId=0},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/base.js": -/*!****************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/base.js ***! - \****************************************************************/ -/*! exports provided: MathBackendCPU, version_cpu, shared */function(e,t,n){"use strict";n.r(t);var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./backend_cpu */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/backend_cpu.js"),r=n(/*! ./shared */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/shared.js");n.d(t,"shared",(function(){return r})),n.d(t,"MathBackendCPU",(function(){return o.MathBackendCPU}));var i=n(/*! ./version */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/version.js");n.d(t,"version_cpu",(function(){return i.version})), +class s{constructor(e,t){this.outputShape=[],this.outputShape=e,this.variableNames=t.map(((e,t)=>`T${t}`));const n=[];this.variableNames.forEach((e=>{n.push(`float v${e} = get${e}AtOutCoords();`)}));const s=this.variableNames.map((e=>`v${e}`)).join(" + ");this.userCode=`\n void main() {\n ${n.join("\n ")}\n\n float result = ${s};\n setOutput(result);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/addn_packed_gpu.js": +/*!**********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/addn_packed_gpu.js ***! + \**********************************************************************/ +/*! exports provided: AddNPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"AddNPackedProgram",(function(){return s})); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -40,14 +40,14 @@ const r=s.kernel_impls.whereImpl;class i extends s.KernelBackend{constructor(){s * limitations under the License. * ============================================================================= */ -Object(s.registerBackend)("cpu",(()=>new o.MathBackendCPU),1)},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js": +class s{constructor(e,t){this.outputShape=[],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=e,this.variableNames=t.map(((e,t)=>`T${t}`));const n=[];this.variableNames.forEach((e=>{n.push(`vec4 v${e} = get${e}AtOutCoords();`)}));const s=this.variableNames.map((e=>`v${e}`)).join(" + ");this.userCode=`\n void main() {\n ${n.join("\n ")}\n\n vec4 result = ${s};\n setOutput(result);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/argminmax_gpu.js": /*!********************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js ***! + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/argminmax_gpu.js ***! \********************************************************************/ -/*! exports provided: assertNotComplex */function(e,t,n){"use strict";n.r(t),n.d(t,"assertNotComplex",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/*! exports provided: ArgMinMaxProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ArgMinMaxProgram",(function(){return s})); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2017 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -60,14 +60,15 @@ Object(s.registerBackend)("cpu",(()=>new o.MathBackendCPU),1)},"./node_modules/@ * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */function o(e,t){Array.isArray(e)||(e=[e]),e.forEach((e=>{null!=e&&s.util.assert("complex64"!==e.dtype,(()=>`${t} does not support complex64 tensors in the CPU backend.`))}))}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/index.js": -/*!*****************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/index.js ***! - \*****************************************************************/ -/*! exports provided: MathBackendCPU, version_cpu, shared */function(e,t,n){"use strict";n.r(t);var s=n(/*! ./base */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/base.js");n.d(t,"MathBackendCPU",(function(){return s.MathBackendCPU})),n.d(t,"version_cpu",(function(){return s.version_cpu})),n.d(t,"shared",(function(){return s.shared}));n(/*! ./register_all_kernels */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/register_all_kernels.js"); + */ +class s{constructor(e,t,n){this.variableNames=["A"];const{windowSize:s,batchSize:o,outSize:r}=e;n||this.variableNames.push("bestIndicesA"),this.outputShape=[o,r];const i="max"===t?">":"<",a=n?"inOffset + i;":"round(getBestIndicesA(batch, inOffset + i));";this.userCode=`\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = outIdx * ${s};\n\n int bestIndex = inOffset;\n float bestValue = getA(batch, bestIndex);\n\n for (int i = 0; i < ${s}; i++) {\n int inIdx = ${a};\n float candidate = getA(batch, inIdx);\n if (candidate ${i} bestValue) {\n bestValue = candidate;\n bestIndex = inIdx;\n }\n }\n setOutput(float(bestIndex));\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/argminmax_packed_gpu.js": +/*!***************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/argminmax_packed_gpu.js ***! + \***************************************************************************/ +/*! exports provided: ArgMinMaxPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ArgMinMaxPackedProgram",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./packing_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/packing_util.js"),r=n(/*! ./shader_compiler */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -80,77 +81,57 @@ Object(s.registerBackend)("cpu",(()=>new o.MathBackendCPU),1)},"./node_modules/@ * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Abs.js": -/*!***********************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Abs.js ***! - \***********************************************************************/ -/*! exports provided: simpleAbsImpl, abs, absConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"simpleAbsImpl",(function(){return r})),n.d(t,"abs",(function(){return i})),n.d(t,"absConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); -/** - * @license - * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================================= */ -function r(e){const t=new Float32Array(e.length);for(let n=0;n{const{x:t}=e.inputs,n=e.backend;Object(o.assertNotComplex)(t,"abs");let i=new Float32Array(s.util.sizeFromShape(t.shape));return i=r(n.data.get(t.dataId).values),n.makeOutput(i,t.shape,"float32")},a={kernelName:s.Abs,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Acos.js": -/*!************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Acos.js ***! - \************************************************************************/ -/*! exports provided: acos, acosConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"acos",(function(){return r})),n.d(t,"acosConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +class i{constructor(e,t,n,i){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,s.util.assert(e.length>2,(()=>`Packed arg${n.charAt(0).toUpperCase()+n.slice(1)} supports only inputs with rank above 2.`));const a=e[e.length-1],u=Math.ceil(a/t);this.outputShape=e.slice(0,-1),u>1&&this.outputShape.push(u),i||this.variableNames.push("bestIndicesA");const d=this.outputShape,l=d.length,c=Object(r.getCoordsDataType)(l),f=Object(o.getChannels)("coords",l);let p,m;if(1===u){m=l+1;const e=Object(r.getCoordsDataType)(m);p=`\n ${e} sourceLocR = ${e}(${f.join()}, 0);\n ++${f[l-1]};\n ${e} sourceLocG = ${e}(${f.join()}, 0);\n ++${f[l-2]};\n ${e} sourceLocA = ${e}(${f.join()}, 0);\n --${f[l-1]};\n ${e} sourceLocB = ${e}(${f.join()}, 0);\n --${f[l-2]};`}else m=l,p=`\n ${c} sourceLocR = coords;\n ++${f[l-1]};\n ${c} sourceLocG = coords;\n ++${f[l-2]};\n ${c} sourceLocA = coords;\n --${f[l-1]};\n ${c} sourceLocB = coords;\n --${f[l-2]};`;const h=["x","y","z","w","u","v"].slice(0,m),b="."+h[m-1],j=h.map((e=>"int "+e)),g=Object(o.getChannels)("sourceLocR",m-1).concat("inIdx.r"),w=Object(o.getChannels)("sourceLocG",m-1).concat("inIdx.g"),_=Object(o.getChannels)("sourceLocB",m-1).concat("inIdx.b"),k=Object(o.getChannels)("sourceLocA",m-1).concat("inIdx.a"),v="max"===n?"greaterThan":"lessThan",x=i?"":`\n inIdx = round(vec4(getBestIndicesAChannel(${g.join()}),\n getBestIndicesAChannel(${w.join()}),\n getBestIndicesAChannel(${_.join()}),\n getBestIndicesAChannel(${k.join()})));`,y=`vec4(\n getAChannel(${g.join()}),\n hasNextCol ? getAChannel(${w.join()}) : 0.,\n hasNextRow ? getAChannel(${_.join()}) : 0.,\n hasNextRow && hasNextCol ? getAChannel(${k.join()}) : 0.)`,O=i?"":`\n float getBestIndicesAChannel(${j.join()}) {\n return getChannel(getBestIndicesA(${h.join()}),\n vec2(${h.slice(-2).join()}));\n }`;this.userCode=`\n float getAChannel(${j.join()}) {\n return getChannel(getA(${h.join()}),\n vec2(${h.slice(-2).join()}));\n }\n ${O}\n void main() {\n ${c} coords = getOutputCoords();\n bool hasNextCol = ${f[l-1]} < ${d[l-1]-1};\n bool hasNextRow = ${f[l-2]} < ${d[l-2]-1};\n ${p}\n ivec4 srcIdx = ivec4(sourceLocR${b}, sourceLocG${b},\n sourceLocB${b}, sourceLocA${b}) * ${t};\n ivec4 inIdx = srcIdx;\n vec4 bestIndex = vec4(inIdx);\n vec4 bestValue = ${y};\n\n for (int i = 0; i < ${t}; i++) {\n inIdx = srcIdx;\n ${x}\n vec4 candidate = ${y};\n bvec4 nan = isnan(candidate);\n bvec4 replace = bvec4(\n vec4(${v}(candidate, bestValue)) * (vec4(1.0) - vec4(nan)));\n\n bestValue = vec4(replace.x ? candidate.x : bestValue.x,\n replace.y ? candidate.y : bestValue.y,\n replace.z ? candidate.z : bestValue.z,\n replace.w ? candidate.w : bestValue.w);\n bestIndex = mix(bestIndex, vec4(inIdx), vec4(replace));\n srcIdx++;\n }\n setOutput(bestIndex);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/avg_pool_backprop_gpu.js": +/*!****************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/avg_pool_backprop_gpu.js ***! + \****************************************************************************/ +/*! exports provided: AvgPool2DBackpropProgram, AvgPool3DBackpropProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"AvgPool2DBackpropProgram",(function(){return s})),n.d(t,"AvgPool3DBackpropProgram",(function(){return o})); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the License); + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -const r=Object(o.unaryKernelFunc)(s.Acos,(e=>Math.acos(e))),i={kernelName:s.Acos,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Acosh.js": -/*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Acosh.js ***! - \*************************************************************************/ -/*! exports provided: acosh, acoshConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"acosh",(function(){return r})),n.d(t,"acoshConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +class s{constructor(e){this.variableNames=["dy"],this.outputShape=e.inShape;const t=e.filterHeight,n=e.filterWidth,s=e.strideHeight,o=e.strideWidth,r=e.dilationHeight,i=e.dilationWidth,a=e.effectiveFilterHeight,u=e.effectiveFilterWidth,d=a-1-e.padInfo.top,l=u-1-e.padInfo.left,c=1/(t*n);this.userCode=`\n const ivec2 pads = ivec2(${d}, ${l});\n const float avgMultiplier = float(${c});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n\n ivec2 dyRCCorner = coords.yz - pads;\n int dyRCorner = dyRCCorner.x;\n int dyCCorner = dyRCCorner.y;\n\n // Convolve dy(?, ?, d) with pos mask(:, :, d) to get dx(xR, xC, d).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < ${a};\n wR += ${r}) {\n float dyR = float(dyRCorner + wR) / ${s}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < ${u};\n wC+= ${i}) {\n float dyC = float(dyCCorner + wC) / ${o}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(b, idyR, idyC, d);\n\n dotProd += dyValue * avgMultiplier;\n }\n }\n setOutput(dotProd);\n }\n `}}class o{constructor(e){this.variableNames=["dy"],this.outputShape=e.inShape;const t=e.filterDepth,n=e.filterHeight,s=e.filterWidth,o=e.strideDepth,r=e.strideHeight,i=e.strideWidth,a=e.dilationDepth,u=e.dilationHeight,d=e.dilationWidth,l=e.effectiveFilterDepth,c=e.effectiveFilterHeight,f=e.effectiveFilterWidth,p=l-1-e.padInfo.front,m=c-1-e.padInfo.top,h=f-1-e.padInfo.left,b=1/(t*n*s);this.userCode=`\n const ivec3 pads = ivec3(${p}, ${m}, ${h});\n const float avgMultiplier = float(${b});\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int ch = coords.u;\n\n ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads;\n int dyDCorner = dyCorner.x;\n int dyRCorner = dyCorner.y;\n int dyCCorner = dyCorner.z;\n\n // Convolve dy(?, ?, ?, d) with pos mask(:, :, :, ch) to get\n // dx(xD, xR, xC, ch).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n\n for (int wD = 0; wD < ${l};\n wD += ${a}) {\n float dyD = float(dyDCorner + wD) / ${o}.0;\n\n if (dyD < 0.0 || dyD >= ${e.outDepth}.0 || fract(dyD) > 0.0) {\n continue;\n }\n int idyD = int(dyD);\n\n for (int wR = 0; wR < ${c};\n wR += ${u}) {\n float dyR = float(dyRCorner + wR) / ${r}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 ||\n fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < ${f};\n wC += ${d}) {\n float dyC = float(dyCCorner + wC) / ${i}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(batch, idyD, idyR, idyC, ch);\n\n dotProd += dyValue * avgMultiplier;\n }\n }\n }\n setOutput(dotProd);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/backend_webgl.js": +/*!********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/backend_webgl.js ***! + \********************************************************************/ +/*! exports provided: EPSILON_FLOAT32, EPSILON_FLOAT16, getBinaryCache, MathBackendWebGL */function(e,t,n){"use strict";n.r(t),n.d(t,"EPSILON_FLOAT32",(function(){return x})),n.d(t,"EPSILON_FLOAT16",(function(){return y})),n.d(t,"getBinaryCache",(function(){return I})),n.d(t,"MathBackendWebGL",(function(){return S}));n(/*! ./flags_webgl */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/flags_webgl.js");var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./canvas_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/canvas_util.js"),r=n(/*! ./decode_matrix_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/decode_matrix_gpu.js"),i=n(/*! ./decode_matrix_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/decode_matrix_packed_gpu.js"),a=n(/*! ./encode_float_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/encode_float_gpu.js"),u=n(/*! ./encode_float_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/encode_float_packed_gpu.js"),d=n(/*! ./encode_matrix_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/encode_matrix_gpu.js"),l=n(/*! ./encode_matrix_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/encode_matrix_packed_gpu.js"),c=n(/*! ./gpgpu_context */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/gpgpu_context.js"),f=n(/*! ./gpgpu_math */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/gpgpu_math.js"),p=n(/*! ./kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"),m=n(/*! ./pack_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/pack_gpu.js"),h=n(/*! ./reshape_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/reshape_packed_gpu.js"),b=n(/*! ./tex_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/tex_util.js"),j=n(/*! ./texture_manager */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/texture_manager.js"),g=n(/*! ./unaryop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js"),w=n(/*! ./unaryop_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/unaryop_packed_gpu.js"),_=n(/*! ./unpack_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/unpack_gpu.js"),k=n(/*! ./webgl_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the License); + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -const r=Object(o.unaryKernelFunc)(s.Acosh,(e=>Math.acosh(e))),i={kernelName:s.Acosh,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Add.js": -/*!***********************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Add.js ***! - \***********************************************************************/ -/*! exports provided: addImpl, addComplexImpl, add, addConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"addImpl",(function(){return i})),n.d(t,"addComplexImpl",(function(){return a})),n.d(t,"add",(function(){return d})),n.d(t,"addConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); +const v=s.kernel_impls.whereImpl,x=1e-7,y=1e-4,O={};function I(e){return e in O||(O[e]={}),O[e]}const C=Object(s.env)().getNumber("CPU_HANDOFF_SIZE_THRESHOLD");class S extends s.KernelBackend{constructor(e){if(super(),this.pendingRead=new WeakMap,this.pendingDisposal=new WeakSet,this.dataRefCount=new WeakMap,this.numBytesInGPU=0,this.uploadWaitMs=0,this.downloadWaitMs=0,this.lastGlFlushTime=0,this.warnedAboutMemory=!1,this.pendingDeletes=0,this.disposed=!1,!Object(s.env)().getBool("HAS_WEBGL"))throw new Error("WebGL is not supported on this device");if(null==e){const e=Object(o.getWebGLContext)(Object(s.env)().getNumber("WEBGL_VERSION"));this.binaryCache=I(Object(s.env)().getNumber("WEBGL_VERSION")),this.gpgpu=new c.GPGPUContext(e),this.canvas=e.canvas,this.gpgpuCreatedLocally=!0}else this.gpgpu=e,this.binaryCache={},this.gpgpuCreatedLocally=!1,this.canvas=e.gl.canvas;this.textureManager=new j.TextureManager(this.gpgpu),this.numMBBeforeWarning=null==Object(s.env)().global.screen?1024:Object(s.env)().global.screen.height*Object(s.env)().global.screen.width*window.devicePixelRatio*600/1024/1024,this.texData=new s.DataStorage(this,Object(s.engine)())}nextDataId(){return S.nextDataId++}numDataIds(){return this.texData.numDataIds()-this.pendingDeletes}write(e,t,n){if((Object(s.env)().getBool("WEBGL_CHECK_NUMERICAL_PROBLEMS")||Object(s.env)().getBool("DEBUG"))&&this.checkNumericalProblems(e),"complex64"===n&&null!=e)throw new Error("Cannot write to a complex64 dtype. Please use tf.complex(real, imag).");const o={id:this.nextDataId()};return this.texData.set(o,{shape:t,dtype:n,values:e,usage:b.TextureUsage.UPLOAD,refCount:1}),o}refCount(e){if(this.texData.has(e)){return this.texData.get(e).refCount}return 0}incRef(e){this.texData.get(e).refCount++}decRef(e){if(this.texData.has(e)){this.texData.get(e).refCount--}}move(e,t,n,o,r){if(Object(s.env)().getBool("DEBUG")&&this.checkNumericalProblems(t),"complex64"===o)throw new Error("Cannot write to a complex64 dtype. Please use tf.complex(real, imag).");this.texData.set(e,{shape:n,dtype:o,values:t,usage:b.TextureUsage.UPLOAD,refCount:r})}disposeIntermediateTensorInfo(e){this.disposeData(e.dataId)}readSync(e){const t=this.texData.get(e),{values:n,dtype:o,complexTensorInfos:r,slice:i,shape:a,isPacked:u}=t;if(null!=i){let t;t=u?new w.UnaryOpPackedProgram(a,g.CLONE):new g.UnaryOpProgram(a,g.CLONE);const n=this.runWebGLProgram(t,[{dataId:e,shape:a,dtype:o}],o),s=this.readSync(n.dataId);return this.disposeIntermediateTensorInfo(n),s}if(null!=n)return this.convertAndCacheOnCPU(e);if("string"===o)return n;const d=null!=this.activeTimers;let l,c;if(d&&(l=s.util.now()),"complex64"===o){const e=this.readSync(r.real.dataId),t=this.readSync(r.imag.dataId);c=s.backend_util.mergeRealAndImagArrays(e,t)}else c=this.getValuesFromTexture(e);return d&&(this.downloadWaitMs+=s.util.now()-l),this.convertAndCacheOnCPU(e,c)}async read(e){if(this.pendingRead.has(e)){const t=this.pendingRead.get(e);return new Promise((e=>t.push(e)))}const t=this.texData.get(e),{values:n,shape:o,slice:r,dtype:i,complexTensorInfos:a,isPacked:u}=t;if(null!=r){let t;t=u?new w.UnaryOpPackedProgram(o,g.CLONE):new g.UnaryOpProgram(o,g.CLONE);const n=this.runWebGLProgram(t,[{dataId:e,shape:o,dtype:i}],i),s=this.read(n.dataId);return this.disposeIntermediateTensorInfo(n),s}if(null!=n)return this.convertAndCacheOnCPU(e);if(!Object(s.env)().getBool("WEBGL_DOWNLOAD_FLOAT_ENABLED")&&2===Object(s.env)().getNumber("WEBGL_VERSION"))throw new Error("tensor.data() with WEBGL_DOWNLOAD_FLOAT_ENABLED=false and WEBGL_VERSION=2 not yet supported.");let d,l,c=null;if("complex64"!==i&&Object(s.env)().get("WEBGL_BUFFER_SUPPORTED")){d=this.decode(e);const t=this.texData.get(d.dataId);c=this.gpgpu.createBufferFromTexture(t.texture,...b.getDenseTexShape(o))}if(this.pendingRead.set(e,[]),"complex64"!==i&&await this.gpgpu.createAndWaitForFence(),"complex64"===i){const e=await Promise.all([this.read(a.real.dataId),this.read(a.imag.dataId)]),t=e[0],n=e[1];l=s.backend_util.mergeRealAndImagArrays(t,n)}else if(null==c)l=this.getValuesFromTexture(e);else{const e=s.util.sizeFromShape(o);l=this.gpgpu.downloadFloat32MatrixFromBuffer(c,e)}if(null!=d&&this.disposeIntermediateTensorInfo(d),null!=c){const e=this.gpgpu.gl;k.callAndCheck(e,(()=>e.deleteBuffer(c)))}const f=this.convertAndCacheOnCPU(e,l),p=this.pendingRead.get(e);return this.pendingRead.delete(e),p.forEach((e=>e(f))),this.pendingDisposal.has(e)&&(this.pendingDisposal.delete(e),this.disposeData(e)&&Object(s.engine)().removeDataId(e,this),this.pendingDeletes--),f}bufferSync(e){const t=this.readSync(e.dataId);let n=t;if("string"===e.dtype)try{n=t.map((e=>s.util.decodeString(e)))}catch(e){throw new Error("Failed to decode encoded string bytes into utf-8")}return Object(s.buffer)(e.shape,e.dtype,n)}checkNumericalProblems(e){if(null!=e)for(let t=0;t0}async time(e){const t=this.activeTimers,n=[];let o=!1;null==this.programTimersStack?(this.programTimersStack=n,o=!0):this.activeTimers.push(n),this.activeTimers=n,e();const r=s.util.flatten(this.activeTimers.map((e=>e.query))).filter((e=>null!=e)),i=s.util.flatten(this.activeTimers.map((e=>e.name))).filter((e=>null!=e));this.activeTimers=t,o&&(this.programTimersStack=null);const a={uploadWaitMs:this.uploadWaitMs,downloadWaitMs:this.downloadWaitMs,kernelMs:null,wallMs:null};if(Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE")>0){const e=await Promise.all(r);a.kernelMs=s.util.sum(e),a.getExtraProfileInfo=()=>e.map(((e,t)=>({name:i[t],ms:e}))).map((e=>`${e.name}: ${e.ms}`)).join(", ")}else a.kernelMs={error:"WebGL query timers are not supported in this environment."};return this.uploadWaitMs=0,this.downloadWaitMs=0,a}memory(){return{unreliable:!1,numBytesInGPU:this.numBytesInGPU,numBytesInGPUAllocated:this.textureManager.numBytesAllocated,numBytesInGPUFree:this.textureManager.numBytesFree}}startTimer(){return Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE")>0?this.gpgpu.beginQuery():{startMs:s.util.now(),endMs:null}}endTimer(e){return Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE")>0?(this.gpgpu.endQuery(),e):(e.endMs=s.util.now(),e)}async getQueryTime(e){if(Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE")>0)return this.gpgpu.waitForQueryAndGetTime(e);const t=e;return t.endMs-t.startMs}disposeData(e,t=!1){if(this.pendingDisposal.has(e))return!1;if(!this.texData.has(e))return!0;if(t?this.texData.get(e).refCount=0:this.texData.get(e).refCount--,!t&&this.texData.get(e).refCount>0)return!1;if(this.pendingRead.has(e))return this.pendingDisposal.add(e),this.pendingDeletes++,!1;this.releaseGPUData(e);const{complexTensorInfos:n}=this.texData.get(e);return null!=n&&(this.disposeData(n.real.dataId,t),this.disposeData(n.imag.dataId,t)),this.texData.delete(e),!0}releaseGPUData(e){const{texture:t,dtype:n,texShape:s,usage:o,isPacked:r,slice:i}=this.texData.get(e),a=i&&i.origDataId||e,u=this.dataRefCount.get(a);u>1?this.dataRefCount.set(a,u-1):(this.dataRefCount.delete(a),null!=t&&(this.numBytesInGPU-=this.computeBytes(s,n),this.textureManager.releaseTexture(t,s,o,r)));const d=this.texData.get(e);d.texture=null,d.texShape=null,d.isPacked=!1,d.slice=null}getTexture(e){return this.uploadToGPU(e),this.texData.get(e).texture}getDataInfo(e){return this.texData.get(e)}shouldExecuteOnCPU(e,t=C){return Object(s.env)().getBool("WEBGL_CPU_FORWARD")&&e.every((e=>null==this.texData.get(e.dataId).texture&&s.util.sizeFromShape(e.shape)0&&s.util.isString(n[0])){const r=n.map((e=>s.util.encodeString(e)));o=this.write(r,e,t)}else o=this.write(n,e,t);return this.texData.get(o).usage=null,{dataId:o,shape:e,dtype:t}}makeOutput(e,t,n){const{dataId:o}=this.makeTensorInfo(e,t,n);return Object(s.engine)().makeTensorFromDataId(o,e,t,this)}unpackTensor(e){const t=new _.UnpackProgram(e.shape);return this.runWebGLProgram(t,[e],e.dtype)}packTensor(e){const t=new m.PackProgram(e.shape);return this.runWebGLProgram(t,[e],e.dtype,null,!0)}packedReshape(e,t){const n=[k.getBatchDim(e.shape),...k.getRowsCols(e.shape)],s={dtype:e.dtype,shape:n,dataId:e.dataId},o=[k.getBatchDim(t),...k.getRowsCols(t)],r=new h.ReshapePackedProgram(o,n),i=[n],a=this.runWebGLProgram(r,[s],e.dtype,i,!0);return{dataId:a.dataId,shape:t,dtype:a.dtype}}decode(e){const t=this.texData.get(e),{isPacked:n,shape:s,dtype:o}=t,a=k.getShapeAs3D(s);let u;const d=b.getDenseTexShape(a);u=n?new i.DecodeMatrixPackedProgram(a):new r.DecodeMatrixProgram(a);const l=[d];return{dtype:o,shape:s,dataId:this.runWebGLProgram(u,[{shape:a,dtype:o,dataId:e}],o,l,!0).dataId}}runWebGLProgram(e,t,n,o,r=!1){const i=this.makeTensorInfo(e.outputShape,n),a=this.texData.get(i.dataId);if(e.packedOutput&&(a.isPacked=!0),e.outPackingScheme===b.PackingScheme.DENSE){const t=b.getDenseTexShape(e.outputShape);a.texShape=t.map((e=>2*e))}if(null!=e.outTexUsage&&(a.usage=e.outTexUsage),0===s.util.sizeFromShape(i.shape))return a.values=s.util.getTypedArrayFromDType(i.dtype,0),i;const u=[],d=t.map((t=>{if("complex64"===t.dtype)throw new Error("GPGPUProgram does not support complex64 input. For complex64 dtypes, please separate the program into real and imaginary parts.");let n=this.texData.get(t.dataId);if(null==n.texture){if(!e.packedInputs&&s.util.sizeFromShape(t.shape)<=Object(s.env)().getNumber("WEBGL_SIZE_UPLOAD_UNIFORM"))return{shape:t.shape,texData:null,isUniform:!0,uniformValues:n.values};e.packedInputs&&(n.isPacked=!0,n.shape=t.shape)}else if(!!n.isPacked!=!!e.packedInputs)t=n.isPacked?this.unpackTensor(t):this.packTensor(t),u.push(t),n=this.texData.get(t.dataId);else if(n.isPacked&&!k.isReshapeFree(n.shape,t.shape)){const e=t,s=t.shape;t.shape=n.shape,t=this.packedReshape(t,s),u.push(t),n=this.texData.get(t.dataId),e.shape=s}return this.uploadToGPU(t.dataId),{shape:t.shape,texData:n,isUniform:!1}}));this.uploadToGPU(i.dataId);const l={shape:i.shape,texData:a,isUniform:!1},c=f.makeShaderKey(e,d,l),p=this.getAndSaveBinary(c,(()=>f.compileProgram(this.gpgpu,e,d,l))),m=null!=this.activeTimers;let h;m&&(h=this.startTimer()),f.runProgram(this.gpgpu,p,d,l,o),u.forEach((e=>this.disposeIntermediateTensorInfo(e))),m&&(h=this.endTimer(h),this.activeTimers.push({name:e.constructor.name,query:this.getQueryTime(h)}));const j=Object(s.env)().get("WEBGL_FLUSH_THRESHOLD");if(j>0){const e=s.util.now();e-this.lastGlFlushTime>j&&(this.gpgpu.gl.flush(),this.lastGlFlushTime=e)}if(!Object(s.env)().getBool("WEBGL_LAZILY_UNPACK")&&a.isPacked&&!1===r){const e=this.unpackTensor(i);return this.disposeIntermediateTensorInfo(i),e}return i}compileAndRun(e,t,n,s,o=!1){n=n||t[0].dtype;return this.runWebGLProgram(e,t,n,s,o)}getAndSaveBinary(e,t){return e in this.binaryCache||(this.binaryCache[e]=t()),this.binaryCache[e]}getTextureManager(){return this.textureManager}dispose(){if(!this.disposed){if(!Object(s.env)().getBool("IS_TEST")){Object.keys(this.binaryCache).forEach((e=>{this.gpgpu.deleteProgram(this.binaryCache[e].webGLProgram),delete this.binaryCache[e]}))}this.textureManager.dispose(),null!=this.canvas&&"undefined"!=typeof HTMLCanvasElement&&this.canvas instanceof HTMLCanvasElement?this.canvas.remove():this.canvas=null,this.gpgpuCreatedLocally&&(this.gpgpu.program=null,this.gpgpu.dispose()),this.disposed=!0}}floatPrecision(){return null==this.floatPrecisionValue&&(this.floatPrecisionValue=Object(s.tidy)((()=>{if(!Object(s.env)().get("WEBGL_RENDER_FLOAT32_ENABLED")){const e=Object(s.env)().getBool("DEBUG");Object(s.env)().set("DEBUG",!1);const t=this.abs(Object(s.scalar)(1e-8)).dataSync()[0];if(Object(s.env)().set("DEBUG",e),t>0)return 32}return 16}))),this.floatPrecisionValue}epsilon(){return 32===this.floatPrecision()?x:y}uploadToGPU(e){const t=this.texData.get(e),{shape:n,dtype:o,values:r,texture:i,usage:a,isPacked:u}=t;if(null!=i)return;const c=null!=this.activeTimers;let f;c&&(f=s.util.now());let p=t.texShape;if(null==p&&(p=k.getTextureShapeFromLogicalShape(n,u),t.texShape=p),null!=r){const e=k.getShapeAs3D(n);let i,a=p[1],m=p[0];const h=r instanceof Uint8Array;u?([a,m]=b.getPackedMatrixTextureShapeWidthHeight(p[0],p[1]),i=new l.EncodeMatrixPackedProgram(e,h)):i=new d.EncodeMatrixProgram(e,h);const j=this.makeTensorInfo([m,a],o);this.texData.get(j.dataId).usage=h?b.TextureUsage.PIXELS:b.TextureUsage.UPLOAD,this.gpgpu.uploadDenseMatrixToTexture(this.getTexture(j.dataId),a,m,r);const g=[[m,a]],w=!0,_=this.runWebGLProgram(i,[j],o,g,w),v=this.texData.get(_.dataId);t.texture=v.texture,t.texShape=v.texShape,t.isPacked=v.isPacked,t.usage=v.usage,this.disposeIntermediateTensorInfo(j),this.texData.delete(_.dataId),t.values=null,c&&(this.uploadWaitMs+=s.util.now()-f)}else{const e=this.acquireTexture(p,a,o,u);t.texture=e}}convertAndCacheOnCPU(e,t){const n=this.texData.get(e),{dtype:s}=n;return this.releaseGPUData(e),null!=t&&(n.values=function(e,t){if("float32"===t||"complex64"===t)return e;if("int32"===t||"bool"===t){const n="int32"===t?new Int32Array(e.length):new Uint8Array(e.length);for(let t=0;t1024*this.numMBBeforeWarning*1024){const e=(this.numBytesInGPU/1024/1024).toFixed(2);this.warnedAboutMemory=!0,console.warn(`High memory usage in GPU: ${e} MB, most likely due to a memory leak`)}return this.textureManager.acquireTexture(e,t,s)}computeBytes(e,t){return e[0]*e[1]*s.util.bytesPerElement(t)}}S.nextDataId=0},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/base.js": +/*!***********************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/base.js ***! + \***********************************************************/ +/*! exports provided: version_webgl, MathBackendWebGL, setWebGLContext, GPGPUContext, gpgpu_util, webgl_util, forceHalfFloat, webgl */function(e,t,n){"use strict";n.r(t),n.d(t,"webgl",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./backend_webgl */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/backend_webgl.js"),r=n(/*! ./version */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/version.js");n.d(t,"version_webgl",(function(){return r.version}));var i=n(/*! ./webgl */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/webgl.js");n.d(t,"MathBackendWebGL",(function(){return i.MathBackendWebGL})),n.d(t,"setWebGLContext",(function(){return i.setWebGLContext})),n.d(t,"GPGPUContext",(function(){return i.GPGPUContext})),n.d(t,"gpgpu_util",(function(){return i.gpgpu_util})),n.d(t,"webgl_util",(function(){return i.webgl_util})),n.d(t,"forceHalfFloat",(function(){return i.forceHalfFloat})), /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2020 Google Inc. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -164,14 +145,14 @@ const r=Object(o.unaryKernelFunc)(s.Acosh,(e=>Math.acosh(e))),i={kernelName:s.Ac * limitations under the License. * ============================================================================= */ -const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>e+t)),a=Object(r.createComplexBinaryKernelImpl)(((e,t,n,s)=>({real:e+n,imag:t+s}))),d=Object(r.binaryKernelFunc)(s.Add,i,a),u={kernelName:s.Add,backendName:"cpu",kernelFunc:d}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AddN.js": -/*!************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AddN.js ***! - \************************************************************************/ -/*! exports provided: addN, addNConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"addN",(function(){return r})),n.d(t,"addNConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +s.device_util.isBrowser()&&Object(s.registerBackend)("webgl",(()=>new o.MathBackendWebGL),2);const a={forceHalfFloat:i.forceHalfFloat}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/batchnorm_gpu.js": +/*!********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/batchnorm_gpu.js ***! + \********************************************************************/ +/*! exports provided: BatchNormProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"BatchNormProgram",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2017 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -184,15 +165,14 @@ const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>e+t)),a=Object(r.createCo * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -function r(e){const{inputs:t,backend:n}=e,r=t;Object(o.assertNotComplex)(t,"addN");const i=r.map((e=>n.data.get(e.dataId).values)),a=Object(s.buffer)(r[0].shape,r[0].dtype),d=a.values;for(let e=0;en&&(n=o,s=e)}b[e]=s}return f.forEach((e=>n.disposeIntermediateTensorInfo(e))),n.makeTensorInfo(p,"int32",b)}const a={kernelName:s.ArgMax,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ArgMin.js": +const r="\n if (isnan(a)) return a;\n if (isnan(b)) return b;\n",i="return (a - b) * (a - b);";class a{constructor(e,t,n){this.variableNames=["A","B"],this.outputShape=s.backend_util.assertAndGetBroadcastShape(t,n),this.enableShapeUniforms=Object(o.useShapeUniforms)(this.outputShape.length),this.userCode=`\n float binaryOperation(float a, float b) {\n ${e}\n }\n\n void main() {\n float a = getAAtOutCoords();\n float b = getBAtOutCoords();\n setOutput(binaryOperation(a, b));\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/binaryop_packed_gpu.js": /*!**************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ArgMin.js ***! + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/binaryop_packed_gpu.js ***! \**************************************************************************/ -/*! exports provided: argMin, argMinConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"argMin",(function(){return i})),n.d(t,"argMinConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose.js"); +/*! exports provided: CHECK_NAN_SNIPPET, ELU_DER, NOT_EQUAL, BinaryOpPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"CHECK_NAN_SNIPPET",(function(){return a})),n.d(t,"ELU_DER",(function(){return u})),n.d(t,"NOT_EQUAL",(function(){return d})),n.d(t,"BinaryOpPackedProgram",(function(){return l}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./gpgpu_math */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/gpgpu_math.js"),r=n(/*! ./packing_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/packing_util.js"),i=n(/*! ./shader_compiler */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -269,119 +247,118 @@ function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{axis:d}=i;Object(o.as * limitations under the License. * ============================================================================= */ -function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{axis:d}=i;Object(o.assertNotComplex)(a,"argMin");let u=s.util.parseAxisParam(d,a.shape);const l=s.backend_util.getAxesPermutation(u,a.shape.length);let c=a;const f=[];null!=l&&(c=Object(r.transpose)({inputs:{x:a},backend:n,attrs:{perm:l}}),f.push(c),u=s.backend_util.getInnerMostAxes(u.length,c.shape.length)),u=[u[0]],s.backend_util.assertAxesAreInnerMostDims("argMin",u,c.shape.length);const[p,m]=s.backend_util.computeOutAndReduceShapes(c.shape,u),h=s.util.sizeFromShape(p),b=s.util.makeZerosTypedArray(h,"int32"),j=s.util.sizeFromShape(m),g=n.data.get(c.dataId).values;for(let e=0;en.disposeIntermediateTensorInfo(e))),n.makeTensorInfo(p,"int32",b)}const a={kernelName:s.ArgMin,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Asin.js": -/*!************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Asin.js ***! - \************************************************************************/ -/*! exports provided: asin, asinConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"asin",(function(){return r})),n.d(t,"asinConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +const a="\n result.r = isNaN.r > 0. ? NAN : result.r;\n result.g = isNaN.g > 0. ? NAN : result.g;\n result.b = isNaN.b > 0. ? NAN : result.b;\n result.a = isNaN.a > 0. ? NAN : result.a;\n",u="\n vec4 bGTEZero = vec4(greaterThanEqual(b, vec4(0.)));\n return (bGTEZero * a) + ((vec4(1.0) - bGTEZero) * (a * (b + vec4(1.0))));\n",d="\n return vec4(notEqual(a, b));\n";class l{constructor(e,t,n,a=!1){this.variableNames=["A","B"],this.supportsBroadcasting=!0,this.packedInputs=!0,this.packedOutput=!0,this.outputShape=s.backend_util.assertAndGetBroadcastShape(t,n);const u=this.outputShape.length;this.enableShapeUniforms=Object(o.useShapeUniforms)(u);let d="";if(a)if(0===u||1===s.util.sizeFromShape(this.outputShape))d="\n result.y = 0.;\n result.z = 0.;\n result.w = 0.;\n ";else{if(d=`\n ${Object(i.getCoordsDataType)(u)} coords = getOutputCoords();\n `,1===u)this.enableShapeUniforms?d+="\n result.y = (coords + 1) >= outShape ? 0. : result.y;\n result.z = 0.;\n result.w = 0.;\n ":d+=`\n result.y = (coords + 1) >= ${this.outputShape[0]} ? 0. : result.y;\n result.z = 0.;\n result.w = 0.;\n `;else{const e=Object(r.getChannels)("coords",u);this.enableShapeUniforms?d+=`\n bool nextRowOutOfBounds =\n (${e[u-2]} + 1) >= outShape[${u} - 2];\n bool nextColOutOfBounds =\n (${e[u-1]} + 1) >= outShape[${u} - 1];\n result.y = nextColOutOfBounds ? 0. : result.y;\n result.z = nextRowOutOfBounds ? 0. : result.z;\n result.w = nextColOutOfBounds || nextRowOutOfBounds ? 0. : result.w;\n `:d+=`\n bool nextRowOutOfBounds =\n (${e[u-2]} + 1) >= ${this.outputShape[u-2]};\n bool nextColOutOfBounds =\n (${e[u-1]} + 1) >= ${this.outputShape[u-1]};\n result.y = nextColOutOfBounds ? 0. : result.y;\n result.z = nextRowOutOfBounds ? 0. : result.z;\n result.w = nextColOutOfBounds || nextRowOutOfBounds ? 0. : result.w;\n `}}this.userCode=`\n vec4 binaryOperation(vec4 a, vec4 b) {\n ${e}\n }\n\n void main() {\n vec4 a = getAAtOutCoords();\n vec4 b = getBAtOutCoords();\n\n vec4 result = binaryOperation(a, b);\n ${d}\n\n setOutput(result);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/canvas_util.js": +/*!******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/canvas_util.js ***! + \******************************************************************/ +/*! exports provided: clearWebGLContext, setWebGLContext, getWebGLContext */function(e,t,n){"use strict";n.r(t),n.d(t,"clearWebGLContext",(function(){return r})),n.d(t,"setWebGLContext",(function(){return i})),n.d(t,"getWebGLContext",(function(){return a})); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the License); + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -const r=Object(o.unaryKernelFunc)(s.Asin,(e=>Math.asin(e))),i={kernelName:s.Asin,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Asinh.js": -/*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Asinh.js ***! - \*************************************************************************/ -/*! exports provided: asinh, asinhConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"asinh",(function(){return r})),n.d(t,"asinhConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +const s={},o={alpha:!1,antialias:!1,premultipliedAlpha:!1,preserveDrawingBuffer:!1,depth:!1,stencil:!1,failIfMajorPerformanceCaveat:!0};function r(e){delete s[e]}function i(e,t){s[e]=t}function a(e){if(!(e in s)){const t=function(e){if(1!==e&&2!==e)throw new Error("Cannot get WebGL rendering context, WebGL is disabled.");const t=function(e){if("undefined"!=typeof OffscreenCanvas&&2===e)return new OffscreenCanvas(300,150);if("undefined"!=typeof document)return document.createElement("canvas");throw new Error("Cannot create a canvas in this context")}(e);if(t.addEventListener("webglcontextlost",(t=>{t.preventDefault(),delete s[e]}),!1),1===e)return t.getContext("webgl",o)||t.getContext("experimental-webgl",o);return t.getContext("webgl2",o)}(e);if(null===t)return console.log("Could not get context for WebGL version",e),null;s[e]=t}const t=s[e];return t.isContextLost()?(delete s[e],a(e)):(t.disable(t.DEPTH_TEST),t.disable(t.STENCIL_TEST),t.disable(t.BLEND),t.disable(t.DITHER),t.disable(t.POLYGON_OFFSET_FILL),t.disable(t.SAMPLE_COVERAGE),t.enable(t.SCISSOR_TEST),t.enable(t.CULL_FACE),t.cullFace(t.BACK),s[e])}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/clip_gpu.js": +/*!***************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/clip_gpu.js ***! + \***************************************************************/ +/*! exports provided: ClipProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ClipProgram",(function(){return s})); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the License); + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -const r=Object(o.unaryKernelFunc)(s.Asinh,(e=>Math.asinh(e))),i={kernelName:s.Asinh,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atan.js": -/*!************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atan.js ***! - \************************************************************************/ -/*! exports provided: atan, atanConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"atan",(function(){return r})),n.d(t,"atanConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +class s{constructor(e){this.variableNames=["A"],this.customUniforms=[{name:"minVal",type:"float"},{name:"maxVal",type:"float"}],this.outputShape=e,this.userCode="\n\n void main() {\n float value = getAAtOutCoords();\n if (isnan(value)) {\n setOutput(value);\n return;\n }\n\n setOutput(clamp(value, minVal, maxVal));\n }\n "}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/clip_packed_gpu.js": +/*!**********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/clip_packed_gpu.js ***! + \**********************************************************************/ +/*! exports provided: ClipPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ClipPackedProgram",(function(){return s})); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the License); + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -const r=Object(o.unaryKernelFunc)(s.Atan,(e=>Math.atan(e))),i={kernelName:s.Atan,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atan2.js": -/*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atan2.js ***! - \*************************************************************************/ -/*! exports provided: atan2Impl, atan2, atan2Config */function(e,t,n){"use strict";n.r(t),n.d(t,"atan2Impl",(function(){return i})),n.d(t,"atan2",(function(){return a})),n.d(t,"atan2Config",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); +class s{constructor(e){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.customUniforms=[{name:"minVal",type:"float"},{name:"maxVal",type:"float"}],this.outputShape=e,this.userCode="\n void main() {\n vec4 value = getAAtOutCoords();\n\n if (any(isnan(value))) {\n setOutput(value);\n return;\n }\n\n setOutput(clamp(value, vec4(minVal), vec4(maxVal)));\n }\n "}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/complex_abs_gpu.js": +/*!**********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/complex_abs_gpu.js ***! + \**********************************************************************/ +/*! exports provided: ComplexAbsProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ComplexAbsProgram",(function(){return s})); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the License); + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>Math.atan2(e,t))),a=Object(r.binaryKernelFunc)(s.Atan2,i),d={kernelName:s.Atan2,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atanh.js": -/*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atanh.js ***! - \*************************************************************************/ -/*! exports provided: atanh, atanhConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"atanh",(function(){return r})),n.d(t,"atanhConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +class s{constructor(e){this.variableNames=["real","imag"],this.outputShape=e,this.userCode="\n void main() {\n float re = abs(getRealAtOutCoords());\n float im = abs(getImagAtOutCoords());\n float mx = max(re, im);\n\n // sadly the length function in glsl is not underflow-safe\n // (at least not on Intel GPUs). So the safe solution is\n // to ensure underflow-safety in all cases.\n setOutput(\n mx == 0.0 ? 0.0 : mx * length(vec2(1, min(re, im)/mx))\n );\n }\n "}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/concat_gpu.js": +/*!*****************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/concat_gpu.js ***! + \*****************************************************************/ +/*! exports provided: ConcatProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ConcatProgram",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the License); + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -const r=Object(o.unaryKernelFunc)(s.Atanh,(e=>Math.atanh(e))),i={kernelName:s.Atanh,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPool.js": -/*!***************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPool.js ***! - \***************************************************************************/ -/*! exports provided: avgPool, avgPoolConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"avgPool",(function(){return a})),n.d(t,"avgPoolConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ../utils/pool_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/pool_utils.js"),i=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Identity.js"); + */class o{constructor(e){this.outputShape=[],this.outputShape=s.backend_util.computeOutShape(e,1),this.variableNames=e.map(((e,t)=>`T${t}`));const t=new Array(e.length-1);t[0]=e[0][1];for(let n=1;nMath.atanh(e))),i={kernelName:s.At * limitations under the License. * ============================================================================= */ -function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:d}=t;Object(o.assertNotComplex)(d,"avgPool");const{filterSize:u,strides:l,pad:c,dimRoundingMode:f}=a;s.util.assert(s.backend_util.eitherStridesOrDilationsAreOne(l,1),(()=>`Error in avgPool: Either strides or dilations must be 1. Got strides ${l} and dilations '1'`));const p=s.backend_util.computePool2DInfo(d.shape,u,l,1,c,f);let m;if(1===p.filterWidth&&1===p.filterHeight&&s.util.arraysEqual(p.inShape,p.outShape))m=Object(i.identity)({inputs:{x:d},backend:n});else{const e=n.data.get(d.dataId).values,t=s.util.computeStrides(d.shape),o=Object(r.pool)(e,d.shape,d.dtype,t,p,"avg");m=n.makeTensorInfo(p.outShape,d.dtype,o.values)}return m}const d={kernelName:s.AvgPool,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPool3D.js": -/*!*****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPool3D.js ***! - \*****************************************************************************/ -/*! exports provided: avgPool3D, avgPool3DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"avgPool3D",(function(){return i})),n.d(t,"avgPool3DConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ../utils/pool_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/pool_utils.js"); +class i{constructor(e,t){this.packedInputs=!0,this.packedOutput=!0,this.outputShape=[],this.outputShape=s.backend_util.computeOutShape(e,t);const n=this.outputShape,i=n.length,u=Object(r.getCoordsDataType)(i),d=Object(o.getChannels)("coords",i),l=["x","y","z","w","u","v"].slice(0,i);this.variableNames=e.map(((e,t)=>`T${t}`));const c=new Array(e.length-1);c[0]=e[0][t];for(let n=1;n= ${c[e-1]}) {\n return getChannel(\n getT${e}(${a(l,f,t)}),\n vec2(${a(p,f,t)}));\n }`}const b=c.length,j=c[c.length-1];h+=`\n return getChannel(\n getT${b}(${a(l,f,j)}),\n vec2(${a(p,f,j)}));`,this.userCode=`\n float getValue(${l.map((e=>"int "+e))}) {\n ${h}\n }\n\n void main() {\n ${u} coords = getOutputCoords();\n vec4 result = vec4(getValue(${d}), 0., 0., 0.);\n\n ${d[i-1]} = ${d[i-1]} + 1;\n if (${d[i-1]} < ${n[i-1]}) {\n result.g = getValue(${d});\n }\n\n ${d[i-2]} = ${d[i-2]} + 1;\n if (${d[i-2]} < ${n[i-2]}) {\n result.a = getValue(${d});\n }\n\n ${d[i-1]} = ${d[i-1]} - 1;\n if (${d[i-2]} < ${n[i-2]} &&\n ${d[i-1]} < ${n[i-1]}) {\n result.b = getValue(${d});\n }\n setOutput(result);\n }\n `}}function a(e,t,n){const s=e.indexOf(t);return e.map(((e,t)=>t===s?`${e} - ${n}`:e)).join()}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu.js": +/*!************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu.js ***! + \************************************************************************/ +/*! exports provided: Conv2DDerFilterProgram, Conv2DDerInputProgram, Conv3DDerFilterProgram, Conv3DDerInputProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"Conv2DDerFilterProgram",(function(){return s})),n.d(t,"Conv2DDerInputProgram",(function(){return o})),n.d(t,"Conv3DDerFilterProgram",(function(){return r})),n.d(t,"Conv3DDerInputProgram",(function(){return i})); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2017 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -416,14 +393,14 @@ function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:d}=t;Object(o.assertNotComp * limitations under the License. * ============================================================================= */ -function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{filterSize:d,strides:u,pad:l,dimRoundingMode:c,dataFormat:f}=i;Object(o.assertNotComplex)(a,"avgPool3d");const p=s.backend_util.computePool3DInfo(a.shape,d,u,1,l,c,f),m=n.data.get(a.dataId).values,h=Object(r.pool3d)(m,a.shape,a.dtype,s.util.computeStrides(a.shape),p,"avg");return n.makeTensorInfo(h.shape,"float32",h.values)}const a={kernelName:s.AvgPool3D,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPool3DGrad.js": -/*!*********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPool3DGrad.js ***! - \*********************************************************************************/ -/*! exports provided: avgPool3DGrad, avgPool3DGradConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"avgPool3DGrad",(function(){return r})),n.d(t,"avgPool3DGradConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +class s{constructor(e){this.variableNames=["x","dy"],this.outputShape=e.filterShape;const t=e.strideHeight,n=e.strideWidth,s=e.padInfo.top,o=e.padInfo.left,r="channelsLast"===e.dataFormat;this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int wR = coords.x;\n int wC = coords.y;\n int d1 = coords.z;\n int d2 = coords.w;\n\n // Convolve x(?, ?, d1) with dy(:, :, d2) to get dw(wR, wC, d1, d2).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n\n for (int b = 0; b < ${e.batchSize}; b++) {\n for (int yR = 0; yR < ${e.outHeight}; yR++) {\n int xR = wR + yR * ${t} - ${s};\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int yC = 0; yC < ${e.outWidth}; yC++) {\n int xC = wC + yC * ${n} - ${o};\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n if (${r}) {\n float dyValue = getDy(b, yR, yC, d2);\n float xValue = getX(b, xR, xC, d1);\n dotProd += (xValue * dyValue);\n } else {\n float dyValue = getDy(b, d2, yR, yC);\n float xValue = getX(b, d1, xR, xC);\n dotProd += (xValue * dyValue);\n }\n\n }\n }\n }\n setOutput(dotProd);\n }\n `}}class o{constructor(e){this.variableNames=["dy","W"],this.outputShape=e.inShape;const t=e.filterHeight,n=e.filterWidth,s=e.strideHeight,o=e.strideWidth,r="channelsLast"===e.dataFormat,i=t-1-e.padInfo.top,a=n-1-e.padInfo.left,u=r?1:2,d=r?2:3,l=r?3:1;this.userCode=`\n const ivec2 pads = ivec2(${i}, ${a});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d1 = coords[${l}];\n\n ivec2 dyCorner = ivec2(coords[${u}], coords[${d}]) - pads;\n int dyRCorner = dyCorner.x;\n int dyCCorner = dyCorner.y;\n\n // Convolve dy(?, ?, d2) with w(:, :, d1, d2) to compute dx(xR, xC, d1).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < ${t}; wR++) {\n float dyR = float(dyRCorner + wR) / ${s}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n int wRPerm = ${t} - 1 - wR;\n\n for (int wC = 0; wC < ${n}; wC++) {\n float dyC = float(dyCCorner + wC) / ${o}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n int wCPerm = ${n} - 1 - wC;\n\n for (int d2 = 0; d2 < ${e.outChannels}; d2++) {\n\n if (${r}) {\n float xValue = getDy(batch, idyR, idyC, d2);\n float wValue = getW(wRPerm, wCPerm, d1, d2);\n dotProd += xValue * wValue;\n } else {\n float xValue = getDy(batch, d2, idyR, idyC);\n float wValue = getW(wRPerm, wCPerm, d1, d2);\n dotProd += xValue * wValue;\n }\n\n }\n }\n }\n setOutput(dotProd);\n }\n `}}class r{constructor(e){this.variableNames=["x","dy"],this.outputShape=e.filterShape;const t=e.strideDepth,n=e.strideHeight,s=e.strideWidth,o=e.padInfo.front,r=e.padInfo.top,i=e.padInfo.left;this.userCode=`\n void main() {\n ivec5 coords = getOutputCoords();\n int wF = coords.x;\n int wR = coords.y;\n int wC = coords.z;\n int d1 = coords.w;\n int d2 = coords.u;\n\n float dotProd = 0.0;\n\n for (int b = 0; b < ${e.batchSize}; b++) {\n for (int yF = 0; yF < ${e.outDepth}; yF++) {\n int xF = wF + yF * ${t} - ${o};\n\n if (xF < 0 || xF >= ${e.inDepth}) {\n continue;\n }\n\n for (int yR = 0; yR < ${e.outHeight}; yR++) {\n int xR = wR + yR * ${n} - ${r};\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int yC = 0; yC < ${e.outWidth}; yC++) {\n int xC = wC + yC * ${s} - ${i};\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n float dyValue = getDy(b, yF, yR, yC, d2);\n float xValue = getX(b, xF, xR, xC, d1);\n dotProd += (xValue * dyValue);\n }\n }\n }\n }\n setOutput(dotProd);\n }\n `}}class i{constructor(e){this.variableNames=["dy","W"],this.outputShape=e.inShape;const t=e.filterDepth,n=e.filterHeight,s=e.filterWidth,o=e.strideDepth,r=e.strideHeight,i=e.strideWidth,a=t-1-e.padInfo.front,u=n-1-e.padInfo.top,d=s-1-e.padInfo.left;this.userCode=`\n const ivec3 pads = ivec3(${a}, ${u}, ${d});\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int d1 = coords.u;\n\n\n ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads;\n int dyFCorner = dyCorner.x;\n int dyRCorner = dyCorner.y;\n int dyCCorner = dyCorner.z;\n\n float dotProd = 0.0;\n for (int wF = 0; wF < ${t}; wF++) {\n float dyF = float(dyFCorner + wF) / ${o}.0;\n\n if (dyF < 0.0 || dyF >= ${e.outDepth}.0 || fract(dyF) > 0.0) {\n continue;\n }\n int idyF = int(dyF);\n\n int wFPerm = ${t} - 1 - wF;\n\n for (int wR = 0; wR < ${n}; wR++) {\n float dyR = float(dyRCorner + wR) / ${r}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 ||\n fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n int wRPerm = ${n} - 1 - wR;\n\n for (int wC = 0; wC < ${s}; wC++) {\n float dyC = float(dyCCorner + wC) / ${i}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n int wCPerm = ${s} - 1 - wC;\n\n for (int d2 = 0; d2 < ${e.outChannels}; d2++) {\n float xValue = getDy(batch, idyF, idyR, idyC, d2);\n float wValue = getW(wFPerm, wRPerm, wCPerm, d1, d2);\n dotProd += xValue * wValue;\n }\n }\n }\n }\n setOutput(dotProd);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu_depthwise.js": +/*!**********************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu_depthwise.js ***! + \**********************************************************************************/ +/*! exports provided: DepthwiseConv2DDerFilterProgram, DepthwiseConv2DDerInputProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"DepthwiseConv2DDerFilterProgram",(function(){return s})),n.d(t,"DepthwiseConv2DDerInputProgram",(function(){return o})); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -437,14 +414,14 @@ function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{filterSize:d,strides: * limitations under the License. * ============================================================================= */ -function r(e){const{inputs:t,backend:n,attrs:r}=e,{dy:i,input:a}=t,{filterSize:d,strides:u,pad:l,dimRoundingMode:c}=r;Object(o.assertNotComplex)([i,a],"avgPool3DGrad");const f=s.backend_util.computePool3DInfo(a.shape,d,u,1,l,c),p=f.strideDepth,m=f.strideHeight,h=f.strideWidth,b=f.filterDepth,j=f.filterHeight,g=f.filterWidth,w=f.dilationDepth,_=f.dilationHeight,k=f.dilationWidth,v=f.effectiveFilterDepth,x=f.effectiveFilterHeight,y=f.effectiveFilterWidth,O=v-1-f.padInfo.front,I=y-1-f.padInfo.left,C=x-1-f.padInfo.top,S=Object(s.buffer)(a.shape,"float32"),T=1/(b*j*g),N=n.bufferSync(i);for(let e=0;e=f.outDepth||Math.floor(s)!==s))for(let n=0;n=f.outHeight||Math.floor(o)!==o))for(let n=0;n=f.outWidth||Math.floor(r)!==r)continue;d+=N.get(e,s,o,r,t)}}}S.set(d*T,e,n,s,o,t)}return n.makeTensorInfo(S.shape,S.dtype,S.values)}const i={kernelName:s.AvgPool3DGrad,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPoolGrad.js": -/*!*******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPoolGrad.js ***! - \*******************************************************************************/ -/*! exports provided: avgPoolGrad, avgPoolGradConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"avgPoolGrad",(function(){return r})),n.d(t,"avgPoolGradConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +class s{constructor(e){this.variableNames=["x","dy"],this.outputShape=e.filterShape;const t=e.strideHeight,n=e.strideWidth,s=e.padInfo.top,o=e.padInfo.left,r=e.outChannels/e.inChannels;this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int wR = coords.x;\n int wC = coords.y;\n int d1 = coords.z;\n int dm = coords.w;\n int d2 = d1 * ${r} + dm;\n\n float dotProd = 0.0;\n\n // TO DO: Vec4 over the batch size\n for (int b = 0; b < ${e.batchSize}; b++) {\n for (int yR = 0; yR < ${e.outHeight}; yR++) {\n int xR = wR + yR * ${t} - ${s};\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int yC = 0; yC < ${e.outWidth}; yC++) {\n int xC = wC + yC * ${n} - ${o};\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n float dyValue = getDy(b, yR, yC, d2);\n float xValue = getX(b, xR, xC, d1);\n dotProd += (xValue * dyValue);\n }\n }\n }\n setOutput(dotProd);\n }\n `}}class o{constructor(e){this.variableNames=["dy","W"],this.outputShape=e.inShape;const t=e.filterHeight,n=e.filterWidth,s=e.strideHeight,o=e.strideWidth,r=t-1-e.padInfo.top,i=n-1-e.padInfo.left,a=e.outChannels/e.inChannels;this.userCode=`\n const ivec2 pads = ivec2(${r}, ${i});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d1 = coords[3];\n ivec2 dyCorner = coords.yz - pads;\n int dyRCorner = dyCorner.x;\n int dyCCorner = dyCorner.y;\n\n float dotProd = 0.0;\n\n for (int wR = 0; wR < ${t}; wR++) {\n float dyR = float(dyRCorner + wR) / ${s}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n int wRPerm = ${t} - 1 - wR;\n\n for (int wC = 0; wC < ${n}; wC++) {\n float dyC = float(dyCCorner + wC) / ${o}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n int wCPerm = ${n} - 1 - wC;\n\n // TO DO: Vec4 over the channelMul\n for (int dm = 0; dm < ${a}; dm++) {\n int d2 = d1 * ${a} + dm;\n float xValue = getDy(batch, idyR, idyC, d2);\n float wValue = getW(wRPerm, wCPerm, d1, dm);\n dotProd += xValue * wValue;\n }\n }\n }\n setOutput(dotProd);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/conv_gpu.js": +/*!***************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/conv_gpu.js ***! + \***************************************************************/ +/*! exports provided: Conv2DProgram, Conv3DProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"Conv2DProgram",(function(){return s})),n.d(t,"Conv3DProgram",(function(){return o})); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2017 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -458,35 +435,34 @@ function r(e){const{inputs:t,backend:n,attrs:r}=e,{dy:i,input:a}=t,{filterSize:d * limitations under the License. * ============================================================================= */ -function r(e){const{inputs:t,backend:n,attrs:r}=e,{dy:i,input:a}=t,d=a;Object(o.assertNotComplex)([i,a],"avgPoolGrad");const{filterSize:u,strides:l,pad:c}=r,f=s.backend_util.computePool2DInfo(d.shape,u,l,1,c),p=f.strideHeight,m=f.strideWidth,h=f.filterHeight,b=f.filterWidth,j=f.dilationHeight,g=f.dilationWidth,w=f.effectiveFilterHeight,_=f.effectiveFilterWidth,k=_-1-f.padInfo.left,v=w-1-f.padInfo.top,x=Object(s.buffer)(d.shape,"float32"),y=1/(h*b),O=n.data.get(i.dataId).values,I=Object(s.buffer)(i.shape,"float32",O);for(let e=0;e=f.outHeight||Math.floor(s)!==s))for(let n=0;n<_;n+=g){const o=(r+n)/m;if(o<0||o>=f.outWidth||Math.floor(o)!==o)continue;i+=I.get(e,s,o,t)}}x.set(i*y,e,n,s,t)}return n.makeTensorInfo(x.shape,x.dtype,x.values)}const i={kernelName:s.AvgPoolGrad,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchMatMul.js": -/*!*******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchMatMul.js ***! - \*******************************************************************************/ -/*! exports provided: batchMatMul, batchMatMulConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"batchMatMul",(function(){return i})),n.d(t,"batchMatMulConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"); +class s{constructor(e,t=!1,n=null,s=!1,o=!1){this.variableNames=["x","W"],this.outputShape=e.outShape;const r=e.padInfo.top,i=e.padInfo.left,a=e.strideHeight,u=e.strideWidth,d=e.dilationHeight,l=e.dilationWidth,c=e.filterHeight,f=e.filterWidth,p=4*Math.floor(e.inChannels/4),m=e.inChannels%4,h="channelsLast"===e.dataFormat,b=h?1:2,j=h?2:3,g=h?3:1;let w="",_="";n&&(w=s?`float activation(float a) {\n float b = getPreluActivationWeightsAtOutCoords();\n ${n}\n }`:o?`float activation(float a) {\n float b = getLeakyreluAlphaAtOutCoords();\n ${n}\n }`:`\n float activation(float x) {\n ${n}\n }\n `,_="result = activation(result);");const k=t?"result += getBiasAtOutCoords();":"";t&&this.variableNames.push("bias"),s&&this.variableNames.push("preluActivationWeights"),o&&this.variableNames.push("leakyreluAlpha"),this.userCode=`\n ${w}\n\n const ivec2 strides = ivec2(${a}, ${u});\n const ivec2 pads = ivec2(${r}, ${i});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d2 = coords[${g}];\n\n ivec2 xRCCorner =\n ivec2(coords[${b}], coords[${j}]) * strides - pads;\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // Convolve x(?, ?, d1) with w(:, :, d1, d2) to get y(yR, yC, d2).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < ${c}; wR++) {\n int xR = xRCorner + wR * ${d};\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${f}; wC++) {\n int xC = xCCorner + wC * ${l};\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n for (int d1 = 0; d1 < ${p}; d1 += 4) {\n vec4 wValues = vec4(\n getW(wR, wC, d1, d2),\n getW(wR, wC, d1 + 1, d2),\n getW(wR, wC, d1 + 2, d2),\n getW(wR, wC, d1 + 3, d2)\n );\n\n if (${h}) {\n vec4 xValues = vec4(\n getX(batch, xR, xC, d1),\n getX(batch, xR, xC, d1 + 1),\n getX(batch, xR, xC, d1 + 2),\n getX(batch, xR, xC, d1 + 3)\n );\n dotProd += dot(xValues, wValues);\n } else {\n vec4 xValues = vec4(\n getX(batch, d1, xR, xC),\n getX(batch, d1 + 1, xR, xC),\n getX(batch, d1 + 2, xR, xC),\n getX(batch, d1 + 3, xR, xC)\n );\n dotProd += dot(xValues, wValues);\n }\n }\n\n if (${1===m}) {\n\n if (${h}) {\n dotProd +=\n getX(batch, xR, xC, ${p}) *\n getW(wR, wC, ${p}, d2);\n } else {\n dotProd +=\n getX(batch, ${p}, xR, xC) *\n getW(wR, wC, ${p}, d2);\n }\n\n } else if (${2===m}) {\n vec2 wValues = vec2(\n getW(wR, wC, ${p}, d2),\n getW(wR, wC, ${p} + 1, d2)\n );\n\n if (${h}) {\n vec2 xValues = vec2(\n getX(batch, xR, xC, ${p}),\n getX(batch, xR, xC, ${p} + 1)\n );\n dotProd += dot(xValues, wValues);\n } else {\n vec2 xValues = vec2(\n getX(batch, ${p}, xR, xC),\n getX(batch, ${p} + 1, xR, xC)\n );\n dotProd += dot(xValues, wValues);\n }\n\n } else if (${3===m}) {\n vec3 wValues = vec3(\n getW(wR, wC, ${p}, d2),\n getW(wR, wC, ${p} + 1, d2),\n getW(wR, wC, ${p} + 2, d2)\n );\n\n if (${h}) {\n vec3 xValues = vec3(\n getX(batch, xR, xC, ${p}),\n getX(batch, xR, xC, ${p} + 1),\n getX(batch, xR, xC, ${p} + 2)\n );\n dotProd += dot(xValues, wValues);\n } else {\n vec3 xValues = vec3(\n getX(batch, ${p}, xR, xC),\n getX(batch, ${p} + 1, xR, xC),\n getX(batch, ${p} + 2, xR, xC)\n );\n dotProd += dot(xValues, wValues);\n }\n\n }\n }\n }\n\n float result = dotProd;\n ${k}\n ${_}\n setOutput(result);\n }\n `}}class o{constructor(e){this.variableNames=["x","W"],this.outputShape=e.outShape;const t=e.padInfo.front,n=e.padInfo.top,s=e.padInfo.left,o=e.strideDepth,r=e.strideHeight,i=e.strideWidth,a=e.dilationDepth,u=e.dilationHeight,d=e.dilationWidth,l=e.filterDepth,c=e.filterHeight,f=e.filterWidth,p=4*Math.floor(e.inChannels/4),m=e.inChannels%4;this.userCode=`\n const ivec3 strides = ivec3(${o}, ${r}, ${i});\n const ivec3 pads = ivec3(${t}, ${n}, ${s});\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int d2 = coords.u;\n\n ivec3 xFRCCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads;\n int xFCorner = xFRCCorner.x;\n int xRCorner = xFRCCorner.y;\n int xCCorner = xFRCCorner.z;\n\n // Convolve x(?, ?, ?, d1) with w(:, :, :, d1, d2) to get\n // y(yF, yR, yC, d2). ? = to be determined. : = across all\n // values in that axis.\n float dotProd = 0.0;\n for (int wF = 0; wF < ${l}; wF++) {\n int xF = xFCorner + wF * ${a};\n\n if (xF < 0 || xF >= ${e.inDepth}) {\n continue;\n }\n\n for (int wR = 0; wR < ${c}; wR++) {\n int xR = xRCorner + wR * ${u};\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${f}; wC++) {\n int xC = xCCorner + wC * ${d};\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n for (int d1 = 0; d1 < ${p}; d1 += 4) {\n vec4 xValues = vec4(\n getX(batch, xF, xR, xC, d1),\n getX(batch, xF, xR, xC, d1 + 1),\n getX(batch, xF, xR, xC, d1 + 2),\n getX(batch, xF, xR, xC, d1 + 3)\n );\n vec4 wValues = vec4(\n getW(wF, wR, wC, d1, d2),\n getW(wF, wR, wC, d1 + 1, d2),\n getW(wF, wR, wC, d1 + 2, d2),\n getW(wF, wR, wC, d1 + 3, d2)\n );\n\n dotProd += dot(xValues, wValues);\n }\n\n if (${1===m}) {\n dotProd +=\n getX(batch, xF, xR, xC, ${p}) *\n getW(wF, wR, wC, ${p}, d2);\n } else if (${2===m}) {\n vec2 xValues = vec2(\n getX(batch, xF, xR, xC, ${p}),\n getX(batch, xF, xR, xC, ${p} + 1)\n );\n vec2 wValues = vec2(\n getW(wF, wR, wC, ${p}, d2),\n getW(wF, wR, wC, ${p} + 1, d2)\n );\n dotProd += dot(xValues, wValues);\n } else if (${3===m}) {\n vec3 xValues = vec3(\n getX(batch, xF, xR, xC, ${p}),\n getX(batch, xF, xR, xC, ${p} + 1),\n getX(batch, xF, xR, xC, ${p} + 2)\n );\n vec3 wValues = vec3(\n getW(wF, wR, wC, ${p}, d2),\n getW(wF, wR, wC, ${p} + 1, d2),\n getW(wF, wR, wC, ${p} + 2, d2)\n );\n dotProd += dot(xValues, wValues);\n }\n }\n }\n }\n setOutput(dotProd);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/conv_gpu_depthwise.js": +/*!*************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/conv_gpu_depthwise.js ***! + \*************************************************************************/ +/*! exports provided: DepthwiseConv2DProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"DepthwiseConv2DProgram",(function(){return o}));var s=n(/*! ./gpgpu_math */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/gpgpu_math.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the License); + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -function i(e){const{inputs:t,backend:n,attrs:i}=e,{a:a,b:d}=t,{transposeA:u,transposeB:l}=i;Object(o.assertNotComplex)([a,d],"matMul");const c=a.shape.length,f=d.shape.length,p=u?a.shape[c-2]:a.shape[c-1],m=l?d.shape[f-1]:d.shape[f-2],h=u?a.shape[c-1]:a.shape[c-2],b=l?d.shape[f-2]:d.shape[f-1],j=a.shape.slice(0,-2),g=d.shape.slice(0,-2),w=s.util.sizeFromShape(j),_=s.util.sizeFromShape(g),k=w===_||1===w||1===_;s.util.assert(c>=2&&f>=2&&k,(()=>`Error in matMul: the input batch dimensions must either be the same or at least one input batch dimension must be 1. Got input batch dimensions of (${j}) and (${g}).`));const v=(w>_?a.shape.slice(0,-2):d.shape.slice(0,-2)).concat([h,b]);s.util.assert(p===m,(()=>`Error in matMul: inner shapes (${p}) and (${m}) of Tensors with shapes ${a.shape} and ${d.shape} and transposeA=${u} and transposeB=${l} must match.`));const x=u?[w,p,h]:[w,h,p],y=l?[_,b,m]:[_,m,b],O=Object(r.reshape)({inputs:{x:a},backend:n,attrs:{shape:x}}),I=Object(r.reshape)({inputs:{x:d},backend:n,attrs:{shape:y}}),C=u?O.shape[1]:O.shape[2],S=u?O.shape[2]:O.shape[1],T=l?I.shape[1]:I.shape[2],N=Math.max(w,_),E=n.data.get(O.dataId).values,A=n.data.get(I.dataId).values,R=s.util.computeStrides(O.shape),F=s.util.computeStrides(I.shape),[$,M,D]=u?[R[0],1,R[1]]:[R[0],R[1],1],[P,B,L]=l?[1,F[1],F[0]]:[F[1],1,F[0]],z=S*T,G=Object(s.buffer)([N,S,T],O.dtype),W=G.values,U=n.blockSize;for(let e=0;e= inDims[0]) {\n continue;\n }\n\n for (int wC = 0; wC < ${a}; wC++) {\n int xC = xCCorner + wC * dilations[1];\n\n if (xC < 0 || xC >= inDims[1]) {\n continue;\n }\n\n float xVal = getX(batch, xR, xC, d1);\n float wVal = getW(wR, wC, d1, q);\n dotProd += xVal * wVal;\n }\n }\n\n float result = dotProd;\n ${c}\n ${l}\n setOutput(result);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/conv_packed_gpu_depthwise.js": +/*!********************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/conv_packed_gpu_depthwise.js ***! + \********************************************************************************/ +/*! exports provided: DepthwiseConvPacked2DProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"DepthwiseConvPacked2DProgram",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./gpgpu_math */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/gpgpu_math.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -500,14 +476,14 @@ function i(e){const{inputs:t,backend:n,attrs:i}=e,{a:a,b:d}=t,{transposeA:u,tran * limitations under the License. * ============================================================================= */ -function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i,scale:a,offset:d,mean:u,variance:l}=t;s.util.assert(u.shape.length===l.shape.length,(()=>"Batch normalization gradient requires mean and variance to have equal ranks.")),s.util.assert(null==d||u.shape.length===d.shape.length,(()=>"Batch normalization gradient requires mean and offset to have equal ranks.")),s.util.assert(null==a||u.shape.length===a.shape.length,(()=>"Batch normalization gradient requires mean and scale to have equal ranks.")),Object(o.assertNotComplex)([i,u,l,a,d],"batchNorm");let{varianceEpsilon:c}=r;null==c&&(c=.001);const f=n.data.get(i.dataId).values,p=n.data.get(u.dataId).values,m=n.data.get(l.dataId).values,h=a?n.data.get(a.dataId).values:new Float32Array([1]),b=d?n.data.get(d.dataId).values:new Float32Array([0]),j=new Float32Array(f.length),g=b.length,w=h.length,_=m.length,k=p.length;let v=0,x=0,y=0,O=0;for(let e=0;e=g&&(v=0),x>=k&&(x=0),y>=w&&(y=0),O>=_&&(O=0);return n.makeTensorInfo(i.shape,i.dtype,j)}const i={kernelName:s.FusedBatchNorm,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchToSpaceND.js": -/*!**********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchToSpaceND.js ***! - \**********************************************************************************/ -/*! exports provided: batchToSpaceND, batchToSpaceNDConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"batchToSpaceND",(function(){return d})),n.d(t,"batchToSpaceNDConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"),i=n(/*! ./Slice */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Slice.js"),a=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose.js"); +class r{constructor(e,t=!1,n=null,r=!1,i=!1){this.variableNames=["x","W"],this.packedInputs=!0,this.packedOutput=!0,this.customUniforms=[{name:"pads",type:"ivec2"},{name:"strides",type:"ivec2"},{name:"dilations",type:"ivec2"},{name:"inDims",type:"ivec2"}],this.outputShape=e.outShape,this.enableShapeUniforms=Object(o.useShapeUniforms)(this.outputShape.length);const a=e.outChannels/e.inChannels,u=e.padInfo.left,d=e.strideWidth,l=e.dilationWidth,c=e.filterHeight,f=e.filterWidth,p=f;let m="\n int xR; int xC; int xCOffset;\n vec4 wTexel; vec4 previous; vec4 final;";for(let e=0;e=0 && xR < inDims[0]) {\n `;for(let t=0;t<(p+1)/2;t++){const n=2*t;if(m+=`\n xC = xCCorner + ${n*l};\n `,1===d){if(n= 0 && xCOffset < inDims[1] && xTexelC${n}Ready == 0) {\n xTexelC${n} = getX(batch, xR, xCOffset, d1);\n\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${n}.zw = vec2(0.0);\n }\n xTexelC${n}Ready = 1;\n }\n `,m+=1===l&&n>0?`\n xC${n} = vec4(xTexelC${n-2}.zw, xTexelC${n}.xy);\n `:`\n xCOffset = xC + 1 - 2;\n\n if (xCOffset >= 0 && xCOffset < inDims[1]) {\n previous = getX(batch, xR, xCOffset, d1);\n\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= inDims[1]) {\n previous.zw = vec2(0.0);\n }\n\n xC${n} = vec4(previous.zw, xTexelC${n}.xy);\n } else {\n xC${n} = vec4(0.0, 0.0, xTexelC${n}.xy);\n }\n `):m+=`\n if (xC >= 0 && xC < inDims[1] && xTexelC${n}Ready == 0) {\n xTexelC${n} = getX(batch, xR, xC, d1);\n if (xC + 1 >= inDims[1]) {\n xTexelC${n}.zw = vec2(0.0);\n }\n xTexelC${n}Ready = 1;\n }\n\n xC${n} = xTexelC${n};\n `,n+1= 0 && xCOffset < inDims[1] && xTexelC${n+1}Ready == 0) {\n xTexelC${n+1} = getX(batch, xR, xCOffset, d1);\n\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${n+1}.zw = vec2(0.0);\n }\n xTexelC${n+1}Ready = 1;\n }\n `,l>1&&(m+=`\n xCOffset -= 2;\n if (xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${n}Ready == 0) {\n xTexelC${n} = getX(batch, xR, xCOffset, d1);\n xTexelC${n}Ready = 1;\n }\n `),m+=`\n xC${n+1} = vec4(xTexelC${n}.zw, xTexelC${n+1}.xy);\n `):m+=1===e?`\n xC${n+1} = xTexelC${n};\n `:`\n xCOffset = xC + ${e};\n\n if (xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${n+1}Ready == 0) {\n xTexelC${n+1} = getX(batch, xR, xCOffset, d1);\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${n+1}.zw = vec2(0.0);\n }\n xTexelC${n+1}Ready = 1;\n }\n\n xC${n+1} = xTexelC${n+1};\n `}}else n= 0 && xCOffset < inDims[1] && xTexelC${n}Ready == 0) {\n xTexelC${n} = getX(batch, xR, xCOffset, d1);\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${n}.zw = vec2(0.0);\n }\n xTexelC${n}Ready = 1;\n }\n\n if(xC + 1 >= 0 && xC + 1 < inDims[1] && xTexelC${n+1}Ready == 0) {\n xTexelC${n+1} = getX(batch, xR, xC + 1, d1);\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xC + 2 >= inDims[1]) {\n xTexelC${n+1}.zw = vec2(0.0);\n }\n xTexelC${n+1}Ready = 1;\n }\n\n xC${n} = vec4(xTexelC${n}.zw, xTexelC${n+1}.zw);\n `,n+1= 0 && xCOffset < inDims[1]) {\n final = getX(batch, xR, xCOffset, d1);\n }\n xC${n+1} = vec4(xTexelC${n+1}.xy, final.xy);\n `)):(m+=`\n if(xC >= 0 && xC < inDims[1] && xTexelC${n}Ready == 0) {\n xTexelC${n} = getX(batch, xR, xC, d1);\n if (xC + 1 >= inDims[1]) {\n xTexelC${n}.zw = vec2(0.0);\n }\n xTexelC${n}Ready = 1;\n }\n\n xCOffset = xC + strides[1];\n if(xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${n+1}Ready == 0) {\n xTexelC${n+1} = getX(batch, xR, xCOffset, d1);\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${n+1}.zw = vec2(0.);\n }\n xTexelC${n+1}Ready = 1;\n }\n\n xC${n} = vec4(\n xTexelC${n}.xy, xTexelC${n+1}.xy);\n `,n+1e*t)),p=s.backend_util.getReshaped(u.shape,l,f),m=s.backend_util.getPermuted(p.length,l.length),h=s.backend_util.getReshapedPermuted(u.shape,l,f),b=s.backend_util.getSliceBeginCoords(c,l.length),j=s.backend_util.getSliceSize(h,c,l.length),g=Object(r.reshape)({inputs:{x:u},backend:n,attrs:{shape:p}}),w=Object(a.transpose)({inputs:{x:g},backend:n,attrs:{perm:m}}),_=Object(r.reshape)({inputs:{x:w},backend:n,attrs:{shape:h}}),k=Object(i.slice)({inputs:{x:_},backend:n,attrs:{begin:b,size:j}});return n.disposeIntermediateTensorInfo(g),n.disposeIntermediateTensorInfo(w),n.disposeIntermediateTensorInfo(_),k}const u={kernelName:s.BatchToSpaceND,backendName:"cpu",kernelFunc:d}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Bincount.js": -/*!****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Bincount.js ***! - \****************************************************************************/ -/*! exports provided: bincount, bincountConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"bincount",(function(){return r})),n.d(t,"bincountConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Bincount_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Bincount_impl.js"); +class s{constructor(e,t,n,s,o){this.variableNames=["Image","Boxes","BoxInd"],this.outputShape=[];const[r,i,a,u]=e,[d]=t,[l,c]=n;this.outputShape=[d,l,c,u];const f="bilinear"===s?1:0,[p,m]=[i-1+".0",a-1+".0"],[h,b,j]=l>1?[""+(i-1)/(l-1),"(y2-y1) * height_ratio",`y1*${p} + float(y)*(height_scale)`]:["0.0","0.0",`0.5 * (y1+y2) * ${p}`],[g,w,_]=c>1?[""+(a-1)/(c-1),"(x2-x1) * width_ratio",`x1*${m} + float(x)*(width_scale)`]:["0.0","0.0",`0.5 * (x1+x2) * ${m}`];this.userCode=`\n const float height_ratio = float(${h});\n const float width_ratio = float(${g});\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int y = coords[1];\n int x = coords[2];\n int d = coords[3];\n\n // get box vals\n float y1 = getBoxes(b,0);\n float x1 = getBoxes(b,1);\n float y2 = getBoxes(b,2);\n float x2 = getBoxes(b,3);\n\n // get image in batch index\n int bInd = round(getBoxInd(b));\n if(bInd < 0 || bInd >= ${r}) {\n return;\n }\n\n float height_scale = ${b};\n float width_scale = ${w};\n\n float in_y = ${j};\n if( in_y < 0.0 || in_y > ${p} ) {\n setOutput(float(${o}));\n return;\n }\n float in_x = ${_};\n if( in_x < 0.0 || in_x > ${m} ) {\n setOutput(float(${o}));\n return;\n }\n\n vec2 sourceFracIndexCR = vec2(in_x,in_y);\n if(${f} == 1) {\n // Compute the four integer indices.\n ivec2 sourceFloorCR = ivec2(sourceFracIndexCR);\n ivec2 sourceCeilCR = ivec2(ceil(sourceFracIndexCR));\n\n float topLeft = getImage(b, sourceFloorCR.y, sourceFloorCR.x, d);\n float bottomLeft = getImage(b, sourceCeilCR.y, sourceFloorCR.x, d);\n float topRight = getImage(b, sourceFloorCR.y, sourceCeilCR.x, d);\n float bottomRight = getImage(b, sourceCeilCR.y, sourceCeilCR.x, d);\n\n vec2 fracCR = sourceFracIndexCR - vec2(sourceFloorCR);\n\n float top = topLeft + (topRight - topLeft) * fracCR.x;\n float bottom = bottomLeft + (bottomRight - bottomLeft) * fracCR.x;\n float newValue = top + (bottom - top) * fracCR.y;\n setOutput(newValue);\n } else {\n // Compute the coordinators of nearest neighbor point.\n ivec2 sourceNearestCR = ivec2(floor(\n sourceFracIndexCR + vec2(0.5,0.5)));\n float newValue = getImage(b, sourceNearestCR.y, sourceNearestCR.x, d);\n setOutput(newValue);\n }\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/cumsum_gpu.js": +/*!*****************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/cumsum_gpu.js ***! + \*****************************************************************/ +/*! exports provided: CumSumProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"CumSumProgram",(function(){return o}));var s=n(/*! ./shader_compiler */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js");class o{constructor(e,t,n){this.variableNames=["x"],this.customUniforms=[{name:"index",type:"float"}],this.outputShape=e;const o=e.length,a=t?"0.0":`getX(${r(o,"coords")})`,u=e[e.length-1];let d="",l="";t?(d=n?"end != "+(u-1):"end != 0",l=n?"end + 1":"end - 1"):(d=n?`end + pow2 < ${u}`:"end >= pow2",l=n?"end + pow2":"end - pow2"),this.userCode=`\n void main() {\n ${Object(s.getCoordsDataType)(o)} coords = getOutputCoords();\n int end = ${i(o,"coords")};\n float val = ${a};\n int pow2 = int(pow(2.0, index));\n if (${d}) {\n int idx = ${l};\n ${i(o,"coords")} = idx;\n val += getX(${r(o,"coords")});\n }\n setOutput(val);\n }\n `}}function r(e,t){if(1===e)return`${t}`;if(2===e)return`${t}.x, ${t}.y`;if(3===e)return`${t}.x, ${t}.y, ${t}.z`;if(4===e)return`${t}.x, ${t}.y, ${t}.z, ${t}.w`;throw Error(`Cumulative sum for rank ${e} is not yet supported`)}function i(e,t){if(1===e)return`${t}`;if(2===e)return`${t}.y`;if(3===e)return`${t}.z`;if(4===e)return`${t}.w`;throw Error(`Cumulative sum for rank ${e} is not yet supported`)}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/decode_matrix_gpu.js": +/*!************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/decode_matrix_gpu.js ***! + \************************************************************************/ +/*! exports provided: DecodeMatrixProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"DecodeMatrixProgram",(function(){return a}));var s=n(/*! ./glsl_version */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"),o=n(/*! ./gpgpu_math */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/gpgpu_math.js"),r=n(/*! ./shader_compiler_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js"),i=n(/*! ./tex_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/tex_util.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -542,14 +522,14 @@ function d(e){const{inputs:t,backend:n,attrs:d}=e,{x:u}=t,{blockShape:l,crops:c} * limitations under the License. * ============================================================================= */ -function r(e){const{inputs:t,backend:n,attrs:s}=e,{x:r,weights:i}=t,{size:a}=s,d=n.data.get(r.dataId).values,u=n.data.get(i.dataId).values,l=Object(o.bincountImpl)(d,u,i.dtype,i.shape,a);return n.makeTensorInfo([a],i.dtype,l)}const i={kernelName:s.Bincount,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Bincount_impl.js": -/*!*********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Bincount_impl.js ***! - \*********************************************************************************/ -/*! exports provided: bincountImpl, bincountReduceImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"bincountImpl",(function(){return o})),n.d(t,"bincountReduceImpl",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +class a{constructor(e){this.variableNames=["A"],this.packedInputs=!1,this.packedOutput=!0,this.outPackingScheme=i.PackingScheme.DENSE,this.customUniforms=[{name:"texShape",type:"ivec2"}];const t=Object(s.getGlslDifferences)();this.outputShape=e,this.enableShapeUniforms=Object(o.useShapeUniforms)(this.outputShape.length),this.userCode=`\n ivec3 outCoordsFromFlatIndex(int index) {\n ${this.enableShapeUniforms?r.getOutputLogicalCoordinatesFromFlatIndexByUniform(["r","c","d"],e):r.getLogicalCoordinatesFromFlatIndex(["r","c","d"],e)}\n return ivec3(r, c, d);\n }\n\n void main() {\n ivec2 resTexRC = ivec2(resultUV.yx * vec2(texShape[0], texShape[1]));\n int index = 4 * (resTexRC.x * texShape[1] + resTexRC.y);\n\n vec4 result = vec4(0.);\n\n for (int i=0; i<4; i++) {\n int flatIndex = index + i;\n ivec3 rc = outCoordsFromFlatIndex(flatIndex);\n result[i] = getA(rc.x, rc.y, rc.z);\n }\n\n ${t.output} = result;\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/decode_matrix_packed_gpu.js": +/*!*******************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/decode_matrix_packed_gpu.js ***! + \*******************************************************************************/ +/*! exports provided: DecodeMatrixPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"DecodeMatrixPackedProgram",(function(){return a}));var s=n(/*! ./glsl_version */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"),o=n(/*! ./gpgpu_math */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/gpgpu_math.js"),r=n(/*! ./shader_compiler_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js"),i=n(/*! ./tex_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/tex_util.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -562,14 +542,15 @@ function r(e){const{inputs:t,backend:n,attrs:s}=e,{x:r,weights:i}=t,{size:a}=s,d * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */function o(e,t,n,o,r){const i=s.util.sizeFromShape(o),a=s.util.makeZerosTypedArray(r,n);for(let n=0;n=r||(a[s]+=i>0?t[n]:1)}return a}function r(e,t,n,o=!1){const r=e.shape[0],i=e.shape[1],a=Object(s.buffer)([r,n],t.dtype);for(let s=0;s=n||(o?a.set(1,s,i):t.size>0?a.set(a.get(s,i)+t.get(s,r),s,i):a.set(a.get(s,i)+1,s,i))}return a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cast.js": -/*!************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cast.js ***! - \************************************************************************/ -/*! exports provided: cast, castConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"cast",(function(){return u})),n.d(t,"castConfig",(function(){return l}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/zeros_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/zeros_impl.js"),i=n(/*! ./Complex */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Complex.js"),a=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Identity.js"),d=n(/*! ./Real */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Real.js"); + */ +class a{constructor(e){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outPackingScheme=i.PackingScheme.DENSE,this.customUniforms=[{name:"texShape",type:"ivec2"}];const t=Object(s.getGlslDifferences)();this.outputShape=e,this.enableShapeUniforms=Object(o.useShapeUniforms)(this.outputShape.length),this.userCode=`\n ivec3 outCoordsFromFlatIndex(int index) {\n ${this.enableShapeUniforms?r.getOutputLogicalCoordinatesFromFlatIndexByUniform(["r","c","d"],e):r.getLogicalCoordinatesFromFlatIndex(["r","c","d"],e)}\n return ivec3(r, c, d);\n }\n\n void main() {\n ivec2 resTexRC = ivec2(resultUV.yx * vec2(texShape[0], texShape[1]));\n int index = 4 * (resTexRC.x * texShape[1] + resTexRC.y);\n\n vec4 result = vec4(0.);\n\n for (int i=0; i<4; i++) {\n int flatIndex = index + i;\n ivec3 rc = outCoordsFromFlatIndex(flatIndex);\n result[i] = getChannel(getA(rc.x, rc.y, rc.z), vec2(rc.y, rc.z));\n }\n\n ${t.output} = result;\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/depth_to_space_gpu.js": +/*!*************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/depth_to_space_gpu.js ***! + \*************************************************************************/ +/*! exports provided: DepthToSpaceProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"DepthToSpaceProgram",(function(){return s})); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -583,56 +564,56 @@ function r(e){const{inputs:t,backend:n,attrs:s}=e,{x:r,weights:i}=t,{size:a}=s,d * limitations under the License. * ============================================================================= */ -function u(e){const{inputs:t,backend:n,attrs:l}=e,{x:c}=t,{dtype:f}=l;if("complex64"===f){if("complex64"===c.dtype)return Object(a.identity)({inputs:{x:c},backend:n});const e=Object(r.zeros)(n,c.shape,c.dtype),t=u({inputs:{x:c},backend:n,attrs:{dtype:"float32"}}),s=Object(i.complex)({inputs:{real:t,imag:e},backend:n});return n.disposeIntermediateTensorInfo(e),n.disposeIntermediateTensorInfo(t),s}if("complex64"===c.dtype){const e=Object(d.real)({inputs:{input:c},backend:n}),t=u({inputs:{x:e},backend:n,attrs:{dtype:f}});return n.disposeIntermediateTensorInfo(e),t}if(!s.util.hasEncodingLoss(c.dtype,f)){const e=Object(a.identity)({inputs:{x:c},backend:n});return{dataId:e.dataId,shape:e.shape,dtype:f}}if("int32"===f){const e=n.data.get(c.dataId).values,t=Int32Array.from(e);return n.makeTensorInfo(c.shape,"int32",t)}if("bool"===f){const e=n.data.get(c.dataId).values,t=s.util.toTypedArray([0],c.dtype),[r,i]=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>e!==t?1:0))(c.shape,[],e,t,"bool");return n.makeTensorInfo(i,"bool",r)}throw new Error(`Error in Cast: failed to cast ${c.dtype} to ${f}`)}const l={kernelName:s.Cast,backendName:"cpu",kernelFunc:u}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Ceil.js": -/*!************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Ceil.js ***! - \************************************************************************/ -/*! exports provided: ceilImpl, ceil, ceilConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"ceilImpl",(function(){return i})),n.d(t,"ceil",(function(){return a})),n.d(t,"ceilConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_impl.js"),r=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +class s{constructor(e,t,n){this.variableNames=["x"],this.outputShape=[],this.outputShape=e,this.blockSize=t,this.dataFormat=n,this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int h = ${this.getHeightCoordString()};\n int w = ${this.getWidthCoordString()};\n int d = ${this.getDepthCoordString()};\n\n int in_h = h / ${t};\n int offset_h = imod(h, ${t});\n int in_w = w / ${t};\n int offset_w = imod(w, ${t});\n int offset_d = (offset_h * ${t} + offset_w) *\n ${this.getOutputDepthSize()};\n int in_d = d + offset_d;\n\n float result = ${this.getInputSamplingString()};\n setOutput(result);\n }\n `}getHeightCoordString(){return"NHWC"===this.dataFormat?"coords[1]":"coords[2]"}getWidthCoordString(){return"NHWC"===this.dataFormat?"coords[2]":"coords[3]"}getDepthCoordString(){return"NHWC"===this.dataFormat?"coords[3]":"coords[1]"}getOutputDepthSize(){return"NHWC"===this.dataFormat?this.outputShape[3]:this.outputShape[1]}getInputSamplingString(){return"NHWC"===this.dataFormat?"getX(b, in_h, in_w, in_d)":"getX(b, in_d, in_h, in_w)"}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/diag_gpu.js": +/*!***************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/diag_gpu.js ***! + \***************************************************************/ +/*! exports provided: DiagProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"DiagProgram",(function(){return s})); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the License); + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -const i=Object(o.createSimpleUnaryImpl)((e=>Math.ceil(e))),a=Object(r.unaryKernelFuncFromImpl)(s.Ceil,i),d={kernelName:s.Ceil,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Clip.js": -/*!************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Clip.js ***! - \************************************************************************/ -/*! exports provided: clip, clipConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"clip",(function(){return r})),n.d(t,"clipConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +class s{constructor(e){this.variableNames=["X"],this.outputShape=[e,e],this.userCode="\n void main() {\n ivec2 coords = getOutputCoords();\n float val = coords[0] == coords[1] ? getX(coords[0]) : 0.0;\n setOutput(val);\n }\n "}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/dilation_gpu.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/dilation_gpu.js ***! + \*******************************************************************/ +/*! exports provided: Dilation2DProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"Dilation2DProgram",(function(){return s})); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the License); + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -const r=Object(o.unaryKernelFunc)(s.ClipByValue,((e,t)=>{const n=t;return e>n.clipValueMax?n.clipValueMax:e= 0 && hIn < ${t}) {\n for (int w = 0; w < ${a}; w++) {\n int wIn = wBeg + w * ${d};\n\n if (wIn >= 0 && wIn < ${n}) {\n float xVal = getX(batch, hIn, wIn, d1);\n float wVal = getW(h, w, d1);\n\n float val = xVal + wVal;\n if (val > curVal) {\n curVal = val;\n }\n }\n }\n }\n }\n\n float result = curVal;\n setOutput(result);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/encode_float_gpu.js": +/*!***********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/encode_float_gpu.js ***! + \***********************************************************************/ +/*! exports provided: EncodeFloatProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"EncodeFloatProgram",(function(){return i}));var s=n(/*! ./glsl_version */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"),o=n(/*! ./shader_compiler_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js"),r=n(/*! ./tex_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/tex_util.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -646,34 +627,35 @@ const r=Object(o.unaryKernelFunc)(s.ClipByValue,((e,t)=>{const n=t;return e>n.cl * limitations under the License. * ============================================================================= */ -function s(e){const{inputs:t,backend:n}=e,{real:s,imag:o}=t,r=n.data.get(s.dataId).values,i=n.data.get(o.dataId).values,a=n.makeTensorInfo(s.shape,"complex64");return n.data.get(a.dataId).complexTensorInfos={real:n.makeTensorInfo(s.shape,"float32",r),imag:n.makeTensorInfo(o.shape,"float32",i)},a}n.r(t),n.d(t,"complex",(function(){return s})),n.d(t,"complexConfig",(function(){return o}));const o={kernelName:n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js").Complex,backendName:"cpu",kernelFunc:s}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ComplexAbs.js": +class i{constructor(e){this.variableNames=["A"],this.outTexUsage=r.TextureUsage.DOWNLOAD;const t=Object(s.getGlslDifferences)();this.outputShape=e,this.userCode=`\n ${o.ENCODE_FLOAT_SNIPPET}\n\n void main() {\n float x = getAAtOutCoords();\n ${t.output} = encode_float(x);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/encode_float_packed_gpu.js": /*!******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ComplexAbs.js ***! + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/encode_float_packed_gpu.js ***! \******************************************************************************/ -/*! exports provided: complexAbs, complexAbsConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"complexAbs",(function(){return o})),n.d(t,"complexAbsConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/*! exports provided: EncodeFloatPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"EncodeFloatPackedProgram",(function(){return i}));var s=n(/*! ./glsl_version */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"),o=n(/*! ./shader_compiler_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js"),r=n(/*! ./tex_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/tex_util.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the License); + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */const o=e=>{const{x:t}=e.inputs,n=e.backend,o=new Float32Array(s.util.sizeFromShape(t.shape)),r=n.data.get(t.dataId),i=r.complexTensorInfos.real,a=r.complexTensorInfos.imag,d=n.data.get(i.dataId).values,u=n.data.get(a.dataId).values;for(let e=0;ee.shape)),p);if(0===s.util.sizeFromShape(m))return n.makeTensorInfo(m,t[0].dtype,[]);const h=t.filter((e=>s.util.sizeFromShape(e.shape)>0));if(1===h.length)return Object(i.identity)({inputs:{x:h[0]},backend:n});const b=h.map((e=>e.shape));if(s.backend_util.assertParamsConsistent(b,p),"complex64"===h[0].dtype){const e=h.map((e=>Object(d.real)({inputs:{input:e},backend:n}))),t=h.map((e=>Object(a.imag)({inputs:{input:e},backend:n}))),s=l({inputs:e,backend:n,attrs:{axis:p}}),r=l({inputs:t,backend:n,attrs:{axis:p}}),i=Object(o.complex)({inputs:{real:s,imag:r},backend:n});return e.forEach((e=>n.disposeIntermediateTensorInfo(e))),t.forEach((e=>n.disposeIntermediateTensorInfo(e))),n.disposeIntermediateTensorInfo(s),n.disposeIntermediateTensorInfo(r),i}const j=h.map((e=>{const t=[-1,s.util.sizeFromShape(e.shape.slice(p))];return Object(u.reshape)({inputs:{x:e},backend:n,attrs:{shape:t}})})),g=j.map((e=>({vals:n.data.get(e.dataId).values,shape:e.shape})));m=s.backend_util.computeOutShape(j.map((e=>e.shape)),1);const w=1===j[0].shape[0],_=Object(r.concatImpl)(g,m,t[0].dtype,w),k=s.backend_util.computeOutShape(h.map((e=>e.shape)),p),v=n.makeTensorInfo(k,t[0].dtype,_);return j.forEach((e=>n.disposeIntermediateTensorInfo(e))),v}const c={kernelName:s.Concat,backendName:"cpu",kernelFunc:l}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Concat_impl.js": +class i{constructor(e,t=!1){this.variableNames=["A"],this.customUniforms=[{name:"texShape",type:"ivec2"}];const n=Object(s.getGlslDifferences)();this.outputShape=e,this.enableShapeUniforms=Object(o.useShapeUniforms)(this.outputShape.length);let i="result";t&&(i="floor(result * 255. + 0.5)"),this.userCode=`\n ${this.enableShapeUniforms?r.getFlatIndexFrom3DOutput():r.getFlatIndexFrom3D(e)}\n\n void main() {\n ivec3 coords = getOutputCoords();\n\n int flatIndex = getFlatIndex(coords);\n int offset = imod(flatIndex, 4);\n\n flatIndex = idiv(flatIndex, 4, 1.);\n\n int r = flatIndex / texShape[1];\n int c = imod(flatIndex, texShape[1]);\n vec2 uv = (vec2(c, r) + halfCR) / vec2(texShape[1], texShape[0]);\n vec4 values = ${n.texture2D}(A, uv);\n\n float result;\n\n if(offset == 0) {\n result = values[0];\n } else if(offset == 1) {\n result = values[1];\n } else if(offset == 2) {\n result = values[2];\n } else {\n result = values[3];\n }\n\n ${n.output} = vec4(${i}, 0., 0., 0.);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/encode_matrix_packed_gpu.js": /*!*******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Concat_impl.js ***! + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/encode_matrix_packed_gpu.js ***! \*******************************************************************************/ -/*! exports provided: concatImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"concatImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/*! exports provided: EncodeMatrixPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"EncodeMatrixPackedProgram",(function(){return i}));var s=n(/*! ./glsl_version */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"),o=n(/*! ./gpgpu_math */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/gpgpu_math.js"),r=n(/*! ./shader_compiler_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -707,14 +689,15 @@ function l(e){const{inputs:t,backend:n,attrs:c}=e,{axis:f}=c,p=s.util.parseAxisP * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */function o(e,t,n,o){const r=s.util.getArrayFromDType(n,s.util.sizeFromShape(t));if(o&&"string"!==n){let t=0;e.forEach((e=>{const n=s.util.sizeFromShape(e.shape);r.set(e.vals,t),t+=n}))}else{let o=0;e.forEach((e=>{const i="string"===n?s.backend_util.fromUint8ToStringArray(e.vals):e.vals;let a=0;for(let n=0;n=m.inHeight)continue;const r=e*y[0],i=t+n*I;for(let e=0;e=m.inWidth)continue;const o=i+s*C;let a=r+e*y[1];for(let e=0;er.getNumber("WEBGL_VERSION")>0)),r.registerFlag("WEBGL_VERSION",(()=>Object(o.isWebGLVersionEnabled)(2)?2:Object(o.isWebGLVersionEnabled)(1)?1:0)),r.registerFlag("WEBGL_CHECK_NUMERICAL_PROBLEMS",(()=>!1)),r.registerFlag("WEBGL_BUFFER_SUPPORTED",(()=>2===r.get("WEBGL_VERSION"))),r.registerFlag("WEBGL_CPU_FORWARD",(()=>!0)),r.registerFlag("WEBGL_FORCE_F16_TEXTURES",(()=>!1)),r.registerFlag("WEBGL_PACK",(()=>r.getBool("HAS_WEBGL"))),r.registerFlag("WEBGL_PACK_NORMALIZATION",(()=>r.getBool("WEBGL_PACK"))),r.registerFlag("WEBGL_PACK_CLIP",(()=>r.getBool("WEBGL_PACK"))),r.registerFlag("WEBGL_PACK_DEPTHWISECONV",(()=>r.getBool("WEBGL_PACK"))),r.registerFlag("WEBGL_PACK_BINARY_OPERATIONS",(()=>r.getBool("WEBGL_PACK"))),r.registerFlag("WEBGL_PACK_UNARY_OPERATIONS",(()=>r.getBool("WEBGL_PACK"))),r.registerFlag("WEBGL_PACK_ARRAY_OPERATIONS",(()=>r.getBool("WEBGL_PACK"))),r.registerFlag("WEBGL_PACK_IMAGE_OPERATIONS",(()=>r.getBool("WEBGL_PACK"))),r.registerFlag("WEBGL_PACK_REDUCE",(()=>r.getBool("WEBGL_PACK"))),r.registerFlag("WEBGL_LAZILY_UNPACK",(()=>r.getBool("WEBGL_PACK"))),r.registerFlag("WEBGL_CONV_IM2COL",(()=>r.getBool("WEBGL_PACK"))),r.registerFlag("WEBGL_MAX_TEXTURE_SIZE",(()=>Object(o.getWebGLMaxTextureSize)(r.getNumber("WEBGL_VERSION")))),r.registerFlag("WEBGL_MAX_TEXTURES_IN_SHADER",(()=>Object(o.getMaxTexturesInShader)(r.getNumber("WEBGL_VERSION")))),r.registerFlag("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION",(()=>{const e=r.getNumber("WEBGL_VERSION");return 0===e?0:Object(o.getWebGLDisjointQueryTimerVersion)(e)})),r.registerFlag("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE",(()=>r.getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")>0&&!s.device_util.isMobile())),r.registerFlag("WEBGL_RENDER_FLOAT32_CAPABLE",(()=>Object(o.isCapableOfRenderingToFloatTexture)(r.getNumber("WEBGL_VERSION")))),r.registerFlag("WEBGL_RENDER_FLOAT32_ENABLED",(()=>!r.getBool("WEBGL_FORCE_F16_TEXTURES")&&r.getBool("WEBGL_RENDER_FLOAT32_CAPABLE"))),r.registerFlag("WEBGL_DOWNLOAD_FLOAT_ENABLED",(()=>Object(o.isDownloadFloatTextureEnabled)(r.getNumber("WEBGL_VERSION")))),r.registerFlag("WEBGL_FENCE_API_ENABLED",(()=>Object(o.isWebGLFenceEnabled)(r.getNumber("WEBGL_VERSION")))),r.registerFlag("WEBGL_SIZE_UPLOAD_UNIFORM",(()=>r.getBool("WEBGL_RENDER_FLOAT32_ENABLED")?4:0)),r.registerFlag("WEBGL_DELETE_TEXTURE_THRESHOLD",(()=>-1),(e=>{if(e<0&&-1!==e)throw new Error(`WEBGL_DELETE_TEXTURE_THRESHOLD must be -1 (indicating never delete) or at least 0, but got ${e}.`)})),r.registerFlag("WEBGL_FLUSH_THRESHOLD",(()=>s.device_util.isMobile()&&r.getBool("IS_CHROME")?1:-1),(e=>{if(e<0&&-1!==e)throw new Error(`WEBGL_FLUSH_THRESHOLD must be -1 (indicating never manual flush) or at least 0, but got ${e}.`)})),r.registerFlag("CPU_HANDOFF_SIZE_THRESHOLD",(()=>128)),r.registerFlag("WEBGL_USE_SHAPES_UNIFORMS",(()=>!1)),r.registerFlag("TOPK_LAST_DIM_CPU_HANDOFF_SIZE_THRESHOLD",(()=>1e5)),r.registerFlag("TOPK_K_CPU_HANDOFF_THRESHOLD",(()=>128))},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/flip_left_right_gpu.js": /*!**************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv3D.js ***! + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/flip_left_right_gpu.js ***! \**************************************************************************/ -/*! exports provided: conv3D, conv3DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"conv3D",(function(){return r})),n.d(t,"conv3DConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/*! exports provided: FlipLeftRightProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"FlipLeftRightProgram",(function(){return s})); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -791,14 +774,14 @@ function r(e){const{inputs:t,backend:n,attrs:r}=e,{dy:i,filter:a}=t,{inputShape: * limitations under the License. * ============================================================================= */ -function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i,filter:a}=t,{strides:d,pad:u,dilations:l}=r;Object(o.assertNotComplex)([i,a],"conv3d");const c=s.backend_util.computeConv3DInfo(i.shape,a.shape,d,l,u),{filterDepth:f,filterHeight:p,filterWidth:m,dilationDepth:h,dilationHeight:b,dilationWidth:j,padInfo:g}=c,w=g.front,_=g.left,k=g.top,v=new s.TensorBuffer(c.outShape,i.dtype),x=n.data.get(i.dataId).values,y=n.data.get(a.dataId).values,O=v.values,I=s.util.computeStrides(i.shape),C=s.util.computeStrides(a.shape);for(let e=0;e=c.inDepth)continue;const r=e*C[0],i=t+n*I[1];for(let e=0;e=c.inHeight)continue;const o=r+e*C[1],a=i+s*I[2];for(let e=0;e=c.inWidth)continue;const r=o+e*C[2],i=a+t*c.inChannels;let d=r;for(let e=0;e= 0 && coordX < ${t}) {\n outputValue = getImage(coords[0], coords[1], coordX, coords[3]);\n } else {\n outputValue = getImage(coords[0], coords[1], coords[2], coords[3]);\n }\n setOutput(outputValue);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/gather_gpu.js": +/*!*****************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/gather_gpu.js ***! + \*****************************************************************/ +/*! exports provided: GatherProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"GatherProgram",(function(){return o}));var s=n(/*! ./shader_compiler */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2017 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -811,15 +794,18 @@ function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i,filter:a}=t,{strides:d,pa * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i,dy:a}=t,{strides:d,pad:u,filterShape:l}=r;Object(o.assertNotComplex)([i,a],"conv3dBackpropFilterV2");const c=s.util.computeStrides(i.shape),f=s.util.computeStrides(a.shape),p=s.backend_util.computeConv3DInfo(i.shape,l,d,1,u),m=p.strideDepth,h=p.strideHeight,b=p.strideWidth,j=p.filterDepth,g=p.filterHeight,w=p.filterWidth,_=new s.TensorBuffer(p.filterShape,"float32"),k=_.values,[v,x,y,O]=_.strides,I=n.data.get(a.dataId).values,[C,S,T,N]=f,E=n.data.get(i.dataId).values,[A,R,F,$]=c,M=p.padInfo.front,D=p.padInfo.left,P=p.padInfo.top;for(let e=0;e1?"strides[j]":"strides";this.userCode=`\n ${o} strides = ${o}(${this.strides});\n void main() {\n ${r} coords = getOutputCoords();\n int flattenIndex = 0;\n for (int j = 0; j < ${this.sliceDim}; j++) {\n int index = round(getIndices(coords[0], j));\n flattenIndex += index * ${i};\n }\n setOutput(getX(flattenIndex, coords[1]));\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js ***! + \*******************************************************************/ +/*! exports provided: getGlslDifferences */function(e,t,n){"use strict";n.r(t),n.d(t,"getGlslDifferences",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -832,15 +818,14 @@ function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i,dy:a}=t,{strides:d,pad:u, * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -function r(e){const{inputs:t,backend:n,attrs:r}=e,{dy:i,filter:a}=t,{pad:d,strides:u,inputShape:l}=r;Object(o.assertNotComplex)([i],"conv3dBackpropInputV2");const c=s.util.computeStrides(i.shape),f=s.util.computeStrides(a.shape),p=s.backend_util.computeConv3DInfo(l,a.shape,u,1,d),m=new s.TensorBuffer(p.inShape,"float32"),h=m.values,[b,j,g,w]=m.strides,_=n.data.get(i.dataId).values,[k,v,x,y]=c,O=n.data.get(a.dataId).values,[I,C,S,T]=f,{batchSize:N,filterDepth:E,filterHeight:A,filterWidth:R,inChannels:F,inDepth:$,inHeight:M,inWidth:D,outChannels:P,outDepth:B,outHeight:L,outWidth:z,strideDepth:G,strideHeight:W,strideWidth:U}=p,V=E-1-p.padInfo.front,q=A-1-p.padInfo.top,H=R-1-p.padInfo.left;for(let e=0;eMath.cos(e))),i={kernelName:s.Cos,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cosh.js": -/*!************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cosh.js ***! - \************************************************************************/ -/*! exports provided: cosh, coshConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"cosh",(function(){return r})),n.d(t,"coshConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +class u{constructor(e){this.outputTexture=null,this.program=null,this.disposed=!1,this.vertexAttrsAreBound=!1,this.itemsToPoll=[];const t=Object(s.env)().getNumber("WEBGL_VERSION");null!=e?(this.gl=e,Object(o.setWebGLContext)(t,e)):this.gl=Object(o.getWebGLContext)(t);let n="WEBGL_color_buffer_float";const u="EXT_color_buffer_half_float";if(1===Object(s.env)().getNumber("WEBGL_VERSION")){const e="OES_texture_float",t="OES_texture_half_float";if(this.textureFloatExtension=a.getExtensionOrThrow(this.gl,e),a.hasExtension(this.gl,t))this.textureHalfFloatExtension=a.getExtensionOrThrow(this.gl,t);else if(Object(s.env)().get("WEBGL_FORCE_F16_TEXTURES"))throw new Error("GL context does not support half float textures, yet the environment flag WEBGL_FORCE_F16_TEXTURES is set to true.");if(this.colorBufferFloatExtension=this.gl.getExtension(n),a.hasExtension(this.gl,u))this.colorBufferHalfFloatExtension=a.getExtensionOrThrow(this.gl,u);else if(Object(s.env)().get("WEBGL_FORCE_F16_TEXTURES"))throw new Error("GL context does not support color renderable half floats, yet the environment flag WEBGL_FORCE_F16_TEXTURES is set to true.")}else if(n="EXT_color_buffer_float",a.hasExtension(this.gl,n))this.colorBufferFloatExtension=this.gl.getExtension(n);else{if(!a.hasExtension(this.gl,u))throw new Error("GL context does not support color renderable floats");this.colorBufferHalfFloatExtension=this.gl.getExtension(u)}this.vertexBuffer=r.createVertexBuffer(this.gl),this.indexBuffer=r.createIndexBuffer(this.gl),this.framebuffer=a.createFramebuffer(this.gl),this.textureConfig=i.getTextureConfig(this.gl,this.textureHalfFloatExtension)}get debug(){return Object(s.env)().getBool("DEBUG")}dispose(){if(this.disposed)return;null!=this.program&&console.warn("Disposing a GPGPUContext that still has a bound WebGLProgram. This is probably a resource leak, delete the program with GPGPUContext.deleteProgram before disposing."),null!=this.outputTexture&&console.warn("Disposing a GPGPUContext that still has a bound output matrix texture. This is probably a resource leak, delete the output matrix texture with GPGPUContext.deleteMatrixTexture before disposing.");const e=this.gl;a.callAndCheck(e,(()=>e.finish())),a.callAndCheck(e,(()=>e.bindFramebuffer(e.FRAMEBUFFER,null))),a.callAndCheck(e,(()=>e.deleteFramebuffer(this.framebuffer))),a.callAndCheck(e,(()=>e.bindBuffer(e.ARRAY_BUFFER,null))),a.callAndCheck(e,(()=>e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,null))),a.callAndCheck(e,(()=>e.deleteBuffer(this.indexBuffer))),this.disposed=!0}createFloat32MatrixTexture(e,t){return this.throwIfDisposed(),r.createFloat32MatrixTexture(this.gl,e,t,this.textureConfig)}createFloat16MatrixTexture(e,t){return this.throwIfDisposed(),r.createFloat16MatrixTexture(this.gl,e,t,this.textureConfig)}createUnsignedBytesMatrixTexture(e,t){return this.throwIfDisposed(),r.createUnsignedBytesMatrixTexture(this.gl,e,t,this.textureConfig)}uploadPixelDataToTexture(e,t){this.throwIfDisposed(),r.uploadPixelDataToTexture(this.gl,e,t)}uploadDenseMatrixToTexture(e,t,n,s){this.throwIfDisposed(),r.uploadDenseMatrixToTexture(this.gl,e,t,n,s,this.textureConfig)}createFloat16PackedMatrixTexture(e,t){return this.throwIfDisposed(),r.createFloat16PackedMatrixTexture(this.gl,e,t,this.textureConfig)}createPackedMatrixTexture(e,t){return this.throwIfDisposed(),r.createPackedMatrixTexture(this.gl,e,t,this.textureConfig)}deleteMatrixTexture(e){this.throwIfDisposed(),this.outputTexture===e&&(a.unbindColorTextureFromFramebuffer(this.gl,this.framebuffer),this.outputTexture=null),a.callAndCheck(this.gl,(()=>this.gl.deleteTexture(e)))}downloadByteEncodedFloatMatrixFromOutputTexture(e,t,n){return this.downloadMatrixDriver(e,(()=>r.downloadByteEncodedFloatMatrixFromOutputTexture(this.gl,t,n,this.textureConfig)))}downloadPackedMatrixFromBuffer(e,t,n,s,o,i){return r.downloadPackedMatrixFromBuffer(this.gl,e,t,n,s,o,i,this.textureConfig)}downloadFloat32MatrixFromBuffer(e,t){return r.downloadFloat32MatrixFromBuffer(this.gl,e,t)}createBufferFromTexture(e,t,n){this.bindTextureToFrameBuffer(e);const s=r.createBufferFromOutputTexture(this.gl,t,n,this.textureConfig);return this.unbindTextureToFrameBuffer(),s}createAndWaitForFence(){const e=this.createFence(this.gl);return this.pollFence(e)}createFence(e){let t,n;if(Object(s.env)().getBool("WEBGL_FENCE_API_ENABLED")){const s=e,o=s.fenceSync(s.SYNC_GPU_COMMANDS_COMPLETE,0);e.flush(),n=()=>{const e=s.clientWaitSync(o,0,0);return e===s.ALREADY_SIGNALED||e===s.CONDITION_SATISFIED},t=o}else Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")>0?(t=this.beginQuery(),this.endQuery(),n=()=>this.isQueryAvailable(t,Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION"))):n=()=>!0;return{query:t,isFencePassed:n}}downloadMatrixFromPackedTexture(e,t,n){return this.downloadMatrixDriver(e,(()=>r.downloadMatrixFromPackedOutputTexture(this.gl,t,n)))}createProgram(e){this.throwIfDisposed();const t=this.gl,n=a.createFragmentShader(t,e);null==this.vertexShader&&(this.vertexShader=r.createVertexShader(t));const s=a.createProgram(t);return a.callAndCheck(t,(()=>t.attachShader(s,this.vertexShader))),a.callAndCheck(t,(()=>t.attachShader(s,n))),a.linkProgram(t,s),this.debug&&a.validateProgram(t,s),this.vertexAttrsAreBound||(this.setProgram(s),this.vertexAttrsAreBound=r.bindVertexProgramAttributeStreams(t,this.program,this.vertexBuffer)),s}deleteProgram(e){this.throwIfDisposed(),e===this.program&&(this.program=null),null!=e&&a.callAndCheck(this.gl,(()=>this.gl.deleteProgram(e)))}setProgram(e){this.throwIfDisposed(),this.program=e,null!=this.program&&this.debug&&a.validateProgram(this.gl,this.program),a.callAndCheck(this.gl,(()=>this.gl.useProgram(e)))}getUniformLocation(e,t,n=!0){return this.throwIfDisposed(),n?a.getProgramUniformLocationOrThrow(this.gl,e,t):a.getProgramUniformLocation(this.gl,e,t)}getAttributeLocation(e,t){return this.throwIfDisposed(),a.callAndCheck(this.gl,(()=>this.gl.getAttribLocation(e,t)))}getUniformLocationNoThrow(e,t){return this.throwIfDisposed(),this.gl.getUniformLocation(e,t)}setInputMatrixTexture(e,t,n){this.throwIfDisposed(),this.throwIfNoProgram(),a.bindTextureToProgramUniformSampler(this.gl,e,t,n)}setOutputMatrixTexture(e,t,n){this.setOutputMatrixTextureDriver(e,n,t)}setOutputPackedMatrixTexture(e,t,n){this.throwIfDisposed();const[s,o]=i.getPackedMatrixTextureShapeWidthHeight(t,n);this.setOutputMatrixTextureDriver(e,s,o)}setOutputMatrixWriteRegion(e,t,n,s){this.setOutputMatrixWriteRegionDriver(n,e,s,t)}setOutputPackedMatrixWriteRegion(e,t,n,s){throw new Error("setOutputPackedMatrixWriteRegion not implemented.")}debugValidate(){null!=this.program&&a.validateProgram(this.gl,this.program),a.validateFramebuffer(this.gl)}executeProgram(){this.throwIfDisposed(),this.throwIfNoProgram();const e=this.gl;this.debug&&this.debugValidate(),a.callAndCheck(e,(()=>e.drawElements(e.TRIANGLES,6,e.UNSIGNED_SHORT,0)))}blockUntilAllProgramsCompleted(){this.throwIfDisposed(),a.callAndCheck(this.gl,(()=>this.gl.finish()))}getQueryTimerExtension(){return null==this.disjointQueryTimerExtension&&(this.disjointQueryTimerExtension=a.getExtensionOrThrow(this.gl,2===Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")?"EXT_disjoint_timer_query_webgl2":"EXT_disjoint_timer_query")),this.disjointQueryTimerExtension}getQueryTimerExtensionWebGL2(){return this.getQueryTimerExtension()}getQueryTimerExtensionWebGL1(){return this.getQueryTimerExtension()}beginQuery(){if(2===Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")){const e=this.gl,t=this.getQueryTimerExtensionWebGL2(),n=e.createQuery();return e.beginQuery(t.TIME_ELAPSED_EXT,n),n}const e=this.getQueryTimerExtensionWebGL1(),t=e.createQueryEXT();return e.beginQueryEXT(e.TIME_ELAPSED_EXT,t),t}endQuery(){if(2===Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")){const e=this.gl,t=this.getQueryTimerExtensionWebGL2();return void e.endQuery(t.TIME_ELAPSED_EXT)}const e=this.getQueryTimerExtensionWebGL1();e.endQueryEXT(e.TIME_ELAPSED_EXT)}async waitForQueryAndGetTime(e){return await s.util.repeatedTry((()=>this.disposed||this.isQueryAvailable(e,Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")))),this.getQueryTime(e,Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION"))}getQueryTime(e,t){if(0===t)return null;if(2===t){const t=this.gl;return t.getQueryParameter(e,t.QUERY_RESULT)/1e6}{const t=this.getQueryTimerExtensionWebGL1();return t.getQueryObjectEXT(e,t.QUERY_RESULT_EXT)/1e6}}isQueryAvailable(e,t){if(0===t)return!0;if(2===t){const t=this.gl,n=this.getQueryTimerExtensionWebGL2(),s=t.getQueryParameter(e,t.QUERY_RESULT_AVAILABLE);return null==this.disjoint&&(this.disjoint=this.gl.getParameter(n.GPU_DISJOINT_EXT)),s&&!this.disjoint}{const t=this.getQueryTimerExtensionWebGL1(),n=t.getQueryObjectEXT(e,t.QUERY_RESULT_AVAILABLE_EXT);return null==this.disjoint&&(this.disjoint=this.gl.getParameter(t.GPU_DISJOINT_EXT)),n&&!this.disjoint}}pollFence(e){return new Promise((t=>{this.addItemToPoll((()=>e.isFencePassed()),(()=>t()))}))}pollItems(){const e=d(this.itemsToPoll.map((e=>e.isDoneFn)));for(let t=0;t<=e;++t){const{resolveFn:e}=this.itemsToPoll[t];e()}this.itemsToPoll=this.itemsToPoll.slice(e+1)}addItemToPoll(e,t){this.itemsToPoll.push({isDoneFn:e,resolveFn:t}),this.itemsToPoll.length>1||s.util.repeatedTry((()=>(this.pollItems(),0===this.itemsToPoll.length)))}bindTextureToFrameBuffer(e){this.throwIfDisposed(),a.bindColorTextureToFramebuffer(this.gl,e,this.framebuffer),this.debug&&a.validateFramebuffer(this.gl)}unbindTextureToFrameBuffer(){null!=this.outputTexture?(a.bindColorTextureToFramebuffer(this.gl,this.outputTexture,this.framebuffer),this.debug&&a.validateFramebuffer(this.gl)):a.unbindColorTextureFromFramebuffer(this.gl,this.framebuffer)}downloadMatrixDriver(e,t){this.bindTextureToFrameBuffer(e);const n=t();return this.unbindTextureToFrameBuffer(),n}setOutputMatrixTextureDriver(e,t,n){this.throwIfDisposed();const s=this.gl;a.bindColorTextureToFramebuffer(s,e,this.framebuffer),this.debug&&a.validateFramebuffer(s),this.outputTexture=e,a.callAndCheck(s,(()=>s.viewport(0,0,t,n))),a.callAndCheck(s,(()=>s.scissor(0,0,t,n)))}setOutputMatrixWriteRegionDriver(e,t,n,s){this.throwIfDisposed(),a.callAndCheck(this.gl,(()=>this.gl.scissor(e,t,n,s)))}throwIfDisposed(){if(this.disposed)throw new Error("Attempted to use disposed GPGPUContext.")}throwIfNoProgram(){if(null==this.program)throw new Error("No GPU program is currently set.")}}function d(e){let t=0;for(;tMath.cosh(e))),i={kernelName:s.Cosh,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/CropAndResize.js": -/*!*********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/CropAndResize.js ***! - \*********************************************************************************/ -/*! exports provided: cropAndResize, cropAndResizeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"cropAndResize",(function(){return o})),n.d(t,"cropAndResizeConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +function r(e,t,n,r){const i=n.map(((e,n)=>{const s={logicalShape:e.shape,texShape:e.isUniform?null:e.texData.texShape,isUniform:e.isUniform,isPacked:!e.isUniform&&e.texData.isPacked,flatOffset:null};return null!=e.texData&&null!=e.texData.slice&&e.texData.slice.flatOffset>0&&(s.flatOffset=e.texData.slice.flatOffset),{name:t.variableNames[n],shapeInfo:s}})),a=i.map((e=>e.shapeInfo)),u={logicalShape:r.shape,texShape:r.texData.texShape,isUniform:!1,isPacked:r.texData.isPacked,flatOffset:null},d=o.makeShader(i,u,t),l=e.createProgram(d);let c=null;const f=e.getUniformLocation(l,"NAN",!1);1===Object(s.env)().getNumber("WEBGL_VERSION")&&(c=e.getUniformLocation(l,"INFINITY",!1));const p=!1,m={},h={},b={};for(let n=0;n{_[n]=e.getUniformLocation(l,t.name,p)})),{program:t,source:d,webGLProgram:l,uniformLocations:m,customUniformLocations:_,inShapeInfos:a,outShapeInfo:u,infLoc:c,nanLoc:f,inShapesLocations:h,inTexShapesLocations:b,outShapeLocation:j,outShapeStridesLocation:w,outTexShapeLocation:g}}function i(e,t){if(e.length!==t.length)throw Error(`Binary was compiled with ${e.length} inputs, but was executed with ${t.length} inputs`);e.forEach(((e,n)=>{const o=e.logicalShape,r=t[n],i=r.shape;if(!s.util.arraysEqual(o,i))throw Error(`Binary was compiled with different shapes than the current args. Shapes ${o} and ${i} must match`);if(e.isUniform&&r.isUniform)return;const a=e.texShape,u=r.isUniform?null:r.texData.texShape;if(!s.util.arraysEqual(a,u))throw Error(`Binary was compiled with different texture shapes than the current args. Shape ${a} and ${u} must match`)}))}function a(e,t,n,r,a){t.program.enableShapeUniforms||(i(t.inShapeInfos,n),i([t.outShapeInfo],[r]));const u=r.texData.texture,d=r.texData.texShape;r.texData.isPacked?e.setOutputPackedMatrixTexture(u,d[0],d[1]):e.setOutputMatrixTexture(u,d[0],d[1]),e.setProgram(t.webGLProgram),1===Object(s.env)().getNumber("WEBGL_VERSION")&&null!==t.infLoc&&e.gl.uniform1f(t.infLoc,1/0),null!==t.nanLoc&&e.gl.uniform1f(t.nanLoc,NaN),n.forEach(((n,r)=>{const i=t.program.variableNames[r],a=t.uniformLocations[i],u=t.uniformLocations[`offset${i}`],d=t.inShapesLocations[`${i}Shape`],l=t.inTexShapesLocations[`${i}TexShape`];if(d){const{uniformShape:s}=o.getUniformInfoFromShape(t.program.packedInputs,n.shape,n.texData.texShape);switch(s.length){case 1:e.gl.uniform1iv(d,new Int32Array(s));break;case 2:e.gl.uniform2iv(d,new Int32Array(s));break;case 3:e.gl.uniform3iv(d,new Int32Array(s));break;case 4:e.gl.uniform4iv(d,new Int32Array(s))}}if(l&&e.gl.uniform2i(l,n.texData.texShape[0],n.texData.texShape[1]),null!=a)if(n.isUniform)if(s.util.sizeFromShape(n.shape)<2)e.gl.uniform1f(a,n.uniformValues[0]);else{let t=n.uniformValues;t instanceof Float32Array||(t=new Float32Array(t)),e.gl.uniform1fv(a,t)}else null!=n.texData.slice&&null!=u&&e.gl.uniform1i(u,n.texData.slice.flatOffset),e.setInputMatrixTexture(n.texData.texture,a,r)}));const l=t.outShapeLocation;if(l)switch(r.shape.length){case 1:e.gl.uniform1iv(l,new Int32Array(r.shape));break;case 2:e.gl.uniform2iv(l,new Int32Array(r.shape));break;case 3:e.gl.uniform3iv(l,new Int32Array(r.shape));break;case 4:e.gl.uniform4iv(l,new Int32Array(r.shape))}if(t.outShapeStridesLocation){const n=s.util.computeStrides(r.shape);switch(r.shape.length){case 2:e.gl.uniform1iv(t.outShapeStridesLocation,new Int32Array(n));break;case 3:e.gl.uniform2iv(t.outShapeStridesLocation,new Int32Array(n));break;case 4:e.gl.uniform3iv(t.outShapeStridesLocation,new Int32Array(n))}}t.outTexShapeLocation&&e.gl.uniform2i(t.outTexShapeLocation,r.texData.texShape[0],r.texData.texShape[1]),t.program.customUniforms&&a&&t.program.customUniforms.forEach(((n,s)=>{const o=t.customUniformLocations[s],r=a[s];if("float"===n.type)e.gl.uniform1fv(o,r);else if("vec2"===n.type)e.gl.uniform2fv(o,r);else if("vec3"===n.type)e.gl.uniform3fv(o,r);else if("vec4"===n.type)e.gl.uniform4fv(o,r);else if("int"===n.type)e.gl.uniform1iv(o,r);else if("ivec2"===n.type)e.gl.uniform2iv(o,r);else if("ivec3"===n.type)e.gl.uniform3iv(o,r);else{if("ivec4"!==n.type)throw Error(`uniform type ${n.type} is not supported yet.`);e.gl.uniform4iv(o,r)}})),e.executeProgram()}function u(e,t,n){let r="";t.concat(n).forEach((t=>{const i=null!=t.texData&&null!=t.texData.slice&&t.texData.slice.flatOffset>0;if(e.enableShapeUniforms&&!t.isUniform){const a=t.texData.texShape,{useSqueezeShape:u,uniformShape:d,keptDims:l}=o.getUniformInfoFromShape(e.packedInputs,t.shape,a);let c="",f="",p="";if(1===d.length&&e.packedInputs){const e=[Math.ceil(a[0]/2),Math.ceil(a[1]/2)];c=`${e[0]>1}_${e[1]>1}`}else if(2!==d.length||e.packedInputs){if(d.length>2&&!e.packedInputs){const e=s.util.computeStrides(d);p=`${e[0]===a[1]}_${e[e.length-1]===a[1]}`}}else f=`${d[0]>1}_${d[1]>1}`;const m=t.shape.length,h=2===d.length&&s.util.arraysEqual(t.shape,a),b=1===s.util.sizeFromShape(t.shape),j=s.backend_util.getBroadcastDims(t.shape,n.shape),g=!e.packedInputs&&m===n.shape.length&&s.util.arraysEqual(a,n.texData.texShape),w=e.packedInputs||d.length>2?"":`${a[0]>1}_${a[1]>1}`;r+=`${m}_${g}_${u?l:""}_${d.length}_${b}_${j}_${h}_${c}_${f}_${p}_${w}_${i}`}else{const e=t.isUniform?"uniform":t.texData.texShape;r+=`${t.shape}_${e}_${i}`}}));const i=e.userCode;let a=e.constructor.name;return a+="_"+r+"_"+i+`${Object(s.env)().getNumber("WEBGL_VERSION")}`,a}function d(e){return Object(s.env)().getBool("WEBGL_USE_SHAPES_UNIFORMS")&&e<=4}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/gpgpu_util.js": +/*!*****************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/gpgpu_util.js ***! + \*****************************************************************/ +/*! exports provided: createVertexShader, createVertexBuffer, createIndexBuffer, getInternalFormatForFloat32MatrixTexture, createFloat32MatrixTexture, getInternalFormatForFloat16MatrixTexture, createFloat16MatrixTexture, getInternalFormatForUnsignedBytesMatrixTexture, createUnsignedBytesMatrixTexture, getInternalFormatForPackedMatrixTexture, createPackedMatrixTexture, getInternalFormatForFloat16PackedMatrixTexture, createFloat16PackedMatrixTexture, bindVertexProgramAttributeStreams, uploadDenseMatrixToTexture, uploadPixelDataToTexture, createBufferFromOutputTexture, downloadFloat32MatrixFromBuffer, downloadByteEncodedFloatMatrixFromOutputTexture, downloadPackedMatrixFromBuffer, downloadMatrixFromPackedOutputTexture */function(e,t,n){"use strict";n.r(t),n.d(t,"createVertexShader",(function(){return i})),n.d(t,"createVertexBuffer",(function(){return a})),n.d(t,"createIndexBuffer",(function(){return u})),n.d(t,"getInternalFormatForFloat32MatrixTexture",(function(){return l})),n.d(t,"createFloat32MatrixTexture",(function(){return c})),n.d(t,"getInternalFormatForFloat16MatrixTexture",(function(){return f})),n.d(t,"createFloat16MatrixTexture",(function(){return p})),n.d(t,"getInternalFormatForUnsignedBytesMatrixTexture",(function(){return m})),n.d(t,"createUnsignedBytesMatrixTexture",(function(){return h})),n.d(t,"getInternalFormatForPackedMatrixTexture",(function(){return b})),n.d(t,"createPackedMatrixTexture",(function(){return j})),n.d(t,"getInternalFormatForFloat16PackedMatrixTexture",(function(){return g})),n.d(t,"createFloat16PackedMatrixTexture",(function(){return w})),n.d(t,"bindVertexProgramAttributeStreams",(function(){return _})),n.d(t,"uploadDenseMatrixToTexture",(function(){return k})),n.d(t,"uploadPixelDataToTexture",(function(){return v})),n.d(t,"createBufferFromOutputTexture",(function(){return x})),n.d(t,"downloadFloat32MatrixFromBuffer",(function(){return y})),n.d(t,"downloadByteEncodedFloatMatrixFromOutputTexture",(function(){return O})),n.d(t,"downloadPackedMatrixFromBuffer",(function(){return I})),n.d(t,"downloadMatrixFromPackedOutputTexture",(function(){return C}));var s=n(/*! ./glsl_version */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"),o=n(/*! ./tex_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/tex_util.js"),r=n(/*! ./webgl_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2017 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -895,14 +880,15 @@ const r=Object(o.unaryKernelFunc)(s.Cosh,(e=>Math.cosh(e))),i={kernelName:s.Cosh * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */function o(e){const{inputs:t,backend:n,attrs:o}=e,{image:r,boxes:i,boxInd:a}=t,{cropSize:d,method:u,extrapolationValue:l}=o,[c,f,p,m]=r.shape,h=i.shape[0],[b,j]=d,g=Object(s.buffer)([h,b,j,m],"float32"),w=n.data.get(i.dataId).values,_=n.data.get(a.dataId).values,k=n.data.get(r.dataId).values,v=s.util.computeStrides(r.shape),x=s.util.computeStrides(g.shape);for(let e=0;e=c)continue;const a=b>1?(o-n)*(f-1)/(b-1):0,d=j>1?(r-s)*(p-1)/(j-1):0;for(let t=0;t1?n*(f-1)+t*a:.5*(n+o)*(f-1);if(c<0||c>f-1)for(let n=0;n1?s*(p-1)+u*d:.5*(s+r)*(p-1);if(c<0||c>p-1){for(let n=0;n1?s*(p-1)+n*d:.5*(s+r)*(p-1);if(o<0||o>p-1){for(let s=0;se.bindTexture(u,a))),r.callAndCheck(e,(()=>e.texParameteri(u,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE))),r.callAndCheck(e,(()=>e.texParameteri(u,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE))),r.callAndCheck(e,(()=>e.texParameteri(u,e.TEXTURE_MIN_FILTER,e.NEAREST))),r.callAndCheck(e,(()=>e.texParameteri(u,e.TEXTURE_MAG_FILTER,e.NEAREST))),r.callAndCheck(e,(()=>e.texImage2D(u,0,s,t,n,0,o,i,null))),r.callAndCheck(e,(()=>e.bindTexture(e.TEXTURE_2D,null))),a}function l(e){return e.internalFormatFloat}function c(e,t,n,s){const[r,i]=o.getUnpackedMatrixTextureShapeWidthHeight(t,n);return d(e,r,i,l(s),s.textureFormatFloat,e.FLOAT)}function f(e){return e.internalFormatHalfFloat}function p(e,t,n,s){const[r,i]=o.getUnpackedMatrixTextureShapeWidthHeight(t,n);return d(e,r,i,f(s),s.textureFormatFloat,s.textureTypeHalfFloat)}function m(e){return e.downloadTextureFormat}function h(e,t,n,s){const[r,i]=o.getUnpackedMatrixTextureShapeWidthHeight(t,n);return d(e,r,i,m(s),e.RGBA,e.UNSIGNED_BYTE)}function b(e){return e.internalFormatPackedFloat}function j(e,t,n,s){const[r,i]=o.getPackedMatrixTextureShapeWidthHeight(t,n);return d(e,r,i,b(s),e.RGBA,e.FLOAT)}function g(e){return e.internalFormatPackedHalfFloat}function w(e,t,n,s){const[r,i]=o.getPackedMatrixTextureShapeWidthHeight(t,n);return d(e,r,i,g(s),e.RGBA,s.textureTypeHalfFloat)}function _(e,t,n){r.callAndCheck(e,(()=>e.bindBuffer(e.ARRAY_BUFFER,n)));return r.bindVertexBufferToProgramAttribute(e,t,"clipSpacePos",n,3,20,0)&&r.bindVertexBufferToProgramAttribute(e,t,"uv",n,2,20,12)}function k(e,t,n,s,o,i){let a,u,d;r.callAndCheck(e,(()=>e.bindTexture(e.TEXTURE_2D,t))),o instanceof Uint8Array?(a=new Uint8Array(n*s*4),u=e.UNSIGNED_BYTE,d=e.RGBA):(a=new Float32Array(n*s*4),u=e.FLOAT,d=i.internalFormatPackedFloat),a.set(o),r.callAndCheck(e,(()=>e.texImage2D(e.TEXTURE_2D,0,d,n,s,0,e.RGBA,u,a))),r.callAndCheck(e,(()=>e.bindTexture(e.TEXTURE_2D,null)))}function v(e,t,n){r.callAndCheck(e,(()=>e.bindTexture(e.TEXTURE_2D,t))),n.data instanceof Uint8Array?r.callAndCheck(e,(()=>e.texImage2D(e.TEXTURE_2D,0,e.RGBA,n.width,n.height,0,e.RGBA,e.UNSIGNED_BYTE,n.data))):r.callAndCheck(e,(()=>e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,n))),r.callAndCheck(e,(()=>e.bindTexture(e.TEXTURE_2D,null)))}function x(e,t,n,s){const o=e.createBuffer();r.callAndCheck(e,(()=>e.bindBuffer(e.PIXEL_PACK_BUFFER,o)));const i=16*t*n;return r.callAndCheck(e,(()=>e.bufferData(e.PIXEL_PACK_BUFFER,i,e.STREAM_READ))),r.callAndCheck(e,(()=>e.readPixels(0,0,n,t,e.RGBA,e.FLOAT,0))),r.callAndCheck(e,(()=>e.bindBuffer(e.PIXEL_PACK_BUFFER,null))),o}function y(e,t,n){const s=e,o=new Float32Array(n);return s.bindBuffer(s.PIXEL_PACK_BUFFER,t),s.getBufferSubData(s.PIXEL_PACK_BUFFER,0,o),s.bindBuffer(s.PIXEL_PACK_BUFFER,null),o}function O(e,t,n,s){const[i,a]=o.getUnpackedMatrixTextureShapeWidthHeight(t,n),u=new Uint8Array(o.getUnpackedArraySizeFromMatrixSize(t*n,4));return r.callAndCheck(e,(()=>e.readPixels(0,0,i,a,s.downloadTextureFormat,e.UNSIGNED_BYTE,u))),new Float32Array(u.buffer)}function I(e,t,n,s,r,i,a,u){const d=e,l=new Float32Array(o.getPackedRGBAArraySizeFromMatrixShape(i,a));return d.bindBuffer(d.PIXEL_PACK_BUFFER,t),d.getBufferSubData(d.PIXEL_PACK_BUFFER,0,l),d.bindBuffer(d.PIXEL_PACK_BUFFER,null),l}function C(e,t,n){const s=new Float32Array(t*n*4);return r.callAndCheck(e,(()=>e.readPixels(0,0,n,t,e.RGBA,e.FLOAT,s))),s}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/im2col_packed_gpu.js": +/*!************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/im2col_packed_gpu.js ***! + \************************************************************************/ +/*! exports provided: Im2ColPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"Im2ColPackedProgram",(function(){return r}));var s=n(/*! ./glsl_version */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"),o=n(/*! ./gpgpu_math */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/gpgpu_math.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -916,11 +902,11 @@ const r=Object(o.unaryKernelFunc)(s.Cosh,(e=>Math.cosh(e))),i={kernelName:s.Cosh * limitations under the License. * ============================================================================= */ -function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{axis:d,exclusive:u,reverse:l}=i;Object(o.assertNotComplex)(a,"cumsum");const c=s.backend_util.getAxesPermutation([d],a.shape.length);let f=a;null!=c&&(f=Object(r.transpose)({inputs:{x:a},backend:n,attrs:{perm:c}}));const p=s.backend_util.getInnerMostAxes(1,a.shape.length)[0];if(p!==f.shape.length-1)throw new Error(`backend.cumsum in CPU expects an inner-most axis=${f.shape.length-1} but got axis=${p}`);const m=Object(s.upcastType)(f.dtype,"int32"),h=s.util.makeZerosTypedArray(s.util.sizeFromShape(f.shape),m),b=n.data.get(f.dataId).values,j=f.shape[f.shape.length-1],g=l?(e,t)=>e+j-t-1:(e,t)=>e+t;for(let e=0;e= 0) {\n // Use custom imod instead mod. On Intel GPU, mod may generate\n // unexpected value.\n // https://github.com/tensorflow/tfjs/issues/5447\n offsetX = imod(blockIndex, outWidth) * stride[1] - pad[1];\n d1 = offsetX + dilation[1] * (imod(pos, itemsPerBlockRow) /\n inChannels);\n\n if(d1 < inputShape[${u}] && d1 >= 0) {\n\n ch = imod(pos, inChannels);\n\n if (${i}) {\n innerDims = vec2(d1, ch);\n result[${2*e+t}] = getChannel(\n getA(d0, int(innerDims.x),\n int(innerDims.y)), innerDims);\n } else {\n innerDims = vec2(d0, d1);\n result[${2*e+t}] = getChannel(\n getA(ch, int(innerDims.x),\n int(innerDims.y)), innerDims);\n }\n }\n }\n }\n `;this.userCode=`\n void main() {\n ivec2 rc = getOutputCoords();\n\n vec4 result = vec4(0);\n\n int blockIndex, pos, offsetY, d0, offsetX, d1, ch;\n vec2 innerDims;\n\n ${l}\n\n ${r.output} = result;\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/index.js": +/*!************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/index.js ***! + \************************************************************/ +/*! exports provided: version_webgl, MathBackendWebGL, setWebGLContext, GPGPUContext, gpgpu_util, webgl_util, forceHalfFloat, webgl */function(e,t,n){"use strict";n.r(t);var s=n(/*! ./base */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/base.js");n.d(t,"version_webgl",(function(){return s.version_webgl})),n.d(t,"MathBackendWebGL",(function(){return s.MathBackendWebGL})),n.d(t,"setWebGLContext",(function(){return s.setWebGLContext})),n.d(t,"GPGPUContext",(function(){return s.GPGPUContext})),n.d(t,"gpgpu_util",(function(){return s.gpgpu_util})),n.d(t,"webgl_util",(function(){return s.webgl_util})),n.d(t,"forceHalfFloat",(function(){return s.forceHalfFloat})),n.d(t,"webgl",(function(){return s.webgl}));n(/*! ./register_all_kernels */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/register_all_kernels.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -936,12 +922,11 @@ function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{axis:d,exclusive:u,re * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -function r(e){const{inputs:t,backend:n,attrs:s}=e,{x:r,weights:i}=t,{size:a,binaryOutput:d}=s;if(1===r.shape.length){const e=n.data.get(r.dataId).values,t=n.data.get(i.dataId).values,s=Object(o.bincountImpl)(e,t,i.dtype,i.shape,a);return n.makeTensorInfo([a],i.dtype,s)}if(2===r.shape.length){const e=n.bufferSync(r),t=n.bufferSync(i),s=Object(o.bincountReduceImpl)(e,t,a,d);return n.makeTensorInfo(s.shape,i.dtype,s.values)}throw new Error(`Error in denseBincount: input must be at most rank 2, but got rank${r.shape.length}.`)}const i={kernelName:s.DenseBincount,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DepthToSpace.js": -/*!********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DepthToSpace.js ***! - \********************************************************************************/ -/*! exports provided: depthToSpace, depthToSpaceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"depthToSpace",(function(){return o})),n.d(t,"depthToSpaceConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); + */},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/arg_min_max.js": +/*!*******************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/arg_min_max.js ***! + \*******************************************************************************/ +/*! exports provided: argMinMaxReduce */function(e,t,n){"use strict";n.r(t),n.d(t,"argMinMaxReduce",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../argminmax_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/argminmax_gpu.js"),r=n(/*! ../argminmax_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/argminmax_packed_gpu.js"),i=n(/*! ../kernels/Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -957,11 +942,12 @@ function r(e){const{inputs:t,backend:n,attrs:s}=e,{x:r,weights:i}=t,{size:a,bina * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */function o(e){const{inputs:t,backend:n,attrs:o}=e,{x:r}=t,{blockSize:i,dataFormat:a}=o;s.util.assert("NHWC"===a,(()=>`Only NHWC dataFormat supported on CPU for depthToSpace. Got ${a}`)),s.util.assert(i>1,(()=>`blockSize should be > 1 for depthToSpace, but was: ${i}`));const d=r.shape[0],u=r.shape[1],l=r.shape[2],c=r.shape[3],f=u*i,p=l*i,m=c/(i*i),h=n.data.get(r.dataId).values,b=new Float32Array(d*f*p*m);let j=0;for(let e=0;ee.disposeIntermediateTensorInfo(t))),h}return u(e,t,o)}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/int.js": +/*!***********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/int.js ***! + \***********************************************************************/ +/*! exports provided: int */function(e,t,n){"use strict";n.r(t),n.d(t,"int",(function(){return o}));var s=n(/*! ../unaryop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -977,12 +963,11 @@ function r(e){const{inputs:t,backend:n,attrs:s}=e,{x:r,weights:i}=t,{size:a,bina * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i,filter:a}=t,{strides:d,pad:u,dilations:l,dimRoundingMode:c}=r;Object(o.assertNotComplex)([i,a],"depthwiseConv2DNative");const f=s.util.computeStrides(i.shape),p=s.util.computeStrides(a.shape);let m=l;null==m&&(m=[1,1]),s.util.assert(s.backend_util.eitherStridesOrDilationsAreOne(d,m),(()=>`Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides ${d} and dilations '${m}'`));const h=s.backend_util.computeConv2DInfo(i.shape,a.shape,d,m,u,c,!0),{filterHeight:b,filterWidth:j,dilationHeight:g,dilationWidth:w,padInfo:_}=h,k=_.left,v=_.top,x=h.outChannels/h.inChannels,y=new s.TensorBuffer(h.outShape,i.dtype),O=n.data.get(i.dataId).values,I=n.data.get(a.dataId).values,C=y.values;for(let e=0;e=h.inHeight)continue;const r=e*p[0],i=t+n*f[1];for(let e=0;e=h.inWidth)continue;const o=r+e*p[1],a=i+s*h.inChannels;let d=t,u=o;for(let e=0;e{const{x:a}=r,u=i,c=o||a.dtype;if(u.shouldExecuteOnCPU([a])&&null!=n){const e=u.texData.get(a.dataId),t=n(e.values,c);return u.makeTensorInfo(a.shape,c,t)}let f;return f=Object(s.env)().getBool("WEBGL_PACK_UNARY_OPERATIONS")&&null!=t?new l.UnaryOpPackedProgram(a.shape,t):new d.UnaryOpProgram(a.shape,e),u.runWebGLProgram(f,[a],c)}}function h({opSnippet:e,packedOpSnippet:t,checkOutOfBounds:n=!1,supportsComplex:a=!1,cpuKernelImpl:u,dtype:d}){return({inputs:l,backend:c})=>{const{a:f,b:p}=l,m=c;if(a&&"complex64"===f.dtype){const t=m.texData.get(f.dataId),n=m.texData.get(p.dataId),[r,a]=[[t.complexTensorInfos.real,n.complexTensorInfos.real],[t.complexTensorInfos.imag,n.complexTensorInfos.imag]].map((t=>{const[n,r]=t,i={dataId:n.dataId,dtype:n.dtype,shape:f.shape},a={dataId:r.dataId,dtype:r.dtype,shape:p.shape},u=new o.BinaryOpProgram(e,f.shape,p.shape);return m.runWebGLProgram(u,[i,a],Object(s.upcastType)(n.dtype,r.dtype))})),u=Object(i.complex)({inputs:{real:r,imag:a},backend:m});return m.disposeIntermediateTensorInfo(r),m.disposeIntermediateTensorInfo(a),u}const h=d||Object(s.upcastType)(f.dtype,p.dtype);if(("string"===f.dtype||"string"===p.dtype||m.shouldExecuteOnCPU([f,p]))&&null!=u){const e=m.texData.get(f.dataId).values,t=m.texData.get(p.dataId).values,n="string"===f.dtype?s.backend_util.fromUint8ToStringArray(e):e,o="string"===f.dtype?s.backend_util.fromUint8ToStringArray(t):t,[r,i]=u(f.shape,p.shape,n,o,h),a=m.makeTensorInfo(i,h);return m.texData.get(a.dataId).values=r,a}let b;return b=Object(s.env)().getBool("WEBGL_PACK_BINARY_OPERATIONS")&&null!=t?new r.BinaryOpPackedProgram(t,f.shape,p.shape,n):new o.BinaryOpProgram(e,f.shape,p.shape),m.runWebGLProgram(b,[f,p],h)}}function b(e,t=!1){if("linear"===e)return t?l.LINEAR:d.LINEAR;if("relu"===e)return t?l.RELU:d.RELU;if("elu"===e)return t?l.ELU:d.ELU;if("relu6"===e)return t?l.RELU6:d.RELU6;if("prelu"===e)return t?u.PRELU_PACKED:u.PRELU;if("leakyrelu"===e)return t?a.LEAKYRELU_PACKED:a.LEAKYRELU;if("sigmoid"===e)return t?l.SIGMOID:d.SIGMOID;throw new Error(`Activation ${e} has not been implemented for the WebGL backend.`)}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/reduce.js": +/*!**************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/reduce.js ***! + \**************************************************************************/ +/*! exports provided: reduce */function(e,t,n){"use strict";n.r(t),n.d(t,"reduce",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../mean_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/mean_gpu.js"),r=n(/*! ../reduce_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/reduce_gpu.js");function i(e,t,n,i){const a= /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -1020,11 +1005,11 @@ function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i,dy:a}=t,{strides:d,dilati * limitations under the License. * ============================================================================= */ -function r(e){const{inputs:t,backend:n,attrs:r}=e,{dy:i,filter:a}=t,{strides:d,dilations:u,pad:l,dimRoundingMode:c,inputShape:f}=r;Object(o.assertNotComplex)([i,a],"depthwiseConv2DNativeBackpropInput");const p=s.util.computeStrides(i.shape),m=s.util.computeStrides(a.shape),h=s.backend_util.computeConv2DInfo(f,a.shape,d,u,l,c,!0),b=new s.TensorBuffer(h.inShape,"float32"),j=b.values,[g,w,_]=b.strides,k=n.data.get(i.dataId).values,[v,x,y]=p,O=n.data.get(a.dataId).values,[I,C,S]=m,{batchSize:T,filterHeight:N,filterWidth:E,inChannels:A,inHeight:R,inWidth:F,outChannels:$,outHeight:M,outWidth:D,strideHeight:P,strideWidth:B}=h,L=N-1-h.padInfo.top,z=E-1-h.padInfo.left,G=$/A;for(let e=0;e{const{x:o,filter:r}=e,{strides:i,pad:a,dilations:d}=n,u=t,l=u.data.get(o.dataId).values,c=o.shape.length,f=u.data.get(r.dataId).values,p=r.shape.length,{batchSize:m,inHeight:h,inWidth:b,inChannels:j,outHeight:g,outWidth:w,padInfo:_,strideHeight:k,strideWidth:v,filterHeight:x,filterWidth:y,dilationHeight:O,dilationWidth:I,outShape:C}=s.backend_util.computeDilation2DInfo(o.shape,r.shape,i,a,"NHWC",d),S=s.util.sizeFromShape(C),T=C.length,N=s.util.getArrayFromDType(o.dtype,S);for(let e=0;e=0&&i=0&&mu&&(u=b)}}}N[s.util.locToIndex([e,t,i,d],T,s.util.computeStrides(C))]=u}}}return{dataId:u.write(s.util.toTypedArray(N,o.dtype),C,o.dtype),shape:C,dtype:o.dtype}}}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Dilation2DBackpropFilter.js": -/*!********************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Dilation2DBackpropFilter.js ***! - \********************************************************************************************/ -/*! exports provided: dilation2dBackpropFilterConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"dilation2dBackpropFilterConfig",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); + */const{addImpl:o,bincountImpl:r,bincountReduceImpl:i,ceilImpl:a,concatImpl:u,equalImpl:d,expImpl:l,expm1Impl:c,floorImpl:f,gatherNdImpl:p,gatherV2Impl:m,greaterImpl:h,greaterEqualImpl:b,lessImpl:j,lessEqualImpl:g,linSpaceImpl:w,logImpl:_,maxImpl:k,maximumImpl:v,minimumImpl:x,multiplyImpl:y,negImpl:O,notEqualImpl:I,prodImpl:C,rangeImpl:S,rsqrtImpl:T,sigmoidImpl:N,simpleAbsImpl:E,sliceImpl:A,sparseFillEmptyRowsImpl:R,sparseReshapeImpl:F,sparseSegmentReductionImpl:M,sqrtImpl:$,stridedSliceImpl:D,stringNGramsImpl:P,stringSplitImpl:B,stringToHashBucketFastImpl:L,subImpl:z,tileImpl:G,topKImpl:U,transposeImpl:W,uniqueImpl:V}=s},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Abs.js": +/*!******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Abs.js ***! + \******************************************************************/ +/*! exports provided: abs, absConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"abs",(function(){return u})),n.d(t,"absConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"),r=n(/*! ../unaryop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js"),i=n(/*! ../unaryop_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/unaryop_packed_gpu.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -1080,11 +1066,12 @@ function r(e){const{inputs:t,backend:n,attrs:r}=e,{dy:i,filter:a}=t,{strides:d,d * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */const o={kernelName:s.Dilation2DBackpropFilter,backendName:"cpu",kernelFunc:({inputs:e,backend:t,attrs:n})=>{const{x:o,filter:r,dy:i}=e,{strides:a,pad:d,dilations:u}=n,l=t,c=s.util.toNestedArray(o.shape,l.data.get(o.dataId).values),f=s.util.toNestedArray(r.shape,l.data.get(r.dataId).values),{batchSize:p,inHeight:m,inWidth:h,inChannels:b,outHeight:j,outWidth:g,padInfo:w,strideHeight:_,strideWidth:k,filterHeight:v,filterWidth:x,dilationHeight:y,dilationWidth:O,outShape:I}=s.backend_util.computeDilation2DInfo(o.shape,r.shape,a,d,"NHWC",u);s.util.assert(i.rank===I.length,(()=>`Error in ${s.Dilation2DBackpropFilter}, dy must have the same rank as output ${I.length}, but got ${i.rank}`));const C=s.util.toNestedArray(I,l.data.get(i.dataId).values),S=s.util.makeZerosNestedTypedArray(r.shape,r.dtype);for(let e=0;e=0&&s=0&&ui&&(i=o,a=t,d=n)}}}S[a][d][r]+=C[e][t][s][r]}}}return{dataId:l.write(s.util.toTypedArray(S,o.dtype),r.shape,r.dtype),shape:r.shape,dtype:r.dtype}}}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Dilation2DBackpropInput.js": -/*!*******************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Dilation2DBackpropInput.js ***! - \*******************************************************************************************/ -/*! exports provided: dilation2dBackpropInputConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"dilation2dBackpropInputConfig",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); + */ +const a="return abs(x);";function u(e){const{inputs:t,backend:n}=e,{x:u}=t;if(n.shouldExecuteOnCPU([u])&&"complex64"!==u.dtype){const e=n.texData.get(u.dataId),t=Object(o.simpleAbsImplCPU)(e.values);return n.makeTensorInfo(u.shape,u.dtype,t)}let d;return d=Object(s.env)().getBool("WEBGL_PACK_UNARY_OPERATIONS")?new i.UnaryOpPackedProgram(u.shape,a):new r.UnaryOpProgram(u.shape,a),n.runWebGLProgram(d,[u],u.dtype)}const d={kernelName:s.Abs,backendName:"webgl",kernelFunc:u}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Acos.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Acos.js ***! + \*******************************************************************/ +/*! exports provided: acos, acosConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"acos",(function(){return i})),n.d(t,"acosConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -1100,14 +1087,15 @@ function r(e){const{inputs:t,backend:n,attrs:r}=e,{dy:i,filter:a}=t,{strides:d,d * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */const o={kernelName:s.Dilation2DBackpropInput,backendName:"cpu",kernelFunc:({inputs:e,backend:t,attrs:n})=>{const{x:o,filter:r,dy:i}=e,{strides:a,pad:d,dilations:u}=n,l=t,c=s.util.toNestedArray(o.shape,l.data.get(o.dataId).values),f=s.util.toNestedArray(r.shape,l.data.get(r.dataId).values),{batchSize:p,inHeight:m,inWidth:h,inChannels:b,outHeight:j,outWidth:g,padInfo:w,strideHeight:_,strideWidth:k,filterHeight:v,filterWidth:x,dilationHeight:y,dilationWidth:O,outShape:I}=s.backend_util.computeDilation2DInfo(o.shape,r.shape,a,d,"NHWC",u);s.util.assert(i.rank===I.length,(()=>`Error in ${s.Dilation2DBackpropInput}, dy must have the same rank as output ${I.length}, but got ${i.rank}`));const C=s.util.toNestedArray(I,l.data.get(i.dataId).values),S=s.util.makeZerosNestedTypedArray(o.shape,o.dtype);for(let e=0;e=0&&s=0&&ui&&(i=o,a=s,d=u)}}}S[e][a][d][r]+=C[e][t][s][r]}}}return{dataId:l.write(s.util.toTypedArray(S,o.dtype),o.shape,o.dtype),shape:o.shape,dtype:o.dtype}}}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Einsum.js": -/*!**************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Einsum.js ***! - \**************************************************************************/ -/*! exports provided: einsum, einsumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"einsum",(function(){return d})),n.d(t,"einsumConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Multiply */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Multiply.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"),i=n(/*! ./Sum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sum.js"),a=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose.js"); + */ +const r=n(/*! ../unaryop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js").CHECK_NAN_SNIPPET+"\n if (abs(x) > 1.) {\n return NAN;\n }\n return acos(x);\n",i=Object(o.unaryKernelFunc)({opSnippet:r}),a={kernelName:s.Acos,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Acosh.js": +/*!********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Acosh.js ***! + \********************************************************************/ +/*! exports provided: acosh, acoshConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"acosh",(function(){return i})),n.d(t,"acoshConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); /** * @license - * Copyright 2021 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -1121,32 +1109,32 @@ function r(e){const{inputs:t,backend:n,attrs:r}=e,{dy:i,filter:a}=t,{strides:d,d * limitations under the License. * ============================================================================= */ -function d(e){const{inputs:t,backend:n,attrs:d}=e,{equation:u}=d,l=t,{allDims:c,summedDims:f,idDims:p}=s.backend_util.decodeEinsumEquation(u,l.length);s.backend_util.checkEinsumDimSizes(c.length,p,l);const{path:m,steps:h}=s.backend_util.getEinsumComputePath(f,p),b=h.length;let j=null,g=c.length;const w=[];for(let e=0;e=0&&(j=Object(i.sum)({inputs:{x:j},backend:n,attrs:{axis:m[e]-(c.length-g),keepDims:!1}}),w.push(j)),g--)}for(const e of w)e!==j&&n.disposeIntermediateTensorInfo(e);return j}const u={kernelName:s.Einsum,backendName:"cpu",kernelFunc:d}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Elu.js": -/*!***********************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Elu.js ***! - \***********************************************************************/ -/*! exports provided: elu, eluConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"elu",(function(){return r})),n.d(t,"eluConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +const r=n(/*! ../unaryop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js").CHECK_NAN_SNIPPET+"\n if (x < 1.0) return NAN;\nreturn log(x + sqrt(x * x - 1.0));",i=Object(o.unaryKernelFunc)({opSnippet:r}),a={kernelName:s.Acosh,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Add.js": +/*!******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Add.js ***! + \******************************************************************/ +/*! exports provided: addKernelFunc, addConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"addKernelFunc",(function(){return a})),n.d(t,"addConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the License); + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -const r=Object(o.unaryKernelFunc)(s.Elu,(e=>e>=0?e:Math.exp(e)-1)),i={kernelName:s.Elu,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/EluGrad.js": -/*!***************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/EluGrad.js ***! - \***************************************************************************/ -/*! exports provided: eluGrad, eluGradConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"eluGrad",(function(){return r})),n.d(t,"eluGradConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +const i="return a + b;",a=Object(o.binaryKernelFunc)({opSnippet:i,packedOpSnippet:i,supportsComplex:!0,cpuKernelImpl:r.addImplCPU}),u={kernelName:s.Add,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/AddN.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/AddN.js ***! + \*******************************************************************/ +/*! exports provided: addN, addNConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"addN",(function(){return a})),n.d(t,"addNConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../addn_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/addn_gpu.js"),r=n(/*! ../addn_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/addn_packed_gpu.js"),i=n(/*! ./Identity */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -1163,11 +1151,11 @@ const r=Object(o.unaryKernelFunc)(s.Elu,(e=>e>=0?e:Math.exp(e)-1)),i={kernelName * limitations under the License. * ============================================================================= */ -function r(e){const{inputs:t,backend:n}=e,{dy:r,y:i}=t;Object(o.assertNotComplex)([r,i],"eluGrad");const a=new Float32Array(s.util.sizeFromShape(i.shape)),d=n.data.get(i.dataId).values,u=n.data.get(r.dataId).values;for(let e=0;e=1?u[e]:u[e]*(t+1)}return n.makeTensorInfo(i.shape,"float32",a)}const i={kernelName:s.EluGrad,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Equal.js": -/*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Equal.js ***! - \*************************************************************************/ -/*! exports provided: equalImpl, equal, equalConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"equalImpl",(function(){return i})),n.d(t,"equal",(function(){return a})),n.d(t,"equalConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); +function a(e){const{inputs:t,backend:n}=e,u=t;if(1===u.length)return Object(i.identity)({inputs:{x:u[0]},backend:n});if(u.length>Object(s.env)().get("WEBGL_MAX_TEXTURES_IN_SHADER")){const e=Math.floor(u.length/2),t=a({inputs:u.slice(0,e),backend:n}),s=a({inputs:u.slice(e),backend:n});return a({inputs:[t,s],backend:n})}const d=u.map((e=>e.dtype)).reduce(((e,t)=>Object(s.upcastType)(e,t))),l=u.map((e=>e.shape)),c=Object(s.env)().getBool("WEBGL_PACK")?new r.AddNPackedProgram(u[0].shape,l):new o.AddNProgram(u[0].shape,l);return n.runWebGLProgram(c,u,d)}const u={kernelName:s.AddN,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/All.js": +/*!******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/All.js ***! + \******************************************************************/ +/*! exports provided: all, allConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"all",(function(){return a})),n.d(t,"allConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/reduce */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/reduce.js"),r=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),i=n(/*! ./Transpose */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -1184,53 +1172,53 @@ function r(e){const{inputs:t,backend:n}=e,{dy:r,y:i}=t;Object(o.assertNotComplex * limitations under the License. * ============================================================================= */ -const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>e===t?1:0)),a=Object(r.binaryKernelFunc)(s.Equal,i,null,"bool"),d={kernelName:s.Equal,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Erf.js": -/*!***********************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Erf.js ***! - \***********************************************************************/ -/*! exports provided: erf, erfConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"erf",(function(){return c})),n.d(t,"erfConfig",(function(){return f}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:u}=t,{axis:d,keepDims:l}=a,c=u.shape.length,f=s.util.parseAxisParam(d,u.shape);let p=f;const m=s.backend_util.getAxesPermutation(p,c);let h=u;null!=m&&(h=Object(i.transpose)({inputs:{x:u},backend:n,attrs:{perm:m}}),p=s.backend_util.getInnerMostAxes(p.length,c)),s.backend_util.assertAxesAreInnerMostDims("all",p,c);const[b,j]=s.backend_util.computeOutAndReduceShapes(h.shape,p),g=s.util.sizeFromShape(j),w=Object(r.reshape)({inputs:{x:h},backend:n,attrs:{shape:[-1,g]}}),_=Object(o.reduce)(w,w.dtype,"all",n);let k;if(l){const e=s.backend_util.expandShapeToKeepDim(b,f);k=Object(r.reshape)({inputs:{x:_},backend:n,attrs:{shape:e}})}else k=Object(r.reshape)({inputs:{x:_},backend:n,attrs:{shape:b}});return n.disposeIntermediateTensorInfo(w),n.disposeIntermediateTensorInfo(_),null!=m&&n.disposeIntermediateTensorInfo(h),k}const u={kernelName:s.All,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Any.js": +/*!******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Any.js ***! + \******************************************************************/ +/*! exports provided: any, anyConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"any",(function(){return a})),n.d(t,"anyConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/reduce */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/reduce.js"),r=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),i=n(/*! ./Transpose */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the License); + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -const r=s.backend_util.ERF_P,i=s.backend_util.ERF_A1,a=s.backend_util.ERF_A2,d=s.backend_util.ERF_A3,u=s.backend_util.ERF_A4,l=s.backend_util.ERF_A5,c=Object(o.unaryKernelFunc)(s.Erf,(e=>{const t=Math.sign(e),n=Math.abs(e),s=1/(1+r*n);return t*(1-((((l*s+u)*s+d)*s+a)*s+i)*s*Math.exp(-n*n))})),f={kernelName:s.Erf,backendName:"cpu",kernelFunc:c}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Exp.js": -/*!***********************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Exp.js ***! - \***********************************************************************/ -/*! exports provided: expImpl, exp, expConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"expImpl",(function(){return i})),n.d(t,"exp",(function(){return a})),n.d(t,"expConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_impl.js"),r=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:u}=t,{axis:d,keepDims:l}=a,c=u.shape.length,f=s.util.parseAxisParam(d,u.shape);let p=f;const m=s.backend_util.getAxesPermutation(p,c);let h=u;null!=m&&(h=Object(i.transpose)({inputs:{x:u},backend:n,attrs:{perm:m}}),p=s.backend_util.getInnerMostAxes(p.length,c)),s.backend_util.assertAxesAreInnerMostDims("any",p,c);const[b,j]=s.backend_util.computeOutAndReduceShapes(h.shape,p),g=s.util.sizeFromShape(j),w=Object(r.reshape)({inputs:{x:h},backend:n,attrs:{shape:[-1,g]}}),_=Object(o.reduce)(w,w.dtype,"any",n);let k;if(l){const e=s.backend_util.expandShapeToKeepDim(b,f);k=Object(r.reshape)({inputs:{x:_},backend:n,attrs:{shape:e}})}else k=Object(r.reshape)({inputs:{x:_},backend:n,attrs:{shape:b}});return n.disposeIntermediateTensorInfo(w),n.disposeIntermediateTensorInfo(_),null!=m&&n.disposeIntermediateTensorInfo(h),k}const u={kernelName:s.Any,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ArgMax.js": +/*!*********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ArgMax.js ***! + \*********************************************************************/ +/*! exports provided: argMax, argMaxConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"argMax",(function(){return i})),n.d(t,"argMaxConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/arg_min_max */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/arg_min_max.js"),r=n(/*! ./Transpose */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the License); + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -const i=Object(o.createSimpleUnaryImpl)((e=>Math.exp(e))),a=Object(r.unaryKernelFuncFromImpl)(s.Exp,i),d={kernelName:s.Exp,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ExpandDims.js": -/*!******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ExpandDims.js ***! - \******************************************************************************/ -/*! exports provided: expandDims, expandDimsConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"expandDims",(function(){return r})),n.d(t,"expandDimsConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"); +function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{axis:u}=i;let d=s.util.parseAxisParam(u,a.shape);const l=s.backend_util.getAxesPermutation(d,a.shape.length);let c=a;const f=[];null!=l&&(c=Object(r.transpose)({inputs:{x:a},backend:n,attrs:{perm:l}}),f.push(c),d=s.backend_util.getInnerMostAxes(d.length,c.shape.length)),s.backend_util.assertAxesAreInnerMostDims("argMax",[d[0]],c.shape.length);const p=Object(o.argMinMaxReduce)(n,c,d[0],"max");return f.forEach((e=>n.disposeIntermediateTensorInfo(e))),p}const a={kernelName:s.ArgMax,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ArgMin.js": +/*!*********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ArgMin.js ***! + \*********************************************************************/ +/*! exports provided: argMin, argMinConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"argMin",(function(){return i})),n.d(t,"argMinConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/arg_min_max */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/arg_min_max.js"),r=n(/*! ./Transpose */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -1247,32 +1235,32 @@ const i=Object(o.createSimpleUnaryImpl)((e=>Math.exp(e))),a=Object(r.unaryKernel * limitations under the License. * ============================================================================= */ -function r(e){const{inputs:t,backend:n,attrs:r}=e,{input:i}=t,{dim:a}=r,d=i.shape.length,u=i.shape.slice();let l=a;return a<0&&(s.util.assert(-(d+1)<=a,(()=>`Axis must be in the interval [${-(d+1)}, ${d}]`)),l=d+a+1),u.splice(l,0,1),Object(o.reshape)({inputs:{x:i},backend:n,attrs:{shape:u}})}const i={kernelName:s.ExpandDims,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Expm1.js": -/*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Expm1.js ***! - \*************************************************************************/ -/*! exports provided: expm1Impl, expm1, expm1Config */function(e,t,n){"use strict";n.r(t),n.d(t,"expm1Impl",(function(){return i})),n.d(t,"expm1",(function(){return a})),n.d(t,"expm1Config",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_impl.js"),r=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{axis:u}=i;let d=s.util.parseAxisParam(u,a.shape);const l=s.backend_util.getAxesPermutation(d,a.shape.length);let c=a;const f=[];null!=l&&(c=Object(r.transpose)({inputs:{x:a},backend:n,attrs:{perm:l}}),f.push(c),d=s.backend_util.getInnerMostAxes(d.length,c.shape.length)),s.backend_util.assertAxesAreInnerMostDims("argMin",[d[0]],c.shape.length);const p=Object(o.argMinMaxReduce)(n,c,d[0],"min");return f.forEach((e=>n.disposeIntermediateTensorInfo(e))),p}const a={kernelName:s.ArgMin,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Asin.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Asin.js ***! + \*******************************************************************/ +/*! exports provided: asin, asinConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"asin",(function(){return i})),n.d(t,"asinConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the License); + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -const i=Object(o.createSimpleUnaryImpl)((e=>Math.expm1(e))),a=Object(r.unaryKernelFuncFromImpl)(s.Expm1,i),d={kernelName:s.Expm1,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FFT.js": -/*!***********************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FFT.js ***! - \***********************************************************************/ -/*! exports provided: fft, fftConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fft",(function(){return i})),n.d(t,"fftConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/fft_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/fft_utils.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"); +const r=n(/*! ../unaryop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js").CHECK_NAN_SNIPPET+"\n if (abs(x) > 1.) {\n return NAN;\n }\n return asin(x);\n",i=Object(o.unaryKernelFunc)({opSnippet:r}),a={kernelName:s.Asin,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Asinh.js": +/*!********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Asinh.js ***! + \********************************************************************/ +/*! exports provided: asinh, asinhConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"asinh",(function(){return i})),n.d(t,"asinhConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -1289,11 +1277,11 @@ const i=Object(o.createSimpleUnaryImpl)((e=>Math.expm1(e))),a=Object(r.unaryKern * limitations under the License. * ============================================================================= */ -function i(e){const{inputs:t,backend:n}=e,{input:i}=t,a=s.util.sizeFromShape(i.shape),d=i.shape[i.shape.length-1],u=a/d,l=Object(r.reshape)({inputs:{x:i},backend:n,attrs:{shape:[u,d]}}),c=Object(o.fftBatch)(l,!1,n),f=Object(r.reshape)({inputs:{x:c},backend:n,attrs:{shape:i.shape}});return n.disposeIntermediateTensorInfo(l),n.disposeIntermediateTensorInfo(c),f}const a={kernelName:s.FFT,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Fill.js": -/*!************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Fill.js ***! - \************************************************************************/ -/*! exports provided: fill, fillConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fill",(function(){return o})),n.d(t,"fillConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +const r=n(/*! ../unaryop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js").CHECK_NAN_SNIPPET+"return log(x + sqrt(x * x + 1.0));",i=Object(o.unaryKernelFunc)({opSnippet:r}),a={kernelName:s.Asinh,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Atan.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Atan.js ***! + \*******************************************************************/ +/*! exports provided: atan, atanConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"atan",(function(){return i})),n.d(t,"atanConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -1309,11 +1297,12 @@ function i(e){const{inputs:t,backend:n}=e,{input:i}=t,a=s.util.sizeFromShape(i.s * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */function o(e){const{backend:t,attrs:n}=e,{shape:o,value:r,dtype:i}=n,a=i||s.util.inferDtype(r),d=s.util.getArrayFromDType(a,s.util.sizeFromShape(o));return function(e,t,n){e.fill(t)}(d,r),t.makeTensorInfo(o,a,d)}const r={kernelName:s.Fill,backendName:"cpu",kernelFunc:o}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FlipLeftRight.js": -/*!*********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FlipLeftRight.js ***! - \*********************************************************************************/ -/*! exports provided: flipLeftRightConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"flipLeftRightConfig",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); + */ +const r=n(/*! ../unaryop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js").CHECK_NAN_SNIPPET+"\n return atan(x);\n",i=Object(o.unaryKernelFunc)({opSnippet:r}),a={kernelName:s.Atan,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Atan2.js": +/*!********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Atan2.js ***! + \********************************************************************/ +/*! exports provided: atan2, atan2Config */function(e,t,n){"use strict";n.r(t),n.d(t,"atan2",(function(){return a})),n.d(t,"atan2Config",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -1329,32 +1318,33 @@ function i(e){const{inputs:t,backend:n}=e,{input:i}=t,a=s.util.sizeFromShape(i.s * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */const o={kernelName:s.FlipLeftRight,backendName:"cpu",kernelFunc:({inputs:e,attrs:t,backend:n})=>{const{image:o}=e,r=n,i=s.util.getTypedArrayFromDType(o.dtype,s.util.sizeFromShape(o.shape)),[a,d,u,l]=o.shape,c=r.data.get(o.dataId).values;for(let e=0;e=0&&rMath.floor(e))),a=Object(r.unaryKernelFuncFromImpl)(s.Floor,i),d={kernelName:s.Floor,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FloorDiv.js": -/*!****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FloorDiv.js ***! - \****************************************************************************/ -/*! exports provided: floorDivImpl, floorDiv, floorDivConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"floorDivImpl",(function(){return i})),n.d(t,"floorDiv",(function(){return a})),n.d(t,"floorDivConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); +const r=n(/*! ../unaryop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js").CHECK_NAN_SNIPPET+"\n if ((x < -1.0) || (x > 1.0)) return NAN;\nreturn (log(1.0 + x) - log(1.0 - x)) / 2.0;",i=Object(o.unaryKernelFunc)({opSnippet:r}),a={kernelName:s.Atanh,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPool.js": +/*!**********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPool.js ***! + \**********************************************************************/ +/*! exports provided: avgPool, avgPoolConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"avgPool",(function(){return a})),n.d(t,"avgPoolConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../pool_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/pool_gpu.js"),r=n(/*! ../webgl_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"),i=n(/*! ./Identity */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -1371,11 +1361,11 @@ const i=Object(o.createSimpleUnaryImpl)((e=>Math.floor(e))),a=Object(r.unaryKern * limitations under the License. * ============================================================================= */ -const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>Math.floor(e/t))),a=Object(r.binaryKernelFunc)(s.FloorDiv,i,null,"int32"),d={kernelName:s.FloorDiv,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FusedConv2D.js": -/*!*******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FusedConv2D.js ***! - \*******************************************************************************/ -/*! exports provided: fusedConv2D, fusedConv2DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fusedConv2D",(function(){return a})),n.d(t,"fusedConv2DConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/fused_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/fused_utils.js"),r=n(/*! ./Add */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Add.js"),i=n(/*! ./Conv2D */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv2D.js"); +function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:u}=t;Object(r.assertNotComplex)(u,"avgPool");const{filterSize:d,strides:l,pad:c,dimRoundingMode:f}=a;s.util.assert(s.backend_util.eitherStridesOrDilationsAreOne(l,1),(()=>`Error in avgPool: Either strides or dilations must be 1. Got strides ${l} and dilations '1'`));const p=s.backend_util.computePool2DInfo(u.shape,d,l,1,c,f);if(1===p.filterWidth&&1===p.filterHeight&&s.util.arraysEqual(p.inShape,p.outShape))return Object(i.identity)({inputs:{x:u},backend:n});const m=new o.Pool2DProgram(p,"avg",!1);return n.runWebGLProgram(m,[u],"float32")}const u={kernelName:s.AvgPool,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPool3D.js": +/*!************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPool3D.js ***! + \************************************************************************/ +/*! exports provided: avgPool3D, avgPool3DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"avgPool3D",(function(){return r})),n.d(t,"avgPool3DConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../pool_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/pool_gpu.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -1392,11 +1382,11 @@ const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>Math.floor(e/t))),a=Objec * limitations under the License. * ============================================================================= */ -function a(e){const{inputs:t,backend:n,attrs:s}=e,{x:a,filter:d,bias:u,preluActivationWeights:l}=t,{strides:c,pad:f,dataFormat:p,dilations:m,dimRoundingMode:h,activation:b,leakyreluAlpha:j}=s;let g=Object(i.conv2D)({inputs:{x:a,filter:d},backend:n,attrs:{strides:c,pad:f,dataFormat:p,dilations:m,dimRoundingMode:h}});if(u){const e=g;g=Object(r.add)({inputs:{a:g,b:u},backend:n}),n.disposeIntermediateTensorInfo(e)}if(b){const e=g;g=Object(o.applyActivation)(n,g,b,l,j),n.disposeIntermediateTensorInfo(e)}return g}const d={kernelName:s.FusedConv2D,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FusedDepthwiseConv2D.js": -/*!****************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FusedDepthwiseConv2D.js ***! - \****************************************************************************************/ -/*! exports provided: fusedDepthwiseConv2D, fusedDepthwiseConv2DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fusedDepthwiseConv2D",(function(){return a})),n.d(t,"fusedDepthwiseConv2DConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/fused_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/fused_utils.js"),r=n(/*! ./Add */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Add.js"),i=n(/*! ./DepthwiseConv2dNative */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DepthwiseConv2dNative.js"); +function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i}=t,{filterSize:a,strides:u,pad:d,dimRoundingMode:l,dataFormat:c}=r,f=s.backend_util.computePool3DInfo(i.shape,a,u,[1,1,1],d,l,c),p=new o.Pool3DProgram(f,"avg",!1);return n.runWebGLProgram(p,[i],"float32")}const i={kernelName:s.AvgPool3D,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPool3DGrad.js": +/*!****************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPool3DGrad.js ***! + \****************************************************************************/ +/*! exports provided: avgPool3DGrad, avgPoolGrad3DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"avgPool3DGrad",(function(){return r})),n.d(t,"avgPoolGrad3DConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../avg_pool_backprop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/avg_pool_backprop_gpu.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -1413,11 +1403,11 @@ function a(e){const{inputs:t,backend:n,attrs:s}=e,{x:a,filter:d,bias:u,preluActi * limitations under the License. * ============================================================================= */ -function a(e){const{inputs:t,backend:n,attrs:s}=e,{x:a,filter:d,bias:u,preluActivationWeights:l}=t,{strides:c,pad:f,dataFormat:p,dilations:m,dimRoundingMode:h,activation:b,leakyreluAlpha:j}=s;let g=Object(i.depthwiseConv2dNative)({inputs:{x:a,filter:d},backend:n,attrs:{strides:c,pad:f,dataFormat:p,dilations:m,dimRoundingMode:h}});if(u){const e=g;g=Object(r.add)({inputs:{a:g,b:u},backend:n}),n.disposeIntermediateTensorInfo(e)}if(b){const e=g;g=Object(o.applyActivation)(n,g,b,l,j),n.disposeIntermediateTensorInfo(e)}return g}const d={kernelName:s.FusedDepthwiseConv2D,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GatherNd.js": -/*!****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GatherNd.js ***! - \****************************************************************************/ -/*! exports provided: gatherNd, gatherNdConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"gatherNd",(function(){return r})),n.d(t,"gatherNdConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./GatherNd_Impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GatherNd_Impl.js"); +function r(e){const{inputs:t,backend:n,attrs:r}=e,{dy:i,input:a}=t,u=a,{filterSize:d,strides:l,pad:c,dimRoundingMode:f}=r,p=s.backend_util.computePool3DInfo(u.shape,d,l,[1,1,1],c,f),m=new o.AvgPool3DBackpropProgram(p);return n.runWebGLProgram(m,[i],u.dtype)}const i={kernelName:s.AvgPool3DGrad,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPoolGrad.js": +/*!**************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPoolGrad.js ***! + \**************************************************************************/ +/*! exports provided: avgPoolGrad, avgPoolGradConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"avgPoolGrad",(function(){return i})),n.d(t,"avgPoolGradConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../avg_pool_backprop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/avg_pool_backprop_gpu.js"),r=n(/*! ../webgl_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -1434,14 +1424,14 @@ function a(e){const{inputs:t,backend:n,attrs:s}=e,{x:a,filter:d,bias:u,preluActi * limitations under the License. * ============================================================================= */ -function r(e){const{inputs:t,backend:n}=e,{params:r,indices:i}=t,a=s.util.sizeFromShape(r.shape),d=i.shape,u=d[d.length-1],[l,c,f,p]=s.backend_util.prepareAndValidate(r,i);if(0===c)return n.makeTensorInfo(l,r.dtype,[]);const m=n.data.get(i.dataId).values,h=n.bufferSync(r),b=Object(o.gatherNdImpl)(m,h,r.dtype,c,u,f,p,r.shape,a);return n.makeTensorInfo(l,r.dtype,b.values)}const i={kernelName:s.GatherNd,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GatherNd_Impl.js": -/*!*********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GatherNd_Impl.js ***! - \*********************************************************************************/ -/*! exports provided: gatherNdImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"gatherNdImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +function i(e){const{inputs:t,backend:n,attrs:i}=e,{dy:a,input:u}=t,d=u;Object(r.assertNotComplex)([a,u],"avgPoolGrad");const{filterSize:l,strides:c,pad:f}=i,p=s.backend_util.computePool2DInfo(d.shape,l,c,1,f),m=new o.AvgPool2DBackpropProgram(p);return n.runWebGLProgram(m,[a],d.dtype)}const a={kernelName:s.AvgPoolGrad,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchMatMul.js": +/*!**************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchMatMul.js ***! + \**************************************************************************/ +/*! exports provided: batchMatMul, batchMatMulConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"batchMatMul",(function(){return r})),n.d(t,"batchMatMulConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./BatchMatMul_impl */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchMatMul_impl.js"); /** * @license - * Copyright 2021 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -1453,12 +1443,13 @@ function r(e){const{inputs:t,backend:n}=e,{params:r,indices:i}=t,a=s.util.sizeFr * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - * ============================================================================= - */function o(e,t,n,o,r,i,a,d,u){const l=Object(s.buffer)([o,i],n);for(let n=0;n=u/i)throw new Error(`Invalid indices: ${s} does not index into ${d}`);for(let e=0;e=2&&g>=2&&C,(()=>`Error in matMul: the input batch dimensions must either be the same or at least one input batch dimension must be 1. Got input batch dimensions of (${x}) and (${y}).`));const S=(O>I?e.shape.slice(0,-2):t.shape.slice(0,-2)).concat([k,v]);s.util.assert(w===_,(()=>`Error in matMul: inner shapes (${w}) and (${_}) of Tensors with shapes ${e.shape} and ${t.shape} and transposeA=${n} and transposeB=${c} must match.`));const T=n?[O,w,k]:[O,k,w],N=c?[I,v,_]:[I,_,v],E=Object(a.reshape)({inputs:{x:e},backend:f,attrs:{shape:T}}),A=Object(a.reshape)({inputs:{x:t},backend:f,attrs:{shape:N}}),R=[E,A],F=Math.max(O,I),M=n?E.shape[1]:E.shape[2],$=null!=p,D=null!=m,P="leakyrelu"===b,B=null!=b?Object(o.mapActivationToShaderProgram)(b,!0):null;let L;if((1===k||1===v)&&M>l&&!1===($||D||P||null!=B)){let e=E,t=A;n&&(e=Object(d.transpose)({inputs:{x:E},backend:f,attrs:{perm:[0,2,1]}}),R.push(e)),c&&(t=Object(d.transpose)({inputs:{x:A},backend:f,attrs:{perm:[0,2,1]}}),R.push(t));const s=1===v;let o=e;1!==v&&(o=Object(a.reshape)({inputs:{x:e},backend:f,attrs:{shape:[F,M,1]}}),R.push(o));const r=1===v?2:1;let l=t;s&&(l=Object(a.reshape)({inputs:{x:t},backend:f,attrs:{shape:[F,1,M]}}),R.push(l));const p=Object(i.multiply)({inputs:{a:o,b:l},backend:f});L=Object(u.sum)({inputs:{x:p},backend:f,attrs:{axis:r,keepDims:!0}}),R.push(p)}else{const o=Object(s.upcastType)(e.dtype,t.dtype),i=new r.MatMulPackedProgram(T,N,[F,k,v],n,c,$,B,D,P),a=[E,A];if(null!=p&&a.push(p),D&&a.push(m),P){const e=f.makeTensorInfo([],"float32",s.util.createScalarValue(h,"float32"));a.push(e),R.push(e)}L=f.runWebGLProgram(i,a,o)}const z=Object(a.reshape)({inputs:{x:L},backend:f,attrs:{shape:S}});R.push(L);for(const e of R)f.disposeIntermediateTensorInfo(e);return z}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchNorm.js": +/*!************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchNorm.js ***! + \************************************************************************/ +/*! exports provided: batchNorm, batchNormConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"batchNorm",(function(){return i})),n.d(t,"batchNormConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../batchnorm_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/batchnorm_gpu.js"),r=n(/*! ../batchnorm_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/batchnorm_packed_gpu.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -1495,11 +1486,12 @@ function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:d,indices:u}=t,{axis:l,batc * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */function o(e,t,n){const o=Object(s.buffer)(n,e.dtype);for(let n=0;n{const{x:i,mean:a,variance:u,offset:d,scale:l}=e;s.util.assert(a.shape.length===u.shape.length,(()=>"Batch normalization gradient requires mean and variance to have equal ranks.")),s.util.assert(null==d||a.shape.length===d.shape.length,(()=>"Batch normalization gradient requires mean and offset to have equal ranks.")),s.util.assert(null==l||a.shape.length===l.shape.length,(()=>"Batch normalization gradient requires mean and scale to have equal ranks."));let{varianceEpsilon:c}=n;null==c&&(c=.001);const f=[i,a,u];let p=null;null!=d&&(p=d.shape,f.push(d));let m=null;null!=l&&(m=l.shape,f.push(l));const h=Object(s.env)().getBool("WEBGL_PACK_NORMALIZATION")?new r.BatchNormPackedProgram(i.shape,a.shape,u.shape,p,m,c):new o.BatchNormProgram(i.shape,a.shape,u.shape,p,m,c);return t.runWebGLProgram(h,f,f[0].dtype)},a={kernelName:s.FusedBatchNorm,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchToSpaceND.js": +/*!*****************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchToSpaceND.js ***! + \*****************************************************************************/ +/*! exports provided: batchToSpaceND, batchToSpaceNDConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"batchToSpaceND",(function(){return a})),n.d(t,"batchToSpaceNDConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),r=n(/*! ./Slice */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Slice.js"),i=n(/*! ./Transpose */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -1516,11 +1508,11 @@ function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:d,indices:u}=t,{axis:l,batc * limitations under the License. * ============================================================================= */ -const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>e>t?1:0)),a=Object(r.binaryKernelFunc)(s.Greater,i,null,"bool"),d={kernelName:s.Greater,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GreaterEqual.js": -/*!********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GreaterEqual.js ***! - \********************************************************************************/ -/*! exports provided: greaterEqualImpl, greaterEqual, greaterEqualConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"greaterEqualImpl",(function(){return i})),n.d(t,"greaterEqual",(function(){return a})),n.d(t,"greaterEqualConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); +const a=e=>{const{inputs:t,backend:n,attrs:a}=e,{x:u}=t,{blockShape:d,crops:l}=a;s.util.assert(u.shape.length<=4,(()=>"batchToSpaceND for rank > 4 with a WebGL backend not implemented yet"));const c=d.reduce(((e,t)=>e*t)),f=s.backend_util.getReshaped(u.shape,d,c),p=s.backend_util.getPermuted(f.length,d.length),m=s.backend_util.getReshapedPermuted(u.shape,d,c),h=s.backend_util.getSliceBeginCoords(l,d.length),b=s.backend_util.getSliceSize(m,l,d.length),j=[],g=Object(o.reshape)({inputs:{x:u},backend:n,attrs:{shape:f}}),w=Object(i.transpose)({inputs:{x:g},backend:n,attrs:{perm:p}}),_=Object(o.reshape)({inputs:{x:w},backend:n,attrs:{shape:m}}),k=Object(r.slice)({inputs:{x:_},backend:n,attrs:{begin:h,size:b}});return j.push(g),j.push(w),j.push(_),j.forEach((e=>n.disposeIntermediateTensorInfo(e))),k},u={kernelName:s.BatchToSpaceND,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Bincount.js": +/*!***********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Bincount.js ***! + \***********************************************************************/ +/*! exports provided: bincount, bincountConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"bincount",(function(){return r})),n.d(t,"bincountConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -1537,11 +1529,11 @@ const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>e>t?1:0)),a=Object(r.bina * limitations under the License. * ============================================================================= */ -const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>e>=t?1:0)),a=Object(r.binaryKernelFunc)(s.GreaterEqual,i,null,"bool"),d={kernelName:s.GreaterEqual,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IFFT.js": -/*!************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IFFT.js ***! - \************************************************************************/ -/*! exports provided: ifft, ifftConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"ifft",(function(){return i})),n.d(t,"ifftConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/fft_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/fft_utils.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"); +function r(e){const{inputs:t,backend:n,attrs:s}=e,{x:r,weights:i}=t,{size:a}=s,u=n.readSync(r.dataId),d=n.readSync(i.dataId),l=Object(o.bincountImplCPU)(u,d,i.dtype,i.shape,a);return n.makeTensorInfo([a],i.dtype,l)}const i={kernelName:s.Bincount,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Cast.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Cast.js ***! + \*******************************************************************/ +/*! exports provided: cast, castConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"cast",(function(){return d})),n.d(t,"castConfig",(function(){return l}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Complex */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js"),r=n(/*! ./Identity */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"),i=n(/*! ./NotEqual */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/NotEqual.js"),a=n(/*! ./Real */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Real.js"),u=n(/*! ../kernel_utils/int */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/int.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -1558,11 +1550,11 @@ const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>e>=t?1:0)),a=Object(r.bin * limitations under the License. * ============================================================================= */ -function i(e){const{inputs:t,backend:n}=e,{input:i}=t,a=s.util.sizeFromShape(i.shape),d=i.shape[i.shape.length-1],u=a/d,l=Object(r.reshape)({inputs:{x:i},backend:n,attrs:{shape:[u,d]}}),c=Object(o.fftBatch)(l,!0,n),f=Object(r.reshape)({inputs:{x:c},backend:n,attrs:{shape:i.shape}});return n.disposeIntermediateTensorInfo(l),n.disposeIntermediateTensorInfo(c),f}const a={kernelName:s.IFFT,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Identity.js": -/*!****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Identity.js ***! - \****************************************************************************/ -/*! exports provided: identity, identityConfig */function(e,t,n){"use strict"; +function d(e){const{inputs:t,backend:n,attrs:l}=e,{x:c}=t,{dtype:f}=l;if("complex64"===f){if("complex64"===c.dtype)return Object(r.identity)({inputs:{x:c},backend:n});const e=s.zeros(c.shape),t=d({inputs:{x:c},backend:n,attrs:{dtype:"float32"}}),i=Object(o.complex)({inputs:{real:t,imag:e},backend:n});return e.dispose(),n.disposeIntermediateTensorInfo(t),i}if("complex64"===c.dtype){const e=Object(a.real)({inputs:{input:c},backend:n}),t=d({inputs:{x:e},backend:n,attrs:{dtype:f}});return n.disposeIntermediateTensorInfo(e),t}if(!s.util.hasEncodingLoss(c.dtype,f)){const e=Object(r.identity)({inputs:{x:c},backend:n});return{dataId:e.dataId,shape:e.shape,dtype:f}}if("int32"===f)return Object(u.int)(c,n);if("bool"===f){const e=n.makeTensorInfo([],"bool",s.util.getTypedArrayFromDType("bool",1)),t={a:c,b:e},o=Object(i.notEqual)({inputs:t,backend:n});return n.disposeIntermediateTensorInfo(e),o}throw new Error(`Error in Cast: failed to cast ${c.dtype} to ${f}`)}const l={kernelName:s.Cast,backendName:"webgl",kernelFunc:d}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Ceil.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Ceil.js ***! + \*******************************************************************/ +/*! exports provided: ceil, ceilConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"ceil",(function(){return a})),n.d(t,"ceilConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -1579,11 +1571,11 @@ function i(e){const{inputs:t,backend:n}=e,{input:i}=t,a=s.util.sizeFromShape(i.s * limitations under the License. * ============================================================================= */ -function s(e){const{inputs:t,backend:n}=e,{x:s}=t;return n.incRef(s.dataId),{dataId:s.dataId,shape:s.shape,dtype:s.dtype}}n.r(t),n.d(t,"identity",(function(){return s})),n.d(t,"identityConfig",(function(){return o}));const o={kernelName:n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js").Identity,backendName:"cpu",kernelFunc:s}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Imag.js": -/*!************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Imag.js ***! - \************************************************************************/ -/*! exports provided: imag, imagConfig */function(e,t,n){"use strict"; +const i="return ceil(x);",a=Object(o.unaryKernelFunc)({opSnippet:i,packedOpSnippet:i,cpuKernelImpl:r.ceilImplCPU}),u={kernelName:s.Ceil,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ClipByValue.js": +/*!**************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ClipByValue.js ***! + \**************************************************************************/ +/*! exports provided: clipByValue, clipByValueConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"clipByValue",(function(){return i})),n.d(t,"clipByValueConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../clip_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/clip_gpu.js"),r=n(/*! ../clip_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/clip_packed_gpu.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -1600,74 +1592,74 @@ function s(e){const{inputs:t,backend:n}=e,{x:s}=t;return n.incRef(s.dataId),{dat * limitations under the License. * ============================================================================= */ -function s(e){const{inputs:t,backend:n}=e,{input:s}=t,o=n.data.get(s.dataId).complexTensorInfos.imag,r=n.data.get(o.dataId).values;return n.makeTensorInfo(o.shape,o.dtype,r)}n.r(t),n.d(t,"imag",(function(){return s})),n.d(t,"imagConfig",(function(){return o}));const o={kernelName:n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js").Imag,backendName:"cpu",kernelFunc:s}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsFinite.js": -/*!****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsFinite.js ***! - \****************************************************************************/ -/*! exports provided: isFinite, isFiniteConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"isFinite",(function(){return r})),n.d(t,"isFiniteConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{clipValueMin:u,clipValueMax:d}=i;let l;l=Object(s.env)().getBool("WEBGL_PACK_CLIP")?new r.ClipPackedProgram(a.shape):new o.ClipProgram(a.shape);const c=[[u],[d]];return n.runWebGLProgram(l,[a],a.dtype,c)}const a={kernelName:s.ClipByValue,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js": +/*!**********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js ***! + \**********************************************************************/ +/*! exports provided: complex, complexConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"complex",(function(){return r})),n.d(t,"complexConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Identity */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the License); + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -const r=Object(o.unaryKernelFunc)(s.IsFinite,(e=>Number.isFinite(e)?1:0),"bool"),i={kernelName:s.IsFinite,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsInf.js": +function r(e){const{inputs:t,backend:n}=e,{real:s,imag:r}=t,i=n.makeTensorInfo(s.shape,"complex64"),a=n.texData.get(i.dataId),u=Object(o.identity)({inputs:{x:s},backend:n}),d=Object(o.identity)({inputs:{x:r},backend:n});return a.complexTensorInfos={real:u,imag:d},i}const i={kernelName:s.Complex,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ComplexAbs.js": /*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsInf.js ***! + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ComplexAbs.js ***! \*************************************************************************/ -/*! exports provided: isInf, isInfConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"isInf",(function(){return r})),n.d(t,"isInfConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/*! exports provided: complexAbs, complexAbsConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"complexAbs",(function(){return i})),n.d(t,"complexAbsConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../complex_abs_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/complex_abs_gpu.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the License); + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -const r=Object(o.unaryKernelFunc)(s.IsInf,(e=>Math.abs(e)===1/0?1:0),"bool"),i={kernelName:s.IsInf,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsNaN.js": -/*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsNaN.js ***! - \*************************************************************************/ -/*! exports provided: isNaN, isNaNConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"isNaN",(function(){return r})),n.d(t,"isNaNConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +function r(e,t){return{dataId:t.dataId,dtype:t.dtype,shape:e.shape}}function i(e){const{inputs:t,backend:n}=e,{x:s}=t,i=n.texData.get(s.dataId),a=new o.ComplexAbsProgram(s.shape),u=[r(s,i.complexTensorInfos.real),r(s,i.complexTensorInfos.imag)];return n.runWebGLProgram(a,u,u[0].dtype)}const a={kernelName:s.ComplexAbs,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Concat.js": +/*!*********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Concat.js ***! + \*********************************************************************/ +/*! exports provided: concat, concatConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"concat",(function(){return i})),n.d(t,"concatConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Concat_impl */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Concat_impl.js"),r=n(/*! ./Identity */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the License); + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -const r=Object(o.unaryKernelFunc)(s.IsNan,(e=>Number.isNaN(e)?1:0),"bool"),i={kernelName:s.IsNan,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LRN.js": -/*!***********************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LRN.js ***! - \***********************************************************************/ -/*! exports provided: lRN, lRNConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"lRN",(function(){return r})),n.d(t,"lRNConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +function i(e){const{inputs:t,backend:n,attrs:i}=e,{axis:a}=i,u=s.util.parseAxisParam(a,t[0].shape)[0],d=s.backend_util.computeOutShape(t.map((e=>e.shape)),u);if(0===s.util.sizeFromShape(d))return n.makeTensorInfo(d,t[0].dtype,[]);const l=t.filter((e=>s.util.sizeFromShape(e.shape)>0));if(1===l.length)return Object(r.identity)({inputs:{x:l[0]},backend:n});const c=l.map((e=>e.shape));return s.backend_util.assertParamsConsistent(c,u),Object(o.concatImpl)(l,u,n)}const a={kernelName:s.Concat,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Concat_impl.js": +/*!**************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Concat_impl.js ***! + \**************************************************************************/ +/*! exports provided: concatImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"concatImpl",(function(){return c}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../concat_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/concat_gpu.js"),r=n(/*! ../concat_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/concat_packed_gpu.js"),i=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"),a=n(/*! ./Complex */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js"),u=n(/*! ./Imag */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Imag.js"),d=n(/*! ./Real */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Real.js"),l=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -1684,11 +1676,11 @@ const r=Object(o.unaryKernelFunc)(s.IsNan,(e=>Number.isNaN(e)?1:0),"bool"),i={ke * limitations under the License. * ============================================================================= */ -function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i}=t,{depthRadius:a,bias:d,alpha:u,beta:l}=r;Object(o.assertNotComplex)(i,"LRN");const c=i.shape[3],f=c-1,p=n.data.get(i.dataId).values,m=s.util.sizeFromShape(i.shape),h=new Float32Array(m);function b(e){const t=e%c;let n=e-t+Math.max(0,t-a);const s=e-t+Math.min(t+a,f);let o=0;for(;n<=s;n++){const e=p[n];o+=e*e}return o}for(let e=0;eObject(d.real)({inputs:{input:e},backend:n}))),o=e.map((e=>Object(u.imag)({inputs:{input:e},backend:n}))),r=c(s,t,n),i=c(o,t,n),l=Object(a.complex)({inputs:{real:r,imag:i},backend:n});return s.forEach((e=>n.disposeIntermediateTensorInfo(e))),o.forEach((e=>n.disposeIntermediateTensorInfo(e))),n.disposeIntermediateTensorInfo(r),n.disposeIntermediateTensorInfo(i),l}let p=n.shouldExecuteOnCPU(e);if("string"===f&&(p=!0),p){const o=e.map((e=>{const o=[-1,s.util.sizeFromShape(e.shape.slice(t))];return Object(l.reshape)({inputs:{x:e},backend:n,attrs:{shape:o}})})),r=o.map((e=>({vals:n.readSync(e.dataId),shape:e.shape}))),a=s.backend_util.computeOutShape(o.map((e=>e.shape)),1),u=1===o[0].shape[0],d=Object(i.concatImplCPU)(r,a,f,u),c=s.backend_util.computeOutShape(e.map((e=>e.shape)),t),p=n.makeTensorInfo(c,f,d);return o.forEach((e=>n.disposeIntermediateTensorInfo(e))),p}if(e.length>Object(s.env)().getNumber("WEBGL_MAX_TEXTURES_IN_SHADER")){const s=Math.floor(e.length/2),o=c(e.slice(0,s),t,n),r=c(e.slice(s),t,n),i=c([o,r],t,n);return n.disposeIntermediateTensorInfo(o),n.disposeIntermediateTensorInfo(r),i}if(Object(s.env)().getBool("WEBGL_PACK_ARRAY_OPERATIONS")&&e[0].shape.length>1){const s=new r.ConcatPackedProgram(e.map((e=>e.shape)),t);return n.runWebGLProgram(s,e,f)}const{tensors2D:m,outShape:h}=function(e,t,n){const o=s.backend_util.computeOutShape(e.map((e=>e.shape)),t);return{tensors2D:e.map((e=>Object(l.reshape)({inputs:{x:e},attrs:{shape:[-1,s.util.sizeFromShape(e.shape.slice(t))]},backend:n}))),outShape:o}}(e,t,n),b=new o.ConcatProgram(m.map((e=>e.shape))),j=n.runWebGLProgram(b,m,f);m.forEach((e=>n.disposeIntermediateTensorInfo(e)));const g=Object(l.reshape)({inputs:{x:j},attrs:{shape:h},backend:n});return n.disposeIntermediateTensorInfo(j),g}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2D.js": +/*!*********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2D.js ***! + \*********************************************************************/ +/*! exports provided: conv2d, conv2DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"conv2d",(function(){return a})),n.d(t,"conv2DConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../conv_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/conv_gpu.js"),r=n(/*! ./Conv2D_impl */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2D_impl.js"),i=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -1705,11 +1697,11 @@ function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i}=t,{depthRadius:a,bias:d, * limitations under the License. * ============================================================================= */ -function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i,y:a,dy:d}=t,{depthRadius:u,bias:l,alpha:c,beta:f}=r;Object(o.assertNotComplex)(d,"LRNGrad");const p=s.util.sizeFromShape(d.shape),m=d.shape[3],h=n.data.get(d.dataId).values,b=n.data.get(i.dataId).values,j=n.data.get(a.dataId).values,g=new Float32Array(p),w=p;for(let e=0;eeee<=t?1:0)),a=Object(r.binaryKernelFunc)(s.LessEqual,i,null,"bool"),d={kernelName:s.LessEqual,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LinSpace.js": -/*!****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LinSpace.js ***! - \****************************************************************************/ -/*! exports provided: linSpace, linSpaceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"linSpace",(function(){return r})),n.d(t,"linSpaceConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./LinSpace_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LinSpace_impl.js"); +function c({x:e,filter:t,convInfo:n,backend:o,bias:r=null,preluActivationWeights:i=null,leakyreluAlpha:c=0,activation:f=null}){const p=e.shape,m=o.texData.get(e.dataId),h=n.inChannels,b=p[0]*p[1]*p[2],j=n.outChannels,g="channelsLast"===n.dataFormat;let w;const _=[];if(!((1===b||1===j)&&h>u.MATMUL_SHARED_DIM_THRESHOLD)&&m.isPacked&&g&&null!=m.texture&&p[2]%2!=0&&s.util.arraysEqual(m.shape.slice(-3),p.slice(-3))){const h=p[0]*p[1]*(p[2]+1),b={dataId:e.dataId,shape:[1,h,n.inChannels],dtype:e.dtype},j=m.shape;m.shape=m.shape.slice(),m.shape[m.shape.length-2]++,s.util.assert(a.isReshapeFree(m.shape,b.shape),(()=>`packed reshape ${m.shape} to ${b.shape} isn't free`));const g=Object(l.reshape)({inputs:{x:t},backend:o,attrs:{shape:[1,n.inChannels,n.outChannels]}});_.push(g);const k=Object(u.batchMatMulImpl)({a:b,b:g,backend:o,transposeA:false,transposeB:false,bias:r,activation:f,preluActivationWeights:i,leakyreluAlpha:c}),v=o.texData.get(k.dataId);s.util.assert(v.isPacked,(()=>"batchMatMul result is expected to be packed")),m.shape=j,v.shape=n.outShape,w=Object(d.identity)({inputs:{x:k},backend:o}),w.shape=n.outShape,_.push(k)}else{const s=g?p[0]*p[1]*p[2]:p[0]*p[2]*p[3],a=Object(l.reshape)({inputs:{x:e},backend:o,attrs:{shape:[1,s,n.inChannels]}}),d=Object(l.reshape)({inputs:{x:t},backend:o,attrs:{shape:[1,n.inChannels,n.outChannels]}}),m=Object(u.batchMatMulImpl)({a:a,b:d,transposeA:false,transposeB:false,backend:o,bias:r,activation:f,preluActivationWeights:i,leakyreluAlpha:c});w=Object(l.reshape)({inputs:{x:m},backend:o,attrs:{shape:n.outShape}}),_.push(a),_.push(d),_.push(m)}for(const e of _)o.disposeIntermediateTensorInfo(e);return w}function f({x:e,filter:t,convInfo:n,backend:a,bias:u=null,preluActivationWeights:d=null,leakyreluAlpha:c=0,activation:f=null}){const{filterWidth:p,filterHeight:m,inChannels:h,outWidth:b,outHeight:j,dataFormat:g}=n,w="channelsLast"===g,_=p*m*h,k=j*b,v=[_,k],x=[],y=Object(l.reshape)({inputs:{x:e},backend:a,attrs:{shape:e.shape.slice(1)}}),O=Object(l.reshape)({inputs:{x:t},backend:a,attrs:{shape:[1,_,s.util.sizeFromShape(t.shape)/_]}});x.push(y),x.push(O);const I=new o.Im2ColPackedProgram(v,n),C=[y.shape,[n.padInfo.top,n.padInfo.left],[n.strideHeight,n.strideWidth],[n.dilationHeight,n.dilationWidth],[n.inChannels],[n.filterWidth*n.inChannels],[n.outWidth]],S=a.runWebGLProgram(I,[y],"float32",C),T=Object(l.reshape)({inputs:{x:S},backend:a,attrs:{shape:[1,v[0],v[1]]}});x.push(S),x.push(T);const N=null!=u,E=null!=d,A="leakyrelu"===f,R=f?Object(r.mapActivationToShaderProgram)(f,!0):null,F=new i.MatMulPackedProgram(T.shape,O.shape,[1,k,n.outChannels],!0,!1,N,R,E,A),M=[T,O];if(u&&M.push(u),E&&M.push(d),A){const e=a.makeTensorInfo([],"float32",s.util.createScalarValue(c,"float32"));M.push(e),x.push(e)}const $=a.runWebGLProgram(F,M,"float32"),D=w?[1,j,b,n.outChannels]:[1,n.outChannels,j,b],P=Object(l.reshape)({inputs:{x:$},backend:a,attrs:{shape:D}});x.push($);for(const e of x)a.disposeIntermediateTensorInfo(e);return P}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv3D.js": +/*!*********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv3D.js ***! + \*********************************************************************/ +/*! exports provided: conv3D, conv3DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"conv3D",(function(){return r})),n.d(t,"conv3DConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../conv_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/conv_gpu.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -1789,11 +1781,11 @@ const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>e<=t?1:0)),a=Object(r.bin * limitations under the License. * ============================================================================= */ -function r(e){const{backend:t,attrs:n}=e,{start:s,stop:r,num:i}=n,a=Object(o.linSpaceImpl)(s,r,i);return t.makeTensorInfo([a.length],"float32",a)}const i={kernelName:s.LinSpace,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LinSpace_impl.js": -/*!*********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LinSpace_impl.js ***! - \*********************************************************************************/ -/*! exports provided: linSpaceImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"linSpaceImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i,filter:a}=t,{strides:u,pad:d,dilations:l}=r,c=s.backend_util.computeConv3DInfo(i.shape,a.shape,u,l,d),f=new o.Conv3DProgram(c);return n.runWebGLProgram(f,[i,a],"float32")}const i={kernelName:s.Conv3D,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv3DBackpropFilterV2.js": +/*!*************************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv3DBackpropFilterV2.js ***! + \*************************************************************************************/ +/*! exports provided: conv3DBackpropFilterV2, conv3DBackpropFilterV2Config */function(e,t,n){"use strict";n.r(t),n.d(t,"conv3DBackpropFilterV2",(function(){return r})),n.d(t,"conv3DBackpropFilterV2Config",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../conv_backprop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -1809,53 +1801,54 @@ function r(e){const{backend:t,attrs:n}=e,{start:s,stop:r,num:i}=n,a=Object(o.lin * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */function o(e,t,n){const o=(t-e)/(n-1),r=s.util.makeZerosTypedArray(n,"float32");r[0]=e;for(let e=1;eMath.log(e))),a=Object(r.unaryKernelFuncFromImpl)(s.Log,i),d={kernelName:s.Log,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Log1p.js": -/*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Log1p.js ***! - \*************************************************************************/ -/*! exports provided: log1p, log1pConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"log1p",(function(){return r})),n.d(t,"log1pConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +function r(e){const{inputs:t,backend:n,attrs:r}=e,{dy:i,filter:a}=t,{pad:u,strides:d,inputShape:l}=r,c=s.backend_util.computeConv3DInfo(l,a.shape,d,1,u),f=new o.Conv3DDerInputProgram(c);return n.runWebGLProgram(f,[i,a],"float32")}const i={kernelName:s.Conv3DBackpropInputV2,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Cos.js": +/*!******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Cos.js ***! + \******************************************************************/ +/*! exports provided: cos, cosConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"cos",(function(){return i})),n.d(t,"cosConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the License); + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -const r=Object(o.unaryKernelFunc)(s.Log1p,(e=>Math.log1p(e))),i={kernelName:s.Log1p,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalAnd.js": -/*!******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalAnd.js ***! - \******************************************************************************/ -/*! exports provided: logicalAndImpl, logicalAnd, logicalAndConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"logicalAndImpl",(function(){return i})),n.d(t,"logicalAnd",(function(){return a})),n.d(t,"logicalAndConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); +const r=o.CHECK_NAN_SNIPPET_UNARY+"\n return cos(x);\n",i=Object(o.unaryKernelFunc)({opSnippet:r}),a={kernelName:s.Cos,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Cosh.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Cosh.js ***! + \*******************************************************************/ +/*! exports provided: cosh, coshConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"cosh",(function(){return r})),n.d(t,"coshConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -1872,32 +1865,32 @@ const r=Object(o.unaryKernelFunc)(s.Log1p,(e=>Math.log1p(e))),i={kernelName:s.Lo * limitations under the License. * ============================================================================= */ -const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>e&&t)),a=Object(r.binaryKernelFunc)(s.LogicalAnd,i,null,"bool"),d={kernelName:s.LogicalAnd,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalNot.js": -/*!******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalNot.js ***! - \******************************************************************************/ -/*! exports provided: logicalNot, logicalNotConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"logicalNot",(function(){return r})),n.d(t,"logicalNotConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +const r=Object(o.unaryKernelFunc)({opSnippet:"\n float e2x = exp(-x);\n return (e2x + 1.0 / e2x) / 2.0;\n"}),i={kernelName:s.Cosh,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/CropAndResize.js": +/*!****************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/CropAndResize.js ***! + \****************************************************************************/ +/*! exports provided: cropAndResize, cropAndResizeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"cropAndResize",(function(){return r})),n.d(t,"cropAndResizeConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../crop_and_resize_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/crop_and_resize_gpu.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the License); + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -const r=Object(o.unaryKernelFunc)(s.LogicalNot,(e=>e?0:1),"bool"),i={kernelName:s.LogicalNot,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalOr.js": -/*!*****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalOr.js ***! - \*****************************************************************************/ -/*! exports provided: logicalOrImpl, logicalOr, logicalOrConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"logicalOrImpl",(function(){return i})),n.d(t,"logicalOr",(function(){return a})),n.d(t,"logicalOrConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); +const r=e=>{const{inputs:t,backend:n,attrs:s}=e,{image:r,boxes:i,boxInd:a}=t,{cropSize:u,method:d,extrapolationValue:l}=s,c=new o.CropAndResizeProgram(r.shape,i.shape,u,d,l);return n.runWebGLProgram(c,[r,i,a],"float32")},i={kernelName:s.CropAndResize,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Cumsum.js": +/*!*********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Cumsum.js ***! + \*********************************************************************/ +/*! exports provided: cumsum, cumsumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"cumsum",(function(){return a})),n.d(t,"cumsumConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cumsum_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/cumsum_gpu.js"),r=n(/*! ./Identity */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"),i=n(/*! ./Transpose */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -1914,11 +1907,11 @@ const r=Object(o.unaryKernelFunc)(s.LogicalNot,(e=>e?0:1),"bool"),i={kernelName: * limitations under the License. * ============================================================================= */ -const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>e||t)),a=Object(r.binaryKernelFunc)(s.LogicalOr,i,null,"bool"),d={kernelName:s.LogicalOr,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Max.js": -/*!***********************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Max.js ***! - \***********************************************************************/ -/*! exports provided: max, maxConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"max",(function(){return a})),n.d(t,"maxConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./Max_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Max_impl.js"),i=n(/*! ./Transpose_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose_impl.js"); +function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:u}=t,{axis:d,exclusive:l,reverse:c}=a,f=u.shape.length,p=s.backend_util.getAxesPermutation([d],f);let m=u;null!=p&&(m=Object(i.transpose)({inputs:{x:u},backend:n,attrs:{perm:p}}));const h=s.backend_util.getInnerMostAxes(1,f)[0];if(h!==f-1)throw new Error(`WebGL cumsum shader expects an inner-most axis=${u.shape.length-1} but got axis=${d}`);const b=m.shape[h];let j=Object(r.identity)({inputs:{x:m},backend:n});for(let e=0;e<=Math.ceil(Math.log2(b))-1;e++){const t=new o.CumSumProgram(m.shape,!1,c),s=[[e]],r=j;j=n.runWebGLProgram(t,[j],j.dtype,s),n.disposeIntermediateTensorInfo(r)}if(l){const e=new o.CumSumProgram(m.shape,l,c),t=j;j=n.runWebGLProgram(e,[j],j.dtype),n.disposeIntermediateTensorInfo(t)}if(null!=p){const e=s.backend_util.getUndoAxesPermutation(p),t=Object(i.transpose)({inputs:{x:j},backend:n,attrs:{perm:e}});return n.disposeIntermediateTensorInfo(j),n.disposeIntermediateTensorInfo(m),t}return j}const u={kernelName:s.Cumsum,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/DenseBincount.js": +/*!****************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/DenseBincount.js ***! + \****************************************************************************/ +/*! exports provided: denseBincount, denseBincountConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"denseBincount",(function(){return r})),n.d(t,"denseBincountConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -1935,11 +1928,11 @@ const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>e||t)),a=Object(r.binaryK * limitations under the License. * ============================================================================= */ -function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:d}=t,{reductionIndices:u,keepDims:l}=a,c=n;let f=d.shape;const p=f.length,m=s.util.parseAxisParam(u,f);let h=m;const b=s.backend_util.getAxesPermutation(h,p);let j=c.data.get(d.dataId).values;if(null!=b){const e=new Array(p);for(let t=0;t`Error in maxPool: Either strides or dilations must be 1. Got strides ${l} and dilations '1'`));const p=s.backend_util.computePool2DInfo(d.shape,u,l,1,c,f);let m;if(1===p.filterWidth&&1===p.filterHeight&&s.util.arraysEqual(p.inShape,p.outShape))m=Object(i.identity)({inputs:{x:d},backend:n});else{const e=n.data.get(d.dataId).values,t=s.util.computeStrides(d.shape),o=Object(r.pool)(e,d.shape,d.dtype,t,p,"max");m=n.makeTensorInfo(p.outShape,d.dtype,o.values)}return m}const d={kernelName:s.MaxPool,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPool3D.js": -/*!*****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPool3D.js ***! - \*****************************************************************************/ -/*! exports provided: maxPool3D, maxPool3DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPool3D",(function(){return i})),n.d(t,"maxPool3DConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ../utils/pool_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/pool_utils.js"); +function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i}=t,{blockSize:a,dataFormat:u}=r;s.util.assert(a>1,(()=>`blockSize should be > 1 for depthToSpace, but was: ${a}`));const d=i.shape[0],l="NHWC"===u?i.shape[1]:i.shape[2],c="NHWC"===u?i.shape[2]:i.shape[3],f="NHWC"===u?i.shape[3]:i.shape[1],p=l*a,m=c*a,h=f/(a*a),b="NHWC"===u?[d,p,m,h]:[d,h,p,m],j=new o.DepthToSpaceProgram(b,a,u);return n.runWebGLProgram(j,[i],i.dtype)}const i={kernelName:s.DepthToSpace,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthwiseConv2dNative.js": +/*!************************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthwiseConv2dNative.js ***! + \************************************************************************************/ +/*! exports provided: depthwiseConv2dNative, depthwiseConv2dNativeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"depthwiseConv2dNative",(function(){return i})),n.d(t,"depthwiseConv2dNativeConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../conv_gpu_depthwise */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/conv_gpu_depthwise.js"),r=n(/*! ../conv_packed_gpu_depthwise */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/conv_packed_gpu_depthwise.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -1977,11 +1970,11 @@ function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:d}=t;Object(o.assertNotComp * limitations under the License. * ============================================================================= */ -function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{filterSize:d,strides:u,pad:l,dimRoundingMode:c,dataFormat:f}=i;Object(o.assertNotComplex)(a,"maxPool3d");const p=s.backend_util.computePool3DInfo(a.shape,d,u,1,l,c,f),m=n.data.get(a.dataId).values,h=Object(r.pool3d)(m,a.shape,a.dtype,s.util.computeStrides(a.shape),p,"max");return n.makeTensorInfo(h.shape,"float32",h.values)}const a={kernelName:s.MaxPool3D,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPool3DGrad.js": -/*!*********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPool3DGrad.js ***! - \*********************************************************************************/ -/*! exports provided: maxPool3DGrad, maxPool3DGradConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPool3DGrad",(function(){return i})),n.d(t,"maxPool3DGradConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ../utils/pool_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/pool_utils.js"); +function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a,filter:u}=t,{strides:d,pad:l,dilations:c,dimRoundingMode:f}=i;let p=c;null==p&&(p=[1,1]),s.util.assert(s.backend_util.eitherStridesOrDilationsAreOne(d,p),(()=>`Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides ${d} and dilations '${p}'`));const m=s.backend_util.computeConv2DInfo(a.shape,u.shape,d,p,l,f,!0);let h;h=Object(s.env)().getBool("WEBGL_PACK_DEPTHWISECONV")&&m.strideWidth<=2&&m.outChannels/m.inChannels==1?new r.DepthwiseConvPacked2DProgram(m):new o.DepthwiseConv2DProgram(m);const b=[[m.padInfo.top,m.padInfo.left],[m.strideHeight,m.strideWidth],[m.dilationHeight,m.dilationWidth],[m.inHeight,m.inWidth]];return n.runWebGLProgram(h,[a,u],"float32",b)}const a={kernelName:s.DepthwiseConv2dNative,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthwiseConv2dNativeBackpropFilter.js": +/*!**************************************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthwiseConv2dNativeBackpropFilter.js ***! + \**************************************************************************************************/ +/*! exports provided: depthwiseConv2dNativeBackpropFilter, depthwiseConv2dNativeBackpropFilterConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"depthwiseConv2dNativeBackpropFilter",(function(){return r})),n.d(t,"depthwiseConv2dNativeBackpropFilterConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../conv_backprop_gpu_depthwise */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu_depthwise.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -1998,11 +1991,11 @@ function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{filterSize:d,strides: * limitations under the License. * ============================================================================= */ -function i(e){const{inputs:t,backend:n,attrs:i}=e,{dy:a,input:d}=t,{filterSize:u,strides:l,pad:c,dimRoundingMode:f}=i;Object(o.assertNotComplex)([a,d],"maxPool3DGrad");const p=s.backend_util.computePool3DInfo(d.shape,u,l,1,c,f),m=n.bufferSync(d),h=Object(r.maxPool3dPositions)(m,p),b=p.strideDepth,j=p.strideHeight,g=p.strideWidth,w=p.dilationDepth,_=p.dilationHeight,k=p.dilationWidth,v=p.effectiveFilterDepth,x=p.effectiveFilterHeight,y=p.effectiveFilterWidth,O=v-1-p.padInfo.front,I=y-1-p.padInfo.left,C=x-1-p.padInfo.top,S=Object(s.buffer)(d.shape,"float32"),T=n.bufferSync(a);for(let e=0;e=p.outDepth||Math.floor(s)!==s))for(let o=0;o=p.outHeight||Math.floor(r)!==r))for(let i=0;i=p.outWidth||Math.floor(u)!==u)continue;const l=v*x*y-1-h.get(e,s,r,u,t)===n*x*y+o*y+i?1:0;if(0===l)continue;d+=T.get(e,s,r,u,t)*l}}}S.set(d,e,n,s,o,t)}return n.makeTensorInfo(S.shape,S.dtype,S.values)}const a={kernelName:s.MaxPool3DGrad,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolGrad.js": -/*!*******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolGrad.js ***! - \*******************************************************************************/ -/*! exports provided: maxPoolGrad, maxPoolGradConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPoolGrad",(function(){return i})),n.d(t,"maxPoolGradConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ../utils/pool_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/pool_utils.js"); +function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i,dy:a}=t,{strides:u,dilations:d,pad:l,dimRoundingMode:c,filterShape:f}=r,p=s.backend_util.computeConv2DInfo(i.shape,f,u,d,l,c,!0),m=new o.DepthwiseConv2DDerFilterProgram(p);return n.runWebGLProgram(m,[i,a],"float32")}const i={kernelName:s.DepthwiseConv2dNativeBackpropFilter,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthwiseConv2dNativeBackpropInput.js": +/*!*************************************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthwiseConv2dNativeBackpropInput.js ***! + \*************************************************************************************************/ +/*! exports provided: depthwiseConv2dNativeBackpropInput, depthwiseConv2dNativeBackpropInputConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"depthwiseConv2dNativeBackpropInput",(function(){return r})),n.d(t,"depthwiseConv2dNativeBackpropInputConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../conv_backprop_gpu_depthwise */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu_depthwise.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -2019,11 +2012,11 @@ function i(e){const{inputs:t,backend:n,attrs:i}=e,{dy:a,input:d}=t,{filterSize:u * limitations under the License. * ============================================================================= */ -function i(e){const{inputs:t,backend:n,attrs:i}=e,{dy:a,input:d,output:u}=t,l=d;Object(o.assertNotComplex)([d,u],"maxPoolGrad");const{filterSize:c,strides:f,pad:p,dimRoundingMode:m}=i,h=s.backend_util.computePool2DInfo(l.shape,c,f,1,p,m),b=n.data.get(l.dataId).values,j=Object(s.buffer)(h.outShape,l.dtype,Object(r.maxPoolPositions)(b,l.shape,l.dtype,h).values),g=h.strideHeight,w=h.strideWidth,_=h.dilationHeight,k=h.dilationWidth,v=h.effectiveFilterHeight,x=h.effectiveFilterWidth,y=x-1-h.padInfo.left,O=v-1-h.padInfo.top,I=Object(s.buffer)(l.shape,"float32"),C=n.data.get(a.dataId).values,S=Object(s.buffer)(a.shape,"float32",C);for(let e=0;e=h.outHeight||Math.floor(s)!==s))for(let o=0;o=h.outWidth||Math.floor(a)!==a)continue;const d=v*x-1-j.get(e,s,a,t)===n*x+o?1:0;if(0===d)continue;i+=S.get(e,s,a,t)*d}}I.set(i,e,n,s,t)}return n.makeTensorInfo(I.shape,I.dtype,I.values)}const a={kernelName:s.MaxPoolGrad,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolWithArgmax.js": -/*!*************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolWithArgmax.js ***! - \*************************************************************************************/ -/*! exports provided: maxPoolWithArgmaxConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPoolWithArgmaxConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./MaxPoolWithArgmax_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolWithArgmax_impl.js"); +function r(e){const{inputs:t,backend:n,attrs:r}=e,{dy:i,filter:a}=t,{strides:u,dilations:d,pad:l,dimRoundingMode:c,inputShape:f}=r,p=s.backend_util.computeConv2DInfo(f,a.shape,u,d,l,c,!0),m=new o.DepthwiseConv2DDerInputProgram(p);return n.runWebGLProgram(m,[i,a],"float32")}const i={kernelName:s.DepthwiseConv2dNativeBackpropInput,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Diag.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Diag.js ***! + \*******************************************************************/ +/*! exports provided: diag, diagConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"diag",(function(){return i})),n.d(t,"diagConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../diag_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/diag_gpu.js"),r=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -2040,11 +2033,11 @@ function i(e){const{inputs:t,backend:n,attrs:i}=e,{dy:a,input:d,output:u}=t,l=d; * limitations under the License. * ============================================================================= */ -const i={kernelName:s.MaxPoolWithArgmax,backendName:"cpu",kernelFunc:({inputs:e,attrs:t,backend:n})=>{const{x:i}=e,{filterSize:a,strides:d,pad:u,includeBatchInIndex:l}=t,c=n;Object(o.assertNotComplex)(i,"MaxPoolWithArgmax");const f=c.data.get(i.dataId).values,p=s.backend_util.computePool2DInfo(i.shape,a,d,[1,1],u),[m,h]=Object(r.maxPoolWithArgmaxImpl)(f,i.shape,i.dtype,l,p),b=c.write(m,p.outShape,i.dtype),j=c.write(h,p.outShape,i.dtype);return[{dataId:b,shape:p.outShape,dtype:i.dtype},{dataId:j,shape:p.outShape,dtype:"int32"}]}}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolWithArgmax_impl.js": -/*!******************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolWithArgmax_impl.js ***! - \******************************************************************************************/ -/*! exports provided: maxPoolWithArgmaxImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPoolWithArgmaxImpl",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/pool_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/pool_utils.js"); +function i(e){const{inputs:t,backend:n}=e,{x:i}=t,a=[...i.shape,...i.shape],u=s.util.sizeFromShape(i.shape),d=Object(r.reshape)({inputs:{x:i},backend:n,attrs:{shape:[u]}}),l=new o.DiagProgram(u),c=n.runWebGLProgram(l,[d],d.dtype),f=Object(r.reshape)({inputs:{x:c},backend:n,attrs:{shape:a}});return n.disposeIntermediateTensorInfo(d),n.disposeIntermediateTensorInfo(c),f}const a={kernelName:s.Diag,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Dilation2D.js": +/*!*************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Dilation2D.js ***! + \*************************************************************************/ +/*! exports provided: dilation2D, dilation2DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"dilation2D",(function(){return i})),n.d(t,"dilation2DConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../dilation_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/dilation_gpu.js"),r=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -2061,14 +2054,14 @@ const i={kernelName:s.MaxPoolWithArgmax,backendName:"cpu",kernelFunc:({inputs:e, * limitations under the License. * ============================================================================= */ -function r(e,t,n,r,i){const a=s.util.computeStrides(t),d=Object(o.pool)(e,t,n,a,i,"max"),u=Object(o.maxPoolPositions)(e,t,n,i,!0,r);return[d.values,u.values]}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Max_impl.js": -/*!****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Max_impl.js ***! - \****************************************************************************/ -/*! exports provided: maxImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"maxImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a,filter:u}=t,{strides:d,pad:l,dilations:c}=i,f=s.backend_util.computeDilation2DInfo(a.shape,u.shape,d,l,"NHWC",c);let p;const m=new o.Dilation2DProgram(f);p=n.runWebGLProgram(m,[a,u],"float32");const h=Object(r.reshape)({inputs:{x:p},backend:n,attrs:{shape:f.outShape}});return n.disposeIntermediateTensorInfo(p),h}const a={kernelName:s.Dilation2D,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Einsum.js": +/*!*********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Einsum.js ***! + \*********************************************************************/ +/*! exports provided: einsum, einsumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"einsum",(function(){return u})),n.d(t,"einsumConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Multiply */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Multiply.js"),r=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),i=n(/*! ./Sum */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sum.js"),a=n(/*! ./Transpose */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2021 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -2081,11 +2074,12 @@ function r(e,t,n,r,i){const a=s.util.computeStrides(t),d=Object(o.pool)(e,t,n,a, * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */function o(e,t,n,o){const r=s.util.getTypedArrayFromDType(o,s.util.sizeFromShape(n));for(let n=0;no)&&(o=t)}r[n]=o}return r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Maximum.js": -/*!***************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Maximum.js ***! - \***************************************************************************/ -/*! exports provided: maximumImpl, maximum, maximumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maximumImpl",(function(){return i})),n.d(t,"maximum",(function(){return a})),n.d(t,"maximumConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); + */ +function u(e){const{inputs:t,backend:n,attrs:u}=e,{equation:d}=u,l=t,{allDims:c,summedDims:f,idDims:p}=s.backend_util.decodeEinsumEquation(d,l.length);s.backend_util.checkEinsumDimSizes(c.length,p,l);const{path:m,steps:h}=s.backend_util.getEinsumComputePath(f,p),b=h.length;let j=null,g=c.length;const w=[];for(let e=0;e=0&&(j=Object(i.sum)({inputs:{x:j},backend:n,attrs:{axis:m[e]-(c.length-g),keepDims:!1}}),w.push(j)),g--)}for(const e of w)e!==j&&n.disposeIntermediateTensorInfo(e);return j}const d={kernelName:s.Einsum,backendName:"webgl",kernelFunc:u}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Elu.js": +/*!******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Elu.js ***! + \******************************************************************/ +/*! exports provided: eluConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"eluConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -2102,11 +2096,11 @@ function r(e,t,n,r,i){const a=s.util.computeStrides(t),d=Object(o.pool)(e,t,n,a, * limitations under the License. * ============================================================================= */ -const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>Math.max(e,t))),a=Object(r.binaryKernelFunc)(s.Maximum,i),d={kernelName:s.Maximum,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Mean.js": -/*!************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Mean.js ***! - \************************************************************************/ -/*! exports provided: mean, meanConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"mean",(function(){return a})),n.d(t,"meanConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Cast */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cast.js"),r=n(/*! ./RealDiv */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RealDiv.js"),i=n(/*! ./Sum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sum.js"); +const r=Object(o.unaryKernelFunc)({opSnippet:"return (x >= 0.0) ? x : (exp(x) - 1.0);",packedOpSnippet:"\n vec4 result;\n\n result.r = (x.r >= 0.0) ? x.r : (exp(x.r) - 1.0);\n result.g = (x.g >= 0.0) ? x.g : (exp(x.g) - 1.0);\n result.b = (x.b >= 0.0) ? x.b : (exp(x.b) - 1.0);\n result.a = (x.a >= 0.0) ? x.a : (exp(x.a) - 1.0);\n\n return result;\n"}),i={kernelName:s.Elu,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/EluGrad.js": +/*!**********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/EluGrad.js ***! + \**********************************************************************/ +/*! exports provided: eluGrad, eluGradConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"eluGrad",(function(){return i})),n.d(t,"eluGradConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../binaryop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/binaryop_gpu.js"),r=n(/*! ../binaryop_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/binaryop_packed_gpu.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -2123,11 +2117,11 @@ const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>Math.max(e,t))),a=Object( * limitations under the License. * ============================================================================= */ -function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:d}=t,{axis:u,keepDims:l}=a,c=s.util.parseAxisParam(u,d.shape),f=s.backend_util.computeOutAndReduceShapes(d.shape,c)[1],p=s.util.sizeFromShape(f),m=[],h=n.makeTensorInfo([],"float32",new Float32Array([p]));m.push(h);const b=Object(o.cast)({inputs:{x:d},backend:n,attrs:{dtype:"float32"}});m.push(b);const j=Object(r.div)({inputs:{a:b,b:h},backend:n});m.push(j);const g=Object(i.sum)({inputs:{x:j},backend:n,attrs:{axis:u,keepDims:l}});return m.forEach((e=>n.disposeIntermediateTensorInfo(e))),g}const d={kernelName:s.Mean,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Min.js": -/*!***********************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Min.js ***! - \***********************************************************************/ -/*! exports provided: min, minConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"min",(function(){return a})),n.d(t,"minConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"),i=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose.js"); +const i=e=>{const{inputs:t,backend:n}=e,{dy:i,y:a}=t,u=Object(s.env)().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new r.BinaryOpPackedProgram("\n vec4 bGTEZero = vec4(greaterThanEqual(b, vec4(0.)));\n return (bGTEZero * a) + ((vec4(1.0) - bGTEZero) * (a * (b + vec4(1.0))));\n",i.shape,a.shape):new o.BinaryOpProgram("return (b >= 1.0) ? a : a * (b + 1.0);",i.shape,a.shape);return n.runWebGLProgram(u,[i,a],i.dtype)},a={kernelName:s.EluGrad,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Equal.js": +/*!********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Equal.js ***! + \********************************************************************/ +/*! exports provided: equal, equalConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"equal",(function(){return i})),n.d(t,"equalConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -2144,11 +2138,11 @@ function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:d}=t,{axis:u,keepDims:l}=a, * limitations under the License. * ============================================================================= */ -function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:d}=t,{axis:u,keepDims:l}=a;Object(o.assertNotComplex)(d,"min");const c=s.util.parseAxisParam(u,d.shape);let f=c;const p=s.backend_util.getAxesPermutation(f,d.shape.length);let m=d;null!=p&&(m=Object(i.transpose)({inputs:{x:d},backend:n,attrs:{perm:p}}),f=s.backend_util.getInnerMostAxes(f.length,d.shape.length)),s.backend_util.assertAxesAreInnerMostDims("min",f,m.shape.length);const[h,b]=s.backend_util.computeOutAndReduceShapes(m.shape,f),j=s.util.sizeFromShape(b),g=s.util.makeZerosTypedArray(s.util.sizeFromShape(h),m.dtype),w=n.data.get(m.dataId).values;for(let e=0;eMath.min(e,t))),a=Object(r.binaryKernelFunc)(s.Minimum,i),d={kernelName:s.Minimum,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MirrorPad.js": -/*!*****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MirrorPad.js ***! - \*****************************************************************************/ -/*! exports provided: mirrorPad, mirrorPadConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"mirrorPad",(function(){return r})),n.d(t,"mirrorPadConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +const r=`\n // Error function is calculated approximately with elementary function.\n // See "Handbook of Mathematical Functions with Formulas,\n // Graphs, and Mathematical Tables", Abramowitz and Stegun.\n float p = ${s.backend_util.ERF_P};\n float a1 = ${s.backend_util.ERF_A1};\n float a2 = ${s.backend_util.ERF_A2};\n float a3 = ${s.backend_util.ERF_A3};\n float a4 = ${s.backend_util.ERF_A4};\n float a5 = ${s.backend_util.ERF_A5};\n\n float sign = sign(x);\n x = abs(x);\n float t = 1.0 / (1.0 + p * x);\n return sign * (1.0 - (((((a5*t + a4)*t) + a3)*t + a2)*t + a1)*t*exp(-x*x));\n`,i=Object(o.unaryKernelFunc)({opSnippet:r}),a={kernelName:s.Erf,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Exp.js": +/*!******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Exp.js ***! + \******************************************************************/ +/*! exports provided: EXP, exp, expConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"EXP",(function(){return i})),n.d(t,"exp",(function(){return a})),n.d(t,"expConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -2186,32 +2180,32 @@ const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>Math.min(e,t))),a=Object( * limitations under the License. * ============================================================================= */ -function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i}=t,{paddings:a,mode:d}=r;Object(o.assertNotComplex)(i,"mirrorPad");const u=a.map(((e,t)=>e[0]+i.shape[t]+e[1])),l=a.map((e=>e[0])),c=a.map(((e,t)=>e[0]+i.shape[t])),f="reflect"===d?0:1,p=n.data.get(i.dataId).values,m=i.shape.length,h=s.util.computeStrides(i.shape),b=s.util.sizeFromShape(u),j=u.length,g=s.util.computeStrides(u),w=s.util.getTypedArrayFromDType(i.dtype,b);for(let e=0;e=c[e]&&(t[e]=2*(c[e]-1)-t[e]+f);t=t.map(((e,t)=>e-l[t]));const n=s.util.locToIndex(t,m,h);w[e]=p[n]}return{dataId:n.write(w,u,i.dtype),shape:u,dtype:i.dtype}}const i={kernelName:s.MirrorPad,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Mod.js": -/*!***********************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Mod.js ***! - \***********************************************************************/ -/*! exports provided: modImpl, mod, modConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"modImpl",(function(){return i})),n.d(t,"mod",(function(){return a})),n.d(t,"modConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); +const i="return exp(x);",a=Object(o.unaryKernelFunc)({opSnippet:i,packedOpSnippet:i,cpuKernelImpl:r.expImplCPU}),u={kernelName:s.Exp,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ExpandDims.js": +/*!*************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ExpandDims.js ***! + \*************************************************************************/ +/*! exports provided: expandDims, expandDimsConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"expandDims",(function(){return r})),n.d(t,"expandDimsConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the "License"); + * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, + * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>{const n=e%t;return e<0&&t<0||e>=0&&t>=0?n:(n+t)%t})),a=Object(r.binaryKernelFunc)(s.Mod,i),d={kernelName:s.Mod,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Multinomial.js": -/*!*******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Multinomial.js ***! - \*******************************************************************************/ -/*! exports provided: multinomial, multinomialConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"multinomial",(function(){return a})),n.d(t,"multinomialConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! seedrandom */"./node_modules/seedrandom/index.js"),r=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),i=n(/*! ./Softmax */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Softmax.js"); +function r(e){const{inputs:t,attrs:n,backend:r}=e,{dim:i}=n,{input:a}=t,u=a.shape.length,d=a.shape.slice();let l=i;return i<0&&(s.util.assert(-(u+1)<=i,(()=>`Axis must be in the interval [${-(u+1)}, ${u}]`)),l=u+i+1),d.splice(l,0,1),Object(o.reshape)({inputs:{x:a},backend:r,attrs:{shape:d}})}const i={kernelName:s.ExpandDims,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Expm1.js": +/*!********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Expm1.js ***! + \********************************************************************/ +/*! exports provided: expm1, expm1Config */function(e,t,n){"use strict";n.r(t),n.d(t,"expm1",(function(){return a})),n.d(t,"expm1Config",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -2228,11 +2222,11 @@ const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>{const n=e%t;return e<0&& * limitations under the License. * ============================================================================= */ -function a(e){const{inputs:t,backend:n,attrs:a}=e,{logits:d}=t,{numSamples:u,seed:l,normalized:c}=a;Object(r.assertNotComplex)(d,"multinomial");const f=c?d:Object(i.softmax)({inputs:{logits:d},backend:n,attrs:{dim:-1}}),p=f.shape[0],m=f.shape[1],h=n.data.get(f.dataId).values,b=[p,u],j=s.util.makeZerosTypedArray(s.util.sizeFromShape(b),"int32");for(let e=0;ee*t)),a=Object(r.createComplexBinaryKernelImpl)(((e,t,n,s)=>({real:e*n-t*s,imag:e*s+t*n}))),d=Object(r.binaryKernelFunc)(s.Multiply,i,a),u={kernelName:s.Multiply,backendName:"cpu",kernelFunc:d}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Neg.js": +function r(e){const{inputs:t,backend:n}=e,{input:s}=t;return Object(o.fftImpl)(s,!1,n)}const i={kernelName:s.FFT,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FFT_impl.js": /*!***********************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Neg.js ***! + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FFT_impl.js ***! \***********************************************************************/ -/*! exports provided: negImpl, neg, negConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"negImpl",(function(){return i})),n.d(t,"neg",(function(){return a})),n.d(t,"negConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./Multiply */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Multiply.js"); +/*! exports provided: fftImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"fftImpl",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../fft_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/fft_gpu.js"),r=n(/*! ./Complex */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js"),i=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -2270,11 +2264,11 @@ const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>e*t)),a=Object(r.createCo * limitations under the License. * ============================================================================= */ -function i(e,t,n){const o=s.util.createScalarValue(-1,n);return Object(r.multiplyImpl)([],t,o,e,n)}function a(e){const{inputs:t,backend:n}=e,{x:s}=t;Object(o.assertNotComplex)(s,"neg");const r=n.data.get(s.dataId).values,[a,d]=i(r,s.shape,s.dtype);return n.makeTensorInfo(d,s.dtype,a)}const d={kernelName:s.Neg,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV3.js": -/*!***************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV3.js ***! - \***************************************************************************************/ -/*! exports provided: nonMaxSuppressionV3, nonMaxSuppressionV3Config */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionV3",(function(){return i})),n.d(t,"nonMaxSuppressionV3Config",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +function a(e,t,n){const a=n.texData.get(e.dataId),u=s.util.sizeFromShape(e.shape),d=e.shape[e.shape.length-1],l=u/d,c=Object(i.reshape)({inputs:{x:e},backend:n,attrs:{shape:[l,d]}}),f=c.shape,p=new o.FFTProgram("real",f,t),m=new o.FFTProgram("imag",f,t),h=[{dataId:a.complexTensorInfos.real.dataId,dtype:a.complexTensorInfos.real.dtype,shape:f},{dataId:a.complexTensorInfos.imag.dataId,dtype:a.complexTensorInfos.imag.dtype,shape:f}],b=n.runWebGLProgram(p,h,"float32"),j=n.runWebGLProgram(m,h,"float32"),g=Object(r.complex)({inputs:{real:b,imag:j},backend:n});n.disposeIntermediateTensorInfo(b),n.disposeIntermediateTensorInfo(j);const w=Object(i.reshape)({inputs:{x:g},backend:n,attrs:{shape:e.shape}});return n.disposeIntermediateTensorInfo(c),n.disposeIntermediateTensorInfo(g),w}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Fill.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Fill.js ***! + \*******************************************************************/ +/*! exports provided: fill, fillConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fill",(function(){return r})),n.d(t,"fillConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../fill_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/fill_gpu.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -2289,13 +2283,13 @@ function i(e,t,n){const o=s.util.createScalarValue(-1,n);return Object(r.multipl * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - * ============================================================================= - */ -const r=s.kernel_impls.nonMaxSuppressionV3Impl;function i(e){const{inputs:t,backend:n,attrs:s}=e,{boxes:i,scores:a}=t,{maxOutputSize:d,iouThreshold:u,scoreThreshold:l}=s;Object(o.assertNotComplex)(i,"NonMaxSuppression");const c=n.data.get(i.dataId).values,f=n.data.get(a.dataId).values,{selectedIndices:p}=r(c,f,d,u,l);return n.makeTensorInfo([p.length],"int32",new Int32Array(p))}const a={kernelName:s.NonMaxSuppressionV3,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV4.js": -/*!***************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV4.js ***! - \***************************************************************************************/ -/*! exports provided: nonMaxSuppressionV4, nonMaxSuppressionV4Config */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionV4",(function(){return i})),n.d(t,"nonMaxSuppressionV4Config",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); + * ============================================================================= + */ +function r(e){const{backend:t,attrs:n}=e,{shape:r,value:i}=n;let{dtype:a}=n;if(a=a||s.util.inferDtype(i),"string"===a){const e=s.util.getArrayFromDType(a,s.util.sizeFromShape(r));return e.fill(i),t.makeTensorInfo(r,a,e)}{const e=new o.FillProgram(r,i),n=[[i]];return t.runWebGLProgram(e,[],a,n)}}const i={kernelName:s.Fill,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FlipLeftRight.js": +/*!****************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FlipLeftRight.js ***! + \****************************************************************************/ +/*! exports provided: flipLeftRightConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"flipLeftRightConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../flip_left_right_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/flip_left_right_gpu.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -2312,14 +2306,14 @@ const r=s.kernel_impls.nonMaxSuppressionV3Impl;function i(e){const{inputs:t,back * limitations under the License. * ============================================================================= */ -const r=s.kernel_impls.nonMaxSuppressionV4Impl;function i(e){const{inputs:t,backend:n,attrs:s}=e,{boxes:i,scores:a}=t,{maxOutputSize:d,iouThreshold:u,scoreThreshold:l,padToMaxOutputSize:c}=s;Object(o.assertNotComplex)(i,"NonMaxSuppressionPadded");const f=n.data.get(i.dataId).values,p=n.data.get(a.dataId).values,{selectedIndices:m,validOutputs:h}=r(f,p,d,u,l,c);return[n.makeTensorInfo([m.length],"int32",new Int32Array(m)),n.makeTensorInfo([],"int32",new Int32Array([h]))]}const a={kernelName:s.NonMaxSuppressionV4,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV5.js": -/*!***************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV5.js ***! - \***************************************************************************************/ -/*! exports provided: nonMaxSuppressionV5, nonMaxSuppressionV5Config */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionV5",(function(){return i})),n.d(t,"nonMaxSuppressionV5Config",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +const r={kernelName:s.FlipLeftRight,backendName:"webgl",kernelFunc:({inputs:e,backend:t})=>{const{image:n}=e,s=t,r=new o.FlipLeftRightProgram(n.shape);return s.runWebGLProgram(r,[n],n.dtype)}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Floor.js": +/*!********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Floor.js ***! + \********************************************************************/ +/*! exports provided: floor, floorConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"floor",(function(){return a})),n.d(t,"floorConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -2333,11 +2327,11 @@ const r=s.kernel_impls.nonMaxSuppressionV4Impl;function i(e){const{inputs:t,back * limitations under the License. * ============================================================================= */ -const r=s.kernel_impls.nonMaxSuppressionV5Impl;function i(e){const{inputs:t,backend:n,attrs:s}=e,{boxes:i,scores:a}=t,{maxOutputSize:d,iouThreshold:u,scoreThreshold:l,softNmsSigma:c}=s;Object(o.assertNotComplex)(i,"NonMaxSuppressionWithScore");const f=n.data.get(i.dataId).values,p=n.data.get(a.dataId).values,m=d,h=u,b=l,j=c,{selectedIndices:g,selectedScores:w}=r(f,p,m,h,b,j);return[n.makeTensorInfo([g.length],"int32",new Int32Array(g)),n.makeTensorInfo([w.length],"float32",new Float32Array(w))]}const a={kernelName:s.NonMaxSuppressionV5,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NotEqual.js": -/*!****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NotEqual.js ***! - \****************************************************************************/ -/*! exports provided: notEqualImpl, notEqual, notEqualConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"notEqualImpl",(function(){return i})),n.d(t,"notEqual",(function(){return a})),n.d(t,"notEqualConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); +const i="return floor(x);",a=Object(o.unaryKernelFunc)({opSnippet:i,packedOpSnippet:i,cpuKernelImpl:r.floorImplCPU}),u={kernelName:s.Floor,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FloorDiv.js": +/*!***********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FloorDiv.js ***! + \***********************************************************************/ +/*! exports provided: floorDiv, floorDivConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"floorDiv",(function(){return r})),n.d(t,"floorDivConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -2354,14 +2348,14 @@ const r=s.kernel_impls.nonMaxSuppressionV5Impl;function i(e){const{inputs:t,back * limitations under the License. * ============================================================================= */ -const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>e!==t?1:0)),a=Object(r.binaryKernelFunc)(s.NotEqual,i,null,"bool"),d={kernelName:s.NotEqual,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/OneHot.js": -/*!**************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/OneHot.js ***! - \**************************************************************************/ -/*! exports provided: oneHot, oneHotConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"oneHot",(function(){return r})),n.d(t,"oneHotConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +const r=Object(o.binaryKernelFunc)({opSnippet:"\n float s = sign(a) * sign(b);\n int ia = round(a);\n int ib = round(b);\n if (ib != 0) {\n // Windows (D3D) wants guaranteed non-zero int division at compile-time.\n return float(idiv(ia, ib, s));\n } else {\n return NAN;\n }\n",packedOpSnippet:"\n ivec4 ia = round(a);\n ivec4 ib = round(b);\n bvec4 cond = notEqual(ib, ivec4(0));\n ivec4 result = ivec4(0);\n vec4 s = sign(a) * sign(b);\n\n // Windows (D3D) wants guaranteed non-zero int division at compile-time.\n if (cond[0]) {\n result[0] = idiv(ia[0], ib[0], s[0]);\n }\n if (cond[1]) {\n result[1] = idiv(ia[1], ib[1], s[1]);\n }\n if (cond[2]) {\n result[2] = idiv(ia[2], ib[2], s[2]);\n }\n if (cond[3]) {\n result[3] = idiv(ia[3], ib[3], s[3]);\n }\n return vec4(result);\n",dtype:"int32"}),i={kernelName:s.FloorDiv,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FromPixels.js": +/*!*************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FromPixels.js ***! + \*************************************************************************/ +/*! exports provided: fromPixelsConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fromPixelsConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../tex_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/tex_util.js"),r=n(/*! ./FromPixels_utils/from_pixels_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FromPixels_utils/from_pixels_gpu.js"),i=n(/*! ./FromPixels_utils/from_pixels_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FromPixels_utils/from_pixels_packed_gpu.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -2375,14 +2369,14 @@ const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>e!==t?1:0)),a=Object(r.bi * limitations under the License. * ============================================================================= */ -function r(e){const{inputs:t,backend:n,attrs:r}=e,{indices:i}=t,{depth:a,onValue:d,offValue:u}=r;Object(o.assertNotComplex)(i,"oneHot");const l=s.util.sizeFromShape(i.shape),c=new Float32Array(l*a);c.fill(u);const f=n.data.get(i.dataId).values;for(let e=0;e=0&&f[e]{s.util.assertShapesMatch(d,e.shape,"All tensors passed to stack must have matching shapes"),s.util.assert(u===e.dtype,(()=>"All tensors passed to stack must have matching dtypes"))}));const l=[],c=t.map((e=>{const t=Object(r.expandDims)({inputs:{input:e},backend:n,attrs:{dim:a}});return l.push(t),t})),f=Object(o.concat)({inputs:c,backend:n,attrs:{axis:a}});return l.forEach((e=>n.disposeIntermediateTensorInfo(e))),f}const a={kernelName:s.Pack,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/PadV2.js": -/*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/PadV2.js ***! - \*************************************************************************/ -/*! exports provided: padV2, padV2Config */function(e,t,n){"use strict";n.r(t),n.d(t,"padV2",(function(){return r})),n.d(t,"padV2Config",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); + */class o{constructor(e){this.variableNames=["A"],this.packedInputs=!1,this.packedOutput=!0;const t=Object(s.getGlslDifferences)(),[n,o]=e;this.outputShape=e,this.userCode=`\n void main() {\n ivec3 coords = getOutputCoords();\n int texR = coords[0];\n int texC = coords[1];\n int depth = coords[2];\n\n vec4 result = vec4(0.);\n\n for(int row=0; row<=1; row++) {\n for(int col=0; col<=1; col++) {\n texC = coords[1] + row;\n depth = coords[2] + col;\n\n vec2 uv = (vec2(texC, texR) + halfCR) /\n vec2(${o}.0, ${n}.0);\n vec4 values = ${t.texture2D}(A, uv);\n float value;\n if (depth == 0) {\n value = values.r;\n } else if (depth == 1) {\n value = values.g;\n } else if (depth == 2) {\n value = values.b;\n } else if (depth == 3) {\n value = values.a;\n }\n\n result[row * 2 + col] = floor(value * 255.0 + 0.5);\n }\n }\n\n ${t.output} = result;\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FusedConv2D.js": +/*!**************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FusedConv2D.js ***! + \**************************************************************************/ +/*! exports provided: fusedConv2d, fusedConv2DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fusedConv2d",(function(){return u})),n.d(t,"fusedConv2DConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../conv_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/conv_gpu.js"),r=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),i=n(/*! ./Conv2D_impl */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2D_impl.js"),a=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -2438,11 +2430,11 @@ function i(e){const{inputs:t,backend:n,attrs:i}=e,{axis:a}=i;if(1===t.length)ret * limitations under the License. * ============================================================================= */ -function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i}=t,{paddings:a,constantValue:d}=r;Object(o.assertNotComplex)(i,"pad");const u=a.map(((e,t)=>e[0]+i.shape[t]+e[1])),l=a.map((e=>e[0])),c=n.data.get(i.dataId).values,f=s.util.sizeFromShape(i.shape),p=i.shape.length,m=s.util.computeStrides(i.shape),h=s.util.sizeFromShape(u),b=u.length,j=s.util.computeStrides(u),g=s.util.getTypedArrayFromDType(i.dtype,h);0!==d&&g.fill(d);for(let e=0;ee+l[t]));g[s.util.locToIndex(t,b,j)]=c[e]}return{dataId:n.write(g,u,i.dtype),shape:u,dtype:i.dtype}}const i={kernelName:s.PadV2,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Pow.js": -/*!***********************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Pow.js ***! - \***********************************************************************/ -/*! exports provided: powImpl, pow, powConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"powImpl",(function(){return i})),n.d(t,"pow",(function(){return a})),n.d(t,"powConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); +function u(e){const{inputs:t,backend:n,attrs:u}=e,{x:d,filter:l,bias:c,preluActivationWeights:f}=t,{strides:p,pad:m,dataFormat:h,dilations:b,dimRoundingMode:j,activation:g,leakyreluAlpha:w}=u,_=s.backend_util.convertConv2DDataFormat(h),k=s.backend_util.computeConv2DInfo(d.shape,l.shape,p,b,m,j,!1,_);let v;const x=[];if(1!==k.filterHeight||1!==k.filterWidth||1!==k.dilationHeight||1!==k.dilationWidth||1!==k.strideHeight||1!==k.strideWidth||"SAME"!==k.padInfo.type&&"VALID"!==k.padInfo.type)if(Object(s.env)().getBool("WEBGL_CONV_IM2COL")&&1===d.shape[0])v=Object(i.conv2dWithIm2Row)({x:d,filter:l,convInfo:k,backend:n,bias:c,activation:g,preluActivationWeights:f,leakyreluAlpha:w});else{const e=null!=c,t=null!=f,i="leakyrelu"===g,a=g?Object(r.mapActivationToShaderProgram)(g,!1):null,u=new o.Conv2DProgram(k,e,a,t,i),p=[d,l];if(c&&p.push(c),f&&p.push(f),i){const e=n.makeTensorInfo([],"float32",s.util.createScalarValue(w,"float32"));p.push(e),x.push(e)}v=n.runWebGLProgram(u,p,"float32")}else v=Object(i.conv2dByMatMul)({x:d,filter:l,convInfo:k,backend:n,bias:c,activation:g,preluActivationWeights:f,leakyreluAlpha:w});const y=Object(a.reshape)({inputs:{x:v},backend:n,attrs:{shape:k.outShape}});return x.push(v),x.forEach((e=>n.disposeIntermediateTensorInfo(e))),y}const d={kernelName:s.FusedConv2D,backendName:"webgl",kernelFunc:u}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FusedDepthwiseConv2D.js": +/*!***********************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FusedDepthwiseConv2D.js ***! + \***********************************************************************************/ +/*! exports provided: fusedDepthwiseConv2D, fusedDepthwiseConv2DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fusedDepthwiseConv2D",(function(){return a})),n.d(t,"fusedDepthwiseConv2DConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../conv_gpu_depthwise */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/conv_gpu_depthwise.js"),r=n(/*! ../conv_packed_gpu_depthwise */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/conv_packed_gpu_depthwise.js"),i=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -2459,32 +2451,32 @@ function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i}=t,{paddings:a,constantVa * limitations under the License. * ============================================================================= */ -const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>Math.pow(e,t))),a=Object(r.binaryKernelFunc)(s.Pow,i),d={kernelName:s.Pow,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Prelu.js": -/*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Prelu.js ***! - \*************************************************************************/ -/*! exports provided: prelu, preluConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"prelu",(function(){return a})),n.d(t,"preluConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"); +function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:u,filter:d,bias:l,preluActivationWeights:c}=t,{strides:f,pad:p,dilations:m,dimRoundingMode:h,activation:b,leakyreluAlpha:j}=a,g=[];let w=m;null==w&&(w=[1,1]),s.util.assert(s.backend_util.eitherStridesOrDilationsAreOne(f,w),(()=>`Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides ${f} and dilations '${w}'`));const _=s.backend_util.computeConv2DInfo(u.shape,d.shape,f,w,p,h,!0),k=Object(s.env)().getBool("WEBGL_PACK_DEPTHWISECONV")&&_.strideWidth<=2&&_.outChannels/_.inChannels==1,v=b?Object(i.mapActivationToShaderProgram)(b,k):null,x=[u,d],y=null!=l,O=null!=c,I="leakyrelu"===b;if(y&&x.push(l),O&&x.push(c),I){const e=n.makeTensorInfo([],"float32",s.util.createScalarValue(j,"float32"));x.push(e),g.push(e)}let C;C=k?new r.DepthwiseConvPacked2DProgram(_,y,v,O,I):new o.DepthwiseConv2DProgram(_,y,v,O,I);const S=[[_.padInfo.top,_.padInfo.left],[_.strideHeight,_.strideWidth],[_.dilationHeight,_.dilationWidth],[_.inHeight,_.inWidth]],T=n.runWebGLProgram(C,x,"float32",S);return g.forEach((e=>n.disposeIntermediateTensorInfo(e))),T}const u={kernelName:s.FusedDepthwiseConv2D,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/GatherNd.js": +/*!***********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/GatherNd.js ***! + \***********************************************************************/ +/*! exports provided: gatherNd, gatherNdConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"gatherNd",(function(){return a})),n.d(t,"gatherNdConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../gather_nd_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/gather_nd_gpu.js"),r=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"),i=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the License); + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -const i=Object(r.createSimpleBinaryKernelImpl)(((e,t)=>e<0?t*e:e));function a(e){const{inputs:t,backend:n}=e,{x:s,alpha:r}=t;Object(o.assertNotComplex)([s,r],"prelu");const a=n.data.get(s.dataId).values,d=n.data.get(r.dataId).values,[u,l]=i(s.shape,r.shape,a,d,s.dtype);return n.makeTensorInfo(l,s.dtype,u)}const d={kernelName:s.Prelu,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Prod.js": -/*!************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Prod.js ***! - \************************************************************************/ -/*! exports provided: prodImpl, prod, prodConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"prodImpl",(function(){return i})),n.d(t,"prod",(function(){return a})),n.d(t,"prodConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose.js"); +function a(e){const{inputs:t,backend:n}=e,{params:a,indices:u}=t,d=u.shape,l=d[d.length-1],c=s.util.sizeFromShape(a.shape),[f,p,m,h]=s.backend_util.prepareAndValidate(a,u),b=Object(i.reshape)({inputs:{x:u},backend:n,attrs:{shape:[p,l]}}),j=Object(i.reshape)({inputs:{x:a},backend:n,attrs:{shape:[s.util.sizeFromShape(a.shape)/m,m]}});if(n.shouldExecuteOnCPU([a,u])||"string"===a.dtype){const e=n.readSync(u.dataId),t=n.bufferSync(a),s=Object(r.gatherNdImplCPU)(e,t,a.dtype,p,l,m,h,a.shape,c);return n.makeTensorInfo(f,a.dtype,s.values)}const g=new o.GatherNDProgram(l,h,[p,m]),w=n.runWebGLProgram(g,[j,b],j.dtype),_=Object(i.reshape)({inputs:{x:w},backend:n,attrs:{shape:f}});return n.disposeIntermediateTensorInfo(b),n.disposeIntermediateTensorInfo(j),n.disposeIntermediateTensorInfo(w),_}const u={kernelName:s.GatherNd,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/GatherV2.js": +/*!***********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/GatherV2.js ***! + \***********************************************************************/ +/*! exports provided: gatherV2, gatherV2Config */function(e,t,n){"use strict";n.r(t),n.d(t,"gatherV2",(function(){return a})),n.d(t,"gatherV2Config",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../gather_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/gather_gpu.js"),r=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"),i=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -2501,11 +2493,11 @@ const i=Object(r.createSimpleBinaryKernelImpl)(((e,t)=>e<0?t*e:e));function a(e) * limitations under the License. * ============================================================================= */ -function i(e,t,n,o){const[r,i]=s.backend_util.computeOutAndReduceShapes(e,o),a=Object(s.upcastType)(t,"int32"),d=s.util.makeZerosTypedArray(s.util.sizeFromShape(r),a),u=s.util.sizeFromShape(i);for(let e=0;en.disposeIntermediateTensorInfo(e))),n.makeTensorInfo(k,_,g)}const d={kernelName:s.Prod,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Range.js": -/*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Range.js ***! - \*************************************************************************/ -/*! exports provided: range, rangeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"range",(function(){return r})),n.d(t,"rangeConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Range_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Range_impl.js"); +function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:u,indices:d}=t,{axis:l,batchDims:c}=a,f=s.util.parseAxisParam(l,u.shape)[0],p=s.backend_util.segment_util.collectGatherOpShapeInfo(u,d,f,c),m=s.util.sizeFromShape(d.shape),h=[],b=Object(i.reshape)({inputs:{x:u},backend:n,attrs:{shape:[p.batchSize,p.outerSize,p.dimSize,p.sliceSize]}}),j=Object(i.reshape)({inputs:{x:d},backend:n,attrs:{shape:[p.batchSize,m/p.batchSize]}});h.push(b),h.push(j);const g=[p.batchSize,p.outerSize,m/p.batchSize,p.sliceSize];if(n.shouldExecuteOnCPU([u,d])||"string"===u.dtype){const e=n.bufferSync(j),t=n.bufferSync(b),s=Object(r.gatherV2ImplCPU)(t,e,g);return h.forEach((e=>n.disposeIntermediateTensorInfo(e))),n.makeTensorInfo(p.outputShape,s.dtype,s.values)}const w=new o.GatherProgram(b.shape,g),_=n.runWebGLProgram(w,[b,j],b.dtype);h.push(_);const k=Object(i.reshape)({inputs:{x:_},backend:n,attrs:{shape:p.outputShape}});return h.forEach((e=>n.disposeIntermediateTensorInfo(e))),k}const u={kernelName:s.GatherV2,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Greater.js": +/*!**********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Greater.js ***! + \**********************************************************************/ +/*! exports provided: greater, greaterConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"greater",(function(){return i})),n.d(t,"greaterConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -2522,11 +2514,11 @@ function i(e,t,n,o){const[r,i]=s.backend_util.computeOutAndReduceShapes(e,o),a=O * limitations under the License. * ============================================================================= */ -function r(e){const{backend:t,attrs:n}=e,{start:s,stop:r,dtype:i,step:a}=n,d=Object(o.rangeImpl)(s,r,a,i);return t.makeTensorInfo([d.length],i,d)}const i={kernelName:s.Range,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Range_impl.js": -/*!******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Range_impl.js ***! - \******************************************************************************/ -/*! exports provided: rangeImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"rangeImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +const i=Object(o.binaryKernelFunc)({opSnippet:"return float(a > b);",packedOpSnippet:"\n return vec4(greaterThan(a, b));\n",cpuKernelImpl:r.greaterImplCPU,dtype:"bool"}),a={kernelName:s.Greater,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/GreaterEqual.js": +/*!***************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/GreaterEqual.js ***! + \***************************************************************************/ +/*! exports provided: greaterEqual, greaterEqualConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"greaterEqual",(function(){return i})),n.d(t,"greaterEqualConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -2542,11 +2534,12 @@ function r(e){const{backend:t,attrs:n}=e,{start:s,stop:r,dtype:i,step:a}=n,d=Obj * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */function o(e,t,n,o){if(e===t||e1)return s.util.makeZerosTypedArray(0,o);const r=Math.abs(Math.ceil((t-e)/n)),i=s.util.makeZerosTypedArray(r,o);t= b);",packedOpSnippet:"\n return vec4(greaterThanEqual(a, b));\n",dtype:"bool",cpuKernelImpl:r.greaterEqualImplCPU}),a={kernelName:s.GreaterEqual,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/IFFT.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/IFFT.js ***! + \*******************************************************************/ +/*! exports provided: ifft, ifftConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"ifft",(function(){return r})),n.d(t,"ifftConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./FFT_impl */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FFT_impl.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -2563,11 +2556,11 @@ function r(e){const{backend:t,attrs:n}=e,{start:s,stop:r,dtype:i,step:a}=n,d=Obj * limitations under the License. * ============================================================================= */ -function s(e){const{inputs:t,backend:n}=e,{input:s}=t,o=n.data.get(s.dataId).complexTensorInfos.real,r=n.data.get(o.dataId).values;return n.makeTensorInfo(o.shape,o.dtype,r)}n.r(t),n.d(t,"real",(function(){return s})),n.d(t,"realConfig",(function(){return o}));const o={kernelName:n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js").Real,backendName:"cpu",kernelFunc:s}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RealDiv.js": -/*!***************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RealDiv.js ***! - \***************************************************************************/ -/*! exports provided: realDivImpl, div, realDivConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"realDivImpl",(function(){return i})),n.d(t,"div",(function(){return a})),n.d(t,"realDivConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); +function r(e){const{inputs:t,backend:n}=e,{input:s}=t;return Object(o.fftImpl)(s,!0,n)}const i={kernelName:s.IFFT,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js": +/*!***********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js ***! + \***********************************************************************/ +/*! exports provided: identity, identityConfig */function(e,t,n){"use strict"; /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -2584,74 +2577,74 @@ function s(e){const{inputs:t,backend:n}=e,{input:s}=t,o=n.data.get(s.dataId).com * limitations under the License. * ============================================================================= */ -const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>e/t)),a=Object(r.binaryKernelFunc)(s.RealDiv,i),d={kernelName:s.RealDiv,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reciprocal.js": -/*!******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reciprocal.js ***! - \******************************************************************************/ -/*! exports provided: reciprocal, reciprocalConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"reciprocal",(function(){return r})),n.d(t,"reciprocalConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +function s(e){const{inputs:t,backend:n}=e,{x:s}=t;return n.incRef(s.dataId),{dataId:s.dataId,shape:s.shape,dtype:s.dtype}}n.r(t),n.d(t,"identity",(function(){return s})),n.d(t,"identityConfig",(function(){return o}));const o={kernelName:n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js").Identity,backendName:"webgl",kernelFunc:s}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Imag.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Imag.js ***! + \*******************************************************************/ +/*! exports provided: imag, imagConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"imag",(function(){return r})),n.d(t,"imagConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Identity */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the License); + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -const r=Object(o.unaryKernelFunc)(s.Reciprocal,(e=>1/e)),i={kernelName:s.Reciprocal,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Relu.js": -/*!************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Relu.js ***! - \************************************************************************/ -/*! exports provided: relu, reluConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"relu",(function(){return r})),n.d(t,"reluConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +function r(e){const{inputs:t,backend:n}=e,{input:s}=t,r=n.texData.get(s.dataId);return Object(o.identity)({inputs:{x:r.complexTensorInfos.imag},backend:n})}const i={kernelName:s.Imag,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/IsFinite.js": +/*!***********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/IsFinite.js ***! + \***********************************************************************/ +/*! exports provided: isFinite, isFiniteConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"isFinite",(function(){return r})),n.d(t,"isFiniteConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the License); + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -const r=Object(o.unaryKernelFunc)(s.Relu,(e=>Math.max(0,e))),i={kernelName:s.Relu,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Relu6.js": -/*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Relu6.js ***! - \*************************************************************************/ -/*! exports provided: relu6, relu6Config */function(e,t,n){"use strict";n.r(t),n.d(t,"relu6",(function(){return r})),n.d(t,"relu6Config",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +const r=Object(o.unaryKernelFunc)({opSnippet:"return float(!isnan(x) && !isinf(x));",dtype:"bool"}),i={kernelName:s.IsFinite,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/IsInf.js": +/*!********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/IsInf.js ***! + \********************************************************************/ +/*! exports provided: isInf, isInfConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"isInf",(function(){return r})),n.d(t,"isInfConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the License); + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -const r=Object(o.unaryKernelFunc)(s.Relu6,(e=>Math.min(Math.max(0,e),6))),i={kernelName:s.Relu6,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js": -/*!***************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js ***! - \***************************************************************************/ -/*! exports provided: reshape, reshapeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"reshape",(function(){return o})),n.d(t,"reshapeConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +const r=Object(o.unaryKernelFunc)({opSnippet:"return float(isinf(x));",dtype:"bool"}),i={kernelName:s.IsInf,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/IsNaN.js": +/*!********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/IsNaN.js ***! + \********************************************************************/ +/*! exports provided: isNaN, isNaNConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"isNaN",(function(){return r})),n.d(t,"isNaNConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -2667,11 +2660,12 @@ const r=Object(o.unaryKernelFunc)(s.Relu6,(e=>Math.min(Math.max(0,e),6))),i={ker * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */function o(e){const{inputs:t,backend:n,attrs:o}=e,{x:r}=t,{shape:i}=o,a=s.util.sizeFromShape(r.shape),d=s.util.inferFromImplicitShape(i,a),u=s.util.sizeFromShape(d);s.util.assert(a===u,(()=>`The new shape (${d}) has ${u} elements and the old shape (${r.shape}) has ${a} elements. The new shape and old shape must have the same number of elements.`)),n.incRef(r.dataId);const l=n.data.get(r.dataId);if(null!=l.complexTensorInfos){const e=l.complexTensorInfos.real,t=l.complexTensorInfos.imag;e.shape=d,t.shape=d}return{dataId:r.dataId,shape:d,dtype:r.dtype}}const r={kernelName:s.Reshape,backendName:"cpu",kernelFunc:o}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ResizeBilinear.js": -/*!**********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ResizeBilinear.js ***! - \**********************************************************************************/ -/*! exports provided: resizeBilinear, resizeBilinearConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"resizeBilinear",(function(){return r})),n.d(t,"resizeBilinearConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); + */ +const r=Object(o.unaryKernelFunc)({opSnippet:"return float(isnan(x));",dtype:"bool"}),i={kernelName:s.IsNan,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LRN.js": +/*!******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LRN.js ***! + \******************************************************************/ +/*! exports provided: lrn, LRNConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"lrn",(function(){return i})),n.d(t,"LRNConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../lrn_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/lrn_gpu.js"),r=n(/*! ../lrn_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/lrn_packed_gpu.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -2688,11 +2682,11 @@ const r=Object(o.unaryKernelFunc)(s.Relu6,(e=>Math.min(Math.max(0,e),6))),i={ker * limitations under the License. * ============================================================================= */ -function r(e){const{inputs:t,backend:n,attrs:r}=e,{images:i}=t,{alignCorners:a,halfPixelCenters:d,size:u}=r;Object(o.assertNotComplex)(i,"resizeBilinear");const l=s.util.computeStrides(i.shape),[c,f]=u,[p,m,h,b]=i.shape,j=n.data.get(i.dataId).values,g=new Float32Array(s.util.sizeFromShape([p,c,f,b])),w=[a&&c>1?m-1:m,a&&f>1?h-1:h],_=[a&&c>1?c-1:c,a&&f>1?f-1:f];let k=0;const v=w[0]/_[0],x=w[1]/_[1];for(let e=0;e{const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{depthRadius:u,bias:d,alpha:l,beta:c}=i,f=Object(s.env)().getBool("WEBGL_PACK_NORMALIZATION")?new r.LRNPackedProgram(a.shape,u,d,l,c):new o.LRNProgram(a.shape,u,d,l,c);return n.runWebGLProgram(f,[a],a.dtype)},a={kernelName:s.LRN,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LRNGrad.js": +/*!**********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LRNGrad.js ***! + \**********************************************************************/ +/*! exports provided: lrnGrad, LRNGradConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"lrnGrad",(function(){return r})),n.d(t,"LRNGradConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../lrn_grad_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/lrn_grad_gpu.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -2709,11 +2703,11 @@ function r(e){const{inputs:t,backend:n,attrs:r}=e,{images:i}=t,{alignCorners:a,h * limitations under the License. * ============================================================================= */ -function r(e){const{inputs:t,backend:n,attrs:r}=e,{images:i,dy:a}=t,{alignCorners:d}=r;Object(o.assertNotComplex)([a,i],"resizeBilinearGrad");const u=s.util.computeStrides(i.shape),[l,c,f,p]=i.shape,[,m,h]=a.shape,b=new Float32Array(l*c*f*p),j=[d&&m>1?c-1:c,d&&h>1?f-1:f],g=[d&&m>1?m-1:m,d&&h>1?h-1:h],w=j[0]/g[0],_=j[1]/g[1],k=n.data.get(a.dataId).values;let v=0;for(let e=0;e{const{inputs:t,backend:n,attrs:s}=e,{x:r,y:i,dy:a}=t,{depthRadius:u,bias:d,alpha:l,beta:c}=s,f=new o.LRNGradProgram(r.shape,u,d,l,c);return n.runWebGLProgram(f,[r,i,a],r.dtype)},i={kernelName:s.LRNGrad,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LeakyRelu.js": +/*!************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LeakyRelu.js ***! + \************************************************************************/ +/*! exports provided: LEAKYRELU, LEAKYRELU_PACKED, leakyRelu, leakyReluConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"LEAKYRELU",(function(){return i})),n.d(t,"LEAKYRELU_PACKED",(function(){return a})),n.d(t,"leakyRelu",(function(){return u})),n.d(t,"leakyReluConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../binaryop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/binaryop_gpu.js"),r=n(/*! ../binaryop_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/binaryop_packed_gpu.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -2730,11 +2724,11 @@ function r(e){const{inputs:t,backend:n,attrs:r}=e,{images:i,dy:a}=t,{alignCorner * limitations under the License. * ============================================================================= */ -function r(e){const{inputs:t,backend:n,attrs:r}=e,{images:i}=t,{alignCorners:a,halfPixelCenters:d,size:u}=r;Object(o.assertNotComplex)(i,"resizeNearestNeighbor");const l=s.util.computeStrides(i.shape),[c,f]=u,[p,m,h,b]=i.shape,j=n.data.get(i.dataId).values,g=new Float32Array(p*c*f*b),w=[a&&c>1?m-1:m,a&&f>1?h-1:h],_=[a&&c>1?c-1:c,a&&f>1?f-1:f],k=w[0]/_[0],v=w[1]/_[1];let x=0;for(let e=0;e1?f-1:f,d&&b>1?p-1:p],_=[d&&h>1?h-1:h,d&&b>1?b-1:b],k=w[0]/_[0],v=w[1]/_[1],x=1/k,y=1/v,O=2*Math.ceil(x)+2,I=2*Math.ceil(y)+2;for(let e=0;e=h)continue;const c=t+u*l[1],m=u*k;if(e===Math.min(f-1,d?Math.round(m):Math.floor(m)))for(let e=0;e=b)continue;const o=c+t*l[2],r=t*v;s===Math.min(p-1,d?Math.round(r):Math.floor(r))&&(i+=g[o+n])}}j[r+n]=i}}}}return n.makeTensorInfo(i.shape,i.dtype,j)}const i={kernelName:s.ResizeNearestNeighborGrad,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reverse.js": -/*!***************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reverse.js ***! - \***************************************************************************/ -/*! exports provided: reverse, reverseConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"reverse",(function(){return i})),n.d(t,"reverseConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Identity.js"); +const i=Object(o.binaryKernelFunc)({opSnippet:"return float(a < b);",packedOpSnippet:"\n return vec4(lessThan(a, b));\n",cpuKernelImpl:r.lessImplCPU,dtype:"bool"}),a={kernelName:s.Less,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LessEqual.js": +/*!************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LessEqual.js ***! + \************************************************************************/ +/*! exports provided: LESS_EQUAL, LESS_EQUAL_PACKED, lessEqual, lessEqualConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"LESS_EQUAL",(function(){return i})),n.d(t,"LESS_EQUAL_PACKED",(function(){return a})),n.d(t,"lessEqual",(function(){return u})),n.d(t,"lessEqualConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -2772,11 +2766,11 @@ function r(e){const{inputs:t,backend:n,attrs:r}=e,{images:i,dy:a}=t,{alignCorner * limitations under the License. * ============================================================================= */ -function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{dims:d}=i;Object(o.assertNotComplex)(a,"reverse");const u=a.shape.length,l=s.util.parseAxisParam(d,a.shape);if(0===u)return Object(r.identity)({inputs:{x:a},backend:n});const c=new s.TensorBuffer(a.shape,a.dtype),f=n.bufferSync(a);for(let e=0;en[e]=a.shape[e]-1-n[e])),c.set(f.get(...n),...t)}return n.makeTensorInfo(c.shape,c.dtype,c.values)}const a={kernelName:s.Reverse,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RotateWithOffset.js": -/*!************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RotateWithOffset.js ***! - \************************************************************************************/ -/*! exports provided: rotateWithOffsetConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"rotateWithOffsetConfig",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +const i="return float(a <= b);",a="\n return vec4(lessThanEqual(a, b));\n",u=Object(o.binaryKernelFunc)({opSnippet:i,packedOpSnippet:a,cpuKernelImpl:r.lessEqualImplCPU,dtype:"bool"}),d={kernelName:s.LessEqual,backendName:"webgl",kernelFunc:u}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LinSpace.js": +/*!***********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LinSpace.js ***! + \***********************************************************************/ +/*! exports provided: linSpace, linSpaceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"linSpace",(function(){return r})),n.d(t,"linSpaceConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -2792,53 +2786,54 @@ function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{dims:d}=i;Object(o.as * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */const o={kernelName:s.RotateWithOffset,backendName:"cpu",kernelFunc:({inputs:e,attrs:t,backend:n})=>{const{image:o}=e,{radians:r,fillValue:i,center:a}=t,d=n,u=s.util.getTypedArrayFromDType(o.dtype,s.util.sizeFromShape(o.shape)),[l,c,f,p]=o.shape,[m,h]=s.backend_util.getImageCenter(a,c,f),b=Math.sin(r),j=Math.cos(r),g=d.data.get(o.dataId).values;for(let e=0;e=0&&_=0&&k{const t=Math.floor(e);return e-t<.5?Math.floor(e):e-t>.5?Math.ceil(e):t%2==0?t:t+1})),i={kernelName:s.Round,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Rsqrt.js": -/*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Rsqrt.js ***! - \*************************************************************************/ -/*! exports provided: rsqrtImpl, rsqrt, rsqrtConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"rsqrtImpl",(function(){return i})),n.d(t,"rsqrt",(function(){return a})),n.d(t,"rsqrtConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_impl.js"),r=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +const i=Object(o.unaryKernelFunc)({opSnippet:"if (x < 0.0) return NAN;\n return log(x);",packedOpSnippet:"\n vec4 result = log(x);\n vec4 isNaN = vec4(lessThan(x, vec4(0.0)));\n result.r = isNaN.r == 1.0 ? NAN : result.r;\n result.g = isNaN.g == 1.0 ? NAN : result.g;\n result.b = isNaN.b == 1.0 ? NAN : result.b;\n result.a = isNaN.a == 1.0 ? NAN : result.a;\n\n return result;\n",cpuKernelImpl:r.logImplCPU}),a={kernelName:s.Log,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Log1p.js": +/*!********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Log1p.js ***! + \********************************************************************/ +/*! exports provided: log1p, log1pConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"log1p",(function(){return r})),n.d(t,"log1pConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the License); + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -const i=Object(o.createSimpleUnaryImpl)((e=>1/Math.sqrt(e))),a=Object(r.unaryKernelFuncFromImpl)(s.Rsqrt,i),d={kernelName:s.Rsqrt,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ScatterNd.js": -/*!*****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ScatterNd.js ***! - \*****************************************************************************/ -/*! exports provided: scatterNd, scatterNdConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"scatterNd",(function(){return r})),n.d(t,"scatterNdConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Scatter_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Scatter_impl.js"); +const r=Object(o.unaryKernelFunc)({opSnippet:"return log(1.0 + x);"}),i={kernelName:s.Log1p,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LogicalAnd.js": +/*!*************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LogicalAnd.js ***! + \*************************************************************************/ +/*! exports provided: logicalAnd, logicalAndConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"logicalAnd",(function(){return r})),n.d(t,"logicalAndConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -2855,11 +2850,11 @@ const i=Object(o.createSimpleUnaryImpl)((e=>1/Math.sqrt(e))),a=Object(r.unaryKer * limitations under the License. * ============================================================================= */ -function r(e){const{inputs:t,backend:n,attrs:r}=e,{indices:i,updates:a}=t,{shape:d}=r,{sliceRank:u,numUpdates:l,sliceSize:c,strides:f,outputSize:p}=s.backend_util.calculateShapes(a,i,d),m=n.bufferSync(i),h=n.bufferSync(a),b=Object(o.scatterImpl)(m,h,d,p,c,l,u,f,0,!0);return n.makeTensorInfo(d,b.dtype,b.values)}const i={kernelName:s.ScatterNd,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Scatter_impl.js": -/*!********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Scatter_impl.js ***! - \********************************************************************************/ -/*! exports provided: scatterImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"scatterImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +const r=Object(o.binaryKernelFunc)({opSnippet:"return float(a >= 1.0 && b >= 1.0);",packedOpSnippet:"\n return vec4(\n vec4(greaterThanEqual(a, vec4(1.0))) *\n vec4(greaterThanEqual(b, vec4(1.0))));\n",dtype:"bool"}),i={kernelName:s.LogicalAnd,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LogicalNot.js": +/*!*************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LogicalNot.js ***! + \*************************************************************************/ +/*! exports provided: logicalNot, logicalNotConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"logicalNot",(function(){return r})),n.d(t,"logicalNotConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -2875,11 +2870,12 @@ function r(e){const{inputs:t,backend:n,attrs:r}=e,{indices:i,updates:a}=t,{shape * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */function o(e,t,n,o,r,i,a,d,u,l){const c=[o/r,r],f=e.values,p=t.values;if(0===o)return Object(s.buffer)(n,t.dtype);const m=Object(s.buffer)(c,t.dtype);m.values.fill(u);for(let e=0;e=o/r)throw new Error(`Invalid indices: ${s} does not index into ${n}`);for(let n=0;n= 1.0));"}),i={kernelName:s.LogicalNot,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LogicalOr.js": +/*!************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LogicalOr.js ***! + \************************************************************************/ +/*! exports provided: logicalOr, logicalOrConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"logicalOr",(function(){return r})),n.d(t,"logicalOrConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -2896,116 +2892,116 @@ function r(e){const{inputs:t,backend:n,attrs:r}=e,{indices:i,updates:a}=t,{shape * limitations under the License. * ============================================================================= */ -function r(e){const{inputs:t,backend:n}=e,{condition:r,t:i,e:a}=t;Object(o.assertNotComplex)([r,i,a],"select");const d=r.shape.length,u=n.data.get(r.dataId).values,l=n.data.get(i.dataId).values,c=n.data.get(a.dataId).values,f=Object(s.upcastType)(i.dtype,a.dtype),p=s.util.makeZerosTypedArray(s.util.sizeFromShape(i.shape),f);let m=0;const h=0===d||d>1||1===i.shape.length?1:s.util.sizeFromShape(i.shape.slice(1));for(let e=0;e= 1.0 || b >= 1.0);",packedOpSnippet:"\n return min(\n vec4(greaterThanEqual(a, vec4(1.0))) +\n vec4(greaterThanEqual(b, vec4(1.0))),\n vec4(1.0));\n",dtype:"bool"}),i={kernelName:s.LogicalOr,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Max.js": +/*!******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Max.js ***! + \******************************************************************/ +/*! exports provided: max, maxConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"max",(function(){return a})),n.d(t,"maxConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"),r=n(/*! ./Max_impl */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Max_impl.js"),i=n(/*! ./Transpose_impl */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose_impl.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the License); + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -const r=s.backend_util.SELU_SCALEALPHA,i=s.backend_util.SELU_SCALE,a=Object(o.unaryKernelFunc)(s.Selu,(e=>e>=0?i*e:r*(Math.exp(e)-1))),d={kernelName:s.Selu,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sigmoid.js": -/*!***************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sigmoid.js ***! - \***************************************************************************/ -/*! exports provided: sigmoid, sigmoidConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sigmoid",(function(){return r})),n.d(t,"sigmoidConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:u}=t,{reductionIndices:d,keepDims:l}=a,c=u.shape.length,f=s.util.parseAxisParam(d,u.shape);let p=f;const m=s.backend_util.getAxesPermutation(p,c),h=null!=m,b=n.shouldExecuteOnCPU([u]);let j=u;if(h){if(b){const e=n.texData.get(j.dataId).values,t=new Array(c);for(let e=0;e1/(1+Math.exp(-e)))),i={kernelName:s.Sigmoid,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sign.js": +function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:u}=t;Object(r.assertNotComplex)(u,"maxPool");const{filterSize:d,strides:l,pad:c,dimRoundingMode:f}=a;s.util.assert(s.backend_util.eitherStridesOrDilationsAreOne(l,1),(()=>`Error in maxPool: Either strides or dilations must be 1. Got strides ${l} and dilations '1'`));const p=s.backend_util.computePool2DInfo(u.shape,d,l,1,c,f);if(1===p.filterWidth&&1===p.filterHeight&&s.util.arraysEqual(p.inShape,p.outShape))return Object(i.identity)({inputs:{x:u},backend:n});const m=new o.Pool2DProgram(p,"max",!1);return n.runWebGLProgram(m,[u],u.dtype)}const u={kernelName:s.MaxPool,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPool3D.js": /*!************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sign.js ***! + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPool3D.js ***! \************************************************************************/ -/*! exports provided: sign, signConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sign",(function(){return r})),n.d(t,"signConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/*! exports provided: maxPool3d, maxPool3DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPool3d",(function(){return r})),n.d(t,"maxPool3DConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../pool_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/pool_gpu.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the License); + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -const r=Object(o.unaryKernelFunc)(s.Sign,(e=>e<0?-1:e>0?1:0)),i={kernelName:s.Sign,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sin.js": -/*!***********************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sin.js ***! - \***********************************************************************/ -/*! exports provided: sin, sinConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sin",(function(){return r})),n.d(t,"sinConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i}=t,{filterSize:a,strides:u,pad:d,dataFormat:l,dimRoundingMode:c}=r,f=s.backend_util.computePool3DInfo(i.shape,a,u,[1,1,1],d,c,l),p=new o.Pool3DProgram(f,"max",!1);return n.runWebGLProgram(p,[i],i.dtype)}const i={kernelName:s.MaxPool3D,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPool3DGrad.js": +/*!****************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPool3DGrad.js ***! + \****************************************************************************/ +/*! exports provided: maxPool3DGrad, maxPoolGrad3DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPool3DGrad",(function(){return i})),n.d(t,"maxPoolGrad3DConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../max_pool_backprop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/max_pool_backprop_gpu.js"),r=n(/*! ../pool_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/pool_gpu.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the License); + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================================= - */ -const r=Object(o.unaryKernelFunc)(s.Sin,(e=>Math.sin(e))),i={kernelName:s.Sin,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sinh.js": -/*!************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sinh.js ***! - \************************************************************************/ -/*! exports provided: sinh, sinhConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sinh",(function(){return r})),n.d(t,"sinhConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{dy:a,input:u}=t,d=u,{filterSize:l,strides:c,pad:f,dimRoundingMode:p}=i,m=s.backend_util.computePool3DInfo(d.shape,l,c,[1,1,1],f,p),h=new r.Pool3DProgram(m,"max",!0),b=n.runWebGLProgram(h,[d],d.dtype),j=new o.MaxPool3DBackpropProgram(m),g=n.runWebGLProgram(j,[a,b],d.dtype);return n.disposeIntermediateTensorInfo(b),g}const a={kernelName:s.MaxPool3DGrad,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolGrad.js": +/*!**************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolGrad.js ***! + \**************************************************************************/ +/*! exports provided: maxPoolGrad, maxPoolGradConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPoolGrad",(function(){return a})),n.d(t,"maxPoolGradConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../max_pool_backprop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/max_pool_backprop_gpu.js"),r=n(/*! ../pool_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/pool_gpu.js"),i=n(/*! ../webgl_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the License); + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -const r=Object(o.unaryKernelFunc)(s.Sinh,(e=>Math.sinh(e))),i={kernelName:s.Sinh,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Slice.js": -/*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Slice.js ***! - \*************************************************************************/ -/*! exports provided: sliceImpl, slice, sliceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sliceImpl",(function(){return r})),n.d(t,"slice",(function(){return i})),n.d(t,"sliceConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +function a(e){const{inputs:t,backend:n,attrs:a}=e,{dy:u,input:d,output:l}=t,c=d;Object(i.assertNotComplex)([d,l],"maxPoolGrad");const{filterSize:f,strides:p,pad:m,dimRoundingMode:h}=a,b=s.backend_util.computePool2DInfo(c.shape,f,p,1,m,h),j=new r.Pool2DProgram(b,"max",!0),g=n.runWebGLProgram(j,[c],c.dtype),w=new o.MaxPool2DBackpropProgram(b),_=n.runWebGLProgram(w,[u,g],c.dtype);return n.disposeIntermediateTensorInfo(g),_}const u={kernelName:s.MaxPoolGrad,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolWithArgmax.js": +/*!********************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolWithArgmax.js ***! + \********************************************************************************/ +/*! exports provided: maxPoolWithArgmaxConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPoolWithArgmaxConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./MaxPoolWithArgmax_impl */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolWithArgmax_impl.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -3022,11 +3018,11 @@ const r=Object(o.unaryKernelFunc)(s.Sinh,(e=>Math.sinh(e))),i={kernelName:s.Sinh * limitations under the License. * ============================================================================= */ -function r(e,t,n,o,r){const i=s.slice_util.isSliceContinous(o,t,n),a=s.util.sizeFromShape(n),d=s.util.computeStrides(o);if(i){const n=s.slice_util.computeFlatOffset(t,d);return"string"===r?e.slice(n,n+a):e.subarray(n,n+a)}const u="string"===r?s.backend_util.fromUint8ToStringArray(e):e,l=Object(s.buffer)(o,r,u),c=Object(s.buffer)(n,r);for(let e=0;ee+t[n]));c.set(l.get(...s),...n)}return"string"===r?s.backend_util.fromStringArrayToUint8(c.values):c.values}function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{begin:d,size:u}=i;Object(o.assertNotComplex)(a,"slice");const[l,c]=s.slice_util.parseSliceParams(a,d,u);s.slice_util.assertParamsValid(a,l,c);const f=r(n.data.get(a.dataId).values,l,c,a.shape,a.dtype);return n.makeTensorInfo(c,a.dtype,f)}const a={kernelName:s.Slice,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Softmax.js": -/*!***************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Softmax.js ***! - \***************************************************************************/ -/*! exports provided: softmax, softmaxConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"softmax",(function(){return l})),n.d(t,"softmaxConfig",(function(){return c}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Exp */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Exp.js"),r=n(/*! ./Max */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Max.js"),i=n(/*! ./RealDiv */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RealDiv.js"),a=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"),d=n(/*! ./Sub */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sub.js"),u=n(/*! ./Sum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sum.js"); +const r={kernelName:s.MaxPoolWithArgmax,backendName:"webgl",kernelFunc:({inputs:e,attrs:t,backend:n})=>{const{x:r}=e,{filterSize:i,strides:a,pad:u,includeBatchInIndex:d}=t,l=n;s.util.assert(4===r.shape.length,(()=>`Error in maxPool: input must be rank 4 but got rank ${r.shape.length}.`));const c=[1,1];s.util.assert(s.backend_util.eitherStridesOrDilationsAreOne(a,c),(()=>`Error in maxPool: Either strides or dilations must be 1. Got strides ${a} and dilations '${c}'`));const f=s.backend_util.computePool2DInfo(r.shape,i,a,c,u),[p,m]=Object(o.maxPoolWithArgmaxImpl)(r,d,f,l);return[p,m]}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolWithArgmax_impl.js": +/*!*************************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolWithArgmax_impl.js ***! + \*************************************************************************************/ +/*! exports provided: maxPoolWithArgmaxImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPoolWithArgmaxImpl",(function(){return o}));var s=n(/*! ../pool_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/pool_gpu.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -3042,33 +3038,32 @@ function r(e,t,n,o,r){const i=s.slice_util.isSliceContinous(o,t,n),a=s.util.size * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -function l(e){const{inputs:t,backend:n,attrs:l}=e,{logits:c}=t,{dim:f}=l,p=c.shape.length;let m=f;if(-1===m&&(m=p-1),m!==p-1)throw Error(`Softmax along a non-last dimension is not yet supported. Logits was rank ${p} and dim was ${m}`);const h=s.util.parseAxisParam([m],c.shape),b=Object(r.max)({inputs:{x:c},backend:n,attrs:{reductionIndices:h,keepDims:!1}}),j=s.backend_util.expandShapeToKeepDim(b.shape,h),g=Object(a.reshape)({inputs:{x:b},backend:n,attrs:{shape:j}}),w=Object(d.sub)({inputs:{a:c,b:g},backend:n}),_=Object(o.exp)({inputs:{x:w},backend:n}),k=Object(u.sum)({inputs:{x:_},backend:n,attrs:{axis:h,keepDims:!1}}),v=Object(a.reshape)({inputs:{x:k},backend:n,attrs:{shape:j}}),x=Object(i.div)({inputs:{a:_,b:v},backend:n});return n.disposeIntermediateTensorInfo(b),n.disposeIntermediateTensorInfo(g),n.disposeIntermediateTensorInfo(w),n.disposeIntermediateTensorInfo(_),n.disposeIntermediateTensorInfo(k),n.disposeIntermediateTensorInfo(v),x}const c={kernelName:s.Softmax,backendName:"cpu",kernelFunc:l}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Softplus.js": -/*!****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Softplus.js ***! - \****************************************************************************/ -/*! exports provided: softplus, softplusConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"softplus",(function(){return i})),n.d(t,"softplusConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); + */function o(e,t,n,o){let r=new s.Pool2DProgram(n,"max",!1);const i=o.runWebGLProgram(r,[e],"float32");r=new s.Pool2DProgram(n,"max",!0,!0,t);return[i,o.runWebGLProgram(r,[e],"float32")]}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Max_impl.js": +/*!***********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Max_impl.js ***! + \***********************************************************************/ +/*! exports provided: maxImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"maxImpl",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/reduce */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/reduce.js"),r=n(/*! ../kernels/Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the License); + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -const r=Math.log(1.1920928955078125e-7)+2,i=Object(o.unaryKernelFunc)(s.Softplus,(e=>{const t=e>-r,n=eNumber(e))))),n.makeTensorInfo([b.length],s.dtype,new Int32Array(b))]}const i={kernelName:s.SparseFillEmptyRows,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseFillEmptyRows_impl.js": -/*!********************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseFillEmptyRows_impl.js ***! - \********************************************************************************************/ -/*! exports provided: sparseFillEmptyRowsImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"sparseFillEmptyRowsImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +const i={kernelName:s.Mean,backendName:"webgl",kernelFunc:({inputs:e,attrs:t,backend:n})=>{const{x:i}=e,{keepDims:a,axis:u}=t,d=n,l=i.shape.length,c=s.util.parseAxisParam(u,i.shape);let f=c;const p=s.backend_util.getAxesPermutation(f,l),m=null!=p,h=d.shouldExecuteOnCPU([i]),b=[];let j=i;if(m){if(h){const e=d.texData.get(j.dataId).values,t=new Array(l);for(let e=0;e=u)throw new Error(`indices(${t}, 0) is invalid: ${n} >= ${u}`);++h[n],p=p&&n>=m,m=n}let b=!0;for(let e=0;e0&&(h[e]+=h[e-1])}if(b&&p){const t=e,n=o;for(let e=0;e0){m[p-1]=1;for(let e=p-2;e>=0;--e)m[e]=m[e+1]*o[e+1]}const h=[];if(d>0){h[d-1]=1;for(let e=d-2;e>=0;--e)h[e]=h[e+1]*u[e+1]}const b=s.util.getArrayFromDType(n,a*d);for(let t=0;t{const{x:i}=e,{paddings:a,mode:u}=n,d=Object(s.env)().getBool("WEBGL_PACK_ARRAY_OPERATIONS")?new r.MirrorPadPackedProgram(i.shape,a,u):new o.MirrorPadProgram(i.shape,a,u);return t.runWebGLProgram(d,[i],i.dtype)},a={kernelName:s.MirrorPad,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Mod.js": +/*!******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Mod.js ***! + \******************************************************************/ +/*! exports provided: mod, modConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"mod",(function(){return a})),n.d(t,"modConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../binaryop_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/binaryop_packed_gpu.js"),r=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); /** * @license - * Copyright 2021 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -3208,14 +3205,15 @@ function r(e){const{inputs:t,backend:n}=e,{data:s,indices:r,segmentIds:i}=t;if(s * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */function o(e,t,n,o,r,i=!1,a=0){const d=o.length;if(d!==r.length)throw new Error("segmentIds and indices should have same size.");const u=[t[0],e.length/t[0]],l=u[1],c=d>0?r[d-1]+1:0;if(c<0)throw new Error("segment ids must be >= 0");const f=t.slice();f[0]=c;const p=f.reduce(((e,t)=>e*t),1),m=s.util.getArrayFromDType(n,p);if(0===d)return c>0&&m.fill(a),[m,f];if(c<=0)throw new Error("segment ids must be >= 0");let h=0,b=1,j=0,g=r[h];for(;;){let t=0;if(b=t)throw new Error("segment ids are not increasing")}if(g<0||g>=c)throw new Error(`Segment id ${g} out of range [0, ${c}), possibly because segmentIds input is not sorted.`);g>j&&m.fill(a,j*l,g*l);for(let t=h;t=u[0])throw new Error(`Bad: indices[${t}] == ${o[t]} out of range [0, ${u[0]})`);for(let t=0;td)break}return j{const t=[...f];t[u]=e;const s=Object(o.slice)({inputs:{x:i},backend:n,attrs:{begin:c,size:t}});return c[u]+=e,s}))}const i={kernelName:s.SplitV,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sqrt.js": -/*!************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sqrt.js ***! - \************************************************************************/ -/*! exports provided: sqrt, sqrtConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sqrt",(function(){return r})),n.d(t,"sqrtConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +const a="return -x;";function u(e){const{inputs:t,backend:n}=e,{x:u}=t;if(n.shouldExecuteOnCPU([u])){const e=n.texData.get(u.dataId),[t,s]=Object(o.negImplCPU)(e.values,u.shape,u.dtype);return n.makeTensorInfo(s,u.dtype,t)}let d;return d=Object(s.env)().getBool("WEBGL_PACK_UNARY_OPERATIONS")?new i.UnaryOpPackedProgram(u.shape,a):new r.UnaryOpProgram(u.shape,a),n.runWebGLProgram(d,[u],u.dtype)}const d={kernelName:s.Neg,backendName:"webgl",kernelFunc:u}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV3.js": +/*!**********************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV3.js ***! + \**********************************************************************************/ +/*! exports provided: nonMaxSuppressionV3, nonMaxSuppressionV3Config */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionV3",(function(){return r})),n.d(t,"nonMaxSuppressionV3Config",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the License); + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -const r=Object(o.unaryKernelFunc)(s.Sqrt,(e=>Math.sqrt(e))),i={kernelName:s.Sqrt,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Square.js": -/*!**************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Square.js ***! - \**************************************************************************/ -/*! exports provided: squareConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"squareConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); + */const o=s.kernel_impls.nonMaxSuppressionV3Impl;function r(e){s.backend_util.warn("tf.nonMaxSuppression() in webgl locks the UI thread. Call tf.nonMaxSuppressionAsync() instead");const{inputs:t,backend:n,attrs:r}=e,{boxes:i,scores:a}=t,{maxOutputSize:u,iouThreshold:d,scoreThreshold:l}=r,c=n.readSync(i.dataId),f=n.readSync(a.dataId),{selectedIndices:p}=o(c,f,u,d,l);return n.makeTensorInfo([p.length],"int32",new Int32Array(p))}const i={kernelName:s.NonMaxSuppressionV3,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV4.js": +/*!**********************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV4.js ***! + \**********************************************************************************/ +/*! exports provided: nonMaxSuppressionV4, nonMaxSuppressionV4Config */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionV4",(function(){return r})),n.d(t,"nonMaxSuppressionV4Config",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -3312,12 +3309,11 @@ const r=Object(o.unaryKernelFunc)(s.Sqrt,(e=>Math.sqrt(e))),i={kernelName:s.Sqrt * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -const r={kernelName:s.Square,backendName:"cpu",kernelFunc:({inputs:e,backend:t})=>{const{x:n}=e,s=t;Object(o.assertNotComplex)(n,"square");const r=s.data.get(n.dataId).values,i=new Float32Array(r.length);for(let e=0;e{const n=e-t;return n*n})),a=Object(r.binaryKernelFunc)(s.SquaredDifference,i),d={kernelName:s.SquaredDifference,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Step.js": -/*!************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Step.js ***! - \************************************************************************/ -/*! exports provided: step, stepConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"step",(function(){return r})),n.d(t,"stepConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); + */const o=s.kernel_impls.nonMaxSuppressionV5Impl;function r(e){s.backend_util.warn("tf.nonMaxSuppression() in webgl locks the UI thread. Call tf.nonMaxSuppressionAsync() instead");const{inputs:t,backend:n,attrs:r}=e,{boxes:i,scores:a}=t,{maxOutputSize:u,iouThreshold:d,scoreThreshold:l,softNmsSigma:c}=r,f=n.readSync(i.dataId),p=n.readSync(a.dataId),m=u,h=d,b=l,j=c,{selectedIndices:g,selectedScores:w}=o(f,p,m,h,b,j);return[n.makeTensorInfo([g.length],"int32",new Int32Array(g)),n.makeTensorInfo([w.length],"float32",new Float32Array(w))]}const i={kernelName:s.NonMaxSuppressionV5,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/NotEqual.js": +/*!***********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/NotEqual.js ***! + \***********************************************************************/ +/*! exports provided: notEqual, notEqualConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"notEqual",(function(){return i})),n.d(t,"notEqualConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the License); + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -const r=Object(o.unaryKernelFunc)(s.Step,((e,t)=>{const n=t;return isNaN(e)?NaN:e>0?1:n.alpha})),i={kernelName:s.Step,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StridedSlice.js": -/*!********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StridedSlice.js ***! - \********************************************************************************/ -/*! exports provided: stridedSlice, stridedSliceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"stridedSlice",(function(){return d})),n.d(t,"stridedSliceConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"),i=n(/*! ./Slice */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Slice.js"),a=n(/*! ./StridedSlice_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StridedSlice_impl.js"); +const i=Object(o.binaryKernelFunc)({opSnippet:"return float(a != b);",cpuKernelImpl:r.notEqualImplCPU,dtype:"bool"}),a={kernelName:s.NotEqual,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/OneHot.js": +/*!*********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/OneHot.js ***! + \*********************************************************************/ +/*! exports provided: oneHot, oneHotConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"oneHot",(function(){return i})),n.d(t,"oneHotConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../onehot_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/onehot_gpu.js"),r=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -3376,11 +3371,11 @@ const r=Object(o.unaryKernelFunc)(s.Step,((e,t)=>{const n=t;return isNaN(e)?NaN: * limitations under the License. * ============================================================================= */ -function d(e){const{inputs:t,backend:n,attrs:d}=e,{x:u}=t,{begin:l,end:c,strides:f,beginMask:p,endMask:m,ellipsisMask:h,newAxisMask:b,shrinkAxisMask:j}=d;Object(o.assertNotComplex)(u,"stridedSlice");const{nonStrided:g,$begin:w,$strides:_,size:k,newShape:v,outShape:x}=s.slice_util.sliceInfo(u.shape,l,c,f,p,m,h,b,j),y=Object(r.reshape)({inputs:{x:u},backend:n,attrs:{shape:v}});let O;if(g){const e=Object(i.slice)({inputs:{x:y},backend:n,attrs:{begin:w,size:k}});O=Object(r.reshape)({inputs:{x:e},backend:n,attrs:{shape:x}}),n.disposeIntermediateTensorInfo(e)}else if(x.some((e=>0===e)))O=n.makeTensorInfo(x,u.dtype,[]);else{const e=n.bufferSync(y),t=Object(a.stridedSliceImpl)(x,e,_,w);O=n.makeTensorInfo(t.shape,t.dtype,t.values)}const I=Object(r.reshape)({inputs:{x:O},backend:n,attrs:{shape:x}});return n.disposeIntermediateTensorInfo(y),n.disposeIntermediateTensorInfo(O),I}const u={kernelName:s.StridedSlice,backendName:"cpu",kernelFunc:d}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StridedSlice_impl.js": -/*!*************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StridedSlice_impl.js ***! - \*************************************************************************************/ -/*! exports provided: stridedSliceImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"stridedSliceImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +const i=e=>{const{inputs:t,backend:n,attrs:i}=e,{indices:a}=t,{depth:u,onValue:d,offValue:l}=i,c=s.util.sizeFromShape(a.shape),f=new o.OneHotProgram(c,u,d,l),p=Object(r.reshape)({inputs:{x:a},backend:n,attrs:{shape:[c]}}),m=n.runWebGLProgram(f,[p],a.dtype);n.disposeIntermediateTensorInfo(p);const h=[...a.shape,u],b=Object(r.reshape)({inputs:{x:m},backend:n,attrs:{shape:h}});return n.disposeIntermediateTensorInfo(m),b},a={kernelName:s.OneHot,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/OnesLike.js": +/*!***********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/OnesLike.js ***! + \***********************************************************************/ +/*! exports provided: onesLike, onesLikeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"onesLike",(function(){return d})),n.d(t,"onesLikeConfig",(function(){return l}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Complex */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js"),r=n(/*! ./Fill */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Fill.js"),i=n(/*! ./Imag */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Imag.js"),a=n(/*! ./Real */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Real.js"),u=n(/*! ./ZerosLike */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ZerosLike.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -3396,14 +3391,15 @@ function d(e){const{inputs:t,backend:n,attrs:d}=e,{x:u}=t,{begin:l,end:c,strides * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */function o(e,t,n,o){const r=Object(s.buffer)(e,t.dtype);for(let e=0;e{s.util.assertShapesMatch(u,e.shape,"All tensors passed to stack must have matching shapes"),s.util.assert(d===e.dtype,(()=>"All tensors passed to stack must have matching dtypes"))}));const l=[],c=t.map((e=>{const t=Object(r.expandDims)({inputs:{input:e},backend:n,attrs:{dim:a}});return l.push(t),t})),f=Object(o.concat)({inputs:c,backend:n,attrs:{axis:a}});return l.forEach((e=>n.disposeIntermediateTensorInfo(e))),f}const a={kernelName:s.Pack,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/PadV2.js": +/*!********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/PadV2.js ***! + \********************************************************************/ +/*! exports provided: padV2, padV2Config */function(e,t,n){"use strict";n.r(t),n.d(t,"padV2",(function(){return a})),n.d(t,"padV2Config",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../pad_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/pad_gpu.js"),r=n(/*! ../pad_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/pad_packed_gpu.js"),i=n(/*! ./Fill */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Fill.js"); /** * @license - * Copyright 2021 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -3437,14 +3433,15 @@ function r(e){const{inputs:t,backend:n,attrs:s}=e,{separator:r,nGramWidths:i,lef * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */class o{constructor(e,t,n,o,r,i){this.separator=s.util.encodeString(e),this.nGramWidths=t,this.leftPad=s.util.encodeString(n),this.rightPad=s.util.encodeString(o),this.padWidth=r,this.preserveShort=i}getPadWidth(e){return Math.min(this.padWidth<0?e-1:this.padWidth,e-1)}getNumNGrams(e,t){const n=this.getPadWidth(t);return Math.max(0,e+2*n-t+1)}createNGrams(e,t,n,s,o,r){for(let i=0;i0?0:i-a);let f=0;f+=d*this.leftPad.length;for(let t=0;te.forEach((e=>p[m++]=e));for(let e=0;e0){h(e[c+l-1]);for(let e=0;e0){let e=t[0];if(0!==e)throw new Error(`First split value must be 0, got ${e}`);for(let s=1;s=e;if(o=o&&t[s]<=n,!o)throw new Error(`Invalid split value ${t[s]}, must be in [${e}, ${n}]`);e=t[s]}if(e!==n)throw new Error(`Last split value must be data size. Expected ${n}, got ${e}`)}const r=o-1,i=s.util.getArrayFromDType("int32",o);if(0===n||0===o){const e=new Array(n);for(let e=0;e<=r;++e)i[e]=0;return[e,i]}i[0]=0;for(let e=1;e<=r;++e){const n=t[e]-t[e-1];let s=0;this.nGramWidths.forEach((e=>{s+=this.getNumNGrams(n,e)})),this.preserveShort&&n>0&&0===s&&(s=1),i[e]=i[e-1]+s}const a=new Array(i[r]);for(let n=0;n{const i=t[n+1]-t[n],d=this.getNumNGrams(i,r);this.createNGrams(e,s,a,o,d,r),o+=d})),this.preserveShort&&o===i[n]){const r=t[n+1]-t[n];if(0===r)continue;const i=r+2*this.padWidth,d=1;this.createNGrams(e,s,a,o,d,i)}}return[a,i]}}function r(e,t,n,s,r,i,a,d){return new o(n,s,r,i,a,d).compute(e,t)}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringSplit.js": -/*!*******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringSplit.js ***! - \*******************************************************************************/ -/*! exports provided: stringSplit, stringSplitConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"stringSplit",(function(){return r})),n.d(t,"stringSplitConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./StringSplit_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringSplit_impl.js"); + */ +const a=e=>{const{inputs:t,backend:n,attrs:a}=e,{x:u}=t,{paddings:d,constantValue:l}=a;if(0===s.util.sizeFromShape(u.shape)){const e=d.map(((e,t)=>e[0]+u.shape[t]+e[1]));return Object(i.fill)({backend:n,attrs:{shape:e,value:l,dtype:u.dtype}})}const c=Object(s.env)().getBool("WEBGL_PACK_ARRAY_OPERATIONS")?new r.PadPackedProgram(u.shape,d,l):new o.PadProgram(u.shape,d,l),f=[[l]];return n.runWebGLProgram(c,[u],u.dtype,f)},u={kernelName:s.PadV2,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Pow.js": +/*!******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Pow.js ***! + \******************************************************************/ +/*! exports provided: pow, powConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"pow",(function(){return a})),n.d(t,"powConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../binaryop_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/binaryop_packed_gpu.js"),r=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); /** * @license - * Copyright 2021 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -3458,14 +3455,14 @@ function r(e){const{inputs:t,backend:n,attrs:s}=e,{separator:r,nGramWidths:i,lef * limitations under the License. * ============================================================================= */ -function r(e){const{inputs:t,backend:n,attrs:s}=e,{skipEmpty:r}=s,{input:i,delimiter:a}=t;if("string"!==i.dtype)throw new Error("Input must be of datatype string");if(1!==i.shape.length)throw new Error(`Input must be a vector, got shape: ${i.shape}`);if(0!==a.shape.length)throw new Error(`Delimiter must be a scalar, got shape: ${a.shape}`);const d=n.data.get(i.dataId).values,u=n.data.get(a.dataId).values[0],[l,c,f]=Object(o.stringSplitImpl)(d,u,r),p=c.length;return[n.makeTensorInfo([p,2],"int32",l),n.makeTensorInfo([p],"string",c),n.makeTensorInfo([2],"int32",new Int32Array(f))]}const i={kernelName:s.StringSplit,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringSplit_impl.js": -/*!************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringSplit_impl.js ***! - \************************************************************************************/ -/*! exports provided: stringSplitImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"stringSplitImpl",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +const i="\n // isModRound1 has 1 for components with round(mod(b, 2.0)) == 1, 0 otherwise.\n vec4 isModRound1 = vec4(equal(round(mod(b, 2.0)), ivec4(1)));\n vec4 multiplier = sign(a) * isModRound1 + (vec4(1.0) - isModRound1);\n vec4 result = multiplier * pow(abs(a), b);\n\n // Ensure that a^0 = 1, including 0^0 = 1 as this correspond to TF and JS\n bvec4 isExpZero = equal(b, vec4(0.0));\n result.r = isExpZero.r ? 1.0 : result.r;\n result.g = isExpZero.g ? 1.0 : result.g;\n result.b = isExpZero.b ? 1.0 : result.b;\n result.a = isExpZero.a ? 1.0 : result.a;\n\n vec4 isNaN = vec4(lessThan(a, vec4(0.0))) * vec4(lessThan(floor(b), b));\n "+o.CHECK_NAN_SNIPPET+"\n return result;\n",a=Object(r.binaryKernelFunc)({opSnippet:"\n if(a < 0.0 && floor(b) < b){\n return NAN;\n }\n if (b == 0.0) {\n return 1.0;\n }\n return (round(mod(b, 2.0)) != 1) ?\n pow(abs(a), b) : sign(a) * pow(abs(a), b);\n",packedOpSnippet:i}),u={kernelName:s.Pow,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Prelu.js": +/*!********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Prelu.js ***! + \********************************************************************/ +/*! exports provided: PRELU, PRELU_PACKED, prelu, preluConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"PRELU",(function(){return i})),n.d(t,"PRELU_PACKED",(function(){return a})),n.d(t,"prelu",(function(){return u})),n.d(t,"preluConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../binaryop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/binaryop_gpu.js"),r=n(/*! ../binaryop_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/binaryop_packed_gpu.js"); /** * @license - * Copyright 2021 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -3478,14 +3475,15 @@ function r(e){const{inputs:t,backend:n,attrs:s}=e,{skipEmpty:r}=s,{input:i,delim * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */function o(e,t,n){if(!e.length)return[];if(0===t.length){const t=new Array(e.length);for(let n=0;nn.disposeIntermediateTensorInfo(e))),j}const d={kernelName:s.Prod,backendName:"webgl",kernelFunc:u}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Range.js": +/*!********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Range.js ***! + \********************************************************************/ +/*! exports provided: range, rangeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"range",(function(){return r})),n.d(t,"rangeConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); /** * @license - * Copyright 2021 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -3519,11 +3517,12 @@ function r(e){const{inputs:t,backend:n,attrs:s}=e,{numBuckets:r}=s,{input:i}=t;i * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */function o(e,t){const n=s.util.getArrayFromDType("int32",e.length);for(let o=0;o{const{backend:t,attrs:n}=e,{start:s,stop:r,step:i,dtype:a}=n,u=Object(o.rangeImplCPU)(s,r,i,a);return t.makeTensorInfo([u.length],a,u)},i={kernelName:s.Range,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Real.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Real.js ***! + \*******************************************************************/ +/*! exports provided: real, realConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"real",(function(){return r})),n.d(t,"realConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Identity */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -3540,11 +3539,11 @@ function r(e){const{inputs:t,backend:n,attrs:s}=e,{numBuckets:r}=s,{input:i}=t;i * limitations under the License. * ============================================================================= */ -const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>e-t)),a=Object(r.createComplexBinaryKernelImpl)(((e,t,n,s)=>({real:e-n,imag:t-s}))),d=Object(r.binaryKernelFunc)(s.Sub,i,a),u={kernelName:s.Sub,backendName:"cpu",kernelFunc:d}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sum.js": -/*!***********************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sum.js ***! - \***********************************************************************/ -/*! exports provided: sum, sumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sum",(function(){return l})),n.d(t,"sumConfig",(function(){return c}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ../utils/zeros_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/zeros_impl.js"),i=n(/*! ./Cast */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cast.js"),a=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Identity.js"),d=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"),u=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose.js"); +function r(e){const{inputs:t,backend:n}=e,{input:s}=t,r=n.texData.get(s.dataId);return Object(o.identity)({inputs:{x:r.complexTensorInfos.real},backend:n})}const i={kernelName:s.Real,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/RealDiv.js": +/*!**********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/RealDiv.js ***! + \**********************************************************************/ +/*! exports provided: realDiv, realDivConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"realDiv",(function(){return r})),n.d(t,"realDivConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -3561,53 +3560,53 @@ const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>e-t)),a=Object(r.createCo * limitations under the License. * ============================================================================= */ -function l(e){const{inputs:t,backend:n,attrs:l}=e,{x:c}=t,{axis:f,keepDims:p}=l;let m;Object(o.assertNotComplex)(c,"sum"),m="bool"===c.dtype?Object(i.cast)({inputs:{x:c},backend:n,attrs:{dtype:"int32"}}):Object(a.identity)({inputs:{x:c},backend:n});const h=m.shape.length,b=s.util.parseAxisParam(f,m.shape),j=s.backend_util.getAxesPermutation(b,h);let g=b,w=m;null!=j&&(w=Object(u.transpose)({inputs:{x:m},backend:n,attrs:{perm:j}}),g=s.backend_util.getInnerMostAxes(g.length,h)),s.backend_util.assertAxesAreInnerMostDims("sum",g,w.shape.length);const[_,k]=s.backend_util.computeOutAndReduceShapes(w.shape,g),v=s.backend_util.upcastType(w.dtype,"int32");let x=Object(r.zeros)(n,_,v);const y=s.util.sizeFromShape(k),O=n.data.get(x.dataId).values,I=n.data.get(w.dataId).values;for(let e=0;eMath.tan(e))),i={kernelName:s.Tan,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tanh.js": -/*!************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tanh.js ***! - \************************************************************************/ -/*! exports provided: tanh, tanhConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"tanh",(function(){return r})),n.d(t,"tanhConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +const r=Object(o.unaryKernelFunc)({opSnippet:"return 1.0 / x;"}),i={kernelName:s.Reciprocal,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Relu.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Relu.js ***! + \*******************************************************************/ +/*! exports provided: relu, reluConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"relu",(function(){return i})),n.d(t,"reluConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the License); + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================================= - */ -const r=Object(o.unaryKernelFunc)(s.Tanh,(e=>Math.tanh(e))),i={kernelName:s.Tanh,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tile.js": -/*!************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tile.js ***! - \************************************************************************/ -/*! exports provided: tile, tileConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"tile",(function(){return i})),n.d(t,"tileConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./Tile_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tile_impl.js"); + * limitations under the License. + * ============================================================================= + */ +const r=n(/*! ../unaryop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js").CHECK_NAN_SNIPPET+"\n return (x < 0.0) ? 0.0 : x;\n",i=Object(o.unaryKernelFunc)({opSnippet:r,packedOpSnippet:"\n vec4 result = x * vec4(greaterThanEqual(x, vec4(0.0)));\n bvec4 isNaN = isnan(x);\n\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n"}),a={kernelName:s.Relu,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Relu6.js": +/*!********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Relu6.js ***! + \********************************************************************/ +/*! exports provided: relu6, relu6Config */function(e,t,n){"use strict";n.r(t),n.d(t,"relu6",(function(){return i})),n.d(t,"relu6Config",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -3624,14 +3623,14 @@ const r=Object(o.unaryKernelFunc)(s.Tanh,(e=>Math.tanh(e))),i={kernelName:s.Tanh * limitations under the License. * ============================================================================= */ -function i(e){const{inputs:t,backend:n,attrs:s}=e,{x:i}=t,{reps:a}=s;Object(o.assertNotComplex)(i,"tile");const d=Object(r.tileImpl)(n.bufferSync(i),a);return n.makeTensorInfo(d.shape,d.dtype,d.values)}const a={kernelName:s.Tile,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tile_impl.js": -/*!*****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tile_impl.js ***! - \*****************************************************************************/ -/*! exports provided: tileImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"tileImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +const r=n(/*! ../unaryop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js").CHECK_NAN_SNIPPET+"\n return (x < 0.0) ? 0.0 : min(6.0, x);\n",i=Object(o.unaryKernelFunc)({opSnippet:r,packedOpSnippet:"\n vec4 result = min(x, vec4(6.)) * vec4(greaterThanEqual(x, vec4(0.0)));\n bvec4 isNaN = isnan(x);\n\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n"}),a={kernelName:s.Relu6,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js": +/*!**********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js ***! + \**********************************************************************/ +/*! exports provided: reshape, reshapeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"reshape",(function(){return i})),n.d(t,"reshapeConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/reshape.js"),r=n(/*! ../webgl_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -3644,11 +3643,12 @@ function i(e){const{inputs:t,backend:n,attrs:s}=e,{x:i}=t,{reps:a}=s;Object(o.as * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */function o(e,t){const n=new Array(e.rank);for(let s=0;s`The new shape (${c}) has ${f} elements and the old shape (${a.shape}) has ${l} elements. The new shape and old shape must have the same number of elements.`));const p=d.texData.get(a.dataId);return!p.isPacked||Object(r.isReshapeFree)(a.shape,c)||null!==p.texture&&Object(r.isReshapeFree)(p.shape,c)?(d.incRef(a.dataId),{dataId:a.dataId,shape:c,dtype:a.dtype}):Object(o.packedReshape)(a,c,d)}const a={kernelName:s.Reshape,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeBilinear.js": +/*!*****************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeBilinear.js ***! + \*****************************************************************************/ +/*! exports provided: resizeBilinear, resizeBilinearConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"resizeBilinear",(function(){return i})),n.d(t,"resizeBilinearConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../resize_bilinear_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_gpu.js"),r=n(/*! ../resize_bilinear_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_packed_gpu.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -3665,11 +3665,11 @@ function i(e){const{inputs:t,backend:n,attrs:s}=e,{x:i}=t,{reps:a}=s;Object(o.as * limitations under the License. * ============================================================================= */ -function i(e){const{inputs:t,backend:n,attrs:s}=e,{x:i}=t,{k:a,sorted:d}=s;Object(o.assertNotComplex)(i,"topk");const u=n.data.get(i.dataId).values,[l,c]=Object(r.topKImpl)(u,i.shape,i.dtype,a,d);return[n.makeTensorInfo(l.shape,l.dtype,l.values),n.makeTensorInfo(c.shape,c.dtype,c.values)]}const a={kernelName:s.TopK,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/TopK_impl.js": -/*!*****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/TopK_impl.js ***! - \*****************************************************************************/ -/*! exports provided: topKImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"topKImpl",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +function i(e){const{inputs:t,backend:n,attrs:i}=e,{images:a}=t,{alignCorners:u,halfPixelCenters:d,size:l}=i,[c,f]=l,p=Object(s.env)().getBool("WEBGL_PACK_IMAGE_OPERATIONS")?new r.ResizeBilinearPackedProgram(a.shape,c,f,u,d):new o.ResizeBilinearProgram(a.shape,c,f,u,d);return n.runWebGLProgram(p,[a],"float32")}const a={kernelName:s.ResizeBilinear,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeBilinearGrad.js": +/*!*********************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeBilinearGrad.js ***! + \*********************************************************************************/ +/*! exports provided: resizeBilinearGrad, resizeBilinearGradConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"resizeBilinearGrad",(function(){return r})),n.d(t,"resizeBilinearGradConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../resize_bilinear_backprop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_backprop_gpu.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -3685,14 +3685,15 @@ function i(e){const{inputs:t,backend:n,attrs:s}=e,{x:i}=t,{k:a,sorted:d}=s;Objec * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */const o=(e,t)=>{const n=t.value-e.value;return 0===n?e.index-t.index:n};function r(e,t,n=0,i=e.length-1){for(;i>n;){if(i-n>600){const s=i-n+1,o=t-n+1,a=Math.log(s),d=.5*Math.exp(2*a/3),u=.5*Math.sqrt(a*d*(s-d)/s)*Math.sign(o-s/2);r(e,t,Math.max(n,Math.floor(t-o*d/s+u)),Math.min(i,Math.floor(t+(s-o)*d/s+u)))}const a=e[t];let d=n,u=i;for(s.util.swap(e,n,t),o(e[i],a)>0&&s.util.swap(e,n,i);d0;)u-=1}0===o(e[n],a)?s.util.swap(e,n,u):(u+=1,s.util.swap(e,u,i)),u<=t&&(n=u+1),t<=u&&(i=u-1)}}function i(e,t,n,i,a){const d=t[t.length-1],[u,l]=[e.length/d,d],c=s.util.getTypedArrayFromDType(n,u*i),f=s.util.getTypedArrayFromDType("int32",u*i);for(let t=0;td[t]={value:e,index:t})),it-1)if(t<=1)n=0;else{const e=2*t;n-=e*Math.trunc(n/e),n>=t&&(n=e-n-1)}return s.util.clamp(0,n,t-1)}(e,t);case"wrap":return function(e,t){let n=e;if(n<0)if(t<=1)n=0;else{const e=t-1;n+=t*(Math.trunc(-n/e)+1)}else if(n>t-1)if(t<=1)n=0;else{const e=t-1;n-=t*Math.trunc(n/e)}return s.util.clamp(0,n,t-1)}(e,t);case"nearest":return function(e,t){return s.util.clamp(0,e,t-1)}(e,t);case"constant":default:return function(e,t){return e}(e)}}function a(e,t,n,s,o,r,i,a,d,u,l){return 0<=a&&a{const{image:r}=e,{radians:i,fillValue:a,center:u}=t,d=n,l=new o.RotateProgram(r.shape,a),[c,f]=s.backend_util.getImageCenter(u,r.shape[1],r.shape[2]),p=[[c,f,Math.sin(i),Math.cos(i)]];return d.runWebGLProgram(l,[r],r.dtype,p)}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Round.js": +/*!********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Round.js ***! + \********************************************************************/ +/*! exports provided: round, roundConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"round",(function(){return r})),n.d(t,"roundConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -3787,11 +3790,12 @@ function i(e){const{inputs:t,attrs:n,backend:s}=e,{axis:i}=n,{x:a}=t;Object(o.as * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */function o(e,t,n,o){const r=s.util.parseAxisParam(t,n)[0],i=[1,n[0],1];for(let e=0;e{for(let n=0;n 0.5) {\n return ceil(x);\n } else {\n if (mod(base, 2.0) == 0.0) {\n return base;\n } else {\n return base + 1.0;\n }\n }\n"}),i={kernelName:s.Round,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Rsqrt.js": +/*!********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Rsqrt.js ***! + \********************************************************************/ +/*! exports provided: rsqrt, rsqrtConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"rsqrt",(function(){return i})),n.d(t,"rsqrtConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -3808,11 +3812,11 @@ function i(e){const{inputs:t,attrs:n,backend:s}=e,{axis:i}=n,{x:a}=t;Object(o.as * limitations under the License. * ============================================================================= */ -function i(e){const{inputs:t,backend:n,attrs:s}=e,{value:i}=t;let{axis:a}=s;a<0&&(a+=i.shape.length);const d=i.shape.length,u=i.shape[a],l=new Array(d-1);let c=0;for(let e=0;en.disposeIntermediateTensorInfo(e))),w}const f={kernelName:s.UnsortedSegmentSum,backendName:"cpu",kernelFunc:c}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ZerosLike.js": -/*!*****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ZerosLike.js ***! - \*****************************************************************************/ -/*! exports provided: zerosLike, zerosLikeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"zerosLike",(function(){return d})),n.d(t,"zerosLikeConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Complex */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Complex.js"),r=n(/*! ./Fill */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Fill.js"),i=n(/*! ./Imag */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Imag.js"),a=n(/*! ./Real */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Real.js"); +function i(e){const{inputs:t,backend:n,attrs:i}=e,{indices:a,updates:u}=t,{shape:d}=i,{sliceRank:l,numUpdates:c,sliceSize:f,strides:p,outputSize:m}=s.backend_util.calculateShapes(u,a,d),h=[m/f,f];if(0===m)return n.makeTensorInfo(d,a.dtype);const b=Object(r.reshape)({inputs:{x:a},backend:n,attrs:{shape:[c,l]}}),j=Object(r.reshape)({inputs:{x:u},backend:n,attrs:{shape:[c,f]}}),g=n.makeTensorInfo([],"float32",new Float32Array([0])),w=new o.ScatterProgram(c,l,b.shape.length,j.shape.length,p,h),_=n.runWebGLProgram(w,[j,b,g],j.dtype),k=Object(r.reshape)({inputs:{x:_},backend:n,attrs:{shape:d}});return n.disposeIntermediateTensorInfo(b),n.disposeIntermediateTensorInfo(j),n.disposeIntermediateTensorInfo(_),n.disposeIntermediateTensorInfo(g),k}const a={kernelName:s.ScatterNd,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Select.js": +/*!*********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Select.js ***! + \*********************************************************************/ +/*! exports provided: select, selectConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"select",(function(){return r})),n.d(t,"selectConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../select_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/select_gpu.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -3850,32 +3854,32 @@ function c(e){const{inputs:t,backend:n,attrs:c}=e,{x:f,segmentIds:p}=t,{numSegme * limitations under the License. * ============================================================================= */ -function d(e){const{inputs:t,backend:n}=e,{x:s}=t;if("string"===s.dtype)throw new Error("zerosLike is not supported for string tensors");if("complex64"===s.dtype){const e=Object(a.real)({inputs:{input:s},backend:n}),t=d({inputs:{x:e},backend:n}),r=Object(i.imag)({inputs:{input:s},backend:n}),u=d({inputs:{x:r},backend:n}),l=Object(o.complex)({inputs:{real:t,imag:u},backend:n});return n.disposeIntermediateTensorInfo(e),n.disposeIntermediateTensorInfo(t),n.disposeIntermediateTensorInfo(r),n.disposeIntermediateTensorInfo(u),l}return Object(r.fill)({backend:n,attrs:{shape:s.shape,value:0,dtype:s.dtype}})}const u={kernelName:s.ZerosLike,backendName:"cpu",kernelFunc:d}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/_FusedMatMul.js": -/*!********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/_FusedMatMul.js ***! - \********************************************************************************/ -/*! exports provided: _fusedMatMul, _fusedMatMulConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"_fusedMatMul",(function(){return a})),n.d(t,"_fusedMatMulConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/fused_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/fused_utils.js"),r=n(/*! ./Add */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Add.js"),i=n(/*! ./BatchMatMul */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchMatMul.js"); +function r(e){const{inputs:t,backend:n}=e,{condition:r,t:i,e:a}=t,u=new o.SelectProgram(r.shape.length,i.shape,i.shape.length);return n.runWebGLProgram(u,[r,i,a],Object(s.upcastType)(i.dtype,a.dtype))}const i={kernelName:s.Select,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Selu.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Selu.js ***! + \*******************************************************************/ +/*! exports provided: selu, seluConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"selu",(function(){return i})),n.d(t,"seluConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the License); + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -function a(e){const{inputs:t,backend:n,attrs:s}=e,{a:a,b:d,bias:u,preluActivationWeights:l}=t,{transposeA:c,transposeB:f,activation:p,leakyreluAlpha:m}=s;let h,b,j;const g=[];h=Object(i.batchMatMul)({inputs:{a:a,b:d},attrs:{transposeA:c,transposeB:f},backend:n}),u&&(b=Object(r.add)({inputs:{a:h,b:u},backend:n}),g.push(h),h=b),p&&(j=Object(o.applyActivation)(n,h,p,l,m),g.push(h),h=j);for(const e of g)n.disposeIntermediateTensorInfo(e);return h}const d={kernelName:s._FusedMatMul,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/register_all_kernels.js": -/*!********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/register_all_kernels.js ***! - \********************************************************************************/ -/*! no exports provided */function(e,t,n){"use strict";n.r(t);var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./kernels/_FusedMatMul */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/_FusedMatMul.js"),r=n(/*! ./kernels/Abs */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Abs.js"),i=n(/*! ./kernels/Acos */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Acos.js"),a=n(/*! ./kernels/Acosh */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Acosh.js"),d=n(/*! ./kernels/Add */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Add.js"),u=n(/*! ./kernels/AddN */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AddN.js"),l=n(/*! ./kernels/All */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/All.js"),c=n(/*! ./kernels/Any */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Any.js"),f=n(/*! ./kernels/ArgMax */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ArgMax.js"),p=n(/*! ./kernels/ArgMin */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ArgMin.js"),m=n(/*! ./kernels/Asin */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Asin.js"),h=n(/*! ./kernels/Asinh */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Asinh.js"),b=n(/*! ./kernels/Atan */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atan.js"),j=n(/*! ./kernels/Atan2 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atan2.js"),g=n(/*! ./kernels/Atanh */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atanh.js"),w=n(/*! ./kernels/AvgPool */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPool.js"),_=n(/*! ./kernels/AvgPool3D */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPool3D.js"),k=n(/*! ./kernels/AvgPool3DGrad */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPool3DGrad.js"),v=n(/*! ./kernels/AvgPoolGrad */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPoolGrad.js"),x=n(/*! ./kernels/BatchMatMul */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchMatMul.js"),y=n(/*! ./kernels/BatchNorm */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchNorm.js"),O=n(/*! ./kernels/BatchToSpaceND */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchToSpaceND.js"),I=n(/*! ./kernels/Bincount */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Bincount.js"),C=n(/*! ./kernels/Cast */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cast.js"),S=n(/*! ./kernels/Ceil */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Ceil.js"),T=n(/*! ./kernels/Clip */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Clip.js"),N=n(/*! ./kernels/Complex */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Complex.js"),E=n(/*! ./kernels/ComplexAbs */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ComplexAbs.js"),A=n(/*! ./kernels/Concat */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Concat.js"),R=n(/*! ./kernels/Conv2D */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv2D.js"),F=n(/*! ./kernels/Conv2DBackpropFilter */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv2DBackpropFilter.js"),$=n(/*! ./kernels/Conv2DBackpropInput */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv2DBackpropInput.js"),M=n(/*! ./kernels/Conv3D */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv3D.js"),D=n(/*! ./kernels/Conv3DBackpropFilterV2 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv3DBackpropFilterV2.js"),P=n(/*! ./kernels/Conv3DBackpropInputV2 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv3DBackpropInputV2.js"),B=n(/*! ./kernels/Cos */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cos.js"),L=n(/*! ./kernels/Cosh */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cosh.js"),z=n(/*! ./kernels/CropAndResize */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/CropAndResize.js"),G=n(/*! ./kernels/Cumsum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cumsum.js"),W=n(/*! ./kernels/DenseBincount */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DenseBincount.js"),U=n(/*! ./kernels/DepthToSpace */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DepthToSpace.js"),V=n(/*! ./kernels/DepthwiseConv2dNative */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DepthwiseConv2dNative.js"),q=n(/*! ./kernels/DepthwiseConv2dNativeBackpropFilter */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DepthwiseConv2dNativeBackpropFilter.js"),H=n(/*! ./kernels/DepthwiseConv2dNativeBackpropInput */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DepthwiseConv2dNativeBackpropInput.js"),K=n(/*! ./kernels/Diag */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Diag.js"),X=n(/*! ./kernels/Dilation2D */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Dilation2D.js"),Y=n(/*! ./kernels/Dilation2DBackpropFilter */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Dilation2DBackpropFilter.js"),Z=n(/*! ./kernels/Dilation2DBackpropInput */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Dilation2DBackpropInput.js"),Q=n(/*! ./kernels/Einsum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Einsum.js"),J=n(/*! ./kernels/Elu */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Elu.js"),ee=n(/*! ./kernels/EluGrad */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/EluGrad.js"),te=n(/*! ./kernels/Equal */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Equal.js"),ne=n(/*! ./kernels/Erf */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Erf.js"),se=n(/*! ./kernels/Exp */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Exp.js"),oe=n(/*! ./kernels/ExpandDims */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ExpandDims.js"),re=n(/*! ./kernels/Expm1 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Expm1.js"),ie=n(/*! ./kernels/FFT */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FFT.js"),ae=n(/*! ./kernels/Fill */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Fill.js"),de=n(/*! ./kernels/FlipLeftRight */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FlipLeftRight.js"),ue=n(/*! ./kernels/Floor */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Floor.js"),le=n(/*! ./kernels/FloorDiv */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FloorDiv.js"),ce=n(/*! ./kernels/FusedConv2D */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FusedConv2D.js"),fe=n(/*! ./kernels/FusedDepthwiseConv2D */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FusedDepthwiseConv2D.js"),pe=n(/*! ./kernels/GatherNd */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GatherNd.js"),me=n(/*! ./kernels/GatherV2 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GatherV2.js"),he=n(/*! ./kernels/Greater */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Greater.js"),be=n(/*! ./kernels/GreaterEqual */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GreaterEqual.js"),je=n(/*! ./kernels/Identity */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Identity.js"),ge=n(/*! ./kernels/IFFT */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IFFT.js"),we=n(/*! ./kernels/Imag */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Imag.js"),_e=n(/*! ./kernels/IsFinite */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsFinite.js"),ke=n(/*! ./kernels/IsInf */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsInf.js"),ve=n(/*! ./kernels/IsNaN */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsNaN.js"),xe=n(/*! ./kernels/LeakyRelu */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LeakyRelu.js"),ye=n(/*! ./kernels/Less */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Less.js"),Oe=n(/*! ./kernels/LessEqual */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LessEqual.js"),Ie=n(/*! ./kernels/LinSpace */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LinSpace.js"),Ce=n(/*! ./kernels/Log */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Log.js"),Se=n(/*! ./kernels/Log1p */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Log1p.js"),Te=n(/*! ./kernels/LogicalAnd */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalAnd.js"),Ne=n(/*! ./kernels/LogicalNot */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalNot.js"),Ee=n(/*! ./kernels/LogicalOr */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalOr.js"),Ae=n(/*! ./kernels/LRN */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LRN.js"),Re=n(/*! ./kernels/LRNGrad */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LRNGrad.js"),Fe=n(/*! ./kernels/Max */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Max.js"),$e=n(/*! ./kernels/Maximum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Maximum.js"),Me=n(/*! ./kernels/MaxPool */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPool.js"),De=n(/*! ./kernels/MaxPool3D */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPool3D.js"),Pe=n(/*! ./kernels/MaxPool3DGrad */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPool3DGrad.js"),Be=n(/*! ./kernels/MaxPoolGrad */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolGrad.js"),Le=n(/*! ./kernels/MaxPoolWithArgmax */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolWithArgmax.js"),ze=n(/*! ./kernels/Mean */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Mean.js"),Ge=n(/*! ./kernels/Min */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Min.js"),We=n(/*! ./kernels/Minimum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Minimum.js"),Ue=n(/*! ./kernels/MirrorPad */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MirrorPad.js"),Ve=n(/*! ./kernels/Mod */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Mod.js"),qe=n(/*! ./kernels/Multinomial */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Multinomial.js"),He=n(/*! ./kernels/Multiply */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Multiply.js"),Ke=n(/*! ./kernels/Neg */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Neg.js"),Xe=n(/*! ./kernels/NonMaxSuppressionV3 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV3.js"),Ye=n(/*! ./kernels/NonMaxSuppressionV4 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV4.js"),Ze=n(/*! ./kernels/NonMaxSuppressionV5 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV5.js"),Qe=n(/*! ./kernels/NotEqual */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NotEqual.js"),Je=n(/*! ./kernels/OneHot */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/OneHot.js"),et=n(/*! ./kernels/OnesLike */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/OnesLike.js"),tt=n(/*! ./kernels/Pack */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Pack.js"),nt=n(/*! ./kernels/PadV2 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/PadV2.js"),st=n(/*! ./kernels/Pow */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Pow.js"),ot=n(/*! ./kernels/Prelu */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Prelu.js"),rt=n(/*! ./kernels/Prod */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Prod.js"),it=n(/*! ./kernels/Range */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Range.js"),at=n(/*! ./kernels/Real */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Real.js"),dt=n(/*! ./kernels/RealDiv */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RealDiv.js"),ut=n(/*! ./kernels/Reciprocal */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reciprocal.js"),lt=n(/*! ./kernels/Relu */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Relu.js"),ct=n(/*! ./kernels/Relu6 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Relu6.js"),ft=n(/*! ./kernels/Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"),pt=n(/*! ./kernels/ResizeBilinear */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ResizeBilinear.js"),mt=n(/*! ./kernels/ResizeBilinearGrad */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ResizeBilinearGrad.js"),ht=n(/*! ./kernels/ResizeNearestNeighbor */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ResizeNearestNeighbor.js"),bt=n(/*! ./kernels/ResizeNearestNeighborGrad */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ResizeNearestNeighborGrad.js"),jt=n(/*! ./kernels/Reverse */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reverse.js"),gt=n(/*! ./kernels/RotateWithOffset */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RotateWithOffset.js"),wt=n(/*! ./kernels/Round */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Round.js"),_t=n(/*! ./kernels/Rsqrt */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Rsqrt.js"),kt=n(/*! ./kernels/ScatterNd */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ScatterNd.js"),vt=n(/*! ./kernels/Select */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Select.js"),xt=n(/*! ./kernels/Selu */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Selu.js"),yt=n(/*! ./kernels/Sigmoid */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sigmoid.js"),Ot=n(/*! ./kernels/Sign */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sign.js"),It=n(/*! ./kernels/Sin */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sin.js"),Ct=n(/*! ./kernels/Sinh */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sinh.js"),St=n(/*! ./kernels/Slice */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Slice.js"),Tt=n(/*! ./kernels/Softmax */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Softmax.js"),Nt=n(/*! ./kernels/Softplus */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Softplus.js"),Et=n(/*! ./kernels/SpaceToBatchND */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SpaceToBatchND.js"),At=n(/*! ./kernels/SparseFillEmptyRows */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseFillEmptyRows.js"),Rt=n(/*! ./kernels/SparseReshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseReshape.js"),Ft=n(/*! ./kernels/SparseSegmentMean */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseSegmentMean.js"),$t=n(/*! ./kernels/SparseSegmentSum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseSegmentSum.js"),Mt=n(/*! ./kernels/SparseToDense */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseToDense.js"),Dt=n(/*! ./kernels/SplitV */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SplitV.js"),Pt=n(/*! ./kernels/Sqrt */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sqrt.js"),Bt=n(/*! ./kernels/Square */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Square.js"),Lt=n(/*! ./kernels/SquaredDifference */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SquaredDifference.js"),zt=n(/*! ./kernels/Step */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Step.js"),Gt=n(/*! ./kernels/StridedSlice */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StridedSlice.js"),Wt=n(/*! ./kernels/StringNGrams */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringNGrams.js"),Ut=n(/*! ./kernels/StringSplit */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringSplit.js"),Vt=n(/*! ./kernels/StringToHashBucketFast */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringToHashBucketFast.js"),qt=n(/*! ./kernels/Sub */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sub.js"),Ht=n(/*! ./kernels/Sum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sum.js"),Kt=n(/*! ./kernels/Tan */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tan.js"),Xt=n(/*! ./kernels/Tanh */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tanh.js"),Yt=n(/*! ./kernels/Tile */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tile.js"),Zt=n(/*! ./kernels/TopK */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/TopK.js"),Qt=n(/*! ./kernels/Transform */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transform.js"),Jt=n(/*! ./kernels/Transpose */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose.js"),en=n(/*! ./kernels/Unique */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Unique.js"),tn=n(/*! ./kernels/Unpack */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Unpack.js"),nn=n(/*! ./kernels/UnsortedSegmentSum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/UnsortedSegmentSum.js"),sn=n(/*! ./kernels/ZerosLike */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ZerosLike.js"); +const r=`\n // Stable and Attracting Fixed Point (0, 1) for Normalized Weights.\n // see: https://arxiv.org/abs/1706.02515\n float scaleAlpha = ${s.backend_util.SELU_SCALEALPHA};\n float scale = ${s.backend_util.SELU_SCALE};\n return (x >= 0.0) ? scale * x : scaleAlpha * (exp(x) - 1.0);\n`,i=Object(o.unaryKernelFunc)({opSnippet:r}),a={kernelName:s.Selu,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sigmoid.js": +/*!**********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sigmoid.js ***! + \**********************************************************************/ +/*! exports provided: sigmoid, sigmoidConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sigmoid",(function(){return a})),n.d(t,"sigmoidConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -3892,15 +3896,11 @@ function a(e){const{inputs:t,backend:n,attrs:s}=e,{a:a,b:d,bias:u,preluActivatio * limitations under the License. * ============================================================================= */ -const on=[o._fusedMatMulConfig,r.absConfig,i.acosConfig,a.acoshConfig,d.addConfig,u.addNConfig,l.allConfig,c.anyConfig,f.argMaxConfig,p.argMinConfig,m.asinConfig,h.asinhConfig,b.atanConfig,j.atan2Config,g.atanhConfig,w.avgPoolConfig,_.avgPool3DConfig,k.avgPool3DGradConfig,v.avgPoolGradConfig,x.batchMatMulConfig,y.batchNormConfig,O.batchToSpaceNDConfig,I.bincountConfig,C.castConfig,S.ceilConfig,T.clipConfig,N.complexConfig,E.complexAbsConfig,A.concatConfig,F.conv2DBackpropFilterConfig,$.conv2DBackpropInputConfig,R.conv2DConfig,D.conv3DBackpropFilterV2Config,P.conv3DBackpropInputV2Config,M.conv3DConfig,B.cosConfig,L.coshConfig,z.cropAndResizeConfig,G.cumsumConfig,W.denseBincountConfig,U.depthToSpaceConfig,V.depthwiseConv2dNativeConfig,q.depthwiseConv2dNativeBackpropFilterConfig,H.depthwiseConv2dNativeBackpropInputConfig,K.diagConfig,X.dilation2dConfig,Z.dilation2dBackpropInputConfig,Y.dilation2dBackpropFilterConfig,dt.realDivConfig,Q.einsumConfig,J.eluConfig,ee.eluGradConfig,te.equalConfig,ne.erfConfig,se.expConfig,oe.expandDimsConfig,re.expm1Config,ie.fftConfig,ae.fillConfig,de.flipLeftRightConfig,ue.floorConfig,le.floorDivConfig,ce.fusedConv2DConfig,fe.fusedDepthwiseConv2DConfig,pe.gatherNdConfig,me.gatherV2Config,he.greaterConfig,be.greaterEqualConfig,je.identityConfig,ge.ifftConfig,we.imagConfig,_e.isFiniteConfig,ke.isInfConfig,ve.isNaNConfig,xe.leakyReluConfig,ye.lessConfig,Oe.lessEqualConfig,Ie.linSpaceConfig,Ce.logConfig,Se.log1pConfig,Te.logicalAndConfig,Ne.logicalNotConfig,Ee.logicalOrConfig,Ae.lRNConfig,Re.lRNGradConfig,$e.maximumConfig,Me.maxPoolConfig,De.maxPool3DConfig,Pe.maxPool3DGradConfig,Be.maxPoolGradConfig,Le.maxPoolWithArgmaxConfig,Fe.maxConfig,ze.meanConfig,Ge.minConfig,We.minimumConfig,Ue.mirrorPadConfig,Ve.modConfig,qe.multinomialConfig,He.multiplyConfig,Ke.negConfig,Xe.nonMaxSuppressionV3Config,Ye.nonMaxSuppressionV4Config,Ze.nonMaxSuppressionV5Config,Qe.notEqualConfig,Je.oneHotConfig,et.onesLikeConfig,tt.packConfig,nt.padV2Config,st.powConfig,ot.preluConfig,rt.prodConfig,it.rangeConfig,at.realConfig,ut.reciprocalConfig,lt.reluConfig,ct.relu6Config,ft.reshapeConfig,pt.resizeBilinearConfig,mt.resizeBilinearGradConfig,ht.resizeNearestNeighborConfig,bt.resizeNearestNeighborGradConfig,jt.reverseConfig,gt.rotateWithOffsetConfig,wt.roundConfig,_t.rsqrtConfig,kt.scatterNdConfig,vt.selectConfig,xt.seluConfig,yt.sigmoidConfig,Ot.signConfig,It.sinConfig,Ct.sinhConfig,St.sliceConfig,Tt.softmaxConfig,Nt.softplusConfig,Et.spaceToBatchNDConfig,At.sparseFillEmptyRowsConfig,Rt.sparseReshapeConfig,Ft.sparseSegmentMeanConfig,$t.sparseSegmentSumConfig,Mt.sparseToDenseConfig,Dt.splitVConfig,Pt.sqrtConfig,Bt.squareConfig,Lt.squaredDifferenceConfig,zt.stepConfig,Gt.stridedSliceConfig,Wt.stringNGramsConfig,Ut.stringSplitConfig,Vt.stringToHashBucketFastConfig,qt.subConfig,Ht.sumConfig,Kt.tanConfig,Xt.tanhConfig,Yt.tileConfig,Zt.topKConfig,Jt.transposeConfig,Qt.transformConfig,en.uniqueConfig,tn.unpackConfig,nn.unsortedSegmentSumConfig,sn.zerosLikeConfig];for(const e of on)Object(s.registerKernel)(e)},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/shared.js": -/*!******************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/shared.js ***! - \******************************************************************/ -/*! exports provided: simpleAbsImpl, addImpl, bincountImpl, bincountReduceImpl, ceilImpl, concatImpl, equalImpl, expImpl, expm1Impl, floorImpl, gatherNdImpl, gatherV2Impl, greaterImpl, greaterEqualImpl, lessImpl, lessEqualImpl, linSpaceImpl, logImpl, maxImpl, maximumImpl, minimumImpl, multiplyImpl, negImpl, notEqualImpl, prodImpl, rangeImpl, rsqrtImpl, sliceImpl, sparseFillEmptyRowsImpl, sparseReshapeImpl, sparseSegmentReductionImpl, squaredDifferenceImpl, stridedSliceImpl, stringNGramsImpl, stringSplitImpl, stringToHashBucketFastImpl, subImpl, tileImpl, topKImpl, transposeImpl, uniqueImpl */function(e,t,n){"use strict";n.r(t);var s=n(/*! ./kernels/Abs */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Abs.js");n.d(t,"simpleAbsImpl",(function(){return s.simpleAbsImpl}));var o=n(/*! ./kernels/Add */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Add.js");n.d(t,"addImpl",(function(){return o.addImpl}));var r=n(/*! ./kernels/Bincount_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Bincount_impl.js");n.d(t,"bincountImpl",(function(){return r.bincountImpl})),n.d(t,"bincountReduceImpl",(function(){return r.bincountReduceImpl}));var i=n(/*! ./kernels/Ceil */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Ceil.js");n.d(t,"ceilImpl",(function(){return i.ceilImpl}));var a=n(/*! ./kernels/Concat_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Concat_impl.js");n.d(t,"concatImpl",(function(){return a.concatImpl}));var d=n(/*! ./kernels/Equal */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Equal.js");n.d(t,"equalImpl",(function(){return d.equalImpl}));var u=n(/*! ./kernels/Exp */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Exp.js");n.d(t,"expImpl",(function(){return u.expImpl}));var l=n(/*! ./kernels/Expm1 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Expm1.js");n.d(t,"expm1Impl",(function(){return l.expm1Impl}));var c=n(/*! ./kernels/Floor */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Floor.js");n.d(t,"floorImpl",(function(){return c.floorImpl}));var f=n(/*! ./kernels/GatherNd_Impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GatherNd_Impl.js");n.d(t,"gatherNdImpl",(function(){return f.gatherNdImpl}));var p=n(/*! ./kernels/GatherV2_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GatherV2_impl.js");n.d(t,"gatherV2Impl",(function(){return p.gatherV2Impl}));var m=n(/*! ./kernels/Greater */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Greater.js");n.d(t,"greaterImpl",(function(){return m.greaterImpl}));var h=n(/*! ./kernels/GreaterEqual */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GreaterEqual.js");n.d(t,"greaterEqualImpl",(function(){return h.greaterEqualImpl}));var b=n(/*! ./kernels/Less */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Less.js");n.d(t,"lessImpl",(function(){return b.lessImpl}));var j=n(/*! ./kernels/LessEqual */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LessEqual.js");n.d(t,"lessEqualImpl",(function(){return j.lessEqualImpl}));var g=n(/*! ./kernels/LinSpace_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LinSpace_impl.js");n.d(t,"linSpaceImpl",(function(){return g.linSpaceImpl}));var w=n(/*! ./kernels/Log */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Log.js");n.d(t,"logImpl",(function(){return w.logImpl}));var _=n(/*! ./kernels/Max_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Max_impl.js");n.d(t,"maxImpl",(function(){return _.maxImpl}));var k=n(/*! ./kernels/Maximum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Maximum.js");n.d(t,"maximumImpl",(function(){return k.maximumImpl}));var v=n(/*! ./kernels/Minimum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Minimum.js");n.d(t,"minimumImpl",(function(){return v.minimumImpl}));var x=n(/*! ./kernels/Multiply */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Multiply.js");n.d(t,"multiplyImpl",(function(){return x.multiplyImpl}));var y=n(/*! ./kernels/Neg */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Neg.js");n.d(t,"negImpl",(function(){return y.negImpl}));var O=n(/*! ./kernels/NotEqual */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NotEqual.js");n.d(t,"notEqualImpl",(function(){return O.notEqualImpl}));var I=n(/*! ./kernels/Prod */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Prod.js");n.d(t,"prodImpl",(function(){return I.prodImpl}));var C=n(/*! ./kernels/Range_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Range_impl.js");n.d(t,"rangeImpl",(function(){return C.rangeImpl}));var S=n(/*! ./kernels/Rsqrt */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Rsqrt.js");n.d(t,"rsqrtImpl",(function(){return S.rsqrtImpl}));var T=n(/*! ./kernels/Slice */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Slice.js");n.d(t,"sliceImpl",(function(){return T.sliceImpl}));var N=n(/*! ./kernels/SparseFillEmptyRows_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseFillEmptyRows_impl.js");n.d(t,"sparseFillEmptyRowsImpl",(function(){return N.sparseFillEmptyRowsImpl}));var E=n(/*! ./kernels/SparseReshape_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseReshape_impl.js");n.d(t,"sparseReshapeImpl",(function(){return E.sparseReshapeImpl}));var A=n(/*! ./kernels/SparseSegmentReduction_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseSegmentReduction_impl.js");n.d(t,"sparseSegmentReductionImpl",(function(){return A.sparseSegmentReductionImpl}));var R=n(/*! ./kernels/SquaredDifference */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SquaredDifference.js");n.d(t,"squaredDifferenceImpl",(function(){return R.squaredDifferenceImpl}));var F=n(/*! ./kernels/StridedSlice_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StridedSlice_impl.js");n.d(t,"stridedSliceImpl",(function(){return F.stridedSliceImpl}));var $=n(/*! ./kernels/StringNGrams_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringNGrams_impl.js");n.d(t,"stringNGramsImpl",(function(){return $.stringNGramsImpl}));var M=n(/*! ./kernels/StringSplit_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringSplit_impl.js");n.d(t,"stringSplitImpl",(function(){return M.stringSplitImpl}));var D=n(/*! ./kernels/StringToHashBucketFast_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringToHashBucketFast_impl.js");n.d(t,"stringToHashBucketFastImpl",(function(){return D.stringToHashBucketFastImpl}));var P=n(/*! ./kernels/Sub */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sub.js");n.d(t,"subImpl",(function(){return P.subImpl}));var B=n(/*! ./kernels/Tile_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tile_impl.js");n.d(t,"tileImpl",(function(){return B.tileImpl}));var L=n(/*! ./kernels/TopK_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/TopK_impl.js");n.d(t,"topKImpl",(function(){return L.topKImpl}));var z=n(/*! ./kernels/Transpose_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose_impl.js");n.d(t,"transposeImpl",(function(){return z.transposeImpl}));var G=n(/*! ./kernels/Unique_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Unique_impl.js");n.d(t,"uniqueImpl",(function(){return G.uniqueImpl}))},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js": -/*!*****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js ***! - \*****************************************************************************/ -/*! exports provided: createSimpleBinaryKernelImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"createSimpleBinaryKernelImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +const i="return 1.0 / (1.0 + exp(-1.0 * x));",a=Object(o.unaryKernelFunc)({opSnippet:i,packedOpSnippet:i,cpuKernelImpl:r.sigmoidImplCPU}),u={kernelName:s.Sigmoid,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sign.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sign.js ***! + \*******************************************************************/ +/*! exports provided: sign, signConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sign",(function(){return r})),n.d(t,"signConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -3916,11 +3916,12 @@ const on=[o._fusedMatMulConfig,r.absConfig,i.acosConfig,a.acoshConfig,d.addConfi * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */function o(e){return(t,n,o,r,i)=>{const a=s.backend_util.assertAndGetBroadcastShape(t,n),d=a.length,u=s.util.computeStrides(a),l=s.util.sizeFromShape(a),c=s.util.getTypedArrayFromDType(i,l),f=t.length,p=n.length,m=s.util.computeStrides(t),h=s.util.computeStrides(n),b=s.backend_util.getBroadcastDims(t,a),j=s.backend_util.getBroadcastDims(n,a);if(b.length+j.length===0)for(let t=0;ti[e]=0));const a=s.util.locToIndex(i,f,m),l=n.slice(-p);j.forEach((e=>l[e]=0));const g=s.util.locToIndex(l,p,h);c[t]=e(o[a],r[g])}return[c,a]}}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js": -/*!******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js ***! - \******************************************************************************/ -/*! exports provided: binaryKernelFunc, createComplexBinaryKernelImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"binaryKernelFunc",(function(){return a})),n.d(t,"createComplexBinaryKernelImpl",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ../kernels/Cast */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cast.js"),i=n(/*! ../kernels/Complex */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Complex.js"); + */ +const r=Object(o.unaryKernelFunc)({opSnippet:"\n if (isnan(x)) { return 0.0; }\n return sign(x);\n"}),i={kernelName:s.Sign,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sin.js": +/*!******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sin.js ***! + \******************************************************************/ +/*! exports provided: sin, sinConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sin",(function(){return i})),n.d(t,"sinConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -3937,11 +3938,11 @@ const on=[o._fusedMatMulConfig,r.absConfig,i.acosConfig,a.acoshConfig,d.addConfi * limitations under the License. * ============================================================================= */ -function a(e,t,n,a){return null==n?({inputs:n,backend:r})=>{const{a:i,b:d}=n,u=r;Object(o.assertNotComplex)([i,d],e);const l=u.data.get(i.dataId).values,c=u.data.get(d.dataId).values,f="string"===i.dtype?s.backend_util.fromUint8ToStringArray(l):l,p="string"===i.dtype?s.backend_util.fromUint8ToStringArray(c):c,m=a||i.dtype,[h,b]=t(i.shape,d.shape,f,p,m);return u.makeTensorInfo(b,m,h)}:({inputs:e,backend:s})=>{const{a:o,b:d}=e,u=s;if("complex64"===o.dtype||"complex64"===d.dtype){const e=Object(r.cast)({inputs:{x:o},backend:u,attrs:{dtype:"complex64"}}),t=u.data.get(e.dataId),s=t.complexTensorInfos.real,a=t.complexTensorInfos.imag,l=u.data.get(s.dataId).values,c=u.data.get(a.dataId).values,f=Object(r.cast)({inputs:{x:d},backend:u,attrs:{dtype:"complex64"}}),p=u.data.get(f.dataId),m=p.complexTensorInfos.real,h=p.complexTensorInfos.imag,b=u.data.get(m.dataId).values,j=u.data.get(h.dataId).values,[g,w,_]=n(o.shape,d.shape,l,c,b,j),k=u.makeTensorInfo(_,"float32",g),v=u.makeTensorInfo(_,"float32",w),x=Object(i.complex)({inputs:{real:k,imag:v},backend:u});return u.disposeIntermediateTensorInfo(e),u.disposeIntermediateTensorInfo(f),u.disposeIntermediateTensorInfo(k),u.disposeIntermediateTensorInfo(v),x}{const e=u.data.get(o.dataId).values,n=u.data.get(d.dataId).values,s=a||o.dtype,[r,i]=t(o.shape,d.shape,e,n,s);return u.makeTensorInfo(i,s,r)}}}function d(e){return(t,n,o,r,i,a)=>{const d=s.backend_util.assertAndGetBroadcastShape(t,n),u=s.util.sizeFromShape(d),l=d.length,c=s.util.computeStrides(d),f=s.util.getTypedArrayFromDType("float32",u),p=s.util.getTypedArrayFromDType("float32",u),m=s.backend_util.getBroadcastDims(t,d),h=s.backend_util.getBroadcastDims(n,d),b=s.backend_util.mergeRealAndImagArrays(o,r),j=s.backend_util.mergeRealAndImagArrays(i,a),g=t.length,w=s.util.computeStrides(t),_=n.length,k=s.util.computeStrides(n);if(m.length+h.length===0)for(let t=0;to[e]=0));const r=s.util.locToIndex(o,g,w),i=n.slice(-_);h.forEach((e=>i[e]=0));const a=s.util.locToIndex(i,_,k),d=e(b[2*r],b[2*r+1],j[2*a],j[2*a+1]);f[t]=d.real,p[t]=d.imag}return[f,p,d]}}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/fft_utils.js": -/*!***************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/fft_utils.js ***! - \***************************************************************************/ -/*! exports provided: fftBatch, fftImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"fftBatch",(function(){return m})),n.d(t,"fftImpl",(function(){return h}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernels/Add */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Add.js"),r=n(/*! ../kernels/Complex */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Complex.js"),i=n(/*! ../kernels/Concat */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Concat.js"),a=n(/*! ../kernels/Identity */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Identity.js"),d=n(/*! ../kernels/Imag */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Imag.js"),u=n(/*! ../kernels/Multiply */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Multiply.js"),l=n(/*! ../kernels/Real */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Real.js"),c=n(/*! ../kernels/RealDiv */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RealDiv.js"),f=n(/*! ../kernels/Slice */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Slice.js"),p=n(/*! ../kernels/Sub */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sub.js"); +const r=o.CHECK_NAN_SNIPPET_UNARY+"\n return sin(x);\n",i=Object(o.unaryKernelFunc)({opSnippet:r}),a={kernelName:s.Sin,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sinh.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sinh.js ***! + \*******************************************************************/ +/*! exports provided: sinh, sinhConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sinh",(function(){return r})),n.d(t,"sinhConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -3958,11 +3959,11 @@ function a(e,t,n,a){return null==n?({inputs:n,backend:r})=>{const{a:i,b:d}=n,u=r * limitations under the License. * ============================================================================= */ -function m(e,t,n){const o=e.shape,i=o[0],a=o[1],d=n.data.get(e.dataId),u=d.complexTensorInfos.real,l=d.complexTensorInfos.imag,c=[i,a],p=s.util.sizeFromShape(c),m=s.util.getTypedArrayFromDType("float32",p),b=s.util.getTypedArrayFromDType("float32",p);for(let e=0;eb?b=s:"avg"===i&&(g+=s,w++)}if(isNaN(b))break}j[x+n*_+t]="avg"===i?g/w:b}}}return b}function r(e,t,n,o,r=!1,i=!1){const a=Object(s.buffer)(o.outShape,"int32"),d=o.strideHeight,u=o.strideWidth,l=o.dilationHeight,c=o.dilationWidth,f=o.effectiveFilterHeight,p=o.effectiveFilterWidth,m=o.padInfo.top,h=o.padInfo.left,b=Object(s.buffer)(t,n,e);for(let e=0;e_&&(_=u,k=r?i?((e*o.inHeight+n)*o.inWidth+s)*o.inChannels+t:(n*o.inWidth+s)*o.inChannels+t:a*p+d)}}a.set(k,e,n,d,t)}}return a}function i(e,t,n,o,r,i){const a=r.strideDepth,d=r.strideHeight,u=r.strideWidth,l=r.dilationDepth,c=r.dilationHeight,f=r.dilationWidth,p=r.effectiveFilterDepth,m=r.effectiveFilterHeight,h=r.effectiveFilterWidth,b=r.padInfo.front,j=r.padInfo.top,g=r.padInfo.left,w="max"===i?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,_=Object(s.buffer)(r.outShape,n),k=_.values,v=r.outShape[1]*r.outShape[2]*r.outShape[3]*r.outShape[4],x=r.outShape[2]*r.outShape[3]*r.outShape[4],y=r.outShape[3]*r.outShape[4],O=r.outShape[4];for(let t=0;tv?v=r:"avg"===i&&(x+=r,y++),isNaN(v))break}if(isNaN(v))break}if(isNaN(v))break}k[j+t]="avg"===i?x/y:v}}}}return _}function a(e,t){const n=Object(s.buffer)(t.outShape,"int32"),o=t.strideDepth,r=t.strideHeight,i=t.strideWidth,a=t.dilationDepth,d=t.dilationHeight,u=t.dilationWidth,l=t.effectiveFilterDepth,c=t.effectiveFilterHeight,f=t.effectiveFilterWidth,p=t.padInfo.front,m=t.padInfo.top,h=t.padInfo.left;for(let s=0;s=y&&(y=d,O=n*c*f+r*c+a)}}}n.set(O,s,j,o,r,b)}}}return n}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_impl.js": -/*!****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_impl.js ***! - \****************************************************************************/ -/*! exports provided: createSimpleUnaryImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"createSimpleUnaryImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); + */ +function l(e){const{inputs:t,backend:n,attrs:l}=e,{logits:c}=t,{dim:f}=l,p=s.util.parseAxisParam([f],c.shape),m=Object(r.max)({inputs:{x:c},backend:n,attrs:{reductionIndices:p,keepDims:!1}}),h=s.backend_util.expandShapeToKeepDim(m.shape,p),b=Object(a.reshape)({inputs:{x:m},backend:n,attrs:{shape:h}}),j=Object(u.sub)({inputs:{a:c,b:b},backend:n}),g=Object(o.exp)({inputs:{x:j},backend:n}),w=Object(d.sum)({inputs:{x:g},backend:n,attrs:{axis:p,keepDims:!1}}),_=Object(a.reshape)({inputs:{x:w},backend:n,attrs:{shape:h}}),k=Object(i.realDiv)({inputs:{a:g,b:_},backend:n});return n.disposeIntermediateTensorInfo(m),n.disposeIntermediateTensorInfo(b),n.disposeIntermediateTensorInfo(j),n.disposeIntermediateTensorInfo(g),n.disposeIntermediateTensorInfo(w),n.disposeIntermediateTensorInfo(_),k}const c={kernelName:s.Softmax,backendName:"webgl",kernelFunc:l}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Softplus.js": +/*!***********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Softplus.js ***! + \***********************************************************************/ +/*! exports provided: softplus, softplusConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"softplus",(function(){return r})),n.d(t,"softplusConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -4019,11 +4021,12 @@ function l(e,t,n,l,c){if("linear"===n)return Object(o.identity)({inputs:{x:t},ba * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */function o(e){return(t,n,o)=>{const r=s.util.getTypedArrayFromDType(n,t.length);for(let n=0;n -threshold;\n bool too_small = x < threshold;\n\n float result;\n float exp_x = exp(x);\n\n if (too_large){\n result = x;\n }\n else if (too_small){\n result = exp_x;\n }\n else{\n result = log(exp_x + 1.0);\n }\n return result;\n"}),i={kernelName:s.Softplus,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SpaceToBatchND.js": /*!*****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js ***! + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SpaceToBatchND.js ***! \*****************************************************************************/ -/*! exports provided: unaryKernelFunc, unaryKernelFuncFromImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"unaryKernelFunc",(function(){return r})),n.d(t,"unaryKernelFuncFromImpl",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/*! exports provided: spaceToBatchND, spaceToBatchNDConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"spaceToBatchND",(function(){return a})),n.d(t,"spaceToBatchNDConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./PadV2 */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/PadV2.js"),r=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),i=n(/*! ./Transpose */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -4040,14 +4043,14 @@ function l(e,t,n,l,c){if("linear"===n)return Object(o.identity)({inputs:{x:t},ba * limitations under the License. * ============================================================================= */ -function r(e,t,n){return({inputs:r,attrs:i,backend:a})=>{const{x:d}=r;if(Object(o.assertNotComplex)(d,e),"string"===d.dtype||"string"===n)throw new Error("unaryKernelFunc does not support string input/output");const u=a,l=u.data.get(d.dataId).values,c=s.util.sizeFromShape(d.shape),f=n||d.dtype,p=s.util.getArrayFromDType(f,c);for(let e=0;e{const{x:a}=s;if(Object(o.assertNotComplex)(a,e),"string"===a.dtype||"string"===n)throw new Error("unaryKernelFunc does not support string input/output");const d=i,u=d.data.get(a.dataId).values,l=n||a.dtype,c=t(u,l,r);return d.makeTensorInfo(a.shape,l,c)}}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/zeros_impl.js": -/*!****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/zeros_impl.js ***! - \****************************************************************************/ -/*! exports provided: zeros */function(e,t,n){"use strict";n.r(t),n.d(t,"zeros",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernels/Complex */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Complex.js"); +const a=e=>{const{inputs:t,backend:n,attrs:a}=e,{x:u}=t,{blockShape:d,paddings:l}=a;s.util.assert(u.shape.length<=4,(()=>"spaceToBatchND for rank > 4 with a WebGL backend not implemented yet"));const c=d.reduce(((e,t)=>e*t)),f=[[0,0]];f.push(...l);for(let e=1+d.length;en.disposeIntermediateTensorInfo(e))),_},u={kernelName:s.SpaceToBatchND,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseFillEmptyRows.js": +/*!**********************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseFillEmptyRows.js ***! + \**********************************************************************************/ +/*! exports provided: sparseFillEmptyRows, sparseFillEmptyRowsConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sparseFillEmptyRows",(function(){return r})),n.d(t,"sparseFillEmptyRowsConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2021 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -4061,20 +4064,14 @@ function r(e,t,n){return({inputs:r,attrs:i,backend:a})=>{const{x:d}=r;if(Object( * limitations under the License. * ============================================================================= */ -function r(e,t,n="float32"){if("complex64"===n){const n=r(e,t,"float32"),s=r(e,t,"float32");return Object(o.complex)({inputs:{real:n,imag:s},backend:e})}const i=s.util.makeZerosTypedArray(s.util.sizeFromShape(t),n);return e.makeTensorInfo(t,n,i)}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/version.js": -/*!*******************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/version.js ***! - \*******************************************************************/ -/*! exports provided: version */function(e,t,n){"use strict";n.r(t),n.d(t,"version",(function(){return s})); -/** @license See the LICENSE file. */ -const s="3.8.0"},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/backend_wasm.js": -/*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/backend_wasm.js ***! - \*************************************************************************/ -/*! exports provided: BackendWasm, init, setWasmPath, setWasmPaths, resetWasmPath */function(e,t,n){"use strict";n.r(t),n.d(t,"BackendWasm",(function(){return u})),n.d(t,"init",(function(){return c})),n.d(t,"setWasmPath",(function(){return g})),n.d(t,"setWasmPaths",(function(){return w})),n.d(t,"resetWasmPath",(function(){return _}));n(/*! ./flags_wasm */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/flags_wasm.js");var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../wasm-out/tfjs-backend-wasm-threaded-simd.js */"./node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm-threaded-simd.js"),r=n.n(o),i=n(/*! ../wasm-out/tfjs-backend-wasm-threaded-simd.worker.js */"./node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm-threaded-simd.worker.js"),a=n(/*! ../wasm-out/tfjs-backend-wasm.js */"./node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm.js"),d=n.n(a); +function r(e){const{inputs:t,backend:n}=e,{indices:s,values:r,denseShape:i,defaultValue:a}=t;if(1!==i.shape.length)throw new Error(`Dense shape must be a vector, saw:\n ${i.shape}`);if(2!==s.shape.length)throw new Error(`Indices must be a matrix, saw:\n ${s.shape}`);if(1!==r.shape.length)throw new Error(`Values must be a vector, saw:\n ${r.shape}`);if(0!==a.shape.length)throw new Error(`Default value must be a scalar, saw:\n ${a.shape}`);const u=n.readSync(s.dataId),d=n.readSync(r.dataId),l=n.readSync(i.dataId),c=n.readSync(a.dataId)[0],[f,p,m,h,b]=Object(o.sparseFillEmptyRowsImplCPU)(u,s.shape,s.dtype,d,r.dtype,l,c);return[n.makeTensorInfo(p,s.dtype,f),n.makeTensorInfo([p[0]],r.dtype,m),n.makeTensorInfo([h.length],"bool",new Uint8Array(h.map((e=>Number(e))))),n.makeTensorInfo([b.length],s.dtype,new Int32Array(b))]}const i={kernelName:s.SparseFillEmptyRows,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseReshape.js": +/*!****************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseReshape.js ***! + \****************************************************************************/ +/*! exports provided: sparseReshape, sparseReshapeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sparseReshape",(function(){return r})),n.d(t,"sparseReshapeConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2021 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -4088,18 +4085,14 @@ const s="3.8.0"},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/backend_wasm * limitations under the License. * ============================================================================= */ -class u extends s.KernelBackend{constructor(e){super(),this.wasm=e,this.dataIdNextNumber=1,this.wasm.tfjs.init(),this.dataIdMap=new s.DataStorage(this,Object(s.engine)())}write(e,t,n){const s={id:this.dataIdNextNumber++};return this.move(s,e,t,n,1),s}numDataIds(){return this.dataIdMap.numDataIds()}async time(e){const t=s.util.now();e();return{kernelMs:s.util.now()-t}}move(e,t,n,o,r){const i=this.dataIdNextNumber++;if("string"===o){const s=t;return void this.dataIdMap.set(e,{id:i,stringBytes:s,shape:n,dtype:o,memoryOffset:null,refCount:r})}const a=s.util.sizeFromShape(n),d=a*s.util.bytesPerElement(o),u=this.wasm._malloc(d);this.dataIdMap.set(e,{id:i,memoryOffset:u,shape:n,dtype:o,refCount:r}),this.wasm.tfjs.registerTensor(i,a,u),null!=t&&this.wasm.HEAPU8.set(new Uint8Array(t.buffer,t.byteOffset,d),u)}async read(e){return this.readSync(e)}readSync(e){const{memoryOffset:t,dtype:n,shape:o,stringBytes:r}=this.dataIdMap.get(e);if("string"===n)return r;return function(e,t){switch(t){case"float32":return new Float32Array(e);case"int32":return new Int32Array(e);case"bool":return new Uint8Array(e);default:throw new Error(`Unknown dtype ${t}`)}}(this.wasm.HEAPU8.slice(t,t+s.util.sizeFromShape(o)*s.util.bytesPerElement(n)).buffer,n)}disposeData(e,t=!1){if(this.dataIdMap.has(e)){const n=this.dataIdMap.get(e);if(n.refCount--,!t&&n.refCount>0)return!1;this.wasm._free(n.memoryOffset),this.wasm.tfjs.disposeData(n.id),this.dataIdMap.delete(e)}return!0}refCount(e){if(this.dataIdMap.has(e)){return this.dataIdMap.get(e).refCount}return 0}incRef(e){const t=this.dataIdMap.get(e);null!=t&&t.refCount++}floatPrecision(){return 32}getMemoryOffset(e){return this.dataIdMap.get(e).memoryOffset}dispose(){this.wasm.tfjs.dispose(),"PThread"in this.wasm&&this.wasm.PThread.terminateAllThreads(),this.wasm=null}memory(){return{unreliable:!1}}makeOutput(e,t,n){let o;if(null==n)o=this.write(null,e,t);else{const r=this.dataIdNextNumber++;o={id:r},this.dataIdMap.set(o,{id:r,memoryOffset:n,shape:e,dtype:t,refCount:1});const i=s.util.sizeFromShape(e);this.wasm.tfjs.registerTensor(r,i,n)}return{dataId:o,shape:e,dtype:t}}typedArrayFromHeap({shape:e,dtype:t,dataId:n}){const o=this.wasm.HEAPU8.buffer,{memoryOffset:r}=this.dataIdMap.get(n),i=s.util.sizeFromShape(e);switch(t){case"float32":return new Float32Array(o,r,i);case"int32":return new Int32Array(o,r,i);case"bool":return new Uint8Array(o,r,i);default:throw new Error(`Unknown dtype ${t}`)}}}function l(e,t,n){if(null!=p)return p;let s="tfjs-backend-wasm.wasm";return e&&t?s="tfjs-backend-wasm-threaded-simd.wasm":e&&(s="tfjs-backend-wasm-simd.wasm"),null!=h&&null!=h[s]?h[s]:n+s}async function c(){const[e,t]=await Promise.all([Object(s.env)().getAsync("WASM_HAS_SIMD_SUPPORT"),Object(s.env)().getAsync("WASM_HAS_MULTITHREAD_SUPPORT")]);return new Promise(((n,o)=>{const a={};var u;a.locateFile=(n,s)=>{if(n.endsWith(".worker.js")){const e=i.wasmWorkerContents,t=new Blob([e],{type:"application/javascript"});return URL.createObjectURL(t)}return n.endsWith(".wasm")?l(e,t,null!=m?m:s):s+n},j&&(a.instantiateWasm=(u=l(e,t,null!=m?m:""),(e,t)=>(s.util.fetch(u,{credentials:"same-origin"}).then((n=>{n.ok||e.env.a(`failed to load wasm binary file at '${u}'`),n.arrayBuffer().then((n=>{WebAssembly.instantiate(n,e).then((e=>{t(e.instance,e.module)}))}))})),{})));let c,f=!1;a.onAbort=()=>{if(f)return;if(b)return;b=!0;o({message:"Make sure the server can serve the `.wasm` file relative to the bundled js file. For more details see https://github.com/tensorflow/tfjs/blob/master/tfjs-backend-wasm/README.md#using-bundlers"})},t&&e&&null==p?(a.mainScriptUrlOrBlob=new Blob(["var WasmBackendModuleThreadedSimd = "+r.a.toString()],{type:"text/javascript"}),c=r()(a)):c=d()(a),c.then((e=>{f=!0,b=!1;e.tfjs={init:e.cwrap("init",null,[]),registerTensor:e.cwrap("register_tensor",null,["number","number","number"]),disposeData:e.cwrap("dispose_data",null,["number"]),dispose:e.cwrap("dispose",null,[])},n({wasm:e})}))}))}const f=["tfjs-backend-wasm.wasm","tfjs-backend-wasm-simd.wasm","tfjs-backend-wasm-threaded-simd.wasm"];let p=null,m=null,h={},b=!1,j=!1;function g(e,t=!1){if(Object(s.deprecationWarn)("setWasmPath has been deprecated in favor of setWasmPaths and will be removed in a future release."),b)throw new Error("The WASM backend was already initialized. Make sure you call `setWasmPath()` before you call `tf.setBackend()` or `tf.ready()`");p=e,j=t}function w(e,t=!1){if(b)throw new Error("The WASM backend was already initialized. Make sure you call `setWasmPaths()` before you call `tf.setBackend()` or `tf.ready()`");if("string"==typeof e)m=e;else{h=e;const t=f.filter((e=>null==h[e]));if(t.length>0)throw new Error(`There were no entries found for the following binaries: ${t.join(",")}. Please either call setWasmPaths with a map providing a path for each binary, or with a string indicating the directory where all the binaries can be found.`)}j=t}function _(){p=null,m=null,h={},j=!1,b=!1}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/base.js": -/*!*****************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/base.js ***! - \*****************************************************************/ -/*! exports provided: BackendWasm, setWasmPath, setWasmPaths, version_wasm */function(e,t,n){"use strict";n.r(t);n(/*! ./flags_wasm */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/flags_wasm.js");var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./backend_wasm */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/backend_wasm.js");n.d(t,"BackendWasm",(function(){return o.BackendWasm})),n.d(t,"setWasmPath",(function(){return o.setWasmPath})),n.d(t,"setWasmPaths",(function(){return o.setWasmPaths}));var r=n(/*! ./version */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/version.js");n.d(t,"version_wasm",(function(){return r.version}));Object(s.registerBackend)("wasm",(async()=>{const{wasm:e}=await Object(o.init)();return new o.BackendWasm(e)}),2)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/flags_wasm.js": -/*!***********************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/flags_wasm.js ***! - \***********************************************************************/ -/*! no exports provided */function(e,t,n){"use strict";n.r(t);var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +function r(e){const{inputs:t,backend:n}=e,{inputIndices:s,inputShape:r,newShape:i}=t;if(2!==s.shape.length)throw new Error(`Input indices should be a matrix but received shape ${s.shape}`);if(1!==r.shape.length)throw new Error(`Input shape should be a vector but received shape ${r.shape}`);if(1!==i.shape.length)throw new Error(`Target shape should be a vector but received shape ${i.shape}`);const a=Array.from(n.readSync(r.dataId)),u=n.readSync(s.dataId),d=Array.from(n.readSync(i.dataId)),[l,c,f]=Object(o.sparseReshapeImplCPU)(u,s.shape,s.dtype,a,d);return[n.makeTensorInfo(c,s.dtype,l),n.makeTensorInfo([f.length],i.dtype,new Int32Array(f))]}const i={kernelName:s.SparseReshape,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseSegmentMean.js": +/*!********************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseSegmentMean.js ***! + \********************************************************************************/ +/*! exports provided: sparseSegmentMean, sparseSegmentMeanConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sparseSegmentMean",(function(){return r})),n.d(t,"sparseSegmentMeanConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2021 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -4112,22 +4105,15 @@ class u extends s.KernelBackend{constructor(e){super(),this.wasm=e,this.dataIdNe * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */const o=Object(s.env)();o.registerFlag("WASM_HAS_SIMD_SUPPORT",(async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,9,1,7,0,65,0,253,15,26,11])))),o.registerFlag("WASM_HAS_MULTITHREAD_SUPPORT",(async()=>{if(o.get("IS_NODE"))return!1;try{return(new MessageChannel).port1.postMessage(new SharedArrayBuffer(1)),WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11]))}catch(e){return!1}}))},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/index.js": -/*!******************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/index.js ***! - \******************************************************************/ -/*! exports provided: BackendWasm, setWasmPath, setWasmPaths, version_wasm */function(e,t,n){"use strict";n.r(t);n(/*! ./register_all_kernels */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/register_all_kernels.js");var s=n(/*! ./base */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/base.js");n.d(t,"BackendWasm",(function(){return s.BackendWasm})),n.d(t,"setWasmPath",(function(){return s.setWasmPath})),n.d(t,"setWasmPaths",(function(){return s.setWasmPaths})),n.d(t,"version_wasm",(function(){return s.version_wasm}))},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernel_utils/shared.js": -/*!********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernel_utils/shared.js ***! - \********************************************************************************/ -/*! exports provided: concatImplCPU, rangeImplCPU, sliceImplCPU */function(e,t,n){"use strict";n.r(t);var s=n(/*! @tensorflow/tfjs-backend-cpu/dist/shared */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/shared.js");n.d(t,"concatImplCPU",(function(){return s.concatImpl})),n.d(t,"sliceImplCPU",(function(){return s.sliceImpl})),n.d(t,"rangeImplCPU",(function(){return s.rangeImpl}))},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Abs.js": -/*!************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Abs.js ***! - \************************************************************************/ -/*! exports provided: absConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"absConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); + */ +function r(e){const{inputs:t,backend:n}=e,{data:s,indices:r,segmentIds:i}=t;if(s.shape.length<1)throw new Error("Data should be at least 1 dimensional but received scalar");if(1!==r.shape.length)throw new Error(`Indices should be a vector but received shape\n ${r.shape}`);if(1!==i.shape.length)throw new Error(`Segment ids should be a vector but received shape\n ${i.shape}`);const a=n.readSync(s.dataId),u=n.readSync(r.dataId),d=n.readSync(i.dataId),[l,c]=Object(o.sparseSegmentReductionImplCPU)(a,s.shape,s.dtype,u,d,!0);return n.makeTensorInfo(c,s.dtype,l)}const i={kernelName:s.SparseSegmentMean,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseSegmentSum.js": +/*!*******************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseSegmentSum.js ***! + \*******************************************************************************/ +/*! exports provided: sparseSegmentSum, sparseSegmentSumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sparseSegmentSum",(function(){return r})),n.d(t,"sparseSegmentSumConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2021 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -4141,14 +4127,14 @@ class u extends s.KernelBackend{constructor(e){super(),this.wasm=e,this.dataIdNe * limitations under the License. * ============================================================================= */ -const r=Object(o.createUnaryKernelConfig)(s.Abs)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Add.js": -/*!************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Add.js ***! - \************************************************************************/ -/*! exports provided: addConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"addConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); +function r(e){const{inputs:t,backend:n}=e,{data:s,indices:r,segmentIds:i}=t;if(s.shape.length<1)throw new Error("Data should be at least 1 dimensional but received scalar");if(1!==r.shape.length)throw new Error(`Indices should be a vector but received shape\n ${r.shape}`);if(1!==i.shape.length)throw new Error(`Segment ids should be a vector but received shape\n ${i.shape}`);const a=n.readSync(s.dataId),u=n.readSync(r.dataId),d=n.readSync(i.dataId),[l,c]=Object(o.sparseSegmentReductionImplCPU)(a,s.shape,s.dtype,u,d);return n.makeTensorInfo(c,s.dtype,l)}const i={kernelName:s.SparseSegmentSum,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseToDense.js": +/*!****************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseToDense.js ***! + \****************************************************************************/ +/*! exports provided: sparseToDense, sparseToDenseConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sparseToDense",(function(){return i})),n.d(t,"sparseToDenseConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../scatter_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/scatter_gpu.js"),r=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -4162,14 +4148,14 @@ const r=Object(o.createUnaryKernelConfig)(s.Abs)},"./node_modules/@tensorflow/tf * limitations under the License. * ============================================================================= */ -const r=Object(o.createBinaryKernelConfig)(s.Add,!0)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/AddN.js": -/*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/AddN.js ***! - \*************************************************************************/ -/*! exports provided: addNConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"addNConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); +function i(e){const{inputs:t,backend:n,attrs:i}=e,{sparseIndices:a,sparseValues:u,defaultValue:d}=t,{outputShape:l}=i,{sliceRank:c,numUpdates:f,strides:p,outputSize:m}=s.backend_util.calculateShapes(u,a,l),h=new o.ScatterProgram(f,c,a.shape.length,u.shape.length,p,[m,1],!1),b=n.runWebGLProgram(h,[u,a,d],u.dtype),j=Object(r.reshape)({inputs:{x:b},backend:n,attrs:{shape:l}});return n.disposeIntermediateTensorInfo(b),j}const a={kernelName:s.SparseToDense,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SplitV.js": +/*!*********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SplitV.js ***! + \*********************************************************************/ +/*! exports provided: splitV, splitVConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"splitV",(function(){return r})),n.d(t,"splitVConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Slice */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Slice.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -4183,14 +4169,14 @@ const r=Object(o.createBinaryKernelConfig)(s.Add,!0)},"./node_modules/@tensorflo * limitations under the License. * ============================================================================= */ -let r;const i={kernelName:s.AddN,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.AddN,null,["array","number","number","number"])},kernelFunc:function(e){const{inputs:t,backend:n}=e,i=n.makeOutput(t[0].shape,t[0].dtype);if(0===s.util.sizeFromShape(i.shape))return i;const a=t.map((e=>n.dataIdMap.get(e.dataId).id)),d=new Uint8Array(new Int32Array(a).buffer),u=n.dataIdMap.get(i.dataId).id;return r(d,a.length,o.CppDType[i.dtype],u),i}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/All.js": -/*!************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/All.js ***! - \************************************************************************/ -/*! exports provided: allConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"allConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./kernel_utils */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/kernel_utils.js"); +function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i}=t,{numOrSizeSplits:a,axis:u}=r,d=s.util.parseAxisParam(u,i.shape)[0],l=s.backend_util.prepareSplitSize(i,a,d),c=i.shape.length,f=new Array(c).fill(0),p=i.shape.slice();return l.map((e=>{const t=[...p];t[d]=e;const s=Object(o.slice)({inputs:{x:i},backend:n,attrs:{begin:f,size:t}});return f[d]+=e,s}))}const i={kernelName:s.SplitV,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sqrt.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sqrt.js ***! + \*******************************************************************/ +/*! exports provided: sqrt, sqrtConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sqrt",(function(){return a})),n.d(t,"sqrtConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); /** * @license - * Copyright 2021 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -4204,14 +4190,14 @@ let r;const i={kernelName:s.AddN,backendName:"wasm",setupFunc:function(e){r=e.wa * limitations under the License. * ============================================================================= */ -let r;const i={kernelName:s.All,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.All,null,["number, number, number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:i}=e,{axis:a,keepDims:d}=i,{x:u}=n;let l=t.dataIdMap.get(u.dataId).id,c=u;const{transposed:f,axes:p,originalAxes:m,inputWasTransposed:h}=Object(o.permuteAxesAndTranspose)(u,a,t);if(h){c=f,l=t.dataIdMap.get(f.dataId).id}const b=c.shape.length;s.backend_util.assertAxesAreInnerMostDims("all",p,b);const[j,g]=s.backend_util.computeOutAndReduceShapes(c.shape,p),w=s.util.sizeFromShape(g),_=t.makeOutput(j,u.dtype);if(0!==s.util.sizeFromShape(c.shape)){const e=t.dataIdMap.get(_.dataId).id;r(l,w,e)}if(h&&t.disposeData(f.dataId),d){const e=s.backend_util.expandShapeToKeepDim(_.shape,m);_.shape=e}return _}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Any.js": -/*!************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Any.js ***! - \************************************************************************/ -/*! exports provided: anyConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"anyConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./kernel_utils */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/kernel_utils.js"); +const i="return sqrt(x);",a=Object(o.unaryKernelFunc)({opSnippet:i,packedOpSnippet:i,cpuKernelImpl:r.sqrtImplCPU}),u={kernelName:s.Sqrt,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Square.js": +/*!*********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Square.js ***! + \*********************************************************************/ +/*! exports provided: square, squareConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"square",(function(){return r})),n.d(t,"squareConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); /** * @license - * Copyright 2021 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -4225,14 +4211,14 @@ let r;const i={kernelName:s.All,backendName:"wasm",setupFunc:function(e){r=e.was * limitations under the License. * ============================================================================= */ -let r;const i={kernelName:s.Any,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.Any,null,["number, number, number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:i}=e,{axis:a,keepDims:d}=i,{x:u}=n;let l=t.dataIdMap.get(u.dataId).id,c=u;const{transposed:f,axes:p,originalAxes:m,inputWasTransposed:h}=Object(o.permuteAxesAndTranspose)(u,a,t);if(h){c=f,l=t.dataIdMap.get(f.dataId).id}const b=c.shape.length;s.backend_util.assertAxesAreInnerMostDims("any",p,b);const[j,g]=s.backend_util.computeOutAndReduceShapes(c.shape,p),w=s.util.sizeFromShape(g),_=t.makeOutput(j,u.dtype);if(0!==s.util.sizeFromShape(c.shape)){const e=t.dataIdMap.get(_.dataId).id;r(l,w,e)}if(h&&t.disposeData(f.dataId),d){const e=s.backend_util.expandShapeToKeepDim(_.shape,m);_.shape=e}return _}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ArgMax.js": -/*!***************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ArgMax.js ***! - \***************************************************************************/ -/*! exports provided: argMaxConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"argMaxConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./kernel_utils */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/kernel_utils.js"),r=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); +const r=Object(o.unaryKernelFunc)({opSnippet:"return x * x;"}),i={kernelName:s.Square,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SquaredDifference.js": +/*!********************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SquaredDifference.js ***! + \********************************************************************************/ +/*! exports provided: squaredDifference, squaredDifferenceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"squaredDifference",(function(){return i})),n.d(t,"squaredDifferenceConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -4246,14 +4232,14 @@ let r;const i={kernelName:s.Any,backendName:"wasm",setupFunc:function(e){r=e.was * limitations under the License. * ============================================================================= */ -let i;const a={kernelName:s.ArgMax,backendName:"wasm",kernelFunc:function(e){const{backend:t,inputs:n,attrs:a}=e,{axis:d}=a,{x:u}=n,l=t.dataIdMap.get(u.dataId).id;let c=l,f=u;const{transposed:p,axes:m,inputWasTransposed:h}=Object(o.permuteAxesAndTranspose)(u,d,t);if(h){const e=t.dataIdMap.get(p.dataId).id;e!==l&&(f=p,c=e)}const b=f.shape.slice(0,-1),j=t.makeOutput(b,"int32"),g=t.dataIdMap.get(j.dataId).id,w=s.util.sizeFromShape(j.shape),_=f.shape[m[0]];return i(c,r.CppDType[f.dtype],w,_,g),h&&t.disposeData(p.dataId),j},setupFunc:function(e){i=e.wasm.cwrap(s.ArgMax,null,["number","number","number","number","number"])}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/AvgPool.js": -/*!****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/AvgPool.js ***! - \****************************************************************************/ -/*! exports provided: avgPoolConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"avgPoolConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +const r="return (a - b) * (a - b);",i=Object(o.binaryKernelFunc)({opSnippet:r,packedOpSnippet:r}),a={kernelName:s.SquaredDifference,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Step.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Step.js ***! + \*******************************************************************/ +/*! exports provided: step, stepConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"step",(function(){return r})),n.d(t,"stepConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../unaryop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -4266,14 +4252,15 @@ let i;const a={kernelName:s.ArgMax,backendName:"wasm",kernelFunc:function(e){con * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */let o;const r={kernelName:s.AvgPool,backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.AvgPool,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:t,attrs:n,backend:r}=e,i=t.x,a=r.dataIdMap.get(i.dataId).id,{filterSize:d,strides:u,pad:l,dimRoundingMode:c}=n,f=s.backend_util.computePool2DInfo(i.shape,d,u,1,l,c),p=f.filterHeight,m=f.filterWidth,h=f.padInfo.top,b=f.padInfo.right,j=f.padInfo.bottom,g=f.padInfo.left,w=f.strideHeight,_=f.strideWidth,k=f.inChannels;if("channelsLast"!==f.dataFormat)throw new Error(`wasm backend does not support dataFormat:'${f.dataFormat}'. Please use 'channelsLast'.`);if(1!==f.dilationWidth||1!==f.dilationHeight)throw new Error(`was backend only supports average pooling with dilation = [1, 1], got [${f.dilationHeight}, ${f.dilationWidth}].`);const v=r.makeOutput(f.outShape,"float32"),x=r.dataIdMap.get(v.dataId).id;return o(a,i.shape[0],i.shape[1],i.shape[2],p,m,h,b,j,g,w,_,k,x),v}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/BatchMatMul.js": -/*!********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/BatchMatMul.js ***! - \********************************************************************************/ -/*! exports provided: batchMatMulConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"batchMatMulConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Reshape.js"); + */ +function r({inputs:e,attrs:t,backend:n}){const{x:s}=e,r=o.CHECK_NAN_SNIPPET+`\n return x > 0.0 ? 1.0 : float(${t.alpha});\n `,i=new o.UnaryOpProgram(s.shape,r);return n.runWebGLProgram(i,[s],s.dtype)}const i={kernelName:s.Step,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/StridedSlice.js": +/*!***************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/StridedSlice.js ***! + \***************************************************************************/ +/*! exports provided: stridedSlice, stridedSliceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"stridedSlice",(function(){return u})),n.d(t,"stridedSliceConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"),r=n(/*! ../strided_slice_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/strided_slice_gpu.js"),i=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),a=n(/*! ./Slice */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Slice.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -4287,11 +4274,11 @@ let i;const a={kernelName:s.ArgMax,backendName:"wasm",kernelFunc:function(e){con * limitations under the License. * ============================================================================= */ -let r;const i={kernelName:s.BatchMatMul,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.BatchMatMul,null,["number","array","number","number","array","number","number","number","number"])},kernelFunc:function(e){const{inputs:t,backend:n,attrs:i}=e,{a:a,b:d}=t,{transposeA:u,transposeB:l}=i;if("float32"!==a.dtype||"float32"!==d.dtype)throw new Error("BatchMatMul for non non-float32 tensors not yet supported.");const c=a.shape.length,f=d.shape.length,p=u?a.shape[c-2]:a.shape[c-1],m=l?d.shape[f-1]:d.shape[f-2],h=u?a.shape[c-1]:a.shape[c-2],b=l?d.shape[f-2]:d.shape[f-1],j=a.shape.slice(0,-2),g=d.shape.slice(0,-2),w=s.util.sizeFromShape(j),_=s.util.sizeFromShape(g),k=w===_||1===w||1===_;s.util.assert(c>=2&&f>=2&&k,(()=>`Error in matMul: the input batch dimensions must either be the same or at least one input batch dimension must be 1. Got input batch dimensions of (${j}) and (${g}).`));const v=(w>_?a.shape.slice(0,-2):d.shape.slice(0,-2)).concat([h,b]);s.util.assert(p===m,(()=>`Error in matMul: inner shapes (${p}) and (${m}) of Tensors with shapes ${a.shape} and ${d.shape} and transposeA=${u} and transposeB=${l} must match.`));const x=u?[w,p,h]:[w,h,p],y=l?[_,b,m]:[_,m,b],O=Object(o.reshape)({inputs:{x:a},backend:n,attrs:{shape:x}}),I=Object(o.reshape)({inputs:{x:d},backend:n,attrs:{shape:y}}),C=n.dataIdMap.get(O.dataId).id,S=n.dataIdMap.get(I.dataId).id,T=u?O.shape[2]:O.shape[1],N=l?I.shape[1]:I.shape[2],E=Math.max(w,_),A=n.makeOutput([E,T,N],O.dtype),R=n.dataIdMap.get(A.dataId).id,F=new Uint8Array(new Int32Array(O.shape).buffer),$=new Uint8Array(new Int32Array(I.shape).buffer);return r(C,F,O.shape.length,S,$,I.shape.length,u,l,R),n.disposeData(O.dataId),n.disposeData(I.dataId),A.shape=v,A}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/BatchToSpaceND.js": -/*!***********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/BatchToSpaceND.js ***! - \***********************************************************************************/ -/*! exports provided: batchToSpaceNDConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"batchToSpaceNDConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Reshape.js"),r=n(/*! ./Slice */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Slice.js"),i=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Transpose.js");const a={kernelName:s.BatchToSpaceND,backendName:"wasm",kernelFunc: +function u(e){const{inputs:t,backend:n,attrs:u}=e,{x:d}=t,{begin:l,end:c,strides:f,beginMask:p,endMask:m,ellipsisMask:h,newAxisMask:b,shrinkAxisMask:j}=u,{nonStrided:g,$begin:w,$strides:_,size:k,newShape:v,outShape:x}=s.slice_util.sliceInfo(d.shape,l,c,f,p,m,h,b,j),y=Object(i.reshape)({inputs:{x:d},backend:n,attrs:{shape:v}});let O;if(g){const e=Object(a.slice)({inputs:{x:y},backend:n,attrs:{begin:w,size:k}});O=Object(i.reshape)({inputs:{x:e},backend:n,attrs:{shape:x}}),n.disposeIntermediateTensorInfo(e)}else if(x.some((e=>0===e)))O=n.makeTensorInfo(x,d.dtype,[]);else{if(n.shouldExecuteOnCPU([y])){const e=n.texData.get(y.dataId).values,t=Object(s.buffer)(y.shape,y.dtype,e),r=Object(o.stridedSliceImplCPU)(x,t,_,w);O=n.makeTensorInfo(x,y.dtype,r.values)}else{const e=new r.StridedSliceProgram(w,_,x);O=n.runWebGLProgram(e,[y],y.dtype)}}const I=Object(i.reshape)({inputs:{x:O},backend:n,attrs:{shape:x}});return n.disposeIntermediateTensorInfo(y),n.disposeIntermediateTensorInfo(O),I}const d={kernelName:s.StridedSlice,backendName:"webgl",kernelFunc:u}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/StringNGrams.js": +/*!***************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/StringNGrams.js ***! + \***************************************************************************/ +/*! exports provided: stringNGrams, stringNGramsConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"stringNGrams",(function(){return r})),n.d(t,"stringNGramsConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); /** * @license * Copyright 2021 Google LLC. All Rights Reserved. @@ -4308,14 +4295,14 @@ let r;const i={kernelName:s.BatchMatMul,backendName:"wasm",setupFunc:function(e) * limitations under the License. * ============================================================================= */ -function(e){const{inputs:t,backend:n,attrs:a}=e,{x:d}=t,{blockShape:u,crops:l}=a,c=u.reduce(((e,t)=>e*t)),f=s.backend_util.getReshaped(d.shape,u,c),p=s.backend_util.getPermuted(f.length,u.length),m=s.backend_util.getReshapedPermuted(d.shape,u,c),h=s.backend_util.getSliceBeginCoords(l,u.length),b=s.backend_util.getSliceSize(m,l,u.length),j=Object(o.reshape)({inputs:{x:d},backend:n,attrs:{shape:f}}),g=Object(i.transpose)({inputs:{x:j},backend:n,attrs:{perm:p}}),w=Object(o.reshape)({inputs:{x:g},backend:n,attrs:{shape:m}}),_=Object(r.slice)({inputs:{x:w},backend:n,attrs:{begin:h,size:b}});return n.disposeData(j.dataId),n.disposeData(g.dataId),n.disposeData(j.dataId),_}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Cast.js": -/*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Cast.js ***! - \*************************************************************************/ -/*! exports provided: cast, castConfig */function(e,t,n){"use strict"; +function r(e){const{inputs:t,backend:n,attrs:s}=e,{separator:r,nGramWidths:i,leftPad:a,rightPad:u,padWidth:d,preserveShortSequences:l}=s,{data:c,dataSplits:f}=t,p=n.readSync(c.dataId),m=n.readSync(f.dataId),[h,b]=Object(o.stringNGramsImplCPU)(p,m,r,i,a,u,d,l);return[n.makeTensorInfo([h.length],"string",h),n.makeTensorInfo(f.shape,"int32",b)]}const i={kernelName:s.StringNGrams,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/StringSplit.js": +/*!**************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/StringSplit.js ***! + \**************************************************************************/ +/*! exports provided: stringSplit, stringSplitConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"stringSplit",(function(){return r})),n.d(t,"stringSplitConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2021 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -4329,11 +4316,11 @@ function(e){const{inputs:t,backend:n,attrs:a}=e,{x:d}=t,{blockShape:u,crops:l}=a * limitations under the License. * ============================================================================= */ -function s(e){const{inputs:{x:t},attrs:{dtype:n},backend:s}=e,o=s.makeOutput(t.shape,n),r=s.typedArrayFromHeap(t);return s.typedArrayFromHeap(o).set(r),o}n.r(t),n.d(t,"cast",(function(){return s})),n.d(t,"castConfig",(function(){return o}));const o={kernelName:n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js").Cast,backendName:"wasm",kernelFunc:s}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Ceil.js": -/*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Ceil.js ***! - \*************************************************************************/ -/*! exports provided: ceilConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"ceilConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); +function r(e){const{inputs:t,backend:n,attrs:s}=e,{skipEmpty:r}=s,{input:i,delimiter:a}=t;if("string"!==i.dtype)throw new Error("Input must be of datatype string");if(1!==i.shape.length)throw new Error(`Input must be a vector, got shape: ${i.shape}`);if(0!==a.shape.length)throw new Error(`Delimiter must be a scalar, got shape: ${a.shape}`);const u=n.readSync(i.dataId),d=n.readSync(a.dataId)[0],[l,c,f]=Object(o.stringSplitImplCPU)(u,d,r),p=c.length;return[n.makeTensorInfo([p,2],"int32",l),n.makeTensorInfo([p],"string",c),n.makeTensorInfo([2],"int32",new Int32Array(f))]}const i={kernelName:s.StringSplit,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/StringToHashBucketFast.js": +/*!*************************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/StringToHashBucketFast.js ***! + \*************************************************************************************/ +/*! exports provided: stringToHashBucketFast, stringToHashBucketFastConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"stringToHashBucketFast",(function(){return r})),n.d(t,"stringToHashBucketFastConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); /** * @license * Copyright 2021 Google LLC. All Rights Reserved. @@ -4350,14 +4337,14 @@ function s(e){const{inputs:{x:t},attrs:{dtype:n},backend:s}=e,o=s.makeOutput(t.s * limitations under the License. * ============================================================================= */ -const r=Object(o.createUnaryKernelConfig)(s.Ceil)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ClipByValue.js": -/*!********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ClipByValue.js ***! - \********************************************************************************/ -/*! exports provided: clipByValueConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"clipByValueConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +function r(e){const{inputs:t,backend:n,attrs:s}=e,{numBuckets:r}=s,{input:i}=t;if("string"!==i.dtype)throw new Error("Input must be of datatype string");if(r<=0)throw new Error("Number of buckets must be at least 1");const a=n.readSync(i.dataId),u=Object(o.stringToHashBucketFastImplCPU)(a,r);return n.makeTensorInfo(i.shape,"int32",u)}const i={kernelName:s.StringToHashBucketFast,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sub.js": +/*!******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sub.js ***! + \******************************************************************/ +/*! exports provided: sub, subConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sub",(function(){return a})),n.d(t,"subConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -4370,14 +4357,15 @@ const r=Object(o.createUnaryKernelConfig)(s.Ceil)},"./node_modules/@tensorflow/t * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */let o;const r={kernelName:s.ClipByValue,backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.ClipByValue,null,["number","number","number","number"])},kernelFunc:function(e){const{inputs:t,backend:n,attrs:s}=e,{x:r}=t,{clipValueMin:i,clipValueMax:a}=s,d=n.dataIdMap.get(r.dataId).id,u=n.makeOutput(r.shape,r.dtype),l=n.dataIdMap.get(u.dataId).id;return o(d,i,a,l),u}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Concat.js": -/*!***************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Concat.js ***! - \***************************************************************************/ -/*! exports provided: concat, concatConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"concat",(function(){return a})),n.d(t,"concatConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernel_utils/shared.js"),r=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Identity.js"),i=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Reshape.js"); + */ +const i="return a - b;",a=Object(o.binaryKernelFunc)({opSnippet:i,packedOpSnippet:i,supportsComplex:!0,cpuKernelImpl:r.subImplCPU}),u={kernelName:s.Sub,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sum.js": +/*!******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sum.js ***! + \******************************************************************/ +/*! exports provided: sum, sumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sum",(function(){return r})),n.d(t,"sumConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Sum_impl */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sum_impl.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -4391,14 +4379,14 @@ const r=Object(o.createUnaryKernelConfig)(s.Ceil)},"./node_modules/@tensorflow/t * limitations under the License. * ============================================================================= */ -function a(e){const{inputs:t,backend:n}=e,a=s.util.parseAxisParam(e.attrs.axis,t[0].shape)[0];let d=s.backend_util.computeOutShape(t.map((e=>e.shape)),a);const u=t.filter((e=>s.util.sizeFromShape(e.shape)>0));if(1===u.length)return Object(r.identity)({inputs:{x:u[0]},backend:n});const l=n.makeOutput(d,t[0].dtype);if(0===s.util.sizeFromShape(d))return l;const c=u.map((e=>e.shape));if(s.backend_util.assertParamsConsistent(c,a),"string"===u[0].dtype){const e=u.map((e=>{const t=[-1,s.util.sizeFromShape(e.shape.slice(a))];return Object(i.reshape)({inputs:{x:e},backend:n,attrs:{shape:t}})})),r=e.map((e=>({vals:n.readSync(e.dataId),shape:e.shape})));d=s.backend_util.computeOutShape(e.map((e=>e.shape)),1);const c=1===e[0].shape[0],f=Object(o.concatImplCPU)(r,d,t[0].dtype,c),p=s.backend_util.computeOutShape(u.map((e=>e.shape)),a);l.shape=p;return n.dataIdMap.get(l.dataId).stringBytes=s.backend_util.fromStringArrayToUint8(f),e.forEach((e=>n.disposeData(e.dataId))),l}const f=s.util.sizeFromShape(u[0].shape.slice(0,a));let p=0;const m=u.map((e=>{const t=s.util.sizeFromShape(e.shape.slice(a));return p+=t,t})),h=u.map((e=>n.typedArrayFromHeap(e))),b=n.typedArrayFromHeap(l);for(let e=0;e5){const e=n.readSync(a.dataId),t="string"===a.dtype?e.map((e=>s.util.decodeString(e))):e,r=Object(s.buffer)(a.shape,a.dtype,t),i=Object(o.tileImplCPU)(r,u);return n.makeTensorInfo(i.shape,i.dtype,i.values)}const d=new r.TileProgram(a.shape,u);return n.runWebGLProgram(d,[a],a.dtype)}const a={kernelName:s.Tile,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/TopK.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/TopK.js ***! + \*******************************************************************/ +/*! exports provided: topK, topKConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"topK",(function(){return f})),n.d(t,"topKConfig",(function(){return p}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"),r=n(/*! ../top_k_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/top_k_gpu.js"),i=n(/*! ./Fill */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Fill.js"),a=n(/*! ./GatherV2 */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/GatherV2.js"),u=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),d=n(/*! ./Slice */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Slice.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -4498,14 +4484,14 @@ const r=Object(o.createUnaryKernelConfig)(s.Cosh)},"./node_modules/@tensorflow/t * limitations under the License. * ============================================================================= */ -let i;function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:d}=t,{axis:u,exclusive:l,reverse:c}=a,f=d.shape.length;s.util.assert("float32"===d.dtype||"int32"===d.dtype,(()=>`cumsum does not support ${d.dtype} tensors in the WASM backend`));const p=s.backend_util.getAxesPermutation([u],f);let m=d;null!==p&&(m=Object(r.transpose)({inputs:{x:d},attrs:{perm:p},backend:n}));const h=s.backend_util.getInnerMostAxes(1,f)[0];s.backend_util.assertAxesAreInnerMostDims("cumsum",[h],f);const b=n.makeOutput(m.shape,m.dtype),j=m.shape[h],g=n.dataIdMap.get(m.dataId).id,w=n.dataIdMap.get(b.dataId).id;i(g,l?1:0,c?1:0,j,w,o.CppDType[d.dtype]);let _=b;if(null!==p){const e=s.backend_util.getUndoAxesPermutation(p);_=Object(r.transpose)({inputs:{x:b},attrs:{perm:e},backend:n}),n.disposeData(m.dataId),n.disposeData(b.dataId)}return _}const d={kernelName:s.Cumsum,backendName:"wasm",setupFunc:function(e){i=e.wasm.cwrap(s.Cumsum,null,["number","number","number","number","number","number"])},kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/DepthToSpace.js": -/*!*********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/DepthToSpace.js ***! - \*********************************************************************************/ -/*! exports provided: depthToSpace, depthToSpaceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"depthToSpace",(function(){return r})),n.d(t,"depthToSpaceConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +function l(e,t){null!==t&&e.disposeIntermediateTensorInfo(t)}function c(e){let t=1;for(;tj){const e=n.readSync(p.dataId),[t,s]=Object(o.topKImplCPU)(e,g,p.dtype,m,h);return[n.makeTensorInfo(t.shape,t.dtype,t.values),n.makeTensorInfo(s.shape,s.dtype,s.values)]}if(0===m)return g[g.length-1]=0,[n.makeTensorInfo(g,p.dtype,[]),n.makeTensorInfo(g,"int32",[])];if(1===w)return[p,Object(i.fill)({attrs:{shape:g,dtype:"int32",value:0},backend:n})];const _=n.texData.get(p.dataId),k=null!==_&&_.isPacked,v=k?n.unpackTensor(p):p,x=s.util.sizeFromShape(g)/w,y=Object(u.reshape)({inputs:{x:v},attrs:{shape:[x,w]},backend:n});k&&l(n,v);const O=c(m),I=c(w);let C=null;const S=()=>null===C?[y,y]:[y,C],T=(e,t,s)=>{const o=S(),i=new r.SwapProgram(s),a=[[w],[null===C?1:0],[Number.NEGATIVE_INFINITY],[e],[t]],u=C;C=n.runWebGLProgram(i,o,"int32",a),l(n,u)};for(let e=1;e=1;n/=2)T(t,n,[x,I])}for(let e=I;e>O;e/=2){const t=S(),s=new r.MergeProgram([x,e/2]),o=[[w],[null===C?1:0],[O]],i=C;C=n.runWebGLProgram(s,t,"int32",o),l(n,i);const a=O/2,u=2*a;for(let e=a;e>=1;e/=2)T(u,e,C.shape)}let N=C;C=Object(d.slice)({inputs:{x:C},backend:n,attrs:{begin:0,size:[x,m]}}),l(n,N);let E=Object(a.gatherV2)({inputs:{x:y,indices:C},backend:n,attrs:{axis:1,batchDims:1}});l(n,y);const A=g.slice(0,-1);A.push(m),N=C,C=Object(u.reshape)({inputs:{x:C},attrs:{shape:A},backend:n}),l(n,N);const R=E;return E=Object(u.reshape)({inputs:{x:E},attrs:{shape:A},backend:n}),l(n,R),[E,C]}const p={kernelName:s.TopK,backendName:"webgl",kernelFunc:f}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Transform.js": +/*!************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Transform.js ***! + \************************************************************************/ +/*! exports provided: transform, transformConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"transform",(function(){return r})),n.d(t,"transformConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../transform_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/transform_gpu.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2021 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -4518,14 +4504,15 @@ let i;function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:d}=t,{axis:u,exclusiv * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */let o;function r(e){const{backend:t,inputs:n,attrs:r}=e,{x:i}=n,{blockSize:a,dataFormat:d}=r;s.util.assert(a>1,(()=>`blockSize should be > 1 for depthToSpace, but was: ${a}`));const u=i.shape[0],l="NHWC"===d?i.shape[1]:i.shape[2],c="NHWC"===d?i.shape[2]:i.shape[3],f="NHWC"===d?i.shape[3]:i.shape[1],p=l*a,m=c*a,h=f/(a*a),b="NHWC"===d?[u,p,m,h]:[u,h,p,m],j=t.makeOutput(b,"float32"),g=t.dataIdMap.get(i.dataId).id,w=new Uint8Array(new Int32Array(s.util.computeStrides(i.shape)).buffer),_=new Uint8Array(new Int32Array(b).buffer),k=new Uint8Array(new Int32Array(s.util.computeStrides(b)).buffer),v=t.dataIdMap.get(j.dataId).id;return o(g,a,"NHWC"===d?1:0,w,i.shape.length-1,_,k,b.length,v),j}const i={kernelName:s.DepthToSpace,backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.DepthToSpace,null,["number","number","number","array","number","array","array","number","number"])},kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/DepthwiseConv2dNative.js": -/*!******************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/DepthwiseConv2dNative.js ***! - \******************************************************************************************/ -/*! exports provided: depthwiseConv2dNativeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"depthwiseConv2dNativeConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); + */ +function r(e){const{inputs:t,backend:n,attrs:s}=e,{image:r,transforms:i}=t,{interpolation:a,fillMode:u,fillValue:d,outputShape:l}=s,[c,f,p,m]=r.shape,[h,b]=null!=l?l:[f,p],j=[c,h,b,m],g=new o.TransformProgram(f,p,a,u,d,j);return n.runWebGLProgram(g,[r,i],"float32")}const i={kernelName:s.Transform,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js": +/*!************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js ***! + \************************************************************************/ +/*! exports provided: transpose, transposeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"transpose",(function(){return r})),n.d(t,"transposeConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Transpose_impl */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose_impl.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -4538,11 +4525,12 @@ let i;function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:d}=t,{axis:u,exclusiv * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */let o;const r={kernelName:s.DepthwiseConv2dNative,backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.DepthwiseConv2dNative,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:t,attrs:n,backend:r}=e,{x:i,filter:a}=t,d=r.dataIdMap.get(i.dataId).id,u=r.dataIdMap.get(a.dataId).id,{strides:l,dilations:c,pad:f,dimRoundingMode:p}=n,m=null==c?[1,1]:c,h=s.backend_util.computeConv2DInfo(i.shape,a.shape,l,m,f,p,!0),b=h.filterHeight,j=h.filterWidth,g=h.padInfo.top,w=h.padInfo.right,_=h.padInfo.bottom,k=h.padInfo.left,v=h.dilationHeight,x=h.dilationWidth,y=h.strideHeight,O=h.strideWidth,I=h.inChannels,C=h.outChannels,S="SAME"===h.padInfo.type?1:0;if("channelsLast"!==h.dataFormat)throw new Error(`wasm backend DepthwiseConv2dNative does not support dataFormat:'${h.dataFormat}'. Please use 'channelsLast'.`);const T=r.makeOutput(h.outShape,"float32"),N=r.dataIdMap.get(T.dataId).id;return o(d,i.shape[0],i.shape[1],i.shape[2],u,b,j,g,w,_,k,S,v,x,y,O,I,C,N),T}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Equal.js": -/*!**************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Equal.js ***! - \**************************************************************************/ -/*! exports provided: equalConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"equalConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); + */ +function r(e){const{inputs:t,backend:n,attrs:s}=e,{x:r}=t,{perm:i}=s,a=n,u=r.shape.length,d=new Array(u);for(let e=0;e`Axis must be in the interval [${-(d+1)}, ${d}]`)),l=d+a+1),u.splice(l,0,1),Object(o.reshape)({inputs:{x:i},backend:r,attrs:{shape:u}})}const i={kernelName:s.ExpandDims,backendName:"wasm",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Fill.js": -/*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Fill.js ***! - \*************************************************************************/ -/*! exports provided: fillConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fillConfig",(function(){return s}));const s={kernelName:n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js").Fill,backendName:"wasm",kernelFunc: +function i(e){const{inputs:t,backend:n,attrs:s}=e,{value:i}=t;let{axis:a}=s;a<0&&(a+=i.shape.length);const u=i,d=u.shape.length,l=i.shape[a],c=new Array(d-1);let f=0;for(let e=0;en.disposeIntermediateTensorInfo(e))),b}const a={kernelName:s.Unpack,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/UnsortedSegmentSum.js": +/*!*********************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/UnsortedSegmentSum.js ***! + \*********************************************************************************/ +/*! exports provided: unsortedSegmentSum, unsortedSegmentSumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"unsortedSegmentSum",(function(){return d})),n.d(t,"unsortedSegmentSumConfig",(function(){return l}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../segment_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/segment_gpu.js"),r=n(/*! ./Range */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Range.js"),i=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),a=n(/*! ./Tile */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Tile.js"),u=n(/*! ./Transpose */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -4622,14 +4610,14 @@ function r(e){const{inputs:t,attrs:n,backend:r}=e,{input:i}=t,{dim:a}=n,d=i.shap * limitations under the License. * ============================================================================= */ -function(e){const{attrs:{shape:t,value:n,dtype:s},backend:o}=e,r=o.makeOutput(t,s);return o.typedArrayFromHeap(r).fill(n),r}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FlipLeftRight.js": -/*!**********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FlipLeftRight.js ***! - \**********************************************************************************/ -/*! exports provided: flipLeftRight, flipLeftRightConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"flipLeftRight",(function(){return r})),n.d(t,"flipLeftRightConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +function d(e){const{inputs:t,backend:n,attrs:d}=e,{x:l,segmentIds:c}=t,{numSegments:f}=d,p=l.shape.length,m=[];let h=0;const b=s.backend_util.getAxesPermutation([h],p);let j=l;null!=b&&(j=Object(u.transpose)({inputs:{x:l},backend:n,attrs:{perm:b}}),m.push(j),h=s.backend_util.getInnerMostAxes(1,p)[0]);const g=s.backend_util.segment_util.computeOutShape(j.shape,h,f),w=s.util.sizeFromShape([j.shape[h]]),_=Object(i.reshape)({inputs:{x:j},backend:n,attrs:{shape:[-1,w]}});m.push(_);const k=Object(s.sumOutType)(l.dtype),v=(e,t,i,u,d)=>{const l=e.shape[0],c=e.shape[1],f=s.backend_util.segment_util.segOpComputeOptimalWindowSize(c,d),p={windowSize:f,inSize:c,batchSize:l,numSegments:d},h=new o.SegmentOpProgram(p,t),b=n.compileAndRun(h,[e,i],u);if(m.push(b),b.shape[1]===d)return b;const j=Object(r.range)({backend:n,attrs:{start:0,stop:d,step:1,dtype:"float32"}}),g=Object(a.tile)({inputs:{x:j},backend:n,attrs:{reps:[c/f]}});m.push(j),m.push(g);return v(b,t,g,u,d)},x=v(_,"unsortedSegmentSum",c,k,f),y=Object(i.reshape)({inputs:{x:x},backend:n,attrs:{shape:g}});let O=y;if(null!=b){m.push(y);const e=s.backend_util.getUndoAxesPermutation(b);O=Object(u.transpose)({inputs:{x:O},backend:n,attrs:{perm:e}})}return m.forEach((e=>n.disposeIntermediateTensorInfo(e))),O}const l={kernelName:s.UnsortedSegmentSum,backendName:"webgl",kernelFunc:d}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ZerosLike.js": +/*!************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ZerosLike.js ***! + \************************************************************************/ +/*! exports provided: zerosLike, zerosLikeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"zerosLike",(function(){return u})),n.d(t,"zerosLikeConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Complex */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js"),r=n(/*! ./Fill */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Fill.js"),i=n(/*! ./Imag */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Imag.js"),a=n(/*! ./Real */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Real.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -4642,35 +4630,36 @@ function(e){const{attrs:{shape:t,value:n,dtype:s},backend:o}=e,r=o.makeOutput(t, * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */let o;function r(e){const{inputs:t,backend:n}=e,{image:s}=t,r=n.makeOutput(s.shape,s.dtype),i=n.dataIdMap.get(s.dataId).id,a=n.dataIdMap.get(r.dataId).id,[d,u,l,c]=s.shape;return o(i,d,u,l,c,a),r}const i={kernelName:s.FlipLeftRight,backendName:"wasm",kernelFunc:r,setupFunc:function(e){o=e.wasm.cwrap(s.FlipLeftRight,null,["number","number","number","number","number","number"])}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Floor.js": -/*!**************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Floor.js ***! - \**************************************************************************/ -/*! exports provided: floorConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"floorConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); + */ +function u(e){const{inputs:t,backend:n}=e,{x:s}=t;if("complex64"===s.dtype){const e=Object(a.real)({inputs:{input:s},backend:n}),t=u({inputs:{x:e},backend:n}),r=Object(i.imag)({inputs:{input:s},backend:n}),d=u({inputs:{x:r},backend:n}),l=Object(o.complex)({inputs:{real:t,imag:d},backend:n});return n.disposeIntermediateTensorInfo(e),n.disposeIntermediateTensorInfo(t),n.disposeIntermediateTensorInfo(r),n.disposeIntermediateTensorInfo(d),l}return Object(r.fill)({attrs:{shape:s.shape,dtype:s.dtype,value:"string"===s.dtype?"":0},backend:n})}const d={kernelName:s.ZerosLike,backendName:"webgl",kernelFunc:u}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/_FusedMatMul.js": +/*!***************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/_FusedMatMul.js ***! + \***************************************************************************/ +/*! exports provided: _fusedMatMul, _fusedMatMulConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"_fusedMatMul",(function(){return r})),n.d(t,"_fusedMatMulConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./BatchMatMul_impl */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchMatMul_impl.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the "License"); + * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, + * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -const r=Object(o.createUnaryKernelConfig)(s.Floor)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FloorDiv.js": -/*!*****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FloorDiv.js ***! - \*****************************************************************************/ -/*! exports provided: floorDivConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"floorDivConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); +function r(e){const{inputs:t,backend:n,attrs:s}=e,{a:r,b:i,bias:a,preluActivationWeights:u}=t,{transposeA:d,transposeB:l,activation:c,leakyreluAlpha:f}=s;return Object(o.batchMatMulImpl)({a:r,b:i,transposeA:d,transposeB:l,backend:n,bias:a,preluActivationWeights:u,leakyreluAlpha:f,activation:c})}const i={kernelName:s._FusedMatMul,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/lrn_gpu.js": +/*!**************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/lrn_gpu.js ***! + \**************************************************************/ +/*! exports provided: LRNProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"LRNProgram",(function(){return s})); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2017 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -4684,14 +4673,14 @@ const r=Object(o.createUnaryKernelConfig)(s.Floor)},"./node_modules/@tensorflow/ * limitations under the License. * ============================================================================= */ -const r=Object(o.createBinaryKernelConfig)(s.FloorDiv,!1)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FusedBatchNorm.js": -/*!***********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FusedBatchNorm.js ***! - \***********************************************************************************/ -/*! exports provided: fusedBatchNormConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fusedBatchNormConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +class s{constructor(e,t,n,s,o){this.variableNames=["x"],this.outputShape=[];const r=t,i=e[3]-1;let a;this.outputShape=e;const u=`float(${n}) + float(${s}) * sum`;a=.5===o?`inversesqrt(${u})`:1===o?`1.0/(${u})`:`exp(log(${u}) * float(-${o}));`,this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int r = coords[1];\n int c = coords[2];\n int d = coords[3];\n float x = getX(b, r, c, d);\n float sum = 0.0;\n for (int j = -${r}; j <= ${r}; j++) {\n int idx = d + j;\n if (idx >= 0 && idx <= ${i}) {\n float z = getX(b, r, c, idx);\n sum += z * z;\n }\n }\n float val = x * ${a};\n setOutput(val);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/lrn_grad_gpu.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/lrn_grad_gpu.js ***! + \*******************************************************************/ +/*! exports provided: LRNGradProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"LRNGradProgram",(function(){return s})); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -4704,11 +4693,12 @@ const r=Object(o.createBinaryKernelConfig)(s.FloorDiv,!1)},"./node_modules/@tens * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */let o;const r={kernelName:s.FusedBatchNorm,backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.FusedBatchNorm,null,["number","number","number","number","number","number","number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:r}=e,{varianceEpsilon:i}=r,{x:a,mean:d,variance:u,offset:l,scale:c}=n,f=t.dataIdMap.get(a.dataId).id,p=t.dataIdMap.get(d.dataId).id,m=t.dataIdMap.get(u.dataId).id,h=null!=l?t.dataIdMap.get(l.dataId).id:0,b=null!=c?t.dataIdMap.get(c.dataId).id:0,j=t.makeOutput(a.shape,a.dtype);if(0===s.util.sizeFromShape(a.shape))return j;const g=t.dataIdMap.get(j.dataId).id;return o(f,p,m,h,b,i,g),j}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FusedConv2D.js": -/*!********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FusedConv2D.js ***! - \********************************************************************************/ -/*! exports provided: fusedConv2DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fusedConv2DConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); + */ +class s{constructor(e,t,n,s,o){this.variableNames=["inputImage","outputImage","dy"],this.outputShape=[],this.outputShape=e,this.depth=e[3],this.depthRadius=t,this.bias=n,this.alpha=s,this.beta=o,this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int r = coords[1];\n int c = coords[2];\n\n float result = 0.0;\n for (int d = 0; d < ${this.depth}; ++d) {\n int depthBegin = int(max(0.0, float(d - ${t})));\n int depthEnd = int(min(float(${this.depth}),\n float(d + ${t} + 1)));\n\n const int MIN_DEPTH_BEGIN = 0;\n const int MAX_DEPTH_END = ${this.depth};\n\n float norm = 0.0;\n for (int k = MIN_DEPTH_BEGIN; k < MAX_DEPTH_END; ++k) {\n if (k < depthBegin){\n continue;\n }\n else if (k >= depthBegin && k < depthEnd) {\n norm += getInputImage(b, r, c, k) * getInputImage(b, r, c, k);\n }\n else {\n break;\n }\n }\n\n norm = float(${s}) * norm + float(${n});\n\n for(int k = MIN_DEPTH_BEGIN; k < MAX_DEPTH_END; ++k){\n if (k < depthBegin){\n continue;\n }\n else if (k >= depthBegin && k < depthEnd){\n float dyi = -2.0 * float(${s})\n * float(${o})\n * getInputImage(b ,r ,c, k) * getOutputImage(b, r, c, d)\n / norm;\n if (k == d) {\n dyi += pow(norm, -1.0 * ${o});\n }\n if (k == coords[3]) {\n dyi *= getDy(b, r, c, d);\n result += dyi;\n }\n }\n else {\n break;\n }\n }\n }\n setOutput(result);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/lrn_packed_gpu.js": +/*!*********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/lrn_packed_gpu.js ***! + \*********************************************************************/ +/*! exports provided: LRNPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"LRNPackedProgram",(function(){return s})); /** * @license * Copyright 2019 Google LLC. All Rights Reserved. @@ -4725,14 +4715,14 @@ const r=Object(o.createBinaryKernelConfig)(s.FloorDiv,!1)},"./node_modules/@tens * limitations under the License. * ============================================================================= */ -let r;const i={kernelName:s.FusedConv2D,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.FusedConv2D,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:t,attrs:n,backend:i}=e,{x:a,filter:d,bias:u,preluActivationWeights:l}=t,{strides:c,pad:f,dilations:p,dataFormat:m,dimRoundingMode:h,activation:b,leakyreluAlpha:j}=n,g=s.backend_util.computeConv2DInfo(a.shape,d.shape,c,p,f,h),w=o.FusableActivation[b];if(null==w)throw new Error(`${b} activation not yet supported for FusedConv2D in the wasm backend.`);const _=i.dataIdMap.get(a.dataId).id,k=i.dataIdMap.get(d.dataId).id,v=g.outChannels;let x=0;if(null!=u){const e=i.dataIdMap.get(u.dataId);if(1!==e.shape.length)throw new Error(`FusedConv2D only supports rank-1 bias but got rank ${e.shape.length}.`);if(e.shape[0]!==v)throw new Error(`FusedConv2D bias shape (${e.shape}) does not match the number of output channels (${v})`);x=e.id}const y=g.filterHeight,O=g.filterWidth,I=g.padInfo.top,C=g.padInfo.right,S=g.padInfo.bottom,T=g.padInfo.left,N=g.dilationHeight,E=g.dilationWidth,A=g.strideHeight,R=g.strideWidth,F=g.inChannels,$="SAME"===g.padInfo.type?1:0,M=g.batchSize,D=g.inHeight,P=g.inWidth;if("NHWC"!==m)throw new Error(`wasm backend FusedConv2D does not support dataFormat:'${m}'. Please use 'NHWC'.`);const B=i.makeOutput(g.outShape,"float32"),L=i.dataIdMap.get(B.dataId).id,z=null==l?0:i.dataIdMap.get(l.dataId).id;return r(_,M,D,P,k,y,O,x,I,C,S,T,$,N,E,A,R,F,v,w,z,j||0,L),B}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FusedDepthwiseConv2D.js": -/*!*****************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FusedDepthwiseConv2D.js ***! - \*****************************************************************************************/ -/*! exports provided: fusedDepthwiseConv2DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fusedDepthwiseConv2DConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); +class s{constructor(e,t,n,s,o){this.variableNames=["x"],this.outputShape=[],this.packedInputs=!0,this.packedOutput=!0;const r=t,i=e[3]-1;let a;this.outputShape=e;const u=`float(${n}) + float(${s}) * sum`;a=.5===o?`inversesqrt(${u})`:1===o?`1.0/(${u})`:`exp(log(${u}) * float(-${o}));`,this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords.x;\n int r = coords.y;\n int c = coords.z;\n int d = coords.w;\n\n bool hasNextCol = d < ${this.outputShape[3]};\n bool hasNextRow = c < ${this.outputShape[2]};\n\n vec4 sum = vec4(0.);\n vec4 xFragAtOutputCoords = getX(b, r, c, d);\n\n vec4 xAtOutputCoords = vec4(\n getChannel(xFragAtOutputCoords, vec2(c, d)),\n hasNextCol ?\n getChannel(xFragAtOutputCoords, vec2(c, d + 1)) : 0.0,\n hasNextRow ?\n getChannel(xFragAtOutputCoords , vec2(c + 1, d)) : 0.0,\n (hasNextRow && hasNextCol) ?\n getChannel(xFragAtOutputCoords, vec2(c + 1, d + 1)) : 0.0\n );\n\n int firstChannel = d - ${r};\n vec2 cache = vec2(0.);\n if(firstChannel >= 0){\n vec4 firstChannelFrag = getX(b, r, c, firstChannel);\n cache.x = getChannel(firstChannelFrag, vec2(c, firstChannel));\n if(hasNextRow){\n cache.y = getChannel(firstChannelFrag, vec2(c + 1, firstChannel));\n }\n }\n\n ivec2 depth = ivec2(d, d + 1);\n for (int j = - ${r}; j <= ${r}; j++) {\n ivec2 idx = depth + j;\n bvec2 aboveLowerBound = greaterThanEqual(idx, ivec2(0));\n bvec2 belowUpperBound = lessThanEqual(idx, ivec2(${i}));\n\n bool depthInRange = aboveLowerBound.x && belowUpperBound.x;\n bool depthPlusOneInRange = aboveLowerBound.y && belowUpperBound.y;\n\n if(depthInRange || depthPlusOneInRange){\n vec4 z = vec4(0.);\n vec4 xFragAtCurrentDepth;\n z.xz = cache.xy;\n if(depthPlusOneInRange && hasNextCol){\n xFragAtCurrentDepth = idx.y != d ?\n getX(b, r, c, idx.y) : xFragAtOutputCoords;\n z.y = getChannel(xFragAtCurrentDepth, vec2(c, idx.y));\n if(hasNextRow){\n z.w = getChannel(xFragAtCurrentDepth, vec2(c + 1, idx.y));\n }\n }\n cache.xy = z.yw;\n sum += z * z;\n }\n }\n vec4 result = xAtOutputCoords * ${a};\n setOutput(result);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/max_pool_backprop_gpu.js": +/*!****************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/max_pool_backprop_gpu.js ***! + \****************************************************************************/ +/*! exports provided: MaxPool2DBackpropProgram, MaxPool3DBackpropProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"MaxPool2DBackpropProgram",(function(){return s})),n.d(t,"MaxPool3DBackpropProgram",(function(){return o})); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2017 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -4746,14 +4736,14 @@ let r;const i={kernelName:s.FusedConv2D,backendName:"wasm",setupFunc:function(e) * limitations under the License. * ============================================================================= */ -let r;const i={kernelName:s.FusedDepthwiseConv2D,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.FusedDepthwiseConv2D,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:t,attrs:n,backend:i}=e,{x:a,filter:d,bias:u,preluActivationWeights:l}=t,{strides:c,pad:f,dilations:p,dataFormat:m,dimRoundingMode:h,activation:b,leakyreluAlpha:j}=n,g=s.backend_util.computeConv2DInfo(a.shape,d.shape,c,p,f,h,!0),w=o.FusableActivation[b];if(null==w)throw new Error(`${b} activation not yet supported for FusedDepthwiseConv2D in the wasm backend.`);const _=i.dataIdMap.get(a.dataId).id,k=i.dataIdMap.get(d.dataId).id,v=g.outChannels;let x=0;if(null!=u){const e=i.dataIdMap.get(u.dataId);if(1!==e.shape.length)throw new Error(`FusedDepthwiseConv2D only supports rank-1 bias but got rank ${e.shape.length}.`);if(e.shape[0]!==v)throw new Error(`FusedDepthwiseConv2D bias shape (${e.shape}) does not match the number of output channels (${v})`);x=e.id}const y=g.filterHeight,O=g.filterWidth,I=g.padInfo.top,C=g.padInfo.right,S=g.padInfo.bottom,T=g.padInfo.left,N=g.dilationHeight,E=g.dilationWidth,A=g.strideHeight,R=g.strideWidth,F=g.inChannels,$="SAME"===g.padInfo.type?1:0,M=g.batchSize,D=g.inHeight,P=g.inWidth;if("NHWC"!==m)throw new Error(`wasm backend FusedDepthwiseConv2D does not support dataFormat:'${m}'. Please use 'NHWC'.`);const B=i.makeOutput(g.outShape,"float32"),L=i.dataIdMap.get(B.dataId).id,z=null==l?0:i.dataIdMap.get(l.dataId).id;return r(_,M,D,P,k,y,O,x,I,C,S,T,$,N,E,A,R,F,v,w,z,j||0,L),B}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/GatherNd.js": -/*!*****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/GatherNd.js ***! - \*****************************************************************************/ -/*! exports provided: gatherNdConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"gatherNdConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); +class s{constructor(e){this.variableNames=["dy","maxPos"],this.outputShape=e.inShape;const t=e.strideHeight,n=e.strideWidth,s=e.dilationHeight,o=e.effectiveFilterHeight,r=e.effectiveFilterWidth,i=o-1-e.padInfo.top,a=r-1-e.padInfo.left,u=o*r-1;this.userCode=`\n const ivec2 pads = ivec2(${i}, ${a});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n\n ivec2 dyRCCorner = coords.yz - pads;\n int dyRCorner = dyRCCorner.x;\n int dyCCorner = dyRCCorner.y;\n\n // Convolve dy(?, ?, d) with pos mask(:, :, d) to get dx(xR, xC, d).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < ${o};\n wR += ${s}) {\n float dyR = float(dyRCorner + wR) / ${t}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < ${r}; wC++) {\n float dyC = float(dyCCorner + wC) / ${n}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(b, idyR, idyC, d);\n int maxPosValue = ${u} - int(getMaxPos(b, idyR, idyC, d));\n\n // Get the current value, check it against the value from the\n // position matrix.\n int curPosValue = wR * ${r} + wC;\n float mask = float(maxPosValue == curPosValue ? 1.0 : 0.0);\n\n dotProd += dyValue * mask;\n }\n }\n setOutput(dotProd);\n }\n `}}class o{constructor(e){this.variableNames=["dy","maxPos"],this.outputShape=e.inShape;const t=e.strideDepth,n=e.strideHeight,s=e.strideWidth,o=e.dilationDepth,r=e.dilationHeight,i=e.dilationWidth,a=e.effectiveFilterDepth,u=e.effectiveFilterHeight,d=e.effectiveFilterWidth,l=a-1-e.padInfo.front,c=u-1-e.padInfo.top,f=d-1-e.padInfo.left,p=a*u*d-1;this.userCode=`\n const ivec3 pads = ivec3(${l}, ${c}, ${f});\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int ch = coords.u;\n\n ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads;\n int dyDCorner = dyCorner.x;\n int dyRCorner = dyCorner.y;\n int dyCCorner = dyCorner.z;\n\n // Convolve dy(?, ?, ?, ch) with pos mask(:, :, :, d) to get\n // dx(xD, xR, xC, ch).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n\n for (int wD = 0; wD < ${a};\n wD += ${o}) {\n float dyD = float(dyDCorner + wD) / ${t}.0;\n\n if (dyD < 0.0 || dyD >= ${e.outDepth}.0 || fract(dyD) > 0.0) {\n continue;\n }\n int idyD = int(dyD);\n\n for (int wR = 0; wR < ${u};\n wR += ${r}) {\n float dyR = float(dyRCorner + wR) / ${n}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 ||\n fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < ${d};\n wC += ${i}) {\n float dyC = float(dyCCorner + wC) / ${s}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(batch, idyD, idyR, idyC, ch);\n int maxPosValue = ${p} -\n int(getMaxPos(batch, idyD, idyR, idyC, ch));\n\n // Get the current value, check it against the value from the\n // position matrix.\n int curPosValue =\n wD * ${u} * ${d} +\n wR * ${d} + wC;\n float mask = float(maxPosValue == curPosValue ? 1.0 : 0.0);\n\n dotProd += dyValue * mask;\n }\n }\n }\n setOutput(dotProd);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/mean_gpu.js": +/*!***************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/mean_gpu.js ***! + \***************************************************************/ +/*! exports provided: MeanProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"MeanProgram",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -4766,15 +4756,14 @@ let r;const i={kernelName:s.FusedDepthwiseConv2D,backendName:"wasm",setupFunc:fu * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -let r;const i={kernelName:s.GatherNd,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.GatherNd,null,["number","number","number","number","number","number","array","number"])},kernelFunc:function(e){const{backend:t,inputs:n}=e,{params:i,indices:a}=n,[d,u,l,c]=s.gather_util.prepareAndValidate(i,a),f=t.makeOutput(d,i.dtype);if(0===u)return f;const p=a.shape,m=p[p.length-1],h=t.dataIdMap.get(i.dataId).id,b=t.dataIdMap.get(a.dataId).id,j=new Uint8Array(new Int32Array(c).buffer),g=t.dataIdMap.get(f.dataId).id;return r(h,o.CppDType[i.dtype],b,u,m,l,j,g),f}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/GatherV2.js": -/*!*****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/GatherV2.js ***! - \*****************************************************************************/ -/*! exports provided: gatherV2Config */function(e,t,n){"use strict";n.r(t),n.d(t,"gatherV2Config",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Reshape.js"),r=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); + */class o{constructor(e,t){this.variableNames=["x"];const{windowSize:n,batchSize:o,inSize:r,outSize:i}=e;this.outputShape=[o,i];const a=4*Math.floor(n/4),u=n%4;let d="sumValue += dot(values, ones);";if(null!=t){const e=1/t;d=`sumValue += dot(values * ${s.util.isInt(e)?e.toPrecision(2):e}, ones);`}let l="";r%n>0&&(l=`\n if (inIdx < 0 || inIdx >= ${r}) {\n return 0.0;\n }\n `),this.userCode=`\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float getValue(int batch, int inIdx) {\n ${l}\n return getX(batch, inIdx);\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = outIdx * ${n};\n\n float sumValue = 0.0;\n\n for (int i = 0; i < ${a}; i += 4) {\n int inIdx = inOffset + i;\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n getValue(batch, inIdx + 3)\n );\n\n ${d}\n }\n\n int inIdx = inOffset + ${a};\n if (${1===u}) {\n vec4 values = vec4(getValue(batch, inIdx), 0.0, 0.0, 0.0);\n\n ${d}\n } else if (${2===u}) {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1), 0.0, 0.0);\n\n ${d}\n } else if (${3===u}) {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2), 0.0);\n\n ${d}\n }\n setOutput(sumValue);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/mirror_pad_gpu.js": +/*!*********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/mirror_pad_gpu.js ***! + \*********************************************************************/ +/*! exports provided: MirrorPadProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"MirrorPadProgram",(function(){return o}));var s=n(/*! ./shader_compiler */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -4787,15 +4776,14 @@ let r;const i={kernelName:s.GatherNd,backendName:"wasm",setupFunc:function(e){r= * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -let i;const a={kernelName:s.GatherV2,backendName:"wasm",setupFunc:function(e){i=e.wasm.cwrap("Gather",null,["number","number","array","number","number","number","array","number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:a}=e,{x:d,indices:u}=n,{axis:l,batchDims:c}=a,f=s.util.parseAxisParam(l,d.shape)[0],p=s.backend_util.segment_util.collectGatherOpShapeInfo(d,u,f,c),m=Object(o.reshape)({inputs:{x:d},attrs:{shape:[p.batchSize,p.outerSize,p.dimSize,p.sliceSize]},backend:t}),h=s.util.sizeFromShape(u.shape),b=Object(o.reshape)({inputs:{x:u},attrs:{shape:[p.batchSize,h/p.batchSize]},backend:t}),j=[p.batchSize,p.outerSize,h/p.batchSize,p.sliceSize],g=t.makeOutput(j,d.dtype);if(0===s.util.sizeFromShape(d.shape))return g;const w=m.shape.length-1,_=t.dataIdMap.get(m.dataId).id,k=t.dataIdMap.get(b.dataId).id,v=t.dataIdMap.get(g.dataId).id,x=new Uint8Array(new Int32Array(s.util.computeStrides(m.shape)).buffer),y=new Uint8Array(new Int32Array(s.util.computeStrides(j)).buffer);return i(_,r.CppDType[d.dtype],x,w,k,p.batchSize,y,v),t.disposeData(m.dataId),t.disposeData(b.dataId),g.shape=p.outputShape,g}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Greater.js": + */class o{constructor(e,t,n){this.variableNames=["x"],this.outputShape=t.map(((t,n)=>t[0]+e[n]+t[1]));const o=e.length,r=Object(s.getCoordsDataType)(o),i=t.map((e=>e[0])).join(","),a=t.map(((t,n)=>t[0]+e[n])).join(","),u=["coords[0]","coords[1]","coords[2]","coords[3]"].slice(0,o),d="reflect"===n?0:1;this.userCode=1!==o?`\n ${r} start = ${r}(${i});\n ${r} end = ${r}(${a});\n\n void main() {\n ${r} outC = getOutputCoords();\n for (int i = 0; i < ${o}; i++) {\n if (outC[i] < start[i]) {\n outC[i] = start[i] * 2 - outC[i] - ${d};\n } else if(outC[i] >= end[i]) {\n outC[i] = (end[i] - 1) * 2 - outC[i] + ${d};\n }\n }\n ${r} coords = outC - start;\n setOutput(getX(${u}));\n }\n `:`\n int start = ${i};\n int end = ${a};\n\n void main() {\n int outC = getOutputCoords();\n if (outC < start) {\n outC = start * 2 - outC - ${d};\n } else if(outC >= end) {\n outC = (end - 1) * 2 - outC + ${d};\n }\n setOutput(getX(outC - start));\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/mirror_pad_packed_gpu.js": /*!****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Greater.js ***! + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/mirror_pad_packed_gpu.js ***! \****************************************************************************/ -/*! exports provided: greaterConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"greaterConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); +/*! exports provided: MirrorPadPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"MirrorPadPackedProgram",(function(){return r}));var s=n(/*! ./packing_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/packing_util.js"),o=n(/*! ./shader_compiler */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -4809,14 +4797,14 @@ let i;const a={kernelName:s.GatherV2,backendName:"wasm",setupFunc:function(e){i= * limitations under the License. * ============================================================================= */ -const r=Object(o.createBinaryKernelConfig)(s.Greater,!1,"bool")},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/GreaterEqual.js": -/*!*********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/GreaterEqual.js ***! - \*********************************************************************************/ -/*! exports provided: greaterEqualConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"greaterEqualConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); +class r{constructor(e,t,n){this.variableNames=["x"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=t.map(((t,n)=>t[0]+e[n]+t[1]));const r=e.length,i=Object(o.getCoordsDataType)(r),a=t.map((e=>e[0])).join(","),u=t.map(((t,n)=>t[0]+e[n])).join(","),d=Object(s.getChannels)("rc",r),l=Object(s.getChannels)("source",r),c=`${d[r-1]} < ${this.outputShape[r-1]}`,f=1===r?"source":`vec2(${l.slice(-2).join()})`,p="reflect"===n?0:1;let m="";if(1===r){const e=`\n ${i} source = rc;\n if (source < start) {\n source = start * 2 - source - ${p};\n } else if (source >= end) {\n source = (end - 1) * 2 - source + ${p};\n }\n source -= start;\n `;m=`\n ${i} rc = outputLoc;\n ${e}\n result[0] = getChannel(getX(${l.join()}), ${f});\n ${d[r-1]} += 1;\n if(${c}) {\n ${e}\n result[1] = getChannel(getX(${l.join()}), ${f});\n }\n `}else{const e=`\n ${i} source = rc;\n ${i} lt = ${i}(lessThan(source, start));\n ${i} gte = ${i}(greaterThanEqual(source, end));\n ${i} orig = 1 - (lt + gte);\n source = orig * source +\n lt * (start * 2 - source - ${p}) +\n gte * ((end - 1) * 2 - source + ${p});\n source -= start;\n `;m=`\n ${i} rc = outputLoc;\n ${e}\n result[0] = getChannel(getX(${l.join()}), ${f});\n ${d[r-1]} += 1;\n if(${c}) {\n ${e}\n result[1] = getChannel(getX(${l.join()}), ${f});\n }\n rc = outputLoc;\n ${d[r-2]} += 1;\n if(${d[r-2]} < ${this.outputShape[r-2]}) {\n ${e}\n result[2] = getChannel(getX(${l.join()}), ${f});\n ${d[r-1]} += 1;\n if(${c}) {\n ${e}\n result[3] = getChannel(getX(${l.join()}), ${f});\n }\n }\n `}this.userCode=`\n const ${i} start = ${i}(${a});\n const ${i} end = ${i}(${u});\n\n void main() {\n ${i} outputLoc = getOutputCoords();\n vec4 result = vec4(0.);\n ${m}\n setOutput(result);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/mulmat_packed_gpu.js": +/*!************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/mulmat_packed_gpu.js ***! + \************************************************************************/ +/*! exports provided: MatMulPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"MatMulPackedProgram",(function(){return o}));var s=n(/*! ./gpgpu_math */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/gpgpu_math.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -4829,15 +4817,14 @@ const r=Object(o.createBinaryKernelConfig)(s.Greater,!1,"bool")},"./node_modules * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -const r=Object(o.createBinaryKernelConfig)(s.GreaterEqual,!1,"bool")},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Identity.js": -/*!*****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Identity.js ***! - \*****************************************************************************/ -/*! exports provided: identity, identityConfig */function(e,t,n){"use strict"; + */class o{constructor(e,t,n,o=!1,r=!1,i=!1,a=null,u=!1,d=!1){this.variableNames=["matrixA","matrixB"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=n,this.enableShapeUniforms=Object(s.useShapeUniforms)(this.outputShape.length);const l=o?e[1]:e[2],c=Math.ceil(l/2),f=o?"i * 2, rc.y":"rc.y, i * 2",p=r?"rc.z, i * 2":"i * 2, rc.z",m=o?["a.xxyy","a.zzww"]:["a.xxzz","a.yyww"],h=r?["b.xzxz","b.ywyw"]:["b.xyxy","b.zwzw"];let b="",j="";a&&(b=u?`vec4 activation(vec4 a) {\n vec4 b = getPreluActivationWeightsAtOutCoords();\n ${a}\n }`:d?`vec4 activation(vec4 a) {\n vec4 b = getLeakyreluAlphaAtOutCoords();\n ${a}\n }`:`vec4 activation(vec4 x) {\n ${a}\n }`,j="result = activation(result);");const g=i?"result += getBiasAtOutCoords();":"";i&&this.variableNames.push("bias"),u&&this.variableNames.push("preluActivationWeights"),d&&this.variableNames.push("leakyreluAlpha");let w="rc.x",_="rc.x";e[0] ${t[0]}`;let s="";for(let o=e-2;o= ${t[o]}`,o= ${t};\n bool rEdge = rp1 >= ${n};\n `}(t,e[e.length-1],e[e.length-2],n),u=function(e,t){const n=e.length,s=function(e,t){const n=[];for(let s=0;s<=1;s++)for(let o=0;o<=1;o++){let r=`${0===s?"r":"rp1"}, ${0===o?"c":"cp1"}`;for(let n=2;n= ${e[0]} ? 0. : getA(rc + 1),\n 0, 0`;return`getA(${s[0]}),\n cEdge ? 0. : getA(${s[1]}),\n rEdge ? 0. : getA(${s[2]}),\n rEdge || cEdge ? 0. : getA(${s[3]})`}(e,n);this.userCode=`\n void main() {\n ${r} rc = getOutputCoords();\n\n if(${i}) {\n setOutput(vec4(0));\n } else {\n ${a}\n\n setOutput(vec4(${u}));\n }\n }\n `}}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/packing_util.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/packing_util.js ***! + \*******************************************************************/ +/*! exports provided: getVecChannels, getChannels, getSourceCoords */function(e,t,n){"use strict"; /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -4892,14 +4901,14 @@ function s(e){const{inputs:{x:t},backend:n}=e,s=n.makeOutput(t.shape,t.dtype),o= * limitations under the License. * ============================================================================= */ -const r=Object(o.createBinaryKernelConfig)(s.Less,!1,"bool")},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/LessEqual.js": -/*!******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/LessEqual.js ***! - \******************************************************************************/ -/*! exports provided: lessEqualConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"lessEqualConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); +function s(e,t){return["x","y","z","w","u","v"].slice(0,t).map((t=>`${e}.${t}`))}function o(e,t){return 1===t?[e]:s(e,t)}function r(e,t){if(1===e)return"rc";let n="";for(let s=0;st[0]+e[n]+t[1]));const o=e.length,r=Object(s.getCoordsDataType)(o),i=t.map((e=>e[0])).join(","),a=t.map(((t,n)=>t[0]+e[n])).join(","),u=["coords[0]","coords[1]","coords[2]","coords[3]"].slice(0,o);this.userCode=1!==o?`\n ${r} start = ${r}(${i});\n ${r} end = ${r}(${a});\n\n void main() {\n ${r} outC = getOutputCoords();\n if (any(lessThan(outC, start)) || any(greaterThanEqual(outC, end))) {\n setOutput(value);\n } else {\n ${r} coords = outC - start;\n setOutput(getX(${u}));\n }\n }\n `:`\n int start = ${i};\n int end = ${a};\n\n void main() {\n int outC = getOutputCoords();\n if (outC < start || outC >= end) {\n setOutput(value);\n } else {\n setOutput(getX(outC - start));\n }\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/pad_packed_gpu.js": +/*!*********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/pad_packed_gpu.js ***! + \*********************************************************************/ +/*! exports provided: PadPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"PadPackedProgram",(function(){return r}));var s=n(/*! ./packing_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/packing_util.js"),o=n(/*! ./shader_compiler */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); /** * @license * Copyright 2019 Google LLC. All Rights Reserved. @@ -4934,14 +4942,14 @@ const r=Object(o.createBinaryKernelConfig)(s.LessEqual,!1,"bool")},"./node_modul * limitations under the License. * ============================================================================= */ -const r=Object(o.createUnaryKernelConfig)(s.Log)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/LogicalAnd.js": -/*!*******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/LogicalAnd.js ***! - \*******************************************************************************/ -/*! exports provided: logicalAndConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"logicalAndConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); +class r{constructor(e,t,n){this.variableNames=["x"],this.packedInputs=!0,this.packedOutput=!0,this.customUniforms=[{name:"value",type:"float"}],this.outputShape=t.map(((t,n)=>t[0]+e[n]+t[1]));const r=e.length,i=Object(o.getCoordsDataType)(r),a=t.map((e=>e[0])).join(","),u=t.map(((t,n)=>t[0]+e[n])).join(","),d=Object(s.getChannels)("rc",r),l=Object(s.getChannels)("source",r),c=`${d[r-1]} < ${this.outputShape[r-1]}`,f=1===r?"source":`vec2(${l.slice(-2).join()})`,p=[`${i} rc = outputLoc;`,`${d[r-1]} += 1;\n if(${c}) {\n `,1===r?"":`}\n rc = outputLoc;\n ${d[r-2]} += 1;\n if(${d[r-2]} < ${this.outputShape[r-2]}) {`,1===r?"":` ${d[r-1]} += 1;\n if(${c}) {`],m=1===r?"rc < start || rc >= end":"any(lessThan(rc, start)) || any(greaterThanEqual(rc, end))";let h="";for(let e=0,t=1===r?2:4;e= ${e.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${c};\n wC += ${d}) {\n int xC = xCCorner + wC;\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n float value = getX(batch, xR, xC, d);\n\n // If a min / max value has already been found, use it. If not,\n // use the current value.\n float currMinMaxValue = mix(\n value, minMaxValue, minMaxValueFound);\n if (value ${t} currMinMaxValue) {\n minMaxValue = value;\n minMaxValueFound = 1.0;\n minMaxPosition = ${s?o?h:b:`wR * ${c} + wC`};\n }\n }\n }\n setOutput(float(minMaxPosition));\n }\n `)}let g=`${t}(${t}(${t}(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])`;"avg"===t&&(g="avgValue / count");const w=4*Math.floor(r/4),_=r%4,k=`\n if (${m}) {\n avgValue += dot(values, ones);\n } else {\n minMaxValue = max(values, minMaxValue);\n }\n `;this.userCode=`\n const ivec2 strides = ivec2(${i}, ${a});\n const ivec2 pads = ivec2(${f}, ${p});\n const float initializationValue = ${j};\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float count = 0.0;\n\n float getValue(int batch, int xR, int xC, int d) {\n if (xC < 0 || xC >= ${e.inWidth}) {\n return initializationValue;\n }\n count += 1.0;\n return getX(batch, xR, xC, d);\n }\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d = coords[3];\n\n ivec2 xRCCorner = coords.yz * strides - pads;\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // max/min x(?, ?, d) to get y(yR, yC, d).\n // ? = to be determined\n vec4 minMaxValue = vec4(${j});\n float avgValue = 0.0;\n count = 0.0;\n\n for (int wR = 0; wR < ${l};\n wR += ${u}) {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${w}; wC += 4) {\n int xC = xCCorner + wC * ${d};\n\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + ${d}, d),\n getValue(batch, xR, xC + 2 * ${d}, d),\n getValue(batch, xR, xC + 3 * ${d}, d)\n );\n\n ${k}\n }\n\n int xC = xCCorner + ${w};\n if (${1===_}) {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n ${k}\n } else if (${2===_}) {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + ${d}, d),\n initializationValue,\n initializationValue\n );\n\n ${k}\n } else if (${3===_}) {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + ${d}, d),\n getValue(batch, xR, xC + 2 * ${d}, d),\n initializationValue\n );\n\n ${k}\n }\n }\n setOutput(${g});\n }\n `}}class o{constructor(e,t,n,s=!1,o=!1){if(this.variableNames=["x"],"avg"===t&&n)throw new Error("Cannot compute positions for average pool.");const r=e.filterWidth,i=e.strideDepth,a=e.strideHeight,u=e.strideWidth,d=e.dilationDepth,l=e.dilationHeight,c=e.dilationWidth,f=e.effectiveFilterDepth,p=e.effectiveFilterHeight,m=e.effectiveFilterWidth,h=e.padInfo.front,b=e.padInfo.top,j=e.padInfo.left;this.outputShape=e.outShape;const g="avg"===t;let w="0.0";if(g||(w="-1.0 / 1e-20"),n){const t=">=";return void(this.userCode=`\n const ivec3 strides =\n ivec3(${i}, ${a}, ${u});\n const ivec3 pads = ivec3(${h}, ${b}, ${j});\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int ch = coords.u;\n\n ivec3 xCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads;\n int xDCorner = xCorner.x;\n int xRCorner = xCorner.y;\n int xCCorner = xCorner.z;\n\n // max/min x(?, ?, ?, ch) to get y(yD, yR, yC, ch).\n // ? = to be determined\n float minMaxValue = 0.0;\n float minMaxValueFound = 0.0;\n int minMaxPosition = 0;\n\n for (int wD = 0; wD < ${f};\n wD += ${d}) {\n int xD = xDCorner + wD;\n\n if (xD < 0 || xD >= ${e.inDepth}) {\n continue;\n }\n\n for (int wR = 0; wR < ${p};\n wR += ${l}) {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${m};\n wC += ${c}) {\n int xC = xCCorner + wC;\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n float value = getX(batch, xD, xR, xC, ch);\n\n // If a min / max value has already been found, use it. If not,\n // use the current value.\n float currMinMaxValue = mix(\n value, minMaxValue, minMaxValueFound);\n if (value ${t} currMinMaxValue) {\n minMaxValue = value;\n minMaxValueFound = 1.0;\n minMaxPosition = ${s?o?`(((batch * ${e.inDepth} + xD) * ${e.inHeight} + xR) * ${e.inWidth} + xC) * ${e.inChannels} + ch`:`((xD * ${e.inHeight} + xR) * ${e.inWidth} + xC) * ${e.inChannels} + ch`:`wD * ${p} * ${m} +\n wR * ${m} + wC`};\n }\n }\n }\n }\n setOutput(float(minMaxPosition));\n }\n `)}let _=`${t}(${t}(${t}(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])`;"avg"===t&&(_="avgValue / count");const k=4*Math.floor(r/4),v=r%4,x=`\n if (${g}) {\n avgValue += dot(values, ones);\n } else {\n minMaxValue = max(values, minMaxValue);\n }\n `;this.userCode=`\n const ivec3 strides =\n ivec3(${i}, ${a}, ${u});\n const ivec3 pads = ivec3(${h}, ${b}, ${j});\n const float initializationValue = ${w};\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float count = 0.0;\n\n float getValue(int batch, int xD, int xR, int xC, int ch) {\n if (xC < 0 || xC >= ${e.inWidth}) {\n return initializationValue;\n }\n count += 1.0;\n return getX(batch, xD, xR, xC, ch);\n }\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int ch = coords.u;\n\n ivec3 xCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads;\n int xDCorner = xCorner.x;\n int xRCorner = xCorner.y;\n int xCCorner = xCorner.z;\n\n // max/min x(?, ?, ?, d) to get y(yD, yR, yC, ch).\n // ? = to be determined\n vec4 minMaxValue = vec4(${w});\n float avgValue = 0.0;\n count = 0.0;\n\n for (int wD = 0; wD < ${f};\n wD += ${d}) {\n int xD = xDCorner + wD;\n\n if (xD < 0 || xD >= ${e.inDepth}) {\n continue;\n }\n\n for (int wR = 0; wR < ${p};\n wR += ${l}) {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${k}; wC += 4) {\n int xC = xCCorner + wC * ${c};\n\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n getValue(batch, xD, xR, xC + ${c}, ch),\n getValue(batch, xD, xR, xC + 2 * ${c}, ch),\n getValue(batch, xD, xR, xC + 3 * ${c}, ch)\n );\n\n ${x}\n }\n\n int xC = xCCorner + ${k};\n if (${1===v}) {\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n ${x}\n } else if (${2===v}) {\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n getValue(batch, xD, xR, xC + ${c}, ch),\n initializationValue,\n initializationValue\n );\n\n ${x}\n } else if (${3===v}) {\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n getValue(batch, xD, xR, xC + ${c}, ch),\n getValue(batch, xD, xR, xC + 2 * ${c}, ch),\n initializationValue\n );\n\n ${x}\n }\n }\n setOutput(${_});\n }\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/reduce_gpu.js": +/*!*****************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/reduce_gpu.js ***! + \*****************************************************************/ +/*! exports provided: ReduceProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ReduceProgram",(function(){return s})); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2017 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -4976,14 +4984,14 @@ const r=Object(o.createBinaryKernelConfig)(s.LogicalAnd,!1,"bool")},"./node_modu * limitations under the License. * ============================================================================= */ -let r;const i={kernelName:s.Max,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.Max,null,["number, number, number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:i}=e,{reductionIndices:a,keepDims:d}=i,{x:u}=n;let l=t.dataIdMap.get(u.dataId).id,c=u;const{transposed:f,axes:p,originalAxes:m,inputWasTransposed:h}=Object(o.permuteAxesAndTranspose)(u,a,t);if(h){c=f,l=t.dataIdMap.get(f.dataId).id}const b=c.shape.length;s.backend_util.assertAxesAreInnerMostDims("max",p,b);const[j,g]=s.backend_util.computeOutAndReduceShapes(c.shape,p),w=s.util.sizeFromShape(g),_=t.makeOutput(j,u.dtype);if(0!==s.util.sizeFromShape(c.shape)){const e=t.dataIdMap.get(_.dataId).id;r(l,w,e)}if(h&&t.disposeData(f.dataId),d){const e=s.backend_util.expandShapeToKeepDim(_.shape,m);_.shape=e}return _}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/MaxPool.js": -/*!****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/MaxPool.js ***! - \****************************************************************************/ -/*! exports provided: maxPoolConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPoolConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +class s{constructor(e,t){this.variableNames=["x"];const{windowSize:n,batchSize:s,inSize:o,outSize:r}=e;this.outputShape=[s,r];let i="0.0",a="";"prod"===t?i="1.0":"min"===t?(i="1.0 / 1e-20",a="min"):"max"===t&&(i="-1.0 / 1e-20",a="max");let u=`${t}(${t}(${t}(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])`;"sum"===t?u="sumValue":"prod"===t?u="prodValue":"all"===t?u="allValue":"any"===t&&(u="anyValue");const d=4*Math.floor(n/4),l=n%4;let c=`\n if (${"sum"===t}) {\n sumValue += dot(values, ones);\n } else if (${"prod"===t}) {\n vec2 tmp = vec2(values[0], values[1]) * vec2(values[2], values[3]);\n prodValue *= tmp[0] * tmp[1];\n } else {\n minMaxValue = ${a}(values, minMaxValue);\n if (${"min"===t} || ${"max"===t}) {\n minMaxValue = ${a}(values, minMaxValue);\n bvec4 isNaN = isnan(values);\n if (isNaN.r || isNaN.g || isNaN.b || isNaN.a) {\n minMaxValue = vec4(NAN);\n }\n }\n }\n `,f="vec4";"all"===t?(i="1.0",c="\n bool reducedAllValue = all(values);\n float floatedReducedAllValue = float(reducedAllValue);\n allValue = float(allValue >= 1.0 && floatedReducedAllValue >= 1.0);\n ",f="bvec4"):"any"===t&&(i="0.0",c="\n bool reducedAnyValue = any(values);\n float floatedReducedAnyValue = float(reducedAnyValue);\n anyValue = float(anyValue >= 1.0 || floatedReducedAnyValue >= 1.0);\n ",f="bvec4");let p="";o%n>0&&(p=`\n if (inIdx < 0 || inIdx >= ${o}) {\n return initializationValue;\n }\n `),this.userCode=`\n const float initializationValue = ${i};\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float getValue(int batch, int inIdx) {\n ${p}\n return getX(batch, inIdx);\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = outIdx * ${n};\n\n vec4 minMaxValue = vec4(${i});\n float prodValue = 1.0;\n float sumValue = 0.0;\n float allValue = 1.0;\n float anyValue = 0.0;\n\n for (int i = 0; i < ${d}; i += 4) {\n int inIdx = inOffset + i;\n ${f} values = ${f}(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n getValue(batch, inIdx + 3)\n );\n\n ${c}\n }\n\n int inIdx = inOffset + ${d};\n if (${1===l}) {\n ${f} values = ${f}(\n getValue(batch, inIdx),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n ${c}\n } else if (${2===l}) {\n ${f} values = ${f}(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n initializationValue,\n initializationValue\n );\n\n ${c}\n } else if (${3===l}) {\n ${f} values = ${f}(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n initializationValue\n );\n\n ${c}\n }\n setOutput(${u});\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/register_all_kernels.js": +/*!***************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/register_all_kernels.js ***! + \***************************************************************************/ +/*! no exports provided */function(e,t,n){"use strict";n.r(t);var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./kernels/_FusedMatMul */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/_FusedMatMul.js"),r=n(/*! ./kernels/Abs */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Abs.js"),i=n(/*! ./kernels/Acos */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Acos.js"),a=n(/*! ./kernels/Acosh */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Acosh.js"),u=n(/*! ./kernels/Add */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Add.js"),d=n(/*! ./kernels/AddN */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/AddN.js"),l=n(/*! ./kernels/All */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/All.js"),c=n(/*! ./kernels/Any */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Any.js"),f=n(/*! ./kernels/ArgMax */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ArgMax.js"),p=n(/*! ./kernels/ArgMin */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ArgMin.js"),m=n(/*! ./kernels/Asin */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Asin.js"),h=n(/*! ./kernels/Asinh */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Asinh.js"),b=n(/*! ./kernels/Atan */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Atan.js"),j=n(/*! ./kernels/Atan2 */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Atan2.js"),g=n(/*! ./kernels/Atanh */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Atanh.js"),w=n(/*! ./kernels/AvgPool */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPool.js"),_=n(/*! ./kernels/AvgPool3D */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPool3D.js"),k=n(/*! ./kernels/AvgPool3DGrad */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPool3DGrad.js"),v=n(/*! ./kernels/AvgPoolGrad */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPoolGrad.js"),x=n(/*! ./kernels/BatchMatMul */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchMatMul.js"),y=n(/*! ./kernels/BatchNorm */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchNorm.js"),O=n(/*! ./kernels/BatchToSpaceND */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchToSpaceND.js"),I=n(/*! ./kernels/Bincount */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Bincount.js"),C=n(/*! ./kernels/Cast */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Cast.js"),S=n(/*! ./kernels/Ceil */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Ceil.js"),T=n(/*! ./kernels/ClipByValue */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ClipByValue.js"),N=n(/*! ./kernels/Complex */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js"),E=n(/*! ./kernels/ComplexAbs */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ComplexAbs.js"),A=n(/*! ./kernels/Concat */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Concat.js"),R=n(/*! ./kernels/Conv2D */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2D.js"),F=n(/*! ./kernels/Conv2DBackpropFilter */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2DBackpropFilter.js"),M=n(/*! ./kernels/Conv2DBackpropInput */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2DBackpropInput.js"),$=n(/*! ./kernels/Conv3D */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv3D.js"),D=n(/*! ./kernels/Conv3DBackpropFilterV2 */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv3DBackpropFilterV2.js"),P=n(/*! ./kernels/Conv3DBackpropInputV2 */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv3DBackpropInputV2.js"),B=n(/*! ./kernels/Cos */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Cos.js"),L=n(/*! ./kernels/Cosh */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Cosh.js"),z=n(/*! ./kernels/CropAndResize */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/CropAndResize.js"),G=n(/*! ./kernels/Cumsum */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Cumsum.js"),U=n(/*! ./kernels/DenseBincount */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/DenseBincount.js"),W=n(/*! ./kernels/DepthToSpace */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthToSpace.js"),V=n(/*! ./kernels/DepthwiseConv2dNative */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthwiseConv2dNative.js"),q=n(/*! ./kernels/DepthwiseConv2dNativeBackpropFilter */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthwiseConv2dNativeBackpropFilter.js"),H=n(/*! ./kernels/DepthwiseConv2dNativeBackpropInput */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthwiseConv2dNativeBackpropInput.js"),K=n(/*! ./kernels/Diag */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Diag.js"),X=n(/*! ./kernels/Dilation2D */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Dilation2D.js"),Y=n(/*! ./kernels/Einsum */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Einsum.js"),Z=n(/*! ./kernels/Elu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Elu.js"),Q=n(/*! ./kernels/EluGrad */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/EluGrad.js"),J=n(/*! ./kernels/Equal */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Equal.js"),ee=n(/*! ./kernels/Erf */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Erf.js"),te=n(/*! ./kernels/Exp */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Exp.js"),ne=n(/*! ./kernels/ExpandDims */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ExpandDims.js"),se=n(/*! ./kernels/Expm1 */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Expm1.js"),oe=n(/*! ./kernels/FFT */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FFT.js"),re=n(/*! ./kernels/Fill */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Fill.js"),ie=n(/*! ./kernels/FlipLeftRight */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FlipLeftRight.js"),ae=n(/*! ./kernels/Floor */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Floor.js"),ue=n(/*! ./kernels/FloorDiv */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FloorDiv.js"),de=n(/*! ./kernels/FromPixels */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FromPixels.js"),le=n(/*! ./kernels/FusedConv2D */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FusedConv2D.js"),ce=n(/*! ./kernels/FusedDepthwiseConv2D */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FusedDepthwiseConv2D.js"),fe=n(/*! ./kernels/GatherNd */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/GatherNd.js"),pe=n(/*! ./kernels/GatherV2 */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/GatherV2.js"),me=n(/*! ./kernels/Greater */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Greater.js"),he=n(/*! ./kernels/GreaterEqual */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/GreaterEqual.js"),be=n(/*! ./kernels/Identity */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"),je=n(/*! ./kernels/IFFT */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/IFFT.js"),ge=n(/*! ./kernels/Imag */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Imag.js"),we=n(/*! ./kernels/IsFinite */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/IsFinite.js"),_e=n(/*! ./kernels/IsInf */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/IsInf.js"),ke=n(/*! ./kernels/IsNaN */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/IsNaN.js"),ve=n(/*! ./kernels/LeakyRelu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LeakyRelu.js"),xe=n(/*! ./kernels/Less */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Less.js"),ye=n(/*! ./kernels/LessEqual */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LessEqual.js"),Oe=n(/*! ./kernels/LinSpace */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LinSpace.js"),Ie=n(/*! ./kernels/Log */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Log.js"),Ce=n(/*! ./kernels/Log1p */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Log1p.js"),Se=n(/*! ./kernels/LogicalAnd */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LogicalAnd.js"),Te=n(/*! ./kernels/LogicalNot */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LogicalNot.js"),Ne=n(/*! ./kernels/LogicalOr */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LogicalOr.js"),Ee=n(/*! ./kernels/LRN */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LRN.js"),Ae=n(/*! ./kernels/LRNGrad */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LRNGrad.js"),Re=n(/*! ./kernels/Max */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Max.js"),Fe=n(/*! ./kernels/Maximum */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Maximum.js"),Me=n(/*! ./kernels/MaxPool */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPool.js"),$e=n(/*! ./kernels/MaxPool3D */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPool3D.js"),De=n(/*! ./kernels/MaxPool3DGrad */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPool3DGrad.js"),Pe=n(/*! ./kernels/MaxPoolGrad */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolGrad.js"),Be=n(/*! ./kernels/MaxPoolWithArgmax */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolWithArgmax.js"),Le=n(/*! ./kernels/Mean */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Mean.js"),ze=n(/*! ./kernels/Min */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Min.js"),Ge=n(/*! ./kernels/Minimum */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Minimum.js"),Ue=n(/*! ./kernels/MirrorPad */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/MirrorPad.js"),We=n(/*! ./kernels/Mod */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Mod.js"),Ve=n(/*! ./kernels/Multinomial */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Multinomial.js"),qe=n(/*! ./kernels/Multiply */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Multiply.js"),He=n(/*! ./kernels/Neg */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Neg.js"),Ke=n(/*! ./kernels/NonMaxSuppressionV3 */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV3.js"),Xe=n(/*! ./kernels/NonMaxSuppressionV4 */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV4.js"),Ye=n(/*! ./kernels/NonMaxSuppressionV5 */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV5.js"),Ze=n(/*! ./kernels/NotEqual */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/NotEqual.js"),Qe=n(/*! ./kernels/OneHot */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/OneHot.js"),Je=n(/*! ./kernels/OnesLike */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/OnesLike.js"),et=n(/*! ./kernels/Pack */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Pack.js"),tt=n(/*! ./kernels/PadV2 */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/PadV2.js"),nt=n(/*! ./kernels/Pow */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Pow.js"),st=n(/*! ./kernels/Prelu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Prelu.js"),ot=n(/*! ./kernels/Prod */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Prod.js"),rt=n(/*! ./kernels/Range */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Range.js"),it=n(/*! ./kernels/Real */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Real.js"),at=n(/*! ./kernels/RealDiv */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/RealDiv.js"),ut=n(/*! ./kernels/Reciprocal */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reciprocal.js"),dt=n(/*! ./kernels/Relu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Relu.js"),lt=n(/*! ./kernels/Relu6 */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Relu6.js"),ct=n(/*! ./kernels/Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),ft=n(/*! ./kernels/ResizeBilinear */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeBilinear.js"),pt=n(/*! ./kernels/ResizeBilinearGrad */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeBilinearGrad.js"),mt=n(/*! ./kernels/ResizeNearestNeighbor */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeNearestNeighbor.js"),ht=n(/*! ./kernels/ResizeNearestNeighborGrad */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeNearestNeighborGrad.js"),bt=n(/*! ./kernels/Reverse */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reverse.js"),jt=n(/*! ./kernels/RotateWithOffset */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/RotateWithOffset.js"),gt=n(/*! ./kernels/Round */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Round.js"),wt=n(/*! ./kernels/Rsqrt */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Rsqrt.js"),_t=n(/*! ./kernels/ScatterNd */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ScatterNd.js"),kt=n(/*! ./kernels/Select */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Select.js"),vt=n(/*! ./kernels/Selu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Selu.js"),xt=n(/*! ./kernels/Sigmoid */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sigmoid.js"),yt=n(/*! ./kernels/Sign */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sign.js"),Ot=n(/*! ./kernels/Sin */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sin.js"),It=n(/*! ./kernels/Sinh */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sinh.js"),Ct=n(/*! ./kernels/Slice */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Slice.js"),St=n(/*! ./kernels/Softmax */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Softmax.js"),Tt=n(/*! ./kernels/Softplus */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Softplus.js"),Nt=n(/*! ./kernels/SpaceToBatchND */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SpaceToBatchND.js"),Et=n(/*! ./kernels/SparseFillEmptyRows */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseFillEmptyRows.js"),At=n(/*! ./kernels/SparseReshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseReshape.js"),Rt=n(/*! ./kernels/SparseSegmentMean */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseSegmentMean.js"),Ft=n(/*! ./kernels/SparseSegmentSum */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseSegmentSum.js"),Mt=n(/*! ./kernels/SparseToDense */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseToDense.js"),$t=n(/*! ./kernels/SplitV */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SplitV.js"),Dt=n(/*! ./kernels/Sqrt */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sqrt.js"),Pt=n(/*! ./kernels/Square */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Square.js"),Bt=n(/*! ./kernels/SquaredDifference */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SquaredDifference.js"),Lt=n(/*! ./kernels/Step */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Step.js"),zt=n(/*! ./kernels/StridedSlice */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/StridedSlice.js"),Gt=n(/*! ./kernels/StringNGrams */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/StringNGrams.js"),Ut=n(/*! ./kernels/StringSplit */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/StringSplit.js"),Wt=n(/*! ./kernels/StringToHashBucketFast */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/StringToHashBucketFast.js"),Vt=n(/*! ./kernels/Sub */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sub.js"),qt=n(/*! ./kernels/Sum */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sum.js"),Ht=n(/*! ./kernels/Tan */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Tan.js"),Kt=n(/*! ./kernels/Tanh */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Tanh.js"),Xt=n(/*! ./kernels/Tile */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Tile.js"),Yt=n(/*! ./kernels/TopK */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/TopK.js"),Zt=n(/*! ./kernels/Transform */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Transform.js"),Qt=n(/*! ./kernels/Transpose */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"),Jt=n(/*! ./kernels/Unique */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Unique.js"),en=n(/*! ./kernels/Unpack */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Unpack.js"),tn=n(/*! ./kernels/UnsortedSegmentSum */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/UnsortedSegmentSum.js"),nn=n(/*! ./kernels/ZerosLike */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ZerosLike.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -4996,14 +5004,15 @@ let r;const i={kernelName:s.Max,backendName:"wasm",setupFunc:function(e){r=e.was * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */let o;const r={kernelName:s.MaxPool,backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.MaxPool,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:t,attrs:n,backend:r}=e,i=t.x,a=r.dataIdMap.get(i.dataId).id,{filterSize:d,strides:u,pad:l,dimRoundingMode:c}=n,f=s.backend_util.computePool2DInfo(i.shape,d,u,1,l,c),p=f.filterHeight,m=f.filterWidth,h=f.padInfo.top,b=f.padInfo.right,j=f.padInfo.bottom,g=f.padInfo.left,w=f.dilationHeight,_=f.dilationWidth,k=f.strideHeight,v=f.strideWidth,x=f.inChannels,y=f.outChannels;if("channelsLast"!==f.dataFormat)throw new Error(`wasm backend does not support dataFormat:'${f.dataFormat}'. Please use 'channelsLast'.`);const O=r.makeOutput(f.outShape,"float32"),I=r.dataIdMap.get(O.dataId).id;return o(a,i.shape[0],i.shape[1],i.shape[2],p,m,h,b,j,g,w,_,k,v,x,y,I),O}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Maximum.js": -/*!****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Maximum.js ***! - \****************************************************************************/ -/*! exports provided: maximumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maximumConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); + */ +const sn=[Ee.LRNConfig,Ae.LRNGradConfig,o._fusedMatMulConfig,r.absConfig,i.acosConfig,a.acoshConfig,u.addConfig,d.addNConfig,l.allConfig,c.anyConfig,f.argMaxConfig,p.argMinConfig,m.asinConfig,h.asinhConfig,j.atan2Config,b.atanConfig,g.atanhConfig,_.avgPool3DConfig,w.avgPoolConfig,k.avgPoolGrad3DConfig,v.avgPoolGradConfig,x.batchMatMulConfig,y.batchNormConfig,O.batchToSpaceNDConfig,I.bincountConfig,C.castConfig,S.ceilConfig,T.clipByValueConfig,E.complexAbsConfig,N.complexConfig,A.concatConfig,F.conv2DBackpropFilterConfig,M.conv2DBackpropInputConfig,R.conv2DConfig,D.conv3DBackpropFilterV2Config,P.conv3DBackpropInputConfig,$.conv3DConfig,B.cosConfig,L.coshConfig,z.cropAndResizeConfig,G.cumsumConfig,U.denseBincountConfig,W.depthToSpaceConfig,q.depthwiseConv2dNativeBackpropFilterConfig,H.depthwiseConv2dNativeBackpropInputConfig,V.depthwiseConv2dNativeConfig,K.diagConfig,X.dilation2DConfig,Y.einsumConfig,Z.eluConfig,Q.eluGradConfig,J.equalConfig,ee.erfConfig,te.expConfig,ne.expandDimsConfig,se.expm1Config,oe.fftConfig,re.fillConfig,ie.flipLeftRightConfig,ae.floorConfig,ue.floorDivConfig,de.fromPixelsConfig,le.fusedConv2DConfig,ce.fusedDepthwiseConv2DConfig,fe.gatherNdConfig,pe.gatherV2Config,me.greaterConfig,he.greaterEqualConfig,be.identityConfig,je.ifftConfig,ge.imagConfig,we.isFiniteConfig,_e.isInfConfig,ke.isNaNConfig,ve.leakyReluConfig,xe.lessConfig,ye.lessEqualConfig,Oe.linSpaceConfig,Ce.log1pConfig,Ie.logConfig,Se.logicalAndConfig,Te.logicalNotConfig,Ne.logicalOrConfig,Re.maxConfig,$e.maxPool3DConfig,Me.maxPoolConfig,De.maxPoolGrad3DConfig,Pe.maxPoolGradConfig,Be.maxPoolWithArgmaxConfig,Fe.maximumConfig,Le.meanConfig,ze.minConfig,Ge.minimumConfig,Ue.mirrorPadConfig,We.modConfig,Ve.multinomialConfig,qe.multiplyConfig,He.negConfig,Ke.nonMaxSuppressionV3Config,Xe.nonMaxSuppressionV4Config,Ye.nonMaxSuppressionV5Config,Ze.notEqualConfig,Qe.oneHotConfig,Je.onesLikeConfig,et.packConfig,tt.padV2Config,nt.powConfig,st.preluConfig,ot.prodConfig,rt.rangeConfig,it.realConfig,at.realDivConfig,ut.reciprocalConfig,lt.relu6Config,dt.reluConfig,ct.reshapeConfig,ft.resizeBilinearConfig,pt.resizeBilinearGradConfig,mt.resizeNearestNeighborConfig,ht.resizeNearestNeighborGradConfig,bt.reverseConfig,jt.rotateWithOffsetConfig,gt.roundConfig,wt.rsqrtConfig,_t.scatterNdConfig,kt.selectConfig,vt.seluConfig,xt.sigmoidConfig,yt.signConfig,Ot.sinConfig,It.sinhConfig,Ct.sliceConfig,St.softmaxConfig,Tt.softplusConfig,Nt.spaceToBatchNDConfig,Et.sparseFillEmptyRowsConfig,At.sparseReshapeConfig,Rt.sparseSegmentMeanConfig,Ft.sparseSegmentSumConfig,Mt.sparseToDenseConfig,$t.splitVConfig,Dt.sqrtConfig,Pt.squareConfig,Bt.squaredDifferenceConfig,Lt.stepConfig,zt.stridedSliceConfig,Gt.stringNGramsConfig,Ut.stringSplitConfig,Wt.stringToHashBucketFastConfig,Vt.subConfig,qt.sumConfig,Ht.tanConfig,Kt.tanhConfig,Xt.tileConfig,Yt.topKConfig,Zt.transformConfig,Qt.transposeConfig,Jt.uniqueConfig,en.unpackConfig,tn.unsortedSegmentSumConfig,nn.zerosLikeConfig];for(const e of sn)Object(s.registerKernel)(e)},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/reshape_packed_gpu.js": +/*!*************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/reshape_packed_gpu.js ***! + \*************************************************************************/ +/*! exports provided: ReshapePackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ReshapePackedProgram",(function(){return r}));var s=n(/*! ./gpgpu_math */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/gpgpu_math.js"),o=n(/*! ./shader_compiler_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -5017,14 +5026,14 @@ let r;const i={kernelName:s.Max,backendName:"wasm",setupFunc:function(e){r=e.was * limitations under the License. * ============================================================================= */ -const r=Object(o.createBinaryKernelConfig)(s.Maximum,!1)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Mean.js": -/*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Mean.js ***! - \*************************************************************************/ -/*! exports provided: mean, meanConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"mean",(function(){return a})),n.d(t,"meanConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Cast */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Cast.js"),r=n(/*! ./kernel_utils */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/kernel_utils.js"); +class r{constructor(e,t){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.customUniforms=[{name:"inputShape",type:"ivec3"}],this.outputShape=e,this.enableShapeUniforms=Object(s.useShapeUniforms)(this.outputShape.length);let n="";for(let e=0;e<4;e++){let t="thisRC = rc;";e%2==1&&(t+="thisRC.z += 1;"),e>1&&(t+="thisRC.y += 1;"),n+=`\n ${t}\n ${e>0?"if(thisRC.y < rows && thisRC.z < cols){":""}\n int flatIndex = getFlatIndex(thisRC);\n\n ivec3 inputRC = inputCoordsFromReshapedOutCoords(flatIndex);\n vec2 inputRCInnerDims = vec2(float(inputRC.y),float(inputRC.z));\n\n result[${e}] =\n getChannel(getA(inputRC.x, inputRC.y, inputRC.z), inputRCInnerDims);\n ${e>0?"}":""}\n `}var r,i;this.userCode=`\n ${r=t,i=this.enableShapeUniforms,`\n ivec3 inputCoordsFromReshapedOutCoords(int index) {\n ${i?o.getLogicalCoordinatesFromFlatIndexByUniform(["r","c","d"],"inputShape"):o.getLogicalCoordinatesFromFlatIndex(["r","c","d"],r)}\n return ivec3(r, c, d);\n }\n `}\n ${this.enableShapeUniforms?o.getFlatIndexFrom3DOutput():o.getFlatIndexFrom3D(e)}\n\n void main() {\n ivec3 rc = getOutputCoords();\n\n vec4 result = vec4(0.);\n\n ivec3 thisRC;\n int rows = ${this.enableShapeUniforms?"outShape[1]":e[1]};\n int cols = ${this.enableShapeUniforms?"outShape[2]":e[2]};\n\n ${n}\n\n setOutput(result);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_backprop_gpu.js": +/*!***********************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_backprop_gpu.js ***! + \***********************************************************************************/ +/*! exports provided: ResizeBilinearBackpropProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ResizeBilinearBackpropProgram",(function(){return s})); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -5038,14 +5047,14 @@ const r=Object(o.createBinaryKernelConfig)(s.Maximum,!1)},"./node_modules/@tenso * limitations under the License. * ============================================================================= */ -let i;function a(e){const{backend:t,inputs:n,attrs:a}=e,{axis:d,keepDims:u}=a,{x:l}=n,c=t.dataIdMap.get(l.dataId).id;let f=c,p=l;const{transposed:m,axes:h,originalAxes:b,inputWasTransposed:j}=Object(r.permuteAxesAndTranspose)(l,d,t);let g=h;if(j){const e=t.dataIdMap.get(m.dataId).id;e!==c&&(p=m,f=e,g=s.backend_util.getInnerMostAxes(g.length,p.shape.length))}s.backend_util.assertAxesAreInnerMostDims("mean",g,p.shape.length);const[w,_]=s.backend_util.computeOutAndReduceShapes(p.shape,g),k=s.util.sizeFromShape(_);let v=p;"float32"!==p.dtype&&(v=Object(o.cast)({backend:t,inputs:{x:p},attrs:{dtype:"float32"}}),f=t.dataIdMap.get(v.dataId).id);const x=t.makeOutput(w,"float32");if(0!==s.util.sizeFromShape(p.shape)){const e=t.dataIdMap.get(x.dataId).id;i(f,k,e)}if(j&&t.disposeData(m.dataId),u){const e=s.backend_util.expandShapeToKeepDim(x.shape,b);x.shape=e}return"float32"!==p.dtype&&t.disposeData(v.dataId),x}const d={kernelName:s.Mean,backendName:"wasm",setupFunc:function(e){i=e.wasm.cwrap(s.Mean,null,["number, number, number"])},kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Min.js": -/*!************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Min.js ***! - \************************************************************************/ -/*! exports provided: minConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"minConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./kernel_utils */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/kernel_utils.js"); +class s{constructor(e,t,n){this.variableNames=["dy"],this.outputShape=[],this.outputShape=t;const[,s,o]=t,[,r,i]=e,a=[n&&r>1?s-1:s,n&&i>1?o-1:o],u=[n&&r>1?r-1:r,n&&i>1?i-1:i],d=a[0]/u[0],l=a[1]/u[1],c=1/d,f=1/l,p=2*Math.ceil(c)+2,m=2*Math.ceil(f)+2;this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n int r = coords[1];\n int c = coords[2];\n\n float accumulator = 0.0;\n\n const float heightScale = float(${d});\n const float widthScale = float(${l});\n\n const float invHeightScale = float(${c});\n const float invWidthScale = float(${f});\n\n const int winHeight = int(${p});\n const int winWidth = int(${m});\n\n // Compute bounds for where in dy we will look\n float startRLerp = floor(float(r) * invHeightScale);\n int startDyR = int(startRLerp - float(winHeight / 2));\n\n float startCLerp = floor(float(c) * invWidthScale);\n int startDyC = int(startCLerp - float(winWidth / 2));\n\n // Loop over dy\n for (int dyROffset = 0; dyROffset < winHeight; dyROffset++) {\n int dyR = dyROffset + startDyR;\n\n // Guard against the window exceeding the bounds of dy\n if (dyR < 0 || dyR >= ${r}) {\n continue;\n }\n\n for (int dyCOffset = 0; dyCOffset < winWidth; dyCOffset++) {\n int dyC = dyCOffset + startDyC;\n\n // Guard against the window exceeding the bounds of dy\n if (dyC < 0 || dyC >= ${i}) {\n continue;\n }\n\n float dxR = float(dyR) * heightScale;\n int topDxRIndex = int(floor(dxR));\n int bottomDxRIndex = int(min(ceil(dxR), ${s-1}.0));\n float dxRLerp = dxR - float(topDxRIndex);\n float inverseDxRLerp = 1.0 - dxRLerp;\n\n float dxC = float(dyC) * widthScale;\n int leftDxCIndex = int(floor(dxC));\n int rightDxCIndex = int(min(ceil(dxC), ${o-1}.0));\n float dxCLerp = dxC - float(leftDxCIndex);\n float inverseDxCLerp = 1.0 - dxCLerp;\n\n if (r == topDxRIndex && c == leftDxCIndex) {\n // topLeft\n accumulator +=\n getDy(b, dyR, dyC, d) * inverseDxRLerp * inverseDxCLerp;\n }\n\n if (r == topDxRIndex && c == rightDxCIndex) {\n // topRight\n accumulator += getDy(b, dyR, dyC, d) * inverseDxRLerp * dxCLerp;\n }\n\n if (r == bottomDxRIndex && c == leftDxCIndex) {\n // bottomLeft\n accumulator += getDy(b, dyR, dyC, d) * dxRLerp * inverseDxCLerp;\n }\n\n if (r == bottomDxRIndex && c == rightDxCIndex) {\n // bottomRight\n accumulator += getDy(b, dyR, dyC, d) * dxRLerp * dxCLerp;\n }\n }\n }\n // End loop over dy\n\n setOutput(accumulator);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_gpu.js": +/*!**************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_gpu.js ***! + \**************************************************************************/ +/*! exports provided: ResizeBilinearProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ResizeBilinearProgram",(function(){return s})); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2017 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -5059,11 +5068,11 @@ let i;function a(e){const{backend:t,inputs:n,attrs:a}=e,{axis:d,keepDims:u}=a,{x * limitations under the License. * ============================================================================= */ -let r;const i={kernelName:s.Min,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.Min,null,["number, number, number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:i}=e,{axis:a,keepDims:d}=i,{x:u}=n,l=t.dataIdMap.get(u.dataId).id;let c=l,f=u;const{transposed:p,axes:m,originalAxes:h,inputWasTransposed:b}=Object(o.permuteAxesAndTranspose)(u,a,t);if(b){const e=t.dataIdMap.get(p.dataId).id;e!==l&&(f=p,c=e)}const j=f.shape.length;s.backend_util.assertAxesAreInnerMostDims("min",m,j);const[g,w]=s.backend_util.computeOutAndReduceShapes(f.shape,m),_=s.util.sizeFromShape(w),k=t.makeOutput(g,f.dtype);if(0!==s.util.sizeFromShape(f.shape)){const e=t.dataIdMap.get(k.dataId).id;r(c,_,e)}if(b&&t.disposeData(p.dataId),d){const e=s.backend_util.expandShapeToKeepDim(k.shape,h);k.shape=e}return k}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Minimum.js": -/*!****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Minimum.js ***! - \****************************************************************************/ -/*! exports provided: minimumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"minimumConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); +class s{constructor(e,t,n,s,o){this.variableNames=["A"],this.outputShape=[];const[r,i,a,u]=e;this.outputShape=[r,t,n,u];const d=[s&&t>1?i-1:i,s&&n>1?a-1:a],l=[s&&t>1?t-1:t,s&&n>1?n-1:n];let c;c=o?"(vec2(yRC) + vec2(0.5)) * effectiveInputOverOutputRatioRC - vec2(0.5)":"vec2(yRC) * effectiveInputOverOutputRatioRC",this.userCode=`\n const vec2 effectiveInputOverOutputRatioRC = vec2(\n ${d[0]/l[0]},\n ${d[1]/l[1]});\n const vec2 inputShapeRC = vec2(${i}.0, ${a}.0);\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n ivec2 yRC = coords.yz;\n\n // Fractional source index.\n vec2 sourceFracIndexRC = ${c};\n\n // Compute the four integer indices.\n ivec2 sourceFloorRC = ivec2(max(sourceFracIndexRC, vec2(0.0)));\n ivec2 sourceCeilRC = ivec2(\n min(inputShapeRC - 1.0, ceil(sourceFracIndexRC)));\n\n float topLeft = getA(b, sourceFloorRC.x, sourceFloorRC.y, d);\n float bottomLeft = getA(b, sourceCeilRC.x, sourceFloorRC.y, d);\n float topRight = getA(b, sourceFloorRC.x, sourceCeilRC.y, d);\n float bottomRight = getA(b, sourceCeilRC.x, sourceCeilRC.y, d);\n\n vec2 fracRC = sourceFracIndexRC - vec2(sourceFloorRC);\n\n float top = topLeft + (topRight - topLeft) * fracRC.y;\n float bottom = bottomLeft + (bottomRight - bottomLeft) * fracRC.y;\n float newValue = top + (bottom - top) * fracRC.x;\n\n setOutput(newValue);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_packed_gpu.js": +/*!*********************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_packed_gpu.js ***! + \*********************************************************************************/ +/*! exports provided: ResizeBilinearPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ResizeBilinearPackedProgram",(function(){return s})); /** * @license * Copyright 2019 Google LLC. All Rights Reserved. @@ -5080,18 +5089,14 @@ let r;const i={kernelName:s.Min,backendName:"wasm",setupFunc:function(e){r=e.was * limitations under the License. * ============================================================================= */ -const r=Object(o.createBinaryKernelConfig)(s.Minimum,!1)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/MirrorPad.js": -/*!******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/MirrorPad.js ***! - \******************************************************************************/ -/*! exports provided: mirrorPadConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"mirrorPadConfig",(function(){return a}));var s,o=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),r=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js");let i;!function(e){e[e.reflect=0]="reflect",e[e.symmetric=1]="symmetric"}(s||(s={}));const a={kernelName:o.MirrorPad,backendName:"wasm",kernelFunc:function(e){const{inputs:{x:t},backend:n,attrs:{paddings:o,mode:a}}=e,d=o.map(((e,n)=>e[0]+t.shape[n]+e[1])),u=n.dataIdMap.get(t.dataId).id,l=n.makeOutput(d,t.dtype),c=n.dataIdMap.get(l.dataId).id,f=new Uint8Array(new Int32Array(t.shape).buffer),p=o.map((e=>e[0])),m=o.map((e=>e[1])),h=new Uint8Array(new Int32Array(p).buffer),b=new Uint8Array(new Int32Array(m).buffer);return i(u,f,t.shape.length,r.CppDType[t.dtype],h,b,s[a],c),l},setupFunc:function(e){i=e.wasm.cwrap(o.MirrorPad,null,["number","array","number","number","array","array","number","number"])}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Multiply.js": -/*!*****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Multiply.js ***! - \*****************************************************************************/ -/*! exports provided: multiplyConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"multiplyConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); +class s{constructor(e,t,n,s,o){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=[];const[r,i,a,u]=e;this.outputShape=[r,t,n,u];const d=[s&&t>1?i-1:i,s&&n>1?a-1:a],l=[s&&t>1?t-1:t,s&&n>1?n-1:n];let c;c=o?"(vec3(yRC) + vec3(0.5)) * effectiveInputOverOutputRatioRC - vec3(0.5)":"vec3(yRC) * effectiveInputOverOutputRatioRC",this.userCode=`\n const vec3 effectiveInputOverOutputRatioRC = vec3(\n ${d[0]/l[0]},\n ${d[1]/l[1]},\n ${d[1]/l[1]});\n const vec3 inputShapeRC = vec3(${i}.0, ${a}.0,\n ${a}.0);\n\n float getAValue(int b, int r, int c, int d) {\n return getChannel(getA(b, r, c, d), vec2(c, d));\n }\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n // Calculate values for next column in yRC.z.\n ivec3 yRC = coords.yzz + ivec3(0, 0, 1);\n\n // Fractional source index.\n vec3 sourceFracIndexRC = ${c};\n\n // Compute the four integer indices.\n ivec3 sourceFloorRC = ivec3(max(sourceFracIndexRC, vec3(0.0)));\n ivec3 sourceCeilRC = ivec3(\n min(inputShapeRC - 1.0, ceil(sourceFracIndexRC)));\n\n // Should we calculate next column and row elements in 2x2 packed cell.\n bool hasNextCol = d < ${u-1};\n bool hasNextRow = coords.z < ${n-1};\n\n // In parallel, construct four corners for all four components in\n // packed 2x2 cell.\n vec4 topLeft = vec4(\n getAValue(b, sourceFloorRC.x, sourceFloorRC.y, d),\n hasNextCol ? getAValue(b, sourceFloorRC.x, sourceFloorRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceFloorRC.x, sourceFloorRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceFloorRC.x, sourceFloorRC.z, d + 1) : 0.0);\n\n vec4 bottomLeft = vec4(\n getAValue(b, sourceCeilRC.x, sourceFloorRC.y, d),\n hasNextCol ? getAValue(b, sourceCeilRC.x, sourceFloorRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceCeilRC.x, sourceFloorRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceCeilRC.x, sourceFloorRC.z, d + 1) : 0.0);\n\n vec4 topRight = vec4(\n getAValue(b, sourceFloorRC.x, sourceCeilRC.y, d),\n hasNextCol ? getAValue(b, sourceFloorRC.x, sourceCeilRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceFloorRC.x, sourceCeilRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceFloorRC.x, sourceCeilRC.z, d + 1) : 0.0);\n\n vec4 bottomRight = vec4(\n getAValue(b, sourceCeilRC.x, sourceCeilRC.y, d),\n hasNextCol ? getAValue(b, sourceCeilRC.x, sourceCeilRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceCeilRC.x, sourceCeilRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceCeilRC.x, sourceCeilRC.z, d + 1) : 0.0);\n\n vec3 fracRC = sourceFracIndexRC - vec3(sourceFloorRC);\n\n vec4 top = mix(topLeft, topRight, fracRC.yyzz);\n vec4 bottom = mix(bottomLeft, bottomRight, fracRC.yyzz);\n vec4 newValue = mix(top, bottom, fracRC.x);\n\n setOutput(newValue);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_backprop_gpu.js": +/*!*******************************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_backprop_gpu.js ***! + \*******************************************************************************************/ +/*! exports provided: ResizeNearestNeigborBackpropProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ResizeNearestNeigborBackpropProgram",(function(){return s})); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -5105,14 +5110,14 @@ const r=Object(o.createBinaryKernelConfig)(s.Minimum,!1)},"./node_modules/@tenso * limitations under the License. * ============================================================================= */ -const r=Object(o.createBinaryKernelConfig)(s.Multiply,!0)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Neg.js": -/*!************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Neg.js ***! - \************************************************************************/ -/*! exports provided: negConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"negConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); +class s{constructor(e,t,n){this.variableNames=["dy"],this.outputShape=[],this.outputShape=t;const[,s,o]=t,[,r,i]=e,a=[n&&r>1?s-1:s,n&&i>1?o-1:o],u=[n&&r>1?r-1:r,n&&i>1?i-1:i],d=a[0]/u[0],l=a[1]/u[1],c=1/d,f=1/l,p=2*Math.ceil(c)+2,m=2*Math.ceil(f)+2;this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n int r = coords[1];\n int c = coords[2];\n\n float accumulator = 0.0;\n\n const float heightScale = float(${d});\n const float widthScale = float(${l});\n\n const float invHeightScale = float(${c});\n const float invWidthScale = float(${f});\n\n const int winHeight = int(${p});\n const int winWidth = int(${m});\n\n // Compute bounds for where in dy we will look\n float startRLerp = floor(float(r) * invHeightScale);\n int startDyR = int(floor(startRLerp - float(winHeight / 2)));\n\n float startCLerp = floor(float(c) * invWidthScale);\n int startDyC = int(floor(startCLerp - float(winWidth / 2)));\n\n // Loop over dy\n for (int dyROffset = 0; dyROffset < winHeight; dyROffset++) {\n int dyR = dyROffset + startDyR;\n\n // Guard against the window exceeding the bounds of dy\n if (dyR < 0 || dyR >= ${r}) {\n continue;\n }\n\n for (int dyCOffset = 0; dyCOffset < winWidth; dyCOffset++) {\n int dyC = dyCOffset + startDyC;\n\n // Guard against the window exceeding the bounds of dy\n if (dyC < 0 || dyC >= ${i}) {\n continue;\n }\n\n float sourceFracRow =\n float(${a[0]}) *\n (float(dyR) / float(${u[0]}));\n\n float sourceFracCol =\n float(${a[1]}) *\n (float(dyC) / float(${u[1]}));\n\n int sourceNearestRow = int(min(\n float(int(${s}) - 1),\n ${n} ? float(round(sourceFracRow)) :\n float(floor(sourceFracRow))));\n\n int sourceNearestCol = int(min(\n float(int(${o}) - 1),\n ${n} ? float(round(sourceFracCol)) :\n float(floor(sourceFracCol))));\n\n if (r == sourceNearestRow && c == sourceNearestCol) {\n accumulator += getDy(b, dyR, dyC, d);\n }\n }\n }\n // End loop over dy\n\n setOutput(accumulator);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_gpu.js": +/*!**********************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_gpu.js ***! + \**********************************************************************************/ +/*! exports provided: ResizeNearestNeighborProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ResizeNearestNeighborProgram",(function(){return s})); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -5126,11 +5131,11 @@ const r=Object(o.createBinaryKernelConfig)(s.Multiply,!0)},"./node_modules/@tens * limitations under the License. * ============================================================================= */ -const r=Object(o.createUnaryKernelConfig)(s.Neg)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NonMaxSuppressionV3.js": -/*!****************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NonMaxSuppressionV3.js ***! - \****************************************************************************************/ -/*! exports provided: nonMaxSuppressionV3Config */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionV3Config",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./NonMaxSuppression_util */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NonMaxSuppression_util.js"); +class s{constructor(e,t,n,s,o){this.variableNames=["A"],this.outputShape=[];const[r,i,a,u]=e;this.outputShape=[r,t,n,u];const d=[s&&t>1?i-1:i,s&&n>1?a-1:a],l=[s&&t>1?t-1:t,s&&n>1?n-1:n],c=s?"0.5":"0.0";let f;f=o?"max((vec2(yRC) + vec2(0.5)) * effectiveInputOverOutputRatioRC, vec2(0.0))":"vec2(yRC) * effectiveInputOverOutputRatioRC",this.userCode=`\n const vec2 effectiveInputOverOutputRatioRC = vec2(\n ${d[0]/l[0]},\n ${d[1]/l[1]});\n const vec2 inputShapeRC = vec2(${i}.0, ${a}.0);\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n ivec2 yRC = coords.yz;\n\n // Fractional source index.\n vec2 sourceFracIndexRC = ${f};\n\n // Compute the coordinators of nearest neighbor point.\n ivec2 sourceNearestRC = ivec2(\n min(inputShapeRC - 1.0, floor(sourceFracIndexRC + ${c})));\n float newValue = getA(b, sourceNearestRC.x, sourceNearestRC.y, d);\n\n setOutput(newValue);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_packed_gpu.js": +/*!*****************************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_packed_gpu.js ***! + \*****************************************************************************************/ +/*! exports provided: ResizeNearestNeighborPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ResizeNearestNeighborPackedProgram",(function(){return s})); /** * @license * Copyright 2019 Google LLC. All Rights Reserved. @@ -5147,14 +5152,14 @@ const r=Object(o.createUnaryKernelConfig)(s.Neg)},"./node_modules/@tensorflow/tf * limitations under the License. * ============================================================================= */ -let r;const i={kernelName:s.NonMaxSuppressionV3,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.NonMaxSuppressionV3,"number",["number","number","number","number","number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:s}=e,{iouThreshold:i,maxOutputSize:a,scoreThreshold:d}=s,{boxes:u,scores:l}=n,c=t.dataIdMap.get(u.dataId).id,f=t.dataIdMap.get(l.dataId).id,p=r(c,f,a,i,d),{pSelectedIndices:m,selectedSize:h,pSelectedScores:b,pValidOutputs:j}=Object(o.parseResultStruct)(t,p);return t.wasm._free(b),t.wasm._free(j),t.makeOutput([h],"int32",m)}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NonMaxSuppressionV4.js": -/*!****************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NonMaxSuppressionV4.js ***! - \****************************************************************************************/ -/*! exports provided: nonMaxSuppressionV4Config */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionV4Config",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./NonMaxSuppression_util */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NonMaxSuppression_util.js"); +class s{constructor(e,t,n,s,o){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=[];const[r,i,a,u]=e;this.outputShape=[r,t,n,u];const d=[s&&t>1?i-1:i,s&&n>1?a-1:a],l=[s&&t>1?t-1:t,s&&n>1?n-1:n],c=s?"0.5":"0.0";let f;f=o?"max((vec3(yRC) + vec3(0.5)) * effectiveInputOverOutputRatioRC, vec3(0.0))":"vec3(yRC) * effectiveInputOverOutputRatioRC",this.userCode=`\n const vec3 effectiveInputOverOutputRatioRC = vec3(\n ${d[0]/l[0]},\n ${d[1]/l[1]},\n ${d[1]/l[1]});\n const vec3 inputShapeRC = vec3(${i}.0, ${a}.0,\n ${a}.0);\n\n float getAValue(int b, int r, int c, int d) {\n return getChannel(getA(b, r, c, d), vec2(c, d));\n }\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n // Calculate values for next column in yRC.z.\n ivec3 yRC = coords.yzz + ivec3(0, 0, 1);\n\n // Fractional source index.\n vec3 sourceFracIndexRC = ${f};\n\n // Compute the coordinators of nearest neighbor point.\n ivec3 sourceNearestRC = ivec3(\n min(inputShapeRC - 1.0, floor(sourceFracIndexRC + ${c})));\n\n // Should we calculate next column and row elements in 2x2 packed cell.\n bool hasNextCol = d < ${u-1};\n bool hasNextRow = coords.z < ${n-1};\n\n vec4 newValue = vec4(\n getAValue(b, sourceNearestRC.x, sourceNearestRC.y, d),\n hasNextCol ? getAValue(b, sourceNearestRC.x, sourceNearestRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceNearestRC.x, sourceNearestRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceNearestRC.x, sourceNearestRC.z, d + 1) : 0.0);\n\n setOutput(newValue);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/reverse_gpu.js": +/*!******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/reverse_gpu.js ***! + \******************************************************************/ +/*! exports provided: ReverseProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ReverseProgram",(function(){return o}));var s=n(/*! ./shader_compiler */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2017 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -5167,12 +5172,11 @@ let r;const i={kernelName:s.NonMaxSuppressionV3,backendName:"wasm",setupFunc:fun * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -let r;const i={kernelName:s.NonMaxSuppressionV4,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.NonMaxSuppressionV4,"number",["number","number","number","number","number","bool"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:s}=e,{iouThreshold:i,maxOutputSize:a,scoreThreshold:d,padToMaxOutputSize:u}=s,{boxes:l,scores:c}=n,f=t.dataIdMap.get(l.dataId).id,p=t.dataIdMap.get(c.dataId).id,m=r(f,p,a,i,d,u),{pSelectedIndices:h,selectedSize:b,pSelectedScores:j,pValidOutputs:g}=Object(o.parseResultStruct)(t,m);return t.wasm._free(j),[t.makeOutput([b],"int32",h),t.makeOutput([],"int32",g)]}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NonMaxSuppressionV5.js": -/*!****************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NonMaxSuppressionV5.js ***! - \****************************************************************************************/ -/*! exports provided: nonMaxSuppressionV5Config */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionV5Config",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./NonMaxSuppression_util */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NonMaxSuppression_util.js"); + */class o{constructor(e,t){this.variableNames=["x"];const n=e.length;if(n>4)throw new Error(`WebGL backend: Reverse of rank-${n} tensor is not yet supported`);if(this.outputShape=e,1===n)return void(this.userCode=`\n void main() {\n int coord = getOutputCoords();\n setOutput(getX(${e[0]} - coord - 1));\n }\n `);const o=e.map(((n,s)=>(n=>-1!==t.indexOf(n)&&1!==e[n]?`${e[n]} - coords[${n}] - 1`:`coords[${n}]`)(s))).join(","),r=Object(s.getCoordsDataType)(n);this.userCode=`\n void main() {\n ${r} coords = getOutputCoords();\n setOutput(getX(${o}));\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/reverse_packed_gpu.js": +/*!*************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/reverse_packed_gpu.js ***! + \*************************************************************************/ +/*! exports provided: ReversePackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ReversePackedProgram",(function(){return r}));var s=n(/*! ./packing_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/packing_util.js"),o=n(/*! ./shader_compiler */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); /** * @license * Copyright 2019 Google LLC. All Rights Reserved. @@ -5189,14 +5193,14 @@ let r;const i={kernelName:s.NonMaxSuppressionV4,backendName:"wasm",setupFunc:fun * limitations under the License. * ============================================================================= */ -let r;const i={kernelName:s.NonMaxSuppressionV5,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.NonMaxSuppressionV5,"number",["number","number","number","number","number","number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:s}=e,{iouThreshold:i,maxOutputSize:a,scoreThreshold:d,softNmsSigma:u}=s,{boxes:l,scores:c}=n,f=t.dataIdMap.get(l.dataId).id,p=t.dataIdMap.get(c.dataId).id,m=r(f,p,a,i,d,u),{pSelectedIndices:h,selectedSize:b,pSelectedScores:j,pValidOutputs:g}=Object(o.parseResultStruct)(t,m);return t.wasm._free(g),[t.makeOutput([b],"int32",h),t.makeOutput([b],"float32",j)]}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NonMaxSuppression_util.js": -/*!*******************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NonMaxSuppression_util.js ***! - \*******************************************************************************************/ -/*! exports provided: parseResultStruct */function(e,t,n){"use strict"; +class r{constructor(e,t){this.variableNames=["x"],this.packedInputs=!0,this.packedOutput=!0;const n=e.length;if(n>4)throw new Error(`WebGL backend: Reverse of rank-${n} tensor is not yet supported`);this.outputShape=e;const r=Object(s.getChannels)("rc",n),i=`${r[n-1]} + 1 < ${this.outputShape[n-1]}`,a=`${r[n-2]} + 1 < ${this.outputShape[n-2]}`,u=Object(o.getCoordsDataType)(n);function d(n){const s=e.map(((s,o)=>function(n,s){return-1!==t.indexOf(n)&&1!==e[n]?`${e[n]} - ${s[n]} - 1`:`${s[n]}`}(o,n)));return`getChannel(getX(${s.join(",")}), vec2(${s.slice(-2).join(",")}))`}this.userCode=1===n?`\n void main(){\n int rc = getOutputCoords();\n vec4 result = vec4(0.);\n result.r = getChannel(getX(${e[0]} - rc - 1),\n ${e[0]} - rc - 1);\n if(${i}){\n result.g = getChannel(getX(${e[0]} - (rc + 1) - 1),\n ${e[0]} - (rc + 1) - 1);\n }\n setOutput(result);\n }\n `:`\n void main() {\n ${u} rc = getOutputCoords();\n vec4 result = vec4(0.);\n result.r = ${function(e){return d(e)}(r.slice())};\n if(${i}){\n result.g = ${function(e){return e[n-1]="("+e[n-1]+" + 1)",d(e)}(r.slice())};\n }\n if(${a}) {\n result.b = ${function(e){return e[n-2]="("+e[n-2]+" + 1)",d(e)}(r.slice())};\n if(${i}) {\n result.a = ${function(e){return e[n-1]="("+e[n-1]+" + 1)",e[n-2]="("+e[n-2]+" + 1)",d(e)}(r.slice())};\n }\n }\n setOutput(result);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/rotate_gpu.js": +/*!*****************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/rotate_gpu.js ***! + \*****************************************************************/ +/*! exports provided: RotateProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"RotateProgram",(function(){return s})); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -5210,14 +5214,14 @@ let r;const i={kernelName:s.NonMaxSuppressionV5,backendName:"wasm",setupFunc:fun * limitations under the License. * ============================================================================= */ -function s(e,t){const n=new Int32Array(e.wasm.HEAPU8.buffer,t,4),s=n[0],o=n[1],r=n[2],i=n[3];return e.wasm._free(t),{pSelectedIndices:s,selectedSize:o,pSelectedScores:r,pValidOutputs:i}}n.r(t),n.d(t,"parseResultStruct",(function(){return s}))},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NotEqual.js": -/*!*****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NotEqual.js ***! - \*****************************************************************************/ -/*! exports provided: notEqualConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"notEqualConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); +class s{constructor(e,t){this.variableNames=["Image"],this.outputShape=[],this.customUniforms=[{name:"params",type:"vec4"}];const n=e[1],s=e[2];this.outputShape=e;let o="";o="number"==typeof t?`float outputValue = ${t.toFixed(2)};`:`\n vec3 fill = vec3(${t.join(",")});\n float outputValue = fill[coords[3]];`,this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int x = coords[2];\n int y = coords[1];\n float coordXFloat = (float(x) - params[0]) * params[3] -\n (float(y) - params[1]) * params[2];\n float coordYFloat = (float(x) - params[0]) * params[2] +\n (float(y) - params[1]) * params[3];\n int coordX = int(round(coordXFloat + params[0]));\n int coordY = int(round(coordYFloat + params[1]));\n ${o}\n if(coordX >= 0 && coordX < ${s} && coordY >= 0 && coordY < ${n}) {\n outputValue = getImage(coords[0], coordY, coordX, coords[3]);\n }\n setOutput(outputValue);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/scatter_gpu.js": +/*!******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/scatter_gpu.js ***! + \******************************************************************/ +/*! exports provided: ScatterProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ScatterProgram",(function(){return o}));var s=n(/*! ./shader_compiler */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -5230,15 +5234,14 @@ function s(e,t){const n=new Int32Array(e.wasm.HEAPU8.buffer,t,4),s=n[0],o=n[1],r * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -const r=Object(o.createBinaryKernelConfig)(s.NotEqual,!1,"bool")},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/OneHot.js": -/*!***************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/OneHot.js ***! - \***************************************************************************/ -/*! exports provided: oneHotConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"oneHotConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); + */class o{constructor(e,t,n,o,r,i,a=!0){this.variableNames=["updates","indices","defaultValue"],this.outputShape=i;const u=Object(s.getCoordsDataType)(r.length),d=Object(s.getCoordsDataType)(i.length);let l="";1===n?l="i":2===n&&(l="i, j");const c=`getIndices(${l})`;let f="";1===o?f="i":2===o&&(f="i, coords[1]");const p=`getUpdates(${f})`,m=t>1?"strides[j]":"strides";this.userCode=`\n ${u} strides = ${u}(${r});\n\n void main() {\n ${d} coords = getOutputCoords();\n float sum = 0.0;\n bool found = false;\n for (int i = 0; i < ${e}; i++) {\n int flattenedIndex = 0;\n for (int j = 0; j < ${t}; j++) {\n int index = round(${c});\n flattenedIndex += index * ${m};\n }\n if (flattenedIndex == coords[0]) {\n sum += ${p};\n found = true;\n }\n }\n setOutput(mix(getDefaultValue(), sum, float(found)));\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/segment_gpu.js": +/*!******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/segment_gpu.js ***! + \******************************************************************/ +/*! exports provided: SegmentOpProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"SegmentOpProgram",(function(){return s})); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -5251,14 +5254,15 @@ const r=Object(o.createBinaryKernelConfig)(s.NotEqual,!1,"bool")},"./node_module * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */let o;const r={kernelName:s.OneHot,backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.OneHot,null,["number","number","number","number","number"])},kernelFunc:function(e){const{inputs:t,backend:n,attrs:s}=e,{indices:r}=t,{depth:i,onValue:a,offValue:d}=s,u=n.makeOutput([...r.shape,i],"int32"),l=n.dataIdMap.get(u.dataId).id,c=n.dataIdMap.get(r.dataId).id;return o(c,i,a,d,l),u}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/OnesLike.js": -/*!*****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/OnesLike.js ***! - \*****************************************************************************/ -/*! exports provided: onesLikeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"onesLikeConfig",(function(){return s}));const s={kernelName:n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js").OnesLike,backendName:"wasm",kernelFunc: + */ +class s{constructor(e,t){this.variableNames=["x","segmentIds"];const n=e.windowSize,s=e.batchSize,o=e.inSize,r=e.numSegments,i=r*Math.ceil(o/n);this.outputShape=[s,i];const a=4*Math.floor(n/4),u=n%4,d="\n sumValue += dot(values, segFilter);\n ";let l="";o%n>0&&(l=`\n if (inIdx < 0 || inIdx >= ${o}) {\n return initializationValue;\n }\n `);let c="";o%n>0&&(c=`\n if (inIdx < 0 || inIdx >= ${o}) {\n return -1.0;\n }\n `),this.userCode=`\n const float initializationValue = 0.0;\n\n float getValue(int batch, int inIdx) {\n ${l}\n return getX(batch, inIdx);\n }\n\n float getSegmentIdAtIndex(int inIdx) {\n ${c}\n return getSegmentIds(inIdx);\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = int(floor(float(outIdx) / float(\n ${r})) * float(${n}));\n int currentSeg = int(mod(float(outIdx), float(${r})));\n\n float sumValue = 0.0;\n\n for (int i = 0; i < ${a}; i += 4) {\n int inIdx = inOffset + i;\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n getValue(batch, inIdx + 3)\n );\n\n vec4 segFilter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 2)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 3)) == currentSeg ? 1 : 0\n );\n\n ${d}\n }\n\n int inIdx = inOffset + ${a};\n if (${1===u}) {\n vec4 values = vec4(\n getValue(batch, inIdx),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n int inIdxSeg = int(getSegmentIdAtIndex(inIdx));\n\n vec4 segFilter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n 0,\n 0,\n 0\n );\n\n ${d}\n } else if (${2===u}) {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n initializationValue,\n initializationValue\n );\n\n vec4 segFilter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\n 0,\n 0\n );\n\n ${d}\n } else if (${3===u}) {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n initializationValue\n );\n\n vec4 segFilter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 2)) == currentSeg ? 1 : 0,\n 0\n );\n\n ${d}\n }\n setOutput(sumValue);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/select_gpu.js": +/*!*****************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/select_gpu.js ***! + \*****************************************************************/ +/*! exports provided: SelectProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"SelectProgram",(function(){return o}));var s=n(/*! ./shader_compiler */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2017 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -5271,15 +5275,14 @@ const r=Object(o.createBinaryKernelConfig)(s.NotEqual,!1,"bool")},"./node_module * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -function(e){const{inputs:{x:t},backend:n}=e,s=n.makeOutput(t.shape,t.dtype);return n.typedArrayFromHeap(s).fill(1),s}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Pack.js": -/*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Pack.js ***! - \*************************************************************************/ -/*! exports provided: pack, packConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"pack",(function(){return i})),n.d(t,"packConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Concat */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Concat.js"),r=n(/*! ./ExpandDims */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ExpandDims.js"); + */class o{constructor(e,t,n){let o,r;if(this.variableNames=["c","a","b"],this.outputShape=t,n>4)throw Error(`Where for rank ${n} is not yet supported`);if(1===n)r="resRC",o="resRC";else{const n=["resRC.x","resRC.y","resRC.z","resRC.w"],s=[],i=[];for(let o=0;o= 1.0) {\n setOutput(getA(${r}));\n } else {\n setOutput(getB(${r}));\n }\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js": +/*!**********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js ***! + \**********************************************************************/ +/*! exports provided: makeShader, getCoordsDataType, getUniformInfoFromShape, squeezeInputInfo */function(e,t,n){"use strict";n.r(t),n.d(t,"makeShader",(function(){return a})),n.d(t,"getCoordsDataType",(function(){return j})),n.d(t,"getUniformInfoFromShape",(function(){return g})),n.d(t,"squeezeInputInfo",(function(){return w}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./glsl_version */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"),r=n(/*! ./shader_compiler_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2017 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -5293,14 +5296,14 @@ function(e){const{inputs:{x:t},backend:n}=e,s=n.makeOutput(t.shape,t.dtype);retu * limitations under the License. * ============================================================================= */ -function i(e){const{inputs:t,backend:n,attrs:i}=e,{axis:a}=i;if(1===t.length)return Object(r.expandDims)({inputs:{input:t[0]},backend:n,attrs:{dim:a}});const d=t[0].shape,u=t[0].dtype;t.forEach((e=>{s.util.assertShapesMatch(d,e.shape,"All tensors passed to stack must have matching shapes"),s.util.assert(u===e.dtype,(()=>"All tensors passed to stack must have matching dtypes"))}));const l=[],c=t.map((e=>{const t=Object(r.expandDims)({inputs:{input:e},backend:n,attrs:{dim:a}});return l.push(t),t})),f=Object(o.concat)({inputs:c,backend:n,attrs:{axis:a}});return l.forEach((e=>n.disposeData(e.dataId))),f}const a={kernelName:s.Pack,backendName:"wasm",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/PadV2.js": -/*!**************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/PadV2.js ***! - \**************************************************************************/ -/*! exports provided: padV2Config */function(e,t,n){"use strict";n.r(t),n.d(t,"padV2Config",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); +const{getBroadcastDims:i}=s.backend_util;function a(e,t,n){const a=[];if(e.forEach((e=>{const t=s.util.sizeFromShape(e.shapeInfo.logicalShape);if(e.shapeInfo.isUniform?a.push(`uniform float ${e.name}${t>1?`[${t}]`:""};`):(a.push(`uniform sampler2D ${e.name};`),a.push(`uniform int offset${e.name};`)),n.enableShapeUniforms){const{uniformShape:t}=g(n.packedInputs,e.shapeInfo.logicalShape,e.shapeInfo.texShape);switch(t.length){case 1:a.push(`uniform int ${e.name}Shape;`);break;case 2:a.push(`uniform ivec2 ${e.name}Shape;`);break;case 3:a.push(`uniform ivec3 ${e.name}Shape;`);break;case 4:a.push(`uniform ivec4 ${e.name}Shape;`)}a.push(`uniform ivec2 ${e.name}TexShape;`)}})),n.enableShapeUniforms){switch(t.logicalShape.length){case 1:a.push("uniform int outShape;");break;case 2:a.push("uniform ivec2 outShape;"),a.push("uniform int outShapeStrides;");break;case 3:a.push("uniform ivec3 outShape;"),a.push("uniform ivec2 outShapeStrides;");break;case 4:a.push("uniform ivec4 outShape;"),a.push("uniform ivec3 outShapeStrides;")}a.push("uniform ivec2 outTexShape;")}n.customUniforms&&n.customUniforms.forEach((e=>{a.push(`uniform ${e.type} ${e.name}${e.arrayIndex?`[${e.arrayIndex}]`:""};`)}));const h=a.join("\n"),b=e.map((e=>function(e,t,n=!1,o){let r="";r+=n?d(e,o):u(e,o);const a=e.shapeInfo.logicalShape,l=t.logicalShape;a.length<=l.length&&(r+=n?function(e,t){const n=e.name,o=n.charAt(0).toUpperCase()+n.slice(1),r="get"+o+"AtOutCoords",a=e.shapeInfo.logicalShape.length,u=t.logicalShape.length,d=i(e.shapeInfo.logicalShape,t.logicalShape),l=j(u),c=u-a;let f;const p=["x","y","z","w","u","v"];f=0===a?"":u<2&&d.length>=1?"coords = 0;":d.map((e=>`coords.${p[e+c]} = 0;`)).join("\n");let m="";m=u<2&&a>0?"coords":e.shapeInfo.logicalShape.map(((e,t)=>`coords.${p[t+c]}`)).join(", ");let h="return outputValue;";const b=1===s.util.sizeFromShape(e.shapeInfo.logicalShape),g=1===s.util.sizeFromShape(t.logicalShape);if(1!==a||b||g){if(b&&!g)h=1===u?"\n return vec4(outputValue.x, outputValue.x, 0., 0.);\n ":"\n return vec4(outputValue.x);\n ";else if(d.length){const e=a-2,t=a-1;d.indexOf(e)>-1&&d.indexOf(t)>-1?h="return vec4(outputValue.x);":d.indexOf(e)>-1?h="return vec4(outputValue.x, outputValue.y, outputValue.x, outputValue.y);":d.indexOf(t)>-1&&(h="return vec4(outputValue.xx, outputValue.zz);")}}else h="\n return vec4(outputValue.xy, outputValue.xy);\n ";return`\n vec4 ${r}() {\n ${l} coords = getOutputCoords();\n ${f}\n vec4 outputValue = get${o}(${m});\n ${h}\n }\n `}(e,t):function(e,t){const n=e.name,o=n.charAt(0).toUpperCase()+n.slice(1),r="get"+o+"AtOutCoords",a=t.texShape,u=e.shapeInfo.texShape,d=e.shapeInfo.logicalShape.length,l=t.logicalShape.length;if(!e.shapeInfo.isUniform&&d===l&&null==e.shapeInfo.flatOffset&&s.util.arraysEqual(u,a))return`\n float ${r}() {\n return sampleTexture(${n}, resultUV);\n }\n `;const c=j(l),f=i(e.shapeInfo.logicalShape,t.logicalShape),p=l-d;let m;const h=["x","y","z","w","u","v"];m=0===d?"":l<2&&f.length>=1?"coords = 0;":f.map((e=>`coords.${h[e+p]} = 0;`)).join("\n");let b="";b=l<2&&d>0?"coords":e.shapeInfo.logicalShape.map(((e,t)=>`coords.${h[t+p]}`)).join(", ");return`\n float ${r}() {\n ${c} coords = getOutputCoords();\n ${m}\n return get${o}(${b});\n }\n `}(e,t));return r}(e,t,n.packedInputs,n.enableShapeUniforms))).join("\n"),w=t.texShape,_=Object(o.getGlslDifferences)(),k=function(e){return`\n float sampleTexture(sampler2D textureSampler, vec2 uv) {\n return ${e.texture2D}(textureSampler, uv).r;\n }\n `}(_);let v,x,y=function(e){return`${e.version}\n precision highp float;\n precision highp int;\n precision highp sampler2D;\n ${e.varyingFs} vec2 resultUV;\n ${e.defineOutput}\n const vec2 halfCR = vec2(0.5, 0.5);\n\n struct ivec5\n {\n int x;\n int y;\n int z;\n int w;\n int u;\n };\n\n struct ivec6\n {\n int x;\n int y;\n int z;\n int w;\n int u;\n int v;\n };\n\n uniform float NAN;\n ${e.defineSpecialNaN}\n ${e.defineSpecialInf}\n ${e.defineRound}\n\n int imod(int x, int y) {\n return x - y * (x / y);\n }\n\n int idiv(int a, int b, float sign) {\n int res = a / b;\n int mod = imod(a, b);\n if (sign < 0. && mod != 0) {\n res -= 1;\n }\n return res;\n }\n\n //Based on the work of Dave Hoskins\n //https://www.shadertoy.com/view/4djSRW\n #define HASHSCALE1 443.8975\n float random(float seed){\n vec2 p = resultUV * seed;\n vec3 p3 = fract(vec3(p.xyx) * HASHSCALE1);\n p3 += dot(p3, p3.yzx + 19.19);\n return fract((p3.x + p3.y) * p3.z);\n }\n\n ${l}\n ${c}\n ${f}\n `}(_);t.isPacked?(v=function(e,t,n){switch(e.length){case 0:return m();case 1:return function(e,t,n){const s=[Math.ceil(t[0]/2),Math.ceil(t[1]/2)];if(1===s[0])return n?"\n int getOutputCoords() {\n return 2 * int(resultUV.x * ceil(float(outTexShape[1]) / 2.0));\n }\n ":`\n int getOutputCoords() {\n return 2 * int(resultUV.x * ${s[1]}.0);\n }\n `;if(1===s[1])return n?"\n int getOutputCoords() {\n return 2 * int(resultUV.y * ceil(float(outTexShape[0]) / 2.0));\n }\n ":`\n int getOutputCoords() {\n return 2 * int(resultUV.y * ${s[0]}.0);\n }\n `;if(n)return"\n int getOutputCoords() {\n ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0));\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(packedTexShape[0], packedTexShape[1]));\n return 2 * (resTexRC.x * packedTexShape[1] + resTexRC.y);\n }\n ";return`\n int getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(${s[0]}, ${s[1]}));\n return 2 * (resTexRC.x * ${s[1]} + resTexRC.y);\n }\n `}(0,t,n);case 2:return function(e,t,n){const o=[Math.ceil(t[0]/2),Math.ceil(t[1]/2)];if(s.util.arraysEqual(e,t))return n?"\n ivec2 getOutputCoords() {\n ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0));\n return 2 * ivec2(resultUV.yx * vec2(packedTexShape[0], packedTexShape[1]));\n }\n ":`\n ivec2 getOutputCoords() {\n return 2 * ivec2(resultUV.yx * vec2(${o[0]}, ${o[1]}));\n }\n `;const r=Math.ceil(e[1]/2);if(n)return"\n ivec2 getOutputCoords() {\n ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0));\n int texelsInLogicalRow = int(ceil(float(outShape[1]) / 2.0));\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(packedTexShape[0], packedTexShape[1]));\n\n int index = resTexRC.x * packedTexShape[1] + resTexRC.y;\n int r = 2 * (index / texelsInLogicalRow);\n int c = imod(index, texelsInLogicalRow) * 2;\n\n return ivec2(r, c);\n }\n ";return`\n ivec2 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(${o[0]}, ${o[1]}));\n\n int index = resTexRC.x * ${o[1]} + resTexRC.y;\n int r = 2 * (index / ${r});\n int c = imod(index, ${r}) * 2;\n\n return ivec2(r, c);\n }\n `}(e,t,n);case 3:return function(e,t,n){if(n)return"\n ivec3 getOutputCoords() {\n ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0));\n int texelsInLogicalRow = int(ceil(float(outShape[2]) / 2.0));\n int texelsInBatch = texelsInLogicalRow * int(ceil(float(outShape[1]) / 2.0));\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(packedTexShape[0], packedTexShape[1]));\n int index = resTexRC.x * packedTexShape[1] + resTexRC.y;\n\n int b = index / texelsInBatch;\n index -= b * texelsInBatch;\n\n int r = 2 * (index / texelsInLogicalRow);\n int c = imod(index, texelsInLogicalRow) * 2;\n\n return ivec3(b, r, c);\n }\n ";const s=[Math.ceil(t[0]/2),Math.ceil(t[1]/2)],o=Math.ceil(e[2]/2),r=o*Math.ceil(e[1]/2);return`\n ivec3 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(${s[0]}, ${s[1]}));\n int index = resTexRC.x * ${s[1]} + resTexRC.y;\n\n int b = index / ${r};\n index -= b * ${r};\n\n int r = 2 * (index / ${o});\n int c = imod(index, ${o}) * 2;\n\n return ivec3(b, r, c);\n }\n `}(e,t,n);default:return function(e,t,n){if(n)return"\n ivec4 getOutputCoords() {\n ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0));\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(packedTexShape[0], packedTexShape[1]));\n int index = resTexRC.x * packedTexShape[1] + resTexRC.y;\n\n int texelsInLogicalRow = int(ceil(float(outShape[3]) / 2.0));\n int texelsInBatch = texelsInLogicalRow * int(ceil(float(outShape[2]) / 2.0));\n int texelsInBatchN = texelsInBatch * outShape[1];\n\n int b2 = index / texelsInBatchN;\n index -= b2 * texelsInBatchN;\n\n int b = index / texelsInBatch;\n index -= b * texelsInBatch;\n\n int r = 2 * (index / texelsInLogicalRow);\n int c = imod(index, texelsInLogicalRow) * 2;\n\n return ivec4(b2, b, r, c);\n }\n ";const s=[Math.ceil(t[0]/2),Math.ceil(t[1]/2)],o=Math.ceil(e[e.length-1]/2),r=o*Math.ceil(e[e.length-2]/2);let i=r,a="",u="b, r, c";for(let t=2;t1&&!s.util.arraysEqual(t,n)&&o.lengthe[t])).join(", ")}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js": +/*!***************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js ***! + \***************************************************************************/ +/*! exports provided: getLogicalCoordinatesFromFlatIndex, getOutputLogicalCoordinatesFromFlatIndexByUniform, getLogicalCoordinatesFromFlatIndexByUniform, dotify, getFlatIndexFrom3D, getFlatIndexFrom3DOutput, ENCODE_FLOAT_SNIPPET */function(e,t,n){"use strict";n.r(t),n.d(t,"getLogicalCoordinatesFromFlatIndex",(function(){return o})),n.d(t,"getOutputLogicalCoordinatesFromFlatIndexByUniform",(function(){return r})),n.d(t,"getLogicalCoordinatesFromFlatIndexByUniform",(function(){return i})),n.d(t,"dotify",(function(){return u})),n.d(t,"getFlatIndexFrom3D",(function(){return d})),n.d(t,"getFlatIndexFrom3DOutput",(function(){return l})),n.d(t,"ENCODE_FLOAT_SNIPPET",(function(){return c}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -5313,15 +5316,14 @@ function i(e){const{inputs:t,backend:n,attrs:i}=e,{axis:a}=i;if(1===t.length)ret * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -let r;const i={kernelName:s.PadV2,backendName:"wasm",kernelFunc:function(e){const{inputs:{x:t},backend:n,attrs:{paddings:s,constantValue:i}}=e,a=s.map(((e,n)=>e[0]+t.shape[n]+e[1])),d=n.dataIdMap.get(t.dataId).id,u=n.makeOutput(a,t.dtype),l=n.dataIdMap.get(u.dataId).id,c=new Uint8Array(new Int32Array(t.shape).buffer),f=s.map((e=>e[0])),p=s.map((e=>e[1])),m=new Uint8Array(new Int32Array(f).buffer),h=new Uint8Array(new Int32Array(p).buffer);return r(d,c,t.shape.length,o.CppDType[t.dtype],m,h,i,l),u},setupFunc:function(e){r=e.wasm.cwrap(s.PadV2,null,["number","array","number","number","array","array","number","number"])}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Pow.js": -/*!************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Pow.js ***! - \************************************************************************/ -/*! exports provided: powConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"powConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); + */function o(e,t,n="index"){const o=s.util.computeStrides(t);return o.map(((t,s)=>`${`int ${e[s]} = ${n} / ${t}`}; ${s===o.length-1?`int ${e[s+1]} = ${n} - ${e[s]} * ${t}`:`index -= ${e[s]} * ${t}`};`)).join("")}function r(e,t,n="index"){const o=s.util.computeStrides(t);return o.map(((t,s)=>`${`int ${e[s]} = ${n} / outShapeStrides[${s}]`}; ${s===o.length-1?`int ${e[s+1]} = ${n} - ${e[s]} * outShapeStrides[${s}]`:`index -= ${e[s]} * outShapeStrides[${s}]`};`)).join("")}function i(e,t,n="index"){const s=function(e,t){const n=e.length,s=e.map((e=>`${t}[${e}]`)),o=new Array(n-1);o[n-2]=s[n-1];for(let e=n-3;e>=0;--e)o[e]=`(${o[e+1]} * ${s[e+1]})`;return o}(e.map(((e,t)=>t)),t);return s.map(((t,o)=>`${`int ${e[o]} = ${n} / ${s[o]}`}; ${o===s.length-1?`int ${e[o+1]} = ${n} - ${e[o]} * ${s[o]}`:`index -= ${e[o]} * ${s[o]}`};`)).join("")}function a(e){return 1===e.length?`${e[0]}`:`vec${e.length}(${e.join(",")})`}function u(e,t){if(e.length!==t.length)throw new Error(`Vectors to be dotted must be of the same length -got ${e.length} and ${t.length}`);const n=[],s=Math.floor(e.length/4),o=e.length%4;for(let o=0;o`float(${e})`)),r=r.map((e=>`float(${e})`))),n.push(`${a(o)}, ${a(r)}`)}return n.map(((e,t)=>`dot(${e})`)).join("+")}function d(e){const t=s.util.computeStrides(e).map((e=>e.toString()));return`\n int getFlatIndex(ivec3 coords) {\n return coords.x * ${t[0]} + coords.y * ${t[1]} + coords.z;\n }\n`}function l(){return"\n int getFlatIndex(ivec3 coords) {\n return coords.x * outShapeStrides[0] + coords.y * outShapeStrides[1] + coords.z;\n }\n"}const c="\n const float FLOAT_MAX = 1.70141184e38;\n const float FLOAT_MIN = 1.17549435e-38;\n\n lowp vec4 encode_float(highp float v) {\n if (isnan(v)) {\n return vec4(255, 255, 255, 255);\n }\n\n highp float av = abs(v);\n\n if(av < FLOAT_MIN) {\n return vec4(0.0, 0.0, 0.0, 0.0);\n } else if(v > FLOAT_MAX) {\n return vec4(0.0, 0.0, 128.0, 127.0) / 255.0;\n } else if(v < -FLOAT_MAX) {\n return vec4(0.0, 0.0, 128.0, 255.0) / 255.0;\n }\n\n highp vec4 c = vec4(0,0,0,0);\n\n highp float e = floor(log2(av));\n highp float m = exp2(fract(log2(av))) - 1.0;\n\n c[2] = floor(128.0 * m);\n m -= c[2] / 128.0;\n c[1] = floor(32768.0 * m);\n m -= c[1] / 32768.0;\n c[0] = floor(8388608.0 * m);\n\n highp float ebias = e + 127.0;\n c[3] = floor(ebias / 2.0);\n ebias -= c[3] * 2.0;\n c[2] += floor(ebias) * 128.0;\n\n c[3] += 128.0 * step(0.0, -v);\n\n return c / 255.0;\n }\n"},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/slice_gpu.js": +/*!****************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/slice_gpu.js ***! + \****************************************************************/ +/*! exports provided: SliceProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"SliceProgram",(function(){return o}));var s=n(/*! ./shader_compiler */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2017 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -5334,12 +5336,11 @@ let r;const i={kernelName:s.PadV2,backendName:"wasm",kernelFunc:function(e){cons * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -const r=Object(o.createBinaryKernelConfig)(s.Pow,!1)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Prelu.js": -/*!**************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Prelu.js ***! - \**************************************************************************/ -/*! exports provided: preluConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"preluConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); + */class o{constructor(e){this.variableNames=["source"],this.outputShape=e,this.rank=e.length;const t=Object(s.getCoordsDataType)(this.rank);this.customUniforms=[{name:"start",arrayIndex:this.rank,type:"int"}];const n=function(e){if(1===e)return"sourceLoc";if(e<=6)return r.slice(0,e).map((e=>"sourceLoc."+e)).join(",");throw Error(`Slicing for rank ${e} is not yet supported`)}(this.rank);let o;o=`\n ${t} sourceLoc;\n ${t} coords = getOutputCoords();\n ${e.map(((e,t)=>`sourceLoc.${r[t]} = start[${t}] + coords.${r[t]};`)).join("\n")}\n `,this.userCode=`\n void main() {\n ${o}\n setOutput(getSource(${n}));\n }\n `}}const r=["x","y","z","w","u","v"]},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/slice_packed_gpu.js": +/*!***********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/slice_packed_gpu.js ***! + \***********************************************************************/ +/*! exports provided: SlicePackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"SlicePackedProgram",(function(){return r}));var s=n(/*! ./packing_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/packing_util.js"),o=n(/*! ./shader_compiler */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); /** * @license * Copyright 2019 Google LLC. All Rights Reserved. @@ -5355,14 +5356,15 @@ const r=Object(o.createBinaryKernelConfig)(s.Pow,!1)},"./node_modules/@tensorflo * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */let o;const r={kernelName:s.Prelu,backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.Prelu,null,["number","number","number"])},kernelFunc:function(e){const{inputs:t,backend:n}=e,{x:s,alpha:r}=t,i=n.dataIdMap.get(s.dataId).id,a=n.dataIdMap.get(r.dataId).id,d=n.makeOutput(s.shape,"float32"),u=n.dataIdMap.get(d.dataId).id;return o(i,a,u),d}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Prod.js": -/*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Prod.js ***! - \*************************************************************************/ -/*! exports provided: prodConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"prodConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./kernel_utils */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/kernel_utils.js"),r=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); + */ +class r{constructor(e){this.variableNames=["source"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=e,this.rank=e.length,this.customUniforms=[{name:"start",arrayIndex:this.rank,type:"int"}];const t=Object(o.getCoordsDataType)(this.rank),n=Object(s.getChannels)("coords",this.rank),r=Object(s.getChannels)("sourceLoc",this.rank),i=1===this.rank?"sourceLoc":`vec2(${r.slice(-2).join()})`,a=`getChannel(getSource(${r.join()}), ${i})`,u=`\n result.x = ${a};\n if (++${n[this.rank-1]} < ${e[this.rank-1]}) {\n ++${r[this.rank-1]};\n result.y = ${a};\n --${r[this.rank-1]};\n }\n `,d=1===this.rank?"":`\n --${n[this.rank-1]};\n if (++${n[this.rank-2]} < ${e[this.rank-2]}) {\n ++${r[this.rank-2]};\n result.z = ${a};\n if (++${n[this.rank-1]} < ${e[this.rank-1]}) {\n ++${r[this.rank-1]};\n result.w = ${a};\n }\n }\n `,l=this.rank<=4?`sourceLoc = coords +\n ${t}(${e.map(((e,t)=>`start[${t}]`)).join()});`:e.map(((e,t)=>`${r[t]} = ${n[t]} + start[${t}];`)).join("\n");this.userCode=`\n void main() {\n ${t} coords = getOutputCoords();\n ${t} sourceLoc;\n ${l}\n vec4 result = vec4(0.);\n ${u}\n ${d}\n setOutput(result);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/strided_slice_gpu.js": +/*!************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/strided_slice_gpu.js ***! + \************************************************************************/ +/*! exports provided: StridedSliceProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"StridedSliceProgram",(function(){return o}));var s=n(/*! ./shader_compiler */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2017 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -5375,15 +5377,14 @@ const r=Object(o.createBinaryKernelConfig)(s.Pow,!1)},"./node_modules/@tensorflo * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -let i;const a={kernelName:s.Prod,backendName:"wasm",setupFunc:function(e){i=e.wasm.cwrap(s.Prod,null,["number","number","number","number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:a}=e,{axis:d,keepDims:u}=a,{x:l}=n,c=t.dataIdMap.get(l.dataId).id;let f=c,p=l;const{transposed:m,axes:h,originalAxes:b,inputWasTransposed:j}=Object(o.permuteAxesAndTranspose)(l,d,t);let g=h;if(j){const e=t.dataIdMap.get(m.dataId).id;e!==c&&(p=m,f=e,g=s.backend_util.getInnerMostAxes(g.length,p.shape.length))}s.backend_util.assertAxesAreInnerMostDims("prod",g,p.shape.length);const[w,_]=s.backend_util.computeOutAndReduceShapes(p.shape,g),k=s.util.sizeFromShape(_),v=t.makeOutput(w,p.dtype);if(0!==s.util.sizeFromShape(p.shape)){const e=t.dataIdMap.get(v.dataId).id;i(f,k,r.CppDType[v.dtype],e)}if(j&&t.disposeData(m.dataId),u){const e=s.backend_util.expandShapeToKeepDim(v.shape,b);v.shape=e}return v}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Range.js": -/*!**************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Range.js ***! - \**************************************************************************/ -/*! exports provided: range, rangeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"range",(function(){return r})),n.d(t,"rangeConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernel_utils/shared.js"); + */class o{constructor(e,t,n){this.variableNames=["x"],this.outputShape=n;const o=n.length,r=Object(s.getCoordsDataType)(n.length),i=Object(s.getCoordsDataType)(n.length);let a="";if(1===o)a="coords * strides + begin";else{let e=0;a=n.map(((t,s)=>(e++,1===n.length?`coords * strides[${s}] + begin[${s}]`:`coords[${e-1}] * strides[${s}] + begin[${s}]`))).join(",")}this.userCode=`\n ${r} begin = ${r}(${e});\n ${r} strides = ${r}(${t});\n\n void main() {\n ${i} coords = getOutputCoords();\n setOutput(getX(${a}));\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/tex_util.js": +/*!***************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/tex_util.js ***! + \***************************************************************/ +/*! exports provided: PackingScheme, TextureUsage, PhysicalTextureType, getUnpackedMatrixTextureShapeWidthHeight, getUnpackedArraySizeFromMatrixSize, getColorMatrixTextureShapeWidthHeight, getDenseTexShape, getMatrixSizeFromUnpackedArraySize, decodeMatrixFromUnpackedColorRGBAArray, getPackedMatrixTextureShapeWidthHeight, getPackedRGBAArraySizeFromMatrixShape, getTextureConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"PackingScheme",(function(){return s})),n.d(t,"TextureUsage",(function(){return o})),n.d(t,"PhysicalTextureType",(function(){return r})),n.d(t,"getUnpackedMatrixTextureShapeWidthHeight",(function(){return a})),n.d(t,"getUnpackedArraySizeFromMatrixSize",(function(){return u})),n.d(t,"getColorMatrixTextureShapeWidthHeight",(function(){return d})),n.d(t,"getDenseTexShape",(function(){return l})),n.d(t,"getMatrixSizeFromUnpackedArraySize",(function(){return c})),n.d(t,"decodeMatrixFromUnpackedColorRGBAArray",(function(){return f})),n.d(t,"getPackedMatrixTextureShapeWidthHeight",(function(){return p})),n.d(t,"getPackedRGBAArraySizeFromMatrixShape",(function(){return m})),n.d(t,"getTextureConfig",(function(){return h}));var s,o,r,i=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2017 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -5396,15 +5397,14 @@ let i;const a={kernelName:s.Prod,backendName:"wasm",setupFunc:function(e){i=e.wa * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -const r=e=>{const{backend:t,attrs:n}=e,{start:s,stop:r,step:i,dtype:a}=n,d=Object(o.rangeImplCPU)(s,r,i,a),u=t.makeOutput([d.length],a);return t.typedArrayFromHeap(u).set(d),u},i={kernelName:s.Range,backendName:"wasm",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/RealDiv.js": -/*!****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/RealDiv.js ***! - \****************************************************************************/ -/*! exports provided: realDivConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"realDivConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); + */function a(e,t){return[t,e]}function u(e,t){return e*t}function d(e,t){return[4*t,e]}function l(e){const t=i.util.sizeFromShape(e),n=Math.ceil(t/4);return i.util.sizeToSquarishShape(n)}function c(e,t){if(e%t!=0)throw new Error(`unpackedSize (${e}) must be a multiple of ${t}`);return e/t}function f(e,t,n){const s=e.length*n/4;if(t.length= ${s}`);let o=0;for(let s=0;s{const{backend:t,attrs:n}=e,{start:s,stop:r,step:i,dtype:a}=n,d=Objec * limitations under the License. * ============================================================================= */ -const r=Object(o.createBinaryKernelConfig)(s.RealDiv,!0)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Relu.js": -/*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Relu.js ***! - \*************************************************************************/ -/*! exports provided: reluConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"reluConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); +class i{constructor(e){this.gpgpu=e,this.numUsedTextures=0,this.numFreeTextures=0,this._numBytesAllocated=0,this._numBytesFree=0,this.freeTextures={},this.logEnabled=!1,this.usedTextures={}}acquireTexture(e,t,n){const s=u(t,n),o=d(e,s,n);o in this.freeTextures||(this.freeTextures[o]=[]),o in this.usedTextures||(this.usedTextures[o]=[]);const i=a(e,s,this.gpgpu.gl,this.gpgpu.textureConfig,n);if(this.freeTextures[o].length>0){this.numFreeTextures--,this.numUsedTextures++,this._numBytesFree-=i,this.log();const e=this.freeTextures[o].shift();return this.usedTextures[o].push(e),e}let l;return s===r.PhysicalTextureType.PACKED_2X2_FLOAT32?l=this.gpgpu.createPackedMatrixTexture(e[0],e[1]):s===r.PhysicalTextureType.PACKED_2X2_FLOAT16?l=this.gpgpu.createFloat16PackedMatrixTexture(e[0],e[1]):s===r.PhysicalTextureType.UNPACKED_FLOAT32?l=this.gpgpu.createFloat32MatrixTexture(e[0],e[1]):s===r.PhysicalTextureType.UNPACKED_FLOAT16?l=this.gpgpu.createFloat16MatrixTexture(e[0],e[1]):s===r.PhysicalTextureType.PACKED_4X1_UNSIGNED_BYTE&&(l=this.gpgpu.createUnsignedBytesMatrixTexture(e[0],e[1])),this.usedTextures[o].push(l),this.numUsedTextures++,this._numBytesAllocated+=i,this.log(),l}releaseTexture(e,t,n,o){if(null==this.freeTextures)return;const r=u(n,o),i=d(t,r,o);i in this.freeTextures||(this.freeTextures[i]=[]);const l=a(t,r,this.gpgpu.gl,this.gpgpu.textureConfig,o),c=Object(s.env)().get("WEBGL_DELETE_TEXTURE_THRESHOLD");-1!==c&&this._numBytesAllocated>c?(this.gpgpu.deleteMatrixTexture(e),this._numBytesAllocated-=l):(this.freeTextures[i].push(e),this.numFreeTextures++,this._numBytesFree+=l),this.numUsedTextures--;const f=this.usedTextures[i],p=f.indexOf(e);if(p<0)throw new Error("Cannot release a texture that was never provided by this texture manager");f.splice(p,1),this.log()}log(){if(!this.logEnabled)return;const e=this.numFreeTextures+this.numUsedTextures;console.log("Free/Used",`${this.numFreeTextures} / ${this.numUsedTextures}`,`(${e})`);const t=this._numBytesFree/this._numBytesAllocated;console.log(`Bytes allocated: ${this._numBytesAllocated}`),console.log(`Bytes unused: ${this._numBytesFree} (${Math.round(100*t)}%)`)}get numBytesAllocated(){return this._numBytesAllocated}get numBytesFree(){return this._numBytesFree}getNumUsedTextures(){return this.numUsedTextures}getNumFreeTextures(){return this.numFreeTextures}dispose(){if(null!=this.freeTextures){for(const e in this.freeTextures)this.freeTextures[e].forEach((e=>{this.gpgpu.deleteMatrixTexture(e)}));for(const e in this.usedTextures)this.usedTextures[e].forEach((e=>{this.gpgpu.deleteMatrixTexture(e)}));this.freeTextures=null,this.usedTextures=null,this.numUsedTextures=0,this.numFreeTextures=0,this._numBytesAllocated=0,this._numBytesFree=0}}}function a(e,t,n,s,i){const a=function(e,t){switch(e){case r.PhysicalTextureType.PACKED_2X2_FLOAT32:return Object(o.getInternalFormatForPackedMatrixTexture)(t);case r.PhysicalTextureType.PACKED_2X2_FLOAT16:return Object(o.getInternalFormatForFloat16PackedMatrixTexture)(t);case r.PhysicalTextureType.UNPACKED_FLOAT32:return Object(o.getInternalFormatForFloat32MatrixTexture)(t);case r.PhysicalTextureType.UNPACKED_FLOAT16:return Object(o.getInternalFormatForFloat16MatrixTexture)(t);case r.PhysicalTextureType.PACKED_4X1_UNSIGNED_BYTE:return Object(o.getInternalFormatForUnsignedBytesMatrixTexture)(t);default:throw new Error(`Unknown physical texture type ${e}`)}}(t,s);let u;if(i){const[t,n]=Object(r.getPackedMatrixTextureShapeWidthHeight)(e[0],e[1]);u=t*n}else{const[t,n]=Object(r.getUnpackedMatrixTextureShapeWidthHeight)(e[0],e[1]);u=t*n}return u*function(e,t){const n=e;if(t===n.R32F)return 4;if(t===n.R16F)return 2;if(t===n.RGBA32F)return 16;if(t===e.RGBA)return 16;if(t===n.RGBA16F)return 8;throw new Error(`Unknown internal format ${t}`)}(n,a)}function u(e,t){if(e===r.TextureUsage.UPLOAD)return r.PhysicalTextureType.PACKED_2X2_FLOAT32;if(e===r.TextureUsage.RENDER||null==e)return function(e){return Object(s.env)().getBool("WEBGL_RENDER_FLOAT32_ENABLED")?e?r.PhysicalTextureType.PACKED_2X2_FLOAT32:r.PhysicalTextureType.UNPACKED_FLOAT32:e?r.PhysicalTextureType.PACKED_2X2_FLOAT16:r.PhysicalTextureType.UNPACKED_FLOAT16}(t);if(e===r.TextureUsage.DOWNLOAD||e===r.TextureUsage.PIXELS)return r.PhysicalTextureType.PACKED_4X1_UNSIGNED_BYTE;throw new Error(`Unknown logical texture type ${e}`)}function d(e,t,n){return`${e[0]}_${e[1]}_${t}_${n}`}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/tile_gpu.js": +/*!***************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/tile_gpu.js ***! + \***************************************************************/ +/*! exports provided: TileProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"TileProgram",(function(){return o}));var s=n(/*! ./shader_compiler */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2017 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -5438,15 +5438,18 @@ const r=Object(o.createBinaryKernelConfig)(s.RealDiv,!0)},"./node_modules/@tenso * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -const r=Object(o.createUnaryKernelConfig)(s.Relu)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Relu6.js": -/*!**************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Relu6.js ***! - \**************************************************************************/ -/*! exports provided: relu6Config */function(e,t,n){"use strict";n.r(t),n.d(t,"relu6Config",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); + */class o{constructor(e,t){this.variableNames=["A"];const n=new Array(e.length);for(let s=0;s5)throw Error(`Tile for rank ${t} is not yet supported`);if(1===t)return`imod(resRC, ${e[0]})`;const n=["resRC.x","resRC.y","resRC.z","resRC.w","resRC.u"],s=[];for(let t=0;t= dir;\n bool isGreater = x0 > x1 || (x0 == x1 && i1 > i0);\n if (reverse == isGreater) { // Elements in opposite order of direction\n int iTemp = i0;\n i0 = i1;\n i1 = iTemp;\n }\n if (isFirstInPair) {\n setOutput(float(i0));\n } else {\n setOutput(float(i1));\n }\n }\n "}}class o{constructor(e){this.variableNames=["x","indices"],this.customUniforms=[{name:"n",type:"int"},{name:"firstPass",type:"int"},{name:"k",type:"int"}],this.outputShape=e,this.userCode="\n void main() {\n // Takes max of indices (0, k), (1, k + 1), (2, k + 2) ...\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int elemIdx = coords[1];\n\n // The output size is half of the previous size.\n // If the previous sequence is | | | | _ _ _ _ | | | | _ _ _ _ (k=4),\n // we only need to output the indices at positions |, the indices at\n // positions _ can be thrown away, see Figure5(b) After Phase 2\n // (Merge phase) in the Bitonic Top K paper referenced above.\n // For example, the paper shows we only need to output the orange bars.\n // The output sequence should look like this | | | | | | | |.\n // Because the sequence is halved, to map the output index back\n // to the previous sequence to find the corresponding value,\n // we need to double the index. When we double the index,\n // we basically interpolate a position, so 2i looks like\n // | _ | _ | _ | _ | _ | _ | _. We move the | to the first k position\n // of each 2k positions by - elemIdx % k. E.g. for output at\n // index 4,5,6,7, we want to get the corresponding element at\n // original index 8,9,10,11, for output at index 8,9,10,11,\n // we want to get the corresponding element at original index\n // 16,17,18,19, so on and so forth.\n\n int i = elemIdx < k ? elemIdx : (elemIdx * 2 - imod(elemIdx, k));\n int i0 = firstPass == 1 ? i : int(getIndices(batch, i));\n int i1 = firstPass == 1 ? i + k : int(getIndices(batch, i + k));\n\n float x0 = getX(batch, i0);\n float x1 = i1 < n ? getX(batch, i1) : x0;\n\n setOutput(x0 >= x1 ? float(i0) : float(i1));\n }\n "}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/transform_gpu.js": +/*!********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/transform_gpu.js ***! + \********************************************************************/ +/*! exports provided: TransformProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"TransformProgram",(function(){return s})); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2021 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -5460,14 +5463,14 @@ const r=Object(o.createUnaryKernelConfig)(s.Relu)},"./node_modules/@tensorflow/t * limitations under the License. * ============================================================================= */ -const r=Object(o.createUnaryKernelConfig)(s.Relu6)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Reshape.js": -/*!****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Reshape.js ***! - \****************************************************************************/ -/*! exports provided: reshape, reshapeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"reshape",(function(){return o})),n.d(t,"reshapeConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +class s{constructor(e,t,n,s,o,r){this.variableNames=["Image","Transforms"],this.outputShape=r;const i="nearest"===n?1:2;let a;switch(s){case"constant":a=1;break;case"reflect":a=2;break;case"wrap":a=3;break;case"nearest":a=4;break;default:a=1}this.userCode=`\n float mapCoord(float outCoord, float len) {\n float inCoord = outCoord;\n if(${a} == 2) {\n if (inCoord < 0.0) {\n if (len <= 1.0) {\n inCoord = 0.0;\n } else {\n float sz2 = 2.0 * len;\n if (inCoord < sz2) {\n inCoord = sz2 * float(int(float(-inCoord / sz2))) +\n inCoord;\n }\n inCoord = inCoord < -len ? inCoord + sz2 : -inCoord - 1.0;\n }\n } else if (inCoord > len - 1.0) {\n if (len <= 1.0) {\n inCoord = 0.0;\n } else {\n float sz2 = 2.0 * len;\n inCoord -= sz2 * float(int(float(inCoord / sz2)));\n if (inCoord >= len) {\n inCoord = sz2 - inCoord - 1.0;\n }\n }\n }\n return clamp(inCoord, 0.0, len - 1.0);\n } else if (${a} == 3) {\n if (inCoord < 0.0) {\n if (len <= 1.0) {\n inCoord = 0.0;\n } else {\n float sz = len - 1.0;\n inCoord += len * (float(int(float(-inCoord / sz))) + 1.0);\n }\n } else if (inCoord > len - 1.0) {\n if (len <= 1.0) {\n inCoord = 0.0;\n } else {\n float sz = len - 1.0;\n inCoord -= len * float(int(float(inCoord / sz)));\n }\n }\n return clamp(inCoord, 0.0, len - 1.0);\n } else if (${a} == 4) {\n return clamp(outCoord, 0.0, len - 1.0);\n } else {\n return outCoord;\n }\n }\n\n float readWithFillValue(int batch, int coordY, int coordX,\n int channel) {\n float outputValue;\n if (0 <= coordY && coordY < ${e} && 0 <= coordX && coordX < ${t}) {\n outputValue = getImage(batch, coordY, coordX, channel);\n } else {\n outputValue = float(${o});\n }\n return outputValue;\n }\n\n void main() {\n ivec4 coords = getOutputCoords();\n float outputValue;\n int batch = coords[0];\n int x = coords[2];\n int y = coords[1];\n int channel = coords[3];\n float xf = float(x);\n float yf = float(y);\n float a1 = getTransforms(batch, 0);\n float a2 = getTransforms(batch, 1);\n float a3 = getTransforms(batch, 2);\n float b1 = getTransforms(batch, 3);\n float b2 = getTransforms(batch, 4);\n float b3 = getTransforms(batch, 5);\n float c1 = getTransforms(batch, 6);\n float c2 = getTransforms(batch, 7);\n float projection = c1 * xf + c2 * yf + 1.0;\n if (projection == 0.0) {\n outputValue = float(${o});\n } else {\n float inX = (a1 * xf + a2 * yf + a3) / projection;\n float inY = (b1 * xf + b2 * yf + b3) / projection;\n float mapX = mapCoord(inX, float(${t}));\n float mapY = mapCoord(inY, float(${e}));\n\n if (${i} == 1) {\n int coordY = int(round(mapY));\n int coordX = int(round(mapX));\n outputValue = readWithFillValue(batch, coordY, coordX,\n channel);\n } else {\n float yFloor = floor(mapY);\n float xFloor = floor(mapX);\n float yCeil = yFloor + 1.0;\n float xCeil = xFloor + 1.0;\n float valueYFloor = (xCeil - mapX) *\n readWithFillValue(batch, int(yFloor), int(xFloor), channel) +\n (mapX - xFloor) *\n readWithFillValue(batch, int(yFloor), int(xCeil), channel);\n float valueYCeil = (xCeil - mapX) *\n readWithFillValue(batch, int(yCeil), int(xFloor), channel) +\n (mapX - xFloor) *\n readWithFillValue(batch, int(yCeil), int(xCeil), channel);\n outputValue = (yCeil - mapY) * valueYFloor +\n (mapY - yFloor) * valueYCeil;\n }\n }\n setOutput(outputValue);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/transpose_gpu.js": +/*!********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/transpose_gpu.js ***! + \********************************************************************/ +/*! exports provided: TransposeProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"TransposeProgram",(function(){return o}));var s=n(/*! ./shader_compiler */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2017 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -5480,11 +5483,11 @@ const r=Object(o.createUnaryKernelConfig)(s.Relu6)},"./node_modules/@tensorflow/ * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */function o(e){const{inputs:t,attrs:n}=e,{x:o}=t,{shape:r}=n,i=s.util.sizeFromShape(o.shape),a=s.util.inferFromImplicitShape(r,i);return s.util.assert(i===s.util.sizeFromShape(a),(()=>`new shape: ${a}, old shape: ${o.shape}. New shape and old shape must have the same number of elements.`)),e.backend.incRef(o.dataId),{dataId:o.dataId,shape:a,dtype:o.dtype}}const r={kernelName:s.Reshape,backendName:"wasm",kernelFunc:o}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ResizeBilinear.js": -/*!***********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ResizeBilinear.js ***! - \***********************************************************************************/ -/*! exports provided: resizeBilinearConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"resizeBilinearConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Cast */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Cast.js"); + */class o{constructor(e,t){this.variableNames=["A"];const n=new Array(e.length);for(let s=0;s6)throw Error(`Transpose for rank ${t} is not yet supported`);const n=["resRC.x","resRC.y","resRC.z","resRC.w","resRC.u","resRC.v"],s=new Array(t);for(let t=0;t6)throw Error(`Packed transpose for rank ${this.rank} is not yet supported.`);const r=Object(o.getCoordsDataType)(this.rank),i=Object(s.getVecChannels)("rc",this.rank),a=new Array(this.rank);for(let e=0;e 0.0 ? 1.0 : float(${e});\n `}const d="return (x >= 0.0) ? x : (exp(x) - 1.0);",l=r+"\n return (x < 0.0) ? 0.0 : x;\n",c=r+"\n return (x < 0.0) ? 0.0 : min(6.0, x);\n",f="return x;",p="return 1.0 / (1.0 + exp(-1.0 * x));"},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/unaryop_packed_gpu.js": +/*!*************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/unaryop_packed_gpu.js ***! + \*************************************************************************/ +/*! exports provided: LINEAR, ELU, RELU, RELU6, SIGMOID, UnaryOpPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"LINEAR",(function(){return o})),n.d(t,"ELU",(function(){return r})),n.d(t,"RELU",(function(){return i})),n.d(t,"RELU6",(function(){return a})),n.d(t,"SIGMOID",(function(){return u})),n.d(t,"UnaryOpPackedProgram",(function(){return d}));var s=n(/*! ./gpgpu_math */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/gpgpu_math.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -5542,14 +5544,14 @@ let i;function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:d}=t,{dims:u}=a,l=s.u * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */let o;function r(e){const{inputs:t,backend:n,attrs:r}=e,{image:i}=t,{radians:a,fillValue:d,center:u}=r,l=n.makeOutput(i.shape,i.dtype),c=n.dataIdMap.get(i.dataId).id,f=n.dataIdMap.get(l.dataId).id,[p,m,h,b]=i.shape,[j,g]=s.backend_util.getImageCenter(u,m,h),w="number"==typeof d?[d,d,d,0===d?0:255]:[...d,255],_=new Uint8Array(new Int32Array(w).buffer);return o(c,p,m,h,b,a,j,g,_,w.length,f),l}const i={kernelName:s.RotateWithOffset,backendName:"wasm",kernelFunc:r,setupFunc:function(e){o=e.wasm.cwrap(s.RotateWithOffset,null,["number","number","number","number","number","number","number","number","array","number","number"])}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Round.js": -/*!**************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Round.js ***! - \**************************************************************************/ -/*! exports provided: roundConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"roundConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); + */const o="return x;",r="\n vec4 result;\n\n result.r = (x.r >= 0.0) ? x.r : (exp(x.r) - 1.0);\n result.g = (x.g >= 0.0) ? x.g : (exp(x.g) - 1.0);\n result.b = (x.b >= 0.0) ? x.b : (exp(x.b) - 1.0);\n result.a = (x.a >= 0.0) ? x.a : (exp(x.a) - 1.0);\n\n return result;\n",i="\n vec4 result = x * vec4(greaterThanEqual(x, vec4(0.0)));\n bvec4 isNaN = isnan(x);\n\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n",a="\n vec4 result = min(x, vec4(6.)) * vec4(greaterThanEqual(x, vec4(0.0)));\n bvec4 isNaN = isnan(x);\n\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n",u="return 1.0 / (1.0 + exp(-1.0 * x));";class d{constructor(e,t){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=e,this.enableShapeUniforms=Object(s.useShapeUniforms)(this.outputShape.length),this.userCode=`\n vec4 unaryOperation(vec4 x) {\n ${t}\n }\n\n void main() {\n vec4 x = getAAtOutCoords();\n vec4 y = unaryOperation(x);\n\n setOutput(y);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/unpack_gpu.js": +/*!*****************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/unpack_gpu.js ***! + \*****************************************************************/ +/*! exports provided: UnpackProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"UnpackProgram",(function(){return r}));var s=n(/*! ./packing_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/packing_util.js"),o=n(/*! ./shader_compiler */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); /** * @license - * Copyright 2021 Google LLC. All Rights Reserved. + * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -5563,11 +5565,17 @@ let i;function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:d}=t,{dims:u}=a,l=s.u * limitations under the License. * ============================================================================= */ -const r=Object(o.createUnaryKernelConfig)(s.Round)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Rsqrt.js": -/*!**************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Rsqrt.js ***! - \**************************************************************************/ -/*! exports provided: rsqrtConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"rsqrtConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); +class r{constructor(e){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!1,this.outputShape=e;const t=e.length,n=Object(s.getChannels)("rc",t),r=Object(o.getCoordsDataType)(t),i=Object(s.getSourceCoords)(t,n),a=n.slice(-2),u=t<=1?"rc":`vec2(${a.join(",")})`;this.userCode=`\n void main() {\n ${r} rc = getOutputCoords();\n vec4 packedInput = getA(${i});\n\n setOutput(getChannel(packedInput, ${u}));\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/version.js": +/*!**************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/version.js ***! + \**************************************************************/ +/*! exports provided: version */function(e,t,n){"use strict";n.r(t),n.d(t,"version",(function(){return s})); +/** @license See the LICENSE file. */ +const s="0.0.0"},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/webgl.js": +/*!************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/webgl.js ***! + \************************************************************/ +/*! exports provided: MathBackendWebGL, setWebGLContext, GPGPUContext, gpgpu_util, webgl_util, forceHalfFloat */function(e,t,n){"use strict";n.r(t),n.d(t,"forceHalfFloat",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./gpgpu_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/gpgpu_util.js");n.d(t,"gpgpu_util",(function(){return o}));var r=n(/*! ./webgl_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js");n.d(t,"webgl_util",(function(){return r}));var i=n(/*! ./backend_webgl */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/backend_webgl.js");n.d(t,"MathBackendWebGL",(function(){return i.MathBackendWebGL}));var a=n(/*! ./canvas_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/canvas_util.js");n.d(t,"setWebGLContext",(function(){return a.setWebGLContext}));var u=n(/*! ./gpgpu_context */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/gpgpu_context.js"); /** * @license * Copyright 2019 Google LLC. All Rights Reserved. @@ -5584,14 +5592,14 @@ const r=Object(o.createUnaryKernelConfig)(s.Round)},"./node_modules/@tensorflow/ * limitations under the License. * ============================================================================= */ -const r=Object(o.createUnaryKernelConfig)(s.Rsqrt)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ScatterNd.js": -/*!******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ScatterNd.js ***! - \******************************************************************************/ -/*! exports provided: scatterNdConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"scatterNdConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); +function d(){Object(s.env)().set("WEBGL_FORCE_F16_TEXTURES",!0)}n.d(t,"GPGPUContext",(function(){return u.GPGPUContext}))},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js": +/*!*****************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js ***! + \*****************************************************************/ +/*! exports provided: callAndCheck, canBeRepresented, getWebGLErrorMessage, getExtensionOrThrow, createVertexShader, createFragmentShader, createProgram, linkProgram, validateProgram, createStaticVertexBuffer, createStaticIndexBuffer, getNumChannels, createTexture, validateTextureSize, createFramebuffer, bindVertexBufferToProgramAttribute, bindTextureUnit, unbindTextureUnit, getProgramUniformLocationOrThrow, getProgramUniformLocation, bindTextureToProgramUniformSampler, bindCanvasToFramebuffer, bindColorTextureToFramebuffer, unbindColorTextureFromFramebuffer, validateFramebuffer, getFramebufferErrorMessage, getBatchDim, getRowsCols, getShapeAs3D, getTextureShapeFromLogicalShape, isReshapeFree, getWebGLMaxTextureSize, resetMaxTextureSize, resetMaxTexturesInShader, getMaxTexturesInShader, getWebGLDisjointQueryTimerVersion, hasExtension, isWebGLVersionEnabled, isCapableOfRenderingToFloatTexture, isDownloadFloatTextureEnabled, isWebGLFenceEnabled, assertNotComplex */function(e,t,n){"use strict";n.r(t),n.d(t,"callAndCheck",(function(){return i})),n.d(t,"canBeRepresented",(function(){return a})),n.d(t,"getWebGLErrorMessage",(function(){return u})),n.d(t,"getExtensionOrThrow",(function(){return d})),n.d(t,"createVertexShader",(function(){return l})),n.d(t,"createFragmentShader",(function(){return c})),n.d(t,"createProgram",(function(){return p})),n.d(t,"linkProgram",(function(){return m})),n.d(t,"validateProgram",(function(){return h})),n.d(t,"createStaticVertexBuffer",(function(){return b})),n.d(t,"createStaticIndexBuffer",(function(){return j})),n.d(t,"getNumChannels",(function(){return g})),n.d(t,"createTexture",(function(){return w})),n.d(t,"validateTextureSize",(function(){return _})),n.d(t,"createFramebuffer",(function(){return k})),n.d(t,"bindVertexBufferToProgramAttribute",(function(){return v})),n.d(t,"bindTextureUnit",(function(){return x})),n.d(t,"unbindTextureUnit",(function(){return y})),n.d(t,"getProgramUniformLocationOrThrow",(function(){return O})),n.d(t,"getProgramUniformLocation",(function(){return I})),n.d(t,"bindTextureToProgramUniformSampler",(function(){return C})),n.d(t,"bindCanvasToFramebuffer",(function(){return S})),n.d(t,"bindColorTextureToFramebuffer",(function(){return T})),n.d(t,"unbindColorTextureFromFramebuffer",(function(){return N})),n.d(t,"validateFramebuffer",(function(){return E})),n.d(t,"getFramebufferErrorMessage",(function(){return A})),n.d(t,"getBatchDim",(function(){return M})),n.d(t,"getRowsCols",(function(){return $})),n.d(t,"getShapeAs3D",(function(){return D})),n.d(t,"getTextureShapeFromLogicalShape",(function(){return P})),n.d(t,"isReshapeFree",(function(){return L})),n.d(t,"getWebGLMaxTextureSize",(function(){return U})),n.d(t,"resetMaxTextureSize",(function(){return W})),n.d(t,"resetMaxTexturesInShader",(function(){return V})),n.d(t,"getMaxTexturesInShader",(function(){return q})),n.d(t,"getWebGLDisjointQueryTimerVersion",(function(){return H})),n.d(t,"hasExtension",(function(){return K})),n.d(t,"isWebGLVersionEnabled",(function(){return X})),n.d(t,"isCapableOfRenderingToFloatTexture",(function(){return Y})),n.d(t,"isDownloadFloatTextureEnabled",(function(){return Z})),n.d(t,"isWebGLFenceEnabled",(function(){return J})),n.d(t,"assertNotComplex",(function(){return ee}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./canvas_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/canvas_util.js"),r=n(/*! ./tex_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/tex_util.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2017 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -5605,14 +5613,14 @@ const r=Object(o.createUnaryKernelConfig)(s.Rsqrt)},"./node_modules/@tensorflow/ * limitations under the License. * ============================================================================= */ -let r;const i={kernelName:s.ScatterNd,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.ScatterNd,null,["number","number","number","number","number","number","array","number","number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:i}=e,{indices:a,updates:d}=n,{shape:u}=i,l=t.makeOutput(u,d.dtype);if(0===s.util.sizeFromShape(u))return l;const{sliceRank:c,numUpdates:f,sliceSize:p,strides:m,outputSize:h}=s.scatter_util.calculateShapes(d,a,u),b=t.dataIdMap.get(a.dataId).id,j=t.dataIdMap.get(d.dataId).id,g=new Uint8Array(new Int32Array(m).buffer),w=t.dataIdMap.get(l.dataId).id;return r(b,j,o.CppDType[d.dtype],c,f,p,g,h,w),l}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Select.js": -/*!***************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Select.js ***! - \***************************************************************************/ -/*! exports provided: selectConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"selectConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +function i(e,t){const n=t();return Object(s.env)().getBool("DEBUG")&&function(e){const t=e.getError();if(t!==e.NO_ERROR)throw new Error("WebGL Error: "+u(e,t))}(e),n}function a(e){return!!(Object(s.env)().getBool("WEBGL_RENDER_FLOAT32_ENABLED")||0===e||5.96e-8e.getExtension(t)),'Extension "'+t+'" not supported on this browser.')}function l(e,t){const n=R(e,(()=>e.createShader(e.VERTEX_SHADER)),"Unable to create vertex WebGLShader.");if(i(e,(()=>e.shaderSource(n,t))),i(e,(()=>e.compileShader(n))),!1===e.getShaderParameter(n,e.COMPILE_STATUS))throw console.log(e.getShaderInfoLog(n)),new Error("Failed to compile vertex shader.");return n}function c(e,t){const n=R(e,(()=>e.createShader(e.FRAGMENT_SHADER)),"Unable to create fragment WebGLShader.");if(i(e,(()=>e.shaderSource(n,t))),i(e,(()=>e.compileShader(n))),!1===e.getShaderParameter(n,e.COMPILE_STATUS))throw function(e,t){const n=f.exec(t);if(null==n)return console.log(`Couldn't parse line number in error: ${t}`),void console.log(e);const o=+n[1],r=e.split("\n"),i=r.length.toString().length+2,a=r.map(((e,t)=>s.util.rightPad((t+1).toString(),i)+e));let u=0;for(let e=0;ee.createProgram()),"Unable to create WebGLProgram.")}function m(e,t){if(i(e,(()=>e.linkProgram(t))),!1===e.getProgramParameter(t,e.LINK_STATUS))throw console.log(e.getProgramInfoLog(t)),new Error("Failed to link vertex and fragment shaders.")}function h(e,t){if(i(e,(()=>e.validateProgram(t))),!1===e.getProgramParameter(t,e.VALIDATE_STATUS))throw console.log(e.getProgramInfoLog(t)),new Error("Shader program validation failed.")}function b(e,t){const n=R(e,(()=>e.createBuffer()),"Unable to create WebGLBuffer");return i(e,(()=>e.bindBuffer(e.ARRAY_BUFFER,n))),i(e,(()=>e.bufferData(e.ARRAY_BUFFER,t,e.STATIC_DRAW))),n}function j(e,t){const n=R(e,(()=>e.createBuffer()),"Unable to create WebGLBuffer");return i(e,(()=>e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,n))),i(e,(()=>e.bufferData(e.ELEMENT_ARRAY_BUFFER,t,e.STATIC_DRAW))),n}function g(){return 2===Object(s.env)().getNumber("WEBGL_VERSION")?1:4}function w(e){return R(e,(()=>e.createTexture()),"Unable to create WebGLTexture.")}function _(e,t){const n=Object(s.env)().getNumber("WEBGL_MAX_TEXTURE_SIZE");if(e<=0||t<=0){throw new Error("Requested texture size "+`[${e}x${t}]`+" is invalid.")}if(e>n||t>n){throw new Error("Requested texture size "+`[${e}x${t}]`+" greater than WebGL maximum on this browser / GPU "+`[${n}x${n}]`+".")}}function k(e){return R(e,(()=>e.createFramebuffer()),"Unable to create WebGLFramebuffer.")}function v(e,t,n,s,o,r,a){const u=e.getAttribLocation(t,n);return-1!==u&&(i(e,(()=>e.bindBuffer(e.ARRAY_BUFFER,s))),i(e,(()=>e.vertexAttribPointer(u,o,e.FLOAT,!1,r,a))),i(e,(()=>e.enableVertexAttribArray(u))),!0)}function x(e,t,n){F(e,n),i(e,(()=>e.activeTexture(e.TEXTURE0+n))),i(e,(()=>e.bindTexture(e.TEXTURE_2D,t)))}function y(e,t){F(e,t),i(e,(()=>e.activeTexture(e.TEXTURE0+t))),i(e,(()=>e.bindTexture(e.TEXTURE_2D,null)))}function O(e,t,n){return R(e,(()=>e.getUniformLocation(t,n)),'uniform "'+n+'" not present in program.')}function I(e,t,n){return e.getUniformLocation(t,n)}function C(e,t,n,s){i(e,(()=>x(e,t,s))),i(e,(()=>e.uniform1i(n,s)))}function S(e){i(e,(()=>e.bindFramebuffer(e.FRAMEBUFFER,null))),i(e,(()=>e.viewport(0,0,e.canvas.width,e.canvas.height))),i(e,(()=>e.scissor(0,0,e.canvas.width,e.canvas.height)))}function T(e,t,n){i(e,(()=>e.bindFramebuffer(e.FRAMEBUFFER,n))),i(e,(()=>e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,t,0)))}function N(e,t){i(e,(()=>e.bindFramebuffer(e.FRAMEBUFFER,t))),i(e,(()=>e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,null,0)))}function E(e){const t=e.checkFramebufferStatus(e.FRAMEBUFFER);if(t!==e.FRAMEBUFFER_COMPLETE)throw new Error("Error binding framebuffer: "+A(e,t))}function A(e,t){switch(t){case e.FRAMEBUFFER_INCOMPLETE_ATTACHMENT:return"FRAMEBUFFER_INCOMPLETE_ATTACHMENT";case e.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:return"FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT";case e.FRAMEBUFFER_INCOMPLETE_DIMENSIONS:return"FRAMEBUFFER_INCOMPLETE_DIMENSIONS";case e.FRAMEBUFFER_UNSUPPORTED:return"FRAMEBUFFER_UNSUPPORTED";default:return`unknown error ${t}`}}function R(e,t,n){const s=i(e,(()=>t()));if(null==s)throw new Error(n);return s}function F(e,t){const n=e.MAX_COMBINED_TEXTURE_IMAGE_UNITS-1,s=t+e.TEXTURE0;if(sn){throw new Error(`textureUnit must be in ${`[gl.TEXTURE0, gl.TEXTURE${n}]`}.`)}}function M(e,t=2){return s.util.sizeFromShape(e.slice(0,e.length-t))}function $(e){if(0===e.length)throw Error("Cannot get rows and columns of an empty shape array.");return[e.length>1?e[e.length-2]:1,e[e.length-1]]}function D(e){let t=[1,1,1];return 0===e.length||1===e.length&&1===e[0]||(t=[M(e),...$(e)]),t}function P(e,t=!1){let n=Object(s.env)().getNumber("WEBGL_MAX_TEXTURE_SIZE");if(t&&(n*=2,1===(e=e.map(((t,n)=>n>=e.length-2?s.util.nearestLargerEven(e[n]):e[n]))).length&&(e=[2,e[0]])),2!==e.length){const t=s.util.squeezeShape(e);e=t.newShape}let o=s.util.sizeFromShape(e);if(e.length<=1&&o<=n)return[1,o];if(2===e.length&&e[0]<=n&&e[1]<=n)return e;if(3===e.length&&e[0]*e[1]<=n&&e[2]<=n)return[e[0]*e[1],e[2]];if(3===e.length&&e[0]<=n&&e[1]*e[2]<=n)return[e[0],e[1]*e[2]];if(4===e.length&&e[0]*e[1]*e[2]<=n&&e[3]<=n)return[e[0]*e[1]*e[2],e[3]];if(4===e.length&&e[0]<=n&&e[1]*e[2]*e[3]<=n)return[e[0],e[1]*e[2]*e[3]];if(t){const t=M(e);let n=2,r=2;return e.length&&([n,r]=$(e)),o=t*(n/2)*(r/2),s.util.sizeToSquarishShape(o).map((e=>2*e))}return s.util.sizeToSquarishShape(o)}function B(e){return e%2==0}function L(e,t){if(e=e.slice(-2),t=t.slice(-2),s.util.arraysEqual(e,t))return!0;if(!e.length||!t.length)return!0;if(0===e[0]||0===e[1]||0===t[0]||0===t[1])return!0;if(e.length!==t.length){const n=e.slice(-1)[0],s=t.slice(-1)[0];if(n===s)return!0;if(B(n)&&B(s)&&(1===e[0]||1===t[0]))return!0}return e[1]===t[1]&&B(e[0])&&B(t[0])}let z,G;function U(e){if(null==z){const t=Object(o.getWebGLContext)(e);z=t.getParameter(t.MAX_TEXTURE_SIZE)}return z}function W(){z=null}function V(){G=null}function q(e){if(null==G){const t=Object(o.getWebGLContext)(e);G=t.getParameter(t.MAX_TEXTURE_IMAGE_UNITS)}return Math.min(16,G)}function H(e){if(0===e)return 0;let t;const n=Object(o.getWebGLContext)(e);return t=K(n,"EXT_disjoint_timer_query_webgl2")&&2===e?2:K(n,"EXT_disjoint_timer_query")?1:0,t}function K(e,t){return null!=e.getExtension(t)}function X(e){try{if(null!=Object(o.getWebGLContext)(e))return!0}catch(e){return console.log("Error when getting WebGL context: ",e),!1}return!1}function Y(e){if(0===e)return!1;const t=Object(o.getWebGLContext)(e);if(1===e){if(!K(t,"OES_texture_float"))return!1}else if(!K(t,"EXT_color_buffer_float"))return!1;return Q(t)}function Z(e){if(0===e)return!1;const t=Object(o.getWebGLContext)(e);if(1!==e){if(K(t,"EXT_color_buffer_float"))return Q(t);const e="EXT_color_buffer_half_float";if(K(t,e)){const n=t.getExtension(e);return function(e,t){const n=Object(r.getTextureConfig)(e,t),s=e.createTexture();e.bindTexture(e.TEXTURE_2D,s);const o=1,i=1;e.texImage2D(e.TEXTURE_2D,0,n.internalFormatHalfFloat,o,i,0,n.textureFormatFloat,n.textureTypeHalfFloat,null);const a=e.createFramebuffer();e.bindFramebuffer(e.FRAMEBUFFER,a),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,s,0);const u=e.checkFramebufferStatus(e.FRAMEBUFFER)===e.FRAMEBUFFER_COMPLETE;return e.bindTexture(e.TEXTURE_2D,null),e.bindFramebuffer(e.FRAMEBUFFER,null),e.deleteTexture(s),e.deleteFramebuffer(a),u}(t,n)}return!1}if(!K(t,"OES_texture_float"))return!1;if(!K(t,"WEBGL_color_buffer_float"))return!1;return Q(t)}function Q(e){const t=Object(r.getTextureConfig)(e),n=e.createTexture();e.bindTexture(e.TEXTURE_2D,n);e.texImage2D(e.TEXTURE_2D,0,t.internalFormatFloat,1,1,0,t.textureFormatFloat,t.textureTypeFloat,null);const s=e.createFramebuffer();e.bindFramebuffer(e.FRAMEBUFFER,s),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,n,0);const o=e.checkFramebufferStatus(e.FRAMEBUFFER)===e.FRAMEBUFFER_COMPLETE;return e.bindTexture(e.TEXTURE_2D,null),e.bindFramebuffer(e.FRAMEBUFFER,null),e.deleteTexture(n),e.deleteFramebuffer(s),o}function J(e){if(2!==e)return!1;return null!=Object(o.getWebGLContext)(e).fenceSync}function ee(e,t){Array.isArray(e)||(e=[e]),e.forEach((e=>{null!=e&&s.util.assert("complex64"!==e.dtype,(()=>`${t} does not support complex64 tensors in the WebGL backend.`))}))}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/backend_cpu.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/backend_cpu.js ***! + \***********************************************************************/ +/*! exports provided: MathBackendCPU */function(e,t,n){"use strict";n.r(t),n.d(t,"MathBackendCPU",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2021 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -5625,14 +5633,15 @@ let r;const i={kernelName:s.ScatterNd,backendName:"wasm",setupFunc:function(e){r * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */let o;const r={kernelName:s.Select,backendName:"wasm",kernelFunc:function(e){const{inputs:t,backend:n}=e,{condition:r,t:i,e:a}=t,d=n.dataIdMap.get(r.dataId).id,u=n.dataIdMap.get(i.dataId).id,l=n.dataIdMap.get(a.dataId).id,c=n.makeOutput(i.shape,i.dtype),f=n.dataIdMap.get(c.dataId).id,p=r.shape.length,m=i.shape.length,h=0===p||p>1||1===m?1:s.util.sizeFromShape(i.shape.slice(1));return o(d,u,l,h,f),c},setupFunc:function(e){o=e.wasm.cwrap("SelectV2",null,["number","number","number","number","number"])}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sigmoid.js": -/*!****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sigmoid.js ***! - \****************************************************************************/ -/*! exports provided: sigmoidConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sigmoidConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); + */ +const r=s.kernel_impls.whereImpl;class i extends s.KernelBackend{constructor(){super(),this.blockSize=48,this.firstUse=!0,this.data=new s.DataStorage(this,Object(s.engine)())}nextDataId(){return i.nextDataId++}write(e,t,n){this.firstUse&&(this.firstUse=!1,Object(s.env)().get("IS_NODE")&&s.backend_util.warn("\n============================\nHi there 👋. Looks like you are running TensorFlow.js in Node.js. To speed things up dramatically, install our node backend, which binds to TensorFlow C++, by running npm i @tensorflow/tfjs-node, or npm i @tensorflow/tfjs-node-gpu if you have CUDA. Then call require('@tensorflow/tfjs-node'); (-gpu suffix for CUDA) at the start of your program. Visit https://github.com/tensorflow/tfjs-node for more details.\n============================"));const o={id:this.nextDataId()};return this.data.set(o,{values:e,dtype:n,refCount:1}),o}makeTensorInfo(e,t,n){let o;if("string"===t&&null!=n&&n.length>0&&s.util.isString(n[0])){const r=n.map((e=>s.util.encodeString(e)));o=this.write(r,e,t)}else o=this.write(n,e,t);return{dataId:o,shape:e,dtype:t}}refCount(e){if(this.data.has(e)){return this.data.get(e).refCount}return 0}incRef(e){this.data.get(e).refCount++}decRef(e){if(this.data.has(e)){this.data.get(e).refCount--}}move(e,t,n,s,o){this.data.set(e,{values:t,dtype:s,refCount:o})}numDataIds(){return this.data.numDataIds()}async read(e){return this.readSync(e)}readSync(e){const{dtype:t,complexTensorInfos:n}=this.data.get(e);if("complex64"===t){const e=this.readSync(n.real.dataId),t=this.readSync(n.imag.dataId);return s.backend_util.mergeRealAndImagArrays(e,t)}return this.data.get(e).values}bufferSync(e){const t=this.readSync(e.dataId);let n=t;if("string"===e.dtype)try{n=t.map((e=>s.util.decodeString(e)))}catch(e){throw new Error("Failed to decode encoded string bytes into utf-8")}return Object(s.buffer)(e.shape,e.dtype,n)}makeOutput(e,t,n){const o=this.write(e,t,n);return Object(s.engine)().makeTensorFromDataId(o,t,n,this)}disposeData(e,t=!1){if(this.data.has(e)){if(this.data.get(e).refCount--,!t&&this.data.get(e).refCount>0)return!1;const{complexTensorInfos:n}=this.data.get(e);null!=n&&(this.disposeData(n.real.dataId,!0),this.disposeData(n.imag.dataId,!0)),this.data.delete(e)}return!0}disposeIntermediateTensorInfo(e){this.disposeData(e.dataId)}async time(e){const t=s.util.now();e();return{kernelMs:s.util.now()-t}}memory(){return{unreliable:!0,reasons:["The reported memory is an upper bound. Due to automatic garbage collection, the true allocated memory may be less."]}}where(e){Object(o.assertNotComplex)([e],"where");const t=this.readSync(e.dataId);return r(e.shape,t)}dispose(){}floatPrecision(){return 32}epsilon(){return super.epsilon()}}i.nextDataId=0},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/base.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/base.js ***! + \****************************************************************/ +/*! exports provided: MathBackendCPU, version_cpu, shared */function(e,t,n){"use strict";n.r(t);var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./backend_cpu */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/backend_cpu.js"),r=n(/*! ./shared */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/shared.js");n.d(t,"shared",(function(){return r})),n.d(t,"MathBackendCPU",(function(){return o.MathBackendCPU}));var i=n(/*! ./version */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/version.js");n.d(t,"version_cpu",(function(){return i.version})), /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -5645,11 +5654,12 @@ let r;const i={kernelName:s.ScatterNd,backendName:"wasm",setupFunc:function(e){r * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */let o;const r={kernelName:"Sigmoid",backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.Sigmoid,null,["number","number"])},kernelFunc:function(e){const{backend:t,inputs:{x:n}}=e,r=t.dataIdMap.get(n.dataId).id,i=t.makeOutput(n.shape,n.dtype),a=t.dataIdMap.get(i.dataId).id;return 0===s.util.sizeFromShape(i.shape)||o(r,a),i}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sin.js": -/*!************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sin.js ***! - \************************************************************************/ -/*! exports provided: sinConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sinConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); + */ +Object(s.registerBackend)("cpu",(()=>new o.MathBackendCPU),1)},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js ***! + \********************************************************************/ +/*! exports provided: assertNotComplex */function(e,t,n){"use strict";n.r(t),n.d(t,"assertNotComplex",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license * Copyright 2019 Google LLC. All Rights Reserved. @@ -5665,15 +5675,14 @@ let r;const i={kernelName:s.ScatterNd,backendName:"wasm",setupFunc:function(e){r * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -const r=Object(o.createUnaryKernelConfig)(s.Sin)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Slice.js": -/*!**************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Slice.js ***! - \**************************************************************************/ -/*! exports provided: slice, sliceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"slice",(function(){return r})),n.d(t,"sliceConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernel_utils/shared.js"); + */function o(e,t){Array.isArray(e)||(e=[e]),e.forEach((e=>{null!=e&&s.util.assert("complex64"!==e.dtype,(()=>`${t} does not support complex64 tensors in the CPU backend.`))}))}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/index.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/index.js ***! + \*****************************************************************/ +/*! exports provided: MathBackendCPU, version_cpu, shared */function(e,t,n){"use strict";n.r(t);var s=n(/*! ./base */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/base.js");n.d(t,"MathBackendCPU",(function(){return s.MathBackendCPU})),n.d(t,"version_cpu",(function(){return s.version_cpu})),n.d(t,"shared",(function(){return s.shared}));n(/*! ./register_all_kernels */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/register_all_kernels.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -5686,74 +5695,74 @@ const r=Object(o.createUnaryKernelConfig)(s.Sin)},"./node_modules/@tensorflow/tf * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -function r(e){const{inputs:{x:t},attrs:{begin:n,size:r},backend:i}=e,[a,d]=s.slice_util.parseSliceParams(t,n,r),u=s.slice_util.isSliceContinous(t.shape,a,d),l=i.readSync(t.dataId),c=i.makeOutput(d,t.dtype),f=s.util.computeStrides(t.shape),p=i.dataIdMap.get(c.dataId);if(u){const e=s.slice_util.computeFlatOffset(a,f);if("string"===t.dtype)p.stringBytes=l.slice(e,e+s.util.sizeFromShape(d));else{i.typedArrayFromHeap(c).set(l.subarray(e,e+s.util.sizeFromShape(d)))}return c}if("string"===t.dtype){const e=Object(o.sliceImplCPU)(l,a,d,t.shape,t.dtype);return p.stringBytes=e,c}const m=i.typedArrayFromHeap(c),h=t.shape.length;if(2===h)!function(e,t,n,s,o){let r=0;const i=s[0],a=s[1],d=i+o[0];for(let s=i;s{const{x:t}=e.inputs,n=e.backend;Object(o.assertNotComplex)(t,"abs");let i=new Float32Array(s.util.sizeFromShape(t.shape));return i=r(n.data.get(t.dataId).values),n.makeOutput(i,t.shape,"float32")},a={kernelName:s.Abs,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Acos.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Acos.js ***! + \************************************************************************/ +/*! exports provided: acos, acosConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"acos",(function(){return r})),n.d(t,"acosConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); /** * @license - * Copyright 2021 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the "License"); + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, + * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -function(e){const{inputs:t,backend:n,attrs:a}=e,{x:d}=t,{blockShape:u,paddings:l}=a,c=s.util.sizeFromShape(u),f=[[0,0]];f.push(...l);for(let e=1+u.length;eMath.acos(e))),i={kernelName:s.Acos,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Acosh.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Acosh.js ***! + \*************************************************************************/ +/*! exports provided: acosh, acoshConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"acosh",(function(){return r})),n.d(t,"acoshConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the "License"); + * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, + * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -function r(e){const{inputs:t,attrs:n,backend:r}=e,{x:i}=t,{numOrSizeSplits:a,axis:d}=n,u=s.util.parseAxisParam(d,i.shape)[0],l=s.backend_util.prepareSplitSize(i,a,u),c=new Array(i.shape.length).fill(0),f=i.shape.slice();return l.map((e=>{const t=[...f];t[u]=e;const n=Object(o.slice)({inputs:{x:i},attrs:{begin:c,size:t},backend:r});return c[u]+=e,n}))}const i={kernelName:s.SplitV,backendName:"wasm",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sqrt.js": -/*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sqrt.js ***! - \*************************************************************************/ -/*! exports provided: sqrtConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sqrtConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); +const r=Object(o.unaryKernelFunc)(s.Acosh,(e=>Math.acosh(e))),i={kernelName:s.Acosh,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Add.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Add.js ***! + \***********************************************************************/ +/*! exports provided: addImpl, addComplexImpl, add, addConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"addImpl",(function(){return i})),n.d(t,"addComplexImpl",(function(){return a})),n.d(t,"add",(function(){return u})),n.d(t,"addConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -5770,14 +5779,14 @@ function r(e){const{inputs:t,attrs:n,backend:r}=e,{x:i}=t,{numOrSizeSplits:a,axi * limitations under the License. * ============================================================================= */ -const r=Object(o.createUnaryKernelConfig)(s.Sqrt)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Square.js": -/*!***************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Square.js ***! - \***************************************************************************/ -/*! exports provided: squareConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"squareConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); +const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>e+t)),a=Object(r.createComplexBinaryKernelImpl)(((e,t,n,s)=>({real:e+n,imag:t+s}))),u=Object(r.binaryKernelFunc)(s.Add,i,a),d={kernelName:s.Add,backendName:"cpu",kernelFunc:u}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AddN.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AddN.js ***! + \************************************************************************/ +/*! exports provided: addN, addNConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"addN",(function(){return r})),n.d(t,"addNConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -5791,14 +5800,14 @@ const r=Object(o.createUnaryKernelConfig)(s.Sqrt)},"./node_modules/@tensorflow/t * limitations under the License. * ============================================================================= */ -const r=Object(o.createUnaryKernelConfig)(s.Square)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/SquaredDifference.js": -/*!**************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/SquaredDifference.js ***! - \**************************************************************************************/ -/*! exports provided: squaredDifferenceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"squaredDifferenceConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); +function r(e){const{inputs:t,backend:n}=e,r=t;Object(o.assertNotComplex)(t,"addN");const i=r.map((e=>n.data.get(e.dataId).values)),a=Object(s.buffer)(r[0].shape,r[0].dtype),u=a.values;for(let e=0;e1)throw new Error("Multiple ellipses in slice is not allowed.");if(0!==m&&0!==h)throw new Error("Using both ellipsisMask and newAxisMask is not yet supported.");if(0!==m&&0!==b)throw new Error("Using both ellipsisMask and shrinkAxisMask is not yet supported.");const g=d.shape.length-u.length,w=s.backend_util.slice_util.maskToAxes(h),_=d.shape.slice();w.forEach((e=>{u[e]=0,l[e]=1,_.splice(e,0,1)}));const k=Object(o.reshape)({inputs:{x:d},attrs:{shape:_},backend:t}),{begin:v,end:x,strides:y}=s.backend_util.slice_util.getNormalizedAxes(k.shape,j,g,u,l,c,f,p,m);u=v,l=x,c=y;const O=s.backend_util.slice_util.maskToAxes(b);O.forEach((e=>{l[e]=u[e]+1,c[e]=1}));const I=s.backend_util.slice_util.computeOutShape(u,l,c),C=I.filter(((e,t)=>-1===O.indexOf(t)));if(c.every((e=>1===e))){const e=Object(r.slice)({inputs:{x:k},attrs:{begin:u,size:I},backend:t});t.disposeData(k.dataId);const n=Object(o.reshape)({inputs:{x:e},attrs:{shape:C},backend:t});return t.disposeData(e.dataId),n}const S=t.makeOutput(C,"float32");if(!C.some((e=>0===e))){const e=t.dataIdMap.get(k.dataId).id,n=new Uint8Array(new Int32Array(s.util.computeStrides(k.shape)).buffer),o=new Uint8Array(new Int32Array(u).buffer),r=new Uint8Array(new Int32Array(l).buffer),a=new Uint8Array(new Int32Array(c).buffer),d=new Uint8Array(new Int32Array(C).buffer),f=new Uint8Array(new Int32Array(s.util.computeStrides(C)).buffer),p=t.dataIdMap.get(S.dataId).id;i(e,n,k.shape.length,o,r,a,d,f,C.length,p)}t.disposeData(k.dataId);const T=Object(o.reshape)({inputs:{x:S},attrs:{shape:C},backend:t});return t.disposeData(S.dataId),T}const d={kernelName:s.StridedSlice,backendName:"wasm",setupFunc:function(e){i=e.wasm.cwrap(s.StridedSlice,null,["number","array","number","array","array","array","array","array","number","number"])},kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sub.js": -/*!************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sub.js ***! - \************************************************************************/ -/*! exports provided: subConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"subConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); +function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{axis:u}=i;Object(o.assertNotComplex)(a,"argMax");let d=s.util.parseAxisParam(u,a.shape);const l=s.backend_util.getAxesPermutation(d,a.shape.length);let c=a;const f=[];null!=l&&(c=Object(r.transpose)({inputs:{x:a},backend:n,attrs:{perm:l}}),f.push(c),d=s.backend_util.getInnerMostAxes(d.length,c.shape.length)),d=[d[0]],s.backend_util.assertAxesAreInnerMostDims("argMax",d,c.shape.length);const[p,m]=s.backend_util.computeOutAndReduceShapes(c.shape,d),h=s.util.sizeFromShape(p),b=s.util.makeZerosTypedArray(h,"int32"),j=s.util.sizeFromShape(m),g=n.data.get(c.dataId).values;for(let e=0;en&&(n=o,s=e)}b[e]=s}return f.forEach((e=>n.disposeIntermediateTensorInfo(e))),n.makeTensorInfo(p,"int32",b)}const a={kernelName:s.ArgMax,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ArgMin.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ArgMin.js ***! + \**************************************************************************/ +/*! exports provided: argMin, argMinConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"argMin",(function(){return i})),n.d(t,"argMinConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -5874,119 +5884,119 @@ let i;function a(e){const{backend:t,inputs:n,attrs:a}=e,{x:d}=n;let{begin:u,end: * limitations under the License. * ============================================================================= */ -const r=Object(o.createBinaryKernelConfig)(s.Sub,!0)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sum.js": +function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{axis:u}=i;Object(o.assertNotComplex)(a,"argMin");let d=s.util.parseAxisParam(u,a.shape);const l=s.backend_util.getAxesPermutation(d,a.shape.length);let c=a;const f=[];null!=l&&(c=Object(r.transpose)({inputs:{x:a},backend:n,attrs:{perm:l}}),f.push(c),d=s.backend_util.getInnerMostAxes(d.length,c.shape.length)),d=[d[0]],s.backend_util.assertAxesAreInnerMostDims("argMin",d,c.shape.length);const[p,m]=s.backend_util.computeOutAndReduceShapes(c.shape,d),h=s.util.sizeFromShape(p),b=s.util.makeZerosTypedArray(h,"int32"),j=s.util.sizeFromShape(m),g=n.data.get(c.dataId).values;for(let e=0;en.disposeIntermediateTensorInfo(e))),n.makeTensorInfo(p,"int32",b)}const a={kernelName:s.ArgMin,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Asin.js": /*!************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sum.js ***! + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Asin.js ***! \************************************************************************/ -/*! exports provided: sumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sumConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./kernel_utils */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/kernel_utils.js"); +/*! exports provided: asin, asinConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"asin",(function(){return r})),n.d(t,"asinConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the "License"); + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, + * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -let r;const i={kernelName:s.Sum,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.Sum,null,["number, number, number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:i}=e,{axis:a,keepDims:d}=i,{x:u}=n,l=t.dataIdMap.get(u.dataId).id;let c=l,f=u;const{transposed:p,axes:m,originalAxes:h,inputWasTransposed:b}=Object(o.permuteAxesAndTranspose)(u,a,t);let j=m;if(b){const e=t.dataIdMap.get(p.dataId).id;e!==l&&(f=p,c=e,j=s.backend_util.getInnerMostAxes(j.length,f.shape.length))}s.backend_util.assertAxesAreInnerMostDims("sum",j,f.shape.length);const[g,w]=s.backend_util.computeOutAndReduceShapes(f.shape,j),_=s.util.sizeFromShape(w),k=t.makeOutput(g,f.dtype);if(0!==s.util.sizeFromShape(f.shape)){const e=t.dataIdMap.get(k.dataId).id;r(c,_,e)}if(b&&t.disposeData(p.dataId),d){const e=s.backend_util.expandShapeToKeepDim(k.shape,h);k.shape=e}return k}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Tan.js": -/*!************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Tan.js ***! - \************************************************************************/ -/*! exports provided: tanConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"tanConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); +const r=Object(o.unaryKernelFunc)(s.Asin,(e=>Math.asin(e))),i={kernelName:s.Asin,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Asinh.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Asinh.js ***! + \*************************************************************************/ +/*! exports provided: asinh, asinhConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"asinh",(function(){return r})),n.d(t,"asinhConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); /** * @license - * Copyright 2021 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the "License"); + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, + * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -const r=Object(o.createUnaryKernelConfig)(s.Tan)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Tanh.js": -/*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Tanh.js ***! - \*************************************************************************/ -/*! exports provided: tanhConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"tanhConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); +const r=Object(o.unaryKernelFunc)(s.Asinh,(e=>Math.asinh(e))),i={kernelName:s.Asinh,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atan.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atan.js ***! + \************************************************************************/ +/*! exports provided: atan, atanConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"atan",(function(){return r})),n.d(t,"atanConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the "License"); + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, + * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -const r=Object(o.createUnaryKernelConfig)(s.Tanh)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Tile.js": +const r=Object(o.unaryKernelFunc)(s.Atan,(e=>Math.atan(e))),i={kernelName:s.Atan,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atan2.js": /*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Tile.js ***! + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atan2.js ***! \*************************************************************************/ -/*! exports provided: tileConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"tileConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); +/*! exports provided: atan2Impl, atan2, atan2Config */function(e,t,n){"use strict";n.r(t),n.d(t,"atan2Impl",(function(){return i})),n.d(t,"atan2",(function(){return a})),n.d(t,"atan2Config",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the "License"); + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, + * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -let r;const i={kernelName:s.Tile,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.Tile,null,["number","array","number","array","number","number"])},kernelFunc:function(e){const{inputs:t,backend:n,attrs:s}=e,{x:i}=t,a=n.dataIdMap.get(i.dataId).id,{reps:d}=s,u=new Array(i.shape.length);for(let e=0;eMath.atan2(e,t))),a=Object(r.binaryKernelFunc)(s.Atan2,i),u={kernelName:s.Atan2,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atanh.js": /*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/TopK.js ***! + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atanh.js ***! \*************************************************************************/ -/*! exports provided: topk, topKConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"topk",(function(){return i})),n.d(t,"topKConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); +/*! exports provided: atanh, atanhConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"atanh",(function(){return r})),n.d(t,"atanhConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the "License"); + * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, + * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -let r;const i=({inputs:e,backend:t,attrs:n})=>{const{x:s}=e,{k:i,sorted:a}=n,d=t.dataIdMap.get(s.dataId).id,u=new Uint8Array(new Int32Array(s.shape).buffer),l=s.shape.slice();l[l.length-1]=i;const c=t.makeOutput(l,s.dtype),f=t.dataIdMap.get(c.dataId).id,p=t.makeOutput(l,"int32"),m=t.dataIdMap.get(p.dataId).id;return r(d,u,s.shape.length,o.CppDType[s.dtype],i,a,f,m),[c,p]},a={kernelName:s.TopK,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.TopK,null,["number","array","number","number","number","bool","number","number"])},kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Transform.js": -/*!******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Transform.js ***! - \******************************************************************************/ -/*! exports provided: transformConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"transformConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +const r=Object(o.unaryKernelFunc)(s.Atanh,(e=>Math.atanh(e))),i={kernelName:s.Atanh,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPool.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPool.js ***! + \***************************************************************************/ +/*! exports provided: avgPool, avgPoolConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"avgPool",(function(){return a})),n.d(t,"avgPoolConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ../utils/pool_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/pool_utils.js"),i=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Identity.js"); /** * @license - * Copyright 2021 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -5999,14 +6009,15 @@ let r;const i=({inputs:e,backend:t,attrs:n})=>{const{x:s}=e,{k:i,sorted:a}=n,d=t * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */let o;const r={kernelName:s.Transform,backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.Transform,null,["number","number","bool","number","number","number","number","number","number","array","number","number","number","number","number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:r}=e,{image:i,transforms:a}=n,{interpolation:d,fillMode:u,fillValue:l,outputShape:c}=r,[f,p,m,h]=i.shape,[b,j]=null!=c?c:[p,m],g=[f,b,j,h],w=new Uint8Array(new Int32Array(s.util.computeStrides(i.shape)).buffer),_=t.makeOutput(g,i.dtype),k=t.dataIdMap.get(_.dataId).id,v=t.dataIdMap.get(i.dataId).id,x=t.dataIdMap.get(a.dataId).id,y="nearest"===d?1:2;let O;switch(u){case"constant":O=1;break;case"reflect":O=2;break;case"wrap":O=3;break;case"nearest":O=4;break;default:O=1}return o(v,x,a.shape[0]>1,f,b,j,h,m,p,w,i.shape.length-1,y,O,l,k),_}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Transpose.js": -/*!******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Transpose.js ***! - \******************************************************************************/ -/*! exports provided: transpose, transposeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"transpose",(function(){return a})),n.d(t,"transposeConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Identity.js"),r=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); + */ +function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:u}=t;Object(o.assertNotComplex)(u,"avgPool");const{filterSize:d,strides:l,pad:c,dimRoundingMode:f}=a;s.util.assert(s.backend_util.eitherStridesOrDilationsAreOne(l,1),(()=>`Error in avgPool: Either strides or dilations must be 1. Got strides ${l} and dilations '1'`));const p=s.backend_util.computePool2DInfo(u.shape,d,l,1,c,f);let m;if(1===p.filterWidth&&1===p.filterHeight&&s.util.arraysEqual(p.inShape,p.outShape))m=Object(i.identity)({inputs:{x:u},backend:n});else{const e=n.data.get(u.dataId).values,t=s.util.computeStrides(u.shape),o=Object(r.pool)(e,u.shape,u.dtype,t,p,"avg");m=n.makeTensorInfo(p.outShape,u.dtype,o.values)}return m}const u={kernelName:s.AvgPool,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPool3D.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPool3D.js ***! + \*****************************************************************************/ +/*! exports provided: avgPool3D, avgPool3DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"avgPool3D",(function(){return i})),n.d(t,"avgPool3DConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ../utils/pool_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/pool_utils.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -6020,14 +6031,14 @@ let r;const i=({inputs:e,backend:t,attrs:n})=>{const{x:s}=e,{k:i,sorted:a}=n,d=t * limitations under the License. * ============================================================================= */ -let i;function a(e){const{inputs:t,backend:n,attrs:s}=e,[a,d]=function(e,t){const n=[],s=[];for(let o=0;o=e&&(-1===t||s[t]>s[n])&&(t=n);s[t]=e}return[n,s]}(t.x.shape,s.perm);let u=!0;for(let e=0;e({dataId:e,dtype:t,shape:u})))}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ZerosLike.js": -/*!******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ZerosLike.js ***! - \******************************************************************************/ -/*! exports provided: zerosLikeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"zerosLikeConfig",(function(){return s}));const s={kernelName:n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js").ZerosLike,backendName:"wasm",kernelFunc: +function r(e){const{inputs:t,backend:n,attrs:r}=e,{dy:i,input:a}=t,{filterSize:u,strides:d,pad:l,dimRoundingMode:c}=r;Object(o.assertNotComplex)([i,a],"avgPool3DGrad");const f=s.backend_util.computePool3DInfo(a.shape,u,d,1,l,c),p=f.strideDepth,m=f.strideHeight,h=f.strideWidth,b=f.filterDepth,j=f.filterHeight,g=f.filterWidth,w=f.dilationDepth,_=f.dilationHeight,k=f.dilationWidth,v=f.effectiveFilterDepth,x=f.effectiveFilterHeight,y=f.effectiveFilterWidth,O=v-1-f.padInfo.front,I=y-1-f.padInfo.left,C=x-1-f.padInfo.top,S=Object(s.buffer)(a.shape,"float32"),T=1/(b*j*g),N=n.bufferSync(i);for(let e=0;e=f.outDepth||Math.floor(s)!==s))for(let n=0;n=f.outHeight||Math.floor(o)!==o))for(let n=0;n=f.outWidth||Math.floor(r)!==r)continue;u+=N.get(e,s,o,r,t)}}}S.set(u*T,e,n,s,o,t)}return n.makeTensorInfo(S.shape,S.dtype,S.values)}const i={kernelName:s.AvgPool3DGrad,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPoolGrad.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPoolGrad.js ***! + \*******************************************************************************/ +/*! exports provided: avgPoolGrad, avgPoolGradConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"avgPoolGrad",(function(){return r})),n.d(t,"avgPoolGradConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -6062,35 +6073,35 @@ function(e){const{inputs:t,backend:n,attrs:s}=e,{value:r}=t;let{axis:i}=s;i<0&&( * limitations under the License. * ============================================================================= */ -function(e){const{inputs:{x:t},backend:n}=e,s=n.makeOutput(t.shape,t.dtype);return n.typedArrayFromHeap(s).fill(0),s}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/_FusedMatMul.js": -/*!*********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/_FusedMatMul.js ***! - \*********************************************************************************/ -/*! exports provided: fusedMatMulConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fusedMatMulConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); +function r(e){const{inputs:t,backend:n,attrs:r}=e,{dy:i,input:a}=t,u=a;Object(o.assertNotComplex)([i,a],"avgPoolGrad");const{filterSize:d,strides:l,pad:c}=r,f=s.backend_util.computePool2DInfo(u.shape,d,l,1,c),p=f.strideHeight,m=f.strideWidth,h=f.filterHeight,b=f.filterWidth,j=f.dilationHeight,g=f.dilationWidth,w=f.effectiveFilterHeight,_=f.effectiveFilterWidth,k=_-1-f.padInfo.left,v=w-1-f.padInfo.top,x=Object(s.buffer)(u.shape,"float32"),y=1/(h*b),O=n.data.get(i.dataId).values,I=Object(s.buffer)(i.shape,"float32",O);for(let e=0;e=f.outHeight||Math.floor(s)!==s))for(let n=0;n<_;n+=g){const o=(r+n)/m;if(o<0||o>=f.outWidth||Math.floor(o)!==o)continue;i+=I.get(e,s,o,t)}}x.set(i*y,e,n,s,t)}return n.makeTensorInfo(x.shape,x.dtype,x.values)}const i={kernelName:s.AvgPoolGrad,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchMatMul.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchMatMul.js ***! + \*******************************************************************************/ +/*! exports provided: batchMatMul, batchMatMulConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"batchMatMul",(function(){return i})),n.d(t,"batchMatMulConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the "License"); + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, + * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -let r;const i={kernelName:s._FusedMatMul,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s._FusedMatMul,null,["number","array","number","number","array","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:t,backend:n,attrs:s}=e,{a:i,b:a,bias:d,preluActivationWeights:u}=t;if("float32"!==i.dtype||"float32"!==a.dtype)throw new Error("_FusedMatMul for non non-float32 tensors not yet supported.");const{transposeA:l,transposeB:c,activation:f,leakyreluAlpha:p}=s,m=n.dataIdMap.get(i.dataId).id,h=n.dataIdMap.get(a.dataId).id;let b=0;if(null!=d){const e=n.dataIdMap.get(d.dataId);if(1!==e.shape.length)throw new Error(`_FusedMatMul only supports rank-1 bias but got rank ${e.shape.length}.`);b=e.id}const j=null==u?0:n.dataIdMap.get(u.dataId).id,g=o.FusableActivation[f];if(null==g)throw new Error(`${f} activation not yet supported for FusedConv2D in the wasm backend.`);const w=l?i.shape[2]:i.shape[1],_=c?a.shape[1]:a.shape[2],k=i.shape[0],v=n.makeOutput([k,w,_],i.dtype),x=n.dataIdMap.get(v.dataId).id,y=new Uint8Array(new Int32Array(i.shape).buffer),O=new Uint8Array(new Int32Array(a.shape).buffer);return r(m,y,i.shape.length,h,O,a.shape.length,l,c,g,b,j,p||0,x),v}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js": -/*!**********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js ***! - \**********************************************************************************/ -/*! exports provided: createBinaryKernelConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"createBinaryKernelConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); +function i(e){const{inputs:t,backend:n,attrs:i}=e,{a:a,b:u}=t,{transposeA:d,transposeB:l}=i;Object(o.assertNotComplex)([a,u],"matMul");const c=a.shape.length,f=u.shape.length,p=d?a.shape[c-2]:a.shape[c-1],m=l?u.shape[f-1]:u.shape[f-2],h=d?a.shape[c-1]:a.shape[c-2],b=l?u.shape[f-2]:u.shape[f-1],j=a.shape.slice(0,-2),g=u.shape.slice(0,-2),w=s.util.sizeFromShape(j),_=s.util.sizeFromShape(g),k=w===_||1===w||1===_;s.util.assert(c>=2&&f>=2&&k,(()=>`Error in matMul: the input batch dimensions must either be the same or at least one input batch dimension must be 1. Got input batch dimensions of (${j}) and (${g}).`));const v=(w>_?a.shape.slice(0,-2):u.shape.slice(0,-2)).concat([h,b]);s.util.assert(p===m,(()=>`Error in matMul: inner shapes (${p}) and (${m}) of Tensors with shapes ${a.shape} and ${u.shape} and transposeA=${d} and transposeB=${l} must match.`));const x=d?[w,p,h]:[w,h,p],y=l?[_,b,m]:[_,m,b],O=Object(r.reshape)({inputs:{x:a},backend:n,attrs:{shape:x}}),I=Object(r.reshape)({inputs:{x:u},backend:n,attrs:{shape:y}}),C=d?O.shape[1]:O.shape[2],S=d?O.shape[2]:O.shape[1],T=l?I.shape[1]:I.shape[2],N=Math.max(w,_),E=n.data.get(O.dataId).values,A=n.data.get(I.dataId).values,R=s.util.computeStrides(O.shape),F=s.util.computeStrides(I.shape),[M,$,D]=d?[R[0],1,R[1]]:[R[0],R[1],1],[P,B,L]=l?[1,F[1],F[0]]:[F[1],1,F[0]],z=S*T,G=Object(s.buffer)([N,S,T],O.dtype),U=G.values,W=n.blockSize;for(let e=0;er(c,b,u.shape.length,f,j,l.shape.length,o.CppDType[u.dtype],g);if(t&&"float32"===u.dtype)return w(),h;const _=s.backend_util.getBroadcastDims(u.shape,m),k=s.backend_util.getBroadcastDims(l.shape,m),v=_.every(((e,t)=>e===t)),x=k.every(((e,t)=>e===t));if(v&&x)return w(),h;throw new Error(`Broadcasting along outer dims is not yet supported for ${u.dtype} ${e}.`)}}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/kernel_utils.js": -/*!*********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/kernel_utils.js ***! - \*********************************************************************************/ -/*! exports provided: permuteAxesAndTranspose */function(e,t,n){"use strict";n.r(t),n.d(t,"permuteAxesAndTranspose",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Transpose.js"); +function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i,scale:a,offset:u,mean:d,variance:l}=t;s.util.assert(d.shape.length===l.shape.length,(()=>"Batch normalization gradient requires mean and variance to have equal ranks.")),s.util.assert(null==u||d.shape.length===u.shape.length,(()=>"Batch normalization gradient requires mean and offset to have equal ranks.")),s.util.assert(null==a||d.shape.length===a.shape.length,(()=>"Batch normalization gradient requires mean and scale to have equal ranks.")),Object(o.assertNotComplex)([i,d,l,a,u],"batchNorm");let{varianceEpsilon:c}=r;null==c&&(c=.001);const f=n.data.get(i.dataId).values,p=n.data.get(d.dataId).values,m=n.data.get(l.dataId).values,h=a?n.data.get(a.dataId).values:new Float32Array([1]),b=u?n.data.get(u.dataId).values:new Float32Array([0]),j=new Float32Array(f.length),g=b.length,w=h.length,_=m.length,k=p.length;let v=0,x=0,y=0,O=0;for(let e=0;e=g&&(v=0),x>=k&&(x=0),y>=w&&(y=0),O>=_&&(O=0);return n.makeTensorInfo(i.shape,i.dtype,j)}const i={kernelName:s.FusedBatchNorm,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchToSpaceND.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchToSpaceND.js ***! + \**********************************************************************************/ +/*! exports provided: batchToSpaceND, batchToSpaceNDConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"batchToSpaceND",(function(){return u})),n.d(t,"batchToSpaceNDConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"),i=n(/*! ./Slice */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Slice.js"),a=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose.js"); /** * @license - * Copyright 2020 Google Inc. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -6125,14 +6136,14 @@ function r(e,t,n){let r;return{kernelName:e,backendName:"wasm",setupFunc:functio * limitations under the License. * ============================================================================= */ -function r(e,t,n){const r=e.shape,i=e.shape.length,a=s.util.parseAxisParam(t,r);let d=a;const u=s.backend_util.getAxesPermutation(d,i);let l=null,c=!1;if(null!=u){const t=new Array(i);for(let e=0;ee*t)),p=s.backend_util.getReshaped(d.shape,l,f),m=s.backend_util.getPermuted(p.length,l.length),h=s.backend_util.getReshapedPermuted(d.shape,l,f),b=s.backend_util.getSliceBeginCoords(c,l.length),j=s.backend_util.getSliceSize(h,c,l.length),g=Object(r.reshape)({inputs:{x:d},backend:n,attrs:{shape:p}}),w=Object(a.transpose)({inputs:{x:g},backend:n,attrs:{perm:m}}),_=Object(r.reshape)({inputs:{x:w},backend:n,attrs:{shape:h}}),k=Object(i.slice)({inputs:{x:_},backend:n,attrs:{begin:b,size:j}});return n.disposeIntermediateTensorInfo(g),n.disposeIntermediateTensorInfo(w),n.disposeIntermediateTensorInfo(_),k}const d={kernelName:s.BatchToSpaceND,backendName:"cpu",kernelFunc:u}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Bincount.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Bincount.js ***! + \****************************************************************************/ +/*! exports provided: bincount, bincountConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"bincount",(function(){return r})),n.d(t,"bincountConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Bincount_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Bincount_impl.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -6146,14 +6157,14 @@ function r(e,t,n){const r=e.shape,i=e.shape.length,a=s.util.parseAxisParam(t,r); * limitations under the License. * ============================================================================= */ -var s,o;n.r(t),n.d(t,"CppDType",(function(){return s})),n.d(t,"FusableActivation",(function(){return o})),function(e){e[e.float32=0]="float32",e[e.int32=1]="int32",e[e.bool=2]="bool",e[e.string=3]="string",e[e.complex64=4]="complex64"}(s||(s={})),function(e){e[e.linear=0]="linear",e[e.relu=1]="relu",e[e.relu6=2]="relu6",e[e.prelu=3]="prelu",e[e.leakyrelu=4]="leakyrelu",e[e.sigmoid=5]="sigmoid"}(o||(o={}))},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js": +function r(e){const{inputs:t,backend:n,attrs:s}=e,{x:r,weights:i}=t,{size:a}=s,u=n.data.get(r.dataId).values,d=n.data.get(i.dataId).values,l=Object(o.bincountImpl)(u,d,i.dtype,i.shape,a);return n.makeTensorInfo([a],i.dtype,l)}const i={kernelName:s.Bincount,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Bincount_impl.js": /*!*********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js ***! + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Bincount_impl.js ***! \*********************************************************************************/ -/*! exports provided: createUnaryKernelConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"createUnaryKernelConfig",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/*! exports provided: bincountImpl, bincountReduceImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"bincountImpl",(function(){return o})),n.d(t,"bincountReduceImpl",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -6166,11 +6177,11 @@ var s,o;n.r(t),n.d(t,"CppDType",(function(){return s})),n.d(t,"FusableActivation * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */function o(e){let t;return{kernelName:e,backendName:"wasm",setupFunc:function(n){t=n.wasm.cwrap(e,null,["number","number"])},kernelFunc:function(e){const{backend:n,inputs:{x:o}}=e,r=n.dataIdMap.get(o.dataId).id,i=n.makeOutput(o.shape,o.dtype),a=n.dataIdMap.get(i.dataId).id;return 0===s.util.sizeFromShape(i.shape)||t(r,a),i}}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/register_all_kernels.js": -/*!*********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/register_all_kernels.js ***! - \*********************************************************************************/ -/*! no exports provided */function(e,t,n){"use strict";n.r(t);var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./kernels/_FusedMatMul */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/_FusedMatMul.js"),r=n(/*! ./kernels/Abs */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Abs.js"),i=n(/*! ./kernels/Add */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Add.js"),a=n(/*! ./kernels/AddN */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/AddN.js"),d=n(/*! ./kernels/All */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/All.js"),u=n(/*! ./kernels/Any */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Any.js"),l=n(/*! ./kernels/ArgMax */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ArgMax.js"),c=n(/*! ./kernels/AvgPool */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/AvgPool.js"),f=n(/*! ./kernels/BatchMatMul */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/BatchMatMul.js"),p=n(/*! ./kernels/BatchToSpaceND */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/BatchToSpaceND.js"),m=n(/*! ./kernels/Cast */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Cast.js"),h=n(/*! ./kernels/Ceil */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Ceil.js"),b=n(/*! ./kernels/ClipByValue */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ClipByValue.js"),j=n(/*! ./kernels/Concat */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Concat.js"),g=n(/*! ./kernels/Conv2D */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Conv2D.js"),w=n(/*! ./kernels/Conv2DBackpropInput */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Conv2DBackpropInput.js"),_=n(/*! ./kernels/Cos */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Cos.js"),k=n(/*! ./kernels/Cosh */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Cosh.js"),v=n(/*! ./kernels/CropAndResize */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/CropAndResize.js"),x=n(/*! ./kernels/Cumsum */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Cumsum.js"),y=n(/*! ./kernels/DepthToSpace */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/DepthToSpace.js"),O=n(/*! ./kernels/DepthwiseConv2dNative */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/DepthwiseConv2dNative.js"),I=n(/*! ./kernels/Equal */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Equal.js"),C=n(/*! ./kernels/Exp */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Exp.js"),S=n(/*! ./kernels/ExpandDims */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ExpandDims.js"),T=n(/*! ./kernels/Fill */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Fill.js"),N=n(/*! ./kernels/FlipLeftRight */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FlipLeftRight.js"),E=n(/*! ./kernels/Floor */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Floor.js"),A=n(/*! ./kernels/FloorDiv */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FloorDiv.js"),R=n(/*! ./kernels/FusedBatchNorm */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FusedBatchNorm.js"),F=n(/*! ./kernels/FusedConv2D */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FusedConv2D.js"),$=n(/*! ./kernels/FusedDepthwiseConv2D */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FusedDepthwiseConv2D.js"),M=n(/*! ./kernels/GatherNd */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/GatherNd.js"),D=n(/*! ./kernels/GatherV2 */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/GatherV2.js"),P=n(/*! ./kernels/Greater */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Greater.js"),B=n(/*! ./kernels/GreaterEqual */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/GreaterEqual.js"),L=n(/*! ./kernels/Identity */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Identity.js"),z=n(/*! ./kernels/LeakyRelu */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/LeakyRelu.js"),G=n(/*! ./kernels/Less */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Less.js"),W=n(/*! ./kernels/LessEqual */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/LessEqual.js"),U=n(/*! ./kernels/Log */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Log.js"),V=n(/*! ./kernels/LogicalAnd */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/LogicalAnd.js"),q=n(/*! ./kernels/Max */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Max.js"),H=n(/*! ./kernels/Maximum */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Maximum.js"),K=n(/*! ./kernels/MaxPool */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/MaxPool.js"),X=n(/*! ./kernels/Mean */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Mean.js"),Y=n(/*! ./kernels/Min */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Min.js"),Z=n(/*! ./kernels/Minimum */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Minimum.js"),Q=n(/*! ./kernels/MirrorPad */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/MirrorPad.js"),J=n(/*! ./kernels/Multiply */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Multiply.js"),ee=n(/*! ./kernels/Neg */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Neg.js"),te=n(/*! ./kernels/NonMaxSuppressionV3 */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NonMaxSuppressionV3.js"),ne=n(/*! ./kernels/NonMaxSuppressionV4 */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NonMaxSuppressionV4.js"),se=n(/*! ./kernels/NonMaxSuppressionV5 */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NonMaxSuppressionV5.js"),oe=n(/*! ./kernels/NotEqual */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NotEqual.js"),re=n(/*! ./kernels/OneHot */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/OneHot.js"),ie=n(/*! ./kernels/OnesLike */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/OnesLike.js"),ae=n(/*! ./kernels/Pack */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Pack.js"),de=n(/*! ./kernels/PadV2 */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/PadV2.js"),ue=n(/*! ./kernels/Pow */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Pow.js"),le=n(/*! ./kernels/Prelu */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Prelu.js"),ce=n(/*! ./kernels/Prod */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Prod.js"),fe=n(/*! ./kernels/Range */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Range.js"),pe=n(/*! ./kernels/RealDiv */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/RealDiv.js"),me=n(/*! ./kernels/Relu */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Relu.js"),he=n(/*! ./kernels/Relu6 */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Relu6.js"),be=n(/*! ./kernels/Reshape */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Reshape.js"),je=n(/*! ./kernels/ResizeBilinear */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ResizeBilinear.js"),ge=n(/*! ./kernels/Reverse */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Reverse.js"),we=n(/*! ./kernels/RotateWithOffset */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/RotateWithOffset.js"),_e=n(/*! ./kernels/Round */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Round.js"),ke=n(/*! ./kernels/Rsqrt */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Rsqrt.js"),ve=n(/*! ./kernels/ScatterNd */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ScatterNd.js"),xe=n(/*! ./kernels/Select */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Select.js"),ye=n(/*! ./kernels/Sigmoid */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sigmoid.js"),Oe=n(/*! ./kernels/Sin */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sin.js"),Ie=n(/*! ./kernels/Slice */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Slice.js"),Ce=n(/*! ./kernels/Softmax */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Softmax.js"),Se=n(/*! ./kernels/SpaceToBatchND */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/SpaceToBatchND.js"),Te=n(/*! ./kernels/SplitV */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/SplitV.js"),Ne=n(/*! ./kernels/Sqrt */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sqrt.js"),Ee=n(/*! ./kernels/Square */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Square.js"),Ae=n(/*! ./kernels/SquaredDifference */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/SquaredDifference.js"),Re=n(/*! ./kernels/Step */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Step.js"),Fe=n(/*! ./kernels/StridedSlice */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/StridedSlice.js"),$e=n(/*! ./kernels/Sub */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sub.js"),Me=n(/*! ./kernels/Sum */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sum.js"),De=n(/*! ./kernels/Tan */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Tan.js"),Pe=n(/*! ./kernels/Tanh */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Tanh.js"),Be=n(/*! ./kernels/Tile */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Tile.js"),Le=n(/*! ./kernels/TopK */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/TopK.js"),ze=n(/*! ./kernels/Transform */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Transform.js"),Ge=n(/*! ./kernels/Transpose */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Transpose.js"),We=n(/*! ./kernels/Unpack */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Unpack.js"),Ue=n(/*! ./kernels/ZerosLike */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ZerosLike.js"); + */function o(e,t,n,o,r){const i=s.util.sizeFromShape(o),a=s.util.makeZerosTypedArray(r,n);for(let n=0;n=r||(a[s]+=i>0?t[n]:1)}return a}function r(e,t,n,o=!1){const r=e.shape[0],i=e.shape[1],a=Object(s.buffer)([r,n],t.dtype);for(let s=0;s=n||(o?a.set(1,s,i):t.size>0?a.set(a.get(s,i)+t.get(s,r),s,i):a.set(a.get(s,i)+1,s,i))}return a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cast.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cast.js ***! + \************************************************************************/ +/*! exports provided: cast, castConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"cast",(function(){return d})),n.d(t,"castConfig",(function(){return l}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/zeros_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/zeros_impl.js"),i=n(/*! ./Complex */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Complex.js"),a=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Identity.js"),u=n(/*! ./Real */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Real.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -6187,74 +6198,56 @@ var s,o;n.r(t),n.d(t,"CppDType",(function(){return s})),n.d(t,"FusableActivation * limitations under the License. * ============================================================================= */ -const Ve=[r.absConfig,i.addConfig,a.addNConfig,d.allConfig,u.anyConfig,l.argMaxConfig,c.avgPoolConfig,f.batchMatMulConfig,p.batchToSpaceNDConfig,m.castConfig,h.ceilConfig,b.clipByValueConfig,j.concatConfig,g.conv2DConfig,w.conv2DBackpropInputConfig,_.cosConfig,k.coshConfig,v.cropAndResizeConfig,x.cumsumConfig,y.depthToSpaceConfig,O.depthwiseConv2dNativeConfig,I.equalConfig,C.expConfig,S.expandDimsConfig,T.fillConfig,N.flipLeftRightConfig,E.floorConfig,A.floorDivConfig,o.fusedMatMulConfig,R.fusedBatchNormConfig,F.fusedConv2DConfig,$.fusedDepthwiseConv2DConfig,M.gatherNdConfig,D.gatherV2Config,P.greaterConfig,B.greaterEqualConfig,L.identityConfig,z.leakyReluConfig,G.lessConfig,W.lessEqualConfig,U.logConfig,V.logicalAndConfig,q.maxConfig,H.maximumConfig,K.maxPoolConfig,X.meanConfig,Y.minConfig,Z.minimumConfig,Q.mirrorPadConfig,J.multiplyConfig,ee.negConfig,te.nonMaxSuppressionV3Config,ne.nonMaxSuppressionV4Config,se.nonMaxSuppressionV5Config,oe.notEqualConfig,re.oneHotConfig,ie.onesLikeConfig,ae.packConfig,de.padV2Config,ue.powConfig,le.preluConfig,ce.prodConfig,fe.rangeConfig,pe.realDivConfig,me.reluConfig,he.relu6Config,be.reshapeConfig,je.resizeBilinearConfig,ge.reverseConfig,we.rotateWithOffsetConfig,ke.rsqrtConfig,_e.roundConfig,ve.scatterNdConfig,xe.selectConfig,ye.sigmoidConfig,Oe.sinConfig,Ie.sliceConfig,Ce.softmaxConfig,Se.spaceToBatchNDConfig,Te.splitVConfig,Ne.sqrtConfig,Ee.squareConfig,Ae.squaredDifferenceConfig,Re.stepConfig,Fe.stridedSliceConfig,$e.subConfig,Me.sumConfig,De.tanConfig,Pe.tanhConfig,Be.tileConfig,Le.topKConfig,ze.transformConfig,Ge.transposeConfig,We.unpackConfig,Ue.zerosLikeConfig];for(const e of Ve)Object(s.registerKernel)(e)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/version.js": -/*!********************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/version.js ***! - \********************************************************************/ -/*! exports provided: version */function(e,t,n){"use strict";n.r(t),n.d(t,"version",(function(){return s})); -/** @license See the LICENSE file. */ -const s="3.8.0"},"./node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm-threaded-simd.js": -/*!************************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm-threaded-simd.js ***! - \************************************************************************************************/ -/*! no static exports found */function(e,t,n){(function(t,s,o,r){var i,a=(i=(i="undefined"!=typeof document&&document.currentScript?document.currentScript.src:void 0)||t,function(e){function t(){return F.buffer!=D&&te(F.buffer),P}function a(){return F.buffer!=D&&te(F.buffer),B}function d(){return F.buffer!=D&&te(F.buffer),L}function u(){return F.buffer!=D&&te(F.buffer),z}function l(){return F.buffer!=D&&te(F.buffer),G}var c,f,p="undefined"!=typeof(e=e||{})?e:{};p.ready=new Promise((function(e,t){c=e,f=t}));var m,h={};for(m in p)p.hasOwnProperty(m)&&(h[m]=p[m]);var b=[],j=function(e,t){throw t},g=!1,w=!1,_=!1,k=!1;g="object"==typeof window,w="function"==typeof importScripts,_="object"==typeof s&&"object"==typeof s.versions&&"string"==typeof s.versions.node,k=!g&&!_&&!w;var v=p.ENVIRONMENT_IS_PTHREAD||!1;v&&(D=p.buffer);var x,y,O,I,C,S="";function T(e){return p.locateFile?p.locateFile(e,S):S+e}if(_){var N;S=w?n(/*! path */4).dirname(S)+"/":o+"/",x=function(e,t){return I||(I=n(/*! fs */5)),C||(C=n(/*! path */4)),e=C.normalize(e),I.readFileSync(e,t?null:"utf8")},O=function(e){var t=x(e,!0);return t.buffer||(t=new Uint8Array(t)),U(t.buffer),t},s.argv.length>1&&s.argv[1].replace(/\\/g,"/"),b=s.argv.slice(2),s.on("uncaughtException",(function(e){if(!(e instanceof ln))throw e})),s.on("unhandledRejection",ke),j=function(e){s.exit(e)},p.inspect=function(){return"[Emscripten Module object]"};try{N=n(/*! worker_threads */6)}catch(e){throw console.error('The "worker_threads" module is not supported in this node.js build - perhaps a newer version is needed?'),e}r.Worker=N.Worker}else k?("undefined"!=typeof read&&(x=function(e){return read(e)}),O=function(e){var t;return"function"==typeof readbuffer?new Uint8Array(readbuffer(e)):(U("object"==typeof(t=read(e,"binary"))),t)},"undefined"!=typeof scriptArgs?b=scriptArgs:"undefined"!=typeof arguments&&(b=arguments),"function"==typeof quit&&(j=function(e){quit(e)}),"undefined"!=typeof print&&("undefined"==typeof console&&(console={}),console.log=print,console.warn=console.error="undefined"!=typeof printErr?printErr:print)):(g||w)&&(w?S=self.location.href:"undefined"!=typeof document&&document.currentScript&&(S=document.currentScript.src),"undefined"!=typeof i&&i&&(S=i),S=0!==S.indexOf("blob:")?S.substr(0,S.lastIndexOf("/")+1):"",_?(x=function(e,t){return I||(I=n(/*! fs */5)),C||(C=n(/*! path */4)),e=C.normalize(e),I.readFileSync(e,t?null:"utf8")},O=function(e){var t=x(e,!0);return t.buffer||(t=new Uint8Array(t)),U(t.buffer),t}):(x=function(e){var t=new XMLHttpRequest;return t.open("GET",e,!1),t.send(null),t.responseText},w&&(O=function(e){var t=new XMLHttpRequest;return t.open("GET",e,!1),t.responseType="arraybuffer",t.send(null),new Uint8Array(t.response)}),y=function(e,t,n){var s=new XMLHttpRequest;s.open("GET",e,!0),s.responseType="arraybuffer",s.onload=function(){200==s.status||0==s.status&&s.response?t(s.response):n()},s.onerror=n,s.send(null)}));_&&"undefined"==typeof performance&&(r.performance=n(/*! perf_hooks */7).performance);var E,A=p.print||console.log.bind(console),R=p.printErr||console.warn.bind(console);for(m in h)h.hasOwnProperty(m)&&(p[m]=h[m]);h=null,p.arguments&&(b=p.arguments),p.thisProgram&&p.thisProgram,p.quit&&(j=p.quit),Atomics.load,Atomics.store,Atomics.compareExchange,p.wasmBinary&&(E=p.wasmBinary);var F,$,M=p.noExitRuntime||!0;"object"!=typeof WebAssembly&&ke("no native wasm support detected");var D,P,B,L,z,G,W=!1;function U(e,t){e||ke("Assertion failed: "+t)}function V(e){var t=p["_"+e];return U(t,"Cannot call unknown function "+e+", make sure it is exported"),t}function q(e,t,n,s,o){var r={string:function(e){var t=0;if(null!=e&&0!==e){var n=1+(e.length<<2);Z(e,t=on(n),n)}return t},array:function(e){var t=on(e.length);return J(e,t),t}},i=V(e),a=[],d=0;if(s)for(var u=0;u=s);){var r=e[t++];if(!r)return o;if(128&r){var i=63&e[t++];if(192!=(224&r)){var a=63&e[t++];if((r=224==(240&r)?(15&r)<<12|i<<6|a:(7&r)<<18|i<<12|a<<6|63&e[t++])<65536)o+=String.fromCharCode(r);else{var d=r-65536;o+=String.fromCharCode(55296|d>>10,56320|1023&d)}}else o+=String.fromCharCode((31&r)<<6|i)}else o+=String.fromCharCode(r)}return o}function X(e,t){return e?K(a(),e,t):""}function Y(e,t,n,s){if(!(s>0))return 0;for(var o=n,r=n+s-1,i=0;i=55296&&a<=57343&&(a=65536+((1023&a)<<10)|1023&e.charCodeAt(++i)),a<=127){if(n>=r)break;t[n++]=a}else if(a<=2047){if(n+1>=r)break;t[n++]=192|a>>6,t[n++]=128|63&a}else if(a<=65535){if(n+2>=r)break;t[n++]=224|a>>12,t[n++]=128|a>>6&63,t[n++]=128|63&a}else{if(n+3>=r)break;t[n++]=240|a>>18,t[n++]=128|a>>12&63,t[n++]=128|a>>6&63,t[n++]=128|63&a}}return t[n]=0,n-o}function Z(e,t,n){return Y(e,a(),t,n)}function Q(e){for(var t=0,n=0;n=55296&&s<=57343&&(s=65536+((1023&s)<<10)|1023&e.charCodeAt(++n)),s<=127?++t:t+=s<=2047?2:s<=65535?3:4}return t}function J(e,n){t().set(e,n)}function ee(e,t){return e%t>0&&(e+=t-e%t),e}function te(e){D=e,p.HEAP8=P=new Int8Array(e),p.HEAP16=new Int16Array(e),p.HEAP32=L=new Int32Array(e),p.HEAPU8=B=new Uint8Array(e),p.HEAPU16=new Uint16Array(e),p.HEAPU32=z=new Uint32Array(e),p.HEAPF32=new Float32Array(e),p.HEAPF64=G=new Float64Array(e)}var ne,se=p.INITIAL_MEMORY||16777216;if(v)F=p.wasmMemory,D=p.buffer;else if(p.wasmMemory)F=p.wasmMemory;else if(!((F=new WebAssembly.Memory({initial:se/65536,maximum:32768,shared:!0})).buffer instanceof SharedArrayBuffer))throw R("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag"),_&&console.log("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and also use a recent version)"),Error("bad memory");F&&(D=F.buffer),se=D.byteLength,te(D);var oe=[],re=[],ie=[],ae=[],de=[];function ue(){if(!v){if(p.preRun)for("function"==typeof p.preRun&&(p.preRun=[p.preRun]);p.preRun.length;)me(p.preRun.shift());Re(oe)}}function le(){v||Re(re)}function ce(){v||Re(ie)}function fe(){}function pe(){if(!v){if(p.postRun)for("function"==typeof p.postRun&&(p.postRun=[p.postRun]);p.postRun.length;)he(p.postRun.shift());Re(de)}}function me(e){oe.unshift(e)}function he(e){de.unshift(e)}v||re.push({func:function(){Gt()}});var be=0,je=null,ge=null;function we(e){U(!v,"addRunDependency cannot be used in a pthread worker"),be++,p.monitorRunDependencies&&p.monitorRunDependencies(be)}function _e(e){if(be--,p.monitorRunDependencies&&p.monitorRunDependencies(be),0==be&&(null!==je&&(clearInterval(je),je=null),ge)){var t=ge;ge=null,t()}}function ke(e){p.onAbort&&p.onAbort(e),v&&console.error("Pthread aborting at "+(new Error).stack),R(e+=""),W=!0,e="abort("+e+"). Build with -s ASSERTIONS=1 for more info.";var t=new WebAssembly.RuntimeError(e);throw f(t),t}function ve(e,t){return String.prototype.startsWith?e.startsWith(t):0===e.indexOf(t)}p.preloadedImages={},p.preloadedAudios={};var xe="data:application/octet-stream;base64,";function ye(e){return ve(e,xe)}var Oe="file://";function Ie(e){return ve(e,Oe)}var Ce="tfjs-backend-wasm-threaded-simd.wasm";function Se(e){try{if(e==Ce&&E)return new Uint8Array(E);if(O)return O(e);throw"both async and sync fetching of the wasm failed"}catch(e){ke(e)}}function Te(){if(!E&&(g||w)){if("function"==typeof fetch&&!Ie(Ce))return fetch(Ce,{credentials:"same-origin"}).then((function(e){if(!e.ok)throw"failed to load wasm binary file at '"+Ce+"'";return e.arrayBuffer()})).catch((function(){return Se(Ce)}));if(y)return new Promise((function(e,t){y(Ce,(function(t){e(new Uint8Array(t))}),t)}))}return Promise.resolve().then((function(){return Se(Ce)}))}function Ne(){var e={a:zt};function t(e,t){var n=e.exports;if(p.asm=n,ne=p.asm.F,$=t,!v){var s=Be.unusedWorkers.length;Be.unusedWorkers.forEach((function(e){Be.loadWasmModuleToWorker(e,(function(){--s||_e()}))}))}}function n(e){t(e.instance,e.module)}function s(t){return Te().then((function(t){return WebAssembly.instantiate(t,e)})).then(t,(function(e){R("failed to asynchronously prepare wasm: "+e),ke(e)}))}if(v||we(),p.instantiateWasm)try{return p.instantiateWasm(e,t)}catch(e){return R("Module.instantiateWasm callback failed with error: "+e),!1}return(E||"function"!=typeof WebAssembly.instantiateStreaming||ye(Ce)||Ie(Ce)||"function"!=typeof fetch?s(n):fetch(Ce,{credentials:"same-origin"}).then((function(t){return WebAssembly.instantiateStreaming(t,e).then(n,(function(e){return R("wasm streaming compile failed: "+e),R("falling back to ArrayBuffer instantiation"),s(n)}))}))).catch(f),{}}ye(Ce)||(Ce=T(Ce));var Ee={9832:function(){throw"Canceled!"},9850:function(e,t){setTimeout((function(){Zt(e,t)}),0)}};function Ae(){Be.initRuntime()}function Re(e){for(;e.length>0;){var t=e.shift();if("function"!=typeof t){var n=t.func;"number"==typeof n?void 0===t.arg?ne.get(n)():ne.get(n)(t.arg):n(void 0===t.arg?null:t.arg)}else t(p)}}function Fe(e,n){if(e<=0||e>t().length||!0&e||n<0)return-28;if(0==n)return 0;n>=2147483647&&(n=1/0);var s=Atomics.load(d(),un>>2),o=0;if(s==e&&Atomics.compareExchange(d(),un>>2,s,0)==s&&(o=1,--n<=0))return 1;var r=Atomics.notify(d(),e>>2,n);if(r>=0)return r+o;throw"Atomics.notify returned an unexpected value "+r}function $e(e){if(v)throw"Internal Error! killThread() can only ever be called from main application thread!";if(!e)throw"Internal Error! Null pthread_ptr in killThread!";d()[e+12>>2]=0;var t=Be.pthreads[e];t.worker.terminate(),Be.freeThreadData(t),Be.runningWorkers.splice(Be.runningWorkers.indexOf(t.worker),1),t.worker.pthread=void 0}function Me(e){if(v)throw"Internal Error! cancelThread() can only ever be called from main application thread!";if(!e)throw"Internal Error! Null pthread_ptr in cancelThread!";Be.pthreads[e].worker.postMessage({cmd:"cancel"})}function De(e){if(v)throw"Internal Error! cleanupThread() can only ever be called from main application thread!";if(!e)throw"Internal Error! Null pthread_ptr in cleanupThread!";var t=Be.pthreads[e];if(t){d()[e+12>>2]=0;var n=t.worker;Be.returnWorkerToPool(n)}}p._emscripten_futex_wake=Fe;var Pe,Be={unusedWorkers:[],runningWorkers:[],initMainThreadBlock:function(){for(var e=Math.min(4,Math.max(1,(navigator.hardwareConcurrency||1)/2)),t=0;t>2]=e;var n=e+152;d()[n>>2]=n;var s=Wt(512);for(t=0;t<128;++t)u()[s/4+t]=0;Atomics.store(u(),e+100>>2,s),Atomics.store(u(),e+40>>2,e),tn(e,!w,1),Yt(e)},initWorker:function(){},pthreads:{},threadExitHandlers:[],setThreadStatus:function(){},runExitHandlers:function(){for(;Be.threadExitHandlers.length>0;)Be.threadExitHandlers.pop()();v&&Ht()&&Kt()},runExitHandlersAndDeinitThread:function(e,t){Atomics.store(u(),e+56>>2,1),Atomics.store(u(),e+60>>2,0),Be.runExitHandlers(),Atomics.store(u(),e+4>>2,t),Atomics.store(u(),e+0>>2,1),Fe(e+0,2147483647),tn(0,0,0)},threadExit:function(e){var t=Ht();t&&(Be.runExitHandlersAndDeinitThread(t,e),v&&postMessage({cmd:"exit"}))},threadCancel:function(){Be.runExitHandlersAndDeinitThread(Ht(),-1),postMessage({cmd:"cancelDone"})},terminateAllThreads:function(){for(var e in Be.pthreads)(s=Be.pthreads[e])&&s.worker&&Be.returnWorkerToPool(s.worker);Be.pthreads={};for(var t=0;t>2];d()[e.threadInfoStruct+100>>2]=0,Ut(t),Ut(e.threadInfoStruct)}e.threadInfoStruct=0,e.allocatedOwnStack&&e.stackBase&&Ut(e.stackBase),e.stackBase=0,e.worker&&(e.worker.pthread=null)}},returnWorkerToPool:function(e){Be.runWithoutMainThreadQueuedCalls((function(){delete Be.pthreads[e.pthread.threadInfoStruct],Be.unusedWorkers.push(e),Be.runningWorkers.splice(Be.runningWorkers.indexOf(e),1),Be.freeThreadData(e.pthread),e.pthread=void 0}))},runWithoutMainThreadQueuedCalls:function(e){d()[dn>>2]=0;try{e()}finally{d()[dn>>2]=1}},receiveObjectTransfer:function(e){},loadWasmModuleToWorker:function(e,t){e.onmessage=function(n){var s=n.data,o=s.cmd;if(e.pthread&&(Be.currentProxiedOperationCallerThread=e.pthread.threadInfoStruct),s.targetThread&&s.targetThread!=Ht()){var r=Be.pthreads[s.targetThread];return r?r.worker.postMessage(n.data,s.transferList):console.error('Internal error! Worker sent a message "'+o+'" to target pthread '+s.targetThread+", but that thread no longer exists!"),void(Be.currentProxiedOperationCallerThread=void 0)}if("processQueuedMainThreadWork"===o)Xt();else if("spawnThread"===o)Mt(n.data);else if("cleanupThread"===o)De(s.thread);else if("killThread"===o)$e(s.thread);else if("cancelThread"===o)Me(s.thread);else if("loaded"===o)e.loaded=!0,t&&t(e),e.runPthread&&(e.runPthread(),delete e.runPthread);else if("print"===o)A("Thread "+s.threadId+": "+s.text);else if("printErr"===o)R("Thread "+s.threadId+": "+s.text);else if("alert"===o)alert("Thread "+s.threadId+": "+s.text);else if("exit"===o)e.pthread&&Atomics.load(u(),e.pthread.threadInfoStruct+64>>2)&&Be.returnWorkerToPool(e);else if("exitProcess"===o)try{fn(s.returnCode)}catch(n){if(n instanceof ln)return;throw n}else"cancelDone"===o?Be.returnWorkerToPool(e):"objectTransfer"===o?Be.receiveObjectTransfer(n.data):"setimmediate"===n.data.target?e.postMessage(n.data):R("worker sent an unknown command "+o);Be.currentProxiedOperationCallerThread=void 0},e.onerror=function(e){R("pthread sent an error! "+e.filename+":"+e.lineno+": "+e.message)},_&&(e.on("message",(function(t){e.onmessage({data:t})})),e.on("error",(function(t){e.onerror(t)})),e.on("exit",(function(e){}))),e.postMessage({cmd:"load",urlOrBlob:p.mainScriptUrlOrBlob||i,wasmMemory:F,wasmModule:$})},allocateUnusedWorker:function(){var e=T("tfjs-backend-wasm-threaded-simd.worker.js");Be.unusedWorkers.push(new Worker(e))},getNewWorker:function(){return 0==Be.unusedWorkers.length&&(Be.allocateUnusedWorker(),Be.loadWasmModuleToWorker(Be.unusedWorkers[0])),Be.unusedWorkers.length>0?Be.unusedWorkers.pop():null},busySpinWait:function(e){for(var t=performance.now()+e;performance.now()>2]=e,e}function qe(e,t){if(v)return et(1,1,e,t)}function He(e,t){if(e==t)postMessage({cmd:"processQueuedMainThreadWork"});else if(v)postMessage({targetThread:e,cmd:"processThreadQueue"});else{var n=Be.pthreads[e],s=n&&n.worker;if(!s)return;s.postMessage({cmd:"processThreadQueue"})}return 1}function Ke(){ke()}function Xe(e,t,n){var s=st(t,n);return Ee[e].apply(null,s)}function Ye(e,t){}function Ze(e,n,s){if(e<=0||e>t().length||!0&e)return-28;if(g){if(Atomics.load(d(),e>>2)!=n)return-6;var o=performance.now(),r=o+s;for(Atomics.exchange(d(),un>>2,e);;){if((o=performance.now())>r)return Atomics.exchange(d(),un>>2,0),-73;if(0==Atomics.exchange(d(),un>>2,0))break;if(Xt(),Atomics.load(d(),e>>2)!=n)return-6;Atomics.exchange(d(),un>>2,e)}return 0}var i=Atomics.wait(d(),e>>2,n,s);if("timed-out"===i)return-73;if("not-equal"===i)return-6;if("ok"===i)return 0;throw"Atomics.wait returned an unexpected value "+i}function Qe(e,t,n){a().copyWithin(e,t,t+n)}function Je(){return _?n(/*! os */8).cpus().length:navigator.hardwareConcurrency}function et(e,t){for(var n=arguments.length-2,s=nn(),o=n,r=on(8*o),i=r>>3,a=0;a>=2;n=a()[e++];){var s=n<105;s&&1&t&&t++,nt.push(s?l()[t++>>1]:d()[t]),++t}return nt}function ot(e,t,n){tt.length=t;for(var s=n>>3,o=0;o>>16),te(F.buffer),1}catch(e){}}function at(e){var t=rt();if(e<=t)return!1;var n=2147483648;if(e>n)return!1;for(var s=1;s<=4;s*=2){var o=t*(1+.2/s);if(o=Math.min(o,e+100663296),it(Math.min(n,ee(Math.max(e,o),65536))))return!0}return!1}var dt={inEventHandler:0,removeAllEventListeners:function(){for(var e=dt.eventHandlers.length-1;e>=0;--e)dt._removeHandler(e);dt.eventHandlers=[],dt.deferredCalls=[]},registerRemoveEventListeners:function(){dt.removeEventListenersRegistered||(ae.push(dt.removeAllEventListeners),dt.removeEventListenersRegistered=!0)},deferredCalls:[],deferCall:function(e,t,n){function s(e,t){if(e.length!=t.length)return!1;for(var n in e)if(e[n]!=t[n])return!1;return!0}for(var o in dt.deferredCalls){var r=dt.deferredCalls[o];if(r.targetFunction==e&&s(r.argsList,n))return}dt.deferredCalls.push({targetFunction:e,precedence:t,argsList:n}),dt.deferredCalls.sort((function(e,t){return e.precedence>2]=n,d()[i+4>>2]=s,d()[i+8>>2]=o,en(0,e,637534208,t,s,i),sn(r)},getTargetThreadForEventCallback:function(e){switch(e){case 1:return 0;case 2:return Be.currentProxiedOperationCallerThread;default:return e}},getNodeNameForTarget:function(e){return e?e==window?"#window":e==screen?"#screen":e&&e.nodeName?e.nodeName:"":""},fullscreenEnabled:function(){return document.fullscreenEnabled||document.webkitFullscreenEnabled}};function ut(e){var t=Q(e)+1,n=Wt(t);return Z(e,n,t),n}function lt(e,t,n,s){var o=nn(),r=on(12),i=0;t&&(i=ut(t)),d()[r>>2]=i,d()[r+4>>2]=n,d()[r+8>>2]=s,en(0,e,657457152,0,i,r),sn(o)}function ct(e,t,n,s){lt(e,t=t?X(t):"",n,s)}function ft(e){return e>2?X(e):e}var pt=[0,"undefined"!=typeof document?document:0,"undefined"!=typeof window?window:0];function mt(e){return e=ft(e),pt[e]||("undefined"!=typeof document?document.querySelector(e):void 0)}function ht(e){return mt(e)}function bt(e,t,n){var s=ht(e);if(!s)return-4;if(s.canvasSharedPtr&&(d()[s.canvasSharedPtr>>2]=t,d()[s.canvasSharedPtr+4>>2]=n),!s.offscreenCanvas&&s.controlTransferredOffscreen)return s.canvasSharedPtr?(ct(d()[s.canvasSharedPtr+8>>2],e,t,n),1):-4;s.offscreenCanvas&&(s=s.offscreenCanvas);var o=!1;if(s.GLctxObject&&s.GLctxObject.GLctx){var r=s.GLctxObject.GLctx.getParameter(2978);o=0===r[0]&&0===r[1]&&r[2]===s.width&&r[3]===s.height}return s.width=t,s.height=n,o&&s.GLctxObject.GLctx.viewport(0,0,t,n),0}function jt(e,t,n){return v?et(2,1,e,t,n):bt(e,t,n)}function gt(e,t,n){return ht(e)?bt(e,t,n):jt(e,t,n)}function wt(e){}function _t(e,t){}function kt(e){var t=e.getExtension("ANGLE_instanced_arrays");if(t)return e.vertexAttribDivisor=function(e,n){t.vertexAttribDivisorANGLE(e,n)},e.drawArraysInstanced=function(e,n,s,o){t.drawArraysInstancedANGLE(e,n,s,o)},e.drawElementsInstanced=function(e,n,s,o,r){t.drawElementsInstancedANGLE(e,n,s,o,r)},1}function vt(e){var t=e.getExtension("OES_vertex_array_object");if(t)return e.createVertexArray=function(){return t.createVertexArrayOES()},e.deleteVertexArray=function(e){t.deleteVertexArrayOES(e)},e.bindVertexArray=function(e){t.bindVertexArrayOES(e)},e.isVertexArray=function(e){return t.isVertexArrayOES(e)},1}function xt(e){var t=e.getExtension("WEBGL_draw_buffers");if(t)return e.drawBuffers=function(e,n){t.drawBuffersWEBGL(e,n)},1}function yt(e){return!!(e.multiDrawWebgl=e.getExtension("WEBGL_multi_draw"))}var Ot={counter:1,buffers:[],programs:[],framebuffers:[],renderbuffers:[],textures:[],uniforms:[],shaders:[],vaos:[],contexts:{},offscreenCanvases:{},timerQueriesEXT:[],programInfos:{},stringCache:{},unpackAlignment:4,recordError:function(e){Ot.lastError||(Ot.lastError=e)},getNewId:function(e){for(var t=Ot.counter++,n=e.length;n>2]:-1;o+=X(d()[n+4*r>>2],i<0?void 0:i)}return o},createContext:function(e,t){var n=e.getContext("webgl",t);return n?Ot.registerContext(n,t):0},registerContext:function(e,t){var n=Wt(8);d()[n+4>>2]=Ht();var s={handle:n,attributes:t,version:t.majorVersion,GLctx:e};return e.canvas&&(e.canvas.GLctxObject=s),Ot.contexts[n]=s,("undefined"==typeof t.enableExtensionsByDefault||t.enableExtensionsByDefault)&&Ot.initExtensions(s),n},makeContextCurrent:function(e){return Ot.currentContext=Ot.contexts[e],p.ctx=Tt=Ot.currentContext&&Ot.currentContext.GLctx,!(e&&!Tt)},getContext:function(e){return Ot.contexts[e]},deleteContext:function(e){Ot.currentContext===Ot.contexts[e]&&(Ot.currentContext=null),"object"==typeof dt&&dt.removeAllHandlersOnTarget(Ot.contexts[e].GLctx.canvas),Ot.contexts[e]&&Ot.contexts[e].GLctx.canvas&&(Ot.contexts[e].GLctx.canvas.GLctxObject=void 0),Ut(Ot.contexts[e].handle),Ot.contexts[e]=null},initExtensions:function(e){if(e||(e=Ot.currentContext),!e.initExtensionsDone){e.initExtensionsDone=!0;var t=e.GLctx;kt(t),vt(t),xt(t),t.disjointTimerQueryExt=t.getExtension("EXT_disjoint_timer_query"),yt(t),(t.getSupportedExtensions()||[]).forEach((function(e){e.indexOf("lose_context")<0&&e.indexOf("debug")<0&&t.getExtension(e)}))}},populateUniformTable:function(e){for(var t=Ot.programs[e],n=Ot.programInfos[e]={uniforms:{},maxUniformLength:0,maxAttributeLength:-1,maxUniformBlockNameLength:-1},s=n.uniforms,o=Tt.getProgramParameter(t,35718),r=0;r>2,s=d()[n+6],o={alpha:!!d()[n+0],depth:!!d()[n+1],stencil:!!d()[n+2],antialias:!!d()[n+3],premultipliedAlpha:!!d()[n+4],preserveDrawingBuffer:!!d()[n+5],powerPreference:It[s],failIfMajorPerformanceCaveat:!!d()[n+7],majorVersion:d()[n+8],minorVersion:d()[n+9],enableExtensionsByDefault:d()[n+10],explicitSwapControl:d()[n+11],proxyContextToMainThread:d()[n+12],renderViaOffscreenBackBuffer:d()[n+13]},r=ht(e);return r?o.explicitSwapControl?0:Ot.createContext(r,o):0}function St(e,t){return Ct(e,t)}var Tt,Nt={mappings:{},buffers:[null,[],[]],printChar:function(e,t){var n=Nt.buffers[e];0===t||10===t?((1===e?A:R)(K(n,0)),n.length=0):n.push(t)},varargs:void 0,get:function(){return Nt.varargs+=4,d()[Nt.varargs-4>>2]},getStr:function(e){return X(e)},get64:function(e,t){return e}};function Et(e){return v?et(3,1,e):0}function At(e,t,n,s,o){if(v)return et(4,1,e,t,n,s,o)}function Rt(e,t,n,s){if(v)return et(5,1,e,t,n,s);for(var o=0,r=0;r>2],u=d()[t+(8*r+4)>>2],l=0;l>2]=o,0}function Ft(e){var t=Be.threadExitHandlers.pop();e&&t()}function $t(e,t){Be.threadExitHandlers.push((function(){ne.get(e)(t)}))}function Mt(e){if(v)throw"Internal Error! spawnThread() can only ever be called from main application thread!";var t=Be.getNewWorker();if(void 0!==t.pthread)throw"Internal error!";if(!e.pthread_ptr)throw"Internal error, no pthread ptr!";Be.runningWorkers.push(t);for(var n=Wt(512),s=0;s<128;++s)d()[n+4*s>>2]=0;var o=e.stackBase+e.stackSize,r=Be.pthreads[e.pthread_ptr]={worker:t,stackBase:e.stackBase,stackSize:e.stackSize,allocatedOwnStack:e.allocatedOwnStack,threadInfoStruct:e.pthread_ptr},i=r.threadInfoStruct>>2;Atomics.store(u(),i+16,e.detached),Atomics.store(u(),i+25,n),Atomics.store(u(),i+10,r.threadInfoStruct),Atomics.store(u(),i+20,e.stackSize),Atomics.store(u(),i+19,o),Atomics.store(u(),i+26,e.stackSize),Atomics.store(u(),i+28,o),Atomics.store(u(),i+29,e.detached);var a=qt()+40;Atomics.store(u(),i+43,a),t.pthread=r;var l={cmd:"run",start_routine:e.startRoutine,arg:e.arg,threadInfoStruct:e.pthread_ptr,stackBase:e.stackBase,stackSize:e.stackSize};t.runPthread=function(){l.time=performance.now(),t.postMessage(l,e.transferList)},t.loaded&&(t.runPthread(),delete t.runPthread)}function Dt(e,t,n,s){if("undefined"==typeof SharedArrayBuffer)return R("Current environment does not support SharedArrayBuffer, pthreads are not available!"),6;if(!e)return R("pthread_create called with a null thread pointer!"),28;var o=[];if(v&&0===o.length)return Qt(687865856,e,t,n,s);var r=0,i=0,a=0;t&&-1!=t?(r=d()[t>>2],r+=81920,i=d()[t+8>>2],a=0!==d()[t+12>>2]):r=2097152;var l=0==i;l?i=an(16,r):U((i-=r)>0);for(var c=Wt(228),f=0;f<57;++f)u()[(c>>2)+f]=0;d()[e>>2]=c,d()[c+12>>2]=c;var p=c+152;d()[p>>2]=p;var m={stackBase:i,stackSize:r,allocatedOwnStack:l,detached:a,startRoutine:n,pthread_ptr:c,arg:s,transferList:o};return v?(m.cmd="spawnThread",postMessage(m,o)):Mt(m),0}function Pt(e){if(v)return et(6,1,e);switch(e){case 30:return 16384;case 85:return 131072;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:case 80:case 81:case 79:return-1;case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 75:return 16384;case 39:return 1e3;case 89:return 700;case 71:return 256;case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:return"object"==typeof navigator&&navigator.hardwareConcurrency||1}return Ve(28),-1}v||Be.initMainThreadBlock();var Bt,Lt=[null,qe,jt,Et,At,Rt,Pt],zt={e:We,r:Ue,x:He,b:Ke,y:Xe,j:Ye,c:Ze,d:Fe,f:Pe,p:Qe,z:Je,u:ot,q:at,v:gt,i:wt,t:_t,w:St,m:Et,n:At,g:Rt,o:Ae,a:F||p.wasmMemory,k:Ft,l:$t,h:Dt,s:Pt},Gt=(Ne(),p.___wasm_call_ctors=function(){return(Gt=p.___wasm_call_ctors=p.asm.A).apply(null,arguments)}),Wt=(p._init=function(){return(p._init=p.asm.B).apply(null,arguments)},p._register_tensor=function(){return(p._register_tensor=p.asm.C).apply(null,arguments)},p._dispose_data=function(){return(p._dispose_data=p.asm.D).apply(null,arguments)},p._dispose=function(){return(p._dispose=p.asm.E).apply(null,arguments)},p._Abs=function(){return(p._Abs=p.asm.G).apply(null,arguments)},p._Add=function(){return(p._Add=p.asm.H).apply(null,arguments)},p._AddN=function(){return(p._AddN=p.asm.I).apply(null,arguments)},p._All=function(){return(p._All=p.asm.J).apply(null,arguments)},p._Any=function(){return(p._Any=p.asm.K).apply(null,arguments)},p._ArgMax=function(){return(p._ArgMax=p.asm.L).apply(null,arguments)},p._AvgPool=function(){return(p._AvgPool=p.asm.M).apply(null,arguments)},p._BatchMatMul=function(){return(p._BatchMatMul=p.asm.N).apply(null,arguments)},p._Ceil=function(){return(p._Ceil=p.asm.O).apply(null,arguments)},p._ClipByValue=function(){return(p._ClipByValue=p.asm.P).apply(null,arguments)},p._Conv2D=function(){return(p._Conv2D=p.asm.Q).apply(null,arguments)},p._Conv2DBackpropInput=function(){return(p._Conv2DBackpropInput=p.asm.R).apply(null,arguments)},p._Cos=function(){return(p._Cos=p.asm.S).apply(null,arguments)},p._Cosh=function(){return(p._Cosh=p.asm.T).apply(null,arguments)},p._CropAndResize=function(){return(p._CropAndResize=p.asm.U).apply(null,arguments)},p._Cumsum=function(){return(p._Cumsum=p.asm.V).apply(null,arguments)},p._DepthToSpace=function(){return(p._DepthToSpace=p.asm.W).apply(null,arguments)},p._DepthwiseConv2dNative=function(){return(p._DepthwiseConv2dNative=p.asm.X).apply(null,arguments)},p._Equal=function(){return(p._Equal=p.asm.Y).apply(null,arguments)},p._Exp=function(){return(p._Exp=p.asm.Z).apply(null,arguments)},p._FlipLeftRight=function(){return(p._FlipLeftRight=p.asm._).apply(null,arguments)},p._Floor=function(){return(p._Floor=p.asm.$).apply(null,arguments)},p._FloorDiv=function(){return(p._FloorDiv=p.asm.aa).apply(null,arguments)},p._FusedBatchNorm=function(){return(p._FusedBatchNorm=p.asm.ba).apply(null,arguments)},p._FusedConv2D=function(){return(p._FusedConv2D=p.asm.ca).apply(null,arguments)},p._FusedDepthwiseConv2D=function(){return(p._FusedDepthwiseConv2D=p.asm.da).apply(null,arguments)},p._Gather=function(){return(p._Gather=p.asm.ea).apply(null,arguments)},p._GatherNd=function(){return(p._GatherNd=p.asm.fa).apply(null,arguments)},p._Greater=function(){return(p._Greater=p.asm.ga).apply(null,arguments)},p._GreaterEqual=function(){return(p._GreaterEqual=p.asm.ha).apply(null,arguments)},p._LeakyRelu=function(){return(p._LeakyRelu=p.asm.ia).apply(null,arguments)},p._Less=function(){return(p._Less=p.asm.ja).apply(null,arguments)},p._LessEqual=function(){return(p._LessEqual=p.asm.ka).apply(null,arguments)},p._Log=function(){return(p._Log=p.asm.la).apply(null,arguments)},p._LogicalAnd=function(){return(p._LogicalAnd=p.asm.ma).apply(null,arguments)},p._Max=function(){return(p._Max=p.asm.na).apply(null,arguments)},p._MaxPool=function(){return(p._MaxPool=p.asm.oa).apply(null,arguments)},p._Maximum=function(){return(p._Maximum=p.asm.pa).apply(null,arguments)},p._Mean=function(){return(p._Mean=p.asm.qa).apply(null,arguments)},p._Min=function(){return(p._Min=p.asm.ra).apply(null,arguments)},p._Minimum=function(){return(p._Minimum=p.asm.sa).apply(null,arguments)},p._MirrorPad=function(){return(p._MirrorPad=p.asm.ta).apply(null,arguments)},p._Multiply=function(){return(p._Multiply=p.asm.ua).apply(null,arguments)},p._Neg=function(){return(p._Neg=p.asm.va).apply(null,arguments)},p._NonMaxSuppressionV3=function(){return(p._NonMaxSuppressionV3=p.asm.wa).apply(null,arguments)},p._NonMaxSuppressionV4=function(){return(p._NonMaxSuppressionV4=p.asm.xa).apply(null,arguments)},p._NonMaxSuppressionV5=function(){return(p._NonMaxSuppressionV5=p.asm.ya).apply(null,arguments)},p._NotEqual=function(){return(p._NotEqual=p.asm.za).apply(null,arguments)},p._OneHot=function(){return(p._OneHot=p.asm.Aa).apply(null,arguments)},p._PadV2=function(){return(p._PadV2=p.asm.Ba).apply(null,arguments)},p._Pow=function(){return(p._Pow=p.asm.Ca).apply(null,arguments)},p._Prelu=function(){return(p._Prelu=p.asm.Da).apply(null,arguments)},p._Prod=function(){return(p._Prod=p.asm.Ea).apply(null,arguments)},p._RealDiv=function(){return(p._RealDiv=p.asm.Fa).apply(null,arguments)},p._Relu=function(){return(p._Relu=p.asm.Ga).apply(null,arguments)},p._Relu6=function(){return(p._Relu6=p.asm.Ha).apply(null,arguments)},p._ResizeBilinear=function(){return(p._ResizeBilinear=p.asm.Ia).apply(null,arguments)},p._Reverse=function(){return(p._Reverse=p.asm.Ja).apply(null,arguments)},p._RotateWithOffset=function(){return(p._RotateWithOffset=p.asm.Ka).apply(null,arguments)},p._Round=function(){return(p._Round=p.asm.La).apply(null,arguments)},p._Rsqrt=function(){return(p._Rsqrt=p.asm.Ma).apply(null,arguments)},p._ScatterNd=function(){return(p._ScatterNd=p.asm.Na).apply(null,arguments)},p._SelectV2=function(){return(p._SelectV2=p.asm.Oa).apply(null,arguments)},p._Sigmoid=function(){return(p._Sigmoid=p.asm.Pa).apply(null,arguments)},p._Sin=function(){return(p._Sin=p.asm.Qa).apply(null,arguments)},p._Softmax=function(){return(p._Softmax=p.asm.Ra).apply(null,arguments)},p._Sqrt=function(){return(p._Sqrt=p.asm.Sa).apply(null,arguments)},p._Square=function(){return(p._Square=p.asm.Ta).apply(null,arguments)},p._SquaredDifference=function(){return(p._SquaredDifference=p.asm.Ua).apply(null,arguments)},p._Step=function(){return(p._Step=p.asm.Va).apply(null,arguments)},p._StridedSlice=function(){return(p._StridedSlice=p.asm.Wa).apply(null,arguments)},p._Sub=function(){return(p._Sub=p.asm.Xa).apply(null,arguments)},p._Sum=function(){return(p._Sum=p.asm.Ya).apply(null,arguments)},p._Tan=function(){return(p._Tan=p.asm.Za).apply(null,arguments)},p._Tanh=function(){return(p._Tanh=p.asm._a).apply(null,arguments)},p._Tile=function(){return(p._Tile=p.asm.$a).apply(null,arguments)},p._TopK=function(){return(p._TopK=p.asm.ab).apply(null,arguments)},p._Transform=function(){return(p._Transform=p.asm.bb).apply(null,arguments)},p._Transpose=function(){return(p._Transpose=p.asm.cb).apply(null,arguments)},p.__FusedMatMul=function(){return(p.__FusedMatMul=p.asm.db).apply(null,arguments)},p._malloc=function(){return(Wt=p._malloc=p.asm.eb).apply(null,arguments)}),Ut=p._free=function(){return(Ut=p._free=p.asm.fb).apply(null,arguments)},Vt=p.___errno_location=function(){return(Vt=p.___errno_location=p.asm.gb).apply(null,arguments)},qt=p._emscripten_get_global_libc=function(){return(qt=p._emscripten_get_global_libc=p.asm.hb).apply(null,arguments)},Ht=p._pthread_self=function(){return(Ht=p._pthread_self=p.asm.ib).apply(null,arguments)},Kt=p.___pthread_tsd_run_dtors=function(){return(Kt=p.___pthread_tsd_run_dtors=p.asm.jb).apply(null,arguments)},Xt=p._emscripten_main_thread_process_queued_calls=function(){return(Xt=p._emscripten_main_thread_process_queued_calls=p.asm.kb).apply(null,arguments)},Yt=(p._emscripten_current_thread_process_queued_calls=function(){return(p._emscripten_current_thread_process_queued_calls=p.asm.lb).apply(null,arguments)},p._emscripten_register_main_browser_thread_id=function(){return(Yt=p._emscripten_register_main_browser_thread_id=p.asm.mb).apply(null,arguments)}),Zt=p.__emscripten_do_dispatch_to_thread=function(){return(Zt=p.__emscripten_do_dispatch_to_thread=p.asm.nb).apply(null,arguments)},Qt=p._emscripten_sync_run_in_main_thread_4=function(){return(Qt=p._emscripten_sync_run_in_main_thread_4=p.asm.ob).apply(null,arguments)},Jt=p._emscripten_run_in_main_runtime_thread_js=function(){return(Jt=p._emscripten_run_in_main_runtime_thread_js=p.asm.pb).apply(null,arguments)},en=p.__emscripten_call_on_thread=function(){return(en=p.__emscripten_call_on_thread=p.asm.qb).apply(null,arguments)},tn=(p._emscripten_tls_init=function(){return(p._emscripten_tls_init=p.asm.rb).apply(null,arguments)},p.__emscripten_thread_init=function(){return(tn=p.__emscripten_thread_init=p.asm.sb).apply(null,arguments)}),nn=p.stackSave=function(){return(nn=p.stackSave=p.asm.tb).apply(null,arguments)},sn=p.stackRestore=function(){return(sn=p.stackRestore=p.asm.ub).apply(null,arguments)},on=p.stackAlloc=function(){return(on=p.stackAlloc=p.asm.vb).apply(null,arguments)},rn=p._emscripten_stack_set_limits=function(){return(rn=p._emscripten_stack_set_limits=p.asm.wb).apply(null,arguments)},an=p._memalign=function(){return(an=p._memalign=p.asm.xb).apply(null,arguments)},dn=p.__emscripten_allow_main_runtime_queued_calls=9824,un=p.__emscripten_main_thread_futex=11448;function ln(e){this.name="ExitStatus",this.message="Program terminated with exit("+e+")",this.status=e}function cn(e){if(e=e||b,!(be>0)){if(v)return c(p),le(),void postMessage({cmd:"loaded"});ue(),be>0||(p.setStatus?(p.setStatus("Running..."),setTimeout((function(){setTimeout((function(){p.setStatus("")}),1),t()}),1)):t())}function t(){Bt||(Bt=!0,p.calledRun=!0,W||(le(),ce(),c(p),p.onRuntimeInitialized&&p.onRuntimeInitialized(),pe()))}}function fn(e,t){if(!t||!M||0!==e){if(!t&&v)throw postMessage({cmd:"exitProcess",returnCode:e}),new ln(e);M||(Be.terminateAllThreads(),fe(),p.onExit&&p.onExit(e),W=!0),j(e,new ln(e))}}if(p.cwrap=H,p.PThread=Be,p.PThread=Be,p.wasmMemory=F,p.ExitStatus=ln,ge=function e(){Bt||cn(),Bt||(ge=e)},p.run=cn,p.preInit)for("function"==typeof p.preInit&&(p.preInit=[p.preInit]);p.preInit.length>0;)p.preInit.pop()();return v&&(M=!1,Be.initWorker()),cn(),e.ready});e.exports=a}).call(this,"/index.js",n(/*! ./../../../process/browser.js */"./node_modules/process/browser.js"),"/",n(/*! ./../../../webpack/buildin/global.js */"./node_modules/webpack/buildin/global.js"))},"./node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm-threaded-simd.worker.js": -/*!*******************************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm-threaded-simd.worker.js ***! - \*******************************************************************************************************/ -/*! exports provided: wasmWorkerContents */function(e,t,n){"use strict";n.r(t),n.d(t,"wasmWorkerContents",(function(){return s}));const s='var Module={};function threadPrintErr(){var text=Array.prototype.slice.call(arguments).join(" ");console.error(text)}function threadAlert(){var text=Array.prototype.slice.call(arguments).join(" ");postMessage({cmd:"alert",text:text,threadId:Module["_pthread_self"]()})}var err=threadPrintErr;this.alert=threadAlert;Module["instantiateWasm"]=function(info,receiveInstance){var instance=new WebAssembly.Instance(Module["wasmModule"],info);Module["wasmModule"]=null;receiveInstance(instance);return instance.exports};function moduleLoaded(){}this.onmessage=function(e){try{if(e.data.cmd==="load"){Module["wasmModule"]=e.data.wasmModule;Module["wasmMemory"]=e.data.wasmMemory;Module["buffer"]=Module["wasmMemory"].buffer;Module["ENVIRONMENT_IS_PTHREAD"]=true;if(typeof e.data.urlOrBlob==="string"){importScripts(e.data.urlOrBlob)}else{var objectUrl=URL.createObjectURL(e.data.urlOrBlob);importScripts(objectUrl);URL.revokeObjectURL(objectUrl)}WasmBackendModuleThreadedSimd(Module).then(function(instance){Module=instance;moduleLoaded()})}else if(e.data.cmd==="objectTransfer"){Module["PThread"].receiveObjectTransfer(e.data)}else if(e.data.cmd==="run"){Module["__performance_now_clock_drift"]=performance.now()-e.data.time;Module["__emscripten_thread_init"](e.data.threadInfoStruct,0,0);var max=e.data.stackBase;var top=e.data.stackBase+e.data.stackSize;Module["establishStackSpace"](top,max);Module["_emscripten_tls_init"]();Module["PThread"].receiveObjectTransfer(e.data);Module["PThread"].setThreadStatus(Module["_pthread_self"](),1);try{var result=Module["invokeEntryPoint"](e.data.start_routine,e.data.arg);if(!Module["getNoExitRuntime"]())Module["PThread"].threadExit(result)}catch(ex){if(ex==="Canceled!"){Module["PThread"].threadCancel()}else if(ex!="unwind"){if(ex instanceof Module["ExitStatus"]){if(Module["getNoExitRuntime"]()){}else{Module["PThread"].threadExit(ex.status)}}else{Module["PThread"].threadExit(-2);throw ex}}}}else if(e.data.cmd==="cancel"){if(Module["_pthread_self"]()){Module["PThread"].threadCancel()}}else if(e.data.target==="setimmediate"){}else if(e.data.cmd==="processThreadQueue"){if(Module["_pthread_self"]()){Module["_emscripten_current_thread_process_queued_calls"]()}}else{err("worker.js received unknown command "+e.data.cmd);err(e.data)}}catch(ex){err("worker.js onmessage() captured an uncaught exception: "+ex);if(ex&&ex.stack)err(ex.stack);throw ex}};if(typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string"){self={location:{href:__filename}};var onmessage=this.onmessage;var nodeWorkerThreads=require("worker_threads");global.Worker=nodeWorkerThreads.Worker;var parentPort=nodeWorkerThreads.parentPort;parentPort.on("message",function(data){onmessage({data:data})});var nodeFS=require("fs");var nodeRead=function(filename){return nodeFS.readFileSync(filename,"utf8")};function globalEval(x){global.require=require;global.Module=Module;eval.call(null,x)}importScripts=function(f){globalEval(nodeRead(f))};postMessage=function(msg){parentPort.postMessage(msg)};if(typeof performance==="undefined"){performance={now:function(){return Date.now()}}}}'},"./node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm.js": -/*!**********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm.js ***! - \**********************************************************************************/ -/*! no static exports found */function(e,t,n){(function(t,s,o){var r,i=(r=(r="undefined"!=typeof document&&document.currentScript?document.currentScript.src:void 0)||t,function(e){var t,i,a="undefined"!=typeof(e=e||{})?e:{};a.ready=new Promise((function(e,n){t=e,i=n}));var d,u={};for(d in a)a.hasOwnProperty(d)&&(u[d]=a[d]);var l=[],c=!1,f=!1,p=!1,m=!1;c="object"==typeof window,f="function"==typeof importScripts,p="object"==typeof s&&"object"==typeof s.versions&&"string"==typeof s.versions.node,m=!c&&!p&&!f;var h,b,j,g,w,_="";function k(e){return a.locateFile?a.locateFile(e,_):_+e}p?(_=f?n(/*! path */4).dirname(_)+"/":o+"/",h=function(e,t){return g||(g=n(/*! fs */5)),w||(w=n(/*! path */4)),e=w.normalize(e),g.readFileSync(e,t?null:"utf8")},j=function(e){var t=h(e,!0);return t.buffer||(t=new Uint8Array(t)),C(t.buffer),t},s.argv.length>1&&s.argv[1].replace(/\\/g,"/"),l=s.argv.slice(2),s.on("uncaughtException",(function(e){if(!(e instanceof $e))throw e})),s.on("unhandledRejection",re),a.inspect=function(){return"[Emscripten Module object]"}):m?("undefined"!=typeof read&&(h=function(e){return read(e)}),j=function(e){var t;return"function"==typeof readbuffer?new Uint8Array(readbuffer(e)):(C("object"==typeof(t=read(e,"binary"))),t)},"undefined"!=typeof scriptArgs?l=scriptArgs:"undefined"!=typeof arguments&&(l=arguments),"undefined"!=typeof print&&("undefined"==typeof console&&(console={}),console.log=print,console.warn=console.error="undefined"!=typeof printErr?printErr:print)):(c||f)&&(f?_=self.location.href:"undefined"!=typeof document&&document.currentScript&&(_=document.currentScript.src),r&&(_=r),_=0!==_.indexOf("blob:")?_.substr(0,_.lastIndexOf("/")+1):"",h=function(e){var t=new XMLHttpRequest;return t.open("GET",e,!1),t.send(null),t.responseText},f&&(j=function(e){var t=new XMLHttpRequest;return t.open("GET",e,!1),t.responseType="arraybuffer",t.send(null),new Uint8Array(t.response)}),b=function(e,t,n){var s=new XMLHttpRequest;s.open("GET",e,!0),s.responseType="arraybuffer",s.onload=function(){200==s.status||0==s.status&&s.response?t(s.response):n()},s.onerror=n,s.send(null)});var v,x,y=a.print||console.log.bind(console),O=a.printErr||console.warn.bind(console);for(d in u)u.hasOwnProperty(d)&&(a[d]=u[d]);u=null,a.arguments&&(l=a.arguments),a.thisProgram&&a.thisProgram,a.quit&&a.quit,a.wasmBinary&&(v=a.wasmBinary),a.noExitRuntime,"object"!=typeof WebAssembly&&re("no native wasm support detected");var I=!1;function C(e,t){e||re("Assertion failed: "+t)}function S(e){var t=a["_"+e];return C(t,"Cannot call unknown function "+e+", make sure it is exported"),t}function T(e,t,n,s,o){var r={string:function(e){var t=0;if(null!=e&&0!==e){var n=1+(e.length<<2);B(e,t=Fe(n),n)}return t},array:function(e){var t=Fe(e.length);return L(e,t),t}},i=S(e),a=[],d=0;if(s)for(var u=0;u=s);)++o;if(o-t>16&&e.subarray&&$)return $.decode(e.subarray(t,o));for(var r="";t>10,56320|1023&u)}}else r+=String.fromCharCode((31&i)<<6|a)}else r+=String.fromCharCode(i)}return r}function D(e,t){return e?M(R,e,t):""}function P(e,t,n,s){if(!(s>0))return 0;for(var o=n,r=n+s-1,i=0;i=55296&&a<=57343&&(a=65536+((1023&a)<<10)|1023&e.charCodeAt(++i)),a<=127){if(n>=r)break;t[n++]=a}else if(a<=2047){if(n+1>=r)break;t[n++]=192|a>>6,t[n++]=128|63&a}else if(a<=65535){if(n+2>=r)break;t[n++]=224|a>>12,t[n++]=128|a>>6&63,t[n++]=128|63&a}else{if(n+3>=r)break;t[n++]=240|a>>18,t[n++]=128|a>>12&63,t[n++]=128|a>>6&63,t[n++]=128|63&a}}return t[n]=0,n-o}function B(e,t,n){return P(e,R,t,n)}function L(e,t){A.set(e,t)}function z(e,t){return e%t>0&&(e+=t-e%t),e}function G(e){E=e,a.HEAP8=A=new Int8Array(e),a.HEAP16=new Int16Array(e),a.HEAP32=F=new Int32Array(e),a.HEAPU8=R=new Uint8Array(e),a.HEAPU16=new Uint16Array(e),a.HEAPU32=new Uint32Array(e),a.HEAPF32=new Float32Array(e),a.HEAPF64=new Float64Array(e)}a.INITIAL_MEMORY;var W,U=[],V=[],q=[],H=[];function K(){if(a.preRun)for("function"==typeof a.preRun&&(a.preRun=[a.preRun]);a.preRun.length;)Q(a.preRun.shift());he(U)}function X(){he(V)}function Y(){he(q)}function Z(){if(a.postRun)for("function"==typeof a.postRun&&(a.postRun=[a.postRun]);a.postRun.length;)J(a.postRun.shift());he(H)}function Q(e){U.unshift(e)}function J(e){H.unshift(e)}V.push({func:function(){Ne()}});var ee=0,te=null,ne=null;function se(e){ee++,a.monitorRunDependencies&&a.monitorRunDependencies(ee)}function oe(e){if(ee--,a.monitorRunDependencies&&a.monitorRunDependencies(ee),0==ee&&(null!==te&&(clearInterval(te),te=null),ne)){var t=ne;ne=null,t()}}function re(e){a.onAbort&&a.onAbort(e),O(e+=""),I=!0,e="abort("+e+"). Build with -s ASSERTIONS=1 for more info.";var t=new WebAssembly.RuntimeError(e);throw i(t),t}function ie(e,t){return String.prototype.startsWith?e.startsWith(t):0===e.indexOf(t)}a.preloadedImages={},a.preloadedAudios={};var ae="data:application/octet-stream;base64,";function de(e){return ie(e,ae)}var ue="file://";function le(e){return ie(e,ue)}var ce="tfjs-backend-wasm.wasm";function fe(e){try{if(e==ce&&v)return new Uint8Array(v);if(j)return j(e);throw"both async and sync fetching of the wasm failed"}catch(e){re(e)}}function pe(){if(!v&&(c||f)){if("function"==typeof fetch&&!le(ce))return fetch(ce,{credentials:"same-origin"}).then((function(e){if(!e.ok)throw"failed to load wasm binary file at '"+ce+"'";return e.arrayBuffer()})).catch((function(){return fe(ce)}));if(b)return new Promise((function(e,t){b(ce,(function(t){e(new Uint8Array(t))}),t)}))}return Promise.resolve().then((function(){return fe(ce)}))}function me(){var e={a:Te};function t(e,t){var n=e.exports;a.asm=n,G((x=a.asm.i).buffer),W=a.asm.o,oe()}function n(e){t(e.instance)}function s(t){return pe().then((function(t){return WebAssembly.instantiate(t,e)})).then(t,(function(e){O("failed to asynchronously prepare wasm: "+e),re(e)}))}if(se(),a.instantiateWasm)try{return a.instantiateWasm(e,t)}catch(e){return O("Module.instantiateWasm callback failed with error: "+e),!1}return(v||"function"!=typeof WebAssembly.instantiateStreaming||de(ce)||le(ce)||"function"!=typeof fetch?s(n):fetch(ce,{credentials:"same-origin"}).then((function(t){return WebAssembly.instantiateStreaming(t,e).then(n,(function(e){return O("wasm streaming compile failed: "+e),O("falling back to ArrayBuffer instantiation"),s(n)}))}))).catch(i),{}}function he(e){for(;e.length>0;){var t=e.shift();if("function"!=typeof t){var n=t.func;"number"==typeof n?void 0===t.arg?W.get(n)():W.get(n)(t.arg):n(void 0===t.arg?null:t.arg)}else t(a)}}function be(){re()}function je(e,t,n){R.copyWithin(e,t,t+n)}function ge(){return R.length}function we(e){try{return x.grow(e-E.byteLength+65535>>>16),G(x.buffer),1}catch(e){}}function _e(e){var t=ge(),n=2147483648;if(e>n)return!1;for(var s=1;s<=4;s*=2){var o=t*(1+.2/s);if(o=Math.min(o,e+100663296),we(Math.min(n,z(Math.max(e,o),65536))))return!0}return!1}de(ce)||(ce=k(ce));var ke={mappings:{},buffers:[null,[],[]],printChar:function(e,t){var n=ke.buffers[e];0===t||10===t?((1===e?y:O)(M(n,0)),n.length=0):n.push(t)},varargs:void 0,get:function(){return ke.varargs+=4,F[ke.varargs-4>>2]},getStr:function(e){return D(e)},get64:function(e,t){return e}};function ve(e){return 0}function xe(e,t,n,s,o){}function ye(e,t,n,s){for(var o=0,r=0;r>2],a=F[t+(8*r+4)>>2],d=0;d>2]=o,0}function Oe(){return 6}function Ie(e){return F[Ee()>>2]=e,e}function Ce(e){switch(e){case 30:return 16384;case 85:return 131072;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:case 80:case 81:case 79:return-1;case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 75:return 16384;case 39:return 1e3;case 89:return 700;case 71:return 256;case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:return"object"==typeof navigator&&navigator.hardwareConcurrency||1}return Ie(28),-1}var Se,Te={a:be,d:je,e:_e,f:ve,c:xe,b:ye,g:Oe,h:Ce},Ne=(me(),a.___wasm_call_ctors=function(){return(Ne=a.___wasm_call_ctors=a.asm.j).apply(null,arguments)}),Ee=(a._init=function(){return(a._init=a.asm.k).apply(null,arguments)},a._register_tensor=function(){return(a._register_tensor=a.asm.l).apply(null,arguments)},a._dispose_data=function(){return(a._dispose_data=a.asm.m).apply(null,arguments)},a._dispose=function(){return(a._dispose=a.asm.n).apply(null,arguments)},a._Abs=function(){return(a._Abs=a.asm.p).apply(null,arguments)},a._Add=function(){return(a._Add=a.asm.q).apply(null,arguments)},a._AddN=function(){return(a._AddN=a.asm.r).apply(null,arguments)},a._All=function(){return(a._All=a.asm.s).apply(null,arguments)},a._Any=function(){return(a._Any=a.asm.t).apply(null,arguments)},a._ArgMax=function(){return(a._ArgMax=a.asm.u).apply(null,arguments)},a._AvgPool=function(){return(a._AvgPool=a.asm.v).apply(null,arguments)},a._BatchMatMul=function(){return(a._BatchMatMul=a.asm.w).apply(null,arguments)},a._Ceil=function(){return(a._Ceil=a.asm.x).apply(null,arguments)},a._ClipByValue=function(){return(a._ClipByValue=a.asm.y).apply(null,arguments)},a._Conv2D=function(){return(a._Conv2D=a.asm.z).apply(null,arguments)},a._Conv2DBackpropInput=function(){return(a._Conv2DBackpropInput=a.asm.A).apply(null,arguments)},a._Cos=function(){return(a._Cos=a.asm.B).apply(null,arguments)},a._Cosh=function(){return(a._Cosh=a.asm.C).apply(null,arguments)},a._CropAndResize=function(){return(a._CropAndResize=a.asm.D).apply(null,arguments)},a._Cumsum=function(){return(a._Cumsum=a.asm.E).apply(null,arguments)},a._DepthToSpace=function(){return(a._DepthToSpace=a.asm.F).apply(null,arguments)},a._DepthwiseConv2dNative=function(){return(a._DepthwiseConv2dNative=a.asm.G).apply(null,arguments)},a._Equal=function(){return(a._Equal=a.asm.H).apply(null,arguments)},a._Exp=function(){return(a._Exp=a.asm.I).apply(null,arguments)},a._FlipLeftRight=function(){return(a._FlipLeftRight=a.asm.J).apply(null,arguments)},a._Floor=function(){return(a._Floor=a.asm.K).apply(null,arguments)},a._FloorDiv=function(){return(a._FloorDiv=a.asm.L).apply(null,arguments)},a._FusedBatchNorm=function(){return(a._FusedBatchNorm=a.asm.M).apply(null,arguments)},a._FusedConv2D=function(){return(a._FusedConv2D=a.asm.N).apply(null,arguments)},a._FusedDepthwiseConv2D=function(){return(a._FusedDepthwiseConv2D=a.asm.O).apply(null,arguments)},a._Gather=function(){return(a._Gather=a.asm.P).apply(null,arguments)},a._GatherNd=function(){return(a._GatherNd=a.asm.Q).apply(null,arguments)},a._Greater=function(){return(a._Greater=a.asm.R).apply(null,arguments)},a._GreaterEqual=function(){return(a._GreaterEqual=a.asm.S).apply(null,arguments)},a._LeakyRelu=function(){return(a._LeakyRelu=a.asm.T).apply(null,arguments)},a._Less=function(){return(a._Less=a.asm.U).apply(null,arguments)},a._LessEqual=function(){return(a._LessEqual=a.asm.V).apply(null,arguments)},a._Log=function(){return(a._Log=a.asm.W).apply(null,arguments)},a._LogicalAnd=function(){return(a._LogicalAnd=a.asm.X).apply(null,arguments)},a._Max=function(){return(a._Max=a.asm.Y).apply(null,arguments)},a._MaxPool=function(){return(a._MaxPool=a.asm.Z).apply(null,arguments)},a._Maximum=function(){return(a._Maximum=a.asm._).apply(null,arguments)},a._Mean=function(){return(a._Mean=a.asm.$).apply(null,arguments)},a._Min=function(){return(a._Min=a.asm.aa).apply(null,arguments)},a._Minimum=function(){return(a._Minimum=a.asm.ba).apply(null,arguments)},a._MirrorPad=function(){return(a._MirrorPad=a.asm.ca).apply(null,arguments)},a._Multiply=function(){return(a._Multiply=a.asm.da).apply(null,arguments)},a._Neg=function(){return(a._Neg=a.asm.ea).apply(null,arguments)},a._NonMaxSuppressionV3=function(){return(a._NonMaxSuppressionV3=a.asm.fa).apply(null,arguments)},a._NonMaxSuppressionV4=function(){return(a._NonMaxSuppressionV4=a.asm.ga).apply(null,arguments)},a._NonMaxSuppressionV5=function(){return(a._NonMaxSuppressionV5=a.asm.ha).apply(null,arguments)},a._NotEqual=function(){return(a._NotEqual=a.asm.ia).apply(null,arguments)},a._OneHot=function(){return(a._OneHot=a.asm.ja).apply(null,arguments)},a._PadV2=function(){return(a._PadV2=a.asm.ka).apply(null,arguments)},a._Pow=function(){return(a._Pow=a.asm.la).apply(null,arguments)},a._Prelu=function(){return(a._Prelu=a.asm.ma).apply(null,arguments)},a._Prod=function(){return(a._Prod=a.asm.na).apply(null,arguments)},a._RealDiv=function(){return(a._RealDiv=a.asm.oa).apply(null,arguments)},a._Relu=function(){return(a._Relu=a.asm.pa).apply(null,arguments)},a._Relu6=function(){return(a._Relu6=a.asm.qa).apply(null,arguments)},a._ResizeBilinear=function(){return(a._ResizeBilinear=a.asm.ra).apply(null,arguments)},a._Reverse=function(){return(a._Reverse=a.asm.sa).apply(null,arguments)},a._RotateWithOffset=function(){return(a._RotateWithOffset=a.asm.ta).apply(null,arguments)},a._Round=function(){return(a._Round=a.asm.ua).apply(null,arguments)},a._Rsqrt=function(){return(a._Rsqrt=a.asm.va).apply(null,arguments)},a._ScatterNd=function(){return(a._ScatterNd=a.asm.wa).apply(null,arguments)},a._SelectV2=function(){return(a._SelectV2=a.asm.xa).apply(null,arguments)},a._Sigmoid=function(){return(a._Sigmoid=a.asm.ya).apply(null,arguments)},a._Sin=function(){return(a._Sin=a.asm.za).apply(null,arguments)},a._Softmax=function(){return(a._Softmax=a.asm.Aa).apply(null,arguments)},a._Sqrt=function(){return(a._Sqrt=a.asm.Ba).apply(null,arguments)},a._Square=function(){return(a._Square=a.asm.Ca).apply(null,arguments)},a._SquaredDifference=function(){return(a._SquaredDifference=a.asm.Da).apply(null,arguments)},a._Step=function(){return(a._Step=a.asm.Ea).apply(null,arguments)},a._StridedSlice=function(){return(a._StridedSlice=a.asm.Fa).apply(null,arguments)},a._Sub=function(){return(a._Sub=a.asm.Ga).apply(null,arguments)},a._Sum=function(){return(a._Sum=a.asm.Ha).apply(null,arguments)},a._Tan=function(){return(a._Tan=a.asm.Ia).apply(null,arguments)},a._Tanh=function(){return(a._Tanh=a.asm.Ja).apply(null,arguments)},a._Tile=function(){return(a._Tile=a.asm.Ka).apply(null,arguments)},a._TopK=function(){return(a._TopK=a.asm.La).apply(null,arguments)},a._Transform=function(){return(a._Transform=a.asm.Ma).apply(null,arguments)},a._Transpose=function(){return(a._Transpose=a.asm.Na).apply(null,arguments)},a.__FusedMatMul=function(){return(a.__FusedMatMul=a.asm.Oa).apply(null,arguments)},a._malloc=function(){return(a._malloc=a.asm.Pa).apply(null,arguments)},a._free=function(){return(a._free=a.asm.Qa).apply(null,arguments)},a.___errno_location=function(){return(Ee=a.___errno_location=a.asm.Ra).apply(null,arguments)}),Ae=a.stackSave=function(){return(Ae=a.stackSave=a.asm.Sa).apply(null,arguments)},Re=a.stackRestore=function(){return(Re=a.stackRestore=a.asm.Ta).apply(null,arguments)},Fe=a.stackAlloc=function(){return(Fe=a.stackAlloc=a.asm.Ua).apply(null,arguments)};function $e(e){this.name="ExitStatus",this.message="Program terminated with exit("+e+")",this.status=e}function Me(e){function n(){Se||(Se=!0,a.calledRun=!0,I||(X(),Y(),t(a),a.onRuntimeInitialized&&a.onRuntimeInitialized(),Z()))}e=e||l,ee>0||(K(),ee>0||(a.setStatus?(a.setStatus("Running..."),setTimeout((function(){setTimeout((function(){a.setStatus("")}),1),n()}),1)):n()))}if(a.cwrap=N,ne=function e(){Se||Me(),Se||(ne=e)},a.run=Me,a.preInit)for("function"==typeof a.preInit&&(a.preInit=[a.preInit]);a.preInit.length>0;)a.preInit.pop()();return Me(),e.ready});e.exports=i}).call(this,"/index.js",n(/*! ./../../../process/browser.js */"./node_modules/process/browser.js"),"/")},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/addn_gpu.js": -/*!**********************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/addn_gpu.js ***! - \**********************************************************************/ -/*! exports provided: AddNProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"AddNProgram",(function(){return s})); +function d(e){const{inputs:t,backend:n,attrs:l}=e,{x:c}=t,{dtype:f}=l;if("complex64"===f){if("complex64"===c.dtype)return Object(a.identity)({inputs:{x:c},backend:n});const e=Object(r.zeros)(n,c.shape,c.dtype),t=d({inputs:{x:c},backend:n,attrs:{dtype:"float32"}}),s=Object(i.complex)({inputs:{real:t,imag:e},backend:n});return n.disposeIntermediateTensorInfo(e),n.disposeIntermediateTensorInfo(t),s}if("complex64"===c.dtype){const e=Object(u.real)({inputs:{input:c},backend:n}),t=d({inputs:{x:e},backend:n,attrs:{dtype:f}});return n.disposeIntermediateTensorInfo(e),t}if(!s.util.hasEncodingLoss(c.dtype,f)){const e=Object(a.identity)({inputs:{x:c},backend:n});return{dataId:e.dataId,shape:e.shape,dtype:f}}if("int32"===f){const e=n.data.get(c.dataId).values,t=Int32Array.from(e);return n.makeTensorInfo(c.shape,"int32",t)}if("bool"===f){const e=n.data.get(c.dataId).values,t=s.util.toTypedArray([0],c.dtype),[r,i]=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>e!==t?1:0))(c.shape,[],e,t,"bool");return n.makeTensorInfo(i,"bool",r)}throw new Error(`Error in Cast: failed to cast ${c.dtype} to ${f}`)}const l={kernelName:s.Cast,backendName:"cpu",kernelFunc:d}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Ceil.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Ceil.js ***! + \************************************************************************/ +/*! exports provided: ceilImpl, ceil, ceilConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"ceilImpl",(function(){return i})),n.d(t,"ceil",(function(){return a})),n.d(t,"ceilConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_impl.js"),r=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the "License"); + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, + * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -class s{constructor(e,t){this.outputShape=[],this.outputShape=e,this.variableNames=t.map(((e,t)=>`T${t}`));const n=[];this.variableNames.forEach((e=>{n.push(`float v${e} = get${e}AtOutCoords();`)}));const s=this.variableNames.map((e=>`v${e}`)).join(" + ");this.userCode=`\n void main() {\n ${n.join("\n ")}\n\n float result = ${s};\n setOutput(result);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/addn_packed_gpu.js": -/*!*****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/addn_packed_gpu.js ***! - \*****************************************************************************/ -/*! exports provided: AddNPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"AddNPackedProgram",(function(){return s})); +const i=Object(o.createSimpleUnaryImpl)((e=>Math.ceil(e))),a=Object(r.unaryKernelFuncFromImpl)(s.Ceil,i),u={kernelName:s.Ceil,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Clip.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Clip.js ***! + \************************************************************************/ +/*! exports provided: clip, clipConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"clip",(function(){return r})),n.d(t,"clipConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the "License"); + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, + * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -class s{constructor(e,t){this.outputShape=[],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=e,this.variableNames=t.map(((e,t)=>`T${t}`));const n=[];this.variableNames.forEach((e=>{n.push(`vec4 v${e} = get${e}AtOutCoords();`)}));const s=this.variableNames.map((e=>`v${e}`)).join(" + ");this.userCode=`\n void main() {\n ${n.join("\n ")}\n\n vec4 result = ${s};\n setOutput(result);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/argminmax_gpu.js": +const r=Object(o.unaryKernelFunc)(s.ClipByValue,((e,t)=>{const n=t;return e>n.clipValueMax?n.clipValueMax:e":"<",a=n?"inOffset + i;":"round(getBestIndicesA(batch, inOffset + i));";this.userCode=`\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = outIdx * ${s};\n\n int bestIndex = inOffset;\n float bestValue = getA(batch, bestIndex);\n\n for (int i = 0; i < ${s}; i++) {\n int inIdx = ${a};\n float candidate = getA(batch, inIdx);\n if (candidate ${i} bestValue) {\n bestValue = candidate;\n bestIndex = inIdx;\n }\n }\n setOutput(float(bestIndex));\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/argminmax_packed_gpu.js": -/*!**********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/argminmax_packed_gpu.js ***! - \**********************************************************************************/ -/*! exports provided: ArgMinMaxPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ArgMinMaxPackedProgram",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./packing_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/packing_util.js"),r=n(/*! ./shader_compiler */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +function s(e){const{inputs:t,backend:n}=e,{real:s,imag:o}=t,r=n.data.get(s.dataId).values,i=n.data.get(o.dataId).values,a=n.makeTensorInfo(s.shape,"complex64");return n.data.get(a.dataId).complexTensorInfos={real:n.makeTensorInfo(s.shape,"float32",r),imag:n.makeTensorInfo(o.shape,"float32",i)},a}n.r(t),n.d(t,"complex",(function(){return s})),n.d(t,"complexConfig",(function(){return o}));const o={kernelName:n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js").Complex,backendName:"cpu",kernelFunc:s}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ComplexAbs.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ComplexAbs.js ***! + \******************************************************************************/ +/*! exports provided: complexAbs, complexAbsConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"complexAbs",(function(){return o})),n.d(t,"complexAbsConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the "License"); + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, + * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -class i{constructor(e,t,n,i){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,s.util.assert(e.length>2,(()=>`Packed arg${n.charAt(0).toUpperCase()+n.slice(1)} supports only inputs with rank above 2.`));const a=e[e.length-1],d=Math.ceil(a/t);this.outputShape=e.slice(0,-1),d>1&&this.outputShape.push(d),i||this.variableNames.push("bestIndicesA");const u=this.outputShape,l=u.length,c=Object(r.getCoordsDataType)(l),f=Object(o.getChannels)("coords",l);let p,m;if(1===d){m=l+1;const e=Object(r.getCoordsDataType)(m);p=`\n ${e} sourceLocR = ${e}(${f.join()}, 0);\n ++${f[l-1]};\n ${e} sourceLocG = ${e}(${f.join()}, 0);\n ++${f[l-2]};\n ${e} sourceLocA = ${e}(${f.join()}, 0);\n --${f[l-1]};\n ${e} sourceLocB = ${e}(${f.join()}, 0);\n --${f[l-2]};`}else m=l,p=`\n ${c} sourceLocR = coords;\n ++${f[l-1]};\n ${c} sourceLocG = coords;\n ++${f[l-2]};\n ${c} sourceLocA = coords;\n --${f[l-1]};\n ${c} sourceLocB = coords;\n --${f[l-2]};`;const h=["x","y","z","w","u","v"].slice(0,m),b="."+h[m-1],j=h.map((e=>"int "+e)),g=Object(o.getChannels)("sourceLocR",m-1).concat("inIdx.r"),w=Object(o.getChannels)("sourceLocG",m-1).concat("inIdx.g"),_=Object(o.getChannels)("sourceLocB",m-1).concat("inIdx.b"),k=Object(o.getChannels)("sourceLocA",m-1).concat("inIdx.a"),v="max"===n?"greaterThan":"lessThan",x=i?"":`\n inIdx = round(vec4(getBestIndicesAChannel(${g.join()}),\n getBestIndicesAChannel(${w.join()}),\n getBestIndicesAChannel(${_.join()}),\n getBestIndicesAChannel(${k.join()})));`,y=`vec4(\n getAChannel(${g.join()}),\n hasNextCol ? getAChannel(${w.join()}) : 0.,\n hasNextRow ? getAChannel(${_.join()}) : 0.,\n hasNextRow && hasNextCol ? getAChannel(${k.join()}) : 0.)`,O=i?"":`\n float getBestIndicesAChannel(${j.join()}) {\n return getChannel(getBestIndicesA(${h.join()}),\n vec2(${h.slice(-2).join()}));\n }`;this.userCode=`\n float getAChannel(${j.join()}) {\n return getChannel(getA(${h.join()}),\n vec2(${h.slice(-2).join()}));\n }\n ${O}\n void main() {\n ${c} coords = getOutputCoords();\n bool hasNextCol = ${f[l-1]} < ${u[l-1]-1};\n bool hasNextRow = ${f[l-2]} < ${u[l-2]-1};\n ${p}\n ivec4 srcIdx = ivec4(sourceLocR${b}, sourceLocG${b},\n sourceLocB${b}, sourceLocA${b}) * ${t};\n ivec4 inIdx = srcIdx;\n vec4 bestIndex = vec4(inIdx);\n vec4 bestValue = ${y};\n\n for (int i = 0; i < ${t}; i++) {\n inIdx = srcIdx;\n ${x}\n vec4 candidate = ${y};\n bvec4 nan = isnan(candidate);\n bvec4 replace = bvec4(\n vec4(${v}(candidate, bestValue)) * (vec4(1.0) - vec4(nan)));\n\n bestValue = vec4(replace.x ? candidate.x : bestValue.x,\n replace.y ? candidate.y : bestValue.y,\n replace.z ? candidate.z : bestValue.z,\n replace.w ? candidate.w : bestValue.w);\n bestIndex = mix(bestIndex, vec4(inIdx), vec4(replace));\n srcIdx++;\n }\n setOutput(bestIndex);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/avg_pool_backprop_gpu.js": -/*!***********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/avg_pool_backprop_gpu.js ***! - \***********************************************************************************/ -/*! exports provided: AvgPool2DBackpropProgram, AvgPool3DBackpropProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"AvgPool2DBackpropProgram",(function(){return s})),n.d(t,"AvgPool3DBackpropProgram",(function(){return o})); + */const o=e=>{const{x:t}=e.inputs,n=e.backend,o=new Float32Array(s.util.sizeFromShape(t.shape)),r=n.data.get(t.dataId),i=r.complexTensorInfos.real,a=r.complexTensorInfos.imag,u=n.data.get(i.dataId).values,d=n.data.get(a.dataId).values;for(let e=0;e= ${e.outHeight}.0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < ${d};\n wC+= ${i}) {\n float dyC = float(dyCCorner + wC) / ${o}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(b, idyR, idyC, d);\n\n dotProd += dyValue * avgMultiplier;\n }\n }\n setOutput(dotProd);\n }\n `}}class o{constructor(e){this.variableNames=["dy"],this.outputShape=e.inShape;const t=e.filterDepth,n=e.filterHeight,s=e.filterWidth,o=e.strideDepth,r=e.strideHeight,i=e.strideWidth,a=e.dilationDepth,d=e.dilationHeight,u=e.dilationWidth,l=e.effectiveFilterDepth,c=e.effectiveFilterHeight,f=e.effectiveFilterWidth,p=l-1-e.padInfo.front,m=c-1-e.padInfo.top,h=f-1-e.padInfo.left,b=1/(t*n*s);this.userCode=`\n const ivec3 pads = ivec3(${p}, ${m}, ${h});\n const float avgMultiplier = float(${b});\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int ch = coords.u;\n\n ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads;\n int dyDCorner = dyCorner.x;\n int dyRCorner = dyCorner.y;\n int dyCCorner = dyCorner.z;\n\n // Convolve dy(?, ?, ?, d) with pos mask(:, :, :, ch) to get\n // dx(xD, xR, xC, ch).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n\n for (int wD = 0; wD < ${l};\n wD += ${a}) {\n float dyD = float(dyDCorner + wD) / ${o}.0;\n\n if (dyD < 0.0 || dyD >= ${e.outDepth}.0 || fract(dyD) > 0.0) {\n continue;\n }\n int idyD = int(dyD);\n\n for (int wR = 0; wR < ${c};\n wR += ${d}) {\n float dyR = float(dyRCorner + wR) / ${r}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 ||\n fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < ${f};\n wC += ${u}) {\n float dyC = float(dyCCorner + wC) / ${i}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(batch, idyD, idyR, idyC, ch);\n\n dotProd += dyValue * avgMultiplier;\n }\n }\n }\n setOutput(dotProd);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/backend_webgl.js": -/*!***************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/backend_webgl.js ***! - \***************************************************************************/ -/*! exports provided: EPSILON_FLOAT32, EPSILON_FLOAT16, getBinaryCache, MathBackendWebGL */function(e,t,n){"use strict";n.r(t),n.d(t,"EPSILON_FLOAT32",(function(){return x})),n.d(t,"EPSILON_FLOAT16",(function(){return y})),n.d(t,"getBinaryCache",(function(){return I})),n.d(t,"MathBackendWebGL",(function(){return S}));n(/*! ./flags_webgl */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/flags_webgl.js");var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./canvas_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/canvas_util.js"),r=n(/*! ./decode_matrix_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/decode_matrix_gpu.js"),i=n(/*! ./decode_matrix_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/decode_matrix_packed_gpu.js"),a=n(/*! ./encode_float_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_float_gpu.js"),d=n(/*! ./encode_float_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_float_packed_gpu.js"),u=n(/*! ./encode_matrix_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_matrix_gpu.js"),l=n(/*! ./encode_matrix_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_matrix_packed_gpu.js"),c=n(/*! ./gpgpu_context */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/gpgpu_context.js"),f=n(/*! ./gpgpu_math */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/gpgpu_math.js"),p=n(/*! ./kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"),m=n(/*! ./pack_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/pack_gpu.js"),h=n(/*! ./reshape_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/reshape_packed_gpu.js"),b=n(/*! ./tex_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/tex_util.js"),j=n(/*! ./texture_manager */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/texture_manager.js"),g=n(/*! ./unaryop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js"),w=n(/*! ./unaryop_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_packed_gpu.js"),_=n(/*! ./unpack_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/unpack_gpu.js"),k=n(/*! ./webgl_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"); +function l(e){const{inputs:t,backend:n,attrs:c}=e,{axis:f}=c,p=s.util.parseAxisParam(f,t[0].shape)[0];let m=s.backend_util.computeOutShape(t.map((e=>e.shape)),p);if(0===s.util.sizeFromShape(m))return n.makeTensorInfo(m,t[0].dtype,[]);const h=t.filter((e=>s.util.sizeFromShape(e.shape)>0));if(1===h.length)return Object(i.identity)({inputs:{x:h[0]},backend:n});const b=h.map((e=>e.shape));if(s.backend_util.assertParamsConsistent(b,p),"complex64"===h[0].dtype){const e=h.map((e=>Object(u.real)({inputs:{input:e},backend:n}))),t=h.map((e=>Object(a.imag)({inputs:{input:e},backend:n}))),s=l({inputs:e,backend:n,attrs:{axis:p}}),r=l({inputs:t,backend:n,attrs:{axis:p}}),i=Object(o.complex)({inputs:{real:s,imag:r},backend:n});return e.forEach((e=>n.disposeIntermediateTensorInfo(e))),t.forEach((e=>n.disposeIntermediateTensorInfo(e))),n.disposeIntermediateTensorInfo(s),n.disposeIntermediateTensorInfo(r),i}const j=h.map((e=>{const t=[-1,s.util.sizeFromShape(e.shape.slice(p))];return Object(d.reshape)({inputs:{x:e},backend:n,attrs:{shape:t}})})),g=j.map((e=>({vals:n.data.get(e.dataId).values,shape:e.shape})));m=s.backend_util.computeOutShape(j.map((e=>e.shape)),1);const w=1===j[0].shape[0],_=Object(r.concatImpl)(g,m,t[0].dtype,w),k=s.backend_util.computeOutShape(h.map((e=>e.shape)),p),v=n.makeTensorInfo(k,t[0].dtype,_);return j.forEach((e=>n.disposeIntermediateTensorInfo(e))),v}const c={kernelName:s.Concat,backendName:"cpu",kernelFunc:l}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Concat_impl.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Concat_impl.js ***! + \*******************************************************************************/ +/*! exports provided: concatImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"concatImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license - * Copyright 2017 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -6330,15 +6322,14 @@ class s{constructor(e){this.variableNames=["dy"],this.outputShape=e.inShape;cons * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -const v=s.kernel_impls.whereImpl,x=1e-7,y=1e-4,O={};function I(e){return e in O||(O[e]={}),O[e]}const C=Object(s.env)().getNumber("CPU_HANDOFF_SIZE_THRESHOLD");class S extends s.KernelBackend{constructor(e){if(super(),this.pendingRead=new WeakMap,this.pendingDisposal=new WeakSet,this.dataRefCount=new WeakMap,this.numBytesInGPU=0,this.uploadWaitMs=0,this.downloadWaitMs=0,this.lastGlFlushTime=0,this.warnedAboutMemory=!1,this.pendingDeletes=0,this.disposed=!1,!Object(s.env)().getBool("HAS_WEBGL"))throw new Error("WebGL is not supported on this device");if(null==e){const e=Object(o.getWebGLContext)(Object(s.env)().getNumber("WEBGL_VERSION"));this.binaryCache=I(Object(s.env)().getNumber("WEBGL_VERSION")),this.gpgpu=new c.GPGPUContext(e),this.canvas=e.canvas,this.gpgpuCreatedLocally=!0}else this.gpgpu=e,this.binaryCache={},this.gpgpuCreatedLocally=!1,this.canvas=e.gl.canvas;this.textureManager=new j.TextureManager(this.gpgpu),this.numMBBeforeWarning=null==Object(s.env)().global.screen?1024:Object(s.env)().global.screen.height*Object(s.env)().global.screen.width*window.devicePixelRatio*600/1024/1024,this.texData=new s.DataStorage(this,Object(s.engine)())}nextDataId(){return S.nextDataId++}numDataIds(){return this.texData.numDataIds()-this.pendingDeletes}write(e,t,n){if((Object(s.env)().getBool("WEBGL_CHECK_NUMERICAL_PROBLEMS")||Object(s.env)().getBool("DEBUG"))&&this.checkNumericalProblems(e),"complex64"===n&&null!=e)throw new Error("Cannot write to a complex64 dtype. Please use tf.complex(real, imag).");const o={id:this.nextDataId()};return this.texData.set(o,{shape:t,dtype:n,values:e,usage:b.TextureUsage.UPLOAD,refCount:1}),o}refCount(e){if(this.texData.has(e)){return this.texData.get(e).refCount}return 0}incRef(e){this.texData.get(e).refCount++}decRef(e){if(this.texData.has(e)){this.texData.get(e).refCount--}}move(e,t,n,o,r){if(Object(s.env)().getBool("DEBUG")&&this.checkNumericalProblems(t),"complex64"===o)throw new Error("Cannot write to a complex64 dtype. Please use tf.complex(real, imag).");this.texData.set(e,{shape:n,dtype:o,values:t,usage:b.TextureUsage.UPLOAD,refCount:r})}disposeIntermediateTensorInfo(e){this.disposeData(e.dataId)}readSync(e){const t=this.texData.get(e),{values:n,dtype:o,complexTensorInfos:r,slice:i,shape:a,isPacked:d}=t;if(null!=i){let t;t=d?new w.UnaryOpPackedProgram(a,g.CLONE):new g.UnaryOpProgram(a,g.CLONE);const n=this.runWebGLProgram(t,[{dataId:e,shape:a,dtype:o}],o),s=this.readSync(n.dataId);return this.disposeIntermediateTensorInfo(n),s}if(null!=n)return this.convertAndCacheOnCPU(e);if("string"===o)return n;const u=null!=this.activeTimers;let l,c;if(u&&(l=s.util.now()),"complex64"===o){const e=this.readSync(r.real.dataId),t=this.readSync(r.imag.dataId);c=s.backend_util.mergeRealAndImagArrays(e,t)}else c=this.getValuesFromTexture(e);return u&&(this.downloadWaitMs+=s.util.now()-l),this.convertAndCacheOnCPU(e,c)}async read(e){if(this.pendingRead.has(e)){const t=this.pendingRead.get(e);return new Promise((e=>t.push(e)))}const t=this.texData.get(e),{values:n,shape:o,slice:r,dtype:i,complexTensorInfos:a,isPacked:d}=t;if(null!=r){let t;t=d?new w.UnaryOpPackedProgram(o,g.CLONE):new g.UnaryOpProgram(o,g.CLONE);const n=this.runWebGLProgram(t,[{dataId:e,shape:o,dtype:i}],i),s=this.read(n.dataId);return this.disposeIntermediateTensorInfo(n),s}if(null!=n)return this.convertAndCacheOnCPU(e);if(!Object(s.env)().getBool("WEBGL_DOWNLOAD_FLOAT_ENABLED")&&2===Object(s.env)().getNumber("WEBGL_VERSION"))throw new Error("tensor.data() with WEBGL_DOWNLOAD_FLOAT_ENABLED=false and WEBGL_VERSION=2 not yet supported.");let u,l,c=null;if("complex64"!==i&&Object(s.env)().get("WEBGL_BUFFER_SUPPORTED")){u=this.decode(e);const t=this.texData.get(u.dataId);c=this.gpgpu.createBufferFromTexture(t.texture,...b.getDenseTexShape(o))}if(this.pendingRead.set(e,[]),"complex64"!==i&&await this.gpgpu.createAndWaitForFence(),"complex64"===i){const e=await Promise.all([this.read(a.real.dataId),this.read(a.imag.dataId)]),t=e[0],n=e[1];l=s.backend_util.mergeRealAndImagArrays(t,n)}else if(null==c)l=this.getValuesFromTexture(e);else{const e=s.util.sizeFromShape(o);l=this.gpgpu.downloadFloat32MatrixFromBuffer(c,e)}if(null!=u&&this.disposeIntermediateTensorInfo(u),null!=c){const e=this.gpgpu.gl;k.callAndCheck(e,(()=>e.deleteBuffer(c)))}const f=this.convertAndCacheOnCPU(e,l),p=this.pendingRead.get(e);return this.pendingRead.delete(e),p.forEach((e=>e(f))),this.pendingDisposal.has(e)&&(this.pendingDisposal.delete(e),this.disposeData(e)&&Object(s.engine)().removeDataId(e,this),this.pendingDeletes--),f}bufferSync(e){const t=this.readSync(e.dataId);let n=t;if("string"===e.dtype)try{n=t.map((e=>s.util.decodeString(e)))}catch(e){throw new Error("Failed to decode encoded string bytes into utf-8")}return Object(s.buffer)(e.shape,e.dtype,n)}checkNumericalProblems(e){if(null!=e)for(let t=0;t0}async time(e){const t=this.activeTimers,n=[];let o=!1;null==this.programTimersStack?(this.programTimersStack=n,o=!0):this.activeTimers.push(n),this.activeTimers=n,e();const r=s.util.flatten(this.activeTimers.map((e=>e.query))).filter((e=>null!=e)),i=s.util.flatten(this.activeTimers.map((e=>e.name))).filter((e=>null!=e));this.activeTimers=t,o&&(this.programTimersStack=null);const a={uploadWaitMs:this.uploadWaitMs,downloadWaitMs:this.downloadWaitMs,kernelMs:null,wallMs:null};if(Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE")>0){const e=await Promise.all(r);a.kernelMs=s.util.sum(e),a.getExtraProfileInfo=()=>e.map(((e,t)=>({name:i[t],ms:e}))).map((e=>`${e.name}: ${e.ms}`)).join(", ")}else a.kernelMs={error:"WebGL query timers are not supported in this environment."};return this.uploadWaitMs=0,this.downloadWaitMs=0,a}memory(){return{unreliable:!1,numBytesInGPU:this.numBytesInGPU,numBytesInGPUAllocated:this.textureManager.numBytesAllocated,numBytesInGPUFree:this.textureManager.numBytesFree}}startTimer(){return Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE")>0?this.gpgpu.beginQuery():{startMs:s.util.now(),endMs:null}}endTimer(e){return Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE")>0?(this.gpgpu.endQuery(),e):(e.endMs=s.util.now(),e)}async getQueryTime(e){if(Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE")>0)return this.gpgpu.waitForQueryAndGetTime(e);const t=e;return t.endMs-t.startMs}disposeData(e,t=!1){if(this.pendingDisposal.has(e))return!1;if(!this.texData.has(e))return!0;if(t?this.texData.get(e).refCount=0:this.texData.get(e).refCount--,!t&&this.texData.get(e).refCount>0)return!1;if(this.pendingRead.has(e))return this.pendingDisposal.add(e),this.pendingDeletes++,!1;this.releaseGPUData(e);const{complexTensorInfos:n}=this.texData.get(e);return null!=n&&(this.disposeData(n.real.dataId,t),this.disposeData(n.imag.dataId,t)),this.texData.delete(e),!0}releaseGPUData(e){const{texture:t,dtype:n,texShape:s,usage:o,isPacked:r,slice:i}=this.texData.get(e),a=i&&i.origDataId||e,d=this.dataRefCount.get(a);d>1?this.dataRefCount.set(a,d-1):(this.dataRefCount.delete(a),null!=t&&(this.numBytesInGPU-=this.computeBytes(s,n),this.textureManager.releaseTexture(t,s,o,r)));const u=this.texData.get(e);u.texture=null,u.texShape=null,u.isPacked=!1,u.slice=null}getTexture(e){return this.uploadToGPU(e),this.texData.get(e).texture}getDataInfo(e){return this.texData.get(e)}shouldExecuteOnCPU(e,t=C){return Object(s.env)().getBool("WEBGL_CPU_FORWARD")&&e.every((e=>null==this.texData.get(e.dataId).texture&&s.util.sizeFromShape(e.shape)0&&s.util.isString(n[0])){const r=n.map((e=>s.util.encodeString(e)));o=this.write(r,e,t)}else o=this.write(n,e,t);return this.texData.get(o).usage=null,{dataId:o,shape:e,dtype:t}}makeOutput(e,t,n){const{dataId:o}=this.makeTensorInfo(e,t,n);return Object(s.engine)().makeTensorFromDataId(o,e,t,this)}unpackTensor(e){const t=new _.UnpackProgram(e.shape);return this.runWebGLProgram(t,[e],e.dtype)}packTensor(e){const t=new m.PackProgram(e.shape);return this.runWebGLProgram(t,[e],e.dtype,null,!0)}packedReshape(e,t){const n=[k.getBatchDim(e.shape),...k.getRowsCols(e.shape)],s={dtype:e.dtype,shape:n,dataId:e.dataId},o=[k.getBatchDim(t),...k.getRowsCols(t)],r=new h.ReshapePackedProgram(o,n),i=this.runWebGLProgram(r,[s],e.dtype,null,!0);return{dataId:i.dataId,shape:t,dtype:i.dtype}}decode(e){const t=this.texData.get(e),{isPacked:n,shape:s,dtype:o}=t,a=k.getShapeAs3D(s);let d;d=n?new i.DecodeMatrixPackedProgram(a):new r.DecodeMatrixProgram(a);return{dtype:o,shape:s,dataId:this.runWebGLProgram(d,[{shape:a,dtype:o,dataId:e}],o,null,!0).dataId}}runWebGLProgram(e,t,n,o,r=!1){const i=this.makeTensorInfo(e.outputShape,n),a=this.texData.get(i.dataId);if(e.packedOutput&&(a.isPacked=!0),e.outPackingScheme===b.PackingScheme.DENSE){const t=b.getDenseTexShape(e.outputShape);a.texShape=t.map((e=>2*e))}if(null!=e.outTexUsage&&(a.usage=e.outTexUsage),0===s.util.sizeFromShape(i.shape))return a.values=s.util.getTypedArrayFromDType(i.dtype,0),i;const d=[],u=t.map((t=>{if("complex64"===t.dtype)throw new Error("GPGPUProgram does not support complex64 input. For complex64 dtypes, please separate the program into real and imaginary parts.");let n=this.texData.get(t.dataId);if(null==n.texture){if(!e.packedInputs&&s.util.sizeFromShape(t.shape)<=Object(s.env)().getNumber("WEBGL_SIZE_UPLOAD_UNIFORM"))return{shape:t.shape,texData:null,isUniform:!0,uniformValues:n.values};e.packedInputs&&(n.isPacked=!0,n.shape=t.shape)}else if(!!n.isPacked!=!!e.packedInputs)t=n.isPacked?this.unpackTensor(t):this.packTensor(t),d.push(t),n=this.texData.get(t.dataId);else if(n.isPacked&&!k.isReshapeFree(n.shape,t.shape)){const e=t,s=t.shape;t.shape=n.shape,t=this.packedReshape(t,s),d.push(t),n=this.texData.get(t.dataId),e.shape=s}return this.uploadToGPU(t.dataId),{shape:t.shape,texData:n,isUniform:!1}}));this.uploadToGPU(i.dataId);const l={shape:i.shape,texData:a,isUniform:!1},c=f.makeShaderKey(e,u,l),p=this.getAndSaveBinary(c,(()=>f.compileProgram(this.gpgpu,e,u,l))),m=null!=this.activeTimers;let h;m&&(h=this.startTimer()),f.runProgram(this.gpgpu,p,u,l,o),d.forEach((e=>this.disposeIntermediateTensorInfo(e))),m&&(h=this.endTimer(h),this.activeTimers.push({name:e.constructor.name,query:this.getQueryTime(h)}));const j=Object(s.env)().get("WEBGL_FLUSH_THRESHOLD");if(j>0){const e=s.util.now();e-this.lastGlFlushTime>j&&(this.gpgpu.gl.flush(),this.lastGlFlushTime=e)}if(!Object(s.env)().getBool("WEBGL_LAZILY_UNPACK")&&a.isPacked&&!1===r){const e=this.unpackTensor(i);return this.disposeIntermediateTensorInfo(i),e}return i}compileAndRun(e,t,n,s,o=!1){n=n||t[0].dtype;return this.runWebGLProgram(e,t,n,s,o)}getAndSaveBinary(e,t){return e in this.binaryCache||(this.binaryCache[e]=t()),this.binaryCache[e]}getTextureManager(){return this.textureManager}dispose(){if(!this.disposed){if(!Object(s.env)().getBool("IS_TEST")){Object.keys(this.binaryCache).forEach((e=>{this.gpgpu.deleteProgram(this.binaryCache[e].webGLProgram),delete this.binaryCache[e]}))}this.textureManager.dispose(),null!=this.canvas&&"undefined"!=typeof HTMLCanvasElement&&this.canvas instanceof HTMLCanvasElement?this.canvas.remove():this.canvas=null,this.gpgpuCreatedLocally&&(this.gpgpu.program=null,this.gpgpu.dispose()),this.disposed=!0}}floatPrecision(){return null==this.floatPrecisionValue&&(this.floatPrecisionValue=Object(s.tidy)((()=>{if(!Object(s.env)().get("WEBGL_RENDER_FLOAT32_ENABLED")){const e=Object(s.env)().getBool("DEBUG");Object(s.env)().set("DEBUG",!1);const t=this.abs(Object(s.scalar)(1e-8)).dataSync()[0];if(Object(s.env)().set("DEBUG",e),t>0)return 32}return 16}))),this.floatPrecisionValue}epsilon(){return 32===this.floatPrecision()?x:y}uploadToGPU(e){const t=this.texData.get(e),{shape:n,dtype:o,values:r,texture:i,usage:a,isPacked:d}=t;if(null!=i)return;const c=null!=this.activeTimers;let f;c&&(f=s.util.now());let p=t.texShape;if(null==p&&(p=k.getTextureShapeFromLogicalShape(n,d),t.texShape=p),null!=r){const e=k.getShapeAs3D(n);let i,a=p[1],m=p[0];const h=r instanceof Uint8Array;d?([a,m]=b.getPackedMatrixTextureShapeWidthHeight(p[0],p[1]),i=new l.EncodeMatrixPackedProgram(e,[m,a],h)):i=new u.EncodeMatrixProgram(e,[m,a],h);const j=this.makeTensorInfo([m,a],o);this.texData.get(j.dataId).usage=h?b.TextureUsage.PIXELS:b.TextureUsage.UPLOAD,this.gpgpu.uploadDenseMatrixToTexture(this.getTexture(j.dataId),a,m,r);const g=!0,w=this.runWebGLProgram(i,[j],o,null,g),_=this.texData.get(w.dataId);t.texture=_.texture,t.texShape=_.texShape,t.isPacked=_.isPacked,t.usage=_.usage,this.disposeIntermediateTensorInfo(j),this.texData.delete(w.dataId),t.values=null,c&&(this.uploadWaitMs+=s.util.now()-f)}else{const e=this.acquireTexture(p,a,o,d);t.texture=e}}convertAndCacheOnCPU(e,t){const n=this.texData.get(e),{dtype:s}=n;return this.releaseGPUData(e),null!=t&&(n.values=function(e,t){if("float32"===t||"complex64"===t)return e;if("int32"===t||"bool"===t){const n="int32"===t?new Int32Array(e.length):new Uint8Array(e.length);for(let t=0;t1024*this.numMBBeforeWarning*1024){const e=(this.numBytesInGPU/1024/1024).toFixed(2);this.warnedAboutMemory=!0,console.warn(`High memory usage in GPU: ${e} MB, most likely due to a memory leak`)}return this.textureManager.acquireTexture(e,t,s)}computeBytes(e,t){return e[0]*e[1]*s.util.bytesPerElement(t)}}S.nextDataId=0},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/base.js": -/*!******************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/base.js ***! - \******************************************************************/ -/*! exports provided: version_webgl, MathBackendWebGL, setWebGLContext, GPGPUContext, gpgpu_util, webgl_util, forceHalfFloat, webgl */function(e,t,n){"use strict";n.r(t),n.d(t,"webgl",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./backend_webgl */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/backend_webgl.js"),r=n(/*! ./version */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/version.js");n.d(t,"version_webgl",(function(){return r.version}));var i=n(/*! ./webgl */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl.js");n.d(t,"MathBackendWebGL",(function(){return i.MathBackendWebGL})),n.d(t,"setWebGLContext",(function(){return i.setWebGLContext})),n.d(t,"GPGPUContext",(function(){return i.GPGPUContext})),n.d(t,"gpgpu_util",(function(){return i.gpgpu_util})),n.d(t,"webgl_util",(function(){return i.webgl_util})),n.d(t,"forceHalfFloat",(function(){return i.forceHalfFloat})), + */function o(e,t,n,o){const r=s.util.getArrayFromDType(n,s.util.sizeFromShape(t));if(o&&"string"!==n){let t=0;e.forEach((e=>{const n=s.util.sizeFromShape(e.shape);r.set(e.vals,t),t+=n}))}else{let o=0;e.forEach((e=>{const i="string"===n?s.backend_util.fromUint8ToStringArray(e.vals):e.vals;let a=0;for(let n=0;nnew o.MathBackendWebGL),2);const a={forceHalfFloat:i.forceHalfFloat}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/batchnorm_gpu.js": -/*!***************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/batchnorm_gpu.js ***! - \***************************************************************************/ -/*! exports provided: BatchNormProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"BatchNormProgram",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i,filter:a}=t,{strides:u,pad:d,dataFormat:l,dilations:c,dimRoundingMode:f}=r;Object(o.assertNotComplex)([i,a],"conv2d");const p=s.backend_util.convertConv2DDataFormat(l),m=s.backend_util.computeConv2DInfo(i.shape,a.shape,u,c,d,f,!1,p),h=m.filterHeight,b=m.filterWidth,j=m.dilationHeight,g=m.dilationWidth,w=m.padInfo.left,_=m.padInfo.top,k="channelsLast"===m.dataFormat,v=new s.TensorBuffer(m.outShape,i.dtype),x=s.util.computeStrides(i.shape),y=s.util.computeStrides(a.shape),O=x[0],I=k?x[1]:x[2],C=k?x[2]:1,S=k?1:x[1],T=v.strides[0],N=k?v.strides[1]:v.strides[2],E=k?v.strides[2]:1,A=k?1:v.strides[1],R=n.data.get(i.dataId).values,F=n.data.get(a.dataId).values,M=v.values;for(let e=0;e=m.inHeight)continue;const r=e*y[0],i=t+n*I;for(let e=0;e=m.inWidth)continue;const o=i+s*C;let a=r+e*y[1];for(let e=0;enew o.MathBack * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */class o{constructor(e,t,n,o,r,i){this.outputShape=[],this.variableNames=["x","mean","variance"],s.backend_util.assertAndGetBroadcastShape(e,t),s.backend_util.assertAndGetBroadcastShape(e,n);let a="0.0";null!=o&&(s.backend_util.assertAndGetBroadcastShape(e,o),this.variableNames.push("offset"),a="getOffsetAtOutCoords()");let d="1.0";null!=r&&(s.backend_util.assertAndGetBroadcastShape(e,r),this.variableNames.push("scale"),d="getScaleAtOutCoords()"),this.outputShape=e,this.userCode=`\n void main() {\n float x = getXAtOutCoords();\n float mean = getMeanAtOutCoords();\n float variance = getVarianceAtOutCoords();\n float offset = ${a};\n float scale = ${d};\n float inv = scale * inversesqrt(variance + float(${i}));\n setOutput(dot(vec3(x, -mean, offset), vec3(inv, inv, 1)));\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/batchnorm_packed_gpu.js": -/*!**********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/batchnorm_packed_gpu.js ***! - \**********************************************************************************/ -/*! exports provided: BatchNormPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"BatchNormPackedProgram",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i,dy:a}=t,{strides:u,pad:d,dataFormat:l,dimRoundingMode:c,filterShape:f}=r;Object(o.assertNotComplex)([i,a],"conv2dBackpropFilter");const p=s.backend_util.convertConv2DDataFormat(l),m=s.backend_util.computeConv2DInfo(i.shape,f,u,1,d,c,!1,p),{strideHeight:h,strideWidth:b,filterHeight:j,filterWidth:g}=m,w="channelsLast"===m.dataFormat,_=new s.TensorBuffer(m.filterShape,"float32"),k=m.padInfo.left,v=m.padInfo.top,x=n.data.get(i.dataId).values,y=n.data.get(a.dataId).values,O=new s.TensorBuffer(i.shape,i.dtype,x),I=new s.TensorBuffer(a.shape,a.dtype,y);for(let e=0;enew o.MathBack * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */class o{constructor(e,t,n,o,r,i){this.packedInputs=!0,this.packedOutput=!0,this.variableNames=["x","mean","variance"],s.backend_util.assertAndGetBroadcastShape(e,t),s.backend_util.assertAndGetBroadcastShape(e,n);let a="vec4(0.0)";null!=o&&(s.backend_util.assertAndGetBroadcastShape(e,o),this.variableNames.push("offset"),a="getOffsetAtOutCoords()");let d="vec4(1.0)";null!=r&&(s.backend_util.assertAndGetBroadcastShape(e,r),this.variableNames.push("scale"),d="getScaleAtOutCoords()"),this.outputShape=e,this.userCode=`\n void main() {\n vec4 offset = ${a};\n vec4 scale = ${d};\n\n vec4 x = getXAtOutCoords();\n vec4 mean = getMeanAtOutCoords();\n vec4 variance = getVarianceAtOutCoords();\n\n vec4 inv = scale * inversesqrt(variance + vec4(${i}));\n\n setOutput((x - mean) * inv + offset);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_complex_gpu.js": -/*!**********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_complex_gpu.js ***! - \**********************************************************************************/ -/*! exports provided: COMPLEX_MULTIPLY, BinaryOpComplexProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"COMPLEX_MULTIPLY",(function(){return o})),n.d(t,"BinaryOpComplexProgram",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{dy:i,filter:a}=t,{inputShape:u,strides:d,pad:l,dataFormat:c,dimRoundingMode:f}=r;Object(o.assertNotComplex)([i,a],"conv2dBackpropInput");const p=s.util.computeStrides(a.shape),m=s.util.computeStrides(i.shape);let h=s.backend_util.convertConv2DDataFormat(c);const b=s.backend_util.computeConv2DInfo(u,a.shape,d,1,l,f,!1,h),j=new s.TensorBuffer(b.inShape,"float32"),g=j.values,w=n.data.get(i.dataId).values,_=n.data.get(a.dataId).values,[k,v,x]=p,{batchSize:y,filterHeight:O,filterWidth:I,inChannels:C,inHeight:S,inWidth:T,outChannels:N,outHeight:E,outWidth:A,strideHeight:R,strideWidth:F}=b;h=b.dataFormat;const M=O-1-b.padInfo.top,$=I-1-b.padInfo.left,D="channelsLast"===h,P=j.strides[0],B=D?j.strides[1]:j.strides[2],L=D?j.strides[2]:1,z=D?1:j.strides[1],G=m[0],U=D?m[1]:m[2],W=D?m[2]:1,V=D?1:m[1];for(let e=0;enew o.MathBack * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */const o={REAL:"return areal * breal - aimag * bimag;",IMAG:"return areal * bimag + aimag * breal;"};class r{constructor(e,t,n){this.variableNames=["AReal","AImag","BReal","BImag"],this.outputShape=s.backend_util.assertAndGetBroadcastShape(t,n),this.userCode=`\n float binaryOpComplex(\n float areal, float aimag, float breal, float bimag) {\n ${e}\n }\n\n void main() {\n float areal = getARealAtOutCoords();\n float aimag = getAImagAtOutCoords();\n float breal = getBRealAtOutCoords();\n float bimag = getBImagAtOutCoords();\n setOutput(binaryOpComplex(areal, aimag, breal, bimag));\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_gpu.js": -/*!**************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_gpu.js ***! - \**************************************************************************/ -/*! exports provided: CHECK_NAN_SNIPPET, SQUARED_DIFFERENCE, BinaryOpProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"CHECK_NAN_SNIPPET",(function(){return r})),n.d(t,"SQUARED_DIFFERENCE",(function(){return i})),n.d(t,"BinaryOpProgram",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./gpgpu_math */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/gpgpu_math.js"); + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i,filter:a}=t,{strides:u,pad:d,dilations:l}=r;Object(o.assertNotComplex)([i,a],"conv3d");const c=s.backend_util.computeConv3DInfo(i.shape,a.shape,u,l,d),{filterDepth:f,filterHeight:p,filterWidth:m,dilationDepth:h,dilationHeight:b,dilationWidth:j,padInfo:g}=c,w=g.front,_=g.left,k=g.top,v=new s.TensorBuffer(c.outShape,i.dtype),x=n.data.get(i.dataId).values,y=n.data.get(a.dataId).values,O=v.values,I=s.util.computeStrides(i.shape),C=s.util.computeStrides(a.shape);for(let e=0;e=c.inDepth)continue;const r=e*C[0],i=t+n*I[1];for(let e=0;e=c.inHeight)continue;const o=r+e*C[1],a=i+s*I[2];for(let e=0;e=c.inWidth)continue;const r=o+e*C[2],i=a+t*c.inChannels;let u=r;for(let e=0;enew o.MathBack * limitations under the License. * ============================================================================= */ -const r="\n if (isnan(a)) return a;\n if (isnan(b)) return b;\n",i="return (a - b) * (a - b);";class a{constructor(e,t,n){this.variableNames=["A","B"],this.outputShape=s.backend_util.assertAndGetBroadcastShape(t,n),this.enableShapeUniforms=Object(o.useShapeUniforms)(this.outputShape.length),this.userCode=`\n float binaryOperation(float a, float b) {\n ${e}\n }\n\n void main() {\n float a = getAAtOutCoords();\n float b = getBAtOutCoords();\n setOutput(binaryOperation(a, b));\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_packed_gpu.js": -/*!*********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_packed_gpu.js ***! - \*********************************************************************************/ -/*! exports provided: CHECK_NAN_SNIPPET, ELU_DER, NOT_EQUAL, BinaryOpPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"CHECK_NAN_SNIPPET",(function(){return a})),n.d(t,"ELU_DER",(function(){return d})),n.d(t,"NOT_EQUAL",(function(){return u})),n.d(t,"BinaryOpPackedProgram",(function(){return l}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./gpgpu_math */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/gpgpu_math.js"),r=n(/*! ./packing_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/packing_util.js"),i=n(/*! ./shader_compiler */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i,dy:a}=t,{strides:u,pad:d,filterShape:l}=r;Object(o.assertNotComplex)([i,a],"conv3dBackpropFilterV2");const c=s.util.computeStrides(i.shape),f=s.util.computeStrides(a.shape),p=s.backend_util.computeConv3DInfo(i.shape,l,u,1,d),m=p.strideDepth,h=p.strideHeight,b=p.strideWidth,j=p.filterDepth,g=p.filterHeight,w=p.filterWidth,_=new s.TensorBuffer(p.filterShape,"float32"),k=_.values,[v,x,y,O]=_.strides,I=n.data.get(a.dataId).values,[C,S,T,N]=f,E=n.data.get(i.dataId).values,[A,R,F,M]=c,$=p.padInfo.front,D=p.padInfo.left,P=p.padInfo.top;for(let e=0;e 0. ? NAN : result.r;\n result.g = isNaN.g > 0. ? NAN : result.g;\n result.b = isNaN.b > 0. ? NAN : result.b;\n result.a = isNaN.a > 0. ? NAN : result.a;\n",d="\n vec4 bGTEZero = vec4(greaterThanEqual(b, vec4(0.)));\n return (bGTEZero * a) + ((vec4(1.0) - bGTEZero) * (a * (b + vec4(1.0))));\n",u="\n return vec4(notEqual(a, b));\n";class l{constructor(e,t,n,a=!1){this.variableNames=["A","B"],this.supportsBroadcasting=!0,this.packedInputs=!0,this.packedOutput=!0,this.outputShape=s.backend_util.assertAndGetBroadcastShape(t,n);const d=this.outputShape.length;this.enableShapeUniforms=Object(o.useShapeUniforms)(d);let u="";if(a)if(0===d||1===s.util.sizeFromShape(this.outputShape))u="\n result.y = 0.;\n result.z = 0.;\n result.w = 0.;\n ";else{if(u=`\n ${Object(i.getCoordsDataType)(d)} coords = getOutputCoords();\n `,1===d)this.enableShapeUniforms?u+="\n result.y = (coords + 1) >= outShape ? 0. : result.y;\n result.z = 0.;\n result.w = 0.;\n ":u+=`\n result.y = (coords + 1) >= ${this.outputShape[0]} ? 0. : result.y;\n result.z = 0.;\n result.w = 0.;\n `;else{const e=Object(r.getChannels)("coords",d);this.enableShapeUniforms?u+=`\n bool nextRowOutOfBounds =\n (${e[d-2]} + 1) >= outShape[${d} - 2];\n bool nextColOutOfBounds =\n (${e[d-1]} + 1) >= outShape[${d} - 1];\n result.y = nextColOutOfBounds ? 0. : result.y;\n result.z = nextRowOutOfBounds ? 0. : result.z;\n result.w = nextColOutOfBounds || nextRowOutOfBounds ? 0. : result.w;\n `:u+=`\n bool nextRowOutOfBounds =\n (${e[d-2]} + 1) >= ${this.outputShape[d-2]};\n bool nextColOutOfBounds =\n (${e[d-1]} + 1) >= ${this.outputShape[d-1]};\n result.y = nextColOutOfBounds ? 0. : result.y;\n result.z = nextRowOutOfBounds ? 0. : result.z;\n result.w = nextColOutOfBounds || nextRowOutOfBounds ? 0. : result.w;\n `}}this.userCode=`\n vec4 binaryOperation(vec4 a, vec4 b) {\n ${e}\n }\n\n void main() {\n vec4 a = getAAtOutCoords();\n vec4 b = getBAtOutCoords();\n\n vec4 result = binaryOperation(a, b);\n ${u}\n\n setOutput(result);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/canvas_util.js": -/*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/canvas_util.js ***! - \*************************************************************************/ -/*! exports provided: clearWebGLContext, setWebGLContext, getWebGLContext */function(e,t,n){"use strict";n.r(t),n.d(t,"clearWebGLContext",(function(){return r})),n.d(t,"setWebGLContext",(function(){return i})),n.d(t,"getWebGLContext",(function(){return a})); +function r(e){const{inputs:t,backend:n,attrs:r}=e,{dy:i,filter:a}=t,{pad:u,strides:d,inputShape:l}=r;Object(o.assertNotComplex)([i],"conv3dBackpropInputV2");const c=s.util.computeStrides(i.shape),f=s.util.computeStrides(a.shape),p=s.backend_util.computeConv3DInfo(l,a.shape,d,1,u),m=new s.TensorBuffer(p.inShape,"float32"),h=m.values,[b,j,g,w]=m.strides,_=n.data.get(i.dataId).values,[k,v,x,y]=c,O=n.data.get(a.dataId).values,[I,C,S,T]=f,{batchSize:N,filterDepth:E,filterHeight:A,filterWidth:R,inChannels:F,inDepth:M,inHeight:$,inWidth:D,outChannels:P,outDepth:B,outHeight:L,outWidth:z,strideDepth:G,strideHeight:U,strideWidth:W}=p,V=E-1-p.padInfo.front,q=A-1-p.padInfo.top,H=R-1-p.padInfo.left;for(let e=0;e{t.preventDefault(),delete s[e]}),!1),1===e)return t.getContext("webgl",o)||t.getContext("experimental-webgl",o);return t.getContext("webgl2",o)}(e);if(null===t)return console.log("Could not get context for WebGL version",e),null;s[e]=t}const t=s[e];return t.isContextLost()?(delete s[e],a(e)):(t.disable(t.DEPTH_TEST),t.disable(t.STENCIL_TEST),t.disable(t.BLEND),t.disable(t.DITHER),t.disable(t.POLYGON_OFFSET_FILL),t.disable(t.SAMPLE_COVERAGE),t.enable(t.SCISSOR_TEST),t.enable(t.CULL_FACE),t.cullFace(t.BACK),s[e])}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/clip_gpu.js": -/*!**********************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/clip_gpu.js ***! - \**********************************************************************/ -/*! exports provided: ClipProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ClipProgram",(function(){return s})); +const r=Object(o.unaryKernelFunc)(s.Cos,(e=>Math.cos(e))),i={kernelName:s.Cos,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cosh.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cosh.js ***! + \************************************************************************/ +/*! exports provided: cosh, coshConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"cosh",(function(){return r})),n.d(t,"coshConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); /** * @license - * Copyright 2017 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the "License"); + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, + * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -class s{constructor(e){this.variableNames=["A"],this.customUniforms=[{name:"minVal",type:"float"},{name:"maxVal",type:"float"}],this.outputShape=e,this.userCode="\n\n void main() {\n float value = getAAtOutCoords();\n if (isnan(value)) {\n setOutput(value);\n return;\n }\n\n setOutput(clamp(value, minVal, maxVal));\n }\n "}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/clip_packed_gpu.js": -/*!*****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/clip_packed_gpu.js ***! - \*****************************************************************************/ -/*! exports provided: ClipPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ClipPackedProgram",(function(){return s})); +const r=Object(o.unaryKernelFunc)(s.Cosh,(e=>Math.cosh(e))),i={kernelName:s.Cosh,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/CropAndResize.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/CropAndResize.js ***! + \*********************************************************************************/ +/*! exports provided: cropAndResize, cropAndResizeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"cropAndResize",(function(){return o})),n.d(t,"cropAndResizeConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license - * Copyright 2018 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -6516,15 +6510,14 @@ class s{constructor(e){this.variableNames=["A"],this.customUniforms=[{name:"minV * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -class s{constructor(e){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.customUniforms=[{name:"minVal",type:"float"},{name:"maxVal",type:"float"}],this.outputShape=e,this.userCode="\n void main() {\n vec4 value = getAAtOutCoords();\n\n if (any(isnan(value))) {\n setOutput(value);\n return;\n }\n\n setOutput(clamp(value, vec4(minVal), vec4(maxVal)));\n }\n "}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/complex_abs_gpu.js": -/*!*****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/complex_abs_gpu.js ***! - \*****************************************************************************/ -/*! exports provided: ComplexAbsProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ComplexAbsProgram",(function(){return s})); + */function o(e){const{inputs:t,backend:n,attrs:o}=e,{image:r,boxes:i,boxInd:a}=t,{cropSize:u,method:d,extrapolationValue:l}=o,[c,f,p,m]=r.shape,h=i.shape[0],[b,j]=u,g=Object(s.buffer)([h,b,j,m],"float32"),w=n.data.get(i.dataId).values,_=n.data.get(a.dataId).values,k=n.data.get(r.dataId).values,v=s.util.computeStrides(r.shape),x=s.util.computeStrides(g.shape);for(let e=0;e=c)continue;const a=b>1?(o-n)*(f-1)/(b-1):0,u=j>1?(r-s)*(p-1)/(j-1):0;for(let t=0;t1?n*(f-1)+t*a:.5*(n+o)*(f-1);if(c<0||c>f-1)for(let n=0;n1?s*(p-1)+d*u:.5*(s+r)*(p-1);if(c<0||c>p-1){for(let n=0;n1?s*(p-1)+n*u:.5*(s+r)*(p-1);if(o<0||o>p-1){for(let s=0;se+j-t-1:(e,t)=>e+t;for(let e=0;e`T${t}`));const t=new Array(e.length-1);t[0]=e[0][1];for(let n=1;n`T${t}`));const c=new Array(e.length-1);c[0]=e[0][t];for(let n=1;n= ${c[e-1]}) {\n return getChannel(\n getT${e}(${a(l,f,t)}),\n vec2(${a(p,f,t)}));\n }`}const b=c.length,j=c[c.length-1];h+=`\n return getChannel(\n getT${b}(${a(l,f,j)}),\n vec2(${a(p,f,j)}));`,this.userCode=`\n float getValue(${l.map((e=>"int "+e))}) {\n ${h}\n }\n\n void main() {\n ${d} coords = getOutputCoords();\n vec4 result = vec4(getValue(${u}), 0., 0., 0.);\n\n ${u[i-1]} = ${u[i-1]} + 1;\n if (${u[i-1]} < ${n[i-1]}) {\n result.g = getValue(${u});\n }\n\n ${u[i-2]} = ${u[i-2]} + 1;\n if (${u[i-2]} < ${n[i-2]}) {\n result.a = getValue(${u});\n }\n\n ${u[i-1]} = ${u[i-1]} - 1;\n if (${u[i-2]} < ${n[i-2]} &&\n ${u[i-1]} < ${n[i-1]}) {\n result.b = getValue(${u});\n }\n setOutput(result);\n }\n `}}function a(e,t,n){const s=e.indexOf(t);return e.map(((e,t)=>t===s?`${e} - ${n}`:e)).join()}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu.js": -/*!*******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu.js ***! - \*******************************************************************************/ -/*! exports provided: Conv2DDerFilterProgram, Conv2DDerInputProgram, Conv3DDerFilterProgram, Conv3DDerInputProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"Conv2DDerFilterProgram",(function(){return s})),n.d(t,"Conv2DDerInputProgram",(function(){return o})),n.d(t,"Conv3DDerFilterProgram",(function(){return r})),n.d(t,"Conv3DDerInputProgram",(function(){return i})); + */function o(e){const{inputs:t,backend:n,attrs:o}=e,{x:r}=t,{blockSize:i,dataFormat:a}=o;s.util.assert("NHWC"===a,(()=>`Only NHWC dataFormat supported on CPU for depthToSpace. Got ${a}`)),s.util.assert(i>1,(()=>`blockSize should be > 1 for depthToSpace, but was: ${i}`));const u=r.shape[0],d=r.shape[1],l=r.shape[2],c=r.shape[3],f=d*i,p=l*i,m=c/(i*i),h=n.data.get(r.dataId).values,b=new Float32Array(u*f*p*m);let j=0;for(let e=0;e= ${e.inHeight}) {\n continue;\n }\n\n for (int yC = 0; yC < ${e.outWidth}; yC++) {\n int xC = wC + yC * ${n} - ${o};\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n if (${r}) {\n float dyValue = getDy(b, yR, yC, d2);\n float xValue = getX(b, xR, xC, d1);\n dotProd += (xValue * dyValue);\n } else {\n float dyValue = getDy(b, d2, yR, yC);\n float xValue = getX(b, d1, xR, xC);\n dotProd += (xValue * dyValue);\n }\n\n }\n }\n }\n setOutput(dotProd);\n }\n `}}class o{constructor(e){this.variableNames=["dy","W"],this.outputShape=e.inShape;const t=e.filterHeight,n=e.filterWidth,s=e.strideHeight,o=e.strideWidth,r="channelsLast"===e.dataFormat,i=t-1-e.padInfo.top,a=n-1-e.padInfo.left,d=r?1:2,u=r?2:3,l=r?3:1;this.userCode=`\n const ivec2 pads = ivec2(${i}, ${a});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d1 = coords[${l}];\n\n ivec2 dyCorner = ivec2(coords[${d}], coords[${u}]) - pads;\n int dyRCorner = dyCorner.x;\n int dyCCorner = dyCorner.y;\n\n // Convolve dy(?, ?, d2) with w(:, :, d1, d2) to compute dx(xR, xC, d1).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < ${t}; wR++) {\n float dyR = float(dyRCorner + wR) / ${s}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n int wRPerm = ${t} - 1 - wR;\n\n for (int wC = 0; wC < ${n}; wC++) {\n float dyC = float(dyCCorner + wC) / ${o}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n int wCPerm = ${n} - 1 - wC;\n\n for (int d2 = 0; d2 < ${e.outChannels}; d2++) {\n\n if (${r}) {\n float xValue = getDy(batch, idyR, idyC, d2);\n float wValue = getW(wRPerm, wCPerm, d1, d2);\n dotProd += xValue * wValue;\n } else {\n float xValue = getDy(batch, d2, idyR, idyC);\n float wValue = getW(wRPerm, wCPerm, d1, d2);\n dotProd += xValue * wValue;\n }\n\n }\n }\n }\n setOutput(dotProd);\n }\n `}}class r{constructor(e){this.variableNames=["x","dy"],this.outputShape=e.filterShape;const t=e.strideDepth,n=e.strideHeight,s=e.strideWidth,o=e.padInfo.front,r=e.padInfo.top,i=e.padInfo.left;this.userCode=`\n void main() {\n ivec5 coords = getOutputCoords();\n int wF = coords.x;\n int wR = coords.y;\n int wC = coords.z;\n int d1 = coords.w;\n int d2 = coords.u;\n\n float dotProd = 0.0;\n\n for (int b = 0; b < ${e.batchSize}; b++) {\n for (int yF = 0; yF < ${e.outDepth}; yF++) {\n int xF = wF + yF * ${t} - ${o};\n\n if (xF < 0 || xF >= ${e.inDepth}) {\n continue;\n }\n\n for (int yR = 0; yR < ${e.outHeight}; yR++) {\n int xR = wR + yR * ${n} - ${r};\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int yC = 0; yC < ${e.outWidth}; yC++) {\n int xC = wC + yC * ${s} - ${i};\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n float dyValue = getDy(b, yF, yR, yC, d2);\n float xValue = getX(b, xF, xR, xC, d1);\n dotProd += (xValue * dyValue);\n }\n }\n }\n }\n setOutput(dotProd);\n }\n `}}class i{constructor(e){this.variableNames=["dy","W"],this.outputShape=e.inShape;const t=e.filterDepth,n=e.filterHeight,s=e.filterWidth,o=e.strideDepth,r=e.strideHeight,i=e.strideWidth,a=t-1-e.padInfo.front,d=n-1-e.padInfo.top,u=s-1-e.padInfo.left;this.userCode=`\n const ivec3 pads = ivec3(${a}, ${d}, ${u});\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int d1 = coords.u;\n\n\n ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads;\n int dyFCorner = dyCorner.x;\n int dyRCorner = dyCorner.y;\n int dyCCorner = dyCorner.z;\n\n float dotProd = 0.0;\n for (int wF = 0; wF < ${t}; wF++) {\n float dyF = float(dyFCorner + wF) / ${o}.0;\n\n if (dyF < 0.0 || dyF >= ${e.outDepth}.0 || fract(dyF) > 0.0) {\n continue;\n }\n int idyF = int(dyF);\n\n int wFPerm = ${t} - 1 - wF;\n\n for (int wR = 0; wR < ${n}; wR++) {\n float dyR = float(dyRCorner + wR) / ${r}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 ||\n fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n int wRPerm = ${n} - 1 - wR;\n\n for (int wC = 0; wC < ${s}; wC++) {\n float dyC = float(dyCCorner + wC) / ${i}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n int wCPerm = ${s} - 1 - wC;\n\n for (int d2 = 0; d2 < ${e.outChannels}; d2++) {\n float xValue = getDy(batch, idyF, idyR, idyC, d2);\n float wValue = getW(wFPerm, wRPerm, wCPerm, d1, d2);\n dotProd += xValue * wValue;\n }\n }\n }\n }\n setOutput(dotProd);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu_depthwise.js": -/*!*****************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu_depthwise.js ***! - \*****************************************************************************************/ -/*! exports provided: DepthwiseConv2DDerFilterProgram, DepthwiseConv2DDerInputProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"DepthwiseConv2DDerFilterProgram",(function(){return s})),n.d(t,"DepthwiseConv2DDerInputProgram",(function(){return o})); +function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i,filter:a}=t,{strides:u,pad:d,dilations:l,dimRoundingMode:c}=r;Object(o.assertNotComplex)([i,a],"depthwiseConv2DNative");const f=s.util.computeStrides(i.shape),p=s.util.computeStrides(a.shape);let m=l;null==m&&(m=[1,1]),s.util.assert(s.backend_util.eitherStridesOrDilationsAreOne(u,m),(()=>`Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides ${u} and dilations '${m}'`));const h=s.backend_util.computeConv2DInfo(i.shape,a.shape,u,m,d,c,!0),{filterHeight:b,filterWidth:j,dilationHeight:g,dilationWidth:w,padInfo:_}=h,k=_.left,v=_.top,x=h.outChannels/h.inChannels,y=new s.TensorBuffer(h.outShape,i.dtype),O=n.data.get(i.dataId).values,I=n.data.get(a.dataId).values,C=y.values;for(let e=0;e=h.inHeight)continue;const r=e*p[0],i=t+n*f[1];for(let e=0;e=h.inWidth)continue;const o=r+e*p[1],a=i+s*h.inChannels;let u=t,d=o;for(let e=0;e= ${e.inHeight}) {\n continue;\n }\n\n for (int yC = 0; yC < ${e.outWidth}; yC++) {\n int xC = wC + yC * ${n} - ${o};\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n float dyValue = getDy(b, yR, yC, d2);\n float xValue = getX(b, xR, xC, d1);\n dotProd += (xValue * dyValue);\n }\n }\n }\n setOutput(dotProd);\n }\n `}}class o{constructor(e){this.variableNames=["dy","W"],this.outputShape=e.inShape;const t=e.filterHeight,n=e.filterWidth,s=e.strideHeight,o=e.strideWidth,r=t-1-e.padInfo.top,i=n-1-e.padInfo.left,a=e.outChannels/e.inChannels;this.userCode=`\n const ivec2 pads = ivec2(${r}, ${i});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d1 = coords[3];\n ivec2 dyCorner = coords.yz - pads;\n int dyRCorner = dyCorner.x;\n int dyCCorner = dyCorner.y;\n\n float dotProd = 0.0;\n\n for (int wR = 0; wR < ${t}; wR++) {\n float dyR = float(dyRCorner + wR) / ${s}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n int wRPerm = ${t} - 1 - wR;\n\n for (int wC = 0; wC < ${n}; wC++) {\n float dyC = float(dyCCorner + wC) / ${o}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n int wCPerm = ${n} - 1 - wC;\n\n // TO DO: Vec4 over the channelMul\n for (int dm = 0; dm < ${a}; dm++) {\n int d2 = d1 * ${a} + dm;\n float xValue = getDy(batch, idyR, idyC, d2);\n float wValue = getW(wRPerm, wCPerm, d1, dm);\n dotProd += xValue * wValue;\n }\n }\n }\n setOutput(dotProd);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_gpu.js": -/*!**********************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_gpu.js ***! - \**********************************************************************/ -/*! exports provided: Conv2DProgram, Conv3DProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"Conv2DProgram",(function(){return s})),n.d(t,"Conv3DProgram",(function(){return o})); +function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i,dy:a}=t,{strides:u,dilations:d,pad:l,dimRoundingMode:c,filterShape:f}=r;Object(o.assertNotComplex)([i,a],"depthwiseConv2dNativeBackpropFilter");const p=s.backend_util.computeConv2DInfo(i.shape,f,u,d,l,c,!0),{strideHeight:m,strideWidth:h,filterHeight:b,filterWidth:j}=p,g=new s.TensorBuffer(p.filterShape,"float32"),w=p.padInfo.left,_=p.padInfo.top,k=p.outChannels/p.inChannels,v=n.data.get(i.dataId).values,x=new s.TensorBuffer(i.shape,i.dtype,v),y=n.data.get(a.dataId).values,O=new s.TensorBuffer(a.shape,a.dtype,y);for(let e=0;e= ${e.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${f}; wC++) {\n int xC = xCCorner + wC * ${l};\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n for (int d1 = 0; d1 < ${p}; d1 += 4) {\n vec4 wValues = vec4(\n getW(wR, wC, d1, d2),\n getW(wR, wC, d1 + 1, d2),\n getW(wR, wC, d1 + 2, d2),\n getW(wR, wC, d1 + 3, d2)\n );\n\n if (${h}) {\n vec4 xValues = vec4(\n getX(batch, xR, xC, d1),\n getX(batch, xR, xC, d1 + 1),\n getX(batch, xR, xC, d1 + 2),\n getX(batch, xR, xC, d1 + 3)\n );\n dotProd += dot(xValues, wValues);\n } else {\n vec4 xValues = vec4(\n getX(batch, d1, xR, xC),\n getX(batch, d1 + 1, xR, xC),\n getX(batch, d1 + 2, xR, xC),\n getX(batch, d1 + 3, xR, xC)\n );\n dotProd += dot(xValues, wValues);\n }\n }\n\n if (${1===m}) {\n\n if (${h}) {\n dotProd +=\n getX(batch, xR, xC, ${p}) *\n getW(wR, wC, ${p}, d2);\n } else {\n dotProd +=\n getX(batch, ${p}, xR, xC) *\n getW(wR, wC, ${p}, d2);\n }\n\n } else if (${2===m}) {\n vec2 wValues = vec2(\n getW(wR, wC, ${p}, d2),\n getW(wR, wC, ${p} + 1, d2)\n );\n\n if (${h}) {\n vec2 xValues = vec2(\n getX(batch, xR, xC, ${p}),\n getX(batch, xR, xC, ${p} + 1)\n );\n dotProd += dot(xValues, wValues);\n } else {\n vec2 xValues = vec2(\n getX(batch, ${p}, xR, xC),\n getX(batch, ${p} + 1, xR, xC)\n );\n dotProd += dot(xValues, wValues);\n }\n\n } else if (${3===m}) {\n vec3 wValues = vec3(\n getW(wR, wC, ${p}, d2),\n getW(wR, wC, ${p} + 1, d2),\n getW(wR, wC, ${p} + 2, d2)\n );\n\n if (${h}) {\n vec3 xValues = vec3(\n getX(batch, xR, xC, ${p}),\n getX(batch, xR, xC, ${p} + 1),\n getX(batch, xR, xC, ${p} + 2)\n );\n dotProd += dot(xValues, wValues);\n } else {\n vec3 xValues = vec3(\n getX(batch, ${p}, xR, xC),\n getX(batch, ${p} + 1, xR, xC),\n getX(batch, ${p} + 2, xR, xC)\n );\n dotProd += dot(xValues, wValues);\n }\n\n }\n }\n }\n\n float result = dotProd;\n ${k}\n ${_}\n setOutput(result);\n }\n `}}class o{constructor(e){this.variableNames=["x","W"],this.outputShape=e.outShape;const t=e.padInfo.front,n=e.padInfo.top,s=e.padInfo.left,o=e.strideDepth,r=e.strideHeight,i=e.strideWidth,a=e.dilationDepth,d=e.dilationHeight,u=e.dilationWidth,l=e.filterDepth,c=e.filterHeight,f=e.filterWidth,p=4*Math.floor(e.inChannels/4),m=e.inChannels%4;this.userCode=`\n const ivec3 strides = ivec3(${o}, ${r}, ${i});\n const ivec3 pads = ivec3(${t}, ${n}, ${s});\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int d2 = coords.u;\n\n ivec3 xFRCCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads;\n int xFCorner = xFRCCorner.x;\n int xRCorner = xFRCCorner.y;\n int xCCorner = xFRCCorner.z;\n\n // Convolve x(?, ?, ?, d1) with w(:, :, :, d1, d2) to get\n // y(yF, yR, yC, d2). ? = to be determined. : = across all\n // values in that axis.\n float dotProd = 0.0;\n for (int wF = 0; wF < ${l}; wF++) {\n int xF = xFCorner + wF * ${a};\n\n if (xF < 0 || xF >= ${e.inDepth}) {\n continue;\n }\n\n for (int wR = 0; wR < ${c}; wR++) {\n int xR = xRCorner + wR * ${d};\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${f}; wC++) {\n int xC = xCCorner + wC * ${u};\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n for (int d1 = 0; d1 < ${p}; d1 += 4) {\n vec4 xValues = vec4(\n getX(batch, xF, xR, xC, d1),\n getX(batch, xF, xR, xC, d1 + 1),\n getX(batch, xF, xR, xC, d1 + 2),\n getX(batch, xF, xR, xC, d1 + 3)\n );\n vec4 wValues = vec4(\n getW(wF, wR, wC, d1, d2),\n getW(wF, wR, wC, d1 + 1, d2),\n getW(wF, wR, wC, d1 + 2, d2),\n getW(wF, wR, wC, d1 + 3, d2)\n );\n\n dotProd += dot(xValues, wValues);\n }\n\n if (${1===m}) {\n dotProd +=\n getX(batch, xF, xR, xC, ${p}) *\n getW(wF, wR, wC, ${p}, d2);\n } else if (${2===m}) {\n vec2 xValues = vec2(\n getX(batch, xF, xR, xC, ${p}),\n getX(batch, xF, xR, xC, ${p} + 1)\n );\n vec2 wValues = vec2(\n getW(wF, wR, wC, ${p}, d2),\n getW(wF, wR, wC, ${p} + 1, d2)\n );\n dotProd += dot(xValues, wValues);\n } else if (${3===m}) {\n vec3 xValues = vec3(\n getX(batch, xF, xR, xC, ${p}),\n getX(batch, xF, xR, xC, ${p} + 1),\n getX(batch, xF, xR, xC, ${p} + 2)\n );\n vec3 wValues = vec3(\n getW(wF, wR, wC, ${p}, d2),\n getW(wF, wR, wC, ${p} + 1, d2),\n getW(wF, wR, wC, ${p} + 2, d2)\n );\n dotProd += dot(xValues, wValues);\n }\n }\n }\n }\n setOutput(dotProd);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_gpu_depthwise.js": -/*!********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_gpu_depthwise.js ***! - \********************************************************************************/ -/*! exports provided: DepthwiseConv2DProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"DepthwiseConv2DProgram",(function(){return s})); +function r(e){const{inputs:t,backend:n,attrs:r}=e,{dy:i,filter:a}=t,{strides:u,dilations:d,pad:l,dimRoundingMode:c,inputShape:f}=r;Object(o.assertNotComplex)([i,a],"depthwiseConv2DNativeBackpropInput");const p=s.util.computeStrides(i.shape),m=s.util.computeStrides(a.shape),h=s.backend_util.computeConv2DInfo(f,a.shape,u,d,l,c,!0),b=new s.TensorBuffer(h.inShape,"float32"),j=b.values,[g,w,_]=b.strides,k=n.data.get(i.dataId).values,[v,x,y]=p,O=n.data.get(a.dataId).values,[I,C,S]=m,{batchSize:T,filterHeight:N,filterWidth:E,inChannels:A,inHeight:R,inWidth:F,outChannels:M,outHeight:$,outWidth:D,strideHeight:P,strideWidth:B}=h,L=N-1-h.padInfo.top,z=E-1-h.padInfo.left,G=M/A;for(let e=0;e= ${r}) {\n continue;\n }\n\n for (int wC = 0; wC < ${m}; wC++) {\n int xC = xCCorner + wC * ${f};\n\n if (xC < 0 || xC >= ${i}) {\n continue;\n }\n\n float xVal = getX(batch, xR, xC, d1);\n float wVal = getW(wR, wC, d1, q);\n dotProd += xVal * wVal;\n }\n }\n\n float result = dotProd;\n ${g}\n ${j}\n setOutput(result);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_packed_gpu_depthwise.js": -/*!***************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_packed_gpu_depthwise.js ***! - \***************************************************************************************/ -/*! exports provided: DepthwiseConvPacked2DProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"DepthwiseConvPacked2DProgram",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); + */function o(e){const{inputs:t,backend:n}=e,{x:o}=t,r=s.util.sizeFromShape(o.shape),i=n.data.get(o.dataId).values,a=Object(s.buffer)([r,r],o.dtype),u=a.values;for(let e=0;e=0 && xR < ${a}) {\n `;for(let t=0;t<(j+1)/2;t++){const n=2*t,o=n*m;if(g+=`\n xC = xCCorner + ${o};\n `,1===f){if(n= 0 && xCOffset < ${d} && xTexelC${n}Ready == 0) {\n xTexelC${n} = getX(batch, xR, xCOffset, d1);\n\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= ${d}) {\n xTexelC${n}.zw = vec2(0.0);\n }\n xTexelC${n}Ready = 1;\n }\n `,g+=1===m&&o>0?`\n xC${n} = vec4(xTexelC${n-2}.zw, xTexelC${n}.xy);\n `:`\n xCOffset = xC + 1 - 2;\n\n if (xCOffset >= 0 && xCOffset < ${d}) {\n previous = getX(batch, xR, xCOffset, d1);\n\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= ${d}) {\n previous.zw = vec2(0.0);\n }\n\n xC${n} = vec4(previous.zw, xTexelC${n}.xy);\n } else {\n xC${n} = vec4(0.0, 0.0, xTexelC${n}.xy);\n }\n `):g+=`\n if (xC >= 0 && xC < ${d} && xTexelC${n}Ready == 0) {\n xTexelC${n} = getX(batch, xR, xC, d1);\n if (xC + 1 >= ${d}) {\n xTexelC${n}.zw = vec2(0.0);\n }\n xTexelC${n}Ready = 1;\n }\n\n xC${n} = xTexelC${n};\n `,o+1= 0 && xCOffset < ${d} && xTexelC${n+1}Ready == 0) {\n xTexelC${n+1} = getX(batch, xR, xCOffset, d1);\n\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= ${d}) {\n xTexelC${n+1}.zw = vec2(0.0);\n }\n xTexelC${n+1}Ready = 1;\n }\n `,m>1&&(g+=`\n xCOffset -= 2;\n if (xCOffset >= 0 && xCOffset < ${d} && xTexelC${n}Ready == 0) {\n xTexelC${n} = getX(batch, xR, xCOffset, d1);\n xTexelC${n}Ready = 1;\n }\n `),g+=`\n xC${n+1} = vec4(xTexelC${n}.zw, xTexelC${n+1}.xy);\n `):g+=1===e?`\n xC${n+1} = xTexelC${n};\n `:`\n xCOffset = xC + ${e};\n\n if (xCOffset >= 0 && xCOffset < ${d} && xTexelC${n+1}Ready == 0) {\n xTexelC${n+1} = getX(batch, xR, xCOffset, d1);\n if (xCOffset + 1 >= ${d}) {\n xTexelC${n+1}.zw = vec2(0.0);\n }\n xTexelC${n+1}Ready = 1;\n }\n\n xC${n+1} = xTexelC${n+1};\n `}}else o= 0 && xCOffset < ${d} && xTexelC${n}Ready == 0) {\n xTexelC${n} = getX(batch, xR, xCOffset, d1);\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= ${d}) {\n xTexelC${n}.zw = vec2(0.0);\n }\n xTexelC${n}Ready = 1;\n }\n\n if(xC + 1 >= 0 && xC + 1 < ${d} && xTexelC${n+1}Ready == 0) {\n xTexelC${n+1} = getX(batch, xR, xC + 1, d1);\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xC + 2 >= ${d}) {\n xTexelC${n+1}.zw = vec2(0.0);\n }\n xTexelC${n+1}Ready = 1;\n }\n\n xC${n} = vec4(xTexelC${n}.zw, xTexelC${n+1}.zw);\n `,o+1= 0 && xCOffset < ${d}) {\n final = getX(batch, xR, xCOffset, d1);\n }\n xC${n+1} = vec4(xTexelC${n+1}.xy, final.xy);\n `)):(g+=`\n if(xC >= 0 && xC < ${d} && xTexelC${n}Ready == 0) {\n xTexelC${n} = getX(batch, xR, xC, d1);\n if (xC + 1 >= ${d}) {\n xTexelC${n}.zw = vec2(0.0);\n }\n xTexelC${n}Ready = 1;\n }\n\n xCOffset = xC + ${f};\n if(xCOffset >= 0 && xCOffset < ${d} && xTexelC${n+1}Ready == 0) {\n xTexelC${n+1} = getX(batch, xR, xCOffset, d1);\n if (xCOffset + 1 >= ${d}) {\n xTexelC${n+1}.zw = vec2(0.);\n }\n xTexelC${n+1}Ready = 1;\n }\n\n xC${n} = vec4(\n xTexelC${n}.xy, xTexelC${n+1}.xy);\n `,o+1{const{x:o,filter:r}=e,{strides:i,pad:a,dilations:u}=n,d=t,l=d.data.get(o.dataId).values,c=o.shape.length,f=d.data.get(r.dataId).values,p=r.shape.length,{batchSize:m,inHeight:h,inWidth:b,inChannels:j,outHeight:g,outWidth:w,padInfo:_,strideHeight:k,strideWidth:v,filterHeight:x,filterWidth:y,dilationHeight:O,dilationWidth:I,outShape:C}=s.backend_util.computeDilation2DInfo(o.shape,r.shape,i,a,"NHWC",u),S=s.util.sizeFromShape(C),T=C.length,N=s.util.getArrayFromDType(o.dtype,S);for(let e=0;e=0&&i=0&&md&&(d=b)}}}N[s.util.locToIndex([e,t,i,u],T,s.util.computeStrides(C))]=d}}}return{dataId:d.write(s.util.toTypedArray(N,o.dtype),C,o.dtype),shape:C,dtype:o.dtype}}}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Dilation2DBackpropFilter.js": +/*!********************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Dilation2DBackpropFilter.js ***! + \********************************************************************************************/ +/*! exports provided: dilation2dBackpropFilterConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"dilation2dBackpropFilterConfig",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license - * Copyright 2017 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -6703,19 +6695,14 @@ class s{constructor(e,t=!1,n=null,s=!1,o=!1){this.variableNames=["x","W"],this.o * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -class s{constructor(e,t,n,s,o){this.variableNames=["Image","Boxes","BoxInd"],this.outputShape=[];const[r,i,a,d]=e,[u]=t,[l,c]=n;this.outputShape=[u,l,c,d];const f="bilinear"===s?1:0,[p,m]=[i-1+".0",a-1+".0"],[h,b,j]=l>1?[""+(i-1)/(l-1),"(y2-y1) * height_ratio",`y1*${p} + float(y)*(height_scale)`]:["0.0","0.0",`0.5 * (y1+y2) * ${p}`],[g,w,_]=c>1?[""+(a-1)/(c-1),"(x2-x1) * width_ratio",`x1*${m} + float(x)*(width_scale)`]:["0.0","0.0",`0.5 * (x1+x2) * ${m}`];this.userCode=`\n const float height_ratio = float(${h});\n const float width_ratio = float(${g});\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int y = coords[1];\n int x = coords[2];\n int d = coords[3];\n\n // get box vals\n float y1 = getBoxes(b,0);\n float x1 = getBoxes(b,1);\n float y2 = getBoxes(b,2);\n float x2 = getBoxes(b,3);\n\n // get image in batch index\n int bInd = round(getBoxInd(b));\n if(bInd < 0 || bInd >= ${r}) {\n return;\n }\n\n float height_scale = ${b};\n float width_scale = ${w};\n\n float in_y = ${j};\n if( in_y < 0.0 || in_y > ${p} ) {\n setOutput(float(${o}));\n return;\n }\n float in_x = ${_};\n if( in_x < 0.0 || in_x > ${m} ) {\n setOutput(float(${o}));\n return;\n }\n\n vec2 sourceFracIndexCR = vec2(in_x,in_y);\n if(${f} == 1) {\n // Compute the four integer indices.\n ivec2 sourceFloorCR = ivec2(sourceFracIndexCR);\n ivec2 sourceCeilCR = ivec2(ceil(sourceFracIndexCR));\n\n float topLeft = getImage(b, sourceFloorCR.y, sourceFloorCR.x, d);\n float bottomLeft = getImage(b, sourceCeilCR.y, sourceFloorCR.x, d);\n float topRight = getImage(b, sourceFloorCR.y, sourceCeilCR.x, d);\n float bottomRight = getImage(b, sourceCeilCR.y, sourceCeilCR.x, d);\n\n vec2 fracCR = sourceFracIndexCR - vec2(sourceFloorCR);\n\n float top = topLeft + (topRight - topLeft) * fracCR.x;\n float bottom = bottomLeft + (bottomRight - bottomLeft) * fracCR.x;\n float newValue = top + (bottom - top) * fracCR.y;\n setOutput(newValue);\n } else {\n // Compute the coordinators of nearest neighbor point.\n ivec2 sourceNearestCR = ivec2(floor(\n sourceFracIndexCR + vec2(0.5,0.5)));\n float newValue = getImage(b, sourceNearestCR.y, sourceNearestCR.x, d);\n setOutput(newValue);\n }\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/cumsum_gpu.js": -/*!************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/cumsum_gpu.js ***! - \************************************************************************/ -/*! exports provided: CumSumProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"CumSumProgram",(function(){return o}));var s=n(/*! ./shader_compiler */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js");class o{constructor(e,t,n){this.variableNames=["x"],this.customUniforms=[{name:"index",type:"float"}],this.outputShape=e;const o=e.length,a=t?"0.0":`getX(${r(o,"coords")})`,d=e[e.length-1];let u="",l="";t?(u=n?"end != "+(d-1):"end != 0",l=n?"end + 1":"end - 1"):(u=n?`end + pow2 < ${d}`:"end >= pow2",l=n?"end + pow2":"end - pow2"),this.userCode=`\n void main() {\n ${Object(s.getCoordsDataType)(o)} coords = getOutputCoords();\n int end = ${i(o,"coords")};\n float val = ${a};\n int pow2 = int(pow(2.0, index));\n if (${u}) {\n int idx = ${l};\n ${i(o,"coords")} = idx;\n val += getX(${r(o,"coords")});\n }\n setOutput(val);\n }\n `}}function r(e,t){if(1===e)return`${t}`;if(2===e)return`${t}.x, ${t}.y`;if(3===e)return`${t}.x, ${t}.y, ${t}.z`;if(4===e)return`${t}.x, ${t}.y, ${t}.z, ${t}.w`;throw Error(`Cumulative sum for rank ${e} is not yet supported`)}function i(e,t){if(1===e)return`${t}`;if(2===e)return`${t}.y`;if(3===e)return`${t}.z`;if(4===e)return`${t}.w`;throw Error(`Cumulative sum for rank ${e} is not yet supported`)}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/decode_matrix_gpu.js": -/*!*******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/decode_matrix_gpu.js ***! - \*******************************************************************************/ -/*! exports provided: DecodeMatrixProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"DecodeMatrixProgram",(function(){return i}));var s=n(/*! ./glsl_version */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"),o=n(/*! ./shader_compiler_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js"),r=n(/*! ./tex_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/tex_util.js"); + */const o={kernelName:s.Dilation2DBackpropFilter,backendName:"cpu",kernelFunc:({inputs:e,backend:t,attrs:n})=>{const{x:o,filter:r,dy:i}=e,{strides:a,pad:u,dilations:d}=n,l=t,c=s.util.toNestedArray(o.shape,l.data.get(o.dataId).values),f=s.util.toNestedArray(r.shape,l.data.get(r.dataId).values),{batchSize:p,inHeight:m,inWidth:h,inChannels:b,outHeight:j,outWidth:g,padInfo:w,strideHeight:_,strideWidth:k,filterHeight:v,filterWidth:x,dilationHeight:y,dilationWidth:O,outShape:I}=s.backend_util.computeDilation2DInfo(o.shape,r.shape,a,u,"NHWC",d);s.util.assert(i.rank===I.length,(()=>`Error in ${s.Dilation2DBackpropFilter}, dy must have the same rank as output ${I.length}, but got ${i.rank}`));const C=s.util.toNestedArray(I,l.data.get(i.dataId).values),S=s.util.makeZerosNestedTypedArray(r.shape,r.dtype);for(let e=0;e=0&&s=0&&di&&(i=o,a=t,u=n)}}}S[a][u][r]+=C[e][t][s][r]}}}return{dataId:l.write(s.util.toTypedArray(S,o.dtype),r.shape,r.dtype),shape:r.shape,dtype:r.dtype}}}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Dilation2DBackpropInput.js": +/*!*******************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Dilation2DBackpropInput.js ***! + \*******************************************************************************************/ +/*! exports provided: dilation2dBackpropInputConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"dilation2dBackpropInputConfig",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -6728,15 +6715,14 @@ class s{constructor(e,t,n,s,o){this.variableNames=["Image","Boxes","BoxInd"],thi * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -class i{constructor(e){this.variableNames=["A"],this.packedInputs=!1,this.packedOutput=!0,this.outPackingScheme=r.PackingScheme.DENSE;const t=Object(r.getDenseTexShape)(e),n=Object(s.getGlslDifferences)();this.outputShape=e,this.userCode=`\n ivec3 outCoordsFromFlatIndex(int index) {\n ${o.getLogicalCoordinatesFromFlatIndex(["r","c","d"],e)}\n return ivec3(r, c, d);\n }\n\n void main() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(${t[0]}, ${t[1]}));\n int index = 4 * (resTexRC.x * ${t[1]} + resTexRC.y);\n\n vec4 result = vec4(0.);\n\n for (int i=0; i<4; i++) {\n int flatIndex = index + i;\n ivec3 rc = outCoordsFromFlatIndex(flatIndex);\n result[i] = getA(rc.x, rc.y, rc.z);\n }\n\n ${n.output} = result;\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/decode_matrix_packed_gpu.js": -/*!**************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/decode_matrix_packed_gpu.js ***! - \**************************************************************************************/ -/*! exports provided: DecodeMatrixPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"DecodeMatrixPackedProgram",(function(){return i}));var s=n(/*! ./glsl_version */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"),o=n(/*! ./shader_compiler_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js"),r=n(/*! ./tex_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/tex_util.js"); + */const o={kernelName:s.Dilation2DBackpropInput,backendName:"cpu",kernelFunc:({inputs:e,backend:t,attrs:n})=>{const{x:o,filter:r,dy:i}=e,{strides:a,pad:u,dilations:d}=n,l=t,c=s.util.toNestedArray(o.shape,l.data.get(o.dataId).values),f=s.util.toNestedArray(r.shape,l.data.get(r.dataId).values),{batchSize:p,inHeight:m,inWidth:h,inChannels:b,outHeight:j,outWidth:g,padInfo:w,strideHeight:_,strideWidth:k,filterHeight:v,filterWidth:x,dilationHeight:y,dilationWidth:O,outShape:I}=s.backend_util.computeDilation2DInfo(o.shape,r.shape,a,u,"NHWC",d);s.util.assert(i.rank===I.length,(()=>`Error in ${s.Dilation2DBackpropInput}, dy must have the same rank as output ${I.length}, but got ${i.rank}`));const C=s.util.toNestedArray(I,l.data.get(i.dataId).values),S=s.util.makeZerosNestedTypedArray(o.shape,o.dtype);for(let e=0;e=0&&s=0&&di&&(i=o,a=s,u=d)}}}S[e][a][u][r]+=C[e][t][s][r]}}}return{dataId:l.write(s.util.toTypedArray(S,o.dtype),o.shape,o.dtype),shape:o.shape,dtype:o.dtype}}}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Einsum.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Einsum.js ***! + \**************************************************************************/ +/*! exports provided: einsum, einsumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"einsum",(function(){return u})),n.d(t,"einsumConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Multiply */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Multiply.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"),i=n(/*! ./Sum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sum.js"),a=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2021 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -6750,35 +6736,35 @@ class i{constructor(e){this.variableNames=["A"],this.packedInputs=!1,this.packed * limitations under the License. * ============================================================================= */ -class i{constructor(e){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outPackingScheme=r.PackingScheme.DENSE;const t=Object(r.getDenseTexShape)(e),n=Object(s.getGlslDifferences)();this.outputShape=e,this.userCode=`\n ivec3 outCoordsFromFlatIndex(int index) {\n ${o.getLogicalCoordinatesFromFlatIndex(["r","c","d"],e)}\n return ivec3(r, c, d);\n }\n\n void main() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(${t[0]}, ${t[1]}));\n int index = 4 * (resTexRC.x * ${t[1]} + resTexRC.y);\n\n vec4 result = vec4(0.);\n\n for (int i=0; i<4; i++) {\n int flatIndex = index + i;\n ivec3 rc = outCoordsFromFlatIndex(flatIndex);\n result[i] = getChannel(getA(rc.x, rc.y, rc.z), vec2(rc.y, rc.z));\n }\n\n ${n.output} = result;\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/depth_to_space_gpu.js": -/*!********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/depth_to_space_gpu.js ***! - \********************************************************************************/ -/*! exports provided: DepthToSpaceProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"DepthToSpaceProgram",(function(){return s})); +function u(e){const{inputs:t,backend:n,attrs:u}=e,{equation:d}=u,l=t,{allDims:c,summedDims:f,idDims:p}=s.backend_util.decodeEinsumEquation(d,l.length);s.backend_util.checkEinsumDimSizes(c.length,p,l);const{path:m,steps:h}=s.backend_util.getEinsumComputePath(f,p),b=h.length;let j=null,g=c.length;const w=[];for(let e=0;e=0&&(j=Object(i.sum)({inputs:{x:j},backend:n,attrs:{axis:m[e]-(c.length-g),keepDims:!1}}),w.push(j)),g--)}for(const e of w)e!==j&&n.disposeIntermediateTensorInfo(e);return j}const d={kernelName:s.Einsum,backendName:"cpu",kernelFunc:u}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Elu.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Elu.js ***! + \***********************************************************************/ +/*! exports provided: elu, eluConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"elu",(function(){return r})),n.d(t,"eluConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); /** * @license - * Copyright 2018 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the "License"); + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, + * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -class s{constructor(e,t,n){this.variableNames=["x"],this.outputShape=[],this.outputShape=e,this.blockSize=t,this.dataFormat=n,this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int h = ${this.getHeightCoordString()};\n int w = ${this.getWidthCoordString()};\n int d = ${this.getDepthCoordString()};\n\n int in_h = h / ${t};\n int offset_h = imod(h, ${t});\n int in_w = w / ${t};\n int offset_w = imod(w, ${t});\n int offset_d = (offset_h * ${t} + offset_w) *\n ${this.getOutputDepthSize()};\n int in_d = d + offset_d;\n\n float result = ${this.getInputSamplingString()};\n setOutput(result);\n }\n `}getHeightCoordString(){return"NHWC"===this.dataFormat?"coords[1]":"coords[2]"}getWidthCoordString(){return"NHWC"===this.dataFormat?"coords[2]":"coords[3]"}getDepthCoordString(){return"NHWC"===this.dataFormat?"coords[3]":"coords[1]"}getOutputDepthSize(){return"NHWC"===this.dataFormat?this.outputShape[3]:this.outputShape[1]}getInputSamplingString(){return"NHWC"===this.dataFormat?"getX(b, in_h, in_w, in_d)":"getX(b, in_d, in_h, in_w)"}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/diag_gpu.js": -/*!**********************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/diag_gpu.js ***! - \**********************************************************************/ -/*! exports provided: DiagProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"DiagProgram",(function(){return s})); +const r=Object(o.unaryKernelFunc)(s.Elu,(e=>e>=0?e:Math.exp(e)-1)),i={kernelName:s.Elu,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/EluGrad.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/EluGrad.js ***! + \***************************************************************************/ +/*! exports provided: eluGrad, eluGradConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"eluGrad",(function(){return r})),n.d(t,"eluGradConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -6792,14 +6778,14 @@ class s{constructor(e,t,n){this.variableNames=["x"],this.outputShape=[],this.out * limitations under the License. * ============================================================================= */ -class s{constructor(e){this.variableNames=["X"],this.outputShape=[e,e],this.userCode="\n void main() {\n ivec2 coords = getOutputCoords();\n float val = coords[0] == coords[1] ? getX(coords[0]) : 0.0;\n setOutput(val);\n }\n "}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/dilation_gpu.js": -/*!**************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/dilation_gpu.js ***! - \**************************************************************************/ -/*! exports provided: Dilation2DProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"Dilation2DProgram",(function(){return s})); +function r(e){const{inputs:t,backend:n}=e,{dy:r,y:i}=t;Object(o.assertNotComplex)([r,i],"eluGrad");const a=new Float32Array(s.util.sizeFromShape(i.shape)),u=n.data.get(i.dataId).values,d=n.data.get(r.dataId).values;for(let e=0;e=1?d[e]:d[e]*(t+1)}return n.makeTensorInfo(i.shape,"float32",a)}const i={kernelName:s.EluGrad,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Equal.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Equal.js ***! + \*************************************************************************/ +/*! exports provided: equalImpl, equal, equalConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"equalImpl",(function(){return i})),n.d(t,"equal",(function(){return a})),n.d(t,"equalConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); /** * @license - * Copyright 2017 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -6813,56 +6799,56 @@ class s{constructor(e){this.variableNames=["X"],this.outputShape=[e,e],this.user * limitations under the License. * ============================================================================= */ -class s{constructor(e){this.variableNames=["x","W"],this.outputShape=e.outShape;const{inHeight:t,inWidth:n,padInfo:s,strideHeight:o,strideWidth:r,filterHeight:i,filterWidth:a,dilationHeight:d,dilationWidth:u}=e,{top:l,left:c}=s;this.userCode=`\n const ivec2 strides = ivec2(${o}, ${r});\n const ivec2 pads = ivec2(${l}, ${c});\n const float neg_infinity = -3.4e38;\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords.x;\n int d1 = coords.w;\n ivec2 outTopLeftCorner =\n coords.yz * strides - pads;\n int hBeg = outTopLeftCorner.x;\n int wBeg = outTopLeftCorner.y;\n\n float curVal = neg_infinity;\n for (int h = 0; h < ${i}; h++) {\n int hIn = hBeg + h * ${d};\n\n if (hIn >= 0 && hIn < ${t}) {\n for (int w = 0; w < ${a}; w++) {\n int wIn = wBeg + w * ${u};\n\n if (wIn >= 0 && wIn < ${n}) {\n float xVal = getX(batch, hIn, wIn, d1);\n float wVal = getW(h, w, d1);\n\n float val = xVal + wVal;\n if (val > curVal) {\n curVal = val;\n }\n }\n }\n }\n }\n\n float result = curVal;\n setOutput(result);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_float_gpu.js": -/*!******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_float_gpu.js ***! - \******************************************************************************/ -/*! exports provided: EncodeFloatProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"EncodeFloatProgram",(function(){return i}));var s=n(/*! ./glsl_version */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"),o=n(/*! ./shader_compiler_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js"),r=n(/*! ./tex_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/tex_util.js"); +const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>e===t?1:0)),a=Object(r.binaryKernelFunc)(s.Equal,i,null,"bool"),u={kernelName:s.Equal,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Erf.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Erf.js ***! + \***********************************************************************/ +/*! exports provided: erf, erfConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"erf",(function(){return c})),n.d(t,"erfConfig",(function(){return f}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); /** * @license - * Copyright 2018 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the "License"); + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, + * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -class i{constructor(e){this.variableNames=["A"],this.outTexUsage=r.TextureUsage.DOWNLOAD;const t=Object(s.getGlslDifferences)();this.outputShape=e,this.userCode=`\n ${o.ENCODE_FLOAT_SNIPPET}\n\n void main() {\n float x = getAAtOutCoords();\n ${t.output} = encode_float(x);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_float_packed_gpu.js": -/*!*************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_float_packed_gpu.js ***! - \*************************************************************************************/ -/*! exports provided: EncodeFloatPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"EncodeFloatPackedProgram",(function(){return i}));var s=n(/*! ./glsl_version */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"),o=n(/*! ./shader_compiler_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js"),r=n(/*! ./tex_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/tex_util.js"); +const r=s.backend_util.ERF_P,i=s.backend_util.ERF_A1,a=s.backend_util.ERF_A2,u=s.backend_util.ERF_A3,d=s.backend_util.ERF_A4,l=s.backend_util.ERF_A5,c=Object(o.unaryKernelFunc)(s.Erf,(e=>{const t=Math.sign(e),n=Math.abs(e),s=1/(1+r*n);return t*(1-((((l*s+d)*s+u)*s+a)*s+i)*s*Math.exp(-n*n))})),f={kernelName:s.Erf,backendName:"cpu",kernelFunc:c}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Exp.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Exp.js ***! + \***********************************************************************/ +/*! exports provided: expImpl, exp, expConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"expImpl",(function(){return i})),n.d(t,"exp",(function(){return a})),n.d(t,"expConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_impl.js"),r=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); /** * @license - * Copyright 2018 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the "License"); + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, + * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -class i{constructor(e){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!1,this.outTexUsage=r.TextureUsage.DOWNLOAD;const t=Object(s.getGlslDifferences)();this.outputShape=e,this.userCode=`\n ${o.ENCODE_FLOAT_SNIPPET}\n\n void main() {\n ivec3 coords = getOutputCoords();\n float x = getChannel(getAAtOutCoords(), vec2(coords.y, coords.z));\n ${t.output} = encode_float(x);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_matrix_gpu.js": -/*!*******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_matrix_gpu.js ***! - \*******************************************************************************/ -/*! exports provided: EncodeMatrixProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"EncodeMatrixProgram",(function(){return r}));var s=n(/*! ./glsl_version */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"),o=n(/*! ./shader_compiler_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js"); +const i=Object(o.createSimpleUnaryImpl)((e=>Math.exp(e))),a=Object(r.unaryKernelFuncFromImpl)(s.Exp,i),u={kernelName:s.Exp,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ExpandDims.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ExpandDims.js ***! + \******************************************************************************/ +/*! exports provided: expandDims, expandDimsConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"expandDims",(function(){return r})),n.d(t,"expandDimsConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"); /** * @license - * Copyright 2018 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -6876,35 +6862,35 @@ class i{constructor(e){this.variableNames=["A"],this.packedInputs=!0,this.packed * limitations under the License. * ============================================================================= */ -class r{constructor(e,t,n=!1){this.variableNames=["A"];const r=Object(s.getGlslDifferences)(),[i,a]=t;this.outputShape=e;let d="result";n&&(d="floor(result * 255. + 0.5)"),this.userCode=`\n ${o.getFlatIndexFrom3D(e)}\n\n void main() {\n ivec3 coords = getOutputCoords();\n\n int flatIndex = getFlatIndex(coords);\n int offset = imod(flatIndex, 4);\n\n flatIndex = idiv(flatIndex, 4, 1.);\n\n int r = flatIndex / ${a};\n int c = imod(flatIndex, ${a});\n vec2 uv = (vec2(c, r) + halfCR) / vec2(${a}.0, ${i}.0);\n vec4 values = ${r.texture2D}(A, uv);\n\n float result;\n\n if(offset == 0) {\n result = values[0];\n } else if(offset == 1) {\n result = values[1];\n } else if(offset == 2) {\n result = values[2];\n } else {\n result = values[3];\n }\n\n ${r.output} = vec4(${d}, 0., 0., 0.);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_matrix_packed_gpu.js": -/*!**************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_matrix_packed_gpu.js ***! - \**************************************************************************************/ -/*! exports provided: EncodeMatrixPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"EncodeMatrixPackedProgram",(function(){return r}));var s=n(/*! ./glsl_version */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"),o=n(/*! ./shader_compiler_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js"); +function r(e){const{inputs:t,backend:n,attrs:r}=e,{input:i}=t,{dim:a}=r,u=i.shape.length,d=i.shape.slice();let l=a;return a<0&&(s.util.assert(-(u+1)<=a,(()=>`Axis must be in the interval [${-(u+1)}, ${u}]`)),l=u+a+1),d.splice(l,0,1),Object(o.reshape)({inputs:{x:i},backend:n,attrs:{shape:d}})}const i={kernelName:s.ExpandDims,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Expm1.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Expm1.js ***! + \*************************************************************************/ +/*! exports provided: expm1Impl, expm1, expm1Config */function(e,t,n){"use strict";n.r(t),n.d(t,"expm1Impl",(function(){return i})),n.d(t,"expm1",(function(){return a})),n.d(t,"expm1Config",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_impl.js"),r=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); /** * @license - * Copyright 2018 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the "License"); + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, + * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -class r{constructor(e,t,n=!1){this.variableNames=["A"],this.packedInputs=!1,this.packedOutput=!0;const r=Object(s.getGlslDifferences)(),[i,a]=t;this.outputShape=e;let d="",u="result";n&&(u="floor(result * 255. + 0.5)");for(let t=0;t<=1;t++)for(let n=0;n<=1;n++){const s=2*t+n;d+=`\n localCoords = coords;\n if(localCoords[2] + ${n} < ${e[2]}) {\n localCoords[2] += ${n};\n if(localCoords[1] + ${t} < ${e[1]}) {\n localCoords[1] += ${t};\n\n flatIndex = getFlatIndex(localCoords);\n offset = imod(flatIndex, 4);\n\n flatIndex = idiv(flatIndex, 4, 1.);\n\n r = flatIndex / ${a};\n c = imod(flatIndex, ${a});\n uv = (vec2(c, r) + halfCR) / vec2(${a}.0, ${i}.0);\n values = ${r.texture2D}(A, uv);\n\n if(offset == 0) {\n result[${s}] = values[0];\n } else if(offset == 1) {\n result[${s}] = values[1];\n } else if(offset == 2) {\n result[${s}] = values[2];\n } else {\n result[${s}] = values[3];\n }\n }\n }\n `}this.userCode=`\n ${o.getFlatIndexFrom3D(e)}\n\n void main() {\n ivec3 coords = getOutputCoords();\n\n vec4 result = vec4(0.);\n int flatIndex, r, c, offset;\n ivec3 localCoords;\n vec2 uv;\n vec4 values;\n\n ${d}\n\n ${r.output} = ${u};\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/fft_gpu.js": -/*!*********************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/fft_gpu.js ***! - \*********************************************************************/ -/*! exports provided: FFTProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"FFTProgram",(function(){return s})); +const i=Object(o.createSimpleUnaryImpl)((e=>Math.expm1(e))),a=Object(r.unaryKernelFuncFromImpl)(s.Expm1,i),u={kernelName:s.Expm1,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FFT.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FFT.js ***! + \***********************************************************************/ +/*! exports provided: fft, fftConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fft",(function(){return i})),n.d(t,"fftConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/fft_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/fft_utils.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"); /** * @license - * Copyright 2018 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -6918,14 +6904,14 @@ class r{constructor(e,t,n=!1){this.variableNames=["A"],this.packedInputs=!1,this * limitations under the License. * ============================================================================= */ -class s{constructor(e,t,n){this.variableNames=["real","imag"];const s=t[1];this.outputShape=t;const o=n?`2.0 * ${Math.PI}`:`-2.0 * ${Math.PI}`,r=n?`${s}.0`:"1.0";let i;if("real"===e)i="return real * expR - imag * expI;";else{if("imag"!==e)throw new Error(`FFT component must be either "real" or "imag", got ${e}.`);i="return real * expI + imag * expR;"}this.userCode=`\n const float exponentMultiplier = ${o};\n\n float unaryOpComplex(float real, float expR, float imag, float expI) {\n ${i}\n }\n\n float mulMatDFT(int batch, int index) {\n float indexRatio = float(index) / float(${s});\n float exponentMultiplierTimesIndexRatio =\n exponentMultiplier * indexRatio;\n\n float result = 0.0;\n\n for (int i = 0; i < ${s}; i++) {\n // x = (-2|2 * PI / N) * index * i;\n float x = exponentMultiplierTimesIndexRatio * float(i);\n float expR = cos(x);\n float expI = sin(x);\n float real = getReal(batch, i);\n float imag = getImag(batch, i);\n\n result +=\n unaryOpComplex(real, expR, imag, expI) / ${r};\n }\n\n return result;\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n setOutput(mulMatDFT(coords[0], coords[1]));\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/fill_gpu.js": -/*!**********************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/fill_gpu.js ***! - \**********************************************************************/ -/*! exports provided: FillProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"FillProgram",(function(){return s})); +function i(e){const{inputs:t,backend:n}=e,{input:i}=t,a=s.util.sizeFromShape(i.shape),u=i.shape[i.shape.length-1],d=a/u,l=Object(r.reshape)({inputs:{x:i},backend:n,attrs:{shape:[d,u]}}),c=Object(o.fftBatch)(l,!1,n),f=Object(r.reshape)({inputs:{x:c},backend:n,attrs:{shape:i.shape}});return n.disposeIntermediateTensorInfo(l),n.disposeIntermediateTensorInfo(c),f}const a={kernelName:s.FFT,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Fill.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Fill.js ***! + \************************************************************************/ +/*! exports provided: fill, fillConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fill",(function(){return o})),n.d(t,"fillConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -6938,15 +6924,14 @@ class s{constructor(e,t,n){this.variableNames=["real","imag"];const s=t[1];this. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -class s{constructor(e,t){this.outputShape=[],this.customUniforms=[{name:"value",type:"float"}],this.variableNames=["x"],this.outputShape=e,this.userCode="\n void main() {\n // Input can be obtained from uniform value.\n setOutput(value);\n }\n "}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/flags_webgl.js": -/*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/flags_webgl.js ***! - \*************************************************************************/ -/*! no exports provided */function(e,t,n){"use strict";n.r(t);var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./webgl_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"); + */function o(e){const{backend:t,attrs:n}=e,{shape:o,value:r,dtype:i}=n,a=i||s.util.inferDtype(r),u=s.util.getArrayFromDType(a,s.util.sizeFromShape(o));return function(e,t,n){e.fill(t)}(u,r),t.makeTensorInfo(o,a,u)}const r={kernelName:s.Fill,backendName:"cpu",kernelFunc:o}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FlipLeftRight.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FlipLeftRight.js ***! + \*********************************************************************************/ +/*! exports provided: flipLeftRightConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"flipLeftRightConfig",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -6959,36 +6944,35 @@ class s{constructor(e,t){this.outputShape=[],this.customUniforms=[{name:"value", * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -const r=Object(s.env)();r.registerFlag("HAS_WEBGL",(()=>r.getNumber("WEBGL_VERSION")>0)),r.registerFlag("WEBGL_VERSION",(()=>Object(o.isWebGLVersionEnabled)(2)?2:Object(o.isWebGLVersionEnabled)(1)?1:0)),r.registerFlag("WEBGL_CHECK_NUMERICAL_PROBLEMS",(()=>!1)),r.registerFlag("WEBGL_BUFFER_SUPPORTED",(()=>2===r.get("WEBGL_VERSION"))),r.registerFlag("WEBGL_CPU_FORWARD",(()=>!0)),r.registerFlag("WEBGL_FORCE_F16_TEXTURES",(()=>!1)),r.registerFlag("WEBGL_PACK",(()=>r.getBool("HAS_WEBGL"))),r.registerFlag("WEBGL_PACK_NORMALIZATION",(()=>r.getBool("WEBGL_PACK"))),r.registerFlag("WEBGL_PACK_CLIP",(()=>r.getBool("WEBGL_PACK"))),r.registerFlag("WEBGL_PACK_DEPTHWISECONV",(()=>r.getBool("WEBGL_PACK"))),r.registerFlag("WEBGL_PACK_BINARY_OPERATIONS",(()=>r.getBool("WEBGL_PACK"))),r.registerFlag("WEBGL_PACK_UNARY_OPERATIONS",(()=>r.getBool("WEBGL_PACK"))),r.registerFlag("WEBGL_PACK_ARRAY_OPERATIONS",(()=>r.getBool("WEBGL_PACK"))),r.registerFlag("WEBGL_PACK_IMAGE_OPERATIONS",(()=>r.getBool("WEBGL_PACK"))),r.registerFlag("WEBGL_PACK_REDUCE",(()=>r.getBool("WEBGL_PACK"))),r.registerFlag("WEBGL_LAZILY_UNPACK",(()=>r.getBool("WEBGL_PACK"))),r.registerFlag("WEBGL_CONV_IM2COL",(()=>r.getBool("WEBGL_PACK"))),r.registerFlag("WEBGL_MAX_TEXTURE_SIZE",(()=>Object(o.getWebGLMaxTextureSize)(r.getNumber("WEBGL_VERSION")))),r.registerFlag("WEBGL_MAX_TEXTURES_IN_SHADER",(()=>Object(o.getMaxTexturesInShader)(r.getNumber("WEBGL_VERSION")))),r.registerFlag("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION",(()=>{const e=r.getNumber("WEBGL_VERSION");return 0===e?0:Object(o.getWebGLDisjointQueryTimerVersion)(e)})),r.registerFlag("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE",(()=>r.getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")>0&&!s.device_util.isMobile())),r.registerFlag("WEBGL_RENDER_FLOAT32_CAPABLE",(()=>Object(o.isCapableOfRenderingToFloatTexture)(r.getNumber("WEBGL_VERSION")))),r.registerFlag("WEBGL_RENDER_FLOAT32_ENABLED",(()=>!r.getBool("WEBGL_FORCE_F16_TEXTURES")&&r.getBool("WEBGL_RENDER_FLOAT32_CAPABLE"))),r.registerFlag("WEBGL_DOWNLOAD_FLOAT_ENABLED",(()=>Object(o.isDownloadFloatTextureEnabled)(r.getNumber("WEBGL_VERSION")))),r.registerFlag("WEBGL_FENCE_API_ENABLED",(()=>Object(o.isWebGLFenceEnabled)(r.getNumber("WEBGL_VERSION")))),r.registerFlag("WEBGL_SIZE_UPLOAD_UNIFORM",(()=>r.getBool("WEBGL_RENDER_FLOAT32_ENABLED")?4:0)),r.registerFlag("WEBGL_DELETE_TEXTURE_THRESHOLD",(()=>-1),(e=>{if(e<0&&-1!==e)throw new Error(`WEBGL_DELETE_TEXTURE_THRESHOLD must be -1 (indicating never delete) or at least 0, but got ${e}.`)})),r.registerFlag("WEBGL_FLUSH_THRESHOLD",(()=>s.device_util.isMobile()&&r.getBool("IS_CHROME")?1:-1),(e=>{if(e<0&&-1!==e)throw new Error(`WEBGL_FLUSH_THRESHOLD must be -1 (indicating never manual flush) or at least 0, but got ${e}.`)})),r.registerFlag("CPU_HANDOFF_SIZE_THRESHOLD",(()=>128)),r.registerFlag("WEBGL_USE_SHAPES_UNIFORMS",(()=>!1)),r.registerFlag("TOPK_LAST_DIM_CPU_HANDOFF_SIZE_THRESHOLD",(()=>1e5)),r.registerFlag("TOPK_K_CPU_HANDOFF_THRESHOLD",(()=>128))},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/flip_left_right_gpu.js": -/*!*********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/flip_left_right_gpu.js ***! - \*********************************************************************************/ -/*! exports provided: FlipLeftRightProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"FlipLeftRightProgram",(function(){return s})); + */const o={kernelName:s.FlipLeftRight,backendName:"cpu",kernelFunc:({inputs:e,attrs:t,backend:n})=>{const{image:o}=e,r=n,i=s.util.getTypedArrayFromDType(o.dtype,s.util.sizeFromShape(o.shape)),[a,u,d,l]=o.shape,c=r.data.get(o.dataId).values;for(let e=0;e=0&&r= 0 && coordX < ${t}) {\n outputValue = getImage(coords[0], coords[1], coordX, coords[3]);\n } else {\n outputValue = getImage(coords[0], coords[1], coords[2], coords[3]);\n }\n setOutput(outputValue);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/gather_gpu.js": -/*!************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/gather_gpu.js ***! - \************************************************************************/ -/*! exports provided: GatherProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"GatherProgram",(function(){return o}));var s=n(/*! ./shader_compiler */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +const i=Object(o.createSimpleUnaryImpl)((e=>Math.floor(e))),a=Object(r.unaryKernelFuncFromImpl)(s.Floor,i),u={kernelName:s.Floor,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FloorDiv.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FloorDiv.js ***! + \****************************************************************************/ +/*! exports provided: floorDivImpl, floorDiv, floorDivConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"floorDivImpl",(function(){return i})),n.d(t,"floorDiv",(function(){return a})),n.d(t,"floorDivConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); /** * @license - * Copyright 2017 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -7001,18 +6985,15 @@ class s{constructor(e){this.variableNames=["Image"],this.outputShape=[];const t= * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */class o{constructor(e,t){this.variableNames=["A","indices"],this.outputShape=t,this.rank=t.length;const n=Object(s.getCoordsDataType)(this.rank),o=function(e,t){const n=["resRC.x","resRC.y","resRC.z","resRC.w"],s=[];for(let t=0;t1?"strides[j]":"strides";this.userCode=`\n ${o} strides = ${o}(${this.strides});\n void main() {\n ${r} coords = getOutputCoords();\n int flattenIndex = 0;\n for (int j = 0; j < ${this.sliceDim}; j++) {\n int index = round(getIndices(coords[0], j));\n flattenIndex += index * ${i};\n }\n setOutput(getX(flattenIndex, coords[1]));\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js": -/*!**************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js ***! - \**************************************************************************/ -/*! exports provided: getGlslDifferences */function(e,t,n){"use strict";n.r(t),n.d(t,"getGlslDifferences",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); + */ +const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>Math.floor(e/t))),a=Object(r.binaryKernelFunc)(s.FloorDiv,i,null,"int32"),u={kernelName:s.FloorDiv,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FusedConv2D.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FusedConv2D.js ***! + \*******************************************************************************/ +/*! exports provided: fusedConv2D, fusedConv2DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fusedConv2D",(function(){return a})),n.d(t,"fusedConv2DConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/fused_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/fused_utils.js"),r=n(/*! ./Add */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Add.js"),i=n(/*! ./Conv2D */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv2D.js"); /** * @license - * Copyright 2018 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -7025,14 +7006,15 @@ class s{constructor(e){this.variableNames=["Image"],this.outputShape=[];const t= * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */function o(){let e,t,n,o,r,i,a,d,u,l;return 2===Object(s.env)().getNumber("WEBGL_VERSION")?(e="#version 300 es",t="in",n="out",o="in",r="texture",i="outputColor",a="out vec4 outputColor;",d="\n bool isnan_custom(float val) {\n return (val > 0.0 || val < 0.0) ? false : val != 0.0;\n }\n\n bvec4 isnan_custom(vec4 val) {\n return bvec4(isnan_custom(val.x),\n isnan_custom(val.y), isnan_custom(val.z), isnan_custom(val.w));\n }\n\n #define isnan(value) isnan_custom(value)\n ",u="",l="\n #define round(value) newRound(value)\n int newRound(float value) {\n return int(floor(value + 0.5));\n }\n\n ivec4 newRound(vec4 value) {\n return ivec4(floor(value + vec4(0.5)));\n }\n "):(e="",t="attribute",n="varying",o="varying",r="texture2D",i="gl_FragColor",a="",d="\n #define isnan(value) isnan_custom(value)\n bool isnan_custom(float val) {\n return (val > 0. || val < 1. || val == 0.) ? false : true;\n }\n bvec4 isnan_custom(vec4 val) {\n return bvec4(isnan(val.x), isnan(val.y), isnan(val.z), isnan(val.w));\n }\n ",u="\n uniform float INFINITY;\n\n bool isinf(float val) {\n return abs(val) == INFINITY;\n }\n bvec4 isinf(vec4 val) {\n return equal(abs(val), vec4(INFINITY));\n }\n ",l="\n int round(float value) {\n return int(floor(value + 0.5));\n }\n\n ivec4 round(vec4 value) {\n return ivec4(floor(value + vec4(0.5)));\n }\n "),{version:e,attribute:t,varyingVs:n,varyingFs:o,texture2D:r,output:i,defineOutput:a,defineSpecialNaN:d,defineSpecialInf:u,defineRound:l}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/gpgpu_context.js": -/*!***************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/gpgpu_context.js ***! - \***************************************************************************/ -/*! exports provided: GPGPUContext, linearSearchLastTrue */function(e,t,n){"use strict";n.r(t),n.d(t,"GPGPUContext",(function(){return d})),n.d(t,"linearSearchLastTrue",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./canvas_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/canvas_util.js"),r=n(/*! ./gpgpu_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/gpgpu_util.js"),i=n(/*! ./tex_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/tex_util.js"),a=n(/*! ./webgl_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"); + */ +function a(e){const{inputs:t,backend:n,attrs:s}=e,{x:a,filter:u,bias:d,preluActivationWeights:l}=t,{strides:c,pad:f,dataFormat:p,dilations:m,dimRoundingMode:h,activation:b,leakyreluAlpha:j}=s;let g=Object(i.conv2D)({inputs:{x:a,filter:u},backend:n,attrs:{strides:c,pad:f,dataFormat:p,dilations:m,dimRoundingMode:h}});if(d){const e=g;g=Object(r.add)({inputs:{a:g,b:d},backend:n}),n.disposeIntermediateTensorInfo(e)}if(b){const e=g;g=Object(o.applyActivation)(n,g,b,l,j),n.disposeIntermediateTensorInfo(e)}return g}const u={kernelName:s.FusedConv2D,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FusedDepthwiseConv2D.js": +/*!****************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FusedDepthwiseConv2D.js ***! + \****************************************************************************************/ +/*! exports provided: fusedDepthwiseConv2D, fusedDepthwiseConv2DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fusedDepthwiseConv2D",(function(){return a})),n.d(t,"fusedDepthwiseConv2DConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/fused_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/fused_utils.js"),r=n(/*! ./Add */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Add.js"),i=n(/*! ./DepthwiseConv2dNative */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DepthwiseConv2dNative.js"); /** * @license - * Copyright 2017 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -7046,14 +7028,14 @@ class s{constructor(e){this.variableNames=["Image"],this.outputShape=[];const t= * limitations under the License. * ============================================================================= */ -class d{constructor(e){this.outputTexture=null,this.program=null,this.disposed=!1,this.vertexAttrsAreBound=!1,this.itemsToPoll=[];const t=Object(s.env)().getNumber("WEBGL_VERSION");null!=e?(this.gl=e,Object(o.setWebGLContext)(t,e)):this.gl=Object(o.getWebGLContext)(t);let n="WEBGL_color_buffer_float";const d="EXT_color_buffer_half_float";if(1===Object(s.env)().getNumber("WEBGL_VERSION")){const e="OES_texture_float",t="OES_texture_half_float";if(this.textureFloatExtension=a.getExtensionOrThrow(this.gl,e),a.hasExtension(this.gl,t))this.textureHalfFloatExtension=a.getExtensionOrThrow(this.gl,t);else if(Object(s.env)().get("WEBGL_FORCE_F16_TEXTURES"))throw new Error("GL context does not support half float textures, yet the environment flag WEBGL_FORCE_F16_TEXTURES is set to true.");if(this.colorBufferFloatExtension=this.gl.getExtension(n),a.hasExtension(this.gl,d))this.colorBufferHalfFloatExtension=a.getExtensionOrThrow(this.gl,d);else if(Object(s.env)().get("WEBGL_FORCE_F16_TEXTURES"))throw new Error("GL context does not support color renderable half floats, yet the environment flag WEBGL_FORCE_F16_TEXTURES is set to true.")}else if(n="EXT_color_buffer_float",a.hasExtension(this.gl,n))this.colorBufferFloatExtension=this.gl.getExtension(n);else{if(!a.hasExtension(this.gl,d))throw new Error("GL context does not support color renderable floats");this.colorBufferHalfFloatExtension=this.gl.getExtension(d)}this.vertexBuffer=r.createVertexBuffer(this.gl),this.indexBuffer=r.createIndexBuffer(this.gl),this.framebuffer=a.createFramebuffer(this.gl),this.textureConfig=i.getTextureConfig(this.gl,this.textureHalfFloatExtension)}get debug(){return Object(s.env)().getBool("DEBUG")}dispose(){if(this.disposed)return;null!=this.program&&console.warn("Disposing a GPGPUContext that still has a bound WebGLProgram. This is probably a resource leak, delete the program with GPGPUContext.deleteProgram before disposing."),null!=this.outputTexture&&console.warn("Disposing a GPGPUContext that still has a bound output matrix texture. This is probably a resource leak, delete the output matrix texture with GPGPUContext.deleteMatrixTexture before disposing.");const e=this.gl;a.callAndCheck(e,(()=>e.finish())),a.callAndCheck(e,(()=>e.bindFramebuffer(e.FRAMEBUFFER,null))),a.callAndCheck(e,(()=>e.deleteFramebuffer(this.framebuffer))),a.callAndCheck(e,(()=>e.bindBuffer(e.ARRAY_BUFFER,null))),a.callAndCheck(e,(()=>e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,null))),a.callAndCheck(e,(()=>e.deleteBuffer(this.indexBuffer))),this.disposed=!0}createFloat32MatrixTexture(e,t){return this.throwIfDisposed(),r.createFloat32MatrixTexture(this.gl,e,t,this.textureConfig)}createFloat16MatrixTexture(e,t){return this.throwIfDisposed(),r.createFloat16MatrixTexture(this.gl,e,t,this.textureConfig)}createUnsignedBytesMatrixTexture(e,t){return this.throwIfDisposed(),r.createUnsignedBytesMatrixTexture(this.gl,e,t,this.textureConfig)}uploadPixelDataToTexture(e,t){this.throwIfDisposed(),r.uploadPixelDataToTexture(this.gl,e,t)}uploadDenseMatrixToTexture(e,t,n,s){this.throwIfDisposed(),r.uploadDenseMatrixToTexture(this.gl,e,t,n,s,this.textureConfig)}createFloat16PackedMatrixTexture(e,t){return this.throwIfDisposed(),r.createFloat16PackedMatrixTexture(this.gl,e,t,this.textureConfig)}createPackedMatrixTexture(e,t){return this.throwIfDisposed(),r.createPackedMatrixTexture(this.gl,e,t,this.textureConfig)}deleteMatrixTexture(e){this.throwIfDisposed(),this.outputTexture===e&&(a.unbindColorTextureFromFramebuffer(this.gl,this.framebuffer),this.outputTexture=null),a.callAndCheck(this.gl,(()=>this.gl.deleteTexture(e)))}downloadByteEncodedFloatMatrixFromOutputTexture(e,t,n){return this.downloadMatrixDriver(e,(()=>r.downloadByteEncodedFloatMatrixFromOutputTexture(this.gl,t,n,this.textureConfig)))}downloadPackedMatrixFromBuffer(e,t,n,s,o,i){return r.downloadPackedMatrixFromBuffer(this.gl,e,t,n,s,o,i,this.textureConfig)}downloadFloat32MatrixFromBuffer(e,t){return r.downloadFloat32MatrixFromBuffer(this.gl,e,t)}createBufferFromTexture(e,t,n){this.bindTextureToFrameBuffer(e);const s=r.createBufferFromOutputTexture(this.gl,t,n,this.textureConfig);return this.unbindTextureToFrameBuffer(),s}createAndWaitForFence(){const e=this.createFence(this.gl);return this.pollFence(e)}createFence(e){let t,n;if(Object(s.env)().getBool("WEBGL_FENCE_API_ENABLED")){const s=e,o=s.fenceSync(s.SYNC_GPU_COMMANDS_COMPLETE,0);e.flush(),n=()=>{const e=s.clientWaitSync(o,0,0);return e===s.ALREADY_SIGNALED||e===s.CONDITION_SATISFIED},t=o}else Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")>0?(t=this.beginQuery(),this.endQuery(),n=()=>this.isQueryAvailable(t,Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION"))):n=()=>!0;return{query:t,isFencePassed:n}}downloadMatrixFromPackedTexture(e,t,n){return this.downloadMatrixDriver(e,(()=>r.downloadMatrixFromPackedOutputTexture(this.gl,t,n)))}createProgram(e){this.throwIfDisposed();const t=this.gl,n=a.createFragmentShader(t,e);null==this.vertexShader&&(this.vertexShader=r.createVertexShader(t));const s=a.createProgram(t);return a.callAndCheck(t,(()=>t.attachShader(s,this.vertexShader))),a.callAndCheck(t,(()=>t.attachShader(s,n))),a.linkProgram(t,s),this.debug&&a.validateProgram(t,s),this.vertexAttrsAreBound||(this.setProgram(s),this.vertexAttrsAreBound=r.bindVertexProgramAttributeStreams(t,this.program,this.vertexBuffer)),s}deleteProgram(e){this.throwIfDisposed(),e===this.program&&(this.program=null),null!=e&&a.callAndCheck(this.gl,(()=>this.gl.deleteProgram(e)))}setProgram(e){this.throwIfDisposed(),this.program=e,null!=this.program&&this.debug&&a.validateProgram(this.gl,this.program),a.callAndCheck(this.gl,(()=>this.gl.useProgram(e)))}getUniformLocation(e,t,n=!0){return this.throwIfDisposed(),n?a.getProgramUniformLocationOrThrow(this.gl,e,t):a.getProgramUniformLocation(this.gl,e,t)}getAttributeLocation(e,t){return this.throwIfDisposed(),a.callAndCheck(this.gl,(()=>this.gl.getAttribLocation(e,t)))}getUniformLocationNoThrow(e,t){return this.throwIfDisposed(),this.gl.getUniformLocation(e,t)}setInputMatrixTexture(e,t,n){this.throwIfDisposed(),this.throwIfNoProgram(),a.bindTextureToProgramUniformSampler(this.gl,e,t,n)}setOutputMatrixTexture(e,t,n){this.setOutputMatrixTextureDriver(e,n,t)}setOutputPackedMatrixTexture(e,t,n){this.throwIfDisposed();const[s,o]=i.getPackedMatrixTextureShapeWidthHeight(t,n);this.setOutputMatrixTextureDriver(e,s,o)}setOutputMatrixWriteRegion(e,t,n,s){this.setOutputMatrixWriteRegionDriver(n,e,s,t)}setOutputPackedMatrixWriteRegion(e,t,n,s){throw new Error("setOutputPackedMatrixWriteRegion not implemented.")}debugValidate(){null!=this.program&&a.validateProgram(this.gl,this.program),a.validateFramebuffer(this.gl)}executeProgram(){this.throwIfDisposed(),this.throwIfNoProgram();const e=this.gl;this.debug&&this.debugValidate(),a.callAndCheck(e,(()=>e.drawElements(e.TRIANGLES,6,e.UNSIGNED_SHORT,0)))}blockUntilAllProgramsCompleted(){this.throwIfDisposed(),a.callAndCheck(this.gl,(()=>this.gl.finish()))}getQueryTimerExtension(){return null==this.disjointQueryTimerExtension&&(this.disjointQueryTimerExtension=a.getExtensionOrThrow(this.gl,2===Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")?"EXT_disjoint_timer_query_webgl2":"EXT_disjoint_timer_query")),this.disjointQueryTimerExtension}getQueryTimerExtensionWebGL2(){return this.getQueryTimerExtension()}getQueryTimerExtensionWebGL1(){return this.getQueryTimerExtension()}beginQuery(){if(2===Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")){const e=this.gl,t=this.getQueryTimerExtensionWebGL2(),n=e.createQuery();return e.beginQuery(t.TIME_ELAPSED_EXT,n),n}const e=this.getQueryTimerExtensionWebGL1(),t=e.createQueryEXT();return e.beginQueryEXT(e.TIME_ELAPSED_EXT,t),t}endQuery(){if(2===Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")){const e=this.gl,t=this.getQueryTimerExtensionWebGL2();return void e.endQuery(t.TIME_ELAPSED_EXT)}const e=this.getQueryTimerExtensionWebGL1();e.endQueryEXT(e.TIME_ELAPSED_EXT)}async waitForQueryAndGetTime(e){return await s.util.repeatedTry((()=>this.disposed||this.isQueryAvailable(e,Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")))),this.getQueryTime(e,Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION"))}getQueryTime(e,t){if(0===t)return null;if(2===t){const t=this.gl;return t.getQueryParameter(e,t.QUERY_RESULT)/1e6}{const t=this.getQueryTimerExtensionWebGL1();return t.getQueryObjectEXT(e,t.QUERY_RESULT_EXT)/1e6}}isQueryAvailable(e,t){if(0===t)return!0;if(2===t){const t=this.gl,n=this.getQueryTimerExtensionWebGL2(),s=t.getQueryParameter(e,t.QUERY_RESULT_AVAILABLE);return null==this.disjoint&&(this.disjoint=this.gl.getParameter(n.GPU_DISJOINT_EXT)),s&&!this.disjoint}{const t=this.getQueryTimerExtensionWebGL1(),n=t.getQueryObjectEXT(e,t.QUERY_RESULT_AVAILABLE_EXT);return null==this.disjoint&&(this.disjoint=this.gl.getParameter(t.GPU_DISJOINT_EXT)),n&&!this.disjoint}}pollFence(e){return new Promise((t=>{this.addItemToPoll((()=>e.isFencePassed()),(()=>t()))}))}pollItems(){const e=u(this.itemsToPoll.map((e=>e.isDoneFn)));for(let t=0;t<=e;++t){const{resolveFn:e}=this.itemsToPoll[t];e()}this.itemsToPoll=this.itemsToPoll.slice(e+1)}addItemToPoll(e,t){this.itemsToPoll.push({isDoneFn:e,resolveFn:t}),this.itemsToPoll.length>1||s.util.repeatedTry((()=>(this.pollItems(),0===this.itemsToPoll.length)))}bindTextureToFrameBuffer(e){this.throwIfDisposed(),a.bindColorTextureToFramebuffer(this.gl,e,this.framebuffer),this.debug&&a.validateFramebuffer(this.gl)}unbindTextureToFrameBuffer(){null!=this.outputTexture?(a.bindColorTextureToFramebuffer(this.gl,this.outputTexture,this.framebuffer),this.debug&&a.validateFramebuffer(this.gl)):a.unbindColorTextureFromFramebuffer(this.gl,this.framebuffer)}downloadMatrixDriver(e,t){this.bindTextureToFrameBuffer(e);const n=t();return this.unbindTextureToFrameBuffer(),n}setOutputMatrixTextureDriver(e,t,n){this.throwIfDisposed();const s=this.gl;a.bindColorTextureToFramebuffer(s,e,this.framebuffer),this.debug&&a.validateFramebuffer(s),this.outputTexture=e,a.callAndCheck(s,(()=>s.viewport(0,0,t,n))),a.callAndCheck(s,(()=>s.scissor(0,0,t,n)))}setOutputMatrixWriteRegionDriver(e,t,n,s){this.throwIfDisposed(),a.callAndCheck(this.gl,(()=>this.gl.scissor(e,t,n,s)))}throwIfDisposed(){if(this.disposed)throw new Error("Attempted to use disposed GPGPUContext.")}throwIfNoProgram(){if(null==this.program)throw new Error("No GPU program is currently set.")}}function u(e){let t=0;for(;t{const s={logicalShape:e.shape,texShape:e.isUniform?null:e.texData.texShape,isUniform:e.isUniform,isPacked:!e.isUniform&&e.texData.isPacked,flatOffset:null};return null!=e.texData&&null!=e.texData.slice&&e.texData.slice.flatOffset>0&&(s.flatOffset=e.texData.slice.flatOffset),{name:t.variableNames[n],shapeInfo:s}})),a=i.map((e=>e.shapeInfo)),d={logicalShape:r.shape,texShape:r.texData.texShape,isUniform:!1,isPacked:r.texData.isPacked,flatOffset:null},u=o.makeShader(i,d,t),l=e.createProgram(u);let c=null;const f=e.getUniformLocation(l,"NAN",!1);1===Object(s.env)().getNumber("WEBGL_VERSION")&&(c=e.getUniformLocation(l,"INFINITY",!1));const p=!1,m={},h={},b={};for(let n=0;n{_[n]=e.getUniformLocation(l,t.name,p)})),{program:t,source:u,webGLProgram:l,uniformLocations:m,customUniformLocations:_,inShapeInfos:a,outShapeInfo:d,infLoc:c,nanLoc:f,inShapesLocations:h,inTexShapesLocations:b,outShapeLocation:j,outShapeStridesLocation:w,outTexShapeLocation:g}}function i(e,t){if(e.length!==t.length)throw Error(`Binary was compiled with ${e.length} inputs, but was executed with ${t.length} inputs`);e.forEach(((e,n)=>{const o=e.logicalShape,r=t[n],i=r.shape;if(!s.util.arraysEqual(o,i))throw Error(`Binary was compiled with different shapes than the current args. Shapes ${o} and ${i} must match`);if(e.isUniform&&r.isUniform)return;const a=e.texShape,d=r.isUniform?null:r.texData.texShape;if(!s.util.arraysEqual(a,d))throw Error(`Binary was compiled with different texture shapes than the current args. Shape ${a} and ${d} must match`)}))}function a(e,t,n,r,a){t.program.enableShapeUniforms||(i(t.inShapeInfos,n),i([t.outShapeInfo],[r]));const d=r.texData.texture,u=r.texData.texShape;r.texData.isPacked?e.setOutputPackedMatrixTexture(d,u[0],u[1]):e.setOutputMatrixTexture(d,u[0],u[1]),e.setProgram(t.webGLProgram),1===Object(s.env)().getNumber("WEBGL_VERSION")&&null!==t.infLoc&&e.gl.uniform1f(t.infLoc,1/0),null!==t.nanLoc&&e.gl.uniform1f(t.nanLoc,NaN),n.forEach(((n,r)=>{const i=t.program.variableNames[r],a=t.uniformLocations[i],d=t.uniformLocations[`offset${i}`],u=t.inShapesLocations[`${i}Shape`],l=t.inTexShapesLocations[`${i}TexShape`];if(u){const{uniformShape:s}=o.getUniformInfoFromShape(t.program.packedInputs,n.shape,n.texData.texShape);switch(s.length){case 1:e.gl.uniform1iv(u,new Int32Array(s));break;case 2:e.gl.uniform2iv(u,new Int32Array(s));break;case 3:e.gl.uniform3iv(u,new Int32Array(s));break;case 4:e.gl.uniform4iv(u,new Int32Array(s))}}if(l&&e.gl.uniform2i(l,n.texData.texShape[0],n.texData.texShape[1]),null!=a)if(n.isUniform)if(s.util.sizeFromShape(n.shape)<2)e.gl.uniform1f(a,n.uniformValues[0]);else{let t=n.uniformValues;t instanceof Float32Array||(t=new Float32Array(t)),e.gl.uniform1fv(a,t)}else null!=n.texData.slice&&null!=d&&e.gl.uniform1i(d,n.texData.slice.flatOffset),e.setInputMatrixTexture(n.texData.texture,a,r)}));const l=t.outShapeLocation;if(l)switch(r.shape.length){case 1:e.gl.uniform1iv(l,new Int32Array(r.shape));break;case 2:e.gl.uniform2iv(l,new Int32Array(r.shape));break;case 3:e.gl.uniform3iv(l,new Int32Array(r.shape));break;case 4:e.gl.uniform4iv(l,new Int32Array(r.shape))}if(t.outShapeStridesLocation){const n=s.util.computeStrides(r.shape);switch(r.shape.length){case 2:e.gl.uniform1iv(t.outShapeStridesLocation,new Int32Array(n));break;case 3:e.gl.uniform2iv(t.outShapeStridesLocation,new Int32Array(n));break;case 4:e.gl.uniform3iv(t.outShapeStridesLocation,new Int32Array(n))}}t.outTexShapeLocation&&e.gl.uniform2i(t.outTexShapeLocation,r.texData.texShape[0],r.texData.texShape[1]),t.program.customUniforms&&a&&t.program.customUniforms.forEach(((n,s)=>{const o=t.customUniformLocations[s],r=a[s];if("float"===n.type)e.gl.uniform1fv(o,r);else if("vec2"===n.type)e.gl.uniform2fv(o,r);else if("vec3"===n.type)e.gl.uniform3fv(o,r);else if("vec4"===n.type)e.gl.uniform4fv(o,r);else if("int"===n.type)e.gl.uniform1iv(o,r);else if("ivec2"===n.type)e.gl.uniform2iv(o,r);else if("ivec3"===n.type)e.gl.uniform3iv(o,r);else{if("ivec4"!==n.type)throw Error(`uniform type ${n.type} is not supported yet.`);e.gl.uniform4iv(o,r)}})),e.executeProgram()}function d(e,t,n){let r="";t.concat(n).forEach((t=>{const i=null!=t.texData&&null!=t.texData.slice&&t.texData.slice.flatOffset>0;if(e.enableShapeUniforms&&!t.isUniform){const a=t.texData.texShape,{useSqueezeShape:d,uniformShape:u}=o.getUniformInfoFromShape(e.packedInputs,t.shape,a);let l="",c="",f="";if(1===u.length&&e.packedInputs){const e=[Math.ceil(a[0]/2),Math.ceil(a[1]/2)];l=`${e[0]>1}_${e[1]>1}`}else if(2!==u.length||e.packedInputs){if(u.length>2&&!e.packedInputs){const e=s.util.computeStrides(u);f=`${e[0]===a[1]}_${e[e.length-1]===a[1]}`}}else c=`${u[0]>1}_${u[1]>1}`;const p=t.shape.length,m=2===p&&s.util.arraysEqual(t.shape,a),h=1===s.util.sizeFromShape(t.shape),b=s.backend_util.getBroadcastDims(t.shape,n.shape),j=!e.packedInputs&&p===n.shape.length&&s.util.arraysEqual(a,n.texData.texShape),g=e.packedInputs||p>2?"":`${a[0]>1}_${a[1]>1}`;r+=`${p}_${j}_${d}_${u.length}_${h}_${b}_${m}_${l}_${c}_${f}_${g}_${i}`}else{const e=t.isUniform?"uniform":t.texData.texShape;r+=`${t.shape}_${e}_${i}`}}));const i=e.userCode;let a=e.constructor.name;return a+="_"+r+"_"+i+`${Object(s.env)().getNumber("WEBGL_VERSION")}`,a}function u(e){return Object(s.env)().getBool("WEBGL_USE_SHAPES_UNIFORMS")&&e<=4}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/gpgpu_util.js": -/*!************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/gpgpu_util.js ***! - \************************************************************************/ -/*! exports provided: createVertexShader, createVertexBuffer, createIndexBuffer, getInternalFormatForFloat32MatrixTexture, createFloat32MatrixTexture, getInternalFormatForFloat16MatrixTexture, createFloat16MatrixTexture, getInternalFormatForUnsignedBytesMatrixTexture, createUnsignedBytesMatrixTexture, getInternalFormatForPackedMatrixTexture, createPackedMatrixTexture, getInternalFormatForFloat16PackedMatrixTexture, createFloat16PackedMatrixTexture, bindVertexProgramAttributeStreams, uploadDenseMatrixToTexture, uploadPixelDataToTexture, createBufferFromOutputTexture, downloadFloat32MatrixFromBuffer, downloadByteEncodedFloatMatrixFromOutputTexture, downloadPackedMatrixFromBuffer, downloadMatrixFromPackedOutputTexture */function(e,t,n){"use strict";n.r(t),n.d(t,"createVertexShader",(function(){return i})),n.d(t,"createVertexBuffer",(function(){return a})),n.d(t,"createIndexBuffer",(function(){return d})),n.d(t,"getInternalFormatForFloat32MatrixTexture",(function(){return l})),n.d(t,"createFloat32MatrixTexture",(function(){return c})),n.d(t,"getInternalFormatForFloat16MatrixTexture",(function(){return f})),n.d(t,"createFloat16MatrixTexture",(function(){return p})),n.d(t,"getInternalFormatForUnsignedBytesMatrixTexture",(function(){return m})),n.d(t,"createUnsignedBytesMatrixTexture",(function(){return h})),n.d(t,"getInternalFormatForPackedMatrixTexture",(function(){return b})),n.d(t,"createPackedMatrixTexture",(function(){return j})),n.d(t,"getInternalFormatForFloat16PackedMatrixTexture",(function(){return g})),n.d(t,"createFloat16PackedMatrixTexture",(function(){return w})),n.d(t,"bindVertexProgramAttributeStreams",(function(){return _})),n.d(t,"uploadDenseMatrixToTexture",(function(){return k})),n.d(t,"uploadPixelDataToTexture",(function(){return v})),n.d(t,"createBufferFromOutputTexture",(function(){return x})),n.d(t,"downloadFloat32MatrixFromBuffer",(function(){return y})),n.d(t,"downloadByteEncodedFloatMatrixFromOutputTexture",(function(){return O})),n.d(t,"downloadPackedMatrixFromBuffer",(function(){return I})),n.d(t,"downloadMatrixFromPackedOutputTexture",(function(){return C}));var s=n(/*! ./glsl_version */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"),o=n(/*! ./tex_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/tex_util.js"),r=n(/*! ./webgl_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"); +function r(e){const{inputs:t,backend:n}=e,{params:r,indices:i}=t,a=s.util.sizeFromShape(r.shape),u=i.shape,d=u[u.length-1],[l,c,f,p]=s.backend_util.prepareAndValidate(r,i);if(0===c)return n.makeTensorInfo(l,r.dtype,[]);const m=n.data.get(i.dataId).values,h=n.bufferSync(r),b=Object(o.gatherNdImpl)(m,h,r.dtype,c,d,f,p,r.shape,a);return n.makeTensorInfo(l,r.dtype,b.values)}const i={kernelName:s.GatherNd,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GatherNd_Impl.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GatherNd_Impl.js ***! + \*********************************************************************************/ +/*! exports provided: gatherNdImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"gatherNdImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license - * Copyright 2017 Google LLC. All Rights Reserved. + * Copyright 2021 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -7087,15 +7069,14 @@ function r(e,t,n,r){const i=n.map(((e,n)=>{const s={logicalShape:e.shape,texShap * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -function i(e){const t=Object(s.getGlslDifferences)(),n=`${t.version}\n precision highp float;\n ${t.attribute} vec3 clipSpacePos;\n ${t.attribute} vec2 uv;\n ${t.varyingVs} vec2 resultUV;\n\n void main() {\n gl_Position = vec4(clipSpacePos, 1);\n resultUV = uv;\n }`;return r.createVertexShader(e,n)}function a(e){const t=new Float32Array([-1,1,0,0,1,-1,-1,0,0,0,1,1,0,1,1,1,-1,0,1,0]);return r.createStaticVertexBuffer(e,t)}function d(e){const t=new Uint16Array([0,1,2,2,1,3]);return r.createStaticIndexBuffer(e,t)}function u(e,t,n,s,o,i){r.validateTextureSize(t,n);const a=r.createTexture(e),d=e.TEXTURE_2D;return r.callAndCheck(e,(()=>e.bindTexture(d,a))),r.callAndCheck(e,(()=>e.texParameteri(d,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE))),r.callAndCheck(e,(()=>e.texParameteri(d,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE))),r.callAndCheck(e,(()=>e.texParameteri(d,e.TEXTURE_MIN_FILTER,e.NEAREST))),r.callAndCheck(e,(()=>e.texParameteri(d,e.TEXTURE_MAG_FILTER,e.NEAREST))),r.callAndCheck(e,(()=>e.texImage2D(d,0,s,t,n,0,o,i,null))),r.callAndCheck(e,(()=>e.bindTexture(e.TEXTURE_2D,null))),a}function l(e){return e.internalFormatFloat}function c(e,t,n,s){const[r,i]=o.getUnpackedMatrixTextureShapeWidthHeight(t,n);return u(e,r,i,l(s),s.textureFormatFloat,e.FLOAT)}function f(e){return e.internalFormatHalfFloat}function p(e,t,n,s){const[r,i]=o.getUnpackedMatrixTextureShapeWidthHeight(t,n);return u(e,r,i,f(s),s.textureFormatFloat,s.textureTypeHalfFloat)}function m(e){return e.downloadTextureFormat}function h(e,t,n,s){const[r,i]=o.getUnpackedMatrixTextureShapeWidthHeight(t,n);return u(e,r,i,m(s),e.RGBA,e.UNSIGNED_BYTE)}function b(e){return e.internalFormatPackedFloat}function j(e,t,n,s){const[r,i]=o.getPackedMatrixTextureShapeWidthHeight(t,n);return u(e,r,i,b(s),e.RGBA,e.FLOAT)}function g(e){return e.internalFormatPackedHalfFloat}function w(e,t,n,s){const[r,i]=o.getPackedMatrixTextureShapeWidthHeight(t,n);return u(e,r,i,g(s),e.RGBA,s.textureTypeHalfFloat)}function _(e,t,n){r.callAndCheck(e,(()=>e.bindBuffer(e.ARRAY_BUFFER,n)));return r.bindVertexBufferToProgramAttribute(e,t,"clipSpacePos",n,3,20,0)&&r.bindVertexBufferToProgramAttribute(e,t,"uv",n,2,20,12)}function k(e,t,n,s,o,i){let a,d,u;r.callAndCheck(e,(()=>e.bindTexture(e.TEXTURE_2D,t))),o instanceof Uint8Array?(a=new Uint8Array(n*s*4),d=e.UNSIGNED_BYTE,u=e.RGBA):(a=new Float32Array(n*s*4),d=e.FLOAT,u=i.internalFormatPackedFloat),a.set(o),r.callAndCheck(e,(()=>e.texImage2D(e.TEXTURE_2D,0,u,n,s,0,e.RGBA,d,a))),r.callAndCheck(e,(()=>e.bindTexture(e.TEXTURE_2D,null)))}function v(e,t,n){r.callAndCheck(e,(()=>e.bindTexture(e.TEXTURE_2D,t))),n.data instanceof Uint8Array?r.callAndCheck(e,(()=>e.texImage2D(e.TEXTURE_2D,0,e.RGBA,n.width,n.height,0,e.RGBA,e.UNSIGNED_BYTE,n.data))):r.callAndCheck(e,(()=>e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,n))),r.callAndCheck(e,(()=>e.bindTexture(e.TEXTURE_2D,null)))}function x(e,t,n,s){const o=e.createBuffer();r.callAndCheck(e,(()=>e.bindBuffer(e.PIXEL_PACK_BUFFER,o)));const i=16*t*n;return r.callAndCheck(e,(()=>e.bufferData(e.PIXEL_PACK_BUFFER,i,e.STREAM_READ))),r.callAndCheck(e,(()=>e.readPixels(0,0,n,t,e.RGBA,e.FLOAT,0))),r.callAndCheck(e,(()=>e.bindBuffer(e.PIXEL_PACK_BUFFER,null))),o}function y(e,t,n){const s=e,o=new Float32Array(n);return s.bindBuffer(s.PIXEL_PACK_BUFFER,t),s.getBufferSubData(s.PIXEL_PACK_BUFFER,0,o),s.bindBuffer(s.PIXEL_PACK_BUFFER,null),o}function O(e,t,n,s){const[i,a]=o.getUnpackedMatrixTextureShapeWidthHeight(t,n),d=new Uint8Array(o.getUnpackedArraySizeFromMatrixSize(t*n,4));return r.callAndCheck(e,(()=>e.readPixels(0,0,i,a,s.downloadTextureFormat,e.UNSIGNED_BYTE,d))),new Float32Array(d.buffer)}function I(e,t,n,s,r,i,a,d){const u=e,l=new Float32Array(o.getPackedRGBAArraySizeFromMatrixShape(i,a));return u.bindBuffer(u.PIXEL_PACK_BUFFER,t),u.getBufferSubData(u.PIXEL_PACK_BUFFER,0,l),u.bindBuffer(u.PIXEL_PACK_BUFFER,null),l}function C(e,t,n){const s=new Float32Array(t*n*4);return r.callAndCheck(e,(()=>e.readPixels(0,0,n,t,e.RGBA,e.FLOAT,s))),s}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/im2col_packed_gpu.js": -/*!*******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/im2col_packed_gpu.js ***! - \*******************************************************************************/ -/*! exports provided: Im2ColPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"Im2ColPackedProgram",(function(){return o}));var s=n(/*! ./glsl_version */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"); + */function o(e,t,n,o,r,i,a,u,d){const l=Object(s.buffer)([o,i],n);for(let n=0;n=d/i)throw new Error(`Invalid indices: ${s} does not index into ${u}`);for(let e=0;e= 0) {\n\n offsetX = int(mod(float(blockIndex), ${u}.) * ${i}. - ${p}.);\n d1 = offsetX + ${l} * (int(mod(float(pos), ${h}.) / ${r}.));\n\n if(d1 < ${t[w]} && d1 >= 0) {\n\n ch = int(mod(float(pos), ${r}.));\n\n if (${j}) {\n innerDims = vec2(d1, ch);\n result[${2*n+s}] = getChannel(\n getA(d0, int(innerDims.x),\n int(innerDims.y)), innerDims);\n } else {\n innerDims = vec2(d0, d1);\n result[${2*n+s}] = getChannel(\n getA(ch, int(innerDims.x),\n int(innerDims.y)), innerDims);\n }\n }\n }\n }\n `;this.userCode=`\n void main() {\n ivec2 rc = getOutputCoords();\n\n vec4 result = vec4(0);\n\n int blockIndex, pos, offsetY, d0, offsetX, d1, ch;\n vec2 innerDims;\n\n ${_}\n\n ${b.output} = result;\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/index.js": -/*!*******************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/index.js ***! - \*******************************************************************/ -/*! exports provided: version_webgl, MathBackendWebGL, setWebGLContext, GPGPUContext, gpgpu_util, webgl_util, forceHalfFloat, webgl */function(e,t,n){"use strict";n.r(t);var s=n(/*! ./base */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/base.js");n.d(t,"version_webgl",(function(){return s.version_webgl})),n.d(t,"MathBackendWebGL",(function(){return s.MathBackendWebGL})),n.d(t,"setWebGLContext",(function(){return s.setWebGLContext})),n.d(t,"GPGPUContext",(function(){return s.GPGPUContext})),n.d(t,"gpgpu_util",(function(){return s.gpgpu_util})),n.d(t,"webgl_util",(function(){return s.webgl_util})),n.d(t,"forceHalfFloat",(function(){return s.forceHalfFloat})),n.d(t,"webgl",(function(){return s.webgl}));n(/*! ./register_all_kernels */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/register_all_kernels.js"); + */ +function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:u,indices:d}=t,{axis:l,batchDims:c}=a;Object(o.assertNotComplex)([u,d],"gatherV2");let f=c;null==c&&(f=0);const p=s.util.sizeFromShape(d.shape),m=s.util.parseAxisParam(l,u.shape)[0],h=s.backend_util.segment_util.collectGatherOpShapeInfo(u,d,m,f),b=Object(i.reshape)({inputs:{x:u},backend:n,attrs:{shape:[h.batchSize,h.outerSize,h.dimSize,h.sliceSize]}}),j=Object(i.reshape)({inputs:{x:d},backend:n,attrs:{shape:[h.batchSize,p/h.batchSize]}}),g=[h.batchSize,h.outerSize,p/h.batchSize,h.sliceSize],w=n.bufferSync(j),_=n.bufferSync(b),k=Object(r.gatherV2Impl)(_,w,g);return n.disposeIntermediateTensorInfo(b),n.disposeIntermediateTensorInfo(j),n.makeTensorInfo(h.outputShape,k.dtype,k.values)}const u={kernelName:s.GatherV2,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GatherV2_impl.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GatherV2_impl.js ***! + \*********************************************************************************/ +/*! exports provided: gatherV2Impl */function(e,t,n){"use strict";n.r(t),n.d(t,"gatherV2Impl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -7128,11 +7110,11 @@ function i(e){const t=Object(s.getGlslDifferences)(),n=`${t.version}\n precis * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/arg_min_max.js": -/*!**************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/arg_min_max.js ***! - \**************************************************************************************/ -/*! exports provided: argMinMaxReduce */function(e,t,n){"use strict";n.r(t),n.d(t,"argMinMaxReduce",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../argminmax_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/argminmax_gpu.js"),r=n(/*! ../argminmax_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/argminmax_packed_gpu.js"),i=n(/*! ../kernels/Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); + */function o(e,t,n){const o=Object(s.buffer)(n,e.dtype);for(let n=0;ne.disposeIntermediateTensorInfo(t))),p}return d(e,t,o)}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/int.js": -/*!******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/int.js ***! - \******************************************************************************/ -/*! exports provided: int */function(e,t,n){"use strict";n.r(t),n.d(t,"int",(function(){return o}));var s=n(/*! ../unaryop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js"); +const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>e>t?1:0)),a=Object(r.binaryKernelFunc)(s.Greater,i,null,"bool"),u={kernelName:s.Greater,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GreaterEqual.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GreaterEqual.js ***! + \********************************************************************************/ +/*! exports provided: greaterEqualImpl, greaterEqual, greaterEqualConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"greaterEqualImpl",(function(){return i})),n.d(t,"greaterEqual",(function(){return a})),n.d(t,"greaterEqualConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -7169,11 +7151,12 @@ function a(e,t,n,r=null){let i=t.shape[0],d=t.shape[1];null!=r&&(i=r.shape[0],d= * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */function o(e,t){const n=new s.UnaryOpProgram(e.shape,"return float(int(x));"),o=t.runWebGLProgram(n,[e],"int32");return{dataId:o.dataId,shape:o.shape,dtype:o.dtype}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js": -/*!*********************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js ***! - \*********************************************************************************************/ -/*! exports provided: CHECK_NAN_SNIPPET_UNARY, CHECK_NAN_SNIPPET_BINARY, CHECK_NAN_SNIPPET_BINARY_PACKED, unaryKernelFunc, binaryKernelFunc, mapActivationToShaderProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"CHECK_NAN_SNIPPET_UNARY",(function(){return c})),n.d(t,"CHECK_NAN_SNIPPET_BINARY",(function(){return f})),n.d(t,"CHECK_NAN_SNIPPET_BINARY_PACKED",(function(){return p})),n.d(t,"unaryKernelFunc",(function(){return m})),n.d(t,"binaryKernelFunc",(function(){return h})),n.d(t,"mapActivationToShaderProgram",(function(){return b}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../binaryop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_gpu.js"),r=n(/*! ../binaryop_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_packed_gpu.js"),i=n(/*! ../kernels/Complex */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js"),a=n(/*! ../kernels/LeakyRelu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LeakyRelu.js"),d=n(/*! ../kernels/Prelu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Prelu.js"),u=n(/*! ../unaryop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js"),l=n(/*! ../unaryop_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_packed_gpu.js"); + */ +const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>e>=t?1:0)),a=Object(r.binaryKernelFunc)(s.GreaterEqual,i,null,"bool"),u={kernelName:s.GreaterEqual,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IFFT.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IFFT.js ***! + \************************************************************************/ +/*! exports provided: ifft, ifftConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"ifft",(function(){return i})),n.d(t,"ifftConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/fft_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/fft_utils.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -7190,11 +7173,11 @@ function a(e,t,n,r=null){let i=t.shape[0],d=t.shape[1];null!=r&&(i=r.shape[0],d= * limitations under the License. * ============================================================================= */ -const c="if (isnan(x)) return x;",f="\n if (isnan(a)) return a;\n if (isnan(b)) return b;\n",p="\n result.r = isNaN.r > 0. ? NAN : result.r;\n result.g = isNaN.g > 0. ? NAN : result.g;\n result.b = isNaN.b > 0. ? NAN : result.b;\n result.a = isNaN.a > 0. ? NAN : result.a;\n";function m({opSnippet:e,packedOpSnippet:t,cpuKernelImpl:n,dtype:o}){return({inputs:r,backend:i})=>{const{x:a}=r,d=i,c=o||a.dtype;if(d.shouldExecuteOnCPU([a])&&null!=n){const e=d.texData.get(a.dataId),t=n(e.values,c);return d.makeTensorInfo(a.shape,c,t)}let f;return f=Object(s.env)().getBool("WEBGL_PACK_UNARY_OPERATIONS")&&null!=t?new l.UnaryOpPackedProgram(a.shape,t):new u.UnaryOpProgram(a.shape,e),d.runWebGLProgram(f,[a],c)}}function h({opSnippet:e,packedOpSnippet:t,checkOutOfBounds:n=!1,supportsComplex:a=!1,cpuKernelImpl:d,dtype:u}){return({inputs:l,backend:c})=>{const{a:f,b:p}=l,m=c;if(a&&"complex64"===f.dtype){const t=m.texData.get(f.dataId),n=m.texData.get(p.dataId),[r,a]=[[t.complexTensorInfos.real,n.complexTensorInfos.real],[t.complexTensorInfos.imag,n.complexTensorInfos.imag]].map((t=>{const[n,r]=t,i={dataId:n.dataId,dtype:n.dtype,shape:f.shape},a={dataId:r.dataId,dtype:r.dtype,shape:p.shape},d=new o.BinaryOpProgram(e,f.shape,p.shape);return m.runWebGLProgram(d,[i,a],Object(s.upcastType)(n.dtype,r.dtype))})),d=Object(i.complex)({inputs:{real:r,imag:a},backend:m});return m.disposeIntermediateTensorInfo(r),m.disposeIntermediateTensorInfo(a),d}const h=u||Object(s.upcastType)(f.dtype,p.dtype);if(("string"===f.dtype||"string"===p.dtype||m.shouldExecuteOnCPU([f,p]))&&null!=d){const e=m.texData.get(f.dataId).values,t=m.texData.get(p.dataId).values,n="string"===f.dtype?s.backend_util.fromUint8ToStringArray(e):e,o="string"===f.dtype?s.backend_util.fromUint8ToStringArray(t):t,[r,i]=d(f.shape,p.shape,n,o,h),a=m.makeTensorInfo(i,h);return m.texData.get(a.dataId).values=r,a}let b;return b=Object(s.env)().getBool("WEBGL_PACK_BINARY_OPERATIONS")&&null!=t?new r.BinaryOpPackedProgram(t,f.shape,p.shape,n):new o.BinaryOpProgram(e,f.shape,p.shape),m.runWebGLProgram(b,[f,p],h)}}function b(e,t=!1){if("linear"===e)return t?l.LINEAR:u.LINEAR;if("relu"===e)return t?l.RELU:u.RELU;if("elu"===e)return t?l.ELU:u.ELU;if("relu6"===e)return t?l.RELU6:u.RELU6;if("prelu"===e)return t?d.PRELU_PACKED:d.PRELU;if("leakyrelu"===e)return t?a.LEAKYRELU_PACKED:a.LEAKYRELU;if("sigmoid"===e)return t?l.SIGMOID:u.SIGMOID;throw new Error(`Activation ${e} has not been implemented for the WebGL backend.`)}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/reduce.js": -/*!*********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/reduce.js ***! - \*********************************************************************************/ -/*! exports provided: reduce */function(e,t,n){"use strict";n.r(t),n.d(t,"reduce",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../mean_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/mean_gpu.js"),r=n(/*! ../reduce_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/reduce_gpu.js");function i(e,t,n,i){const a= +function i(e){const{inputs:t,backend:n}=e,{input:i}=t,a=s.util.sizeFromShape(i.shape),u=i.shape[i.shape.length-1],d=a/u,l=Object(r.reshape)({inputs:{x:i},backend:n,attrs:{shape:[d,u]}}),c=Object(o.fftBatch)(l,!0,n),f=Object(r.reshape)({inputs:{x:c},backend:n,attrs:{shape:i.shape}});return n.disposeIntermediateTensorInfo(l),n.disposeIntermediateTensorInfo(c),f}const a={kernelName:s.IFFT,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Identity.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Identity.js ***! + \****************************************************************************/ +/*! exports provided: identity, identityConfig */function(e,t,n){"use strict"; /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -7211,11 +7194,11 @@ const c="if (isnan(x)) return x;",f="\n if (isnan(a)) return a;\n if (isnan(b) * limitations under the License. * ============================================================================= */ -function(e){const t=[];for(;0===t.length||1!==t[t.length-1].outSize;){const n=t.length?t[t.length-1].outSize:e[1],o=s.backend_util.computeOptimalWindowSize(n);t.push({inSize:n,windowSize:o,outSize:Math.ceil(n/o)})}return t}(e.shape);let d=e;for(let s=0;sNumber.isFinite(e)?1:0),"bool"),i={kernelName:s.IsFinite,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsInf.js": /*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Abs.js ***! + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsInf.js ***! \*************************************************************************/ -/*! exports provided: abs, absConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"abs",(function(){return d})),n.d(t,"absConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"),r=n(/*! ../unaryop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js"),i=n(/*! ../unaryop_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_packed_gpu.js"); +/*! exports provided: isInf, isInfConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"isInf",(function(){return r})),n.d(t,"isInfConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the "License"); + * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, + * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -const a="return abs(x);";function d(e){const{inputs:t,backend:n}=e,{x:d}=t;if(n.shouldExecuteOnCPU([d])&&"complex64"!==d.dtype){const e=n.texData.get(d.dataId),t=Object(o.simpleAbsImplCPU)(e.values);return n.makeTensorInfo(d.shape,d.dtype,t)}let u;return u=Object(s.env)().getBool("WEBGL_PACK_UNARY_OPERATIONS")?new i.UnaryOpPackedProgram(d.shape,a):new r.UnaryOpProgram(d.shape,a),n.runWebGLProgram(u,[d],d.dtype)}const u={kernelName:s.Abs,backendName:"webgl",kernelFunc:d}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Acos.js": -/*!**************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Acos.js ***! - \**************************************************************************/ -/*! exports provided: acos, acosConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"acos",(function(){return i})),n.d(t,"acosConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +const r=Object(o.unaryKernelFunc)(s.IsInf,(e=>Math.abs(e)===1/0?1:0),"bool"),i={kernelName:s.IsInf,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsNaN.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsNaN.js ***! + \*************************************************************************/ +/*! exports provided: isNaN, isNaNConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"isNaN",(function(){return r})),n.d(t,"isNaNConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the "License"); + * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, + * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -const r=n(/*! ../unaryop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js").CHECK_NAN_SNIPPET+"\n if (abs(x) > 1.) {\n return NAN;\n }\n return acos(x);\n",i=Object(o.unaryKernelFunc)({opSnippet:r}),a={kernelName:s.Acos,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Acosh.js": -/*!***************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Acosh.js ***! - \***************************************************************************/ -/*! exports provided: acosh, acoshConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"acosh",(function(){return i})),n.d(t,"acoshConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +const r=Object(o.unaryKernelFunc)(s.IsNan,(e=>Number.isNaN(e)?1:0),"bool"),i={kernelName:s.IsNan,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LRN.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LRN.js ***! + \***********************************************************************/ +/*! exports provided: lRN, lRNConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"lRN",(function(){return r})),n.d(t,"lRNConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -7315,11 +7299,11 @@ const r=n(/*! ../unaryop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/di * limitations under the License. * ============================================================================= */ -const r=n(/*! ../unaryop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js").CHECK_NAN_SNIPPET+"\n if (x < 1.0) return NAN;\nreturn log(x + sqrt(x * x - 1.0));",i=Object(o.unaryKernelFunc)({opSnippet:r}),a={kernelName:s.Acosh,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Add.js": -/*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Add.js ***! - \*************************************************************************/ -/*! exports provided: addKernelFunc, addConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"addKernelFunc",(function(){return a})),n.d(t,"addConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i}=t,{depthRadius:a,bias:u,alpha:d,beta:l}=r;Object(o.assertNotComplex)(i,"LRN");const c=i.shape[3],f=c-1,p=n.data.get(i.dataId).values,m=s.util.sizeFromShape(i.shape),h=new Float32Array(m);function b(e){const t=e%c;let n=e-t+Math.max(0,t-a);const s=e-t+Math.min(t+a,f);let o=0;for(;n<=s;n++){const e=p[n];o+=e*e}return o}for(let e=0;eObject(s.env)().get("WEBGL_MAX_TEXTURES_IN_SHADER")){const e=Math.floor(d.length/2),t=a({inputs:d.slice(0,e),backend:n}),s=a({inputs:d.slice(e),backend:n});return a({inputs:[t,s],backend:n})}const u=d.map((e=>e.dtype)).reduce(((e,t)=>Object(s.upcastType)(e,t))),l=d.map((e=>e.shape)),c=Object(s.env)().getBool("WEBGL_PACK")?new r.AddNPackedProgram(d[0].shape,l):new o.AddNProgram(d[0].shape,l);return n.runWebGLProgram(c,d,u)}const d={kernelName:s.AddN,backendName:"webgl",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/All.js": -/*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/All.js ***! - \*************************************************************************/ -/*! exports provided: all, allConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"all",(function(){return a})),n.d(t,"allConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/reduce */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/reduce.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),i=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"); +function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i}=t,{alpha:a}=r;Object(o.assertNotComplex)([i],"leakyRelu");const u=s.util.sizeFromShape(i.shape),d=n.data.get(i.dataId).values,l=s.util.getTypedArrayFromDType("float32",u);for(let e=0;eee<=t?1:0)),a=Object(r.binaryKernelFunc)(s.LessEqual,i,null,"bool"),u={kernelName:s.LessEqual,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LinSpace.js": /*!****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ArgMax.js ***! + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LinSpace.js ***! \****************************************************************************/ -/*! exports provided: argMax, argMaxConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"argMax",(function(){return i})),n.d(t,"argMaxConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/arg_min_max */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/arg_min_max.js"),r=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"); +/*! exports provided: linSpace, linSpaceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"linSpace",(function(){return r})),n.d(t,"linSpaceConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./LinSpace_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LinSpace_impl.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -7420,11 +7404,11 @@ function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:d}=t,{axis:u,keepDims:l}=a, * limitations under the License. * ============================================================================= */ -function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{axis:d}=i;let u=s.util.parseAxisParam(d,a.shape);const l=s.backend_util.getAxesPermutation(u,a.shape.length);let c=a;const f=[];null!=l&&(c=Object(r.transpose)({inputs:{x:a},backend:n,attrs:{perm:l}}),f.push(c),u=s.backend_util.getInnerMostAxes(u.length,c.shape.length)),s.backend_util.assertAxesAreInnerMostDims("argMax",[u[0]],c.shape.length);const p=Object(o.argMinMaxReduce)(n,c,u[0],"max");return f.forEach((e=>n.disposeIntermediateTensorInfo(e))),p}const a={kernelName:s.ArgMax,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ArgMin.js": -/*!****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ArgMin.js ***! - \****************************************************************************/ -/*! exports provided: argMin, argMinConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"argMin",(function(){return i})),n.d(t,"argMinConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/arg_min_max */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/arg_min_max.js"),r=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"); +function r(e){const{backend:t,attrs:n}=e,{start:s,stop:r,num:i}=n,a=Object(o.linSpaceImpl)(s,r,i);return t.makeTensorInfo([a.length],"float32",a)}const i={kernelName:s.LinSpace,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LinSpace_impl.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LinSpace_impl.js ***! + \*********************************************************************************/ +/*! exports provided: linSpaceImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"linSpaceImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -7440,54 +7424,53 @@ function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{axis:d}=i;let u=s.uti * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{axis:d}=i;let u=s.util.parseAxisParam(d,a.shape);const l=s.backend_util.getAxesPermutation(u,a.shape.length);let c=a;const f=[];null!=l&&(c=Object(r.transpose)({inputs:{x:a},backend:n,attrs:{perm:l}}),f.push(c),u=s.backend_util.getInnerMostAxes(u.length,c.shape.length)),s.backend_util.assertAxesAreInnerMostDims("argMin",[u[0]],c.shape.length);const p=Object(o.argMinMaxReduce)(n,c,u[0],"min");return f.forEach((e=>n.disposeIntermediateTensorInfo(e))),p}const a={kernelName:s.ArgMin,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Asin.js": -/*!**************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Asin.js ***! - \**************************************************************************/ -/*! exports provided: asin, asinConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"asin",(function(){return i})),n.d(t,"asinConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); + */function o(e,t,n){const o=(t-e)/(n-1),r=s.util.makeZerosTypedArray(n,"float32");r[0]=e;for(let e=1;e 1.) {\n return NAN;\n }\n return asin(x);\n",i=Object(o.unaryKernelFunc)({opSnippet:r}),a={kernelName:s.Asin,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Asinh.js": -/*!***************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Asinh.js ***! - \***************************************************************************/ -/*! exports provided: asinh, asinhConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"asinh",(function(){return i})),n.d(t,"asinhConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +const i=Object(o.createSimpleUnaryImpl)((e=>Math.log(e))),a=Object(r.unaryKernelFuncFromImpl)(s.Log,i),u={kernelName:s.Log,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Log1p.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Log1p.js ***! + \*************************************************************************/ +/*! exports provided: log1p, log1pConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"log1p",(function(){return r})),n.d(t,"log1pConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the "License"); + * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, + * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -const r=n(/*! ../unaryop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js").CHECK_NAN_SNIPPET+"return log(x + sqrt(x * x + 1.0));",i=Object(o.unaryKernelFunc)({opSnippet:r}),a={kernelName:s.Asinh,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Atan.js": -/*!**************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Atan.js ***! - \**************************************************************************/ -/*! exports provided: atan, atanConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"atan",(function(){return i})),n.d(t,"atanConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +const r=Object(o.unaryKernelFunc)(s.Log1p,(e=>Math.log1p(e))),i={kernelName:s.Log1p,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalAnd.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalAnd.js ***! + \******************************************************************************/ +/*! exports provided: logicalAndImpl, logicalAnd, logicalAndConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"logicalAndImpl",(function(){return i})),n.d(t,"logicalAnd",(function(){return a})),n.d(t,"logicalAndConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -7504,32 +7487,32 @@ const r=n(/*! ../unaryop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/di * limitations under the License. * ============================================================================= */ -const r=n(/*! ../unaryop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js").CHECK_NAN_SNIPPET+"\n return atan(x);\n",i=Object(o.unaryKernelFunc)({opSnippet:r}),a={kernelName:s.Atan,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Atan2.js": -/*!***************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Atan2.js ***! - \***************************************************************************/ -/*! exports provided: atan2, atan2Config */function(e,t,n){"use strict";n.r(t),n.d(t,"atan2",(function(){return a})),n.d(t,"atan2Config",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>e&&t)),a=Object(r.binaryKernelFunc)(s.LogicalAnd,i,null,"bool"),u={kernelName:s.LogicalAnd,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalNot.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalNot.js ***! + \******************************************************************************/ +/*! exports provided: logicalNot, logicalNotConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"logicalNot",(function(){return r})),n.d(t,"logicalNotConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the "License"); + * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, + * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -const r=o.CHECK_NAN_SNIPPET_BINARY+"\n return atan(a, b);\n",i="\n vec4 result = atan(a, b);\n vec4 isNaN = min(vec4(isnan(a)) + vec4(isnan(b)), vec4(1.0));\n "+o.CHECK_NAN_SNIPPET_BINARY_PACKED+"\n return result;\n",a=Object(o.binaryKernelFunc)({opSnippet:r,packedOpSnippet:i}),d={kernelName:s.Atan2,backendName:"webgl",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Atanh.js": -/*!***************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Atanh.js ***! - \***************************************************************************/ -/*! exports provided: atanh, atanhConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"atanh",(function(){return i})),n.d(t,"atanhConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +const r=Object(o.unaryKernelFunc)(s.LogicalNot,(e=>e?0:1),"bool"),i={kernelName:s.LogicalNot,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalOr.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalOr.js ***! + \*****************************************************************************/ +/*! exports provided: logicalOrImpl, logicalOr, logicalOrConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"logicalOrImpl",(function(){return i})),n.d(t,"logicalOr",(function(){return a})),n.d(t,"logicalOrConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -7546,11 +7529,11 @@ const r=o.CHECK_NAN_SNIPPET_BINARY+"\n return atan(a, b);\n",i="\n vec4 result * limitations under the License. * ============================================================================= */ -const r=n(/*! ../unaryop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js").CHECK_NAN_SNIPPET+"\n if ((x < -1.0) || (x > 1.0)) return NAN;\nreturn (log(1.0 + x) - log(1.0 - x)) / 2.0;",i=Object(o.unaryKernelFunc)({opSnippet:r}),a={kernelName:s.Atanh,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPool.js": -/*!*****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPool.js ***! - \*****************************************************************************/ -/*! exports provided: avgPool, avgPoolConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"avgPool",(function(){return a})),n.d(t,"avgPoolConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../pool_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/pool_gpu.js"),r=n(/*! ../webgl_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"),i=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"); +const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>e||t)),a=Object(r.binaryKernelFunc)(s.LogicalOr,i,null,"bool"),u={kernelName:s.LogicalOr,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Max.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Max.js ***! + \***********************************************************************/ +/*! exports provided: max, maxConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"max",(function(){return a})),n.d(t,"maxConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./Max_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Max_impl.js"),i=n(/*! ./Transpose_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose_impl.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -7567,11 +7550,11 @@ const r=n(/*! ../unaryop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/di * limitations under the License. * ============================================================================= */ -function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:d}=t;Object(r.assertNotComplex)(d,"avgPool");const{filterSize:u,strides:l,pad:c,dimRoundingMode:f}=a;s.util.assert(s.backend_util.eitherStridesOrDilationsAreOne(l,1),(()=>`Error in avgPool: Either strides or dilations must be 1. Got strides ${l} and dilations '1'`));const p=s.backend_util.computePool2DInfo(d.shape,u,l,1,c,f);if(1===p.filterWidth&&1===p.filterHeight&&s.util.arraysEqual(p.inShape,p.outShape))return Object(i.identity)({inputs:{x:d},backend:n});const m=new o.Pool2DProgram(p,"avg",!1);return n.runWebGLProgram(m,[d],"float32")}const d={kernelName:s.AvgPool,backendName:"webgl",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPool3D.js": -/*!*******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPool3D.js ***! - \*******************************************************************************/ -/*! exports provided: avgPool3D, avgPool3DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"avgPool3D",(function(){return r})),n.d(t,"avgPool3DConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../pool_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/pool_gpu.js"); +function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:u}=t,{reductionIndices:d,keepDims:l}=a,c=n;let f=u.shape;const p=f.length,m=s.util.parseAxisParam(d,f);let h=m;const b=s.backend_util.getAxesPermutation(h,p);let j=c.data.get(u.dataId).values;if(null!=b){const e=new Array(p);for(let t=0;t`Error in maxPool: Either strides or dilations must be 1. Got strides ${l} and dilations '1'`));const p=s.backend_util.computePool2DInfo(u.shape,d,l,1,c,f);let m;if(1===p.filterWidth&&1===p.filterHeight&&s.util.arraysEqual(p.inShape,p.outShape))m=Object(i.identity)({inputs:{x:u},backend:n});else{const e=n.data.get(u.dataId).values,t=s.util.computeStrides(u.shape),o=Object(r.pool)(e,u.shape,u.dtype,t,p,"max");m=n.makeTensorInfo(p.outShape,u.dtype,o.values)}return m}const u={kernelName:s.MaxPool,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPool3D.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPool3D.js ***! + \*****************************************************************************/ +/*! exports provided: maxPool3D, maxPool3DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPool3D",(function(){return i})),n.d(t,"maxPool3DConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ../utils/pool_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/pool_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -7609,11 +7592,11 @@ function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i}=t,{filterSize:a,strides: * limitations under the License. * ============================================================================= */ -function r(e){const{inputs:t,backend:n,attrs:r}=e,{dy:i,input:a}=t,d=a,{filterSize:u,strides:l,pad:c,dimRoundingMode:f}=r,p=s.backend_util.computePool3DInfo(d.shape,u,l,[1,1,1],c,f),m=new o.AvgPool3DBackpropProgram(p);return n.runWebGLProgram(m,[i],d.dtype)}const i={kernelName:s.AvgPool3DGrad,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPoolGrad.js": +function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{filterSize:u,strides:d,pad:l,dimRoundingMode:c,dataFormat:f}=i;Object(o.assertNotComplex)(a,"maxPool3d");const p=s.backend_util.computePool3DInfo(a.shape,u,d,1,l,c,f),m=n.data.get(a.dataId).values,h=Object(r.pool3d)(m,a.shape,a.dtype,s.util.computeStrides(a.shape),p,"max");return n.makeTensorInfo(h.shape,"float32",h.values)}const a={kernelName:s.MaxPool3D,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPool3DGrad.js": /*!*********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPoolGrad.js ***! + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPool3DGrad.js ***! \*********************************************************************************/ -/*! exports provided: avgPoolGrad, avgPoolGradConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"avgPoolGrad",(function(){return i})),n.d(t,"avgPoolGradConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../avg_pool_backprop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/avg_pool_backprop_gpu.js"),r=n(/*! ../webgl_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"); +/*! exports provided: maxPool3DGrad, maxPool3DGradConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPool3DGrad",(function(){return i})),n.d(t,"maxPool3DGradConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ../utils/pool_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/pool_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -7630,11 +7613,11 @@ function r(e){const{inputs:t,backend:n,attrs:r}=e,{dy:i,input:a}=t,d=a,{filterSi * limitations under the License. * ============================================================================= */ -function i(e){const{inputs:t,backend:n,attrs:i}=e,{dy:a,input:d}=t,u=d;Object(r.assertNotComplex)([a,d],"avgPoolGrad");const{filterSize:l,strides:c,pad:f}=i,p=s.backend_util.computePool2DInfo(u.shape,l,c,1,f),m=new o.AvgPool2DBackpropProgram(p);return n.runWebGLProgram(m,[a],u.dtype)}const a={kernelName:s.AvgPoolGrad,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchMatMul.js": -/*!*********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchMatMul.js ***! - \*********************************************************************************/ -/*! exports provided: batchMatMul, batchMatMulConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"batchMatMul",(function(){return r})),n.d(t,"batchMatMulConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./BatchMatMul_impl */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchMatMul_impl.js"); +function i(e){const{inputs:t,backend:n,attrs:i}=e,{dy:a,input:u}=t,{filterSize:d,strides:l,pad:c,dimRoundingMode:f}=i;Object(o.assertNotComplex)([a,u],"maxPool3DGrad");const p=s.backend_util.computePool3DInfo(u.shape,d,l,1,c,f),m=n.bufferSync(u),h=Object(r.maxPool3dPositions)(m,p),b=p.strideDepth,j=p.strideHeight,g=p.strideWidth,w=p.dilationDepth,_=p.dilationHeight,k=p.dilationWidth,v=p.effectiveFilterDepth,x=p.effectiveFilterHeight,y=p.effectiveFilterWidth,O=v-1-p.padInfo.front,I=y-1-p.padInfo.left,C=x-1-p.padInfo.top,S=Object(s.buffer)(u.shape,"float32"),T=n.bufferSync(a);for(let e=0;e=p.outDepth||Math.floor(s)!==s))for(let o=0;o=p.outHeight||Math.floor(r)!==r))for(let i=0;i=p.outWidth||Math.floor(d)!==d)continue;const l=v*x*y-1-h.get(e,s,r,d,t)===n*x*y+o*y+i?1:0;if(0===l)continue;u+=T.get(e,s,r,d,t)*l}}}S.set(u,e,n,s,o,t)}return n.makeTensorInfo(S.shape,S.dtype,S.values)}const a={kernelName:s.MaxPool3DGrad,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolGrad.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolGrad.js ***! + \*******************************************************************************/ +/*! exports provided: maxPoolGrad, maxPoolGradConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPoolGrad",(function(){return i})),n.d(t,"maxPoolGradConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ../utils/pool_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/pool_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -7651,11 +7634,11 @@ function i(e){const{inputs:t,backend:n,attrs:i}=e,{dy:a,input:d}=t,u=d;Object(r. * limitations under the License. * ============================================================================= */ -function r(e){const{inputs:t,backend:n,attrs:s}=e,{a:r,b:i}=t,{transposeA:a,transposeB:d}=s;return Object(o.batchMatMulImpl)({a:r,b:i,transposeA:a,transposeB:d,backend:n})}const i={kernelName:s.BatchMatMul,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchMatMul_impl.js": -/*!**************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchMatMul_impl.js ***! - \**************************************************************************************/ -/*! exports provided: MATMUL_SHARED_DIM_THRESHOLD, batchMatMulImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"MATMUL_SHARED_DIM_THRESHOLD",(function(){return l})),n.d(t,"batchMatMulImpl",(function(){return c}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../mulmat_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/mulmat_packed_gpu.js"),i=n(/*! ./Multiply */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Multiply.js"),a=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),d=n(/*! ./Sum */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sum.js"),u=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"); +function i(e){const{inputs:t,backend:n,attrs:i}=e,{dy:a,input:u,output:d}=t,l=u;Object(o.assertNotComplex)([u,d],"maxPoolGrad");const{filterSize:c,strides:f,pad:p,dimRoundingMode:m}=i,h=s.backend_util.computePool2DInfo(l.shape,c,f,1,p,m),b=n.data.get(l.dataId).values,j=Object(s.buffer)(h.outShape,l.dtype,Object(r.maxPoolPositions)(b,l.shape,l.dtype,h).values),g=h.strideHeight,w=h.strideWidth,_=h.dilationHeight,k=h.dilationWidth,v=h.effectiveFilterHeight,x=h.effectiveFilterWidth,y=x-1-h.padInfo.left,O=v-1-h.padInfo.top,I=Object(s.buffer)(l.shape,"float32"),C=n.data.get(a.dataId).values,S=Object(s.buffer)(a.shape,"float32",C);for(let e=0;e=h.outHeight||Math.floor(s)!==s))for(let o=0;o=h.outWidth||Math.floor(a)!==a)continue;const u=v*x-1-j.get(e,s,a,t)===n*x+o?1:0;if(0===u)continue;i+=S.get(e,s,a,t)*u}}I.set(i,e,n,s,t)}return n.makeTensorInfo(I.shape,I.dtype,I.values)}const a={kernelName:s.MaxPoolGrad,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolWithArgmax.js": +/*!*************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolWithArgmax.js ***! + \*************************************************************************************/ +/*! exports provided: maxPoolWithArgmaxConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPoolWithArgmaxConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./MaxPoolWithArgmax_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolWithArgmax_impl.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -7672,11 +7655,11 @@ function r(e){const{inputs:t,backend:n,attrs:s}=e,{a:r,b:i}=t,{transposeA:a,tran * limitations under the License. * ============================================================================= */ -const l=1e3;function c({a:e,b:t,transposeA:n,transposeB:c,backend:f,bias:p=null,preluActivationWeights:m=null,leakyreluAlpha:h=0,activation:b=null}){const j=e.shape.length,g=t.shape.length,w=n?e.shape[j-2]:e.shape[j-1],_=c?t.shape[g-1]:t.shape[g-2],k=n?e.shape[j-1]:e.shape[j-2],v=c?t.shape[g-2]:t.shape[g-1],x=e.shape.slice(0,-2),y=t.shape.slice(0,-2),O=s.util.sizeFromShape(x),I=s.util.sizeFromShape(y),C=O===I||1===O||1===I;s.util.assert(j>=2&&g>=2&&C,(()=>`Error in matMul: the input batch dimensions must either be the same or at least one input batch dimension must be 1. Got input batch dimensions of (${x}) and (${y}).`));const S=(O>I?e.shape.slice(0,-2):t.shape.slice(0,-2)).concat([k,v]);s.util.assert(w===_,(()=>`Error in matMul: inner shapes (${w}) and (${_}) of Tensors with shapes ${e.shape} and ${t.shape} and transposeA=${n} and transposeB=${c} must match.`));const T=n?[O,w,k]:[O,k,w],N=c?[I,v,_]:[I,_,v],E=Object(a.reshape)({inputs:{x:e},backend:f,attrs:{shape:T}}),A=Object(a.reshape)({inputs:{x:t},backend:f,attrs:{shape:N}}),R=[E,A],F=Math.max(O,I),$=n?E.shape[1]:E.shape[2],M=null!=p,D=null!=m,P="leakyrelu"===b,B=null!=b?Object(o.mapActivationToShaderProgram)(b,!0):null;let L;if((1===k||1===v)&&$>l&&!1===(M||D||P||null!=B)){let e=E,t=A;n&&(e=Object(u.transpose)({inputs:{x:E},backend:f,attrs:{perm:[0,2,1]}}),R.push(e)),c&&(t=Object(u.transpose)({inputs:{x:A},backend:f,attrs:{perm:[0,2,1]}}),R.push(t));const s=1===v;let o=e;1!==v&&(o=Object(a.reshape)({inputs:{x:e},backend:f,attrs:{shape:[F,$,1]}}),R.push(o));const r=1===v?2:1;let l=t;s&&(l=Object(a.reshape)({inputs:{x:t},backend:f,attrs:{shape:[F,1,$]}}),R.push(l));const p=Object(i.multiply)({inputs:{a:o,b:l},backend:f});L=Object(d.sum)({inputs:{x:p},backend:f,attrs:{axis:r,keepDims:!0}}),R.push(p)}else{const o=Object(s.upcastType)(e.dtype,t.dtype),i=new r.MatMulPackedProgram(T,N,[F,k,v],n,c,M,B,D,P),a=[E,A];if(null!=p&&a.push(p),D&&a.push(m),P){const e=f.makeTensorInfo([],"float32",s.util.createScalarValue(h,"float32"));a.push(e),R.push(e)}L=f.runWebGLProgram(i,a,o)}const z=Object(a.reshape)({inputs:{x:L},backend:f,attrs:{shape:S}});R.push(L);for(const e of R)f.disposeIntermediateTensorInfo(e);return z}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchNorm.js": -/*!*******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchNorm.js ***! - \*******************************************************************************/ -/*! exports provided: batchNorm, batchNormConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"batchNorm",(function(){return i})),n.d(t,"batchNormConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../batchnorm_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/batchnorm_gpu.js"),r=n(/*! ../batchnorm_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/batchnorm_packed_gpu.js"); +const i={kernelName:s.MaxPoolWithArgmax,backendName:"cpu",kernelFunc:({inputs:e,attrs:t,backend:n})=>{const{x:i}=e,{filterSize:a,strides:u,pad:d,includeBatchInIndex:l}=t,c=n;Object(o.assertNotComplex)(i,"MaxPoolWithArgmax");const f=c.data.get(i.dataId).values,p=s.backend_util.computePool2DInfo(i.shape,a,u,[1,1],d),[m,h]=Object(r.maxPoolWithArgmaxImpl)(f,i.shape,i.dtype,l,p),b=c.write(m,p.outShape,i.dtype),j=c.write(h,p.outShape,i.dtype);return[{dataId:b,shape:p.outShape,dtype:i.dtype},{dataId:j,shape:p.outShape,dtype:"int32"}]}}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolWithArgmax_impl.js": +/*!******************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolWithArgmax_impl.js ***! + \******************************************************************************************/ +/*! exports provided: maxPoolWithArgmaxImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPoolWithArgmaxImpl",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/pool_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/pool_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -7693,11 +7676,11 @@ const l=1e3;function c({a:e,b:t,transposeA:n,transposeB:c,backend:f,bias:p=null, * limitations under the License. * ============================================================================= */ -const i=({inputs:e,backend:t,attrs:n})=>{const{x:i,mean:a,variance:d,offset:u,scale:l}=e;s.util.assert(a.shape.length===d.shape.length,(()=>"Batch normalization gradient requires mean and variance to have equal ranks.")),s.util.assert(null==u||a.shape.length===u.shape.length,(()=>"Batch normalization gradient requires mean and offset to have equal ranks.")),s.util.assert(null==l||a.shape.length===l.shape.length,(()=>"Batch normalization gradient requires mean and scale to have equal ranks."));let{varianceEpsilon:c}=n;null==c&&(c=.001);const f=[i,a,d];let p=null;null!=u&&(p=u.shape,f.push(u));let m=null;null!=l&&(m=l.shape,f.push(l));const h=Object(s.env)().getBool("WEBGL_PACK_NORMALIZATION")?new r.BatchNormPackedProgram(i.shape,a.shape,d.shape,p,m,c):new o.BatchNormProgram(i.shape,a.shape,d.shape,p,m,c);return t.runWebGLProgram(h,f,f[0].dtype)},a={kernelName:s.FusedBatchNorm,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchToSpaceND.js": -/*!************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchToSpaceND.js ***! - \************************************************************************************/ -/*! exports provided: batchToSpaceND, batchToSpaceNDConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"batchToSpaceND",(function(){return a})),n.d(t,"batchToSpaceNDConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),r=n(/*! ./Slice */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Slice.js"),i=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"); +function r(e,t,n,r,i){const a=s.util.computeStrides(t),u=Object(o.pool)(e,t,n,a,i,"max"),d=Object(o.maxPoolPositions)(e,t,n,i,!0,r);return[u.values,d.values]}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Max_impl.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Max_impl.js ***! + \****************************************************************************/ +/*! exports provided: maxImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"maxImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -7713,12 +7696,11 @@ const i=({inputs:e,backend:t,attrs:n})=>{const{x:i,mean:a,variance:d,offset:u,sc * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -const a=e=>{const{inputs:t,backend:n,attrs:a}=e,{x:d}=t,{blockShape:u,crops:l}=a;s.util.assert(d.shape.length<=4,(()=>"batchToSpaceND for rank > 4 with a WebGL backend not implemented yet"));const c=u.reduce(((e,t)=>e*t)),f=s.backend_util.getReshaped(d.shape,u,c),p=s.backend_util.getPermuted(f.length,u.length),m=s.backend_util.getReshapedPermuted(d.shape,u,c),h=s.backend_util.getSliceBeginCoords(l,u.length),b=s.backend_util.getSliceSize(m,l,u.length),j=[],g=Object(o.reshape)({inputs:{x:d},backend:n,attrs:{shape:f}}),w=Object(i.transpose)({inputs:{x:g},backend:n,attrs:{perm:p}}),_=Object(o.reshape)({inputs:{x:w},backend:n,attrs:{shape:m}}),k=Object(r.slice)({inputs:{x:_},backend:n,attrs:{begin:h,size:b}});return j.push(g),j.push(w),j.push(_),j.forEach((e=>n.disposeIntermediateTensorInfo(e))),k},d={kernelName:s.BatchToSpaceND,backendName:"webgl",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Bincount.js": -/*!******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Bincount.js ***! - \******************************************************************************/ -/*! exports provided: bincount, bincountConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"bincount",(function(){return r})),n.d(t,"bincountConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); + */function o(e,t,n,o){const r=s.util.getTypedArrayFromDType(o,s.util.sizeFromShape(n));for(let n=0;no)&&(o=t)}r[n]=o}return r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Maximum.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Maximum.js ***! + \***************************************************************************/ +/*! exports provided: maximumImpl, maximum, maximumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maximumImpl",(function(){return i})),n.d(t,"maximum",(function(){return a})),n.d(t,"maximumConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -7735,11 +7717,11 @@ const a=e=>{const{inputs:t,backend:n,attrs:a}=e,{x:d}=t,{blockShape:u,crops:l}=a * limitations under the License. * ============================================================================= */ -function r(e){const{inputs:t,backend:n,attrs:s}=e,{x:r,weights:i}=t,{size:a}=s,d=n.readSync(r.dataId),u=n.readSync(i.dataId),l=Object(o.bincountImplCPU)(d,u,i.dtype,i.shape,a);return n.makeTensorInfo([a],i.dtype,l)}const i={kernelName:s.Bincount,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Cast.js": -/*!**************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Cast.js ***! - \**************************************************************************/ -/*! exports provided: cast, castConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"cast",(function(){return u})),n.d(t,"castConfig",(function(){return l}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Complex */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js"),r=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"),i=n(/*! ./NotEqual */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NotEqual.js"),a=n(/*! ./Real */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Real.js"),d=n(/*! ../kernel_utils/int */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/int.js"); +const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>Math.max(e,t))),a=Object(r.binaryKernelFunc)(s.Maximum,i),u={kernelName:s.Maximum,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Mean.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Mean.js ***! + \************************************************************************/ +/*! exports provided: mean, meanConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"mean",(function(){return a})),n.d(t,"meanConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Cast */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cast.js"),r=n(/*! ./RealDiv */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RealDiv.js"),i=n(/*! ./Sum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sum.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -7756,11 +7738,11 @@ function r(e){const{inputs:t,backend:n,attrs:s}=e,{x:r,weights:i}=t,{size:a}=s,d * limitations under the License. * ============================================================================= */ -function u(e){const{inputs:t,backend:n,attrs:l}=e,{x:c}=t,{dtype:f}=l;if("complex64"===f){if("complex64"===c.dtype)return Object(r.identity)({inputs:{x:c},backend:n});const e=s.zeros(c.shape),t=u({inputs:{x:c},backend:n,attrs:{dtype:"float32"}}),i=Object(o.complex)({inputs:{real:t,imag:e},backend:n});return e.dispose(),n.disposeIntermediateTensorInfo(t),i}if("complex64"===c.dtype){const e=Object(a.real)({inputs:{input:c},backend:n}),t=u({inputs:{x:e},backend:n,attrs:{dtype:f}});return n.disposeIntermediateTensorInfo(e),t}if(!s.util.hasEncodingLoss(c.dtype,f)){const e=Object(r.identity)({inputs:{x:c},backend:n});return{dataId:e.dataId,shape:e.shape,dtype:f}}if("int32"===f)return Object(d.int)(c,n);if("bool"===f){const e=n.makeTensorInfo([],"bool",s.util.getTypedArrayFromDType("bool",1)),t={a:c,b:e},o=Object(i.notEqual)({inputs:t,backend:n});return n.disposeIntermediateTensorInfo(e),o}throw new Error(`Error in Cast: failed to cast ${c.dtype} to ${f}`)}const l={kernelName:s.Cast,backendName:"webgl",kernelFunc:u}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Ceil.js": -/*!**************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Ceil.js ***! - \**************************************************************************/ -/*! exports provided: ceil, ceilConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"ceil",(function(){return a})),n.d(t,"ceilConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:u}=t,{axis:d,keepDims:l}=a,c=s.util.parseAxisParam(d,u.shape),f=s.backend_util.computeOutAndReduceShapes(u.shape,c)[1],p=s.util.sizeFromShape(f),m=[],h=n.makeTensorInfo([],"float32",new Float32Array([p]));m.push(h);const b=Object(o.cast)({inputs:{x:u},backend:n,attrs:{dtype:"float32"}});m.push(b);const j=Object(r.div)({inputs:{a:b,b:h},backend:n});m.push(j);const g=Object(i.sum)({inputs:{x:j},backend:n,attrs:{axis:d,keepDims:l}});return m.forEach((e=>n.disposeIntermediateTensorInfo(e))),g}const u={kernelName:s.Mean,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Min.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Min.js ***! + \***********************************************************************/ +/*! exports provided: min, minConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"min",(function(){return a})),n.d(t,"minConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"),i=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -7777,11 +7759,11 @@ function u(e){const{inputs:t,backend:n,attrs:l}=e,{x:c}=t,{dtype:f}=l;if("comple * limitations under the License. * ============================================================================= */ -const i="return ceil(x);",a=Object(o.unaryKernelFunc)({opSnippet:i,packedOpSnippet:i,cpuKernelImpl:r.ceilImplCPU}),d={kernelName:s.Ceil,backendName:"webgl",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ClipByValue.js": -/*!*********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ClipByValue.js ***! - \*********************************************************************************/ -/*! exports provided: clipByValue, clipByValueConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"clipByValue",(function(){return i})),n.d(t,"clipByValueConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../clip_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/clip_gpu.js"),r=n(/*! ../clip_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/clip_packed_gpu.js"); +function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:u}=t,{axis:d,keepDims:l}=a;Object(o.assertNotComplex)(u,"min");const c=s.util.parseAxisParam(d,u.shape);let f=c;const p=s.backend_util.getAxesPermutation(f,u.shape.length);let m=u;null!=p&&(m=Object(i.transpose)({inputs:{x:u},backend:n,attrs:{perm:p}}),f=s.backend_util.getInnerMostAxes(f.length,u.shape.length)),s.backend_util.assertAxesAreInnerMostDims("min",f,m.shape.length);const[h,b]=s.backend_util.computeOutAndReduceShapes(m.shape,f),j=s.util.sizeFromShape(b),g=s.util.makeZerosTypedArray(s.util.sizeFromShape(h),m.dtype),w=n.data.get(m.dataId).values;for(let e=0;eMath.min(e,t))),a=Object(r.binaryKernelFunc)(s.Minimum,i),u={kernelName:s.Minimum,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MirrorPad.js": /*!*****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js ***! + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MirrorPad.js ***! \*****************************************************************************/ -/*! exports provided: complex, complexConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"complex",(function(){return r})),n.d(t,"complexConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"); +/*! exports provided: mirrorPad, mirrorPadConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"mirrorPad",(function(){return r})),n.d(t,"mirrorPadConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -7819,11 +7801,11 @@ function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{clipValueMin:d,clipVa * limitations under the License. * ============================================================================= */ -function r(e){const{inputs:t,backend:n}=e,{real:s,imag:r}=t,i=n.makeTensorInfo(s.shape,"complex64"),a=n.texData.get(i.dataId),d=Object(o.identity)({inputs:{x:s},backend:n}),u=Object(o.identity)({inputs:{x:r},backend:n});return a.complexTensorInfos={real:d,imag:u},i}const i={kernelName:s.Complex,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ComplexAbs.js": -/*!********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ComplexAbs.js ***! - \********************************************************************************/ -/*! exports provided: complexAbs, complexAbsConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"complexAbs",(function(){return i})),n.d(t,"complexAbsConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../complex_abs_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/complex_abs_gpu.js"); +function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i}=t,{paddings:a,mode:u}=r;Object(o.assertNotComplex)(i,"mirrorPad");const d=a.map(((e,t)=>e[0]+i.shape[t]+e[1])),l=a.map((e=>e[0])),c=a.map(((e,t)=>e[0]+i.shape[t])),f="reflect"===u?0:1,p=n.data.get(i.dataId).values,m=i.shape.length,h=s.util.computeStrides(i.shape),b=s.util.sizeFromShape(d),j=d.length,g=s.util.computeStrides(d),w=s.util.getTypedArrayFromDType(i.dtype,b);for(let e=0;e=c[e]&&(t[e]=2*(c[e]-1)-t[e]+f);t=t.map(((e,t)=>e-l[t]));const n=s.util.locToIndex(t,m,h);w[e]=p[n]}return{dataId:n.write(w,d,i.dtype),shape:d,dtype:i.dtype}}const i={kernelName:s.MirrorPad,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Mod.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Mod.js ***! + \***********************************************************************/ +/*! exports provided: modImpl, mod, modConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"modImpl",(function(){return i})),n.d(t,"mod",(function(){return a})),n.d(t,"modConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -7840,11 +7822,11 @@ function r(e){const{inputs:t,backend:n}=e,{real:s,imag:r}=t,i=n.makeTensorInfo(s * limitations under the License. * ============================================================================= */ -function r(e,t){return{dataId:t.dataId,dtype:t.dtype,shape:e.shape}}function i(e){const{inputs:t,backend:n}=e,{x:s}=t,i=n.texData.get(s.dataId),a=new o.ComplexAbsProgram(s.shape),d=[r(s,i.complexTensorInfos.real),r(s,i.complexTensorInfos.imag)];return n.runWebGLProgram(a,d,d[0].dtype)}const a={kernelName:s.ComplexAbs,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Concat.js": -/*!****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Concat.js ***! - \****************************************************************************/ -/*! exports provided: concat, concatConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"concat",(function(){return i})),n.d(t,"concatConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Concat_impl */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Concat_impl.js"),r=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"); +const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>{const n=e%t;return e<0&&t<0||e>=0&&t>=0?n:(n+t)%t})),a=Object(r.binaryKernelFunc)(s.Mod,i),u={kernelName:s.Mod,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Multinomial.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Multinomial.js ***! + \*******************************************************************************/ +/*! exports provided: multinomial, multinomialConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"multinomial",(function(){return a})),n.d(t,"multinomialConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! seedrandom */"./node_modules/seedrandom/index.js"),r=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),i=n(/*! ./Softmax */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Softmax.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -7861,11 +7843,11 @@ function r(e,t){return{dataId:t.dataId,dtype:t.dtype,shape:e.shape}}function i(e * limitations under the License. * ============================================================================= */ -function i(e){const{inputs:t,backend:n,attrs:i}=e,{axis:a}=i,d=s.util.parseAxisParam(a,t[0].shape)[0],u=s.backend_util.computeOutShape(t.map((e=>e.shape)),d);if(0===s.util.sizeFromShape(u))return n.makeTensorInfo(u,t[0].dtype,[]);const l=t.filter((e=>s.util.sizeFromShape(e.shape)>0));if(1===l.length)return Object(r.identity)({inputs:{x:l[0]},backend:n});const c=l.map((e=>e.shape));return s.backend_util.assertParamsConsistent(c,d),Object(o.concatImpl)(l,d,n)}const a={kernelName:s.Concat,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Concat_impl.js": -/*!*********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Concat_impl.js ***! - \*********************************************************************************/ -/*! exports provided: concatImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"concatImpl",(function(){return c}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../concat_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/concat_gpu.js"),r=n(/*! ../concat_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/concat_packed_gpu.js"),i=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"),a=n(/*! ./Complex */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js"),d=n(/*! ./Imag */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Imag.js"),u=n(/*! ./Real */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Real.js"),l=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); +function a(e){const{inputs:t,backend:n,attrs:a}=e,{logits:u}=t,{numSamples:d,seed:l,normalized:c}=a;Object(r.assertNotComplex)(u,"multinomial");const f=c?u:Object(i.softmax)({inputs:{logits:u},backend:n,attrs:{dim:-1}}),p=f.shape[0],m=f.shape[1],h=n.data.get(f.dataId).values,b=[p,d],j=s.util.makeZerosTypedArray(s.util.sizeFromShape(b),"int32");for(let e=0;eObject(u.real)({inputs:{input:e},backend:n}))),o=e.map((e=>Object(d.imag)({inputs:{input:e},backend:n}))),r=c(s,t,n),i=c(o,t,n),l=Object(a.complex)({inputs:{real:r,imag:i},backend:n});return s.forEach((e=>n.disposeIntermediateTensorInfo(e))),o.forEach((e=>n.disposeIntermediateTensorInfo(e))),n.disposeIntermediateTensorInfo(r),n.disposeIntermediateTensorInfo(i),l}let p=n.shouldExecuteOnCPU(e);if("string"===f&&(p=!0),p){const o=e.map((e=>{const o=[-1,s.util.sizeFromShape(e.shape.slice(t))];return Object(l.reshape)({inputs:{x:e},backend:n,attrs:{shape:o}})})),r=o.map((e=>({vals:n.readSync(e.dataId),shape:e.shape}))),a=s.backend_util.computeOutShape(o.map((e=>e.shape)),1),d=1===o[0].shape[0],u=Object(i.concatImplCPU)(r,a,f,d),c=s.backend_util.computeOutShape(e.map((e=>e.shape)),t),p=n.makeTensorInfo(c,f,u);return o.forEach((e=>n.disposeIntermediateTensorInfo(e))),p}if(e.length>Object(s.env)().getNumber("WEBGL_MAX_TEXTURES_IN_SHADER")){const s=Math.floor(e.length/2),o=c(e.slice(0,s),t,n),r=c(e.slice(s),t,n),i=c([o,r],t,n);return n.disposeIntermediateTensorInfo(o),n.disposeIntermediateTensorInfo(r),i}if(Object(s.env)().getBool("WEBGL_PACK_ARRAY_OPERATIONS")&&e[0].shape.length>1){const s=new r.ConcatPackedProgram(e.map((e=>e.shape)),t);return n.runWebGLProgram(s,e,f)}const{tensors2D:m,outShape:h}=function(e,t,n){const o=s.backend_util.computeOutShape(e.map((e=>e.shape)),t);return{tensors2D:e.map((e=>Object(l.reshape)({inputs:{x:e},attrs:{shape:[-1,s.util.sizeFromShape(e.shape.slice(t))]},backend:n}))),outShape:o}}(e,t,n),b=new o.ConcatProgram(m.map((e=>e.shape))),j=n.runWebGLProgram(b,m,f);m.forEach((e=>n.disposeIntermediateTensorInfo(e)));const g=Object(l.reshape)({inputs:{x:j},attrs:{shape:h},backend:n});return n.disposeIntermediateTensorInfo(j),g}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2D.js": -/*!****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2D.js ***! - \****************************************************************************/ -/*! exports provided: conv2d, conv2DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"conv2d",(function(){return a})),n.d(t,"conv2DConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../conv_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_gpu.js"),r=n(/*! ./Conv2D_impl */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2D_impl.js"),i=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); +const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>e*t)),a=Object(r.createComplexBinaryKernelImpl)(((e,t,n,s)=>({real:e*n-t*s,imag:e*s+t*n}))),u=Object(r.binaryKernelFunc)(s.Multiply,i,a),d={kernelName:s.Multiply,backendName:"cpu",kernelFunc:u}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Neg.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Neg.js ***! + \***********************************************************************/ +/*! exports provided: negImpl, neg, negConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"negImpl",(function(){return i})),n.d(t,"neg",(function(){return a})),n.d(t,"negConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./Multiply */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Multiply.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -7903,11 +7885,11 @@ function c(e,t,n){const f=e[0].dtype;if("complex64"===f){const s=e.map((e=>Objec * limitations under the License. * ============================================================================= */ -function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:d,filter:u}=t,{strides:l,pad:c,dataFormat:f,dilations:p,dimRoundingMode:m}=a,h=s.backend_util.convertConv2DDataFormat(f),b=s.backend_util.computeConv2DInfo(d.shape,u.shape,l,p,c,m,!1,h);let j;if(1!==b.filterHeight||1!==b.filterWidth||1!==b.dilationHeight||1!==b.dilationWidth||1!==b.strideHeight||1!==b.strideWidth||"SAME"!==b.padInfo.type&&"VALID"!==b.padInfo.type)if(Object(s.env)().getBool("WEBGL_CONV_IM2COL")&&1===d.shape[0])j=Object(r.conv2dWithIm2Row)({x:d,filter:u,convInfo:b,backend:n});else{const e=new o.Conv2DProgram(b);j=n.runWebGLProgram(e,[d,u],"float32")}else j=Object(r.conv2dByMatMul)({x:d,filter:u,convInfo:b,backend:n});const g=Object(i.reshape)({inputs:{x:j},backend:n,attrs:{shape:b.outShape}});return n.disposeIntermediateTensorInfo(j),g}const d={kernelName:s.Conv2D,backendName:"webgl",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2DBackpropFilter.js": -/*!******************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2DBackpropFilter.js ***! - \******************************************************************************************/ -/*! exports provided: conv2DBackpropFilter, conv2DBackpropFilterConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"conv2DBackpropFilter",(function(){return r})),n.d(t,"conv2DBackpropFilterConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../conv_backprop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu.js"); +function i(e,t,n){const o=s.util.createScalarValue(-1,n);return Object(r.multiplyImpl)([],t,o,e,n)}function a(e){const{inputs:t,backend:n}=e,{x:s}=t;Object(o.assertNotComplex)(s,"neg");const r=n.data.get(s.dataId).values,[a,u]=i(r,s.shape,s.dtype);return n.makeTensorInfo(u,s.dtype,a)}const u={kernelName:s.Neg,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV3.js": +/*!***************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV3.js ***! + \***************************************************************************************/ +/*! exports provided: nonMaxSuppressionV3, nonMaxSuppressionV3Config */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionV3",(function(){return i})),n.d(t,"nonMaxSuppressionV3Config",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -7924,11 +7906,11 @@ function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:d,filter:u}=t,{strides:l,pa * limitations under the License. * ============================================================================= */ -function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i,dy:a}=t,{strides:d,pad:u,dataFormat:l,dimRoundingMode:c,filterShape:f}=r,p=s.backend_util.convertConv2DDataFormat(l),m=s.backend_util.computeConv2DInfo(i.shape,f,d,1,u,c,!1,p),h=new o.Conv2DDerFilterProgram(m);return n.runWebGLProgram(h,[i,a],"float32")}const i={kernelName:s.Conv2DBackpropFilter,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2DBackpropInput.js": -/*!*****************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2DBackpropInput.js ***! - \*****************************************************************************************/ -/*! exports provided: conv2DBackpropInput, conv2DBackpropInputConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"conv2DBackpropInput",(function(){return r})),n.d(t,"conv2DBackpropInputConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../conv_backprop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu.js"); +const r=s.kernel_impls.nonMaxSuppressionV3Impl;function i(e){const{inputs:t,backend:n,attrs:s}=e,{boxes:i,scores:a}=t,{maxOutputSize:u,iouThreshold:d,scoreThreshold:l}=s;Object(o.assertNotComplex)(i,"NonMaxSuppression");const c=n.data.get(i.dataId).values,f=n.data.get(a.dataId).values,{selectedIndices:p}=r(c,f,u,d,l);return n.makeTensorInfo([p.length],"int32",new Int32Array(p))}const a={kernelName:s.NonMaxSuppressionV3,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV4.js": +/*!***************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV4.js ***! + \***************************************************************************************/ +/*! exports provided: nonMaxSuppressionV4, nonMaxSuppressionV4Config */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionV4",(function(){return i})),n.d(t,"nonMaxSuppressionV4Config",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -7945,14 +7927,14 @@ function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i,dy:a}=t,{strides:d,pad:u, * limitations under the License. * ============================================================================= */ -function r(e){const{inputs:t,backend:n,attrs:r}=e,{dy:i,filter:a}=t,{inputShape:d,strides:u,pad:l,dataFormat:c,dimRoundingMode:f}=r,p=s.backend_util.convertConv2DDataFormat(c),m=s.backend_util.computeConv2DInfo(d,a.shape,u,1,l,f,!1,p),h=new o.Conv2DDerInputProgram(m);return n.runWebGLProgram(h,[i,a],"float32")}const i={kernelName:s.Conv2DBackpropInput,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2D_impl.js": -/*!*********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2D_impl.js ***! - \*********************************************************************************/ -/*! exports provided: conv2dByMatMul, conv2dWithIm2Row */function(e,t,n){"use strict";n.r(t),n.d(t,"conv2dByMatMul",(function(){return c})),n.d(t,"conv2dWithIm2Row",(function(){return f}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../im2col_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/im2col_packed_gpu.js"),r=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),i=n(/*! ../mulmat_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/mulmat_packed_gpu.js"),a=n(/*! ../webgl_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"),d=n(/*! ./BatchMatMul_impl */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchMatMul_impl.js"),u=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"),l=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); +const r=s.kernel_impls.nonMaxSuppressionV4Impl;function i(e){const{inputs:t,backend:n,attrs:s}=e,{boxes:i,scores:a}=t,{maxOutputSize:u,iouThreshold:d,scoreThreshold:l,padToMaxOutputSize:c}=s;Object(o.assertNotComplex)(i,"NonMaxSuppressionPadded");const f=n.data.get(i.dataId).values,p=n.data.get(a.dataId).values,{selectedIndices:m,validOutputs:h}=r(f,p,u,d,l,c);return[n.makeTensorInfo([m.length],"int32",new Int32Array(m)),n.makeTensorInfo([],"int32",new Int32Array([h]))]}const a={kernelName:s.NonMaxSuppressionV4,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV5.js": +/*!***************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV5.js ***! + \***************************************************************************************/ +/*! exports provided: nonMaxSuppressionV5, nonMaxSuppressionV5Config */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionV5",(function(){return i})),n.d(t,"nonMaxSuppressionV5Config",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -7966,11 +7948,11 @@ function r(e){const{inputs:t,backend:n,attrs:r}=e,{dy:i,filter:a}=t,{inputShape: * limitations under the License. * ============================================================================= */ -function c({x:e,filter:t,convInfo:n,backend:o,bias:r=null,preluActivationWeights:i=null,leakyreluAlpha:c=0,activation:f=null}){const p=e.shape,m=o.texData.get(e.dataId),h=n.inChannels,b=p[0]*p[1]*p[2],j=n.outChannels,g="channelsLast"===n.dataFormat;let w;const _=[],k=(1===b||1===j)&&h>d.MATMUL_SHARED_DIM_THRESHOLD,v=p[2]%2!=0&&!!m.isPacked;if(!k&&Object(s.env)().getBool("WEBGL_LAZILY_UNPACK")&&Object(s.env)().getBool("WEBGL_PACK_BINARY_OPERATIONS")&&v){const h=g?p[0]*p[1]*(p[2]+1):p[0]*p[2]*(p[3]+1),b={dataId:e.dataId,shape:[1,h,n.inChannels],dtype:e.dtype},j=m.shape;m.shape=m.shape.slice(),m.shape[m.shape.length-2]++,s.util.assert(a.isReshapeFree(m.shape,b.shape),(()=>`packed reshape ${m.shape} to ${b.shape} isn't free`));const k=Object(l.reshape)({inputs:{x:t},backend:o,attrs:{shape:[1,n.inChannels,n.outChannels]}});_.push(k);const v=Object(d.batchMatMulImpl)({a:b,b:k,backend:o,transposeA:false,transposeB:false,bias:r,activation:f,preluActivationWeights:i,leakyreluAlpha:c}),x=o.texData.get(v.dataId);s.util.assert(x.isPacked,(()=>"batchMatMul result is expected to be packed")),m.shape=j,x.shape=n.outShape,w=Object(u.identity)({inputs:{x:v},backend:o}),w.shape=n.outShape,_.push(v)}else{const s=g?p[0]*p[1]*p[2]:p[0]*p[2]*p[3],a=Object(l.reshape)({inputs:{x:e},backend:o,attrs:{shape:[1,s,n.inChannels]}}),u=Object(l.reshape)({inputs:{x:t},backend:o,attrs:{shape:[1,n.inChannels,n.outChannels]}}),m=Object(d.batchMatMulImpl)({a:a,b:u,transposeA:false,transposeB:false,backend:o,bias:r,activation:f,preluActivationWeights:i,leakyreluAlpha:c});w=Object(l.reshape)({inputs:{x:m},backend:o,attrs:{shape:n.outShape}}),_.push(a),_.push(u),_.push(m)}for(const e of _)o.disposeIntermediateTensorInfo(e);return w}function f({x:e,filter:t,convInfo:n,backend:a,bias:d=null,preluActivationWeights:u=null,leakyreluAlpha:c=0,activation:f=null}){const{filterWidth:p,filterHeight:m,inChannels:h,outWidth:b,outHeight:j,dataFormat:g}=n,w="channelsLast"===g,_=p*m*h,k=j*b,v=[_,k],x=[],y=Object(l.reshape)({inputs:{x:e},backend:a,attrs:{shape:e.shape.slice(1)}}),O=Object(l.reshape)({inputs:{x:t},backend:a,attrs:{shape:[1,_,s.util.sizeFromShape(t.shape)/_]}});x.push(y),x.push(O);const I=new o.Im2ColPackedProgram(v,y.shape,n),C=a.runWebGLProgram(I,[y],"float32"),S=Object(l.reshape)({inputs:{x:C},backend:a,attrs:{shape:[1,v[0],v[1]]}});x.push(C),x.push(S);const T=null!=d,N=null!=u,E="leakyrelu"===f,A=f?Object(r.mapActivationToShaderProgram)(f,!0):null,R=new i.MatMulPackedProgram(S.shape,O.shape,[1,k,n.outChannels],!0,!1,T,A,N,E),F=[S,O];if(d&&F.push(d),N&&F.push(u),E){const e=a.makeTensorInfo([],"float32",s.util.createScalarValue(c,"float32"));F.push(e),x.push(e)}const $=a.runWebGLProgram(R,F,"float32"),M=w?[1,j,b,n.outChannels]:[1,n.outChannels,j,b],D=Object(l.reshape)({inputs:{x:$},backend:a,attrs:{shape:M}});x.push($);for(const e of x)a.disposeIntermediateTensorInfo(e);return D}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv3D.js": +const r=s.kernel_impls.nonMaxSuppressionV5Impl;function i(e){const{inputs:t,backend:n,attrs:s}=e,{boxes:i,scores:a}=t,{maxOutputSize:u,iouThreshold:d,scoreThreshold:l,softNmsSigma:c}=s;Object(o.assertNotComplex)(i,"NonMaxSuppressionWithScore");const f=n.data.get(i.dataId).values,p=n.data.get(a.dataId).values,m=u,h=d,b=l,j=c,{selectedIndices:g,selectedScores:w}=r(f,p,m,h,b,j);return[n.makeTensorInfo([g.length],"int32",new Int32Array(g)),n.makeTensorInfo([w.length],"float32",new Float32Array(w))]}const a={kernelName:s.NonMaxSuppressionV5,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NotEqual.js": /*!****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv3D.js ***! + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NotEqual.js ***! \****************************************************************************/ -/*! exports provided: conv3D, conv3DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"conv3D",(function(){return r})),n.d(t,"conv3DConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../conv_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_gpu.js"); +/*! exports provided: notEqualImpl, notEqual, notEqualConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"notEqualImpl",(function(){return i})),n.d(t,"notEqual",(function(){return a})),n.d(t,"notEqualConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -7987,11 +7969,11 @@ function c({x:e,filter:t,convInfo:n,backend:o,bias:r=null,preluActivationWeights * limitations under the License. * ============================================================================= */ -function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i,filter:a}=t,{strides:d,pad:u,dilations:l}=r,c=s.backend_util.computeConv3DInfo(i.shape,a.shape,d,l,u),f=new o.Conv3DProgram(c);return n.runWebGLProgram(f,[i,a],"float32")}const i={kernelName:s.Conv3D,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv3DBackpropFilterV2.js": -/*!********************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv3DBackpropFilterV2.js ***! - \********************************************************************************************/ -/*! exports provided: conv3DBackpropFilterV2, conv3DBackpropFilterV2Config */function(e,t,n){"use strict";n.r(t),n.d(t,"conv3DBackpropFilterV2",(function(){return r})),n.d(t,"conv3DBackpropFilterV2Config",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../conv_backprop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu.js"); +const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>e!==t?1:0)),a=Object(r.binaryKernelFunc)(s.NotEqual,i,null,"bool"),u={kernelName:s.NotEqual,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/OneHot.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/OneHot.js ***! + \**************************************************************************/ +/*! exports provided: oneHot, oneHotConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"oneHot",(function(){return r})),n.d(t,"oneHotConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -8008,11 +7990,11 @@ function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i,filter:a}=t,{strides:d,pa * limitations under the License. * ============================================================================= */ -function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i,dy:a}=t,{strides:d,pad:u,filterShape:l}=r,c=s.backend_util.computeConv3DInfo(i.shape,l,d,1,u),f=new o.Conv3DDerFilterProgram(c);return n.runWebGLProgram(f,[i,a],"float32")}const i={kernelName:s.Conv3DBackpropFilterV2,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv3DBackpropInputV2.js": -/*!*******************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv3DBackpropInputV2.js ***! - \*******************************************************************************************/ -/*! exports provided: conv3DBackpropInput, conv3DBackpropInputConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"conv3DBackpropInput",(function(){return r})),n.d(t,"conv3DBackpropInputConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../conv_backprop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu.js"); +function r(e){const{inputs:t,backend:n,attrs:r}=e,{indices:i}=t,{depth:a,onValue:u,offValue:d}=r;Object(o.assertNotComplex)(i,"oneHot");const l=s.util.sizeFromShape(i.shape),c=new Float32Array(l*a);c.fill(d);const f=n.data.get(i.dataId).values;for(let e=0;e=0&&f[e]{s.util.assertShapesMatch(u,e.shape,"All tensors passed to stack must have matching shapes"),s.util.assert(d===e.dtype,(()=>"All tensors passed to stack must have matching dtypes"))}));const l=[],c=t.map((e=>{const t=Object(r.expandDims)({inputs:{input:e},backend:n,attrs:{dim:a}});return l.push(t),t})),f=Object(o.concat)({inputs:c,backend:n,attrs:{axis:a}});return l.forEach((e=>n.disposeIntermediateTensorInfo(e))),f}const a={kernelName:s.Pack,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/PadV2.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/PadV2.js ***! + \*************************************************************************/ +/*! exports provided: padV2, padV2Config */function(e,t,n){"use strict";n.r(t),n.d(t,"padV2",(function(){return r})),n.d(t,"padV2Config",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -8071,11 +8053,11 @@ const r=o.CHECK_NAN_SNIPPET_UNARY+"\n return cos(x);\n",i=Object(o.unaryKernelF * limitations under the License. * ============================================================================= */ -const r=Object(o.unaryKernelFunc)({opSnippet:"\n float e2x = exp(-x);\n return (e2x + 1.0 / e2x) / 2.0;\n"}),i={kernelName:s.Cosh,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/CropAndResize.js": -/*!***********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/CropAndResize.js ***! - \***********************************************************************************/ -/*! exports provided: cropAndResize, cropAndResizeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"cropAndResize",(function(){return r})),n.d(t,"cropAndResizeConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../crop_and_resize_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/crop_and_resize_gpu.js"); +function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i}=t,{paddings:a,constantValue:u}=r;Object(o.assertNotComplex)(i,"pad");const d=a.map(((e,t)=>e[0]+i.shape[t]+e[1])),l=a.map((e=>e[0])),c=n.data.get(i.dataId).values,f=s.util.sizeFromShape(i.shape),p=i.shape.length,m=s.util.computeStrides(i.shape),h=s.util.sizeFromShape(d),b=d.length,j=s.util.computeStrides(d),g=s.util.getTypedArrayFromDType(i.dtype,h);0!==u&&g.fill(u);for(let e=0;ee+l[t]));g[s.util.locToIndex(t,b,j)]=c[e]}return{dataId:n.write(g,d,i.dtype),shape:d,dtype:i.dtype}}const i={kernelName:s.PadV2,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Pow.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Pow.js ***! + \***********************************************************************/ +/*! exports provided: powImpl, pow, powConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"powImpl",(function(){return i})),n.d(t,"pow",(function(){return a})),n.d(t,"powConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -8092,32 +8074,32 @@ const r=Object(o.unaryKernelFunc)({opSnippet:"\n float e2x = exp(-x);\n return * limitations under the License. * ============================================================================= */ -const r=e=>{const{inputs:t,backend:n,attrs:s}=e,{image:r,boxes:i,boxInd:a}=t,{cropSize:d,method:u,extrapolationValue:l}=s,c=new o.CropAndResizeProgram(r.shape,i.shape,d,u,l);return n.runWebGLProgram(c,[r,i,a],"float32")},i={kernelName:s.CropAndResize,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Cumsum.js": -/*!****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Cumsum.js ***! - \****************************************************************************/ -/*! exports provided: cumsum, cumsumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"cumsum",(function(){return a})),n.d(t,"cumsumConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cumsum_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/cumsum_gpu.js"),r=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"),i=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"); +const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>Math.pow(e,t))),a=Object(r.binaryKernelFunc)(s.Pow,i),u={kernelName:s.Pow,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Prelu.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Prelu.js ***! + \*************************************************************************/ +/*! exports provided: prelu, preluConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"prelu",(function(){return a})),n.d(t,"preluConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the "License"); + * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, + * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:d}=t,{axis:u,exclusive:l,reverse:c}=a,f=d.shape.length,p=s.backend_util.getAxesPermutation([u],f);let m=d;null!=p&&(m=Object(i.transpose)({inputs:{x:d},backend:n,attrs:{perm:p}}));const h=s.backend_util.getInnerMostAxes(1,f)[0];if(h!==f-1)throw new Error(`WebGL cumsum shader expects an inner-most axis=${d.shape.length-1} but got axis=${u}`);const b=m.shape[h];let j=Object(r.identity)({inputs:{x:m},backend:n});for(let e=0;e<=Math.ceil(Math.log2(b))-1;e++){const t=new o.CumSumProgram(m.shape,!1,c),s=[[e]],r=j;j=n.runWebGLProgram(t,[j],j.dtype,s),n.disposeIntermediateTensorInfo(r)}if(l){const e=new o.CumSumProgram(m.shape,l,c),t=j;j=n.runWebGLProgram(e,[j],j.dtype),n.disposeIntermediateTensorInfo(t)}if(null!=p){const e=s.backend_util.getUndoAxesPermutation(p),t=Object(i.transpose)({inputs:{x:j},backend:n,attrs:{perm:e}});return n.disposeIntermediateTensorInfo(j),n.disposeIntermediateTensorInfo(m),t}return j}const d={kernelName:s.Cumsum,backendName:"webgl",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/DenseBincount.js": -/*!***********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/DenseBincount.js ***! - \***********************************************************************************/ -/*! exports provided: denseBincount, denseBincountConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"denseBincount",(function(){return r})),n.d(t,"denseBincountConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +const i=Object(r.createSimpleBinaryKernelImpl)(((e,t)=>e<0?t*e:e));function a(e){const{inputs:t,backend:n}=e,{x:s,alpha:r}=t;Object(o.assertNotComplex)([s,r],"prelu");const a=n.data.get(s.dataId).values,u=n.data.get(r.dataId).values,[d,l]=i(s.shape,r.shape,a,u,s.dtype);return n.makeTensorInfo(l,s.dtype,d)}const u={kernelName:s.Prelu,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Prod.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Prod.js ***! + \************************************************************************/ +/*! exports provided: prodImpl, prod, prodConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"prodImpl",(function(){return i})),n.d(t,"prod",(function(){return a})),n.d(t,"prodConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -8134,11 +8116,11 @@ function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:d}=t,{axis:u,exclusive:l,re * limitations under the License. * ============================================================================= */ -function r(e){const{inputs:t,backend:n,attrs:s}=e,{x:r,weights:i}=t,{size:a,binaryOutput:d}=s;if(1===r.shape.length){const e=n.readSync(r.dataId),t=n.readSync(i.dataId),s=Object(o.bincountImplCPU)(e,t,i.dtype,i.shape,a);return n.makeTensorInfo([a],i.dtype,s)}if(2===r.shape.length){const e=n.bufferSync(r),t=n.bufferSync(i),s=Object(o.bincountReduceImplCPU)(e,t,a,d);return n.makeTensorInfo(s.shape,i.dtype,s.values)}throw new Error(`Error in denseBincount: input must be at most rank 2, but got rank${r.shape.length}.`)}const i={kernelName:s.DenseBincount,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthToSpace.js": -/*!**********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthToSpace.js ***! - \**********************************************************************************/ -/*! exports provided: depthToSpace, depthToSpaceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"depthToSpace",(function(){return r})),n.d(t,"depthToSpaceConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../depth_to_space_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/depth_to_space_gpu.js"); +function i(e,t,n,o){const[r,i]=s.backend_util.computeOutAndReduceShapes(e,o),a=Object(s.upcastType)(t,"int32"),u=s.util.makeZerosTypedArray(s.util.sizeFromShape(r),a),d=s.util.sizeFromShape(i);for(let e=0;en.disposeIntermediateTensorInfo(e))),n.makeTensorInfo(k,_,g)}const u={kernelName:s.Prod,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Range.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Range.js ***! + \*************************************************************************/ +/*! exports provided: range, rangeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"range",(function(){return r})),n.d(t,"rangeConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Range_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Range_impl.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -8155,11 +8137,11 @@ function r(e){const{inputs:t,backend:n,attrs:s}=e,{x:r,weights:i}=t,{size:a,bina * limitations under the License. * ============================================================================= */ -function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i}=t,{blockSize:a,dataFormat:d}=r;s.util.assert(a>1,(()=>`blockSize should be > 1 for depthToSpace, but was: ${a}`));const u=i.shape[0],l="NHWC"===d?i.shape[1]:i.shape[2],c="NHWC"===d?i.shape[2]:i.shape[3],f="NHWC"===d?i.shape[3]:i.shape[1],p=l*a,m=c*a,h=f/(a*a),b="NHWC"===d?[u,p,m,h]:[u,h,p,m],j=new o.DepthToSpaceProgram(b,a,d);return n.runWebGLProgram(j,[i],i.dtype)}const i={kernelName:s.DepthToSpace,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthwiseConv2dNative.js": -/*!*******************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthwiseConv2dNative.js ***! - \*******************************************************************************************/ -/*! exports provided: depthwiseConv2dNative, depthwiseConv2dNativeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"depthwiseConv2dNative",(function(){return i})),n.d(t,"depthwiseConv2dNativeConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../conv_gpu_depthwise */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_gpu_depthwise.js"),r=n(/*! ../conv_packed_gpu_depthwise */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_packed_gpu_depthwise.js"); +function r(e){const{backend:t,attrs:n}=e,{start:s,stop:r,dtype:i,step:a}=n,u=Object(o.rangeImpl)(s,r,a,i);return t.makeTensorInfo([u.length],i,u)}const i={kernelName:s.Range,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Range_impl.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Range_impl.js ***! + \******************************************************************************/ +/*! exports provided: rangeImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"rangeImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -8175,12 +8157,11 @@ function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i}=t,{blockSize:a,dataForma * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a,filter:d}=t,{strides:u,pad:l,dilations:c,dimRoundingMode:f}=i;let p=c;null==p&&(p=[1,1]),s.util.assert(s.backend_util.eitherStridesOrDilationsAreOne(u,p),(()=>`Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides ${u} and dilations '${p}'`));const m=s.backend_util.computeConv2DInfo(a.shape,d.shape,u,p,l,f,!0);let h;return h=Object(s.env)().getBool("WEBGL_PACK_DEPTHWISECONV")&&m.strideWidth<=2&&m.outChannels/m.inChannels==1?new r.DepthwiseConvPacked2DProgram(m):new o.DepthwiseConv2DProgram(m),n.runWebGLProgram(h,[a,d],"float32")}const a={kernelName:s.DepthwiseConv2dNative,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthwiseConv2dNativeBackpropFilter.js": -/*!*********************************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthwiseConv2dNativeBackpropFilter.js ***! - \*********************************************************************************************************/ -/*! exports provided: depthwiseConv2dNativeBackpropFilter, depthwiseConv2dNativeBackpropFilterConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"depthwiseConv2dNativeBackpropFilter",(function(){return r})),n.d(t,"depthwiseConv2dNativeBackpropFilterConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../conv_backprop_gpu_depthwise */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu_depthwise.js"); + */function o(e,t,n,o){if(e===t||e1)return s.util.makeZerosTypedArray(0,o);const r=Math.abs(Math.ceil((t-e)/n)),i=s.util.makeZerosTypedArray(r,o);te/t)),a=Object(r.binaryKernelFunc)(s.RealDiv,i),u={kernelName:s.RealDiv,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reciprocal.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reciprocal.js ***! + \******************************************************************************/ +/*! exports provided: reciprocal, reciprocalConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"reciprocal",(function(){return r})),n.d(t,"reciprocalConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the "License"); + * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, + * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -function i(e){const{inputs:t,backend:n}=e,{x:i}=t,a=[...i.shape,...i.shape],d=s.util.sizeFromShape(i.shape),u=Object(r.reshape)({inputs:{x:i},backend:n,attrs:{shape:[d]}}),l=new o.DiagProgram(d),c=n.runWebGLProgram(l,[u],u.dtype),f=Object(r.reshape)({inputs:{x:c},backend:n,attrs:{shape:a}});return n.disposeIntermediateTensorInfo(u),n.disposeIntermediateTensorInfo(c),f}const a={kernelName:s.Diag,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Dilation2D.js": -/*!********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Dilation2D.js ***! - \********************************************************************************/ -/*! exports provided: dilation2D, dilation2DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"dilation2D",(function(){return i})),n.d(t,"dilation2DConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../dilation_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/dilation_gpu.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); +const r=Object(o.unaryKernelFunc)(s.Reciprocal,(e=>1/e)),i={kernelName:s.Reciprocal,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Relu.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Relu.js ***! + \************************************************************************/ +/*! exports provided: relu, reluConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"relu",(function(){return r})),n.d(t,"reluConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the "License"); + * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, + * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a,filter:d}=t,{strides:u,pad:l,dilations:c}=i,f=s.backend_util.computeDilation2DInfo(a.shape,d.shape,u,l,"NHWC",c);let p;const m=new o.Dilation2DProgram(f);p=n.runWebGLProgram(m,[a,d],"float32");const h=Object(r.reshape)({inputs:{x:p},backend:n,attrs:{shape:f.outShape}});return n.disposeIntermediateTensorInfo(p),h}const a={kernelName:s.Dilation2D,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Einsum.js": -/*!****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Einsum.js ***! - \****************************************************************************/ -/*! exports provided: einsum, einsumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"einsum",(function(){return d})),n.d(t,"einsumConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Multiply */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Multiply.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),i=n(/*! ./Sum */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sum.js"),a=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"); +const r=Object(o.unaryKernelFunc)(s.Relu,(e=>Math.max(0,e))),i={kernelName:s.Relu,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Relu6.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Relu6.js ***! + \*************************************************************************/ +/*! exports provided: relu6, relu6Config */function(e,t,n){"use strict";n.r(t),n.d(t,"relu6",(function(){return r})),n.d(t,"relu6Config",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); /** * @license - * Copyright 2021 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the "License"); + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, + * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -function d(e){const{inputs:t,backend:n,attrs:d}=e,{equation:u}=d,l=t,{allDims:c,summedDims:f,idDims:p}=s.backend_util.decodeEinsumEquation(u,l.length);s.backend_util.checkEinsumDimSizes(c.length,p,l);const{path:m,steps:h}=s.backend_util.getEinsumComputePath(f,p),b=h.length;let j=null,g=c.length;const w=[];for(let e=0;e=0&&(j=Object(i.sum)({inputs:{x:j},backend:n,attrs:{axis:m[e]-(c.length-g),keepDims:!1}}),w.push(j)),g--)}for(const e of w)e!==j&&n.disposeIntermediateTensorInfo(e);return j}const u={kernelName:s.Einsum,backendName:"webgl",kernelFunc:d}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Elu.js": -/*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Elu.js ***! - \*************************************************************************/ -/*! exports provided: eluConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"eluConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +const r=Object(o.unaryKernelFunc)(s.Relu6,(e=>Math.min(Math.max(0,e),6))),i={kernelName:s.Relu6,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js ***! + \***************************************************************************/ +/*! exports provided: reshape, reshapeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"reshape",(function(){return o})),n.d(t,"reshapeConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -8301,12 +8282,11 @@ function d(e){const{inputs:t,backend:n,attrs:d}=e,{equation:u}=d,l=t,{allDims:c, * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -const r=Object(o.unaryKernelFunc)({opSnippet:"return (x >= 0.0) ? x : (exp(x) - 1.0);",packedOpSnippet:"\n vec4 result;\n\n result.r = (x.r >= 0.0) ? x.r : (exp(x.r) - 1.0);\n result.g = (x.g >= 0.0) ? x.g : (exp(x.g) - 1.0);\n result.b = (x.b >= 0.0) ? x.b : (exp(x.b) - 1.0);\n result.a = (x.a >= 0.0) ? x.a : (exp(x.a) - 1.0);\n\n return result;\n"}),i={kernelName:s.Elu,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/EluGrad.js": -/*!*****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/EluGrad.js ***! - \*****************************************************************************/ -/*! exports provided: eluGrad, eluGradConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"eluGrad",(function(){return i})),n.d(t,"eluGradConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../binaryop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_gpu.js"),r=n(/*! ../binaryop_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_packed_gpu.js"); + */function o(e){const{inputs:t,backend:n,attrs:o}=e,{x:r}=t,{shape:i}=o,a=s.util.sizeFromShape(r.shape),u=s.util.inferFromImplicitShape(i,a),d=s.util.sizeFromShape(u);s.util.assert(a===d,(()=>`The new shape (${u}) has ${d} elements and the old shape (${r.shape}) has ${a} elements. The new shape and old shape must have the same number of elements.`)),n.incRef(r.dataId);const l=n.data.get(r.dataId);if(null!=l.complexTensorInfos){const e=l.complexTensorInfos.real,t=l.complexTensorInfos.imag;e.shape=u,t.shape=u}return{dataId:r.dataId,shape:u,dtype:r.dtype}}const r={kernelName:s.Reshape,backendName:"cpu",kernelFunc:o}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ResizeBilinear.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ResizeBilinear.js ***! + \**********************************************************************************/ +/*! exports provided: resizeBilinear, resizeBilinearConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"resizeBilinear",(function(){return r})),n.d(t,"resizeBilinearConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -8323,11 +8303,11 @@ const r=Object(o.unaryKernelFunc)({opSnippet:"return (x >= 0.0) ? x : (exp(x) - * limitations under the License. * ============================================================================= */ -const i=e=>{const{inputs:t,backend:n}=e,{dy:i,y:a}=t,d=Object(s.env)().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new r.BinaryOpPackedProgram("\n vec4 bGTEZero = vec4(greaterThanEqual(b, vec4(0.)));\n return (bGTEZero * a) + ((vec4(1.0) - bGTEZero) * (a * (b + vec4(1.0))));\n",i.shape,a.shape):new o.BinaryOpProgram("return (b >= 1.0) ? a : a * (b + 1.0);",i.shape,a.shape);return n.runWebGLProgram(d,[i,a],i.dtype)},a={kernelName:s.EluGrad,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Equal.js": -/*!***************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Equal.js ***! - \***************************************************************************/ -/*! exports provided: equal, equalConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"equal",(function(){return i})),n.d(t,"equalConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +function r(e){const{inputs:t,backend:n,attrs:r}=e,{images:i}=t,{alignCorners:a,halfPixelCenters:u,size:d}=r;Object(o.assertNotComplex)(i,"resizeBilinear");const l=s.util.computeStrides(i.shape),[c,f]=d,[p,m,h,b]=i.shape,j=n.data.get(i.dataId).values,g=new Float32Array(s.util.sizeFromShape([p,c,f,b])),w=[a&&c>1?m-1:m,a&&f>1?h-1:h],_=[a&&c>1?c-1:c,a&&f>1?f-1:f];let k=0;const v=w[0]/_[0],x=w[1]/_[1];for(let e=0;e{const{inputs:t,backend:n}=e,{dy:i,y:a}=t,d=Object(s.env)().getBool(" * limitations under the License. * ============================================================================= */ -const i=Object(o.binaryKernelFunc)({opSnippet:"return float(a == b);",packedOpSnippet:"\n return vec4(equal(a, b));\n",dtype:"bool",cpuKernelImpl:r.equalImplCPU}),a={kernelName:s.Equal,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Erf.js": -/*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Erf.js ***! - \*************************************************************************/ -/*! exports provided: erf, erfConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"erf",(function(){return i})),n.d(t,"erfConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +function r(e){const{inputs:t,backend:n,attrs:r}=e,{images:i,dy:a}=t,{alignCorners:u}=r;Object(o.assertNotComplex)([a,i],"resizeBilinearGrad");const d=s.util.computeStrides(i.shape),[l,c,f,p]=i.shape,[,m,h]=a.shape,b=new Float32Array(l*c*f*p),j=[u&&m>1?c-1:c,u&&h>1?f-1:f],g=[u&&m>1?m-1:m,u&&h>1?h-1:h],w=j[0]/g[0],_=j[1]/g[1],k=n.data.get(a.dataId).values;let v=0;for(let e=0;e1?m-1:m,a&&f>1?h-1:h],_=[a&&c>1?c-1:c,a&&f>1?f-1:f],k=w[0]/_[0],v=w[1]/_[1];let x=0;for(let e=0;e1?f-1:f,u&&b>1?p-1:p],_=[u&&h>1?h-1:h,u&&b>1?b-1:b],k=w[0]/_[0],v=w[1]/_[1],x=1/k,y=1/v,O=2*Math.ceil(x)+2,I=2*Math.ceil(y)+2;for(let e=0;e=h)continue;const c=t+d*l[1],m=d*k;if(e===Math.min(f-1,u?Math.round(m):Math.floor(m)))for(let e=0;e=b)continue;const o=c+t*l[2],r=t*v;s===Math.min(p-1,u?Math.round(r):Math.floor(r))&&(i+=g[o+n])}}j[r+n]=i}}}}return n.makeTensorInfo(i.shape,i.dtype,j)}const i={kernelName:s.ResizeNearestNeighborGrad,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reverse.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reverse.js ***! + \***************************************************************************/ +/*! exports provided: reverse, reverseConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"reverse",(function(){return i})),n.d(t,"reverseConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Identity.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the License); + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -function r(e){const{inputs:t,attrs:n,backend:r}=e,{dim:i}=n,{input:a}=t,d=a.shape.length,u=a.shape.slice();let l=i;return i<0&&(s.util.assert(-(d+1)<=i,(()=>`Axis must be in the interval [${-(d+1)}, ${d}]`)),l=d+i+1),u.splice(l,0,1),Object(o.reshape)({inputs:{x:a},backend:r,attrs:{shape:u}})}const i={kernelName:s.ExpandDims,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Expm1.js": -/*!***************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Expm1.js ***! - \***************************************************************************/ -/*! exports provided: expm1, expm1Config */function(e,t,n){"use strict";n.r(t),n.d(t,"expm1",(function(){return a})),n.d(t,"expm1Config",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{dims:u}=i;Object(o.assertNotComplex)(a,"reverse");const d=a.shape.length,l=s.util.parseAxisParam(u,a.shape);if(0===d)return Object(r.identity)({inputs:{x:a},backend:n});const c=new s.TensorBuffer(a.shape,a.dtype),f=n.bufferSync(a);for(let e=0;en[e]=a.shape[e]-1-n[e])),c.set(f.get(...n),...t)}return n.makeTensorInfo(c.shape,c.dtype,c.values)}const a={kernelName:s.Reverse,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RotateWithOffset.js": +/*!************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RotateWithOffset.js ***! + \************************************************************************************/ +/*! exports provided: rotateWithOffsetConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"rotateWithOffsetConfig",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -8427,54 +8407,53 @@ function r(e){const{inputs:t,attrs:n,backend:r}=e,{dim:i}=n,{input:a}=t,d=a.shap * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -const i="return exp(x) - 1.0;",a=Object(o.unaryKernelFunc)({opSnippet:i,packedOpSnippet:i,cpuKernelImpl:r.expm1ImplCPU}),d={kernelName:s.Expm1,backendName:"webgl",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FFT.js": + */const o={kernelName:s.RotateWithOffset,backendName:"cpu",kernelFunc:({inputs:e,attrs:t,backend:n})=>{const{image:o}=e,{radians:r,fillValue:i,center:a}=t,u=n,d=s.util.getTypedArrayFromDType(o.dtype,s.util.sizeFromShape(o.shape)),[l,c,f,p]=o.shape,[m,h]=s.backend_util.getImageCenter(a,c,f),b=Math.sin(r),j=Math.cos(r),g=u.data.get(o.dataId).values;for(let e=0;e=0&&_=0&&k{const t=Math.floor(e);return e-t<.5?Math.floor(e):e-t>.5?Math.ceil(e):t%2==0?t:t+1})),i={kernelName:s.Round,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Rsqrt.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Rsqrt.js ***! + \*************************************************************************/ +/*! exports provided: rsqrtImpl, rsqrt, rsqrtConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"rsqrtImpl",(function(){return i})),n.d(t,"rsqrt",(function(){return a})),n.d(t,"rsqrtConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_impl.js"),r=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the "License"); + * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, + * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -function a(e,t,n){const a=n.texData.get(e.dataId),d=s.util.sizeFromShape(e.shape),u=e.shape[e.shape.length-1],l=d/u,c=Object(i.reshape)({inputs:{x:e},backend:n,attrs:{shape:[l,u]}}),f=c.shape,p=new o.FFTProgram("real",f,t),m=new o.FFTProgram("imag",f,t),h=[{dataId:a.complexTensorInfos.real.dataId,dtype:a.complexTensorInfos.real.dtype,shape:f},{dataId:a.complexTensorInfos.imag.dataId,dtype:a.complexTensorInfos.imag.dtype,shape:f}],b=n.runWebGLProgram(p,h,"float32"),j=n.runWebGLProgram(m,h,"float32"),g=Object(r.complex)({inputs:{real:b,imag:j},backend:n});n.disposeIntermediateTensorInfo(b),n.disposeIntermediateTensorInfo(j);const w=Object(i.reshape)({inputs:{x:g},backend:n,attrs:{shape:e.shape}});return n.disposeIntermediateTensorInfo(c),n.disposeIntermediateTensorInfo(g),w}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Fill.js": -/*!**************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Fill.js ***! - \**************************************************************************/ -/*! exports provided: fill, fillConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fill",(function(){return r})),n.d(t,"fillConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../fill_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/fill_gpu.js"); +const i=Object(o.createSimpleUnaryImpl)((e=>1/Math.sqrt(e))),a=Object(r.unaryKernelFuncFromImpl)(s.Rsqrt,i),u={kernelName:s.Rsqrt,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ScatterNd.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ScatterNd.js ***! + \*****************************************************************************/ +/*! exports provided: scatterNd, scatterNdConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"scatterNd",(function(){return r})),n.d(t,"scatterNdConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Scatter_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Scatter_impl.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -8491,11 +8470,11 @@ function a(e,t,n){const a=n.texData.get(e.dataId),d=s.util.sizeFromShape(e.shape * limitations under the License. * ============================================================================= */ -function r(e){const{backend:t,attrs:n}=e,{shape:r,value:i}=n;let{dtype:a}=n;if(a=a||s.util.inferDtype(i),"string"===a){const e=s.util.getArrayFromDType(a,s.util.sizeFromShape(r));return e.fill(i),t.makeTensorInfo(r,a,e)}{const e=new o.FillProgram(r,i),n=[[i]];return t.runWebGLProgram(e,[],a,n)}}const i={kernelName:s.Fill,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FlipLeftRight.js": -/*!***********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FlipLeftRight.js ***! - \***********************************************************************************/ -/*! exports provided: flipLeftRightConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"flipLeftRightConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../flip_left_right_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/flip_left_right_gpu.js"); +function r(e){const{inputs:t,backend:n,attrs:r}=e,{indices:i,updates:a}=t,{shape:u}=r,{sliceRank:d,numUpdates:l,sliceSize:c,strides:f,outputSize:p}=s.backend_util.calculateShapes(a,i,u),m=n.bufferSync(i),h=n.bufferSync(a),b=Object(o.scatterImpl)(m,h,u,p,c,l,d,f,0,!0);return n.makeTensorInfo(u,b.dtype,b.values)}const i={kernelName:s.ScatterNd,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Scatter_impl.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Scatter_impl.js ***! + \********************************************************************************/ +/*! exports provided: scatterImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"scatterImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -8511,12 +8490,11 @@ function r(e){const{backend:t,attrs:n}=e,{shape:r,value:i}=n;let{dtype:a}=n;if(a * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -const r={kernelName:s.FlipLeftRight,backendName:"webgl",kernelFunc:({inputs:e,backend:t})=>{const{image:n}=e,s=t,r=new o.FlipLeftRightProgram(n.shape);return s.runWebGLProgram(r,[n],n.dtype)}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Floor.js": -/*!***************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Floor.js ***! - \***************************************************************************/ -/*! exports provided: floor, floorConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"floor",(function(){return a})),n.d(t,"floorConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); + */function o(e,t,n,o,r,i,a,u,d,l){const c=[o/r,r],f=e.values,p=t.values;if(0===o)return Object(s.buffer)(n,t.dtype);const m=Object(s.buffer)(c,t.dtype);m.values.fill(d);for(let e=0;e=o/r)throw new Error(`Invalid indices: ${s} does not index into ${n}`);for(let n=0;n1||1===i.shape.length?1:s.util.sizeFromShape(i.shape.slice(1));for(let e=0;ee>=0?i*e:r*(Math.exp(e)-1))),u={kernelName:s.Selu,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sigmoid.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sigmoid.js ***! + \***************************************************************************/ +/*! exports provided: sigmoid, sigmoidConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sigmoid",(function(){return r})),n.d(t,"sigmoidConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the "License"); + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, + * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -const a={kernelName:s.FromPixels,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e;let{pixels:u}=t;const{numChannels:l}=a,c="undefined"!=typeof HTMLVideoElement&&u instanceof HTMLVideoElement,f="undefined"!=typeof HTMLImageElement&&u instanceof HTMLImageElement,[p,m]=c?[u.videoWidth,u.videoHeight]:[u.width,u.height],h=[m,p],b=[m,p,l];(f||c)&&(null==d&&(d=document.createElement("canvas").getContext("2d")),d.canvas.width=p,d.canvas.height=m,d.drawImage(u,0,0,p,m),u=d.canvas);const j=n.makeTensorInfo(h,"int32");n.texData.get(j.dataId).usage=o.TextureUsage.PIXELS,n.gpgpu.uploadPixelDataToTexture(n.getTexture(j.dataId),u);const g=Object(s.env)().getBool("WEBGL_PACK")?new i.FromPixelsPackedProgram(b):new r.FromPixelsProgram(b),w=n.runWebGLProgram(g,[j],"int32");return n.disposeData(j.dataId),w}};let d},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FromPixels_utils/from_pixels_gpu.js": -/*!******************************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FromPixels_utils/from_pixels_gpu.js ***! - \******************************************************************************************************/ -/*! exports provided: FromPixelsProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"FromPixelsProgram",(function(){return o}));var s=n(/*! ../../glsl_version */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"); +const r=Object(o.unaryKernelFunc)(s.Sigmoid,(e=>1/(1+Math.exp(-e)))),i={kernelName:s.Sigmoid,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sign.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sign.js ***! + \************************************************************************/ +/*! exports provided: sign, signConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sign",(function(){return r})),n.d(t,"signConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); /** * @license - * Copyright 2018 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the "License"); + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, + * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */class o{constructor(e){this.variableNames=["A"];const t=Object(s.getGlslDifferences)(),[n,o]=e;this.outputShape=e,this.userCode=`\n void main() {\n ivec3 coords = getOutputCoords();\n int texR = coords[0];\n int texC = coords[1];\n int depth = coords[2];\n vec2 uv = (vec2(texC, texR) + halfCR) / vec2(${o}.0, ${n}.0);\n\n vec4 values = ${t.texture2D}(A, uv);\n float value;\n if (depth == 0) {\n value = values.r;\n } else if (depth == 1) {\n value = values.g;\n } else if (depth == 2) {\n value = values.b;\n } else if (depth == 3) {\n value = values.a;\n }\n\n setOutput(floor(value * 255.0 + 0.5));\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FromPixels_utils/from_pixels_packed_gpu.js": -/*!*************************************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FromPixels_utils/from_pixels_packed_gpu.js ***! - \*************************************************************************************************************/ -/*! exports provided: FromPixelsPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"FromPixelsPackedProgram",(function(){return o}));var s=n(/*! ../../glsl_version */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"); + */ +const r=Object(o.unaryKernelFunc)(s.Sign,(e=>e<0?-1:e>0?1:0)),i={kernelName:s.Sign,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sin.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sin.js ***! + \***********************************************************************/ +/*! exports provided: sin, sinConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sin",(function(){return r})),n.d(t,"sinConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); /** * @license - * Copyright 2018 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the "License"); + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, + * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */class o{constructor(e){this.variableNames=["A"],this.packedInputs=!1,this.packedOutput=!0;const t=Object(s.getGlslDifferences)(),[n,o]=e;this.outputShape=e,this.userCode=`\n void main() {\n ivec3 coords = getOutputCoords();\n int texR = coords[0];\n int texC = coords[1];\n int depth = coords[2];\n\n vec4 result = vec4(0.);\n\n for(int row=0; row<=1; row++) {\n for(int col=0; col<=1; col++) {\n texC = coords[1] + row;\n depth = coords[2] + col;\n\n vec2 uv = (vec2(texC, texR) + halfCR) /\n vec2(${o}.0, ${n}.0);\n vec4 values = ${t.texture2D}(A, uv);\n float value;\n if (depth == 0) {\n value = values.r;\n } else if (depth == 1) {\n value = values.g;\n } else if (depth == 2) {\n value = values.b;\n } else if (depth == 3) {\n value = values.a;\n }\n\n result[row * 2 + col] = floor(value * 255.0 + 0.5);\n }\n }\n\n ${t.output} = result;\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FusedConv2D.js": -/*!*********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FusedConv2D.js ***! - \*********************************************************************************/ -/*! exports provided: fusedConv2d, fusedConv2DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fusedConv2d",(function(){return d})),n.d(t,"fusedConv2DConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../conv_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_gpu.js"),r=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),i=n(/*! ./Conv2D_impl */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2D_impl.js"),a=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); + */ +const r=Object(o.unaryKernelFunc)(s.Sin,(e=>Math.sin(e))),i={kernelName:s.Sin,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sinh.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sinh.js ***! + \************************************************************************/ +/*! exports provided: sinh, sinhConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sinh",(function(){return r})),n.d(t,"sinhConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the "License"); + * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, + * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -function d(e){const{inputs:t,backend:n,attrs:d}=e,{x:u,filter:l,bias:c,preluActivationWeights:f}=t,{strides:p,pad:m,dataFormat:h,dilations:b,dimRoundingMode:j,activation:g,leakyreluAlpha:w}=d,_=s.backend_util.convertConv2DDataFormat(h),k=s.backend_util.computeConv2DInfo(u.shape,l.shape,p,b,m,j,!1,_);let v;const x=[];if(1!==k.filterHeight||1!==k.filterWidth||1!==k.dilationHeight||1!==k.dilationWidth||1!==k.strideHeight||1!==k.strideWidth||"SAME"!==k.padInfo.type&&"VALID"!==k.padInfo.type)if(Object(s.env)().getBool("WEBGL_CONV_IM2COL")&&1===u.shape[0])v=Object(i.conv2dWithIm2Row)({x:u,filter:l,convInfo:k,backend:n,bias:c,activation:g,preluActivationWeights:f,leakyreluAlpha:w});else{const e=null!=c,t=null!=f,i="leakyrelu"===g,a=g?Object(r.mapActivationToShaderProgram)(g,!1):null,d=new o.Conv2DProgram(k,e,a,t,i),p=[u,l];if(c&&p.push(c),f&&p.push(f),i){const e=n.makeTensorInfo([],"float32",s.util.createScalarValue(w,"float32"));p.push(e),x.push(e)}v=n.runWebGLProgram(d,p,"float32")}else v=Object(i.conv2dByMatMul)({x:u,filter:l,convInfo:k,backend:n,bias:c,activation:g,preluActivationWeights:f,leakyreluAlpha:w});const y=Object(a.reshape)({inputs:{x:v},backend:n,attrs:{shape:k.outShape}});return x.push(v),x.forEach((e=>n.disposeIntermediateTensorInfo(e))),y}const u={kernelName:s.FusedConv2D,backendName:"webgl",kernelFunc:d}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FusedDepthwiseConv2D.js": -/*!******************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FusedDepthwiseConv2D.js ***! - \******************************************************************************************/ -/*! exports provided: fusedDepthwiseConv2D, fusedDepthwiseConv2DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fusedDepthwiseConv2D",(function(){return a})),n.d(t,"fusedDepthwiseConv2DConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../conv_gpu_depthwise */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_gpu_depthwise.js"),r=n(/*! ../conv_packed_gpu_depthwise */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_packed_gpu_depthwise.js"),i=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +const r=Object(o.unaryKernelFunc)(s.Sinh,(e=>Math.sinh(e))),i={kernelName:s.Sinh,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Slice.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Slice.js ***! + \*************************************************************************/ +/*! exports provided: sliceImpl, slice, sliceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sliceImpl",(function(){return r})),n.d(t,"slice",(function(){return i})),n.d(t,"sliceConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -8657,11 +8637,11 @@ function d(e){const{inputs:t,backend:n,attrs:d}=e,{x:u,filter:l,bias:c,preluActi * limitations under the License. * ============================================================================= */ -function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:d,filter:u,bias:l,preluActivationWeights:c}=t,{strides:f,pad:p,dilations:m,dimRoundingMode:h,activation:b,leakyreluAlpha:j}=a,g=[];let w=m;null==w&&(w=[1,1]),s.util.assert(s.backend_util.eitherStridesOrDilationsAreOne(f,w),(()=>`Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides ${f} and dilations '${w}'`));const _=s.backend_util.computeConv2DInfo(d.shape,u.shape,f,w,p,h,!0),k=Object(s.env)().getBool("WEBGL_PACK_DEPTHWISECONV")&&_.strideWidth<=2&&_.outChannels/_.inChannels==1,v=b?Object(i.mapActivationToShaderProgram)(b,k):null,x=[d,u],y=null!=l,O=null!=c,I="leakyrelu"===b;if(y&&x.push(l),O&&x.push(c),I){const e=n.makeTensorInfo([],"float32",s.util.createScalarValue(j,"float32"));x.push(e),g.push(e)}let C;C=k?new r.DepthwiseConvPacked2DProgram(_,y,v,O,I):new o.DepthwiseConv2DProgram(_,y,v,O,I);const S=n.runWebGLProgram(C,x,"float32");return g.forEach((e=>n.disposeIntermediateTensorInfo(e))),S}const d={kernelName:s.FusedDepthwiseConv2D,backendName:"webgl",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/GatherNd.js": -/*!******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/GatherNd.js ***! - \******************************************************************************/ -/*! exports provided: gatherNd, gatherNdConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"gatherNd",(function(){return a})),n.d(t,"gatherNdConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../gather_nd_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/gather_nd_gpu.js"),r=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"),i=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); +function r(e,t,n,o,r){const i=s.slice_util.isSliceContinous(o,t,n),a=s.util.sizeFromShape(n),u=s.util.computeStrides(o);if(i){const n=s.slice_util.computeFlatOffset(t,u);return"string"===r?e.slice(n,n+a):e.subarray(n,n+a)}const d="string"===r?s.backend_util.fromUint8ToStringArray(e):e,l=Object(s.buffer)(o,r,d),c=Object(s.buffer)(n,r);for(let e=0;ee+t[n]));c.set(l.get(...s),...n)}return"string"===r?s.backend_util.fromStringArrayToUint8(c.values):c.values}function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{begin:u,size:d}=i;Object(o.assertNotComplex)(a,"slice");const[l,c]=s.slice_util.parseSliceParams(a,u,d);s.slice_util.assertParamsValid(a,l,c);const f=r(n.data.get(a.dataId).values,l,c,a.shape,a.dtype);return n.makeTensorInfo(c,a.dtype,f)}const a={kernelName:s.Slice,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Softmax.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Softmax.js ***! + \***************************************************************************/ +/*! exports provided: softmax, softmaxConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"softmax",(function(){return l})),n.d(t,"softmaxConfig",(function(){return c}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Exp */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Exp.js"),r=n(/*! ./Max */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Max.js"),i=n(/*! ./RealDiv */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RealDiv.js"),a=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"),u=n(/*! ./Sub */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sub.js"),d=n(/*! ./Sum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sum.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -8678,32 +8658,32 @@ function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:d,filter:u,bias:l,preluActi * limitations under the License. * ============================================================================= */ -function a(e){const{inputs:t,backend:n}=e,{params:a,indices:d}=t,u=d.shape,l=u[u.length-1],c=s.util.sizeFromShape(a.shape),[f,p,m,h]=s.backend_util.prepareAndValidate(a,d),b=Object(i.reshape)({inputs:{x:d},backend:n,attrs:{shape:[p,l]}}),j=Object(i.reshape)({inputs:{x:a},backend:n,attrs:{shape:[s.util.sizeFromShape(a.shape)/m,m]}});if(n.shouldExecuteOnCPU([a,d])||"string"===a.dtype){const e=n.readSync(d.dataId),t=n.bufferSync(a),s=Object(r.gatherNdImplCPU)(e,t,a.dtype,p,l,m,h,a.shape,c);return n.makeTensorInfo(f,a.dtype,s.values)}const g=new o.GatherNDProgram(l,h,[p,m]),w=n.runWebGLProgram(g,[j,b],j.dtype),_=Object(i.reshape)({inputs:{x:w},backend:n,attrs:{shape:f}});return n.disposeIntermediateTensorInfo(b),n.disposeIntermediateTensorInfo(j),n.disposeIntermediateTensorInfo(w),_}const d={kernelName:s.GatherNd,backendName:"webgl",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/GatherV2.js": -/*!******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/GatherV2.js ***! - \******************************************************************************/ -/*! exports provided: gatherV2, gatherV2Config */function(e,t,n){"use strict";n.r(t),n.d(t,"gatherV2",(function(){return a})),n.d(t,"gatherV2Config",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../gather_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/gather_gpu.js"),r=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"),i=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); +function l(e){const{inputs:t,backend:n,attrs:l}=e,{logits:c}=t,{dim:f}=l,p=c.shape.length;let m=f;if(-1===m&&(m=p-1),m!==p-1)throw Error(`Softmax along a non-last dimension is not yet supported. Logits was rank ${p} and dim was ${m}`);const h=s.util.parseAxisParam([m],c.shape),b=Object(r.max)({inputs:{x:c},backend:n,attrs:{reductionIndices:h,keepDims:!1}}),j=s.backend_util.expandShapeToKeepDim(b.shape,h),g=Object(a.reshape)({inputs:{x:b},backend:n,attrs:{shape:j}}),w=Object(u.sub)({inputs:{a:c,b:g},backend:n}),_=Object(o.exp)({inputs:{x:w},backend:n}),k=Object(d.sum)({inputs:{x:_},backend:n,attrs:{axis:h,keepDims:!1}}),v=Object(a.reshape)({inputs:{x:k},backend:n,attrs:{shape:j}}),x=Object(i.div)({inputs:{a:_,b:v},backend:n});return n.disposeIntermediateTensorInfo(b),n.disposeIntermediateTensorInfo(g),n.disposeIntermediateTensorInfo(w),n.disposeIntermediateTensorInfo(_),n.disposeIntermediateTensorInfo(k),n.disposeIntermediateTensorInfo(v),x}const c={kernelName:s.Softmax,backendName:"cpu",kernelFunc:l}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Softplus.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Softplus.js ***! + \****************************************************************************/ +/*! exports provided: softplus, softplusConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"softplus",(function(){return i})),n.d(t,"softplusConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the "License"); + * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, + * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:d,indices:u}=t,{axis:l,batchDims:c}=a,f=s.util.parseAxisParam(l,d.shape)[0],p=s.backend_util.segment_util.collectGatherOpShapeInfo(d,u,f,c),m=s.util.sizeFromShape(u.shape),h=[],b=Object(i.reshape)({inputs:{x:d},backend:n,attrs:{shape:[p.batchSize,p.outerSize,p.dimSize,p.sliceSize]}}),j=Object(i.reshape)({inputs:{x:u},backend:n,attrs:{shape:[p.batchSize,m/p.batchSize]}});h.push(b),h.push(j);const g=[p.batchSize,p.outerSize,m/p.batchSize,p.sliceSize];if(n.shouldExecuteOnCPU([d,u])||"string"===d.dtype){const e=n.bufferSync(j),t=n.bufferSync(b),s=Object(r.gatherV2ImplCPU)(t,e,g);return h.forEach((e=>n.disposeIntermediateTensorInfo(e))),n.makeTensorInfo(p.outputShape,s.dtype,s.values)}const w=new o.GatherProgram(b.shape,g),_=n.runWebGLProgram(w,[b,j],b.dtype);h.push(_);const k=Object(i.reshape)({inputs:{x:_},backend:n,attrs:{shape:p.outputShape}});return h.forEach((e=>n.disposeIntermediateTensorInfo(e))),k}const d={kernelName:s.GatherV2,backendName:"webgl",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Greater.js": -/*!*****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Greater.js ***! - \*****************************************************************************/ -/*! exports provided: greater, greaterConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"greater",(function(){return i})),n.d(t,"greaterConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +const r=Math.log(1.1920928955078125e-7)+2,i=Object(o.unaryKernelFunc)(s.Softplus,(e=>{const t=e>-r,n=e b);",packedOpSnippet:"\n return vec4(greaterThan(a, b));\n",cpuKernelImpl:r.greaterImplCPU,dtype:"bool"}),a={kernelName:s.Greater,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/GreaterEqual.js": -/*!**********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/GreaterEqual.js ***! - \**********************************************************************************/ -/*! exports provided: greaterEqual, greaterEqualConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"greaterEqual",(function(){return i})),n.d(t,"greaterEqualConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +function u(e){const{inputs:t,backend:n,attrs:u}=e,{x:d}=t,{blockShape:l,paddings:c}=u;Object(o.assertNotComplex)([d],"spaceToBatchND");const f=s.util.sizeFromShape(l),p=[[0,0]];p.push(...c);for(let e=1+l.length;e b);",packedOpSni * limitations under the License. * ============================================================================= */ -const i=Object(o.binaryKernelFunc)({opSnippet:"return float(a >= b);",packedOpSnippet:"\n return vec4(greaterThanEqual(a, b));\n",dtype:"bool",cpuKernelImpl:r.greaterEqualImplCPU}),a={kernelName:s.GreaterEqual,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/IFFT.js": -/*!**************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/IFFT.js ***! - \**************************************************************************/ -/*! exports provided: ifft, ifftConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"ifft",(function(){return r})),n.d(t,"ifftConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./FFT_impl */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FFT_impl.js"); +function r(e){const{inputs:t,backend:n}=e,{indices:s,values:r,denseShape:i,defaultValue:a}=t;if(1!==i.shape.length)throw new Error(`Dense shape must be a vector, saw:\n ${i.shape}`);if(2!==s.shape.length)throw new Error(`Indices must be a matrix, saw:\n ${s.shape}`);if(1!==r.shape.length)throw new Error(`Values must be a vector, saw:\n ${r.shape}`);if(0!==a.shape.length)throw new Error(`Default value must be a scalar, saw:\n ${a.shape}`);const u=n.data.get(s.dataId).values,d=n.data.get(r.dataId).values,l=n.data.get(i.dataId).values,c=n.data.get(a.dataId).values[0],[f,p,m,h,b]=Object(o.sparseFillEmptyRowsImpl)(u,s.shape,s.dtype,d,r.dtype,l,c);return[n.makeTensorInfo(p,s.dtype,f),n.makeTensorInfo([p[0]],r.dtype,m),n.makeTensorInfo([h.length],"bool",new Uint8Array(h.map((e=>Number(e))))),n.makeTensorInfo([b.length],s.dtype,new Int32Array(b))]}const i={kernelName:s.SparseFillEmptyRows,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseFillEmptyRows_impl.js": +/*!********************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseFillEmptyRows_impl.js ***! + \********************************************************************************************/ +/*! exports provided: sparseFillEmptyRowsImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"sparseFillEmptyRowsImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2021 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -8761,15 +8741,14 @@ const i=Object(o.binaryKernelFunc)({opSnippet:"return float(a >= b);",packedOpSn * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -function r(e){const{inputs:t,backend:n}=e,{input:s}=t;return Object(o.fftImpl)(s,!0,n)}const i={kernelName:s.IFFT,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js": -/*!******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js ***! - \******************************************************************************/ -/*! exports provided: identity, identityConfig */function(e,t,n){"use strict"; + */function o(e,t,n,o,r,i,a){const u=t[0],d=i[0],l=new Array(d),c=new Array(u),f=t[1];if(0===d){if(0!==u)throw new Error(`Received SparseTensor with denseShape[0] = 0 but\n indices.shape[0] = ${u}`);return[s.util.getArrayFromDType(n,0),[0,f],s.util.getArrayFromDType(r,0),l,c]}let p=!0,m=0;const h=new Array(d).fill(0);for(let t=0;t=d)throw new Error(`indices(${t}, 0) is invalid: ${n} >= ${d}`);++h[n],p=p&&n>=m,m=n}let b=!0;for(let e=0;e0&&(h[e]+=h[e-1])}if(b&&p){const t=e,n=o;for(let e=0;e0){m[p-1]=1;for(let e=p-2;e>=0;--e)m[e]=m[e+1]*o[e+1]}const h=[];if(u>0){h[u-1]=1;for(let e=u-2;e>=0;--e)h[e]=h[e+1]*d[e+1]}const b=s.util.getArrayFromDType(n,a*u);for(let t=0;t0?r[u-1]+1:0;if(c<0)throw new Error("segment ids must be >= 0");const f=t.slice();f[0]=c;const p=f.reduce(((e,t)=>e*t),1),m=s.util.getArrayFromDType(n,p);if(0===u)return c>0&&m.fill(a),[m,f];if(c<=0)throw new Error("segment ids must be >= 0");let h=0,b=1,j=0,g=r[h];for(;;){let t=0;if(b=t)throw new Error("segment ids are not increasing")}if(g<0||g>=c)throw new Error(`Segment id ${g} out of range [0, ${c}), possibly because segmentIds input is not sorted.`);g>j&&m.fill(a,j*l,g*l);for(let t=h;t=d[0])throw new Error(`Bad: indices[${t}] == ${o[t]} out of range [0, ${d[0]})`);for(let t=0;tu)break}return j{const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{depthRadius:d,bias:u,alpha:l,beta:c}=i,f=Object(s.env)().getBool("WEBGL_PACK_NORMALIZATION")?new r.LRNPackedProgram(a.shape,d,u,l,c):new o.LRNProgram(a.shape,d,u,l,c);return n.runWebGLProgram(f,[a],a.dtype)},a={kernelName:s.LRN,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LRNGrad.js": -/*!*****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LRNGrad.js ***! - \*****************************************************************************/ -/*! exports provided: lrnGrad, LRNGradConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"lrnGrad",(function(){return r})),n.d(t,"LRNGradConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../lrn_grad_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/lrn_grad_gpu.js"); +function r(e){const{inputs:t,backend:n,attrs:r}=e,{sparseIndices:i,sparseValues:a,defaultValue:u}=t,{outputShape:d}=r,{sliceRank:l,numUpdates:c,sliceSize:f,strides:p,outputSize:m}=s.backend_util.calculateShapes(a,i,d),h=n.bufferSync(i),b=n.bufferSync(a),j=n.data.get(u.dataId).values[0],g=Object(o.scatterImpl)(h,b,d,m,f,c,l,p,j,!1);return n.makeTensorInfo(d,g.dtype,g.values)}const i={kernelName:s.SparseToDense,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SplitV.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SplitV.js ***! + \**************************************************************************/ +/*! exports provided: splitV, splitVConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"splitV",(function(){return r})),n.d(t,"splitVConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Slice */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Slice.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -8909,35 +8886,35 @@ const i=e=>{const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{depthRadius:d,bias:u,al * limitations under the License. * ============================================================================= */ -const r=e=>{const{inputs:t,backend:n,attrs:s}=e,{x:r,y:i,dy:a}=t,{depthRadius:d,bias:u,alpha:l,beta:c}=s,f=new o.LRNGradProgram(r.shape,d,u,l,c);return n.runWebGLProgram(f,[r,i,a],r.dtype)},i={kernelName:s.LRNGrad,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LeakyRelu.js": -/*!*******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LeakyRelu.js ***! - \*******************************************************************************/ -/*! exports provided: LEAKYRELU, LEAKYRELU_PACKED, leakyRelu, leakyReluConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"LEAKYRELU",(function(){return i})),n.d(t,"LEAKYRELU_PACKED",(function(){return a})),n.d(t,"leakyRelu",(function(){return d})),n.d(t,"leakyReluConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../binaryop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_gpu.js"),r=n(/*! ../binaryop_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_packed_gpu.js"); +function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i}=t,{numOrSizeSplits:a,axis:u}=r,d=s.util.parseAxisParam(u,i.shape)[0],l=s.backend_util.prepareSplitSize(i,a,d),c=new Array(i.shape.length).fill(0),f=i.shape.slice();return l.map((e=>{const t=[...f];t[d]=e;const s=Object(o.slice)({inputs:{x:i},backend:n,attrs:{begin:c,size:t}});return c[d]+=e,s}))}const i={kernelName:s.SplitV,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sqrt.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sqrt.js ***! + \************************************************************************/ +/*! exports provided: sqrt, sqrtConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sqrt",(function(){return r})),n.d(t,"sqrtConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the "License"); + * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, + * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -const i="return (a < 0.) ? b * a : a;",a="\n vec4 aLessThanZero = vec4(lessThan(a, vec4(0.)));\n return (aLessThanZero * (b * a)) + ((vec4(1.0) - aLessThanZero) * a);\n";function d(e){const{inputs:t,backend:n,attrs:d}=e,{x:u}=t,{alpha:l}=d,c=n.makeTensorInfo([],"float32",s.util.createScalarValue(l,"float32")),f=Object(s.env)().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new r.BinaryOpPackedProgram(a,u.shape,c.shape):new o.BinaryOpProgram(i,u.shape,c.shape),p=n.runWebGLProgram(f,[u,c],u.dtype);return n.disposeIntermediateTensorInfo(c),p}const u={kernelName:s.LeakyRelu,backendName:"webgl",kernelFunc:d}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Less.js": +const r=Object(o.unaryKernelFunc)(s.Sqrt,(e=>Math.sqrt(e))),i={kernelName:s.Sqrt,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Square.js": /*!**************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Less.js ***! + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Square.js ***! \**************************************************************************/ -/*! exports provided: less, lessConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"less",(function(){return i})),n.d(t,"lessConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/*! exports provided: squareConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"squareConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -8951,11 +8928,11 @@ const i="return (a < 0.) ? b * a : a;",a="\n vec4 aLessThanZero = vec4(lessThan * limitations under the License. * ============================================================================= */ -const i=Object(o.binaryKernelFunc)({opSnippet:"return float(a < b);",packedOpSnippet:"\n return vec4(lessThan(a, b));\n",cpuKernelImpl:r.lessImplCPU,dtype:"bool"}),a={kernelName:s.Less,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LessEqual.js": -/*!*******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LessEqual.js ***! - \*******************************************************************************/ -/*! exports provided: LESS_EQUAL, LESS_EQUAL_PACKED, lessEqual, lessEqualConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"LESS_EQUAL",(function(){return i})),n.d(t,"LESS_EQUAL_PACKED",(function(){return a})),n.d(t,"lessEqual",(function(){return d})),n.d(t,"lessEqualConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +const r={kernelName:s.Square,backendName:"cpu",kernelFunc:({inputs:e,backend:t})=>{const{x:n}=e,s=t;Object(o.assertNotComplex)(n,"square");const r=s.data.get(n.dataId).values,i=new Float32Array(r.length);for(let e=0;e{const n=e-t;return n*n})),a=Object(r.binaryKernelFunc)(s.SquaredDifference,i),u={kernelName:s.SquaredDifference,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Step.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Step.js ***! + \************************************************************************/ +/*! exports provided: step, stepConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"step",(function(){return r})),n.d(t,"stepConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the "License"); + * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, + * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -function r(e){const{backend:t,attrs:n}=e,{start:s,stop:r,num:i}=n,a=Object(o.linSpaceImplCPU)(s,r,i);return t.makeTensorInfo([a.length],"float32",a)}const i={kernelName:s.LinSpace,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Log.js": -/*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Log.js ***! - \*************************************************************************/ -/*! exports provided: log, logConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"log",(function(){return i})),n.d(t,"logConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +const r=Object(o.unaryKernelFunc)(s.Step,((e,t)=>{const n=t;return isNaN(e)?NaN:e>0?1:n.alpha})),i={kernelName:s.Step,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StridedSlice.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StridedSlice.js ***! + \********************************************************************************/ +/*! exports provided: stridedSlice, stridedSliceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"stridedSlice",(function(){return u})),n.d(t,"stridedSliceConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"),i=n(/*! ./Slice */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Slice.js"),a=n(/*! ./StridedSlice_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StridedSlice_impl.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -9014,11 +8991,11 @@ function r(e){const{backend:t,attrs:n}=e,{start:s,stop:r,num:i}=n,a=Object(o.lin * limitations under the License. * ============================================================================= */ -const i=Object(o.unaryKernelFunc)({opSnippet:"if (x < 0.0) return NAN;\n return log(x);",packedOpSnippet:"\n vec4 result = log(x);\n vec4 isNaN = vec4(lessThan(x, vec4(0.0)));\n result.r = isNaN.r == 1.0 ? NAN : result.r;\n result.g = isNaN.g == 1.0 ? NAN : result.g;\n result.b = isNaN.b == 1.0 ? NAN : result.b;\n result.a = isNaN.a == 1.0 ? NAN : result.a;\n\n return result;\n",cpuKernelImpl:r.logImplCPU}),a={kernelName:s.Log,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Log1p.js": -/*!***************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Log1p.js ***! - \***************************************************************************/ -/*! exports provided: log1p, log1pConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"log1p",(function(){return r})),n.d(t,"log1pConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +function u(e){const{inputs:t,backend:n,attrs:u}=e,{x:d}=t,{begin:l,end:c,strides:f,beginMask:p,endMask:m,ellipsisMask:h,newAxisMask:b,shrinkAxisMask:j}=u;Object(o.assertNotComplex)(d,"stridedSlice");const{nonStrided:g,$begin:w,$strides:_,size:k,newShape:v,outShape:x}=s.slice_util.sliceInfo(d.shape,l,c,f,p,m,h,b,j),y=Object(r.reshape)({inputs:{x:d},backend:n,attrs:{shape:v}});let O;if(g){const e=Object(i.slice)({inputs:{x:y},backend:n,attrs:{begin:w,size:k}});O=Object(r.reshape)({inputs:{x:e},backend:n,attrs:{shape:x}}),n.disposeIntermediateTensorInfo(e)}else if(x.some((e=>0===e)))O=n.makeTensorInfo(x,d.dtype,[]);else{const e=n.bufferSync(y),t=Object(a.stridedSliceImpl)(x,e,_,w);O=n.makeTensorInfo(t.shape,t.dtype,t.values)}const I=Object(r.reshape)({inputs:{x:O},backend:n,attrs:{shape:x}});return n.disposeIntermediateTensorInfo(y),n.disposeIntermediateTensorInfo(O),I}const d={kernelName:s.StridedSlice,backendName:"cpu",kernelFunc:u}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StridedSlice_impl.js": +/*!*************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StridedSlice_impl.js ***! + \*************************************************************************************/ +/*! exports provided: stridedSliceImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"stridedSliceImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -9034,15 +9011,14 @@ const i=Object(o.unaryKernelFunc)({opSnippet:"if (x < 0.0) return NAN;\n return * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -const r=Object(o.unaryKernelFunc)({opSnippet:"return log(1.0 + x);"}),i={kernelName:s.Log1p,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LogicalAnd.js": + */function o(e,t,n,o){const r=Object(s.buffer)(e,t.dtype);for(let e=0;e= 1.0 && b >= 1.0);",packedOpSnippet:"\n return vec4(\n vec4(greaterThanEqual(a, vec4(1.0))) *\n vec4(greaterThanEqual(b, vec4(1.0))));\n",dtype:"bool"}),i={kernelName:s.LogicalAnd,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LogicalNot.js": -/*!********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LogicalNot.js ***! - \********************************************************************************/ -/*! exports provided: logicalNot, logicalNotConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"logicalNot",(function(){return r})),n.d(t,"logicalNotConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +function r(e){const{inputs:t,backend:n,attrs:s}=e,{separator:r,nGramWidths:i,leftPad:a,rightPad:u,padWidth:d,preserveShortSequences:l}=s,{data:c,dataSplits:f}=t,p=n.data.get(c.dataId).values,m=n.data.get(f.dataId).values,[h,b]=Object(o.stringNGramsImpl)(p,m,r,i,a,u,d,l);return[n.makeTensorInfo([h.length],"string",h),n.makeTensorInfo(f.shape,"int32",b)]}const i={kernelName:s.StringNGrams,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringNGrams_impl.js": +/*!*************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringNGrams_impl.js ***! + \*************************************************************************************/ +/*! exports provided: stringNGramsImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"stringNGramsImpl",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2021 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -9076,15 +9052,14 @@ const r=Object(o.binaryKernelFunc)({opSnippet:"return float(a >= 1.0 && b >= 1.0 * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -const r=Object(o.unaryKernelFunc)({opSnippet:"return float(!(x >= 1.0));"}),i={kernelName:s.LogicalNot,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LogicalOr.js": + */class o{constructor(e,t,n,o,r,i){this.separator=s.util.encodeString(e),this.nGramWidths=t,this.leftPad=s.util.encodeString(n),this.rightPad=s.util.encodeString(o),this.padWidth=r,this.preserveShort=i}getPadWidth(e){return Math.min(this.padWidth<0?e-1:this.padWidth,e-1)}getNumNGrams(e,t){const n=this.getPadWidth(t);return Math.max(0,e+2*n-t+1)}createNGrams(e,t,n,s,o,r){for(let i=0;i0?0:i-a);let f=0;f+=u*this.leftPad.length;for(let t=0;te.forEach((e=>p[m++]=e));for(let e=0;e0){h(e[c+l-1]);for(let e=0;e0){let e=t[0];if(0!==e)throw new Error(`First split value must be 0, got ${e}`);for(let s=1;s=e;if(o=o&&t[s]<=n,!o)throw new Error(`Invalid split value ${t[s]}, must be in [${e}, ${n}]`);e=t[s]}if(e!==n)throw new Error(`Last split value must be data size. Expected ${n}, got ${e}`)}const r=o-1,i=s.util.getArrayFromDType("int32",o);if(0===n||0===o){const e=new Array(n);for(let e=0;e<=r;++e)i[e]=0;return[e,i]}i[0]=0;for(let e=1;e<=r;++e){const n=t[e]-t[e-1];let s=0;this.nGramWidths.forEach((e=>{s+=this.getNumNGrams(n,e)})),this.preserveShort&&n>0&&0===s&&(s=1),i[e]=i[e-1]+s}const a=new Array(i[r]);for(let n=0;n{const i=t[n+1]-t[n],u=this.getNumNGrams(i,r);this.createNGrams(e,s,a,o,u,r),o+=u})),this.preserveShort&&o===i[n]){const r=t[n+1]-t[n];if(0===r)continue;const i=r+2*this.padWidth,u=1;this.createNGrams(e,s,a,o,u,i)}}return[a,i]}}function r(e,t,n,s,r,i,a,u){return new o(n,s,r,i,a,u).compute(e,t)}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringSplit.js": /*!*******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LogicalOr.js ***! + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringSplit.js ***! \*******************************************************************************/ -/*! exports provided: logicalOr, logicalOrConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"logicalOr",(function(){return r})),n.d(t,"logicalOrConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/*! exports provided: stringSplit, stringSplitConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"stringSplit",(function(){return r})),n.d(t,"stringSplitConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./StringSplit_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringSplit_impl.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2021 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -9098,14 +9073,14 @@ const r=Object(o.unaryKernelFunc)({opSnippet:"return float(!(x >= 1.0));"}),i={k * limitations under the License. * ============================================================================= */ -const r=Object(o.binaryKernelFunc)({opSnippet:"return float(a >= 1.0 || b >= 1.0);",packedOpSnippet:"\n return min(\n vec4(greaterThanEqual(a, vec4(1.0))) +\n vec4(greaterThanEqual(b, vec4(1.0))),\n vec4(1.0));\n",dtype:"bool"}),i={kernelName:s.LogicalOr,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Max.js": -/*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Max.js ***! - \*************************************************************************/ -/*! exports provided: max, maxConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"max",(function(){return a})),n.d(t,"maxConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"),r=n(/*! ./Max_impl */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Max_impl.js"),i=n(/*! ./Transpose_impl */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose_impl.js"); +function r(e){const{inputs:t,backend:n,attrs:s}=e,{skipEmpty:r}=s,{input:i,delimiter:a}=t;if("string"!==i.dtype)throw new Error("Input must be of datatype string");if(1!==i.shape.length)throw new Error(`Input must be a vector, got shape: ${i.shape}`);if(0!==a.shape.length)throw new Error(`Delimiter must be a scalar, got shape: ${a.shape}`);const u=n.data.get(i.dataId).values,d=n.data.get(a.dataId).values[0],[l,c,f]=Object(o.stringSplitImpl)(u,d,r),p=c.length;return[n.makeTensorInfo([p,2],"int32",l),n.makeTensorInfo([p],"string",c),n.makeTensorInfo([2],"int32",new Int32Array(f))]}const i={kernelName:s.StringSplit,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringSplit_impl.js": +/*!************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringSplit_impl.js ***! + \************************************************************************************/ +/*! exports provided: stringSplitImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"stringSplitImpl",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2021 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -9118,15 +9093,14 @@ const r=Object(o.binaryKernelFunc)({opSnippet:"return float(a >= 1.0 || b >= 1.0 * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:d}=t,{reductionIndices:u,keepDims:l}=a,c=d.shape.length,f=s.util.parseAxisParam(u,d.shape);let p=f;const m=s.backend_util.getAxesPermutation(p,c),h=null!=m,b=n.shouldExecuteOnCPU([d]);let j=d;if(h){if(b){const e=n.texData.get(j.dataId).values,t=new Array(c);for(let e=0;e`Error in maxPool: Either strides or dilations must be 1. Got strides ${l} and dilations '1'`));const p=s.backend_util.computePool2DInfo(d.shape,u,l,1,c,f);if(1===p.filterWidth&&1===p.filterHeight&&s.util.arraysEqual(p.inShape,p.outShape))return Object(i.identity)({inputs:{x:d},backend:n});const m=new o.Pool2DProgram(p,"max",!1);return n.runWebGLProgram(m,[d],d.dtype)}const d={kernelName:s.MaxPool,backendName:"webgl",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPool3D.js": -/*!*******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPool3D.js ***! - \*******************************************************************************/ -/*! exports provided: maxPool3d, maxPool3DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPool3d",(function(){return r})),n.d(t,"maxPool3DConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../pool_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/pool_gpu.js"); +function r(e){const{inputs:t,backend:n,attrs:s}=e,{numBuckets:r}=s,{input:i}=t;if("string"!==i.dtype)throw new Error("Input must be of datatype string");if(r<=0)throw new Error("Number of buckets must be at least 1");const a=n.data.get(i.dataId).values,u=Object(o.stringToHashBucketFastImpl)(a,r);return n.makeTensorInfo(i.shape,"int32",u)}const i={kernelName:s.StringToHashBucketFast,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringToHashBucketFast_impl.js": +/*!***********************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringToHashBucketFast_impl.js ***! + \***********************************************************************************************/ +/*! exports provided: stringToHashBucketFastImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"stringToHashBucketFastImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2021 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -9160,12 +9134,11 @@ function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:d}=t;Object(r.assertNotComp * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i}=t,{filterSize:a,strides:d,pad:u,dataFormat:l,dimRoundingMode:c}=r,f=s.backend_util.computePool3DInfo(i.shape,a,d,[1,1,1],u,c,l),p=new o.Pool3DProgram(f,"max",!1);return n.runWebGLProgram(p,[i],i.dtype)}const i={kernelName:s.MaxPool3D,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPool3DGrad.js": -/*!***********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPool3DGrad.js ***! - \***********************************************************************************/ -/*! exports provided: maxPool3DGrad, maxPoolGrad3DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPool3DGrad",(function(){return i})),n.d(t,"maxPoolGrad3DConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../max_pool_backprop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/max_pool_backprop_gpu.js"),r=n(/*! ../pool_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/pool_gpu.js"); + */function o(e,t){const n=s.util.getArrayFromDType("int32",e.length);for(let o=0;oe-t)),a=Object(r.createComplexBinaryKernelImpl)(((e,t,n,s)=>({real:e-n,imag:t-s}))),u=Object(r.binaryKernelFunc)(s.Sub,i,a),d={kernelName:s.Sub,backendName:"cpu",kernelFunc:u}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sum.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sum.js ***! + \***********************************************************************/ +/*! exports provided: sum, sumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sum",(function(){return l})),n.d(t,"sumConfig",(function(){return c}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ../utils/zeros_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/zeros_impl.js"),i=n(/*! ./Cast */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cast.js"),a=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Identity.js"),u=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"),d=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -9203,52 +9176,53 @@ function i(e){const{inputs:t,backend:n,attrs:i}=e,{dy:a,input:d}=t,u=d,{filterSi * limitations under the License. * ============================================================================= */ -function a(e){const{inputs:t,backend:n,attrs:a}=e,{dy:d,input:u,output:l}=t,c=u;Object(i.assertNotComplex)([u,l],"maxPoolGrad");const{filterSize:f,strides:p,pad:m,dimRoundingMode:h}=a,b=s.backend_util.computePool2DInfo(c.shape,f,p,1,m,h),j=new r.Pool2DProgram(b,"max",!0),g=n.runWebGLProgram(j,[c],c.dtype),w=new o.MaxPool2DBackpropProgram(b),_=n.runWebGLProgram(w,[d,g],c.dtype);return n.disposeIntermediateTensorInfo(g),_}const d={kernelName:s.MaxPoolGrad,backendName:"webgl",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolWithArgmax.js": -/*!***************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolWithArgmax.js ***! - \***************************************************************************************/ -/*! exports provided: maxPoolWithArgmaxConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPoolWithArgmaxConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./MaxPoolWithArgmax_impl */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolWithArgmax_impl.js"); +function l(e){const{inputs:t,backend:n,attrs:l}=e,{x:c}=t,{axis:f,keepDims:p}=l;let m;Object(o.assertNotComplex)(c,"sum"),m="bool"===c.dtype?Object(i.cast)({inputs:{x:c},backend:n,attrs:{dtype:"int32"}}):Object(a.identity)({inputs:{x:c},backend:n});const h=m.shape.length,b=s.util.parseAxisParam(f,m.shape),j=s.backend_util.getAxesPermutation(b,h);let g=b,w=m;null!=j&&(w=Object(d.transpose)({inputs:{x:m},backend:n,attrs:{perm:j}}),g=s.backend_util.getInnerMostAxes(g.length,h)),s.backend_util.assertAxesAreInnerMostDims("sum",g,w.shape.length);const[_,k]=s.backend_util.computeOutAndReduceShapes(w.shape,g),v=s.backend_util.upcastType(w.dtype,"int32");let x=Object(r.zeros)(n,_,v);const y=s.util.sizeFromShape(k),O=n.data.get(x.dataId).values,I=n.data.get(w.dataId).values;for(let e=0;e{const{x:r}=e,{filterSize:i,strides:a,pad:d,includeBatchInIndex:u}=t,l=n;s.util.assert(4===r.shape.length,(()=>`Error in maxPool: input must be rank 4 but got rank ${r.shape.length}.`));const c=[1,1];s.util.assert(s.backend_util.eitherStridesOrDilationsAreOne(a,c),(()=>`Error in maxPool: Either strides or dilations must be 1. Got strides ${a} and dilations '${c}'`));const f=s.backend_util.computePool2DInfo(r.shape,i,a,c,d),[p,m]=Object(o.maxPoolWithArgmaxImpl)(r,u,f,l);return[p,m]}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolWithArgmax_impl.js": -/*!********************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolWithArgmax_impl.js ***! - \********************************************************************************************/ -/*! exports provided: maxPoolWithArgmaxImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPoolWithArgmaxImpl",(function(){return o}));var s=n(/*! ../pool_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/pool_gpu.js"); +const r=Object(o.unaryKernelFunc)(s.Tan,(e=>Math.tan(e))),i={kernelName:s.Tan,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tanh.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tanh.js ***! + \************************************************************************/ +/*! exports provided: tanh, tanhConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"tanh",(function(){return r})),n.d(t,"tanhConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the "License"); + * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, + * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */function o(e,t,n,o){let r=new s.Pool2DProgram(n,"max",!1);const i=o.runWebGLProgram(r,[e],"float32");r=new s.Pool2DProgram(n,"max",!0,!0,t);return[i,o.runWebGLProgram(r,[e],"float32")]}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Max_impl.js": -/*!******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Max_impl.js ***! - \******************************************************************************/ -/*! exports provided: maxImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"maxImpl",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/reduce */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/reduce.js"),r=n(/*! ../kernels/Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); + */ +const r=Object(o.unaryKernelFunc)(s.Tanh,(e=>Math.tanh(e))),i={kernelName:s.Tanh,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tile.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tile.js ***! + \************************************************************************/ +/*! exports provided: tile, tileConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"tile",(function(){return i})),n.d(t,"tileConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./Tile_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tile_impl.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -9265,14 +9239,14 @@ const r={kernelName:s.MaxPoolWithArgmax,backendName:"webgl",kernelFunc:({inputs: * limitations under the License. * ============================================================================= */ -function i(e,t,n,i){const a=s.util.sizeFromShape(t),d=s.util.sizeFromShape(e.shape)/a,u=Object(r.reshape)({inputs:{x:e},attrs:{shape:[d,a]},backend:i}),l=Object(o.reduce)(u,e.dtype,"max",i),c=Object(r.reshape)({inputs:{x:l},attrs:{shape:n},backend:i});return i.disposeIntermediateTensorInfo(u),i.disposeIntermediateTensorInfo(l),c}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Maximum.js": +function i(e){const{inputs:t,backend:n,attrs:s}=e,{x:i}=t,{reps:a}=s;Object(o.assertNotComplex)(i,"tile");const u=Object(r.tileImpl)(n.bufferSync(i),a);return n.makeTensorInfo(u.shape,u.dtype,u.values)}const a={kernelName:s.Tile,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tile_impl.js": /*!*****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Maximum.js ***! + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tile_impl.js ***! \*****************************************************************************/ -/*! exports provided: maximum, maximumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maximum",(function(){return l})),n.d(t,"maximumConfig",(function(){return c}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../binaryop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_gpu.js"),r=n(/*! ../binaryop_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_packed_gpu.js"),i=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),a=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/*! exports provided: tileImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"tileImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -9285,12 +9259,11 @@ function i(e,t,n,i){const a=s.util.sizeFromShape(t),d=s.util.sizeFromShape(e.sha * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -const d=o.CHECK_NAN_SNIPPET+"\n return max(a, b);\n",u="\n vec4 result = vec4(max(a, b));\n vec4 isNaN = min(vec4(isnan(a)) + vec4(isnan(b)), vec4(1.0));\n "+r.CHECK_NAN_SNIPPET+"\n return result;\n",l=Object(i.binaryKernelFunc)({opSnippet:d,packedOpSnippet:u,cpuKernelImpl:a.maximumImplCPU}),c={kernelName:s.Maximum,backendName:"webgl",kernelFunc:l}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Mean.js": -/*!**************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Mean.js ***! - \**************************************************************************/ -/*! exports provided: meanConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"meanConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Mean_impl */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Mean_impl.js"),r=n(/*! ./Transpose_impl */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose_impl.js"); + */function o(e,t){const n=new Array(e.rank);for(let s=0;s{const{x:i}=e,{keepDims:a,axis:d}=t,u=n,l=i.shape.length,c=s.util.parseAxisParam(d,i.shape);let f=c;const p=s.backend_util.getAxesPermutation(f,l),m=null!=p,h=u.shouldExecuteOnCPU([i]),b=[];let j=i;if(m){if(h){const e=u.texData.get(j.dataId).values,t=new Array(l);for(let e=0;e{const n=t.value-e.value;return 0===n?e.index-t.index:n};function r(e,t,n=0,i=e.length-1){for(;i>n;){if(i-n>600){const s=i-n+1,o=t-n+1,a=Math.log(s),u=.5*Math.exp(2*a/3),d=.5*Math.sqrt(a*u*(s-u)/s)*Math.sign(o-s/2);r(e,t,Math.max(n,Math.floor(t-o*u/s+d)),Math.min(i,Math.floor(t+(s-o)*u/s+d)))}const a=e[t];let u=n,d=i;for(s.util.swap(e,n,t),o(e[i],a)>0&&s.util.swap(e,n,i);u0;)d-=1}0===o(e[n],a)?s.util.swap(e,n,d):(d+=1,s.util.swap(e,d,i)),d<=t&&(n=d+1),t<=d&&(i=d-1)}}function i(e,t,n,i,a){const u=t[t.length-1],[d,l]=[e.length/u,u],c=s.util.getTypedArrayFromDType(n,d*i),f=s.util.getTypedArrayFromDType("int32",d*i);for(let t=0;tu[t]={value:e,index:t})),it-1)if(t<=1)n=0;else{const e=2*t;n-=e*Math.trunc(n/e),n>=t&&(n=e-n-1)}return s.util.clamp(0,n,t-1)}(e,t);case"wrap":return function(e,t){let n=e;if(n<0)if(t<=1)n=0;else{const e=t-1;n+=t*(Math.trunc(-n/e)+1)}else if(n>t-1)if(t<=1)n=0;else{const e=t-1;n-=t*Math.trunc(n/e)}return s.util.clamp(0,n,t-1)}(e,t);case"nearest":return function(e,t){return s.util.clamp(0,e,t-1)}(e,t);case"constant":default:return function(e,t){return e}(e)}}function a(e,t,n,s,o,r,i,a,u,d,l){return 0<=a&&a{for(let n=0;nn.disposeIntermediateTensorInfo(e))),w}const f={kernelName:s.UnsortedSegmentSum,backendName:"cpu",kernelFunc:c}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ZerosLike.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ZerosLike.js ***! + \*****************************************************************************/ +/*! exports provided: zerosLike, zerosLikeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"zerosLike",(function(){return u})),n.d(t,"zerosLikeConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Complex */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Complex.js"),r=n(/*! ./Fill */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Fill.js"),i=n(/*! ./Imag */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Imag.js"),a=n(/*! ./Real */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Real.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -9495,31 +9464,33 @@ const a="return -x;";function d(e){const{inputs:t,backend:n}=e,{x:d}=t;if(n.shou * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */const o=s.kernel_impls.nonMaxSuppressionV3Impl;function r(e){s.backend_util.warn("tf.nonMaxSuppression() in webgl locks the UI thread. Call tf.nonMaxSuppressionAsync() instead");const{inputs:t,backend:n,attrs:r}=e,{boxes:i,scores:a}=t,{maxOutputSize:d,iouThreshold:u,scoreThreshold:l}=r,c=n.readSync(i.dataId),f=n.readSync(a.dataId),{selectedIndices:p}=o(c,f,d,u,l);return n.makeTensorInfo([p.length],"int32",new Int32Array(p))}const i={kernelName:s.NonMaxSuppressionV3,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV4.js": -/*!*****************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV4.js ***! - \*****************************************************************************************/ -/*! exports provided: nonMaxSuppressionV4, nonMaxSuppressionV4Config */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionV4",(function(){return r})),n.d(t,"nonMaxSuppressionV4Config",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); + */ +function u(e){const{inputs:t,backend:n}=e,{x:s}=t;if("string"===s.dtype)throw new Error("zerosLike is not supported for string tensors");if("complex64"===s.dtype){const e=Object(a.real)({inputs:{input:s},backend:n}),t=u({inputs:{x:e},backend:n}),r=Object(i.imag)({inputs:{input:s},backend:n}),d=u({inputs:{x:r},backend:n}),l=Object(o.complex)({inputs:{real:t,imag:d},backend:n});return n.disposeIntermediateTensorInfo(e),n.disposeIntermediateTensorInfo(t),n.disposeIntermediateTensorInfo(r),n.disposeIntermediateTensorInfo(d),l}return Object(r.fill)({backend:n,attrs:{shape:s.shape,value:0,dtype:s.dtype}})}const d={kernelName:s.ZerosLike,backendName:"cpu",kernelFunc:u}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/_FusedMatMul.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/_FusedMatMul.js ***! + \********************************************************************************/ +/*! exports provided: _fusedMatMul, _fusedMatMulConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"_fusedMatMul",(function(){return a})),n.d(t,"_fusedMatMulConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/fused_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/fused_utils.js"),r=n(/*! ./Add */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Add.js"),i=n(/*! ./BatchMatMul */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchMatMul.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the "License"); + * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, + * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */const o=s.kernel_impls.nonMaxSuppressionV4Impl;function r(e){s.backend_util.warn("tf.nonMaxSuppression() in webgl locks the UI thread. Call tf.nonMaxSuppressionAsync() instead");const{inputs:t,backend:n,attrs:r}=e,{boxes:i,scores:a}=t,{maxOutputSize:d,iouThreshold:u,scoreThreshold:l,padToMaxOutputSize:c}=r,f=n.readSync(i.dataId),p=n.readSync(a.dataId),{selectedIndices:m,validOutputs:h}=o(f,p,d,u,l,c);return[n.makeTensorInfo([m.length],"int32",new Int32Array(m)),n.makeTensorInfo([],"int32",new Int32Array([h]))]}const i={kernelName:s.NonMaxSuppressionV4,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV5.js": -/*!*****************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV5.js ***! - \*****************************************************************************************/ -/*! exports provided: nonMaxSuppressionV5, nonMaxSuppressionV5Config */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionV5",(function(){return r})),n.d(t,"nonMaxSuppressionV5Config",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); + */ +function a(e){const{inputs:t,backend:n,attrs:s}=e,{a:a,b:u,bias:d,preluActivationWeights:l}=t,{transposeA:c,transposeB:f,activation:p,leakyreluAlpha:m}=s;let h,b,j;const g=[];h=Object(i.batchMatMul)({inputs:{a:a,b:u},attrs:{transposeA:c,transposeB:f},backend:n}),d&&(b=Object(r.add)({inputs:{a:h,b:d},backend:n}),g.push(h),h=b),p&&(j=Object(o.applyActivation)(n,h,p,l,m),g.push(h),h=j);for(const e of g)n.disposeIntermediateTensorInfo(e);return h}const u={kernelName:s._FusedMatMul,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/register_all_kernels.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/register_all_kernels.js ***! + \********************************************************************************/ +/*! no exports provided */function(e,t,n){"use strict";n.r(t);var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./kernels/_FusedMatMul */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/_FusedMatMul.js"),r=n(/*! ./kernels/Abs */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Abs.js"),i=n(/*! ./kernels/Acos */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Acos.js"),a=n(/*! ./kernels/Acosh */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Acosh.js"),u=n(/*! ./kernels/Add */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Add.js"),d=n(/*! ./kernels/AddN */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AddN.js"),l=n(/*! ./kernels/All */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/All.js"),c=n(/*! ./kernels/Any */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Any.js"),f=n(/*! ./kernels/ArgMax */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ArgMax.js"),p=n(/*! ./kernels/ArgMin */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ArgMin.js"),m=n(/*! ./kernels/Asin */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Asin.js"),h=n(/*! ./kernels/Asinh */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Asinh.js"),b=n(/*! ./kernels/Atan */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atan.js"),j=n(/*! ./kernels/Atan2 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atan2.js"),g=n(/*! ./kernels/Atanh */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atanh.js"),w=n(/*! ./kernels/AvgPool */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPool.js"),_=n(/*! ./kernels/AvgPool3D */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPool3D.js"),k=n(/*! ./kernels/AvgPool3DGrad */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPool3DGrad.js"),v=n(/*! ./kernels/AvgPoolGrad */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPoolGrad.js"),x=n(/*! ./kernels/BatchMatMul */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchMatMul.js"),y=n(/*! ./kernels/BatchNorm */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchNorm.js"),O=n(/*! ./kernels/BatchToSpaceND */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchToSpaceND.js"),I=n(/*! ./kernels/Bincount */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Bincount.js"),C=n(/*! ./kernels/Cast */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cast.js"),S=n(/*! ./kernels/Ceil */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Ceil.js"),T=n(/*! ./kernels/Clip */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Clip.js"),N=n(/*! ./kernels/Complex */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Complex.js"),E=n(/*! ./kernels/ComplexAbs */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ComplexAbs.js"),A=n(/*! ./kernels/Concat */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Concat.js"),R=n(/*! ./kernels/Conv2D */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv2D.js"),F=n(/*! ./kernels/Conv2DBackpropFilter */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv2DBackpropFilter.js"),M=n(/*! ./kernels/Conv2DBackpropInput */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv2DBackpropInput.js"),$=n(/*! ./kernels/Conv3D */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv3D.js"),D=n(/*! ./kernels/Conv3DBackpropFilterV2 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv3DBackpropFilterV2.js"),P=n(/*! ./kernels/Conv3DBackpropInputV2 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv3DBackpropInputV2.js"),B=n(/*! ./kernels/Cos */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cos.js"),L=n(/*! ./kernels/Cosh */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cosh.js"),z=n(/*! ./kernels/CropAndResize */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/CropAndResize.js"),G=n(/*! ./kernels/Cumsum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cumsum.js"),U=n(/*! ./kernels/DenseBincount */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DenseBincount.js"),W=n(/*! ./kernels/DepthToSpace */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DepthToSpace.js"),V=n(/*! ./kernels/DepthwiseConv2dNative */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DepthwiseConv2dNative.js"),q=n(/*! ./kernels/DepthwiseConv2dNativeBackpropFilter */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DepthwiseConv2dNativeBackpropFilter.js"),H=n(/*! ./kernels/DepthwiseConv2dNativeBackpropInput */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DepthwiseConv2dNativeBackpropInput.js"),K=n(/*! ./kernels/Diag */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Diag.js"),X=n(/*! ./kernels/Dilation2D */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Dilation2D.js"),Y=n(/*! ./kernels/Dilation2DBackpropFilter */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Dilation2DBackpropFilter.js"),Z=n(/*! ./kernels/Dilation2DBackpropInput */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Dilation2DBackpropInput.js"),Q=n(/*! ./kernels/Einsum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Einsum.js"),J=n(/*! ./kernels/Elu */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Elu.js"),ee=n(/*! ./kernels/EluGrad */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/EluGrad.js"),te=n(/*! ./kernels/Equal */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Equal.js"),ne=n(/*! ./kernels/Erf */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Erf.js"),se=n(/*! ./kernels/Exp */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Exp.js"),oe=n(/*! ./kernels/ExpandDims */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ExpandDims.js"),re=n(/*! ./kernels/Expm1 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Expm1.js"),ie=n(/*! ./kernels/FFT */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FFT.js"),ae=n(/*! ./kernels/Fill */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Fill.js"),ue=n(/*! ./kernels/FlipLeftRight */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FlipLeftRight.js"),de=n(/*! ./kernels/Floor */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Floor.js"),le=n(/*! ./kernels/FloorDiv */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FloorDiv.js"),ce=n(/*! ./kernels/FusedConv2D */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FusedConv2D.js"),fe=n(/*! ./kernels/FusedDepthwiseConv2D */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FusedDepthwiseConv2D.js"),pe=n(/*! ./kernels/GatherNd */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GatherNd.js"),me=n(/*! ./kernels/GatherV2 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GatherV2.js"),he=n(/*! ./kernels/Greater */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Greater.js"),be=n(/*! ./kernels/GreaterEqual */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GreaterEqual.js"),je=n(/*! ./kernels/Identity */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Identity.js"),ge=n(/*! ./kernels/IFFT */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IFFT.js"),we=n(/*! ./kernels/Imag */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Imag.js"),_e=n(/*! ./kernels/IsFinite */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsFinite.js"),ke=n(/*! ./kernels/IsInf */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsInf.js"),ve=n(/*! ./kernels/IsNaN */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsNaN.js"),xe=n(/*! ./kernels/LeakyRelu */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LeakyRelu.js"),ye=n(/*! ./kernels/Less */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Less.js"),Oe=n(/*! ./kernels/LessEqual */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LessEqual.js"),Ie=n(/*! ./kernels/LinSpace */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LinSpace.js"),Ce=n(/*! ./kernels/Log */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Log.js"),Se=n(/*! ./kernels/Log1p */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Log1p.js"),Te=n(/*! ./kernels/LogicalAnd */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalAnd.js"),Ne=n(/*! ./kernels/LogicalNot */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalNot.js"),Ee=n(/*! ./kernels/LogicalOr */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalOr.js"),Ae=n(/*! ./kernels/LRN */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LRN.js"),Re=n(/*! ./kernels/LRNGrad */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LRNGrad.js"),Fe=n(/*! ./kernels/Max */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Max.js"),Me=n(/*! ./kernels/Maximum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Maximum.js"),$e=n(/*! ./kernels/MaxPool */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPool.js"),De=n(/*! ./kernels/MaxPool3D */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPool3D.js"),Pe=n(/*! ./kernels/MaxPool3DGrad */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPool3DGrad.js"),Be=n(/*! ./kernels/MaxPoolGrad */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolGrad.js"),Le=n(/*! ./kernels/MaxPoolWithArgmax */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolWithArgmax.js"),ze=n(/*! ./kernels/Mean */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Mean.js"),Ge=n(/*! ./kernels/Min */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Min.js"),Ue=n(/*! ./kernels/Minimum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Minimum.js"),We=n(/*! ./kernels/MirrorPad */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MirrorPad.js"),Ve=n(/*! ./kernels/Mod */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Mod.js"),qe=n(/*! ./kernels/Multinomial */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Multinomial.js"),He=n(/*! ./kernels/Multiply */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Multiply.js"),Ke=n(/*! ./kernels/Neg */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Neg.js"),Xe=n(/*! ./kernels/NonMaxSuppressionV3 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV3.js"),Ye=n(/*! ./kernels/NonMaxSuppressionV4 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV4.js"),Ze=n(/*! ./kernels/NonMaxSuppressionV5 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV5.js"),Qe=n(/*! ./kernels/NotEqual */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NotEqual.js"),Je=n(/*! ./kernels/OneHot */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/OneHot.js"),et=n(/*! ./kernels/OnesLike */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/OnesLike.js"),tt=n(/*! ./kernels/Pack */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Pack.js"),nt=n(/*! ./kernels/PadV2 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/PadV2.js"),st=n(/*! ./kernels/Pow */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Pow.js"),ot=n(/*! ./kernels/Prelu */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Prelu.js"),rt=n(/*! ./kernels/Prod */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Prod.js"),it=n(/*! ./kernels/Range */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Range.js"),at=n(/*! ./kernels/Real */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Real.js"),ut=n(/*! ./kernels/RealDiv */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RealDiv.js"),dt=n(/*! ./kernels/Reciprocal */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reciprocal.js"),lt=n(/*! ./kernels/Relu */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Relu.js"),ct=n(/*! ./kernels/Relu6 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Relu6.js"),ft=n(/*! ./kernels/Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"),pt=n(/*! ./kernels/ResizeBilinear */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ResizeBilinear.js"),mt=n(/*! ./kernels/ResizeBilinearGrad */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ResizeBilinearGrad.js"),ht=n(/*! ./kernels/ResizeNearestNeighbor */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ResizeNearestNeighbor.js"),bt=n(/*! ./kernels/ResizeNearestNeighborGrad */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ResizeNearestNeighborGrad.js"),jt=n(/*! ./kernels/Reverse */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reverse.js"),gt=n(/*! ./kernels/RotateWithOffset */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RotateWithOffset.js"),wt=n(/*! ./kernels/Round */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Round.js"),_t=n(/*! ./kernels/Rsqrt */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Rsqrt.js"),kt=n(/*! ./kernels/ScatterNd */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ScatterNd.js"),vt=n(/*! ./kernels/Select */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Select.js"),xt=n(/*! ./kernels/Selu */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Selu.js"),yt=n(/*! ./kernels/Sigmoid */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sigmoid.js"),Ot=n(/*! ./kernels/Sign */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sign.js"),It=n(/*! ./kernels/Sin */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sin.js"),Ct=n(/*! ./kernels/Sinh */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sinh.js"),St=n(/*! ./kernels/Slice */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Slice.js"),Tt=n(/*! ./kernels/Softmax */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Softmax.js"),Nt=n(/*! ./kernels/Softplus */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Softplus.js"),Et=n(/*! ./kernels/SpaceToBatchND */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SpaceToBatchND.js"),At=n(/*! ./kernels/SparseFillEmptyRows */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseFillEmptyRows.js"),Rt=n(/*! ./kernels/SparseReshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseReshape.js"),Ft=n(/*! ./kernels/SparseSegmentMean */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseSegmentMean.js"),Mt=n(/*! ./kernels/SparseSegmentSum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseSegmentSum.js"),$t=n(/*! ./kernels/SparseToDense */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseToDense.js"),Dt=n(/*! ./kernels/SplitV */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SplitV.js"),Pt=n(/*! ./kernels/Sqrt */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sqrt.js"),Bt=n(/*! ./kernels/Square */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Square.js"),Lt=n(/*! ./kernels/SquaredDifference */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SquaredDifference.js"),zt=n(/*! ./kernels/Step */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Step.js"),Gt=n(/*! ./kernels/StridedSlice */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StridedSlice.js"),Ut=n(/*! ./kernels/StringNGrams */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringNGrams.js"),Wt=n(/*! ./kernels/StringSplit */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringSplit.js"),Vt=n(/*! ./kernels/StringToHashBucketFast */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringToHashBucketFast.js"),qt=n(/*! ./kernels/Sub */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sub.js"),Ht=n(/*! ./kernels/Sum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sum.js"),Kt=n(/*! ./kernels/Tan */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tan.js"),Xt=n(/*! ./kernels/Tanh */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tanh.js"),Yt=n(/*! ./kernels/Tile */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tile.js"),Zt=n(/*! ./kernels/TopK */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/TopK.js"),Qt=n(/*! ./kernels/Transform */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transform.js"),Jt=n(/*! ./kernels/Transpose */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose.js"),en=n(/*! ./kernels/Unique */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Unique.js"),tn=n(/*! ./kernels/Unpack */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Unpack.js"),nn=n(/*! ./kernels/UnsortedSegmentSum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/UnsortedSegmentSum.js"),sn=n(/*! ./kernels/ZerosLike */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ZerosLike.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -9535,11 +9506,16 @@ const a="return -x;";function d(e){const{inputs:t,backend:n}=e,{x:d}=t;if(n.shou * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */const o=s.kernel_impls.nonMaxSuppressionV5Impl;function r(e){s.backend_util.warn("tf.nonMaxSuppression() in webgl locks the UI thread. Call tf.nonMaxSuppressionAsync() instead");const{inputs:t,backend:n,attrs:r}=e,{boxes:i,scores:a}=t,{maxOutputSize:d,iouThreshold:u,scoreThreshold:l,softNmsSigma:c}=r,f=n.readSync(i.dataId),p=n.readSync(a.dataId),m=d,h=u,b=l,j=c,{selectedIndices:g,selectedScores:w}=o(f,p,m,h,b,j);return[n.makeTensorInfo([g.length],"int32",new Int32Array(g)),n.makeTensorInfo([w.length],"float32",new Float32Array(w))]}const i={kernelName:s.NonMaxSuppressionV5,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NotEqual.js": -/*!******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NotEqual.js ***! - \******************************************************************************/ -/*! exports provided: notEqual, notEqualConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"notEqual",(function(){return i})),n.d(t,"notEqualConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); + */ +const on=[o._fusedMatMulConfig,r.absConfig,i.acosConfig,a.acoshConfig,u.addConfig,d.addNConfig,l.allConfig,c.anyConfig,f.argMaxConfig,p.argMinConfig,m.asinConfig,h.asinhConfig,b.atanConfig,j.atan2Config,g.atanhConfig,w.avgPoolConfig,_.avgPool3DConfig,k.avgPool3DGradConfig,v.avgPoolGradConfig,x.batchMatMulConfig,y.batchNormConfig,O.batchToSpaceNDConfig,I.bincountConfig,C.castConfig,S.ceilConfig,T.clipConfig,N.complexConfig,E.complexAbsConfig,A.concatConfig,F.conv2DBackpropFilterConfig,M.conv2DBackpropInputConfig,R.conv2DConfig,D.conv3DBackpropFilterV2Config,P.conv3DBackpropInputV2Config,$.conv3DConfig,B.cosConfig,L.coshConfig,z.cropAndResizeConfig,G.cumsumConfig,U.denseBincountConfig,W.depthToSpaceConfig,V.depthwiseConv2dNativeConfig,q.depthwiseConv2dNativeBackpropFilterConfig,H.depthwiseConv2dNativeBackpropInputConfig,K.diagConfig,X.dilation2dConfig,Z.dilation2dBackpropInputConfig,Y.dilation2dBackpropFilterConfig,ut.realDivConfig,Q.einsumConfig,J.eluConfig,ee.eluGradConfig,te.equalConfig,ne.erfConfig,se.expConfig,oe.expandDimsConfig,re.expm1Config,ie.fftConfig,ae.fillConfig,ue.flipLeftRightConfig,de.floorConfig,le.floorDivConfig,ce.fusedConv2DConfig,fe.fusedDepthwiseConv2DConfig,pe.gatherNdConfig,me.gatherV2Config,he.greaterConfig,be.greaterEqualConfig,je.identityConfig,ge.ifftConfig,we.imagConfig,_e.isFiniteConfig,ke.isInfConfig,ve.isNaNConfig,xe.leakyReluConfig,ye.lessConfig,Oe.lessEqualConfig,Ie.linSpaceConfig,Ce.logConfig,Se.log1pConfig,Te.logicalAndConfig,Ne.logicalNotConfig,Ee.logicalOrConfig,Ae.lRNConfig,Re.lRNGradConfig,Me.maximumConfig,$e.maxPoolConfig,De.maxPool3DConfig,Pe.maxPool3DGradConfig,Be.maxPoolGradConfig,Le.maxPoolWithArgmaxConfig,Fe.maxConfig,ze.meanConfig,Ge.minConfig,Ue.minimumConfig,We.mirrorPadConfig,Ve.modConfig,qe.multinomialConfig,He.multiplyConfig,Ke.negConfig,Xe.nonMaxSuppressionV3Config,Ye.nonMaxSuppressionV4Config,Ze.nonMaxSuppressionV5Config,Qe.notEqualConfig,Je.oneHotConfig,et.onesLikeConfig,tt.packConfig,nt.padV2Config,st.powConfig,ot.preluConfig,rt.prodConfig,it.rangeConfig,at.realConfig,dt.reciprocalConfig,lt.reluConfig,ct.relu6Config,ft.reshapeConfig,pt.resizeBilinearConfig,mt.resizeBilinearGradConfig,ht.resizeNearestNeighborConfig,bt.resizeNearestNeighborGradConfig,jt.reverseConfig,gt.rotateWithOffsetConfig,wt.roundConfig,_t.rsqrtConfig,kt.scatterNdConfig,vt.selectConfig,xt.seluConfig,yt.sigmoidConfig,Ot.signConfig,It.sinConfig,Ct.sinhConfig,St.sliceConfig,Tt.softmaxConfig,Nt.softplusConfig,Et.spaceToBatchNDConfig,At.sparseFillEmptyRowsConfig,Rt.sparseReshapeConfig,Ft.sparseSegmentMeanConfig,Mt.sparseSegmentSumConfig,$t.sparseToDenseConfig,Dt.splitVConfig,Pt.sqrtConfig,Bt.squareConfig,Lt.squaredDifferenceConfig,zt.stepConfig,Gt.stridedSliceConfig,Ut.stringNGramsConfig,Wt.stringSplitConfig,Vt.stringToHashBucketFastConfig,qt.subConfig,Ht.sumConfig,Kt.tanConfig,Xt.tanhConfig,Yt.tileConfig,Zt.topKConfig,Jt.transposeConfig,Qt.transformConfig,en.uniqueConfig,tn.unpackConfig,nn.unsortedSegmentSumConfig,sn.zerosLikeConfig];for(const e of on)Object(s.registerKernel)(e)},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/shared.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/shared.js ***! + \******************************************************************/ +/*! exports provided: simpleAbsImpl, addImpl, bincountImpl, bincountReduceImpl, ceilImpl, concatImpl, equalImpl, expImpl, expm1Impl, floorImpl, gatherNdImpl, gatherV2Impl, greaterImpl, greaterEqualImpl, lessImpl, lessEqualImpl, linSpaceImpl, logImpl, maxImpl, maximumImpl, minimumImpl, multiplyImpl, negImpl, notEqualImpl, prodImpl, rangeImpl, rsqrtImpl, sliceImpl, sparseFillEmptyRowsImpl, sparseReshapeImpl, sparseSegmentReductionImpl, squaredDifferenceImpl, stridedSliceImpl, stringNGramsImpl, stringSplitImpl, stringToHashBucketFastImpl, subImpl, tileImpl, topKImpl, transposeImpl, uniqueImpl */function(e,t,n){"use strict";n.r(t);var s=n(/*! ./kernels/Abs */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Abs.js");n.d(t,"simpleAbsImpl",(function(){return s.simpleAbsImpl}));var o=n(/*! ./kernels/Add */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Add.js");n.d(t,"addImpl",(function(){return o.addImpl}));var r=n(/*! ./kernels/Bincount_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Bincount_impl.js");n.d(t,"bincountImpl",(function(){return r.bincountImpl})),n.d(t,"bincountReduceImpl",(function(){return r.bincountReduceImpl}));var i=n(/*! ./kernels/Ceil */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Ceil.js");n.d(t,"ceilImpl",(function(){return i.ceilImpl}));var a=n(/*! ./kernels/Concat_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Concat_impl.js");n.d(t,"concatImpl",(function(){return a.concatImpl}));var u=n(/*! ./kernels/Equal */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Equal.js");n.d(t,"equalImpl",(function(){return u.equalImpl}));var d=n(/*! ./kernels/Exp */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Exp.js");n.d(t,"expImpl",(function(){return d.expImpl}));var l=n(/*! ./kernels/Expm1 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Expm1.js");n.d(t,"expm1Impl",(function(){return l.expm1Impl}));var c=n(/*! ./kernels/Floor */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Floor.js");n.d(t,"floorImpl",(function(){return c.floorImpl}));var f=n(/*! ./kernels/GatherNd_Impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GatherNd_Impl.js");n.d(t,"gatherNdImpl",(function(){return f.gatherNdImpl}));var p=n(/*! ./kernels/GatherV2_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GatherV2_impl.js");n.d(t,"gatherV2Impl",(function(){return p.gatherV2Impl}));var m=n(/*! ./kernels/Greater */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Greater.js");n.d(t,"greaterImpl",(function(){return m.greaterImpl}));var h=n(/*! ./kernels/GreaterEqual */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GreaterEqual.js");n.d(t,"greaterEqualImpl",(function(){return h.greaterEqualImpl}));var b=n(/*! ./kernels/Less */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Less.js");n.d(t,"lessImpl",(function(){return b.lessImpl}));var j=n(/*! ./kernels/LessEqual */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LessEqual.js");n.d(t,"lessEqualImpl",(function(){return j.lessEqualImpl}));var g=n(/*! ./kernels/LinSpace_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LinSpace_impl.js");n.d(t,"linSpaceImpl",(function(){return g.linSpaceImpl}));var w=n(/*! ./kernels/Log */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Log.js");n.d(t,"logImpl",(function(){return w.logImpl}));var _=n(/*! ./kernels/Max_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Max_impl.js");n.d(t,"maxImpl",(function(){return _.maxImpl}));var k=n(/*! ./kernels/Maximum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Maximum.js");n.d(t,"maximumImpl",(function(){return k.maximumImpl}));var v=n(/*! ./kernels/Minimum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Minimum.js");n.d(t,"minimumImpl",(function(){return v.minimumImpl}));var x=n(/*! ./kernels/Multiply */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Multiply.js");n.d(t,"multiplyImpl",(function(){return x.multiplyImpl}));var y=n(/*! ./kernels/Neg */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Neg.js");n.d(t,"negImpl",(function(){return y.negImpl}));var O=n(/*! ./kernels/NotEqual */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NotEqual.js");n.d(t,"notEqualImpl",(function(){return O.notEqualImpl}));var I=n(/*! ./kernels/Prod */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Prod.js");n.d(t,"prodImpl",(function(){return I.prodImpl}));var C=n(/*! ./kernels/Range_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Range_impl.js");n.d(t,"rangeImpl",(function(){return C.rangeImpl}));var S=n(/*! ./kernels/Rsqrt */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Rsqrt.js");n.d(t,"rsqrtImpl",(function(){return S.rsqrtImpl}));var T=n(/*! ./kernels/Slice */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Slice.js");n.d(t,"sliceImpl",(function(){return T.sliceImpl}));var N=n(/*! ./kernels/SparseFillEmptyRows_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseFillEmptyRows_impl.js");n.d(t,"sparseFillEmptyRowsImpl",(function(){return N.sparseFillEmptyRowsImpl}));var E=n(/*! ./kernels/SparseReshape_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseReshape_impl.js");n.d(t,"sparseReshapeImpl",(function(){return E.sparseReshapeImpl}));var A=n(/*! ./kernels/SparseSegmentReduction_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseSegmentReduction_impl.js");n.d(t,"sparseSegmentReductionImpl",(function(){return A.sparseSegmentReductionImpl}));var R=n(/*! ./kernels/SquaredDifference */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SquaredDifference.js");n.d(t,"squaredDifferenceImpl",(function(){return R.squaredDifferenceImpl}));var F=n(/*! ./kernels/StridedSlice_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StridedSlice_impl.js");n.d(t,"stridedSliceImpl",(function(){return F.stridedSliceImpl}));var M=n(/*! ./kernels/StringNGrams_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringNGrams_impl.js");n.d(t,"stringNGramsImpl",(function(){return M.stringNGramsImpl}));var $=n(/*! ./kernels/StringSplit_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringSplit_impl.js");n.d(t,"stringSplitImpl",(function(){return $.stringSplitImpl}));var D=n(/*! ./kernels/StringToHashBucketFast_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringToHashBucketFast_impl.js");n.d(t,"stringToHashBucketFastImpl",(function(){return D.stringToHashBucketFastImpl}));var P=n(/*! ./kernels/Sub */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sub.js");n.d(t,"subImpl",(function(){return P.subImpl}));var B=n(/*! ./kernels/Tile_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tile_impl.js");n.d(t,"tileImpl",(function(){return B.tileImpl}));var L=n(/*! ./kernels/TopK_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/TopK_impl.js");n.d(t,"topKImpl",(function(){return L.topKImpl}));var z=n(/*! ./kernels/Transpose_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose_impl.js");n.d(t,"transposeImpl",(function(){return z.transposeImpl}));var G=n(/*! ./kernels/Unique_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Unique_impl.js");n.d(t,"uniqueImpl",(function(){return G.uniqueImpl}))},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js ***! + \*****************************************************************************/ +/*! exports provided: createSimpleBinaryKernelImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"createSimpleBinaryKernelImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -9555,12 +9531,11 @@ const a="return -x;";function d(e){const{inputs:t,backend:n}=e,{x:d}=t;if(n.shou * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -const i=Object(o.binaryKernelFunc)({opSnippet:"return float(a != b);",cpuKernelImpl:r.notEqualImplCPU,dtype:"bool"}),a={kernelName:s.NotEqual,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/OneHot.js": -/*!****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/OneHot.js ***! - \****************************************************************************/ -/*! exports provided: oneHot, oneHotConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"oneHot",(function(){return i})),n.d(t,"oneHotConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../onehot_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/onehot_gpu.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); + */function o(e){return(t,n,o,r,i)=>{const a=s.backend_util.assertAndGetBroadcastShape(t,n),u=a.length,d=s.util.computeStrides(a),l=s.util.sizeFromShape(a),c=s.util.getTypedArrayFromDType(i,l),f=t.length,p=n.length,m=s.util.computeStrides(t),h=s.util.computeStrides(n),b=s.backend_util.getBroadcastDims(t,a),j=s.backend_util.getBroadcastDims(n,a);if(b.length+j.length===0)for(let t=0;ti[e]=0));const a=s.util.locToIndex(i,f,m),l=n.slice(-p);j.forEach((e=>l[e]=0));const g=s.util.locToIndex(l,p,h);c[t]=e(o[a],r[g])}return[c,a]}}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js ***! + \******************************************************************************/ +/*! exports provided: binaryKernelFunc, createComplexBinaryKernelImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"binaryKernelFunc",(function(){return a})),n.d(t,"createComplexBinaryKernelImpl",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ../kernels/Cast */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cast.js"),i=n(/*! ../kernels/Complex */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Complex.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -9577,11 +9552,11 @@ const i=Object(o.binaryKernelFunc)({opSnippet:"return float(a != b);",cpuKernelI * limitations under the License. * ============================================================================= */ -const i=e=>{const{inputs:t,backend:n,attrs:i}=e,{indices:a}=t,{depth:d,onValue:u,offValue:l}=i,c=s.util.sizeFromShape(a.shape),f=new o.OneHotProgram(c,d,u,l),p=Object(r.reshape)({inputs:{x:a},backend:n,attrs:{shape:[c]}}),m=n.runWebGLProgram(f,[p],a.dtype);n.disposeIntermediateTensorInfo(p);const h=[...a.shape,d],b=Object(r.reshape)({inputs:{x:m},backend:n,attrs:{shape:h}});return n.disposeIntermediateTensorInfo(m),b},a={kernelName:s.OneHot,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/OnesLike.js": -/*!******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/OnesLike.js ***! - \******************************************************************************/ -/*! exports provided: onesLike, onesLikeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"onesLike",(function(){return u})),n.d(t,"onesLikeConfig",(function(){return l}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Complex */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js"),r=n(/*! ./Fill */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Fill.js"),i=n(/*! ./Imag */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Imag.js"),a=n(/*! ./Real */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Real.js"),d=n(/*! ./ZerosLike */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ZerosLike.js"); +function a(e,t,n,a){return null==n?({inputs:n,backend:r})=>{const{a:i,b:u}=n,d=r;Object(o.assertNotComplex)([i,u],e);const l=d.data.get(i.dataId).values,c=d.data.get(u.dataId).values,f="string"===i.dtype?s.backend_util.fromUint8ToStringArray(l):l,p="string"===i.dtype?s.backend_util.fromUint8ToStringArray(c):c,m=a||i.dtype,[h,b]=t(i.shape,u.shape,f,p,m);return d.makeTensorInfo(b,m,h)}:({inputs:e,backend:s})=>{const{a:o,b:u}=e,d=s;if("complex64"===o.dtype||"complex64"===u.dtype){const e=Object(r.cast)({inputs:{x:o},backend:d,attrs:{dtype:"complex64"}}),t=d.data.get(e.dataId),s=t.complexTensorInfos.real,a=t.complexTensorInfos.imag,l=d.data.get(s.dataId).values,c=d.data.get(a.dataId).values,f=Object(r.cast)({inputs:{x:u},backend:d,attrs:{dtype:"complex64"}}),p=d.data.get(f.dataId),m=p.complexTensorInfos.real,h=p.complexTensorInfos.imag,b=d.data.get(m.dataId).values,j=d.data.get(h.dataId).values,[g,w,_]=n(o.shape,u.shape,l,c,b,j),k=d.makeTensorInfo(_,"float32",g),v=d.makeTensorInfo(_,"float32",w),x=Object(i.complex)({inputs:{real:k,imag:v},backend:d});return d.disposeIntermediateTensorInfo(e),d.disposeIntermediateTensorInfo(f),d.disposeIntermediateTensorInfo(k),d.disposeIntermediateTensorInfo(v),x}{const e=d.data.get(o.dataId).values,n=d.data.get(u.dataId).values,s=a||o.dtype,[r,i]=t(o.shape,u.shape,e,n,s);return d.makeTensorInfo(i,s,r)}}}function u(e){return(t,n,o,r,i,a)=>{const u=s.backend_util.assertAndGetBroadcastShape(t,n),d=s.util.sizeFromShape(u),l=u.length,c=s.util.computeStrides(u),f=s.util.getTypedArrayFromDType("float32",d),p=s.util.getTypedArrayFromDType("float32",d),m=s.backend_util.getBroadcastDims(t,u),h=s.backend_util.getBroadcastDims(n,u),b=s.backend_util.mergeRealAndImagArrays(o,r),j=s.backend_util.mergeRealAndImagArrays(i,a),g=t.length,w=s.util.computeStrides(t),_=n.length,k=s.util.computeStrides(n);if(m.length+h.length===0)for(let t=0;to[e]=0));const r=s.util.locToIndex(o,g,w),i=n.slice(-_);h.forEach((e=>i[e]=0));const a=s.util.locToIndex(i,_,k),u=e(b[2*r],b[2*r+1],j[2*a],j[2*a+1]);f[t]=u.real,p[t]=u.imag}return[f,p,u]}}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/fft_utils.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/fft_utils.js ***! + \***************************************************************************/ +/*! exports provided: fftBatch, fftImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"fftBatch",(function(){return m})),n.d(t,"fftImpl",(function(){return h}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernels/Add */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Add.js"),r=n(/*! ../kernels/Complex */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Complex.js"),i=n(/*! ../kernels/Concat */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Concat.js"),a=n(/*! ../kernels/Identity */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Identity.js"),u=n(/*! ../kernels/Imag */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Imag.js"),d=n(/*! ../kernels/Multiply */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Multiply.js"),l=n(/*! ../kernels/Real */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Real.js"),c=n(/*! ../kernels/RealDiv */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RealDiv.js"),f=n(/*! ../kernels/Slice */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Slice.js"),p=n(/*! ../kernels/Sub */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sub.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -9598,11 +9573,11 @@ const i=e=>{const{inputs:t,backend:n,attrs:i}=e,{indices:a}=t,{depth:d,onValue:u * limitations under the License. * ============================================================================= */ -function u(e){const{inputs:t,backend:n}=e,{x:s}=t;if("string"===s.dtype)throw new Error("onesLike is not supported under string dtype");if("complex64"===s.dtype){const e=Object(a.real)({inputs:{input:s},backend:n}),t=u({inputs:{x:e},backend:n}),r=Object(i.imag)({inputs:{input:s},backend:n}),l=Object(d.zerosLike)({inputs:{x:r},backend:n}),c=Object(o.complex)({inputs:{real:t,imag:l},backend:n});return n.disposeIntermediateTensorInfo(e),n.disposeIntermediateTensorInfo(t),n.disposeIntermediateTensorInfo(r),n.disposeIntermediateTensorInfo(l),c}return Object(r.fill)({attrs:{shape:s.shape,dtype:s.dtype,value:1},backend:n})}const l={kernelName:s.OnesLike,backendName:"webgl",kernelFunc:u}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Pack.js": -/*!**************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Pack.js ***! - \**************************************************************************/ -/*! exports provided: pack, packConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"pack",(function(){return i})),n.d(t,"packConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Concat */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Concat.js"),r=n(/*! ./ExpandDims */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ExpandDims.js"); +function m(e,t,n){const o=e.shape,i=o[0],a=o[1],u=n.data.get(e.dataId),d=u.complexTensorInfos.real,l=u.complexTensorInfos.imag,c=[i,a],p=s.util.sizeFromShape(c),m=s.util.getTypedArrayFromDType("float32",p),b=s.util.getTypedArrayFromDType("float32",p);for(let e=0;e{s.util.assertShapesMatch(d,e.shape,"All tensors passed to stack must have matching shapes"),s.util.assert(u===e.dtype,(()=>"All tensors passed to stack must have matching dtypes"))}));const l=[],c=t.map((e=>{const t=Object(r.expandDims)({inputs:{input:e},backend:n,attrs:{dim:a}});return l.push(t),t})),f=Object(o.concat)({inputs:c,backend:n,attrs:{axis:a}});return l.forEach((e=>n.disposeIntermediateTensorInfo(e))),f}const a={kernelName:s.Pack,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/PadV2.js": -/*!***************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/PadV2.js ***! - \***************************************************************************/ -/*! exports provided: padV2, padV2Config */function(e,t,n){"use strict";n.r(t),n.d(t,"padV2",(function(){return i})),n.d(t,"padV2Config",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../pad_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/pad_gpu.js"),r=n(/*! ../pad_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/pad_packed_gpu.js"); +function l(e,t,n,l,c){if("linear"===n)return Object(o.identity)({inputs:{x:t},backend:e});if("relu"===n)return Object(a.relu)({inputs:{x:t},backend:e});if("elu"===n)return Object(s.elu)({inputs:{x:t},backend:e});if("relu6"===n)return Object(u.relu6)({inputs:{x:t},backend:e});if("prelu"===n)return Object(i.prelu)({inputs:{x:t,alpha:l},backend:e});if("leakyrelu"===n)return Object(r.leakyRelu)({inputs:{x:t},backend:e,attrs:{alpha:c}});if("sigmoid"===n)return Object(d.sigmoid)({inputs:{x:t},backend:e});throw new Error(`Activation ${n} has not been implemented for the CPU backend.`)}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/pool_utils.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/pool_utils.js ***! + \****************************************************************************/ +/*! exports provided: pool, maxPoolPositions, pool3d, maxPool3dPositions */function(e,t,n){"use strict";n.r(t),n.d(t,"pool",(function(){return o})),n.d(t,"maxPoolPositions",(function(){return r})),n.d(t,"pool3d",(function(){return i})),n.d(t,"maxPool3dPositions",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -9639,12 +9614,11 @@ function i(e){const{inputs:t,backend:n,attrs:i}=e,{axis:a}=i;if(1===t.length)ret * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -const i=e=>{const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{paddings:d,constantValue:u}=i,l=Object(s.env)().getBool("WEBGL_PACK_ARRAY_OPERATIONS")?new r.PadPackedProgram(a.shape,d,u):new o.PadProgram(a.shape,d,u),c=[[u]];return n.runWebGLProgram(l,[a],a.dtype,c)},a={kernelName:s.PadV2,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Pow.js": -/*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Pow.js ***! - \*************************************************************************/ -/*! exports provided: pow, powConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"pow",(function(){return a})),n.d(t,"powConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../binaryop_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_packed_gpu.js"),r=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); + */function o(e,t,n,o,r,i){const a=r.strideHeight,u=r.strideWidth,d=r.dilationHeight,l=r.dilationWidth,c=r.effectiveFilterHeight,f=r.effectiveFilterWidth,p=r.padInfo.top,m=r.padInfo.left,h="max"===i?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,b=Object(s.buffer)(r.outShape,n),j=b.values,g=r.outShape[1]*r.outShape[2]*r.outShape[3],w=r.outShape[2]*r.outShape[3],_=r.outShape[3];for(let t=0;tb?b=s:"avg"===i&&(g+=s,w++)}if(isNaN(b))break}j[x+n*_+t]="avg"===i?g/w:b}}}return b}function r(e,t,n,o,r=!1,i=!1){const a=Object(s.buffer)(o.outShape,"int32"),u=o.strideHeight,d=o.strideWidth,l=o.dilationHeight,c=o.dilationWidth,f=o.effectiveFilterHeight,p=o.effectiveFilterWidth,m=o.padInfo.top,h=o.padInfo.left,b=Object(s.buffer)(t,n,e);for(let e=0;e_&&(_=d,k=r?i?((e*o.inHeight+n)*o.inWidth+s)*o.inChannels+t:(n*o.inWidth+s)*o.inChannels+t:a*p+u)}}a.set(k,e,n,u,t)}}return a}function i(e,t,n,o,r,i){const a=r.strideDepth,u=r.strideHeight,d=r.strideWidth,l=r.dilationDepth,c=r.dilationHeight,f=r.dilationWidth,p=r.effectiveFilterDepth,m=r.effectiveFilterHeight,h=r.effectiveFilterWidth,b=r.padInfo.front,j=r.padInfo.top,g=r.padInfo.left,w="max"===i?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,_=Object(s.buffer)(r.outShape,n),k=_.values,v=r.outShape[1]*r.outShape[2]*r.outShape[3]*r.outShape[4],x=r.outShape[2]*r.outShape[3]*r.outShape[4],y=r.outShape[3]*r.outShape[4],O=r.outShape[4];for(let t=0;tv?v=r:"avg"===i&&(x+=r,y++),isNaN(v))break}if(isNaN(v))break}if(isNaN(v))break}k[j+t]="avg"===i?x/y:v}}}}return _}function a(e,t){const n=Object(s.buffer)(t.outShape,"int32"),o=t.strideDepth,r=t.strideHeight,i=t.strideWidth,a=t.dilationDepth,u=t.dilationHeight,d=t.dilationWidth,l=t.effectiveFilterDepth,c=t.effectiveFilterHeight,f=t.effectiveFilterWidth,p=t.padInfo.front,m=t.padInfo.top,h=t.padInfo.left;for(let s=0;s=y&&(y=u,O=n*c*f+r*c+a)}}}n.set(O,s,j,o,r,b)}}}return n}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_impl.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_impl.js ***! + \****************************************************************************/ +/*! exports provided: createSimpleUnaryImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"createSimpleUnaryImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -9660,12 +9634,11 @@ const i=e=>{const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{paddings:d,constantValu * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -const i="\n // isModRound1 has 1 for components with round(mod(b, 2.0)) == 1, 0 otherwise.\n vec4 isModRound1 = vec4(equal(round(mod(b, 2.0)), ivec4(1)));\n vec4 multiplier = sign(a) * isModRound1 + (vec4(1.0) - isModRound1);\n vec4 result = multiplier * pow(abs(a), b);\n\n // Ensure that a^0 = 1, including 0^0 = 1 as this correspond to TF and JS\n bvec4 isExpZero = equal(b, vec4(0.0));\n result.r = isExpZero.r ? 1.0 : result.r;\n result.g = isExpZero.g ? 1.0 : result.g;\n result.b = isExpZero.b ? 1.0 : result.b;\n result.a = isExpZero.a ? 1.0 : result.a;\n\n vec4 isNaN = vec4(lessThan(a, vec4(0.0))) * vec4(lessThan(floor(b), b));\n "+o.CHECK_NAN_SNIPPET+"\n return result;\n",a=Object(r.binaryKernelFunc)({opSnippet:"\n if(a < 0.0 && floor(b) < b){\n return NAN;\n }\n if (b == 0.0) {\n return 1.0;\n }\n return (round(mod(b, 2.0)) != 1) ?\n pow(abs(a), b) : sign(a) * pow(abs(a), b);\n",packedOpSnippet:i}),d={kernelName:s.Pow,backendName:"webgl",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Prelu.js": -/*!***************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Prelu.js ***! - \***************************************************************************/ -/*! exports provided: PRELU, PRELU_PACKED, prelu, preluConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"PRELU",(function(){return i})),n.d(t,"PRELU_PACKED",(function(){return a})),n.d(t,"prelu",(function(){return d})),n.d(t,"preluConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../binaryop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_gpu.js"),r=n(/*! ../binaryop_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_packed_gpu.js"); + */function o(e){return(t,n,o)=>{const r=s.util.getTypedArrayFromDType(n,t.length);for(let n=0;n{const{x:u}=r;if(Object(o.assertNotComplex)(u,e),"string"===u.dtype||"string"===n)throw new Error("unaryKernelFunc does not support string input/output");const d=a,l=d.data.get(u.dataId).values,c=s.util.sizeFromShape(u.shape),f=n||u.dtype,p=s.util.getArrayFromDType(f,c);for(let e=0;e{const{x:a}=s;if(Object(o.assertNotComplex)(a,e),"string"===a.dtype||"string"===n)throw new Error("unaryKernelFunc does not support string input/output");const u=i,d=u.data.get(a.dataId).values,l=n||a.dtype,c=t(d,l,r);return u.makeTensorInfo(a.shape,l,c)}}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/zeros_impl.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/zeros_impl.js ***! + \****************************************************************************/ +/*! exports provided: zeros */function(e,t,n){"use strict";n.r(t),n.d(t,"zeros",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernels/Complex */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Complex.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -9703,14 +9676,20 @@ const i="return (a < 0.) ? b * a : a;",a="\n vec4 aLessThanZero = vec4(lessThan * limitations under the License. * ============================================================================= */ -function d(e){const{inputs:t,backend:n,attrs:d}=e,{x:u}=t,{axis:l,keepDims:c}=d,f=u.shape.length,p=[],m=s.util.parseAxisParam(l,u.shape);let h=m;const b=s.backend_util.getAxesPermutation(h,f);let j,g=u;if(null!=b&&(g=Object(a.transpose)({inputs:{x:u},backend:n,attrs:{perm:b}}),h=s.backend_util.getInnerMostAxes(h.length,f),p.push(g)),s.backend_util.assertAxesAreInnerMostDims("prod",h,f),n.shouldExecuteOnCPU([g])){const e=n.texData.get(g.dataId).values,{outVals:t,outShape:s,outDtype:o}=Object(r.prodImplCPU)(g.shape,g.dtype,e,h);j=n.makeTensorInfo(s,o,t)}else{const[e,t]=s.backend_util.computeOutAndReduceShapes(g.shape,h),r=s.util.sizeFromShape(t),a=Object(i.reshape)({inputs:{x:g},backend:n,attrs:{shape:[-1,r]}}),d=Object(s.sumOutType)(u.dtype),l=Object(o.reduce)(a,d,"prod",n);j=Object(i.reshape)({inputs:{x:l},backend:n,attrs:{shape:e}}),p.push(a),p.push(l)}if(c){p.push(j);const e=s.backend_util.expandShapeToKeepDim(j.shape,m);j=Object(i.reshape)({inputs:{x:j},backend:n,attrs:{shape:e}})}return p.forEach((e=>n.disposeIntermediateTensorInfo(e))),j}const u={kernelName:s.Prod,backendName:"webgl",kernelFunc:d}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Range.js": -/*!***************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Range.js ***! - \***************************************************************************/ -/*! exports provided: range, rangeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"range",(function(){return r})),n.d(t,"rangeConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +function r(e,t,n="float32"){if("complex64"===n){const n=r(e,t,"float32"),s=r(e,t,"float32");return Object(o.complex)({inputs:{real:n,imag:s},backend:e})}const i=s.util.makeZerosTypedArray(s.util.sizeFromShape(t),n);return e.makeTensorInfo(t,n,i)}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/version.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/version.js ***! + \*******************************************************************/ +/*! exports provided: version */function(e,t,n){"use strict";n.r(t),n.d(t,"version",(function(){return s})); +/** @license See the LICENSE file. */ +const s="3.8.0"},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/backend_wasm.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/backend_wasm.js ***! + \*************************************************************************/ +/*! exports provided: BackendWasm, init, setWasmPath, setWasmPaths, resetWasmPath */function(e,t,n){"use strict";n.r(t),n.d(t,"BackendWasm",(function(){return d})),n.d(t,"init",(function(){return c})),n.d(t,"setWasmPath",(function(){return g})),n.d(t,"setWasmPaths",(function(){return w})),n.d(t,"resetWasmPath",(function(){return _}));n(/*! ./flags_wasm */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/flags_wasm.js");var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../wasm-out/tfjs-backend-wasm-threaded-simd.js */"./node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm-threaded-simd.js"),r=n.n(o),i=n(/*! ../wasm-out/tfjs-backend-wasm-threaded-simd.worker.js */"./node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm-threaded-simd.worker.js"),a=n(/*! ../wasm-out/tfjs-backend-wasm.js */"./node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm.js"),u=n.n(a); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -9724,11 +9703,15 @@ function d(e){const{inputs:t,backend:n,attrs:d}=e,{x:u}=t,{axis:l,keepDims:c}=d, * limitations under the License. * ============================================================================= */ -const r=e=>{const{backend:t,attrs:n}=e,{start:s,stop:r,step:i,dtype:a}=n,d=Object(o.rangeImplCPU)(s,r,i,a);return t.makeTensorInfo([d.length],a,d)},i={kernelName:s.Range,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Real.js": -/*!**************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Real.js ***! - \**************************************************************************/ -/*! exports provided: real, realConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"real",(function(){return r})),n.d(t,"realConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"); +class d extends s.KernelBackend{constructor(e){super(),this.wasm=e,this.dataIdNextNumber=1,this.wasm.tfjs.init(),this.dataIdMap=new s.DataStorage(this,Object(s.engine)())}write(e,t,n){const s={id:this.dataIdNextNumber++};return this.move(s,e,t,n,1),s}numDataIds(){return this.dataIdMap.numDataIds()}async time(e){const t=s.util.now();e();return{kernelMs:s.util.now()-t}}move(e,t,n,o,r){const i=this.dataIdNextNumber++;if("string"===o){const s=t;return void this.dataIdMap.set(e,{id:i,stringBytes:s,shape:n,dtype:o,memoryOffset:null,refCount:r})}const a=s.util.sizeFromShape(n),u=a*s.util.bytesPerElement(o),d=this.wasm._malloc(u);this.dataIdMap.set(e,{id:i,memoryOffset:d,shape:n,dtype:o,refCount:r}),this.wasm.tfjs.registerTensor(i,a,d),null!=t&&this.wasm.HEAPU8.set(new Uint8Array(t.buffer,t.byteOffset,u),d)}async read(e){return this.readSync(e)}readSync(e){const{memoryOffset:t,dtype:n,shape:o,stringBytes:r}=this.dataIdMap.get(e);if("string"===n)return r;return function(e,t){switch(t){case"float32":return new Float32Array(e);case"int32":return new Int32Array(e);case"bool":return new Uint8Array(e);default:throw new Error(`Unknown dtype ${t}`)}}(this.wasm.HEAPU8.slice(t,t+s.util.sizeFromShape(o)*s.util.bytesPerElement(n)).buffer,n)}disposeData(e,t=!1){if(this.dataIdMap.has(e)){const n=this.dataIdMap.get(e);if(n.refCount--,!t&&n.refCount>0)return!1;this.wasm._free(n.memoryOffset),this.wasm.tfjs.disposeData(n.id),this.dataIdMap.delete(e)}return!0}refCount(e){if(this.dataIdMap.has(e)){return this.dataIdMap.get(e).refCount}return 0}incRef(e){const t=this.dataIdMap.get(e);null!=t&&t.refCount++}floatPrecision(){return 32}getMemoryOffset(e){return this.dataIdMap.get(e).memoryOffset}dispose(){this.wasm.tfjs.dispose(),"PThread"in this.wasm&&this.wasm.PThread.terminateAllThreads(),this.wasm=null}memory(){return{unreliable:!1}}makeOutput(e,t,n){let o;if(null==n)o=this.write(null,e,t);else{const r=this.dataIdNextNumber++;o={id:r},this.dataIdMap.set(o,{id:r,memoryOffset:n,shape:e,dtype:t,refCount:1});const i=s.util.sizeFromShape(e);this.wasm.tfjs.registerTensor(r,i,n)}return{dataId:o,shape:e,dtype:t}}typedArrayFromHeap({shape:e,dtype:t,dataId:n}){const o=this.wasm.HEAPU8.buffer,{memoryOffset:r}=this.dataIdMap.get(n),i=s.util.sizeFromShape(e);switch(t){case"float32":return new Float32Array(o,r,i);case"int32":return new Int32Array(o,r,i);case"bool":return new Uint8Array(o,r,i);default:throw new Error(`Unknown dtype ${t}`)}}}function l(e,t,n){if(null!=p)return p;let s="tfjs-backend-wasm.wasm";return e&&t?s="tfjs-backend-wasm-threaded-simd.wasm":e&&(s="tfjs-backend-wasm-simd.wasm"),null!=h&&null!=h[s]?h[s]:n+s}async function c(){const[e,t]=await Promise.all([Object(s.env)().getAsync("WASM_HAS_SIMD_SUPPORT"),Object(s.env)().getAsync("WASM_HAS_MULTITHREAD_SUPPORT")]);return new Promise(((n,o)=>{const a={};var d;a.locateFile=(n,s)=>{if(n.endsWith(".worker.js")){const e=i.wasmWorkerContents,t=new Blob([e],{type:"application/javascript"});return URL.createObjectURL(t)}return n.endsWith(".wasm")?l(e,t,null!=m?m:s):s+n},j&&(a.instantiateWasm=(d=l(e,t,null!=m?m:""),(e,t)=>(s.util.fetch(d,{credentials:"same-origin"}).then((n=>{n.ok||e.env.a(`failed to load wasm binary file at '${d}'`),n.arrayBuffer().then((n=>{WebAssembly.instantiate(n,e).then((e=>{t(e.instance,e.module)}))}))})),{})));let c,f=!1;a.onAbort=()=>{if(f)return;if(b)return;b=!0;o({message:"Make sure the server can serve the `.wasm` file relative to the bundled js file. For more details see https://github.com/tensorflow/tfjs/blob/master/tfjs-backend-wasm/README.md#using-bundlers"})},t&&e&&null==p?(a.mainScriptUrlOrBlob=new Blob(["var WasmBackendModuleThreadedSimd = "+r.a.toString()],{type:"text/javascript"}),c=r()(a)):c=u()(a),c.then((e=>{f=!0,b=!1;e.tfjs={init:e.cwrap("init",null,[]),registerTensor:e.cwrap("register_tensor",null,["number","number","number"]),disposeData:e.cwrap("dispose_data",null,["number"]),dispose:e.cwrap("dispose",null,[])},n({wasm:e})}))}))}const f=["tfjs-backend-wasm.wasm","tfjs-backend-wasm-simd.wasm","tfjs-backend-wasm-threaded-simd.wasm"];let p=null,m=null,h={},b=!1,j=!1;function g(e,t=!1){if(Object(s.deprecationWarn)("setWasmPath has been deprecated in favor of setWasmPaths and will be removed in a future release."),b)throw new Error("The WASM backend was already initialized. Make sure you call `setWasmPath()` before you call `tf.setBackend()` or `tf.ready()`");p=e,j=t}function w(e,t=!1){if(b)throw new Error("The WASM backend was already initialized. Make sure you call `setWasmPaths()` before you call `tf.setBackend()` or `tf.ready()`");if("string"==typeof e)m=e;else{h=e;const t=f.filter((e=>null==h[e]));if(t.length>0)throw new Error(`There were no entries found for the following binaries: ${t.join(",")}. Please either call setWasmPaths with a map providing a path for each binary, or with a string indicating the directory where all the binaries can be found.`)}j=t}function _(){p=null,m=null,h={},j=!1,b=!1}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/base.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/base.js ***! + \*****************************************************************/ +/*! exports provided: BackendWasm, setWasmPath, setWasmPaths, version_wasm */function(e,t,n){"use strict";n.r(t);n(/*! ./flags_wasm */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/flags_wasm.js");var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./backend_wasm */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/backend_wasm.js");n.d(t,"BackendWasm",(function(){return o.BackendWasm})),n.d(t,"setWasmPath",(function(){return o.setWasmPath})),n.d(t,"setWasmPaths",(function(){return o.setWasmPaths}));var r=n(/*! ./version */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/version.js");n.d(t,"version_wasm",(function(){return r.version}));Object(s.registerBackend)("wasm",(async()=>{const{wasm:e}=await Object(o.init)();return new o.BackendWasm(e)}),2)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/flags_wasm.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/flags_wasm.js ***! + \***********************************************************************/ +/*! no exports provided */function(e,t,n){"use strict";n.r(t);var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -9744,15 +9727,22 @@ const r=e=>{const{backend:t,attrs:n}=e,{start:s,stop:r,step:i,dtype:a}=n,d=Objec * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -function r(e){const{inputs:t,backend:n}=e,{input:s}=t,r=n.texData.get(s.dataId);return Object(o.identity)({inputs:{x:r.complexTensorInfos.real},backend:n})}const i={kernelName:s.Real,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/RealDiv.js": -/*!*****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/RealDiv.js ***! - \*****************************************************************************/ -/*! exports provided: realDiv, realDivConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"realDiv",(function(){return r})),n.d(t,"realDivConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); + */const o=Object(s.env)();o.registerFlag("WASM_HAS_SIMD_SUPPORT",(async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,9,1,7,0,65,0,253,15,26,11])))),o.registerFlag("WASM_HAS_MULTITHREAD_SUPPORT",(async()=>{if(o.get("IS_NODE"))return!1;try{return(new MessageChannel).port1.postMessage(new SharedArrayBuffer(1)),WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11]))}catch(e){return!1}}))},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/index.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/index.js ***! + \******************************************************************/ +/*! exports provided: BackendWasm, setWasmPath, setWasmPaths, version_wasm */function(e,t,n){"use strict";n.r(t);n(/*! ./register_all_kernels */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/register_all_kernels.js");var s=n(/*! ./base */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/base.js");n.d(t,"BackendWasm",(function(){return s.BackendWasm})),n.d(t,"setWasmPath",(function(){return s.setWasmPath})),n.d(t,"setWasmPaths",(function(){return s.setWasmPaths})),n.d(t,"version_wasm",(function(){return s.version_wasm}))},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernel_utils/shared.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernel_utils/shared.js ***! + \********************************************************************************/ +/*! exports provided: concatImplCPU, rangeImplCPU, sliceImplCPU */function(e,t,n){"use strict";n.r(t);var s=n(/*! @tensorflow/tfjs-backend-cpu/dist/shared */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/shared.js");n.d(t,"concatImplCPU",(function(){return s.concatImpl})),n.d(t,"sliceImplCPU",(function(){return s.sliceImpl})),n.d(t,"rangeImplCPU",(function(){return s.rangeImpl}))},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Abs.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Abs.js ***! + \************************************************************************/ +/*! exports provided: absConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"absConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -9766,14 +9756,14 @@ function r(e){const{inputs:t,backend:n}=e,{input:s}=t,r=n.texData.get(s.dataId); * limitations under the License. * ============================================================================= */ -const r=Object(o.binaryKernelFunc)({opSnippet:"\nif (a == b) {\n return 1.0;\n};\nreturn a / b;",packedOpSnippet:"\n // vec4 one = vec4(equal(a, b));\n // return one + (vec4(1.0) - one) * a / b;\n vec4 result = a / b;\n if(a.x == b.x) {\n result.x = 1.;\n }\n if(a.y == b.y) {\n result.y = 1.;\n }\n if(a.z == b.z) {\n result.z = 1.;\n }\n if(a.w == b.w) {\n result.w = 1.;\n }\n\n return result;\n",checkOutOfBounds:!0}),i={kernelName:s.RealDiv,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reciprocal.js": -/*!********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reciprocal.js ***! - \********************************************************************************/ -/*! exports provided: reciprocal, reciprocalConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"reciprocal",(function(){return r})),n.d(t,"reciprocalConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +const r=Object(o.createUnaryKernelConfig)(s.Abs)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Add.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Add.js ***! + \************************************************************************/ +/*! exports provided: addConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"addConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -9787,14 +9777,14 @@ const r=Object(o.binaryKernelFunc)({opSnippet:"\nif (a == b) {\n return 1.0;\n} * limitations under the License. * ============================================================================= */ -const r=Object(o.unaryKernelFunc)({opSnippet:"return 1.0 / x;"}),i={kernelName:s.Reciprocal,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Relu.js": -/*!**************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Relu.js ***! - \**************************************************************************/ -/*! exports provided: relu, reluConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"relu",(function(){return i})),n.d(t,"reluConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +const r=Object(o.createBinaryKernelConfig)(s.Add,!0)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/AddN.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/AddN.js ***! + \*************************************************************************/ +/*! exports provided: addNConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"addNConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -9808,14 +9798,14 @@ const r=Object(o.unaryKernelFunc)({opSnippet:"return 1.0 / x;"}),i={kernelName:s * limitations under the License. * ============================================================================= */ -const r=n(/*! ../unaryop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js").CHECK_NAN_SNIPPET+"\n return (x < 0.0) ? 0.0 : x;\n",i=Object(o.unaryKernelFunc)({opSnippet:r,packedOpSnippet:"\n vec4 result = x * vec4(greaterThanEqual(x, vec4(0.0)));\n bvec4 isNaN = isnan(x);\n\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n"}),a={kernelName:s.Relu,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Relu6.js": -/*!***************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Relu6.js ***! - \***************************************************************************/ -/*! exports provided: relu6, relu6Config */function(e,t,n){"use strict";n.r(t),n.d(t,"relu6",(function(){return i})),n.d(t,"relu6Config",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +let r;const i={kernelName:s.AddN,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.AddN,null,["array","number","number","number"])},kernelFunc:function(e){const{inputs:t,backend:n}=e,i=n.makeOutput(t[0].shape,t[0].dtype);if(0===s.util.sizeFromShape(i.shape))return i;const a=t.map((e=>n.dataIdMap.get(e.dataId).id)),u=new Uint8Array(new Int32Array(a).buffer),d=n.dataIdMap.get(i.dataId).id;return r(u,a.length,o.CppDType[i.dtype],d),i}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/All.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/All.js ***! + \************************************************************************/ +/*! exports provided: allConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"allConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./kernel_utils */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/kernel_utils.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2021 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -9829,14 +9819,14 @@ const r=n(/*! ../unaryop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/di * limitations under the License. * ============================================================================= */ -const r=n(/*! ../unaryop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js").CHECK_NAN_SNIPPET+"\n return (x < 0.0) ? 0.0 : min(6.0, x);\n",i=Object(o.unaryKernelFunc)({opSnippet:r,packedOpSnippet:"\n vec4 result = min(x, vec4(6.)) * vec4(greaterThanEqual(x, vec4(0.0)));\n bvec4 isNaN = isnan(x);\n\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n"}),a={kernelName:s.Relu6,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js": -/*!*****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js ***! - \*****************************************************************************/ -/*! exports provided: reshape, reshapeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"reshape",(function(){return i})),n.d(t,"reshapeConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/reshape.js"),r=n(/*! ../webgl_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"); +let r;const i={kernelName:s.All,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.All,null,["number, number, number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:i}=e,{axis:a,keepDims:u}=i,{x:d}=n;let l=t.dataIdMap.get(d.dataId).id,c=d;const{transposed:f,axes:p,originalAxes:m,inputWasTransposed:h}=Object(o.permuteAxesAndTranspose)(d,a,t);if(h){c=f,l=t.dataIdMap.get(f.dataId).id}const b=c.shape.length;s.backend_util.assertAxesAreInnerMostDims("all",p,b);const[j,g]=s.backend_util.computeOutAndReduceShapes(c.shape,p),w=s.util.sizeFromShape(g),_=t.makeOutput(j,d.dtype);if(0!==s.util.sizeFromShape(c.shape)){const e=t.dataIdMap.get(_.dataId).id;r(l,w,e)}if(h&&t.disposeData(f.dataId),u){const e=s.backend_util.expandShapeToKeepDim(_.shape,m);_.shape=e}return _}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Any.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Any.js ***! + \************************************************************************/ +/*! exports provided: anyConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"anyConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./kernel_utils */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/kernel_utils.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2021 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -9850,14 +9840,14 @@ const r=n(/*! ../unaryop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/di * limitations under the License. * ============================================================================= */ -function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{shape:d}=i,u=n,l=s.util.sizeFromShape(a.shape),c=s.util.inferFromImplicitShape(d,l),f=s.util.sizeFromShape(c);s.util.assert(l===f,(()=>`The new shape (${c}) has ${f} elements and the old shape (${a.shape}) has ${l} elements. The new shape and old shape must have the same number of elements.`));const p=u.texData.get(a.dataId);return!p.isPacked||Object(r.isReshapeFree)(a.shape,c)||null!==p.texture&&Object(r.isReshapeFree)(p.shape,c)?(u.incRef(a.dataId),{dataId:a.dataId,shape:c,dtype:a.dtype}):Object(o.packedReshape)(a,c,u)}const a={kernelName:s.Reshape,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeBilinear.js": -/*!************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeBilinear.js ***! - \************************************************************************************/ -/*! exports provided: resizeBilinear, resizeBilinearConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"resizeBilinear",(function(){return i})),n.d(t,"resizeBilinearConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../resize_bilinear_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_gpu.js"),r=n(/*! ../resize_bilinear_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_packed_gpu.js"); +let r;const i={kernelName:s.Any,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.Any,null,["number, number, number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:i}=e,{axis:a,keepDims:u}=i,{x:d}=n;let l=t.dataIdMap.get(d.dataId).id,c=d;const{transposed:f,axes:p,originalAxes:m,inputWasTransposed:h}=Object(o.permuteAxesAndTranspose)(d,a,t);if(h){c=f,l=t.dataIdMap.get(f.dataId).id}const b=c.shape.length;s.backend_util.assertAxesAreInnerMostDims("any",p,b);const[j,g]=s.backend_util.computeOutAndReduceShapes(c.shape,p),w=s.util.sizeFromShape(g),_=t.makeOutput(j,d.dtype);if(0!==s.util.sizeFromShape(c.shape)){const e=t.dataIdMap.get(_.dataId).id;r(l,w,e)}if(h&&t.disposeData(f.dataId),u){const e=s.backend_util.expandShapeToKeepDim(_.shape,m);_.shape=e}return _}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ArgMax.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ArgMax.js ***! + \***************************************************************************/ +/*! exports provided: argMaxConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"argMaxConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./kernel_utils */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/kernel_utils.js"),r=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -9871,14 +9861,14 @@ function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{shape:d}=i,u=n,l=s.ut * limitations under the License. * ============================================================================= */ -function i(e){const{inputs:t,backend:n,attrs:i}=e,{images:a}=t,{alignCorners:d,halfPixelCenters:u,size:l}=i,[c,f]=l,p=Object(s.env)().getBool("WEBGL_PACK_IMAGE_OPERATIONS")?new r.ResizeBilinearPackedProgram(a.shape,c,f,d,u):new o.ResizeBilinearProgram(a.shape,c,f,d,u);return n.runWebGLProgram(p,[a],"float32")}const a={kernelName:s.ResizeBilinear,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeBilinearGrad.js": -/*!****************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeBilinearGrad.js ***! - \****************************************************************************************/ -/*! exports provided: resizeBilinearGrad, resizeBilinearGradConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"resizeBilinearGrad",(function(){return r})),n.d(t,"resizeBilinearGradConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../resize_bilinear_backprop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_backprop_gpu.js"); +let i;const a={kernelName:s.ArgMax,backendName:"wasm",kernelFunc:function(e){const{backend:t,inputs:n,attrs:a}=e,{axis:u}=a,{x:d}=n,l=t.dataIdMap.get(d.dataId).id;let c=l,f=d;const{transposed:p,axes:m,inputWasTransposed:h}=Object(o.permuteAxesAndTranspose)(d,u,t);if(h){const e=t.dataIdMap.get(p.dataId).id;e!==l&&(f=p,c=e)}const b=f.shape.slice(0,-1),j=t.makeOutput(b,"int32"),g=t.dataIdMap.get(j.dataId).id,w=s.util.sizeFromShape(j.shape),_=f.shape[m[0]];return i(c,r.CppDType[f.dtype],w,_,g),h&&t.disposeData(p.dataId),j},setupFunc:function(e){i=e.wasm.cwrap(s.ArgMax,null,["number","number","number","number","number"])}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/AvgPool.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/AvgPool.js ***! + \****************************************************************************/ +/*! exports provided: avgPoolConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"avgPoolConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -9891,15 +9881,14 @@ function i(e){const{inputs:t,backend:n,attrs:i}=e,{images:a}=t,{alignCorners:d,h * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -function r(e){const{inputs:t,backend:n,attrs:s}=e,{images:r,dy:i}=t,{alignCorners:a}=s,d=new o.ResizeBilinearBackpropProgram(i.shape,r.shape,a);return n.runWebGLProgram(d,[i],i.dtype)}const i={kernelName:s.ResizeBilinearGrad,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeNearestNeighbor.js": -/*!*******************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeNearestNeighbor.js ***! - \*******************************************************************************************/ -/*! exports provided: resizeNearestNeighbor, resizeNearestNeighborConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"resizeNearestNeighbor",(function(){return i})),n.d(t,"resizeNearestNeighborConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../resize_nearest_neighbor_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_gpu.js"),r=n(/*! ../resize_nearest_neighbor_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_packed_gpu.js"); + */let o;const r={kernelName:s.AvgPool,backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.AvgPool,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:t,attrs:n,backend:r}=e,i=t.x,a=r.dataIdMap.get(i.dataId).id,{filterSize:u,strides:d,pad:l,dimRoundingMode:c}=n,f=s.backend_util.computePool2DInfo(i.shape,u,d,1,l,c),p=f.filterHeight,m=f.filterWidth,h=f.padInfo.top,b=f.padInfo.right,j=f.padInfo.bottom,g=f.padInfo.left,w=f.strideHeight,_=f.strideWidth,k=f.inChannels;if("channelsLast"!==f.dataFormat)throw new Error(`wasm backend does not support dataFormat:'${f.dataFormat}'. Please use 'channelsLast'.`);if(1!==f.dilationWidth||1!==f.dilationHeight)throw new Error(`was backend only supports average pooling with dilation = [1, 1], got [${f.dilationHeight}, ${f.dilationWidth}].`);const v=r.makeOutput(f.outShape,"float32"),x=r.dataIdMap.get(v.dataId).id;return o(a,i.shape[0],i.shape[1],i.shape[2],p,m,h,b,j,g,w,_,k,x),v}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/BatchMatMul.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/BatchMatMul.js ***! + \********************************************************************************/ +/*! exports provided: batchMatMulConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"batchMatMulConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Reshape.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -9913,14 +9902,14 @@ function r(e){const{inputs:t,backend:n,attrs:s}=e,{images:r,dy:i}=t,{alignCorner * limitations under the License. * ============================================================================= */ -function i(e){const{inputs:t,backend:n,attrs:i}=e,{images:a}=t,{alignCorners:d,halfPixelCenters:u,size:l}=i,[c,f]=l,p=Object(s.env)().getBool("WEBGL_PACK_IMAGE_OPERATIONS")?new r.ResizeNearestNeighborPackedProgram(a.shape,c,f,d,u):new o.ResizeNearestNeighborProgram(a.shape,c,f,d,u);return n.runWebGLProgram(p,[a],a.dtype)}const a={kernelName:s.ResizeNearestNeighbor,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeNearestNeighborGrad.js": -/*!***********************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeNearestNeighborGrad.js ***! - \***********************************************************************************************/ -/*! exports provided: resizeNearestNeighborGrad, resizeNearestNeighborGradConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"resizeNearestNeighborGrad",(function(){return r})),n.d(t,"resizeNearestNeighborGradConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../resize_nearest_neighbor_backprop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_backprop_gpu.js"); +let r;const i={kernelName:s.BatchMatMul,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.BatchMatMul,null,["number","array","number","number","array","number","number","number","number"])},kernelFunc:function(e){const{inputs:t,backend:n,attrs:i}=e,{a:a,b:u}=t,{transposeA:d,transposeB:l}=i;if("float32"!==a.dtype||"float32"!==u.dtype)throw new Error("BatchMatMul for non non-float32 tensors not yet supported.");const c=a.shape.length,f=u.shape.length,p=d?a.shape[c-2]:a.shape[c-1],m=l?u.shape[f-1]:u.shape[f-2],h=d?a.shape[c-1]:a.shape[c-2],b=l?u.shape[f-2]:u.shape[f-1],j=a.shape.slice(0,-2),g=u.shape.slice(0,-2),w=s.util.sizeFromShape(j),_=s.util.sizeFromShape(g),k=w===_||1===w||1===_;s.util.assert(c>=2&&f>=2&&k,(()=>`Error in matMul: the input batch dimensions must either be the same or at least one input batch dimension must be 1. Got input batch dimensions of (${j}) and (${g}).`));const v=(w>_?a.shape.slice(0,-2):u.shape.slice(0,-2)).concat([h,b]);s.util.assert(p===m,(()=>`Error in matMul: inner shapes (${p}) and (${m}) of Tensors with shapes ${a.shape} and ${u.shape} and transposeA=${d} and transposeB=${l} must match.`));const x=d?[w,p,h]:[w,h,p],y=l?[_,b,m]:[_,m,b],O=Object(o.reshape)({inputs:{x:a},backend:n,attrs:{shape:x}}),I=Object(o.reshape)({inputs:{x:u},backend:n,attrs:{shape:y}}),C=n.dataIdMap.get(O.dataId).id,S=n.dataIdMap.get(I.dataId).id,T=d?O.shape[2]:O.shape[1],N=l?I.shape[1]:I.shape[2],E=Math.max(w,_),A=n.makeOutput([E,T,N],O.dtype),R=n.dataIdMap.get(A.dataId).id,F=new Uint8Array(new Int32Array(O.shape).buffer),M=new Uint8Array(new Int32Array(I.shape).buffer);return r(C,F,O.shape.length,S,M,I.shape.length,d,l,R),n.disposeData(O.dataId),n.disposeData(I.dataId),A.shape=v,A}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/BatchToSpaceND.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/BatchToSpaceND.js ***! + \***********************************************************************************/ +/*! exports provided: batchToSpaceNDConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"batchToSpaceNDConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Reshape.js"),r=n(/*! ./Slice */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Slice.js"),i=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Transpose.js");const a={kernelName:s.BatchToSpaceND,backendName:"wasm",kernelFunc: /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2021 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -9934,14 +9923,14 @@ function i(e){const{inputs:t,backend:n,attrs:i}=e,{images:a}=t,{alignCorners:d,h * limitations under the License. * ============================================================================= */ -function r(e){const{inputs:t,backend:n,attrs:s}=e,{images:r,dy:i}=t,{alignCorners:a}=s,d=new o.ResizeNearestNeigborBackpropProgram(i.shape,r.shape,a);return n.runWebGLProgram(d,[i],i.dtype)}const i={kernelName:s.ResizeNearestNeighborGrad,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reverse.js": -/*!*****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reverse.js ***! - \*****************************************************************************/ -/*! exports provided: reverse, reverseConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"reverse",(function(){return a})),n.d(t,"reverseConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../reverse_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/reverse_gpu.js"),r=n(/*! ../reverse_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/reverse_packed_gpu.js"),i=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"); +function(e){const{inputs:t,backend:n,attrs:a}=e,{x:u}=t,{blockShape:d,crops:l}=a,c=d.reduce(((e,t)=>e*t)),f=s.backend_util.getReshaped(u.shape,d,c),p=s.backend_util.getPermuted(f.length,d.length),m=s.backend_util.getReshapedPermuted(u.shape,d,c),h=s.backend_util.getSliceBeginCoords(l,d.length),b=s.backend_util.getSliceSize(m,l,d.length),j=Object(o.reshape)({inputs:{x:u},backend:n,attrs:{shape:f}}),g=Object(i.transpose)({inputs:{x:j},backend:n,attrs:{perm:p}}),w=Object(o.reshape)({inputs:{x:g},backend:n,attrs:{shape:m}}),_=Object(r.slice)({inputs:{x:w},backend:n,attrs:{begin:h,size:b}});return n.disposeData(j.dataId),n.disposeData(g.dataId),n.disposeData(j.dataId),_}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Cast.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Cast.js ***! + \*************************************************************************/ +/*! exports provided: cast, castConfig */function(e,t,n){"use strict"; /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -9955,14 +9944,14 @@ function r(e){const{inputs:t,backend:n,attrs:s}=e,{images:r,dy:i}=t,{alignCorner * limitations under the License. * ============================================================================= */ -function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:d}=t,{dims:u}=a,l=d.shape.length,c=s.util.parseAxisParam(u,d.shape);if(0===l)return Object(i.identity)({inputs:{x:d},backend:n});const f=Object(s.env)().getBool("WEBGL_PACK_ARRAY_OPERATIONS")?new r.ReversePackedProgram(d.shape,c):new o.ReverseProgram(d.shape,c);return n.runWebGLProgram(f,[d],d.dtype)}const d={kernelName:s.Reverse,backendName:"webgl",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/RotateWithOffset.js": -/*!**************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/RotateWithOffset.js ***! - \**************************************************************************************/ -/*! exports provided: rotateWithOffsetConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"rotateWithOffsetConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../rotate_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/rotate_gpu.js"); +function s(e){const{inputs:{x:t},attrs:{dtype:n},backend:s}=e,o=s.makeOutput(t.shape,n),r=s.typedArrayFromHeap(t);return s.typedArrayFromHeap(o).set(r),o}n.r(t),n.d(t,"cast",(function(){return s})),n.d(t,"castConfig",(function(){return o}));const o={kernelName:n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js").Cast,backendName:"wasm",kernelFunc:s}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Ceil.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Ceil.js ***! + \*************************************************************************/ +/*! exports provided: ceilConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"ceilConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2021 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -9976,14 +9965,14 @@ function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:d}=t,{dims:u}=a,l=d.shape.l * limitations under the License. * ============================================================================= */ -const r={kernelName:s.RotateWithOffset,backendName:"webgl",kernelFunc:({inputs:e,attrs:t,backend:n})=>{const{image:r}=e,{radians:i,fillValue:a,center:d}=t,u=n,l=new o.RotateProgram(r.shape,a),[c,f]=s.backend_util.getImageCenter(d,r.shape[1],r.shape[2]),p=[[c,f,Math.sin(i),Math.cos(i)]];return u.runWebGLProgram(l,[r],r.dtype,p)}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Round.js": -/*!***************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Round.js ***! - \***************************************************************************/ -/*! exports provided: round, roundConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"round",(function(){return r})),n.d(t,"roundConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +const r=Object(o.createUnaryKernelConfig)(s.Ceil)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ClipByValue.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ClipByValue.js ***! + \********************************************************************************/ +/*! exports provided: clipByValueConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"clipByValueConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -9996,15 +9985,14 @@ const r={kernelName:s.RotateWithOffset,backendName:"webgl",kernelFunc:({inputs:e * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -const r=Object(o.unaryKernelFunc)({opSnippet:"\n // OpenGL ES does not support round function.\n // The algorithm is based on banker's rounding.\n float base = floor(x);\n if ((x - base) < 0.5) {\n return floor(x);\n } else if ((x - base) > 0.5) {\n return ceil(x);\n } else {\n if (mod(base, 2.0) == 0.0) {\n return base;\n } else {\n return base + 1.0;\n }\n }\n"}),i={kernelName:s.Round,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Rsqrt.js": + */let o;const r={kernelName:s.ClipByValue,backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.ClipByValue,null,["number","number","number","number"])},kernelFunc:function(e){const{inputs:t,backend:n,attrs:s}=e,{x:r}=t,{clipValueMin:i,clipValueMax:a}=s,u=n.dataIdMap.get(r.dataId).id,d=n.makeOutput(r.shape,r.dtype),l=n.dataIdMap.get(d.dataId).id;return o(u,i,a,l),d}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Concat.js": /*!***************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Rsqrt.js ***! + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Concat.js ***! \***************************************************************************/ -/*! exports provided: rsqrt, rsqrtConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"rsqrt",(function(){return i})),n.d(t,"rsqrtConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/*! exports provided: concat, concatConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"concat",(function(){return a})),n.d(t,"concatConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernel_utils/shared.js"),r=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Identity.js"),i=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Reshape.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -10018,14 +10006,14 @@ const r=Object(o.unaryKernelFunc)({opSnippet:"\n // OpenGL ES does not support * limitations under the License. * ============================================================================= */ -const i=Object(o.unaryKernelFunc)({opSnippet:"return inversesqrt(x);",cpuKernelImpl:r.rsqrtImplCPU}),a={kernelName:s.Rsqrt,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ScatterNd.js": -/*!*******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ScatterNd.js ***! - \*******************************************************************************/ -/*! exports provided: scatterNd, scatterNdConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"scatterNd",(function(){return i})),n.d(t,"scatterNdConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../scatter_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/scatter_gpu.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); +function a(e){const{inputs:t,backend:n}=e,a=s.util.parseAxisParam(e.attrs.axis,t[0].shape)[0];let u=s.backend_util.computeOutShape(t.map((e=>e.shape)),a);const d=t.filter((e=>s.util.sizeFromShape(e.shape)>0));if(1===d.length)return Object(r.identity)({inputs:{x:d[0]},backend:n});const l=n.makeOutput(u,t[0].dtype);if(0===s.util.sizeFromShape(u))return l;const c=d.map((e=>e.shape));if(s.backend_util.assertParamsConsistent(c,a),"string"===d[0].dtype){const e=d.map((e=>{const t=[-1,s.util.sizeFromShape(e.shape.slice(a))];return Object(i.reshape)({inputs:{x:e},backend:n,attrs:{shape:t}})})),r=e.map((e=>({vals:n.readSync(e.dataId),shape:e.shape})));u=s.backend_util.computeOutShape(e.map((e=>e.shape)),1);const c=1===e[0].shape[0],f=Object(o.concatImplCPU)(r,u,t[0].dtype,c),p=s.backend_util.computeOutShape(d.map((e=>e.shape)),a);l.shape=p;return n.dataIdMap.get(l.dataId).stringBytes=s.backend_util.fromStringArrayToUint8(f),e.forEach((e=>n.disposeData(e.dataId))),l}const f=s.util.sizeFromShape(d[0].shape.slice(0,a));let p=0;const m=d.map((e=>{const t=s.util.sizeFromShape(e.shape.slice(a));return p+=t,t})),h=d.map((e=>n.typedArrayFromHeap(e))),b=n.typedArrayFromHeap(l);for(let e=0;e= 0.0) ? scale * x : scaleAlpha * (exp(x) - 1.0);\n`,i=Object(o.unaryKernelFunc)({opSnippet:r}),a={kernelName:s.Selu,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sigmoid.js": -/*!*****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sigmoid.js ***! - \*****************************************************************************/ -/*! exports provided: sigmoid, sigmoidConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sigmoid",(function(){return r})),n.d(t,"sigmoidConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +const r=Object(o.createUnaryKernelConfig)(s.Cos)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Cosh.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Cosh.js ***! + \*************************************************************************/ +/*! exports provided: coshConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"coshConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2021 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -10102,11 +10088,15 @@ const r=`\n // Stable and Attracting Fixed Point (0, 1) for Normalized Weights. * limitations under the License. * ============================================================================= */ -const r=Object(o.unaryKernelFunc)({opSnippet:"return 1.0 / (1.0 + exp(-1.0 * x));"}),i={kernelName:s.Sigmoid,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sign.js": -/*!**************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sign.js ***! - \**************************************************************************/ -/*! exports provided: sign, signConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sign",(function(){return r})),n.d(t,"signConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +const r=Object(o.createUnaryKernelConfig)(s.Cosh)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/CropAndResize.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/CropAndResize.js ***! + \**********************************************************************************/ +/*! exports provided: cropAndResizeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"cropAndResizeConfig",(function(){return a}));var s,o=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),r=n(/*! ./Cast */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Cast.js");let i;!function(e){e[e.bilinear=0]="bilinear",e[e.nearest=1]="nearest"}(s||(s={}));const a={kernelName:o.CropAndResize,backendName:"wasm",setupFunc:function(e){i=e.wasm.cwrap(o.CropAndResize,null,["number","number","number","number","array","number","number","number","number","number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:o}=e,{method:a,extrapolationValue:u,cropSize:d}=o,{image:l,boxes:c,boxInd:f}=n,p=c.shape[0],[m,h]=d,b=[p,m,h,l.shape[3]];let j,g=t.dataIdMap.get(l.dataId);"float32"!==l.dtype&&(j=Object(r.cast)({backend:t,inputs:{x:l},attrs:{dtype:"float32"}}),g=t.dataIdMap.get(j.dataId));const w=g.id,_=t.dataIdMap.get(c.dataId).id,k=t.dataIdMap.get(f.dataId).id,v=t.makeOutput(b,"float32"),x=t.dataIdMap.get(v.dataId).id,y=new Uint8Array(new Int32Array(l.shape).buffer);return i(w,_,k,p,y,m,h,s[a],u,x),null!=j&&t.disposeData(j.dataId),v}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Cumsum.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Cumsum.js ***! + \***************************************************************************/ +/*! exports provided: cumsum, cumsumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"cumsum",(function(){return a})),n.d(t,"cumsumConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"),r=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Transpose.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -10123,14 +10113,14 @@ const r=Object(o.unaryKernelFunc)({opSnippet:"return 1.0 / (1.0 + exp(-1.0 * x)) * limitations under the License. * ============================================================================= */ -const r=Object(o.unaryKernelFunc)({opSnippet:"\n if (isnan(x)) { return 0.0; }\n return sign(x);\n"}),i={kernelName:s.Sign,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sin.js": -/*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sin.js ***! - \*************************************************************************/ -/*! exports provided: sin, sinConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sin",(function(){return i})),n.d(t,"sinConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +let i;function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:u}=t,{axis:d,exclusive:l,reverse:c}=a,f=u.shape.length;s.util.assert("float32"===u.dtype||"int32"===u.dtype,(()=>`cumsum does not support ${u.dtype} tensors in the WASM backend`));const p=s.backend_util.getAxesPermutation([d],f);let m=u;null!==p&&(m=Object(r.transpose)({inputs:{x:u},attrs:{perm:p},backend:n}));const h=s.backend_util.getInnerMostAxes(1,f)[0];s.backend_util.assertAxesAreInnerMostDims("cumsum",[h],f);const b=n.makeOutput(m.shape,m.dtype),j=m.shape[h],g=n.dataIdMap.get(m.dataId).id,w=n.dataIdMap.get(b.dataId).id;i(g,l?1:0,c?1:0,j,w,o.CppDType[u.dtype]);let _=b;if(null!==p){const e=s.backend_util.getUndoAxesPermutation(p);_=Object(r.transpose)({inputs:{x:b},attrs:{perm:e},backend:n}),n.disposeData(m.dataId),n.disposeData(b.dataId)}return _}const u={kernelName:s.Cumsum,backendName:"wasm",setupFunc:function(e){i=e.wasm.cwrap(s.Cumsum,null,["number","number","number","number","number","number"])},kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/DepthToSpace.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/DepthToSpace.js ***! + \*********************************************************************************/ +/*! exports provided: depthToSpace, depthToSpaceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"depthToSpace",(function(){return r})),n.d(t,"depthToSpaceConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -10143,15 +10133,14 @@ const r=Object(o.unaryKernelFunc)({opSnippet:"\n if (isnan(x)) { return 0.0; }\ * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -const r=o.CHECK_NAN_SNIPPET_UNARY+"\n return sin(x);\n",i=Object(o.unaryKernelFunc)({opSnippet:r}),a={kernelName:s.Sin,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sinh.js": -/*!**************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sinh.js ***! - \**************************************************************************/ -/*! exports provided: sinh, sinhConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sinh",(function(){return r})),n.d(t,"sinhConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); + */let o;function r(e){const{backend:t,inputs:n,attrs:r}=e,{x:i}=n,{blockSize:a,dataFormat:u}=r;s.util.assert(a>1,(()=>`blockSize should be > 1 for depthToSpace, but was: ${a}`));const d=i.shape[0],l="NHWC"===u?i.shape[1]:i.shape[2],c="NHWC"===u?i.shape[2]:i.shape[3],f="NHWC"===u?i.shape[3]:i.shape[1],p=l*a,m=c*a,h=f/(a*a),b="NHWC"===u?[d,p,m,h]:[d,h,p,m],j=t.makeOutput(b,"float32"),g=t.dataIdMap.get(i.dataId).id,w=new Uint8Array(new Int32Array(s.util.computeStrides(i.shape)).buffer),_=new Uint8Array(new Int32Array(b).buffer),k=new Uint8Array(new Int32Array(s.util.computeStrides(b)).buffer),v=t.dataIdMap.get(j.dataId).id;return o(g,a,"NHWC"===u?1:0,w,i.shape.length-1,_,k,b.length,v),j}const i={kernelName:s.DepthToSpace,backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.DepthToSpace,null,["number","number","number","array","number","array","array","number","number"])},kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/DepthwiseConv2dNative.js": +/*!******************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/DepthwiseConv2dNative.js ***! + \******************************************************************************************/ +/*! exports provided: depthwiseConv2dNativeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"depthwiseConv2dNativeConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -10164,12 +10153,11 @@ const r=o.CHECK_NAN_SNIPPET_UNARY+"\n return sin(x);\n",i=Object(o.unaryKernelF * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -const r=Object(o.unaryKernelFunc)({opSnippet:"\n float e2x = exp(x);\n return (e2x - 1.0 / e2x) / 2.0;\n"}),i={kernelName:s.Sinh,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Slice.js": -/*!***************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Slice.js ***! - \***************************************************************************/ -/*! exports provided: slice, sliceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"slice",(function(){return a})),n.d(t,"sliceConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"),r=n(/*! ../slice_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/slice_gpu.js"),i=n(/*! ../slice_packed_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/slice_packed_gpu.js");function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:d}=t,{begin:u,size:l}=a,[c,f]=s.slice_util.parseSliceParams(d,u,l);if(s.slice_util.assertParamsValid(d,c,f),0===s.util.sizeFromShape(f))return n.makeTensorInfo(f,d.dtype,[]);if(n.shouldExecuteOnCPU([d])||"string"===d.dtype){const e=n.texData.get(d.dataId),t=Object(o.sliceImplCPU)(e.values,c,f,d.shape,d.dtype);return n.makeTensorInfo(f,d.dtype,t)}const{isPacked:p}=n.texData.get(d.dataId),m=s.slice_util.isSliceContinous(d.shape,c,f);if(p||!m){const e=Object(s.env)().getBool("WEBGL_PACK_ARRAY_OPERATIONS")?new i.SlicePackedProgram(f):new r.SliceProgram(f),t=[c];return n.runWebGLProgram(e,[d],d.dtype,t)}return n.uploadToGPU(d.dataId), + */let o;const r={kernelName:s.DepthwiseConv2dNative,backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.DepthwiseConv2dNative,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:t,attrs:n,backend:r}=e,{x:i,filter:a}=t,u=r.dataIdMap.get(i.dataId).id,d=r.dataIdMap.get(a.dataId).id,{strides:l,dilations:c,pad:f,dimRoundingMode:p}=n,m=null==c?[1,1]:c,h=s.backend_util.computeConv2DInfo(i.shape,a.shape,l,m,f,p,!0),b=h.filterHeight,j=h.filterWidth,g=h.padInfo.top,w=h.padInfo.right,_=h.padInfo.bottom,k=h.padInfo.left,v=h.dilationHeight,x=h.dilationWidth,y=h.strideHeight,O=h.strideWidth,I=h.inChannels,C=h.outChannels,S="SAME"===h.padInfo.type?1:0;if("channelsLast"!==h.dataFormat)throw new Error(`wasm backend DepthwiseConv2dNative does not support dataFormat:'${h.dataFormat}'. Please use 'channelsLast'.`);const T=r.makeOutput(h.outShape,"float32"),N=r.dataIdMap.get(T.dataId).id;return o(u,i.shape[0],i.shape[1],i.shape[2],d,b,j,g,w,_,k,S,v,x,y,O,I,C,N),T}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Equal.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Equal.js ***! + \**************************************************************************/ +/*! exports provided: equalConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"equalConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -10186,14 +10174,14 @@ const r=Object(o.unaryKernelFunc)({opSnippet:"\n float e2x = exp(x);\n return * limitations under the License. * ============================================================================= */ -function(e,t,n,o){const r=o.texData.get(e.dataId),i=o.makeTensorInfo(n,e.dtype),a=o.texData.get(i.dataId);Object.assign(a,r),a.refCount=1,a.shape=n,a.dtype=e.dtype;let d=s.slice_util.computeFlatOffset(t,s.util.computeStrides(e.shape));r.slice&&(d+=r.slice.flatOffset),a.slice={flatOffset:d,origDataId:r.slice&&r.slice.origDataId||e.dataId};const u=o.dataRefCount.get(a.slice.origDataId)||1;return o.dataRefCount.set(a.slice.origDataId,u+1),i}(d,c,f,n)}const d={kernelName:s.Slice,backendName:"webgl",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Softmax.js": -/*!*****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Softmax.js ***! - \*****************************************************************************/ -/*! exports provided: softmax, softmaxConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"softmax",(function(){return l})),n.d(t,"softmaxConfig",(function(){return c}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Exp */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Exp.js"),r=n(/*! ./Max */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Max.js"),i=n(/*! ./RealDiv */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/RealDiv.js"),a=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),d=n(/*! ./Sub */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sub.js"),u=n(/*! ./Sum */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sum.js"); +const r=Object(o.createBinaryKernelConfig)(s.Equal,!1,"bool")},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Exp.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Exp.js ***! + \************************************************************************/ +/*! exports provided: expConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"expConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -10207,14 +10195,14 @@ function(e,t,n,o){const r=o.texData.get(e.dataId),i=o.makeTensorInfo(n,e.dtype), * limitations under the License. * ============================================================================= */ -function l(e){const{inputs:t,backend:n,attrs:l}=e,{logits:c}=t,{dim:f}=l,p=s.util.parseAxisParam([f],c.shape),m=Object(r.max)({inputs:{x:c},backend:n,attrs:{reductionIndices:p,keepDims:!1}}),h=s.backend_util.expandShapeToKeepDim(m.shape,p),b=Object(a.reshape)({inputs:{x:m},backend:n,attrs:{shape:h}}),j=Object(d.sub)({inputs:{a:c,b:b},backend:n}),g=Object(o.exp)({inputs:{x:j},backend:n}),w=Object(u.sum)({inputs:{x:g},backend:n,attrs:{axis:p,keepDims:!1}}),_=Object(a.reshape)({inputs:{x:w},backend:n,attrs:{shape:h}}),k=Object(i.realDiv)({inputs:{a:g,b:_},backend:n});return n.disposeIntermediateTensorInfo(m),n.disposeIntermediateTensorInfo(b),n.disposeIntermediateTensorInfo(j),n.disposeIntermediateTensorInfo(g),n.disposeIntermediateTensorInfo(w),n.disposeIntermediateTensorInfo(_),k}const c={kernelName:s.Softmax,backendName:"webgl",kernelFunc:l}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Softplus.js": -/*!******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Softplus.js ***! - \******************************************************************************/ -/*! exports provided: softplus, softplusConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"softplus",(function(){return r})),n.d(t,"softplusConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +const r=Object(o.createUnaryKernelConfig)(s.Exp)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ExpandDims.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ExpandDims.js ***! + \*******************************************************************************/ +/*! exports provided: expandDims, expandDimsConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"expandDims",(function(){return r})),n.d(t,"expandDimsConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Reshape.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -10228,11 +10216,11 @@ function l(e){const{inputs:t,backend:n,attrs:l}=e,{logits:c}=t,{dim:f}=l,p=s.uti * limitations under the License. * ============================================================================= */ -const r=Object(o.unaryKernelFunc)({opSnippet:"\n float epsilon = 1.1920928955078125e-7;\n float threshold = log(epsilon) + 2.0;\n\n bool too_large = x > -threshold;\n bool too_small = x < threshold;\n\n float result;\n float exp_x = exp(x);\n\n if (too_large){\n result = x;\n }\n else if (too_small){\n result = exp_x;\n }\n else{\n result = log(exp_x + 1.0);\n }\n return result;\n"}),i={kernelName:s.Softplus,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SpaceToBatchND.js": -/*!************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SpaceToBatchND.js ***! - \************************************************************************************/ -/*! exports provided: spaceToBatchND, spaceToBatchNDConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"spaceToBatchND",(function(){return a})),n.d(t,"spaceToBatchNDConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./PadV2 */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/PadV2.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),i=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"); +function r(e){const{inputs:t,attrs:n,backend:r}=e,{input:i}=t,{dim:a}=n,u=i.shape.length,d=i.shape.slice();let l=a;return a<0&&(s.util.assert(-(u+1)<=a,(()=>`Axis must be in the interval [${-(u+1)}, ${u}]`)),l=u+a+1),d.splice(l,0,1),Object(o.reshape)({inputs:{x:i},backend:r,attrs:{shape:d}})}const i={kernelName:s.ExpandDims,backendName:"wasm",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Fill.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Fill.js ***! + \*************************************************************************/ +/*! exports provided: fillConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fillConfig",(function(){return s}));const s={kernelName:n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js").Fill,backendName:"wasm",kernelFunc: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -10249,14 +10237,14 @@ const r=Object(o.unaryKernelFunc)({opSnippet:"\n float epsilon = 1.192092895507 * limitations under the License. * ============================================================================= */ -const a=e=>{const{inputs:t,backend:n,attrs:a}=e,{x:d}=t,{blockShape:u,paddings:l}=a;s.util.assert(d.shape.length<=4,(()=>"spaceToBatchND for rank > 4 with a WebGL backend not implemented yet"));const c=u.reduce(((e,t)=>e*t)),f=[[0,0]];f.push(...l);for(let e=1+u.length;en.disposeIntermediateTensorInfo(e))),_},d={kernelName:s.SpaceToBatchND,backendName:"webgl",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseFillEmptyRows.js": -/*!*****************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseFillEmptyRows.js ***! - \*****************************************************************************************/ -/*! exports provided: sparseFillEmptyRows, sparseFillEmptyRowsConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sparseFillEmptyRows",(function(){return r})),n.d(t,"sparseFillEmptyRowsConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +function(e){const{attrs:{shape:t,value:n,dtype:s},backend:o}=e,r=o.makeOutput(t,s);return o.typedArrayFromHeap(r).fill(n),r}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FlipLeftRight.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FlipLeftRight.js ***! + \**********************************************************************************/ +/*! exports provided: flipLeftRight, flipLeftRightConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"flipLeftRight",(function(){return r})),n.d(t,"flipLeftRightConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license - * Copyright 2021 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -10269,15 +10257,14 @@ const a=e=>{const{inputs:t,backend:n,attrs:a}=e,{x:d}=t,{blockShape:u,paddings:l * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -function r(e){const{inputs:t,backend:n}=e,{indices:s,values:r,denseShape:i,defaultValue:a}=t;if(1!==i.shape.length)throw new Error(`Dense shape must be a vector, saw:\n ${i.shape}`);if(2!==s.shape.length)throw new Error(`Indices must be a matrix, saw:\n ${s.shape}`);if(1!==r.shape.length)throw new Error(`Values must be a vector, saw:\n ${r.shape}`);if(0!==a.shape.length)throw new Error(`Default value must be a scalar, saw:\n ${a.shape}`);const d=n.readSync(s.dataId),u=n.readSync(r.dataId),l=n.readSync(i.dataId),c=n.readSync(a.dataId)[0],[f,p,m,h,b]=Object(o.sparseFillEmptyRowsImplCPU)(d,s.shape,s.dtype,u,r.dtype,l,c);return[n.makeTensorInfo(p,s.dtype,f),n.makeTensorInfo([p[0]],r.dtype,m),n.makeTensorInfo([h.length],"bool",new Uint8Array(h.map((e=>Number(e))))),n.makeTensorInfo([b.length],s.dtype,new Int32Array(b))]}const i={kernelName:s.SparseFillEmptyRows,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseReshape.js": -/*!***********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseReshape.js ***! - \***********************************************************************************/ -/*! exports provided: sparseReshape, sparseReshapeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sparseReshape",(function(){return r})),n.d(t,"sparseReshapeConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); + */let o;function r(e){const{inputs:t,backend:n}=e,{image:s}=t,r=n.makeOutput(s.shape,s.dtype),i=n.dataIdMap.get(s.dataId).id,a=n.dataIdMap.get(r.dataId).id,[u,d,l,c]=s.shape;return o(i,u,d,l,c,a),r}const i={kernelName:s.FlipLeftRight,backendName:"wasm",kernelFunc:r,setupFunc:function(e){o=e.wasm.cwrap(s.FlipLeftRight,null,["number","number","number","number","number","number"])}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Floor.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Floor.js ***! + \**************************************************************************/ +/*! exports provided: floorConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"floorConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); /** * @license - * Copyright 2021 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -10291,14 +10278,14 @@ function r(e){const{inputs:t,backend:n}=e,{indices:s,values:r,denseShape:i,defau * limitations under the License. * ============================================================================= */ -function r(e){const{inputs:t,backend:n}=e,{inputIndices:s,inputShape:r,newShape:i}=t;if(2!==s.shape.length)throw new Error(`Input indices should be a matrix but received shape ${s.shape}`);if(1!==r.shape.length)throw new Error(`Input shape should be a vector but received shape ${r.shape}`);if(1!==i.shape.length)throw new Error(`Target shape should be a vector but received shape ${i.shape}`);const a=Array.from(n.readSync(r.dataId)),d=n.readSync(s.dataId),u=Array.from(n.readSync(i.dataId)),[l,c,f]=Object(o.sparseReshapeImplCPU)(d,s.shape,s.dtype,a,u);return[n.makeTensorInfo(c,s.dtype,l),n.makeTensorInfo([f.length],i.dtype,new Int32Array(f))]}const i={kernelName:s.SparseReshape,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseSegmentMean.js": -/*!***************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseSegmentMean.js ***! - \***************************************************************************************/ -/*! exports provided: sparseSegmentMean, sparseSegmentMeanConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sparseSegmentMean",(function(){return r})),n.d(t,"sparseSegmentMeanConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +const r=Object(o.createUnaryKernelConfig)(s.Floor)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FloorDiv.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FloorDiv.js ***! + \*****************************************************************************/ +/*! exports provided: floorDivConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"floorDivConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); /** * @license - * Copyright 2021 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -10312,14 +10299,14 @@ function r(e){const{inputs:t,backend:n}=e,{inputIndices:s,inputShape:r,newShape: * limitations under the License. * ============================================================================= */ -function r(e){const{inputs:t,backend:n}=e,{data:s,indices:r,segmentIds:i}=t;if(s.shape.length<1)throw new Error("Data should be at least 1 dimensional but received scalar");if(1!==r.shape.length)throw new Error(`Indices should be a vector but received shape\n ${r.shape}`);if(1!==i.shape.length)throw new Error(`Segment ids should be a vector but received shape\n ${i.shape}`);const a=n.readSync(s.dataId),d=n.readSync(r.dataId),u=n.readSync(i.dataId),[l,c]=Object(o.sparseSegmentReductionImplCPU)(a,s.shape,s.dtype,d,u,!0);return n.makeTensorInfo(c,s.dtype,l)}const i={kernelName:s.SparseSegmentMean,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseSegmentSum.js": -/*!**************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseSegmentSum.js ***! - \**************************************************************************************/ -/*! exports provided: sparseSegmentSum, sparseSegmentSumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sparseSegmentSum",(function(){return r})),n.d(t,"sparseSegmentSumConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +const r=Object(o.createBinaryKernelConfig)(s.FloorDiv,!1)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FusedBatchNorm.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FusedBatchNorm.js ***! + \***********************************************************************************/ +/*! exports provided: fusedBatchNormConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fusedBatchNormConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license - * Copyright 2021 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -10332,15 +10319,14 @@ function r(e){const{inputs:t,backend:n}=e,{data:s,indices:r,segmentIds:i}=t;if(s * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -function r(e){const{inputs:t,backend:n}=e,{data:s,indices:r,segmentIds:i}=t;if(s.shape.length<1)throw new Error("Data should be at least 1 dimensional but received scalar");if(1!==r.shape.length)throw new Error(`Indices should be a vector but received shape\n ${r.shape}`);if(1!==i.shape.length)throw new Error(`Segment ids should be a vector but received shape\n ${i.shape}`);const a=n.readSync(s.dataId),d=n.readSync(r.dataId),u=n.readSync(i.dataId),[l,c]=Object(o.sparseSegmentReductionImplCPU)(a,s.shape,s.dtype,d,u);return n.makeTensorInfo(c,s.dtype,l)}const i={kernelName:s.SparseSegmentSum,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseToDense.js": -/*!***********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseToDense.js ***! - \***********************************************************************************/ -/*! exports provided: sparseToDense, sparseToDenseConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sparseToDense",(function(){return i})),n.d(t,"sparseToDenseConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../scatter_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/scatter_gpu.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); + */let o;const r={kernelName:s.FusedBatchNorm,backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.FusedBatchNorm,null,["number","number","number","number","number","number","number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:r}=e,{varianceEpsilon:i}=r,{x:a,mean:u,variance:d,offset:l,scale:c}=n,f=t.dataIdMap.get(a.dataId).id,p=t.dataIdMap.get(u.dataId).id,m=t.dataIdMap.get(d.dataId).id,h=null!=l?t.dataIdMap.get(l.dataId).id:0,b=null!=c?t.dataIdMap.get(c.dataId).id:0,j=t.makeOutput(a.shape,a.dtype);if(0===s.util.sizeFromShape(a.shape))return j;const g=t.dataIdMap.get(j.dataId).id;return o(f,p,m,h,b,i,g),j}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FusedConv2D.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FusedConv2D.js ***! + \********************************************************************************/ +/*! exports provided: fusedConv2DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fusedConv2DConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -10354,14 +10340,14 @@ function r(e){const{inputs:t,backend:n}=e,{data:s,indices:r,segmentIds:i}=t;if(s * limitations under the License. * ============================================================================= */ -function i(e){const{inputs:t,backend:n,attrs:i}=e,{sparseIndices:a,sparseValues:d,defaultValue:u}=t,{outputShape:l}=i,{sliceRank:c,numUpdates:f,strides:p,outputSize:m}=s.backend_util.calculateShapes(d,a,l),h=new o.ScatterProgram(f,c,a.shape.length,d.shape.length,p,[m,1],!1),b=n.runWebGLProgram(h,[d,a,u],d.dtype),j=Object(r.reshape)({inputs:{x:b},backend:n,attrs:{shape:l}});return n.disposeIntermediateTensorInfo(b),j}const a={kernelName:s.SparseToDense,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SplitV.js": -/*!****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SplitV.js ***! - \****************************************************************************/ -/*! exports provided: splitV, splitVConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"splitV",(function(){return r})),n.d(t,"splitVConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Slice */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Slice.js"); +let r;const i={kernelName:s.FusedConv2D,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.FusedConv2D,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:t,attrs:n,backend:i}=e,{x:a,filter:u,bias:d,preluActivationWeights:l}=t,{strides:c,pad:f,dilations:p,dataFormat:m,dimRoundingMode:h,activation:b,leakyreluAlpha:j}=n,g=s.backend_util.computeConv2DInfo(a.shape,u.shape,c,p,f,h),w=o.FusableActivation[b];if(null==w)throw new Error(`${b} activation not yet supported for FusedConv2D in the wasm backend.`);const _=i.dataIdMap.get(a.dataId).id,k=i.dataIdMap.get(u.dataId).id,v=g.outChannels;let x=0;if(null!=d){const e=i.dataIdMap.get(d.dataId);if(1!==e.shape.length)throw new Error(`FusedConv2D only supports rank-1 bias but got rank ${e.shape.length}.`);if(e.shape[0]!==v)throw new Error(`FusedConv2D bias shape (${e.shape}) does not match the number of output channels (${v})`);x=e.id}const y=g.filterHeight,O=g.filterWidth,I=g.padInfo.top,C=g.padInfo.right,S=g.padInfo.bottom,T=g.padInfo.left,N=g.dilationHeight,E=g.dilationWidth,A=g.strideHeight,R=g.strideWidth,F=g.inChannels,M="SAME"===g.padInfo.type?1:0,$=g.batchSize,D=g.inHeight,P=g.inWidth;if("NHWC"!==m)throw new Error(`wasm backend FusedConv2D does not support dataFormat:'${m}'. Please use 'NHWC'.`);const B=i.makeOutput(g.outShape,"float32"),L=i.dataIdMap.get(B.dataId).id,z=null==l?0:i.dataIdMap.get(l.dataId).id;return r(_,$,D,P,k,y,O,x,I,C,S,T,M,N,E,A,R,F,v,w,z,j||0,L),B}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FusedDepthwiseConv2D.js": +/*!*****************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FusedDepthwiseConv2D.js ***! + \*****************************************************************************************/ +/*! exports provided: fusedDepthwiseConv2DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fusedDepthwiseConv2DConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -10375,14 +10361,14 @@ function i(e){const{inputs:t,backend:n,attrs:i}=e,{sparseIndices:a,sparseValues: * limitations under the License. * ============================================================================= */ -function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i}=t,{numOrSizeSplits:a,axis:d}=r,u=s.util.parseAxisParam(d,i.shape)[0],l=s.backend_util.prepareSplitSize(i,a,u),c=i.shape.length,f=new Array(c).fill(0),p=i.shape.slice();return l.map((e=>{const t=[...p];t[u]=e;const s=Object(o.slice)({inputs:{x:i},backend:n,attrs:{begin:f,size:t}});return f[u]+=e,s}))}const i={kernelName:s.SplitV,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sqrt.js": -/*!**************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sqrt.js ***! - \**************************************************************************/ -/*! exports provided: sqrt, sqrtConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sqrt",(function(){return r})),n.d(t,"sqrtConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +let r;const i={kernelName:s.FusedDepthwiseConv2D,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.FusedDepthwiseConv2D,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:t,attrs:n,backend:i}=e,{x:a,filter:u,bias:d,preluActivationWeights:l}=t,{strides:c,pad:f,dilations:p,dataFormat:m,dimRoundingMode:h,activation:b,leakyreluAlpha:j}=n,g=s.backend_util.computeConv2DInfo(a.shape,u.shape,c,p,f,h,!0),w=o.FusableActivation[b];if(null==w)throw new Error(`${b} activation not yet supported for FusedDepthwiseConv2D in the wasm backend.`);const _=i.dataIdMap.get(a.dataId).id,k=i.dataIdMap.get(u.dataId).id,v=g.outChannels;let x=0;if(null!=d){const e=i.dataIdMap.get(d.dataId);if(1!==e.shape.length)throw new Error(`FusedDepthwiseConv2D only supports rank-1 bias but got rank ${e.shape.length}.`);if(e.shape[0]!==v)throw new Error(`FusedDepthwiseConv2D bias shape (${e.shape}) does not match the number of output channels (${v})`);x=e.id}const y=g.filterHeight,O=g.filterWidth,I=g.padInfo.top,C=g.padInfo.right,S=g.padInfo.bottom,T=g.padInfo.left,N=g.dilationHeight,E=g.dilationWidth,A=g.strideHeight,R=g.strideWidth,F=g.inChannels,M="SAME"===g.padInfo.type?1:0,$=g.batchSize,D=g.inHeight,P=g.inWidth;if("NHWC"!==m)throw new Error(`wasm backend FusedDepthwiseConv2D does not support dataFormat:'${m}'. Please use 'NHWC'.`);const B=i.makeOutput(g.outShape,"float32"),L=i.dataIdMap.get(B.dataId).id,z=null==l?0:i.dataIdMap.get(l.dataId).id;return r(_,$,D,P,k,y,O,x,I,C,S,T,M,N,E,A,R,F,v,w,z,j||0,L),B}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/GatherNd.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/GatherNd.js ***! + \*****************************************************************************/ +/*! exports provided: gatherNdConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"gatherNdConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -10396,11 +10382,11 @@ function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i}=t,{numOrSizeSplits:a,axi * limitations under the License. * ============================================================================= */ -const r=Object(o.unaryKernelFunc)({opSnippet:"return sqrt(x);"}),i={kernelName:s.Sqrt,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Square.js": -/*!****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Square.js ***! - \****************************************************************************/ -/*! exports provided: square, squareConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"square",(function(){return r})),n.d(t,"squareConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +let r;const i={kernelName:s.GatherNd,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.GatherNd,null,["number","number","number","number","number","number","array","number"])},kernelFunc:function(e){const{backend:t,inputs:n}=e,{params:i,indices:a}=n,[u,d,l,c]=s.gather_util.prepareAndValidate(i,a),f=t.makeOutput(u,i.dtype);if(0===d)return f;const p=a.shape,m=p[p.length-1],h=t.dataIdMap.get(i.dataId).id,b=t.dataIdMap.get(a.dataId).id,j=new Uint8Array(new Int32Array(c).buffer),g=t.dataIdMap.get(f.dataId).id;return r(h,o.CppDType[i.dtype],b,d,m,l,j,g),f}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/GatherV2.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/GatherV2.js ***! + \*****************************************************************************/ +/*! exports provided: gatherV2Config */function(e,t,n){"use strict";n.r(t),n.d(t,"gatherV2Config",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Reshape.js"),r=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); /** * @license * Copyright 2019 Google LLC. All Rights Reserved. @@ -10417,14 +10403,14 @@ const r=Object(o.unaryKernelFunc)({opSnippet:"return sqrt(x);"}),i={kernelName:s * limitations under the License. * ============================================================================= */ -const r=Object(o.unaryKernelFunc)({opSnippet:"return x * x;"}),i={kernelName:s.Square,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SquaredDifference.js": -/*!***************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SquaredDifference.js ***! - \***************************************************************************************/ -/*! exports provided: squaredDifference, squaredDifferenceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"squaredDifference",(function(){return i})),n.d(t,"squaredDifferenceConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +let i;const a={kernelName:s.GatherV2,backendName:"wasm",setupFunc:function(e){i=e.wasm.cwrap("Gather",null,["number","number","array","number","number","number","array","number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:a}=e,{x:u,indices:d}=n,{axis:l,batchDims:c}=a,f=s.util.parseAxisParam(l,u.shape)[0],p=s.backend_util.segment_util.collectGatherOpShapeInfo(u,d,f,c),m=Object(o.reshape)({inputs:{x:u},attrs:{shape:[p.batchSize,p.outerSize,p.dimSize,p.sliceSize]},backend:t}),h=s.util.sizeFromShape(d.shape),b=Object(o.reshape)({inputs:{x:d},attrs:{shape:[p.batchSize,h/p.batchSize]},backend:t}),j=[p.batchSize,p.outerSize,h/p.batchSize,p.sliceSize],g=t.makeOutput(j,u.dtype);if(0===s.util.sizeFromShape(u.shape))return g;const w=m.shape.length-1,_=t.dataIdMap.get(m.dataId).id,k=t.dataIdMap.get(b.dataId).id,v=t.dataIdMap.get(g.dataId).id,x=new Uint8Array(new Int32Array(s.util.computeStrides(m.shape)).buffer),y=new Uint8Array(new Int32Array(s.util.computeStrides(j)).buffer);return i(_,r.CppDType[u.dtype],x,w,k,p.batchSize,y,v),t.disposeData(m.dataId),t.disposeData(b.dataId),g.shape=p.outputShape,g}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Greater.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Greater.js ***! + \****************************************************************************/ +/*! exports provided: greaterConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"greaterConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -10438,14 +10424,14 @@ const r=Object(o.unaryKernelFunc)({opSnippet:"return x * x;"}),i={kernelName:s.S * limitations under the License. * ============================================================================= */ -const r="return (a - b) * (a - b);",i=Object(o.binaryKernelFunc)({opSnippet:r,packedOpSnippet:r}),a={kernelName:s.SquaredDifference,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Step.js": -/*!**************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Step.js ***! - \**************************************************************************/ -/*! exports provided: step, stepConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"step",(function(){return r})),n.d(t,"stepConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../unaryop_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js"); +const r=Object(o.createBinaryKernelConfig)(s.Greater,!1,"bool")},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/GreaterEqual.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/GreaterEqual.js ***! + \*********************************************************************************/ +/*! exports provided: greaterEqualConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"greaterEqualConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -10459,11 +10445,11 @@ const r="return (a - b) * (a - b);",i=Object(o.binaryKernelFunc)({opSnippet:r,pa * limitations under the License. * ============================================================================= */ -function r({inputs:e,attrs:t,backend:n}){const{x:s}=e,r=o.CHECK_NAN_SNIPPET+`\n return x > 0.0 ? 1.0 : float(${t.alpha});\n `,i=new o.UnaryOpProgram(s.shape,r);return n.runWebGLProgram(i,[s],s.dtype)}const i={kernelName:s.Step,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/StridedSlice.js": -/*!**********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/StridedSlice.js ***! - \**********************************************************************************/ -/*! exports provided: stridedSlice, stridedSliceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"stridedSlice",(function(){return d})),n.d(t,"stridedSliceConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"),r=n(/*! ../strided_slice_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/strided_slice_gpu.js"),i=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),a=n(/*! ./Slice */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Slice.js"); +const r=Object(o.createBinaryKernelConfig)(s.GreaterEqual,!1,"bool")},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Identity.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Identity.js ***! + \*****************************************************************************/ +/*! exports provided: identity, identityConfig */function(e,t,n){"use strict"; /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -10480,14 +10466,14 @@ function r({inputs:e,attrs:t,backend:n}){const{x:s}=e,r=o.CHECK_NAN_SNIPPET+`\n * limitations under the License. * ============================================================================= */ -function d(e){const{inputs:t,backend:n,attrs:d}=e,{x:u}=t,{begin:l,end:c,strides:f,beginMask:p,endMask:m,ellipsisMask:h,newAxisMask:b,shrinkAxisMask:j}=d,{nonStrided:g,$begin:w,$strides:_,size:k,newShape:v,outShape:x}=s.slice_util.sliceInfo(u.shape,l,c,f,p,m,h,b,j),y=Object(i.reshape)({inputs:{x:u},backend:n,attrs:{shape:v}});let O;if(g){const e=Object(a.slice)({inputs:{x:y},backend:n,attrs:{begin:w,size:k}});O=Object(i.reshape)({inputs:{x:e},backend:n,attrs:{shape:x}}),n.disposeIntermediateTensorInfo(e)}else if(x.some((e=>0===e)))O=n.makeTensorInfo(x,u.dtype,[]);else{if(n.shouldExecuteOnCPU([y])){const e=n.texData.get(y.dataId).values,t=Object(s.buffer)(y.shape,y.dtype,e),r=Object(o.stridedSliceImplCPU)(x,t,_,w);O=n.makeTensorInfo(x,y.dtype,r.values)}else{const e=new r.StridedSliceProgram(w,_,x);O=n.runWebGLProgram(e,[y],y.dtype)}}const I=Object(i.reshape)({inputs:{x:O},backend:n,attrs:{shape:x}});return n.disposeIntermediateTensorInfo(y),n.disposeIntermediateTensorInfo(O),I}const u={kernelName:s.StridedSlice,backendName:"webgl",kernelFunc:d}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/StringNGrams.js": -/*!**********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/StringNGrams.js ***! - \**********************************************************************************/ -/*! exports provided: stringNGrams, stringNGramsConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"stringNGrams",(function(){return r})),n.d(t,"stringNGramsConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +function s(e){const{inputs:{x:t},backend:n}=e,s=n.makeOutput(t.shape,t.dtype),o=n.typedArrayFromHeap(t);return n.typedArrayFromHeap(s).set(o),s}n.r(t),n.d(t,"identity",(function(){return s})),n.d(t,"identityConfig",(function(){return o}));const o={kernelName:n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js").Identity,backendName:"wasm",kernelFunc:s}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/LeakyRelu.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/LeakyRelu.js ***! + \******************************************************************************/ +/*! exports provided: leakyRelu, leakyReluConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"leakyRelu",(function(){return r})),n.d(t,"leakyReluConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license - * Copyright 2021 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -10500,15 +10486,14 @@ function d(e){const{inputs:t,backend:n,attrs:d}=e,{x:u}=t,{begin:l,end:c,strides * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -function r(e){const{inputs:t,backend:n,attrs:s}=e,{separator:r,nGramWidths:i,leftPad:a,rightPad:d,padWidth:u,preserveShortSequences:l}=s,{data:c,dataSplits:f}=t,p=n.readSync(c.dataId),m=n.readSync(f.dataId),[h,b]=Object(o.stringNGramsImplCPU)(p,m,r,i,a,d,u,l);return[n.makeTensorInfo([h.length],"string",h),n.makeTensorInfo(f.shape,"int32",b)]}const i={kernelName:s.StringNGrams,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/StringSplit.js": -/*!*********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/StringSplit.js ***! - \*********************************************************************************/ -/*! exports provided: stringSplit, stringSplitConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"stringSplit",(function(){return r})),n.d(t,"stringSplitConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); + */let o;function r(e){const{inputs:{x:t},attrs:{alpha:n},backend:r}=e,i=r.dataIdMap.get(t.dataId).id,a=r.makeOutput(t.shape,t.dtype);if(0!==s.util.sizeFromShape(t.shape)){const e=r.dataIdMap.get(a.dataId).id;o(i,n,e)}return a}const i={kernelName:s.LeakyRelu,backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.LeakyRelu,null,["number","number","number"])},kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Less.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Less.js ***! + \*************************************************************************/ +/*! exports provided: lessConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"lessConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); /** * @license - * Copyright 2021 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -10522,14 +10507,14 @@ function r(e){const{inputs:t,backend:n,attrs:s}=e,{separator:r,nGramWidths:i,lef * limitations under the License. * ============================================================================= */ -function r(e){const{inputs:t,backend:n,attrs:s}=e,{skipEmpty:r}=s,{input:i,delimiter:a}=t;if("string"!==i.dtype)throw new Error("Input must be of datatype string");if(1!==i.shape.length)throw new Error(`Input must be a vector, got shape: ${i.shape}`);if(0!==a.shape.length)throw new Error(`Delimiter must be a scalar, got shape: ${a.shape}`);const d=n.readSync(i.dataId),u=n.readSync(a.dataId)[0],[l,c,f]=Object(o.stringSplitImplCPU)(d,u,r),p=c.length;return[n.makeTensorInfo([p,2],"int32",l),n.makeTensorInfo([p],"string",c),n.makeTensorInfo([2],"int32",new Int32Array(f))]}const i={kernelName:s.StringSplit,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/StringToHashBucketFast.js": -/*!********************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/StringToHashBucketFast.js ***! - \********************************************************************************************/ -/*! exports provided: stringToHashBucketFast, stringToHashBucketFastConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"stringToHashBucketFast",(function(){return r})),n.d(t,"stringToHashBucketFastConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +const r=Object(o.createBinaryKernelConfig)(s.Less,!1,"bool")},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/LessEqual.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/LessEqual.js ***! + \******************************************************************************/ +/*! exports provided: lessEqualConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"lessEqualConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); /** * @license - * Copyright 2021 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -10543,14 +10528,14 @@ function r(e){const{inputs:t,backend:n,attrs:s}=e,{skipEmpty:r}=s,{input:i,delim * limitations under the License. * ============================================================================= */ -function r(e){const{inputs:t,backend:n,attrs:s}=e,{numBuckets:r}=s,{input:i}=t;if("string"!==i.dtype)throw new Error("Input must be of datatype string");if(r<=0)throw new Error("Number of buckets must be at least 1");const a=n.readSync(i.dataId),d=Object(o.stringToHashBucketFastImplCPU)(a,r);return n.makeTensorInfo(i.shape,"int32",d)}const i={kernelName:s.StringToHashBucketFast,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sub.js": -/*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sub.js ***! - \*************************************************************************/ -/*! exports provided: sub, subConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sub",(function(){return a})),n.d(t,"subConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +const r=Object(o.createBinaryKernelConfig)(s.LessEqual,!1,"bool")},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Log.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Log.js ***! + \************************************************************************/ +/*! exports provided: logConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"logConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -10564,14 +10549,14 @@ function r(e){const{inputs:t,backend:n,attrs:s}=e,{numBuckets:r}=s,{input:i}=t;i * limitations under the License. * ============================================================================= */ -const i="return a - b;",a=Object(o.binaryKernelFunc)({opSnippet:i,packedOpSnippet:i,supportsComplex:!0,cpuKernelImpl:r.subImplCPU}),d={kernelName:s.Sub,backendName:"webgl",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sum.js": -/*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sum.js ***! - \*************************************************************************/ -/*! exports provided: sum, sumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sum",(function(){return r})),n.d(t,"sumConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Sum_impl */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sum_impl.js"); +const r=Object(o.createUnaryKernelConfig)(s.Log)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/LogicalAnd.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/LogicalAnd.js ***! + \*******************************************************************************/ +/*! exports provided: logicalAndConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"logicalAndConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -10585,14 +10570,14 @@ const i="return a - b;",a=Object(o.binaryKernelFunc)({opSnippet:i,packedOpSnippe * limitations under the License. * ============================================================================= */ -function r(e){const{inputs:t,backend:n,attrs:s}=e,{x:r}=t,{axis:i,keepDims:a}=s;return Object(o.sumImpl)(r,i,a,n)}const i={kernelName:s.Sum,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sum_impl.js": -/*!******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sum_impl.js ***! - \******************************************************************************/ -/*! exports provided: sumImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"sumImpl",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/reduce */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/reduce.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),i=n(/*! ./Transpose_impl */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose_impl.js"); +const r=Object(o.createBinaryKernelConfig)(s.LogicalAnd,!1,"bool")},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Max.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Max.js ***! + \************************************************************************/ +/*! exports provided: maxConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maxConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./kernel_utils */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/kernel_utils.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -10606,14 +10591,14 @@ function r(e){const{inputs:t,backend:n,attrs:s}=e,{x:r}=t,{axis:i,keepDims:a}=s; * limitations under the License. * ============================================================================= */ -function a(e,t,n,a){const d=t,u=e.shape.length,l=s.util.parseAxisParam(d,e.shape);let c=l;const f=s.backend_util.getAxesPermutation(c,u),p=null!=f;let m=e;p&&(m=Object(i.transposeImpl)(e,f,a),c=s.backend_util.getInnerMostAxes(c.length,u)),s.backend_util.assertAxesAreInnerMostDims("sum",c,u);const[h,b]=s.backend_util.computeOutAndReduceShapes(m.shape,c);let j=h;n&&(j=s.backend_util.expandShapeToKeepDim(h,l));const g=s.util.sizeFromShape(b),w=s.util.sizeFromShape(e.shape)/g,_=Object(r.reshape)({inputs:{x:m},attrs:{shape:[w,g]},backend:a}),k=Object(s.sumOutType)(e.dtype),v=Object(o.reduce)(_,k,"sum",a),x=Object(r.reshape)({inputs:{x:v},attrs:{shape:j},backend:a});return a.disposeIntermediateTensorInfo(_),a.disposeIntermediateTensorInfo(v),p&&a.disposeIntermediateTensorInfo(m),x}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Tan.js": -/*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Tan.js ***! - \*************************************************************************/ -/*! exports provided: tan, tanConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"tan",(function(){return r})),n.d(t,"tanConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +let r;const i={kernelName:s.Max,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.Max,null,["number, number, number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:i}=e,{reductionIndices:a,keepDims:u}=i,{x:d}=n;let l=t.dataIdMap.get(d.dataId).id,c=d;const{transposed:f,axes:p,originalAxes:m,inputWasTransposed:h}=Object(o.permuteAxesAndTranspose)(d,a,t);if(h){c=f,l=t.dataIdMap.get(f.dataId).id}const b=c.shape.length;s.backend_util.assertAxesAreInnerMostDims("max",p,b);const[j,g]=s.backend_util.computeOutAndReduceShapes(c.shape,p),w=s.util.sizeFromShape(g),_=t.makeOutput(j,d.dtype);if(0!==s.util.sizeFromShape(c.shape)){const e=t.dataIdMap.get(_.dataId).id;r(l,w,e)}if(h&&t.disposeData(f.dataId),u){const e=s.backend_util.expandShapeToKeepDim(_.shape,m);_.shape=e}return _}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/MaxPool.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/MaxPool.js ***! + \****************************************************************************/ +/*! exports provided: maxPoolConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPoolConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -10626,15 +10611,14 @@ function a(e,t,n,a){const d=t,u=e.shape.length,l=s.util.parseAxisParam(d,e.shape * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -const r=Object(o.unaryKernelFunc)({opSnippet:"return tan(x);"}),i={kernelName:s.Tan,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Tanh.js": -/*!**************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Tanh.js ***! - \**************************************************************************/ -/*! exports provided: tanh, tanhConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"tanh",(function(){return r})),n.d(t,"tanhConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); + */let o;const r={kernelName:s.MaxPool,backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.MaxPool,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:t,attrs:n,backend:r}=e,i=t.x,a=r.dataIdMap.get(i.dataId).id,{filterSize:u,strides:d,pad:l,dimRoundingMode:c}=n,f=s.backend_util.computePool2DInfo(i.shape,u,d,1,l,c),p=f.filterHeight,m=f.filterWidth,h=f.padInfo.top,b=f.padInfo.right,j=f.padInfo.bottom,g=f.padInfo.left,w=f.dilationHeight,_=f.dilationWidth,k=f.strideHeight,v=f.strideWidth,x=f.inChannels,y=f.outChannels;if("channelsLast"!==f.dataFormat)throw new Error(`wasm backend does not support dataFormat:'${f.dataFormat}'. Please use 'channelsLast'.`);const O=r.makeOutput(f.outShape,"float32"),I=r.dataIdMap.get(O.dataId).id;return o(a,i.shape[0],i.shape[1],i.shape[2],p,m,h,b,j,g,w,_,k,v,x,y,I),O}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Maximum.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Maximum.js ***! + \****************************************************************************/ +/*! exports provided: maximumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maximumConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -10648,11 +10632,11 @@ const r=Object(o.unaryKernelFunc)({opSnippet:"return tan(x);"}),i={kernelName:s. * limitations under the License. * ============================================================================= */ -const r=Object(o.unaryKernelFunc)({opSnippet:"\n float e2x = exp(-2.0 * abs(x));\n return sign(x) * (1.0 - e2x) / (1.0 + e2x);\n"}),i={kernelName:s.Tanh,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Tile.js": -/*!**************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Tile.js ***! - \**************************************************************************/ -/*! exports provided: tile, tileConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"tile",(function(){return i})),n.d(t,"tileConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"),r=n(/*! ../tile_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/tile_gpu.js"); +const r=Object(o.createBinaryKernelConfig)(s.Maximum,!1)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Mean.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Mean.js ***! + \*************************************************************************/ +/*! exports provided: mean, meanConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"mean",(function(){return a})),n.d(t,"meanConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Cast */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Cast.js"),r=n(/*! ./kernel_utils */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/kernel_utils.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -10669,14 +10653,14 @@ const r=Object(o.unaryKernelFunc)({opSnippet:"\n float e2x = exp(-2.0 * abs(x)) * limitations under the License. * ============================================================================= */ -function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{reps:d}=i;if("string"===a.dtype||a.shape.length>5){const e=n.readSync(a.dataId),t="string"===a.dtype?e.map((e=>s.util.decodeString(e))):e,r=Object(s.buffer)(a.shape,a.dtype,t),i=Object(o.tileImplCPU)(r,d);return n.makeTensorInfo(i.shape,i.dtype,i.values)}const u=new r.TileProgram(a.shape,d);return n.runWebGLProgram(u,[a],a.dtype)}const a={kernelName:s.Tile,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/TopK.js": -/*!**************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/TopK.js ***! - \**************************************************************************/ -/*! exports provided: topK, topKConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"topK",(function(){return f})),n.d(t,"topKConfig",(function(){return p}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"),r=n(/*! ../top_k_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/top_k_gpu.js"),i=n(/*! ./Fill */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Fill.js"),a=n(/*! ./GatherV2 */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/GatherV2.js"),d=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),u=n(/*! ./Slice */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Slice.js"); +let i;function a(e){const{backend:t,inputs:n,attrs:a}=e,{axis:u,keepDims:d}=a,{x:l}=n,c=t.dataIdMap.get(l.dataId).id;let f=c,p=l;const{transposed:m,axes:h,originalAxes:b,inputWasTransposed:j}=Object(r.permuteAxesAndTranspose)(l,u,t);let g=h;if(j){const e=t.dataIdMap.get(m.dataId).id;e!==c&&(p=m,f=e,g=s.backend_util.getInnerMostAxes(g.length,p.shape.length))}s.backend_util.assertAxesAreInnerMostDims("mean",g,p.shape.length);const[w,_]=s.backend_util.computeOutAndReduceShapes(p.shape,g),k=s.util.sizeFromShape(_);let v=p;"float32"!==p.dtype&&(v=Object(o.cast)({backend:t,inputs:{x:p},attrs:{dtype:"float32"}}),f=t.dataIdMap.get(v.dataId).id);const x=t.makeOutput(w,"float32");if(0!==s.util.sizeFromShape(p.shape)){const e=t.dataIdMap.get(x.dataId).id;i(f,k,e)}if(j&&t.disposeData(m.dataId),d){const e=s.backend_util.expandShapeToKeepDim(x.shape,b);x.shape=e}return"float32"!==p.dtype&&t.disposeData(v.dataId),x}const u={kernelName:s.Mean,backendName:"wasm",setupFunc:function(e){i=e.wasm.cwrap(s.Mean,null,["number, number, number"])},kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Min.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Min.js ***! + \************************************************************************/ +/*! exports provided: minConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"minConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./kernel_utils */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/kernel_utils.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -10690,14 +10674,14 @@ function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{reps:d}=i;if("string" * limitations under the License. * ============================================================================= */ -function l(e,t){null!==t&&e.disposeIntermediateTensorInfo(t)}function c(e){let t=1;for(;tj){const e=n.readSync(p.dataId),[t,s]=Object(o.topKImplCPU)(e,g,p.dtype,m,h);return[n.makeTensorInfo(t.shape,t.dtype,t.values),n.makeTensorInfo(s.shape,s.dtype,s.values)]}if(0===m)return g[g.length-1]=0,[n.makeTensorInfo(g,p.dtype,[]),n.makeTensorInfo(g,"int32",[])];if(1===w)return[p,Object(i.fill)({attrs:{shape:g,dtype:"int32",value:0},backend:n})];const _=n.texData.get(p.dataId),k=null!==_&&_.isPacked,v=k?n.unpackTensor(p):p,x=s.util.sizeFromShape(g)/w,y=Object(d.reshape)({inputs:{x:v},attrs:{shape:[x,w]},backend:n});k&&l(n,v);const O=c(m),I=c(w);let C=null;const S=()=>null===C?[y,y]:[y,C],T=(e,t,s)=>{const o=S(),i=new r.SwapProgram(s),a=[[w],[null===C?1:0],[Number.NEGATIVE_INFINITY],[e],[t]],d=C;C=n.runWebGLProgram(i,o,"int32",a),l(n,d)};for(let e=1;e=1;n/=2)T(t,n,[x,I])}for(let e=I;e>O;e/=2){const t=S(),s=new r.MergeProgram([x,e/2]),o=[[w],[null===C?1:0],[O]],i=C;C=n.runWebGLProgram(s,t,"int32",o),l(n,i);const a=O/2,d=2*a;for(let e=a;e>=1;e/=2)T(d,e,C.shape)}let N=C;C=Object(u.slice)({inputs:{x:C},backend:n,attrs:{begin:0,size:[x,m]}}),l(n,N);let E=Object(a.gatherV2)({inputs:{x:y,indices:C},backend:n,attrs:{axis:1,batchDims:1}});l(n,y);const A=g.slice(0,-1);A.push(m),N=C,C=Object(d.reshape)({inputs:{x:C},attrs:{shape:A},backend:n}),l(n,N);const R=E;return E=Object(d.reshape)({inputs:{x:E},attrs:{shape:A},backend:n}),l(n,R),[E,C]}const p={kernelName:s.TopK,backendName:"webgl",kernelFunc:f}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transform.js": -/*!*******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transform.js ***! - \*******************************************************************************/ -/*! exports provided: transform, transformConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"transform",(function(){return r})),n.d(t,"transformConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../transform_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/transform_gpu.js"); +let r;const i={kernelName:s.Min,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.Min,null,["number, number, number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:i}=e,{axis:a,keepDims:u}=i,{x:d}=n,l=t.dataIdMap.get(d.dataId).id;let c=l,f=d;const{transposed:p,axes:m,originalAxes:h,inputWasTransposed:b}=Object(o.permuteAxesAndTranspose)(d,a,t);if(b){const e=t.dataIdMap.get(p.dataId).id;e!==l&&(f=p,c=e)}const j=f.shape.length;s.backend_util.assertAxesAreInnerMostDims("min",m,j);const[g,w]=s.backend_util.computeOutAndReduceShapes(f.shape,m),_=s.util.sizeFromShape(w),k=t.makeOutput(g,f.dtype);if(0!==s.util.sizeFromShape(f.shape)){const e=t.dataIdMap.get(k.dataId).id;r(c,_,e)}if(b&&t.disposeData(p.dataId),u){const e=s.backend_util.expandShapeToKeepDim(k.shape,h);k.shape=e}return k}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Minimum.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Minimum.js ***! + \****************************************************************************/ +/*! exports provided: minimumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"minimumConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); /** * @license - * Copyright 2021 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -10711,14 +10695,18 @@ function l(e,t){null!==t&&e.disposeIntermediateTensorInfo(t)}function c(e){let t * limitations under the License. * ============================================================================= */ -function r(e){const{inputs:t,backend:n,attrs:s}=e,{image:r,transforms:i}=t,{interpolation:a,fillMode:d,fillValue:u,outputShape:l}=s,[c,f,p,m]=r.shape,[h,b]=null!=l?l:[f,p],j=[c,h,b,m],g=new o.TransformProgram(f,p,a,d,u,j);return n.runWebGLProgram(g,[r,i],"float32")}const i={kernelName:s.Transform,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js": -/*!*******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js ***! - \*******************************************************************************/ -/*! exports provided: transpose, transposeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"transpose",(function(){return r})),n.d(t,"transposeConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Transpose_impl */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose_impl.js"); +const r=Object(o.createBinaryKernelConfig)(s.Minimum,!1)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/MirrorPad.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/MirrorPad.js ***! + \******************************************************************************/ +/*! exports provided: mirrorPadConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"mirrorPadConfig",(function(){return a}));var s,o=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),r=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js");let i;!function(e){e[e.reflect=0]="reflect",e[e.symmetric=1]="symmetric"}(s||(s={}));const a={kernelName:o.MirrorPad,backendName:"wasm",kernelFunc:function(e){const{inputs:{x:t},backend:n,attrs:{paddings:o,mode:a}}=e,u=o.map(((e,n)=>e[0]+t.shape[n]+e[1])),d=n.dataIdMap.get(t.dataId).id,l=n.makeOutput(u,t.dtype),c=n.dataIdMap.get(l.dataId).id,f=new Uint8Array(new Int32Array(t.shape).buffer),p=o.map((e=>e[0])),m=o.map((e=>e[1])),h=new Uint8Array(new Int32Array(p).buffer),b=new Uint8Array(new Int32Array(m).buffer);return i(d,f,t.shape.length,r.CppDType[t.dtype],h,b,s[a],c),l},setupFunc:function(e){i=e.wasm.cwrap(o.MirrorPad,null,["number","array","number","number","array","array","number","number"])}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Multiply.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Multiply.js ***! + \*****************************************************************************/ +/*! exports provided: multiplyConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"multiplyConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -10732,11 +10720,11 @@ function r(e){const{inputs:t,backend:n,attrs:s}=e,{image:r,transforms:i}=t,{inte * limitations under the License. * ============================================================================= */ -function r(e){const{inputs:t,backend:n,attrs:s}=e,{x:r}=t,{perm:i}=s,a=n,d=r.shape.length,u=new Array(d);for(let e=0;en.disposeIntermediateTensorInfo(e))),b}const a={kernelName:s.Unpack,backendName:"webgl",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/UnsortedSegmentSum.js": +let r;const i={kernelName:s.NonMaxSuppressionV4,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.NonMaxSuppressionV4,"number",["number","number","number","number","number","bool"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:s}=e,{iouThreshold:i,maxOutputSize:a,scoreThreshold:u,padToMaxOutputSize:d}=s,{boxes:l,scores:c}=n,f=t.dataIdMap.get(l.dataId).id,p=t.dataIdMap.get(c.dataId).id,m=r(f,p,a,i,u,d),{pSelectedIndices:h,selectedSize:b,pSelectedScores:j,pValidOutputs:g}=Object(o.parseResultStruct)(t,m);return t.wasm._free(j),[t.makeOutput([b],"int32",h),t.makeOutput([],"int32",g)]}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NonMaxSuppressionV5.js": /*!****************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/UnsortedSegmentSum.js ***! + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NonMaxSuppressionV5.js ***! \****************************************************************************************/ -/*! exports provided: unsortedSegmentSum, unsortedSegmentSumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"unsortedSegmentSum",(function(){return u})),n.d(t,"unsortedSegmentSumConfig",(function(){return l}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../segment_gpu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/segment_gpu.js"),r=n(/*! ./Range */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Range.js"),i=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),a=n(/*! ./Tile */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Tile.js"),d=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"); +/*! exports provided: nonMaxSuppressionV5Config */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionV5Config",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./NonMaxSuppression_util */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NonMaxSuppression_util.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -10816,14 +10804,14 @@ function i(e){const{inputs:t,backend:n,attrs:s}=e,{value:i}=t;let{axis:a}=s;a<0& * limitations under the License. * ============================================================================= */ -function u(e){const{inputs:t,backend:n,attrs:u}=e,{x:l,segmentIds:c}=t,{numSegments:f}=u,p=l.shape.length,m=[];let h=0;const b=s.backend_util.getAxesPermutation([h],p);let j=l;null!=b&&(j=Object(d.transpose)({inputs:{x:l},backend:n,attrs:{perm:b}}),m.push(j),h=s.backend_util.getInnerMostAxes(1,p)[0]);const g=s.backend_util.segment_util.computeOutShape(j.shape,h,f),w=s.util.sizeFromShape([j.shape[h]]),_=Object(i.reshape)({inputs:{x:j},backend:n,attrs:{shape:[-1,w]}});m.push(_);const k=Object(s.sumOutType)(l.dtype),v=(e,t,i,d,u)=>{const l=e.shape[0],c=e.shape[1],f=s.backend_util.segment_util.segOpComputeOptimalWindowSize(c,u),p={windowSize:f,inSize:c,batchSize:l,numSegments:u},h=new o.SegmentOpProgram(p,t),b=n.compileAndRun(h,[e,i],d);if(m.push(b),b.shape[1]===u)return b;const j=Object(r.range)({backend:n,attrs:{start:0,stop:u,step:1,dtype:"float32"}}),g=Object(a.tile)({inputs:{x:j},backend:n,attrs:{reps:[c/f]}});m.push(j),m.push(g);return v(b,t,g,d,u)},x=v(_,"unsortedSegmentSum",c,k,f),y=Object(i.reshape)({inputs:{x:x},backend:n,attrs:{shape:g}});let O=y;if(null!=b){m.push(y);const e=s.backend_util.getUndoAxesPermutation(b);O=Object(d.transpose)({inputs:{x:O},backend:n,attrs:{perm:e}})}return m.forEach((e=>n.disposeIntermediateTensorInfo(e))),O}const l={kernelName:s.UnsortedSegmentSum,backendName:"webgl",kernelFunc:u}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ZerosLike.js": -/*!*******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ZerosLike.js ***! - \*******************************************************************************/ -/*! exports provided: zerosLike, zerosLikeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"zerosLike",(function(){return d})),n.d(t,"zerosLikeConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Complex */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js"),r=n(/*! ./Fill */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Fill.js"),i=n(/*! ./Imag */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Imag.js"),a=n(/*! ./Real */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Real.js"); +let r;const i={kernelName:s.NonMaxSuppressionV5,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.NonMaxSuppressionV5,"number",["number","number","number","number","number","number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:s}=e,{iouThreshold:i,maxOutputSize:a,scoreThreshold:u,softNmsSigma:d}=s,{boxes:l,scores:c}=n,f=t.dataIdMap.get(l.dataId).id,p=t.dataIdMap.get(c.dataId).id,m=r(f,p,a,i,u,d),{pSelectedIndices:h,selectedSize:b,pSelectedScores:j,pValidOutputs:g}=Object(o.parseResultStruct)(t,m);return t.wasm._free(g),[t.makeOutput([b],"int32",h),t.makeOutput([b],"float32",j)]}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NonMaxSuppression_util.js": +/*!*******************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NonMaxSuppression_util.js ***! + \*******************************************************************************************/ +/*! exports provided: parseResultStruct */function(e,t,n){"use strict"; /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -10837,35 +10825,35 @@ function u(e){const{inputs:t,backend:n,attrs:u}=e,{x:l,segmentIds:c}=t,{numSegme * limitations under the License. * ============================================================================= */ -function d(e){const{inputs:t,backend:n}=e,{x:s}=t;if("complex64"===s.dtype){const e=Object(a.real)({inputs:{input:s},backend:n}),t=d({inputs:{x:e},backend:n}),r=Object(i.imag)({inputs:{input:s},backend:n}),u=d({inputs:{x:r},backend:n}),l=Object(o.complex)({inputs:{real:t,imag:u},backend:n});return n.disposeIntermediateTensorInfo(e),n.disposeIntermediateTensorInfo(t),n.disposeIntermediateTensorInfo(r),n.disposeIntermediateTensorInfo(u),l}return Object(r.fill)({attrs:{shape:s.shape,dtype:s.dtype,value:"string"===s.dtype?"":0},backend:n})}const u={kernelName:s.ZerosLike,backendName:"webgl",kernelFunc:d}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/_FusedMatMul.js": -/*!**********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/_FusedMatMul.js ***! - \**********************************************************************************/ -/*! exports provided: _fusedMatMul, _fusedMatMulConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"_fusedMatMul",(function(){return r})),n.d(t,"_fusedMatMulConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./BatchMatMul_impl */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchMatMul_impl.js"); +function s(e,t){const n=new Int32Array(e.wasm.HEAPU8.buffer,t,4),s=n[0],o=n[1],r=n[2],i=n[3];return e.wasm._free(t),{pSelectedIndices:s,selectedSize:o,pSelectedScores:r,pValidOutputs:i}}n.r(t),n.d(t,"parseResultStruct",(function(){return s}))},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NotEqual.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NotEqual.js ***! + \*****************************************************************************/ +/*! exports provided: notEqualConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"notEqualConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the License); + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ -function r(e){const{inputs:t,backend:n,attrs:s}=e,{a:r,b:i,bias:a,preluActivationWeights:d}=t,{transposeA:u,transposeB:l,activation:c,leakyreluAlpha:f}=s;return Object(o.batchMatMulImpl)({a:r,b:i,transposeA:u,transposeB:l,backend:n,bias:a,preluActivationWeights:d,leakyreluAlpha:f,activation:c})}const i={kernelName:s._FusedMatMul,backendName:"webgl",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/lrn_gpu.js": -/*!*********************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/lrn_gpu.js ***! - \*********************************************************************/ -/*! exports provided: LRNProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"LRNProgram",(function(){return s})); +const r=Object(o.createBinaryKernelConfig)(s.NotEqual,!1,"bool")},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/OneHot.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/OneHot.js ***! + \***************************************************************************/ +/*! exports provided: oneHotConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"oneHotConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license - * Copyright 2017 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -10878,15 +10866,14 @@ function r(e){const{inputs:t,backend:n,attrs:s}=e,{a:r,b:i,bias:a,preluActivatio * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -class s{constructor(e,t,n,s,o){this.variableNames=["x"],this.outputShape=[];const r=t,i=e[3]-1;let a;this.outputShape=e;const d=`float(${n}) + float(${s}) * sum`;a=.5===o?`inversesqrt(${d})`:1===o?`1.0/(${d})`:`exp(log(${d}) * float(-${o}));`,this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int r = coords[1];\n int c = coords[2];\n int d = coords[3];\n float x = getX(b, r, c, d);\n float sum = 0.0;\n for (int j = -${r}; j <= ${r}; j++) {\n int idx = d + j;\n if (idx >= 0 && idx <= ${i}) {\n float z = getX(b, r, c, idx);\n sum += z * z;\n }\n }\n float val = x * ${a};\n setOutput(val);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/lrn_grad_gpu.js": -/*!**************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/lrn_grad_gpu.js ***! - \**************************************************************************/ -/*! exports provided: LRNGradProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"LRNGradProgram",(function(){return s})); + */let o;const r={kernelName:s.OneHot,backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.OneHot,null,["number","number","number","number","number"])},kernelFunc:function(e){const{inputs:t,backend:n,attrs:s}=e,{indices:r}=t,{depth:i,onValue:a,offValue:u}=s,d=n.makeOutput([...r.shape,i],"int32"),l=n.dataIdMap.get(d.dataId).id,c=n.dataIdMap.get(r.dataId).id;return o(c,i,a,u,l),d}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/OnesLike.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/OnesLike.js ***! + \*****************************************************************************/ +/*! exports provided: onesLikeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"onesLikeConfig",(function(){return s}));const s={kernelName:n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js").OnesLike,backendName:"wasm",kernelFunc: /** * @license - * Copyright 2018 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -10900,14 +10887,14 @@ class s{constructor(e,t,n,s,o){this.variableNames=["x"],this.outputShape=[];cons * limitations under the License. * ============================================================================= */ -class s{constructor(e,t,n,s,o){this.variableNames=["inputImage","outputImage","dy"],this.outputShape=[],this.outputShape=e,this.depth=e[3],this.depthRadius=t,this.bias=n,this.alpha=s,this.beta=o,this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int r = coords[1];\n int c = coords[2];\n\n float result = 0.0;\n for (int d = 0; d < ${this.depth}; ++d) {\n int depthBegin = int(max(0.0, float(d - ${t})));\n int depthEnd = int(min(float(${this.depth}),\n float(d + ${t} + 1)));\n\n const int MIN_DEPTH_BEGIN = 0;\n const int MAX_DEPTH_END = ${this.depth};\n\n float norm = 0.0;\n for (int k = MIN_DEPTH_BEGIN; k < MAX_DEPTH_END; ++k) {\n if (k < depthBegin){\n continue;\n }\n else if (k >= depthBegin && k < depthEnd) {\n norm += getInputImage(b, r, c, k) * getInputImage(b, r, c, k);\n }\n else {\n break;\n }\n }\n\n norm = float(${s}) * norm + float(${n});\n\n for(int k = MIN_DEPTH_BEGIN; k < MAX_DEPTH_END; ++k){\n if (k < depthBegin){\n continue;\n }\n else if (k >= depthBegin && k < depthEnd){\n float dyi = -2.0 * float(${s})\n * float(${o})\n * getInputImage(b ,r ,c, k) * getOutputImage(b, r, c, d)\n / norm;\n if (k == d) {\n dyi += pow(norm, -1.0 * ${o});\n }\n if (k == coords[3]) {\n dyi *= getDy(b, r, c, d);\n result += dyi;\n }\n }\n else {\n break;\n }\n }\n }\n setOutput(result);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/lrn_packed_gpu.js": -/*!****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/lrn_packed_gpu.js ***! - \****************************************************************************/ -/*! exports provided: LRNPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"LRNPackedProgram",(function(){return s})); +function(e){const{inputs:{x:t},backend:n}=e,s=n.makeOutput(t.shape,t.dtype);return n.typedArrayFromHeap(s).fill(1),s}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Pack.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Pack.js ***! + \*************************************************************************/ +/*! exports provided: pack, packConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"pack",(function(){return i})),n.d(t,"packConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Concat */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Concat.js"),r=n(/*! ./ExpandDims */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ExpandDims.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -10921,14 +10908,14 @@ class s{constructor(e,t,n,s,o){this.variableNames=["inputImage","outputImage","d * limitations under the License. * ============================================================================= */ -class s{constructor(e,t,n,s,o){this.variableNames=["x"],this.outputShape=[],this.packedInputs=!0,this.packedOutput=!0;const r=t,i=e[3]-1;let a;this.outputShape=e;const d=`float(${n}) + float(${s}) * sum`;a=.5===o?`inversesqrt(${d})`:1===o?`1.0/(${d})`:`exp(log(${d}) * float(-${o}));`,this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords.x;\n int r = coords.y;\n int c = coords.z;\n int d = coords.w;\n\n bool hasNextCol = d < ${this.outputShape[3]};\n bool hasNextRow = c < ${this.outputShape[2]};\n\n vec4 sum = vec4(0.);\n vec4 xFragAtOutputCoords = getX(b, r, c, d);\n\n vec4 xAtOutputCoords = vec4(\n getChannel(xFragAtOutputCoords, vec2(c, d)),\n hasNextCol ?\n getChannel(xFragAtOutputCoords, vec2(c, d + 1)) : 0.0,\n hasNextRow ?\n getChannel(xFragAtOutputCoords , vec2(c + 1, d)) : 0.0,\n (hasNextRow && hasNextCol) ?\n getChannel(xFragAtOutputCoords, vec2(c + 1, d + 1)) : 0.0\n );\n\n int firstChannel = d - ${r};\n vec2 cache = vec2(0.);\n if(firstChannel >= 0){\n vec4 firstChannelFrag = getX(b, r, c, firstChannel);\n cache.x = getChannel(firstChannelFrag, vec2(c, firstChannel));\n if(hasNextRow){\n cache.y = getChannel(firstChannelFrag, vec2(c + 1, firstChannel));\n }\n }\n\n ivec2 depth = ivec2(d, d + 1);\n for (int j = - ${r}; j <= ${r}; j++) {\n ivec2 idx = depth + j;\n bvec2 aboveLowerBound = greaterThanEqual(idx, ivec2(0));\n bvec2 belowUpperBound = lessThanEqual(idx, ivec2(${i}));\n\n bool depthInRange = aboveLowerBound.x && belowUpperBound.x;\n bool depthPlusOneInRange = aboveLowerBound.y && belowUpperBound.y;\n\n if(depthInRange || depthPlusOneInRange){\n vec4 z = vec4(0.);\n vec4 xFragAtCurrentDepth;\n z.xz = cache.xy;\n if(depthPlusOneInRange && hasNextCol){\n xFragAtCurrentDepth = idx.y != d ?\n getX(b, r, c, idx.y) : xFragAtOutputCoords;\n z.y = getChannel(xFragAtCurrentDepth, vec2(c, idx.y));\n if(hasNextRow){\n z.w = getChannel(xFragAtCurrentDepth, vec2(c + 1, idx.y));\n }\n }\n cache.xy = z.yw;\n sum += z * z;\n }\n }\n vec4 result = xAtOutputCoords * ${a};\n setOutput(result);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/max_pool_backprop_gpu.js": -/*!***********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/max_pool_backprop_gpu.js ***! - \***********************************************************************************/ -/*! exports provided: MaxPool2DBackpropProgram, MaxPool3DBackpropProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"MaxPool2DBackpropProgram",(function(){return s})),n.d(t,"MaxPool3DBackpropProgram",(function(){return o})); +function i(e){const{inputs:t,backend:n,attrs:i}=e,{axis:a}=i;if(1===t.length)return Object(r.expandDims)({inputs:{input:t[0]},backend:n,attrs:{dim:a}});const u=t[0].shape,d=t[0].dtype;t.forEach((e=>{s.util.assertShapesMatch(u,e.shape,"All tensors passed to stack must have matching shapes"),s.util.assert(d===e.dtype,(()=>"All tensors passed to stack must have matching dtypes"))}));const l=[],c=t.map((e=>{const t=Object(r.expandDims)({inputs:{input:e},backend:n,attrs:{dim:a}});return l.push(t),t})),f=Object(o.concat)({inputs:c,backend:n,attrs:{axis:a}});return l.forEach((e=>n.disposeData(e.dataId))),f}const a={kernelName:s.Pack,backendName:"wasm",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/PadV2.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/PadV2.js ***! + \**************************************************************************/ +/*! exports provided: padV2Config */function(e,t,n){"use strict";n.r(t),n.d(t,"padV2Config",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); /** * @license - * Copyright 2017 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -10942,14 +10929,14 @@ class s{constructor(e,t,n,s,o){this.variableNames=["x"],this.outputShape=[],this * limitations under the License. * ============================================================================= */ -class s{constructor(e){this.variableNames=["dy","maxPos"],this.outputShape=e.inShape;const t=e.strideHeight,n=e.strideWidth,s=e.dilationHeight,o=e.effectiveFilterHeight,r=e.effectiveFilterWidth,i=o-1-e.padInfo.top,a=r-1-e.padInfo.left,d=o*r-1;this.userCode=`\n const ivec2 pads = ivec2(${i}, ${a});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n\n ivec2 dyRCCorner = coords.yz - pads;\n int dyRCorner = dyRCCorner.x;\n int dyCCorner = dyRCCorner.y;\n\n // Convolve dy(?, ?, d) with pos mask(:, :, d) to get dx(xR, xC, d).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < ${o};\n wR += ${s}) {\n float dyR = float(dyRCorner + wR) / ${t}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < ${r}; wC++) {\n float dyC = float(dyCCorner + wC) / ${n}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(b, idyR, idyC, d);\n int maxPosValue = ${d} - int(getMaxPos(b, idyR, idyC, d));\n\n // Get the current value, check it against the value from the\n // position matrix.\n int curPosValue = wR * ${r} + wC;\n float mask = float(maxPosValue == curPosValue ? 1.0 : 0.0);\n\n dotProd += dyValue * mask;\n }\n }\n setOutput(dotProd);\n }\n `}}class o{constructor(e){this.variableNames=["dy","maxPos"],this.outputShape=e.inShape;const t=e.strideDepth,n=e.strideHeight,s=e.strideWidth,o=e.dilationDepth,r=e.dilationHeight,i=e.dilationWidth,a=e.effectiveFilterDepth,d=e.effectiveFilterHeight,u=e.effectiveFilterWidth,l=a-1-e.padInfo.front,c=d-1-e.padInfo.top,f=u-1-e.padInfo.left,p=a*d*u-1;this.userCode=`\n const ivec3 pads = ivec3(${l}, ${c}, ${f});\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int ch = coords.u;\n\n ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads;\n int dyDCorner = dyCorner.x;\n int dyRCorner = dyCorner.y;\n int dyCCorner = dyCorner.z;\n\n // Convolve dy(?, ?, ?, ch) with pos mask(:, :, :, d) to get\n // dx(xD, xR, xC, ch).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n\n for (int wD = 0; wD < ${a};\n wD += ${o}) {\n float dyD = float(dyDCorner + wD) / ${t}.0;\n\n if (dyD < 0.0 || dyD >= ${e.outDepth}.0 || fract(dyD) > 0.0) {\n continue;\n }\n int idyD = int(dyD);\n\n for (int wR = 0; wR < ${d};\n wR += ${r}) {\n float dyR = float(dyRCorner + wR) / ${n}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 ||\n fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < ${u};\n wC += ${i}) {\n float dyC = float(dyCCorner + wC) / ${s}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(batch, idyD, idyR, idyC, ch);\n int maxPosValue = ${p} -\n int(getMaxPos(batch, idyD, idyR, idyC, ch));\n\n // Get the current value, check it against the value from the\n // position matrix.\n int curPosValue =\n wD * ${d} * ${u} +\n wR * ${u} + wC;\n float mask = float(maxPosValue == curPosValue ? 1.0 : 0.0);\n\n dotProd += dyValue * mask;\n }\n }\n }\n setOutput(dotProd);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/mean_gpu.js": -/*!**********************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/mean_gpu.js ***! - \**********************************************************************/ -/*! exports provided: MeanProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"MeanProgram",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +let r;const i={kernelName:s.PadV2,backendName:"wasm",kernelFunc:function(e){const{inputs:{x:t},backend:n,attrs:{paddings:s,constantValue:i}}=e,a=s.map(((e,n)=>e[0]+t.shape[n]+e[1])),u=n.dataIdMap.get(t.dataId).id,d=n.makeOutput(a,t.dtype),l=n.dataIdMap.get(d.dataId).id,c=new Uint8Array(new Int32Array(t.shape).buffer),f=s.map((e=>e[0])),p=s.map((e=>e[1])),m=new Uint8Array(new Int32Array(f).buffer),h=new Uint8Array(new Int32Array(p).buffer);return r(u,c,t.shape.length,o.CppDType[t.dtype],m,h,i,l),d},setupFunc:function(e){r=e.wasm.cwrap(s.PadV2,null,["number","array","number","number","array","array","number","number"])}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Pow.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Pow.js ***! + \************************************************************************/ +/*! exports provided: powConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"powConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -10962,14 +10949,15 @@ class s{constructor(e){this.variableNames=["dy","maxPos"],this.outputShape=e.inS * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */class o{constructor(e,t){this.variableNames=["x"];const{windowSize:n,batchSize:o,inSize:r,outSize:i}=e;this.outputShape=[o,i];const a=4*Math.floor(n/4),d=n%4;let u="sumValue += dot(values, ones);";if(null!=t){const e=1/t;u=`sumValue += dot(values * ${s.util.isInt(e)?e.toPrecision(2):e}, ones);`}let l="";r%n>0&&(l=`\n if (inIdx < 0 || inIdx >= ${r}) {\n return 0.0;\n }\n `),this.userCode=`\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float getValue(int batch, int inIdx) {\n ${l}\n return getX(batch, inIdx);\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = outIdx * ${n};\n\n float sumValue = 0.0;\n\n for (int i = 0; i < ${a}; i += 4) {\n int inIdx = inOffset + i;\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n getValue(batch, inIdx + 3)\n );\n\n ${u}\n }\n\n int inIdx = inOffset + ${a};\n if (${1===d}) {\n vec4 values = vec4(getValue(batch, inIdx), 0.0, 0.0, 0.0);\n\n ${u}\n } else if (${2===d}) {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1), 0.0, 0.0);\n\n ${u}\n } else if (${3===d}) {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2), 0.0);\n\n ${u}\n }\n setOutput(sumValue);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/mirror_pad_gpu.js": -/*!****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/mirror_pad_gpu.js ***! - \****************************************************************************/ -/*! exports provided: MirrorPadProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"MirrorPadProgram",(function(){return o}));var s=n(/*! ./shader_compiler */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); + */ +const r=Object(o.createBinaryKernelConfig)(s.Pow,!1)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Prelu.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Prelu.js ***! + \**************************************************************************/ +/*! exports provided: preluConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"preluConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -10982,11 +10970,11 @@ class s{constructor(e){this.variableNames=["dy","maxPos"],this.outputShape=e.inS * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */class o{constructor(e,t,n){this.variableNames=["x"],this.outputShape=t.map(((t,n)=>t[0]+e[n]+t[1]));const o=e.length,r=Object(s.getCoordsDataType)(o),i=t.map((e=>e[0])).join(","),a=t.map(((t,n)=>t[0]+e[n])).join(","),d=["coords[0]","coords[1]","coords[2]","coords[3]"].slice(0,o),u="reflect"===n?0:1;this.userCode=1!==o?`\n ${r} start = ${r}(${i});\n ${r} end = ${r}(${a});\n\n void main() {\n ${r} outC = getOutputCoords();\n for (int i = 0; i < ${o}; i++) {\n if (outC[i] < start[i]) {\n outC[i] = start[i] * 2 - outC[i] - ${u};\n } else if(outC[i] >= end[i]) {\n outC[i] = (end[i] - 1) * 2 - outC[i] + ${u};\n }\n }\n ${r} coords = outC - start;\n setOutput(getX(${d}));\n }\n `:`\n int start = ${i};\n int end = ${a};\n\n void main() {\n int outC = getOutputCoords();\n if (outC < start) {\n outC = start * 2 - outC - ${u};\n } else if(outC >= end) {\n outC = (end - 1) * 2 - outC + ${u};\n }\n setOutput(getX(outC - start));\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/mirror_pad_packed_gpu.js": -/*!***********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/mirror_pad_packed_gpu.js ***! - \***********************************************************************************/ -/*! exports provided: MirrorPadPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"MirrorPadPackedProgram",(function(){return r}));var s=n(/*! ./packing_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/packing_util.js"),o=n(/*! ./shader_compiler */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); + */let o;const r={kernelName:s.Prelu,backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.Prelu,null,["number","number","number"])},kernelFunc:function(e){const{inputs:t,backend:n}=e,{x:s,alpha:r}=t,i=n.dataIdMap.get(s.dataId).id,a=n.dataIdMap.get(r.dataId).id,u=n.makeOutput(s.shape,"float32"),d=n.dataIdMap.get(u.dataId).id;return o(i,a,d),u}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Prod.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Prod.js ***! + \*************************************************************************/ +/*! exports provided: prodConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"prodConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./kernel_utils */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/kernel_utils.js"),r=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -11003,14 +10991,14 @@ class s{constructor(e){this.variableNames=["dy","maxPos"],this.outputShape=e.inS * limitations under the License. * ============================================================================= */ -class r{constructor(e,t,n){this.variableNames=["x"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=t.map(((t,n)=>t[0]+e[n]+t[1]));const r=e.length,i=Object(o.getCoordsDataType)(r),a=t.map((e=>e[0])).join(","),d=t.map(((t,n)=>t[0]+e[n])).join(","),u=Object(s.getChannels)("rc",r),l=Object(s.getChannels)("source",r),c=`${u[r-1]} < ${this.outputShape[r-1]}`,f=1===r?"source":`vec2(${l.slice(-2).join()})`,p="reflect"===n?0:1;let m="";if(1===r){const e=`\n ${i} source = rc;\n if (source < start) {\n source = start * 2 - source - ${p};\n } else if (source >= end) {\n source = (end - 1) * 2 - source + ${p};\n }\n source -= start;\n `;m=`\n ${i} rc = outputLoc;\n ${e}\n result[0] = getChannel(getX(${l.join()}), ${f});\n ${u[r-1]} += 1;\n if(${c}) {\n ${e}\n result[1] = getChannel(getX(${l.join()}), ${f});\n }\n `}else{const e=`\n ${i} source = rc;\n ${i} lt = ${i}(lessThan(source, start));\n ${i} gte = ${i}(greaterThanEqual(source, end));\n ${i} orig = 1 - (lt + gte);\n source = orig * source +\n lt * (start * 2 - source - ${p}) +\n gte * ((end - 1) * 2 - source + ${p});\n source -= start;\n `;m=`\n ${i} rc = outputLoc;\n ${e}\n result[0] = getChannel(getX(${l.join()}), ${f});\n ${u[r-1]} += 1;\n if(${c}) {\n ${e}\n result[1] = getChannel(getX(${l.join()}), ${f});\n }\n rc = outputLoc;\n ${u[r-2]} += 1;\n if(${u[r-2]} < ${this.outputShape[r-2]}) {\n ${e}\n result[2] = getChannel(getX(${l.join()}), ${f});\n ${u[r-1]} += 1;\n if(${c}) {\n ${e}\n result[3] = getChannel(getX(${l.join()}), ${f});\n }\n }\n `}this.userCode=`\n const ${i} start = ${i}(${a});\n const ${i} end = ${i}(${d});\n\n void main() {\n ${i} outputLoc = getOutputCoords();\n vec4 result = vec4(0.);\n ${m}\n setOutput(result);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/mulmat_packed_gpu.js": -/*!*******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/mulmat_packed_gpu.js ***! - \*******************************************************************************/ -/*! exports provided: MatMulPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"MatMulPackedProgram",(function(){return s})); +let i;const a={kernelName:s.Prod,backendName:"wasm",setupFunc:function(e){i=e.wasm.cwrap(s.Prod,null,["number","number","number","number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:a}=e,{axis:u,keepDims:d}=a,{x:l}=n,c=t.dataIdMap.get(l.dataId).id;let f=c,p=l;const{transposed:m,axes:h,originalAxes:b,inputWasTransposed:j}=Object(o.permuteAxesAndTranspose)(l,u,t);let g=h;if(j){const e=t.dataIdMap.get(m.dataId).id;e!==c&&(p=m,f=e,g=s.backend_util.getInnerMostAxes(g.length,p.shape.length))}s.backend_util.assertAxesAreInnerMostDims("prod",g,p.shape.length);const[w,_]=s.backend_util.computeOutAndReduceShapes(p.shape,g),k=s.util.sizeFromShape(_),v=t.makeOutput(w,p.dtype);if(0!==s.util.sizeFromShape(p.shape)){const e=t.dataIdMap.get(v.dataId).id;i(f,k,r.CppDType[v.dtype],e)}if(j&&t.disposeData(m.dataId),d){const e=s.backend_util.expandShapeToKeepDim(v.shape,b);v.shape=e}return v}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Range.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Range.js ***! + \**************************************************************************/ +/*! exports provided: range, rangeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"range",(function(){return r})),n.d(t,"rangeConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernel_utils/shared.js"); /** * @license - * Copyright 2018 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -11024,14 +11012,14 @@ class r{constructor(e,t,n){this.variableNames=["x"],this.packedInputs=!0,this.pa * limitations under the License. * ============================================================================= */ -class s{constructor(e,t,n,s=!1,o=!1,r=!1,i=null,a=!1,d=!1){this.variableNames=["matrixA","matrixB"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=n;const u=s?e[1]:e[2],l=Math.ceil(u/2),c=s?"i * 2, rc.y":"rc.y, i * 2",f=o?"rc.z, i * 2":"i * 2, rc.z",p=s?["a.xxyy","a.zzww"]:["a.xxzz","a.yyww"],m=o?["b.xzxz","b.ywyw"]:["b.xyxy","b.zwzw"];let h="",b="";i&&(h=a?`vec4 activation(vec4 a) {\n vec4 b = getPreluActivationWeightsAtOutCoords();\n ${i}\n }`:d?`vec4 activation(vec4 a) {\n vec4 b = getLeakyreluAlphaAtOutCoords();\n ${i}\n }`:`vec4 activation(vec4 x) {\n ${i}\n }`,b="result = activation(result);");const j=r?"result += getBiasAtOutCoords();":"";r&&this.variableNames.push("bias"),a&&this.variableNames.push("preluActivationWeights"),d&&this.variableNames.push("leakyreluAlpha");let g="rc.x",w="rc.x";e[0]{const{backend:t,attrs:n}=e,{start:s,stop:r,step:i,dtype:a}=n,u=Object(o.rangeImplCPU)(s,r,i,a),d=t.makeOutput([u.length],a);return t.typedArrayFromHeap(d).set(u),d},i={kernelName:s.Range,backendName:"wasm",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/RealDiv.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/RealDiv.js ***! + \****************************************************************************/ +/*! exports provided: realDivConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"realDivConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); /** * @license - * Copyright 2017 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -11045,14 +11033,14 @@ class s{constructor(e,t,n,s=!1,o=!1,r=!1,i=null,a=!1,d=!1){this.variableNames=[" * limitations under the License. * ============================================================================= */ -class s{constructor(e,t,n){this.variableNames=["probs"],this.customUniforms=[{name:"seed",type:"float"}],this.outputShape=[e,n],this.userCode=`\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n\n float r = random(seed);\n float cdf = 0.0;\n\n for (int i = 0; i < ${t-1}; i++) {\n cdf += getProbs(batch, i);\n\n if (r < cdf) {\n setOutput(float(i));\n return;\n }\n }\n\n // If no other event happened, last event happened.\n setOutput(float(${t-1}));\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/onehot_gpu.js": -/*!************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/onehot_gpu.js ***! - \************************************************************************/ -/*! exports provided: OneHotProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"OneHotProgram",(function(){return s})); +const r=Object(o.createBinaryKernelConfig)(s.RealDiv,!0)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Relu.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Relu.js ***! + \*************************************************************************/ +/*! exports provided: reluConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"reluConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); /** * @license - * Copyright 2017 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -11066,14 +11054,14 @@ class s{constructor(e,t,n){this.variableNames=["probs"],this.customUniforms=[{na * limitations under the License. * ============================================================================= */ -class s{constructor(e,t,n,s){this.variableNames=["indices"],this.outputShape=[e,t],this.userCode=`\n void main() {\n ivec2 coords = getOutputCoords();\n int index = round(getIndices(coords.x));\n setOutput(mix(float(${s}), float(${n}),\n float(index == coords.y)));\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/pack_gpu.js": -/*!**********************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/pack_gpu.js ***! - \**********************************************************************/ -/*! exports provided: PackProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"PackProgram",(function(){return r}));var s=n(/*! ./packing_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/packing_util.js"),o=n(/*! ./shader_compiler */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +const r=Object(o.createUnaryKernelConfig)(s.Relu)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Relu6.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Relu6.js ***! + \**************************************************************************/ +/*! exports provided: relu6Config */function(e,t,n){"use strict";n.r(t),n.d(t,"relu6Config",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); /** * @license - * Copyright 2018 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -11087,14 +11075,14 @@ class s{constructor(e,t,n,s){this.variableNames=["indices"],this.outputShape=[e, * limitations under the License. * ============================================================================= */ -class r{constructor(e){this.variableNames=["A"],this.packedInputs=!1,this.packedOutput=!0,this.outputShape=e;const t=e.length;if(0===t)this.userCode="\n void main() {\n setOutput(vec4(getA(), 0., 0., 0.));\n }\n ";else{const n=Object(s.getChannels)("rc",t),r=Object(o.getCoordsDataType)(t),i=function(e,t,n){if(1===e)return`rc > ${t[0]}`;let s="";for(let o=e-2;o= ${t[o]}`,o= ${t};\n bool rEdge = rp1 >= ${n};\n `}(t,e[e.length-1],e[e.length-2],n),d=function(e,t){const n=e.length,s=function(e,t){const n=[];for(let s=0;s<=1;s++)for(let o=0;o<=1;o++){let r=`${0===s?"r":"rp1"}, ${0===o?"c":"cp1"}`;for(let n=2;n= ${e[0]} ? 0. : getA(rc + 1),\n 0, 0`;return`getA(${s[0]}),\n cEdge ? 0. : getA(${s[1]}),\n rEdge ? 0. : getA(${s[2]}),\n rEdge || cEdge ? 0. : getA(${s[3]})`}(e,n);this.userCode=`\n void main() {\n ${r} rc = getOutputCoords();\n\n if(${i}) {\n setOutput(vec4(0));\n } else {\n ${a}\n\n setOutput(vec4(${d}));\n }\n }\n `}}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/packing_util.js": -/*!**************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/packing_util.js ***! - \**************************************************************************/ -/*! exports provided: getVecChannels, getChannels, getSourceCoords */function(e,t,n){"use strict"; +const r=Object(o.createUnaryKernelConfig)(s.Relu6)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Reshape.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Reshape.js ***! + \****************************************************************************/ +/*! exports provided: reshape, reshapeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"reshape",(function(){return o})),n.d(t,"reshapeConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license - * Copyright 2018 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -11107,15 +11095,14 @@ class r{constructor(e){this.variableNames=["A"],this.packedInputs=!1,this.packed * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -function s(e,t){return["x","y","z","w","u","v"].slice(0,t).map((t=>`${e}.${t}`))}function o(e,t){return 1===t?[e]:s(e,t)}function r(e,t){if(1===e)return"rc";let n="";for(let s=0;s`new shape: ${a}, old shape: ${o.shape}. New shape and old shape must have the same number of elements.`)),e.backend.incRef(o.dataId),{dataId:o.dataId,shape:a,dtype:o.dtype}}const r={kernelName:s.Reshape,backendName:"wasm",kernelFunc:o}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ResizeBilinear.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ResizeBilinear.js ***! + \***********************************************************************************/ +/*! exports provided: resizeBilinearConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"resizeBilinearConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Cast */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Cast.js"); /** * @license - * Copyright 2017 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -11128,14 +11115,15 @@ function s(e,t){return["x","y","z","w","u","v"].slice(0,t).map((t=>`${e}.${t}`)) * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */class o{constructor(e,t,n){this.variableNames=["x"],this.customUniforms=[{name:"value",type:"float"}],this.outputShape=t.map(((t,n)=>t[0]+e[n]+t[1]));const o=e.length,r=Object(s.getCoordsDataType)(o),i=t.map((e=>e[0])).join(","),a=t.map(((t,n)=>t[0]+e[n])).join(","),d=["coords[0]","coords[1]","coords[2]","coords[3]"].slice(0,o);this.userCode=1!==o?`\n ${r} start = ${r}(${i});\n ${r} end = ${r}(${a});\n\n void main() {\n ${r} outC = getOutputCoords();\n if (any(lessThan(outC, start)) || any(greaterThanEqual(outC, end))) {\n setOutput(value);\n } else {\n ${r} coords = outC - start;\n setOutput(getX(${d}));\n }\n }\n `:`\n int start = ${i};\n int end = ${a};\n\n void main() {\n int outC = getOutputCoords();\n if (outC < start || outC >= end) {\n setOutput(value);\n } else {\n setOutput(getX(outC - start));\n }\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/pad_packed_gpu.js": + */ +let r;const i={kernelName:s.ResizeBilinear,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.ResizeBilinear,null,["number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:i}=e,{images:a}=n,{alignCorners:u,halfPixelCenters:d,size:l}=i,[c,f]=l,[p,m,h,b]=a.shape,j=[p,c,f,b];let g,w=t.dataIdMap.get(a.dataId);"float32"!==w.dtype&&(g=Object(o.cast)({backend:t,inputs:{x:a},attrs:{dtype:"float32"}}),w=t.dataIdMap.get(g.dataId));const _=w.id,k=t.makeOutput(j,"float32");if(0===s.util.sizeFromShape(a.shape))return k;const v=t.dataIdMap.get(k.dataId).id;return r(_,p,m,h,b,c,f,u?1:0,d?1:0,v),null!=g&&t.disposeData(g.dataId),k}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Reverse.js": /*!****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/pad_packed_gpu.js ***! + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Reverse.js ***! \****************************************************************************/ -/*! exports provided: PadPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"PadPackedProgram",(function(){return r}));var s=n(/*! ./packing_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/packing_util.js"),o=n(/*! ./shader_compiler */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/*! exports provided: reverse, reverseConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"reverse",(function(){return a})),n.d(t,"reverseConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Identity.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Reshape.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -11149,14 +11137,14 @@ function s(e,t){return["x","y","z","w","u","v"].slice(0,t).map((t=>`${e}.${t}`)) * limitations under the License. * ============================================================================= */ -class r{constructor(e,t,n){this.variableNames=["x"],this.packedInputs=!0,this.packedOutput=!0,this.customUniforms=[{name:"value",type:"float"}],this.outputShape=t.map(((t,n)=>t[0]+e[n]+t[1]));const r=e.length,i=Object(o.getCoordsDataType)(r),a=t.map((e=>e[0])).join(","),d=t.map(((t,n)=>t[0]+e[n])).join(","),u=Object(s.getChannels)("rc",r),l=Object(s.getChannels)("source",r),c=`${u[r-1]} < ${this.outputShape[r-1]}`,f=1===r?"source":`vec2(${l.slice(-2).join()})`,p=[`${i} rc = outputLoc;`,`${u[r-1]} += 1;\n if(${c}) {\n `,1===r?"":`}\n rc = outputLoc;\n ${u[r-2]} += 1;\n if(${u[r-2]} < ${this.outputShape[r-2]}) {`,1===r?"":` ${u[r-1]} += 1;\n if(${c}) {`],m=1===r?"rc < start || rc >= end":"any(lessThan(rc, start)) || any(greaterThanEqual(rc, end))";let h="";for(let e=0,t=1===r?2:4;e= ${e.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${c};\n wC += ${u}) {\n int xC = xCCorner + wC;\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n float value = getX(batch, xR, xC, d);\n\n // If a min / max value has already been found, use it. If not,\n // use the current value.\n float currMinMaxValue = mix(\n value, minMaxValue, minMaxValueFound);\n if (value ${t} currMinMaxValue) {\n minMaxValue = value;\n minMaxValueFound = 1.0;\n minMaxPosition = ${s?o?h:b:`wR * ${c} + wC`};\n }\n }\n }\n setOutput(float(minMaxPosition));\n }\n `)}let g=`${t}(${t}(${t}(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])`;"avg"===t&&(g="avgValue / count");const w=4*Math.floor(r/4),_=r%4,k=`\n if (${m}) {\n avgValue += dot(values, ones);\n } else {\n minMaxValue = max(values, minMaxValue);\n }\n `;this.userCode=`\n const ivec2 strides = ivec2(${i}, ${a});\n const ivec2 pads = ivec2(${f}, ${p});\n const float initializationValue = ${j};\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float count = 0.0;\n\n float getValue(int batch, int xR, int xC, int d) {\n if (xC < 0 || xC >= ${e.inWidth}) {\n return initializationValue;\n }\n count += 1.0;\n return getX(batch, xR, xC, d);\n }\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d = coords[3];\n\n ivec2 xRCCorner = coords.yz * strides - pads;\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // max/min x(?, ?, d) to get y(yR, yC, d).\n // ? = to be determined\n vec4 minMaxValue = vec4(${j});\n float avgValue = 0.0;\n count = 0.0;\n\n for (int wR = 0; wR < ${l};\n wR += ${d}) {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${w}; wC += 4) {\n int xC = xCCorner + wC * ${u};\n\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + ${u}, d),\n getValue(batch, xR, xC + 2 * ${u}, d),\n getValue(batch, xR, xC + 3 * ${u}, d)\n );\n\n ${k}\n }\n\n int xC = xCCorner + ${w};\n if (${1===_}) {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n ${k}\n } else if (${2===_}) {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + ${u}, d),\n initializationValue,\n initializationValue\n );\n\n ${k}\n } else if (${3===_}) {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + ${u}, d),\n getValue(batch, xR, xC + 2 * ${u}, d),\n initializationValue\n );\n\n ${k}\n }\n }\n setOutput(${g});\n }\n `}}class o{constructor(e,t,n,s=!1,o=!1){if(this.variableNames=["x"],"avg"===t&&n)throw new Error("Cannot compute positions for average pool.");const r=e.filterWidth,i=e.strideDepth,a=e.strideHeight,d=e.strideWidth,u=e.dilationDepth,l=e.dilationHeight,c=e.dilationWidth,f=e.effectiveFilterDepth,p=e.effectiveFilterHeight,m=e.effectiveFilterWidth,h=e.padInfo.front,b=e.padInfo.top,j=e.padInfo.left;this.outputShape=e.outShape;const g="avg"===t;let w="0.0";if(g||(w="-1.0 / 1e-20"),n){const t=">=";return void(this.userCode=`\n const ivec3 strides =\n ivec3(${i}, ${a}, ${d});\n const ivec3 pads = ivec3(${h}, ${b}, ${j});\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int ch = coords.u;\n\n ivec3 xCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads;\n int xDCorner = xCorner.x;\n int xRCorner = xCorner.y;\n int xCCorner = xCorner.z;\n\n // max/min x(?, ?, ?, ch) to get y(yD, yR, yC, ch).\n // ? = to be determined\n float minMaxValue = 0.0;\n float minMaxValueFound = 0.0;\n int minMaxPosition = 0;\n\n for (int wD = 0; wD < ${f};\n wD += ${u}) {\n int xD = xDCorner + wD;\n\n if (xD < 0 || xD >= ${e.inDepth}) {\n continue;\n }\n\n for (int wR = 0; wR < ${p};\n wR += ${l}) {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${m};\n wC += ${c}) {\n int xC = xCCorner + wC;\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n float value = getX(batch, xD, xR, xC, ch);\n\n // If a min / max value has already been found, use it. If not,\n // use the current value.\n float currMinMaxValue = mix(\n value, minMaxValue, minMaxValueFound);\n if (value ${t} currMinMaxValue) {\n minMaxValue = value;\n minMaxValueFound = 1.0;\n minMaxPosition = ${s?o?`(((batch * ${e.inDepth} + xD) * ${e.inHeight} + xR) * ${e.inWidth} + xC) * ${e.inChannels} + ch`:`((xD * ${e.inHeight} + xR) * ${e.inWidth} + xC) * ${e.inChannels} + ch`:`wD * ${p} * ${m} +\n wR * ${m} + wC`};\n }\n }\n }\n }\n setOutput(float(minMaxPosition));\n }\n `)}let _=`${t}(${t}(${t}(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])`;"avg"===t&&(_="avgValue / count");const k=4*Math.floor(r/4),v=r%4,x=`\n if (${g}) {\n avgValue += dot(values, ones);\n } else {\n minMaxValue = max(values, minMaxValue);\n }\n `;this.userCode=`\n const ivec3 strides =\n ivec3(${i}, ${a}, ${d});\n const ivec3 pads = ivec3(${h}, ${b}, ${j});\n const float initializationValue = ${w};\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float count = 0.0;\n\n float getValue(int batch, int xD, int xR, int xC, int ch) {\n if (xC < 0 || xC >= ${e.inWidth}) {\n return initializationValue;\n }\n count += 1.0;\n return getX(batch, xD, xR, xC, ch);\n }\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int ch = coords.u;\n\n ivec3 xCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads;\n int xDCorner = xCorner.x;\n int xRCorner = xCorner.y;\n int xCCorner = xCorner.z;\n\n // max/min x(?, ?, ?, d) to get y(yD, yR, yC, ch).\n // ? = to be determined\n vec4 minMaxValue = vec4(${w});\n float avgValue = 0.0;\n count = 0.0;\n\n for (int wD = 0; wD < ${f};\n wD += ${u}) {\n int xD = xDCorner + wD;\n\n if (xD < 0 || xD >= ${e.inDepth}) {\n continue;\n }\n\n for (int wR = 0; wR < ${p};\n wR += ${l}) {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${k}; wC += 4) {\n int xC = xCCorner + wC * ${c};\n\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n getValue(batch, xD, xR, xC + ${c}, ch),\n getValue(batch, xD, xR, xC + 2 * ${c}, ch),\n getValue(batch, xD, xR, xC + 3 * ${c}, ch)\n );\n\n ${x}\n }\n\n int xC = xCCorner + ${k};\n if (${1===v}) {\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n ${x}\n } else if (${2===v}) {\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n getValue(batch, xD, xR, xC + ${c}, ch),\n initializationValue,\n initializationValue\n );\n\n ${x}\n } else if (${3===v}) {\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n getValue(batch, xD, xR, xC + ${c}, ch),\n getValue(batch, xD, xR, xC + 2 * ${c}, ch),\n initializationValue\n );\n\n ${x}\n }\n }\n setOutput(${_});\n }\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/reduce_gpu.js": -/*!************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/reduce_gpu.js ***! - \************************************************************************/ -/*! exports provided: ReduceProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ReduceProgram",(function(){return s})); + */let o;function r(e){const{inputs:t,backend:n,attrs:r}=e,{image:i}=t,{radians:a,fillValue:u,center:d}=r,l=n.makeOutput(i.shape,i.dtype),c=n.dataIdMap.get(i.dataId).id,f=n.dataIdMap.get(l.dataId).id,[p,m,h,b]=i.shape,[j,g]=s.backend_util.getImageCenter(d,m,h),w="number"==typeof u?[u,u,u,0===u?0:255]:[...u,255],_=new Uint8Array(new Int32Array(w).buffer);return o(c,p,m,h,b,a,j,g,_,w.length,f),l}const i={kernelName:s.RotateWithOffset,backendName:"wasm",kernelFunc:r,setupFunc:function(e){o=e.wasm.cwrap(s.RotateWithOffset,null,["number","number","number","number","number","number","number","number","array","number","number"])}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Round.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Round.js ***! + \**************************************************************************/ +/*! exports provided: roundConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"roundConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); /** * @license - * Copyright 2017 Google LLC. All Rights Reserved. + * Copyright 2021 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -11191,14 +11178,14 @@ class s{constructor(e,t,n,s=!1,o=!1){if(this.variableNames=["x"],"avg"===t&&n)th * limitations under the License. * ============================================================================= */ -class s{constructor(e,t){this.variableNames=["x"];const{windowSize:n,batchSize:s,inSize:o,outSize:r}=e;this.outputShape=[s,r];let i="0.0",a="";"prod"===t?i="1.0":"min"===t?(i="1.0 / 1e-20",a="min"):"max"===t&&(i="-1.0 / 1e-20",a="max");let d=`${t}(${t}(${t}(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])`;"sum"===t?d="sumValue":"prod"===t?d="prodValue":"all"===t?d="allValue":"any"===t&&(d="anyValue");const u=4*Math.floor(n/4),l=n%4;let c=`\n if (${"sum"===t}) {\n sumValue += dot(values, ones);\n } else if (${"prod"===t}) {\n vec2 tmp = vec2(values[0], values[1]) * vec2(values[2], values[3]);\n prodValue *= tmp[0] * tmp[1];\n } else {\n minMaxValue = ${a}(values, minMaxValue);\n if (${"min"===t} || ${"max"===t}) {\n minMaxValue = ${a}(values, minMaxValue);\n bvec4 isNaN = isnan(values);\n if (isNaN.r || isNaN.g || isNaN.b || isNaN.a) {\n minMaxValue = vec4(NAN);\n }\n }\n }\n `,f="vec4";"all"===t?(i="1.0",c="\n bool reducedAllValue = all(values);\n float floatedReducedAllValue = float(reducedAllValue);\n allValue = float(allValue >= 1.0 && floatedReducedAllValue >= 1.0);\n ",f="bvec4"):"any"===t&&(i="0.0",c="\n bool reducedAnyValue = any(values);\n float floatedReducedAnyValue = float(reducedAnyValue);\n anyValue = float(anyValue >= 1.0 || floatedReducedAnyValue >= 1.0);\n ",f="bvec4");let p="";o%n>0&&(p=`\n if (inIdx < 0 || inIdx >= ${o}) {\n return initializationValue;\n }\n `),this.userCode=`\n const float initializationValue = ${i};\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float getValue(int batch, int inIdx) {\n ${p}\n return getX(batch, inIdx);\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = outIdx * ${n};\n\n vec4 minMaxValue = vec4(${i});\n float prodValue = 1.0;\n float sumValue = 0.0;\n float allValue = 1.0;\n float anyValue = 0.0;\n\n for (int i = 0; i < ${u}; i += 4) {\n int inIdx = inOffset + i;\n ${f} values = ${f}(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n getValue(batch, inIdx + 3)\n );\n\n ${c}\n }\n\n int inIdx = inOffset + ${u};\n if (${1===l}) {\n ${f} values = ${f}(\n getValue(batch, inIdx),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n ${c}\n } else if (${2===l}) {\n ${f} values = ${f}(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n initializationValue,\n initializationValue\n );\n\n ${c}\n } else if (${3===l}) {\n ${f} values = ${f}(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n initializationValue\n );\n\n ${c}\n }\n setOutput(${d});\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/register_all_kernels.js": -/*!**********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/register_all_kernels.js ***! - \**********************************************************************************/ -/*! no exports provided */function(e,t,n){"use strict";n.r(t);var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./kernels/_FusedMatMul */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/_FusedMatMul.js"),r=n(/*! ./kernels/Abs */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Abs.js"),i=n(/*! ./kernels/Acos */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Acos.js"),a=n(/*! ./kernels/Acosh */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Acosh.js"),d=n(/*! ./kernels/Add */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Add.js"),u=n(/*! ./kernels/AddN */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/AddN.js"),l=n(/*! ./kernels/All */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/All.js"),c=n(/*! ./kernels/Any */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Any.js"),f=n(/*! ./kernels/ArgMax */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ArgMax.js"),p=n(/*! ./kernels/ArgMin */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ArgMin.js"),m=n(/*! ./kernels/Asin */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Asin.js"),h=n(/*! ./kernels/Asinh */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Asinh.js"),b=n(/*! ./kernels/Atan */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Atan.js"),j=n(/*! ./kernels/Atan2 */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Atan2.js"),g=n(/*! ./kernels/Atanh */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Atanh.js"),w=n(/*! ./kernels/AvgPool */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPool.js"),_=n(/*! ./kernels/AvgPool3D */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPool3D.js"),k=n(/*! ./kernels/AvgPool3DGrad */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPool3DGrad.js"),v=n(/*! ./kernels/AvgPoolGrad */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPoolGrad.js"),x=n(/*! ./kernels/BatchMatMul */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchMatMul.js"),y=n(/*! ./kernels/BatchNorm */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchNorm.js"),O=n(/*! ./kernels/BatchToSpaceND */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchToSpaceND.js"),I=n(/*! ./kernels/Bincount */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Bincount.js"),C=n(/*! ./kernels/Cast */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Cast.js"),S=n(/*! ./kernels/Ceil */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Ceil.js"),T=n(/*! ./kernels/ClipByValue */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ClipByValue.js"),N=n(/*! ./kernels/Complex */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js"),E=n(/*! ./kernels/ComplexAbs */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ComplexAbs.js"),A=n(/*! ./kernels/Concat */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Concat.js"),R=n(/*! ./kernels/Conv2D */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2D.js"),F=n(/*! ./kernels/Conv2DBackpropFilter */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2DBackpropFilter.js"),$=n(/*! ./kernels/Conv2DBackpropInput */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2DBackpropInput.js"),M=n(/*! ./kernels/Conv3D */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv3D.js"),D=n(/*! ./kernels/Conv3DBackpropFilterV2 */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv3DBackpropFilterV2.js"),P=n(/*! ./kernels/Conv3DBackpropInputV2 */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv3DBackpropInputV2.js"),B=n(/*! ./kernels/Cos */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Cos.js"),L=n(/*! ./kernels/Cosh */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Cosh.js"),z=n(/*! ./kernels/CropAndResize */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/CropAndResize.js"),G=n(/*! ./kernels/Cumsum */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Cumsum.js"),W=n(/*! ./kernels/DenseBincount */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/DenseBincount.js"),U=n(/*! ./kernels/DepthToSpace */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthToSpace.js"),V=n(/*! ./kernels/DepthwiseConv2dNative */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthwiseConv2dNative.js"),q=n(/*! ./kernels/DepthwiseConv2dNativeBackpropFilter */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthwiseConv2dNativeBackpropFilter.js"),H=n(/*! ./kernels/DepthwiseConv2dNativeBackpropInput */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthwiseConv2dNativeBackpropInput.js"),K=n(/*! ./kernels/Diag */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Diag.js"),X=n(/*! ./kernels/Dilation2D */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Dilation2D.js"),Y=n(/*! ./kernels/Einsum */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Einsum.js"),Z=n(/*! ./kernels/Elu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Elu.js"),Q=n(/*! ./kernels/EluGrad */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/EluGrad.js"),J=n(/*! ./kernels/Equal */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Equal.js"),ee=n(/*! ./kernels/Erf */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Erf.js"),te=n(/*! ./kernels/Exp */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Exp.js"),ne=n(/*! ./kernels/ExpandDims */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ExpandDims.js"),se=n(/*! ./kernels/Expm1 */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Expm1.js"),oe=n(/*! ./kernels/FFT */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FFT.js"),re=n(/*! ./kernels/Fill */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Fill.js"),ie=n(/*! ./kernels/FlipLeftRight */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FlipLeftRight.js"),ae=n(/*! ./kernels/Floor */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Floor.js"),de=n(/*! ./kernels/FloorDiv */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FloorDiv.js"),ue=n(/*! ./kernels/FromPixels */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FromPixels.js"),le=n(/*! ./kernels/FusedConv2D */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FusedConv2D.js"),ce=n(/*! ./kernels/FusedDepthwiseConv2D */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FusedDepthwiseConv2D.js"),fe=n(/*! ./kernels/GatherNd */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/GatherNd.js"),pe=n(/*! ./kernels/GatherV2 */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/GatherV2.js"),me=n(/*! ./kernels/Greater */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Greater.js"),he=n(/*! ./kernels/GreaterEqual */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/GreaterEqual.js"),be=n(/*! ./kernels/Identity */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"),je=n(/*! ./kernels/IFFT */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/IFFT.js"),ge=n(/*! ./kernels/Imag */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Imag.js"),we=n(/*! ./kernels/IsFinite */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/IsFinite.js"),_e=n(/*! ./kernels/IsInf */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/IsInf.js"),ke=n(/*! ./kernels/IsNaN */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/IsNaN.js"),ve=n(/*! ./kernels/LeakyRelu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LeakyRelu.js"),xe=n(/*! ./kernels/Less */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Less.js"),ye=n(/*! ./kernels/LessEqual */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LessEqual.js"),Oe=n(/*! ./kernels/LinSpace */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LinSpace.js"),Ie=n(/*! ./kernels/Log */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Log.js"),Ce=n(/*! ./kernels/Log1p */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Log1p.js"),Se=n(/*! ./kernels/LogicalAnd */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LogicalAnd.js"),Te=n(/*! ./kernels/LogicalNot */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LogicalNot.js"),Ne=n(/*! ./kernels/LogicalOr */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LogicalOr.js"),Ee=n(/*! ./kernels/LRN */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LRN.js"),Ae=n(/*! ./kernels/LRNGrad */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LRNGrad.js"),Re=n(/*! ./kernels/Max */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Max.js"),Fe=n(/*! ./kernels/Maximum */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Maximum.js"),$e=n(/*! ./kernels/MaxPool */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPool.js"),Me=n(/*! ./kernels/MaxPool3D */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPool3D.js"),De=n(/*! ./kernels/MaxPool3DGrad */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPool3DGrad.js"),Pe=n(/*! ./kernels/MaxPoolGrad */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolGrad.js"),Be=n(/*! ./kernels/MaxPoolWithArgmax */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolWithArgmax.js"),Le=n(/*! ./kernels/Mean */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Mean.js"),ze=n(/*! ./kernels/Min */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Min.js"),Ge=n(/*! ./kernels/Minimum */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Minimum.js"),We=n(/*! ./kernels/MirrorPad */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MirrorPad.js"),Ue=n(/*! ./kernels/Mod */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Mod.js"),Ve=n(/*! ./kernels/Multinomial */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Multinomial.js"),qe=n(/*! ./kernels/Multiply */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Multiply.js"),He=n(/*! ./kernels/Neg */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Neg.js"),Ke=n(/*! ./kernels/NonMaxSuppressionV3 */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV3.js"),Xe=n(/*! ./kernels/NonMaxSuppressionV4 */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV4.js"),Ye=n(/*! ./kernels/NonMaxSuppressionV5 */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV5.js"),Ze=n(/*! ./kernels/NotEqual */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NotEqual.js"),Qe=n(/*! ./kernels/OneHot */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/OneHot.js"),Je=n(/*! ./kernels/OnesLike */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/OnesLike.js"),et=n(/*! ./kernels/Pack */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Pack.js"),tt=n(/*! ./kernels/PadV2 */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/PadV2.js"),nt=n(/*! ./kernels/Pow */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Pow.js"),st=n(/*! ./kernels/Prelu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Prelu.js"),ot=n(/*! ./kernels/Prod */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Prod.js"),rt=n(/*! ./kernels/Range */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Range.js"),it=n(/*! ./kernels/Real */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Real.js"),at=n(/*! ./kernels/RealDiv */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/RealDiv.js"),dt=n(/*! ./kernels/Reciprocal */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reciprocal.js"),ut=n(/*! ./kernels/Relu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Relu.js"),lt=n(/*! ./kernels/Relu6 */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Relu6.js"),ct=n(/*! ./kernels/Reshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),ft=n(/*! ./kernels/ResizeBilinear */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeBilinear.js"),pt=n(/*! ./kernels/ResizeBilinearGrad */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeBilinearGrad.js"),mt=n(/*! ./kernels/ResizeNearestNeighbor */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeNearestNeighbor.js"),ht=n(/*! ./kernels/ResizeNearestNeighborGrad */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeNearestNeighborGrad.js"),bt=n(/*! ./kernels/Reverse */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reverse.js"),jt=n(/*! ./kernels/RotateWithOffset */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/RotateWithOffset.js"),gt=n(/*! ./kernels/Round */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Round.js"),wt=n(/*! ./kernels/Rsqrt */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Rsqrt.js"),_t=n(/*! ./kernels/ScatterNd */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ScatterNd.js"),kt=n(/*! ./kernels/Select */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Select.js"),vt=n(/*! ./kernels/Selu */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Selu.js"),xt=n(/*! ./kernels/Sigmoid */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sigmoid.js"),yt=n(/*! ./kernels/Sign */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sign.js"),Ot=n(/*! ./kernels/Sin */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sin.js"),It=n(/*! ./kernels/Sinh */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sinh.js"),Ct=n(/*! ./kernels/Slice */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Slice.js"),St=n(/*! ./kernels/Softmax */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Softmax.js"),Tt=n(/*! ./kernels/Softplus */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Softplus.js"),Nt=n(/*! ./kernels/SpaceToBatchND */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SpaceToBatchND.js"),Et=n(/*! ./kernels/SparseFillEmptyRows */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseFillEmptyRows.js"),At=n(/*! ./kernels/SparseReshape */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseReshape.js"),Rt=n(/*! ./kernels/SparseSegmentMean */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseSegmentMean.js"),Ft=n(/*! ./kernels/SparseSegmentSum */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseSegmentSum.js"),$t=n(/*! ./kernels/SparseToDense */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseToDense.js"),Mt=n(/*! ./kernels/SplitV */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SplitV.js"),Dt=n(/*! ./kernels/Sqrt */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sqrt.js"),Pt=n(/*! ./kernels/Square */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Square.js"),Bt=n(/*! ./kernels/SquaredDifference */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SquaredDifference.js"),Lt=n(/*! ./kernels/Step */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Step.js"),zt=n(/*! ./kernels/StridedSlice */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/StridedSlice.js"),Gt=n(/*! ./kernels/StringNGrams */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/StringNGrams.js"),Wt=n(/*! ./kernels/StringSplit */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/StringSplit.js"),Ut=n(/*! ./kernels/StringToHashBucketFast */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/StringToHashBucketFast.js"),Vt=n(/*! ./kernels/Sub */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sub.js"),qt=n(/*! ./kernels/Sum */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sum.js"),Ht=n(/*! ./kernels/Tan */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Tan.js"),Kt=n(/*! ./kernels/Tanh */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Tanh.js"),Xt=n(/*! ./kernels/Tile */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Tile.js"),Yt=n(/*! ./kernels/TopK */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/TopK.js"),Zt=n(/*! ./kernels/Transform */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transform.js"),Qt=n(/*! ./kernels/Transpose */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"),Jt=n(/*! ./kernels/Unique */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Unique.js"),en=n(/*! ./kernels/Unpack */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Unpack.js"),tn=n(/*! ./kernels/UnsortedSegmentSum */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/UnsortedSegmentSum.js"),nn=n(/*! ./kernels/ZerosLike */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ZerosLike.js"); +const r=Object(o.createUnaryKernelConfig)(s.Round)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Rsqrt.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Rsqrt.js ***! + \**************************************************************************/ +/*! exports provided: rsqrtConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"rsqrtConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -11212,14 +11199,14 @@ class s{constructor(e,t){this.variableNames=["x"];const{windowSize:n,batchSize:s * limitations under the License. * ============================================================================= */ -const sn=[Ee.LRNConfig,Ae.LRNGradConfig,o._fusedMatMulConfig,r.absConfig,i.acosConfig,a.acoshConfig,d.addConfig,u.addNConfig,l.allConfig,c.anyConfig,f.argMaxConfig,p.argMinConfig,m.asinConfig,h.asinhConfig,j.atan2Config,b.atanConfig,g.atanhConfig,_.avgPool3DConfig,w.avgPoolConfig,k.avgPoolGrad3DConfig,v.avgPoolGradConfig,x.batchMatMulConfig,y.batchNormConfig,O.batchToSpaceNDConfig,I.bincountConfig,C.castConfig,S.ceilConfig,T.clipByValueConfig,E.complexAbsConfig,N.complexConfig,A.concatConfig,F.conv2DBackpropFilterConfig,$.conv2DBackpropInputConfig,R.conv2DConfig,D.conv3DBackpropFilterV2Config,P.conv3DBackpropInputConfig,M.conv3DConfig,B.cosConfig,L.coshConfig,z.cropAndResizeConfig,G.cumsumConfig,W.denseBincountConfig,U.depthToSpaceConfig,q.depthwiseConv2dNativeBackpropFilterConfig,H.depthwiseConv2dNativeBackpropInputConfig,V.depthwiseConv2dNativeConfig,K.diagConfig,X.dilation2DConfig,Y.einsumConfig,Z.eluConfig,Q.eluGradConfig,J.equalConfig,ee.erfConfig,te.expConfig,ne.expandDimsConfig,se.expm1Config,oe.fftConfig,re.fillConfig,ie.flipLeftRightConfig,ae.floorConfig,de.floorDivConfig,ue.fromPixelsConfig,le.fusedConv2DConfig,ce.fusedDepthwiseConv2DConfig,fe.gatherNdConfig,pe.gatherV2Config,me.greaterConfig,he.greaterEqualConfig,be.identityConfig,je.ifftConfig,ge.imagConfig,we.isFiniteConfig,_e.isInfConfig,ke.isNaNConfig,ve.leakyReluConfig,xe.lessConfig,ye.lessEqualConfig,Oe.linSpaceConfig,Ce.log1pConfig,Ie.logConfig,Se.logicalAndConfig,Te.logicalNotConfig,Ne.logicalOrConfig,Re.maxConfig,Me.maxPool3DConfig,$e.maxPoolConfig,De.maxPoolGrad3DConfig,Pe.maxPoolGradConfig,Be.maxPoolWithArgmaxConfig,Fe.maximumConfig,Le.meanConfig,ze.minConfig,Ge.minimumConfig,We.mirrorPadConfig,Ue.modConfig,Ve.multinomialConfig,qe.multiplyConfig,He.negConfig,Ke.nonMaxSuppressionV3Config,Xe.nonMaxSuppressionV4Config,Ye.nonMaxSuppressionV5Config,Ze.notEqualConfig,Qe.oneHotConfig,Je.onesLikeConfig,et.packConfig,tt.padV2Config,nt.powConfig,st.preluConfig,ot.prodConfig,rt.rangeConfig,it.realConfig,at.realDivConfig,dt.reciprocalConfig,lt.relu6Config,ut.reluConfig,ct.reshapeConfig,ft.resizeBilinearConfig,pt.resizeBilinearGradConfig,mt.resizeNearestNeighborConfig,ht.resizeNearestNeighborGradConfig,bt.reverseConfig,jt.rotateWithOffsetConfig,gt.roundConfig,wt.rsqrtConfig,_t.scatterNdConfig,kt.selectConfig,vt.seluConfig,xt.sigmoidConfig,yt.signConfig,Ot.sinConfig,It.sinhConfig,Ct.sliceConfig,St.softmaxConfig,Tt.softplusConfig,Nt.spaceToBatchNDConfig,Et.sparseFillEmptyRowsConfig,At.sparseReshapeConfig,Rt.sparseSegmentMeanConfig,Ft.sparseSegmentSumConfig,$t.sparseToDenseConfig,Mt.splitVConfig,Dt.sqrtConfig,Pt.squareConfig,Bt.squaredDifferenceConfig,Lt.stepConfig,zt.stridedSliceConfig,Gt.stringNGramsConfig,Wt.stringSplitConfig,Ut.stringToHashBucketFastConfig,Vt.subConfig,qt.sumConfig,Ht.tanConfig,Kt.tanhConfig,Xt.tileConfig,Yt.topKConfig,Zt.transformConfig,Qt.transposeConfig,Jt.uniqueConfig,en.unpackConfig,tn.unsortedSegmentSumConfig,nn.zerosLikeConfig];for(const e of sn)Object(s.registerKernel)(e)},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/reshape_packed_gpu.js": -/*!********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/reshape_packed_gpu.js ***! - \********************************************************************************/ -/*! exports provided: ReshapePackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ReshapePackedProgram",(function(){return o}));var s=n(/*! ./shader_compiler_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js"); +const r=Object(o.createUnaryKernelConfig)(s.Rsqrt)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ScatterNd.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ScatterNd.js ***! + \******************************************************************************/ +/*! exports provided: scatterNdConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"scatterNdConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); /** * @license - * Copyright 2018 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -11232,14 +11219,15 @@ const sn=[Ee.LRNConfig,Ae.LRNGradConfig,o._fusedMatMulConfig,r.absConfig,i.acosC * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */class o{constructor(e,t){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=e;let n="";for(let e=0;e<4;e++){let t="thisRC = rc;";e%2==1&&(t+="thisRC.z += 1;"),e>1&&(t+="thisRC.y += 1;"),n+=`\n ${t}\n ${e>0?"if(thisRC.y < rows && thisRC.z < cols){":""}\n int flatIndex = getFlatIndex(thisRC);\n\n ivec3 inputRC = inputCoordsFromReshapedOutCoords(flatIndex);\n vec2 inputRCInnerDims = vec2(float(inputRC.y),float(inputRC.z));\n\n result[${e}] =\n getChannel(getA(inputRC.x, inputRC.y, inputRC.z), inputRCInnerDims);\n ${e>0?"}":""}\n `}var o;this.userCode=`\n ${o=t,`\n ivec3 inputCoordsFromReshapedOutCoords(int index) {\n ${s.getLogicalCoordinatesFromFlatIndex(["r","c","d"],o)}\n return ivec3(r, c, d);\n }\n `}\n ${s.getFlatIndexFrom3D(e)}\n\n void main() {\n ivec3 rc = getOutputCoords();\n\n vec4 result = vec4(0.);\n\n ivec3 thisRC;\n int rows = ${e[1]};\n int cols = ${e[2]};\n\n ${n}\n\n setOutput(result);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_backprop_gpu.js": -/*!******************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_backprop_gpu.js ***! - \******************************************************************************************/ -/*! exports provided: ResizeBilinearBackpropProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ResizeBilinearBackpropProgram",(function(){return s})); + */ +let r;const i={kernelName:s.ScatterNd,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.ScatterNd,null,["number","number","number","number","number","number","array","number","number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:i}=e,{indices:a,updates:u}=n,{shape:d}=i,l=t.makeOutput(d,u.dtype);if(0===s.util.sizeFromShape(d))return l;const{sliceRank:c,numUpdates:f,sliceSize:p,strides:m,outputSize:h}=s.scatter_util.calculateShapes(u,a,d),b=t.dataIdMap.get(a.dataId).id,j=t.dataIdMap.get(u.dataId).id,g=new Uint8Array(new Int32Array(m).buffer),w=t.dataIdMap.get(l.dataId).id;return r(b,j,o.CppDType[u.dtype],c,f,p,g,h,w),l}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Select.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Select.js ***! + \***************************************************************************/ +/*! exports provided: selectConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"selectConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license - * Copyright 2018 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -11252,15 +11240,14 @@ const sn=[Ee.LRNConfig,Ae.LRNGradConfig,o._fusedMatMulConfig,r.absConfig,i.acosC * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -class s{constructor(e,t,n){this.variableNames=["dy"],this.outputShape=[],this.outputShape=t;const[,s,o]=t,[,r,i]=e,a=[n&&r>1?s-1:s,n&&i>1?o-1:o],d=[n&&r>1?r-1:r,n&&i>1?i-1:i],u=a[0]/d[0],l=a[1]/d[1],c=1/u,f=1/l,p=2*Math.ceil(c)+2,m=2*Math.ceil(f)+2;this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n int r = coords[1];\n int c = coords[2];\n\n float accumulator = 0.0;\n\n const float heightScale = float(${u});\n const float widthScale = float(${l});\n\n const float invHeightScale = float(${c});\n const float invWidthScale = float(${f});\n\n const int winHeight = int(${p});\n const int winWidth = int(${m});\n\n // Compute bounds for where in dy we will look\n float startRLerp = floor(float(r) * invHeightScale);\n int startDyR = int(startRLerp - float(winHeight / 2));\n\n float startCLerp = floor(float(c) * invWidthScale);\n int startDyC = int(startCLerp - float(winWidth / 2));\n\n // Loop over dy\n for (int dyROffset = 0; dyROffset < winHeight; dyROffset++) {\n int dyR = dyROffset + startDyR;\n\n // Guard against the window exceeding the bounds of dy\n if (dyR < 0 || dyR >= ${r}) {\n continue;\n }\n\n for (int dyCOffset = 0; dyCOffset < winWidth; dyCOffset++) {\n int dyC = dyCOffset + startDyC;\n\n // Guard against the window exceeding the bounds of dy\n if (dyC < 0 || dyC >= ${i}) {\n continue;\n }\n\n float dxR = float(dyR) * heightScale;\n int topDxRIndex = int(floor(dxR));\n int bottomDxRIndex = int(min(ceil(dxR), ${s-1}.0));\n float dxRLerp = dxR - float(topDxRIndex);\n float inverseDxRLerp = 1.0 - dxRLerp;\n\n float dxC = float(dyC) * widthScale;\n int leftDxCIndex = int(floor(dxC));\n int rightDxCIndex = int(min(ceil(dxC), ${o-1}.0));\n float dxCLerp = dxC - float(leftDxCIndex);\n float inverseDxCLerp = 1.0 - dxCLerp;\n\n if (r == topDxRIndex && c == leftDxCIndex) {\n // topLeft\n accumulator +=\n getDy(b, dyR, dyC, d) * inverseDxRLerp * inverseDxCLerp;\n }\n\n if (r == topDxRIndex && c == rightDxCIndex) {\n // topRight\n accumulator += getDy(b, dyR, dyC, d) * inverseDxRLerp * dxCLerp;\n }\n\n if (r == bottomDxRIndex && c == leftDxCIndex) {\n // bottomLeft\n accumulator += getDy(b, dyR, dyC, d) * dxRLerp * inverseDxCLerp;\n }\n\n if (r == bottomDxRIndex && c == rightDxCIndex) {\n // bottomRight\n accumulator += getDy(b, dyR, dyC, d) * dxRLerp * dxCLerp;\n }\n }\n }\n // End loop over dy\n\n setOutput(accumulator);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_gpu.js": -/*!*********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_gpu.js ***! - \*********************************************************************************/ -/*! exports provided: ResizeBilinearProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ResizeBilinearProgram",(function(){return s})); + */let o;const r={kernelName:s.Select,backendName:"wasm",kernelFunc:function(e){const{inputs:t,backend:n}=e,{condition:r,t:i,e:a}=t,u=n.dataIdMap.get(r.dataId).id,d=n.dataIdMap.get(i.dataId).id,l=n.dataIdMap.get(a.dataId).id,c=n.makeOutput(i.shape,i.dtype),f=n.dataIdMap.get(c.dataId).id,p=r.shape.length,m=i.shape.length,h=0===p||p>1||1===m?1:s.util.sizeFromShape(i.shape.slice(1));return o(u,d,l,h,f),c},setupFunc:function(e){o=e.wasm.cwrap("SelectV2",null,["number","number","number","number","number"])}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sigmoid.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sigmoid.js ***! + \****************************************************************************/ +/*! exports provided: sigmoidConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sigmoidConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license - * Copyright 2017 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -11273,12 +11260,11 @@ class s{constructor(e,t,n){this.variableNames=["dy"],this.outputShape=[],this.ou * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -class s{constructor(e,t,n,s,o){this.variableNames=["A"],this.outputShape=[];const[r,i,a,d]=e;this.outputShape=[r,t,n,d];const u=[s&&t>1?i-1:i,s&&n>1?a-1:a],l=[s&&t>1?t-1:t,s&&n>1?n-1:n];let c;c=o?"(vec2(yRC) + vec2(0.5)) * effectiveInputOverOutputRatioRC - vec2(0.5)":"vec2(yRC) * effectiveInputOverOutputRatioRC",this.userCode=`\n const vec2 effectiveInputOverOutputRatioRC = vec2(\n ${u[0]/l[0]},\n ${u[1]/l[1]});\n const vec2 inputShapeRC = vec2(${i}.0, ${a}.0);\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n ivec2 yRC = coords.yz;\n\n // Fractional source index.\n vec2 sourceFracIndexRC = ${c};\n\n // Compute the four integer indices.\n ivec2 sourceFloorRC = ivec2(max(sourceFracIndexRC, vec2(0.0)));\n ivec2 sourceCeilRC = ivec2(\n min(inputShapeRC - 1.0, ceil(sourceFracIndexRC)));\n\n float topLeft = getA(b, sourceFloorRC.x, sourceFloorRC.y, d);\n float bottomLeft = getA(b, sourceCeilRC.x, sourceFloorRC.y, d);\n float topRight = getA(b, sourceFloorRC.x, sourceCeilRC.y, d);\n float bottomRight = getA(b, sourceCeilRC.x, sourceCeilRC.y, d);\n\n vec2 fracRC = sourceFracIndexRC - vec2(sourceFloorRC);\n\n float top = topLeft + (topRight - topLeft) * fracRC.y;\n float bottom = bottomLeft + (bottomRight - bottomLeft) * fracRC.y;\n float newValue = top + (bottom - top) * fracRC.x;\n\n setOutput(newValue);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_packed_gpu.js": -/*!****************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_packed_gpu.js ***! - \****************************************************************************************/ -/*! exports provided: ResizeBilinearPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ResizeBilinearPackedProgram",(function(){return s})); + */let o;const r={kernelName:"Sigmoid",backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.Sigmoid,null,["number","number"])},kernelFunc:function(e){const{backend:t,inputs:{x:n}}=e,r=t.dataIdMap.get(n.dataId).id,i=t.makeOutput(n.shape,n.dtype),a=t.dataIdMap.get(i.dataId).id;return 0===s.util.sizeFromShape(i.shape)||o(r,a),i}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sin.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sin.js ***! + \************************************************************************/ +/*! exports provided: sinConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sinConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); /** * @license * Copyright 2019 Google LLC. All Rights Reserved. @@ -11295,14 +11281,14 @@ class s{constructor(e,t,n,s,o){this.variableNames=["A"],this.outputShape=[];cons * limitations under the License. * ============================================================================= */ -class s{constructor(e,t,n,s,o){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=[];const[r,i,a,d]=e;this.outputShape=[r,t,n,d];const u=[s&&t>1?i-1:i,s&&n>1?a-1:a],l=[s&&t>1?t-1:t,s&&n>1?n-1:n];let c;c=o?"(vec3(yRC) + vec3(0.5)) * effectiveInputOverOutputRatioRC - vec3(0.5)":"vec3(yRC) * effectiveInputOverOutputRatioRC",this.userCode=`\n const vec3 effectiveInputOverOutputRatioRC = vec3(\n ${u[0]/l[0]},\n ${u[1]/l[1]},\n ${u[1]/l[1]});\n const vec3 inputShapeRC = vec3(${i}.0, ${a}.0,\n ${a}.0);\n\n float getAValue(int b, int r, int c, int d) {\n return getChannel(getA(b, r, c, d), vec2(c, d));\n }\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n // Calculate values for next column in yRC.z.\n ivec3 yRC = coords.yzz + ivec3(0, 0, 1);\n\n // Fractional source index.\n vec3 sourceFracIndexRC = ${c};\n\n // Compute the four integer indices.\n ivec3 sourceFloorRC = ivec3(max(sourceFracIndexRC, vec3(0.0)));\n ivec3 sourceCeilRC = ivec3(\n min(inputShapeRC - 1.0, ceil(sourceFracIndexRC)));\n\n // Should we calculate next column and row elements in 2x2 packed cell.\n bool hasNextCol = d < ${d-1};\n bool hasNextRow = coords.z < ${n-1};\n\n // In parallel, construct four corners for all four components in\n // packed 2x2 cell.\n vec4 topLeft = vec4(\n getAValue(b, sourceFloorRC.x, sourceFloorRC.y, d),\n hasNextCol ? getAValue(b, sourceFloorRC.x, sourceFloorRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceFloorRC.x, sourceFloorRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceFloorRC.x, sourceFloorRC.z, d + 1) : 0.0);\n\n vec4 bottomLeft = vec4(\n getAValue(b, sourceCeilRC.x, sourceFloorRC.y, d),\n hasNextCol ? getAValue(b, sourceCeilRC.x, sourceFloorRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceCeilRC.x, sourceFloorRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceCeilRC.x, sourceFloorRC.z, d + 1) : 0.0);\n\n vec4 topRight = vec4(\n getAValue(b, sourceFloorRC.x, sourceCeilRC.y, d),\n hasNextCol ? getAValue(b, sourceFloorRC.x, sourceCeilRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceFloorRC.x, sourceCeilRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceFloorRC.x, sourceCeilRC.z, d + 1) : 0.0);\n\n vec4 bottomRight = vec4(\n getAValue(b, sourceCeilRC.x, sourceCeilRC.y, d),\n hasNextCol ? getAValue(b, sourceCeilRC.x, sourceCeilRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceCeilRC.x, sourceCeilRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceCeilRC.x, sourceCeilRC.z, d + 1) : 0.0);\n\n vec3 fracRC = sourceFracIndexRC - vec3(sourceFloorRC);\n\n vec4 top = mix(topLeft, topRight, fracRC.yyzz);\n vec4 bottom = mix(bottomLeft, bottomRight, fracRC.yyzz);\n vec4 newValue = mix(top, bottom, fracRC.x);\n\n setOutput(newValue);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_backprop_gpu.js": -/*!**************************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_backprop_gpu.js ***! - \**************************************************************************************************/ -/*! exports provided: ResizeNearestNeigborBackpropProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ResizeNearestNeigborBackpropProgram",(function(){return s})); +const r=Object(o.createUnaryKernelConfig)(s.Sin)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Slice.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Slice.js ***! + \**************************************************************************/ +/*! exports provided: slice, sliceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"slice",(function(){return r})),n.d(t,"sliceConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernel_utils/shared.js"); /** * @license - * Copyright 2018 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -11316,14 +11302,14 @@ class s{constructor(e,t,n,s,o){this.variableNames=["A"],this.packedInputs=!0,thi * limitations under the License. * ============================================================================= */ -class s{constructor(e,t,n){this.variableNames=["dy"],this.outputShape=[],this.outputShape=t;const[,s,o]=t,[,r,i]=e,a=[n&&r>1?s-1:s,n&&i>1?o-1:o],d=[n&&r>1?r-1:r,n&&i>1?i-1:i],u=a[0]/d[0],l=a[1]/d[1],c=1/u,f=1/l,p=2*Math.ceil(c)+2,m=2*Math.ceil(f)+2;this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n int r = coords[1];\n int c = coords[2];\n\n float accumulator = 0.0;\n\n const float heightScale = float(${u});\n const float widthScale = float(${l});\n\n const float invHeightScale = float(${c});\n const float invWidthScale = float(${f});\n\n const int winHeight = int(${p});\n const int winWidth = int(${m});\n\n // Compute bounds for where in dy we will look\n float startRLerp = floor(float(r) * invHeightScale);\n int startDyR = int(floor(startRLerp - float(winHeight / 2)));\n\n float startCLerp = floor(float(c) * invWidthScale);\n int startDyC = int(floor(startCLerp - float(winWidth / 2)));\n\n // Loop over dy\n for (int dyROffset = 0; dyROffset < winHeight; dyROffset++) {\n int dyR = dyROffset + startDyR;\n\n // Guard against the window exceeding the bounds of dy\n if (dyR < 0 || dyR >= ${r}) {\n continue;\n }\n\n for (int dyCOffset = 0; dyCOffset < winWidth; dyCOffset++) {\n int dyC = dyCOffset + startDyC;\n\n // Guard against the window exceeding the bounds of dy\n if (dyC < 0 || dyC >= ${i}) {\n continue;\n }\n\n float sourceFracRow =\n float(${a[0]}) *\n (float(dyR) / float(${d[0]}));\n\n float sourceFracCol =\n float(${a[1]}) *\n (float(dyC) / float(${d[1]}));\n\n int sourceNearestRow = int(min(\n float(int(${s}) - 1),\n ${n} ? float(round(sourceFracRow)) :\n float(floor(sourceFracRow))));\n\n int sourceNearestCol = int(min(\n float(int(${o}) - 1),\n ${n} ? float(round(sourceFracCol)) :\n float(floor(sourceFracCol))));\n\n if (r == sourceNearestRow && c == sourceNearestCol) {\n accumulator += getDy(b, dyR, dyC, d);\n }\n }\n }\n // End loop over dy\n\n setOutput(accumulator);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_gpu.js": -/*!*****************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_gpu.js ***! - \*****************************************************************************************/ -/*! exports provided: ResizeNearestNeighborProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ResizeNearestNeighborProgram",(function(){return s})); +function r(e){const{inputs:{x:t},attrs:{begin:n,size:r},backend:i}=e,[a,u]=s.slice_util.parseSliceParams(t,n,r),d=s.slice_util.isSliceContinous(t.shape,a,u),l=i.readSync(t.dataId),c=i.makeOutput(u,t.dtype),f=s.util.computeStrides(t.shape),p=i.dataIdMap.get(c.dataId);if(d){const e=s.slice_util.computeFlatOffset(a,f);if("string"===t.dtype)p.stringBytes=l.slice(e,e+s.util.sizeFromShape(u));else{i.typedArrayFromHeap(c).set(l.subarray(e,e+s.util.sizeFromShape(u)))}return c}if("string"===t.dtype){const e=Object(o.sliceImplCPU)(l,a,u,t.shape,t.dtype);return p.stringBytes=e,c}const m=i.typedArrayFromHeap(c),h=t.shape.length;if(2===h)!function(e,t,n,s,o){let r=0;const i=s[0],a=s[1],u=i+o[0];for(let s=i;s1?i-1:i,s&&n>1?a-1:a],l=[s&&t>1?t-1:t,s&&n>1?n-1:n],c=s?"0.5":"0.0";let f;f=o?"max((vec2(yRC) + vec2(0.5)) * effectiveInputOverOutputRatioRC, vec2(0.0))":"vec2(yRC) * effectiveInputOverOutputRatioRC",this.userCode=`\n const vec2 effectiveInputOverOutputRatioRC = vec2(\n ${u[0]/l[0]},\n ${u[1]/l[1]});\n const vec2 inputShapeRC = vec2(${i}.0, ${a}.0);\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n ivec2 yRC = coords.yz;\n\n // Fractional source index.\n vec2 sourceFracIndexRC = ${f};\n\n // Compute the coordinators of nearest neighbor point.\n ivec2 sourceNearestRC = ivec2(\n min(inputShapeRC - 1.0, floor(sourceFracIndexRC + ${c})));\n float newValue = getA(b, sourceNearestRC.x, sourceNearestRC.y, d);\n\n setOutput(newValue);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_packed_gpu.js": -/*!************************************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_packed_gpu.js ***! - \************************************************************************************************/ -/*! exports provided: ResizeNearestNeighborPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ResizeNearestNeighborPackedProgram",(function(){return s})); + */let o;const r={kernelName:s.Softmax,backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.Softmax,null,["number","number","number","number"])},kernelFunc:function(e){const{backend:t,inputs:{logits:n},attrs:{dim:r}}=e,i=t.dataIdMap.get(n.dataId).id,a=t.makeOutput(n.shape,n.dtype),u=t.dataIdMap.get(a.dataId).id,d=n.shape[r],l=s.util.sizeFromShape(n.shape)/d;return 0===s.util.sizeFromShape(a.shape)||o(i,u,d,l),a}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/SpaceToBatchND.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/SpaceToBatchND.js ***! + \***********************************************************************************/ +/*! exports provided: spaceToBatchNDConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"spaceToBatchNDConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./PadV2 */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/PadV2.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Reshape.js"),i=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Transpose.js");const a={kernelName:s.SpaceToBatchND,backendName:"wasm",kernelFunc: /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2021 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -11358,14 +11343,14 @@ class s{constructor(e,t,n,s,o){this.variableNames=["A"],this.outputShape=[];cons * limitations under the License. * ============================================================================= */ -class s{constructor(e,t,n,s,o){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=[];const[r,i,a,d]=e;this.outputShape=[r,t,n,d];const u=[s&&t>1?i-1:i,s&&n>1?a-1:a],l=[s&&t>1?t-1:t,s&&n>1?n-1:n],c=s?"0.5":"0.0";let f;f=o?"max((vec3(yRC) + vec3(0.5)) * effectiveInputOverOutputRatioRC, vec3(0.0))":"vec3(yRC) * effectiveInputOverOutputRatioRC",this.userCode=`\n const vec3 effectiveInputOverOutputRatioRC = vec3(\n ${u[0]/l[0]},\n ${u[1]/l[1]},\n ${u[1]/l[1]});\n const vec3 inputShapeRC = vec3(${i}.0, ${a}.0,\n ${a}.0);\n\n float getAValue(int b, int r, int c, int d) {\n return getChannel(getA(b, r, c, d), vec2(c, d));\n }\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n // Calculate values for next column in yRC.z.\n ivec3 yRC = coords.yzz + ivec3(0, 0, 1);\n\n // Fractional source index.\n vec3 sourceFracIndexRC = ${f};\n\n // Compute the coordinators of nearest neighbor point.\n ivec3 sourceNearestRC = ivec3(\n min(inputShapeRC - 1.0, floor(sourceFracIndexRC + ${c})));\n\n // Should we calculate next column and row elements in 2x2 packed cell.\n bool hasNextCol = d < ${d-1};\n bool hasNextRow = coords.z < ${n-1};\n\n vec4 newValue = vec4(\n getAValue(b, sourceNearestRC.x, sourceNearestRC.y, d),\n hasNextCol ? getAValue(b, sourceNearestRC.x, sourceNearestRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceNearestRC.x, sourceNearestRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceNearestRC.x, sourceNearestRC.z, d + 1) : 0.0);\n\n setOutput(newValue);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/reverse_gpu.js": -/*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/reverse_gpu.js ***! - \*************************************************************************/ -/*! exports provided: ReverseProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ReverseProgram",(function(){return o}));var s=n(/*! ./shader_compiler */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +function(e){const{inputs:t,backend:n,attrs:a}=e,{x:u}=t,{blockShape:d,paddings:l}=a,c=s.util.sizeFromShape(d),f=[[0,0]];f.push(...l);for(let e=1+d.length;e4)throw new Error(`WebGL backend: Reverse of rank-${n} tensor is not yet supported`);if(this.outputShape=e,1===n)return void(this.userCode=`\n void main() {\n int coord = getOutputCoords();\n setOutput(getX(${e[0]} - coord - 1));\n }\n `);const o=e.map(((n,s)=>(n=>-1!==t.indexOf(n)&&1!==e[n]?`${e[n]} - coords[${n}] - 1`:`coords[${n}]`)(s))).join(","),r=Object(s.getCoordsDataType)(n);this.userCode=`\n void main() {\n ${r} coords = getOutputCoords();\n setOutput(getX(${o}));\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/reverse_packed_gpu.js": -/*!********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/reverse_packed_gpu.js ***! - \********************************************************************************/ -/*! exports provided: ReversePackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ReversePackedProgram",(function(){return r}));var s=n(/*! ./packing_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/packing_util.js"),o=n(/*! ./shader_compiler */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); + */ +function r(e){const{inputs:t,attrs:n,backend:r}=e,{x:i}=t,{numOrSizeSplits:a,axis:u}=n,d=s.util.parseAxisParam(u,i.shape)[0],l=s.backend_util.prepareSplitSize(i,a,d),c=new Array(i.shape.length).fill(0),f=i.shape.slice();return l.map((e=>{const t=[...f];t[d]=e;const n=Object(o.slice)({inputs:{x:i},attrs:{begin:c,size:t},backend:r});return c[d]+=e,n}))}const i={kernelName:s.SplitV,backendName:"wasm",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sqrt.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sqrt.js ***! + \*************************************************************************/ +/*! exports provided: sqrtConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sqrtConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); /** * @license - * Copyright 2019 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -11399,14 +11385,14 @@ class s{constructor(e,t,n,s,o){this.variableNames=["A"],this.packedInputs=!0,thi * limitations under the License. * ============================================================================= */ -class r{constructor(e,t){this.variableNames=["x"],this.packedInputs=!0,this.packedOutput=!0;const n=e.length;if(n>4)throw new Error(`WebGL backend: Reverse of rank-${n} tensor is not yet supported`);this.outputShape=e;const r=Object(s.getChannels)("rc",n),i=`${r[n-1]} + 1 < ${this.outputShape[n-1]}`,a=`${r[n-2]} + 1 < ${this.outputShape[n-2]}`,d=Object(o.getCoordsDataType)(n);function u(n){const s=e.map(((s,o)=>function(n,s){return-1!==t.indexOf(n)&&1!==e[n]?`${e[n]} - ${s[n]} - 1`:`${s[n]}`}(o,n)));return`getChannel(getX(${s.join(",")}), vec2(${s.slice(-2).join(",")}))`}this.userCode=1===n?`\n void main(){\n int rc = getOutputCoords();\n vec4 result = vec4(0.);\n result.r = getChannel(getX(${e[0]} - rc - 1),\n ${e[0]} - rc - 1);\n if(${i}){\n result.g = getChannel(getX(${e[0]} - (rc + 1) - 1),\n ${e[0]} - (rc + 1) - 1);\n }\n setOutput(result);\n }\n `:`\n void main() {\n ${d} rc = getOutputCoords();\n vec4 result = vec4(0.);\n result.r = ${function(e){return u(e)}(r.slice())};\n if(${i}){\n result.g = ${function(e){return e[n-1]="("+e[n-1]+" + 1)",u(e)}(r.slice())};\n }\n if(${a}) {\n result.b = ${function(e){return e[n-2]="("+e[n-2]+" + 1)",u(e)}(r.slice())};\n if(${i}) {\n result.a = ${function(e){return e[n-1]="("+e[n-1]+" + 1)",e[n-2]="("+e[n-2]+" + 1)",u(e)}(r.slice())};\n }\n }\n setOutput(result);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/rotate_gpu.js": -/*!************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/rotate_gpu.js ***! - \************************************************************************/ -/*! exports provided: RotateProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"RotateProgram",(function(){return s})); +const r=Object(o.createUnaryKernelConfig)(s.Sqrt)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Square.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Square.js ***! + \***************************************************************************/ +/*! exports provided: squareConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"squareConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); /** * @license - * Copyright 2020 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -11420,14 +11406,14 @@ class r{constructor(e,t){this.variableNames=["x"],this.packedInputs=!0,this.pack * limitations under the License. * ============================================================================= */ -class s{constructor(e,t){this.variableNames=["Image"],this.outputShape=[],this.customUniforms=[{name:"params",type:"vec4"}];const n=e[1],s=e[2];this.outputShape=e;let o="";o="number"==typeof t?`float outputValue = ${t.toFixed(2)};`:`\n vec3 fill = vec3(${t.join(",")});\n float outputValue = fill[coords[3]];`,this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int x = coords[2];\n int y = coords[1];\n float coordXFloat = (float(x) - params[0]) * params[3] -\n (float(y) - params[1]) * params[2];\n float coordYFloat = (float(x) - params[0]) * params[2] +\n (float(y) - params[1]) * params[3];\n int coordX = int(round(coordXFloat + params[0]));\n int coordY = int(round(coordYFloat + params[1]));\n ${o}\n if(coordX >= 0 && coordX < ${s} && coordY >= 0 && coordY < ${n}) {\n outputValue = getImage(coords[0], coordY, coordX, coords[3]);\n }\n setOutput(outputValue);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/scatter_gpu.js": -/*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/scatter_gpu.js ***! - \*************************************************************************/ -/*! exports provided: ScatterProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ScatterProgram",(function(){return o}));var s=n(/*! ./shader_compiler */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +const r=Object(o.createUnaryKernelConfig)(s.Square)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/SquaredDifference.js": +/*!**************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/SquaredDifference.js ***! + \**************************************************************************************/ +/*! exports provided: squaredDifferenceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"squaredDifferenceConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); /** * @license - * Copyright 2018 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -11440,14 +11426,15 @@ class s{constructor(e,t){this.variableNames=["Image"],this.outputShape=[],this.c * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */class o{constructor(e,t,n,o,r,i,a=!0){this.variableNames=["updates","indices","defaultValue"],this.outputShape=i;const d=Object(s.getCoordsDataType)(r.length),u=Object(s.getCoordsDataType)(i.length);let l="";1===n?l="i":2===n&&(l="i, j");const c=`getIndices(${l})`;let f="";1===o?f="i":2===o&&(f="i, coords[1]");const p=`getUpdates(${f})`,m=t>1?"strides[j]":"strides";this.userCode=`\n ${d} strides = ${d}(${r});\n\n void main() {\n ${u} coords = getOutputCoords();\n float sum = 0.0;\n bool found = false;\n for (int i = 0; i < ${e}; i++) {\n int flattenedIndex = 0;\n for (int j = 0; j < ${t}; j++) {\n int index = round(${c});\n flattenedIndex += index * ${m};\n }\n if (flattenedIndex == coords[0]) {\n sum += ${p};\n found = true;\n }\n }\n setOutput(mix(getDefaultValue(), sum, float(found)));\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/segment_gpu.js": + */ +const r=Object(o.createBinaryKernelConfig)(s.SquaredDifference,!0)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Step.js": /*!*************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/segment_gpu.js ***! + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Step.js ***! \*************************************************************************/ -/*! exports provided: SegmentOpProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"SegmentOpProgram",(function(){return s})); +/*! exports provided: stepConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"stepConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license - * Copyright 2018 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -11460,15 +11447,14 @@ class s{constructor(e,t){this.variableNames=["Image"],this.outputShape=[],this.c * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -class s{constructor(e,t){this.variableNames=["x","segmentIds"];const n=e.windowSize,s=e.batchSize,o=e.inSize,r=e.numSegments,i=r*Math.ceil(o/n);this.outputShape=[s,i];const a=4*Math.floor(n/4),d=n%4,u="\n sumValue += dot(values, segFilter);\n ";let l="";o%n>0&&(l=`\n if (inIdx < 0 || inIdx >= ${o}) {\n return initializationValue;\n }\n `);let c="";o%n>0&&(c=`\n if (inIdx < 0 || inIdx >= ${o}) {\n return -1.0;\n }\n `),this.userCode=`\n const float initializationValue = 0.0;\n\n float getValue(int batch, int inIdx) {\n ${l}\n return getX(batch, inIdx);\n }\n\n float getSegmentIdAtIndex(int inIdx) {\n ${c}\n return getSegmentIds(inIdx);\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = int(floor(float(outIdx) / float(\n ${r})) * float(${n}));\n int currentSeg = int(mod(float(outIdx), float(${r})));\n\n float sumValue = 0.0;\n\n for (int i = 0; i < ${a}; i += 4) {\n int inIdx = inOffset + i;\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n getValue(batch, inIdx + 3)\n );\n\n vec4 segFilter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 2)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 3)) == currentSeg ? 1 : 0\n );\n\n ${u}\n }\n\n int inIdx = inOffset + ${a};\n if (${1===d}) {\n vec4 values = vec4(\n getValue(batch, inIdx),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n int inIdxSeg = int(getSegmentIdAtIndex(inIdx));\n\n vec4 segFilter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n 0,\n 0,\n 0\n );\n\n ${u}\n } else if (${2===d}) {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n initializationValue,\n initializationValue\n );\n\n vec4 segFilter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\n 0,\n 0\n );\n\n ${u}\n } else if (${3===d}) {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n initializationValue\n );\n\n vec4 segFilter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 2)) == currentSeg ? 1 : 0,\n 0\n );\n\n ${u}\n }\n setOutput(sumValue);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/select_gpu.js": -/*!************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/select_gpu.js ***! - \************************************************************************/ -/*! exports provided: SelectProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"SelectProgram",(function(){return o}));var s=n(/*! ./shader_compiler */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); + */let o;const r={kernelName:s.Step,backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.Step,null,["number","number","number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:s}=e,{alpha:r}=s,{x:i}=n,a=t.dataIdMap.get(i.dataId).id,u=t.makeOutput(i.shape,i.dtype),d=t.dataIdMap.get(u.dataId).id;return o(a,r,d),u}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/StridedSlice.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/StridedSlice.js ***! + \*********************************************************************************/ +/*! exports provided: stridedSlice, stridedSliceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"stridedSlice",(function(){return a})),n.d(t,"stridedSliceConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Reshape.js"),r=n(/*! ./Slice */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Slice.js"); /** * @license - * Copyright 2017 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -11481,14 +11467,15 @@ class s{constructor(e,t){this.variableNames=["x","segmentIds"];const n=e.windowS * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */class o{constructor(e,t,n){let o,r;if(this.variableNames=["c","a","b"],this.outputShape=t,n>4)throw Error(`Where for rank ${n} is not yet supported`);if(1===n)r="resRC",o="resRC";else{const n=["resRC.x","resRC.y","resRC.z","resRC.w"],s=[],i=[];for(let o=0;o= 1.0) {\n setOutput(getA(${r}));\n } else {\n setOutput(getB(${r}));\n }\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js": -/*!*****************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js ***! - \*****************************************************************************/ -/*! exports provided: makeShader, getCoordsDataType, getUniformInfoFromShape, squeezeInputInfo */function(e,t,n){"use strict";n.r(t),n.d(t,"makeShader",(function(){return a})),n.d(t,"getCoordsDataType",(function(){return j})),n.d(t,"getUniformInfoFromShape",(function(){return g})),n.d(t,"squeezeInputInfo",(function(){return w}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./glsl_version */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"),r=n(/*! ./shader_compiler_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js"); + */ +let i;function a(e){const{backend:t,inputs:n,attrs:a}=e,{x:u}=n;let{begin:d,end:l,strides:c}=a;null==c&&(c=new Array(d.length));const{beginMask:f,endMask:p,ellipsisMask:m,newAxisMask:h,shrinkAxisMask:b}=a,j=s.backend_util.slice_util.maskToAxes(m);if(j.length>1)throw new Error("Multiple ellipses in slice is not allowed.");if(0!==m&&0!==h)throw new Error("Using both ellipsisMask and newAxisMask is not yet supported.");if(0!==m&&0!==b)throw new Error("Using both ellipsisMask and shrinkAxisMask is not yet supported.");const g=u.shape.length-d.length,w=s.backend_util.slice_util.maskToAxes(h),_=u.shape.slice();w.forEach((e=>{d[e]=0,l[e]=1,_.splice(e,0,1)}));const k=Object(o.reshape)({inputs:{x:u},attrs:{shape:_},backend:t}),{begin:v,end:x,strides:y}=s.backend_util.slice_util.getNormalizedAxes(k.shape,j,g,d,l,c,f,p,m);d=v,l=x,c=y;const O=s.backend_util.slice_util.maskToAxes(b);O.forEach((e=>{l[e]=d[e]+1,c[e]=1}));const I=s.backend_util.slice_util.computeOutShape(d,l,c),C=I.filter(((e,t)=>-1===O.indexOf(t)));if(c.every((e=>1===e))){const e=Object(r.slice)({inputs:{x:k},attrs:{begin:d,size:I},backend:t});t.disposeData(k.dataId);const n=Object(o.reshape)({inputs:{x:e},attrs:{shape:C},backend:t});return t.disposeData(e.dataId),n}const S=t.makeOutput(C,"float32");if(!C.some((e=>0===e))){const e=t.dataIdMap.get(k.dataId).id,n=new Uint8Array(new Int32Array(s.util.computeStrides(k.shape)).buffer),o=new Uint8Array(new Int32Array(d).buffer),r=new Uint8Array(new Int32Array(l).buffer),a=new Uint8Array(new Int32Array(c).buffer),u=new Uint8Array(new Int32Array(C).buffer),f=new Uint8Array(new Int32Array(s.util.computeStrides(C)).buffer),p=t.dataIdMap.get(S.dataId).id;i(e,n,k.shape.length,o,r,a,u,f,C.length,p)}t.disposeData(k.dataId);const T=Object(o.reshape)({inputs:{x:S},attrs:{shape:C},backend:t});return t.disposeData(S.dataId),T}const u={kernelName:s.StridedSlice,backendName:"wasm",setupFunc:function(e){i=e.wasm.cwrap(s.StridedSlice,null,["number","array","number","array","array","array","array","array","number","number"])},kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sub.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sub.js ***! + \************************************************************************/ +/*! exports provided: subConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"subConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); /** * @license - * Copyright 2017 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -11502,14 +11489,14 @@ class s{constructor(e,t){this.variableNames=["x","segmentIds"];const n=e.windowS * limitations under the License. * ============================================================================= */ -const{getBroadcastDims:i}=s.backend_util;function a(e,t,n){const a=[];if(e.forEach((e=>{const t=s.util.sizeFromShape(e.shapeInfo.logicalShape);if(e.shapeInfo.isUniform?a.push(`uniform float ${e.name}${t>1?`[${t}]`:""};`):(a.push(`uniform sampler2D ${e.name};`),a.push(`uniform int offset${e.name};`)),n.enableShapeUniforms){const{uniformShape:t}=g(n.packedInputs,e.shapeInfo.logicalShape,e.shapeInfo.texShape);switch(t.length){case 1:a.push(`uniform int ${e.name}Shape;`);break;case 2:a.push(`uniform ivec2 ${e.name}Shape;`);break;case 3:a.push(`uniform ivec3 ${e.name}Shape;`);break;case 4:a.push(`uniform ivec4 ${e.name}Shape;`)}a.push(`uniform ivec2 ${e.name}TexShape;`)}})),n.enableShapeUniforms){switch(t.logicalShape.length){case 1:a.push("uniform int outShape;");break;case 2:a.push("uniform ivec2 outShape;"),a.push("uniform int outShapeStrides;");break;case 3:a.push("uniform ivec3 outShape;"),a.push("uniform ivec2 outShapeStrides;");break;case 4:a.push("uniform ivec4 outShape;"),a.push("uniform ivec3 outShapeStrides;")}a.push("uniform ivec2 outTexShape;")}n.customUniforms&&n.customUniforms.forEach((e=>{a.push(`uniform ${e.type} ${e.name}${e.arrayIndex?`[${e.arrayIndex}]`:""};`)}));const h=a.join("\n"),b=e.map((e=>function(e,t,n=!1,o){let r="";r+=n?u(e,o):d(e,o);const a=e.shapeInfo.logicalShape,l=t.logicalShape;a.length<=l.length&&(r+=n?function(e,t){const n=e.name,o=n.charAt(0).toUpperCase()+n.slice(1),r="get"+o+"AtOutCoords",a=e.shapeInfo.logicalShape.length,d=t.logicalShape.length,u=i(e.shapeInfo.logicalShape,t.logicalShape),l=j(d),c=d-a;let f;const p=["x","y","z","w","u","v"];f=0===a?"":d<2&&u.length>=1?"coords = 0;":u.map((e=>`coords.${p[e+c]} = 0;`)).join("\n");let m="";m=d<2&&a>0?"coords":e.shapeInfo.logicalShape.map(((e,t)=>`coords.${p[t+c]}`)).join(", ");let h="return outputValue;";const b=1===s.util.sizeFromShape(e.shapeInfo.logicalShape),g=1===s.util.sizeFromShape(t.logicalShape);if(1!==a||b||g){if(b&&!g)h=1===d?"\n return vec4(outputValue.x, outputValue.x, 0., 0.);\n ":"\n return vec4(outputValue.x);\n ";else if(u.length){const e=a-2,t=a-1;u.indexOf(e)>-1&&u.indexOf(t)>-1?h="return vec4(outputValue.x);":u.indexOf(e)>-1?h="return vec4(outputValue.x, outputValue.y, outputValue.x, outputValue.y);":u.indexOf(t)>-1&&(h="return vec4(outputValue.xx, outputValue.zz);")}}else h="\n return vec4(outputValue.xy, outputValue.xy);\n ";return`\n vec4 ${r}() {\n ${l} coords = getOutputCoords();\n ${f}\n vec4 outputValue = get${o}(${m});\n ${h}\n }\n `}(e,t):function(e,t){const n=e.name,o=n.charAt(0).toUpperCase()+n.slice(1),r="get"+o+"AtOutCoords",a=t.texShape,d=e.shapeInfo.texShape,u=e.shapeInfo.logicalShape.length,l=t.logicalShape.length;if(!e.shapeInfo.isUniform&&u===l&&null==e.shapeInfo.flatOffset&&s.util.arraysEqual(d,a))return`\n float ${r}() {\n return sampleTexture(${n}, resultUV);\n }\n `;const c=j(l),f=i(e.shapeInfo.logicalShape,t.logicalShape),p=l-u;let m;const h=["x","y","z","w","u","v"];m=0===u?"":l<2&&f.length>=1?"coords = 0;":f.map((e=>`coords.${h[e+p]} = 0;`)).join("\n");let b="";b=l<2&&u>0?"coords":e.shapeInfo.logicalShape.map(((e,t)=>`coords.${h[t+p]}`)).join(", ");return`\n float ${r}() {\n ${c} coords = getOutputCoords();\n ${m}\n return get${o}(${b});\n }\n `}(e,t));return r}(e,t,n.packedInputs,n.enableShapeUniforms))).join("\n"),w=t.texShape,_=Object(o.getGlslDifferences)(),k=function(e){return`\n float sampleTexture(sampler2D textureSampler, vec2 uv) {\n return ${e.texture2D}(textureSampler, uv).r;\n }\n `}(_);let v,x,y=function(e){return`${e.version}\n precision highp float;\n precision highp int;\n precision highp sampler2D;\n ${e.varyingFs} vec2 resultUV;\n ${e.defineOutput}\n const vec2 halfCR = vec2(0.5, 0.5);\n\n struct ivec5\n {\n int x;\n int y;\n int z;\n int w;\n int u;\n };\n\n struct ivec6\n {\n int x;\n int y;\n int z;\n int w;\n int u;\n int v;\n };\n\n uniform float NAN;\n ${e.defineSpecialNaN}\n ${e.defineSpecialInf}\n ${e.defineRound}\n\n int imod(int x, int y) {\n return x - y * (x / y);\n }\n\n int idiv(int a, int b, float sign) {\n int res = a / b;\n int mod = imod(a, b);\n if (sign < 0. && mod != 0) {\n res -= 1;\n }\n return res;\n }\n\n //Based on the work of Dave Hoskins\n //https://www.shadertoy.com/view/4djSRW\n #define HASHSCALE1 443.8975\n float random(float seed){\n vec2 p = resultUV * seed;\n vec3 p3 = fract(vec3(p.xyx) * HASHSCALE1);\n p3 += dot(p3, p3.yzx + 19.19);\n return fract((p3.x + p3.y) * p3.z);\n }\n\n ${l}\n ${c}\n ${f}\n `}(_);t.isPacked?(v=function(e,t,n){switch(e.length){case 0:return m();case 1:return function(e,t,n){const s=[Math.ceil(t[0]/2),Math.ceil(t[1]/2)];if(1===s[0])return n?"\n int getOutputCoords() {\n return 2 * int(resultUV.x * ceil(float(outTexShape[1]) / 2.0));\n }\n ":`\n int getOutputCoords() {\n return 2 * int(resultUV.x * ${s[1]}.0);\n }\n `;if(1===s[1])return n?"\n int getOutputCoords() {\n return 2 * int(resultUV.y * ceil(float(outTexShape[0]) / 2.0));\n }\n ":`\n int getOutputCoords() {\n return 2 * int(resultUV.y * ${s[0]}.0);\n }\n `;if(n)return"\n int getOutputCoords() {\n ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0));\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(packedTexShape[0], packedTexShape[1]));\n return 2 * (resTexRC.x * packedTexShape[1] + resTexRC.y);\n }\n ";return`\n int getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(${s[0]}, ${s[1]}));\n return 2 * (resTexRC.x * ${s[1]} + resTexRC.y);\n }\n `}(0,t,n);case 2:return function(e,t,n){const o=[Math.ceil(t[0]/2),Math.ceil(t[1]/2)];if(s.util.arraysEqual(e,t))return n?"\n ivec2 getOutputCoords() {\n ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0));\n return 2 * ivec2(resultUV.yx * vec2(packedTexShape[0], packedTexShape[1]));\n }\n ":`\n ivec2 getOutputCoords() {\n return 2 * ivec2(resultUV.yx * vec2(${o[0]}, ${o[1]}));\n }\n `;const r=Math.ceil(e[1]/2);if(n)return"\n ivec2 getOutputCoords() {\n ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0));\n int texelsInLogicalRow = int(ceil(float(outShape[1]) / 2.0));\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(packedTexShape[0], packedTexShape[1]));\n\n int index = resTexRC.x * packedTexShape[1] + resTexRC.y;\n int r = 2 * (index / texelsInLogicalRow);\n int c = imod(index, texelsInLogicalRow) * 2;\n\n return ivec2(r, c);\n }\n ";return`\n ivec2 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(${o[0]}, ${o[1]}));\n\n int index = resTexRC.x * ${o[1]} + resTexRC.y;\n int r = 2 * (index / ${r});\n int c = imod(index, ${r}) * 2;\n\n return ivec2(r, c);\n }\n `}(e,t,n);case 3:return function(e,t,n){if(n)return"\n ivec3 getOutputCoords() {\n ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0));\n int texelsInLogicalRow = int(ceil(float(outShape[2]) / 2.0));\n int texelsInBatch = texelsInLogicalRow * int(ceil(float(outShape[1]) / 2.0));\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(packedTexShape[0], packedTexShape[1]));\n int index = resTexRC.x * packedTexShape[1] + resTexRC.y;\n\n int b = index / texelsInBatch;\n index -= b * texelsInBatch;\n\n int r = 2 * (index / texelsInLogicalRow);\n int c = imod(index, texelsInLogicalRow) * 2;\n\n return ivec3(b, r, c);\n }\n ";const s=[Math.ceil(t[0]/2),Math.ceil(t[1]/2)],o=Math.ceil(e[2]/2),r=o*Math.ceil(e[1]/2);return`\n ivec3 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(${s[0]}, ${s[1]}));\n int index = resTexRC.x * ${s[1]} + resTexRC.y;\n\n int b = index / ${r};\n index -= b * ${r};\n\n int r = 2 * (index / ${o});\n int c = imod(index, ${o}) * 2;\n\n return ivec3(b, r, c);\n }\n `}(e,t,n);default:return function(e,t,n){if(n)return"\n ivec4 getOutputCoords() {\n ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0));\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(packedTexShape[0], packedTexShape[1]));\n int index = resTexRC.x * packedTexShape[1] + resTexRC.y;\n\n int texelsInLogicalRow = int(ceil(float(outShape[3]) / 2.0));\n int texelsInBatch = texelsInLogicalRow * int(ceil(float(outShape[2]) / 2.0));\n int texelsInBatchN = texelsInBatch * outShape[1];\n\n int b2 = index / texelsInBatchN;\n index -= b2 * texelsInBatchN;\n\n int b = index / texelsInBatch;\n index -= b * texelsInBatch;\n\n int r = 2 * (index / texelsInLogicalRow);\n int c = imod(index, texelsInLogicalRow) * 2;\n\n return ivec4(b2, b, r, c);\n }\n ";const s=[Math.ceil(t[0]/2),Math.ceil(t[1]/2)],o=Math.ceil(e[e.length-1]/2),r=o*Math.ceil(e[e.length-2]/2);let i=r,a="",d="b, r, c";for(let t=2;t1&&!s.util.arraysEqual(t,n)&&o.lengthe[t])).join(", ")}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js": -/*!**********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js ***! - \**********************************************************************************/ -/*! exports provided: getLogicalCoordinatesFromFlatIndex, getLogicalCoordinatesFromFlatIndexByUniform, dotify, getFlatIndexFrom3D, ENCODE_FLOAT_SNIPPET */function(e,t,n){"use strict";n.r(t),n.d(t,"getLogicalCoordinatesFromFlatIndex",(function(){return o})),n.d(t,"getLogicalCoordinatesFromFlatIndexByUniform",(function(){return r})),n.d(t,"dotify",(function(){return a})),n.d(t,"getFlatIndexFrom3D",(function(){return d})),n.d(t,"ENCODE_FLOAT_SNIPPET",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +const r=Object(o.createBinaryKernelConfig)(s.Sub,!0)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sum.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sum.js ***! + \************************************************************************/ +/*! exports provided: sumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sumConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./kernel_utils */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/kernel_utils.js"); /** * @license - * Copyright 2018 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -11522,14 +11509,15 @@ const{getBroadcastDims:i}=s.backend_util;function a(e,t,n){const a=[];if(e.forEa * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */function o(e,t,n="index"){const o=s.util.computeStrides(t);return o.map(((t,s)=>`${`int ${e[s]} = ${n} / ${t}`}; ${s===o.length-1?`int ${e[s+1]} = ${n} - ${e[s]} * ${t}`:`index -= ${e[s]} * ${t}`};`)).join("")}function r(e,t,n="index"){const o=s.util.computeStrides(t);return o.map(((t,s)=>`${`int ${e[s]} = ${n} / outShapeStrides[${s}]`}; ${s===o.length-1?`int ${e[s+1]} = ${n} - ${e[s]} * outShapeStrides[${s}]`:`index -= ${e[s]} * outShapeStrides[${s}]`};`)).join("")}function i(e){return 1===e.length?`${e[0]}`:`vec${e.length}(${e.join(",")})`}function a(e,t){if(e.length!==t.length)throw new Error(`Vectors to be dotted must be of the same length -got ${e.length} and ${t.length}`);const n=[],s=Math.floor(e.length/4),o=e.length%4;for(let o=0;o`float(${e})`)),r=r.map((e=>`float(${e})`))),n.push(`${i(o)}, ${i(r)}`)}return n.map(((e,t)=>`dot(${e})`)).join("+")}function d(e){const t=s.util.computeStrides(e).map((e=>e.toString()));return`\n int getFlatIndex(ivec3 coords) {\n return coords.x * ${t[0]} + coords.y * ${t[1]} + coords.z;\n }\n`}const u="\n const float FLOAT_MAX = 1.70141184e38;\n const float FLOAT_MIN = 1.17549435e-38;\n\n lowp vec4 encode_float(highp float v) {\n if (isnan(v)) {\n return vec4(255, 255, 255, 255);\n }\n\n highp float av = abs(v);\n\n if(av < FLOAT_MIN) {\n return vec4(0.0, 0.0, 0.0, 0.0);\n } else if(v > FLOAT_MAX) {\n return vec4(0.0, 0.0, 128.0, 127.0) / 255.0;\n } else if(v < -FLOAT_MAX) {\n return vec4(0.0, 0.0, 128.0, 255.0) / 255.0;\n }\n\n highp vec4 c = vec4(0,0,0,0);\n\n highp float e = floor(log2(av));\n highp float m = exp2(fract(log2(av))) - 1.0;\n\n c[2] = floor(128.0 * m);\n m -= c[2] / 128.0;\n c[1] = floor(32768.0 * m);\n m -= c[1] / 32768.0;\n c[0] = floor(8388608.0 * m);\n\n highp float ebias = e + 127.0;\n c[3] = floor(ebias / 2.0);\n ebias -= c[3] * 2.0;\n c[2] += floor(ebias) * 128.0;\n\n c[3] += 128.0 * step(0.0, -v);\n\n return c / 255.0;\n }\n"},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/slice_gpu.js": -/*!***********************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/slice_gpu.js ***! - \***********************************************************************/ -/*! exports provided: SliceProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"SliceProgram",(function(){return o}));var s=n(/*! ./shader_compiler */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); + */ +let r;const i={kernelName:s.Sum,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.Sum,null,["number, number, number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:i}=e,{axis:a,keepDims:u}=i,{x:d}=n,l=t.dataIdMap.get(d.dataId).id;let c=l,f=d;const{transposed:p,axes:m,originalAxes:h,inputWasTransposed:b}=Object(o.permuteAxesAndTranspose)(d,a,t);let j=m;if(b){const e=t.dataIdMap.get(p.dataId).id;e!==l&&(f=p,c=e,j=s.backend_util.getInnerMostAxes(j.length,f.shape.length))}s.backend_util.assertAxesAreInnerMostDims("sum",j,f.shape.length);const[g,w]=s.backend_util.computeOutAndReduceShapes(f.shape,j),_=s.util.sizeFromShape(w),k=t.makeOutput(g,f.dtype);if(0!==s.util.sizeFromShape(f.shape)){const e=t.dataIdMap.get(k.dataId).id;r(c,_,e)}if(b&&t.disposeData(p.dataId),u){const e=s.backend_util.expandShapeToKeepDim(k.shape,h);k.shape=e}return k}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Tan.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Tan.js ***! + \************************************************************************/ +/*! exports provided: tanConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"tanConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); /** * @license - * Copyright 2017 Google LLC. All Rights Reserved. + * Copyright 2021 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -11542,11 +11530,12 @@ const{getBroadcastDims:i}=s.backend_util;function a(e,t,n){const a=[];if(e.forEa * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */class o{constructor(e){this.variableNames=["source"],this.outputShape=e,this.rank=e.length;const t=Object(s.getCoordsDataType)(this.rank);this.customUniforms=[{name:"start",arrayIndex:this.rank,type:"int"}];const n=function(e){if(1===e)return"sourceLoc";if(e<=6)return r.slice(0,e).map((e=>"sourceLoc."+e)).join(",");throw Error(`Slicing for rank ${e} is not yet supported`)}(this.rank);let o;o=`\n ${t} sourceLoc;\n ${t} coords = getOutputCoords();\n ${e.map(((e,t)=>`sourceLoc.${r[t]} = start[${t}] + coords.${r[t]};`)).join("\n")}\n `,this.userCode=`\n void main() {\n ${o}\n setOutput(getSource(${n}));\n }\n `}}const r=["x","y","z","w","u","v"]},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/slice_packed_gpu.js": -/*!******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/slice_packed_gpu.js ***! - \******************************************************************************/ -/*! exports provided: SlicePackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"SlicePackedProgram",(function(){return r}));var s=n(/*! ./packing_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/packing_util.js"),o=n(/*! ./shader_compiler */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); + */ +const r=Object(o.createUnaryKernelConfig)(s.Tan)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Tanh.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Tanh.js ***! + \*************************************************************************/ +/*! exports provided: tanhConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"tanhConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); /** * @license * Copyright 2019 Google LLC. All Rights Reserved. @@ -11563,14 +11552,14 @@ const{getBroadcastDims:i}=s.backend_util;function a(e,t,n){const a=[];if(e.forEa * limitations under the License. * ============================================================================= */ -class r{constructor(e){this.variableNames=["source"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=e,this.rank=e.length,this.customUniforms=[{name:"start",arrayIndex:this.rank,type:"int"}];const t=Object(o.getCoordsDataType)(this.rank),n=Object(s.getChannels)("coords",this.rank),r=Object(s.getChannels)("sourceLoc",this.rank),i=1===this.rank?"sourceLoc":`vec2(${r.slice(-2).join()})`,a=`getChannel(getSource(${r.join()}), ${i})`,d=`\n result.x = ${a};\n if (++${n[this.rank-1]} < ${e[this.rank-1]}) {\n ++${r[this.rank-1]};\n result.y = ${a};\n --${r[this.rank-1]};\n }\n `,u=1===this.rank?"":`\n --${n[this.rank-1]};\n if (++${n[this.rank-2]} < ${e[this.rank-2]}) {\n ++${r[this.rank-2]};\n result.z = ${a};\n if (++${n[this.rank-1]} < ${e[this.rank-1]}) {\n ++${r[this.rank-1]};\n result.w = ${a};\n }\n }\n `,l=this.rank<=4?`sourceLoc = coords +\n ${t}(${e.map(((e,t)=>`start[${t}]`)).join()});`:e.map(((e,t)=>`${r[t]} = ${n[t]} + start[${t}];`)).join("\n");this.userCode=`\n void main() {\n ${t} coords = getOutputCoords();\n ${t} sourceLoc;\n ${l}\n vec4 result = vec4(0.);\n ${d}\n ${u}\n setOutput(result);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/strided_slice_gpu.js": -/*!*******************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/strided_slice_gpu.js ***! - \*******************************************************************************/ -/*! exports provided: StridedSliceProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"StridedSliceProgram",(function(){return o}));var s=n(/*! ./shader_compiler */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +const r=Object(o.createUnaryKernelConfig)(s.Tanh)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Tile.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Tile.js ***! + \*************************************************************************/ +/*! exports provided: tileConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"tileConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); /** * @license - * Copyright 2017 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -11583,14 +11572,15 @@ class r{constructor(e){this.variableNames=["source"],this.packedInputs=!0,this.p * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */class o{constructor(e,t,n){this.variableNames=["x"],this.outputShape=n;const o=n.length,r=Object(s.getCoordsDataType)(n.length),i=Object(s.getCoordsDataType)(n.length);let a="";if(1===o)a="coords * strides + begin";else{let e=0;a=n.map(((t,s)=>(e++,1===n.length?`coords * strides[${s}] + begin[${s}]`:`coords[${e-1}] * strides[${s}] + begin[${s}]`))).join(",")}this.userCode=`\n ${r} begin = ${r}(${e});\n ${r} strides = ${r}(${t});\n\n void main() {\n ${i} coords = getOutputCoords();\n setOutput(getX(${a}));\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/tex_util.js": -/*!**********************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/tex_util.js ***! - \**********************************************************************/ -/*! exports provided: PackingScheme, TextureUsage, PhysicalTextureType, getUnpackedMatrixTextureShapeWidthHeight, getUnpackedArraySizeFromMatrixSize, getColorMatrixTextureShapeWidthHeight, getDenseTexShape, getMatrixSizeFromUnpackedArraySize, decodeMatrixFromUnpackedColorRGBAArray, getPackedMatrixTextureShapeWidthHeight, getPackedRGBAArraySizeFromMatrixShape, getTextureConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"PackingScheme",(function(){return s})),n.d(t,"TextureUsage",(function(){return o})),n.d(t,"PhysicalTextureType",(function(){return r})),n.d(t,"getUnpackedMatrixTextureShapeWidthHeight",(function(){return a})),n.d(t,"getUnpackedArraySizeFromMatrixSize",(function(){return d})),n.d(t,"getColorMatrixTextureShapeWidthHeight",(function(){return u})),n.d(t,"getDenseTexShape",(function(){return l})),n.d(t,"getMatrixSizeFromUnpackedArraySize",(function(){return c})),n.d(t,"decodeMatrixFromUnpackedColorRGBAArray",(function(){return f})),n.d(t,"getPackedMatrixTextureShapeWidthHeight",(function(){return p})),n.d(t,"getPackedRGBAArraySizeFromMatrixShape",(function(){return m})),n.d(t,"getTextureConfig",(function(){return h}));var s,o,r,i=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); + */ +let r;const i={kernelName:s.Tile,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.Tile,null,["number","array","number","array","number","number"])},kernelFunc:function(e){const{inputs:t,backend:n,attrs:s}=e,{x:i}=t,a=n.dataIdMap.get(i.dataId).id,{reps:u}=s,d=new Array(i.shape.length);for(let e=0;e= ${s}`);let o=0;for(let s=0;s{const{x:s}=e,{k:i,sorted:a}=n,u=t.dataIdMap.get(s.dataId).id,d=new Uint8Array(new Int32Array(s.shape).buffer),l=s.shape.slice();l[l.length-1]=i;const c=t.makeOutput(l,s.dtype),f=t.dataIdMap.get(c.dataId).id,p=t.makeOutput(l,"int32"),m=t.dataIdMap.get(p.dataId).id;return r(u,d,s.shape.length,o.CppDType[s.dtype],i,a,f,m),[c,p]},a={kernelName:s.TopK,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.TopK,null,["number","array","number","number","number","bool","number","number"])},kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Transform.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Transform.js ***! + \******************************************************************************/ +/*! exports provided: transformConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"transformConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); /** * @license - * Copyright 2017 Google LLC. All Rights Reserved. + * Copyright 2021 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -11623,15 +11614,14 @@ class r{constructor(e){this.variableNames=["source"],this.packedInputs=!0,this.p * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */ -class i{constructor(e){this.gpgpu=e,this.numUsedTextures=0,this.numFreeTextures=0,this._numBytesAllocated=0,this._numBytesFree=0,this.freeTextures={},this.logEnabled=!1,this.usedTextures={}}acquireTexture(e,t,n){const s=d(t,n),o=u(e,s,n);o in this.freeTextures||(this.freeTextures[o]=[]),o in this.usedTextures||(this.usedTextures[o]=[]);const i=a(e,s,this.gpgpu.gl,this.gpgpu.textureConfig,n);if(this.freeTextures[o].length>0){this.numFreeTextures--,this.numUsedTextures++,this._numBytesFree-=i,this.log();const e=this.freeTextures[o].shift();return this.usedTextures[o].push(e),e}let l;return s===r.PhysicalTextureType.PACKED_2X2_FLOAT32?l=this.gpgpu.createPackedMatrixTexture(e[0],e[1]):s===r.PhysicalTextureType.PACKED_2X2_FLOAT16?l=this.gpgpu.createFloat16PackedMatrixTexture(e[0],e[1]):s===r.PhysicalTextureType.UNPACKED_FLOAT32?l=this.gpgpu.createFloat32MatrixTexture(e[0],e[1]):s===r.PhysicalTextureType.UNPACKED_FLOAT16?l=this.gpgpu.createFloat16MatrixTexture(e[0],e[1]):s===r.PhysicalTextureType.PACKED_4X1_UNSIGNED_BYTE&&(l=this.gpgpu.createUnsignedBytesMatrixTexture(e[0],e[1])),this.usedTextures[o].push(l),this.numUsedTextures++,this._numBytesAllocated+=i,this.log(),l}releaseTexture(e,t,n,o){if(null==this.freeTextures)return;const r=d(n,o),i=u(t,r,o);i in this.freeTextures||(this.freeTextures[i]=[]);const l=a(t,r,this.gpgpu.gl,this.gpgpu.textureConfig,o),c=Object(s.env)().get("WEBGL_DELETE_TEXTURE_THRESHOLD");-1!==c&&this._numBytesAllocated>c?(this.gpgpu.deleteMatrixTexture(e),this._numBytesAllocated-=l):(this.freeTextures[i].push(e),this.numFreeTextures++,this._numBytesFree+=l),this.numUsedTextures--;const f=this.usedTextures[i],p=f.indexOf(e);if(p<0)throw new Error("Cannot release a texture that was never provided by this texture manager");f.splice(p,1),this.log()}log(){if(!this.logEnabled)return;const e=this.numFreeTextures+this.numUsedTextures;console.log("Free/Used",`${this.numFreeTextures} / ${this.numUsedTextures}`,`(${e})`);const t=this._numBytesFree/this._numBytesAllocated;console.log(`Bytes allocated: ${this._numBytesAllocated}`),console.log(`Bytes unused: ${this._numBytesFree} (${Math.round(100*t)}%)`)}get numBytesAllocated(){return this._numBytesAllocated}get numBytesFree(){return this._numBytesFree}getNumUsedTextures(){return this.numUsedTextures}getNumFreeTextures(){return this.numFreeTextures}dispose(){if(null!=this.freeTextures){for(const e in this.freeTextures)this.freeTextures[e].forEach((e=>{this.gpgpu.deleteMatrixTexture(e)}));for(const e in this.usedTextures)this.usedTextures[e].forEach((e=>{this.gpgpu.deleteMatrixTexture(e)}));this.freeTextures=null,this.usedTextures=null,this.numUsedTextures=0,this.numFreeTextures=0,this._numBytesAllocated=0,this._numBytesFree=0}}}function a(e,t,n,s,i){const a=function(e,t){switch(e){case r.PhysicalTextureType.PACKED_2X2_FLOAT32:return Object(o.getInternalFormatForPackedMatrixTexture)(t);case r.PhysicalTextureType.PACKED_2X2_FLOAT16:return Object(o.getInternalFormatForFloat16PackedMatrixTexture)(t);case r.PhysicalTextureType.UNPACKED_FLOAT32:return Object(o.getInternalFormatForFloat32MatrixTexture)(t);case r.PhysicalTextureType.UNPACKED_FLOAT16:return Object(o.getInternalFormatForFloat16MatrixTexture)(t);case r.PhysicalTextureType.PACKED_4X1_UNSIGNED_BYTE:return Object(o.getInternalFormatForUnsignedBytesMatrixTexture)(t);default:throw new Error(`Unknown physical texture type ${e}`)}}(t,s);let d;if(i){const[t,n]=Object(r.getPackedMatrixTextureShapeWidthHeight)(e[0],e[1]);d=t*n}else{const[t,n]=Object(r.getUnpackedMatrixTextureShapeWidthHeight)(e[0],e[1]);d=t*n}return d*function(e,t){const n=e;if(t===n.R32F)return 4;if(t===n.R16F)return 2;if(t===n.RGBA32F)return 16;if(t===e.RGBA)return 16;if(t===n.RGBA16F)return 8;throw new Error(`Unknown internal format ${t}`)}(n,a)}function d(e,t){if(e===r.TextureUsage.UPLOAD)return r.PhysicalTextureType.PACKED_2X2_FLOAT32;if(e===r.TextureUsage.RENDER||null==e)return function(e){return Object(s.env)().getBool("WEBGL_RENDER_FLOAT32_ENABLED")?e?r.PhysicalTextureType.PACKED_2X2_FLOAT32:r.PhysicalTextureType.UNPACKED_FLOAT32:e?r.PhysicalTextureType.PACKED_2X2_FLOAT16:r.PhysicalTextureType.UNPACKED_FLOAT16}(t);if(e===r.TextureUsage.DOWNLOAD||e===r.TextureUsage.PIXELS)return r.PhysicalTextureType.PACKED_4X1_UNSIGNED_BYTE;throw new Error(`Unknown logical texture type ${e}`)}function u(e,t,n){return`${e[0]}_${e[1]}_${t}_${n}`}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/tile_gpu.js": -/*!**********************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/tile_gpu.js ***! - \**********************************************************************/ -/*! exports provided: TileProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"TileProgram",(function(){return o}));var s=n(/*! ./shader_compiler */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); + */let o;const r={kernelName:s.Transform,backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.Transform,null,["number","number","bool","number","number","number","number","number","number","array","number","number","number","number","number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:r}=e,{image:i,transforms:a}=n,{interpolation:u,fillMode:d,fillValue:l,outputShape:c}=r,[f,p,m,h]=i.shape,[b,j]=null!=c?c:[p,m],g=[f,b,j,h],w=new Uint8Array(new Int32Array(s.util.computeStrides(i.shape)).buffer),_=t.makeOutput(g,i.dtype),k=t.dataIdMap.get(_.dataId).id,v=t.dataIdMap.get(i.dataId).id,x=t.dataIdMap.get(a.dataId).id,y="nearest"===u?1:2;let O;switch(d){case"constant":O=1;break;case"reflect":O=2;break;case"wrap":O=3;break;case"nearest":O=4;break;default:O=1}return o(v,x,a.shape[0]>1,f,b,j,h,m,p,w,i.shape.length-1,y,O,l,k),_}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Transpose.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Transpose.js ***! + \******************************************************************************/ +/*! exports provided: transpose, transposeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"transpose",(function(){return a})),n.d(t,"transposeConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Identity.js"),r=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); /** * @license - * Copyright 2017 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -11644,18 +11634,15 @@ class i{constructor(e){this.gpgpu=e,this.numUsedTextures=0,this.numFreeTextures= * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */class o{constructor(e,t){this.variableNames=["A"];const n=new Array(e.length);for(let s=0;s5)throw Error(`Tile for rank ${t} is not yet supported`);if(1===t)return`imod(resRC, ${e[0]})`;const n=["resRC.x","resRC.y","resRC.z","resRC.w","resRC.u"],s=[];for(let t=0;t= dir;\n bool isGreater = x0 > x1 || (x0 == x1 && i1 > i0);\n if (reverse == isGreater) { // Elements in opposite order of direction\n int iTemp = i0;\n i0 = i1;\n i1 = iTemp;\n }\n if (isFirstInPair) {\n setOutput(float(i0));\n } else {\n setOutput(float(i1));\n }\n }\n "}}class o{constructor(e){this.variableNames=["x","indices"],this.customUniforms=[{name:"n",type:"int"},{name:"firstPass",type:"int"},{name:"k",type:"int"}],this.outputShape=e,this.userCode="\n void main() {\n // Takes max of indices (0, k), (1, k + 1), (2, k + 2) ...\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int elemIdx = coords[1];\n\n // The output size is half of the previous size.\n // If the previous sequence is | | | | _ _ _ _ | | | | _ _ _ _ (k=4),\n // we only need to output the indices at positions |, the indices at\n // positions _ can be thrown away, see Figure5(b) After Phase 2\n // (Merge phase) in the Bitonic Top K paper referenced above.\n // For example, the paper shows we only need to output the orange bars.\n // The output sequence should look like this | | | | | | | |.\n // Because the sequence is halved, to map the output index back\n // to the previous sequence to find the corresponding value,\n // we need to double the index. When we double the index,\n // we basically interpolate a position, so 2i looks like\n // | _ | _ | _ | _ | _ | _ | _. We move the | to the first k position\n // of each 2k positions by - elemIdx % k. E.g. for output at\n // index 4,5,6,7, we want to get the corresponding element at\n // original index 8,9,10,11, for output at index 8,9,10,11,\n // we want to get the corresponding element at original index\n // 16,17,18,19, so on and so forth.\n\n int i = elemIdx < k ? elemIdx : (elemIdx * 2 - imod(elemIdx, k));\n int i0 = firstPass == 1 ? i : int(getIndices(batch, i));\n int i1 = firstPass == 1 ? i + k : int(getIndices(batch, i + k));\n\n float x0 = getX(batch, i0);\n float x1 = i1 < n ? getX(batch, i1) : x0;\n\n setOutput(x0 >= x1 ? float(i0) : float(i1));\n }\n "}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/transform_gpu.js": + */ +let i;function a(e){const{inputs:t,backend:n,attrs:s}=e,[a,u]=function(e,t){const n=[],s=[];for(let o=0;o=e&&(-1===t||s[t]>s[n])&&(t=n);s[t]=e}return[n,s]}(t.x.shape,s.perm);let d=!0;for(let e=0;e len - 1.0) {\n if (len <= 1.0) {\n inCoord = 0.0;\n } else {\n float sz2 = 2.0 * len;\n inCoord -= sz2 * float(int(float(inCoord / sz2)));\n if (inCoord >= len) {\n inCoord = sz2 - inCoord - 1.0;\n }\n }\n }\n return clamp(inCoord, 0.0, len - 1.0);\n } else if (${a} == 3) {\n if (inCoord < 0.0) {\n if (len <= 1.0) {\n inCoord = 0.0;\n } else {\n float sz = len - 1.0;\n inCoord += len * (float(int(float(-inCoord / sz))) + 1.0);\n }\n } else if (inCoord > len - 1.0) {\n if (len <= 1.0) {\n inCoord = 0.0;\n } else {\n float sz = len - 1.0;\n inCoord -= len * float(int(float(inCoord / sz)));\n }\n }\n return clamp(inCoord, 0.0, len - 1.0);\n } else if (${a} == 4) {\n return clamp(outCoord, 0.0, len - 1.0);\n } else {\n return outCoord;\n }\n }\n\n float readWithFillValue(int batch, int coordY, int coordX,\n int channel) {\n float outputValue;\n if (0 <= coordY && coordY < ${e} && 0 <= coordX && coordX < ${t}) {\n outputValue = getImage(batch, coordY, coordX, channel);\n } else {\n outputValue = float(${o});\n }\n return outputValue;\n }\n\n void main() {\n ivec4 coords = getOutputCoords();\n float outputValue;\n int batch = coords[0];\n int x = coords[2];\n int y = coords[1];\n int channel = coords[3];\n float xf = float(x);\n float yf = float(y);\n float a1 = getTransforms(batch, 0);\n float a2 = getTransforms(batch, 1);\n float a3 = getTransforms(batch, 2);\n float b1 = getTransforms(batch, 3);\n float b2 = getTransforms(batch, 4);\n float b3 = getTransforms(batch, 5);\n float c1 = getTransforms(batch, 6);\n float c2 = getTransforms(batch, 7);\n float projection = c1 * xf + c2 * yf + 1.0;\n if (projection == 0.0) {\n outputValue = float(${o});\n } else {\n float inX = (a1 * xf + a2 * yf + a3) / projection;\n float inY = (b1 * xf + b2 * yf + b3) / projection;\n float mapX = mapCoord(inX, float(${t}));\n float mapY = mapCoord(inY, float(${e}));\n\n if (${i} == 1) {\n int coordY = int(round(mapY));\n int coordX = int(round(mapX));\n outputValue = readWithFillValue(batch, coordY, coordX,\n channel);\n } else {\n float yFloor = floor(mapY);\n float xFloor = floor(mapX);\n float yCeil = yFloor + 1.0;\n float xCeil = xFloor + 1.0;\n float valueYFloor = (xCeil - mapX) *\n readWithFillValue(batch, int(yFloor), int(xFloor), channel) +\n (mapX - xFloor) *\n readWithFillValue(batch, int(yFloor), int(xCeil), channel);\n float valueYCeil = (xCeil - mapX) *\n readWithFillValue(batch, int(yCeil), int(xFloor), channel) +\n (mapX - xFloor) *\n readWithFillValue(batch, int(yCeil), int(xCeil), channel);\n outputValue = (yCeil - mapY) * valueYFloor +\n (mapY - yFloor) * valueYCeil;\n }\n }\n setOutput(outputValue);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/transpose_gpu.js": -/*!***************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/transpose_gpu.js ***! - \***************************************************************************/ -/*! exports provided: TransposeProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"TransposeProgram",(function(){return o}));var s=n(/*! ./shader_compiler */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +function(e){const{inputs:t,backend:n,attrs:s}=e,{value:r}=t;let{axis:i}=s;i<0&&(i+=r.shape.length);const a=r.shape[i],u=r.shape.length,d=new Array(u-1);let l=0;for(let e=0;e({dataId:e,dtype:t,shape:d})))}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ZerosLike.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ZerosLike.js ***! + \******************************************************************************/ +/*! exports provided: zerosLikeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"zerosLikeConfig",(function(){return s}));const s={kernelName:n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js").ZerosLike,backendName:"wasm",kernelFunc: /** * @license - * Copyright 2017 Google LLC. All Rights Reserved. + * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -11689,11 +11676,12 @@ class s{constructor(e,t,n,s,o,r){this.variableNames=["Image","Transforms"],this. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */class o{constructor(e,t){this.variableNames=["A"];const n=new Array(e.length);for(let s=0;s6)throw Error(`Transpose for rank ${t} is not yet supported`);const n=["resRC.x","resRC.y","resRC.z","resRC.w","resRC.u","resRC.v"],s=new Array(t);for(let t=0;t6)throw Error(`Packed transpose for rank ${this.rank} is not yet supported.`);const r=Object(o.getCoordsDataType)(this.rank),i=Object(s.getVecChannels)("rc",this.rank),a=new Array(this.rank);for(let e=0;e 0.0 ? 1.0 : float(${e});\n `}const u="return (x >= 0.0) ? x : (exp(x) - 1.0);",l=r+"\n return (x < 0.0) ? 0.0 : x;\n",c=r+"\n return (x < 0.0) ? 0.0 : min(6.0, x);\n",f="return x;",p="return 1.0 / (1.0 + exp(-1.0 * x));"},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_packed_gpu.js": -/*!********************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_packed_gpu.js ***! - \********************************************************************************/ -/*! exports provided: LINEAR, ELU, RELU, RELU6, SIGMOID, UnaryOpPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"LINEAR",(function(){return o})),n.d(t,"ELU",(function(){return r})),n.d(t,"RELU",(function(){return i})),n.d(t,"RELU6",(function(){return a})),n.d(t,"SIGMOID",(function(){return d})),n.d(t,"UnaryOpPackedProgram",(function(){return u}));var s=n(/*! ./gpgpu_math */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/gpgpu_math.js"); + */ +function r(e,t,n){let r;return{kernelName:e,backendName:"wasm",setupFunc:function(t){r=t.wasm.cwrap(e,null,["number","array","number","number","array","number","number","number"])},kernelFunc:function(i){const{backend:a,inputs:u}=i,{a:d,b:l}=u,c=a.dataIdMap.get(d.dataId).id,f=a.dataIdMap.get(l.dataId).id,p=null!=n?n:d.dtype,m=s.backend_util.assertAndGetBroadcastShape(d.shape,l.shape),h=a.makeOutput(m,p);if(0===s.util.sizeFromShape(m))return h;const b=new Uint8Array(new Int32Array(d.shape).buffer),j=new Uint8Array(new Int32Array(l.shape).buffer),g=a.dataIdMap.get(h.dataId).id,w=()=>r(c,b,d.shape.length,f,j,l.shape.length,o.CppDType[d.dtype],g);if(t&&"float32"===d.dtype)return w(),h;const _=s.backend_util.getBroadcastDims(d.shape,m),k=s.backend_util.getBroadcastDims(l.shape,m),v=_.every(((e,t)=>e===t)),x=k.every(((e,t)=>e===t));if(v&&x)return w(),h;throw new Error(`Broadcasting along outer dims is not yet supported for ${d.dtype} ${e}.`)}}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/kernel_utils.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/kernel_utils.js ***! + \*********************************************************************************/ +/*! exports provided: permuteAxesAndTranspose */function(e,t,n){"use strict";n.r(t),n.d(t,"permuteAxesAndTranspose",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Transpose.js"); /** * @license - * Copyright 2018 Google LLC. All Rights Reserved. + * Copyright 2020 Google Inc. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -11750,14 +11739,15 @@ class r{constructor(e,t){this.variableNames=["A"],this.packedInputs=!0,this.pack * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */const o="return x;",r="\n vec4 result;\n\n result.r = (x.r >= 0.0) ? x.r : (exp(x.r) - 1.0);\n result.g = (x.g >= 0.0) ? x.g : (exp(x.g) - 1.0);\n result.b = (x.b >= 0.0) ? x.b : (exp(x.b) - 1.0);\n result.a = (x.a >= 0.0) ? x.a : (exp(x.a) - 1.0);\n\n return result;\n",i="\n vec4 result = x * vec4(greaterThanEqual(x, vec4(0.0)));\n bvec4 isNaN = isnan(x);\n\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n",a="\n vec4 result = min(x, vec4(6.)) * vec4(greaterThanEqual(x, vec4(0.0)));\n bvec4 isNaN = isnan(x);\n\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n",d="return 1.0 / (1.0 + exp(-1.0 * x));";class u{constructor(e,t){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=e,this.enableShapeUniforms=Object(s.useShapeUniforms)(this.outputShape.length),this.userCode=`\n vec4 unaryOperation(vec4 x) {\n ${t}\n }\n\n void main() {\n vec4 x = getAAtOutCoords();\n vec4 y = unaryOperation(x);\n\n setOutput(y);\n }\n `}}},"./node_modules/@tensorflow/tfjs-backend-webgl/dist/unpack_gpu.js": -/*!************************************************************************!*\ - !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/unpack_gpu.js ***! - \************************************************************************/ -/*! exports provided: UnpackProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"UnpackProgram",(function(){return r}));var s=n(/*! ./packing_util */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/packing_util.js"),o=n(/*! ./shader_compiler */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); + */ +function r(e,t,n){const r=e.shape,i=e.shape.length,a=s.util.parseAxisParam(t,r);let u=a;const d=s.backend_util.getAxesPermutation(u,i);let l=null,c=!1;if(null!=d){const t=new Array(i);for(let e=0;ee.getExtension(t)),'Extension "'+t+'" not supported on this browser.')}function l(e,t){const n=R(e,(()=>e.createShader(e.VERTEX_SHADER)),"Unable to create vertex WebGLShader.");if(i(e,(()=>e.shaderSource(n,t))),i(e,(()=>e.compileShader(n))),!1===e.getShaderParameter(n,e.COMPILE_STATUS))throw console.log(e.getShaderInfoLog(n)),new Error("Failed to compile vertex shader.");return n}function c(e,t){const n=R(e,(()=>e.createShader(e.FRAGMENT_SHADER)),"Unable to create fragment WebGLShader.");if(i(e,(()=>e.shaderSource(n,t))),i(e,(()=>e.compileShader(n))),!1===e.getShaderParameter(n,e.COMPILE_STATUS))throw function(e,t){const n=f.exec(t);if(null==n)return console.log(`Couldn't parse line number in error: ${t}`),void console.log(e);const o=+n[1],r=e.split("\n"),i=r.length.toString().length+2,a=r.map(((e,t)=>s.util.rightPad((t+1).toString(),i)+e));let d=0;for(let e=0;ee.createProgram()),"Unable to create WebGLProgram.")}function m(e,t){if(i(e,(()=>e.linkProgram(t))),!1===e.getProgramParameter(t,e.LINK_STATUS))throw console.log(e.getProgramInfoLog(t)),new Error("Failed to link vertex and fragment shaders.")}function h(e,t){if(i(e,(()=>e.validateProgram(t))),!1===e.getProgramParameter(t,e.VALIDATE_STATUS))throw console.log(e.getProgramInfoLog(t)),new Error("Shader program validation failed.")}function b(e,t){const n=R(e,(()=>e.createBuffer()),"Unable to create WebGLBuffer");return i(e,(()=>e.bindBuffer(e.ARRAY_BUFFER,n))),i(e,(()=>e.bufferData(e.ARRAY_BUFFER,t,e.STATIC_DRAW))),n}function j(e,t){const n=R(e,(()=>e.createBuffer()),"Unable to create WebGLBuffer");return i(e,(()=>e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,n))),i(e,(()=>e.bufferData(e.ELEMENT_ARRAY_BUFFER,t,e.STATIC_DRAW))),n}function g(){return 2===Object(s.env)().getNumber("WEBGL_VERSION")?1:4}function w(e){return R(e,(()=>e.createTexture()),"Unable to create WebGLTexture.")}function _(e,t){const n=Object(s.env)().getNumber("WEBGL_MAX_TEXTURE_SIZE");if(e<=0||t<=0){throw new Error("Requested texture size "+`[${e}x${t}]`+" is invalid.")}if(e>n||t>n){throw new Error("Requested texture size "+`[${e}x${t}]`+" greater than WebGL maximum on this browser / GPU "+`[${n}x${n}]`+".")}}function k(e){return R(e,(()=>e.createFramebuffer()),"Unable to create WebGLFramebuffer.")}function v(e,t,n,s,o,r,a){const d=e.getAttribLocation(t,n);return-1!==d&&(i(e,(()=>e.bindBuffer(e.ARRAY_BUFFER,s))),i(e,(()=>e.vertexAttribPointer(d,o,e.FLOAT,!1,r,a))),i(e,(()=>e.enableVertexAttribArray(d))),!0)}function x(e,t,n){F(e,n),i(e,(()=>e.activeTexture(e.TEXTURE0+n))),i(e,(()=>e.bindTexture(e.TEXTURE_2D,t)))}function y(e,t){F(e,t),i(e,(()=>e.activeTexture(e.TEXTURE0+t))),i(e,(()=>e.bindTexture(e.TEXTURE_2D,null)))}function O(e,t,n){return R(e,(()=>e.getUniformLocation(t,n)),'uniform "'+n+'" not present in program.')}function I(e,t,n){return e.getUniformLocation(t,n)}function C(e,t,n,s){i(e,(()=>x(e,t,s))),i(e,(()=>e.uniform1i(n,s)))}function S(e){i(e,(()=>e.bindFramebuffer(e.FRAMEBUFFER,null))),i(e,(()=>e.viewport(0,0,e.canvas.width,e.canvas.height))),i(e,(()=>e.scissor(0,0,e.canvas.width,e.canvas.height)))}function T(e,t,n){i(e,(()=>e.bindFramebuffer(e.FRAMEBUFFER,n))),i(e,(()=>e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,t,0)))}function N(e,t){i(e,(()=>e.bindFramebuffer(e.FRAMEBUFFER,t))),i(e,(()=>e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,null,0)))}function E(e){const t=e.checkFramebufferStatus(e.FRAMEBUFFER);if(t!==e.FRAMEBUFFER_COMPLETE)throw new Error("Error binding framebuffer: "+A(e,t))}function A(e,t){switch(t){case e.FRAMEBUFFER_INCOMPLETE_ATTACHMENT:return"FRAMEBUFFER_INCOMPLETE_ATTACHMENT";case e.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:return"FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT";case e.FRAMEBUFFER_INCOMPLETE_DIMENSIONS:return"FRAMEBUFFER_INCOMPLETE_DIMENSIONS";case e.FRAMEBUFFER_UNSUPPORTED:return"FRAMEBUFFER_UNSUPPORTED";default:return`unknown error ${t}`}}function R(e,t,n){const s=i(e,(()=>t()));if(null==s)throw new Error(n);return s}function F(e,t){const n=e.MAX_COMBINED_TEXTURE_IMAGE_UNITS-1,s=t+e.TEXTURE0;if(sn){throw new Error(`textureUnit must be in ${`[gl.TEXTURE0, gl.TEXTURE${n}]`}.`)}}function $(e,t=2){return s.util.sizeFromShape(e.slice(0,e.length-t))}function M(e){if(0===e.length)throw Error("Cannot get rows and columns of an empty shape array.");return[e.length>1?e[e.length-2]:1,e[e.length-1]]}function D(e){let t=[1,1,1];return 0===e.length||1===e.length&&1===e[0]||(t=[$(e),...M(e)]),t}function P(e,t=!1){let n=Object(s.env)().getNumber("WEBGL_MAX_TEXTURE_SIZE");if(t&&(n*=2,1===(e=e.map(((t,n)=>n>=e.length-2?s.util.nearestLargerEven(e[n]):e[n]))).length&&(e=[2,e[0]])),2!==e.length){const t=s.util.squeezeShape(e);e=t.newShape}let o=s.util.sizeFromShape(e);if(e.length<=1&&o<=n)return[1,o];if(2===e.length&&e[0]<=n&&e[1]<=n)return e;if(3===e.length&&e[0]*e[1]<=n&&e[2]<=n)return[e[0]*e[1],e[2]];if(3===e.length&&e[0]<=n&&e[1]*e[2]<=n)return[e[0],e[1]*e[2]];if(4===e.length&&e[0]*e[1]*e[2]<=n&&e[3]<=n)return[e[0]*e[1]*e[2],e[3]];if(4===e.length&&e[0]<=n&&e[1]*e[2]*e[3]<=n)return[e[0],e[1]*e[2]*e[3]];if(t){const t=$(e);let n=2,r=2;return e.length&&([n,r]=M(e)),o=t*(n/2)*(r/2),s.util.sizeToSquarishShape(o).map((e=>2*e))}return s.util.sizeToSquarishShape(o)}function B(e){return e%2==0}function L(e,t){if(e=e.slice(-2),t=t.slice(-2),s.util.arraysEqual(e,t))return!0;if(!e.length||!t.length)return!0;if(0===e[0]||0===e[1]||0===t[0]||0===t[1])return!0;if(e.length!==t.length){const n=e.slice(-1)[0],s=t.slice(-1)[0];if(n===s)return!0;if(B(n)&&B(s)&&(1===e[0]||1===t[0]))return!0}return e[1]===t[1]&&B(e[0])&&B(t[0])}let z,G;function W(e){if(null==z){const t=Object(o.getWebGLContext)(e);z=t.getParameter(t.MAX_TEXTURE_SIZE)}return z}function U(){z=null}function V(){G=null}function q(e){if(null==G){const t=Object(o.getWebGLContext)(e);G=t.getParameter(t.MAX_TEXTURE_IMAGE_UNITS)}return Math.min(16,G)}function H(e){if(0===e)return 0;let t;const n=Object(o.getWebGLContext)(e);return t=K(n,"EXT_disjoint_timer_query_webgl2")&&2===e?2:K(n,"EXT_disjoint_timer_query")?1:0,t}function K(e,t){return null!=e.getExtension(t)}function X(e){try{if(null!=Object(o.getWebGLContext)(e))return!0}catch(e){return console.log("Error when getting WebGL context: ",e),!1}return!1}function Y(e){if(0===e)return!1;const t=Object(o.getWebGLContext)(e);if(1===e){if(!K(t,"OES_texture_float"))return!1}else if(!K(t,"EXT_color_buffer_float"))return!1;return Q(t)}function Z(e){if(0===e)return!1;const t=Object(o.getWebGLContext)(e);if(1!==e){if(K(t,"EXT_color_buffer_float"))return Q(t);const e="EXT_color_buffer_half_float";if(K(t,e)){const n=t.getExtension(e);return function(e,t){const n=Object(r.getTextureConfig)(e,t),s=e.createTexture();e.bindTexture(e.TEXTURE_2D,s);const o=1,i=1;e.texImage2D(e.TEXTURE_2D,0,n.internalFormatHalfFloat,o,i,0,n.textureFormatFloat,n.textureTypeHalfFloat,null);const a=e.createFramebuffer();e.bindFramebuffer(e.FRAMEBUFFER,a),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,s,0);const d=e.checkFramebufferStatus(e.FRAMEBUFFER)===e.FRAMEBUFFER_COMPLETE;return e.bindTexture(e.TEXTURE_2D,null),e.bindFramebuffer(e.FRAMEBUFFER,null),e.deleteTexture(s),e.deleteFramebuffer(a),d}(t,n)}return!1}if(!K(t,"OES_texture_float"))return!1;if(!K(t,"WEBGL_color_buffer_float"))return!1;return Q(t)}function Q(e){const t=Object(r.getTextureConfig)(e),n=e.createTexture();e.bindTexture(e.TEXTURE_2D,n);e.texImage2D(e.TEXTURE_2D,0,t.internalFormatFloat,1,1,0,t.textureFormatFloat,t.textureTypeFloat,null);const s=e.createFramebuffer();e.bindFramebuffer(e.FRAMEBUFFER,s),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,n,0);const o=e.checkFramebufferStatus(e.FRAMEBUFFER)===e.FRAMEBUFFER_COMPLETE;return e.bindTexture(e.TEXTURE_2D,null),e.bindFramebuffer(e.FRAMEBUFFER,null),e.deleteTexture(n),e.deleteFramebuffer(s),o}function J(e){if(2!==e)return!1;return null!=Object(o.getWebGLContext)(e).fenceSync}function ee(e,t){Array.isArray(e)||(e=[e]),e.forEach((e=>{null!=e&&s.util.assert("complex64"!==e.dtype,(()=>`${t} does not support complex64 tensors in the WebGL backend.`))}))}},"./node_modules/@tensorflow/tfjs-core/dist/backends/backend.js": +const Ve=[r.absConfig,i.addConfig,a.addNConfig,u.allConfig,d.anyConfig,l.argMaxConfig,c.avgPoolConfig,f.batchMatMulConfig,p.batchToSpaceNDConfig,m.castConfig,h.ceilConfig,b.clipByValueConfig,j.concatConfig,g.conv2DConfig,w.conv2DBackpropInputConfig,_.cosConfig,k.coshConfig,v.cropAndResizeConfig,x.cumsumConfig,y.depthToSpaceConfig,O.depthwiseConv2dNativeConfig,I.equalConfig,C.expConfig,S.expandDimsConfig,T.fillConfig,N.flipLeftRightConfig,E.floorConfig,A.floorDivConfig,o.fusedMatMulConfig,R.fusedBatchNormConfig,F.fusedConv2DConfig,M.fusedDepthwiseConv2DConfig,$.gatherNdConfig,D.gatherV2Config,P.greaterConfig,B.greaterEqualConfig,L.identityConfig,z.leakyReluConfig,G.lessConfig,U.lessEqualConfig,W.logConfig,V.logicalAndConfig,q.maxConfig,H.maximumConfig,K.maxPoolConfig,X.meanConfig,Y.minConfig,Z.minimumConfig,Q.mirrorPadConfig,J.multiplyConfig,ee.negConfig,te.nonMaxSuppressionV3Config,ne.nonMaxSuppressionV4Config,se.nonMaxSuppressionV5Config,oe.notEqualConfig,re.oneHotConfig,ie.onesLikeConfig,ae.packConfig,ue.padV2Config,de.powConfig,le.preluConfig,ce.prodConfig,fe.rangeConfig,pe.realDivConfig,me.reluConfig,he.relu6Config,be.reshapeConfig,je.resizeBilinearConfig,ge.reverseConfig,we.rotateWithOffsetConfig,ke.rsqrtConfig,_e.roundConfig,ve.scatterNdConfig,xe.selectConfig,ye.sigmoidConfig,Oe.sinConfig,Ie.sliceConfig,Ce.softmaxConfig,Se.spaceToBatchNDConfig,Te.splitVConfig,Ne.sqrtConfig,Ee.squareConfig,Ae.squaredDifferenceConfig,Re.stepConfig,Fe.stridedSliceConfig,Me.subConfig,$e.sumConfig,De.tanConfig,Pe.tanhConfig,Be.tileConfig,Le.topKConfig,ze.transformConfig,Ge.transposeConfig,Ue.unpackConfig,We.zerosLikeConfig];for(const e of Ve)Object(s.registerKernel)(e)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/version.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/version.js ***! + \********************************************************************/ +/*! exports provided: version */function(e,t,n){"use strict";n.r(t),n.d(t,"version",(function(){return s})); +/** @license See the LICENSE file. */ +const s="3.8.0"},"./node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm-threaded-simd.js": +/*!************************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm-threaded-simd.js ***! + \************************************************************************************************/ +/*! no static exports found */function(e,t,n){(function(t,s,o,r){var i,a=(i=(i="undefined"!=typeof document&&document.currentScript?document.currentScript.src:void 0)||t,function(e){function t(){return F.buffer!=D&&te(F.buffer),P}function a(){return F.buffer!=D&&te(F.buffer),B}function u(){return F.buffer!=D&&te(F.buffer),L}function d(){return F.buffer!=D&&te(F.buffer),z}function l(){return F.buffer!=D&&te(F.buffer),G}var c,f,p="undefined"!=typeof(e=e||{})?e:{};p.ready=new Promise((function(e,t){c=e,f=t}));var m,h={};for(m in p)p.hasOwnProperty(m)&&(h[m]=p[m]);var b=[],j=function(e,t){throw t},g=!1,w=!1,_=!1,k=!1;g="object"==typeof window,w="function"==typeof importScripts,_="object"==typeof s&&"object"==typeof s.versions&&"string"==typeof s.versions.node,k=!g&&!_&&!w;var v=p.ENVIRONMENT_IS_PTHREAD||!1;v&&(D=p.buffer);var x,y,O,I,C,S="";function T(e){return p.locateFile?p.locateFile(e,S):S+e}if(_){var N;S=w?n(/*! path */4).dirname(S)+"/":o+"/",x=function(e,t){return I||(I=n(/*! fs */5)),C||(C=n(/*! path */4)),e=C.normalize(e),I.readFileSync(e,t?null:"utf8")},O=function(e){var t=x(e,!0);return t.buffer||(t=new Uint8Array(t)),W(t.buffer),t},s.argv.length>1&&s.argv[1].replace(/\\/g,"/"),b=s.argv.slice(2),s.on("uncaughtException",(function(e){if(!(e instanceof ln))throw e})),s.on("unhandledRejection",ke),j=function(e){s.exit(e)},p.inspect=function(){return"[Emscripten Module object]"};try{N=n(/*! worker_threads */6)}catch(e){throw console.error('The "worker_threads" module is not supported in this node.js build - perhaps a newer version is needed?'),e}r.Worker=N.Worker}else k?("undefined"!=typeof read&&(x=function(e){return read(e)}),O=function(e){var t;return"function"==typeof readbuffer?new Uint8Array(readbuffer(e)):(W("object"==typeof(t=read(e,"binary"))),t)},"undefined"!=typeof scriptArgs?b=scriptArgs:"undefined"!=typeof arguments&&(b=arguments),"function"==typeof quit&&(j=function(e){quit(e)}),"undefined"!=typeof print&&("undefined"==typeof console&&(console={}),console.log=print,console.warn=console.error="undefined"!=typeof printErr?printErr:print)):(g||w)&&(w?S=self.location.href:"undefined"!=typeof document&&document.currentScript&&(S=document.currentScript.src),"undefined"!=typeof i&&i&&(S=i),S=0!==S.indexOf("blob:")?S.substr(0,S.lastIndexOf("/")+1):"",_?(x=function(e,t){return I||(I=n(/*! fs */5)),C||(C=n(/*! path */4)),e=C.normalize(e),I.readFileSync(e,t?null:"utf8")},O=function(e){var t=x(e,!0);return t.buffer||(t=new Uint8Array(t)),W(t.buffer),t}):(x=function(e){var t=new XMLHttpRequest;return t.open("GET",e,!1),t.send(null),t.responseText},w&&(O=function(e){var t=new XMLHttpRequest;return t.open("GET",e,!1),t.responseType="arraybuffer",t.send(null),new Uint8Array(t.response)}),y=function(e,t,n){var s=new XMLHttpRequest;s.open("GET",e,!0),s.responseType="arraybuffer",s.onload=function(){200==s.status||0==s.status&&s.response?t(s.response):n()},s.onerror=n,s.send(null)}));_&&"undefined"==typeof performance&&(r.performance=n(/*! perf_hooks */7).performance);var E,A=p.print||console.log.bind(console),R=p.printErr||console.warn.bind(console);for(m in h)h.hasOwnProperty(m)&&(p[m]=h[m]);h=null,p.arguments&&(b=p.arguments),p.thisProgram&&p.thisProgram,p.quit&&(j=p.quit),Atomics.load,Atomics.store,Atomics.compareExchange,p.wasmBinary&&(E=p.wasmBinary);var F,M,$=p.noExitRuntime||!0;"object"!=typeof WebAssembly&&ke("no native wasm support detected");var D,P,B,L,z,G,U=!1;function W(e,t){e||ke("Assertion failed: "+t)}function V(e){var t=p["_"+e];return W(t,"Cannot call unknown function "+e+", make sure it is exported"),t}function q(e,t,n,s,o){var r={string:function(e){var t=0;if(null!=e&&0!==e){var n=1+(e.length<<2);Z(e,t=on(n),n)}return t},array:function(e){var t=on(e.length);return J(e,t),t}},i=V(e),a=[],u=0;if(s)for(var d=0;d=s);){var r=e[t++];if(!r)return o;if(128&r){var i=63&e[t++];if(192!=(224&r)){var a=63&e[t++];if((r=224==(240&r)?(15&r)<<12|i<<6|a:(7&r)<<18|i<<12|a<<6|63&e[t++])<65536)o+=String.fromCharCode(r);else{var u=r-65536;o+=String.fromCharCode(55296|u>>10,56320|1023&u)}}else o+=String.fromCharCode((31&r)<<6|i)}else o+=String.fromCharCode(r)}return o}function X(e,t){return e?K(a(),e,t):""}function Y(e,t,n,s){if(!(s>0))return 0;for(var o=n,r=n+s-1,i=0;i=55296&&a<=57343&&(a=65536+((1023&a)<<10)|1023&e.charCodeAt(++i)),a<=127){if(n>=r)break;t[n++]=a}else if(a<=2047){if(n+1>=r)break;t[n++]=192|a>>6,t[n++]=128|63&a}else if(a<=65535){if(n+2>=r)break;t[n++]=224|a>>12,t[n++]=128|a>>6&63,t[n++]=128|63&a}else{if(n+3>=r)break;t[n++]=240|a>>18,t[n++]=128|a>>12&63,t[n++]=128|a>>6&63,t[n++]=128|63&a}}return t[n]=0,n-o}function Z(e,t,n){return Y(e,a(),t,n)}function Q(e){for(var t=0,n=0;n=55296&&s<=57343&&(s=65536+((1023&s)<<10)|1023&e.charCodeAt(++n)),s<=127?++t:t+=s<=2047?2:s<=65535?3:4}return t}function J(e,n){t().set(e,n)}function ee(e,t){return e%t>0&&(e+=t-e%t),e}function te(e){D=e,p.HEAP8=P=new Int8Array(e),p.HEAP16=new Int16Array(e),p.HEAP32=L=new Int32Array(e),p.HEAPU8=B=new Uint8Array(e),p.HEAPU16=new Uint16Array(e),p.HEAPU32=z=new Uint32Array(e),p.HEAPF32=new Float32Array(e),p.HEAPF64=G=new Float64Array(e)}var ne,se=p.INITIAL_MEMORY||16777216;if(v)F=p.wasmMemory,D=p.buffer;else if(p.wasmMemory)F=p.wasmMemory;else if(!((F=new WebAssembly.Memory({initial:se/65536,maximum:32768,shared:!0})).buffer instanceof SharedArrayBuffer))throw R("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag"),_&&console.log("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and also use a recent version)"),Error("bad memory");F&&(D=F.buffer),se=D.byteLength,te(D);var oe=[],re=[],ie=[],ae=[],ue=[];function de(){if(!v){if(p.preRun)for("function"==typeof p.preRun&&(p.preRun=[p.preRun]);p.preRun.length;)me(p.preRun.shift());Re(oe)}}function le(){v||Re(re)}function ce(){v||Re(ie)}function fe(){}function pe(){if(!v){if(p.postRun)for("function"==typeof p.postRun&&(p.postRun=[p.postRun]);p.postRun.length;)he(p.postRun.shift());Re(ue)}}function me(e){oe.unshift(e)}function he(e){ue.unshift(e)}v||re.push({func:function(){Gt()}});var be=0,je=null,ge=null;function we(e){W(!v,"addRunDependency cannot be used in a pthread worker"),be++,p.monitorRunDependencies&&p.monitorRunDependencies(be)}function _e(e){if(be--,p.monitorRunDependencies&&p.monitorRunDependencies(be),0==be&&(null!==je&&(clearInterval(je),je=null),ge)){var t=ge;ge=null,t()}}function ke(e){p.onAbort&&p.onAbort(e),v&&console.error("Pthread aborting at "+(new Error).stack),R(e+=""),U=!0,e="abort("+e+"). Build with -s ASSERTIONS=1 for more info.";var t=new WebAssembly.RuntimeError(e);throw f(t),t}function ve(e,t){return String.prototype.startsWith?e.startsWith(t):0===e.indexOf(t)}p.preloadedImages={},p.preloadedAudios={};var xe="data:application/octet-stream;base64,";function ye(e){return ve(e,xe)}var Oe="file://";function Ie(e){return ve(e,Oe)}var Ce="tfjs-backend-wasm-threaded-simd.wasm";function Se(e){try{if(e==Ce&&E)return new Uint8Array(E);if(O)return O(e);throw"both async and sync fetching of the wasm failed"}catch(e){ke(e)}}function Te(){if(!E&&(g||w)){if("function"==typeof fetch&&!Ie(Ce))return fetch(Ce,{credentials:"same-origin"}).then((function(e){if(!e.ok)throw"failed to load wasm binary file at '"+Ce+"'";return e.arrayBuffer()})).catch((function(){return Se(Ce)}));if(y)return new Promise((function(e,t){y(Ce,(function(t){e(new Uint8Array(t))}),t)}))}return Promise.resolve().then((function(){return Se(Ce)}))}function Ne(){var e={a:zt};function t(e,t){var n=e.exports;if(p.asm=n,ne=p.asm.F,M=t,!v){var s=Be.unusedWorkers.length;Be.unusedWorkers.forEach((function(e){Be.loadWasmModuleToWorker(e,(function(){--s||_e()}))}))}}function n(e){t(e.instance,e.module)}function s(t){return Te().then((function(t){return WebAssembly.instantiate(t,e)})).then(t,(function(e){R("failed to asynchronously prepare wasm: "+e),ke(e)}))}if(v||we(),p.instantiateWasm)try{return p.instantiateWasm(e,t)}catch(e){return R("Module.instantiateWasm callback failed with error: "+e),!1}return(E||"function"!=typeof WebAssembly.instantiateStreaming||ye(Ce)||Ie(Ce)||"function"!=typeof fetch?s(n):fetch(Ce,{credentials:"same-origin"}).then((function(t){return WebAssembly.instantiateStreaming(t,e).then(n,(function(e){return R("wasm streaming compile failed: "+e),R("falling back to ArrayBuffer instantiation"),s(n)}))}))).catch(f),{}}ye(Ce)||(Ce=T(Ce));var Ee={9832:function(){throw"Canceled!"},9850:function(e,t){setTimeout((function(){Zt(e,t)}),0)}};function Ae(){Be.initRuntime()}function Re(e){for(;e.length>0;){var t=e.shift();if("function"!=typeof t){var n=t.func;"number"==typeof n?void 0===t.arg?ne.get(n)():ne.get(n)(t.arg):n(void 0===t.arg?null:t.arg)}else t(p)}}function Fe(e,n){if(e<=0||e>t().length||!0&e||n<0)return-28;if(0==n)return 0;n>=2147483647&&(n=1/0);var s=Atomics.load(u(),dn>>2),o=0;if(s==e&&Atomics.compareExchange(u(),dn>>2,s,0)==s&&(o=1,--n<=0))return 1;var r=Atomics.notify(u(),e>>2,n);if(r>=0)return r+o;throw"Atomics.notify returned an unexpected value "+r}function Me(e){if(v)throw"Internal Error! killThread() can only ever be called from main application thread!";if(!e)throw"Internal Error! Null pthread_ptr in killThread!";u()[e+12>>2]=0;var t=Be.pthreads[e];t.worker.terminate(),Be.freeThreadData(t),Be.runningWorkers.splice(Be.runningWorkers.indexOf(t.worker),1),t.worker.pthread=void 0}function $e(e){if(v)throw"Internal Error! cancelThread() can only ever be called from main application thread!";if(!e)throw"Internal Error! Null pthread_ptr in cancelThread!";Be.pthreads[e].worker.postMessage({cmd:"cancel"})}function De(e){if(v)throw"Internal Error! cleanupThread() can only ever be called from main application thread!";if(!e)throw"Internal Error! Null pthread_ptr in cleanupThread!";var t=Be.pthreads[e];if(t){u()[e+12>>2]=0;var n=t.worker;Be.returnWorkerToPool(n)}}p._emscripten_futex_wake=Fe;var Pe,Be={unusedWorkers:[],runningWorkers:[],initMainThreadBlock:function(){for(var e=Math.min(4,Math.max(1,(navigator.hardwareConcurrency||1)/2)),t=0;t>2]=e;var n=e+152;u()[n>>2]=n;var s=Ut(512);for(t=0;t<128;++t)d()[s/4+t]=0;Atomics.store(d(),e+100>>2,s),Atomics.store(d(),e+40>>2,e),tn(e,!w,1),Yt(e)},initWorker:function(){},pthreads:{},threadExitHandlers:[],setThreadStatus:function(){},runExitHandlers:function(){for(;Be.threadExitHandlers.length>0;)Be.threadExitHandlers.pop()();v&&Ht()&&Kt()},runExitHandlersAndDeinitThread:function(e,t){Atomics.store(d(),e+56>>2,1),Atomics.store(d(),e+60>>2,0),Be.runExitHandlers(),Atomics.store(d(),e+4>>2,t),Atomics.store(d(),e+0>>2,1),Fe(e+0,2147483647),tn(0,0,0)},threadExit:function(e){var t=Ht();t&&(Be.runExitHandlersAndDeinitThread(t,e),v&&postMessage({cmd:"exit"}))},threadCancel:function(){Be.runExitHandlersAndDeinitThread(Ht(),-1),postMessage({cmd:"cancelDone"})},terminateAllThreads:function(){for(var e in Be.pthreads)(s=Be.pthreads[e])&&s.worker&&Be.returnWorkerToPool(s.worker);Be.pthreads={};for(var t=0;t>2];u()[e.threadInfoStruct+100>>2]=0,Wt(t),Wt(e.threadInfoStruct)}e.threadInfoStruct=0,e.allocatedOwnStack&&e.stackBase&&Wt(e.stackBase),e.stackBase=0,e.worker&&(e.worker.pthread=null)}},returnWorkerToPool:function(e){Be.runWithoutMainThreadQueuedCalls((function(){delete Be.pthreads[e.pthread.threadInfoStruct],Be.unusedWorkers.push(e),Be.runningWorkers.splice(Be.runningWorkers.indexOf(e),1),Be.freeThreadData(e.pthread),e.pthread=void 0}))},runWithoutMainThreadQueuedCalls:function(e){u()[un>>2]=0;try{e()}finally{u()[un>>2]=1}},receiveObjectTransfer:function(e){},loadWasmModuleToWorker:function(e,t){e.onmessage=function(n){var s=n.data,o=s.cmd;if(e.pthread&&(Be.currentProxiedOperationCallerThread=e.pthread.threadInfoStruct),s.targetThread&&s.targetThread!=Ht()){var r=Be.pthreads[s.targetThread];return r?r.worker.postMessage(n.data,s.transferList):console.error('Internal error! Worker sent a message "'+o+'" to target pthread '+s.targetThread+", but that thread no longer exists!"),void(Be.currentProxiedOperationCallerThread=void 0)}if("processQueuedMainThreadWork"===o)Xt();else if("spawnThread"===o)$t(n.data);else if("cleanupThread"===o)De(s.thread);else if("killThread"===o)Me(s.thread);else if("cancelThread"===o)$e(s.thread);else if("loaded"===o)e.loaded=!0,t&&t(e),e.runPthread&&(e.runPthread(),delete e.runPthread);else if("print"===o)A("Thread "+s.threadId+": "+s.text);else if("printErr"===o)R("Thread "+s.threadId+": "+s.text);else if("alert"===o)alert("Thread "+s.threadId+": "+s.text);else if("exit"===o)e.pthread&&Atomics.load(d(),e.pthread.threadInfoStruct+64>>2)&&Be.returnWorkerToPool(e);else if("exitProcess"===o)try{fn(s.returnCode)}catch(n){if(n instanceof ln)return;throw n}else"cancelDone"===o?Be.returnWorkerToPool(e):"objectTransfer"===o?Be.receiveObjectTransfer(n.data):"setimmediate"===n.data.target?e.postMessage(n.data):R("worker sent an unknown command "+o);Be.currentProxiedOperationCallerThread=void 0},e.onerror=function(e){R("pthread sent an error! "+e.filename+":"+e.lineno+": "+e.message)},_&&(e.on("message",(function(t){e.onmessage({data:t})})),e.on("error",(function(t){e.onerror(t)})),e.on("exit",(function(e){}))),e.postMessage({cmd:"load",urlOrBlob:p.mainScriptUrlOrBlob||i,wasmMemory:F,wasmModule:M})},allocateUnusedWorker:function(){var e=T("tfjs-backend-wasm-threaded-simd.worker.js");Be.unusedWorkers.push(new Worker(e))},getNewWorker:function(){return 0==Be.unusedWorkers.length&&(Be.allocateUnusedWorker(),Be.loadWasmModuleToWorker(Be.unusedWorkers[0])),Be.unusedWorkers.length>0?Be.unusedWorkers.pop():null},busySpinWait:function(e){for(var t=performance.now()+e;performance.now()>2]=e,e}function qe(e,t){if(v)return et(1,1,e,t)}function He(e,t){if(e==t)postMessage({cmd:"processQueuedMainThreadWork"});else if(v)postMessage({targetThread:e,cmd:"processThreadQueue"});else{var n=Be.pthreads[e],s=n&&n.worker;if(!s)return;s.postMessage({cmd:"processThreadQueue"})}return 1}function Ke(){ke()}function Xe(e,t,n){var s=st(t,n);return Ee[e].apply(null,s)}function Ye(e,t){}function Ze(e,n,s){if(e<=0||e>t().length||!0&e)return-28;if(g){if(Atomics.load(u(),e>>2)!=n)return-6;var o=performance.now(),r=o+s;for(Atomics.exchange(u(),dn>>2,e);;){if((o=performance.now())>r)return Atomics.exchange(u(),dn>>2,0),-73;if(0==Atomics.exchange(u(),dn>>2,0))break;if(Xt(),Atomics.load(u(),e>>2)!=n)return-6;Atomics.exchange(u(),dn>>2,e)}return 0}var i=Atomics.wait(u(),e>>2,n,s);if("timed-out"===i)return-73;if("not-equal"===i)return-6;if("ok"===i)return 0;throw"Atomics.wait returned an unexpected value "+i}function Qe(e,t,n){a().copyWithin(e,t,t+n)}function Je(){return _?n(/*! os */8).cpus().length:navigator.hardwareConcurrency}function et(e,t){for(var n=arguments.length-2,s=nn(),o=n,r=on(8*o),i=r>>3,a=0;a>=2;n=a()[e++];){var s=n<105;s&&1&t&&t++,nt.push(s?l()[t++>>1]:u()[t]),++t}return nt}function ot(e,t,n){tt.length=t;for(var s=n>>3,o=0;o>>16),te(F.buffer),1}catch(e){}}function at(e){var t=rt();if(e<=t)return!1;var n=2147483648;if(e>n)return!1;for(var s=1;s<=4;s*=2){var o=t*(1+.2/s);if(o=Math.min(o,e+100663296),it(Math.min(n,ee(Math.max(e,o),65536))))return!0}return!1}var ut={inEventHandler:0,removeAllEventListeners:function(){for(var e=ut.eventHandlers.length-1;e>=0;--e)ut._removeHandler(e);ut.eventHandlers=[],ut.deferredCalls=[]},registerRemoveEventListeners:function(){ut.removeEventListenersRegistered||(ae.push(ut.removeAllEventListeners),ut.removeEventListenersRegistered=!0)},deferredCalls:[],deferCall:function(e,t,n){function s(e,t){if(e.length!=t.length)return!1;for(var n in e)if(e[n]!=t[n])return!1;return!0}for(var o in ut.deferredCalls){var r=ut.deferredCalls[o];if(r.targetFunction==e&&s(r.argsList,n))return}ut.deferredCalls.push({targetFunction:e,precedence:t,argsList:n}),ut.deferredCalls.sort((function(e,t){return e.precedence>2]=n,u()[i+4>>2]=s,u()[i+8>>2]=o,en(0,e,637534208,t,s,i),sn(r)},getTargetThreadForEventCallback:function(e){switch(e){case 1:return 0;case 2:return Be.currentProxiedOperationCallerThread;default:return e}},getNodeNameForTarget:function(e){return e?e==window?"#window":e==screen?"#screen":e&&e.nodeName?e.nodeName:"":""},fullscreenEnabled:function(){return document.fullscreenEnabled||document.webkitFullscreenEnabled}};function dt(e){var t=Q(e)+1,n=Ut(t);return Z(e,n,t),n}function lt(e,t,n,s){var o=nn(),r=on(12),i=0;t&&(i=dt(t)),u()[r>>2]=i,u()[r+4>>2]=n,u()[r+8>>2]=s,en(0,e,657457152,0,i,r),sn(o)}function ct(e,t,n,s){lt(e,t=t?X(t):"",n,s)}function ft(e){return e>2?X(e):e}var pt=[0,"undefined"!=typeof document?document:0,"undefined"!=typeof window?window:0];function mt(e){return e=ft(e),pt[e]||("undefined"!=typeof document?document.querySelector(e):void 0)}function ht(e){return mt(e)}function bt(e,t,n){var s=ht(e);if(!s)return-4;if(s.canvasSharedPtr&&(u()[s.canvasSharedPtr>>2]=t,u()[s.canvasSharedPtr+4>>2]=n),!s.offscreenCanvas&&s.controlTransferredOffscreen)return s.canvasSharedPtr?(ct(u()[s.canvasSharedPtr+8>>2],e,t,n),1):-4;s.offscreenCanvas&&(s=s.offscreenCanvas);var o=!1;if(s.GLctxObject&&s.GLctxObject.GLctx){var r=s.GLctxObject.GLctx.getParameter(2978);o=0===r[0]&&0===r[1]&&r[2]===s.width&&r[3]===s.height}return s.width=t,s.height=n,o&&s.GLctxObject.GLctx.viewport(0,0,t,n),0}function jt(e,t,n){return v?et(2,1,e,t,n):bt(e,t,n)}function gt(e,t,n){return ht(e)?bt(e,t,n):jt(e,t,n)}function wt(e){}function _t(e,t){}function kt(e){var t=e.getExtension("ANGLE_instanced_arrays");if(t)return e.vertexAttribDivisor=function(e,n){t.vertexAttribDivisorANGLE(e,n)},e.drawArraysInstanced=function(e,n,s,o){t.drawArraysInstancedANGLE(e,n,s,o)},e.drawElementsInstanced=function(e,n,s,o,r){t.drawElementsInstancedANGLE(e,n,s,o,r)},1}function vt(e){var t=e.getExtension("OES_vertex_array_object");if(t)return e.createVertexArray=function(){return t.createVertexArrayOES()},e.deleteVertexArray=function(e){t.deleteVertexArrayOES(e)},e.bindVertexArray=function(e){t.bindVertexArrayOES(e)},e.isVertexArray=function(e){return t.isVertexArrayOES(e)},1}function xt(e){var t=e.getExtension("WEBGL_draw_buffers");if(t)return e.drawBuffers=function(e,n){t.drawBuffersWEBGL(e,n)},1}function yt(e){return!!(e.multiDrawWebgl=e.getExtension("WEBGL_multi_draw"))}var Ot={counter:1,buffers:[],programs:[],framebuffers:[],renderbuffers:[],textures:[],uniforms:[],shaders:[],vaos:[],contexts:{},offscreenCanvases:{},timerQueriesEXT:[],programInfos:{},stringCache:{},unpackAlignment:4,recordError:function(e){Ot.lastError||(Ot.lastError=e)},getNewId:function(e){for(var t=Ot.counter++,n=e.length;n>2]:-1;o+=X(u()[n+4*r>>2],i<0?void 0:i)}return o},createContext:function(e,t){var n=e.getContext("webgl",t);return n?Ot.registerContext(n,t):0},registerContext:function(e,t){var n=Ut(8);u()[n+4>>2]=Ht();var s={handle:n,attributes:t,version:t.majorVersion,GLctx:e};return e.canvas&&(e.canvas.GLctxObject=s),Ot.contexts[n]=s,("undefined"==typeof t.enableExtensionsByDefault||t.enableExtensionsByDefault)&&Ot.initExtensions(s),n},makeContextCurrent:function(e){return Ot.currentContext=Ot.contexts[e],p.ctx=Tt=Ot.currentContext&&Ot.currentContext.GLctx,!(e&&!Tt)},getContext:function(e){return Ot.contexts[e]},deleteContext:function(e){Ot.currentContext===Ot.contexts[e]&&(Ot.currentContext=null),"object"==typeof ut&&ut.removeAllHandlersOnTarget(Ot.contexts[e].GLctx.canvas),Ot.contexts[e]&&Ot.contexts[e].GLctx.canvas&&(Ot.contexts[e].GLctx.canvas.GLctxObject=void 0),Wt(Ot.contexts[e].handle),Ot.contexts[e]=null},initExtensions:function(e){if(e||(e=Ot.currentContext),!e.initExtensionsDone){e.initExtensionsDone=!0;var t=e.GLctx;kt(t),vt(t),xt(t),t.disjointTimerQueryExt=t.getExtension("EXT_disjoint_timer_query"),yt(t),(t.getSupportedExtensions()||[]).forEach((function(e){e.indexOf("lose_context")<0&&e.indexOf("debug")<0&&t.getExtension(e)}))}},populateUniformTable:function(e){for(var t=Ot.programs[e],n=Ot.programInfos[e]={uniforms:{},maxUniformLength:0,maxAttributeLength:-1,maxUniformBlockNameLength:-1},s=n.uniforms,o=Tt.getProgramParameter(t,35718),r=0;r>2,s=u()[n+6],o={alpha:!!u()[n+0],depth:!!u()[n+1],stencil:!!u()[n+2],antialias:!!u()[n+3],premultipliedAlpha:!!u()[n+4],preserveDrawingBuffer:!!u()[n+5],powerPreference:It[s],failIfMajorPerformanceCaveat:!!u()[n+7],majorVersion:u()[n+8],minorVersion:u()[n+9],enableExtensionsByDefault:u()[n+10],explicitSwapControl:u()[n+11],proxyContextToMainThread:u()[n+12],renderViaOffscreenBackBuffer:u()[n+13]},r=ht(e);return r?o.explicitSwapControl?0:Ot.createContext(r,o):0}function St(e,t){return Ct(e,t)}var Tt,Nt={mappings:{},buffers:[null,[],[]],printChar:function(e,t){var n=Nt.buffers[e];0===t||10===t?((1===e?A:R)(K(n,0)),n.length=0):n.push(t)},varargs:void 0,get:function(){return Nt.varargs+=4,u()[Nt.varargs-4>>2]},getStr:function(e){return X(e)},get64:function(e,t){return e}};function Et(e){return v?et(3,1,e):0}function At(e,t,n,s,o){if(v)return et(4,1,e,t,n,s,o)}function Rt(e,t,n,s){if(v)return et(5,1,e,t,n,s);for(var o=0,r=0;r>2],d=u()[t+(8*r+4)>>2],l=0;l>2]=o,0}function Ft(e){var t=Be.threadExitHandlers.pop();e&&t()}function Mt(e,t){Be.threadExitHandlers.push((function(){ne.get(e)(t)}))}function $t(e){if(v)throw"Internal Error! spawnThread() can only ever be called from main application thread!";var t=Be.getNewWorker();if(void 0!==t.pthread)throw"Internal error!";if(!e.pthread_ptr)throw"Internal error, no pthread ptr!";Be.runningWorkers.push(t);for(var n=Ut(512),s=0;s<128;++s)u()[n+4*s>>2]=0;var o=e.stackBase+e.stackSize,r=Be.pthreads[e.pthread_ptr]={worker:t,stackBase:e.stackBase,stackSize:e.stackSize,allocatedOwnStack:e.allocatedOwnStack,threadInfoStruct:e.pthread_ptr},i=r.threadInfoStruct>>2;Atomics.store(d(),i+16,e.detached),Atomics.store(d(),i+25,n),Atomics.store(d(),i+10,r.threadInfoStruct),Atomics.store(d(),i+20,e.stackSize),Atomics.store(d(),i+19,o),Atomics.store(d(),i+26,e.stackSize),Atomics.store(d(),i+28,o),Atomics.store(d(),i+29,e.detached);var a=qt()+40;Atomics.store(d(),i+43,a),t.pthread=r;var l={cmd:"run",start_routine:e.startRoutine,arg:e.arg,threadInfoStruct:e.pthread_ptr,stackBase:e.stackBase,stackSize:e.stackSize};t.runPthread=function(){l.time=performance.now(),t.postMessage(l,e.transferList)},t.loaded&&(t.runPthread(),delete t.runPthread)}function Dt(e,t,n,s){if("undefined"==typeof SharedArrayBuffer)return R("Current environment does not support SharedArrayBuffer, pthreads are not available!"),6;if(!e)return R("pthread_create called with a null thread pointer!"),28;var o=[];if(v&&0===o.length)return Qt(687865856,e,t,n,s);var r=0,i=0,a=0;t&&-1!=t?(r=u()[t>>2],r+=81920,i=u()[t+8>>2],a=0!==u()[t+12>>2]):r=2097152;var l=0==i;l?i=an(16,r):W((i-=r)>0);for(var c=Ut(228),f=0;f<57;++f)d()[(c>>2)+f]=0;u()[e>>2]=c,u()[c+12>>2]=c;var p=c+152;u()[p>>2]=p;var m={stackBase:i,stackSize:r,allocatedOwnStack:l,detached:a,startRoutine:n,pthread_ptr:c,arg:s,transferList:o};return v?(m.cmd="spawnThread",postMessage(m,o)):$t(m),0}function Pt(e){if(v)return et(6,1,e);switch(e){case 30:return 16384;case 85:return 131072;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:case 80:case 81:case 79:return-1;case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 75:return 16384;case 39:return 1e3;case 89:return 700;case 71:return 256;case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:return"object"==typeof navigator&&navigator.hardwareConcurrency||1}return Ve(28),-1}v||Be.initMainThreadBlock();var Bt,Lt=[null,qe,jt,Et,At,Rt,Pt],zt={e:Ue,r:We,x:He,b:Ke,y:Xe,j:Ye,c:Ze,d:Fe,f:Pe,p:Qe,z:Je,u:ot,q:at,v:gt,i:wt,t:_t,w:St,m:Et,n:At,g:Rt,o:Ae,a:F||p.wasmMemory,k:Ft,l:Mt,h:Dt,s:Pt},Gt=(Ne(),p.___wasm_call_ctors=function(){return(Gt=p.___wasm_call_ctors=p.asm.A).apply(null,arguments)}),Ut=(p._init=function(){return(p._init=p.asm.B).apply(null,arguments)},p._register_tensor=function(){return(p._register_tensor=p.asm.C).apply(null,arguments)},p._dispose_data=function(){return(p._dispose_data=p.asm.D).apply(null,arguments)},p._dispose=function(){return(p._dispose=p.asm.E).apply(null,arguments)},p._Abs=function(){return(p._Abs=p.asm.G).apply(null,arguments)},p._Add=function(){return(p._Add=p.asm.H).apply(null,arguments)},p._AddN=function(){return(p._AddN=p.asm.I).apply(null,arguments)},p._All=function(){return(p._All=p.asm.J).apply(null,arguments)},p._Any=function(){return(p._Any=p.asm.K).apply(null,arguments)},p._ArgMax=function(){return(p._ArgMax=p.asm.L).apply(null,arguments)},p._AvgPool=function(){return(p._AvgPool=p.asm.M).apply(null,arguments)},p._BatchMatMul=function(){return(p._BatchMatMul=p.asm.N).apply(null,arguments)},p._Ceil=function(){return(p._Ceil=p.asm.O).apply(null,arguments)},p._ClipByValue=function(){return(p._ClipByValue=p.asm.P).apply(null,arguments)},p._Conv2D=function(){return(p._Conv2D=p.asm.Q).apply(null,arguments)},p._Conv2DBackpropInput=function(){return(p._Conv2DBackpropInput=p.asm.R).apply(null,arguments)},p._Cos=function(){return(p._Cos=p.asm.S).apply(null,arguments)},p._Cosh=function(){return(p._Cosh=p.asm.T).apply(null,arguments)},p._CropAndResize=function(){return(p._CropAndResize=p.asm.U).apply(null,arguments)},p._Cumsum=function(){return(p._Cumsum=p.asm.V).apply(null,arguments)},p._DepthToSpace=function(){return(p._DepthToSpace=p.asm.W).apply(null,arguments)},p._DepthwiseConv2dNative=function(){return(p._DepthwiseConv2dNative=p.asm.X).apply(null,arguments)},p._Equal=function(){return(p._Equal=p.asm.Y).apply(null,arguments)},p._Exp=function(){return(p._Exp=p.asm.Z).apply(null,arguments)},p._FlipLeftRight=function(){return(p._FlipLeftRight=p.asm._).apply(null,arguments)},p._Floor=function(){return(p._Floor=p.asm.$).apply(null,arguments)},p._FloorDiv=function(){return(p._FloorDiv=p.asm.aa).apply(null,arguments)},p._FusedBatchNorm=function(){return(p._FusedBatchNorm=p.asm.ba).apply(null,arguments)},p._FusedConv2D=function(){return(p._FusedConv2D=p.asm.ca).apply(null,arguments)},p._FusedDepthwiseConv2D=function(){return(p._FusedDepthwiseConv2D=p.asm.da).apply(null,arguments)},p._Gather=function(){return(p._Gather=p.asm.ea).apply(null,arguments)},p._GatherNd=function(){return(p._GatherNd=p.asm.fa).apply(null,arguments)},p._Greater=function(){return(p._Greater=p.asm.ga).apply(null,arguments)},p._GreaterEqual=function(){return(p._GreaterEqual=p.asm.ha).apply(null,arguments)},p._LeakyRelu=function(){return(p._LeakyRelu=p.asm.ia).apply(null,arguments)},p._Less=function(){return(p._Less=p.asm.ja).apply(null,arguments)},p._LessEqual=function(){return(p._LessEqual=p.asm.ka).apply(null,arguments)},p._Log=function(){return(p._Log=p.asm.la).apply(null,arguments)},p._LogicalAnd=function(){return(p._LogicalAnd=p.asm.ma).apply(null,arguments)},p._Max=function(){return(p._Max=p.asm.na).apply(null,arguments)},p._MaxPool=function(){return(p._MaxPool=p.asm.oa).apply(null,arguments)},p._Maximum=function(){return(p._Maximum=p.asm.pa).apply(null,arguments)},p._Mean=function(){return(p._Mean=p.asm.qa).apply(null,arguments)},p._Min=function(){return(p._Min=p.asm.ra).apply(null,arguments)},p._Minimum=function(){return(p._Minimum=p.asm.sa).apply(null,arguments)},p._MirrorPad=function(){return(p._MirrorPad=p.asm.ta).apply(null,arguments)},p._Multiply=function(){return(p._Multiply=p.asm.ua).apply(null,arguments)},p._Neg=function(){return(p._Neg=p.asm.va).apply(null,arguments)},p._NonMaxSuppressionV3=function(){return(p._NonMaxSuppressionV3=p.asm.wa).apply(null,arguments)},p._NonMaxSuppressionV4=function(){return(p._NonMaxSuppressionV4=p.asm.xa).apply(null,arguments)},p._NonMaxSuppressionV5=function(){return(p._NonMaxSuppressionV5=p.asm.ya).apply(null,arguments)},p._NotEqual=function(){return(p._NotEqual=p.asm.za).apply(null,arguments)},p._OneHot=function(){return(p._OneHot=p.asm.Aa).apply(null,arguments)},p._PadV2=function(){return(p._PadV2=p.asm.Ba).apply(null,arguments)},p._Pow=function(){return(p._Pow=p.asm.Ca).apply(null,arguments)},p._Prelu=function(){return(p._Prelu=p.asm.Da).apply(null,arguments)},p._Prod=function(){return(p._Prod=p.asm.Ea).apply(null,arguments)},p._RealDiv=function(){return(p._RealDiv=p.asm.Fa).apply(null,arguments)},p._Relu=function(){return(p._Relu=p.asm.Ga).apply(null,arguments)},p._Relu6=function(){return(p._Relu6=p.asm.Ha).apply(null,arguments)},p._ResizeBilinear=function(){return(p._ResizeBilinear=p.asm.Ia).apply(null,arguments)},p._Reverse=function(){return(p._Reverse=p.asm.Ja).apply(null,arguments)},p._RotateWithOffset=function(){return(p._RotateWithOffset=p.asm.Ka).apply(null,arguments)},p._Round=function(){return(p._Round=p.asm.La).apply(null,arguments)},p._Rsqrt=function(){return(p._Rsqrt=p.asm.Ma).apply(null,arguments)},p._ScatterNd=function(){return(p._ScatterNd=p.asm.Na).apply(null,arguments)},p._SelectV2=function(){return(p._SelectV2=p.asm.Oa).apply(null,arguments)},p._Sigmoid=function(){return(p._Sigmoid=p.asm.Pa).apply(null,arguments)},p._Sin=function(){return(p._Sin=p.asm.Qa).apply(null,arguments)},p._Softmax=function(){return(p._Softmax=p.asm.Ra).apply(null,arguments)},p._Sqrt=function(){return(p._Sqrt=p.asm.Sa).apply(null,arguments)},p._Square=function(){return(p._Square=p.asm.Ta).apply(null,arguments)},p._SquaredDifference=function(){return(p._SquaredDifference=p.asm.Ua).apply(null,arguments)},p._Step=function(){return(p._Step=p.asm.Va).apply(null,arguments)},p._StridedSlice=function(){return(p._StridedSlice=p.asm.Wa).apply(null,arguments)},p._Sub=function(){return(p._Sub=p.asm.Xa).apply(null,arguments)},p._Sum=function(){return(p._Sum=p.asm.Ya).apply(null,arguments)},p._Tan=function(){return(p._Tan=p.asm.Za).apply(null,arguments)},p._Tanh=function(){return(p._Tanh=p.asm._a).apply(null,arguments)},p._Tile=function(){return(p._Tile=p.asm.$a).apply(null,arguments)},p._TopK=function(){return(p._TopK=p.asm.ab).apply(null,arguments)},p._Transform=function(){return(p._Transform=p.asm.bb).apply(null,arguments)},p._Transpose=function(){return(p._Transpose=p.asm.cb).apply(null,arguments)},p.__FusedMatMul=function(){return(p.__FusedMatMul=p.asm.db).apply(null,arguments)},p._malloc=function(){return(Ut=p._malloc=p.asm.eb).apply(null,arguments)}),Wt=p._free=function(){return(Wt=p._free=p.asm.fb).apply(null,arguments)},Vt=p.___errno_location=function(){return(Vt=p.___errno_location=p.asm.gb).apply(null,arguments)},qt=p._emscripten_get_global_libc=function(){return(qt=p._emscripten_get_global_libc=p.asm.hb).apply(null,arguments)},Ht=p._pthread_self=function(){return(Ht=p._pthread_self=p.asm.ib).apply(null,arguments)},Kt=p.___pthread_tsd_run_dtors=function(){return(Kt=p.___pthread_tsd_run_dtors=p.asm.jb).apply(null,arguments)},Xt=p._emscripten_main_thread_process_queued_calls=function(){return(Xt=p._emscripten_main_thread_process_queued_calls=p.asm.kb).apply(null,arguments)},Yt=(p._emscripten_current_thread_process_queued_calls=function(){return(p._emscripten_current_thread_process_queued_calls=p.asm.lb).apply(null,arguments)},p._emscripten_register_main_browser_thread_id=function(){return(Yt=p._emscripten_register_main_browser_thread_id=p.asm.mb).apply(null,arguments)}),Zt=p.__emscripten_do_dispatch_to_thread=function(){return(Zt=p.__emscripten_do_dispatch_to_thread=p.asm.nb).apply(null,arguments)},Qt=p._emscripten_sync_run_in_main_thread_4=function(){return(Qt=p._emscripten_sync_run_in_main_thread_4=p.asm.ob).apply(null,arguments)},Jt=p._emscripten_run_in_main_runtime_thread_js=function(){return(Jt=p._emscripten_run_in_main_runtime_thread_js=p.asm.pb).apply(null,arguments)},en=p.__emscripten_call_on_thread=function(){return(en=p.__emscripten_call_on_thread=p.asm.qb).apply(null,arguments)},tn=(p._emscripten_tls_init=function(){return(p._emscripten_tls_init=p.asm.rb).apply(null,arguments)},p.__emscripten_thread_init=function(){return(tn=p.__emscripten_thread_init=p.asm.sb).apply(null,arguments)}),nn=p.stackSave=function(){return(nn=p.stackSave=p.asm.tb).apply(null,arguments)},sn=p.stackRestore=function(){return(sn=p.stackRestore=p.asm.ub).apply(null,arguments)},on=p.stackAlloc=function(){return(on=p.stackAlloc=p.asm.vb).apply(null,arguments)},rn=p._emscripten_stack_set_limits=function(){return(rn=p._emscripten_stack_set_limits=p.asm.wb).apply(null,arguments)},an=p._memalign=function(){return(an=p._memalign=p.asm.xb).apply(null,arguments)},un=p.__emscripten_allow_main_runtime_queued_calls=9824,dn=p.__emscripten_main_thread_futex=11448;function ln(e){this.name="ExitStatus",this.message="Program terminated with exit("+e+")",this.status=e}function cn(e){if(e=e||b,!(be>0)){if(v)return c(p),le(),void postMessage({cmd:"loaded"});de(),be>0||(p.setStatus?(p.setStatus("Running..."),setTimeout((function(){setTimeout((function(){p.setStatus("")}),1),t()}),1)):t())}function t(){Bt||(Bt=!0,p.calledRun=!0,U||(le(),ce(),c(p),p.onRuntimeInitialized&&p.onRuntimeInitialized(),pe()))}}function fn(e,t){if(!t||!$||0!==e){if(!t&&v)throw postMessage({cmd:"exitProcess",returnCode:e}),new ln(e);$||(Be.terminateAllThreads(),fe(),p.onExit&&p.onExit(e),U=!0),j(e,new ln(e))}}if(p.cwrap=H,p.PThread=Be,p.PThread=Be,p.wasmMemory=F,p.ExitStatus=ln,ge=function e(){Bt||cn(),Bt||(ge=e)},p.run=cn,p.preInit)for("function"==typeof p.preInit&&(p.preInit=[p.preInit]);p.preInit.length>0;)p.preInit.pop()();return v&&($=!1,Be.initWorker()),cn(),e.ready});e.exports=a}).call(this,"/index.js",n(/*! ./../../../process/browser.js */"./node_modules/process/browser.js"),"/",n(/*! ./../../../webpack/buildin/global.js */"./node_modules/webpack/buildin/global.js"))},"./node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm-threaded-simd.worker.js": +/*!*******************************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm-threaded-simd.worker.js ***! + \*******************************************************************************************************/ +/*! exports provided: wasmWorkerContents */function(e,t,n){"use strict";n.r(t),n.d(t,"wasmWorkerContents",(function(){return s}));const s='var Module={};function threadPrintErr(){var text=Array.prototype.slice.call(arguments).join(" ");console.error(text)}function threadAlert(){var text=Array.prototype.slice.call(arguments).join(" ");postMessage({cmd:"alert",text:text,threadId:Module["_pthread_self"]()})}var err=threadPrintErr;this.alert=threadAlert;Module["instantiateWasm"]=function(info,receiveInstance){var instance=new WebAssembly.Instance(Module["wasmModule"],info);Module["wasmModule"]=null;receiveInstance(instance);return instance.exports};function moduleLoaded(){}this.onmessage=function(e){try{if(e.data.cmd==="load"){Module["wasmModule"]=e.data.wasmModule;Module["wasmMemory"]=e.data.wasmMemory;Module["buffer"]=Module["wasmMemory"].buffer;Module["ENVIRONMENT_IS_PTHREAD"]=true;if(typeof e.data.urlOrBlob==="string"){importScripts(e.data.urlOrBlob)}else{var objectUrl=URL.createObjectURL(e.data.urlOrBlob);importScripts(objectUrl);URL.revokeObjectURL(objectUrl)}WasmBackendModuleThreadedSimd(Module).then(function(instance){Module=instance;moduleLoaded()})}else if(e.data.cmd==="objectTransfer"){Module["PThread"].receiveObjectTransfer(e.data)}else if(e.data.cmd==="run"){Module["__performance_now_clock_drift"]=performance.now()-e.data.time;Module["__emscripten_thread_init"](e.data.threadInfoStruct,0,0);var max=e.data.stackBase;var top=e.data.stackBase+e.data.stackSize;Module["establishStackSpace"](top,max);Module["_emscripten_tls_init"]();Module["PThread"].receiveObjectTransfer(e.data);Module["PThread"].setThreadStatus(Module["_pthread_self"](),1);try{var result=Module["invokeEntryPoint"](e.data.start_routine,e.data.arg);if(!Module["getNoExitRuntime"]())Module["PThread"].threadExit(result)}catch(ex){if(ex==="Canceled!"){Module["PThread"].threadCancel()}else if(ex!="unwind"){if(ex instanceof Module["ExitStatus"]){if(Module["getNoExitRuntime"]()){}else{Module["PThread"].threadExit(ex.status)}}else{Module["PThread"].threadExit(-2);throw ex}}}}else if(e.data.cmd==="cancel"){if(Module["_pthread_self"]()){Module["PThread"].threadCancel()}}else if(e.data.target==="setimmediate"){}else if(e.data.cmd==="processThreadQueue"){if(Module["_pthread_self"]()){Module["_emscripten_current_thread_process_queued_calls"]()}}else{err("worker.js received unknown command "+e.data.cmd);err(e.data)}}catch(ex){err("worker.js onmessage() captured an uncaught exception: "+ex);if(ex&&ex.stack)err(ex.stack);throw ex}};if(typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string"){self={location:{href:__filename}};var onmessage=this.onmessage;var nodeWorkerThreads=require("worker_threads");global.Worker=nodeWorkerThreads.Worker;var parentPort=nodeWorkerThreads.parentPort;parentPort.on("message",function(data){onmessage({data:data})});var nodeFS=require("fs");var nodeRead=function(filename){return nodeFS.readFileSync(filename,"utf8")};function globalEval(x){global.require=require;global.Module=Module;eval.call(null,x)}importScripts=function(f){globalEval(nodeRead(f))};postMessage=function(msg){parentPort.postMessage(msg)};if(typeof performance==="undefined"){performance={now:function(){return Date.now()}}}}'},"./node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm.js ***! + \**********************************************************************************/ +/*! no static exports found */function(e,t,n){(function(t,s,o){var r,i=(r=(r="undefined"!=typeof document&&document.currentScript?document.currentScript.src:void 0)||t,function(e){var t,i,a="undefined"!=typeof(e=e||{})?e:{};a.ready=new Promise((function(e,n){t=e,i=n}));var u,d={};for(u in a)a.hasOwnProperty(u)&&(d[u]=a[u]);var l=[],c=!1,f=!1,p=!1,m=!1;c="object"==typeof window,f="function"==typeof importScripts,p="object"==typeof s&&"object"==typeof s.versions&&"string"==typeof s.versions.node,m=!c&&!p&&!f;var h,b,j,g,w,_="";function k(e){return a.locateFile?a.locateFile(e,_):_+e}p?(_=f?n(/*! path */4).dirname(_)+"/":o+"/",h=function(e,t){return g||(g=n(/*! fs */5)),w||(w=n(/*! path */4)),e=w.normalize(e),g.readFileSync(e,t?null:"utf8")},j=function(e){var t=h(e,!0);return t.buffer||(t=new Uint8Array(t)),C(t.buffer),t},s.argv.length>1&&s.argv[1].replace(/\\/g,"/"),l=s.argv.slice(2),s.on("uncaughtException",(function(e){if(!(e instanceof Me))throw e})),s.on("unhandledRejection",re),a.inspect=function(){return"[Emscripten Module object]"}):m?("undefined"!=typeof read&&(h=function(e){return read(e)}),j=function(e){var t;return"function"==typeof readbuffer?new Uint8Array(readbuffer(e)):(C("object"==typeof(t=read(e,"binary"))),t)},"undefined"!=typeof scriptArgs?l=scriptArgs:"undefined"!=typeof arguments&&(l=arguments),"undefined"!=typeof print&&("undefined"==typeof console&&(console={}),console.log=print,console.warn=console.error="undefined"!=typeof printErr?printErr:print)):(c||f)&&(f?_=self.location.href:"undefined"!=typeof document&&document.currentScript&&(_=document.currentScript.src),r&&(_=r),_=0!==_.indexOf("blob:")?_.substr(0,_.lastIndexOf("/")+1):"",h=function(e){var t=new XMLHttpRequest;return t.open("GET",e,!1),t.send(null),t.responseText},f&&(j=function(e){var t=new XMLHttpRequest;return t.open("GET",e,!1),t.responseType="arraybuffer",t.send(null),new Uint8Array(t.response)}),b=function(e,t,n){var s=new XMLHttpRequest;s.open("GET",e,!0),s.responseType="arraybuffer",s.onload=function(){200==s.status||0==s.status&&s.response?t(s.response):n()},s.onerror=n,s.send(null)});var v,x,y=a.print||console.log.bind(console),O=a.printErr||console.warn.bind(console);for(u in d)d.hasOwnProperty(u)&&(a[u]=d[u]);d=null,a.arguments&&(l=a.arguments),a.thisProgram&&a.thisProgram,a.quit&&a.quit,a.wasmBinary&&(v=a.wasmBinary),a.noExitRuntime,"object"!=typeof WebAssembly&&re("no native wasm support detected");var I=!1;function C(e,t){e||re("Assertion failed: "+t)}function S(e){var t=a["_"+e];return C(t,"Cannot call unknown function "+e+", make sure it is exported"),t}function T(e,t,n,s,o){var r={string:function(e){var t=0;if(null!=e&&0!==e){var n=1+(e.length<<2);B(e,t=Fe(n),n)}return t},array:function(e){var t=Fe(e.length);return L(e,t),t}},i=S(e),a=[],u=0;if(s)for(var d=0;d=s);)++o;if(o-t>16&&e.subarray&&M)return M.decode(e.subarray(t,o));for(var r="";t>10,56320|1023&d)}}else r+=String.fromCharCode((31&i)<<6|a)}else r+=String.fromCharCode(i)}return r}function D(e,t){return e?$(R,e,t):""}function P(e,t,n,s){if(!(s>0))return 0;for(var o=n,r=n+s-1,i=0;i=55296&&a<=57343&&(a=65536+((1023&a)<<10)|1023&e.charCodeAt(++i)),a<=127){if(n>=r)break;t[n++]=a}else if(a<=2047){if(n+1>=r)break;t[n++]=192|a>>6,t[n++]=128|63&a}else if(a<=65535){if(n+2>=r)break;t[n++]=224|a>>12,t[n++]=128|a>>6&63,t[n++]=128|63&a}else{if(n+3>=r)break;t[n++]=240|a>>18,t[n++]=128|a>>12&63,t[n++]=128|a>>6&63,t[n++]=128|63&a}}return t[n]=0,n-o}function B(e,t,n){return P(e,R,t,n)}function L(e,t){A.set(e,t)}function z(e,t){return e%t>0&&(e+=t-e%t),e}function G(e){E=e,a.HEAP8=A=new Int8Array(e),a.HEAP16=new Int16Array(e),a.HEAP32=F=new Int32Array(e),a.HEAPU8=R=new Uint8Array(e),a.HEAPU16=new Uint16Array(e),a.HEAPU32=new Uint32Array(e),a.HEAPF32=new Float32Array(e),a.HEAPF64=new Float64Array(e)}a.INITIAL_MEMORY;var U,W=[],V=[],q=[],H=[];function K(){if(a.preRun)for("function"==typeof a.preRun&&(a.preRun=[a.preRun]);a.preRun.length;)Q(a.preRun.shift());he(W)}function X(){he(V)}function Y(){he(q)}function Z(){if(a.postRun)for("function"==typeof a.postRun&&(a.postRun=[a.postRun]);a.postRun.length;)J(a.postRun.shift());he(H)}function Q(e){W.unshift(e)}function J(e){H.unshift(e)}V.push({func:function(){Ne()}});var ee=0,te=null,ne=null;function se(e){ee++,a.monitorRunDependencies&&a.monitorRunDependencies(ee)}function oe(e){if(ee--,a.monitorRunDependencies&&a.monitorRunDependencies(ee),0==ee&&(null!==te&&(clearInterval(te),te=null),ne)){var t=ne;ne=null,t()}}function re(e){a.onAbort&&a.onAbort(e),O(e+=""),I=!0,e="abort("+e+"). Build with -s ASSERTIONS=1 for more info.";var t=new WebAssembly.RuntimeError(e);throw i(t),t}function ie(e,t){return String.prototype.startsWith?e.startsWith(t):0===e.indexOf(t)}a.preloadedImages={},a.preloadedAudios={};var ae="data:application/octet-stream;base64,";function ue(e){return ie(e,ae)}var de="file://";function le(e){return ie(e,de)}var ce="tfjs-backend-wasm.wasm";function fe(e){try{if(e==ce&&v)return new Uint8Array(v);if(j)return j(e);throw"both async and sync fetching of the wasm failed"}catch(e){re(e)}}function pe(){if(!v&&(c||f)){if("function"==typeof fetch&&!le(ce))return fetch(ce,{credentials:"same-origin"}).then((function(e){if(!e.ok)throw"failed to load wasm binary file at '"+ce+"'";return e.arrayBuffer()})).catch((function(){return fe(ce)}));if(b)return new Promise((function(e,t){b(ce,(function(t){e(new Uint8Array(t))}),t)}))}return Promise.resolve().then((function(){return fe(ce)}))}function me(){var e={a:Te};function t(e,t){var n=e.exports;a.asm=n,G((x=a.asm.i).buffer),U=a.asm.o,oe()}function n(e){t(e.instance)}function s(t){return pe().then((function(t){return WebAssembly.instantiate(t,e)})).then(t,(function(e){O("failed to asynchronously prepare wasm: "+e),re(e)}))}if(se(),a.instantiateWasm)try{return a.instantiateWasm(e,t)}catch(e){return O("Module.instantiateWasm callback failed with error: "+e),!1}return(v||"function"!=typeof WebAssembly.instantiateStreaming||ue(ce)||le(ce)||"function"!=typeof fetch?s(n):fetch(ce,{credentials:"same-origin"}).then((function(t){return WebAssembly.instantiateStreaming(t,e).then(n,(function(e){return O("wasm streaming compile failed: "+e),O("falling back to ArrayBuffer instantiation"),s(n)}))}))).catch(i),{}}function he(e){for(;e.length>0;){var t=e.shift();if("function"!=typeof t){var n=t.func;"number"==typeof n?void 0===t.arg?U.get(n)():U.get(n)(t.arg):n(void 0===t.arg?null:t.arg)}else t(a)}}function be(){re()}function je(e,t,n){R.copyWithin(e,t,t+n)}function ge(){return R.length}function we(e){try{return x.grow(e-E.byteLength+65535>>>16),G(x.buffer),1}catch(e){}}function _e(e){var t=ge(),n=2147483648;if(e>n)return!1;for(var s=1;s<=4;s*=2){var o=t*(1+.2/s);if(o=Math.min(o,e+100663296),we(Math.min(n,z(Math.max(e,o),65536))))return!0}return!1}ue(ce)||(ce=k(ce));var ke={mappings:{},buffers:[null,[],[]],printChar:function(e,t){var n=ke.buffers[e];0===t||10===t?((1===e?y:O)($(n,0)),n.length=0):n.push(t)},varargs:void 0,get:function(){return ke.varargs+=4,F[ke.varargs-4>>2]},getStr:function(e){return D(e)},get64:function(e,t){return e}};function ve(e){return 0}function xe(e,t,n,s,o){}function ye(e,t,n,s){for(var o=0,r=0;r>2],a=F[t+(8*r+4)>>2],u=0;u>2]=o,0}function Oe(){return 6}function Ie(e){return F[Ee()>>2]=e,e}function Ce(e){switch(e){case 30:return 16384;case 85:return 131072;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:case 80:case 81:case 79:return-1;case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 75:return 16384;case 39:return 1e3;case 89:return 700;case 71:return 256;case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:return"object"==typeof navigator&&navigator.hardwareConcurrency||1}return Ie(28),-1}var Se,Te={a:be,d:je,e:_e,f:ve,c:xe,b:ye,g:Oe,h:Ce},Ne=(me(),a.___wasm_call_ctors=function(){return(Ne=a.___wasm_call_ctors=a.asm.j).apply(null,arguments)}),Ee=(a._init=function(){return(a._init=a.asm.k).apply(null,arguments)},a._register_tensor=function(){return(a._register_tensor=a.asm.l).apply(null,arguments)},a._dispose_data=function(){return(a._dispose_data=a.asm.m).apply(null,arguments)},a._dispose=function(){return(a._dispose=a.asm.n).apply(null,arguments)},a._Abs=function(){return(a._Abs=a.asm.p).apply(null,arguments)},a._Add=function(){return(a._Add=a.asm.q).apply(null,arguments)},a._AddN=function(){return(a._AddN=a.asm.r).apply(null,arguments)},a._All=function(){return(a._All=a.asm.s).apply(null,arguments)},a._Any=function(){return(a._Any=a.asm.t).apply(null,arguments)},a._ArgMax=function(){return(a._ArgMax=a.asm.u).apply(null,arguments)},a._AvgPool=function(){return(a._AvgPool=a.asm.v).apply(null,arguments)},a._BatchMatMul=function(){return(a._BatchMatMul=a.asm.w).apply(null,arguments)},a._Ceil=function(){return(a._Ceil=a.asm.x).apply(null,arguments)},a._ClipByValue=function(){return(a._ClipByValue=a.asm.y).apply(null,arguments)},a._Conv2D=function(){return(a._Conv2D=a.asm.z).apply(null,arguments)},a._Conv2DBackpropInput=function(){return(a._Conv2DBackpropInput=a.asm.A).apply(null,arguments)},a._Cos=function(){return(a._Cos=a.asm.B).apply(null,arguments)},a._Cosh=function(){return(a._Cosh=a.asm.C).apply(null,arguments)},a._CropAndResize=function(){return(a._CropAndResize=a.asm.D).apply(null,arguments)},a._Cumsum=function(){return(a._Cumsum=a.asm.E).apply(null,arguments)},a._DepthToSpace=function(){return(a._DepthToSpace=a.asm.F).apply(null,arguments)},a._DepthwiseConv2dNative=function(){return(a._DepthwiseConv2dNative=a.asm.G).apply(null,arguments)},a._Equal=function(){return(a._Equal=a.asm.H).apply(null,arguments)},a._Exp=function(){return(a._Exp=a.asm.I).apply(null,arguments)},a._FlipLeftRight=function(){return(a._FlipLeftRight=a.asm.J).apply(null,arguments)},a._Floor=function(){return(a._Floor=a.asm.K).apply(null,arguments)},a._FloorDiv=function(){return(a._FloorDiv=a.asm.L).apply(null,arguments)},a._FusedBatchNorm=function(){return(a._FusedBatchNorm=a.asm.M).apply(null,arguments)},a._FusedConv2D=function(){return(a._FusedConv2D=a.asm.N).apply(null,arguments)},a._FusedDepthwiseConv2D=function(){return(a._FusedDepthwiseConv2D=a.asm.O).apply(null,arguments)},a._Gather=function(){return(a._Gather=a.asm.P).apply(null,arguments)},a._GatherNd=function(){return(a._GatherNd=a.asm.Q).apply(null,arguments)},a._Greater=function(){return(a._Greater=a.asm.R).apply(null,arguments)},a._GreaterEqual=function(){return(a._GreaterEqual=a.asm.S).apply(null,arguments)},a._LeakyRelu=function(){return(a._LeakyRelu=a.asm.T).apply(null,arguments)},a._Less=function(){return(a._Less=a.asm.U).apply(null,arguments)},a._LessEqual=function(){return(a._LessEqual=a.asm.V).apply(null,arguments)},a._Log=function(){return(a._Log=a.asm.W).apply(null,arguments)},a._LogicalAnd=function(){return(a._LogicalAnd=a.asm.X).apply(null,arguments)},a._Max=function(){return(a._Max=a.asm.Y).apply(null,arguments)},a._MaxPool=function(){return(a._MaxPool=a.asm.Z).apply(null,arguments)},a._Maximum=function(){return(a._Maximum=a.asm._).apply(null,arguments)},a._Mean=function(){return(a._Mean=a.asm.$).apply(null,arguments)},a._Min=function(){return(a._Min=a.asm.aa).apply(null,arguments)},a._Minimum=function(){return(a._Minimum=a.asm.ba).apply(null,arguments)},a._MirrorPad=function(){return(a._MirrorPad=a.asm.ca).apply(null,arguments)},a._Multiply=function(){return(a._Multiply=a.asm.da).apply(null,arguments)},a._Neg=function(){return(a._Neg=a.asm.ea).apply(null,arguments)},a._NonMaxSuppressionV3=function(){return(a._NonMaxSuppressionV3=a.asm.fa).apply(null,arguments)},a._NonMaxSuppressionV4=function(){return(a._NonMaxSuppressionV4=a.asm.ga).apply(null,arguments)},a._NonMaxSuppressionV5=function(){return(a._NonMaxSuppressionV5=a.asm.ha).apply(null,arguments)},a._NotEqual=function(){return(a._NotEqual=a.asm.ia).apply(null,arguments)},a._OneHot=function(){return(a._OneHot=a.asm.ja).apply(null,arguments)},a._PadV2=function(){return(a._PadV2=a.asm.ka).apply(null,arguments)},a._Pow=function(){return(a._Pow=a.asm.la).apply(null,arguments)},a._Prelu=function(){return(a._Prelu=a.asm.ma).apply(null,arguments)},a._Prod=function(){return(a._Prod=a.asm.na).apply(null,arguments)},a._RealDiv=function(){return(a._RealDiv=a.asm.oa).apply(null,arguments)},a._Relu=function(){return(a._Relu=a.asm.pa).apply(null,arguments)},a._Relu6=function(){return(a._Relu6=a.asm.qa).apply(null,arguments)},a._ResizeBilinear=function(){return(a._ResizeBilinear=a.asm.ra).apply(null,arguments)},a._Reverse=function(){return(a._Reverse=a.asm.sa).apply(null,arguments)},a._RotateWithOffset=function(){return(a._RotateWithOffset=a.asm.ta).apply(null,arguments)},a._Round=function(){return(a._Round=a.asm.ua).apply(null,arguments)},a._Rsqrt=function(){return(a._Rsqrt=a.asm.va).apply(null,arguments)},a._ScatterNd=function(){return(a._ScatterNd=a.asm.wa).apply(null,arguments)},a._SelectV2=function(){return(a._SelectV2=a.asm.xa).apply(null,arguments)},a._Sigmoid=function(){return(a._Sigmoid=a.asm.ya).apply(null,arguments)},a._Sin=function(){return(a._Sin=a.asm.za).apply(null,arguments)},a._Softmax=function(){return(a._Softmax=a.asm.Aa).apply(null,arguments)},a._Sqrt=function(){return(a._Sqrt=a.asm.Ba).apply(null,arguments)},a._Square=function(){return(a._Square=a.asm.Ca).apply(null,arguments)},a._SquaredDifference=function(){return(a._SquaredDifference=a.asm.Da).apply(null,arguments)},a._Step=function(){return(a._Step=a.asm.Ea).apply(null,arguments)},a._StridedSlice=function(){return(a._StridedSlice=a.asm.Fa).apply(null,arguments)},a._Sub=function(){return(a._Sub=a.asm.Ga).apply(null,arguments)},a._Sum=function(){return(a._Sum=a.asm.Ha).apply(null,arguments)},a._Tan=function(){return(a._Tan=a.asm.Ia).apply(null,arguments)},a._Tanh=function(){return(a._Tanh=a.asm.Ja).apply(null,arguments)},a._Tile=function(){return(a._Tile=a.asm.Ka).apply(null,arguments)},a._TopK=function(){return(a._TopK=a.asm.La).apply(null,arguments)},a._Transform=function(){return(a._Transform=a.asm.Ma).apply(null,arguments)},a._Transpose=function(){return(a._Transpose=a.asm.Na).apply(null,arguments)},a.__FusedMatMul=function(){return(a.__FusedMatMul=a.asm.Oa).apply(null,arguments)},a._malloc=function(){return(a._malloc=a.asm.Pa).apply(null,arguments)},a._free=function(){return(a._free=a.asm.Qa).apply(null,arguments)},a.___errno_location=function(){return(Ee=a.___errno_location=a.asm.Ra).apply(null,arguments)}),Ae=a.stackSave=function(){return(Ae=a.stackSave=a.asm.Sa).apply(null,arguments)},Re=a.stackRestore=function(){return(Re=a.stackRestore=a.asm.Ta).apply(null,arguments)},Fe=a.stackAlloc=function(){return(Fe=a.stackAlloc=a.asm.Ua).apply(null,arguments)};function Me(e){this.name="ExitStatus",this.message="Program terminated with exit("+e+")",this.status=e}function $e(e){function n(){Se||(Se=!0,a.calledRun=!0,I||(X(),Y(),t(a),a.onRuntimeInitialized&&a.onRuntimeInitialized(),Z()))}e=e||l,ee>0||(K(),ee>0||(a.setStatus?(a.setStatus("Running..."),setTimeout((function(){setTimeout((function(){a.setStatus("")}),1),n()}),1)):n()))}if(a.cwrap=N,ne=function e(){Se||$e(),Se||(ne=e)},a.run=$e,a.preInit)for("function"==typeof a.preInit&&(a.preInit=[a.preInit]);a.preInit.length>0;)a.preInit.pop()();return $e(),e.ready});e.exports=i}).call(this,"/index.js",n(/*! ./../../../process/browser.js */"./node_modules/process/browser.js"),"/")},"./node_modules/@tensorflow/tfjs-core/dist/backends/backend.js": /*!*********************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/backends/backend.js ***! \*********************************************************************/ @@ -11844,7 +11845,7 @@ const s=1e-7,o=1e-4;class r{constructor(e,t){this.backend=e,this.dataMover=t,thi /*!**************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/backends/backend_util.js ***! \**************************************************************************/ -/*! exports provided: axesAreInnerMostDims, combineLocations, computeOutAndReduceShapes, expandShapeToKeepDim, assertAxesAreInnerMostDims, getAxesPermutation, getUndoAxesPermutation, getInnerMostAxes, getBroadcastDims, getReductionAxes, assertAndGetBroadcastShape, assertParamsConsistent, computeOutShape, computeDilation2DInfo, computePool2DInfo, computePool3DInfo, computeConv2DInfo, computeConv3DInfo, computeDefaultPad, tupleValuesAreOne, eitherStridesOrDilationsAreOne, convertConv2DDataFormat, getFusedDyActivation, getFusedBiasGradient, applyActivation, shouldFuse, PARALLELIZE_THRESHOLD, computeOptimalWindowSize, slice_util, upcastType, getImageCenter, getReshaped, getPermuted, getReshapedPermuted, getSliceBeginCoords, getSliceSize, prepareAndValidate, validateUpdateShape, validateInput, calculateShapes, SELU_SCALEALPHA, SELU_SCALE, ERF_P, ERF_A1, ERF_A2, ERF_A3, ERF_A4, ERF_A5, warn, log, mergeRealAndImagArrays, splitRealAndImagArrays, complexWithEvenIndex, complexWithOddIndex, getComplexWithIndex, assignToTypedArray, exponents, exponent, decodeEinsumEquation, getEinsumPermutation, checkEinsumDimSizes, getEinsumComputePath, isIdentityPermutation, prepareSplitSize, segment_util, fromUint8ToStringArray, fromStringArrayToUint8 */function(e,t,n){"use strict";n.r(t),n.d(t,"fromUint8ToStringArray",(function(){return x})),n.d(t,"fromStringArrayToUint8",(function(){return y}));var s=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),o=n(/*! ../ops/axis_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/axis_util.js");n.d(t,"axesAreInnerMostDims",(function(){return o.axesAreInnerMostDims})),n.d(t,"combineLocations",(function(){return o.combineLocations})),n.d(t,"computeOutAndReduceShapes",(function(){return o.computeOutAndReduceShapes})),n.d(t,"expandShapeToKeepDim",(function(){return o.expandShapeToKeepDim})),n.d(t,"assertAxesAreInnerMostDims",(function(){return o.assertAxesAreInnerMostDims})),n.d(t,"getAxesPermutation",(function(){return o.getAxesPermutation})),n.d(t,"getUndoAxesPermutation",(function(){return o.getUndoAxesPermutation})),n.d(t,"getInnerMostAxes",(function(){return o.getInnerMostAxes}));var r=n(/*! ../ops/broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js");n.d(t,"getBroadcastDims",(function(){return r.getBroadcastDims})),n.d(t,"getReductionAxes",(function(){return r.getReductionAxes})),n.d(t,"assertAndGetBroadcastShape",(function(){return r.assertAndGetBroadcastShape}));var i=n(/*! ../ops/concat_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/concat_util.js");n.d(t,"assertParamsConsistent",(function(){return i.assertParamsConsistent})),n.d(t,"computeOutShape",(function(){return i.computeOutShape}));var a=n(/*! ../ops/conv_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js");n.d(t,"computeDilation2DInfo",(function(){return a.computeDilation2DInfo})),n.d(t,"computePool2DInfo",(function(){return a.computePool2DInfo})),n.d(t,"computePool3DInfo",(function(){return a.computePool3DInfo})),n.d(t,"computeConv2DInfo",(function(){return a.computeConv2DInfo})),n.d(t,"computeConv3DInfo",(function(){return a.computeConv3DInfo})),n.d(t,"computeDefaultPad",(function(){return a.computeDefaultPad})),n.d(t,"tupleValuesAreOne",(function(){return a.tupleValuesAreOne})),n.d(t,"eitherStridesOrDilationsAreOne",(function(){return a.eitherStridesOrDilationsAreOne})),n.d(t,"convertConv2DDataFormat",(function(){return a.convertConv2DDataFormat}));var d=n(/*! ../ops/fused_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/fused_util.js");n.d(t,"getFusedDyActivation",(function(){return d.getFusedDyActivation})),n.d(t,"getFusedBiasGradient",(function(){return d.getFusedBiasGradient})),n.d(t,"applyActivation",(function(){return d.applyActivation})),n.d(t,"shouldFuse",(function(){return d.shouldFuse}));var u=n(/*! ../ops/reduce_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/reduce_util.js");n.d(t,"PARALLELIZE_THRESHOLD",(function(){return u.PARALLELIZE_THRESHOLD})),n.d(t,"computeOptimalWindowSize",(function(){return u.computeOptimalWindowSize}));var l=n(/*! ../ops/slice_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice_util.js");n.d(t,"slice_util",(function(){return l}));var c=n(/*! ../types */"./node_modules/@tensorflow/tfjs-core/dist/types.js");n.d(t,"upcastType",(function(){return c.upcastType}));var f=n(/*! ../ops/rotate_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/rotate_util.js");n.d(t,"getImageCenter",(function(){return f.getImageCenter}));var p=n(/*! ../ops/array_ops_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/array_ops_util.js");n.d(t,"getReshaped",(function(){return p.getReshaped})),n.d(t,"getPermuted",(function(){return p.getPermuted})),n.d(t,"getReshapedPermuted",(function(){return p.getReshapedPermuted})),n.d(t,"getSliceBeginCoords",(function(){return p.getSliceBeginCoords})),n.d(t,"getSliceSize",(function(){return p.getSliceSize}));var m=n(/*! ../ops/gather_nd_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/gather_nd_util.js");n.d(t,"prepareAndValidate",(function(){return m.prepareAndValidate}));var h=n(/*! ../ops/scatter_nd_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/scatter_nd_util.js");n.d(t,"validateUpdateShape",(function(){return h.validateUpdateShape})),n.d(t,"validateInput",(function(){return h.validateInput})),n.d(t,"calculateShapes",(function(){return h.calculateShapes}));var b=n(/*! ../ops/selu_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/selu_util.js");n.d(t,"SELU_SCALEALPHA",(function(){return b.SELU_SCALEALPHA})),n.d(t,"SELU_SCALE",(function(){return b.SELU_SCALE}));var j=n(/*! ../ops/erf_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/erf_util.js");n.d(t,"ERF_P",(function(){return j.ERF_P})),n.d(t,"ERF_A1",(function(){return j.ERF_A1})),n.d(t,"ERF_A2",(function(){return j.ERF_A2})),n.d(t,"ERF_A3",(function(){return j.ERF_A3})),n.d(t,"ERF_A4",(function(){return j.ERF_A4})),n.d(t,"ERF_A5",(function(){return j.ERF_A5}));var g=n(/*! ../log */"./node_modules/@tensorflow/tfjs-core/dist/log.js");n.d(t,"warn",(function(){return g.warn})),n.d(t,"log",(function(){return g.log}));var w=n(/*! ../backends/complex_util */"./node_modules/@tensorflow/tfjs-core/dist/backends/complex_util.js");n.d(t,"mergeRealAndImagArrays",(function(){return w.mergeRealAndImagArrays})),n.d(t,"splitRealAndImagArrays",(function(){return w.splitRealAndImagArrays})),n.d(t,"complexWithEvenIndex",(function(){return w.complexWithEvenIndex})),n.d(t,"complexWithOddIndex",(function(){return w.complexWithOddIndex})),n.d(t,"getComplexWithIndex",(function(){return w.getComplexWithIndex})),n.d(t,"assignToTypedArray",(function(){return w.assignToTypedArray})),n.d(t,"exponents",(function(){return w.exponents})),n.d(t,"exponent",(function(){return w.exponent}));var _=n(/*! ../backends/einsum_util */"./node_modules/@tensorflow/tfjs-core/dist/backends/einsum_util.js");n.d(t,"decodeEinsumEquation",(function(){return _.decodeEinsumEquation})),n.d(t,"getEinsumPermutation",(function(){return _.getEinsumPermutation})),n.d(t,"checkEinsumDimSizes",(function(){return _.checkEinsumDimSizes})),n.d(t,"getEinsumComputePath",(function(){return _.getEinsumComputePath})),n.d(t,"isIdentityPermutation",(function(){return _.isIdentityPermutation}));var k=n(/*! ../ops/split_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/split_util.js");n.d(t,"prepareSplitSize",(function(){return k.prepareSplitSize}));var v=n(/*! ../ops/segment_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/segment_util.js"); +/*! exports provided: axesAreInnerMostDims, combineLocations, computeOutAndReduceShapes, expandShapeToKeepDim, assertAxesAreInnerMostDims, getAxesPermutation, getUndoAxesPermutation, getInnerMostAxes, getBroadcastDims, getReductionAxes, assertAndGetBroadcastShape, assertParamsConsistent, computeOutShape, computeDilation2DInfo, computePool2DInfo, computePool3DInfo, computeConv2DInfo, computeConv3DInfo, computeDefaultPad, tupleValuesAreOne, eitherStridesOrDilationsAreOne, convertConv2DDataFormat, getFusedDyActivation, getFusedBiasGradient, applyActivation, shouldFuse, PARALLELIZE_THRESHOLD, computeOptimalWindowSize, slice_util, upcastType, getImageCenter, getReshaped, getPermuted, getReshapedPermuted, getSliceBeginCoords, getSliceSize, prepareAndValidate, validateUpdateShape, validateInput, calculateShapes, SELU_SCALEALPHA, SELU_SCALE, ERF_P, ERF_A1, ERF_A2, ERF_A3, ERF_A4, ERF_A5, warn, log, mergeRealAndImagArrays, splitRealAndImagArrays, complexWithEvenIndex, complexWithOddIndex, getComplexWithIndex, assignToTypedArray, exponents, exponent, decodeEinsumEquation, getEinsumPermutation, checkEinsumDimSizes, getEinsumComputePath, isIdentityPermutation, prepareSplitSize, segment_util, fromUint8ToStringArray, fromStringArrayToUint8 */function(e,t,n){"use strict";n.r(t),n.d(t,"fromUint8ToStringArray",(function(){return x})),n.d(t,"fromStringArrayToUint8",(function(){return y}));var s=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),o=n(/*! ../ops/axis_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/axis_util.js");n.d(t,"axesAreInnerMostDims",(function(){return o.axesAreInnerMostDims})),n.d(t,"combineLocations",(function(){return o.combineLocations})),n.d(t,"computeOutAndReduceShapes",(function(){return o.computeOutAndReduceShapes})),n.d(t,"expandShapeToKeepDim",(function(){return o.expandShapeToKeepDim})),n.d(t,"assertAxesAreInnerMostDims",(function(){return o.assertAxesAreInnerMostDims})),n.d(t,"getAxesPermutation",(function(){return o.getAxesPermutation})),n.d(t,"getUndoAxesPermutation",(function(){return o.getUndoAxesPermutation})),n.d(t,"getInnerMostAxes",(function(){return o.getInnerMostAxes}));var r=n(/*! ../ops/broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js");n.d(t,"getBroadcastDims",(function(){return r.getBroadcastDims})),n.d(t,"getReductionAxes",(function(){return r.getReductionAxes})),n.d(t,"assertAndGetBroadcastShape",(function(){return r.assertAndGetBroadcastShape}));var i=n(/*! ../ops/concat_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/concat_util.js");n.d(t,"assertParamsConsistent",(function(){return i.assertParamsConsistent})),n.d(t,"computeOutShape",(function(){return i.computeOutShape}));var a=n(/*! ../ops/conv_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js");n.d(t,"computeDilation2DInfo",(function(){return a.computeDilation2DInfo})),n.d(t,"computePool2DInfo",(function(){return a.computePool2DInfo})),n.d(t,"computePool3DInfo",(function(){return a.computePool3DInfo})),n.d(t,"computeConv2DInfo",(function(){return a.computeConv2DInfo})),n.d(t,"computeConv3DInfo",(function(){return a.computeConv3DInfo})),n.d(t,"computeDefaultPad",(function(){return a.computeDefaultPad})),n.d(t,"tupleValuesAreOne",(function(){return a.tupleValuesAreOne})),n.d(t,"eitherStridesOrDilationsAreOne",(function(){return a.eitherStridesOrDilationsAreOne})),n.d(t,"convertConv2DDataFormat",(function(){return a.convertConv2DDataFormat}));var u=n(/*! ../ops/fused_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/fused_util.js");n.d(t,"getFusedDyActivation",(function(){return u.getFusedDyActivation})),n.d(t,"getFusedBiasGradient",(function(){return u.getFusedBiasGradient})),n.d(t,"applyActivation",(function(){return u.applyActivation})),n.d(t,"shouldFuse",(function(){return u.shouldFuse}));var d=n(/*! ../ops/reduce_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/reduce_util.js");n.d(t,"PARALLELIZE_THRESHOLD",(function(){return d.PARALLELIZE_THRESHOLD})),n.d(t,"computeOptimalWindowSize",(function(){return d.computeOptimalWindowSize}));var l=n(/*! ../ops/slice_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice_util.js");n.d(t,"slice_util",(function(){return l}));var c=n(/*! ../types */"./node_modules/@tensorflow/tfjs-core/dist/types.js");n.d(t,"upcastType",(function(){return c.upcastType}));var f=n(/*! ../ops/rotate_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/rotate_util.js");n.d(t,"getImageCenter",(function(){return f.getImageCenter}));var p=n(/*! ../ops/array_ops_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/array_ops_util.js");n.d(t,"getReshaped",(function(){return p.getReshaped})),n.d(t,"getPermuted",(function(){return p.getPermuted})),n.d(t,"getReshapedPermuted",(function(){return p.getReshapedPermuted})),n.d(t,"getSliceBeginCoords",(function(){return p.getSliceBeginCoords})),n.d(t,"getSliceSize",(function(){return p.getSliceSize}));var m=n(/*! ../ops/gather_nd_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/gather_nd_util.js");n.d(t,"prepareAndValidate",(function(){return m.prepareAndValidate}));var h=n(/*! ../ops/scatter_nd_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/scatter_nd_util.js");n.d(t,"validateUpdateShape",(function(){return h.validateUpdateShape})),n.d(t,"validateInput",(function(){return h.validateInput})),n.d(t,"calculateShapes",(function(){return h.calculateShapes}));var b=n(/*! ../ops/selu_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/selu_util.js");n.d(t,"SELU_SCALEALPHA",(function(){return b.SELU_SCALEALPHA})),n.d(t,"SELU_SCALE",(function(){return b.SELU_SCALE}));var j=n(/*! ../ops/erf_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/erf_util.js");n.d(t,"ERF_P",(function(){return j.ERF_P})),n.d(t,"ERF_A1",(function(){return j.ERF_A1})),n.d(t,"ERF_A2",(function(){return j.ERF_A2})),n.d(t,"ERF_A3",(function(){return j.ERF_A3})),n.d(t,"ERF_A4",(function(){return j.ERF_A4})),n.d(t,"ERF_A5",(function(){return j.ERF_A5}));var g=n(/*! ../log */"./node_modules/@tensorflow/tfjs-core/dist/log.js");n.d(t,"warn",(function(){return g.warn})),n.d(t,"log",(function(){return g.log}));var w=n(/*! ../backends/complex_util */"./node_modules/@tensorflow/tfjs-core/dist/backends/complex_util.js");n.d(t,"mergeRealAndImagArrays",(function(){return w.mergeRealAndImagArrays})),n.d(t,"splitRealAndImagArrays",(function(){return w.splitRealAndImagArrays})),n.d(t,"complexWithEvenIndex",(function(){return w.complexWithEvenIndex})),n.d(t,"complexWithOddIndex",(function(){return w.complexWithOddIndex})),n.d(t,"getComplexWithIndex",(function(){return w.getComplexWithIndex})),n.d(t,"assignToTypedArray",(function(){return w.assignToTypedArray})),n.d(t,"exponents",(function(){return w.exponents})),n.d(t,"exponent",(function(){return w.exponent}));var _=n(/*! ../backends/einsum_util */"./node_modules/@tensorflow/tfjs-core/dist/backends/einsum_util.js");n.d(t,"decodeEinsumEquation",(function(){return _.decodeEinsumEquation})),n.d(t,"getEinsumPermutation",(function(){return _.getEinsumPermutation})),n.d(t,"checkEinsumDimSizes",(function(){return _.checkEinsumDimSizes})),n.d(t,"getEinsumComputePath",(function(){return _.getEinsumComputePath})),n.d(t,"isIdentityPermutation",(function(){return _.isIdentityPermutation}));var k=n(/*! ../ops/split_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/split_util.js");n.d(t,"prepareSplitSize",(function(){return k.prepareSplitSize}));var v=n(/*! ../ops/segment_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/segment_util.js"); /** * @license * Copyright 2018 Google LLC. All Rights Reserved. @@ -11882,11 +11883,11 @@ function x(e){try{return e.map((e=>Object(s.decodeString)(e)))}catch(e){throw ne * limitations under the License. * ============================================================================= */ -function s(e,t){if(e.length!==t.length)throw new Error(`Cannot merge real and imag arrays of different lengths. real:${e.length}, imag: ${t.length}.`);const n=new Float32Array(2*e.length);for(let s=0;s/g;function i(e,t){const n=((e=e.replace(/\s/g,"")).length-e.replace(r,"").length)/o.length;if(n<1)throw new Error("Equations without an arrow are not supported.");if(n>1)throw new Error('Equation must contain exactly one arrow ("->").');const[i,a]=e.split(o);Object(s.assert)(-1===i.indexOf("..."),(()=>'The ellipsis notation ("...") is not supported yet.'));const d=i.split(","),u=d.length;if(t!==u)throw new Error(`Expected ${u} input tensors, received ${t}`);if(u>2)throw new Error("Support for more than 2 input tensors is not implemented yet.");const l=[];for(let e=0;e-1!==e.indexOf(t))))throw new Error(`Output subscripts contain the label ${t} not present in the input subscripts.`);-1===l.indexOf(t)&&l.push(t)}for(let e=0;e-1!==e)),{permutationIndices:n,expandDims:s}}function d(e,t,n){const o=new Array(e);for(let e=0;e`Expected dimension ${o[t[e][n]]} at axis ${n} of input shaped ${JSON.stringify(r)}, but got dimension ${r[n]}`))}}function u(e,t){const n=e,s=[];let o=0;0===e.length&&n.push(-1),o=e.length+1;for(let e=0;ee===t))}function c(e,t){const n=[];for(let s=0;s/g;function i(e,t){const n=((e=e.replace(/\s/g,"")).length-e.replace(r,"").length)/o.length;if(n<1)throw new Error("Equations without an arrow are not supported.");if(n>1)throw new Error('Equation must contain exactly one arrow ("->").');const[i,a]=e.split(o);Object(s.assert)(-1===i.indexOf("..."),(()=>'The ellipsis notation ("...") is not supported yet.'));const u=i.split(","),d=u.length;if(t!==d)throw new Error(`Expected ${d} input tensors, received ${t}`);if(d>2)throw new Error("Support for more than 2 input tensors is not implemented yet.");const l=[];for(let e=0;e-1!==e.indexOf(t))))throw new Error(`Output subscripts contain the label ${t} not present in the input subscripts.`);-1===l.indexOf(t)&&l.push(t)}for(let e=0;e-1!==e)),{permutationIndices:n,expandDims:s}}function u(e,t,n){const o=new Array(e);for(let e=0;e`Expected dimension ${o[t[e][n]]} at axis ${n} of input shaped ${JSON.stringify(r)}, but got dimension ${r[n]}`))}}function d(e,t){const n=e,s=[];let o=0;0===e.length&&n.push(-1),o=e.length+1;for(let e=0;ee===t))}function c(e,t){const n=[];for(let s=0;sr&&p.push({score:t[e],boxIndex:e,suppressBeginIndex:0});p.sort(l);const m=i>0?-.5/i:0,h=[],b=[];for(;h.length0;){const t=p.pop(),{score:n,boxIndex:i,suppressBeginIndex:a}=t;if(n=a;--n){const s=d(e,i,h[n]);if(s>=o){c=!0;break}if(t.score=t.score*u(o,m,s),t.score<=r)break}t.suppressBeginIndex=h.length,c||(t.score===n?(h.push(i),b.push(t.score)):t.score>r&&Object(s.binaryInsert)(p,t,l))}const j=h.length,g=n-j;c&&g>0&&(h.push(...new Array(g).fill(0)),b.push(...new Array(g).fill(0)));const w={selectedIndices:h};return a&&(w.selectedScores=b),f&&(w.validOutputs=j),w}function d(e,t,n){const s=e.subarray(4*t,4*t+4),o=e.subarray(4*n,4*n+4),r=Math.min(s[0],s[2]),i=Math.min(s[1],s[3]),a=Math.max(s[0],s[2]),d=Math.max(s[1],s[3]),u=Math.min(o[0],o[2]),l=Math.min(o[1],o[3]),c=Math.max(o[0],o[2]),f=Math.max(o[1],o[3]),p=(a-r)*(d-i),m=(c-u)*(f-l);if(p<=0||m<=0)return 0;const h=Math.max(r,u),b=Math.max(i,l),j=Math.min(a,c),g=Math.min(d,f),w=Math.max(j-h,0)*Math.max(g-b,0);return w/(p+m-w)}function u(e,t,n){const s=Math.exp(t*n*n);return n<=e?s:0}function l(e,t){return e.score-t.score||e.score===t.score&&t.boxIndex-e.boxIndex}},"./node_modules/@tensorflow/tfjs-core/dist/backends/non_max_suppression_util.js": + */function o(e,t,n,s,o){return a(e,t,n,s,o,0)}function r(e,t,n,s,o,r){return a(e,t,n,s,o,0,!1,r,!0)}function i(e,t,n,s,o,r){return a(e,t,n,s,o,r,!0)}function a(e,t,n,o,r,i,a=!1,c=!1,f=!1){const p=[];for(let e=0;er&&p.push({score:t[e],boxIndex:e,suppressBeginIndex:0});p.sort(l);const m=i>0?-.5/i:0,h=[],b=[];for(;h.length0;){const t=p.pop(),{score:n,boxIndex:i,suppressBeginIndex:a}=t;if(n=a;--n){const s=u(e,i,h[n]);if(s>=o){c=!0;break}if(t.score=t.score*d(o,m,s),t.score<=r)break}t.suppressBeginIndex=h.length,c||(t.score===n?(h.push(i),b.push(t.score)):t.score>r&&Object(s.binaryInsert)(p,t,l))}const j=h.length,g=n-j;c&&g>0&&(h.push(...new Array(g).fill(0)),b.push(...new Array(g).fill(0)));const w={selectedIndices:h};return a&&(w.selectedScores=b),f&&(w.validOutputs=j),w}function u(e,t,n){const s=e.subarray(4*t,4*t+4),o=e.subarray(4*n,4*n+4),r=Math.min(s[0],s[2]),i=Math.min(s[1],s[3]),a=Math.max(s[0],s[2]),u=Math.max(s[1],s[3]),d=Math.min(o[0],o[2]),l=Math.min(o[1],o[3]),c=Math.max(o[0],o[2]),f=Math.max(o[1],o[3]),p=(a-r)*(u-i),m=(c-d)*(f-l);if(p<=0||m<=0)return 0;const h=Math.max(r,d),b=Math.max(i,l),j=Math.min(a,c),g=Math.min(u,f),w=Math.max(j-h,0)*Math.max(g-b,0);return w/(p+m-w)}function d(e,t,n){const s=Math.exp(t*n*n);return n<=e?s:0}function l(e,t){return e.score-t.score||e.score===t.score&&t.boxIndex-e.boxIndex}},"./node_modules/@tensorflow/tfjs-core/dist/backends/non_max_suppression_util.js": /*!**************************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/backends/non_max_suppression_util.js ***! \**************************************************************************************/ @@ -11971,11 +11972,11 @@ function s(e,t,n){const s=o(e,t,n),r=s<0?-(s+1):s;e.splice(r,0,t)}function o(e,t /*!*********************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/base.js ***! \*********************************************************/ -/*! exports provided: AdadeltaOptimizer, AdagradOptimizer, AdamOptimizer, AdamaxOptimizer, MomentumOptimizer, Optimizer, RMSPropOptimizer, SGDOptimizer, Tensor, TensorBuffer, Variable, Rank, sumOutType, upcastType, abs, acos, acosh, add, addN, all, any, argMax, argMin, asin, asinh, atan, atan2, atanh, avgPool, avgPool3d, basicLSTMCell, batchToSpaceND, batchNorm, batchNorm2d, batchNorm3d, batchNorm4d, bincount, broadcastTo, buffer, cast, ceil, clipByValue, clone, complex, concat, concat1d, concat2d, concat3d, concat4d, conv1d, conv2d, conv2dTranspose, conv3d, conv3dTranspose, cos, cosh, cumsum, denseBincount, depthToSpace, depthwiseConv2d, diag, dilation2d, div, divNoNan, dot, einsum, elu, equal, erf, exp, expandDims, expm1, eye, fill, floor, floorDiv, gather, greater, greaterEqual, imag, isFinite, isInf, isNaN, leakyRelu, less, lessEqual, linspace, localResponseNormalization, log, log1p, logSigmoid, logSoftmax, logSumExp, logicalAnd, logicalNot, logicalOr, logicalXor, matMul, max, maxPool, maxPool3d, maxPoolWithArgmax, maximum, mean, meshgrid, min, minimum, mirrorPad, mod, moments, mul, multiRNNCell, multinomial, neg, notEqual, oneHot, ones, onesLike, outerProduct, pad, pad1d, pad2d, pad3d, pad4d, pool, pow, prelu, print, prod, rand, randomGamma, randomNormal, randomUniform, range, real, reciprocal, relu, relu6, reshape, reverse, reverse1d, reverse2d, reverse3d, reverse4d, round, rsqrt, scalar, selu, separableConv2d, setdiff1dAsync, sigmoid, sign, sin, sinh, slice, slice1d, slice2d, slice3d, slice4d, softmax, softplus, spaceToBatchND, fft, ifft, irfft, rfft, split, sqrt, square, squaredDifference, squeeze, stack, step, stridedSlice, sub, sum, tan, tanh, tensor, tensor1d, tensor2d, tensor3d, tensor4d, tensor5d, tensor6d, tile, topk, truncatedNormal, unique, unsortedSegmentSum, unstack, variable, where, whereAsync, zeros, zerosLike, booleanMaskAsync, transpose, norm, movingAverage, scatterND, sparseToDense, gatherND, dropout, enclosingPowerOfTwo, cosineWindow, inTopKAsync, op, OP_SCOPE_SUFFIX, image, linalg, losses, spectral, fused, signal, sparse, string, Reduction, train, enableProdMode, enableDebugMode, disableDeprecationWarnings, deprecationWarn, disposeVariables, engine, memory, profile, tidy, dispose, keep, time, setBackend, ready, getBackend, removeBackend, findBackend, findBackendFactory, registerBackend, backend, setPlatform, getKernel, getGradient, getKernelsForBackend, registerKernel, registerGradient, unregisterKernel, unregisterGradient, copyRegisteredKernels, customGrad, grad, grads, valueAndGrad, valueAndGrads, variableGrads, Environment, env, ENV, version_core, nextFrame, browser, io, math, serialization, test_util, util, backend_util, tensor_util, slice_util, gather_util, scatter_util, device_util, kernel_impls, KernelBackend, DataStorage, Abs, Acos, Acosh, Add, AddN, All, Any, ArgMax, ArgMin, Asin, Asinh, Atan, Atanh, Atan2, AvgPool, AvgPoolGrad, AvgPool3D, AvgPool3DGrad, BatchMatMul, BatchToSpaceND, Bincount, BroadcastTo, Cast, Ceil, ClipByValue, Complex, ComplexAbs, Concat, Conv2D, Conv2DBackpropFilter, Conv2DBackpropInput, Conv3D, Conv3DBackpropFilterV2, Conv3DBackpropInputV2, Cos, Cosh, Cumsum, CropAndResize, DenseBincount, DepthToSpace, DepthwiseConv2dNative, DepthwiseConv2dNativeBackpropFilter, DepthwiseConv2dNativeBackpropInput, Diag, Dilation2D, Dilation2DBackpropInput, Dilation2DBackpropFilter, RealDiv, Einsum, Elu, EluGrad, Erf, Equal, Exp, ExpandDims, Expm1, FFT, Fill, FlipLeftRight, Floor, FloorDiv, FusedBatchNorm, GatherV2, GatherNd, Greater, GreaterEqual, Identity, IFFT, Imag, IsFinite, IsInf, IsNan, LeakyRelu, Less, LessEqual, LinSpace, Log, Log1p, LogicalAnd, LogicalNot, LogicalOr, LogSoftmax, LRN, LRNGrad, Max, Maximum, MaxPool, MaxPoolGrad, MaxPool3D, MaxPool3DGrad, MaxPoolWithArgmax, Mean, Min, Minimum, MirrorPad, Mod, Multinomial, Multiply, Neg, NotEqual, NonMaxSuppressionV3, NonMaxSuppressionV4, NonMaxSuppressionV5, OnesLike, OneHot, Pack, PadV2, Pool, Pow, Prelu, Prod, Range, Real, Reciprocal, Relu, Reshape, ResizeNearestNeighbor, ResizeNearestNeighborGrad, ResizeBilinear, ResizeBilinearGrad, Relu6, Reverse, Round, Rsqrt, ScatterNd, Select, Selu, Slice, Sin, Sinh, Sign, Sigmoid, Softplus, Sqrt, Sum, SpaceToBatchND, SplitV, Softmax, SparseFillEmptyRows, SparseReshape, SparseSegmentMean, SparseSegmentSum, SparseToDense, SquaredDifference, Square, StridedSlice, StringNGrams, StringSplit, StringToHashBucketFast, Sub, Tan, Tanh, Tile, TopK, Transform, Transpose, Unique, Unpack, UnsortedSegmentSum, ZerosLike, Step, FromPixels, RotateWithOffset, _FusedMatMul, FusedConv2D, FusedDepthwiseConv2D */function(e,t,n){"use strict";n.r(t);var s=n(/*! ./io/io */"./node_modules/@tensorflow/tfjs-core/dist/io/io.js");n.d(t,"io",(function(){return s}));var o=n(/*! ./math */"./node_modules/@tensorflow/tfjs-core/dist/math.js");n.d(t,"math",(function(){return o}));var r=n(/*! ./ops/browser */"./node_modules/@tensorflow/tfjs-core/dist/ops/browser.js");n.d(t,"browser",(function(){return r}));var i=n(/*! ./ops/gather_nd_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/gather_nd_util.js");n.d(t,"gather_util",(function(){return i}));var a=n(/*! ./ops/scatter_nd_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/scatter_nd_util.js");n.d(t,"scatter_util",(function(){return a}));var d=n(/*! ./ops/slice_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice_util.js");n.d(t,"slice_util",(function(){return d}));var u=n(/*! ./serialization */"./node_modules/@tensorflow/tfjs-core/dist/serialization.js");n.d(t,"serialization",(function(){return u}));var l=n(/*! ./tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js");n.d(t,"tensor_util",(function(){return l}));var c=n(/*! ./test_util */"./node_modules/@tensorflow/tfjs-core/dist/test_util.js");n.d(t,"test_util",(function(){return c}));var f=n(/*! ./util */"./node_modules/@tensorflow/tfjs-core/dist/util.js");n.d(t,"util",(function(){return f}));var p=n(/*! ./version */"./node_modules/@tensorflow/tfjs-core/dist/version.js");n.d(t,"version_core",(function(){return p.version}));var m=n(/*! ./optimizers/adadelta_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/adadelta_optimizer.js");n.d(t,"AdadeltaOptimizer",(function(){return m.AdadeltaOptimizer}));var h=n(/*! ./optimizers/adagrad_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/adagrad_optimizer.js");n.d(t,"AdagradOptimizer",(function(){return h.AdagradOptimizer}));var b=n(/*! ./optimizers/adam_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/adam_optimizer.js");n.d(t,"AdamOptimizer",(function(){return b.AdamOptimizer}));var j=n(/*! ./optimizers/adamax_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/adamax_optimizer.js");n.d(t,"AdamaxOptimizer",(function(){return j.AdamaxOptimizer}));var g=n(/*! ./optimizers/momentum_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/momentum_optimizer.js");n.d(t,"MomentumOptimizer",(function(){return g.MomentumOptimizer}));var w=n(/*! ./optimizers/optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer.js");n.d(t,"Optimizer",(function(){return w.Optimizer}));var _=n(/*! ./optimizers/rmsprop_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/rmsprop_optimizer.js");n.d(t,"RMSPropOptimizer",(function(){return _.RMSPropOptimizer}));var k=n(/*! ./optimizers/sgd_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/sgd_optimizer.js");n.d(t,"SGDOptimizer",(function(){return k.SGDOptimizer}));var v=n(/*! ./tensor */"./node_modules/@tensorflow/tfjs-core/dist/tensor.js");n.d(t,"Tensor",(function(){return v.Tensor})),n.d(t,"TensorBuffer",(function(){return v.TensorBuffer})),n.d(t,"Variable",(function(){return v.Variable}));var x=n(/*! ./types */"./node_modules/@tensorflow/tfjs-core/dist/types.js");n.d(t,"Rank",(function(){return x.Rank})),n.d(t,"sumOutType",(function(){return x.sumOutType})),n.d(t,"upcastType",(function(){return x.upcastType}));var y=n(/*! ./ops/ops */"./node_modules/@tensorflow/tfjs-core/dist/ops/ops.js");n.d(t,"abs",(function(){return y.abs})),n.d(t,"acos",(function(){return y.acos})),n.d(t,"acosh",(function(){return y.acosh})),n.d(t,"add",(function(){return y.add})),n.d(t,"addN",(function(){return y.addN})),n.d(t,"all",(function(){return y.all})),n.d(t,"any",(function(){return y.any})),n.d(t,"argMax",(function(){return y.argMax})),n.d(t,"argMin",(function(){return y.argMin})),n.d(t,"asin",(function(){return y.asin})),n.d(t,"asinh",(function(){return y.asinh})),n.d(t,"atan",(function(){return y.atan})),n.d(t,"atan2",(function(){return y.atan2})),n.d(t,"atanh",(function(){return y.atanh})),n.d(t,"avgPool",(function(){return y.avgPool})),n.d(t,"avgPool3d",(function(){return y.avgPool3d})),n.d(t,"basicLSTMCell",(function(){return y.basicLSTMCell})),n.d(t,"batchToSpaceND",(function(){return y.batchToSpaceND})),n.d(t,"batchNorm",(function(){return y.batchNorm})),n.d(t,"batchNorm2d",(function(){return y.batchNorm2d})),n.d(t,"batchNorm3d",(function(){return y.batchNorm3d})),n.d(t,"batchNorm4d",(function(){return y.batchNorm4d})),n.d(t,"bincount",(function(){return y.bincount})),n.d(t,"broadcastTo",(function(){return y.broadcastTo})),n.d(t,"buffer",(function(){return y.buffer})),n.d(t,"cast",(function(){return y.cast})),n.d(t,"ceil",(function(){return y.ceil})),n.d(t,"clipByValue",(function(){return y.clipByValue})),n.d(t,"clone",(function(){return y.clone})),n.d(t,"complex",(function(){return y.complex})),n.d(t,"concat",(function(){return y.concat})),n.d(t,"concat1d",(function(){return y.concat1d})),n.d(t,"concat2d",(function(){return y.concat2d})),n.d(t,"concat3d",(function(){return y.concat3d})),n.d(t,"concat4d",(function(){return y.concat4d})),n.d(t,"conv1d",(function(){return y.conv1d})),n.d(t,"conv2d",(function(){return y.conv2d})),n.d(t,"conv2dTranspose",(function(){return y.conv2dTranspose})),n.d(t,"conv3d",(function(){return y.conv3d})),n.d(t,"conv3dTranspose",(function(){return y.conv3dTranspose})),n.d(t,"cos",(function(){return y.cos})),n.d(t,"cosh",(function(){return y.cosh})),n.d(t,"cumsum",(function(){return y.cumsum})),n.d(t,"denseBincount",(function(){return y.denseBincount})),n.d(t,"depthToSpace",(function(){return y.depthToSpace})),n.d(t,"depthwiseConv2d",(function(){return y.depthwiseConv2d})),n.d(t,"diag",(function(){return y.diag})),n.d(t,"dilation2d",(function(){return y.dilation2d})),n.d(t,"div",(function(){return y.div})),n.d(t,"divNoNan",(function(){return y.divNoNan})),n.d(t,"dot",(function(){return y.dot})),n.d(t,"einsum",(function(){return y.einsum})),n.d(t,"elu",(function(){return y.elu})),n.d(t,"equal",(function(){return y.equal})),n.d(t,"erf",(function(){return y.erf})),n.d(t,"exp",(function(){return y.exp})),n.d(t,"expandDims",(function(){return y.expandDims})),n.d(t,"expm1",(function(){return y.expm1})),n.d(t,"eye",(function(){return y.eye})),n.d(t,"fill",(function(){return y.fill})),n.d(t,"floor",(function(){return y.floor})),n.d(t,"floorDiv",(function(){return y.floorDiv})),n.d(t,"gather",(function(){return y.gather})),n.d(t,"greater",(function(){return y.greater})),n.d(t,"greaterEqual",(function(){return y.greaterEqual})),n.d(t,"imag",(function(){return y.imag})),n.d(t,"isFinite",(function(){return y.isFinite})),n.d(t,"isInf",(function(){return y.isInf})),n.d(t,"isNaN",(function(){return y.isNaN})),n.d(t,"leakyRelu",(function(){return y.leakyRelu})),n.d(t,"less",(function(){return y.less})),n.d(t,"lessEqual",(function(){return y.lessEqual})),n.d(t,"linspace",(function(){return y.linspace})),n.d(t,"localResponseNormalization",(function(){return y.localResponseNormalization})),n.d(t,"log",(function(){return y.log})),n.d(t,"log1p",(function(){return y.log1p})),n.d(t,"logSigmoid",(function(){return y.logSigmoid})),n.d(t,"logSoftmax",(function(){return y.logSoftmax})),n.d(t,"logSumExp",(function(){return y.logSumExp})),n.d(t,"logicalAnd",(function(){return y.logicalAnd})),n.d(t,"logicalNot",(function(){return y.logicalNot})),n.d(t,"logicalOr",(function(){return y.logicalOr})),n.d(t,"logicalXor",(function(){return y.logicalXor})),n.d(t,"matMul",(function(){return y.matMul})),n.d(t,"max",(function(){return y.max})),n.d(t,"maxPool",(function(){return y.maxPool})),n.d(t,"maxPool3d",(function(){return y.maxPool3d})),n.d(t,"maxPoolWithArgmax",(function(){return y.maxPoolWithArgmax})),n.d(t,"maximum",(function(){return y.maximum})),n.d(t,"mean",(function(){return y.mean})),n.d(t,"meshgrid",(function(){return y.meshgrid})),n.d(t,"min",(function(){return y.min})),n.d(t,"minimum",(function(){return y.minimum})),n.d(t,"mirrorPad",(function(){return y.mirrorPad})),n.d(t,"mod",(function(){return y.mod})),n.d(t,"moments",(function(){return y.moments})),n.d(t,"mul",(function(){return y.mul})),n.d(t,"multiRNNCell",(function(){return y.multiRNNCell})),n.d(t,"multinomial",(function(){return y.multinomial})),n.d(t,"neg",(function(){return y.neg})),n.d(t,"notEqual",(function(){return y.notEqual})),n.d(t,"oneHot",(function(){return y.oneHot})),n.d(t,"ones",(function(){return y.ones})),n.d(t,"onesLike",(function(){return y.onesLike})),n.d(t,"outerProduct",(function(){return y.outerProduct})),n.d(t,"pad",(function(){return y.pad})),n.d(t,"pad1d",(function(){return y.pad1d})),n.d(t,"pad2d",(function(){return y.pad2d})),n.d(t,"pad3d",(function(){return y.pad3d})),n.d(t,"pad4d",(function(){return y.pad4d})),n.d(t,"pool",(function(){return y.pool})),n.d(t,"pow",(function(){return y.pow})),n.d(t,"prelu",(function(){return y.prelu})),n.d(t,"print",(function(){return y.print})),n.d(t,"prod",(function(){return y.prod})),n.d(t,"rand",(function(){return y.rand})),n.d(t,"randomGamma",(function(){return y.randomGamma})),n.d(t,"randomNormal",(function(){return y.randomNormal})),n.d(t,"randomUniform",(function(){return y.randomUniform})),n.d(t,"range",(function(){return y.range})),n.d(t,"real",(function(){return y.real})),n.d(t,"reciprocal",(function(){return y.reciprocal})),n.d(t,"relu",(function(){return y.relu})),n.d(t,"relu6",(function(){return y.relu6})),n.d(t,"reshape",(function(){return y.reshape})),n.d(t,"reverse",(function(){return y.reverse})),n.d(t,"reverse1d",(function(){return y.reverse1d})),n.d(t,"reverse2d",(function(){return y.reverse2d})),n.d(t,"reverse3d",(function(){return y.reverse3d})),n.d(t,"reverse4d",(function(){return y.reverse4d})),n.d(t,"round",(function(){return y.round})),n.d(t,"rsqrt",(function(){return y.rsqrt})),n.d(t,"scalar",(function(){return y.scalar})),n.d(t,"selu",(function(){return y.selu})),n.d(t,"separableConv2d",(function(){return y.separableConv2d})),n.d(t,"setdiff1dAsync",(function(){return y.setdiff1dAsync})),n.d(t,"sigmoid",(function(){return y.sigmoid})),n.d(t,"sign",(function(){return y.sign})),n.d(t,"sin",(function(){return y.sin})),n.d(t,"sinh",(function(){return y.sinh})),n.d(t,"slice",(function(){return y.slice})),n.d(t,"slice1d",(function(){return y.slice1d})),n.d(t,"slice2d",(function(){return y.slice2d})),n.d(t,"slice3d",(function(){return y.slice3d})),n.d(t,"slice4d",(function(){return y.slice4d})),n.d(t,"softmax",(function(){return y.softmax})),n.d(t,"softplus",(function(){return y.softplus})),n.d(t,"spaceToBatchND",(function(){return y.spaceToBatchND})),n.d(t,"fft",(function(){return y.fft})),n.d(t,"ifft",(function(){return y.ifft})),n.d(t,"irfft",(function(){return y.irfft})),n.d(t,"rfft",(function(){return y.rfft})),n.d(t,"split",(function(){return y.split})),n.d(t,"sqrt",(function(){return y.sqrt})),n.d(t,"square",(function(){return y.square})),n.d(t,"squaredDifference",(function(){return y.squaredDifference})),n.d(t,"squeeze",(function(){return y.squeeze})),n.d(t,"stack",(function(){return y.stack})),n.d(t,"step",(function(){return y.step})),n.d(t,"stridedSlice",(function(){return y.stridedSlice})),n.d(t,"sub",(function(){return y.sub})),n.d(t,"sum",(function(){return y.sum})),n.d(t,"tan",(function(){return y.tan})),n.d(t,"tanh",(function(){return y.tanh})),n.d(t,"tensor",(function(){return y.tensor})),n.d(t,"tensor1d",(function(){return y.tensor1d})),n.d(t,"tensor2d",(function(){return y.tensor2d})),n.d(t,"tensor3d",(function(){return y.tensor3d})),n.d(t,"tensor4d",(function(){return y.tensor4d})),n.d(t,"tensor5d",(function(){return y.tensor5d})),n.d(t,"tensor6d",(function(){return y.tensor6d})),n.d(t,"tile",(function(){return y.tile})),n.d(t,"topk",(function(){return y.topk})),n.d(t,"truncatedNormal",(function(){return y.truncatedNormal})),n.d(t,"unique",(function(){return y.unique})),n.d(t,"unsortedSegmentSum",(function(){return y.unsortedSegmentSum})),n.d(t,"unstack",(function(){return y.unstack})),n.d(t,"variable",(function(){return y.variable})),n.d(t,"where",(function(){return y.where})),n.d(t,"whereAsync",(function(){return y.whereAsync})),n.d(t,"zeros",(function(){return y.zeros})),n.d(t,"zerosLike",(function(){return y.zerosLike})),n.d(t,"booleanMaskAsync",(function(){return y.booleanMaskAsync})),n.d(t,"transpose",(function(){return y.transpose})),n.d(t,"norm",(function(){return y.norm})),n.d(t,"movingAverage",(function(){return y.movingAverage})),n.d(t,"scatterND",(function(){return y.scatterND})),n.d(t,"sparseToDense",(function(){return y.sparseToDense})),n.d(t,"gatherND",(function(){return y.gatherND})),n.d(t,"dropout",(function(){return y.dropout})),n.d(t,"enclosingPowerOfTwo",(function(){return y.enclosingPowerOfTwo})),n.d(t,"cosineWindow",(function(){return y.cosineWindow})),n.d(t,"inTopKAsync",(function(){return y.inTopKAsync})),n.d(t,"op",(function(){return y.op})),n.d(t,"OP_SCOPE_SUFFIX",(function(){return y.OP_SCOPE_SUFFIX})),n.d(t,"image",(function(){return y.image})),n.d(t,"linalg",(function(){return y.linalg})),n.d(t,"losses",(function(){return y.losses})),n.d(t,"spectral",(function(){return y.spectral})),n.d(t,"fused",(function(){return y.fused})),n.d(t,"signal",(function(){return y.signal})),n.d(t,"sparse",(function(){return y.sparse})),n.d(t,"string",(function(){return y.string}));var O=n(/*! ./ops/loss_ops_utils */"./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js");n.d(t,"Reduction",(function(){return O.Reduction}));var I=n(/*! ./train */"./node_modules/@tensorflow/tfjs-core/dist/train.js");n.d(t,"train",(function(){return I.train}));var C=n(/*! ./globals */"./node_modules/@tensorflow/tfjs-core/dist/globals.js");n.d(t,"enableProdMode",(function(){return C.enableProdMode})),n.d(t,"enableDebugMode",(function(){return C.enableDebugMode})),n.d(t,"disableDeprecationWarnings",(function(){return C.disableDeprecationWarnings})),n.d(t,"deprecationWarn",(function(){return C.deprecationWarn})),n.d(t,"disposeVariables",(function(){return C.disposeVariables})),n.d(t,"engine",(function(){return C.engine})),n.d(t,"memory",(function(){return C.memory})),n.d(t,"profile",(function(){return C.profile})),n.d(t,"tidy",(function(){return C.tidy})),n.d(t,"dispose",(function(){return C.dispose})),n.d(t,"keep",(function(){return C.keep})),n.d(t,"time",(function(){return C.time})),n.d(t,"setBackend",(function(){return C.setBackend})),n.d(t,"ready",(function(){return C.ready})),n.d(t,"getBackend",(function(){return C.getBackend})),n.d(t,"removeBackend",(function(){return C.removeBackend})),n.d(t,"findBackend",(function(){return C.findBackend})),n.d(t,"findBackendFactory",(function(){return C.findBackendFactory})),n.d(t,"registerBackend",(function(){return C.registerBackend})),n.d(t,"backend",(function(){return C.backend})),n.d(t,"setPlatform",(function(){return C.setPlatform}));var S=n(/*! ./kernel_registry */"./node_modules/@tensorflow/tfjs-core/dist/kernel_registry.js");n.d(t,"getKernel",(function(){return S.getKernel})),n.d(t,"getGradient",(function(){return S.getGradient})),n.d(t,"getKernelsForBackend",(function(){return S.getKernelsForBackend})),n.d(t,"registerKernel",(function(){return S.registerKernel})),n.d(t,"registerGradient",(function(){return S.registerGradient})),n.d(t,"unregisterKernel",(function(){return S.unregisterKernel})),n.d(t,"unregisterGradient",(function(){return S.unregisterGradient})),n.d(t,"copyRegisteredKernels",(function(){return S.copyRegisteredKernels}));var T=n(/*! ./gradients */"./node_modules/@tensorflow/tfjs-core/dist/gradients.js");n.d(t,"customGrad",(function(){return T.customGrad})),n.d(t,"grad",(function(){return T.grad})),n.d(t,"grads",(function(){return T.grads})),n.d(t,"valueAndGrad",(function(){return T.valueAndGrad})),n.d(t,"valueAndGrads",(function(){return T.valueAndGrads})),n.d(t,"variableGrads",(function(){return T.variableGrads}));var N=n(/*! ./environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js");n.d(t,"Environment",(function(){return N.Environment})),n.d(t,"env",(function(){return N.env})),n.d(t,"ENV",(function(){return N.ENV}));var E=n(/*! ./browser_util */"./node_modules/@tensorflow/tfjs-core/dist/browser_util.js");n.d(t,"nextFrame",(function(){return E.nextFrame}));var A=n(/*! ./backends/backend_util */"./node_modules/@tensorflow/tfjs-core/dist/backends/backend_util.js");n.d(t,"backend_util",(function(){return A}));var R=n(/*! ./device_util */"./node_modules/@tensorflow/tfjs-core/dist/device_util.js");n.d(t,"device_util",(function(){return R}));var F=n(/*! ./backends/kernel_impls */"./node_modules/@tensorflow/tfjs-core/dist/backends/kernel_impls.js");n.d(t,"kernel_impls",(function(){return F}));var $=n(/*! ./backends/backend */"./node_modules/@tensorflow/tfjs-core/dist/backends/backend.js");n.d(t,"KernelBackend",(function(){return $.KernelBackend})),n.d(t,"DataStorage",(function(){return $.DataStorage}));var M=n(/*! ./kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js");n.d(t,"Abs",(function(){return M.Abs})),n.d(t,"Acos",(function(){return M.Acos})),n.d(t,"Acosh",(function(){return M.Acosh})),n.d(t,"Add",(function(){return M.Add})),n.d(t,"AddN",(function(){return M.AddN})),n.d(t,"All",(function(){return M.All})),n.d(t,"Any",(function(){return M.Any})),n.d(t,"ArgMax",(function(){return M.ArgMax})),n.d(t,"ArgMin",(function(){return M.ArgMin})),n.d(t,"Asin",(function(){return M.Asin})),n.d(t,"Asinh",(function(){return M.Asinh})),n.d(t,"Atan",(function(){return M.Atan})),n.d(t,"Atanh",(function(){return M.Atanh})),n.d(t,"Atan2",(function(){return M.Atan2})),n.d(t,"AvgPool",(function(){return M.AvgPool})),n.d(t,"AvgPoolGrad",(function(){return M.AvgPoolGrad})),n.d(t,"AvgPool3D",(function(){return M.AvgPool3D})),n.d(t,"AvgPool3DGrad",(function(){return M.AvgPool3DGrad})),n.d(t,"BatchMatMul",(function(){return M.BatchMatMul})),n.d(t,"BatchToSpaceND",(function(){return M.BatchToSpaceND})),n.d(t,"Bincount",(function(){return M.Bincount})),n.d(t,"BroadcastTo",(function(){return M.BroadcastTo})),n.d(t,"Cast",(function(){return M.Cast})),n.d(t,"Ceil",(function(){return M.Ceil})),n.d(t,"ClipByValue",(function(){return M.ClipByValue})),n.d(t,"Complex",(function(){return M.Complex})),n.d(t,"ComplexAbs",(function(){return M.ComplexAbs})),n.d(t,"Concat",(function(){return M.Concat})),n.d(t,"Conv2D",(function(){return M.Conv2D})),n.d(t,"Conv2DBackpropFilter",(function(){return M.Conv2DBackpropFilter})),n.d(t,"Conv2DBackpropInput",(function(){return M.Conv2DBackpropInput})),n.d(t,"Conv3D",(function(){return M.Conv3D})),n.d(t,"Conv3DBackpropFilterV2",(function(){return M.Conv3DBackpropFilterV2})),n.d(t,"Conv3DBackpropInputV2",(function(){return M.Conv3DBackpropInputV2})),n.d(t,"Cos",(function(){return M.Cos})),n.d(t,"Cosh",(function(){return M.Cosh})),n.d(t,"Cumsum",(function(){return M.Cumsum})),n.d(t,"CropAndResize",(function(){return M.CropAndResize})),n.d(t,"DenseBincount",(function(){return M.DenseBincount})),n.d(t,"DepthToSpace",(function(){return M.DepthToSpace})),n.d(t,"DepthwiseConv2dNative",(function(){return M.DepthwiseConv2dNative})),n.d(t,"DepthwiseConv2dNativeBackpropFilter",(function(){return M.DepthwiseConv2dNativeBackpropFilter})),n.d(t,"DepthwiseConv2dNativeBackpropInput",(function(){return M.DepthwiseConv2dNativeBackpropInput})),n.d(t,"Diag",(function(){return M.Diag})),n.d(t,"Dilation2D",(function(){return M.Dilation2D})),n.d(t,"Dilation2DBackpropInput",(function(){return M.Dilation2DBackpropInput})),n.d(t,"Dilation2DBackpropFilter",(function(){return M.Dilation2DBackpropFilter})),n.d(t,"RealDiv",(function(){return M.RealDiv})),n.d(t,"Einsum",(function(){return M.Einsum})),n.d(t,"Elu",(function(){return M.Elu})),n.d(t,"EluGrad",(function(){return M.EluGrad})),n.d(t,"Erf",(function(){return M.Erf})),n.d(t,"Equal",(function(){return M.Equal})),n.d(t,"Exp",(function(){return M.Exp})),n.d(t,"ExpandDims",(function(){return M.ExpandDims})),n.d(t,"Expm1",(function(){return M.Expm1})),n.d(t,"FFT",(function(){return M.FFT})),n.d(t,"Fill",(function(){return M.Fill})),n.d(t,"FlipLeftRight",(function(){return M.FlipLeftRight})),n.d(t,"Floor",(function(){return M.Floor})),n.d(t,"FloorDiv",(function(){return M.FloorDiv})),n.d(t,"FusedBatchNorm",(function(){return M.FusedBatchNorm})),n.d(t,"GatherV2",(function(){return M.GatherV2})),n.d(t,"GatherNd",(function(){return M.GatherNd})),n.d(t,"Greater",(function(){return M.Greater})),n.d(t,"GreaterEqual",(function(){return M.GreaterEqual})),n.d(t,"Identity",(function(){return M.Identity})),n.d(t,"IFFT",(function(){return M.IFFT})),n.d(t,"Imag",(function(){return M.Imag})),n.d(t,"IsFinite",(function(){return M.IsFinite})),n.d(t,"IsInf",(function(){return M.IsInf})),n.d(t,"IsNan",(function(){return M.IsNan})),n.d(t,"LeakyRelu",(function(){return M.LeakyRelu})),n.d(t,"Less",(function(){return M.Less})),n.d(t,"LessEqual",(function(){return M.LessEqual})),n.d(t,"LinSpace",(function(){return M.LinSpace})),n.d(t,"Log",(function(){return M.Log})),n.d(t,"Log1p",(function(){return M.Log1p})),n.d(t,"LogicalAnd",(function(){return M.LogicalAnd})),n.d(t,"LogicalNot",(function(){return M.LogicalNot})),n.d(t,"LogicalOr",(function(){return M.LogicalOr})),n.d(t,"LogSoftmax",(function(){return M.LogSoftmax})),n.d(t,"LRN",(function(){return M.LRN})),n.d(t,"LRNGrad",(function(){return M.LRNGrad})),n.d(t,"Max",(function(){return M.Max})),n.d(t,"Maximum",(function(){return M.Maximum})),n.d(t,"MaxPool",(function(){return M.MaxPool})),n.d(t,"MaxPoolGrad",(function(){return M.MaxPoolGrad})),n.d(t,"MaxPool3D",(function(){return M.MaxPool3D})),n.d(t,"MaxPool3DGrad",(function(){return M.MaxPool3DGrad})),n.d(t,"MaxPoolWithArgmax",(function(){return M.MaxPoolWithArgmax})),n.d(t,"Mean",(function(){return M.Mean})),n.d(t,"Min",(function(){return M.Min})),n.d(t,"Minimum",(function(){return M.Minimum})),n.d(t,"MirrorPad",(function(){return M.MirrorPad})),n.d(t,"Mod",(function(){return M.Mod})),n.d(t,"Multinomial",(function(){return M.Multinomial})),n.d(t,"Multiply",(function(){return M.Multiply})),n.d(t,"Neg",(function(){return M.Neg})),n.d(t,"NotEqual",(function(){return M.NotEqual})),n.d(t,"NonMaxSuppressionV3",(function(){return M.NonMaxSuppressionV3})),n.d(t,"NonMaxSuppressionV4",(function(){return M.NonMaxSuppressionV4})),n.d(t,"NonMaxSuppressionV5",(function(){return M.NonMaxSuppressionV5})),n.d(t,"OnesLike",(function(){return M.OnesLike})),n.d(t,"OneHot",(function(){return M.OneHot})),n.d(t,"Pack",(function(){return M.Pack})),n.d(t,"PadV2",(function(){return M.PadV2})),n.d(t,"Pool",(function(){return M.Pool})),n.d(t,"Pow",(function(){return M.Pow})),n.d(t,"Prelu",(function(){return M.Prelu})),n.d(t,"Prod",(function(){return M.Prod})),n.d(t,"Range",(function(){return M.Range})),n.d(t,"Real",(function(){return M.Real})),n.d(t,"Reciprocal",(function(){return M.Reciprocal})),n.d(t,"Relu",(function(){return M.Relu})),n.d(t,"Reshape",(function(){return M.Reshape})),n.d(t,"ResizeNearestNeighbor",(function(){return M.ResizeNearestNeighbor})),n.d(t,"ResizeNearestNeighborGrad",(function(){return M.ResizeNearestNeighborGrad})),n.d(t,"ResizeBilinear",(function(){return M.ResizeBilinear})),n.d(t,"ResizeBilinearGrad",(function(){return M.ResizeBilinearGrad})),n.d(t,"Relu6",(function(){return M.Relu6})),n.d(t,"Reverse",(function(){return M.Reverse})),n.d(t,"Round",(function(){return M.Round})),n.d(t,"Rsqrt",(function(){return M.Rsqrt})),n.d(t,"ScatterNd",(function(){return M.ScatterNd})),n.d(t,"Select",(function(){return M.Select})),n.d(t,"Selu",(function(){return M.Selu})),n.d(t,"Slice",(function(){return M.Slice})),n.d(t,"Sin",(function(){return M.Sin})),n.d(t,"Sinh",(function(){return M.Sinh})),n.d(t,"Sign",(function(){return M.Sign})),n.d(t,"Sigmoid",(function(){return M.Sigmoid})),n.d(t,"Softplus",(function(){return M.Softplus})),n.d(t,"Sqrt",(function(){return M.Sqrt})),n.d(t,"Sum",(function(){return M.Sum})),n.d(t,"SpaceToBatchND",(function(){return M.SpaceToBatchND})),n.d(t,"SplitV",(function(){return M.SplitV})),n.d(t,"Softmax",(function(){return M.Softmax})),n.d(t,"SparseFillEmptyRows",(function(){return M.SparseFillEmptyRows})),n.d(t,"SparseReshape",(function(){return M.SparseReshape})),n.d(t,"SparseSegmentMean",(function(){return M.SparseSegmentMean})),n.d(t,"SparseSegmentSum",(function(){return M.SparseSegmentSum})),n.d(t,"SparseToDense",(function(){return M.SparseToDense})),n.d(t,"SquaredDifference",(function(){return M.SquaredDifference})),n.d(t,"Square",(function(){return M.Square})),n.d(t,"StridedSlice",(function(){return M.StridedSlice})),n.d(t,"StringNGrams",(function(){return M.StringNGrams})),n.d(t,"StringSplit",(function(){return M.StringSplit})),n.d(t,"StringToHashBucketFast",(function(){return M.StringToHashBucketFast})),n.d(t,"Sub",(function(){return M.Sub})),n.d(t,"Tan",(function(){return M.Tan})),n.d(t,"Tanh",(function(){return M.Tanh})),n.d(t,"Tile",(function(){return M.Tile})),n.d(t,"TopK",(function(){return M.TopK})),n.d(t,"Transform",(function(){return M.Transform})),n.d(t,"Transpose",(function(){return M.Transpose})),n.d(t,"Unique",(function(){return M.Unique})),n.d(t,"Unpack",(function(){return M.Unpack})),n.d(t,"UnsortedSegmentSum",(function(){return M.UnsortedSegmentSum})),n.d(t,"ZerosLike",(function(){return M.ZerosLike})),n.d(t,"Step",(function(){return M.Step})),n.d(t,"FromPixels",(function(){return M.FromPixels})),n.d(t,"RotateWithOffset",(function(){return M.RotateWithOffset})),n.d(t,"_FusedMatMul",(function(){return M._FusedMatMul})),n.d(t,"FusedConv2D",(function(){return M.FusedConv2D})),n.d(t,"FusedDepthwiseConv2D",(function(){return M.FusedDepthwiseConv2D}))},"./node_modules/@tensorflow/tfjs-core/dist/base_side_effects.js": +/*! exports provided: AdadeltaOptimizer, AdagradOptimizer, AdamOptimizer, AdamaxOptimizer, MomentumOptimizer, Optimizer, RMSPropOptimizer, SGDOptimizer, Tensor, TensorBuffer, Variable, Rank, sumOutType, upcastType, abs, acos, acosh, add, addN, all, any, argMax, argMin, asin, asinh, atan, atan2, atanh, avgPool, avgPool3d, basicLSTMCell, batchToSpaceND, batchNorm, batchNorm2d, batchNorm3d, batchNorm4d, bincount, broadcastTo, buffer, cast, ceil, clipByValue, clone, complex, concat, concat1d, concat2d, concat3d, concat4d, conv1d, conv2d, conv2dTranspose, conv3d, conv3dTranspose, cos, cosh, cumsum, denseBincount, depthToSpace, depthwiseConv2d, diag, dilation2d, div, divNoNan, dot, einsum, elu, equal, erf, exp, expandDims, expm1, eye, fill, floor, floorDiv, gather, greater, greaterEqual, imag, isFinite, isInf, isNaN, leakyRelu, less, lessEqual, linspace, localResponseNormalization, log, log1p, logSigmoid, logSoftmax, logSumExp, logicalAnd, logicalNot, logicalOr, logicalXor, matMul, max, maxPool, maxPool3d, maxPoolWithArgmax, maximum, mean, meshgrid, min, minimum, mirrorPad, mod, moments, mul, multiRNNCell, multinomial, neg, notEqual, oneHot, ones, onesLike, outerProduct, pad, pad1d, pad2d, pad3d, pad4d, pool, pow, prelu, print, prod, rand, randomGamma, randomNormal, randomUniform, range, real, reciprocal, relu, relu6, reshape, reverse, reverse1d, reverse2d, reverse3d, reverse4d, round, rsqrt, scalar, selu, separableConv2d, setdiff1dAsync, sigmoid, sign, sin, sinh, slice, slice1d, slice2d, slice3d, slice4d, softmax, softplus, spaceToBatchND, fft, ifft, irfft, rfft, split, sqrt, square, squaredDifference, squeeze, stack, step, stridedSlice, sub, sum, tan, tanh, tensor, tensor1d, tensor2d, tensor3d, tensor4d, tensor5d, tensor6d, tile, topk, truncatedNormal, unique, unsortedSegmentSum, unstack, variable, where, whereAsync, zeros, zerosLike, booleanMaskAsync, transpose, norm, movingAverage, scatterND, sparseToDense, gatherND, dropout, enclosingPowerOfTwo, cosineWindow, inTopKAsync, op, OP_SCOPE_SUFFIX, image, linalg, losses, spectral, fused, signal, sparse, string, Reduction, train, enableProdMode, enableDebugMode, disableDeprecationWarnings, deprecationWarn, disposeVariables, engine, memory, profile, tidy, dispose, keep, time, setBackend, ready, getBackend, removeBackend, findBackend, findBackendFactory, registerBackend, backend, setPlatform, getKernel, getGradient, getKernelsForBackend, registerKernel, registerGradient, unregisterKernel, unregisterGradient, copyRegisteredKernels, customGrad, grad, grads, valueAndGrad, valueAndGrads, variableGrads, Environment, env, ENV, version_core, nextFrame, browser, io, math, serialization, test_util, util, backend_util, tensor_util, slice_util, gather_util, scatter_util, device_util, kernel_impls, KernelBackend, DataStorage, Abs, Acos, Acosh, Add, AddN, All, Any, ArgMax, ArgMin, Asin, Asinh, Atan, Atanh, Atan2, AvgPool, AvgPoolGrad, AvgPool3D, AvgPool3DGrad, BatchMatMul, BatchToSpaceND, Bincount, BroadcastTo, Cast, Ceil, ClipByValue, Complex, ComplexAbs, Concat, Conv2D, Conv2DBackpropFilter, Conv2DBackpropInput, Conv3D, Conv3DBackpropFilterV2, Conv3DBackpropInputV2, Cos, Cosh, Cumsum, CropAndResize, DenseBincount, DepthToSpace, DepthwiseConv2dNative, DepthwiseConv2dNativeBackpropFilter, DepthwiseConv2dNativeBackpropInput, Diag, Dilation2D, Dilation2DBackpropInput, Dilation2DBackpropFilter, RealDiv, Einsum, Elu, EluGrad, Erf, Equal, Exp, ExpandDims, Expm1, FFT, Fill, FlipLeftRight, Floor, FloorDiv, FusedBatchNorm, GatherV2, GatherNd, Greater, GreaterEqual, Identity, IFFT, Imag, IsFinite, IsInf, IsNan, LeakyRelu, Less, LessEqual, LinSpace, Log, Log1p, LogicalAnd, LogicalNot, LogicalOr, LogSoftmax, LRN, LRNGrad, Max, Maximum, MaxPool, MaxPoolGrad, MaxPool3D, MaxPool3DGrad, MaxPoolWithArgmax, Mean, Min, Minimum, MirrorPad, Mod, Multinomial, Multiply, Neg, NotEqual, NonMaxSuppressionV3, NonMaxSuppressionV4, NonMaxSuppressionV5, OnesLike, OneHot, Pack, PadV2, Pool, Pow, Prelu, Prod, Range, Real, Reciprocal, Relu, Reshape, ResizeNearestNeighbor, ResizeNearestNeighborGrad, ResizeBilinear, ResizeBilinearGrad, Relu6, Reverse, Round, Rsqrt, ScatterNd, Select, Selu, Slice, Sin, Sinh, Sign, Sigmoid, Softplus, Sqrt, Sum, SpaceToBatchND, SplitV, Softmax, SparseFillEmptyRows, SparseReshape, SparseSegmentMean, SparseSegmentSum, SparseToDense, SquaredDifference, Square, StridedSlice, StringNGrams, StringSplit, StringToHashBucketFast, Sub, Tan, Tanh, Tile, TopK, Transform, Transpose, Unique, Unpack, UnsortedSegmentSum, ZerosLike, Step, FromPixels, RotateWithOffset, _FusedMatMul, FusedConv2D, FusedDepthwiseConv2D */function(e,t,n){"use strict";n.r(t);var s=n(/*! ./io/io */"./node_modules/@tensorflow/tfjs-core/dist/io/io.js");n.d(t,"io",(function(){return s}));var o=n(/*! ./math */"./node_modules/@tensorflow/tfjs-core/dist/math.js");n.d(t,"math",(function(){return o}));var r=n(/*! ./ops/browser */"./node_modules/@tensorflow/tfjs-core/dist/ops/browser.js");n.d(t,"browser",(function(){return r}));var i=n(/*! ./ops/gather_nd_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/gather_nd_util.js");n.d(t,"gather_util",(function(){return i}));var a=n(/*! ./ops/scatter_nd_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/scatter_nd_util.js");n.d(t,"scatter_util",(function(){return a}));var u=n(/*! ./ops/slice_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice_util.js");n.d(t,"slice_util",(function(){return u}));var d=n(/*! ./serialization */"./node_modules/@tensorflow/tfjs-core/dist/serialization.js");n.d(t,"serialization",(function(){return d}));var l=n(/*! ./tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js");n.d(t,"tensor_util",(function(){return l}));var c=n(/*! ./test_util */"./node_modules/@tensorflow/tfjs-core/dist/test_util.js");n.d(t,"test_util",(function(){return c}));var f=n(/*! ./util */"./node_modules/@tensorflow/tfjs-core/dist/util.js");n.d(t,"util",(function(){return f}));var p=n(/*! ./version */"./node_modules/@tensorflow/tfjs-core/dist/version.js");n.d(t,"version_core",(function(){return p.version}));var m=n(/*! ./optimizers/adadelta_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/adadelta_optimizer.js");n.d(t,"AdadeltaOptimizer",(function(){return m.AdadeltaOptimizer}));var h=n(/*! ./optimizers/adagrad_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/adagrad_optimizer.js");n.d(t,"AdagradOptimizer",(function(){return h.AdagradOptimizer}));var b=n(/*! ./optimizers/adam_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/adam_optimizer.js");n.d(t,"AdamOptimizer",(function(){return b.AdamOptimizer}));var j=n(/*! ./optimizers/adamax_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/adamax_optimizer.js");n.d(t,"AdamaxOptimizer",(function(){return j.AdamaxOptimizer}));var g=n(/*! ./optimizers/momentum_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/momentum_optimizer.js");n.d(t,"MomentumOptimizer",(function(){return g.MomentumOptimizer}));var w=n(/*! ./optimizers/optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer.js");n.d(t,"Optimizer",(function(){return w.Optimizer}));var _=n(/*! ./optimizers/rmsprop_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/rmsprop_optimizer.js");n.d(t,"RMSPropOptimizer",(function(){return _.RMSPropOptimizer}));var k=n(/*! ./optimizers/sgd_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/sgd_optimizer.js");n.d(t,"SGDOptimizer",(function(){return k.SGDOptimizer}));var v=n(/*! ./tensor */"./node_modules/@tensorflow/tfjs-core/dist/tensor.js");n.d(t,"Tensor",(function(){return v.Tensor})),n.d(t,"TensorBuffer",(function(){return v.TensorBuffer})),n.d(t,"Variable",(function(){return v.Variable}));var x=n(/*! ./types */"./node_modules/@tensorflow/tfjs-core/dist/types.js");n.d(t,"Rank",(function(){return x.Rank})),n.d(t,"sumOutType",(function(){return x.sumOutType})),n.d(t,"upcastType",(function(){return x.upcastType}));var y=n(/*! ./ops/ops */"./node_modules/@tensorflow/tfjs-core/dist/ops/ops.js");n.d(t,"abs",(function(){return y.abs})),n.d(t,"acos",(function(){return y.acos})),n.d(t,"acosh",(function(){return y.acosh})),n.d(t,"add",(function(){return y.add})),n.d(t,"addN",(function(){return y.addN})),n.d(t,"all",(function(){return y.all})),n.d(t,"any",(function(){return y.any})),n.d(t,"argMax",(function(){return y.argMax})),n.d(t,"argMin",(function(){return y.argMin})),n.d(t,"asin",(function(){return y.asin})),n.d(t,"asinh",(function(){return y.asinh})),n.d(t,"atan",(function(){return y.atan})),n.d(t,"atan2",(function(){return y.atan2})),n.d(t,"atanh",(function(){return y.atanh})),n.d(t,"avgPool",(function(){return y.avgPool})),n.d(t,"avgPool3d",(function(){return y.avgPool3d})),n.d(t,"basicLSTMCell",(function(){return y.basicLSTMCell})),n.d(t,"batchToSpaceND",(function(){return y.batchToSpaceND})),n.d(t,"batchNorm",(function(){return y.batchNorm})),n.d(t,"batchNorm2d",(function(){return y.batchNorm2d})),n.d(t,"batchNorm3d",(function(){return y.batchNorm3d})),n.d(t,"batchNorm4d",(function(){return y.batchNorm4d})),n.d(t,"bincount",(function(){return y.bincount})),n.d(t,"broadcastTo",(function(){return y.broadcastTo})),n.d(t,"buffer",(function(){return y.buffer})),n.d(t,"cast",(function(){return y.cast})),n.d(t,"ceil",(function(){return y.ceil})),n.d(t,"clipByValue",(function(){return y.clipByValue})),n.d(t,"clone",(function(){return y.clone})),n.d(t,"complex",(function(){return y.complex})),n.d(t,"concat",(function(){return y.concat})),n.d(t,"concat1d",(function(){return y.concat1d})),n.d(t,"concat2d",(function(){return y.concat2d})),n.d(t,"concat3d",(function(){return y.concat3d})),n.d(t,"concat4d",(function(){return y.concat4d})),n.d(t,"conv1d",(function(){return y.conv1d})),n.d(t,"conv2d",(function(){return y.conv2d})),n.d(t,"conv2dTranspose",(function(){return y.conv2dTranspose})),n.d(t,"conv3d",(function(){return y.conv3d})),n.d(t,"conv3dTranspose",(function(){return y.conv3dTranspose})),n.d(t,"cos",(function(){return y.cos})),n.d(t,"cosh",(function(){return y.cosh})),n.d(t,"cumsum",(function(){return y.cumsum})),n.d(t,"denseBincount",(function(){return y.denseBincount})),n.d(t,"depthToSpace",(function(){return y.depthToSpace})),n.d(t,"depthwiseConv2d",(function(){return y.depthwiseConv2d})),n.d(t,"diag",(function(){return y.diag})),n.d(t,"dilation2d",(function(){return y.dilation2d})),n.d(t,"div",(function(){return y.div})),n.d(t,"divNoNan",(function(){return y.divNoNan})),n.d(t,"dot",(function(){return y.dot})),n.d(t,"einsum",(function(){return y.einsum})),n.d(t,"elu",(function(){return y.elu})),n.d(t,"equal",(function(){return y.equal})),n.d(t,"erf",(function(){return y.erf})),n.d(t,"exp",(function(){return y.exp})),n.d(t,"expandDims",(function(){return y.expandDims})),n.d(t,"expm1",(function(){return y.expm1})),n.d(t,"eye",(function(){return y.eye})),n.d(t,"fill",(function(){return y.fill})),n.d(t,"floor",(function(){return y.floor})),n.d(t,"floorDiv",(function(){return y.floorDiv})),n.d(t,"gather",(function(){return y.gather})),n.d(t,"greater",(function(){return y.greater})),n.d(t,"greaterEqual",(function(){return y.greaterEqual})),n.d(t,"imag",(function(){return y.imag})),n.d(t,"isFinite",(function(){return y.isFinite})),n.d(t,"isInf",(function(){return y.isInf})),n.d(t,"isNaN",(function(){return y.isNaN})),n.d(t,"leakyRelu",(function(){return y.leakyRelu})),n.d(t,"less",(function(){return y.less})),n.d(t,"lessEqual",(function(){return y.lessEqual})),n.d(t,"linspace",(function(){return y.linspace})),n.d(t,"localResponseNormalization",(function(){return y.localResponseNormalization})),n.d(t,"log",(function(){return y.log})),n.d(t,"log1p",(function(){return y.log1p})),n.d(t,"logSigmoid",(function(){return y.logSigmoid})),n.d(t,"logSoftmax",(function(){return y.logSoftmax})),n.d(t,"logSumExp",(function(){return y.logSumExp})),n.d(t,"logicalAnd",(function(){return y.logicalAnd})),n.d(t,"logicalNot",(function(){return y.logicalNot})),n.d(t,"logicalOr",(function(){return y.logicalOr})),n.d(t,"logicalXor",(function(){return y.logicalXor})),n.d(t,"matMul",(function(){return y.matMul})),n.d(t,"max",(function(){return y.max})),n.d(t,"maxPool",(function(){return y.maxPool})),n.d(t,"maxPool3d",(function(){return y.maxPool3d})),n.d(t,"maxPoolWithArgmax",(function(){return y.maxPoolWithArgmax})),n.d(t,"maximum",(function(){return y.maximum})),n.d(t,"mean",(function(){return y.mean})),n.d(t,"meshgrid",(function(){return y.meshgrid})),n.d(t,"min",(function(){return y.min})),n.d(t,"minimum",(function(){return y.minimum})),n.d(t,"mirrorPad",(function(){return y.mirrorPad})),n.d(t,"mod",(function(){return y.mod})),n.d(t,"moments",(function(){return y.moments})),n.d(t,"mul",(function(){return y.mul})),n.d(t,"multiRNNCell",(function(){return y.multiRNNCell})),n.d(t,"multinomial",(function(){return y.multinomial})),n.d(t,"neg",(function(){return y.neg})),n.d(t,"notEqual",(function(){return y.notEqual})),n.d(t,"oneHot",(function(){return y.oneHot})),n.d(t,"ones",(function(){return y.ones})),n.d(t,"onesLike",(function(){return y.onesLike})),n.d(t,"outerProduct",(function(){return y.outerProduct})),n.d(t,"pad",(function(){return y.pad})),n.d(t,"pad1d",(function(){return y.pad1d})),n.d(t,"pad2d",(function(){return y.pad2d})),n.d(t,"pad3d",(function(){return y.pad3d})),n.d(t,"pad4d",(function(){return y.pad4d})),n.d(t,"pool",(function(){return y.pool})),n.d(t,"pow",(function(){return y.pow})),n.d(t,"prelu",(function(){return y.prelu})),n.d(t,"print",(function(){return y.print})),n.d(t,"prod",(function(){return y.prod})),n.d(t,"rand",(function(){return y.rand})),n.d(t,"randomGamma",(function(){return y.randomGamma})),n.d(t,"randomNormal",(function(){return y.randomNormal})),n.d(t,"randomUniform",(function(){return y.randomUniform})),n.d(t,"range",(function(){return y.range})),n.d(t,"real",(function(){return y.real})),n.d(t,"reciprocal",(function(){return y.reciprocal})),n.d(t,"relu",(function(){return y.relu})),n.d(t,"relu6",(function(){return y.relu6})),n.d(t,"reshape",(function(){return y.reshape})),n.d(t,"reverse",(function(){return y.reverse})),n.d(t,"reverse1d",(function(){return y.reverse1d})),n.d(t,"reverse2d",(function(){return y.reverse2d})),n.d(t,"reverse3d",(function(){return y.reverse3d})),n.d(t,"reverse4d",(function(){return y.reverse4d})),n.d(t,"round",(function(){return y.round})),n.d(t,"rsqrt",(function(){return y.rsqrt})),n.d(t,"scalar",(function(){return y.scalar})),n.d(t,"selu",(function(){return y.selu})),n.d(t,"separableConv2d",(function(){return y.separableConv2d})),n.d(t,"setdiff1dAsync",(function(){return y.setdiff1dAsync})),n.d(t,"sigmoid",(function(){return y.sigmoid})),n.d(t,"sign",(function(){return y.sign})),n.d(t,"sin",(function(){return y.sin})),n.d(t,"sinh",(function(){return y.sinh})),n.d(t,"slice",(function(){return y.slice})),n.d(t,"slice1d",(function(){return y.slice1d})),n.d(t,"slice2d",(function(){return y.slice2d})),n.d(t,"slice3d",(function(){return y.slice3d})),n.d(t,"slice4d",(function(){return y.slice4d})),n.d(t,"softmax",(function(){return y.softmax})),n.d(t,"softplus",(function(){return y.softplus})),n.d(t,"spaceToBatchND",(function(){return y.spaceToBatchND})),n.d(t,"fft",(function(){return y.fft})),n.d(t,"ifft",(function(){return y.ifft})),n.d(t,"irfft",(function(){return y.irfft})),n.d(t,"rfft",(function(){return y.rfft})),n.d(t,"split",(function(){return y.split})),n.d(t,"sqrt",(function(){return y.sqrt})),n.d(t,"square",(function(){return y.square})),n.d(t,"squaredDifference",(function(){return y.squaredDifference})),n.d(t,"squeeze",(function(){return y.squeeze})),n.d(t,"stack",(function(){return y.stack})),n.d(t,"step",(function(){return y.step})),n.d(t,"stridedSlice",(function(){return y.stridedSlice})),n.d(t,"sub",(function(){return y.sub})),n.d(t,"sum",(function(){return y.sum})),n.d(t,"tan",(function(){return y.tan})),n.d(t,"tanh",(function(){return y.tanh})),n.d(t,"tensor",(function(){return y.tensor})),n.d(t,"tensor1d",(function(){return y.tensor1d})),n.d(t,"tensor2d",(function(){return y.tensor2d})),n.d(t,"tensor3d",(function(){return y.tensor3d})),n.d(t,"tensor4d",(function(){return y.tensor4d})),n.d(t,"tensor5d",(function(){return y.tensor5d})),n.d(t,"tensor6d",(function(){return y.tensor6d})),n.d(t,"tile",(function(){return y.tile})),n.d(t,"topk",(function(){return y.topk})),n.d(t,"truncatedNormal",(function(){return y.truncatedNormal})),n.d(t,"unique",(function(){return y.unique})),n.d(t,"unsortedSegmentSum",(function(){return y.unsortedSegmentSum})),n.d(t,"unstack",(function(){return y.unstack})),n.d(t,"variable",(function(){return y.variable})),n.d(t,"where",(function(){return y.where})),n.d(t,"whereAsync",(function(){return y.whereAsync})),n.d(t,"zeros",(function(){return y.zeros})),n.d(t,"zerosLike",(function(){return y.zerosLike})),n.d(t,"booleanMaskAsync",(function(){return y.booleanMaskAsync})),n.d(t,"transpose",(function(){return y.transpose})),n.d(t,"norm",(function(){return y.norm})),n.d(t,"movingAverage",(function(){return y.movingAverage})),n.d(t,"scatterND",(function(){return y.scatterND})),n.d(t,"sparseToDense",(function(){return y.sparseToDense})),n.d(t,"gatherND",(function(){return y.gatherND})),n.d(t,"dropout",(function(){return y.dropout})),n.d(t,"enclosingPowerOfTwo",(function(){return y.enclosingPowerOfTwo})),n.d(t,"cosineWindow",(function(){return y.cosineWindow})),n.d(t,"inTopKAsync",(function(){return y.inTopKAsync})),n.d(t,"op",(function(){return y.op})),n.d(t,"OP_SCOPE_SUFFIX",(function(){return y.OP_SCOPE_SUFFIX})),n.d(t,"image",(function(){return y.image})),n.d(t,"linalg",(function(){return y.linalg})),n.d(t,"losses",(function(){return y.losses})),n.d(t,"spectral",(function(){return y.spectral})),n.d(t,"fused",(function(){return y.fused})),n.d(t,"signal",(function(){return y.signal})),n.d(t,"sparse",(function(){return y.sparse})),n.d(t,"string",(function(){return y.string}));var O=n(/*! ./ops/loss_ops_utils */"./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js");n.d(t,"Reduction",(function(){return O.Reduction}));var I=n(/*! ./train */"./node_modules/@tensorflow/tfjs-core/dist/train.js");n.d(t,"train",(function(){return I.train}));var C=n(/*! ./globals */"./node_modules/@tensorflow/tfjs-core/dist/globals.js");n.d(t,"enableProdMode",(function(){return C.enableProdMode})),n.d(t,"enableDebugMode",(function(){return C.enableDebugMode})),n.d(t,"disableDeprecationWarnings",(function(){return C.disableDeprecationWarnings})),n.d(t,"deprecationWarn",(function(){return C.deprecationWarn})),n.d(t,"disposeVariables",(function(){return C.disposeVariables})),n.d(t,"engine",(function(){return C.engine})),n.d(t,"memory",(function(){return C.memory})),n.d(t,"profile",(function(){return C.profile})),n.d(t,"tidy",(function(){return C.tidy})),n.d(t,"dispose",(function(){return C.dispose})),n.d(t,"keep",(function(){return C.keep})),n.d(t,"time",(function(){return C.time})),n.d(t,"setBackend",(function(){return C.setBackend})),n.d(t,"ready",(function(){return C.ready})),n.d(t,"getBackend",(function(){return C.getBackend})),n.d(t,"removeBackend",(function(){return C.removeBackend})),n.d(t,"findBackend",(function(){return C.findBackend})),n.d(t,"findBackendFactory",(function(){return C.findBackendFactory})),n.d(t,"registerBackend",(function(){return C.registerBackend})),n.d(t,"backend",(function(){return C.backend})),n.d(t,"setPlatform",(function(){return C.setPlatform}));var S=n(/*! ./kernel_registry */"./node_modules/@tensorflow/tfjs-core/dist/kernel_registry.js");n.d(t,"getKernel",(function(){return S.getKernel})),n.d(t,"getGradient",(function(){return S.getGradient})),n.d(t,"getKernelsForBackend",(function(){return S.getKernelsForBackend})),n.d(t,"registerKernel",(function(){return S.registerKernel})),n.d(t,"registerGradient",(function(){return S.registerGradient})),n.d(t,"unregisterKernel",(function(){return S.unregisterKernel})),n.d(t,"unregisterGradient",(function(){return S.unregisterGradient})),n.d(t,"copyRegisteredKernels",(function(){return S.copyRegisteredKernels}));var T=n(/*! ./gradients */"./node_modules/@tensorflow/tfjs-core/dist/gradients.js");n.d(t,"customGrad",(function(){return T.customGrad})),n.d(t,"grad",(function(){return T.grad})),n.d(t,"grads",(function(){return T.grads})),n.d(t,"valueAndGrad",(function(){return T.valueAndGrad})),n.d(t,"valueAndGrads",(function(){return T.valueAndGrads})),n.d(t,"variableGrads",(function(){return T.variableGrads}));var N=n(/*! ./environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js");n.d(t,"Environment",(function(){return N.Environment})),n.d(t,"env",(function(){return N.env})),n.d(t,"ENV",(function(){return N.ENV}));var E=n(/*! ./browser_util */"./node_modules/@tensorflow/tfjs-core/dist/browser_util.js");n.d(t,"nextFrame",(function(){return E.nextFrame}));var A=n(/*! ./backends/backend_util */"./node_modules/@tensorflow/tfjs-core/dist/backends/backend_util.js");n.d(t,"backend_util",(function(){return A}));var R=n(/*! ./device_util */"./node_modules/@tensorflow/tfjs-core/dist/device_util.js");n.d(t,"device_util",(function(){return R}));var F=n(/*! ./backends/kernel_impls */"./node_modules/@tensorflow/tfjs-core/dist/backends/kernel_impls.js");n.d(t,"kernel_impls",(function(){return F}));var M=n(/*! ./backends/backend */"./node_modules/@tensorflow/tfjs-core/dist/backends/backend.js");n.d(t,"KernelBackend",(function(){return M.KernelBackend})),n.d(t,"DataStorage",(function(){return M.DataStorage}));var $=n(/*! ./kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js");n.d(t,"Abs",(function(){return $.Abs})),n.d(t,"Acos",(function(){return $.Acos})),n.d(t,"Acosh",(function(){return $.Acosh})),n.d(t,"Add",(function(){return $.Add})),n.d(t,"AddN",(function(){return $.AddN})),n.d(t,"All",(function(){return $.All})),n.d(t,"Any",(function(){return $.Any})),n.d(t,"ArgMax",(function(){return $.ArgMax})),n.d(t,"ArgMin",(function(){return $.ArgMin})),n.d(t,"Asin",(function(){return $.Asin})),n.d(t,"Asinh",(function(){return $.Asinh})),n.d(t,"Atan",(function(){return $.Atan})),n.d(t,"Atanh",(function(){return $.Atanh})),n.d(t,"Atan2",(function(){return $.Atan2})),n.d(t,"AvgPool",(function(){return $.AvgPool})),n.d(t,"AvgPoolGrad",(function(){return $.AvgPoolGrad})),n.d(t,"AvgPool3D",(function(){return $.AvgPool3D})),n.d(t,"AvgPool3DGrad",(function(){return $.AvgPool3DGrad})),n.d(t,"BatchMatMul",(function(){return $.BatchMatMul})),n.d(t,"BatchToSpaceND",(function(){return $.BatchToSpaceND})),n.d(t,"Bincount",(function(){return $.Bincount})),n.d(t,"BroadcastTo",(function(){return $.BroadcastTo})),n.d(t,"Cast",(function(){return $.Cast})),n.d(t,"Ceil",(function(){return $.Ceil})),n.d(t,"ClipByValue",(function(){return $.ClipByValue})),n.d(t,"Complex",(function(){return $.Complex})),n.d(t,"ComplexAbs",(function(){return $.ComplexAbs})),n.d(t,"Concat",(function(){return $.Concat})),n.d(t,"Conv2D",(function(){return $.Conv2D})),n.d(t,"Conv2DBackpropFilter",(function(){return $.Conv2DBackpropFilter})),n.d(t,"Conv2DBackpropInput",(function(){return $.Conv2DBackpropInput})),n.d(t,"Conv3D",(function(){return $.Conv3D})),n.d(t,"Conv3DBackpropFilterV2",(function(){return $.Conv3DBackpropFilterV2})),n.d(t,"Conv3DBackpropInputV2",(function(){return $.Conv3DBackpropInputV2})),n.d(t,"Cos",(function(){return $.Cos})),n.d(t,"Cosh",(function(){return $.Cosh})),n.d(t,"Cumsum",(function(){return $.Cumsum})),n.d(t,"CropAndResize",(function(){return $.CropAndResize})),n.d(t,"DenseBincount",(function(){return $.DenseBincount})),n.d(t,"DepthToSpace",(function(){return $.DepthToSpace})),n.d(t,"DepthwiseConv2dNative",(function(){return $.DepthwiseConv2dNative})),n.d(t,"DepthwiseConv2dNativeBackpropFilter",(function(){return $.DepthwiseConv2dNativeBackpropFilter})),n.d(t,"DepthwiseConv2dNativeBackpropInput",(function(){return $.DepthwiseConv2dNativeBackpropInput})),n.d(t,"Diag",(function(){return $.Diag})),n.d(t,"Dilation2D",(function(){return $.Dilation2D})),n.d(t,"Dilation2DBackpropInput",(function(){return $.Dilation2DBackpropInput})),n.d(t,"Dilation2DBackpropFilter",(function(){return $.Dilation2DBackpropFilter})),n.d(t,"RealDiv",(function(){return $.RealDiv})),n.d(t,"Einsum",(function(){return $.Einsum})),n.d(t,"Elu",(function(){return $.Elu})),n.d(t,"EluGrad",(function(){return $.EluGrad})),n.d(t,"Erf",(function(){return $.Erf})),n.d(t,"Equal",(function(){return $.Equal})),n.d(t,"Exp",(function(){return $.Exp})),n.d(t,"ExpandDims",(function(){return $.ExpandDims})),n.d(t,"Expm1",(function(){return $.Expm1})),n.d(t,"FFT",(function(){return $.FFT})),n.d(t,"Fill",(function(){return $.Fill})),n.d(t,"FlipLeftRight",(function(){return $.FlipLeftRight})),n.d(t,"Floor",(function(){return $.Floor})),n.d(t,"FloorDiv",(function(){return $.FloorDiv})),n.d(t,"FusedBatchNorm",(function(){return $.FusedBatchNorm})),n.d(t,"GatherV2",(function(){return $.GatherV2})),n.d(t,"GatherNd",(function(){return $.GatherNd})),n.d(t,"Greater",(function(){return $.Greater})),n.d(t,"GreaterEqual",(function(){return $.GreaterEqual})),n.d(t,"Identity",(function(){return $.Identity})),n.d(t,"IFFT",(function(){return $.IFFT})),n.d(t,"Imag",(function(){return $.Imag})),n.d(t,"IsFinite",(function(){return $.IsFinite})),n.d(t,"IsInf",(function(){return $.IsInf})),n.d(t,"IsNan",(function(){return $.IsNan})),n.d(t,"LeakyRelu",(function(){return $.LeakyRelu})),n.d(t,"Less",(function(){return $.Less})),n.d(t,"LessEqual",(function(){return $.LessEqual})),n.d(t,"LinSpace",(function(){return $.LinSpace})),n.d(t,"Log",(function(){return $.Log})),n.d(t,"Log1p",(function(){return $.Log1p})),n.d(t,"LogicalAnd",(function(){return $.LogicalAnd})),n.d(t,"LogicalNot",(function(){return $.LogicalNot})),n.d(t,"LogicalOr",(function(){return $.LogicalOr})),n.d(t,"LogSoftmax",(function(){return $.LogSoftmax})),n.d(t,"LRN",(function(){return $.LRN})),n.d(t,"LRNGrad",(function(){return $.LRNGrad})),n.d(t,"Max",(function(){return $.Max})),n.d(t,"Maximum",(function(){return $.Maximum})),n.d(t,"MaxPool",(function(){return $.MaxPool})),n.d(t,"MaxPoolGrad",(function(){return $.MaxPoolGrad})),n.d(t,"MaxPool3D",(function(){return $.MaxPool3D})),n.d(t,"MaxPool3DGrad",(function(){return $.MaxPool3DGrad})),n.d(t,"MaxPoolWithArgmax",(function(){return $.MaxPoolWithArgmax})),n.d(t,"Mean",(function(){return $.Mean})),n.d(t,"Min",(function(){return $.Min})),n.d(t,"Minimum",(function(){return $.Minimum})),n.d(t,"MirrorPad",(function(){return $.MirrorPad})),n.d(t,"Mod",(function(){return $.Mod})),n.d(t,"Multinomial",(function(){return $.Multinomial})),n.d(t,"Multiply",(function(){return $.Multiply})),n.d(t,"Neg",(function(){return $.Neg})),n.d(t,"NotEqual",(function(){return $.NotEqual})),n.d(t,"NonMaxSuppressionV3",(function(){return $.NonMaxSuppressionV3})),n.d(t,"NonMaxSuppressionV4",(function(){return $.NonMaxSuppressionV4})),n.d(t,"NonMaxSuppressionV5",(function(){return $.NonMaxSuppressionV5})),n.d(t,"OnesLike",(function(){return $.OnesLike})),n.d(t,"OneHot",(function(){return $.OneHot})),n.d(t,"Pack",(function(){return $.Pack})),n.d(t,"PadV2",(function(){return $.PadV2})),n.d(t,"Pool",(function(){return $.Pool})),n.d(t,"Pow",(function(){return $.Pow})),n.d(t,"Prelu",(function(){return $.Prelu})),n.d(t,"Prod",(function(){return $.Prod})),n.d(t,"Range",(function(){return $.Range})),n.d(t,"Real",(function(){return $.Real})),n.d(t,"Reciprocal",(function(){return $.Reciprocal})),n.d(t,"Relu",(function(){return $.Relu})),n.d(t,"Reshape",(function(){return $.Reshape})),n.d(t,"ResizeNearestNeighbor",(function(){return $.ResizeNearestNeighbor})),n.d(t,"ResizeNearestNeighborGrad",(function(){return $.ResizeNearestNeighborGrad})),n.d(t,"ResizeBilinear",(function(){return $.ResizeBilinear})),n.d(t,"ResizeBilinearGrad",(function(){return $.ResizeBilinearGrad})),n.d(t,"Relu6",(function(){return $.Relu6})),n.d(t,"Reverse",(function(){return $.Reverse})),n.d(t,"Round",(function(){return $.Round})),n.d(t,"Rsqrt",(function(){return $.Rsqrt})),n.d(t,"ScatterNd",(function(){return $.ScatterNd})),n.d(t,"Select",(function(){return $.Select})),n.d(t,"Selu",(function(){return $.Selu})),n.d(t,"Slice",(function(){return $.Slice})),n.d(t,"Sin",(function(){return $.Sin})),n.d(t,"Sinh",(function(){return $.Sinh})),n.d(t,"Sign",(function(){return $.Sign})),n.d(t,"Sigmoid",(function(){return $.Sigmoid})),n.d(t,"Softplus",(function(){return $.Softplus})),n.d(t,"Sqrt",(function(){return $.Sqrt})),n.d(t,"Sum",(function(){return $.Sum})),n.d(t,"SpaceToBatchND",(function(){return $.SpaceToBatchND})),n.d(t,"SplitV",(function(){return $.SplitV})),n.d(t,"Softmax",(function(){return $.Softmax})),n.d(t,"SparseFillEmptyRows",(function(){return $.SparseFillEmptyRows})),n.d(t,"SparseReshape",(function(){return $.SparseReshape})),n.d(t,"SparseSegmentMean",(function(){return $.SparseSegmentMean})),n.d(t,"SparseSegmentSum",(function(){return $.SparseSegmentSum})),n.d(t,"SparseToDense",(function(){return $.SparseToDense})),n.d(t,"SquaredDifference",(function(){return $.SquaredDifference})),n.d(t,"Square",(function(){return $.Square})),n.d(t,"StridedSlice",(function(){return $.StridedSlice})),n.d(t,"StringNGrams",(function(){return $.StringNGrams})),n.d(t,"StringSplit",(function(){return $.StringSplit})),n.d(t,"StringToHashBucketFast",(function(){return $.StringToHashBucketFast})),n.d(t,"Sub",(function(){return $.Sub})),n.d(t,"Tan",(function(){return $.Tan})),n.d(t,"Tanh",(function(){return $.Tanh})),n.d(t,"Tile",(function(){return $.Tile})),n.d(t,"TopK",(function(){return $.TopK})),n.d(t,"Transform",(function(){return $.Transform})),n.d(t,"Transpose",(function(){return $.Transpose})),n.d(t,"Unique",(function(){return $.Unique})),n.d(t,"Unpack",(function(){return $.Unpack})),n.d(t,"UnsortedSegmentSum",(function(){return $.UnsortedSegmentSum})),n.d(t,"ZerosLike",(function(){return $.ZerosLike})),n.d(t,"Step",(function(){return $.Step})),n.d(t,"FromPixels",(function(){return $.FromPixels})),n.d(t,"RotateWithOffset",(function(){return $.RotateWithOffset})),n.d(t,"_FusedMatMul",(function(){return $._FusedMatMul})),n.d(t,"FusedConv2D",(function(){return $.FusedConv2D})),n.d(t,"FusedDepthwiseConv2D",(function(){return $.FusedDepthwiseConv2D}))},"./node_modules/@tensorflow/tfjs-core/dist/base_side_effects.js": /*!**********************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/base_side_effects.js ***! \**********************************************************************/ -/*! no exports provided */function(e,t,n){"use strict";n.r(t);var s=n(/*! ./engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=(n(/*! ./flags */"./node_modules/@tensorflow/tfjs-core/dist/flags.js"),n(/*! ./platforms/platform_browser */"./node_modules/@tensorflow/tfjs-core/dist/platforms/platform_browser.js"),n(/*! ./platforms/platform_node */"./node_modules/@tensorflow/tfjs-core/dist/platforms/platform_node.js"),n(/*! ./ops/buffer */"./node_modules/@tensorflow/tfjs-core/dist/ops/buffer.js")),r=n(/*! ./ops/cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),i=n(/*! ./ops/clone */"./node_modules/@tensorflow/tfjs-core/dist/ops/clone.js"),a=n(/*! ./ops/print */"./node_modules/@tensorflow/tfjs-core/dist/ops/print.js"),d=n(/*! ./tensor */"./node_modules/@tensorflow/tfjs-core/dist/tensor.js"); +/*! no exports provided */function(e,t,n){"use strict";n.r(t);var s=n(/*! ./engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=(n(/*! ./flags */"./node_modules/@tensorflow/tfjs-core/dist/flags.js"),n(/*! ./platforms/platform_browser */"./node_modules/@tensorflow/tfjs-core/dist/platforms/platform_browser.js"),n(/*! ./platforms/platform_node */"./node_modules/@tensorflow/tfjs-core/dist/platforms/platform_node.js"),n(/*! ./ops/buffer */"./node_modules/@tensorflow/tfjs-core/dist/ops/buffer.js")),r=n(/*! ./ops/cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),i=n(/*! ./ops/clone */"./node_modules/@tensorflow/tfjs-core/dist/ops/clone.js"),a=n(/*! ./ops/print */"./node_modules/@tensorflow/tfjs-core/dist/ops/print.js"),u=n(/*! ./tensor */"./node_modules/@tensorflow/tfjs-core/dist/tensor.js"); /** * @license * Copyright 2020 Google Inc. All Rights Reserved. @@ -11992,7 +11993,7 @@ function s(e,t,n){const s=o(e,t,n),r=s<0?-(s+1):s;e.splice(r,0,t)}function o(e,t * limitations under the License. * ============================================================================= */ -Object(s.getOrMakeEngine)();const u={buffer:o.buffer,cast:r.cast,clone:i.clone,print:a.print};Object(d.setOpHandler)(u)},"./node_modules/@tensorflow/tfjs-core/dist/browser_util.js": +Object(s.getOrMakeEngine)();const d={buffer:o.buffer,cast:r.cast,clone:i.clone,print:a.print};Object(u.setOpHandler)(d)},"./node_modules/@tensorflow/tfjs-core/dist/browser_util.js": /*!*****************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/browser_util.js ***! \*****************************************************************/ @@ -12021,7 +12022,7 @@ const s="undefined"!=typeof requestAnimationFrame?requestAnimationFrame:"undefin /*!***********************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/engine.js ***! \***********************************************************/ -/*! exports provided: Engine, getOrMakeEngine, ENGINE, add */function(e,t,n){"use strict";n.r(t),n.d(t,"Engine",(function(){return h})),n.d(t,"getOrMakeEngine",(function(){return b})),n.d(t,"ENGINE",(function(){return j})),n.d(t,"add",(function(){return g}));var s=n(/*! ./backends/backend */"./node_modules/@tensorflow/tfjs-core/dist/backends/backend.js"),o=n(/*! ./environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"),r=n(/*! ./global_util */"./node_modules/@tensorflow/tfjs-core/dist/global_util.js"),i=n(/*! ./kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),a=n(/*! ./kernel_registry */"./node_modules/@tensorflow/tfjs-core/dist/kernel_registry.js"),d=n(/*! ./profiler */"./node_modules/@tensorflow/tfjs-core/dist/profiler.js"),u=n(/*! ./tape */"./node_modules/@tensorflow/tfjs-core/dist/tape.js"),l=n(/*! ./tensor */"./node_modules/@tensorflow/tfjs-core/dist/tensor.js"),c=n(/*! ./tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),f=n(/*! ./util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/*! exports provided: Engine, getOrMakeEngine, ENGINE, add */function(e,t,n){"use strict";n.r(t),n.d(t,"Engine",(function(){return h})),n.d(t,"getOrMakeEngine",(function(){return b})),n.d(t,"ENGINE",(function(){return j})),n.d(t,"add",(function(){return g}));var s=n(/*! ./backends/backend */"./node_modules/@tensorflow/tfjs-core/dist/backends/backend.js"),o=n(/*! ./environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"),r=n(/*! ./global_util */"./node_modules/@tensorflow/tfjs-core/dist/global_util.js"),i=n(/*! ./kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),a=n(/*! ./kernel_registry */"./node_modules/@tensorflow/tfjs-core/dist/kernel_registry.js"),u=n(/*! ./profiler */"./node_modules/@tensorflow/tfjs-core/dist/profiler.js"),d=n(/*! ./tape */"./node_modules/@tensorflow/tfjs-core/dist/tape.js"),l=n(/*! ./tensor */"./node_modules/@tensorflow/tfjs-core/dist/tensor.js"),c=n(/*! ./tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),f=n(/*! ./util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); /** * @license * Copyright 2018 Google LLC. All Rights Reserved. @@ -12038,11 +12039,11 @@ const s="undefined"!=typeof requestAnimationFrame?requestAnimationFrame:"undefin * limitations under the License. * ============================================================================= */ -function p(e){return null!=e.kernelName}class m{constructor(){this.registeredVariables={},this.nextTapeNodeId=0,this.numBytes=0,this.numTensors=0,this.numStringTensors=0,this.numDataBuffers=0,this.gradientDepth=0,this.kernelDepth=0,this.scopeStack=[],this.numDataMovesStack=[],this.nextScopeId=0,this.tensorInfo=new WeakMap,this.profiling=!1,this.activeProfile={newBytes:0,newTensors:0,peakBytes:0,kernels:[],result:null,get kernelNames(){return Array.from(new Set(this.kernels.map((e=>e.name))))}}}dispose(){for(const e in this.registeredVariables)this.registeredVariables[e].dispose()}}class h{constructor(e){this.ENV=e,this.registry={},this.registryFactory={},this.pendingBackendInitId=0,this.state=new m}async ready(){if(null!=this.pendingBackendInit)return this.pendingBackendInit.then((()=>{}));if(null!=this.backendInstance)return;const e=this.getSortedBackends();for(let t=0;t{null!=e.setupFunc&&e.setupFunc(this.backendInstance)}))}disposeRegisteredKernels(e){Object(a.getKernelsForBackend)(e).forEach((t=>{null!=t.disposeFunc&&t.disposeFunc(this.registry[e])}))}initializeBackend(e){const t=this.registryFactory[e];if(null==t)throw new Error(`Cannot initialize backend ${e}, no registration found.`);try{const n=t.factory();if(!n||n instanceof s.KernelBackend||"function"!=typeof n.then)return this.registry[e]=n,{success:!0,asyncInit:!1};{const t=++this.pendingBackendInitId,s=n.then((n=>!(t(tthis.registryFactory[t].priority-this.registryFactory[e].priority))}initializeBackendsAndReturnBest(){const e=this.getSortedBackends();for(let t=0;tthis.startScope(s)),(()=>this.endScope(n)),(()=>(n=t(),n instanceof Promise&&console.error("Cannot return a Promise inside of tidy."),n)))}scopedRun(e,t,n){e();try{const e=n();return t(),e}catch(e){throw t(),e}}nextTensorId(){return h.nextTensorId++}nextVariableId(){return h.nextVariableId++}clone(e){const t=j.runKernel(i.Identity,{x:e}),n={x:e};return this.addTapeNode(this.state.activeScope.name,n,[t],(e=>({x:()=>{const t={x:e},n={dtype:"float32"};return j.runKernel(i.Cast,t,n)}})),[],{}),t}runKernel(e,t,n){null==this.backendName&&this.backend;if(!(null!=Object(a.getKernel)(e,this.backendName)))throw new Error(`Kernel '${e}' not registered for backend '${this.backendName}'`);return this.runKernelFunc({kernelName:e,inputs:t,attrs:n})}shouldCheckForMemLeaks(){return this.ENV.getBool("IS_TEST")}checkKernelForMemLeak(e,t,n){const s=this.backend.numDataIds();let o=0;n.forEach((e=>{o+="complex64"===e.dtype?3:1}));const r=this.state.numDataMovesStack[this.state.numDataMovesStack.length-1],i=s-t-o-r;if(i>0)throw new Error(`Backend '${this.backendName}' has an internal memory leak (${i} data ids) after running '${e}'`)}runKernelFunc(e){let t,n=[];const s=this.isTapeOn(),o=this.state.numBytes,r=this.state.numTensors;let i,d;this.shouldCheckForMemLeaks()&&this.state.numDataMovesStack.push(0),null==this.backendName&&this.backend;const u=p(e)?e.kernelName:null!=this.state.activeScope?this.state.activeScope.name:"";if(p(e)){const{kernelName:t,inputs:o,attrs:r}=e;null==this.backendName&&this.backend;const u=Object(a.getKernel)(t,this.backendName);f.assert(null!=u,(()=>`Cannot find registered kernel '${t}' for backend '${this.backendName}'`)),i=()=>{const e=this.backend.numDataIds();d=u.kernelFunc({inputs:o,attrs:r,backend:this.backend});const i=Array.isArray(d)?d:[d];this.shouldCheckForMemLeaks()&&this.checkKernelForMemLeak(t,e,i);const a=i.map((e=>{if(null!=e.rank)return e;const{dataId:t,shape:n,dtype:s}=e;return this.makeTensorFromDataId(t,n,s)}));if(s){const e=this.getTensorsForGradient(t,o,a);n=this.saveTensorsForBackwardMode(e)}return a}}else{const{forwardFunc:t}=e,o=e=>{s&&(n=e.map((e=>this.keep(this.clone(e)))))};i=()=>{const e=this.backend.numDataIds();d=this.tidy((()=>t(this.backend,o)));const n=Array.isArray(d)?d:[d];return this.shouldCheckForMemLeaks()&&this.checkKernelForMemLeak(u,e,n),n}}const{inputs:l,attrs:c}=e,m=p(e)?null:e.backwardsFunc;let h;return this.scopedRun((()=>this.state.kernelDepth++),(()=>this.state.kernelDepth--),(()=>{this.ENV.getBool("DEBUG")||this.state.profiling?(h=this.profiler.profileKernel(u,l,(()=>i())),this.ENV.getBool("DEBUG")&&this.profiler.logKernelProfile(h),t=h.outputs):t=i()})),s&&this.addTapeNode(u,l,t,m,n,c),this.state.profiling&&this.state.activeProfile.kernels.push({name:u,bytesAdded:this.state.numBytes-o,totalBytesSnapshot:this.state.numBytes,tensorsAdded:this.state.numTensors-r,totalTensorsSnapshot:this.state.numTensors,inputShapes:Object.keys(l).map((e=>null!=l[e]?l[e].shape:null)),outputShapes:t.map((e=>e.shape)),kernelTimeMs:h.timeMs,extraInfo:h.extraInfo}),Array.isArray(d)?t:t[0]}saveTensorsForBackwardMode(e){return e.map((e=>this.keep(this.clone(e))))}getTensorsForGradient(e,t,n){const s=Object(a.getGradient)(e);if(null!=s){const e=s.inputsToSave||[],o=s.outputsToSave||[];let r;s.saveAllInputs?(f.assert(Array.isArray(t),(()=>"saveAllInputs is true, expected inputs to be an array.")),r=Object.keys(t).map((e=>t[e]))):r=e.map((e=>t[e]));const i=n.filter(((e,t)=>o[t]));return r.concat(i)}return[]}makeTensor(e,t,n,s){if(null==e)throw new Error("Values passed to engine.makeTensor() are null");n=n||"float32",s=s||this.backend;let o=e;"string"===n&&f.isString(e[0])&&(o=e.map((e=>f.encodeString(e))));const r=s.write(o,t,n),i=new l.Tensor(t,n,r,this.nextTensorId());if(this.trackTensor(i,s),"string"===n){const e=this.state.tensorInfo.get(r),t=Object(f.bytesFromStringArray)(o);this.state.numBytes+=t-e.bytes,e.bytes=t}return i}makeTensorFromDataId(e,t,n,s){n=n||"float32";const o=new l.Tensor(t,n,e,this.nextTensorId());return this.trackTensor(o,s),o}makeVariable(e,t=!0,n,s){n=n||this.nextVariableId().toString(),null!=s&&s!==e.dtype&&(e=e.cast(s));const o=new l.Variable(e,t,n,this.nextTensorId());if(null!=this.state.registeredVariables[o.name])throw new Error(`Variable with name ${o.name} was already registered`);return this.state.registeredVariables[o.name]=o,this.incRef(o,this.backend),o}trackTensor(e,t){this.state.numTensors++,"string"===e.dtype&&this.state.numStringTensors++;let n=0;"complex64"!==e.dtype&&"string"!==e.dtype&&(n=e.size*f.bytesPerElement(e.dtype)),this.state.numBytes+=n,this.state.tensorInfo.has(e.dataId)||(this.state.numDataBuffers++,this.state.tensorInfo.set(e.dataId,{backend:t||this.backend,dtype:e.dtype,shape:e.shape,bytes:n})),e instanceof l.Variable||this.track(e)}incRef(e,t){this.trackTensor(e,t),this.backend.incRef(e.dataId)}removeDataId(e,t){this.state.tensorInfo.has(e)&&this.state.tensorInfo.get(e).backend===t&&(this.state.tensorInfo.delete(e),this.state.numDataBuffers--)}disposeTensor(e){if(!this.state.tensorInfo.has(e.dataId))return;const t=this.state.tensorInfo.get(e.dataId);if(this.state.numTensors--,"string"===e.dtype&&(this.state.numStringTensors--,this.state.numBytes-=t.bytes),"complex64"!==e.dtype&&"string"!==e.dtype){const t=e.size*f.bytesPerElement(e.dtype);this.state.numBytes-=t}t.backend.disposeData(e.dataId)&&this.removeDataId(e.dataId,t.backend)}disposeVariables(){for(const e in this.state.registeredVariables){const t=this.state.registeredVariables[e];this.disposeVariable(t)}}disposeVariable(e){this.disposeTensor(e),null!=this.state.registeredVariables[e.name]&&delete this.state.registeredVariables[e.name]}memory(){const e=this.backend.memory();return e.numTensors=this.state.numTensors,e.numDataBuffers=this.state.numDataBuffers,e.numBytes=this.state.numBytes,this.state.numStringTensors>0&&(e.unreliable=!0,null==e.reasons&&(e.reasons=[]),e.reasons.push("Memory usage by string tensors is approximate (2 bytes per character)")),e}async profile(e){this.state.profiling=!0;const t=this.state.numBytes,n=this.state.numTensors;this.state.activeProfile.kernels=[],this.state.activeProfile.result=await e(),this.state.profiling=!1,this.state.activeProfile.peakBytes=Math.max(...this.state.activeProfile.kernels.map((e=>e.totalBytesSnapshot))),this.state.activeProfile.newBytes=this.state.numBytes-t,this.state.activeProfile.newTensors=this.state.numTensors-n;for(const e of this.state.activeProfile.kernels)e.kernelTimeMs=await e.kernelTimeMs,e.extraInfo=await e.extraInfo;return this.state.activeProfile}isTapeOn(){return this.state.gradientDepth>0&&0===this.state.kernelDepth}addTapeNode(e,t,n,s,o,r){const i={id:this.state.nextTapeNodeId++,kernelName:e,inputs:t,outputs:n,saved:o},d=Object(a.getGradient)(e);null!=d&&(s=d.gradFunc),null!=s&&(i.gradient=e=>(e=e.map(((e,t)=>{if(null==e){const e=n[t],s=f.makeZerosTypedArray(e.size,e.dtype);return this.makeTensor(s,e.shape,e.dtype)}return e})),s(e.length>1?e:e[0],o,r))),this.state.activeTape.push(i)}keep(e){return e.kept=!0,e}startTape(){0===this.state.gradientDepth&&(this.state.activeTape=[]),this.state.gradientDepth++}endTape(){this.state.gradientDepth--}startScope(e){const t={track:[],name:"unnamed scope",id:this.state.nextScopeId++};e&&(t.name=e),this.state.scopeStack.push(t),this.state.activeScope=t}endScope(e){const t=Object(c.getTensorsInContainer)(e),n=new Set(t.map((e=>e.id)));for(let e=0;e{e.kept||e.scopeId!==s.id||this.track(e)}))}gradients(e,t,n,s=!1){if(f.assert(t.length>0,(()=>"gradients() received an empty list of xs.")),null!=n&&"float32"!==n.dtype)throw new Error(`dy must have 'float32' dtype, but has '${n.dtype}'`);const o=this.scopedRun((()=>this.startTape()),(()=>this.endTape()),(()=>this.tidy("forward",e)));f.assert(o instanceof l.Tensor,(()=>"The result y returned by f() must be a tensor."));const r=Object(u.getFilteredNodesXToY)(this.state.activeTape,t,o);if(!s&&0===r.length&&t.length>0)throw new Error("Cannot compute gradient of y=f(x) with respect to x. Make sure that the f you passed encloses all operations that lead from x to y.");return this.tidy("backward",(()=>{const e={};e[o.id]=null==n?function(e){const t=Object(f.makeOnesTypedArray)(Object(f.sizeFromShape)(e),"float32");return j.makeTensor(t,e,"float32")}(o.shape):n,Object(u.backpropagateGradients)(e,r,(e=>this.tidy(e)),g);const s=t.map((t=>e[t.id]));return 0===this.state.gradientDepth&&(this.state.activeTape.forEach((e=>{for(const t of e.saved)t.dispose()})),this.state.activeTape=null),{value:o,grads:s}}))}customGrad(e){return f.assert(f.isFunction(e),(()=>"The f passed in customGrad(f) must be a function.")),(...t)=>{let n;f.assert(t.every((e=>e instanceof l.Tensor)),(()=>"The args passed in customGrad(f)(x1, x2,...) must all be tensors"));const s={};t.forEach(((e,t)=>{s[t]=e}));return this.runKernelFunc({forwardFunc:(s,o)=>(n=e(...t,o),f.assert(n.value instanceof l.Tensor,(()=>"The function f passed in customGrad(f) must return an object where `obj.value` is a tensor")),f.assert(f.isFunction(n.gradFunc),(()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function.")),n.value),backwardsFunc:(e,s)=>{const o=n.gradFunc(e,s),r=Array.isArray(o)?o:[o];f.assert(r.length===t.length,(()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns the same number of tensors as inputs passed to f(...).")),f.assert(r.every((e=>e instanceof l.Tensor)),(()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns a list of only tensors."));const i={};return r.forEach(((e,t)=>{i[t]=()=>e})),i},inputs:s})}}readSync(e){return this.state.tensorInfo.get(e).backend.readSync(e)}read(e){return this.state.tensorInfo.get(e).backend.read(e)}async time(e){const t=Object(f.now)(),n=await this.backend.time(e);return n.wallMs=Object(f.now)()-t,n}track(e){return null!=this.state.activeScope&&(e.scopeId=this.state.activeScope.id,this.state.activeScope.track.push(e)),e}get registeredVariables(){return this.state.registeredVariables}reset(){this.pendingBackendInitId++,this.state.dispose(),this.ENV.reset(),this.state=new m;for(const e in this.registry)this.disposeRegisteredKernels(e),this.registry[e].dispose(),delete this.registry[e];this.backendName=null,this.backendInstance=null,this.pendingBackendInit=null}}function b(){const e=Object(r.getGlobalNamespace)();if(null==e._tfengine){const t=new o.Environment(e);e._tfengine=new h(t)}return Object(o.setEnvironmentGlobal)(e._tfengine.ENV),Object(l.setTensorTracker)((()=>e._tfengine)),e._tfengine}h.nextTensorId=0,h.nextVariableId=0;const j=b();function g(e,t){const n={a:e,b:t};return j.runKernel(i.Add,n)}},"./node_modules/@tensorflow/tfjs-core/dist/environment.js": +function p(e){return null!=e.kernelName}class m{constructor(){this.registeredVariables={},this.nextTapeNodeId=0,this.numBytes=0,this.numTensors=0,this.numStringTensors=0,this.numDataBuffers=0,this.gradientDepth=0,this.kernelDepth=0,this.scopeStack=[],this.numDataMovesStack=[],this.nextScopeId=0,this.tensorInfo=new WeakMap,this.profiling=!1,this.activeProfile={newBytes:0,newTensors:0,peakBytes:0,kernels:[],result:null,get kernelNames(){return Array.from(new Set(this.kernels.map((e=>e.name))))}}}dispose(){for(const e in this.registeredVariables)this.registeredVariables[e].dispose()}}class h{constructor(e){this.ENV=e,this.registry={},this.registryFactory={},this.pendingBackendInitId=0,this.state=new m}async ready(){if(null!=this.pendingBackendInit)return this.pendingBackendInit.then((()=>{}));if(null!=this.backendInstance)return;const e=this.getSortedBackends();for(let t=0;t{null!=e.setupFunc&&e.setupFunc(this.backendInstance)}))}disposeRegisteredKernels(e){Object(a.getKernelsForBackend)(e).forEach((t=>{null!=t.disposeFunc&&t.disposeFunc(this.registry[e])}))}initializeBackend(e){const t=this.registryFactory[e];if(null==t)throw new Error(`Cannot initialize backend ${e}, no registration found.`);try{const n=t.factory();if(!n||n instanceof s.KernelBackend||"function"!=typeof n.then)return this.registry[e]=n,{success:!0,asyncInit:!1};{const t=++this.pendingBackendInitId,s=n.then((n=>!(t(tthis.registryFactory[t].priority-this.registryFactory[e].priority))}initializeBackendsAndReturnBest(){const e=this.getSortedBackends();for(let t=0;tthis.startScope(s)),(()=>this.endScope(n)),(()=>(n=t(),n instanceof Promise&&console.error("Cannot return a Promise inside of tidy."),n)))}scopedRun(e,t,n){e();try{const e=n();return t(),e}catch(e){throw t(),e}}nextTensorId(){return h.nextTensorId++}nextVariableId(){return h.nextVariableId++}clone(e){const t=j.runKernel(i.Identity,{x:e}),n={x:e};return this.addTapeNode(this.state.activeScope.name,n,[t],(e=>({x:()=>{const t={x:e},n={dtype:"float32"};return j.runKernel(i.Cast,t,n)}})),[],{}),t}runKernel(e,t,n){null==this.backendName&&this.backend;if(!(null!=Object(a.getKernel)(e,this.backendName)))throw new Error(`Kernel '${e}' not registered for backend '${this.backendName}'`);return this.runKernelFunc({kernelName:e,inputs:t,attrs:n})}shouldCheckForMemLeaks(){return this.ENV.getBool("IS_TEST")}checkKernelForMemLeak(e,t,n){const s=this.backend.numDataIds();let o=0;n.forEach((e=>{o+="complex64"===e.dtype?3:1}));const r=this.state.numDataMovesStack[this.state.numDataMovesStack.length-1],i=s-t-o-r;if(i>0)throw new Error(`Backend '${this.backendName}' has an internal memory leak (${i} data ids) after running '${e}'`)}runKernelFunc(e){let t,n=[];const s=this.isTapeOn(),o=this.state.numBytes,r=this.state.numTensors;let i,u;this.shouldCheckForMemLeaks()&&this.state.numDataMovesStack.push(0),null==this.backendName&&this.backend;const d=p(e)?e.kernelName:null!=this.state.activeScope?this.state.activeScope.name:"";if(p(e)){const{kernelName:t,inputs:o,attrs:r}=e;null==this.backendName&&this.backend;const d=Object(a.getKernel)(t,this.backendName);f.assert(null!=d,(()=>`Cannot find registered kernel '${t}' for backend '${this.backendName}'`)),i=()=>{const e=this.backend.numDataIds();u=d.kernelFunc({inputs:o,attrs:r,backend:this.backend});const i=Array.isArray(u)?u:[u];this.shouldCheckForMemLeaks()&&this.checkKernelForMemLeak(t,e,i);const a=i.map((e=>{if(null!=e.rank)return e;const{dataId:t,shape:n,dtype:s}=e;return this.makeTensorFromDataId(t,n,s)}));if(s){const e=this.getTensorsForGradient(t,o,a);n=this.saveTensorsForBackwardMode(e)}return a}}else{const{forwardFunc:t}=e,o=e=>{s&&(n=e.map((e=>this.keep(this.clone(e)))))};i=()=>{const e=this.backend.numDataIds();u=this.tidy((()=>t(this.backend,o)));const n=Array.isArray(u)?u:[u];return this.shouldCheckForMemLeaks()&&this.checkKernelForMemLeak(d,e,n),n}}const{inputs:l,attrs:c}=e,m=p(e)?null:e.backwardsFunc;let h;return this.scopedRun((()=>this.state.kernelDepth++),(()=>this.state.kernelDepth--),(()=>{this.ENV.getBool("DEBUG")||this.state.profiling?(h=this.profiler.profileKernel(d,l,(()=>i())),this.ENV.getBool("DEBUG")&&this.profiler.logKernelProfile(h),t=h.outputs):t=i()})),s&&this.addTapeNode(d,l,t,m,n,c),this.state.profiling&&this.state.activeProfile.kernels.push({name:d,bytesAdded:this.state.numBytes-o,totalBytesSnapshot:this.state.numBytes,tensorsAdded:this.state.numTensors-r,totalTensorsSnapshot:this.state.numTensors,inputShapes:Object.keys(l).map((e=>null!=l[e]?l[e].shape:null)),outputShapes:t.map((e=>e.shape)),kernelTimeMs:h.timeMs,extraInfo:h.extraInfo}),Array.isArray(u)?t:t[0]}saveTensorsForBackwardMode(e){return e.map((e=>this.keep(this.clone(e))))}getTensorsForGradient(e,t,n){const s=Object(a.getGradient)(e);if(null!=s){const e=s.inputsToSave||[],o=s.outputsToSave||[];let r;s.saveAllInputs?(f.assert(Array.isArray(t),(()=>"saveAllInputs is true, expected inputs to be an array.")),r=Object.keys(t).map((e=>t[e]))):r=e.map((e=>t[e]));const i=n.filter(((e,t)=>o[t]));return r.concat(i)}return[]}makeTensor(e,t,n,s){if(null==e)throw new Error("Values passed to engine.makeTensor() are null");n=n||"float32",s=s||this.backend;let o=e;"string"===n&&f.isString(e[0])&&(o=e.map((e=>f.encodeString(e))));const r=s.write(o,t,n),i=new l.Tensor(t,n,r,this.nextTensorId());if(this.trackTensor(i,s),"string"===n){const e=this.state.tensorInfo.get(r),t=Object(f.bytesFromStringArray)(o);this.state.numBytes+=t-e.bytes,e.bytes=t}return i}makeTensorFromDataId(e,t,n,s){n=n||"float32";const o=new l.Tensor(t,n,e,this.nextTensorId());return this.trackTensor(o,s),o}makeVariable(e,t=!0,n,s){n=n||this.nextVariableId().toString(),null!=s&&s!==e.dtype&&(e=e.cast(s));const o=new l.Variable(e,t,n,this.nextTensorId());if(null!=this.state.registeredVariables[o.name])throw new Error(`Variable with name ${o.name} was already registered`);return this.state.registeredVariables[o.name]=o,this.incRef(o,this.backend),o}trackTensor(e,t){this.state.numTensors++,"string"===e.dtype&&this.state.numStringTensors++;let n=0;"complex64"!==e.dtype&&"string"!==e.dtype&&(n=e.size*f.bytesPerElement(e.dtype)),this.state.numBytes+=n,this.state.tensorInfo.has(e.dataId)||(this.state.numDataBuffers++,this.state.tensorInfo.set(e.dataId,{backend:t||this.backend,dtype:e.dtype,shape:e.shape,bytes:n})),e instanceof l.Variable||this.track(e)}incRef(e,t){this.trackTensor(e,t),this.backend.incRef(e.dataId)}removeDataId(e,t){this.state.tensorInfo.has(e)&&this.state.tensorInfo.get(e).backend===t&&(this.state.tensorInfo.delete(e),this.state.numDataBuffers--)}disposeTensor(e){if(!this.state.tensorInfo.has(e.dataId))return;const t=this.state.tensorInfo.get(e.dataId);if(this.state.numTensors--,"string"===e.dtype&&(this.state.numStringTensors--,this.state.numBytes-=t.bytes),"complex64"!==e.dtype&&"string"!==e.dtype){const t=e.size*f.bytesPerElement(e.dtype);this.state.numBytes-=t}t.backend.disposeData(e.dataId)&&this.removeDataId(e.dataId,t.backend)}disposeVariables(){for(const e in this.state.registeredVariables){const t=this.state.registeredVariables[e];this.disposeVariable(t)}}disposeVariable(e){this.disposeTensor(e),null!=this.state.registeredVariables[e.name]&&delete this.state.registeredVariables[e.name]}memory(){const e=this.backend.memory();return e.numTensors=this.state.numTensors,e.numDataBuffers=this.state.numDataBuffers,e.numBytes=this.state.numBytes,this.state.numStringTensors>0&&(e.unreliable=!0,null==e.reasons&&(e.reasons=[]),e.reasons.push("Memory usage by string tensors is approximate (2 bytes per character)")),e}async profile(e){this.state.profiling=!0;const t=this.state.numBytes,n=this.state.numTensors;this.state.activeProfile.kernels=[],this.state.activeProfile.result=await e(),this.state.profiling=!1,this.state.activeProfile.peakBytes=Math.max(...this.state.activeProfile.kernels.map((e=>e.totalBytesSnapshot))),this.state.activeProfile.newBytes=this.state.numBytes-t,this.state.activeProfile.newTensors=this.state.numTensors-n;for(const e of this.state.activeProfile.kernels)e.kernelTimeMs=await e.kernelTimeMs,e.extraInfo=await e.extraInfo;return this.state.activeProfile}isTapeOn(){return this.state.gradientDepth>0&&0===this.state.kernelDepth}addTapeNode(e,t,n,s,o,r){const i={id:this.state.nextTapeNodeId++,kernelName:e,inputs:t,outputs:n,saved:o},u=Object(a.getGradient)(e);null!=u&&(s=u.gradFunc),null!=s&&(i.gradient=e=>(e=e.map(((e,t)=>{if(null==e){const e=n[t],s=f.makeZerosTypedArray(e.size,e.dtype);return this.makeTensor(s,e.shape,e.dtype)}return e})),s(e.length>1?e:e[0],o,r))),this.state.activeTape.push(i)}keep(e){return e.kept=!0,e}startTape(){0===this.state.gradientDepth&&(this.state.activeTape=[]),this.state.gradientDepth++}endTape(){this.state.gradientDepth--}startScope(e){const t={track:[],name:"unnamed scope",id:this.state.nextScopeId++};e&&(t.name=e),this.state.scopeStack.push(t),this.state.activeScope=t}endScope(e){const t=Object(c.getTensorsInContainer)(e),n=new Set(t.map((e=>e.id)));for(let e=0;e{e.kept||e.scopeId!==s.id||this.track(e)}))}gradients(e,t,n,s=!1){if(f.assert(t.length>0,(()=>"gradients() received an empty list of xs.")),null!=n&&"float32"!==n.dtype)throw new Error(`dy must have 'float32' dtype, but has '${n.dtype}'`);const o=this.scopedRun((()=>this.startTape()),(()=>this.endTape()),(()=>this.tidy("forward",e)));f.assert(o instanceof l.Tensor,(()=>"The result y returned by f() must be a tensor."));const r=Object(d.getFilteredNodesXToY)(this.state.activeTape,t,o);if(!s&&0===r.length&&t.length>0)throw new Error("Cannot compute gradient of y=f(x) with respect to x. Make sure that the f you passed encloses all operations that lead from x to y.");return this.tidy("backward",(()=>{const e={};e[o.id]=null==n?function(e){const t=Object(f.makeOnesTypedArray)(Object(f.sizeFromShape)(e),"float32");return j.makeTensor(t,e,"float32")}(o.shape):n,Object(d.backpropagateGradients)(e,r,(e=>this.tidy(e)),g);const s=t.map((t=>e[t.id]));return 0===this.state.gradientDepth&&(this.state.activeTape.forEach((e=>{for(const t of e.saved)t.dispose()})),this.state.activeTape=null),{value:o,grads:s}}))}customGrad(e){return f.assert(f.isFunction(e),(()=>"The f passed in customGrad(f) must be a function.")),(...t)=>{let n;f.assert(t.every((e=>e instanceof l.Tensor)),(()=>"The args passed in customGrad(f)(x1, x2,...) must all be tensors"));const s={};t.forEach(((e,t)=>{s[t]=e}));return this.runKernelFunc({forwardFunc:(s,o)=>(n=e(...t,o),f.assert(n.value instanceof l.Tensor,(()=>"The function f passed in customGrad(f) must return an object where `obj.value` is a tensor")),f.assert(f.isFunction(n.gradFunc),(()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function.")),n.value),backwardsFunc:(e,s)=>{const o=n.gradFunc(e,s),r=Array.isArray(o)?o:[o];f.assert(r.length===t.length,(()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns the same number of tensors as inputs passed to f(...).")),f.assert(r.every((e=>e instanceof l.Tensor)),(()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns a list of only tensors."));const i={};return r.forEach(((e,t)=>{i[t]=()=>e})),i},inputs:s})}}readSync(e){return this.state.tensorInfo.get(e).backend.readSync(e)}read(e){return this.state.tensorInfo.get(e).backend.read(e)}async time(e){const t=Object(f.now)(),n=await this.backend.time(e);return n.wallMs=Object(f.now)()-t,n}track(e){return null!=this.state.activeScope&&(e.scopeId=this.state.activeScope.id,this.state.activeScope.track.push(e)),e}get registeredVariables(){return this.state.registeredVariables}reset(){this.pendingBackendInitId++,this.state.dispose(),this.ENV.reset(),this.state=new m;for(const e in this.registry)this.disposeRegisteredKernels(e),this.registry[e].dispose(),delete this.registry[e];this.backendName=null,this.backendInstance=null,this.pendingBackendInit=null}}function b(){const e=Object(r.getGlobalNamespace)();if(null==e._tfengine){const t=new o.Environment(e);e._tfengine=new h(t)}return Object(o.setEnvironmentGlobal)(e._tfengine.ENV),Object(l.setTensorTracker)((()=>e._tfengine)),e._tfengine}h.nextTensorId=0,h.nextVariableId=0;const j=b();function g(e,t){const n={a:e,b:t};return j.runKernel(i.Add,n)}},"./node_modules/@tensorflow/tfjs-core/dist/environment.js": /*!****************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/environment.js ***! \****************************************************************/ -/*! exports provided: Environment, getQueryParams, env, ENV, setEnvironmentGlobal */function(e,t,n){"use strict";n.r(t),n.d(t,"Environment",(function(){return r})),n.d(t,"getQueryParams",(function(){return i})),n.d(t,"env",(function(){return a})),n.d(t,"ENV",(function(){return d})),n.d(t,"setEnvironmentGlobal",(function(){return u}));var s=n(/*! ./util_base */"./node_modules/@tensorflow/tfjs-core/dist/util_base.js"); +/*! exports provided: Environment, getQueryParams, env, ENV, setEnvironmentGlobal */function(e,t,n){"use strict";n.r(t),n.d(t,"Environment",(function(){return r})),n.d(t,"getQueryParams",(function(){return i})),n.d(t,"env",(function(){return a})),n.d(t,"ENV",(function(){return u})),n.d(t,"setEnvironmentGlobal",(function(){return d}));var s=n(/*! ./util_base */"./node_modules/@tensorflow/tfjs-core/dist/util_base.js"); /** * @license * Copyright 2017 Google LLC. All Rights Reserved. @@ -12058,7 +12059,7 @@ function p(e){return null!=e.kernelName}class m{constructor(){this.registeredVar * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */const o="tfjsflags";class r{constructor(e){this.global=e,this.flags={},this.flagRegistry={},this.urlFlags={},this.getQueryParams=i,this.populateURLFlags()}setPlatform(e,t){null!=this.platform&&console.warn(`Platform ${this.platformName} has already been set. Overwriting the platform with ${t}.`),this.platformName=e,this.platform=t}registerFlag(e,t,n){if(this.flagRegistry[e]={evaluationFn:t,setHook:n},null!=this.urlFlags[e]){const t=this.urlFlags[e];console.warn(`Setting feature override from URL ${e}: ${t}.`),this.set(e,t)}}async getAsync(e){return e in this.flags||(this.flags[e]=await this.evaluateFlag(e)),this.flags[e]}get(e){if(e in this.flags)return this.flags[e];const t=this.evaluateFlag(e);if(Object(s.isPromise)(t))throw new Error(`Flag ${e} cannot be synchronously evaluated. Please use getAsync() instead.`);return this.flags[e]=t,this.flags[e]}getNumber(e){return this.get(e)}getBool(e){return this.get(e)}getFlags(){return this.flags}get features(){return this.flags}set(e,t){if(null==this.flagRegistry[e])throw new Error(`Cannot set flag ${e} as it has not been registered.`);this.flags[e]=t,null!=this.flagRegistry[e].setHook&&this.flagRegistry[e].setHook(t)}evaluateFlag(e){if(null==this.flagRegistry[e])throw new Error(`Cannot evaluate flag '${e}': no evaluation function found.`);return this.flagRegistry[e].evaluationFn()}setFlags(e){this.flags=Object.assign({},e)}reset(){this.flags={},this.urlFlags={},this.populateURLFlags()}populateURLFlags(){if("undefined"==typeof this.global||"undefined"==typeof this.global.location||"undefined"==typeof this.global.location.search)return;const e=this.getQueryParams(this.global.location.search);if(o in e){e.tfjsflags.split(",").forEach((e=>{const[t,n]=e.split(":");this.urlFlags[t]=function(e,t){if("true"===(t=t.toLowerCase())||"false"===t)return"true"===t;if(""+ +t===t)return+t;throw new Error(`Could not parse value flag value ${t} for flag ${e}.`)}(t,n)}))}}}function i(e){const t={};return e.replace(/[?&]([^=?&]+)(?:=([^&]*))?/g,((e,...n)=>(function(e,t,n){e[decodeURIComponent(t)]=decodeURIComponent(n||"")}(t,n[0],n[1]),n.join("=")))),t}function a(){return d}let d=null;function u(e){d=e}},"./node_modules/@tensorflow/tfjs-core/dist/flags.js": + */const o="tfjsflags";class r{constructor(e){this.global=e,this.flags={},this.flagRegistry={},this.urlFlags={},this.getQueryParams=i,this.populateURLFlags()}setPlatform(e,t){null!=this.platform&&console.warn(`Platform ${this.platformName} has already been set. Overwriting the platform with ${t}.`),this.platformName=e,this.platform=t}registerFlag(e,t,n){if(this.flagRegistry[e]={evaluationFn:t,setHook:n},null!=this.urlFlags[e]){const t=this.urlFlags[e];console.warn(`Setting feature override from URL ${e}: ${t}.`),this.set(e,t)}}async getAsync(e){return e in this.flags||(this.flags[e]=await this.evaluateFlag(e)),this.flags[e]}get(e){if(e in this.flags)return this.flags[e];const t=this.evaluateFlag(e);if(Object(s.isPromise)(t))throw new Error(`Flag ${e} cannot be synchronously evaluated. Please use getAsync() instead.`);return this.flags[e]=t,this.flags[e]}getNumber(e){return this.get(e)}getBool(e){return this.get(e)}getFlags(){return this.flags}get features(){return this.flags}set(e,t){if(null==this.flagRegistry[e])throw new Error(`Cannot set flag ${e} as it has not been registered.`);this.flags[e]=t,null!=this.flagRegistry[e].setHook&&this.flagRegistry[e].setHook(t)}evaluateFlag(e){if(null==this.flagRegistry[e])throw new Error(`Cannot evaluate flag '${e}': no evaluation function found.`);return this.flagRegistry[e].evaluationFn()}setFlags(e){this.flags=Object.assign({},e)}reset(){this.flags={},this.urlFlags={},this.populateURLFlags()}populateURLFlags(){if("undefined"==typeof this.global||"undefined"==typeof this.global.location||"undefined"==typeof this.global.location.search)return;const e=this.getQueryParams(this.global.location.search);if(o in e){e.tfjsflags.split(",").forEach((e=>{const[t,n]=e.split(":");this.urlFlags[t]=function(e,t){if("true"===(t=t.toLowerCase())||"false"===t)return"true"===t;if(""+ +t===t)return+t;throw new Error(`Could not parse value flag value ${t} for flag ${e}.`)}(t,n)}))}}}function i(e){const t={};return e.replace(/[?&]([^=?&]+)(?:=([^&]*))?/g,((e,...n)=>(function(e,t,n){e[decodeURIComponent(t)]=decodeURIComponent(n||"")}(t,n[0],n[1]),n.join("=")))),t}function a(){return u}let u=null;function d(e){u=e}},"./node_modules/@tensorflow/tfjs-core/dist/flags.js": /*!**********************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/flags.js ***! \**********************************************************/ @@ -12104,7 +12105,7 @@ let o;function r(){if(null==o){let t;if("undefined"!=typeof window)t=window;else /*!************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/globals.js ***! \************************************************************/ -/*! exports provided: enableProdMode, enableDebugMode, disableDeprecationWarnings, deprecationWarn, disposeVariables, engine, memory, profile, tidy, dispose, keep, time, setBackend, ready, getBackend, removeBackend, findBackend, findBackendFactory, registerBackend, backend, setPlatform */function(e,t,n){"use strict";n.r(t),n.d(t,"enableProdMode",(function(){return a})),n.d(t,"enableDebugMode",(function(){return d})),n.d(t,"disableDeprecationWarnings",(function(){return u})),n.d(t,"deprecationWarn",(function(){return l})),n.d(t,"disposeVariables",(function(){return c})),n.d(t,"engine",(function(){return f})),n.d(t,"memory",(function(){return p})),n.d(t,"profile",(function(){return m})),n.d(t,"tidy",(function(){return h})),n.d(t,"dispose",(function(){return b})),n.d(t,"keep",(function(){return j})),n.d(t,"time",(function(){return g})),n.d(t,"setBackend",(function(){return w})),n.d(t,"ready",(function(){return _})),n.d(t,"getBackend",(function(){return k})),n.d(t,"removeBackend",(function(){return v})),n.d(t,"findBackend",(function(){return x})),n.d(t,"findBackendFactory",(function(){return y})),n.d(t,"registerBackend",(function(){return O})),n.d(t,"backend",(function(){return I})),n.d(t,"setPlatform",(function(){return C}));var s=n(/*! ./engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ./environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"),r=n(/*! ./tensor */"./node_modules/@tensorflow/tfjs-core/dist/tensor.js"),i=n(/*! ./tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"); +/*! exports provided: enableProdMode, enableDebugMode, disableDeprecationWarnings, deprecationWarn, disposeVariables, engine, memory, profile, tidy, dispose, keep, time, setBackend, ready, getBackend, removeBackend, findBackend, findBackendFactory, registerBackend, backend, setPlatform */function(e,t,n){"use strict";n.r(t),n.d(t,"enableProdMode",(function(){return a})),n.d(t,"enableDebugMode",(function(){return u})),n.d(t,"disableDeprecationWarnings",(function(){return d})),n.d(t,"deprecationWarn",(function(){return l})),n.d(t,"disposeVariables",(function(){return c})),n.d(t,"engine",(function(){return f})),n.d(t,"memory",(function(){return p})),n.d(t,"profile",(function(){return m})),n.d(t,"tidy",(function(){return h})),n.d(t,"dispose",(function(){return b})),n.d(t,"keep",(function(){return j})),n.d(t,"time",(function(){return g})),n.d(t,"setBackend",(function(){return w})),n.d(t,"ready",(function(){return _})),n.d(t,"getBackend",(function(){return k})),n.d(t,"removeBackend",(function(){return v})),n.d(t,"findBackend",(function(){return x})),n.d(t,"findBackendFactory",(function(){return y})),n.d(t,"registerBackend",(function(){return O})),n.d(t,"backend",(function(){return I})),n.d(t,"setPlatform",(function(){return C}));var s=n(/*! ./engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ./environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"),r=n(/*! ./tensor */"./node_modules/@tensorflow/tfjs-core/dist/tensor.js"),i=n(/*! ./tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"); /** * @license * Copyright 2018 Google LLC. All Rights Reserved. @@ -12121,11 +12122,11 @@ let o;function r(){if(null==o){let t;if("undefined"!=typeof window)t=window;else * limitations under the License. * ============================================================================= */ -function a(){Object(o.env)().set("PROD",!0)}function d(){Object(o.env)().set("DEBUG",!0)}function u(){Object(o.env)().set("DEPRECATION_WARNINGS_ENABLED",!1),console.warn("TensorFlow.js deprecation warnings have been disabled.")}function l(e){Object(o.env)().getBool("DEPRECATION_WARNINGS_ENABLED")&&console.warn(e+" You can disable deprecation warnings with tf.disableDeprecationWarnings().")}function c(){s.ENGINE.disposeVariables()}function f(){return s.ENGINE}function p(){return s.ENGINE.memory()}function m(e){return s.ENGINE.profile(e)}function h(e,t){return s.ENGINE.tidy(e,t)}function b(e){Object(i.getTensorsInContainer)(e).forEach((e=>e.dispose()))}function j(e){return s.ENGINE.keep(e)}function g(e){return s.ENGINE.time(e)}function w(e){return s.ENGINE.setBackend(e)}function _(){return s.ENGINE.ready()}function k(){return s.ENGINE.backendName}function v(e){s.ENGINE.removeBackend(e)}function x(e){return s.ENGINE.findBackend(e)}function y(e){return s.ENGINE.findBackendFactory(e)}function O(e,t,n=1){return s.ENGINE.registerBackend(e,t,n)}function I(){return s.ENGINE.backend}function C(e,t){Object(o.env)().setPlatform(e,t)}Object(r.setDeprecationWarningFn)(l)},"./node_modules/@tensorflow/tfjs-core/dist/gradients.js": +function a(){Object(o.env)().set("PROD",!0)}function u(){Object(o.env)().set("DEBUG",!0)}function d(){Object(o.env)().set("DEPRECATION_WARNINGS_ENABLED",!1),console.warn("TensorFlow.js deprecation warnings have been disabled.")}function l(e){Object(o.env)().getBool("DEPRECATION_WARNINGS_ENABLED")&&console.warn(e+" You can disable deprecation warnings with tf.disableDeprecationWarnings().")}function c(){s.ENGINE.disposeVariables()}function f(){return s.ENGINE}function p(){return s.ENGINE.memory()}function m(e){return s.ENGINE.profile(e)}function h(e,t){return s.ENGINE.tidy(e,t)}function b(e){Object(i.getTensorsInContainer)(e).forEach((e=>e.dispose()))}function j(e){return s.ENGINE.keep(e)}function g(e){return s.ENGINE.time(e)}function w(e){return s.ENGINE.setBackend(e)}function _(){return s.ENGINE.ready()}function k(){return s.ENGINE.backendName}function v(e){s.ENGINE.removeBackend(e)}function x(e){return s.ENGINE.findBackend(e)}function y(e){return s.ENGINE.findBackendFactory(e)}function O(e,t,n=1){return s.ENGINE.registerBackend(e,t,n)}function I(){return s.ENGINE.backend}function C(e,t){Object(o.env)().setPlatform(e,t)}Object(r.setDeprecationWarningFn)(l)},"./node_modules/@tensorflow/tfjs-core/dist/gradients.js": /*!**************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients.js ***! \**************************************************************/ -/*! exports provided: customGrad, variableGrads, valueAndGrad, valueAndGrads, grad, grads */function(e,t,n){"use strict";n.r(t),n.d(t,"customGrad",(function(){return f})),n.d(t,"variableGrads",(function(){return c})),n.d(t,"valueAndGrad",(function(){return u})),n.d(t,"valueAndGrads",(function(){return l})),n.d(t,"grad",(function(){return a})),n.d(t,"grads",(function(){return d}));var s=n(/*! ./engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ./tensor */"./node_modules/@tensorflow/tfjs-core/dist/tensor.js"),r=n(/*! ./tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/*! exports provided: customGrad, variableGrads, valueAndGrad, valueAndGrads, grad, grads */function(e,t,n){"use strict";n.r(t),n.d(t,"customGrad",(function(){return f})),n.d(t,"variableGrads",(function(){return c})),n.d(t,"valueAndGrad",(function(){return d})),n.d(t,"valueAndGrads",(function(){return l})),n.d(t,"grad",(function(){return a})),n.d(t,"grads",(function(){return u}));var s=n(/*! ./engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ./tensor */"./node_modules/@tensorflow/tfjs-core/dist/tensor.js"),r=n(/*! ./tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); /** * @license * Copyright 2018 Google LLC. All Rights Reserved. @@ -12142,7 +12143,7 @@ function a(){Object(o.env)().set("PROD",!0)}function d(){Object(o.env)().set("DE * limitations under the License. * ============================================================================= */ -function a(e){return i.assert(i.isFunction(e),(()=>"The f passed in grad(f) must be a function")),(t,n)=>{const o=Object(r.convertToTensor)(t,"x","tf.grad","string_or_numeric"),a=null!=n?Object(r.convertToTensor)(n,"dy","tf.grad"):null;return s.ENGINE.tidy((()=>{const{value:t,grads:n}=s.ENGINE.gradients((()=>e(o)),[o],a);return null!=a&&i.assertShapesMatch(t.shape,a.shape,"The shape of dy passed in grad(f)(x, dy) must match the shape returned by f(x)"),p(n),n[0]}))}}function d(e){return i.assert(i.isFunction(e),(()=>"The f passed in grads(f) must be a function")),(t,n)=>{i.assert(Array.isArray(t),(()=>"The args passed in grads(f)(args) must be an array of `Tensor`s or `TensorLike`s"));const o=Object(r.convertToTensorArray)(t,"args","tf.grads","string_or_numeric"),a=null!=n?Object(r.convertToTensor)(n,"dy","tf.grads"):null;return s.ENGINE.tidy((()=>{const{value:t,grads:n}=s.ENGINE.gradients((()=>e(...o)),o,a);return null!=a&&i.assertShapesMatch(t.shape,a.shape,"The shape of dy passed in grads(f)([x1,...], dy) must match the shape returned by f([x1,...])"),p(n),n}))}}function u(e){return i.assert(i.isFunction(e),(()=>"The f passed in valueAndGrad(f) must be a function")),(t,n)=>{i.assert(t instanceof o.Tensor,(()=>"The x passed in valueAndGrad(f)(x) must be a tensor")),i.assert(null==n||n instanceof o.Tensor,(()=>"The dy passed in valueAndGrad(f)(x, dy) must be a tensor"));const{grads:r,value:a}=s.ENGINE.gradients((()=>e(t)),[t],n);return p(r),{grad:r[0],value:a}}}function l(e){return i.assert(i.isFunction(e),(()=>"The f passed in valueAndGrads(f) must be a function")),(t,n)=>{i.assert(Array.isArray(t)&&t.every((e=>e instanceof o.Tensor)),(()=>"The args passed in valueAndGrads(f)(args) must be array of tensors")),i.assert(null==n||n instanceof o.Tensor,(()=>"The dy passed in valueAndGrads(f)(args, dy) must be a tensor"));const r=s.ENGINE.gradients((()=>e(...t)),t,n);return null!=n&&i.assertShapesMatch(r.value.shape,n.shape,"The shape of dy passed in valueAndGrads(f)([x1,...], dy) must match the shape returned by f([x1,...])"),p(r.grads),r}}function c(e,t){i.assert(i.isFunction(e),(()=>"The f passed in variableGrads(f) must be a function")),i.assert(null==t||Array.isArray(t)&&t.every((e=>e instanceof o.Variable)),(()=>"The varList passed in variableGrads(f, varList) must be an array of variables"));const n=null!=t;if(!n){t=[];for(const e in s.ENGINE.registeredVariables)t.push(s.ENGINE.registeredVariables[e])}const r=n?t.filter((e=>!e.trainable)):null,a=t.length;t=t.filter((e=>e.trainable)),i.assert(t.length>0,(()=>`variableGrads() expects at least one of the input variables to be trainable, but none of the ${a} variables is trainable.`));const{value:d,grads:u}=s.ENGINE.gradients(e,t,null,!0);i.assert(u.some((e=>null!=e)),(()=>"Cannot find a connection between any variable and the result of the loss function y=f(x). Please make sure the operations that use variables are inside the function f passed to minimize().")),i.assert(0===d.rank,(()=>`The f passed in variableGrads(f) must return a scalar, but it returned a rank-${d.rank} tensor`));const l={};return t.forEach(((e,t)=>{null!=u[t]&&(l[e.name]=u[t])})),null!=r&&r.forEach((e=>l[e.name]=null)),{value:d,grads:l}}function f(e){return s.ENGINE.customGrad(e)}function p(e){if(e.filter((e=>null==e)).length>0)throw new Error("Cannot compute gradient of y=f(x) with respect to x. Make sure that\n the f you passed encloses all operations that lead from x to y.")}},"./node_modules/@tensorflow/tfjs-core/dist/hash_util.js": +function a(e){return i.assert(i.isFunction(e),(()=>"The f passed in grad(f) must be a function")),(t,n)=>{const o=Object(r.convertToTensor)(t,"x","tf.grad","string_or_numeric"),a=null!=n?Object(r.convertToTensor)(n,"dy","tf.grad"):null;return s.ENGINE.tidy((()=>{const{value:t,grads:n}=s.ENGINE.gradients((()=>e(o)),[o],a);return null!=a&&i.assertShapesMatch(t.shape,a.shape,"The shape of dy passed in grad(f)(x, dy) must match the shape returned by f(x)"),p(n),n[0]}))}}function u(e){return i.assert(i.isFunction(e),(()=>"The f passed in grads(f) must be a function")),(t,n)=>{i.assert(Array.isArray(t),(()=>"The args passed in grads(f)(args) must be an array of `Tensor`s or `TensorLike`s"));const o=Object(r.convertToTensorArray)(t,"args","tf.grads","string_or_numeric"),a=null!=n?Object(r.convertToTensor)(n,"dy","tf.grads"):null;return s.ENGINE.tidy((()=>{const{value:t,grads:n}=s.ENGINE.gradients((()=>e(...o)),o,a);return null!=a&&i.assertShapesMatch(t.shape,a.shape,"The shape of dy passed in grads(f)([x1,...], dy) must match the shape returned by f([x1,...])"),p(n),n}))}}function d(e){return i.assert(i.isFunction(e),(()=>"The f passed in valueAndGrad(f) must be a function")),(t,n)=>{i.assert(t instanceof o.Tensor,(()=>"The x passed in valueAndGrad(f)(x) must be a tensor")),i.assert(null==n||n instanceof o.Tensor,(()=>"The dy passed in valueAndGrad(f)(x, dy) must be a tensor"));const{grads:r,value:a}=s.ENGINE.gradients((()=>e(t)),[t],n);return p(r),{grad:r[0],value:a}}}function l(e){return i.assert(i.isFunction(e),(()=>"The f passed in valueAndGrads(f) must be a function")),(t,n)=>{i.assert(Array.isArray(t)&&t.every((e=>e instanceof o.Tensor)),(()=>"The args passed in valueAndGrads(f)(args) must be array of tensors")),i.assert(null==n||n instanceof o.Tensor,(()=>"The dy passed in valueAndGrads(f)(args, dy) must be a tensor"));const r=s.ENGINE.gradients((()=>e(...t)),t,n);return null!=n&&i.assertShapesMatch(r.value.shape,n.shape,"The shape of dy passed in valueAndGrads(f)([x1,...], dy) must match the shape returned by f([x1,...])"),p(r.grads),r}}function c(e,t){i.assert(i.isFunction(e),(()=>"The f passed in variableGrads(f) must be a function")),i.assert(null==t||Array.isArray(t)&&t.every((e=>e instanceof o.Variable)),(()=>"The varList passed in variableGrads(f, varList) must be an array of variables"));const n=null!=t;if(!n){t=[];for(const e in s.ENGINE.registeredVariables)t.push(s.ENGINE.registeredVariables[e])}const r=n?t.filter((e=>!e.trainable)):null,a=t.length;t=t.filter((e=>e.trainable)),i.assert(t.length>0,(()=>`variableGrads() expects at least one of the input variables to be trainable, but none of the ${a} variables is trainable.`));const{value:u,grads:d}=s.ENGINE.gradients(e,t,null,!0);i.assert(d.some((e=>null!=e)),(()=>"Cannot find a connection between any variable and the result of the loss function y=f(x). Please make sure the operations that use variables are inside the function f passed to minimize().")),i.assert(0===u.rank,(()=>`The f passed in variableGrads(f) must return a scalar, but it returned a rank-${u.rank} tensor`));const l={};return t.forEach(((e,t)=>{null!=d[t]&&(l[e.name]=d[t])})),null!=r&&r.forEach((e=>l[e.name]=null)),{value:u,grads:l}}function f(e){return s.ENGINE.customGrad(e)}function p(e){if(e.filter((e=>null==e)).length>0)throw new Error("Cannot compute gradient of y=f(x) with respect to x. Make sure that\n the f you passed encloses all operations that lead from x to y.")}},"./node_modules/@tensorflow/tfjs-core/dist/hash_util.js": /*!**************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/hash_util.js ***! \**************************************************************/ @@ -12163,7 +12164,7 @@ function a(e){return i.assert(i.isFunction(e),(()=>"The f passed in grad(f) must * limitations under the License. * ============================================================================= */ -const o=n.n(s).a||s;function r(e){return o.fromString(e,!0,16)}const i=r("c3a5c85c97cb3127"),a=r("b492b66fbe98f273"),d=r("9ae16a3b2f90404f");function u(e){return e.xor(e.shru(47))}function l(e,t,n){const s=e.slice(t,t+n);return o.fromBytes(Array.from(s),!0,!0)}function c(e,t){return l(e,t,8)}function f(e,t){return l(e,t,4)}function p(e,t){return 0===t?e:e.shru(t).or(e.shl(64-t))}function m(e,t,n=r("9ddfea08eb382d69")){let s=e.xor(t).mul(n);s=s.xor(s.shru(47));let o=t.xor(s).mul(n);return o=o.xor(o.shru(47)),o=o.mul(n),o}function h(e,t,n,s){return function(e,t,n,s,o,r){o=o.add(e),r=p(r.add(o).add(s),21);const i=o;return o=(o=o.add(t)).add(n),r=r.add(p(o,44)),[o.add(s),r.add(i)]}(c(e,t),c(e,t+8),c(e,t+16),c(e,t+24),n,s)}function b(e,t=e.length){const n=o.fromNumber(81,!0);if(t<=32)return t<=16?function(e,t=e.length){if(t>=8){const n=d.add(2*t),s=c(e,0).add(d),o=c(e,t-8);return m(p(o,37).mul(n).add(s),p(s,25).add(o).mul(n),n)}if(t>=4){const n=d.add(2*t);return m(f(e,0).shl(3).add(t),f(e,t-4),n)}if(t>0){const n=e[0]+(e[t>>1]<<8),s=t+(e[t-1]<<2);return u(d.mul(n).xor(i.mul(s))).mul(d)}return d}(e,t):function(e,t=e.length){const n=d.add(2*t),s=c(e,0).mul(a),o=c(e,8),r=c(e,t-8).mul(n),i=c(e,t-16).mul(d);return m(p(s.add(o),43).add(p(r,30)).add(i),s.add(p(o.add(d),18)).add(r),n)}(e,t);if(t<=64)return function(e,t=e.length){const n=d.add(2*t),s=c(e,0).mul(d),o=c(e,8),r=c(e,t-8).mul(n),i=c(e,t-16).mul(d),a=p(s.add(o),43).add(p(r,30)).add(i),u=m(a,s.add(p(o.add(d),18)).add(r),n),l=c(e,16).mul(n),f=c(e,24),h=a.add(c(e,t-32)).mul(n),b=u.add(c(e,t-24)).mul(n);return m(p(l.add(f),43).add(p(h,30)).add(b),l.add(p(f.add(s),18)).add(h),n)}(e,t);let s=n,r=n.mul(a).add(113),l=u(r.mul(d).add(113)).mul(d),b=[o.UZERO,o.UZERO],j=[o.UZERO,o.UZERO];s=s.mul(d).add(c(e,0));let g=0;const w=64*(t-1>>6),_=w+(t-1&63)-63;do{s=p(s.add(r).add(b[0]).add(c(e,g+8)),37).mul(a),r=p(r.add(b[1]).add(c(e,g+48)),42).mul(a),s=s.xor(j[1]),r=r.add(b[0]).add(c(e,g+40)),l=p(l.add(j[0]),33).mul(a),b=h(e,g,b[1].mul(a),s.add(j[0])),j=h(e,g+32,l.add(j[1]),r.add(c(e,g+16))),[l,s]=[s,l],g+=64}while(g!==w);const k=a.add(l.and(255).shl(1));return g=_,j[0]=j[0].add(t-1&63),b[0]=b[0].add(j[0]),j[0]=j[0].add(b[0]),s=p(s.add(r).add(b[0]).add(c(e,g+8)),37).mul(k),r=p(r.add(b[1]).add(c(e,g+48)),42).mul(k),s=s.xor(j[1].mul(9)),r=r.add(b[0].mul(9).add(c(e,g+40))),l=p(l.add(j[0]),33).mul(k),b=h(e,g,b[1].mul(k),s.add(j[0])),j=h(e,g+32,l.add(j[1]),r.add(c(e,g+16))),[l,s]=[s,l],m(m(b[0],j[0],k).add(u(r).mul(i)).add(l),m(b[1],j[1],k).add(s),k)}},"./node_modules/@tensorflow/tfjs-core/dist/index.js": +const o=n.n(s).a||s;function r(e){return o.fromString(e,!0,16)}const i=r("c3a5c85c97cb3127"),a=r("b492b66fbe98f273"),u=r("9ae16a3b2f90404f");function d(e){return e.xor(e.shru(47))}function l(e,t,n){const s=e.slice(t,t+n);return o.fromBytes(Array.from(s),!0,!0)}function c(e,t){return l(e,t,8)}function f(e,t){return l(e,t,4)}function p(e,t){return 0===t?e:e.shru(t).or(e.shl(64-t))}function m(e,t,n=r("9ddfea08eb382d69")){let s=e.xor(t).mul(n);s=s.xor(s.shru(47));let o=t.xor(s).mul(n);return o=o.xor(o.shru(47)),o=o.mul(n),o}function h(e,t,n,s){return function(e,t,n,s,o,r){o=o.add(e),r=p(r.add(o).add(s),21);const i=o;return o=(o=o.add(t)).add(n),r=r.add(p(o,44)),[o.add(s),r.add(i)]}(c(e,t),c(e,t+8),c(e,t+16),c(e,t+24),n,s)}function b(e,t=e.length){const n=o.fromNumber(81,!0);if(t<=32)return t<=16?function(e,t=e.length){if(t>=8){const n=u.add(2*t),s=c(e,0).add(u),o=c(e,t-8);return m(p(o,37).mul(n).add(s),p(s,25).add(o).mul(n),n)}if(t>=4){const n=u.add(2*t);return m(f(e,0).shl(3).add(t),f(e,t-4),n)}if(t>0){const n=e[0]+(e[t>>1]<<8),s=t+(e[t-1]<<2);return d(u.mul(n).xor(i.mul(s))).mul(u)}return u}(e,t):function(e,t=e.length){const n=u.add(2*t),s=c(e,0).mul(a),o=c(e,8),r=c(e,t-8).mul(n),i=c(e,t-16).mul(u);return m(p(s.add(o),43).add(p(r,30)).add(i),s.add(p(o.add(u),18)).add(r),n)}(e,t);if(t<=64)return function(e,t=e.length){const n=u.add(2*t),s=c(e,0).mul(u),o=c(e,8),r=c(e,t-8).mul(n),i=c(e,t-16).mul(u),a=p(s.add(o),43).add(p(r,30)).add(i),d=m(a,s.add(p(o.add(u),18)).add(r),n),l=c(e,16).mul(n),f=c(e,24),h=a.add(c(e,t-32)).mul(n),b=d.add(c(e,t-24)).mul(n);return m(p(l.add(f),43).add(p(h,30)).add(b),l.add(p(f.add(s),18)).add(h),n)}(e,t);let s=n,r=n.mul(a).add(113),l=d(r.mul(u).add(113)).mul(u),b=[o.UZERO,o.UZERO],j=[o.UZERO,o.UZERO];s=s.mul(u).add(c(e,0));let g=0;const w=64*(t-1>>6),_=w+(t-1&63)-63;do{s=p(s.add(r).add(b[0]).add(c(e,g+8)),37).mul(a),r=p(r.add(b[1]).add(c(e,g+48)),42).mul(a),s=s.xor(j[1]),r=r.add(b[0]).add(c(e,g+40)),l=p(l.add(j[0]),33).mul(a),b=h(e,g,b[1].mul(a),s.add(j[0])),j=h(e,g+32,l.add(j[1]),r.add(c(e,g+16))),[l,s]=[s,l],g+=64}while(g!==w);const k=a.add(l.and(255).shl(1));return g=_,j[0]=j[0].add(t-1&63),b[0]=b[0].add(j[0]),j[0]=j[0].add(b[0]),s=p(s.add(r).add(b[0]).add(c(e,g+8)),37).mul(k),r=p(r.add(b[1]).add(c(e,g+48)),42).mul(k),s=s.xor(j[1].mul(9)),r=r.add(b[0].mul(9).add(c(e,g+40))),l=p(l.add(j[0]),33).mul(k),b=h(e,g,b[1].mul(k),s.add(j[0])),j=h(e,g+32,l.add(j[1]),r.add(c(e,g+16))),[l,s]=[s,l],m(m(b[0],j[0],k).add(d(r).mul(i)).add(l),m(b[1],j[1],k).add(s),k)}},"./node_modules/@tensorflow/tfjs-core/dist/index.js": /*!**********************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/index.js ***! \**********************************************************/ @@ -12171,15 +12172,15 @@ const o=n.n(s).a||s;function r(e){return o.fromString(e,!0,16)}const i=r("c3a5c8 /*!*********************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/io/browser_files.js ***! \*********************************************************************/ -/*! exports provided: BrowserDownloads, browserDownloadsRouter, browserDownloads, browserFiles */function(e,t,n){"use strict";n.r(t),n.d(t,"BrowserDownloads",(function(){return a})),n.d(t,"browserDownloadsRouter",(function(){return u})),n.d(t,"browserDownloads",(function(){return l})),n.d(t,"browserFiles",(function(){return c}));n(/*! ../flags */"./node_modules/@tensorflow/tfjs-core/dist/flags.js");var s=n(/*! ../environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"),o=n(/*! ./io_utils */"./node_modules/@tensorflow/tfjs-core/dist/io/io_utils.js"),r=n(/*! ./router_registry */"./node_modules/@tensorflow/tfjs-core/dist/io/router_registry.js");function i(e){return new Promise((e=>setTimeout(e))).then(e)}class a{constructor(e){if(!Object(s.env)().getBool("IS_BROWSER"))throw new Error("browserDownloads() cannot proceed because the current environment is not a browser.");e.startsWith(a.URL_SCHEME)&&(e=e.slice(a.URL_SCHEME.length)),null!=e&&0!==e.length||(e="model"),this.modelJsonFileName=e+".json",this.weightDataFileName=e+".weights.bin"}async save(e){if("undefined"==typeof document)throw new Error("Browser downloads are not supported in this environment since `document` is not present");const t=window.URL.createObjectURL(new Blob([e.weightData],{type:"application/octet-stream"}));if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserDownloads.save() does not support saving model topology in binary formats yet.");{const n=[{paths:["./"+this.weightDataFileName],weights:e.weightSpecs}],s=Object(o.getModelJSONForModelArtifacts)(e,n),r=window.URL.createObjectURL(new Blob([JSON.stringify(s)],{type:"application/json"})),a=null==this.modelJsonAnchor?document.createElement("a"):this.modelJsonAnchor;if(a.download=this.modelJsonFileName,a.href=r,await i((()=>a.dispatchEvent(new MouseEvent("click")))),null!=e.weightData){const e=null==this.weightDataAnchor?document.createElement("a"):this.weightDataAnchor;e.download=this.weightDataFileName,e.href=t,await i((()=>e.dispatchEvent(new MouseEvent("click"))))}return{modelArtifactsInfo:Object(o.getModelArtifactsInfoForJSON)(e)}}}}a.URL_SCHEME="downloads://";class d{constructor(e){if(null==e||e.length<1)throw new Error(`When calling browserFiles, at least 1 file is required, but received ${e}`);this.jsonFile=e[0],this.weightsFiles=e.slice(1)}async load(){return new Promise(((e,t)=>{const n=new FileReader;n.onload=n=>{const s=JSON.parse(n.target.result),r=s.modelTopology;if(null==r)return void t(new Error(`modelTopology field is missing from file ${this.jsonFile.name}`));if(null==s.weightsManifest)return void t(new Error(`weightManifest field is missing from file ${this.jsonFile.name}`));if(0===this.weightsFiles.length)return void e({modelTopology:r});const i=Object(o.getModelArtifactsForJSON)(s,(e=>this.loadWeights(e)));e(i)},n.onerror=e=>t(`Failed to read model topology and weights manifest JSON from file '${this.jsonFile.name}'. BrowserFiles supports loading Keras-style tf.Model artifacts only.`),n.readAsText(this.jsonFile)}))}loadWeights(e){const t=[],n=[];for(const s of e)t.push(...s.weights),n.push(...s.paths);const s=this.checkManifestAndWeightFiles(e),r=n.map((e=>this.loadWeightsFile(e,s[e])));return Promise.all(r).then((e=>[t,Object(o.concatenateArrayBuffers)(e)]))}loadWeightsFile(e,t){return new Promise(((n,s)=>{const o=new FileReader;o.onload=e=>{const t=e.target.result;n(t)},o.onerror=t=>s(`Failed to weights data from file of path '${e}'.`),o.readAsArrayBuffer(t)}))}checkManifestAndWeightFiles(e){const t=[],n=this.weightsFiles.map((e=>Object(o.basename)(e.name))),s={};for(const r of e)r.paths.forEach((e=>{const r=Object(o.basename)(e);if(-1!==t.indexOf(r))throw new Error(`Duplicate file basename found in weights manifest: '${r}'`);if(t.push(r),-1===n.indexOf(r))throw new Error(`Weight file with basename '${r}' is not provided.`);s[e]=this.weightsFiles[n.indexOf(r)]}));if(t.length!==this.weightsFiles.length)throw new Error(`Mismatch in the number of files in weights manifest (${t.length}) and the number of weight files provided (${this.weightsFiles.length}).`);return s}}const u=e=>Object(s.env)().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(a.URL_SCHEME)?l(e.slice(a.URL_SCHEME.length)):null;function l(e="model"){return new a(e)}function c(e){return new d(e)}r.IORouterRegistry.registerSaveRouter(u)},"./node_modules/@tensorflow/tfjs-core/dist/io/http.js": +/*! exports provided: BrowserDownloads, browserDownloadsRouter, browserDownloads, browserFiles */function(e,t,n){"use strict";n.r(t),n.d(t,"BrowserDownloads",(function(){return a})),n.d(t,"browserDownloadsRouter",(function(){return d})),n.d(t,"browserDownloads",(function(){return l})),n.d(t,"browserFiles",(function(){return c}));n(/*! ../flags */"./node_modules/@tensorflow/tfjs-core/dist/flags.js");var s=n(/*! ../environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"),o=n(/*! ./io_utils */"./node_modules/@tensorflow/tfjs-core/dist/io/io_utils.js"),r=n(/*! ./router_registry */"./node_modules/@tensorflow/tfjs-core/dist/io/router_registry.js");function i(e){return new Promise((e=>setTimeout(e))).then(e)}class a{constructor(e){if(!Object(s.env)().getBool("IS_BROWSER"))throw new Error("browserDownloads() cannot proceed because the current environment is not a browser.");e.startsWith(a.URL_SCHEME)&&(e=e.slice(a.URL_SCHEME.length)),null!=e&&0!==e.length||(e="model"),this.modelJsonFileName=e+".json",this.weightDataFileName=e+".weights.bin"}async save(e){if("undefined"==typeof document)throw new Error("Browser downloads are not supported in this environment since `document` is not present");const t=window.URL.createObjectURL(new Blob([e.weightData],{type:"application/octet-stream"}));if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserDownloads.save() does not support saving model topology in binary formats yet.");{const n=[{paths:["./"+this.weightDataFileName],weights:e.weightSpecs}],s=Object(o.getModelJSONForModelArtifacts)(e,n),r=window.URL.createObjectURL(new Blob([JSON.stringify(s)],{type:"application/json"})),a=null==this.modelJsonAnchor?document.createElement("a"):this.modelJsonAnchor;if(a.download=this.modelJsonFileName,a.href=r,await i((()=>a.dispatchEvent(new MouseEvent("click")))),null!=e.weightData){const e=null==this.weightDataAnchor?document.createElement("a"):this.weightDataAnchor;e.download=this.weightDataFileName,e.href=t,await i((()=>e.dispatchEvent(new MouseEvent("click"))))}return{modelArtifactsInfo:Object(o.getModelArtifactsInfoForJSON)(e)}}}}a.URL_SCHEME="downloads://";class u{constructor(e){if(null==e||e.length<1)throw new Error(`When calling browserFiles, at least 1 file is required, but received ${e}`);this.jsonFile=e[0],this.weightsFiles=e.slice(1)}async load(){return new Promise(((e,t)=>{const n=new FileReader;n.onload=n=>{const s=JSON.parse(n.target.result),r=s.modelTopology;if(null==r)return void t(new Error(`modelTopology field is missing from file ${this.jsonFile.name}`));if(null==s.weightsManifest)return void t(new Error(`weightManifest field is missing from file ${this.jsonFile.name}`));if(0===this.weightsFiles.length)return void e({modelTopology:r});const i=Object(o.getModelArtifactsForJSON)(s,(e=>this.loadWeights(e)));e(i)},n.onerror=e=>t(`Failed to read model topology and weights manifest JSON from file '${this.jsonFile.name}'. BrowserFiles supports loading Keras-style tf.Model artifacts only.`),n.readAsText(this.jsonFile)}))}loadWeights(e){const t=[],n=[];for(const s of e)t.push(...s.weights),n.push(...s.paths);const s=this.checkManifestAndWeightFiles(e),r=n.map((e=>this.loadWeightsFile(e,s[e])));return Promise.all(r).then((e=>[t,Object(o.concatenateArrayBuffers)(e)]))}loadWeightsFile(e,t){return new Promise(((n,s)=>{const o=new FileReader;o.onload=e=>{const t=e.target.result;n(t)},o.onerror=t=>s(`Failed to weights data from file of path '${e}'.`),o.readAsArrayBuffer(t)}))}checkManifestAndWeightFiles(e){const t=[],n=this.weightsFiles.map((e=>Object(o.basename)(e.name))),s={};for(const r of e)r.paths.forEach((e=>{const r=Object(o.basename)(e);if(-1!==t.indexOf(r))throw new Error(`Duplicate file basename found in weights manifest: '${r}'`);if(t.push(r),-1===n.indexOf(r))throw new Error(`Weight file with basename '${r}' is not provided.`);s[e]=this.weightsFiles[n.indexOf(r)]}));if(t.length!==this.weightsFiles.length)throw new Error(`Mismatch in the number of files in weights manifest (${t.length}) and the number of weight files provided (${this.weightsFiles.length}).`);return s}}const d=e=>Object(s.env)().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(a.URL_SCHEME)?l(e.slice(a.URL_SCHEME.length)):null;function l(e="model"){return new a(e)}function c(e){return new u(e)}r.IORouterRegistry.registerSaveRouter(d)},"./node_modules/@tensorflow/tfjs-core/dist/io/http.js": /*!************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/io/http.js ***! \************************************************************/ -/*! exports provided: HTTPRequest, parseUrl, isHTTPScheme, httpRouter, http, browserHTTPRequest */function(e,t,n){"use strict";n.r(t),n.d(t,"HTTPRequest",(function(){return d})),n.d(t,"parseUrl",(function(){return u})),n.d(t,"isHTTPScheme",(function(){return l})),n.d(t,"httpRouter",(function(){return c})),n.d(t,"http",(function(){return f})),n.d(t,"browserHTTPRequest",(function(){return p}));var s=n(/*! ../environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./io_utils */"./node_modules/@tensorflow/tfjs-core/dist/io/io_utils.js"),i=n(/*! ./router_registry */"./node_modules/@tensorflow/tfjs-core/dist/io/router_registry.js"),a=n(/*! ./weights_loader */"./node_modules/@tensorflow/tfjs-core/dist/io/weights_loader.js");class d{constructor(e,t){if(this.DEFAULT_METHOD="POST",null==t&&(t={}),this.weightPathPrefix=t.weightPathPrefix,this.onProgress=t.onProgress,this.weightUrlConverter=t.weightUrlConverter,null!=t.fetchFunc?(Object(o.assert)("function"==typeof t.fetchFunc,(()=>"Must pass a function that matches the signature of `fetch` (see https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)")),this.fetch=t.fetchFunc):this.fetch=Object(s.env)().platform.fetch,Object(o.assert)(null!=e&&e.length>0,(()=>"URL path for http must not be null, undefined or empty.")),Array.isArray(e)&&Object(o.assert)(2===e.length,(()=>`URL paths for http must have a length of 2, (actual length is ${e.length}).`)),this.path=e,null!=t.requestInit&&null!=t.requestInit.body)throw new Error("requestInit is expected to have no pre-existing body, but has one.");this.requestInit=t.requestInit||{}}async save(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserHTTPRequest.save() does not support saving model topology in binary formats yet.");const t=Object.assign({method:this.DEFAULT_METHOD},this.requestInit);t.body=new FormData;const n=[{paths:["./model.weights.bin"],weights:e.weightSpecs}],s=Object(r.getModelJSONForModelArtifacts)(e,n);t.body.append("model.json",new Blob([JSON.stringify(s)],{type:"application/json"}),"model.json"),null!=e.weightData&&t.body.append("model.weights.bin",new Blob([e.weightData],{type:"application/octet-stream"}),"model.weights.bin");const o=await this.fetch(this.path,t);if(o.ok)return{modelArtifactsInfo:Object(r.getModelArtifactsInfoForJSON)(e),responses:[o]};throw new Error(`BrowserHTTPRequest.save() failed due to HTTP response status ${o.status}.`)}async load(){const e=await this.fetch(this.path,this.requestInit);if(!e.ok)throw new Error(`Request to ${this.path} failed with status code ${e.status}. Please verify this URL points to the model JSON of the model to load.`);let t;try{t=await e.json()}catch(e){let t=`Failed to parse model JSON of response from ${this.path}.`;throw this.path.endsWith(".pb")?t+=" Your path contains a .pb file extension. Support for .pb models have been removed in TensorFlow.js 1.0 in favor of .json models. You can re-convert your Python TensorFlow model using the TensorFlow.js 1.0 conversion scripts or you can convert your.pb models with the 'pb2json'NPM script in the tensorflow/tfjs-converter repository.":t+=" Please make sure the server is serving valid JSON for this request.",new Error(t)}const n=t.modelTopology,s=t.weightsManifest;if(null==n&&null==s)throw new Error(`The JSON from HTTP path ${this.path} contains neither model topology or manifest for weights.`);return Object(r.getModelArtifactsForJSON)(t,(e=>this.loadWeights(e)))}async loadWeights(e){const t=Array.isArray(this.path)?this.path[1]:this.path,[n,s]=u(t),o=this.weightPathPrefix||n,i=[];for(const t of e)i.push(...t.weights);const d=[],l=[];for(const t of e)for(const e of t.paths)null!=this.weightUrlConverter?l.push(this.weightUrlConverter(e)):d.push(o+e+s);this.weightUrlConverter&&d.push(...await Promise.all(l));const c=await Object(a.loadWeightsAsArrayBuffer)(d,{requestInit:this.requestInit,fetchFunc:this.fetch,onProgress:this.onProgress});return[i,Object(r.concatenateArrayBuffers)(c)]}}function u(e){const t=e.lastIndexOf("/"),n=e.lastIndexOf("?");return[e.substring(0,t)+"/",n>t?e.substring(n):""]}function l(e){return null!=e.match(d.URL_SCHEME_REGEX)}d.URL_SCHEME_REGEX=/^https?:\/\//;const c=(e,t)=>{if("undefined"==typeof fetch&&(null==t||null==t.fetchFunc))return null;{let n=!0;if(n=Array.isArray(e)?e.every((e=>l(e))):l(e),n)return f(e,t)}return null};function f(e,t){return new d(e,t)}function p(e,t){return f(e,t)}i.IORouterRegistry.registerSaveRouter(c),i.IORouterRegistry.registerLoadRouter(c)},"./node_modules/@tensorflow/tfjs-core/dist/io/indexed_db.js": +/*! exports provided: HTTPRequest, parseUrl, isHTTPScheme, httpRouter, http, browserHTTPRequest */function(e,t,n){"use strict";n.r(t),n.d(t,"HTTPRequest",(function(){return u})),n.d(t,"parseUrl",(function(){return d})),n.d(t,"isHTTPScheme",(function(){return l})),n.d(t,"httpRouter",(function(){return c})),n.d(t,"http",(function(){return f})),n.d(t,"browserHTTPRequest",(function(){return p}));var s=n(/*! ../environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./io_utils */"./node_modules/@tensorflow/tfjs-core/dist/io/io_utils.js"),i=n(/*! ./router_registry */"./node_modules/@tensorflow/tfjs-core/dist/io/router_registry.js"),a=n(/*! ./weights_loader */"./node_modules/@tensorflow/tfjs-core/dist/io/weights_loader.js");class u{constructor(e,t){if(this.DEFAULT_METHOD="POST",null==t&&(t={}),this.weightPathPrefix=t.weightPathPrefix,this.onProgress=t.onProgress,this.weightUrlConverter=t.weightUrlConverter,null!=t.fetchFunc?(Object(o.assert)("function"==typeof t.fetchFunc,(()=>"Must pass a function that matches the signature of `fetch` (see https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)")),this.fetch=t.fetchFunc):this.fetch=Object(s.env)().platform.fetch,Object(o.assert)(null!=e&&e.length>0,(()=>"URL path for http must not be null, undefined or empty.")),Array.isArray(e)&&Object(o.assert)(2===e.length,(()=>`URL paths for http must have a length of 2, (actual length is ${e.length}).`)),this.path=e,null!=t.requestInit&&null!=t.requestInit.body)throw new Error("requestInit is expected to have no pre-existing body, but has one.");this.requestInit=t.requestInit||{}}async save(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserHTTPRequest.save() does not support saving model topology in binary formats yet.");const t=Object.assign({method:this.DEFAULT_METHOD},this.requestInit);t.body=new FormData;const n=[{paths:["./model.weights.bin"],weights:e.weightSpecs}],s=Object(r.getModelJSONForModelArtifacts)(e,n);t.body.append("model.json",new Blob([JSON.stringify(s)],{type:"application/json"}),"model.json"),null!=e.weightData&&t.body.append("model.weights.bin",new Blob([e.weightData],{type:"application/octet-stream"}),"model.weights.bin");const o=await this.fetch(this.path,t);if(o.ok)return{modelArtifactsInfo:Object(r.getModelArtifactsInfoForJSON)(e),responses:[o]};throw new Error(`BrowserHTTPRequest.save() failed due to HTTP response status ${o.status}.`)}async load(){const e=await this.fetch(this.path,this.requestInit);if(!e.ok)throw new Error(`Request to ${this.path} failed with status code ${e.status}. Please verify this URL points to the model JSON of the model to load.`);let t;try{t=await e.json()}catch(e){let t=`Failed to parse model JSON of response from ${this.path}.`;throw this.path.endsWith(".pb")?t+=" Your path contains a .pb file extension. Support for .pb models have been removed in TensorFlow.js 1.0 in favor of .json models. You can re-convert your Python TensorFlow model using the TensorFlow.js 1.0 conversion scripts or you can convert your.pb models with the 'pb2json'NPM script in the tensorflow/tfjs-converter repository.":t+=" Please make sure the server is serving valid JSON for this request.",new Error(t)}const n=t.modelTopology,s=t.weightsManifest;if(null==n&&null==s)throw new Error(`The JSON from HTTP path ${this.path} contains neither model topology or manifest for weights.`);return Object(r.getModelArtifactsForJSON)(t,(e=>this.loadWeights(e)))}async loadWeights(e){const t=Array.isArray(this.path)?this.path[1]:this.path,[n,s]=d(t),o=this.weightPathPrefix||n,i=[];for(const t of e)i.push(...t.weights);const u=[],l=[];for(const t of e)for(const e of t.paths)null!=this.weightUrlConverter?l.push(this.weightUrlConverter(e)):u.push(o+e+s);this.weightUrlConverter&&u.push(...await Promise.all(l));const c=await Object(a.loadWeightsAsArrayBuffer)(u,{requestInit:this.requestInit,fetchFunc:this.fetch,onProgress:this.onProgress});return[i,Object(r.concatenateArrayBuffers)(c)]}}function d(e){const t=e.lastIndexOf("/"),n=e.lastIndexOf("?");return[e.substring(0,t)+"/",n>t?e.substring(n):""]}function l(e){return null!=e.match(u.URL_SCHEME_REGEX)}u.URL_SCHEME_REGEX=/^https?:\/\//;const c=(e,t)=>{if("undefined"==typeof fetch&&(null==t||null==t.fetchFunc))return null;{let n=!0;if(n=Array.isArray(e)?e.every((e=>l(e))):l(e),n)return f(e,t)}return null};function f(e,t){return new u(e,t)}function p(e,t){return f(e,t)}i.IORouterRegistry.registerSaveRouter(c),i.IORouterRegistry.registerLoadRouter(c)},"./node_modules/@tensorflow/tfjs-core/dist/io/indexed_db.js": /*!******************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/io/indexed_db.js ***! \******************************************************************/ -/*! exports provided: deleteDatabase, BrowserIndexedDB, indexedDBRouter, browserIndexedDB, BrowserIndexedDBManager */function(e,t,n){"use strict";n.r(t),n.d(t,"deleteDatabase",(function(){return u})),n.d(t,"BrowserIndexedDB",(function(){return f})),n.d(t,"indexedDBRouter",(function(){return p})),n.d(t,"browserIndexedDB",(function(){return m})),n.d(t,"BrowserIndexedDBManager",(function(){return h}));n(/*! ../flags */"./node_modules/@tensorflow/tfjs-core/dist/flags.js");var s=n(/*! ../environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"),o=n(/*! ./io_utils */"./node_modules/@tensorflow/tfjs-core/dist/io/io_utils.js"),r=n(/*! ./router_registry */"./node_modules/@tensorflow/tfjs-core/dist/io/router_registry.js"); +/*! exports provided: deleteDatabase, BrowserIndexedDB, indexedDBRouter, browserIndexedDB, BrowserIndexedDBManager */function(e,t,n){"use strict";n.r(t),n.d(t,"deleteDatabase",(function(){return d})),n.d(t,"BrowserIndexedDB",(function(){return f})),n.d(t,"indexedDBRouter",(function(){return p})),n.d(t,"browserIndexedDB",(function(){return m})),n.d(t,"BrowserIndexedDBManager",(function(){return h}));n(/*! ../flags */"./node_modules/@tensorflow/tfjs-core/dist/flags.js");var s=n(/*! ../environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"),o=n(/*! ./io_utils */"./node_modules/@tensorflow/tfjs-core/dist/io/io_utils.js"),r=n(/*! ./router_registry */"./node_modules/@tensorflow/tfjs-core/dist/io/router_registry.js"); /** * @license * Copyright 2018 Google LLC. All Rights Reserved. @@ -12196,15 +12197,15 @@ const o=n.n(s).a||s;function r(e){return o.fromString(e,!0,16)}const i=r("c3a5c8 * limitations under the License. * ============================================================================= */ -const i="tensorflowjs",a="models_store",d="model_info_store";async function u(){const e=l();return new Promise(((t,n)=>{const s=e.deleteDatabase(i);s.onsuccess=()=>t(),s.onerror=e=>n(e)}))}function l(){if(!Object(s.env)().getBool("IS_BROWSER"))throw new Error("Failed to obtain IndexedDB factory because the current environmentis not a web browser.");const e="undefined"==typeof window?self:window,t=e.indexedDB||e.mozIndexedDB||e.webkitIndexedDB||e.msIndexedDB||e.shimIndexedDB;if(null==t)throw new Error("The current browser does not appear to support IndexedDB.");return t}function c(e){const t=e.result;t.createObjectStore(a,{keyPath:"modelPath"}),t.createObjectStore(d,{keyPath:"modelPath"})}class f{constructor(e){if(this.indexedDB=l(),null==e||!e)throw new Error("For IndexedDB, modelPath must not be null, undefined or empty.");this.modelPath=e}async save(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserLocalStorage.save() does not support saving model topology in binary formats yet.");return this.databaseAction(this.modelPath,e)}async load(){return this.databaseAction(this.modelPath)}databaseAction(e,t){return new Promise(((e,n)=>{const s=this.indexedDB.open(i,1);s.onupgradeneeded=()=>c(s),s.onsuccess=()=>{const r=s.result;if(null==t){const t=r.transaction(a,"readonly"),s=t.objectStore(a).get(this.modelPath);s.onsuccess=()=>{if(null==s.result)return r.close(),n(new Error(`Cannot find model with path '${this.modelPath}' in IndexedDB.`));e(s.result.modelArtifacts)},s.onerror=e=>(r.close(),n(s.error)),t.oncomplete=()=>r.close()}else{const s=Object(o.getModelArtifactsInfoForJSON)(t),i=r.transaction(d,"readwrite");let u=i.objectStore(d);const l=u.put({modelPath:this.modelPath,modelArtifactsInfo:s});let c;l.onsuccess=()=>{c=r.transaction(a,"readwrite");const o=c.objectStore(a).put({modelPath:this.modelPath,modelArtifacts:t,modelArtifactsInfo:s});o.onsuccess=()=>e({modelArtifactsInfo:s}),o.onerror=e=>{u=i.objectStore(d);const t=u.delete(this.modelPath);t.onsuccess=()=>(r.close(),n(o.error)),t.onerror=e=>(r.close(),n(o.error))}},l.onerror=e=>(r.close(),n(l.error)),i.oncomplete=()=>{null==c?r.close():c.oncomplete=()=>r.close()}}},s.onerror=e=>n(s.error)}))}}f.URL_SCHEME="indexeddb://";const p=e=>Object(s.env)().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(f.URL_SCHEME)?m(e.slice(f.URL_SCHEME.length)):null;function m(e){return new f(e)}r.IORouterRegistry.registerSaveRouter(p),r.IORouterRegistry.registerLoadRouter(p);class h{constructor(){this.indexedDB=l()}async listModels(){return new Promise(((e,t)=>{const n=this.indexedDB.open(i,1);n.onupgradeneeded=()=>c(n),n.onsuccess=()=>{const s=n.result,o=s.transaction(d,"readonly"),r=o.objectStore(d).getAll();r.onsuccess=()=>{const t={};for(const e of r.result)t[e.modelPath]=e.modelArtifactsInfo;e(t)},r.onerror=e=>(s.close(),t(r.error)),o.oncomplete=()=>s.close()},n.onerror=e=>t(n.error)}))}async removeModel(e){var t;return e=(t=e).startsWith(f.URL_SCHEME)?t.slice(f.URL_SCHEME.length):t,new Promise(((t,n)=>{const s=this.indexedDB.open(i,1);s.onupgradeneeded=()=>c(s),s.onsuccess=()=>{const o=s.result,r=o.transaction(d,"readwrite"),i=r.objectStore(d),u=i.get(e);let l;u.onsuccess=()=>{if(null==u.result)return o.close(),n(new Error(`Cannot find model with path '${e}' in IndexedDB.`));{const s=i.delete(e),r=()=>{l=o.transaction(a,"readwrite");const s=l.objectStore(a).delete(e);s.onsuccess=()=>t(u.result.modelArtifactsInfo),s.onerror=e=>n(u.error)};s.onsuccess=r,s.onerror=e=>(r(),o.close(),n(u.error))}},u.onerror=e=>(o.close(),n(u.error)),r.oncomplete=()=>{null==l?o.close():l.oncomplete=()=>o.close()}},s.onerror=e=>n(s.error)}))}}},"./node_modules/@tensorflow/tfjs-core/dist/io/io.js": +const i="tensorflowjs",a="models_store",u="model_info_store";async function d(){const e=l();return new Promise(((t,n)=>{const s=e.deleteDatabase(i);s.onsuccess=()=>t(),s.onerror=e=>n(e)}))}function l(){if(!Object(s.env)().getBool("IS_BROWSER"))throw new Error("Failed to obtain IndexedDB factory because the current environmentis not a web browser.");const e="undefined"==typeof window?self:window,t=e.indexedDB||e.mozIndexedDB||e.webkitIndexedDB||e.msIndexedDB||e.shimIndexedDB;if(null==t)throw new Error("The current browser does not appear to support IndexedDB.");return t}function c(e){const t=e.result;t.createObjectStore(a,{keyPath:"modelPath"}),t.createObjectStore(u,{keyPath:"modelPath"})}class f{constructor(e){if(this.indexedDB=l(),null==e||!e)throw new Error("For IndexedDB, modelPath must not be null, undefined or empty.");this.modelPath=e}async save(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserLocalStorage.save() does not support saving model topology in binary formats yet.");return this.databaseAction(this.modelPath,e)}async load(){return this.databaseAction(this.modelPath)}databaseAction(e,t){return new Promise(((e,n)=>{const s=this.indexedDB.open(i,1);s.onupgradeneeded=()=>c(s),s.onsuccess=()=>{const r=s.result;if(null==t){const t=r.transaction(a,"readonly"),s=t.objectStore(a).get(this.modelPath);s.onsuccess=()=>{if(null==s.result)return r.close(),n(new Error(`Cannot find model with path '${this.modelPath}' in IndexedDB.`));e(s.result.modelArtifacts)},s.onerror=e=>(r.close(),n(s.error)),t.oncomplete=()=>r.close()}else{const s=Object(o.getModelArtifactsInfoForJSON)(t),i=r.transaction(u,"readwrite");let d=i.objectStore(u);const l=d.put({modelPath:this.modelPath,modelArtifactsInfo:s});let c;l.onsuccess=()=>{c=r.transaction(a,"readwrite");const o=c.objectStore(a).put({modelPath:this.modelPath,modelArtifacts:t,modelArtifactsInfo:s});o.onsuccess=()=>e({modelArtifactsInfo:s}),o.onerror=e=>{d=i.objectStore(u);const t=d.delete(this.modelPath);t.onsuccess=()=>(r.close(),n(o.error)),t.onerror=e=>(r.close(),n(o.error))}},l.onerror=e=>(r.close(),n(l.error)),i.oncomplete=()=>{null==c?r.close():c.oncomplete=()=>r.close()}}},s.onerror=e=>n(s.error)}))}}f.URL_SCHEME="indexeddb://";const p=e=>Object(s.env)().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(f.URL_SCHEME)?m(e.slice(f.URL_SCHEME.length)):null;function m(e){return new f(e)}r.IORouterRegistry.registerSaveRouter(p),r.IORouterRegistry.registerLoadRouter(p);class h{constructor(){this.indexedDB=l()}async listModels(){return new Promise(((e,t)=>{const n=this.indexedDB.open(i,1);n.onupgradeneeded=()=>c(n),n.onsuccess=()=>{const s=n.result,o=s.transaction(u,"readonly"),r=o.objectStore(u).getAll();r.onsuccess=()=>{const t={};for(const e of r.result)t[e.modelPath]=e.modelArtifactsInfo;e(t)},r.onerror=e=>(s.close(),t(r.error)),o.oncomplete=()=>s.close()},n.onerror=e=>t(n.error)}))}async removeModel(e){var t;return e=(t=e).startsWith(f.URL_SCHEME)?t.slice(f.URL_SCHEME.length):t,new Promise(((t,n)=>{const s=this.indexedDB.open(i,1);s.onupgradeneeded=()=>c(s),s.onsuccess=()=>{const o=s.result,r=o.transaction(u,"readwrite"),i=r.objectStore(u),d=i.get(e);let l;d.onsuccess=()=>{if(null==d.result)return o.close(),n(new Error(`Cannot find model with path '${e}' in IndexedDB.`));{const s=i.delete(e),r=()=>{l=o.transaction(a,"readwrite");const s=l.objectStore(a).delete(e);s.onsuccess=()=>t(d.result.modelArtifactsInfo),s.onerror=e=>n(d.error)};s.onsuccess=r,s.onerror=e=>(r(),o.close(),n(d.error))}},d.onerror=e=>(o.close(),n(d.error)),r.oncomplete=()=>{null==l?o.close():l.oncomplete=()=>o.close()}},s.onerror=e=>n(s.error)}))}}},"./node_modules/@tensorflow/tfjs-core/dist/io/io.js": /*!**********************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/io/io.js ***! \**********************************************************/ -/*! exports provided: copyModel, listModels, moveModel, removeModel, browserFiles, browserHTTPRequest, concatenateArrayBuffers, decodeWeights, encodeWeights, fromMemory, getLoadHandlers, getModelArtifactsForJSON, getModelArtifactsInfoForJSON, getSaveHandlers, http, isHTTPScheme, loadWeights, registerLoadRouter, registerSaveRouter, weightsLoaderFactory, withSaveHandler */function(e,t,n){"use strict";n.r(t);n(/*! ./indexed_db */"./node_modules/@tensorflow/tfjs-core/dist/io/indexed_db.js"),n(/*! ./local_storage */"./node_modules/@tensorflow/tfjs-core/dist/io/local_storage.js");var s=n(/*! ./browser_files */"./node_modules/@tensorflow/tfjs-core/dist/io/browser_files.js");n.d(t,"browserFiles",(function(){return s.browserFiles}));var o=n(/*! ./http */"./node_modules/@tensorflow/tfjs-core/dist/io/http.js");n.d(t,"browserHTTPRequest",(function(){return o.browserHTTPRequest})),n.d(t,"http",(function(){return o.http})),n.d(t,"isHTTPScheme",(function(){return o.isHTTPScheme}));var r=n(/*! ./io_utils */"./node_modules/@tensorflow/tfjs-core/dist/io/io_utils.js");n.d(t,"concatenateArrayBuffers",(function(){return r.concatenateArrayBuffers})),n.d(t,"decodeWeights",(function(){return r.decodeWeights})),n.d(t,"encodeWeights",(function(){return r.encodeWeights})),n.d(t,"getModelArtifactsForJSON",(function(){return r.getModelArtifactsForJSON})),n.d(t,"getModelArtifactsInfoForJSON",(function(){return r.getModelArtifactsInfoForJSON}));var i=n(/*! ./passthrough */"./node_modules/@tensorflow/tfjs-core/dist/io/passthrough.js");n.d(t,"fromMemory",(function(){return i.fromMemory})),n.d(t,"withSaveHandler",(function(){return i.withSaveHandler}));var a=n(/*! ./router_registry */"./node_modules/@tensorflow/tfjs-core/dist/io/router_registry.js");n.d(t,"getLoadHandlers",(function(){return a.getLoadHandlers})),n.d(t,"getSaveHandlers",(function(){return a.getSaveHandlers})),n.d(t,"registerLoadRouter",(function(){return a.registerLoadRouter})),n.d(t,"registerSaveRouter",(function(){return a.registerSaveRouter}));var d=n(/*! ./weights_loader */"./node_modules/@tensorflow/tfjs-core/dist/io/weights_loader.js");n.d(t,"loadWeights",(function(){return d.loadWeights})),n.d(t,"weightsLoaderFactory",(function(){return d.weightsLoaderFactory}));var u=n(/*! ./model_management */"./node_modules/@tensorflow/tfjs-core/dist/io/model_management.js");n.d(t,"copyModel",(function(){return u.copyModel})),n.d(t,"listModels",(function(){return u.listModels})),n.d(t,"moveModel",(function(){return u.moveModel})),n.d(t,"removeModel",(function(){return u.removeModel}))},"./node_modules/@tensorflow/tfjs-core/dist/io/io_utils.js": +/*! exports provided: copyModel, listModels, moveModel, removeModel, browserFiles, browserHTTPRequest, concatenateArrayBuffers, decodeWeights, encodeWeights, fromMemory, getLoadHandlers, getModelArtifactsForJSON, getModelArtifactsInfoForJSON, getSaveHandlers, http, isHTTPScheme, loadWeights, registerLoadRouter, registerSaveRouter, weightsLoaderFactory, withSaveHandler */function(e,t,n){"use strict";n.r(t);n(/*! ./indexed_db */"./node_modules/@tensorflow/tfjs-core/dist/io/indexed_db.js"),n(/*! ./local_storage */"./node_modules/@tensorflow/tfjs-core/dist/io/local_storage.js");var s=n(/*! ./browser_files */"./node_modules/@tensorflow/tfjs-core/dist/io/browser_files.js");n.d(t,"browserFiles",(function(){return s.browserFiles}));var o=n(/*! ./http */"./node_modules/@tensorflow/tfjs-core/dist/io/http.js");n.d(t,"browserHTTPRequest",(function(){return o.browserHTTPRequest})),n.d(t,"http",(function(){return o.http})),n.d(t,"isHTTPScheme",(function(){return o.isHTTPScheme}));var r=n(/*! ./io_utils */"./node_modules/@tensorflow/tfjs-core/dist/io/io_utils.js");n.d(t,"concatenateArrayBuffers",(function(){return r.concatenateArrayBuffers})),n.d(t,"decodeWeights",(function(){return r.decodeWeights})),n.d(t,"encodeWeights",(function(){return r.encodeWeights})),n.d(t,"getModelArtifactsForJSON",(function(){return r.getModelArtifactsForJSON})),n.d(t,"getModelArtifactsInfoForJSON",(function(){return r.getModelArtifactsInfoForJSON}));var i=n(/*! ./passthrough */"./node_modules/@tensorflow/tfjs-core/dist/io/passthrough.js");n.d(t,"fromMemory",(function(){return i.fromMemory})),n.d(t,"withSaveHandler",(function(){return i.withSaveHandler}));var a=n(/*! ./router_registry */"./node_modules/@tensorflow/tfjs-core/dist/io/router_registry.js");n.d(t,"getLoadHandlers",(function(){return a.getLoadHandlers})),n.d(t,"getSaveHandlers",(function(){return a.getSaveHandlers})),n.d(t,"registerLoadRouter",(function(){return a.registerLoadRouter})),n.d(t,"registerSaveRouter",(function(){return a.registerSaveRouter}));var u=n(/*! ./weights_loader */"./node_modules/@tensorflow/tfjs-core/dist/io/weights_loader.js");n.d(t,"loadWeights",(function(){return u.loadWeights})),n.d(t,"weightsLoaderFactory",(function(){return u.weightsLoaderFactory}));var d=n(/*! ./model_management */"./node_modules/@tensorflow/tfjs-core/dist/io/model_management.js");n.d(t,"copyModel",(function(){return d.copyModel})),n.d(t,"listModels",(function(){return d.listModels})),n.d(t,"moveModel",(function(){return d.moveModel})),n.d(t,"removeModel",(function(){return d.removeModel}))},"./node_modules/@tensorflow/tfjs-core/dist/io/io_utils.js": /*!****************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/io/io_utils.js ***! \****************************************************************/ -/*! exports provided: encodeWeights, decodeWeights, concatenateTypedArrays, stringByteLength, arrayBufferToBase64String, base64StringToArrayBuffer, concatenateArrayBuffers, basename, getModelJSONForModelArtifacts, getModelArtifactsForJSON, getModelArtifactsInfoForJSON, getFloat16Decoder */function(e,t,n){"use strict";n.r(t),function(e){n.d(t,"encodeWeights",(function(){return a})),n.d(t,"decodeWeights",(function(){return d})),n.d(t,"concatenateTypedArrays",(function(){return u})),n.d(t,"stringByteLength",(function(){return c})),n.d(t,"arrayBufferToBase64String",(function(){return f})),n.d(t,"base64StringToArrayBuffer",(function(){return p})),n.d(t,"concatenateArrayBuffers",(function(){return m})),n.d(t,"basename",(function(){return h})),n.d(t,"getModelJSONForModelArtifacts",(function(){return b})),n.d(t,"getModelArtifactsForJSON",(function(){return j})),n.d(t,"getModelArtifactsInfoForJSON",(function(){return g})),n.d(t,"getFloat16Decoder",(function(){return w}));var s=n(/*! ../ops/complex */"./node_modules/@tensorflow/tfjs-core/dist/ops/complex.js"),o=n(/*! ../ops/tensor */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor.js"),r=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),i=n(/*! ./types */"./node_modules/@tensorflow/tfjs-core/dist/io/types.js");async function a(e,t){const n=[],s=[],o=Array.isArray(e)?e.map((e=>e.name)):Object.keys(e);for(let r=0;r{const t=await a.bytes(),n=t.reduce(((e,t)=>e+t.length),0)+4*t.length,s=new Uint8Array(n);let o=0;for(let e=0;e{if(t+=e.byteLength,n.push(e.byteLength===e.buffer.byteLength?e:new e.constructor(e)),!(e instanceof Float32Array||e instanceof Int32Array||e instanceof Uint8Array))throw new Error(`Unsupported TypedArray subtype: ${e.constructor.name}`)}));const s=new Uint8Array(t);let o=0;return n.forEach((e=>{s.set(new Uint8Array(e.buffer),o),o+=e.byteLength})),s.buffer}const l="undefined"!=typeof e&&("undefined"==typeof Blob||"undefined"==typeof atob||"undefined"==typeof btoa);function c(t){return l?e.byteLength(t):new Blob([t]).size}function f(t){if(l)return e.from(t).toString("base64");const n=new Uint8Array(t);let s="";for(let e=0,t=n.length;e{t+=e.byteLength}));const n=new Uint8Array(t);let s=0;return e.forEach((e=>{n.set(new Uint8Array(e),s),s+=e.byteLength})),n.buffer}function h(e){for(e=e.trim();e.endsWith("/");)e=e.slice(0,e.length-1);const t=e.split("/");return t[t.length-1]}function b(e,t){const n={modelTopology:e.modelTopology,format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy,weightsManifest:t};return null!=e.signature&&(n.signature=e.signature),null!=e.userDefinedMetadata&&(n.userDefinedMetadata=e.userDefinedMetadata),null!=e.modelInitializer&&(n.modelInitializer=e.modelInitializer),null!=e.trainingConfig&&(n.trainingConfig=e.trainingConfig),n}async function j(e,t){const n={modelTopology:e.modelTopology,format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy};if(null!=e.trainingConfig&&(n.trainingConfig=e.trainingConfig),null!=e.weightsManifest){const[s,o]=await t(e.weightsManifest);n.weightSpecs=s,n.weightData=o}return null!=e.signature&&(n.signature=e.signature),null!=e.userDefinedMetadata&&(n.userDefinedMetadata=e.userDefinedMetadata),null!=e.modelInitializer&&(n.modelInitializer=e.modelInitializer),n}function g(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("Expected JSON model topology, received ArrayBuffer.");return{dateSaved:new Date,modelTopologyType:"JSON",modelTopologyBytes:null==e.modelTopology?0:c(JSON.stringify(e.modelTopology)),weightSpecsBytes:null==e.weightSpecs?0:c(JSON.stringify(e.weightSpecs)),weightDataBytes:null==e.weightData?0:e.weightData.byteLength}}function w(){const e=function(){const e=e=>{let t=e<<13,n=0;for(;0==(8388608&t);)n-=8388608,t<<=1;return t&=-8388609,n+=947912704,t|n},t=new Uint32Array(2048);t[0]=0;for(let n=1;n<1024;n++)t[n]=e(n);for(let e=1024;e<2048;e++)t[e]=939524096+(e-1024<<13);return t}(),t=function(){const e=new Uint32Array(64);e[0]=0,e[31]=1199570944,e[32]=2147483648,e[63]=3347054592;for(let t=1;t<31;t++)e[t]=t<<23;for(let t=33;t<63;t++)e[t]=2147483648+(t-32<<23);return e}(),n=function(){const e=new Uint32Array(64);for(let t=0;t<64;t++)e[t]=1024;return e[0]=e[32]=0,e}();return s=>{const o=new ArrayBuffer(4*s.length),r=new Uint32Array(o);for(let o=0;o>10]+(1023&i)]+t[i>>10];r[o]=a}return new Float32Array(o)}}}.call(this,n(/*! ./../../../../buffer/index.js */"./node_modules/buffer/index.js").Buffer)},"./node_modules/@tensorflow/tfjs-core/dist/io/local_storage.js": +/*! exports provided: encodeWeights, decodeWeights, concatenateTypedArrays, stringByteLength, arrayBufferToBase64String, base64StringToArrayBuffer, concatenateArrayBuffers, basename, getModelJSONForModelArtifacts, getModelArtifactsForJSON, getModelArtifactsInfoForJSON, getFloat16Decoder */function(e,t,n){"use strict";n.r(t),function(e){n.d(t,"encodeWeights",(function(){return a})),n.d(t,"decodeWeights",(function(){return u})),n.d(t,"concatenateTypedArrays",(function(){return d})),n.d(t,"stringByteLength",(function(){return c})),n.d(t,"arrayBufferToBase64String",(function(){return f})),n.d(t,"base64StringToArrayBuffer",(function(){return p})),n.d(t,"concatenateArrayBuffers",(function(){return m})),n.d(t,"basename",(function(){return h})),n.d(t,"getModelJSONForModelArtifacts",(function(){return b})),n.d(t,"getModelArtifactsForJSON",(function(){return j})),n.d(t,"getModelArtifactsInfoForJSON",(function(){return g})),n.d(t,"getFloat16Decoder",(function(){return w}));var s=n(/*! ../ops/complex */"./node_modules/@tensorflow/tfjs-core/dist/ops/complex.js"),o=n(/*! ../ops/tensor */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor.js"),r=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),i=n(/*! ./types */"./node_modules/@tensorflow/tfjs-core/dist/io/types.js");async function a(e,t){const n=[],s=[],o=Array.isArray(e)?e.map((e=>e.name)):Object.keys(e);for(let r=0;r{const t=await a.bytes(),n=t.reduce(((e,t)=>e+t.length),0)+4*t.length,s=new Uint8Array(n);let o=0;for(let e=0;e{if(t+=e.byteLength,n.push(e.byteLength===e.buffer.byteLength?e:new e.constructor(e)),!(e instanceof Float32Array||e instanceof Int32Array||e instanceof Uint8Array))throw new Error(`Unsupported TypedArray subtype: ${e.constructor.name}`)}));const s=new Uint8Array(t);let o=0;return n.forEach((e=>{s.set(new Uint8Array(e.buffer),o),o+=e.byteLength})),s.buffer}const l="undefined"!=typeof e&&("undefined"==typeof Blob||"undefined"==typeof atob||"undefined"==typeof btoa);function c(t){return l?e.byteLength(t):new Blob([t]).size}function f(t){if(l)return e.from(t).toString("base64");const n=new Uint8Array(t);let s="";for(let e=0,t=n.length;e{t+=e.byteLength}));const n=new Uint8Array(t);let s=0;return e.forEach((e=>{n.set(new Uint8Array(e),s),s+=e.byteLength})),n.buffer}function h(e){for(e=e.trim();e.endsWith("/");)e=e.slice(0,e.length-1);const t=e.split("/");return t[t.length-1]}function b(e,t){const n={modelTopology:e.modelTopology,format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy,weightsManifest:t};return null!=e.signature&&(n.signature=e.signature),null!=e.userDefinedMetadata&&(n.userDefinedMetadata=e.userDefinedMetadata),null!=e.modelInitializer&&(n.modelInitializer=e.modelInitializer),null!=e.trainingConfig&&(n.trainingConfig=e.trainingConfig),n}async function j(e,t){const n={modelTopology:e.modelTopology,format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy};if(null!=e.trainingConfig&&(n.trainingConfig=e.trainingConfig),null!=e.weightsManifest){const[s,o]=await t(e.weightsManifest);n.weightSpecs=s,n.weightData=o}return null!=e.signature&&(n.signature=e.signature),null!=e.userDefinedMetadata&&(n.userDefinedMetadata=e.userDefinedMetadata),null!=e.modelInitializer&&(n.modelInitializer=e.modelInitializer),n}function g(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("Expected JSON model topology, received ArrayBuffer.");return{dateSaved:new Date,modelTopologyType:"JSON",modelTopologyBytes:null==e.modelTopology?0:c(JSON.stringify(e.modelTopology)),weightSpecsBytes:null==e.weightSpecs?0:c(JSON.stringify(e.weightSpecs)),weightDataBytes:null==e.weightData?0:e.weightData.byteLength}}function w(){const e=function(){const e=e=>{let t=e<<13,n=0;for(;0==(8388608&t);)n-=8388608,t<<=1;return t&=-8388609,n+=947912704,t|n},t=new Uint32Array(2048);t[0]=0;for(let n=1;n<1024;n++)t[n]=e(n);for(let e=1024;e<2048;e++)t[e]=939524096+(e-1024<<13);return t}(),t=function(){const e=new Uint32Array(64);e[0]=0,e[31]=1199570944,e[32]=2147483648,e[63]=3347054592;for(let t=1;t<31;t++)e[t]=t<<23;for(let t=33;t<63;t++)e[t]=2147483648+(t-32<<23);return e}(),n=function(){const e=new Uint32Array(64);for(let t=0;t<64;t++)e[t]=1024;return e[0]=e[32]=0,e}();return s=>{const o=new ArrayBuffer(4*s.length),r=new Uint32Array(o);for(let o=0;o>10]+(1023&i)]+t[i>>10];r[o]=a}return new Float32Array(o)}}}.call(this,n(/*! ./../../../../buffer/index.js */"./node_modules/buffer/index.js").Buffer)},"./node_modules/@tensorflow/tfjs-core/dist/io/local_storage.js": /*!*********************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/io/local_storage.js ***! \*********************************************************************/ @@ -12225,11 +12226,11 @@ const i="tensorflowjs",a="models_store",d="model_info_store";async function u(){ * limitations under the License. * ============================================================================= */ -const a="/",d="tensorflowjs_models",u="info",l="model_topology",c="weight_specs",f="weight_data",p="model_metadata";function m(){if(!Object(s.env)().getBool("IS_BROWSER")||"undefined"==typeof window||"undefined"==typeof window.localStorage)throw new Error("purgeLocalStorageModels() cannot proceed because local storage is unavailable in the current environment.");const e=window.localStorage,t=[];for(let n=0;no.length){e.removeItem(s);const n=j(s);-1===t.indexOf(n)&&t.push(n)}}return t}function h(e){return{info:[d,e,u].join(a),topology:[d,e,l].join(a),weightSpecs:[d,e,c].join(a),weightData:[d,e,f].join(a),modelMetadata:[d,e,p].join(a)}}function b(e){for(const t of Object.values(e))window.localStorage.removeItem(t)}function j(e){const t=e.split(a);if(t.length<3)throw new Error(`Invalid key format: ${e}`);return t.slice(1,t.length-1).join(a)}class g{constructor(e){if(!Object(s.env)().getBool("IS_BROWSER")||"undefined"==typeof window||"undefined"==typeof window.localStorage)throw new Error("The current environment does not support local storage.");if(this.LS=window.localStorage,null==e||!e)throw new Error("For local storage, modelPath must not be null, undefined or empty.");this.modelPath=e,this.keys=h(this.modelPath)}async save(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserLocalStorage.save() does not support saving model topology in binary formats yet.");{const t=JSON.stringify(e.modelTopology),n=JSON.stringify(e.weightSpecs),s=Object(r.getModelArtifactsInfoForJSON)(e);try{this.LS.setItem(this.keys.info,JSON.stringify(s)),this.LS.setItem(this.keys.topology,t),this.LS.setItem(this.keys.weightSpecs,n),this.LS.setItem(this.keys.weightData,Object(r.arrayBufferToBase64String)(e.weightData));const o={format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy,signature:null!=e.signature?e.signature:void 0,userDefinedMetadata:null!=e.userDefinedMetadata?e.userDefinedMetadata:void 0,modelInitializer:null!=e.modelInitializer?e.modelInitializer:void 0,trainingConfig:null!=e.trainingConfig?e.trainingConfig:void 0};return this.LS.setItem(this.keys.modelMetadata,JSON.stringify(o)),{modelArtifactsInfo:s}}catch(e){throw b(this.keys),new Error(`Failed to save model '${this.modelPath}' to local storage: size quota being exceeded is a possible cause of this failure: modelTopologyBytes=${s.modelTopologyBytes}, weightSpecsBytes=${s.weightSpecsBytes}, weightDataBytes=${s.weightDataBytes}.`)}}}async load(){const e=JSON.parse(this.LS.getItem(this.keys.info));if(null==e)throw new Error(`In local storage, there is no model with name '${this.modelPath}'`);if("JSON"!==e.modelTopologyType)throw new Error("BrowserLocalStorage does not support loading non-JSON model topology yet.");const t={},n=JSON.parse(this.LS.getItem(this.keys.topology));if(null==n)throw new Error(`In local storage, the topology of model '${this.modelPath}' is missing.`);t.modelTopology=n;const s=JSON.parse(this.LS.getItem(this.keys.weightSpecs));if(null==s)throw new Error(`In local storage, the weight specs of model '${this.modelPath}' are missing.`);t.weightSpecs=s;const o=this.LS.getItem(this.keys.modelMetadata);if(null!=o){const e=JSON.parse(o);t.format=e.format,t.generatedBy=e.generatedBy,t.convertedBy=e.convertedBy,null!=e.signature&&(t.signature=e.signature),null!=e.userDefinedMetadata&&(t.userDefinedMetadata=e.userDefinedMetadata),null!=e.modelInitializer&&(t.modelInitializer=e.modelInitializer),null!=e.trainingConfig&&(t.trainingConfig=e.trainingConfig)}const i=this.LS.getItem(this.keys.weightData);if(null==i)throw new Error(`In local storage, the binary weight values of model '${this.modelPath}' are missing.`);return t.weightData=Object(r.base64StringToArrayBuffer)(i),t}}g.URL_SCHEME="localstorage://";const w=e=>Object(s.env)().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(g.URL_SCHEME)?_(e.slice(g.URL_SCHEME.length)):null;function _(e){return new g(e)}i.IORouterRegistry.registerSaveRouter(w),i.IORouterRegistry.registerLoadRouter(w);class k{constructor(){Object(o.assert)(Object(s.env)().getBool("IS_BROWSER"),(()=>"Current environment is not a web browser")),Object(o.assert)("undefined"==typeof window||"undefined"!=typeof window.localStorage,(()=>"Current browser does not appear to support localStorage")),this.LS=window.localStorage}async listModels(){const e={},t=d+a,n=a+u;for(let s=0;so.length){e.removeItem(s);const n=j(s);-1===t.indexOf(n)&&t.push(n)}}return t}function h(e){return{info:[u,e,d].join(a),topology:[u,e,l].join(a),weightSpecs:[u,e,c].join(a),weightData:[u,e,f].join(a),modelMetadata:[u,e,p].join(a)}}function b(e){for(const t of Object.values(e))window.localStorage.removeItem(t)}function j(e){const t=e.split(a);if(t.length<3)throw new Error(`Invalid key format: ${e}`);return t.slice(1,t.length-1).join(a)}class g{constructor(e){if(!Object(s.env)().getBool("IS_BROWSER")||"undefined"==typeof window||"undefined"==typeof window.localStorage)throw new Error("The current environment does not support local storage.");if(this.LS=window.localStorage,null==e||!e)throw new Error("For local storage, modelPath must not be null, undefined or empty.");this.modelPath=e,this.keys=h(this.modelPath)}async save(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserLocalStorage.save() does not support saving model topology in binary formats yet.");{const t=JSON.stringify(e.modelTopology),n=JSON.stringify(e.weightSpecs),s=Object(r.getModelArtifactsInfoForJSON)(e);try{this.LS.setItem(this.keys.info,JSON.stringify(s)),this.LS.setItem(this.keys.topology,t),this.LS.setItem(this.keys.weightSpecs,n),this.LS.setItem(this.keys.weightData,Object(r.arrayBufferToBase64String)(e.weightData));const o={format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy,signature:null!=e.signature?e.signature:void 0,userDefinedMetadata:null!=e.userDefinedMetadata?e.userDefinedMetadata:void 0,modelInitializer:null!=e.modelInitializer?e.modelInitializer:void 0,trainingConfig:null!=e.trainingConfig?e.trainingConfig:void 0};return this.LS.setItem(this.keys.modelMetadata,JSON.stringify(o)),{modelArtifactsInfo:s}}catch(e){throw b(this.keys),new Error(`Failed to save model '${this.modelPath}' to local storage: size quota being exceeded is a possible cause of this failure: modelTopologyBytes=${s.modelTopologyBytes}, weightSpecsBytes=${s.weightSpecsBytes}, weightDataBytes=${s.weightDataBytes}.`)}}}async load(){const e=JSON.parse(this.LS.getItem(this.keys.info));if(null==e)throw new Error(`In local storage, there is no model with name '${this.modelPath}'`);if("JSON"!==e.modelTopologyType)throw new Error("BrowserLocalStorage does not support loading non-JSON model topology yet.");const t={},n=JSON.parse(this.LS.getItem(this.keys.topology));if(null==n)throw new Error(`In local storage, the topology of model '${this.modelPath}' is missing.`);t.modelTopology=n;const s=JSON.parse(this.LS.getItem(this.keys.weightSpecs));if(null==s)throw new Error(`In local storage, the weight specs of model '${this.modelPath}' are missing.`);t.weightSpecs=s;const o=this.LS.getItem(this.keys.modelMetadata);if(null!=o){const e=JSON.parse(o);t.format=e.format,t.generatedBy=e.generatedBy,t.convertedBy=e.convertedBy,null!=e.signature&&(t.signature=e.signature),null!=e.userDefinedMetadata&&(t.userDefinedMetadata=e.userDefinedMetadata),null!=e.modelInitializer&&(t.modelInitializer=e.modelInitializer),null!=e.trainingConfig&&(t.trainingConfig=e.trainingConfig)}const i=this.LS.getItem(this.keys.weightData);if(null==i)throw new Error(`In local storage, the binary weight values of model '${this.modelPath}' are missing.`);return t.weightData=Object(r.base64StringToArrayBuffer)(i),t}}g.URL_SCHEME="localstorage://";const w=e=>Object(s.env)().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(g.URL_SCHEME)?_(e.slice(g.URL_SCHEME.length)):null;function _(e){return new g(e)}i.IORouterRegistry.registerSaveRouter(w),i.IORouterRegistry.registerLoadRouter(w);class k{constructor(){Object(o.assert)(Object(s.env)().getBool("IS_BROWSER"),(()=>"Current environment is not a web browser")),Object(o.assert)("undefined"==typeof window||"undefined"!=typeof window.localStorage,(()=>"Current browser does not appear to support localStorage")),this.LS=window.localStorage}async listModels(){const e={},t=u+a,n=a+d;for(let s=0;s"scheme must not be undefined or null.")),e.endsWith(r)&&(e=e.slice(0,e.indexOf(r))),Object(s.assert)(e.length>0,(()=>"scheme must not be an empty string."));const n=i.getInstance();Object(s.assert)(null==n.managers[e],(()=>`A model store manager is already registered for scheme '${e}'.`)),n.managers[e]=t}static getManager(e){const t=this.getInstance().managers[e];if(null==t)throw new Error(`Cannot find model manager for scheme '${e}'`);return t}static getSchemes(){return Object.keys(this.getInstance().managers)}}function a(e){if(-1===e.indexOf(r))throw new Error(`The url string provided does not contain a scheme. Supported schemes are: ${i.getSchemes().join(",")}`);return{scheme:e.split(r)[0],path:e.split(r)[1]}}async function d(e,t,n=!1){Object(s.assert)(e!==t,(()=>`Old path and new path are the same: '${e}'`));const r=o.IORouterRegistry.getLoadHandlers(e);Object(s.assert)(r.length>0,(()=>`Copying failed because no load handler is found for source URL ${e}.`)),Object(s.assert)(r.length<2,(()=>`Copying failed because more than one (${r.length}) load handlers for source URL ${e}.`));const d=r[0],u=o.IORouterRegistry.getSaveHandlers(t);Object(s.assert)(u.length>0,(()=>`Copying failed because no save handler is found for destination URL ${t}.`)),Object(s.assert)(u.length<2,(()=>`Copying failed because more than one (${r.length}) save handlers for destination URL ${t}.`));const l=u[0],c=a(e).scheme,f=a(e).path,p=c===a(e).scheme,m=await d.load();n&&p&&await i.getManager(c).removeModel(f);const h=await l.save(m);return n&&!p&&await i.getManager(c).removeModel(f),h.modelArtifactsInfo}async function u(){const e=i.getSchemes(),t={};for(const n of e){const e=await i.getManager(n).listModels();for(const s in e){t[n+r+s]=e[s]}}return t}async function l(e){const t=a(e);return i.getManager(t.scheme).removeModel(t.path)}async function c(e,t){return d(e,t,!1)}async function f(e,t){return d(e,t,!0)}},"./node_modules/@tensorflow/tfjs-core/dist/io/passthrough.js": +const r="://";class i{constructor(){this.managers={}}static getInstance(){return null==i.instance&&(i.instance=new i),i.instance}static registerManager(e,t){Object(s.assert)(null!=e,(()=>"scheme must not be undefined or null.")),e.endsWith(r)&&(e=e.slice(0,e.indexOf(r))),Object(s.assert)(e.length>0,(()=>"scheme must not be an empty string."));const n=i.getInstance();Object(s.assert)(null==n.managers[e],(()=>`A model store manager is already registered for scheme '${e}'.`)),n.managers[e]=t}static getManager(e){const t=this.getInstance().managers[e];if(null==t)throw new Error(`Cannot find model manager for scheme '${e}'`);return t}static getSchemes(){return Object.keys(this.getInstance().managers)}}function a(e){if(-1===e.indexOf(r))throw new Error(`The url string provided does not contain a scheme. Supported schemes are: ${i.getSchemes().join(",")}`);return{scheme:e.split(r)[0],path:e.split(r)[1]}}async function u(e,t,n=!1){Object(s.assert)(e!==t,(()=>`Old path and new path are the same: '${e}'`));const r=o.IORouterRegistry.getLoadHandlers(e);Object(s.assert)(r.length>0,(()=>`Copying failed because no load handler is found for source URL ${e}.`)),Object(s.assert)(r.length<2,(()=>`Copying failed because more than one (${r.length}) load handlers for source URL ${e}.`));const u=r[0],d=o.IORouterRegistry.getSaveHandlers(t);Object(s.assert)(d.length>0,(()=>`Copying failed because no save handler is found for destination URL ${t}.`)),Object(s.assert)(d.length<2,(()=>`Copying failed because more than one (${r.length}) save handlers for destination URL ${t}.`));const l=d[0],c=a(e).scheme,f=a(e).path,p=c===a(e).scheme,m=await u.load();n&&p&&await i.getManager(c).removeModel(f);const h=await l.save(m);return n&&!p&&await i.getManager(c).removeModel(f),h.modelArtifactsInfo}async function d(){const e=i.getSchemes(),t={};for(const n of e){const e=await i.getManager(n).listModels();for(const s in e){t[n+r+s]=e[s]}}return t}async function l(e){const t=a(e);return i.getManager(t.scheme).removeModel(t.path)}async function c(e,t){return u(e,t,!1)}async function f(e,t){return u(e,t,!0)}},"./node_modules/@tensorflow/tfjs-core/dist/io/passthrough.js": /*!*******************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/io/passthrough.js ***! \*******************************************************************/ @@ -12333,7 +12334,7 @@ const s={float32:4,float16:2,int32:4,uint16:2,uint8:1,bool:1,complex64:8}},"./no /*!**********************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/io/weights_loader.js ***! \**********************************************************************/ -/*! exports provided: loadWeightsAsArrayBuffer, loadWeights, weightsLoaderFactory */function(e,t,n){"use strict";n.r(t),n.d(t,"loadWeightsAsArrayBuffer",(function(){return d})),n.d(t,"loadWeights",(function(){return u})),n.d(t,"weightsLoaderFactory",(function(){return l}));var s=n(/*! ../environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./io_utils */"./node_modules/@tensorflow/tfjs-core/dist/io/io_utils.js"),i=n(/*! ./progress */"./node_modules/@tensorflow/tfjs-core/dist/io/progress.js"),a=n(/*! ./types */"./node_modules/@tensorflow/tfjs-core/dist/io/types.js"); +/*! exports provided: loadWeightsAsArrayBuffer, loadWeights, weightsLoaderFactory */function(e,t,n){"use strict";n.r(t),n.d(t,"loadWeightsAsArrayBuffer",(function(){return u})),n.d(t,"loadWeights",(function(){return d})),n.d(t,"weightsLoaderFactory",(function(){return l}));var s=n(/*! ../environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./io_utils */"./node_modules/@tensorflow/tfjs-core/dist/io/io_utils.js"),i=n(/*! ./progress */"./node_modules/@tensorflow/tfjs-core/dist/io/progress.js"),a=n(/*! ./types */"./node_modules/@tensorflow/tfjs-core/dist/io/types.js"); /** * @license * Copyright 2018 Google LLC. All Rights Reserved. @@ -12350,15 +12351,15 @@ const s={float32:4,float16:2,int32:4,uint16:2,uint8:1,bool:1,complex64:8}},"./no * limitations under the License. * ============================================================================= */ -async function d(e,t){null==t&&(t={});const n=null==t.fetchFunc?Object(s.env)().platform.fetch:t.fetchFunc,o=e.map((e=>n(e,t.requestInit,{isBinary:!0}))),r=(null==t.onProgress?await Promise.all(o):await Object(i.monitorPromisesProgress)(o,t.onProgress,0,.5)).map((e=>e.arrayBuffer()));return null==t.onProgress?await Promise.all(r):await Object(i.monitorPromisesProgress)(r,t.onProgress,.5,1)}async function u(e,t="",n,s){return l((e=>d(e,{requestInit:s})))(e,t,n)}function l(e){return async(t,n="",s)=>{const i=t.map((()=>!1)),d={},u=null!=s?s.map((()=>!1)):[],l=[];if(t.forEach(((e,t)=>{let n=0;e.weights.forEach((e=>{const r="quantization"in e?e.quantization.dtype:e.dtype,c=a.DTYPE_VALUE_SIZE_MAP[r]*o.sizeFromShape(e.shape),f=()=>{i[t]=!0,null==d[t]&&(d[t]=[]),d[t].push({manifestEntry:e,groupOffset:n,sizeBytes:c})};null!=s?s.forEach(((t,n)=>{t===e.name&&(f(),u[n]=!0)})):f(),l.push(e.name),n+=c}))})),!u.every((e=>e))){const e=s.filter(((e,t)=>!u[t]));throw new Error(`Could not find weights in manifest with names: ${e.join(", ")}. \nManifest JSON has weights with names: ${l.join(", ")}.`)}const c=i.reduce(((e,t,n)=>(t&&e.push(n),e)),[]),f=[];c.forEach((e=>{t[e].paths.forEach((e=>{const t=n+(n.endsWith("/")?"":"/")+e;f.push(t)}))}));const p=await e(f),m={};let h=0;return c.forEach((e=>{const n=t[e].paths.length;let s=0;for(let e=0;e{const t=o.slice(e.groupOffset,e.groupOffset+e.sizeBytes),n=Object(r.decodeWeights)(t,[e.manifestEntry]);for(const e in n)m[e]=n[e]})),h+=n})),m}}},"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js": +async function u(e,t){null==t&&(t={});const n=null==t.fetchFunc?Object(s.env)().platform.fetch:t.fetchFunc,o=e.map((e=>n(e,t.requestInit,{isBinary:!0}))),r=(null==t.onProgress?await Promise.all(o):await Object(i.monitorPromisesProgress)(o,t.onProgress,0,.5)).map((e=>e.arrayBuffer()));return null==t.onProgress?await Promise.all(r):await Object(i.monitorPromisesProgress)(r,t.onProgress,.5,1)}async function d(e,t="",n,s){return l((e=>u(e,{requestInit:s})))(e,t,n)}function l(e){return async(t,n="",s)=>{const i=t.map((()=>!1)),u={},d=null!=s?s.map((()=>!1)):[],l=[];if(t.forEach(((e,t)=>{let n=0;e.weights.forEach((e=>{const r="quantization"in e?e.quantization.dtype:e.dtype,c=a.DTYPE_VALUE_SIZE_MAP[r]*o.sizeFromShape(e.shape),f=()=>{i[t]=!0,null==u[t]&&(u[t]=[]),u[t].push({manifestEntry:e,groupOffset:n,sizeBytes:c})};null!=s?s.forEach(((t,n)=>{t===e.name&&(f(),d[n]=!0)})):f(),l.push(e.name),n+=c}))})),!d.every((e=>e))){const e=s.filter(((e,t)=>!d[t]));throw new Error(`Could not find weights in manifest with names: ${e.join(", ")}. \nManifest JSON has weights with names: ${l.join(", ")}.`)}const c=i.reduce(((e,t,n)=>(t&&e.push(n),e)),[]),f=[];c.forEach((e=>{t[e].paths.forEach((e=>{const t=n+(n.endsWith("/")?"":"/")+e;f.push(t)}))}));const p=await e(f),m={};let h=0;return c.forEach((e=>{const n=t[e].paths.length;let s=0;for(let e=0;e{const t=o.slice(e.groupOffset,e.groupOffset+e.sizeBytes),n=Object(r.decodeWeights)(t,[e.manifestEntry]);for(const e in n)m[e]=n[e]})),h+=n})),m}}},"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js": /*!*****************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js ***! \*****************************************************************/ -/*! exports provided: Abs, Acos, Acosh, Add, AddN, All, Any, ArgMax, ArgMin, Asin, Asinh, Atan, Atanh, Atan2, AvgPool, AvgPoolGrad, AvgPool3D, AvgPool3DGrad, BatchMatMul, BatchToSpaceND, Bincount, BroadcastTo, Cast, Ceil, ClipByValue, Complex, ComplexAbs, Concat, Conv2D, Conv2DBackpropFilter, Conv2DBackpropInput, Conv3D, Conv3DBackpropFilterV2, Conv3DBackpropInputV2, Cos, Cosh, Cumsum, CropAndResize, DenseBincount, DepthToSpace, DepthwiseConv2dNative, DepthwiseConv2dNativeBackpropFilter, DepthwiseConv2dNativeBackpropInput, Diag, Dilation2D, Dilation2DBackpropInput, Dilation2DBackpropFilter, RealDiv, Einsum, Elu, EluGrad, Erf, Equal, Exp, ExpandDims, Expm1, FFT, Fill, FlipLeftRight, Floor, FloorDiv, FusedBatchNorm, GatherV2, GatherNd, Greater, GreaterEqual, Identity, IFFT, Imag, IsFinite, IsInf, IsNan, LeakyRelu, Less, LessEqual, LinSpace, Log, Log1p, LogicalAnd, LogicalNot, LogicalOr, LogSoftmax, LRN, LRNGrad, Max, Maximum, MaxPool, MaxPoolGrad, MaxPool3D, MaxPool3DGrad, MaxPoolWithArgmax, Mean, Min, Minimum, MirrorPad, Mod, Multinomial, Multiply, Neg, NotEqual, NonMaxSuppressionV3, NonMaxSuppressionV4, NonMaxSuppressionV5, OnesLike, OneHot, Pack, PadV2, Pool, Pow, Prelu, Prod, Range, Real, Reciprocal, Relu, Reshape, ResizeNearestNeighbor, ResizeNearestNeighborGrad, ResizeBilinear, ResizeBilinearGrad, Relu6, Reverse, Round, Rsqrt, ScatterNd, Select, Selu, Slice, Sin, Sinh, Sign, Sigmoid, Softplus, Sqrt, Sum, SpaceToBatchND, SplitV, Softmax, SparseFillEmptyRows, SparseReshape, SparseSegmentMean, SparseSegmentSum, SparseToDense, SquaredDifference, Square, StridedSlice, StringNGrams, StringSplit, StringToHashBucketFast, Sub, Tan, Tanh, Tile, TopK, Transform, Transpose, Unique, Unpack, UnsortedSegmentSum, ZerosLike, Step, FromPixels, RotateWithOffset, _FusedMatMul, FusedConv2D, FusedDepthwiseConv2D */function(e,t,n){"use strict";n.r(t),n.d(t,"Abs",(function(){return s})),n.d(t,"Acos",(function(){return o})),n.d(t,"Acosh",(function(){return r})),n.d(t,"Add",(function(){return i})),n.d(t,"AddN",(function(){return a})),n.d(t,"All",(function(){return d})),n.d(t,"Any",(function(){return u})),n.d(t,"ArgMax",(function(){return l})),n.d(t,"ArgMin",(function(){return c})),n.d(t,"Asin",(function(){return f})),n.d(t,"Asinh",(function(){return p})),n.d(t,"Atan",(function(){return m})),n.d(t,"Atanh",(function(){return h})),n.d(t,"Atan2",(function(){return b})),n.d(t,"AvgPool",(function(){return j})),n.d(t,"AvgPoolGrad",(function(){return g})),n.d(t,"AvgPool3D",(function(){return w})),n.d(t,"AvgPool3DGrad",(function(){return _})),n.d(t,"BatchMatMul",(function(){return k})),n.d(t,"BatchToSpaceND",(function(){return v})),n.d(t,"Bincount",(function(){return x})),n.d(t,"BroadcastTo",(function(){return y})),n.d(t,"Cast",(function(){return O})),n.d(t,"Ceil",(function(){return I})),n.d(t,"ClipByValue",(function(){return C})),n.d(t,"Complex",(function(){return S})),n.d(t,"ComplexAbs",(function(){return T})),n.d(t,"Concat",(function(){return N})),n.d(t,"Conv2D",(function(){return E})),n.d(t,"Conv2DBackpropFilter",(function(){return A})),n.d(t,"Conv2DBackpropInput",(function(){return R})),n.d(t,"Conv3D",(function(){return F})),n.d(t,"Conv3DBackpropFilterV2",(function(){return $})),n.d(t,"Conv3DBackpropInputV2",(function(){return M})),n.d(t,"Cos",(function(){return D})),n.d(t,"Cosh",(function(){return P})),n.d(t,"Cumsum",(function(){return B})),n.d(t,"CropAndResize",(function(){return L})),n.d(t,"DenseBincount",(function(){return z})),n.d(t,"DepthToSpace",(function(){return G})),n.d(t,"DepthwiseConv2dNative",(function(){return W})),n.d(t,"DepthwiseConv2dNativeBackpropFilter",(function(){return U})),n.d(t,"DepthwiseConv2dNativeBackpropInput",(function(){return V})),n.d(t,"Diag",(function(){return q})),n.d(t,"Dilation2D",(function(){return H})),n.d(t,"Dilation2DBackpropInput",(function(){return K})),n.d(t,"Dilation2DBackpropFilter",(function(){return X})),n.d(t,"RealDiv",(function(){return Y})),n.d(t,"Einsum",(function(){return Z})),n.d(t,"Elu",(function(){return Q})),n.d(t,"EluGrad",(function(){return J})),n.d(t,"Erf",(function(){return ee})),n.d(t,"Equal",(function(){return te})),n.d(t,"Exp",(function(){return ne})),n.d(t,"ExpandDims",(function(){return se})),n.d(t,"Expm1",(function(){return oe})),n.d(t,"FFT",(function(){return re})),n.d(t,"Fill",(function(){return ie})),n.d(t,"FlipLeftRight",(function(){return ae})),n.d(t,"Floor",(function(){return de})),n.d(t,"FloorDiv",(function(){return ue})),n.d(t,"FusedBatchNorm",(function(){return le})),n.d(t,"GatherV2",(function(){return ce})),n.d(t,"GatherNd",(function(){return fe})),n.d(t,"Greater",(function(){return pe})),n.d(t,"GreaterEqual",(function(){return me})),n.d(t,"Identity",(function(){return he})),n.d(t,"IFFT",(function(){return be})),n.d(t,"Imag",(function(){return je})),n.d(t,"IsFinite",(function(){return ge})),n.d(t,"IsInf",(function(){return we})),n.d(t,"IsNan",(function(){return _e})),n.d(t,"LeakyRelu",(function(){return ke})),n.d(t,"Less",(function(){return ve})),n.d(t,"LessEqual",(function(){return xe})),n.d(t,"LinSpace",(function(){return ye})),n.d(t,"Log",(function(){return Oe})),n.d(t,"Log1p",(function(){return Ie})),n.d(t,"LogicalAnd",(function(){return Ce})),n.d(t,"LogicalNot",(function(){return Se})),n.d(t,"LogicalOr",(function(){return Te})),n.d(t,"LogSoftmax",(function(){return Ne})),n.d(t,"LRN",(function(){return Ee})),n.d(t,"LRNGrad",(function(){return Ae})),n.d(t,"Max",(function(){return Re})),n.d(t,"Maximum",(function(){return Fe})),n.d(t,"MaxPool",(function(){return $e})),n.d(t,"MaxPoolGrad",(function(){return Me})),n.d(t,"MaxPool3D",(function(){return De})),n.d(t,"MaxPool3DGrad",(function(){return Pe})),n.d(t,"MaxPoolWithArgmax",(function(){return Be})),n.d(t,"Mean",(function(){return Le})),n.d(t,"Min",(function(){return ze})),n.d(t,"Minimum",(function(){return Ge})),n.d(t,"MirrorPad",(function(){return We})),n.d(t,"Mod",(function(){return Ue})),n.d(t,"Multinomial",(function(){return Ve})),n.d(t,"Multiply",(function(){return qe})),n.d(t,"Neg",(function(){return He})),n.d(t,"NotEqual",(function(){return Ke})),n.d(t,"NonMaxSuppressionV3",(function(){return Xe})),n.d(t,"NonMaxSuppressionV4",(function(){return Ye})),n.d(t,"NonMaxSuppressionV5",(function(){return Ze})),n.d(t,"OnesLike",(function(){return Qe})),n.d(t,"OneHot",(function(){return Je})),n.d(t,"Pack",(function(){return et})),n.d(t,"PadV2",(function(){return tt})),n.d(t,"Pool",(function(){return nt})),n.d(t,"Pow",(function(){return st})),n.d(t,"Prelu",(function(){return ot})),n.d(t,"Prod",(function(){return rt})),n.d(t,"Range",(function(){return it})),n.d(t,"Real",(function(){return at})),n.d(t,"Reciprocal",(function(){return dt})),n.d(t,"Relu",(function(){return ut})),n.d(t,"Reshape",(function(){return lt})),n.d(t,"ResizeNearestNeighbor",(function(){return ct})),n.d(t,"ResizeNearestNeighborGrad",(function(){return ft})),n.d(t,"ResizeBilinear",(function(){return pt})),n.d(t,"ResizeBilinearGrad",(function(){return mt})),n.d(t,"Relu6",(function(){return ht})),n.d(t,"Reverse",(function(){return bt})),n.d(t,"Round",(function(){return jt})),n.d(t,"Rsqrt",(function(){return gt})),n.d(t,"ScatterNd",(function(){return wt})),n.d(t,"Select",(function(){return _t})),n.d(t,"Selu",(function(){return kt})),n.d(t,"Slice",(function(){return vt})),n.d(t,"Sin",(function(){return xt})),n.d(t,"Sinh",(function(){return yt})),n.d(t,"Sign",(function(){return Ot})),n.d(t,"Sigmoid",(function(){return It})),n.d(t,"Softplus",(function(){return Ct})),n.d(t,"Sqrt",(function(){return St})),n.d(t,"Sum",(function(){return Tt})),n.d(t,"SpaceToBatchND",(function(){return Nt})),n.d(t,"SplitV",(function(){return Et})),n.d(t,"Softmax",(function(){return At})),n.d(t,"SparseFillEmptyRows",(function(){return Rt})),n.d(t,"SparseReshape",(function(){return Ft})),n.d(t,"SparseSegmentMean",(function(){return $t})),n.d(t,"SparseSegmentSum",(function(){return Mt})),n.d(t,"SparseToDense",(function(){return Dt})),n.d(t,"SquaredDifference",(function(){return Pt})),n.d(t,"Square",(function(){return Bt})),n.d(t,"StridedSlice",(function(){return Lt})),n.d(t,"StringNGrams",(function(){return zt})),n.d(t,"StringSplit",(function(){return Gt})),n.d(t,"StringToHashBucketFast",(function(){return Wt})),n.d(t,"Sub",(function(){return Ut})),n.d(t,"Tan",(function(){return Vt})),n.d(t,"Tanh",(function(){return qt})),n.d(t,"Tile",(function(){return Ht})),n.d(t,"TopK",(function(){return Kt})),n.d(t,"Transform",(function(){return Xt})),n.d(t,"Transpose",(function(){return Yt})),n.d(t,"Unique",(function(){return Zt})),n.d(t,"Unpack",(function(){return Qt})),n.d(t,"UnsortedSegmentSum",(function(){return Jt})),n.d(t,"ZerosLike",(function(){return en})),n.d(t,"Step",(function(){return tn})),n.d(t,"FromPixels",(function(){return nn})),n.d(t,"RotateWithOffset",(function(){return sn})),n.d(t,"_FusedMatMul",(function(){return on})),n.d(t,"FusedConv2D",(function(){return rn})),n.d(t,"FusedDepthwiseConv2D",(function(){return an}));const s="Abs",o="Acos",r="Acosh",i="Add",a="AddN",d="All",u="Any",l="ArgMax",c="ArgMin",f="Asin",p="Asinh",m="Atan",h="Atanh",b="Atan2",j="AvgPool",g="AvgPoolGrad",w="AvgPool3D",_="AvgPool3DGrad",k="BatchMatMul",v="BatchToSpaceND",x="Bincount",y="BroadcastTo",O="Cast",I="Ceil",C="ClipByValue",S="Complex",T="ComplexAbs",N="Concat",E="Conv2D",A="Conv2DBackpropFilter",R="Conv2DBackpropInput",F="Conv3D",$="Conv3DBackpropFilterV2",M="Conv3DBackpropInputV2",D="Cos",P="Cosh",B="Cumsum",L="CropAndResize",z="DenseBincount",G="DepthToSpace",W="DepthwiseConv2dNative",U="DepthwiseConv2dNativeBackpropFilter",V="DepthwiseConv2dNativeBackpropInput",q="Diag",H="Dilation2D",K="Dilation2DBackpropInput",X="Dilation2DBackpropFilter",Y="RealDiv",Z="Einsum",Q="Elu",J="EluGrad",ee="Erf",te="Equal",ne="Exp",se="ExpandDims",oe="Expm1",re="FFT",ie="Fill",ae="FlipLeftRight",de="Floor",ue="FloorDiv",le="FusedBatchNorm",ce="GatherV2",fe="GatherNd",pe="Greater",me="GreaterEqual",he="Identity",be="IFFT",je="Imag",ge="IsFinite",we="IsInf",_e="IsNan",ke="LeakyRelu",ve="Less",xe="LessEqual",ye="LinSpace",Oe="Log",Ie="Log1p",Ce="LogicalAnd",Se="LogicalNot",Te="LogicalOr",Ne="LogSoftmax",Ee="LRN",Ae="LRNGrad",Re="Max",Fe="Maximum",$e="MaxPool",Me="MaxPoolGrad",De="MaxPool3D",Pe="MaxPool3DGrad",Be="MaxPoolWithArgmax",Le="Mean",ze="Min",Ge="Minimum",We="MirrorPad",Ue="Mod",Ve="Multinomial",qe="Multiply",He="Neg",Ke="NotEqual",Xe="NonMaxSuppressionV3",Ye="NonMaxSuppressionV4",Ze="NonMaxSuppressionV5",Qe="OnesLike",Je="OneHot",et="Pack",tt="PadV2",nt="Pool",st="Pow",ot="Prelu",rt="Prod",it="Range",at="Real",dt="Reciprocal",ut="Relu",lt="Reshape",ct="ResizeNearestNeighbor",ft="ResizeNearestNeighborGrad",pt="ResizeBilinear",mt="ResizeBilinearGrad",ht="Relu6",bt="Reverse",jt="Round",gt="Rsqrt",wt="ScatterNd",_t="Select",kt="Selu",vt="Slice",xt="Sin",yt="Sinh",Ot="Sign",It="Sigmoid",Ct="Softplus",St="Sqrt",Tt="Sum",Nt="SpaceToBatchND",Et="SplitV",At="Softmax",Rt="SparseFillEmptyRows",Ft="SparseReshape",$t="SparseSegmentMean",Mt="SparseSegmentSum",Dt="SparseToDense",Pt="SquaredDifference",Bt="Square",Lt="StridedSlice",zt="StringNGrams",Gt="StringSplit",Wt="StringToHashBucketFast",Ut="Sub",Vt="Tan",qt="Tanh",Ht="Tile",Kt="TopK",Xt="Transform",Yt="Transpose",Zt="Unique",Qt="Unpack",Jt="UnsortedSegmentSum",en="ZerosLike",tn="Step",nn="FromPixels",sn="RotateWithOffset",on="_FusedMatMul",rn="FusedConv2D",an="FusedDepthwiseConv2D"},"./node_modules/@tensorflow/tfjs-core/dist/kernel_registry.js": +/*! exports provided: Abs, Acos, Acosh, Add, AddN, All, Any, ArgMax, ArgMin, Asin, Asinh, Atan, Atanh, Atan2, AvgPool, AvgPoolGrad, AvgPool3D, AvgPool3DGrad, BatchMatMul, BatchToSpaceND, Bincount, BroadcastTo, Cast, Ceil, ClipByValue, Complex, ComplexAbs, Concat, Conv2D, Conv2DBackpropFilter, Conv2DBackpropInput, Conv3D, Conv3DBackpropFilterV2, Conv3DBackpropInputV2, Cos, Cosh, Cumsum, CropAndResize, DenseBincount, DepthToSpace, DepthwiseConv2dNative, DepthwiseConv2dNativeBackpropFilter, DepthwiseConv2dNativeBackpropInput, Diag, Dilation2D, Dilation2DBackpropInput, Dilation2DBackpropFilter, RealDiv, Einsum, Elu, EluGrad, Erf, Equal, Exp, ExpandDims, Expm1, FFT, Fill, FlipLeftRight, Floor, FloorDiv, FusedBatchNorm, GatherV2, GatherNd, Greater, GreaterEqual, Identity, IFFT, Imag, IsFinite, IsInf, IsNan, LeakyRelu, Less, LessEqual, LinSpace, Log, Log1p, LogicalAnd, LogicalNot, LogicalOr, LogSoftmax, LRN, LRNGrad, Max, Maximum, MaxPool, MaxPoolGrad, MaxPool3D, MaxPool3DGrad, MaxPoolWithArgmax, Mean, Min, Minimum, MirrorPad, Mod, Multinomial, Multiply, Neg, NotEqual, NonMaxSuppressionV3, NonMaxSuppressionV4, NonMaxSuppressionV5, OnesLike, OneHot, Pack, PadV2, Pool, Pow, Prelu, Prod, Range, Real, Reciprocal, Relu, Reshape, ResizeNearestNeighbor, ResizeNearestNeighborGrad, ResizeBilinear, ResizeBilinearGrad, Relu6, Reverse, Round, Rsqrt, ScatterNd, Select, Selu, Slice, Sin, Sinh, Sign, Sigmoid, Softplus, Sqrt, Sum, SpaceToBatchND, SplitV, Softmax, SparseFillEmptyRows, SparseReshape, SparseSegmentMean, SparseSegmentSum, SparseToDense, SquaredDifference, Square, StridedSlice, StringNGrams, StringSplit, StringToHashBucketFast, Sub, Tan, Tanh, Tile, TopK, Transform, Transpose, Unique, Unpack, UnsortedSegmentSum, ZerosLike, Step, FromPixels, RotateWithOffset, _FusedMatMul, FusedConv2D, FusedDepthwiseConv2D */function(e,t,n){"use strict";n.r(t),n.d(t,"Abs",(function(){return s})),n.d(t,"Acos",(function(){return o})),n.d(t,"Acosh",(function(){return r})),n.d(t,"Add",(function(){return i})),n.d(t,"AddN",(function(){return a})),n.d(t,"All",(function(){return u})),n.d(t,"Any",(function(){return d})),n.d(t,"ArgMax",(function(){return l})),n.d(t,"ArgMin",(function(){return c})),n.d(t,"Asin",(function(){return f})),n.d(t,"Asinh",(function(){return p})),n.d(t,"Atan",(function(){return m})),n.d(t,"Atanh",(function(){return h})),n.d(t,"Atan2",(function(){return b})),n.d(t,"AvgPool",(function(){return j})),n.d(t,"AvgPoolGrad",(function(){return g})),n.d(t,"AvgPool3D",(function(){return w})),n.d(t,"AvgPool3DGrad",(function(){return _})),n.d(t,"BatchMatMul",(function(){return k})),n.d(t,"BatchToSpaceND",(function(){return v})),n.d(t,"Bincount",(function(){return x})),n.d(t,"BroadcastTo",(function(){return y})),n.d(t,"Cast",(function(){return O})),n.d(t,"Ceil",(function(){return I})),n.d(t,"ClipByValue",(function(){return C})),n.d(t,"Complex",(function(){return S})),n.d(t,"ComplexAbs",(function(){return T})),n.d(t,"Concat",(function(){return N})),n.d(t,"Conv2D",(function(){return E})),n.d(t,"Conv2DBackpropFilter",(function(){return A})),n.d(t,"Conv2DBackpropInput",(function(){return R})),n.d(t,"Conv3D",(function(){return F})),n.d(t,"Conv3DBackpropFilterV2",(function(){return M})),n.d(t,"Conv3DBackpropInputV2",(function(){return $})),n.d(t,"Cos",(function(){return D})),n.d(t,"Cosh",(function(){return P})),n.d(t,"Cumsum",(function(){return B})),n.d(t,"CropAndResize",(function(){return L})),n.d(t,"DenseBincount",(function(){return z})),n.d(t,"DepthToSpace",(function(){return G})),n.d(t,"DepthwiseConv2dNative",(function(){return U})),n.d(t,"DepthwiseConv2dNativeBackpropFilter",(function(){return W})),n.d(t,"DepthwiseConv2dNativeBackpropInput",(function(){return V})),n.d(t,"Diag",(function(){return q})),n.d(t,"Dilation2D",(function(){return H})),n.d(t,"Dilation2DBackpropInput",(function(){return K})),n.d(t,"Dilation2DBackpropFilter",(function(){return X})),n.d(t,"RealDiv",(function(){return Y})),n.d(t,"Einsum",(function(){return Z})),n.d(t,"Elu",(function(){return Q})),n.d(t,"EluGrad",(function(){return J})),n.d(t,"Erf",(function(){return ee})),n.d(t,"Equal",(function(){return te})),n.d(t,"Exp",(function(){return ne})),n.d(t,"ExpandDims",(function(){return se})),n.d(t,"Expm1",(function(){return oe})),n.d(t,"FFT",(function(){return re})),n.d(t,"Fill",(function(){return ie})),n.d(t,"FlipLeftRight",(function(){return ae})),n.d(t,"Floor",(function(){return ue})),n.d(t,"FloorDiv",(function(){return de})),n.d(t,"FusedBatchNorm",(function(){return le})),n.d(t,"GatherV2",(function(){return ce})),n.d(t,"GatherNd",(function(){return fe})),n.d(t,"Greater",(function(){return pe})),n.d(t,"GreaterEqual",(function(){return me})),n.d(t,"Identity",(function(){return he})),n.d(t,"IFFT",(function(){return be})),n.d(t,"Imag",(function(){return je})),n.d(t,"IsFinite",(function(){return ge})),n.d(t,"IsInf",(function(){return we})),n.d(t,"IsNan",(function(){return _e})),n.d(t,"LeakyRelu",(function(){return ke})),n.d(t,"Less",(function(){return ve})),n.d(t,"LessEqual",(function(){return xe})),n.d(t,"LinSpace",(function(){return ye})),n.d(t,"Log",(function(){return Oe})),n.d(t,"Log1p",(function(){return Ie})),n.d(t,"LogicalAnd",(function(){return Ce})),n.d(t,"LogicalNot",(function(){return Se})),n.d(t,"LogicalOr",(function(){return Te})),n.d(t,"LogSoftmax",(function(){return Ne})),n.d(t,"LRN",(function(){return Ee})),n.d(t,"LRNGrad",(function(){return Ae})),n.d(t,"Max",(function(){return Re})),n.d(t,"Maximum",(function(){return Fe})),n.d(t,"MaxPool",(function(){return Me})),n.d(t,"MaxPoolGrad",(function(){return $e})),n.d(t,"MaxPool3D",(function(){return De})),n.d(t,"MaxPool3DGrad",(function(){return Pe})),n.d(t,"MaxPoolWithArgmax",(function(){return Be})),n.d(t,"Mean",(function(){return Le})),n.d(t,"Min",(function(){return ze})),n.d(t,"Minimum",(function(){return Ge})),n.d(t,"MirrorPad",(function(){return Ue})),n.d(t,"Mod",(function(){return We})),n.d(t,"Multinomial",(function(){return Ve})),n.d(t,"Multiply",(function(){return qe})),n.d(t,"Neg",(function(){return He})),n.d(t,"NotEqual",(function(){return Ke})),n.d(t,"NonMaxSuppressionV3",(function(){return Xe})),n.d(t,"NonMaxSuppressionV4",(function(){return Ye})),n.d(t,"NonMaxSuppressionV5",(function(){return Ze})),n.d(t,"OnesLike",(function(){return Qe})),n.d(t,"OneHot",(function(){return Je})),n.d(t,"Pack",(function(){return et})),n.d(t,"PadV2",(function(){return tt})),n.d(t,"Pool",(function(){return nt})),n.d(t,"Pow",(function(){return st})),n.d(t,"Prelu",(function(){return ot})),n.d(t,"Prod",(function(){return rt})),n.d(t,"Range",(function(){return it})),n.d(t,"Real",(function(){return at})),n.d(t,"Reciprocal",(function(){return ut})),n.d(t,"Relu",(function(){return dt})),n.d(t,"Reshape",(function(){return lt})),n.d(t,"ResizeNearestNeighbor",(function(){return ct})),n.d(t,"ResizeNearestNeighborGrad",(function(){return ft})),n.d(t,"ResizeBilinear",(function(){return pt})),n.d(t,"ResizeBilinearGrad",(function(){return mt})),n.d(t,"Relu6",(function(){return ht})),n.d(t,"Reverse",(function(){return bt})),n.d(t,"Round",(function(){return jt})),n.d(t,"Rsqrt",(function(){return gt})),n.d(t,"ScatterNd",(function(){return wt})),n.d(t,"Select",(function(){return _t})),n.d(t,"Selu",(function(){return kt})),n.d(t,"Slice",(function(){return vt})),n.d(t,"Sin",(function(){return xt})),n.d(t,"Sinh",(function(){return yt})),n.d(t,"Sign",(function(){return Ot})),n.d(t,"Sigmoid",(function(){return It})),n.d(t,"Softplus",(function(){return Ct})),n.d(t,"Sqrt",(function(){return St})),n.d(t,"Sum",(function(){return Tt})),n.d(t,"SpaceToBatchND",(function(){return Nt})),n.d(t,"SplitV",(function(){return Et})),n.d(t,"Softmax",(function(){return At})),n.d(t,"SparseFillEmptyRows",(function(){return Rt})),n.d(t,"SparseReshape",(function(){return Ft})),n.d(t,"SparseSegmentMean",(function(){return Mt})),n.d(t,"SparseSegmentSum",(function(){return $t})),n.d(t,"SparseToDense",(function(){return Dt})),n.d(t,"SquaredDifference",(function(){return Pt})),n.d(t,"Square",(function(){return Bt})),n.d(t,"StridedSlice",(function(){return Lt})),n.d(t,"StringNGrams",(function(){return zt})),n.d(t,"StringSplit",(function(){return Gt})),n.d(t,"StringToHashBucketFast",(function(){return Ut})),n.d(t,"Sub",(function(){return Wt})),n.d(t,"Tan",(function(){return Vt})),n.d(t,"Tanh",(function(){return qt})),n.d(t,"Tile",(function(){return Ht})),n.d(t,"TopK",(function(){return Kt})),n.d(t,"Transform",(function(){return Xt})),n.d(t,"Transpose",(function(){return Yt})),n.d(t,"Unique",(function(){return Zt})),n.d(t,"Unpack",(function(){return Qt})),n.d(t,"UnsortedSegmentSum",(function(){return Jt})),n.d(t,"ZerosLike",(function(){return en})),n.d(t,"Step",(function(){return tn})),n.d(t,"FromPixels",(function(){return nn})),n.d(t,"RotateWithOffset",(function(){return sn})),n.d(t,"_FusedMatMul",(function(){return on})),n.d(t,"FusedConv2D",(function(){return rn})),n.d(t,"FusedDepthwiseConv2D",(function(){return an}));const s="Abs",o="Acos",r="Acosh",i="Add",a="AddN",u="All",d="Any",l="ArgMax",c="ArgMin",f="Asin",p="Asinh",m="Atan",h="Atanh",b="Atan2",j="AvgPool",g="AvgPoolGrad",w="AvgPool3D",_="AvgPool3DGrad",k="BatchMatMul",v="BatchToSpaceND",x="Bincount",y="BroadcastTo",O="Cast",I="Ceil",C="ClipByValue",S="Complex",T="ComplexAbs",N="Concat",E="Conv2D",A="Conv2DBackpropFilter",R="Conv2DBackpropInput",F="Conv3D",M="Conv3DBackpropFilterV2",$="Conv3DBackpropInputV2",D="Cos",P="Cosh",B="Cumsum",L="CropAndResize",z="DenseBincount",G="DepthToSpace",U="DepthwiseConv2dNative",W="DepthwiseConv2dNativeBackpropFilter",V="DepthwiseConv2dNativeBackpropInput",q="Diag",H="Dilation2D",K="Dilation2DBackpropInput",X="Dilation2DBackpropFilter",Y="RealDiv",Z="Einsum",Q="Elu",J="EluGrad",ee="Erf",te="Equal",ne="Exp",se="ExpandDims",oe="Expm1",re="FFT",ie="Fill",ae="FlipLeftRight",ue="Floor",de="FloorDiv",le="FusedBatchNorm",ce="GatherV2",fe="GatherNd",pe="Greater",me="GreaterEqual",he="Identity",be="IFFT",je="Imag",ge="IsFinite",we="IsInf",_e="IsNan",ke="LeakyRelu",ve="Less",xe="LessEqual",ye="LinSpace",Oe="Log",Ie="Log1p",Ce="LogicalAnd",Se="LogicalNot",Te="LogicalOr",Ne="LogSoftmax",Ee="LRN",Ae="LRNGrad",Re="Max",Fe="Maximum",Me="MaxPool",$e="MaxPoolGrad",De="MaxPool3D",Pe="MaxPool3DGrad",Be="MaxPoolWithArgmax",Le="Mean",ze="Min",Ge="Minimum",Ue="MirrorPad",We="Mod",Ve="Multinomial",qe="Multiply",He="Neg",Ke="NotEqual",Xe="NonMaxSuppressionV3",Ye="NonMaxSuppressionV4",Ze="NonMaxSuppressionV5",Qe="OnesLike",Je="OneHot",et="Pack",tt="PadV2",nt="Pool",st="Pow",ot="Prelu",rt="Prod",it="Range",at="Real",ut="Reciprocal",dt="Relu",lt="Reshape",ct="ResizeNearestNeighbor",ft="ResizeNearestNeighborGrad",pt="ResizeBilinear",mt="ResizeBilinearGrad",ht="Relu6",bt="Reverse",jt="Round",gt="Rsqrt",wt="ScatterNd",_t="Select",kt="Selu",vt="Slice",xt="Sin",yt="Sinh",Ot="Sign",It="Sigmoid",Ct="Softplus",St="Sqrt",Tt="Sum",Nt="SpaceToBatchND",Et="SplitV",At="Softmax",Rt="SparseFillEmptyRows",Ft="SparseReshape",Mt="SparseSegmentMean",$t="SparseSegmentSum",Dt="SparseToDense",Pt="SquaredDifference",Bt="Square",Lt="StridedSlice",zt="StringNGrams",Gt="StringSplit",Ut="StringToHashBucketFast",Wt="Sub",Vt="Tan",qt="Tanh",Ht="Tile",Kt="TopK",Xt="Transform",Yt="Transpose",Zt="Unique",Qt="Unpack",Jt="UnsortedSegmentSum",en="ZerosLike",tn="Step",nn="FromPixels",sn="RotateWithOffset",on="_FusedMatMul",rn="FusedConv2D",an="FusedDepthwiseConv2D"},"./node_modules/@tensorflow/tfjs-core/dist/kernel_registry.js": /*!********************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/kernel_registry.js ***! \********************************************************************/ -/*! exports provided: getKernel, getGradient, getKernelsForBackend, registerKernel, registerGradient, unregisterKernel, unregisterGradient, copyRegisteredKernels */function(e,t,n){"use strict";n.r(t),n.d(t,"getKernel",(function(){return a})),n.d(t,"getGradient",(function(){return d})),n.d(t,"getKernelsForBackend",(function(){return u})),n.d(t,"registerKernel",(function(){return l})),n.d(t,"registerGradient",(function(){return c})),n.d(t,"unregisterKernel",(function(){return f})),n.d(t,"unregisterGradient",(function(){return p})),n.d(t,"copyRegisteredKernels",(function(){return m}));var s=n(/*! ./environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"),o=n(/*! ./global_util */"./node_modules/@tensorflow/tfjs-core/dist/global_util.js"); +/*! exports provided: getKernel, getGradient, getKernelsForBackend, registerKernel, registerGradient, unregisterKernel, unregisterGradient, copyRegisteredKernels */function(e,t,n){"use strict";n.r(t),n.d(t,"getKernel",(function(){return a})),n.d(t,"getGradient",(function(){return u})),n.d(t,"getKernelsForBackend",(function(){return d})),n.d(t,"registerKernel",(function(){return l})),n.d(t,"registerGradient",(function(){return c})),n.d(t,"unregisterKernel",(function(){return f})),n.d(t,"unregisterGradient",(function(){return p})),n.d(t,"copyRegisteredKernels",(function(){return m}));var s=n(/*! ./environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"),o=n(/*! ./global_util */"./node_modules/@tensorflow/tfjs-core/dist/global_util.js"); /** * @license * Copyright 2019 Google LLC. All Rights Reserved. @@ -12375,7 +12376,7 @@ async function d(e,t){null==t&&(t={});const n=null==t.fetchFunc?Object(s.env)(). * limitations under the License. * ============================================================================= */ -const r=Object(o.getGlobal)("kernelRegistry",(()=>new Map)),i=Object(o.getGlobal)("gradRegistry",(()=>new Map));function a(e,t){const n=h(e,t);return r.get(n)}function d(e){return i.get(e)}function u(e){const t=r.entries(),n=[];for(;;){const{done:s,value:o}=t.next();if(s)break;const[r,i]=o,[a]=r.split("_");a===e&&n.push(i)}return n}function l(e){const{kernelName:t,backendName:n}=e,s=h(t,n);r.has(s)&&console.warn(`The kernel '${t}' for backend '${n}' is already registered`),r.set(s,e)}function c(e){const{kernelName:t}=e;i.has(t)&&Object(s.env)().getBool("DEBUG")&&console.warn(`Overriding the gradient for '${t}'`),i.set(t,e)}function f(e,t){const n=h(e,t);if(!r.has(n))throw new Error(`The kernel '${e}' for backend '${t}' is not registered`);r.delete(n)}function p(e){if(!i.has(e))throw new Error(`The gradient '${e}' for backend is not registered`);i.delete(e)}function m(e,t){u(e).forEach((e=>{l(Object.assign({},e,{backendName:t}))}))}function h(e,t){return`${t}_${e}`}},"./node_modules/@tensorflow/tfjs-core/dist/log.js": +const r=Object(o.getGlobal)("kernelRegistry",(()=>new Map)),i=Object(o.getGlobal)("gradRegistry",(()=>new Map));function a(e,t){const n=h(e,t);return r.get(n)}function u(e){return i.get(e)}function d(e){const t=r.entries(),n=[];for(;;){const{done:s,value:o}=t.next();if(s)break;const[r,i]=o,[a]=r.split("_");a===e&&n.push(i)}return n}function l(e){const{kernelName:t,backendName:n}=e,s=h(t,n);r.has(s)&&console.warn(`The kernel '${t}' for backend '${n}' is already registered`),r.set(s,e)}function c(e){const{kernelName:t}=e;i.has(t)&&Object(s.env)().getBool("DEBUG")&&console.warn(`Overriding the gradient for '${t}'`),i.set(t,e)}function f(e,t){const n=h(e,t);if(!r.has(n))throw new Error(`The kernel '${e}' for backend '${t}' is not registered`);r.delete(n)}function p(e){if(!i.has(e))throw new Error(`The gradient '${e}' for backend is not registered`);i.delete(e)}function m(e,t){d(e).forEach((e=>{l(Object.assign({},e,{backendName:t}))}))}function h(e,t){return`${t}_${e}`}},"./node_modules/@tensorflow/tfjs-core/dist/log.js": /*!********************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/log.js ***! \********************************************************/ @@ -12466,7 +12467,7 @@ function(e){const t={x:Object(r.convertToTensor)(e,"x","acosh")};return s.ENGINE /*!************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/add.js ***! \************************************************************/ -/*! exports provided: add */function(e,t,n){"use strict";n.r(t),n.d(t,"add",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({add_: +/*! exports provided: add */function(e,t,n){"use strict";n.r(t),n.d(t,"add",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({add_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -12483,11 +12484,11 @@ function(e){const t={x:Object(r.convertToTensor)(e,"x","acosh")};return s.ENGINE * limitations under the License. * ============================================================================= */ -function(e,t){let n=Object(i.convertToTensor)(e,"a","add"),a=Object(i.convertToTensor)(t,"b","add");[n,a]=Object(r.makeTypesMatch)(n,a);const d={a:n,b:a};return s.ENGINE.runKernel(o.Add,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/add_n.js": +function(e,t){let n=Object(i.convertToTensor)(e,"a","add"),a=Object(i.convertToTensor)(t,"b","add");[n,a]=Object(r.makeTypesMatch)(n,a);const u={a:n,b:a};return s.ENGINE.runKernel(o.Add,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/add_n.js": /*!**************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/add_n.js ***! \**************************************************************/ -/*! exports provided: addN */function(e,t,n){"use strict";n.r(t),n.d(t,"addN",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({addN_: +/*! exports provided: addN */function(e,t,n){"use strict";n.r(t),n.d(t,"addN",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({addN_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -12676,7 +12677,7 @@ function(e){const t={x:Object(r.convertToTensor)(e,"x","atan")};return s.ENGINE. /*!**************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/atan2.js ***! \**************************************************************/ -/*! exports provided: atan2 */function(e,t,n){"use strict";n.r(t),n.d(t,"atan2",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({atan2_: +/*! exports provided: atan2 */function(e,t,n){"use strict";n.r(t),n.d(t,"atan2",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({atan2_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -12693,7 +12694,7 @@ function(e){const t={x:Object(r.convertToTensor)(e,"x","atan")};return s.ENGINE. * limitations under the License. * ============================================================================= */ -function(e,t){let n=Object(i.convertToTensor)(e,"a","atan2"),a=Object(i.convertToTensor)(t,"b","atan2");[n,a]=Object(r.makeTypesMatch)(n,a);const d={a:n,b:a};return s.ENGINE.runKernel(o.Atan2,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/atanh.js": +function(e,t){let n=Object(i.convertToTensor)(e,"a","atan2"),a=Object(i.convertToTensor)(t,"b","atan2");[n,a]=Object(r.makeTypesMatch)(n,a);const u={a:n,b:a};return s.ENGINE.runKernel(o.Atan2,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/atanh.js": /*!**************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/atanh.js ***! \**************************************************************/ @@ -12718,7 +12719,7 @@ function(e){const t={x:Object(r.convertToTensor)(e,"x","atanh")};return s.ENGINE /*!*****************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/avg_pool.js ***! \*****************************************************************/ -/*! exports provided: avgPool */function(e,t,n){"use strict";n.r(t),n.d(t,"avgPool",(function(){return c}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),d=n(/*! ./conv_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),l=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const c=Object(u.op)({avgPool_: +/*! exports provided: avgPool */function(e,t,n){"use strict";n.r(t),n.d(t,"avgPool",(function(){return c}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),u=n(/*! ./conv_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),l=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const c=Object(d.op)({avgPool_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -12735,11 +12736,11 @@ function(e){const t={x:Object(r.convertToTensor)(e,"x","atanh")};return s.ENGINE * limitations under the License. * ============================================================================= */ -function(e,t,n,u,c){const f=Object(r.convertToTensor)(e,"x","avgPool","float32");i.assert(d.eitherStridesOrDilationsAreOne(n,1),(()=>`Error in avgPool: Either strides or dilations must be 1. Got strides ${n} and dilations '1'`));let p=f,m=!1;3===f.rank&&(m=!0,p=Object(l.reshape)(f,[1,f.shape[0],f.shape[1],f.shape[2]])),i.assert(4===p.rank,(()=>`Error in avgPool: x must be rank 4 but got rank ${p.rank}.`)),null!=c&&i.assert(i.isInt(u),(()=>`Error in avgPool: pad must be an integer when using, dimRoundingMode ${c} but got pad ${u}.`));const h={x:p},b={filterSize:t,strides:n,pad:u,dimRoundingMode:c};let j=s.ENGINE.runKernel(o.AvgPool,h,b);return j=Object(a.cast)(j,f.dtype),m?Object(l.reshape)(j,[j.shape[1],j.shape[2],j.shape[3]]):j}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/avg_pool_3d.js": +function(e,t,n,d,c){const f=Object(r.convertToTensor)(e,"x","avgPool","float32");i.assert(u.eitherStridesOrDilationsAreOne(n,1),(()=>`Error in avgPool: Either strides or dilations must be 1. Got strides ${n} and dilations '1'`));let p=f,m=!1;3===f.rank&&(m=!0,p=Object(l.reshape)(f,[1,f.shape[0],f.shape[1],f.shape[2]])),i.assert(4===p.rank,(()=>`Error in avgPool: x must be rank 4 but got rank ${p.rank}.`)),null!=c&&i.assert(i.isInt(d),(()=>`Error in avgPool: pad must be an integer when using, dimRoundingMode ${c} but got pad ${d}.`));const h={x:p},b={filterSize:t,strides:n,pad:d,dimRoundingMode:c};let j=s.ENGINE.runKernel(o.AvgPool,h,b);return j=Object(a.cast)(j,f.dtype),m?Object(l.reshape)(j,[j.shape[1],j.shape[2],j.shape[3]]):j}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/avg_pool_3d.js": /*!********************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/avg_pool_3d.js ***! \********************************************************************/ -/*! exports provided: avgPool3d */function(e,t,n){"use strict";n.r(t),n.d(t,"avgPool3d",(function(){return l}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const l=Object(d.op)({avgPool3d_: +/*! exports provided: avgPool3d */function(e,t,n){"use strict";n.r(t),n.d(t,"avgPool3d",(function(){return l}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),d=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const l=Object(u.op)({avgPool3d_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -12756,11 +12757,11 @@ function(e,t,n,u,c){const f=Object(r.convertToTensor)(e,"x","avgPool","float32") * limitations under the License. * ============================================================================= */ -function(e,t,n,d,l,c="NDHWC"){const f=Object(r.convertToTensor)(e,"x","avgPool3d","float32");let p=f,m=!1;4===f.rank&&(m=!0,p=Object(u.reshape)(f,[1,f.shape[0],f.shape[1],f.shape[2],f.shape[3]])),i.assert(5===p.rank,(()=>`Error in avgPool3d: x must be rank 5 but got rank ${p.rank}.`)),i.assert("NDHWC"===c,(()=>`Error in avgPool3d: Only NDHWC is currently supported, but got dataFormat of ${c}`)),null!=l&&i.assert(i.isInt(d),(()=>`Error in avgPool3d: pad must be an integer when using, dimRoundingMode ${l} but got pad ${d}.`));const h={x:p},b={filterSize:t,strides:n,pad:d,dimRoundingMode:l,dataFormat:c};let j=s.ENGINE.runKernel(o.AvgPool3D,h,b);return j=Object(a.cast)(j,p.dtype),m?Object(u.reshape)(j,[j.shape[1],j.shape[2],j.shape[3],j.shape[4]]):j}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/axis_util.js": +function(e,t,n,u,l,c="NDHWC"){const f=Object(r.convertToTensor)(e,"x","avgPool3d","float32");let p=f,m=!1;4===f.rank&&(m=!0,p=Object(d.reshape)(f,[1,f.shape[0],f.shape[1],f.shape[2],f.shape[3]])),i.assert(5===p.rank,(()=>`Error in avgPool3d: x must be rank 5 but got rank ${p.rank}.`)),i.assert("NDHWC"===c,(()=>`Error in avgPool3d: Only NDHWC is currently supported, but got dataFormat of ${c}`)),null!=l&&i.assert(i.isInt(u),(()=>`Error in avgPool3d: pad must be an integer when using, dimRoundingMode ${l} but got pad ${u}.`));const h={x:p},b={filterSize:t,strides:n,pad:u,dimRoundingMode:l,dataFormat:c};let j=s.ENGINE.runKernel(o.AvgPool3D,h,b);return j=Object(a.cast)(j,p.dtype),m?Object(d.reshape)(j,[j.shape[1],j.shape[2],j.shape[3],j.shape[4]]):j}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/axis_util.js": /*!******************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/axis_util.js ***! \******************************************************************/ -/*! exports provided: axesAreInnerMostDims, combineLocations, computeOutAndReduceShapes, expandShapeToKeepDim, assertAxesAreInnerMostDims, getAxesPermutation, getUndoAxesPermutation, getInnerMostAxes */function(e,t,n){"use strict";n.r(t),n.d(t,"axesAreInnerMostDims",(function(){return o})),n.d(t,"combineLocations",(function(){return r})),n.d(t,"computeOutAndReduceShapes",(function(){return i})),n.d(t,"expandShapeToKeepDim",(function(){return a})),n.d(t,"assertAxesAreInnerMostDims",(function(){return d})),n.d(t,"getAxesPermutation",(function(){return u})),n.d(t,"getUndoAxesPermutation",(function(){return l})),n.d(t,"getInnerMostAxes",(function(){return c}));var s=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/*! exports provided: axesAreInnerMostDims, combineLocations, computeOutAndReduceShapes, expandShapeToKeepDim, assertAxesAreInnerMostDims, getAxesPermutation, getUndoAxesPermutation, getInnerMostAxes */function(e,t,n){"use strict";n.r(t),n.d(t,"axesAreInnerMostDims",(function(){return o})),n.d(t,"combineLocations",(function(){return r})),n.d(t,"computeOutAndReduceShapes",(function(){return i})),n.d(t,"expandShapeToKeepDim",(function(){return a})),n.d(t,"assertAxesAreInnerMostDims",(function(){return u})),n.d(t,"getAxesPermutation",(function(){return d})),n.d(t,"getUndoAxesPermutation",(function(){return l})),n.d(t,"getInnerMostAxes",(function(){return c}));var s=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); /** * @license * Copyright 2017 Google LLC. All Rights Reserved. @@ -12776,11 +12777,11 @@ function(e,t,n,d,l,c="NDHWC"){const f=Object(r.convertToTensor)(e,"x","avgPool3d * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */function o(e,t){for(let n=0;ne[t]))]}function a(e,t){return r(e,t.map((e=>1)),t)}function d(e,t,n){s.assert(o(t,n),(()=>`${e} supports only inner-most axes for now. Got axes ${t} and rank-${n} input.`))}function u(e,t){if(o(e,t))return null;const n=[];for(let s=0;sn.push(e))),n}function l(e){return e.map(((e,t)=>[t,e])).sort(((e,t)=>e[1]-t[1])).map((e=>e[0]))}function c(e,t){const n=[];for(let s=t-e;se[t]))]}function a(e,t){return r(e,t.map((e=>1)),t)}function u(e,t,n){s.assert(o(t,n),(()=>`${e} supports only inner-most axes for now. Got axes ${t} and rank-${n} input.`))}function d(e,t){if(o(e,t))return null;const n=[];for(let s=0;sn.push(e))),n}function l(e){return e.map(((e,t)=>[t,e])).sort(((e,t)=>e[1]-t[1])).map((e=>e[0]))}function c(e,t){const n=[];for(let s=t-e;se*t));i.assert(a.rank>=1+t.length,(()=>`input rank is ${a.rank} but should be > than blockShape.length ${t.length}`)),i.assert(n.length===t.length,(()=>`crops.length is ${n.length} but should be equal to blockShape.length ${t.length}`)),i.assert(a.shape[0]%d==0,(()=>`input tensor batch is ${a.shape[0]} but is not divisible by the product of the elements of blockShape ${t.join(" * ")} === ${d}`));const u={x:a},l={blockShape:t,crops:n};return s.ENGINE.runKernel(o.BatchToSpaceND,u,l)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm.js": +function(e,t,n){const a=Object(r.convertToTensor)(e,"x","batchToSpaceND"),u=t.reduce(((e,t)=>e*t));i.assert(a.rank>=1+t.length,(()=>`input rank is ${a.rank} but should be > than blockShape.length ${t.length}`)),i.assert(n.length===t.length,(()=>`crops.length is ${n.length} but should be equal to blockShape.length ${t.length}`)),i.assert(a.shape[0]%u==0,(()=>`input tensor batch is ${a.shape[0]} but is not divisible by the product of the elements of blockShape ${t.join(" * ")} === ${u}`));const d={x:a},l={blockShape:t,crops:n};return s.ENGINE.runKernel(o.BatchToSpaceND,d,l)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm.js": /*!******************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm.js ***! \******************************************************************/ -/*! exports provided: batchNorm */function(e,t,n){"use strict";n.r(t),n.d(t,"batchNorm",(function(){return l}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./batchnorm_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm_util.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const l=Object(d.op)({batchNorm_: +/*! exports provided: batchNorm */function(e,t,n){"use strict";n.r(t),n.d(t,"batchNorm",(function(){return l}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./batchnorm_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm_util.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),d=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const l=Object(u.op)({batchNorm_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -12839,19 +12840,19 @@ function(e,t,n){const a=Object(r.convertToTensor)(e,"x","batchToSpaceND"),d=t.re * limitations under the License. * ============================================================================= */ -function(e,t,n,d,l,c){null==c&&(c=.001);const f=Object(r.convertToTensor)(e,"x","batchNorm"),p=Object(r.convertToTensor)(t,"mean","batchNorm"),m=Object(r.convertToTensor)(n,"variance","batchNorm");let h,b;null!=l&&(h=Object(r.convertToTensor)(l,"scale","batchNorm")),null!=d&&(b=Object(r.convertToTensor)(d,"offset","batchNorm")),i.assert(p.rank===m.rank,(()=>"Batch normalization gradient requires mean and variance to have equal ranks.")),i.assert(null==b||p.rank===b.rank,(()=>"Batch normalization gradient requires mean and offset to have equal ranks.")),i.assert(null==h||p.rank===h.rank,(()=>"Batch normalization gradient requires mean and scale to have equal ranks."));const j={x:Object(a.xAs4D)(f),scale:h,offset:b,mean:p,variance:m},g={varianceEpsilon:c},w=s.ENGINE.runKernel(o.FusedBatchNorm,j,g);return Object(u.reshape)(w,f.shape)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm2d.js": +function(e,t,n,u,l,c){null==c&&(c=.001);const f=Object(r.convertToTensor)(e,"x","batchNorm"),p=Object(r.convertToTensor)(t,"mean","batchNorm"),m=Object(r.convertToTensor)(n,"variance","batchNorm");let h,b;null!=l&&(h=Object(r.convertToTensor)(l,"scale","batchNorm")),null!=u&&(b=Object(r.convertToTensor)(u,"offset","batchNorm")),i.assert(p.rank===m.rank,(()=>"Batch normalization gradient requires mean and variance to have equal ranks.")),i.assert(null==b||p.rank===b.rank,(()=>"Batch normalization gradient requires mean and offset to have equal ranks.")),i.assert(null==h||p.rank===h.rank,(()=>"Batch normalization gradient requires mean and scale to have equal ranks."));const j={x:Object(a.xAs4D)(f),scale:h,offset:b,mean:p,variance:m},g={varianceEpsilon:c},w=s.ENGINE.runKernel(o.FusedBatchNorm,j,g);return Object(d.reshape)(w,f.shape)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm2d.js": /*!********************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm2d.js ***! \********************************************************************/ -/*! exports provided: batchNorm2d */function(e,t,n){"use strict";n.r(t),n.d(t,"batchNorm2d",(function(){return a}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./batchnorm */"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({batchNorm2d_:function(e,t,n,i,a,d){const u=Object(s.convertToTensor)(e,"x","batchNorm"),l=Object(s.convertToTensor)(t,"mean","batchNorm"),c=Object(s.convertToTensor)(n,"variance","batchNorm");let f,p;return null!=a&&(f=Object(s.convertToTensor)(a,"scale","batchNorm")),null!=i&&(p=Object(s.convertToTensor)(i,"offset","batchNorm")),o.assert(2===u.rank,(()=>`Error in batchNorm2D: x must be rank 2 but got rank ${u.rank}.`)),o.assert(2===l.rank||1===l.rank,(()=>`Error in batchNorm2D: mean must be rank 2 or rank 1 but got rank ${l.rank}.`)),o.assert(2===c.rank||1===c.rank,(()=>`Error in batchNorm2D: variance must be rank 2 or rank 1 but got rank ${c.rank}.`)),null!=f&&o.assert(2===f.rank||1===f.rank,(()=>`Error in batchNorm2D: scale must be rank 2 or rank 1 but got rank ${f.rank}.`)),null!=p&&o.assert(2===p.rank||1===p.rank,(()=>`Error in batchNorm2D: offset must be rank 2 or rank 1 but got rank ${p.rank}.`)),Object(r.batchNorm)(u,l,c,p,f,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm3d.js": +/*! exports provided: batchNorm2d */function(e,t,n){"use strict";n.r(t),n.d(t,"batchNorm2d",(function(){return a}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./batchnorm */"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({batchNorm2d_:function(e,t,n,i,a,u){const d=Object(s.convertToTensor)(e,"x","batchNorm"),l=Object(s.convertToTensor)(t,"mean","batchNorm"),c=Object(s.convertToTensor)(n,"variance","batchNorm");let f,p;return null!=a&&(f=Object(s.convertToTensor)(a,"scale","batchNorm")),null!=i&&(p=Object(s.convertToTensor)(i,"offset","batchNorm")),o.assert(2===d.rank,(()=>`Error in batchNorm2D: x must be rank 2 but got rank ${d.rank}.`)),o.assert(2===l.rank||1===l.rank,(()=>`Error in batchNorm2D: mean must be rank 2 or rank 1 but got rank ${l.rank}.`)),o.assert(2===c.rank||1===c.rank,(()=>`Error in batchNorm2D: variance must be rank 2 or rank 1 but got rank ${c.rank}.`)),null!=f&&o.assert(2===f.rank||1===f.rank,(()=>`Error in batchNorm2D: scale must be rank 2 or rank 1 but got rank ${f.rank}.`)),null!=p&&o.assert(2===p.rank||1===p.rank,(()=>`Error in batchNorm2D: offset must be rank 2 or rank 1 but got rank ${p.rank}.`)),Object(r.batchNorm)(d,l,c,p,f,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm3d.js": /*!********************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm3d.js ***! \********************************************************************/ -/*! exports provided: batchNorm3d */function(e,t,n){"use strict";n.r(t),n.d(t,"batchNorm3d",(function(){return a}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./batchnorm */"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({batchNorm3d_:function(e,t,n,i,a,d){const u=Object(s.convertToTensor)(e,"x","batchNorm"),l=Object(s.convertToTensor)(t,"mean","batchNorm"),c=Object(s.convertToTensor)(n,"variance","batchNorm");let f,p;return null!=a&&(f=Object(s.convertToTensor)(a,"scale","batchNorm")),null!=i&&(p=Object(s.convertToTensor)(i,"offset","batchNorm")),o.assert(3===u.rank,(()=>`Error in batchNorm3D: x must be rank 3 but got rank ${u.rank}.`)),o.assert(3===l.rank||1===l.rank,(()=>`Error in batchNorm3D: mean must be rank 3 or rank 1 but got rank ${l.rank}.`)),o.assert(3===c.rank||1===c.rank,(()=>`Error in batchNorm3D: variance must be rank 3 or rank 1 but got rank ${c.rank}.`)),null!=f&&o.assert(3===f.rank||1===f.rank,(()=>`Error in batchNorm3D: scale must be rank 3 or rank 1 but got rank ${f.rank}.`)),null!=p&&o.assert(3===p.rank||1===p.rank,(()=>`Error in batchNorm3D: offset must be rank 3 or rank 1 but got rank ${p.rank}.`)),Object(r.batchNorm)(u,l,c,p,f,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm4d.js": +/*! exports provided: batchNorm3d */function(e,t,n){"use strict";n.r(t),n.d(t,"batchNorm3d",(function(){return a}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./batchnorm */"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({batchNorm3d_:function(e,t,n,i,a,u){const d=Object(s.convertToTensor)(e,"x","batchNorm"),l=Object(s.convertToTensor)(t,"mean","batchNorm"),c=Object(s.convertToTensor)(n,"variance","batchNorm");let f,p;return null!=a&&(f=Object(s.convertToTensor)(a,"scale","batchNorm")),null!=i&&(p=Object(s.convertToTensor)(i,"offset","batchNorm")),o.assert(3===d.rank,(()=>`Error in batchNorm3D: x must be rank 3 but got rank ${d.rank}.`)),o.assert(3===l.rank||1===l.rank,(()=>`Error in batchNorm3D: mean must be rank 3 or rank 1 but got rank ${l.rank}.`)),o.assert(3===c.rank||1===c.rank,(()=>`Error in batchNorm3D: variance must be rank 3 or rank 1 but got rank ${c.rank}.`)),null!=f&&o.assert(3===f.rank||1===f.rank,(()=>`Error in batchNorm3D: scale must be rank 3 or rank 1 but got rank ${f.rank}.`)),null!=p&&o.assert(3===p.rank||1===p.rank,(()=>`Error in batchNorm3D: offset must be rank 3 or rank 1 but got rank ${p.rank}.`)),Object(r.batchNorm)(d,l,c,p,f,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm4d.js": /*!********************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm4d.js ***! \********************************************************************/ -/*! exports provided: batchNorm4d */function(e,t,n){"use strict";n.r(t),n.d(t,"batchNorm4d",(function(){return a}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./batchnorm */"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({batchNorm4d_:function(e,t,n,i,a,d){const u=Object(s.convertToTensor)(e,"x","batchNorm"),l=Object(s.convertToTensor)(t,"mean","batchNorm"),c=Object(s.convertToTensor)(n,"variance","batchNorm");let f,p;return null!=a&&(f=Object(s.convertToTensor)(a,"scale","batchNorm")),null!=i&&(p=Object(s.convertToTensor)(i,"offset","batchNorm")),o.assert(4===u.rank,(()=>`Error in batchNorm4D: x must be rank 4 but got rank ${u.rank}.`)),o.assert(4===l.rank||1===l.rank,(()=>`Error in batchNorm4D: mean must be rank 4 or rank 1 but got rank ${l.rank}.`)),o.assert(4===c.rank||1===c.rank,(()=>`Error in batchNorm4D: variance must be rank 4 or rank 1 but got rank ${c.rank}.`)),null!=f&&o.assert(4===f.rank||1===f.rank,(()=>`Error in batchNorm4D: scale must be rank 4 or rank 1 but got rank ${f.rank}.`)),null!=p&&o.assert(4===p.rank||1===p.rank,(()=>`Error in batchNorm4D: offset must be rank 4 or rank 1 but got rank ${p.rank}.`)),Object(r.batchNorm)(u,l,c,p,f,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm_util.js": +/*! exports provided: batchNorm4d */function(e,t,n){"use strict";n.r(t),n.d(t,"batchNorm4d",(function(){return a}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./batchnorm */"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({batchNorm4d_:function(e,t,n,i,a,u){const d=Object(s.convertToTensor)(e,"x","batchNorm"),l=Object(s.convertToTensor)(t,"mean","batchNorm"),c=Object(s.convertToTensor)(n,"variance","batchNorm");let f,p;return null!=a&&(f=Object(s.convertToTensor)(a,"scale","batchNorm")),null!=i&&(p=Object(s.convertToTensor)(i,"offset","batchNorm")),o.assert(4===d.rank,(()=>`Error in batchNorm4D: x must be rank 4 but got rank ${d.rank}.`)),o.assert(4===l.rank||1===l.rank,(()=>`Error in batchNorm4D: mean must be rank 4 or rank 1 but got rank ${l.rank}.`)),o.assert(4===c.rank||1===c.rank,(()=>`Error in batchNorm4D: variance must be rank 4 or rank 1 but got rank ${c.rank}.`)),null!=f&&o.assert(4===f.rank||1===f.rank,(()=>`Error in batchNorm4D: scale must be rank 4 or rank 1 but got rank ${f.rank}.`)),null!=p&&o.assert(4===p.rank||1===p.rank,(()=>`Error in batchNorm4D: offset must be rank 4 or rank 1 but got rank ${p.rank}.`)),Object(r.batchNorm)(d,l,c,p,f,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm_util.js": /*!***********************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm_util.js ***! \***********************************************************************/ @@ -12859,7 +12860,7 @@ function(e,t,n,d,l,c){null==c&&(c=.001);const f=Object(r.convertToTensor)(e,"x", /*!*****************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/bincount.js ***! \*****************************************************************/ -/*! exports provided: bincount */function(e,t,n){"use strict";n.r(t),n.d(t,"bincount",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({bincount_: +/*! exports provided: bincount */function(e,t,n){"use strict";n.r(t),n.d(t,"bincount",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({bincount_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -12876,11 +12877,11 @@ function(e,t,n,d,l,c){null==c&&(c=.001);const f=Object(r.convertToTensor)(e,"x", * limitations under the License. * ============================================================================= */ -function(e,t,n){const a=Object(r.convertToTensor)(e,"x","bincount"),d=Object(r.convertToTensor)(t,"weights","bincount");i.assert("int32"===a.dtype,(()=>`Error in bincount: input dtype must be int32, but got ${a.dtype}`)),i.assert(n>=0,(()=>`size must be non-negative, but got ${n}.`)),i.assert(d.size===a.size||0===d.size,(()=>`Error in bincount: weights must have the same size as input or0-length, but got input shape: ${a.shape}, weights shape: ${d.shape}.`));const u={x:a,weights:d},l={size:n};return s.ENGINE.runKernel(o.Bincount,u,l)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/boolean_mask.js": +function(e,t,n){const a=Object(r.convertToTensor)(e,"x","bincount"),u=Object(r.convertToTensor)(t,"weights","bincount");i.assert("int32"===a.dtype,(()=>`Error in bincount: input dtype must be int32, but got ${a.dtype}`)),i.assert(n>=0,(()=>`size must be non-negative, but got ${n}.`)),i.assert(u.size===a.size||0===u.size,(()=>`Error in bincount: weights must have the same size as input or0-length, but got input shape: ${a.shape}, weights shape: ${u.shape}.`));const d={x:a,weights:u},l={size:n};return s.ENGINE.runKernel(o.Bincount,d,l)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/boolean_mask.js": /*!*********************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/boolean_mask.js ***! \*********************************************************************/ -/*! exports provided: booleanMaskAsync */function(e,t,n){"use strict";n.r(t),n.d(t,"booleanMaskAsync",(function(){return u}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./gather */"./node_modules/@tensorflow/tfjs-core/dist/ops/gather.js"),i=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),a=n(/*! ./squeeze */"./node_modules/@tensorflow/tfjs-core/dist/ops/squeeze.js"),d=n(/*! ./where_async */"./node_modules/@tensorflow/tfjs-core/dist/ops/where_async.js");const u= +/*! exports provided: booleanMaskAsync */function(e,t,n){"use strict";n.r(t),n.d(t,"booleanMaskAsync",(function(){return d}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./gather */"./node_modules/@tensorflow/tfjs-core/dist/ops/gather.js"),i=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),a=n(/*! ./squeeze */"./node_modules/@tensorflow/tfjs-core/dist/ops/squeeze.js"),u=n(/*! ./where_async */"./node_modules/@tensorflow/tfjs-core/dist/ops/where_async.js");const d= /** * @license * Copyright 2018 Google LLC. All Rights Reserved. @@ -12897,11 +12898,11 @@ function(e,t,n){const a=Object(r.convertToTensor)(e,"x","bincount"),d=Object(r.c * limitations under the License. * ============================================================================= */ -async function(e,t,n){const u=Object(s.convertToTensor)(e,"tensor","boolMask"),l=Object(s.convertToTensor)(t,"mask","boolMask","bool"),c=null==n?0:n,f=l.rank,p=u.shape;o.assert(f>0,(()=>"mask cannot be scalar")),o.assertShapesMatch(p.slice(c,c+f),l.shape,"mask's shape must match the first K dimensions of tensor's shape,");let m=1;for(let e=c;e0,(()=>"mask cannot be scalar")),o.assertShapesMatch(p.slice(c,c+f),l.shape,"mask's shape must match the first K dimensions of tensor's shape,");let m=1;for(let e=c;e!(e>0)||e%1!=0)))throw new Error(`broadcastTo(): Invalid broadcast shape [${t}].`);if(t.lengthn.rank){const e=n.shape.slice();for(;e.length=0;e--)if(u[e]===t[e])l[e]=1;else if(1!==n.shape[e])throw new Error(`broadcastTo(): [${a}] cannot be broadcast to [${t}].`);if(0===l.map(((e,t)=>e>1?t:-1)).filter((e=>e>=0)).length)return Object(i.clone)(n);const c={x:n},f={reps:l};return s.ENGINE.runKernel(o.Tile,c,f)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js": +function(e,t){let n=Object(r.convertToTensor)(e,"broadcastTo","x");const a=n.shape;if(t.some((e=>!(e>0)||e%1!=0)))throw new Error(`broadcastTo(): Invalid broadcast shape [${t}].`);if(t.lengthn.rank){const e=n.shape.slice();for(;e.length=0;e--)if(d[e]===t[e])l[e]=1;else if(1!==n.shape[e])throw new Error(`broadcastTo(): [${a}] cannot be broadcast to [${t}].`);if(0===l.map(((e,t)=>e>1?t:-1)).filter((e=>e>=0)).length)return Object(i.clone)(n);const c={x:n},f={reps:l};return s.ENGINE.runKernel(o.Tile,c,f)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js": /*!***********************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js ***! \***********************************************************************/ @@ -12943,7 +12944,7 @@ function s(e,t){const n=e.length,s=[];for(let o=0;o4)throw new Error("Cannot construct Tensor with more than 4 channels from pixels.");if(null==e)throw new Error("pixels passed to tf.browser.fromPixels() can not be null");let n=!1,o=!1,a=!1,d=!1,u=!1,l=!1;if(e.data instanceof Uint8Array)n=!0;else if("undefined"!=typeof ImageData&&e instanceof ImageData)o=!0;else if("undefined"!=typeof HTMLVideoElement&&e instanceof HTMLVideoElement)a=!0;else if("undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement)d=!0;else if(null!=e.getContext)u=!0;else{if(!("undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap))throw new Error(`pixels passed to tf.browser.fromPixels() must be either an HTMLVideoElement, HTMLImageElement, HTMLCanvasElement, ImageData in browser, or OffscreenCanvas, ImageData in webworker or {data: Uint32Array, width: number, height: number}, but was ${e.constructor.name}`);l=!0}if(a){const t=2;if(a&&e.readyState element.")}if(null!=Object(i.getKernel)(r.FromPixels,s.ENGINE.backendName)){const n={pixels:e},o={numChannels:t};return s.ENGINE.runKernel(r.FromPixels,n,o)}const[p,m]=a?[e.videoWidth,e.videoHeight]:[e.width,e.height];let h,b;if(u?h=e.getContext("2d").getImageData(0,0,p,m).data:o||n?h=e.data:(d||a||l)&&(null==f&&(f=document.createElement("canvas").getContext("2d")),f.canvas.width=p,f.canvas.height=m,f.drawImage(e,0,0,p,m),h=f.getImageData(0,0,p,m).data),4===t)b=new Int32Array(h);else{const e=p*m;b=new Int32Array(e*t);for(let n=0;n4||2===r)throw new Error(`toPixels only supports depth of size 1, 3 or 4 but got ${r}`);if("float32"!==n.dtype&&"int32"!==n.dtype)throw new Error(`Unsupported type for toPixels: ${n.dtype}. Please use float32 or int32 tensors.`);const i=await n.data(),l="float32"===n.dtype?255:1,c=new Uint8ClampedArray(o*s*4);for(let e=0;e1)throw new Error(`Tensor values for a float32 Tensor must be in the range [0 - 1] but encountered ${o}.`)}else if("int32"===n.dtype&&(o<0||o>255))throw new Error(`Tensor values for a int32 Tensor must be in the range [0 - 255] but encountered ${o}.`);1===r?(t[0]=o*l,t[1]=o*l,t[2]=o*l):t[s]=o*l}const s=4*e;c[s+0]=Math.round(t[0]),c[s+1]=Math.round(t[1]),c[s+2]=Math.round(t[2]),c[s+3]=Math.round(t[3])}if(null!=t){t.width=o,t.height=s;const e=t.getContext("2d"),n=new ImageData(c,o,s);e.putImageData(n,0,0)}return n!==e&&n.dispose(),c}const j=Object(l.op)({fromPixels_:p})},"./node_modules/@tensorflow/tfjs-core/dist/ops/buffer.js": +let f;function p(e,t=3){if(t>4)throw new Error("Cannot construct Tensor with more than 4 channels from pixels.");if(null==e)throw new Error("pixels passed to tf.browser.fromPixels() can not be null");let n=!1,o=!1,a=!1,u=!1,d=!1,l=!1;if(e.data instanceof Uint8Array)n=!0;else if("undefined"!=typeof ImageData&&e instanceof ImageData)o=!0;else if("undefined"!=typeof HTMLVideoElement&&e instanceof HTMLVideoElement)a=!0;else if("undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement)u=!0;else if(null!=e.getContext)d=!0;else{if(!("undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap))throw new Error(`pixels passed to tf.browser.fromPixels() must be either an HTMLVideoElement, HTMLImageElement, HTMLCanvasElement, ImageData in browser, or OffscreenCanvas, ImageData in webworker or {data: Uint32Array, width: number, height: number}, but was ${e.constructor.name}`);l=!0}if(a){const t=2;if(a&&e.readyState element.")}if(null!=Object(i.getKernel)(r.FromPixels,s.ENGINE.backendName)){const n={pixels:e},o={numChannels:t};return s.ENGINE.runKernel(r.FromPixels,n,o)}const[p,m]=a?[e.videoWidth,e.videoHeight]:[e.width,e.height];let h,b;if(d?h=e.getContext("2d").getImageData(0,0,p,m).data:o||n?h=e.data:(u||a||l)&&(null==f&&(f=document.createElement("canvas").getContext("2d")),f.canvas.width=p,f.canvas.height=m,f.drawImage(e,0,0,p,m),h=f.getImageData(0,0,p,m).data),4===t)b=new Int32Array(h);else{const e=p*m;b=new Int32Array(e*t);for(let n=0;n4||2===r)throw new Error(`toPixels only supports depth of size 1, 3 or 4 but got ${r}`);if("float32"!==n.dtype&&"int32"!==n.dtype)throw new Error(`Unsupported type for toPixels: ${n.dtype}. Please use float32 or int32 tensors.`);const i=await n.data(),l="float32"===n.dtype?255:1,c=new Uint8ClampedArray(o*s*4);for(let e=0;e1)throw new Error(`Tensor values for a float32 Tensor must be in the range [0 - 1] but encountered ${o}.`)}else if("int32"===n.dtype&&(o<0||o>255))throw new Error(`Tensor values for a int32 Tensor must be in the range [0 - 255] but encountered ${o}.`);1===r?(t[0]=o*l,t[1]=o*l,t[2]=o*l):t[s]=o*l}const s=4*e;c[s+0]=Math.round(t[0]),c[s+1]=Math.round(t[1]),c[s+2]=Math.round(t[2]),c[s+3]=Math.round(t[3])}if(null!=t){t.width=o,t.height=s;const e=t.getContext("2d"),n=new ImageData(c,o,s);e.putImageData(n,0,0)}return n!==e&&n.dispose(),c}const j=Object(l.op)({fromPixels_:p})},"./node_modules/@tensorflow/tfjs-core/dist/ops/buffer.js": /*!***************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/buffer.js ***! \***************************************************************/ @@ -12985,7 +12986,7 @@ function r(e,t="float32",n){return t=t||"float32",o.assertNonNegativeIntegerDime /*!*************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js ***! \*************************************************************/ -/*! exports provided: cast */function(e,t,n){"use strict";n.r(t),n.d(t,"cast",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({cast_: +/*! exports provided: cast */function(e,t,n){"use strict";n.r(t),n.d(t,"cast",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({cast_: /** * @license * Copyright 2020 Google Inc. All Rights Reserved. @@ -13002,7 +13003,7 @@ function r(e,t="float32",n){return t=t||"float32",o.assertNonNegativeIntegerDime * limitations under the License. * ============================================================================= */ -function(e,t){const n=Object(r.convertToTensor)(e,"x","cast");if(!i.isValidDtype(t))throw new Error(`Failed to cast to unknown dtype ${t}`);if("string"===t&&"string"!==n.dtype||"string"!==t&&"string"===n.dtype)throw new Error("Only strings can be casted to strings");const a={x:n},d={dtype:t};return s.ENGINE.runKernel(o.Cast,a,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/ceil.js": +function(e,t){const n=Object(r.convertToTensor)(e,"x","cast");if(!i.isValidDtype(t))throw new Error(`Failed to cast to unknown dtype ${t}`);if("string"===t&&"string"!==n.dtype||"string"!==t&&"string"===n.dtype)throw new Error("Only strings can be casted to strings");const a={x:n},u={dtype:t};return s.ENGINE.runKernel(o.Cast,a,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/ceil.js": /*!*************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/ceil.js ***! \*************************************************************/ @@ -13027,7 +13028,7 @@ function(e){const t={x:Object(r.convertToTensor)(e,"x","ceil")};return s.ENGINE. /*!**********************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/clip_by_value.js ***! \**********************************************************************/ -/*! exports provided: clipByValue */function(e,t,n){"use strict";n.r(t),n.d(t,"clipByValue",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({clipByValue_: +/*! exports provided: clipByValue */function(e,t,n){"use strict";n.r(t),n.d(t,"clipByValue",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({clipByValue_: /** * @license * Copyright 2018 Google LLC. All Rights Reserved. @@ -13044,7 +13045,7 @@ function(e){const t={x:Object(r.convertToTensor)(e,"x","ceil")};return s.ENGINE. * limitations under the License. * ============================================================================= */ -function(e,t,n){const a=Object(r.convertToTensor)(e,"x","clipByValue");i.assert(t<=n,(()=>`Error in clip: min (${t}) must be less than or equal to max (${n}).`));const d={x:a},u={clipValueMin:t,clipValueMax:n};return s.ENGINE.runKernel(o.ClipByValue,d,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/clone.js": +function(e,t,n){const a=Object(r.convertToTensor)(e,"x","clipByValue");i.assert(t<=n,(()=>`Error in clip: min (${t}) must be less than or equal to max (${n}).`));const u={x:a},d={clipValueMin:t,clipValueMax:n};return s.ENGINE.runKernel(o.ClipByValue,u,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/clone.js": /*!**************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/clone.js ***! \**************************************************************/ @@ -13069,7 +13070,7 @@ function(e){const t={x:Object(r.convertToTensor)(e,"x","clone","string_or_numeri /*!****************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/complex.js ***! \****************************************************************/ -/*! exports provided: complex */function(e,t,n){"use strict";n.r(t),n.d(t,"complex",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({complex_: +/*! exports provided: complex */function(e,t,n){"use strict";n.r(t),n.d(t,"complex",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({complex_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -13086,11 +13087,11 @@ function(e){const t={x:Object(r.convertToTensor)(e,"x","clone","string_or_numeri * limitations under the License. * ============================================================================= */ -function(e,t){const n=Object(r.convertToTensor)(e,"real","complex"),a=Object(r.convertToTensor)(t,"imag","complex");i.assertShapesMatch(n.shape,a.shape,`real and imag shapes, ${n.shape} and ${a.shape}, must match in call to tf.complex().`);const d={real:n,imag:a};return s.ENGINE.runKernel(o.Complex,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/concat.js": +function(e,t){const n=Object(r.convertToTensor)(e,"real","complex"),a=Object(r.convertToTensor)(t,"imag","complex");i.assertShapesMatch(n.shape,a.shape,`real and imag shapes, ${n.shape} and ${a.shape}, must match in call to tf.complex().`);const u={real:n,imag:a};return s.ENGINE.runKernel(o.Complex,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/concat.js": /*!***************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/concat.js ***! \***************************************************************/ -/*! exports provided: concat */function(e,t,n){"use strict";n.r(t),n.d(t,"concat",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./clone */"./node_modules/@tensorflow/tfjs-core/dist/ops/clone.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(d.op)({concat_: +/*! exports provided: concat */function(e,t,n){"use strict";n.r(t),n.d(t,"concat",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./clone */"./node_modules/@tensorflow/tfjs-core/dist/ops/clone.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(u.op)({concat_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -13107,7 +13108,7 @@ function(e,t){const n=Object(r.convertToTensor)(e,"real","complex"),a=Object(r.c * limitations under the License. * ============================================================================= */ -function(e,t=0){Object(i.assert)(e.length>=1,(()=>"Pass at least one tensor to concat"));const n=Object(r.convertToTensorArray)(e,"tensors","concat","string_or_numeric");if("complex64"===n[0].dtype&&n.forEach((e=>{if("complex64"!==e.dtype)throw new Error(`Cannot concatenate complex64 tensors with a tensor\n with dtype ${e.dtype}. `)})),1===n.length)return Object(a.clone)(n[0]);const d=n,u={axis:t};return s.ENGINE.runKernel(o.Concat,d,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/concat_1d.js": +function(e,t=0){Object(i.assert)(e.length>=1,(()=>"Pass at least one tensor to concat"));const n=Object(r.convertToTensorArray)(e,"tensors","concat","string_or_numeric");if("complex64"===n[0].dtype&&n.forEach((e=>{if("complex64"!==e.dtype)throw new Error(`Cannot concatenate complex64 tensors with a tensor\n with dtype ${e.dtype}. `)})),1===n.length)return Object(a.clone)(n[0]);const u=n,d={axis:t};return s.ENGINE.runKernel(o.Concat,u,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/concat_1d.js": /*!******************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/concat_1d.js ***! \******************************************************************/ @@ -13147,7 +13148,7 @@ function(e,t=0){Object(i.assert)(e.length>=1,(()=>"Pass at least one tensor to c /*!*************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/confusion_matrix.js ***! \*************************************************************************/ -/*! exports provided: confusionMatrix_, confusionMatrix */function(e,t,n){"use strict";n.r(t),n.d(t,"confusionMatrix_",(function(){return l})),n.d(t,"confusionMatrix",(function(){return c}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),i=n(/*! ./mat_mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mat_mul.js"),a=n(/*! ./one_hot */"./node_modules/@tensorflow/tfjs-core/dist/ops/one_hot.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ./transpose */"./node_modules/@tensorflow/tfjs-core/dist/ops/transpose.js"); +/*! exports provided: confusionMatrix_, confusionMatrix */function(e,t,n){"use strict";n.r(t),n.d(t,"confusionMatrix_",(function(){return l})),n.d(t,"confusionMatrix",(function(){return c}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),i=n(/*! ./mat_mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mat_mul.js"),a=n(/*! ./one_hot */"./node_modules/@tensorflow/tfjs-core/dist/ops/one_hot.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),d=n(/*! ./transpose */"./node_modules/@tensorflow/tfjs-core/dist/ops/transpose.js"); /** * @license * Copyright 2018 Google LLC. All Rights Reserved. @@ -13164,15 +13165,15 @@ function(e,t=0){Object(i.assert)(e.length>=1,(()=>"Pass at least one tensor to c * limitations under the License. * ============================================================================= */ -function l(e,t,n){const d=Object(s.convertToTensor)(e,"labels","confusionMatrix"),l=Object(s.convertToTensor)(t,"predictions","confusionMatrix");o.assert(null==n||n>0&&Number.isInteger(n),(()=>`If provided, numClasses must be a positive integer, but got ${n}`)),o.assert(1===d.rank,(()=>`Expected the rank of labels to be 1, but got ${d.rank}`)),o.assert(1===l.rank,(()=>`Expected the rank of predictions to be 1, but got ${l.rank}`)),o.assert(d.shape[0]===l.shape[0],(()=>`Mismatch in the number of examples: ${d.shape[0]} vs. ${l.shape[0]}. Labels and predictions should have the same number of elements.`)),o.assert(n>0&&Number.isInteger(n),(()=>`numClasses is required to be a positive integer, but got ${n}`));const c=Object(a.oneHot)(Object(r.cast)(d,"int32"),n),f=Object(a.oneHot)(Object(r.cast)(l,"int32"),n),p=Object(u.transpose)(c),m=Object(i.matMul)(p,f);return Object(r.cast)(m,"int32")}const c=Object(d.op)({confusionMatrix_:l})},"./node_modules/@tensorflow/tfjs-core/dist/ops/conv1d.js": +function l(e,t,n){const u=Object(s.convertToTensor)(e,"labels","confusionMatrix"),l=Object(s.convertToTensor)(t,"predictions","confusionMatrix");o.assert(null==n||n>0&&Number.isInteger(n),(()=>`If provided, numClasses must be a positive integer, but got ${n}`)),o.assert(1===u.rank,(()=>`Expected the rank of labels to be 1, but got ${u.rank}`)),o.assert(1===l.rank,(()=>`Expected the rank of predictions to be 1, but got ${l.rank}`)),o.assert(u.shape[0]===l.shape[0],(()=>`Mismatch in the number of examples: ${u.shape[0]} vs. ${l.shape[0]}. Labels and predictions should have the same number of elements.`)),o.assert(n>0&&Number.isInteger(n),(()=>`numClasses is required to be a positive integer, but got ${n}`));const c=Object(a.oneHot)(Object(r.cast)(u,"int32"),n),f=Object(a.oneHot)(Object(r.cast)(l,"int32"),n),p=Object(d.transpose)(c),m=Object(i.matMul)(p,f);return Object(r.cast)(m,"int32")}const c=Object(u.op)({confusionMatrix_:l})},"./node_modules/@tensorflow/tfjs-core/dist/ops/conv1d.js": /*!***************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/conv1d.js ***! \***************************************************************/ -/*! exports provided: conv1d */function(e,t,n){"use strict";n.r(t),n.d(t,"conv1d",(function(){return u}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./conv2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d.js"),i=n(/*! ./conv_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),d=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const u=Object(a.op)({conv1d_:function(e,t,n,a,u="NWC",l=1,c){const f=Object(s.convertToTensor)(e,"x","conv1d"),p=Object(s.convertToTensor)(t,"filter","conv1d");let m=f,h=!1;2===f.rank&&(h=!0,m=Object(d.reshape)(f,[1,f.shape[0],f.shape[1]])),o.assert(3===m.rank,(()=>`Error in conv1d: input must be rank 3, but got rank ${m.rank}.`)),o.assert(3===p.rank,(()=>`Error in conv1d: filter must be rank 3, but got rank ${p.rank}.`)),null!=c&&o.assert(o.isInt(a),(()=>`Error in conv1d: pad must be an integer when using, dimRoundingMode ${c} but got pad ${a}.`)),o.assert(m.shape[2]===p.shape[1],(()=>`Error in conv1d: depth of input (${m.shape[2]}) must match input depth for filter ${p.shape[1]}.`)),o.assert(i.eitherStridesOrDilationsAreOne(n,l),(()=>`Error in conv1D: Either stride or dilation must be 1. Got stride ${n} and dilation '${l}'`)),o.assert("NWC"===u,(()=>`Error in conv1d: got dataFormat of ${u} but only NWC is currently supported.`));const b=Object(d.reshape)(p,[1,p.shape[0],p.shape[1],p.shape[2]]),j=Object(d.reshape)(m,[m.shape[0],1,m.shape[1],m.shape[2]]),g=[1,n],w=[1,l],_=Object(r.conv2d)(j,b,g,a,"NHWC",w,c);return h?Object(d.reshape)(_,[_.shape[2],_.shape[3]]):Object(d.reshape)(_,[_.shape[0],_.shape[2],_.shape[3]])}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d.js": +/*! exports provided: conv1d */function(e,t,n){"use strict";n.r(t),n.d(t,"conv1d",(function(){return d}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./conv2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d.js"),i=n(/*! ./conv_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const d=Object(a.op)({conv1d_:function(e,t,n,a,d="NWC",l=1,c){const f=Object(s.convertToTensor)(e,"x","conv1d"),p=Object(s.convertToTensor)(t,"filter","conv1d");let m=f,h=!1;2===f.rank&&(h=!0,m=Object(u.reshape)(f,[1,f.shape[0],f.shape[1]])),o.assert(3===m.rank,(()=>`Error in conv1d: input must be rank 3, but got rank ${m.rank}.`)),o.assert(3===p.rank,(()=>`Error in conv1d: filter must be rank 3, but got rank ${p.rank}.`)),null!=c&&o.assert(o.isInt(a),(()=>`Error in conv1d: pad must be an integer when using, dimRoundingMode ${c} but got pad ${a}.`)),o.assert(m.shape[2]===p.shape[1],(()=>`Error in conv1d: depth of input (${m.shape[2]}) must match input depth for filter ${p.shape[1]}.`)),o.assert(i.eitherStridesOrDilationsAreOne(n,l),(()=>`Error in conv1D: Either stride or dilation must be 1. Got stride ${n} and dilation '${l}'`)),o.assert("NWC"===d,(()=>`Error in conv1d: got dataFormat of ${d} but only NWC is currently supported.`));const b=Object(u.reshape)(p,[1,p.shape[0],p.shape[1],p.shape[2]]),j=Object(u.reshape)(m,[m.shape[0],1,m.shape[1],m.shape[2]]),g=[1,n],w=[1,l],_=Object(r.conv2d)(j,b,g,a,"NHWC",w,c);return h?Object(u.reshape)(_,[_.shape[2],_.shape[3]]):Object(u.reshape)(_,[_.shape[0],_.shape[2],_.shape[3]])}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d.js": /*!***************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d.js ***! \***************************************************************/ -/*! exports provided: conv2d */function(e,t,n){"use strict";n.r(t),n.d(t,"conv2d",(function(){return l}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./conv_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const l=Object(d.op)({conv2d_: +/*! exports provided: conv2d */function(e,t,n){"use strict";n.r(t),n.d(t,"conv2d",(function(){return l}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./conv_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),d=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const l=Object(u.op)({conv2d_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -13189,11 +13190,11 @@ function l(e,t,n){const d=Object(s.convertToTensor)(e,"labels","confusionMatrix" * limitations under the License. * ============================================================================= */ -function(e,t,n,d,l="NHWC",c=[1,1],f){const p=Object(r.convertToTensor)(e,"x","conv2d"),m=Object(r.convertToTensor)(t,"filter","conv2d");let h=p,b=!1;3===p.rank&&(b=!0,h=Object(u.reshape)(p,[1,p.shape[0],p.shape[1],p.shape[2]])),i.assert(4===h.rank,(()=>`Error in conv2d: input must be rank 4, but got rank ${h.rank}.`)),i.assert(4===m.rank,(()=>`Error in conv2d: filter must be rank 4, but got rank ${m.rank}.`)),null!=f&&i.assert(i.isInt(d),(()=>`Error in conv2d: pad must be an integer when using, dimRoundingMode ${f} but got pad ${d}.`));const j="NHWC"===l?h.shape[3]:h.shape[1];i.assert(j===m.shape[2],(()=>`Error in conv2d: depth of input (${j}) must match input depth for filter ${m.shape[2]}.`)),i.assert(a.eitherStridesOrDilationsAreOne(n,c),(()=>`Error in conv2D: Either strides or dilations must be 1. Got strides ${n} and dilations '${c}'`));const g={x:h,filter:m},w={strides:n,pad:d,dataFormat:l,dilations:c,dimRoundingMode:f},_=s.ENGINE.runKernel(o.Conv2D,g,w);return b?Object(u.reshape)(_,[_.shape[1],_.shape[2],_.shape[3]]):_}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d_backprop_filter.js": +function(e,t,n,u,l="NHWC",c=[1,1],f){const p=Object(r.convertToTensor)(e,"x","conv2d"),m=Object(r.convertToTensor)(t,"filter","conv2d");let h=p,b=!1;3===p.rank&&(b=!0,h=Object(d.reshape)(p,[1,p.shape[0],p.shape[1],p.shape[2]])),i.assert(4===h.rank,(()=>`Error in conv2d: input must be rank 4, but got rank ${h.rank}.`)),i.assert(4===m.rank,(()=>`Error in conv2d: filter must be rank 4, but got rank ${m.rank}.`)),null!=f&&i.assert(i.isInt(u),(()=>`Error in conv2d: pad must be an integer when using, dimRoundingMode ${f} but got pad ${u}.`));const j="NHWC"===l?h.shape[3]:h.shape[1];i.assert(j===m.shape[2],(()=>`Error in conv2d: depth of input (${j}) must match input depth for filter ${m.shape[2]}.`)),i.assert(a.eitherStridesOrDilationsAreOne(n,c),(()=>`Error in conv2D: Either strides or dilations must be 1. Got strides ${n} and dilations '${c}'`));const g={x:h,filter:m},w={strides:n,pad:u,dataFormat:l,dilations:c,dimRoundingMode:f},_=s.ENGINE.runKernel(o.Conv2D,g,w);return b?Object(d.reshape)(_,[_.shape[1],_.shape[2],_.shape[3]]):_}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d_backprop_filter.js": /*!*******************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d_backprop_filter.js ***! \*******************************************************************************/ -/*! exports provided: conv2DBackpropFilter */function(e,t,n){"use strict";n.r(t),n.d(t,"conv2DBackpropFilter",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),a=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const d=Object(i.op)({conv2DBackpropFilter_: +/*! exports provided: conv2DBackpropFilter */function(e,t,n){"use strict";n.r(t),n.d(t,"conv2DBackpropFilter",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),a=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const u=Object(i.op)({conv2DBackpropFilter_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -13210,11 +13211,11 @@ function(e,t,n,d,l="NHWC",c=[1,1],f){const p=Object(r.convertToTensor)(e,"x","co * limitations under the License. * ============================================================================= */ -function(e,t,n,i,d,u="NHWC",l){let c=e;3===e.rank&&(c=Object(a.reshape)(e,[1,e.shape[0],e.shape[1],e.shape[2]]));let f=t;3===f.rank&&(f=Object(a.reshape)(t,[1,t.shape[0],t.shape[1],t.shape[2]])),r.assert(4===c.rank,(()=>`Error in conv2dDerFilter: input must be rank 4, but got shape ${c.shape}.`)),r.assert(4===f.rank,(()=>`Error in conv2dDerFilter: dy must be rank 4, but got shape ${f.shape}.`)),r.assert(4===n.length,(()=>`Error in conv2dDerFilter: filterShape must be length 4, but got ${n}.`));const p="NHWC"===u?c.shape[3]:c.shape[1],m="NHWC"===u?f.shape[3]:f.shape[1];r.assert(p===n[2],(()=>`Error in conv2dDerFilter: depth of input ${p}) must match input depth in filter (${n[2]}.`)),r.assert(m===n[3],(()=>`Error in conv2dDerFilter: depth of dy (${m}) must match output depth for filter (${n[3]}).`)),null!=l&&r.assert(r.isInt(d),(()=>`Error in conv2dDerFilter: pad must be an integer when using, dimRoundingMode ${l} but got pad ${d}.`));const h={x:c,dy:f},b={strides:i,pad:d,dataFormat:u,dimRoundingMode:l,filterShape:n};return s.ENGINE.runKernel(o.Conv2DBackpropFilter,h,b)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d_backprop_input.js": +function(e,t,n,i,u,d="NHWC",l){let c=e;3===e.rank&&(c=Object(a.reshape)(e,[1,e.shape[0],e.shape[1],e.shape[2]]));let f=t;3===f.rank&&(f=Object(a.reshape)(t,[1,t.shape[0],t.shape[1],t.shape[2]])),r.assert(4===c.rank,(()=>`Error in conv2dDerFilter: input must be rank 4, but got shape ${c.shape}.`)),r.assert(4===f.rank,(()=>`Error in conv2dDerFilter: dy must be rank 4, but got shape ${f.shape}.`)),r.assert(4===n.length,(()=>`Error in conv2dDerFilter: filterShape must be length 4, but got ${n}.`));const p="NHWC"===d?c.shape[3]:c.shape[1],m="NHWC"===d?f.shape[3]:f.shape[1];r.assert(p===n[2],(()=>`Error in conv2dDerFilter: depth of input ${p}) must match input depth in filter (${n[2]}.`)),r.assert(m===n[3],(()=>`Error in conv2dDerFilter: depth of dy (${m}) must match output depth for filter (${n[3]}).`)),null!=l&&r.assert(r.isInt(u),(()=>`Error in conv2dDerFilter: pad must be an integer when using, dimRoundingMode ${l} but got pad ${u}.`));const h={x:c,dy:f},b={strides:i,pad:u,dataFormat:d,dimRoundingMode:l,filterShape:n};return s.ENGINE.runKernel(o.Conv2DBackpropFilter,h,b)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d_backprop_input.js": /*!******************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d_backprop_input.js ***! \******************************************************************************/ -/*! exports provided: conv2DBackpropInput */function(e,t,n){"use strict";n.r(t),n.d(t,"conv2DBackpropInput",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),a=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const d=Object(i.op)({conv2DBackpropInput_: +/*! exports provided: conv2DBackpropInput */function(e,t,n){"use strict";n.r(t),n.d(t,"conv2DBackpropInput",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),a=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const u=Object(i.op)({conv2DBackpropInput_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -13231,15 +13232,15 @@ function(e,t,n,i,d,u="NHWC",l){let c=e;3===e.rank&&(c=Object(a.reshape)(e,[1,e.s * limitations under the License. * ============================================================================= */ -function(e,t,n,i,d,u="NHWC",l){r.assert(e.length===t.rank,(()=>`Length of inShape (${e.length}) and rank of dy (${t.rank}) must match`));let c=e,f=t,p=!1;3===t.rank&&(p=!0,f=Object(a.reshape)(t,[1,t.shape[0],t.shape[1],t.shape[2]]),c=[1,e[0],e[1],e[2]]),r.assert(4===c.length,(()=>`Error in conv2dDerInput: inShape must be length 4, but got length ${c.length}.`)),r.assert(4===f.rank,(()=>`Error in conv2dDerInput: dy must be rank 4, but got rank ${f.rank}`)),r.assert(4===n.rank,(()=>`Error in conv2dDerInput: filter must be rank 4, but got rank ${n.rank}`));const m="NHWC"===u?c[3]:c[1],h="NHWC"===u?f.shape[3]:f.shape[1];r.assert(m===n.shape[2],(()=>`Error in conv2dDerInput: depth of input (${m}) must match input depth for filter ${n.shape[2]}.`)),r.assert(h===n.shape[3],(()=>`Error in conv2dDerInput: depth of output (${h}) must match output depth for filter ${n.shape[3]}.`)),null!=l&&r.assert(r.isInt(d),(()=>`Error in conv2dDerInput: pad must be an integer when using, dimRoundingMode ${l} but got pad ${d}.`));const b={dy:f,filter:n},j={strides:i,pad:d,dataFormat:u,dimRoundingMode:l,inputShape:c},g=s.ENGINE.runKernel(o.Conv2DBackpropInput,b,j);return p?Object(a.reshape)(g,[g.shape[1],g.shape[2],g.shape[3]]):g}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d_transpose.js": +function(e,t,n,i,u,d="NHWC",l){r.assert(e.length===t.rank,(()=>`Length of inShape (${e.length}) and rank of dy (${t.rank}) must match`));let c=e,f=t,p=!1;3===t.rank&&(p=!0,f=Object(a.reshape)(t,[1,t.shape[0],t.shape[1],t.shape[2]]),c=[1,e[0],e[1],e[2]]),r.assert(4===c.length,(()=>`Error in conv2dDerInput: inShape must be length 4, but got length ${c.length}.`)),r.assert(4===f.rank,(()=>`Error in conv2dDerInput: dy must be rank 4, but got rank ${f.rank}`)),r.assert(4===n.rank,(()=>`Error in conv2dDerInput: filter must be rank 4, but got rank ${n.rank}`));const m="NHWC"===d?c[3]:c[1],h="NHWC"===d?f.shape[3]:f.shape[1];r.assert(m===n.shape[2],(()=>`Error in conv2dDerInput: depth of input (${m}) must match input depth for filter ${n.shape[2]}.`)),r.assert(h===n.shape[3],(()=>`Error in conv2dDerInput: depth of output (${h}) must match output depth for filter ${n.shape[3]}.`)),null!=l&&r.assert(r.isInt(u),(()=>`Error in conv2dDerInput: pad must be an integer when using, dimRoundingMode ${l} but got pad ${u}.`));const b={dy:f,filter:n},j={strides:i,pad:u,dataFormat:d,dimRoundingMode:l,inputShape:c},g=s.ENGINE.runKernel(o.Conv2DBackpropInput,b,j);return p?Object(a.reshape)(g,[g.shape[1],g.shape[2],g.shape[3]]):g}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d_transpose.js": /*!*************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d_transpose.js ***! \*************************************************************************/ -/*! exports provided: conv2dTranspose */function(e,t,n){"use strict";n.r(t),n.d(t,"conv2dTranspose",(function(){return i}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ./conv2d_backprop_input */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d_backprop_input.js"),r=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const i=Object(r.op)({conv2dTranspose_:function(e,t,n,r,i,a){const d=Object(s.convertToTensor)(e,"x","conv2dTranspose"),u=Object(s.convertToTensor)(t,"filter","conv2dTranspose");return Object(o.conv2DBackpropInput)(n,d,u,r,i,"NHWC",a)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/conv3d.js": +/*! exports provided: conv2dTranspose */function(e,t,n){"use strict";n.r(t),n.d(t,"conv2dTranspose",(function(){return i}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ./conv2d_backprop_input */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d_backprop_input.js"),r=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const i=Object(r.op)({conv2dTranspose_:function(e,t,n,r,i,a){const u=Object(s.convertToTensor)(e,"x","conv2dTranspose"),d=Object(s.convertToTensor)(t,"filter","conv2dTranspose");return Object(o.conv2DBackpropInput)(n,u,d,r,i,"NHWC",a)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/conv3d.js": /*!***************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/conv3d.js ***! \***************************************************************/ -/*! exports provided: conv3d */function(e,t,n){"use strict";n.r(t),n.d(t,"conv3d",(function(){return l}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./conv_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const l=Object(d.op)({conv3d_: +/*! exports provided: conv3d */function(e,t,n){"use strict";n.r(t),n.d(t,"conv3d",(function(){return l}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./conv_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),d=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const l=Object(u.op)({conv3d_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -13256,11 +13257,11 @@ function(e,t,n,i,d,u="NHWC",l){r.assert(e.length===t.rank,(()=>`Length of inShap * limitations under the License. * ============================================================================= */ -function(e,t,n,d,l="NDHWC",c=[1,1,1]){const f=Object(r.convertToTensor)(e,"x","conv3d"),p=Object(r.convertToTensor)(t,"filter","conv3d");let m=f,h=!1;4===f.rank&&(h=!0,m=Object(u.reshape)(f,[1,f.shape[0],f.shape[1],f.shape[2],f.shape[3]])),i.assert(5===m.rank,(()=>`Error in conv3d: input must be rank 5, but got rank ${m.rank}.`)),i.assert(5===p.rank,(()=>`Error in conv3d: filter must be rank 5, but got rank ${p.rank}.`)),i.assert(m.shape[4]===p.shape[3],(()=>`Error in conv3d: depth of input (${m.shape[4]}) must match input depth for filter ${p.shape[3]}.`)),i.assert(Object(a.eitherStridesOrDilationsAreOne)(n,c),(()=>`Error in conv3D: Either strides or dilations must be 1. Got strides ${n} and dilations '${c}'`)),i.assert("NDHWC"===l,(()=>`Error in conv3d: got dataFormat of ${l} but only NDHWC is currently supported.`));const b={x:m,filter:p},j={strides:n,pad:d,dataFormat:l,dilations:c},g=s.ENGINE.runKernel(o.Conv3D,b,j);return h?Object(u.reshape)(g,[g.shape[1],g.shape[2],g.shape[3],g.shape[4]]):g}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/conv3d_backprop_input.js": +function(e,t,n,u,l="NDHWC",c=[1,1,1]){const f=Object(r.convertToTensor)(e,"x","conv3d"),p=Object(r.convertToTensor)(t,"filter","conv3d");let m=f,h=!1;4===f.rank&&(h=!0,m=Object(d.reshape)(f,[1,f.shape[0],f.shape[1],f.shape[2],f.shape[3]])),i.assert(5===m.rank,(()=>`Error in conv3d: input must be rank 5, but got rank ${m.rank}.`)),i.assert(5===p.rank,(()=>`Error in conv3d: filter must be rank 5, but got rank ${p.rank}.`)),i.assert(m.shape[4]===p.shape[3],(()=>`Error in conv3d: depth of input (${m.shape[4]}) must match input depth for filter ${p.shape[3]}.`)),i.assert(Object(a.eitherStridesOrDilationsAreOne)(n,c),(()=>`Error in conv3D: Either strides or dilations must be 1. Got strides ${n} and dilations '${c}'`)),i.assert("NDHWC"===l,(()=>`Error in conv3d: got dataFormat of ${l} but only NDHWC is currently supported.`));const b={x:m,filter:p},j={strides:n,pad:u,dataFormat:l,dilations:c},g=s.ENGINE.runKernel(o.Conv3D,b,j);return h?Object(d.reshape)(g,[g.shape[1],g.shape[2],g.shape[3],g.shape[4]]):g}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/conv3d_backprop_input.js": /*!******************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/conv3d_backprop_input.js ***! \******************************************************************************/ -/*! exports provided: conv3DBackpropInput */function(e,t,n){"use strict";n.r(t),n.d(t,"conv3DBackpropInput",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),a=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const d=Object(i.op)({conv3DBackpropInput_: +/*! exports provided: conv3DBackpropInput */function(e,t,n){"use strict";n.r(t),n.d(t,"conv3DBackpropInput",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),a=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const u=Object(i.op)({conv3DBackpropInput_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -13277,11 +13278,11 @@ function(e,t,n,d,l="NDHWC",c=[1,1,1]){const f=Object(r.convertToTensor)(e,"x","c * limitations under the License. * ============================================================================= */ -function(e,t,n,i,d){r.assert(e.length===t.rank,(()=>`Length of inShape (${e.length}) and rank of dy (${t.rank}) must match`));let u=e,l=t,c=!1;4===t.rank&&(c=!0,l=Object(a.reshape)(t,[1,t.shape[0],t.shape[1],t.shape[2],t.shape[3]]),u=[1,e[0],e[1],e[2],e[3]]);const f=u[4],p=l.shape[4];r.assert(5===u.length,(()=>`Error in conv3dDerInput: inShape must be length 5, but got length ${u.length}.`)),r.assert(5===l.rank,(()=>`Error in conv3dDerInput: dy must be rank 5, but got rank ${l.rank}`)),r.assert(5===n.rank,(()=>`Error in conv3dDerInput: filter must be rank 5, but got rank ${n.rank}`)),r.assert(f===n.shape[3],(()=>`Error in conv3dDerInput: depth of input (${f}) must match input depth for filter ${n.shape[3]}.`)),r.assert(p===n.shape[4],(()=>`Error in conv3dDerInput: depth of output (${p}) must match output depth for filter ${n.shape[4]}.`));const m={dy:l,filter:n},h={pad:d,strides:i,inputShape:u},b=s.ENGINE.runKernel(o.Conv3DBackpropInputV2,m,h);return c?Object(a.reshape)(b,[b.shape[1],b.shape[2],b.shape[3],b.shape[4]]):b}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/conv3d_transpose.js": +function(e,t,n,i,u){r.assert(e.length===t.rank,(()=>`Length of inShape (${e.length}) and rank of dy (${t.rank}) must match`));let d=e,l=t,c=!1;4===t.rank&&(c=!0,l=Object(a.reshape)(t,[1,t.shape[0],t.shape[1],t.shape[2],t.shape[3]]),d=[1,e[0],e[1],e[2],e[3]]);const f=d[4],p=l.shape[4];r.assert(5===d.length,(()=>`Error in conv3dDerInput: inShape must be length 5, but got length ${d.length}.`)),r.assert(5===l.rank,(()=>`Error in conv3dDerInput: dy must be rank 5, but got rank ${l.rank}`)),r.assert(5===n.rank,(()=>`Error in conv3dDerInput: filter must be rank 5, but got rank ${n.rank}`)),r.assert(f===n.shape[3],(()=>`Error in conv3dDerInput: depth of input (${f}) must match input depth for filter ${n.shape[3]}.`)),r.assert(p===n.shape[4],(()=>`Error in conv3dDerInput: depth of output (${p}) must match output depth for filter ${n.shape[4]}.`));const m={dy:l,filter:n},h={pad:u,strides:i,inputShape:d},b=s.ENGINE.runKernel(o.Conv3DBackpropInputV2,m,h);return c?Object(a.reshape)(b,[b.shape[1],b.shape[2],b.shape[3],b.shape[4]]):b}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/conv3d_transpose.js": /*!*************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/conv3d_transpose.js ***! \*************************************************************************/ -/*! exports provided: conv3dTranspose */function(e,t,n){"use strict";n.r(t),n.d(t,"conv3dTranspose",(function(){return i}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ./conv3d_backprop_input */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv3d_backprop_input.js"),r=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const i=Object(r.op)({conv3dTranspose_:function(e,t,n,r,i){const a=Object(s.convertToTensor)(e,"x","conv3dTranspose"),d=Object(s.convertToTensor)(t,"filter","conv3dTranspose");return Object(o.conv3DBackpropInput)(n,a,d,r,i)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js": +/*! exports provided: conv3dTranspose */function(e,t,n){"use strict";n.r(t),n.d(t,"conv3dTranspose",(function(){return i}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ./conv3d_backprop_input */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv3d_backprop_input.js"),r=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const i=Object(r.op)({conv3dTranspose_:function(e,t,n,r,i){const a=Object(s.convertToTensor)(e,"x","conv3dTranspose"),u=Object(s.convertToTensor)(t,"filter","conv3dTranspose");return Object(o.conv3DBackpropInput)(n,a,u,r,i)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js": /*!******************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js ***! \******************************************************************/ @@ -13302,7 +13303,7 @@ function(e,t,n,i,d){r.assert(e.length===t.rank,(()=>`Length of inShape (${e.leng * limitations under the License. * ============================================================================= */ -function s(e,t,n,s,o="NHWC",r){return i(e,[...t,e[3]],n,r,s,null,null,h(o))}function o(e,t,n,s,o,r,a="channelsLast"){const[d,l]=u(t);let c;if("channelsLast"===a)c=[d,l,e[3],e[3]];else{if("channelsFirst"!==a)throw new Error(`Unknown dataFormat ${a}`);c=[d,l,e[1],e[1]]}return i(e,c,n,s,o,r,!1,a)}function r(e,t,n,s,o,r,i="NDHWC"){const[d,u,c]=l(t);let f,p;if("NDHWC"===i)p="channelsLast",f=[d,u,c,e[4],e[4]];else{if("NCDHW"!==i)throw new Error(`Unknown dataFormat ${i}`);p="channelsFirst",f=[d,u,c,e[1],e[1]]}return a(e,f,n,s,o,!1,p,r)}function i(e,t,n,s,o,r,i=!1,a="channelsLast"){let[l,p,m,h]=[-1,-1,-1,-1];if("channelsLast"===a)[l,p,m,h]=e;else{if("channelsFirst"!==a)throw new Error(`Unknown dataFormat ${a}`);[l,h,p,m]=e}const[b,j,,g]=t,[w,_]=u(n),[k,v]=u(s),x=c(b,k),y=c(j,v),{padInfo:O,outHeight:I,outWidth:C}=function(e,t,n,s,o,r,i,a,u){let l,c,p;if("number"==typeof e){l={top:e,bottom:e,left:e,right:e,type:0===e?"VALID":"NUMBER"};const o=function(e,t,n,s,o){null==s&&(s=d(e,t,n));const r=e[0],i=e[1],a=f((r-t+2*s)/n+1,o),u=f((i-t+2*s)/n+1,o);return[a,u]}([t,n],r,s,e,a);c=o[0],p=o[1]}else if("same"===e){c=Math.ceil(t/s),p=Math.ceil(n/o);const e=Math.max(0,(c-1)*s+r-t),a=Math.max(0,(p-1)*o+i-n),d=Math.floor(e/2),u=e-d,f=Math.floor(a/2);l={top:d,bottom:u,left:f,right:a-f,type:"SAME"}}else if("valid"===e)l={top:0,bottom:0,left:0,right:0,type:"VALID"},c=Math.ceil((t-r+1)/s),p=Math.ceil((n-i+1)/o);else{if("object"!=typeof e)throw Error(`Unknown padding parameter: ${e}`);{const d="channelsLast"===u?e[1][0]:e[2][0],m="channelsLast"===u?e[1][1]:e[2][1],h="channelsLast"===u?e[2][0]:e[3][0],b="channelsLast"===u?e[2][1]:e[3][1];l={top:d,bottom:m,left:h,right:b,type:0===d&&0===m&&0===h&&0===b?"VALID":"EXPLICIT"},c=f((t-r+d+m)/s+1,a),p=f((n-i+h+b)/o+1,a)}}return{padInfo:l,outHeight:c,outWidth:p}}(o,p,m,w,_,x,y,r,a),S=i?g*h:g;let T;return"channelsFirst"===a?T=[l,S,I,C]:"channelsLast"===a&&(T=[l,I,C,S]),{batchSize:l,dataFormat:a,inHeight:p,inWidth:m,inChannels:h,outHeight:I,outWidth:C,outChannels:S,padInfo:O,strideHeight:w,strideWidth:_,filterHeight:b,filterWidth:j,effectiveFilterHeight:x,effectiveFilterWidth:y,dilationHeight:k,dilationWidth:v,inShape:e,outShape:T,filterShape:t}}function a(e,t,n,s,o,r=!1,i="channelsLast",a){let[u,p,m,h,b]=[-1,-1,-1,-1,-1];if("channelsLast"===i)[u,p,m,h,b]=e;else{if("channelsFirst"!==i)throw new Error(`Unknown dataFormat ${i}`);[u,b,p,m,h]=e}const[j,g,w,,_]=t,[k,v,x]=l(n),[y,O,I]=l(s),C=c(j,y),S=c(g,O),T=c(w,I),{padInfo:N,outDepth:E,outHeight:A,outWidth:R}=function(e,t,n,s,o,r,i,a,u,l,c){let p,m,h,b;if("number"==typeof e){p={top:e,bottom:e,left:e,right:e,front:e,back:e,type:0===e?"VALID":"NUMBER"};const r=function(e,t,n,s,o,r){null==o&&(o=d(e,t,s));const i=e[0],a=e[1],u=e[2],l=f((i-t+2*o)/s+1,r),c=f((a-t+2*o)/s+1,r),p=f((u-t+2*o)/s+1,r);return[l,c,p,n]}([t,n,s,1],a,1,o,e,c);m=r[0],h=r[1],b=r[2]}else if("same"===e){m=Math.ceil(t/o),h=Math.ceil(n/r),b=Math.ceil(s/i);const e=(m-1)*o+a-t,d=(h-1)*r+u-n,c=(b-1)*i+l-s,f=Math.floor(e/2),j=e-f,g=Math.floor(d/2),w=d-g,_=Math.floor(c/2);p={top:g,bottom:w,left:_,right:c-_,front:f,back:j,type:"SAME"}}else{if("valid"!==e)throw Error(`Unknown padding parameter: ${e}`);p={top:0,bottom:0,left:0,right:0,front:0,back:0,type:"VALID"},m=Math.ceil((t-a+1)/o),h=Math.ceil((n-u+1)/r),b=Math.ceil((s-l+1)/i)}return{padInfo:p,outDepth:m,outHeight:h,outWidth:b}}(o,p,m,h,k,v,x,C,S,T,a),F=r?_*b:_;let $;return"channelsFirst"===i?$=[u,F,E,A,R]:"channelsLast"===i&&($=[u,E,A,R,F]),{batchSize:u,dataFormat:i,inDepth:p,inHeight:m,inWidth:h,inChannels:b,outDepth:E,outHeight:A,outWidth:R,outChannels:F,padInfo:N,strideDepth:k,strideHeight:v,strideWidth:x,filterDepth:j,filterHeight:g,filterWidth:w,effectiveFilterDepth:C,effectiveFilterHeight:S,effectiveFilterWidth:T,dilationDepth:y,dilationHeight:O,dilationWidth:I,inShape:e,outShape:$,filterShape:t}}function d(e,t,n,s=1){const o=c(t,s);return Math.floor((e[0]*(n-1)-n+o)/2)}function u(e){return"number"==typeof e?[e,e,e]:2===e.length?[e[0],e[1],1]:e}function l(e){return"number"==typeof e?[e,e,e]:e}function c(e,t){return t<=1?e:e+(e-1)*(t-1)}function f(e,t){if(!t)return Math.trunc(e);switch(t){case"round":return Math.round(e);case"ceil":return Math.ceil(e);case"floor":return Math.floor(e);default:throw new Error(`Unknown roundingMode ${t}`)}}function p(e){const[t,n,s]=u(e);return 1===t&&1===n&&1===s}function m(e,t){return p(e)||p(t)}function h(e){if("NHWC"===e)return"channelsLast";if("NCHW"===e)return"channelsFirst";throw new Error(`Unknown dataFormat ${e}`)}n.r(t),n.d(t,"computeDilation2DInfo",(function(){return s})),n.d(t,"computePool2DInfo",(function(){return o})),n.d(t,"computePool3DInfo",(function(){return r})),n.d(t,"computeConv2DInfo",(function(){return i})),n.d(t,"computeConv3DInfo",(function(){return a})),n.d(t,"computeDefaultPad",(function(){return d})),n.d(t,"tupleValuesAreOne",(function(){return p})),n.d(t,"eitherStridesOrDilationsAreOne",(function(){return m})),n.d(t,"convertConv2DDataFormat",(function(){return h}))},"./node_modules/@tensorflow/tfjs-core/dist/ops/cos.js": +function s(e,t,n,s,o="NHWC",r){return i(e,[...t,e[3]],n,r,s,null,null,h(o))}function o(e,t,n,s,o,r,a="channelsLast"){const[u,l]=d(t);let c;if("channelsLast"===a)c=[u,l,e[3],e[3]];else{if("channelsFirst"!==a)throw new Error(`Unknown dataFormat ${a}`);c=[u,l,e[1],e[1]]}return i(e,c,n,s,o,r,!1,a)}function r(e,t,n,s,o,r,i="NDHWC"){const[u,d,c]=l(t);let f,p;if("NDHWC"===i)p="channelsLast",f=[u,d,c,e[4],e[4]];else{if("NCDHW"!==i)throw new Error(`Unknown dataFormat ${i}`);p="channelsFirst",f=[u,d,c,e[1],e[1]]}return a(e,f,n,s,o,!1,p,r)}function i(e,t,n,s,o,r,i=!1,a="channelsLast"){let[l,p,m,h]=[-1,-1,-1,-1];if("channelsLast"===a)[l,p,m,h]=e;else{if("channelsFirst"!==a)throw new Error(`Unknown dataFormat ${a}`);[l,h,p,m]=e}const[b,j,,g]=t,[w,_]=d(n),[k,v]=d(s),x=c(b,k),y=c(j,v),{padInfo:O,outHeight:I,outWidth:C}=function(e,t,n,s,o,r,i,a,d){let l,c,p;if("number"==typeof e){l={top:e,bottom:e,left:e,right:e,type:0===e?"VALID":"NUMBER"};const o=function(e,t,n,s,o){null==s&&(s=u(e,t,n));const r=e[0],i=e[1],a=f((r-t+2*s)/n+1,o),d=f((i-t+2*s)/n+1,o);return[a,d]}([t,n],r,s,e,a);c=o[0],p=o[1]}else if("same"===e){c=Math.ceil(t/s),p=Math.ceil(n/o);const e=Math.max(0,(c-1)*s+r-t),a=Math.max(0,(p-1)*o+i-n),u=Math.floor(e/2),d=e-u,f=Math.floor(a/2);l={top:u,bottom:d,left:f,right:a-f,type:"SAME"}}else if("valid"===e)l={top:0,bottom:0,left:0,right:0,type:"VALID"},c=Math.ceil((t-r+1)/s),p=Math.ceil((n-i+1)/o);else{if("object"!=typeof e)throw Error(`Unknown padding parameter: ${e}`);{const u="channelsLast"===d?e[1][0]:e[2][0],m="channelsLast"===d?e[1][1]:e[2][1],h="channelsLast"===d?e[2][0]:e[3][0],b="channelsLast"===d?e[2][1]:e[3][1];l={top:u,bottom:m,left:h,right:b,type:0===u&&0===m&&0===h&&0===b?"VALID":"EXPLICIT"},c=f((t-r+u+m)/s+1,a),p=f((n-i+h+b)/o+1,a)}}return{padInfo:l,outHeight:c,outWidth:p}}(o,p,m,w,_,x,y,r,a),S=i?g*h:g;let T;return"channelsFirst"===a?T=[l,S,I,C]:"channelsLast"===a&&(T=[l,I,C,S]),{batchSize:l,dataFormat:a,inHeight:p,inWidth:m,inChannels:h,outHeight:I,outWidth:C,outChannels:S,padInfo:O,strideHeight:w,strideWidth:_,filterHeight:b,filterWidth:j,effectiveFilterHeight:x,effectiveFilterWidth:y,dilationHeight:k,dilationWidth:v,inShape:e,outShape:T,filterShape:t}}function a(e,t,n,s,o,r=!1,i="channelsLast",a){let[d,p,m,h,b]=[-1,-1,-1,-1,-1];if("channelsLast"===i)[d,p,m,h,b]=e;else{if("channelsFirst"!==i)throw new Error(`Unknown dataFormat ${i}`);[d,b,p,m,h]=e}const[j,g,w,,_]=t,[k,v,x]=l(n),[y,O,I]=l(s),C=c(j,y),S=c(g,O),T=c(w,I),{padInfo:N,outDepth:E,outHeight:A,outWidth:R}=function(e,t,n,s,o,r,i,a,d,l,c){let p,m,h,b;if("number"==typeof e){p={top:e,bottom:e,left:e,right:e,front:e,back:e,type:0===e?"VALID":"NUMBER"};const r=function(e,t,n,s,o,r){null==o&&(o=u(e,t,s));const i=e[0],a=e[1],d=e[2],l=f((i-t+2*o)/s+1,r),c=f((a-t+2*o)/s+1,r),p=f((d-t+2*o)/s+1,r);return[l,c,p,n]}([t,n,s,1],a,1,o,e,c);m=r[0],h=r[1],b=r[2]}else if("same"===e){m=Math.ceil(t/o),h=Math.ceil(n/r),b=Math.ceil(s/i);const e=(m-1)*o+a-t,u=(h-1)*r+d-n,c=(b-1)*i+l-s,f=Math.floor(e/2),j=e-f,g=Math.floor(u/2),w=u-g,_=Math.floor(c/2);p={top:g,bottom:w,left:_,right:c-_,front:f,back:j,type:"SAME"}}else{if("valid"!==e)throw Error(`Unknown padding parameter: ${e}`);p={top:0,bottom:0,left:0,right:0,front:0,back:0,type:"VALID"},m=Math.ceil((t-a+1)/o),h=Math.ceil((n-d+1)/r),b=Math.ceil((s-l+1)/i)}return{padInfo:p,outDepth:m,outHeight:h,outWidth:b}}(o,p,m,h,k,v,x,C,S,T,a),F=r?_*b:_;let M;return"channelsFirst"===i?M=[d,F,E,A,R]:"channelsLast"===i&&(M=[d,E,A,R,F]),{batchSize:d,dataFormat:i,inDepth:p,inHeight:m,inWidth:h,inChannels:b,outDepth:E,outHeight:A,outWidth:R,outChannels:F,padInfo:N,strideDepth:k,strideHeight:v,strideWidth:x,filterDepth:j,filterHeight:g,filterWidth:w,effectiveFilterDepth:C,effectiveFilterHeight:S,effectiveFilterWidth:T,dilationDepth:y,dilationHeight:O,dilationWidth:I,inShape:e,outShape:M,filterShape:t}}function u(e,t,n,s=1){const o=c(t,s);return Math.floor((e[0]*(n-1)-n+o)/2)}function d(e){return"number"==typeof e?[e,e,e]:2===e.length?[e[0],e[1],1]:e}function l(e){return"number"==typeof e?[e,e,e]:e}function c(e,t){return t<=1?e:e+(e-1)*(t-1)}function f(e,t){if(!t)return Math.trunc(e);switch(t){case"round":return Math.round(e);case"ceil":return Math.ceil(e);case"floor":return Math.floor(e);default:throw new Error(`Unknown roundingMode ${t}`)}}function p(e){const[t,n,s]=d(e);return 1===t&&1===n&&1===s}function m(e,t){return p(e)||p(t)}function h(e){if("NHWC"===e)return"channelsLast";if("NCHW"===e)return"channelsFirst";throw new Error(`Unknown dataFormat ${e}`)}n.r(t),n.d(t,"computeDilation2DInfo",(function(){return s})),n.d(t,"computePool2DInfo",(function(){return o})),n.d(t,"computePool3DInfo",(function(){return r})),n.d(t,"computeConv2DInfo",(function(){return i})),n.d(t,"computeConv3DInfo",(function(){return a})),n.d(t,"computeDefaultPad",(function(){return u})),n.d(t,"tupleValuesAreOne",(function(){return p})),n.d(t,"eitherStridesOrDilationsAreOne",(function(){return m})),n.d(t,"convertConv2DDataFormat",(function(){return h}))},"./node_modules/@tensorflow/tfjs-core/dist/ops/cos.js": /*!************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/cos.js ***! \************************************************************/ @@ -13365,11 +13366,11 @@ function(e){const t={x:Object(r.convertToTensor)(e,"x","cosh")};return s.ENGINE. * limitations under the License. * ============================================================================= */ -function(e,t=0,n=!1,i=!1){const a={x:Object(r.convertToTensor)(e,"x","cumsum")},d={axis:t,exclusive:n,reverse:i};return s.ENGINE.runKernel(o.Cumsum,a,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/dense_bincount.js": +function(e,t=0,n=!1,i=!1){const a={x:Object(r.convertToTensor)(e,"x","cumsum")},u={axis:t,exclusive:n,reverse:i};return s.ENGINE.runKernel(o.Cumsum,a,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/dense_bincount.js": /*!***********************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/dense_bincount.js ***! \***********************************************************************/ -/*! exports provided: denseBincount */function(e,t,n){"use strict";n.r(t),n.d(t,"denseBincount",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({denseBincount_: +/*! exports provided: denseBincount */function(e,t,n){"use strict";n.r(t),n.d(t,"denseBincount",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({denseBincount_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -13386,11 +13387,11 @@ function(e,t=0,n=!1,i=!1){const a={x:Object(r.convertToTensor)(e,"x","cumsum")}, * limitations under the License. * ============================================================================= */ -function(e,t,n,a=!1){const d=Object(r.convertToTensor)(e,"x","denseBincount"),u=Object(r.convertToTensor)(t,"weights","denseBincount");i.assert("int32"===d.dtype,(()=>`Error in denseBincount: input dtype must be int32, but got ${d.dtype}`)),i.assert(d.rank<=2,(()=>`Error in denseBincount: input must be at most rank 2, but got rank ${d.rank}.`)),i.assert(n>=0,(()=>`size must be non-negative, but got ${n}.`)),i.assert(u.size===d.size||0===u.size,(()=>`Error in denseBincount: weights must have the same shape as x or 0-length, but got x shape: ${d.shape}, weights shape: ${u.shape}.`));const l={x:d,weights:u},c={size:n,binaryOutput:a};return s.ENGINE.runKernel(o.DenseBincount,l,c)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/depth_to_space.js": +function(e,t,n,a=!1){const u=Object(r.convertToTensor)(e,"x","denseBincount"),d=Object(r.convertToTensor)(t,"weights","denseBincount");i.assert("int32"===u.dtype,(()=>`Error in denseBincount: input dtype must be int32, but got ${u.dtype}`)),i.assert(u.rank<=2,(()=>`Error in denseBincount: input must be at most rank 2, but got rank ${u.rank}.`)),i.assert(n>=0,(()=>`size must be non-negative, but got ${n}.`)),i.assert(d.size===u.size||0===d.size,(()=>`Error in denseBincount: weights must have the same shape as x or 0-length, but got x shape: ${u.shape}, weights shape: ${d.shape}.`));const l={x:u,weights:d},c={size:n,binaryOutput:a};return s.ENGINE.runKernel(o.DenseBincount,l,c)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/depth_to_space.js": /*!***********************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/depth_to_space.js ***! \***********************************************************************/ -/*! exports provided: depthToSpace */function(e,t,n){"use strict";n.r(t),n.d(t,"depthToSpace",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({depthToSpace_: +/*! exports provided: depthToSpace */function(e,t,n){"use strict";n.r(t),n.d(t,"depthToSpace",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({depthToSpace_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -13407,11 +13408,11 @@ function(e,t,n,a=!1){const d=Object(r.convertToTensor)(e,"x","denseBincount"),u= * limitations under the License. * ============================================================================= */ -function(e,t,n="NHWC"){const a=Object(r.convertToTensor)(e,"x","depthToSpace"),d="NHWC"===n?a.shape[1]:a.shape[2],u="NHWC"===n?a.shape[2]:a.shape[3],l="NHWC"===n?a.shape[3]:a.shape[1];i.assert(d*t>=0,(()=>`Negative dimension size caused by overflow when multiplying\n ${d} and ${t} for depthToSpace with input shape\n ${a.shape}`)),i.assert(u*t>=0,(()=>`Negative dimension size caused by overflow when multiplying\n ${u} and ${t} for depthToSpace with input shape\n ${a.shape}`)),i.assert(l%(t*t)==0,(()=>`Dimension size must be evenly divisible by ${t*t} but is ${l} for depthToSpace with input shape ${a.shape}`));const c={x:a},f={blockSize:t,dataFormat:n};return s.ENGINE.runKernel(o.DepthToSpace,c,f)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d.js": +function(e,t,n="NHWC"){const a=Object(r.convertToTensor)(e,"x","depthToSpace"),u="NHWC"===n?a.shape[1]:a.shape[2],d="NHWC"===n?a.shape[2]:a.shape[3],l="NHWC"===n?a.shape[3]:a.shape[1];i.assert(u*t>=0,(()=>`Negative dimension size caused by overflow when multiplying\n ${u} and ${t} for depthToSpace with input shape\n ${a.shape}`)),i.assert(d*t>=0,(()=>`Negative dimension size caused by overflow when multiplying\n ${d} and ${t} for depthToSpace with input shape\n ${a.shape}`)),i.assert(l%(t*t)==0,(()=>`Dimension size must be evenly divisible by ${t*t} but is ${l} for depthToSpace with input shape ${a.shape}`));const c={x:a},f={blockSize:t,dataFormat:n};return s.ENGINE.runKernel(o.DepthToSpace,c,f)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d.js": /*!*************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d.js ***! \*************************************************************************/ -/*! exports provided: depthwiseConv2d */function(e,t,n){"use strict";n.r(t),n.d(t,"depthwiseConv2d",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),d=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const u=Object(a.op)({depthwiseConv2d_: +/*! exports provided: depthwiseConv2d */function(e,t,n){"use strict";n.r(t),n.d(t,"depthwiseConv2d",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const d=Object(a.op)({depthwiseConv2d_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -13428,7 +13429,7 @@ function(e,t,n="NHWC"){const a=Object(r.convertToTensor)(e,"x","depthToSpace"),d * limitations under the License. * ============================================================================= */ -function(e,t,n,a,u="NHWC",l=[1,1],c){const f=Object(r.convertToTensor)(e,"x","depthwiseConv2d"),p=Object(r.convertToTensor)(t,"filter","depthwiseConv2d");let m=f,h=!1;3===f.rank&&(h=!0,m=Object(d.reshape)(f,[1,f.shape[0],f.shape[1],f.shape[2]])),i.assert(4===m.rank,(()=>`Error in depthwiseConv2d: input must be rank 4, but got rank ${m.rank}.`)),i.assert(4===p.rank,(()=>`Error in depthwiseConv2d: filter must be rank 4, but got rank ${p.rank}.`)),i.assert(m.shape[3]===p.shape[2],(()=>`Error in depthwiseConv2d: number of input channels (${m.shape[3]}) must match the inChannels dimension in filter ${p.shape[2]}.`)),null!=c&&i.assert(i.isInt(a),(()=>`Error in depthwiseConv2d: pad must be an integer when using, dimRoundingMode ${c} but got pad ${a}.`));const b={x:m,filter:p},j={strides:n,pad:a,dataFormat:u,dilations:l,dimRoundingMode:c},g=s.ENGINE.runKernel(o.DepthwiseConv2dNative,b,j);return h?Object(d.reshape)(g,[g.shape[1],g.shape[2],g.shape[3]]):g}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d_native_backprop_filter.js": +function(e,t,n,a,d="NHWC",l=[1,1],c){const f=Object(r.convertToTensor)(e,"x","depthwiseConv2d"),p=Object(r.convertToTensor)(t,"filter","depthwiseConv2d");let m=f,h=!1;3===f.rank&&(h=!0,m=Object(u.reshape)(f,[1,f.shape[0],f.shape[1],f.shape[2]])),i.assert(4===m.rank,(()=>`Error in depthwiseConv2d: input must be rank 4, but got rank ${m.rank}.`)),i.assert(4===p.rank,(()=>`Error in depthwiseConv2d: filter must be rank 4, but got rank ${p.rank}.`)),i.assert(m.shape[3]===p.shape[2],(()=>`Error in depthwiseConv2d: number of input channels (${m.shape[3]}) must match the inChannels dimension in filter ${p.shape[2]}.`)),null!=c&&i.assert(i.isInt(a),(()=>`Error in depthwiseConv2d: pad must be an integer when using, dimRoundingMode ${c} but got pad ${a}.`));const b={x:m,filter:p},j={strides:n,pad:a,dataFormat:d,dilations:l,dimRoundingMode:c},g=s.ENGINE.runKernel(o.DepthwiseConv2dNative,b,j);return h?Object(u.reshape)(g,[g.shape[1],g.shape[2],g.shape[3]]):g}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d_native_backprop_filter.js": /*!************************************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d_native_backprop_filter.js ***! \************************************************************************************************/ @@ -13449,7 +13450,7 @@ function(e,t,n,a,u="NHWC",l=[1,1],c){const f=Object(r.convertToTensor)(e,"x","de * limitations under the License. * ============================================================================= */ -function(e,t,n,r,a,d=[1,1],u){let l=e;3===e.rank&&(l=Object(i.reshape)(e,[1,e.shape[0],e.shape[1],e.shape[2]]));let c=t;3===c.rank&&(c=Object(i.reshape)(t,[1,t.shape[0],t.shape[1],t.shape[2]]));const f={x:l,dy:c},p={strides:r,pad:a,dimRoundingMode:u,dilations:d,filterShape:n};return s.ENGINE.runKernel(o.DepthwiseConv2dNativeBackpropFilter,f,p)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d_native_backprop_input.js": +function(e,t,n,r,a,u=[1,1],d){let l=e;3===e.rank&&(l=Object(i.reshape)(e,[1,e.shape[0],e.shape[1],e.shape[2]]));let c=t;3===c.rank&&(c=Object(i.reshape)(t,[1,t.shape[0],t.shape[1],t.shape[2]]));const f={x:l,dy:c},p={strides:r,pad:a,dimRoundingMode:d,dilations:u,filterShape:n};return s.ENGINE.runKernel(o.DepthwiseConv2dNativeBackpropFilter,f,p)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d_native_backprop_input.js": /*!***********************************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d_native_backprop_input.js ***! \***********************************************************************************************/ @@ -13470,7 +13471,7 @@ function(e,t,n,r,a,d=[1,1],u){let l=e;3===e.rank&&(l=Object(i.reshape)(e,[1,e.sh * limitations under the License. * ============================================================================= */ -function(e,t,n,r,a,d=[1,1],u){let l=t,c=!1;3===t.rank&&(c=!0,l=Object(i.reshape)(t,[1,t.shape[0],t.shape[1],t.shape[2]]));const f={dy:l,filter:n},p={strides:r,pad:a,dimRoundingMode:u,dilations:d,inputShape:e},m=s.ENGINE.runKernel(o.DepthwiseConv2dNativeBackpropInput,f,p);return c?Object(i.reshape)(m,[m.shape[1],m.shape[2],m.shape[3]]):m}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/diag.js": +function(e,t,n,r,a,u=[1,1],d){let l=t,c=!1;3===t.rank&&(c=!0,l=Object(i.reshape)(t,[1,t.shape[0],t.shape[1],t.shape[2]]));const f={dy:l,filter:n},p={strides:r,pad:a,dimRoundingMode:d,dilations:u,inputShape:e},m=s.ENGINE.runKernel(o.DepthwiseConv2dNativeBackpropInput,f,p);return c?Object(i.reshape)(m,[m.shape[1],m.shape[2],m.shape[3]]):m}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/diag.js": /*!*************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/diag.js ***! \*************************************************************/ @@ -13495,7 +13496,7 @@ function(e){const t={x:Object(r.convertToTensor)(e,"x","diag")};return s.ENGINE. /*!*******************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/dilation2d.js ***! \*******************************************************************/ -/*! exports provided: dilation2d */function(e,t,n){"use strict";n.r(t),n.d(t,"dilation2d",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),d=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const u=Object(a.op)({dilation2d_: +/*! exports provided: dilation2d */function(e,t,n){"use strict";n.r(t),n.d(t,"dilation2d",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const d=Object(a.op)({dilation2d_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -13512,11 +13513,11 @@ function(e){const t={x:Object(r.convertToTensor)(e,"x","diag")};return s.ENGINE. * limitations under the License. * ============================================================================= */ -function(e,t,n,a,u=[1,1],l="NHWC"){const c=Object(r.convertToTensor)(e,"x","dilation2d"),f=Object(r.convertToTensor)(t,"filter","dilation2d");i.assert(3===c.rank||4===c.rank,(()=>`Error in dilation2d: input must be rank 3 or 4, but got rank ${c.rank}.`)),i.assert(3===f.rank,(()=>`Error in dilation2d: filter must be rank 3, but got rank ${f.rank}.`)),i.assert("NHWC"===l,(()=>`Error in dilation2d: Only NHWC is currently supported, but got dataFormat of ${l}`));let p=c,m=!1;3===c.rank&&(p=Object(d.reshape)(c,[1,c.shape[0],c.shape[1],c.shape[2]]),m=!0);const h={x:p,filter:f},b={strides:n,pad:a,dilations:u},j=s.ENGINE.runKernel(o.Dilation2D,h,b);return m?Object(d.reshape)(j,[j.shape[1],j.shape[2],j.shape[3]]):j}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js": +function(e,t,n,a,d=[1,1],l="NHWC"){const c=Object(r.convertToTensor)(e,"x","dilation2d"),f=Object(r.convertToTensor)(t,"filter","dilation2d");i.assert(3===c.rank||4===c.rank,(()=>`Error in dilation2d: input must be rank 3 or 4, but got rank ${c.rank}.`)),i.assert(3===f.rank,(()=>`Error in dilation2d: filter must be rank 3, but got rank ${f.rank}.`)),i.assert("NHWC"===l,(()=>`Error in dilation2d: Only NHWC is currently supported, but got dataFormat of ${l}`));let p=c,m=!1;3===c.rank&&(p=Object(u.reshape)(c,[1,c.shape[0],c.shape[1],c.shape[2]]),m=!0);const h={x:p,filter:f},b={strides:n,pad:a,dilations:d},j=s.ENGINE.runKernel(o.Dilation2D,h,b);return m?Object(u.reshape)(j,[j.shape[1],j.shape[2],j.shape[3]]):j}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js": /*!************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/div.js ***! \************************************************************/ -/*! exports provided: div */function(e,t,n){"use strict";n.r(t),n.d(t,"div",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./floorDiv */"./node_modules/@tensorflow/tfjs-core/dist/ops/floorDiv.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(d.op)({div_: +/*! exports provided: div */function(e,t,n){"use strict";n.r(t),n.d(t,"div",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./floorDiv */"./node_modules/@tensorflow/tfjs-core/dist/ops/floorDiv.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(u.op)({div_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -13533,11 +13534,11 @@ function(e,t,n,a,u=[1,1],l="NHWC"){const c=Object(r.convertToTensor)(e,"x","dila * limitations under the License. * ============================================================================= */ -function(e,t){let n=Object(i.convertToTensor)(e,"a","div"),d=Object(i.convertToTensor)(t,"b","div");if([n,d]=Object(r.makeTypesMatch)(n,d),"int32"===n.dtype&&"int32"===d.dtype)return Object(a.floorDiv)(n,d);const u={a:n,b:d};return s.ENGINE.runKernel(o.RealDiv,u,{})}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/div_no_nan.js": +function(e,t){let n=Object(i.convertToTensor)(e,"a","div"),u=Object(i.convertToTensor)(t,"b","div");if([n,u]=Object(r.makeTypesMatch)(n,u),"int32"===n.dtype&&"int32"===u.dtype)return Object(a.floorDiv)(n,u);const d={a:n,b:u};return s.ENGINE.runKernel(o.RealDiv,d,{})}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/div_no_nan.js": /*!*******************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/div_no_nan.js ***! \*******************************************************************/ -/*! exports provided: divNoNan */function(e,t,n){"use strict";n.r(t),n.d(t,"divNoNan",(function(){return l}));var s=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),o=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),r=n(/*! ./div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),i=n(/*! ./equal */"./node_modules/@tensorflow/tfjs-core/dist/ops/equal.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),d=n(/*! ./where */"./node_modules/@tensorflow/tfjs-core/dist/ops/where.js"),u=n(/*! ./zeros_like */"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js");const l=Object(a.op)({divNoNan_: +/*! exports provided: divNoNan */function(e,t,n){"use strict";n.r(t),n.d(t,"divNoNan",(function(){return l}));var s=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),o=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),r=n(/*! ./div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),i=n(/*! ./equal */"./node_modules/@tensorflow/tfjs-core/dist/ops/equal.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ./where */"./node_modules/@tensorflow/tfjs-core/dist/ops/where.js"),d=n(/*! ./zeros_like */"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js");const l=Object(a.op)({divNoNan_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -13554,11 +13555,11 @@ function(e,t){let n=Object(i.convertToTensor)(e,"a","div"),d=Object(i.convertToT * limitations under the License. * ============================================================================= */ -function(e,t){let n=Object(o.convertToTensor)(e,"a","div"),a=Object(o.convertToTensor)(t,"b","div");[n,a]=Object(s.makeTypesMatch)(n,a);const l=Object(r.div)(n,a),c=Object(u.zerosLike)(l),f=Object(i.equal)(a,c);return Object(d.where)(f,c,l)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/dot.js": +function(e,t){let n=Object(o.convertToTensor)(e,"a","div"),a=Object(o.convertToTensor)(t,"b","div");[n,a]=Object(s.makeTypesMatch)(n,a);const l=Object(r.div)(n,a),c=Object(d.zerosLike)(l),f=Object(i.equal)(a,c);return Object(u.where)(f,c,l)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/dot.js": /*!************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/dot.js ***! \************************************************************/ -/*! exports provided: dot */function(e,t,n){"use strict";n.r(t),n.d(t,"dot",(function(){return d}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./mat_mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mat_mul.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),a=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const d=Object(i.op)({dot_: +/*! exports provided: dot */function(e,t,n){"use strict";n.r(t),n.d(t,"dot",(function(){return u}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./mat_mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mat_mul.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),a=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const u=Object(i.op)({dot_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -13575,11 +13576,11 @@ function(e,t){let n=Object(o.convertToTensor)(e,"a","div"),a=Object(o.convertToT * limitations under the License. * ============================================================================= */ -function(e,t){const n=Object(s.convertToTensor)(e,"t1","dot"),i=Object(s.convertToTensor)(t,"t2","dot");o.assert(!(1!==n.rank&&2!==n.rank||1!==i.rank&&2!==i.rank),(()=>`Error in dot: inputs must all be rank 1 or 2, but got ranks ${n.rank} and ${i.rank}.`));const d=1===n.rank?n.size:n.shape[1],u=1===i.rank?i.size:i.shape[0];if(o.assert(d===u,(()=>`Error in dot: inner dimensions of inputs must match, but got ${d} and ${u}.`)),1===n.rank&&1===i.rank){const e=Object(a.reshape)(n,[1,-1]),t=Object(a.reshape)(i,[-1,1]),s=Object(r.matMul)(e,t);return Object(a.reshape)(s,[])}if(1===n.rank&&2===i.rank){const e=Object(a.reshape)(n,[1,-1]),t=Object(a.reshape)(i,[i.shape[0],i.shape[1]]),s=Object(r.matMul)(e,t);return Object(a.reshape)(s,[s.size])}if(2===n.rank&&1===i.rank){const e=Object(a.reshape)(i,[-1,1]),t=Object(r.matMul)(n,e);return Object(a.reshape)(t,[t.size])}{const e=Object(a.reshape)(i,[i.shape[0],i.shape[1]]);return Object(r.matMul)(n,e)}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/dropout.js": +function(e,t){const n=Object(s.convertToTensor)(e,"t1","dot"),i=Object(s.convertToTensor)(t,"t2","dot");o.assert(!(1!==n.rank&&2!==n.rank||1!==i.rank&&2!==i.rank),(()=>`Error in dot: inputs must all be rank 1 or 2, but got ranks ${n.rank} and ${i.rank}.`));const u=1===n.rank?n.size:n.shape[1],d=1===i.rank?i.size:i.shape[0];if(o.assert(u===d,(()=>`Error in dot: inner dimensions of inputs must match, but got ${u} and ${d}.`)),1===n.rank&&1===i.rank){const e=Object(a.reshape)(n,[1,-1]),t=Object(a.reshape)(i,[-1,1]),s=Object(r.matMul)(e,t);return Object(a.reshape)(s,[])}if(1===n.rank&&2===i.rank){const e=Object(a.reshape)(n,[1,-1]),t=Object(a.reshape)(i,[i.shape[0],i.shape[1]]),s=Object(r.matMul)(e,t);return Object(a.reshape)(s,[s.size])}if(2===n.rank&&1===i.rank){const e=Object(a.reshape)(i,[-1,1]),t=Object(r.matMul)(n,e);return Object(a.reshape)(t,[t.size])}{const e=Object(a.reshape)(i,[i.shape[0],i.shape[1]]);return Object(r.matMul)(n,e)}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/dropout.js": /*!****************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/dropout.js ***! \****************************************************************/ -/*! exports provided: dropout */function(e,t,n){"use strict";n.r(t),n.d(t,"dropout",(function(){return p}));var s=n(/*! ../tensor */"./node_modules/@tensorflow/tfjs-core/dist/tensor.js"),o=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),r=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),i=n(/*! ./add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),a=n(/*! ./div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),d=n(/*! ./dropout_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/dropout_util.js"),u=n(/*! ./floor */"./node_modules/@tensorflow/tfjs-core/dist/ops/floor.js"),l=n(/*! ./mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),c=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),f=n(/*! ./random_uniform */"./node_modules/@tensorflow/tfjs-core/dist/ops/random_uniform.js");const p=Object(c.op)({dropout_: +/*! exports provided: dropout */function(e,t,n){"use strict";n.r(t),n.d(t,"dropout",(function(){return p}));var s=n(/*! ../tensor */"./node_modules/@tensorflow/tfjs-core/dist/tensor.js"),o=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),r=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),i=n(/*! ./add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),a=n(/*! ./div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),u=n(/*! ./dropout_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/dropout_util.js"),d=n(/*! ./floor */"./node_modules/@tensorflow/tfjs-core/dist/ops/floor.js"),l=n(/*! ./mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),c=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),f=n(/*! ./random_uniform */"./node_modules/@tensorflow/tfjs-core/dist/ops/random_uniform.js");const p=Object(c.op)({dropout_: /** * @license * Copyright 2018 Google LLC. All Rights Reserved. @@ -13596,7 +13597,7 @@ function(e,t){const n=Object(s.convertToTensor)(e,"t1","dot"),i=Object(s.convert * limitations under the License. * ============================================================================= */ -function(e,t,n,c){const p=Object(o.convertToTensor)(e,"x","dropout");if(r.assert("float32"===p.dtype,(()=>`x has to be a floating point tensor since it's going to be scaled, but got a ${p.dtype} tensor instead.`)),r.assert(t>=0&&t<1,(()=>`rate must be a float in the range [0, 1), but got ${t}.`)),0===t)return e instanceof s.Tensor?p.clone():p;const m=Object(d.getNoiseShape)(p,n),h=1-t,b=Object(a.div)(Object(u.floor)(Object(i.add)(Object(f.randomUniform)(m,0,1,"float32",c),h)),h);return Object(l.mul)(p,b)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/dropout_util.js": +function(e,t,n,c){const p=Object(o.convertToTensor)(e,"x","dropout");if(r.assert("float32"===p.dtype,(()=>`x has to be a floating point tensor since it's going to be scaled, but got a ${p.dtype} tensor instead.`)),r.assert(t>=0&&t<1,(()=>`rate must be a float in the range [0, 1), but got ${t}.`)),0===t)return e instanceof s.Tensor?p.clone():p;const m=Object(u.getNoiseShape)(p,n),h=1-t,b=Object(a.div)(Object(d.floor)(Object(i.add)(Object(f.randomUniform)(m,0,1,"float32",c),h)),h);return Object(l.mul)(p,b)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/dropout_util.js": /*!*********************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/dropout_util.js ***! \*********************************************************************/ @@ -13620,7 +13621,7 @@ function(e,t,n,c){const p=Object(o.convertToTensor)(e,"x","dropout");if(r.assert /*!***************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/einsum.js ***! \***************************************************************/ -/*! exports provided: einsum_, einsum */function(e,t,n){"use strict";n.r(t),n.d(t,"einsum_",(function(){return a})),n.d(t,"einsum",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"); +/*! exports provided: einsum_, einsum */function(e,t,n){"use strict";n.r(t),n.d(t,"einsum_",(function(){return a})),n.d(t,"einsum",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"); /** * @license * Copyright 2021 Google LLC. All Rights Reserved. @@ -13637,7 +13638,7 @@ function(e,t,n,c){const p=Object(o.convertToTensor)(e,"x","dropout");if(r.assert * limitations under the License. * ============================================================================= */ -function a(e,...t){const n=t.map(((e,t)=>Object(r.convertToTensor)(e,`tensors${t}`,"einsum"))),i={equation:e};return s.ENGINE.runKernel(o.Einsum,n,i)}const d=Object(i.op)({einsum_:a})},"./node_modules/@tensorflow/tfjs-core/dist/ops/elu.js": +function a(e,...t){const n=t.map(((e,t)=>Object(r.convertToTensor)(e,`tensors${t}`,"einsum"))),i={equation:e};return s.ENGINE.runKernel(o.Einsum,n,i)}const u=Object(i.op)({einsum_:a})},"./node_modules/@tensorflow/tfjs-core/dist/ops/elu.js": /*!************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/elu.js ***! \************************************************************/ @@ -13662,7 +13663,7 @@ function(e){const t={x:Object(r.convertToTensor)(e,"x","elu")};return s.ENGINE.r /*!**************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/equal.js ***! \**************************************************************/ -/*! exports provided: equal */function(e,t,n){"use strict";n.r(t),n.d(t,"equal",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(d.op)({equal_: +/*! exports provided: equal */function(e,t,n){"use strict";n.r(t),n.d(t,"equal",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(u.op)({equal_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -13679,11 +13680,11 @@ function(e){const t={x:Object(r.convertToTensor)(e,"x","elu")};return s.ENGINE.r * limitations under the License. * ============================================================================= */ -function(e,t){let n=Object(i.convertToTensor)(e,"a","equal","string_or_numeric"),d=Object(i.convertToTensor)(t,"b","equal","string_or_numeric");[n,d]=Object(r.makeTypesMatch)(n,d),Object(a.assertAndGetBroadcastShape)(n.shape,d.shape);const u={a:n,b:d};return s.ENGINE.runKernel(o.Equal,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/erf.js": +function(e,t){let n=Object(i.convertToTensor)(e,"a","equal","string_or_numeric"),u=Object(i.convertToTensor)(t,"b","equal","string_or_numeric");[n,u]=Object(r.makeTypesMatch)(n,u),Object(a.assertAndGetBroadcastShape)(n.shape,u.shape);const d={a:n,b:u};return s.ENGINE.runKernel(o.Equal,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/erf.js": /*!************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/erf.js ***! \************************************************************/ -/*! exports provided: erf */function(e,t,n){"use strict";n.r(t),n.d(t,"erf",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(d.op)({erf_: +/*! exports provided: erf */function(e,t,n){"use strict";n.r(t),n.d(t,"erf",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(u.op)({erf_: /** * @license * Copyright 2018 Google LLC. All Rights Reserved. @@ -13704,7 +13705,7 @@ function(e){let t=Object(r.convertToTensor)(e,"x","erf");i.assert("int32"===t.dt /*!*****************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/erf_util.js ***! \*****************************************************************/ -/*! exports provided: ERF_P, ERF_A1, ERF_A2, ERF_A3, ERF_A4, ERF_A5 */function(e,t,n){"use strict";n.r(t),n.d(t,"ERF_P",(function(){return s})),n.d(t,"ERF_A1",(function(){return o})),n.d(t,"ERF_A2",(function(){return r})),n.d(t,"ERF_A3",(function(){return i})),n.d(t,"ERF_A4",(function(){return a})),n.d(t,"ERF_A5",(function(){return d})); +/*! exports provided: ERF_P, ERF_A1, ERF_A2, ERF_A3, ERF_A4, ERF_A5 */function(e,t,n){"use strict";n.r(t),n.d(t,"ERF_P",(function(){return s})),n.d(t,"ERF_A1",(function(){return o})),n.d(t,"ERF_A2",(function(){return r})),n.d(t,"ERF_A3",(function(){return i})),n.d(t,"ERF_A4",(function(){return a})),n.d(t,"ERF_A5",(function(){return u})); /** * @license * Copyright 2018 Google LLC. All Rights Reserved. @@ -13721,7 +13722,7 @@ function(e){let t=Object(r.convertToTensor)(e,"x","erf");i.assert("int32"===t.dt * limitations under the License. * ============================================================================= */ -const s=.3275911,o=.254829592,r=-.284496736,i=1.421413741,a=-1.453152027,d=1.061405429},"./node_modules/@tensorflow/tfjs-core/dist/ops/exp.js": +const s=.3275911,o=.254829592,r=-.284496736,i=1.421413741,a=-1.453152027,u=1.061405429},"./node_modules/@tensorflow/tfjs-core/dist/ops/exp.js": /*!************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/exp.js ***! \************************************************************/ @@ -13746,7 +13747,7 @@ function(e){const t={x:Object(r.convertToTensor)(e,"x","exp")};return s.ENGINE.r /*!********************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/expand_dims.js ***! \********************************************************************/ -/*! exports provided: expandDims */function(e,t,n){"use strict";n.r(t),n.d(t,"expandDims",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({expandDims_: +/*! exports provided: expandDims */function(e,t,n){"use strict";n.r(t),n.d(t,"expandDims",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({expandDims_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -13763,7 +13764,7 @@ function(e){const t={x:Object(r.convertToTensor)(e,"x","exp")};return s.ENGINE.r * limitations under the License. * ============================================================================= */ -function(e,t=0){const n=Object(r.convertToTensor)(e,"x","expandDims","string_or_numeric");i.assert(t<=n.rank,(()=>"Axis must be <= rank of the tensor"));const a={input:n},d={dim:t};return s.ENGINE.runKernel(o.ExpandDims,a,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/expm1.js": +function(e,t=0){const n=Object(r.convertToTensor)(e,"x","expandDims","string_or_numeric");i.assert(t<=n.rank,(()=>"Axis must be <= rank of the tensor"));const a={input:n},u={dim:t};return s.ENGINE.runKernel(o.ExpandDims,a,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/expm1.js": /*!**************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/expm1.js ***! \**************************************************************/ @@ -13788,7 +13789,7 @@ function(e){const t={x:Object(r.convertToTensor)(e,"x","expm1")};return s.ENGINE /*!************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/eye.js ***! \************************************************************/ -/*! exports provided: eye */function(e,t,n){"use strict";n.r(t),n.d(t,"eye",(function(){return d}));var s=n(/*! ./buffer */"./node_modules/@tensorflow/tfjs-core/dist/ops/buffer.js"),o=n(/*! ./expand_dims */"./node_modules/@tensorflow/tfjs-core/dist/ops/expand_dims.js"),r=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),i=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),a=n(/*! ./tile */"./node_modules/@tensorflow/tfjs-core/dist/ops/tile.js");const d=Object(r.op)({eye_: +/*! exports provided: eye */function(e,t,n){"use strict";n.r(t),n.d(t,"eye",(function(){return u}));var s=n(/*! ./buffer */"./node_modules/@tensorflow/tfjs-core/dist/ops/buffer.js"),o=n(/*! ./expand_dims */"./node_modules/@tensorflow/tfjs-core/dist/ops/expand_dims.js"),r=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),i=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),a=n(/*! ./tile */"./node_modules/@tensorflow/tfjs-core/dist/ops/tile.js");const u=Object(r.op)({eye_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -13805,7 +13806,7 @@ function(e){const t={x:Object(r.convertToTensor)(e,"x","expm1")};return s.ENGINE * limitations under the License. * ============================================================================= */ -function(e,t,n,r="float32"){null==t&&(t=e);const d=Object(s.buffer)([e,t],r),u=e<=t?e:t;for(let e=0;e`Error in fused conv2d: input must be rank 4, but got rank ${C.rank}.`)),d.assert(4===I.rank,(()=>`Error in fused conv2d: filter must be rank 4, but got rank ${I.rank}.`)),null!=_&&d.assert(d.isInt(b),(()=>`Error in fused conv2d: pad must be an integer when using, dimRoundingMode ${_} but got pad ${b}.`)),d.assert(C.shape[3]===I.shape[2],(()=>`Error in conv2d: depth of input (${C.shape[3]}) must match input depth for filter ${I.shape[2]}.`)),d.assert(m.eitherStridesOrDilationsAreOne(n,w),(()=>`Error in conv2D: Either strides or dilations must be 1. Got strides ${n} and dilations '${w}'`)),d.assert("NHWC"===g,(()=>`Error in conv2d: got dataFormat of ${g} but only NHWC is currently supported.`));const T=m.computeConv2DInfo(C.shape,I.shape,n,w,b,_);let N,E;null!=k&&(N=Object(a.convertToTensor)(k,"bias","fused conv2d"),[N]=Object(i.makeTypesMatch)(N,O),l.assertAndGetBroadcastShape(T.outShape,N.shape)),null!=x&&(E=Object(a.convertToTensor)(x,"prelu weights","fused conv2d"));const A=(e,t)=>{const[s,o,r,i]=t,a=Object(h.getFusedDyActivation)(e,r,v);d.assert(m.tupleValuesAreOne(w),(()=>`Error in gradient of fused conv2D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${w}'`));const u=[Object(p.conv2DBackpropInput)(o.shape,a,s,n,b),Object(f.conv2DBackpropFilter)(o,a,s.shape,n,b)];if(null!=i){const e=Object(h.getFusedBiasGradient)(i,a);u.push(e)}return u},R={x:C,filter:I,bias:N,preluActivationWeights:E},F={strides:n,pad:b,dataFormat:g,dilations:w,dimRoundingMode:_,activation:v,leakyreluAlpha:y};if(null==k){return Object(o.customGrad)(((e,t,n)=>{let o=s.ENGINE.runKernel(r.FusedConv2D,R,F);return n([t,e,o]),S&&(o=Object(j.reshape)(o,[o.shape[1],o.shape[2],o.shape[3]])),{value:o,gradFunc:A}}))(C,I)}return Object(o.customGrad)(((e,t,n,o)=>{let i=s.ENGINE.runKernel(r.FusedConv2D,R,F);return o([t,e,i,n]),S&&(i=Object(j.reshape)(i,[i.shape[1],i.shape[2],i.shape[3]])),{value:i,gradFunc:A}}))(C,I,N)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/fused/depthwise_conv2d.js": +function({x:e,filter:t,strides:n,pad:b,dataFormat:g="NHWC",dilations:w=[1,1],dimRoundingMode:_,bias:k,activation:v="linear",preluActivationWeights:x,leakyreluAlpha:y}){if(v=v||"linear",!1===Object(h.shouldFuse)(s.ENGINE.state.gradientDepth,v)){let s=Object(c.conv2d)(e,t,n,b,g,w,_);return null!=k&&(s=Object(d.add)(s,k)),Object(h.applyActivation)(s,v,x,y)}const O=Object(a.convertToTensor)(e,"x","conv2d"),I=Object(a.convertToTensor)(t,"filter","conv2d");let C=O,S=!1;3===O.rank&&(S=!0,C=Object(j.reshape)(O,[1,O.shape[0],O.shape[1],O.shape[2]])),u.assert(4===C.rank,(()=>`Error in fused conv2d: input must be rank 4, but got rank ${C.rank}.`)),u.assert(4===I.rank,(()=>`Error in fused conv2d: filter must be rank 4, but got rank ${I.rank}.`)),null!=_&&u.assert(u.isInt(b),(()=>`Error in fused conv2d: pad must be an integer when using, dimRoundingMode ${_} but got pad ${b}.`)),u.assert(C.shape[3]===I.shape[2],(()=>`Error in conv2d: depth of input (${C.shape[3]}) must match input depth for filter ${I.shape[2]}.`)),u.assert(m.eitherStridesOrDilationsAreOne(n,w),(()=>`Error in conv2D: Either strides or dilations must be 1. Got strides ${n} and dilations '${w}'`)),u.assert("NHWC"===g,(()=>`Error in conv2d: got dataFormat of ${g} but only NHWC is currently supported.`));const T=m.computeConv2DInfo(C.shape,I.shape,n,w,b,_);let N,E;null!=k&&(N=Object(a.convertToTensor)(k,"bias","fused conv2d"),[N]=Object(i.makeTypesMatch)(N,O),l.assertAndGetBroadcastShape(T.outShape,N.shape)),null!=x&&(E=Object(a.convertToTensor)(x,"prelu weights","fused conv2d"));const A=(e,t)=>{const[s,o,r,i]=t,a=Object(h.getFusedDyActivation)(e,r,v);u.assert(m.tupleValuesAreOne(w),(()=>`Error in gradient of fused conv2D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${w}'`));const d=[Object(p.conv2DBackpropInput)(o.shape,a,s,n,b),Object(f.conv2DBackpropFilter)(o,a,s.shape,n,b)];if(null!=i){const e=Object(h.getFusedBiasGradient)(i,a);d.push(e)}return d},R={x:C,filter:I,bias:N,preluActivationWeights:E},F={strides:n,pad:b,dataFormat:g,dilations:w,dimRoundingMode:_,activation:v,leakyreluAlpha:y};if(null==k){return Object(o.customGrad)(((e,t,n)=>{let o=s.ENGINE.runKernel(r.FusedConv2D,R,F);return n([t,e,o]),S&&(o=Object(j.reshape)(o,[o.shape[1],o.shape[2],o.shape[3]])),{value:o,gradFunc:A}}))(C,I)}return Object(o.customGrad)(((e,t,n,o)=>{let i=s.ENGINE.runKernel(r.FusedConv2D,R,F);return o([t,e,i,n]),S&&(i=Object(j.reshape)(i,[i.shape[1],i.shape[2],i.shape[3]])),{value:i,gradFunc:A}}))(C,I,N)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/fused/depthwise_conv2d.js": /*!*******************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/fused/depthwise_conv2d.js ***! \*******************************************************************************/ -/*! exports provided: depthwiseConv2d */function(e,t,n){"use strict";n.r(t),n.d(t,"depthwiseConv2d",(function(){return g}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../gradients */"./node_modules/@tensorflow/tfjs-core/dist/gradients.js"),r=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),i=n(/*! ../../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),a=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),d=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),u=n(/*! ../add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),l=n(/*! ../broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),c=n(/*! ../conv_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js"),f=n(/*! ../depthwise_conv2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d.js"),p=n(/*! ../depthwise_conv2d_native_backprop_filter */"./node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d_native_backprop_filter.js"),m=n(/*! ../depthwise_conv2d_native_backprop_input */"./node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d_native_backprop_input.js"),h=n(/*! ../fused_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/fused_util.js"),b=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),j=n(/*! ../reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const g=Object(b.op)({fusedDepthwiseConv2d_: +/*! exports provided: depthwiseConv2d */function(e,t,n){"use strict";n.r(t),n.d(t,"depthwiseConv2d",(function(){return g}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../gradients */"./node_modules/@tensorflow/tfjs-core/dist/gradients.js"),r=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),i=n(/*! ../../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),a=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),u=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),d=n(/*! ../add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),l=n(/*! ../broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),c=n(/*! ../conv_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js"),f=n(/*! ../depthwise_conv2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d.js"),p=n(/*! ../depthwise_conv2d_native_backprop_filter */"./node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d_native_backprop_filter.js"),m=n(/*! ../depthwise_conv2d_native_backprop_input */"./node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d_native_backprop_input.js"),h=n(/*! ../fused_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/fused_util.js"),b=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),j=n(/*! ../reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const g=Object(b.op)({fusedDepthwiseConv2d_: /** * @license * Copyright 2019 Google LLC. All Rights Reserved. @@ -13910,11 +13911,11 @@ function({x:e,filter:t,strides:n,pad:b,dataFormat:g="NHWC",dilations:w=[1,1],dim * limitations under the License. * ============================================================================= */ -function({x:e,filter:t,strides:n,pad:b,dataFormat:g="NHWC",dilations:w=[1,1],dimRoundingMode:_,bias:k,activation:v="linear",preluActivationWeights:x,leakyreluAlpha:y}){if(!1===Object(h.shouldFuse)(s.ENGINE.state.gradientDepth,v)){let s=Object(f.depthwiseConv2d)(e,t,n,b,g,w,_);return null!=k&&(s=Object(u.add)(s,k)),Object(h.applyActivation)(s,v,x,y)}const O=Object(a.convertToTensor)(e,"x","depthwiseConv2d"),I=Object(a.convertToTensor)(t,"filter","depthwiseConv2d");let C=O,S=!1;3===O.rank&&(S=!0,C=Object(j.reshape)(O,[1,O.shape[0],O.shape[1],O.shape[2]])),d.assert(4===C.rank,(()=>`Error in fused depthwiseConv2d: input must be rank 4, but got rank ${C.rank}.`)),d.assert(4===I.rank,(()=>`Error in fused depthwiseConv2d: filter must be rank 4, but got rank ${I.rank}.`)),d.assert(C.shape[3]===I.shape[2],(()=>`Error in fused depthwiseConv2d: number of input channels (${C.shape[3]}) must match the inChannels dimension in filter ${I.shape[2]}.`)),null==w&&(w=[1,1]),d.assert(c.eitherStridesOrDilationsAreOne(n,w),(()=>`Error in fused depthwiseConv2d: Either strides or dilations must be 1. Got strides ${n} and dilations '${w}'`)),null!=_&&d.assert(d.isInt(b),(()=>`Error in fused depthwiseConv2d: pad must be an integer when using dimRoundingMode ${_} but got pad ${b}.`));const T=c.computeConv2DInfo(C.shape,I.shape,n,w,b,_,!0);let N,E;null!=k&&(N=Object(a.convertToTensor)(k,"bias","fused conv2d"),[N]=Object(i.makeTypesMatch)(N,O),l.assertAndGetBroadcastShape(T.outShape,N.shape)),null!=x&&(E=Object(a.convertToTensor)(x,"prelu weights","fused depthwiseConv2d"));const A=(e,t)=>{d.assert(c.tupleValuesAreOne(w),(()=>`Error in gradient of fused depthwiseConv2d: dilation rates greater than 1 are not yet supported. Got dilations '${w}'`));const[s,o,r,i]=t,a=Object(h.getFusedDyActivation)(e,r,v),u=Object(m.depthwiseConv2dNativeBackpropInput)(o.shape,a,s,n,b,w,_),l=Object(p.depthwiseConv2dNativeBackpropFilter)(o,a,s.shape,n,b,w,_);if(null!=i){return[u,l,Object(h.getFusedBiasGradient)(N,a)]}return[u,l]},R={x:C,filter:I,bias:N,preluActivationWeights:E},F={strides:n,pad:b,dataFormat:g,dilations:w,dimRoundingMode:_,activation:v,leakyreluAlpha:y};if(null==k){return Object(o.customGrad)(((e,t,n)=>{let o=s.ENGINE.runKernel(r.FusedDepthwiseConv2D,R,F);return n([t,e,o]),S&&(o=Object(j.reshape)(o,[o.shape[1],o.shape[2],o.shape[3]])),{value:o,gradFunc:A}}))(C,I)}return Object(o.customGrad)(((e,t,n,o)=>{let i=s.ENGINE.runKernel(r.FusedDepthwiseConv2D,R,F);return o([t,e,i,n]),S&&(i=Object(j.reshape)(i,[i.shape[1],i.shape[2],i.shape[3]])),{value:i,gradFunc:A}}))(C,I,N)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/fused/mat_mul.js": +function({x:e,filter:t,strides:n,pad:b,dataFormat:g="NHWC",dilations:w=[1,1],dimRoundingMode:_,bias:k,activation:v="linear",preluActivationWeights:x,leakyreluAlpha:y}){if(!1===Object(h.shouldFuse)(s.ENGINE.state.gradientDepth,v)){let s=Object(f.depthwiseConv2d)(e,t,n,b,g,w,_);return null!=k&&(s=Object(d.add)(s,k)),Object(h.applyActivation)(s,v,x,y)}const O=Object(a.convertToTensor)(e,"x","depthwiseConv2d"),I=Object(a.convertToTensor)(t,"filter","depthwiseConv2d");let C=O,S=!1;3===O.rank&&(S=!0,C=Object(j.reshape)(O,[1,O.shape[0],O.shape[1],O.shape[2]])),u.assert(4===C.rank,(()=>`Error in fused depthwiseConv2d: input must be rank 4, but got rank ${C.rank}.`)),u.assert(4===I.rank,(()=>`Error in fused depthwiseConv2d: filter must be rank 4, but got rank ${I.rank}.`)),u.assert(C.shape[3]===I.shape[2],(()=>`Error in fused depthwiseConv2d: number of input channels (${C.shape[3]}) must match the inChannels dimension in filter ${I.shape[2]}.`)),null==w&&(w=[1,1]),u.assert(c.eitherStridesOrDilationsAreOne(n,w),(()=>`Error in fused depthwiseConv2d: Either strides or dilations must be 1. Got strides ${n} and dilations '${w}'`)),null!=_&&u.assert(u.isInt(b),(()=>`Error in fused depthwiseConv2d: pad must be an integer when using dimRoundingMode ${_} but got pad ${b}.`));const T=c.computeConv2DInfo(C.shape,I.shape,n,w,b,_,!0);let N,E;null!=k&&(N=Object(a.convertToTensor)(k,"bias","fused conv2d"),[N]=Object(i.makeTypesMatch)(N,O),l.assertAndGetBroadcastShape(T.outShape,N.shape)),null!=x&&(E=Object(a.convertToTensor)(x,"prelu weights","fused depthwiseConv2d"));const A=(e,t)=>{u.assert(c.tupleValuesAreOne(w),(()=>`Error in gradient of fused depthwiseConv2d: dilation rates greater than 1 are not yet supported. Got dilations '${w}'`));const[s,o,r,i]=t,a=Object(h.getFusedDyActivation)(e,r,v),d=Object(m.depthwiseConv2dNativeBackpropInput)(o.shape,a,s,n,b,w,_),l=Object(p.depthwiseConv2dNativeBackpropFilter)(o,a,s.shape,n,b,w,_);if(null!=i){return[d,l,Object(h.getFusedBiasGradient)(N,a)]}return[d,l]},R={x:C,filter:I,bias:N,preluActivationWeights:E},F={strides:n,pad:b,dataFormat:g,dilations:w,dimRoundingMode:_,activation:v,leakyreluAlpha:y};if(null==k){return Object(o.customGrad)(((e,t,n)=>{let o=s.ENGINE.runKernel(r.FusedDepthwiseConv2D,R,F);return n([t,e,o]),S&&(o=Object(j.reshape)(o,[o.shape[1],o.shape[2],o.shape[3]])),{value:o,gradFunc:A}}))(C,I)}return Object(o.customGrad)(((e,t,n,o)=>{let i=s.ENGINE.runKernel(r.FusedDepthwiseConv2D,R,F);return o([t,e,i,n]),S&&(i=Object(j.reshape)(i,[i.shape[1],i.shape[2],i.shape[3]])),{value:i,gradFunc:A}}))(C,I,N)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/fused/mat_mul.js": /*!**********************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/fused/mat_mul.js ***! \**********************************************************************/ -/*! exports provided: matMul */function(e,t,n){"use strict";n.r(t),n.d(t,"matMul",(function(){return h}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../gradients */"./node_modules/@tensorflow/tfjs-core/dist/gradients.js"),r=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),i=n(/*! ../../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),a=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),d=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),u=n(/*! ../add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),l=n(/*! ../broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),c=n(/*! ../fused_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/fused_util.js"),f=n(/*! ../mat_mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mat_mul.js"),p=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),m=n(/*! ../reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const h=Object(p.op)({fusedMatMul_: +/*! exports provided: matMul */function(e,t,n){"use strict";n.r(t),n.d(t,"matMul",(function(){return h}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../gradients */"./node_modules/@tensorflow/tfjs-core/dist/gradients.js"),r=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),i=n(/*! ../../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),a=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),u=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),d=n(/*! ../add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),l=n(/*! ../broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),c=n(/*! ../fused_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/fused_util.js"),f=n(/*! ../mat_mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mat_mul.js"),p=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),m=n(/*! ../reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const h=Object(p.op)({fusedMatMul_: /** * @license * Copyright 2019 Google LLC. All Rights Reserved. @@ -13931,7 +13932,7 @@ function({x:e,filter:t,strides:n,pad:b,dataFormat:g="NHWC",dilations:w=[1,1],dim * limitations under the License. * ============================================================================= */ -function({a:e,b:t,transposeA:n=!1,transposeB:p=!1,bias:h,activation:b="linear",preluActivationWeights:j,leakyreluAlpha:g}){if(!1===Object(c.shouldFuse)(s.ENGINE.state.gradientDepth,b)){let s=Object(f.matMul)(e,t,n,p);return null!=h&&(s=Object(u.add)(s,h)),Object(c.applyActivation)(s,b,j,g)}let w=Object(a.convertToTensor)(e,"a","fused matMul"),_=Object(a.convertToTensor)(t,"b","fused matMul");[w,_]=Object(i.makeTypesMatch)(w,_);const k=n?w.shape[w.rank-2]:w.shape[w.rank-1],v=p?_.shape[_.rank-1]:_.shape[_.rank-2],x=n?w.shape[w.rank-1]:w.shape[w.rank-2],y=p?_.shape[_.rank-2]:_.shape[_.rank-1],O=w.shape.slice(0,-2),I=_.shape.slice(0,-2),C=d.sizeFromShape(O),S=d.sizeFromShape(I);d.assert(w.rank>=2&&_.rank>=2&&w.rank===_.rank,(()=>`Error in fused matMul: inputs must have the same rank of at least 2, got ranks ${w.rank} and ${_.rank}.`)),d.assert(d.arraysEqual(O,I),(()=>`Error in fused matMul: outer dimensions (${O}) and (${I}) of Tensors with shapes ${w.shape} and ${_.shape} must match.`)),d.assert(k===v,(()=>`Error in fused matMul: inner shapes (${k}) and (${v}) of Tensors with shapes ${w.shape} and ${_.shape} and transposeA=${n} and transposeB=${p} must match.`));const T=w.shape.slice(0,-2).concat([x,y]),N=n?Object(m.reshape)(w,[C,k,x]):Object(m.reshape)(w,[C,x,k]),E=p?Object(m.reshape)(_,[S,y,v]):Object(m.reshape)(_,[S,v,y]);let A,R;null!=h&&(A=Object(a.convertToTensor)(h,"bias","fused matMul"),[A]=Object(i.makeTypesMatch)(A,w),l.assertAndGetBroadcastShape(T,A.shape)),null!=j&&(R=Object(a.convertToTensor)(j,"prelu weights","fused matMul"));const F=(e,t)=>{const[s,o,r,i]=t,a=Object(c.getFusedDyActivation)(Object(m.reshape)(e,r.shape),r,b);let d,u;if(n||p?!n&&p?(d=Object(f.matMul)(a,o,!1,!1),u=Object(f.matMul)(a,s,!0,!1)):n&&!p?(d=Object(f.matMul)(o,a,!1,!0),u=Object(f.matMul)(s,a,!1,!1)):(d=Object(f.matMul)(o,a,!0,!0),u=Object(f.matMul)(a,s,!0,!0)):(d=Object(f.matMul)(a,o,!1,!0),u=Object(f.matMul)(s,a,!0,!1)),null!=h){return[d,u,Object(c.getFusedBiasGradient)(i,a)]}return[d,u]},$={a:N,b:E,bias:A,preluActivationWeights:R},M={transposeA:n,transposeB:p,activation:b,leakyreluAlpha:g};if(null==h){return Object(o.customGrad)(((e,t,n)=>{const o=s.ENGINE.runKernel(r._FusedMatMul,$,M);return n([e,t,o]),{value:Object(m.reshape)(o,T),gradFunc:F}}))(N,E)}return Object(o.customGrad)(((e,t,n,o)=>{const i=s.ENGINE.runKernel(r._FusedMatMul,$,M);return o([e,t,i,n]),{value:Object(m.reshape)(i,T),gradFunc:F}}))(N,E,A)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/fused_ops.js": +function({a:e,b:t,transposeA:n=!1,transposeB:p=!1,bias:h,activation:b="linear",preluActivationWeights:j,leakyreluAlpha:g}){if(!1===Object(c.shouldFuse)(s.ENGINE.state.gradientDepth,b)){let s=Object(f.matMul)(e,t,n,p);return null!=h&&(s=Object(d.add)(s,h)),Object(c.applyActivation)(s,b,j,g)}let w=Object(a.convertToTensor)(e,"a","fused matMul"),_=Object(a.convertToTensor)(t,"b","fused matMul");[w,_]=Object(i.makeTypesMatch)(w,_);const k=n?w.shape[w.rank-2]:w.shape[w.rank-1],v=p?_.shape[_.rank-1]:_.shape[_.rank-2],x=n?w.shape[w.rank-1]:w.shape[w.rank-2],y=p?_.shape[_.rank-2]:_.shape[_.rank-1],O=w.shape.slice(0,-2),I=_.shape.slice(0,-2),C=u.sizeFromShape(O),S=u.sizeFromShape(I);u.assert(w.rank>=2&&_.rank>=2&&w.rank===_.rank,(()=>`Error in fused matMul: inputs must have the same rank of at least 2, got ranks ${w.rank} and ${_.rank}.`)),u.assert(u.arraysEqual(O,I),(()=>`Error in fused matMul: outer dimensions (${O}) and (${I}) of Tensors with shapes ${w.shape} and ${_.shape} must match.`)),u.assert(k===v,(()=>`Error in fused matMul: inner shapes (${k}) and (${v}) of Tensors with shapes ${w.shape} and ${_.shape} and transposeA=${n} and transposeB=${p} must match.`));const T=w.shape.slice(0,-2).concat([x,y]),N=n?Object(m.reshape)(w,[C,k,x]):Object(m.reshape)(w,[C,x,k]),E=p?Object(m.reshape)(_,[S,y,v]):Object(m.reshape)(_,[S,v,y]);let A,R;null!=h&&(A=Object(a.convertToTensor)(h,"bias","fused matMul"),[A]=Object(i.makeTypesMatch)(A,w),l.assertAndGetBroadcastShape(T,A.shape)),null!=j&&(R=Object(a.convertToTensor)(j,"prelu weights","fused matMul"));const F=(e,t)=>{const[s,o,r,i]=t,a=Object(c.getFusedDyActivation)(Object(m.reshape)(e,r.shape),r,b);let u,d;if(n||p?!n&&p?(u=Object(f.matMul)(a,o,!1,!1),d=Object(f.matMul)(a,s,!0,!1)):n&&!p?(u=Object(f.matMul)(o,a,!1,!0),d=Object(f.matMul)(s,a,!1,!1)):(u=Object(f.matMul)(o,a,!0,!0),d=Object(f.matMul)(a,s,!0,!0)):(u=Object(f.matMul)(a,o,!1,!0),d=Object(f.matMul)(s,a,!0,!1)),null!=h){return[u,d,Object(c.getFusedBiasGradient)(i,a)]}return[u,d]},M={a:N,b:E,bias:A,preluActivationWeights:R},$={transposeA:n,transposeB:p,activation:b,leakyreluAlpha:g};if(null==h){return Object(o.customGrad)(((e,t,n)=>{const o=s.ENGINE.runKernel(r._FusedMatMul,M,$);return n([e,t,o]),{value:Object(m.reshape)(o,T),gradFunc:F}}))(N,E)}return Object(o.customGrad)(((e,t,n,o)=>{const i=s.ENGINE.runKernel(r._FusedMatMul,M,$);return o([e,t,i,n]),{value:Object(m.reshape)(i,T),gradFunc:F}}))(N,E,A)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/fused_ops.js": /*!******************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/fused_ops.js ***! \******************************************************************/ @@ -13939,7 +13940,7 @@ function({a:e,b:t,transposeA:n=!1,transposeB:p=!1,bias:h,activation:b="linear",p /*!*******************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/fused_util.js ***! \*******************************************************************/ -/*! exports provided: getFusedDyActivation, getFusedBiasGradient, applyActivation, shouldFuse */function(e,t,n){"use strict";n.r(t),n.d(t,"getFusedDyActivation",(function(){return m})),n.d(t,"getFusedBiasGradient",(function(){return h})),n.d(t,"applyActivation",(function(){return b})),n.d(t,"shouldFuse",(function(){return j}));var s=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),o=n(/*! ./elu */"./node_modules/@tensorflow/tfjs-core/dist/ops/elu.js"),r=n(/*! ./leaky_relu */"./node_modules/@tensorflow/tfjs-core/dist/ops/leaky_relu.js"),i=n(/*! ./mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),a=n(/*! ./prelu */"./node_modules/@tensorflow/tfjs-core/dist/ops/prelu.js"),d=n(/*! ./relu */"./node_modules/@tensorflow/tfjs-core/dist/ops/relu.js"),u=n(/*! ./relu6 */"./node_modules/@tensorflow/tfjs-core/dist/ops/relu6.js"),l=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),c=n(/*! ./sigmoid */"./node_modules/@tensorflow/tfjs-core/dist/ops/sigmoid.js"),f=n(/*! ./step */"./node_modules/@tensorflow/tfjs-core/dist/ops/step.js"),p=n(/*! ./sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js"); +/*! exports provided: getFusedDyActivation, getFusedBiasGradient, applyActivation, shouldFuse */function(e,t,n){"use strict";n.r(t),n.d(t,"getFusedDyActivation",(function(){return m})),n.d(t,"getFusedBiasGradient",(function(){return h})),n.d(t,"applyActivation",(function(){return b})),n.d(t,"shouldFuse",(function(){return j}));var s=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),o=n(/*! ./elu */"./node_modules/@tensorflow/tfjs-core/dist/ops/elu.js"),r=n(/*! ./leaky_relu */"./node_modules/@tensorflow/tfjs-core/dist/ops/leaky_relu.js"),i=n(/*! ./mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),a=n(/*! ./prelu */"./node_modules/@tensorflow/tfjs-core/dist/ops/prelu.js"),u=n(/*! ./relu */"./node_modules/@tensorflow/tfjs-core/dist/ops/relu.js"),d=n(/*! ./relu6 */"./node_modules/@tensorflow/tfjs-core/dist/ops/relu6.js"),l=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),c=n(/*! ./sigmoid */"./node_modules/@tensorflow/tfjs-core/dist/ops/sigmoid.js"),f=n(/*! ./step */"./node_modules/@tensorflow/tfjs-core/dist/ops/step.js"),p=n(/*! ./sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js"); /** * @license * Copyright 2019 Google LLC. All Rights Reserved. @@ -13956,7 +13957,7 @@ function({a:e,b:t,transposeA:n=!1,transposeB:p=!1,bias:h,activation:b="linear",p * limitations under the License. * ============================================================================= */ -function m(e,t,n){if(null==n||"linear"===n)return e;if("relu"===n)return Object(i.mul)(e,Object(f.step)(t));throw new Error(`Cannot compute gradient for fused activation ${n}.`)}function h(e,t){let n=t;const o=s.getReductionAxes(e.shape,t.shape);return o.length>0&&(n=Object(p.sum)(n,o)),Object(l.reshape)(n,e.shape)}function b(e,t,n,s){if("linear"===t)return e;if("relu"===t)return Object(d.relu)(e);if("elu"===t)return Object(o.elu)(e);if("relu6"===t)return Object(u.relu6)(e);if("prelu"===t)return Object(a.prelu)(e,n);if("leakyrelu"===t)return Object(r.leakyRelu)(e,s);if("sigmoid"===t)return Object(c.sigmoid)(e);throw new Error(`Unknown fused activation ${t}.`)}const j=(e,t)=>!(e>0)||"linear"===t},"./node_modules/@tensorflow/tfjs-core/dist/ops/gather.js": +function m(e,t,n){if(null==n||"linear"===n)return e;if("relu"===n)return Object(i.mul)(e,Object(f.step)(t));throw new Error(`Cannot compute gradient for fused activation ${n}.`)}function h(e,t){let n=t;const o=s.getReductionAxes(e.shape,t.shape);return o.length>0&&(n=Object(p.sum)(n,o)),Object(l.reshape)(n,e.shape)}function b(e,t,n,s){if("linear"===t)return e;if("relu"===t)return Object(u.relu)(e);if("elu"===t)return Object(o.elu)(e);if("relu6"===t)return Object(d.relu6)(e);if("prelu"===t)return Object(a.prelu)(e,n);if("leakyrelu"===t)return Object(r.leakyRelu)(e,s);if("sigmoid"===t)return Object(c.sigmoid)(e);throw new Error(`Unknown fused activation ${t}.`)}const j=(e,t)=>!(e>0)||"linear"===t},"./node_modules/@tensorflow/tfjs-core/dist/ops/gather.js": /*!***************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/gather.js ***! \***************************************************************/ @@ -13977,7 +13978,7 @@ function m(e,t,n){if(null==n||"linear"===n)return e;if("relu"===n)return Object( * limitations under the License. * ============================================================================= */ -function(e,t,n=0,i=0){const a={x:Object(r.convertToTensor)(e,"x","gather"),indices:Object(r.convertToTensor)(t,"indices","gather","int32")},d={axis:n,batchDims:i};return s.ENGINE.runKernel(o.GatherV2,a,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/gather_nd.js": +function(e,t,n=0,i=0){const a={x:Object(r.convertToTensor)(e,"x","gather"),indices:Object(r.convertToTensor)(t,"indices","gather","int32")},u={axis:n,batchDims:i};return s.ENGINE.runKernel(o.GatherV2,a,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/gather_nd.js": /*!******************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/gather_nd.js ***! \******************************************************************/ @@ -14002,11 +14003,11 @@ function(e,t){const n=Object(r.convertToTensor)(t,"indices","gatherND","int32"), /*!***********************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/gather_nd_util.js ***! \***********************************************************************/ -/*! exports provided: prepareAndValidate */function(e,t,n){"use strict";n.r(t),n.d(t,"prepareAndValidate",(function(){return o}));var s=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js");function o(e,t){const n=e.shape.length,o=t.shape.length;if(n<1)throw new Error(`tf.gatherND() expects the input to be rank 1 or higher, but the rank was ${n}.`);if(o<1)throw new Error(`tf.gatherND() expects the indices to be rank 1 or higher, but the rank was ${o}.`);if("int32"!==t.dtype)throw new Error(`tf.gatherND() expects the indices to be int32 type, but the dtype was ${t.dtype}.`);if(t.shape[o-1]>n)throw new Error(`index innermost dimension length must be <= tensor rank; saw: ${t.shape[o-1]} vs. ${n}`);if(0===Object(s.sizeFromShape)(e.shape))throw new Error(`Requested more than 0 entries, but input is empty. Input shape: ${e.shape}.`);const r=t.shape,i=r[r.length-1];let a=1;for(let e=0;ee/l)),1].slice(0,i);return[u,a,l,c]}},"./node_modules/@tensorflow/tfjs-core/dist/ops/greater.js": +/*! exports provided: prepareAndValidate */function(e,t,n){"use strict";n.r(t),n.d(t,"prepareAndValidate",(function(){return o}));var s=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js");function o(e,t){const n=e.shape.length,o=t.shape.length;if(n<1)throw new Error(`tf.gatherND() expects the input to be rank 1 or higher, but the rank was ${n}.`);if(o<1)throw new Error(`tf.gatherND() expects the indices to be rank 1 or higher, but the rank was ${o}.`);if("int32"!==t.dtype)throw new Error(`tf.gatherND() expects the indices to be int32 type, but the dtype was ${t.dtype}.`);if(t.shape[o-1]>n)throw new Error(`index innermost dimension length must be <= tensor rank; saw: ${t.shape[o-1]} vs. ${n}`);if(0===Object(s.sizeFromShape)(e.shape))throw new Error(`Requested more than 0 entries, but input is empty. Input shape: ${e.shape}.`);const r=t.shape,i=r[r.length-1];let a=1;for(let e=0;ee/l)),1].slice(0,i);return[d,a,l,c]}},"./node_modules/@tensorflow/tfjs-core/dist/ops/greater.js": /*!****************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/greater.js ***! \****************************************************************/ -/*! exports provided: greater */function(e,t,n){"use strict";n.r(t),n.d(t,"greater",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(d.op)({greater_: +/*! exports provided: greater */function(e,t,n){"use strict";n.r(t),n.d(t,"greater",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(u.op)({greater_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -14023,11 +14024,11 @@ function(e,t){const n=Object(r.convertToTensor)(t,"indices","gatherND","int32"), * limitations under the License. * ============================================================================= */ -function(e,t){let n=Object(i.convertToTensor)(e,"a","greater","string_or_numeric"),d=Object(i.convertToTensor)(t,"b","greater","string_or_numeric");[n,d]=Object(r.makeTypesMatch)(n,d),Object(a.assertAndGetBroadcastShape)(n.shape,d.shape);const u={a:n,b:d};return s.ENGINE.runKernel(o.Greater,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/greater_equal.js": +function(e,t){let n=Object(i.convertToTensor)(e,"a","greater","string_or_numeric"),u=Object(i.convertToTensor)(t,"b","greater","string_or_numeric");[n,u]=Object(r.makeTypesMatch)(n,u),Object(a.assertAndGetBroadcastShape)(n.shape,u.shape);const d={a:n,b:u};return s.ENGINE.runKernel(o.Greater,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/greater_equal.js": /*!**********************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/greater_equal.js ***! \**********************************************************************/ -/*! exports provided: greaterEqual */function(e,t,n){"use strict";n.r(t),n.d(t,"greaterEqual",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(d.op)({greaterEqual_: +/*! exports provided: greaterEqual */function(e,t,n){"use strict";n.r(t),n.d(t,"greaterEqual",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(u.op)({greaterEqual_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -14044,7 +14045,7 @@ function(e,t){let n=Object(i.convertToTensor)(e,"a","greater","string_or_numeric * limitations under the License. * ============================================================================= */ -function(e,t){let n=Object(i.convertToTensor)(e,"a","greaterEqual","string_or_numeric"),d=Object(i.convertToTensor)(t,"b","greaterEqual","string_or_numeric");[n,d]=Object(r.makeTypesMatch)(n,d),Object(a.assertAndGetBroadcastShape)(n.shape,d.shape);const u={a:n,b:d};return s.ENGINE.runKernel(o.GreaterEqual,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/imag.js": +function(e,t){let n=Object(i.convertToTensor)(e,"a","greaterEqual","string_or_numeric"),u=Object(i.convertToTensor)(t,"b","greaterEqual","string_or_numeric");[n,u]=Object(r.makeTypesMatch)(n,u),Object(a.assertAndGetBroadcastShape)(n.shape,u.shape);const d={a:n,b:u};return s.ENGINE.runKernel(o.GreaterEqual,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/imag.js": /*!*************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/imag.js ***! \*************************************************************/ @@ -14069,7 +14070,7 @@ function(e){const t={input:Object(r.convertToTensor)(e,"input","imag")};return s /*!******************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/image/crop_and_resize.js ***! \******************************************************************************/ -/*! exports provided: cropAndResize */function(e,t,n){"use strict";n.r(t),n.d(t,"cropAndResize",(function(){return d}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({cropAndResize_: +/*! exports provided: cropAndResize */function(e,t,n){"use strict";n.r(t),n.d(t,"cropAndResize",(function(){return u}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({cropAndResize_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -14086,11 +14087,11 @@ function(e){const t={input:Object(r.convertToTensor)(e,"input","imag")};return s * limitations under the License. * ============================================================================= */ -function(e,t,n,a,d="bilinear",u=0){const l=Object(r.convertToTensor)(e,"image","cropAndResize"),c=Object(r.convertToTensor)(t,"boxes","cropAndResize","float32"),f=Object(r.convertToTensor)(n,"boxInd","cropAndResize","int32"),p=c.shape[0];i.assert(4===l.rank,(()=>`Error in cropAndResize: image must be rank 4,but got rank ${l.rank}.`)),i.assert(2===c.rank&&4===c.shape[1],(()=>`Error in cropAndResize: boxes must be have size [${p},4] but had shape ${c.shape}.`)),i.assert(1===f.rank&&f.shape[0]===p,(()=>`Error in cropAndResize: boxInd must be have size [${p}] but had shape ${c.shape}.`)),i.assert(2===a.length,(()=>`Error in cropAndResize: cropSize must be of length 2, but got length ${a.length}.`)),i.assert(a[0]>=1&&a[1]>=1,(()=>`cropSize must be atleast [1,1], but was ${a}`)),i.assert("bilinear"===d||"nearest"===d,(()=>`method must be bilinear or nearest, but was ${d}`));const m={image:l,boxes:c,boxInd:f},h={method:d,extrapolationValue:u,cropSize:a};return s.ENGINE.runKernel(o.CropAndResize,m,h)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/flip_left_right.js": +function(e,t,n,a,u="bilinear",d=0){const l=Object(r.convertToTensor)(e,"image","cropAndResize"),c=Object(r.convertToTensor)(t,"boxes","cropAndResize","float32"),f=Object(r.convertToTensor)(n,"boxInd","cropAndResize","int32"),p=c.shape[0];i.assert(4===l.rank,(()=>`Error in cropAndResize: image must be rank 4,but got rank ${l.rank}.`)),i.assert(2===c.rank&&4===c.shape[1],(()=>`Error in cropAndResize: boxes must be have size [${p},4] but had shape ${c.shape}.`)),i.assert(1===f.rank&&f.shape[0]===p,(()=>`Error in cropAndResize: boxInd must be have size [${p}] but had shape ${c.shape}.`)),i.assert(2===a.length,(()=>`Error in cropAndResize: cropSize must be of length 2, but got length ${a.length}.`)),i.assert(a[0]>=1&&a[1]>=1,(()=>`cropSize must be atleast [1,1], but was ${a}`)),i.assert("bilinear"===u||"nearest"===u,(()=>`method must be bilinear or nearest, but was ${u}`));const m={image:l,boxes:c,boxInd:f},h={method:u,extrapolationValue:d,cropSize:a};return s.ENGINE.runKernel(o.CropAndResize,m,h)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/flip_left_right.js": /*!******************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/image/flip_left_right.js ***! \******************************************************************************/ -/*! exports provided: flipLeftRight */function(e,t,n){"use strict";n.r(t),n.d(t,"flipLeftRight",(function(){return d}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({flipLeftRight_: +/*! exports provided: flipLeftRight */function(e,t,n){"use strict";n.r(t),n.d(t,"flipLeftRight",(function(){return u}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({flipLeftRight_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -14111,7 +14112,7 @@ function(e){const t=Object(r.convertToTensor)(e,"image","flipLeftRight","float32 /*!**********************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression.js ***! \**********************************************************************************/ -/*! exports provided: nonMaxSuppression */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppression",(function(){return d}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../nonmax_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/nonmax_util.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({nonMaxSuppression_: +/*! exports provided: nonMaxSuppression */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppression",(function(){return u}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../nonmax_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/nonmax_util.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({nonMaxSuppression_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -14128,7 +14129,7 @@ function(e){const t=Object(r.convertToTensor)(e,"image","flipLeftRight","float32 * limitations under the License. * ============================================================================= */ -function(e,t,n,a=.5,d=Number.NEGATIVE_INFINITY){const u=Object(r.convertToTensor)(e,"boxes","nonMaxSuppression"),l=Object(r.convertToTensor)(t,"scores","nonMaxSuppression"),c=Object(i.nonMaxSuppSanityCheck)(u,l,n,a,d),f={maxOutputSize:n=c.maxOutputSize,iouThreshold:a=c.iouThreshold,scoreThreshold:d=c.scoreThreshold};return s.ENGINE.runKernel(o.NonMaxSuppressionV3,{boxes:u,scores:l},f)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_async.js": +function(e,t,n,a=.5,u=Number.NEGATIVE_INFINITY){const d=Object(r.convertToTensor)(e,"boxes","nonMaxSuppression"),l=Object(r.convertToTensor)(t,"scores","nonMaxSuppression"),c=Object(i.nonMaxSuppSanityCheck)(d,l,n,a,u),f={maxOutputSize:n=c.maxOutputSize,iouThreshold:a=c.iouThreshold,scoreThreshold:u=c.scoreThreshold};return s.ENGINE.runKernel(o.NonMaxSuppressionV3,{boxes:d,scores:l},f)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_async.js": /*!****************************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_async.js ***! \****************************************************************************************/ @@ -14149,11 +14150,11 @@ function(e,t,n,a=.5,d=Number.NEGATIVE_INFINITY){const u=Object(r.convertToTensor * limitations under the License. * ============================================================================= */ -async function(e,t,n,a=.5,d=Number.NEGATIVE_INFINITY){const u=Object(o.convertToTensor)(e,"boxes","nonMaxSuppressionAsync"),l=Object(o.convertToTensor)(t,"scores","nonMaxSuppressionAsync"),c=Object(r.nonMaxSuppSanityCheck)(u,l,n,a,d);n=c.maxOutputSize,a=c.iouThreshold,d=c.scoreThreshold;const f=await Promise.all([u.data(),l.data()]),p=f[0],m=f[1],{selectedIndices:h}=Object(s.nonMaxSuppressionV3Impl)(p,m,n,a,d);return u!==e&&u.dispose(),l!==t&&l.dispose(),Object(i.tensor1d)(h,"int32")}},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_padded.js": +async function(e,t,n,a=.5,u=Number.NEGATIVE_INFINITY){const d=Object(o.convertToTensor)(e,"boxes","nonMaxSuppressionAsync"),l=Object(o.convertToTensor)(t,"scores","nonMaxSuppressionAsync"),c=Object(r.nonMaxSuppSanityCheck)(d,l,n,a,u);n=c.maxOutputSize,a=c.iouThreshold,u=c.scoreThreshold;const f=await Promise.all([d.data(),l.data()]),p=f[0],m=f[1],{selectedIndices:h}=Object(s.nonMaxSuppressionV3Impl)(p,m,n,a,u);return d!==e&&d.dispose(),l!==t&&l.dispose(),Object(i.tensor1d)(h,"int32")}},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_padded.js": /*!*****************************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_padded.js ***! \*****************************************************************************************/ -/*! exports provided: nonMaxSuppressionPadded */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionPadded",(function(){return d}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../nonmax_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/nonmax_util.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({nonMaxSuppressionPadded_: +/*! exports provided: nonMaxSuppressionPadded */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionPadded",(function(){return u}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../nonmax_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/nonmax_util.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({nonMaxSuppressionPadded_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -14170,11 +14171,11 @@ async function(e,t,n,a=.5,d=Number.NEGATIVE_INFINITY){const u=Object(o.convertTo * limitations under the License. * ============================================================================= */ -function(e,t,n,a=.5,d=Number.NEGATIVE_INFINITY,u=!1){const l=Object(r.convertToTensor)(e,"boxes","nonMaxSuppression"),c=Object(r.convertToTensor)(t,"scores","nonMaxSuppression"),f=Object(i.nonMaxSuppSanityCheck)(l,c,n,a,d,null),p={boxes:l,scores:c},m={maxOutputSize:f.maxOutputSize,iouThreshold:f.iouThreshold,scoreThreshold:f.scoreThreshold,padToMaxOutputSize:u},h=s.ENGINE.runKernel(o.NonMaxSuppressionV4,p,m);return{selectedIndices:h[0],validOutputs:h[1]}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_padded_async.js": +function(e,t,n,a=.5,u=Number.NEGATIVE_INFINITY,d=!1){const l=Object(r.convertToTensor)(e,"boxes","nonMaxSuppression"),c=Object(r.convertToTensor)(t,"scores","nonMaxSuppression"),f=Object(i.nonMaxSuppSanityCheck)(l,c,n,a,u,null),p={boxes:l,scores:c},m={maxOutputSize:f.maxOutputSize,iouThreshold:f.iouThreshold,scoreThreshold:f.scoreThreshold,padToMaxOutputSize:d},h=s.ENGINE.runKernel(o.NonMaxSuppressionV4,p,m);return{selectedIndices:h[0],validOutputs:h[1]}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_padded_async.js": /*!***********************************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_padded_async.js ***! \***********************************************************************************************/ -/*! exports provided: nonMaxSuppressionPaddedAsync */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionPaddedAsync",(function(){return d}));var s=n(/*! ../../backends/non_max_suppression_impl */"./node_modules/@tensorflow/tfjs-core/dist/backends/non_max_suppression_impl.js"),o=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),r=n(/*! ../nonmax_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/nonmax_util.js"),i=n(/*! ../scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),a=n(/*! ../tensor1d */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor1d.js");const d= +/*! exports provided: nonMaxSuppressionPaddedAsync */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionPaddedAsync",(function(){return u}));var s=n(/*! ../../backends/non_max_suppression_impl */"./node_modules/@tensorflow/tfjs-core/dist/backends/non_max_suppression_impl.js"),o=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),r=n(/*! ../nonmax_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/nonmax_util.js"),i=n(/*! ../scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),a=n(/*! ../tensor1d */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor1d.js");const u= /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -14191,11 +14192,11 @@ function(e,t,n,a=.5,d=Number.NEGATIVE_INFINITY,u=!1){const l=Object(r.convertToT * limitations under the License. * ============================================================================= */ -async function(e,t,n,d=.5,u=Number.NEGATIVE_INFINITY,l=!1){const c=Object(o.convertToTensor)(e,"boxes","nonMaxSuppressionAsync"),f=Object(o.convertToTensor)(t,"scores","nonMaxSuppressionAsync"),p=Object(r.nonMaxSuppSanityCheck)(c,f,n,d,u,null),m=p.maxOutputSize,h=p.iouThreshold,b=p.scoreThreshold,[j,g]=await Promise.all([c.data(),f.data()]),{selectedIndices:w,validOutputs:_}=Object(s.nonMaxSuppressionV4Impl)(j,g,m,h,b,l);return c!==e&&c.dispose(),f!==t&&f.dispose(),{selectedIndices:Object(a.tensor1d)(w,"int32"),validOutputs:Object(i.scalar)(_,"int32")}}},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_with_score.js": +async function(e,t,n,u=.5,d=Number.NEGATIVE_INFINITY,l=!1){const c=Object(o.convertToTensor)(e,"boxes","nonMaxSuppressionAsync"),f=Object(o.convertToTensor)(t,"scores","nonMaxSuppressionAsync"),p=Object(r.nonMaxSuppSanityCheck)(c,f,n,u,d,null),m=p.maxOutputSize,h=p.iouThreshold,b=p.scoreThreshold,[j,g]=await Promise.all([c.data(),f.data()]),{selectedIndices:w,validOutputs:_}=Object(s.nonMaxSuppressionV4Impl)(j,g,m,h,b,l);return c!==e&&c.dispose(),f!==t&&f.dispose(),{selectedIndices:Object(a.tensor1d)(w,"int32"),validOutputs:Object(i.scalar)(_,"int32")}}},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_with_score.js": /*!*********************************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_with_score.js ***! \*********************************************************************************************/ -/*! exports provided: nonMaxSuppressionWithScore */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionWithScore",(function(){return d}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../nonmax_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/nonmax_util.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({nonMaxSuppressionWithScore_: +/*! exports provided: nonMaxSuppressionWithScore */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionWithScore",(function(){return u}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../nonmax_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/nonmax_util.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({nonMaxSuppressionWithScore_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -14212,7 +14213,7 @@ async function(e,t,n,d=.5,u=Number.NEGATIVE_INFINITY,l=!1){const c=Object(o.conv * limitations under the License. * ============================================================================= */ -function(e,t,n,a=.5,d=Number.NEGATIVE_INFINITY,u=0){const l=Object(r.convertToTensor)(e,"boxes","nonMaxSuppression"),c=Object(r.convertToTensor)(t,"scores","nonMaxSuppression"),f=Object(i.nonMaxSuppSanityCheck)(l,c,n,a,d,u),p={boxes:l,scores:c},m={maxOutputSize:n=f.maxOutputSize,iouThreshold:a=f.iouThreshold,scoreThreshold:d=f.scoreThreshold,softNmsSigma:u=f.softNmsSigma},h=s.ENGINE.runKernel(o.NonMaxSuppressionV5,p,m);return{selectedIndices:h[0],selectedScores:h[1]}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_with_score_async.js": +function(e,t,n,a=.5,u=Number.NEGATIVE_INFINITY,d=0){const l=Object(r.convertToTensor)(e,"boxes","nonMaxSuppression"),c=Object(r.convertToTensor)(t,"scores","nonMaxSuppression"),f=Object(i.nonMaxSuppSanityCheck)(l,c,n,a,u,d),p={boxes:l,scores:c},m={maxOutputSize:n=f.maxOutputSize,iouThreshold:a=f.iouThreshold,scoreThreshold:u=f.scoreThreshold,softNmsSigma:d=f.softNmsSigma},h=s.ENGINE.runKernel(o.NonMaxSuppressionV5,p,m);return{selectedIndices:h[0],selectedScores:h[1]}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_with_score_async.js": /*!***************************************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_with_score_async.js ***! \***************************************************************************************************/ @@ -14233,11 +14234,11 @@ function(e,t,n,a=.5,d=Number.NEGATIVE_INFINITY,u=0){const l=Object(r.convertToTe * limitations under the License. * ============================================================================= */ -async function(e,t,n,a=.5,d=Number.NEGATIVE_INFINITY,u=0){const l=Object(o.convertToTensor)(e,"boxes","nonMaxSuppressionAsync"),c=Object(o.convertToTensor)(t,"scores","nonMaxSuppressionAsync"),f=Object(r.nonMaxSuppSanityCheck)(l,c,n,a,d,u);n=f.maxOutputSize,a=f.iouThreshold,d=f.scoreThreshold,u=f.softNmsSigma;const p=await Promise.all([l.data(),c.data()]),m=p[0],h=p[1],{selectedIndices:b,selectedScores:j}=Object(s.nonMaxSuppressionV5Impl)(m,h,n,a,d,u);return l!==e&&l.dispose(),c!==t&&c.dispose(),{selectedIndices:Object(i.tensor1d)(b,"int32"),selectedScores:Object(i.tensor1d)(j)}}},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/resize_bilinear.js": +async function(e,t,n,a=.5,u=Number.NEGATIVE_INFINITY,d=0){const l=Object(o.convertToTensor)(e,"boxes","nonMaxSuppressionAsync"),c=Object(o.convertToTensor)(t,"scores","nonMaxSuppressionAsync"),f=Object(r.nonMaxSuppSanityCheck)(l,c,n,a,u,d);n=f.maxOutputSize,a=f.iouThreshold,u=f.scoreThreshold,d=f.softNmsSigma;const p=await Promise.all([l.data(),c.data()]),m=p[0],h=p[1],{selectedIndices:b,selectedScores:j}=Object(s.nonMaxSuppressionV5Impl)(m,h,n,a,u,d);return l!==e&&l.dispose(),c!==t&&c.dispose(),{selectedIndices:Object(i.tensor1d)(b,"int32"),selectedScores:Object(i.tensor1d)(j)}}},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/resize_bilinear.js": /*!******************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/image/resize_bilinear.js ***! \******************************************************************************/ -/*! exports provided: resizeBilinear */function(e,t,n){"use strict";n.r(t),n.d(t,"resizeBilinear",(function(){return u}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),d=n(/*! ../reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const u=Object(a.op)({resizeBilinear_: +/*! exports provided: resizeBilinear */function(e,t,n){"use strict";n.r(t),n.d(t,"resizeBilinear",(function(){return d}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ../reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const d=Object(a.op)({resizeBilinear_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -14254,11 +14255,11 @@ async function(e,t,n,a=.5,d=Number.NEGATIVE_INFINITY,u=0){const l=Object(o.conve * limitations under the License. * ============================================================================= */ -function(e,t,n=!1,a=!1){const u=Object(r.convertToTensor)(e,"images","resizeBilinear");i.assert(3===u.rank||4===u.rank,(()=>`Error in resizeBilinear: x must be rank 3 or 4, but got rank ${u.rank}.`)),i.assert(2===t.length,(()=>`Error in resizeBilinear: new shape must 2D, but got shape ${t}.`)),i.assert(!1===a||!1===n,(()=>"Error in resizeBilinear: If halfPixelCenters is true, alignCorners must be false."));let l=u,c=!1;3===u.rank&&(c=!0,l=Object(d.reshape)(u,[1,u.shape[0],u.shape[1],u.shape[2]]));const[]=t,f={images:l},p={alignCorners:n,halfPixelCenters:a,size:t},m=s.ENGINE.runKernel(o.ResizeBilinear,f,p);return c?Object(d.reshape)(m,[m.shape[1],m.shape[2],m.shape[3]]):m}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/resize_nearest_neighbor.js": +function(e,t,n=!1,a=!1){const d=Object(r.convertToTensor)(e,"images","resizeBilinear");i.assert(3===d.rank||4===d.rank,(()=>`Error in resizeBilinear: x must be rank 3 or 4, but got rank ${d.rank}.`)),i.assert(2===t.length,(()=>`Error in resizeBilinear: new shape must 2D, but got shape ${t}.`)),i.assert(!1===a||!1===n,(()=>"Error in resizeBilinear: If halfPixelCenters is true, alignCorners must be false."));let l=d,c=!1;3===d.rank&&(c=!0,l=Object(u.reshape)(d,[1,d.shape[0],d.shape[1],d.shape[2]]));const[]=t,f={images:l},p={alignCorners:n,halfPixelCenters:a,size:t},m=s.ENGINE.runKernel(o.ResizeBilinear,f,p);return c?Object(u.reshape)(m,[m.shape[1],m.shape[2],m.shape[3]]):m}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/resize_nearest_neighbor.js": /*!**************************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/image/resize_nearest_neighbor.js ***! \**************************************************************************************/ -/*! exports provided: resizeNearestNeighbor */function(e,t,n){"use strict";n.r(t),n.d(t,"resizeNearestNeighbor",(function(){return u}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),d=n(/*! ../reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const u=Object(a.op)({resizeNearestNeighbor_: +/*! exports provided: resizeNearestNeighbor */function(e,t,n){"use strict";n.r(t),n.d(t,"resizeNearestNeighbor",(function(){return d}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ../reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const d=Object(a.op)({resizeNearestNeighbor_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -14275,11 +14276,11 @@ function(e,t,n=!1,a=!1){const u=Object(r.convertToTensor)(e,"images","resizeBili * limitations under the License. * ============================================================================= */ -function(e,t,n=!1,a=!1){const u=Object(r.convertToTensor)(e,"images","resizeNearestNeighbor");i.assert(3===u.rank||4===u.rank,(()=>`Error in resizeNearestNeighbor: x must be rank 3 or 4, but got rank ${u.rank}.`)),i.assert(2===t.length,(()=>`Error in resizeNearestNeighbor: new shape must 2D, but got shape ${t}.`)),i.assert("float32"===u.dtype||"int32"===u.dtype,(()=>"`images` must have `int32` or `float32` as dtype")),i.assert(!1===a||!1===n,(()=>"Error in resizeNearestNeighbor: If halfPixelCenters is true, alignCorners must be false."));let l=u,c=!1;3===u.rank&&(c=!0,l=Object(d.reshape)(u,[1,u.shape[0],u.shape[1],u.shape[2]]));const[]=t,f={images:l},p={alignCorners:n,halfPixelCenters:a,size:t},m=s.ENGINE.runKernel(o.ResizeNearestNeighbor,f,p);return c?Object(d.reshape)(m,[m.shape[1],m.shape[2],m.shape[3]]):m}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/rotate_with_offset.js": +function(e,t,n=!1,a=!1){const d=Object(r.convertToTensor)(e,"images","resizeNearestNeighbor");i.assert(3===d.rank||4===d.rank,(()=>`Error in resizeNearestNeighbor: x must be rank 3 or 4, but got rank ${d.rank}.`)),i.assert(2===t.length,(()=>`Error in resizeNearestNeighbor: new shape must 2D, but got shape ${t}.`)),i.assert("float32"===d.dtype||"int32"===d.dtype,(()=>"`images` must have `int32` or `float32` as dtype")),i.assert(!1===a||!1===n,(()=>"Error in resizeNearestNeighbor: If halfPixelCenters is true, alignCorners must be false."));let l=d,c=!1;3===d.rank&&(c=!0,l=Object(u.reshape)(d,[1,d.shape[0],d.shape[1],d.shape[2]]));const[]=t,f={images:l},p={alignCorners:n,halfPixelCenters:a,size:t},m=s.ENGINE.runKernel(o.ResizeNearestNeighbor,f,p);return c?Object(u.reshape)(m,[m.shape[1],m.shape[2],m.shape[3]]):m}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/rotate_with_offset.js": /*!*********************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/image/rotate_with_offset.js ***! \*********************************************************************************/ -/*! exports provided: rotateWithOffset */function(e,t,n){"use strict";n.r(t),n.d(t,"rotateWithOffset",(function(){return d}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({rotateWithOffset_: +/*! exports provided: rotateWithOffset */function(e,t,n){"use strict";n.r(t),n.d(t,"rotateWithOffset",(function(){return u}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({rotateWithOffset_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -14296,11 +14297,11 @@ function(e,t,n=!1,a=!1){const u=Object(r.convertToTensor)(e,"images","resizeNear * limitations under the License. * ============================================================================= */ -function(e,t,n=0,a=.5){const d=Object(r.convertToTensor)(e,"image","rotateWithOffset","float32");i.assert(4===d.rank,(()=>`Error in rotateWithOffset: image must be rank 4,but got rank ${d.rank}.`));const u={image:d},l={radians:t,fillValue:n,center:a};return s.ENGINE.runKernel(o.RotateWithOffset,u,l)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/threshold.js": +function(e,t,n=0,a=.5){const u=Object(r.convertToTensor)(e,"image","rotateWithOffset","float32");i.assert(4===u.rank,(()=>`Error in rotateWithOffset: image must be rank 4,but got rank ${u.rank}.`));const d={image:u},l={radians:t,fillValue:n,center:a};return s.ENGINE.runKernel(o.RotateWithOffset,d,l)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/threshold.js": /*!************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/image/threshold.js ***! \************************************************************************/ -/*! exports provided: threshold */function(e,t,n){"use strict";n.r(t),n.d(t,"threshold",(function(){return x}));var s=n(/*! ../tensor1d */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor1d.js"),o=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),r=n(/*! ../cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),i=n(/*! ../split */"./node_modules/@tensorflow/tfjs-core/dist/ops/split.js"),a=n(/*! ../bincount */"./node_modules/@tensorflow/tfjs-core/dist/ops/bincount.js"),d=n(/*! ../less_equal */"./node_modules/@tensorflow/tfjs-core/dist/ops/less_equal.js"),u=n(/*! ../greater */"./node_modules/@tensorflow/tfjs-core/dist/ops/greater.js"),l=n(/*! ../sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js"),c=n(/*! ../add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),f=n(/*! ../mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),p=n(/*! ../div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),m=n(/*! ../sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),h=n(/*! ../round */"./node_modules/@tensorflow/tfjs-core/dist/ops/round.js"),b=n(/*! ../where */"./node_modules/@tensorflow/tfjs-core/dist/ops/where.js"),j=n(/*! ../fill */"./node_modules/@tensorflow/tfjs-core/dist/ops/fill.js"),g=n(/*! ../slice */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice.js"),w=n(/*! ../range */"./node_modules/@tensorflow/tfjs-core/dist/ops/range.js"),_=n(/*! ../tensor */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor.js"),k=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),v=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js");const x=Object(o.op)({threshold_: +/*! exports provided: threshold */function(e,t,n){"use strict";n.r(t),n.d(t,"threshold",(function(){return x}));var s=n(/*! ../tensor1d */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor1d.js"),o=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),r=n(/*! ../cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),i=n(/*! ../split */"./node_modules/@tensorflow/tfjs-core/dist/ops/split.js"),a=n(/*! ../bincount */"./node_modules/@tensorflow/tfjs-core/dist/ops/bincount.js"),u=n(/*! ../less_equal */"./node_modules/@tensorflow/tfjs-core/dist/ops/less_equal.js"),d=n(/*! ../greater */"./node_modules/@tensorflow/tfjs-core/dist/ops/greater.js"),l=n(/*! ../sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js"),c=n(/*! ../add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),f=n(/*! ../mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),p=n(/*! ../div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),m=n(/*! ../sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),h=n(/*! ../round */"./node_modules/@tensorflow/tfjs-core/dist/ops/round.js"),b=n(/*! ../where */"./node_modules/@tensorflow/tfjs-core/dist/ops/where.js"),j=n(/*! ../fill */"./node_modules/@tensorflow/tfjs-core/dist/ops/fill.js"),g=n(/*! ../slice */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice.js"),w=n(/*! ../range */"./node_modules/@tensorflow/tfjs-core/dist/ops/range.js"),_=n(/*! ../tensor */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor.js"),k=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),v=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js");const x=Object(o.op)({threshold_: /** * @license * Copyright 2021 Google LLC. All Rights Reserved. @@ -14317,11 +14318,11 @@ function(e,t,n=0,a=.5){const d=Object(r.convertToTensor)(e,"image","rotateWithOf * limitations under the License. * ============================================================================= */ -function(e,t="binary",n=!1,o=.5){const x=Object(v.convertToTensor)(e,"image","threshold"),y=x.shape[0]*x.shape[1];let O,I,C,S,T=Object(f.mul)(Object(s.tensor1d)([o]),255);if(k.assert(3===x.rank,(()=>`Error in threshold: image must be rank 3,but got rank ${x.rank}.`)),k.assert(3===x.shape[2]||1===x.shape[2],(()=>`Error in threshold: image color channel must be equal to 3 or 1but got ${x.shape[2]}.`)),k.assert("int32"===x.dtype||"float32"===x.dtype,(()=>`Error in dtype: image dtype must be int32 or float32,but got dtype ${x.dtype}.`)),k.assert("otsu"===t||"binary"===t,(()=>`Method must be binary or otsu, but was ${t}`)),3===x.shape[2]){[O,I,C]=Object(i.split)(x,[1,1,1],-1);const e=Object(f.mul)(O,.2989),t=Object(f.mul)(I,.587),n=Object(f.mul)(C,.114);S=Object(c.add)(Object(c.add)(e,t),n)}else S=e;if("otsu"===t){T=function(e,t){let n,o,r,i,a,d,h=Object(s.tensor1d)([-1]),_=Object(s.tensor1d)([0]),k=Object(s.tensor1d)([0]);for(let v=0;v`Error in threshold: image must be rank 3,but got rank ${x.rank}.`)),k.assert(3===x.shape[2]||1===x.shape[2],(()=>`Error in threshold: image color channel must be equal to 3 or 1but got ${x.shape[2]}.`)),k.assert("int32"===x.dtype||"float32"===x.dtype,(()=>`Error in dtype: image dtype must be int32 or float32,but got dtype ${x.dtype}.`)),k.assert("otsu"===t||"binary"===t,(()=>`Method must be binary or otsu, but was ${t}`)),3===x.shape[2]){[O,I,C]=Object(i.split)(x,[1,1,1],-1);const e=Object(f.mul)(O,.2989),t=Object(f.mul)(I,.587),n=Object(f.mul)(C,.114);S=Object(c.add)(Object(c.add)(e,t),n)}else S=e;if("otsu"===t){T=function(e,t){let n,o,r,i,a,u,h=Object(s.tensor1d)([-1]),_=Object(s.tensor1d)([0]),k=Object(s.tensor1d)([0]);for(let v=0;v`Error in transform: image must be rank 4,but got rank ${l.rank}.`)),i.assert(2===c.rank&&(c.shape[0]===l.shape[0]||1===c.shape[0])&&8===c.shape[1],(()=>"Error in transform: Input transform should be batch x 8 or 1 x 8")),i.assert(null==u||2===u.length,(()=>`Error in transform: outputShape must be [height, width] or null, but got ${u}.`));const f={image:l,transforms:c},p={interpolation:n,fillMode:a,fillValue:d,outputShape:u};return s.ENGINE.runKernel(o.Transform,f,p)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/in_top_k.js": +function(e,t,n="nearest",a="constant",u=0,d){const l=Object(r.convertToTensor)(e,"image","transform","float32"),c=Object(r.convertToTensor)(t,"transforms","transform","float32");i.assert(4===l.rank,(()=>`Error in transform: image must be rank 4,but got rank ${l.rank}.`)),i.assert(2===c.rank&&(c.shape[0]===l.shape[0]||1===c.shape[0])&&8===c.shape[1],(()=>"Error in transform: Input transform should be batch x 8 or 1 x 8")),i.assert(null==d||2===d.length,(()=>`Error in transform: outputShape must be [height, width] or null, but got ${d}.`));const f={image:l,transforms:c},p={interpolation:n,fillMode:a,fillValue:u,outputShape:d};return s.ENGINE.runKernel(o.Transform,f,p)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/in_top_k.js": /*!*****************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/in_top_k.js ***! \*****************************************************************/ @@ -14359,7 +14360,7 @@ function(e,t,n="nearest",a="constant",d=0,u){const l=Object(r.convertToTensor)(e * limitations under the License. * ============================================================================= */ -async function(e,t,n=1){const i=Object(s.convertToTensor)(e,"predictions","inTopK"),a=Object(s.convertToTensor)(t,"targets","inTopK");Object(o.assert)(i.rank>1,(()=>`inTopK() expects the predictions to be of rank 2 or higher, but got ${i.rank}`)),Object(o.assert)(i.rank-1===a.rank,(()=>`predictions rank should be 1 larger than targets rank, but got predictions rank ${i.rank} and targets rank ${a.rank}`)),Object(o.assertShapesMatch)(i.shape.slice(0,i.shape.length-1),a.shape,"predictions's shape should be align with the targets' shape, except the last dimension.");const d=i.shape[i.shape.length-1];Object(o.assert)(n>0&&n<=d,(()=>`'k' passed to inTopK() must be > 0 && <= the predictions last dimension (${d}), but got ${n}`));const u=await i.data(),l=await a.data(),[c,f]=[u.length/d,d],p=Object(o.getTypedArrayFromDType)("bool",c);for(let e=0;et.value-e.value)),p[e]=0;for(let t=0;t1,(()=>`inTopK() expects the predictions to be of rank 2 or higher, but got ${i.rank}`)),Object(o.assert)(i.rank-1===a.rank,(()=>`predictions rank should be 1 larger than targets rank, but got predictions rank ${i.rank} and targets rank ${a.rank}`)),Object(o.assertShapesMatch)(i.shape.slice(0,i.shape.length-1),a.shape,"predictions's shape should be align with the targets' shape, except the last dimension.");const u=i.shape[i.shape.length-1];Object(o.assert)(n>0&&n<=u,(()=>`'k' passed to inTopK() must be > 0 && <= the predictions last dimension (${u}), but got ${n}`));const d=await i.data(),l=await a.data(),[c,f]=[d.length/u,u],p=Object(o.getTypedArrayFromDType)("bool",c);for(let e=0;et.value-e.value)),p[e]=0;for(let t=0;t`bandPart(): numLower must be an integer, got ${t}.`)),Object(o.assert)(n%1==0,(()=>`bandPart(): numUpper must be an integer, got ${n}.`));const d=Object(s.convertToTensor)(e,"a","bandPart");Object(o.assert)(d.rank>=2,(()=>`bandPart(): Rank must be at least 2, got ${d.rank}.`));const j=d.shape,[g,w]=d.shape.slice(-2);if(!(t<=g))throw new Error(`bandPart(): numLower (${t}) must not be greater than the number of rows (${g}).`);if(!(n<=w))throw new Error(`bandPart(): numUpper (${n}) must not be greater than the number of columns (${w}).`);t<0&&(t=g),n<0&&(n=w);const _=Object(l.reshape)(Object(u.range)(0,g,1,"int32"),[-1,1]),k=Object(u.range)(0,w,1,"int32"),v=Object(p.sub)(_,k),x=Object(a.logicalAnd)(Object(i.lessEqual)(v,Object(c.scalar)(+t,"int32")),Object(r.greaterEqual)(v,Object(c.scalar)(-n,"int32"))),y=Object(b.zeros)([g,w],d.dtype);return Object(l.reshape)(Object(f.stack)(Object(m.unstack)(Object(l.reshape)(d,[-1,g,w])).map((e=>Object(h.where)(x,e,y)))),j)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/linalg/gram_schmidt.js": +function(e,t,n){Object(o.assert)(t%1==0,(()=>`bandPart(): numLower must be an integer, got ${t}.`)),Object(o.assert)(n%1==0,(()=>`bandPart(): numUpper must be an integer, got ${n}.`));const u=Object(s.convertToTensor)(e,"a","bandPart");Object(o.assert)(u.rank>=2,(()=>`bandPart(): Rank must be at least 2, got ${u.rank}.`));const j=u.shape,[g,w]=u.shape.slice(-2);if(!(t<=g))throw new Error(`bandPart(): numLower (${t}) must not be greater than the number of rows (${g}).`);if(!(n<=w))throw new Error(`bandPart(): numUpper (${n}) must not be greater than the number of columns (${w}).`);t<0&&(t=g),n<0&&(n=w);const _=Object(l.reshape)(Object(d.range)(0,g,1,"int32"),[-1,1]),k=Object(d.range)(0,w,1,"int32"),v=Object(p.sub)(_,k),x=Object(a.logicalAnd)(Object(i.lessEqual)(v,Object(c.scalar)(+t,"int32")),Object(r.greaterEqual)(v,Object(c.scalar)(-n,"int32"))),y=Object(b.zeros)([g,w],u.dtype);return Object(l.reshape)(Object(f.stack)(Object(m.unstack)(Object(l.reshape)(u,[-1,g,w])).map((e=>Object(h.where)(x,e,y)))),j)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/linalg/gram_schmidt.js": /*!****************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/linalg/gram_schmidt.js ***! \****************************************************************************/ -/*! exports provided: gramSchmidt */function(e,t,n){"use strict";n.r(t),n.d(t,"gramSchmidt",(function(){return m}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ../div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),i=n(/*! ../mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),a=n(/*! ../norm */"./node_modules/@tensorflow/tfjs-core/dist/ops/norm.js"),d=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ../split */"./node_modules/@tensorflow/tfjs-core/dist/ops/split.js"),l=n(/*! ../squeeze */"./node_modules/@tensorflow/tfjs-core/dist/ops/squeeze.js"),c=n(/*! ../stack */"./node_modules/@tensorflow/tfjs-core/dist/ops/stack.js"),f=n(/*! ../sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),p=n(/*! ../sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js");const m=Object(d.op)({gramSchmidt_: +/*! exports provided: gramSchmidt */function(e,t,n){"use strict";n.r(t),n.d(t,"gramSchmidt",(function(){return m}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ../div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),i=n(/*! ../mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),a=n(/*! ../norm */"./node_modules/@tensorflow/tfjs-core/dist/ops/norm.js"),u=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),d=n(/*! ../split */"./node_modules/@tensorflow/tfjs-core/dist/ops/split.js"),l=n(/*! ../squeeze */"./node_modules/@tensorflow/tfjs-core/dist/ops/squeeze.js"),c=n(/*! ../stack */"./node_modules/@tensorflow/tfjs-core/dist/ops/stack.js"),f=n(/*! ../sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),p=n(/*! ../sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js");const m=Object(u.op)({gramSchmidt_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -14527,11 +14528,11 @@ function(e,t,n){Object(o.assert)(t%1==0,(()=>`bandPart(): numLower must be an in * limitations under the License. * ============================================================================= */ -function(e){let t;if(Array.isArray(e)){t=!1,Object(o.assert)(null!=e&&e.length>0,(()=>"Gram-Schmidt process: input must not be null, undefined, or empty"));const n=e[0].shape[0];for(let t=1;t`Gram-Schmidt: Non-unique lengths found in the input vectors: (${e[t].shape[0]} vs. ${n})`))}else t=!0,e=Object(u.split)(e,e.shape[0],0).map((e=>Object(l.squeeze)(e,[0])));Object(o.assert)(e.length<=e[0].shape[0],(()=>`Gram-Schmidt: Number of vectors (${e.length}) exceeds number of dimensions (${e[0].shape[0]}).`));const n=[],d=e;for(let t=0;t{let e=d[t];if(t>0)for(let s=0;s0,(()=>"Gram-Schmidt process: input must not be null, undefined, or empty"));const n=e[0].shape[0];for(let t=1;t`Gram-Schmidt: Non-unique lengths found in the input vectors: (${e[t].shape[0]} vs. ${n})`))}else t=!0,e=Object(d.split)(e,e.shape[0],0).map((e=>Object(l.squeeze)(e,[0])));Object(o.assert)(e.length<=e[0].shape[0],(()=>`Gram-Schmidt: Number of vectors (${e.length}) exceeds number of dimensions (${e[0].shape[0]}).`));const n=[],u=e;for(let t=0;t{let e=u[t];if(t>0)for(let s=0;s{Object(r.assert)(2===e.shape.length,(()=>`qr2d() requires a 2D Tensor, but got a ${e.shape.length}D Tensor.`));const n=e.shape[0],h=e.shape[1];let b=Object(u.eye)(n),g=Object(i.clone)(e);const v=Object(_.tensor2d)([[1]],[1,1]);let y=Object(i.clone)(v);const O=n>=h?h:n;for(let e=0;e{const t=Object(j.slice)(g,[e,e],[n-e,1]),s=Object(m.norm)(t),o=Object(j.slice)(g,[e,e],[1,1]),r=Object(x.where)(Object(l.greater)(o,0),Object(_.tensor2d)([[-1]]),Object(_.tensor2d)([[1]])),u=Object(w.sub)(o,Object(f.mul)(r,s)),O=Object(d.div)(t,u);y=1===O.shape[0]?Object(i.clone)(v):Object(a.concat)([v,Object(j.slice)(O,[1,0],[O.shape[0]-1,O.shape[1]])],0);const I=Object(p.neg)(Object(d.div)(Object(c.matMul)(r,u),s)),C=Object(j.slice)(g,[e,0],[n-e,h]),S=Object(f.mul)(I,y),T=Object(k.transpose)(y);if(0===e)g=Object(w.sub)(C,Object(c.matMul)(S,Object(c.matMul)(T,C)));else{const t=Object(w.sub)(C,Object(c.matMul)(S,Object(c.matMul)(T,C)));g=Object(a.concat)([Object(j.slice)(g,[0,0],[e,h]),t],0)}const N=Object(k.transpose)(S),E=Object(j.slice)(b,[0,e],[n,b.shape[1]-e]);if(0===e)b=Object(w.sub)(E,Object(c.matMul)(Object(c.matMul)(E,y),N));else{const t=Object(w.sub)(E,Object(c.matMul)(Object(c.matMul)(E,y),N));b=Object(a.concat)([Object(j.slice)(b,[0,0],[n,e]),t],1)}return[y,g,b]})),Object(o.dispose)([t,r,u])}return!t&&n>h&&(b=Object(j.slice)(b,[0,0],[n,h]),g=Object(j.slice)(g,[0,0],[h,h])),[b,g]}))}const O=Object(h.op)({qr_: +/*! exports provided: qr */function(e,t,n){"use strict";n.r(t),n.d(t,"qr",(function(){return O}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../globals */"./node_modules/@tensorflow/tfjs-core/dist/globals.js"),r=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),i=n(/*! ../clone */"./node_modules/@tensorflow/tfjs-core/dist/ops/clone.js"),a=n(/*! ../concat */"./node_modules/@tensorflow/tfjs-core/dist/ops/concat.js"),u=n(/*! ../div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),d=n(/*! ../eye */"./node_modules/@tensorflow/tfjs-core/dist/ops/eye.js"),l=n(/*! ../greater */"./node_modules/@tensorflow/tfjs-core/dist/ops/greater.js"),c=n(/*! ../mat_mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mat_mul.js"),f=n(/*! ../mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),p=n(/*! ../neg */"./node_modules/@tensorflow/tfjs-core/dist/ops/neg.js"),m=n(/*! ../norm */"./node_modules/@tensorflow/tfjs-core/dist/ops/norm.js"),h=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),b=n(/*! ../reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),j=n(/*! ../slice */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice.js"),g=n(/*! ../stack */"./node_modules/@tensorflow/tfjs-core/dist/ops/stack.js"),w=n(/*! ../sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),_=n(/*! ../tensor2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor2d.js"),k=n(/*! ../transpose */"./node_modules/@tensorflow/tfjs-core/dist/ops/transpose.js"),v=n(/*! ../unstack */"./node_modules/@tensorflow/tfjs-core/dist/ops/unstack.js"),x=n(/*! ../where */"./node_modules/@tensorflow/tfjs-core/dist/ops/where.js");function y(e,t=!1){return s.ENGINE.tidy((()=>{Object(r.assert)(2===e.shape.length,(()=>`qr2d() requires a 2D Tensor, but got a ${e.shape.length}D Tensor.`));const n=e.shape[0],h=e.shape[1];let b=Object(d.eye)(n),g=Object(i.clone)(e);const v=Object(_.tensor2d)([[1]],[1,1]);let y=Object(i.clone)(v);const O=n>=h?h:n;for(let e=0;e{const t=Object(j.slice)(g,[e,e],[n-e,1]),s=Object(m.norm)(t),o=Object(j.slice)(g,[e,e],[1,1]),r=Object(x.where)(Object(l.greater)(o,0),Object(_.tensor2d)([[-1]]),Object(_.tensor2d)([[1]])),d=Object(w.sub)(o,Object(f.mul)(r,s)),O=Object(u.div)(t,d);y=1===O.shape[0]?Object(i.clone)(v):Object(a.concat)([v,Object(j.slice)(O,[1,0],[O.shape[0]-1,O.shape[1]])],0);const I=Object(p.neg)(Object(u.div)(Object(c.matMul)(r,d),s)),C=Object(j.slice)(g,[e,0],[n-e,h]),S=Object(f.mul)(I,y),T=Object(k.transpose)(y);if(0===e)g=Object(w.sub)(C,Object(c.matMul)(S,Object(c.matMul)(T,C)));else{const t=Object(w.sub)(C,Object(c.matMul)(S,Object(c.matMul)(T,C)));g=Object(a.concat)([Object(j.slice)(g,[0,0],[e,h]),t],0)}const N=Object(k.transpose)(S),E=Object(j.slice)(b,[0,e],[n,b.shape[1]-e]);if(0===e)b=Object(w.sub)(E,Object(c.matMul)(Object(c.matMul)(E,y),N));else{const t=Object(w.sub)(E,Object(c.matMul)(Object(c.matMul)(E,y),N));b=Object(a.concat)([Object(j.slice)(b,[0,0],[n,e]),t],1)}return[y,g,b]})),Object(o.dispose)([t,r,d])}return!t&&n>h&&(b=Object(j.slice)(b,[0,0],[n,h]),g=Object(j.slice)(g,[0,0],[h,h])),[b,g]}))}const O=Object(h.op)({qr_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -14573,7 +14574,7 @@ function r(e,t,n){if(n<=0)throw new Error("The number of values should be positi /*!*************************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/local_response_normalization.js ***! \*************************************************************************************/ -/*! exports provided: localResponseNormalization */function(e,t,n){"use strict";n.r(t),n.d(t,"localResponseNormalization",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),d=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const u=Object(a.op)({localResponseNormalization_: +/*! exports provided: localResponseNormalization */function(e,t,n){"use strict";n.r(t),n.d(t,"localResponseNormalization",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const d=Object(a.op)({localResponseNormalization_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -14590,7 +14591,7 @@ function r(e,t,n){if(n<=0)throw new Error("The number of values should be positi * limitations under the License. * ============================================================================= */ -function(e,t=5,n=1,a=1,u=.5){const l=Object(r.convertToTensor)(e,"x","localResponseNormalization");i.assert(4===l.rank||3===l.rank,(()=>`Error in localResponseNormalization: x must be rank 3 or 4 but got\n rank ${l.rank}.`)),i.assert(i.isInt(t),(()=>`Error in localResponseNormalization: depthRadius must be an integer but got depthRadius ${t}.`));let c=l,f=!1;3===l.rank&&(f=!0,c=Object(d.reshape)(l,[1,l.shape[0],l.shape[1],l.shape[2]]));const p={x:c},m={depthRadius:t,bias:n,alpha:a,beta:u},h=s.ENGINE.runKernel(o.LRN,p,m);return f?Object(d.reshape)(h,[h.shape[1],h.shape[2],h.shape[3]]):h}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/log.js": +function(e,t=5,n=1,a=1,d=.5){const l=Object(r.convertToTensor)(e,"x","localResponseNormalization");i.assert(4===l.rank||3===l.rank,(()=>`Error in localResponseNormalization: x must be rank 3 or 4 but got\n rank ${l.rank}.`)),i.assert(i.isInt(t),(()=>`Error in localResponseNormalization: depthRadius must be an integer but got depthRadius ${t}.`));let c=l,f=!1;3===l.rank&&(f=!0,c=Object(u.reshape)(l,[1,l.shape[0],l.shape[1],l.shape[2]]));const p={x:c},m={depthRadius:t,bias:n,alpha:a,beta:d},h=s.ENGINE.runKernel(o.LRN,p,m);return f?Object(u.reshape)(h,[h.shape[1],h.shape[2],h.shape[3]]):h}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/log.js": /*!************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/log.js ***! \************************************************************/ @@ -14636,7 +14637,7 @@ function(e){const t={x:Object(r.convertToTensor)(e,"x","log1p")};return s.ENGINE /*!********************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/log_sigmoid.js ***! \********************************************************************/ -/*! exports provided: logSigmoid */function(e,t,n){"use strict";n.r(t),n.d(t,"logSigmoid",(function(){return l}));var s=n(/*! ../gradients */"./node_modules/@tensorflow/tfjs-core/dist/gradients.js"),o=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),r=n(/*! ./mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),i=n(/*! ./neg */"./node_modules/@tensorflow/tfjs-core/dist/ops/neg.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),d=n(/*! ./sigmoid */"./node_modules/@tensorflow/tfjs-core/dist/ops/sigmoid.js"),u=n(/*! ./softplus */"./node_modules/@tensorflow/tfjs-core/dist/ops/softplus.js");const l=Object(a.op)({logSigmoid_: +/*! exports provided: logSigmoid */function(e,t,n){"use strict";n.r(t),n.d(t,"logSigmoid",(function(){return l}));var s=n(/*! ../gradients */"./node_modules/@tensorflow/tfjs-core/dist/gradients.js"),o=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),r=n(/*! ./mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),i=n(/*! ./neg */"./node_modules/@tensorflow/tfjs-core/dist/ops/neg.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ./sigmoid */"./node_modules/@tensorflow/tfjs-core/dist/ops/sigmoid.js"),d=n(/*! ./softplus */"./node_modules/@tensorflow/tfjs-core/dist/ops/softplus.js");const l=Object(a.op)({logSigmoid_: /** * @license * Copyright 2018 Google LLC. All Rights Reserved. @@ -14653,11 +14654,11 @@ function(e){const t={x:Object(r.convertToTensor)(e,"x","log1p")};return s.ENGINE * limitations under the License. * ============================================================================= */ -function(e){const t=Object(o.convertToTensor)(e,"x","logSigmoid");return Object(s.customGrad)((e=>({value:Object(i.neg)(Object(u.softplus)(Object(i.neg)(e))),gradFunc:t=>Object(r.mul)(t,Object(d.sigmoid)(Object(i.neg)(e)))})))(t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/log_softmax.js": +function(e){const t=Object(o.convertToTensor)(e,"x","logSigmoid");return Object(s.customGrad)((e=>({value:Object(i.neg)(Object(d.softplus)(Object(i.neg)(e))),gradFunc:t=>Object(r.mul)(t,Object(u.sigmoid)(Object(i.neg)(e)))})))(t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/log_softmax.js": /*!********************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/log_softmax.js ***! \********************************************************************/ -/*! exports provided: logSoftmax */function(e,t,n){"use strict";n.r(t),n.d(t,"logSoftmax",(function(){return p}));var s=n(/*! ../gradients */"./node_modules/@tensorflow/tfjs-core/dist/gradients.js"),o=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),r=n(/*! ./cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),i=n(/*! ./exp */"./node_modules/@tensorflow/tfjs-core/dist/ops/exp.js"),a=n(/*! ./log */"./node_modules/@tensorflow/tfjs-core/dist/ops/log.js"),d=n(/*! ./max */"./node_modules/@tensorflow/tfjs-core/dist/ops/max.js"),u=n(/*! ./mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),l=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),c=n(/*! ./sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),f=n(/*! ./sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js");const p=Object(l.op)({logSoftmax_: +/*! exports provided: logSoftmax */function(e,t,n){"use strict";n.r(t),n.d(t,"logSoftmax",(function(){return p}));var s=n(/*! ../gradients */"./node_modules/@tensorflow/tfjs-core/dist/gradients.js"),o=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),r=n(/*! ./cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),i=n(/*! ./exp */"./node_modules/@tensorflow/tfjs-core/dist/ops/exp.js"),a=n(/*! ./log */"./node_modules/@tensorflow/tfjs-core/dist/ops/log.js"),u=n(/*! ./max */"./node_modules/@tensorflow/tfjs-core/dist/ops/max.js"),d=n(/*! ./mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),l=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),c=n(/*! ./sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),f=n(/*! ./sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js");const p=Object(l.op)({logSoftmax_: /** * @license * Copyright 2020 Google Inc. All Rights Reserved. @@ -14674,11 +14675,11 @@ function(e){const t=Object(o.convertToTensor)(e,"x","logSigmoid");return Object( * limitations under the License. * ============================================================================= */ -function(e,t=-1){const n=Object(o.convertToTensor)(e,"logits","logSoftmax");if(-1===t&&(t=n.rank-1),t!==n.rank-1)throw Error(`Log Softmax along a non-last dimension is not yet supported. Logits was rank ${n.rank} and axis was ${t}`);return Object(s.customGrad)(((e,n)=>{const s=Object(d.max)(e,t,!0),o=Object(c.sub)(e,s),l=Object(c.sub)(Object(r.cast)(o,"float32"),Object(a.log)(Object(f.sum)(Object(i.exp)(o),t,!0)));n([l]);return{value:l,gradFunc:(e,n)=>{const[s]=n,o=Object(i.exp)(s);return Object(c.sub)(e,Object(u.mul)(Object(f.sum)(e,t,!0),o))}}}))(n)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/log_sum_exp.js": +function(e,t=-1){const n=Object(o.convertToTensor)(e,"logits","logSoftmax");if(-1===t&&(t=n.rank-1),t!==n.rank-1)throw Error(`Log Softmax along a non-last dimension is not yet supported. Logits was rank ${n.rank} and axis was ${t}`);return Object(s.customGrad)(((e,n)=>{const s=Object(u.max)(e,t,!0),o=Object(c.sub)(e,s),l=Object(c.sub)(Object(r.cast)(o,"float32"),Object(a.log)(Object(f.sum)(Object(i.exp)(o),t,!0)));n([l]);return{value:l,gradFunc:(e,n)=>{const[s]=n,o=Object(i.exp)(s);return Object(c.sub)(e,Object(d.mul)(Object(f.sum)(e,t,!0),o))}}}))(n)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/log_sum_exp.js": /*!********************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/log_sum_exp.js ***! \********************************************************************/ -/*! exports provided: logSumExp */function(e,t,n){"use strict";n.r(t),n.d(t,"logSumExp",(function(){return m}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),i=n(/*! ./axis_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/axis_util.js"),a=n(/*! ./exp */"./node_modules/@tensorflow/tfjs-core/dist/ops/exp.js"),d=n(/*! ./log */"./node_modules/@tensorflow/tfjs-core/dist/ops/log.js"),u=n(/*! ./max */"./node_modules/@tensorflow/tfjs-core/dist/ops/max.js"),l=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),c=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),f=n(/*! ./sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),p=n(/*! ./sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js");const m=Object(l.op)({logSumExp_: +/*! exports provided: logSumExp */function(e,t,n){"use strict";n.r(t),n.d(t,"logSumExp",(function(){return m}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),i=n(/*! ./axis_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/axis_util.js"),a=n(/*! ./exp */"./node_modules/@tensorflow/tfjs-core/dist/ops/exp.js"),u=n(/*! ./log */"./node_modules/@tensorflow/tfjs-core/dist/ops/log.js"),d=n(/*! ./max */"./node_modules/@tensorflow/tfjs-core/dist/ops/max.js"),l=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),c=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),f=n(/*! ./sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),p=n(/*! ./sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js");const m=Object(l.op)({logSumExp_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -14695,11 +14696,11 @@ function(e,t=-1){const n=Object(o.convertToTensor)(e,"logits","logSoftmax");if(- * limitations under the License. * ============================================================================= */ -function(e,t=null,n=!1){const l=Object(s.convertToTensor)(e,"x","logSumExp"),m=Object(o.parseAxisParam)(t,l.shape),h=Object(u.max)(l,m,!0),b=Object(f.sub)(l,h),j=Object(a.exp)(b),g=Object(p.sum)(j,m),w=Object(d.log)(g),_=Object(r.add)(Object(c.reshape)(h,w.shape),w);if(n){const e=Object(i.expandShapeToKeepDim)(_.shape,m);return Object(c.reshape)(_,e)}return _}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/logical_and.js": +function(e,t=null,n=!1){const l=Object(s.convertToTensor)(e,"x","logSumExp"),m=Object(o.parseAxisParam)(t,l.shape),h=Object(d.max)(l,m,!0),b=Object(f.sub)(l,h),j=Object(a.exp)(b),g=Object(p.sum)(j,m),w=Object(u.log)(g),_=Object(r.add)(Object(c.reshape)(h,w.shape),w);if(n){const e=Object(i.expandShapeToKeepDim)(_.shape,m);return Object(c.reshape)(_,e)}return _}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/logical_and.js": /*!********************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/logical_and.js ***! \********************************************************************/ -/*! exports provided: logicalAnd */function(e,t,n){"use strict";n.r(t),n.d(t,"logicalAnd",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({logicalAnd_: +/*! exports provided: logicalAnd */function(e,t,n){"use strict";n.r(t),n.d(t,"logicalAnd",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({logicalAnd_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -14716,7 +14717,7 @@ function(e,t=null,n=!1){const l=Object(s.convertToTensor)(e,"x","logSumExp"),m=O * limitations under the License. * ============================================================================= */ -function(e,t){const n=Object(r.convertToTensor)(e,"a","logicalAnd","bool"),a=Object(r.convertToTensor)(t,"b","logicalAnd","bool");Object(i.assertAndGetBroadcastShape)(n.shape,a.shape);const d={a:n,b:a};return s.ENGINE.runKernel(o.LogicalAnd,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/logical_not.js": +function(e,t){const n=Object(r.convertToTensor)(e,"a","logicalAnd","bool"),a=Object(r.convertToTensor)(t,"b","logicalAnd","bool");Object(i.assertAndGetBroadcastShape)(n.shape,a.shape);const u={a:n,b:a};return s.ENGINE.runKernel(o.LogicalAnd,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/logical_not.js": /*!********************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/logical_not.js ***! \********************************************************************/ @@ -14741,7 +14742,7 @@ function(e){const t={x:Object(r.convertToTensor)(e,"x","logicalNot","bool")};ret /*!*******************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/logical_or.js ***! \*******************************************************************/ -/*! exports provided: logicalOr */function(e,t,n){"use strict";n.r(t),n.d(t,"logicalOr",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({logicalOr_: +/*! exports provided: logicalOr */function(e,t,n){"use strict";n.r(t),n.d(t,"logicalOr",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({logicalOr_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -14758,11 +14759,11 @@ function(e){const t={x:Object(r.convertToTensor)(e,"x","logicalNot","bool")};ret * limitations under the License. * ============================================================================= */ -function(e,t){const n=Object(r.convertToTensor)(e,"a","logicalOr","bool"),a=Object(r.convertToTensor)(t,"b","logicalOr","bool");Object(i.assertAndGetBroadcastShape)(n.shape,a.shape);const d={a:n,b:a};return s.ENGINE.runKernel(o.LogicalOr,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/logical_xor.js": +function(e,t){const n=Object(r.convertToTensor)(e,"a","logicalOr","bool"),a=Object(r.convertToTensor)(t,"b","logicalOr","bool");Object(i.assertAndGetBroadcastShape)(n.shape,a.shape);const u={a:n,b:a};return s.ENGINE.runKernel(o.LogicalOr,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/logical_xor.js": /*!********************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/logical_xor.js ***! \********************************************************************/ -/*! exports provided: logicalXor */function(e,t,n){"use strict";n.r(t),n.d(t,"logicalXor",(function(){return u}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),r=n(/*! ./logical_and */"./node_modules/@tensorflow/tfjs-core/dist/ops/logical_and.js"),i=n(/*! ./logical_not */"./node_modules/@tensorflow/tfjs-core/dist/ops/logical_not.js"),a=n(/*! ./logical_or */"./node_modules/@tensorflow/tfjs-core/dist/ops/logical_or.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(d.op)({logicalXor_: +/*! exports provided: logicalXor */function(e,t,n){"use strict";n.r(t),n.d(t,"logicalXor",(function(){return d}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),r=n(/*! ./logical_and */"./node_modules/@tensorflow/tfjs-core/dist/ops/logical_and.js"),i=n(/*! ./logical_not */"./node_modules/@tensorflow/tfjs-core/dist/ops/logical_not.js"),a=n(/*! ./logical_or */"./node_modules/@tensorflow/tfjs-core/dist/ops/logical_or.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(u.op)({logicalXor_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -14779,7 +14780,7 @@ function(e,t){const n=Object(r.convertToTensor)(e,"a","logicalOr","bool"),a=Obje * limitations under the License. * ============================================================================= */ -function(e,t){const n=Object(s.convertToTensor)(e,"a","logicalXor","bool"),d=Object(s.convertToTensor)(t,"b","logicalXor","bool");return Object(o.assertAndGetBroadcastShape)(n.shape,d.shape),Object(r.logicalAnd)(Object(a.logicalOr)(e,t),Object(i.logicalNot)(Object(r.logicalAnd)(e,t)))}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js": +function(e,t){const n=Object(s.convertToTensor)(e,"a","logicalXor","bool"),u=Object(s.convertToTensor)(t,"b","logicalXor","bool");return Object(o.assertAndGetBroadcastShape)(n.shape,u.shape),Object(r.logicalAnd)(Object(a.logicalOr)(e,t),Object(i.logicalNot)(Object(r.logicalAnd)(e,t)))}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js": /*!***********************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js ***! \***********************************************************************/ @@ -14804,7 +14805,7 @@ var s;n.r(t),n.d(t,"Reduction",(function(){return s})),function(e){e[e.NONE=0]=" /*!***********************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/losses/absolute_difference.js ***! \***********************************************************************************/ -/*! exports provided: absoluteDifference */function(e,t,n){"use strict";n.r(t),n.d(t,"absoluteDifference",(function(){return l}));var s=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ../abs */"./node_modules/@tensorflow/tfjs-core/dist/ops/abs.js"),i=n(/*! ../loss_ops_utils */"./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),d=n(/*! ../sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),u=n(/*! ./compute_weighted_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js");const l=Object(a.op)({absoluteDifference_: +/*! exports provided: absoluteDifference */function(e,t,n){"use strict";n.r(t),n.d(t,"absoluteDifference",(function(){return l}));var s=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ../abs */"./node_modules/@tensorflow/tfjs-core/dist/ops/abs.js"),i=n(/*! ../loss_ops_utils */"./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ../sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),d=n(/*! ./compute_weighted_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js");const l=Object(a.op)({absoluteDifference_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -14821,23 +14822,23 @@ var s;n.r(t),n.d(t,"Reduction",(function(){return s})),function(e){e[e.NONE=0]=" * limitations under the License. * ============================================================================= */ -function(e,t,n,a=i.Reduction.SUM_BY_NONZERO_WEIGHTS){const l=Object(s.convertToTensor)(e,"labels","absoluteDifference"),c=Object(s.convertToTensor)(t,"predictions","absoluteDifference");let f=null;null!=n&&(f=Object(s.convertToTensor)(n,"weights","absoluteDifference")),Object(o.assertShapesMatch)(l.shape,c.shape,"Error in absoluteDifference: ");const p=Object(r.abs)(Object(d.sub)(l,c));return Object(u.computeWeightedLoss)(p,f,a)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js": +function(e,t,n,a=i.Reduction.SUM_BY_NONZERO_WEIGHTS){const l=Object(s.convertToTensor)(e,"labels","absoluteDifference"),c=Object(s.convertToTensor)(t,"predictions","absoluteDifference");let f=null;null!=n&&(f=Object(s.convertToTensor)(n,"weights","absoluteDifference")),Object(o.assertShapesMatch)(l.shape,c.shape,"Error in absoluteDifference: ");const p=Object(r.abs)(Object(u.sub)(l,c));return Object(d.computeWeightedLoss)(p,f,a)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js": /*!*************************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js ***! \*************************************************************************************/ -/*! exports provided: computeWeightedLoss */function(e,t,n){"use strict";n.r(t),n.d(t,"computeWeightedLoss",(function(){return m}));var s=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),r=n(/*! ../div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),i=n(/*! ../loss_ops_utils */"./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js"),a=n(/*! ../mean */"./node_modules/@tensorflow/tfjs-core/dist/ops/mean.js"),d=n(/*! ../mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),u=n(/*! ../not_equal */"./node_modules/@tensorflow/tfjs-core/dist/ops/not_equal.js"),l=n(/*! ../ones */"./node_modules/@tensorflow/tfjs-core/dist/ops/ones.js"),c=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),f=n(/*! ../scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),p=n(/*! ../sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js");const m=Object(c.op)({computeWeightedLoss_:function(e,t,n=i.Reduction.SUM_BY_NONZERO_WEIGHTS){const c=Object(s.convertToTensor)(e,"losses","computeWeightedLoss");let m=null;null!=t&&(m=Object(s.convertToTensor)(t,"weights","computeWeightedLoss"));const h=null==m?c:Object(d.mul)(c,m);if(n===i.Reduction.NONE)return h;if(n===i.Reduction.SUM)return Object(p.sum)(h);if(n===i.Reduction.MEAN){if(null==m)return Object(a.mean)(h);{const e=c.size/m.size,t=Object(r.div)(Object(p.sum)(h),Object(p.sum)(m));return e>1?Object(r.div)(t,Object(f.scalar)(e)):t}}if(n===i.Reduction.SUM_BY_NONZERO_WEIGHTS){if(null==m)return Object(r.div)(Object(p.sum)(h),Object(f.scalar)(c.size));{const e=Object(d.mul)(m,Object(l.ones)(c.shape)),t=Object(o.cast)(Object(p.sum)(Object(u.notEqual)(e,Object(f.scalar)(0))),"float32");return Object(r.div)(Object(p.sum)(h),t)}}throw Error(`Unknown reduction: ${n}`)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/cosine_distance.js": +/*! exports provided: computeWeightedLoss */function(e,t,n){"use strict";n.r(t),n.d(t,"computeWeightedLoss",(function(){return m}));var s=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),r=n(/*! ../div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),i=n(/*! ../loss_ops_utils */"./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js"),a=n(/*! ../mean */"./node_modules/@tensorflow/tfjs-core/dist/ops/mean.js"),u=n(/*! ../mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),d=n(/*! ../not_equal */"./node_modules/@tensorflow/tfjs-core/dist/ops/not_equal.js"),l=n(/*! ../ones */"./node_modules/@tensorflow/tfjs-core/dist/ops/ones.js"),c=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),f=n(/*! ../scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),p=n(/*! ../sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js");const m=Object(c.op)({computeWeightedLoss_:function(e,t,n=i.Reduction.SUM_BY_NONZERO_WEIGHTS){const c=Object(s.convertToTensor)(e,"losses","computeWeightedLoss");let m=null;null!=t&&(m=Object(s.convertToTensor)(t,"weights","computeWeightedLoss"));const h=null==m?c:Object(u.mul)(c,m);if(n===i.Reduction.NONE)return h;if(n===i.Reduction.SUM)return Object(p.sum)(h);if(n===i.Reduction.MEAN){if(null==m)return Object(a.mean)(h);{const e=c.size/m.size,t=Object(r.div)(Object(p.sum)(h),Object(p.sum)(m));return e>1?Object(r.div)(t,Object(f.scalar)(e)):t}}if(n===i.Reduction.SUM_BY_NONZERO_WEIGHTS){if(null==m)return Object(r.div)(Object(p.sum)(h),Object(f.scalar)(c.size));{const e=Object(u.mul)(m,Object(l.ones)(c.shape)),t=Object(o.cast)(Object(p.sum)(Object(d.notEqual)(e,Object(f.scalar)(0))),"float32");return Object(r.div)(Object(p.sum)(h),t)}}throw Error(`Unknown reduction: ${n}`)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/cosine_distance.js": /*!*******************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/losses/cosine_distance.js ***! \*******************************************************************************/ -/*! exports provided: cosineDistance */function(e,t,n){"use strict";n.r(t),n.d(t,"cosineDistance",(function(){return f}));var s=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ../loss_ops_utils */"./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js"),i=n(/*! ../mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),d=n(/*! ../scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),u=n(/*! ../sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),l=n(/*! ../sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js"),c=n(/*! ./compute_weighted_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js");const f=Object(a.op)({cosineDistance_:function(e,t,n,a,f=r.Reduction.SUM_BY_NONZERO_WEIGHTS){const p=Object(s.convertToTensor)(e,"labels","cosineDistance"),m=Object(s.convertToTensor)(t,"predictions","cosineDistance");let h=null;null!=a&&(h=Object(s.convertToTensor)(a,"weights","cosineDistance")),Object(o.assertShapesMatch)(p.shape,m.shape,"Error in cosineDistance: ");const b=Object(d.scalar)(1),j=Object(u.sub)(b,Object(l.sum)(Object(i.mul)(p,m),n,!0));return Object(c.computeWeightedLoss)(j,h,f)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/hinge_loss.js": +/*! exports provided: cosineDistance */function(e,t,n){"use strict";n.r(t),n.d(t,"cosineDistance",(function(){return f}));var s=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ../loss_ops_utils */"./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js"),i=n(/*! ../mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ../scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),d=n(/*! ../sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),l=n(/*! ../sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js"),c=n(/*! ./compute_weighted_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js");const f=Object(a.op)({cosineDistance_:function(e,t,n,a,f=r.Reduction.SUM_BY_NONZERO_WEIGHTS){const p=Object(s.convertToTensor)(e,"labels","cosineDistance"),m=Object(s.convertToTensor)(t,"predictions","cosineDistance");let h=null;null!=a&&(h=Object(s.convertToTensor)(a,"weights","cosineDistance")),Object(o.assertShapesMatch)(p.shape,m.shape,"Error in cosineDistance: ");const b=Object(u.scalar)(1),j=Object(d.sub)(b,Object(l.sum)(Object(i.mul)(p,m),n,!0));return Object(c.computeWeightedLoss)(j,h,f)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/hinge_loss.js": /*!**************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/losses/hinge_loss.js ***! \**************************************************************************/ -/*! exports provided: hingeLoss */function(e,t,n){"use strict";n.r(t),n.d(t,"hingeLoss",(function(){return f}));var s=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ../loss_ops_utils */"./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js"),i=n(/*! ../mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),d=n(/*! ../relu */"./node_modules/@tensorflow/tfjs-core/dist/ops/relu.js"),u=n(/*! ../scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),l=n(/*! ../sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),c=n(/*! ./compute_weighted_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js");const f=Object(a.op)({hingeLoss_:function(e,t,n,a=r.Reduction.SUM_BY_NONZERO_WEIGHTS){let f=Object(s.convertToTensor)(e,"labels","hingeLoss");const p=Object(s.convertToTensor)(t,"predictions","hingeLoss");let m=null;null!=n&&(m=Object(s.convertToTensor)(n,"weights","hingeLoss")),Object(o.assertShapesMatch)(f.shape,p.shape,"Error in hingeLoss: ");const h=Object(u.scalar)(1);f=Object(l.sub)(Object(i.mul)(Object(u.scalar)(2),f),h);const b=Object(d.relu)(Object(l.sub)(h,Object(i.mul)(f,p)));return Object(c.computeWeightedLoss)(b,m,a)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/huber_loss.js": +/*! exports provided: hingeLoss */function(e,t,n){"use strict";n.r(t),n.d(t,"hingeLoss",(function(){return f}));var s=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ../loss_ops_utils */"./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js"),i=n(/*! ../mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ../relu */"./node_modules/@tensorflow/tfjs-core/dist/ops/relu.js"),d=n(/*! ../scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),l=n(/*! ../sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),c=n(/*! ./compute_weighted_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js");const f=Object(a.op)({hingeLoss_:function(e,t,n,a=r.Reduction.SUM_BY_NONZERO_WEIGHTS){let f=Object(s.convertToTensor)(e,"labels","hingeLoss");const p=Object(s.convertToTensor)(t,"predictions","hingeLoss");let m=null;null!=n&&(m=Object(s.convertToTensor)(n,"weights","hingeLoss")),Object(o.assertShapesMatch)(f.shape,p.shape,"Error in hingeLoss: ");const h=Object(d.scalar)(1);f=Object(l.sub)(Object(i.mul)(Object(d.scalar)(2),f),h);const b=Object(u.relu)(Object(l.sub)(h,Object(i.mul)(f,p)));return Object(c.computeWeightedLoss)(b,m,a)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/huber_loss.js": /*!**************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/losses/huber_loss.js ***! \**************************************************************************/ -/*! exports provided: huberLoss */function(e,t,n){"use strict";n.r(t),n.d(t,"huberLoss",(function(){return h}));var s=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ../abs */"./node_modules/@tensorflow/tfjs-core/dist/ops/abs.js"),i=n(/*! ../add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),a=n(/*! ../loss_ops_utils */"./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js"),d=n(/*! ../minimum */"./node_modules/@tensorflow/tfjs-core/dist/ops/minimum.js"),u=n(/*! ../mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),l=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),c=n(/*! ../scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),f=n(/*! ../square */"./node_modules/@tensorflow/tfjs-core/dist/ops/square.js"),p=n(/*! ../sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),m=n(/*! ./compute_weighted_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js");const h=Object(l.op)({huberLoss_: +/*! exports provided: huberLoss */function(e,t,n){"use strict";n.r(t),n.d(t,"huberLoss",(function(){return h}));var s=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ../abs */"./node_modules/@tensorflow/tfjs-core/dist/ops/abs.js"),i=n(/*! ../add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),a=n(/*! ../loss_ops_utils */"./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js"),u=n(/*! ../minimum */"./node_modules/@tensorflow/tfjs-core/dist/ops/minimum.js"),d=n(/*! ../mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),l=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),c=n(/*! ../scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),f=n(/*! ../square */"./node_modules/@tensorflow/tfjs-core/dist/ops/square.js"),p=n(/*! ../sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),m=n(/*! ./compute_weighted_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js");const h=Object(l.op)({huberLoss_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -14854,11 +14855,11 @@ function(e,t,n,a=i.Reduction.SUM_BY_NONZERO_WEIGHTS){const l=Object(s.convertToT * limitations under the License. * ============================================================================= */ -function(e,t,n,l=1,h=a.Reduction.SUM_BY_NONZERO_WEIGHTS){const b=Object(s.convertToTensor)(e,"labels","huberLoss"),j=Object(s.convertToTensor)(t,"predictions","huberLoss");let g=null;null!=n&&(g=Object(s.convertToTensor)(n,"weights","huberLoss")),Object(o.assertShapesMatch)(b.shape,j.shape,"Error in huberLoss: ");const w=Object(c.scalar)(l),_=Object(r.abs)(Object(p.sub)(j,b)),k=Object(d.minimum)(_,w),v=Object(p.sub)(_,k),x=Object(i.add)(Object(u.mul)(Object(c.scalar)(.5),Object(f.square)(k)),Object(u.mul)(w,v));return Object(m.computeWeightedLoss)(x,g,h)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/log_loss.js": +function(e,t,n,l=1,h=a.Reduction.SUM_BY_NONZERO_WEIGHTS){const b=Object(s.convertToTensor)(e,"labels","huberLoss"),j=Object(s.convertToTensor)(t,"predictions","huberLoss");let g=null;null!=n&&(g=Object(s.convertToTensor)(n,"weights","huberLoss")),Object(o.assertShapesMatch)(b.shape,j.shape,"Error in huberLoss: ");const w=Object(c.scalar)(l),_=Object(r.abs)(Object(p.sub)(j,b)),k=Object(u.minimum)(_,w),v=Object(p.sub)(_,k),x=Object(i.add)(Object(d.mul)(Object(c.scalar)(.5),Object(f.square)(k)),Object(d.mul)(w,v));return Object(m.computeWeightedLoss)(x,g,h)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/log_loss.js": /*!************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/losses/log_loss.js ***! \************************************************************************/ -/*! exports provided: logLoss */function(e,t,n){"use strict";n.r(t),n.d(t,"logLoss",(function(){return m}));var s=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ../add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),i=n(/*! ../log */"./node_modules/@tensorflow/tfjs-core/dist/ops/log.js"),a=n(/*! ../loss_ops_utils */"./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js"),d=n(/*! ../mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),u=n(/*! ../neg */"./node_modules/@tensorflow/tfjs-core/dist/ops/neg.js"),l=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),c=n(/*! ../scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),f=n(/*! ../sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),p=n(/*! ./compute_weighted_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js");const m=Object(l.op)({logLoss_: +/*! exports provided: logLoss */function(e,t,n){"use strict";n.r(t),n.d(t,"logLoss",(function(){return m}));var s=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ../add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),i=n(/*! ../log */"./node_modules/@tensorflow/tfjs-core/dist/ops/log.js"),a=n(/*! ../loss_ops_utils */"./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js"),u=n(/*! ../mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),d=n(/*! ../neg */"./node_modules/@tensorflow/tfjs-core/dist/ops/neg.js"),l=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),c=n(/*! ../scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),f=n(/*! ../sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),p=n(/*! ./compute_weighted_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js");const m=Object(l.op)({logLoss_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -14875,11 +14876,11 @@ function(e,t,n,l=1,h=a.Reduction.SUM_BY_NONZERO_WEIGHTS){const b=Object(s.conver * limitations under the License. * ============================================================================= */ -function(e,t,n,l=1e-7,m=a.Reduction.SUM_BY_NONZERO_WEIGHTS){const h=Object(s.convertToTensor)(e,"labels","logLoss"),b=Object(s.convertToTensor)(t,"predictions","logLoss");let j=null;null!=n&&(j=Object(s.convertToTensor)(n,"weights","logLoss")),Object(o.assertShapesMatch)(h.shape,b.shape,"Error in logLoss: ");const g=Object(c.scalar)(1),w=Object(c.scalar)(l),_=Object(u.neg)(Object(d.mul)(h,Object(i.log)(Object(r.add)(b,w)))),k=Object(d.mul)(Object(f.sub)(g,h),Object(i.log)(Object(r.add)(Object(f.sub)(g,b),w))),v=Object(f.sub)(_,k);return Object(p.computeWeightedLoss)(v,j,m)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/mean_squared_error.js": +function(e,t,n,l=1e-7,m=a.Reduction.SUM_BY_NONZERO_WEIGHTS){const h=Object(s.convertToTensor)(e,"labels","logLoss"),b=Object(s.convertToTensor)(t,"predictions","logLoss");let j=null;null!=n&&(j=Object(s.convertToTensor)(n,"weights","logLoss")),Object(o.assertShapesMatch)(h.shape,b.shape,"Error in logLoss: ");const g=Object(c.scalar)(1),w=Object(c.scalar)(l),_=Object(d.neg)(Object(u.mul)(h,Object(i.log)(Object(r.add)(b,w)))),k=Object(u.mul)(Object(f.sub)(g,h),Object(i.log)(Object(r.add)(Object(f.sub)(g,b),w))),v=Object(f.sub)(_,k);return Object(p.computeWeightedLoss)(v,j,m)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/mean_squared_error.js": /*!**********************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/losses/mean_squared_error.js ***! \**********************************************************************************/ -/*! exports provided: meanSquaredError */function(e,t,n){"use strict";n.r(t),n.d(t,"meanSquaredError",(function(){return u}));var s=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ../loss_ops_utils */"./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js"),i=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),a=n(/*! ../squared_difference */"./node_modules/@tensorflow/tfjs-core/dist/ops/squared_difference.js"),d=n(/*! ./compute_weighted_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js");const u=Object(i.op)({meanSquaredError_: +/*! exports provided: meanSquaredError */function(e,t,n){"use strict";n.r(t),n.d(t,"meanSquaredError",(function(){return d}));var s=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ../loss_ops_utils */"./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js"),i=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),a=n(/*! ../squared_difference */"./node_modules/@tensorflow/tfjs-core/dist/ops/squared_difference.js"),u=n(/*! ./compute_weighted_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js");const d=Object(i.op)({meanSquaredError_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -14896,11 +14897,11 @@ function(e,t,n,l=1e-7,m=a.Reduction.SUM_BY_NONZERO_WEIGHTS){const h=Object(s.con * limitations under the License. * ============================================================================= */ -function(e,t,n,i=r.Reduction.SUM_BY_NONZERO_WEIGHTS){const u=Object(s.convertToTensor)(e,"labels","meanSquaredError"),l=Object(s.convertToTensor)(t,"predictions","meanSquaredError");let c=null;null!=n&&(c=Object(s.convertToTensor)(n,"weights","meanSquaredError")),Object(o.assertShapesMatch)(u.shape,l.shape,"Error in meanSquaredError: ");const f=Object(a.squaredDifference)(u,l);return Object(d.computeWeightedLoss)(f,c,i)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/sigmoid_cross_entropy.js": +function(e,t,n,i=r.Reduction.SUM_BY_NONZERO_WEIGHTS){const d=Object(s.convertToTensor)(e,"labels","meanSquaredError"),l=Object(s.convertToTensor)(t,"predictions","meanSquaredError");let c=null;null!=n&&(c=Object(s.convertToTensor)(n,"weights","meanSquaredError")),Object(o.assertShapesMatch)(d.shape,l.shape,"Error in meanSquaredError: ");const f=Object(a.squaredDifference)(d,l);return Object(u.computeWeightedLoss)(f,c,i)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/sigmoid_cross_entropy.js": /*!*************************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/losses/sigmoid_cross_entropy.js ***! \*************************************************************************************/ -/*! exports provided: sigmoidCrossEntropy */function(e,t,n){"use strict";n.r(t),n.d(t,"sigmoidCrossEntropy",(function(){return j}));var s=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ../abs */"./node_modules/@tensorflow/tfjs-core/dist/ops/abs.js"),i=n(/*! ../add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),a=n(/*! ../exp */"./node_modules/@tensorflow/tfjs-core/dist/ops/exp.js"),d=n(/*! ../log1p */"./node_modules/@tensorflow/tfjs-core/dist/ops/log1p.js"),u=n(/*! ../loss_ops_utils */"./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js"),l=n(/*! ../mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),c=n(/*! ../neg */"./node_modules/@tensorflow/tfjs-core/dist/ops/neg.js"),f=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),p=n(/*! ../relu */"./node_modules/@tensorflow/tfjs-core/dist/ops/relu.js"),m=n(/*! ../scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),h=n(/*! ../sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),b=n(/*! ./compute_weighted_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js");const j=Object(f.op)({sigmoidCrossEntropy_:function(e,t,n,f=0,j=u.Reduction.SUM_BY_NONZERO_WEIGHTS){let g=Object(s.convertToTensor)(e,"multiClassLabels","sigmoidCrossEntropy");const w=Object(s.convertToTensor)(t,"logits","sigmoidCrossEntropy");let _=null;if(null!=n&&(_=Object(s.convertToTensor)(n,"weights","sigmoidCrossEntropy")),Object(o.assertShapesMatch)(g.shape,w.shape,"Error in sigmoidCrossEntropy: "),f>0){const e=Object(m.scalar)(f),t=Object(m.scalar)(1),n=Object(m.scalar)(.5);g=Object(i.add)(Object(l.mul)(g,Object(h.sub)(t,e)),Object(l.mul)(n,e))}const k= +/*! exports provided: sigmoidCrossEntropy */function(e,t,n){"use strict";n.r(t),n.d(t,"sigmoidCrossEntropy",(function(){return j}));var s=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ../abs */"./node_modules/@tensorflow/tfjs-core/dist/ops/abs.js"),i=n(/*! ../add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),a=n(/*! ../exp */"./node_modules/@tensorflow/tfjs-core/dist/ops/exp.js"),u=n(/*! ../log1p */"./node_modules/@tensorflow/tfjs-core/dist/ops/log1p.js"),d=n(/*! ../loss_ops_utils */"./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js"),l=n(/*! ../mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),c=n(/*! ../neg */"./node_modules/@tensorflow/tfjs-core/dist/ops/neg.js"),f=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),p=n(/*! ../relu */"./node_modules/@tensorflow/tfjs-core/dist/ops/relu.js"),m=n(/*! ../scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),h=n(/*! ../sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),b=n(/*! ./compute_weighted_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js");const j=Object(f.op)({sigmoidCrossEntropy_:function(e,t,n,f=0,j=d.Reduction.SUM_BY_NONZERO_WEIGHTS){let g=Object(s.convertToTensor)(e,"multiClassLabels","sigmoidCrossEntropy");const w=Object(s.convertToTensor)(t,"logits","sigmoidCrossEntropy");let _=null;if(null!=n&&(_=Object(s.convertToTensor)(n,"weights","sigmoidCrossEntropy")),Object(o.assertShapesMatch)(g.shape,w.shape,"Error in sigmoidCrossEntropy: "),f>0){const e=Object(m.scalar)(f),t=Object(m.scalar)(1),n=Object(m.scalar)(.5);g=Object(i.add)(Object(l.mul)(g,Object(h.sub)(t,e)),Object(l.mul)(n,e))}const k= /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -14917,11 +14918,11 @@ function(e,t,n,i=r.Reduction.SUM_BY_NONZERO_WEIGHTS){const u=Object(s.convertToT * limitations under the License. * ============================================================================= */ -function(e,t){const n=Object(s.convertToTensor)(e,"labels","sigmoidCrossEntropyWithLogits"),u=Object(s.convertToTensor)(t,"logits","sigmoidCrossEntropyWithLogits");Object(o.assertShapesMatch)(n.shape,u.shape,"Error in sigmoidCrossEntropyWithLogits: ");const f=Object(p.relu)(u),m=Object(l.mul)(u,n),b=Object(d.log1p)(Object(a.exp)(Object(c.neg)(Object(r.abs)(u))));return Object(i.add)(Object(h.sub)(f,m),b)}(g,w);return Object(b.computeWeightedLoss)(k,_,j)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/softmax_cross_entropy.js": +function(e,t){const n=Object(s.convertToTensor)(e,"labels","sigmoidCrossEntropyWithLogits"),d=Object(s.convertToTensor)(t,"logits","sigmoidCrossEntropyWithLogits");Object(o.assertShapesMatch)(n.shape,d.shape,"Error in sigmoidCrossEntropyWithLogits: ");const f=Object(p.relu)(d),m=Object(l.mul)(d,n),b=Object(u.log1p)(Object(a.exp)(Object(c.neg)(Object(r.abs)(d))));return Object(i.add)(Object(h.sub)(f,m),b)}(g,w);return Object(b.computeWeightedLoss)(k,_,j)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/softmax_cross_entropy.js": /*!*************************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/losses/softmax_cross_entropy.js ***! \*************************************************************************************/ -/*! exports provided: softmaxCrossEntropy */function(e,t,n){"use strict";n.r(t),n.d(t,"softmaxCrossEntropy",(function(){return k}));var s=n(/*! ../../gradients */"./node_modules/@tensorflow/tfjs-core/dist/gradients.js"),o=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),r=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),i=n(/*! ../add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),a=n(/*! ../axis_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/axis_util.js"),d=n(/*! ../cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),u=n(/*! ../div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),l=n(/*! ../exp */"./node_modules/@tensorflow/tfjs-core/dist/ops/exp.js"),c=n(/*! ../log_sum_exp */"./node_modules/@tensorflow/tfjs-core/dist/ops/log_sum_exp.js"),f=n(/*! ../loss_ops_utils */"./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js"),p=n(/*! ../mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),m=n(/*! ../neg */"./node_modules/@tensorflow/tfjs-core/dist/ops/neg.js"),h=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),b=n(/*! ../reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),j=n(/*! ../scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),g=n(/*! ../sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),w=n(/*! ../sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js"),_=n(/*! ./compute_weighted_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js");const k=Object(h.op)({softmaxCrossEntropy_:function(e,t,n,h=0,k=f.Reduction.SUM_BY_NONZERO_WEIGHTS){let v=Object(o.convertToTensor)(e,"onehotLabels","softmaxCrossEntropy");const x=Object(o.convertToTensor)(t,"logits","softmaxCrossEntropy");let y=null;if(null!=n&&(y=Object(o.convertToTensor)(n,"weights","softmaxCrossEntropy")),Object(r.assertShapesMatch)(v.shape,x.shape,"Error in softmaxCrossEntropy: "),h>0){const e=Object(j.scalar)(h),t=Object(j.scalar)(1),n=Object(j.scalar)(v.shape[1]);v=Object(i.add)(Object(p.mul)(v,Object(g.sub)(t,e)),Object(u.div)(e,n))}const O= +/*! exports provided: softmaxCrossEntropy */function(e,t,n){"use strict";n.r(t),n.d(t,"softmaxCrossEntropy",(function(){return k}));var s=n(/*! ../../gradients */"./node_modules/@tensorflow/tfjs-core/dist/gradients.js"),o=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),r=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),i=n(/*! ../add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),a=n(/*! ../axis_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/axis_util.js"),u=n(/*! ../cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),d=n(/*! ../div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),l=n(/*! ../exp */"./node_modules/@tensorflow/tfjs-core/dist/ops/exp.js"),c=n(/*! ../log_sum_exp */"./node_modules/@tensorflow/tfjs-core/dist/ops/log_sum_exp.js"),f=n(/*! ../loss_ops_utils */"./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js"),p=n(/*! ../mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),m=n(/*! ../neg */"./node_modules/@tensorflow/tfjs-core/dist/ops/neg.js"),h=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),b=n(/*! ../reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),j=n(/*! ../scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),g=n(/*! ../sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),w=n(/*! ../sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js"),_=n(/*! ./compute_weighted_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js");const k=Object(h.op)({softmaxCrossEntropy_:function(e,t,n,h=0,k=f.Reduction.SUM_BY_NONZERO_WEIGHTS){let v=Object(o.convertToTensor)(e,"onehotLabels","softmaxCrossEntropy");const x=Object(o.convertToTensor)(t,"logits","softmaxCrossEntropy");let y=null;if(null!=n&&(y=Object(o.convertToTensor)(n,"weights","softmaxCrossEntropy")),Object(r.assertShapesMatch)(v.shape,x.shape,"Error in softmaxCrossEntropy: "),h>0){const e=Object(j.scalar)(h),t=Object(j.scalar)(1),n=Object(j.scalar)(v.shape[1]);v=Object(i.add)(Object(p.mul)(v,Object(g.sub)(t,e)),Object(d.div)(e,n))}const O= /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -14938,11 +14939,11 @@ function(e,t){const n=Object(s.convertToTensor)(e,"labels","sigmoidCrossEntropyW * limitations under the License. * ============================================================================= */ -function(e,t,n=-1){if(-1===n&&(n=t.rank-1),n!==t.rank-1)throw Error(`Softmax cross entropy along a non-last dimension is not yet supported. Labels / logits was rank ${t.rank} and dim was ${n}`);return Object(s.customGrad)(((e,t,s)=>{const o=Object(c.logSumExp)(t,[n],!0),r=Object(g.sub)(Object(d.cast)(t,"float32"),o);s([e,r]);const i=Object(m.neg)(Object(p.mul)(r,e));return{value:Object(w.sum)(i,[n]),gradFunc:(e,t)=>{const[s,o]=t,r=Object(a.expandShapeToKeepDim)(e.shape,[n]);return[Object(p.mul)(Object(b.reshape)(e,r),Object(g.sub)(Object(d.cast)(s,"float32"),Object(l.exp)(o))),Object(p.mul)(Object(b.reshape)(e,r),Object(g.sub)(Object(l.exp)(o),Object(d.cast)(s,"float32")))]}}}))(e,t)}(v,x);return Object(_.computeWeightedLoss)(O,y,k)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/mat_mul.js": +function(e,t,n=-1){if(-1===n&&(n=t.rank-1),n!==t.rank-1)throw Error(`Softmax cross entropy along a non-last dimension is not yet supported. Labels / logits was rank ${t.rank} and dim was ${n}`);return Object(s.customGrad)(((e,t,s)=>{const o=Object(c.logSumExp)(t,[n],!0),r=Object(g.sub)(Object(u.cast)(t,"float32"),o);s([e,r]);const i=Object(m.neg)(Object(p.mul)(r,e));return{value:Object(w.sum)(i,[n]),gradFunc:(e,t)=>{const[s,o]=t,r=Object(a.expandShapeToKeepDim)(e.shape,[n]);return[Object(p.mul)(Object(b.reshape)(e,r),Object(g.sub)(Object(u.cast)(s,"float32"),Object(l.exp)(o))),Object(p.mul)(Object(b.reshape)(e,r),Object(g.sub)(Object(l.exp)(o),Object(u.cast)(s,"float32")))]}}}))(e,t)}(v,x);return Object(_.computeWeightedLoss)(O,y,k)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/mat_mul.js": /*!****************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/mat_mul.js ***! \****************************************************************/ -/*! exports provided: matMul */function(e,t,n){"use strict";n.r(t),n.d(t,"matMul",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({matMul_: +/*! exports provided: matMul */function(e,t,n){"use strict";n.r(t),n.d(t,"matMul",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({matMul_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -14959,7 +14960,7 @@ function(e,t,n=-1){if(-1===n&&(n=t.rank-1),n!==t.rank-1)throw Error(`Softmax cro * limitations under the License. * ============================================================================= */ -function(e,t,n=!1,a=!1){let d=Object(i.convertToTensor)(e,"a","matMul"),u=Object(i.convertToTensor)(t,"b","matMul");[d,u]=Object(r.makeTypesMatch)(d,u);const l={a:d,b:u},c={transposeA:n,transposeB:a};return s.ENGINE.runKernel(o.BatchMatMul,l,c)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/max.js": +function(e,t,n=!1,a=!1){let u=Object(i.convertToTensor)(e,"a","matMul"),d=Object(i.convertToTensor)(t,"b","matMul");[u,d]=Object(r.makeTypesMatch)(u,d);const l={a:u,b:d},c={transposeA:n,transposeB:a};return s.ENGINE.runKernel(o.BatchMatMul,l,c)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/max.js": /*!************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/max.js ***! \************************************************************/ @@ -14984,7 +14985,7 @@ function(e,t=null,n=!1){const i={x:Object(r.convertToTensor)(e,"x","max")},a={re /*!*****************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/max_pool.js ***! \*****************************************************************/ -/*! exports provided: maxPool */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPool",(function(){return l}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./conv_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const l=Object(d.op)({maxPool_: +/*! exports provided: maxPool */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPool",(function(){return l}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./conv_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),d=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const l=Object(u.op)({maxPool_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -15001,11 +15002,11 @@ function(e,t=null,n=!1){const i={x:Object(r.convertToTensor)(e,"x","max")},a={re * limitations under the License. * ============================================================================= */ -function(e,t,n,d,l){const c=Object(r.convertToTensor)(e,"x","maxPool");let f=c,p=!1;3===c.rank&&(p=!0,f=Object(u.reshape)(c,[1,c.shape[0],c.shape[1],c.shape[2]])),i.assert(4===f.rank,(()=>`Error in maxPool: input must be rank 4 but got rank ${f.rank}.`)),i.assert(a.eitherStridesOrDilationsAreOne(n,1),(()=>`Error in maxPool: Either strides or dilations must be 1. Got strides ${n} and dilations '1'`)),null!=l&&i.assert(i.isInt(d),(()=>`Error in maxPool: pad must be an integer when using, dimRoundingMode ${l} but got pad ${d}.`));const m={x:f},h={filterSize:t,strides:n,pad:d,dimRoundingMode:l},b=s.ENGINE.runKernel(o.MaxPool,m,h);return p?Object(u.reshape)(b,[b.shape[1],b.shape[2],b.shape[3]]):b}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/max_pool_3d.js": +function(e,t,n,u,l){const c=Object(r.convertToTensor)(e,"x","maxPool");let f=c,p=!1;3===c.rank&&(p=!0,f=Object(d.reshape)(c,[1,c.shape[0],c.shape[1],c.shape[2]])),i.assert(4===f.rank,(()=>`Error in maxPool: input must be rank 4 but got rank ${f.rank}.`)),i.assert(a.eitherStridesOrDilationsAreOne(n,1),(()=>`Error in maxPool: Either strides or dilations must be 1. Got strides ${n} and dilations '1'`)),null!=l&&i.assert(i.isInt(u),(()=>`Error in maxPool: pad must be an integer when using, dimRoundingMode ${l} but got pad ${u}.`));const m={x:f},h={filterSize:t,strides:n,pad:u,dimRoundingMode:l},b=s.ENGINE.runKernel(o.MaxPool,m,h);return p?Object(d.reshape)(b,[b.shape[1],b.shape[2],b.shape[3]]):b}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/max_pool_3d.js": /*!********************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/max_pool_3d.js ***! \********************************************************************/ -/*! exports provided: maxPool3d */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPool3d",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),d=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const u=Object(a.op)({maxPool3d_: +/*! exports provided: maxPool3d */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPool3d",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const d=Object(a.op)({maxPool3d_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -15022,7 +15023,7 @@ function(e,t,n,d,l){const c=Object(r.convertToTensor)(e,"x","maxPool");let f=c,p * limitations under the License. * ============================================================================= */ -function(e,t=[1,1,1],n,a,u,l="NDHWC"){const c=Object(r.convertToTensor)(e,"x","maxPool3d");let f=c,p=!1;4===c.rank&&(p=!0,f=Object(d.reshape)(c,[1,c.shape[0],c.shape[1],c.shape[2],c.shape[3]])),i.assert(5===f.rank,(()=>`Error in maxPool3d: x must be rank 5 but got rank ${f.rank}.`)),i.assert("NDHWC"===l,(()=>`Error in maxPool3d: Only NDHWC is currently supported, but got dataFormat of ${l}`)),null!=u&&i.assert(i.isInt(a),(()=>`Error in maxPool3d: pad must be an integer when using, dimRoundingMode ${u} but got pad ${a}.`));const m={x:f},h={filterSize:t,strides:n,pad:a,dimRoundingMode:u,dataFormat:l},b=s.ENGINE.runKernel(o.MaxPool3D,m,h);return p?Object(d.reshape)(b,[b.shape[1],b.shape[2],b.shape[3],b.shape[4]]):b}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/max_pool_with_argmax.js": +function(e,t=[1,1,1],n,a,d,l="NDHWC"){const c=Object(r.convertToTensor)(e,"x","maxPool3d");let f=c,p=!1;4===c.rank&&(p=!0,f=Object(u.reshape)(c,[1,c.shape[0],c.shape[1],c.shape[2],c.shape[3]])),i.assert(5===f.rank,(()=>`Error in maxPool3d: x must be rank 5 but got rank ${f.rank}.`)),i.assert("NDHWC"===l,(()=>`Error in maxPool3d: Only NDHWC is currently supported, but got dataFormat of ${l}`)),null!=d&&i.assert(i.isInt(a),(()=>`Error in maxPool3d: pad must be an integer when using, dimRoundingMode ${d} but got pad ${a}.`));const m={x:f},h={filterSize:t,strides:n,pad:a,dimRoundingMode:d,dataFormat:l},b=s.ENGINE.runKernel(o.MaxPool3D,m,h);return p?Object(u.reshape)(b,[b.shape[1],b.shape[2],b.shape[3],b.shape[4]]):b}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/max_pool_with_argmax.js": /*!*****************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/max_pool_with_argmax.js ***! \*****************************************************************************/ @@ -15043,11 +15044,11 @@ function(e,t=[1,1,1],n,a,u,l="NDHWC"){const c=Object(r.convertToTensor)(e,"x","m * limitations under the License. * ============================================================================= */ -function(e,t,n,i,a=!1){const d={x:Object(r.convertToTensor)(e,"x","maxPoolWithArgmax")},u={filterSize:t,strides:n,pad:i,includeBatchInIndex:a},l=s.ENGINE.runKernel(o.MaxPoolWithArgmax,d,u);return{result:l[0],indexes:l[1]}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/maximum.js": +function(e,t,n,i,a=!1){const u={x:Object(r.convertToTensor)(e,"x","maxPoolWithArgmax")},d={filterSize:t,strides:n,pad:i,includeBatchInIndex:a},l=s.ENGINE.runKernel(o.MaxPoolWithArgmax,u,d);return{result:l[0],indexes:l[1]}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/maximum.js": /*!****************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/maximum.js ***! \****************************************************************/ -/*! exports provided: maximum */function(e,t,n){"use strict";n.r(t),n.d(t,"maximum",(function(){return l}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),d=n(/*! ./cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const l=Object(u.op)({maximum_: +/*! exports provided: maximum */function(e,t,n){"use strict";n.r(t),n.d(t,"maximum",(function(){return l}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),u=n(/*! ./cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const l=Object(d.op)({maximum_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -15064,7 +15065,7 @@ function(e,t,n,i,a=!1){const d={x:Object(r.convertToTensor)(e,"x","maxPoolWithAr * limitations under the License. * ============================================================================= */ -function(e,t){let n=Object(i.convertToTensor)(e,"a","maximum"),u=Object(i.convertToTensor)(t,"b","maximum");[n,u]=Object(r.makeTypesMatch)(n,u),"bool"===n.dtype&&(n=Object(d.cast)(n,"int32"),u=Object(d.cast)(u,"int32")),Object(a.assertAndGetBroadcastShape)(n.shape,u.shape);const l={a:n,b:u};return s.ENGINE.runKernel(o.Maximum,l)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/mean.js": +function(e,t){let n=Object(i.convertToTensor)(e,"a","maximum"),d=Object(i.convertToTensor)(t,"b","maximum");[n,d]=Object(r.makeTypesMatch)(n,d),"bool"===n.dtype&&(n=Object(u.cast)(n,"int32"),d=Object(u.cast)(d,"int32")),Object(a.assertAndGetBroadcastShape)(n.shape,d.shape);const l={a:n,b:d};return s.ENGINE.runKernel(o.Maximum,l)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/mean.js": /*!*************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/mean.js ***! \*************************************************************/ @@ -15089,7 +15090,7 @@ function(e,t=null,n=!1){const i={x:Object(r.convertToTensor)(e,"x","mean")},a={a /*!*****************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/meshgrid.js ***! \*****************************************************************/ -/*! exports provided: meshgrid */function(e,t,n){"use strict";n.r(t),n.d(t,"meshgrid",(function(){return u}));var s=n(/*! ./mat_mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mat_mul.js"),o=n(/*! ./ones */"./node_modules/@tensorflow/tfjs-core/dist/ops/ones.js"),r=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),i=n(/*! ../tensor */"./node_modules/@tensorflow/tfjs-core/dist/tensor.js"),a=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),d=n(/*! ../util_base */"./node_modules/@tensorflow/tfjs-core/dist/util_base.js"); +/*! exports provided: meshgrid */function(e,t,n){"use strict";n.r(t),n.d(t,"meshgrid",(function(){return d}));var s=n(/*! ./mat_mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mat_mul.js"),o=n(/*! ./ones */"./node_modules/@tensorflow/tfjs-core/dist/ops/ones.js"),r=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),i=n(/*! ../tensor */"./node_modules/@tensorflow/tfjs-core/dist/tensor.js"),a=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),u=n(/*! ../util_base */"./node_modules/@tensorflow/tfjs-core/dist/util_base.js"); /** * @license * Copyright 2021 Google LLC. All Rights Reserved. @@ -15106,7 +15107,7 @@ function(e,t=null,n=!1){const i={x:Object(r.convertToTensor)(e,"x","mean")},a={a * limitations under the License. * ============================================================================= */ -function u(e,t,{indexing:n="xy"}={}){if("xy"!==n&&"ij"!==n)throw new TypeError(`${n} is not a valid third argument to meshgrid`);if(void 0===e)return[];let u=Object(a.convertToTensor)(e,"x","meshgrid",e instanceof i.Tensor?e.dtype:"float32");if(void 0===t)return[u];let l=Object(a.convertToTensor)(t,"y","meshgrid",t instanceof i.Tensor?t.dtype:"float32");const c=Object(d.sizeFromShape)(u.shape),f=Object(d.sizeFromShape)(l.shape);return"xy"===n?(u=Object(r.reshape)(u,[1,-1]),l=Object(r.reshape)(l,[-1,1]),[Object(s.matMul)(Object(o.ones)([f,1],u.dtype),u),Object(s.matMul)(l,Object(o.ones)([1,c],l.dtype))]):(u=Object(r.reshape)(u,[-1,1]),l=Object(r.reshape)(l,[1,-1]),[Object(s.matMul)(u,Object(o.ones)([1,f],u.dtype)),Object(s.matMul)(Object(o.ones)([c,1],l.dtype),l)])}},"./node_modules/@tensorflow/tfjs-core/dist/ops/min.js": +function d(e,t,{indexing:n="xy"}={}){if("xy"!==n&&"ij"!==n)throw new TypeError(`${n} is not a valid third argument to meshgrid`);if(void 0===e)return[];let d=Object(a.convertToTensor)(e,"x","meshgrid",e instanceof i.Tensor?e.dtype:"float32");if(void 0===t)return[d];let l=Object(a.convertToTensor)(t,"y","meshgrid",t instanceof i.Tensor?t.dtype:"float32");const c=Object(u.sizeFromShape)(d.shape),f=Object(u.sizeFromShape)(l.shape);return"xy"===n?(d=Object(r.reshape)(d,[1,-1]),l=Object(r.reshape)(l,[-1,1]),[Object(s.matMul)(Object(o.ones)([f,1],d.dtype),d),Object(s.matMul)(l,Object(o.ones)([1,c],l.dtype))]):(d=Object(r.reshape)(d,[-1,1]),l=Object(r.reshape)(l,[1,-1]),[Object(s.matMul)(d,Object(o.ones)([1,f],d.dtype)),Object(s.matMul)(Object(o.ones)([c,1],l.dtype),l)])}},"./node_modules/@tensorflow/tfjs-core/dist/ops/min.js": /*!************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/min.js ***! \************************************************************/ @@ -15131,7 +15132,7 @@ function(e,t=null,n=!1){const i={x:Object(r.convertToTensor)(e,"x","min")},a={ax /*!****************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/minimum.js ***! \****************************************************************/ -/*! exports provided: minimum */function(e,t,n){"use strict";n.r(t),n.d(t,"minimum",(function(){return l}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),d=n(/*! ./cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const l=Object(u.op)({minimum_: +/*! exports provided: minimum */function(e,t,n){"use strict";n.r(t),n.d(t,"minimum",(function(){return l}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),u=n(/*! ./cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const l=Object(d.op)({minimum_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -15148,11 +15149,11 @@ function(e,t=null,n=!1){const i={x:Object(r.convertToTensor)(e,"x","min")},a={ax * limitations under the License. * ============================================================================= */ -function(e,t){let n=Object(i.convertToTensor)(e,"a","minimum"),u=Object(i.convertToTensor)(t,"b","minimum");[n,u]=Object(r.makeTypesMatch)(n,u),"bool"===n.dtype&&(n=Object(d.cast)(n,"int32"),u=Object(d.cast)(u,"int32")),Object(a.assertAndGetBroadcastShape)(n.shape,u.shape);const l={a:n,b:u};return s.ENGINE.runKernel(o.Minimum,l)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/mirror_pad.js": +function(e,t){let n=Object(i.convertToTensor)(e,"a","minimum"),d=Object(i.convertToTensor)(t,"b","minimum");[n,d]=Object(r.makeTypesMatch)(n,d),"bool"===n.dtype&&(n=Object(u.cast)(n,"int32"),d=Object(u.cast)(d,"int32")),Object(a.assertAndGetBroadcastShape)(n.shape,d.shape);const l={a:n,b:d};return s.ENGINE.runKernel(o.Minimum,l)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/mirror_pad.js": /*!*******************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/mirror_pad.js ***! \*******************************************************************/ -/*! exports provided: mirrorPad */function(e,t,n){"use strict";n.r(t),n.d(t,"mirrorPad",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({mirrorPad_: +/*! exports provided: mirrorPad */function(e,t,n){"use strict";n.r(t),n.d(t,"mirrorPad",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({mirrorPad_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -15169,11 +15170,11 @@ function(e,t){let n=Object(i.convertToTensor)(e,"a","minimum"),u=Object(i.conver * limitations under the License. * ============================================================================= */ -function(e,t,n){i.assert("reflect"===n||"symmetric"===n,(()=>`Invalid mode. Mode must be either reflect or symmetric. Got ${n}.`));const a=Object(r.convertToTensor)(e,"x","mirrorPad");if(0===a.rank)throw new Error("mirrorPad(scalar) is not defined. Pass non-scalar to mirrorPad");i.assert(t.length===a.rank,(()=>`Padding doesn't match input. Must be ${a.rank}. Got ${t.length}.`));const d="reflect"===n?1:0;for(let e=0;e"Invalid number of paddings. Must be length of 2 each.")),i.assert(t[e][0]>=0&&t[e][0]<=a.shape[e]-d&&t[e][1]>=0&&t[e][1]<=a.shape[e]-d,(()=>`Padding in dimension ${e} cannot be greater than or equal to ${a.shape[e]-d} or less than 0 for input of shape ${a.shape}`));const u={paddings:t,mode:n},l={x:a};return s.ENGINE.runKernel(o.MirrorPad,l,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/mod.js": +function(e,t,n){i.assert("reflect"===n||"symmetric"===n,(()=>`Invalid mode. Mode must be either reflect or symmetric. Got ${n}.`));const a=Object(r.convertToTensor)(e,"x","mirrorPad");if(0===a.rank)throw new Error("mirrorPad(scalar) is not defined. Pass non-scalar to mirrorPad");i.assert(t.length===a.rank,(()=>`Padding doesn't match input. Must be ${a.rank}. Got ${t.length}.`));const u="reflect"===n?1:0;for(let e=0;e"Invalid number of paddings. Must be length of 2 each.")),i.assert(t[e][0]>=0&&t[e][0]<=a.shape[e]-u&&t[e][1]>=0&&t[e][1]<=a.shape[e]-u,(()=>`Padding in dimension ${e} cannot be greater than or equal to ${a.shape[e]-u} or less than 0 for input of shape ${a.shape}`));const d={paddings:t,mode:n},l={x:a};return s.ENGINE.runKernel(o.MirrorPad,l,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/mod.js": /*!************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/mod.js ***! \************************************************************/ -/*! exports provided: mod */function(e,t,n){"use strict";n.r(t),n.d(t,"mod",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({mod_: +/*! exports provided: mod */function(e,t,n){"use strict";n.r(t),n.d(t,"mod",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({mod_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -15190,11 +15191,11 @@ function(e,t,n){i.assert("reflect"===n||"symmetric"===n,(()=>`Invalid mode. Mode * limitations under the License. * ============================================================================= */ -function(e,t){let n=Object(i.convertToTensor)(e,"a","mod"),a=Object(i.convertToTensor)(t,"b","mod");[n,a]=Object(r.makeTypesMatch)(n,a);const d={a:n,b:a};return s.ENGINE.runKernel(o.Mod,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/moments.js": +function(e,t){let n=Object(i.convertToTensor)(e,"a","mod"),a=Object(i.convertToTensor)(t,"b","mod");[n,a]=Object(r.makeTypesMatch)(n,a);const u={a:n,b:a};return s.ENGINE.runKernel(o.Mod,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/moments.js": /*!****************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/moments.js ***! \****************************************************************/ -/*! exports provided: moments */function(e,t,n){"use strict";n.r(t),n.d(t,"moments",(function(){return f}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./axis_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/axis_util.js"),i=n(/*! ./cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),a=n(/*! ./mean */"./node_modules/@tensorflow/tfjs-core/dist/ops/mean.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),l=n(/*! ./square */"./node_modules/@tensorflow/tfjs-core/dist/ops/square.js"),c=n(/*! ./sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js");const f=Object(d.op)({moments_: +/*! exports provided: moments */function(e,t,n){"use strict";n.r(t),n.d(t,"moments",(function(){return f}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./axis_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/axis_util.js"),i=n(/*! ./cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),a=n(/*! ./mean */"./node_modules/@tensorflow/tfjs-core/dist/ops/mean.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),d=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),l=n(/*! ./square */"./node_modules/@tensorflow/tfjs-core/dist/ops/square.js"),c=n(/*! ./sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js");const f=Object(u.op)({moments_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -15211,11 +15212,11 @@ function(e,t){let n=Object(i.convertToTensor)(e,"a","mod"),a=Object(i.convertToT * limitations under the License. * ============================================================================= */ -function(e,t=null,n=!1){e=Object(s.convertToTensor)(e,"x","moments");const d=Object(o.parseAxisParam)(t,e.shape),f=Object(a.mean)(e,d,n);let p=f.shape;n||(p=Object(r.expandShapeToKeepDim)(f.shape,d));const m=Object(l.square)(Object(c.sub)(Object(i.cast)(e,"float32"),Object(u.reshape)(f,p)));return{mean:f,variance:Object(a.mean)(m,d,n)}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/moving_average.js": +function(e,t=null,n=!1){e=Object(s.convertToTensor)(e,"x","moments");const u=Object(o.parseAxisParam)(t,e.shape),f=Object(a.mean)(e,u,n);let p=f.shape;n||(p=Object(r.expandShapeToKeepDim)(f.shape,u));const m=Object(l.square)(Object(c.sub)(Object(i.cast)(e,"float32"),Object(d.reshape)(f,p)));return{mean:f,variance:Object(a.mean)(m,u,n)}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/moving_average.js": /*!***********************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/moving_average.js ***! \***********************************************************************/ -/*! exports provided: movingAverage */function(e,t,n){"use strict";n.r(t),n.d(t,"movingAverage",(function(){return p}));var s=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),o=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),r=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),i=n(/*! ./add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),a=n(/*! ./div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),d=n(/*! ./mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),l=n(/*! ./pow */"./node_modules/@tensorflow/tfjs-core/dist/ops/pow.js"),c=n(/*! ./scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),f=n(/*! ./sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js");const p=Object(u.op)({movingAverage_: +/*! exports provided: movingAverage */function(e,t,n){"use strict";n.r(t),n.d(t,"movingAverage",(function(){return p}));var s=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),o=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),r=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),i=n(/*! ./add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),a=n(/*! ./div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),u=n(/*! ./mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),l=n(/*! ./pow */"./node_modules/@tensorflow/tfjs-core/dist/ops/pow.js"),c=n(/*! ./scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),f=n(/*! ./sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js");const p=Object(d.op)({movingAverage_: /** * @license * Copyright 2018 Google LLC. All Rights Reserved. @@ -15232,11 +15233,11 @@ function(e,t=null,n=!1){e=Object(s.convertToTensor)(e,"x","moments");const d=Obj * limitations under the License. * ============================================================================= */ -function(e,t,n,u,p=!0){const m=Object(o.convertToTensor)(e,"v","movingAverage"),h=Object(o.convertToTensor)(t,"x","movingAverage"),b=Object(o.convertToTensor)(n,"decay","movingAverage");Object(s.assertTypesMatch)(m,h),r.assert(r.arraysEqual(m.shape,h.shape),(()=>"Shape mismatch in v and x"));const j=Object(c.scalar)(1),g=Object(f.sub)(j,b);let w=Object(d.mul)(Object(f.sub)(h,m),g);if(p){r.assert(null!=u,(()=>"When using zeroDebias: true, step is required."));const e=Object(o.convertToTensor)(u,"step","movingAverage");w=Object(a.div)(w,Object(f.sub)(j,Object(l.pow)(b,e)))}return Object(i.add)(m,w)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js": +function(e,t,n,d,p=!0){const m=Object(o.convertToTensor)(e,"v","movingAverage"),h=Object(o.convertToTensor)(t,"x","movingAverage"),b=Object(o.convertToTensor)(n,"decay","movingAverage");Object(s.assertTypesMatch)(m,h),r.assert(r.arraysEqual(m.shape,h.shape),(()=>"Shape mismatch in v and x"));const j=Object(c.scalar)(1),g=Object(f.sub)(j,b);let w=Object(u.mul)(Object(f.sub)(h,m),g);if(p){r.assert(null!=d,(()=>"When using zeroDebias: true, step is required."));const e=Object(o.convertToTensor)(d,"step","movingAverage");w=Object(a.div)(w,Object(f.sub)(j,Object(l.pow)(b,e)))}return Object(i.add)(m,w)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js": /*!************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js ***! \************************************************************/ -/*! exports provided: mul */function(e,t,n){"use strict";n.r(t),n.d(t,"mul",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({mul_: +/*! exports provided: mul */function(e,t,n){"use strict";n.r(t),n.d(t,"mul",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({mul_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -15253,15 +15254,15 @@ function(e,t,n,u,p=!0){const m=Object(o.convertToTensor)(e,"v","movingAverage"), * limitations under the License. * ============================================================================= */ -function(e,t){let n=Object(i.convertToTensor)(e,"a","mul"),a=Object(i.convertToTensor)(t,"b","mul");[n,a]=Object(r.makeTypesMatch)(n,a);const d={a:n,b:a};return s.ENGINE.runKernel(o.Multiply,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/multi_rnn_cell.js": +function(e,t){let n=Object(i.convertToTensor)(e,"a","mul"),a=Object(i.convertToTensor)(t,"b","mul");[n,a]=Object(r.makeTypesMatch)(n,a);const u={a:n,b:a};return s.ENGINE.runKernel(o.Multiply,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/multi_rnn_cell.js": /*!***********************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/multi_rnn_cell.js ***! \***********************************************************************/ -/*! exports provided: multiRNNCell */function(e,t,n){"use strict";n.r(t),n.d(t,"multiRNNCell",(function(){return r}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const r=Object(o.op)({multiRNNCell_:function(e,t,n,o){const r=Object(s.convertToTensor)(t,"data","multiRNNCell"),i=Object(s.convertToTensorArray)(n,"c","multiRNNCell"),a=Object(s.convertToTensorArray)(o,"h","multiRNNCell");let d=r;const u=[];for(let t=0;t2)throw new Error(`Rank of probabilities must be 1 or 2, but is ${l}`);n=n||Math.random();const c={logits:1===l?Object(a.reshape)(d,[1,-1]):d},f={numSamples:t,seed:n,normalized:i},p=s.ENGINE.runKernel(o.Multinomial,c,f);return 1===l?Object(a.reshape)(p,[p.size]):p}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/neg.js": +function(e,t,n,i=!1){const u=Object(r.convertToTensor)(e,"logits","multinomial"),d=u.size,l=u.rank;if(d<2)throw new Error(`Error in multinomial: you need at least 2 outcomes, but got ${d}.`);if(l>2)throw new Error(`Rank of probabilities must be 1 or 2, but is ${l}`);n=n||Math.random();const c={logits:1===l?Object(a.reshape)(u,[1,-1]):u},f={numSamples:t,seed:n,normalized:i},p=s.ENGINE.runKernel(o.Multinomial,c,f);return 1===l?Object(a.reshape)(p,[p.size]):p}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/neg.js": /*!************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/neg.js ***! \************************************************************/ @@ -15323,7 +15324,7 @@ function(e){const t={x:Object(r.convertToTensor)(e,"x","neg")};return s.ENGINE.r /*!*************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/norm.js ***! \*************************************************************/ -/*! exports provided: norm */function(e,t,n){"use strict";n.r(t),n.d(t,"norm",(function(){return j}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./abs */"./node_modules/@tensorflow/tfjs-core/dist/ops/abs.js"),i=n(/*! ./axis_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/axis_util.js"),a=n(/*! ./max */"./node_modules/@tensorflow/tfjs-core/dist/ops/max.js"),d=n(/*! ./min */"./node_modules/@tensorflow/tfjs-core/dist/ops/min.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),l=n(/*! ./pow */"./node_modules/@tensorflow/tfjs-core/dist/ops/pow.js"),c=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),f=n(/*! ./scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),p=n(/*! ./sqrt */"./node_modules/@tensorflow/tfjs-core/dist/ops/sqrt.js"),m=n(/*! ./square */"./node_modules/@tensorflow/tfjs-core/dist/ops/square.js"),h=n(/*! ./sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js");function b(e,t,n=null){if(0===e.rank)return Object(r.abs)(e);if(1!==e.rank&&null===n)return b(Object(c.reshape)(e,[-1]),t,n);if(1===e.rank||"number"==typeof n||Array.isArray(n)&&1===n.length){if(1===t)return Object(h.sum)(Object(r.abs)(e),n);if(t===1/0)return Object(a.max)(Object(r.abs)(e),n);if(t===-1/0)return Object(d.min)(Object(r.abs)(e),n);if("euclidean"===t||2===t)return Object(p.sqrt)(Object(h.sum)(Object(l.pow)(Object(r.abs)(e),Object(f.scalar)(2,"int32")),n));throw new Error(`Error in norm: invalid ord value: ${t}`)}if(Array.isArray(n)&&2===n.length){if(1===t)return Object(a.max)(Object(h.sum)(Object(r.abs)(e),n[0]),n[1]-1);if(t===1/0)return Object(a.max)(Object(h.sum)(Object(r.abs)(e),n[1]),n[0]);if(t===-1/0)return Object(d.min)(Object(h.sum)(Object(r.abs)(e),n[1]),n[0]);if("fro"===t||"euclidean"===t)return Object(p.sqrt)(Object(h.sum)(Object(m.square)(e),n));throw new Error(`Error in norm: invalid ord value: ${t}`)}throw new Error(`Error in norm: invalid axis: ${n}`)}const j=Object(u.op)({norm_: +/*! exports provided: norm */function(e,t,n){"use strict";n.r(t),n.d(t,"norm",(function(){return j}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./abs */"./node_modules/@tensorflow/tfjs-core/dist/ops/abs.js"),i=n(/*! ./axis_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/axis_util.js"),a=n(/*! ./max */"./node_modules/@tensorflow/tfjs-core/dist/ops/max.js"),u=n(/*! ./min */"./node_modules/@tensorflow/tfjs-core/dist/ops/min.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),l=n(/*! ./pow */"./node_modules/@tensorflow/tfjs-core/dist/ops/pow.js"),c=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),f=n(/*! ./scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),p=n(/*! ./sqrt */"./node_modules/@tensorflow/tfjs-core/dist/ops/sqrt.js"),m=n(/*! ./square */"./node_modules/@tensorflow/tfjs-core/dist/ops/square.js"),h=n(/*! ./sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js");function b(e,t,n=null){if(0===e.rank)return Object(r.abs)(e);if(1!==e.rank&&null===n)return b(Object(c.reshape)(e,[-1]),t,n);if(1===e.rank||"number"==typeof n||Array.isArray(n)&&1===n.length){if(1===t)return Object(h.sum)(Object(r.abs)(e),n);if(t===1/0)return Object(a.max)(Object(r.abs)(e),n);if(t===-1/0)return Object(u.min)(Object(r.abs)(e),n);if("euclidean"===t||2===t)return Object(p.sqrt)(Object(h.sum)(Object(l.pow)(Object(r.abs)(e),Object(f.scalar)(2,"int32")),n));throw new Error(`Error in norm: invalid ord value: ${t}`)}if(Array.isArray(n)&&2===n.length){if(1===t)return Object(a.max)(Object(h.sum)(Object(r.abs)(e),n[0]),n[1]-1);if(t===1/0)return Object(a.max)(Object(h.sum)(Object(r.abs)(e),n[1]),n[0]);if(t===-1/0)return Object(u.min)(Object(h.sum)(Object(r.abs)(e),n[1]),n[0]);if("fro"===t||"euclidean"===t)return Object(p.sqrt)(Object(h.sum)(Object(m.square)(e),n));throw new Error(`Error in norm: invalid ord value: ${t}`)}throw new Error(`Error in norm: invalid axis: ${n}`)}const j=Object(d.op)({norm_: /** * @license * Copyright 2018 Google LLC. All Rights Reserved. @@ -15340,11 +15341,11 @@ function(e){const t={x:Object(r.convertToTensor)(e,"x","neg")};return s.ENGINE.r * limitations under the License. * ============================================================================= */ -function(e,t="euclidean",n=null,r=!1){const a=b(e=Object(s.convertToTensor)(e,"x","norm"),t,n);let d=a.shape;if(r){const t=Object(o.parseAxisParam)(n,e.shape);d=i.expandShapeToKeepDim(a.shape,t)}return Object(c.reshape)(a,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/not_equal.js": +function(e,t="euclidean",n=null,r=!1){const a=b(e=Object(s.convertToTensor)(e,"x","norm"),t,n);let u=a.shape;if(r){const t=Object(o.parseAxisParam)(n,e.shape);u=i.expandShapeToKeepDim(a.shape,t)}return Object(c.reshape)(a,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/not_equal.js": /*!******************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/not_equal.js ***! \******************************************************************/ -/*! exports provided: notEqual */function(e,t,n){"use strict";n.r(t),n.d(t,"notEqual",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(d.op)({notEqual_: +/*! exports provided: notEqual */function(e,t,n){"use strict";n.r(t),n.d(t,"notEqual",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(u.op)({notEqual_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -15361,7 +15362,7 @@ function(e,t="euclidean",n=null,r=!1){const a=b(e=Object(s.convertToTensor)(e,"x * limitations under the License. * ============================================================================= */ -function(e,t){let n=Object(i.convertToTensor)(e,"a","notEqual","string_or_numeric"),d=Object(i.convertToTensor)(t,"b","notEqual","string_or_numeric");[n,d]=Object(r.makeTypesMatch)(n,d),Object(a.assertAndGetBroadcastShape)(n.shape,d.shape);const u={a:n,b:d};return s.ENGINE.runKernel(o.NotEqual,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/one_hot.js": +function(e,t){let n=Object(i.convertToTensor)(e,"a","notEqual","string_or_numeric"),u=Object(i.convertToTensor)(t,"b","notEqual","string_or_numeric");[n,u]=Object(r.makeTypesMatch)(n,u),Object(a.assertAndGetBroadcastShape)(n.shape,u.shape);const d={a:n,b:u};return s.ENGINE.runKernel(o.NotEqual,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/one_hot.js": /*!****************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/one_hot.js ***! \****************************************************************/ @@ -15382,7 +15383,7 @@ function(e,t){let n=Object(i.convertToTensor)(e,"a","notEqual","string_or_numeri * limitations under the License. * ============================================================================= */ -function(e,t,n=1,i=0){if(t<2)throw new Error(`Error in oneHot: depth must be >=2, but it is ${t}`);const a={indices:Object(r.convertToTensor)(e,"indices","oneHot","int32")},d={depth:t,onValue:n,offValue:i};return s.ENGINE.runKernel(o.OneHot,a,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/ones.js": +function(e,t,n=1,i=0){if(t<2)throw new Error(`Error in oneHot: depth must be >=2, but it is ${t}`);const a={indices:Object(r.convertToTensor)(e,"indices","oneHot","int32")},u={depth:t,onValue:n,offValue:i};return s.ENGINE.runKernel(o.OneHot,a,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/ones.js": /*!*************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/ones.js ***! \*************************************************************/ @@ -15449,7 +15450,7 @@ const r="__op";function i(e){const t=Object.keys(e);if(1!==t.length)throw new Er /*!************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/ops.js ***! \************************************************************/ -/*! exports provided: abs, acos, acosh, add, addN, all, any, argMax, argMin, asin, asinh, atan, atan2, atanh, avgPool, avgPool3d, basicLSTMCell, batchToSpaceND, batchNorm, batchNorm2d, batchNorm3d, batchNorm4d, bincount, broadcastTo, buffer, cast, ceil, clipByValue, clone, complex, concat, concat1d, concat2d, concat3d, concat4d, conv1d, conv2d, conv2dTranspose, conv3d, conv3dTranspose, cos, cosh, cumsum, denseBincount, depthToSpace, depthwiseConv2d, diag, dilation2d, div, divNoNan, dot, einsum, elu, equal, erf, exp, expandDims, expm1, eye, fill, floor, floorDiv, gather, greater, greaterEqual, imag, isFinite, isInf, isNaN, leakyRelu, less, lessEqual, linspace, localResponseNormalization, log, log1p, logSigmoid, logSoftmax, logSumExp, logicalAnd, logicalNot, logicalOr, logicalXor, matMul, max, maxPool, maxPool3d, maxPoolWithArgmax, maximum, mean, meshgrid, min, minimum, mirrorPad, mod, moments, mul, multiRNNCell, multinomial, neg, notEqual, oneHot, ones, onesLike, outerProduct, pad, pad1d, pad2d, pad3d, pad4d, pool, pow, prelu, print, prod, rand, randomGamma, randomNormal, randomUniform, range, real, reciprocal, relu, relu6, reshape, reverse, reverse1d, reverse2d, reverse3d, reverse4d, round, rsqrt, scalar, selu, separableConv2d, setdiff1dAsync, sigmoid, sign, sin, sinh, slice, slice1d, slice2d, slice3d, slice4d, softmax, softplus, spaceToBatchND, fft, ifft, irfft, rfft, split, sqrt, square, squaredDifference, squeeze, stack, step, stridedSlice, sub, sum, tan, tanh, tensor, tensor1d, tensor2d, tensor3d, tensor4d, tensor5d, tensor6d, tile, topk, truncatedNormal, unique, unsortedSegmentSum, unstack, variable, where, whereAsync, zeros, zerosLike, booleanMaskAsync, transpose, norm, movingAverage, scatterND, sparseToDense, gatherND, dropout, enclosingPowerOfTwo, cosineWindow, inTopKAsync, op, OP_SCOPE_SUFFIX, image, linalg, losses, spectral, fused, signal, sparse, string */function(e,t,n){"use strict";n.r(t),n.d(t,"image",(function(){return _s})),n.d(t,"linalg",(function(){return ks})),n.d(t,"losses",(function(){return vs})),n.d(t,"spectral",(function(){return gs})),n.d(t,"signal",(function(){return ws})),n.d(t,"sparse",(function(){return xs})),n.d(t,"string",(function(){return ys}));var s=n(/*! ./abs */"./node_modules/@tensorflow/tfjs-core/dist/ops/abs.js");n.d(t,"abs",(function(){return s.abs}));var o=n(/*! ./acos */"./node_modules/@tensorflow/tfjs-core/dist/ops/acos.js");n.d(t,"acos",(function(){return o.acos}));var r=n(/*! ./acosh */"./node_modules/@tensorflow/tfjs-core/dist/ops/acosh.js");n.d(t,"acosh",(function(){return r.acosh}));var i=n(/*! ./add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js");n.d(t,"add",(function(){return i.add}));var a=n(/*! ./add_n */"./node_modules/@tensorflow/tfjs-core/dist/ops/add_n.js");n.d(t,"addN",(function(){return a.addN}));var d=n(/*! ./all */"./node_modules/@tensorflow/tfjs-core/dist/ops/all.js");n.d(t,"all",(function(){return d.all}));var u=n(/*! ./any */"./node_modules/@tensorflow/tfjs-core/dist/ops/any.js");n.d(t,"any",(function(){return u.any}));var l=n(/*! ./arg_max */"./node_modules/@tensorflow/tfjs-core/dist/ops/arg_max.js");n.d(t,"argMax",(function(){return l.argMax}));var c=n(/*! ./arg_min */"./node_modules/@tensorflow/tfjs-core/dist/ops/arg_min.js");n.d(t,"argMin",(function(){return c.argMin}));var f=n(/*! ./asin */"./node_modules/@tensorflow/tfjs-core/dist/ops/asin.js");n.d(t,"asin",(function(){return f.asin}));var p=n(/*! ./asinh */"./node_modules/@tensorflow/tfjs-core/dist/ops/asinh.js");n.d(t,"asinh",(function(){return p.asinh}));var m=n(/*! ./atan */"./node_modules/@tensorflow/tfjs-core/dist/ops/atan.js");n.d(t,"atan",(function(){return m.atan}));var h=n(/*! ./atan2 */"./node_modules/@tensorflow/tfjs-core/dist/ops/atan2.js");n.d(t,"atan2",(function(){return h.atan2}));var b=n(/*! ./atanh */"./node_modules/@tensorflow/tfjs-core/dist/ops/atanh.js");n.d(t,"atanh",(function(){return b.atanh}));var j=n(/*! ./avg_pool */"./node_modules/@tensorflow/tfjs-core/dist/ops/avg_pool.js");n.d(t,"avgPool",(function(){return j.avgPool}));var g=n(/*! ./avg_pool_3d */"./node_modules/@tensorflow/tfjs-core/dist/ops/avg_pool_3d.js");n.d(t,"avgPool3d",(function(){return g.avgPool3d}));var w=n(/*! ./basic_lstm_cell */"./node_modules/@tensorflow/tfjs-core/dist/ops/basic_lstm_cell.js");n.d(t,"basicLSTMCell",(function(){return w.basicLSTMCell}));var _=n(/*! ./batch_to_space_nd */"./node_modules/@tensorflow/tfjs-core/dist/ops/batch_to_space_nd.js");n.d(t,"batchToSpaceND",(function(){return _.batchToSpaceND}));var k=n(/*! ./batchnorm */"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm.js");n.d(t,"batchNorm",(function(){return k.batchNorm}));var v=n(/*! ./batchnorm2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm2d.js");n.d(t,"batchNorm2d",(function(){return v.batchNorm2d}));var x=n(/*! ./batchnorm3d */"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm3d.js");n.d(t,"batchNorm3d",(function(){return x.batchNorm3d}));var y=n(/*! ./batchnorm4d */"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm4d.js");n.d(t,"batchNorm4d",(function(){return y.batchNorm4d}));var O=n(/*! ./bincount */"./node_modules/@tensorflow/tfjs-core/dist/ops/bincount.js");n.d(t,"bincount",(function(){return O.bincount}));var I=n(/*! ./broadcast_to */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_to.js");n.d(t,"broadcastTo",(function(){return I.broadcastTo}));var C=n(/*! ./buffer */"./node_modules/@tensorflow/tfjs-core/dist/ops/buffer.js");n.d(t,"buffer",(function(){return C.buffer}));var S=n(/*! ./cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js");n.d(t,"cast",(function(){return S.cast}));var T=n(/*! ./ceil */"./node_modules/@tensorflow/tfjs-core/dist/ops/ceil.js");n.d(t,"ceil",(function(){return T.ceil}));var N=n(/*! ./clip_by_value */"./node_modules/@tensorflow/tfjs-core/dist/ops/clip_by_value.js");n.d(t,"clipByValue",(function(){return N.clipByValue}));var E=n(/*! ./clone */"./node_modules/@tensorflow/tfjs-core/dist/ops/clone.js");n.d(t,"clone",(function(){return E.clone}));var A=n(/*! ./complex */"./node_modules/@tensorflow/tfjs-core/dist/ops/complex.js");n.d(t,"complex",(function(){return A.complex}));var R=n(/*! ./concat */"./node_modules/@tensorflow/tfjs-core/dist/ops/concat.js");n.d(t,"concat",(function(){return R.concat}));var F=n(/*! ./concat_1d */"./node_modules/@tensorflow/tfjs-core/dist/ops/concat_1d.js");n.d(t,"concat1d",(function(){return F.concat1d}));var $=n(/*! ./concat_2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/concat_2d.js");n.d(t,"concat2d",(function(){return $.concat2d}));var M=n(/*! ./concat_3d */"./node_modules/@tensorflow/tfjs-core/dist/ops/concat_3d.js");n.d(t,"concat3d",(function(){return M.concat3d}));var D=n(/*! ./concat_4d */"./node_modules/@tensorflow/tfjs-core/dist/ops/concat_4d.js");n.d(t,"concat4d",(function(){return D.concat4d}));var P=n(/*! ./conv1d */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv1d.js");n.d(t,"conv1d",(function(){return P.conv1d}));var B=n(/*! ./conv2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d.js");n.d(t,"conv2d",(function(){return B.conv2d}));var L=n(/*! ./conv2d_transpose */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d_transpose.js");n.d(t,"conv2dTranspose",(function(){return L.conv2dTranspose}));var z=n(/*! ./conv3d */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv3d.js");n.d(t,"conv3d",(function(){return z.conv3d}));var G=n(/*! ./conv3d_transpose */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv3d_transpose.js");n.d(t,"conv3dTranspose",(function(){return G.conv3dTranspose}));var W=n(/*! ./cos */"./node_modules/@tensorflow/tfjs-core/dist/ops/cos.js");n.d(t,"cos",(function(){return W.cos}));var U=n(/*! ./cosh */"./node_modules/@tensorflow/tfjs-core/dist/ops/cosh.js");n.d(t,"cosh",(function(){return U.cosh}));var V=n(/*! ./cumsum */"./node_modules/@tensorflow/tfjs-core/dist/ops/cumsum.js");n.d(t,"cumsum",(function(){return V.cumsum}));var q=n(/*! ./dense_bincount */"./node_modules/@tensorflow/tfjs-core/dist/ops/dense_bincount.js");n.d(t,"denseBincount",(function(){return q.denseBincount}));var H=n(/*! ./depth_to_space */"./node_modules/@tensorflow/tfjs-core/dist/ops/depth_to_space.js");n.d(t,"depthToSpace",(function(){return H.depthToSpace}));var K=n(/*! ./depthwise_conv2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d.js");n.d(t,"depthwiseConv2d",(function(){return K.depthwiseConv2d}));var X=n(/*! ./diag */"./node_modules/@tensorflow/tfjs-core/dist/ops/diag.js");n.d(t,"diag",(function(){return X.diag}));var Y=n(/*! ./dilation2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/dilation2d.js");n.d(t,"dilation2d",(function(){return Y.dilation2d}));var Z=n(/*! ./div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js");n.d(t,"div",(function(){return Z.div}));var Q=n(/*! ./div_no_nan */"./node_modules/@tensorflow/tfjs-core/dist/ops/div_no_nan.js");n.d(t,"divNoNan",(function(){return Q.divNoNan}));var J=n(/*! ./dot */"./node_modules/@tensorflow/tfjs-core/dist/ops/dot.js");n.d(t,"dot",(function(){return J.dot}));var ee=n(/*! ./einsum */"./node_modules/@tensorflow/tfjs-core/dist/ops/einsum.js");n.d(t,"einsum",(function(){return ee.einsum}));var te=n(/*! ./elu */"./node_modules/@tensorflow/tfjs-core/dist/ops/elu.js");n.d(t,"elu",(function(){return te.elu}));var ne=n(/*! ./equal */"./node_modules/@tensorflow/tfjs-core/dist/ops/equal.js");n.d(t,"equal",(function(){return ne.equal}));var se=n(/*! ./erf */"./node_modules/@tensorflow/tfjs-core/dist/ops/erf.js");n.d(t,"erf",(function(){return se.erf}));var oe=n(/*! ./exp */"./node_modules/@tensorflow/tfjs-core/dist/ops/exp.js");n.d(t,"exp",(function(){return oe.exp}));var re=n(/*! ./expand_dims */"./node_modules/@tensorflow/tfjs-core/dist/ops/expand_dims.js");n.d(t,"expandDims",(function(){return re.expandDims}));var ie=n(/*! ./expm1 */"./node_modules/@tensorflow/tfjs-core/dist/ops/expm1.js");n.d(t,"expm1",(function(){return ie.expm1}));var ae=n(/*! ./eye */"./node_modules/@tensorflow/tfjs-core/dist/ops/eye.js");n.d(t,"eye",(function(){return ae.eye}));var de=n(/*! ./fill */"./node_modules/@tensorflow/tfjs-core/dist/ops/fill.js");n.d(t,"fill",(function(){return de.fill}));var ue=n(/*! ./floor */"./node_modules/@tensorflow/tfjs-core/dist/ops/floor.js");n.d(t,"floor",(function(){return ue.floor}));var le=n(/*! ./floorDiv */"./node_modules/@tensorflow/tfjs-core/dist/ops/floorDiv.js");n.d(t,"floorDiv",(function(){return le.floorDiv}));var ce=n(/*! ./gather */"./node_modules/@tensorflow/tfjs-core/dist/ops/gather.js");n.d(t,"gather",(function(){return ce.gather}));var fe=n(/*! ./greater */"./node_modules/@tensorflow/tfjs-core/dist/ops/greater.js");n.d(t,"greater",(function(){return fe.greater}));var pe=n(/*! ./greater_equal */"./node_modules/@tensorflow/tfjs-core/dist/ops/greater_equal.js");n.d(t,"greaterEqual",(function(){return pe.greaterEqual}));var me=n(/*! ./imag */"./node_modules/@tensorflow/tfjs-core/dist/ops/imag.js");n.d(t,"imag",(function(){return me.imag}));var he=n(/*! ./is_finite */"./node_modules/@tensorflow/tfjs-core/dist/ops/is_finite.js");n.d(t,"isFinite",(function(){return he.isFinite}));var be=n(/*! ./is_inf */"./node_modules/@tensorflow/tfjs-core/dist/ops/is_inf.js");n.d(t,"isInf",(function(){return be.isInf}));var je=n(/*! ./is_nan */"./node_modules/@tensorflow/tfjs-core/dist/ops/is_nan.js");n.d(t,"isNaN",(function(){return je.isNaN}));var ge=n(/*! ./leaky_relu */"./node_modules/@tensorflow/tfjs-core/dist/ops/leaky_relu.js");n.d(t,"leakyRelu",(function(){return ge.leakyRelu}));var we=n(/*! ./less */"./node_modules/@tensorflow/tfjs-core/dist/ops/less.js");n.d(t,"less",(function(){return we.less}));var _e=n(/*! ./less_equal */"./node_modules/@tensorflow/tfjs-core/dist/ops/less_equal.js");n.d(t,"lessEqual",(function(){return _e.lessEqual}));var ke=n(/*! ./linspace */"./node_modules/@tensorflow/tfjs-core/dist/ops/linspace.js");n.d(t,"linspace",(function(){return ke.linspace}));var ve=n(/*! ./local_response_normalization */"./node_modules/@tensorflow/tfjs-core/dist/ops/local_response_normalization.js");n.d(t,"localResponseNormalization",(function(){return ve.localResponseNormalization}));var xe=n(/*! ./log */"./node_modules/@tensorflow/tfjs-core/dist/ops/log.js");n.d(t,"log",(function(){return xe.log}));var ye=n(/*! ./log1p */"./node_modules/@tensorflow/tfjs-core/dist/ops/log1p.js");n.d(t,"log1p",(function(){return ye.log1p}));var Oe=n(/*! ./log_sigmoid */"./node_modules/@tensorflow/tfjs-core/dist/ops/log_sigmoid.js");n.d(t,"logSigmoid",(function(){return Oe.logSigmoid}));var Ie=n(/*! ./log_softmax */"./node_modules/@tensorflow/tfjs-core/dist/ops/log_softmax.js");n.d(t,"logSoftmax",(function(){return Ie.logSoftmax}));var Ce=n(/*! ./log_sum_exp */"./node_modules/@tensorflow/tfjs-core/dist/ops/log_sum_exp.js");n.d(t,"logSumExp",(function(){return Ce.logSumExp}));var Se=n(/*! ./logical_and */"./node_modules/@tensorflow/tfjs-core/dist/ops/logical_and.js");n.d(t,"logicalAnd",(function(){return Se.logicalAnd}));var Te=n(/*! ./logical_not */"./node_modules/@tensorflow/tfjs-core/dist/ops/logical_not.js");n.d(t,"logicalNot",(function(){return Te.logicalNot}));var Ne=n(/*! ./logical_or */"./node_modules/@tensorflow/tfjs-core/dist/ops/logical_or.js");n.d(t,"logicalOr",(function(){return Ne.logicalOr}));var Ee=n(/*! ./logical_xor */"./node_modules/@tensorflow/tfjs-core/dist/ops/logical_xor.js");n.d(t,"logicalXor",(function(){return Ee.logicalXor}));var Ae=n(/*! ./mat_mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mat_mul.js");n.d(t,"matMul",(function(){return Ae.matMul}));var Re=n(/*! ./max */"./node_modules/@tensorflow/tfjs-core/dist/ops/max.js");n.d(t,"max",(function(){return Re.max}));var Fe=n(/*! ./max_pool */"./node_modules/@tensorflow/tfjs-core/dist/ops/max_pool.js");n.d(t,"maxPool",(function(){return Fe.maxPool}));var $e=n(/*! ./max_pool_3d */"./node_modules/@tensorflow/tfjs-core/dist/ops/max_pool_3d.js");n.d(t,"maxPool3d",(function(){return $e.maxPool3d}));var Me=n(/*! ./max_pool_with_argmax */"./node_modules/@tensorflow/tfjs-core/dist/ops/max_pool_with_argmax.js");n.d(t,"maxPoolWithArgmax",(function(){return Me.maxPoolWithArgmax}));var De=n(/*! ./maximum */"./node_modules/@tensorflow/tfjs-core/dist/ops/maximum.js");n.d(t,"maximum",(function(){return De.maximum}));var Pe=n(/*! ./mean */"./node_modules/@tensorflow/tfjs-core/dist/ops/mean.js");n.d(t,"mean",(function(){return Pe.mean}));var Be=n(/*! ./meshgrid */"./node_modules/@tensorflow/tfjs-core/dist/ops/meshgrid.js");n.d(t,"meshgrid",(function(){return Be.meshgrid}));var Le=n(/*! ./min */"./node_modules/@tensorflow/tfjs-core/dist/ops/min.js");n.d(t,"min",(function(){return Le.min}));var ze=n(/*! ./minimum */"./node_modules/@tensorflow/tfjs-core/dist/ops/minimum.js");n.d(t,"minimum",(function(){return ze.minimum}));var Ge=n(/*! ./mirror_pad */"./node_modules/@tensorflow/tfjs-core/dist/ops/mirror_pad.js");n.d(t,"mirrorPad",(function(){return Ge.mirrorPad}));var We=n(/*! ./mod */"./node_modules/@tensorflow/tfjs-core/dist/ops/mod.js");n.d(t,"mod",(function(){return We.mod}));var Ue=n(/*! ./moments */"./node_modules/@tensorflow/tfjs-core/dist/ops/moments.js");n.d(t,"moments",(function(){return Ue.moments}));var Ve=n(/*! ./mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js");n.d(t,"mul",(function(){return Ve.mul}));var qe=n(/*! ./multi_rnn_cell */"./node_modules/@tensorflow/tfjs-core/dist/ops/multi_rnn_cell.js");n.d(t,"multiRNNCell",(function(){return qe.multiRNNCell}));var He=n(/*! ./multinomial */"./node_modules/@tensorflow/tfjs-core/dist/ops/multinomial.js");n.d(t,"multinomial",(function(){return He.multinomial}));var Ke=n(/*! ./neg */"./node_modules/@tensorflow/tfjs-core/dist/ops/neg.js");n.d(t,"neg",(function(){return Ke.neg}));var Xe=n(/*! ./not_equal */"./node_modules/@tensorflow/tfjs-core/dist/ops/not_equal.js");n.d(t,"notEqual",(function(){return Xe.notEqual}));var Ye=n(/*! ./one_hot */"./node_modules/@tensorflow/tfjs-core/dist/ops/one_hot.js");n.d(t,"oneHot",(function(){return Ye.oneHot}));var Ze=n(/*! ./ones */"./node_modules/@tensorflow/tfjs-core/dist/ops/ones.js");n.d(t,"ones",(function(){return Ze.ones}));var Qe=n(/*! ./ones_like */"./node_modules/@tensorflow/tfjs-core/dist/ops/ones_like.js");n.d(t,"onesLike",(function(){return Qe.onesLike}));var Je=n(/*! ./outer_product */"./node_modules/@tensorflow/tfjs-core/dist/ops/outer_product.js");n.d(t,"outerProduct",(function(){return Je.outerProduct}));var et=n(/*! ./pad */"./node_modules/@tensorflow/tfjs-core/dist/ops/pad.js");n.d(t,"pad",(function(){return et.pad}));var tt=n(/*! ./pad1d */"./node_modules/@tensorflow/tfjs-core/dist/ops/pad1d.js");n.d(t,"pad1d",(function(){return tt.pad1d}));var nt=n(/*! ./pad2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/pad2d.js");n.d(t,"pad2d",(function(){return nt.pad2d}));var st=n(/*! ./pad3d */"./node_modules/@tensorflow/tfjs-core/dist/ops/pad3d.js");n.d(t,"pad3d",(function(){return st.pad3d}));var ot=n(/*! ./pad4d */"./node_modules/@tensorflow/tfjs-core/dist/ops/pad4d.js");n.d(t,"pad4d",(function(){return ot.pad4d}));var rt=n(/*! ./pool */"./node_modules/@tensorflow/tfjs-core/dist/ops/pool.js");n.d(t,"pool",(function(){return rt.pool}));var it=n(/*! ./pow */"./node_modules/@tensorflow/tfjs-core/dist/ops/pow.js");n.d(t,"pow",(function(){return it.pow}));var at=n(/*! ./prelu */"./node_modules/@tensorflow/tfjs-core/dist/ops/prelu.js");n.d(t,"prelu",(function(){return at.prelu}));var dt=n(/*! ./print */"./node_modules/@tensorflow/tfjs-core/dist/ops/print.js");n.d(t,"print",(function(){return dt.print}));var ut=n(/*! ./prod */"./node_modules/@tensorflow/tfjs-core/dist/ops/prod.js");n.d(t,"prod",(function(){return ut.prod}));var lt=n(/*! ./rand */"./node_modules/@tensorflow/tfjs-core/dist/ops/rand.js");n.d(t,"rand",(function(){return lt.rand}));var ct=n(/*! ./random_gamma */"./node_modules/@tensorflow/tfjs-core/dist/ops/random_gamma.js");n.d(t,"randomGamma",(function(){return ct.randomGamma}));var ft=n(/*! ./random_normal */"./node_modules/@tensorflow/tfjs-core/dist/ops/random_normal.js");n.d(t,"randomNormal",(function(){return ft.randomNormal}));var pt=n(/*! ./random_uniform */"./node_modules/@tensorflow/tfjs-core/dist/ops/random_uniform.js");n.d(t,"randomUniform",(function(){return pt.randomUniform}));var mt=n(/*! ./range */"./node_modules/@tensorflow/tfjs-core/dist/ops/range.js");n.d(t,"range",(function(){return mt.range}));var ht=n(/*! ./real */"./node_modules/@tensorflow/tfjs-core/dist/ops/real.js");n.d(t,"real",(function(){return ht.real}));var bt=n(/*! ./reciprocal */"./node_modules/@tensorflow/tfjs-core/dist/ops/reciprocal.js");n.d(t,"reciprocal",(function(){return bt.reciprocal}));var jt=n(/*! ./relu */"./node_modules/@tensorflow/tfjs-core/dist/ops/relu.js");n.d(t,"relu",(function(){return jt.relu}));var gt=n(/*! ./relu6 */"./node_modules/@tensorflow/tfjs-core/dist/ops/relu6.js");n.d(t,"relu6",(function(){return gt.relu6}));var wt=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");n.d(t,"reshape",(function(){return wt.reshape}));var _t=n(/*! ./reverse */"./node_modules/@tensorflow/tfjs-core/dist/ops/reverse.js");n.d(t,"reverse",(function(){return _t.reverse}));var kt=n(/*! ./reverse_1d */"./node_modules/@tensorflow/tfjs-core/dist/ops/reverse_1d.js");n.d(t,"reverse1d",(function(){return kt.reverse1d}));var vt=n(/*! ./reverse_2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/reverse_2d.js");n.d(t,"reverse2d",(function(){return vt.reverse2d}));var xt=n(/*! ./reverse_3d */"./node_modules/@tensorflow/tfjs-core/dist/ops/reverse_3d.js");n.d(t,"reverse3d",(function(){return xt.reverse3d}));var yt=n(/*! ./reverse_4d */"./node_modules/@tensorflow/tfjs-core/dist/ops/reverse_4d.js");n.d(t,"reverse4d",(function(){return yt.reverse4d}));var Ot=n(/*! ./round */"./node_modules/@tensorflow/tfjs-core/dist/ops/round.js");n.d(t,"round",(function(){return Ot.round}));var It=n(/*! ./rsqrt */"./node_modules/@tensorflow/tfjs-core/dist/ops/rsqrt.js");n.d(t,"rsqrt",(function(){return It.rsqrt}));var Ct=n(/*! ./scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js");n.d(t,"scalar",(function(){return Ct.scalar}));var St=n(/*! ./selu */"./node_modules/@tensorflow/tfjs-core/dist/ops/selu.js");n.d(t,"selu",(function(){return St.selu}));var Tt=n(/*! ./separable_conv2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/separable_conv2d.js");n.d(t,"separableConv2d",(function(){return Tt.separableConv2d}));var Nt=n(/*! ./setdiff1d_async */"./node_modules/@tensorflow/tfjs-core/dist/ops/setdiff1d_async.js");n.d(t,"setdiff1dAsync",(function(){return Nt.setdiff1dAsync}));var Et=n(/*! ./sigmoid */"./node_modules/@tensorflow/tfjs-core/dist/ops/sigmoid.js");n.d(t,"sigmoid",(function(){return Et.sigmoid}));var At=n(/*! ./sign */"./node_modules/@tensorflow/tfjs-core/dist/ops/sign.js");n.d(t,"sign",(function(){return At.sign}));var Rt=n(/*! ./sin */"./node_modules/@tensorflow/tfjs-core/dist/ops/sin.js");n.d(t,"sin",(function(){return Rt.sin}));var Ft=n(/*! ./sinh */"./node_modules/@tensorflow/tfjs-core/dist/ops/sinh.js");n.d(t,"sinh",(function(){return Ft.sinh}));var $t=n(/*! ./slice */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice.js");n.d(t,"slice",(function(){return $t.slice}));var Mt=n(/*! ./slice1d */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice1d.js");n.d(t,"slice1d",(function(){return Mt.slice1d}));var Dt=n(/*! ./slice2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice2d.js");n.d(t,"slice2d",(function(){return Dt.slice2d}));var Pt=n(/*! ./slice3d */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice3d.js");n.d(t,"slice3d",(function(){return Pt.slice3d}));var Bt=n(/*! ./slice4d */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice4d.js");n.d(t,"slice4d",(function(){return Bt.slice4d}));var Lt=n(/*! ./softmax */"./node_modules/@tensorflow/tfjs-core/dist/ops/softmax.js");n.d(t,"softmax",(function(){return Lt.softmax}));var zt=n(/*! ./softplus */"./node_modules/@tensorflow/tfjs-core/dist/ops/softplus.js");n.d(t,"softplus",(function(){return zt.softplus}));var Gt=n(/*! ./space_to_batch_nd */"./node_modules/@tensorflow/tfjs-core/dist/ops/space_to_batch_nd.js");n.d(t,"spaceToBatchND",(function(){return Gt.spaceToBatchND}));var Wt=n(/*! ./spectral/fft */"./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/fft.js");n.d(t,"fft",(function(){return Wt.fft}));var Ut=n(/*! ./spectral/ifft */"./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/ifft.js");n.d(t,"ifft",(function(){return Ut.ifft}));var Vt=n(/*! ./spectral/irfft */"./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/irfft.js");n.d(t,"irfft",(function(){return Vt.irfft}));var qt=n(/*! ./spectral/rfft */"./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/rfft.js");n.d(t,"rfft",(function(){return qt.rfft}));var Ht=n(/*! ./split */"./node_modules/@tensorflow/tfjs-core/dist/ops/split.js");n.d(t,"split",(function(){return Ht.split}));var Kt=n(/*! ./sqrt */"./node_modules/@tensorflow/tfjs-core/dist/ops/sqrt.js");n.d(t,"sqrt",(function(){return Kt.sqrt}));var Xt=n(/*! ./square */"./node_modules/@tensorflow/tfjs-core/dist/ops/square.js");n.d(t,"square",(function(){return Xt.square}));var Yt=n(/*! ./squared_difference */"./node_modules/@tensorflow/tfjs-core/dist/ops/squared_difference.js");n.d(t,"squaredDifference",(function(){return Yt.squaredDifference}));var Zt=n(/*! ./squeeze */"./node_modules/@tensorflow/tfjs-core/dist/ops/squeeze.js");n.d(t,"squeeze",(function(){return Zt.squeeze}));var Qt=n(/*! ./stack */"./node_modules/@tensorflow/tfjs-core/dist/ops/stack.js");n.d(t,"stack",(function(){return Qt.stack}));var Jt=n(/*! ./step */"./node_modules/@tensorflow/tfjs-core/dist/ops/step.js");n.d(t,"step",(function(){return Jt.step}));var en=n(/*! ./strided_slice */"./node_modules/@tensorflow/tfjs-core/dist/ops/strided_slice.js");n.d(t,"stridedSlice",(function(){return en.stridedSlice}));var tn=n(/*! ./sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js");n.d(t,"sub",(function(){return tn.sub}));var nn=n(/*! ./sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js");n.d(t,"sum",(function(){return nn.sum}));var sn=n(/*! ./tan */"./node_modules/@tensorflow/tfjs-core/dist/ops/tan.js");n.d(t,"tan",(function(){return sn.tan}));var on=n(/*! ./tanh */"./node_modules/@tensorflow/tfjs-core/dist/ops/tanh.js");n.d(t,"tanh",(function(){return on.tanh}));var rn=n(/*! ./tensor */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor.js");n.d(t,"tensor",(function(){return rn.tensor}));var an=n(/*! ./tensor1d */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor1d.js");n.d(t,"tensor1d",(function(){return an.tensor1d}));var dn=n(/*! ./tensor2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor2d.js");n.d(t,"tensor2d",(function(){return dn.tensor2d}));var un=n(/*! ./tensor3d */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor3d.js");n.d(t,"tensor3d",(function(){return un.tensor3d}));var ln=n(/*! ./tensor4d */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor4d.js");n.d(t,"tensor4d",(function(){return ln.tensor4d}));var cn=n(/*! ./tensor5d */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor5d.js");n.d(t,"tensor5d",(function(){return cn.tensor5d}));var fn=n(/*! ./tensor6d */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor6d.js");n.d(t,"tensor6d",(function(){return fn.tensor6d}));var pn=n(/*! ./tile */"./node_modules/@tensorflow/tfjs-core/dist/ops/tile.js");n.d(t,"tile",(function(){return pn.tile}));var mn=n(/*! ./topk */"./node_modules/@tensorflow/tfjs-core/dist/ops/topk.js");n.d(t,"topk",(function(){return mn.topk}));var hn=n(/*! ./truncated_normal */"./node_modules/@tensorflow/tfjs-core/dist/ops/truncated_normal.js");n.d(t,"truncatedNormal",(function(){return hn.truncatedNormal}));var bn=n(/*! ./unique */"./node_modules/@tensorflow/tfjs-core/dist/ops/unique.js");n.d(t,"unique",(function(){return bn.unique}));var jn=n(/*! ./unsorted_segment_sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/unsorted_segment_sum.js");n.d(t,"unsortedSegmentSum",(function(){return jn.unsortedSegmentSum}));var gn=n(/*! ./unstack */"./node_modules/@tensorflow/tfjs-core/dist/ops/unstack.js");n.d(t,"unstack",(function(){return gn.unstack}));var wn=n(/*! ./variable */"./node_modules/@tensorflow/tfjs-core/dist/ops/variable.js");n.d(t,"variable",(function(){return wn.variable}));var _n=n(/*! ./where */"./node_modules/@tensorflow/tfjs-core/dist/ops/where.js");n.d(t,"where",(function(){return _n.where}));var kn=n(/*! ./where_async */"./node_modules/@tensorflow/tfjs-core/dist/ops/where_async.js");n.d(t,"whereAsync",(function(){return kn.whereAsync}));var vn=n(/*! ./zeros */"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros.js");n.d(t,"zeros",(function(){return vn.zeros}));var xn=n(/*! ./zeros_like */"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js");n.d(t,"zerosLike",(function(){return xn.zerosLike}));var yn=n(/*! ./boolean_mask */"./node_modules/@tensorflow/tfjs-core/dist/ops/boolean_mask.js");n.d(t,"booleanMaskAsync",(function(){return yn.booleanMaskAsync}));var On=n(/*! ./transpose */"./node_modules/@tensorflow/tfjs-core/dist/ops/transpose.js");n.d(t,"transpose",(function(){return On.transpose}));var In=n(/*! ./norm */"./node_modules/@tensorflow/tfjs-core/dist/ops/norm.js");n.d(t,"norm",(function(){return In.norm}));var Cn=n(/*! ./moving_average */"./node_modules/@tensorflow/tfjs-core/dist/ops/moving_average.js");n.d(t,"movingAverage",(function(){return Cn.movingAverage}));var Sn=n(/*! ./scatter_nd */"./node_modules/@tensorflow/tfjs-core/dist/ops/scatter_nd.js");n.d(t,"scatterND",(function(){return Sn.scatterND}));var Tn=n(/*! ./sparse_to_dense */"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse_to_dense.js");n.d(t,"sparseToDense",(function(){return Tn.sparseToDense}));var Nn=n(/*! ./gather_nd */"./node_modules/@tensorflow/tfjs-core/dist/ops/gather_nd.js");n.d(t,"gatherND",(function(){return Nn.gatherND}));var En=n(/*! ./dropout */"./node_modules/@tensorflow/tfjs-core/dist/ops/dropout.js");n.d(t,"dropout",(function(){return En.dropout}));var An=n(/*! ./signal_ops_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/signal_ops_util.js");n.d(t,"enclosingPowerOfTwo",(function(){return An.enclosingPowerOfTwo})),n.d(t,"cosineWindow",(function(){return An.cosineWindow}));var Rn=n(/*! ./in_top_k */"./node_modules/@tensorflow/tfjs-core/dist/ops/in_top_k.js");n.d(t,"inTopKAsync",(function(){return Rn.inTopKAsync}));var Fn=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");n.d(t,"op",(function(){return Fn.op})),n.d(t,"OP_SCOPE_SUFFIX",(function(){return Fn.OP_SCOPE_SUFFIX}));var $n=n(/*! ./fused_ops */"./node_modules/@tensorflow/tfjs-core/dist/ops/fused_ops.js");n.d(t,"fused",(function(){return $n}));var Mn=n(/*! ./signal/hamming_window */"./node_modules/@tensorflow/tfjs-core/dist/ops/signal/hamming_window.js"),Dn=n(/*! ./signal/hann_window */"./node_modules/@tensorflow/tfjs-core/dist/ops/signal/hann_window.js"),Pn=n(/*! ./signal/frame */"./node_modules/@tensorflow/tfjs-core/dist/ops/signal/frame.js"),Bn=n(/*! ./signal/stft */"./node_modules/@tensorflow/tfjs-core/dist/ops/signal/stft.js"),Ln=n(/*! ./image/crop_and_resize */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/crop_and_resize.js"),zn=n(/*! ./image/flip_left_right */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/flip_left_right.js"),Gn=n(/*! ./image/rotate_with_offset */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/rotate_with_offset.js"),Wn=n(/*! ./image/non_max_suppression */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression.js"),Un=n(/*! ./image/non_max_suppression_async */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_async.js"),Vn=n(/*! ./image/non_max_suppression_with_score */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_with_score.js"),qn=n(/*! ./image/non_max_suppression_with_score_async */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_with_score_async.js"),Hn=n(/*! ./image/non_max_suppression_padded */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_padded.js"),Kn=n(/*! ./image/non_max_suppression_padded_async */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_padded_async.js"),Xn=n(/*! ./image/resize_bilinear */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/resize_bilinear.js"),Yn=n(/*! ./image/resize_nearest_neighbor */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/resize_nearest_neighbor.js"),Zn=n(/*! ./image/threshold */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/threshold.js"),Qn=n(/*! ./image/transform */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/transform.js"),Jn=n(/*! ./linalg/band_part */"./node_modules/@tensorflow/tfjs-core/dist/ops/linalg/band_part.js"),es=n(/*! ./linalg/gram_schmidt */"./node_modules/@tensorflow/tfjs-core/dist/ops/linalg/gram_schmidt.js"),ts=n(/*! ./linalg/qr */"./node_modules/@tensorflow/tfjs-core/dist/ops/linalg/qr.js"),ns=n(/*! ./losses/absolute_difference */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/absolute_difference.js"),ss=n(/*! ./losses/compute_weighted_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js"),os=n(/*! ./losses/cosine_distance */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/cosine_distance.js"),rs=n(/*! ./losses/hinge_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/hinge_loss.js"),is=n(/*! ./losses/huber_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/huber_loss.js"),as=n(/*! ./losses/log_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/log_loss.js"),ds=n(/*! ./losses/mean_squared_error */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/mean_squared_error.js"),us=n(/*! ./losses/sigmoid_cross_entropy */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/sigmoid_cross_entropy.js"),ls=n(/*! ./losses/softmax_cross_entropy */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/softmax_cross_entropy.js"),cs=n(/*! ./sparse/sparse_fill_empty_rows */"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_fill_empty_rows.js"),fs=n(/*! ./sparse/sparse_reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_reshape.js"),ps=n(/*! ./sparse/sparse_segment_mean */"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_segment_mean.js"),ms=n(/*! ./sparse/sparse_segment_sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_segment_sum.js"),hs=n(/*! ./string/string_n_grams */"./node_modules/@tensorflow/tfjs-core/dist/ops/string/string_n_grams.js"),bs=n(/*! ./string/string_split */"./node_modules/@tensorflow/tfjs-core/dist/ops/string/string_split.js"),js=n(/*! ./string/string_to_hash_bucket_fast */"./node_modules/@tensorflow/tfjs-core/dist/ops/string/string_to_hash_bucket_fast.js"); +/*! exports provided: abs, acos, acosh, add, addN, all, any, argMax, argMin, asin, asinh, atan, atan2, atanh, avgPool, avgPool3d, basicLSTMCell, batchToSpaceND, batchNorm, batchNorm2d, batchNorm3d, batchNorm4d, bincount, broadcastTo, buffer, cast, ceil, clipByValue, clone, complex, concat, concat1d, concat2d, concat3d, concat4d, conv1d, conv2d, conv2dTranspose, conv3d, conv3dTranspose, cos, cosh, cumsum, denseBincount, depthToSpace, depthwiseConv2d, diag, dilation2d, div, divNoNan, dot, einsum, elu, equal, erf, exp, expandDims, expm1, eye, fill, floor, floorDiv, gather, greater, greaterEqual, imag, isFinite, isInf, isNaN, leakyRelu, less, lessEqual, linspace, localResponseNormalization, log, log1p, logSigmoid, logSoftmax, logSumExp, logicalAnd, logicalNot, logicalOr, logicalXor, matMul, max, maxPool, maxPool3d, maxPoolWithArgmax, maximum, mean, meshgrid, min, minimum, mirrorPad, mod, moments, mul, multiRNNCell, multinomial, neg, notEqual, oneHot, ones, onesLike, outerProduct, pad, pad1d, pad2d, pad3d, pad4d, pool, pow, prelu, print, prod, rand, randomGamma, randomNormal, randomUniform, range, real, reciprocal, relu, relu6, reshape, reverse, reverse1d, reverse2d, reverse3d, reverse4d, round, rsqrt, scalar, selu, separableConv2d, setdiff1dAsync, sigmoid, sign, sin, sinh, slice, slice1d, slice2d, slice3d, slice4d, softmax, softplus, spaceToBatchND, fft, ifft, irfft, rfft, split, sqrt, square, squaredDifference, squeeze, stack, step, stridedSlice, sub, sum, tan, tanh, tensor, tensor1d, tensor2d, tensor3d, tensor4d, tensor5d, tensor6d, tile, topk, truncatedNormal, unique, unsortedSegmentSum, unstack, variable, where, whereAsync, zeros, zerosLike, booleanMaskAsync, transpose, norm, movingAverage, scatterND, sparseToDense, gatherND, dropout, enclosingPowerOfTwo, cosineWindow, inTopKAsync, op, OP_SCOPE_SUFFIX, image, linalg, losses, spectral, fused, signal, sparse, string */function(e,t,n){"use strict";n.r(t),n.d(t,"image",(function(){return _s})),n.d(t,"linalg",(function(){return ks})),n.d(t,"losses",(function(){return vs})),n.d(t,"spectral",(function(){return gs})),n.d(t,"signal",(function(){return ws})),n.d(t,"sparse",(function(){return xs})),n.d(t,"string",(function(){return ys}));var s=n(/*! ./abs */"./node_modules/@tensorflow/tfjs-core/dist/ops/abs.js");n.d(t,"abs",(function(){return s.abs}));var o=n(/*! ./acos */"./node_modules/@tensorflow/tfjs-core/dist/ops/acos.js");n.d(t,"acos",(function(){return o.acos}));var r=n(/*! ./acosh */"./node_modules/@tensorflow/tfjs-core/dist/ops/acosh.js");n.d(t,"acosh",(function(){return r.acosh}));var i=n(/*! ./add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js");n.d(t,"add",(function(){return i.add}));var a=n(/*! ./add_n */"./node_modules/@tensorflow/tfjs-core/dist/ops/add_n.js");n.d(t,"addN",(function(){return a.addN}));var u=n(/*! ./all */"./node_modules/@tensorflow/tfjs-core/dist/ops/all.js");n.d(t,"all",(function(){return u.all}));var d=n(/*! ./any */"./node_modules/@tensorflow/tfjs-core/dist/ops/any.js");n.d(t,"any",(function(){return d.any}));var l=n(/*! ./arg_max */"./node_modules/@tensorflow/tfjs-core/dist/ops/arg_max.js");n.d(t,"argMax",(function(){return l.argMax}));var c=n(/*! ./arg_min */"./node_modules/@tensorflow/tfjs-core/dist/ops/arg_min.js");n.d(t,"argMin",(function(){return c.argMin}));var f=n(/*! ./asin */"./node_modules/@tensorflow/tfjs-core/dist/ops/asin.js");n.d(t,"asin",(function(){return f.asin}));var p=n(/*! ./asinh */"./node_modules/@tensorflow/tfjs-core/dist/ops/asinh.js");n.d(t,"asinh",(function(){return p.asinh}));var m=n(/*! ./atan */"./node_modules/@tensorflow/tfjs-core/dist/ops/atan.js");n.d(t,"atan",(function(){return m.atan}));var h=n(/*! ./atan2 */"./node_modules/@tensorflow/tfjs-core/dist/ops/atan2.js");n.d(t,"atan2",(function(){return h.atan2}));var b=n(/*! ./atanh */"./node_modules/@tensorflow/tfjs-core/dist/ops/atanh.js");n.d(t,"atanh",(function(){return b.atanh}));var j=n(/*! ./avg_pool */"./node_modules/@tensorflow/tfjs-core/dist/ops/avg_pool.js");n.d(t,"avgPool",(function(){return j.avgPool}));var g=n(/*! ./avg_pool_3d */"./node_modules/@tensorflow/tfjs-core/dist/ops/avg_pool_3d.js");n.d(t,"avgPool3d",(function(){return g.avgPool3d}));var w=n(/*! ./basic_lstm_cell */"./node_modules/@tensorflow/tfjs-core/dist/ops/basic_lstm_cell.js");n.d(t,"basicLSTMCell",(function(){return w.basicLSTMCell}));var _=n(/*! ./batch_to_space_nd */"./node_modules/@tensorflow/tfjs-core/dist/ops/batch_to_space_nd.js");n.d(t,"batchToSpaceND",(function(){return _.batchToSpaceND}));var k=n(/*! ./batchnorm */"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm.js");n.d(t,"batchNorm",(function(){return k.batchNorm}));var v=n(/*! ./batchnorm2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm2d.js");n.d(t,"batchNorm2d",(function(){return v.batchNorm2d}));var x=n(/*! ./batchnorm3d */"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm3d.js");n.d(t,"batchNorm3d",(function(){return x.batchNorm3d}));var y=n(/*! ./batchnorm4d */"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm4d.js");n.d(t,"batchNorm4d",(function(){return y.batchNorm4d}));var O=n(/*! ./bincount */"./node_modules/@tensorflow/tfjs-core/dist/ops/bincount.js");n.d(t,"bincount",(function(){return O.bincount}));var I=n(/*! ./broadcast_to */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_to.js");n.d(t,"broadcastTo",(function(){return I.broadcastTo}));var C=n(/*! ./buffer */"./node_modules/@tensorflow/tfjs-core/dist/ops/buffer.js");n.d(t,"buffer",(function(){return C.buffer}));var S=n(/*! ./cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js");n.d(t,"cast",(function(){return S.cast}));var T=n(/*! ./ceil */"./node_modules/@tensorflow/tfjs-core/dist/ops/ceil.js");n.d(t,"ceil",(function(){return T.ceil}));var N=n(/*! ./clip_by_value */"./node_modules/@tensorflow/tfjs-core/dist/ops/clip_by_value.js");n.d(t,"clipByValue",(function(){return N.clipByValue}));var E=n(/*! ./clone */"./node_modules/@tensorflow/tfjs-core/dist/ops/clone.js");n.d(t,"clone",(function(){return E.clone}));var A=n(/*! ./complex */"./node_modules/@tensorflow/tfjs-core/dist/ops/complex.js");n.d(t,"complex",(function(){return A.complex}));var R=n(/*! ./concat */"./node_modules/@tensorflow/tfjs-core/dist/ops/concat.js");n.d(t,"concat",(function(){return R.concat}));var F=n(/*! ./concat_1d */"./node_modules/@tensorflow/tfjs-core/dist/ops/concat_1d.js");n.d(t,"concat1d",(function(){return F.concat1d}));var M=n(/*! ./concat_2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/concat_2d.js");n.d(t,"concat2d",(function(){return M.concat2d}));var $=n(/*! ./concat_3d */"./node_modules/@tensorflow/tfjs-core/dist/ops/concat_3d.js");n.d(t,"concat3d",(function(){return $.concat3d}));var D=n(/*! ./concat_4d */"./node_modules/@tensorflow/tfjs-core/dist/ops/concat_4d.js");n.d(t,"concat4d",(function(){return D.concat4d}));var P=n(/*! ./conv1d */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv1d.js");n.d(t,"conv1d",(function(){return P.conv1d}));var B=n(/*! ./conv2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d.js");n.d(t,"conv2d",(function(){return B.conv2d}));var L=n(/*! ./conv2d_transpose */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d_transpose.js");n.d(t,"conv2dTranspose",(function(){return L.conv2dTranspose}));var z=n(/*! ./conv3d */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv3d.js");n.d(t,"conv3d",(function(){return z.conv3d}));var G=n(/*! ./conv3d_transpose */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv3d_transpose.js");n.d(t,"conv3dTranspose",(function(){return G.conv3dTranspose}));var U=n(/*! ./cos */"./node_modules/@tensorflow/tfjs-core/dist/ops/cos.js");n.d(t,"cos",(function(){return U.cos}));var W=n(/*! ./cosh */"./node_modules/@tensorflow/tfjs-core/dist/ops/cosh.js");n.d(t,"cosh",(function(){return W.cosh}));var V=n(/*! ./cumsum */"./node_modules/@tensorflow/tfjs-core/dist/ops/cumsum.js");n.d(t,"cumsum",(function(){return V.cumsum}));var q=n(/*! ./dense_bincount */"./node_modules/@tensorflow/tfjs-core/dist/ops/dense_bincount.js");n.d(t,"denseBincount",(function(){return q.denseBincount}));var H=n(/*! ./depth_to_space */"./node_modules/@tensorflow/tfjs-core/dist/ops/depth_to_space.js");n.d(t,"depthToSpace",(function(){return H.depthToSpace}));var K=n(/*! ./depthwise_conv2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d.js");n.d(t,"depthwiseConv2d",(function(){return K.depthwiseConv2d}));var X=n(/*! ./diag */"./node_modules/@tensorflow/tfjs-core/dist/ops/diag.js");n.d(t,"diag",(function(){return X.diag}));var Y=n(/*! ./dilation2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/dilation2d.js");n.d(t,"dilation2d",(function(){return Y.dilation2d}));var Z=n(/*! ./div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js");n.d(t,"div",(function(){return Z.div}));var Q=n(/*! ./div_no_nan */"./node_modules/@tensorflow/tfjs-core/dist/ops/div_no_nan.js");n.d(t,"divNoNan",(function(){return Q.divNoNan}));var J=n(/*! ./dot */"./node_modules/@tensorflow/tfjs-core/dist/ops/dot.js");n.d(t,"dot",(function(){return J.dot}));var ee=n(/*! ./einsum */"./node_modules/@tensorflow/tfjs-core/dist/ops/einsum.js");n.d(t,"einsum",(function(){return ee.einsum}));var te=n(/*! ./elu */"./node_modules/@tensorflow/tfjs-core/dist/ops/elu.js");n.d(t,"elu",(function(){return te.elu}));var ne=n(/*! ./equal */"./node_modules/@tensorflow/tfjs-core/dist/ops/equal.js");n.d(t,"equal",(function(){return ne.equal}));var se=n(/*! ./erf */"./node_modules/@tensorflow/tfjs-core/dist/ops/erf.js");n.d(t,"erf",(function(){return se.erf}));var oe=n(/*! ./exp */"./node_modules/@tensorflow/tfjs-core/dist/ops/exp.js");n.d(t,"exp",(function(){return oe.exp}));var re=n(/*! ./expand_dims */"./node_modules/@tensorflow/tfjs-core/dist/ops/expand_dims.js");n.d(t,"expandDims",(function(){return re.expandDims}));var ie=n(/*! ./expm1 */"./node_modules/@tensorflow/tfjs-core/dist/ops/expm1.js");n.d(t,"expm1",(function(){return ie.expm1}));var ae=n(/*! ./eye */"./node_modules/@tensorflow/tfjs-core/dist/ops/eye.js");n.d(t,"eye",(function(){return ae.eye}));var ue=n(/*! ./fill */"./node_modules/@tensorflow/tfjs-core/dist/ops/fill.js");n.d(t,"fill",(function(){return ue.fill}));var de=n(/*! ./floor */"./node_modules/@tensorflow/tfjs-core/dist/ops/floor.js");n.d(t,"floor",(function(){return de.floor}));var le=n(/*! ./floorDiv */"./node_modules/@tensorflow/tfjs-core/dist/ops/floorDiv.js");n.d(t,"floorDiv",(function(){return le.floorDiv}));var ce=n(/*! ./gather */"./node_modules/@tensorflow/tfjs-core/dist/ops/gather.js");n.d(t,"gather",(function(){return ce.gather}));var fe=n(/*! ./greater */"./node_modules/@tensorflow/tfjs-core/dist/ops/greater.js");n.d(t,"greater",(function(){return fe.greater}));var pe=n(/*! ./greater_equal */"./node_modules/@tensorflow/tfjs-core/dist/ops/greater_equal.js");n.d(t,"greaterEqual",(function(){return pe.greaterEqual}));var me=n(/*! ./imag */"./node_modules/@tensorflow/tfjs-core/dist/ops/imag.js");n.d(t,"imag",(function(){return me.imag}));var he=n(/*! ./is_finite */"./node_modules/@tensorflow/tfjs-core/dist/ops/is_finite.js");n.d(t,"isFinite",(function(){return he.isFinite}));var be=n(/*! ./is_inf */"./node_modules/@tensorflow/tfjs-core/dist/ops/is_inf.js");n.d(t,"isInf",(function(){return be.isInf}));var je=n(/*! ./is_nan */"./node_modules/@tensorflow/tfjs-core/dist/ops/is_nan.js");n.d(t,"isNaN",(function(){return je.isNaN}));var ge=n(/*! ./leaky_relu */"./node_modules/@tensorflow/tfjs-core/dist/ops/leaky_relu.js");n.d(t,"leakyRelu",(function(){return ge.leakyRelu}));var we=n(/*! ./less */"./node_modules/@tensorflow/tfjs-core/dist/ops/less.js");n.d(t,"less",(function(){return we.less}));var _e=n(/*! ./less_equal */"./node_modules/@tensorflow/tfjs-core/dist/ops/less_equal.js");n.d(t,"lessEqual",(function(){return _e.lessEqual}));var ke=n(/*! ./linspace */"./node_modules/@tensorflow/tfjs-core/dist/ops/linspace.js");n.d(t,"linspace",(function(){return ke.linspace}));var ve=n(/*! ./local_response_normalization */"./node_modules/@tensorflow/tfjs-core/dist/ops/local_response_normalization.js");n.d(t,"localResponseNormalization",(function(){return ve.localResponseNormalization}));var xe=n(/*! ./log */"./node_modules/@tensorflow/tfjs-core/dist/ops/log.js");n.d(t,"log",(function(){return xe.log}));var ye=n(/*! ./log1p */"./node_modules/@tensorflow/tfjs-core/dist/ops/log1p.js");n.d(t,"log1p",(function(){return ye.log1p}));var Oe=n(/*! ./log_sigmoid */"./node_modules/@tensorflow/tfjs-core/dist/ops/log_sigmoid.js");n.d(t,"logSigmoid",(function(){return Oe.logSigmoid}));var Ie=n(/*! ./log_softmax */"./node_modules/@tensorflow/tfjs-core/dist/ops/log_softmax.js");n.d(t,"logSoftmax",(function(){return Ie.logSoftmax}));var Ce=n(/*! ./log_sum_exp */"./node_modules/@tensorflow/tfjs-core/dist/ops/log_sum_exp.js");n.d(t,"logSumExp",(function(){return Ce.logSumExp}));var Se=n(/*! ./logical_and */"./node_modules/@tensorflow/tfjs-core/dist/ops/logical_and.js");n.d(t,"logicalAnd",(function(){return Se.logicalAnd}));var Te=n(/*! ./logical_not */"./node_modules/@tensorflow/tfjs-core/dist/ops/logical_not.js");n.d(t,"logicalNot",(function(){return Te.logicalNot}));var Ne=n(/*! ./logical_or */"./node_modules/@tensorflow/tfjs-core/dist/ops/logical_or.js");n.d(t,"logicalOr",(function(){return Ne.logicalOr}));var Ee=n(/*! ./logical_xor */"./node_modules/@tensorflow/tfjs-core/dist/ops/logical_xor.js");n.d(t,"logicalXor",(function(){return Ee.logicalXor}));var Ae=n(/*! ./mat_mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mat_mul.js");n.d(t,"matMul",(function(){return Ae.matMul}));var Re=n(/*! ./max */"./node_modules/@tensorflow/tfjs-core/dist/ops/max.js");n.d(t,"max",(function(){return Re.max}));var Fe=n(/*! ./max_pool */"./node_modules/@tensorflow/tfjs-core/dist/ops/max_pool.js");n.d(t,"maxPool",(function(){return Fe.maxPool}));var Me=n(/*! ./max_pool_3d */"./node_modules/@tensorflow/tfjs-core/dist/ops/max_pool_3d.js");n.d(t,"maxPool3d",(function(){return Me.maxPool3d}));var $e=n(/*! ./max_pool_with_argmax */"./node_modules/@tensorflow/tfjs-core/dist/ops/max_pool_with_argmax.js");n.d(t,"maxPoolWithArgmax",(function(){return $e.maxPoolWithArgmax}));var De=n(/*! ./maximum */"./node_modules/@tensorflow/tfjs-core/dist/ops/maximum.js");n.d(t,"maximum",(function(){return De.maximum}));var Pe=n(/*! ./mean */"./node_modules/@tensorflow/tfjs-core/dist/ops/mean.js");n.d(t,"mean",(function(){return Pe.mean}));var Be=n(/*! ./meshgrid */"./node_modules/@tensorflow/tfjs-core/dist/ops/meshgrid.js");n.d(t,"meshgrid",(function(){return Be.meshgrid}));var Le=n(/*! ./min */"./node_modules/@tensorflow/tfjs-core/dist/ops/min.js");n.d(t,"min",(function(){return Le.min}));var ze=n(/*! ./minimum */"./node_modules/@tensorflow/tfjs-core/dist/ops/minimum.js");n.d(t,"minimum",(function(){return ze.minimum}));var Ge=n(/*! ./mirror_pad */"./node_modules/@tensorflow/tfjs-core/dist/ops/mirror_pad.js");n.d(t,"mirrorPad",(function(){return Ge.mirrorPad}));var Ue=n(/*! ./mod */"./node_modules/@tensorflow/tfjs-core/dist/ops/mod.js");n.d(t,"mod",(function(){return Ue.mod}));var We=n(/*! ./moments */"./node_modules/@tensorflow/tfjs-core/dist/ops/moments.js");n.d(t,"moments",(function(){return We.moments}));var Ve=n(/*! ./mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js");n.d(t,"mul",(function(){return Ve.mul}));var qe=n(/*! ./multi_rnn_cell */"./node_modules/@tensorflow/tfjs-core/dist/ops/multi_rnn_cell.js");n.d(t,"multiRNNCell",(function(){return qe.multiRNNCell}));var He=n(/*! ./multinomial */"./node_modules/@tensorflow/tfjs-core/dist/ops/multinomial.js");n.d(t,"multinomial",(function(){return He.multinomial}));var Ke=n(/*! ./neg */"./node_modules/@tensorflow/tfjs-core/dist/ops/neg.js");n.d(t,"neg",(function(){return Ke.neg}));var Xe=n(/*! ./not_equal */"./node_modules/@tensorflow/tfjs-core/dist/ops/not_equal.js");n.d(t,"notEqual",(function(){return Xe.notEqual}));var Ye=n(/*! ./one_hot */"./node_modules/@tensorflow/tfjs-core/dist/ops/one_hot.js");n.d(t,"oneHot",(function(){return Ye.oneHot}));var Ze=n(/*! ./ones */"./node_modules/@tensorflow/tfjs-core/dist/ops/ones.js");n.d(t,"ones",(function(){return Ze.ones}));var Qe=n(/*! ./ones_like */"./node_modules/@tensorflow/tfjs-core/dist/ops/ones_like.js");n.d(t,"onesLike",(function(){return Qe.onesLike}));var Je=n(/*! ./outer_product */"./node_modules/@tensorflow/tfjs-core/dist/ops/outer_product.js");n.d(t,"outerProduct",(function(){return Je.outerProduct}));var et=n(/*! ./pad */"./node_modules/@tensorflow/tfjs-core/dist/ops/pad.js");n.d(t,"pad",(function(){return et.pad}));var tt=n(/*! ./pad1d */"./node_modules/@tensorflow/tfjs-core/dist/ops/pad1d.js");n.d(t,"pad1d",(function(){return tt.pad1d}));var nt=n(/*! ./pad2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/pad2d.js");n.d(t,"pad2d",(function(){return nt.pad2d}));var st=n(/*! ./pad3d */"./node_modules/@tensorflow/tfjs-core/dist/ops/pad3d.js");n.d(t,"pad3d",(function(){return st.pad3d}));var ot=n(/*! ./pad4d */"./node_modules/@tensorflow/tfjs-core/dist/ops/pad4d.js");n.d(t,"pad4d",(function(){return ot.pad4d}));var rt=n(/*! ./pool */"./node_modules/@tensorflow/tfjs-core/dist/ops/pool.js");n.d(t,"pool",(function(){return rt.pool}));var it=n(/*! ./pow */"./node_modules/@tensorflow/tfjs-core/dist/ops/pow.js");n.d(t,"pow",(function(){return it.pow}));var at=n(/*! ./prelu */"./node_modules/@tensorflow/tfjs-core/dist/ops/prelu.js");n.d(t,"prelu",(function(){return at.prelu}));var ut=n(/*! ./print */"./node_modules/@tensorflow/tfjs-core/dist/ops/print.js");n.d(t,"print",(function(){return ut.print}));var dt=n(/*! ./prod */"./node_modules/@tensorflow/tfjs-core/dist/ops/prod.js");n.d(t,"prod",(function(){return dt.prod}));var lt=n(/*! ./rand */"./node_modules/@tensorflow/tfjs-core/dist/ops/rand.js");n.d(t,"rand",(function(){return lt.rand}));var ct=n(/*! ./random_gamma */"./node_modules/@tensorflow/tfjs-core/dist/ops/random_gamma.js");n.d(t,"randomGamma",(function(){return ct.randomGamma}));var ft=n(/*! ./random_normal */"./node_modules/@tensorflow/tfjs-core/dist/ops/random_normal.js");n.d(t,"randomNormal",(function(){return ft.randomNormal}));var pt=n(/*! ./random_uniform */"./node_modules/@tensorflow/tfjs-core/dist/ops/random_uniform.js");n.d(t,"randomUniform",(function(){return pt.randomUniform}));var mt=n(/*! ./range */"./node_modules/@tensorflow/tfjs-core/dist/ops/range.js");n.d(t,"range",(function(){return mt.range}));var ht=n(/*! ./real */"./node_modules/@tensorflow/tfjs-core/dist/ops/real.js");n.d(t,"real",(function(){return ht.real}));var bt=n(/*! ./reciprocal */"./node_modules/@tensorflow/tfjs-core/dist/ops/reciprocal.js");n.d(t,"reciprocal",(function(){return bt.reciprocal}));var jt=n(/*! ./relu */"./node_modules/@tensorflow/tfjs-core/dist/ops/relu.js");n.d(t,"relu",(function(){return jt.relu}));var gt=n(/*! ./relu6 */"./node_modules/@tensorflow/tfjs-core/dist/ops/relu6.js");n.d(t,"relu6",(function(){return gt.relu6}));var wt=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");n.d(t,"reshape",(function(){return wt.reshape}));var _t=n(/*! ./reverse */"./node_modules/@tensorflow/tfjs-core/dist/ops/reverse.js");n.d(t,"reverse",(function(){return _t.reverse}));var kt=n(/*! ./reverse_1d */"./node_modules/@tensorflow/tfjs-core/dist/ops/reverse_1d.js");n.d(t,"reverse1d",(function(){return kt.reverse1d}));var vt=n(/*! ./reverse_2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/reverse_2d.js");n.d(t,"reverse2d",(function(){return vt.reverse2d}));var xt=n(/*! ./reverse_3d */"./node_modules/@tensorflow/tfjs-core/dist/ops/reverse_3d.js");n.d(t,"reverse3d",(function(){return xt.reverse3d}));var yt=n(/*! ./reverse_4d */"./node_modules/@tensorflow/tfjs-core/dist/ops/reverse_4d.js");n.d(t,"reverse4d",(function(){return yt.reverse4d}));var Ot=n(/*! ./round */"./node_modules/@tensorflow/tfjs-core/dist/ops/round.js");n.d(t,"round",(function(){return Ot.round}));var It=n(/*! ./rsqrt */"./node_modules/@tensorflow/tfjs-core/dist/ops/rsqrt.js");n.d(t,"rsqrt",(function(){return It.rsqrt}));var Ct=n(/*! ./scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js");n.d(t,"scalar",(function(){return Ct.scalar}));var St=n(/*! ./selu */"./node_modules/@tensorflow/tfjs-core/dist/ops/selu.js");n.d(t,"selu",(function(){return St.selu}));var Tt=n(/*! ./separable_conv2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/separable_conv2d.js");n.d(t,"separableConv2d",(function(){return Tt.separableConv2d}));var Nt=n(/*! ./setdiff1d_async */"./node_modules/@tensorflow/tfjs-core/dist/ops/setdiff1d_async.js");n.d(t,"setdiff1dAsync",(function(){return Nt.setdiff1dAsync}));var Et=n(/*! ./sigmoid */"./node_modules/@tensorflow/tfjs-core/dist/ops/sigmoid.js");n.d(t,"sigmoid",(function(){return Et.sigmoid}));var At=n(/*! ./sign */"./node_modules/@tensorflow/tfjs-core/dist/ops/sign.js");n.d(t,"sign",(function(){return At.sign}));var Rt=n(/*! ./sin */"./node_modules/@tensorflow/tfjs-core/dist/ops/sin.js");n.d(t,"sin",(function(){return Rt.sin}));var Ft=n(/*! ./sinh */"./node_modules/@tensorflow/tfjs-core/dist/ops/sinh.js");n.d(t,"sinh",(function(){return Ft.sinh}));var Mt=n(/*! ./slice */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice.js");n.d(t,"slice",(function(){return Mt.slice}));var $t=n(/*! ./slice1d */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice1d.js");n.d(t,"slice1d",(function(){return $t.slice1d}));var Dt=n(/*! ./slice2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice2d.js");n.d(t,"slice2d",(function(){return Dt.slice2d}));var Pt=n(/*! ./slice3d */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice3d.js");n.d(t,"slice3d",(function(){return Pt.slice3d}));var Bt=n(/*! ./slice4d */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice4d.js");n.d(t,"slice4d",(function(){return Bt.slice4d}));var Lt=n(/*! ./softmax */"./node_modules/@tensorflow/tfjs-core/dist/ops/softmax.js");n.d(t,"softmax",(function(){return Lt.softmax}));var zt=n(/*! ./softplus */"./node_modules/@tensorflow/tfjs-core/dist/ops/softplus.js");n.d(t,"softplus",(function(){return zt.softplus}));var Gt=n(/*! ./space_to_batch_nd */"./node_modules/@tensorflow/tfjs-core/dist/ops/space_to_batch_nd.js");n.d(t,"spaceToBatchND",(function(){return Gt.spaceToBatchND}));var Ut=n(/*! ./spectral/fft */"./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/fft.js");n.d(t,"fft",(function(){return Ut.fft}));var Wt=n(/*! ./spectral/ifft */"./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/ifft.js");n.d(t,"ifft",(function(){return Wt.ifft}));var Vt=n(/*! ./spectral/irfft */"./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/irfft.js");n.d(t,"irfft",(function(){return Vt.irfft}));var qt=n(/*! ./spectral/rfft */"./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/rfft.js");n.d(t,"rfft",(function(){return qt.rfft}));var Ht=n(/*! ./split */"./node_modules/@tensorflow/tfjs-core/dist/ops/split.js");n.d(t,"split",(function(){return Ht.split}));var Kt=n(/*! ./sqrt */"./node_modules/@tensorflow/tfjs-core/dist/ops/sqrt.js");n.d(t,"sqrt",(function(){return Kt.sqrt}));var Xt=n(/*! ./square */"./node_modules/@tensorflow/tfjs-core/dist/ops/square.js");n.d(t,"square",(function(){return Xt.square}));var Yt=n(/*! ./squared_difference */"./node_modules/@tensorflow/tfjs-core/dist/ops/squared_difference.js");n.d(t,"squaredDifference",(function(){return Yt.squaredDifference}));var Zt=n(/*! ./squeeze */"./node_modules/@tensorflow/tfjs-core/dist/ops/squeeze.js");n.d(t,"squeeze",(function(){return Zt.squeeze}));var Qt=n(/*! ./stack */"./node_modules/@tensorflow/tfjs-core/dist/ops/stack.js");n.d(t,"stack",(function(){return Qt.stack}));var Jt=n(/*! ./step */"./node_modules/@tensorflow/tfjs-core/dist/ops/step.js");n.d(t,"step",(function(){return Jt.step}));var en=n(/*! ./strided_slice */"./node_modules/@tensorflow/tfjs-core/dist/ops/strided_slice.js");n.d(t,"stridedSlice",(function(){return en.stridedSlice}));var tn=n(/*! ./sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js");n.d(t,"sub",(function(){return tn.sub}));var nn=n(/*! ./sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js");n.d(t,"sum",(function(){return nn.sum}));var sn=n(/*! ./tan */"./node_modules/@tensorflow/tfjs-core/dist/ops/tan.js");n.d(t,"tan",(function(){return sn.tan}));var on=n(/*! ./tanh */"./node_modules/@tensorflow/tfjs-core/dist/ops/tanh.js");n.d(t,"tanh",(function(){return on.tanh}));var rn=n(/*! ./tensor */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor.js");n.d(t,"tensor",(function(){return rn.tensor}));var an=n(/*! ./tensor1d */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor1d.js");n.d(t,"tensor1d",(function(){return an.tensor1d}));var un=n(/*! ./tensor2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor2d.js");n.d(t,"tensor2d",(function(){return un.tensor2d}));var dn=n(/*! ./tensor3d */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor3d.js");n.d(t,"tensor3d",(function(){return dn.tensor3d}));var ln=n(/*! ./tensor4d */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor4d.js");n.d(t,"tensor4d",(function(){return ln.tensor4d}));var cn=n(/*! ./tensor5d */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor5d.js");n.d(t,"tensor5d",(function(){return cn.tensor5d}));var fn=n(/*! ./tensor6d */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor6d.js");n.d(t,"tensor6d",(function(){return fn.tensor6d}));var pn=n(/*! ./tile */"./node_modules/@tensorflow/tfjs-core/dist/ops/tile.js");n.d(t,"tile",(function(){return pn.tile}));var mn=n(/*! ./topk */"./node_modules/@tensorflow/tfjs-core/dist/ops/topk.js");n.d(t,"topk",(function(){return mn.topk}));var hn=n(/*! ./truncated_normal */"./node_modules/@tensorflow/tfjs-core/dist/ops/truncated_normal.js");n.d(t,"truncatedNormal",(function(){return hn.truncatedNormal}));var bn=n(/*! ./unique */"./node_modules/@tensorflow/tfjs-core/dist/ops/unique.js");n.d(t,"unique",(function(){return bn.unique}));var jn=n(/*! ./unsorted_segment_sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/unsorted_segment_sum.js");n.d(t,"unsortedSegmentSum",(function(){return jn.unsortedSegmentSum}));var gn=n(/*! ./unstack */"./node_modules/@tensorflow/tfjs-core/dist/ops/unstack.js");n.d(t,"unstack",(function(){return gn.unstack}));var wn=n(/*! ./variable */"./node_modules/@tensorflow/tfjs-core/dist/ops/variable.js");n.d(t,"variable",(function(){return wn.variable}));var _n=n(/*! ./where */"./node_modules/@tensorflow/tfjs-core/dist/ops/where.js");n.d(t,"where",(function(){return _n.where}));var kn=n(/*! ./where_async */"./node_modules/@tensorflow/tfjs-core/dist/ops/where_async.js");n.d(t,"whereAsync",(function(){return kn.whereAsync}));var vn=n(/*! ./zeros */"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros.js");n.d(t,"zeros",(function(){return vn.zeros}));var xn=n(/*! ./zeros_like */"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js");n.d(t,"zerosLike",(function(){return xn.zerosLike}));var yn=n(/*! ./boolean_mask */"./node_modules/@tensorflow/tfjs-core/dist/ops/boolean_mask.js");n.d(t,"booleanMaskAsync",(function(){return yn.booleanMaskAsync}));var On=n(/*! ./transpose */"./node_modules/@tensorflow/tfjs-core/dist/ops/transpose.js");n.d(t,"transpose",(function(){return On.transpose}));var In=n(/*! ./norm */"./node_modules/@tensorflow/tfjs-core/dist/ops/norm.js");n.d(t,"norm",(function(){return In.norm}));var Cn=n(/*! ./moving_average */"./node_modules/@tensorflow/tfjs-core/dist/ops/moving_average.js");n.d(t,"movingAverage",(function(){return Cn.movingAverage}));var Sn=n(/*! ./scatter_nd */"./node_modules/@tensorflow/tfjs-core/dist/ops/scatter_nd.js");n.d(t,"scatterND",(function(){return Sn.scatterND}));var Tn=n(/*! ./sparse_to_dense */"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse_to_dense.js");n.d(t,"sparseToDense",(function(){return Tn.sparseToDense}));var Nn=n(/*! ./gather_nd */"./node_modules/@tensorflow/tfjs-core/dist/ops/gather_nd.js");n.d(t,"gatherND",(function(){return Nn.gatherND}));var En=n(/*! ./dropout */"./node_modules/@tensorflow/tfjs-core/dist/ops/dropout.js");n.d(t,"dropout",(function(){return En.dropout}));var An=n(/*! ./signal_ops_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/signal_ops_util.js");n.d(t,"enclosingPowerOfTwo",(function(){return An.enclosingPowerOfTwo})),n.d(t,"cosineWindow",(function(){return An.cosineWindow}));var Rn=n(/*! ./in_top_k */"./node_modules/@tensorflow/tfjs-core/dist/ops/in_top_k.js");n.d(t,"inTopKAsync",(function(){return Rn.inTopKAsync}));var Fn=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");n.d(t,"op",(function(){return Fn.op})),n.d(t,"OP_SCOPE_SUFFIX",(function(){return Fn.OP_SCOPE_SUFFIX}));var Mn=n(/*! ./fused_ops */"./node_modules/@tensorflow/tfjs-core/dist/ops/fused_ops.js");n.d(t,"fused",(function(){return Mn}));var $n=n(/*! ./signal/hamming_window */"./node_modules/@tensorflow/tfjs-core/dist/ops/signal/hamming_window.js"),Dn=n(/*! ./signal/hann_window */"./node_modules/@tensorflow/tfjs-core/dist/ops/signal/hann_window.js"),Pn=n(/*! ./signal/frame */"./node_modules/@tensorflow/tfjs-core/dist/ops/signal/frame.js"),Bn=n(/*! ./signal/stft */"./node_modules/@tensorflow/tfjs-core/dist/ops/signal/stft.js"),Ln=n(/*! ./image/crop_and_resize */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/crop_and_resize.js"),zn=n(/*! ./image/flip_left_right */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/flip_left_right.js"),Gn=n(/*! ./image/rotate_with_offset */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/rotate_with_offset.js"),Un=n(/*! ./image/non_max_suppression */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression.js"),Wn=n(/*! ./image/non_max_suppression_async */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_async.js"),Vn=n(/*! ./image/non_max_suppression_with_score */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_with_score.js"),qn=n(/*! ./image/non_max_suppression_with_score_async */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_with_score_async.js"),Hn=n(/*! ./image/non_max_suppression_padded */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_padded.js"),Kn=n(/*! ./image/non_max_suppression_padded_async */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_padded_async.js"),Xn=n(/*! ./image/resize_bilinear */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/resize_bilinear.js"),Yn=n(/*! ./image/resize_nearest_neighbor */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/resize_nearest_neighbor.js"),Zn=n(/*! ./image/threshold */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/threshold.js"),Qn=n(/*! ./image/transform */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/transform.js"),Jn=n(/*! ./linalg/band_part */"./node_modules/@tensorflow/tfjs-core/dist/ops/linalg/band_part.js"),es=n(/*! ./linalg/gram_schmidt */"./node_modules/@tensorflow/tfjs-core/dist/ops/linalg/gram_schmidt.js"),ts=n(/*! ./linalg/qr */"./node_modules/@tensorflow/tfjs-core/dist/ops/linalg/qr.js"),ns=n(/*! ./losses/absolute_difference */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/absolute_difference.js"),ss=n(/*! ./losses/compute_weighted_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js"),os=n(/*! ./losses/cosine_distance */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/cosine_distance.js"),rs=n(/*! ./losses/hinge_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/hinge_loss.js"),is=n(/*! ./losses/huber_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/huber_loss.js"),as=n(/*! ./losses/log_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/log_loss.js"),us=n(/*! ./losses/mean_squared_error */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/mean_squared_error.js"),ds=n(/*! ./losses/sigmoid_cross_entropy */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/sigmoid_cross_entropy.js"),ls=n(/*! ./losses/softmax_cross_entropy */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/softmax_cross_entropy.js"),cs=n(/*! ./sparse/sparse_fill_empty_rows */"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_fill_empty_rows.js"),fs=n(/*! ./sparse/sparse_reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_reshape.js"),ps=n(/*! ./sparse/sparse_segment_mean */"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_segment_mean.js"),ms=n(/*! ./sparse/sparse_segment_sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_segment_sum.js"),hs=n(/*! ./string/string_n_grams */"./node_modules/@tensorflow/tfjs-core/dist/ops/string/string_n_grams.js"),bs=n(/*! ./string/string_split */"./node_modules/@tensorflow/tfjs-core/dist/ops/string/string_split.js"),js=n(/*! ./string/string_to_hash_bucket_fast */"./node_modules/@tensorflow/tfjs-core/dist/ops/string/string_to_hash_bucket_fast.js"); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -15466,11 +15467,11 @@ const r="__op";function i(e){const t=Object.keys(e);if(1!==t.length)throw new Er * limitations under the License. * ============================================================================= */ -const gs={fft:Wt.fft,ifft:Ut.ifft,rfft:qt.rfft,irfft:Vt.irfft},ws={hammingWindow:Mn.hammingWindow,hannWindow:Dn.hannWindow,frame:Pn.frame,stft:Bn.stft},_s={flipLeftRight:zn.flipLeftRight,resizeNearestNeighbor:Yn.resizeNearestNeighbor,resizeBilinear:Xn.resizeBilinear,rotateWithOffset:Gn.rotateWithOffset,cropAndResize:Ln.cropAndResize,nonMaxSuppression:Wn.nonMaxSuppression,nonMaxSuppressionAsync:Un.nonMaxSuppressionAsync,nonMaxSuppressionWithScore:Vn.nonMaxSuppressionWithScore,nonMaxSuppressionWithScoreAsync:qn.nonMaxSuppressionWithScoreAsync,nonMaxSuppressionPadded:Hn.nonMaxSuppressionPadded,nonMaxSuppressionPaddedAsync:Kn.nonMaxSuppressionPaddedAsync,threshold:Zn.threshold,transform:Qn.transform},ks={bandPart:Jn.bandPart,gramSchmidt:es.gramSchmidt,qr:ts.qr},vs={absoluteDifference:ns.absoluteDifference,computeWeightedLoss:ss.computeWeightedLoss,cosineDistance:os.cosineDistance,hingeLoss:rs.hingeLoss,huberLoss:is.huberLoss,logLoss:as.logLoss,meanSquaredError:ds.meanSquaredError,sigmoidCrossEntropy:us.sigmoidCrossEntropy,softmaxCrossEntropy:ls.softmaxCrossEntropy},xs={sparseFillEmptyRows:cs.sparseFillEmptyRows,sparseReshape:fs.sparseReshape,sparseSegmentMean:ps.sparseSegmentMean,sparseSegmentSum:ms.sparseSegmentSum},ys={stringNGrams:hs.stringNGrams,stringSplit:bs.stringSplit,stringToHashBucketFast:js.stringToHashBucketFast}},"./node_modules/@tensorflow/tfjs-core/dist/ops/outer_product.js": +const gs={fft:Ut.fft,ifft:Wt.ifft,rfft:qt.rfft,irfft:Vt.irfft},ws={hammingWindow:$n.hammingWindow,hannWindow:Dn.hannWindow,frame:Pn.frame,stft:Bn.stft},_s={flipLeftRight:zn.flipLeftRight,resizeNearestNeighbor:Yn.resizeNearestNeighbor,resizeBilinear:Xn.resizeBilinear,rotateWithOffset:Gn.rotateWithOffset,cropAndResize:Ln.cropAndResize,nonMaxSuppression:Un.nonMaxSuppression,nonMaxSuppressionAsync:Wn.nonMaxSuppressionAsync,nonMaxSuppressionWithScore:Vn.nonMaxSuppressionWithScore,nonMaxSuppressionWithScoreAsync:qn.nonMaxSuppressionWithScoreAsync,nonMaxSuppressionPadded:Hn.nonMaxSuppressionPadded,nonMaxSuppressionPaddedAsync:Kn.nonMaxSuppressionPaddedAsync,threshold:Zn.threshold,transform:Qn.transform},ks={bandPart:Jn.bandPart,gramSchmidt:es.gramSchmidt,qr:ts.qr},vs={absoluteDifference:ns.absoluteDifference,computeWeightedLoss:ss.computeWeightedLoss,cosineDistance:os.cosineDistance,hingeLoss:rs.hingeLoss,huberLoss:is.huberLoss,logLoss:as.logLoss,meanSquaredError:us.meanSquaredError,sigmoidCrossEntropy:ds.sigmoidCrossEntropy,softmaxCrossEntropy:ls.softmaxCrossEntropy},xs={sparseFillEmptyRows:cs.sparseFillEmptyRows,sparseReshape:fs.sparseReshape,sparseSegmentMean:ps.sparseSegmentMean,sparseSegmentSum:ms.sparseSegmentSum},ys={stringNGrams:hs.stringNGrams,stringSplit:bs.stringSplit,stringToHashBucketFast:js.stringToHashBucketFast}},"./node_modules/@tensorflow/tfjs-core/dist/ops/outer_product.js": /*!**********************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/outer_product.js ***! \**********************************************************************/ -/*! exports provided: outerProduct */function(e,t,n){"use strict";n.r(t),n.d(t,"outerProduct",(function(){return d}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./mat_mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mat_mul.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),a=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const d=Object(i.op)({outerProduct_:function(e,t){const n=Object(s.convertToTensor)(e,"v1","outerProduct"),i=Object(s.convertToTensor)(t,"v2","outerProduct");o.assert(1===n.rank&&1===i.rank,(()=>`Error in outerProduct: inputs must be rank 1, but got ranks ${n.rank} and ${i.rank}.`));const d=Object(a.reshape)(n,[-1,1]),u=Object(a.reshape)(i,[1,-1]);return Object(r.matMul)(d,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/pad.js": +/*! exports provided: outerProduct */function(e,t,n){"use strict";n.r(t),n.d(t,"outerProduct",(function(){return u}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./mat_mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mat_mul.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),a=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const u=Object(i.op)({outerProduct_:function(e,t){const n=Object(s.convertToTensor)(e,"v1","outerProduct"),i=Object(s.convertToTensor)(t,"v2","outerProduct");o.assert(1===n.rank&&1===i.rank,(()=>`Error in outerProduct: inputs must be rank 1, but got ranks ${n.rank} and ${i.rank}.`));const u=Object(a.reshape)(n,[-1,1]),d=Object(a.reshape)(i,[1,-1]);return Object(r.matMul)(u,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/pad.js": /*!************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/pad.js ***! \************************************************************/ @@ -15491,7 +15492,7 @@ const gs={fft:Wt.fft,ifft:Ut.ifft,rfft:qt.rfft,irfft:Vt.irfft},ws={hammingWindow * limitations under the License. * ============================================================================= */ -function(e,t,n=0){const i=Object(r.convertToTensor)(e,"x","pad");if(0===i.rank)throw new Error("pad(scalar) is not defined. Pass non-scalar to pad");const a={paddings:t,constantValue:n},d={x:i};return s.ENGINE.runKernel(o.PadV2,d,a)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/pad1d.js": +function(e,t,n=0){const i=Object(r.convertToTensor)(e,"x","pad");if(0===i.rank)throw new Error("pad(scalar) is not defined. Pass non-scalar to pad");const a={paddings:t,constantValue:n},u={x:i};return s.ENGINE.runKernel(o.PadV2,u,a)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/pad1d.js": /*!**************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/pad1d.js ***! \**************************************************************/ @@ -15511,7 +15512,7 @@ function(e,t,n=0){const i=Object(r.convertToTensor)(e,"x","pad");if(0===i.rank)t /*!*************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/pool.js ***! \*************************************************************/ -/*! exports provided: pool */function(e,t,n){"use strict";n.r(t),n.d(t,"pool",(function(){return f}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./avg_pool */"./node_modules/@tensorflow/tfjs-core/dist/ops/avg_pool.js"),i=n(/*! ./batch_to_space_nd */"./node_modules/@tensorflow/tfjs-core/dist/ops/batch_to_space_nd.js"),a=n(/*! ./conv_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js"),d=n(/*! ./max_pool */"./node_modules/@tensorflow/tfjs-core/dist/ops/max_pool.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),l=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),c=n(/*! ./space_to_batch_nd */"./node_modules/@tensorflow/tfjs-core/dist/ops/space_to_batch_nd.js");const f=Object(u.op)({pool_: +/*! exports provided: pool */function(e,t,n){"use strict";n.r(t),n.d(t,"pool",(function(){return f}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./avg_pool */"./node_modules/@tensorflow/tfjs-core/dist/ops/avg_pool.js"),i=n(/*! ./batch_to_space_nd */"./node_modules/@tensorflow/tfjs-core/dist/ops/batch_to_space_nd.js"),a=n(/*! ./conv_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js"),u=n(/*! ./max_pool */"./node_modules/@tensorflow/tfjs-core/dist/ops/max_pool.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),l=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),c=n(/*! ./space_to_batch_nd */"./node_modules/@tensorflow/tfjs-core/dist/ops/space_to_batch_nd.js");const f=Object(d.op)({pool_: /** * @license * Copyright 2018 Google LLC. All Rights Reserved. @@ -15528,11 +15529,11 @@ function(e,t,n=0){const i=Object(r.convertToTensor)(e,"x","pad");if(0===i.rank)t * limitations under the License. * ============================================================================= */ -function(e,t,n,u,f,p){null==f&&(f=[1,1]),null==p&&(p=1),0===u&&(u="valid");const m=Object(s.convertToTensor)(e,"x","maxPool");let h=m,b=!1;3===m.rank&&(b=!0,h=Object(l.reshape)(m,[1,m.shape[0],m.shape[1],m.shape[2]])),o.assert(a.eitherStridesOrDilationsAreOne(p,f),(()=>`Error in pool: Either strides or dilations must be 1. Got strides ${p} and dilations '${f}'`));const j=a.computePool2DInfo(h.shape,t,p,f,u),g=[j.dilationHeight,j.dilationWidth];let w;w="same"===u?function(e,t){const n=e.map(((e,n)=>e+(e-1)*(t[n]-1))).map((e=>e-1)),s=n.map((e=>Math.floor(e/2))),o=n.map(((e,t)=>e-s[t]));return n.map(((e,t)=>[s[t],o[t]]))}([j.filterHeight,j.filterWidth],g):[[0,0],[0,0]];const _=1===g[0]&&1===g[1],[k,v]=function(e,t,n){const s=n.map((e=>e[0])),o=n.map((e=>e[1])),r=e.concat(s,o),i=t.map(((e,t)=>(e-r[t]%e)%e)),a=o.map(((e,t)=>e+i[t])),d=t.map(((e,t)=>[s[t],a[t]])),u=t.map(((e,t)=>[0,i[t]]));return[d,u]}([j.inHeight,j.inWidth],g,w),x=_?u:"valid",y=_?h:Object(c.spaceToBatchND)(h,g,k),O=("avg"===n?()=>Object(r.avgPool)(y,t,p,x):()=>Object(d.maxPool)(y,t,p,x))(),I=_?O:Object(i.batchToSpaceND)(O,g,v);return b?Object(l.reshape)(I,[I.shape[1],I.shape[2],I.shape[3]]):I}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/pow.js": +function(e,t,n,d,f,p){null==f&&(f=[1,1]),null==p&&(p=1),0===d&&(d="valid");const m=Object(s.convertToTensor)(e,"x","maxPool");let h=m,b=!1;3===m.rank&&(b=!0,h=Object(l.reshape)(m,[1,m.shape[0],m.shape[1],m.shape[2]])),o.assert(a.eitherStridesOrDilationsAreOne(p,f),(()=>`Error in pool: Either strides or dilations must be 1. Got strides ${p} and dilations '${f}'`));const j=a.computePool2DInfo(h.shape,t,p,f,d),g=[j.dilationHeight,j.dilationWidth];let w;w="same"===d?function(e,t){const n=e.map(((e,n)=>e+(e-1)*(t[n]-1))).map((e=>e-1)),s=n.map((e=>Math.floor(e/2))),o=n.map(((e,t)=>e-s[t]));return n.map(((e,t)=>[s[t],o[t]]))}([j.filterHeight,j.filterWidth],g):[[0,0],[0,0]];const _=1===g[0]&&1===g[1],[k,v]=function(e,t,n){const s=n.map((e=>e[0])),o=n.map((e=>e[1])),r=e.concat(s,o),i=t.map(((e,t)=>(e-r[t]%e)%e)),a=o.map(((e,t)=>e+i[t])),u=t.map(((e,t)=>[s[t],a[t]])),d=t.map(((e,t)=>[0,i[t]]));return[u,d]}([j.inHeight,j.inWidth],g,w),x=_?d:"valid",y=_?h:Object(c.spaceToBatchND)(h,g,k),O=("avg"===n?()=>Object(r.avgPool)(y,t,p,x):()=>Object(u.maxPool)(y,t,p,x))(),I=_?O:Object(i.batchToSpaceND)(O,g,v);return b?Object(l.reshape)(I,[I.shape[1],I.shape[2],I.shape[3]]):I}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/pow.js": /*!************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/pow.js ***! \************************************************************/ -/*! exports provided: pow */function(e,t,n){"use strict";n.r(t),n.d(t,"pow",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({pow_: +/*! exports provided: pow */function(e,t,n){"use strict";n.r(t),n.d(t,"pow",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({pow_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -15549,7 +15550,7 @@ function(e,t,n,u,f,p){null==f&&(f=[1,1]),null==p&&(p=1),0===u&&(u="valid");const * limitations under the License. * ============================================================================= */ -function(e,t){let n=Object(i.convertToTensor)(e,"base","pow"),a=Object(i.convertToTensor)(t,"exp","pow");[n,a]=Object(r.makeTypesMatch)(n,a);const d={a:n,b:a};return s.ENGINE.runKernel(o.Pow,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/prelu.js": +function(e,t){let n=Object(i.convertToTensor)(e,"base","pow"),a=Object(i.convertToTensor)(t,"exp","pow");[n,a]=Object(r.makeTypesMatch)(n,a);const u={a:n,b:a};return s.ENGINE.runKernel(o.Pow,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/prelu.js": /*!**************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/prelu.js ***! \**************************************************************/ @@ -15595,7 +15596,7 @@ function s(e,t=!1){console.log(e.toString(t))}n.r(t),n.d(t,"print",(function(){r /*!*************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/prod.js ***! \*************************************************************/ -/*! exports provided: prod */function(e,t,n){"use strict";n.r(t),n.d(t,"prod",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({prod_: +/*! exports provided: prod */function(e,t,n){"use strict";n.r(t),n.d(t,"prod",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({prod_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -15612,7 +15613,7 @@ function s(e,t=!1){console.log(e.toString(t))}n.r(t),n.d(t,"print",(function(){r * limitations under the License. * ============================================================================= */ -function(e,t=null,n=!1){let a=Object(r.convertToTensor)(e,"x","prod");"bool"===a.dtype&&(a=Object(i.cast)(a,"int32"));const d={x:a},u={axis:t,keepDims:n};return s.ENGINE.runKernel(o.Prod,d,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/rand.js": +function(e,t=null,n=!1){let a=Object(r.convertToTensor)(e,"x","prod");"bool"===a.dtype&&(a=Object(i.cast)(a,"int32"));const u={x:a},d={axis:t,keepDims:n};return s.ENGINE.runKernel(o.Prod,u,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/rand.js": /*!*************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/rand.js ***! \*************************************************************/ @@ -15637,7 +15638,7 @@ function(e,t,n){const r=Object(o.sizeFromShape)(e);let i=null;if(null==n||"float /*!******************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/rand_util.js ***! \******************************************************************/ -/*! exports provided: MPRandGauss, RandGamma, UniformRandom, jarqueBeraNormalityTest, expectArrayInMeanStdRange */function(e,t,n){"use strict";n.r(t),n.d(t,"MPRandGauss",(function(){return r})),n.d(t,"RandGamma",(function(){return i})),n.d(t,"UniformRandom",(function(){return a})),n.d(t,"jarqueBeraNormalityTest",(function(){return d})),n.d(t,"expectArrayInMeanStdRange",(function(){return u}));var s=n(/*! seedrandom */"./node_modules/seedrandom/index.js"),o=n(/*! ../test_util */"./node_modules/@tensorflow/tfjs-core/dist/test_util.js"); +/*! exports provided: MPRandGauss, RandGamma, UniformRandom, jarqueBeraNormalityTest, expectArrayInMeanStdRange */function(e,t,n){"use strict";n.r(t),n.d(t,"MPRandGauss",(function(){return r})),n.d(t,"RandGamma",(function(){return i})),n.d(t,"UniformRandom",(function(){return a})),n.d(t,"jarqueBeraNormalityTest",(function(){return u})),n.d(t,"expectArrayInMeanStdRange",(function(){return d}));var s=n(/*! seedrandom */"./node_modules/seedrandom/index.js"),o=n(/*! ../test_util */"./node_modules/@tensorflow/tfjs-core/dist/test_util.js"); /** * @license * Copyright 2018 Google LLC. All Rights Reserved. @@ -15654,7 +15655,7 @@ function(e,t,n){const r=Object(o.sizeFromShape)(e);let i=null;if(null==n||"float * limitations under the License. * ============================================================================= */ -class r{constructor(e,t,n,o,r){this.mean=e,this.stdDev=t,this.dtype=n,this.nextVal=NaN,this.truncated=o,this.truncated&&(this.upper=this.mean+2*this.stdDev,this.lower=this.mean-2*this.stdDev);const i=r||Math.random();this.random=s.alea(i.toString())}nextValue(){if(!isNaN(this.nextVal)){const e=this.nextVal;return this.nextVal=NaN,e}let e,t,n=!1;for(;!n;){let s,o,r;do{s=2*this.random()-1,o=2*this.random()-1,r=s*s+o*o}while(r>=1||0===r);const i=Math.sqrt(-2*Math.log(r)/r);e=this.mean+this.stdDev*s*i,t=this.mean+this.stdDev*o*i,this.truncated&&!this.isValidTruncated(e)||(n=!0)}return this.truncated&&!this.isValidTruncated(t)||(this.nextVal=this.convertValue(t)),this.convertValue(e)}convertValue(e){return null==this.dtype||"float32"===this.dtype?e:Math.round(e)}isValidTruncated(e){return e<=this.upper&&e>=this.lower}}class i{constructor(e,t,n,o){this.alpha=e,this.beta=1/t,this.dtype=n;const i=o||Math.random();this.randu=s.alea(i.toString()),this.randn=new r(0,1,n,!1,this.randu()),this.d=e<1?e+2/3:e-1/3,this.c=1/Math.sqrt(9*this.d)}nextValue(){let e,t,n,s,o,r;for(;;){do{s=this.randn.nextValue(),r=1+this.c*s}while(r<=0);if(r*=r*r,e=s*s,t=1-.331*e*e,n=.5*e+this.d*(1-r+Math.log(r)),o=this.randu(),onull==this.dtype||"float32"===this.dtype,this.min=e,this.range=t-e,this.dtype=n,null==o&&(o=Math.random()),"number"==typeof o&&(o=o.toString()),!this.canReturnFloat()&&this.range<=1)throw new Error(`The difference between ${e} - ${t} <= 1 and dtype is not float`);this.random=s.alea(o)}convertValue(e){return this.canReturnFloat()?e:Math.round(e)}nextValue(){return this.convertValue(this.min+this.range*this.random())}}function d(e){const t=e.length,n=function(e){const t=l(e),n=e.length;let s=0,o=0;for(let r=0;r5.991)throw new Error(`Invalid p-value for JB: ${o}`)}function u(e,t,n,s){null==s&&(s=Object(o.testEpsilon)());const r=l(e);Object(o.expectNumbersClose)(r,t,s),Object(o.expectNumbersClose)(function(e,t){let n=0;for(let s=0;s=1||0===r);const i=Math.sqrt(-2*Math.log(r)/r);e=this.mean+this.stdDev*s*i,t=this.mean+this.stdDev*o*i,this.truncated&&!this.isValidTruncated(e)||(n=!0)}return this.truncated&&!this.isValidTruncated(t)||(this.nextVal=this.convertValue(t)),this.convertValue(e)}convertValue(e){return null==this.dtype||"float32"===this.dtype?e:Math.round(e)}isValidTruncated(e){return e<=this.upper&&e>=this.lower}}class i{constructor(e,t,n,o){this.alpha=e,this.beta=1/t,this.dtype=n;const i=o||Math.random();this.randu=s.alea(i.toString()),this.randn=new r(0,1,n,!1,this.randu()),this.d=e<1?e+2/3:e-1/3,this.c=1/Math.sqrt(9*this.d)}nextValue(){let e,t,n,s,o,r;for(;;){do{s=this.randn.nextValue(),r=1+this.c*s}while(r<=0);if(r*=r*r,e=s*s,t=1-.331*e*e,n=.5*e+this.d*(1-r+Math.log(r)),o=this.randu(),onull==this.dtype||"float32"===this.dtype,this.min=e,this.range=t-e,this.dtype=n,null==o&&(o=Math.random()),"number"==typeof o&&(o=o.toString()),!this.canReturnFloat()&&this.range<=1)throw new Error(`The difference between ${e} - ${t} <= 1 and dtype is not float`);this.random=s.alea(o)}convertValue(e){return this.canReturnFloat()?e:Math.round(e)}nextValue(){return this.convertValue(this.min+this.range*this.random())}}function u(e){const t=e.length,n=function(e){const t=l(e),n=e.length;let s=0,o=0;for(let r=0;r5.991)throw new Error(`Invalid p-value for JB: ${o}`)}function d(e,t,n,s){null==s&&(s=Object(o.testEpsilon)());const r=l(e);Object(o.expectNumbersClose)(r,t,s),Object(o.expectNumbersClose)(function(e,t){let n=0;for(let s=0;s1?t.shape[t.rank-1]:1,o=t.rank>1?t.rank-1:1,r=`Must have updates.shape = indices.shape[:batchDim] + shape[sliceDim:], got updates.shape: ${n.shape}, indices.shape: ${t.shape}, shape: ${e}, sliceDim: ${s}, and batchDim: ${o}.`;if(n.rank1?t.shape[o-1]:1,i=n.length;let a=1;for(let e=r;e1?t.shape[t.rank-1]:1,o=t.rank>1?t.rank-1:1,r=`Must have updates.shape = indices.shape[:batchDim] + shape[sliceDim:], got updates.shape: ${n.shape}, indices.shape: ${t.shape}, shape: ${e}, sliceDim: ${s}, and batchDim: ${o}.`;if(n.rank1?t.shape[o-1]:1,i=n.length;let a=1;for(let e=r;et||n===e?r=!0:n=Object(s.nearestDivisor)(e,n+1);return n}function i(e,t,n){const s=[],o=e.length;for(let r=0;ro))throw new Error(`Expect batchDims in the range of [-${o}, ${o}], but got ${s}`);if(s<0&&(s+=o),s>r)throw new Error(`batchDims (${s}) must be less than rank(x) (\n ${r}).`);if(nt||n===e?r=!0:n=Object(s.nearestDivisor)(e,n+1);return n}function i(e,t,n){const s=[],o=e.length;for(let r=0;ro))throw new Error(`Expect batchDims in the range of [-${o}, ${o}], but got ${s}`);if(s<0&&(s+=o),s>r)throw new Error(`batchDims (${s}) must be less than rank(x) (\n ${r}).`);if(n`Error in separableConv2d: input must be rank 4, but got rank ${h.rank}.`)),o.assert(4===p.rank,(()=>`Error in separableConv2d: depthwise filter must be rank 4, but got rank ${p.rank}.`)),o.assert(4===m.rank,(()=>`Error in separableConv2d: pointwise filter must be rank 4, but got rank ${p.rank}.`)),o.assert(1===m.shape[0],(()=>`Error in separableConv2d: the first dimension of pointwise filter must be 1, but got ${m.shape[0]}.`)),o.assert(1===m.shape[1],(()=>`Error in separableConv2d: the second dimension of pointwise filter must be 1, but got ${m.shape[1]}.`));const j=p.shape[2],g=p.shape[3];o.assert(m.shape[2]===j*g,(()=>`Error in separableConv2d: the third dimension of pointwise filter must be ${j*g}, but got ${m.shape[2]}.`));const w=Object(i.depthwiseConv2d)(h,p,a,u,c,l),_=Object(r.conv2d)(w,m,1,"valid",c);return b?Object(d.reshape)(_,[_.shape[1],_.shape[2],_.shape[3]]):_}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/setdiff1d_async.js": +/*! exports provided: separableConv2d */function(e,t,n){"use strict";n.r(t),n.d(t,"separableConv2d",(function(){return d}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./conv2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d.js"),i=n(/*! ./depthwise_conv2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const d=Object(a.op)({separableConv2d_:function(e,t,n,a,d,l=[1,1],c="NHWC"){const f=Object(s.convertToTensor)(e,"x","separableConv2d"),p=Object(s.convertToTensor)(t,"depthwiseFilter","separableConv2d"),m=Object(s.convertToTensor)(n,"pointwiseFilter","separableConv2d");let h=f,b=!1;if(3===f.rank&&(b=!0,h=Object(u.reshape)(f,[1,f.shape[0],f.shape[1],f.shape[2]])),"NCHW"===c)throw new Error("separableConv2d currently does not support dataFormat NCHW; only NHWC is supported");o.assert(4===h.rank,(()=>`Error in separableConv2d: input must be rank 4, but got rank ${h.rank}.`)),o.assert(4===p.rank,(()=>`Error in separableConv2d: depthwise filter must be rank 4, but got rank ${p.rank}.`)),o.assert(4===m.rank,(()=>`Error in separableConv2d: pointwise filter must be rank 4, but got rank ${p.rank}.`)),o.assert(1===m.shape[0],(()=>`Error in separableConv2d: the first dimension of pointwise filter must be 1, but got ${m.shape[0]}.`)),o.assert(1===m.shape[1],(()=>`Error in separableConv2d: the second dimension of pointwise filter must be 1, but got ${m.shape[1]}.`));const j=p.shape[2],g=p.shape[3];o.assert(m.shape[2]===j*g,(()=>`Error in separableConv2d: the third dimension of pointwise filter must be ${j*g}, but got ${m.shape[2]}.`));const w=Object(i.depthwiseConv2d)(h,p,a,d,c,l),_=Object(r.conv2d)(w,m,1,"valid",c);return b?Object(u.reshape)(_,[_.shape[1],_.shape[2],_.shape[3]]):_}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/setdiff1d_async.js": /*!************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/setdiff1d_async.js ***! \************************************************************************/ @@ -16165,7 +16166,7 @@ const s=1.7580993408473768,o=1.0507009873554805},"./node_modules/@tensorflow/tfj * limitations under the License. * ============================================================================= */ -async function(e,t){const n=Object(o.convertToTensor)(e,"x","setdiff1d"),i=Object(o.convertToTensor)(t,"y","setdiff1d");r.assert(n.dtype===i.dtype,(()=>`x and y should have the same dtype, but got x (${n.dtype}) and y (${i.dtype}).`)),r.assert(1===n.rank,(()=>`x should be 1D tensor, but got x (${n.shape}).`)),r.assert(1===i.rank,(()=>`y should be 1D tensor, but got y (${i.shape}).`));const a=await n.data(),d=await i.data(),u=new Set(d);let l=0;for(let e=0;e`x and y should have the same dtype, but got x (${n.dtype}) and y (${i.dtype}).`)),r.assert(1===n.rank,(()=>`x should be 1D tensor, but got x (${n.shape}).`)),r.assert(1===i.rank,(()=>`y should be 1D tensor, but got y (${i.shape}).`));const a=await n.data(),u=await i.data(),d=new Set(u);let l=0;for(let e=0;e`Error in slice${o}D: Length of begin ${t} must match the rank of the array (${o}).`)),s.assert(o===n.length,(()=>`Error in slice${o}D: Length of size ${n} must match the rank of the array (${o}).`));for(let r=0;r`Error in slice${o}D: begin[${r}] + size[${r}] (${t[r]+n[r]}) would overflow input.shape[${r}] (${e.shape[r]})`))}function r(e){const t=[];let n=0;for(;e>0;)1&e&&t.push(n),e/=2,n++;return t}function i(e,t,n){const s=[];for(let o=0;o0){const u=t[0],l=n+1;b=c(i,u,l,s,e),j=f(d,u,l,o,e),g=a(r,u,l,e)}else for(let t=0;t-1)r[o]=0;else{const i=d(t,n,o);let a=s[i];e&1<-1)i[s]=Number.MAX_SAFE_INTEGER;else{const r=d(t,n,s);let a=o[r];e&1<0?Number.MIN_SAFE_INTEGER:Number.MAX_SAFE_INTEGER);const u=o[r];return a<0&&(a+=u),a=s.clamp(0,a,u-1),a}function h(e,t,n,o,r,i){let a=t[r];const d=n[r]||1;(e&1<0?Number.MAX_SAFE_INTEGER:Number.MIN_SAFE_INTEGER);const u=o[r];return a<0&&(a+=u),a=d>0?s.clamp(0,a,u):s.clamp(-1,a,u-1),a}function b(e,t,n){let s=n.length;for(let e=0;e1){s=e;break}for(let o=s+1;o0||n[o]!==e[o])return!1;return!0}function j(e,t){let n=e.length>0?e[e.length-1]:1;for(let s=0;s{s.assert(-1!==e,(()=>"slice() does not support negative begin indexing."))})),i=null==n?new Array(r).fill(-1):"number"==typeof n?[n,...new Array(r-1).fill(-1)]:n.lengtht>=0?t:(s.assert(-1===t,(()=>`Negative size values should be exactly -1 but got ${t} for the slice() size at index ${n}.`)),e.shape[n]-o[n]))),[o,i]}function w(e,t,n,s,o,a,d,u,c){let f=t.slice(),p=n.slice(),m=s;null==s&&(m=new Array(f.length));const h=r(d);if(h.length>1)throw new Error("Multiple ellipses in slice is not allowed.");if(0!==d&&0!==u)throw new Error("Using both ellipsisMask and newAxisMask is not yet supported.");if(0!==d&&0!==c)throw new Error("Using both ellipsisMask and shrinkAxisMask is not yet supported.");const b=e.length-f.length,j=r(u),g=e.slice();j.forEach((e=>{f[e]=0,p[e]=1,g.splice(e,0,1)}));const{begin:w,end:_,strides:k}=l(g,h,b,f,p,m,o,a,d);f=w,p=_,m=k;const v=r(c);v.forEach((e=>{p[e]=f[e]+1,m[e]=1}));const x=i(f,p,m),y=x.filter(((e,t)=>-1===v.indexOf(t)));return{nonStrided:m.every((e=>1===e)),$begin:f,$end:p,$strides:m,size:x,newShape:g,outShape:y}}},"./node_modules/@tensorflow/tfjs-core/dist/ops/softmax.js": + */function o(e,t,n){const o=e.shape.length;s.assert(o===t.length,(()=>`Error in slice${o}D: Length of begin ${t} must match the rank of the array (${o}).`)),s.assert(o===n.length,(()=>`Error in slice${o}D: Length of size ${n} must match the rank of the array (${o}).`));for(let r=0;r`Error in slice${o}D: begin[${r}] + size[${r}] (${t[r]+n[r]}) would overflow input.shape[${r}] (${e.shape[r]})`))}function r(e){const t=[];let n=0;for(;e>0;)1&e&&t.push(n),e/=2,n++;return t}function i(e,t,n){const s=[];for(let o=0;o0){const d=t[0],l=n+1;b=c(i,d,l,s,e),j=f(u,d,l,o,e),g=a(r,d,l,e)}else for(let t=0;t-1)r[o]=0;else{const i=u(t,n,o);let a=s[i];e&1<-1)i[s]=Number.MAX_SAFE_INTEGER;else{const r=u(t,n,s);let a=o[r];e&1<0?Number.MIN_SAFE_INTEGER:Number.MAX_SAFE_INTEGER);const d=o[r];return a<0&&(a+=d),a=s.clamp(0,a,d-1),a}function h(e,t,n,o,r,i){let a=t[r];const u=n[r]||1;(e&1<0?Number.MAX_SAFE_INTEGER:Number.MIN_SAFE_INTEGER);const d=o[r];return a<0&&(a+=d),a=u>0?s.clamp(0,a,d):s.clamp(-1,a,d-1),a}function b(e,t,n){let s=n.length;for(let e=0;e1){s=e;break}for(let o=s+1;o0||n[o]!==e[o])return!1;return!0}function j(e,t){let n=e.length>0?e[e.length-1]:1;for(let s=0;s{s.assert(-1!==e,(()=>"slice() does not support negative begin indexing."))})),i=null==n?new Array(r).fill(-1):"number"==typeof n?[n,...new Array(r-1).fill(-1)]:n.lengtht>=0?t:(s.assert(-1===t,(()=>`Negative size values should be exactly -1 but got ${t} for the slice() size at index ${n}.`)),e.shape[n]-o[n]))),[o,i]}function w(e,t,n,s,o,a,u,d,c){let f=t.slice(),p=n.slice(),m=s;null==s&&(m=new Array(f.length));const h=r(u);if(h.length>1)throw new Error("Multiple ellipses in slice is not allowed.");if(0!==u&&0!==d)throw new Error("Using both ellipsisMask and newAxisMask is not yet supported.");if(0!==u&&0!==c)throw new Error("Using both ellipsisMask and shrinkAxisMask is not yet supported.");const b=e.length-f.length,j=r(d),g=e.slice();j.forEach((e=>{f[e]=0,p[e]=1,g.splice(e,0,1)}));const{begin:w,end:_,strides:k}=l(g,h,b,f,p,m,o,a,u);f=w,p=_,m=k;const v=r(c);v.forEach((e=>{p[e]=f[e]+1,m[e]=1}));const x=i(f,p,m),y=x.filter(((e,t)=>-1===v.indexOf(t)));return{nonStrided:m.every((e=>1===e)),$begin:f,$end:p,$strides:m,size:x,newShape:g,outShape:y}}},"./node_modules/@tensorflow/tfjs-core/dist/ops/softmax.js": /*!****************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/softmax.js ***! \****************************************************************/ @@ -16524,7 +16525,7 @@ function(e){const t={x:Object(r.convertToTensor)(e,"x","softplus")};return s.ENG /*!**************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/space_to_batch_nd.js ***! \**************************************************************************/ -/*! exports provided: spaceToBatchND */function(e,t,n){"use strict";n.r(t),n.d(t,"spaceToBatchND",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({spaceToBatchND_: +/*! exports provided: spaceToBatchND */function(e,t,n){"use strict";n.r(t),n.d(t,"spaceToBatchND",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({spaceToBatchND_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -16541,7 +16542,7 @@ function(e){const t={x:Object(r.convertToTensor)(e,"x","softplus")};return s.ENG * limitations under the License. * ============================================================================= */ -function(e,t,n){const a=Object(r.convertToTensor)(e,"x","spaceToBatchND");i.assert(a.rank>=1+t.length,(()=>`input rank ${a.rank} should be > than [blockShape] ${t.length}`)),i.assert(n.length===t.length,(()=>`paddings.shape[0] ${n.length} must be equal to [blockShape] ${t.length}`)),i.assert(a.shape.reduce(((e,s,o)=>o>0&&o<=t.length?e&&(s+n[o-1][0]+n[o-1][1])%t[o-1]==0:e),!0),(()=>`input spatial dimensions ${a.shape.slice(1)} with paddings ${n.toString()} must be divisible by blockShapes ${t.toString()}`));const d={x:a},u={blockShape:t,paddings:n};return s.ENGINE.runKernel(o.SpaceToBatchND,d,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_fill_empty_rows.js": +function(e,t,n){const a=Object(r.convertToTensor)(e,"x","spaceToBatchND");i.assert(a.rank>=1+t.length,(()=>`input rank ${a.rank} should be > than [blockShape] ${t.length}`)),i.assert(n.length===t.length,(()=>`paddings.shape[0] ${n.length} must be equal to [blockShape] ${t.length}`)),i.assert(a.shape.reduce(((e,s,o)=>o>0&&o<=t.length?e&&(s+n[o-1][0]+n[o-1][1])%t[o-1]==0:e),!0),(()=>`input spatial dimensions ${a.shape.slice(1)} with paddings ${n.toString()} must be divisible by blockShapes ${t.toString()}`));const u={x:a},d={blockShape:t,paddings:n};return s.ENGINE.runKernel(o.SpaceToBatchND,u,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_fill_empty_rows.js": /*!**************************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_fill_empty_rows.js ***! \**************************************************************************************/ @@ -16562,7 +16563,7 @@ function(e,t,n){const a=Object(r.convertToTensor)(e,"x","spaceToBatchND");i.asse * limitations under the License. * ============================================================================= */ -function(e,t,n,i){const a=Object(r.convertToTensor)(e,"indices","sparseFillEmptyRows"),d=Object(r.convertToTensor)(t,"values","sparseFillEmptyRows"),u=Object(r.convertToTensor)(n,"denseShape","sparseFillEmptyRows"),l=Object(r.convertToTensor)(i,"defaultValue","sparseFillEmptyRows",d.dtype);if(2!==a.rank)throw new Error(`Indices should be Tensor2D but received shape\n ${a.shape}`);if(1!==d.rank)throw new Error(`Values should be Tensor1D but received shape ${d.shape}`);if(1!==u.rank)throw new Error(`Dense shape should be Tensor1D but received shape ${u.shape}`);if(0!==l.rank)throw new Error(`Default value should be a scalar but received shape ${l.shape}`);const c={indices:a,values:d,denseShape:u,defaultValue:l},f=s.ENGINE.runKernel(o.SparseFillEmptyRows,c);return{outputIndices:f[0],outputValues:f[1],emptyRowIndicator:f[2],reverseIndexMap:f[3]}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_reshape.js": +function(e,t,n,i){const a=Object(r.convertToTensor)(e,"indices","sparseFillEmptyRows"),u=Object(r.convertToTensor)(t,"values","sparseFillEmptyRows"),d=Object(r.convertToTensor)(n,"denseShape","sparseFillEmptyRows"),l=Object(r.convertToTensor)(i,"defaultValue","sparseFillEmptyRows",u.dtype);if(2!==a.rank)throw new Error(`Indices should be Tensor2D but received shape\n ${a.shape}`);if(1!==u.rank)throw new Error(`Values should be Tensor1D but received shape ${u.shape}`);if(1!==d.rank)throw new Error(`Dense shape should be Tensor1D but received shape ${d.shape}`);if(0!==l.rank)throw new Error(`Default value should be a scalar but received shape ${l.shape}`);const c={indices:a,values:u,denseShape:d,defaultValue:l},f=s.ENGINE.runKernel(o.SparseFillEmptyRows,c);return{outputIndices:f[0],outputValues:f[1],emptyRowIndicator:f[2],reverseIndexMap:f[3]}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_reshape.js": /*!******************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_reshape.js ***! \******************************************************************************/ @@ -16583,7 +16584,7 @@ function(e,t,n,i){const a=Object(r.convertToTensor)(e,"indices","sparseFillEmpty * limitations under the License. * ============================================================================= */ -function(e,t,n){const i=Object(r.convertToTensor)(e,"inputIndices","sparseReshape"),a=Object(r.convertToTensor)(t,"inputShape","sparseReshape"),d=Object(r.convertToTensor)(n,"newShape","sparseReshape");if(2!==i.rank)throw new Error(`Input indices should be Tensor2D but received shape\n ${i.shape}`);if(1!==a.rank)throw new Error(`Input shape should be Tensor1D but received shape ${a.shape}`);if(1!==d.rank)throw new Error(`New shape should be Tensor1D but received shape ${d.shape}`);const u={inputIndices:i,inputShape:a,newShape:d},l=s.ENGINE.runKernel(o.SparseReshape,u);return{outputIndices:l[0],outputShape:l[1]}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_segment_mean.js": +function(e,t,n){const i=Object(r.convertToTensor)(e,"inputIndices","sparseReshape"),a=Object(r.convertToTensor)(t,"inputShape","sparseReshape"),u=Object(r.convertToTensor)(n,"newShape","sparseReshape");if(2!==i.rank)throw new Error(`Input indices should be Tensor2D but received shape\n ${i.shape}`);if(1!==a.rank)throw new Error(`Input shape should be Tensor1D but received shape ${a.shape}`);if(1!==u.rank)throw new Error(`New shape should be Tensor1D but received shape ${u.shape}`);const d={inputIndices:i,inputShape:a,newShape:u},l=s.ENGINE.runKernel(o.SparseReshape,d);return{outputIndices:l[0],outputShape:l[1]}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_segment_mean.js": /*!***********************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_segment_mean.js ***! \***********************************************************************************/ @@ -16604,7 +16605,7 @@ function(e,t,n){const i=Object(r.convertToTensor)(e,"inputIndices","sparseReshap * limitations under the License. * ============================================================================= */ -function(e,t,n){const i=Object(r.convertToTensor)(e,"data","sparseSegmentMean"),a=Object(r.convertToTensor)(t,"indices","sparseSegmentMean"),d=Object(r.convertToTensor)(n,"segmentIds","sparseSegmentMean");if(i.rank<1)throw new Error("Data should be at least 1 dimensional but received scalar");if(1!==a.rank)throw new Error(`Indices should be Tensor1D but received shape\n ${a.shape}`);if(1!==d.rank)throw new Error(`Segment ids should be Tensor1D but received shape\n ${d.shape}`);const u={data:i,indices:a,segmentIds:d};return s.ENGINE.runKernel(o.SparseSegmentMean,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_segment_sum.js": +function(e,t,n){const i=Object(r.convertToTensor)(e,"data","sparseSegmentMean"),a=Object(r.convertToTensor)(t,"indices","sparseSegmentMean"),u=Object(r.convertToTensor)(n,"segmentIds","sparseSegmentMean");if(i.rank<1)throw new Error("Data should be at least 1 dimensional but received scalar");if(1!==a.rank)throw new Error(`Indices should be Tensor1D but received shape\n ${a.shape}`);if(1!==u.rank)throw new Error(`Segment ids should be Tensor1D but received shape\n ${u.shape}`);const d={data:i,indices:a,segmentIds:u};return s.ENGINE.runKernel(o.SparseSegmentMean,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_segment_sum.js": /*!**********************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_segment_sum.js ***! \**********************************************************************************/ @@ -16625,11 +16626,11 @@ function(e,t,n){const i=Object(r.convertToTensor)(e,"data","sparseSegmentMean"), * limitations under the License. * ============================================================================= */ -function(e,t,n){const i=Object(r.convertToTensor)(e,"data","sparseSegmentSum"),a=Object(r.convertToTensor)(t,"indices","sparseSegmentSum"),d=Object(r.convertToTensor)(n,"segmentIds","sparseSegmentSum");if(i.rank<1)throw new Error("Data should be at least 1 dimensional but received scalar");if(1!==a.rank)throw new Error(`Indices should be Tensor1D but received shape\n ${a.shape}`);if(1!==d.rank)throw new Error(`Segment ids should be Tensor1D but received shape\n ${d.shape}`);const u={data:i,indices:a,segmentIds:d};return s.ENGINE.runKernel(o.SparseSegmentSum,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse_to_dense.js": +function(e,t,n){const i=Object(r.convertToTensor)(e,"data","sparseSegmentSum"),a=Object(r.convertToTensor)(t,"indices","sparseSegmentSum"),u=Object(r.convertToTensor)(n,"segmentIds","sparseSegmentSum");if(i.rank<1)throw new Error("Data should be at least 1 dimensional but received scalar");if(1!==a.rank)throw new Error(`Indices should be Tensor1D but received shape\n ${a.shape}`);if(1!==u.rank)throw new Error(`Segment ids should be Tensor1D but received shape\n ${u.shape}`);const d={data:i,indices:a,segmentIds:u};return s.ENGINE.runKernel(o.SparseSegmentSum,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse_to_dense.js": /*!************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/sparse_to_dense.js ***! \************************************************************************/ -/*! exports provided: sparseToDense */function(e,t,n){"use strict";n.r(t),n.d(t,"sparseToDense",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../ops/sparse_to_dense_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse_to_dense_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({sparseToDense_: +/*! exports provided: sparseToDense */function(e,t,n){"use strict";n.r(t),n.d(t,"sparseToDense",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../ops/sparse_to_dense_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse_to_dense_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({sparseToDense_: /** * @license * Copyright 2018 Google LLC. All Rights Reserved. @@ -16646,7 +16647,7 @@ function(e,t,n){const i=Object(r.convertToTensor)(e,"data","sparseSegmentSum"),a * limitations under the License. * ============================================================================= */ -function(e,t,n,a=0){const d=Object(i.convertToTensor)(e,"sparseIndices","sparseToDense","int32"),u=Object(i.convertToTensor)(t,"sparseValues","sparseToDense"),l=Object(i.convertToTensor)(a,"defaultValue","sparseToDense",u.dtype);r.validateInput(d,u,n,l);const c={sparseIndices:d,sparseValues:u,defaultValue:l},f={outputShape:n};return s.ENGINE.runKernel(o.SparseToDense,c,f)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse_to_dense_util.js": +function(e,t,n,a=0){const u=Object(i.convertToTensor)(e,"sparseIndices","sparseToDense","int32"),d=Object(i.convertToTensor)(t,"sparseValues","sparseToDense"),l=Object(i.convertToTensor)(a,"defaultValue","sparseToDense",d.dtype);r.validateInput(u,d,n,l);const c={sparseIndices:u,sparseValues:d,defaultValue:l},f={outputShape:n};return s.ENGINE.runKernel(o.SparseToDense,c,f)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse_to_dense_util.js": /*!*****************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/sparse_to_dense_util.js ***! \*****************************************************************************/ @@ -16696,7 +16697,7 @@ function(e){Object(r.assert)("complex64"===e.dtype,(()=>`The dtype for tf.spectr /*!***********************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/irfft.js ***! \***********************************************************************/ -/*! exports provided: irfft */function(e,t,n){"use strict";n.r(t),n.d(t,"irfft",(function(){return m}));var s=n(/*! ../complex */"./node_modules/@tensorflow/tfjs-core/dist/ops/complex.js"),o=n(/*! ../concat */"./node_modules/@tensorflow/tfjs-core/dist/ops/concat.js"),r=n(/*! ../imag */"./node_modules/@tensorflow/tfjs-core/dist/ops/imag.js"),i=n(/*! ../mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),d=n(/*! ../real */"./node_modules/@tensorflow/tfjs-core/dist/ops/real.js"),u=n(/*! ../reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),l=n(/*! ../reverse */"./node_modules/@tensorflow/tfjs-core/dist/ops/reverse.js"),c=n(/*! ../scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),f=n(/*! ../slice */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice.js"),p=n(/*! ./ifft */"./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/ifft.js");const m=Object(a.op)({irfft_: +/*! exports provided: irfft */function(e,t,n){"use strict";n.r(t),n.d(t,"irfft",(function(){return m}));var s=n(/*! ../complex */"./node_modules/@tensorflow/tfjs-core/dist/ops/complex.js"),o=n(/*! ../concat */"./node_modules/@tensorflow/tfjs-core/dist/ops/concat.js"),r=n(/*! ../imag */"./node_modules/@tensorflow/tfjs-core/dist/ops/imag.js"),i=n(/*! ../mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ../real */"./node_modules/@tensorflow/tfjs-core/dist/ops/real.js"),d=n(/*! ../reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),l=n(/*! ../reverse */"./node_modules/@tensorflow/tfjs-core/dist/ops/reverse.js"),c=n(/*! ../scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),f=n(/*! ../slice */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice.js"),p=n(/*! ./ifft */"./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/ifft.js");const m=Object(a.op)({irfft_: /** * @license * Copyright 2018 Google LLC. All Rights Reserved. @@ -16713,11 +16714,11 @@ function(e){Object(r.assert)("complex64"===e.dtype,(()=>`The dtype for tf.spectr * limitations under the License. * ============================================================================= */ -function(e){const t=e.shape[e.shape.length-1],n=e.size/t;let a;if(t<=2){const s=Object(u.reshape)(e,[n,t]);a=Object(p.ifft)(s)}else{const m=[n,2*(t-1)],h=Object(u.reshape)(Object(d.real)(e),[n,t]),b=Object(u.reshape)(Object(r.imag)(e),[n,t]),j=Object(l.reverse)(Object(f.slice)(h,[0,1],[n,t-2]),1),g=Object(i.mul)(Object(l.reverse)(Object(f.slice)(b,[0,1],[n,t-2]),1),Object(c.scalar)(-1)),w=Object(o.concat)([h,j],1),_=Object(o.concat)([b,g],1),k=Object(u.reshape)(Object(s.complex)(w,_),[m[0],m[1]]);a=Object(p.ifft)(k)}if(a=Object(d.real)(a),3===e.rank&&0!==e.shape[0]){const t=a,n=e.shape[0];a=Object(u.reshape)(a,[n,a.shape[0]/n,a.shape[1]]),t.dispose()}return a}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/rfft.js": +function(e){const t=e.shape[e.shape.length-1],n=e.size/t;let a;if(t<=2){const s=Object(d.reshape)(e,[n,t]);a=Object(p.ifft)(s)}else{const m=[n,2*(t-1)],h=Object(d.reshape)(Object(u.real)(e),[n,t]),b=Object(d.reshape)(Object(r.imag)(e),[n,t]),j=Object(l.reverse)(Object(f.slice)(h,[0,1],[n,t-2]),1),g=Object(i.mul)(Object(l.reverse)(Object(f.slice)(b,[0,1],[n,t-2]),1),Object(c.scalar)(-1)),w=Object(o.concat)([h,j],1),_=Object(o.concat)([b,g],1),k=Object(d.reshape)(Object(s.complex)(w,_),[m[0],m[1]]);a=Object(p.ifft)(k)}if(a=Object(u.real)(a),3===e.rank&&0!==e.shape[0]){const t=a,n=e.shape[0];a=Object(d.reshape)(a,[n,a.shape[0]/n,a.shape[1]]),t.dispose()}return a}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/rfft.js": /*!**********************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/rfft.js ***! \**********************************************************************/ -/*! exports provided: rfft */function(e,t,n){"use strict";n.r(t),n.d(t,"rfft",(function(){return h}));var s=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),o=n(/*! ../complex */"./node_modules/@tensorflow/tfjs-core/dist/ops/complex.js"),r=n(/*! ../concat */"./node_modules/@tensorflow/tfjs-core/dist/ops/concat.js"),i=n(/*! ../imag */"./node_modules/@tensorflow/tfjs-core/dist/ops/imag.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),d=n(/*! ../real */"./node_modules/@tensorflow/tfjs-core/dist/ops/real.js"),u=n(/*! ../reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),l=n(/*! ../slice */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice.js"),c=n(/*! ../split */"./node_modules/@tensorflow/tfjs-core/dist/ops/split.js"),f=n(/*! ../zeros */"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros.js"),p=n(/*! ../zeros_like */"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js"),m=n(/*! ./fft */"./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/fft.js");const h=Object(a.op)({rfft_: +/*! exports provided: rfft */function(e,t,n){"use strict";n.r(t),n.d(t,"rfft",(function(){return h}));var s=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),o=n(/*! ../complex */"./node_modules/@tensorflow/tfjs-core/dist/ops/complex.js"),r=n(/*! ../concat */"./node_modules/@tensorflow/tfjs-core/dist/ops/concat.js"),i=n(/*! ../imag */"./node_modules/@tensorflow/tfjs-core/dist/ops/imag.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ../real */"./node_modules/@tensorflow/tfjs-core/dist/ops/real.js"),d=n(/*! ../reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),l=n(/*! ../slice */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice.js"),c=n(/*! ../split */"./node_modules/@tensorflow/tfjs-core/dist/ops/split.js"),f=n(/*! ../zeros */"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros.js"),p=n(/*! ../zeros_like */"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js"),m=n(/*! ./fft */"./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/fft.js");const h=Object(a.op)({rfft_: /** * @license * Copyright 2018 Google LLC. All Rights Reserved. @@ -16734,7 +16735,7 @@ function(e){const t=e.shape[e.shape.length-1],n=e.size/t;let a;if(t<=2){const s= * limitations under the License. * ============================================================================= */ -function(e,t){Object(s.assert)("float32"===e.dtype,(()=>`The dtype for rfft() must be real value but got ${e.dtype}`));let n=e.shape[e.shape.length-1];const a=e.size/n;let h;if(null!=t&&t0)),o=e.shape.map((e=>e));o[e.shape.length-1]=t,h=Object(l.slice)(e,s,o),n=t}else if(null!=t&&t>n){const s=e.shape.map((e=>e));s[e.shape.length-1]=t-n,h=Object(r.concat)([e,Object(f.zeros)(s)],e.shape.length-1),n=t}else h=e;const b=Object(p.zerosLike)(h),j=Object(u.reshape)(Object(o.complex)(h,b),[a,n]),g=Object(m.fft)(j),w=Math.floor(n/2)+1,_=Object(d.real)(g),k=Object(i.imag)(g),v=Object(c.split)(_,[w,n-w],_.shape.length-1),x=Object(c.split)(k,[w,n-w],k.shape.length-1),y=h.shape.slice();return y[h.shape.length-1]=w,Object(u.reshape)(Object(o.complex)(v[0],x[0]),y)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/split.js": +function(e,t){Object(s.assert)("float32"===e.dtype,(()=>`The dtype for rfft() must be real value but got ${e.dtype}`));let n=e.shape[e.shape.length-1];const a=e.size/n;let h;if(null!=t&&t0)),o=e.shape.map((e=>e));o[e.shape.length-1]=t,h=Object(l.slice)(e,s,o),n=t}else if(null!=t&&t>n){const s=e.shape.map((e=>e));s[e.shape.length-1]=t-n,h=Object(r.concat)([e,Object(f.zeros)(s)],e.shape.length-1),n=t}else h=e;const b=Object(p.zerosLike)(h),j=Object(d.reshape)(Object(o.complex)(h,b),[a,n]),g=Object(m.fft)(j),w=Math.floor(n/2)+1,_=Object(u.real)(g),k=Object(i.imag)(g),v=Object(c.split)(_,[w,n-w],_.shape.length-1),x=Object(c.split)(k,[w,n-w],k.shape.length-1),y=h.shape.slice();return y[h.shape.length-1]=w,Object(d.reshape)(Object(o.complex)(v[0],x[0]),y)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/split.js": /*!**************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/split.js ***! \**************************************************************/ @@ -16805,7 +16806,7 @@ function(e){const t=Object(o.convertToTensor)(e,"x","square");return s.ENGINE.ru /*!***************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/squared_difference.js ***! \***************************************************************************/ -/*! exports provided: squaredDifference */function(e,t,n){"use strict";n.r(t),n.d(t,"squaredDifference",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(d.op)({squaredDifference_: +/*! exports provided: squaredDifference */function(e,t,n){"use strict";n.r(t),n.d(t,"squaredDifference",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(u.op)({squaredDifference_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -16822,7 +16823,7 @@ function(e){const t=Object(o.convertToTensor)(e,"x","square");return s.ENGINE.ru * limitations under the License. * ============================================================================= */ -function(e,t){let n=Object(i.convertToTensor)(e,"a","squaredDifference"),d=Object(i.convertToTensor)(t,"b","squaredDifference");[n,d]=Object(r.makeTypesMatch)(n,d),Object(a.assertAndGetBroadcastShape)(n.shape,d.shape);const u={a:n,b:d};return s.ENGINE.runKernel(o.SquaredDifference,u,{})}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/squeeze.js": +function(e,t){let n=Object(i.convertToTensor)(e,"a","squaredDifference"),u=Object(i.convertToTensor)(t,"b","squaredDifference");[n,u]=Object(r.makeTypesMatch)(n,u),Object(a.assertAndGetBroadcastShape)(n.shape,u.shape);const d={a:n,b:u};return s.ENGINE.runKernel(o.SquaredDifference,d,{})}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/squeeze.js": /*!****************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/squeeze.js ***! \****************************************************************/ @@ -16847,7 +16848,7 @@ function(e,t){const n=Object(s.convertToTensor)(e,"x","squeeze");return Object(i /*!**************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/stack.js ***! \**************************************************************/ -/*! exports provided: stack */function(e,t,n){"use strict";n.r(t),n.d(t,"stack",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({stack_: +/*! exports provided: stack */function(e,t,n){"use strict";n.r(t),n.d(t,"stack",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({stack_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -16864,7 +16865,7 @@ function(e,t){const n=Object(s.convertToTensor)(e,"x","squeeze");return Object(i * limitations under the License. * ============================================================================= */ -function(e,t=0){const n=Object(r.convertToTensorArray)(e,"tensors","stack","string_or_numeric");i.assert(n.length>=1,(()=>"Pass at least one tensor to tf.stack")),n.length>0&&i.assert(t<=n[0].rank,(()=>"Axis must be <= rank of the tensor"));const a=n,d={axis:t};return s.ENGINE.runKernel(o.Pack,a,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/step.js": +function(e,t=0){const n=Object(r.convertToTensorArray)(e,"tensors","stack","string_or_numeric");i.assert(n.length>=1,(()=>"Pass at least one tensor to tf.stack")),n.length>0&&i.assert(t<=n[0].rank,(()=>"Axis must be <= rank of the tensor"));const a=n,u={axis:t};return s.ENGINE.runKernel(o.Pack,a,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/step.js": /*!*************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/step.js ***! \*************************************************************/ @@ -16906,7 +16907,7 @@ function(e,t=0){const n={x:Object(r.convertToTensor)(e,"x","step")},i={alpha:t}; * limitations under the License. * ============================================================================= */ -function(e,t,n,i,a=0,d=0,u=0,l=0,c=0){const f={x:Object(r.convertToTensor)(e,"x","stridedSlice","string_or_numeric")},p={begin:t,end:n,strides:i,beginMask:a,endMask:d,ellipsisMask:u,newAxisMask:l,shrinkAxisMask:c};return s.ENGINE.runKernel(o.StridedSlice,f,p)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/string/string_n_grams.js": +function(e,t,n,i,a=0,u=0,d=0,l=0,c=0){const f={x:Object(r.convertToTensor)(e,"x","stridedSlice","string_or_numeric")},p={begin:t,end:n,strides:i,beginMask:a,endMask:u,ellipsisMask:d,newAxisMask:l,shrinkAxisMask:c};return s.ENGINE.runKernel(o.StridedSlice,f,p)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/string/string_n_grams.js": /*!******************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/string/string_n_grams.js ***! \******************************************************************************/ @@ -16927,7 +16928,7 @@ function(e,t,n,i,a=0,d=0,u=0,l=0,c=0){const f={x:Object(r.convertToTensor)(e,"x" * limitations under the License. * ============================================================================= */ -function(e,t,n,i,a,d,u,l){const c=Object(r.convertToTensor)(e,"data","stringNGrams","string");if("string"!==c.dtype)throw new Error("Data must be of datatype string");if(1!==c.shape.length)throw new Error(`Data must be a vector, saw: ${c.shape}`);const f=Object(r.convertToTensor)(t,"dataSplits","stringNGrams");if("int32"!==f.dtype)throw new Error("Data splits must be of datatype int32");const p={separator:n,nGramWidths:i,leftPad:a,rightPad:d,padWidth:u,preserveShortSequences:l},m={data:c,dataSplits:f},h=s.ENGINE.runKernel(o.StringNGrams,m,p);return{nGrams:h[0],nGramsSplits:h[1]}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/string/string_split.js": +function(e,t,n,i,a,u,d,l){const c=Object(r.convertToTensor)(e,"data","stringNGrams","string");if("string"!==c.dtype)throw new Error("Data must be of datatype string");if(1!==c.shape.length)throw new Error(`Data must be a vector, saw: ${c.shape}`);const f=Object(r.convertToTensor)(t,"dataSplits","stringNGrams");if("int32"!==f.dtype)throw new Error("Data splits must be of datatype int32");const p={separator:n,nGramWidths:i,leftPad:a,rightPad:u,padWidth:d,preserveShortSequences:l},m={data:c,dataSplits:f},h=s.ENGINE.runKernel(o.StringNGrams,m,p);return{nGrams:h[0],nGramsSplits:h[1]}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/string/string_split.js": /*!****************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/string/string_split.js ***! \****************************************************************************/ @@ -16948,7 +16949,7 @@ function(e,t,n,i,a,d,u,l){const c=Object(r.convertToTensor)(e,"data","stringNGra * limitations under the License. * ============================================================================= */ -function(e,t,n=!0){const i=Object(r.convertToTensor)(e,"input","stringSplit","string"),a=Object(r.convertToTensor)(t,"delimiter","stringSplit","string");if(1!==i.rank)throw new Error(`Input should be Tensor1D but received shape ${i.shape}`);if(0!==a.rank)throw new Error(`Delimiter should be a scalar but received shape ${a.shape}`);const d={skipEmpty:n},u={input:i,delimiter:a},l=s.ENGINE.runKernel(o.StringSplit,u,d);return{indices:l[0],values:l[1],shape:l[2]}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/string/string_to_hash_bucket_fast.js": +function(e,t,n=!0){const i=Object(r.convertToTensor)(e,"input","stringSplit","string"),a=Object(r.convertToTensor)(t,"delimiter","stringSplit","string");if(1!==i.rank)throw new Error(`Input should be Tensor1D but received shape ${i.shape}`);if(0!==a.rank)throw new Error(`Delimiter should be a scalar but received shape ${a.shape}`);const u={skipEmpty:n},d={input:i,delimiter:a},l=s.ENGINE.runKernel(o.StringSplit,d,u);return{indices:l[0],values:l[1],shape:l[2]}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/string/string_to_hash_bucket_fast.js": /*!******************************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/string/string_to_hash_bucket_fast.js ***! \******************************************************************************************/ @@ -16973,7 +16974,7 @@ function(e,t){const n=Object(r.convertToTensor)(e,"input","stringToHashBucketFas /*!************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js ***! \************************************************************/ -/*! exports provided: sub */function(e,t,n){"use strict";n.r(t),n.d(t,"sub",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({sub_: +/*! exports provided: sub */function(e,t,n){"use strict";n.r(t),n.d(t,"sub",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({sub_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -16990,11 +16991,11 @@ function(e,t){const n=Object(r.convertToTensor)(e,"input","stringToHashBucketFas * limitations under the License. * ============================================================================= */ -function(e,t){let n=Object(i.convertToTensor)(e,"a","sub"),a=Object(i.convertToTensor)(t,"b","sub");[n,a]=Object(r.makeTypesMatch)(n,a);const d={a:n,b:a};return s.ENGINE.runKernel(o.Sub,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js": +function(e,t){let n=Object(i.convertToTensor)(e,"a","sub"),a=Object(i.convertToTensor)(t,"b","sub");[n,a]=Object(r.makeTypesMatch)(n,a);const u={a:n,b:a};return s.ENGINE.runKernel(o.Sub,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js": /*!************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js ***! \************************************************************/ -/*! exports provided: sum */function(e,t,n){"use strict";n.r(t),n.d(t,"sum",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({sum_: +/*! exports provided: sum */function(e,t,n){"use strict";n.r(t),n.d(t,"sum",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({sum_: /** * @license * Copyright 2018 Google LLC. All Rights Reserved. @@ -17011,7 +17012,7 @@ function(e,t){let n=Object(i.convertToTensor)(e,"a","sub"),a=Object(i.convertToT * limitations under the License. * ============================================================================= */ -function(e,t=null,n=!1){let a=Object(r.convertToTensor)(e,"x","sum");"bool"===a.dtype&&(a=Object(i.cast)(a,"int32"));const d={x:a},u={axis:t,keepDims:n};return s.ENGINE.runKernel(o.Sum,d,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/tan.js": +function(e,t=null,n=!1){let a=Object(r.convertToTensor)(e,"x","sum");"bool"===a.dtype&&(a=Object(i.cast)(a,"int32"));const u={x:a},d={axis:t,keepDims:n};return s.ENGINE.runKernel(o.Sum,u,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/tan.js": /*!************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/tan.js ***! \************************************************************/ @@ -17225,7 +17226,7 @@ function r(e,t,n,r){if(null==r&&(r=Object(o.inferDtype)(e)),"complex64"===r)thro /*!*************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/tile.js ***! \*************************************************************/ -/*! exports provided: tile */function(e,t,n){"use strict";n.r(t),n.d(t,"tile",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({tile_: +/*! exports provided: tile */function(e,t,n){"use strict";n.r(t),n.d(t,"tile",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({tile_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -17242,7 +17243,7 @@ function r(e,t,n,r){if(null==r&&(r=Object(o.inferDtype)(e)),"complex64"===r)thro * limitations under the License. * ============================================================================= */ -function(e,t){const n=Object(r.convertToTensor)(e,"x","tile","string_or_numeric");i.assert(n.rank===t.length,(()=>`Error in transpose: rank of input ${n.rank} must match length of reps ${t}.`));const a={x:n},d={reps:t};return s.ENGINE.runKernel(o.Tile,a,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/topk.js": +function(e,t){const n=Object(r.convertToTensor)(e,"x","tile","string_or_numeric");i.assert(n.rank===t.length,(()=>`Error in transpose: rank of input ${n.rank} must match length of reps ${t}.`));const a={x:n},u={reps:t};return s.ENGINE.runKernel(o.Tile,a,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/topk.js": /*!*************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/topk.js ***! \*************************************************************/ @@ -17263,11 +17264,11 @@ function(e,t){const n=Object(r.convertToTensor)(e,"x","tile","string_or_numeric" * limitations under the License. * ============================================================================= */ -function(e,t=1,n=!0){const i=Object(r.convertToTensor)(e,"x","topk");if(0===i.rank)throw new Error("topk() expects the input to be of rank 1 or higher");const a=i.shape[i.shape.length-1];if(t<0)throw new Error(`'k' passed to topk() must be >= 0 but got ${t}`);if(t>a)throw new Error(`'k' passed to topk() must be <= the last dimension (${a}) but got ${t}`);const d={x:i},u={k:t,sorted:n},[l,c]=s.ENGINE.runKernel(o.TopK,d,u);return{values:l,indices:c}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/transpose.js": +function(e,t=1,n=!0){const i=Object(r.convertToTensor)(e,"x","topk");if(0===i.rank)throw new Error("topk() expects the input to be of rank 1 or higher");const a=i.shape[i.shape.length-1];if(t<0)throw new Error(`'k' passed to topk() must be >= 0 but got ${t}`);if(t>a)throw new Error(`'k' passed to topk() must be <= the last dimension (${a}) but got ${t}`);const u={x:i},d={k:t,sorted:n},[l,c]=s.ENGINE.runKernel(o.TopK,u,d);return{values:l,indices:c}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/transpose.js": /*!******************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/transpose.js ***! \******************************************************************/ -/*! exports provided: transpose */function(e,t,n){"use strict";n.r(t),n.d(t,"transpose",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({transpose_: +/*! exports provided: transpose */function(e,t,n){"use strict";n.r(t),n.d(t,"transpose",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({transpose_: /** * @license * Copyright 2018 Google LLC. All Rights Reserved. @@ -17284,7 +17285,7 @@ function(e,t=1,n=!0){const i=Object(r.convertToTensor)(e,"x","topk");if(0===i.ra * limitations under the License. * ============================================================================= */ -function(e,t){const n=Object(r.convertToTensor)(e,"x","transpose");if(null==t&&(t=n.shape.map(((e,t)=>t)).reverse()),i.assert(n.rank===t.length,(()=>`Error in transpose: rank of input ${n.rank} must match length of perm ${t}.`)),t.forEach((e=>{i.assert(e>=0&&e"All entries in 'perm' must be between 0 and "+(n.rank-1)+` but got ${t}`))})),n.rank<=1)return n.clone();const a={x:n},d={perm:t};return s.ENGINE.runKernel(o.Transpose,a,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/truncated_normal.js": +function(e,t){const n=Object(r.convertToTensor)(e,"x","transpose");if(null==t&&(t=n.shape.map(((e,t)=>t)).reverse()),i.assert(n.rank===t.length,(()=>`Error in transpose: rank of input ${n.rank} must match length of perm ${t}.`)),t.forEach((e=>{i.assert(e>=0&&e"All entries in 'perm' must be between 0 and "+(n.rank-1)+` but got ${t}`))})),n.rank<=1)return n.clone();const a={x:n},u={perm:t};return s.ENGINE.runKernel(o.Transpose,a,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/truncated_normal.js": /*!*************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/truncated_normal.js ***! \*************************************************************************/ @@ -17305,11 +17306,11 @@ function(e,t){const n=Object(r.convertToTensor)(e,"x","transpose");if(null==t&&( * limitations under the License. * ============================================================================= */ -function(e,t=0,n=1,o,i){if(null!=o&&"bool"===o)throw new Error("Unsupported data type $ { dtype }");const a=new r.MPRandGauss(t,n,o,!0,i),d=Object(s.buffer)(e,o);for(let e=0;e0,(()=>"The input tensor must be at least 1D"));const a={x:n},d={axis:t},[u,l]=s.ENGINE.runKernel(o.Unique,a,d);return{values:u,indices:l}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/unsorted_segment_sum.js": +function(e,t=0){const n=Object(r.convertToTensor)(e,"x","unique","string_or_numeric");Object(i.assert)(n.rank>0,(()=>"The input tensor must be at least 1D"));const a={x:n},u={axis:t},[d,l]=s.ENGINE.runKernel(o.Unique,a,u);return{values:d,indices:l}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/unsorted_segment_sum.js": /*!*****************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/unsorted_segment_sum.js ***! \*****************************************************************************/ -/*! exports provided: unsortedSegmentSum */function(e,t,n){"use strict";n.r(t),n.d(t,"unsortedSegmentSum",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({unsortedSegmentSum_: +/*! exports provided: unsortedSegmentSum */function(e,t,n){"use strict";n.r(t),n.d(t,"unsortedSegmentSum",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({unsortedSegmentSum_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -17347,11 +17348,11 @@ function(e,t=0){const n=Object(r.convertToTensor)(e,"x","unique","string_or_nume * limitations under the License. * ============================================================================= */ -function(e,t,n){const a=Object(r.convertToTensor)(e,"x","unsortedSegmentSum"),d=Object(r.convertToTensor)(t,"segmentIds","unsortedSegmentSum","int32");Object(i.assert)(Object(i.isInt)(n),(()=>"numSegments must be of dtype int"));const u={x:a,segmentIds:d},l={numSegments:n};return s.ENGINE.runKernel(o.UnsortedSegmentSum,u,l)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/unstack.js": +function(e,t,n){const a=Object(r.convertToTensor)(e,"x","unsortedSegmentSum"),u=Object(r.convertToTensor)(t,"segmentIds","unsortedSegmentSum","int32");Object(i.assert)(Object(i.isInt)(n),(()=>"numSegments must be of dtype int"));const d={x:a,segmentIds:u},l={numSegments:n};return s.ENGINE.runKernel(o.UnsortedSegmentSum,d,l)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/unstack.js": /*!****************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/unstack.js ***! \****************************************************************/ -/*! exports provided: unstack */function(e,t,n){"use strict";n.r(t),n.d(t,"unstack",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(a.op)({unstack_: +/*! exports provided: unstack */function(e,t,n){"use strict";n.r(t),n.d(t,"unstack",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({unstack_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -17368,7 +17369,7 @@ function(e,t,n){const a=Object(r.convertToTensor)(e,"x","unsortedSegmentSum"),d= * limitations under the License. * ============================================================================= */ -function(e,t=0){const n=Object(r.convertToTensor)(e,"x","unstack","string_or_numeric");i.assert(t>=-n.shape.length&&t`Axis = ${t} is not in [-${n.shape.length}, ${n.shape.length})`));const a={value:n},d={axis:t};return s.ENGINE.runKernel(o.Unpack,a,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/variable.js": +function(e,t=0){const n=Object(r.convertToTensor)(e,"x","unstack","string_or_numeric");i.assert(t>=-n.shape.length&&t`Axis = ${t} is not in [-${n.shape.length}, ${n.shape.length})`));const a={value:n},u={axis:t};return s.ENGINE.runKernel(o.Unpack,a,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/variable.js": /*!*****************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/variable.js ***! \*****************************************************************/ @@ -17392,7 +17393,7 @@ function(e,t=0){const n=Object(r.convertToTensor)(e,"x","unstack","string_or_num /*!**************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/where.js ***! \**************************************************************/ -/*! exports provided: where */function(e,t,n){"use strict";n.r(t),n.d(t,"where",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./broadcast_to */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_to.js"),a=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(d.op)({where_: +/*! exports provided: where */function(e,t,n){"use strict";n.r(t),n.d(t,"where",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./broadcast_to */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_to.js"),a=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(u.op)({where_: /** * @license * Copyright 2020 Google LLC. All Rights Reserved. @@ -17409,7 +17410,7 @@ function(e,t=0){const n=Object(r.convertToTensor)(e,"x","unstack","string_or_num * limitations under the License. * ============================================================================= */ -function(e,t,n){const d=Object(r.convertToTensor)(t,"a","where"),u=Object(r.convertToTensor)(n,"b","where"),l=Object(r.convertToTensor)(e,"condition","where","bool"),c=Object(a.assertAndGetBroadcastShape)(Object(a.assertAndGetBroadcastShape)(l.shape,d.shape),u.shape),f={condition:Object(i.broadcastTo)(l,c),t:Object(i.broadcastTo)(d,c),e:Object(i.broadcastTo)(u,c)};return s.ENGINE.runKernel(o.Select,f)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/where_async.js": +function(e,t,n){const u=Object(r.convertToTensor)(t,"a","where"),d=Object(r.convertToTensor)(n,"b","where"),l=Object(r.convertToTensor)(e,"condition","where","bool"),c=Object(a.assertAndGetBroadcastShape)(Object(a.assertAndGetBroadcastShape)(l.shape,u.shape),d.shape),f={condition:Object(i.broadcastTo)(l,c),t:Object(i.broadcastTo)(u,c),e:Object(i.broadcastTo)(d,c)};return s.ENGINE.runKernel(o.Select,f)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/where_async.js": /*!********************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/where_async.js ***! \********************************************************************/ @@ -17476,7 +17477,7 @@ function(e){const t={x:Object(r.convertToTensor)(e,"x","zerosLike")};return s.EN /*!**********************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/optimizers/adadelta_optimizer.js ***! \**********************************************************************************/ -/*! exports provided: AdadeltaOptimizer */function(e,t,n){"use strict";n.r(t),n.d(t,"AdadeltaOptimizer",(function(){return p}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../globals */"./node_modules/@tensorflow/tfjs-core/dist/globals.js"),r=n(/*! ../ops/add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),i=n(/*! ../ops/div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),a=n(/*! ../ops/mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),d=n(/*! ../ops/ops */"./node_modules/@tensorflow/tfjs-core/dist/ops/ops.js"),u=n(/*! ../ops/square */"./node_modules/@tensorflow/tfjs-core/dist/ops/square.js"),l=n(/*! ../ops/zeros_like */"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js"),c=n(/*! ../serialization */"./node_modules/@tensorflow/tfjs-core/dist/serialization.js"),f=n(/*! ./optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer.js"); +/*! exports provided: AdadeltaOptimizer */function(e,t,n){"use strict";n.r(t),n.d(t,"AdadeltaOptimizer",(function(){return p}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../globals */"./node_modules/@tensorflow/tfjs-core/dist/globals.js"),r=n(/*! ../ops/add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),i=n(/*! ../ops/div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),a=n(/*! ../ops/mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),u=n(/*! ../ops/ops */"./node_modules/@tensorflow/tfjs-core/dist/ops/ops.js"),d=n(/*! ../ops/square */"./node_modules/@tensorflow/tfjs-core/dist/ops/square.js"),l=n(/*! ../ops/zeros_like */"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js"),c=n(/*! ../serialization */"./node_modules/@tensorflow/tfjs-core/dist/serialization.js"),f=n(/*! ./optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer.js"); /** * @license * Copyright 2018 Google LLC. All Rights Reserved. @@ -17493,11 +17494,11 @@ function(e){const t={x:Object(r.convertToTensor)(e,"x","zerosLike")};return s.EN * limitations under the License. * ============================================================================= */ -class p extends f.Optimizer{constructor(e,t,n=null){super(),this.learningRate=e,this.rho=t,this.epsilon=n,this.accumulatedGrads=[],this.accumulatedUpdates=[],null==n&&(this.epsilon=s.ENGINE.backend.epsilon())}applyGradients(e){(Array.isArray(e)?e.map((e=>e.name)):Object.keys(e)).forEach(((t,n)=>{const c=s.ENGINE.registeredVariables[t];null==this.accumulatedGrads[n]&&(this.accumulatedGrads[n]={originalName:`${t}/accum_grad`,variable:Object(o.tidy)((()=>Object(l.zerosLike)(c).variable(false)))}),null==this.accumulatedUpdates[n]&&(this.accumulatedUpdates[n]={originalName:`${t}/accum_var`,variable:Object(o.tidy)((()=>Object(l.zerosLike)(c).variable(false)))});const f=Array.isArray(e)?e[n].tensor:e[t];if(null==f)return;const p=this.accumulatedGrads[n].variable,m=this.accumulatedUpdates[n].variable;Object(o.tidy)((()=>{const e=Object(r.add)(Object(a.mul)(p,this.rho),Object(a.mul)(Object(u.square)(f),1-this.rho)),t=Object(a.mul)(Object(i.div)(Object(d.sqrt)(Object(r.add)(m,this.epsilon)),Object(d.sqrt)(Object(r.add)(p,this.epsilon))),f),n=Object(r.add)(Object(a.mul)(m,this.rho),Object(a.mul)(Object(u.square)(t),1-this.rho));p.assign(e),m.assign(n);const s=Object(r.add)(Object(a.mul)(t,-this.learningRate),c);c.assign(s)}))})),this.incrementIterations()}dispose(){null!=this.accumulatedUpdates&&(Object(o.dispose)(this.accumulatedGrads.map((e=>e.variable))),Object(o.dispose)(this.accumulatedUpdates.map((e=>e.variable))))}async getWeights(){const e=[...this.accumulatedGrads,...this.accumulatedUpdates];return[await this.saveIterations()].concat(e.map((e=>({name:e.originalName,tensor:e.variable}))))}async setWeights(e){const t=(e=await this.extractIterations(e)).length/2;this.accumulatedGrads=e.slice(0,t).map((e=>({originalName:e.name,variable:e.tensor.variable(false)}))),this.accumulatedUpdates=e.slice(t,2*t).map((e=>({originalName:e.name,variable:e.tensor.variable(false)})))}getConfig(){return{learningRate:this.learningRate,rho:this.rho,epsilon:this.epsilon}}static fromConfig(e,t){return new e(t.learningRate,t.rho,t.epsilon)}}p.className="Adadelta",Object(c.registerClass)(p)},"./node_modules/@tensorflow/tfjs-core/dist/optimizers/adagrad_optimizer.js": +class p extends f.Optimizer{constructor(e,t,n=null){super(),this.learningRate=e,this.rho=t,this.epsilon=n,this.accumulatedGrads=[],this.accumulatedUpdates=[],null==n&&(this.epsilon=s.ENGINE.backend.epsilon())}applyGradients(e){(Array.isArray(e)?e.map((e=>e.name)):Object.keys(e)).forEach(((t,n)=>{const c=s.ENGINE.registeredVariables[t];null==this.accumulatedGrads[n]&&(this.accumulatedGrads[n]={originalName:`${t}/accum_grad`,variable:Object(o.tidy)((()=>Object(l.zerosLike)(c).variable(false)))}),null==this.accumulatedUpdates[n]&&(this.accumulatedUpdates[n]={originalName:`${t}/accum_var`,variable:Object(o.tidy)((()=>Object(l.zerosLike)(c).variable(false)))});const f=Array.isArray(e)?e[n].tensor:e[t];if(null==f)return;const p=this.accumulatedGrads[n].variable,m=this.accumulatedUpdates[n].variable;Object(o.tidy)((()=>{const e=Object(r.add)(Object(a.mul)(p,this.rho),Object(a.mul)(Object(d.square)(f),1-this.rho)),t=Object(a.mul)(Object(i.div)(Object(u.sqrt)(Object(r.add)(m,this.epsilon)),Object(u.sqrt)(Object(r.add)(p,this.epsilon))),f),n=Object(r.add)(Object(a.mul)(m,this.rho),Object(a.mul)(Object(d.square)(t),1-this.rho));p.assign(e),m.assign(n);const s=Object(r.add)(Object(a.mul)(t,-this.learningRate),c);c.assign(s)}))})),this.incrementIterations()}dispose(){null!=this.accumulatedUpdates&&(Object(o.dispose)(this.accumulatedGrads.map((e=>e.variable))),Object(o.dispose)(this.accumulatedUpdates.map((e=>e.variable))))}async getWeights(){const e=[...this.accumulatedGrads,...this.accumulatedUpdates];return[await this.saveIterations()].concat(e.map((e=>({name:e.originalName,tensor:e.variable}))))}async setWeights(e){const t=(e=await this.extractIterations(e)).length/2;this.accumulatedGrads=e.slice(0,t).map((e=>({originalName:e.name,variable:e.tensor.variable(false)}))),this.accumulatedUpdates=e.slice(t,2*t).map((e=>({originalName:e.name,variable:e.tensor.variable(false)})))}getConfig(){return{learningRate:this.learningRate,rho:this.rho,epsilon:this.epsilon}}static fromConfig(e,t){return new e(t.learningRate,t.rho,t.epsilon)}}p.className="Adadelta",Object(c.registerClass)(p)},"./node_modules/@tensorflow/tfjs-core/dist/optimizers/adagrad_optimizer.js": /*!*********************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/optimizers/adagrad_optimizer.js ***! \*********************************************************************************/ -/*! exports provided: AdagradOptimizer */function(e,t,n){"use strict";n.r(t),n.d(t,"AdagradOptimizer",(function(){return p}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../globals */"./node_modules/@tensorflow/tfjs-core/dist/globals.js"),r=n(/*! ../ops/add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),i=n(/*! ../ops/div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),a=n(/*! ../ops/fill */"./node_modules/@tensorflow/tfjs-core/dist/ops/fill.js"),d=n(/*! ../ops/mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),u=n(/*! ../ops/sqrt */"./node_modules/@tensorflow/tfjs-core/dist/ops/sqrt.js"),l=n(/*! ../ops/square */"./node_modules/@tensorflow/tfjs-core/dist/ops/square.js"),c=n(/*! ../serialization */"./node_modules/@tensorflow/tfjs-core/dist/serialization.js"),f=n(/*! ./optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer.js"); +/*! exports provided: AdagradOptimizer */function(e,t,n){"use strict";n.r(t),n.d(t,"AdagradOptimizer",(function(){return p}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../globals */"./node_modules/@tensorflow/tfjs-core/dist/globals.js"),r=n(/*! ../ops/add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),i=n(/*! ../ops/div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),a=n(/*! ../ops/fill */"./node_modules/@tensorflow/tfjs-core/dist/ops/fill.js"),u=n(/*! ../ops/mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),d=n(/*! ../ops/sqrt */"./node_modules/@tensorflow/tfjs-core/dist/ops/sqrt.js"),l=n(/*! ../ops/square */"./node_modules/@tensorflow/tfjs-core/dist/ops/square.js"),c=n(/*! ../serialization */"./node_modules/@tensorflow/tfjs-core/dist/serialization.js"),f=n(/*! ./optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer.js"); /** * @license * Copyright 2018 Google LLC. All Rights Reserved. @@ -17514,11 +17515,11 @@ class p extends f.Optimizer{constructor(e,t,n=null){super(),this.learningRate=e, * limitations under the License. * ============================================================================= */ -class p extends f.Optimizer{constructor(e,t=.1){super(),this.learningRate=e,this.initialAccumulatorValue=t,this.accumulatedGrads=[]}applyGradients(e){(Array.isArray(e)?e.map((e=>e.name)):Object.keys(e)).forEach(((t,n)=>{const c=s.ENGINE.registeredVariables[t];if(null==this.accumulatedGrads[n]){const e=!1;this.accumulatedGrads[n]={originalName:`${t}/accumulator`,variable:Object(o.tidy)((()=>Object(a.fill)(c.shape,this.initialAccumulatorValue).variable(e)))}}const f=Array.isArray(e)?e[n].tensor:e[t];if(null==f)return;const p=this.accumulatedGrads[n].variable;Object(o.tidy)((()=>{const e=Object(r.add)(p,Object(l.square)(f));p.assign(e);const t=Object(r.add)(Object(d.mul)(Object(i.div)(f,Object(u.sqrt)(Object(r.add)(e,s.ENGINE.backend.epsilon()))),-this.learningRate),c);c.assign(t)}))})),this.incrementIterations()}dispose(){null!=this.accumulatedGrads&&Object(o.dispose)(this.accumulatedGrads.map((e=>e.variable)))}async getWeights(){return[await this.saveIterations()].concat(this.accumulatedGrads.map((e=>({name:e.originalName,tensor:e.variable}))))}async setWeights(e){e=await this.extractIterations(e);this.accumulatedGrads=e.map((e=>({originalName:e.name,variable:e.tensor.variable(false)})))}getConfig(){return{learningRate:this.learningRate,initialAccumulatorValue:this.initialAccumulatorValue}}static fromConfig(e,t){return new e(t.learningRate,t.initialAccumulatorValue)}}p.className="Adagrad",Object(c.registerClass)(p)},"./node_modules/@tensorflow/tfjs-core/dist/optimizers/adam_optimizer.js": +class p extends f.Optimizer{constructor(e,t=.1){super(),this.learningRate=e,this.initialAccumulatorValue=t,this.accumulatedGrads=[]}applyGradients(e){(Array.isArray(e)?e.map((e=>e.name)):Object.keys(e)).forEach(((t,n)=>{const c=s.ENGINE.registeredVariables[t];if(null==this.accumulatedGrads[n]){const e=!1;this.accumulatedGrads[n]={originalName:`${t}/accumulator`,variable:Object(o.tidy)((()=>Object(a.fill)(c.shape,this.initialAccumulatorValue).variable(e)))}}const f=Array.isArray(e)?e[n].tensor:e[t];if(null==f)return;const p=this.accumulatedGrads[n].variable;Object(o.tidy)((()=>{const e=Object(r.add)(p,Object(l.square)(f));p.assign(e);const t=Object(r.add)(Object(u.mul)(Object(i.div)(f,Object(d.sqrt)(Object(r.add)(e,s.ENGINE.backend.epsilon()))),-this.learningRate),c);c.assign(t)}))})),this.incrementIterations()}dispose(){null!=this.accumulatedGrads&&Object(o.dispose)(this.accumulatedGrads.map((e=>e.variable)))}async getWeights(){return[await this.saveIterations()].concat(this.accumulatedGrads.map((e=>({name:e.originalName,tensor:e.variable}))))}async setWeights(e){e=await this.extractIterations(e);this.accumulatedGrads=e.map((e=>({originalName:e.name,variable:e.tensor.variable(false)})))}getConfig(){return{learningRate:this.learningRate,initialAccumulatorValue:this.initialAccumulatorValue}}static fromConfig(e,t){return new e(t.learningRate,t.initialAccumulatorValue)}}p.className="Adagrad",Object(c.registerClass)(p)},"./node_modules/@tensorflow/tfjs-core/dist/optimizers/adam_optimizer.js": /*!******************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/optimizers/adam_optimizer.js ***! \******************************************************************************/ -/*! exports provided: AdamOptimizer */function(e,t,n){"use strict";n.r(t),n.d(t,"AdamOptimizer",(function(){return b}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../globals */"./node_modules/@tensorflow/tfjs-core/dist/globals.js"),r=n(/*! ../ops/add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),i=n(/*! ../ops/div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),a=n(/*! ../ops/mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),d=n(/*! ../ops/pow */"./node_modules/@tensorflow/tfjs-core/dist/ops/pow.js"),u=n(/*! ../ops/scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),l=n(/*! ../ops/sqrt */"./node_modules/@tensorflow/tfjs-core/dist/ops/sqrt.js"),c=n(/*! ../ops/square */"./node_modules/@tensorflow/tfjs-core/dist/ops/square.js"),f=n(/*! ../ops/sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),p=n(/*! ../ops/zeros_like */"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js"),m=n(/*! ../serialization */"./node_modules/@tensorflow/tfjs-core/dist/serialization.js"),h=n(/*! ./optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer.js"); +/*! exports provided: AdamOptimizer */function(e,t,n){"use strict";n.r(t),n.d(t,"AdamOptimizer",(function(){return b}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../globals */"./node_modules/@tensorflow/tfjs-core/dist/globals.js"),r=n(/*! ../ops/add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),i=n(/*! ../ops/div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),a=n(/*! ../ops/mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),u=n(/*! ../ops/pow */"./node_modules/@tensorflow/tfjs-core/dist/ops/pow.js"),d=n(/*! ../ops/scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),l=n(/*! ../ops/sqrt */"./node_modules/@tensorflow/tfjs-core/dist/ops/sqrt.js"),c=n(/*! ../ops/square */"./node_modules/@tensorflow/tfjs-core/dist/ops/square.js"),f=n(/*! ../ops/sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),p=n(/*! ../ops/zeros_like */"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js"),m=n(/*! ../serialization */"./node_modules/@tensorflow/tfjs-core/dist/serialization.js"),h=n(/*! ./optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer.js"); /** * @license * Copyright 2018 Google LLC. All Rights Reserved. @@ -17535,11 +17536,11 @@ class p extends f.Optimizer{constructor(e,t=.1){super(),this.learningRate=e,this * limitations under the License. * ============================================================================= */ -class b extends h.Optimizer{constructor(e,t,n,r=null){super(),this.learningRate=e,this.beta1=t,this.beta2=n,this.epsilon=r,this.accumulatedFirstMoment=[],this.accumulatedSecondMoment=[],Object(o.tidy)((()=>{this.accBeta1=Object(u.scalar)(t).variable(),this.accBeta2=Object(u.scalar)(n).variable()})),null==r&&(this.epsilon=s.ENGINE.backend.epsilon())}applyGradients(e){const t=Array.isArray(e)?e.map((e=>e.name)):Object.keys(e);Object(o.tidy)((()=>{const n=Object(f.sub)(1,this.accBeta1),d=Object(f.sub)(1,this.accBeta2);t.forEach(((t,u)=>{const f=s.ENGINE.registeredVariables[t];null==this.accumulatedFirstMoment[u]&&(this.accumulatedFirstMoment[u]={originalName:`${t}/m`,variable:Object(o.tidy)((()=>Object(p.zerosLike)(f).variable(false)))}),null==this.accumulatedSecondMoment[u]&&(this.accumulatedSecondMoment[u]={originalName:`${t}/v`,variable:Object(o.tidy)((()=>Object(p.zerosLike)(f).variable(false)))});const m=Array.isArray(e)?e[u].tensor:e[t];if(null==m)return;const h=this.accumulatedFirstMoment[u].variable,b=this.accumulatedSecondMoment[u].variable,j=Object(r.add)(Object(a.mul)(h,this.beta1),Object(a.mul)(m,1-this.beta1)),g=Object(r.add)(Object(a.mul)(b,this.beta2),Object(a.mul)(Object(c.square)(m),1-this.beta2)),w=Object(i.div)(j,n),_=Object(i.div)(g,d);h.assign(j),b.assign(g);const k=Object(r.add)(Object(a.mul)(Object(i.div)(w,Object(r.add)(Object(l.sqrt)(_),this.epsilon)),-this.learningRate),f);f.assign(k)})),this.accBeta1.assign(Object(a.mul)(this.accBeta1,this.beta1)),this.accBeta2.assign(Object(a.mul)(this.accBeta2,this.beta2))})),this.incrementIterations()}dispose(){this.accBeta1.dispose(),this.accBeta2.dispose(),null!=this.accumulatedFirstMoment&&Object(o.dispose)(this.accumulatedFirstMoment.map((e=>e.variable))),null!=this.accumulatedSecondMoment&&Object(o.dispose)(this.accumulatedSecondMoment.map((e=>e.variable)))}async getWeights(){const e=[...this.accumulatedFirstMoment,...this.accumulatedSecondMoment];return[await this.saveIterations()].concat(e.map((e=>({name:e.originalName,tensor:e.variable}))))}async setWeights(e){e=await this.extractIterations(e),Object(o.tidy)((()=>{this.accBeta1.assign(Object(d.pow)(this.beta1,this.iterations_+1)),this.accBeta2.assign(Object(d.pow)(this.beta2,this.iterations_+1))}));const t=e.length/2;this.accumulatedFirstMoment=e.slice(0,t).map((e=>({originalName:e.name,variable:e.tensor.variable(false)}))),this.accumulatedSecondMoment=e.slice(t,2*t).map((e=>({originalName:e.name,variable:e.tensor.variable(false)})))}getConfig(){return{learningRate:this.learningRate,beta1:this.beta1,beta2:this.beta2,epsilon:this.epsilon}}static fromConfig(e,t){return new e(t.learningRate,t.beta1,t.beta2,t.epsilon)}}b.className="Adam",Object(m.registerClass)(b)},"./node_modules/@tensorflow/tfjs-core/dist/optimizers/adamax_optimizer.js": +class b extends h.Optimizer{constructor(e,t,n,r=null){super(),this.learningRate=e,this.beta1=t,this.beta2=n,this.epsilon=r,this.accumulatedFirstMoment=[],this.accumulatedSecondMoment=[],Object(o.tidy)((()=>{this.accBeta1=Object(d.scalar)(t).variable(),this.accBeta2=Object(d.scalar)(n).variable()})),null==r&&(this.epsilon=s.ENGINE.backend.epsilon())}applyGradients(e){const t=Array.isArray(e)?e.map((e=>e.name)):Object.keys(e);Object(o.tidy)((()=>{const n=Object(f.sub)(1,this.accBeta1),u=Object(f.sub)(1,this.accBeta2);t.forEach(((t,d)=>{const f=s.ENGINE.registeredVariables[t];null==this.accumulatedFirstMoment[d]&&(this.accumulatedFirstMoment[d]={originalName:`${t}/m`,variable:Object(o.tidy)((()=>Object(p.zerosLike)(f).variable(false)))}),null==this.accumulatedSecondMoment[d]&&(this.accumulatedSecondMoment[d]={originalName:`${t}/v`,variable:Object(o.tidy)((()=>Object(p.zerosLike)(f).variable(false)))});const m=Array.isArray(e)?e[d].tensor:e[t];if(null==m)return;const h=this.accumulatedFirstMoment[d].variable,b=this.accumulatedSecondMoment[d].variable,j=Object(r.add)(Object(a.mul)(h,this.beta1),Object(a.mul)(m,1-this.beta1)),g=Object(r.add)(Object(a.mul)(b,this.beta2),Object(a.mul)(Object(c.square)(m),1-this.beta2)),w=Object(i.div)(j,n),_=Object(i.div)(g,u);h.assign(j),b.assign(g);const k=Object(r.add)(Object(a.mul)(Object(i.div)(w,Object(r.add)(Object(l.sqrt)(_),this.epsilon)),-this.learningRate),f);f.assign(k)})),this.accBeta1.assign(Object(a.mul)(this.accBeta1,this.beta1)),this.accBeta2.assign(Object(a.mul)(this.accBeta2,this.beta2))})),this.incrementIterations()}dispose(){this.accBeta1.dispose(),this.accBeta2.dispose(),null!=this.accumulatedFirstMoment&&Object(o.dispose)(this.accumulatedFirstMoment.map((e=>e.variable))),null!=this.accumulatedSecondMoment&&Object(o.dispose)(this.accumulatedSecondMoment.map((e=>e.variable)))}async getWeights(){const e=[...this.accumulatedFirstMoment,...this.accumulatedSecondMoment];return[await this.saveIterations()].concat(e.map((e=>({name:e.originalName,tensor:e.variable}))))}async setWeights(e){e=await this.extractIterations(e),Object(o.tidy)((()=>{this.accBeta1.assign(Object(u.pow)(this.beta1,this.iterations_+1)),this.accBeta2.assign(Object(u.pow)(this.beta2,this.iterations_+1))}));const t=e.length/2;this.accumulatedFirstMoment=e.slice(0,t).map((e=>({originalName:e.name,variable:e.tensor.variable(false)}))),this.accumulatedSecondMoment=e.slice(t,2*t).map((e=>({originalName:e.name,variable:e.tensor.variable(false)})))}getConfig(){return{learningRate:this.learningRate,beta1:this.beta1,beta2:this.beta2,epsilon:this.epsilon}}static fromConfig(e,t){return new e(t.learningRate,t.beta1,t.beta2,t.epsilon)}}b.className="Adam",Object(m.registerClass)(b)},"./node_modules/@tensorflow/tfjs-core/dist/optimizers/adamax_optimizer.js": /*!********************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/optimizers/adamax_optimizer.js ***! \********************************************************************************/ -/*! exports provided: AdamaxOptimizer */function(e,t,n){"use strict";n.r(t),n.d(t,"AdamaxOptimizer",(function(){return h}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../globals */"./node_modules/@tensorflow/tfjs-core/dist/globals.js"),r=n(/*! ../ops/abs */"./node_modules/@tensorflow/tfjs-core/dist/ops/abs.js"),i=n(/*! ../ops/add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),a=n(/*! ../ops/div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),d=n(/*! ../ops/maximum */"./node_modules/@tensorflow/tfjs-core/dist/ops/maximum.js"),u=n(/*! ../ops/mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),l=n(/*! ../ops/scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),c=n(/*! ../ops/sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),f=n(/*! ../ops/zeros_like */"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js"),p=n(/*! ../serialization */"./node_modules/@tensorflow/tfjs-core/dist/serialization.js"),m=n(/*! ./optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer.js"); +/*! exports provided: AdamaxOptimizer */function(e,t,n){"use strict";n.r(t),n.d(t,"AdamaxOptimizer",(function(){return h}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../globals */"./node_modules/@tensorflow/tfjs-core/dist/globals.js"),r=n(/*! ../ops/abs */"./node_modules/@tensorflow/tfjs-core/dist/ops/abs.js"),i=n(/*! ../ops/add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),a=n(/*! ../ops/div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),u=n(/*! ../ops/maximum */"./node_modules/@tensorflow/tfjs-core/dist/ops/maximum.js"),d=n(/*! ../ops/mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),l=n(/*! ../ops/scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),c=n(/*! ../ops/sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),f=n(/*! ../ops/zeros_like */"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js"),p=n(/*! ../serialization */"./node_modules/@tensorflow/tfjs-core/dist/serialization.js"),m=n(/*! ./optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer.js"); /** * @license * Copyright 2018 Google LLC. All Rights Reserved. @@ -17556,11 +17557,11 @@ class b extends h.Optimizer{constructor(e,t,n,r=null){super(),this.learningRate= * limitations under the License. * ============================================================================= */ -class h extends m.Optimizer{constructor(e,t,n,r=null,i=0){super(),this.learningRate=e,this.beta1=t,this.beta2=n,this.epsilon=r,this.decay=i,this.accumulatedFirstMoment=[],this.accumulatedWeightedInfNorm=[],Object(o.tidy)((()=>{this.iteration=Object(l.scalar)(0).variable(),this.accBeta1=Object(l.scalar)(t).variable()})),null==r&&(this.epsilon=s.ENGINE.backend.epsilon())}applyGradients(e){const t=Array.isArray(e)?e.map((e=>e.name)):Object.keys(e);Object(o.tidy)((()=>{const n=Object(c.sub)(1,this.accBeta1),o=Object(a.div)(-this.learningRate,Object(i.add)(Object(u.mul)(this.iteration,this.decay),1));t.forEach(((t,l)=>{const c=s.ENGINE.registeredVariables[t];null==this.accumulatedFirstMoment[l]&&(this.accumulatedFirstMoment[l]={originalName:`${t}/m`,variable:Object(f.zerosLike)(c).variable(false)}),null==this.accumulatedWeightedInfNorm[l]&&(this.accumulatedWeightedInfNorm[l]={originalName:`${t}/v`,variable:Object(f.zerosLike)(c).variable(false)});const p=Array.isArray(e)?e[l].tensor:e[t];if(null==p)return;const m=this.accumulatedFirstMoment[l].variable,h=this.accumulatedWeightedInfNorm[l].variable,b=Object(i.add)(Object(u.mul)(m,this.beta1),Object(u.mul)(p,1-this.beta1)),j=Object(u.mul)(h,this.beta2),g=Object(r.abs)(p),w=Object(d.maximum)(j,g);m.assign(b),h.assign(w);const _=Object(i.add)(Object(u.mul)(Object(a.div)(o,n),Object(a.div)(b,Object(i.add)(w,this.epsilon))),c);c.assign(_)})),this.iteration.assign(Object(i.add)(this.iteration,1)),this.accBeta1.assign(Object(u.mul)(this.accBeta1,this.beta1))})),this.incrementIterations()}dispose(){this.accBeta1.dispose(),this.iteration.dispose(),null!=this.accumulatedFirstMoment&&Object(o.dispose)(this.accumulatedFirstMoment.map((e=>e.variable))),null!=this.accumulatedWeightedInfNorm&&Object(o.dispose)(this.accumulatedWeightedInfNorm.map((e=>e.variable)))}async getWeights(){throw new Error("getWeights() is not implemented for Adamax yet.")}async setWeights(e){throw new Error("setWeights() is not implemented for Adamax yet.")}getConfig(){return{learningRate:this.learningRate,beta1:this.beta1,beta2:this.beta2,epsilon:this.epsilon,decay:this.decay}}static fromConfig(e,t){return new e(t.learningRate,t.beta1,t.beta2,t.epsilon,t.decay)}}h.className="Adamax",Object(p.registerClass)(h)},"./node_modules/@tensorflow/tfjs-core/dist/optimizers/momentum_optimizer.js": +class h extends m.Optimizer{constructor(e,t,n,r=null,i=0){super(),this.learningRate=e,this.beta1=t,this.beta2=n,this.epsilon=r,this.decay=i,this.accumulatedFirstMoment=[],this.accumulatedWeightedInfNorm=[],Object(o.tidy)((()=>{this.iteration=Object(l.scalar)(0).variable(),this.accBeta1=Object(l.scalar)(t).variable()})),null==r&&(this.epsilon=s.ENGINE.backend.epsilon())}applyGradients(e){const t=Array.isArray(e)?e.map((e=>e.name)):Object.keys(e);Object(o.tidy)((()=>{const n=Object(c.sub)(1,this.accBeta1),o=Object(a.div)(-this.learningRate,Object(i.add)(Object(d.mul)(this.iteration,this.decay),1));t.forEach(((t,l)=>{const c=s.ENGINE.registeredVariables[t];null==this.accumulatedFirstMoment[l]&&(this.accumulatedFirstMoment[l]={originalName:`${t}/m`,variable:Object(f.zerosLike)(c).variable(false)}),null==this.accumulatedWeightedInfNorm[l]&&(this.accumulatedWeightedInfNorm[l]={originalName:`${t}/v`,variable:Object(f.zerosLike)(c).variable(false)});const p=Array.isArray(e)?e[l].tensor:e[t];if(null==p)return;const m=this.accumulatedFirstMoment[l].variable,h=this.accumulatedWeightedInfNorm[l].variable,b=Object(i.add)(Object(d.mul)(m,this.beta1),Object(d.mul)(p,1-this.beta1)),j=Object(d.mul)(h,this.beta2),g=Object(r.abs)(p),w=Object(u.maximum)(j,g);m.assign(b),h.assign(w);const _=Object(i.add)(Object(d.mul)(Object(a.div)(o,n),Object(a.div)(b,Object(i.add)(w,this.epsilon))),c);c.assign(_)})),this.iteration.assign(Object(i.add)(this.iteration,1)),this.accBeta1.assign(Object(d.mul)(this.accBeta1,this.beta1))})),this.incrementIterations()}dispose(){this.accBeta1.dispose(),this.iteration.dispose(),null!=this.accumulatedFirstMoment&&Object(o.dispose)(this.accumulatedFirstMoment.map((e=>e.variable))),null!=this.accumulatedWeightedInfNorm&&Object(o.dispose)(this.accumulatedWeightedInfNorm.map((e=>e.variable)))}async getWeights(){throw new Error("getWeights() is not implemented for Adamax yet.")}async setWeights(e){throw new Error("setWeights() is not implemented for Adamax yet.")}getConfig(){return{learningRate:this.learningRate,beta1:this.beta1,beta2:this.beta2,epsilon:this.epsilon,decay:this.decay}}static fromConfig(e,t){return new e(t.learningRate,t.beta1,t.beta2,t.epsilon,t.decay)}}h.className="Adamax",Object(p.registerClass)(h)},"./node_modules/@tensorflow/tfjs-core/dist/optimizers/momentum_optimizer.js": /*!**********************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/optimizers/momentum_optimizer.js ***! \**********************************************************************************/ -/*! exports provided: MomentumOptimizer */function(e,t,n){"use strict";n.r(t),n.d(t,"MomentumOptimizer",(function(){return c}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../globals */"./node_modules/@tensorflow/tfjs-core/dist/globals.js"),r=n(/*! ../ops/add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),i=n(/*! ../ops/mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),a=n(/*! ../ops/scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),d=n(/*! ../ops/zeros_like */"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js"),u=n(/*! ../serialization */"./node_modules/@tensorflow/tfjs-core/dist/serialization.js"),l=n(/*! ./sgd_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/sgd_optimizer.js"); +/*! exports provided: MomentumOptimizer */function(e,t,n){"use strict";n.r(t),n.d(t,"MomentumOptimizer",(function(){return c}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../globals */"./node_modules/@tensorflow/tfjs-core/dist/globals.js"),r=n(/*! ../ops/add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),i=n(/*! ../ops/mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),a=n(/*! ../ops/scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),u=n(/*! ../ops/zeros_like */"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js"),d=n(/*! ../serialization */"./node_modules/@tensorflow/tfjs-core/dist/serialization.js"),l=n(/*! ./sgd_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/sgd_optimizer.js"); /** * @license * Copyright 2018 Google LLC. All Rights Reserved. @@ -17577,7 +17578,7 @@ class h extends m.Optimizer{constructor(e,t,n,r=null,i=0){super(),this.learningR * limitations under the License. * ============================================================================= */ -class c extends l.SGDOptimizer{constructor(e,t,n=!1){super(e),this.learningRate=e,this.momentum=t,this.useNesterov=n,this.accumulations=[],this.m=Object(a.scalar)(this.momentum)}applyGradients(e){(Array.isArray(e)?e.map((e=>e.name)):Object.keys(e)).forEach(((t,n)=>{const a=s.ENGINE.registeredVariables[t];if(null==this.accumulations[n]){const e=!1;this.accumulations[n]={originalName:`${t}/momentum`,variable:Object(o.tidy)((()=>Object(d.zerosLike)(a).variable(e)))}}const u=this.accumulations[n].variable,l=Array.isArray(e)?e[n].tensor:e[t];null!=l&&Object(o.tidy)((()=>{let e;const t=Object(r.add)(Object(i.mul)(this.m,u),l);e=this.useNesterov?Object(r.add)(Object(i.mul)(this.c,Object(r.add)(l,Object(i.mul)(t,this.m))),a):Object(r.add)(Object(i.mul)(this.c,t),a),u.assign(t),a.assign(e)}))})),this.incrementIterations()}dispose(){this.m.dispose(),null!=this.accumulations&&Object(o.dispose)(this.accumulations.map((e=>e.variable)))}setMomentum(e){this.momentum=e}async getWeights(){return[await this.saveIterations()].concat(this.accumulations.map((e=>({name:e.originalName,tensor:e.variable}))))}async setWeights(e){e=await this.extractIterations(e);this.accumulations=e.map((e=>({originalName:e.name,variable:e.tensor.variable(false)})))}getConfig(){return{learningRate:this.learningRate,momentum:this.momentum,useNesterov:this.useNesterov}}static fromConfig(e,t){return new e(t.learningRate,t.momentum,t.useNesterov)}}c.className="Momentum",Object(u.registerClass)(c)},"./node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer.js": +class c extends l.SGDOptimizer{constructor(e,t,n=!1){super(e),this.learningRate=e,this.momentum=t,this.useNesterov=n,this.accumulations=[],this.m=Object(a.scalar)(this.momentum)}applyGradients(e){(Array.isArray(e)?e.map((e=>e.name)):Object.keys(e)).forEach(((t,n)=>{const a=s.ENGINE.registeredVariables[t];if(null==this.accumulations[n]){const e=!1;this.accumulations[n]={originalName:`${t}/momentum`,variable:Object(o.tidy)((()=>Object(u.zerosLike)(a).variable(e)))}}const d=this.accumulations[n].variable,l=Array.isArray(e)?e[n].tensor:e[t];null!=l&&Object(o.tidy)((()=>{let e;const t=Object(r.add)(Object(i.mul)(this.m,d),l);e=this.useNesterov?Object(r.add)(Object(i.mul)(this.c,Object(r.add)(l,Object(i.mul)(t,this.m))),a):Object(r.add)(Object(i.mul)(this.c,t),a),d.assign(t),a.assign(e)}))})),this.incrementIterations()}dispose(){this.m.dispose(),null!=this.accumulations&&Object(o.dispose)(this.accumulations.map((e=>e.variable)))}setMomentum(e){this.momentum=e}async getWeights(){return[await this.saveIterations()].concat(this.accumulations.map((e=>({name:e.originalName,tensor:e.variable}))))}async setWeights(e){e=await this.extractIterations(e);this.accumulations=e.map((e=>({originalName:e.name,variable:e.tensor.variable(false)})))}getConfig(){return{learningRate:this.learningRate,momentum:this.momentum,useNesterov:this.useNesterov}}static fromConfig(e,t){return new e(t.learningRate,t.momentum,t.useNesterov)}}c.className="Momentum",Object(d.registerClass)(c)},"./node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer.js": /*!*************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer.js ***! \*************************************************************************/ @@ -17602,7 +17603,7 @@ class a extends i.Serializable{minimize(e,t=!1,n){const{value:o,grads:r}=this.co /*!**************************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer_constructors.js ***! \**************************************************************************************/ -/*! exports provided: OptimizerConstructors */function(e,t,n){"use strict";n.r(t),n.d(t,"OptimizerConstructors",(function(){return l}));var s=n(/*! ./adadelta_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/adadelta_optimizer.js"),o=n(/*! ./adagrad_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/adagrad_optimizer.js"),r=n(/*! ./adam_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/adam_optimizer.js"),i=n(/*! ./adamax_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/adamax_optimizer.js"),a=n(/*! ./momentum_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/momentum_optimizer.js"),d=n(/*! ./rmsprop_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/rmsprop_optimizer.js"),u=n(/*! ./sgd_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/sgd_optimizer.js"); +/*! exports provided: OptimizerConstructors */function(e,t,n){"use strict";n.r(t),n.d(t,"OptimizerConstructors",(function(){return l}));var s=n(/*! ./adadelta_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/adadelta_optimizer.js"),o=n(/*! ./adagrad_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/adagrad_optimizer.js"),r=n(/*! ./adam_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/adam_optimizer.js"),i=n(/*! ./adamax_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/adamax_optimizer.js"),a=n(/*! ./momentum_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/momentum_optimizer.js"),u=n(/*! ./rmsprop_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/rmsprop_optimizer.js"),d=n(/*! ./sgd_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/sgd_optimizer.js"); /** * @license * Copyright 2018 Google LLC. All Rights Reserved. @@ -17619,11 +17620,11 @@ class a extends i.Serializable{minimize(e,t=!1,n){const{value:o,grads:r}=this.co * limitations under the License. * ============================================================================= */ -class l{static sgd(e){return new u.SGDOptimizer(e)}static momentum(e,t,n=!1){return new a.MomentumOptimizer(e,t,n)}static rmsprop(e,t=.9,n=0,s=null,o=!1){return new d.RMSPropOptimizer(e,t,n,s,o)}static adam(e=.001,t=.9,n=.999,s=null){return new r.AdamOptimizer(e,t,n,s)}static adadelta(e=.001,t=.95,n=null){return new s.AdadeltaOptimizer(e,t,n)}static adamax(e=.002,t=.9,n=.999,s=null,o=0){return new i.AdamaxOptimizer(e,t,n,s,o)}static adagrad(e,t=.1){return new o.AdagradOptimizer(e,t)}}},"./node_modules/@tensorflow/tfjs-core/dist/optimizers/rmsprop_optimizer.js": +class l{static sgd(e){return new d.SGDOptimizer(e)}static momentum(e,t,n=!1){return new a.MomentumOptimizer(e,t,n)}static rmsprop(e,t=.9,n=0,s=null,o=!1){return new u.RMSPropOptimizer(e,t,n,s,o)}static adam(e=.001,t=.9,n=.999,s=null){return new r.AdamOptimizer(e,t,n,s)}static adadelta(e=.001,t=.95,n=null){return new s.AdadeltaOptimizer(e,t,n)}static adamax(e=.002,t=.9,n=.999,s=null,o=0){return new i.AdamaxOptimizer(e,t,n,s,o)}static adagrad(e,t=.1){return new o.AdagradOptimizer(e,t)}}},"./node_modules/@tensorflow/tfjs-core/dist/optimizers/rmsprop_optimizer.js": /*!*********************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/optimizers/rmsprop_optimizer.js ***! \*********************************************************************************/ -/*! exports provided: RMSPropOptimizer */function(e,t,n){"use strict";n.r(t),n.d(t,"RMSPropOptimizer",(function(){return m}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../globals */"./node_modules/@tensorflow/tfjs-core/dist/globals.js"),r=n(/*! ../ops/add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),i=n(/*! ../ops/div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),a=n(/*! ../ops/mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),d=n(/*! ../ops/sqrt */"./node_modules/@tensorflow/tfjs-core/dist/ops/sqrt.js"),u=n(/*! ../ops/square */"./node_modules/@tensorflow/tfjs-core/dist/ops/square.js"),l=n(/*! ../ops/sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),c=n(/*! ../ops/zeros_like */"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js"),f=n(/*! ../serialization */"./node_modules/@tensorflow/tfjs-core/dist/serialization.js"),p=n(/*! ./optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer.js"); +/*! exports provided: RMSPropOptimizer */function(e,t,n){"use strict";n.r(t),n.d(t,"RMSPropOptimizer",(function(){return m}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../globals */"./node_modules/@tensorflow/tfjs-core/dist/globals.js"),r=n(/*! ../ops/add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),i=n(/*! ../ops/div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),a=n(/*! ../ops/mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),u=n(/*! ../ops/sqrt */"./node_modules/@tensorflow/tfjs-core/dist/ops/sqrt.js"),d=n(/*! ../ops/square */"./node_modules/@tensorflow/tfjs-core/dist/ops/square.js"),l=n(/*! ../ops/sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),c=n(/*! ../ops/zeros_like */"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js"),f=n(/*! ../serialization */"./node_modules/@tensorflow/tfjs-core/dist/serialization.js"),p=n(/*! ./optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer.js"); /** * @license * Copyright 2018 Google LLC. All Rights Reserved. @@ -17640,11 +17641,11 @@ class l{static sgd(e){return new u.SGDOptimizer(e)}static momentum(e,t,n=!1){ret * limitations under the License. * ============================================================================= */ -class m extends p.Optimizer{constructor(e,t=.9,n=0,o=null,r=!1){if(super(),this.learningRate=e,this.decay=t,this.momentum=n,this.epsilon=o,this.accumulatedMeanSquares=[],this.accumulatedMoments=[],this.accumulatedMeanGrads=[],this.centered=r,null==o&&(this.epsilon=s.ENGINE.backend.epsilon()),null==e)throw new Error("learningRate for RMSPropOptimizer must be defined.")}applyGradients(e){(Array.isArray(e)?e.map((e=>e.name)):Object.keys(e)).forEach(((t,n)=>{const f=s.ENGINE.registeredVariables[t],p=!1;null==this.accumulatedMeanSquares[n]&&(this.accumulatedMeanSquares[n]={originalName:`${t}/rms`,variable:Object(o.tidy)((()=>Object(c.zerosLike)(f).variable(p)))}),null==this.accumulatedMoments[n]&&(this.accumulatedMoments[n]={originalName:`${t}/momentum`,variable:Object(o.tidy)((()=>Object(c.zerosLike)(f).variable(p)))}),null==this.accumulatedMeanGrads[n]&&this.centered&&(this.accumulatedMeanGrads[n]={originalName:`${t}/mg`,variable:Object(o.tidy)((()=>Object(c.zerosLike)(f).variable(p)))});const m=Array.isArray(e)?e[n].tensor:e[t];if(null==m)return;const h=this.accumulatedMeanSquares[n].variable,b=this.accumulatedMoments[n].variable;Object(o.tidy)((()=>{const e=Object(r.add)(Object(a.mul)(h,this.decay),Object(a.mul)(Object(u.square)(m),1-this.decay));if(this.centered){const t=this.accumulatedMeanGrads[n].variable,s=Object(r.add)(Object(a.mul)(t,this.decay),Object(a.mul)(m,1-this.decay)),o=Object(i.div)(Object(a.mul)(m,this.learningRate),Object(d.sqrt)(Object(l.sub)(e,Object(r.add)(Object(u.square)(s),this.epsilon)))),c=Object(r.add)(Object(a.mul)(b,this.momentum),o);h.assign(e),t.assign(s),b.assign(c);const p=Object(l.sub)(f,c);f.assign(p)}else{const e=Object(r.add)(Object(a.mul)(h,this.decay),Object(a.mul)(Object(u.square)(m),1-this.decay)),t=Object(r.add)(Object(a.mul)(b,this.momentum),Object(i.div)(Object(a.mul)(m,this.learningRate),Object(d.sqrt)(Object(r.add)(e,this.epsilon))));h.assign(e),b.assign(t);const n=Object(l.sub)(f,t);f.assign(n)}}))})),this.incrementIterations()}dispose(){null!=this.accumulatedMeanSquares&&Object(o.dispose)(this.accumulatedMeanSquares.map((e=>e.variable))),null!=this.accumulatedMeanGrads&&this.centered&&Object(o.dispose)(this.accumulatedMeanGrads.map((e=>e.variable))),null!=this.accumulatedMoments&&Object(o.dispose)(this.accumulatedMoments.map((e=>e.variable)))}async getWeights(){const e=[...this.accumulatedMeanSquares,...this.accumulatedMoments];return this.centered&&e.push(...this.accumulatedMeanGrads),[await this.saveIterations()].concat(e.map((e=>({name:e.originalName,tensor:e.variable}))))}async setWeights(e){e=await this.extractIterations(e);const t=this.centered?e.length/3:e.length/2,n=!1;this.accumulatedMeanSquares=e.slice(0,t).map((e=>({originalName:e.name,variable:e.tensor.variable(n)}))),this.accumulatedMoments=e.slice(t,2*t).map((e=>({originalName:e.name,variable:e.tensor.variable(n)}))),this.centered&&(this.accumulatedMeanGrads=e.slice(2*t,3*t).map((e=>({originalName:e.name,variable:e.tensor.variable(n)}))))}getConfig(){return{learningRate:this.learningRate,decay:this.decay,momentum:this.momentum,epsilon:this.epsilon,centered:this.centered}}static fromConfig(e,t){return new e(t.learningRate,t.decay,t.momentum,t.epsilon,t.centered)}}m.className="RMSProp",Object(f.registerClass)(m)},"./node_modules/@tensorflow/tfjs-core/dist/optimizers/sgd_optimizer.js": +class m extends p.Optimizer{constructor(e,t=.9,n=0,o=null,r=!1){if(super(),this.learningRate=e,this.decay=t,this.momentum=n,this.epsilon=o,this.accumulatedMeanSquares=[],this.accumulatedMoments=[],this.accumulatedMeanGrads=[],this.centered=r,null==o&&(this.epsilon=s.ENGINE.backend.epsilon()),null==e)throw new Error("learningRate for RMSPropOptimizer must be defined.")}applyGradients(e){(Array.isArray(e)?e.map((e=>e.name)):Object.keys(e)).forEach(((t,n)=>{const f=s.ENGINE.registeredVariables[t],p=!1;null==this.accumulatedMeanSquares[n]&&(this.accumulatedMeanSquares[n]={originalName:`${t}/rms`,variable:Object(o.tidy)((()=>Object(c.zerosLike)(f).variable(p)))}),null==this.accumulatedMoments[n]&&(this.accumulatedMoments[n]={originalName:`${t}/momentum`,variable:Object(o.tidy)((()=>Object(c.zerosLike)(f).variable(p)))}),null==this.accumulatedMeanGrads[n]&&this.centered&&(this.accumulatedMeanGrads[n]={originalName:`${t}/mg`,variable:Object(o.tidy)((()=>Object(c.zerosLike)(f).variable(p)))});const m=Array.isArray(e)?e[n].tensor:e[t];if(null==m)return;const h=this.accumulatedMeanSquares[n].variable,b=this.accumulatedMoments[n].variable;Object(o.tidy)((()=>{const e=Object(r.add)(Object(a.mul)(h,this.decay),Object(a.mul)(Object(d.square)(m),1-this.decay));if(this.centered){const t=this.accumulatedMeanGrads[n].variable,s=Object(r.add)(Object(a.mul)(t,this.decay),Object(a.mul)(m,1-this.decay)),o=Object(i.div)(Object(a.mul)(m,this.learningRate),Object(u.sqrt)(Object(l.sub)(e,Object(r.add)(Object(d.square)(s),this.epsilon)))),c=Object(r.add)(Object(a.mul)(b,this.momentum),o);h.assign(e),t.assign(s),b.assign(c);const p=Object(l.sub)(f,c);f.assign(p)}else{const e=Object(r.add)(Object(a.mul)(h,this.decay),Object(a.mul)(Object(d.square)(m),1-this.decay)),t=Object(r.add)(Object(a.mul)(b,this.momentum),Object(i.div)(Object(a.mul)(m,this.learningRate),Object(u.sqrt)(Object(r.add)(e,this.epsilon))));h.assign(e),b.assign(t);const n=Object(l.sub)(f,t);f.assign(n)}}))})),this.incrementIterations()}dispose(){null!=this.accumulatedMeanSquares&&Object(o.dispose)(this.accumulatedMeanSquares.map((e=>e.variable))),null!=this.accumulatedMeanGrads&&this.centered&&Object(o.dispose)(this.accumulatedMeanGrads.map((e=>e.variable))),null!=this.accumulatedMoments&&Object(o.dispose)(this.accumulatedMoments.map((e=>e.variable)))}async getWeights(){const e=[...this.accumulatedMeanSquares,...this.accumulatedMoments];return this.centered&&e.push(...this.accumulatedMeanGrads),[await this.saveIterations()].concat(e.map((e=>({name:e.originalName,tensor:e.variable}))))}async setWeights(e){e=await this.extractIterations(e);const t=this.centered?e.length/3:e.length/2,n=!1;this.accumulatedMeanSquares=e.slice(0,t).map((e=>({originalName:e.name,variable:e.tensor.variable(n)}))),this.accumulatedMoments=e.slice(t,2*t).map((e=>({originalName:e.name,variable:e.tensor.variable(n)}))),this.centered&&(this.accumulatedMeanGrads=e.slice(2*t,3*t).map((e=>({originalName:e.name,variable:e.tensor.variable(n)}))))}getConfig(){return{learningRate:this.learningRate,decay:this.decay,momentum:this.momentum,epsilon:this.epsilon,centered:this.centered}}static fromConfig(e,t){return new e(t.learningRate,t.decay,t.momentum,t.epsilon,t.centered)}}m.className="RMSProp",Object(f.registerClass)(m)},"./node_modules/@tensorflow/tfjs-core/dist/optimizers/sgd_optimizer.js": /*!*****************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/optimizers/sgd_optimizer.js ***! \*****************************************************************************/ -/*! exports provided: SGDOptimizer */function(e,t,n){"use strict";n.r(t),n.d(t,"SGDOptimizer",(function(){return l}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../globals */"./node_modules/@tensorflow/tfjs-core/dist/globals.js"),r=n(/*! ../ops/add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),i=n(/*! ../ops/mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),a=n(/*! ../ops/scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),d=n(/*! ../serialization */"./node_modules/@tensorflow/tfjs-core/dist/serialization.js"),u=n(/*! ./optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer.js"); +/*! exports provided: SGDOptimizer */function(e,t,n){"use strict";n.r(t),n.d(t,"SGDOptimizer",(function(){return l}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../globals */"./node_modules/@tensorflow/tfjs-core/dist/globals.js"),r=n(/*! ../ops/add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),i=n(/*! ../ops/mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),a=n(/*! ../ops/scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),u=n(/*! ../serialization */"./node_modules/@tensorflow/tfjs-core/dist/serialization.js"),d=n(/*! ./optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer.js"); /** * @license * Copyright 2018 Google LLC. All Rights Reserved. @@ -17661,7 +17662,7 @@ class m extends p.Optimizer{constructor(e,t=.9,n=0,o=null,r=!1){if(super(),this. * limitations under the License. * ============================================================================= */ -class l extends u.Optimizer{constructor(e){super(),this.learningRate=e,this.setLearningRate(e)}applyGradients(e){(Array.isArray(e)?e.map((e=>e.name)):Object.keys(e)).forEach(((t,n)=>{const a=Array.isArray(e)?e[n].tensor:e[t];if(null==a)return;const d=s.ENGINE.registeredVariables[t];Object(o.tidy)((()=>{const e=Object(r.add)(Object(i.mul)(this.c,a),d);d.assign(e)}))})),this.incrementIterations()}setLearningRate(e){this.learningRate=e,null!=this.c&&this.c.dispose(),this.c=Object(o.keep)(Object(a.scalar)(-e))}dispose(){this.c.dispose()}async getWeights(){return[await this.saveIterations()]}async setWeights(e){if(0!==(e=await this.extractIterations(e)).length)throw new Error("SGD optimizer does not have settable weights.")}getConfig(){return{learningRate:this.learningRate}}static fromConfig(e,t){return new e(t.learningRate)}}l.className="SGD",Object(d.registerClass)(l)},"./node_modules/@tensorflow/tfjs-core/dist/platforms/platform_browser.js": +class l extends d.Optimizer{constructor(e){super(),this.learningRate=e,this.setLearningRate(e)}applyGradients(e){(Array.isArray(e)?e.map((e=>e.name)):Object.keys(e)).forEach(((t,n)=>{const a=Array.isArray(e)?e[n].tensor:e[t];if(null==a)return;const u=s.ENGINE.registeredVariables[t];Object(o.tidy)((()=>{const e=Object(r.add)(Object(i.mul)(this.c,a),u);u.assign(e)}))})),this.incrementIterations()}setLearningRate(e){this.learningRate=e,null!=this.c&&this.c.dispose(),this.c=Object(o.keep)(Object(a.scalar)(-e))}dispose(){this.c.dispose()}async getWeights(){return[await this.saveIterations()]}async setWeights(e){if(0!==(e=await this.extractIterations(e)).length)throw new Error("SGD optimizer does not have settable weights.")}getConfig(){return{learningRate:this.learningRate}}static fromConfig(e,t){return new e(t.learningRate)}}l.className="SGD",Object(u.registerClass)(l)},"./node_modules/@tensorflow/tfjs-core/dist/platforms/platform_browser.js": /*!*******************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/platforms/platform_browser.js ***! \*******************************************************************************/ @@ -17686,7 +17687,7 @@ class a{fetch(e,t){return fetch(e,t)}now(){return performance.now()}encode(e,t){ /*!****************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/platforms/platform_node.js ***! \****************************************************************************/ -/*! exports provided: getNodeFetch, resetSystemFetch, setSystemFetch, getSystemFetch, PlatformNode */function(e,t,n){"use strict";n.r(t),function(e){n.d(t,"getNodeFetch",(function(){return o})),n.d(t,"resetSystemFetch",(function(){return i})),n.d(t,"setSystemFetch",(function(){return a})),n.d(t,"getSystemFetch",(function(){return d})),n.d(t,"PlatformNode",(function(){return u}));var s=n(/*! ../environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"); +/*! exports provided: getNodeFetch, resetSystemFetch, setSystemFetch, getSystemFetch, PlatformNode */function(e,t,n){"use strict";n.r(t),function(e){n.d(t,"getNodeFetch",(function(){return o})),n.d(t,"resetSystemFetch",(function(){return i})),n.d(t,"setSystemFetch",(function(){return a})),n.d(t,"getSystemFetch",(function(){return u})),n.d(t,"PlatformNode",(function(){return d}));var s=n(/*! ../environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"); /** * @license * Copyright 2019 Google LLC. All Rights Reserved. @@ -17702,7 +17703,7 @@ class a{fetch(e,t){return fetch(e,t)}now(){return performance.now()}encode(e,t){ * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */const o={importFetch:()=>n(/*! node-fetch */1)};let r;function i(){r=null}function a(e){r=e}function d(){return r}class u{constructor(){this.util=n(/*! util */2),this.textEncoder=new this.util.TextEncoder}fetch(e,t){return null!=Object(s.env)().global.fetch?Object(s.env)().global.fetch(e,t):(null==r&&(r=o.importFetch()),r(e,t))}now(){const t=e.hrtime();return 1e3*t[0]+t[1]/1e6}encode(e,t){if("utf-8"!==t&&"utf8"!==t)throw new Error(`Node built-in encoder only supports utf-8, but got ${t}`);return this.textEncoder.encode(e)}decode(e,t){return 0===e.length?"":new this.util.TextDecoder(t).decode(e)}}Object(s.env)().get("IS_NODE")&&Object(s.env)().setPlatform("node",new u)}.call(this,n(/*! ./../../../../process/browser.js */"./node_modules/process/browser.js"))},"./node_modules/@tensorflow/tfjs-core/dist/profiler.js": + */const o={importFetch:()=>n(/*! node-fetch */1)};let r;function i(){r=null}function a(e){r=e}function u(){return r}class d{constructor(){this.util=n(/*! util */2),this.textEncoder=new this.util.TextEncoder}fetch(e,t){return null!=Object(s.env)().global.fetch?Object(s.env)().global.fetch(e,t):(null==r&&(r=o.importFetch()),r(e,t))}now(){const t=e.hrtime();return 1e3*t[0]+t[1]/1e6}encode(e,t){if("utf-8"!==t&&"utf8"!==t)throw new Error(`Node built-in encoder only supports utf-8, but got ${t}`);return this.textEncoder.encode(e)}decode(e,t){return 0===e.length?"":new this.util.TextDecoder(t).decode(e)}}Object(s.env)().get("IS_NODE")&&Object(s.env)().setPlatform("node",new d)}.call(this,n(/*! ./../../../../process/browser.js */"./node_modules/process/browser.js"))},"./node_modules/@tensorflow/tfjs-core/dist/profiler.js": /*!*************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/profiler.js ***! \*************************************************************/ @@ -17723,7 +17724,7 @@ class a{fetch(e,t){return fetch(e,t)}now(){return performance.now()}encode(e,t){ * limitations under the License. * ============================================================================= */ -class r{constructor(e,t){this.backendTimer=e,this.logger=t,null==t&&(this.logger=new a)}profileKernel(e,t,n){let r;const a=()=>{r=n()};let d;const u=o.now();if(this.backendTimer.timerAvailable())d=this.backendTimer.time(a);else{a();for(const e of r)e.dataSync();d=Promise.resolve({kernelMs:o.now()-u})}if(Object(s.env)().getBool("CHECK_COMPUTATION_FOR_ERRORS"))for(let t=0;t{i(t,n.dtype,e)}))}return{kernelName:e,outputs:r,inputs:t,timeMs:d.then((e=>e.kernelMs)),extraInfo:d.then((e=>null!=e.getExtraProfileInfo?e.getExtraProfileInfo():""))}}logKernelProfile(e){const{kernelName:t,outputs:n,timeMs:s,inputs:o,extraInfo:r}=e;n.forEach((e=>{Promise.all([e.data(),s,r]).then((n=>{this.logger.logKernelProfile(t,e,n[0],n[1],o,n[2])}))}))}}function i(e,t,n){if("float32"!==t)return!1;for(let t=0;t0?s:""} `}}console.log(`%c${d}\t%c${a}\t%c${u}D ${c}\t%c${l}\t%c${f}\t%c${i}`,"font-weight:bold","color:red","color:blue","color: orange","color: green","color: steelblue")}}},"./node_modules/@tensorflow/tfjs-core/dist/serialization.js": +class r{constructor(e,t){this.backendTimer=e,this.logger=t,null==t&&(this.logger=new a)}profileKernel(e,t,n){let r;const a=()=>{r=n()};let u;const d=o.now();if(this.backendTimer.timerAvailable())u=this.backendTimer.time(a);else{a();for(const e of r)e.dataSync();u=Promise.resolve({kernelMs:o.now()-d})}if(Object(s.env)().getBool("CHECK_COMPUTATION_FOR_ERRORS"))for(let t=0;t{i(t,n.dtype,e)}))}return{kernelName:e,outputs:r,inputs:t,timeMs:u.then((e=>e.kernelMs)),extraInfo:u.then((e=>null!=e.getExtraProfileInfo?e.getExtraProfileInfo():""))}}logKernelProfile(e){const{kernelName:t,outputs:n,timeMs:s,inputs:o,extraInfo:r}=e;n.forEach((e=>{Promise.all([e.data(),s,r]).then((n=>{this.logger.logKernelProfile(t,e,n[0],n[1],o,n[2])}))}))}}function i(e,t,n){if("float32"!==t)return!1;for(let t=0;t0?s:""} `}}console.log(`%c${u}\t%c${a}\t%c${d}D ${c}\t%c${l}\t%c${f}\t%c${i}`,"font-weight:bold","color:red","color:blue","color: orange","color: green","color: steelblue")}}},"./node_modules/@tensorflow/tfjs-core/dist/serialization.js": /*!******************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/serialization.js ***! \******************************************************************/ @@ -17763,7 +17764,7 @@ class r{constructor(e,t){this.backendTimer=e,this.logger=t,null==t&&(this.logger * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */function o(e,t,n){const s={},o={};for(let e=0;es[e.id]=!0)),a=!0,o[r.id]=!0;break}if(a)break}}const r={};r[n.id]=!0;const i={};for(let t=e.length-1;t>=0;t--){const n=e[t],s=n.inputs;for(let e=0;e=0;r--){const i=t[r],a=[];if(i.outputs.forEach((t=>{const n=e[t.id];null!=n?a.push(n):a.push(null)})),null==i.gradient)throw new Error(`Cannot compute gradient: gradient function not found for ${i.kernelName}.`);const d=i.gradient(a);for(const t in i.inputs){if(!(t in d))throw new Error(`Cannot backprop through input ${t}. Available gradients found: ${Object.keys(d)}.`);const r=n((()=>d[t]()));if("float32"!==r.dtype)throw new Error(`Error in gradient for op ${i.kernelName}. The gradient of input ${t} must have 'float32' dtype, but has '${r.dtype}'`);const a=i.inputs[t];if(!s.arraysEqual(r.shape,a.shape))throw new Error(`Error in gradient for op ${i.kernelName}. The gradient of input '${t}' has shape '${r.shape}', which does not match the shape of the input '${a.shape}'`);if(null==e[a.id])e[a.id]=r;else{const t=e[a.id];e[a.id]=o(t,r),t.dispose()}}}}},"./node_modules/@tensorflow/tfjs-core/dist/tensor.js": + */function o(e,t,n){const s={},o={};for(let e=0;es[e.id]=!0)),a=!0,o[r.id]=!0;break}if(a)break}}const r={};r[n.id]=!0;const i={};for(let t=e.length-1;t>=0;t--){const n=e[t],s=n.inputs;for(let e=0;e=0;r--){const i=t[r],a=[];if(i.outputs.forEach((t=>{const n=e[t.id];null!=n?a.push(n):a.push(null)})),null==i.gradient)throw new Error(`Cannot compute gradient: gradient function not found for ${i.kernelName}.`);const u=i.gradient(a);for(const t in i.inputs){if(!(t in u))throw new Error(`Cannot backprop through input ${t}. Available gradients found: ${Object.keys(u)}.`);const r=n((()=>u[t]()));if("float32"!==r.dtype)throw new Error(`Error in gradient for op ${i.kernelName}. The gradient of input ${t} must have 'float32' dtype, but has '${r.dtype}'`);const a=i.inputs[t];if(!s.arraysEqual(r.shape,a.shape))throw new Error(`Error in gradient for op ${i.kernelName}. The gradient of input '${t}' has shape '${r.shape}', which does not match the shape of the input '${a.shape}'`);if(null==e[a.id])e[a.id]=r;else{const t=e[a.id];e[a.id]=o(t,r),t.dispose()}}}}},"./node_modules/@tensorflow/tfjs-core/dist/tensor.js": /*!***********************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/tensor.js ***! \***********************************************************/ @@ -17784,7 +17785,7 @@ class r{constructor(e,t){this.backendTimer=e,this.logger=t,null==t&&(this.logger * limitations under the License. * ============================================================================= */ -class i{constructor(e,t,n){if(this.dtype=t,this.shape=e.slice(),this.size=r.sizeFromShape(e),null!=n){const e=n.length;r.assert(e===this.size,(()=>`Length of values '${e}' does not match the size inferred by the shape '${this.size}'.`))}if("complex64"===t)throw new Error("complex64 dtype TensorBuffers are not supported. Please create a TensorBuffer for the real and imaginary parts separately and call tf.complex(real, imag).");this.values=n||r.getArrayFromDType(t,this.size),this.strides=Object(r.computeStrides)(e)}set(e,...t){0===t.length&&(t=[0]),r.assert(t.length===this.rank,(()=>`The number of provided coordinates (${t.length}) must match the rank (${this.rank})`));const n=this.locToIndex(t);this.values[n]=e}get(...e){0===e.length&&(e=[0]);let t=0;for(const n of e){if(n<0||n>=this.shape[t]){const t=`Requested out of range element at ${e}. Buffer shape=${this.shape}`;throw new Error(t)}t++}let n=e[e.length-1];for(let t=0;tr.decodeString(e)))}catch(e){throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes().")}}return e}dataSync(){this.throwIfDisposed();const e=a().readSync(this.dataId);if("string"===this.dtype)try{return e.map((e=>r.decodeString(e)))}catch(e){throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes().")}return e}async bytes(){this.throwIfDisposed();const e=await a().read(this.dataId);return"string"===this.dtype?e:new Uint8Array(e.buffer)}dispose(){this.isDisposed||(a().disposeTensor(this),this.isDisposedInternal=!0)}get isDisposed(){return this.isDisposedInternal}throwIfDisposed(){if(this.isDisposed)throw new Error("Tensor is disposed.")}print(e=!1){return d.print(this,e)}clone(){return this.throwIfDisposed(),d.clone(this)}toString(e=!1){const t=this.dataSync();return Object(o.tensorToString)(t,this.shape,this.dtype,e)}cast(e){return this.throwIfDisposed(),d.cast(this,e)}variable(e=!0,t,n){return this.throwIfDisposed(),a().makeVariable(this,e,t,n)}}function m(){return Object(s.getGlobal)("Tensor",(()=>p))}Object.defineProperty(p,Symbol.hasInstance,{value:e=>!!e&&null!=e.data&&null!=e.dataSync&&null!=e.throwIfDisposed}),m();class h extends p{constructor(e,t,n,s){super(e.shape,e.dtype,e.dataId,s),this.trainable=t,this.name=n}assign(e){if(e.dtype!==this.dtype)throw new Error(`dtype of the new value (${e.dtype}) and previous value (${this.dtype}) must match`);if(!r.arraysEqual(e.shape,this.shape))throw new Error(`shape of the new value (${e.shape}) and previous value (${this.shape}) must match`);a().disposeTensor(this),this.dataId=e.dataId,a().incRef(this,null)}dispose(){a().disposeVariable(this),this.isDisposedInternal=!0}}Object.defineProperty(h,Symbol.hasInstance,{value:e=>e instanceof p&&null!=e.assign&&e.assign instanceof Function})},"./node_modules/@tensorflow/tfjs-core/dist/tensor_format.js": +class i{constructor(e,t,n){if(this.dtype=t,this.shape=e.slice(),this.size=r.sizeFromShape(e),null!=n){const e=n.length;r.assert(e===this.size,(()=>`Length of values '${e}' does not match the size inferred by the shape '${this.size}'.`))}if("complex64"===t)throw new Error("complex64 dtype TensorBuffers are not supported. Please create a TensorBuffer for the real and imaginary parts separately and call tf.complex(real, imag).");this.values=n||r.getArrayFromDType(t,this.size),this.strides=Object(r.computeStrides)(e)}set(e,...t){0===t.length&&(t=[0]),r.assert(t.length===this.rank,(()=>`The number of provided coordinates (${t.length}) must match the rank (${this.rank})`));const n=this.locToIndex(t);this.values[n]=e}get(...e){0===e.length&&(e=[0]);let t=0;for(const n of e){if(n<0||n>=this.shape[t]){const t=`Requested out of range element at ${e}. Buffer shape=${this.shape}`;throw new Error(t)}t++}let n=e[e.length-1];for(let t=0;tr.decodeString(e)))}catch(e){throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes().")}}return e}dataSync(){this.throwIfDisposed();const e=a().readSync(this.dataId);if("string"===this.dtype)try{return e.map((e=>r.decodeString(e)))}catch(e){throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes().")}return e}async bytes(){this.throwIfDisposed();const e=await a().read(this.dataId);return"string"===this.dtype?e:new Uint8Array(e.buffer)}dispose(){this.isDisposed||(a().disposeTensor(this),this.isDisposedInternal=!0)}get isDisposed(){return this.isDisposedInternal}throwIfDisposed(){if(this.isDisposed)throw new Error("Tensor is disposed.")}print(e=!1){return u.print(this,e)}clone(){return this.throwIfDisposed(),u.clone(this)}toString(e=!1){const t=this.dataSync();return Object(o.tensorToString)(t,this.shape,this.dtype,e)}cast(e){return this.throwIfDisposed(),u.cast(this,e)}variable(e=!0,t,n){return this.throwIfDisposed(),a().makeVariable(this,e,t,n)}}function m(){return Object(s.getGlobal)("Tensor",(()=>p))}Object.defineProperty(p,Symbol.hasInstance,{value:e=>!!e&&null!=e.data&&null!=e.dataSync&&null!=e.throwIfDisposed}),m();class h extends p{constructor(e,t,n,s){super(e.shape,e.dtype,e.dataId,s),this.trainable=t,this.name=n}assign(e){if(e.dtype!==this.dtype)throw new Error(`dtype of the new value (${e.dtype}) and previous value (${this.dtype}) must match`);if(!r.arraysEqual(e.shape,this.shape))throw new Error(`shape of the new value (${e.shape}) and previous value (${this.shape}) must match`);a().disposeTensor(this),this.dataId=e.dataId,a().incRef(this,null)}dispose(){a().disposeVariable(this),this.isDisposedInternal=!0}}Object.defineProperty(h,Symbol.hasInstance,{value:e=>e instanceof p&&null!=e.assign&&e.assign instanceof Function})},"./node_modules/@tensorflow/tfjs-core/dist/tensor_format.js": /*!******************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/tensor_format.js ***! \******************************************************************/ @@ -17804,11 +17805,11 @@ class i{constructor(e,t,n){if(this.dtype=t,this.shape=e.slice(),this.size=r.size * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= - */function o(e,t,n,o){const i=Object(s.computeStrides)(t),u=function(e,t,n,o){const i=Object(s.sizeFromShape)(t),a=o[o.length-1],u=new Array(a).fill(0),l=t.length,c="complex64"===n?d(e):e;if(l>1)for(let e=0;e" "+e)).join("\n")),f.join("\n")}function r(e,t,n){let o;return o=Array.isArray(e)?`${parseFloat(e[0].toFixed(7))} + ${parseFloat(e[1].toFixed(7))}j`:Object(s.isString)(e)?`'${e}'`:"bool"===n?i(e):parseFloat(e.toFixed(7)).toString(),Object(s.rightPad)(o,t)}function i(e){return 0===e?"false":"true"}function a(e,t,n,s,o,u=!0){const l="complex64"===n?2:1,c=t[0],f=t.length;if(0===f){if("complex64"===n){return[r(d(e)[0],0,n)]}return"bool"===n?[i(e[0])]:[e[0].toString()]}if(1===f){if(c>20){const t=3*l;let s=Array.from(e.slice(0,t)),i=Array.from(e.slice((c-3)*l,c*l));return"complex64"===n&&(s=d(s),i=d(i)),["["+s.map(((e,t)=>r(e,o[t],n))).join(", ")+", ..., "+i.map(((e,t)=>r(e,o[c-3+t],n))).join(", ")+"]"]}return["["+("complex64"===n?d(e):Array.from(e)).map(((e,t)=>r(e,o[t],n))).join(", ")+"]"]}const p=t.slice(1),m=s.slice(1),h=s[0]*l,b=[];if(c>20){for(let t=0;t<3;t++){const s=t*h,r=s+h;b.push(...a(e.slice(s,r),p,n,m,o,!1))}b.push("...");for(let t=c-3;t1)for(let e=0;e" "+e)).join("\n")),f.join("\n")}function r(e,t,n){let o;return o=Array.isArray(e)?`${parseFloat(e[0].toFixed(7))} + ${parseFloat(e[1].toFixed(7))}j`:Object(s.isString)(e)?`'${e}'`:"bool"===n?i(e):parseFloat(e.toFixed(7)).toString(),Object(s.rightPad)(o,t)}function i(e){return 0===e?"false":"true"}function a(e,t,n,s,o,d=!0){const l="complex64"===n?2:1,c=t[0],f=t.length;if(0===f){if("complex64"===n){return[r(u(e)[0],0,n)]}return"bool"===n?[i(e[0])]:[e[0].toString()]}if(1===f){if(c>20){const t=3*l;let s=Array.from(e.slice(0,t)),i=Array.from(e.slice((c-3)*l,c*l));return"complex64"===n&&(s=u(s),i=u(i)),["["+s.map(((e,t)=>r(e,o[t],n))).join(", ")+", ..., "+i.map(((e,t)=>r(e,o[c-3+t],n))).join(", ")+"]"]}return["["+("complex64"===n?u(e):Array.from(e)).map(((e,t)=>r(e,o[t],n))).join(", ")+"]"]}const p=t.slice(1),m=s.slice(1),h=s[0]*l,b=[];if(c>20){for(let t=0;t<3;t++){const s=t*h,r=s+h;b.push(...a(e.slice(s,r),p,n,m,o,!1))}b.push("...");for(let t=c-3;t`The dtypes of the first(${e.dtype}) and second(${t.dtype}) input must match`))}function d(e,t){return t.some((t=>t.id===e.id))}function u(e){const t=[];return l(e,t,new Set),t}function l(e,t,n){if(null==e)return;if(e instanceof s.Tensor)return void t.push(e);if(o=e,!Array.isArray(o)&&"object"!=typeof o)return;var o;const r=e;for(const e in r){const s=r[e];n.has(s)||(n.add(s),l(s,t,n))}}},"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js": +function i(e,t){if(e.dtype===t.dtype)return[e,t];const n=Object(o.upcastType)(e.dtype,t.dtype);return[e.cast(n),t.cast(n)]}function a(e,t){Object(r.assert)(e.dtype===t.dtype,(()=>`The dtypes of the first(${e.dtype}) and second(${t.dtype}) input must match`))}function u(e,t){return t.some((t=>t.id===e.id))}function d(e){const t=[];return l(e,t,new Set),t}function l(e,t,n){if(null==e)return;if(e instanceof s.Tensor)return void t.push(e);if(o=e,!Array.isArray(o)&&"object"!=typeof o)return;var o;const r=e;for(const e in r){const s=r[e];n.has(s)||(n.add(s),l(s,t,n))}}},"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js": /*!********************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js ***! \********************************************************************/ @@ -17846,11 +17847,11 @@ function i(e,t){if(e.dtype===t.dtype)return[e,t];const n=Object(o.upcastType)(e. * limitations under the License. * ============================================================================= */ -function a(e,t){let n=e;if(Object(i.isTypedArray)(e))return"string"===t?[]:[e.length];if(!Array.isArray(e))return[];const s=[];for(;Array.isArray(n)||Object(i.isTypedArray)(n)&&"string"!==t;)s.push(n.length),n=n[0];return Array.isArray(e)&&Object(o.env)().getBool("TENSORLIKE_CHECK_SHAPE_CONSISTENCY")&&d(e,s,[]),s}function d(e,t,n){if(n=n||[],!Array.isArray(e)&&!Object(i.isTypedArray)(e))return void Object(i.assert)(0===t.length,(()=>`Element arr[${n.join("][")}] is a primitive, but should be an array/TypedArray of ${t[0]} elements`));Object(i.assert)(t.length>0,(()=>`Element arr[${n.join("][")}] should be a primitive, but is an array of ${e.length} elements`)),Object(i.assert)(e.length===t[0],(()=>`Element arr[${n.join("][")}] should have ${t[0]} elements, but has ${e.length} elements`));const s=t.slice(1);for(let t=0;t=0&&(d=o),u(o,d,t,n),null==e||!Object(i.isTypedArray)(e)&&!Array.isArray(e)&&"number"!=typeof e&&"boolean"!=typeof e&&"string"!=typeof e){const s=null==e?"null":e.constructor.name;throw new Error(`Argument '${t}' passed to '${n}' must be a Tensor or TensorLike, but got '${s}'`)}const l=a(e,d);Object(i.isTypedArray)(e)||Array.isArray(e)||(e=[e]);const c="string"!==d?Object(i.toTypedArray)(e,d):Object(i.flatten)(e,[],!0);return s.ENGINE.makeTensor(c,l,d)}function c(e,t,n,s="numeric"){if(!Array.isArray(e))throw new Error(`Argument ${t} passed to ${n} must be a \`Tensor[]\` or \`TensorLike[]\``);return e.map(((e,o)=>l(e,`${t}[${o}]`,n,s)))}},"./node_modules/@tensorflow/tfjs-core/dist/test_util.js": +function a(e,t){let n=e;if(Object(i.isTypedArray)(e))return"string"===t?[]:[e.length];if(!Array.isArray(e))return[];const s=[];for(;Array.isArray(n)||Object(i.isTypedArray)(n)&&"string"!==t;)s.push(n.length),n=n[0];return Array.isArray(e)&&Object(o.env)().getBool("TENSORLIKE_CHECK_SHAPE_CONSISTENCY")&&u(e,s,[]),s}function u(e,t,n){if(n=n||[],!Array.isArray(e)&&!Object(i.isTypedArray)(e))return void Object(i.assert)(0===t.length,(()=>`Element arr[${n.join("][")}] is a primitive, but should be an array/TypedArray of ${t[0]} elements`));Object(i.assert)(t.length>0,(()=>`Element arr[${n.join("][")}] should be a primitive, but is an array of ${e.length} elements`)),Object(i.assert)(e.length===t[0],(()=>`Element arr[${n.join("][")}] should have ${t[0]} elements, but has ${e.length} elements`));const s=t.slice(1);for(let t=0;t=0&&(u=o),d(o,u,t,n),null==e||!Object(i.isTypedArray)(e)&&!Array.isArray(e)&&"number"!=typeof e&&"boolean"!=typeof e&&"string"!=typeof e){const s=null==e?"null":e.constructor.name;throw new Error(`Argument '${t}' passed to '${n}' must be a Tensor or TensorLike, but got '${s}'`)}const l=a(e,u);Object(i.isTypedArray)(e)||Array.isArray(e)||(e=[e]);const c="string"!==u?Object(i.toTypedArray)(e,u):Object(i.flatten)(e,[],!0);return s.ENGINE.makeTensor(c,l,u)}function c(e,t,n,s="numeric"){if(!Array.isArray(e))throw new Error(`Argument ${t} passed to ${n} must be a \`Tensor[]\` or \`TensorLike[]\``);return e.map(((e,o)=>l(e,`${t}[${o}]`,n,s)))}},"./node_modules/@tensorflow/tfjs-core/dist/test_util.js": /*!**************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/test_util.js ***! \**************************************************************/ -/*! exports provided: TEST_EPSILON_FLOAT16, expectArraysClose, testEpsilon, expectPromiseToFail, expectArraysEqual, expectNumbersClose, expectValuesInRange, expectArrayBuffersEqual, encodeStrings */function(e,t,n){"use strict";n.r(t),n.d(t,"TEST_EPSILON_FLOAT16",(function(){return i})),n.d(t,"expectArraysClose",(function(){return a})),n.d(t,"testEpsilon",(function(){return d})),n.d(t,"expectPromiseToFail",(function(){return l})),n.d(t,"expectArraysEqual",(function(){return c})),n.d(t,"expectNumbersClose",(function(){return f})),n.d(t,"expectValuesInRange",(function(){return m})),n.d(t,"expectArrayBuffersEqual",(function(){return h})),n.d(t,"encodeStrings",(function(){return b}));var s=n(/*! ./engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ./tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),r=n(/*! ./util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/*! exports provided: TEST_EPSILON_FLOAT16, expectArraysClose, testEpsilon, expectPromiseToFail, expectArraysEqual, expectNumbersClose, expectValuesInRange, expectArrayBuffersEqual, encodeStrings */function(e,t,n){"use strict";n.r(t),n.d(t,"TEST_EPSILON_FLOAT16",(function(){return i})),n.d(t,"expectArraysClose",(function(){return a})),n.d(t,"testEpsilon",(function(){return u})),n.d(t,"expectPromiseToFail",(function(){return l})),n.d(t,"expectArraysEqual",(function(){return c})),n.d(t,"expectNumbersClose",(function(){return f})),n.d(t,"expectValuesInRange",(function(){return m})),n.d(t,"expectArrayBuffersEqual",(function(){return h})),n.d(t,"encodeStrings",(function(){return b}));var s=n(/*! ./engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ./tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),r=n(/*! ./util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); /** * @license * Copyright 2017 Google LLC. All Rights Reserved. @@ -17867,11 +17868,11 @@ function a(e,t){let n=e;if(Object(i.isTypedArray)(e))return"string"===t?[]:[e.le * limitations under the License. * ============================================================================= */ -const i=.1;function a(e,t,n){return null==n&&(n=d()),u(e,t,((e,t)=>p(e,t,n)))}function d(){return 32===s.ENGINE.backend.floatPrecision()?.001:i}function u(e,t,n){let s=!0;if((Object(r.isTypedArray)(e)||Object(r.isTypedArray)(t))&&(s=!1),Object(r.isTypedArray)(e)&&Object(r.isTypedArray)(t)&&(s=!0),s){const n=e.constructor.name,s=t.constructor.name;if(n!==s)throw new Error(`Arrays are of different type. Actual: ${n}. Expected: ${s}`)}if(Array.isArray(e)&&Array.isArray(t)){const n=Object(o.inferShape)(e),s=Object(o.inferShape)(t);if(!Object(r.arraysEqual)(n,s))throw new Error(`Arrays have different shapes. Actual: [${n}]. Expected: [${s}]`)}const i=Object(r.isTypedArray)(e)?e:Object(r.flatten)(e),a=Object(r.isTypedArray)(t)?t:Object(r.flatten)(t);if(i.length!==a.length)throw new Error(`Arrays have different lengths actual: ${i.length} vs expected: ${a.length}.\nActual: ${i}.\nExpected: ${a}.`);for(let e=0;et.fail()),(()=>t()))}function c(e,t){const n="string"==typeof t||"number"==typeof t||"boolean"==typeof t?[t]:t;return Object(r.isString)(e)||Object(r.isString)(e[0])||Object(r.isString)(t)||Object(r.isString)(t[0])?u(e,n,((e,t)=>e==t)):u(e,t,((e,t)=>p(e,t,0)))}function f(e,t,n){if(null==n&&(n=d()),!p(e,t,n))throw new Error(`Numbers differ: actual === ${e}, expected === ${t}`)}function p(e,t,n){return!isFinite(e)&&!isFinite(t)||!(isNaN(e)||isNaN(t)||Math.abs(e-t)>n)}function m(e,t,n){for(let s=0;sn)throw new Error(`Value out of range:${e[s]} low: ${t}, high: ${n}`)}function h(e,t){expect(new Float32Array(e)).toEqual(new Float32Array(t))}function b(e){for(let t=0;tp(e,t,n)))}function u(){return 32===s.ENGINE.backend.floatPrecision()?.001:i}function d(e,t,n){let s=!0;if((Object(r.isTypedArray)(e)||Object(r.isTypedArray)(t))&&(s=!1),Object(r.isTypedArray)(e)&&Object(r.isTypedArray)(t)&&(s=!0),s){const n=e.constructor.name,s=t.constructor.name;if(n!==s)throw new Error(`Arrays are of different type. Actual: ${n}. Expected: ${s}`)}if(Array.isArray(e)&&Array.isArray(t)){const n=Object(o.inferShape)(e),s=Object(o.inferShape)(t);if(!Object(r.arraysEqual)(n,s))throw new Error(`Arrays have different shapes. Actual: [${n}]. Expected: [${s}]`)}const i=Object(r.isTypedArray)(e)?e:Object(r.flatten)(e),a=Object(r.isTypedArray)(t)?t:Object(r.flatten)(t);if(i.length!==a.length)throw new Error(`Arrays have different lengths actual: ${i.length} vs expected: ${a.length}.\nActual: ${i}.\nExpected: ${a}.`);for(let e=0;et.fail()),(()=>t()))}function c(e,t){const n="string"==typeof t||"number"==typeof t||"boolean"==typeof t?[t]:t;return Object(r.isString)(e)||Object(r.isString)(e[0])||Object(r.isString)(t)||Object(r.isString)(t[0])?d(e,n,((e,t)=>e==t)):d(e,t,((e,t)=>p(e,t,0)))}function f(e,t,n){if(null==n&&(n=u()),!p(e,t,n))throw new Error(`Numbers differ: actual === ${e}, expected === ${t}`)}function p(e,t,n){return!isFinite(e)&&!isFinite(t)||!(isNaN(e)||isNaN(t)||Math.abs(e-t)>n)}function m(e,t,n){for(let s=0;sn)throw new Error(`Value out of range:${e[s]} low: ${t}, high: ${n}`)}function h(e,t){expect(new Float32Array(e)).toEqual(new Float32Array(t))}function b(e){for(let t=0;tp(e,t,n)))}fu * limitations under the License. * ============================================================================= */ -var s,o,r,i,a;n.r(t),n.d(t,"Rank",(function(){return s})),n.d(t,"upcastType",(function(){return u})),n.d(t,"sumOutType",(function(){return l})),function(e){e.R0="R0",e.R1="R1",e.R2="R2",e.R3="R3",e.R4="R4",e.R5="R5",e.R6="R6"}(s||(s={})),function(e){e.float32="float32",e.int32="int32",e.bool="int32",e.complex64="complex64"}(o||(o={})),function(e){e.float32="float32",e.int32="int32",e.bool="bool",e.complex64="complex64"}(r||(r={})),function(e){e.float32="float32",e.int32="float32",e.bool="float32",e.complex64="complex64"}(i||(i={})),function(e){e.float32="complex64",e.int32="complex64",e.bool="complex64",e.complex64="complex64"}(a||(a={}));const d={float32:i,int32:o,bool:r,complex64:a};function u(e,t){if("string"===e||"string"===t){if("string"===e&&"string"===t)return"string";throw new Error(`Can not upcast ${e} with ${t}`)}return d[e][t]}function l(e){return u(e,"int32")}},"./node_modules/@tensorflow/tfjs-core/dist/util.js": +var s,o,r,i,a;n.r(t),n.d(t,"Rank",(function(){return s})),n.d(t,"upcastType",(function(){return d})),n.d(t,"sumOutType",(function(){return l})),function(e){e.R0="R0",e.R1="R1",e.R2="R2",e.R3="R3",e.R4="R4",e.R5="R5",e.R6="R6"}(s||(s={})),function(e){e.float32="float32",e.int32="int32",e.bool="int32",e.complex64="complex64"}(o||(o={})),function(e){e.float32="float32",e.int32="int32",e.bool="bool",e.complex64="complex64"}(r||(r={})),function(e){e.float32="float32",e.int32="float32",e.bool="float32",e.complex64="complex64"}(i||(i={})),function(e){e.float32="complex64",e.int32="complex64",e.bool="complex64",e.complex64="complex64"}(a||(a={}));const u={float32:i,int32:o,bool:r,complex64:a};function d(e,t){if("string"===e||"string"===t){if("string"===e&&"string"===t)return"string";throw new Error(`Can not upcast ${e} with ${t}`)}return u[e][t]}function l(e){return d(e,"int32")}},"./node_modules/@tensorflow/tfjs-core/dist/util.js": /*!*********************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/util.js ***! \*********************************************************/ -/*! exports provided: shuffle, shuffleCombo, clamp, nearestLargerEven, swap, sum, randUniform, distSquared, assert, assertShapesMatch, assertNonNull, flatten, sizeFromShape, isScalarShape, arraysEqual, isInt, tanh, sizeToSquarishShape, createShuffledIndices, rightPad, repeatedTry, inferFromImplicitShape, parseAxisParam, squeezeShape, getTypedArrayFromDType, getArrayFromDType, checkConversionForErrors, isValidDtype, hasEncodingLoss, isTypedArray, bytesPerElement, bytesFromStringArray, isString, isBoolean, isNumber, inferDtype, isFunction, nearestDivisor, computeStrides, toNestedArray, makeOnesTypedArray, makeZerosTypedArray, makeZerosNestedTypedArray, assertNonNegativeIntegerDimensions, locToIndex, indexToLoc, isPromise, hexToLong, fingerPrint64, createScalarValue, toTypedArray, now, fetch, encodeString, decodeString */function(e,t,n){"use strict";n.r(t),n.d(t,"createScalarValue",(function(){return i})),n.d(t,"toTypedArray",(function(){return a})),n.d(t,"now",(function(){return d})),n.d(t,"fetch",(function(){return u})),n.d(t,"encodeString",(function(){return l})),n.d(t,"decodeString",(function(){return c}));var s=n(/*! ./environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"),o=n(/*! ./util_base */"./node_modules/@tensorflow/tfjs-core/dist/util_base.js");n.d(t,"shuffle",(function(){return o.shuffle})),n.d(t,"shuffleCombo",(function(){return o.shuffleCombo})),n.d(t,"clamp",(function(){return o.clamp})),n.d(t,"nearestLargerEven",(function(){return o.nearestLargerEven})),n.d(t,"swap",(function(){return o.swap})),n.d(t,"sum",(function(){return o.sum})),n.d(t,"randUniform",(function(){return o.randUniform})),n.d(t,"distSquared",(function(){return o.distSquared})),n.d(t,"assert",(function(){return o.assert})),n.d(t,"assertShapesMatch",(function(){return o.assertShapesMatch})),n.d(t,"assertNonNull",(function(){return o.assertNonNull})),n.d(t,"flatten",(function(){return o.flatten})),n.d(t,"sizeFromShape",(function(){return o.sizeFromShape})),n.d(t,"isScalarShape",(function(){return o.isScalarShape})),n.d(t,"arraysEqual",(function(){return o.arraysEqual})),n.d(t,"isInt",(function(){return o.isInt})),n.d(t,"tanh",(function(){return o.tanh})),n.d(t,"sizeToSquarishShape",(function(){return o.sizeToSquarishShape})),n.d(t,"createShuffledIndices",(function(){return o.createShuffledIndices})),n.d(t,"rightPad",(function(){return o.rightPad})),n.d(t,"repeatedTry",(function(){return o.repeatedTry})),n.d(t,"inferFromImplicitShape",(function(){return o.inferFromImplicitShape})),n.d(t,"parseAxisParam",(function(){return o.parseAxisParam})),n.d(t,"squeezeShape",(function(){return o.squeezeShape})),n.d(t,"getTypedArrayFromDType",(function(){return o.getTypedArrayFromDType})),n.d(t,"getArrayFromDType",(function(){return o.getArrayFromDType})),n.d(t,"checkConversionForErrors",(function(){return o.checkConversionForErrors})),n.d(t,"isValidDtype",(function(){return o.isValidDtype})),n.d(t,"hasEncodingLoss",(function(){return o.hasEncodingLoss})),n.d(t,"isTypedArray",(function(){return o.isTypedArray})),n.d(t,"bytesPerElement",(function(){return o.bytesPerElement})),n.d(t,"bytesFromStringArray",(function(){return o.bytesFromStringArray})),n.d(t,"isString",(function(){return o.isString})),n.d(t,"isBoolean",(function(){return o.isBoolean})),n.d(t,"isNumber",(function(){return o.isNumber})),n.d(t,"inferDtype",(function(){return o.inferDtype})),n.d(t,"isFunction",(function(){return o.isFunction})),n.d(t,"nearestDivisor",(function(){return o.nearestDivisor})),n.d(t,"computeStrides",(function(){return o.computeStrides})),n.d(t,"toNestedArray",(function(){return o.toNestedArray})),n.d(t,"makeOnesTypedArray",(function(){return o.makeOnesTypedArray})),n.d(t,"makeZerosTypedArray",(function(){return o.makeZerosTypedArray})),n.d(t,"makeZerosNestedTypedArray",(function(){return o.makeZerosNestedTypedArray})),n.d(t,"assertNonNegativeIntegerDimensions",(function(){return o.assertNonNegativeIntegerDimensions})),n.d(t,"locToIndex",(function(){return o.locToIndex})),n.d(t,"indexToLoc",(function(){return o.indexToLoc})),n.d(t,"isPromise",(function(){return o.isPromise}));var r=n(/*! ./hash_util */"./node_modules/@tensorflow/tfjs-core/dist/hash_util.js"); +/*! exports provided: shuffle, shuffleCombo, clamp, nearestLargerEven, swap, sum, randUniform, distSquared, assert, assertShapesMatch, assertNonNull, flatten, sizeFromShape, isScalarShape, arraysEqual, isInt, tanh, sizeToSquarishShape, createShuffledIndices, rightPad, repeatedTry, inferFromImplicitShape, parseAxisParam, squeezeShape, getTypedArrayFromDType, getArrayFromDType, checkConversionForErrors, isValidDtype, hasEncodingLoss, isTypedArray, bytesPerElement, bytesFromStringArray, isString, isBoolean, isNumber, inferDtype, isFunction, nearestDivisor, computeStrides, toNestedArray, makeOnesTypedArray, makeZerosTypedArray, makeZerosNestedTypedArray, assertNonNegativeIntegerDimensions, locToIndex, indexToLoc, isPromise, hexToLong, fingerPrint64, createScalarValue, toTypedArray, now, fetch, encodeString, decodeString */function(e,t,n){"use strict";n.r(t),n.d(t,"createScalarValue",(function(){return i})),n.d(t,"toTypedArray",(function(){return a})),n.d(t,"now",(function(){return u})),n.d(t,"fetch",(function(){return d})),n.d(t,"encodeString",(function(){return l})),n.d(t,"decodeString",(function(){return c}));var s=n(/*! ./environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"),o=n(/*! ./util_base */"./node_modules/@tensorflow/tfjs-core/dist/util_base.js");n.d(t,"shuffle",(function(){return o.shuffle})),n.d(t,"shuffleCombo",(function(){return o.shuffleCombo})),n.d(t,"clamp",(function(){return o.clamp})),n.d(t,"nearestLargerEven",(function(){return o.nearestLargerEven})),n.d(t,"swap",(function(){return o.swap})),n.d(t,"sum",(function(){return o.sum})),n.d(t,"randUniform",(function(){return o.randUniform})),n.d(t,"distSquared",(function(){return o.distSquared})),n.d(t,"assert",(function(){return o.assert})),n.d(t,"assertShapesMatch",(function(){return o.assertShapesMatch})),n.d(t,"assertNonNull",(function(){return o.assertNonNull})),n.d(t,"flatten",(function(){return o.flatten})),n.d(t,"sizeFromShape",(function(){return o.sizeFromShape})),n.d(t,"isScalarShape",(function(){return o.isScalarShape})),n.d(t,"arraysEqual",(function(){return o.arraysEqual})),n.d(t,"isInt",(function(){return o.isInt})),n.d(t,"tanh",(function(){return o.tanh})),n.d(t,"sizeToSquarishShape",(function(){return o.sizeToSquarishShape})),n.d(t,"createShuffledIndices",(function(){return o.createShuffledIndices})),n.d(t,"rightPad",(function(){return o.rightPad})),n.d(t,"repeatedTry",(function(){return o.repeatedTry})),n.d(t,"inferFromImplicitShape",(function(){return o.inferFromImplicitShape})),n.d(t,"parseAxisParam",(function(){return o.parseAxisParam})),n.d(t,"squeezeShape",(function(){return o.squeezeShape})),n.d(t,"getTypedArrayFromDType",(function(){return o.getTypedArrayFromDType})),n.d(t,"getArrayFromDType",(function(){return o.getArrayFromDType})),n.d(t,"checkConversionForErrors",(function(){return o.checkConversionForErrors})),n.d(t,"isValidDtype",(function(){return o.isValidDtype})),n.d(t,"hasEncodingLoss",(function(){return o.hasEncodingLoss})),n.d(t,"isTypedArray",(function(){return o.isTypedArray})),n.d(t,"bytesPerElement",(function(){return o.bytesPerElement})),n.d(t,"bytesFromStringArray",(function(){return o.bytesFromStringArray})),n.d(t,"isString",(function(){return o.isString})),n.d(t,"isBoolean",(function(){return o.isBoolean})),n.d(t,"isNumber",(function(){return o.isNumber})),n.d(t,"inferDtype",(function(){return o.inferDtype})),n.d(t,"isFunction",(function(){return o.isFunction})),n.d(t,"nearestDivisor",(function(){return o.nearestDivisor})),n.d(t,"computeStrides",(function(){return o.computeStrides})),n.d(t,"toNestedArray",(function(){return o.toNestedArray})),n.d(t,"makeOnesTypedArray",(function(){return o.makeOnesTypedArray})),n.d(t,"makeZerosTypedArray",(function(){return o.makeZerosTypedArray})),n.d(t,"makeZerosNestedTypedArray",(function(){return o.makeZerosNestedTypedArray})),n.d(t,"assertNonNegativeIntegerDimensions",(function(){return o.assertNonNegativeIntegerDimensions})),n.d(t,"locToIndex",(function(){return o.locToIndex})),n.d(t,"indexToLoc",(function(){return o.indexToLoc})),n.d(t,"isPromise",(function(){return o.isPromise}));var r=n(/*! ./hash_util */"./node_modules/@tensorflow/tfjs-core/dist/hash_util.js"); /** * @license * Copyright 2017 Google LLC. All Rights Reserved. @@ -17913,7 +17914,7 @@ var s,o,r,i,a;n.r(t),n.d(t,"Rank",(function(){return s})),n.d(t,"upcastType",(fu * limitations under the License. * ============================================================================= */ -function i(e,t){return"string"===t?l(e):a([e],t)}function a(e,t){if("string"===t)throw new Error("Cannot convert a string[] to a TypedArray");if(Array.isArray(e)&&(e=o.flatten(e)),Object(s.env)().getBool("DEBUG")&&o.checkConversionForErrors(e,t),function(e,t){return e instanceof Float32Array&&"float32"===t||e instanceof Int32Array&&"int32"===t||e instanceof Uint8Array&&"bool"===t}(e,t))return e;if(null==t||"float32"===t||"complex64"===t)return new Float32Array(e);if("int32"===t)return new Int32Array(e);if("bool"===t){const t=new Uint8Array(e.length);for(let n=0;n0;)n=Math.random()*t|0,t--,a(e,t,n)}function o(e,t){if(e.length!==t.length)throw new Error(`Array sizes must match to be shuffled together First array length was ${e.length}Second array length was ${t.length}`);let n=e.length,s=0;for(;n>0;)s=Math.random()*n|0,n--,a(e,n,s),a(t,n,s)}function r(e,t,n){return Math.max(e,Math.min(t,n))}function i(e){return e%2==0?e:e+1}function a(e,t,n){const s=e[t];e[t]=e[n],e[n]=s}function d(e){let t=0;for(let n=0;nn+` Shapes ${e} and ${t} must match`))}function p(e){c(null!=e,(()=>"The input to the tensor constructor must be a non-null value."))}function m(e,t=[],n=!1){if(null==t&&(t=[]),Array.isArray(e)||A(e)&&!n)for(let s=0;s0),n){return new Promise(((s,o)=>{let r=0;const i=()=>{if(e())return void s();r++;const a=t(r);null!=n&&r>=n?o():setTimeout(i,a)};i()}))}function y(e,t){let n=1,s=-1;for(let t=0;t=0)n*=e[t];else if(-1===e[t]){if(-1!==s)throw Error(`Shapes can only have 1 implicit size. Found -1 at dim ${s} and dim ${t}`);s=t}else if(e[t]<0)throw Error(`Shapes can not be < 0. Found ${e[t]} at dim ${t}`);if(-1===s){if(t>0&&t!==n)throw Error(`Size(${t}) must match the product of shape ${e}`);return e}if(0===n)throw Error(`Cannot infer the missing size in [${e}] when there are 0 elements`);if(t%n!=0)throw Error(`The implicit shape can't be a fractional number. Got ${t} / ${n}`);const o=e.slice();return o[s]=t/n,o}function O(e,t){const n=t.length;return c((e=null==e?t.map(((e,t)=>t)):[].concat(e)).every((e=>e>=-n&&e`All values in axis param must be in range [-${n}, ${n}) but got axis ${e}`)),c(e.every((e=>g(e))),(()=>`All values in axis param must be integers but got axis ${e}`)),e.map((e=>e<0?n+e:e))}function I(e,t){const n=[],s=[],o=null!=t&&Array.isArray(t)&&0===t.length,r=null==t||o?null:O(t,e).sort();let i=0;for(let t=0;tt)&&1===e[t]&&(n.push(e[t]),s.push(t)),r[i]<=t&&i++}1!==e[t]&&(n.push(e[t]),s.push(t))}return{newShape:n,keptDims:s}}function C(e,t){let n=null;if(null==e||"float32"===e)n=new Float32Array(t);else if("int32"===e)n=new Int32Array(t);else{if("bool"!==e)throw new Error(`Unknown data type ${e}`);n=new Uint8Array(t)}return n}function S(e,t){let n=null;if(null==e||"float32"===e)n=new Float32Array(t);else if("int32"===e)n=new Int32Array(t);else if("bool"===e)n=new Uint8Array(t);else{if("string"!==e)throw new Error(`Unknown data type ${e}`);n=new Array(t)}return n}function T(e,t){for(let n=0;nt+=e.length)),t}function $(e){return"string"==typeof e||e instanceof String}function M(e){return"boolean"==typeof e}function D(e){return"number"==typeof e}function P(e){return Array.isArray(e)?P(e[0]):e instanceof Float32Array?"float32":e instanceof Int32Array||e instanceof Uint8Array?"int32":D(e)?"float32":$(e)?"string":M(e)?"bool":"float32"}function B(e){return!!(e&&e.constructor&&e.call&&e.apply)}function L(e,t){for(let n=t;n=0;--s)n[s]=n[s+1]*e[s+1];return n}function G(e,t,n,s=!1){const o=new Array;if(1===t.length){const r=t[0]*(s?2:1);for(let t=0;te*t))*(s?2:1);for(let t=0;te*t))*(n?2:1);if(0===s)return[];if(s!==t.length)throw new Error(`[${e}] does not match the input size ${t.length}${n?" for a complex tensor":""}.`);return G(0,e,t,n)}function U(e,t){const n=V(e,t);for(let e=0;ee*t),1);if(null==t||"float32"===t)return W(e,new Float32Array(n));if("int32"===t)return W(e,new Int32Array(n));if("bool"===t)return W(e,new Uint8Array(n));throw new Error(`Unknown data type ${t}`)}function H(e){e.forEach((t=>{c(Number.isInteger(t)&&t>=0,(()=>`Tensor must have a shape comprised of positive integers but got shape [${e}].`))}))}function K(e,t,n){if(0===t)return 0;if(1===t)return e[0];let s=e[e.length-1];for(let t=0;t0;)n=Math.random()*t|0,t--,a(e,t,n)}function o(e,t){if(e.length!==t.length)throw new Error(`Array sizes must match to be shuffled together First array length was ${e.length}Second array length was ${t.length}`);let n=e.length,s=0;for(;n>0;)s=Math.random()*n|0,n--,a(e,n,s),a(t,n,s)}function r(e,t,n){return Math.max(e,Math.min(t,n))}function i(e){return e%2==0?e:e+1}function a(e,t,n){const s=e[t];e[t]=e[n],e[n]=s}function u(e){let t=0;for(let n=0;nn+` Shapes ${e} and ${t} must match`))}function p(e){c(null!=e,(()=>"The input to the tensor constructor must be a non-null value."))}function m(e,t=[],n=!1){if(null==t&&(t=[]),Array.isArray(e)||A(e)&&!n)for(let s=0;s0),n){return new Promise(((s,o)=>{let r=0;const i=()=>{if(e())return void s();r++;const a=t(r);null!=n&&r>=n?o():setTimeout(i,a)};i()}))}function y(e,t){let n=1,s=-1;for(let t=0;t=0)n*=e[t];else if(-1===e[t]){if(-1!==s)throw Error(`Shapes can only have 1 implicit size. Found -1 at dim ${s} and dim ${t}`);s=t}else if(e[t]<0)throw Error(`Shapes can not be < 0. Found ${e[t]} at dim ${t}`);if(-1===s){if(t>0&&t!==n)throw Error(`Size(${t}) must match the product of shape ${e}`);return e}if(0===n)throw Error(`Cannot infer the missing size in [${e}] when there are 0 elements`);if(t%n!=0)throw Error(`The implicit shape can't be a fractional number. Got ${t} / ${n}`);const o=e.slice();return o[s]=t/n,o}function O(e,t){const n=t.length;return c((e=null==e?t.map(((e,t)=>t)):[].concat(e)).every((e=>e>=-n&&e`All values in axis param must be in range [-${n}, ${n}) but got axis ${e}`)),c(e.every((e=>g(e))),(()=>`All values in axis param must be integers but got axis ${e}`)),e.map((e=>e<0?n+e:e))}function I(e,t){const n=[],s=[],o=null!=t&&Array.isArray(t)&&0===t.length,r=null==t||o?null:O(t,e).sort();let i=0;for(let t=0;tt)&&1===e[t]&&(n.push(e[t]),s.push(t)),r[i]<=t&&i++}1!==e[t]&&(n.push(e[t]),s.push(t))}return{newShape:n,keptDims:s}}function C(e,t){let n=null;if(null==e||"float32"===e)n=new Float32Array(t);else if("int32"===e)n=new Int32Array(t);else{if("bool"!==e)throw new Error(`Unknown data type ${e}`);n=new Uint8Array(t)}return n}function S(e,t){let n=null;if(null==e||"float32"===e)n=new Float32Array(t);else if("int32"===e)n=new Int32Array(t);else if("bool"===e)n=new Uint8Array(t);else{if("string"!==e)throw new Error(`Unknown data type ${e}`);n=new Array(t)}return n}function T(e,t){for(let n=0;nt+=e.length)),t}function M(e){return"string"==typeof e||e instanceof String}function $(e){return"boolean"==typeof e}function D(e){return"number"==typeof e}function P(e){return Array.isArray(e)?P(e[0]):e instanceof Float32Array?"float32":e instanceof Int32Array||e instanceof Uint8Array?"int32":D(e)?"float32":M(e)?"string":$(e)?"bool":"float32"}function B(e){return!!(e&&e.constructor&&e.call&&e.apply)}function L(e,t){for(let n=t;n=0;--s)n[s]=n[s+1]*e[s+1];return n}function G(e,t,n,s=!1){const o=new Array;if(1===t.length){const r=t[0]*(s?2:1);for(let t=0;te*t))*(s?2:1);for(let t=0;te*t))*(n?2:1);if(0===s)return[];if(s!==t.length)throw new Error(`[${e}] does not match the input size ${t.length}${n?" for a complex tensor":""}.`);return G(0,e,t,n)}function W(e,t){const n=V(e,t);for(let e=0;ee*t),1);if(null==t||"float32"===t)return U(e,new Float32Array(n));if("int32"===t)return U(e,new Int32Array(n));if("bool"===t)return U(e,new Uint8Array(n));throw new Error(`Unknown data type ${t}`)}function H(e){e.forEach((t=>{c(Number.isInteger(t)&&t>=0,(()=>`Tensor must have a shape comprised of positive integers but got shape [${e}].`))}))}function K(e,t,n){if(0===t)return 0;if(1===t)return e[0];let s=e[e.length-1];for(let t=0;t0?i-4:i;for(n=0;n>16&255,d[l++]=t>>8&255,d[l++]=255&t;2===a&&(t=o[e.charCodeAt(n)]<<2|o[e.charCodeAt(n+1)]>>4,d[l++]=255&t);1===a&&(t=o[e.charCodeAt(n)]<<10|o[e.charCodeAt(n+1)]<<4|o[e.charCodeAt(n+2)]>>2,d[l++]=t>>8&255,d[l++]=255&t);return d},t.fromByteArray=function(e){for(var t,n=e.length,o=n%3,r=[],i=16383,a=0,d=n-o;ad?d:a+i));1===o?(t=e[n-1],r.push(s[t>>2]+s[t<<4&63]+"==")):2===o&&(t=(e[n-2]<<8)+e[n-1],r.push(s[t>>10]+s[t>>4&63]+s[t<<2&63]+"="));return r.join("")};for(var s=[],o=[],r="undefined"!=typeof Uint8Array?Uint8Array:Array,i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",a=0,d=i.length;a0)throw new Error("Invalid string. Length must be a multiple of 4");var n=e.indexOf("=");return-1===n&&(n=t),[n,n===t?0:4-n%4]}function l(e,t,n){for(var o,r,i=[],a=t;a>18&63]+s[r>>12&63]+s[r>>6&63]+s[63&r]);return i.join("")}o["-".charCodeAt(0)]=62,o["_".charCodeAt(0)]=63},"./node_modules/buffer/index.js": +/*! no static exports found */function(e,t,n){"use strict";t.byteLength=function(e){var t=d(e),n=t[0],s=t[1];return 3*(n+s)/4-s},t.toByteArray=function(e){var t,n,s=d(e),i=s[0],a=s[1],u=new r(function(e,t,n){return 3*(t+n)/4-n}(0,i,a)),l=0,c=a>0?i-4:i;for(n=0;n>16&255,u[l++]=t>>8&255,u[l++]=255&t;2===a&&(t=o[e.charCodeAt(n)]<<2|o[e.charCodeAt(n+1)]>>4,u[l++]=255&t);1===a&&(t=o[e.charCodeAt(n)]<<10|o[e.charCodeAt(n+1)]<<4|o[e.charCodeAt(n+2)]>>2,u[l++]=t>>8&255,u[l++]=255&t);return u},t.fromByteArray=function(e){for(var t,n=e.length,o=n%3,r=[],i=16383,a=0,u=n-o;au?u:a+i));1===o?(t=e[n-1],r.push(s[t>>2]+s[t<<4&63]+"==")):2===o&&(t=(e[n-2]<<8)+e[n-1],r.push(s[t>>10]+s[t>>4&63]+s[t<<2&63]+"="));return r.join("")};for(var s=[],o=[],r="undefined"!=typeof Uint8Array?Uint8Array:Array,i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",a=0,u=i.length;a0)throw new Error("Invalid string. Length must be a multiple of 4");var n=e.indexOf("=");return-1===n&&(n=t),[n,n===t?0:4-n%4]}function l(e,t,n){for(var o,r,i=[],a=t;a>18&63]+s[r>>12&63]+s[r>>6&63]+s[63&r]);return i.join("")}o["-".charCodeAt(0)]=62,o["_".charCodeAt(0)]=63},"./node_modules/buffer/index.js": /*!**************************************!*\ !*** ./node_modules/buffer/index.js ***! \**************************************/ @@ -17955,13 +17956,13 @@ const s="3.8.0"},"./node_modules/base64-js/index.js": * @author Feross Aboukhadijeh * @license MIT */ -var s=n(/*! base64-js */"./node_modules/base64-js/index.js"),o=n(/*! ieee754 */"./node_modules/ieee754/index.js"),r=n(/*! isarray */"./node_modules/isarray/index.js");function i(){return d.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function a(e,t){if(i()=i())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+i().toString(16)+" bytes");return 0|e}function m(e,t){if(d.isBuffer(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var n=e.length;if(0===n)return 0;for(var s=!1;;)switch(t){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":case void 0:return z(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return G(e).length;default:if(s)return z(e).length;t=(""+t).toLowerCase(),s=!0}}function h(e,t,n){var s=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return"";if((n>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return N(this,t,n);case"utf8":case"utf-8":return I(this,t,n);case"ascii":return S(this,t,n);case"latin1":case"binary":return T(this,t,n);case"base64":return O(this,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return E(this,t,n);default:if(s)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),s=!0}}function b(e,t,n){var s=e[t];e[t]=e[n],e[n]=s}function j(e,t,n,s,o){if(0===e.length)return-1;if("string"==typeof n?(s=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),n=+n,isNaN(n)&&(n=o?0:e.length-1),n<0&&(n=e.length+n),n>=e.length){if(o)return-1;n=e.length-1}else if(n<0){if(!o)return-1;n=0}if("string"==typeof t&&(t=d.from(t,s)),d.isBuffer(t))return 0===t.length?-1:g(e,t,n,s,o);if("number"==typeof t)return t&=255,d.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?o?Uint8Array.prototype.indexOf.call(e,t,n):Uint8Array.prototype.lastIndexOf.call(e,t,n):g(e,[t],n,s,o);throw new TypeError("val must be string, number or Buffer")}function g(e,t,n,s,o){var r,i=1,a=e.length,d=t.length;if(void 0!==s&&("ucs2"===(s=String(s).toLowerCase())||"ucs-2"===s||"utf16le"===s||"utf-16le"===s)){if(e.length<2||t.length<2)return-1;i=2,a/=2,d/=2,n/=2}function u(e,t){return 1===i?e[t]:e.readUInt16BE(t*i)}if(o){var l=-1;for(r=n;ra&&(n=a-d),r=n;r>=0;r--){for(var c=!0,f=0;fo&&(s=o):s=o;var r=t.length;if(r%2!=0)throw new TypeError("Invalid hex string");s>r/2&&(s=r/2);for(var i=0;i>8,o=n%256,r.push(o),r.push(s);return r}(t,e.length-n),e,n,s)}function O(e,t,n){return 0===t&&n===e.length?s.fromByteArray(e):s.fromByteArray(e.slice(t,n))}function I(e,t,n){n=Math.min(e.length,n);for(var s=[],o=t;o239?4:u>223?3:u>191?2:1;if(o+c<=n)switch(c){case 1:u<128&&(l=u);break;case 2:128==(192&(r=e[o+1]))&&(d=(31&u)<<6|63&r)>127&&(l=d);break;case 3:r=e[o+1],i=e[o+2],128==(192&r)&&128==(192&i)&&(d=(15&u)<<12|(63&r)<<6|63&i)>2047&&(d<55296||d>57343)&&(l=d);break;case 4:r=e[o+1],i=e[o+2],a=e[o+3],128==(192&r)&&128==(192&i)&&128==(192&a)&&(d=(15&u)<<18|(63&r)<<12|(63&i)<<6|63&a)>65535&&d<1114112&&(l=d)}null===l?(l=65533,c=1):l>65535&&(l-=65536,s.push(l>>>10&1023|55296),l=56320|1023&l),s.push(l),o+=c}return function(e){var t=e.length;if(t<=C)return String.fromCharCode.apply(String,e);var n="",s=0;for(;s0&&(e=this.toString("hex",0,n).match(/.{2}/g).join(" "),this.length>n&&(e+=" ... ")),""},d.prototype.compare=function(e,t,n,s,o){if(!d.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===n&&(n=e?e.length:0),void 0===s&&(s=0),void 0===o&&(o=this.length),t<0||n>e.length||s<0||o>this.length)throw new RangeError("out of range index");if(s>=o&&t>=n)return 0;if(s>=o)return-1;if(t>=n)return 1;if(this===e)return 0;for(var r=(o>>>=0)-(s>>>=0),i=(n>>>=0)-(t>>>=0),a=Math.min(r,i),u=this.slice(s,o),l=e.slice(t,n),c=0;co)&&(n=o),e.length>0&&(n<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");s||(s="utf8");for(var r=!1;;)switch(s){case"hex":return w(this,e,t,n);case"utf8":case"utf-8":return _(this,e,t,n);case"ascii":return k(this,e,t,n);case"latin1":case"binary":return v(this,e,t,n);case"base64":return x(this,e,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return y(this,e,t,n);default:if(r)throw new TypeError("Unknown encoding: "+s);s=(""+s).toLowerCase(),r=!0}},d.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var C=4096;function S(e,t,n){var s="";n=Math.min(e.length,n);for(var o=t;os)&&(n=s);for(var o="",r=t;rn)throw new RangeError("Trying to access beyond buffer length")}function R(e,t,n,s,o,r){if(!d.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>o||te.length)throw new RangeError("Index out of range")}function F(e,t,n,s){t<0&&(t=65535+t+1);for(var o=0,r=Math.min(e.length-n,2);o>>8*(s?o:1-o)}function $(e,t,n,s){t<0&&(t=4294967295+t+1);for(var o=0,r=Math.min(e.length-n,4);o>>8*(s?o:3-o)&255}function M(e,t,n,s,o,r){if(n+s>e.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function D(e,t,n,s,r){return r||M(e,0,n,4),o.write(e,t,n,s,23,4),n+4}function P(e,t,n,s,r){return r||M(e,0,n,8),o.write(e,t,n,s,52,8),n+8}d.prototype.slice=function(e,t){var n,s=this.length;if((e=~~e)<0?(e+=s)<0&&(e=0):e>s&&(e=s),(t=void 0===t?s:~~t)<0?(t+=s)<0&&(t=0):t>s&&(t=s),t0&&(o*=256);)s+=this[e+--t]*o;return s},d.prototype.readUInt8=function(e,t){return t||A(e,1,this.length),this[e]},d.prototype.readUInt16LE=function(e,t){return t||A(e,2,this.length),this[e]|this[e+1]<<8},d.prototype.readUInt16BE=function(e,t){return t||A(e,2,this.length),this[e]<<8|this[e+1]},d.prototype.readUInt32LE=function(e,t){return t||A(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},d.prototype.readUInt32BE=function(e,t){return t||A(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},d.prototype.readIntLE=function(e,t,n){e|=0,t|=0,n||A(e,t,this.length);for(var s=this[e],o=1,r=0;++r=(o*=128)&&(s-=Math.pow(2,8*t)),s},d.prototype.readIntBE=function(e,t,n){e|=0,t|=0,n||A(e,t,this.length);for(var s=t,o=1,r=this[e+--s];s>0&&(o*=256);)r+=this[e+--s]*o;return r>=(o*=128)&&(r-=Math.pow(2,8*t)),r},d.prototype.readInt8=function(e,t){return t||A(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},d.prototype.readInt16LE=function(e,t){t||A(e,2,this.length);var n=this[e]|this[e+1]<<8;return 32768&n?4294901760|n:n},d.prototype.readInt16BE=function(e,t){t||A(e,2,this.length);var n=this[e+1]|this[e]<<8;return 32768&n?4294901760|n:n},d.prototype.readInt32LE=function(e,t){return t||A(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},d.prototype.readInt32BE=function(e,t){return t||A(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},d.prototype.readFloatLE=function(e,t){return t||A(e,4,this.length),o.read(this,e,!0,23,4)},d.prototype.readFloatBE=function(e,t){return t||A(e,4,this.length),o.read(this,e,!1,23,4)},d.prototype.readDoubleLE=function(e,t){return t||A(e,8,this.length),o.read(this,e,!0,52,8)},d.prototype.readDoubleBE=function(e,t){return t||A(e,8,this.length),o.read(this,e,!1,52,8)},d.prototype.writeUIntLE=function(e,t,n,s){(e=+e,t|=0,n|=0,s)||R(this,e,t,n,Math.pow(2,8*n)-1,0);var o=1,r=0;for(this[t]=255&e;++r=0&&(r*=256);)this[t+o]=e/r&255;return t+n},d.prototype.writeUInt8=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,1,255,0),d.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},d.prototype.writeUInt16LE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,2,65535,0),d.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):F(this,e,t,!0),t+2},d.prototype.writeUInt16BE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,2,65535,0),d.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):F(this,e,t,!1),t+2},d.prototype.writeUInt32LE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,4,4294967295,0),d.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):$(this,e,t,!0),t+4},d.prototype.writeUInt32BE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,4,4294967295,0),d.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):$(this,e,t,!1),t+4},d.prototype.writeIntLE=function(e,t,n,s){if(e=+e,t|=0,!s){var o=Math.pow(2,8*n-1);R(this,e,t,n,o-1,-o)}var r=0,i=1,a=0;for(this[t]=255&e;++r>0)-a&255;return t+n},d.prototype.writeIntBE=function(e,t,n,s){if(e=+e,t|=0,!s){var o=Math.pow(2,8*n-1);R(this,e,t,n,o-1,-o)}var r=n-1,i=1,a=0;for(this[t+r]=255&e;--r>=0&&(i*=256);)e<0&&0===a&&0!==this[t+r+1]&&(a=1),this[t+r]=(e/i>>0)-a&255;return t+n},d.prototype.writeInt8=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,1,127,-128),d.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},d.prototype.writeInt16LE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,2,32767,-32768),d.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):F(this,e,t,!0),t+2},d.prototype.writeInt16BE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,2,32767,-32768),d.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):F(this,e,t,!1),t+2},d.prototype.writeInt32LE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,4,2147483647,-2147483648),d.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):$(this,e,t,!0),t+4},d.prototype.writeInt32BE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),d.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):$(this,e,t,!1),t+4},d.prototype.writeFloatLE=function(e,t,n){return D(this,e,t,!0,n)},d.prototype.writeFloatBE=function(e,t,n){return D(this,e,t,!1,n)},d.prototype.writeDoubleLE=function(e,t,n){return P(this,e,t,!0,n)},d.prototype.writeDoubleBE=function(e,t,n){return P(this,e,t,!1,n)},d.prototype.copy=function(e,t,n,s){if(n||(n=0),s||0===s||(s=this.length),t>=e.length&&(t=e.length),t||(t=0),s>0&&s=this.length)throw new RangeError("sourceStart out of bounds");if(s<0)throw new RangeError("sourceEnd out of bounds");s>this.length&&(s=this.length),e.length-t=0;--o)e[o+t]=this[o+n];else if(r<1e3||!d.TYPED_ARRAY_SUPPORT)for(o=0;o>>=0,n=void 0===n?this.length:n>>>0,e||(e=0),"number"==typeof e)for(r=t;r55295&&n<57344){if(!o){if(n>56319){(t-=3)>-1&&r.push(239,191,189);continue}if(i+1===s){(t-=3)>-1&&r.push(239,191,189);continue}o=n;continue}if(n<56320){(t-=3)>-1&&r.push(239,191,189),o=n;continue}n=65536+(o-55296<<10|n-56320)}else o&&(t-=3)>-1&&r.push(239,191,189);if(o=null,n<128){if((t-=1)<0)break;r.push(n)}else if(n<2048){if((t-=2)<0)break;r.push(n>>6|192,63&n|128)}else if(n<65536){if((t-=3)<0)break;r.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;r.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return r}function G(e){return s.toByteArray(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}(e).replace(B,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function W(e,t,n,s){for(var o=0;o=t.length||o>=e.length);++o)t[o+n]=e[o];return o}}).call(this,n(/*! ./../webpack/buildin/global.js */"./node_modules/webpack/buildin/global.js"))},"./node_modules/ieee754/index.js": +var s=n(/*! base64-js */"./node_modules/base64-js/index.js"),o=n(/*! ieee754 */"./node_modules/ieee754/index.js"),r=n(/*! isarray */"./node_modules/isarray/index.js");function i(){return u.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function a(e,t){if(i()=i())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+i().toString(16)+" bytes");return 0|e}function m(e,t){if(u.isBuffer(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var n=e.length;if(0===n)return 0;for(var s=!1;;)switch(t){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":case void 0:return z(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return G(e).length;default:if(s)return z(e).length;t=(""+t).toLowerCase(),s=!0}}function h(e,t,n){var s=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return"";if((n>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return N(this,t,n);case"utf8":case"utf-8":return I(this,t,n);case"ascii":return S(this,t,n);case"latin1":case"binary":return T(this,t,n);case"base64":return O(this,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return E(this,t,n);default:if(s)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),s=!0}}function b(e,t,n){var s=e[t];e[t]=e[n],e[n]=s}function j(e,t,n,s,o){if(0===e.length)return-1;if("string"==typeof n?(s=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),n=+n,isNaN(n)&&(n=o?0:e.length-1),n<0&&(n=e.length+n),n>=e.length){if(o)return-1;n=e.length-1}else if(n<0){if(!o)return-1;n=0}if("string"==typeof t&&(t=u.from(t,s)),u.isBuffer(t))return 0===t.length?-1:g(e,t,n,s,o);if("number"==typeof t)return t&=255,u.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?o?Uint8Array.prototype.indexOf.call(e,t,n):Uint8Array.prototype.lastIndexOf.call(e,t,n):g(e,[t],n,s,o);throw new TypeError("val must be string, number or Buffer")}function g(e,t,n,s,o){var r,i=1,a=e.length,u=t.length;if(void 0!==s&&("ucs2"===(s=String(s).toLowerCase())||"ucs-2"===s||"utf16le"===s||"utf-16le"===s)){if(e.length<2||t.length<2)return-1;i=2,a/=2,u/=2,n/=2}function d(e,t){return 1===i?e[t]:e.readUInt16BE(t*i)}if(o){var l=-1;for(r=n;ra&&(n=a-u),r=n;r>=0;r--){for(var c=!0,f=0;fo&&(s=o):s=o;var r=t.length;if(r%2!=0)throw new TypeError("Invalid hex string");s>r/2&&(s=r/2);for(var i=0;i>8,o=n%256,r.push(o),r.push(s);return r}(t,e.length-n),e,n,s)}function O(e,t,n){return 0===t&&n===e.length?s.fromByteArray(e):s.fromByteArray(e.slice(t,n))}function I(e,t,n){n=Math.min(e.length,n);for(var s=[],o=t;o239?4:d>223?3:d>191?2:1;if(o+c<=n)switch(c){case 1:d<128&&(l=d);break;case 2:128==(192&(r=e[o+1]))&&(u=(31&d)<<6|63&r)>127&&(l=u);break;case 3:r=e[o+1],i=e[o+2],128==(192&r)&&128==(192&i)&&(u=(15&d)<<12|(63&r)<<6|63&i)>2047&&(u<55296||u>57343)&&(l=u);break;case 4:r=e[o+1],i=e[o+2],a=e[o+3],128==(192&r)&&128==(192&i)&&128==(192&a)&&(u=(15&d)<<18|(63&r)<<12|(63&i)<<6|63&a)>65535&&u<1114112&&(l=u)}null===l?(l=65533,c=1):l>65535&&(l-=65536,s.push(l>>>10&1023|55296),l=56320|1023&l),s.push(l),o+=c}return function(e){var t=e.length;if(t<=C)return String.fromCharCode.apply(String,e);var n="",s=0;for(;s0&&(e=this.toString("hex",0,n).match(/.{2}/g).join(" "),this.length>n&&(e+=" ... ")),""},u.prototype.compare=function(e,t,n,s,o){if(!u.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===n&&(n=e?e.length:0),void 0===s&&(s=0),void 0===o&&(o=this.length),t<0||n>e.length||s<0||o>this.length)throw new RangeError("out of range index");if(s>=o&&t>=n)return 0;if(s>=o)return-1;if(t>=n)return 1;if(this===e)return 0;for(var r=(o>>>=0)-(s>>>=0),i=(n>>>=0)-(t>>>=0),a=Math.min(r,i),d=this.slice(s,o),l=e.slice(t,n),c=0;co)&&(n=o),e.length>0&&(n<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");s||(s="utf8");for(var r=!1;;)switch(s){case"hex":return w(this,e,t,n);case"utf8":case"utf-8":return _(this,e,t,n);case"ascii":return k(this,e,t,n);case"latin1":case"binary":return v(this,e,t,n);case"base64":return x(this,e,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return y(this,e,t,n);default:if(r)throw new TypeError("Unknown encoding: "+s);s=(""+s).toLowerCase(),r=!0}},u.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var C=4096;function S(e,t,n){var s="";n=Math.min(e.length,n);for(var o=t;os)&&(n=s);for(var o="",r=t;rn)throw new RangeError("Trying to access beyond buffer length")}function R(e,t,n,s,o,r){if(!u.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>o||te.length)throw new RangeError("Index out of range")}function F(e,t,n,s){t<0&&(t=65535+t+1);for(var o=0,r=Math.min(e.length-n,2);o>>8*(s?o:1-o)}function M(e,t,n,s){t<0&&(t=4294967295+t+1);for(var o=0,r=Math.min(e.length-n,4);o>>8*(s?o:3-o)&255}function $(e,t,n,s,o,r){if(n+s>e.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function D(e,t,n,s,r){return r||$(e,0,n,4),o.write(e,t,n,s,23,4),n+4}function P(e,t,n,s,r){return r||$(e,0,n,8),o.write(e,t,n,s,52,8),n+8}u.prototype.slice=function(e,t){var n,s=this.length;if((e=~~e)<0?(e+=s)<0&&(e=0):e>s&&(e=s),(t=void 0===t?s:~~t)<0?(t+=s)<0&&(t=0):t>s&&(t=s),t0&&(o*=256);)s+=this[e+--t]*o;return s},u.prototype.readUInt8=function(e,t){return t||A(e,1,this.length),this[e]},u.prototype.readUInt16LE=function(e,t){return t||A(e,2,this.length),this[e]|this[e+1]<<8},u.prototype.readUInt16BE=function(e,t){return t||A(e,2,this.length),this[e]<<8|this[e+1]},u.prototype.readUInt32LE=function(e,t){return t||A(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},u.prototype.readUInt32BE=function(e,t){return t||A(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},u.prototype.readIntLE=function(e,t,n){e|=0,t|=0,n||A(e,t,this.length);for(var s=this[e],o=1,r=0;++r=(o*=128)&&(s-=Math.pow(2,8*t)),s},u.prototype.readIntBE=function(e,t,n){e|=0,t|=0,n||A(e,t,this.length);for(var s=t,o=1,r=this[e+--s];s>0&&(o*=256);)r+=this[e+--s]*o;return r>=(o*=128)&&(r-=Math.pow(2,8*t)),r},u.prototype.readInt8=function(e,t){return t||A(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},u.prototype.readInt16LE=function(e,t){t||A(e,2,this.length);var n=this[e]|this[e+1]<<8;return 32768&n?4294901760|n:n},u.prototype.readInt16BE=function(e,t){t||A(e,2,this.length);var n=this[e+1]|this[e]<<8;return 32768&n?4294901760|n:n},u.prototype.readInt32LE=function(e,t){return t||A(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},u.prototype.readInt32BE=function(e,t){return t||A(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},u.prototype.readFloatLE=function(e,t){return t||A(e,4,this.length),o.read(this,e,!0,23,4)},u.prototype.readFloatBE=function(e,t){return t||A(e,4,this.length),o.read(this,e,!1,23,4)},u.prototype.readDoubleLE=function(e,t){return t||A(e,8,this.length),o.read(this,e,!0,52,8)},u.prototype.readDoubleBE=function(e,t){return t||A(e,8,this.length),o.read(this,e,!1,52,8)},u.prototype.writeUIntLE=function(e,t,n,s){(e=+e,t|=0,n|=0,s)||R(this,e,t,n,Math.pow(2,8*n)-1,0);var o=1,r=0;for(this[t]=255&e;++r=0&&(r*=256);)this[t+o]=e/r&255;return t+n},u.prototype.writeUInt8=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,1,255,0),u.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},u.prototype.writeUInt16LE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,2,65535,0),u.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):F(this,e,t,!0),t+2},u.prototype.writeUInt16BE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,2,65535,0),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):F(this,e,t,!1),t+2},u.prototype.writeUInt32LE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,4,4294967295,0),u.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):M(this,e,t,!0),t+4},u.prototype.writeUInt32BE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,4,4294967295,0),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):M(this,e,t,!1),t+4},u.prototype.writeIntLE=function(e,t,n,s){if(e=+e,t|=0,!s){var o=Math.pow(2,8*n-1);R(this,e,t,n,o-1,-o)}var r=0,i=1,a=0;for(this[t]=255&e;++r>0)-a&255;return t+n},u.prototype.writeIntBE=function(e,t,n,s){if(e=+e,t|=0,!s){var o=Math.pow(2,8*n-1);R(this,e,t,n,o-1,-o)}var r=n-1,i=1,a=0;for(this[t+r]=255&e;--r>=0&&(i*=256);)e<0&&0===a&&0!==this[t+r+1]&&(a=1),this[t+r]=(e/i>>0)-a&255;return t+n},u.prototype.writeInt8=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,1,127,-128),u.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},u.prototype.writeInt16LE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,2,32767,-32768),u.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):F(this,e,t,!0),t+2},u.prototype.writeInt16BE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,2,32767,-32768),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):F(this,e,t,!1),t+2},u.prototype.writeInt32LE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,4,2147483647,-2147483648),u.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):M(this,e,t,!0),t+4},u.prototype.writeInt32BE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):M(this,e,t,!1),t+4},u.prototype.writeFloatLE=function(e,t,n){return D(this,e,t,!0,n)},u.prototype.writeFloatBE=function(e,t,n){return D(this,e,t,!1,n)},u.prototype.writeDoubleLE=function(e,t,n){return P(this,e,t,!0,n)},u.prototype.writeDoubleBE=function(e,t,n){return P(this,e,t,!1,n)},u.prototype.copy=function(e,t,n,s){if(n||(n=0),s||0===s||(s=this.length),t>=e.length&&(t=e.length),t||(t=0),s>0&&s=this.length)throw new RangeError("sourceStart out of bounds");if(s<0)throw new RangeError("sourceEnd out of bounds");s>this.length&&(s=this.length),e.length-t=0;--o)e[o+t]=this[o+n];else if(r<1e3||!u.TYPED_ARRAY_SUPPORT)for(o=0;o>>=0,n=void 0===n?this.length:n>>>0,e||(e=0),"number"==typeof e)for(r=t;r55295&&n<57344){if(!o){if(n>56319){(t-=3)>-1&&r.push(239,191,189);continue}if(i+1===s){(t-=3)>-1&&r.push(239,191,189);continue}o=n;continue}if(n<56320){(t-=3)>-1&&r.push(239,191,189),o=n;continue}n=65536+(o-55296<<10|n-56320)}else o&&(t-=3)>-1&&r.push(239,191,189);if(o=null,n<128){if((t-=1)<0)break;r.push(n)}else if(n<2048){if((t-=2)<0)break;r.push(n>>6|192,63&n|128)}else if(n<65536){if((t-=3)<0)break;r.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;r.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return r}function G(e){return s.toByteArray(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}(e).replace(B,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function U(e,t,n,s){for(var o=0;o=t.length||o>=e.length);++o)t[o+n]=e[o];return o}}).call(this,n(/*! ./../webpack/buildin/global.js */"./node_modules/webpack/buildin/global.js"))},"./node_modules/ieee754/index.js": /*!***************************************!*\ !*** ./node_modules/ieee754/index.js ***! \***************************************/ /*! no static exports found */function(e,t){ /*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */ -t.read=function(e,t,n,s,o){var r,i,a=8*o-s-1,d=(1<>1,l=-7,c=n?o-1:0,f=n?-1:1,p=e[t+c];for(c+=f,r=p&(1<<-l)-1,p>>=-l,l+=a;l>0;r=256*r+e[t+c],c+=f,l-=8);for(i=r&(1<<-l)-1,r>>=-l,l+=s;l>0;i=256*i+e[t+c],c+=f,l-=8);if(0===r)r=1-u;else{if(r===d)return i?NaN:1/0*(p?-1:1);i+=Math.pow(2,s),r-=u}return(p?-1:1)*i*Math.pow(2,r-s)},t.write=function(e,t,n,s,o,r){var i,a,d,u=8*r-o-1,l=(1<>1,f=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,p=s?0:r-1,m=s?1:-1,h=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(a=isNaN(t)?1:0,i=l):(i=Math.floor(Math.log(t)/Math.LN2),t*(d=Math.pow(2,-i))<1&&(i--,d*=2),(t+=i+c>=1?f/d:f*Math.pow(2,1-c))*d>=2&&(i++,d/=2),i+c>=l?(a=0,i=l):i+c>=1?(a=(t*d-1)*Math.pow(2,o),i+=c):(a=t*Math.pow(2,c-1)*Math.pow(2,o),i=0));o>=8;e[n+p]=255&a,p+=m,a/=256,o-=8);for(i=i<0;e[n+p]=255&i,p+=m,i/=256,u-=8);e[n+p-m]|=128*h}},"./node_modules/isarray/index.js": +t.read=function(e,t,n,s,o){var r,i,a=8*o-s-1,u=(1<>1,l=-7,c=n?o-1:0,f=n?-1:1,p=e[t+c];for(c+=f,r=p&(1<<-l)-1,p>>=-l,l+=a;l>0;r=256*r+e[t+c],c+=f,l-=8);for(i=r&(1<<-l)-1,r>>=-l,l+=s;l>0;i=256*i+e[t+c],c+=f,l-=8);if(0===r)r=1-d;else{if(r===u)return i?NaN:1/0*(p?-1:1);i+=Math.pow(2,s),r-=d}return(p?-1:1)*i*Math.pow(2,r-s)},t.write=function(e,t,n,s,o,r){var i,a,u,d=8*r-o-1,l=(1<>1,f=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,p=s?0:r-1,m=s?1:-1,h=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(a=isNaN(t)?1:0,i=l):(i=Math.floor(Math.log(t)/Math.LN2),t*(u=Math.pow(2,-i))<1&&(i--,u*=2),(t+=i+c>=1?f/u:f*Math.pow(2,1-c))*u>=2&&(i++,u/=2),i+c>=l?(a=0,i=l):i+c>=1?(a=(t*u-1)*Math.pow(2,o),i+=c):(a=t*Math.pow(2,c-1)*Math.pow(2,o),i=0));o>=8;e[n+p]=255&a,p+=m,a/=256,o-=8);for(i=i<0;e[n+p]=255&i,p+=m,i/=256,d-=8);e[n+p-m]|=128*h}},"./node_modules/isarray/index.js": /*!***************************************!*\ !*** ./node_modules/isarray/index.js ***! \***************************************/ @@ -17969,47 +17970,47 @@ t.read=function(e,t,n,s,o){var r,i,a=8*o-s-1,d=(1<>1,l=-7,c=n?o-1:0,f= /*!***************************************!*\ !*** ./node_modules/long/src/long.js ***! \***************************************/ -/*! no static exports found */function(e,t){e.exports=s;var n=null;try{n=new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([0,97,115,109,1,0,0,0,1,13,2,96,0,1,127,96,4,127,127,127,127,1,127,3,7,6,0,1,1,1,1,1,6,6,1,127,1,65,0,11,7,50,6,3,109,117,108,0,1,5,100,105,118,95,115,0,2,5,100,105,118,95,117,0,3,5,114,101,109,95,115,0,4,5,114,101,109,95,117,0,5,8,103,101,116,95,104,105,103,104,0,0,10,191,1,6,4,0,35,0,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,126,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,127,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,128,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,129,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,130,34,4,66,32,135,167,36,0,32,4,167,11])),{}).exports}catch(e){}function s(e,t,n){this.low=0|e,this.high=0|t,this.unsigned=!!n}function o(e){return!0===(e&&e.__isLong__)}s.prototype.__isLong__,Object.defineProperty(s.prototype,"__isLong__",{value:!0}),s.isLong=o;var r={},i={};function a(e,t){var n,s,o;return t?(o=0<=(e>>>=0)&&e<256)&&(s=i[e])?s:(n=u(e,(0|e)<0?-1:0,!0),o&&(i[e]=n),n):(o=-128<=(e|=0)&&e<128)&&(s=r[e])?s:(n=u(e,e<0?-1:0,!1),o&&(r[e]=n),n)}function d(e,t){if(isNaN(e))return t?g:j;if(t){if(e<0)return g;if(e>=m)return x}else{if(e<=-h)return y;if(e+1>=h)return v}return e<0?d(-e,t).neg():u(e%p|0,e/p|0,t)}function u(e,t,n){return new s(e,t,n)}s.fromInt=a,s.fromNumber=d,s.fromBits=u;var l=Math.pow;function c(e,t,n){if(0===e.length)throw Error("empty string");if("NaN"===e||"Infinity"===e||"+Infinity"===e||"-Infinity"===e)return j;if("number"==typeof t?(n=t,t=!1):t=!!t,(n=n||10)<2||360)throw Error("interior hyphen");if(0===s)return c(e.substring(1),t,n).neg();for(var o=d(l(n,8)),r=j,i=0;i>>0:this.low},O.toNumber=function(){return this.unsigned?(this.high>>>0)*p+(this.low>>>0):this.high*p+(this.low>>>0)},O.toString=function(e){if((e=e||10)<2||36>>0).toString(e);if((r=a).isZero())return u+i;for(;u.length<6;)u="0"+u;i=""+u+i}},O.getHighBits=function(){return this.high},O.getHighBitsUnsigned=function(){return this.high>>>0},O.getLowBits=function(){return this.low},O.getLowBitsUnsigned=function(){return this.low>>>0},O.getNumBitsAbs=function(){if(this.isNegative())return this.eq(y)?64:this.neg().getNumBitsAbs();for(var e=0!=this.high?this.high:this.low,t=31;t>0&&0==(e&1<=0},O.isOdd=function(){return 1==(1&this.low)},O.isEven=function(){return 0==(1&this.low)},O.equals=function(e){return o(e)||(e=f(e)),(this.unsigned===e.unsigned||this.high>>>31!=1||e.high>>>31!=1)&&(this.high===e.high&&this.low===e.low)},O.eq=O.equals,O.notEquals=function(e){return!this.eq(e)},O.neq=O.notEquals,O.ne=O.notEquals,O.lessThan=function(e){return this.comp(e)<0},O.lt=O.lessThan,O.lessThanOrEqual=function(e){return this.comp(e)<=0},O.lte=O.lessThanOrEqual,O.le=O.lessThanOrEqual,O.greaterThan=function(e){return this.comp(e)>0},O.gt=O.greaterThan,O.greaterThanOrEqual=function(e){return this.comp(e)>=0},O.gte=O.greaterThanOrEqual,O.ge=O.greaterThanOrEqual,O.compare=function(e){if(o(e)||(e=f(e)),this.eq(e))return 0;var t=this.isNegative(),n=e.isNegative();return t&&!n?-1:!t&&n?1:this.unsigned?e.high>>>0>this.high>>>0||e.high===this.high&&e.low>>>0>this.low>>>0?-1:1:this.sub(e).isNegative()?-1:1},O.comp=O.compare,O.negate=function(){return!this.unsigned&&this.eq(y)?y:this.not().add(w)},O.neg=O.negate,O.add=function(e){o(e)||(e=f(e));var t=this.high>>>16,n=65535&this.high,s=this.low>>>16,r=65535&this.low,i=e.high>>>16,a=65535&e.high,d=e.low>>>16,l=0,c=0,p=0,m=0;return p+=(m+=r+(65535&e.low))>>>16,c+=(p+=s+d)>>>16,l+=(c+=n+a)>>>16,l+=t+i,u((p&=65535)<<16|(m&=65535),(l&=65535)<<16|(c&=65535),this.unsigned)},O.subtract=function(e){return o(e)||(e=f(e)),this.add(e.neg())},O.sub=O.subtract,O.multiply=function(e){if(this.isZero())return j;if(o(e)||(e=f(e)),n)return u(n.mul(this.low,this.high,e.low,e.high),n.get_high(),this.unsigned);if(e.isZero())return j;if(this.eq(y))return e.isOdd()?y:j;if(e.eq(y))return this.isOdd()?y:j;if(this.isNegative())return e.isNegative()?this.neg().mul(e.neg()):this.neg().mul(e).neg();if(e.isNegative())return this.mul(e.neg()).neg();if(this.lt(b)&&e.lt(b))return d(this.toNumber()*e.toNumber(),this.unsigned);var t=this.high>>>16,s=65535&this.high,r=this.low>>>16,i=65535&this.low,a=e.high>>>16,l=65535&e.high,c=e.low>>>16,p=65535&e.low,m=0,h=0,g=0,w=0;return g+=(w+=i*p)>>>16,h+=(g+=r*p)>>>16,g&=65535,h+=(g+=i*c)>>>16,m+=(h+=s*p)>>>16,h&=65535,m+=(h+=r*c)>>>16,h&=65535,m+=(h+=i*l)>>>16,m+=t*p+s*c+r*l+i*a,u((g&=65535)<<16|(w&=65535),(m&=65535)<<16|(h&=65535),this.unsigned)},O.mul=O.multiply,O.divide=function(e){if(o(e)||(e=f(e)),e.isZero())throw Error("division by zero");var t,s,r;if(n)return this.unsigned||-2147483648!==this.high||-1!==e.low||-1!==e.high?u((this.unsigned?n.div_u:n.div_s)(this.low,this.high,e.low,e.high),n.get_high(),this.unsigned):this;if(this.isZero())return this.unsigned?g:j;if(this.unsigned){if(e.unsigned||(e=e.toUnsigned()),e.gt(this))return g;if(e.gt(this.shru(1)))return _;r=g}else{if(this.eq(y))return e.eq(w)||e.eq(k)?y:e.eq(y)?w:(t=this.shr(1).div(e).shl(1)).eq(j)?e.isNegative()?w:k:(s=this.sub(e.mul(t)),r=t.add(s.div(e)));if(e.eq(y))return this.unsigned?g:j;if(this.isNegative())return e.isNegative()?this.neg().div(e.neg()):this.neg().div(e).neg();if(e.isNegative())return this.div(e.neg()).neg();r=j}for(s=this;s.gte(e);){t=Math.max(1,Math.floor(s.toNumber()/e.toNumber()));for(var i=Math.ceil(Math.log(t)/Math.LN2),a=i<=48?1:l(2,i-48),c=d(t),p=c.mul(e);p.isNegative()||p.gt(s);)p=(c=d(t-=a,this.unsigned)).mul(e);c.isZero()&&(c=w),r=r.add(c),s=s.sub(p)}return r},O.div=O.divide,O.modulo=function(e){return o(e)||(e=f(e)),n?u((this.unsigned?n.rem_u:n.rem_s)(this.low,this.high,e.low,e.high),n.get_high(),this.unsigned):this.sub(this.div(e).mul(e))},O.mod=O.modulo,O.rem=O.modulo,O.not=function(){return u(~this.low,~this.high,this.unsigned)},O.and=function(e){return o(e)||(e=f(e)),u(this.low&e.low,this.high&e.high,this.unsigned)},O.or=function(e){return o(e)||(e=f(e)),u(this.low|e.low,this.high|e.high,this.unsigned)},O.xor=function(e){return o(e)||(e=f(e)),u(this.low^e.low,this.high^e.high,this.unsigned)},O.shiftLeft=function(e){return o(e)&&(e=e.toInt()),0==(e&=63)?this:e<32?u(this.low<>>32-e,this.unsigned):u(0,this.low<>>e|this.high<<32-e,this.high>>e,this.unsigned):u(this.high>>e-32,this.high>=0?0:-1,this.unsigned)},O.shr=O.shiftRight,O.shiftRightUnsigned=function(e){if(o(e)&&(e=e.toInt()),0===(e&=63))return this;var t=this.high;return e<32?u(this.low>>>e|t<<32-e,t>>>e,this.unsigned):u(32===e?t:t>>>e-32,0,this.unsigned)},O.shru=O.shiftRightUnsigned,O.shr_u=O.shiftRightUnsigned,O.toSigned=function(){return this.unsigned?u(this.low,this.high,!1):this},O.toUnsigned=function(){return this.unsigned?this:u(this.low,this.high,!0)},O.toBytes=function(e){return e?this.toBytesLE():this.toBytesBE()},O.toBytesLE=function(){var e=this.high,t=this.low;return[255&t,t>>>8&255,t>>>16&255,t>>>24,255&e,e>>>8&255,e>>>16&255,e>>>24]},O.toBytesBE=function(){var e=this.high,t=this.low;return[e>>>24,e>>>16&255,e>>>8&255,255&e,t>>>24,t>>>16&255,t>>>8&255,255&t]},s.fromBytes=function(e,t,n){return n?s.fromBytesLE(e,t):s.fromBytesBE(e,t)},s.fromBytesLE=function(e,t){return new s(e[0]|e[1]<<8|e[2]<<16|e[3]<<24,e[4]|e[5]<<8|e[6]<<16|e[7]<<24,t)},s.fromBytesBE=function(e,t){return new s(e[4]<<24|e[5]<<16|e[6]<<8|e[7],e[0]<<24|e[1]<<16|e[2]<<8|e[3],t)}},"./node_modules/process/browser.js": +/*! no static exports found */function(e,t){e.exports=s;var n=null;try{n=new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([0,97,115,109,1,0,0,0,1,13,2,96,0,1,127,96,4,127,127,127,127,1,127,3,7,6,0,1,1,1,1,1,6,6,1,127,1,65,0,11,7,50,6,3,109,117,108,0,1,5,100,105,118,95,115,0,2,5,100,105,118,95,117,0,3,5,114,101,109,95,115,0,4,5,114,101,109,95,117,0,5,8,103,101,116,95,104,105,103,104,0,0,10,191,1,6,4,0,35,0,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,126,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,127,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,128,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,129,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,130,34,4,66,32,135,167,36,0,32,4,167,11])),{}).exports}catch(e){}function s(e,t,n){this.low=0|e,this.high=0|t,this.unsigned=!!n}function o(e){return!0===(e&&e.__isLong__)}s.prototype.__isLong__,Object.defineProperty(s.prototype,"__isLong__",{value:!0}),s.isLong=o;var r={},i={};function a(e,t){var n,s,o;return t?(o=0<=(e>>>=0)&&e<256)&&(s=i[e])?s:(n=d(e,(0|e)<0?-1:0,!0),o&&(i[e]=n),n):(o=-128<=(e|=0)&&e<128)&&(s=r[e])?s:(n=d(e,e<0?-1:0,!1),o&&(r[e]=n),n)}function u(e,t){if(isNaN(e))return t?g:j;if(t){if(e<0)return g;if(e>=m)return x}else{if(e<=-h)return y;if(e+1>=h)return v}return e<0?u(-e,t).neg():d(e%p|0,e/p|0,t)}function d(e,t,n){return new s(e,t,n)}s.fromInt=a,s.fromNumber=u,s.fromBits=d;var l=Math.pow;function c(e,t,n){if(0===e.length)throw Error("empty string");if("NaN"===e||"Infinity"===e||"+Infinity"===e||"-Infinity"===e)return j;if("number"==typeof t?(n=t,t=!1):t=!!t,(n=n||10)<2||360)throw Error("interior hyphen");if(0===s)return c(e.substring(1),t,n).neg();for(var o=u(l(n,8)),r=j,i=0;i>>0:this.low},O.toNumber=function(){return this.unsigned?(this.high>>>0)*p+(this.low>>>0):this.high*p+(this.low>>>0)},O.toString=function(e){if((e=e||10)<2||36>>0).toString(e);if((r=a).isZero())return d+i;for(;d.length<6;)d="0"+d;i=""+d+i}},O.getHighBits=function(){return this.high},O.getHighBitsUnsigned=function(){return this.high>>>0},O.getLowBits=function(){return this.low},O.getLowBitsUnsigned=function(){return this.low>>>0},O.getNumBitsAbs=function(){if(this.isNegative())return this.eq(y)?64:this.neg().getNumBitsAbs();for(var e=0!=this.high?this.high:this.low,t=31;t>0&&0==(e&1<=0},O.isOdd=function(){return 1==(1&this.low)},O.isEven=function(){return 0==(1&this.low)},O.equals=function(e){return o(e)||(e=f(e)),(this.unsigned===e.unsigned||this.high>>>31!=1||e.high>>>31!=1)&&(this.high===e.high&&this.low===e.low)},O.eq=O.equals,O.notEquals=function(e){return!this.eq(e)},O.neq=O.notEquals,O.ne=O.notEquals,O.lessThan=function(e){return this.comp(e)<0},O.lt=O.lessThan,O.lessThanOrEqual=function(e){return this.comp(e)<=0},O.lte=O.lessThanOrEqual,O.le=O.lessThanOrEqual,O.greaterThan=function(e){return this.comp(e)>0},O.gt=O.greaterThan,O.greaterThanOrEqual=function(e){return this.comp(e)>=0},O.gte=O.greaterThanOrEqual,O.ge=O.greaterThanOrEqual,O.compare=function(e){if(o(e)||(e=f(e)),this.eq(e))return 0;var t=this.isNegative(),n=e.isNegative();return t&&!n?-1:!t&&n?1:this.unsigned?e.high>>>0>this.high>>>0||e.high===this.high&&e.low>>>0>this.low>>>0?-1:1:this.sub(e).isNegative()?-1:1},O.comp=O.compare,O.negate=function(){return!this.unsigned&&this.eq(y)?y:this.not().add(w)},O.neg=O.negate,O.add=function(e){o(e)||(e=f(e));var t=this.high>>>16,n=65535&this.high,s=this.low>>>16,r=65535&this.low,i=e.high>>>16,a=65535&e.high,u=e.low>>>16,l=0,c=0,p=0,m=0;return p+=(m+=r+(65535&e.low))>>>16,c+=(p+=s+u)>>>16,l+=(c+=n+a)>>>16,l+=t+i,d((p&=65535)<<16|(m&=65535),(l&=65535)<<16|(c&=65535),this.unsigned)},O.subtract=function(e){return o(e)||(e=f(e)),this.add(e.neg())},O.sub=O.subtract,O.multiply=function(e){if(this.isZero())return j;if(o(e)||(e=f(e)),n)return d(n.mul(this.low,this.high,e.low,e.high),n.get_high(),this.unsigned);if(e.isZero())return j;if(this.eq(y))return e.isOdd()?y:j;if(e.eq(y))return this.isOdd()?y:j;if(this.isNegative())return e.isNegative()?this.neg().mul(e.neg()):this.neg().mul(e).neg();if(e.isNegative())return this.mul(e.neg()).neg();if(this.lt(b)&&e.lt(b))return u(this.toNumber()*e.toNumber(),this.unsigned);var t=this.high>>>16,s=65535&this.high,r=this.low>>>16,i=65535&this.low,a=e.high>>>16,l=65535&e.high,c=e.low>>>16,p=65535&e.low,m=0,h=0,g=0,w=0;return g+=(w+=i*p)>>>16,h+=(g+=r*p)>>>16,g&=65535,h+=(g+=i*c)>>>16,m+=(h+=s*p)>>>16,h&=65535,m+=(h+=r*c)>>>16,h&=65535,m+=(h+=i*l)>>>16,m+=t*p+s*c+r*l+i*a,d((g&=65535)<<16|(w&=65535),(m&=65535)<<16|(h&=65535),this.unsigned)},O.mul=O.multiply,O.divide=function(e){if(o(e)||(e=f(e)),e.isZero())throw Error("division by zero");var t,s,r;if(n)return this.unsigned||-2147483648!==this.high||-1!==e.low||-1!==e.high?d((this.unsigned?n.div_u:n.div_s)(this.low,this.high,e.low,e.high),n.get_high(),this.unsigned):this;if(this.isZero())return this.unsigned?g:j;if(this.unsigned){if(e.unsigned||(e=e.toUnsigned()),e.gt(this))return g;if(e.gt(this.shru(1)))return _;r=g}else{if(this.eq(y))return e.eq(w)||e.eq(k)?y:e.eq(y)?w:(t=this.shr(1).div(e).shl(1)).eq(j)?e.isNegative()?w:k:(s=this.sub(e.mul(t)),r=t.add(s.div(e)));if(e.eq(y))return this.unsigned?g:j;if(this.isNegative())return e.isNegative()?this.neg().div(e.neg()):this.neg().div(e).neg();if(e.isNegative())return this.div(e.neg()).neg();r=j}for(s=this;s.gte(e);){t=Math.max(1,Math.floor(s.toNumber()/e.toNumber()));for(var i=Math.ceil(Math.log(t)/Math.LN2),a=i<=48?1:l(2,i-48),c=u(t),p=c.mul(e);p.isNegative()||p.gt(s);)p=(c=u(t-=a,this.unsigned)).mul(e);c.isZero()&&(c=w),r=r.add(c),s=s.sub(p)}return r},O.div=O.divide,O.modulo=function(e){return o(e)||(e=f(e)),n?d((this.unsigned?n.rem_u:n.rem_s)(this.low,this.high,e.low,e.high),n.get_high(),this.unsigned):this.sub(this.div(e).mul(e))},O.mod=O.modulo,O.rem=O.modulo,O.not=function(){return d(~this.low,~this.high,this.unsigned)},O.and=function(e){return o(e)||(e=f(e)),d(this.low&e.low,this.high&e.high,this.unsigned)},O.or=function(e){return o(e)||(e=f(e)),d(this.low|e.low,this.high|e.high,this.unsigned)},O.xor=function(e){return o(e)||(e=f(e)),d(this.low^e.low,this.high^e.high,this.unsigned)},O.shiftLeft=function(e){return o(e)&&(e=e.toInt()),0==(e&=63)?this:e<32?d(this.low<>>32-e,this.unsigned):d(0,this.low<>>e|this.high<<32-e,this.high>>e,this.unsigned):d(this.high>>e-32,this.high>=0?0:-1,this.unsigned)},O.shr=O.shiftRight,O.shiftRightUnsigned=function(e){if(o(e)&&(e=e.toInt()),0===(e&=63))return this;var t=this.high;return e<32?d(this.low>>>e|t<<32-e,t>>>e,this.unsigned):d(32===e?t:t>>>e-32,0,this.unsigned)},O.shru=O.shiftRightUnsigned,O.shr_u=O.shiftRightUnsigned,O.toSigned=function(){return this.unsigned?d(this.low,this.high,!1):this},O.toUnsigned=function(){return this.unsigned?this:d(this.low,this.high,!0)},O.toBytes=function(e){return e?this.toBytesLE():this.toBytesBE()},O.toBytesLE=function(){var e=this.high,t=this.low;return[255&t,t>>>8&255,t>>>16&255,t>>>24,255&e,e>>>8&255,e>>>16&255,e>>>24]},O.toBytesBE=function(){var e=this.high,t=this.low;return[e>>>24,e>>>16&255,e>>>8&255,255&e,t>>>24,t>>>16&255,t>>>8&255,255&t]},s.fromBytes=function(e,t,n){return n?s.fromBytesLE(e,t):s.fromBytesBE(e,t)},s.fromBytesLE=function(e,t){return new s(e[0]|e[1]<<8|e[2]<<16|e[3]<<24,e[4]|e[5]<<8|e[6]<<16|e[7]<<24,t)},s.fromBytesBE=function(e,t){return new s(e[4]<<24|e[5]<<16|e[6]<<8|e[7],e[0]<<24|e[1]<<16|e[2]<<8|e[3],t)}},"./node_modules/process/browser.js": /*!*****************************************!*\ !*** ./node_modules/process/browser.js ***! \*****************************************/ -/*! no static exports found */function(e,t){var n,s,o=e.exports={};function r(){throw new Error("setTimeout has not been defined")}function i(){throw new Error("clearTimeout has not been defined")}function a(e){if(n===setTimeout)return setTimeout(e,0);if((n===r||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:r}catch(e){n=r}try{s="function"==typeof clearTimeout?clearTimeout:i}catch(e){s=i}}();var d,u=[],l=!1,c=-1;function f(){l&&d&&(l=!1,d.length?u=d.concat(u):c=-1,u.length&&p())}function p(){if(!l){var e=a(f);l=!0;for(var t=u.length;t;){for(d=u,u=[];++c1)for(var n=1;n1)for(var n=1;n>>0,t=(s*=t)>>>0,t+=4294967296*(s-=t)}return 2.3283064365386963e-10*(t>>>0)});n.next=function(){var e=2091639*n.s0+2.3283064365386963e-10*n.c;return n.s0=n.s1,n.s1=n.s2,n.s2=e-(n.c=0|e)},n.c=1,n.s0=s(" "),n.s1=s(" "),n.s2=s(" "),n.s0-=s(e),n.s0<0&&(n.s0+=1),n.s1-=s(e),n.s1<0&&(n.s1+=1),n.s2-=s(e),n.s2<0&&(n.s2+=1),s=null}function a(e,t){return t.c=e.c,t.s0=e.s0,t.s1=e.s1,t.s2=e.s2,t}function d(e,t){var n=new i(e),s=t&&t.state,o=n.next;return o.int32=function(){return 4294967296*n.next()|0},o.double=function(){return o()+11102230246251565e-32*(2097152*o()|0)},o.quick=o,s&&("object"==typeof s&&a(s,n),o.state=function(){return a(n,{})}),o}o&&o.exports?o.exports=d:n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js")&&n(/*! !webpack amd options */"./node_modules/webpack/buildin/amd-options.js")?void 0===(s=function(){return d}.call(t,n,t,o))||(o.exports=s):this.alea=d}(0,e,n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js"))}).call(this,n(/*! ./../../webpack/buildin/module.js */"./node_modules/webpack/buildin/module.js")(e))},"./node_modules/seedrandom/lib/tychei.js": +/*! no static exports found */function(e,t,n){(function(e){var s;!function(e,o,r){function i(e){var t,n=this,s=(t=4022871197,function(e){e=e.toString();for(var n=0;n>>0,t=(s*=t)>>>0,t+=4294967296*(s-=t)}return 2.3283064365386963e-10*(t>>>0)});n.next=function(){var e=2091639*n.s0+2.3283064365386963e-10*n.c;return n.s0=n.s1,n.s1=n.s2,n.s2=e-(n.c=0|e)},n.c=1,n.s0=s(" "),n.s1=s(" "),n.s2=s(" "),n.s0-=s(e),n.s0<0&&(n.s0+=1),n.s1-=s(e),n.s1<0&&(n.s1+=1),n.s2-=s(e),n.s2<0&&(n.s2+=1),s=null}function a(e,t){return t.c=e.c,t.s0=e.s0,t.s1=e.s1,t.s2=e.s2,t}function u(e,t){var n=new i(e),s=t&&t.state,o=n.next;return o.int32=function(){return 4294967296*n.next()|0},o.double=function(){return o()+11102230246251565e-32*(2097152*o()|0)},o.quick=o,s&&("object"==typeof s&&a(s,n),o.state=function(){return a(n,{})}),o}o&&o.exports?o.exports=u:n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js")&&n(/*! !webpack amd options */"./node_modules/webpack/buildin/amd-options.js")?void 0===(s=function(){return u}.call(t,n,t,o))||(o.exports=s):this.alea=u}(0,e,n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js"))}).call(this,n(/*! ./../../webpack/buildin/module.js */"./node_modules/webpack/buildin/module.js")(e))},"./node_modules/seedrandom/lib/tychei.js": /*!***********************************************!*\ !*** ./node_modules/seedrandom/lib/tychei.js ***! \***********************************************/ -/*! no static exports found */function(e,t,n){(function(e){var s;!function(e,o,r){function i(e){var t=this,n="";t.next=function(){var e=t.b,n=t.c,s=t.d,o=t.a;return e=e<<25^e>>>7^n,n=n-s|0,s=s<<24^s>>>8^o,o=o-e|0,t.b=e=e<<20^e>>>12^n,t.c=n=n-s|0,t.d=s<<16^n>>>16^o,t.a=o-e|0},t.a=0,t.b=0,t.c=-1640531527,t.d=1367130551,e===Math.floor(e)?(t.a=e/4294967296|0,t.b=0|e):n+=e;for(var s=0;s>>0)/4294967296};return o.double=function(){do{var e=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},o.int32=n.next,o.quick=o,s&&("object"==typeof s&&a(s,n),o.state=function(){return a(n,{})}),o}o&&o.exports?o.exports=d:n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js")&&n(/*! !webpack amd options */"./node_modules/webpack/buildin/amd-options.js")?void 0===(s=function(){return d}.call(t,n,t,o))||(o.exports=s):this.tychei=d}(0,e,n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js"))}).call(this,n(/*! ./../../webpack/buildin/module.js */"./node_modules/webpack/buildin/module.js")(e))},"./node_modules/seedrandom/lib/xor128.js": +/*! no static exports found */function(e,t,n){(function(e){var s;!function(e,o,r){function i(e){var t=this,n="";t.next=function(){var e=t.b,n=t.c,s=t.d,o=t.a;return e=e<<25^e>>>7^n,n=n-s|0,s=s<<24^s>>>8^o,o=o-e|0,t.b=e=e<<20^e>>>12^n,t.c=n=n-s|0,t.d=s<<16^n>>>16^o,t.a=o-e|0},t.a=0,t.b=0,t.c=-1640531527,t.d=1367130551,e===Math.floor(e)?(t.a=e/4294967296|0,t.b=0|e):n+=e;for(var s=0;s>>0)/4294967296};return o.double=function(){do{var e=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},o.int32=n.next,o.quick=o,s&&("object"==typeof s&&a(s,n),o.state=function(){return a(n,{})}),o}o&&o.exports?o.exports=u:n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js")&&n(/*! !webpack amd options */"./node_modules/webpack/buildin/amd-options.js")?void 0===(s=function(){return u}.call(t,n,t,o))||(o.exports=s):this.tychei=u}(0,e,n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js"))}).call(this,n(/*! ./../../webpack/buildin/module.js */"./node_modules/webpack/buildin/module.js")(e))},"./node_modules/seedrandom/lib/xor128.js": /*!***********************************************!*\ !*** ./node_modules/seedrandom/lib/xor128.js ***! \***********************************************/ -/*! no static exports found */function(e,t,n){(function(e){var s;!function(e,o,r){function i(e){var t=this,n="";t.x=0,t.y=0,t.z=0,t.w=0,t.next=function(){var e=t.x^t.x<<11;return t.x=t.y,t.y=t.z,t.z=t.w,t.w^=t.w>>>19^e^e>>>8},e===(0|e)?t.x=e:n+=e;for(var s=0;s>>0)/4294967296};return o.double=function(){do{var e=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},o.int32=n.next,o.quick=o,s&&("object"==typeof s&&a(s,n),o.state=function(){return a(n,{})}),o}o&&o.exports?o.exports=d:n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js")&&n(/*! !webpack amd options */"./node_modules/webpack/buildin/amd-options.js")?void 0===(s=function(){return d}.call(t,n,t,o))||(o.exports=s):this.xor128=d}(0,e,n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js"))}).call(this,n(/*! ./../../webpack/buildin/module.js */"./node_modules/webpack/buildin/module.js")(e))},"./node_modules/seedrandom/lib/xor4096.js": +/*! no static exports found */function(e,t,n){(function(e){var s;!function(e,o,r){function i(e){var t=this,n="";t.x=0,t.y=0,t.z=0,t.w=0,t.next=function(){var e=t.x^t.x<<11;return t.x=t.y,t.y=t.z,t.z=t.w,t.w^=t.w>>>19^e^e>>>8},e===(0|e)?t.x=e:n+=e;for(var s=0;s>>0)/4294967296};return o.double=function(){do{var e=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},o.int32=n.next,o.quick=o,s&&("object"==typeof s&&a(s,n),o.state=function(){return a(n,{})}),o}o&&o.exports?o.exports=u:n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js")&&n(/*! !webpack amd options */"./node_modules/webpack/buildin/amd-options.js")?void 0===(s=function(){return u}.call(t,n,t,o))||(o.exports=s):this.xor128=u}(0,e,n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js"))}).call(this,n(/*! ./../../webpack/buildin/module.js */"./node_modules/webpack/buildin/module.js")(e))},"./node_modules/seedrandom/lib/xor4096.js": /*!************************************************!*\ !*** ./node_modules/seedrandom/lib/xor4096.js ***! \************************************************/ -/*! no static exports found */function(e,t,n){(function(e){var s;!function(e,o,r){function i(e){var t=this;t.next=function(){var e,n,s=t.w,o=t.X,r=t.i;return t.w=s=s+1640531527|0,n=o[r+34&127],e=o[r=r+1&127],n^=n<<13,e^=e<<17,n^=n>>>15,e^=e>>>12,n=o[r]=n^e,t.i=r,n+(s^s>>>16)|0},function(e,t){var n,s,o,r,i,a=[],d=128;for(t===(0|t)?(s=t,t=null):(t+="\0",s=0,d=Math.max(d,t.length)),o=0,r=-32;r>>15,s^=s<<4,s^=s>>>13,r>=0&&(i=i+1640531527|0,o=0==(n=a[127&r]^=s+i)?o+1:0);for(o>=128&&(a[127&(t&&t.length||0)]=-1),o=127,r=512;r>0;--r)s=a[o+34&127],n=a[o=o+1&127],s^=s<<13,n^=n<<17,s^=s>>>15,n^=n>>>12,a[o]=s^n;e.w=i,e.X=a,e.i=o}(t,e)}function a(e,t){return t.i=e.i,t.w=e.w,t.X=e.X.slice(),t}function d(e,t){null==e&&(e=+new Date);var n=new i(e),s=t&&t.state,o=function(){return(n.next()>>>0)/4294967296};return o.double=function(){do{var e=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},o.int32=n.next,o.quick=o,s&&(s.X&&a(s,n),o.state=function(){return a(n,{})}),o}o&&o.exports?o.exports=d:n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js")&&n(/*! !webpack amd options */"./node_modules/webpack/buildin/amd-options.js")?void 0===(s=function(){return d}.call(t,n,t,o))||(o.exports=s):this.xor4096=d}(0,e,n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js"))}).call(this,n(/*! ./../../webpack/buildin/module.js */"./node_modules/webpack/buildin/module.js")(e))},"./node_modules/seedrandom/lib/xorshift7.js": +/*! no static exports found */function(e,t,n){(function(e){var s;!function(e,o,r){function i(e){var t=this;t.next=function(){var e,n,s=t.w,o=t.X,r=t.i;return t.w=s=s+1640531527|0,n=o[r+34&127],e=o[r=r+1&127],n^=n<<13,e^=e<<17,n^=n>>>15,e^=e>>>12,n=o[r]=n^e,t.i=r,n+(s^s>>>16)|0},function(e,t){var n,s,o,r,i,a=[],u=128;for(t===(0|t)?(s=t,t=null):(t+="\0",s=0,u=Math.max(u,t.length)),o=0,r=-32;r>>15,s^=s<<4,s^=s>>>13,r>=0&&(i=i+1640531527|0,o=0==(n=a[127&r]^=s+i)?o+1:0);for(o>=128&&(a[127&(t&&t.length||0)]=-1),o=127,r=512;r>0;--r)s=a[o+34&127],n=a[o=o+1&127],s^=s<<13,n^=n<<17,s^=s>>>15,n^=n>>>12,a[o]=s^n;e.w=i,e.X=a,e.i=o}(t,e)}function a(e,t){return t.i=e.i,t.w=e.w,t.X=e.X.slice(),t}function u(e,t){null==e&&(e=+new Date);var n=new i(e),s=t&&t.state,o=function(){return(n.next()>>>0)/4294967296};return o.double=function(){do{var e=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},o.int32=n.next,o.quick=o,s&&(s.X&&a(s,n),o.state=function(){return a(n,{})}),o}o&&o.exports?o.exports=u:n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js")&&n(/*! !webpack amd options */"./node_modules/webpack/buildin/amd-options.js")?void 0===(s=function(){return u}.call(t,n,t,o))||(o.exports=s):this.xor4096=u}(0,e,n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js"))}).call(this,n(/*! ./../../webpack/buildin/module.js */"./node_modules/webpack/buildin/module.js")(e))},"./node_modules/seedrandom/lib/xorshift7.js": /*!**************************************************!*\ !*** ./node_modules/seedrandom/lib/xorshift7.js ***! \**************************************************/ -/*! no static exports found */function(e,t,n){(function(e){var s;!function(e,o,r){function i(e){var t=this;t.next=function(){var e,n,s=t.x,o=t.i;return e=s[o],n=(e^=e>>>7)^e<<24,n^=(e=s[o+1&7])^e>>>10,n^=(e=s[o+3&7])^e>>>3,n^=(e=s[o+4&7])^e<<7,e=s[o+7&7],n^=(e^=e<<13)^e<<9,s[o]=n,t.i=o+1&7,n},function(e,t){var n,s=[];if(t===(0|t))s[0]=t;else for(t=""+t,n=0;n0;--n)e.next()}(t,e)}function a(e,t){return t.x=e.x.slice(),t.i=e.i,t}function d(e,t){null==e&&(e=+new Date);var n=new i(e),s=t&&t.state,o=function(){return(n.next()>>>0)/4294967296};return o.double=function(){do{var e=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},o.int32=n.next,o.quick=o,s&&(s.x&&a(s,n),o.state=function(){return a(n,{})}),o}o&&o.exports?o.exports=d:n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js")&&n(/*! !webpack amd options */"./node_modules/webpack/buildin/amd-options.js")?void 0===(s=function(){return d}.call(t,n,t,o))||(o.exports=s):this.xorshift7=d}(0,e,n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js"))}).call(this,n(/*! ./../../webpack/buildin/module.js */"./node_modules/webpack/buildin/module.js")(e))},"./node_modules/seedrandom/lib/xorwow.js": +/*! no static exports found */function(e,t,n){(function(e){var s;!function(e,o,r){function i(e){var t=this;t.next=function(){var e,n,s=t.x,o=t.i;return e=s[o],n=(e^=e>>>7)^e<<24,n^=(e=s[o+1&7])^e>>>10,n^=(e=s[o+3&7])^e>>>3,n^=(e=s[o+4&7])^e<<7,e=s[o+7&7],n^=(e^=e<<13)^e<<9,s[o]=n,t.i=o+1&7,n},function(e,t){var n,s=[];if(t===(0|t))s[0]=t;else for(t=""+t,n=0;n0;--n)e.next()}(t,e)}function a(e,t){return t.x=e.x.slice(),t.i=e.i,t}function u(e,t){null==e&&(e=+new Date);var n=new i(e),s=t&&t.state,o=function(){return(n.next()>>>0)/4294967296};return o.double=function(){do{var e=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},o.int32=n.next,o.quick=o,s&&(s.x&&a(s,n),o.state=function(){return a(n,{})}),o}o&&o.exports?o.exports=u:n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js")&&n(/*! !webpack amd options */"./node_modules/webpack/buildin/amd-options.js")?void 0===(s=function(){return u}.call(t,n,t,o))||(o.exports=s):this.xorshift7=u}(0,e,n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js"))}).call(this,n(/*! ./../../webpack/buildin/module.js */"./node_modules/webpack/buildin/module.js")(e))},"./node_modules/seedrandom/lib/xorwow.js": /*!***********************************************!*\ !*** ./node_modules/seedrandom/lib/xorwow.js ***! \***********************************************/ -/*! no static exports found */function(e,t,n){(function(e){var s;!function(e,o,r){function i(e){var t=this,n="";t.next=function(){var e=t.x^t.x>>>2;return t.x=t.y,t.y=t.z,t.z=t.w,t.w=t.v,(t.d=t.d+362437|0)+(t.v=t.v^t.v<<4^e^e<<1)|0},t.x=0,t.y=0,t.z=0,t.w=0,t.v=0,e===(0|e)?t.x=e:n+=e;for(var s=0;s>>4),t.next()}function a(e,t){return t.x=e.x,t.y=e.y,t.z=e.z,t.w=e.w,t.v=e.v,t.d=e.d,t}function d(e,t){var n=new i(e),s=t&&t.state,o=function(){return(n.next()>>>0)/4294967296};return o.double=function(){do{var e=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},o.int32=n.next,o.quick=o,s&&("object"==typeof s&&a(s,n),o.state=function(){return a(n,{})}),o}o&&o.exports?o.exports=d:n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js")&&n(/*! !webpack amd options */"./node_modules/webpack/buildin/amd-options.js")?void 0===(s=function(){return d}.call(t,n,t,o))||(o.exports=s):this.xorwow=d}(0,e,n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js"))}).call(this,n(/*! ./../../webpack/buildin/module.js */"./node_modules/webpack/buildin/module.js")(e))},"./node_modules/seedrandom/seedrandom.js": +/*! no static exports found */function(e,t,n){(function(e){var s;!function(e,o,r){function i(e){var t=this,n="";t.next=function(){var e=t.x^t.x>>>2;return t.x=t.y,t.y=t.z,t.z=t.w,t.w=t.v,(t.d=t.d+362437|0)+(t.v=t.v^t.v<<4^e^e<<1)|0},t.x=0,t.y=0,t.z=0,t.w=0,t.v=0,e===(0|e)?t.x=e:n+=e;for(var s=0;s>>4),t.next()}function a(e,t){return t.x=e.x,t.y=e.y,t.z=e.z,t.w=e.w,t.v=e.v,t.d=e.d,t}function u(e,t){var n=new i(e),s=t&&t.state,o=function(){return(n.next()>>>0)/4294967296};return o.double=function(){do{var e=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},o.int32=n.next,o.quick=o,s&&("object"==typeof s&&a(s,n),o.state=function(){return a(n,{})}),o}o&&o.exports?o.exports=u:n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js")&&n(/*! !webpack amd options */"./node_modules/webpack/buildin/amd-options.js")?void 0===(s=function(){return u}.call(t,n,t,o))||(o.exports=s):this.xorwow=u}(0,e,n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js"))}).call(this,n(/*! ./../../webpack/buildin/module.js */"./node_modules/webpack/buildin/module.js")(e))},"./node_modules/seedrandom/seedrandom.js": /*!***********************************************!*\ !*** ./node_modules/seedrandom/seedrandom.js ***! \***********************************************/ -/*! no static exports found */function(e,t,n){var s;!function(o,r){var i,a=this,d=256,u=r.pow(d,6),l=r.pow(2,52),c=2*l,f=255;function p(e,t,n){var s=[],f=j(b((t=1==t?{entropy:!0}:t||{}).entropy?[e,g(o)]:null==e?function(){try{var e;return i&&(e=i.randomBytes)?e=e(d):(e=new Uint8Array(d),(a.crypto||a.msCrypto).getRandomValues(e)),g(e)}catch(e){var t=a.navigator,n=t&&t.plugins;return[+new Date,a,n,a.screen,g(o)]}}():e,3),s),p=new m(s),w=function(){for(var e=p.g(6),t=u,n=0;e=c;)e/=2,t/=2,n>>>=1;return(e+n)/t};return w.int32=function(){return 0|p.g(4)},w.quick=function(){return p.g(4)/4294967296},w.double=w,j(g(p.S),o),(t.pass||n||function(e,t,n,s){return s&&(s.S&&h(s,p),e.state=function(){return h(p,{})}),n?(r.random=e,t):e})(w,f,"global"in t?t.global:this==r,t.state)}function m(e){var t,n=e.length,s=this,o=0,r=s.i=s.j=0,i=s.S=[];for(n||(e=[n++]);o=c;)e/=2,t/=2,n>>>=1;return(e+n)/t};return w.int32=function(){return 0|p.g(4)},w.quick=function(){return p.g(4)/4294967296},w.double=w,j(g(p.S),o),(t.pass||n||function(e,t,n,s){return s&&(s.S&&h(s,p),e.state=function(){return h(p,{})}),n?(r.random=e,t):e})(w,f,"global"in t?t.global:this==r,t.state)}function m(e){var t,n=e.length,s=this,o=0,r=s.i=s.j=0,i=s.S=[];for(n||(e=[n++]);o>1,l=-7,c=n?o-1:0,f= /*!***************************!*\ !*** ./src/nn/context.ts ***! \***************************/ -/*! exports provided: MLPowerPreference, MLDevicePreference, MLContext */function(e,t,n){"use strict";n.r(t),n.d(t,"MLPowerPreference",(function(){return s})),n.d(t,"MLDevicePreference",(function(){return o})),n.d(t,"MLContext",(function(){return d}));n(/*! @tensorflow/tfjs-backend-webgl */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/index.js"),n(/*! @tensorflow/tfjs-backend-cpu */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/index.js");var s,o,r=n(/*! @tensorflow/tfjs-backend-wasm */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/index.js"),i=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),a=n(/*! ./utils */"./src/nn/utils.ts");!function(e){e.default="default",e["high-performance"]="high-performance",e["low-power"]="low-power"}(s||(s={})),function(e){e.default="default",e.gpu="gpu",e.cpu="cpu"}(o||(o={}));class d{constructor(e={}){a.assert(e instanceof Object,"Invalid options."),void 0!==e.powerPreference&&a.assert(e.powerPreference in s,"Invalid power preference."),this.options_=e}get options(){return this.options_}get tf(){return r.setWasmPaths(`https://unpkg.com/@tensorflow/tfjs-backend-wasm@${i.version_core}/dist/`),i}}},"./src/nn/graph.ts": +/*! exports provided: MLPowerPreference, MLDevicePreference, MLContext */function(e,t,n){"use strict";n.r(t),n.d(t,"MLPowerPreference",(function(){return s})),n.d(t,"MLDevicePreference",(function(){return o})),n.d(t,"MLContext",(function(){return u}));n(/*! @tensorflow/tfjs-backend-webgl */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/index.js"),n(/*! @tensorflow/tfjs-backend-cpu */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/index.js");var s,o,r=n(/*! @tensorflow/tfjs-backend-wasm */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/index.js"),i=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),a=n(/*! ./utils */"./src/nn/utils.ts");!function(e){e.default="default",e["high-performance"]="high-performance",e["low-power"]="low-power"}(s||(s={})),function(e){e.default="default",e.gpu="gpu",e.cpu="cpu"}(o||(o={}));class u{constructor(e={}){a.assert(e instanceof Object,"Invalid options."),void 0!==e.powerPreference&&a.assert(e.powerPreference in s,"Invalid power preference."),this.options_=e}get options(){return this.options_}get tf(){return r.setWasmPaths(`https://unpkg.com/@tensorflow/tfjs-backend-wasm@${i.version_core}/dist/`),i}}},"./src/nn/graph.ts": /*!*************************!*\ !*** ./src/nn/graph.ts ***! \*************************/ -/*! exports provided: ExecutionContext, MLGraph */function(e,t,n){"use strict";n.r(t),n.d(t,"ExecutionContext",(function(){return i})),n.d(t,"MLGraph",(function(){return a}));n(/*! @tensorflow/tfjs-backend-webgl */"./node_modules/@tensorflow/tfjs-backend-webgl/dist/index.js"),n(/*! @tensorflow/tfjs-backend-cpu */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/index.js"),n(/*! @tensorflow/tfjs-backend-wasm */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/index.js");var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./operand */"./src/nn/operand.ts"),r=n(/*! ./utils */"./src/nn/utils.ts");class i{constructor(e,t,n,s){this.constantTenosrs_=e,this.operandRefs_=s,this.allocateInputTensors(t,n),this.outputTensors_=new Map,this.outputOperands_=new Set}allocateInputTensors(e,t){this.inputTensors_=new Map;for(const n in t){const s=t[n],o=e.get(n);let i,a;void 0!==s.dimensions?(i={type:o.desc.type,dimensions:s.dimensions},a=s.resource):(i=o.desc,a=s),this.inputTensors_.set(o,{ref:this.operandRefs_.get(o),tensor:r.createTensor(i,a)})}}compute(e){for(const t of e.values())this.outputOperands_.add(t);const t={};for(const n of e.keys())t[n]=this.getTensor(e.get(n));return t}setOutputTensor(e,t){r.assert(!this.outputTensors_.has(e),"MLOutput already has tensor."),this.outputTensors_.set(e,{ref:this.operandRefs_.get(e),tensor:t})}releaseTensor(e){let t;if(e instanceof o.InputOperand)t=this.inputTensors_;else{if(!(e instanceof o.OutputOperand))return;if(this.outputOperands_.has(e))return;t=this.outputTensors_}const n=t.get(e);r.assert(void 0!==n,"No tensor found for operand."),n.ref--,0===n.ref&&(s.dispose(n.tensor),t.delete(e))}getTensor(e){if(e instanceof o.ConstantOperand)return this.constantTenosrs_.get(e);if(e instanceof o.InputOperand)return this.inputTensors_.get(e).tensor;if(e instanceof o.OutputOperand)return this.outputTensors_.has(e)||(e.operation.compute(this),r.assert(this.outputTensors_.has(e),"No output is set.")),this.outputTensors_.get(e).tensor;throw new Error("The operand is invalid.")}}class a{constructor(e){this.inputs_=new Map,this.outputs_=new Map,this.constants_=new Set,this.operandRefs_=new Map,this.constantTensors_=new Map,r.assert(void 0!==e,"Invalid argument");for(const t in e)r.assert("string"==typeof t&&e[t]instanceof o.OutputOperand,"The outputs parameter is invalid."),this.outputs_.set(t,e[t]);r.assert(0!==this.outputs_.size,"The outputs is empty")}compute(e,t){this.validateInputs(e),r.assert(0!==Object.keys(t).length,"The outputs is invalid.");const n=new Map;for(const e in t)r.assert("string"==typeof e&&this.outputs_.has(e),"The name of the output is invalid."),r.assert(r.isTypedArray(t[e]),"Only output of ArrayBufferView type is supported."),n.set(e,this.outputs_.get(e));const o=s.tidy((()=>new i(this.constantTensors_,this.inputs_,e,this.operandRefs_).compute(n)));for(const e of Object.keys(o)){const n=o[e],i=r.createOperandDescriptorFromTensor(n),a=t[e];r.validateTypedArray(a,i.type,i.dimensions),a.set(n.dataSync()),s.dispose(n)}}validateInputs(e){for(const t in e){r.assert("string"==typeof t&&this.inputs_.has(t),"The name of the input is invalid.");const n=this.inputs_.get(t);let s,o;if(void 0!==e[t].dimensions){const i=e[t];s=i.resource,o=i.dimensions,r.assert(void 0!==s,"The resource of input is undefined."),r.assert(!0===r.isIntegerArray(o),"The type of the input dimensions is invalid."),r.assert(o.length===n.desc.dimensions.length,"The rank of the input dimensions is invalid."),r.assert(!r.isDyanmicShape(o),"The value of input dimensions is negative.");for(let e=0;e0&&r.assert(t===o[e],"The value of the input dimensions is invalid.")}}else s=e[t],r.assert(!r.isDyanmicShape(n.desc.dimensions),"The input dimensions is not specified."),o=n.desc.dimensions;r.assert(r.isTypedArray(s),"Only resource of ArrayBufferView type is supported."),r.validateTypedArray(s,n.desc.type,o)}}static buildAndCompile(e){const t=new a(e);return t.build(),t.compile(),t}build(){const e=new Set;for(const t of this.outputs_.values())this.buildOperation(t.operation,e)}buildOperation(e,t){if(!t.has(e)){t.add(e);for(const n of e.inputs()){if(this.operandRefs_.has(n)){let e=this.operandRefs_.get(n);e++,this.operandRefs_.set(n,e)}else this.operandRefs_.set(n,1);if(n instanceof o.InputOperand){if(this.inputs_.has(n.name)){if(this.inputs_.get(n.name)!==n)throw new Error("The name of this input is existed.");continue}this.inputs_.set(n.name,n)}else n instanceof o.ConstantOperand?this.constants_.has(n)||this.constants_.add(n):n instanceof o.OutputOperand&&this.buildOperation(n.operation,t)}}}compile(){this.allocateConstants(),this.computeOnce()}allocateConstants(){for(const e of this.constants_)this.constantTensors_.set(e,r.createTensor(e.desc,e.value))}computeOnce(){const e={};for(const t of this.inputs_.keys()){const n=this.inputs_.get(t),s=n.desc.dimensions.map((e=>e<0?1:e)),o=new(r.getTypedArray(n.desc.type))(r.sizeFromDimensions(n.desc.dimensions));e[t]={resource:o,dimensions:s}}const t=s.tidy((()=>new i(this.constantTensors_,this.inputs_,e,this.operandRefs_).compute(this.outputs_)));for(const e of Object.keys(t)){const n=t[e];n.dataSync(),s.dispose(n)}}dispose(){for(const e of this.constantTensors_.values())s.dispose(e);const e=new Set;for(const t of this.outputs_.values())this.disposeOperation(t.operation,e)}disposeOperation(e,t){if(!t.has(e)){e.dispose(),t.add(e);for(const n of e.inputs())n instanceof o.OutputOperand&&this.disposeOperation(n.operation,t)}}}},"./src/nn/graph_builder.ts": +/*! exports provided: ExecutionContext, MLGraph */function(e,t,n){"use strict";n.r(t),n.d(t,"ExecutionContext",(function(){return i})),n.d(t,"MLGraph",(function(){return a}));n(/*! @tensorflow/tfjs-backend-webgl */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/index.js"),n(/*! @tensorflow/tfjs-backend-cpu */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/index.js"),n(/*! @tensorflow/tfjs-backend-wasm */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/index.js");var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./operand */"./src/nn/operand.ts"),r=n(/*! ./utils */"./src/nn/utils.ts");class i{constructor(e,t,n,s){this.constantTenosrs_=e,this.operandRefs_=s,this.allocateInputTensors(t,n),this.outputTensors_=new Map,this.outputOperands_=new Set}allocateInputTensors(e,t){this.inputTensors_=new Map;for(const n in t){const s=t[n],o=e.get(n);let i,a;void 0!==s.dimensions?(i={type:o.desc.type,dimensions:s.dimensions},a=s.resource):(i=o.desc,a=s),this.inputTensors_.set(o,{ref:this.operandRefs_.get(o),tensor:r.createTensor(i,a)})}}compute(e){for(const t of e.values())this.outputOperands_.add(t);const t={};for(const n of e.keys())t[n]=this.getTensor(e.get(n));return t}setOutputTensor(e,t){r.assert(!this.outputTensors_.has(e),"MLOutput already has tensor."),this.outputTensors_.set(e,{ref:this.operandRefs_.get(e),tensor:t})}releaseTensor(e){let t;if(e instanceof o.InputOperand)t=this.inputTensors_;else{if(!(e instanceof o.OutputOperand))return;if(this.outputOperands_.has(e))return;t=this.outputTensors_}const n=t.get(e);r.assert(void 0!==n,"No tensor found for operand."),n.ref--,0===n.ref&&(s.dispose(n.tensor),t.delete(e))}getTensor(e){if(e instanceof o.ConstantOperand)return this.constantTenosrs_.get(e);if(e instanceof o.InputOperand)return this.inputTensors_.get(e).tensor;if(e instanceof o.OutputOperand)return this.outputTensors_.has(e)||(e.operation.compute(this),r.assert(this.outputTensors_.has(e),"No output is set.")),this.outputTensors_.get(e).tensor;throw new Error("The operand is invalid.")}}class a{constructor(e){this.inputs_=new Map,this.outputs_=new Map,this.constants_=new Set,this.operandRefs_=new Map,this.constantTensors_=new Map,r.assert(void 0!==e,"Invalid argument");for(const t in e)r.assert("string"==typeof t&&e[t]instanceof o.OutputOperand,"The outputs parameter is invalid."),this.outputs_.set(t,e[t]);r.assert(0!==this.outputs_.size,"The outputs is empty")}compute(e,t){this.validateInputs(e),r.assert(0!==Object.keys(t).length,"The outputs is invalid.");const n=new Map;for(const e in t)r.assert("string"==typeof e&&this.outputs_.has(e),"The name of the output is invalid."),r.assert(r.isTypedArray(t[e]),"Only output of ArrayBufferView type is supported."),n.set(e,this.outputs_.get(e));const o=s.tidy((()=>new i(this.constantTensors_,this.inputs_,e,this.operandRefs_).compute(n)));for(const e of Object.keys(o)){const n=o[e],i=r.createOperandDescriptorFromTensor(n),a=t[e];r.validateTypedArray(a,i.type,i.dimensions),a.set(n.dataSync()),s.dispose(n)}}validateInputs(e){for(const t in e){r.assert("string"==typeof t&&this.inputs_.has(t),"The name of the input is invalid.");const n=this.inputs_.get(t);let s,o;if(void 0!==e[t].dimensions){const i=e[t];s=i.resource,o=i.dimensions,r.assert(void 0!==s,"The resource of input is undefined."),r.assert(!0===r.isIntegerArray(o),"The type of the input dimensions is invalid."),r.assert(o.length===n.desc.dimensions.length,"The rank of the input dimensions is invalid."),r.assert(!r.isDyanmicShape(o),"The value of input dimensions is negative.");for(let e=0;e0&&r.assert(t===o[e],"The value of the input dimensions is invalid.")}}else s=e[t],r.assert(!r.isDyanmicShape(n.desc.dimensions),"The input dimensions is not specified."),o=n.desc.dimensions;r.assert(r.isTypedArray(s),"Only resource of ArrayBufferView type is supported."),r.validateTypedArray(s,n.desc.type,o)}}static buildAndCompile(e){const t=new a(e);return t.build(),t.compile(),t}build(){const e=new Set;for(const t of this.outputs_.values())this.buildOperation(t.operation,e)}buildOperation(e,t){if(!t.has(e)){t.add(e);for(const n of e.inputs()){if(this.operandRefs_.has(n)){let e=this.operandRefs_.get(n);e++,this.operandRefs_.set(n,e)}else this.operandRefs_.set(n,1);if(n instanceof o.InputOperand){if(this.inputs_.has(n.name)){if(this.inputs_.get(n.name)!==n)throw new Error("The name of this input is existed.");continue}this.inputs_.set(n.name,n)}else n instanceof o.ConstantOperand?this.constants_.has(n)||this.constants_.add(n):n instanceof o.OutputOperand&&this.buildOperation(n.operation,t)}}}compile(){this.allocateConstants(),this.computeOnce()}allocateConstants(){for(const e of this.constants_)this.constantTensors_.set(e,r.createTensor(e.desc,e.value))}computeOnce(){const e={};for(const t of this.inputs_.keys()){const n=this.inputs_.get(t),s=n.desc.dimensions.map((e=>e<0?1:e)),o=new(r.getTypedArray(n.desc.type))(r.sizeFromDimensions(n.desc.dimensions));e[t]={resource:o,dimensions:s}}const t=s.tidy((()=>new i(this.constantTensors_,this.inputs_,e,this.operandRefs_).compute(this.outputs_)));for(const e of Object.keys(t)){const n=t[e];n.dataSync(),s.dispose(n)}}dispose(){for(const e of this.constantTensors_.values())s.dispose(e);const e=new Set;for(const t of this.outputs_.values())this.disposeOperation(t.operation,e)}disposeOperation(e,t){if(!t.has(e)){e.dispose(),t.add(e);for(const n of e.inputs())n instanceof o.OutputOperand&&this.disposeOperation(n.operation,t)}}}},"./src/nn/graph_builder.ts": /*!*********************************!*\ !*** ./src/nn/graph_builder.ts ***! \*********************************/ -/*! exports provided: MLInputOperandLayout, MLFilterOperandLayout, MLAutoPad, MLRecurrentNetworkWeightLayout, MLRecurrentNetworkDirection, MLPaddingMode, MLInterpolationMode, MLGraphBuilder */function(e,t,n){"use strict";n.r(t),n.d(t,"MLInputOperandLayout",(function(){return s})),n.d(t,"MLFilterOperandLayout",(function(){return o})),n.d(t,"MLAutoPad",(function(){return r})),n.d(t,"MLRecurrentNetworkWeightLayout",(function(){return i})),n.d(t,"MLRecurrentNetworkDirection",(function(){return a})),n.d(t,"MLPaddingMode",(function(){return d})),n.d(t,"MLInterpolationMode",(function(){return u})),n.d(t,"MLGraphBuilder",(function(){return F}));var s,o,r,i,a,d,u,l=n(/*! ./context */"./src/nn/context.ts"),c=n(/*! ./graph */"./src/nn/graph.ts"),f=n(/*! ./operand */"./src/nn/operand.ts"),p=n(/*! ./ops/batch_norm */"./src/nn/ops/batch_norm.ts"),m=n(/*! ./ops/binary */"./src/nn/ops/binary.ts"),h=n(/*! ./ops/clamp */"./src/nn/ops/clamp.ts"),b=n(/*! ./ops/concat */"./src/nn/ops/concat.ts"),j=n(/*! ./ops/conv2d */"./src/nn/ops/conv2d.ts"),g=n(/*! ./ops/gemm */"./src/nn/ops/gemm.ts"),w=n(/*! ./ops/gru */"./src/nn/ops/gru.ts"),_=n(/*! ./ops/instance_norm */"./src/nn/ops/instance_norm.ts"),k=n(/*! ./ops/leaky_relu */"./src/nn/ops/leaky_relu.ts"),v=n(/*! ./ops/pad */"./src/nn/ops/pad.ts"),x=n(/*! ./ops/pool2d */"./src/nn/ops/pool2d.ts"),y=n(/*! ./ops/reduce */"./src/nn/ops/reduce.ts"),O=n(/*! ./ops/resample */"./src/nn/ops/resample.ts"),I=n(/*! ./ops/reshape */"./src/nn/ops/reshape.ts"),C=n(/*! ./ops/slice */"./src/nn/ops/slice.ts"),S=n(/*! ./ops/softmax */"./src/nn/ops/softmax.ts"),T=n(/*! ./ops/split */"./src/nn/ops/split.ts"),N=n(/*! ./ops/squeeze */"./src/nn/ops/squeeze.ts"),E=n(/*! ./ops/transpose */"./src/nn/ops/transpose.ts"),A=n(/*! ./ops/unary */"./src/nn/ops/unary.ts"),R=n(/*! ./utils */"./src/nn/utils.ts");!function(e){e.nchw="nchw",e.nhwc="nhwc"}(s||(s={})),function(e){e.oihw="oihw",e.hwio="hwio",e.ohwi="ohwi",e.ihwo="ihwo"}(o||(o={})),function(e){e.explicit="explicit",e["same-upper"]="same-upper",e["same-lower"]="same-lower"}(r||(r={})),function(e){e.zrn="zrn",e.rzn="rzn"}(i||(i={})),function(e){e.forward="forward",e.backward="backward",e.both="both"}(a||(a={})),function(e){e.constant="constant",e.edge="edge",e.reflection="reflection",e.symmetric="symmetric"}(d||(d={})),function(e){e["nearest-neighbor"]="nearest-neighbor",e.linear="linear"}(u||(u={}));class F{constructor(e){R.assert(e instanceof l.MLContext,"The context paramter is invalid."),this.context_=e}get context(){return this.context_}build(e){return c.MLGraph.buildAndCompile(e)}input(e,t){return new f.InputOperand(e,t,this)}constant(e,t){return"number"==typeof e?(void 0===t&&(t=f.MLOperandType.float32),f.ConstantOperand.createScalar(e,t,this)):f.ConstantOperand.createTensor(e,t,this)}batchNormalization(e,t,n,s={}){return this.validateOperandBuilder([e,t,n,s.scale,s.bias]),new p.BatchNormalization(e,t,n,s).getFusedOutputs()[0]}clamp(e={},t={}){if(e instanceof f.MLOperand){const n=e;return this.validateOperandBuilder([n,t.minValue,t.maxValue]),new h.Clamp(n,t).output}{const t=e;return this.validateOperandBuilder([t.minValue,t.maxValue]),new h.Clamp(void 0,t)}}concat(e,t){return this.validateOperandBuilder(e),new b.Concat(e,t).output}conv2d(e,t,n={}){const s=[e,t];return n.bias&&s.push(n.bias),this.validateOperandBuilder(s),new j.Conv2d(e,t,n).getFusedOutputs()[0]}add(e,t){return this.validateOperandBuilder([e,t]),new m.Add(e,t).output}sub(e,t){return this.validateOperandBuilder([e,t]),new m.Sub(e,t).output}mul(e,t){return this.validateOperandBuilder([e,t]),new m.Mul(e,t).output}div(e,t){return this.validateOperandBuilder([e,t]),new m.Div(e,t).output}max(e,t){return this.validateOperandBuilder([e,t]),new m.Max(e,t).output}min(e,t){return this.validateOperandBuilder([e,t]),new m.Min(e,t).output}pow(e,t){return this.validateOperandBuilder([e,t]),new m.Pow(e,t).output}exp(e){return this.validateOperandBuilder([e]),new A.Exp(e).output}hardSwish(e){return void 0===e?new A.HardSwish(void 0):(this.validateOperandBuilder([e]),new A.HardSwish(e).output)}relu(e){return void 0===e?new A.Relu(void 0):(this.validateOperandBuilder([e]),new A.Relu(e).output)}sigmoid(e){return void 0===e?new A.Sigmoid(void 0):(this.validateOperandBuilder([e]),new A.Sigmoid(e).output)}tanh(e){return void 0===e?new A.Tanh(void 0):(this.validateOperandBuilder([e]),new A.Tanh(e).output)}gemm(e,t,n={}){return this.validateOperandBuilder([e,t,n.c]),g.Gemm.build(this,e,t,n)}gru(e,t,n,s,o,r={}){return this.validateOperandBuilder([e,t,n,r.bias,r.recurrentBias,r.initialHiddenState]),new w.Gru(e,t,n,s,o,r).outputs}gruCell(e,t,n,s,o,r={}){return this.validateOperandBuilder([e,t,n,s,r.bias,r.recurrentBias]),new w.GruCell(e,t,n,s,o,r).output}instanceNormalization(e,t={}){return this.validateOperandBuilder([e,t.bias,t.scale]),new _.InstanceNormalization(e,t).output}leakyRelu(e={},t={}){if(e instanceof f.MLOperand){const n=e;return this.validateOperandBuilder([n]),new k.LeakyRelu(n,t.alpha).output}{const t=e;return new k.LeakyRelu(void 0,t.alpha)}}matmul(e,t){return this.validateOperandBuilder([e,t]),new m.MatMul(e,t).output}pad(e,t,n={}){return this.validateOperandBuilder([e,t]),new v.Pad(e,t,n).output}averagePool2d(e,t={}){return this.validateOperandBuilder([e]),new x.AveragePool2d(e,t).output}l2Pool2d(e,t={}){return this.validateOperandBuilder([e]),new x.L2Pool2d(e,t).output}maxPool2d(e,t={}){return this.validateOperandBuilder([e]),new x.MaxPool2d(e,t).output}reduceL1(e,t={}){return this.validateOperandBuilder([e]),new y.ReduceL1(e,t).output}reduceL2(e,t={}){return this.validateOperandBuilder([e]),new y.ReduceL2(e,t).output}reduceLogSumExp(e,t={}){return this.validateOperandBuilder([e]),new y.ReduceLogSumExp(e,t).output}reduceMax(e,t={}){return this.validateOperandBuilder([e]),new y.ReduceMax(e,t).output}reduceMean(e,t={}){return this.validateOperandBuilder([e]),new y.ReduceMean(e,t).output}reduceMin(e,t={}){return this.validateOperandBuilder([e]),new y.ReduceMin(e,t).output}reduceProduct(e,t={}){return this.validateOperandBuilder([e]),new y.ReduceProduct(e,t).output}reduceSum(e,t={}){return this.validateOperandBuilder([e]),new y.ReduceSum(e,t).output}resample(e,t={}){return this.validateOperandBuilder([e]),new O.Resample(e,t).output}reshape(e,t){return this.validateOperandBuilder([e]),new I.Reshape(e,t).output}slice(e,t,n,s={}){return this.validateOperandBuilder([e]),new C.Slice(e,t,n,s.axes).output}softmax(e){return this.validateOperandBuilder([e]),new S.Softmax(e).output}split(e,t,n={}){return this.validateOperandBuilder([e]),new T.Split(e,t,n).outputs}squeeze(e,t={}){return this.validateOperandBuilder([e]),new N.Squeeze(e,t.axes).output}transpose(e,t={}){return this.validateOperandBuilder([e]),new E.Transpose(e,t.permutation).output}validateOperandBuilder(e){R.assert(e.every((e=>!e||e instanceof f.MLOperand&&e.builder===this)),"The operand is not built by this builder.")}}},"./src/nn/operand.ts": +/*! exports provided: MLInputOperandLayout, MLFilterOperandLayout, MLAutoPad, MLRecurrentNetworkWeightLayout, MLRecurrentNetworkDirection, MLPaddingMode, MLInterpolationMode, MLGraphBuilder */function(e,t,n){"use strict";n.r(t),n.d(t,"MLInputOperandLayout",(function(){return s})),n.d(t,"MLFilterOperandLayout",(function(){return o})),n.d(t,"MLAutoPad",(function(){return r})),n.d(t,"MLRecurrentNetworkWeightLayout",(function(){return i})),n.d(t,"MLRecurrentNetworkDirection",(function(){return a})),n.d(t,"MLPaddingMode",(function(){return u})),n.d(t,"MLInterpolationMode",(function(){return d})),n.d(t,"MLGraphBuilder",(function(){return F}));var s,o,r,i,a,u,d,l=n(/*! ./context */"./src/nn/context.ts"),c=n(/*! ./graph */"./src/nn/graph.ts"),f=n(/*! ./operand */"./src/nn/operand.ts"),p=n(/*! ./ops/batch_norm */"./src/nn/ops/batch_norm.ts"),m=n(/*! ./ops/binary */"./src/nn/ops/binary.ts"),h=n(/*! ./ops/clamp */"./src/nn/ops/clamp.ts"),b=n(/*! ./ops/concat */"./src/nn/ops/concat.ts"),j=n(/*! ./ops/conv2d */"./src/nn/ops/conv2d.ts"),g=n(/*! ./ops/gemm */"./src/nn/ops/gemm.ts"),w=n(/*! ./ops/gru */"./src/nn/ops/gru.ts"),_=n(/*! ./ops/instance_norm */"./src/nn/ops/instance_norm.ts"),k=n(/*! ./ops/leaky_relu */"./src/nn/ops/leaky_relu.ts"),v=n(/*! ./ops/pad */"./src/nn/ops/pad.ts"),x=n(/*! ./ops/pool2d */"./src/nn/ops/pool2d.ts"),y=n(/*! ./ops/reduce */"./src/nn/ops/reduce.ts"),O=n(/*! ./ops/resample */"./src/nn/ops/resample.ts"),I=n(/*! ./ops/reshape */"./src/nn/ops/reshape.ts"),C=n(/*! ./ops/slice */"./src/nn/ops/slice.ts"),S=n(/*! ./ops/softmax */"./src/nn/ops/softmax.ts"),T=n(/*! ./ops/split */"./src/nn/ops/split.ts"),N=n(/*! ./ops/squeeze */"./src/nn/ops/squeeze.ts"),E=n(/*! ./ops/transpose */"./src/nn/ops/transpose.ts"),A=n(/*! ./ops/unary */"./src/nn/ops/unary.ts"),R=n(/*! ./utils */"./src/nn/utils.ts");!function(e){e.nchw="nchw",e.nhwc="nhwc"}(s||(s={})),function(e){e.oihw="oihw",e.hwio="hwio",e.ohwi="ohwi",e.ihwo="ihwo"}(o||(o={})),function(e){e.explicit="explicit",e["same-upper"]="same-upper",e["same-lower"]="same-lower"}(r||(r={})),function(e){e.zrn="zrn",e.rzn="rzn"}(i||(i={})),function(e){e.forward="forward",e.backward="backward",e.both="both"}(a||(a={})),function(e){e.constant="constant",e.edge="edge",e.reflection="reflection",e.symmetric="symmetric"}(u||(u={})),function(e){e["nearest-neighbor"]="nearest-neighbor",e.linear="linear"}(d||(d={}));class F{constructor(e){R.assert(e instanceof l.MLContext,"The context paramter is invalid."),this.context_=e}get context(){return this.context_}build(e){return c.MLGraph.buildAndCompile(e)}input(e,t){return new f.InputOperand(e,t,this)}constant(e,t){return"number"==typeof e?(void 0===t&&(t=f.MLOperandType.float32),f.ConstantOperand.createScalar(e,t,this)):f.ConstantOperand.createTensor(e,t,this)}batchNormalization(e,t,n,s={}){return this.validateOperandBuilder([e,t,n,s.scale,s.bias]),new p.BatchNormalization(e,t,n,s).getFusedOutputs()[0]}clamp(e={},t={}){if(e instanceof f.MLOperand){const n=e;return this.validateOperandBuilder([n,t.minValue,t.maxValue]),new h.Clamp(n,t).output}{const t=e;return this.validateOperandBuilder([t.minValue,t.maxValue]),new h.Clamp(void 0,t)}}concat(e,t){return this.validateOperandBuilder(e),new b.Concat(e,t).output}conv2d(e,t,n={}){const s=[e,t];return n.bias&&s.push(n.bias),this.validateOperandBuilder(s),new j.Conv2d(e,t,n).getFusedOutputs()[0]}add(e,t){return this.validateOperandBuilder([e,t]),new m.Add(e,t).output}sub(e,t){return this.validateOperandBuilder([e,t]),new m.Sub(e,t).output}mul(e,t){return this.validateOperandBuilder([e,t]),new m.Mul(e,t).output}div(e,t){return this.validateOperandBuilder([e,t]),new m.Div(e,t).output}max(e,t){return this.validateOperandBuilder([e,t]),new m.Max(e,t).output}min(e,t){return this.validateOperandBuilder([e,t]),new m.Min(e,t).output}pow(e,t){return this.validateOperandBuilder([e,t]),new m.Pow(e,t).output}exp(e){return this.validateOperandBuilder([e]),new A.Exp(e).output}relu(e){return void 0===e?new A.Relu(void 0):(this.validateOperandBuilder([e]),new A.Relu(e).output)}sigmoid(e){return void 0===e?new A.Sigmoid(void 0):(this.validateOperandBuilder([e]),new A.Sigmoid(e).output)}tanh(e){return void 0===e?new A.Tanh(void 0):(this.validateOperandBuilder([e]),new A.Tanh(e).output)}gemm(e,t,n={}){return this.validateOperandBuilder([e,t,n.c]),g.Gemm.build(this,e,t,n)}gru(e,t,n,s,o,r={}){return this.validateOperandBuilder([e,t,n,r.bias,r.recurrentBias,r.initialHiddenState]),new w.Gru(e,t,n,s,o,r).outputs}gruCell(e,t,n,s,o,r={}){return this.validateOperandBuilder([e,t,n,s,r.bias,r.recurrentBias]),new w.GruCell(e,t,n,s,o,r).output}instanceNormalization(e,t={}){return this.validateOperandBuilder([e,t.bias,t.scale]),new _.InstanceNormalization(e,t).output}leakyRelu(e={},t={}){if(e instanceof f.MLOperand){const n=e;return this.validateOperandBuilder([n]),new k.LeakyRelu(n,t.alpha).output}{const t=e;return new k.LeakyRelu(void 0,t.alpha)}}matmul(e,t){return this.validateOperandBuilder([e,t]),new m.MatMul(e,t).output}pad(e,t,n={}){return this.validateOperandBuilder([e,t]),new v.Pad(e,t,n).output}averagePool2d(e,t={}){return this.validateOperandBuilder([e]),new x.AveragePool2d(e,t).output}maxPool2d(e,t={}){return this.validateOperandBuilder([e]),new x.MaxPool2d(e,t).output}reduceLogSumExp(e,t={}){return this.validateOperandBuilder([e]),new y.ReduceLogSumExp(e,t).output}reduceMax(e,t={}){return this.validateOperandBuilder([e]),new y.ReduceMax(e,t).output}reduceMean(e,t={}){return this.validateOperandBuilder([e]),new y.ReduceMean(e,t).output}reduceMin(e,t={}){return this.validateOperandBuilder([e]),new y.ReduceMin(e,t).output}reduceProduct(e,t={}){return this.validateOperandBuilder([e]),new y.ReduceProduct(e,t).output}reduceSum(e,t={}){return this.validateOperandBuilder([e]),new y.ReduceSum(e,t).output}resample(e,t={}){return this.validateOperandBuilder([e]),new O.Resample(e,t).output}reshape(e,t){return this.validateOperandBuilder([e]),new I.Reshape(e,t).output}slice(e,t,n,s={}){return this.validateOperandBuilder([e]),new C.Slice(e,t,n,s.axes).output}softmax(e){return this.validateOperandBuilder([e]),new S.Softmax(e).output}split(e,t,n={}){return this.validateOperandBuilder([e]),new T.Split(e,t,n).outputs}squeeze(e,t={}){return this.validateOperandBuilder([e]),new N.Squeeze(e,t.axes).output}transpose(e,t={}){return this.validateOperandBuilder([e]),new E.Transpose(e,t.permutation).output}validateOperandBuilder(e){R.assert(e.every((e=>!e||e instanceof f.MLOperand&&e.builder===this)),"The operand is not built by this builder.")}}},"./src/nn/operand.ts": /*!***************************!*\ !*** ./src/nn/operand.ts ***! \***************************/ -/*! exports provided: MLOperandType, MLOperand, InputOperand, ConstantOperand, OutputOperand */function(e,t,n){"use strict";n.r(t),n.d(t,"MLOperandType",(function(){return s})),n.d(t,"MLOperand",(function(){return r})),n.d(t,"InputOperand",(function(){return i})),n.d(t,"ConstantOperand",(function(){return a})),n.d(t,"OutputOperand",(function(){return d}));var s,o=n(/*! ./utils */"./src/nn/utils.ts");!function(e){e.float32="float32",e.float16="float16",e.int32="int32",e.uint32="uint32",e.int8="int8",e.uint8="uint8"}(s||(s={}));class r{constructor(e){this.builder_=e}get builder(){return this.builder_}}class i extends r{constructor(e,t,n){super(n),o.assert("string"==typeof e,"The name parameter is invalid"),this.name=e,o.validateOperandDescriptor(t),this.desc=t}}class a extends r{constructor(e,t,n){super(n),this.desc=e,this.value=t}static createScalar(e,t=s.float32,n){return o.assert(t in s,"The operand type is invalid."),o.validateValueType(e,t),new a({type:t},e,n)}static createTensor(e,t,n){o.assert(o.isTypedArray(t),"Only ArrayBufferView value type is supported.");const s=t;return o.validateOperandDescriptor(e),o.validateTypedArray(s,e.type,e.dimensions),new a(e,s,n)}}class d extends r{constructor(e){super(e.builder),this.operation=e}}},"./src/nn/operation.ts": +/*! exports provided: MLOperandType, MLOperand, InputOperand, ConstantOperand, OutputOperand */function(e,t,n){"use strict";n.r(t),n.d(t,"MLOperandType",(function(){return s})),n.d(t,"MLOperand",(function(){return r})),n.d(t,"InputOperand",(function(){return i})),n.d(t,"ConstantOperand",(function(){return a})),n.d(t,"OutputOperand",(function(){return u}));var s,o=n(/*! ./utils */"./src/nn/utils.ts");!function(e){e.float32="float32",e.float16="float16",e.int32="int32",e.uint32="uint32",e.int8="int8",e.uint8="uint8"}(s||(s={}));class r{constructor(e){this.builder_=e}get builder(){return this.builder_}}class i extends r{constructor(e,t,n){super(n),o.assert("string"==typeof e,"The name parameter is invalid"),this.name=e,o.validateOperandDescriptor(t),this.desc=t}}class a extends r{constructor(e,t,n){super(n),this.desc=e,this.value=t}static createScalar(e,t=s.float32,n){return o.assert(t in s,"The operand type is invalid."),o.validateValueType(e,t),new a({type:t},e,n)}static createTensor(e,t,n){o.assert(o.isTypedArray(t),"Only ArrayBufferView value type is supported.");const s=t;return o.validateOperandDescriptor(e),o.validateTypedArray(s,e.type,e.dimensions),new a(e,s,n)}}class u extends r{constructor(e){super(e.builder),this.operation=e}}},"./src/nn/operation.ts": /*!*****************************!*\ !*** ./src/nn/operation.ts ***! \*****************************/ @@ -18061,11 +18062,11 @@ t.read=function(e,t,n,s,o){var r,i,a=8*o-s-1,d=(1<>1,l=-7,c=n?o-1:0,f= /*!**********************************!*\ !*** ./src/nn/ops/batch_norm.ts ***! \**********************************/ -/*! exports provided: BatchNormalization */function(e,t,n){"use strict";n.r(t),n.d(t,"BatchNormalization",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../operation */"./src/nn/operation.ts"),r=n(/*! ../utils */"./src/nn/utils.ts");class i extends o.SingleOutputOperation{constructor(e,t,n,s={}){if(super(e.builder),r.validateOperand(e),this.input_=e,r.validateOperand(t),this.mean_=t,r.validateOperand(n),this.variance_=n,r.validateOptionalOperand(s.scale),this.scale_=s.scale,r.validateOptionalOperand(s.bias),this.bias_=s.bias,void 0!==s.axis){const e=s.axis;r.assert(r.isInteger(e),"The axis parameter is invalid."),this.axis_=e}else this.axis_=1;if(void 0!==s.epsilon){const e=s.epsilon;r.assert("number"==typeof e,"The epsilon parameter is invalid"),this.epsilon_=e}else this.epsilon_=1e-5;this.activation_=s.activation}inputs(){const e=[this.input_,this.mean_,this.variance_];return this.scale_&&e.push(this.scale_),this.bias_&&e.push(this.bias_),e}getFusedOutputs(){return this.activation_?[this.activation_.apply(this.output)]:[this.output]}run(e){const t=e.get(this.input_);r.assert(this.axis_=-t.rank,"The axis parameter is invalid.");const n=this.axis_>=0?this.axis_:t.rank+this.axis_,o=e.get(this.mean_);r.assert(1===o.rank,"The mean operand is not 1-D.");const i=e.get(this.variance_);let a,d;r.assert(1===i.rank,"The mean operand is not 1-D."),this.scale_&&(a=e.get(this.scale_),r.assert(1===a.rank,"The scale operand is not 1-D.")),this.bias_&&(d=e.get(this.bias_),r.assert(1===d.rank,"The bias operand is not 1-D."));const u=Array.from(Array(t.rank).keys());return u[n]=t.rank-1,u[t.rank-1]=n,s.transpose(s.batchNorm(s.transpose(t,u),o,i,d,a,this.epsilon_),u)}}},"./src/nn/ops/binary.ts": +/*! exports provided: BatchNormalization */function(e,t,n){"use strict";n.r(t),n.d(t,"BatchNormalization",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../operation */"./src/nn/operation.ts"),r=n(/*! ../utils */"./src/nn/utils.ts");class i extends o.SingleOutputOperation{constructor(e,t,n,s={}){if(super(e.builder),r.validateOperand(e),this.input_=e,r.validateOperand(t),this.mean_=t,r.validateOperand(n),this.variance_=n,r.validateOptionalOperand(s.scale),this.scale_=s.scale,r.validateOptionalOperand(s.bias),this.bias_=s.bias,void 0!==s.axis){const e=s.axis;r.assert(r.isInteger(e),"The axis parameter is invalid."),this.axis_=e}else this.axis_=1;if(void 0!==s.epsilon){const e=s.epsilon;r.assert("number"==typeof e,"The epsilon parameter is invalid"),this.epsilon_=e}else this.epsilon_=1e-5;this.activation_=s.activation}inputs(){const e=[this.input_,this.mean_,this.variance_];return this.scale_&&e.push(this.scale_),this.bias_&&e.push(this.bias_),e}getFusedOutputs(){return this.activation_?[this.activation_.apply(this.output)]:[this.output]}run(e){const t=e.get(this.input_);r.assert(this.axis_=-t.rank,"The axis parameter is invalid.");const n=this.axis_>=0?this.axis_:t.rank+this.axis_,o=e.get(this.mean_);r.assert(1===o.rank,"The mean operand is not 1-D.");const i=e.get(this.variance_);let a,u;r.assert(1===i.rank,"The mean operand is not 1-D."),this.scale_&&(a=e.get(this.scale_),r.assert(1===a.rank,"The scale operand is not 1-D.")),this.bias_&&(u=e.get(this.bias_),r.assert(1===u.rank,"The bias operand is not 1-D."));const d=Array.from(Array(t.rank).keys());return d[n]=t.rank-1,d[t.rank-1]=n,s.transpose(s.batchNorm(s.transpose(t,d),o,i,u,a,this.epsilon_),d)}}},"./src/nn/ops/binary.ts": /*!******************************!*\ !*** ./src/nn/ops/binary.ts ***! \******************************/ -/*! exports provided: Binary, Add, Sub, Mul, Div, Max, Min, Pow, MatMul */function(e,t,n){"use strict";n.r(t),n.d(t,"Binary",(function(){return i})),n.d(t,"Add",(function(){return a})),n.d(t,"Sub",(function(){return d})),n.d(t,"Mul",(function(){return u})),n.d(t,"Div",(function(){return l})),n.d(t,"Max",(function(){return c})),n.d(t,"Min",(function(){return f})),n.d(t,"Pow",(function(){return p})),n.d(t,"MatMul",(function(){return m}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../operation */"./src/nn/operation.ts"),r=n(/*! ../utils */"./src/nn/utils.ts");class i extends o.SingleOutputOperation{constructor(e,t){super(e.builder),r.validateOperand(e),this.a_=e,r.validateOperand(t),this.b_=t}inputs(){return[this.a_,this.b_]}run(e){const t=e.get(this.a_),n=e.get(this.b_);return this.runOp(t,n)}}class a extends i{runOp(e,t){return s.add(e,t)}}class d extends i{runOp(e,t){return s.sub(e,t)}}class u extends i{runOp(e,t){return s.mul(e,t)}}class l extends i{runOp(e,t){return s.div(e,t)}}class c extends i{runOp(e,t){return s.maximum(e,t)}}class f extends i{runOp(e,t){return s.minimum(e,t)}}class p extends i{runOp(e,t){return s.pow(e,t)}}class m extends i{runOp(e,t){if(1===e.rank)return 1===t.rank?s.dot(e,t):s.matMul(s.reshape(e,[1,-1]),t);if(1===t.rank)return s.matMul(e,s.reshape(t,[-1,1]));{const n=e.rank>t.rank?e.rank:t.rank;let o=s.matMul(e,t);return o.rank!==n&&(o=s.reshape(o,[1].concat(o.shape))),o}}}},"./src/nn/ops/clamp.ts": +/*! exports provided: Binary, Add, Sub, Mul, Div, Max, Min, Pow, MatMul */function(e,t,n){"use strict";n.r(t),n.d(t,"Binary",(function(){return i})),n.d(t,"Add",(function(){return a})),n.d(t,"Sub",(function(){return u})),n.d(t,"Mul",(function(){return d})),n.d(t,"Div",(function(){return l})),n.d(t,"Max",(function(){return c})),n.d(t,"Min",(function(){return f})),n.d(t,"Pow",(function(){return p})),n.d(t,"MatMul",(function(){return m}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../operation */"./src/nn/operation.ts"),r=n(/*! ../utils */"./src/nn/utils.ts");class i extends o.SingleOutputOperation{constructor(e,t){super(e.builder),r.validateOperand(e),this.a_=e,r.validateOperand(t),this.b_=t}inputs(){return[this.a_,this.b_]}run(e){const t=e.get(this.a_),n=e.get(this.b_);return this.runOp(t,n)}}class a extends i{runOp(e,t){return s.add(e,t)}}class u extends i{runOp(e,t){return s.sub(e,t)}}class d extends i{runOp(e,t){return s.mul(e,t)}}class l extends i{runOp(e,t){return s.div(e,t)}}class c extends i{runOp(e,t){return s.maximum(e,t)}}class f extends i{runOp(e,t){return s.minimum(e,t)}}class p extends i{runOp(e,t){return s.pow(e,t)}}class m extends i{runOp(e,t){if(1===e.rank)return 1===t.rank?s.dot(e,t):s.matMul(s.reshape(e,[1,-1]),t);if(1===t.rank)return s.matMul(e,s.reshape(t,[-1,1]));{const n=e.rank>t.rank?e.rank:t.rank;let o=s.matMul(e,t);return o.rank!==n&&(o=s.reshape(o,[1].concat(o.shape))),o}}}},"./src/nn/ops/clamp.ts": /*!*****************************!*\ !*** ./src/nn/ops/clamp.ts ***! \*****************************/ @@ -18077,19 +18078,19 @@ t.read=function(e,t,n,s,o){var r,i,a=8*o-s-1,d=(1<>1,l=-7,c=n?o-1:0,f= /*!******************************!*\ !*** ./src/nn/ops/conv2d.ts ***! \******************************/ -/*! exports provided: Conv2d */function(e,t,n){"use strict";n.r(t),n.d(t,"Conv2d",(function(){return c}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../graph_builder */"./src/nn/graph_builder.ts"),r=n(/*! ../operand */"./src/nn/operand.ts"),i=n(/*! ../operation */"./src/nn/operation.ts"),a=n(/*! ../utils */"./src/nn/utils.ts"),d=n(/*! ./clamp */"./src/nn/ops/clamp.ts"),u=n(/*! ./leaky_relu */"./src/nn/ops/leaky_relu.ts"),l=n(/*! ./unary */"./src/nn/ops/unary.ts");class c extends i.SingleOutputOperation{constructor(e,t,n={}){super(e.builder),a.validateOperand(e),this.input_=e,a.validateOperand(t),this.filter_=t,a.assert(!(n.autoPad===o.MLAutoPad.explicit&&void 0===n.padding),"The padding parameter should be assigned when autoPad is explicit."),this.initOptions(n.padding,n.strides,n.dilations,n.groups,n.inputLayout,n.filterLayout,n.autoPad,n.transpose,n.outputPadding,n.outputSizes,n.bias,n.activation)}initOptions(e=[0,0,0,0],t=[1,1],n=[1,1],s=1,r=o.MLInputOperandLayout.nchw,i=o.MLFilterOperandLayout.oihw,d=o.MLAutoPad.explicit,c=!1,f=[0,0],p,m,h){a.assert(a.isIntegerArray(e)&&4===e.length,"The padding parameter is invalid."),this.padding_=e,a.assert(a.isIntegerArray(t)&&2===t.length,"The strides parameter is invalid."),this.strides_=t,a.assert(a.isIntegerArray(n)&&2===n.length,"The dilations parameter is invalid."),this.dilations_=n,a.assert(a.isInteger(s),"The gourps parameter is invalid."),this.groups_=s,a.assert(r in o.MLInputOperandLayout,"The input layout parameter is invalid."),this.inputLayout_=r,a.assert(i in o.MLFilterOperandLayout,"The filter layout parameter is invalid."),this.filterLayout_=i,a.assert(d in o.MLAutoPad,"The autoPad parameter is invalid."),this.autoPad_=d,this.transpose_=c,this.transpose_?(a.assert(a.isIntegerArray(f)&&2===f.length,"The outputPadding parameter is invalid."),this.outputPadding_=f,a.assert(void 0===p||a.isIntegerArray(p)&&2===p.length,"The outputSizes parameter is invalid."),this.outputSizes_=p):(this.outputPadding_=[0,0],this.outputSizes_=void 0),this.bias_=m,this.bias_&&a.validateOperand(this.bias_),h instanceof l.Relu?(this.fusedActivation_="relu",this.activation_=void 0):this.isRelu6(h)?(this.fusedActivation_="relu6",this.activation_=void 0):h instanceof u.LeakyRelu?(this.fusedActivation_="leakyrelu",this.leakyreluAlpha_=h.alpha,this.activation_=void 0):h instanceof l.Sigmoid?(this.fusedActivation_="sigmoid",this.activation_=void 0):(this.fusedActivation_=void 0,this.activation_=h)}isRelu6(e){if(e instanceof d.Clamp){const t=e;if(Math.abs(t.minScalarValue-0)<1e-5&&Math.abs(t.maxScalarValue-6)<1e-5)return!0}return!1}getFusedOutputs(){return this.activation_?[this.activation_.apply(this.output)]:[this.output]}inputs(){const e=[this.input_,this.filter_];return this.bias_&&e.push(this.bias_),e}run(e){let t,n,i=e.get(this.input_),d=!1;this.bias_&&(n=e.get(this.bias_)),this.inputLayout_===o.MLInputOperandLayout.nchw&&(i=s.transpose(i,[0,2,3,1]));const u=i.shape[3];void 0===this.filterTensor_?(t=e.get(this.filter_),!1===this.transpose_?this.filterLayout_===o.MLFilterOperandLayout.oihw?t=s.transpose(t,[2,3,1,0]):this.filterLayout_===o.MLFilterOperandLayout.ohwi?t=s.transpose(t,[1,2,3,0]):this.filterLayout_===o.MLFilterOperandLayout.ihwo&&(t=s.transpose(t,[1,2,0,3])):this.filterLayout_===o.MLFilterOperandLayout.oihw?t=s.transpose(t,[2,3,0,1]):this.filterLayout_===o.MLFilterOperandLayout.hwio?t=s.transpose(t,[0,1,3,2]):this.filterLayout_===o.MLFilterOperandLayout.ohwi?t=s.transpose(t,[1,2,0,3]):this.filterLayout_===o.MLFilterOperandLayout.ihwo&&(t=s.transpose(t,[1,2,3,0])),1!==this.groups_&&(t=s.transpose(t,[0,1,3,2])),this.filter_ instanceof r.ConstantOperand&&(this.filterTensor_=t,s.keep(this.filterTensor_))):t=this.filterTensor_;const l=a.getPaddings(i,t,this.padding_,this.strides_,this.outputPadding_,this.dilations_,this.autoPad_);let c;if(!1===this.transpose_)if(1===this.groups_)c=s.fused.conv2d({x:i,filter:t,strides:this.strides_,pad:l,dataFormat:"NHWC",dilations:this.dilations_,bias:n,activation:this.fusedActivation_,leakyreluAlpha:this.leakyreluAlpha_}),d=!0;else{if(this.groups_!==u||this.groups_!==t.shape[2])throw new Error(`The tf.js convolution doesn't support groups parameter ${this.groups_}`);if("valid"===l||"same"===l||l instanceof Array&&l[1][0]===l[1][1]&&l[1][0]===l[2][0]&&l[1][0]===l[2][1]){let e;e="valid"===l||"same"===l?l:l[1][0],c=s.fused.depthwiseConv2d({x:i,filter:t,strides:this.strides_,pad:e,dataFormat:"NHWC",dilations:this.dilations_,bias:n,activation:this.fusedActivation_,leakyreluAlpha:this.leakyreluAlpha_}),d=!0}else c=s.depthwiseConv2d(i,t,this.strides_,l,"NHWC",this.dilations_)}else{this.autoPad_!==o.MLAutoPad.explicit&&(this.outputSizes_=[i.shape[1]*this.strides_[0],i.shape[2]*this.strides_[1]]);const e=[i.shape[0],0,0,t.shape[2]];if(void 0===this.outputSizes_)for(let n=0;n<2;++n)e[n+1]=this.strides_[n]*(i.shape[n+1]-1)+this.outputPadding_[n]+((t.shape[n]-1)*this.dilations_[n]+1)-this.padding_[2*n]-this.padding_[2*n+1];else e[1]=this.outputSizes_[0],e[2]=this.outputSizes_[1];c=s.conv2dTranspose(i,t,e,this.strides_,l)}return d||(n&&(c=s.add(c,n)),"relu"===this.fusedActivation_?c=s.relu(c):"relu6"===this.fusedActivation_?c=s.clipByValue(c,0,6):"leakyrelu"===this.fusedActivation_?c=s.leakyRelu(c,this.leakyreluAlpha_):"sigmoid"===this.fusedActivation_?c=s.sigmoid(c):void 0!==this.fusedActivation_&&a.assert(!1,`The ${this.fusedActivation_} is un supported.`)),this.inputLayout_===o.MLInputOperandLayout.nchw&&(c=s.transpose(c,[0,3,1,2])),c}dispose(){this.filterTensor_&&s.dispose(this.filterTensor_)}}},"./src/nn/ops/gemm.ts": +/*! exports provided: Conv2d */function(e,t,n){"use strict";n.r(t),n.d(t,"Conv2d",(function(){return c}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../graph_builder */"./src/nn/graph_builder.ts"),r=n(/*! ../operand */"./src/nn/operand.ts"),i=n(/*! ../operation */"./src/nn/operation.ts"),a=n(/*! ../utils */"./src/nn/utils.ts"),u=n(/*! ./clamp */"./src/nn/ops/clamp.ts"),d=n(/*! ./leaky_relu */"./src/nn/ops/leaky_relu.ts"),l=n(/*! ./unary */"./src/nn/ops/unary.ts");class c extends i.SingleOutputOperation{constructor(e,t,n={}){super(e.builder),a.validateOperand(e),this.input_=e,a.validateOperand(t),this.filter_=t,a.assert(!(n.autoPad===o.MLAutoPad.explicit&&void 0===n.padding),"The padding parameter should be assigned when autoPad is explicit."),this.initOptions(n.padding,n.strides,n.dilations,n.groups,n.inputLayout,n.filterLayout,n.autoPad,n.transpose,n.outputPadding,n.outputSizes,n.bias,n.activation)}initOptions(e=[0,0,0,0],t=[1,1],n=[1,1],s=1,r=o.MLInputOperandLayout.nchw,i=o.MLFilterOperandLayout.oihw,u=o.MLAutoPad.explicit,c=!1,f=[0,0],p,m,h){a.assert(a.isIntegerArray(e)&&4===e.length,"The padding parameter is invalid."),this.padding_=e,a.assert(a.isIntegerArray(t)&&2===t.length,"The strides parameter is invalid."),this.strides_=t,a.assert(a.isIntegerArray(n)&&2===n.length,"The dilations parameter is invalid."),this.dilations_=n,a.assert(a.isInteger(s),"The gourps parameter is invalid."),this.groups_=s,a.assert(r in o.MLInputOperandLayout,"The input layout parameter is invalid."),this.inputLayout_=r,a.assert(i in o.MLFilterOperandLayout,"The filter layout parameter is invalid."),this.filterLayout_=i,a.assert(u in o.MLAutoPad,"The autoPad parameter is invalid."),this.autoPad_=u,this.transpose_=c,this.transpose_?(a.assert(a.isIntegerArray(f)&&2===f.length,"The outputPadding parameter is invalid."),this.outputPadding_=f,a.assert(void 0===p||a.isIntegerArray(p)&&2===p.length,"The outputSizes parameter is invalid."),this.outputSizes_=p):(this.outputPadding_=[0,0],this.outputSizes_=void 0),this.bias_=m,this.bias_&&a.validateOperand(this.bias_),h instanceof l.Relu?(this.fusedActivation_="relu",this.activation_=void 0):this.isRelu6(h)?(this.fusedActivation_="relu6",this.activation_=void 0):h instanceof d.LeakyRelu?(this.fusedActivation_="leakyrelu",this.leakyreluAlpha_=h.alpha,this.activation_=void 0):h instanceof l.Sigmoid?(this.fusedActivation_="sigmoid",this.activation_=void 0):(this.fusedActivation_=void 0,this.activation_=h)}isRelu6(e){if(e instanceof u.Clamp){const t=e;if(Math.abs(t.minScalarValue-0)<1e-5&&Math.abs(t.maxScalarValue-6)<1e-5)return!0}return!1}getFusedOutputs(){return this.activation_?[this.activation_.apply(this.output)]:[this.output]}inputs(){const e=[this.input_,this.filter_];return this.bias_&&e.push(this.bias_),e}run(e){let t,n,i=e.get(this.input_),u=!1;this.bias_&&(n=e.get(this.bias_)),this.inputLayout_===o.MLInputOperandLayout.nchw&&(i=s.transpose(i,[0,2,3,1]));const d=i.shape[3];void 0===this.filterTensor_?(t=e.get(this.filter_),this.filterLayout_===o.MLFilterOperandLayout.oihw?t=s.transpose(t,[2,3,1,0]):this.filterLayout_===o.MLFilterOperandLayout.ohwi?t=s.transpose(t,[1,2,3,0]):this.filterLayout_===o.MLFilterOperandLayout.ihwo&&(t=s.transpose(t,[1,2,0,3])),1!==this.groups_&&(t=s.transpose(t,[0,1,3,2])),this.filter_ instanceof r.ConstantOperand&&(this.filterTensor_=t,s.keep(this.filterTensor_))):t=this.filterTensor_;const l=a.getPaddings(i,t,this.padding_,this.strides_,this.outputPadding_,this.dilations_,this.autoPad_);let c;if(!1===this.transpose_)if(1===this.groups_)c=s.fused.conv2d({x:i,filter:t,strides:this.strides_,pad:l,dataFormat:"NHWC",dilations:this.dilations_,bias:n,activation:this.fusedActivation_,leakyreluAlpha:this.leakyreluAlpha_}),u=!0;else{if(this.groups_!==d||this.groups_!==t.shape[2])throw new Error(`The tf.js convolution doesn't support groups parameter ${this.groups_}`);if("valid"===l||"same"===l||l instanceof Array&&l[1][0]===l[1][1]&&l[1][0]===l[2][0]&&l[1][0]===l[2][1]){let e;e="valid"===l||"same"===l?l:l[1][0],c=s.fused.depthwiseConv2d({x:i,filter:t,strides:this.strides_,pad:e,dataFormat:"NHWC",dilations:this.dilations_,bias:n,activation:this.fusedActivation_,leakyreluAlpha:this.leakyreluAlpha_}),u=!0}else c=s.depthwiseConv2d(i,t,this.strides_,l,"NHWC",this.dilations_)}else{this.autoPad_!==o.MLAutoPad.explicit&&(this.outputSizes_=[i.shape[1]*this.strides_[0],i.shape[2]*this.strides_[1]]);const e=[i.shape[0],0,0,t.shape[2]];if(void 0===this.outputSizes_)for(let n=0;n<2;++n)e[n+1]=this.strides_[n]*(i.shape[n+1]-1)+this.outputPadding_[n]+((t.shape[n]-1)*this.dilations_[n]+1)-this.padding_[2*n]-this.padding_[2*n+1];else e[1]=this.outputSizes_[0],e[2]=this.outputSizes_[1];c=s.conv2dTranspose(i,t,e,this.strides_,l)}return u||(n&&(c=s.add(c,n)),"relu"===this.fusedActivation_?c=s.relu(c):"relu6"===this.fusedActivation_?c=s.clipByValue(c,0,6):"leakyrelu"===this.fusedActivation_?c=s.leakyRelu(c,this.leakyreluAlpha_):"sigmoid"===this.fusedActivation_?c=s.sigmoid(c):void 0!==this.fusedActivation_&&a.assert(!1,`The ${this.fusedActivation_} is un supported.`)),this.inputLayout_===o.MLInputOperandLayout.nchw&&(c=s.transpose(c,[0,3,1,2])),c}dispose(){this.filterTensor_&&s.dispose(this.filterTensor_)}}},"./src/nn/ops/gemm.ts": /*!****************************!*\ !*** ./src/nn/ops/gemm.ts ***! \****************************/ -/*! exports provided: Gemm */function(e,t,n){"use strict";n.r(t),n.d(t,"Gemm",(function(){return r}));var s=n(/*! ../operand */"./src/nn/operand.ts"),o=n(/*! ../utils */"./src/nn/utils.ts");class r{static build(e,t,n,r={}){o.validateOperand(t),o.validateOperand(n),o.assert(void 0===r.c||"number"==typeof r.c||r.c instanceof s.MLOperand,"The options.c is invalid."),o.assert(void 0===r.aTranspose||o.isBoolean(r.aTranspose),"The options.aTranspose is invalid."),o.assert(void 0===r.bTranspose||o.isBoolean(r.bTranspose),"The options.bTranspose is invalid."),o.assert(void 0===r.alpha||"number"==typeof r.alpha,"The options.alpha is invalid."),o.assert(void 0===r.beta||"number"==typeof r.beta,"The options.beta is invalid."),r.aTranspose&&(t=e.transpose(t)),r.bTranspose&&(n=e.transpose(n));const i=e.constant(void 0===r.alpha?1:r.alpha),a=e.constant(void 0===r.beta?1:r.beta),d=e.matmul(e.mul(i,t),n);return r.c?e.add(d,e.mul(a,r.c)):d}}},"./src/nn/ops/gru.ts": +/*! exports provided: Gemm */function(e,t,n){"use strict";n.r(t),n.d(t,"Gemm",(function(){return r}));var s=n(/*! ../operand */"./src/nn/operand.ts"),o=n(/*! ../utils */"./src/nn/utils.ts");class r{static build(e,t,n,r={}){o.validateOperand(t),o.validateOperand(n),o.assert(void 0===r.c||"number"==typeof r.c||r.c instanceof s.MLOperand,"The options.c is invalid."),o.assert(void 0===r.aTranspose||o.isBoolean(r.aTranspose),"The options.aTranspose is invalid."),o.assert(void 0===r.bTranspose||o.isBoolean(r.bTranspose),"The options.bTranspose is invalid."),o.assert(void 0===r.alpha||"number"==typeof r.alpha,"The options.alpha is invalid."),o.assert(void 0===r.beta||"number"==typeof r.beta,"The options.beta is invalid."),r.aTranspose&&(t=e.transpose(t)),r.bTranspose&&(n=e.transpose(n));const i=e.constant(void 0===r.alpha?1:r.alpha),a=e.constant(void 0===r.beta?1:r.beta),u=e.matmul(e.mul(i,t),n);return r.c?e.add(u,e.mul(a,r.c)):u}}},"./src/nn/ops/gru.ts": /*!***************************!*\ !*** ./src/nn/ops/gru.ts ***! \***************************/ -/*! exports provided: Gru, GruCell */function(e,t,n){"use strict";n.r(t),n.d(t,"Gru",(function(){return u})),n.d(t,"GruCell",(function(){return l}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../graph_builder */"./src/nn/graph_builder.ts"),r=n(/*! ../operand */"./src/nn/operand.ts"),i=n(/*! ../operation */"./src/nn/operation.ts"),a=n(/*! ../utils */"./src/nn/utils.ts"),d=n(/*! ./unary */"./src/nn/ops/unary.ts");class u extends i.Operation{constructor(e,t,n,s,o,i={}){super(e.builder),a.validateOperand(e),this.input_=e,a.validateOperand(t),this.weight_=t,a.validateOperand(n),this.recurrentWeight_=n,a.assert(a.isInteger(s)&&s>0,"The steps parameter is invalid."),this.steps_=s,a.assert(a.isInteger(o)&&o>0,"The hiddenSize parameter is invalid."),this.hiddenSize_=o,this.initOptions(i.bias,i.recurrentBias,i.initialHiddenState,i.resetAfter,i.returnSequence,i.direction,i.layout,i.activations),this.outputs.push(new r.OutputOperand(this)),this.returnSequence_&&this.outputs_.push(new r.OutputOperand(this))}initOptions(e,t,n,s=!0,r=!1,i=o.MLRecurrentNetworkDirection.forward,u=o.MLRecurrentNetworkWeightLayout.zrn,l=[this.builder.sigmoid(),this.builder.tanh()]){a.validateOptionalOperand(e),this.bias_=e,a.validateOptionalOperand(t),this.recurrentBias_=t,a.validateOptionalOperand(n),this.initialHiddenState_=n,a.assert(a.isBoolean(s),"The resetAfter parameter is not a boolean."),this.resetAfter_=s,a.assert(a.isBoolean(r),"The resetAfter parameter is not a boolean."),this.returnSequence_=r,a.assert(i in o.MLRecurrentNetworkDirection,"The direction parameter is invalid."),this.direction_=i,a.assert(u in o.MLRecurrentNetworkWeightLayout,"The layout parameter is invalid."),this.layout_=u,a.assert(l instanceof Array&&2===l.length&&l.every((e=>e instanceof d.UnaryMLOperator)),"The activations parameter is invalid."),this.activations_=l}inputs(){const e=[this.input_,this.weight_,this.recurrentWeight_];return this.bias_&&e.push(this.bias_),this.recurrentBias_&&e.push(this.recurrentBias_),this.initialHiddenState_&&e.push(this.initialHiddenState_),e}computeImpl(e){const t=e.get(this.input_),n=e.get(this.weight_),r=e.get(this.recurrentWeight_),i=this.bias_?e.get(this.bias_):void 0,a=this.recurrentWeight_?e.get(this.recurrentBias_):void 0,d=this.initialHiddenState_?e.get(this.initialHiddenState_):void 0,u=this.steps_,c=this.hiddenSize_,f=this.resetAfter_,p=this.returnSequence_,m=this.layout_,h=this.activations_,b=this.direction_,j=b===o.MLRecurrentNetworkDirection.both?2:1;let g,w=d;void 0===w&&(w=s.zeros([j,1,c]));const _=[],k=[],v=[],x=[];for(let e=0;e0,"The hiddenSize parameter is invalid."),this.hiddenSize_=o,this.initOptions(r.bias,r.recurrentBias,r.resetAfter,r.layout,r.activations)}initOptions(e,t,n=!0,s=o.MLRecurrentNetworkWeightLayout.zrn,r=[this.builder.sigmoid(),this.builder.tanh()]){a.validateOptionalOperand(e),this.bias_=e,a.validateOptionalOperand(t),this.recurrentBias_=t,a.assert(a.isBoolean(n),"The resetAfter parameter is not a boolean."),this.resetAfter_=n,a.assert(s in o.MLRecurrentNetworkWeightLayout,"The layout parameter is invalid."),this.layout_=s,a.assert(r instanceof Array&&2===r.length&&r.every((e=>e instanceof d.UnaryMLOperator)),"The activations parameter is invalid."),this.activations_=r}inputs(){const e=[this.input_,this.weight_,this.recurrentWeight_,this.hiddenState_];return this.bias_&&e.push(this.bias_),this.recurrentBias_&&e.push(this.recurrentBias_),e}static compute(e,t,n,r,i,a,d,u,l=!0,c=o.MLRecurrentNetworkWeightLayout.zrn){const f=s.scalar(1),p=s.scalar(0),m=c===o.MLRecurrentNetworkWeightLayout.zrn?{z:0,r:i,n:2*i}:{r:0,z:i,n:2*i},h=a[0],b=a[1],j=h.runOp(s.add(s.add(d?s.slice(d,[m.z],[i]):p,u?s.slice(u,[m.z],[i]):p),s.add(s.matMul(e,s.transpose(s.slice(t,[m.z,0],[i,-1]))),s.matMul(r,s.transpose(s.slice(n,[m.z,0],[i,-1])))))),g=h.runOp(s.add(s.add(d?s.slice(d,[m.r],[i]):p,u?s.slice(u,[m.r],[i]):p),s.add(s.matMul(e,s.transpose(s.slice(t,[m.r,0],[i,-1]))),s.matMul(r,s.transpose(s.slice(n,[m.r,0],[i,-1]))))));let w;return w=l?b.runOp(s.add(d?s.slice(d,[m.n],[i]):p,s.add(s.matMul(e,s.transpose(s.slice(t,[m.n,0],[i,-1]))),s.mul(g,s.add(u?s.slice(u,[m.n],[i]):p,s.matMul(r,s.transpose(s.slice(n,[m.n,0],[i,-1])))))))):b.runOp(s.add(s.add(d?s.slice(d,[m.n],[i]):p,u?s.slice(u,[m.n],[i]):p),s.add(s.matMul(e,s.transpose(s.slice(t,[m.n,0],[i,-1]))),s.matMul(s.mul(g,r),s.transpose(s.slice(n,[m.n,0],[i,-1])))))),s.add(s.mul(j,r),s.mul(w,s.sub(f,j)))}run(e){return l.compute(e.get(this.input_),e.get(this.weight_),e.get(this.recurrentWeight_),e.get(this.hiddenState_),this.hiddenSize_,this.activations_,this.bias_?e.get(this.bias_):void 0,this.recurrentBias_?e.get(this.recurrentBias_):void 0,this.resetAfter_,this.layout_)}}},"./src/nn/ops/instance_norm.ts": +/*! exports provided: Gru, GruCell */function(e,t,n){"use strict";n.r(t),n.d(t,"Gru",(function(){return d})),n.d(t,"GruCell",(function(){return l}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../graph_builder */"./src/nn/graph_builder.ts"),r=n(/*! ../operand */"./src/nn/operand.ts"),i=n(/*! ../operation */"./src/nn/operation.ts"),a=n(/*! ../utils */"./src/nn/utils.ts"),u=n(/*! ./unary */"./src/nn/ops/unary.ts");class d extends i.Operation{constructor(e,t,n,s,o,i={}){super(e.builder),a.validateOperand(e),this.input_=e,a.validateOperand(t),this.weight_=t,a.validateOperand(n),this.recurrentWeight_=n,a.assert(a.isInteger(s)&&s>0,"The steps parameter is invalid."),this.steps_=s,a.assert(a.isInteger(o)&&o>0,"The hiddenSize parameter is invalid."),this.hiddenSize_=o,this.initOptions(i.bias,i.recurrentBias,i.initialHiddenState,i.resetAfter,i.returnSequence,i.direction,i.layout,i.activations),this.outputs.push(new r.OutputOperand(this)),this.returnSequence_&&this.outputs_.push(new r.OutputOperand(this))}initOptions(e,t,n,s=!0,r=!1,i=o.MLRecurrentNetworkDirection.forward,d=o.MLRecurrentNetworkWeightLayout.zrn,l=[this.builder.sigmoid(),this.builder.tanh()]){a.validateOptionalOperand(e),this.bias_=e,a.validateOptionalOperand(t),this.recurrentBias_=t,a.validateOptionalOperand(n),this.initialHiddenState_=n,a.assert(a.isBoolean(s),"The resetAfter parameter is not a boolean."),this.resetAfter_=s,a.assert(a.isBoolean(r),"The resetAfter parameter is not a boolean."),this.returnSequence_=r,a.assert(i in o.MLRecurrentNetworkDirection,"The direction parameter is invalid."),this.direction_=i,a.assert(d in o.MLRecurrentNetworkWeightLayout,"The layout parameter is invalid."),this.layout_=d,a.assert(l instanceof Array&&2===l.length&&l.every((e=>e instanceof u.UnaryMLOperator)),"The activations parameter is invalid."),this.activations_=l}inputs(){const e=[this.input_,this.weight_,this.recurrentWeight_];return this.bias_&&e.push(this.bias_),this.recurrentBias_&&e.push(this.recurrentBias_),this.initialHiddenState_&&e.push(this.initialHiddenState_),e}computeImpl(e){const t=e.get(this.input_),n=e.get(this.weight_),r=e.get(this.recurrentWeight_),i=this.bias_?e.get(this.bias_):void 0,a=this.recurrentWeight_?e.get(this.recurrentBias_):void 0,u=this.initialHiddenState_?e.get(this.initialHiddenState_):void 0,d=this.steps_,c=this.hiddenSize_,f=this.resetAfter_,p=this.returnSequence_,m=this.layout_,h=this.activations_,b=this.direction_,j=b===o.MLRecurrentNetworkDirection.both?2:1;let g,w=u;void 0===w&&(w=s.zeros([j,1,c]));const _=[],k=[],v=[],x=[];for(let e=0;e0,"The hiddenSize parameter is invalid."),this.hiddenSize_=o,this.initOptions(r.bias,r.recurrentBias,r.resetAfter,r.layout,r.activations)}initOptions(e,t,n=!0,s=o.MLRecurrentNetworkWeightLayout.zrn,r=[this.builder.sigmoid(),this.builder.tanh()]){a.validateOptionalOperand(e),this.bias_=e,a.validateOptionalOperand(t),this.recurrentBias_=t,a.assert(a.isBoolean(n),"The resetAfter parameter is not a boolean."),this.resetAfter_=n,a.assert(s in o.MLRecurrentNetworkWeightLayout,"The layout parameter is invalid."),this.layout_=s,a.assert(r instanceof Array&&2===r.length&&r.every((e=>e instanceof u.UnaryMLOperator)),"The activations parameter is invalid."),this.activations_=r}inputs(){const e=[this.input_,this.weight_,this.recurrentWeight_,this.hiddenState_];return this.bias_&&e.push(this.bias_),this.recurrentBias_&&e.push(this.recurrentBias_),e}static compute(e,t,n,r,i,a,u,d,l=!0,c=o.MLRecurrentNetworkWeightLayout.zrn){const f=s.scalar(1),p=s.scalar(0),m=c===o.MLRecurrentNetworkWeightLayout.zrn?{z:0,r:i,n:2*i}:{r:0,z:i,n:2*i},h=a[0],b=a[1],j=h.runOp(s.add(s.add(u?s.slice(u,[m.z],[i]):p,d?s.slice(d,[m.z],[i]):p),s.add(s.matMul(e,s.transpose(s.slice(t,[m.z,0],[i,-1]))),s.matMul(r,s.transpose(s.slice(n,[m.z,0],[i,-1])))))),g=h.runOp(s.add(s.add(u?s.slice(u,[m.r],[i]):p,d?s.slice(d,[m.r],[i]):p),s.add(s.matMul(e,s.transpose(s.slice(t,[m.r,0],[i,-1]))),s.matMul(r,s.transpose(s.slice(n,[m.r,0],[i,-1]))))));let w;return w=l?b.runOp(s.add(u?s.slice(u,[m.n],[i]):p,s.add(s.matMul(e,s.transpose(s.slice(t,[m.n,0],[i,-1]))),s.mul(g,s.add(d?s.slice(d,[m.n],[i]):p,s.matMul(r,s.transpose(s.slice(n,[m.n,0],[i,-1])))))))):b.runOp(s.add(s.add(u?s.slice(u,[m.n],[i]):p,d?s.slice(d,[m.n],[i]):p),s.add(s.matMul(e,s.transpose(s.slice(t,[m.n,0],[i,-1]))),s.matMul(s.mul(g,r),s.transpose(s.slice(n,[m.n,0],[i,-1])))))),s.add(s.mul(j,r),s.mul(w,s.sub(f,j)))}run(e){return l.compute(e.get(this.input_),e.get(this.weight_),e.get(this.recurrentWeight_),e.get(this.hiddenState_),this.hiddenSize_,this.activations_,this.bias_?e.get(this.bias_):void 0,this.recurrentBias_?e.get(this.recurrentBias_):void 0,this.resetAfter_,this.layout_)}}},"./src/nn/ops/instance_norm.ts": /*!*************************************!*\ !*** ./src/nn/ops/instance_norm.ts ***! \*************************************/ -/*! exports provided: InstanceNormalization */function(e,t,n){"use strict";n.r(t),n.d(t,"InstanceNormalization",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../graph_builder */"./src/nn/graph_builder.ts"),r=n(/*! ../operation */"./src/nn/operation.ts"),i=n(/*! ../utils */"./src/nn/utils.ts");class a extends r.SingleOutputOperation{constructor(e,t={}){if(super(e.builder),i.validateOperand(e),this.input_=e,i.validateOptionalOperand(t.scale),this.scale_=t.scale,i.validateOptionalOperand(t.bias),this.bias_=t.bias,void 0!==t.epsilon){const e=t.epsilon;i.assert("number"==typeof e,"The epsilon parameter is invalid"),this.epsilon_=e}else this.epsilon_=1e-5;void 0!==t.layout?(i.assert(t.layout in o.MLInputOperandLayout,"The layout parameter is invalid."),this.layout_=t.layout):this.layout_=o.MLInputOperandLayout.nchw}inputs(){const e=[this.input_];return this.scale_&&e.push(this.scale_),this.bias_&&e.push(this.bias_),e}run(e){const t=e.get(this.input_);i.assert(4===t.rank,"The input operand is not 4-D.");let n,r,a=[2,3],d=[1,-1,1,1],u=t.shape[1];this.layout_===o.MLInputOperandLayout.nhwc&&(a=[1,2],d=[1,1,1,-1],u=t.shape[3]),this.scale_&&(n=e.get(this.scale_),i.assert(1===n.rank,"The scale operand is not 1-D."),i.assert(n.shape[0]===u,"The length of scale is not equal to the size of the feature dimension of the input.")),this.bias_&&(r=e.get(this.bias_),i.assert(1===r.rank,"The bias operand is not 1-D."),i.assert(r.shape[0]===u,"The length of bias is not equal to the size of the feature dimension of the input."));const l=s.mean(t,a,!0),c=s.mean(s.pow(s.sub(t,l),2),a,!0),f=s.div(s.sub(t,l),s.sqrt(s.add(c,this.epsilon_))),p=n?s.mul(s.reshape(n,d),f):f;return r?s.add(s.reshape(r,d),p):p}}},"./src/nn/ops/leaky_relu.ts": +/*! exports provided: InstanceNormalization */function(e,t,n){"use strict";n.r(t),n.d(t,"InstanceNormalization",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../graph_builder */"./src/nn/graph_builder.ts"),r=n(/*! ../operation */"./src/nn/operation.ts"),i=n(/*! ../utils */"./src/nn/utils.ts");class a extends r.SingleOutputOperation{constructor(e,t={}){if(super(e.builder),i.validateOperand(e),this.input_=e,i.validateOptionalOperand(t.scale),this.scale_=t.scale,i.validateOptionalOperand(t.bias),this.bias_=t.bias,void 0!==t.epsilon){const e=t.epsilon;i.assert("number"==typeof e,"The epsilon parameter is invalid"),this.epsilon_=e}else this.epsilon_=1e-5;void 0!==t.layout?(i.assert(t.layout in o.MLInputOperandLayout,"The layout parameter is invalid."),this.layout_=t.layout):this.layout_=o.MLInputOperandLayout.nchw}inputs(){const e=[this.input_];return this.scale_&&e.push(this.scale_),this.bias_&&e.push(this.bias_),e}run(e){const t=e.get(this.input_);i.assert(4===t.rank,"The input operand is not 4-D.");let n,r,a=[2,3],u=[1,-1,1,1],d=t.shape[1];this.layout_===o.MLInputOperandLayout.nhwc&&(a=[1,2],u=[1,1,1,-1],d=t.shape[3]),this.scale_&&(n=e.get(this.scale_),i.assert(1===n.rank,"The scale operand is not 1-D."),i.assert(n.shape[0]===d,"The length of scale is not equal to the size of the feature dimension of the input.")),this.bias_&&(r=e.get(this.bias_),i.assert(1===r.rank,"The bias operand is not 1-D."),i.assert(r.shape[0]===d,"The length of bias is not equal to the size of the feature dimension of the input."));const l=s.mean(t,a,!0),c=s.mean(s.pow(s.sub(t,l),2),a,!0),f=s.div(s.sub(t,l),s.pow(s.add(c,this.epsilon_),.5)),p=n?s.mul(s.reshape(n,u),f):f;return r?s.add(s.reshape(r,u),p):p}}},"./src/nn/ops/leaky_relu.ts": /*!**********************************!*\ !*** ./src/nn/ops/leaky_relu.ts ***! \**********************************/ @@ -18101,11 +18102,11 @@ t.read=function(e,t,n,s,o){var r,i,a=8*o-s-1,d=(1<>1,l=-7,c=n?o-1:0,f= /*!******************************!*\ !*** ./src/nn/ops/pool2d.ts ***! \******************************/ -/*! exports provided: Pool, AveragePool2d, MaxPool2d, L2Pool2d */function(e,t,n){"use strict";n.r(t),n.d(t,"Pool",(function(){return a})),n.d(t,"AveragePool2d",(function(){return d})),n.d(t,"MaxPool2d",(function(){return u})),n.d(t,"L2Pool2d",(function(){return l}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../graph_builder */"./src/nn/graph_builder.ts"),r=n(/*! ../operation */"./src/nn/operation.ts"),i=n(/*! ../utils */"./src/nn/utils.ts");class a extends r.SingleOutputOperation{constructor(e,t={}){super(e.builder),i.validateOperand(e),this.input_=e,this.initOptions(t.windowDimensions,t.padding,t.strides,t.dilations,t.layout,t.autoPad)}initOptions(e=[-1,-1],t=[0,0,0,0],n=[1,1],s=[1,1],r=o.MLInputOperandLayout.nchw,a=o.MLAutoPad.explicit){i.assert(i.isIntegerArray(e)&&2===e.length,"The padding parameter is invalid."),this.windowDimensions_=e,i.assert(i.isIntegerArray(t)&&4===t.length,"The padding parameter is invalid."),this.padding_=t,i.assert(i.isIntegerArray(n)&&2===n.length,"The strides parameter is invalid."),this.strides_=n,i.assert(i.isIntegerArray(s)&&2===s.length,"The dilations parameter is invalid."),this.dilations_=s,i.assert(r in o.MLInputOperandLayout,"The layout parameter is invalid."),this.layout_=r,i.assert(a in o.MLAutoPad,"The autoPad parameter is invalid."),this.autoPad_=a}inputs(){return[this.input_]}run(e){let t=e.get(this.input_);const n=this.getPoolingType();this.layout_===o.MLInputOperandLayout.nchw&&(t=s.transpose(t,[0,2,3,1]));const r=this.windowDimensions_;let i,a;if(-1===r[0]&&-1===r[1]&&(r[0]=t.shape[1],r[1]=t.shape[2]),this.autoPad_===o.MLAutoPad.explicit)i=this.padding_.every((e=>0===e))?"valid":[[0,0],[this.padding_[0],this.padding_[1]],[this.padding_[2],this.padding_[3]],[0,0]];else if(this.autoPad_===o.MLAutoPad["same-upper"])i="same";else{i=[[0,0],[0,0],[0,0],[0,0]];const e=[0,0];for(let n=0;n<2;++n)e[n]=Math.ceil(t.shape[1+n]/this.strides_[n]);const n=[0,0];for(let s=0;s<2;++s)n[s]=this.strides_[s]*(e[s]-1)+((r[s]-1)*this.dilations_[s]+1)-t.shape[1+s];for(let e=0;e<2;++e)i[e+1][0]=n[e]-Math.floor(n[e]/2),i[e+1][1]=Math.floor(n[e]/2)}return"l2"===n?(t=s.pow(t,2),a=s.sqrt(s.pool(t,this.windowDimensions_,"avg",i,this.dilations_,this.strides_))):a=s.pool(t,this.windowDimensions_,n,i,this.dilations_,this.strides_),this.layout_===o.MLInputOperandLayout.nchw&&(a=s.transpose(a,[0,3,1,2])),a}}class d extends a{getPoolingType(){return"avg"}}class u extends a{getPoolingType(){return"max"}}class l extends a{getPoolingType(){return"l2"}}},"./src/nn/ops/reduce.ts": +/*! exports provided: Pool, AveragePool2d, MaxPool2d */function(e,t,n){"use strict";n.r(t),n.d(t,"Pool",(function(){return a})),n.d(t,"AveragePool2d",(function(){return u})),n.d(t,"MaxPool2d",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../graph_builder */"./src/nn/graph_builder.ts"),r=n(/*! ../operation */"./src/nn/operation.ts"),i=n(/*! ../utils */"./src/nn/utils.ts");class a extends r.SingleOutputOperation{constructor(e,t={}){super(e.builder),i.validateOperand(e),this.input_=e,this.initOptions(t.windowDimensions,t.padding,t.strides,t.dilations,t.layout,t.autoPad)}initOptions(e=[-1,-1],t=[0,0,0,0],n=[1,1],s=[1,1],r=o.MLInputOperandLayout.nchw,a=o.MLAutoPad.explicit){i.assert(i.isIntegerArray(e)&&2===e.length,"The padding parameter is invalid."),this.windowDimensions_=e,i.assert(i.isIntegerArray(t)&&4===t.length,"The padding parameter is invalid."),this.padding_=t,i.assert(i.isIntegerArray(n)&&2===n.length,"The strides parameter is invalid."),this.strides_=n,i.assert(i.isIntegerArray(s)&&2===s.length,"The dilations parameter is invalid."),this.dilations_=s,i.assert(r in o.MLInputOperandLayout,"The layout parameter is invalid."),this.layout_=r,i.assert(a in o.MLAutoPad,"The autoPad parameter is invalid."),this.autoPad_=a}inputs(){return[this.input_]}run(e){let t=e.get(this.input_);const n=this.getPoolingType();this.layout_===o.MLInputOperandLayout.nchw&&(t=s.transpose(t,[0,2,3,1]));const r=this.windowDimensions_;let i;if(-1===r[0]&&-1===r[1]&&(r[0]=t.shape[1],r[1]=t.shape[2]),this.autoPad_===o.MLAutoPad.explicit)i=this.padding_.every((e=>0===e))?"valid":[[0,0],[this.padding_[0],this.padding_[1]],[this.padding_[2],this.padding_[3]],[0,0]];else if(this.autoPad_===o.MLAutoPad["same-upper"])i="same";else{i=[[0,0],[0,0],[0,0],[0,0]];const e=[0,0];for(let n=0;n<2;++n)e[n]=Math.ceil(t.shape[1+n]/this.strides_[n]);const n=[0,0];for(let s=0;s<2;++s)n[s]=this.strides_[s]*(e[s]-1)+((r[s]-1)*this.dilations_[s]+1)-t.shape[1+s];for(let e=0;e<2;++e)i[e+1][0]=n[e]-Math.floor(n[e]/2),i[e+1][1]=Math.floor(n[e]/2)}let a=s.pool(t,this.windowDimensions_,n,i,this.dilations_,this.strides_);return this.layout_===o.MLInputOperandLayout.nchw&&(a=s.transpose(a,[0,3,1,2])),a}}class u extends a{getPoolingType(){return"avg"}}class d extends a{getPoolingType(){return"max"}}},"./src/nn/ops/reduce.ts": /*!******************************!*\ !*** ./src/nn/ops/reduce.ts ***! \******************************/ -/*! exports provided: ReduceLogSumExp, ReduceMax, ReduceMean, ReduceMin, ReduceProduct, ReduceSum, ReduceL1, ReduceL2 */function(e,t,n){"use strict";n.r(t),n.d(t,"ReduceLogSumExp",(function(){return a})),n.d(t,"ReduceMax",(function(){return d})),n.d(t,"ReduceMean",(function(){return u})),n.d(t,"ReduceMin",(function(){return l})),n.d(t,"ReduceProduct",(function(){return c})),n.d(t,"ReduceSum",(function(){return f})),n.d(t,"ReduceL1",(function(){return p})),n.d(t,"ReduceL2",(function(){return m}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../operation */"./src/nn/operation.ts"),r=n(/*! ../utils */"./src/nn/utils.ts");class i extends o.SingleOutputOperation{constructor(e,t={}){super(e.builder),r.validateOperand(e),this.input_=e,void 0!==t.axes?(r.assert(r.isIntegerArray(t.axes),"The axes parameter is invalid."),this.axes_=t.axes):this.axes_=void 0,void 0!==t.keepDimensions?(r.assert(r.isBoolean(t.keepDimensions),"The keepDimensions parameter is not a boolean."),this.keepDimensions_=t.keepDimensions):this.keepDimensions_=!1}inputs(){return[this.input_]}run(e){const t=e.get(this.input_);return r.assert(r.validateAxes(this.axes_,t.rank),`The axes must be in range [-${t.rank}, ${t.rank})`),this.runOp(t,this.axes_,this.keepDimensions_)}}class a extends i{runOp(e,t,n){return s.logSumExp(e,t,n)}}class d extends i{runOp(e,t,n){return s.max(e,t,n)}}class u extends i{runOp(e,t,n){return s.mean(e,t,n)}}class l extends i{runOp(e,t,n){return s.min(e,t,n)}}class c extends i{runOp(e,t,n){return s.prod(e,t,n)}}class f extends i{runOp(e,t,n){return s.sum(e,t,n)}}class p extends i{runOp(e,t,n){return s.sum(s.abs(e),t,n)}}class m extends i{runOp(e,t,n){return s.sqrt(s.sum(s.pow(e,2),t,n))}}},"./src/nn/ops/resample.ts": +/*! exports provided: ReduceLogSumExp, ReduceMax, ReduceMean, ReduceMin, ReduceProduct, ReduceSum */function(e,t,n){"use strict";n.r(t),n.d(t,"ReduceLogSumExp",(function(){return a})),n.d(t,"ReduceMax",(function(){return u})),n.d(t,"ReduceMean",(function(){return d})),n.d(t,"ReduceMin",(function(){return l})),n.d(t,"ReduceProduct",(function(){return c})),n.d(t,"ReduceSum",(function(){return f}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../operation */"./src/nn/operation.ts"),r=n(/*! ../utils */"./src/nn/utils.ts");class i extends o.SingleOutputOperation{constructor(e,t={}){super(e.builder),r.validateOperand(e),this.input_=e,void 0!==t.axes?(r.assert(r.isIntegerArray(t.axes),"The axes parameter is invalid."),this.axes_=t.axes):this.axes_=void 0,void 0!==t.keepDimensions?(r.assert(r.isBoolean(t.keepDimensions),"The keepDimensions parameter is not a boolean."),this.keepDimensions_=t.keepDimensions):this.keepDimensions_=!1}inputs(){return[this.input_]}run(e){const t=e.get(this.input_);return r.assert(r.validateAxes(this.axes_,t.rank),`The axes must be in range [-${t.rank}, ${t.rank})`),this.runOp(t,this.axes_,this.keepDimensions_)}}class a extends i{runOp(e,t,n){return s.logSumExp(e,t,n)}}class u extends i{runOp(e,t,n){return s.max(e,t,n)}}class d extends i{runOp(e,t,n){return s.mean(e,t,n)}}class l extends i{runOp(e,t,n){return s.min(e,t,n)}}class c extends i{runOp(e,t,n){return s.prod(e,t,n)}}class f extends i{runOp(e,t,n){return s.sum(e,t,n)}}},"./src/nn/ops/resample.ts": /*!********************************!*\ !*** ./src/nn/ops/resample.ts ***! \********************************/ @@ -18137,11 +18138,11 @@ t.read=function(e,t,n,s,o){var r,i,a=8*o-s-1,d=(1<>1,l=-7,c=n?o-1:0,f= /*!*****************************!*\ !*** ./src/nn/ops/unary.ts ***! \*****************************/ -/*! exports provided: Unary, Exp, Sqrt, UnaryMLOperator, Sigmoid, Tanh, Relu, HardSwish */function(e,t,n){"use strict";n.r(t),n.d(t,"Unary",(function(){return i})),n.d(t,"Exp",(function(){return a})),n.d(t,"Sqrt",(function(){return d})),n.d(t,"UnaryMLOperator",(function(){return u})),n.d(t,"Sigmoid",(function(){return l})),n.d(t,"Tanh",(function(){return c})),n.d(t,"Relu",(function(){return f})),n.d(t,"HardSwish",(function(){return p}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../operation */"./src/nn/operation.ts"),r=n(/*! ../utils */"./src/nn/utils.ts");class i extends o.SingleOutputOperation{constructor(e){void 0!==e?(super(e.builder),r.validateOperand(e),this.x_=e):(super(void 0),this.x_=void 0)}inputs(){return[this.x_]}run(e){const t=e.get(this.x_);return this.runOp(t)}}class a extends i{runOp(e){return s.exp(e)}}class d extends i{runOp(e){return s.sqrt(e)}}class u extends i{apply(e){return this.builder_=e.builder,r.validateOperand(e),this.x_=e,this.createOutput(),this.output}}class l extends u{runOp(e){return s.sigmoid(e)}}class c extends u{runOp(e){return s.tanh(e)}}class f extends u{runOp(e){return s.relu(e)}}class p extends u{runOp(e){return s.div(s.mul(e,s.maximum(0,s.minimum(6,s.add(e,3)))),6)}}},"./src/nn/utils.ts": +/*! exports provided: Unary, Exp, Sqrt, UnaryMLOperator, Sigmoid, Tanh, Relu */function(e,t,n){"use strict";n.r(t),n.d(t,"Unary",(function(){return i})),n.d(t,"Exp",(function(){return a})),n.d(t,"Sqrt",(function(){return u})),n.d(t,"UnaryMLOperator",(function(){return d})),n.d(t,"Sigmoid",(function(){return l})),n.d(t,"Tanh",(function(){return c})),n.d(t,"Relu",(function(){return f}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../operation */"./src/nn/operation.ts"),r=n(/*! ../utils */"./src/nn/utils.ts");class i extends o.SingleOutputOperation{constructor(e){void 0!==e?(super(e.builder),r.validateOperand(e),this.x_=e):(super(void 0),this.x_=void 0)}inputs(){return[this.x_]}run(e){const t=e.get(this.x_);return this.runOp(t)}}class a extends i{runOp(e){return s.exp(e)}}class u extends i{runOp(e){return s.sqrt(e)}}class d extends i{apply(e){return this.builder_=e.builder,r.validateOperand(e),this.x_=e,this.createOutput(),this.output}}class l extends d{runOp(e){return s.sigmoid(e)}}class c extends d{runOp(e){return s.tanh(e)}}class f extends d{runOp(e){return s.relu(e)}}},"./src/nn/utils.ts": /*!*************************!*\ !*** ./src/nn/utils.ts ***! \*************************/ -/*! exports provided: assert, isBoolean, isInteger, isIntegerArray, isTypedArray, getTypedArray, cloneTypedArray, getDataType, createOperandDescriptorFromTensor, validateOperandDescriptor, isDyanmicShape, validateTypedArray, validateValueType, createTensor, sizeFromDimensions, validateOperand, validateOptionalOperand, validateAxes, getPaddings */function(e,t,n){"use strict";n.r(t),n.d(t,"assert",(function(){return i})),n.d(t,"isBoolean",(function(){return a})),n.d(t,"isInteger",(function(){return d})),n.d(t,"isIntegerArray",(function(){return u})),n.d(t,"isTypedArray",(function(){return l})),n.d(t,"getTypedArray",(function(){return c})),n.d(t,"cloneTypedArray",(function(){return f})),n.d(t,"getDataType",(function(){return p})),n.d(t,"createOperandDescriptorFromTensor",(function(){return m})),n.d(t,"validateOperandDescriptor",(function(){return h})),n.d(t,"isDyanmicShape",(function(){return b})),n.d(t,"validateTypedArray",(function(){return j})),n.d(t,"validateValueType",(function(){return g})),n.d(t,"createTensor",(function(){return w})),n.d(t,"sizeFromDimensions",(function(){return _})),n.d(t,"validateOperand",(function(){return k})),n.d(t,"validateOptionalOperand",(function(){return v})),n.d(t,"validateAxes",(function(){return x})),n.d(t,"getPaddings",(function(){return y}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./graph_builder */"./src/nn/graph_builder.ts"),r=n(/*! ./operand */"./src/nn/operand.ts");function i(e,t){if(!e)throw new Error(t)}function a(e){return"boolean"==typeof e}function d(e){return"number"==typeof e&&Number.isInteger(e)}function u(e){return e instanceof Array&&e.every((e=>d(e)))}function l(e){return e instanceof Float32Array||e instanceof Int32Array||e instanceof Uint32Array||e instanceof Int16Array||e instanceof Uint16Array||e instanceof Int8Array||e instanceof Uint8Array}function c(e){if("float32"===e)return Float32Array;if("int32"===e)return Int32Array;if("uint32"===e)return Uint32Array;if("float16"===e)return Uint16Array;if("int8"===e)return Int8Array;if("uint8"===e)return Uint8Array;throw new Error("Type is not supported.")}function f(e){let t;if(e instanceof Float32Array)t=new Float32Array(e.length);else if(e instanceof Int32Array)t=new Int32Array(e.length);else if(e instanceof Uint32Array)t=new Uint32Array(e.length);else if(e instanceof Uint16Array)t=new Uint16Array(e.length);else if(e instanceof Int8Array)t=new Int8Array(e.length);else{if(!(e instanceof Uint8Array))throw new Error("Type is not supported.");t=new Uint8Array(e.length)}return t.set(e),t}function p(e){if("float32"===e)return"float32";if("int32"===e)return"int32";throw new Error("The operand type is not supported by TF.js.")}function m(e){let t;return"float32"===e.dtype?t=r.MLOperandType.float32:"int32"===e.dtype&&(t=r.MLOperandType.int32),{type:t,dimensions:e.shape}}function h(e){i(e.type in r.MLOperandType,"The operand type is invalid."),e.dimensions&&i(u(e.dimensions),"The dimensions is invalid.")}function b(e){return!e.every((e=>e>0))}function j(e,t,n){i(l(e),"The value is not a typed array."),i(e instanceof c(t),"The type of value is invalid."),i(e.length===_(n),`the value length ${e.length} is invalid, size of [${n}] ${_(n)} is expected.`)}function g(e,t){t===r.MLOperandType.int32?i(Number.isInteger(e),"the value is not an int32."):t===r.MLOperandType.uint32?i(Number.isInteger(e)&&e>=0,"the value is not an uint32."):t===r.MLOperandType.int8?i(Number.isInteger(e)&&e>=-128&&e<=127,"the value is not an int8."):t===r.MLOperandType.uint8&&i(Number.isInteger(e)&&e>=0&&e<=255,"the value is not an uint8.")}function w(e,t){const n=p(e.type);if(void 0!==e.dimensions){i(l(t),"Only ArrayBufferView value is supported.");const o=t;j(o,e.type,e.dimensions);const r=f(o);return s.tensor(r,e.dimensions,n)}return"number"==typeof t?(g(t,e.type),s.scalar(t,n)):(j(t,e.type,e.dimensions),s.scalar(t[0],n))}function _(e){return void 0===e||u(e)&&0===e.length?1:e.reduce(((e,t)=>t>0?e*t:e),1)}function k(e,t=""){i(e instanceof r.MLOperand,`The parameter ${t} is not an operand.`)}function v(e,t=""){i(void 0===e||e instanceof r.MLOperand,`The parameter ${t} is not an optional operand.`)}function x(e,t){if("undefined"!=typeof e&&e.length>0)for(let n=0;n=t||e[n]<-t)return!1;return!0}function y(e,t,n,s,r,i,a){let d;if(a===o.MLAutoPad.explicit)d=n.every((e=>0===e))?"valid":[[0,0],[n[0],n[1]],[n[2],n[3]],[0,0]];else if(a===o.MLAutoPad["same-upper"])d="same";else{d=[[0,0],[0,0],[0,0],[0,0]];const n=[0,0];for(let t=0;t<2;++t)n[t]=Math.ceil(e.shape[1+t]/s[t]);const o=[0,0];for(let a=0;a<2;++a)o[a]=s[a]*(n[a]-1)+r[a]+((t.shape[a]-1)*i[a]+1)-e.shape[1+a];for(let e=0;e<2;++e)d[e+1][0]=o[e]-Math.floor(o[e]/2),d[e+1][1]=Math.floor(o[e]/2)}return d}},0: +/*! exports provided: assert, isBoolean, isInteger, isIntegerArray, isTypedArray, getTypedArray, cloneTypedArray, getDataType, createOperandDescriptorFromTensor, validateOperandDescriptor, isDyanmicShape, validateTypedArray, validateValueType, createTensor, sizeFromDimensions, validateOperand, validateOptionalOperand, validateAxes, getPaddings */function(e,t,n){"use strict";n.r(t),n.d(t,"assert",(function(){return i})),n.d(t,"isBoolean",(function(){return a})),n.d(t,"isInteger",(function(){return u})),n.d(t,"isIntegerArray",(function(){return d})),n.d(t,"isTypedArray",(function(){return l})),n.d(t,"getTypedArray",(function(){return c})),n.d(t,"cloneTypedArray",(function(){return f})),n.d(t,"getDataType",(function(){return p})),n.d(t,"createOperandDescriptorFromTensor",(function(){return m})),n.d(t,"validateOperandDescriptor",(function(){return h})),n.d(t,"isDyanmicShape",(function(){return b})),n.d(t,"validateTypedArray",(function(){return j})),n.d(t,"validateValueType",(function(){return g})),n.d(t,"createTensor",(function(){return w})),n.d(t,"sizeFromDimensions",(function(){return _})),n.d(t,"validateOperand",(function(){return k})),n.d(t,"validateOptionalOperand",(function(){return v})),n.d(t,"validateAxes",(function(){return x})),n.d(t,"getPaddings",(function(){return y}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./graph_builder */"./src/nn/graph_builder.ts"),r=n(/*! ./operand */"./src/nn/operand.ts");function i(e,t){if(!e)throw new Error(t)}function a(e){return"boolean"==typeof e}function u(e){return"number"==typeof e&&Number.isInteger(e)}function d(e){return e instanceof Array&&e.every((e=>u(e)))}function l(e){return e instanceof Float32Array||e instanceof Int32Array||e instanceof Uint32Array||e instanceof Int16Array||e instanceof Uint16Array||e instanceof Int8Array||e instanceof Uint8Array}function c(e){if("float32"===e)return Float32Array;if("int32"===e)return Int32Array;if("uint32"===e)return Uint32Array;if("float16"===e)return Uint16Array;if("int8"===e)return Int8Array;if("uint8"===e)return Uint8Array;throw new Error("Type is not supported.")}function f(e){let t;if(e instanceof Float32Array)t=new Float32Array(e.length);else if(e instanceof Int32Array)t=new Int32Array(e.length);else if(e instanceof Uint32Array)t=new Uint32Array(e.length);else if(e instanceof Uint16Array)t=new Uint16Array(e.length);else if(e instanceof Int8Array)t=new Int8Array(e.length);else{if(!(e instanceof Uint8Array))throw new Error("Type is not supported.");t=new Uint8Array(e.length)}return t.set(e),t}function p(e){if("float32"===e)return"float32";if("int32"===e)return"int32";throw new Error("The operand type is not supported by TF.js.")}function m(e){let t;return"float32"===e.dtype?t=r.MLOperandType.float32:"int32"===e.dtype&&(t=r.MLOperandType.int32),{type:t,dimensions:e.shape}}function h(e){i(e.type in r.MLOperandType,"The operand type is invalid."),e.dimensions&&i(d(e.dimensions),"The dimensions is invalid.")}function b(e){return!e.every((e=>e>0))}function j(e,t,n){i(l(e),"The value is not a typed array."),i(e instanceof c(t),"The type of value is invalid."),i(e.length===_(n),`the value length ${e.length} is invalid, size of [${n}] ${_(n)} is expected.`)}function g(e,t){t===r.MLOperandType.int32?i(Number.isInteger(e),"the value is not an int32."):t===r.MLOperandType.uint32?i(Number.isInteger(e)&&e>=0,"the value is not an uint32."):t===r.MLOperandType.int8?i(Number.isInteger(e)&&e>=-128&&e<=127,"the value is not an int8."):t===r.MLOperandType.uint8&&i(Number.isInteger(e)&&e>=0&&e<=255,"the value is not an uint8.")}function w(e,t){const n=p(e.type);if(void 0!==e.dimensions){i(l(t),"Only ArrayBufferView value is supported.");const o=t;j(o,e.type,e.dimensions);const r=f(o);return s.tensor(r,e.dimensions,n)}return"number"==typeof t?(g(t,e.type),s.scalar(t,n)):(j(t,e.type,e.dimensions),s.scalar(t[0],n))}function _(e){return void 0===e||d(e)&&0===e.length?1:e.reduce(((e,t)=>t>0?e*t:e),1)}function k(e,t=""){i(e instanceof r.MLOperand,`The parameter ${t} is not an operand.`)}function v(e,t=""){i(void 0===e||e instanceof r.MLOperand,`The parameter ${t} is not an optional operand.`)}function x(e,t){if("undefined"!=typeof e&&e.length>0)for(let n=0;n=t||e[n]<-t)return!1;return!0}function y(e,t,n,s,r,i,a){let u;if(a===o.MLAutoPad.explicit)u=n.every((e=>0===e))?"valid":[[0,0],[n[0],n[1]],[n[2],n[3]],[0,0]];else if(a===o.MLAutoPad["same-upper"])u="same";else{u=[[0,0],[0,0],[0,0],[0,0]];const n=[0,0];for(let t=0;t<2;++t)n[t]=Math.ceil(e.shape[1+t]/s[t]);const o=[0,0];for(let a=0;a<2;++a)o[a]=s[a]*(n[a]-1)+r[a]+((t.shape[a]-1)*i[a]+1)-e.shape[1+a];for(let e=0;e<2;++e)u[e+1][0]=o[e]-Math.floor(o[e]/2),u[e+1][1]=Math.floor(o[e]/2)}return u}},0: /*!***************************!*\ !*** multi ./src/main.js ***! \***************************/ @@ -18178,4 +18179,4 @@ t.read=function(e,t,n,s,o){var r,i,a=8*o-s-1,d=(1<>1,l=-7,c=n?o-1:0,f= !*** os (ignored) ***! \********************/ /*! no static exports found */function(e,t){}}); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9iYWNrZW5kX2NwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2Jhc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9jcHVfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9BYnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0Fjb3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0Fjb3NoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9BZGQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0FkZE4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0FsbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvQW55LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9BcmdNYXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0FyZ01pbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvQXNpbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvQXNpbmguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0F0YW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0F0YW4yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9BdGFuaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvQXZnUG9vbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvQXZnUG9vbDNELmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9BdmdQb29sM0RHcmFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9BdmdQb29sR3JhZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvQmF0Y2hNYXRNdWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0JhdGNoTm9ybS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvQmF0Y2hUb1NwYWNlTkQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0JpbmNvdW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9CaW5jb3VudF9pbXBsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9DYXN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9DZWlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9DbGlwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Db21wbGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Db21wbGV4QWJzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Db25jYXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0NvbmNhdF9pbXBsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Db252MkQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0NvbnYyREJhY2twcm9wRmlsdGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Db252MkRCYWNrcHJvcElucHV0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Db252M0QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0NvbnYzREJhY2twcm9wRmlsdGVyVjIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0NvbnYzREJhY2twcm9wSW5wdXRWMi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvQ29zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Db3NoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Dcm9wQW5kUmVzaXplLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9DdW1zdW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0RlbnNlQmluY291bnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0RlcHRoVG9TcGFjZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRGVwdGh3aXNlQ29udjJkTmF0aXZlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9EZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRGlhZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRGlsYXRpb24yRC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRGlsYXRpb24yREJhY2twcm9wRmlsdGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9EaWxhdGlvbjJEQmFja3Byb3BJbnB1dC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRWluc3VtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9FbHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0VsdUdyYWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0VxdWFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9FcmYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0V4cC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRXhwYW5kRGltcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRXhwbTEuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0ZGVC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRmlsbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRmxpcExlZnRSaWdodC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRmxvb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0Zsb29yRGl2LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9GdXNlZENvbnYyRC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRnVzZWREZXB0aHdpc2VDb252MkQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0dhdGhlck5kLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9HYXRoZXJOZF9JbXBsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9HYXRoZXJWMi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvR2F0aGVyVjJfaW1wbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvR3JlYXRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvR3JlYXRlckVxdWFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9JRkZULmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9JZGVudGl0eS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvSW1hZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvSXNGaW5pdGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0lzSW5mLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Jc05hTi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvTFJOLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9MUk5HcmFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9MZWFreVJlbHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0xlc3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0xlc3NFcXVhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvTGluU3BhY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0xpblNwYWNlX2ltcGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0xvZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvTG9nMXAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0xvZ2ljYWxBbmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0xvZ2ljYWxOb3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0xvZ2ljYWxPci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvTWF4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9NYXhQb29sLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9NYXhQb29sM0QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL01heFBvb2wzREdyYWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL01heFBvb2xHcmFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9NYXhQb29sV2l0aEFyZ21heC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvTWF4UG9vbFdpdGhBcmdtYXhfaW1wbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvTWF4X2ltcGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL01heGltdW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL01lYW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL01pbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvTWluaW11bS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvTWlycm9yUGFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Nb2QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL011bHRpbm9taWFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9NdWx0aXBseS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvTmVnLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Ob25NYXhTdXBwcmVzc2lvblYzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Ob25NYXhTdXBwcmVzc2lvblY0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Ob25NYXhTdXBwcmVzc2lvblY1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Ob3RFcXVhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvT25lSG90LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9PbmVzTGlrZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvUGFjay5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvUGFkVjIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1Bvdy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvUHJlbHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1Byb2QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1JhbmdlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9SYW5nZV9pbXBsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9SZWFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9SZWFsRGl2LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9SZWNpcHJvY2FsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9SZWx1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9SZWx1Ni5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvUmVzaGFwZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvUmVzaXplQmlsaW5lYXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1Jlc2l6ZUJpbGluZWFyR3JhZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvUmVzaXplTmVhcmVzdE5laWdoYm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9SZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9SZXZlcnNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Sb3RhdGVXaXRoT2Zmc2V0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Sb3VuZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvUnNxcnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1NjYXR0ZXJOZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU2NhdHRlcl9pbXBsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9TZWxlY3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1NlbHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1NpZ21vaWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1NpZ24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1Npbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU2luaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU2xpY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1NvZnRtYXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1NvZnRwbHVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9TcGFjZVRvQmF0Y2hORC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU3BhcnNlRmlsbEVtcHR5Um93cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU3BhcnNlRmlsbEVtcHR5Um93c19pbXBsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9TcGFyc2VSZXNoYXBlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9TcGFyc2VSZXNoYXBlX2ltcGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1NwYXJzZVNlZ21lbnRNZWFuLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9TcGFyc2VTZWdtZW50UmVkdWN0aW9uX2ltcGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1NwYXJzZVNlZ21lbnRTdW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1NwYXJzZVRvRGVuc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1NwbGl0Vi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU3FydC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU3F1YXJlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9TcXVhcmVkRGlmZmVyZW5jZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU3RlcC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU3RyaWRlZFNsaWNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9TdHJpZGVkU2xpY2VfaW1wbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU3RyaW5nTkdyYW1zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9TdHJpbmdOR3JhbXNfaW1wbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU3RyaW5nU3BsaXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1N0cmluZ1NwbGl0X2ltcGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1N0cmluZ1RvSGFzaEJ1Y2tldEZhc3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1N0cmluZ1RvSGFzaEJ1Y2tldEZhc3RfaW1wbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU3ViLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9TdW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1Rhbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvVGFuaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvVGlsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvVGlsZV9pbXBsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Ub3BLLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Ub3BLX2ltcGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1RyYW5zZm9ybS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvVHJhbnNwb3NlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9UcmFuc3Bvc2VfaW1wbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvVW5pcXVlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9VbmlxdWVfaW1wbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvVW5wYWNrLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9VbnNvcnRlZFNlZ21lbnRTdW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1plcm9zTGlrZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvX0Z1c2VkTWF0TXVsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3QvcmVnaXN0ZXJfYWxsX2tlcm5lbHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9zaGFyZWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC91dGlscy9iaW5hcnlfaW1wbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L3V0aWxzL2JpbmFyeV91dGlscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L3V0aWxzL2ZmdF91dGlscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L3V0aWxzL2Z1c2VkX3V0aWxzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3QvdXRpbHMvcG9vbF91dGlscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L3V0aWxzL3VuYXJ5X2ltcGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC91dGlscy91bmFyeV91dGlscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L3V0aWxzL3plcm9zX2ltcGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC92ZXJzaW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2JhY2tlbmRfd2FzbS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9iYXNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2ZsYWdzX3dhc20uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVsX3V0aWxzL3NoYXJlZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0Ficy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0FkZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0FkZE4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9BbGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9BbnkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9BcmdNYXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9BdmdQb29sLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvQmF0Y2hNYXRNdWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9CYXRjaFRvU3BhY2VORC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0Nhc3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9DZWlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvQ2xpcEJ5VmFsdWUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9Db25jYXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9Db252MkQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9Db252MkRCYWNrcHJvcElucHV0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvQ29zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvQ29zaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0Nyb3BBbmRSZXNpemUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9DdW1zdW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9EZXB0aFRvU3BhY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9EZXB0aHdpc2VDb252MmROYXRpdmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9FcXVhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0V4cC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0V4cGFuZERpbXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9GaWxsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvRmxpcExlZnRSaWdodC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0Zsb29yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvRmxvb3JEaXYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9GdXNlZEJhdGNoTm9ybS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0Z1c2VkQ29udjJELmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvRnVzZWREZXB0aHdpc2VDb252MkQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9HYXRoZXJOZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0dhdGhlclYyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvR3JlYXRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0dyZWF0ZXJFcXVhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0lkZW50aXR5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvTGVha3lSZWx1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvTGVzcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0xlc3NFcXVhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0xvZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0xvZ2ljYWxBbmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9NYXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9NYXhQb29sLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvTWF4aW11bS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL01lYW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9NaW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9NaW5pbXVtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvTWlycm9yUGFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvTXVsdGlwbHkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9OZWcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9Ob25NYXhTdXBwcmVzc2lvblYzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvTm9uTWF4U3VwcHJlc3Npb25WNC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL05vbk1heFN1cHByZXNzaW9uVjUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9Ob25NYXhTdXBwcmVzc2lvbl91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvTm90RXF1YWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9PbmVIb3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9PbmVzTGlrZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1BhY2suanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9QYWRWMi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1Bvdy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1ByZWx1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvUHJvZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1JhbmdlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvUmVhbERpdi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1JlbHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9SZWx1Ni5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1Jlc2hhcGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9SZXNpemVCaWxpbmVhci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1JldmVyc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9Sb3RhdGVXaXRoT2Zmc2V0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvUm91bmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9Sc3FydC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1NjYXR0ZXJOZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1NlbGVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1NpZ21vaWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9TaW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9TbGljZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1NvZnRtYXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9TcGFjZVRvQmF0Y2hORC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1NwbGl0Vi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1NxcnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9TcXVhcmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9TcXVhcmVkRGlmZmVyZW5jZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1N0ZXAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9TdHJpZGVkU2xpY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9TdWIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9TdW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9UYW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9UYW5oLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvVGlsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1RvcEsuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9UcmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9UcmFuc3Bvc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9VbnBhY2suanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9aZXJvc0xpa2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9fRnVzZWRNYXRNdWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9iaW5hcnlfa2VybmVsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMva2VybmVsX3V0aWxzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvdHlwZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy91bmFyeV9rZXJuZWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3QvcmVnaXN0ZXJfYWxsX2tlcm5lbHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3QvdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vd2FzbS1vdXQvdGZqcy1iYWNrZW5kLXdhc20tdGhyZWFkZWQtc2ltZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vd2FzbS1vdXQvdGZqcy1iYWNrZW5kLXdhc20tdGhyZWFkZWQtc2ltZC53b3JrZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL3dhc20tb3V0L3RmanMtYmFja2VuZC13YXNtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9hZGRuX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvYWRkbl9wYWNrZWRfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9hcmdtaW5tYXhfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9hcmdtaW5tYXhfcGFja2VkX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvYXZnX3Bvb2xfYmFja3Byb3BfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9iYWNrZW5kX3dlYmdsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9iYXNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9iYXRjaG5vcm1fZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9iYXRjaG5vcm1fcGFja2VkX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvYmluYXJ5b3BfY29tcGxleF9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2JpbmFyeW9wX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvYmluYXJ5b3BfcGFja2VkX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvY2FudmFzX3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2NsaXBfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9jbGlwX3BhY2tlZF9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2NvbXBsZXhfYWJzX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvY29uY2F0X2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvY29uY2F0X3BhY2tlZF9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2NvbnZfYmFja3Byb3BfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9jb252X2JhY2twcm9wX2dwdV9kZXB0aHdpc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2NvbnZfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9jb252X2dwdV9kZXB0aHdpc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2NvbnZfcGFja2VkX2dwdV9kZXB0aHdpc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2Nyb3BfYW5kX3Jlc2l6ZV9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2N1bXN1bV9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2RlY29kZV9tYXRyaXhfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9kZWNvZGVfbWF0cml4X3BhY2tlZF9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2RlcHRoX3RvX3NwYWNlX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvZGlhZ19ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2RpbGF0aW9uX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvZW5jb2RlX2Zsb2F0X2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvZW5jb2RlX2Zsb2F0X3BhY2tlZF9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2VuY29kZV9tYXRyaXhfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9lbmNvZGVfbWF0cml4X3BhY2tlZF9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2ZmdF9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2ZpbGxfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9mbGFnc193ZWJnbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvZmxpcF9sZWZ0X3JpZ2h0X2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvZ2F0aGVyX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvZ2F0aGVyX25kX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvZ2xzbF92ZXJzaW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9ncGdwdV9jb250ZXh0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9ncGdwdV9tYXRoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9ncGdwdV91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9pbTJjb2xfcGFja2VkX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbF91dGlscy9hcmdfbWluX21heC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVsX3V0aWxzL2ludC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVsX3V0aWxzL3JlZHVjZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVsX3V0aWxzL3Jlc2hhcGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbF91dGlscy9zaGFyZWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvQWJzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0Fjb3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvQWNvc2guanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvQWRkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0FkZE4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvQWxsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0FueS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9BcmdNYXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvQXJnTWluLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0FzaW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvQXNpbmguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvQXRhbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9BdGFuMi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9BdGFuaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9BdmdQb29sLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0F2Z1Bvb2wzRC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9BdmdQb29sM0RHcmFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0F2Z1Bvb2xHcmFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0JhdGNoTWF0TXVsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0JhdGNoTWF0TXVsX2ltcGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvQmF0Y2hOb3JtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0JhdGNoVG9TcGFjZU5ELmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0JpbmNvdW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0Nhc3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvQ2VpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9DbGlwQnlWYWx1ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9Db21wbGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0NvbXBsZXhBYnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvQ29uY2F0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0NvbmNhdF9pbXBsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0NvbnYyRC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9Db252MkRCYWNrcHJvcEZpbHRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9Db252MkRCYWNrcHJvcElucHV0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0NvbnYyRF9pbXBsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0NvbnYzRC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9Db252M0RCYWNrcHJvcEZpbHRlclYyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0NvbnYzREJhY2twcm9wSW5wdXRWMi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9Db3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvQ29zaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9Dcm9wQW5kUmVzaXplLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0N1bXN1bS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9EZW5zZUJpbmNvdW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0RlcHRoVG9TcGFjZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9EZXB0aHdpc2VDb252MmROYXRpdmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9EaWFnLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0RpbGF0aW9uMkQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvRWluc3VtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0VsdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9FbHVHcmFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0VxdWFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0VyZi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9FeHAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvRXhwYW5kRGltcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9FeHBtMS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9GRlQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvRkZUX2ltcGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvRmlsbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9GbGlwTGVmdFJpZ2h0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0Zsb29yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0Zsb29yRGl2LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0Zyb21QaXhlbHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvRnJvbVBpeGVsc191dGlscy9mcm9tX3BpeGVsc19ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvRnJvbVBpeGVsc191dGlscy9mcm9tX3BpeGVsc19wYWNrZWRfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0Z1c2VkQ29udjJELmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0Z1c2VkRGVwdGh3aXNlQ29udjJELmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0dhdGhlck5kLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0dhdGhlclYyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0dyZWF0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvR3JlYXRlckVxdWFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0lGRlQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvSWRlbnRpdHkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvSW1hZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9Jc0Zpbml0ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9Jc0luZi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9Jc05hTi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9MUk4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvTFJOR3JhZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9MZWFreVJlbHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvTGVzcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9MZXNzRXF1YWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvTGluU3BhY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvTG9nLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0xvZzFwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL0xvZ2ljYWxBbmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvTG9naWNhbE5vdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9Mb2dpY2FsT3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvTWF4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL01heFBvb2wuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvTWF4UG9vbDNELmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL01heFBvb2wzREdyYWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvTWF4UG9vbEdyYWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvTWF4UG9vbFdpdGhBcmdtYXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvTWF4UG9vbFdpdGhBcmdtYXhfaW1wbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9NYXhfaW1wbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9NYXhpbXVtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL01lYW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvTWVhbl9pbXBsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL01pbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9NaW5pbXVtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL01pcnJvclBhZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9Nb2QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvTXVsdGlub21pYWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvTXVsdGlwbHkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvTmVnLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL05vbk1heFN1cHByZXNzaW9uVjMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvTm9uTWF4U3VwcHJlc3Npb25WNC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9Ob25NYXhTdXBwcmVzc2lvblY1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL05vdEVxdWFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL09uZUhvdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9PbmVzTGlrZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9QYWNrLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL1BhZFYyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL1Bvdy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9QcmVsdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9Qcm9kLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL1JhbmdlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL1JlYWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvUmVhbERpdi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9SZWNpcHJvY2FsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL1JlbHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvUmVsdTYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvUmVzaGFwZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9SZXNpemVCaWxpbmVhci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9SZXNpemVCaWxpbmVhckdyYWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvUmVzaXplTmVhcmVzdE5laWdoYm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL1Jlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvUmV2ZXJzZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9Sb3RhdGVXaXRoT2Zmc2V0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL1JvdW5kLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL1JzcXJ0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL1NjYXR0ZXJOZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9TZWxlY3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvU2VsdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9TaWdtb2lkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL1NpZ24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvU2luLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL1NpbmguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvU2xpY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvU29mdG1heC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9Tb2Z0cGx1cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9TcGFjZVRvQmF0Y2hORC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9TcGFyc2VGaWxsRW1wdHlSb3dzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL1NwYXJzZVJlc2hhcGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvU3BhcnNlU2VnbWVudE1lYW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvU3BhcnNlU2VnbWVudFN1bS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9TcGFyc2VUb0RlbnNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL1NwbGl0Vi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9TcXJ0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL1NxdWFyZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9TcXVhcmVkRGlmZmVyZW5jZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9TdGVwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL1N0cmlkZWRTbGljZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9TdHJpbmdOR3JhbXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvU3RyaW5nU3BsaXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvU3RyaW5nVG9IYXNoQnVja2V0RmFzdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9TdWIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvU3VtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL1N1bV9pbXBsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL1Rhbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9UYW5oLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL1RpbGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvVG9wSy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9UcmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvVHJhbnNwb3NlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL1RyYW5zcG9zZV9pbXBsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL1VuaXF1ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9VbnBhY2suanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2tlcm5lbHMvVW5zb3J0ZWRTZWdtZW50U3VtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9rZXJuZWxzL1plcm9zTGlrZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qva2VybmVscy9fRnVzZWRNYXRNdWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2xybl9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L2xybl9ncmFkX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvbHJuX3BhY2tlZF9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L21heF9wb29sX2JhY2twcm9wX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvbWVhbl9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L21pcnJvcl9wYWRfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9taXJyb3JfcGFkX3BhY2tlZF9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L211bG1hdF9wYWNrZWRfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9tdWx0aW5vbWlhbF9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L29uZWhvdF9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L3BhY2tfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9wYWNraW5nX3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L3BhZF9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L3BhZF9wYWNrZWRfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9wb29sX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvcmVkdWNlX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvcmVnaXN0ZXJfYWxsX2tlcm5lbHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L3Jlc2hhcGVfcGFja2VkX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvcmVzaXplX2JpbGluZWFyX2JhY2twcm9wX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvcmVzaXplX2JpbGluZWFyX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvcmVzaXplX2JpbGluZWFyX3BhY2tlZF9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L3Jlc2l6ZV9uZWFyZXN0X25laWdoYm9yX2JhY2twcm9wX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvcmVzaXplX25lYXJlc3RfbmVpZ2hib3JfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9yZXNpemVfbmVhcmVzdF9uZWlnaGJvcl9wYWNrZWRfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9yZXZlcnNlX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvcmV2ZXJzZV9wYWNrZWRfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9yb3RhdGVfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC9zY2F0dGVyX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qvc2VnbWVudF9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L3NlbGVjdF9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L3NoYWRlcl9jb21waWxlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qvc2hhZGVyX2NvbXBpbGVyX3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L3NsaWNlX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qvc2xpY2VfcGFja2VkX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qvc3RyaWRlZF9zbGljZV9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L3RleF91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC90ZXh0dXJlX21hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L3RpbGVfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC90b3Bfa19ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L3RyYW5zZm9ybV9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L3RyYW5zcG9zZV9ncHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13ZWJnbC9kaXN0L3RyYW5zcG9zZV9wYWNrZWRfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC91bmFyeW9wX2dwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3QvdW5hcnlvcF9wYWNrZWRfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC91bnBhY2tfZ3B1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC92ZXJzaW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2ViZ2wvZGlzdC93ZWJnbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsL2Rpc3Qvd2ViZ2xfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvYmFja2VuZHMvYmFja2VuZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvYmFja2VuZHMvYmFja2VuZF91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9iYWNrZW5kcy9jb21wbGV4X3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2JhY2tlbmRzL2VpbnN1bV91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9iYWNrZW5kcy9rZXJuZWxfaW1wbHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2JhY2tlbmRzL25vbl9tYXhfc3VwcHJlc3Npb25faW1wbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvYmFja2VuZHMvbm9uX21heF9zdXBwcmVzc2lvbl91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9iYWNrZW5kcy93aGVyZV9pbXBsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9iYXNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9iYXNlX3NpZGVfZWZmZWN0cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvYnJvd3Nlcl91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9kZXZpY2VfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvZW5naW5lLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9lbnZpcm9ubWVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvZmxhZ3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2dsb2JhbF91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9nbG9iYWxzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9ncmFkaWVudHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2hhc2hfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2lvL2Jyb3dzZXJfZmlsZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2lvL2h0dHAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2lvL2luZGV4ZWRfZGIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2lvL2lvLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9pby9pb191dGlscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvaW8vbG9jYWxfc3RvcmFnZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvaW8vbW9kZWxfbWFuYWdlbWVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvaW8vcGFzc3Rocm91Z2guanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2lvL3Byb2dyZXNzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9pby9yb3V0ZXJfcmVnaXN0cnkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2lvL3R5cGVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9pby93ZWlnaHRzX2xvYWRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qva2VybmVsX25hbWVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9rZXJuZWxfcmVnaXN0cnkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2xvZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvbWF0aC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2Ficy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2Fjb3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9hY29zaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2FkZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2FkZF9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYWxsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYW55LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYXJnX21heC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2FyZ19taW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9hcnJheV9vcHNfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2FzaW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9hc2luaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2F0YW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9hdGFuMi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2F0YW5oLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYXZnX3Bvb2wuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9hdmdfcG9vbF8zZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2F4aXNfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2Jhc2ljX2xzdG1fY2VsbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2JhdGNoX3RvX3NwYWNlX25kLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYmF0Y2hub3JtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYmF0Y2hub3JtMmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9iYXRjaG5vcm0zZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2JhdGNobm9ybTRkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYmF0Y2hub3JtX3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9iaW5jb3VudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2Jvb2xlYW5fbWFzay5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2Jyb2FkY2FzdF90by5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2Jyb2FkY2FzdF91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2J1ZmZlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2Nhc3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9jZWlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvY2xpcF9ieV92YWx1ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2Nsb25lLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvY29tcGxleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2NvbmNhdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2NvbmNhdF8xZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2NvbmNhdF8yZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2NvbmNhdF8zZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2NvbmNhdF80ZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2NvbmNhdF91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvY29uZnVzaW9uX21hdHJpeC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2NvbnYxZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2NvbnYyZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2NvbnYyZF9iYWNrcHJvcF9maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9jb252MmRfYmFja3Byb3BfaW5wdXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9jb252MmRfdHJhbnNwb3NlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvY29udjNkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvY29udjNkX2JhY2twcm9wX2lucHV0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvY29udjNkX3RyYW5zcG9zZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2NvbnZfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2Nvcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2Nvc2guanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9jdW1zdW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9kZW5zZV9iaW5jb3VudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2RlcHRoX3RvX3NwYWNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZGVwdGh3aXNlX2NvbnYyZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2RlcHRod2lzZV9jb252MmRfbmF0aXZlX2JhY2twcm9wX2ZpbHRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2RlcHRod2lzZV9jb252MmRfbmF0aXZlX2JhY2twcm9wX2lucHV0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZGlhZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2RpbGF0aW9uMmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9kaXYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9kaXZfbm9fbmFuLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZG90LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZHJvcG91dC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2Ryb3BvdXRfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2VpbnN1bS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2VsdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2VxdWFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZXJmLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZXJmX3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9leHAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9leHBhbmRfZGltcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2V4cG0xLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZXllLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZmlsbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2Zsb29yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZmxvb3JEaXYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9mdXNlZC9jb252MmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9mdXNlZC9kZXB0aHdpc2VfY29udjJkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZnVzZWQvbWF0X211bC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2Z1c2VkX29wcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2Z1c2VkX3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9nYXRoZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9nYXRoZXJfbmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9nYXRoZXJfbmRfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2dyZWF0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9ncmVhdGVyX2VxdWFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvaW1hZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2ltYWdlL2Nyb3BfYW5kX3Jlc2l6ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2ltYWdlL2ZsaXBfbGVmdF9yaWdodC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2ltYWdlL25vbl9tYXhfc3VwcHJlc3Npb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9pbWFnZS9ub25fbWF4X3N1cHByZXNzaW9uX2FzeW5jLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvaW1hZ2Uvbm9uX21heF9zdXBwcmVzc2lvbl9wYWRkZWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9pbWFnZS9ub25fbWF4X3N1cHByZXNzaW9uX3BhZGRlZF9hc3luYy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2ltYWdlL25vbl9tYXhfc3VwcHJlc3Npb25fd2l0aF9zY29yZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2ltYWdlL25vbl9tYXhfc3VwcHJlc3Npb25fd2l0aF9zY29yZV9hc3luYy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2ltYWdlL3Jlc2l6ZV9iaWxpbmVhci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2ltYWdlL3Jlc2l6ZV9uZWFyZXN0X25laWdoYm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvaW1hZ2Uvcm90YXRlX3dpdGhfb2Zmc2V0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvaW1hZ2UvdGhyZXNob2xkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvaW1hZ2UvdHJhbnNmb3JtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvaW5fdG9wX2suanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9pc19maW5pdGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9pc19pbmYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9pc19uYW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9sZWFreV9yZWx1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbGVzcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2xlc3NfZXF1YWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9saW5hbGcvYmFuZF9wYXJ0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbGluYWxnL2dyYW1fc2NobWlkdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2xpbmFsZy9xci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2xpbnNwYWNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbG9jYWxfcmVzcG9uc2Vfbm9ybWFsaXphdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2xvZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2xvZzFwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbG9nX3NpZ21vaWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9sb2dfc29mdG1heC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2xvZ19zdW1fZXhwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbG9naWNhbF9hbmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9sb2dpY2FsX25vdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2xvZ2ljYWxfb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9sb2dpY2FsX3hvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2xvc3Nfb3BzX3V0aWxzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbG9zc2VzL2Fic29sdXRlX2RpZmZlcmVuY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9sb3NzZXMvY29tcHV0ZV93ZWlnaHRlZF9sb3NzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbG9zc2VzL2Nvc2luZV9kaXN0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2xvc3Nlcy9oaW5nZV9sb3NzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbG9zc2VzL2h1YmVyX2xvc3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9sb3NzZXMvbG9nX2xvc3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9sb3NzZXMvbWVhbl9zcXVhcmVkX2Vycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbG9zc2VzL3NpZ21vaWRfY3Jvc3NfZW50cm9weS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2xvc3Nlcy9zb2Z0bWF4X2Nyb3NzX2VudHJvcHkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9tYXRfbXVsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbWF4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbWF4X3Bvb2wuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9tYXhfcG9vbF8zZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL21heF9wb29sX3dpdGhfYXJnbWF4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbWF4aW11bS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL21lYW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9tZXNoZ3JpZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL21pbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL21pbmltdW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9taXJyb3JfcGFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbW9kLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbW9tZW50cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL21vdmluZ19hdmVyYWdlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbXVsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbXVsdGlfcm5uX2NlbGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9tdWx0aW5vbWlhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL25lZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL25vbm1heF91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbm9ybS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL25vdF9lcXVhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL29uZV9ob3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9vbmVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvb25lc19saWtlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvb3BlcmF0aW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvb3BzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvb3V0ZXJfcHJvZHVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3BhZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3BhZDFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcGFkMmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9wYWQzZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3BhZDRkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcG9vbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3Bvdy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3ByZWx1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcHJpbnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9wcm9kLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcmFuZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3JhbmRfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3JhbmRvbV9nYW1tYS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3JhbmRvbV9ub3JtYWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9yYW5kb21fdW5pZm9ybS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3JhbmdlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcmVhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3JlY2lwcm9jYWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9yZWR1Y2VfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3JlbHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9yZWx1Ni5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3Jlc2hhcGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9yZXZlcnNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcmV2ZXJzZV8xZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3JldmVyc2VfMmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9yZXZlcnNlXzNkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcmV2ZXJzZV80ZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3JvdGF0ZV91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcm91bmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9yc3FydC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NjYWxhci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NjYXR0ZXJfbmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zY2F0dGVyX25kX3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zZWdtZW50X3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zZWx1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc2VsdV91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc2VwYXJhYmxlX2NvbnYyZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NldGRpZmYxZF9hc3luYy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NpZ21vaWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zaWduLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc2lnbmFsL2ZyYW1lLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc2lnbmFsL2hhbW1pbmdfd2luZG93LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc2lnbmFsL2hhbm5fd2luZG93LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc2lnbmFsL3N0ZnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zaWduYWxfb3BzX3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zaW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zaW5oLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc2xpY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zbGljZTFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc2xpY2UyZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NsaWNlM2QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zbGljZTRkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc2xpY2VfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NvZnRtYXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zb2Z0cGx1cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NwYWNlX3RvX2JhdGNoX25kLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc3BhcnNlL3NwYXJzZV9maWxsX2VtcHR5X3Jvd3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zcGFyc2Uvc3BhcnNlX3Jlc2hhcGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zcGFyc2Uvc3BhcnNlX3NlZ21lbnRfbWVhbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NwYXJzZS9zcGFyc2Vfc2VnbWVudF9zdW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zcGFyc2VfdG9fZGVuc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zcGFyc2VfdG9fZGVuc2VfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NwZWN0cmFsL2ZmdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NwZWN0cmFsL2lmZnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zcGVjdHJhbC9pcmZmdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NwZWN0cmFsL3JmZnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zcGxpdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NwbGl0X3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zcXJ0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc3F1YXJlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc3F1YXJlZF9kaWZmZXJlbmNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc3F1ZWV6ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3N0YWNrLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc3RlcC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3N0cmlkZWRfc2xpY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zdHJpbmcvc3RyaW5nX25fZ3JhbXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zdHJpbmcvc3RyaW5nX3NwbGl0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc3RyaW5nL3N0cmluZ190b19oYXNoX2J1Y2tldF9mYXN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc3ViLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc3VtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvdGFuLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvdGFuaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3RlbnNvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3RlbnNvcjFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvdGVuc29yMmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy90ZW5zb3IzZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3RlbnNvcjRkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvdGVuc29yNWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy90ZW5zb3I2ZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3RlbnNvcl9vcHNfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3RpbGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy90b3BrLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvdHJhbnNwb3NlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvdHJ1bmNhdGVkX25vcm1hbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3VuaXF1ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3Vuc29ydGVkX3NlZ21lbnRfc3VtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvdW5zdGFjay5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3ZhcmlhYmxlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvd2hlcmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy93aGVyZV9hc3luYy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3plcm9zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvemVyb3NfbGlrZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3B0aW1pemVycy9hZGFkZWx0YV9vcHRpbWl6ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wdGltaXplcnMvYWRhZ3JhZF9vcHRpbWl6ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wdGltaXplcnMvYWRhbV9vcHRpbWl6ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wdGltaXplcnMvYWRhbWF4X29wdGltaXplci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3B0aW1pemVycy9tb21lbnR1bV9vcHRpbWl6ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wdGltaXplcnMvb3B0aW1pemVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHRpbWl6ZXJzL29wdGltaXplcl9jb25zdHJ1Y3RvcnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wdGltaXplcnMvcm1zcHJvcF9vcHRpbWl6ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wdGltaXplcnMvc2dkX29wdGltaXplci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvcGxhdGZvcm1zL3BsYXRmb3JtX2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L3BsYXRmb3Jtcy9wbGF0Zm9ybV9ub2RlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9wcm9maWxlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvc2VyaWFsaXphdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvdGFwZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvdGVuc29yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC90ZW5zb3JfZm9ybWF0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC90ZW5zb3JfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvdGVuc29yX3V0aWxfZW52LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC90ZXN0X3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L3RyYWluLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC90eXBlcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvdXRpbF9iYXNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC92ZXJzaW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9iYXNlNjQtanMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2J1ZmZlci9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaWVlZTc1NC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaXNhcnJheS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9uZy9zcmMvbG9uZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zZWVkcmFuZG9tL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zZWVkcmFuZG9tL2xpYi9hbGVhLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zZWVkcmFuZG9tL2xpYi90eWNoZWkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NlZWRyYW5kb20vbGliL3hvcjEyOC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2VlZHJhbmRvbS9saWIveG9yNDA5Ni5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2VlZHJhbmRvbS9saWIveG9yc2hpZnQ3LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zZWVkcmFuZG9tL2xpYi94b3J3b3cuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NlZWRyYW5kb20vc2VlZHJhbmRvbS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2V0aW1tZWRpYXRlL3NldEltbWVkaWF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdGltZXJzLWJyb3dzZXJpZnkvbWFpbi5qcyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vYW1kLWRlZmluZS5qcyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vYW1kLW9wdGlvbnMuanMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qcyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vbW9kdWxlLmpzIiwid2VicGFjazovLy8uL3NyYy9tYWluLmpzIiwid2VicGFjazovLy8uL3NyYy9tbC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbm4vY29udGV4dC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbm4vZ3JhcGgudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL25uL2dyYXBoX2J1aWxkZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL25uL29wZXJhbmQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL25uL29wZXJhdGlvbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbm4vb3BzL2JhdGNoX25vcm0udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL25uL29wcy9iaW5hcnkudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL25uL29wcy9jbGFtcC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbm4vb3BzL2NvbmNhdC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbm4vb3BzL2NvbnYyZC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbm4vb3BzL2dlbW0udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL25uL29wcy9ncnUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL25uL29wcy9pbnN0YW5jZV9ub3JtLnRzIiwid2VicGFjazovLy8uL3NyYy9ubi9vcHMvbGVha3lfcmVsdS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbm4vb3BzL3BhZC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbm4vb3BzL3Bvb2wyZC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbm4vb3BzL3JlZHVjZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbm4vb3BzL3Jlc2FtcGxlLnRzIiwid2VicGFjazovLy8uL3NyYy9ubi9vcHMvcmVzaGFwZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbm4vb3BzL3NsaWNlLnRzIiwid2VicGFjazovLy8uL3NyYy9ubi9vcHMvc29mdG1heC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbm4vb3BzL3NwbGl0LnRzIiwid2VicGFjazovLy8uL3NyYy9ubi9vcHMvc3F1ZWV6ZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbm4vb3BzL3RyYW5zcG9zZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbm4vb3BzL3VuYXJ5LnRzIiwid2VicGFjazovLy8uL3NyYy9ubi91dGlscy50cyJdLCJuYW1lcyI6WyJpbnN0YWxsZWRNb2R1bGVzIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiZXhwb3J0cyIsIm1vZHVsZSIsImkiLCJsIiwibW9kdWxlcyIsImNhbGwiLCJtIiwiYyIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImdldCIsInIiLCJTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsInZhbHVlIiwidCIsIm1vZGUiLCJfX2VzTW9kdWxlIiwibnMiLCJjcmVhdGUiLCJrZXkiLCJiaW5kIiwibiIsIm9iamVjdCIsInByb3BlcnR5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJwIiwicyIsIndoZXJlSW1wbCIsIk1hdGhCYWNrZW5kQ1BVIiwiY29uc3RydWN0b3IiLCJzdXBlciIsInRoaXMiLCJibG9ja1NpemUiLCJmaXJzdFVzZSIsImRhdGEiLCJuZXh0RGF0YUlkIiwid3JpdGUiLCJ2YWx1ZXMiLCJzaGFwZSIsImR0eXBlIiwid2FybiIsImRhdGFJZCIsImlkIiwic2V0IiwicmVmQ291bnQiLCJtYWtlVGVuc29ySW5mbyIsIm91dElkIiwibGVuZ3RoIiwiaXNTdHJpbmciLCJlbmNvZGVkVmFsdWVzIiwibWFwIiwiZW5jb2RlU3RyaW5nIiwiaGFzIiwiaW5jUmVmIiwiZGVjUmVmIiwibW92ZSIsIm51bURhdGFJZHMiLCJyZWFkU3luYyIsImNvbXBsZXhUZW5zb3JJbmZvcyIsInJlYWxWYWx1ZXMiLCJyZWFsIiwiaW1hZ1ZhbHVlcyIsImltYWciLCJtZXJnZVJlYWxBbmRJbWFnQXJyYXlzIiwiYnVmZmVyU3luYyIsImRlY29kZWREYXRhIiwiZGVjb2RlU3RyaW5nIiwiX2EiLCJFcnJvciIsIm1ha2VPdXRwdXQiLCJtYWtlVGVuc29yRnJvbURhdGFJZCIsImRpc3Bvc2VEYXRhIiwiZm9yY2UiLCJkZWxldGUiLCJkaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyIsInRlbnNvckluZm8iLCJmIiwic3RhcnQiLCJub3ciLCJrZXJuZWxNcyIsIm1lbW9yeSIsInVucmVsaWFibGUiLCJyZWFzb25zIiwid2hlcmUiLCJjb25kaXRpb24iLCJjb25kVmFscyIsImRpc3Bvc2UiLCJmbG9hdFByZWNpc2lvbiIsImVwc2lsb24iLCJhc3NlcnROb3RDb21wbGV4IiwidGVuc29yIiwib3BOYW1lIiwiQXJyYXkiLCJpc0FycmF5IiwiZm9yRWFjaCIsImFzc2VydCIsInNpbXBsZUFic0ltcGwiLCJ2YWxzIiwicmVzdWx0VmFsdWVzIiwiRmxvYXQzMkFycmF5IiwiTWF0aCIsImFicyIsImFyZ3MiLCJ4IiwiaW5wdXRzIiwiY3B1QmFja2VuZCIsImJhY2tlbmQiLCJzaXplRnJvbVNoYXBlIiwiYWJzQ29uZmlnIiwia2VybmVsTmFtZSIsImJhY2tlbmROYW1lIiwia2VybmVsRnVuYyIsImFjb3MiLCJ4aSIsImFjb3NDb25maWciLCJhY29zaCIsImFjb3NoQ29uZmlnIiwiYWRkSW1wbCIsImEiLCJiIiwiYWRkQ29tcGxleEltcGwiLCJhUmVhbCIsImFJbWFnIiwiYlJlYWwiLCJiSW1hZyIsImFkZCIsImFkZENvbmZpZyIsImFkZE4iLCJ0ZW5zb3JzIiwib3V0QnVmIiwib3V0VmFscyIsImN1cnJWYWxzIiwiaiIsImFkZE5Db25maWciLCJhbGwiLCJhdHRycyIsImF4aXMiLCJrZWVwRGltcyIsIm9yaWdBeGVzIiwicGFyc2VBeGlzUGFyYW0iLCJheGVzIiwicGVybXV0ZWRBeGVzIiwiZ2V0QXhlc1Blcm11dGF0aW9uIiwiJHgiLCJwZXJtIiwiZ2V0SW5uZXJNb3N0QXhlcyIsImFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zIiwib3V0U2hhcGUiLCJyZWR1Y2VTaGFwZSIsImNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMiLCJyZWR1Y2VTaXplIiwibWFrZVplcm9zVHlwZWRBcnJheSIsImFWYWxzIiwib2Zmc2V0IiwicmVzdWx0IiwiZXhwYW5kZWRTaGFwZSIsImV4cGFuZFNoYXBlVG9LZWVwRGltIiwicmVzaGFwZWRSZXN1bHQiLCJhbGxDb25maWciLCJhbnkiLCJhbnlWYWwiLCJhbnlDb25maWciLCJhcmdNYXgiLCJpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcyIsInB1c2giLCJvdXRTaXplIiwibWF4IiwibWF4SW5kZXgiLCJhcmdNYXhDb25maWciLCJhcmdNaW4iLCJtaW4iLCJtaW5JbmRleCIsImFyZ01pbkNvbmZpZyIsImFzaW4iLCJhc2luQ29uZmlnIiwiYXNpbmgiLCJhc2luaENvbmZpZyIsImF0YW4iLCJhdGFuQ29uZmlnIiwiYXRhbjJJbXBsIiwiYVZhbHVlIiwiYlZhbHVlIiwiYXRhbjIiLCJhdGFuMkNvbmZpZyIsImF0YW5oIiwiYXRhbmhDb25maWciLCJhdmdQb29sIiwiZmlsdGVyU2l6ZSIsInN0cmlkZXMiLCJwYWQiLCJkaW1Sb3VuZGluZ01vZGUiLCJlaXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUiLCJjb252SW5mbyIsImNvbXB1dGVQb29sMkRJbmZvIiwicmVzIiwiZmlsdGVyV2lkdGgiLCJmaWx0ZXJIZWlnaHQiLCJhcnJheXNFcXVhbCIsImluU2hhcGUiLCJ4VmFsdWVzIiwiY29tcHV0ZVN0cmlkZXMiLCJidWZmZXIiLCJhdmdQb29sQ29uZmlnIiwiYXZnUG9vbDNEIiwiZGF0YUZvcm1hdCIsImNvbXB1dGVQb29sM0RJbmZvIiwiYXZnUG9vbDNEQ29uZmlnIiwiYXZnUG9vbDNER3JhZCIsImR5IiwiaW5wdXQiLCJzdHJpZGVEZXB0aCIsInN0cmlkZUhlaWdodCIsInN0cmlkZVdpZHRoIiwiZmlsdGVyRGVwdGgiLCJkaWxhdGlvbkRlcHRoIiwiZGlsYXRpb25IZWlnaHQiLCJkaWxhdGlvbldpZHRoIiwiZWZmZWN0aXZlRmlsdGVyRGVwdGgiLCJlZmZlY3RpdmVGaWx0ZXJIZWlnaHQiLCJlZmZlY3RpdmVGaWx0ZXJXaWR0aCIsInBhZEZyb250IiwicGFkSW5mbyIsImZyb250IiwicGFkTGVmdCIsImxlZnQiLCJwYWRUb3AiLCJ0b3AiLCJkeCIsImF2Z011bHRpcGxpZXIiLCJkeUJ1ZiIsImJhdGNoIiwiYmF0Y2hTaXplIiwiY2hhbm5lbCIsImluQ2hhbm5lbHMiLCJkeERlcHRoIiwiaW5EZXB0aCIsImR4Um93IiwiaW5IZWlnaHQiLCJkeENvbCIsImluV2lkdGgiLCJkeURlcHRoQ29ybmVyIiwiZHlSb3dDb3JuZXIiLCJkeUNvbENvcm5lciIsImRvdFByb2QiLCJ3RGVwdGgiLCJkeURlcHRoIiwib3V0RGVwdGgiLCJmbG9vciIsIndSb3ciLCJkeVJvdyIsIm91dEhlaWdodCIsIndDb2wiLCJkeUNvbCIsIm91dFdpZHRoIiwiYXZnUG9vbDNER3JhZENvbmZpZyIsImF2Z1Bvb2xHcmFkIiwiZHlEYXRhIiwiZHhSIiwiZHhDIiwiZHlSQ29ybmVyIiwiZHlDQ29ybmVyIiwid1IiLCJkeVIiLCJ3QyIsImR5QyIsImF2Z1Bvb2xHcmFkQ29uZmlnIiwiYmF0Y2hNYXRNdWwiLCJ0cmFuc3Bvc2VBIiwidHJhbnNwb3NlQiIsImFSYW5rIiwiYlJhbmsiLCJpbm5lclNoYXBlQSIsImlubmVyU2hhcGVCIiwib3V0ZXJTaGFwZUEiLCJvdXRlclNoYXBlQiIsIm91dGVyRGltc0EiLCJzbGljZSIsIm91dGVyRGltc0IiLCJiYXRjaERpbUEiLCJiYXRjaERpbUIiLCJiYXRjaERpbXNDb21wYXRpYmxlIiwiY29uY2F0IiwiYTNkU2hhcGUiLCJiM2RTaGFwZSIsImEzZCIsImIzZCIsInNoYXJlZERpbSIsImxlZnREaW0iLCJyaWdodERpbSIsImJhdGNoRGltIiwiYTNkVmFsdWVzIiwiYjNkVmFsdWVzIiwiYTNkU3RyaWRlcyIsImIzZFN0cmlkZXMiLCJhQmF0Y2giLCJhT3V0ZXJTdGVwIiwiYUlubmVyU3RlcCIsImJJbm5lclN0ZXAiLCJiT3V0ZXJTdGVwIiwiYkJhdGNoIiwic2l6ZSIsInJlc1ZhbHMiLCJiaSIsImkwIiwiajAiLCJrMCIsImlCbG9jayIsImpCbG9jayIsImtCbG9jayIsInN1bSIsImsiLCJiYXRjaE9mZnNldEEiLCJiYXRjaE9mZnNldEIiLCJiYXRjaE1hdE11bENvbmZpZyIsImJhdGNoTm9ybSIsInNjYWxlIiwibWVhbiIsInZhcmlhbmNlIiwidmFyaWFuY2VFcHNpbG9uIiwieFZhbHMiLCJtVmFscyIsInZhclZhbHMiLCJzVmFscyIsIm9mZlZhbHMiLCJvZmZWYWxzTGVuZ3RoIiwic1ZhbHNMZW5ndGgiLCJ2YXJWYWxzTGVuZ3RoIiwibVZhbHNMZW5ndGgiLCJvZmZpIiwibWkiLCJzaSIsInZpIiwic3FydCIsImJhdGNoTm9ybUNvbmZpZyIsImJhdGNoVG9TcGFjZU5EIiwiYmxvY2tTaGFwZSIsImNyb3BzIiwicHJvZCIsInJlZHVjZSIsInJlc2hhcGVkIiwiZ2V0UmVzaGFwZWQiLCJwZXJtdXRlZCIsImdldFBlcm11dGVkIiwicmVzaGFwZWRQZXJtdXRlZCIsImdldFJlc2hhcGVkUGVybXV0ZWQiLCJzbGljZUJlZ2luQ29vcmRzIiwiZ2V0U2xpY2VCZWdpbkNvb3JkcyIsInNsaWNlU2l6ZSIsImdldFNsaWNlU2l6ZSIsInhSZXNoYXBlZCIsInhUcmFuc3Bvc2VkIiwieFRyYW5zcG9zZWRSZXNoYXBlZCIsImJlZ2luIiwiYmF0Y2hUb1NwYWNlTkRDb25maWciLCJiaW5jb3VudCIsIndlaWdodHMiLCJ3ZWlnaHRzVmFscyIsImJpbmNvdW50Q29uZmlnIiwiYmluY291bnRJbXBsIiwid2VpZ2h0c0R0eXBlIiwid2VpZ2h0c1NoYXBlIiwid2VpZ2h0c1NpemUiLCJiaW5jb3VudFJlZHVjZUltcGwiLCJ4QnVmIiwid2VpZ2h0c0J1ZiIsImJpbmFyeU91dHB1dCIsIm51bVJvd3MiLCJudW1Db2xzIiwiY2FzdCIsInplcm9zVGVuc29ySW5mbyIsImZsb2F0WCIsInJlYWxQYXJ0IiwiaGFzRW5jb2RpbmdMb3NzIiwiSW50MzJBcnJheSIsImZyb20iLCJ6ZXJvIiwidG9UeXBlZEFycmF5IiwicmVzdWx0RGF0YSIsInJlc3VsdFNoYXBlIiwiY2FzdENvbmZpZyIsImNlaWxJbXBsIiwiY2VpbCIsImNlaWxDb25maWciLCJjbGlwIiwiY2xpcEF0dHJzIiwiY2xpcFZhbHVlTWF4IiwiY2xpcFZhbHVlTWluIiwiY2xpcENvbmZpZyIsImNvbXBsZXgiLCJyZWFsVmFscyIsImltYWdWYWxzIiwiY29tcGxleEluZm8iLCJjb21wbGV4Q29uZmlnIiwiY29tcGxleEFicyIsImNvbXBsZXhWYWxzIiwiaHlwb3QiLCJjb21wbGV4QWJzQ29uZmlnIiwiJGF4aXMiLCJjb21wdXRlT3V0U2hhcGUiLCIkaW5wdXRzIiwiZmlsdGVyIiwic2hhcGVzIiwiYXNzZXJ0UGFyYW1zQ29uc2lzdGVudCIsInJlYWxzIiwiaW1hZ3MiLCJyZWFsQ29uY2F0ZWQiLCJpbWFnQ29uY2F0ZWQiLCJpbnB1dHMyRCIsImlucHV0c1ZhbFNoYXBlcyIsInNpbXBseUNvbmNhdCIsImZpbmFsT3V0U2hhcGUiLCJvdXRJbmZvIiwiY29uY2F0Q29uZmlnIiwiY29uY2F0SW1wbCIsImdldEFycmF5RnJvbURUeXBlIiwiY29sT2Zmc2V0IiwiZnJvbVVpbnQ4VG9TdHJpbmdBcnJheSIsInRJZHgiLCJyb3ciLCJyZXNJZHgiLCJjb2wiLCJjb252MkQiLCJkaWxhdGlvbnMiLCIkZGF0YUZvcm1hdCIsImNvbnZlcnRDb252MkREYXRhRm9ybWF0IiwiY29tcHV0ZUNvbnYyREluZm8iLCJpc0NoYW5uZWxzTGFzdCIsInkiLCJ4U3RyaWRlcyIsImZpbHRlclN0cmlkZXMiLCJ4QmF0Y2hTdHJpZGUiLCJ4Um93U3RyaWRlIiwieENvbFN0cmlkZSIsInhDaGFubmVsU3RyaWRlIiwieUJhdGNoU3RyaWRlIiwieVJvd1N0cmlkZSIsInlDb2xTdHJpZGUiLCJ5Q2hhbm5lbFN0cmlkZSIsIndWYWxzIiwieVZhbHMiLCJ4T2Zmc2V0MSIsInlPZmZzZXQxIiwieVIiLCJ5T2Zmc2V0MiIsInhSQ29ybmVyIiwieFIiLCJ3T2Zmc2V0MSIsInhPZmZzZXQyIiwieUMiLCJ5T2Zmc2V0MyIsInhDQ29ybmVyIiwieEMiLCJ4T2Zmc2V0MyIsIndPZmZzZXQzIiwiZDEiLCJ4VmFsIiwiZDIiLCJvdXRDaGFubmVscyIsImNvbnYyRENvbmZpZyIsImNvbnYyREJhY2twcm9wRmlsdGVyIiwiZmlsdGVyU2hhcGUiLCJkVyIsImxlZnRQYWQiLCJ0b3BQYWQiLCJkeVZhbHMiLCJ5Uk1pbiIsInlSTWF4IiwieUNNaW4iLCJ5Q01heCIsImNvbnYyREJhY2twcm9wRmlsdGVyQ29uZmlnIiwiY29udjJEQmFja3Byb3BJbnB1dCIsImlucHV0U2hhcGUiLCJkeVN0cmlkZXMiLCJkeFZhbHVlcyIsImR5VmFsdWVzIiwiZmx0VmFsdWVzIiwiZmx0UzAiLCJmbHRTMSIsImZsdFMyIiwieFJNaW4iLCJ4Q01pbiIsImR5T2Zmc2V0IiwiZmx0T2Zmc2V0IiwiY29udjJEQmFja3Byb3BJbnB1dENvbmZpZyIsImNvbnYzRCIsImNvbXB1dGVDb252M0RJbmZvIiwieUYiLCJ4RkNvcm5lciIsIndGIiwieEYiLCJ3T2Zmc2V0MiIsInlPZmZzZXQ0IiwieE9mZnNldDQiLCJ3T2Zmc2V0NCIsImNvbnYzRENvbmZpZyIsImNvbnYzREJhY2twcm9wRmlsdGVyVjIiLCJkdyIsImR3VmFsdWVzIiwiZHdTMCIsImR3UzEiLCJkd1MyIiwiZHdTMyIsImR5UzAiLCJkeVMxIiwiZHlTMiIsImR5UzMiLCJ4UzAiLCJ4UzEiLCJ4UzIiLCJ4UzMiLCJmcm9udFBhZCIsInlGTWluIiwieUZNYXgiLCJjb252M0RCYWNrcHJvcEZpbHRlclYyQ29uZmlnIiwiY29udjNEQmFja3Byb3BJbnB1dFYyIiwiZHhTMCIsImR4UzEiLCJkeFMyIiwiZHhTMyIsImZsdFMzIiwieEZNaW4iLCJjb252M0RCYWNrcHJvcElucHV0VjJDb25maWciLCJjb3MiLCJjb3NDb25maWciLCJjb3NoIiwiY29zaENvbmZpZyIsImNyb3BBbmRSZXNpemUiLCJpbWFnZSIsImJveGVzIiwiYm94SW5kIiwiY3JvcFNpemUiLCJtZXRob2QiLCJleHRyYXBvbGF0aW9uVmFsdWUiLCJpbWFnZUhlaWdodCIsImltYWdlV2lkdGgiLCJudW1DaGFubmVscyIsIm51bUJveGVzIiwiY3JvcEhlaWdodCIsImNyb3BXaWR0aCIsIm91dHB1dCIsImJveFZhbHMiLCJib3hJbmRWYWxzIiwiaW1hZ2VWYWxzIiwiaW5TdHJpZGUiLCJvdXRTdHJpZGUiLCJzdGFydEluZCIsInkxIiwieDEiLCJ5MiIsIngyIiwiYkluZCIsImhlaWdodFNjYWxlIiwid2lkdGhTY2FsZSIsInlJbmQiLCJpbmQiLCJ0b3BJbmQiLCJib3R0b21JbmQiLCJ5TGVycCIsInhJbmQiLCJsZWZ0SW5kIiwicmlnaHRJbmQiLCJ4TGVycCIsInRvcExlZnQiLCJ0b3BSaWdodCIsImJvdHRvbUxlZnQiLCJib3R0b20iLCJjbG9zZXN0WCIsInJvdW5kIiwiY2xvc2VzdFkiLCJpbkluZCIsIm91dEluZCIsImNyb3BBbmRSZXNpemVDb25maWciLCJjdW1zdW0iLCJleGNsdXNpdmUiLCJyZXZlcnNlIiwicGVybXV0YXRpb24iLCJwZXJtdXRlZEF4aXMiLCJyZXN1bHREdHlwZSIsImZpbmFsRGltIiwiaW5kZXhBZGp1c3RlciIsImlkeCIsInByZXZJZHgiLCJyZXZlcnNlUGVybXV0YXRpb24iLCJnZXRVbmRvQXhlc1Blcm11dGF0aW9uIiwicmV2ZXJzZVRyYW5zcG9zZWRSZXN1bHQiLCJjdW1zdW1Db25maWciLCJkZW5zZUJpbmNvdW50IiwiZGVuc2VCaW5jb3VudENvbmZpZyIsImRlcHRoVG9TcGFjZSIsImlucHV0SGVpZ2h0IiwiaW5wdXRXaWR0aCIsImlucHV0RGVwdGgiLCJvdXRwdXRIZWlnaHQiLCJvdXRwdXRXaWR0aCIsIm91dHB1dERlcHRoIiwib3V0cHV0SWR4IiwiaCIsImluSCIsIm9mZnNldEgiLCJ3IiwiaW5XIiwib2Zmc2V0RCIsImlucHV0SWR4IiwiZGVwdGhUb1NwYWNlQ29uZmlnIiwiZGVwdGh3aXNlQ29udjJkTmF0aXZlIiwiJGRpbGF0aW9ucyIsImNoTXVsIiwicSIsImRlcHRod2lzZUNvbnYyZE5hdGl2ZUNvbmZpZyIsImRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyIiwidHJ1bmMiLCJkbSIsImRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyQ29uZmlnIiwiZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCIsImRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXRDb25maWciLCJkaWFnIiwieFNpemUiLCJkaWFnQ29uZmlnIiwiZGlsYXRpb24yZENvbmZpZyIsInhSYW5rIiwiZmlsdGVyVmFscyIsImZpbHRlclJhbmsiLCJjb21wdXRlRGlsYXRpb24yREluZm8iLCJvdXRSYW5rIiwib3V0cHV0VmFscyIsImhPdXQiLCJoQmVnIiwid091dCIsIndCZWciLCJjdXJWYWwiLCJOdW1iZXIiLCJNSU5fU0FGRV9JTlRFR0VSIiwiaEluIiwid0luIiwieEluZGV4IiwibG9jVG9JbmRleCIsImZpbHRlckluZGV4IiwidmFsIiwiZGlsYXRpb24yZEJhY2twcm9wRmlsdGVyQ29uZmlnIiwidG9OZXN0ZWRBcnJheSIsIiRmaWx0ZXIiLCJyYW5rIiwiJGR5IiwiZ3JhZGllbnRzIiwibWFrZVplcm9zTmVzdGVkVHlwZWRBcnJheSIsImhNYXgiLCJ3TWF4IiwiZGlsYXRpb24yZEJhY2twcm9wSW5wdXRDb25maWciLCJoSW5NYXgiLCJ3SW5NYXgiLCJlaW5zdW0iLCJlcXVhdGlvbiIsImFsbERpbXMiLCJzdW1tZWREaW1zIiwiaWREaW1zIiwiZGVjb2RlRWluc3VtRXF1YXRpb24iLCJjaGVja0VpbnN1bURpbVNpemVzIiwicGF0aCIsInN0ZXBzIiwiZ2V0RWluc3VtQ29tcHV0ZVBhdGgiLCJuU3RlcHMiLCJvdXQiLCJudW1EaW1zUmVtYWluaW5nIiwidGVuc29yc1RvRGlzcG9zZSIsImlkVGVybSIsInBlcm11dGF0aW9uSW5kaWNlcyIsImV4cGFuZERpbXMiLCJkaW1zVG9FeHBhbmQiLCJnZXRFaW5zdW1QZXJtdXRhdGlvbiIsImlzSWRlbnRpdHlQZXJtdXRhdGlvbiIsInRhcmdldFNoYXBlIiwic3BsaWNlIiwiZWluc3VtQ29uZmlnIiwiZWx1IiwiZXhwIiwiZWx1Q29uZmlnIiwiZWx1R3JhZCIsInYiLCJlbHVHcmFkQ29uZmlnIiwiZXF1YWxJbXBsIiwiZXF1YWwiLCJlcXVhbENvbmZpZyIsIkVSRl9QIiwiYTEiLCJFUkZfQTEiLCJhMiIsIkVSRl9BMiIsImEzIiwiRVJGX0EzIiwiYTQiLCJFUkZfQTQiLCJhNSIsIkVSRl9BNSIsImVyZiIsInNpZ24iLCJlcmZDb25maWciLCJleHBJbXBsIiwiZXhwQ29uZmlnIiwiZGltIiwiaW5wdXRSYW5rIiwibmV3U2hhcGUiLCIkZGltIiwiZXhwYW5kRGltc0NvbmZpZyIsImV4cG0xSW1wbCIsImV4cG0xIiwiZXhwbTFDb25maWciLCJmZnQiLCJpbnB1dFNpemUiLCJpbm5lckRpbWVuc2lvblNpemUiLCJpbnB1dDJEIiwicmVzdWx0UmVzaGFwZWQiLCJmZnRDb25maWciLCJmaWxsIiwiJGR0eXBlIiwiaW5mZXJEdHlwZSIsImZpbGxWYWx1ZXMiLCJmaWxsQ29uZmlnIiwiZmxpcExlZnRSaWdodENvbmZpZyIsImdldFR5cGVkQXJyYXlGcm9tRFR5cGUiLCJiYXRjaElkeCIsImJhdGNoT2Zmc2V0Iiwicm93T2Zmc2V0IiwiY29vcmRYIiwib3V0SWR4Iiwib3V0cHV0VmFsdWUiLCJmbG9vckltcGwiLCJmbG9vckNvbmZpZyIsImZsb29yRGl2SW1wbCIsImZsb29yRGl2IiwiZmxvb3JEaXZDb25maWciLCJmdXNlZENvbnYyRCIsImJpYXMiLCJwcmVsdUFjdGl2YXRpb25XZWlnaHRzIiwiYWN0aXZhdGlvbiIsImxlYWt5cmVsdUFscGhhIiwicmVzdWx0T2xkIiwiZnVzZWRDb252MkRDb25maWciLCJmdXNlZERlcHRod2lzZUNvbnYyRCIsIm9sZFJlc3VsdCIsImZ1c2VkRGVwdGh3aXNlQ29udjJEQ29uZmlnIiwiZ2F0aGVyTmQiLCJwYXJhbXMiLCJpbmRpY2VzIiwicGFyYW1zU2l6ZSIsImluZGljZXNTaGFwZSIsInNsaWNlUmFuayIsIm51bVNsaWNlcyIsInByZXBhcmVBbmRWYWxpZGF0ZSIsImluZGljZXNEYXRhIiwicGFyYW1zQnVmIiwiZ2F0aGVyTmRDb25maWciLCJnYXRoZXJOZEltcGwiLCJwYXJhbXNTaGFwZSIsImluZGV4IiwiZmxhdHRlbkluZGV4IiwiaW5kZXhUb0xvYyIsImdhdGhlclYyIiwiYmF0Y2hEaW1zIiwiJGJhdGNoRGltcyIsImluZGljZXNTaXplIiwicGFyc2VkQXhpcyIsInNoYXBlSW5mbyIsInNlZ21lbnRfdXRpbCIsImNvbGxlY3RHYXRoZXJPcFNoYXBlSW5mbyIsImZsYXR0ZW5YIiwib3V0ZXJTaXplIiwiZGltU2l6ZSIsImZsYXR0ZW5PdXRwdXRTaGFwZSIsImluZGljZXNCdWYiLCJvdXRwdXRTaGFwZSIsImdhdGhlclYyQ29uZmlnIiwiZ2F0aGVyVjJJbXBsIiwib3JpZ2luYWxMb2MiLCJpbmRpY2VzSWR4IiwiaW5kaWNlc0luZGV4Iiwib3JpZ2luYWxJbmRleCIsImdyZWF0ZXJJbXBsIiwiZ3JlYXRlciIsImdyZWF0ZXJDb25maWciLCJncmVhdGVyRXF1YWxJbXBsIiwiZ3JlYXRlckVxdWFsIiwiZ3JlYXRlckVxdWFsQ29uZmlnIiwiaWZmdCIsImlmZnRDb25maWciLCJpZGVudGl0eSIsImlkZW50aXR5Q29uZmlnIiwiaW1hZ1ZhbCIsImltYWdDb25maWciLCJpc0Zpbml0ZSIsImlzRmluaXRlQ29uZmlnIiwiaXNJbmYiLCJJbmZpbml0eSIsImlzSW5mQ29uZmlnIiwiaXNOYU4iLCJpc05hTkNvbmZpZyIsImxSTiIsImRlcHRoUmFkaXVzIiwiYWxwaGEiLCJiZXRhIiwiY2hhbm5lbHMiLCJtYXhEIiwic3VtQWNyb3NzQ2hhbm5lbHMiLCJjdXJyZW50Q2hhbm5lbCIsImJlZ2luU3VtT2Zmc2V0IiwiZW5kU3VtT2Zmc2V0IiwieiIsInBvdyIsImxSTkNvbmZpZyIsImxSTkdyYWQiLCJkeVNpemUiLCJ5VmFsdWVzIiwiZGVwdGhCZWdpbiIsImRlcHRoRW5kIiwibm9ybSIsImR5aSIsImxSTkdyYWRDb25maWciLCJsZWFreVJlbHUiLCJsZWFreVJlbHVDb25maWciLCJsZXNzSW1wbCIsImxlc3MiLCJsZXNzQ29uZmlnIiwibGVzc0VxdWFsSW1wbCIsImxlc3NFcXVhbCIsImxlc3NFcXVhbENvbmZpZyIsImxpblNwYWNlIiwic3RvcCIsIm51bSIsImxpblNwYWNlQ29uZmlnIiwibGluU3BhY2VJbXBsIiwic3RlcCIsImxvZ0ltcGwiLCJsb2ciLCJsb2dDb25maWciLCJsb2cxcCIsImxvZzFwQ29uZmlnIiwibG9naWNhbEFuZEltcGwiLCJsb2dpY2FsQW5kIiwibG9naWNhbEFuZENvbmZpZyIsImxvZ2ljYWxOb3QiLCJsb2dpY2FsTm90Q29uZmlnIiwibG9naWNhbE9ySW1wbCIsImxvZ2ljYWxPciIsImxvZ2ljYWxPckNvbmZpZyIsInJlZHVjdGlvbkluZGljZXMiLCJ4U2hhcGUiLCJtYXhPdXRTaGFwZSIsIm1heENvbmZpZyIsIm1heFBvb2wiLCJtYXhQb29sQ29uZmlnIiwibWF4UG9vbDNEIiwibWF4UG9vbDNEQ29uZmlnIiwibWF4UG9vbDNER3JhZCIsImlucHV0QnVmIiwibWF4UG9zQnVmIiwibWFzayIsIm1heFBvb2wzREdyYWRDb25maWciLCJtYXhQb29sR3JhZCIsIm1heFBvb2xHcmFkQ29uZmlnIiwibWF4UG9vbFdpdGhBcmdtYXhDb25maWciLCJpbmNsdWRlQmF0Y2hJbkluZGV4IiwicG9vbGVkIiwiaW5kZXhlcyIsInBvb2xlZERhdGFJZCIsImluZGV4ZXNEYXRhSWQiLCJtYXhQb29sV2l0aEFyZ21heEltcGwiLCJtYXhQb29scyIsIm1heFBvc2l0aW9ucyIsIm1heEltcGwiLCJtYXhpbXVtSW1wbCIsIm1heGltdW0iLCJtYXhpbXVtQ29uZmlnIiwidG9EaXNwb3NlIiwicmVkdWNlU2l6ZVNjYWxhciIsIm1lYW5Db25maWciLCJtaW5Db25maWciLCJtaW5pbXVtSW1wbCIsIm1pbmltdW0iLCJtaW5pbXVtQ29uZmlnIiwibWlycm9yUGFkIiwicGFkZGluZ3MiLCJlbmQiLCJyZXN1bHRTaXplIiwicmVzdWx0UmFuayIsInJlc3VsdFN0cmlkZXMiLCJjb29yZHMiLCJpbkluZGV4IiwibWlycm9yUGFkQ29uZmlnIiwibW9kSW1wbCIsInJlbSIsIm1vZCIsIm1vZENvbmZpZyIsIm11bHRpbm9taWFsIiwibG9naXRzIiwibnVtU2FtcGxlcyIsInNlZWQiLCJub3JtYWxpemVkIiwicHJvYmFiaWxpdGllcyIsIm51bUV2ZW50cyIsInByb2JWYWxzIiwicmVzU2hhcGUiLCJjZGYiLCJldmVudCIsInJhbmRvbSIsInRvU3RyaW5nIiwib3V0T2Zmc2V0Iiwic2FtcGxlSWQiLCJtdWx0aW5vbWlhbENvbmZpZyIsIm11bHRpcGx5SW1wbCIsIm11bHRpcGx5Q29tcGxleEltcGwiLCJtdWx0aXBseSIsIm11bHRpcGx5Q29uZmlnIiwibmVnSW1wbCIsInhEdHlwZSIsIm1pbnVzT25lIiwiY3JlYXRlU2NhbGFyVmFsdWUiLCJuZWciLCJuZWdDb25maWciLCJub25NYXhTdXBwcmVzc2lvblYzSW1wbCIsIm5vbk1heFN1cHByZXNzaW9uVjMiLCJzY29yZXMiLCJtYXhPdXRwdXRTaXplIiwiaW91VGhyZXNob2xkIiwic2NvcmVUaHJlc2hvbGQiLCJib3hlc1ZhbHMiLCJzY29yZXNWYWxzIiwic2VsZWN0ZWRJbmRpY2VzIiwibm9uTWF4U3VwcHJlc3Npb25WM0NvbmZpZyIsIm5vbk1heFN1cHByZXNzaW9uVjRJbXBsIiwibm9uTWF4U3VwcHJlc3Npb25WNCIsInBhZFRvTWF4T3V0cHV0U2l6ZSIsInZhbGlkT3V0cHV0cyIsIm5vbk1heFN1cHByZXNzaW9uVjRDb25maWciLCJub25NYXhTdXBwcmVzc2lvblY1SW1wbCIsIm5vbk1heFN1cHByZXNzaW9uVjUiLCJzb2Z0Tm1zU2lnbWEiLCJtYXhPdXRwdXRTaXplVmFsIiwiaW91VGhyZXNob2xkVmFsIiwic2NvcmVUaHJlc2hvbGRWYWwiLCJzb2Z0Tm1zU2lnbWFWYWwiLCJzZWxlY3RlZFNjb3JlcyIsIm5vbk1heFN1cHByZXNzaW9uVjVDb25maWciLCJub3RFcXVhbEltcGwiLCJub3RFcXVhbCIsIm5vdEVxdWFsQ29uZmlnIiwib25lSG90IiwiZGVwdGgiLCJvblZhbHVlIiwib2ZmVmFsdWUiLCJpbmRpY2VzVmFsIiwib25lSG90Q29uZmlnIiwib25lc0xpa2UiLCJpbWFnUGFydCIsIm9uZXNMaWtlQ29uZmlnIiwicGFjayIsImFzc2VydFNoYXBlc01hdGNoIiwiZXhwYW5kZWRUZW5zb3JzIiwiZXhwYW5kZWRUIiwicGFja0NvbmZpZyIsInBhZFYyIiwiY29uc3RhbnRWYWx1ZSIsIm91dENvb3JkcyIsInBhZFYyQ29uZmlnIiwicG93SW1wbCIsInBvd0NvbmZpZyIsInByZWx1SW1wbCIsInhWYWx1ZSIsInByZWx1IiwiYlZhbHMiLCJwcmVsdUNvbmZpZyIsInByb2RJbXBsIiwicmVkdWN0aW9uQXhlcyIsIm91dER0eXBlIiwicGVybXV0ZWRYIiwicHJvZENvbmZpZyIsInJhbmdlIiwicmFuZ2VDb25maWciLCJyYW5nZUltcGwiLCJudW1FbGVtZW50cyIsInJlYWxWYWwiLCJyZWFsQ29uZmlnIiwicmVhbERpdkltcGwiLCJkaXYiLCJyZWFsRGl2Q29uZmlnIiwicmVjaXByb2NhbCIsInJlY2lwcm9jYWxDb25maWciLCJyZWx1IiwicmVsdUNvbmZpZyIsInJlbHU2IiwicmVsdTZDb25maWciLCJyZXNoYXBlIiwiJHNoYXBlIiwiaW5mZXJGcm9tSW1wbGljaXRTaGFwZSIsIiR4U2l6ZSIsInhEYXRhIiwicmVzaGFwZUNvbmZpZyIsInJlc2l6ZUJpbGluZWFyIiwiaW1hZ2VzIiwiYWxpZ25Db3JuZXJzIiwiaGFsZlBpeGVsQ2VudGVycyIsImltYWdlc1N0cmlkZXMiLCJuZXdIZWlnaHQiLCJuZXdXaWR0aCIsIm9sZEhlaWdodCIsIm9sZFdpZHRoIiwiZWZmZWN0aXZlSW5wdXRTaXplIiwiZWZmZWN0aXZlT3V0cHV0U2l6ZSIsImVmZmVjdGl2ZVJvd1NpemVSYXRpbyIsImVmZmVjdGl2ZUNvbFNpemVSYXRpbyIsInNvdXJjZUZyYWNSb3ciLCJzb3VyY2VSb3dGbG9vciIsInJvd0ZyYWMiLCJzb3VyY2VSb3dDZWlsIiwidG9wUm93T2Zmc2V0IiwiYm90Um93T2Zmc2V0Iiwic291cmNlRnJhY0NvbCIsInNvdXJjZUNvbEZsb29yIiwiY29sRnJhYyIsInNvdXJjZUNvbENlaWwiLCJ0b3BMZWZ0T2ZmZXN0IiwiYm90TGVmdE9mZnNldCIsInRvcFJpZ2h0T2Zmc2V0IiwiYm90UmlnaHRPZmZlc3QiLCJuZXdWYWx1ZSIsInJlc2l6ZUJpbGluZWFyQ29uZmlnIiwicmVzaXplQmlsaW5lYXJHcmFkIiwieEhlaWdodCIsInhXaWR0aCIsInlIZWlnaHQiLCJ5V2lkdGgiLCJlZmZlY3RpdmVYU2l6ZSIsImVmZmVjdGl2ZVlTaXplIiwiYk9mZnNldCIsInRvcER4UkluZGV4IiwiYm90dG9tRHhSSW5kZXgiLCJ0b3BEeFJPZmZzZXQiLCJib3R0b21EeFJPZmZzZXQiLCJkeFJMZXJwIiwiaW52ZXJzZUR4UkxlcnAiLCJsZWZ0RHhDSW5kZXgiLCJyaWdodER4Q0luZGV4IiwiZHhDTGVycCIsImludmVyc2VEeENMZXJwIiwidG9wTGVmdFJDT2Zmc2V0IiwidG9wUmlnaHRSQ09mZnNldCIsImJvdHRvbUxlZnRSQ09mZnNldCIsImJvdHRvbVJpZ2h0UkNPZmZzZXQiLCJpbnZlcnNlRHhSTGVycFRpbWVzSW52ZXJzZUR4Q0xlcnAiLCJpbnZlcnNlRHhSTGVycFRpbWVzRHhDTGVycCIsImR4UkxlcnBUaW1lc0ludmVyc2VEeENMZXJwIiwiZHhSTGVycFRpbWVzRHhDTGVycCIsImR5VmFsIiwicmVzaXplQmlsaW5lYXJHcmFkQ29uZmlnIiwicmVzaXplTmVhcmVzdE5laWdoYm9yIiwib3V0cHV0T2Zmc2V0Iiwic291cmNlTmVhcmVzdFJvdyIsInNvdXJjZU5lYXJlc3RDb2wiLCJuZXdWYWwiLCJyZXNpemVOZWFyZXN0TmVpZ2hib3JDb25maWciLCJyZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkIiwiaW52SGVpZ2h0U2NhbGUiLCJpbnZXaWR0aFNjYWxlIiwid2luSGVpZ2h0Iiwid2luV2lkdGgiLCJzdGFydFJMZXJwIiwic3RhcnREeVIiLCJzdGFydENMZXJwIiwic3RhcnREeUMiLCJhY2N1bSIsImR5UkluZGV4IiwiZHlST2Zmc2V0IiwiZHlDSW5kZXgiLCJkeUNPZmZzZXQiLCJyZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkQ29uZmlnIiwiZGltcyIsIiRkaW1zIiwib3V0TG9jIiwiaW5Mb2MiLCJyZXZlcnNlQ29uZmlnIiwicm90YXRlV2l0aE9mZnNldENvbmZpZyIsInJhZGlhbnMiLCJmaWxsVmFsdWUiLCJjZW50ZXIiLCJjZW50ZXJYIiwiY2VudGVyWSIsImdldEltYWdlQ2VudGVyIiwic2luRmFjdG9yIiwic2luIiwiY29zRmFjdG9yIiwiY29vcmRZIiwiYmFzZSIsInJvdW5kQ29uZmlnIiwicnNxcnRJbXBsIiwicnNxcnQiLCJyc3FydENvbmZpZyIsInNjYXR0ZXJOZCIsInVwZGF0ZXMiLCJudW1VcGRhdGVzIiwib3V0cHV0U2l6ZSIsImNhbGN1bGF0ZVNoYXBlcyIsInVwZGF0ZXNCdWYiLCJzY2F0dGVyTmRDb25maWciLCJzY2F0dGVySW1wbCIsImRlZmF1bHRWYWx1ZSIsInN1bUR1cGVJbmRpY2VzIiwiZmxhdHRlblNoYXBlIiwidXBkYXRlc0RhdGEiLCJzZWxlY3QiLCJlIiwiY29uZGl0aW9uUmFuayIsInRWYWx1ZXMiLCJlVmFsdWVzIiwibmV3VmFsdWVzIiwic2VsZWN0Q29uZmlnIiwic2NhbGVBbHBoYSIsIlNFTFVfU0NBTEVBTFBIQSIsIlNFTFVfU0NBTEUiLCJzZWx1Iiwic2VsdUNvbmZpZyIsInNpZ21vaWQiLCJzaWdtb2lkQ29uZmlnIiwic2lnbkNvbmZpZyIsInNpbkNvbmZpZyIsInNpbmgiLCJzaW5oQ29uZmlnIiwic2xpY2VJbXBsIiwiaXNDb250aW5vdXMiLCJpc1NsaWNlQ29udGlub3VzIiwiZmxhdE9mZnNldCIsImNvbXB1dGVGbGF0T2Zmc2V0Iiwic3ViYXJyYXkiLCJpbkJ1ZiIsImZyb21TdHJpbmdBcnJheVRvVWludDgiLCIkYmVnaW4iLCIkc2l6ZSIsInBhcnNlU2xpY2VQYXJhbXMiLCJhc3NlcnRQYXJhbXNWYWxpZCIsInNsaWNlQ29uZmlnIiwic29mdG1heCIsImxvZ2l0c1JhbmsiLCJtYXhMb2dpdCIsIm1heExvZ2l0UmVzaGFwZWQiLCJzdW1FeHAiLCJzdW1SZXNoYXBlZCIsInNvZnRtYXhDb25maWciLCJ0aHJlc2hvbGQiLCJzb2Z0cGx1cyIsInRvb0xhcmdlIiwidG9vU21hbGwiLCJleHBYIiwic29mdHBsdXNDb25maWciLCJzcGFjZVRvQmF0Y2hORCIsImNvbXBsZXRlUGFkZGluZ3MiLCJwYWRkZWRYIiwicmVzaGFwZWRQYWRkZWRTaGFwZSIsInBlcm11dGVkUmVzaGFwZWRQYWRkZWRQZXJtdXRhdGlvbiIsInJlc2hhcGVJbnB1dHMiLCJyZXNoYXBlQXR0cnMiLCJwYWRkZWRYUmVzaGFwZWQiLCJ0cmFuc3Bvc2VJbnB1dHMiLCJ0cmFuc3Bvc2VBdHRycyIsInBhZGRlZFhUIiwicmVzdWx0UmVzaGFwZUlucHV0cyIsInJlc3VsdFJlc2hhcGVBdHRycyIsInNwYWNlVG9CYXRjaE5EQ29uZmlnIiwic3BhcnNlRmlsbEVtcHR5Um93cyIsImRlbnNlU2hhcGUiLCIkaW5kaWNlcyIsIiR2YWx1ZXMiLCIkZGVuc2VTaGFwZSIsIiRkZWZhdWx0VmFsdWUiLCJvdXRwdXRJbmRpY2VzIiwib3V0cHV0SW5kaWNlc1NoYXBlIiwib3V0cHV0VmFsdWVzIiwiZW1wdHlSb3dJbmRpY2F0b3IiLCJyZXZlcnNlSW5kZXhNYXAiLCJVaW50OEFycmF5Iiwic3BhcnNlRmlsbEVtcHR5Um93c0NvbmZpZyIsInNwYXJzZUZpbGxFbXB0eVJvd3NJbXBsIiwiaW5kaWNlc0RUeXBlIiwidmFsdWVzRFR5cGUiLCJpbmRpY2VzQ291bnQiLCJkZW5zZVJvd3MiLCJyb3dzQXJlT3JkZXJlZCIsImxhc3RJbmRpY2VzUm93IiwiY3NyT2Zmc2V0IiwiYWxsUm93c0Z1bGwiLCJyb3dFbXB0eSIsImZ1bGxJbmRpY2VzQ291bnQiLCJmaWxsZWRDb3VudCIsIm91dHB1dEkiLCJzdGFydGluZ0luZGV4Iiwic3BhcnNlUmVzaGFwZSIsImlucHV0SW5kaWNlcyIsIiRpbnB1dFNoYXBlIiwiJGlucHV0SW5kaWNlcyIsIm5ld0luZGljZXMiLCJzcGFyc2VSZXNoYXBlQ29uZmlnIiwic3BhcnNlUmVzaGFwZUltcGwiLCJpbnB1dEluZGljZXNTaGFwZSIsImlucHV0RFR5cGUiLCJkZW5zZVNpemUiLCJubnoiLCJvdXRwdXRSYW5rIiwicHJvZHVjdCIsInVua25vd25JbmRleCIsIm1pc3NpbmciLCJpbnB1dFN0cmlkZXMiLCJvdXRwdXRTdHJpZGVzIiwic3BhcnNlU2VnbWVudE1lYW4iLCJzZWdtZW50SWRzIiwiJGRhdGEiLCIkc2VnbWVudElkcyIsIm91dHB1dERhdGEiLCJvdXRwdXREYXRhU2hhcGUiLCJzcGFyc2VTZWdtZW50TWVhbkNvbmZpZyIsInNwYXJzZVNlZ21lbnRSZWR1Y3Rpb25JbXBsIiwiaXNNZWFuIiwibnVtSW5kaWNlcyIsImlucHV0RmxhdCIsIm51bUNvbCIsIm91dHB1dFJvd3MiLCJvdXRwdXRMZW5ndGgiLCJ1bmluaXRpYWxpemVkSW5kZXgiLCJvdXRJbmRleCIsIm5leHRJbmRleCIsInNwYXJzZVNlZ21lbnRTdW0iLCJzcGFyc2VTZWdtZW50U3VtQ29uZmlnIiwic3BhcnNlVG9EZW5zZSIsInNwYXJzZUluZGljZXMiLCJzcGFyc2VWYWx1ZXMiLCJzcGFyc2VUb0RlbnNlQ29uZmlnIiwic3BsaXRWIiwibnVtT3JTaXplU3BsaXRzIiwic3BsaXRTaXplcyIsInByZXBhcmVTcGxpdFNpemUiLCJzbGljZVQiLCJzcGxpdFZDb25maWciLCJzcXJ0Q29uZmlnIiwic3F1YXJlQ29uZmlnIiwic3F1YXJlZERpZmZlcmVuY2VJbXBsIiwiZGlmZiIsInNxdWFyZWREaWZmZXJlbmNlIiwic3F1YXJlZERpZmZlcmVuY2VDb25maWciLCJzdGVwQXR0cnMiLCJOYU4iLCJzdGVwQ29uZmlnIiwic3RyaWRlZFNsaWNlIiwiYmVnaW5NYXNrIiwiZW5kTWFzayIsImVsbGlwc2lzTWFzayIsIm5ld0F4aXNNYXNrIiwic2hyaW5rQXhpc01hc2siLCJub25TdHJpZGVkIiwiJHN0cmlkZXMiLCJzbGljZUluZm8iLCJzbGljZWQiLCJzb21lIiwic3RyaWRlZFNsaWNlQ29uZmlnIiwic3RyaWRlZFNsaWNlSW1wbCIsImxvYyIsIm5ld0xvYyIsInN0cmluZ05HcmFtcyIsInNlcGFyYXRvciIsIm5HcmFtV2lkdGhzIiwicmlnaHRQYWQiLCJwYWRXaWR0aCIsInByZXNlcnZlU2hvcnRTZXF1ZW5jZXMiLCJkYXRhU3BsaXRzIiwiJGRhdGFTcGxpdHMiLCJuR3JhbXMiLCJuR3JhbXNTcGxpdHMiLCJzdHJpbmdOR3JhbXNDb25maWciLCJTdHJpbmdOR3JhbXNPcCIsInByZXNlcnZlU2hvcnQiLCJnZXRQYWRXaWR0aCIsIm5HcmFtV2lkdGgiLCJnZXROdW1OR3JhbXMiLCJjcmVhdGVOR3JhbXMiLCJzcGxpdEluZGV4Iiwib3V0cHV0U3RhcnRJbmRleCIsIm51bU5HcmFtcyIsIm5HcmFtSW5kZXgiLCJsZWZ0UGFkZGluZyIsInJpZ2h0UGFkZGluZyIsIm51bVRva2VucyIsImRhdGFTdGFydEluZGV4IiwibkdyYW1TaXplIiwibkdyYW0iLCJuZXh0TkdyYW1JbmRleCIsImFwcGVuZFRvTkdyYW0iLCJzdHIiLCJjb21wdXRlIiwic3BsaXRzIiwiaW5wdXREYXRhU2l6ZSIsInNwbGl0c1NpemUiLCJwcmV2U3BsaXQiLCJ2YWxpZFNwbGl0cyIsIm51bUJhdGNoSXRlbXMiLCJlbXB0eSIsIm91dHB1dFN0YXJ0SWR4IiwiZGF0YUxlbmd0aCIsInN0cmluZ05HcmFtc0ltcGwiLCJzdHJpbmdTcGxpdCIsInNraXBFbXB0eSIsImRlbGltaXRlciIsIiRpbnB1dCIsIiRkZWxpbWl0ZXIiLCJzdHJpbmdTcGxpdENvbmZpZyIsInNwbGl0IiwiZGVsaW1pdGVycyIsImluZGV4T2YiLCJ0b2tlbiIsInRva2VuU3RhcnQiLCJzdHJpbmdTcGxpdEltcGwiLCJ0b2tlbnMiLCJtYXhOdW1FbnRyaWVzIiwicGFydHMiLCJuRW50cmllcyIsInN0cmluZ1RvSGFzaEJ1Y2tldEZhc3QiLCJudW1CdWNrZXRzIiwic3RyaW5nVG9IYXNoQnVja2V0RmFzdENvbmZpZyIsInN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RJbXBsIiwiZmluZ2VyUHJpbnQ2NCIsIm1vZHVsbyIsImdldExvd0JpdHNVbnNpZ25lZCIsInN1YkltcGwiLCJzdWJDb21wbGV4SW1wbCIsInN1YiIsInN1YkNvbmZpZyIsInVwY2FzdFR5cGUiLCJzdW1Db25maWciLCJ0YW4iLCJ0YW5Db25maWciLCJ0YW5oIiwidGFuaENvbmZpZyIsInRpbGUiLCJyZXBzIiwidGlsZUNvbmZpZyIsInRpbGVJbXBsIiwidG9wSyIsInNvcnRlZCIsImFsbFRvcEtWYWxzIiwiYWxsVG9wS0luZGljZXMiLCJ0b3BLQ29uZmlnIiwiY29tcGFyZVBhaXIiLCJ2YWx1ZURpZmYiLCJhcnJheSIsInJpZ2h0Iiwic2QiLCJzd2FwIiwidG9wS0ltcGwiLCJsYXN0RGltIiwidmFsQW5kSW5kIiwic29ydCIsInRvcEtWYWxzIiwidG9wS0luZGljZXMiLCJ0cmFuc2Zvcm0iLCJ0cmFuc2Zvcm1zIiwiaW50ZXJwb2xhdGlvbiIsImZpbGxNb2RlIiwiYmF0Y2hTdHJpZGUiLCJyb3dTdHJpZGUiLCJjb2xTdHJpZGUiLCJ0cmFuc2Zvcm1WYWxzIiwib3V0WSIsIm91dFgiLCJwcm9qZWN0aW9uIiwiaW5YIiwiaW5ZIiwibWFwQ29vcmQiLCJuZWFyZXN0SW50ZXJwb2xhdGlvbiIsImJpbGluZWFySW50ZXJwb2xhdGlvbiIsInRyYW5zZm9ybUNvbmZpZyIsIm91dENvb3JkIiwibGVuIiwiaW5Db29yZCIsInN6MiIsImNsYW1wIiwibWFwQ29vcmRSZWZsZWN0Iiwic3oiLCJtYXBDb29yZFdyYXAiLCJtYXBDb29yZE5lYXJlc3QiLCJtYXBDb29yZENvbnN0YW50IiwicmVhZFdpdGhGaWxsVmFsdWUiLCJ5Rmxvb3IiLCJ4Rmxvb3IiLCJ5Q2VpbCIsInhDZWlsIiwidHJhbnNwb3NlIiwidHJhbnNwb3NlQ29uZmlnIiwidHJhbnNwb3NlSW1wbCIsIm5ld1N0cmlkZXMiLCJ1bmlxdWUiLCJ1bmlxdWVDb25maWciLCJ1bmlxdWVJbXBsIiwidW5pcXVlRWxlbWVudHMiLCJpbnB1dEJ1ZmZlciIsInVuaXF1ZUluZGljZXMiLCJpczFEVGVuc29yIiwiZWxlbWVudCIsImF4aXNWYWx1ZXMiLCJqb2luIiwidW5kZWZpbmVkIiwidW5pcXVlSW5kZXgiLCJrZXlzIiwib3V0cHV0VG1wU2hhcGUiLCJvdXRwdXRCdWZmZXIiLCJ1bmlxdWVFbGVtZW50SW5kZXgiLCJ1bnBhY2siLCJ2YWx1ZVJhbmsiLCJ0ZW1wUmVzIiwidW5wYWNrQ29uZmlnIiwidW5zb3J0ZWRTZWdtZW50U3VtIiwibnVtU2VnbWVudHMiLCJpbnRlcm1lZGlhdGVzIiwibnVtSXRlcnMiLCJleHBhbmRlZCIsInNjYWxhclZhbHVlIiwic2VnbWVudElkIiwibWFza0Nhc3RlZCIsIm11bCIsInN1bVRlbnNvckluZm8iLCJ1bnNvcnRlZFNlZ21lbnRTdW1Db25maWciLCJ6ZXJvc0xpa2UiLCJ6ZXJvc0xpa2VDb25maWciLCJfZnVzZWRNYXRNdWwiLCJjdXJyZW50IiwiYWRkUmVzIiwiYWN0aXZhdGlvblJlcyIsIl9mdXNlZE1hdE11bENvbmZpZyIsImtlcm5lbENvbmZpZ3MiLCJrZXJuZWxDb25maWciLCJjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsIiwib3AiLCJhU2hhcGUiLCJiU2hhcGUiLCJhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSIsImFTdHJpZGVzIiwiYlN0cmlkZXMiLCJhQnJvYWRjYXN0RGltcyIsImdldEJyb2FkY2FzdERpbXMiLCJiQnJvYWRjYXN0RGltcyIsImFMb2MiLCJhSW5kZXgiLCJiTG9jIiwiYkluZGV4IiwiYmluYXJ5S2VybmVsRnVuYyIsInNpbXBsZUltcGwiLCJjb21wbGV4SW1wbCIsImRlY29kZWRBVmFscyIsImRlY29kZWRCVmFscyIsIiRhQ29tcGxleCIsIiRhQ29tcGxleFZhbHMiLCJhUmVhbFZhbHMiLCJhSW1hZ1ZhbHMiLCIkYkNvbXBsZXgiLCIkYkNvbXBsZXhWYWxzIiwiYlJlYWxWYWxzIiwiYkltYWdWYWxzIiwicmVzdWx0UmVhbERhdGEiLCJyZXN1bHRJbWFnRGF0YSIsInJlc3VsdFJlYWwiLCJyZXN1bHRJbWFnIiwiY3JlYXRlQ29tcGxleEJpbmFyeUtlcm5lbEltcGwiLCJyZXN1bHRSZWFsVmFscyIsInJlc3VsdEltYWdWYWxzIiwiYUlkeCIsImJJZHgiLCJvcFJlc3VsdCIsImZmdEJhdGNoIiwiaW52ZXJzZSIsImlubmVyRGltIiwiaW5wdXRWYWxzIiwicmVhbDJEIiwiaW1hZzJEIiwiZmZ0SW1wbCIsImdldENvbXBsZXhXaXRoSW5kZXgiLCIkcmVhbEluZm8iLCIkaW1hZ0luZm8iLCJmZnRSYWRpeDIiLCJyZWFsSW5mbyIsImltYWdJbmZvIiwic2l6ZUluZm8iLCJzaXplSW5mb0NvcHkiLCJkaXZSZWFsSW5mbyIsImRpdkltYWdJbmZvIiwiZGl2UmVhbFZhbHMiLCJkaXZJbWFnVmFscyIsInJhd091dHB1dCIsInJldCIsImV4cG9uZW50IiwidGVybSIsImFzc2lnblRvVHlwZWRBcnJheSIsImZvdXJpZXJUcmFuc2Zvcm1CeU1hdG11bCIsInNwbGl0UmVhbEFuZEltYWdBcnJheXMiLCJoYWxmIiwiZXZlbkNvbXBsZXgiLCJjb21wbGV4V2l0aEV2ZW5JbmRleCIsImV2ZW5SZWFsVmFscyIsImV2ZW5JbWFnVmFscyIsImV2ZW5TaGFwZSIsImV2ZW5SZWFsSW5mbyIsImV2ZW5JbWFnSW5mbyIsImV2ZW5UZW5zb3JJbmZvIiwib2RkQ29tcGxleCIsImNvbXBsZXhXaXRoT2RkSW5kZXgiLCJvZGRSZWFsVmFscyIsIm9kZEltYWdWYWxzIiwib2RkU2hhcGUiLCJvZGRSZWFsSW5mbyIsIm9kZEltYWdJbmZvIiwib2RkVGVuc29ySW5mbyIsIiRldmVuQ29tcGxleCIsIiRldmVuUmVhbFZhbHMiLCIkZXZlbkltYWdWYWxzIiwiJGV2ZW5TaGFwZSIsIiRldmVuUmVhbEluZm8iLCIkZXZlbkltYWdJbmZvIiwiJGV2ZW5UZW5zb3JJbmZvIiwiJG9kZENvbXBsZXgiLCIkb2RkUmVhbFZhbHMiLCIkb2RkSW1hZ1ZhbHMiLCIkb2RkU2hhcGUiLCIkb2RkUmVhbEluZm8iLCIkb2RkSW1hZ0luZm8iLCIkb2RkVGVuc29ySW5mbyIsImV4cG9uZW50cyIsImVTaGFwZSIsImVSZWFsSW5mbyIsImVJbWFnSW5mbyIsImV4cG9uZW50SW5mbyIsImFkZFBhcnQiLCJzdWJQYXJ0IiwiYWRkUGFydFJlYWwiLCJzdWJQYXJ0UmVhbCIsImFkZFBhcnRJbWFnIiwic3ViUGFydEltYWciLCIkcmVhbCIsIiRpbWFnIiwiJHJlYWxWYWxzIiwiJGltYWdWYWxzIiwiYXBwbHlBY3RpdmF0aW9uIiwicG9vbCIsInBvb2xUeXBlIiwiaW5pdGlhbFZhbHVlIiwiTkVHQVRJVkVfSU5GSU5JVFkiLCJQT1NJVElWRV9JTkZJTklUWSIsIm91dHB1dEJhdGNoU3RyaWRlcyIsIm91dHB1dFJvd1N0cmlkZXMiLCJvdXRwdXRDb2xTdHJpZGVzIiwib3V0cHV0QmF0Y2hPZmZzZXQiLCJpbnB1dEJhdGNoT2Zmc2V0IiwieFJNYXgiLCJvdXRwdXRSb3dPZmZzZXQiLCJ4Q01heCIsIm1pbk1heFZhbHVlIiwiYXZnVmFsdWUiLCJjb3VudCIsInhST2Zmc2V0IiwicGl4ZWwiLCJtYXhQb29sUG9zaXRpb25zIiwiZmxhdHRlblBvc2l0aW9ucyIsIm1heFZhbHVlIiwibWF4UG9zaXRpb24iLCJwb29sM2QiLCJvdXRwdXREZXB0aFN0cmlkZXMiLCJ5RGVwdGgiLCJ4RGVwdGhDb3JuZXIiLCJ4RGVwdGhNaW4iLCJ4RGVwdGhNYXgiLCJvdXRwdXREZXB0aE9mZnNldCIsInlSb3ciLCJ4Um93Q29ybmVyIiwieFJvd01pbiIsInhSb3dNYXgiLCJ5Q29sIiwieENvbENvcm5lciIsInhDb2xNaW4iLCJ4Q29sTWF4Iiwib3V0cHV0Q29sT2Zmc2V0IiwieERlcHRoIiwieERlcHRoT2Zmc2V0IiwieFJvdyIsInhSb3dPZmZzZXQiLCJ4Q29sIiwibWF4UG9vbDNkUG9zaXRpb25zIiwiY3JlYXRlU2ltcGxlVW5hcnlJbXBsIiwidW5hcnlLZXJuZWxGdW5jIiwidW5hcnlLZXJuZWxGdW5jRnJvbUltcGwiLCJ1bmFyeUltcGwiLCJ6ZXJvcyIsInZlcnNpb24iLCJCYWNrZW5kV2FzbSIsIndhc20iLCJkYXRhSWROZXh0TnVtYmVyIiwidGZqcyIsImluaXQiLCJkYXRhSWRNYXAiLCJzdHJpbmdCeXRlcyIsIm1lbW9yeU9mZnNldCIsIm51bUJ5dGVzIiwiYnl0ZXNQZXJFbGVtZW50IiwiX21hbGxvYyIsInJlZ2lzdGVyVGVuc29yIiwiSEVBUFU4IiwiYnl0ZU9mZnNldCIsInR5cGVkQXJyYXlGcm9tQnVmZmVyIiwiX2ZyZWUiLCJnZXRNZW1vcnlPZmZzZXQiLCJQVGhyZWFkIiwidGVybWluYXRlQWxsVGhyZWFkcyIsInR5cGVkQXJyYXlGcm9tSGVhcCIsImdldFBhdGhUb1dhc21CaW5hcnkiLCJzaW1kU3VwcG9ydGVkIiwidGhyZWFkc1N1cHBvcnRlZCIsIndhc21Nb2R1bGVGb2xkZXIiLCJ3YXNtUGF0aCIsIndhc21GaWxlTWFwIiwiYXN5bmMiLCJQcm9taXNlIiwiZ2V0QXN5bmMiLCJyZXNvbHZlIiwicmVqZWN0IiwiZmFjdG9yeUNvbmZpZyIsImxvY2F0ZUZpbGUiLCJwcmVmaXgiLCJlbmRzV2l0aCIsInJlc3BvbnNlIiwiYmxvYiIsIkJsb2IiLCJ0eXBlIiwiVVJMIiwiY3JlYXRlT2JqZWN0VVJMIiwid2FzbVBhdGhQcmVmaXgiLCJjdXN0b21GZXRjaCIsImluc3RhbnRpYXRlV2FzbSIsImltcG9ydHMiLCJjYWxsYmFjayIsImZldGNoIiwiY3JlZGVudGlhbHMiLCJ0aGVuIiwiZW52IiwiYXJyYXlCdWZmZXIiLCJiaW5hcnkiLCJXZWJBc3NlbWJseSIsImluc3RhbnRpYXRlIiwiaW5zdGFuY2UiLCJpbml0aWFsaXplZCIsIm9uQWJvcnQiLCJpbml0QWJvcnRlZCIsIm1lc3NhZ2UiLCJtYWluU2NyaXB0VXJsT3JCbG9iIiwiY3dyYXAiLCJ3YXNtQmluYXJ5TmFtZXMiLCJzZXRXYXNtUGF0aCIsInVzZVBsYXRmb3JtRmV0Y2giLCJzZXRXYXNtUGF0aHMiLCJwcmVmaXhPckZpbGVNYXAiLCJtaXNzaW5nUGF0aHMiLCJyZXNldFdhc21QYXRoIiwiRU5WIiwicmVnaXN0ZXJGbGFnIiwidmFsaWRhdGUiLCJNZXNzYWdlQ2hhbm5lbCIsInBvcnQxIiwicG9zdE1lc3NhZ2UiLCJTaGFyZWRBcnJheUJ1ZmZlciIsIndhc21GdW5jIiwic2V0dXBGdW5jIiwiaW5wdXRJZHMiLCJpbnB1dElkc0J5dGVzIiwid2FzbUFsbCIsImlucHV0SWQiLCJ0cmFuc3Bvc2VkIiwib3JpZ2luYWxBeGVzIiwiaW5wdXRXYXNUcmFuc3Bvc2VkIiwid2FzbUFueSIsInhJZCIsInRyYW5zcG9zZWRJZCIsImlubmVyU2l6ZSIsIndhc21BdmdQb29sIiwicGFkUmlnaHQiLCJwYWRCb3R0b20iLCJ3YXNtQmF0Y2hNYXRNdWwiLCJhM2RJZCIsImIzZElkIiwiYVNoYXBlQnl0ZXMiLCJiU2hhcGVCeXRlcyIsImluVmFscyIsIndhc21DbGlwIiwiY2xpcEJ5VmFsdWVDb25maWciLCJzdW1Jbm5lckRpbXMiLCJpbm5lckRpbXMiLCJpbk9mZnNldCIsIndhc21Db252MmQiLCJmaWx0ZXJJZCIsImlucHV0Q2hhbm5lbHMiLCJvdXRwdXRDaGFubmVscyIsImlzU2FtZVBhZCIsIndhc21Db252MkRCYWNrcHJvcElucHV0IiwiZHhTdHJpZGVzIiwiZHlJZCIsIkludGVycG9sYXRpb25NZXRob2QiLCJ3YXNtQ3JvcEFuZFJlc2l6ZSIsImNhc3RlZERhdGEiLCJpbWFnZXNEYXRhIiwiaW1hZ2VzSWQiLCJib3hlc0lkIiwiYm94SW5kSWQiLCJpbWFnZXNTaGFwZUJ5dGVzIiwid2FzbUN1bXN1bSIsInBlcm11dGVkT3V0IiwicGVybXV0ZWRYSWQiLCJwZXJtdXRlZE91dElkIiwidW5kb1Blcm11dGF0aW9uIiwid2FzbURlcHRoVG9TcGFjZSIsInhTdHJpZGVzQnl0ZXMiLCJvdXRwdXRTaGFwZUJ5dGVzIiwib3V0U3RyaWRlc0J5dGVzIiwid2FzbURlcHRod2lzZUNvbnYyZCIsIndhc21GbGlwTGVmdFJpZ2h0IiwiZmxpcExlZnRSaWdodCIsImltYWdlSWQiLCJ3YXNtQmF0Y2hOb3JtIiwiZnVzZWRCYXRjaE5vcm1Db25maWciLCJtZWFuSWQiLCJ2YXJpYW5jZUlkIiwib2Zmc2V0SWQiLCJzY2FsZUlkIiwid2FzbUZ1c2VkQ29udjJkIiwiZnVzZWRBY3RpdmF0aW9uIiwiYmlhc0lkIiwiYmlhc0RhdGEiLCJwcmVsdUFjdGl2YXRpb25XZWlnaHRzSWQiLCJ3YXNtRnVzZWREZXB0aHdpc2VDb252MmQiLCJ3YXNtR2F0aGVyTmQiLCJpbmRpY2VzSWQiLCJzdHJpZGVzQnl0ZXMiLCJ3YXNtR2F0aGVyIiwic3RyaWRlc1NpemUiLCJ3YXNtTWF4Iiwid2FzbU1heFBvb2wiLCJ3YXNtTWVhbiIsImNhc3RlZElucHV0Iiwid2FzbU1pbiIsIk1pcnJvclBhZGRpbmdNb2RlIiwid2FzbU1pcnJvclBhZCIsInhTaGFwZUJ5dGVzIiwicHJlUGFkZGluZ3NGbGF0IiwicGFkVHVwbGUiLCJwb3N0UGFkZGluZ3NGbGF0IiwicHJlUGFkZGluZ3NCeXRlcyIsInBvc3RQYWRkaW5nc0J5dGVzIiwic2NvcmVzSWQiLCJyZXNPZmZzZXQiLCJwU2VsZWN0ZWRJbmRpY2VzIiwic2VsZWN0ZWRTaXplIiwicFNlbGVjdGVkU2NvcmVzIiwicFZhbGlkT3V0cHV0cyIsInBhcnNlUmVzdWx0U3RydWN0Iiwid2FzbU9uZUhvdCIsIndhc21QYWRWMiIsIndhc21QcmVsdSIsIndlaWdodHNJZCIsIndhc21Qcm9kIiwid2FzbVJlc2l6ZUJpbGluZWFyIiwid2FzbVJldmVyc2UiLCJheGVzQnl0ZXMiLCJvdXRTaGFwZUJ5dGVzIiwid2FzbVJvdGF0ZSIsInJvdGF0ZVdpdGhPZmZzZXQiLCJmaWxsQnl0ZXMiLCJ3YXNtU2NhdHRlck5kIiwidXBkYXRlc0lkIiwid2FzbVNlbGVjdCIsImNvbmRpdGlvbklkIiwidElkIiwiZUlkIiwiY1JhbmsiLCJ0UmFuayIsImJlZ2luXyIsInNpemVfIiwib3V0RGF0YSIsInhTdHJpZGUiLCJiZWdpbkkiLCJiZWdpbkoiLCJlbmRJIiwieE9mZnNldCIsInNsaWNlMmQiLCJ4U3RyaWRlMSIsInhTdHJpZGUyIiwiYmVnaW5LIiwiZW5kSiIsInNsaWNlM2QiLCJ4U3RyaWRlMyIsImVuZEsiLCJiZWdpbkwiLCJzbGljZTRkIiwieFNsaWNlU2l6ZSIsInhTbGljZSIsIndhc21TdGVwIiwid2FzbVN0cmlkZWRTbGljZSIsImVsbGlwc2lzQXhlcyIsInNsaWNlX3V0aWwiLCJtYXNrVG9BeGVzIiwibnVtSW50ZXJwb2xhdGVkQXhlcyIsImV4cGFuZEF4ZXMiLCJub3JtYWxpemVkQmVnaW4iLCJub3JtYWxpemVkRW5kIiwibm9ybWFsaXplZFN0cmlkZXMiLCJnZXROb3JtYWxpemVkQXhlcyIsInNocmlua0F4ZXMiLCJfIiwiZXZlcnkiLCJ4U2xpY2VkIiwiYmVnaW5CeXRlcyIsImVuZEJ5dGVzIiwid2FzbVN1bSIsIndhc21UaWxlIiwibmV3U2hhcGVCeXRlcyIsIndhc21Ub3BLIiwidG9wayIsIm91dFZhbHVlcyIsIm91dFZhbHVlc0lkIiwib3V0SW5kaWNlcyIsIm91dEluZGljZXNJZCIsIndhc21UcmFuc2Zvcm0iLCJ0cmFuc2Zvcm1zSWQiLCJpbnRlcnBvbGF0aW9uTW9kZUlkIiwiZmlsbE1vZGVJZCIsIndhc21UcmFuc3Bvc2UiLCJyZWR1Y2VkU2hhcGUiLCJuZXdQZXJtIiwibWluVmFsSWR4IiwicmVtb3ZlT25lU2l6ZURpbXMiLCJwZXJtSXNOb09wIiwiY2xvbmVkIiwicGVybUJ5dGVzIiwibnVtT3V0cHV0cyIsIm91dHMiLCJ3YXNtRnVzZWRNYXRNdWwiLCJmdXNlZE1hdE11bENvbmZpZyIsImFJZCIsImJJZCIsImNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyIsInN1cHBvcnRzRnVsbEJyb2FkY2FzdCIsIm91dHB1dFR5cGUiLCJsb29wc092ZXJBbGxPZkEiLCJsb29wc092ZXJBbGxPZkIiLCJwZXJtdXRlQXhlc0FuZFRyYW5zcG9zZSIsIkNwcERUeXBlIiwiRnVzYWJsZUFjdGl2YXRpb24iLCJjcmVhdGVVbmFyeUtlcm5lbENvbmZpZyIsIl9zY3JpcHREaXIiLCJXYXNtQmFja2VuZE1vZHVsZVRocmVhZGVkU2ltZCIsImRvY3VtZW50IiwiY3VycmVudFNjcmlwdCIsInNyYyIsIl9fZmlsZW5hbWUiLCJHUk9XQUJMRV9IRUFQX0k4Iiwid2FzbU1lbW9yeSIsInVwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzIiwiSEVBUDgiLCJHUk9XQUJMRV9IRUFQX1U4IiwiR1JPV0FCTEVfSEVBUF9JMzIiLCJIRUFQMzIiLCJHUk9XQUJMRV9IRUFQX1UzMiIsIkhFQVBVMzIiLCJHUk9XQUJMRV9IRUFQX0Y2NCIsIkhFQVBGNjQiLCJyZWFkeVByb21pc2VSZXNvbHZlIiwicmVhZHlQcm9taXNlUmVqZWN0IiwiTW9kdWxlIiwibW9kdWxlT3ZlcnJpZGVzIiwiYXJndW1lbnRzXyIsInF1aXRfIiwic3RhdHVzIiwidG9UaHJvdyIsIkVOVklST05NRU5UX0lTX1dFQiIsIkVOVklST05NRU5UX0lTX1dPUktFUiIsIkVOVklST05NRU5UX0lTX05PREUiLCJFTlZJUk9OTUVOVF9JU19TSEVMTCIsIndpbmRvdyIsImltcG9ydFNjcmlwdHMiLCJwcm9jZXNzIiwidmVyc2lvbnMiLCJub2RlIiwiRU5WSVJPTk1FTlRfSVNfUFRIUkVBRCIsInJlYWRfIiwicmVhZEFzeW5jIiwicmVhZEJpbmFyeSIsIm5vZGVGUyIsIm5vZGVQYXRoIiwic2NyaXB0RGlyZWN0b3J5Iiwibm9kZVdvcmtlclRocmVhZHMiLCJkaXJuYW1lIiwiX19kaXJuYW1lIiwiZmlsZW5hbWUiLCJyZXBsYWNlIiwiZXgiLCJFeGl0U3RhdHVzIiwiYWJvcnQiLCJjb25zb2xlIiwiZXJyb3IiLCJnbG9iYWwiLCJXb3JrZXIiLCJyZWFkIiwicmVhZGJ1ZmZlciIsInNjcmlwdEFyZ3MiLCJhcmd1bWVudHMiLCJxdWl0IiwicHJpbnQiLCJwcmludEVyciIsInNlbGYiLCJsb2NhdGlvbiIsImhyZWYiLCJzdWJzdHIiLCJsYXN0SW5kZXhPZiIsInVybCIsInhociIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsInNlbmQiLCJyZXNwb25zZVRleHQiLCJyZXNwb25zZVR5cGUiLCJvbmxvYWQiLCJvbmVycm9yIiwicGVyZm9ybWFuY2UiLCJ3YXNtQmluYXJ5IiwiZXJyIiwiQXRvbWljcyIsImxvYWQiLCJzdG9yZSIsImNvbXBhcmVFeGNoYW5nZSIsIndhc21Nb2R1bGUiLCJub0V4aXRSdW50aW1lIiwiQUJPUlQiLCJ0ZXh0IiwiZ2V0Q0Z1bmMiLCJpZGVudCIsImZ1bmMiLCJjY2FsbCIsInJldHVyblR5cGUiLCJhcmdUeXBlcyIsIm9wdHMiLCJ0b0MiLCJzdHJpbmdUb1VURjgiLCJzdGFja0FsbG9jIiwiYXJyIiwid3JpdGVBcnJheVRvTWVtb3J5IiwiY0FyZ3MiLCJzdGFjayIsImNvbnZlcnRlciIsInN0YWNrU2F2ZSIsImFwcGx5IiwiVVRGOFRvU3RyaW5nIiwiQm9vbGVhbiIsImNvbnZlcnRSZXR1cm5WYWx1ZSIsInN0YWNrUmVzdG9yZSIsIm51bWVyaWNBcmdzIiwiVVRGOEFycmF5VG9TdHJpbmciLCJoZWFwIiwibWF4Qnl0ZXNUb1JlYWQiLCJlbmRJZHgiLCJ1MCIsInUxIiwidTIiLCJTdHJpbmciLCJmcm9tQ2hhckNvZGUiLCJjaCIsInB0ciIsInN0cmluZ1RvVVRGOEFycmF5IiwibWF4Qnl0ZXNUb1dyaXRlIiwic3RhcnRJZHgiLCJ1IiwiY2hhckNvZGVBdCIsIm91dFB0ciIsImxlbmd0aEJ5dGVzVVRGOCIsImFsaWduVXAiLCJtdWx0aXBsZSIsImJ1ZiIsIkludDhBcnJheSIsIkludDE2QXJyYXkiLCJVaW50MTZBcnJheSIsIlVpbnQzMkFycmF5IiwiRmxvYXQ2NEFycmF5Iiwid2FzbVRhYmxlIiwiSU5JVElBTF9NRU1PUlkiLCJNZW1vcnkiLCJieXRlTGVuZ3RoIiwiX19BVFBSRVJVTl9fIiwiX19BVElOSVRfXyIsIl9fQVRNQUlOX18iLCJfX0FURVhJVF9fIiwiX19BVFBPU1RSVU5fXyIsInByZVJ1biIsImFkZE9uUHJlUnVuIiwic2hpZnQiLCJjYWxsUnVudGltZUNhbGxiYWNrcyIsImluaXRSdW50aW1lIiwicHJlTWFpbiIsImV4aXRSdW50aW1lIiwicG9zdFJ1biIsImFkZE9uUG9zdFJ1biIsImNiIiwidW5zaGlmdCIsIl9fX3dhc21fY2FsbF9jdG9ycyIsInJ1bkRlcGVuZGVuY2llcyIsInJ1bkRlcGVuZGVuY3lXYXRjaGVyIiwiZGVwZW5kZW5jaWVzRnVsZmlsbGVkIiwiYWRkUnVuRGVwZW5kZW5jeSIsInJlbW92ZVJ1bkRlcGVuZGVuY3kiLCJjbGVhckludGVydmFsIiwid2hhdCIsIlJ1bnRpbWVFcnJvciIsImhhc1ByZWZpeCIsInN0YXJ0c1dpdGgiLCJkYXRhVVJJUHJlZml4IiwiaXNEYXRhVVJJIiwiZmlsZVVSSVByZWZpeCIsImlzRmlsZVVSSSIsIndhc21CaW5hcnlGaWxlIiwiZ2V0QmluYXJ5IiwiZmlsZSIsImdldEJpbmFyeVByb21pc2UiLCJjYXRjaCIsImNyZWF0ZVdhc20iLCJpbmZvIiwiYXNtTGlicmFyeUFyZyIsInJlY2VpdmVJbnN0YW5jZSIsIm51bVdvcmtlcnNUb0xvYWQiLCJ1bnVzZWRXb3JrZXJzIiwibG9hZFdhc21Nb2R1bGVUb1dvcmtlciIsInJlY2VpdmVJbnN0YW50aWF0ZWRTb3VyY2UiLCJpbnN0YW50aWF0ZUFycmF5QnVmZmVyIiwicmVjZWl2ZXIiLCJyZWFzb24iLCJpbnN0YW50aWF0ZVN0cmVhbWluZyIsIkFTTV9DT05TVFMiLCIkMCIsIiQxIiwic2V0VGltZW91dCIsIl9fZW1zY3JpcHRlbl9kb19kaXNwYXRjaF90b190aHJlYWQiLCJpbml0UHRocmVhZHNKUyIsImNhbGxiYWNrcyIsImFyZyIsIl9lbXNjcmlwdGVuX2Z1dGV4X3dha2UiLCJhZGRyIiwibWFpblRocmVhZFdhaXRBZGRyZXNzIiwiX19lbXNjcmlwdGVuX21haW5fdGhyZWFkX2Z1dGV4IiwibWFpblRocmVhZFdva2VuIiwibm90aWZ5Iiwia2lsbFRocmVhZCIsInB0aHJlYWRfcHRyIiwicHRocmVhZCIsInB0aHJlYWRzIiwid29ya2VyIiwidGVybWluYXRlIiwiZnJlZVRocmVhZERhdGEiLCJydW5uaW5nV29ya2VycyIsImNhbmNlbFRocmVhZCIsImNsZWFudXBUaHJlYWQiLCJyZXR1cm5Xb3JrZXJUb1Bvb2wiLCJfZW1zY3JpcHRlbl9nZXRfbm93IiwiaW5pdE1haW5UaHJlYWRCbG9jayIsInB0aHJlYWRQb29sU2l6ZSIsIm5hdmlnYXRvciIsImhhcmR3YXJlQ29uY3VycmVuY3kiLCJhbGxvY2F0ZVVudXNlZFdvcmtlciIsInRiIiwiaGVhZFB0ciIsInRsc01lbW9yeSIsIl9fZW1zY3JpcHRlbl90aHJlYWRfaW5pdCIsIl9lbXNjcmlwdGVuX3JlZ2lzdGVyX21haW5fYnJvd3Nlcl90aHJlYWRfaWQiLCJpbml0V29ya2VyIiwidGhyZWFkRXhpdEhhbmRsZXJzIiwic2V0VGhyZWFkU3RhdHVzIiwicnVuRXhpdEhhbmRsZXJzIiwicG9wIiwiX3B0aHJlYWRfc2VsZiIsIl9fX3B0aHJlYWRfdHNkX3J1bl9kdG9ycyIsInJ1bkV4aXRIYW5kbGVyc0FuZERlaW5pdFRocmVhZCIsImV4aXRDb2RlIiwidGhyZWFkRXhpdCIsInRocmVhZENhbmNlbCIsInRocmVhZEluZm9TdHJ1Y3QiLCJhbGxvY2F0ZWRPd25TdGFjayIsInN0YWNrQmFzZSIsInJ1bldpdGhvdXRNYWluVGhyZWFkUXVldWVkQ2FsbHMiLCJfX2Vtc2NyaXB0ZW5fYWxsb3dfbWFpbl9ydW50aW1lX3F1ZXVlZF9jYWxscyIsInJlY2VpdmVPYmplY3RUcmFuc2ZlciIsIm9uRmluaXNoZWRMb2FkaW5nIiwib25tZXNzYWdlIiwiY21kIiwiY3VycmVudFByb3hpZWRPcGVyYXRpb25DYWxsZXJUaHJlYWQiLCJ0aHJlYWQiLCJ0YXJnZXRUaHJlYWQiLCJfZW1zY3JpcHRlbl9tYWluX3RocmVhZF9wcm9jZXNzX3F1ZXVlZF9jYWxscyIsInNwYXduVGhyZWFkIiwibG9hZGVkIiwicnVuUHRocmVhZCIsImFsZXJ0IiwiZXhpdCIsInRhcmdldCIsImxpbmVubyIsIm9uIiwicHRocmVhZE1haW5KcyIsImdldE5ld1dvcmtlciIsImJ1c3lTcGluV2FpdCIsIm1zZWNzIiwiZXN0YWJsaXNoU3RhY2tTcGFjZSIsInN0YWNrVG9wIiwic3RhY2tNYXgiLCJfZW1zY3JpcHRlbl9zdGFja19zZXRfbGltaXRzIiwiZ2V0Tm9FeGl0UnVudGltZSIsImludm9rZUVudHJ5UG9pbnQiLCJfX19hc3NlcnRfZmFpbCIsImxpbmUiLCJfX19jYWxsX21haW4iLCJhcmdjIiwiYXJndiIsIl9tYWluIiwic2V0RXJyTm8iLCJfX19lcnJub19sb2NhdGlvbiIsIl9hdGV4aXQiLCJfZW1zY3JpcHRlbl9wcm94eV90b19tYWluX3RocmVhZF9qcyIsIl9fZW1zY3JpcHRlbl9ub3RpZnlfdGhyZWFkX3F1ZXVlIiwidGFyZ2V0VGhyZWFkSWQiLCJtYWluVGhyZWFkSWQiLCJfYWJvcnQiLCJfZW1zY3JpcHRlbl9hc21fY29uc3RfaW50IiwiY29kZSIsInNpZ1B0ciIsImFyZ2J1ZiIsInJlYWRBc21Db25zdEFyZ3MiLCJfZW1zY3JpcHRlbl9jb25kaXRpb25hbF9zZXRfY3VycmVudF90aHJlYWRfc3RhdHVzIiwiZXhwZWN0ZWRTdGF0dXMiLCJuZXdTdGF0dXMiLCJfZW1zY3JpcHRlbl9mdXRleF93YWl0IiwidGltZW91dCIsInROb3ciLCJ0RW5kIiwiZXhjaGFuZ2UiLCJ3YWl0IiwiX2Vtc2NyaXB0ZW5fbWVtY3B5X2JpZyIsImRlc3QiLCJjb3B5V2l0aGluIiwiX2Vtc2NyaXB0ZW5fbnVtX2xvZ2ljYWxfY29yZXMiLCJjcHVzIiwic3luYyIsIm51bUNhbGxBcmdzIiwic2VyaWFsaXplZE51bUNhbGxBcmdzIiwiX2Vtc2NyaXB0ZW5fcnVuX2luX21haW5fcnVudGltZV90aHJlYWRfanMiLCJkYXRlTm93IiwiX2Vtc2NyaXB0ZW5fcmVjZWl2ZV9vbl9tYWluX3RocmVhZF9qc19jYWxsQXJncyIsInJlYWRBc21Db25zdEFyZ3NBcnJheSIsImRvdWJsZSIsIl9lbXNjcmlwdGVuX3JlY2VpdmVfb25fbWFpbl90aHJlYWRfanMiLCJwcm94aWVkRnVuY3Rpb25UYWJsZSIsIl9lbXNjcmlwdGVuX2dldF9oZWFwX3NpemUiLCJlbXNjcmlwdGVuX3JlYWxsb2NfYnVmZmVyIiwiZ3JvdyIsIl9lbXNjcmlwdGVuX3Jlc2l6ZV9oZWFwIiwicmVxdWVzdGVkU2l6ZSIsIm9sZFNpemUiLCJtYXhIZWFwU2l6ZSIsImN1dERvd24iLCJvdmVyR3Jvd25IZWFwU2l6ZSIsIkpTRXZlbnRzIiwiaW5FdmVudEhhbmRsZXIiLCJyZW1vdmVBbGxFdmVudExpc3RlbmVycyIsImV2ZW50SGFuZGxlcnMiLCJfcmVtb3ZlSGFuZGxlciIsImRlZmVycmVkQ2FsbHMiLCJyZWdpc3RlclJlbW92ZUV2ZW50TGlzdGVuZXJzIiwicmVtb3ZlRXZlbnRMaXN0ZW5lcnNSZWdpc3RlcmVkIiwiZGVmZXJDYWxsIiwidGFyZ2V0RnVuY3Rpb24iLCJwcmVjZWRlbmNlIiwiYXJnc0xpc3QiLCJhcnJheXNIYXZlRXF1YWxDb250ZW50IiwiYXJyQSIsImFyckIiLCJyZW1vdmVEZWZlcnJlZENhbGxzIiwiY2FuUGVyZm9ybUV2ZW50SGFuZGxlclJlcXVlc3RzIiwiY3VycmVudEV2ZW50SGFuZGxlciIsImFsbG93c0RlZmVycmVkQ2FsbHMiLCJydW5EZWZlcnJlZENhbGxzIiwicmVtb3ZlQWxsSGFuZGxlcnNPblRhcmdldCIsImV2ZW50VHlwZVN0cmluZyIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJldmVudExpc3RlbmVyRnVuYyIsInVzZUNhcHR1cmUiLCJyZWdpc3Rlck9yUmVtb3ZlSGFuZGxlciIsImV2ZW50SGFuZGxlciIsImpzRXZlbnRIYW5kbGVyIiwiaGFuZGxlckZ1bmMiLCJjYWxsYmFja2Z1bmMiLCJhZGRFdmVudExpc3RlbmVyIiwicXVldWVFdmVudEhhbmRsZXJPblRocmVhZF9paWlpIiwiZXZlbnRIYW5kbGVyRnVuYyIsImV2ZW50VHlwZUlkIiwiZXZlbnREYXRhIiwidXNlckRhdGEiLCJ2YXJhcmdzIiwiX19lbXNjcmlwdGVuX2NhbGxfb25fdGhyZWFkIiwiZ2V0VGFyZ2V0VGhyZWFkRm9yRXZlbnRDYWxsYmFjayIsImdldE5vZGVOYW1lRm9yVGFyZ2V0Iiwic2NyZWVuIiwibm9kZU5hbWUiLCJmdWxsc2NyZWVuRW5hYmxlZCIsIndlYmtpdEZ1bGxzY3JlZW5FbmFibGVkIiwic3RyaW5nVG9OZXdVVEY4IiwianNTdHJpbmciLCJjU3RyaW5nIiwiX2Vtc2NyaXB0ZW5fc2V0X29mZnNjcmVlbmNhbnZhc19zaXplX29uX3RhcmdldF90aHJlYWRfanMiLCJ0YXJnZXRDYW52YXMiLCJ3aWR0aCIsImhlaWdodCIsInRhcmdldENhbnZhc1B0ciIsIl9lbXNjcmlwdGVuX3NldF9vZmZzY3JlZW5jYW52YXNfc2l6ZV9vbl90YXJnZXRfdGhyZWFkIiwibWF5YmVDU3RyaW5nVG9Kc1N0cmluZyIsInNwZWNpYWxIVE1MVGFyZ2V0cyIsImZpbmRFdmVudFRhcmdldCIsInF1ZXJ5U2VsZWN0b3IiLCJmaW5kQ2FudmFzRXZlbnRUYXJnZXQiLCJfZW1zY3JpcHRlbl9zZXRfY2FudmFzX2VsZW1lbnRfc2l6ZV9jYWxsaW5nX3RocmVhZCIsImNhbnZhcyIsImNhbnZhc1NoYXJlZFB0ciIsIm9mZnNjcmVlbkNhbnZhcyIsImNvbnRyb2xUcmFuc2ZlcnJlZE9mZnNjcmVlbiIsImF1dG9SZXNpemVWaWV3cG9ydCIsIkdMY3R4T2JqZWN0IiwiR0xjdHgiLCJwcmV2Vmlld3BvcnQiLCJnZXRQYXJhbWV0ZXIiLCJ2aWV3cG9ydCIsIl9lbXNjcmlwdGVuX3NldF9jYW52YXNfZWxlbWVudF9zaXplX21haW5fdGhyZWFkIiwiX2Vtc2NyaXB0ZW5fc2V0X2NhbnZhc19lbGVtZW50X3NpemUiLCJfZW1zY3JpcHRlbl9zZXRfY3VycmVudF90aHJlYWRfc3RhdHVzIiwiX2Vtc2NyaXB0ZW5fc2V0X3RocmVhZF9uYW1lIiwidGhyZWFkSWQiLCJfX3dlYmdsX2VuYWJsZV9BTkdMRV9pbnN0YW5jZWRfYXJyYXlzIiwiY3R4IiwiZXh0IiwiZ2V0RXh0ZW5zaW9uIiwiZGl2aXNvciIsImZpcnN0IiwicHJpbWNvdW50IiwiX193ZWJnbF9lbmFibGVfT0VTX3ZlcnRleF9hcnJheV9vYmplY3QiLCJ2YW8iLCJfX3dlYmdsX2VuYWJsZV9XRUJHTF9kcmF3X2J1ZmZlcnMiLCJidWZzIiwiX193ZWJnbF9lbmFibGVfV0VCR0xfbXVsdGlfZHJhdyIsIm11bHRpRHJhd1dlYmdsIiwiR0wiLCJjb3VudGVyIiwiYnVmZmVycyIsInByb2dyYW1zIiwiZnJhbWVidWZmZXJzIiwicmVuZGVyYnVmZmVycyIsInRleHR1cmVzIiwidW5pZm9ybXMiLCJzaGFkZXJzIiwidmFvcyIsImNvbnRleHRzIiwib2Zmc2NyZWVuQ2FudmFzZXMiLCJ0aW1lclF1ZXJpZXNFWFQiLCJwcm9ncmFtSW5mb3MiLCJzdHJpbmdDYWNoZSIsInVucGFja0FsaWdubWVudCIsInJlY29yZEVycm9yIiwiZXJyb3JDb2RlIiwibGFzdEVycm9yIiwiZ2V0TmV3SWQiLCJ0YWJsZSIsImdldFNvdXJjZSIsInNoYWRlciIsInN0cmluZyIsInNvdXJjZSIsImNyZWF0ZUNvbnRleHQiLCJ3ZWJHTENvbnRleHRBdHRyaWJ1dGVzIiwiZ2V0Q29udGV4dCIsInJlZ2lzdGVyQ29udGV4dCIsImhhbmRsZSIsImNvbnRleHQiLCJhdHRyaWJ1dGVzIiwibWFqb3JWZXJzaW9uIiwiZW5hYmxlRXh0ZW5zaW9uc0J5RGVmYXVsdCIsImluaXRFeHRlbnNpb25zIiwibWFrZUNvbnRleHRDdXJyZW50IiwiY29udGV4dEhhbmRsZSIsImN1cnJlbnRDb250ZXh0IiwiZGVsZXRlQ29udGV4dCIsImluaXRFeHRlbnNpb25zRG9uZSIsImRpc2pvaW50VGltZXJRdWVyeUV4dCIsImdldFN1cHBvcnRlZEV4dGVuc2lvbnMiLCJwb3B1bGF0ZVVuaWZvcm1UYWJsZSIsInByb2dyYW0iLCJwdGFibGUiLCJtYXhVbmlmb3JtTGVuZ3RoIiwibWF4QXR0cmlidXRlTGVuZ3RoIiwibWF4VW5pZm9ybUJsb2NrTmFtZUxlbmd0aCIsInV0YWJsZSIsIm51bVVuaWZvcm1zIiwiZ2V0UHJvZ3JhbVBhcmFtZXRlciIsImdldEFjdGl2ZVVuaWZvcm0iLCJnZXRVbmlmb3JtTG9jYXRpb24iLCJfX2Vtc2NyaXB0ZW5fd2ViZ2xfcG93ZXJfcHJlZmVyZW5jZXMiLCJfZW1zY3JpcHRlbl93ZWJnbF9kb19jcmVhdGVfY29udGV4dCIsInBvd2VyUHJlZmVyZW5jZSIsImNvbnRleHRBdHRyaWJ1dGVzIiwibWlub3JWZXJzaW9uIiwiZXhwbGljaXRTd2FwQ29udHJvbCIsInByb3h5Q29udGV4dFRvTWFpblRocmVhZCIsInJlbmRlclZpYU9mZnNjcmVlbkJhY2tCdWZmZXIiLCJfZW1zY3JpcHRlbl93ZWJnbF9jcmVhdGVfY29udGV4dCIsImEwIiwiU1lTQ0FMTFMiLCJtYXBwaW5ncyIsInByaW50Q2hhciIsInN0cmVhbSIsImN1cnIiLCJnZXRTdHIiLCJnZXQ2NCIsImxvdyIsImhpZ2giLCJfZmRfY2xvc2UiLCJmZCIsIl9mZF9zZWVrIiwib2Zmc2V0X2xvdyIsIm9mZnNldF9oaWdoIiwid2hlbmNlIiwibmV3T2Zmc2V0IiwiX2ZkX3dyaXRlIiwiaW92IiwiaW92Y250IiwicG51bSIsIl9wdGhyZWFkX2NsZWFudXBfcG9wIiwiZXhlY3V0ZSIsInJvdXRpbmUiLCJfcHRocmVhZF9jbGVhbnVwX3B1c2giLCJ0aHJlYWRQYXJhbXMiLCJzdGFja0hpZ2giLCJzdGFja1NpemUiLCJ0aXMiLCJkZXRhY2hlZCIsImdsb2JhbF9sb2NhbGUiLCJfZW1zY3JpcHRlbl9nZXRfZ2xvYmFsX2xpYmMiLCJtc2ciLCJzdGFydFJvdXRpbmUiLCJ0aW1lIiwidHJhbnNmZXJMaXN0IiwiX3B0aHJlYWRfY3JlYXRlIiwiYXR0ciIsInN0YXJ0X3JvdXRpbmUiLCJfZW1zY3JpcHRlbl9zeW5jX3J1bl9pbl9tYWluX3RocmVhZF80IiwiX21lbWFsaWduIiwiX3N5c2NvbmYiLCJjYWxsZWRSdW4iLCJydW4iLCJkb1J1biIsImltcGxpY2l0IiwicnVuQ2FsbGVyIiwicmVhZHkiLCJ3YXNtV29ya2VyQ29udGVudHMiLCJXYXNtQmFja2VuZE1vZHVsZSIsIlVURjhEZWNvZGVyIiwiVGV4dERlY29kZXIiLCJlbmRQdHIiLCJkZWNvZGUiLCJBZGROUHJvZ3JhbSIsInZhcmlhYmxlTmFtZXMiLCJzbmlwcGV0cyIsInZhcmlhYmxlIiwib3BlcmF0aW9uIiwidXNlckNvZGUiLCJBZGROUGFja2VkUHJvZ3JhbSIsInBhY2tlZElucHV0cyIsInBhY2tlZE91dHB1dCIsIkFyZ01pbk1heFByb2dyYW0iLCJyZWR1Y2VJbmZvIiwiZmlyc3RQYXNzIiwid2luZG93U2l6ZSIsImNvbXBPcCIsImluZGV4U25pcHBldCIsIkFyZ01pbk1heFBhY2tlZFByb2dyYW0iLCJjaGFyQXQiLCJ0b1VwcGVyQ2FzZSIsImluU2l6ZSIsInNvdXJjZUxvY1NldHVwIiwic291cmNlUmFuayIsInNvdXJjZUxvY0RUeXBlIiwiaW5DaGFubmVsIiwiaW50Q2hhbm5lbHMiLCJzcmNSQ29vcmRzIiwic3JjR0Nvb3JkcyIsInNyY0JDb29yZHMiLCJzcmNBQ29vcmRzIiwiZmV0Y2hDYW5kaWRhdGVJZHgiLCJmZXRjaFZhbHVlIiwiZ2V0QmVzdEluZGljZXNBQ2hhbm5lbFNuaXBwZXQiLCJBdmdQb29sMkRCYWNrcHJvcFByb2dyYW0iLCJBdmdQb29sM0RCYWNrcHJvcFByb2dyYW0iLCJFUFNJTE9OX0ZMT0FUMzIiLCJFUFNJTE9OX0ZMT0FUMTYiLCJiaW5hcnlDYWNoZXMiLCJnZXRCaW5hcnlDYWNoZSIsIndlYkdMVmVyc2lvbiIsIkNQVV9IQU5ET0ZGX1NJWkVfVEhSRVNIT0xEIiwiZ2V0TnVtYmVyIiwiTWF0aEJhY2tlbmRXZWJHTCIsImdwZ3B1IiwicGVuZGluZ1JlYWQiLCJXZWFrTWFwIiwicGVuZGluZ0Rpc3Bvc2FsIiwiV2Vha1NldCIsImRhdGFSZWZDb3VudCIsIm51bUJ5dGVzSW5HUFUiLCJ1cGxvYWRXYWl0TXMiLCJkb3dubG9hZFdhaXRNcyIsImxhc3RHbEZsdXNoVGltZSIsIndhcm5lZEFib3V0TWVtb3J5IiwicGVuZGluZ0RlbGV0ZXMiLCJkaXNwb3NlZCIsImdldEJvb2wiLCJnbCIsImJpbmFyeUNhY2hlIiwiZ3BncHVDcmVhdGVkTG9jYWxseSIsInRleHR1cmVNYW5hZ2VyIiwibnVtTUJCZWZvcmVXYXJuaW5nIiwiZGV2aWNlUGl4ZWxSYXRpbyIsInRleERhdGEiLCJjaGVja051bWVyaWNhbFByb2JsZW1zIiwidXNhZ2UiLCJVUExPQUQiLCJpc1BhY2tlZCIsInJ1bldlYkdMUHJvZ3JhbSIsImNvbnZlcnRBbmRDYWNoZU9uQ1BVIiwic2hvdWxkVGltZVByb2dyYW0iLCJhY3RpdmVUaW1lcnMiLCJnZXRWYWx1ZXNGcm9tVGV4dHVyZSIsInN1YnNjcmliZXJzIiwidG1wRG93bmxvYWRUYXJnZXQiLCJ0bXBEYXRhIiwiY3JlYXRlQnVmZmVyRnJvbVRleHR1cmUiLCJ0ZXh0dXJlIiwiY3JlYXRlQW5kV2FpdEZvckZlbmNlIiwicHMiLCJkb3dubG9hZEZsb2F0MzJNYXRyaXhGcm9tQnVmZmVyIiwiZGVsZXRlQnVmZmVyIiwiZFR5cGVWYWxzIiwicmVtb3ZlRGF0YUlkIiwidG1wVGFyZ2V0IiwiZG93bmxvYWRNYXRyaXhGcm9tUGFja2VkVGV4dHVyZSIsInNob3VsZFVzZVBhY2tlZFByb2dyYW0iLCJkb3dubG9hZEJ5dGVFbmNvZGVkRmxvYXRNYXRyaXhGcm9tT3V0cHV0VGV4dHVyZSIsInRleFNoYXBlIiwidGltZXJBdmFpbGFibGUiLCJvbGRBY3RpdmVUaW1lcnMiLCJuZXdBY3RpdmVUaW1lcnMiLCJvdXRlck1vc3RUaW1lIiwicHJvZ3JhbVRpbWVyc1N0YWNrIiwiZmxhdHRlbmVkQWN0aXZlVGltZXJRdWVyaWVzIiwiZmxhdHRlbiIsInF1ZXJ5IiwiZmxhdHRlbmVkQWN0aXZlVGltZXJOYW1lcyIsIndhbGxNcyIsIm1zIiwibnVtQnl0ZXNJbkdQVUFsbG9jYXRlZCIsIm51bUJ5dGVzQWxsb2NhdGVkIiwibnVtQnl0ZXNJbkdQVUZyZWUiLCJudW1CeXRlc0ZyZWUiLCJzdGFydFRpbWVyIiwiYmVnaW5RdWVyeSIsInN0YXJ0TXMiLCJlbmRNcyIsImVuZFRpbWVyIiwiZW5kUXVlcnkiLCJ3YWl0Rm9yUXVlcnlBbmRHZXRUaW1lIiwidGltZXJRdWVyeSIsInJlbGVhc2VHUFVEYXRhIiwib3JpZ0RhdGFJZCIsImNvbXB1dGVCeXRlcyIsInJlbGVhc2VUZXh0dXJlIiwiZ2V0VGV4dHVyZSIsInVwbG9hZFRvR1BVIiwiZ2V0RGF0YUluZm8iLCJzaG91bGRFeGVjdXRlT25DUFUiLCJzaXplVGhyZXNob2xkIiwiZ2V0R1BHUFVDb250ZXh0IiwiZGF0YVN5bmMiLCJwYWNrZWRVbmFyeU9wIiwiY29tcGlsZUFuZFJ1biIsInVucGFja1RlbnNvciIsInBhY2tUZW5zb3IiLCJwYWNrZWRSZXNoYXBlIiwiYWZ0ZXJTaGFwZSIsImlucHV0M0RTaGFwZSIsImlucHV0M0QiLCJhZnRlclNoYXBlQXMzRCIsInNoYXBlQXMzRCIsIm91dHB1dER0eXBlIiwiY3VzdG9tVW5pZm9ybVZhbHVlcyIsInByZXZlbnRFYWdlclVucGFja2luZ09mT3V0cHV0Iiwib3V0UGFja2luZ1NjaGVtZSIsIkRFTlNFIiwidGV4ZWxTaGFwZSIsIm91dFRleFVzYWdlIiwiZGF0YVRvRGlzcG9zZSIsImlucHV0c0RhdGEiLCJpc1VuaWZvcm0iLCJ1bmlmb3JtVmFsdWVzIiwic2F2ZWRJbnB1dCIsImdldEFuZFNhdmVCaW5hcnkiLCJnZXRRdWVyeVRpbWUiLCJnbEZsdXNoVGhyZXNob2xkIiwiZmx1c2giLCJ1bnBhY2tlZCIsImdldFRleHR1cmVNYW5hZ2VyIiwiZGVsZXRlUHJvZ3JhbSIsIndlYkdMUHJvZ3JhbSIsIkhUTUxDYW52YXNFbGVtZW50IiwicmVtb3ZlIiwiZmxvYXRQcmVjaXNpb25WYWx1ZSIsImRlYnVnRmxhZyIsInVuZGVyZmxvd0NoZWNrVmFsdWUiLCJpc0J5dGVBcnJheSIsInRlbXBEZW5zZUlucHV0SGFuZGxlIiwiUElYRUxTIiwidXBsb2FkRGVuc2VNYXRyaXhUb1RleHR1cmUiLCJwcmV2ZW50RWFnZXJVbnBhY2tpbmciLCJlbmNvZGVkT3V0cHV0VGFyZ2V0Iiwib3V0cHV0VGV4RGF0YSIsIm5ld1RleHR1cmUiLCJhY3F1aXJlVGV4dHVyZSIsImZsb2F0MzJWYWx1ZXMiLCJmbG9hdDMyVG9UeXBlZEFycmF5IiwidGV4VHlwZSIsIm1iIiwidG9GaXhlZCIsImlzQnJvd3NlciIsIndlYmdsIiwiZm9yY2VIYWxmRmxvYXQiLCJCYXRjaE5vcm1Qcm9ncmFtIiwibWVhblNoYXBlIiwidmFyaWFuY2VTaGFwZSIsIm9mZnNldFNoYXBlIiwic2NhbGVTaGFwZSIsIm9mZnNldFNuaXBwZXQiLCJzY2FsZVNuaXBwZXQiLCJCYXRjaE5vcm1QYWNrZWRQcm9ncmFtIiwiQ09NUExFWF9NVUxUSVBMWSIsIlJFQUwiLCJJTUFHIiwiQmluYXJ5T3BDb21wbGV4UHJvZ3JhbSIsIkNIRUNLX05BTl9TTklQUEVUIiwiU1FVQVJFRF9ESUZGRVJFTkNFIiwiQmluYXJ5T3BQcm9ncmFtIiwiZW5hYmxlU2hhcGVVbmlmb3JtcyIsIkVMVV9ERVIiLCJOT1RfRVFVQUwiLCJCaW5hcnlPcFBhY2tlZFByb2dyYW0iLCJjaGVja091dE9mQm91bmRzIiwic3VwcG9ydHNCcm9hZGNhc3RpbmciLCJjaGVja091dE9mQm91bmRzU3RyaW5nIiwiV0VCR0xfQVRUUklCVVRFUyIsImFudGlhbGlhcyIsInByZW11bHRpcGxpZWRBbHBoYSIsInByZXNlcnZlRHJhd2luZ0J1ZmZlciIsInN0ZW5jaWwiLCJmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0IiwiY2xlYXJXZWJHTENvbnRleHQiLCJzZXRXZWJHTENvbnRleHQiLCJnZXRXZWJHTENvbnRleHQiLCJuZXdDdHgiLCJPZmZzY3JlZW5DYW52YXMiLCJjcmVhdGVFbGVtZW50IiwiY3JlYXRlQ2FudmFzIiwiZXYiLCJwcmV2ZW50RGVmYXVsdCIsImdldFdlYkdMUmVuZGVyaW5nQ29udGV4dCIsImlzQ29udGV4dExvc3QiLCJkaXNhYmxlIiwiREVQVEhfVEVTVCIsIlNURU5DSUxfVEVTVCIsIkJMRU5EIiwiRElUSEVSIiwiUE9MWUdPTl9PRkZTRVRfRklMTCIsIlNBTVBMRV9DT1ZFUkFHRSIsImVuYWJsZSIsIlNDSVNTT1JfVEVTVCIsIkNVTExfRkFDRSIsImN1bGxGYWNlIiwiQkFDSyIsIkNsaXBQcm9ncmFtIiwiY3VzdG9tVW5pZm9ybXMiLCJDbGlwUGFja2VkUHJvZ3JhbSIsIkNvbXBsZXhBYnNQcm9ncmFtIiwiQ29uY2F0UHJvZ3JhbSIsIm9mZnNldHMiLCJsYXN0SW5kZXgiLCJsYXN0U2hpZnQiLCJDb25jYXRQYWNrZWRQcm9ncmFtIiwibGFzdENoYW5uZWxzIiwiYWxsQ2hhbm5lbHMiLCJnZXRWYWx1ZVNuaXBwZXQiLCJzaGlmdGVkQ2hhbm5lbHMiLCJjaGFubmVsSWR4IiwiQ29udjJERGVyRmlsdGVyUHJvZ3JhbSIsIkNvbnYyRERlcklucHV0UHJvZ3JhbSIsInJvd0RpbSIsImNvbERpbSIsImNoYW5uZWxEaW0iLCJDb252M0REZXJGaWx0ZXJQcm9ncmFtIiwiQ29udjNERGVySW5wdXRQcm9ncmFtIiwiRGVwdGh3aXNlQ29udjJERGVyRmlsdGVyUHJvZ3JhbSIsImNoYW5uZWxNdWwiLCJEZXB0aHdpc2VDb252MkREZXJJbnB1dFByb2dyYW0iLCJDb252MkRQcm9ncmFtIiwiYWRkQmlhcyIsImhhc1ByZWx1QWN0aXZhdGlvbldlaWdodHMiLCJoYXNMZWFreXJlbHVBbHBoYSIsImlucHV0RGVwdGhOZWFyZXN0VmVjNCIsImlucHV0RGVwdGhWZWM0UmVtYWluZGVyIiwiYWN0aXZhdGlvblNuaXBwZXQiLCJhcHBseUFjdGl2YXRpb25TbmlwcGV0IiwiYWRkQmlhc1NuaXBwZXQiLCJDb252M0RQcm9ncmFtIiwiRGVwdGh3aXNlQ29udjJEUHJvZ3JhbSIsImhhc1ByZWx1QWN0aXZhdGlvbiIsImhhc0xlYWt5UmVsdUFscGhhIiwieE51bVJvd3MiLCJ4TnVtQ29scyIsIkRlcHRod2lzZUNvbnZQYWNrZWQyRFByb2dyYW0iLCJ0ZXhlbHNBY3Jvc3MiLCJtYWluTG9vcCIsInRleGVsQyIsImNvbEluZGV4IiwibmV4dFRleGVsT2Zmc2V0IiwibmVhcmVzdExhcmdlckV2ZW4iLCJDcm9wQW5kUmVzaXplUHJvZ3JhbSIsImltYWdlU2hhcGUiLCJib3hTaGFwZSIsIm1ldGhvZElkIiwiaW5wdXRIZWlnaHRGbG9hdCIsImlucHV0V2lkdGhGbG9hdCIsImhlaWdodFJhdGlvIiwid2lkdGhSYXRpbyIsIkN1bVN1bVByb2dyYW0iLCJnZXRDb29yZHMiLCJpZHhTdHJpbmciLCJnZXRGaW5hbENvb3JkIiwiRGVjb2RlTWF0cml4UHJvZ3JhbSIsImdsc2wiLCJEZWNvZGVNYXRyaXhQYWNrZWRQcm9ncmFtIiwiRGVwdGhUb1NwYWNlUHJvZ3JhbSIsImdldEhlaWdodENvb3JkU3RyaW5nIiwiZ2V0V2lkdGhDb29yZFN0cmluZyIsImdldERlcHRoQ29vcmRTdHJpbmciLCJnZXRPdXRwdXREZXB0aFNpemUiLCJnZXRJbnB1dFNhbXBsaW5nU3RyaW5nIiwiRGlhZ1Byb2dyYW0iLCJEaWxhdGlvbjJEUHJvZ3JhbSIsIkVuY29kZUZsb2F0UHJvZ3JhbSIsIkRPV05MT0FEIiwiRW5jb2RlRmxvYXRQYWNrZWRQcm9ncmFtIiwiRW5jb2RlTWF0cml4UHJvZ3JhbSIsImlucHV0SXNVbnNpZ25lZEJ5dGUiLCJ0ZXh0dXJlMkQiLCJFbmNvZGVNYXRyaXhQYWNrZWRQcm9ncmFtIiwiRkZUUHJvZ3JhbSIsImNvbXBvbmVudCIsImV4cG9uZW50TXVsdGlwbGllclNuaXBwZXQiLCJQSSIsInJlc3VsdERlbm9taW5hdG9yIiwib3BTdHJpbmciLCJGaWxsUHJvZ3JhbSIsImlzTW9iaWxlIiwiRmxpcExlZnRSaWdodFByb2dyYW0iLCJHYXRoZXJQcm9ncmFtIiwic291cmNlQ29vcmRzIiwiY3VycmVudENvb3JkcyIsImdldFNvdXJjZUNvb3JkcyIsIkdhdGhlck5EUHJvZ3JhbSIsInNsaWNlRGltIiwic3RyaWRlc1R5cGUiLCJzdHJpZGVTdHJpbmciLCJnZXRHbHNsRGlmZmVyZW5jZXMiLCJhdHRyaWJ1dGUiLCJ2YXJ5aW5nVnMiLCJ2YXJ5aW5nRnMiLCJkZWZpbmVPdXRwdXQiLCJkZWZpbmVTcGVjaWFsTmFOIiwiZGVmaW5lU3BlY2lhbEluZiIsImRlZmluZVJvdW5kIiwiR1BHUFVDb250ZXh0Iiwib3V0cHV0VGV4dHVyZSIsInZlcnRleEF0dHJzQXJlQm91bmQiLCJpdGVtc1RvUG9sbCIsImdsVmVyc2lvbiIsIkNPTE9SX0JVRkZFUl9GTE9BVCIsIkNPTE9SX0JVRkZFUl9IQUxGX0ZMT0FUIiwiVEVYVFVSRV9GTE9BVCIsIlRFWFRVUkVfSEFMRl9GTE9BVCIsInRleHR1cmVGbG9hdEV4dGVuc2lvbiIsInRleHR1cmVIYWxmRmxvYXRFeHRlbnNpb24iLCJjb2xvckJ1ZmZlckZsb2F0RXh0ZW5zaW9uIiwiY29sb3JCdWZmZXJIYWxmRmxvYXRFeHRlbnNpb24iLCJ2ZXJ0ZXhCdWZmZXIiLCJpbmRleEJ1ZmZlciIsImZyYW1lYnVmZmVyIiwidGV4dHVyZUNvbmZpZyIsImZpbmlzaCIsImJpbmRGcmFtZWJ1ZmZlciIsIkZSQU1FQlVGRkVSIiwiZGVsZXRlRnJhbWVidWZmZXIiLCJiaW5kQnVmZmVyIiwiQVJSQVlfQlVGRkVSIiwiRUxFTUVOVF9BUlJBWV9CVUZGRVIiLCJjcmVhdGVGbG9hdDMyTWF0cml4VGV4dHVyZSIsInJvd3MiLCJjb2x1bW5zIiwidGhyb3dJZkRpc3Bvc2VkIiwiY3JlYXRlRmxvYXQxNk1hdHJpeFRleHR1cmUiLCJjcmVhdGVVbnNpZ25lZEJ5dGVzTWF0cml4VGV4dHVyZSIsInVwbG9hZFBpeGVsRGF0YVRvVGV4dHVyZSIsInBpeGVscyIsImNyZWF0ZUZsb2F0MTZQYWNrZWRNYXRyaXhUZXh0dXJlIiwiY3JlYXRlUGFja2VkTWF0cml4VGV4dHVyZSIsImRlbGV0ZU1hdHJpeFRleHR1cmUiLCJkZWxldGVUZXh0dXJlIiwiZG93bmxvYWRNYXRyaXhEcml2ZXIiLCJkb3dubG9hZFBhY2tlZE1hdHJpeEZyb21CdWZmZXIiLCJwaHlzaWNhbFJvd3MiLCJwaHlzaWNhbENvbHMiLCJiaW5kVGV4dHVyZVRvRnJhbWVCdWZmZXIiLCJ1bmJpbmRUZXh0dXJlVG9GcmFtZUJ1ZmZlciIsImZlbmNlQ29udGV4dCIsImNyZWF0ZUZlbmNlIiwicG9sbEZlbmNlIiwiaXNGZW5jZVBhc3NlZCIsImdsMiIsImZlbmNlU3luYyIsIlNZTkNfR1BVX0NPTU1BTkRTX0NPTVBMRVRFIiwiY2xpZW50V2FpdFN5bmMiLCJBTFJFQURZX1NJR05BTEVEIiwiQ09ORElUSU9OX1NBVElTRklFRCIsImlzUXVlcnlBdmFpbGFibGUiLCJjcmVhdGVQcm9ncmFtIiwiZnJhZ21lbnRTaGFkZXJTb3VyY2UiLCJmcmFnbWVudFNoYWRlciIsInZlcnRleFNoYWRlciIsImF0dGFjaFNoYWRlciIsImRlYnVnIiwic2V0UHJvZ3JhbSIsInVzZVByb2dyYW0iLCJ1bmlmb3JtTmFtZSIsInNob3VsZFRocm93IiwiZ2V0QXR0cmlidXRlTG9jYXRpb24iLCJnZXRBdHRyaWJMb2NhdGlvbiIsImdldFVuaWZvcm1Mb2NhdGlvbk5vVGhyb3ciLCJzZXRJbnB1dE1hdHJpeFRleHR1cmUiLCJpbnB1dE1hdHJpeFRleHR1cmUiLCJ1bmlmb3JtTG9jYXRpb24iLCJ0ZXh0dXJlVW5pdCIsInRocm93SWZOb1Byb2dyYW0iLCJzZXRPdXRwdXRNYXRyaXhUZXh0dXJlIiwib3V0cHV0TWF0cml4VGV4dHVyZSIsInNldE91dHB1dE1hdHJpeFRleHR1cmVEcml2ZXIiLCJzZXRPdXRwdXRQYWNrZWRNYXRyaXhUZXh0dXJlIiwib3V0cHV0UGFja2VkTWF0cml4VGV4dHVyZSIsInNldE91dHB1dE1hdHJpeFdyaXRlUmVnaW9uIiwic3RhcnRSb3ciLCJzdGFydENvbHVtbiIsIm51bUNvbHVtbnMiLCJzZXRPdXRwdXRNYXRyaXhXcml0ZVJlZ2lvbkRyaXZlciIsInNldE91dHB1dFBhY2tlZE1hdHJpeFdyaXRlUmVnaW9uIiwiZGVidWdWYWxpZGF0ZSIsImV4ZWN1dGVQcm9ncmFtIiwiZHJhd0VsZW1lbnRzIiwiVFJJQU5HTEVTIiwiVU5TSUdORURfU0hPUlQiLCJibG9ja1VudGlsQWxsUHJvZ3JhbXNDb21wbGV0ZWQiLCJnZXRRdWVyeVRpbWVyRXh0ZW5zaW9uIiwiZGlzam9pbnRRdWVyeVRpbWVyRXh0ZW5zaW9uIiwiZ2V0UXVlcnlUaW1lckV4dGVuc2lvbldlYkdMMiIsImdldFF1ZXJ5VGltZXJFeHRlbnNpb25XZWJHTDEiLCJjcmVhdGVRdWVyeSIsIlRJTUVfRUxBUFNFRF9FWFQiLCJjcmVhdGVRdWVyeUVYVCIsImJlZ2luUXVlcnlFWFQiLCJlbmRRdWVyeUVYVCIsInJlcGVhdGVkVHJ5IiwicXVlcnlUaW1lclZlcnNpb24iLCJnZXRRdWVyeVBhcmFtZXRlciIsIlFVRVJZX1JFU1VMVCIsImdldFF1ZXJ5T2JqZWN0RVhUIiwiUVVFUllfUkVTVUxUX0VYVCIsImF2YWlsYWJsZSIsIlFVRVJZX1JFU1VMVF9BVkFJTEFCTEUiLCJkaXNqb2ludCIsIkdQVV9ESVNKT0lOVF9FWFQiLCJRVUVSWV9SRVNVTFRfQVZBSUxBQkxFX0VYVCIsImFkZEl0ZW1Ub1BvbGwiLCJwb2xsSXRlbXMiLCJsaW5lYXJTZWFyY2hMYXN0VHJ1ZSIsImlzRG9uZUZuIiwicmVzb2x2ZUZuIiwiZG93bmxvYWRBbmREZWNvZGUiLCJvdXRwdXRNYXRyaXhUZXh0dXJlTWF5YmVQYWNrZWQiLCJzY2lzc29yIiwiY29tcGlsZVByb2dyYW0iLCJpbnB1dEluZm9zIiwibG9naWNhbFNoYXBlIiwiaW5TaGFwZUluZm9zIiwib3V0U2hhcGVJbmZvIiwiaW5mTG9jIiwibmFuTG9jIiwidW5pZm9ybUxvY2F0aW9ucyIsImluU2hhcGVzTG9jYXRpb25zIiwiaW5UZXhTaGFwZXNMb2NhdGlvbnMiLCJ2YXJOYW1lIiwib3V0U2hhcGVMb2NhdGlvbiIsIm91dFRleFNoYXBlTG9jYXRpb24iLCJvdXRTaGFwZVN0cmlkZXNMb2NhdGlvbiIsImN1c3RvbVVuaWZvcm1Mb2NhdGlvbnMiLCJ2YWxpZGF0ZUJpbmFyeUFuZFByb2dyYW0iLCJzaGFwZUluZm9zIiwic2hhcGVBIiwic2hhcGVCIiwidGV4U2hhcGVBIiwidGV4U2hhcGVCIiwicnVuUHJvZ3JhbSIsIm91dFRleCIsIm91dFRleFNoYXBlIiwidW5pZm9ybTFmIiwidmFyTG9jIiwidmFyT2Zmc2V0TG9jIiwidmFyU2hhcGVMb2MiLCJ2YXJUZXhTaGFwZUxvYyIsInVuaWZvcm1TaGFwZSIsInVuaWZvcm0xaXYiLCJ1bmlmb3JtMml2IiwidW5pZm9ybTNpdiIsInVuaWZvcm00aXYiLCJ1bmlmb3JtMmkiLCJ1bmlmb3JtMWZ2IiwidW5pZm9ybTFpIiwib3V0U2hhcGVMb2MiLCJjdXN0b21Mb2MiLCJjdXN0b21WYWx1ZSIsInVuaWZvcm0yZnYiLCJ1bmlmb3JtM2Z2IiwidW5pZm9ybTRmdiIsIm1ha2VTaGFkZXJLZXkiLCJrZXlJbnB1dHMiLCJoYXNPZmZzZXQiLCJ4VGV4U2hhcGUiLCJ1c2VTcXVlZXplU2hhcGUiLCJyYW5rMSIsInJhbmsyIiwicmFuazM0IiwicGFja2VkVGV4U2hhcGUiLCJpc0xvZ2ljYWxTaGFwVGV4U2hhcGVFcXVhbCIsImlzU2NhbGFyIiwiYnJvYWRjYXN0RGltcyIsImlzSW5PdXRUZXhTaGFwZUVxdWFsIiwiaXNUZXhTaGFwZUdyZWF0ZXJUaGFuT25lIiwia2V5VXNlckNvZGUiLCJ1c2VTaGFwZVVuaWZvcm1zIiwiY3JlYXRlVmVydGV4U2hhZGVyIiwidmVydGV4U2hhZGVyU291cmNlIiwiY3JlYXRlVmVydGV4QnVmZmVyIiwidmVydGV4QXJyYXkiLCJjcmVhdGVJbmRleEJ1ZmZlciIsInRyaWFuZ2xlVmVydGV4SW5kaWNlcyIsImNyZWF0ZUFuZENvbmZpZ3VyZVRleHR1cmUiLCJpbnRlcm5hbEZvcm1hdCIsInRleHR1cmVGb3JtYXQiLCJ0ZXh0dXJlVHlwZSIsInRleDJkIiwiVEVYVFVSRV8yRCIsImJpbmRUZXh0dXJlIiwidGV4UGFyYW1ldGVyaSIsIlRFWFRVUkVfV1JBUF9TIiwiQ0xBTVBfVE9fRURHRSIsIlRFWFRVUkVfV1JBUF9UIiwiVEVYVFVSRV9NSU5fRklMVEVSIiwiTkVBUkVTVCIsIlRFWFRVUkVfTUFHX0ZJTFRFUiIsInRleEltYWdlMkQiLCJnZXRJbnRlcm5hbEZvcm1hdEZvckZsb2F0MzJNYXRyaXhUZXh0dXJlIiwiaW50ZXJuYWxGb3JtYXRGbG9hdCIsInRleHR1cmVGb3JtYXRGbG9hdCIsIkZMT0FUIiwiZ2V0SW50ZXJuYWxGb3JtYXRGb3JGbG9hdDE2TWF0cml4VGV4dHVyZSIsImludGVybmFsRm9ybWF0SGFsZkZsb2F0IiwidGV4dHVyZVR5cGVIYWxmRmxvYXQiLCJnZXRJbnRlcm5hbEZvcm1hdEZvclVuc2lnbmVkQnl0ZXNNYXRyaXhUZXh0dXJlIiwiZG93bmxvYWRUZXh0dXJlRm9ybWF0IiwiUkdCQSIsIlVOU0lHTkVEX0JZVEUiLCJnZXRJbnRlcm5hbEZvcm1hdEZvclBhY2tlZE1hdHJpeFRleHR1cmUiLCJpbnRlcm5hbEZvcm1hdFBhY2tlZEZsb2F0IiwiZ2V0SW50ZXJuYWxGb3JtYXRGb3JGbG9hdDE2UGFja2VkTWF0cml4VGV4dHVyZSIsImludGVybmFsRm9ybWF0UGFja2VkSGFsZkZsb2F0IiwiYmluZFZlcnRleFByb2dyYW1BdHRyaWJ1dGVTdHJlYW1zIiwiZGF0YUZvclVwbG9hZCIsInRleGVsRGF0YVR5cGUiLCJjcmVhdGVCdWZmZXJGcm9tT3V0cHV0VGV4dHVyZSIsImNyZWF0ZUJ1ZmZlciIsIlBJWEVMX1BBQ0tfQlVGRkVSIiwiYnVmZmVyU2l6ZUJ5dGVzIiwiYnl0ZXNQZXJGbG9hdCIsImJ1ZmZlckRhdGEiLCJTVFJFQU1fUkVBRCIsInJlYWRQaXhlbHMiLCJkb3dubG9hZFRhcmdldCIsImdldEJ1ZmZlclN1YkRhdGEiLCJjb2xzIiwiZG93bmxvYWRNYXRyaXhGcm9tUGFja2VkT3V0cHV0VGV4dHVyZSIsInBhY2tlZFJHQkEiLCJJbTJDb2xQYWNrZWRQcm9ncmFtIiwiaXRlbXNQZXJCbG9ja1JvdyIsInVucm9sbGVkIiwiYXJnUmVkdWNlIiwicmVkdWNlVHlwZSIsImJlc3RJbmRpY2VzQSIsImNvbXB1dGVPcHRpbWFsV2luZG93U2l6ZSIsImFyZ1JlZHVjZVBhY2tlZCIsImFyZ01pbk1heFJlZHVjZSIsImEyRCIsInJlZHVjZWQiLCJpbnQiLCJDSEVDS19OQU5fU05JUFBFVF9VTkFSWSIsIkNIRUNLX05BTl9TTklQUEVUX0JJTkFSWSIsIkNIRUNLX05BTl9TTklQUEVUX0JJTkFSWV9QQUNLRUQiLCJvcFNuaXBwZXQiLCJwYWNrZWRPcFNuaXBwZXQiLCJjcHVLZXJuZWxJbXBsIiwid2ViZ2xCYWNrZW5kIiwic3VwcG9ydHNDb21wbGV4IiwiYURhdGEiLCJiRGF0YSIsImNvbXBsZXhQYXJ0cyIsImFQYXJ0IiwiYlBhcnQiLCJhSGFuZGxlIiwiYkhhbmRsZSIsImNvbXBsZXhPdXRwdXQiLCJtYXBBY3RpdmF0aW9uVG9TaGFkZXJQcm9ncmFtIiwicGFja2VkIiwicmVkdWN0aW9uVHlwZSIsInJlZHVjdGlvblN0YWdlcyIsInN0YWdlcyIsImdldFJlZHVjdGlvblN0YWdlcyIsInByZXZpb3VzUmVzdWx0IiwiYWRkSW1wbENQVSIsImJpbmNvdW50SW1wbENQVSIsImJpbmNvdW50UmVkdWNlSW1wbENQVSIsImNlaWxJbXBsQ1BVIiwiY29uY2F0SW1wbENQVSIsImVxdWFsSW1wbENQVSIsImV4cEltcGxDUFUiLCJleHBtMUltcGxDUFUiLCJmbG9vckltcGxDUFUiLCJnYXRoZXJOZEltcGxDUFUiLCJnYXRoZXJWMkltcGxDUFUiLCJncmVhdGVySW1wbENQVSIsImdyZWF0ZXJFcXVhbEltcGxDUFUiLCJsZXNzSW1wbENQVSIsImxlc3NFcXVhbEltcGxDUFUiLCJsaW5TcGFjZUltcGxDUFUiLCJsb2dJbXBsQ1BVIiwibWF4SW1wbENQVSIsIm1heGltdW1JbXBsQ1BVIiwibWluaW11bUltcGxDUFUiLCJtdWx0aXBseUltcGxDUFUiLCJuZWdJbXBsQ1BVIiwibm90RXF1YWxJbXBsQ1BVIiwicHJvZEltcGxDUFUiLCJyYW5nZUltcGxDUFUiLCJyc3FydEltcGxDUFUiLCJzaW1wbGVBYnNJbXBsQ1BVIiwic2xpY2VJbXBsQ1BVIiwic3BhcnNlRmlsbEVtcHR5Um93c0ltcGxDUFUiLCJzcGFyc2VSZXNoYXBlSW1wbENQVSIsInNwYXJzZVNlZ21lbnRSZWR1Y3Rpb25JbXBsQ1BVIiwic3RyaWRlZFNsaWNlSW1wbENQVSIsInN0cmluZ05HcmFtc0ltcGxDUFUiLCJzdHJpbmdTcGxpdEltcGxDUFUiLCJzdHJpbmdUb0hhc2hCdWNrZXRGYXN0SW1wbENQVSIsInN1YkltcGxDUFUiLCJ0aWxlSW1wbENQVSIsInRvcEtJbXBsQ1BVIiwidHJhbnNwb3NlSW1wbENQVSIsInVuaXF1ZUltcGxDUFUiLCJBQlMiLCJBQ09TIiwiQUNPU0giLCJBREQiLCJhZGRLZXJuZWxGdW5jIiwibWlkSW5kZXgiLCJsZWZ0U2lkZSIsInJpZ2h0U2lkZSIsIkFTSU4iLCJBU0lOSCIsIkFUQU4iLCJBVEFOMiIsIkFUQU4yX1BBQ0tFRCIsIkFUQU5IIiwiYXZnUG9vbFByb2dyYW0iLCJhdmdQb29sQmFja3Byb3BQcm9ncmFtIiwiYXZnUG9vbEdyYWQzRENvbmZpZyIsIk1BVE1VTF9TSEFSRURfRElNX1RIUkVTSE9MRCIsImJhdGNoTWF0TXVsSW1wbCIsImhhc0JpYXMiLCJhVmVjIiwiYlZlYyIsInNob3VsZFJlc2hhcGVCIiwiYVZlYzNkIiwiYlZlYzNkIiwiJGxlYWt5cmVsdUFscGhhIiwib3V0UmVzaGFwZWQiLCJmaW5hbElucHV0cyIsInJlc2hhcGVkSW50ZXJtZWRpYXRlIiwidHJhbnNwb3NlZEludGVybWVkaWF0ZSIsInJlc2hhcGVkSW50ZXJtZWRpYXRlMiIsInplcm9zVGVuc29yIiwiYmluYXJ5SW5wdXRzIiwiQ0VJTCIsImNsaXBCeVZhbHVlIiwiY3VzdG9tVmFsdWVzIiwicmVhbFRlbnNvckluZm8iLCJpbWFnVGVuc29ySW5mbyIsIm1ha2VDb21wbGV4Q29tcG9uZW50VGVuc29ySW5mbyIsImNvbXBsZXhUZW5zb3IiLCJjb21wbGV4UGFydCIsInByb2dyYW1JbnB1dHMiLCJydW5PbkNwdSIsInRlbnNvcnMyRCIsImNvbXB1dGVUZW5zb3JzMkQiLCJjb252MmQiLCJjb252MmRCeU1hdE11bCIsInhUZXhEYXRhIiwic2hhcmVkTWF0TXVsRGltIiwib3V0ZXJTaGFwZVgiLCJvdXRlclNoYXBlRmlsdGVyIiwiYmF0Y2hNYXRNdWxXaWxsQmVVbnBhY2tlZCIsInJlc2hhcGVXaWxsQmVFeHBlbnNpdmUiLCJvcmlnaW5hbFhUZXhEYXRhU2hhcGUiLCJmaWx0ZXJSZXNoYXBlZCIsInBvaW50d2lzZUNvbnYiLCJwb2ludHdpc2VDb252VGV4RGF0YSIsImNvbnYyZFdpdGhJbTJSb3ciLCJ4MkNvbFNoYXBlIiwieFNxdWVlemVkIiwidzJSb3ciLCJpbTJDb2xQcm9ncmFtIiwiaW0yQ29sIiwiaW0yQ29sUmVzaGFwZWQiLCJtYXRtdWxQcm9ncmFtIiwiY29udjNEQmFja3Byb3BJbnB1dCIsImNvbnYzREJhY2twcm9wSW5wdXRDb25maWciLCJDT1MiLCJsb2cyIiwicHJldlJlc3VsdCIsImZsYXQiLCJkaWxhdGlvbjJEIiwiZGlsYXRpb24yRENvbmZpZyIsIkVSRiIsIkVYUCIsIkVYUE0xIiwicmVhbFByb2dyYW0iLCJpbWFnUHJvZ3JhbSIsImNvbXBsZXhPdXRwdXRSZXNoYXBlZCIsIkZMT09SIiwiZnJvbVBpeGVsc0NvbmZpZyIsImlzVmlkZW8iLCJIVE1MVmlkZW9FbGVtZW50IiwiaXNJbWFnZSIsIkhUTUxJbWFnZUVsZW1lbnQiLCJ2aWRlb1dpZHRoIiwidmlkZW9IZWlnaHQiLCJmcm9tUGl4ZWxzMkRDb250ZXh0IiwiZHJhd0ltYWdlIiwidGVtcFBpeGVsSGFuZGxlIiwiRnJvbVBpeGVsc1Byb2dyYW0iLCJGcm9tUGl4ZWxzUGFja2VkUHJvZ3JhbSIsImZ1c2VkQ29udjJkIiwic2hvdWxkUGFja0RlcHRod2lzZUNvbnYiLCJmbGF0dGVuSW5kaWNlcyIsIm91dFZhbHVlIiwiaW5wdXREYXRhIiwibHJuIiwiTFJOQ29uZmlnIiwibHJuR3JhZCIsIkxSTkdyYWRDb25maWciLCJMRUFLWVJFTFUiLCJMRUFLWVJFTFVfUEFDS0VEIiwiJGFscGhhIiwiTEVTU19FUVVBTCIsIkxFU1NfRVFVQUxfUEFDS0VEIiwibWF4SW5wdXRJc1RyYW5zcG9zZWQiLCJtYXhJbnB1dCIsIm1heElucHV0VmFsdWVzIiwibWF4UG9vbFByb2dyYW0iLCJtYXhQb29sM2QiLCJtYXhQb29sM2RQb3NpdGlvbnNQcm9ncmFtIiwibWF4UG9vbEJhY2twcm9wUHJvZ3JhbSIsIm1heFBvb2xHcmFkM0RDb25maWciLCJtYXhQb29sUG9zaXRpb25zUHJvZ3JhbSIsIm1heFBvb2xCYWNrUHJvcFByb2dyYW0iLCJwb29sT3V0cHV0IiwicmVzaGFwZWRJbnB1dCIsInJlc2hhcGVkT3V0cHV0IiwiTUFYSU1VTSIsIk1BWElNVU1fUEFDS0VEIiwibWVhbklucHV0SXNUcmFuc3Bvc2VkIiwibWVhbklucHV0IiwibWVhbklucHV0VmFsdWVzIiwibWVhbk91dFNoYXBlIiwibWVhbkltcGwiLCJNSU5JTVVNIiwiTUlOSU1VTV9QQUNLRUQiLCJtaXJyb3JQYWRLZXJuZWxGdW5jIiwiTU9EX1BBQ0tFRCIsInByb2JzIiwibnVtT3V0Y29tZXMiLCJNVUwiLCJORUciLCJQT1dfUEFDS0VEIiwiUFJFTFUiLCJQUkVMVV9QQUNLRUQiLCJvdXRwdXREVHlwZSIsInJlYWxEaXYiLCJSRUxVIiwiUkVMVTYiLCJTRUxVIiwiU0lOIiwibmV3VGV4RGF0YSIsImFzc2lnbiIsInNoYWxsb3dTbGljZSIsIm1heExvZ2l0c1Jlc2hhcGVkIiwic3VtRXhwUmVzaGFwZWQiLCJyZXNoYXBlZFBhZGRlZFgiLCJzcXVhcmUiLCJTVUIiLCJzdW1JbXBsIiwic3VtSW5wdXRJc1RyYW5zcG9zZWQiLCJzdW1JbnB1dCIsInN1bU91dFNoYXBlIiwib3V0VHlwZSIsImRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvT3JOdWxsIiwicm91bmRVcFRvUG93MiIsInBvdzIiLCJUT1BLX0xBU1RfRElNX0NQVV9IQU5ET0ZGX1NJWkVfVEhSRVNIT0xEIiwiVE9QS19LX0NQVV9IQU5ET0ZGX1RIUkVTSE9MRCIsInh0ZXhEYXRhIiwieElzUGFja2VkIiwieFVuUGFja2VkIiwieDJEIiwia1BvdzIiLCJsYXN0RGltUG93MiIsImdldElucHV0cyIsInJ1blN3YXAiLCJkaXIiLCJpbmMiLCJwcmV2SW5kaWNlcyIsIm1lcmdlUHJvZ3JhbSIsInByZXZWYWx1ZXMiLCJzZWdPcENvbXB1dGUiLCJzZWdPcFR5cGUiLCJzZWdPcENvbXB1dGVPcHRpbWFsV2luZG93U2l6ZSIsInNlZ09wSW5mbyIsInJhbmdlSW5mbyIsInRpbGVJbmZvIiwic2VnT3BSZXN1bHQiLCJMUk5Qcm9ncmFtIiwicmFkaXVzIiwicmFkIiwicG93T3BlcmF0b3IiLCJiYXNpcyIsIkxSTkdyYWRQcm9ncmFtIiwiTFJOUGFja2VkUHJvZ3JhbSIsIk1heFBvb2wyREJhY2twcm9wUHJvZ3JhbSIsIk1heFBvb2wzREJhY2twcm9wUHJvZ3JhbSIsIk1lYW5Qcm9ncmFtIiwid2luZG93U2l6ZU5lYXJlc3RWZWM0Iiwid2luZG93U2l6ZVZlYzRSZW1haW5kZXIiLCJ1cGRhdGVTbmlwcGV0IiwiZGVub21pbmF0b3IiLCJpc0ludCIsInRvUHJlY2lzaW9uIiwiTWlycm9yUGFkUHJvZ3JhbSIsInVucGFja2VkQ29vcmRzIiwiTWlycm9yUGFkUGFja2VkUHJvZ3JhbSIsImNMaW1pdCIsInBhZFNldHVwIiwiTWF0TXVsUGFja2VkUHJvZ3JhbSIsImhhc0xlYWt5cmVsdUFjdGl2YXRpb24iLCJzaGFyZWREaW1lbnNpb25QYWNrZWQiLCJhU2FtcGxlIiwiYlNhbXBsZSIsImFTd2l6emxlIiwiYlN3aXp6bGUiLCJiYXRjaEFTbmlwcGV0IiwiYmF0Y2hCU25pcHBldCIsIk11bHRpbm9taWFsUHJvZ3JhbSIsIk9uZUhvdFByb2dyYW0iLCJQYWNrUHJvZ3JhbSIsIm91dE9mQm91bmRzQ29uZGl0aW9uIiwiY29uZCIsImdldE91dE9mQm91bmRzQ29uZGl0aW9uIiwic2V0dXAiLCJnZXRTZXR1cCIsImNvb3JkIiwiZ2V0U291cmNlQ29vcmRzQXJyIiwiZ2V0T3V0cHV0IiwiZ2V0VmVjQ2hhbm5lbHMiLCJnZXRDaGFubmVscyIsIlBhZFByb2dyYW0iLCJQYWRQYWNrZWRQcm9ncmFtIiwiY29tcG9uZW50U2V0dXAiLCJwYWRkaW5nQXJlYSIsIlBvb2wyRFByb2dyYW0iLCJjb21wdXRlUG9zaXRpb25zIiwiaXNBdmdQb29sIiwiYmF0Y2hGbGF0dGVuUG9zaXRpb25TdHIiLCJmbGF0dGVuUG9zaXRpb25TdHIiLCJpbml0aWFsaXphdGlvblZhbHVlIiwiY29tcGFyZU9wIiwicmV0dXJuVmFsdWUiLCJmaWx0ZXJXaWR0aE5lYXJlc3RWZWM0IiwiZmlsdGVyV2lkdGhWZWM0UmVtYWluZGVyIiwiUG9vbDNEUHJvZ3JhbSIsIlJlZHVjZVByb2dyYW0iLCJ2ZWNUeXBlIiwiUmVzaGFwZVBhY2tlZFByb2dyYW0iLCJ0aGlzUkMiLCJSZXNpemVCaWxpbmVhckJhY2twcm9wUHJvZ3JhbSIsImR5U2hhcGUiLCJSZXNpemVCaWxpbmVhclByb2dyYW0iLCJlZmZlY3RpdmVJblNpemUiLCJlZmZlY3RpdmVPdXRTaXplIiwic291cmNlRnJhY0luZGV4UkMiLCJSZXNpemVCaWxpbmVhclBhY2tlZFByb2dyYW0iLCJSZXNpemVOZWFyZXN0TmVpZ2JvckJhY2twcm9wUHJvZ3JhbSIsIlJlc2l6ZU5lYXJlc3ROZWlnaGJvclByb2dyYW0iLCJyb3VuZEJhc2UiLCJSZXNpemVOZWFyZXN0TmVpZ2hib3JQYWNrZWRQcm9ncmFtIiwiUmV2ZXJzZVByb2dyYW0iLCJpbkNvb3JkcyIsImdldEluQ29vcmQiLCJSZXZlcnNlUGFja2VkUHJvZ3JhbSIsIm5leHRDb2x1bW4iLCJuZXh0Um93IiwiZ2V0Q2hhbm5lbCIsImluQ29vcmRzQXJyYXkiLCJjaGFubmVsczEiLCJnZXRSIiwiZ2V0RyIsImdldEIiLCJnZXRBIiwiUm90YXRlUHJvZ3JhbSIsImZpbGxTbmlwcGV0IiwiU2NhdHRlclByb2dyYW0iLCJ1cGRhdGVTaXplIiwiaW5kaWNlc1JhbmsiLCJ1cGRhdGVzUmFuayIsInN1bW1pbmdEdXBlSW5kZXgiLCJpbmRpY2VzU3RyaW5nIiwiaW5kaWNlc1NuaXBwZXQiLCJ1cGRhdGVzU3RyaW5nIiwidXBkYXRlc1NuaXBwZXQiLCJTZWdtZW50T3BQcm9ncmFtIiwiY2hlY2tWYWx1ZU91dE9mQm91bmRzIiwiY2hlY2tTZWdtZW50SWRPdXRPZkJvdW5kcyIsIlNlbGVjdFByb2dyYW0iLCJjQ29vcmRzIiwiYWJDb29yZHMiLCJjQ29vcmRWYXJzIiwiYWJDb29yZFZhcnMiLCJtYWtlU2hhZGVyIiwiaW5wdXRzSW5mbyIsInByZWZpeFNuaXBwZXRzIiwiZ2V0VW5pZm9ybUluZm9Gcm9tU2hhcGUiLCJhcnJheUluZGV4IiwiaW5wdXRQcmVmaXhTbmlwcGV0IiwiaW5wdXRTYW1wbGluZ1NuaXBwZXQiLCJpbkluZm8iLCJ1c2VzUGFja2VkVGV4dHVyZXMiLCJnZXRQYWNrZWRTYW1wbGVyRnJvbUluSW5mbyIsImdldFNhbXBsZXJGcm9tSW5JbmZvIiwiaW5wdXRJbmZvIiwidGV4TmFtZSIsInRleEZ1bmNTbmlwcGV0IiwiZnVuY05hbWUiLCJpblJhbmsiLCJnZXRDb29yZHNEYXRhVHlwZSIsInJhbmtEaWZmIiwiY29vcmRzU25pcHBldCIsImZpZWxkcyIsInVucGFja2VkQ29vcmRzU25pcHBldCIsImlzSW5wdXRTY2FsYXIiLCJpc091dHB1dFNjYWxhciIsImdldFBhY2tlZFNhbXBsZXJBdE91dHB1dENvb3JkcyIsImluVGV4U2hhcGUiLCJnZXRTYW1wbGVyQXRPdXRwdXRDb29yZHMiLCJnZXRJbnB1dFNhbXBsaW5nU25pcHBldCIsImZsb2F0VGV4dHVyZVNhbXBsZVNuaXBwZXQiLCJnZXRGbG9hdFRleHR1cmVTYW1wbGVTbmlwcGV0Iiwib3V0cHV0U2FtcGxpbmdTbmlwcGV0IiwiZmxvYXRUZXh0dXJlU2V0T3V0cHV0U25pcHBldCIsInNoYWRlclByZWZpeCIsIlNBTVBMRV8xRF9TTklQUEVUIiwiU0FNUExFXzJEX1NOSVBQRVQiLCJTQU1QTEVfM0RfU05JUFBFVCIsImdldFNoYWRlclByZWZpeCIsImdldE91dHB1dFNjYWxhckNvb3JkcyIsImdldE91dHB1dFBhY2tlZDFEQ29vcmRzIiwidGV4ZWxzSW5Mb2dpY2FsUm93IiwiZ2V0T3V0cHV0UGFja2VkMkRDb29yZHMiLCJ0ZXhlbHNJbkJhdGNoIiwiZ2V0T3V0cHV0UGFja2VkM0RDb29yZHMiLCJ0ZXhlbHNJbkJhdGNoTiIsImJhdGNoZXMiLCJnZXRPdXRwdXRQYWNrZWRORENvb3JkcyIsImdldFBhY2tlZE91dHB1dFNhbXBsaW5nU25pcHBldCIsImdldEZsb2F0VGV4dHVyZVNldFJHQkFTbmlwcGV0IiwiZ2V0T3V0cHV0MURDb29yZHMiLCJnZXRPdXRwdXQyRENvb3JkcyIsImNvb3Jkc0Zyb21JbmRleFNuaXBwZXQiLCJnZXRPdXRwdXQzRENvb3JkcyIsImdldE91dHB1dDREQ29vcmRzIiwiZ2V0T3V0cHV0NURDb29yZHMiLCJnZXRPdXRwdXQ2RENvb3JkcyIsImdldE91dHB1dFNhbXBsaW5nU25pcHBldCIsImdldEZsb2F0VGV4dHVyZVNldFJTbmlwcGV0IiwiU0hBREVSX1BBQ0tFRF9QUkVGSVgiLCJ0ZXhOdW1SIiwidGV4TnVtQyIsImdldEZsYXRPZmZzZXRVbmlmb3JtTmFtZSIsInROdW1SIiwidE51bUMiLCJnZXRTYW1wbGVyU2NhbGFyIiwiZ2V0VW5pZm9ybVNhbXBsZXIiLCJnZXRTYW1wbGVyMUQiLCJrZXB0RGltcyIsInNxdWVlemVTaGFwZSIsInNxdWVlemVkU2hhcGUiLCJzcXVlZXplSW5wdXRJbmZvIiwiZ2V0U3F1ZWV6ZWRQYXJhbXMiLCJnZXRTYW1wbGVyMkQiLCJzdHJpZGUwIiwic3RyaWRlMSIsImdldFNhbXBsZXIzRCIsInN0cmlkZTIiLCJzdHJpZGUyU3RyIiwic3RyaWRlMVN0ciIsInN0cmlkZTBTdHIiLCJnZXRTYW1wbGVyNEQiLCJzdHJpZGUzIiwiZ2V0U2FtcGxlcjVEIiwic3RyaWRlNCIsImdldFNhbXBsZXI2RCIsImdldFBhY2tlZFNhbXBsZXJTY2FsYXIiLCJnZXRQYWNrZWRTYW1wbGVyMUQiLCJ2YWx1ZXNQZXJSb3ciLCJnZXRQYWNrZWRTYW1wbGVyMkQiLCJnZXRQYWNrZWRTYW1wbGVyM0QiLCJnZXRQYWNrZWRTYW1wbGVyTkQiLCJ1c2VTcXVlZXplUGFja2VkU2hhcGUiLCJuZXdJbnB1dEluZm8iLCJKU09OIiwicGFyc2UiLCJzdHJpbmdpZnkiLCJnZXRMb2dpY2FsQ29vcmRpbmF0ZXNGcm9tRmxhdEluZGV4Iiwic3RyaWRlIiwiZ2V0TG9naWNhbENvb3JkaW5hdGVzRnJvbUZsYXRJbmRleEJ5VW5pZm9ybSIsImJ1aWxkVmVjIiwiZG90aWZ5Iiwic2xpY2VzIiwibmVhcmVzdFZlYzQiLCJuZWFyZXN0VmVjNFJlbWFpbmRlciIsInlTbGljZSIsImdldEZsYXRJbmRleEZyb20zRCIsIkVOQ09ERV9GTE9BVF9TTklQUEVUIiwiU2xpY2VQcm9ncmFtIiwiZGVzdFNpemUiLCJib2R5IiwiU2xpY2VQYWNrZWRQcm9ncmFtIiwic291cmNlTG9jIiwidXBwZXJSb3ciLCJsb3dlclJvdyIsIlN0cmlkZWRTbGljZVByb2dyYW0iLCJpbnB1dER0eXBlIiwibmV3Q29vcmRzIiwib3V0cHV0QXhpcyIsIlBhY2tpbmdTY2hlbWUiLCJUZXh0dXJlVXNhZ2UiLCJQaHlzaWNhbFRleHR1cmVUeXBlIiwiZ2V0VW5wYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodCIsImdldFVucGFja2VkQXJyYXlTaXplRnJvbU1hdHJpeFNpemUiLCJtYXRyaXhTaXplIiwiY2hhbm5lbHNQZXJUZXh0dXJlIiwiZ2V0Q29sb3JNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodCIsImdldERlbnNlVGV4U2hhcGUiLCJ0ZXhlbHNOZWVkZWQiLCJzaXplVG9TcXVhcmlzaFNoYXBlIiwiZ2V0TWF0cml4U2l6ZUZyb21VbnBhY2tlZEFycmF5U2l6ZSIsInVucGFja2VkU2l6ZSIsImRlY29kZU1hdHJpeEZyb21VbnBhY2tlZENvbG9yUkdCQUFycmF5IiwidW5wYWNrZWRBcnJheSIsIm1hdHJpeCIsInJlcXVpcmVkU2l6ZSIsImRzdCIsImdldFBhY2tlZE1hdHJpeFRleHR1cmVTaGFwZVdpZHRoSGVpZ2h0IiwiZ2V0UGFja2VkUkdCQUFycmF5U2l6ZUZyb21NYXRyaXhTaGFwZSIsImdldFRleHR1cmVDb25maWciLCJnbGFueSIsImRvd25sb2FkVW5wYWNrTnVtQ2hhbm5lbHMiLCJkZWZhdWx0TnVtQ2hhbm5lbHMiLCJ0ZXh0dXJlVHlwZUZsb2F0IiwiUjMyRiIsIlIxNkYiLCJSR0JBMTZGIiwiUkdCQTMyRiIsIlJFRCIsIkhBTEZfRkxPQVQiLCJIQUxGX0ZMT0FUX09FUyIsIlRleHR1cmVNYW5hZ2VyIiwibnVtVXNlZFRleHR1cmVzIiwibnVtRnJlZVRleHR1cmVzIiwiX251bUJ5dGVzQWxsb2NhdGVkIiwiX251bUJ5dGVzRnJlZSIsImZyZWVUZXh0dXJlcyIsImxvZ0VuYWJsZWQiLCJ1c2VkVGV4dHVyZXMiLCJzaGFwZVJDIiwicGh5c2ljYWxUZXhUeXBlIiwiZ2V0UGh5c2ljYWxGcm9tTG9naWNhbFRleHR1cmVUeXBlIiwic2hhcGVLZXkiLCJnZXRLZXlGcm9tVGV4dHVyZVNoYXBlIiwidGV4Qnl0ZXMiLCJQQUNLRURfMlgyX0ZMT0FUMzIiLCJQQUNLRURfMlgyX0ZMT0FUMTYiLCJVTlBBQ0tFRF9GTE9BVDMyIiwiVU5QQUNLRURfRkxPQVQxNiIsIlBBQ0tFRF80WDFfVU5TSUdORURfQllURSIsImxvZ2ljYWxUZXhUeXBlIiwiZGVsZXRlVGV4VGhyZXNob2xkIiwidGV4TGlzdCIsInRleEluZGV4IiwidG90YWwiLCJmcmVlUmF0aW8iLCJnZXROdW1Vc2VkVGV4dHVyZXMiLCJnZXROdW1GcmVlVGV4dHVyZXMiLCJ0ZXgiLCJpbnRlcm5hbEZvcm1hdEZvclBoeXNpY2FsVGV4VHlwZSIsInBhY2tlZFdpZHRoIiwicGFja2VkSGVpZ2h0IiwibnVtQnl0ZXNGb3JJbnRlcm5hbEZvcm1hdCIsIlJFTkRFUiIsImdldFBoeXNpY2FsVGV4dHVyZUZvclJlbmRlcmluZyIsInNoYXBlUm93c0NvbCIsIlRpbGVQcm9ncmFtIiwiU3dhcFByb2dyYW0iLCJNZXJnZVByb2dyYW0iLCJUcmFuc2Zvcm1Qcm9ncmFtIiwiVHJhbnNwb3NlUHJvZ3JhbSIsIm5ld0RpbSIsInN3aXRjaGVkIiwib3JpZ2luYWxPcmRlciIsInN3aXRjaGVkQ29vcmRzIiwiZ2V0U3dpdGNoZWRDb29yZHMiLCJUcmFuc3Bvc2VQYWNrZWRQcm9ncmFtIiwib3V0cHV0T3JkZXIiLCJzd2l0Y2hlZE9yZGVyIiwiZ2V0YyIsIlVuYXJ5T3BQcm9ncmFtIiwiTElORUFSIiwiU1RFUCIsIkVMVSIsIkNMT05FIiwiU0lHTU9JRCIsIlVuYXJ5T3BQYWNrZWRQcm9ncmFtIiwiVW5wYWNrUHJvZ3JhbSIsImNhbGxBbmRDaGVjayIsImdldEVycm9yIiwiTk9fRVJST1IiLCJnZXRXZWJHTEVycm9yTWVzc2FnZSIsImNoZWNrV2ViR0xFcnJvciIsImNhbkJlUmVwcmVzZW50ZWQiLCJJTlZBTElEX0VOVU0iLCJJTlZBTElEX1ZBTFVFIiwiSU5WQUxJRF9PUEVSQVRJT04iLCJJTlZBTElEX0ZSQU1FQlVGRkVSX09QRVJBVElPTiIsIk9VVF9PRl9NRU1PUlkiLCJDT05URVhUX0xPU1RfV0VCR0wiLCJnZXRFeHRlbnNpb25PclRocm93IiwiZXh0ZW5zaW9uTmFtZSIsInRocm93SWZOdWxsIiwiY3JlYXRlU2hhZGVyIiwiVkVSVEVYX1NIQURFUiIsInNoYWRlclNvdXJjZSIsImNvbXBpbGVTaGFkZXIiLCJnZXRTaGFkZXJQYXJhbWV0ZXIiLCJDT01QSUxFX1NUQVRVUyIsImdldFNoYWRlckluZm9Mb2ciLCJjcmVhdGVGcmFnbWVudFNoYWRlciIsIkZSQUdNRU5UX1NIQURFUiIsInNoYWRlckluZm9Mb2ciLCJsaW5lTnVtYmVyUmVnZXhSZXN1bHQiLCJsaW5lTnVtYmVyUmVnZXgiLCJleGVjIiwibGluZU51bWJlciIsInNoYWRlckxpbmVzIiwibGluZXNXaXRoTGluZU51bWJlcnMiLCJtYXhMaW5lTGVuZ3RoIiwiYmVmb3JlRXJyb3JMaW5lcyIsImVycm9yTGluZSIsImFmdGVyRXJyb3JMaW5lcyIsImxvZ1NoYWRlclNvdXJjZUFuZEluZm9Mb2ciLCJsaW5rUHJvZ3JhbSIsIkxJTktfU1RBVFVTIiwiZ2V0UHJvZ3JhbUluZm9Mb2ciLCJ2YWxpZGF0ZVByb2dyYW0iLCJWQUxJREFURV9TVEFUVVMiLCJjcmVhdGVTdGF0aWNWZXJ0ZXhCdWZmZXIiLCJTVEFUSUNfRFJBVyIsImNyZWF0ZVN0YXRpY0luZGV4QnVmZmVyIiwiZ2V0TnVtQ2hhbm5lbHMiLCJjcmVhdGVUZXh0dXJlIiwidmFsaWRhdGVUZXh0dXJlU2l6ZSIsIm1heFRleHR1cmVTaXplIiwiY3JlYXRlRnJhbWVidWZmZXIiLCJiaW5kVmVydGV4QnVmZmVyVG9Qcm9ncmFtQXR0cmlidXRlIiwiYXJyYXlFbnRyaWVzUGVySXRlbSIsIml0ZW1TdHJpZGVJbkJ5dGVzIiwiaXRlbU9mZnNldEluQnl0ZXMiLCJ2ZXJ0ZXhBdHRyaWJQb2ludGVyIiwiZW5hYmxlVmVydGV4QXR0cmliQXJyYXkiLCJiaW5kVGV4dHVyZVVuaXQiLCJ2YWxpZGF0ZVRleHR1cmVVbml0IiwiYWN0aXZlVGV4dHVyZSIsIlRFWFRVUkUwIiwidW5iaW5kVGV4dHVyZVVuaXQiLCJnZXRQcm9ncmFtVW5pZm9ybUxvY2F0aW9uT3JUaHJvdyIsImdldFByb2dyYW1Vbmlmb3JtTG9jYXRpb24iLCJiaW5kVGV4dHVyZVRvUHJvZ3JhbVVuaWZvcm1TYW1wbGVyIiwidW5pZm9ybVNhbXBsZXJMb2NhdGlvbiIsImJpbmRDYW52YXNUb0ZyYW1lYnVmZmVyIiwiYmluZENvbG9yVGV4dHVyZVRvRnJhbWVidWZmZXIiLCJmcmFtZWJ1ZmZlclRleHR1cmUyRCIsIkNPTE9SX0FUVEFDSE1FTlQwIiwidW5iaW5kQ29sb3JUZXh0dXJlRnJvbUZyYW1lYnVmZmVyIiwidmFsaWRhdGVGcmFtZWJ1ZmZlciIsImNoZWNrRnJhbWVidWZmZXJTdGF0dXMiLCJGUkFNRUJVRkZFUl9DT01QTEVURSIsImdldEZyYW1lYnVmZmVyRXJyb3JNZXNzYWdlIiwiRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5UIiwiRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NSVNTSU5HX0FUVEFDSE1FTlQiLCJGUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJTUVOU0lPTlMiLCJGUkFNRUJVRkZFUl9VTlNVUFBPUlRFRCIsInJldHVyblRPck51bGwiLCJmYWlsdXJlTWVzc2FnZSIsInRPck51bGwiLCJtYXhUZXh0dXJlVW5pdCIsIk1BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTIiwiZ2xUZXh0dXJlVW5pdCIsImdldEJhdGNoRGltIiwiZGltc1RvU2tpcCIsImdldFJvd3NDb2xzIiwiZ2V0U2hhcGVBczNEIiwiZ2V0VGV4dHVyZVNoYXBlRnJvbUxvZ2ljYWxTaGFwZSIsImxvZ1NoYXBlIiwibWF4VGV4U2l6ZSIsInNxdWVlemVSZXN1bHQiLCJpc0V2ZW4iLCJpc1Jlc2hhcGVGcmVlIiwic2hhcGUxIiwic2hhcGUyIiwic2hhcGUxQ29scyIsInNoYXBlMkNvbHMiLCJNQVhfVEVYVFVSRV9TSVpFIiwiTUFYX1RFWFRVUkVTX0lOX1NIQURFUiIsImdldFdlYkdMTWF4VGV4dHVyZVNpemUiLCJyZXNldE1heFRleHR1cmVTaXplIiwicmVzZXRNYXhUZXh0dXJlc0luU2hhZGVyIiwiZ2V0TWF4VGV4dHVyZXNJblNoYWRlciIsIk1BWF9URVhUVVJFX0lNQUdFX1VOSVRTIiwiZ2V0V2ViR0xEaXNqb2ludFF1ZXJ5VGltZXJWZXJzaW9uIiwiaGFzRXh0ZW5zaW9uIiwiaXNXZWJHTFZlcnNpb25FbmFibGVkIiwiaXNDYXBhYmxlT2ZSZW5kZXJpbmdUb0Zsb2F0VGV4dHVyZSIsImNyZWF0ZUZsb2F0VGV4dHVyZUFuZEJpbmRUb0ZyYW1lYnVmZmVyIiwiaXNEb3dubG9hZEZsb2F0VGV4dHVyZUVuYWJsZWQiLCJ0ZXhDb25maWciLCJmcmFtZUJ1ZmZlciIsImlzRnJhbWVCdWZmZXJDb21wbGV0ZSIsImNyZWF0ZUhhbGZGbG9hdFRleHR1cmVBbmRCaW5kVG9GcmFtZWJ1ZmZlciIsImlzV2ViR0xGZW5jZUVuYWJsZWQiLCJEYXRhU3RvcmFnZSIsImRhdGFNb3ZlciIsImRhdGFJZHNDb3VudCIsIm1vdmVEYXRhIiwiS2VybmVsQmFja2VuZCIsIm5vdFlldEltcGxlbWVudGVkIiwic3RyaW5ncyIsIkFSUk9XIiwiQVJST1dfUkVHRVgiLCJudW1UZW5zb3JzIiwibnVtQXJyb3dzIiwiaW5wdXRTdHJpbmciLCJvdXRwdXRTdHJpbmciLCJpbnB1dFRlcm1zIiwibnVtSW5wdXRzIiwiZGltTmFtZSIsImlucHV0VGVybSIsIlNldCIsIm51bURpbXMiLCJuRGltcyIsImRpbVNpemVzIiwiY29tcHV0ZWRUZXJtSW5kaWNlcyIsInRlcm1JbmRpY2VzIiwiZmluZFRlcm1zV2l0aERpbSIsInRlcm1JbmRleCIsIm5vbk1heFN1cHByZXNzaW9uSW1wbF8iLCJyZXR1cm5TY29yZXNUZW5zb3IiLCJyZXR1cm5WYWxpZE91dHB1dHMiLCJjYW5kaWRhdGVzIiwic2NvcmUiLCJib3hJbmRleCIsInN1cHByZXNzQmVnaW5JbmRleCIsImFzY2VuZGluZ0NvbXBhcmF0b3IiLCJjYW5kaWRhdGUiLCJvcmlnaW5hbFNjb3JlIiwiaWdub3JlQ2FuZGlkYXRlIiwiaW91IiwiaW50ZXJzZWN0aW9uT3ZlclVuaW9uIiwic3VwcHJlc3NXZWlnaHQiLCJlbGVtc1RvUGFkIiwiaUNvb3JkIiwiakNvb3JkIiwieW1pbkkiLCJ4bWluSSIsInltYXhJIiwieG1heEkiLCJ5bWluSiIsInhtaW5KIiwieW1heEoiLCJ4bWF4SiIsImFyZWFJIiwiYXJlYUoiLCJpbnRlcnNlY3Rpb25ZbWluIiwiaW50ZXJzZWN0aW9uWG1pbiIsImludGVyc2VjdGlvblltYXgiLCJpbnRlcnNlY3Rpb25YbWF4IiwiaW50ZXJzZWN0aW9uQXJlYSIsIndlaWdodCIsImMxIiwiYzIiLCJiaW5hcnlJbnNlcnQiLCJjb21wYXJhdG9yIiwiYmluYXJ5U2VhcmNoIiwiaW5zZXJ0aW9uUG9pbnQiLCJtaWRkbGUiLCJmb3VuZCIsImNvbXBhcmVSZXN1bHQiLCJiaW5hcnlTZWFyY2hfIiwiZGVmYXVsdENvbXBhcmF0b3IiLCJjb25kU2hhcGUiLCJpbkJ1ZmZlciIsInRvVGVuc29yIiwib3BIYW5kbGVyIiwiY2xvbmUiLCJkZWxheUNhbGxiYWNrIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwic2V0SW1tZWRpYXRlIiwibmV4dEZyYW1lIiwibmF2IiwidXNlckFnZW50IiwidmVuZG9yIiwib3BlcmEiLCJ0ZXN0IiwiV29ya2VyR2xvYmFsU2NvcGUiLCJpc1JlZ2lzdGVyZWRLZXJuZWxJbnZvY2F0aW9uIiwia2VybmVsSW52b2NhdGlvbiIsIkVuZ2luZVN0YXRlIiwicmVnaXN0ZXJlZFZhcmlhYmxlcyIsIm5leHRUYXBlTm9kZUlkIiwibnVtU3RyaW5nVGVuc29ycyIsIm51bURhdGFCdWZmZXJzIiwiZ3JhZGllbnREZXB0aCIsImtlcm5lbERlcHRoIiwic2NvcGVTdGFjayIsIm51bURhdGFNb3Zlc1N0YWNrIiwibmV4dFNjb3BlSWQiLCJwcm9maWxpbmciLCJhY3RpdmVQcm9maWxlIiwibmV3Qnl0ZXMiLCJuZXdUZW5zb3JzIiwicGVha0J5dGVzIiwia2VybmVscyIsInZhcmlhYmxlTmFtZSIsIkVuZ2luZSIsInJlZ2lzdHJ5IiwicmVnaXN0cnlGYWN0b3J5IiwicGVuZGluZ0JhY2tlbmRJbml0SWQiLCJzdGF0ZSIsInBlbmRpbmdCYWNrZW5kSW5pdCIsImJhY2tlbmRJbnN0YW5jZSIsInNvcnRlZEJhY2tlbmRzIiwiZ2V0U29ydGVkQmFja2VuZHMiLCJpbml0aWFsaXplQmFja2VuZCIsInN1Y2Nlc3MiLCJzZXRCYWNrZW5kIiwiYXN5bmNJbml0IiwiaW5pdGlhbGl6ZUJhY2tlbmRzQW5kUmV0dXJuQmVzdCIsImJhY2tlbmROYW1lcyIsImZpbmRCYWNrZW5kIiwiZmluZEJhY2tlbmRGYWN0b3J5IiwiZmFjdG9yeSIsInJlZ2lzdGVyQmFja2VuZCIsInByaW9yaXR5Iiwic2V0dXBSZWdpc3RlcmVkS2VybmVscyIsInByb2ZpbGVyIiwia2VybmVsIiwiZGlzcG9zZVJlZ2lzdGVyZWRLZXJuZWxzIiwiZGlzcG9zZUZ1bmMiLCJyZWdpc3RyeUZhY3RvcnlFbnRyeSIsInByb21pc2VJZCIsInJlbW92ZUJhY2tlbmQiLCJzcmNCYWNrZW5kIiwic2hvdWxkQ2hlY2tGb3JNZW1MZWFrcyIsInRpZHkiLCJuYW1lT3JGbiIsImZuIiwic2NvcGVkUnVuIiwic3RhcnRTY29wZSIsImVuZFNjb3BlIiwibmV4dFRlbnNvcklkIiwibmV4dFZhcmlhYmxlSWQiLCJFTkdJTkUiLCJydW5LZXJuZWwiLCJhZGRUYXBlTm9kZSIsImFjdGl2ZVNjb3BlIiwiZ3JhZElucHV0cyIsInJ1bktlcm5lbEZ1bmMiLCJjaGVja0tlcm5lbEZvck1lbUxlYWsiLCJudW1EYXRhSWRzQmVmb3JlIiwib3V0SW5mb3MiLCJudW1EYXRhSWRzQWZ0ZXIiLCJudW1PdXRwdXREYXRhSWRzIiwibnVtTW92ZXMiLCJkYXRhSWRzTGVha2VkIiwia2VybmVsUGFyYW1zIiwib3V0cHV0cyIsInNhdmVkIiwiaXNUYXBlT24iLCJzdGFydGluZ0J5dGVjb3VudCIsInN0YXJ0aW5nTnVtVGVuc29ycyIsImtlcm5lbE9yU2NvcGVOYW1lIiwib3V0VGVuc29ycyIsInRlbnNvcnNUb1NhdmUiLCJnZXRUZW5zb3JzRm9yR3JhZGllbnQiLCJzYXZlVGVuc29yc0ZvckJhY2t3YXJkTW9kZSIsImZvcndhcmRGdW5jIiwic2F2ZUZ1bmMiLCJrZWVwIiwiYmFja3dhcmRzRnVuYyIsImtlcm5lbFByb2ZpbGUiLCJwcm9maWxlS2VybmVsIiwibG9nS2VybmVsUHJvZmlsZSIsImJ5dGVzQWRkZWQiLCJ0b3RhbEJ5dGVzU25hcHNob3QiLCJ0ZW5zb3JzQWRkZWQiLCJ0b3RhbFRlbnNvcnNTbmFwc2hvdCIsImlucHV0U2hhcGVzIiwib3V0cHV0U2hhcGVzIiwiaXRlbSIsImtlcm5lbFRpbWVNcyIsInRpbWVNcyIsImV4dHJhSW5mbyIsImdyYWRDb25maWciLCJpbnB1dHNUb1NhdmUiLCJvdXRwdXRzVG9TYXZlIiwiaW5wdXRUZW5zb3JzVG9TYXZlIiwic2F2ZUFsbElucHV0cyIsImlucHV0TmFtZSIsIm91dHB1dFRlbnNvcnNUb1NhdmUiLCJtYWtlVGVuc29yIiwiYmFja2VuZFZhbHMiLCJ0cmFja1RlbnNvciIsImJ5dGVzIiwibWFrZVZhcmlhYmxlIiwidHJhaW5hYmxlIiwidHJhY2siLCJkaXNwb3NlVGVuc29yIiwiZGlzcG9zZVZhcmlhYmxlcyIsImRpc3Bvc2VWYXJpYWJsZSIsInN0YXJ0Qnl0ZXMiLCJzdGFydE51bVRlbnNvcnMiLCJncmFkaWVudHNGdW5jIiwidGFwZU5vZGUiLCJncmFkRnVuYyIsImdyYWRpZW50IiwiZHlzIiwiYWN0aXZlVGFwZSIsImtlcHQiLCJzdGFydFRhcGUiLCJlbmRUYXBlIiwic2NvcGVJbmZvIiwidGVuc29yc1RvVHJhY2tJblBhcmVudCIsInRlbnNvcnNUb1RyYWNrSW5QYXJlbnRTZXQiLCJvbGRTY29wZSIsInNjb3BlSWQiLCJ4cyIsImFsbG93Tm9HcmFkaWVudHMiLCJmaWx0ZXJlZFRhcGUiLCJhY2N1bXVsYXRlZEdyYWRpZW50TWFwIiwib25lcyIsImdyYWRzIiwiY3VzdG9tR3JhZCIsImlucHV0TWFwIiwic2F2ZSIsImdyYWRSZXMiLCJncmFkTWFwIiwiZ3JhZCIsInRpbWluZ0luZm8iLCJyZXNldCIsImdldE9yTWFrZUVuZ2luZSIsIl90ZmVuZ2luZSIsImVudmlyb25tZW50IiwiVEVOU09SRkxPV0pTX0ZMQUdTX1BSRUZJWCIsIkVudmlyb25tZW50IiwiZmxhZ3MiLCJmbGFnUmVnaXN0cnkiLCJ1cmxGbGFncyIsImdldFF1ZXJ5UGFyYW1zIiwicG9wdWxhdGVVUkxGbGFncyIsInNldFBsYXRmb3JtIiwicGxhdGZvcm1OYW1lIiwicGxhdGZvcm0iLCJmbGFnTmFtZSIsImV2YWx1YXRpb25GbiIsInNldEhvb2siLCJmbGFnVmFsdWUiLCJldmFsdWF0ZUZsYWciLCJnZXRGbGFncyIsInNldEZsYWdzIiwic2VhcmNoIiwidXJsUGFyYW1zIiwia2V5VmFsdWUiLCJ0b0xvd2VyQ2FzZSIsInBhcnNlVmFsdWUiLCJxdWVyeVN0cmluZyIsImRlY29kZVVSSUNvbXBvbmVudCIsImRlY29kZVBhcmFtIiwic2V0RW52aXJvbm1lbnRHbG9iYWwiLCJkZWJ1Z1ZhbHVlIiwiZ2xvYmFsTmFtZVNwYWNlIiwiZ2V0R2xvYmFsTmFtZXNwYWNlIiwiZ2V0R2xvYmFsIiwiZ2xvYmFsTWFwIiwiX3RmR2xvYmFscyIsIk1hcCIsImdldEdsb2JhbE1hcCIsInNpbmdsZXRvbiIsImVuYWJsZVByb2RNb2RlIiwiZW5hYmxlRGVidWdNb2RlIiwiZGlzYWJsZURlcHJlY2F0aW9uV2FybmluZ3MiLCJkZXByZWNhdGlvbldhcm4iLCJlbmdpbmUiLCJwcm9maWxlIiwiY29udGFpbmVyIiwiZ2V0QmFja2VuZCIsImNoZWNrR3JhZHMiLCIkYXJncyIsInZhbHVlQW5kR3JhZCIsInZhbHVlQW5kR3JhZHMiLCJ2YXJpYWJsZUdyYWRzIiwidmFyTGlzdCIsInNwZWNpZmllZFZhckxpc3QiLCJzcGVjaWZpZWROb25UcmFpbmFibGUiLCJvcmlnaW5hbFZhckNvdW50IiwiZyIsIm5hbWVkR3JhZHMiLCJMb25nIiwiaGV4VG9Mb25nIiwiaGV4IiwiZnJvbVN0cmluZyIsImsxIiwiazIiLCJzaGlmdE1peCIsInhvciIsInNocnUiLCJmcm9tQnl0ZXMiLCJmZXRjaDY0IiwiZmV0Y2gzMiIsInJvdGF0ZTY0Iiwib3IiLCJzaGwiLCJoYXNoTGVuMTYiLCJ3ZWFrSGFzaExlbjMyV2l0aFNlZWRzU3RyIiwid2Vha0hhc2hMZW4zMldpdGhTZWVkcyIsImZyb21OdW1iZXIiLCJoYXNoTGVuMHRvMTYiLCJoYXNoTGVuMTd0bzMyIiwiaGFzaExlbjMzdG82NCIsIlVaRVJPIiwibGFzdDY0IiwiYW5kIiwiZGVmZXIiLCJCcm93c2VyRG93bmxvYWRzIiwiZmlsZU5hbWVQcmVmaXgiLCJVUkxfU0NIRU1FIiwibW9kZWxKc29uRmlsZU5hbWUiLCJ3ZWlnaHREYXRhRmlsZU5hbWUiLCJtb2RlbEFydGlmYWN0cyIsIndlaWdodHNVUkwiLCJ3ZWlnaHREYXRhIiwibW9kZWxUb3BvbG9neSIsIkFycmF5QnVmZmVyIiwid2VpZ2h0c01hbmlmZXN0IiwicGF0aHMiLCJ3ZWlnaHRTcGVjcyIsIm1vZGVsSlNPTiIsIm1vZGVsSnNvblVSTCIsImpzb25BbmNob3IiLCJtb2RlbEpzb25BbmNob3IiLCJkb3dubG9hZCIsImRpc3BhdGNoRXZlbnQiLCJNb3VzZUV2ZW50Iiwid2VpZ2h0RGF0YUFuY2hvciIsIm1vZGVsQXJ0aWZhY3RzSW5mbyIsIkJyb3dzZXJGaWxlcyIsImZpbGVzIiwianNvbkZpbGUiLCJ3ZWlnaHRzRmlsZXMiLCJqc29uUmVhZGVyIiwiRmlsZVJlYWRlciIsIm1vZGVsQXJ0aWZhY3RzUHJvbWlzZSIsImxvYWRXZWlnaHRzIiwicmVhZEFzVGV4dCIsImVudHJ5IiwicGF0aFRvRmlsZSIsImNoZWNrTWFuaWZlc3RBbmRXZWlnaHRGaWxlcyIsInByb21pc2VzIiwibG9hZFdlaWdodHNGaWxlIiwid2VpZ2h0RmlsZVJlYWRlciIsInJlYWRBc0FycmF5QnVmZmVyIiwibWFuaWZlc3QiLCJiYXNlbmFtZXMiLCJmaWxlTmFtZXMiLCJncm91cCIsInBhdGhCYXNlbmFtZSIsImJyb3dzZXJEb3dubG9hZHNSb3V0ZXIiLCJicm93c2VyRG93bmxvYWRzIiwiYnJvd3NlckZpbGVzIiwicmVnaXN0ZXJTYXZlUm91dGVyIiwiSFRUUFJlcXVlc3QiLCJsb2FkT3B0aW9ucyIsIkRFRkFVTFRfTUVUSE9EIiwid2VpZ2h0UGF0aFByZWZpeCIsIm9uUHJvZ3Jlc3MiLCJ3ZWlnaHRVcmxDb252ZXJ0ZXIiLCJmZXRjaEZ1bmMiLCJyZXF1ZXN0SW5pdCIsIkZvcm1EYXRhIiwibW9kZWxUb3BvbG9neUFuZFdlaWdodE1hbmlmZXN0IiwiYXBwZW5kIiwib2siLCJyZXNwb25zZXMiLCJtb2RlbENvbmZpZ1JlcXVlc3QiLCJqc29uIiwid2VpZ2h0UGF0aCIsInN1ZmZpeCIsInBhcnNlVXJsIiwicGF0aFByZWZpeCIsImZldGNoVVJMcyIsInVybFByb21pc2VzIiwid2VpZ2h0c0dyb3VwIiwibGFzdFNsYXNoIiwibGFzdFNlYXJjaFBhcmFtIiwic3Vic3RyaW5nIiwiaXNIVFRQU2NoZW1lIiwibWF0Y2giLCJVUkxfU0NIRU1FX1JFR0VYIiwiaHR0cFJvdXRlciIsImlzSFRUUCIsInVybEl0ZW0iLCJodHRwIiwiYnJvd3NlckhUVFBSZXF1ZXN0IiwicmVnaXN0ZXJMb2FkUm91dGVyIiwiREFUQUJBU0VfTkFNRSIsIk1PREVMX1NUT1JFX05BTUUiLCJJTkZPX1NUT1JFX05BTUUiLCJkZWxldGVEYXRhYmFzZSIsImlkYkZhY3RvcnkiLCJnZXRJbmRleGVkREJGYWN0b3J5IiwiZGVsZXRlUmVxdWVzdCIsIm9uc3VjY2VzcyIsInRoZVdpbmRvdyIsImluZGV4ZWREQiIsIm1vekluZGV4ZWREQiIsIndlYmtpdEluZGV4ZWREQiIsIm1zSW5kZXhlZERCIiwic2hpbUluZGV4ZWREQiIsInNldFVwRGF0YWJhc2UiLCJvcGVuUmVxdWVzdCIsImRiIiwiY3JlYXRlT2JqZWN0U3RvcmUiLCJrZXlQYXRoIiwiQnJvd3NlckluZGV4ZWREQiIsIm1vZGVsUGF0aCIsImRhdGFiYXNlQWN0aW9uIiwib251cGdyYWRlbmVlZGVkIiwibW9kZWxUeCIsInRyYW5zYWN0aW9uIiwiZ2V0UmVxdWVzdCIsIm9iamVjdFN0b3JlIiwiY2xvc2UiLCJvbmNvbXBsZXRlIiwiaW5mb1R4IiwiaW5mb1N0b3JlIiwicHV0SW5mb1JlcXVlc3QiLCJwdXQiLCJwdXRNb2RlbFJlcXVlc3QiLCJkZWxldGVJbmZvUmVxdWVzdCIsImluZGV4ZWREQlJvdXRlciIsImJyb3dzZXJJbmRleGVkREIiLCJCcm93c2VySW5kZXhlZERCTWFuYWdlciIsInR4IiwiZ2V0QWxsSW5mb1JlcXVlc3QiLCJnZXRBbGwiLCJnZXRJbmZvUmVxdWVzdCIsImRlbGV0ZU1vZGVsRGF0YSIsImRlbGV0ZU1vZGVsUmVxdWVzdCIsImVuY29kZVdlaWdodHMiLCJzcGVjcyIsImRhdGFQcm9taXNlcyIsIm5hbWVzIiwic3BlYyIsInV0ZjhieXRlcyIsInRvdGFsTnVtQnl0ZXMiLCJieXRlc09mTGVuZ3RoIiwiY29uY2F0ZW5hdGVUeXBlZEFycmF5cyIsImRlY29kZVdlaWdodHMiLCJmbG9hdDE2RGVjb2RlIiwicXVhbnRpemF0aW9uIiwicXVhbnRpemF0aW9uU2l6ZUZhY3RvciIsImJ5dGVCdWZmZXIiLCJxdWFudGl6ZWRBcnJheSIsImdldEZsb2F0MTZEZWNvZGVyIiwiZHR5cGVGYWN0b3IiLCJyZWFsVGVuc29yIiwiaW1hZ2VUZW5zb3IiLCJ0b3RhbEJ5dGVMZW5ndGgiLCJub3JtYWxpemVkWHMiLCJ1c2VOb2RlQnVmZmVyIiwiQnVmZmVyIiwiYXRvYiIsImJ0b2EiLCJzdHJpbmdCeXRlTGVuZ3RoIiwiYXJyYXlCdWZmZXJUb0Jhc2U2NFN0cmluZyIsImJhc2U2NFN0cmluZ1RvQXJyYXlCdWZmZXIiLCJjb25jYXRlbmF0ZUFycmF5QnVmZmVycyIsInRlbXAiLCJiYXNlbmFtZSIsInRyaW0iLCJpdGVtcyIsImdldE1vZGVsSlNPTkZvck1vZGVsQXJ0aWZhY3RzIiwiYXJ0aWZhY3RzIiwiZm9ybWF0IiwiZ2VuZXJhdGVkQnkiLCJjb252ZXJ0ZWRCeSIsInNpZ25hdHVyZSIsInVzZXJEZWZpbmVkTWV0YWRhdGEiLCJtb2RlbEluaXRpYWxpemVyIiwidHJhaW5pbmdDb25maWciLCJnZXRNb2RlbEFydGlmYWN0c0ZvckpTT04iLCJnZXRNb2RlbEFydGlmYWN0c0luZm9Gb3JKU09OIiwiZGF0ZVNhdmVkIiwiRGF0ZSIsIm1vZGVsVG9wb2xvZ3lUeXBlIiwibW9kZWxUb3BvbG9neUJ5dGVzIiwid2VpZ2h0U3BlY3NCeXRlcyIsIndlaWdodERhdGFCeXRlcyIsIm1hbnRpc2FUYWJsZSIsImNvbnZlcnRNYW50aXNzYSIsImNvbXB1dGVGbG9hdDE2TWFudGlzYVRhYmxlIiwiZXhwb25lbnRUYWJsZSIsImNvbXB1dGVGbG9hdDE2RXhwb25lbnRUYWJsZSIsIm9mZnNldFRhYmxlIiwiY29tcHV0ZUZsb2F0MTZPZmZzZXRUYWJsZSIsImJ1ZmZlclVpbnQzMlZpZXciLCJmbG9hdDE2Qml0cyIsImZsb2F0MzJCaXRzIiwiUEFUSF9TRVBBUkFUT1IiLCJQQVRIX1BSRUZJWCIsIklORk9fU1VGRklYIiwiTU9ERUxfVE9QT0xPR1lfU1VGRklYIiwiV0VJR0hUX1NQRUNTX1NVRkZJWCIsIldFSUdIVF9EQVRBX1NVRkZJWCIsIk1PREVMX01FVEFEQVRBX1NVRkZJWCIsInB1cmdlTG9jYWxTdG9yYWdlQXJ0aWZhY3RzIiwibG9jYWxTdG9yYWdlIiwiTFMiLCJwdXJnZWRNb2RlbFBhdGhzIiwicmVtb3ZlSXRlbSIsIm1vZGVsTmFtZSIsImdldE1vZGVsUGF0aEZyb21LZXkiLCJnZXRNb2RlbEtleXMiLCJ0b3BvbG9neSIsIm1vZGVsTWV0YWRhdGEiLCJyZW1vdmVJdGVtcyIsIkJyb3dzZXJMb2NhbFN0b3JhZ2UiLCJzZXRJdGVtIiwibWV0YWRhdGEiLCJnZXRJdGVtIiwibWV0YWRhdGFTdHJpbmciLCJ3ZWlnaHREYXRhQmFzZTY0IiwibG9jYWxTdG9yYWdlUm91dGVyIiwiYnJvd3NlckxvY2FsU3RvcmFnZSIsIkJyb3dzZXJMb2NhbFN0b3JhZ2VNYW5hZ2VyIiwiVVJMX1NDSEVNRV9TVUZGSVgiLCJNb2RlbFN0b3JlTWFuYWdlclJlZ2lzdHJ5IiwibWFuYWdlcnMiLCJzY2hlbWUiLCJtYW5hZ2VyIiwiZ2V0SW5zdGFuY2UiLCJwYXJzZVVSTCIsImdldFNjaGVtZXMiLCJjbG9uZU1vZGVsSW50ZXJuYWwiLCJzb3VyY2VVUkwiLCJkZXN0VVJMIiwiZGVsZXRlU291cmNlIiwibG9hZEhhbmRsZXJzIiwiZ2V0TG9hZEhhbmRsZXJzIiwibG9hZEhhbmRsZXIiLCJzYXZlSGFuZGxlcnMiLCJnZXRTYXZlSGFuZGxlcnMiLCJzYXZlSGFuZGxlciIsInNvdXJjZVNjaGVtZSIsInNvdXJjZVBhdGgiLCJzYW1lTWVkaXVtIiwiZ2V0TWFuYWdlciIsInJlbW92ZU1vZGVsIiwic2F2ZVJlc3VsdCIsImxpc3RNb2RlbHMiLCJzY2hlbWVzIiwic2NoZW1lT3V0Iiwic2NoZW1lQW5kUGF0aCIsImNvcHlNb2RlbCIsIm1vdmVNb2RlbCIsIlBhc3N0aHJvdWdoTG9hZGVyIiwiUGFzc3Rocm91Z2hTYXZlciIsImZyb21NZW1vcnkiLCJ3aXRoU2F2ZUhhbmRsZXIiLCJtb25pdG9yUHJvbWlzZXNQcm9ncmVzcyIsInN0YXJ0RnJhY3Rpb24iLCJlbmRGcmFjdGlvbiIsImNoZWNrUHJvbWlzZXMiLCJjaGVja0ZyYWN0aW9uIiwicmVzb2x2ZWRQcm9taXNlIiwicHJvbWlzZSIsImZyYWN0aW9uIiwiSU9Sb3V0ZXJSZWdpc3RyeSIsInNhdmVSb3V0ZXJzIiwibG9hZFJvdXRlcnMiLCJzYXZlUm91dGVyIiwibG9hZFJvdXRlciIsImdldEhhbmRsZXJzIiwiaGFuZGxlclR5cGUiLCJ2YWxpZEhhbmRsZXJzIiwicm91dGVyIiwiaGFuZGxlciIsImxvdWRSb3V0ZXIiLCJEVFlQRV9WQUxVRV9TSVpFX01BUCIsImxvYWRXZWlnaHRzQXNBcnJheUJ1ZmZlciIsInJlcXVlc3RzIiwiZmV0Y2hVUkwiLCJpc0JpbmFyeSIsImJ1ZmZlclByb21pc2VzIiwiZmlsZVBhdGhQcmVmaXgiLCJ3ZWlnaHROYW1lcyIsIndlaWdodHNMb2FkZXJGYWN0b3J5IiwiZmV0Y2hVcmxzIiwiZmV0Y2hXZWlnaHRzRnVuY3Rpb24iLCJncm91cEluZGljZXNUb0ZldGNoTWFwIiwiZ3JvdXBXZWlnaHRzVG9GZXRjaCIsIndlaWdodHNGb3VuZCIsImFsbE1hbmlmZXN0V2VpZ2h0TmFtZXMiLCJtYW5pZmVzdEdyb3VwQ29uZmlnIiwiZ3JvdXBJbmRleCIsImdyb3VwT2Zmc2V0Iiwid2VpZ2h0c0VudHJ5IiwicmF3RHR5cGUiLCJ3ZWlnaHRzQnl0ZXMiLCJlbnF1ZXVlV2VpZ2h0c0ZvckZldGNoaW5nRm4iLCJtYW5pZmVzdEVudHJ5Iiwic2l6ZUJ5dGVzIiwid2VpZ2h0TmFtZSIsIndlaWdodEluZGV4Iiwid2VpZ2h0c05vdEZvdW5kIiwiZ3JvdXBJbmRpY2VzVG9GZXRjaCIsImFjY3VtdWxhdG9yIiwic2hvdWxkRmV0Y2giLCJmaWxlcGF0aCIsImZldGNoVXJsIiwid2VpZ2h0c1RlbnNvck1hcCIsImJ1ZmZlckluZGV4T2Zmc2V0IiwibnVtQnVmZmVycyIsImdyb3VwQnl0ZXMiLCJncm91cEJ1ZmZlciIsImdyb3VwQnl0ZUJ1ZmZlciIsImdyb3VwQnVmZmVyT2Zmc2V0IiwibmFtZVRvVGVuc29yTWFwIiwiQWJzIiwiQWNvcyIsIkFjb3NoIiwiQWRkIiwiQWRkTiIsIkFsbCIsIkFueSIsIkFyZ01heCIsIkFyZ01pbiIsIkFzaW4iLCJBc2luaCIsIkF0YW4iLCJBdGFuaCIsIkF0YW4yIiwiQXZnUG9vbCIsIkF2Z1Bvb2xHcmFkIiwiQXZnUG9vbDNEIiwiQXZnUG9vbDNER3JhZCIsIkJhdGNoTWF0TXVsIiwiQmF0Y2hUb1NwYWNlTkQiLCJCaW5jb3VudCIsIkJyb2FkY2FzdFRvIiwiQ2FzdCIsIkNlaWwiLCJDbGlwQnlWYWx1ZSIsIkNvbXBsZXgiLCJDb21wbGV4QWJzIiwiQ29uY2F0IiwiQ29udjJEIiwiQ29udjJEQmFja3Byb3BGaWx0ZXIiLCJDb252MkRCYWNrcHJvcElucHV0IiwiQ29udjNEIiwiQ29udjNEQmFja3Byb3BGaWx0ZXJWMiIsIkNvbnYzREJhY2twcm9wSW5wdXRWMiIsIkNvcyIsIkNvc2giLCJDdW1zdW0iLCJDcm9wQW5kUmVzaXplIiwiRGVuc2VCaW5jb3VudCIsIkRlcHRoVG9TcGFjZSIsIkRlcHRod2lzZUNvbnYyZE5hdGl2ZSIsIkRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyIiwiRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCIsIkRpYWciLCJEaWxhdGlvbjJEIiwiRGlsYXRpb24yREJhY2twcm9wSW5wdXQiLCJEaWxhdGlvbjJEQmFja3Byb3BGaWx0ZXIiLCJSZWFsRGl2IiwiRWluc3VtIiwiRWx1IiwiRWx1R3JhZCIsIkVyZiIsIkVxdWFsIiwiRXhwIiwiRXhwYW5kRGltcyIsIkV4cG0xIiwiRkZUIiwiRmlsbCIsIkZsaXBMZWZ0UmlnaHQiLCJGbG9vciIsIkZsb29yRGl2IiwiRnVzZWRCYXRjaE5vcm0iLCJHYXRoZXJWMiIsIkdhdGhlck5kIiwiR3JlYXRlciIsIkdyZWF0ZXJFcXVhbCIsIklkZW50aXR5IiwiSUZGVCIsIkltYWciLCJJc0Zpbml0ZSIsIklzSW5mIiwiSXNOYW4iLCJMZWFreVJlbHUiLCJMZXNzIiwiTGVzc0VxdWFsIiwiTGluU3BhY2UiLCJMb2ciLCJMb2cxcCIsIkxvZ2ljYWxBbmQiLCJMb2dpY2FsTm90IiwiTG9naWNhbE9yIiwiTG9nU29mdG1heCIsIkxSTiIsIkxSTkdyYWQiLCJNYXgiLCJNYXhpbXVtIiwiTWF4UG9vbCIsIk1heFBvb2xHcmFkIiwiTWF4UG9vbDNEIiwiTWF4UG9vbDNER3JhZCIsIk1heFBvb2xXaXRoQXJnbWF4IiwiTWVhbiIsIk1pbiIsIk1pbmltdW0iLCJNaXJyb3JQYWQiLCJNb2QiLCJNdWx0aW5vbWlhbCIsIk11bHRpcGx5IiwiTmVnIiwiTm90RXF1YWwiLCJOb25NYXhTdXBwcmVzc2lvblYzIiwiTm9uTWF4U3VwcHJlc3Npb25WNCIsIk5vbk1heFN1cHByZXNzaW9uVjUiLCJPbmVzTGlrZSIsIk9uZUhvdCIsIlBhY2siLCJQYWRWMiIsIlBvb2wiLCJQb3ciLCJQcmVsdSIsIlByb2QiLCJSYW5nZSIsIlJlYWwiLCJSZWNpcHJvY2FsIiwiUmVsdSIsIlJlc2hhcGUiLCJSZXNpemVOZWFyZXN0TmVpZ2hib3IiLCJSZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkIiwiUmVzaXplQmlsaW5lYXIiLCJSZXNpemVCaWxpbmVhckdyYWQiLCJSZWx1NiIsIlJldmVyc2UiLCJSb3VuZCIsIlJzcXJ0IiwiU2NhdHRlck5kIiwiU2VsZWN0IiwiU2VsdSIsIlNsaWNlIiwiU2luIiwiU2luaCIsIlNpZ24iLCJTaWdtb2lkIiwiU29mdHBsdXMiLCJTcXJ0IiwiU3VtIiwiU3BhY2VUb0JhdGNoTkQiLCJTcGxpdFYiLCJTb2Z0bWF4IiwiU3BhcnNlRmlsbEVtcHR5Um93cyIsIlNwYXJzZVJlc2hhcGUiLCJTcGFyc2VTZWdtZW50TWVhbiIsIlNwYXJzZVNlZ21lbnRTdW0iLCJTcGFyc2VUb0RlbnNlIiwiU3F1YXJlZERpZmZlcmVuY2UiLCJTcXVhcmUiLCJTdHJpZGVkU2xpY2UiLCJTdHJpbmdOR3JhbXMiLCJTdHJpbmdTcGxpdCIsIlN0cmluZ1RvSGFzaEJ1Y2tldEZhc3QiLCJTdWIiLCJUYW4iLCJUYW5oIiwiVGlsZSIsIlRvcEsiLCJUcmFuc2Zvcm0iLCJUcmFuc3Bvc2UiLCJVbmlxdWUiLCJVbnBhY2siLCJVbnNvcnRlZFNlZ21lbnRTdW0iLCJaZXJvc0xpa2UiLCJTdGVwIiwiRnJvbVBpeGVscyIsIlJvdGF0ZVdpdGhPZmZzZXQiLCJfRnVzZWRNYXRNdWwiLCJGdXNlZENvbnYyRCIsIkZ1c2VkRGVwdGh3aXNlQ29udjJEIiwia2VybmVsUmVnaXN0cnkiLCJncmFkUmVnaXN0cnkiLCJnZXRLZXJuZWwiLCJtYWtlS2V5IiwiZ2V0R3JhZGllbnQiLCJnZXRLZXJuZWxzRm9yQmFja2VuZCIsIml0IiwiZW50cmllcyIsImRvbmUiLCJuZXh0IiwiY29uZmlnIiwicmVnaXN0ZXJLZXJuZWwiLCJyZWdpc3RlckdyYWRpZW50IiwidW5yZWdpc3Rlcktlcm5lbCIsInVucmVnaXN0ZXJHcmFkaWVudCIsImNvcHlSZWdpc3RlcmVkS2VybmVscyIsInJlZ2lzdGVyZWRCYWNrZW5kTmFtZSIsIm5ld0JhY2tlbmROYW1lIiwiYWJzXyIsImFjb3NfIiwiYWNvc2hfIiwiYWRkXyIsIiRhIiwiJGIiLCJhZGROXyIsIiR0ZW5zb3JzIiwiZmlyc3RUZW5zb3IiLCJhbGxfIiwiYW55XyIsImFyZ01heF8iLCJhcmdNaW5fIiwiYmF0Y2hUb1NwYWNlIiwic3BhdGlhbExlbmd0aCIsInJlc2hhcGVkUmFuayIsImJsb2NrU2hhcGVSYW5rIiwicGVybXV0ZWRCZWZvcmVCYXRjaCIsInBlcm11dGVkQWZ0ZXJCYXRjaCIsInVuY3JvcHBlZFNoYXBlIiwiYXNpbl8iLCJhc2luaF8iLCJhdGFuXyIsImF0YW4yXyIsImF0YW5oXyIsImF2Z1Bvb2xfIiwieDREIiwicmVzaGFwZWRUbzREIiwiYXZnUG9vbDNkIiwiYXZnUG9vbDNkXyIsIng1RCIsInJlc2hhcGVkVG81RCIsImF4ZXNBcmVJbm5lck1vc3REaW1zIiwiY29tYmluZUxvY2F0aW9ucyIsIm91dHB1dExvYyIsInJlZHVjZUxvYyIsInJlZHVjZUlkeCIsIm51bUF4ZXMiLCJiYXNpY0xTVE1DZWxsIiwiYmFzaWNMU1RNQ2VsbF8iLCJmb3JnZXRCaWFzIiwibHN0bUtlcm5lbCIsImxzdG1CaWFzIiwiJGZvcmdldEJpYXMiLCIkbHN0bUtlcm5lbCIsIiRsc3RtQmlhcyIsIiRjIiwiJGgiLCJjb21iaW5lZCIsIndlaWdodGVkIiwic2xpY2VDb2xzIiwibmV3QyIsImJhdGNoVG9TcGFjZU5EXyIsImJhdGNoTm9ybV8iLCIkbWVhbiIsIiR2YXJpYW5jZSIsIiRzY2FsZSIsIiRvZmZzZXQiLCJiYXRjaE5vcm0yZCIsImJhdGNoTm9ybTJkXyIsImJhdGNoTm9ybTNkIiwiYmF0Y2hOb3JtM2RfIiwiYmF0Y2hOb3JtNGQiLCJiYXRjaE5vcm00ZF8iLCJ4QXM0RCIsImJpbmNvdW50XyIsIiR3ZWlnaHRzIiwiYm9vbGVhbk1hc2tBc3luYyIsIiR0ZW5zb3IiLCIkbWFzayIsImF4aXNGcm9tIiwibWFza0RpbSIsInRlbnNvclNoYXBlIiwibGVhZGluZ1NpemUiLCJ0YXJnZXRUZW5zb3JTaGFwZSIsInJlc2hhcGVkVGVuc29yIiwicmVzaGFwZWRNYXNrIiwicG9zaXRpdmVQb3NpdGlvbnMiLCJicm9hZGNhc3RUbyIsImJyb2FkY2FzdFRvXyIsImdldFJlZHVjdGlvbkF4ZXMiLCJpbkRpbSIsIm91dEF4aXMiLCJvdXREaW0iLCJmcm9tUGl4ZWxzXyIsImlzUGl4ZWxEYXRhIiwiaXNJbWFnZURhdGEiLCJpc0NhbnZhc0xpa2UiLCJpc0ltYWdlQml0bWFwIiwiSW1hZ2VEYXRhIiwiSW1hZ2VCaXRtYXAiLCJIQVZFX0NVUlJFTlRfREFUQV9SRUFEWV9TVEFURSIsInJlYWR5U3RhdGUiLCJnZXRJbWFnZURhdGEiLCJudW1QaXhlbHMiLCJjYW5XcmFwUGl4ZWxzVG9JbWFnZUJpdG1hcCIsImlzTm9uRW1wdHlQaXhlbHMiLCJmcm9tUGl4ZWxzQXN5bmMiLCJpbWFnZUJpdG1hcCIsImNyZWF0ZUltYWdlQml0bWFwIiwicHJlbXVsdGlwbHlBbHBoYSIsInRvUGl4ZWxzIiwiaW1nIiwiJGltZyIsIm9yaWdpbmFsSW1nVGVuc29yIiwibXVsdGlwbGllciIsIlVpbnQ4Q2xhbXBlZEFycmF5IiwicmdiYSIsImltYWdlRGF0YSIsInB1dEltYWdlRGF0YSIsImZyb21QaXhlbHMiLCJjYXN0XyIsImNlaWxfIiwiY2xpcEJ5VmFsdWVfIiwiY2xvbmVfIiwiY29tcGxleF8iLCJjb25jYXRfIiwiY29uY2F0MWQiLCJjb25jYXQxZF8iLCJjb25jYXQyZCIsImNvbmNhdDJkXyIsImNvbmNhdDNkIiwiY29uY2F0M2RfIiwiY29uY2F0NGQiLCJjb25jYXQ0ZF8iLCJmaXJzdFNoYXBlIiwiY29uZnVzaW9uTWF0cml4XyIsImxhYmVscyIsInByZWRpY3Rpb25zIiwibnVtQ2xhc3NlcyIsIiRsYWJlbHMiLCIkcHJlZGljdGlvbnMiLCJpc0ludGVnZXIiLCJvbmVIb3RMYWJlbHMiLCJvbmVIb3RQcmVkaWN0aW9ucyIsIm9uZUhvdExhYmVsc1QiLCJjb25mdXNpb25NYXRyaXgiLCJjb252MWQiLCJjb252MWRfIiwiZGlsYXRpb24iLCJ4M0QiLCJyZXNoYXBlZFRvM0QiLCJmaWx0ZXI0RCIsImlucHV0NEQiLCJjb252MmRfIiwiY29udjJEQmFja3Byb3BGaWx0ZXJfIiwiZHk0RCIsImNvbnYyREJhY2twcm9wSW5wdXRfIiwieFNoYXBlNEQiLCJjb252MmRUcmFuc3Bvc2UiLCJjb252MmRUcmFuc3Bvc2VfIiwiY29udjNkIiwiY29udjNkXyIsImNvbnYzREJhY2twcm9wSW5wdXRfIiwieFNoYXBlNUQiLCJkeTVEIiwiY29udjNkVHJhbnNwb3NlIiwiY29udjNkVHJhbnNwb3NlXyIsInJvdW5kaW5nTW9kZSIsInBhcnNlVHVwbGVQYXJhbSIsInBhcnNlM1R1cGxlUGFyYW0iLCJkZXB0aHdpc2UiLCJmaWx0ZXJDaGFubmVscyIsImdldEVmZmVjdGl2ZUZpbHRlclNpemUiLCJmaWVsZFNpemUiLCJ6ZXJvUGFkIiwiY29tcHV0ZURlZmF1bHRQYWQiLCJpbnB1dFJvd3MiLCJpbnB1dENvbHMiLCJvdXRwdXRDb2xzIiwiY29tcHV0ZU91dHB1dFNoYXBlMkQiLCJwYWRBbG9uZ0hlaWdodCIsInBhZEFsb25nV2lkdGgiLCJnZXRQYWRBbmRPdXRJbmZvIiwiYmFjayIsIm91dHB1dERlcHRocyIsImNvbXB1dGVPdXRwdXRTaGFwZTREIiwicGFkQWxvbmdEZXB0aCIsImdldDNEUGFkQW5kT3V0SW5mbyIsImVmZmVjdGl2ZUZpZWxkU2l6ZSIsInBhcmFtIiwidHVwbGVWYWx1ZXNBcmVPbmUiLCJkaW1BIiwiZGltQiIsImRpbUMiLCJjb3NfIiwiY29zaF8iLCJjdW1zdW1fIiwiZGVuc2VCaW5jb3VudF8iLCJkZXB0aFRvU3BhY2VfIiwiZGVwdGh3aXNlQ29udjJkIiwiZGVwdGh3aXNlQ29udjJkXyIsImRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyXyIsImRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXRfIiwiZGlhZ18iLCJkaWxhdGlvbjJkIiwiZGlsYXRpb24yZF8iLCJkaXZfIiwiZGl2Tm9OYW4iLCJkaXZOb05hbl8iLCJkaXZSZXN1bHQiLCJiRXF1YWxzWmVybyIsImRvdCIsImRvdF8iLCJ0MSIsInQyIiwiJHQxIiwiJHQyIiwidDFJbm5lciIsInQySW5uZXIiLCJ0MTJEIiwidDIyRCIsInQxdDIiLCJkcm9wb3V0IiwiZHJvcG91dF8iLCJyYXRlIiwibm9pc2VTaGFwZSIsIiRub2lzZVNoYXBlIiwia2VlcFByb2IiLCJnZXROb2lzZVNoYXBlIiwibmV3RGltZW5zaW9uIiwiZWluc3VtXyIsImVsdV8iLCJlcXVhbF8iLCJlcmZfIiwiZXhwXyIsImV4cGFuZERpbXNfIiwiZXhwbTFfIiwiZXllIiwiZXllXyIsImJhdGNoU2hhcGUiLCJidWZmIiwiZmxvb3JfIiwiZmxvb3JEaXZfIiwiZnVzZWRDb252MmRfIiwiJGJpYXMiLCIkcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyIsImR5QWN0aXZhdGlvbiIsImRlciIsImJpYXNEZXIiLCJjdXN0b21PcCIsImN1c3RvbU9wV2l0aEJpYXMiLCJmdXNlZERlcHRod2lzZUNvbnYyZF8iLCJ4RGVyIiwiZmlsdGVyRGVyIiwibWF0TXVsIiwiZnVzZWRNYXRNdWxfIiwiYTNEIiwiYjNEIiwiYURlciIsImJEZXIiLCJnZXRGdXNlZER5QWN0aXZhdGlvbiIsImdldEZ1c2VkQmlhc0dyYWRpZW50IiwicmVkdWNlQXhlcyIsInNob3VsZEZ1c2UiLCJnYXRoZXIiLCJnYXRoZXJfIiwiZ2F0aGVyTkQiLCJnYXRoZXJORF8iLCJ0ZW5zb3JSYW5rIiwiblJlc3VsdCIsImdyZWF0ZXJfIiwiZ3JlYXRlckVxdWFsXyIsImltYWdfIiwiY3JvcEFuZFJlc2l6ZV8iLCIkaW1hZ2UiLCIkYm94ZXMiLCIkYm94SW5kIiwiZmxpcExlZnRSaWdodF8iLCJub25NYXhTdXBwcmVzc2lvbiIsIm5vbk1heFN1cHByZXNzaW9uXyIsIiRzY29yZXMiLCJub25NYXhTdXBwcmVzc2lvbkFzeW5jIiwiYm94ZXNBbmRTY29yZXMiLCJub25NYXhTdXBwcmVzc2lvblBhZGRlZCIsIm5vbk1heFN1cHByZXNzaW9uUGFkZGVkXyIsIm5vbk1heFN1cHByZXNzaW9uUGFkZGVkQXN5bmMiLCIkbWF4T3V0cHV0U2l6ZSIsIiRpb3VUaHJlc2hvbGQiLCIkc2NvcmVUaHJlc2hvbGQiLCJub25NYXhTdXBwcmVzc2lvbldpdGhTY29yZSIsIm5vbk1heFN1cHByZXNzaW9uV2l0aFNjb3JlXyIsIm5vbk1heFN1cHByZXNzaW9uV2l0aFNjb3JlQXN5bmMiLCJyZXNpemVCaWxpbmVhcl8iLCIkaW1hZ2VzIiwiYmF0Y2hJbWFnZXMiLCJyZXNpemVOZWFyZXN0TmVpZ2hib3JfIiwicm90YXRlV2l0aE9mZnNldF8iLCJ0aHJlc2hvbGRfIiwiaW52ZXJ0ZWQiLCJ0aHJlc2hWYWx1ZSIsInRvdGFsUGl4ZWxzSW5JbWFnZSIsImdyYXlzY2FsZSIsIiR0aHJlc2hvbGQiLCIkciIsIiRnIiwiaGlzdG9ncmFtIiwiY2xhc3NGaXJzdCIsImNsYXNzU2Vjb25kIiwibWVhbkZpcnN0IiwibWVhblNlYyIsIndlaWdodEZvcmVncm91bmQiLCJ3ZWlnaHRCYWNrIiwiYmVzdFRocmVzaCIsImJlc3RJbkJldFZhciIsImNJbkJldFZhciIsIm1lYW5GaXJzdERpdkEiLCJtZWFuU2VjRmlsbCIsIm1lYW5TZWNBZGQiLCJtZWFuU2VjTXVsIiwiY0luQmV0VmFyU3ViQSIsImNJbkJldFZhclN1YkIiLCJjSW5CZXRWYXJNdWwiLCJvdHN1IiwiaW52Q29uZGl0aW9uIiwidHJhbnNmb3JtXyIsIiR0cmFuc2Zvcm1zIiwiaW5Ub3BLQXN5bmMiLCJ0YXJnZXRzIiwiJHRhcmdldHMiLCJwcmVkaWN0aW9uc1ZhbHMiLCJ0YXJnZXRzVmFscyIsInByZWNpc2lvbiIsImlzRmluaXRlXyIsImlzSW5mXyIsImlzTmFOXyIsImxlYWt5UmVsdV8iLCJsZXNzXyIsImxlc3NFcXVhbF8iLCJiYW5kUGFydCIsImJhbmRQYXJ0XyIsIm51bUxvd2VyIiwibnVtVXBwZXIiLCJNIiwiTiIsImlqIiwiaW5CYW5kIiwibWF0IiwiZ3JhbVNjaG1pZHQiLCJncmFtU2NobWlkdF8iLCJpbnB1dElzVGVuc29yMkQiLCJ5cyIsInhzMWQiLCJwcm9qIiwicXIyZCIsImZ1bGxNYXRyaWNlcyIsIm9uZTJEIiwiaXRlcnMiLCJyVGVtcCIsIndUZW1wIiwicVRlbXAiLCJyakVuZDEiLCJub3JtWCIsInJqaiIsIndQcmUiLCJ0YXUiLCJyakVuZEFsbCIsInRhdVRpbWVzVyIsIndUIiwiclRpbWVzVGF1IiwidGF3VGltZXNXVCIsInFBbGxKRW5kIiwicVRpbWVzVGF1IiwicXIiLCJxcl8iLCJvdXRlckRpbXNQcm9kIiwicHJldiIsIngyZHMiLCJxMmRzIiwicjJkcyIsIngyZCIsInEyZCIsInIyZCIsImxpbnNwYWNlIiwibG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb24iLCJsb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbl8iLCJsb2dfIiwibG9nMXBfIiwibG9nU2lnbW9pZCIsImxvZ1NpZ21vaWRfIiwibG9nU29mdG1heCIsImxvZ1NvZnRtYXhfIiwiJGxvZ2l0cyIsInhNYXgiLCJzaGlmdGVkIiwibG9nU3VtRXhwIiwibG9nU3VtRXhwXyIsImxvZ2ljYWxBbmRfIiwibG9naWNhbE5vdF8iLCJsb2dpY2FsT3JfIiwibG9naWNhbFhvciIsImxvZ2ljYWxYb3JfIiwiUmVkdWN0aW9uIiwiYWJzb2x1dGVEaWZmZXJlbmNlIiwiYWJzb2x1dGVEaWZmZXJlbmNlXyIsInJlZHVjdGlvbiIsIlNVTV9CWV9OT05aRVJPX1dFSUdIVFMiLCJsb3NzZXMiLCJjb21wdXRlV2VpZ2h0ZWRMb3NzIiwiY29tcHV0ZVdlaWdodGVkTG9zc18iLCIkbG9zc2VzIiwid2VpZ2h0ZWRMb3NzIiwiTk9ORSIsIlNVTSIsIk1FQU4iLCJicm9hZGNhc3RGYWN0b3IiLCJicm9hZGNhc3RlZFdlaWdodHMiLCJudW1Ob25aZXJvcyIsImNvc2luZURpc3RhbmNlIiwiY29zaW5lRGlzdGFuY2VfIiwib25lIiwiaGluZ2VMb3NzIiwiaGluZ2VMb3NzXyIsImh1YmVyTG9zcyIsImh1YmVyTG9zc18iLCJkZWx0YSIsImRlbHRhU2NhbGFyIiwicXVhZHJhdGljIiwibGluZWFyIiwibG9nTG9zcyIsImxvZ0xvc3NfIiwiZXBzaWxvblNjYWxhciIsImwxIiwibDIiLCJtZWFuU3F1YXJlZEVycm9yIiwibWVhblNxdWFyZWRFcnJvcl8iLCJzaWdtb2lkQ3Jvc3NFbnRyb3B5Iiwic2lnbW9pZENyb3NzRW50cm9weV8iLCJtdWx0aUNsYXNzTGFiZWxzIiwibGFiZWxTbW9vdGhpbmciLCIkbXVsdGlDbGFzc0xhYmVscyIsImxhYmVsU21vb3RoaW5nU2NhbGFyIiwibWF4T3V0cHV0Iiwib3V0cHV0WFRhcmdldCIsInNpZ21vaWRPdXRwdXQiLCJzaWdtb2lkQ3Jvc3NFbnRyb3B5V2l0aExvZ2l0c18iLCJzb2Z0bWF4Q3Jvc3NFbnRyb3B5Iiwic29mdG1heENyb3NzRW50cm9weV8iLCJvbmVob3RMYWJlbHMiLCIkb25laG90TGFiZWxzIiwibHNlIiwibG9nUmVzdWx0IiwiY29zdFZlY3RvciIsInNvZnRtYXhDcm9zc0VudHJvcHlXaXRoTG9naXRzXyIsIm1hdE11bF8iLCJtYXhfIiwibWF4UG9vbF8iLCJtYXhQb29sM2RfIiwibWF4UG9vbFdpdGhBcmdtYXgiLCJtYXhQb29sV2l0aEFyZ21heF8iLCJtYXhpbXVtXyIsIm1lYW5fIiwibWVzaGdyaWQiLCJpbmRleGluZyIsIlR5cGVFcnJvciIsIiR5IiwibWluXyIsIm1pbmltdW1fIiwibWlycm9yUGFkXyIsInNoYXBlT2Zmc2V0IiwibW9kXyIsIm1vbWVudHMiLCJtb21lbnRzXyIsInhNZWFuIiwia2VlcERpbXNTaGFwZSIsImRldlNxdWFyZWQiLCJtb3ZpbmdBdmVyYWdlIiwibW92aW5nQXZlcmFnZV8iLCJkZWNheSIsInplcm9EZWJpYXMiLCIkdiIsIiRkZWNheSIsIm9uZU1pbnVzRGVjYXkiLCJ1cGRhdGUiLCIkc3RlcCIsIm11bF8iLCJtdWx0aVJOTkNlbGwiLCJtdWx0aVJOTkNlbGxfIiwibHN0bUNlbGxzIiwibmV3U3RhdGVzIiwibmV3SCIsIm11bHRpbm9taWFsXyIsIm9yaWdSYW5rIiwibmVnXyIsIm5vbk1heFN1cHBTYW5pdHlDaGVjayIsIm5vcm1JbXBsIiwibm9ybV8iLCJvcmQiLCJub3RFcXVhbF8iLCJvbmVIb3RfIiwib25lc0xpa2VfIiwiT1BfU0NPUEVfU1VGRklYIiwiZjIiLCJjb25maWd1cmFibGUiLCJzcGVjdHJhbCIsInJmZnQiLCJpcmZmdCIsInNpZ25hbCIsImhhbW1pbmdXaW5kb3ciLCJoYW5uV2luZG93IiwiZnJhbWUiLCJzdGZ0IiwibGluYWxnIiwic3BhcnNlIiwib3V0ZXJQcm9kdWN0Iiwib3V0ZXJQcm9kdWN0XyIsInYxIiwidjIiLCIkdjEiLCIkdjIiLCJ2MTJEIiwidjIyRCIsInBhZF8iLCJwYWQxZCIsInBhZDFkXyIsInBhZDJkIiwicGFkMmRfIiwicGFkM2QiLCJwYWQzZF8iLCJwYWQ0ZCIsInBhZDRkXyIsInBvb2xfIiwid2luZG93U2hhcGUiLCJwb29saW5nVHlwZSIsImJhc2VQYWRkaW5nIiwicGFkRXh0cmFTaGFwZSIsInBhZEV4dHJhU3RhcnQiLCJwYWRFeHRyYUVuZCIsIndpdGhTcGFjZVRvQmF0Y2hCYXNlUGFkZGluZ3MiLCJpc0RpbGF0aW9uT25lIiwiYWRqdXN0ZWRQYWRkaW5nIiwiYWRqdXN0ZWRDcm9wcyIsInBhZFN0YXJ0Iiwib3JpZ1BhZEVuZCIsImZ1bGxJbnB1dFNoYXBlIiwicGFkRW5kRXh0cmEiLCJwYWRFbmQiLCJyZXF1aXJlZFNwYWNlVG9CYXRjaFBhZGRpbmdzIiwiY29udmVydGVkUGFkIiwiY29udmVydGVkWCIsInBvd18iLCIkYmFzZSIsIiRleHAiLCJwcmVsdV8iLCJ2ZXJib3NlIiwicHJvZF8iLCJyYW5kIiwicmFuZF8iLCJyYW5kRnVuY3Rpb24iLCJNUFJhbmRHYXVzcyIsInN0ZERldmlhdGlvbiIsInRydW5jYXRlZCIsInN0ZERldiIsIm5leHRWYWwiLCJ1cHBlciIsImxvd2VyIiwic2VlZFZhbHVlIiwibmV4dFZhbHVlIiwicmVzdWx0WCIsInJlc3VsdFkiLCJpc1ZhbGlkIiwiaXNWYWxpZFRydW5jYXRlZCIsImNvbnZlcnRWYWx1ZSIsIlJhbmRHYW1tYSIsInJhbmR1IiwicmFuZG4iLCJ2MCIsIlVuaWZvcm1SYW5kb20iLCJjYW5SZXR1cm5GbG9hdCIsImphcnF1ZUJlcmFOb3JtYWxpdHlUZXN0IiwidmFsdWVzTWVhbiIsInN1bTIiLCJzdW0zIiwic2tld25lc3MiLCJzdW00Iiwia3VydG9zaXMiLCJqYiIsImV4cGVjdEFycmF5SW5NZWFuU3RkUmFuZ2UiLCJhY3R1YWwiLCJleHBlY3RlZE1lYW4iLCJleHBlY3RlZFN0ZERldiIsImFjdHVhbE1lYW4iLCJzcXVhcmVEaWZmU3VtIiwic3RhbmRhcmREZXZpYXRpb24iLCJyYW5kb21HYW1tYSIsInJhbmRvbUdhbW1hXyIsInJnYW1tYSIsInJhbmRvbU5vcm1hbCIsInJhbmRvbU5vcm1hbF8iLCJyYW5kR2F1c3MiLCJyYW5kb21Vbmlmb3JtIiwicmFuZG9tVW5pZm9ybV8iLCJtaW52YWwiLCJtYXh2YWwiLCJyZWFsXyIsInJlY2lwcm9jYWxfIiwiUEFSQUxMRUxJWkVfVEhSRVNIT0xEIiwicmVsdV8iLCJyZWx1Nl8iLCJyZXNoYXBlXyIsInJldmVyc2VfIiwicmV2ZXJzZTFkIiwicmV2ZXJzZTFkXyIsInJldmVyc2UyZCIsInJldmVyc2UyZF8iLCJyZXZlcnNlM2QiLCJyZXZlcnNlM2RfIiwicmV2ZXJzZTRkIiwicmV2ZXJzZTRkXyIsInJvdW5kXyIsInJzcXJ0XyIsInNjYWxhciIsInNjYXR0ZXJORCIsInNjYXR0ZXJORF8iLCIkdXBkYXRlcyIsInZhbGlkYXRlVXBkYXRlU2hhcGUiLCJzaGFwZUVycm9yIiwidmFsaWRhdGVJbnB1dCIsInRvdGFsTmQiLCJzYWZlU2xpY2VEaW0iLCJzZWx1XyIsInNlcGFyYWJsZUNvbnYyZCIsInNlcGFyYWJsZUNvbnYyZF8iLCJkZXB0aHdpc2VGaWx0ZXIiLCJwb2ludHdpc2VGaWx0ZXIiLCIkZGVwdGh3aXNlRmlsdGVyIiwiJHBvaW50d2lzZUZpbHRlciIsImNoYW5uZWxNdWx0aXBsaWVyIiwic2V0ZGlmZjFkQXN5bmMiLCJ5U2V0Iiwic2lnbW9pZF8iLCJzaWduXyIsImZyYW1lXyIsImZyYW1lTGVuZ3RoIiwiZnJhbWVTdGVwIiwicGFkVmFsdWUiLCJwYWRMZW4iLCJoYW1taW5nV2luZG93XyIsIndpbmRvd0xlbmd0aCIsImhhbm5XaW5kb3dfIiwic3RmdF8iLCJmZnRMZW5ndGgiLCJ3aW5kb3dGbiIsImZyYW1lZFNpZ25hbCIsIndpbmRvd2VkU2lnbmFsIiwiZW5jbG9zaW5nUG93ZXJPZlR3byIsImNvc2luZVdpbmRvdyIsImV2ZW4iLCJjb3NBcmciLCJzaW5fIiwic2luaF8iLCJzbGljZV8iLCJzbGljZTFkIiwic2xpY2UxZF8iLCJzbGljZTJkXyIsInNsaWNlM2RfIiwic2xpY2U0ZF8iLCJzdHJpZGVzV2l0aEVsaWRlZERpbXMiLCJlbGxpcHNpc0luc2VydGlvbkluZGV4IiwibnVtRWxpZGVkQXhlcyIsInVubm9ybWFsaXplQXhpcyIsIm5vcm1hbGl6ZWRBeGlzIiwiZ2V0RWxpZGVkQXhlcyIsImVsaWRlZEF4ZXMiLCJmdWxsSW5kZXgiLCJzdGFydEluZGljZXNXaXRoRWxpZGVkRGltcyIsInN0b3BJbmRpY2VzV2l0aEVsaWRlZERpbXMiLCJzdGFydEZvckF4aXMiLCJzdG9wRm9yQXhpcyIsInN0cmlkZXNGb3JBeGlzIiwib3JpZ2luYWxCZWdpbiIsIm9yaWdpbmFsQXhpcyIsIm9yaWdpbmFsVmFsdWUiLCJvcmlnaW5hbEVuZCIsIk1BWF9TQUZFX0lOVEVHRVIiLCJheGlzU2l6ZSIsInN0YXJ0SW5kaWNlcyIsInN0b3BJbmRpY2VzIiwiZmlyc3ROb25PbmVBeGlzIiwiJGVuZCIsInNvZnRtYXhfIiwic29mdHBsdXNfIiwic3BhY2VUb0JhdGNoTkRfIiwic3BhcnNlRmlsbEVtcHR5Um93c18iLCJzcGFyc2VSZXNoYXBlXyIsIiRuZXdTaGFwZSIsInNwYXJzZVNlZ21lbnRNZWFuXyIsInNwYXJzZVNlZ21lbnRTdW1fIiwic3BhcnNlVG9EZW5zZV8iLCIkc3BhcnNlSW5kaWNlcyIsIiRzcGFyc2VWYWx1ZXMiLCJkZWZhdWx0VmFsdWVzIiwibnVtRWxlbXMiLCJudW1WYWx1ZXMiLCJmZnRfIiwiaWZmdF8iLCJpcmZmdF8iLCJjb21wbGV4SW5wdXQiLCJyZWFsSW5wdXQiLCJpbWFnSW5wdXQiLCJyZWFsQ29uanVnYXRlIiwiaW1hZ0Nvbmp1Z2F0ZSIsInJmZnRfIiwiYWRqdXN0ZWRJbnB1dCIsInplcm9zU2hhcGUiLCJ6ZXJvc0lucHV0IiwicmVhbENvbXBsZXhDb25qdWdhdGUiLCJpbWFnQ29tcGxleENvbmp1Z2F0ZSIsInNwbGl0XyIsIm51bU9mTmVncyIsIm5lZ0luZGV4Iiwic3FydF8iLCJzcXVhcmVfIiwic3F1YXJlZERpZmZlcmVuY2VfIiwic3F1ZWV6ZSIsInNxdWVlemVfIiwic3RhY2tfIiwic3RlcF8iLCJzdHJpZGVkU2xpY2VfIiwic3RyaW5nTkdyYW1zXyIsInN0cmluZ1NwbGl0XyIsInN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RfIiwic3ViXyIsInN1bV8iLCJ0YW5fIiwidGFuaF8iLCJpbmZlcnJlZFNoYXBlIiwidGVuc29yMWQiLCJ0ZW5zb3IyZCIsInRlbnNvcjNkIiwidGVuc29yNGQiLCJ0ZW5zb3I1ZCIsInRlbnNvcjZkIiwicHJvdmlkZWRTaXplIiwiaW5mZXJyZWRTaXplIiwiaW5mZXJyZWQiLCJmbGF0RGltc0RvbnRNYXRjaCIsInRpbGVfIiwidG9wa18iLCJ0cmFuc3Bvc2VfIiwidHJ1bmNhdGVkTm9ybWFsIiwidHJ1bmNhdGVkTm9ybWFsXyIsInVuaXF1ZV8iLCJ1bnNvcnRlZFNlZ21lbnRTdW1fIiwidW5zdGFjayIsInVuc3RhY2tfIiwid2hlcmVfIiwiJGNvbmRpdGlvbiIsImJyb2FkY2FzdFNoYXBlIiwid2hlcmVBc3luYyIsInplcm9zTGlrZV8iLCJBZGFkZWx0YU9wdGltaXplciIsImxlYXJuaW5nUmF0ZSIsInJobyIsImFjY3VtdWxhdGVkR3JhZHMiLCJhY2N1bXVsYXRlZFVwZGF0ZXMiLCJhcHBseUdyYWRpZW50cyIsInZhcmlhYmxlR3JhZGllbnRzIiwib3JpZ2luYWxOYW1lIiwiYWNjdW11bGF0ZWRHcmFkIiwiYWNjdW11bGF0ZWRVcGRhdGUiLCJuZXdBY2N1bXVsYXRlZEdyYWQiLCJuZXdBY2N1bXVsYXRlZFVwZGF0ZSIsImluY3JlbWVudEl0ZXJhdGlvbnMiLCJ2YXJpYWJsZXMiLCJzYXZlSXRlcmF0aW9ucyIsIndlaWdodFZhbHVlcyIsInZhcmlhYmxlQ291bnQiLCJleHRyYWN0SXRlcmF0aW9ucyIsImdldENvbmZpZyIsImNscyIsImNsYXNzTmFtZSIsIkFkYWdyYWRPcHRpbWl6ZXIiLCJpbml0aWFsQWNjdW11bGF0b3JWYWx1ZSIsIkFkYW1PcHRpbWl6ZXIiLCJiZXRhMSIsImJldGEyIiwiYWNjdW11bGF0ZWRGaXJzdE1vbWVudCIsImFjY3VtdWxhdGVkU2Vjb25kTW9tZW50IiwiYWNjQmV0YTEiLCJhY2NCZXRhMiIsInZhck5hbWVzIiwib25lTWludXNBY2NCZXRhMSIsIm9uZU1pbnVzQWNjQmV0YTIiLCJmaXJzdE1vbWVudCIsInNlY29uZE1vbWVudCIsIm5ld0ZpcnN0TW9tZW50IiwibmV3U2Vjb25kTW9tZW50IiwiYmlhc0NvcnJlY3RlZEZpcnN0TW9tZW50IiwiYmlhc0NvcnJlY3RlZFNlY29uZE1vbWVudCIsIml0ZXJhdGlvbnNfIiwiQWRhbWF4T3B0aW1pemVyIiwiYWNjdW11bGF0ZWRXZWlnaHRlZEluZk5vcm0iLCJpdGVyYXRpb24iLCJsciIsIndlaWdodGVkSW5mTm9ybSIsInV0MCIsInV0MSIsIm5ld1dlaWdodGVkSW5mTm9ybSIsIk1vbWVudHVtT3B0aW1pemVyIiwibW9tZW50dW0iLCJ1c2VOZXN0ZXJvdiIsImFjY3VtdWxhdGlvbnMiLCJhY2N1bXVsYXRpb24iLCJuZXdBY2N1bXVsYXRpb24iLCJzZXRNb21lbnR1bSIsIk9wdGltaXplciIsIm1pbmltaXplIiwicmV0dXJuQ29zdCIsImNvbXB1dGVHcmFkaWVudHMiLCJncmFkQXJyYXkiLCJpdGVyYXRpb25zIiwiZ2V0Q2xhc3NOYW1lIiwiaGFzSW5zdGFuY2UiLCJPcHRpbWl6ZXJDb25zdHJ1Y3RvcnMiLCJjZW50ZXJlZCIsIlJNU1Byb3BPcHRpbWl6ZXIiLCJhY2N1bXVsYXRlZE1lYW5TcXVhcmVzIiwiYWNjdW11bGF0ZWRNb21lbnRzIiwiYWNjdW11bGF0ZWRNZWFuR3JhZHMiLCJhY2N1bXVsYXRlZE1lYW5TcXVhcmUiLCJuZXdBY2N1bXVsYXRlZE1lYW5TcXVhcmUiLCJhY2N1bXVsYXRlZE1lYW5HcmFkIiwibmV3QWNjdW11bGF0ZWRNZWFuR3JhZCIsImdyYWRDb250cmlidXRpb24iLCJuZXdBY2N1bXVsYXRlZE1vbWVudHMiLCJTR0RPcHRpbWl6ZXIiLCJzZXRMZWFybmluZ1JhdGUiLCJQbGF0Zm9ybUJyb3dzZXIiLCJlbmNvZGUiLCJlbmNvZGluZyIsInRleHRFbmNvZGVyIiwiVGV4dEVuY29kZXIiLCJyZWdpc3Rlck1hbmFnZXIiLCJnZXROb2RlRmV0Y2giLCJpbXBvcnRGZXRjaCIsInN5c3RlbUZldGNoIiwicmVzZXRTeXN0ZW1GZXRjaCIsInNldFN5c3RlbUZldGNoIiwiZmV0Y2hGbiIsImdldFN5c3RlbUZldGNoIiwiUGxhdGZvcm1Ob2RlIiwidXRpbCIsInJlcXVlc3RJbml0cyIsImhydGltZSIsIlByb2ZpbGVyIiwiYmFja2VuZFRpbWVyIiwibG9nZ2VyIiwiTG9nZ2VyIiwiaG9sZFJlc3VsdFdyYXBwZXJGbiIsInRpbWVyIiwidGVuc29yVmFscyIsImNoZWNrQ29tcHV0YXRpb25Gb3JFcnJvcnMiLCJ0aW1pbmciLCJnZXRFeHRyYVByb2ZpbGVJbmZvIiwidmFsdWVDb250YWluZXIiLCJwYWRkZWROYW1lIiwiaW5wdXRTaGFwZXNEZXNjcmlwdGlvbiIsIlNlcmlhbGl6YWJsZSIsIlNlcmlhbGl6YXRpb25NYXAiLCJjbGFzc05hbWVNYXAiLCJnZXRNYXAiLCJmcm9tQ29uZmlnIiwicmVnaXN0ZXJDbGFzcyIsInJlZ2lzdGVyIiwiZ2V0RmlsdGVyZWROb2Rlc1hUb1kiLCJ0YXBlIiwidGVuc29yc0Zyb21YIiwibm9kZXNGcm9tWCIsIm5vZGVJbnB1dHMiLCJhbnlJbnB1dEZyb21YIiwidGVuc29yc0xlYWRUb1kiLCJub2Rlc1RvWSIsInBydW5lZElucHV0cyIsIm5vZGVJbnB1dCIsInBydW5lZE5vZGUiLCJiYWNrcHJvcGFnYXRlR3JhZGllbnRzIiwidGVuc29yQWNjdW11bGF0ZWRHcmFkaWVudE1hcCIsImdyYWRUZW5zb3IiLCJpbnB1dEdyYWRpZW50cyIsImN1ckdyYWRpZW50IiwiVGVuc29yQnVmZmVyIiwibG9jcyIsInRyYWNrZXJGbiIsImRlcHJlY2F0aW9uV2FybmluZ0ZuIiwic2V0VGVuc29yVHJhY2tlciIsInNldE9wSGFuZGxlciIsInNldERlcHJlY2F0aW9uV2FybmluZ0ZuIiwiVGVuc29yIiwiaXNEaXNwb3NlZEludGVybmFsIiwicmFua1R5cGUiLCJhcnJheVN5bmMiLCJpc0Rpc3Bvc2VkIiwiZ2V0R2xvYmFsVGVuc29yQ2xhc3MiLCJWYXJpYWJsZSIsInRlbnNvcklkIiwiRnVuY3Rpb24iLCJ0ZW5zb3JUb1N0cmluZyIsInBhZFBlckNvbCIsInZhbHVlc09yVHVwbGVzIiwiY3JlYXRlQ29tcGxleFR1cGxlcyIsInZhbFRvU3RyaW5nIiwiY29tcHV0ZU1heFNpemVQZXJDb2x1bW4iLCJ2YWxzTGluZXMiLCJzdWJUZW5zb3JUb1N0cmluZyIsImxpbmVzIiwidmFsU3RyIiwicGFyc2VGbG9hdCIsImJvb2xOdW1Ub1N0cmluZyIsImlzTGFzdCIsInN0b3JhZ2VQZXJFbGVtZW50IiwiZmlyc3RWYWxzU2l6ZSIsImZpcnN0VmFscyIsImxhc3RWYWxzIiwic3Vic2hhcGUiLCJzdWJzdHJpZGVzIiwic2VwIiwibmV3TGluZVNlcCIsImNvbXBsZXhUdXBsZXMiLCJtYWtlVHlwZXNNYXRjaCIsImFzc2VydFR5cGVzTWF0Y2giLCJpc1RlbnNvckluTGlzdCIsInRlbnNvckxpc3QiLCJnZXRUZW5zb3JzSW5Db250YWluZXIiLCJsaXN0Iiwid2Fsa1RlbnNvckNvbnRhaW5lciIsInNlZW4iLCJvYmoiLCJpdGVyYWJsZSIsImluZmVyU2hhcGUiLCJmaXJzdEVsZW0iLCJkZWVwQXNzZXJ0U2hhcGVDb25zaXN0ZW5jeSIsInN1YlNoYXBlIiwiYXNzZXJ0RHR5cGUiLCJleHBlY3RlZER0eXBlIiwiYWN0dWFsRFR5cGUiLCJhcmdOYW1lIiwiZnVuY3Rpb25OYW1lIiwiY29udmVydFRvVGVuc29yIiwicGFyc2VBc0R0eXBlIiwiaW5mZXJyZWREdHlwZSIsImNvbnZlcnRUb1RlbnNvckFycmF5IiwiVEVTVF9FUFNJTE9OX0ZMT0FUMTYiLCJleHBlY3RBcnJheXNDbG9zZSIsImV4cGVjdGVkIiwidGVzdEVwc2lsb24iLCJleHBlY3RBcnJheXNQcmVkaWNhdGUiLCJhcmVDbG9zZSIsInByZWRpY2F0ZSIsImNoZWNrQ2xhc3NUeXBlIiwiYVR5cGUiLCJiVHlwZSIsImFjdHVhbFNoYXBlIiwiZXhwZWN0ZWRTaGFwZSIsImFjdHVhbEZsYXQiLCJleHBlY3RlZEZsYXQiLCJleHBlY3RQcm9taXNlVG9GYWlsIiwiZmFpbCIsImV4cGVjdEFycmF5c0VxdWFsIiwiZXhwZWN0TnVtYmVyc0Nsb3NlIiwiZXhwZWN0VmFsdWVzSW5SYW5nZSIsImV4cGVjdEFycmF5QnVmZmVyc0VxdWFsIiwiZXhwZWN0IiwidG9FcXVhbCIsImVuY29kZVN0cmluZ3MiLCJ0cmFpbiIsInNnZCIsImFkYWRlbHRhIiwiYWRhZ3JhZCIsInJtc3Byb3AiLCJhZGFtYXgiLCJhZGFtIiwiUmFuayIsIlVwY2FzdEludDMyQW5kTWFwIiwiVXBjYXN0Qm9vbEFuZE1hcCIsIlVwY2FzdEZsb2F0MzJBbmRNYXAiLCJVcGNhc3RDb21wbGV4NjRBbmRNYXAiLCJ1cGNhc3RUeXBlTWFwIiwidHlwZUEiLCJ0eXBlQiIsInN1bU91dFR5cGUiLCJub0NvbnZlcnNpb25OZWVkZWQiLCJib29sIiwic2h1ZmZsZSIsInNodWZmbGVDb21ibyIsImFycmF5MiIsInJhbmRVbmlmb3JtIiwiZGlzdFNxdWFyZWQiLCJleHByIiwiZXJyb3JNZXNzYWdlUHJlZml4IiwiYXNzZXJ0Tm9uTnVsbCIsInNraXBUeXBlZEFycmF5IiwiaXNUeXBlZEFycmF5IiwiaXNTY2FsYXJTaGFwZSIsIm4xIiwibjIiLCJlMngiLCJjcmVhdGVTaHVmZmxlZEluZGljZXMiLCJzaHVmZmxlZEluZGljZXMiLCJyZXBlYXQiLCJjaGVja0ZuIiwiZGVsYXlGbiIsIm1heENvdW50ZXIiLCJ0cnlDb3VudCIsInRyeUZuIiwibmV4dEJhY2tvZmYiLCJzaGFwZVByb2QiLCJpbXBsaWNpdElkeCIsImF4IiwiaXNFbXB0eUFycmF5IiwiY2hlY2tDb252ZXJzaW9uRm9yRXJyb3JzIiwiaXNWYWxpZER0eXBlIiwib2xkVHlwZSIsIm5ld1R5cGUiLCJieXRlc0Zyb21TdHJpbmdBcnJheSIsImlzQm9vbGVhbiIsImlzTnVtYmVyIiwiaXNGdW5jdGlvbiIsIm5lYXJlc3REaXZpc29yIiwiY3JlYXRlTmVzdGVkQXJyYXkiLCJpc0NvbXBsZXgiLCJyZXN0IiwiYWNjIiwibWFrZU9uZXNUeXBlZEFycmF5IiwiYXNzZXJ0Tm9uTmVnYXRpdmVJbnRlZ2VyRGltZW5zaW9ucyIsImlzUHJvbWlzZSIsImI2NCIsImxlbnMiLCJnZXRMZW5zIiwidmFsaWRMZW4iLCJwbGFjZUhvbGRlcnNMZW4iLCJ0b0J5dGVBcnJheSIsInRtcCIsIkFyciIsIl9ieXRlTGVuZ3RoIiwiY3VyQnl0ZSIsInJldkxvb2t1cCIsImZyb21CeXRlQXJyYXkiLCJ1aW50OCIsImV4dHJhQnl0ZXMiLCJtYXhDaHVua0xlbmd0aCIsImxlbjIiLCJlbmNvZGVDaHVuayIsImxvb2t1cCIsImJhc2U2NCIsImllZWU3NTQiLCJrTWF4TGVuZ3RoIiwiVFlQRURfQVJSQVlfU1VQUE9SVCIsInRoYXQiLCJSYW5nZUVycm9yIiwiX19wcm90b19fIiwiZW5jb2RpbmdPck9mZnNldCIsImFsbG9jVW5zYWZlIiwiZnJvbUFycmF5TGlrZSIsImZyb21BcnJheUJ1ZmZlciIsImlzRW5jb2RpbmciLCJpc0J1ZmZlciIsImNoZWNrZWQiLCJjb3B5IiwiZnJvbU9iamVjdCIsImFzc2VydFNpemUiLCJpc1ZpZXciLCJsb3dlcmVkQ2FzZSIsInV0ZjhUb0J5dGVzIiwiYmFzZTY0VG9CeXRlcyIsInNsb3dUb1N0cmluZyIsImhleFNsaWNlIiwidXRmOFNsaWNlIiwiYXNjaWlTbGljZSIsImxhdGluMVNsaWNlIiwiYmFzZTY0U2xpY2UiLCJ1dGYxNmxlU2xpY2UiLCJiaWRpcmVjdGlvbmFsSW5kZXhPZiIsImFycmF5SW5kZXhPZiIsImluZGV4U2l6ZSIsImFyckxlbmd0aCIsInZhbExlbmd0aCIsInJlYWRVSW50MTZCRSIsImZvdW5kSW5kZXgiLCJoZXhXcml0ZSIsInJlbWFpbmluZyIsInN0ckxlbiIsInBhcnNlZCIsInBhcnNlSW50IiwidXRmOFdyaXRlIiwiYmxpdEJ1ZmZlciIsImFzY2lpV3JpdGUiLCJieXRlQXJyYXkiLCJhc2NpaVRvQnl0ZXMiLCJsYXRpbjFXcml0ZSIsImJhc2U2NFdyaXRlIiwidWNzMldyaXRlIiwidW5pdHMiLCJoaSIsImxvIiwidXRmMTZsZVRvQnl0ZXMiLCJzZWNvbmRCeXRlIiwidGhpcmRCeXRlIiwiZm91cnRoQnl0ZSIsInRlbXBDb2RlUG9pbnQiLCJmaXJzdEJ5dGUiLCJjb2RlUG9pbnQiLCJieXRlc1BlclNlcXVlbmNlIiwiY29kZVBvaW50cyIsIk1BWF9BUkdVTUVOVFNfTEVOR1RIIiwiZGVjb2RlQ29kZVBvaW50c0FycmF5IiwiU2xvd0J1ZmZlciIsImFsbG9jIiwiSU5TUEVDVF9NQVhfQllURVMiLCJmb28iLCJ0eXBlZEFycmF5U3VwcG9ydCIsInBvb2xTaXplIiwiX2F1Z21lbnQiLCJzcGVjaWVzIiwiYWxsb2NVbnNhZmVTbG93IiwiX2lzQnVmZmVyIiwiY29tcGFyZSIsInBvcyIsInN3YXAxNiIsInN3YXAzMiIsInN3YXA2NCIsImVxdWFscyIsImluc3BlY3QiLCJ0aGlzU3RhcnQiLCJ0aGlzRW5kIiwidGhpc0NvcHkiLCJ0YXJnZXRDb3B5IiwiaW5jbHVkZXMiLCJ0b0pTT04iLCJfYXJyIiwidG9IZXgiLCJjaGVja09mZnNldCIsImNoZWNrSW50Iiwib2JqZWN0V3JpdGVVSW50MTYiLCJsaXR0bGVFbmRpYW4iLCJvYmplY3RXcml0ZVVJbnQzMiIsImNoZWNrSUVFRTc1NCIsIndyaXRlRmxvYXQiLCJub0Fzc2VydCIsIndyaXRlRG91YmxlIiwibmV3QnVmIiwic2xpY2VMZW4iLCJyZWFkVUludExFIiwicmVhZFVJbnRCRSIsInJlYWRVSW50OCIsInJlYWRVSW50MTZMRSIsInJlYWRVSW50MzJMRSIsInJlYWRVSW50MzJCRSIsInJlYWRJbnRMRSIsInJlYWRJbnRCRSIsInJlYWRJbnQ4IiwicmVhZEludDE2TEUiLCJyZWFkSW50MTZCRSIsInJlYWRJbnQzMkxFIiwicmVhZEludDMyQkUiLCJyZWFkRmxvYXRMRSIsInJlYWRGbG9hdEJFIiwicmVhZERvdWJsZUxFIiwicmVhZERvdWJsZUJFIiwid3JpdGVVSW50TEUiLCJ3cml0ZVVJbnRCRSIsIndyaXRlVUludDgiLCJ3cml0ZVVJbnQxNkxFIiwid3JpdGVVSW50MTZCRSIsIndyaXRlVUludDMyTEUiLCJ3cml0ZVVJbnQzMkJFIiwid3JpdGVJbnRMRSIsImxpbWl0Iiwid3JpdGVJbnRCRSIsIndyaXRlSW50OCIsIndyaXRlSW50MTZMRSIsIndyaXRlSW50MTZCRSIsIndyaXRlSW50MzJMRSIsIndyaXRlSW50MzJCRSIsIndyaXRlRmxvYXRMRSIsIndyaXRlRmxvYXRCRSIsIndyaXRlRG91YmxlTEUiLCJ3cml0ZURvdWJsZUJFIiwidGFyZ2V0U3RhcnQiLCJJTlZBTElEX0JBU0U2NF9SRSIsImxlYWRTdXJyb2dhdGUiLCJzdHJpbmd0cmltIiwiYmFzZTY0Y2xlYW4iLCJpc0xFIiwibUxlbiIsIm5CeXRlcyIsImVMZW4iLCJlTWF4IiwiZUJpYXMiLCJuQml0cyIsInJ0IiwiTE4yIiwiSW5zdGFuY2UiLCJ1bnNpZ25lZCIsImlzTG9uZyIsIl9faXNMb25nX18iLCJJTlRfQ0FDSEUiLCJVSU5UX0NBQ0hFIiwiZnJvbUludCIsImNhY2hlZE9iaiIsImNhY2hlIiwiZnJvbUJpdHMiLCJaRVJPIiwiVFdPX1BXUl82NF9EQkwiLCJNQVhfVU5TSUdORURfVkFMVUUiLCJUV09fUFdSXzYzX0RCTCIsIk1JTl9WQUxVRSIsIk1BWF9WQUxVRSIsIlRXT19QV1JfMzJfREJMIiwibG93Qml0cyIsImhpZ2hCaXRzIiwicG93X2RibCIsInJhZGl4IiwicmFkaXhUb1Bvd2VyIiwicG93ZXIiLCJmcm9tVmFsdWUiLCJUV09fUFdSXzE2X0RCTCIsIlRXT19QV1JfMjQiLCJPTkUiLCJVT05FIiwiTkVHX09ORSIsIkxvbmdQcm90b3R5cGUiLCJ0b0ludCIsInRvTnVtYmVyIiwiaXNaZXJvIiwiaXNOZWdhdGl2ZSIsImVxIiwicmFkaXhMb25nIiwicmVtMSIsInJlbURpdiIsImRpZ2l0cyIsImdldEhpZ2hCaXRzIiwiZ2V0SGlnaEJpdHNVbnNpZ25lZCIsImdldExvd0JpdHMiLCJnZXROdW1CaXRzQWJzIiwiYml0IiwiZXF6IiwiaXNQb3NpdGl2ZSIsImlzT2RkIiwib3RoZXIiLCJub3RFcXVhbHMiLCJuZXEiLCJuZSIsImxlc3NUaGFuIiwiY29tcCIsImx0IiwibGVzc1RoYW5PckVxdWFsIiwibHRlIiwibGUiLCJncmVhdGVyVGhhbiIsImd0IiwiZ3JlYXRlclRoYW5PckVxdWFsIiwiZ3RlIiwiZ2UiLCJ0aGlzTmVnIiwib3RoZXJOZWciLCJuZWdhdGUiLCJub3QiLCJhZGRlbmQiLCJhNDgiLCJhMzIiLCJhMTYiLCJhMDAiLCJiNDgiLCJiMzIiLCJiMTYiLCJjNDgiLCJjMzIiLCJjMTYiLCJjMDAiLCJzdWJ0cmFjdCIsInN1YnRyYWhlbmQiLCJnZXRfaGlnaCIsImIwMCIsImRpdmlkZSIsImFwcHJveCIsImRpdl91IiwiZGl2X3MiLCJ0b1Vuc2lnbmVkIiwic2hyIiwiYXBwcm94UmVzIiwiYXBwcm94UmVtIiwicmVtX3UiLCJyZW1fcyIsInNoaWZ0TGVmdCIsIm51bUJpdHMiLCJzaGlmdFJpZ2h0Iiwic2hpZnRSaWdodFVuc2lnbmVkIiwic2hyX3UiLCJ0b1NpZ25lZCIsInRvQnl0ZXMiLCJ0b0J5dGVzTEUiLCJ0b0J5dGVzQkUiLCJmcm9tQnl0ZXNMRSIsImZyb21CeXRlc0JFIiwiY2FjaGVkU2V0VGltZW91dCIsImNhY2hlZENsZWFyVGltZW91dCIsImRlZmF1bHRTZXRUaW1vdXQiLCJkZWZhdWx0Q2xlYXJUaW1lb3V0IiwicnVuVGltZW91dCIsImZ1biIsImNsZWFyVGltZW91dCIsImN1cnJlbnRRdWV1ZSIsInF1ZXVlIiwiZHJhaW5pbmciLCJxdWV1ZUluZGV4IiwiY2xlYW5VcE5leHRUaWNrIiwiZHJhaW5RdWV1ZSIsIm1hcmtlciIsInJ1bkNsZWFyVGltZW91dCIsIkl0ZW0iLCJub29wIiwibmV4dFRpY2siLCJ0aXRsZSIsImJyb3dzZXIiLCJhZGRMaXN0ZW5lciIsIm9uY2UiLCJvZmYiLCJyZW1vdmVMaXN0ZW5lciIsInJlbW92ZUFsbExpc3RlbmVycyIsImVtaXQiLCJwcmVwZW5kTGlzdGVuZXIiLCJwcmVwZW5kT25jZUxpc3RlbmVyIiwibGlzdGVuZXJzIiwiYmluZGluZyIsImN3ZCIsImNoZGlyIiwidW1hc2siLCJhbGVhIiwieG9yMTI4IiwieG9yd293IiwieG9yc2hpZnQ3IiwieG9yNDA5NiIsInR5Y2hlaSIsInNyIiwiZGVmaW5lIiwiQWxlYSIsIm1lIiwibWFzaCIsInMwIiwiczEiLCJzMiIsImltcGwiLCJ4ZyIsInBybmciLCJpbnQzMiIsInF1aWNrIiwiWG9yR2VuIiwic3Ryc2VlZCIsIlgiLCJtYXRoIiwibm9kZWNyeXB0byIsInN0YXJ0ZGVub20iLCJzaWduaWZpY2FuY2UiLCJvdmVyZmxvdyIsInNlZWRyYW5kb20iLCJvcHRpb25zIiwic2hvcnRzZWVkIiwibWl4a2V5IiwiZW50cm9weSIsInRvc3RyaW5nIiwicmFuZG9tQnl0ZXMiLCJjcnlwdG8iLCJtc0NyeXB0byIsImdldFJhbmRvbVZhbHVlcyIsInBsdWdpbnMiLCJhdXRvc2VlZCIsImFyYzQiLCJBUkM0IiwiUyIsInBhc3MiLCJpc19tYXRoX2NhbGwiLCJrZXlsZW4iLCJwcm9wIiwidHlwIiwic21lYXIiLCJzdHJpbmdzZWVkIiwicmVnaXN0ZXJJbW1lZGlhdGUiLCJodG1sIiwibWVzc2FnZVByZWZpeCIsIm9uR2xvYmFsTWVzc2FnZSIsIm5leHRIYW5kbGUiLCJ0YXNrc0J5SGFuZGxlIiwiY3VycmVudGx5UnVubmluZ0FUYXNrIiwiZG9jIiwiYXR0YWNoVG8iLCJnZXRQcm90b3R5cGVPZiIsInJ1bklmUHJlc2VudCIsInBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXMiLCJvbGRPbk1lc3NhZ2UiLCJjYW5Vc2VQb3N0TWVzc2FnZSIsInBvcnQyIiwiZG9jdW1lbnRFbGVtZW50Iiwic2NyaXB0Iiwib25yZWFkeXN0YXRlY2hhbmdlIiwicmVtb3ZlQ2hpbGQiLCJhcHBlbmRDaGlsZCIsImF0dGFjaEV2ZW50IiwidGFzayIsImNsZWFySW1tZWRpYXRlIiwiVGltZW91dCIsImNsZWFyRm4iLCJfaWQiLCJfY2xlYXJGbiIsInNjb3BlIiwic2V0SW50ZXJ2YWwiLCJ1bnJlZiIsInJlZiIsImVucm9sbCIsIl9pZGxlVGltZW91dElkIiwiX2lkbGVUaW1lb3V0IiwidW5lbnJvbGwiLCJfdW5yZWZBY3RpdmUiLCJhY3RpdmUiLCJfb25UaW1lb3V0IiwiX193ZWJwYWNrX2FtZF9vcHRpb25zX18iLCJ3ZWJwYWNrUG9seWZpbGwiLCJkZXByZWNhdGUiLCJjaGlsZHJlbiIsIm1sIiwiTUwiLCJNTENvbnRleHQiLCJNTEdyYXBoQnVpbGRlciIsIk1MR3JhcGgiLCJNTE9wZXJhbmQiLCJNTFBvd2VyUHJlZmVyZW5jZSIsIk1MRGV2aWNlUHJlZmVyZW5jZSIsIm9wdGlvbnNfIiwiRXhlY3V0aW9uQ29udGV4dCIsImNvbnN0YW50VGVuc29ycyIsImlucHV0T3BlcmFuZHMiLCJvcGVyYW5kUmVmcyIsImNvbnN0YW50VGVub3Nyc18iLCJvcGVyYW5kUmVmc18iLCJhbGxvY2F0ZUlucHV0VGVuc29ycyIsIm91dHB1dFRlbnNvcnNfIiwib3V0cHV0T3BlcmFuZHNfIiwiaW5wdXRUZW5zb3JzXyIsImlucHV0T3BlcmFuZCIsImRlc2MiLCJyZXNvdXJjZSIsImRpbWVuc2lvbnMiLCJvdXRwdXRUZW5zb3JzIiwib3V0cHV0TmFtZSIsImdldFRlbnNvciIsInNldE91dHB1dFRlbnNvciIsInJlbGVhc2VUZW5zb3IiLCJvcGVyYW5kIiwib3BlcmFuZFRlbnNvck1hcCIsIm9wZXJhbmRUZW5zb3IiLCJpbnB1dHNfIiwib3V0cHV0c18iLCJjb25zdGFudHNfIiwiY29uc3RhbnRUZW5zb3JzXyIsInZhbGlkYXRlSW5wdXRzIiwib3V0cHV0T3BlcmFuZHMiLCJncmFwaCIsImJ1aWxkIiwiY29tcGlsZSIsInZpc2l0ZWRPcHMiLCJidWlsZE9wZXJhdGlvbiIsImFsbG9jYXRlQ29uc3RhbnRzIiwiY29tcHV0ZU9uY2UiLCJjb25zdGFudCIsImRpc3Bvc2VPcGVyYXRpb24iLCJNTElucHV0T3BlcmFuZExheW91dCIsIk1MRmlsdGVyT3BlcmFuZExheW91dCIsIk1MQXV0b1BhZCIsIk1MUmVjdXJyZW50TmV0d29ya1dlaWdodExheW91dCIsIk1MUmVjdXJyZW50TmV0d29ya0RpcmVjdGlvbiIsIk1MUGFkZGluZ01vZGUiLCJNTEludGVycG9sYXRpb25Nb2RlIiwiY29udGV4dF8iLCJidWlsZEFuZENvbXBpbGUiLCJkZXNjT3JWYWx1ZSIsInZhbHVlT3JUeXBlIiwiZmxvYXQzMiIsImNyZWF0ZVNjYWxhciIsImNyZWF0ZVRlbnNvciIsImJhdGNoTm9ybWFsaXphdGlvbiIsInZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIiLCJnZXRGdXNlZE91dHB1dHMiLCJvcGVyYW5kT3JPcHRpb25zIiwibWluVmFsdWUiLCJoYXJkU3dpc2giLCJnZW1tIiwiZ3J1IiwicmVjdXJyZW50V2VpZ2h0IiwiaGlkZGVuU2l6ZSIsInJlY3VycmVudEJpYXMiLCJpbml0aWFsSGlkZGVuU3RhdGUiLCJncnVDZWxsIiwiaGlkZGVuU3RhdGUiLCJpbnN0YW5jZU5vcm1hbGl6YXRpb24iLCJtYXRtdWwiLCJwYWRkaW5nIiwiYXZlcmFnZVBvb2wyZCIsImwyUG9vbDJkIiwibWF4UG9vbDJkIiwicmVkdWNlTDEiLCJyZWR1Y2VMMiIsInJlZHVjZUxvZ1N1bUV4cCIsInJlZHVjZU1heCIsInJlZHVjZU1lYW4iLCJyZWR1Y2VNaW4iLCJyZWR1Y2VQcm9kdWN0IiwicmVkdWNlU3VtIiwicmVzYW1wbGUiLCJzdGFydHMiLCJzaXplcyIsIm9wZXJhbmRzIiwiYnVpbGRlciIsIk1MT3BlcmFuZFR5cGUiLCJidWlsZGVyXyIsIklucHV0T3BlcmFuZCIsIkNvbnN0YW50T3BlcmFuZCIsIk91dHB1dE9wZXJhbmQiLCJPcGVyYXRpb24iLCJpbnB1dFRlbnNvcnMiLCJjb21wdXRlSW1wbCIsIlNpbmdsZU91dHB1dE9wZXJhdGlvbiIsImNyZWF0ZU91dHB1dCIsIkJhdGNoTm9ybWFsaXphdGlvbiIsImlucHV0XyIsInZhcmlhbmNlXyIsInNjYWxlXyIsImJpYXNfIiwiYXhpc18iLCJlcHNpbG9uXyIsImFjdGl2YXRpb25fIiwiQmluYXJ5IiwiYV8iLCJiXyIsInJ1bk9wIiwiTXVsIiwiRGl2IiwiTWF0TXVsIiwiQ2xhbXAiLCJ4XyIsIm1pbk9wZXJhbmRfIiwibWluU2NhbGFyVmFsdWVfIiwiZ2V0U2NhbGFyVmFsdWUiLCJtYXhPcGVyYW5kXyIsIm1heFNjYWxhclZhbHVlXyIsIm1pbnVzIiwibWluQ29uc3RhbnQiLCJDb252MmQiLCJmaWx0ZXJfIiwiYXV0b1BhZCIsImV4cGxpY2l0IiwiaW5pdE9wdGlvbnMiLCJncm91cHMiLCJpbnB1dExheW91dCIsImZpbHRlckxheW91dCIsIm91dHB1dFBhZGRpbmciLCJvdXRwdXRTaXplcyIsIm5jaHciLCJvaWh3IiwicGFkZGluZ18iLCJzdHJpZGVzXyIsImRpbGF0aW9uc18iLCJncm91cHNfIiwiaW5wdXRMYXlvdXRfIiwiZmlsdGVyTGF5b3V0XyIsImF1dG9QYWRfIiwib3V0cHV0UGFkZGluZ18iLCJvdXRwdXRTaXplc18iLCJmdXNlZEFjdGl2YXRpb25fIiwiaXNSZWx1NiIsImxlYWt5cmVsdUFscGhhXyIsIm1pblNjYWxhclZhbHVlIiwibWF4U2NhbGFyVmFsdWUiLCJmdXNlZCIsImZpbHRlclRlbnNvcl8iLCJvaHdpIiwiaWh3byIsImh3aW8iLCJmdXNlZERlcHRod2lzZVBhZCIsIkdlbW0iLCJhVHJhbnNwb3NlIiwiYlRyYW5zcG9zZSIsImFiIiwiR3J1Iiwid2VpZ2h0XyIsInJlY3VycmVudFdlaWdodF8iLCJzdGVwc18iLCJoaWRkZW5TaXplXyIsInJlc2V0QWZ0ZXIiLCJyZXR1cm5TZXF1ZW5jZSIsImRpcmVjdGlvbiIsImxheW91dCIsImFjdGl2YXRpb25zIiwicmV0dXJuU2VxdWVuY2VfIiwiZm9yd2FyZCIsInpybiIsInJlY3VycmVudEJpYXNfIiwiaW5pdGlhbEhpZGRlblN0YXRlXyIsInJlc2V0QWZ0ZXJfIiwiZGlyZWN0aW9uXyIsImxheW91dF8iLCJhY3RpdmF0aW9uc18iLCJudW1EaXJlY3Rpb25zIiwiYm90aCIsInNlcXVlbmNlIiwiY2VsbFdlaWdodCIsImNlbGxSZWN1cnJlbnRXZWlnaHQiLCJjZWxsQmlhcyIsImNlbGxSZWN1cnJlbnRCaWFzIiwic2xvdCIsImNlbGxIaWRkZW4iLCJjZWxsT3V0cHV0IiwiYmFja3dhcmQiLCJjZWxsSW5wdXQiLCJHcnVDZWxsIiwiaGlkZGVuU3RhdGVfIiwiYWN0aXZhdGlvbjAiLCJhY3RpdmF0aW9uMSIsIkluc3RhbmNlTm9ybWFsaXphdGlvbiIsIm5od2MiLCJzY2FsZWQiLCJhbHBoYV8iLCJQYWQiLCJtb2RlXyIsInZhbHVlXyIsInBhZGRpbmdBcnJheSIsImVkZ2UiLCJlZGdlUGFkZGluZ3MiLCJwYWRkZWQiLCJyZWZsZWN0aW9uIiwic3ltbWV0cmljIiwid2luZG93RGltZW5zaW9ucyIsIndpbmRvd0RpbWVuc2lvbnNfIiwiZ2V0UG9vbGluZ1R5cGUiLCJ0b3RhbFBhZGRpbmciLCJBdmVyYWdlUG9vbDJkIiwiTWF4UG9vbDJkIiwiTDJQb29sMmQiLCJSZWR1Y2UiLCJheGVzXyIsImtlZXBEaW1lbnNpb25zIiwia2VlcERpbWVuc2lvbnNfIiwiUmVkdWNlTG9nU3VtRXhwIiwiUmVkdWNlTWF4IiwiUmVkdWNlTWVhbiIsIlJlZHVjZU1pbiIsIlJlZHVjZVByb2R1Y3QiLCJSZWR1Y2VTdW0iLCJSZWR1Y2VMMSIsIlJlZHVjZUwyIiwiUmVzYW1wbGUiLCJzY2FsZXMiLCJzY2FsZXNfIiwic2l6ZXNfIiwibmV3U2hhcGVfIiwic3RhcnRzXyIsIlNwbGl0Iiwic3BsaXRzXyIsIlNxdWVlemUiLCJwZXJtdXRhdGlvbl8iLCJVbmFyeSIsIlVuYXJ5TUxPcGVyYXRvciIsIkhhcmRTd2lzaCIsImlzSW50ZWdlckFycmF5IiwiZ2V0VHlwZWRBcnJheSIsImNsb25lVHlwZWRBcnJheSIsImdldERhdGFUeXBlIiwiY3JlYXRlT3BlcmFuZERlc2NyaXB0b3JGcm9tVGVuc29yIiwidmFsaWRhdGVPcGVyYW5kRGVzY3JpcHRvciIsImlzRHlhbm1pY1NoYXBlIiwidmFsaWRhdGVUeXBlZEFycmF5Iiwic2l6ZUZyb21EaW1lbnNpb25zIiwidmFsaWRhdGVWYWx1ZVR5cGUiLCJ1aW50MzIiLCJpbnQ4IiwiY2xvbmVkQXJyYXkiLCJjdXJyZW50VmFsdWUiLCJ2YWxpZGF0ZU9wZXJhbmQiLCJ2YWxpZGF0ZU9wdGlvbmFsT3BlcmFuZCIsInZhbGlkYXRlQXhlcyIsImdldFBhZGRpbmdzIiwicmVzdWx0UGFkZGluZyJdLCJtYXBwaW5ncyI6ImFBQ0UsSUFBSUEsRUFBbUIsR0FHdkIsU0FBU0MsRUFBb0JDLEdBRzVCLEdBQUdGLEVBQWlCRSxHQUNuQixPQUFPRixFQUFpQkUsR0FBVUMsUUFHbkMsSUFBSUMsRUFBU0osRUFBaUJFLEdBQVksQ0FDekNHLEVBQUdILEVBQ0hJLEdBQUcsRUFDSEgsUUFBUyxJQVVWLE9BTkFJLEVBQVFMLEdBQVVNLEtBQUtKLEVBQU9ELFFBQVNDLEVBQVFBLEVBQU9ELFFBQVNGLEdBRy9ERyxFQUFPRSxHQUFJLEVBR0pGLEVBQU9ELFFBS2ZGLEVBQW9CUSxFQUFJRixFQUd4Qk4sRUFBb0JTLEVBQUlWLEVBR3hCQyxFQUFvQlUsRUFBSSxTQUFTUixFQUFTUyxFQUFNQyxHQUMzQ1osRUFBb0JhLEVBQUVYLEVBQVNTLElBQ2xDRyxPQUFPQyxlQUFlYixFQUFTUyxFQUFNLENBQUVLLFlBQVksRUFBTUMsSUFBS0wsS0FLaEVaLEVBQW9Ca0IsRUFBSSxTQUFTaEIsR0FDWCxvQkFBWGlCLFFBQTBCQSxPQUFPQyxhQUMxQ04sT0FBT0MsZUFBZWIsRUFBU2lCLE9BQU9DLFlBQWEsQ0FBRUMsTUFBTyxXQUU3RFAsT0FBT0MsZUFBZWIsRUFBUyxhQUFjLENBQUVtQixPQUFPLEtBUXZEckIsRUFBb0JzQixFQUFJLFNBQVNELEVBQU9FLEdBRXZDLEdBRFUsRUFBUEEsSUFBVUYsRUFBUXJCLEVBQW9CcUIsSUFDL0IsRUFBUEUsRUFBVSxPQUFPRixFQUNwQixHQUFXLEVBQVBFLEdBQThCLGlCQUFWRixHQUFzQkEsR0FBU0EsRUFB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SyxHQUFHLEtBQUssR0FBRyxLQUFLLElBQUksS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssRUFBRSxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxJQUFJLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssSUFBSSxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLE9BQU8sT0FBTyxLQUFLLEdBQUcsS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLElBQUksS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLE9BQU8sRUFBRSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssRUFBRSxLQUFLLElBQUksS0FBSyxFQUFFLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxHQUFHLEtBQUssR0FBRyxPQUFPLEVBQUUsS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssRUFBRSxPQUFPLEtBQUssS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsT0FB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RUFBRyxHQUN4QixJQUFLLElBQUk3MEwsRUFBSSxFQUFHQSxFQUFJLElBQUtBLEVBQ3ZCNjBMLEVBQVk3MEwsR0FBS3lHLEtBQUt5UixLQUFLNUssRUFBTTNLLE1BQU0sRUFBSTNDLEdBQUtpTSxFQUFRak0sSUFFMUQsTUFBTTI1TCxFQUFpQyxDQUFDLEVBQUcsR0FDM0MsSUFBSyxJQUFJMzVMLEVBQUksRUFBR0EsRUFBSSxJQUFLQSxFQUN2QjI1TCxFQUFhMzVMLEdBQUtpTSxFQUFRak0sSUFBTTYwTCxFQUFZNzBMLEdBQUssR0FBSzQwTCxFQUFjNTBMLEtBQzlEcVosRUFBTzFXLE1BQU0zQyxHQUFLLEdBQUsyYSxFQUFVM2EsR0FBSyxHQUFLc04sRUFBTTNLLE1BQU0sRUFBSTNDLEdBRW5FLElBQUssSUFBSUEsRUFBSSxFQUFHQSxFQUFJLElBQUtBLEVBQ3ZCMDhMLEVBQWMxOEwsRUFBSSxHQUFHLEdBQ2pCMjVMLEVBQWEzNUwsR0FBS3lHLEtBQUttSixNQUFNK3BMLEVBQWEzNUwsR0FBSyxHQUNuRDA4TCxFQUFjMThMLEVBQUksR0FBRyxHQUFLeUcsS0FBS21KLE1BQU0rcEwsRUFBYTM1TCxHQUFLLEdBSTdELE9BQU8wOEwsSSIsImZpbGUiOiJ3ZWJubi1wb2x5ZmlsbC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAwKTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgYnVmZmVyLCBEYXRhU3RvcmFnZSwgZW5naW5lLCBlbnYsIGtlcm5lbF9pbXBscywgS2VybmVsQmFja2VuZCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5jb25zdCB3aGVyZUltcGwgPSBrZXJuZWxfaW1wbHMud2hlcmVJbXBsO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4vY3B1X3V0aWwnO1xuZXhwb3J0IGNsYXNzIE1hdGhCYWNrZW5kQ1BVIGV4dGVuZHMgS2VybmVsQmFja2VuZCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuYmxvY2tTaXplID0gNDg7XG4gICAgICAgIHRoaXMuZmlyc3RVc2UgPSB0cnVlO1xuICAgICAgICB0aGlzLmRhdGEgPSBuZXcgRGF0YVN0b3JhZ2UodGhpcywgZW5naW5lKCkpO1xuICAgIH1cbiAgICBuZXh0RGF0YUlkKCkge1xuICAgICAgICByZXR1cm4gTWF0aEJhY2tlbmRDUFUubmV4dERhdGFJZCsrO1xuICAgIH1cbiAgICB3cml0ZSh2YWx1ZXMsIHNoYXBlLCBkdHlwZSkge1xuICAgICAgICBpZiAodGhpcy5maXJzdFVzZSkge1xuICAgICAgICAgICAgdGhpcy5maXJzdFVzZSA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKGVudigpLmdldCgnSVNfTk9ERScpKSB7XG4gICAgICAgICAgICAgICAgYmFja2VuZF91dGlsLndhcm4oJ1xcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT1cXG4nICtcbiAgICAgICAgICAgICAgICAgICAgJ0hpIHRoZXJlIPCfkYsuIExvb2tzIGxpa2UgeW91IGFyZSBydW5uaW5nIFRlbnNvckZsb3cuanMgaW4gJyArXG4gICAgICAgICAgICAgICAgICAgICdOb2RlLmpzLiBUbyBzcGVlZCB0aGluZ3MgdXAgZHJhbWF0aWNhbGx5LCBpbnN0YWxsIG91ciBub2RlICcgK1xuICAgICAgICAgICAgICAgICAgICAnYmFja2VuZCwgd2hpY2ggYmluZHMgdG8gVGVuc29yRmxvdyBDKyssIGJ5IHJ1bm5pbmcgJyArXG4gICAgICAgICAgICAgICAgICAgICducG0gaSBAdGVuc29yZmxvdy90ZmpzLW5vZGUsICcgK1xuICAgICAgICAgICAgICAgICAgICAnb3IgbnBtIGkgQHRlbnNvcmZsb3cvdGZqcy1ub2RlLWdwdSBpZiB5b3UgaGF2ZSBDVURBLiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ1RoZW4gY2FsbCByZXF1aXJlKFxcJ0B0ZW5zb3JmbG93L3RmanMtbm9kZVxcJyk7ICgtZ3B1ICcgK1xuICAgICAgICAgICAgICAgICAgICAnc3VmZml4IGZvciBDVURBKSBhdCB0aGUgc3RhcnQgb2YgeW91ciBwcm9ncmFtLiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ1Zpc2l0IGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RmanMtbm9kZSBmb3IgbW9yZSBkZXRhaWxzLicgK1xuICAgICAgICAgICAgICAgICAgICAnXFxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGFJZCA9IHsgaWQ6IHRoaXMubmV4dERhdGFJZCgpIH07XG4gICAgICAgIHRoaXMuZGF0YS5zZXQoZGF0YUlkLCB7IHZhbHVlcywgZHR5cGUsIHJlZkNvdW50OiAxIH0pO1xuICAgICAgICByZXR1cm4gZGF0YUlkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBkYXRhIGJ1Y2tldCBpbiBjcHUgYmFja2VuZC5cbiAgICAgKiBAcGFyYW0gc2hhcGUgU2hhcGUgb2YgdGhlIGBUZW5zb3JJbmZvYC5cbiAgICAgKiBAcGFyYW0gZHR5cGUgRFR5cGUgb2YgdGhlIGBUZW5zb3JJbmZvYC5cbiAgICAgKiBAcGFyYW0gdmFsdWVzIFRoZSB2YWx1ZSBvZiB0aGUgYFRlbnNvckluZm9gIHN0b3JlZCBhcyBhIGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKi9cbiAgICBtYWtlVGVuc29ySW5mbyhzaGFwZSwgZHR5cGUsIHZhbHVlcykge1xuICAgICAgICBsZXQgb3V0SWQ7XG4gICAgICAgIGlmIChkdHlwZSA9PT0gJ3N0cmluZycgJiYgdmFsdWVzICE9IG51bGwgJiYgdmFsdWVzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgIHV0aWwuaXNTdHJpbmcodmFsdWVzWzBdKSkge1xuICAgICAgICAgICAgY29uc3QgZW5jb2RlZFZhbHVlcyA9IHZhbHVlcy5tYXAoZCA9PiB1dGlsLmVuY29kZVN0cmluZyhkKSk7XG4gICAgICAgICAgICBvdXRJZCA9IHRoaXMud3JpdGUoZW5jb2RlZFZhbHVlcywgc2hhcGUsIGR0eXBlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG91dElkID0gdGhpcy53cml0ZSh2YWx1ZXMsIHNoYXBlLCBkdHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZGF0YUlkOiBvdXRJZCwgc2hhcGUsIGR0eXBlIH07XG4gICAgfVxuICAgIC8qKiBSZXR1cm4gcmVmQ291bnQgb2YgYSBgVGVuc29yRGF0YWAuICovXG4gICAgcmVmQ291bnQoZGF0YUlkKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGEuaGFzKGRhdGFJZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHRlbnNvckRhdGEgPSB0aGlzLmRhdGEuZ2V0KGRhdGFJZCk7XG4gICAgICAgICAgICByZXR1cm4gdGVuc29yRGF0YS5yZWZDb3VudDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgLyoqIEluY3JlYXNlIHJlZkNvdW50IG9mIGEgYFRlbnNvckRhdGFgLiAqL1xuICAgIGluY1JlZihkYXRhSWQpIHtcbiAgICAgICAgY29uc3QgdGVuc29yRGF0YSA9IHRoaXMuZGF0YS5nZXQoZGF0YUlkKTtcbiAgICAgICAgdGVuc29yRGF0YS5yZWZDb3VudCsrO1xuICAgIH1cbiAgICAvKiogRGVjcmVhc2UgcmVmQ291bnQgb2YgYSBgVGVuc29yRGF0YWAuICovXG4gICAgZGVjUmVmKGRhdGFJZCkge1xuICAgICAgICBpZiAodGhpcy5kYXRhLmhhcyhkYXRhSWQpKSB7XG4gICAgICAgICAgICBjb25zdCB0ZW5zb3JEYXRhID0gdGhpcy5kYXRhLmdldChkYXRhSWQpO1xuICAgICAgICAgICAgdGVuc29yRGF0YS5yZWZDb3VudC0tO1xuICAgICAgICB9XG4gICAgfVxuICAgIG1vdmUoZGF0YUlkLCB2YWx1ZXMsIHNoYXBlLCBkdHlwZSwgcmVmQ291bnQpIHtcbiAgICAgICAgdGhpcy5kYXRhLnNldChkYXRhSWQsIHsgdmFsdWVzLCBkdHlwZSwgcmVmQ291bnQgfSk7XG4gICAgfVxuICAgIG51bURhdGFJZHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEubnVtRGF0YUlkcygpO1xuICAgIH1cbiAgICBhc3luYyByZWFkKGRhdGFJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkU3luYyhkYXRhSWQpO1xuICAgIH1cbiAgICByZWFkU3luYyhkYXRhSWQpIHtcbiAgICAgICAgY29uc3QgeyBkdHlwZSwgY29tcGxleFRlbnNvckluZm9zIH0gPSB0aGlzLmRhdGEuZ2V0KGRhdGFJZCk7XG4gICAgICAgIGlmIChkdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlYWxWYWx1ZXMgPSB0aGlzLnJlYWRTeW5jKGNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsLmRhdGFJZCk7XG4gICAgICAgICAgICBjb25zdCBpbWFnVmFsdWVzID0gdGhpcy5yZWFkU3luYyhjb21wbGV4VGVuc29ySW5mb3MuaW1hZy5kYXRhSWQpO1xuICAgICAgICAgICAgcmV0dXJuIGJhY2tlbmRfdXRpbC5tZXJnZVJlYWxBbmRJbWFnQXJyYXlzKHJlYWxWYWx1ZXMsIGltYWdWYWx1ZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuZ2V0KGRhdGFJZCkudmFsdWVzO1xuICAgIH1cbiAgICBidWZmZXJTeW5jKHQpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMucmVhZFN5bmModC5kYXRhSWQpO1xuICAgICAgICBsZXQgZGVjb2RlZERhdGEgPSBkYXRhO1xuICAgICAgICBpZiAodC5kdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8gRGVjb2RlIHRoZSBieXRlcyBpbnRvIHN0cmluZy5cbiAgICAgICAgICAgICAgICBkZWNvZGVkRGF0YSA9IGRhdGEubWFwKGQgPT4gdXRpbC5kZWNvZGVTdHJpbmcoZCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZGVjb2RlIGVuY29kZWQgc3RyaW5nIGJ5dGVzIGludG8gdXRmLTgnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVmZmVyKHQuc2hhcGUsIHQuZHR5cGUsIGRlY29kZWREYXRhKTtcbiAgICB9XG4gICAgbWFrZU91dHB1dCh2YWx1ZXMsIHNoYXBlLCBkdHlwZSkge1xuICAgICAgICBjb25zdCBkYXRhSWQgPSB0aGlzLndyaXRlKHZhbHVlcywgc2hhcGUsIGR0eXBlKTtcbiAgICAgICAgcmV0dXJuIGVuZ2luZSgpLm1ha2VUZW5zb3JGcm9tRGF0YUlkKGRhdGFJZCwgc2hhcGUsIGR0eXBlLCB0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGlzcG9zZSB0aGUgbWVtb3J5IGlmIHRoZSBkYXRhSWQgaGFzIDAgcmVmQ291bnQuIFJldHVybiB0cnVlIGlmIHRoZSBtZW1vcnlcbiAgICAgKiBpcyByZWxlYXNlZCBvciBtZW1vcnkgaXMgbm90IG1hbmFnZWQgaW4gdGhpcyBiYWNrZW5kLCBmYWxzZSBpZiBtZW1vcnkgaXNcbiAgICAgKiBub3QgY2xlYXJlZC5cbiAgICAgKiBAcGFyYW0gZGF0YUlkXG4gICAgICogQG9hcmFtIGZvcmNlIE9wdGlvbmFsLCByZW1vdmUgdGhlIGRhdGEgcmVnYXJkbGVzcyBvZiByZWZDb3VudFxuICAgICAqL1xuICAgIGRpc3Bvc2VEYXRhKGRhdGFJZCwgZm9yY2UgPSBmYWxzZSkge1xuICAgICAgICBpZiAodGhpcy5kYXRhLmhhcyhkYXRhSWQpKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGEuZ2V0KGRhdGFJZCkucmVmQ291bnQtLTtcbiAgICAgICAgICAgIGlmICghZm9yY2UgJiYgdGhpcy5kYXRhLmdldChkYXRhSWQpLnJlZkNvdW50ID4gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgY29tcGxleFRlbnNvckluZm9zIH0gPSB0aGlzLmRhdGEuZ2V0KGRhdGFJZCk7XG4gICAgICAgICAgICBpZiAoY29tcGxleFRlbnNvckluZm9zICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3Bvc2VEYXRhKGNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsLmRhdGFJZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwb3NlRGF0YShjb21wbGV4VGVuc29ySW5mb3MuaW1hZy5kYXRhSWQsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5kYXRhLmRlbGV0ZShkYXRhSWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBkaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0ZW5zb3JJbmZvKSB7XG4gICAgICAgIHRoaXMuZGlzcG9zZURhdGEodGVuc29ySW5mby5kYXRhSWQpO1xuICAgIH1cbiAgICBhc3luYyB0aW1lKGYpIHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSB1dGlsLm5vdygpO1xuICAgICAgICBmKCk7XG4gICAgICAgIGNvbnN0IGtlcm5lbE1zID0gdXRpbC5ub3coKSAtIHN0YXJ0O1xuICAgICAgICByZXR1cm4geyBrZXJuZWxNcyB9O1xuICAgIH1cbiAgICBtZW1vcnkoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAvLyBVbnJlbGlhYmxlIGR1ZSB0byBhdXRvbWF0aWMgZ2MuIFRoZSBudW1iZXJzIGFib3ZlIGFyZSBjdW11bGF0aXZlLlxuICAgICAgICAgICAgdW5yZWxpYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHJlYXNvbnM6IFsnVGhlIHJlcG9ydGVkIG1lbW9yeSBpcyBhbiB1cHBlciBib3VuZC4gRHVlIHRvIGF1dG9tYXRpYyBnYXJiYWdlICcgK1xuICAgICAgICAgICAgICAgICAgICAnY29sbGVjdGlvbiwgdGhlIHRydWUgYWxsb2NhdGVkIG1lbW9yeSBtYXkgYmUgbGVzcy4nXVxuICAgICAgICB9O1xuICAgIH1cbiAgICB3aGVyZShjb25kaXRpb24pIHtcbiAgICAgICAgYXNzZXJ0Tm90Q29tcGxleChbY29uZGl0aW9uXSwgJ3doZXJlJyk7XG4gICAgICAgIGNvbnN0IGNvbmRWYWxzID0gdGhpcy5yZWFkU3luYyhjb25kaXRpb24uZGF0YUlkKTtcbiAgICAgICAgcmV0dXJuIHdoZXJlSW1wbChjb25kaXRpb24uc2hhcGUsIGNvbmRWYWxzKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHsgfVxuICAgIGZsb2F0UHJlY2lzaW9uKCkge1xuICAgICAgICByZXR1cm4gMzI7XG4gICAgfVxuICAgIC8qKiBSZXR1cm5zIHRoZSBzbWFsbGVzdCByZXByZXNlbnRhYmxlIG51bWJlci4gICovXG4gICAgZXBzaWxvbigpIHtcbiAgICAgICAgcmV0dXJuIHN1cGVyLmVwc2lsb24oKTtcbiAgICB9XG59XG5NYXRoQmFja2VuZENQVS5uZXh0RGF0YUlkID0gMDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJhY2tlbmRfY3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qXG4gKiBiYXNlLnRzIGNvbnRhaW5zIGFsbCB0aGUgZXhwb3J0cyBmcm9tIHRmanMtYmFja2VuZC1jcHVcbiAqIHdpdGhvdXQgYXV0by1rZXJuZWwgcmVnaXN0cmF0aW9uXG4gKi9cbmltcG9ydCB7IHJlZ2lzdGVyQmFja2VuZCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBNYXRoQmFja2VuZENQVSB9IGZyb20gJy4vYmFja2VuZF9jcHUnO1xuaW1wb3J0ICogYXMgc2hhcmVkIGZyb20gJy4vc2hhcmVkJztcbmV4cG9ydCB7IE1hdGhCYWNrZW5kQ1BVIH0gZnJvbSAnLi9iYWNrZW5kX2NwdSc7XG5leHBvcnQgeyB2ZXJzaW9uIGFzIHZlcnNpb25fY3B1IH0gZnJvbSAnLi92ZXJzaW9uJztcbmV4cG9ydCB7IHNoYXJlZCB9O1xuLy8gU2lkZSBlZmZlY3RzIGZvciBkZWZhdWx0IGluaXRpYWxpemF0aW9uIG9mIE1hdGhCYWNrZW5kQ1BVXG5yZWdpc3RlckJhY2tlbmQoJ2NwdScsICgpID0+IG5ldyBNYXRoQmFja2VuZENQVSgpLCAxIC8qIHByaW9yaXR5ICovKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJhc2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Tm90Q29tcGxleCh0ZW5zb3IsIG9wTmFtZSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh0ZW5zb3IpKSB7XG4gICAgICAgIHRlbnNvciA9IFt0ZW5zb3JdO1xuICAgIH1cbiAgICB0ZW5zb3IuZm9yRWFjaCh0ID0+IHtcbiAgICAgICAgaWYgKHQgIT0gbnVsbCkge1xuICAgICAgICAgICAgdXRpbC5hc3NlcnQodC5kdHlwZSAhPT0gJ2NvbXBsZXg2NCcsICgpID0+IGAke29wTmFtZX0gZG9lcyBub3Qgc3VwcG9ydCBjb21wbGV4NjQgdGVuc29ycyBpbiB0aGUgQ1BVIGJhY2tlbmQuYCk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNwdV91dGlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8vIEFsbCBleHBvcnRzIGZyb20gdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBpbiBiYXNlLlxuZXhwb3J0ICogZnJvbSAnLi9iYXNlJztcbmltcG9ydCAnLi9yZWdpc3Rlcl9hbGxfa2VybmVscyc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQWJzLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5leHBvcnQgZnVuY3Rpb24gc2ltcGxlQWJzSW1wbCh2YWxzKSB7XG4gICAgY29uc3QgcmVzdWx0VmFsdWVzID0gbmV3IEZsb2F0MzJBcnJheSh2YWxzLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHJlc3VsdFZhbHVlc1tpXSA9IE1hdGguYWJzKHZhbHNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0VmFsdWVzO1xufVxuZXhwb3J0IGNvbnN0IGFicyA9IChhcmdzKSA9PiB7XG4gICAgY29uc3QgeyB4IH0gPSBhcmdzLmlucHV0cztcbiAgICBjb25zdCBjcHVCYWNrZW5kID0gYXJncy5iYWNrZW5kO1xuICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ2FicycpO1xuICAgIGxldCByZXN1bHRWYWx1ZXMgPSBuZXcgRmxvYXQzMkFycmF5KHV0aWwuc2l6ZUZyb21TaGFwZSh4LnNoYXBlKSk7XG4gICAgY29uc3QgdmFsdWVzID0gY3B1QmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgIHJlc3VsdFZhbHVlcyA9IHNpbXBsZUFic0ltcGwodmFsdWVzKTtcbiAgICByZXR1cm4gY3B1QmFja2VuZC5tYWtlT3V0cHV0KHJlc3VsdFZhbHVlcywgeC5zaGFwZSwgJ2Zsb2F0MzInKTtcbn07XG5leHBvcnQgY29uc3QgYWJzQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEFicyxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogYWJzLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFicy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQWNvcyB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgYWNvcyA9IHVuYXJ5S2VybmVsRnVuYyhBY29zLCAoeGkpID0+IE1hdGguYWNvcyh4aSkpO1xuZXhwb3J0IGNvbnN0IGFjb3NDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQWNvcyxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogYWNvcyxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BY29zLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBY29zaCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgYWNvc2ggPSB1bmFyeUtlcm5lbEZ1bmMoQWNvc2gsICh4aSkgPT4gTWF0aC5hY29zaCh4aSkpO1xuZXhwb3J0IGNvbnN0IGFjb3NoQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEFjb3NoLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBhY29zaCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BY29zaC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBZGQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMsIGNyZWF0ZUNvbXBsZXhCaW5hcnlLZXJuZWxJbXBsIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBhZGRJbXBsID0gY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoKGEsIGIpID0+IGEgKyBiKSk7XG5leHBvcnQgY29uc3QgYWRkQ29tcGxleEltcGwgPSBjcmVhdGVDb21wbGV4QmluYXJ5S2VybmVsSW1wbCgoKGFSZWFsLCBhSW1hZywgYlJlYWwsIGJJbWFnKSA9PiB7XG4gICAgcmV0dXJuIHsgcmVhbDogYVJlYWwgKyBiUmVhbCwgaW1hZzogYUltYWcgKyBiSW1hZyB9O1xufSkpO1xuZXhwb3J0IGNvbnN0IGFkZCA9IGJpbmFyeUtlcm5lbEZ1bmMoQWRkLCBhZGRJbXBsLCBhZGRDb21wbGV4SW1wbCk7XG5leHBvcnQgY29uc3QgYWRkQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEFkZCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogYWRkXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QWRkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEFkZE4sIGJ1ZmZlciB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIGFkZE4oYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHRlbnNvcnMgPSBpbnB1dHM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChpbnB1dHMsICdhZGROJyk7XG4gICAgY29uc3QgdmFscyA9IHRlbnNvcnMubWFwKHQgPT4gYmFja2VuZC5kYXRhLmdldCh0LmRhdGFJZCkudmFsdWVzKTtcbiAgICBjb25zdCBvdXRCdWYgPSBidWZmZXIodGVuc29yc1swXS5zaGFwZSwgdGVuc29yc1swXS5kdHlwZSk7XG4gICAgY29uc3Qgb3V0VmFscyA9IG91dEJ1Zi52YWx1ZXM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZW5zb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGN1cnJWYWxzID0gdmFsc1tpXTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBvdXRWYWxzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBvdXRWYWxzW2pdICs9IGN1cnJWYWxzW2pdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dEJ1Zi5zaGFwZSwgb3V0QnVmLmR0eXBlLCBvdXRCdWYudmFsdWVzKTtcbn1cbmV4cG9ydCBjb25zdCBhZGROQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEFkZE4sXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGFkZE5cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BZGROLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEFsbCwgYmFja2VuZF91dGlsLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7IHRyYW5zcG9zZSB9IGZyb20gJy4vVHJhbnNwb3NlJztcbmV4cG9ydCBmdW5jdGlvbiBhbGwoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGF4aXMsIGtlZXBEaW1zIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KHgsICdhbGwnKTtcbiAgICBjb25zdCBvcmlnQXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG4gICAgbGV0IGF4ZXMgPSBvcmlnQXhlcztcbiAgICBjb25zdCBwZXJtdXRlZEF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKGF4ZXMsIHguc2hhcGUubGVuZ3RoKTtcbiAgICBsZXQgJHggPSB4O1xuICAgIGlmIChwZXJtdXRlZEF4ZXMgIT0gbnVsbCkge1xuICAgICAgICAkeCA9IHRyYW5zcG9zZSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHBlcm06IHBlcm11dGVkQXhlcyB9IH0pO1xuICAgICAgICBheGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoYXhlcy5sZW5ndGgsIHguc2hhcGUubGVuZ3RoKTtcbiAgICB9XG4gICAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdhbGwnLCBheGVzLCAkeC5zaGFwZS5sZW5ndGgpO1xuICAgIGNvbnN0IFtvdXRTaGFwZSwgcmVkdWNlU2hhcGVdID0gYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMoJHguc2hhcGUsIGF4ZXMpO1xuICAgIGNvbnN0IHJlZHVjZVNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuICAgIGNvbnN0IHZhbHMgPSB1dGlsLm1ha2VaZXJvc1R5cGVkQXJyYXkodXRpbC5zaXplRnJvbVNoYXBlKG91dFNoYXBlKSwgJHguZHR5cGUpO1xuICAgIGNvbnN0IGFWYWxzID0gYmFja2VuZC5kYXRhLmdldCgkeC5kYXRhSWQpLnZhbHVlcztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gaSAqIHJlZHVjZVNpemU7XG4gICAgICAgIGxldCBhbGwgPSBhVmFsc1tvZmZzZXRdO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJlZHVjZVNpemU7ICsraikge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhVmFsc1tvZmZzZXQgKyBqXTtcbiAgICAgICAgICAgIGFsbCA9IGFsbCAmJiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICB2YWxzW2ldID0gYWxsO1xuICAgIH1cbiAgICBpZiAocGVybXV0ZWRBeGVzICE9IG51bGwpIHtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbygkeCk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0U2hhcGUsICR4LmR0eXBlLCB2YWxzKTtcbiAgICBpZiAoa2VlcERpbXMpIHtcbiAgICAgICAgY29uc3QgZXhwYW5kZWRTaGFwZSA9IGJhY2tlbmRfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbShvdXRTaGFwZSwgb3JpZ0F4ZXMpO1xuICAgICAgICBjb25zdCByZXNoYXBlZFJlc3VsdCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogcmVzdWx0IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBleHBhbmRlZFNoYXBlIH0gfSk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHJlc2hhcGVkUmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGNvbnN0IGFsbENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBBbGwsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGFsbFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFsbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBbnksIGJhY2tlbmRfdXRpbCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQgeyB0cmFuc3Bvc2UgfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5leHBvcnQgZnVuY3Rpb24gYW55KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBheGlzLCBrZWVwRGltcyB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnYW55Jyk7XG4gICAgY29uc3Qgb3JpZ0F4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpO1xuICAgIGxldCBheGVzID0gb3JpZ0F4ZXM7XG4gICAgY29uc3QgcGVybXV0ZWRBeGVzID0gYmFja2VuZF91dGlsLmdldEF4ZXNQZXJtdXRhdGlvbihheGVzLCB4LnNoYXBlLmxlbmd0aCk7XG4gICAgbGV0ICR4ID0geDtcbiAgICBpZiAocGVybXV0ZWRBeGVzICE9IG51bGwpIHtcbiAgICAgICAgJHggPSB0cmFuc3Bvc2UoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kLCBhdHRyczogeyBwZXJtOiBwZXJtdXRlZEF4ZXMgfSB9KTtcbiAgICAgICAgYXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRJbm5lck1vc3RBeGVzKGF4ZXMubGVuZ3RoLCB4LnNoYXBlLmxlbmd0aCk7XG4gICAgfVxuICAgIGJhY2tlbmRfdXRpbC5hc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcygnYW55JywgYXhlcywgJHguc2hhcGUubGVuZ3RoKTtcbiAgICBjb25zdCBbb3V0U2hhcGUsIHJlZHVjZVNoYXBlXSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKCR4LnNoYXBlLCBheGVzKTtcbiAgICBjb25zdCByZWR1Y2VTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcbiAgICBjb25zdCB2YWxzID0gdXRpbC5tYWtlWmVyb3NUeXBlZEFycmF5KHV0aWwuc2l6ZUZyb21TaGFwZShvdXRTaGFwZSksICR4LmR0eXBlKTtcbiAgICBjb25zdCBhVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoJHguZGF0YUlkKS52YWx1ZXM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGkgKiByZWR1Y2VTaXplO1xuICAgICAgICBsZXQgYW55VmFsID0gYVZhbHNbb2Zmc2V0XTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByZWR1Y2VTaXplOyArK2opIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYVZhbHNbb2Zmc2V0ICsgal07XG4gICAgICAgICAgICBhbnlWYWwgPSBhbnlWYWwgfHwgdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFsc1tpXSA9IGFueVZhbDtcbiAgICB9XG4gICAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oJHgpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dFNoYXBlLCAkeC5kdHlwZSwgdmFscyk7XG4gICAgaWYgKGtlZXBEaW1zKSB7XG4gICAgICAgIGNvbnN0IGV4cGFuZGVkU2hhcGUgPSBiYWNrZW5kX3V0aWwuZXhwYW5kU2hhcGVUb0tlZXBEaW0ob3V0U2hhcGUsIG9yaWdBeGVzKTtcbiAgICAgICAgY29uc3QgcmVzaGFwZWRSZXN1bHQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHJlc3VsdCB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogZXhwYW5kZWRTaGFwZSB9IH0pO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc3VsdCk7XG4gICAgICAgIHJldHVybiByZXNoYXBlZFJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBjb25zdCBhbnlDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQW55LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBhbnlcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BbnkuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQXJnTWF4LCBiYWNrZW5kX3V0aWwsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7IHRyYW5zcG9zZSB9IGZyb20gJy4vVHJhbnNwb3NlJztcbmV4cG9ydCBmdW5jdGlvbiBhcmdNYXgoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGF4aXMgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ2FyZ01heCcpO1xuICAgIGxldCBheGVzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShheGlzLCB4LnNoYXBlKTtcbiAgICBjb25zdCBwZXJtdXRlZEF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKGF4ZXMsIHguc2hhcGUubGVuZ3RoKTtcbiAgICBsZXQgJHggPSB4O1xuICAgIGNvbnN0IGludGVybWVkaWF0ZVRlbnNvckluZm9zID0gW107XG4gICAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgICAgICR4ID0gdHJhbnNwb3NlKHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCwgYXR0cnM6IHsgcGVybTogcGVybXV0ZWRBeGVzIH0gfSk7XG4gICAgICAgIGludGVybWVkaWF0ZVRlbnNvckluZm9zLnB1c2goJHgpO1xuICAgICAgICBheGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoYXhlcy5sZW5ndGgsICR4LnNoYXBlLmxlbmd0aCk7XG4gICAgfVxuICAgIGF4ZXMgPSBbYXhlc1swXV07XG4gICAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdhcmdNYXgnLCBheGVzLCAkeC5zaGFwZS5sZW5ndGgpO1xuICAgIGNvbnN0IFtvdXRTaGFwZSwgcmVkdWNlU2hhcGVdID0gYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMoJHguc2hhcGUsIGF4ZXMpO1xuICAgIGNvbnN0IG91dFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUob3V0U2hhcGUpO1xuICAgIGNvbnN0IHZhbHMgPSB1dGlsLm1ha2VaZXJvc1R5cGVkQXJyYXkob3V0U2l6ZSwgJ2ludDMyJyk7XG4gICAgY29uc3QgcmVkdWNlU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShyZWR1Y2VTaGFwZSk7XG4gICAgY29uc3QgYVZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KCR4LmRhdGFJZCkudmFsdWVzO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBpICogcmVkdWNlU2l6ZTtcbiAgICAgICAgbGV0IG1heCA9IGFWYWxzW29mZnNldF07XG4gICAgICAgIGxldCBtYXhJbmRleCA9IDA7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmVkdWNlU2l6ZTsgKytqKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGFWYWxzW29mZnNldCArIGpdO1xuICAgICAgICAgICAgaWYgKHZhbHVlID4gbWF4KSB7XG4gICAgICAgICAgICAgICAgbWF4ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgbWF4SW5kZXggPSBqO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhbHNbaV0gPSBtYXhJbmRleDtcbiAgICB9XG4gICAgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dFNoYXBlLCAnaW50MzInLCB2YWxzKTtcbn1cbmV4cG9ydCBjb25zdCBhcmdNYXhDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQXJnTWF4LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBhcmdNYXhcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BcmdNYXguanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQXJnTWluLCBiYWNrZW5kX3V0aWwsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7IHRyYW5zcG9zZSB9IGZyb20gJy4vVHJhbnNwb3NlJztcbmV4cG9ydCBmdW5jdGlvbiBhcmdNaW4oYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGF4aXMgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ2FyZ01pbicpO1xuICAgIGxldCBheGVzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShheGlzLCB4LnNoYXBlKTtcbiAgICBjb25zdCBwZXJtdXRlZEF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKGF4ZXMsIHguc2hhcGUubGVuZ3RoKTtcbiAgICBsZXQgJHggPSB4O1xuICAgIGNvbnN0IGludGVybWVkaWF0ZVRlbnNvckluZm9zID0gW107XG4gICAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgICAgICR4ID0gdHJhbnNwb3NlKHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCwgYXR0cnM6IHsgcGVybTogcGVybXV0ZWRBeGVzIH0gfSk7XG4gICAgICAgIGludGVybWVkaWF0ZVRlbnNvckluZm9zLnB1c2goJHgpO1xuICAgICAgICBheGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoYXhlcy5sZW5ndGgsICR4LnNoYXBlLmxlbmd0aCk7XG4gICAgfVxuICAgIGF4ZXMgPSBbYXhlc1swXV07XG4gICAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdhcmdNaW4nLCBheGVzLCAkeC5zaGFwZS5sZW5ndGgpO1xuICAgIGNvbnN0IFtvdXRTaGFwZSwgcmVkdWNlU2hhcGVdID0gYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMoJHguc2hhcGUsIGF4ZXMpO1xuICAgIGNvbnN0IG91dFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUob3V0U2hhcGUpO1xuICAgIGNvbnN0IHZhbHMgPSB1dGlsLm1ha2VaZXJvc1R5cGVkQXJyYXkob3V0U2l6ZSwgJ2ludDMyJyk7XG4gICAgY29uc3QgcmVkdWNlU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShyZWR1Y2VTaGFwZSk7XG4gICAgY29uc3QgYVZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KCR4LmRhdGFJZCkudmFsdWVzO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBpICogcmVkdWNlU2l6ZTtcbiAgICAgICAgbGV0IG1pbiA9IGFWYWxzW29mZnNldF07XG4gICAgICAgIGxldCBtaW5JbmRleCA9IDA7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmVkdWNlU2l6ZTsgKytqKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGFWYWxzW29mZnNldCArIGpdO1xuICAgICAgICAgICAgaWYgKHZhbHVlIDwgbWluKSB7XG4gICAgICAgICAgICAgICAgbWluID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgbWluSW5kZXggPSBqO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhbHNbaV0gPSBtaW5JbmRleDtcbiAgICB9XG4gICAgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dFNoYXBlLCAnaW50MzInLCB2YWxzKTtcbn1cbmV4cG9ydCBjb25zdCBhcmdNaW5Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQXJnTWluLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBhcmdNaW5cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BcmdNaW4uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEFzaW4gfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IGFzaW4gPSB1bmFyeUtlcm5lbEZ1bmMoQXNpbiwgKHhpKSA9PiBNYXRoLmFzaW4oeGkpKTtcbmV4cG9ydCBjb25zdCBhc2luQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEFzaW4sXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGFzaW4sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXNpbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQXNpbmggfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IGFzaW5oID0gdW5hcnlLZXJuZWxGdW5jKEFzaW5oLCAoeGkpID0+IE1hdGguYXNpbmgoeGkpKTtcbmV4cG9ydCBjb25zdCBhc2luaENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBBc2luaCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogYXNpbmgsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXNpbmguanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEF0YW4gfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IGF0YW4gPSB1bmFyeUtlcm5lbEZ1bmMoQXRhbiwgKHhpKSA9PiBNYXRoLmF0YW4oeGkpKTtcbmV4cG9ydCBjb25zdCBhdGFuQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEF0YW4sXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGF0YW4sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXRhbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQXRhbjIgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IGF0YW4ySW1wbCA9IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwoKGFWYWx1ZSwgYlZhbHVlKSA9PiBNYXRoLmF0YW4yKGFWYWx1ZSwgYlZhbHVlKSk7XG5leHBvcnQgY29uc3QgYXRhbjIgPSBiaW5hcnlLZXJuZWxGdW5jKEF0YW4yLCBhdGFuMkltcGwpO1xuZXhwb3J0IGNvbnN0IGF0YW4yQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEF0YW4yLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBhdGFuMixcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BdGFuMi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQXRhbmggfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IGF0YW5oID0gdW5hcnlLZXJuZWxGdW5jKEF0YW5oLCAoeGkpID0+IE1hdGguYXRhbmgoeGkpKTtcbmV4cG9ydCBjb25zdCBhdGFuaENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBBdGFuaCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogYXRhbmgsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXRhbmguanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQXZnUG9vbCwgYmFja2VuZF91dGlsLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyBwb29sIH0gZnJvbSAnLi4vdXRpbHMvcG9vbF91dGlscyc7XG5pbXBvcnQgeyBpZGVudGl0eSB9IGZyb20gJy4vSWRlbnRpdHknO1xuZXhwb3J0IGZ1bmN0aW9uIGF2Z1Bvb2woYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBhc3NlcnROb3RDb21wbGV4KHgsICdhdmdQb29sJyk7XG4gICAgY29uc3QgeyBmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSB9ID0gYXR0cnM7XG4gICAgY29uc3QgZGlsYXRpb25zID0gMTtcbiAgICB1dGlsLmFzc2VydChiYWNrZW5kX3V0aWwuZWl0aGVyU3RyaWRlc09yRGlsYXRpb25zQXJlT25lKHN0cmlkZXMsIGRpbGF0aW9ucyksICgpID0+ICdFcnJvciBpbiBhdmdQb29sOiBFaXRoZXIgc3RyaWRlcyBvciBkaWxhdGlvbnMgbXVzdCBiZSAxLiAnICtcbiAgICAgICAgYEdvdCBzdHJpZGVzICR7c3RyaWRlc30gYW5kIGRpbGF0aW9ucyAnJHtkaWxhdGlvbnN9J2ApO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVQb29sMkRJbmZvKHguc2hhcGUsIGZpbHRlclNpemUsIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpO1xuICAgIGxldCByZXM7XG4gICAgaWYgKGNvbnZJbmZvLmZpbHRlcldpZHRoID09PSAxICYmIGNvbnZJbmZvLmZpbHRlckhlaWdodCA9PT0gMSAmJlxuICAgICAgICB1dGlsLmFycmF5c0VxdWFsKGNvbnZJbmZvLmluU2hhcGUsIGNvbnZJbmZvLm91dFNoYXBlKSkge1xuICAgICAgICByZXMgPSBpZGVudGl0eSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCB4VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgICAgICBjb25zdCBzdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyh4LnNoYXBlKTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gcG9vbCh4VmFsdWVzLCB4LnNoYXBlLCB4LmR0eXBlLCBzdHJpZGVzLCBjb252SW5mbywgJ2F2ZycpO1xuICAgICAgICByZXMgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGNvbnZJbmZvLm91dFNoYXBlLCB4LmR0eXBlLCBidWZmZXIudmFsdWVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydCBjb25zdCBhdmdQb29sQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEF2Z1Bvb2wsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGF2Z1Bvb2xcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BdmdQb29sLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEF2Z1Bvb2wzRCwgYmFja2VuZF91dGlsLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyBwb29sM2QgfSBmcm9tICcuLi91dGlscy9wb29sX3V0aWxzJztcbmV4cG9ydCBmdW5jdGlvbiBhdmdQb29sM0QoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCBkYXRhRm9ybWF0IH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KHgsICdhdmdQb29sM2QnKTtcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlUG9vbDNESW5mbyh4LnNoYXBlLCBmaWx0ZXJTaXplLCBzdHJpZGVzLCAxIC8qIGRpbGF0aW9ucyAqLywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGRhdGFGb3JtYXQpO1xuICAgIGNvbnN0IHhWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3Qgb3V0QnVmID0gcG9vbDNkKHhWYWx1ZXMsIHguc2hhcGUsIHguZHR5cGUsIHV0aWwuY29tcHV0ZVN0cmlkZXMoeC5zaGFwZSksIGNvbnZJbmZvLCAnYXZnJyk7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0QnVmLnNoYXBlLCAnZmxvYXQzMicsIG91dEJ1Zi52YWx1ZXMpO1xufVxuZXhwb3J0IGNvbnN0IGF2Z1Bvb2wzRENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBBdmdQb29sM0QsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGF2Z1Bvb2wzRFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUF2Z1Bvb2wzRC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBdmdQb29sM0RHcmFkLCBiYWNrZW5kX3V0aWwsIGJ1ZmZlciB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIGF2Z1Bvb2wzREdyYWQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGR5LCBpbnB1dCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGUgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoW2R5LCBpbnB1dF0sICdhdmdQb29sM0RHcmFkJyk7XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wzREluZm8oaW5wdXQuc2hhcGUsIGZpbHRlclNpemUsIHN0cmlkZXMsIDEgLyogZGlsYXRpb25zICovLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSk7XG4gICAgY29uc3Qgc3RyaWRlRGVwdGggPSBjb252SW5mby5zdHJpZGVEZXB0aDtcbiAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBmaWx0ZXJEZXB0aCA9IGNvbnZJbmZvLmZpbHRlckRlcHRoO1xuICAgIGNvbnN0IGZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmZpbHRlckhlaWdodDtcbiAgICBjb25zdCBmaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmZpbHRlcldpZHRoO1xuICAgIGNvbnN0IGRpbGF0aW9uRGVwdGggPSBjb252SW5mby5kaWxhdGlvbkRlcHRoO1xuICAgIGNvbnN0IGRpbGF0aW9uSGVpZ2h0ID0gY29udkluZm8uZGlsYXRpb25IZWlnaHQ7XG4gICAgY29uc3QgZGlsYXRpb25XaWR0aCA9IGNvbnZJbmZvLmRpbGF0aW9uV2lkdGg7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVyRGVwdGggPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJEZXB0aDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJIZWlnaHQ7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVyV2lkdGggPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJXaWR0aDtcbiAgICBjb25zdCBwYWRGcm9udCA9IGVmZmVjdGl2ZUZpbHRlckRlcHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8uZnJvbnQ7XG4gICAgY29uc3QgcGFkTGVmdCA9IGVmZmVjdGl2ZUZpbHRlcldpZHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICBjb25zdCBwYWRUb3AgPSBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgLSAxIC0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgZHggPSBidWZmZXIoaW5wdXQuc2hhcGUsICdmbG9hdDMyJyk7XG4gICAgY29uc3QgYXZnTXVsdGlwbGllciA9IDEgLyAoZmlsdGVyRGVwdGggKiBmaWx0ZXJIZWlnaHQgKiBmaWx0ZXJXaWR0aCk7XG4gICAgY29uc3QgZHlCdWYgPSBiYWNrZW5kLmJ1ZmZlclN5bmMoZHkpO1xuICAgIGZvciAobGV0IGJhdGNoID0gMDsgYmF0Y2ggPCBjb252SW5mby5iYXRjaFNpemU7ICsrYmF0Y2gpIHtcbiAgICAgICAgZm9yIChsZXQgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBjb252SW5mby5pbkNoYW5uZWxzOyArK2NoYW5uZWwpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGR4RGVwdGggPSAwOyBkeERlcHRoIDwgY29udkluZm8uaW5EZXB0aDsgKytkeERlcHRoKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZHhSb3cgPSAwOyBkeFJvdyA8IGNvbnZJbmZvLmluSGVpZ2h0OyArK2R4Um93KSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGR4Q29sID0gMDsgZHhDb2wgPCBjb252SW5mby5pbldpZHRoOyArK2R4Q29sKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTaGFkZXIgY29kZSBiZWdpbnMuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkeURlcHRoQ29ybmVyID0gZHhEZXB0aCAtIHBhZEZyb250O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHlSb3dDb3JuZXIgPSBkeFJvdyAtIHBhZFRvcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGR5Q29sQ29ybmVyID0gZHhDb2wgLSBwYWRMZWZ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRvdFByb2QgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgd0RlcHRoID0gMDsgd0RlcHRoIDwgZWZmZWN0aXZlRmlsdGVyRGVwdGg7IHdEZXB0aCArPSBkaWxhdGlvbkRlcHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHlEZXB0aCA9IChkeURlcHRoQ29ybmVyICsgd0RlcHRoKSAvIHN0cmlkZURlcHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkeURlcHRoIDwgMCB8fCBkeURlcHRoID49IGNvbnZJbmZvLm91dERlcHRoIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoZHlEZXB0aCkgIT09IGR5RGVwdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHdSb3cgPSAwOyB3Um93IDwgZWZmZWN0aXZlRmlsdGVySGVpZ2h0OyB3Um93ICs9IGRpbGF0aW9uSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGR5Um93ID0gKGR5Um93Q29ybmVyICsgd1JvdykgLyBzdHJpZGVIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkeVJvdyA8IDAgfHwgZHlSb3cgPj0gY29udkluZm8ub3V0SGVpZ2h0IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLmZsb29yKGR5Um93KSAhPT0gZHlSb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHdDb2wgPSAwOyB3Q29sIDwgZWZmZWN0aXZlRmlsdGVyV2lkdGg7IHdDb2wgKz0gZGlsYXRpb25XaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHlDb2wgPSAoZHlDb2xDb3JuZXIgKyB3Q29sKSAvIHN0cmlkZVdpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR5Q29sIDwgMCB8fCBkeUNvbCA+PSBjb252SW5mby5vdXRXaWR0aCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoZHlDb2wpICE9PSBkeUNvbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGl4ZWwgPSBkeUJ1Zi5nZXQoYmF0Y2gsIGR5RGVwdGgsIGR5Um93LCBkeUNvbCwgY2hhbm5lbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3RQcm9kICs9IHBpeGVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZHguc2V0KGRvdFByb2QgKiBhdmdNdWx0aXBsaWVyLCBiYXRjaCwgZHhEZXB0aCwgZHhSb3csIGR4Q29sLCBjaGFubmVsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhkeC5zaGFwZSwgZHguZHR5cGUsIGR4LnZhbHVlcyk7XG59XG5leHBvcnQgY29uc3QgYXZnUG9vbDNER3JhZENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBBdmdQb29sM0RHcmFkLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBhdmdQb29sM0RHcmFkXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXZnUG9vbDNER3JhZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBdmdQb29sR3JhZCwgYmFja2VuZF91dGlsLCBidWZmZXIgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBhdmdQb29sR3JhZChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgZHksIGlucHV0IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeCA9IGlucHV0O1xuICAgIGFzc2VydE5vdENvbXBsZXgoW2R5LCBpbnB1dF0sICdhdmdQb29sR3JhZCcpO1xuICAgIGNvbnN0IHsgZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkIH0gPSBhdHRycztcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlUG9vbDJESW5mbyh4LnNoYXBlLCBmaWx0ZXJTaXplLCBzdHJpZGVzLCAxIC8qIGRpbGF0aW9ucyAqLywgcGFkKTtcbiAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBmaWx0ZXJIZWlnaHQgPSBjb252SW5mby5maWx0ZXJIZWlnaHQ7XG4gICAgY29uc3QgZmlsdGVyV2lkdGggPSBjb252SW5mby5maWx0ZXJXaWR0aDtcbiAgICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICAgIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckhlaWdodDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoO1xuICAgIGNvbnN0IHBhZExlZnQgPSBlZmZlY3RpdmVGaWx0ZXJXaWR0aCAtIDEgLSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgY29uc3QgcGFkVG9wID0gZWZmZWN0aXZlRmlsdGVySGVpZ2h0IC0gMSAtIGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IGR4ID0gYnVmZmVyKHguc2hhcGUsICdmbG9hdDMyJyk7XG4gICAgY29uc3QgYXZnTXVsdGlwbGllciA9IDEgLyAoZmlsdGVySGVpZ2h0ICogZmlsdGVyV2lkdGgpO1xuICAgIGNvbnN0IGR5RGF0YSA9IGJhY2tlbmQuZGF0YS5nZXQoZHkuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgZHlCdWYgPSBidWZmZXIoZHkuc2hhcGUsICdmbG9hdDMyJywgZHlEYXRhKTtcbiAgICBmb3IgKGxldCBiID0gMDsgYiA8IGNvbnZJbmZvLmJhdGNoU2l6ZTsgKytiKSB7XG4gICAgICAgIGZvciAobGV0IGQgPSAwOyBkIDwgY29udkluZm8uaW5DaGFubmVsczsgKytkKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBkeFIgPSAwOyBkeFIgPCBjb252SW5mby5pbkhlaWdodDsgKytkeFIpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBkeEMgPSAwOyBkeEMgPCBjb252SW5mby5pbldpZHRoOyArK2R4Qykge1xuICAgICAgICAgICAgICAgICAgICAvLyBTaGFkZXIgY29kZSBiZWdpbnMuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGR5UkNvcm5lciA9IGR4UiAtIHBhZFRvcDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZHlDQ29ybmVyID0gZHhDIC0gcGFkTGVmdDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRvdFByb2QgPSAwO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB3UiA9IDA7IHdSIDwgZWZmZWN0aXZlRmlsdGVySGVpZ2h0OyB3UiArPSBkaWxhdGlvbkhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHlSID0gKGR5UkNvcm5lciArIHdSKSAvIHN0cmlkZUhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkeVIgPCAwIHx8IGR5UiA+PSBjb252SW5mby5vdXRIZWlnaHQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLmZsb29yKGR5UikgIT09IGR5Uikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgd0MgPSAwOyB3QyA8IGVmZmVjdGl2ZUZpbHRlcldpZHRoOyB3QyArPSBkaWxhdGlvbldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHlDID0gKGR5Q0Nvcm5lciArIHdDKSAvIHN0cmlkZVdpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkeUMgPCAwIHx8IGR5QyA+PSBjb252SW5mby5vdXRXaWR0aCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLmZsb29yKGR5QykgIT09IGR5Qykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGl4ZWwgPSBkeUJ1Zi5nZXQoYiwgZHlSLCBkeUMsIGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdFByb2QgKz0gcGl4ZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZHguc2V0KGRvdFByb2QgKiBhdmdNdWx0aXBsaWVyLCBiLCBkeFIsIGR4QywgZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGR4LnNoYXBlLCBkeC5kdHlwZSwgZHgudmFsdWVzKTtcbn1cbmV4cG9ydCBjb25zdCBhdmdQb29sR3JhZENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBBdmdQb29sR3JhZCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogYXZnUG9vbEdyYWRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BdmdQb29sR3JhZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQmF0Y2hNYXRNdWwsIGJ1ZmZlciwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5leHBvcnQgZnVuY3Rpb24gYmF0Y2hNYXRNdWwoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGEsIGIgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHRyYW5zcG9zZUEsIHRyYW5zcG9zZUIgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoW2EsIGJdLCAnbWF0TXVsJyk7XG4gICAgY29uc3QgYVJhbmsgPSBhLnNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBiUmFuayA9IGIuc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IGlubmVyU2hhcGVBID0gdHJhbnNwb3NlQSA/IGEuc2hhcGVbYVJhbmsgLSAyXSA6IGEuc2hhcGVbYVJhbmsgLSAxXTtcbiAgICBjb25zdCBpbm5lclNoYXBlQiA9IHRyYW5zcG9zZUIgPyBiLnNoYXBlW2JSYW5rIC0gMV0gOiBiLnNoYXBlW2JSYW5rIC0gMl07XG4gICAgY29uc3Qgb3V0ZXJTaGFwZUEgPSB0cmFuc3Bvc2VBID8gYS5zaGFwZVthUmFuayAtIDFdIDogYS5zaGFwZVthUmFuayAtIDJdO1xuICAgIGNvbnN0IG91dGVyU2hhcGVCID0gdHJhbnNwb3NlQiA/IGIuc2hhcGVbYlJhbmsgLSAyXSA6IGIuc2hhcGVbYlJhbmsgLSAxXTtcbiAgICBjb25zdCBvdXRlckRpbXNBID0gYS5zaGFwZS5zbGljZSgwLCAtMik7XG4gICAgY29uc3Qgb3V0ZXJEaW1zQiA9IGIuc2hhcGUuc2xpY2UoMCwgLTIpO1xuICAgIGNvbnN0IGJhdGNoRGltQSA9IHV0aWwuc2l6ZUZyb21TaGFwZShvdXRlckRpbXNBKTtcbiAgICBjb25zdCBiYXRjaERpbUIgPSB1dGlsLnNpemVGcm9tU2hhcGUob3V0ZXJEaW1zQik7XG4gICAgY29uc3QgYmF0Y2hEaW1zQ29tcGF0aWJsZSA9IGJhdGNoRGltQSA9PT0gYmF0Y2hEaW1CIHx8IGJhdGNoRGltQSA9PT0gMSB8fCBiYXRjaERpbUIgPT09IDE7XG4gICAgdXRpbC5hc3NlcnQoYVJhbmsgPj0gMiAmJiBiUmFuayA+PSAyICYmIGJhdGNoRGltc0NvbXBhdGlibGUsICgpID0+IGBFcnJvciBpbiBtYXRNdWw6IHRoZSBpbnB1dCBiYXRjaCBkaW1lbnNpb25zIG11c3QgZWl0aGVyIGJlIHRoZSBgICtcbiAgICAgICAgYHNhbWUgb3IgYXQgbGVhc3Qgb25lIGlucHV0IGJhdGNoIGRpbWVuc2lvbiBtdXN0IGJlIDEuIEdvdCBpbnB1dCBgICtcbiAgICAgICAgYGJhdGNoIGRpbWVuc2lvbnMgb2YgKCR7b3V0ZXJEaW1zQX0pIGFuZCAoJHtvdXRlckRpbXNCfSkuYCk7XG4gICAgY29uc3Qgb3V0U2hhcGVPdXRlckRpbXMgPSBiYXRjaERpbUEgPiBiYXRjaERpbUIgPyBhLnNoYXBlLnNsaWNlKDAsIC0yKSA6IGIuc2hhcGUuc2xpY2UoMCwgLTIpO1xuICAgIGNvbnN0IG91dFNoYXBlID0gb3V0U2hhcGVPdXRlckRpbXMuY29uY2F0KFtvdXRlclNoYXBlQSwgb3V0ZXJTaGFwZUJdKTtcbiAgICB1dGlsLmFzc2VydChpbm5lclNoYXBlQSA9PT0gaW5uZXJTaGFwZUIsICgpID0+IGBFcnJvciBpbiBtYXRNdWw6IGlubmVyIHNoYXBlcyAoJHtpbm5lclNoYXBlQX0pIGFuZCAoYCArXG4gICAgICAgIGAke2lubmVyU2hhcGVCfSkgb2YgVGVuc29ycyB3aXRoIHNoYXBlcyAke2Euc2hhcGV9IGFuZCBgICtcbiAgICAgICAgYCR7Yi5zaGFwZX0gYW5kIHRyYW5zcG9zZUE9JHt0cmFuc3Bvc2VBfWAgK1xuICAgICAgICBgIGFuZCB0cmFuc3Bvc2VCPSR7dHJhbnNwb3NlQn0gbXVzdCBtYXRjaC5gKTtcbiAgICBjb25zdCBhM2RTaGFwZSA9IHRyYW5zcG9zZUEgPyBbYmF0Y2hEaW1BLCBpbm5lclNoYXBlQSwgb3V0ZXJTaGFwZUFdIDpcbiAgICAgICAgW2JhdGNoRGltQSwgb3V0ZXJTaGFwZUEsIGlubmVyU2hhcGVBXTtcbiAgICBjb25zdCBiM2RTaGFwZSA9IHRyYW5zcG9zZUIgPyBbYmF0Y2hEaW1CLCBvdXRlclNoYXBlQiwgaW5uZXJTaGFwZUJdIDpcbiAgICAgICAgW2JhdGNoRGltQiwgaW5uZXJTaGFwZUIsIG91dGVyU2hhcGVCXTtcbiAgICAvLyBUaGUgcmVzdCBvZiB0aGUgaW1wbGVtZW50YXRpb24gaXMgZGVzaWduZWQgdG8gb3BlcmF0ZSBvbiByYW5rLTMgdGVuc29yc1xuICAgIGNvbnN0IGEzZCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogYSB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogYTNkU2hhcGUgfSB9KTtcbiAgICBjb25zdCBiM2QgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IGIgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IGIzZFNoYXBlIH0gfSk7XG4gICAgY29uc3Qgc2hhcmVkRGltID0gdHJhbnNwb3NlQSA/IGEzZC5zaGFwZVsxXSA6IGEzZC5zaGFwZVsyXTtcbiAgICBjb25zdCBsZWZ0RGltID0gdHJhbnNwb3NlQSA/IGEzZC5zaGFwZVsyXSA6IGEzZC5zaGFwZVsxXTtcbiAgICBjb25zdCByaWdodERpbSA9IHRyYW5zcG9zZUIgPyBiM2Quc2hhcGVbMV0gOiBiM2Quc2hhcGVbMl07XG4gICAgY29uc3QgYmF0Y2hEaW0gPSBNYXRoLm1heChiYXRjaERpbUEsIGJhdGNoRGltQik7XG4gICAgY29uc3QgYTNkVmFsdWVzID0gYmFja2VuZC5kYXRhLmdldChhM2QuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgYjNkVmFsdWVzID0gYmFja2VuZC5kYXRhLmdldChiM2QuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgYTNkU3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoYTNkLnNoYXBlKTtcbiAgICBjb25zdCBiM2RTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhiM2Quc2hhcGUpO1xuICAgIGNvbnN0IFthQmF0Y2gsIGFPdXRlclN0ZXAsIGFJbm5lclN0ZXBdID0gdHJhbnNwb3NlQSA/XG4gICAgICAgIFthM2RTdHJpZGVzWzBdLCAxLCBhM2RTdHJpZGVzWzFdXSA6XG4gICAgICAgIFthM2RTdHJpZGVzWzBdLCBhM2RTdHJpZGVzWzFdLCAxXTtcbiAgICBjb25zdCBbYklubmVyU3RlcCwgYk91dGVyU3RlcCwgYkJhdGNoXSA9IHRyYW5zcG9zZUIgP1xuICAgICAgICBbMSwgYjNkU3RyaWRlc1sxXSwgYjNkU3RyaWRlc1swXV0gOlxuICAgICAgICBbYjNkU3RyaWRlc1sxXSwgMSwgYjNkU3RyaWRlc1swXV07XG4gICAgY29uc3Qgc2l6ZSA9IGxlZnREaW0gKiByaWdodERpbTtcbiAgICBjb25zdCByZXN1bHQgPSBidWZmZXIoW2JhdGNoRGltLCBsZWZ0RGltLCByaWdodERpbV0sIGEzZC5kdHlwZSk7XG4gICAgY29uc3QgcmVzVmFscyA9IHJlc3VsdC52YWx1ZXM7XG4gICAgY29uc3QgYmxvY2tTaXplID0gYmFja2VuZC5ibG9ja1NpemU7XG4gICAgZm9yIChsZXQgYmkgPSAwOyBiaSA8IGJhdGNoRGltOyBiaSsrKSB7XG4gICAgICAgIGZvciAobGV0IGkwID0gMDsgaTAgPCBsZWZ0RGltOyBpMCArPSBibG9ja1NpemUpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGowID0gMDsgajAgPCByaWdodERpbTsgajAgKz0gYmxvY2tTaXplKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgazAgPSAwOyBrMCA8IHNoYXJlZERpbTsgazAgKz0gYmxvY2tTaXplKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciB3aGVuIGJsb2NrU2l6ZSBkb2Vzbid0IGV2ZW5seSBkaXZpZGUgdGhlIGlucHV0XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlCbG9jayA9IE1hdGgubWluKGkwICsgYmxvY2tTaXplLCBsZWZ0RGltKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgakJsb2NrID0gTWF0aC5taW4oajAgKyBibG9ja1NpemUsIHJpZ2h0RGltKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qga0Jsb2NrID0gTWF0aC5taW4oazAgKyBibG9ja1NpemUsIHNoYXJlZERpbSk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBpMDsgaSA8IGlCbG9jazsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gajA7IGogPCBqQmxvY2s7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdW0gPSAwLjA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IGswOyBrIDwga0Jsb2NrOyBrKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmF0Y2hPZmZzZXRBID0gTWF0aC5taW4oYmksIGJhdGNoRGltQSAtIDEpICogYUJhdGNoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXRjaE9mZnNldEIgPSBNYXRoLm1pbihiaSwgYmF0Y2hEaW1CIC0gMSkgKiBiQmF0Y2g7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFWYWwgPSBhM2RWYWx1ZXNbYmF0Y2hPZmZzZXRBICsgaSAqIGFPdXRlclN0ZXAgKyBrICogYUlubmVyU3RlcF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJWYWwgPSBiM2RWYWx1ZXNbayAqIGJJbm5lclN0ZXAgKyBqICogYk91dGVyU3RlcCArIGJhdGNoT2Zmc2V0Ql07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSBhVmFsICogYlZhbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzVmFsc1tiaSAqIHNpemUgKyAoaSAqIHJpZ2h0RGltICsgaildICs9IHN1bTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGEzZCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhiM2QpO1xuICAgIC8vIHNldCBjb3JyZWN0IHNoYXBlIG9uIG91dHB1dC5cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRTaGFwZSwgcmVzdWx0LmR0eXBlLCByZXN1bHQudmFsdWVzKTtcbn1cbmV4cG9ydCBjb25zdCBiYXRjaE1hdE11bENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBCYXRjaE1hdE11bCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogYmF0Y2hNYXRNdWwsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QmF0Y2hNYXRNdWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRnVzZWRCYXRjaE5vcm0sIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBiYXRjaE5vcm0oYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHgsIHNjYWxlLCBvZmZzZXQsIG1lYW4sIHZhcmlhbmNlIH0gPSBpbnB1dHM7XG4gICAgdXRpbC5hc3NlcnQobWVhbi5zaGFwZS5sZW5ndGggPT09IHZhcmlhbmNlLnNoYXBlLmxlbmd0aCwgKCkgPT4gJ0JhdGNoIG5vcm1hbGl6YXRpb24gZ3JhZGllbnQgcmVxdWlyZXMgbWVhbiBhbmQgdmFyaWFuY2UgdG8gaGF2ZSAnICtcbiAgICAgICAgJ2VxdWFsIHJhbmtzLicpO1xuICAgIHV0aWwuYXNzZXJ0KG9mZnNldCA9PSBudWxsIHx8IG1lYW4uc2hhcGUubGVuZ3RoID09PSBvZmZzZXQuc2hhcGUubGVuZ3RoLCAoKSA9PiAnQmF0Y2ggbm9ybWFsaXphdGlvbiBncmFkaWVudCByZXF1aXJlcyBtZWFuIGFuZCBvZmZzZXQgdG8gaGF2ZSAnICtcbiAgICAgICAgJ2VxdWFsIHJhbmtzLicpO1xuICAgIHV0aWwuYXNzZXJ0KHNjYWxlID09IG51bGwgfHwgbWVhbi5zaGFwZS5sZW5ndGggPT09IHNjYWxlLnNoYXBlLmxlbmd0aCwgKCkgPT4gJ0JhdGNoIG5vcm1hbGl6YXRpb24gZ3JhZGllbnQgcmVxdWlyZXMgbWVhbiBhbmQgc2NhbGUgdG8gaGF2ZSAnICtcbiAgICAgICAgJ2VxdWFsIHJhbmtzLicpO1xuICAgIGFzc2VydE5vdENvbXBsZXgoW3gsIG1lYW4sIHZhcmlhbmNlLCBzY2FsZSwgb2Zmc2V0XSwgJ2JhdGNoTm9ybScpO1xuICAgIGxldCB7IHZhcmlhbmNlRXBzaWxvbiB9ID0gYXR0cnM7XG4gICAgaWYgKHZhcmlhbmNlRXBzaWxvbiA9PSBudWxsKSB7XG4gICAgICAgIHZhcmlhbmNlRXBzaWxvbiA9IDAuMDAxO1xuICAgIH1cbiAgICBjb25zdCB4VmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBtVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQobWVhbi5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCB2YXJWYWxzID0gYmFja2VuZC5kYXRhLmdldCh2YXJpYW5jZS5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBzVmFscyA9IHNjYWxlID8gYmFja2VuZC5kYXRhLmdldChzY2FsZS5kYXRhSWQpLnZhbHVlcyA6XG4gICAgICAgIG5ldyBGbG9hdDMyQXJyYXkoWzFdKTtcbiAgICBjb25zdCBvZmZWYWxzID0gb2Zmc2V0ID9cbiAgICAgICAgYmFja2VuZC5kYXRhLmdldChvZmZzZXQuZGF0YUlkKS52YWx1ZXMgOlxuICAgICAgICBuZXcgRmxvYXQzMkFycmF5KFswXSk7XG4gICAgY29uc3Qgb3V0VmFscyA9IG5ldyBGbG9hdDMyQXJyYXkoeFZhbHMubGVuZ3RoKTtcbiAgICBjb25zdCBvZmZWYWxzTGVuZ3RoID0gb2ZmVmFscy5sZW5ndGg7XG4gICAgY29uc3Qgc1ZhbHNMZW5ndGggPSBzVmFscy5sZW5ndGg7XG4gICAgY29uc3QgdmFyVmFsc0xlbmd0aCA9IHZhclZhbHMubGVuZ3RoO1xuICAgIGNvbnN0IG1WYWxzTGVuZ3RoID0gbVZhbHMubGVuZ3RoO1xuICAgIGxldCBvZmZpID0gMDtcbiAgICBsZXQgbWkgPSAwO1xuICAgIGxldCBzaSA9IDA7XG4gICAgbGV0IHZpID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHhWYWxzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIG91dFZhbHNbaV0gPSBvZmZWYWxzW29mZmkrK10gK1xuICAgICAgICAgICAgKHhWYWxzW2ldIC0gbVZhbHNbbWkrK10pICogc1ZhbHNbc2krK10gL1xuICAgICAgICAgICAgICAgIE1hdGguc3FydCh2YXJWYWxzW3ZpKytdICsgdmFyaWFuY2VFcHNpbG9uKTtcbiAgICAgICAgaWYgKG9mZmkgPj0gb2ZmVmFsc0xlbmd0aCkge1xuICAgICAgICAgICAgb2ZmaSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1pID49IG1WYWxzTGVuZ3RoKSB7XG4gICAgICAgICAgICBtaSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpID49IHNWYWxzTGVuZ3RoKSB7XG4gICAgICAgICAgICBzaSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZpID49IHZhclZhbHNMZW5ndGgpIHtcbiAgICAgICAgICAgIHZpID0gMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyh4LnNoYXBlLCB4LmR0eXBlLCBvdXRWYWxzKTtcbn1cbmV4cG9ydCBjb25zdCBiYXRjaE5vcm1Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRnVzZWRCYXRjaE5vcm0sXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGJhdGNoTm9ybSxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1CYXRjaE5vcm0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBCYXRjaFRvU3BhY2VORCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQgeyBzbGljZSB9IGZyb20gJy4vU2xpY2UnO1xuaW1wb3J0IHsgdHJhbnNwb3NlIH0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuZXhwb3J0IGZ1bmN0aW9uIGJhdGNoVG9TcGFjZU5EKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBibG9ja1NoYXBlLCBjcm9wcyB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChbeF0sICdiYXRjaFRvU3BhY2VORCcpO1xuICAgIGNvbnN0IHByb2QgPSBibG9ja1NoYXBlLnJlZHVjZSgoYSwgYikgPT4gYSAqIGIpO1xuICAgIGNvbnN0IHJlc2hhcGVkID0gYmFja2VuZF91dGlsLmdldFJlc2hhcGVkKHguc2hhcGUsIGJsb2NrU2hhcGUsIHByb2QpO1xuICAgIGNvbnN0IHBlcm11dGVkID0gYmFja2VuZF91dGlsLmdldFBlcm11dGVkKHJlc2hhcGVkLmxlbmd0aCwgYmxvY2tTaGFwZS5sZW5ndGgpO1xuICAgIGNvbnN0IHJlc2hhcGVkUGVybXV0ZWQgPSBiYWNrZW5kX3V0aWwuZ2V0UmVzaGFwZWRQZXJtdXRlZCh4LnNoYXBlLCBibG9ja1NoYXBlLCBwcm9kKTtcbiAgICBjb25zdCBzbGljZUJlZ2luQ29vcmRzID0gYmFja2VuZF91dGlsLmdldFNsaWNlQmVnaW5Db29yZHMoY3JvcHMsIGJsb2NrU2hhcGUubGVuZ3RoKTtcbiAgICBjb25zdCBzbGljZVNpemUgPSBiYWNrZW5kX3V0aWwuZ2V0U2xpY2VTaXplKHJlc2hhcGVkUGVybXV0ZWQsIGNyb3BzLCBibG9ja1NoYXBlLmxlbmd0aCk7XG4gICAgY29uc3QgeFJlc2hhcGVkID0gcmVzaGFwZSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiByZXNoYXBlZCB9IH0pO1xuICAgIGNvbnN0IHhUcmFuc3Bvc2VkID0gdHJhbnNwb3NlKHsgaW5wdXRzOiB7IHg6IHhSZXNoYXBlZCB9LCBiYWNrZW5kLCBhdHRyczogeyBwZXJtOiBwZXJtdXRlZCB9IH0pO1xuICAgIGNvbnN0IHhUcmFuc3Bvc2VkUmVzaGFwZWQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHhUcmFuc3Bvc2VkIH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiByZXNoYXBlZFBlcm11dGVkIH0gfSk7XG4gICAgY29uc3QgcmVzdWx0ID0gc2xpY2Uoe1xuICAgICAgICBpbnB1dHM6IHsgeDogeFRyYW5zcG9zZWRSZXNoYXBlZCB9LFxuICAgICAgICBiYWNrZW5kLFxuICAgICAgICBhdHRyczogeyBiZWdpbjogc2xpY2VCZWdpbkNvb3Jkcywgc2l6ZTogc2xpY2VTaXplIH1cbiAgICB9KTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHhSZXNoYXBlZCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh4VHJhbnNwb3NlZCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh4VHJhbnNwb3NlZFJlc2hhcGVkKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGNvbnN0IGJhdGNoVG9TcGFjZU5EQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEJhdGNoVG9TcGFjZU5ELFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBiYXRjaFRvU3BhY2VORFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJhdGNoVG9TcGFjZU5ELmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEJpbmNvdW50IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGJpbmNvdW50SW1wbCB9IGZyb20gJy4vQmluY291bnRfaW1wbCc7XG5leHBvcnQgZnVuY3Rpb24gYmluY291bnQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHgsIHdlaWdodHMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHNpemUgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHhWYWxzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHdlaWdodHNWYWxzID0gYmFja2VuZC5kYXRhLmdldCh3ZWlnaHRzLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IG91dFZhbHMgPSBiaW5jb3VudEltcGwoeFZhbHMsIHdlaWdodHNWYWxzLCB3ZWlnaHRzLmR0eXBlLCB3ZWlnaHRzLnNoYXBlLCBzaXplKTtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbc2l6ZV0sIHdlaWdodHMuZHR5cGUsIG91dFZhbHMpO1xufVxuZXhwb3J0IGNvbnN0IGJpbmNvdW50Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEJpbmNvdW50LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBiaW5jb3VudFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJpbmNvdW50LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJ1ZmZlciwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgZnVuY3Rpb24gYmluY291bnRJbXBsKHhWYWxzLCB3ZWlnaHRzVmFscywgd2VpZ2h0c0R0eXBlLCB3ZWlnaHRzU2hhcGUsIHNpemUpIHtcbiAgICBjb25zdCB3ZWlnaHRzU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSh3ZWlnaHRzU2hhcGUpO1xuICAgIGNvbnN0IG91dFZhbHMgPSB1dGlsLm1ha2VaZXJvc1R5cGVkQXJyYXkoc2l6ZSwgd2VpZ2h0c0R0eXBlKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHhWYWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0geFZhbHNbaV07XG4gICAgICAgIGlmICh2YWx1ZSA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW5wdXQgeCBtdXN0IGJlIG5vbi1uZWdhdGl2ZSEnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgPj0gc2l6ZSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdlaWdodHNTaXplID4gMCkge1xuICAgICAgICAgICAgb3V0VmFsc1t2YWx1ZV0gKz0gd2VpZ2h0c1ZhbHNbaV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvdXRWYWxzW3ZhbHVlXSArPSAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXRWYWxzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGJpbmNvdW50UmVkdWNlSW1wbCh4QnVmLCB3ZWlnaHRzQnVmLCBzaXplLCBiaW5hcnlPdXRwdXQgPSBmYWxzZSkge1xuICAgIGNvbnN0IG51bVJvd3MgPSB4QnVmLnNoYXBlWzBdO1xuICAgIGNvbnN0IG51bUNvbHMgPSB4QnVmLnNoYXBlWzFdO1xuICAgIGNvbnN0IG91dEJ1ZiA9IGJ1ZmZlcihbbnVtUm93cywgc2l6ZV0sIHdlaWdodHNCdWYuZHR5cGUpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtUm93czsgaSsrKSB7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbnVtQ29sczsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHhCdWYuZ2V0KGksIGopO1xuICAgICAgICAgICAgaWYgKHZhbHVlIDwgMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW5wdXQgeCBtdXN0IGJlIG5vbi1uZWdhdGl2ZSEnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YWx1ZSA+PSBzaXplKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYmluYXJ5T3V0cHV0KSB7XG4gICAgICAgICAgICAgICAgb3V0QnVmLnNldCgxLCBpLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAod2VpZ2h0c0J1Zi5zaXplID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBvdXRCdWYuc2V0KG91dEJ1Zi5nZXQoaSwgdmFsdWUpICsgd2VpZ2h0c0J1Zi5nZXQoaSwgaiksIGksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG91dEJ1Zi5zZXQob3V0QnVmLmdldChpLCB2YWx1ZSkgKyAxLCBpLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXRCdWY7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1CaW5jb3VudF9pbXBsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IENhc3QsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmltcG9ydCB7IHplcm9zIH0gZnJvbSAnLi4vdXRpbHMvemVyb3NfaW1wbCc7XG5pbXBvcnQgeyBjb21wbGV4IH0gZnJvbSAnLi9Db21wbGV4JztcbmltcG9ydCB7IGlkZW50aXR5IH0gZnJvbSAnLi9JZGVudGl0eSc7XG5pbXBvcnQgeyByZWFsIH0gZnJvbSAnLi9SZWFsJztcbmV4cG9ydCBmdW5jdGlvbiBjYXN0KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBkdHlwZSB9ID0gYXR0cnM7XG4gICAgLy8gQ2FzdGluZyB0byBjb21wbGV4NjQuXG4gICAgaWYgKGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICBpZiAoeC5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgICAgIHJldHVybiBpZGVudGl0eSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgemVyb3NUZW5zb3JJbmZvID0gemVyb3MoYmFja2VuZCwgeC5zaGFwZSwgeC5kdHlwZSk7XG4gICAgICAgIGNvbnN0IGZsb2F0WCA9IGNhc3QoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kLCBhdHRyczogeyBkdHlwZTogJ2Zsb2F0MzInIH0gfSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBsZXgoeyBpbnB1dHM6IHsgcmVhbDogZmxvYXRYLCBpbWFnOiB6ZXJvc1RlbnNvckluZm8gfSwgYmFja2VuZCB9KTtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh6ZXJvc1RlbnNvckluZm8pO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGZsb2F0WCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8vIENhc3RpbmcgZnJvbSBjb21wbGV4NjRcbiAgICBpZiAoeC5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgY29uc3QgcmVhbFBhcnQgPSByZWFsKHsgaW5wdXRzOiB7IGlucHV0OiB4IH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNhc3QoeyBpbnB1dHM6IHsgeDogcmVhbFBhcnQgfSwgYmFja2VuZCwgYXR0cnM6IHsgZHR5cGUgfSB9KTtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZWFsUGFydCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGlmICghdXRpbC5oYXNFbmNvZGluZ0xvc3MoeC5kdHlwZSwgZHR5cGUpKSB7XG4gICAgICAgIC8vIFdlIGRvbid0IGNoYW5nZSB0aGUgdW5kZXJseWluZyBkYXRhLCBzaW5jZSB3ZSBjYXN0IHRvIGhpZ2hlclxuICAgICAgICAvLyBwcmVjaXNpb24uXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGlkZW50aXR5KHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCB9KTtcbiAgICAgICAgcmV0dXJuIHsgZGF0YUlkOiByZXN1bHQuZGF0YUlkLCBzaGFwZTogcmVzdWx0LnNoYXBlLCBkdHlwZSB9O1xuICAgIH1cbiAgICBpZiAoZHR5cGUgPT09ICdpbnQzMicpIHtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgICAgICBjb25zdCByZXN1bHRWYWx1ZXMgPSBJbnQzMkFycmF5LmZyb20odmFsdWVzKTtcbiAgICAgICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oeC5zaGFwZSwgJ2ludDMyJywgcmVzdWx0VmFsdWVzKTtcbiAgICB9XG4gICAgaWYgKGR0eXBlID09PSAnYm9vbCcpIHtcbiAgICAgICAgLy8gVGhpcyBpcyBlc3NlbnRpYWxseSB0aGUgcmVzdWx0IG9mIG5vdEVxdWFsKHgsIDApLiBXZSBhdm9pZCB1c2luZ1xuICAgICAgICAvLyBrZXJuZWwgbm90RXF1YWwgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jeSwgaS5lLiBiaW5hcnlfdXRpbHMgLT5cbiAgICAgICAgLy8gY2FzdCAtPiBub3RFcXVhbCAtPiBiaW5hcnlfdXRpbHMuXG4gICAgICAgIGNvbnN0IHhWYWxzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgICAgICBjb25zdCB6ZXJvID0gdXRpbC50b1R5cGVkQXJyYXkoWzBdLCB4LmR0eXBlKTtcbiAgICAgICAgY29uc3QgW3Jlc3VsdERhdGEsIHJlc3VsdFNoYXBlXSA9IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwoKGEsIGIpID0+IChhICE9PSBiKSA/IDEgOiAwKSh4LnNoYXBlLCBbXSwgeFZhbHMsIHplcm8sICdib29sJyk7XG4gICAgICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHJlc3VsdFNoYXBlLCAnYm9vbCcsIHJlc3VsdERhdGEpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIENhc3Q6IGZhaWxlZCB0byBjYXN0ICR7eC5kdHlwZX0gdG8gJHtkdHlwZX1gKTtcbn1cbmV4cG9ydCBjb25zdCBjYXN0Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IENhc3QsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGNhc3Rcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DYXN0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBDZWlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVNpbXBsZVVuYXJ5SW1wbCB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X2ltcGwnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jRnJvbUltcGwgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgY2VpbEltcGwgPSBjcmVhdGVTaW1wbGVVbmFyeUltcGwoKHhpKSA9PiBNYXRoLmNlaWwoeGkpKTtcbmV4cG9ydCBjb25zdCBjZWlsID0gdW5hcnlLZXJuZWxGdW5jRnJvbUltcGwoQ2VpbCwgY2VpbEltcGwpO1xuZXhwb3J0IGNvbnN0IGNlaWxDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQ2VpbCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogY2VpbCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DZWlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBDbGlwQnlWYWx1ZSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgY2xpcCA9IHVuYXJ5S2VybmVsRnVuYyhDbGlwQnlWYWx1ZSwgKHhpLCBhdHRycykgPT4ge1xuICAgIGNvbnN0IGNsaXBBdHRycyA9IGF0dHJzO1xuICAgIGlmICh4aSA+IGNsaXBBdHRycy5jbGlwVmFsdWVNYXgpIHtcbiAgICAgICAgcmV0dXJuIGNsaXBBdHRycy5jbGlwVmFsdWVNYXg7XG4gICAgfVxuICAgIHJldHVybiB4aSA8IGNsaXBBdHRycy5jbGlwVmFsdWVNaW4gPyBjbGlwQXR0cnMuY2xpcFZhbHVlTWluIDogeGk7XG59KTtcbmV4cG9ydCBjb25zdCBjbGlwQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IENsaXBCeVZhbHVlLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBjbGlwLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNsaXAuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQ29tcGxleCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgZnVuY3Rpb24gY29tcGxleChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyByZWFsLCBpbWFnIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgcmVhbFZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHJlYWwuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgaW1hZ1ZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KGltYWcuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgY29tcGxleEluZm8gPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHJlYWwuc2hhcGUsICdjb21wbGV4NjQnKTtcbiAgICBjb25zdCBjb21wbGV4ID0gYmFja2VuZC5kYXRhLmdldChjb21wbGV4SW5mby5kYXRhSWQpO1xuICAgIC8vIFRoZSBjb21wbGV4IHRlbnNvciBvd25zIHRoZSB1bmRlcmx5aW5nIHJlYWwgYW5kIGltYWcgdGVuc29ySW5mb3MsIG9ubHkgdGhlXG4gICAgLy8gY29tcGxleCB0ZW5zb3IgdHJhY2tzIHJlZkNvdW50LCB3aGVuIGNvbXBsZXhEYXRhIGlzIGRpc3Bvc2VkIHRoZVxuICAgIC8vIHVuZGVybHlpbmcgdGVuc29yRGF0YSB3aWxsIGJlIGRpc3Bvc2VkLlxuICAgIGNvbXBsZXguY29tcGxleFRlbnNvckluZm9zID0ge1xuICAgICAgICByZWFsOiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHJlYWwuc2hhcGUsICdmbG9hdDMyJywgcmVhbFZhbHMpLFxuICAgICAgICBpbWFnOiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGltYWcuc2hhcGUsICdmbG9hdDMyJywgaW1hZ1ZhbHMpXG4gICAgfTtcbiAgICByZXR1cm4gY29tcGxleEluZm87XG59XG5leHBvcnQgY29uc3QgY29tcGxleENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBDb21wbGV4LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBjb21wbGV4XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29tcGxleC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQ29tcGxleEFicywgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgY29uc3QgY29tcGxleEFicyA9IChhcmdzKSA9PiB7XG4gICAgY29uc3QgeyB4IH0gPSBhcmdzLmlucHV0cztcbiAgICBjb25zdCBjcHVCYWNrZW5kID0gYXJncy5iYWNrZW5kO1xuICAgIGNvbnN0IHJlc3VsdFZhbHVlcyA9IG5ldyBGbG9hdDMyQXJyYXkodXRpbC5zaXplRnJvbVNoYXBlKHguc2hhcGUpKTtcbiAgICBjb25zdCBjb21wbGV4VmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpO1xuICAgIGNvbnN0IHJlYWwgPSBjb21wbGV4VmFscy5jb21wbGV4VGVuc29ySW5mb3MucmVhbDtcbiAgICBjb25zdCBpbWFnID0gY29tcGxleFZhbHMuY29tcGxleFRlbnNvckluZm9zLmltYWc7XG4gICAgY29uc3QgcmVhbFZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KHJlYWwuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgaW1hZ1ZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KGltYWcuZGF0YUlkKS52YWx1ZXM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWFsVmFscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCByZWFsID0gcmVhbFZhbHNbaV07XG4gICAgICAgIGNvbnN0IGltYWcgPSBpbWFnVmFsc1tpXTtcbiAgICAgICAgcmVzdWx0VmFsdWVzW2ldID0gTWF0aC5oeXBvdChyZWFsLCBpbWFnKTtcbiAgICB9XG4gICAgcmV0dXJuIGNwdUJhY2tlbmQubWFrZU91dHB1dChyZXN1bHRWYWx1ZXMsIHguc2hhcGUsICdmbG9hdDMyJyk7XG59O1xuZXhwb3J0IGNvbnN0IGNvbXBsZXhBYnNDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQ29tcGxleEFicyxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogY29tcGxleEFicyxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db21wbGV4QWJzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgQ29uY2F0LCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNvbXBsZXggfSBmcm9tICcuL0NvbXBsZXgnO1xuaW1wb3J0IHsgY29uY2F0SW1wbCB9IGZyb20gJy4vQ29uY2F0X2ltcGwnO1xuaW1wb3J0IHsgaWRlbnRpdHkgfSBmcm9tICcuL0lkZW50aXR5JztcbmltcG9ydCB7IGltYWcgfSBmcm9tICcuL0ltYWcnO1xuaW1wb3J0IHsgcmVhbCB9IGZyb20gJy4vUmVhbCc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmV4cG9ydCBmdW5jdGlvbiBjb25jYXQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGF4aXMgfSA9IGF0dHJzO1xuICAgIGNvbnN0ICRheGlzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShheGlzLCBpbnB1dHNbMF0uc2hhcGUpWzBdO1xuICAgIGxldCBvdXRTaGFwZSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0U2hhcGUoaW5wdXRzLm1hcCh0ID0+IHQuc2hhcGUpLCAkYXhpcyk7XG4gICAgaWYgKHV0aWwuc2l6ZUZyb21TaGFwZShvdXRTaGFwZSkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0U2hhcGUsIGlucHV0c1swXS5kdHlwZSwgW10pO1xuICAgIH1cbiAgICAvLyBLZWVwIG9ubHkgbm9uLWVtcHR5IHRlbnNvcnMgKGlnbm9yZSB0ZW5zb3JzIHdpdGggMCBpbiB0aGVpciBzaGFwZSkuXG4gICAgY29uc3QgJGlucHV0cyA9IGlucHV0cy5maWx0ZXIodCA9PiB1dGlsLnNpemVGcm9tU2hhcGUodC5zaGFwZSkgPiAwKTtcbiAgICBpZiAoJGlucHV0cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGlkZW50aXR5KHsgaW5wdXRzOiB7IHg6ICRpbnB1dHNbMF0gfSwgYmFja2VuZCB9KTtcbiAgICB9XG4gICAgY29uc3Qgc2hhcGVzID0gJGlucHV0cy5tYXAodCA9PiB0LnNoYXBlKTtcbiAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0UGFyYW1zQ29uc2lzdGVudChzaGFwZXMsICRheGlzKTtcbiAgICBpZiAoJGlucHV0c1swXS5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgY29uc3QgcmVhbHMgPSAkaW5wdXRzLm1hcCgodCkgPT4gcmVhbCh7IGlucHV0czogeyBpbnB1dDogdCB9LCBiYWNrZW5kIH0pKTtcbiAgICAgICAgY29uc3QgaW1hZ3MgPSAkaW5wdXRzLm1hcCgodCkgPT4gaW1hZyh7IGlucHV0czogeyBpbnB1dDogdCB9LCBiYWNrZW5kIH0pKTtcbiAgICAgICAgY29uc3QgcmVhbENvbmNhdGVkID0gY29uY2F0KHsgaW5wdXRzOiByZWFscywgYmFja2VuZCwgYXR0cnM6IHsgYXhpczogJGF4aXMgfSB9KTtcbiAgICAgICAgY29uc3QgaW1hZ0NvbmNhdGVkID0gY29uY2F0KHsgaW5wdXRzOiBpbWFncywgYmFja2VuZCwgYXR0cnM6IHsgYXhpczogJGF4aXMgfSB9KTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY29tcGxleCh7IGlucHV0czogeyByZWFsOiByZWFsQ29uY2F0ZWQsIGltYWc6IGltYWdDb25jYXRlZCB9LCBiYWNrZW5kIH0pO1xuICAgICAgICByZWFscy5mb3JFYWNoKHIgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyKSk7XG4gICAgICAgIGltYWdzLmZvckVhY2goaSA9PiBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGkpKTtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZWFsQ29uY2F0ZWQpO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGltYWdDb25jYXRlZCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8vIEFueSBjb25jYXQgb2Ygbi1kaW1lbnNpb25hbCB0ZW5zb3JzIGFjcm9zcyBhbnkgYXhpcyBjYW4gYmUgcmVkdWNlZCB0b1xuICAgIC8vIGEgY29uY2F0ZW5hdGlvbiBvZiB0d28tZGltZW5zaW9uYWwgdGVuc29ycyBhY3Jvc3MgdGhlIGF4aXMgMSBieSBmaXJzdFxuICAgIC8vIHBhcnRpdGlvbmluZyB0aGUgYXhlcyBvZiB0aGUgb3JpZ2luYWwgdGVuc29ycyBpbnRvIHRob3NlIGxlc3MgdGhhbiB0aGVcbiAgICAvLyBheGlzIHRvIGJlIGNvbmNhdGVuYXRlZCBhbmQgdGhlIHJlc3QuIFRoZW4gcmVzaGFwZSB0aGUgdGVuc29yc1xuICAgIC8vIGludG8gYSB0d28tZGltZW5zaW9uYWwgdGVuc29yIGJ5IGNvbGxhcHNpbmcgdGhlc2UgdHdvIHNldHMgb2YgYXhlcyBhbmRcbiAgICAvLyBjb25jYXRlbmF0ZSB0aGUgcmVzdWx0aW5nIG1hdHJpY2VzIGFjcm9zcyB0aGUgYXhpcyAxLCBmaW5hbGx5IHJlc2hhcGluZ1xuICAgIC8vIHRoZSByZXN1bHQgdG8gaGF2ZSB0aGUgcHJvcGVyIHNoYXBlLlxuICAgIGNvbnN0IGlucHV0czJEID0gJGlucHV0cy5tYXAodCA9PiB7XG4gICAgICAgIGNvbnN0IGlubmVyU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSh0LnNoYXBlLnNsaWNlKCRheGlzKSk7XG4gICAgICAgIGNvbnN0IHNoYXBlID0gWy0xLCBpbm5lclNpemVdO1xuICAgICAgICByZXR1cm4gcmVzaGFwZSh7IGlucHV0czogeyB4OiB0IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlIH0gfSk7XG4gICAgfSk7XG4gICAgY29uc3QgaW5wdXRzVmFsU2hhcGVzID0gaW5wdXRzMkQubWFwKHQgPT4ge1xuICAgICAgICByZXR1cm4geyB2YWxzOiBiYWNrZW5kLmRhdGEuZ2V0KHQuZGF0YUlkKS52YWx1ZXMsIHNoYXBlOiB0LnNoYXBlIH07XG4gICAgfSk7XG4gICAgLy8gQ29uY2F0cyAyZCB0ZW5zb3JzIGFsb25nIGF4aXM9MS5cbiAgICBvdXRTaGFwZSA9XG4gICAgICAgIGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0U2hhcGUoaW5wdXRzMkQubWFwKHQgPT4gdC5zaGFwZSksIDEgLyogYXhpcyAqLyk7XG4gICAgY29uc3Qgc2ltcGx5Q29uY2F0ID0gaW5wdXRzMkRbMF0uc2hhcGVbMF0gPT09IDE7XG4gICAgY29uc3Qgb3V0VmFscyA9IGNvbmNhdEltcGwoaW5wdXRzVmFsU2hhcGVzLCBvdXRTaGFwZSwgaW5wdXRzWzBdLmR0eXBlLCBzaW1wbHlDb25jYXQpO1xuICAgIGNvbnN0IGZpbmFsT3V0U2hhcGUgPSBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dFNoYXBlKCRpbnB1dHMubWFwKHQgPT4gdC5zaGFwZSksICRheGlzKTtcbiAgICBjb25zdCBvdXRJbmZvID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhmaW5hbE91dFNoYXBlLCBpbnB1dHNbMF0uZHR5cGUsIG91dFZhbHMpO1xuICAgIGlucHV0czJELmZvckVhY2godCA9PiBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHQpKTtcbiAgICByZXR1cm4gb3V0SW5mbztcbn1cbmV4cG9ydCBjb25zdCBjb25jYXRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQ29uY2F0LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBjb25jYXRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db25jYXQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiBjb25jYXRJbXBsKGlucHV0cywgb3V0U2hhcGUsIGR0eXBlLCBzaW1wbHlDb25jYXQpIHtcbiAgICBjb25zdCBvdXRWYWxzID0gdXRpbC5nZXRBcnJheUZyb21EVHlwZShkdHlwZSwgdXRpbC5zaXplRnJvbVNoYXBlKG91dFNoYXBlKSk7XG4gICAgaWYgKHNpbXBseUNvbmNhdCAmJiBkdHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gVXNlIGJ1aWx0LWluIFR5cGVkQXJyYXkuc2V0KCkgbWV0aG9kIGZvciBzcGVlZC5cbiAgICAgICAgbGV0IG9mZnNldCA9IDA7XG4gICAgICAgIGlucHV0cy5mb3JFYWNoKGlucHV0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoaW5wdXQuc2hhcGUpO1xuICAgICAgICAgICAgb3V0VmFscy5zZXQoaW5wdXQudmFscywgb2Zmc2V0KTtcbiAgICAgICAgICAgIG9mZnNldCArPSBzaXplO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGxldCBjb2xPZmZzZXQgPSAwO1xuICAgICAgICBpbnB1dHMuZm9yRWFjaChpbnB1dCA9PiB7XG4gICAgICAgICAgICBjb25zdCBkZWNvZGVkRGF0YSA9IGR0eXBlID09PSAnc3RyaW5nJyA/XG4gICAgICAgICAgICAgICAgYmFja2VuZF91dGlsLmZyb21VaW50OFRvU3RyaW5nQXJyYXkoaW5wdXQudmFscykgOlxuICAgICAgICAgICAgICAgIGlucHV0LnZhbHM7XG4gICAgICAgICAgICBsZXQgdElkeCA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBpbnB1dC5zaGFwZVswXTsgKytyb3cpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNJZHggPSByb3cgKiBvdXRTaGFwZVsxXSArIGNvbE9mZnNldDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCBpbnB1dC5zaGFwZVsxXTsgKytjb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0VmFsc1tyZXNJZHggKyBjb2xdID0gZGVjb2RlZERhdGFbdElkeCsrXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb2xPZmZzZXQgKz0gaW5wdXQuc2hhcGVbMV07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gb3V0VmFscztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbmNhdF9pbXBsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgQ29udjJELCBUZW5zb3JCdWZmZXIsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBjb252MkQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHgsIGZpbHRlciB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0LCBkaWxhdGlvbnMsIGRpbVJvdW5kaW5nTW9kZSB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChbeCwgZmlsdGVyXSwgJ2NvbnYyZCcpO1xuICAgIGNvbnN0ICRkYXRhRm9ybWF0ID0gYmFja2VuZF91dGlsLmNvbnZlcnRDb252MkREYXRhRm9ybWF0KGRhdGFGb3JtYXQpO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252MkRJbmZvKHguc2hhcGUsIGZpbHRlci5zaGFwZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgZmFsc2UgLyogZGVwdGh3aXNlICovLCAkZGF0YUZvcm1hdCk7XG4gICAgY29uc3QgZmlsdGVySGVpZ2h0ID0gY29udkluZm8uZmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG4gICAgY29uc3QgZGlsYXRpb25IZWlnaHQgPSBjb252SW5mby5kaWxhdGlvbkhlaWdodDtcbiAgICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgICBjb25zdCBwYWRMZWZ0ID0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgIGNvbnN0IHBhZFRvcCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IGlzQ2hhbm5lbHNMYXN0ID0gY29udkluZm8uZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzTGFzdCc7XG4gICAgY29uc3QgeSA9IG5ldyBUZW5zb3JCdWZmZXIoY29udkluZm8ub3V0U2hhcGUsIHguZHR5cGUpO1xuICAgIGNvbnN0IHhTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyh4LnNoYXBlKTtcbiAgICBjb25zdCBmaWx0ZXJTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhmaWx0ZXIuc2hhcGUpO1xuICAgIGNvbnN0IHhCYXRjaFN0cmlkZSA9IHhTdHJpZGVzWzBdO1xuICAgIGNvbnN0IHhSb3dTdHJpZGUgPSBpc0NoYW5uZWxzTGFzdCA/IHhTdHJpZGVzWzFdIDogeFN0cmlkZXNbMl07XG4gICAgY29uc3QgeENvbFN0cmlkZSA9IGlzQ2hhbm5lbHNMYXN0ID8geFN0cmlkZXNbMl0gOiAxO1xuICAgIGNvbnN0IHhDaGFubmVsU3RyaWRlID0gaXNDaGFubmVsc0xhc3QgPyAxIDogeFN0cmlkZXNbMV07XG4gICAgY29uc3QgeUJhdGNoU3RyaWRlID0geS5zdHJpZGVzWzBdO1xuICAgIGNvbnN0IHlSb3dTdHJpZGUgPSBpc0NoYW5uZWxzTGFzdCA/IHkuc3RyaWRlc1sxXSA6IHkuc3RyaWRlc1syXTtcbiAgICBjb25zdCB5Q29sU3RyaWRlID0gaXNDaGFubmVsc0xhc3QgPyB5LnN0cmlkZXNbMl0gOiAxO1xuICAgIGNvbnN0IHlDaGFubmVsU3RyaWRlID0gaXNDaGFubmVsc0xhc3QgPyAxIDogeS5zdHJpZGVzWzFdO1xuICAgIGNvbnN0IHhWYWxzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHdWYWxzID0gYmFja2VuZC5kYXRhLmdldChmaWx0ZXIuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgeVZhbHMgPSB5LnZhbHVlcztcbiAgICBmb3IgKGxldCBiID0gMDsgYiA8IGNvbnZJbmZvLmJhdGNoU2l6ZTsgKytiKSB7XG4gICAgICAgIGNvbnN0IHhPZmZzZXQxID0gYiAqIHhCYXRjaFN0cmlkZTtcbiAgICAgICAgY29uc3QgeU9mZnNldDEgPSBiICogeUJhdGNoU3RyaWRlO1xuICAgICAgICBmb3IgKGxldCB5UiA9IDA7IHlSIDwgY29udkluZm8ub3V0SGVpZ2h0OyArK3lSKSB7XG4gICAgICAgICAgICBjb25zdCB5T2Zmc2V0MiA9IHlPZmZzZXQxICsgeVIgKiB5Um93U3RyaWRlO1xuICAgICAgICAgICAgY29uc3QgeFJDb3JuZXIgPSB5UiAqIGNvbnZJbmZvLnN0cmlkZUhlaWdodCAtIHBhZFRvcDtcbiAgICAgICAgICAgIGZvciAobGV0IHdSID0gMDsgd1IgPCBmaWx0ZXJIZWlnaHQ7ICsrd1IpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4UiA9IHhSQ29ybmVyICsgd1IgKiBkaWxhdGlvbkhlaWdodDtcbiAgICAgICAgICAgICAgICBpZiAoeFIgPCAwIHx8IHhSID49IGNvbnZJbmZvLmluSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB3T2Zmc2V0MSA9IHdSICogZmlsdGVyU3RyaWRlc1swXTtcbiAgICAgICAgICAgICAgICBjb25zdCB4T2Zmc2V0MiA9IHhPZmZzZXQxICsgeFIgKiB4Um93U3RyaWRlO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHlDID0gMDsgeUMgPCBjb252SW5mby5vdXRXaWR0aDsgKyt5Qykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB5T2Zmc2V0MyA9IHlPZmZzZXQyICsgeUMgKiB5Q29sU3RyaWRlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4Q0Nvcm5lciA9IHlDICogY29udkluZm8uc3RyaWRlV2lkdGggLSBwYWRMZWZ0O1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB3QyA9IDA7IHdDIDwgZmlsdGVyV2lkdGg7ICsrd0MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhDID0geENDb3JuZXIgKyB3QyAqIGRpbGF0aW9uV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeEMgPCAwIHx8IHhDID49IGNvbnZJbmZvLmluV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdPZmZzZXQyID0gd09mZnNldDEgKyB3QyAqIGZpbHRlclN0cmlkZXNbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4T2Zmc2V0MyA9IHhPZmZzZXQyICsgeEMgKiB4Q29sU3RyaWRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHdPZmZzZXQzID0gd09mZnNldDI7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBkMSA9IDA7IGQxIDwgY29udkluZm8uaW5DaGFubmVsczsgKytkMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhWYWwgPSB4VmFsc1t4T2Zmc2V0MyArIGQxICogeENoYW5uZWxTdHJpZGVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGQyID0gMDsgZDIgPCBjb252SW5mby5vdXRDaGFubmVsczsgKytkMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5VmFsc1t5T2Zmc2V0MyArIGQyICogeUNoYW5uZWxTdHJpZGVdICs9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VmFsICogd1ZhbHNbd09mZnNldDMgKyBkMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdPZmZzZXQzICs9IGNvbnZJbmZvLm91dENoYW5uZWxzO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHkuc2hhcGUsIHkuZHR5cGUsIHlWYWxzKTtcbn1cbmV4cG9ydCBjb25zdCBjb252MkRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQ29udjJELFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBjb252MkRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db252MkQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBDb252MkRCYWNrcHJvcEZpbHRlciwgVGVuc29yQnVmZmVyIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5leHBvcnQgZnVuY3Rpb24gY29udjJEQmFja3Byb3BGaWx0ZXIoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHgsIGR5IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQsIGRpbVJvdW5kaW5nTW9kZSwgZmlsdGVyU2hhcGUgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoW3gsIGR5XSwgJ2NvbnYyZEJhY2twcm9wRmlsdGVyJyk7XG4gICAgY29uc3QgJGRhdGFGb3JtYXQgPSBiYWNrZW5kX3V0aWwuY29udmVydENvbnYyRERhdGFGb3JtYXQoZGF0YUZvcm1hdCk7XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZUNvbnYyREluZm8oeC5zaGFwZSwgZmlsdGVyU2hhcGUsIHN0cmlkZXMsIDEgLyogZGlsYXRpb25zICovLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgZmFsc2UgLyogZGVwdGh3aXNlICovLCAkZGF0YUZvcm1hdCk7XG4gICAgY29uc3QgeyBzdHJpZGVIZWlnaHQsIHN0cmlkZVdpZHRoLCBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoIH0gPSBjb252SW5mbztcbiAgICBjb25zdCBpc0NoYW5uZWxzTGFzdCA9IGNvbnZJbmZvLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnO1xuICAgIGNvbnN0IGRXID0gbmV3IFRlbnNvckJ1ZmZlcihjb252SW5mby5maWx0ZXJTaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICBjb25zdCBsZWZ0UGFkID0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgIGNvbnN0IHRvcFBhZCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IHhWYWxzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IGR5VmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoZHkuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgeEJ1ZiA9IG5ldyBUZW5zb3JCdWZmZXIoeC5zaGFwZSwgeC5kdHlwZSwgeFZhbHMpO1xuICAgIGNvbnN0IGR5QnVmID0gbmV3IFRlbnNvckJ1ZmZlcihkeS5zaGFwZSwgZHkuZHR5cGUsIGR5VmFscyk7XG4gICAgZm9yIChsZXQgd1IgPSAwOyB3UiA8IGZpbHRlckhlaWdodDsgKyt3Uikge1xuICAgICAgICBjb25zdCB5Uk1pbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCgodG9wUGFkIC0gd1IpIC8gc3RyaWRlSGVpZ2h0KSk7XG4gICAgICAgIGNvbnN0IHlSTWF4ID0gTWF0aC5taW4oY29udkluZm8ub3V0SGVpZ2h0LCAoY29udkluZm8uaW5IZWlnaHQgKyB0b3BQYWQgLSB3UikgLyBzdHJpZGVIZWlnaHQpO1xuICAgICAgICBmb3IgKGxldCB3QyA9IDA7IHdDIDwgZmlsdGVyV2lkdGg7ICsrd0MpIHtcbiAgICAgICAgICAgIGNvbnN0IHlDTWluID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKChsZWZ0UGFkIC0gd0MpIC8gc3RyaWRlV2lkdGgpKTtcbiAgICAgICAgICAgIGNvbnN0IHlDTWF4ID0gTWF0aC5taW4oY29udkluZm8ub3V0V2lkdGgsIChjb252SW5mby5pbldpZHRoICsgbGVmdFBhZCAtIHdDKSAvIHN0cmlkZVdpZHRoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGQxID0gMDsgZDEgPCBjb252SW5mby5pbkNoYW5uZWxzOyArK2QxKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZDIgPSAwOyBkMiA8IGNvbnZJbmZvLm91dENoYW5uZWxzOyArK2QyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkb3RQcm9kID0gMDtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgYiA9IDA7IGIgPCBjb252SW5mby5iYXRjaFNpemU7ICsrYikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgeVIgPSB5Uk1pbjsgeVIgPCB5Uk1heDsgKyt5Uikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhSID0gd1IgKyB5UiAqIHN0cmlkZUhlaWdodCAtIHRvcFBhZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB5QyA9IHlDTWluOyB5QyA8IHlDTWF4OyArK3lDKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhDID0gd0MgKyB5QyAqIHN0cmlkZVdpZHRoIC0gbGVmdFBhZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ2hhbm5lbHNMYXN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3RQcm9kICs9IHhCdWYuZ2V0KGIsIHhSLCB4QywgZDEpICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeUJ1Zi5nZXQoYiwgeVIsIHlDLCBkMik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3RQcm9kICs9IHhCdWYuZ2V0KGIsIGQxLCB4UiwgeEMpICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeUJ1Zi5nZXQoYiwgZDIsIHlSLCB5Qyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZFcuc2V0KGRvdFByb2QsIHdSLCB3QywgZDEsIGQyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oZFcuc2hhcGUsIGRXLmR0eXBlLCBkVy52YWx1ZXMpO1xufVxuZXhwb3J0IGNvbnN0IGNvbnYyREJhY2twcm9wRmlsdGVyQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IENvbnYyREJhY2twcm9wRmlsdGVyLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBjb252MkRCYWNrcHJvcEZpbHRlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbnYyREJhY2twcm9wRmlsdGVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgQ29udjJEQmFja3Byb3BJbnB1dCwgVGVuc29yQnVmZmVyLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5leHBvcnQgZnVuY3Rpb24gY29udjJEQmFja3Byb3BJbnB1dChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgZHksIGZpbHRlciB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgaW5wdXRTaGFwZSwgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0LCBkaW1Sb3VuZGluZ01vZGUgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoW2R5LCBmaWx0ZXJdLCAnY29udjJkQmFja3Byb3BJbnB1dCcpO1xuICAgIGNvbnN0IGZpbHRlclN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGZpbHRlci5zaGFwZSk7XG4gICAgY29uc3QgZHlTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhkeS5zaGFwZSk7XG4gICAgbGV0ICRkYXRhRm9ybWF0ID0gYmFja2VuZF91dGlsLmNvbnZlcnRDb252MkREYXRhRm9ybWF0KGRhdGFGb3JtYXQpO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252MkRJbmZvKGlucHV0U2hhcGUsIGZpbHRlci5zaGFwZSwgc3RyaWRlcywgMSAvKiBkaWxhdGlvbnMgKi8sIHBhZCwgZGltUm91bmRpbmdNb2RlLCBmYWxzZSwgJGRhdGFGb3JtYXQpO1xuICAgIGNvbnN0IGR4ID0gbmV3IFRlbnNvckJ1ZmZlcihjb252SW5mby5pblNoYXBlLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IGR4VmFsdWVzID0gZHgudmFsdWVzO1xuICAgIGNvbnN0IGR5VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldChkeS5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBmbHRWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGZpbHRlci5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBbZmx0UzAsIGZsdFMxLCBmbHRTMl0gPSBmaWx0ZXJTdHJpZGVzO1xuICAgIGNvbnN0IHsgYmF0Y2hTaXplLCBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBpbkNoYW5uZWxzLCBpbkhlaWdodCwgaW5XaWR0aCwgb3V0Q2hhbm5lbHMsIG91dEhlaWdodCwgb3V0V2lkdGgsIHN0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGggfSA9IGNvbnZJbmZvO1xuICAgICRkYXRhRm9ybWF0ID0gY29udkluZm8uZGF0YUZvcm1hdDtcbiAgICBjb25zdCB0b3BQYWQgPSBmaWx0ZXJIZWlnaHQgLSAxIC0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgbGVmdFBhZCA9IGZpbHRlcldpZHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICBjb25zdCBpc0NoYW5uZWxzTGFzdCA9ICRkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNMYXN0JztcbiAgICBjb25zdCB4QmF0Y2hTdHJpZGUgPSBkeC5zdHJpZGVzWzBdO1xuICAgIGNvbnN0IHhSb3dTdHJpZGUgPSBpc0NoYW5uZWxzTGFzdCA/IGR4LnN0cmlkZXNbMV0gOiBkeC5zdHJpZGVzWzJdO1xuICAgIGNvbnN0IHhDb2xTdHJpZGUgPSBpc0NoYW5uZWxzTGFzdCA/IGR4LnN0cmlkZXNbMl0gOiAxO1xuICAgIGNvbnN0IHhDaGFubmVsU3RyaWRlID0gaXNDaGFubmVsc0xhc3QgPyAxIDogZHguc3RyaWRlc1sxXTtcbiAgICBjb25zdCB5QmF0Y2hTdHJpZGUgPSBkeVN0cmlkZXNbMF07XG4gICAgY29uc3QgeVJvd1N0cmlkZSA9IGlzQ2hhbm5lbHNMYXN0ID8gZHlTdHJpZGVzWzFdIDogZHlTdHJpZGVzWzJdO1xuICAgIGNvbnN0IHlDb2xTdHJpZGUgPSBpc0NoYW5uZWxzTGFzdCA/IGR5U3RyaWRlc1syXSA6IDE7XG4gICAgY29uc3QgeUNoYW5uZWxTdHJpZGUgPSBpc0NoYW5uZWxzTGFzdCA/IDEgOiBkeVN0cmlkZXNbMV07XG4gICAgZm9yIChsZXQgYiA9IDA7IGIgPCBiYXRjaFNpemU7ICsrYikge1xuICAgICAgICBmb3IgKGxldCBkMSA9IDA7IGQxIDwgaW5DaGFubmVsczsgKytkMSkge1xuICAgICAgICAgICAgZm9yIChsZXQgeFIgPSAwOyB4UiA8IGluSGVpZ2h0OyArK3hSKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeFJDb3JuZXIgPSB4UiAtIHRvcFBhZDtcbiAgICAgICAgICAgICAgICBjb25zdCB4Uk1pbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCh4UkNvcm5lciAvIHN0cmlkZUhlaWdodCkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHlSTWF4ID0gTWF0aC5taW4ob3V0SGVpZ2h0LCAoZmlsdGVySGVpZ2h0ICsgeFJDb3JuZXIpIC8gc3RyaWRlSGVpZ2h0KTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB4QyA9IDA7IHhDIDwgaW5XaWR0aDsgKyt4Qykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4Q0Nvcm5lciA9IHhDIC0gbGVmdFBhZDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeENNaW4gPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoeENDb3JuZXIgLyBzdHJpZGVXaWR0aCkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB5Q01heCA9IE1hdGgubWluKG91dFdpZHRoLCAoZmlsdGVyV2lkdGggKyB4Q0Nvcm5lcikgLyBzdHJpZGVXaWR0aCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkb3RQcm9kID0gMDtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgeVIgPSB4Uk1pbjsgeVIgPCB5Uk1heDsgKyt5Uikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd1IgPSB5UiAqIHN0cmlkZUhlaWdodCAtIHhSQ29ybmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgeUMgPSB4Q01pbjsgeUMgPCB5Q01heDsgKyt5Qykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdDID0geUMgKiBzdHJpZGVXaWR0aCAtIHhDQ29ybmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGR5T2Zmc2V0ID0geUJhdGNoU3RyaWRlICogYiArIHlSb3dTdHJpZGUgKiB5UiArIHlDb2xTdHJpZGUgKiB5QztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbHRPZmZzZXQgPSBmbHRTMCAqIChmaWx0ZXJIZWlnaHQgLSAxIC0gd1IpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmx0UzEgKiAoZmlsdGVyV2lkdGggLSAxIC0gd0MpICsgZmx0UzIgKiBkMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBkMiA9IDA7IGQyIDwgb3V0Q2hhbm5lbHM7ICsrZDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGl4ZWwgPSBkeVZhbHVlc1tkeU9mZnNldCArIHlDaGFubmVsU3RyaWRlICogZDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3ZWlnaHQgPSBmbHRWYWx1ZXNbZmx0T2Zmc2V0ICsgZDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3RQcm9kICs9IHBpeGVsICogd2VpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkeE9mZnNldCA9IHhCYXRjaFN0cmlkZSAqIGIgKyB4Um93U3RyaWRlICogeFIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgeENvbFN0cmlkZSAqIHhDICsgeENoYW5uZWxTdHJpZGUgKiBkMTtcbiAgICAgICAgICAgICAgICAgICAgZHhWYWx1ZXNbZHhPZmZzZXRdID0gZG90UHJvZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oZHguc2hhcGUsIGR4LmR0eXBlLCBkeC52YWx1ZXMpO1xufVxuZXhwb3J0IGNvbnN0IGNvbnYyREJhY2twcm9wSW5wdXRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQ29udjJEQmFja3Byb3BJbnB1dCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogY29udjJEQmFja3Byb3BJbnB1dFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbnYyREJhY2twcm9wSW5wdXQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBDb252M0QsIFRlbnNvckJ1ZmZlciwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnYzRChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCwgZmlsdGVyIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBzdHJpZGVzLCBwYWQsIGRpbGF0aW9ucyB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChbeCwgZmlsdGVyXSwgJ2NvbnYzZCcpO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252M0RJbmZvKHguc2hhcGUsIGZpbHRlci5zaGFwZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQpO1xuICAgIGNvbnN0IHsgZmlsdGVyRGVwdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGRpbGF0aW9uRGVwdGgsIGRpbGF0aW9uSGVpZ2h0LCBkaWxhdGlvbldpZHRoLCBwYWRJbmZvIH0gPSBjb252SW5mbztcbiAgICBjb25zdCBwYWRGcm9udCA9IHBhZEluZm8uZnJvbnQ7XG4gICAgY29uc3QgcGFkTGVmdCA9IHBhZEluZm8ubGVmdDtcbiAgICBjb25zdCBwYWRUb3AgPSBwYWRJbmZvLnRvcDtcbiAgICBjb25zdCB5ID0gbmV3IFRlbnNvckJ1ZmZlcihjb252SW5mby5vdXRTaGFwZSwgeC5kdHlwZSk7XG4gICAgY29uc3QgeFZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3Qgd1ZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KGZpbHRlci5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCB5VmFscyA9IHkudmFsdWVzO1xuICAgIGNvbnN0IHhTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyh4LnNoYXBlKTtcbiAgICBjb25zdCBmaWx0ZXJTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhmaWx0ZXIuc2hhcGUpO1xuICAgIGZvciAobGV0IGIgPSAwOyBiIDwgY29udkluZm8uYmF0Y2hTaXplOyArK2IpIHtcbiAgICAgICAgY29uc3QgeE9mZnNldDEgPSBiICogeFN0cmlkZXNbMF07XG4gICAgICAgIGNvbnN0IHlPZmZzZXQxID0gYiAqIHkuc3RyaWRlc1swXTtcbiAgICAgICAgZm9yIChsZXQgeUYgPSAwOyB5RiA8IGNvbnZJbmZvLm91dERlcHRoOyArK3lGKSB7XG4gICAgICAgICAgICBjb25zdCB5T2Zmc2V0MiA9IHlPZmZzZXQxICsgeUYgKiB5LnN0cmlkZXNbMV07XG4gICAgICAgICAgICBjb25zdCB4RkNvcm5lciA9IHlGICogY29udkluZm8uc3RyaWRlRGVwdGggLSBwYWRGcm9udDtcbiAgICAgICAgICAgIGZvciAobGV0IHdGID0gMDsgd0YgPCBmaWx0ZXJEZXB0aDsgKyt3Rikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhGID0geEZDb3JuZXIgKyB3RiAqIGRpbGF0aW9uRGVwdGg7XG4gICAgICAgICAgICAgICAgaWYgKHhGIDwgMCB8fCB4RiA+PSBjb252SW5mby5pbkRlcHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB3T2Zmc2V0MSA9IHdGICogZmlsdGVyU3RyaWRlc1swXTtcbiAgICAgICAgICAgICAgICBjb25zdCB4T2Zmc2V0MiA9IHhPZmZzZXQxICsgeEYgKiB4U3RyaWRlc1sxXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB5UiA9IDA7IHlSIDwgY29udkluZm8ub3V0SGVpZ2h0OyArK3lSKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHlPZmZzZXQzID0geU9mZnNldDIgKyB5UiAqIHkuc3RyaWRlc1syXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeFJDb3JuZXIgPSB5UiAqIGNvbnZJbmZvLnN0cmlkZUhlaWdodCAtIHBhZFRvcDtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgd1IgPSAwOyB3UiA8IGZpbHRlckhlaWdodDsgKyt3Uikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeFIgPSB4UkNvcm5lciArIHdSICogZGlsYXRpb25IZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeFIgPCAwIHx8IHhSID49IGNvbnZJbmZvLmluSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3T2Zmc2V0MiA9IHdPZmZzZXQxICsgd1IgKiBmaWx0ZXJTdHJpZGVzWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeE9mZnNldDMgPSB4T2Zmc2V0MiArIHhSICogeFN0cmlkZXNbMl07XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB5QyA9IDA7IHlDIDwgY29udkluZm8ub3V0V2lkdGg7ICsreUMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB5T2Zmc2V0NCA9IHlPZmZzZXQzICsgeUMgKiBjb252SW5mby5vdXRDaGFubmVscztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4Q0Nvcm5lciA9IHlDICogY29udkluZm8uc3RyaWRlV2lkdGggLSBwYWRMZWZ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHdDID0gMDsgd0MgPCBmaWx0ZXJXaWR0aDsgKyt3Qykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4QyA9IHhDQ29ybmVyICsgd0MgKiBkaWxhdGlvbldpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeEMgPCAwIHx8IHhDID49IGNvbnZJbmZvLmluV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdPZmZzZXQzID0gd09mZnNldDIgKyB3QyAqIGZpbHRlclN0cmlkZXNbMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhPZmZzZXQ0ID0geE9mZnNldDMgKyB4QyAqIGNvbnZJbmZvLmluQ2hhbm5lbHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB3T2Zmc2V0NCA9IHdPZmZzZXQzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBkMSA9IDA7IGQxIDwgY29udkluZm8uaW5DaGFubmVsczsgKytkMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeFZhbCA9IHhWYWxzW3hPZmZzZXQ0ICsgZDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgZDIgPSAwOyBkMiA8IGNvbnZJbmZvLm91dENoYW5uZWxzOyArK2QyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeVZhbHNbeU9mZnNldDQgKyBkMl0gKz0geFZhbCAqIHdWYWxzW3dPZmZzZXQ0ICsgZDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd09mZnNldDQgKz0gY29udkluZm8ub3V0Q2hhbm5lbHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oeS5zaGFwZSwgeS5kdHlwZSwgeS52YWx1ZXMpO1xufVxuZXhwb3J0IGNvbnN0IGNvbnYzRENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBDb252M0QsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGNvbnYzRFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbnYzRC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIENvbnYzREJhY2twcm9wRmlsdGVyVjIsIFRlbnNvckJ1ZmZlciwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnYzREJhY2twcm9wRmlsdGVyVjIoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHgsIGR5IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBzdHJpZGVzLCBwYWQsIGZpbHRlclNoYXBlIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KFt4LCBkeV0sICdjb252M2RCYWNrcHJvcEZpbHRlclYyJyk7XG4gICAgY29uc3QgeFN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKHguc2hhcGUpO1xuICAgIGNvbnN0IGR5U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoZHkuc2hhcGUpO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252M0RJbmZvKHguc2hhcGUsIGZpbHRlclNoYXBlLCBzdHJpZGVzLCAxIC8qIGRpbGF0aW9ucyAqLywgcGFkKTtcbiAgICBjb25zdCBzdHJpZGVEZXB0aCA9IGNvbnZJbmZvLnN0cmlkZURlcHRoO1xuICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICAgIGNvbnN0IGZpbHRlckRlcHRoID0gY29udkluZm8uZmlsdGVyRGVwdGg7XG4gICAgY29uc3QgZmlsdGVySGVpZ2h0ID0gY29udkluZm8uZmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG4gICAgY29uc3QgZHcgPSBuZXcgVGVuc29yQnVmZmVyKGNvbnZJbmZvLmZpbHRlclNoYXBlLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IGR3VmFsdWVzID0gZHcudmFsdWVzO1xuICAgIGNvbnN0IFtkd1MwLCBkd1MxLCBkd1MyLCBkd1MzXSA9IGR3LnN0cmlkZXM7XG4gICAgY29uc3QgZHlWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGR5LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IFtkeVMwLCBkeVMxLCBkeVMyLCBkeVMzXSA9IGR5U3RyaWRlcztcbiAgICBjb25zdCB4VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IFt4UzAsIHhTMSwgeFMyLCB4UzNdID0geFN0cmlkZXM7XG4gICAgY29uc3QgZnJvbnRQYWQgPSBjb252SW5mby5wYWRJbmZvLmZyb250O1xuICAgIGNvbnN0IGxlZnRQYWQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgY29uc3QgdG9wUGFkID0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgZm9yIChsZXQgd0YgPSAwOyB3RiA8IGZpbHRlckRlcHRoOyArK3dGKSB7XG4gICAgICAgIGNvbnN0IHlGTWluID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKChmcm9udFBhZCAtIHdGKSAvIHN0cmlkZURlcHRoKSk7XG4gICAgICAgIGNvbnN0IHlGTWF4ID0gTWF0aC5taW4oY29udkluZm8ub3V0RGVwdGgsIChjb252SW5mby5pbkRlcHRoICsgZnJvbnRQYWQgLSB3RikgLyBzdHJpZGVEZXB0aCk7XG4gICAgICAgIGNvbnN0IHdPZmZzZXQxID0gd0YgKiBkd1MwO1xuICAgICAgICBmb3IgKGxldCB3UiA9IDA7IHdSIDwgZmlsdGVySGVpZ2h0OyArK3dSKSB7XG4gICAgICAgICAgICBjb25zdCB5Uk1pbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCgodG9wUGFkIC0gd1IpIC8gc3RyaWRlSGVpZ2h0KSk7XG4gICAgICAgICAgICBjb25zdCB5Uk1heCA9IE1hdGgubWluKGNvbnZJbmZvLm91dEhlaWdodCwgKGNvbnZJbmZvLmluSGVpZ2h0ICsgdG9wUGFkIC0gd1IpIC8gc3RyaWRlSGVpZ2h0KTtcbiAgICAgICAgICAgIGNvbnN0IHdPZmZzZXQyID0gd1IgKiBkd1MxICsgd09mZnNldDE7XG4gICAgICAgICAgICBmb3IgKGxldCB3QyA9IDA7IHdDIDwgZmlsdGVyV2lkdGg7ICsrd0MpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB5Q01pbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCgobGVmdFBhZCAtIHdDKSAvIHN0cmlkZVdpZHRoKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgeUNNYXggPSBNYXRoLm1pbihjb252SW5mby5vdXRXaWR0aCwgKGNvbnZJbmZvLmluV2lkdGggKyBsZWZ0UGFkIC0gd0MpIC8gc3RyaWRlV2lkdGgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHdPZmZzZXQzID0gd0MgKiBkd1MyICsgd09mZnNldDI7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZDEgPSAwOyBkMSA8IGNvbnZJbmZvLmluQ2hhbm5lbHM7ICsrZDEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgd09mZnNldDQgPSBkMSAqIGR3UzMgKyB3T2Zmc2V0MztcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgZDIgPSAwOyBkMiA8IGNvbnZJbmZvLm91dENoYW5uZWxzOyArK2QyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZG90UHJvZCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBiID0gMDsgYiA8IGNvbnZJbmZvLmJhdGNoU2l6ZTsgKytiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeE9mZnNldDEgPSBiICogeFMwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHlPZmZzZXQxID0gYiAqIGR5UzA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgeUYgPSB5Rk1pbjsgeUYgPCB5Rk1heDsgKyt5Rikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4RiA9IHdGICsgeUYgKiBzdHJpZGVEZXB0aCAtIGZyb250UGFkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4T2Zmc2V0MiA9IHhGICogeFMxICsgeE9mZnNldDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHlPZmZzZXQyID0geUYgKiBkeVMxICsgeU9mZnNldDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHlSID0geVJNaW47IHlSIDwgeVJNYXg7ICsreVIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhSID0gd1IgKyB5UiAqIHN0cmlkZUhlaWdodCAtIHRvcFBhZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhPZmZzZXQzID0geFIgKiB4UzIgKyB4T2Zmc2V0MjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHlPZmZzZXQzID0geVIgKiBkeVMyICsgeU9mZnNldDI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB5QyA9IHlDTWluOyB5QyA8IHlDTWF4OyArK3lDKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeEMgPSB3QyArIHlDICogc3RyaWRlV2lkdGggLSBsZWZ0UGFkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhPZmZzZXQ0ID0geEMgKiB4UzMgKyB4T2Zmc2V0MztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB5T2Zmc2V0NCA9IHlDICogZHlTMyArIHlPZmZzZXQzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdFByb2QgKz0geFZhbHVlc1t4T2Zmc2V0NCArIGQxXSAqIGR5VmFsdWVzW3lPZmZzZXQ0ICsgZDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZHdWYWx1ZXNbd09mZnNldDQgKyBkMl0gPSBkb3RQcm9kO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGR3LnNoYXBlLCBkdy5kdHlwZSwgZHcudmFsdWVzKTtcbn1cbmV4cG9ydCBjb25zdCBjb252M0RCYWNrcHJvcEZpbHRlclYyQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IENvbnYzREJhY2twcm9wRmlsdGVyVjIsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGNvbnYzREJhY2twcm9wRmlsdGVyVjJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db252M0RCYWNrcHJvcEZpbHRlclYyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgQ29udjNEQmFja3Byb3BJbnB1dFYyLCBUZW5zb3JCdWZmZXIsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBjb252M0RCYWNrcHJvcElucHV0VjIoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGR5LCBmaWx0ZXIgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHBhZCwgc3RyaWRlcywgaW5wdXRTaGFwZSB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChbZHldLCAnY29udjNkQmFja3Byb3BJbnB1dFYyJyk7XG4gICAgY29uc3QgZHlTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhkeS5zaGFwZSk7XG4gICAgY29uc3QgZmlsdGVyU3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoZmlsdGVyLnNoYXBlKTtcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjNESW5mbyhpbnB1dFNoYXBlLCBmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsIDEgLyogZGlsYXRpb25zICovLCBwYWQpO1xuICAgIGNvbnN0IGR4ID0gbmV3IFRlbnNvckJ1ZmZlcihjb252SW5mby5pblNoYXBlLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IGR4VmFsdWVzID0gZHgudmFsdWVzO1xuICAgIGNvbnN0IFtkeFMwLCBkeFMxLCBkeFMyLCBkeFMzXSA9IGR4LnN0cmlkZXM7XG4gICAgY29uc3QgZHlWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGR5LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IFtkeVMwLCBkeVMxLCBkeVMyLCBkeVMzXSA9IGR5U3RyaWRlcztcbiAgICBjb25zdCBmbHRWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGZpbHRlci5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBbZmx0UzAsIGZsdFMxLCBmbHRTMiwgZmx0UzNdID0gZmlsdGVyU3RyaWRlcztcbiAgICBjb25zdCB7IGJhdGNoU2l6ZSwgZmlsdGVyRGVwdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGluQ2hhbm5lbHMsIGluRGVwdGgsIGluSGVpZ2h0LCBpbldpZHRoLCBvdXRDaGFubmVscywgb3V0RGVwdGgsIG91dEhlaWdodCwgb3V0V2lkdGgsIHN0cmlkZURlcHRoLCBzdHJpZGVIZWlnaHQsIHN0cmlkZVdpZHRoIH0gPSBjb252SW5mbztcbiAgICBjb25zdCBmcm9udFBhZCA9IGZpbHRlckRlcHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8uZnJvbnQ7XG4gICAgY29uc3QgdG9wUGFkID0gZmlsdGVySGVpZ2h0IC0gMSAtIGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IGxlZnRQYWQgPSBmaWx0ZXJXaWR0aCAtIDEgLSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgZm9yIChsZXQgYiA9IDA7IGIgPCBiYXRjaFNpemU7ICsrYikge1xuICAgICAgICBmb3IgKGxldCBkMSA9IDA7IGQxIDwgaW5DaGFubmVsczsgKytkMSkge1xuICAgICAgICAgICAgLy8gRnJhbWVzIG9mIGRlcHRoXG4gICAgICAgICAgICBmb3IgKGxldCB4RiA9IDA7IHhGIDwgaW5EZXB0aDsgKyt4Rikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhGQ29ybmVyID0geEYgLSBmcm9udFBhZDtcbiAgICAgICAgICAgICAgICBjb25zdCB4Rk1pbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCh4RkNvcm5lciAvIHN0cmlkZURlcHRoKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgeUZNYXggPSBNYXRoLm1pbihvdXREZXB0aCwgKGZpbHRlckRlcHRoICsgeEZDb3JuZXIpIC8gc3RyaWRlRGVwdGgpO1xuICAgICAgICAgICAgICAgIC8vIFJvd3MgYXMgcGVyIHN0YW5kYXJkIDJkIG1hdHJpeCBub3RhdGlvblxuICAgICAgICAgICAgICAgIGZvciAobGV0IHhSID0gMDsgeFIgPCBpbkhlaWdodDsgKyt4Uikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4UkNvcm5lciA9IHhSIC0gdG9wUGFkO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4Uk1pbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCh4UkNvcm5lciAvIHN0cmlkZUhlaWdodCkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB5Uk1heCA9IE1hdGgubWluKG91dEhlaWdodCwgKGZpbHRlckhlaWdodCArIHhSQ29ybmVyKSAvIHN0cmlkZUhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIENvbHVtbnMgYXMgcGVyIHN0YW5kYXJkIDJkIG1hdHJpeCBub3RhdGlvblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB4QyA9IDA7IHhDIDwgaW5XaWR0aDsgKyt4Qykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeENDb3JuZXIgPSB4QyAtIGxlZnRQYWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4Q01pbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCh4Q0Nvcm5lciAvIHN0cmlkZVdpZHRoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB5Q01heCA9IE1hdGgubWluKG91dFdpZHRoLCAoZmlsdGVyV2lkdGggKyB4Q0Nvcm5lcikgLyBzdHJpZGVXaWR0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZG90UHJvZCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB5RiA9IHhGTWluOyB5RiA8IHlGTWF4OyArK3lGKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd0YgPSB5RiAqIHN0cmlkZURlcHRoIC0geEZDb3JuZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgeVIgPSB4Uk1pbjsgeVIgPCB5Uk1heDsgKyt5Uikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3UiA9IHlSICogc3RyaWRlSGVpZ2h0IC0geFJDb3JuZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHlDID0geENNaW47IHlDIDwgeUNNYXg7ICsreUMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdDID0geUMgKiBzdHJpZGVXaWR0aCAtIHhDQ29ybmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHlPZmZzZXQgPSBkeVMwICogYiArIGR5UzEgKiB5RiArIGR5UzIgKiB5UiArIGR5UzMgKiB5QztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsdE9mZnNldCA9IGZsdFMwICogKGZpbHRlckRlcHRoIC0gMSAtIHdGKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmx0UzEgKiAoZmlsdGVySGVpZ2h0IC0gMSAtIHdSKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmx0UzIgKiAoZmlsdGVyV2lkdGggLSAxIC0gd0MpICsgZmx0UzMgKiBkMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGQyID0gMDsgZDIgPCBvdXRDaGFubmVsczsgKytkMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBpeGVsID0gZHlWYWx1ZXNbZHlPZmZzZXQgKyBkMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2VpZ2h0ID0gZmx0VmFsdWVzW2ZsdE9mZnNldCArIGQyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3RQcm9kICs9IHBpeGVsICogd2VpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZHhWYWx1ZXNbZHhTMCAqIGIgKyBkeFMxICogeEYgKyBkeFMyICogeFIgKyBkeFMzICogeEMgKyBkMV0gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdFByb2Q7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oZHguc2hhcGUsIGR4LmR0eXBlLCBkeC52YWx1ZXMpO1xufVxuZXhwb3J0IGNvbnN0IGNvbnYzREJhY2twcm9wSW5wdXRWMkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBDb252M0RCYWNrcHJvcElucHV0VjIsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGNvbnYzREJhY2twcm9wSW5wdXRWMlxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbnYzREJhY2twcm9wSW5wdXRWMi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBDb3MgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IGNvcyA9IHVuYXJ5S2VybmVsRnVuYyhDb3MsICh4aSkgPT4gTWF0aC5jb3MoeGkpKTtcbmV4cG9ydCBjb25zdCBjb3NDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQ29zLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBjb3MsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29zLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBDb3NoIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBjb3NoID0gdW5hcnlLZXJuZWxGdW5jKENvc2gsICh4aSkgPT4gTWF0aC5jb3NoKHhpKSk7XG5leHBvcnQgY29uc3QgY29zaENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBDb3NoLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBjb3NoLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvc2guanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYnVmZmVyLCBDcm9wQW5kUmVzaXplLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiBjcm9wQW5kUmVzaXplKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBpbWFnZSwgYm94ZXMsIGJveEluZCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgY3JvcFNpemUsIG1ldGhvZCwgZXh0cmFwb2xhdGlvblZhbHVlIH0gPSBhdHRycztcbiAgICBjb25zdCBbYmF0Y2gsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBudW1DaGFubmVsc10gPSBpbWFnZS5zaGFwZTtcbiAgICBjb25zdCBudW1Cb3hlcyA9IGJveGVzLnNoYXBlWzBdO1xuICAgIGNvbnN0IFtjcm9wSGVpZ2h0LCBjcm9wV2lkdGhdID0gY3JvcFNpemU7XG4gICAgY29uc3Qgb3V0cHV0ID0gYnVmZmVyKFtudW1Cb3hlcywgY3JvcEhlaWdodCwgY3JvcFdpZHRoLCBudW1DaGFubmVsc10sICdmbG9hdDMyJyk7XG4gICAgY29uc3QgYm94VmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoYm94ZXMuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgYm94SW5kVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoYm94SW5kLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IGltYWdlVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoaW1hZ2UuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgaW5TdHJpZGUgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGltYWdlLnNoYXBlKTsgLy8gdG8gY2FsY3VsYXRlIGZsYXQgaW5kZXhlcyBpbnRvIGltYWdlXG4gICAgY29uc3Qgb3V0U3RyaWRlID0gdXRpbC5jb21wdXRlU3RyaWRlcyhvdXRwdXQuc2hhcGUpOyAvLyB0byBjYWxjdWxhdGUgZmxhdCBpbmRleGVzIGludG8gb3V0cHV0XG4gICAgLy8gUmVmZXJlbmNlIGltcGxlbWVudGF0aW9uXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmZsb3cvYmxvYi9tYXN0ZXIvdGVuc29yZmxvdy9jb3JlL2tlcm5lbHMvY3JvcF9hbmRfcmVzaXplX29wLmNjXG4gICAgZm9yIChsZXQgYiA9IDA7IGIgPCBudW1Cb3hlczsgYisrKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0SW5kID0gYiAqIDQ7XG4gICAgICAgIGNvbnN0IHkxID0gYm94VmFsc1tzdGFydEluZF07XG4gICAgICAgIGNvbnN0IHgxID0gYm94VmFsc1tzdGFydEluZCArIDFdO1xuICAgICAgICBjb25zdCB5MiA9IGJveFZhbHNbc3RhcnRJbmQgKyAyXTtcbiAgICAgICAgY29uc3QgeDIgPSBib3hWYWxzW3N0YXJ0SW5kICsgM107XG4gICAgICAgIGNvbnN0IGJJbmQgPSBib3hJbmRWYWxzW2JdO1xuICAgICAgICBpZiAoYkluZCA+PSBiYXRjaCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaGVpZ2h0U2NhbGUgPSAoY3JvcEhlaWdodCA+IDEpID8gKHkyIC0geTEpICogKGltYWdlSGVpZ2h0IC0gMSkgLyAoY3JvcEhlaWdodCAtIDEpIDogMDtcbiAgICAgICAgY29uc3Qgd2lkdGhTY2FsZSA9IChjcm9wV2lkdGggPiAxKSA/ICh4MiAtIHgxKSAqIChpbWFnZVdpZHRoIC0gMSkgLyAoY3JvcFdpZHRoIC0gMSkgOiAwO1xuICAgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGNyb3BIZWlnaHQ7IHkrKykge1xuICAgICAgICAgICAgY29uc3QgeUluZCA9IChjcm9wSGVpZ2h0ID4gMSkgP1xuICAgICAgICAgICAgICAgIHkxICogKGltYWdlSGVpZ2h0IC0gMSkgKyB5ICogKGhlaWdodFNjYWxlKSA6XG4gICAgICAgICAgICAgICAgMC41ICogKHkxICsgeTIpICogKGltYWdlSGVpZ2h0IC0gMSk7XG4gICAgICAgICAgICBpZiAoeUluZCA8IDAgfHwgeUluZCA+IGltYWdlSGVpZ2h0IC0gMSkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgY3JvcFdpZHRoOyB4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBudW1DaGFubmVsczsgYysrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmQgPSBjICsgeCAqIG91dFN0cmlkZVsyXSArIHkgKiBvdXRTdHJpZGVbMV0gKyBiICogb3V0U3RyaWRlWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnZhbHVlc1tpbmRdID0gZXh0cmFwb2xhdGlvblZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1ldGhvZCA9PT0gJ2JpbGluZWFyJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvcEluZCA9IE1hdGguZmxvb3IoeUluZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgYm90dG9tSW5kID0gTWF0aC5jZWlsKHlJbmQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHlMZXJwID0geUluZCAtIHRvcEluZDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IGNyb3BXaWR0aDsgeCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhJbmQgPSAoY3JvcFdpZHRoID4gMSkgP1xuICAgICAgICAgICAgICAgICAgICAgICAgeDEgKiAoaW1hZ2VXaWR0aCAtIDEpICsgeCAqIHdpZHRoU2NhbGUgOlxuICAgICAgICAgICAgICAgICAgICAgICAgMC41ICogKHgxICsgeDIpICogKGltYWdlV2lkdGggLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHhJbmQgPCAwIHx8IHhJbmQgPiBpbWFnZVdpZHRoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBudW1DaGFubmVsczsgYysrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kID0gYyArIHggKiBvdXRTdHJpZGVbMl0gKyB5ICogb3V0U3RyaWRlWzFdICsgYiAqIG91dFN0cmlkZVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQudmFsdWVzW2luZF0gPSBleHRyYXBvbGF0aW9uVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsZWZ0SW5kID0gTWF0aC5mbG9vcih4SW5kKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmlnaHRJbmQgPSBNYXRoLmNlaWwoeEluZCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhMZXJwID0geEluZCAtIGxlZnRJbmQ7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgbnVtQ2hhbm5lbHM7IGMrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZCA9IGMgKyBsZWZ0SW5kICogaW5TdHJpZGVbMl0gKyB0b3BJbmQgKiBpblN0cmlkZVsxXSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYkluZCAqIGluU3RyaWRlWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9wTGVmdCA9IGltYWdlVmFsc1tpbmRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5kID0gYyArIHJpZ2h0SW5kICogaW5TdHJpZGVbMl0gKyB0b3BJbmQgKiBpblN0cmlkZVsxXSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYkluZCAqIGluU3RyaWRlWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9wUmlnaHQgPSBpbWFnZVZhbHNbaW5kXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZCA9IGMgKyBsZWZ0SW5kICogaW5TdHJpZGVbMl0gKyBib3R0b21JbmQgKiBpblN0cmlkZVsxXSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYkluZCAqIGluU3RyaWRlWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm90dG9tTGVmdCA9IGltYWdlVmFsc1tpbmRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5kID0gYyArIHJpZ2h0SW5kICogaW5TdHJpZGVbMl0gKyBib3R0b21JbmQgKiBpblN0cmlkZVsxXSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYkluZCAqIGluU3RyaWRlWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm90dG9tUmlnaHQgPSBpbWFnZVZhbHNbaW5kXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvcCA9IHRvcExlZnQgKyAodG9wUmlnaHQgLSB0b3BMZWZ0KSAqIHhMZXJwO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm90dG9tID0gYm90dG9tTGVmdCArIChib3R0b21SaWdodCAtIGJvdHRvbUxlZnQpICogeExlcnA7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmQgPSBjICsgeCAqIG91dFN0cmlkZVsyXSArIHkgKiBvdXRTdHJpZGVbMV0gKyBiICogb3V0U3RyaWRlWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnZhbHVlc1tpbmRdID0gdG9wICsgKChib3R0b20gLSB0b3ApICogeUxlcnApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7IC8vIG1ldGhvZCA9PSBcIm5lYXJlc3RcIlxuICAgICAgICAgICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgY3JvcFdpZHRoOyArK3gpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeEluZCA9IChjcm9wV2lkdGggPiAxKSA/XG4gICAgICAgICAgICAgICAgICAgICAgICB4MSAqIChpbWFnZVdpZHRoIC0gMSkgKyB4ICogd2lkdGhTY2FsZSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAwLjUgKiAoeDEgKyB4MikgKiAoaW1hZ2VXaWR0aCAtIDEpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoeEluZCA8IDAgfHwgeEluZCA+IGltYWdlV2lkdGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IG51bUNoYW5uZWxzOyBjKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmQgPSBjICsgeCAqIG91dFN0cmlkZVsyXSArIHkgKiBvdXRTdHJpZGVbMV0gKyBiICogb3V0U3RyaWRlWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC52YWx1ZXNbaW5kXSA9IGV4dHJhcG9sYXRpb25WYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsb3Nlc3RYID0gTWF0aC5yb3VuZCh4SW5kKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xvc2VzdFkgPSBNYXRoLnJvdW5kKHlJbmQpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IG51bUNoYW5uZWxzOyBjKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluSW5kID0gYyArIGNsb3Nlc3RYICogaW5TdHJpZGVbMl0gKyBjbG9zZXN0WSAqIGluU3RyaWRlWzFdICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSW5kICogaW5TdHJpZGVbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvdXRJbmQgPSBjICsgeCAqIG91dFN0cmlkZVsyXSArIHkgKiBvdXRTdHJpZGVbMV0gKyBiICogb3V0U3RyaWRlWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnZhbHVlc1tvdXRJbmRdID0gaW1hZ2VWYWxzW2luSW5kXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRwdXQuc2hhcGUsIG91dHB1dC5kdHlwZSwgb3V0cHV0LnZhbHVlcyk7XG59XG5leHBvcnQgY29uc3QgY3JvcEFuZFJlc2l6ZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBDcm9wQW5kUmVzaXplLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBjcm9wQW5kUmVzaXplXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q3JvcEFuZFJlc2l6ZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIEN1bXN1bSwgdXBjYXN0VHlwZSwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHsgdHJhbnNwb3NlIH0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuZXhwb3J0IGZ1bmN0aW9uIGN1bXN1bShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYXhpcywgZXhjbHVzaXZlLCByZXZlcnNlIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KHgsICdjdW1zdW0nKTtcbiAgICBjb25zdCBwZXJtdXRhdGlvbiA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oW2F4aXNdLCB4LnNoYXBlLmxlbmd0aCk7XG4gICAgbGV0ICR4ID0geDtcbiAgICBpZiAocGVybXV0YXRpb24gIT0gbnVsbCkge1xuICAgICAgICAkeCA9IHRyYW5zcG9zZSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHBlcm06IHBlcm11dGF0aW9uIH0gfSk7XG4gICAgfVxuICAgIGNvbnN0IHBlcm11dGVkQXhpcyA9IGJhY2tlbmRfdXRpbC5nZXRJbm5lck1vc3RBeGVzKDEsIHguc2hhcGUubGVuZ3RoKVswXTtcbiAgICBpZiAocGVybXV0ZWRBeGlzICE9PSAkeC5zaGFwZS5sZW5ndGggLSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgYmFja2VuZC5jdW1zdW0gaW4gQ1BVIGV4cGVjdHMgYW4gaW5uZXItbW9zdCBgICtcbiAgICAgICAgICAgIGBheGlzPSR7JHguc2hhcGUubGVuZ3RoIC0gMX0gYnV0IGdvdCBheGlzPSR7cGVybXV0ZWRBeGlzfWApO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHREdHlwZSA9IHVwY2FzdFR5cGUoJHguZHR5cGUsICdpbnQzMicpO1xuICAgIGNvbnN0IHZhbHMgPSB1dGlsLm1ha2VaZXJvc1R5cGVkQXJyYXkodXRpbC5zaXplRnJvbVNoYXBlKCR4LnNoYXBlKSwgcmVzdWx0RHR5cGUpO1xuICAgIGNvbnN0IGFWYWxzID0gYmFja2VuZC5kYXRhLmdldCgkeC5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBmaW5hbERpbSA9ICR4LnNoYXBlWyR4LnNoYXBlLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IGluZGV4QWRqdXN0ZXIgPSByZXZlcnNlID9cbiAgICAgICAgKGksIGopID0+IGkgKyBmaW5hbERpbSAtIGogLSAxIDpcbiAgICAgICAgKGksIGopID0+IGkgKyBqO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYVZhbHMubGVuZ3RoOyBpICs9IGZpbmFsRGltKSB7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZmluYWxEaW07IGorKykge1xuICAgICAgICAgICAgY29uc3QgaWR4ID0gaW5kZXhBZGp1c3RlcihpLCBqKTtcbiAgICAgICAgICAgIGlmIChqID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdmFsc1tpZHhdID0gZXhjbHVzaXZlID8gMCA6IGFWYWxzW2lkeF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2SWR4ID0gaW5kZXhBZGp1c3RlcihpLCBqIC0gMSk7XG4gICAgICAgICAgICAgICAgdmFsc1tpZHhdID0gZXhjbHVzaXZlID8gYVZhbHNbcHJldklkeF0gKyB2YWxzW3ByZXZJZHhdIDpcbiAgICAgICAgICAgICAgICAgICAgYVZhbHNbaWR4XSArIHZhbHNbcHJldklkeF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbygkeC5zaGFwZSwgcmVzdWx0RHR5cGUsIHZhbHMpO1xuICAgIGlmIChwZXJtdXRhdGlvbiAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHJldmVyc2VQZXJtdXRhdGlvbiA9IGJhY2tlbmRfdXRpbC5nZXRVbmRvQXhlc1Blcm11dGF0aW9uKHBlcm11dGF0aW9uKTtcbiAgICAgICAgY29uc3QgcmV2ZXJzZVRyYW5zcG9zZWRSZXN1bHQgPSB0cmFuc3Bvc2UoeyBpbnB1dHM6IHsgeDogcmVzdWx0IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHBlcm06IHJldmVyc2VQZXJtdXRhdGlvbiB9IH0pO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc3VsdCk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oJHgpO1xuICAgICAgICByZXR1cm4gcmV2ZXJzZVRyYW5zcG9zZWRSZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgY29uc3QgY3Vtc3VtQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEN1bXN1bSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogY3Vtc3VtXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q3Vtc3VtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IERlbnNlQmluY291bnQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYmluY291bnRJbXBsLCBiaW5jb3VudFJlZHVjZUltcGwgfSBmcm9tICcuL0JpbmNvdW50X2ltcGwnO1xuZXhwb3J0IGZ1bmN0aW9uIGRlbnNlQmluY291bnQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHgsIHdlaWdodHMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHNpemUsIGJpbmFyeU91dHB1dCB9ID0gYXR0cnM7XG4gICAgaWYgKHguc2hhcGUubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvbnN0IHhWYWxzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgICAgICBjb25zdCB3ZWlnaHRzVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQod2VpZ2h0cy5kYXRhSWQpLnZhbHVlcztcbiAgICAgICAgY29uc3Qgb3V0VmFscyA9IGJpbmNvdW50SW1wbCh4VmFscywgd2VpZ2h0c1ZhbHMsIHdlaWdodHMuZHR5cGUsIHdlaWdodHMuc2hhcGUsIHNpemUpO1xuICAgICAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbc2l6ZV0sIHdlaWdodHMuZHR5cGUsIG91dFZhbHMpO1xuICAgIH1cbiAgICBlbHNlIGlmICh4LnNoYXBlLmxlbmd0aCA9PT0gMikge1xuICAgICAgICBjb25zdCB4QnVmID0gYmFja2VuZC5idWZmZXJTeW5jKHgpO1xuICAgICAgICBjb25zdCB3ZWlnaHRzQnVmID0gYmFja2VuZC5idWZmZXJTeW5jKHdlaWdodHMpO1xuICAgICAgICBjb25zdCBvdXRCdWYgPSBiaW5jb3VudFJlZHVjZUltcGwoeEJ1Ziwgd2VpZ2h0c0J1Ziwgc2l6ZSwgYmluYXJ5T3V0cHV0KTtcbiAgICAgICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0QnVmLnNoYXBlLCB3ZWlnaHRzLmR0eXBlLCBvdXRCdWYudmFsdWVzKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBpbiBkZW5zZUJpbmNvdW50OiBpbnB1dCBtdXN0IGJlIGF0IG1vc3QgcmFuayAyLCBidXQgZ290IHJhbmtgICtcbiAgICAgICAgYCR7eC5zaGFwZS5sZW5ndGh9LmApO1xufVxuZXhwb3J0IGNvbnN0IGRlbnNlQmluY291bnRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRGVuc2VCaW5jb3VudCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogZGVuc2VCaW5jb3VudFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURlbnNlQmluY291bnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRGVwdGhUb1NwYWNlLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiBkZXB0aFRvU3BhY2UoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGJsb2NrU2l6ZSwgZGF0YUZvcm1hdCB9ID0gYXR0cnM7XG4gICAgdXRpbC5hc3NlcnQoZGF0YUZvcm1hdCA9PT0gJ05IV0MnLCAoKSA9PiBgT25seSBOSFdDIGRhdGFGb3JtYXQgc3VwcG9ydGVkIG9uIENQVSBmb3IgZGVwdGhUb1NwYWNlLiBHb3QgJHtkYXRhRm9ybWF0fWApO1xuICAgIHV0aWwuYXNzZXJ0KGJsb2NrU2l6ZSA+IDEsICgpID0+IGBibG9ja1NpemUgc2hvdWxkIGJlID4gMSBmb3IgZGVwdGhUb1NwYWNlLCBidXQgd2FzOiAke2Jsb2NrU2l6ZX1gKTtcbiAgICBjb25zdCBiYXRjaFNpemUgPSB4LnNoYXBlWzBdO1xuICAgIGNvbnN0IGlucHV0SGVpZ2h0ID0geC5zaGFwZVsxXTtcbiAgICBjb25zdCBpbnB1dFdpZHRoID0geC5zaGFwZVsyXTtcbiAgICBjb25zdCBpbnB1dERlcHRoID0geC5zaGFwZVszXTtcbiAgICBjb25zdCBvdXRwdXRIZWlnaHQgPSBpbnB1dEhlaWdodCAqIGJsb2NrU2l6ZTtcbiAgICBjb25zdCBvdXRwdXRXaWR0aCA9IGlucHV0V2lkdGggKiBibG9ja1NpemU7XG4gICAgY29uc3Qgb3V0cHV0RGVwdGggPSBpbnB1dERlcHRoIC8gKGJsb2NrU2l6ZSAqIGJsb2NrU2l6ZSk7XG4gICAgY29uc3QgeFZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgRmxvYXQzMkFycmF5KGJhdGNoU2l6ZSAqIG91dHB1dEhlaWdodCAqIG91dHB1dFdpZHRoICogb3V0cHV0RGVwdGgpO1xuICAgIGxldCBvdXRwdXRJZHggPSAwO1xuICAgIGZvciAobGV0IGIgPSAwOyBiIDwgYmF0Y2hTaXplOyArK2IpIHtcbiAgICAgICAgZm9yIChsZXQgaCA9IDA7IGggPCBvdXRwdXRIZWlnaHQ7ICsraCkge1xuICAgICAgICAgICAgY29uc3QgaW5IID0gTWF0aC5mbG9vcihoIC8gYmxvY2tTaXplKTtcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldEggPSAoaCAlIGJsb2NrU2l6ZSk7XG4gICAgICAgICAgICBmb3IgKGxldCB3ID0gMDsgdyA8IG91dHB1dFdpZHRoOyArK3cpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpblcgPSBNYXRoLmZsb29yKHcgLyBibG9ja1NpemUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldFcgPSAodyAlIGJsb2NrU2l6ZSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0RCA9IChvZmZzZXRIICogYmxvY2tTaXplICsgb2Zmc2V0VykgKiBvdXRwdXREZXB0aDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBkID0gMDsgZCA8IG91dHB1dERlcHRoOyArK2QpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5EID0gZCArIG9mZnNldEQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0SWR4ID0gaW5EICsgaW5wdXREZXB0aCAqIChpblcgKyBpbnB1dFdpZHRoICogKGluSCArIGlucHV0SGVpZ2h0ICogYikpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRbb3V0cHV0SWR4KytdID0geFZhbHVlc1tpbnB1dElkeF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtiYXRjaFNpemUsIG91dHB1dEhlaWdodCwgb3V0cHV0V2lkdGgsIG91dHB1dERlcHRoXSwgeC5kdHlwZSwgcmVzdWx0KTtcbn1cbmV4cG9ydCBjb25zdCBkZXB0aFRvU3BhY2VDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRGVwdGhUb1NwYWNlLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBkZXB0aFRvU3BhY2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EZXB0aFRvU3BhY2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBEZXB0aHdpc2VDb252MmROYXRpdmUsIFRlbnNvckJ1ZmZlciwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIGRlcHRod2lzZUNvbnYyZE5hdGl2ZShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCwgZmlsdGVyIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBzdHJpZGVzLCBwYWQsIGRpbGF0aW9ucywgZGltUm91bmRpbmdNb2RlIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KFt4LCBmaWx0ZXJdLCAnZGVwdGh3aXNlQ29udjJETmF0aXZlJyk7XG4gICAgY29uc3QgeFN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKHguc2hhcGUpO1xuICAgIGNvbnN0IGZpbHRlclN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGZpbHRlci5zaGFwZSk7XG4gICAgbGV0ICRkaWxhdGlvbnMgPSBkaWxhdGlvbnM7XG4gICAgaWYgKCRkaWxhdGlvbnMgPT0gbnVsbCkge1xuICAgICAgICAkZGlsYXRpb25zID0gWzEsIDFdO1xuICAgIH1cbiAgICB1dGlsLmFzc2VydChiYWNrZW5kX3V0aWwuZWl0aGVyU3RyaWRlc09yRGlsYXRpb25zQXJlT25lKHN0cmlkZXMsICRkaWxhdGlvbnMpLCAoKSA9PiAnRXJyb3IgaW4gZGVwdGh3aXNlQ29udjJkOiBFaXRoZXIgc3RyaWRlcyBvciBkaWxhdGlvbnMgbXVzdCBiZSAnICtcbiAgICAgICAgYDEuIEdvdCBzdHJpZGVzICR7c3RyaWRlc30gYW5kIGRpbGF0aW9ucyAnJHskZGlsYXRpb25zfSdgKTtcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyh4LnNoYXBlLCBmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsICRkaWxhdGlvbnMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCB0cnVlIC8qIGRlcHRod2lzZSAqLyk7XG4gICAgY29uc3QgeyBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBkaWxhdGlvbkhlaWdodCwgZGlsYXRpb25XaWR0aCwgcGFkSW5mbyB9ID0gY29udkluZm87XG4gICAgY29uc3QgcGFkTGVmdCA9IHBhZEluZm8ubGVmdDtcbiAgICBjb25zdCBwYWRUb3AgPSBwYWRJbmZvLnRvcDtcbiAgICBjb25zdCBjaE11bCA9IGNvbnZJbmZvLm91dENoYW5uZWxzIC8gY29udkluZm8uaW5DaGFubmVscztcbiAgICBjb25zdCB5ID0gbmV3IFRlbnNvckJ1ZmZlcihjb252SW5mby5vdXRTaGFwZSwgeC5kdHlwZSk7XG4gICAgY29uc3QgeFZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3Qgd1ZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KGZpbHRlci5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCB5VmFscyA9IHkudmFsdWVzO1xuICAgIGZvciAobGV0IGIgPSAwOyBiIDwgY29udkluZm8uYmF0Y2hTaXplOyArK2IpIHtcbiAgICAgICAgY29uc3QgeE9mZnNldDEgPSBiICogeFN0cmlkZXNbMF07XG4gICAgICAgIGNvbnN0IHlPZmZzZXQxID0gYiAqIHkuc3RyaWRlc1swXTtcbiAgICAgICAgZm9yIChsZXQgeVIgPSAwOyB5UiA8IGNvbnZJbmZvLm91dEhlaWdodDsgKyt5Uikge1xuICAgICAgICAgICAgY29uc3QgeU9mZnNldDIgPSB5T2Zmc2V0MSArIHlSICogeS5zdHJpZGVzWzFdO1xuICAgICAgICAgICAgY29uc3QgeFJDb3JuZXIgPSB5UiAqIGNvbnZJbmZvLnN0cmlkZUhlaWdodCAtIHBhZFRvcDtcbiAgICAgICAgICAgIGZvciAobGV0IHdSID0gMDsgd1IgPCBmaWx0ZXJIZWlnaHQ7ICsrd1IpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4UiA9IHhSQ29ybmVyICsgd1IgKiBkaWxhdGlvbkhlaWdodDtcbiAgICAgICAgICAgICAgICBpZiAoeFIgPCAwIHx8IHhSID49IGNvbnZJbmZvLmluSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB3T2Zmc2V0MSA9IHdSICogZmlsdGVyU3RyaWRlc1swXTtcbiAgICAgICAgICAgICAgICBjb25zdCB4T2Zmc2V0MiA9IHhPZmZzZXQxICsgeFIgKiB4U3RyaWRlc1sxXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB5QyA9IDA7IHlDIDwgY29udkluZm8ub3V0V2lkdGg7ICsreUMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeU9mZnNldDMgPSB5T2Zmc2V0MiArIHlDICogeS5zdHJpZGVzWzJdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4Q0Nvcm5lciA9IHlDICogY29udkluZm8uc3RyaWRlV2lkdGggLSBwYWRMZWZ0O1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB3QyA9IDA7IHdDIDwgZmlsdGVyV2lkdGg7ICsrd0MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhDID0geENDb3JuZXIgKyB3QyAqIGRpbGF0aW9uV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeEMgPCAwIHx8IHhDID49IGNvbnZJbmZvLmluV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdPZmZzZXQyID0gd09mZnNldDEgKyB3QyAqIGZpbHRlclN0cmlkZXNbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4T2Zmc2V0MyA9IHhPZmZzZXQyICsgeEMgKiBjb252SW5mby5pbkNoYW5uZWxzO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHlPZmZzZXQ0ID0geU9mZnNldDM7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgd09mZnNldDMgPSB3T2Zmc2V0MjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGQxID0gMDsgZDEgPCBjb252SW5mby5pbkNoYW5uZWxzOyArK2QxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeFZhbCA9IHhWYWxzW3hPZmZzZXQzICsgZDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHEgPSAwOyBxIDwgY2hNdWw7ICsrcSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5VmFsc1t5T2Zmc2V0NCArIHFdICs9IHhWYWwgKiB3VmFsc1t3T2Zmc2V0MyArIHFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5T2Zmc2V0NCArPSBjaE11bDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3T2Zmc2V0MyArPSBjaE11bDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyh5LnNoYXBlLCB5LmR0eXBlLCB5LnZhbHVlcyk7XG59XG5leHBvcnQgY29uc3QgZGVwdGh3aXNlQ29udjJkTmF0aXZlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IERlcHRod2lzZUNvbnYyZE5hdGl2ZSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogZGVwdGh3aXNlQ29udjJkTmF0aXZlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGVwdGh3aXNlQ29udjJkTmF0aXZlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIsIFRlbnNvckJ1ZmZlciB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4LCBkeSB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgZmlsdGVyU2hhcGUgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoW3gsIGR5XSwgJ2RlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyJyk7XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZUNvbnYyREluZm8oeC5zaGFwZSwgZmlsdGVyU2hhcGUsIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIHRydWUgLyogZGVwdGh3aXNlICovKTtcbiAgICBjb25zdCB7IHN0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGggfSA9IGNvbnZJbmZvO1xuICAgIGNvbnN0IGRXID0gbmV3IFRlbnNvckJ1ZmZlcihjb252SW5mby5maWx0ZXJTaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICBjb25zdCBsZWZ0UGFkID0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgIGNvbnN0IHRvcFBhZCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IGNoTXVsID0gY29udkluZm8ub3V0Q2hhbm5lbHMgLyBjb252SW5mby5pbkNoYW5uZWxzO1xuICAgIGNvbnN0IHhWYWxzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHhCdWYgPSBuZXcgVGVuc29yQnVmZmVyKHguc2hhcGUsIHguZHR5cGUsIHhWYWxzKTtcbiAgICBjb25zdCBkeVZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KGR5LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IGR5QnVmID0gbmV3IFRlbnNvckJ1ZmZlcihkeS5zaGFwZSwgZHkuZHR5cGUsIGR5VmFscyk7XG4gICAgZm9yIChsZXQgd1IgPSAwOyB3UiA8IGZpbHRlckhlaWdodDsgKyt3Uikge1xuICAgICAgICBjb25zdCB5Uk1pbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCgodG9wUGFkIC0gd1IpIC8gc3RyaWRlSGVpZ2h0KSk7XG4gICAgICAgIGNvbnN0IHlSTWF4ID0gTWF0aC5taW4oY29udkluZm8ub3V0SGVpZ2h0LCAoY29udkluZm8uaW5IZWlnaHQgKyB0b3BQYWQgLSB3UikgLyBzdHJpZGVIZWlnaHQpO1xuICAgICAgICBmb3IgKGxldCB3QyA9IDA7IHdDIDwgZmlsdGVyV2lkdGg7ICsrd0MpIHtcbiAgICAgICAgICAgIGNvbnN0IHlDTWluID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKChsZWZ0UGFkIC0gd0MpIC8gc3RyaWRlV2lkdGgpKTtcbiAgICAgICAgICAgIGNvbnN0IHlDTWF4ID0gTWF0aC5taW4oY29udkluZm8ub3V0V2lkdGgsIChjb252SW5mby5pbldpZHRoICsgbGVmdFBhZCAtIHdDKSAvIHN0cmlkZVdpZHRoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGQyID0gMDsgZDIgPCBjb252SW5mby5vdXRDaGFubmVsczsgKytkMikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGQxID0gTWF0aC50cnVuYyhkMiAvIGNoTXVsKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkbSA9IGQyICUgY2hNdWw7XG4gICAgICAgICAgICAgICAgbGV0IGRvdFByb2QgPSAwO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGIgPSAwOyBiIDwgY29udkluZm8uYmF0Y2hTaXplOyArK2IpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgeVIgPSB5Uk1pbjsgeVIgPCB5Uk1heDsgKyt5Uikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeFIgPSB3UiArIHlSICogc3RyaWRlSGVpZ2h0IC0gdG9wUGFkO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgeUMgPSB5Q01pbjsgeUMgPCB5Q01heDsgKyt5Qykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhDID0gd0MgKyB5QyAqIHN0cmlkZVdpZHRoIC0gbGVmdFBhZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3RQcm9kICs9IHhCdWYuZ2V0KGIsIHhSLCB4QywgZDEpICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHlCdWYuZ2V0KGIsIHlSLCB5QywgZDIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRXLnNldChkb3RQcm9kLCB3Uiwgd0MsIGQxLCBkbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oZFcuc2hhcGUsIGRXLmR0eXBlLCBkVy52YWx1ZXMpO1xufVxuZXhwb3J0IGNvbnN0IGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IERlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCwgVGVuc29yQnVmZmVyLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5leHBvcnQgZnVuY3Rpb24gZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgZHksIGZpbHRlciB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgaW5wdXRTaGFwZSB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChbZHksIGZpbHRlcl0sICdkZXB0aHdpc2VDb252MkROYXRpdmVCYWNrcHJvcElucHV0Jyk7XG4gICAgY29uc3QgZHlTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhkeS5zaGFwZSk7XG4gICAgY29uc3QgZmlsdGVyU3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoZmlsdGVyLnNoYXBlKTtcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyhpbnB1dFNoYXBlLCBmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIHRydWUgLyogZGVwdGh3aXNlICovKTtcbiAgICBjb25zdCBkeCA9IG5ldyBUZW5zb3JCdWZmZXIoY29udkluZm8uaW5TaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICBjb25zdCBkeFZhbHVlcyA9IGR4LnZhbHVlcztcbiAgICBjb25zdCBbZHhTMCwgZHhTMSwgZHhTMl0gPSBkeC5zdHJpZGVzO1xuICAgIGNvbnN0IGR5VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldChkeS5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBbZHlTMCwgZHlTMSwgZHlTMl0gPSBkeVN0cmlkZXM7XG4gICAgY29uc3QgZmx0VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldChmaWx0ZXIuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgW2ZsdFMwLCBmbHRTMSwgZmx0UzJdID0gZmlsdGVyU3RyaWRlcztcbiAgICBjb25zdCB7IGJhdGNoU2l6ZSwgZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5DaGFubmVscywgaW5IZWlnaHQsIGluV2lkdGgsIG91dENoYW5uZWxzLCBvdXRIZWlnaHQsIG91dFdpZHRoLCBzdHJpZGVIZWlnaHQsIHN0cmlkZVdpZHRoIH0gPSBjb252SW5mbztcbiAgICBjb25zdCB0b3BQYWQgPSBmaWx0ZXJIZWlnaHQgLSAxIC0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgbGVmdFBhZCA9IGZpbHRlcldpZHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICBjb25zdCBjaE11bCA9IG91dENoYW5uZWxzIC8gaW5DaGFubmVscztcbiAgICBmb3IgKGxldCBiID0gMDsgYiA8IGJhdGNoU2l6ZTsgKytiKSB7XG4gICAgICAgIGZvciAobGV0IGQxID0gMDsgZDEgPCBpbkNoYW5uZWxzOyArK2QxKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB4UiA9IDA7IHhSIDwgaW5IZWlnaHQ7ICsreFIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4UkNvcm5lciA9IHhSIC0gdG9wUGFkO1xuICAgICAgICAgICAgICAgIGNvbnN0IHhSTWluID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKHhSQ29ybmVyIC8gc3RyaWRlSGVpZ2h0KSk7XG4gICAgICAgICAgICAgICAgY29uc3QgeVJNYXggPSBNYXRoLm1pbihvdXRIZWlnaHQsIChmaWx0ZXJIZWlnaHQgKyB4UkNvcm5lcikgLyBzdHJpZGVIZWlnaHQpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHhDID0gMDsgeEMgPCBpbldpZHRoOyArK3hDKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhDQ29ybmVyID0geEMgLSBsZWZ0UGFkO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4Q01pbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCh4Q0Nvcm5lciAvIHN0cmlkZVdpZHRoKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHlDTWF4ID0gTWF0aC5taW4ob3V0V2lkdGgsIChmaWx0ZXJXaWR0aCArIHhDQ29ybmVyKSAvIHN0cmlkZVdpZHRoKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRvdFByb2QgPSAwO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB5UiA9IHhSTWluOyB5UiA8IHlSTWF4OyArK3lSKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3UiA9IHlSICogc3RyaWRlSGVpZ2h0IC0geFJDb3JuZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB5QyA9IHhDTWluOyB5QyA8IHlDTWF4OyArK3lDKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd0MgPSB5QyAqIHN0cmlkZVdpZHRoIC0geENDb3JuZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHlPZmZzZXQgPSBkeVMwICogYiArIGR5UzEgKiB5UiArIGR5UzIgKiB5QztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbHRPZmZzZXQgPSBmbHRTMCAqIChmaWx0ZXJIZWlnaHQgLSAxIC0gd1IpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmx0UzEgKiAoZmlsdGVyV2lkdGggLSAxIC0gd0MpICsgZmx0UzIgKiBkMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBkbSA9IDA7IGRtIDwgY2hNdWw7ICsrZG0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZDIgPSBkMSAqIGNoTXVsICsgZG07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBpeGVsID0gZHlWYWx1ZXNbZHlPZmZzZXQgKyBkMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdlaWdodCA9IGZsdFZhbHVlc1tmbHRPZmZzZXQgKyBkbV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdFByb2QgKz0gcGl4ZWwgKiB3ZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGR4VmFsdWVzW2R4UzAgKiBiICsgZHhTMSAqIHhSICsgZHhTMiAqIHhDICsgZDFdID0gZG90UHJvZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oZHguc2hhcGUsIGR4LmR0eXBlLCBkeC52YWx1ZXMpO1xufVxuZXhwb3J0IGNvbnN0IGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYnVmZmVyLCBEaWFnLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiBkaWFnKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB4U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSh4LnNoYXBlKTtcbiAgICBjb25zdCB4VmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBvdXRCdWYgPSBidWZmZXIoW3hTaXplLCB4U2l6ZV0sIHguZHR5cGUpO1xuICAgIGNvbnN0IHZhbHMgPSBvdXRCdWYudmFsdWVzO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeFZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFsc1tpICogeFNpemUgKyBpXSA9IHhWYWxzW2ldO1xuICAgIH1cbiAgICBjb25zdCBvdXRTaGFwZSA9IFsuLi54LnNoYXBlLCAuLi54LnNoYXBlXTtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRTaGFwZSwgb3V0QnVmLmR0eXBlLCBvdXRCdWYudmFsdWVzKTtcbn1cbmV4cG9ydCBjb25zdCBkaWFnQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IERpYWcsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGRpYWdcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EaWFnLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgRGlsYXRpb24yRCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgY29uc3QgZGlsYXRpb24yZENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBEaWxhdGlvbjJELFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiAoeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0pID0+IHtcbiAgICAgICAgY29uc3QgeyB4LCBmaWx0ZXIgfSA9IGlucHV0cztcbiAgICAgICAgY29uc3QgeyBzdHJpZGVzLCBwYWQsIGRpbGF0aW9ucyB9ID0gYXR0cnM7XG4gICAgICAgIGNvbnN0IGNwdUJhY2tlbmQgPSBiYWNrZW5kO1xuICAgICAgICBjb25zdCB4VmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcztcbiAgICAgICAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcbiAgICAgICAgY29uc3QgZmlsdGVyVmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoZmlsdGVyLmRhdGFJZCkudmFsdWVzO1xuICAgICAgICBjb25zdCBmaWx0ZXJSYW5rID0gZmlsdGVyLnNoYXBlLmxlbmd0aDtcbiAgICAgICAgY29uc3QgeyBiYXRjaFNpemUsIGluSGVpZ2h0LCBpbldpZHRoLCBpbkNoYW5uZWxzLCBvdXRIZWlnaHQsIG91dFdpZHRoLCBwYWRJbmZvLCBzdHJpZGVIZWlnaHQsIHN0cmlkZVdpZHRoLCBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBkaWxhdGlvbkhlaWdodCwgZGlsYXRpb25XaWR0aCwgb3V0U2hhcGUgfSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlRGlsYXRpb24yREluZm8oeC5zaGFwZSwgZmlsdGVyLnNoYXBlLCBzdHJpZGVzLCBwYWQsICdOSFdDJyAvKiBkYXRhRm9ybWF0ICovLCBkaWxhdGlvbnMpO1xuICAgICAgICBjb25zdCBvdXRTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKG91dFNoYXBlKTtcbiAgICAgICAgY29uc3Qgb3V0UmFuayA9IG91dFNoYXBlLmxlbmd0aDtcbiAgICAgICAgY29uc3Qgb3V0cHV0VmFscyA9IHV0aWwuZ2V0QXJyYXlGcm9tRFR5cGUoeC5kdHlwZSwgb3V0U2l6ZSk7XG4gICAgICAgIC8vIFVwc2FtcGxpbmcgdGhlIGlucHV0IGJ5IGZpbGwgaW4gYGRpbGF0aW9uIHNpemUgLSAxYCB2YWx1ZXMgYmV0d2VlbiBlYWNoXG4gICAgICAgIC8vIGlucHV0IHZhbHVlLlxuICAgICAgICAvLyBUaGlzIGltcGxlbWVudGF0aW9uIGZvbGxvd3MgdGhlIFRGIGMrKyBpbXBsZW1lbnRhdGlvbjpcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yZmxvdy9ibG9iL2Q5YTNhODQ5ZWRjMTk4ZTkwMTcyYmM1OGViMjkzZGU0NTdmOWQ5ODYvdGVuc29yZmxvdy9jb3JlL2tlcm5lbHMvZGlsYXRpb25fb3BzLmNjXG4gICAgICAgIGZvciAobGV0IGIgPSAwOyBiIDwgYmF0Y2hTaXplOyArK2IpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGhPdXQgPSAwOyBoT3V0IDwgb3V0SGVpZ2h0OyArK2hPdXQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBoQmVnID0gaE91dCAqIHN0cmlkZUhlaWdodCAtIHBhZEluZm8udG9wO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHdPdXQgPSAwOyB3T3V0IDwgb3V0V2lkdGg7ICsrd091dCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB3QmVnID0gd091dCAqIHN0cmlkZVdpZHRoIC0gcGFkSW5mby5sZWZ0O1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBkID0gMDsgZCA8IGluQ2hhbm5lbHM7ICsrZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGN1clZhbCA9IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaCA9IDA7IGggPCBmaWx0ZXJIZWlnaHQ7ICsraCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhJbiA9IGhCZWcgKyBoICogZGlsYXRpb25IZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhJbiA+PSAwICYmIGhJbiA8IGluSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHcgPSAwOyB3IDwgZmlsdGVyV2lkdGg7ICsrdykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd0luID0gd0JlZyArIHcgKiBkaWxhdGlvbldpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdJbiA+PSAwICYmIHdJbiA8IGluV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4SW5kZXggPSB1dGlsLmxvY1RvSW5kZXgoW2IsIGhJbiwgd0luLCBkXSwgeFJhbmssIHV0aWwuY29tcHV0ZVN0cmlkZXMoeC5zaGFwZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlckluZGV4ID0gdXRpbC5sb2NUb0luZGV4KFtoLCB3LCBkXSwgZmlsdGVyUmFuaywgdXRpbC5jb21wdXRlU3RyaWRlcyhmaWx0ZXIuc2hhcGUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSB4VmFsc1t4SW5kZXhdICsgZmlsdGVyVmFsc1tmaWx0ZXJJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA+IGN1clZhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJWYWwgPSB2YWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0SW5kZXggPSB1dGlsLmxvY1RvSW5kZXgoW2IsIGhPdXQsIHdPdXQsIGRdLCBvdXRSYW5rLCB1dGlsLmNvbXB1dGVTdHJpZGVzKG91dFNoYXBlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRWYWxzW291dHB1dEluZGV4XSA9IGN1clZhbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRhSWQgPSBjcHVCYWNrZW5kLndyaXRlKHV0aWwudG9UeXBlZEFycmF5KG91dHB1dFZhbHMsIHguZHR5cGUpLCBvdXRTaGFwZSwgeC5kdHlwZSk7XG4gICAgICAgIHJldHVybiB7IGRhdGFJZCwgc2hhcGU6IG91dFNoYXBlLCBkdHlwZTogeC5kdHlwZSB9O1xuICAgIH1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EaWxhdGlvbjJELmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgRGlsYXRpb24yREJhY2twcm9wRmlsdGVyLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBjb25zdCBkaWxhdGlvbjJkQmFja3Byb3BGaWx0ZXJDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRGlsYXRpb24yREJhY2twcm9wRmlsdGVyLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiAoeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0pID0+IHtcbiAgICAgICAgY29uc3QgeyB4LCBmaWx0ZXIsIGR5IH0gPSBpbnB1dHM7XG4gICAgICAgIGNvbnN0IHsgc3RyaWRlcywgcGFkLCBkaWxhdGlvbnMgfSA9IGF0dHJzO1xuICAgICAgICBjb25zdCBjcHVCYWNrZW5kID0gYmFja2VuZDtcbiAgICAgICAgY29uc3QgJHggPSB1dGlsLnRvTmVzdGVkQXJyYXkoeC5zaGFwZSwgY3B1QmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzKTtcbiAgICAgICAgY29uc3QgJGZpbHRlciA9IHV0aWwudG9OZXN0ZWRBcnJheShmaWx0ZXIuc2hhcGUsIGNwdUJhY2tlbmQuZGF0YS5nZXQoZmlsdGVyLmRhdGFJZCkudmFsdWVzKTtcbiAgICAgICAgY29uc3QgeyBiYXRjaFNpemUsIGluSGVpZ2h0LCBpbldpZHRoLCBpbkNoYW5uZWxzLCBvdXRIZWlnaHQsIG91dFdpZHRoLCBwYWRJbmZvLCBzdHJpZGVIZWlnaHQsIHN0cmlkZVdpZHRoLCBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBkaWxhdGlvbkhlaWdodCwgZGlsYXRpb25XaWR0aCwgb3V0U2hhcGUgfSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlRGlsYXRpb24yREluZm8oeC5zaGFwZSwgZmlsdGVyLnNoYXBlLCBzdHJpZGVzLCBwYWQsICdOSFdDJyAvKiBkYXRhRm9ybWF0ICovLCBkaWxhdGlvbnMpO1xuICAgICAgICB1dGlsLmFzc2VydChkeS5yYW5rID09PSBvdXRTaGFwZS5sZW5ndGgsICgpID0+IGBFcnJvciBpbiAke0RpbGF0aW9uMkRCYWNrcHJvcEZpbHRlcn0sIGR5IGAgK1xuICAgICAgICAgICAgYG11c3QgaGF2ZSB0aGUgc2FtZSByYW5rIGFzIG91dHB1dCAke291dFNoYXBlLmxlbmd0aH0sIGJ1dCBnb3QgYCArXG4gICAgICAgICAgICBgJHtkeS5yYW5rfWApO1xuICAgICAgICBjb25zdCAkZHkgPSB1dGlsLnRvTmVzdGVkQXJyYXkob3V0U2hhcGUsIGNwdUJhY2tlbmQuZGF0YS5nZXQoZHkuZGF0YUlkKS52YWx1ZXMpO1xuICAgICAgICAvLyBUaGUgY29tcHV0ZWQgZmlsdGVyIGdyYWRpZW50cyBoYXMgdGhlIHNhbWUgZGltZW5zaW9ucyBhcyB0aGUgZmlsdGVyOlxuICAgICAgICAvLyBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgZGVwdGhdXG4gICAgICAgIGNvbnN0IGdyYWRpZW50cyA9IHV0aWwubWFrZVplcm9zTmVzdGVkVHlwZWRBcnJheShmaWx0ZXIuc2hhcGUsIGZpbHRlci5kdHlwZSk7XG4gICAgICAgIC8vIEluIHRoZSBjYXNlIG9mIG11bHRpcGxlIGFyZ21heCBicmFuY2hlcywgd2Ugb25seSBiYWNrLXByb3BhZ2F0ZSBhbG9uZyB0aGVcbiAgICAgICAgLy8gbGFzdCBicmFuY2gsIGkuZS4sIHRoZSBvbmUgd2l0aCBsYXJnZXN0IHZhbHVlIG9mIGBoICogZmlsdGVyX2NvbHMgKyB3YCxcbiAgICAgICAgLy8gc2ltaWxhcmx5IHRvIHRoZSBtYXgtcG9vbGluZyBiYWNrd2FyZCByb3V0aW5lcy5cbiAgICAgICAgLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBmb2xsb3dzIHRoZSBURiBjKysgaW1wbGVtZW50YXRpb246XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmZsb3cvYmxvYi9kOWEzYTg0OWVkYzE5OGU5MDE3MmJjNThlYjI5M2RlNDU3ZjlkOTg2L3RlbnNvcmZsb3cvY29yZS9rZXJuZWxzL2RpbGF0aW9uX29wcy5jY1xuICAgICAgICBmb3IgKGxldCBiID0gMDsgYiA8IGJhdGNoU2l6ZTsgKytiKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBoT3V0ID0gMDsgaE91dCA8IG91dEhlaWdodDsgKytoT3V0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaEJlZyA9IGhPdXQgKiBzdHJpZGVIZWlnaHQgLSBwYWRJbmZvLnRvcDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB3T3V0ID0gMDsgd091dCA8IG91dFdpZHRoOyArK3dPdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgd0JlZyA9IHdPdXQgKiBzdHJpZGVXaWR0aCAtIHBhZEluZm8ubGVmdDtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgZCA9IDA7IGQgPCBpbkNoYW5uZWxzOyArK2QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjdXJWYWwgPSBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoTWF4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB3TWF4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGggPSAwOyBoIDwgZmlsdGVySGVpZ2h0OyArK2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoSW4gPSBoQmVnICsgaCAqIGRpbGF0aW9uSGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoSW4gPj0gMCAmJiBoSW4gPCBpbkhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB3ID0gMDsgdyA8IGZpbHRlcldpZHRoOyArK3cpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdJbiA9IHdCZWcgKyB3ICogZGlsYXRpb25XaWR0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3SW4gPj0gMCAmJiB3SW4gPCBpbldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gJHhbYl1baEluXVt3SW5dW2RdICsgJGZpbHRlcltoXVt3XVtkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsID4gY3VyVmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1clZhbCA9IHZhbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaE1heCA9IGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdNYXggPSB3O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGdyYWRpZW50c1toTWF4XVt3TWF4XVtkXSArPSAkZHlbYl1baE91dF1bd091dF1bZF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YUlkID0gY3B1QmFja2VuZC53cml0ZSh1dGlsLnRvVHlwZWRBcnJheShncmFkaWVudHMsIHguZHR5cGUpLCBmaWx0ZXIuc2hhcGUsIGZpbHRlci5kdHlwZSk7XG4gICAgICAgIHJldHVybiB7IGRhdGFJZCwgc2hhcGU6IGZpbHRlci5zaGFwZSwgZHR5cGU6IGZpbHRlci5kdHlwZSB9O1xuICAgIH1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EaWxhdGlvbjJEQmFja3Byb3BGaWx0ZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBEaWxhdGlvbjJEQmFja3Byb3BJbnB1dCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgY29uc3QgZGlsYXRpb24yZEJhY2twcm9wSW5wdXRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRGlsYXRpb24yREJhY2twcm9wSW5wdXQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6ICh7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IHgsIGZpbHRlciwgZHkgfSA9IGlucHV0cztcbiAgICAgICAgY29uc3QgeyBzdHJpZGVzLCBwYWQsIGRpbGF0aW9ucyB9ID0gYXR0cnM7XG4gICAgICAgIGNvbnN0IGNwdUJhY2tlbmQgPSBiYWNrZW5kO1xuICAgICAgICBjb25zdCAkeCA9IHV0aWwudG9OZXN0ZWRBcnJheSh4LnNoYXBlLCBjcHVCYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXMpO1xuICAgICAgICBjb25zdCAkZmlsdGVyID0gdXRpbC50b05lc3RlZEFycmF5KGZpbHRlci5zaGFwZSwgY3B1QmFja2VuZC5kYXRhLmdldChmaWx0ZXIuZGF0YUlkKS52YWx1ZXMpO1xuICAgICAgICBjb25zdCB7IGJhdGNoU2l6ZSwgaW5IZWlnaHQsIGluV2lkdGgsIGluQ2hhbm5lbHMsIG91dEhlaWdodCwgb3V0V2lkdGgsIHBhZEluZm8sIHN0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGRpbGF0aW9uSGVpZ2h0LCBkaWxhdGlvbldpZHRoLCBvdXRTaGFwZSB9ID0gYmFja2VuZF91dGlsLmNvbXB1dGVEaWxhdGlvbjJESW5mbyh4LnNoYXBlLCBmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsIHBhZCwgJ05IV0MnIC8qIGRhdGFGb3JtYXQgKi8sIGRpbGF0aW9ucyk7XG4gICAgICAgIHV0aWwuYXNzZXJ0KGR5LnJhbmsgPT09IG91dFNoYXBlLmxlbmd0aCwgKCkgPT4gYEVycm9yIGluICR7RGlsYXRpb24yREJhY2twcm9wSW5wdXR9LCBkeSBgICtcbiAgICAgICAgICAgIGBtdXN0IGhhdmUgdGhlIHNhbWUgcmFuayBhcyBvdXRwdXQgJHtvdXRTaGFwZS5sZW5ndGh9LCBidXQgZ290IGAgK1xuICAgICAgICAgICAgYCR7ZHkucmFua31gKTtcbiAgICAgICAgY29uc3QgJGR5ID0gdXRpbC50b05lc3RlZEFycmF5KG91dFNoYXBlLCBjcHVCYWNrZW5kLmRhdGEuZ2V0KGR5LmRhdGFJZCkudmFsdWVzKTtcbiAgICAgICAgLy8gVGhlIGNvbXB1dGVkIGdyYWRpZW50cyBoYXMgdGhlIHNhbWUgZGltZW5zaW9ucyBhcyB0aGUgaW5wdXQ6XG4gICAgICAgIC8vIFtiYXRjaCwgaW5wdXRIZWlnaHQsIGlucHV0Q29scywgaW5DaGFubmVsXVxuICAgICAgICBjb25zdCBncmFkaWVudHMgPSB1dGlsLm1ha2VaZXJvc05lc3RlZFR5cGVkQXJyYXkoeC5zaGFwZSwgeC5kdHlwZSk7XG4gICAgICAgIC8vIEluIHRoZSBjYXNlIG9mIG11bHRpcGxlIGFyZ21heCBicmFuY2hlcywgd2Ugb25seSBiYWNrLXByb3BhZ2F0ZSBhbG9uZyB0aGVcbiAgICAgICAgLy8gbGFzdCBicmFuY2gsIGkuZS4sIHRoZSBvbmUgd2l0aCBsYXJnZXN0IHZhbHVlIG9mIGBoICogZmlsdGVyX2NvbHMgKyB3YCxcbiAgICAgICAgLy8gc2ltaWxhcmx5IHRvIHRoZSBtYXgtcG9vbGluZyBiYWNrd2FyZCByb3V0aW5lcy5cbiAgICAgICAgLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBmb2xsb3dzIHRoZSBURiBjKysgaW1wbGVtZW50YXRpb246XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmZsb3cvYmxvYi9kOWEzYTg0OWVkYzE5OGU5MDE3MmJjNThlYjI5M2RlNDU3ZjlkOTg2L3RlbnNvcmZsb3cvY29yZS9rZXJuZWxzL2RpbGF0aW9uX29wcy5jY1xuICAgICAgICBmb3IgKGxldCBiID0gMDsgYiA8IGJhdGNoU2l6ZTsgKytiKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBoT3V0ID0gMDsgaE91dCA8IG91dEhlaWdodDsgKytoT3V0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaEJlZyA9IGhPdXQgKiBzdHJpZGVIZWlnaHQgLSBwYWRJbmZvLnRvcDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB3T3V0ID0gMDsgd091dCA8IG91dFdpZHRoOyArK3dPdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgd0JlZyA9IHdPdXQgKiBzdHJpZGVXaWR0aCAtIHBhZEluZm8ubGVmdDtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgZCA9IDA7IGQgPCBpbkNoYW5uZWxzOyArK2QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjdXJWYWwgPSBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoSW5NYXggPSAoaEJlZyA8IDApID8gMCA6IGhCZWc7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgd0luTWF4ID0gKHdCZWcgPCAwKSA/IDAgOiB3QmVnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaCA9IDA7IGggPCBmaWx0ZXJIZWlnaHQ7ICsraCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhJbiA9IGhCZWcgKyBoICogZGlsYXRpb25IZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhJbiA+PSAwICYmIGhJbiA8IGluSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHcgPSAwOyB3IDwgZmlsdGVyV2lkdGg7ICsrdykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd0luID0gd0JlZyArIHcgKiBkaWxhdGlvbldpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdJbiA+PSAwICYmIHdJbiA8IGluV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSAkeFtiXVtoSW5dW3dJbl1bZF0gKyAkZmlsdGVyW2hdW3ddW2RdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwgPiBjdXJWYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyVmFsID0gdmFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSW5NYXggPSBoSW47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdJbk1heCA9IHdJbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBncmFkaWVudHNbYl1baEluTWF4XVt3SW5NYXhdW2RdICs9ICRkeVtiXVtoT3V0XVt3T3V0XVtkXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRhSWQgPSBjcHVCYWNrZW5kLndyaXRlKHV0aWwudG9UeXBlZEFycmF5KGdyYWRpZW50cywgeC5kdHlwZSksIHguc2hhcGUsIHguZHR5cGUpO1xuICAgICAgICByZXR1cm4geyBkYXRhSWQsIHNoYXBlOiB4LnNoYXBlLCBkdHlwZTogeC5kdHlwZSB9O1xuICAgIH1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EaWxhdGlvbjJEQmFja3Byb3BJbnB1dC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIEVpbnN1bSwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBtdWx0aXBseSB9IGZyb20gJy4vTXVsdGlwbHknO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQgeyBzdW0gfSBmcm9tICcuL1N1bSc7XG5pbXBvcnQgeyB0cmFuc3Bvc2UgfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5leHBvcnQgZnVuY3Rpb24gZWluc3VtKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBlcXVhdGlvbiB9ID0gYXR0cnM7XG4gICAgY29uc3QgdGVuc29ycyA9IGlucHV0cztcbiAgICBjb25zdCB7IGFsbERpbXMsIHN1bW1lZERpbXMsIGlkRGltcyB9ID0gYmFja2VuZF91dGlsLmRlY29kZUVpbnN1bUVxdWF0aW9uKGVxdWF0aW9uLCB0ZW5zb3JzLmxlbmd0aCk7XG4gICAgYmFja2VuZF91dGlsLmNoZWNrRWluc3VtRGltU2l6ZXMoYWxsRGltcy5sZW5ndGgsIGlkRGltcywgdGVuc29ycyk7XG4gICAgY29uc3QgeyBwYXRoLCBzdGVwcyB9ID0gYmFja2VuZF91dGlsLmdldEVpbnN1bUNvbXB1dGVQYXRoKHN1bW1lZERpbXMsIGlkRGltcyk7XG4gICAgY29uc3QgblN0ZXBzID0gc3RlcHMubGVuZ3RoO1xuICAgIGxldCBvdXQgPSBudWxsO1xuICAgIGxldCBudW1EaW1zUmVtYWluaW5nID0gYWxsRGltcy5sZW5ndGg7XG4gICAgY29uc3QgdGVuc29yc1RvRGlzcG9zZSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgblN0ZXBzOyArK2kpIHtcbiAgICAgICAgZm9yIChjb25zdCBpZFRlcm0gb2Ygc3RlcHNbaV0pIHtcbiAgICAgICAgICAgIGNvbnN0IHsgcGVybXV0YXRpb25JbmRpY2VzOiBwZXJtLCBleHBhbmREaW1zOiBkaW1zVG9FeHBhbmQgfSA9IGJhY2tlbmRfdXRpbC5nZXRFaW5zdW1QZXJtdXRhdGlvbihudW1EaW1zUmVtYWluaW5nLCBpZERpbXNbaWRUZXJtXSk7XG4gICAgICAgICAgICBsZXQgeDtcbiAgICAgICAgICAgIGlmIChiYWNrZW5kX3V0aWwuaXNJZGVudGl0eVBlcm11dGF0aW9uKHBlcm0pKSB7XG4gICAgICAgICAgICAgICAgeCA9IHRlbnNvcnNbaWRUZXJtXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHggPSB0cmFuc3Bvc2UoeyBpbnB1dHM6IHsgeDogdGVuc29yc1tpZFRlcm1dIH0sIGJhY2tlbmQsIGF0dHJzOiB7IHBlcm0gfSB9KTtcbiAgICAgICAgICAgICAgICB0ZW5zb3JzVG9EaXNwb3NlLnB1c2goeCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0YXJnZXRTaGFwZSA9IHguc2hhcGUuc2xpY2UoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgZGltc1RvRXhwYW5kLmxlbmd0aDsgKytrKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0U2hhcGUuc3BsaWNlKGRpbXNUb0V4cGFuZFtrXSwgMCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXV0aWwuYXJyYXlzRXF1YWwoeC5zaGFwZSwgdGFyZ2V0U2hhcGUpKSB7XG4gICAgICAgICAgICAgICAgeCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogdGFyZ2V0U2hhcGUgfSB9KTtcbiAgICAgICAgICAgICAgICB0ZW5zb3JzVG9EaXNwb3NlLnB1c2goeCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3V0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgb3V0ID0geDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICAgICAgICAgICAgICBvdXQgPSBtdWx0aXBseSh7IGlucHV0czogeyBhOiB4LCBiOiBvdXQgfSwgYmFja2VuZCB9KTtcbiAgICAgICAgICAgICAgICB0ZW5zb3JzVG9EaXNwb3NlLnB1c2gob3V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA8IG5TdGVwcyAtIDEpIHtcbiAgICAgICAgICAgIGlmIChwYXRoW2ldID49IDApIHtcbiAgICAgICAgICAgICAgICBvdXQgPSBzdW0oe1xuICAgICAgICAgICAgICAgICAgICBpbnB1dHM6IHsgeDogb3V0IH0sXG4gICAgICAgICAgICAgICAgICAgIGJhY2tlbmQsXG4gICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBheGlzOiBwYXRoW2ldIC0gKGFsbERpbXMubGVuZ3RoIC0gbnVtRGltc1JlbWFpbmluZyksXG4gICAgICAgICAgICAgICAgICAgICAgICBrZWVwRGltczogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRlbnNvcnNUb0Rpc3Bvc2UucHVzaChvdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbnVtRGltc1JlbWFpbmluZy0tO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIENsZWFuIHVwIGludGVybWVkaWF0ZSB0ZW5zb3JzLlxuICAgIGZvciAoY29uc3QgdGVuc29ySW5mbyBvZiB0ZW5zb3JzVG9EaXNwb3NlKSB7XG4gICAgICAgIGlmICh0ZW5zb3JJbmZvID09PSBvdXQpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odGVuc29ySW5mbyk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgZWluc3VtQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEVpbnN1bSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogZWluc3VtXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RWluc3VtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFbHUgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IGVsdSA9IHVuYXJ5S2VybmVsRnVuYyhFbHUsICh4aSkgPT4geGkgPj0gMCA/IHhpIDogKE1hdGguZXhwKHhpKSAtIDEpKTtcbmV4cG9ydCBjb25zdCBlbHVDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRWx1LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBlbHUsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RWx1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVsdUdyYWQsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBlbHVHcmFkKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IGR5LCB5IH0gPSBpbnB1dHM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChbZHksIHldLCAnZWx1R3JhZCcpO1xuICAgIGNvbnN0IHJlc3VsdFZhbHVlcyA9IG5ldyBGbG9hdDMyQXJyYXkodXRpbC5zaXplRnJvbVNoYXBlKHkuc2hhcGUpKTtcbiAgICBjb25zdCB2YWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KHkuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgZHlWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGR5LmRhdGFJZCkudmFsdWVzO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IHYgPSB2YWx1ZXNbaV07XG4gICAgICAgIGlmICh2ID49IDEpIHtcbiAgICAgICAgICAgIHJlc3VsdFZhbHVlc1tpXSA9IGR5VmFsdWVzW2ldO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0VmFsdWVzW2ldID0gZHlWYWx1ZXNbaV0gKiAodiArIDEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHkuc2hhcGUsICdmbG9hdDMyJywgcmVzdWx0VmFsdWVzKTtcbn1cbmV4cG9ydCBjb25zdCBlbHVHcmFkQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEVsdUdyYWQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGVsdUdyYWRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FbHVHcmFkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVxdWFsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfaW1wbCc7XG5pbXBvcnQgeyBiaW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBlcXVhbEltcGwgPSBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsKChhLCBiKSA9PiAoYSA9PT0gYikgPyAxIDogMCk7XG5leHBvcnQgY29uc3QgZXF1YWwgPSBiaW5hcnlLZXJuZWxGdW5jKEVxdWFsLCBlcXVhbEltcGwsIG51bGwgLyogY29tcGxleEltcGwgKi8sICdib29sJyk7XG5leHBvcnQgY29uc3QgZXF1YWxDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRXF1YWwsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGVxdWFsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RXF1YWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgRXJmIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmNvbnN0IHAgPSBiYWNrZW5kX3V0aWwuRVJGX1A7XG5jb25zdCBhMSA9IGJhY2tlbmRfdXRpbC5FUkZfQTE7XG5jb25zdCBhMiA9IGJhY2tlbmRfdXRpbC5FUkZfQTI7XG5jb25zdCBhMyA9IGJhY2tlbmRfdXRpbC5FUkZfQTM7XG5jb25zdCBhNCA9IGJhY2tlbmRfdXRpbC5FUkZfQTQ7XG5jb25zdCBhNSA9IGJhY2tlbmRfdXRpbC5FUkZfQTU7XG5leHBvcnQgY29uc3QgZXJmID0gdW5hcnlLZXJuZWxGdW5jKEVyZiwgKHhpKSA9PiB7XG4gICAgY29uc3Qgc2lnbiA9IE1hdGguc2lnbih4aSk7XG4gICAgY29uc3QgdiA9IE1hdGguYWJzKHhpKTtcbiAgICBjb25zdCB0ID0gMS4wIC8gKDEuMCArIHAgKiB2KTtcbiAgICByZXR1cm4gc2lnbiAqXG4gICAgICAgICgxLjAgLVxuICAgICAgICAgICAgKCgoKChhNSAqIHQgKyBhNCkgKiB0KSArIGEzKSAqIHQgKyBhMikgKiB0ICsgYTEpICogdCAqXG4gICAgICAgICAgICAgICAgTWF0aC5leHAoLXYgKiB2KSk7XG59KTtcbmV4cG9ydCBjb25zdCBlcmZDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRXJmLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBlcmYsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RXJmLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFeHAgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlU2ltcGxlVW5hcnlJbXBsIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfaW1wbCc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmNGcm9tSW1wbCB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBleHBJbXBsID0gY3JlYXRlU2ltcGxlVW5hcnlJbXBsKCh4aSkgPT4gTWF0aC5leHAoeGkpKTtcbmV4cG9ydCBjb25zdCBleHAgPSB1bmFyeUtlcm5lbEZ1bmNGcm9tSW1wbChFeHAsIGV4cEltcGwpO1xuZXhwb3J0IGNvbnN0IGV4cENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBFeHAsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGV4cCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FeHAuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRXhwYW5kRGltcywgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmV4cG9ydCBmdW5jdGlvbiBleHBhbmREaW1zKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBpbnB1dCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgZGltIH0gPSBhdHRycztcbiAgICBjb25zdCBpbnB1dFJhbmsgPSBpbnB1dC5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgbmV3U2hhcGUgPSBpbnB1dC5zaGFwZS5zbGljZSgpO1xuICAgIGxldCAkZGltID0gZGltO1xuICAgIGlmIChkaW0gPCAwKSB7XG4gICAgICAgIC8vIE5lZ2F0aXZlIHZhbHVlIGlzIGNvdW50ZWQgZnJvbSB0aGUgdGFpbCBvZiByYW5rLlxuICAgICAgICB1dGlsLmFzc2VydCgtKGlucHV0UmFuayArIDEpIDw9IGRpbSwgKCkgPT4gYEF4aXMgbXVzdCBiZSBpbiB0aGUgaW50ZXJ2YWwgWyR7LShpbnB1dFJhbmsgKyAxKX0sICR7aW5wdXRSYW5rfV1gKTtcbiAgICAgICAgJGRpbSA9IGlucHV0UmFuayArIGRpbSArIDE7XG4gICAgfVxuICAgIG5ld1NoYXBlLnNwbGljZSgkZGltLCAwLCAxKTtcbiAgICByZXR1cm4gcmVzaGFwZSh7IGlucHV0czogeyB4OiBpbnB1dCB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogbmV3U2hhcGUgfSB9KTtcbn1cbmV4cG9ydCBjb25zdCBleHBhbmREaW1zQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEV4cGFuZERpbXMsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGV4cGFuZERpbXNcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FeHBhbmREaW1zLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFeHBtMSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVTaW1wbGVVbmFyeUltcGwgfSBmcm9tICcuLi91dGlscy91bmFyeV9pbXBsJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuY0Zyb21JbXBsIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IGV4cG0xSW1wbCA9IGNyZWF0ZVNpbXBsZVVuYXJ5SW1wbCgoeGkpID0+IE1hdGguZXhwbTEoeGkpKTtcbmV4cG9ydCBjb25zdCBleHBtMSA9IHVuYXJ5S2VybmVsRnVuY0Zyb21JbXBsKEV4cG0xLCBleHBtMUltcGwpO1xuZXhwb3J0IGNvbnN0IGV4cG0xQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEV4cG0xLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBleHBtMSxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FeHBtMS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBGRlQsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgZmZ0QmF0Y2ggfSBmcm9tICcuLi91dGlscy9mZnRfdXRpbHMnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5leHBvcnQgZnVuY3Rpb24gZmZ0KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IGlucHV0IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgaW5wdXRTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKGlucHV0LnNoYXBlKTtcbiAgICAvLyBDb2xsYXBzZSBhbGwgb3V0ZXIgZGltZW5zaW9ucyB0byBhIHNpbmdsZSBiYXRjaCBkaW1lbnNpb24uXG4gICAgY29uc3QgaW5uZXJEaW1lbnNpb25TaXplID0gaW5wdXQuc2hhcGVbaW5wdXQuc2hhcGUubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgYmF0Y2ggPSBpbnB1dFNpemUgLyBpbm5lckRpbWVuc2lvblNpemU7XG4gICAgY29uc3QgaW5wdXQyRCA9IHJlc2hhcGUoe1xuICAgICAgICBpbnB1dHM6IHsgeDogaW5wdXQgfSxcbiAgICAgICAgYmFja2VuZCxcbiAgICAgICAgYXR0cnM6IHsgc2hhcGU6IFtiYXRjaCwgaW5uZXJEaW1lbnNpb25TaXplXSB9XG4gICAgfSk7XG4gICAgY29uc3QgcmVzdWx0ID0gZmZ0QmF0Y2goaW5wdXQyRCwgZmFsc2UsIGJhY2tlbmQpO1xuICAgIGNvbnN0IHJlc3VsdFJlc2hhcGVkID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiByZXN1bHQgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IGlucHV0LnNoYXBlIH0gfSk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpbnB1dDJEKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdFJlc2hhcGVkO1xufVxuZXhwb3J0IGNvbnN0IGZmdENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBGRlQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGZmdFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZGVC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBGaWxsLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiBmaWxsKGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgc2hhcGUsIHZhbHVlLCBkdHlwZSB9ID0gYXR0cnM7XG4gICAgY29uc3QgJGR0eXBlID0gZHR5cGUgfHwgdXRpbC5pbmZlckR0eXBlKHZhbHVlKTtcbiAgICBjb25zdCB2YWx1ZXMgPSB1dGlsLmdldEFycmF5RnJvbURUeXBlKCRkdHlwZSwgdXRpbC5zaXplRnJvbVNoYXBlKHNoYXBlKSk7XG4gICAgZmlsbFZhbHVlcyh2YWx1ZXMsIHZhbHVlLCAkZHR5cGUpO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHNoYXBlLCAkZHR5cGUsIHZhbHVlcyk7XG59XG5leHBvcnQgY29uc3QgZmlsbENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBGaWxsLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBmaWxsXG59O1xuZnVuY3Rpb24gZmlsbFZhbHVlcyh2YWx1ZXMsIHZhbHVlLCBkdHlwZSkge1xuICAgIGlmIChkdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFsdWVzLmZpbGwodmFsdWUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdmFsdWVzLmZpbGwodmFsdWUpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZpbGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRmxpcExlZnRSaWdodCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgY29uc3QgZmxpcExlZnRSaWdodENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBGbGlwTGVmdFJpZ2h0LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiAoeyBpbnB1dHMsIGF0dHJzLCBiYWNrZW5kIH0pID0+IHtcbiAgICAgICAgY29uc3QgeyBpbWFnZSB9ID0gaW5wdXRzO1xuICAgICAgICBjb25zdCBjcHVCYWNrZW5kID0gYmFja2VuZDtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gdXRpbC5nZXRUeXBlZEFycmF5RnJvbURUeXBlKGltYWdlLmR0eXBlLCB1dGlsLnNpemVGcm9tU2hhcGUoaW1hZ2Uuc2hhcGUpKTtcbiAgICAgICAgY29uc3QgW2JhdGNoLCBpbWFnZUhlaWdodCwgaW1hZ2VXaWR0aCwgbnVtQ2hhbm5lbHNdID0gaW1hZ2Uuc2hhcGU7XG4gICAgICAgIGNvbnN0IGltYWdlVmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoaW1hZ2UuZGF0YUlkKS52YWx1ZXM7XG4gICAgICAgIGZvciAobGV0IGJhdGNoSWR4ID0gMDsgYmF0Y2hJZHggPCBiYXRjaDsgYmF0Y2hJZHgrKykge1xuICAgICAgICAgICAgY29uc3QgYmF0Y2hPZmZzZXQgPSBiYXRjaElkeCAqIGltYWdlV2lkdGggKiBpbWFnZUhlaWdodCAqIG51bUNoYW5uZWxzO1xuICAgICAgICAgICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgaW1hZ2VIZWlnaHQ7IHJvdysrKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93T2Zmc2V0ID0gcm93ICogKGltYWdlV2lkdGggKiBudW1DaGFubmVscyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgaW1hZ2VXaWR0aDsgY29sKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29sT2Zmc2V0ID0gY29sICogbnVtQ2hhbm5lbHM7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgbnVtQ2hhbm5lbHM7IGNoYW5uZWwrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29vcmRYID0gTWF0aC5yb3VuZChpbWFnZVdpZHRoIC0gY29sIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvdXRJZHggPSBiYXRjaE9mZnNldCArIHJvd09mZnNldCArIGNvbE9mZnNldCArIGNoYW5uZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3V0cHV0VmFsdWUgPSBpbWFnZVZhbHNbb3V0SWR4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjb29yZGluYXRlIHBvc2l0aW9uIGZhbGxzIHdpdGhpbiB0aGUgaW1hZ2UgYm91bmRhcmllcy4uLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvb3JkWCA+PSAwICYmIGNvb3JkWCA8IGltYWdlV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIG91dHB1dCB0byB0aGUgaW1hZ2UgdmFsdWUgYXQgdGhlIGNvb3JkaW5hdGUgcG9zaXRpb24uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm90YXRlZENvbE9mZnNldCA9IGNvb3JkWCAqIG51bUNoYW5uZWxzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGltYWdlSWR4ID0gYmF0Y2hPZmZzZXQgKyByb3dPZmZzZXQgKyByb3RhdGVkQ29sT2Zmc2V0ICsgY2hhbm5lbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRWYWx1ZSA9IGltYWdlVmFsc1tpbWFnZUlkeF07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbb3V0SWR4XSA9IG91dHB1dFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGFJZCA9IGNwdUJhY2tlbmQud3JpdGUob3V0cHV0LCBpbWFnZS5zaGFwZSwgaW1hZ2UuZHR5cGUpO1xuICAgICAgICByZXR1cm4geyBkYXRhSWQsIHNoYXBlOiBpbWFnZS5zaGFwZSwgZHR5cGU6IGltYWdlLmR0eXBlIH07XG4gICAgfVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZsaXBMZWZ0UmlnaHQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEZsb29yIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVNpbXBsZVVuYXJ5SW1wbCB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X2ltcGwnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jRnJvbUltcGwgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgZmxvb3JJbXBsID0gY3JlYXRlU2ltcGxlVW5hcnlJbXBsKCh4aSkgPT4gTWF0aC5mbG9vcih4aSkpO1xuZXhwb3J0IGNvbnN0IGZsb29yID0gdW5hcnlLZXJuZWxGdW5jRnJvbUltcGwoRmxvb3IsIGZsb29ySW1wbCk7XG5leHBvcnQgY29uc3QgZmxvb3JDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRmxvb3IsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGZsb29yLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZsb29yLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEZsb29yRGl2IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfaW1wbCc7XG5pbXBvcnQgeyBiaW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBmbG9vckRpdkltcGwgPSBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsKChhLCBiKSA9PiBNYXRoLmZsb29yKGEgLyBiKSk7XG5leHBvcnQgY29uc3QgZmxvb3JEaXYgPSBiaW5hcnlLZXJuZWxGdW5jKEZsb29yRGl2LCBmbG9vckRpdkltcGwsIG51bGwgLyogY29tcGxleEltcGwgKi8sICdpbnQzMicpO1xuZXhwb3J0IGNvbnN0IGZsb29yRGl2Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEZsb29yRGl2LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBmbG9vckRpdlxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZsb29yRGl2LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEZ1c2VkQ29udjJEIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFwcGx5QWN0aXZhdGlvbiB9IGZyb20gJy4uL3V0aWxzL2Z1c2VkX3V0aWxzJztcbmltcG9ydCB7IGFkZCB9IGZyb20gJy4vQWRkJztcbmltcG9ydCB7IGNvbnYyRCB9IGZyb20gJy4vQ29udjJEJztcbmV4cG9ydCBmdW5jdGlvbiBmdXNlZENvbnYyRChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCwgZmlsdGVyLCBiaWFzLCBwcmVsdUFjdGl2YXRpb25XZWlnaHRzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQsIGRpbGF0aW9ucywgZGltUm91bmRpbmdNb2RlLCBhY3RpdmF0aW9uLCBsZWFreXJlbHVBbHBoYSB9ID0gYXR0cnM7XG4gICAgbGV0IHJlc3VsdCA9IGNvbnYyRCh7XG4gICAgICAgIGlucHV0czogeyB4LCBmaWx0ZXIgfSxcbiAgICAgICAgYmFja2VuZCxcbiAgICAgICAgYXR0cnM6IHsgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0LCBkaWxhdGlvbnMsIGRpbVJvdW5kaW5nTW9kZSB9XG4gICAgfSk7XG4gICAgaWYgKGJpYXMpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0T2xkID0gcmVzdWx0O1xuICAgICAgICByZXN1bHQgPSBhZGQoeyBpbnB1dHM6IHsgYTogcmVzdWx0LCBiOiBiaWFzIH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVzdWx0T2xkKTtcbiAgICB9XG4gICAgaWYgKGFjdGl2YXRpb24pIHtcbiAgICAgICAgY29uc3QgcmVzdWx0T2xkID0gcmVzdWx0O1xuICAgICAgICByZXN1bHQgPSBhcHBseUFjdGl2YXRpb24oYmFja2VuZCwgcmVzdWx0LCBhY3RpdmF0aW9uLCBwcmVsdUFjdGl2YXRpb25XZWlnaHRzLCBsZWFreXJlbHVBbHBoYSk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVzdWx0T2xkKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBjb25zdCBmdXNlZENvbnYyRENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBGdXNlZENvbnYyRCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogZnVzZWRDb252MkRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GdXNlZENvbnYyRC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBGdXNlZERlcHRod2lzZUNvbnYyRCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhcHBseUFjdGl2YXRpb24gfSBmcm9tICcuLi91dGlscy9mdXNlZF91dGlscyc7XG5pbXBvcnQgeyBhZGQgfSBmcm9tICcuL0FkZCc7XG5pbXBvcnQgeyBkZXB0aHdpc2VDb252MmROYXRpdmUgfSBmcm9tICcuL0RlcHRod2lzZUNvbnYyZE5hdGl2ZSc7XG5leHBvcnQgZnVuY3Rpb24gZnVzZWREZXB0aHdpc2VDb252MkQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHgsIGZpbHRlciwgYmlhcywgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0LCBkaWxhdGlvbnMsIGRpbVJvdW5kaW5nTW9kZSwgYWN0aXZhdGlvbiwgbGVha3lyZWx1QWxwaGEgfSA9IGF0dHJzO1xuICAgIGxldCByZXN1bHQgPSBkZXB0aHdpc2VDb252MmROYXRpdmUoe1xuICAgICAgICBpbnB1dHM6IHsgeCwgZmlsdGVyIH0sXG4gICAgICAgIGJhY2tlbmQsXG4gICAgICAgIGF0dHJzOiB7IHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGlsYXRpb25zLCBkaW1Sb3VuZGluZ01vZGUgfVxuICAgIH0pO1xuICAgIGlmIChiaWFzKSB7XG4gICAgICAgIGNvbnN0IG9sZFJlc3VsdCA9IHJlc3VsdDtcbiAgICAgICAgcmVzdWx0ID0gYWRkKHsgaW5wdXRzOiB7IGE6IHJlc3VsdCwgYjogYmlhcyB9LCBiYWNrZW5kIH0pO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG9sZFJlc3VsdCk7XG4gICAgfVxuICAgIGlmIChhY3RpdmF0aW9uKSB7XG4gICAgICAgIGNvbnN0IG9sZFJlc3VsdCA9IHJlc3VsdDtcbiAgICAgICAgcmVzdWx0ID0gYXBwbHlBY3RpdmF0aW9uKGJhY2tlbmQsIHJlc3VsdCwgYWN0aXZhdGlvbiwgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cywgbGVha3lyZWx1QWxwaGEpO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG9sZFJlc3VsdCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgY29uc3QgZnVzZWREZXB0aHdpc2VDb252MkRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRnVzZWREZXB0aHdpc2VDb252MkQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGZ1c2VkRGVwdGh3aXNlQ29udjJEXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RnVzZWREZXB0aHdpc2VDb252MkQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBHYXRoZXJOZCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBnYXRoZXJOZEltcGwgfSBmcm9tICcuL0dhdGhlck5kX0ltcGwnO1xuZXhwb3J0IGZ1bmN0aW9uIGdhdGhlck5kKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IHBhcmFtcywgaW5kaWNlcyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHBhcmFtc1NpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocGFyYW1zLnNoYXBlKTtcbiAgICBjb25zdCBpbmRpY2VzU2hhcGUgPSBpbmRpY2VzLnNoYXBlO1xuICAgIGNvbnN0IHNsaWNlUmFuayA9IGluZGljZXNTaGFwZVtpbmRpY2VzU2hhcGUubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgW3Jlc3VsdFNoYXBlLCBudW1TbGljZXMsIHNsaWNlU2l6ZSwgc3RyaWRlc10gPSBiYWNrZW5kX3V0aWwucHJlcGFyZUFuZFZhbGlkYXRlKHBhcmFtcywgaW5kaWNlcyk7XG4gICAgaWYgKG51bVNsaWNlcyA9PT0gMCkge1xuICAgICAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhyZXN1bHRTaGFwZSwgcGFyYW1zLmR0eXBlLCBbXSk7XG4gICAgfVxuICAgIGNvbnN0IGluZGljZXNEYXRhID0gYmFja2VuZC5kYXRhLmdldChpbmRpY2VzLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHBhcmFtc0J1ZiA9IGJhY2tlbmQuYnVmZmVyU3luYyhwYXJhbXMpO1xuICAgIGNvbnN0IG91dEJ1ZiA9IGdhdGhlck5kSW1wbChpbmRpY2VzRGF0YSwgcGFyYW1zQnVmLCBwYXJhbXMuZHR5cGUsIG51bVNsaWNlcywgc2xpY2VSYW5rLCBzbGljZVNpemUsIHN0cmlkZXMsIHBhcmFtcy5zaGFwZSwgcGFyYW1zU2l6ZSk7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVzdWx0U2hhcGUsIHBhcmFtcy5kdHlwZSwgb3V0QnVmLnZhbHVlcyk7XG59XG5leHBvcnQgY29uc3QgZ2F0aGVyTmRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogR2F0aGVyTmQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGdhdGhlck5kXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9R2F0aGVyTmQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYnVmZmVyIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiBnYXRoZXJOZEltcGwoaW5kaWNlc0RhdGEsIHBhcmFtc0J1ZiwgZHR5cGUsIG51bVNsaWNlcywgc2xpY2VSYW5rLCBzbGljZVNpemUsIHN0cmlkZXMsIHBhcmFtc1NoYXBlLCBwYXJhbXNTaXplKSB7XG4gICAgY29uc3Qgb3V0QnVmID0gYnVmZmVyKFtudW1TbGljZXMsIHNsaWNlU2l6ZV0sIGR0eXBlKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVNsaWNlczsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gW107XG4gICAgICAgIGxldCBmbGF0dGVuSW5kZXggPSAwO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHNsaWNlUmFuazsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBkaW0gPSBpbmRpY2VzRGF0YVtpICogc2xpY2VSYW5rICsgal07XG4gICAgICAgICAgICBmbGF0dGVuSW5kZXggKz0gZGltICogc3RyaWRlc1tqXTtcbiAgICAgICAgICAgIGluZGV4LnB1c2goZGltKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmxhdHRlbkluZGV4IDwgMCB8fCBmbGF0dGVuSW5kZXggPj0gcGFyYW1zU2l6ZSAvIHNsaWNlU2l6ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGluZGljZXM6ICR7aW5kZXh9IGRvZXMgbm90IGluZGV4IGludG8gJHtwYXJhbXNTaGFwZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHNsaWNlU2l6ZTsgaysrKSB7XG4gICAgICAgICAgICBvdXRCdWYudmFsdWVzW2kgKiBzbGljZVNpemUgKyBrXSA9XG4gICAgICAgICAgICAgICAgcGFyYW1zQnVmLmdldCguLi5wYXJhbXNCdWYuaW5kZXhUb0xvYyhmbGF0dGVuSW5kZXggKiBzbGljZVNpemUgKyBrKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dEJ1Zjtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUdhdGhlck5kX0ltcGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBHYXRoZXJWMiwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHsgZ2F0aGVyVjJJbXBsIH0gZnJvbSAnLi9HYXRoZXJWMl9pbXBsJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuZXhwb3J0IGZ1bmN0aW9uIGdhdGhlclYyKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4LCBpbmRpY2VzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBheGlzLCBiYXRjaERpbXMgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoW3gsIGluZGljZXNdLCAnZ2F0aGVyVjInKTtcbiAgICBsZXQgJGJhdGNoRGltcyA9IGJhdGNoRGltcztcbiAgICBpZiAoYmF0Y2hEaW1zID09IG51bGwpIHtcbiAgICAgICAgJGJhdGNoRGltcyA9IDA7XG4gICAgfVxuICAgIGNvbnN0IGluZGljZXNTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKGluZGljZXMuc2hhcGUpO1xuICAgIGNvbnN0IHBhcnNlZEF4aXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpWzBdO1xuICAgIGNvbnN0IHNoYXBlSW5mbyA9IGJhY2tlbmRfdXRpbC5zZWdtZW50X3V0aWwuY29sbGVjdEdhdGhlck9wU2hhcGVJbmZvKHgsIGluZGljZXMsIHBhcnNlZEF4aXMsICRiYXRjaERpbXMpO1xuICAgIGNvbnN0IGZsYXR0ZW5YID0gcmVzaGFwZSh7XG4gICAgICAgIGlucHV0czogeyB4IH0sXG4gICAgICAgIGJhY2tlbmQsXG4gICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICBzaGFwZTogW1xuICAgICAgICAgICAgICAgIHNoYXBlSW5mby5iYXRjaFNpemUsIHNoYXBlSW5mby5vdXRlclNpemUsIHNoYXBlSW5mby5kaW1TaXplLFxuICAgICAgICAgICAgICAgIHNoYXBlSW5mby5zbGljZVNpemVcbiAgICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGZsYXR0ZW5JbmRleCA9IHJlc2hhcGUoe1xuICAgICAgICBpbnB1dHM6IHsgeDogaW5kaWNlcyB9LFxuICAgICAgICBiYWNrZW5kLFxuICAgICAgICBhdHRyczogeyBzaGFwZTogW3NoYXBlSW5mby5iYXRjaFNpemUsIGluZGljZXNTaXplIC8gc2hhcGVJbmZvLmJhdGNoU2l6ZV0gfVxuICAgIH0pO1xuICAgIGNvbnN0IGZsYXR0ZW5PdXRwdXRTaGFwZSA9IFtcbiAgICAgICAgc2hhcGVJbmZvLmJhdGNoU2l6ZSwgc2hhcGVJbmZvLm91dGVyU2l6ZSwgaW5kaWNlc1NpemUgLyBzaGFwZUluZm8uYmF0Y2hTaXplLFxuICAgICAgICBzaGFwZUluZm8uc2xpY2VTaXplXG4gICAgXTtcbiAgICBjb25zdCBpbmRpY2VzQnVmID0gYmFja2VuZC5idWZmZXJTeW5jKGZsYXR0ZW5JbmRleCk7XG4gICAgY29uc3QgeEJ1ZiA9IGJhY2tlbmQuYnVmZmVyU3luYyhmbGF0dGVuWCk7XG4gICAgY29uc3Qgb3V0QnVmID0gZ2F0aGVyVjJJbXBsKHhCdWYsIGluZGljZXNCdWYsIGZsYXR0ZW5PdXRwdXRTaGFwZSk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhmbGF0dGVuWCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhmbGF0dGVuSW5kZXgpO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHNoYXBlSW5mby5vdXRwdXRTaGFwZSwgb3V0QnVmLmR0eXBlLCBvdXRCdWYudmFsdWVzKTtcbn1cbmV4cG9ydCBjb25zdCBnYXRoZXJWMkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBHYXRoZXJWMixcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogZ2F0aGVyVjJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1HYXRoZXJWMi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBidWZmZXIgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIGdhdGhlclYySW1wbCh4QnVmLCBpbmRpY2VzQnVmLCBmbGF0dGVuT3V0cHV0U2hhcGUpIHtcbiAgICBjb25zdCBvdXRCdWYgPSBidWZmZXIoZmxhdHRlbk91dHB1dFNoYXBlLCB4QnVmLmR0eXBlKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dEJ1Zi5zaXplOyArK2kpIHtcbiAgICAgICAgY29uc3QgbmV3TG9jID0gb3V0QnVmLmluZGV4VG9Mb2MoaSk7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsTG9jID0gbmV3TG9jLnNsaWNlKCk7XG4gICAgICAgIGNvbnN0IGJhdGNoSWR4ID0gb3JpZ2luYWxMb2NbMF07XG4gICAgICAgIGNvbnN0IGluZGljZXNJZHggPSBvcmlnaW5hbExvY1syXTtcbiAgICAgICAgY29uc3QgaW5kaWNlc0luZGV4ID0gaW5kaWNlc0J1Zi5sb2NUb0luZGV4KFtiYXRjaElkeCwgaW5kaWNlc0lkeF0pO1xuICAgICAgICBvcmlnaW5hbExvY1syXSA9IGluZGljZXNCdWYudmFsdWVzW2luZGljZXNJbmRleF07XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsSW5kZXggPSB4QnVmLmxvY1RvSW5kZXgob3JpZ2luYWxMb2MpO1xuICAgICAgICBvdXRCdWYudmFsdWVzW2ldID0geEJ1Zi52YWx1ZXNbb3JpZ2luYWxJbmRleF07XG4gICAgfVxuICAgIHJldHVybiBvdXRCdWY7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1HYXRoZXJWMl9pbXBsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEdyZWF0ZXIgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IGdyZWF0ZXJJbXBsID0gY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoYSwgYikgPT4gKGEgPiBiKSA/IDEgOiAwKTtcbmV4cG9ydCBjb25zdCBncmVhdGVyID0gYmluYXJ5S2VybmVsRnVuYyhHcmVhdGVyLCBncmVhdGVySW1wbCwgbnVsbCAvKiBjb21wbGV4SW1wbCAqLywgJ2Jvb2wnKTtcbmV4cG9ydCBjb25zdCBncmVhdGVyQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEdyZWF0ZXIsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGdyZWF0ZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1HcmVhdGVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEdyZWF0ZXJFcXVhbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X2ltcGwnO1xuaW1wb3J0IHsgYmluYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgZ3JlYXRlckVxdWFsSW1wbCA9IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwoKGEsIGIpID0+IChhID49IGIpID8gMSA6IDApO1xuZXhwb3J0IGNvbnN0IGdyZWF0ZXJFcXVhbCA9IGJpbmFyeUtlcm5lbEZ1bmMoR3JlYXRlckVxdWFsLCBncmVhdGVyRXF1YWxJbXBsLCBudWxsIC8qIGNvbXBsZXhJbXBsICovLCAnYm9vbCcpO1xuZXhwb3J0IGNvbnN0IGdyZWF0ZXJFcXVhbENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBHcmVhdGVyRXF1YWwsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGdyZWF0ZXJFcXVhbFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUdyZWF0ZXJFcXVhbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBJRkZULCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGZmdEJhdGNoIH0gZnJvbSAnLi4vdXRpbHMvZmZ0X3V0aWxzJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuZXhwb3J0IGZ1bmN0aW9uIGlmZnQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW5wdXQgfSA9IGlucHV0cztcbiAgICBjb25zdCBpbnB1dFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoaW5wdXQuc2hhcGUpO1xuICAgIC8vIENvbGxhcHNlIGFsbCBvdXRlciBkaW1lbnNpb25zIHRvIGEgc2luZ2xlIGJhdGNoIGRpbWVuc2lvbi5cbiAgICBjb25zdCBpbm5lckRpbWVuc2lvblNpemUgPSBpbnB1dC5zaGFwZVtpbnB1dC5zaGFwZS5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBiYXRjaCA9IGlucHV0U2l6ZSAvIGlubmVyRGltZW5zaW9uU2l6ZTtcbiAgICBjb25zdCBpbnB1dDJEID0gcmVzaGFwZSh7XG4gICAgICAgIGlucHV0czogeyB4OiBpbnB1dCB9LFxuICAgICAgICBiYWNrZW5kLFxuICAgICAgICBhdHRyczogeyBzaGFwZTogW2JhdGNoLCBpbm5lckRpbWVuc2lvblNpemVdIH1cbiAgICB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBmZnRCYXRjaChpbnB1dDJELCB0cnVlLCBiYWNrZW5kKTtcbiAgICBjb25zdCByZXN1bHRSZXNoYXBlZCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogcmVzdWx0IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBpbnB1dC5zaGFwZSB9IH0pO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaW5wdXQyRCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXN1bHQpO1xuICAgIHJldHVybiByZXN1bHRSZXNoYXBlZDtcbn1cbmV4cG9ydCBjb25zdCBpZmZ0Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IElGRlQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGlmZnRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1JRkZULmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IElkZW50aXR5IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgYmFja2VuZC5pbmNSZWYoeC5kYXRhSWQpO1xuICAgIHJldHVybiB7IGRhdGFJZDogeC5kYXRhSWQsIHNoYXBlOiB4LnNoYXBlLCBkdHlwZTogeC5kdHlwZSB9O1xufVxuZXhwb3J0IGNvbnN0IGlkZW50aXR5Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IElkZW50aXR5LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBpZGVudGl0eVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUlkZW50aXR5LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEltYWcgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIGltYWcoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW5wdXQgfSA9IGlucHV0cztcbiAgICBjb25zdCBpbWFnID0gYmFja2VuZC5kYXRhLmdldChpbnB1dC5kYXRhSWQpLmNvbXBsZXhUZW5zb3JJbmZvcy5pbWFnO1xuICAgIGNvbnN0IGltYWdWYWwgPSBiYWNrZW5kLmRhdGEuZ2V0KGltYWcuZGF0YUlkKS52YWx1ZXM7XG4gICAgLy8gV2hlbiBjb21wbGV4IHRlbnNvciBpcyBkaXNwb3NlZCwgaXRzIHVuZGVybHlpbmcgcGFydHMgd2lsbCBiZSBkaXNwb3NlZCB0b28uXG4gICAgLy8gTWFrZSBuZXcgdGVuc29yIG91dCBvZiB0aGUgaW1hZyB2YWx1ZSBvZiB0aGUgY29tcGxleC4gVGhpcyBtYWtlcyBzdXJlIHRoZVxuICAgIC8vIHZhbHVlIGlzIHN0aWxsIGFjY2Vzc2libGUgZXZlbiBpZiBjb21wbGV4IHRlbnNvciBpcyBkaXNwb3NlZC5cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhpbWFnLnNoYXBlLCBpbWFnLmR0eXBlLCBpbWFnVmFsKTtcbn1cbmV4cG9ydCBjb25zdCBpbWFnQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEltYWcsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGltYWdcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1JbWFnLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBJc0Zpbml0ZSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgaXNGaW5pdGUgPSB1bmFyeUtlcm5lbEZ1bmMoSXNGaW5pdGUsICh4aSkgPT4gTnVtYmVyLmlzRmluaXRlKHhpKSA/IDEgOiAwLCAnYm9vbCcpO1xuZXhwb3J0IGNvbnN0IGlzRmluaXRlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IElzRmluaXRlLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBpc0Zpbml0ZSxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Jc0Zpbml0ZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgSXNJbmYgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IGlzSW5mID0gdW5hcnlLZXJuZWxGdW5jKElzSW5mLCAoeGkpID0+IE1hdGguYWJzKHhpKSA9PT0gSW5maW5pdHkgPyAxIDogMCwgJ2Jvb2wnKTtcbmV4cG9ydCBjb25zdCBpc0luZkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBJc0luZixcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogaXNJbmYsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SXNJbmYuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IElzTmFuIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBpc05hTiA9IHVuYXJ5S2VybmVsRnVuYyhJc05hbiwgKHhpKSA9PiBOdW1iZXIuaXNOYU4oeGkpID8gMSA6IDAsICdib29sJyk7XG5leHBvcnQgY29uc3QgaXNOYU5Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogSXNOYW4sXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGlzTmFOLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUlzTmFOLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IExSTiwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIGxSTihhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgZGVwdGhSYWRpdXMsIGJpYXMsIGFscGhhLCBiZXRhIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KHgsICdMUk4nKTtcbiAgICBjb25zdCBjaGFubmVscyA9IHguc2hhcGVbM107XG4gICAgY29uc3QgbWF4RCA9IGNoYW5uZWxzIC0gMTtcbiAgICBjb25zdCB4VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoeC5zaGFwZSk7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IEZsb2F0MzJBcnJheShzaXplKTtcbiAgICBmdW5jdGlvbiBzdW1BY3Jvc3NDaGFubmVscyhvZmZzZXQpIHtcbiAgICAgICAgY29uc3QgY3VycmVudENoYW5uZWwgPSBvZmZzZXQgJSBjaGFubmVscztcbiAgICAgICAgbGV0IGJlZ2luU3VtT2Zmc2V0ID0gb2Zmc2V0IC0gY3VycmVudENoYW5uZWwgKyBNYXRoLm1heCgwLCBjdXJyZW50Q2hhbm5lbCAtIGRlcHRoUmFkaXVzKTtcbiAgICAgICAgY29uc3QgZW5kU3VtT2Zmc2V0ID0gb2Zmc2V0IC0gY3VycmVudENoYW5uZWwgKyBNYXRoLm1pbihjdXJyZW50Q2hhbm5lbCArIGRlcHRoUmFkaXVzLCBtYXhEKTtcbiAgICAgICAgbGV0IHN1bSA9IDAuMDtcbiAgICAgICAgZm9yICg7IGJlZ2luU3VtT2Zmc2V0IDw9IGVuZFN1bU9mZnNldDsgYmVnaW5TdW1PZmZzZXQrKykge1xuICAgICAgICAgICAgY29uc3QgeiA9IHhWYWx1ZXNbYmVnaW5TdW1PZmZzZXRdO1xuICAgICAgICAgICAgc3VtICs9IHogKiB6O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdW07XG4gICAgfVxuICAgIGZvciAobGV0IG9mZnNldCA9IDA7IG9mZnNldCA8IHNpemU7IG9mZnNldCsrKSB7XG4gICAgICAgIGNvbnN0IHN1bSA9IHN1bUFjcm9zc0NoYW5uZWxzKG9mZnNldCk7XG4gICAgICAgIGNvbnN0IHZhbCA9IHhWYWx1ZXNbb2Zmc2V0XSAqIE1hdGgucG93KGJpYXMgKyBhbHBoYSAqIHN1bSwgLWJldGEpO1xuICAgICAgICByZXN1bHRbb2Zmc2V0XSA9IHZhbDtcbiAgICB9XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oeC5zaGFwZSwgeC5kdHlwZSwgcmVzdWx0KTtcbn1cbmV4cG9ydCBjb25zdCBsUk5Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTFJOLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBsUk5cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1MUk4uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTFJOR3JhZCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIGxSTkdyYWQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHgsIHksIGR5IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBkZXB0aFJhZGl1cywgYmlhcywgYWxwaGEsIGJldGEgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoZHksICdMUk5HcmFkJyk7XG4gICAgY29uc3QgZHlTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKGR5LnNoYXBlKTtcbiAgICBjb25zdCBjaGFubmVscyA9IGR5LnNoYXBlWzNdO1xuICAgIGNvbnN0IGR5VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldChkeS5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCB4VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHlWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KHkuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IEZsb2F0MzJBcnJheShkeVNpemUpO1xuICAgIGNvbnN0IHNpemUgPSBkeVNpemU7XG4gICAgZm9yIChsZXQgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgc2l6ZTsgb2Zmc2V0KyspIHtcbiAgICAgICAgY29uc3QgY3VycmVudENoYW5uZWwgPSBvZmZzZXQgJSBjaGFubmVscztcbiAgICAgICAgY29uc3QgZGVwdGhCZWdpbiA9IChvZmZzZXQgLSBjdXJyZW50Q2hhbm5lbCkgKyBNYXRoLm1heCgwLCBjdXJyZW50Q2hhbm5lbCAtIGRlcHRoUmFkaXVzKTtcbiAgICAgICAgY29uc3QgZGVwdGhFbmQgPSAob2Zmc2V0IC0gY3VycmVudENoYW5uZWwpICtcbiAgICAgICAgICAgIE1hdGgubWluKGNoYW5uZWxzLCBjdXJyZW50Q2hhbm5lbCArIGRlcHRoUmFkaXVzICsgMSk7XG4gICAgICAgIGxldCBub3JtID0gMDtcbiAgICAgICAgZm9yIChsZXQgayA9IGRlcHRoQmVnaW47IGsgPCBkZXB0aEVuZDsgaysrKSB7XG4gICAgICAgICAgICBub3JtICs9IE1hdGgucG93KHhWYWx1ZXNba10sIDIpO1xuICAgICAgICB9XG4gICAgICAgIG5vcm0gPSBhbHBoYSAqIG5vcm0gKyBiaWFzO1xuICAgICAgICBmb3IgKGxldCBrID0gZGVwdGhCZWdpbjsgayA8IGRlcHRoRW5kOyBrKyspIHtcbiAgICAgICAgICAgIGxldCBkeWkgPSAtMiAqIGFscGhhICogYmV0YSAqIHhWYWx1ZXNba10gKiB5VmFsdWVzW29mZnNldF0gLyBub3JtO1xuICAgICAgICAgICAgaWYgKG9mZnNldCA9PT0gaykge1xuICAgICAgICAgICAgICAgIGR5aSArPSBNYXRoLnBvdyhub3JtLCAtYmV0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkeWkgKj0gZHlWYWx1ZXNbb2Zmc2V0XTtcbiAgICAgICAgICAgIHJlc3VsdFtrXSArPSBkeWk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oZHkuc2hhcGUsIHguZHR5cGUsIHJlc3VsdCk7XG59XG5leHBvcnQgY29uc3QgbFJOR3JhZENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBMUk5HcmFkLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBsUk5HcmFkXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TFJOR3JhZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBMZWFreVJlbHUsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBsZWFreVJlbHUoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGFscGhhIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KFt4XSwgJ2xlYWt5UmVsdScpO1xuICAgIGNvbnN0IHhTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHguc2hhcGUpO1xuICAgIGNvbnN0IHhWYWxzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IG91dFZhbHMgPSB1dGlsLmdldFR5cGVkQXJyYXlGcm9tRFR5cGUoJ2Zsb2F0MzInLCB4U2l6ZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB4VmFscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBvdXRWYWxzW2ldID0geFZhbHNbaV0gPCAwID8gYWxwaGEgKiB4VmFsc1tpXSA6IHhWYWxzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyh4LnNoYXBlLCAnZmxvYXQzMicsIG91dFZhbHMpO1xufVxuZXhwb3J0IGNvbnN0IGxlYWt5UmVsdUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBMZWFreVJlbHUsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGxlYWt5UmVsdVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxlYWt5UmVsdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBMZXNzIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfaW1wbCc7XG5pbXBvcnQgeyBiaW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBsZXNzSW1wbCA9IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwoKGEsIGIpID0+IChhIDwgYikgPyAxIDogMCk7XG5leHBvcnQgY29uc3QgbGVzcyA9IGJpbmFyeUtlcm5lbEZ1bmMoTGVzcywgbGVzc0ltcGwsIG51bGwgLyogY29tcGxleEltcGwgKi8sICdib29sJyk7XG5leHBvcnQgY29uc3QgbGVzc0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBMZXNzLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBsZXNzXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TGVzcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBMZXNzRXF1YWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IGxlc3NFcXVhbEltcGwgPSBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsKChhLCBiKSA9PiAoYSA8PSBiKSA/IDEgOiAwKTtcbmV4cG9ydCBjb25zdCBsZXNzRXF1YWwgPSBiaW5hcnlLZXJuZWxGdW5jKExlc3NFcXVhbCwgbGVzc0VxdWFsSW1wbCwgbnVsbCAvKiBjb21wbGV4SW1wbCAqLywgJ2Jvb2wnKTtcbmV4cG9ydCBjb25zdCBsZXNzRXF1YWxDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTGVzc0VxdWFsLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBsZXNzRXF1YWxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1MZXNzRXF1YWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTGluU3BhY2UgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgbGluU3BhY2VJbXBsIH0gZnJvbSAnLi9MaW5TcGFjZV9pbXBsJztcbmV4cG9ydCBmdW5jdGlvbiBsaW5TcGFjZShhcmdzKSB7XG4gICAgY29uc3QgeyBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHN0YXJ0LCBzdG9wLCBudW0gfSA9IGF0dHJzO1xuICAgIGNvbnN0IG91dFZhbHMgPSBsaW5TcGFjZUltcGwoc3RhcnQsIHN0b3AsIG51bSk7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW291dFZhbHMubGVuZ3RoXSwgJ2Zsb2F0MzInLCBvdXRWYWxzKTtcbn1cbmV4cG9ydCBjb25zdCBsaW5TcGFjZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBMaW5TcGFjZSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogbGluU3BhY2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1MaW5TcGFjZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiBsaW5TcGFjZUltcGwoc3RhcnQsIHN0b3AsIG51bSkge1xuICAgIGNvbnN0IHN0ZXAgPSAoc3RvcCAtIHN0YXJ0KSAvIChudW0gLSAxKTtcbiAgICBjb25zdCB2YWx1ZXMgPSB1dGlsLm1ha2VaZXJvc1R5cGVkQXJyYXkobnVtLCAnZmxvYXQzMicpO1xuICAgIHZhbHVlc1swXSA9IHN0YXJ0O1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhbHVlc1tpXSA9IHZhbHVlc1tpIC0gMV0gKyBzdGVwO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVzO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TGluU3BhY2VfaW1wbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTG9nIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVNpbXBsZVVuYXJ5SW1wbCB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X2ltcGwnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jRnJvbUltcGwgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgbG9nSW1wbCA9IGNyZWF0ZVNpbXBsZVVuYXJ5SW1wbCgoeGkpID0+IE1hdGgubG9nKHhpKSk7XG5leHBvcnQgY29uc3QgbG9nID0gdW5hcnlLZXJuZWxGdW5jRnJvbUltcGwoTG9nLCBsb2dJbXBsKTtcbmV4cG9ydCBjb25zdCBsb2dDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTG9nLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBsb2csXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TG9nLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBMb2cxcCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgbG9nMXAgPSB1bmFyeUtlcm5lbEZ1bmMoTG9nMXAsICh4aSkgPT4gTWF0aC5sb2cxcCh4aSkpO1xuZXhwb3J0IGNvbnN0IGxvZzFwQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IExvZzFwLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBsb2cxcCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Mb2cxcC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBMb2dpY2FsQW5kIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfaW1wbCc7XG5pbXBvcnQgeyBiaW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBsb2dpY2FsQW5kSW1wbCA9IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwoKGEsIGIpID0+IGEgJiYgYik7XG5leHBvcnQgY29uc3QgbG9naWNhbEFuZCA9IGJpbmFyeUtlcm5lbEZ1bmMoTG9naWNhbEFuZCwgbG9naWNhbEFuZEltcGwsIG51bGwgLyogY29tcGxleEltcGwgKi8sICdib29sJyk7XG5leHBvcnQgY29uc3QgbG9naWNhbEFuZENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBMb2dpY2FsQW5kLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBsb2dpY2FsQW5kXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TG9naWNhbEFuZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTG9naWNhbE5vdCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgbG9naWNhbE5vdCA9IHVuYXJ5S2VybmVsRnVuYyhMb2dpY2FsTm90LCAoeGkpID0+IHhpID8gMCA6IDEsICdib29sJyk7XG5leHBvcnQgY29uc3QgbG9naWNhbE5vdENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBMb2dpY2FsTm90LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBsb2dpY2FsTm90LFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxvZ2ljYWxOb3QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTG9naWNhbE9yIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfaW1wbCc7XG5pbXBvcnQgeyBiaW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBsb2dpY2FsT3JJbXBsID0gY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoYSwgYikgPT4gYSB8fCBiKTtcbmV4cG9ydCBjb25zdCBsb2dpY2FsT3IgPSBiaW5hcnlLZXJuZWxGdW5jKExvZ2ljYWxPciwgbG9naWNhbE9ySW1wbCwgbnVsbCAvKiBjb21wbGV4SW1wbCAqLywgJ2Jvb2wnKTtcbmV4cG9ydCBjb25zdCBsb2dpY2FsT3JDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTG9naWNhbE9yLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBsb2dpY2FsT3Jcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Mb2dpY2FsT3IuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTWF4IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGJhY2tlbmRfdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyBtYXhJbXBsIH0gZnJvbSAnLi9NYXhfaW1wbCc7XG5pbXBvcnQgeyB0cmFuc3Bvc2VJbXBsIH0gZnJvbSAnLi9UcmFuc3Bvc2VfaW1wbCc7XG5leHBvcnQgZnVuY3Rpb24gbWF4KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyByZWR1Y3Rpb25JbmRpY2VzLCBrZWVwRGltcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgY3B1QmFja2VuZCA9IGJhY2tlbmQ7XG4gICAgbGV0IHhTaGFwZSA9IHguc2hhcGU7XG4gICAgY29uc3QgeFJhbmsgPSB4U2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IG9yaWdBeGVzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShyZWR1Y3Rpb25JbmRpY2VzLCB4U2hhcGUpO1xuICAgIGxldCBheGVzID0gb3JpZ0F4ZXM7XG4gICAgY29uc3QgcGVybXV0ZWRBeGVzID0gYmFja2VuZF91dGlsLmdldEF4ZXNQZXJtdXRhdGlvbihheGVzLCB4UmFuayk7XG4gICAgbGV0IHhWYWxzID0gY3B1QmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgIGlmIChwZXJtdXRlZEF4ZXMgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBuZXdTaGFwZSA9IG5ldyBBcnJheSh4UmFuayk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3U2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIG5ld1NoYXBlW2ldID0geFNoYXBlW3Blcm11dGVkQXhlc1tpXV07XG4gICAgICAgIH1cbiAgICAgICAgeFZhbHMgPSB0cmFuc3Bvc2VJbXBsKHhWYWxzLCB4U2hhcGUsIHguZHR5cGUsIHBlcm11dGVkQXhlcywgbmV3U2hhcGUpO1xuICAgICAgICBheGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoYXhlcy5sZW5ndGgsIHhSYW5rKTtcbiAgICAgICAgeFNoYXBlID0gbmV3U2hhcGU7XG4gICAgfVxuICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ21heCcpO1xuICAgIGJhY2tlbmRfdXRpbC5hc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcygnbWF4JywgYXhlcywgeFJhbmspO1xuICAgIGNvbnN0IFttYXhPdXRTaGFwZSwgcmVkdWNlU2hhcGVdID0gYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMoeFNoYXBlLCBheGVzKTtcbiAgICBjb25zdCByZWR1Y2VTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcbiAgICBjb25zdCByZXN1bHQgPSBtYXhJbXBsKHhWYWxzLCByZWR1Y2VTaXplLCBtYXhPdXRTaGFwZSwgeC5kdHlwZSk7XG4gICAgY29uc3QgZGF0YUlkID0gY3B1QmFja2VuZC53cml0ZShyZXN1bHQsIG1heE91dFNoYXBlLCB4LmR0eXBlKTtcbiAgICBsZXQgb3V0U2hhcGUgPSBtYXhPdXRTaGFwZTtcbiAgICBpZiAoa2VlcERpbXMpIHtcbiAgICAgICAgLy8gcmVzaGFwZVxuICAgICAgICBjb25zdCBuZXdTaGFwZSA9IGJhY2tlbmRfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbShtYXhPdXRTaGFwZSwgb3JpZ0F4ZXMpO1xuICAgICAgICBvdXRTaGFwZSA9IG5ld1NoYXBlO1xuICAgIH1cbiAgICByZXR1cm4geyBkYXRhSWQsIHNoYXBlOiBvdXRTaGFwZSwgZHR5cGU6IHguZHR5cGUgfTtcbn1cbmV4cG9ydCBjb25zdCBtYXhDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTWF4LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBtYXhcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NYXguanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBNYXhQb29sLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyBwb29sIH0gZnJvbSAnLi4vdXRpbHMvcG9vbF91dGlscyc7XG5pbXBvcnQgeyBpZGVudGl0eSB9IGZyb20gJy4vSWRlbnRpdHknO1xuZXhwb3J0IGZ1bmN0aW9uIG1heFBvb2woYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBhc3NlcnROb3RDb21wbGV4KHgsICdtYXhQb29sJyk7XG4gICAgY29uc3QgeyBmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSB9ID0gYXR0cnM7XG4gICAgY29uc3QgZGlsYXRpb25zID0gMTtcbiAgICB1dGlsLmFzc2VydChiYWNrZW5kX3V0aWwuZWl0aGVyU3RyaWRlc09yRGlsYXRpb25zQXJlT25lKHN0cmlkZXMsIGRpbGF0aW9ucyksICgpID0+ICdFcnJvciBpbiBtYXhQb29sOiBFaXRoZXIgc3RyaWRlcyBvciBkaWxhdGlvbnMgbXVzdCBiZSAxLiAnICtcbiAgICAgICAgYEdvdCBzdHJpZGVzICR7c3RyaWRlc30gYW5kIGRpbGF0aW9ucyAnJHtkaWxhdGlvbnN9J2ApO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVQb29sMkRJbmZvKHguc2hhcGUsIGZpbHRlclNpemUsIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpO1xuICAgIGxldCByZXM7XG4gICAgaWYgKGNvbnZJbmZvLmZpbHRlcldpZHRoID09PSAxICYmIGNvbnZJbmZvLmZpbHRlckhlaWdodCA9PT0gMSAmJlxuICAgICAgICB1dGlsLmFycmF5c0VxdWFsKGNvbnZJbmZvLmluU2hhcGUsIGNvbnZJbmZvLm91dFNoYXBlKSkge1xuICAgICAgICByZXMgPSBpZGVudGl0eSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCB4VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgICAgICBjb25zdCBzdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyh4LnNoYXBlKTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gcG9vbCh4VmFsdWVzLCB4LnNoYXBlLCB4LmR0eXBlLCBzdHJpZGVzLCBjb252SW5mbywgJ21heCcpO1xuICAgICAgICByZXMgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGNvbnZJbmZvLm91dFNoYXBlLCB4LmR0eXBlLCBidWZmZXIudmFsdWVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydCBjb25zdCBtYXhQb29sQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE1heFBvb2wsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IG1heFBvb2xcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NYXhQb29sLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgTWF4UG9vbDNELCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyBwb29sM2QgfSBmcm9tICcuLi91dGlscy9wb29sX3V0aWxzJztcbmV4cG9ydCBmdW5jdGlvbiBtYXhQb29sM0QoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCBkYXRhRm9ybWF0IH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KHgsICdtYXhQb29sM2QnKTtcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlUG9vbDNESW5mbyh4LnNoYXBlLCBmaWx0ZXJTaXplLCBzdHJpZGVzLCAxIC8qIGRpbGF0aW9ucyAqLywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGRhdGFGb3JtYXQpO1xuICAgIGNvbnN0IHhWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3Qgb3V0QnVmID0gcG9vbDNkKHhWYWx1ZXMsIHguc2hhcGUsIHguZHR5cGUsIHV0aWwuY29tcHV0ZVN0cmlkZXMoeC5zaGFwZSksIGNvbnZJbmZvLCAnbWF4Jyk7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0QnVmLnNoYXBlLCAnZmxvYXQzMicsIG91dEJ1Zi52YWx1ZXMpO1xufVxuZXhwb3J0IGNvbnN0IG1heFBvb2wzRENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBNYXhQb29sM0QsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IG1heFBvb2wzRFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1heFBvb2wzRC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIGJ1ZmZlciwgTWF4UG9vbDNER3JhZCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHsgbWF4UG9vbDNkUG9zaXRpb25zIH0gZnJvbSAnLi4vdXRpbHMvcG9vbF91dGlscyc7XG5leHBvcnQgZnVuY3Rpb24gbWF4UG9vbDNER3JhZChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgZHksIGlucHV0IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChbZHksIGlucHV0XSwgJ21heFBvb2wzREdyYWQnKTtcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlUG9vbDNESW5mbyhpbnB1dC5zaGFwZSwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgMSAvKiBkaWxhdGlvbnMgKi8sIHBhZCwgZGltUm91bmRpbmdNb2RlKTtcbiAgICBjb25zdCBpbnB1dEJ1ZiA9IGJhY2tlbmQuYnVmZmVyU3luYyhpbnB1dCk7XG4gICAgY29uc3QgbWF4UG9zQnVmID0gbWF4UG9vbDNkUG9zaXRpb25zKGlucHV0QnVmLCBjb252SW5mbyk7XG4gICAgY29uc3Qgc3RyaWRlRGVwdGggPSBjb252SW5mby5zdHJpZGVEZXB0aDtcbiAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBkaWxhdGlvbkRlcHRoID0gY29udkluZm8uZGlsYXRpb25EZXB0aDtcbiAgICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICAgIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckRlcHRoID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVyRGVwdGg7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVySGVpZ2h0ID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlcldpZHRoID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVyV2lkdGg7XG4gICAgY29uc3QgcGFkRnJvbnQgPSBlZmZlY3RpdmVGaWx0ZXJEZXB0aCAtIDEgLSBjb252SW5mby5wYWRJbmZvLmZyb250O1xuICAgIGNvbnN0IHBhZExlZnQgPSBlZmZlY3RpdmVGaWx0ZXJXaWR0aCAtIDEgLSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgY29uc3QgcGFkVG9wID0gZWZmZWN0aXZlRmlsdGVySGVpZ2h0IC0gMSAtIGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IGR4ID0gYnVmZmVyKGlucHV0LnNoYXBlLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IGR5QnVmID0gYmFja2VuZC5idWZmZXJTeW5jKGR5KTtcbiAgICBmb3IgKGxldCBiYXRjaCA9IDA7IGJhdGNoIDwgY29udkluZm8uYmF0Y2hTaXplOyArK2JhdGNoKSB7XG4gICAgICAgIGZvciAobGV0IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgY29udkluZm8uaW5DaGFubmVsczsgKytjaGFubmVsKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBkeERlcHRoID0gMDsgZHhEZXB0aCA8IGNvbnZJbmZvLmluRGVwdGg7ICsrZHhEZXB0aCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGR4Um93ID0gMDsgZHhSb3cgPCBjb252SW5mby5pbkhlaWdodDsgKytkeFJvdykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBkeENvbCA9IDA7IGR4Q29sIDwgY29udkluZm8uaW5XaWR0aDsgKytkeENvbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2hhZGVyIGNvZGUgYmVnaW5zXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkeURlcHRoQ29ybmVyID0gZHhEZXB0aCAtIHBhZEZyb250O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHlSb3dDb3JuZXIgPSBkeFJvdyAtIHBhZFRvcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGR5Q29sQ29ybmVyID0gZHhDb2wgLSBwYWRMZWZ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRvdFByb2QgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgd0RlcHRoID0gMDsgd0RlcHRoIDwgZWZmZWN0aXZlRmlsdGVyRGVwdGg7IHdEZXB0aCArPSBkaWxhdGlvbkRlcHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHlEZXB0aCA9IChkeURlcHRoQ29ybmVyICsgd0RlcHRoKSAvIHN0cmlkZURlcHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkeURlcHRoIDwgMCB8fCBkeURlcHRoID49IGNvbnZJbmZvLm91dERlcHRoIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoZHlEZXB0aCkgIT09IGR5RGVwdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHdSb3cgPSAwOyB3Um93IDwgZWZmZWN0aXZlRmlsdGVySGVpZ2h0OyB3Um93ICs9IGRpbGF0aW9uSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGR5Um93ID0gKGR5Um93Q29ybmVyICsgd1JvdykgLyBzdHJpZGVIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkeVJvdyA8IDAgfHwgZHlSb3cgPj0gY29udkluZm8ub3V0SGVpZ2h0IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLmZsb29yKGR5Um93KSAhPT0gZHlSb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHdDb2wgPSAwOyB3Q29sIDwgZWZmZWN0aXZlRmlsdGVyV2lkdGg7IHdDb2wgKz0gZGlsYXRpb25XaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHlDb2wgPSAoZHlDb2xDb3JuZXIgKyB3Q29sKSAvIHN0cmlkZVdpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR5Q29sIDwgMCB8fCBkeUNvbCA+PSBjb252SW5mby5vdXRXaWR0aCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoZHlDb2wpICE9PSBkeUNvbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF4UG9zID0gZWZmZWN0aXZlRmlsdGVyRGVwdGggKiBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdGl2ZUZpbHRlcldpZHRoIC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhQb3NCdWYuZ2V0KGJhdGNoLCBkeURlcHRoLCBkeVJvdywgZHlDb2wsIGNoYW5uZWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VyUG9zID0gd0RlcHRoICogZWZmZWN0aXZlRmlsdGVySGVpZ2h0ICogZWZmZWN0aXZlRmlsdGVyV2lkdGggK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdSb3cgKiBlZmZlY3RpdmVGaWx0ZXJXaWR0aCArIHdDb2w7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXNrID0gbWF4UG9zID09PSBjdXJQb3MgPyAxIDogMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXNrID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwaXhlbCA9IGR5QnVmLmdldChiYXRjaCwgZHlEZXB0aCwgZHlSb3csIGR5Q29sLCBjaGFubmVsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdFByb2QgKz0gcGl4ZWwgKiBtYXNrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZHguc2V0KGRvdFByb2QsIGJhdGNoLCBkeERlcHRoLCBkeFJvdywgZHhDb2wsIGNoYW5uZWwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGR4LnNoYXBlLCBkeC5kdHlwZSwgZHgudmFsdWVzKTtcbn1cbmV4cG9ydCBjb25zdCBtYXhQb29sM0RHcmFkQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE1heFBvb2wzREdyYWQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IG1heFBvb2wzREdyYWRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NYXhQb29sM0RHcmFkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgYnVmZmVyLCBNYXhQb29sR3JhZCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHsgbWF4UG9vbFBvc2l0aW9ucyB9IGZyb20gJy4uL3V0aWxzL3Bvb2xfdXRpbHMnO1xuZXhwb3J0IGZ1bmN0aW9uIG1heFBvb2xHcmFkKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBkeSwgaW5wdXQsIG91dHB1dCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHggPSBpbnB1dDtcbiAgICBhc3NlcnROb3RDb21wbGV4KFtpbnB1dCwgb3V0cHV0XSwgJ21heFBvb2xHcmFkJyk7XG4gICAgY29uc3QgeyBmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSB9ID0gYXR0cnM7XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wyREluZm8oeC5zaGFwZSwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgMSAvKiBkaWxhdGlvbnMgKi8sIHBhZCwgZGltUm91bmRpbmdNb2RlKTtcbiAgICBjb25zdCB4VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IG1heFBvc0J1ZiA9IGJ1ZmZlcihjb252SW5mby5vdXRTaGFwZSwgeC5kdHlwZSwgbWF4UG9vbFBvc2l0aW9ucyh4VmFsdWVzLCB4LnNoYXBlLCB4LmR0eXBlLCBjb252SW5mbykudmFsdWVzKTtcbiAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICAgIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckhlaWdodDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoO1xuICAgIGNvbnN0IHBhZExlZnQgPSBlZmZlY3RpdmVGaWx0ZXJXaWR0aCAtIDEgLSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgY29uc3QgcGFkVG9wID0gZWZmZWN0aXZlRmlsdGVySGVpZ2h0IC0gMSAtIGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IGR4ID0gYnVmZmVyKHguc2hhcGUsICdmbG9hdDMyJyk7XG4gICAgY29uc3QgZHlEYXRhID0gYmFja2VuZC5kYXRhLmdldChkeS5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBkeUJ1ZiA9IGJ1ZmZlcihkeS5zaGFwZSwgJ2Zsb2F0MzInLCBkeURhdGEpO1xuICAgIGZvciAobGV0IGIgPSAwOyBiIDwgY29udkluZm8uYmF0Y2hTaXplOyArK2IpIHtcbiAgICAgICAgZm9yIChsZXQgZCA9IDA7IGQgPCBjb252SW5mby5pbkNoYW5uZWxzOyArK2QpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGR4UiA9IDA7IGR4UiA8IGNvbnZJbmZvLmluSGVpZ2h0OyArK2R4Uikge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGR4QyA9IDA7IGR4QyA8IGNvbnZJbmZvLmluV2lkdGg7ICsrZHhDKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNoYWRlciBjb2RlIGJlZ2lucy5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZHlSQ29ybmVyID0gZHhSIC0gcGFkVG9wO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkeUNDb3JuZXIgPSBkeEMgLSBwYWRMZWZ0O1xuICAgICAgICAgICAgICAgICAgICBsZXQgZG90UHJvZCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHdSID0gMDsgd1IgPCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQ7IHdSICs9IGRpbGF0aW9uSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkeVIgPSAoZHlSQ29ybmVyICsgd1IpIC8gc3RyaWRlSGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR5UiA8IDAgfHwgZHlSID49IGNvbnZJbmZvLm91dEhlaWdodCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoZHlSKSAhPT0gZHlSKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB3QyA9IDA7IHdDIDwgZWZmZWN0aXZlRmlsdGVyV2lkdGg7IHdDICs9IGRpbGF0aW9uV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkeUMgPSAoZHlDQ29ybmVyICsgd0MpIC8gc3RyaWRlV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR5QyA8IDAgfHwgZHlDID49IGNvbnZJbmZvLm91dFdpZHRoIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoZHlDKSAhPT0gZHlDKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXhQb3MgPSBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgKiBlZmZlY3RpdmVGaWx0ZXJXaWR0aCAtIDEgLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhQb3NCdWYuZ2V0KGIsIGR5UiwgZHlDLCBkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJQb3MgPSB3UiAqIGVmZmVjdGl2ZUZpbHRlcldpZHRoICsgd0M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFzayA9IG1heFBvcyA9PT0gY3VyUG9zID8gMSA6IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hc2sgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBpeGVsID0gZHlCdWYuZ2V0KGIsIGR5UiwgZHlDLCBkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3RQcm9kICs9IHBpeGVsICogbWFzaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkeC5zZXQoZG90UHJvZCwgYiwgZHhSLCBkeEMsIGQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhkeC5zaGFwZSwgZHguZHR5cGUsIGR4LnZhbHVlcyk7XG59XG5leHBvcnQgY29uc3QgbWF4UG9vbEdyYWRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTWF4UG9vbEdyYWQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IG1heFBvb2xHcmFkXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWF4UG9vbEdyYWQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTWF4UG9vbFdpdGhBcmdtYXggfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYmFja2VuZF91dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyBtYXhQb29sV2l0aEFyZ21heEltcGwgfSBmcm9tICcuL01heFBvb2xXaXRoQXJnbWF4X2ltcGwnO1xuZXhwb3J0IGNvbnN0IG1heFBvb2xXaXRoQXJnbWF4Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE1heFBvb2xXaXRoQXJnbWF4LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiAoeyBpbnB1dHMsIGF0dHJzLCBiYWNrZW5kIH0pID0+IHtcbiAgICAgICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgICAgIGNvbnN0IHsgZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBpbmNsdWRlQmF0Y2hJbkluZGV4IH0gPSBhdHRycztcbiAgICAgICAgY29uc3QgY3B1QmFja2VuZCA9IGJhY2tlbmQ7XG4gICAgICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ01heFBvb2xXaXRoQXJnbWF4Jyk7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcztcbiAgICAgICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wyREluZm8oeC5zaGFwZSwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgWzEsIDFdLCBwYWQpO1xuICAgICAgICBjb25zdCBbcG9vbGVkLCBpbmRleGVzXSA9IG1heFBvb2xXaXRoQXJnbWF4SW1wbCh2YWx1ZXMsIHguc2hhcGUsIHguZHR5cGUsIGluY2x1ZGVCYXRjaEluSW5kZXgsIGNvbnZJbmZvKTtcbiAgICAgICAgY29uc3QgcG9vbGVkRGF0YUlkID0gY3B1QmFja2VuZC53cml0ZShwb29sZWQsIGNvbnZJbmZvLm91dFNoYXBlLCB4LmR0eXBlKTtcbiAgICAgICAgY29uc3QgaW5kZXhlc0RhdGFJZCA9IGNwdUJhY2tlbmQud3JpdGUoaW5kZXhlcywgY29udkluZm8ub3V0U2hhcGUsIHguZHR5cGUpO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgeyBkYXRhSWQ6IHBvb2xlZERhdGFJZCwgc2hhcGU6IGNvbnZJbmZvLm91dFNoYXBlLCBkdHlwZTogeC5kdHlwZSB9LFxuICAgICAgICAgICAgeyBkYXRhSWQ6IGluZGV4ZXNEYXRhSWQsIHNoYXBlOiBjb252SW5mby5vdXRTaGFwZSwgZHR5cGU6ICdpbnQzMicgfVxuICAgICAgICBdO1xuICAgIH1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NYXhQb29sV2l0aEFyZ21heC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IG1heFBvb2xQb3NpdGlvbnMsIHBvb2wgfSBmcm9tICcuLi91dGlscy9wb29sX3V0aWxzJztcbmV4cG9ydCBmdW5jdGlvbiBtYXhQb29sV2l0aEFyZ21heEltcGwoeFZhbHVlcywgeFNoYXBlLCBkdHlwZSwgaW5jbHVkZUJhdGNoSW5JbmRleCwgY29udkluZm8pIHtcbiAgICBjb25zdCBzdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyh4U2hhcGUpO1xuICAgIGNvbnN0IG1heFBvb2xzID0gcG9vbCh4VmFsdWVzLCB4U2hhcGUsIGR0eXBlLCBzdHJpZGVzLCBjb252SW5mbywgJ21heCcpO1xuICAgIGNvbnN0IG1heFBvc2l0aW9ucyA9IG1heFBvb2xQb3NpdGlvbnMoeFZhbHVlcywgeFNoYXBlLCBkdHlwZSwgY29udkluZm8sIHRydWUsIGluY2x1ZGVCYXRjaEluSW5kZXgpO1xuICAgIHJldHVybiBbbWF4UG9vbHMudmFsdWVzLCBtYXhQb3NpdGlvbnMudmFsdWVzXTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1heFBvb2xXaXRoQXJnbWF4X2ltcGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgZnVuY3Rpb24gbWF4SW1wbChhVmFscywgcmVkdWNlU2l6ZSwgb3V0U2hhcGUsIGR0eXBlKSB7XG4gICAgY29uc3QgdmFscyA9IHV0aWwuZ2V0VHlwZWRBcnJheUZyb21EVHlwZShkdHlwZSwgdXRpbC5zaXplRnJvbVNoYXBlKG91dFNoYXBlKSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGkgKiByZWR1Y2VTaXplO1xuICAgICAgICBsZXQgbWF4ID0gYVZhbHNbb2Zmc2V0XTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByZWR1Y2VTaXplOyArK2opIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYVZhbHNbb2Zmc2V0ICsgal07XG4gICAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHZhbHVlKSB8fFxuICAgICAgICAgICAgICAgIHZhbHVlID4gbWF4KSB7IC8vIGNvbXBhcmlzb24gd2l0aCBOYU4gYWx3YXlzIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgICAgIG1heCA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhbHNbaV0gPSBtYXg7XG4gICAgfVxuICAgIHJldHVybiB2YWxzO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWF4X2ltcGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTWF4aW11bSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X2ltcGwnO1xuaW1wb3J0IHsgYmluYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgbWF4aW11bUltcGwgPSBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsKCgoYVZhbHVlLCBiVmFsdWUpID0+IE1hdGgubWF4KGFWYWx1ZSwgYlZhbHVlKSkpO1xuZXhwb3J0IGNvbnN0IG1heGltdW0gPSBiaW5hcnlLZXJuZWxGdW5jKE1heGltdW0sIG1heGltdW1JbXBsKTtcbmV4cG9ydCBjb25zdCBtYXhpbXVtQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE1heGltdW0sXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IG1heGltdW1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NYXhpbXVtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgTWVhbiwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjYXN0IH0gZnJvbSAnLi9DYXN0JztcbmltcG9ydCB7IGRpdiB9IGZyb20gJy4vUmVhbERpdic7XG5pbXBvcnQgeyBzdW0gfSBmcm9tICcuL1N1bSc7XG5leHBvcnQgZnVuY3Rpb24gbWVhbihhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYXhpcywga2VlcERpbXMgfSA9IGF0dHJzO1xuICAgIGNvbnN0IGF4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpO1xuICAgIGNvbnN0IHNoYXBlcyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKHguc2hhcGUsIGF4ZXMpO1xuICAgIGNvbnN0IHJlZHVjZVNoYXBlID0gc2hhcGVzWzFdO1xuICAgIGNvbnN0IHJlZHVjZVNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuICAgIGNvbnN0IHRvRGlzcG9zZSA9IFtdO1xuICAgIGNvbnN0IHJlZHVjZVNpemVTY2FsYXIgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtdLCAnZmxvYXQzMicsIG5ldyBGbG9hdDMyQXJyYXkoW3JlZHVjZVNpemVdKSk7XG4gICAgdG9EaXNwb3NlLnB1c2gocmVkdWNlU2l6ZVNjYWxhcik7XG4gICAgY29uc3QgJHggPSBjYXN0KHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCwgYXR0cnM6IHsgZHR5cGU6ICdmbG9hdDMyJyB9IH0pO1xuICAgIHRvRGlzcG9zZS5wdXNoKCR4KTtcbiAgICBjb25zdCByZXMgPSBkaXYoeyBpbnB1dHM6IHsgYTogJHgsIGI6IHJlZHVjZVNpemVTY2FsYXIgfSwgYmFja2VuZCB9KTtcbiAgICB0b0Rpc3Bvc2UucHVzaChyZXMpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHN1bSh7IGlucHV0czogeyB4OiByZXMgfSwgYmFja2VuZCwgYXR0cnM6IHsgYXhpcywga2VlcERpbXMgfSB9KTtcbiAgICB0b0Rpc3Bvc2UuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgY29uc3QgbWVhbkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBNZWFuLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBtZWFuXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWVhbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIE1pbiwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQgeyB0cmFuc3Bvc2UgfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5leHBvcnQgZnVuY3Rpb24gbWluKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBheGlzLCBrZWVwRGltcyB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnbWluJyk7XG4gICAgY29uc3Qgb3JpZ0F4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpO1xuICAgIGxldCBheGVzID0gb3JpZ0F4ZXM7XG4gICAgY29uc3QgcGVybXV0ZWRBeGVzID0gYmFja2VuZF91dGlsLmdldEF4ZXNQZXJtdXRhdGlvbihheGVzLCB4LnNoYXBlLmxlbmd0aCk7XG4gICAgbGV0ICR4ID0geDtcbiAgICBpZiAocGVybXV0ZWRBeGVzICE9IG51bGwpIHtcbiAgICAgICAgJHggPSB0cmFuc3Bvc2UoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kLCBhdHRyczogeyBwZXJtOiBwZXJtdXRlZEF4ZXMgfSB9KTtcbiAgICAgICAgYXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRJbm5lck1vc3RBeGVzKGF4ZXMubGVuZ3RoLCB4LnNoYXBlLmxlbmd0aCk7XG4gICAgfVxuICAgIGJhY2tlbmRfdXRpbC5hc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcygnbWluJywgYXhlcywgJHguc2hhcGUubGVuZ3RoKTtcbiAgICBjb25zdCBbb3V0U2hhcGUsIHJlZHVjZVNoYXBlXSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKCR4LnNoYXBlLCBheGVzKTtcbiAgICBjb25zdCByZWR1Y2VTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcbiAgICBjb25zdCB2YWxzID0gdXRpbC5tYWtlWmVyb3NUeXBlZEFycmF5KHV0aWwuc2l6ZUZyb21TaGFwZShvdXRTaGFwZSksICR4LmR0eXBlKTtcbiAgICBjb25zdCBhVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoJHguZGF0YUlkKS52YWx1ZXM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGkgKiByZWR1Y2VTaXplO1xuICAgICAgICBsZXQgbWluID0gYVZhbHNbb2Zmc2V0XTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByZWR1Y2VTaXplOyArK2opIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYVZhbHNbb2Zmc2V0ICsgal07XG4gICAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHZhbHVlKSB8fFxuICAgICAgICAgICAgICAgIHZhbHVlIDwgbWluKSB7IC8vIGNvbXBhcmlzb24gd2l0aCBOYU4gYWx3YXlzIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgICAgIG1pbiA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhbHNbaV0gPSBtaW47XG4gICAgfVxuICAgIGlmIChwZXJtdXRlZEF4ZXMgIT0gbnVsbCkge1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKCR4KTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRTaGFwZSwgJHguZHR5cGUsIHZhbHMpO1xuICAgIGlmIChrZWVwRGltcykge1xuICAgICAgICBjb25zdCBleHBhbmRlZFNoYXBlID0gYmFja2VuZF91dGlsLmV4cGFuZFNoYXBlVG9LZWVwRGltKG91dFNoYXBlLCBvcmlnQXhlcyk7XG4gICAgICAgIGNvbnN0IHJlc2hhcGVkUmVzdWx0ID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiByZXN1bHQgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IGV4cGFuZGVkU2hhcGUgfSB9KTtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXN1bHQpO1xuICAgICAgICByZXR1cm4gcmVzaGFwZWRSZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgY29uc3QgbWluQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE1pbixcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogbWluXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWluLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IE1pbmltdW0gfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IG1pbmltdW1JbXBsID0gY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoKGFWYWx1ZSwgYlZhbHVlKSA9PiBNYXRoLm1pbihhVmFsdWUsIGJWYWx1ZSkpKTtcbmV4cG9ydCBjb25zdCBtaW5pbXVtID0gYmluYXJ5S2VybmVsRnVuYyhNaW5pbXVtLCBtaW5pbXVtSW1wbCk7XG5leHBvcnQgY29uc3QgbWluaW11bUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBNaW5pbXVtLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBtaW5pbXVtXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWluaW11bS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBNaXJyb3JQYWQsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBtaXJyb3JQYWQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHBhZGRpbmdzLCBtb2RlIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KHgsICdtaXJyb3JQYWQnKTtcbiAgICBjb25zdCBvdXRTaGFwZSA9IHBhZGRpbmdzLm1hcCgocCwgaSkgPT4gcFswXSAvKiBiZWZvcmVQYWQgKi8gKyB4LnNoYXBlW2ldICsgcFsxXSAvKiBhZnRlclBhZCAqLyk7XG4gICAgY29uc3Qgc3RhcnQgPSBwYWRkaW5ncy5tYXAocCA9PiBwWzBdKTtcbiAgICBjb25zdCBlbmQgPSBwYWRkaW5ncy5tYXAoKHAsIGkpID0+IHBbMF0gKyB4LnNoYXBlW2ldKTtcbiAgICBjb25zdCBvZmZzZXQgPSBtb2RlID09PSAncmVmbGVjdCcgPyAwIDogMTtcbiAgICBjb25zdCB4VmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCB4UmFuayA9IHguc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IHhTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyh4LnNoYXBlKTtcbiAgICBjb25zdCByZXN1bHRTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKG91dFNoYXBlKTtcbiAgICBjb25zdCByZXN1bHRSYW5rID0gb3V0U2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IHJlc3VsdFN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKG91dFNoYXBlKTtcbiAgICBjb25zdCByZXNWYWxzID0gdXRpbC5nZXRUeXBlZEFycmF5RnJvbURUeXBlKHguZHR5cGUsIHJlc3VsdFNpemUpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0U2l6ZTsgaSsrKSB7XG4gICAgICAgIGxldCBjb29yZHMgPSB1dGlsLmluZGV4VG9Mb2MoaSwgcmVzdWx0UmFuaywgcmVzdWx0U3RyaWRlcyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0UmFuazsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoY29vcmRzW2ldIDwgc3RhcnRbaV0pIHtcbiAgICAgICAgICAgICAgICBjb29yZHNbaV0gPSBzdGFydFtpXSAqIDIgLSBjb29yZHNbaV0gLSBvZmZzZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjb29yZHNbaV0gPj0gZW5kW2ldKSB7XG4gICAgICAgICAgICAgICAgY29vcmRzW2ldID0gKGVuZFtpXSAtIDEpICogMiAtIGNvb3Jkc1tpXSArIG9mZnNldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb29yZHMgPSBjb29yZHMubWFwKChjLCBpKSA9PiBjIC0gc3RhcnRbaV0pO1xuICAgICAgICBjb25zdCBpbkluZGV4ID0gdXRpbC5sb2NUb0luZGV4KGNvb3JkcywgeFJhbmssIHhTdHJpZGVzKTtcbiAgICAgICAgcmVzVmFsc1tpXSA9IHhWYWxzW2luSW5kZXhdO1xuICAgIH1cbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQud3JpdGUocmVzVmFscywgb3V0U2hhcGUsIHguZHR5cGUpO1xuICAgIHJldHVybiB7IGRhdGFJZDogb3V0SWQsIHNoYXBlOiBvdXRTaGFwZSwgZHR5cGU6IHguZHR5cGUgfTtcbn1cbmV4cG9ydCBjb25zdCBtaXJyb3JQYWRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTWlycm9yUGFkLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBtaXJyb3JQYWRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NaXJyb3JQYWQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTW9kIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfaW1wbCc7XG5pbXBvcnQgeyBiaW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBtb2RJbXBsID0gY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoKGFWYWx1ZSwgYlZhbHVlKSA9PiB7XG4gICAgY29uc3QgcmVtID0gYVZhbHVlICUgYlZhbHVlO1xuICAgIGlmICgoYVZhbHVlIDwgMCAmJiBiVmFsdWUgPCAwKSB8fCAoYVZhbHVlID49IDAgJiYgYlZhbHVlID49IDApKSB7XG4gICAgICAgIHJldHVybiByZW07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gKHJlbSArIGJWYWx1ZSkgJSBiVmFsdWU7XG4gICAgfVxufSkpO1xuZXhwb3J0IGNvbnN0IG1vZCA9IGJpbmFyeUtlcm5lbEZ1bmMoTW9kLCBtb2RJbXBsKTtcbmV4cG9ydCBjb25zdCBtb2RDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTW9kLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBtb2Rcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Nb2QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTXVsdGlub21pYWwsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0ICogYXMgc2VlZHJhbmRvbSBmcm9tICdzZWVkcmFuZG9tJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyBzb2Z0bWF4IH0gZnJvbSAnLi9Tb2Z0bWF4JztcbmV4cG9ydCBmdW5jdGlvbiBtdWx0aW5vbWlhbChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgbG9naXRzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBudW1TYW1wbGVzLCBzZWVkLCBub3JtYWxpemVkIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KGxvZ2l0cywgJ211bHRpbm9taWFsJyk7XG4gICAgY29uc3QgcHJvYmFiaWxpdGllcyA9IG5vcm1hbGl6ZWQgP1xuICAgICAgICBsb2dpdHMgOlxuICAgICAgICBzb2Z0bWF4KHsgaW5wdXRzOiB7IGxvZ2l0cyB9LCBiYWNrZW5kLCBhdHRyczogeyBkaW06IC0xIH0gfSk7XG4gICAgY29uc3QgYmF0Y2hTaXplID0gcHJvYmFiaWxpdGllcy5zaGFwZVswXTtcbiAgICBjb25zdCBudW1FdmVudHMgPSBwcm9iYWJpbGl0aWVzLnNoYXBlWzFdO1xuICAgIGNvbnN0IHByb2JWYWxzID0gYmFja2VuZC5kYXRhLmdldChwcm9iYWJpbGl0aWVzLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHJlc1NoYXBlID0gW2JhdGNoU2l6ZSwgbnVtU2FtcGxlc107XG4gICAgY29uc3QgcmVzVmFscyA9IHV0aWwubWFrZVplcm9zVHlwZWRBcnJheSh1dGlsLnNpemVGcm9tU2hhcGUocmVzU2hhcGUpLCAnaW50MzInKTtcbiAgICBmb3IgKGxldCBiID0gMDsgYiA8IGJhdGNoU2l6ZTsgKytiKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGIgKiBudW1FdmVudHM7XG4gICAgICAgIC8vIFRoZSBjZGYgd29uJ3QgaW5jbHVkZSB0aGUgbGFzdCBldmVudC4gSXQgd2lsbCBiZSBpbXBsaWNpdCBpZiBubyBvdGhlclxuICAgICAgICAvLyBldmVudCBoYXBwZW5lZC5cbiAgICAgICAgY29uc3QgY2RmID0gbmV3IEZsb2F0MzJBcnJheShudW1FdmVudHMgLSAxKTtcbiAgICAgICAgY2RmWzBdID0gcHJvYlZhbHNbb2Zmc2V0XTtcbiAgICAgICAgZm9yIChsZXQgZXZlbnQgPSAxOyBldmVudCA8IGNkZi5sZW5ndGg7ICsrZXZlbnQpIHtcbiAgICAgICAgICAgIGNkZltldmVudF0gPSBjZGZbZXZlbnQgLSAxXSArIHByb2JWYWxzW29mZnNldCArIGV2ZW50XTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByYW5kb20gPSBzZWVkcmFuZG9tLmFsZWEoc2VlZC50b1N0cmluZygpKTtcbiAgICAgICAgY29uc3Qgb3V0T2Zmc2V0ID0gYiAqIG51bVNhbXBsZXM7XG4gICAgICAgIGZvciAobGV0IHNhbXBsZUlkID0gMDsgc2FtcGxlSWQgPCBudW1TYW1wbGVzOyArK3NhbXBsZUlkKSB7XG4gICAgICAgICAgICBjb25zdCByID0gcmFuZG9tKCk7XG4gICAgICAgICAgICAvLyBBc3N1bWUgbGFzdCBldmVudCBoYXBwZW5lZCBieSBkZWZhdWx0LlxuICAgICAgICAgICAgcmVzVmFsc1tvdXRPZmZzZXQgKyBzYW1wbGVJZF0gPSBjZGYubGVuZ3RoO1xuICAgICAgICAgICAgZm9yIChsZXQgZXZlbnQgPSAwOyBldmVudCA8IGNkZi5sZW5ndGg7IGV2ZW50KyspIHtcbiAgICAgICAgICAgICAgICBpZiAociA8IGNkZltldmVudF0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzVmFsc1tvdXRPZmZzZXQgKyBzYW1wbGVJZF0gPSBldmVudDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghbm9ybWFsaXplZCkge1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHByb2JhYmlsaXRpZXMpO1xuICAgIH1cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhyZXNTaGFwZSwgJ2ludDMyJywgcmVzVmFscyk7XG59XG5leHBvcnQgY29uc3QgbXVsdGlub21pYWxDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTXVsdGlub21pYWwsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IG11bHRpbm9taWFsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TXVsdGlub21pYWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTXVsdGlwbHkgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMsIGNyZWF0ZUNvbXBsZXhCaW5hcnlLZXJuZWxJbXBsIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBtdWx0aXBseUltcGwgPSBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsKCgoYVZhbHVlLCBiVmFsdWUpID0+IGFWYWx1ZSAqIGJWYWx1ZSkpO1xuZXhwb3J0IGNvbnN0IG11bHRpcGx5Q29tcGxleEltcGwgPSBjcmVhdGVDb21wbGV4QmluYXJ5S2VybmVsSW1wbCgoKGFSZWFsLCBhSW1hZywgYlJlYWwsIGJJbWFnKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmVhbDogYVJlYWwgKiBiUmVhbCAtIGFJbWFnICogYkltYWcsXG4gICAgICAgIGltYWc6IGFSZWFsICogYkltYWcgKyBhSW1hZyAqIGJSZWFsXG4gICAgfTtcbn0pKTtcbmV4cG9ydCBjb25zdCBtdWx0aXBseSA9IGJpbmFyeUtlcm5lbEZ1bmMoTXVsdGlwbHksIG11bHRpcGx5SW1wbCwgbXVsdGlwbHlDb21wbGV4SW1wbCk7XG5leHBvcnQgY29uc3QgbXVsdGlwbHlDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTXVsdGlwbHksXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IG11bHRpcGx5XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TXVsdGlwbHkuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTmVnLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyBtdWx0aXBseUltcGwgfSBmcm9tICcuL011bHRpcGx5JztcbmV4cG9ydCBmdW5jdGlvbiBuZWdJbXBsKHhWYWxzLCB4U2hhcGUsIHhEdHlwZSkge1xuICAgIGNvbnN0IG1pbnVzT25lID0gdXRpbC5jcmVhdGVTY2FsYXJWYWx1ZSgtMSwgeER0eXBlKTtcbiAgICByZXR1cm4gbXVsdGlwbHlJbXBsKFtdLCB4U2hhcGUsIG1pbnVzT25lLCB4VmFscywgeER0eXBlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBuZWcoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ25lZycpO1xuICAgIGNvbnN0IHhWYWxzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IFtyZXMsIG5ld1NoYXBlXSA9IG5lZ0ltcGwoeFZhbHMsIHguc2hhcGUsIHguZHR5cGUpO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG5ld1NoYXBlLCB4LmR0eXBlLCByZXMpO1xufVxuZXhwb3J0IGNvbnN0IG5lZ0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBOZWcsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IG5lZ1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5lZy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBrZXJuZWxfaW1wbHMsIE5vbk1heFN1cHByZXNzaW9uVjMgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25WM0ltcGwgPSBrZXJuZWxfaW1wbHMubm9uTWF4U3VwcHJlc3Npb25WM0ltcGw7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIG5vbk1heFN1cHByZXNzaW9uVjMoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGJveGVzLCBzY29yZXMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoYm94ZXMsICdOb25NYXhTdXBwcmVzc2lvbicpO1xuICAgIGNvbnN0IGJveGVzVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoYm94ZXMuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3Qgc2NvcmVzVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoc2NvcmVzLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHsgc2VsZWN0ZWRJbmRpY2VzIH0gPSBub25NYXhTdXBwcmVzc2lvblYzSW1wbChib3hlc1ZhbHMsIHNjb3Jlc1ZhbHMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQpO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtzZWxlY3RlZEluZGljZXMubGVuZ3RoXSwgJ2ludDMyJywgbmV3IEludDMyQXJyYXkoc2VsZWN0ZWRJbmRpY2VzKSk7XG59XG5leHBvcnQgY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25WM0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBOb25NYXhTdXBwcmVzc2lvblYzLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBub25NYXhTdXBwcmVzc2lvblYzXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Tm9uTWF4U3VwcHJlc3Npb25WMy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBrZXJuZWxfaW1wbHMsIE5vbk1heFN1cHByZXNzaW9uVjQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25WNEltcGwgPSBrZXJuZWxfaW1wbHMubm9uTWF4U3VwcHJlc3Npb25WNEltcGw7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIG5vbk1heFN1cHByZXNzaW9uVjQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGJveGVzLCBzY29yZXMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsIHBhZFRvTWF4T3V0cHV0U2l6ZSB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChib3hlcywgJ05vbk1heFN1cHByZXNzaW9uUGFkZGVkJyk7XG4gICAgY29uc3QgYm94ZXNWYWxzID0gYmFja2VuZC5kYXRhLmdldChib3hlcy5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBzY29yZXNWYWxzID0gYmFja2VuZC5kYXRhLmdldChzY29yZXMuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgeyBzZWxlY3RlZEluZGljZXMsIHZhbGlkT3V0cHV0cyB9ID0gbm9uTWF4U3VwcHJlc3Npb25WNEltcGwoYm94ZXNWYWxzLCBzY29yZXNWYWxzLCBtYXhPdXRwdXRTaXplLCBpb3VUaHJlc2hvbGQsIHNjb3JlVGhyZXNob2xkLCBwYWRUb01heE91dHB1dFNpemUpO1xuICAgIHJldHVybiBbXG4gICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW3NlbGVjdGVkSW5kaWNlcy5sZW5ndGhdLCAnaW50MzInLCBuZXcgSW50MzJBcnJheShzZWxlY3RlZEluZGljZXMpKSxcbiAgICAgICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbXSwgJ2ludDMyJywgbmV3IEludDMyQXJyYXkoW3ZhbGlkT3V0cHV0c10pKVxuICAgIF07XG59XG5leHBvcnQgY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25WNENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBOb25NYXhTdXBwcmVzc2lvblY0LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBub25NYXhTdXBwcmVzc2lvblY0XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Tm9uTWF4U3VwcHJlc3Npb25WNC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBrZXJuZWxfaW1wbHMsIE5vbk1heFN1cHByZXNzaW9uVjUgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25WNUltcGwgPSBrZXJuZWxfaW1wbHMubm9uTWF4U3VwcHJlc3Npb25WNUltcGw7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIG5vbk1heFN1cHByZXNzaW9uVjUoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGJveGVzLCBzY29yZXMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsIHNvZnRObXNTaWdtYSB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChib3hlcywgJ05vbk1heFN1cHByZXNzaW9uV2l0aFNjb3JlJyk7XG4gICAgY29uc3QgYm94ZXNWYWxzID0gYmFja2VuZC5kYXRhLmdldChib3hlcy5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBzY29yZXNWYWxzID0gYmFja2VuZC5kYXRhLmdldChzY29yZXMuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgbWF4T3V0cHV0U2l6ZVZhbCA9IG1heE91dHB1dFNpemU7XG4gICAgY29uc3QgaW91VGhyZXNob2xkVmFsID0gaW91VGhyZXNob2xkO1xuICAgIGNvbnN0IHNjb3JlVGhyZXNob2xkVmFsID0gc2NvcmVUaHJlc2hvbGQ7XG4gICAgY29uc3Qgc29mdE5tc1NpZ21hVmFsID0gc29mdE5tc1NpZ21hO1xuICAgIGNvbnN0IHsgc2VsZWN0ZWRJbmRpY2VzLCBzZWxlY3RlZFNjb3JlcyB9ID0gbm9uTWF4U3VwcHJlc3Npb25WNUltcGwoYm94ZXNWYWxzLCBzY29yZXNWYWxzLCBtYXhPdXRwdXRTaXplVmFsLCBpb3VUaHJlc2hvbGRWYWwsIHNjb3JlVGhyZXNob2xkVmFsLCBzb2Z0Tm1zU2lnbWFWYWwpO1xuICAgIHJldHVybiBbXG4gICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW3NlbGVjdGVkSW5kaWNlcy5sZW5ndGhdLCAnaW50MzInLCBuZXcgSW50MzJBcnJheShzZWxlY3RlZEluZGljZXMpKSxcbiAgICAgICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbc2VsZWN0ZWRTY29yZXMubGVuZ3RoXSwgJ2Zsb2F0MzInLCBuZXcgRmxvYXQzMkFycmF5KHNlbGVjdGVkU2NvcmVzKSlcbiAgICBdO1xufVxuZXhwb3J0IGNvbnN0IG5vbk1heFN1cHByZXNzaW9uVjVDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTm9uTWF4U3VwcHJlc3Npb25WNSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogbm9uTWF4U3VwcHJlc3Npb25WNVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5vbk1heFN1cHByZXNzaW9uVjUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTm90RXF1YWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IG5vdEVxdWFsSW1wbCA9IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwoKChhLCBiKSA9PiAoYSAhPT0gYikgPyAxIDogMCkpO1xuZXhwb3J0IGNvbnN0IG5vdEVxdWFsID0gYmluYXJ5S2VybmVsRnVuYyhOb3RFcXVhbCwgbm90RXF1YWxJbXBsLCBudWxsIC8qIGNvbXBsZXhPcCAqLywgJ2Jvb2wnKTtcbmV4cG9ydCBjb25zdCBub3RFcXVhbENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBOb3RFcXVhbCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogbm90RXF1YWxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ob3RFcXVhbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBPbmVIb3QsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBvbmVIb3QoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGluZGljZXMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGRlcHRoLCBvblZhbHVlLCBvZmZWYWx1ZSB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChpbmRpY2VzLCAnb25lSG90Jyk7XG4gICAgY29uc3QgaW5kaWNlc1NpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoaW5kaWNlcy5zaGFwZSk7XG4gICAgY29uc3QgcmVzID0gbmV3IEZsb2F0MzJBcnJheShpbmRpY2VzU2l6ZSAqIGRlcHRoKTtcbiAgICByZXMuZmlsbChvZmZWYWx1ZSk7XG4gICAgY29uc3QgaW5kaWNlc1ZhbCA9IGJhY2tlbmQuZGF0YS5nZXQoaW5kaWNlcy5kYXRhSWQpLnZhbHVlcztcbiAgICBmb3IgKGxldCBldmVudCA9IDA7IGV2ZW50IDwgaW5kaWNlc1NpemU7ICsrZXZlbnQpIHtcbiAgICAgICAgaWYgKGluZGljZXNWYWxbZXZlbnRdID49IDAgJiYgaW5kaWNlc1ZhbFtldmVudF0gPCBkZXB0aCkge1xuICAgICAgICAgICAgcmVzW2V2ZW50ICogZGVwdGggKyBpbmRpY2VzVmFsW2V2ZW50XV0gPSBvblZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFsuLi5pbmRpY2VzLnNoYXBlLCBkZXB0aF0sICdpbnQzMicsIHJlcyk7XG59XG5leHBvcnQgY29uc3Qgb25lSG90Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE9uZUhvdCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogb25lSG90XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9T25lSG90LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IE9uZXNMaWtlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNvbXBsZXggfSBmcm9tICcuL0NvbXBsZXgnO1xuaW1wb3J0IHsgZmlsbCB9IGZyb20gJy4vRmlsbCc7XG5pbXBvcnQgeyBpbWFnIH0gZnJvbSAnLi9JbWFnJztcbmltcG9ydCB7IHJlYWwgfSBmcm9tICcuL1JlYWwnO1xuaW1wb3J0IHsgemVyb3NMaWtlIH0gZnJvbSAnLi9aZXJvc0xpa2UnO1xuZXhwb3J0IGZ1bmN0aW9uIG9uZXNMaWtlKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBpZiAoeC5kdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdvbmVzTGlrZSBpcyBub3Qgc3VwcG9ydGVkIGZvciBzdHJpbmcgdGVuc29ycycpO1xuICAgIH1cbiAgICBlbHNlIGlmICh4LmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICBjb25zdCByZWFsUGFydCA9IHJlYWwoeyBpbnB1dHM6IHsgaW5wdXQ6IHggfSwgYmFja2VuZCB9KTtcbiAgICAgICAgY29uc3QgciA9IG9uZXNMaWtlKHsgaW5wdXRzOiB7IHg6IHJlYWxQYXJ0IH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIGNvbnN0IGltYWdQYXJ0ID0gaW1hZyh7IGlucHV0czogeyBpbnB1dDogeCB9LCBiYWNrZW5kIH0pO1xuICAgICAgICBjb25zdCBpID0gemVyb3NMaWtlKHsgaW5wdXRzOiB7IHg6IGltYWdQYXJ0IH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBsZXgoeyBpbnB1dHM6IHsgcmVhbDogciwgaW1hZzogaSB9LCBiYWNrZW5kIH0pO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlYWxQYXJ0KTtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyKTtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpbWFnUGFydCk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gZmlsbCh7IGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiB4LnNoYXBlLCB2YWx1ZTogMSwgZHR5cGU6IHguZHR5cGUgfSB9KTtcbiAgICB9XG59XG5leHBvcnQgY29uc3Qgb25lc0xpa2VDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogT25lc0xpa2UsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IG9uZXNMaWtlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9T25lc0xpa2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUGFjaywgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjb25jYXQgfSBmcm9tICcuL0NvbmNhdCc7XG5pbXBvcnQgeyBleHBhbmREaW1zIH0gZnJvbSAnLi9FeHBhbmREaW1zJztcbmV4cG9ydCBmdW5jdGlvbiBwYWNrKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBheGlzIH0gPSBhdHRycztcbiAgICBpZiAoaW5wdXRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gZXhwYW5kRGltcyh7IGlucHV0czogeyBpbnB1dDogaW5wdXRzWzBdIH0sIGJhY2tlbmQsIGF0dHJzOiB7IGRpbTogYXhpcyB9IH0pO1xuICAgIH1cbiAgICBjb25zdCBzaGFwZSA9IGlucHV0c1swXS5zaGFwZTtcbiAgICBjb25zdCBkdHlwZSA9IGlucHV0c1swXS5kdHlwZTtcbiAgICBpbnB1dHMuZm9yRWFjaCh0ID0+IHtcbiAgICAgICAgdXRpbC5hc3NlcnRTaGFwZXNNYXRjaChzaGFwZSwgdC5zaGFwZSwgJ0FsbCB0ZW5zb3JzIHBhc3NlZCB0byBzdGFjayBtdXN0IGhhdmUgbWF0Y2hpbmcgc2hhcGVzJyk7XG4gICAgICAgIHV0aWwuYXNzZXJ0KGR0eXBlID09PSB0LmR0eXBlLCAoKSA9PiAnQWxsIHRlbnNvcnMgcGFzc2VkIHRvIHN0YWNrIG11c3QgaGF2ZSBtYXRjaGluZyBkdHlwZXMnKTtcbiAgICB9KTtcbiAgICBjb25zdCBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcyA9IFtdO1xuICAgIGNvbnN0IGV4cGFuZGVkVGVuc29ycyA9IGlucHV0cy5tYXAodCA9PiB7XG4gICAgICAgIGNvbnN0IGV4cGFuZGVkVCA9IGV4cGFuZERpbXMoeyBpbnB1dHM6IHsgaW5wdXQ6IHQgfSwgYmFja2VuZCwgYXR0cnM6IHsgZGltOiBheGlzIH0gfSk7XG4gICAgICAgIGludGVybWVkaWF0ZVRlbnNvckluZm9zLnB1c2goZXhwYW5kZWRUKTtcbiAgICAgICAgcmV0dXJuIGV4cGFuZGVkVDtcbiAgICB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBjb25jYXQoeyBpbnB1dHM6IGV4cGFuZGVkVGVuc29ycywgYmFja2VuZCwgYXR0cnM6IHsgYXhpcyB9IH0pO1xuICAgIGludGVybWVkaWF0ZVRlbnNvckluZm9zLmZvckVhY2godCA9PiBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHQpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGNvbnN0IHBhY2tDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUGFjayxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogcGFja1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBhY2suanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUGFkVjIsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBwYWRWMihhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgcGFkZGluZ3MsIGNvbnN0YW50VmFsdWUgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ3BhZCcpO1xuICAgIGNvbnN0IG91dFNoYXBlID0gcGFkZGluZ3MubWFwKChwLCBpKSA9PiBwWzBdIC8qIGJlZm9yZVBhZCAqLyArIHguc2hhcGVbaV0gKyBwWzFdIC8qIGFmdGVyUGFkICovKTtcbiAgICBjb25zdCBzdGFydCA9IHBhZGRpbmdzLm1hcChwID0+IHBbMF0pO1xuICAgIGNvbnN0IHhWYWxzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHhTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHguc2hhcGUpO1xuICAgIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgeFN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKHguc2hhcGUpO1xuICAgIGNvbnN0IHJlc3VsdFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUob3V0U2hhcGUpO1xuICAgIGNvbnN0IHJlc3VsdFJhbmsgPSBvdXRTaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgcmVzdWx0U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMob3V0U2hhcGUpO1xuICAgIGNvbnN0IHJlc1ZhbHMgPSB1dGlsLmdldFR5cGVkQXJyYXlGcm9tRFR5cGUoeC5kdHlwZSwgcmVzdWx0U2l6ZSk7XG4gICAgaWYgKGNvbnN0YW50VmFsdWUgIT09IDApIHtcbiAgICAgICAgcmVzVmFscy5maWxsKGNvbnN0YW50VmFsdWUpO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHhTaXplOyBpKyspIHtcbiAgICAgICAgY29uc3QgY29vcmRzID0gdXRpbC5pbmRleFRvTG9jKGksIHhSYW5rLCB4U3RyaWRlcyk7XG4gICAgICAgIGNvbnN0IG91dENvb3JkcyA9IGNvb3Jkcy5tYXAoKGMsIGkpID0+IGMgKyBzdGFydFtpXSk7XG4gICAgICAgIGNvbnN0IG91dEluZGV4ID0gdXRpbC5sb2NUb0luZGV4KG91dENvb3JkcywgcmVzdWx0UmFuaywgcmVzdWx0U3RyaWRlcyk7XG4gICAgICAgIHJlc1ZhbHNbb3V0SW5kZXhdID0geFZhbHNbaV07XG4gICAgfVxuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC53cml0ZShyZXNWYWxzLCBvdXRTaGFwZSwgeC5kdHlwZSk7XG4gICAgcmV0dXJuIHsgZGF0YUlkOiBvdXRJZCwgc2hhcGU6IG91dFNoYXBlLCBkdHlwZTogeC5kdHlwZSB9O1xufVxuZXhwb3J0IGNvbnN0IHBhZFYyQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFBhZFYyLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBwYWRWMlxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBhZFYyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFBvdyB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X2ltcGwnO1xuaW1wb3J0IHsgYmluYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgcG93SW1wbCA9IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwoKGEsIGIpID0+IE1hdGgucG93KGEsIGIpKTtcbmV4cG9ydCBjb25zdCBwb3cgPSBiaW5hcnlLZXJuZWxGdW5jKFBvdywgcG93SW1wbCk7XG5leHBvcnQgY29uc3QgcG93Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFBvdyxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogcG93XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UG93LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBQcmVsdSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHsgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmNvbnN0IHByZWx1SW1wbCA9IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwoKHhWYWx1ZSwgYVZhbHVlKSA9PiB4VmFsdWUgPCAwID8gYVZhbHVlICogeFZhbHVlIDogeFZhbHVlKTtcbmV4cG9ydCBmdW5jdGlvbiBwcmVsdShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4LCBhbHBoYSB9ID0gaW5wdXRzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoW3gsIGFscGhhXSwgJ3ByZWx1Jyk7XG4gICAgY29uc3QgYVZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgYlZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KGFscGhhLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IFtyZXN1bHREYXRhLCByZXN1bHRTaGFwZV0gPSBwcmVsdUltcGwoeC5zaGFwZSwgYWxwaGEuc2hhcGUsIGFWYWxzLCBiVmFscywgeC5kdHlwZSk7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVzdWx0U2hhcGUsIHguZHR5cGUsIHJlc3VsdERhdGEpO1xufVxuZXhwb3J0IGNvbnN0IHByZWx1Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFByZWx1LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBwcmVsdSxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QcmVsdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIFByb2QsIHVwY2FzdFR5cGUsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7IHRyYW5zcG9zZSB9IGZyb20gJy4vVHJhbnNwb3NlJztcbmV4cG9ydCBmdW5jdGlvbiBwcm9kSW1wbCh4U2hhcGUsIHhEdHlwZSwgeFZhbHMsIHJlZHVjdGlvbkF4ZXMpIHtcbiAgICBjb25zdCBbb3V0U2hhcGUsIHJlZHVjZVNoYXBlXSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKHhTaGFwZSwgcmVkdWN0aW9uQXhlcyk7XG4gICAgY29uc3Qgb3V0RHR5cGUgPSB1cGNhc3RUeXBlKHhEdHlwZSwgJ2ludDMyJyk7XG4gICAgY29uc3Qgb3V0VmFscyA9IHV0aWwubWFrZVplcm9zVHlwZWRBcnJheSh1dGlsLnNpemVGcm9tU2hhcGUob3V0U2hhcGUpLCBvdXREdHlwZSk7XG4gICAgY29uc3QgcmVkdWNlU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShyZWR1Y2VTaGFwZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRWYWxzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGkgKiByZWR1Y2VTaXplO1xuICAgICAgICBsZXQgcHJvZCA9IDE7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmVkdWNlU2l6ZTsgKytqKSB7XG4gICAgICAgICAgICBwcm9kICo9IHhWYWxzW29mZnNldCArIGpdO1xuICAgICAgICB9XG4gICAgICAgIG91dFZhbHNbaV0gPSBwcm9kO1xuICAgIH1cbiAgICByZXR1cm4geyBvdXRWYWxzLCBvdXRTaGFwZSwgb3V0RHR5cGUgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcm9kKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBheGlzLCBrZWVwRGltcyB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleCh4LCAncHJvZCcpO1xuICAgIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgYXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG4gICAgY29uc3QgcGVybXV0YXRpb24gPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKGF4ZXMsIHhSYW5rKTtcbiAgICBsZXQgcmVkdWN0aW9uQXhlcyA9IGF4ZXM7XG4gICAgbGV0IHBlcm11dGVkWCA9IHg7XG4gICAgY29uc3QgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MgPSBbXTtcbiAgICBpZiAocGVybXV0YXRpb24gIT0gbnVsbCkge1xuICAgICAgICBwZXJtdXRlZFggPSB0cmFuc3Bvc2UoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kLCBhdHRyczogeyBwZXJtOiBwZXJtdXRhdGlvbiB9IH0pO1xuICAgICAgICBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcy5wdXNoKHBlcm11dGVkWCk7XG4gICAgICAgIHJlZHVjdGlvbkF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0SW5uZXJNb3N0QXhlcyhyZWR1Y3Rpb25BeGVzLmxlbmd0aCwgeFJhbmspO1xuICAgIH1cbiAgICBjb25zdCB4VmFscyA9IGJhY2tlbmQuZGF0YS5nZXQocGVybXV0ZWRYLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHsgb3V0VmFscywgb3V0U2hhcGUsIG91dER0eXBlIH0gPSBwcm9kSW1wbChwZXJtdXRlZFguc2hhcGUsIHBlcm11dGVkWC5kdHlwZSwgeFZhbHMsIHJlZHVjdGlvbkF4ZXMpO1xuICAgIGxldCByZXN1bHRTaGFwZSA9IG91dFNoYXBlO1xuICAgIGlmIChrZWVwRGltcykge1xuICAgICAgICByZXN1bHRTaGFwZSA9IGJhY2tlbmRfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbShvdXRTaGFwZSwgYXhlcyk7XG4gICAgfVxuICAgIGludGVybWVkaWF0ZVRlbnNvckluZm9zLmZvckVhY2godCA9PiBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHQpKTtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhyZXN1bHRTaGFwZSwgb3V0RHR5cGUsIG91dFZhbHMpO1xufVxuZXhwb3J0IGNvbnN0IHByb2RDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUHJvZCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogcHJvZFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVByb2QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUmFuZ2UgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgcmFuZ2VJbXBsIH0gZnJvbSAnLi9SYW5nZV9pbXBsJztcbmV4cG9ydCBmdW5jdGlvbiByYW5nZShhcmdzKSB7XG4gICAgY29uc3QgeyBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHN0YXJ0LCBzdG9wLCBkdHlwZSwgc3RlcCB9ID0gYXR0cnM7XG4gICAgY29uc3QgdmFsdWVzID0gcmFuZ2VJbXBsKHN0YXJ0LCBzdG9wLCBzdGVwLCBkdHlwZSk7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW3ZhbHVlcy5sZW5ndGhdLCBkdHlwZSwgdmFsdWVzKTtcbn1cbmV4cG9ydCBjb25zdCByYW5nZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBSYW5nZSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogcmFuZ2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SYW5nZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiByYW5nZUltcGwoc3RhcnQsIHN0b3AsIHN0ZXAsIGR0eXBlKSB7XG4gICAgY29uc3Qgc2FtZVN0YXJ0U3RvcCA9IHN0YXJ0ID09PSBzdG9wO1xuICAgIGNvbnN0IGluY3JlYXNpbmdSYW5nZU5lZ2F0aXZlU3RlcCA9IHN0YXJ0IDwgc3RvcCAmJiBzdGVwIDwgMDtcbiAgICBjb25zdCBkZWNyZWFzaW5nUmFuZ2VQb3NpdGl2ZVN0ZXAgPSBzdG9wIDwgc3RhcnQgJiYgc3RlcCA+IDE7XG4gICAgaWYgKHNhbWVTdGFydFN0b3AgfHwgaW5jcmVhc2luZ1JhbmdlTmVnYXRpdmVTdGVwIHx8XG4gICAgICAgIGRlY3JlYXNpbmdSYW5nZVBvc2l0aXZlU3RlcCkge1xuICAgICAgICByZXR1cm4gdXRpbC5tYWtlWmVyb3NUeXBlZEFycmF5KDAsIGR0eXBlKTtcbiAgICB9XG4gICAgY29uc3QgbnVtRWxlbWVudHMgPSBNYXRoLmFicyhNYXRoLmNlaWwoKHN0b3AgLSBzdGFydCkgLyBzdGVwKSk7XG4gICAgY29uc3QgdmFsdWVzID0gdXRpbC5tYWtlWmVyb3NUeXBlZEFycmF5KG51bUVsZW1lbnRzLCBkdHlwZSk7XG4gICAgaWYgKHN0b3AgPCBzdGFydCAmJiBzdGVwID09PSAxKSB7XG4gICAgICAgIC8vIEF1dG8gYWRqdXN0IHRoZSBzdGVwJ3Mgc2lnbiBpZiBpdCBoYXNuJ3QgYmVlbiBzZXRcbiAgICAgICAgLy8gKG9yIHdhcyBzZXQgdG8gMSlcbiAgICAgICAgc3RlcCA9IC0xO1xuICAgIH1cbiAgICB2YWx1ZXNbMF0gPSBzdGFydDtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YWx1ZXNbaV0gPSB2YWx1ZXNbaSAtIDFdICsgc3RlcDtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlcztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJhbmdlX2ltcGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUmVhbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgZnVuY3Rpb24gcmVhbChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBpbnB1dCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHJlYWwgPSBiYWNrZW5kLmRhdGEuZ2V0KGlucHV0LmRhdGFJZCkuY29tcGxleFRlbnNvckluZm9zLnJlYWw7XG4gICAgY29uc3QgcmVhbFZhbCA9IGJhY2tlbmQuZGF0YS5nZXQocmVhbC5kYXRhSWQpLnZhbHVlcztcbiAgICAvLyBXaGVuIGNvbXBsZXggdGVuc29yIGlzIGRpc3Bvc2VkLCBpdHMgdW5kZXJseWluZyBwYXJ0cyB3aWxsIGJlIGRpc3Bvc2VkIHRvby5cbiAgICAvLyBNYWtlIG5ldyB0ZW5zb3Igb3V0IG9mIHRoZSByZWFsIHZhbHVlIG9mIHRoZSBjb21wbGV4LiBUaGlzIG1ha2VzIHN1cmUgdGhlXG4gICAgLy8gdmFsdWUgaXMgc3RpbGwgYWNjZXNzaWJsZSBldmVuIGlmIGNvbXBsZXggdGVuc29yIGlzIGRpc3Bvc2VkLlxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHJlYWwuc2hhcGUsIHJlYWwuZHR5cGUsIHJlYWxWYWwpO1xufVxuZXhwb3J0IGNvbnN0IHJlYWxDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUmVhbCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogcmVhbFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlYWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUmVhbERpdiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X2ltcGwnO1xuaW1wb3J0IHsgYmluYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgcmVhbERpdkltcGwgPSBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsKChhLCBiKSA9PiBhIC8gYik7XG5leHBvcnQgY29uc3QgZGl2ID0gYmluYXJ5S2VybmVsRnVuYyhSZWFsRGl2LCByZWFsRGl2SW1wbCk7XG5leHBvcnQgY29uc3QgcmVhbERpdkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBSZWFsRGl2LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBkaXZcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWFsRGl2LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBSZWNpcHJvY2FsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCByZWNpcHJvY2FsID0gdW5hcnlLZXJuZWxGdW5jKFJlY2lwcm9jYWwsICh4aSkgPT4gMSAvIHhpKTtcbmV4cG9ydCBjb25zdCByZWNpcHJvY2FsQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJlY2lwcm9jYWwsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHJlY2lwcm9jYWwsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVjaXByb2NhbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUmVsdSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgcmVsdSA9IHVuYXJ5S2VybmVsRnVuYyhSZWx1LCAoeGkpID0+IE1hdGgubWF4KDAsIHhpKSk7XG5leHBvcnQgY29uc3QgcmVsdUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBSZWx1LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiByZWx1LFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlbHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFJlbHU2IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCByZWx1NiA9IHVuYXJ5S2VybmVsRnVuYyhSZWx1NiwgKHhpKSA9PiBNYXRoLm1pbihNYXRoLm1heCgwLCB4aSksIDYpKTtcbmV4cG9ydCBjb25zdCByZWx1NkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBSZWx1NixcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogcmVsdTYsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVsdTYuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUmVzaGFwZSwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgZnVuY3Rpb24gcmVzaGFwZShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgc2hhcGUgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHhTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHguc2hhcGUpO1xuICAgIGNvbnN0ICRzaGFwZSA9IHV0aWwuaW5mZXJGcm9tSW1wbGljaXRTaGFwZShzaGFwZSwgeFNpemUpO1xuICAgIGNvbnN0ICR4U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSgkc2hhcGUpO1xuICAgIHV0aWwuYXNzZXJ0KHhTaXplID09PSAkeFNpemUsICgpID0+IGBUaGUgbmV3IHNoYXBlICgkeyRzaGFwZX0pIGhhcyAkeyR4U2l6ZX0gZWxlbWVudHMgYW5kIHRoZSBvbGQgYCArXG4gICAgICAgIGBzaGFwZSAoJHt4LnNoYXBlfSkgaGFzICR7eFNpemV9IGVsZW1lbnRzLiBUaGUgbmV3IHNoYXBlIGFuZCBvbGQgYCArXG4gICAgICAgIGBzaGFwZSBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGVsZW1lbnRzLmApO1xuICAgIGJhY2tlbmQuaW5jUmVmKHguZGF0YUlkKTtcbiAgICBjb25zdCB4RGF0YSA9IGJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpO1xuICAgIGlmICh4RGF0YS5jb21wbGV4VGVuc29ySW5mb3MgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCByZWFsID0geERhdGEuY29tcGxleFRlbnNvckluZm9zLnJlYWw7XG4gICAgICAgIGNvbnN0IGltYWcgPSB4RGF0YS5jb21wbGV4VGVuc29ySW5mb3MuaW1hZztcbiAgICAgICAgcmVhbC5zaGFwZSA9ICRzaGFwZTtcbiAgICAgICAgaW1hZy5zaGFwZSA9ICRzaGFwZTtcbiAgICB9XG4gICAgcmV0dXJuIHsgZGF0YUlkOiB4LmRhdGFJZCwgc2hhcGU6ICRzaGFwZSwgZHR5cGU6IHguZHR5cGUgfTtcbn1cbmV4cG9ydCBjb25zdCByZXNoYXBlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJlc2hhcGUsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHJlc2hhcGVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZXNoYXBlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFJlc2l6ZUJpbGluZWFyLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5leHBvcnQgZnVuY3Rpb24gcmVzaXplQmlsaW5lYXIoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGltYWdlcyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYWxpZ25Db3JuZXJzLCBoYWxmUGl4ZWxDZW50ZXJzLCBzaXplIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KGltYWdlcywgJ3Jlc2l6ZUJpbGluZWFyJyk7XG4gICAgY29uc3QgaW1hZ2VzU3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoaW1hZ2VzLnNoYXBlKTtcbiAgICBjb25zdCBbbmV3SGVpZ2h0LCBuZXdXaWR0aF0gPSBzaXplO1xuICAgIGNvbnN0IFtiYXRjaCwgb2xkSGVpZ2h0LCBvbGRXaWR0aCwgbnVtQ2hhbm5lbHNdID0gaW1hZ2VzLnNoYXBlO1xuICAgIGNvbnN0IHhWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGltYWdlcy5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgRmxvYXQzMkFycmF5KHV0aWwuc2l6ZUZyb21TaGFwZShbYmF0Y2gsIG5ld0hlaWdodCwgbmV3V2lkdGgsIG51bUNoYW5uZWxzXSkpO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUlucHV0U2l6ZSA9IFtcbiAgICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdIZWlnaHQgPiAxKSA/IG9sZEhlaWdodCAtIDEgOiBvbGRIZWlnaHQsXG4gICAgICAgIChhbGlnbkNvcm5lcnMgJiYgbmV3V2lkdGggPiAxKSA/IG9sZFdpZHRoIC0gMSA6IG9sZFdpZHRoXG4gICAgXTtcbiAgICBjb25zdCBlZmZlY3RpdmVPdXRwdXRTaXplID0gW1xuICAgICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld0hlaWdodCA+IDEpID8gbmV3SGVpZ2h0IC0gMSA6IG5ld0hlaWdodCxcbiAgICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdXaWR0aCA+IDEpID8gbmV3V2lkdGggLSAxIDogbmV3V2lkdGhcbiAgICBdO1xuICAgIGxldCBvdXRwdXRJZHggPSAwO1xuICAgIGNvbnN0IGVmZmVjdGl2ZVJvd1NpemVSYXRpbyA9IGVmZmVjdGl2ZUlucHV0U2l6ZVswXSAvIGVmZmVjdGl2ZU91dHB1dFNpemVbMF07XG4gICAgY29uc3QgZWZmZWN0aXZlQ29sU2l6ZVJhdGlvID0gZWZmZWN0aXZlSW5wdXRTaXplWzFdIC8gZWZmZWN0aXZlT3V0cHV0U2l6ZVsxXTtcbiAgICBmb3IgKGxldCBiID0gMDsgYiA8IGJhdGNoOyBiKyspIHtcbiAgICAgICAgZm9yIChsZXQgciA9IDA7IHIgPCBuZXdIZWlnaHQ7IHIrKykge1xuICAgICAgICAgICAgbGV0IHNvdXJjZUZyYWNSb3c7XG4gICAgICAgICAgICBpZiAoaGFsZlBpeGVsQ2VudGVycykge1xuICAgICAgICAgICAgICAgIHNvdXJjZUZyYWNSb3cgPSBlZmZlY3RpdmVSb3dTaXplUmF0aW8gKiAociArIDAuNSkgLSAwLjU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VGcmFjUm93ID0gZWZmZWN0aXZlUm93U2l6ZVJhdGlvICogcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZVJvd0Zsb29yID0gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcihzb3VyY2VGcmFjUm93KSk7XG4gICAgICAgICAgICBjb25zdCByb3dGcmFjID0gc291cmNlRnJhY1JvdyAtIHNvdXJjZVJvd0Zsb29yO1xuICAgICAgICAgICAgY29uc3Qgc291cmNlUm93Q2VpbCA9IE1hdGgubWluKG9sZEhlaWdodCAtIDEsIE1hdGguY2VpbChzb3VyY2VGcmFjUm93KSk7XG4gICAgICAgICAgICBjb25zdCB0b3BSb3dPZmZzZXQgPSBiICogaW1hZ2VzU3RyaWRlc1swXSArIHNvdXJjZVJvd0Zsb29yICogaW1hZ2VzU3RyaWRlc1sxXTtcbiAgICAgICAgICAgIGNvbnN0IGJvdFJvd09mZnNldCA9IGIgKiBpbWFnZXNTdHJpZGVzWzBdICsgc291cmNlUm93Q2VpbCAqIGltYWdlc1N0cmlkZXNbMV07XG4gICAgICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IG5ld1dpZHRoOyBjKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgc291cmNlRnJhY0NvbDtcbiAgICAgICAgICAgICAgICBpZiAoaGFsZlBpeGVsQ2VudGVycykge1xuICAgICAgICAgICAgICAgICAgICBzb3VyY2VGcmFjQ29sID0gZWZmZWN0aXZlQ29sU2l6ZVJhdGlvICogKGMgKyAwLjUpIC0gMC41O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlRnJhY0NvbCA9IGVmZmVjdGl2ZUNvbFNpemVSYXRpbyAqIGM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNvbEZsb29yID0gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcihzb3VyY2VGcmFjQ29sKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sRnJhYyA9IHNvdXJjZUZyYWNDb2wgLSBzb3VyY2VDb2xGbG9vcjtcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VDb2xDZWlsID0gTWF0aC5taW4ob2xkV2lkdGggLSAxLCBNYXRoLmNlaWwoc291cmNlRnJhY0NvbCkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvcExlZnRPZmZlc3QgPSB0b3BSb3dPZmZzZXQgKyBzb3VyY2VDb2xGbG9vciAqIGltYWdlc1N0cmlkZXNbMl07XG4gICAgICAgICAgICAgICAgY29uc3QgYm90TGVmdE9mZnNldCA9IGJvdFJvd09mZnNldCArIHNvdXJjZUNvbEZsb29yICogaW1hZ2VzU3RyaWRlc1syXTtcbiAgICAgICAgICAgICAgICBjb25zdCB0b3BSaWdodE9mZnNldCA9IHRvcFJvd09mZnNldCArIHNvdXJjZUNvbENlaWwgKiBpbWFnZXNTdHJpZGVzWzJdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJvdFJpZ2h0T2ZmZXN0ID0gYm90Um93T2Zmc2V0ICsgc291cmNlQ29sQ2VpbCAqIGltYWdlc1N0cmlkZXNbMl07XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZCA9IDA7IGQgPCBudW1DaGFubmVsczsgZCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEJlZ2luIHNoYWRlci5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgZnJhY3Rpb25hbCBpbmRleCBvZiB0aGUgc291cmNlLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0b3BMZWZ0ID0geFZhbHVlc1t0b3BMZWZ0T2ZmZXN0ICsgZF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvdHRvbUxlZnQgPSB4VmFsdWVzW2JvdExlZnRPZmZzZXQgKyBkXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9wUmlnaHQgPSB4VmFsdWVzW3RvcFJpZ2h0T2Zmc2V0ICsgZF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvdHRvbVJpZ2h0ID0geFZhbHVlc1tib3RSaWdodE9mZmVzdCArIGRdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0b3AgPSB0b3BMZWZ0ICsgKHRvcFJpZ2h0IC0gdG9wTGVmdCkgKiBjb2xGcmFjO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBib3R0b20gPSBib3R0b21MZWZ0ICsgKGJvdHRvbVJpZ2h0IC0gYm90dG9tTGVmdCkgKiBjb2xGcmFjO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHRvcCArIChib3R0b20gLSB0b3ApICogcm93RnJhYztcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W291dHB1dElkeCsrXSA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbYmF0Y2gsIG5ld0hlaWdodCwgbmV3V2lkdGgsIG51bUNoYW5uZWxzXSwgJ2Zsb2F0MzInLCByZXN1bHQpO1xufVxuZXhwb3J0IGNvbnN0IHJlc2l6ZUJpbGluZWFyQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJlc2l6ZUJpbGluZWFyLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiByZXNpemVCaWxpbmVhclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlc2l6ZUJpbGluZWFyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFJlc2l6ZUJpbGluZWFyR3JhZCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2l6ZUJpbGluZWFyR3JhZChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW1hZ2VzLCBkeSB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYWxpZ25Db3JuZXJzIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KFtkeSwgaW1hZ2VzXSwgJ3Jlc2l6ZUJpbGluZWFyR3JhZCcpO1xuICAgIGNvbnN0IGltYWdlc1N0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGltYWdlcy5zaGFwZSk7XG4gICAgY29uc3QgW2JhdGNoLCB4SGVpZ2h0LCB4V2lkdGgsIGRlcHRoXSA9IGltYWdlcy5zaGFwZTtcbiAgICBjb25zdCBbLCB5SGVpZ2h0LCB5V2lkdGhdID0gZHkuc2hhcGU7XG4gICAgY29uc3Qgb3V0cHV0ID0gbmV3IEZsb2F0MzJBcnJheShiYXRjaCAqIHhIZWlnaHQgKiB4V2lkdGggKiBkZXB0aCk7XG4gICAgLy8gSW4gdGhlIGJhY2t3YXJkcyBwYXNzLCB3ZSB3YW50IHRvIGZpbmQgdGhlIHBpeGVscyB0aGF0IHdlcmUgZ2VuZXJhdGVkXG4gICAgLy8gZm9yIGVhY2ggcGl4ZWwgaW4gdGhlIGlucHV0IGltYWdlIHRoZSBmb3J3YXJkIHBhc3MgYW5kIGFkZCB0aGVcbiAgICAvLyBjb3JyZXNwb25kaW5nIGNvZWZmaWNpZW50IGZyb20gZHkgdG8gdGhlIGdyYWRpZW50ICh3aXRoIHNvbWVcbiAgICAvLyBpbnRlcnBvbGF0aW9uKS5cbiAgICBjb25zdCBlZmZlY3RpdmVYU2l6ZSA9IFtcbiAgICAgICAgKGFsaWduQ29ybmVycyAmJiB5SGVpZ2h0ID4gMSkgPyB4SGVpZ2h0IC0gMSA6IHhIZWlnaHQsXG4gICAgICAgIChhbGlnbkNvcm5lcnMgJiYgeVdpZHRoID4gMSkgPyB4V2lkdGggLSAxIDogeFdpZHRoXG4gICAgXTtcbiAgICBjb25zdCBlZmZlY3RpdmVZU2l6ZSA9IFtcbiAgICAgICAgKGFsaWduQ29ybmVycyAmJiB5SGVpZ2h0ID4gMSkgPyB5SGVpZ2h0IC0gMSA6IHlIZWlnaHQsXG4gICAgICAgIChhbGlnbkNvcm5lcnMgJiYgeVdpZHRoID4gMSkgPyB5V2lkdGggLSAxIDogeVdpZHRoXG4gICAgXTtcbiAgICBjb25zdCBoZWlnaHRTY2FsZSA9IGVmZmVjdGl2ZVhTaXplWzBdIC8gZWZmZWN0aXZlWVNpemVbMF07XG4gICAgY29uc3Qgd2lkdGhTY2FsZSA9IGVmZmVjdGl2ZVhTaXplWzFdIC8gZWZmZWN0aXZlWVNpemVbMV07XG4gICAgLy8gUmVmZXJlbmNlIGltcGxlbWVudGF0aW9uXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmZsb3cvYmxvYi8zMDM5Mzc1Yzg2YTViYmM5NjEwYzc3MjVkY2FhOTVkNjM1Zjg3YmEyL3RlbnNvcmZsb3cvY29yZS9rZXJuZWxzL3Jlc2l6ZV9iaWxpbmVhcl9vcC5jYyNMMjc1XG4gICAgY29uc3QgZHlWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGR5LmRhdGFJZCkudmFsdWVzO1xuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIGZvciAobGV0IGIgPSAwOyBiIDwgYmF0Y2g7IGIrKykge1xuICAgICAgICBjb25zdCBiT2Zmc2V0ID0gYiAqIGltYWdlc1N0cmlkZXNbMF07XG4gICAgICAgIGZvciAobGV0IHIgPSAwOyByIDwgeUhlaWdodDsgcisrKSB7XG4gICAgICAgICAgICBjb25zdCBkeFIgPSByICogaGVpZ2h0U2NhbGU7XG4gICAgICAgICAgICBjb25zdCB0b3BEeFJJbmRleCA9IE1hdGguZmxvb3IoZHhSKTtcbiAgICAgICAgICAgIGNvbnN0IGJvdHRvbUR4UkluZGV4ID0gTWF0aC5taW4oTWF0aC5jZWlsKGR4UiksIHhIZWlnaHQgLSAxKTtcbiAgICAgICAgICAgIGNvbnN0IHRvcER4Uk9mZnNldCA9IGJPZmZzZXQgKyB0b3BEeFJJbmRleCAqIGltYWdlc1N0cmlkZXNbMV07XG4gICAgICAgICAgICBjb25zdCBib3R0b21EeFJPZmZzZXQgPSBiT2Zmc2V0ICsgYm90dG9tRHhSSW5kZXggKiBpbWFnZXNTdHJpZGVzWzFdO1xuICAgICAgICAgICAgY29uc3QgZHhSTGVycCA9IGR4UiAtIHRvcER4UkluZGV4O1xuICAgICAgICAgICAgY29uc3QgaW52ZXJzZUR4UkxlcnAgPSAxLjAgLSBkeFJMZXJwO1xuICAgICAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCB5V2lkdGg7IGMrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGR4QyA9IGMgKiB3aWR0aFNjYWxlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxlZnREeENJbmRleCA9IE1hdGguZmxvb3IoZHhDKTtcbiAgICAgICAgICAgICAgICBjb25zdCByaWdodER4Q0luZGV4ID0gTWF0aC5taW4oTWF0aC5jZWlsKGR4QyksIHhXaWR0aCAtIDEpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGR4Q0xlcnAgPSBkeEMgLSBsZWZ0RHhDSW5kZXg7XG4gICAgICAgICAgICAgICAgY29uc3QgaW52ZXJzZUR4Q0xlcnAgPSAxLjAgLSBkeENMZXJwO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvcExlZnRSQ09mZnNldCA9IHRvcER4Uk9mZnNldCArIGxlZnREeENJbmRleCAqIGltYWdlc1N0cmlkZXNbMl07XG4gICAgICAgICAgICAgICAgY29uc3QgdG9wUmlnaHRSQ09mZnNldCA9IHRvcER4Uk9mZnNldCArIHJpZ2h0RHhDSW5kZXggKiBpbWFnZXNTdHJpZGVzWzJdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJvdHRvbUxlZnRSQ09mZnNldCA9IGJvdHRvbUR4Uk9mZnNldCArIGxlZnREeENJbmRleCAqIGltYWdlc1N0cmlkZXNbMl07XG4gICAgICAgICAgICAgICAgY29uc3QgYm90dG9tUmlnaHRSQ09mZnNldCA9IGJvdHRvbUR4Uk9mZnNldCArIHJpZ2h0RHhDSW5kZXggKiBpbWFnZXNTdHJpZGVzWzJdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGludmVyc2VEeFJMZXJwVGltZXNJbnZlcnNlRHhDTGVycCA9IGludmVyc2VEeFJMZXJwICogaW52ZXJzZUR4Q0xlcnA7XG4gICAgICAgICAgICAgICAgY29uc3QgaW52ZXJzZUR4UkxlcnBUaW1lc0R4Q0xlcnAgPSBpbnZlcnNlRHhSTGVycCAqIGR4Q0xlcnA7XG4gICAgICAgICAgICAgICAgY29uc3QgZHhSTGVycFRpbWVzSW52ZXJzZUR4Q0xlcnAgPSBkeFJMZXJwICogaW52ZXJzZUR4Q0xlcnA7XG4gICAgICAgICAgICAgICAgY29uc3QgZHhSTGVycFRpbWVzRHhDTGVycCA9IGR4UkxlcnAgKiBkeENMZXJwO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGQgPSAwOyBkIDwgZGVwdGg7IGQrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkeVZhbCA9IGR5VmFsdWVzW29mZnNldCsrXTtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W3RvcExlZnRSQ09mZnNldCArIGRdICs9XG4gICAgICAgICAgICAgICAgICAgICAgICBkeVZhbCAqIGludmVyc2VEeFJMZXJwVGltZXNJbnZlcnNlRHhDTGVycDtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W3RvcFJpZ2h0UkNPZmZzZXQgKyBkXSArPSBkeVZhbCAqIGludmVyc2VEeFJMZXJwVGltZXNEeENMZXJwO1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRbYm90dG9tTGVmdFJDT2Zmc2V0ICsgZF0gKz0gZHlWYWwgKiBkeFJMZXJwVGltZXNJbnZlcnNlRHhDTGVycDtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W2JvdHRvbVJpZ2h0UkNPZmZzZXQgKyBkXSArPSBkeVZhbCAqIGR4UkxlcnBUaW1lc0R4Q0xlcnA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtiYXRjaCwgeFdpZHRoLCB4SGVpZ2h0LCBkZXB0aF0sICdmbG9hdDMyJywgb3V0cHV0KTtcbn1cbmV4cG9ydCBjb25zdCByZXNpemVCaWxpbmVhckdyYWRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUmVzaXplQmlsaW5lYXJHcmFkLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiByZXNpemVCaWxpbmVhckdyYWRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZXNpemVCaWxpbmVhckdyYWQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUmVzaXplTmVhcmVzdE5laWdoYm9yLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5leHBvcnQgZnVuY3Rpb24gcmVzaXplTmVhcmVzdE5laWdoYm9yKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBpbWFnZXMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGFsaWduQ29ybmVycywgaGFsZlBpeGVsQ2VudGVycywgc2l6ZSB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChpbWFnZXMsICdyZXNpemVOZWFyZXN0TmVpZ2hib3InKTtcbiAgICBjb25zdCBpbWFnZXNTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhpbWFnZXMuc2hhcGUpO1xuICAgIGNvbnN0IFtuZXdIZWlnaHQsIG5ld1dpZHRoXSA9IHNpemU7XG4gICAgY29uc3QgW2JhdGNoLCBvbGRIZWlnaHQsIG9sZFdpZHRoLCBudW1DaGFubmVsc10gPSBpbWFnZXMuc2hhcGU7XG4gICAgY29uc3QgeFZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoaW1hZ2VzLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IG91dHB1dCA9IG5ldyBGbG9hdDMyQXJyYXkoYmF0Y2ggKiBuZXdIZWlnaHQgKiBuZXdXaWR0aCAqIG51bUNoYW5uZWxzKTtcbiAgICBjb25zdCBlZmZlY3RpdmVJbnB1dFNpemUgPSBbXG4gICAgICAgIChhbGlnbkNvcm5lcnMgJiYgbmV3SGVpZ2h0ID4gMSkgPyBvbGRIZWlnaHQgLSAxIDogb2xkSGVpZ2h0LFxuICAgICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld1dpZHRoID4gMSkgPyBvbGRXaWR0aCAtIDEgOiBvbGRXaWR0aFxuICAgIF07XG4gICAgY29uc3QgZWZmZWN0aXZlT3V0cHV0U2l6ZSA9IFtcbiAgICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdIZWlnaHQgPiAxKSA/IG5ld0hlaWdodCAtIDEgOiBuZXdIZWlnaHQsXG4gICAgICAgIChhbGlnbkNvcm5lcnMgJiYgbmV3V2lkdGggPiAxKSA/IG5ld1dpZHRoIC0gMSA6IG5ld1dpZHRoXG4gICAgXTtcbiAgICBjb25zdCBlZmZlY3RpdmVSb3dTaXplUmF0aW8gPSBlZmZlY3RpdmVJbnB1dFNpemVbMF0gLyBlZmZlY3RpdmVPdXRwdXRTaXplWzBdO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUNvbFNpemVSYXRpbyA9IGVmZmVjdGl2ZUlucHV0U2l6ZVsxXSAvIGVmZmVjdGl2ZU91dHB1dFNpemVbMV07XG4gICAgbGV0IG91dHB1dE9mZnNldCA9IDA7XG4gICAgZm9yIChsZXQgYiA9IDA7IGIgPCBiYXRjaDsgYisrKSB7XG4gICAgICAgIGNvbnN0IGJhdGNoT2Zmc2V0ID0gYiAqIGltYWdlc1N0cmlkZXNbMF07XG4gICAgICAgIGZvciAobGV0IHIgPSAwOyByIDwgbmV3SGVpZ2h0OyByKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUZyYWNSb3cgPSBoYWxmUGl4ZWxDZW50ZXJzID9cbiAgICAgICAgICAgICAgICBlZmZlY3RpdmVSb3dTaXplUmF0aW8gKiAociArIDAuNSkgOlxuICAgICAgICAgICAgICAgIGVmZmVjdGl2ZVJvd1NpemVSYXRpbyAqIHI7XG4gICAgICAgICAgICBsZXQgc291cmNlTmVhcmVzdFJvdyA9IE1hdGgubWluKG9sZEhlaWdodCAtIDEsIGFsaWduQ29ybmVycyA/IE1hdGgucm91bmQoc291cmNlRnJhY1JvdykgOiBNYXRoLmZsb29yKHNvdXJjZUZyYWNSb3cpKTtcbiAgICAgICAgICAgIGlmIChoYWxmUGl4ZWxDZW50ZXJzKSB7XG4gICAgICAgICAgICAgICAgc291cmNlTmVhcmVzdFJvdyA9IE1hdGgubWF4KDAsIHNvdXJjZU5lYXJlc3RSb3cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgcm93T2Zmc2V0ID0gYmF0Y2hPZmZzZXQgKyBzb3VyY2VOZWFyZXN0Um93ICogaW1hZ2VzU3RyaWRlc1sxXTtcbiAgICAgICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgbmV3V2lkdGg7IGMrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUZyYWNDb2wgPSBoYWxmUGl4ZWxDZW50ZXJzID9cbiAgICAgICAgICAgICAgICAgICAgZWZmZWN0aXZlQ29sU2l6ZVJhdGlvICogKGMgKyAwLjUpIDpcbiAgICAgICAgICAgICAgICAgICAgZWZmZWN0aXZlQ29sU2l6ZVJhdGlvICogYztcbiAgICAgICAgICAgICAgICBsZXQgc291cmNlTmVhcmVzdENvbCA9IE1hdGgubWluKG9sZFdpZHRoIC0gMSwgYWxpZ25Db3JuZXJzID8gTWF0aC5yb3VuZChzb3VyY2VGcmFjQ29sKSA6XG4gICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3Ioc291cmNlRnJhY0NvbCkpO1xuICAgICAgICAgICAgICAgIGlmIChoYWxmUGl4ZWxDZW50ZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZU5lYXJlc3RDb2wgPSBNYXRoLm1heCgwLCBzb3VyY2VOZWFyZXN0Q29sKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgY29sT2Zmc2V0ID0gcm93T2Zmc2V0ICsgc291cmNlTmVhcmVzdENvbCAqIGltYWdlc1N0cmlkZXNbMl07XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZCA9IDA7IGQgPCBudW1DaGFubmVsczsgZCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEJlZ2luIHNoYWRlci5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgZnJhY3Rpb25hbCBpbmRleCBvZiB0aGUgc291cmNlLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdWYWwgPSB4VmFsdWVzW2NvbE9mZnNldCArIGRdO1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRbb3V0cHV0T2Zmc2V0KytdID0gbmV3VmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbYmF0Y2gsIG5ld0hlaWdodCwgbmV3V2lkdGgsIG51bUNoYW5uZWxzXSwgaW1hZ2VzLmR0eXBlLCBvdXRwdXQpO1xufVxuZXhwb3J0IGNvbnN0IHJlc2l6ZU5lYXJlc3ROZWlnaGJvckNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBSZXNpemVOZWFyZXN0TmVpZ2hib3IsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHJlc2l6ZU5lYXJlc3ROZWlnaGJvclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlc2l6ZU5lYXJlc3ROZWlnaGJvci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBSZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5leHBvcnQgZnVuY3Rpb24gcmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW1hZ2VzLCBkeSB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYWxpZ25Db3JuZXJzIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KFtkeSwgaW1hZ2VzXSwgJ3Jlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWQnKTtcbiAgICBjb25zdCBpbWFnZXNTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhpbWFnZXMuc2hhcGUpO1xuICAgIGNvbnN0IGR5U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoZHkuc2hhcGUpO1xuICAgIGNvbnN0IFtiYXRjaCwgeEhlaWdodCwgeFdpZHRoLCBkZXB0aF0gPSBpbWFnZXMuc2hhcGU7XG4gICAgY29uc3QgWywgeUhlaWdodCwgeVdpZHRoXSA9IGR5LnNoYXBlO1xuICAgIGNvbnN0IG91dHB1dCA9IG5ldyBGbG9hdDMyQXJyYXkoYmF0Y2ggKiB4SGVpZ2h0ICogeFdpZHRoICogZGVwdGgpO1xuICAgIGNvbnN0IGR5VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldChkeS5kYXRhSWQpLnZhbHVlcztcbiAgICAvLyBJbiB0aGUgYmFja3dhcmRzIHBhc3MsIHdlIHdhbnQgdG8gZmluZCB0aGUgcGl4ZWxzIHRoYXQgd2VyZSBnZW5lcmF0ZWRcbiAgICAvLyBmb3IgZWFjaCBwaXhlbCBpbiB0aGUgaW5wdXQgaW1hZ2UgdGhlIGZvcndhcmQgcGFzc1xuICAgIGNvbnN0IGVmZmVjdGl2ZVhTaXplID0gW1xuICAgICAgICAoYWxpZ25Db3JuZXJzICYmIHlIZWlnaHQgPiAxKSA/IHhIZWlnaHQgLSAxIDogeEhlaWdodCxcbiAgICAgICAgKGFsaWduQ29ybmVycyAmJiB5V2lkdGggPiAxKSA/IHhXaWR0aCAtIDEgOiB4V2lkdGhcbiAgICBdO1xuICAgIGNvbnN0IGVmZmVjdGl2ZVlTaXplID0gW1xuICAgICAgICAoYWxpZ25Db3JuZXJzICYmIHlIZWlnaHQgPiAxKSA/IHlIZWlnaHQgLSAxIDogeUhlaWdodCxcbiAgICAgICAgKGFsaWduQ29ybmVycyAmJiB5V2lkdGggPiAxKSA/IHlXaWR0aCAtIDEgOiB5V2lkdGhcbiAgICBdO1xuICAgIGNvbnN0IGhlaWdodFNjYWxlID0gZWZmZWN0aXZlWFNpemVbMF0gLyBlZmZlY3RpdmVZU2l6ZVswXTtcbiAgICBjb25zdCB3aWR0aFNjYWxlID0gZWZmZWN0aXZlWFNpemVbMV0gLyBlZmZlY3RpdmVZU2l6ZVsxXTtcbiAgICBjb25zdCBpbnZIZWlnaHRTY2FsZSA9IDEgLyBoZWlnaHRTY2FsZTtcbiAgICBjb25zdCBpbnZXaWR0aFNjYWxlID0gMSAvIHdpZHRoU2NhbGU7XG4gICAgLy8gVGhpcyBkZWZpbmVzIHRoZSBzaXplIG9mIHRoZSB3aW5kb3cgb2YgdmFsdWVzIGFyb3VuZCBhIHBhcnRpY3VsYXJcbiAgICAvLyBpbmRleCBpbiBkeSB0aGF0IHdlIHdhbnQgdG8gc2VhcmNoIGZvciBjb250cmlidXRpb25zIHRvIGR4LlxuICAgIGNvbnN0IHdpbkhlaWdodCA9IChNYXRoLmNlaWwoaW52SGVpZ2h0U2NhbGUpICogMikgKyAyO1xuICAgIGNvbnN0IHdpbldpZHRoID0gKE1hdGguY2VpbChpbnZXaWR0aFNjYWxlKSAqIDIpICsgMjtcbiAgICAvLyBMb29wIG92ZXIgdGhlIG91dHB1dCBzcGFjZS5cbiAgICBmb3IgKGxldCBiID0gMDsgYiA8IGJhdGNoOyBiKyspIHtcbiAgICAgICAgY29uc3QgYmF0Y2hPZmZzZXQgPSBiICogaW1hZ2VzU3RyaWRlc1swXTtcbiAgICAgICAgZm9yIChsZXQgciA9IDA7IHIgPCB4SGVpZ2h0OyByKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHJvd09mZnNldCA9IGJhdGNoT2Zmc2V0ICsgciAqIGltYWdlc1N0cmlkZXNbMV07XG4gICAgICAgICAgICAvLyBDb21wdXRlIGJvdW5kcyBmb3Igd2hlcmUgaW4gZHkgd2Ugd2lsbCBsb29rXG4gICAgICAgICAgICBjb25zdCBzdGFydFJMZXJwID0gTWF0aC5mbG9vcihyICogaW52SGVpZ2h0U2NhbGUpO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnREeVIgPSBNYXRoLmZsb29yKHN0YXJ0UkxlcnAgLSAod2luSGVpZ2h0IC8gMikpO1xuICAgICAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCB4V2lkdGg7IGMrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbE9mZnNldCA9IHJvd09mZnNldCArIGMgKiBpbWFnZXNTdHJpZGVzWzJdO1xuICAgICAgICAgICAgICAgIC8vIENvbXB1dGUgYm91bmRzIGZvciB3aGVyZSBpbiBkeSB3ZSB3aWxsIGxvb2tcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydENMZXJwID0gTWF0aC5mbG9vcihjICogaW52V2lkdGhTY2FsZSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnREeUMgPSBNYXRoLmZsb29yKHN0YXJ0Q0xlcnAgLSAod2luV2lkdGggLyAyKSk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZCA9IDA7IGQgPCBkZXB0aDsgZCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhY2N1bSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIC8vIGxvb3Agb3ZlciBkeVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBkeVJJbmRleCA9IDA7IGR5UkluZGV4IDwgd2luSGVpZ2h0OyBkeVJJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkeVIgPSBkeVJJbmRleCArIHN0YXJ0RHlSO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gR3VhcmQgYWdhaW5zdCB0aGUgd2luZG93IGV4Y2VlZGluZyB0aGUgYm91bmRzIG9mIGR5XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHlSIDwgMCB8fCBkeVIgPj0geUhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHlST2Zmc2V0ID0gYmF0Y2hPZmZzZXQgKyBkeVIgKiBkeVN0cmlkZXNbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VGcmFjUm93ID0gZHlSICogaGVpZ2h0U2NhbGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VOZWFyZXN0Um93ID0gTWF0aC5taW4oeEhlaWdodCAtIDEsIGFsaWduQ29ybmVycyA/IE1hdGgucm91bmQoc291cmNlRnJhY1JvdykgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3Ioc291cmNlRnJhY1JvdykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIgIT09IHNvdXJjZU5lYXJlc3RSb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGR5Q0luZGV4ID0gMDsgZHlDSW5kZXggPCB3aW5XaWR0aDsgZHlDSW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGR5QyA9IGR5Q0luZGV4ICsgc3RhcnREeUM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR3VhcmQgYWdhaW5zdCB0aGUgd2luZG93IGV4Y2VlZGluZyB0aGUgYm91bmRzIG9mIGR5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR5QyA8IDAgfHwgZHlDID49IHlXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHlDT2Zmc2V0ID0gZHlST2Zmc2V0ICsgZHlDICogZHlTdHJpZGVzWzJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUZyYWNDb2wgPSBkeUMgKiB3aWR0aFNjYWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZU5lYXJlc3RDb2wgPSBNYXRoLm1pbih4V2lkdGggLSAxLCBhbGlnbkNvcm5lcnMgPyBNYXRoLnJvdW5kKHNvdXJjZUZyYWNDb2wpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihzb3VyY2VGcmFjQ29sKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT09IHNvdXJjZU5lYXJlc3RDb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjdW0gKz0gZHlWYWx1ZXNbZHlDT2Zmc2V0ICsgZF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtjb2xPZmZzZXQgKyBkXSA9IGFjY3VtO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhpbWFnZXMuc2hhcGUsIGltYWdlcy5kdHlwZSwgb3V0cHV0KTtcbn1cbmV4cG9ydCBjb25zdCByZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHJlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFJldmVyc2UsIFRlbnNvckJ1ZmZlciwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHsgaWRlbnRpdHkgfSBmcm9tICcuL0lkZW50aXR5JztcbmV4cG9ydCBmdW5jdGlvbiByZXZlcnNlKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBkaW1zIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KHgsICdyZXZlcnNlJyk7XG4gICAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCAkZGltcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oZGltcywgeC5zaGFwZSk7XG4gICAgaWYgKHhSYW5rID09PSAwKSB7XG4gICAgICAgIHJldHVybiBpZGVudGl0eSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQgfSk7XG4gICAgfVxuICAgIGNvbnN0IG91dEJ1ZiA9IG5ldyBUZW5zb3JCdWZmZXIoeC5zaGFwZSwgeC5kdHlwZSk7XG4gICAgY29uc3QgeEJ1ZiA9IGJhY2tlbmQuYnVmZmVyU3luYyh4KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dEJ1Zi5zaXplOyBpKyspIHtcbiAgICAgICAgY29uc3Qgb3V0TG9jID0gb3V0QnVmLmluZGV4VG9Mb2MoaSk7XG4gICAgICAgIGNvbnN0IGluTG9jID0gb3V0TG9jLnNsaWNlKCk7XG4gICAgICAgICRkaW1zLmZvckVhY2goZCA9PiBpbkxvY1tkXSA9IHguc2hhcGVbZF0gLSAxIC0gaW5Mb2NbZF0pO1xuICAgICAgICBvdXRCdWYuc2V0KHhCdWYuZ2V0KC4uLmluTG9jKSwgLi4ub3V0TG9jKTtcbiAgICB9XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0QnVmLnNoYXBlLCBvdXRCdWYuZHR5cGUsIG91dEJ1Zi52YWx1ZXMpO1xufVxuZXhwb3J0IGNvbnN0IHJldmVyc2VDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUmV2ZXJzZSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogcmV2ZXJzZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJldmVyc2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBSb3RhdGVXaXRoT2Zmc2V0LCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBjb25zdCByb3RhdGVXaXRoT2Zmc2V0Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJvdGF0ZVdpdGhPZmZzZXQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6ICh7IGlucHV0cywgYXR0cnMsIGJhY2tlbmQgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IGltYWdlIH0gPSBpbnB1dHM7XG4gICAgICAgIGNvbnN0IHsgcmFkaWFucywgZmlsbFZhbHVlLCBjZW50ZXIgfSA9IGF0dHJzO1xuICAgICAgICBjb25zdCBjcHVCYWNrZW5kID0gYmFja2VuZDtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gdXRpbC5nZXRUeXBlZEFycmF5RnJvbURUeXBlKGltYWdlLmR0eXBlLCB1dGlsLnNpemVGcm9tU2hhcGUoaW1hZ2Uuc2hhcGUpKTtcbiAgICAgICAgY29uc3QgW2JhdGNoLCBpbWFnZUhlaWdodCwgaW1hZ2VXaWR0aCwgbnVtQ2hhbm5lbHNdID0gaW1hZ2Uuc2hhcGU7XG4gICAgICAgIGNvbnN0IFtjZW50ZXJYLCBjZW50ZXJZXSA9IGJhY2tlbmRfdXRpbC5nZXRJbWFnZUNlbnRlcihjZW50ZXIsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoKTtcbiAgICAgICAgY29uc3QgZnVsbE9wYWNpdHlWYWx1ZSA9IDI1NTtcbiAgICAgICAgY29uc3Qgc2luRmFjdG9yID0gTWF0aC5zaW4ocmFkaWFucyk7XG4gICAgICAgIGNvbnN0IGNvc0ZhY3RvciA9IE1hdGguY29zKHJhZGlhbnMpO1xuICAgICAgICBjb25zdCBpbWFnZVZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KGltYWdlLmRhdGFJZCkudmFsdWVzO1xuICAgICAgICBmb3IgKGxldCBiYXRjaElkeCA9IDA7IGJhdGNoSWR4IDwgYmF0Y2g7IGJhdGNoSWR4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGJhdGNoT2Zmc2V0ID0gYmF0Y2hJZHggKiBpbWFnZVdpZHRoICogaW1hZ2VIZWlnaHQgKiBudW1DaGFubmVscztcbiAgICAgICAgICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGltYWdlSGVpZ2h0OyByb3crKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvd09mZnNldCA9IHJvdyAqIChpbWFnZVdpZHRoICogbnVtQ2hhbm5lbHMpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IGltYWdlV2lkdGg7IGNvbCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbE9mZnNldCA9IGNvbCAqIG51bUNoYW5uZWxzO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjaGFubmVsID0gMDsgY2hhbm5lbCA8IG51bUNoYW5uZWxzOyBjaGFubmVsKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvb3JkcyA9IFtiYXRjaCwgcm93LCBjb2wsIGNoYW5uZWxdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeCA9IGNvb3Jkc1syXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHkgPSBjb29yZHNbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb29yZFgvY29vcmRZIGFyZSB0aGUgcmVzdWx0IG9mIHJvdGF0aW5nIGFuZCB0cmFuc2xhdGluZyB4L3kuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29vcmRYID0gKHggLSBjZW50ZXJYKSAqIGNvc0ZhY3RvciAtICh5IC0gY2VudGVyWSkgKiBzaW5GYWN0b3I7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29vcmRZID0gKHggLSBjZW50ZXJYKSAqIHNpbkZhY3RvciArICh5IC0gY2VudGVyWSkgKiBjb3NGYWN0b3I7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb29yZFggPSBNYXRoLnJvdW5kKGNvb3JkWCArIGNlbnRlclgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRZID0gTWF0aC5yb3VuZChjb29yZFkgKyBjZW50ZXJZKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvdXRwdXRWYWx1ZSA9IGZpbGxWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZmlsbFZhbHVlICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGFubmVsID09PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFZhbHVlID0gZnVsbE9wYWNpdHlWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFZhbHVlID0gZmlsbFZhbHVlW2NoYW5uZWxdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjb29yZGluYXRlIHBvc2l0aW9uIGZhbGxzIHdpdGhpbiB0aGUgaW1hZ2UgYm91bmRhcmllcy4uLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvb3JkWCA+PSAwICYmIGNvb3JkWCA8IGltYWdlV2lkdGggJiYgY29vcmRZID49IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29yZFkgPCBpbWFnZUhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgb3V0cHV0IHRvIHRoZSBpbWFnZSB2YWx1ZSBhdCB0aGUgY29vcmRpbmF0ZSBwb3NpdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByb3RhdGVkUm93T2Zmc2V0ID0gY29vcmRZICogKGltYWdlV2lkdGggKiBudW1DaGFubmVscyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm90YXRlZENvbE9mZnNldCA9IGNvb3JkWCAqIG51bUNoYW5uZWxzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGltYWdlSWR4ID0gYmF0Y2hPZmZzZXQgKyByb3RhdGVkUm93T2Zmc2V0ICsgcm90YXRlZENvbE9mZnNldCArIGNoYW5uZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VmFsdWUgPSBpbWFnZVZhbHNbaW1hZ2VJZHhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3V0SWR4ID0gYmF0Y2hPZmZzZXQgKyByb3dPZmZzZXQgKyBjb2xPZmZzZXQgKyBjaGFubmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W291dElkeF0gPSBvdXRwdXRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRhSWQgPSBjcHVCYWNrZW5kLndyaXRlKG91dHB1dCwgaW1hZ2Uuc2hhcGUsIGltYWdlLmR0eXBlKTtcbiAgICAgICAgcmV0dXJuIHsgZGF0YUlkLCBzaGFwZTogaW1hZ2Uuc2hhcGUsIGR0eXBlOiBpbWFnZS5kdHlwZSB9O1xuICAgIH1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Sb3RhdGVXaXRoT2Zmc2V0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBSb3VuZCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3Qgcm91bmQgPSB1bmFyeUtlcm5lbEZ1bmMoUm91bmQsICh4aSkgPT4ge1xuICAgIC8vIFRoZSBhbGdvcml0aG0gaXMgYmFzZWQgb24gYmFua2VyJ3Mgcm91bmRpbmcuXG4gICAgY29uc3QgYmFzZSA9IE1hdGguZmxvb3IoeGkpO1xuICAgIGlmICh4aSAtIGJhc2UgPCAwLjUpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoeGkpO1xuICAgIH1cbiAgICBlbHNlIGlmICh4aSAtIGJhc2UgPiAwLjUpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguY2VpbCh4aSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoYmFzZSAlIDIuMCA9PT0gMC4wKSB7XG4gICAgICAgICAgICByZXR1cm4gYmFzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBiYXNlICsgMS4wO1xuICAgICAgICB9XG4gICAgfVxufSk7XG5leHBvcnQgY29uc3Qgcm91bmRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUm91bmQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHJvdW5kLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJvdW5kLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBSc3FydCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVTaW1wbGVVbmFyeUltcGwgfSBmcm9tICcuLi91dGlscy91bmFyeV9pbXBsJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuY0Zyb21JbXBsIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IHJzcXJ0SW1wbCA9IGNyZWF0ZVNpbXBsZVVuYXJ5SW1wbCgoeGkpID0+IDEgLyBNYXRoLnNxcnQoeGkpKTtcbmV4cG9ydCBjb25zdCByc3FydCA9IHVuYXJ5S2VybmVsRnVuY0Zyb21JbXBsKFJzcXJ0LCByc3FydEltcGwpO1xuZXhwb3J0IGNvbnN0IHJzcXJ0Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJzcXJ0LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiByc3FydCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Sc3FydC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIFNjYXR0ZXJOZCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBzY2F0dGVySW1wbCB9IGZyb20gJy4vU2NhdHRlcl9pbXBsJztcbmV4cG9ydCBmdW5jdGlvbiBzY2F0dGVyTmQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGluZGljZXMsIHVwZGF0ZXMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHNoYXBlIH0gPSBhdHRycztcbiAgICBjb25zdCB7IHNsaWNlUmFuaywgbnVtVXBkYXRlcywgc2xpY2VTaXplLCBzdHJpZGVzLCBvdXRwdXRTaXplIH0gPSBiYWNrZW5kX3V0aWwuY2FsY3VsYXRlU2hhcGVzKHVwZGF0ZXMsIGluZGljZXMsIHNoYXBlKTtcbiAgICBjb25zdCBzdW1EdXBlSW5kaWNlcyA9IHRydWU7XG4gICAgY29uc3QgaW5kaWNlc0J1ZiA9IGJhY2tlbmQuYnVmZmVyU3luYyhpbmRpY2VzKTtcbiAgICBjb25zdCB1cGRhdGVzQnVmID0gYmFja2VuZC5idWZmZXJTeW5jKHVwZGF0ZXMpO1xuICAgIGNvbnN0IG91dEJ1ZiA9IHNjYXR0ZXJJbXBsKGluZGljZXNCdWYsIHVwZGF0ZXNCdWYsIHNoYXBlLCBvdXRwdXRTaXplLCBzbGljZVNpemUsIG51bVVwZGF0ZXMsIHNsaWNlUmFuaywgc3RyaWRlcywgMCAvKiBkZWZhdWx0VmFsdWUgKi8sIHN1bUR1cGVJbmRpY2VzKTtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhzaGFwZSwgb3V0QnVmLmR0eXBlLCBvdXRCdWYudmFsdWVzKTtcbn1cbmV4cG9ydCBjb25zdCBzY2F0dGVyTmRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU2NhdHRlck5kLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBzY2F0dGVyTmRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TY2F0dGVyTmQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYnVmZmVyIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiBzY2F0dGVySW1wbChpbmRpY2VzLCB1cGRhdGVzLCBzaGFwZSwgb3V0cHV0U2l6ZSwgc2xpY2VTaXplLCBudW1VcGRhdGVzLCBzbGljZVJhbmssIHN0cmlkZXMsIGRlZmF1bHRWYWx1ZSwgc3VtRHVwZUluZGljZXMpIHtcbiAgICBjb25zdCBmbGF0dGVuU2hhcGUgPSBbb3V0cHV0U2l6ZSAvIHNsaWNlU2l6ZSwgc2xpY2VTaXplXTtcbiAgICBjb25zdCBpbmRpY2VzRGF0YSA9IGluZGljZXMudmFsdWVzO1xuICAgIGNvbnN0IHVwZGF0ZXNEYXRhID0gdXBkYXRlcy52YWx1ZXM7XG4gICAgaWYgKG91dHB1dFNpemUgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGJ1ZmZlcihzaGFwZSwgdXBkYXRlcy5kdHlwZSk7XG4gICAgfVxuICAgIGNvbnN0IG91dEJ1ZiA9IGJ1ZmZlcihmbGF0dGVuU2hhcGUsIHVwZGF0ZXMuZHR5cGUpO1xuICAgIG91dEJ1Zi52YWx1ZXMuZmlsbChkZWZhdWx0VmFsdWUpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtVXBkYXRlczsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gW107XG4gICAgICAgIGxldCBmbGF0dGVuSW5kZXggPSAwO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHNsaWNlUmFuazsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBkaW0gPSBpbmRpY2VzRGF0YVtpICogc2xpY2VSYW5rICsgal07XG4gICAgICAgICAgICBpbmRleC5wdXNoKGRpbSk7XG4gICAgICAgICAgICBmbGF0dGVuSW5kZXggKz0gZGltICogc3RyaWRlc1tqXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmxhdHRlbkluZGV4IDwgMCB8fCBmbGF0dGVuSW5kZXggPj0gb3V0cHV0U2l6ZSAvIHNsaWNlU2l6ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGluZGljZXM6ICR7aW5kZXh9IGRvZXMgbm90IGluZGV4IGludG8gJHtzaGFwZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHNsaWNlU2l6ZTsgaysrKSB7XG4gICAgICAgICAgICBpZiAoc3VtRHVwZUluZGljZXMpIHtcbiAgICAgICAgICAgICAgICBvdXRCdWYudmFsdWVzW2ZsYXR0ZW5JbmRleCAqIHNsaWNlU2l6ZSArIGtdICs9XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZXNEYXRhW2kgKiBzbGljZVNpemUgKyBrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG91dEJ1Zi52YWx1ZXNbZmxhdHRlbkluZGV4ICogc2xpY2VTaXplICsga10gPSB1cGRhdGVzLnJhbmsgPT09IDAgP1xuICAgICAgICAgICAgICAgICAgICB1cGRhdGVzRGF0YVswXSA6XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZXNEYXRhW2kgKiBzbGljZVNpemUgKyBrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0QnVmO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2NhdHRlcl9pbXBsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFNlbGVjdCwgdXBjYXN0VHlwZSwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBjb25kaXRpb24sIHQsIGUgfSA9IGlucHV0cztcbiAgICBhc3NlcnROb3RDb21wbGV4KFtjb25kaXRpb24sIHQsIGVdLCAnc2VsZWN0Jyk7XG4gICAgY29uc3QgY29uZGl0aW9uUmFuayA9IGNvbmRpdGlvbi5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgdmFsdWVzID0gYmFja2VuZC5kYXRhLmdldChjb25kaXRpb24uZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgdFZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQodC5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBlVmFsdWVzID0gYmFja2VuZC5kYXRhLmdldChlLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHJlc3VsdER0eXBlID0gdXBjYXN0VHlwZSh0LmR0eXBlLCBlLmR0eXBlKTtcbiAgICBjb25zdCBuZXdWYWx1ZXMgPSB1dGlsLm1ha2VaZXJvc1R5cGVkQXJyYXkodXRpbC5zaXplRnJvbVNoYXBlKHQuc2hhcGUpLCByZXN1bHREdHlwZSk7XG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICBjb25zdCBvZmZzZXQgPSBjb25kaXRpb25SYW5rID09PSAwIHx8IGNvbmRpdGlvblJhbmsgPiAxIHx8IHQuc2hhcGUubGVuZ3RoID09PSAxID9cbiAgICAgICAgMSA6XG4gICAgICAgIHV0aWwuc2l6ZUZyb21TaGFwZSh0LnNoYXBlLnNsaWNlKDEpKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG9mZnNldDsgaisrKSB7XG4gICAgICAgICAgICBpZiAodmFsdWVzW2ldID09PSAxKSB7XG4gICAgICAgICAgICAgICAgbmV3VmFsdWVzW2luZGV4KytdID0gdFZhbHVlc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG5ld1ZhbHVlc1tpbmRleCsrXSA9IGVWYWx1ZXNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8odC5zaGFwZSwgcmVzdWx0RHR5cGUsIG5ld1ZhbHVlcyk7XG59XG5leHBvcnQgY29uc3Qgc2VsZWN0Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNlbGVjdCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogc2VsZWN0XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2VsZWN0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIFNlbHUgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuY29uc3Qgc2NhbGVBbHBoYSA9IGJhY2tlbmRfdXRpbC5TRUxVX1NDQUxFQUxQSEE7XG5jb25zdCBzY2FsZSA9IGJhY2tlbmRfdXRpbC5TRUxVX1NDQUxFO1xuZXhwb3J0IGNvbnN0IHNlbHUgPSB1bmFyeUtlcm5lbEZ1bmMoU2VsdSwgKHhpKSA9PiB7XG4gICAgaWYgKHhpID49IDApIHtcbiAgICAgICAgcmV0dXJuIHNjYWxlICogeGk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gc2NhbGVBbHBoYSAqIChNYXRoLmV4cCh4aSkgLSAxKTtcbiAgICB9XG59KTtcbmV4cG9ydCBjb25zdCBzZWx1Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNlbHUsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHNlbHUsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2VsdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU2lnbW9pZCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3Qgc2lnbW9pZCA9IHVuYXJ5S2VybmVsRnVuYyhTaWdtb2lkLCAoeGkpID0+IDEgLyAoMSArIE1hdGguZXhwKC14aSkpKTtcbmV4cG9ydCBjb25zdCBzaWdtb2lkQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNpZ21vaWQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHNpZ21vaWQsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2lnbW9pZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU2lnbiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3Qgc2lnbiA9IHVuYXJ5S2VybmVsRnVuYyhTaWduLCAoeGkpID0+IHtcbiAgICBpZiAoeGkgPCAwKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgZWxzZSBpZiAoeGkgPiAwKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxufSk7XG5leHBvcnQgY29uc3Qgc2lnbkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTaWduLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBzaWduLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNpZ24uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFNpbiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3Qgc2luID0gdW5hcnlLZXJuZWxGdW5jKFNpbiwgKHhpKSA9PiBNYXRoLnNpbih4aSkpO1xuZXhwb3J0IGNvbnN0IHNpbkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTaW4sXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHNpbixcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TaW4uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFNpbmggfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IHNpbmggPSB1bmFyeUtlcm5lbEZ1bmMoU2luaCwgKHhpKSA9PiBNYXRoLnNpbmgoeGkpKTtcbmV4cG9ydCBjb25zdCBzaW5oQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNpbmgsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHNpbmgsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2luaC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIGJ1ZmZlciwgU2xpY2UsIHNsaWNlX3V0aWwsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBzbGljZUltcGwodmFscywgYmVnaW4sIHNpemUsIHNoYXBlLCBkdHlwZSkge1xuICAgIGNvbnN0IGlzQ29udGlub3VzID0gc2xpY2VfdXRpbC5pc1NsaWNlQ29udGlub3VzKHNoYXBlLCBiZWdpbiwgc2l6ZSk7XG4gICAgY29uc3QgbGVuZ3RoID0gdXRpbC5zaXplRnJvbVNoYXBlKHNpemUpO1xuICAgIGNvbnN0IHhTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhzaGFwZSk7XG4gICAgaWYgKGlzQ29udGlub3VzKSB7XG4gICAgICAgIGNvbnN0IGZsYXRPZmZzZXQgPSBzbGljZV91dGlsLmNvbXB1dGVGbGF0T2Zmc2V0KGJlZ2luLCB4U3RyaWRlcyk7XG4gICAgICAgIGlmIChkdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWxzLnNsaWNlKGZsYXRPZmZzZXQsIGZsYXRPZmZzZXQgKyBsZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWxzLnN1YmFycmF5KGZsYXRPZmZzZXQsIGZsYXRPZmZzZXQgKyBsZW5ndGgpO1xuICAgIH1cbiAgICBjb25zdCBkZWNvZGVkRGF0YSA9IGR0eXBlID09PSAnc3RyaW5nJyA/XG4gICAgICAgIGJhY2tlbmRfdXRpbC5mcm9tVWludDhUb1N0cmluZ0FycmF5KHZhbHMpIDpcbiAgICAgICAgdmFscztcbiAgICBjb25zdCBpbkJ1ZiA9IGJ1ZmZlcihzaGFwZSwgZHR5cGUsIGRlY29kZWREYXRhKTtcbiAgICBjb25zdCBvdXRCdWYgPSBidWZmZXIoc2l6ZSwgZHR5cGUpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0QnVmLnNpemU7ICsraSkge1xuICAgICAgICBjb25zdCBvdXRMb2MgPSBvdXRCdWYuaW5kZXhUb0xvYyhpKTtcbiAgICAgICAgY29uc3QgaW5Mb2MgPSBvdXRMb2MubWFwKChpZHgsIGopID0+IGlkeCArIGJlZ2luW2pdKTtcbiAgICAgICAgb3V0QnVmLnNldChpbkJ1Zi5nZXQoLi4uaW5Mb2MpLCAuLi5vdXRMb2MpO1xuICAgIH1cbiAgICBpZiAoZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBiYWNrZW5kX3V0aWwuZnJvbVN0cmluZ0FycmF5VG9VaW50OChvdXRCdWYudmFsdWVzKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dEJ1Zi52YWx1ZXM7XG59XG5leHBvcnQgZnVuY3Rpb24gc2xpY2UoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGJlZ2luLCBzaXplIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KHgsICdzbGljZScpO1xuICAgIGNvbnN0IFskYmVnaW4sICRzaXplXSA9IHNsaWNlX3V0aWwucGFyc2VTbGljZVBhcmFtcyh4LCBiZWdpbiwgc2l6ZSk7XG4gICAgc2xpY2VfdXRpbC5hc3NlcnRQYXJhbXNWYWxpZCh4LCAkYmVnaW4sICRzaXplKTtcbiAgICBjb25zdCB2YWxzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IG91dFZhbHMgPSBzbGljZUltcGwodmFscywgJGJlZ2luLCAkc2l6ZSwgeC5zaGFwZSwgeC5kdHlwZSk7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oJHNpemUsIHguZHR5cGUsIG91dFZhbHMpO1xufVxuZXhwb3J0IGNvbnN0IHNsaWNlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNsaWNlLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBzbGljZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNsaWNlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgU29mdG1heCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBleHAgfSBmcm9tICcuL0V4cCc7XG5pbXBvcnQgeyBtYXggfSBmcm9tICcuL01heCc7XG5pbXBvcnQgeyBkaXYgfSBmcm9tICcuL1JlYWxEaXYnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQgeyBzdWIgfSBmcm9tICcuL1N1Yic7XG5pbXBvcnQgeyBzdW0gfSBmcm9tICcuL1N1bSc7XG5leHBvcnQgZnVuY3Rpb24gc29mdG1heChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgbG9naXRzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBkaW0gfSA9IGF0dHJzO1xuICAgIGNvbnN0IGxvZ2l0c1JhbmsgPSBsb2dpdHMuc2hhcGUubGVuZ3RoO1xuICAgIGxldCAkZGltID0gZGltO1xuICAgIGlmICgkZGltID09PSAtMSkge1xuICAgICAgICAkZGltID0gbG9naXRzUmFuayAtIDE7XG4gICAgfVxuICAgIGlmICgkZGltICE9PSBsb2dpdHNSYW5rIC0gMSkge1xuICAgICAgICB0aHJvdyBFcnJvcignU29mdG1heCBhbG9uZyBhIG5vbi1sYXN0IGRpbWVuc2lvbiBpcyBub3QgeWV0IHN1cHBvcnRlZC4gJyArXG4gICAgICAgICAgICBgTG9naXRzIHdhcyByYW5rICR7bG9naXRzUmFua30gYW5kIGRpbSB3YXMgJHskZGltfWApO1xuICAgIH1cbiAgICBjb25zdCBheGVzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShbJGRpbV0sIGxvZ2l0cy5zaGFwZSk7XG4gICAgY29uc3QgbWF4TG9naXQgPSBtYXgoe1xuICAgICAgICBpbnB1dHM6IHsgeDogbG9naXRzIH0sXG4gICAgICAgIGJhY2tlbmQsXG4gICAgICAgIGF0dHJzOiB7IHJlZHVjdGlvbkluZGljZXM6IGF4ZXMsIGtlZXBEaW1zOiBmYWxzZSB9XG4gICAgfSk7XG4gICAgY29uc3QgZXhwYW5kZWRTaGFwZSA9IGJhY2tlbmRfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbShtYXhMb2dpdC5zaGFwZSwgYXhlcyk7XG4gICAgY29uc3QgbWF4TG9naXRSZXNoYXBlZCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogbWF4TG9naXQgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IGV4cGFuZGVkU2hhcGUgfSB9KTtcbiAgICBjb25zdCBhID0gc3ViKHsgaW5wdXRzOiB7IGE6IGxvZ2l0cywgYjogbWF4TG9naXRSZXNoYXBlZCB9LCBiYWNrZW5kIH0pO1xuICAgIGNvbnN0IGIgPSBleHAoeyBpbnB1dHM6IHsgeDogYSB9LCBiYWNrZW5kIH0pO1xuICAgIGNvbnN0IHN1bUV4cCA9IHN1bSh7IGlucHV0czogeyB4OiBiIH0sIGJhY2tlbmQsIGF0dHJzOiB7IGF4aXM6IGF4ZXMsIGtlZXBEaW1zOiBmYWxzZSB9IH0pO1xuICAgIGNvbnN0IHN1bVJlc2hhcGVkID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiBzdW1FeHAgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IGV4cGFuZGVkU2hhcGUgfSB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBkaXYoeyBpbnB1dHM6IHsgYTogYiwgYjogc3VtUmVzaGFwZWQgfSwgYmFja2VuZCB9KTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG1heExvZ2l0KTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG1heExvZ2l0UmVzaGFwZWQpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oYSk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhiKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHN1bUV4cCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhzdW1SZXNoYXBlZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBjb25zdCBzb2Z0bWF4Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNvZnRtYXgsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHNvZnRtYXhcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Tb2Z0bWF4LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTb2Z0cGx1cyB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG4vLyBtaXJyb3JzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0Zi5ubi5zb2Z0cGx1czogaHR0cHM6Ly9nb28uZ2wvdmtjdndYXG4vLyBlcHNpbG9uIGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gMS4wIGFuZCB0aGUgbmV4dCByZXByZXNlbnRhYmxlIGZsb2F0LlxuLy8gRm9yIGEgc2luZ2xlIHByZWNpc2lvbiAzMiBiaXQgZmxvYXQgdGhpcyBzaG91bGQgYmUgMl4tMjMsIHNlZTpcbi8vIGh0dHBzOi8vbWF0aC5ieXUuZWR1L35zY2hvdy93b3JrL0lFRUVGbG9hdGluZ1BvaW50Lmh0bVxuY29uc3QgZXBzaWxvbiA9IDEuMTkyMDkyODk1NTA3ODEyNWUtNztcbmNvbnN0IHRocmVzaG9sZCA9IE1hdGgubG9nKGVwc2lsb24pICsgMi4wO1xuZXhwb3J0IGNvbnN0IHNvZnRwbHVzID0gdW5hcnlLZXJuZWxGdW5jKFNvZnRwbHVzLCAoeGkpID0+IHtcbiAgICAvLyBWYWx1ZSBhYm92ZSB3aGljaCBleHAoeCkgbWF5IG92ZXJmbG93LCBidXQgc29mdHBsdXMoeCkgPT0geFxuICAgIC8vIGlzIHdpdGhpbiBtYWNoaW5lIGVwc2lsb24uXG4gICAgY29uc3QgdG9vTGFyZ2UgPSB4aSA+IC10aHJlc2hvbGQ7XG4gICAgLy8gVmFsdWUgYmVsb3cgd2hpY2ggZXhwKHgpIG1heSB1bmRlcmZsb3csIGJ1dCBzb2Z0cGx1cyh4KSA9PSBleHAoeClcbiAgICAvLyBpcyB3aXRoaW4gbWFjaGluZSBlcHNpbG9uLlxuICAgIGNvbnN0IHRvb1NtYWxsID0geGkgPCB0aHJlc2hvbGQ7XG4gICAgY29uc3QgZXhwWCA9IE1hdGguZXhwKHhpKTtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGlmICh0b29TbWFsbCkge1xuICAgICAgICByZXN1bHQgPSBleHBYO1xuICAgIH1cbiAgICBlbHNlIGlmICh0b29MYXJnZSkge1xuICAgICAgICByZXN1bHQgPSB4aTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IE1hdGgubG9nKDEuMCArIGV4cFgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufSk7XG5leHBvcnQgY29uc3Qgc29mdHBsdXNDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU29mdHBsdXMsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHNvZnRwbHVzLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNvZnRwbHVzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgU3BhY2VUb0JhdGNoTkQsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7IHBhZFYyQ29uZmlnIH0gZnJvbSAnLi9QYWRWMic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7IHRyYW5zcG9zZSB9IGZyb20gJy4vVHJhbnNwb3NlJztcbmV4cG9ydCBmdW5jdGlvbiBzcGFjZVRvQmF0Y2hORChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYmxvY2tTaGFwZSwgcGFkZGluZ3MgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoW3hdLCAnc3BhY2VUb0JhdGNoTkQnKTtcbiAgICBjb25zdCBwcm9kID0gdXRpbC5zaXplRnJvbVNoYXBlKGJsb2NrU2hhcGUpO1xuICAgIGNvbnN0IGNvbXBsZXRlUGFkZGluZ3MgPSBbWzAsIDBdXTtcbiAgICBjb21wbGV0ZVBhZGRpbmdzLnB1c2goLi4ucGFkZGluZ3MpO1xuICAgIGZvciAobGV0IGkgPSAxICsgYmxvY2tTaGFwZS5sZW5ndGg7IGkgPCB4LnNoYXBlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbXBsZXRlUGFkZGluZ3MucHVzaChbMCwgMF0pO1xuICAgIH1cbiAgICBjb25zdCBwYWRkZWRYID0gcGFkVjJDb25maWcua2VybmVsRnVuYyh7XG4gICAgICAgIGlucHV0czogeyB4IH0sXG4gICAgICAgIGJhY2tlbmQsXG4gICAgICAgIGF0dHJzOiB7IHBhZGRpbmdzOiBjb21wbGV0ZVBhZGRpbmdzLCBjb25zdGFudFZhbHVlOiAwIH1cbiAgICB9KTtcbiAgICBjb25zdCByZXNoYXBlZFBhZGRlZFNoYXBlID0gYmFja2VuZF91dGlsLmdldFJlc2hhcGVkKHBhZGRlZFguc2hhcGUsIGJsb2NrU2hhcGUsIHByb2QsIGZhbHNlKTtcbiAgICBjb25zdCBwZXJtdXRlZFJlc2hhcGVkUGFkZGVkUGVybXV0YXRpb24gPSBiYWNrZW5kX3V0aWwuZ2V0UGVybXV0ZWQocmVzaGFwZWRQYWRkZWRTaGFwZS5sZW5ndGgsIGJsb2NrU2hhcGUubGVuZ3RoLCBmYWxzZSk7XG4gICAgY29uc3QgZmxhdHRlblNoYXBlID0gYmFja2VuZF91dGlsLmdldFJlc2hhcGVkUGVybXV0ZWQocGFkZGVkWC5zaGFwZSwgYmxvY2tTaGFwZSwgcHJvZCwgZmFsc2UpO1xuICAgIGNvbnN0IHJlc2hhcGVJbnB1dHMgPSB7IHg6IHBhZGRlZFggfTtcbiAgICBjb25zdCByZXNoYXBlQXR0cnMgPSB7IHNoYXBlOiByZXNoYXBlZFBhZGRlZFNoYXBlIH07XG4gICAgY29uc3QgcGFkZGVkWFJlc2hhcGVkID0gcmVzaGFwZSh7IGlucHV0czogcmVzaGFwZUlucHV0cywgYmFja2VuZCwgYXR0cnM6IHJlc2hhcGVBdHRycyB9KTtcbiAgICBjb25zdCB0cmFuc3Bvc2VJbnB1dHMgPSB7IHg6IHBhZGRlZFhSZXNoYXBlZCB9O1xuICAgIGNvbnN0IHRyYW5zcG9zZUF0dHJzID0geyBwZXJtOiBwZXJtdXRlZFJlc2hhcGVkUGFkZGVkUGVybXV0YXRpb24gfTtcbiAgICBjb25zdCBwYWRkZWRYVCA9IHRyYW5zcG9zZSh7IGlucHV0czogdHJhbnNwb3NlSW5wdXRzLCBiYWNrZW5kLCBhdHRyczogdHJhbnNwb3NlQXR0cnMgfSk7XG4gICAgY29uc3QgcmVzdWx0UmVzaGFwZUlucHV0cyA9IHsgeDogcGFkZGVkWFQgfTtcbiAgICBjb25zdCByZXN1bHRSZXNoYXBlQXR0cnMgPSB7IHNoYXBlOiBmbGF0dGVuU2hhcGUgfTtcbiAgICBjb25zdCByZXN1bHQgPSByZXNoYXBlKHsgaW5wdXRzOiByZXN1bHRSZXNoYXBlSW5wdXRzLCBiYWNrZW5kLCBhdHRyczogcmVzdWx0UmVzaGFwZUF0dHJzIH0pO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocGFkZGVkWCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhwYWRkZWRYUmVzaGFwZWQpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocGFkZGVkWFQpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgY29uc3Qgc3BhY2VUb0JhdGNoTkRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU3BhY2VUb0JhdGNoTkQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHNwYWNlVG9CYXRjaE5EXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3BhY2VUb0JhdGNoTkQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3BhcnNlRmlsbEVtcHR5Um93cyB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBzcGFyc2VGaWxsRW1wdHlSb3dzSW1wbCB9IGZyb20gJy4vU3BhcnNlRmlsbEVtcHR5Um93c19pbXBsJztcbmV4cG9ydCBmdW5jdGlvbiBzcGFyc2VGaWxsRW1wdHlSb3dzKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IGluZGljZXMsIHZhbHVlcywgZGVuc2VTaGFwZSwgZGVmYXVsdFZhbHVlIH0gPSBpbnB1dHM7XG4gICAgaWYgKGRlbnNlU2hhcGUuc2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRGVuc2Ugc2hhcGUgbXVzdCBiZSBhIHZlY3Rvciwgc2F3OlxuICAgICAgICAke2RlbnNlU2hhcGUuc2hhcGV9YCk7XG4gICAgfVxuICAgIGlmIChpbmRpY2VzLnNoYXBlLmxlbmd0aCAhPT0gMikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluZGljZXMgbXVzdCBiZSBhIG1hdHJpeCwgc2F3OlxuICAgICAgICAke2luZGljZXMuc2hhcGV9YCk7XG4gICAgfVxuICAgIGlmICh2YWx1ZXMuc2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVmFsdWVzIG11c3QgYmUgYSB2ZWN0b3IsIHNhdzpcbiAgICAgICAgJHt2YWx1ZXMuc2hhcGV9YCk7XG4gICAgfVxuICAgIGlmIChkZWZhdWx0VmFsdWUuc2hhcGUubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRGVmYXVsdCB2YWx1ZSBtdXN0IGJlIGEgc2NhbGFyLCBzYXc6XG4gICAgICAgICR7ZGVmYXVsdFZhbHVlLnNoYXBlfWApO1xuICAgIH1cbiAgICBjb25zdCAkaW5kaWNlcyA9IGJhY2tlbmQuZGF0YS5nZXQoaW5kaWNlcy5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCAkdmFsdWVzID0gYmFja2VuZC5kYXRhLmdldCh2YWx1ZXMuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgJGRlbnNlU2hhcGUgPSBiYWNrZW5kLmRhdGEuZ2V0KGRlbnNlU2hhcGUuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgJGRlZmF1bHRWYWx1ZSA9IGJhY2tlbmQuZGF0YS5nZXQoZGVmYXVsdFZhbHVlLmRhdGFJZCkudmFsdWVzWzBdO1xuICAgIGNvbnN0IFtvdXRwdXRJbmRpY2VzLCBvdXRwdXRJbmRpY2VzU2hhcGUsIG91dHB1dFZhbHVlcywgZW1wdHlSb3dJbmRpY2F0b3IsIHJldmVyc2VJbmRleE1hcF0gPSBzcGFyc2VGaWxsRW1wdHlSb3dzSW1wbCgkaW5kaWNlcywgaW5kaWNlcy5zaGFwZSwgaW5kaWNlcy5kdHlwZSwgJHZhbHVlcywgdmFsdWVzLmR0eXBlLCAkZGVuc2VTaGFwZSwgJGRlZmF1bHRWYWx1ZSk7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRwdXRJbmRpY2VzU2hhcGUsIGluZGljZXMuZHR5cGUsIG91dHB1dEluZGljZXMpLFxuICAgICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtvdXRwdXRJbmRpY2VzU2hhcGVbMF1dLCB2YWx1ZXMuZHR5cGUsIG91dHB1dFZhbHVlcyksXG4gICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW2VtcHR5Um93SW5kaWNhdG9yLmxlbmd0aF0sICdib29sJywgbmV3IFVpbnQ4QXJyYXkoZW1wdHlSb3dJbmRpY2F0b3IubWFwKCh2YWx1ZSkgPT4gTnVtYmVyKHZhbHVlKSkpKSxcbiAgICAgICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbcmV2ZXJzZUluZGV4TWFwLmxlbmd0aF0sIGluZGljZXMuZHR5cGUsIG5ldyBJbnQzMkFycmF5KHJldmVyc2VJbmRleE1hcCkpLFxuICAgIF07XG59XG5leHBvcnQgY29uc3Qgc3BhcnNlRmlsbEVtcHR5Um93c0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTcGFyc2VGaWxsRW1wdHlSb3dzLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBzcGFyc2VGaWxsRW1wdHlSb3dzLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNwYXJzZUZpbGxFbXB0eVJvd3MuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgZnVuY3Rpb24gc3BhcnNlRmlsbEVtcHR5Um93c0ltcGwoaW5kaWNlcywgaW5kaWNlc1NoYXBlLCBpbmRpY2VzRFR5cGUsIHZhbHVlcywgdmFsdWVzRFR5cGUsIGRlbnNlU2hhcGUsIGRlZmF1bHRWYWx1ZSkge1xuICAgIGNvbnN0IGluZGljZXNDb3VudCA9IGluZGljZXNTaGFwZVswXTtcbiAgICBjb25zdCBkZW5zZVJvd3MgPSBkZW5zZVNoYXBlWzBdO1xuICAgIGNvbnN0IGVtcHR5Um93SW5kaWNhdG9yID0gbmV3IEFycmF5KGRlbnNlUm93cyk7XG4gICAgY29uc3QgcmV2ZXJzZUluZGV4TWFwID0gbmV3IEFycmF5KGluZGljZXNDb3VudCk7XG4gICAgY29uc3QgcmFuayA9IGluZGljZXNTaGFwZVsxXTtcbiAgICBpZiAoZGVuc2VSb3dzID09PSAwKSB7XG4gICAgICAgIGlmIChpbmRpY2VzQ291bnQgIT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgU3BhcnNlVGVuc29yIHdpdGggZGVuc2VTaGFwZVswXSA9IDAgYnV0XG4gICAgICAgICBpbmRpY2VzLnNoYXBlWzBdID0gJHtpbmRpY2VzQ291bnR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3V0cHV0SW5kaWNlcyA9IHV0aWwuZ2V0QXJyYXlGcm9tRFR5cGUoaW5kaWNlc0RUeXBlLCAwKTtcbiAgICAgICAgY29uc3Qgb3V0cHV0VmFsdWVzID0gdXRpbC5nZXRBcnJheUZyb21EVHlwZSh2YWx1ZXNEVHlwZSwgMCk7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBvdXRwdXRJbmRpY2VzLCBbMCwgcmFua10sIG91dHB1dFZhbHVlcywgZW1wdHlSb3dJbmRpY2F0b3IsIHJldmVyc2VJbmRleE1hcFxuICAgICAgICBdO1xuICAgIH1cbiAgICBsZXQgcm93c0FyZU9yZGVyZWQgPSB0cnVlO1xuICAgIGxldCBsYXN0SW5kaWNlc1JvdyA9IDA7XG4gICAgY29uc3QgY3NyT2Zmc2V0ID0gbmV3IEFycmF5KGRlbnNlUm93cykuZmlsbCgwKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGljZXNDb3VudDsgKytpKSB7XG4gICAgICAgIC8vIGluZGljZXMgaXMgYSAyZCB0ZW5zb3Igd2l0aCBzaGFwZSBvZiBbTiwgcmFua11cbiAgICAgICAgY29uc3Qgcm93ID0gaW5kaWNlc1tpICogcmFua107XG4gICAgICAgIGlmIChyb3cgPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGluZGljZXMoJHtpfSwgMCkgaXMgaW52YWxpZDogJHtyb3d9IDwgMGApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyb3cgPj0gZGVuc2VSb3dzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGluZGljZXMoJHtpfSwgMCkgaXMgaW52YWxpZDogJHtyb3d9ID49ICR7ZGVuc2VSb3dzfWApO1xuICAgICAgICB9XG4gICAgICAgICsrY3NyT2Zmc2V0W3Jvd107XG4gICAgICAgIHJvd3NBcmVPcmRlcmVkID0gcm93c0FyZU9yZGVyZWQgJiYgKHJvdyA+PSBsYXN0SW5kaWNlc1Jvdyk7XG4gICAgICAgIGxhc3RJbmRpY2VzUm93ID0gcm93O1xuICAgIH1cbiAgICBsZXQgYWxsUm93c0Z1bGwgPSB0cnVlO1xuICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGRlbnNlUm93czsgKytyb3cpIHtcbiAgICAgICAgLy8gY3NyT2Zmc2V0IGhlcmUgZGVzY3JpYmVzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBkZW5zZSByb3dcbiAgICAgICAgY29uc3Qgcm93RW1wdHkgPSAoY3NyT2Zmc2V0W3Jvd10gPT09IDApO1xuICAgICAgICBlbXB0eVJvd0luZGljYXRvcltyb3ddID0gcm93RW1wdHk7XG4gICAgICAgIGFsbFJvd3NGdWxsID0gYWxsUm93c0Z1bGwgJiYgIXJvd0VtcHR5O1xuICAgICAgICAvLyBJbiBmaWxsZWQgdmVyc2lvbiwgZWFjaCByb3cgaGFzIGF0IGxlYXN0IG9uZSBlbGVtZW50LlxuICAgICAgICBjc3JPZmZzZXRbcm93XSA9IE1hdGgubWF4KGNzck9mZnNldFtyb3ddLCAxKTtcbiAgICAgICAgLy8gVXBkYXRlIGNzck9mZnNldCB0byByZXByZXNlbnQgdGhlIG51bWJlciBvZiBlbGVtZW50cyB1cCB0byBhbmRcbiAgICAgICAgLy8gaW5jbHVkaW5nIGRlbnNlUm93cyArIDE6XG4gICAgICAgIC8vICBjc3JPZmZzZXRbMF0gPT0gI3tlbGVtZW50cyBvZiByb3cgMH1cbiAgICAgICAgLy8gIGNzck9mZnNldFsxXSA9PSAje2VsZW1lbnRzIG9mIHJvdyAxfSArICN7ZWxlbWVudHMgb2Ygcm93IDB9XG4gICAgICAgIC8vICAuLlxuICAgICAgICAvLyAgY3NyT2Zmc2V0W2ldID09IHN0YXJ0aW5nIGluZGV4IGZvciBlbGVtZW50cyBpbiByb3cgaSArIDEuXG4gICAgICAgIGlmIChyb3cgPiAwKSB7XG4gICAgICAgICAgICBjc3JPZmZzZXRbcm93XSArPSBjc3JPZmZzZXRbcm93IC0gMV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFsbFJvd3NGdWxsICYmIHJvd3NBcmVPcmRlcmVkKSB7XG4gICAgICAgIGNvbnN0IG91dHB1dEluZGljZXMgPSBpbmRpY2VzO1xuICAgICAgICBjb25zdCBvdXRwdXRWYWx1ZXMgPSB2YWx1ZXM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kaWNlc0NvdW50OyArK2kpIHtcbiAgICAgICAgICAgIHJldmVyc2VJbmRleE1hcFtpXSA9IGk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIG91dHB1dEluZGljZXMsIFtpbmRpY2VzQ291bnQsIHJhbmtdLCBvdXRwdXRWYWx1ZXMsIGVtcHR5Um93SW5kaWNhdG9yLFxuICAgICAgICAgICAgcmV2ZXJzZUluZGV4TWFwXG4gICAgICAgIF07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBmdWxsSW5kaWNlc0NvdW50ID0gY3NyT2Zmc2V0W2RlbnNlUm93cyAtIDFdO1xuICAgICAgICBjb25zdCBvdXRwdXRJbmRpY2VzID0gdXRpbC5nZXRBcnJheUZyb21EVHlwZShpbmRpY2VzRFR5cGUsIGZ1bGxJbmRpY2VzQ291bnQgKiByYW5rKTtcbiAgICAgICAgY29uc3Qgb3V0cHV0VmFsdWVzID0gdXRpbC5nZXRBcnJheUZyb21EVHlwZSh2YWx1ZXNEVHlwZSwgZnVsbEluZGljZXNDb3VudCk7XG4gICAgICAgIGNvbnN0IGZpbGxlZENvdW50ID0gbmV3IEFycmF5KGRlbnNlUm93cykuZmlsbCgwKTtcbiAgICAgICAgLy8gRmlsbCBpbiB2YWx1ZXMgZm9yIHJvd3MgdGhhdCBhcmUgbm90IG1pc3NpbmdcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmRpY2VzQ291bnQ7ICsraSkge1xuICAgICAgICAgICAgLy8gaW5kaWNlcyBpcyBhIDJkIHRlbnNvciB3aXRoIHNoYXBlIG9mIFtOLCByYW5rXVxuICAgICAgICAgICAgY29uc3Qgcm93ID0gaW5kaWNlc1tpICogcmFua107XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBmaWxsZWRDb3VudFtyb3ddO1xuICAgICAgICAgICAgY29uc3Qgb3V0cHV0SSA9ICgocm93ID09PSAwKSA/IDAgOiBjc3JPZmZzZXRbcm93IC0gMV0pICsgb2Zmc2V0O1xuICAgICAgICAgICAgZmlsbGVkQ291bnRbcm93XSsrOyAvLyBJbmNyZW1lbnQgdGhlIGZpbGxlZCBjb3VudCBmb3IgdGhpcyByb3cuXG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJhbms7ICsraikge1xuICAgICAgICAgICAgICAgIC8vIGluZGljZXMgYW5kIG91dHB1dEluZGljZXMgYXJlIDJkIHRlbnNvcnMgd2l0aCBzaGFwZSBvZiBbTiwgcmFua11cbiAgICAgICAgICAgICAgICBvdXRwdXRJbmRpY2VzW291dHB1dEkgKiByYW5rICsgal0gPSBpbmRpY2VzW2kgKiByYW5rICsgal07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXRwdXRWYWx1ZXNbb3V0cHV0SV0gPSB2YWx1ZXNbaV07XG4gICAgICAgICAgICAvLyBXZSdsbCBuZWVkIHRoaXMgcmV2ZXJzZSBpbmRleCBtYXAgdG8gYmFja3Byb3AgY29ycmVjdGx5LlxuICAgICAgICAgICAgcmV2ZXJzZUluZGV4TWFwW2ldID0gb3V0cHV0STtcbiAgICAgICAgfVxuICAgICAgICAvLyBGaWxsIGluIHZhbHVlcyBmb3Igcm93cyB0aGF0IGFyZSBtaXNzaW5nXG4gICAgICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGRlbnNlUm93czsgKytyb3cpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvd0NvdW50ID0gZmlsbGVkQ291bnRbcm93XTtcbiAgICAgICAgICAgIGlmIChyb3dDb3VudCA9PT0gMCkgeyAvLyBXZSBoYXZlbid0IGZpbGxlZCB0aGlzIHJvd1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0aW5nSW5kZXggPSAocm93ID09PSAwKSA/IDAgOiBjc3JPZmZzZXRbcm93IC0gMV07XG4gICAgICAgICAgICAgICAgLy8gUmVtYWluaW5nIGluZGV4IHZhbHVlcyB3ZXJlIHNldCB0byB6ZXJvIGFscmVhZHkuXG4gICAgICAgICAgICAgICAgLy8gSnVzdCBuZWVkIHRvIHNldCB0aGUgcm93IGluZGV4IGluIHRoZSByaWdodCBsb2NhdGlvbi5cbiAgICAgICAgICAgICAgICAvLyBvdXRwdXRJbmRpY2VzIGlzIGEgMmQgdGVuc29yIHdpdGggc2hhcGUgb2YgW04sIHJhbmtdXG4gICAgICAgICAgICAgICAgb3V0cHV0SW5kaWNlc1tzdGFydGluZ0luZGV4ICogcmFuayArIDBdID0gcm93O1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGNvbCA9IDE7IGNvbCA8IHJhbms7ICsrY29sKSB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dEluZGljZXNbc3RhcnRpbmdJbmRleCAqIHJhbmsgKyBjb2xdID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3V0cHV0VmFsdWVzW3N0YXJ0aW5nSW5kZXhdID0gZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBvdXRwdXRJbmRpY2VzLCBbZnVsbEluZGljZXNDb3VudCwgcmFua10sIG91dHB1dFZhbHVlcywgZW1wdHlSb3dJbmRpY2F0b3IsXG4gICAgICAgICAgICByZXZlcnNlSW5kZXhNYXBcbiAgICAgICAgXTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TcGFyc2VGaWxsRW1wdHlSb3dzX2ltcGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3BhcnNlUmVzaGFwZSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBzcGFyc2VSZXNoYXBlSW1wbCB9IGZyb20gJy4vU3BhcnNlUmVzaGFwZV9pbXBsJztcbmV4cG9ydCBmdW5jdGlvbiBzcGFyc2VSZXNoYXBlKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IGlucHV0SW5kaWNlcywgaW5wdXRTaGFwZSwgbmV3U2hhcGUgfSA9IGlucHV0cztcbiAgICBpZiAoaW5wdXRJbmRpY2VzLnNoYXBlLmxlbmd0aCAhPT0gMikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYElucHV0IGluZGljZXMgc2hvdWxkIGJlIGEgbWF0cml4IGJ1dCByZWNlaXZlZCBzaGFwZVxuICAgICAgICAke2lucHV0SW5kaWNlcy5zaGFwZX1gKTtcbiAgICB9XG4gICAgaWYgKGlucHV0U2hhcGUuc2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW5wdXQgc2hhcGUgc2hvdWxkIGJlIGEgdmVjdG9yIGJ1dCByZWNlaXZlZCBzaGFwZVxuICAgICAgICAke2lucHV0U2hhcGUuc2hhcGV9YCk7XG4gICAgfVxuICAgIGlmIChuZXdTaGFwZS5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYXJnZXQgc2hhcGUgc2hvdWxkIGJlIGEgdmVjdG9yIGJ1dCByZWNlaXZlZCBzaGFwZSAke25ld1NoYXBlLnNoYXBlfWApO1xuICAgIH1cbiAgICBjb25zdCAkaW5wdXRTaGFwZSA9IEFycmF5LmZyb20oYmFja2VuZC5kYXRhLmdldChpbnB1dFNoYXBlLmRhdGFJZCkudmFsdWVzKTtcbiAgICBjb25zdCAkaW5wdXRJbmRpY2VzID0gYmFja2VuZC5kYXRhLmdldChpbnB1dEluZGljZXMuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgdGFyZ2V0U2hhcGUgPSBBcnJheS5mcm9tKGJhY2tlbmQuZGF0YS5nZXQobmV3U2hhcGUuZGF0YUlkKS52YWx1ZXMpO1xuICAgIGNvbnN0IFtuZXdJbmRpY2VzLCBpbmRpY2VzU2hhcGUsIG91dHB1dFNoYXBlXSA9IHNwYXJzZVJlc2hhcGVJbXBsKCRpbnB1dEluZGljZXMsIGlucHV0SW5kaWNlcy5zaGFwZSwgaW5wdXRJbmRpY2VzLmR0eXBlLCAkaW5wdXRTaGFwZSwgdGFyZ2V0U2hhcGUpO1xuICAgIHJldHVybiBbXG4gICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oaW5kaWNlc1NoYXBlLCBpbnB1dEluZGljZXMuZHR5cGUsIG5ld0luZGljZXMpLFxuICAgICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtvdXRwdXRTaGFwZS5sZW5ndGhdLCBuZXdTaGFwZS5kdHlwZSwgbmV3IEludDMyQXJyYXkob3V0cHV0U2hhcGUpKSxcbiAgICBdO1xufVxuZXhwb3J0IGNvbnN0IHNwYXJzZVJlc2hhcGVDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU3BhcnNlUmVzaGFwZSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogc3BhcnNlUmVzaGFwZSxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TcGFyc2VSZXNoYXBlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIHNwYXJzZVJlc2hhcGVJbXBsKGlucHV0SW5kaWNlcywgaW5wdXRJbmRpY2VzU2hhcGUsIGlucHV0RFR5cGUsIGlucHV0U2hhcGUsIHRhcmdldFNoYXBlKSB7XG4gICAgY29uc3QgZGVuc2VTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKGlucHV0U2hhcGUpO1xuICAgIGNvbnN0IG5ueiA9IGlucHV0SW5kaWNlc1NoYXBlWzBdO1xuICAgIGNvbnN0IG91dHB1dFJhbmsgPSB0YXJnZXRTaGFwZS5sZW5ndGg7XG4gICAgLy8gQ29tcHV0ZSB0aGUgb3V0cHV0IHNoYXBlLiBEZXRlcm1pbmUgcHJvZHVjdCBvZiBzcGVjaWZpZWQgZGltZW5zaW9ucywgYW5kXG4gICAgLy8gZmluZCB0aGUgaW5kZXggb2YgdGhlIHVuc3BlY2lmaWVkIG9uZS5cbiAgICBjb25zdCBvdXRwdXRTaGFwZSA9IFtdO1xuICAgIGxldCBwcm9kdWN0ID0gMTtcbiAgICBsZXQgdW5rbm93bkluZGV4ID0gLTE7XG4gICAgZm9yIChsZXQgZCA9IDA7IGQgPCBvdXRwdXRSYW5rOyArK2QpIHtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRhcmdldFNoYXBlW2RdO1xuICAgICAgICBpZiAoc2l6ZSA9PT0gLTEpIHtcbiAgICAgICAgICAgIGlmICh1bmtub3duSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBvbmx5IG9uZSBvdXRwdXQgZGltZW5zaW9uIG1heSBiZSAtMSwgbm90IGJvdGggJHt1bmtub3duSW5kZXh9IGFuZCAke2R9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1bmtub3duSW5kZXggPSBkO1xuICAgICAgICAgICAgb3V0cHV0U2hhcGUucHVzaCgxKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChzaXplIDwgMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgc2l6ZSAke2R9IG11c3QgYmUgbm9uLW5lZ2F0aXZlLCBub3QgJHtzaXplfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJvZHVjdCAqPSBzaXplO1xuICAgICAgICAgICAgb3V0cHV0U2hhcGUucHVzaChzaXplKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAodW5rbm93bkluZGV4ICE9PSAtMSkge1xuICAgICAgICBpZiAocHJvZHVjdCA8PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Jlc2hhcGUgY2Fubm90IGluZmVyIHRoZSBtaXNzaW5nICcgK1xuICAgICAgICAgICAgICAgICdpbnB1dCBzaXplIGZvciBhbiBlbXB0eSB0ZW5zb3IgdW5sZXNzIGFsbCAnICtcbiAgICAgICAgICAgICAgICAnc3BlY2lmaWVkIGlucHV0IHNpemVzIGFyZSBub24temVybycpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1pc3NpbmcgPSBNYXRoLnRydW5jKGRlbnNlU2l6ZSAvIHByb2R1Y3QpO1xuICAgICAgICBpZiAocHJvZHVjdCAqIG1pc3NpbmcgIT09IGRlbnNlU2l6ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnB1dCB0byByZXNoYXBlIGlzIGEgU3BhcnNlVGVuc29yIHdpdGggJHtkZW5zZVNpemV9XG4gICAgICAgICAgZGVuc2UgdmFsdWVzLCBidXQgdGhlIHJlcXVlc3RlZCBzaGFwZSByZXF1aXJlcyBhIG11bHRpcGxlIG9mICR7cHJvZHVjdH0uIGlucHV0U2hhcGU9JHtpbnB1dFNoYXBlfSBvdXRwdXRTaGFwZT0gJHtvdXRwdXRTaGFwZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBvdXRwdXRTaGFwZVt1bmtub3duSW5kZXhdID0gbWlzc2luZztcbiAgICB9XG4gICAgY29uc3Qgb3V0cHV0U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShvdXRwdXRTaGFwZSk7XG4gICAgaWYgKG91dHB1dFNpemUgIT09IGRlbnNlU2l6ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYElucHV0IHRvIHJlc2hhcGUgaXMgYSB0ZW5zb3Igd2l0aCAke2RlbnNlU2l6ZX0gZGVuc2UgdmFsdWVzLCBidXQgdGhlIHJlcXVlc3RlZCBzaGFwZSBoYXMgJHtvdXRwdXRTaXplfS4gaW5wdXRTaGFwZT0ke2lucHV0U2hhcGV9IG91dHB1dFNoYXBlPSR7b3V0cHV0U2hhcGV9YCk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0UmFuayA9IGlucHV0U2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IGlucHV0U3RyaWRlcyA9IFtdO1xuICAgIGlmIChpbnB1dFJhbmsgPiAwKSB7XG4gICAgICAgIGlucHV0U3RyaWRlc1tpbnB1dFJhbmsgLSAxXSA9IDE7XG4gICAgICAgIGZvciAobGV0IGQgPSBpbnB1dFJhbmsgLSAyOyBkID49IDA7IC0tZCkge1xuICAgICAgICAgICAgaW5wdXRTdHJpZGVzW2RdID0gaW5wdXRTdHJpZGVzW2QgKyAxXSAqIGlucHV0U2hhcGVbZCArIDFdO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG91dHB1dFN0cmlkZXMgPSBbXTtcbiAgICBpZiAob3V0cHV0UmFuayA+IDApIHtcbiAgICAgICAgb3V0cHV0U3RyaWRlc1tvdXRwdXRSYW5rIC0gMV0gPSAxO1xuICAgICAgICBmb3IgKGxldCBkID0gb3V0cHV0UmFuayAtIDI7IGQgPj0gMDsgLS1kKSB7XG4gICAgICAgICAgICBvdXRwdXRTdHJpZGVzW2RdID0gb3V0cHV0U3RyaWRlc1tkICsgMV0gKiBvdXRwdXRTaGFwZVtkICsgMV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbmV3SW5kaWNlcyA9IHV0aWwuZ2V0QXJyYXlGcm9tRFR5cGUoaW5wdXREVHlwZSwgbm56ICogb3V0cHV0UmFuayk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBubno7ICsraSkge1xuICAgICAgICBsZXQgaWQgPSAwO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGlucHV0UmFuazsgKytqKSB7XG4gICAgICAgICAgICAvLyBpbnB1dEluZGljZXMgaXMgYSAyZCB0ZW5zb3Igd2l0aCBzaGFwZSBvZiBbbm56LCBpbnB1dFJhbmtdXG4gICAgICAgICAgICBpZCArPSBpbnB1dEluZGljZXNbaSAqIGlucHV0UmFuayArIGpdICogaW5wdXRTdHJpZGVzW2pdO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgb3V0cHV0UmFuazsgKytqKSB7XG4gICAgICAgICAgICAvLyBuZXdJbmRpY2VzIGlzIGEgMmQgdGVuc29yIHdpdGggc2hhcGUgb2YgW25ueiwgb3V0cHV0UmFua11cbiAgICAgICAgICAgIG5ld0luZGljZXNbaSAqIG91dHB1dFJhbmsgKyBqXSA9IE1hdGgudHJ1bmMoaWQgLyBvdXRwdXRTdHJpZGVzW2pdKTtcbiAgICAgICAgICAgIGlkICU9IG91dHB1dFN0cmlkZXNbal07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFtuZXdJbmRpY2VzLCBbbm56LCBvdXRwdXRSYW5rXSwgb3V0cHV0U2hhcGVdO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3BhcnNlUmVzaGFwZV9pbXBsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFNwYXJzZVNlZ21lbnRNZWFuIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHNwYXJzZVNlZ21lbnRSZWR1Y3Rpb25JbXBsIH0gZnJvbSAnLi9TcGFyc2VTZWdtZW50UmVkdWN0aW9uX2ltcGwnO1xuZXhwb3J0IGZ1bmN0aW9uIHNwYXJzZVNlZ21lbnRNZWFuKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IGRhdGEsIGluZGljZXMsIHNlZ21lbnRJZHMgfSA9IGlucHV0cztcbiAgICBpZiAoZGF0YS5zaGFwZS5sZW5ndGggPCAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRGF0YSBzaG91bGQgYmUgYXQgbGVhc3QgMSBkaW1lbnNpb25hbCBidXQgcmVjZWl2ZWQgc2NhbGFyYCk7XG4gICAgfVxuICAgIGlmIChpbmRpY2VzLnNoYXBlLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluZGljZXMgc2hvdWxkIGJlIGEgdmVjdG9yIGJ1dCByZWNlaXZlZCBzaGFwZVxuICAgICAgICAgICR7aW5kaWNlcy5zaGFwZX1gKTtcbiAgICB9XG4gICAgaWYgKHNlZ21lbnRJZHMuc2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU2VnbWVudCBpZHMgc2hvdWxkIGJlIGEgdmVjdG9yIGJ1dCByZWNlaXZlZCBzaGFwZVxuICAgICAgICAgICR7c2VnbWVudElkcy5zaGFwZX1gKTtcbiAgICB9XG4gICAgY29uc3QgJGRhdGEgPSBiYWNrZW5kLmRhdGEuZ2V0KGRhdGEuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgJGluZGljZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGluZGljZXMuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgJHNlZ21lbnRJZHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHNlZ21lbnRJZHMuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgW291dHB1dERhdGEsIG91dHB1dERhdGFTaGFwZV0gPSBzcGFyc2VTZWdtZW50UmVkdWN0aW9uSW1wbCgkZGF0YSwgZGF0YS5zaGFwZSwgZGF0YS5kdHlwZSwgJGluZGljZXMsICRzZWdtZW50SWRzLCB0cnVlKTtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRwdXREYXRhU2hhcGUsIGRhdGEuZHR5cGUsIG91dHB1dERhdGEpO1xufVxuZXhwb3J0IGNvbnN0IHNwYXJzZVNlZ21lbnRNZWFuQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNwYXJzZVNlZ21lbnRNZWFuLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBzcGFyc2VTZWdtZW50TWVhbixcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TcGFyc2VTZWdtZW50TWVhbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiBzcGFyc2VTZWdtZW50UmVkdWN0aW9uSW1wbChpbnB1dCwgaW5wdXRTaGFwZSwgaW5wdXREVHlwZSwgaW5kaWNlcywgc2VnbWVudElkcywgaXNNZWFuID0gZmFsc2UsIGRlZmF1bHRWYWx1ZSA9IDApIHtcbiAgICBjb25zdCBudW1JbmRpY2VzID0gaW5kaWNlcy5sZW5ndGg7XG4gICAgaWYgKG51bUluZGljZXMgIT09IHNlZ21lbnRJZHMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgc2VnbWVudElkcyBhbmQgaW5kaWNlcyBzaG91bGQgaGF2ZSBzYW1lIHNpemUuYCk7XG4gICAgfVxuICAgIC8vIEZsYXR0ZW4gdGhlIGFycmF5IHRvIHR3byBkaW1lbnNpb25zXG4gICAgY29uc3QgaW5wdXRGbGF0ID0gW2lucHV0U2hhcGVbMF0sIGlucHV0Lmxlbmd0aCAvIGlucHV0U2hhcGVbMF1dO1xuICAgIGNvbnN0IG51bUNvbCA9IGlucHV0RmxhdFsxXTtcbiAgICAvLyBOb3RlIHRoYXQgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gYXNzdW1lcyB0aGF0IHNlZ21lbnRJZHMgdmFsdWVzIGFyZVxuICAgIC8vIHNvcnRlZC5cbiAgICBjb25zdCBsYXN0U2VnbWVudElkUGx1c09uZSA9IG51bUluZGljZXMgPiAwID8gc2VnbWVudElkc1tudW1JbmRpY2VzIC0gMV0gKyAxIDogMDtcbiAgICBjb25zdCBvdXRwdXRSb3dzID0gbGFzdFNlZ21lbnRJZFBsdXNPbmU7XG4gICAgaWYgKG91dHB1dFJvd3MgPCAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgc2VnbWVudCBpZHMgbXVzdCBiZSA+PSAwYCk7XG4gICAgfVxuICAgIGNvbnN0IG91dHB1dFNoYXBlID0gaW5wdXRTaGFwZS5zbGljZSgpO1xuICAgIG91dHB1dFNoYXBlWzBdID0gb3V0cHV0Um93cztcbiAgICBjb25zdCBvdXRwdXRMZW5ndGggPSBvdXRwdXRTaGFwZS5yZWR1Y2UoKHByb2R1Y3QsIHZhbHVlKSA9PiBwcm9kdWN0ICogdmFsdWUsIDEpO1xuICAgIC8vIE91dHB1dCBhcnJheSBpcyBpbml0aWFsaXplZCB3aXRoIHRoZSB2YWx1ZSAwIGJ5IGRlZmF1bHQuXG4gICAgY29uc3Qgb3V0cHV0ID0gdXRpbC5nZXRBcnJheUZyb21EVHlwZShpbnB1dERUeXBlLCBvdXRwdXRMZW5ndGgpO1xuICAgIC8vIE5vdGUgdGhhdCB3ZSBkbyBub3QgaW5pdGlhbGl6ZSB0aGUgb3V0cHV0IGJ1ZmZlciB3aXRoIGEgZGVmYXVsdCB2YWx1ZSwgc29cbiAgICAvLyB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgc2V0IG1pc3NpbmcgaW5kaWNlcyB0byB0aGUgZGVmYXVsdCB2YWx1ZS5cbiAgICBpZiAobnVtSW5kaWNlcyA9PT0gMCkge1xuICAgICAgICBpZiAob3V0cHV0Um93cyA+IDApIHtcbiAgICAgICAgICAgIG91dHB1dC5maWxsKGRlZmF1bHRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtvdXRwdXQsIG91dHB1dFNoYXBlXTtcbiAgICB9XG4gICAgaWYgKG91dHB1dFJvd3MgPD0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHNlZ21lbnQgaWRzIG11c3QgYmUgPj0gMGApO1xuICAgIH1cbiAgICBsZXQgc3RhcnQgPSAwLCBlbmQgPSAxO1xuICAgIC8vIEluZGV4IGZyb20gd2hpY2ggdGhlIG91dHB1dCBpcyBub3QgaW5pdGlhbGl6ZWQuXG4gICAgbGV0IHVuaW5pdGlhbGl6ZWRJbmRleCA9IDA7XG4gICAgbGV0IG91dEluZGV4ID0gc2VnbWVudElkc1tzdGFydF07XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgLy8gV2UgaW5pdGlhbGl6ZSBuZXh0SW5kZXggdG8gMCB0byBhdm9pZCBtYXkgYmUgdW5pbml0aWFsaXplZCB3YXJuaW5nXG4gICAgICAgIGxldCBuZXh0SW5kZXggPSAwO1xuICAgICAgICBpZiAoZW5kIDwgbnVtSW5kaWNlcykge1xuICAgICAgICAgICAgbmV4dEluZGV4ID0gc2VnbWVudElkc1tlbmRdO1xuICAgICAgICAgICAgaWYgKG91dEluZGV4ID09PSBuZXh0SW5kZXgpIHtcbiAgICAgICAgICAgICAgICArK2VuZDtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFdlIGhhdmUgYSBuZXcgc2VnbWVudCBoZXJlLiAgVmVyaWZ5IHRoYXQgdGhlIHNlZ21lbnQgaWRzIGFyZSBncm93aW5nLlxuICAgICAgICAgICAgaWYgKG91dEluZGV4ID49IG5leHRJbmRleCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgc2VnbWVudCBpZHMgYXJlIG5vdCBpbmNyZWFzaW5nYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG91dEluZGV4IDwgMCB8fCBvdXRJbmRleCA+PSBvdXRwdXRSb3dzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNlZ21lbnQgaWQgJHtvdXRJbmRleH0gb3V0IG9mIHJhbmdlIFswLCAke291dHB1dFJvd3N9KSwgcG9zc2libHkgYmVjYXVzZSBzZWdtZW50SWRzIGlucHV0IGlzIG5vdCBzb3J0ZWQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBnYXAgYmV0d2VlbiB0d28gaW5kaWNlcywgd2UgbmVlZCB0byBzZXQgdGhhdCBnYXAgdG8gdGhlXG4gICAgICAgIC8vIGRlZmF1bHQgdmFsdWUuXG4gICAgICAgIGlmIChvdXRJbmRleCA+IHVuaW5pdGlhbGl6ZWRJbmRleCkge1xuICAgICAgICAgICAgb3V0cHV0LmZpbGwoZGVmYXVsdFZhbHVlLCB1bmluaXRpYWxpemVkSW5kZXggKiBudW1Db2wsIG91dEluZGV4ICogbnVtQ29sKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBpbmRpY2VzW2ldO1xuICAgICAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBpbnB1dEZsYXRbMF0pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJhZDogaW5kaWNlc1ske2l9XSA9PSAke2luZGljZXNbaV19IG91dCBvZiByYW5nZSBbMCwgJHtpbnB1dEZsYXRbMF19KWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBudW1Db2w7IGorKykge1xuICAgICAgICAgICAgICAgIG91dHB1dFtvdXRJbmRleCAqIG51bUNvbCArIGpdICs9IGlucHV0W2luZGV4ICogbnVtQ29sICsgal07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzTWVhbikge1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBudW1Db2w7IGorKykge1xuICAgICAgICAgICAgICAgIG91dHB1dFtvdXRJbmRleCAqIG51bUNvbCArIGpdIC89IGVuZCAtIHN0YXJ0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN0YXJ0ID0gZW5kO1xuICAgICAgICArK2VuZDtcbiAgICAgICAgdW5pbml0aWFsaXplZEluZGV4ID0gb3V0SW5kZXggKyAxO1xuICAgICAgICBvdXRJbmRleCA9IG5leHRJbmRleDtcbiAgICAgICAgaWYgKGVuZCA+IG51bUluZGljZXMpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEZpbGwgdGhlIGdhcCBhdCB0aGUgZW5kIHdpdGggdGhlIGRlZmF1bHQgdmFsdWUuXG4gICAgaWYgKHVuaW5pdGlhbGl6ZWRJbmRleCA8IG91dHB1dFJvd3MpIHtcbiAgICAgICAgb3V0cHV0LmZpbGwoZGVmYXVsdFZhbHVlLCB1bmluaXRpYWxpemVkSW5kZXggKiBudW1Db2wsIG91dHB1dFJvd3MgKiBudW1Db2wpO1xuICAgIH1cbiAgICByZXR1cm4gW291dHB1dCwgb3V0cHV0U2hhcGVdO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3BhcnNlU2VnbWVudFJlZHVjdGlvbl9pbXBsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFNwYXJzZVNlZ21lbnRTdW0gfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgc3BhcnNlU2VnbWVudFJlZHVjdGlvbkltcGwgfSBmcm9tICcuL1NwYXJzZVNlZ21lbnRSZWR1Y3Rpb25faW1wbCc7XG5leHBvcnQgZnVuY3Rpb24gc3BhcnNlU2VnbWVudFN1bShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBkYXRhLCBpbmRpY2VzLCBzZWdtZW50SWRzIH0gPSBpbnB1dHM7XG4gICAgaWYgKGRhdGEuc2hhcGUubGVuZ3RoIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERhdGEgc2hvdWxkIGJlIGF0IGxlYXN0IDEgZGltZW5zaW9uYWwgYnV0IHJlY2VpdmVkIHNjYWxhcmApO1xuICAgIH1cbiAgICBpZiAoaW5kaWNlcy5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbmRpY2VzIHNob3VsZCBiZSBhIHZlY3RvciBidXQgcmVjZWl2ZWQgc2hhcGVcbiAgICAgICAgICR7aW5kaWNlcy5zaGFwZX1gKTtcbiAgICB9XG4gICAgaWYgKHNlZ21lbnRJZHMuc2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU2VnbWVudCBpZHMgc2hvdWxkIGJlIGEgdmVjdG9yIGJ1dCByZWNlaXZlZCBzaGFwZVxuICAgICAgICAgJHtzZWdtZW50SWRzLnNoYXBlfWApO1xuICAgIH1cbiAgICBjb25zdCAkZGF0YSA9IGJhY2tlbmQuZGF0YS5nZXQoZGF0YS5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCAkaW5kaWNlcyA9IGJhY2tlbmQuZGF0YS5nZXQoaW5kaWNlcy5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCAkc2VnbWVudElkcyA9IGJhY2tlbmQuZGF0YS5nZXQoc2VnbWVudElkcy5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBbb3V0cHV0RGF0YSwgb3V0cHV0RGF0YVNoYXBlXSA9IHNwYXJzZVNlZ21lbnRSZWR1Y3Rpb25JbXBsKCRkYXRhLCBkYXRhLnNoYXBlLCBkYXRhLmR0eXBlLCAkaW5kaWNlcywgJHNlZ21lbnRJZHMpO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dHB1dERhdGFTaGFwZSwgZGF0YS5kdHlwZSwgb3V0cHV0RGF0YSk7XG59XG5leHBvcnQgY29uc3Qgc3BhcnNlU2VnbWVudFN1bUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTcGFyc2VTZWdtZW50U3VtLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBzcGFyc2VTZWdtZW50U3VtLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNwYXJzZVNlZ21lbnRTdW0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBTcGFyc2VUb0RlbnNlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHNjYXR0ZXJJbXBsIH0gZnJvbSAnLi9TY2F0dGVyX2ltcGwnO1xuZXhwb3J0IGZ1bmN0aW9uIHNwYXJzZVRvRGVuc2UoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHNwYXJzZUluZGljZXMsIHNwYXJzZVZhbHVlcywgZGVmYXVsdFZhbHVlIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBvdXRwdXRTaGFwZSB9ID0gYXR0cnM7XG4gICAgY29uc3QgeyBzbGljZVJhbmssIG51bVVwZGF0ZXMsIHNsaWNlU2l6ZSwgc3RyaWRlcywgb3V0cHV0U2l6ZSB9ID0gYmFja2VuZF91dGlsLmNhbGN1bGF0ZVNoYXBlcyhzcGFyc2VWYWx1ZXMsIHNwYXJzZUluZGljZXMsIG91dHB1dFNoYXBlKTtcbiAgICBjb25zdCBzdW1EdXBlSW5kaWNlcyA9IGZhbHNlO1xuICAgIGNvbnN0IGluZGljZXNCdWYgPSBiYWNrZW5kLmJ1ZmZlclN5bmMoc3BhcnNlSW5kaWNlcyk7XG4gICAgY29uc3QgdXBkYXRlc0J1ZiA9IGJhY2tlbmQuYnVmZmVyU3luYyhzcGFyc2VWYWx1ZXMpO1xuICAgIGNvbnN0ICRkZWZhdWx0VmFsdWUgPSBiYWNrZW5kLmRhdGEuZ2V0KGRlZmF1bHRWYWx1ZS5kYXRhSWQpLnZhbHVlc1swXTtcbiAgICBjb25zdCBvdXRCdWYgPSBzY2F0dGVySW1wbChpbmRpY2VzQnVmLCB1cGRhdGVzQnVmLCBvdXRwdXRTaGFwZSwgb3V0cHV0U2l6ZSwgc2xpY2VTaXplLCBudW1VcGRhdGVzLCBzbGljZVJhbmssIHN0cmlkZXMsICRkZWZhdWx0VmFsdWUsIHN1bUR1cGVJbmRpY2VzKTtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRwdXRTaGFwZSwgb3V0QnVmLmR0eXBlLCBvdXRCdWYudmFsdWVzKTtcbn1cbmV4cG9ydCBjb25zdCBzcGFyc2VUb0RlbnNlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNwYXJzZVRvRGVuc2UsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHNwYXJzZVRvRGVuc2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TcGFyc2VUb0RlbnNlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBTcGxpdFYsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgc2xpY2UgfSBmcm9tICcuL1NsaWNlJztcbmV4cG9ydCBmdW5jdGlvbiBzcGxpdFYoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IG51bU9yU2l6ZVNwbGl0cywgYXhpcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgJGF4aXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpWzBdO1xuICAgIGNvbnN0IHNwbGl0U2l6ZXMgPSBiYWNrZW5kX3V0aWwucHJlcGFyZVNwbGl0U2l6ZSh4LCBudW1PclNpemVTcGxpdHMsICRheGlzKTtcbiAgICBjb25zdCBiZWdpbiA9IG5ldyBBcnJheSh4LnNoYXBlLmxlbmd0aCkuZmlsbCgwKTtcbiAgICBjb25zdCBzaXplID0geC5zaGFwZS5zbGljZSgpO1xuICAgIHJldHVybiBzcGxpdFNpemVzLm1hcChzID0+IHtcbiAgICAgICAgY29uc3Qgc2xpY2VTaXplID0gWy4uLnNpemVdO1xuICAgICAgICBzbGljZVNpemVbJGF4aXNdID0gcztcbiAgICAgICAgY29uc3Qgc2xpY2VUID0gc2xpY2UoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kLCBhdHRyczogeyBiZWdpbiwgc2l6ZTogc2xpY2VTaXplIH0gfSk7XG4gICAgICAgIGJlZ2luWyRheGlzXSArPSBzO1xuICAgICAgICByZXR1cm4gc2xpY2VUO1xuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IHNwbGl0VkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTcGxpdFYsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHNwbGl0VlxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNwbGl0Vi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3FydCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3Qgc3FydCA9IHVuYXJ5S2VybmVsRnVuYyhTcXJ0LCAoeGkpID0+IE1hdGguc3FydCh4aSkpO1xuZXhwb3J0IGNvbnN0IHNxcnRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU3FydCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogc3FydCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TcXJ0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFNxdWFyZSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGNvbnN0IHNxdWFyZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTcXVhcmUsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6ICh7IGlucHV0cywgYmFja2VuZCB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgICAgICBjb25zdCBjcHVCYWNrZW5kID0gYmFja2VuZDtcbiAgICAgICAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnc3F1YXJlJyk7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcztcbiAgICAgICAgY29uc3QgbmV3VmFsdWVzID0gbmV3IEZsb2F0MzJBcnJheSh2YWx1ZXMubGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVzW2ldO1xuICAgICAgICAgICAgbmV3VmFsdWVzW2ldID0gdmFsdWUgKiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRhSWQgPSBjcHVCYWNrZW5kLndyaXRlKG5ld1ZhbHVlcywgeC5zaGFwZSwgeC5kdHlwZSk7XG4gICAgICAgIHJldHVybiB7IGRhdGFJZCwgc2hhcGU6IHguc2hhcGUsIGR0eXBlOiB4LmR0eXBlIH07XG4gICAgfVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNxdWFyZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTcXVhcmVkRGlmZmVyZW5jZSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X2ltcGwnO1xuaW1wb3J0IHsgYmluYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV91dGlscyc7XG5leHBvcnQgY29uc3Qgc3F1YXJlZERpZmZlcmVuY2VJbXBsID0gY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoKGEsIGIpID0+IHtcbiAgICBjb25zdCBkaWZmID0gYSAtIGI7XG4gICAgcmV0dXJuIGRpZmYgKiBkaWZmO1xufSkpO1xuZXhwb3J0IGNvbnN0IHNxdWFyZWREaWZmZXJlbmNlID0gYmluYXJ5S2VybmVsRnVuYyhTcXVhcmVkRGlmZmVyZW5jZSwgc3F1YXJlZERpZmZlcmVuY2VJbXBsKTtcbmV4cG9ydCBjb25zdCBzcXVhcmVkRGlmZmVyZW5jZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTcXVhcmVkRGlmZmVyZW5jZSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogc3F1YXJlZERpZmZlcmVuY2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TcXVhcmVkRGlmZmVyZW5jZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3RlcCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3Qgc3RlcCA9IHVuYXJ5S2VybmVsRnVuYyhTdGVwLCAoeGksIGF0dHJzKSA9PiB7XG4gICAgY29uc3Qgc3RlcEF0dHJzID0gYXR0cnM7XG4gICAgaWYgKGlzTmFOKHhpKSkge1xuICAgICAgICByZXR1cm4gTmFOO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHhpID4gMCA/IDEgOiBzdGVwQXR0cnMuYWxwaGE7XG4gICAgfVxufSk7XG5leHBvcnQgY29uc3Qgc3RlcENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTdGVwLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBzdGVwLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN0ZXAuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgc2xpY2VfdXRpbCwgU3RyaWRlZFNsaWNlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7IHNsaWNlIH0gZnJvbSAnLi9TbGljZSc7XG5pbXBvcnQgeyBzdHJpZGVkU2xpY2VJbXBsIH0gZnJvbSAnLi9TdHJpZGVkU2xpY2VfaW1wbCc7XG5leHBvcnQgZnVuY3Rpb24gc3RyaWRlZFNsaWNlKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBiZWdpbiwgZW5kLCBzdHJpZGVzLCBiZWdpbk1hc2ssIGVuZE1hc2ssIGVsbGlwc2lzTWFzaywgbmV3QXhpc01hc2ssIHNocmlua0F4aXNNYXNrIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KHgsICdzdHJpZGVkU2xpY2UnKTtcbiAgICBjb25zdCB7IG5vblN0cmlkZWQsICRiZWdpbiwgJHN0cmlkZXMsIHNpemUsIG5ld1NoYXBlLCBvdXRTaGFwZSB9ID0gc2xpY2VfdXRpbC5zbGljZUluZm8oeC5zaGFwZSwgYmVnaW4sIGVuZCwgc3RyaWRlcywgYmVnaW5NYXNrLCBlbmRNYXNrLCBlbGxpcHNpc01hc2ssIG5ld0F4aXNNYXNrLCBzaHJpbmtBeGlzTWFzayk7XG4gICAgY29uc3QgJHggPSByZXNoYXBlKHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IG5ld1NoYXBlIH0gfSk7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBpZiAobm9uU3RyaWRlZCkge1xuICAgICAgICBjb25zdCBzbGljZWQgPSBzbGljZSh7IGlucHV0czogeyB4OiAkeCB9LCBiYWNrZW5kLCBhdHRyczogeyBiZWdpbjogJGJlZ2luLCBzaXplIH0gfSk7XG4gICAgICAgIHJlc3VsdCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogc2xpY2VkIH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBvdXRTaGFwZSB9IH0pO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHNsaWNlZCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKG91dFNoYXBlLnNvbWUoYXhpcyA9PiBheGlzID09PSAwKSkge1xuICAgICAgICByZXN1bHQgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dFNoYXBlLCB4LmR0eXBlLCBbXSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCB4QnVmID0gYmFja2VuZC5idWZmZXJTeW5jKCR4KTtcbiAgICAgICAgY29uc3Qgb3V0QnVmID0gc3RyaWRlZFNsaWNlSW1wbChvdXRTaGFwZSwgeEJ1ZiwgJHN0cmlkZXMsICRiZWdpbik7XG4gICAgICAgIHJlc3VsdCA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0QnVmLnNoYXBlLCBvdXRCdWYuZHR5cGUsIG91dEJ1Zi52YWx1ZXMpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHRSZXNoYXBlZCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogcmVzdWx0IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBvdXRTaGFwZSB9IH0pO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oJHgpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0UmVzaGFwZWQ7XG59XG5leHBvcnQgY29uc3Qgc3RyaWRlZFNsaWNlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFN0cmlkZWRTbGljZSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogc3RyaWRlZFNsaWNlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3RyaWRlZFNsaWNlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJ1ZmZlciB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgZnVuY3Rpb24gc3RyaWRlZFNsaWNlSW1wbChvdXRTaGFwZSwgeEJ1Ziwgc3RyaWRlcywgYmVnaW4pIHtcbiAgICBjb25zdCBvdXRCdWYgPSBidWZmZXIob3V0U2hhcGUsIHhCdWYuZHR5cGUpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0QnVmLnNpemU7IGkrKykge1xuICAgICAgICBjb25zdCBsb2MgPSBvdXRCdWYuaW5kZXhUb0xvYyhpKTtcbiAgICAgICAgY29uc3QgbmV3TG9jID0gbmV3IEFycmF5KGxvYy5sZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG5ld0xvYy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgbmV3TG9jW2pdID0gbG9jW2pdICogc3RyaWRlc1tqXSArIGJlZ2luW2pdO1xuICAgICAgICB9XG4gICAgICAgIG91dEJ1Zi5zZXQoeEJ1Zi5nZXQoLi4ubmV3TG9jKSwgLi4ubG9jKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dEJ1Zjtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN0cmlkZWRTbGljZV9pbXBsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFN0cmluZ05HcmFtcyB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBzdHJpbmdOR3JhbXNJbXBsIH0gZnJvbSAnLi9TdHJpbmdOR3JhbXNfaW1wbCc7XG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nTkdyYW1zKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBzZXBhcmF0b3IsIG5HcmFtV2lkdGhzLCBsZWZ0UGFkLCByaWdodFBhZCwgcGFkV2lkdGgsIHByZXNlcnZlU2hvcnRTZXF1ZW5jZXMgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHsgZGF0YSwgZGF0YVNwbGl0cyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0ICRkYXRhID0gYmFja2VuZC5kYXRhLmdldChkYXRhLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0ICRkYXRhU3BsaXRzID0gYmFja2VuZC5kYXRhLmdldChkYXRhU3BsaXRzLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IFtuR3JhbXMsIG5HcmFtc1NwbGl0c10gPSBzdHJpbmdOR3JhbXNJbXBsKCRkYXRhLCAkZGF0YVNwbGl0cywgc2VwYXJhdG9yLCBuR3JhbVdpZHRocywgbGVmdFBhZCwgcmlnaHRQYWQsIHBhZFdpZHRoLCBwcmVzZXJ2ZVNob3J0U2VxdWVuY2VzKTtcbiAgICByZXR1cm4gW1xuICAgICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtuR3JhbXMubGVuZ3RoXSwgJ3N0cmluZycsIG5HcmFtcyksXG4gICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oZGF0YVNwbGl0cy5zaGFwZSwgJ2ludDMyJywgbkdyYW1zU3BsaXRzKSxcbiAgICBdO1xufVxuZXhwb3J0IGNvbnN0IHN0cmluZ05HcmFtc0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTdHJpbmdOR3JhbXMsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHN0cmluZ05HcmFtcyxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdHJpbmdOR3JhbXMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG4vKipcbiAqIFRoZSBTdHJpbmdOR3JhbXNPcCBjbGFzcyBjcmVhdGVzIG5ncmFtcyBmcm9tIHJhZ2dlZCBzdHJpbmcgZGF0YS5cbiAqIFRoZSBjb25zdHJ1Y3RvciBjb250YWlucyBhbGwgYXR0cmlidXRlcyByZWxhdGVkIHRvIHRoZSBvcGVyYXRpb24gc3VjaCBhc1xuICogcGFkZGluZyB3aWR0aHMgYW5kIHN0cmluZ3MsIGFuZCB0aGUgY29tcHV0ZSBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0b1xuICogY29tcHV0ZSB0aGUgbmdyYW1zIGZvciBkaWZmZXJlbnQgcmFnZ2VkIHRlbnNvciBpbnB1dHMuXG4gKi9cbmNsYXNzIFN0cmluZ05HcmFtc09wIHtcbiAgICBjb25zdHJ1Y3RvcihzZXBhcmF0b3IsIG5HcmFtV2lkdGhzLCBsZWZ0UGFkLCByaWdodFBhZCwgcGFkV2lkdGgsIHByZXNlcnZlU2hvcnRTZXF1ZW5jZXMpIHtcbiAgICAgICAgdGhpcy5zZXBhcmF0b3IgPSB1dGlsLmVuY29kZVN0cmluZyhzZXBhcmF0b3IpO1xuICAgICAgICB0aGlzLm5HcmFtV2lkdGhzID0gbkdyYW1XaWR0aHM7XG4gICAgICAgIHRoaXMubGVmdFBhZCA9IHV0aWwuZW5jb2RlU3RyaW5nKGxlZnRQYWQpO1xuICAgICAgICB0aGlzLnJpZ2h0UGFkID0gdXRpbC5lbmNvZGVTdHJpbmcocmlnaHRQYWQpO1xuICAgICAgICB0aGlzLnBhZFdpZHRoID0gcGFkV2lkdGg7XG4gICAgICAgIHRoaXMucHJlc2VydmVTaG9ydCA9IHByZXNlcnZlU2hvcnRTZXF1ZW5jZXM7XG4gICAgfVxuICAgIGdldFBhZFdpZHRoKG5HcmFtV2lkdGgpIHtcbiAgICAgICAgLy8gTmdyYW1zIGNhbiBiZSBwYWRkZWQgd2l0aCBlaXRoZXIgYSBmaXhlZCBwYWQgd2lkdGggb3IgYSBkeW5hbWljIHBhZFxuICAgICAgICAvLyB3aWR0aCBkZXBlbmRpbmcgb24gdGhlICdwYWRXaWR0aCcgYXJnLCBidXQgaW4gbm8gY2FzZSBzaG91bGQgdGhlIHBhZGRpbmdcbiAgICAgICAgLy8gZXZlciBiZSB3aWRlciB0aGFuICduR3JhbVdpZHRoJyAtIDEuXG4gICAgICAgIHJldHVybiBNYXRoLm1pbih0aGlzLnBhZFdpZHRoIDwgMCA/IG5HcmFtV2lkdGggLSAxIDogdGhpcy5wYWRXaWR0aCwgbkdyYW1XaWR0aCAtIDEpO1xuICAgIH1cbiAgICBnZXROdW1OR3JhbXMobGVuZ3RoLCBuR3JhbVdpZHRoKSB7XG4gICAgICAgIGNvbnN0IHBhZFdpZHRoID0gdGhpcy5nZXRQYWRXaWR0aChuR3JhbVdpZHRoKTtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsICgobGVuZ3RoICsgMiAqIHBhZFdpZHRoKSAtIG5HcmFtV2lkdGgpICsgMSk7XG4gICAgfVxuICAgIGNyZWF0ZU5HcmFtcyhkYXRhLCBzcGxpdEluZGV4LCBvdXRwdXQsIG91dHB1dFN0YXJ0SW5kZXgsIG51bU5HcmFtcywgbkdyYW1XaWR0aCkge1xuICAgICAgICBmb3IgKGxldCBuR3JhbUluZGV4ID0gMDsgbkdyYW1JbmRleCA8IG51bU5HcmFtczsgKytuR3JhbUluZGV4KSB7XG4gICAgICAgICAgICBjb25zdCBwYWRXaWR0aCA9IHRoaXMuZ2V0UGFkV2lkdGgobkdyYW1XaWR0aCk7XG4gICAgICAgICAgICBjb25zdCBsZWZ0UGFkZGluZyA9IE1hdGgubWF4KDAsIHBhZFdpZHRoIC0gbkdyYW1JbmRleCk7XG4gICAgICAgICAgICBjb25zdCByaWdodFBhZGRpbmcgPSBNYXRoLm1heCgwLCBwYWRXaWR0aCAtIChudW1OR3JhbXMgLSAobkdyYW1JbmRleCArIDEpKSk7XG4gICAgICAgICAgICBjb25zdCBudW1Ub2tlbnMgPSBuR3JhbVdpZHRoIC0gKGxlZnRQYWRkaW5nICsgcmlnaHRQYWRkaW5nKTtcbiAgICAgICAgICAgIGNvbnN0IGRhdGFTdGFydEluZGV4ID0gc3BsaXRJbmRleCArIChsZWZ0UGFkZGluZyA+IDAgPyAwIDogbkdyYW1JbmRleCAtIHBhZFdpZHRoKTtcbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgdG90YWwgZXhwZWN0ZWQgc2l6ZSBvZiB0aGUgbkdyYW0gc28gd2UgY2FuIHJlc2VydmUgdGhlXG4gICAgICAgICAgICAvLyBjb3JyZWN0IGFtb3VudCBvZiBzcGFjZSBpbiB0aGUgc3RyaW5nLlxuICAgICAgICAgICAgbGV0IG5HcmFtU2l6ZSA9IDA7XG4gICAgICAgICAgICAvLyBTaXplIG9mIHRoZSBsZWZ0IHBhZGRpbmcuXG4gICAgICAgICAgICBuR3JhbVNpemUgKz0gbGVmdFBhZGRpbmcgKiB0aGlzLmxlZnRQYWQubGVuZ3RoO1xuICAgICAgICAgICAgLy8gU2l6ZSBvZiB0aGUgdG9rZW5zLlxuICAgICAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBudW1Ub2tlbnM7ICsrbikge1xuICAgICAgICAgICAgICAgIG5HcmFtU2l6ZSArPSBkYXRhW2RhdGFTdGFydEluZGV4ICsgbl0ubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU2l6ZSBvZiB0aGUgcmlnaHQgcGFkZGluZy5cbiAgICAgICAgICAgIG5HcmFtU2l6ZSArPSByaWdodFBhZGRpbmcgKiB0aGlzLnJpZ2h0UGFkLmxlbmd0aDtcbiAgICAgICAgICAgIC8vIFNpemUgb2YgdGhlIHNlcGFyYXRvcnMuXG4gICAgICAgICAgICBjb25zdCBudW1TZXBhcmF0b3JzID0gbGVmdFBhZGRpbmcgKyByaWdodFBhZGRpbmcgKyBudW1Ub2tlbnMgLSAxO1xuICAgICAgICAgICAgbkdyYW1TaXplICs9IG51bVNlcGFyYXRvcnMgKiB0aGlzLnNlcGFyYXRvci5sZW5ndGg7XG4gICAgICAgICAgICAvLyBCdWlsZCB0aGUgbkdyYW0uXG4gICAgICAgICAgICBvdXRwdXRbb3V0cHV0U3RhcnRJbmRleCArIG5HcmFtSW5kZXhdID0gbmV3IFVpbnQ4QXJyYXkobkdyYW1TaXplKTtcbiAgICAgICAgICAgIGNvbnN0IG5HcmFtID0gb3V0cHV0W291dHB1dFN0YXJ0SW5kZXggKyBuR3JhbUluZGV4XTtcbiAgICAgICAgICAgIGxldCBuZXh0TkdyYW1JbmRleCA9IDA7XG4gICAgICAgICAgICBjb25zdCBhcHBlbmRUb05HcmFtID0gKHN0cikgPT4gc3RyLmZvckVhY2goKHZhbHVlKSA9PiBuR3JhbVtuZXh0TkdyYW1JbmRleCsrXSA9IHZhbHVlKTtcbiAgICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgbGVmdFBhZGRpbmc7ICsrbikge1xuICAgICAgICAgICAgICAgIGFwcGVuZFRvTkdyYW0odGhpcy5sZWZ0UGFkKTtcbiAgICAgICAgICAgICAgICBhcHBlbmRUb05HcmFtKHRoaXMuc2VwYXJhdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE9ubHkgb3V0cHV0IGZpcnN0IG51bVRva2VucyAtIDEgcGFpcnMgb2YgZGF0YSBhbmQgc2VwYXJhdG9yXG4gICAgICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IG51bVRva2VucyAtIDE7ICsrbikge1xuICAgICAgICAgICAgICAgIGFwcGVuZFRvTkdyYW0oZGF0YVtkYXRhU3RhcnRJbmRleCArIG5dKTtcbiAgICAgICAgICAgICAgICBhcHBlbmRUb05HcmFtKHRoaXMuc2VwYXJhdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEhhbmRsZSBjYXNlIHdoZW4gdGhlcmUgYXJlIG5vIHRva2VucyBvciBubyByaWdodCBwYWRkaW5nIGFzIHRoZXNlXG4gICAgICAgICAgICAvLyBjYW4gcmVzdWx0IGluIGNvbnNlY3V0aXZlIHNlcGFyYXRvcnMuXG4gICAgICAgICAgICBpZiAobnVtVG9rZW5zID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgdG9rZW5zLCB0aGVuIG91dHB1dCBsYXN0IGFuZCB0aGVuIHBhaXIgZWFjaCBzZXBhcmF0b3JcbiAgICAgICAgICAgICAgICAvLyB3aXRoIHRoZSByaWdodCBwYWRkaW5nIHRoYXQgZm9sbG93cywgdG8gZW5zdXJlIG5HcmFtIGVuZHMgZWl0aGVyIHdpdGhcbiAgICAgICAgICAgICAgICAvLyB0aGUgdG9rZW4gb3Igd2l0aCB0aGUgcmlnaHQgcGFkLlxuICAgICAgICAgICAgICAgIGFwcGVuZFRvTkdyYW0oZGF0YVtkYXRhU3RhcnRJbmRleCArIG51bVRva2VucyAtIDFdKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IHJpZ2h0UGFkZGluZzsgKytuKSB7XG4gICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvTkdyYW0odGhpcy5zZXBhcmF0b3IpO1xuICAgICAgICAgICAgICAgICAgICBhcHBlbmRUb05HcmFtKHRoaXMucmlnaHRQYWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgdG9rZW5zLCB0aGVuIHRoZSBsYXN0IGl0ZW0gaW5zZXJ0ZWQgaW50byB0aGUgbkdyYW1cbiAgICAgICAgICAgICAgICAvLyBoYXMgYmVlbiB0aGUgc2VwYXJhdG9yIGZyb20gdGhlIGxlZnQgcGFkZGluZyBsb29wIGFib3ZlLiBIZW5jZSxcbiAgICAgICAgICAgICAgICAvLyBvdXRwdXQgcmlnaHQgcGFkIGFuZCBzZXBhcmF0b3IgYW5kIG1ha2Ugc3VyZSB0byBmaW5pc2ggd2l0aCBhXG4gICAgICAgICAgICAgICAgLy8gcGFkZGluZywgbm90IGEgc2VwYXJhdG9yLlxuICAgICAgICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgcmlnaHRQYWRkaW5nIC0gMTsgKytuKSB7XG4gICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvTkdyYW0odGhpcy5yaWdodFBhZCk7XG4gICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvTkdyYW0odGhpcy5zZXBhcmF0b3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhcHBlbmRUb05HcmFtKHRoaXMucmlnaHRQYWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIERhdGEgYW5kIHNwbGl0cyB0b2dldGhlciBmb3JtIHRoZSBkZWZpbml0aW9uIG9mIHRoZSByYWdnZWQgdGVuc29yLFxuICAgIC8vIHdoZXJlIGRhdGEgaXMgMSBkaW1lbnNpb25hbCBhbmQgY29udGFpbnMgdGhlIHZhbHVlcyBvZiB0aGUgdGVuc29yXG4gICAgLy8gYW5kIHNwbGl0cyBkZW5vdGVzIHRoZSBpbmRpY2VzIGF0IHdoaWNoIGVhY2ggcm93IHN0YXJ0cy5cbiAgICBjb21wdXRlKGRhdGEsIHNwbGl0cykge1xuICAgICAgICAvLyBWYWxpZGF0ZSB0aGF0IHRoZSBzcGxpdHMgYXJlIHZhbGlkIGluZGljZXMgaW50byBkYXRhLCBvbmx5IGlmIHRoZXJlIGFyZVxuICAgICAgICAvLyBzcGxpdHMgc3BlY2lmaWVkLlxuICAgICAgICBjb25zdCBpbnB1dERhdGFTaXplID0gZGF0YS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHNwbGl0c1NpemUgPSBzcGxpdHMubGVuZ3RoO1xuICAgICAgICBpZiAoc3BsaXRzU2l6ZSA+IDApIHtcbiAgICAgICAgICAgIGxldCBwcmV2U3BsaXQgPSBzcGxpdHNbMF07XG4gICAgICAgICAgICBpZiAocHJldlNwbGl0ICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaXJzdCBzcGxpdCB2YWx1ZSBtdXN0IGJlIDAsIGdvdCAke3ByZXZTcGxpdH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc3BsaXRzU2l6ZTsgKytpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbGlkU3BsaXRzID0gc3BsaXRzW2ldID49IHByZXZTcGxpdDtcbiAgICAgICAgICAgICAgICB2YWxpZFNwbGl0cyA9IHZhbGlkU3BsaXRzICYmIChzcGxpdHNbaV0gPD0gaW5wdXREYXRhU2l6ZSk7XG4gICAgICAgICAgICAgICAgaWYgKCF2YWxpZFNwbGl0cykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc3BsaXQgdmFsdWUgJHtzcGxpdHNbaV19LCBtdXN0IGJlIGluIFske3ByZXZTcGxpdH0sICR7aW5wdXREYXRhU2l6ZX1dYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByZXZTcGxpdCA9IHNwbGl0c1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcmV2U3BsaXQgIT09IGlucHV0RGF0YVNpemUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExhc3Qgc3BsaXQgdmFsdWUgbXVzdCBiZSBkYXRhIHNpemUuIEV4cGVjdGVkICR7aW5wdXREYXRhU2l6ZX0sIGdvdCAke3ByZXZTcGxpdH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBudW1CYXRjaEl0ZW1zID0gc3BsaXRzU2l6ZSAtIDE7XG4gICAgICAgIGNvbnN0IG5HcmFtc1NwbGl0cyA9IHV0aWwuZ2V0QXJyYXlGcm9tRFR5cGUoJ2ludDMyJywgc3BsaXRzU2l6ZSk7XG4gICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIGRhdGEgb3Igc2l6ZSwgcmV0dXJuIGFuIGVtcHR5IHJhZ2dlZCB0ZW5zb3IuXG4gICAgICAgIGlmIChpbnB1dERhdGFTaXplID09PSAwIHx8IHNwbGl0c1NpemUgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGVtcHR5ID0gbmV3IEFycmF5KGlucHV0RGF0YVNpemUpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gbnVtQmF0Y2hJdGVtczsgKytpKSB7XG4gICAgICAgICAgICAgICAgbkdyYW1zU3BsaXRzW2ldID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbZW1wdHksIG5HcmFtc1NwbGl0c107XG4gICAgICAgIH1cbiAgICAgICAgbkdyYW1zU3BsaXRzWzBdID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gbnVtQmF0Y2hJdGVtczsgKytpKSB7XG4gICAgICAgICAgICBjb25zdCBsZW5ndGggPSBzcGxpdHNbaV0gLSBzcGxpdHNbaSAtIDFdO1xuICAgICAgICAgICAgbGV0IG51bU5HcmFtcyA9IDA7XG4gICAgICAgICAgICB0aGlzLm5HcmFtV2lkdGhzLmZvckVhY2goKG5HcmFtV2lkdGgpID0+IHtcbiAgICAgICAgICAgICAgICBudW1OR3JhbXMgKz0gdGhpcy5nZXROdW1OR3JhbXMobGVuZ3RoLCBuR3JhbVdpZHRoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHRoaXMucHJlc2VydmVTaG9ydCAmJiBsZW5ndGggPiAwICYmIG51bU5HcmFtcyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIG51bU5HcmFtcyA9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuR3JhbXNTcGxpdHNbaV0gPSBuR3JhbXNTcGxpdHNbaSAtIDFdICsgbnVtTkdyYW1zO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5HcmFtcyA9IG5ldyBBcnJheShuR3JhbXNTcGxpdHNbbnVtQmF0Y2hJdGVtc10pO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUJhdGNoSXRlbXM7ICsraSkge1xuICAgICAgICAgICAgY29uc3Qgc3BsaXRJbmRleCA9IHNwbGl0c1tpXTtcbiAgICAgICAgICAgIGxldCBvdXRwdXRTdGFydElkeCA9IG5HcmFtc1NwbGl0c1tpXTtcbiAgICAgICAgICAgIHRoaXMubkdyYW1XaWR0aHMuZm9yRWFjaCgobkdyYW1XaWR0aCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHNwbGl0c1tpICsgMV0gLSBzcGxpdHNbaV07XG4gICAgICAgICAgICAgICAgY29uc3QgbnVtTkdyYW1zID0gdGhpcy5nZXROdW1OR3JhbXMobGVuZ3RoLCBuR3JhbVdpZHRoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZU5HcmFtcyhkYXRhLCBzcGxpdEluZGV4LCBuR3JhbXMsIG91dHB1dFN0YXJ0SWR4LCBudW1OR3JhbXMsIG5HcmFtV2lkdGgpO1xuICAgICAgICAgICAgICAgIG91dHB1dFN0YXJ0SWR4ICs9IG51bU5HcmFtcztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gSWYgd2UncmUgcHJlc2VydmluZyBzaG9ydCBzZXF1ZW5jZXMsIGNoZWNrIHRvIHNlZSBpZiBubyBzZXF1ZW5jZSB3YXNcbiAgICAgICAgICAgIC8vIGdlbmVyYXRlZCBieSBjb21wYXJpbmcgdGhlIGN1cnJlbnQgb3V0cHV0IHN0YXJ0IGlkeCB0byB0aGUgb3JpZ2luYWxcbiAgICAgICAgICAgIC8vIG9uZSAobkdyYW1TcGxpdHNkYXRhKS4gSWYgbm8gbmdyYW1zIHdlcmUgZ2VuZXJhdGVkLCB0aGVuIHRoZXkgd2lsbFxuICAgICAgICAgICAgLy8gYmUgZXF1YWwgKHNpbmNlIHdlIGluY3JlbWVudCBvdXRwdXRTdGFydElkeCBieSBudW1OR3JhbXMgZXZlcnlcbiAgICAgICAgICAgIC8vIHRpbWUgd2UgY3JlYXRlIGEgc2V0IG9mIG5ncmFtcy4pXG4gICAgICAgICAgICBpZiAodGhpcy5wcmVzZXJ2ZVNob3J0ICYmIG91dHB1dFN0YXJ0SWR4ID09PSBuR3JhbXNTcGxpdHNbaV0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhTGVuZ3RoID0gc3BsaXRzW2kgKyAxXSAtIHNwbGl0c1tpXTtcbiAgICAgICAgICAgICAgICAvLyBPbmUgbGVnaXRpbWF0ZSByZWFzb24gdG8gbm90IGhhdmUgYW55IG5ncmFtcyB3aGVuIHRoaXMucHJlc2VydmVTaG9ydFxuICAgICAgICAgICAgICAgIC8vIGlzIHRydWUgaXMgaWYgdGhlIHNlcXVlbmNlIGl0c2VsZiBpcyBlbXB0eS4gSW4gdGhhdCBjYXNlLCBtb3ZlIG9uLlxuICAgICAgICAgICAgICAgIGlmIChkYXRhTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IGR5bmFtaWMgcGFkZGluZyBzaXplcyBoZXJlOiBpZiBwYWRkaW5nXG4gICAgICAgICAgICAgICAgLy8gd2FzIGR5bmFtaWMsIGV2ZXJ5IHNlcXVlbmNlIHdvdWxkIGhhdmUgaGFkIHN1ZmZpY2llbnQgcGFkZGluZyB0b1xuICAgICAgICAgICAgICAgIC8vIGdlbmVyYXRlIGF0IGxlYXN0IG9uZSBuR3JhbS5cbiAgICAgICAgICAgICAgICBjb25zdCBuR3JhbVdpZHRoID0gZGF0YUxlbmd0aCArIDIgKiB0aGlzLnBhZFdpZHRoO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bU5HcmFtcyA9IDE7XG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVOR3JhbXMoZGF0YSwgc3BsaXRJbmRleCwgbkdyYW1zLCBvdXRwdXRTdGFydElkeCwgbnVtTkdyYW1zLCBuR3JhbVdpZHRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW25HcmFtcywgbkdyYW1zU3BsaXRzXTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nTkdyYW1zSW1wbChkYXRhLCBkYXRhU3BsaXRzLCBzZXBhcmF0b3IsIG5HcmFtV2lkdGhzLCBsZWZ0UGFkLCByaWdodFBhZCwgcGFkV2lkdGgsIHByZXNlcnZlU2hvcnRTZXF1ZW5jZXMpIHtcbiAgICByZXR1cm4gbmV3IFN0cmluZ05HcmFtc09wKHNlcGFyYXRvciwgbkdyYW1XaWR0aHMsIGxlZnRQYWQsIHJpZ2h0UGFkLCBwYWRXaWR0aCwgcHJlc2VydmVTaG9ydFNlcXVlbmNlcylcbiAgICAgICAgLmNvbXB1dGUoZGF0YSwgZGF0YVNwbGl0cyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdHJpbmdOR3JhbXNfaW1wbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTdHJpbmdTcGxpdCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBzdHJpbmdTcGxpdEltcGwgfSBmcm9tICcuL1N0cmluZ1NwbGl0X2ltcGwnO1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ1NwbGl0KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBza2lwRW1wdHkgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHsgaW5wdXQsIGRlbGltaXRlciB9ID0gaW5wdXRzO1xuICAgIGlmIChpbnB1dC5kdHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnB1dCBtdXN0IGJlIG9mIGRhdGF0eXBlIHN0cmluZycpO1xuICAgIH1cbiAgICBpZiAoaW5wdXQuc2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW5wdXQgbXVzdCBiZSBhIHZlY3RvciwgZ290IHNoYXBlOiAke2lucHV0LnNoYXBlfWApO1xuICAgIH1cbiAgICBpZiAoZGVsaW1pdGVyLnNoYXBlLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERlbGltaXRlciBtdXN0IGJlIGEgc2NhbGFyLCBnb3Qgc2hhcGU6ICR7ZGVsaW1pdGVyLnNoYXBlfWApO1xuICAgIH1cbiAgICBjb25zdCAkaW5wdXQgPSBiYWNrZW5kLmRhdGEuZ2V0KGlucHV0LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0ICRkZWxpbWl0ZXIgPSBiYWNrZW5kLmRhdGEuZ2V0KGRlbGltaXRlci5kYXRhSWQpLnZhbHVlc1swXTtcbiAgICBjb25zdCBbaW5kaWNlcywgdmFsdWVzLCBzaGFwZV0gPSBzdHJpbmdTcGxpdEltcGwoJGlucHV0LCAkZGVsaW1pdGVyLCBza2lwRW1wdHkpO1xuICAgIGNvbnN0IG91dHB1dFNpemUgPSB2YWx1ZXMubGVuZ3RoO1xuICAgIHJldHVybiBbXG4gICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW291dHB1dFNpemUsIDJdLCAnaW50MzInLCBpbmRpY2VzKSxcbiAgICAgICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbb3V0cHV0U2l6ZV0sICdzdHJpbmcnLCB2YWx1ZXMpLFxuICAgICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFsyXSwgJ2ludDMyJywgbmV3IEludDMyQXJyYXkoc2hhcGUpKVxuICAgIF07XG59XG5leHBvcnQgY29uc3Qgc3RyaW5nU3BsaXRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU3RyaW5nU3BsaXQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHN0cmluZ1NwbGl0LFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN0cmluZ1NwbGl0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZnVuY3Rpb24gc3BsaXQoc3RyLCBkZWxpbWl0ZXJzLCBza2lwRW1wdHkpIHtcbiAgICBpZiAoIXN0ci5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICAvLyBXaGVuIHRoZSBkZWxpbWl0ZXIgaXMgZW1wdHksIHRoZSBpbnB1dCBpcyBzcGxpdCBpbnRvIGluZGl2aWR1YWwgY2hhcmFjdGVycy5cbiAgICBpZiAoZGVsaW1pdGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5KHN0ci5sZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgcmVzdWx0W2ldID0gc3RyLnN1YmFycmF5KGksIGkgKyAxKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvLyBXaGVuIHRoZXJlIGlzIG9uZSBkZWxpbWl0ZXIsIHRoZSBpbnB1dCBpcyBzcGxpdCBvbmx5IGF0IHRoYXQgZGVsaW1pdGVyLlxuICAgIGlmIChkZWxpbWl0ZXJzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCBkZWxpbWl0ZXIgPSBkZWxpbWl0ZXJzWzBdO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgbGV0IGYgPSBzdHIuaW5kZXhPZihkZWxpbWl0ZXIpO1xuICAgICAgICB3aGlsZSAoZiAhPT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuID0gc3RyLnN1YmFycmF5KDAsIGYpO1xuICAgICAgICAgICAgaWYgKCFza2lwRW1wdHkgfHwgdG9rZW4ubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godG9rZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RyID0gc3RyLnN1YmFycmF5KGYgKyAxKTtcbiAgICAgICAgICAgIGYgPSBzdHIuaW5kZXhPZihkZWxpbWl0ZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc2tpcEVtcHR5IHx8IHN0ci5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHN0cik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLy8gV2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgZGVsaW1pdGVycywgdGhlIGlucHV0IGlzIHNwbGl0IGF0IGV2ZXJ5IGluc3RhbmNlXG4gICAgLy8gb25lIG9mIHRoZSBkZWxpbWl0ZXJzIGFwcGVhcnMuXG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgbGV0IHRva2VuU3RhcnQgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aCArIDE7IGkrKykge1xuICAgICAgICBpZiAoKGkgPT09IHN0ci5sZW5ndGgpIHx8IChkZWxpbWl0ZXJzLmluZGV4T2Yoc3RyW2ldKSAhPT0gLTEpKSB7XG4gICAgICAgICAgICBjb25zdCB0b2tlbiA9IHN0ci5zdWJhcnJheSh0b2tlblN0YXJ0LCBpKTtcbiAgICAgICAgICAgIGlmICghc2tpcEVtcHR5IHx8IHRva2VuLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRva2VuU3RhcnQgPSBpICsgMTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ1NwbGl0SW1wbChpbnB1dCwgZGVsaW1pdGVyLCBza2lwRW1wdHkpIHtcbiAgICBjb25zdCBiYXRjaFNpemUgPSBpbnB1dC5sZW5ndGg7XG4gICAgLy8gRW1wdHkgZGVsaW1pdGVyIG1lYW5zIHNwbGl0IHRoZSBpbnB1dCBjaGFyYWN0ZXIgYnkgY2hhcmFjdGVyLlxuICAgIGNvbnN0IHRva2VucyA9IFtdO1xuICAgIGxldCBvdXRwdXRTaXplID0gMDtcbiAgICBsZXQgbWF4TnVtRW50cmllcyA9IDA7XG4gICAgY29uc3QgbnVtSW5kaWNlcyA9IG5ldyBBcnJheShiYXRjaFNpemUpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmF0Y2hTaXplOyArK2kpIHtcbiAgICAgICAgY29uc3QgcGFydHMgPSBzcGxpdChpbnB1dFtpXSwgZGVsaW1pdGVyLCBza2lwRW1wdHkpO1xuICAgICAgICBjb25zdCBuRW50cmllcyA9IHBhcnRzLmxlbmd0aDtcbiAgICAgICAgbnVtSW5kaWNlc1tpXSA9IG5FbnRyaWVzO1xuICAgICAgICBvdXRwdXRTaXplICs9IG5FbnRyaWVzO1xuICAgICAgICBtYXhOdW1FbnRyaWVzID0gTWF0aC5tYXgobWF4TnVtRW50cmllcywgbkVudHJpZXMpO1xuICAgICAgICB0b2tlbnMucHVzaCguLi5wYXJ0cyk7XG4gICAgfVxuICAgIGNvbnN0IGluZGljZXMgPSB1dGlsLmdldEFycmF5RnJvbURUeXBlKCdpbnQzMicsIG91dHB1dFNpemUgKiAyKTtcbiAgICBjb25zdCB2YWx1ZXMgPSBuZXcgQXJyYXkob3V0cHV0U2l6ZSk7XG4gICAgY29uc3Qgc2hhcGUgPSBbYmF0Y2hTaXplLCBtYXhOdW1FbnRyaWVzXTtcbiAgICBsZXQgYyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiYXRjaFNpemU7ICsraSkge1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG51bUluZGljZXNbaV07ICsraikge1xuICAgICAgICAgICAgLy8gaW5kaWNlcyBpcyBhIDJkIHRlbnNvciB3aXRoIHNoYXBlIG9mIFtvdXRwdXRTaXplLCAyXVxuICAgICAgICAgICAgaW5kaWNlc1tjICogMl0gPSBpO1xuICAgICAgICAgICAgaW5kaWNlc1tjICogMiArIDFdID0gajtcbiAgICAgICAgICAgIHZhbHVlc1tjXSA9IHRva2Vuc1tjXTtcbiAgICAgICAgICAgICsrYztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW2luZGljZXMsIHZhbHVlcywgc2hhcGVdO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3RyaW5nU3BsaXRfaW1wbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTdHJpbmdUb0hhc2hCdWNrZXRGYXN0IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RJbXBsIH0gZnJvbSAnLi9TdHJpbmdUb0hhc2hCdWNrZXRGYXN0X2ltcGwnO1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3QoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IG51bUJ1Y2tldHMgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHsgaW5wdXQgfSA9IGlucHV0cztcbiAgICBpZiAoaW5wdXQuZHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW5wdXQgbXVzdCBiZSBvZiBkYXRhdHlwZSBzdHJpbmcnKTtcbiAgICB9XG4gICAgaWYgKG51bUJ1Y2tldHMgPD0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE51bWJlciBvZiBidWNrZXRzIG11c3QgYmUgYXQgbGVhc3QgMWApO1xuICAgIH1cbiAgICBjb25zdCAkaW5wdXQgPSBiYWNrZW5kLmRhdGEuZ2V0KGlucHV0LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IG91dHB1dCA9IHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RJbXBsKCRpbnB1dCwgbnVtQnVja2V0cyk7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oaW5wdXQuc2hhcGUsICdpbnQzMicsIG91dHB1dCk7XG59XG5leHBvcnQgY29uc3Qgc3RyaW5nVG9IYXNoQnVja2V0RmFzdENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTdHJpbmdUb0hhc2hCdWNrZXRGYXN0LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBzdHJpbmdUb0hhc2hCdWNrZXRGYXN0LFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN0cmluZ1RvSGFzaEJ1Y2tldEZhc3QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nVG9IYXNoQnVja2V0RmFzdEltcGwoaW5wdXQsIG51bUJ1Y2tldHMpIHtcbiAgICBjb25zdCBvdXRwdXQgPSB1dGlsLmdldEFycmF5RnJvbURUeXBlKCdpbnQzMicsIGlucHV0Lmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7ICsraSkge1xuICAgICAgICBvdXRwdXRbaV0gPVxuICAgICAgICAgICAgdXRpbC5maW5nZXJQcmludDY0KGlucHV0W2ldKS5tb2R1bG8obnVtQnVja2V0cykuZ2V0TG93Qml0c1Vuc2lnbmVkKCk7XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdHJpbmdUb0hhc2hCdWNrZXRGYXN0X2ltcGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3ViIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfaW1wbCc7XG5pbXBvcnQgeyBiaW5hcnlLZXJuZWxGdW5jLCBjcmVhdGVDb21wbGV4QmluYXJ5S2VybmVsSW1wbCB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV91dGlscyc7XG5leHBvcnQgY29uc3Qgc3ViSW1wbCA9IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwoKChhVmFsdWUsIGJWYWx1ZSkgPT4gYVZhbHVlIC0gYlZhbHVlKSk7XG5leHBvcnQgY29uc3Qgc3ViQ29tcGxleEltcGwgPSBjcmVhdGVDb21wbGV4QmluYXJ5S2VybmVsSW1wbCgoKGFSZWFsLCBhSW1hZywgYlJlYWwsIGJJbWFnKSA9PiB7XG4gICAgcmV0dXJuIHsgcmVhbDogYVJlYWwgLSBiUmVhbCwgaW1hZzogYUltYWcgLSBiSW1hZyB9O1xufSkpO1xuZXhwb3J0IGNvbnN0IHN1YiA9IGJpbmFyeUtlcm5lbEZ1bmMoU3ViLCBzdWJJbXBsLCBzdWJDb21wbGV4SW1wbCk7XG5leHBvcnQgY29uc3Qgc3ViQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFN1YixcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogc3ViXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3ViLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgU3VtLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyB6ZXJvcyB9IGZyb20gJy4uL3V0aWxzL3plcm9zX2ltcGwnO1xuaW1wb3J0IHsgY2FzdCB9IGZyb20gJy4vQ2FzdCc7XG5pbXBvcnQgeyBpZGVudGl0eSB9IGZyb20gJy4vSWRlbnRpdHknO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQgeyB0cmFuc3Bvc2UgfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5leHBvcnQgZnVuY3Rpb24gc3VtKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBheGlzLCBrZWVwRGltcyB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnc3VtJyk7XG4gICAgbGV0ICR4O1xuICAgIGlmICh4LmR0eXBlID09PSAnYm9vbCcpIHtcbiAgICAgICAgJHggPSBjYXN0KHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCwgYXR0cnM6IHsgZHR5cGU6ICdpbnQzMicgfSB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgICR4ID0gaWRlbnRpdHkoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kIH0pO1xuICAgIH1cbiAgICBjb25zdCB4UmFuayA9ICR4LnNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBheGVzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShheGlzLCAkeC5zaGFwZSk7XG4gICAgY29uc3QgcGVybXV0YXRpb24gPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKGF4ZXMsIHhSYW5rKTtcbiAgICBsZXQgcmVkdWN0aW9uQXhlcyA9IGF4ZXM7XG4gICAgbGV0IHBlcm11dGVkWCA9ICR4O1xuICAgIGlmIChwZXJtdXRhdGlvbiAhPSBudWxsKSB7XG4gICAgICAgIHBlcm11dGVkWCA9XG4gICAgICAgICAgICB0cmFuc3Bvc2UoeyBpbnB1dHM6IHsgeDogJHggfSwgYmFja2VuZCwgYXR0cnM6IHsgcGVybTogcGVybXV0YXRpb24gfSB9KTtcbiAgICAgICAgcmVkdWN0aW9uQXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRJbm5lck1vc3RBeGVzKHJlZHVjdGlvbkF4ZXMubGVuZ3RoLCB4UmFuayk7XG4gICAgfVxuICAgIGJhY2tlbmRfdXRpbC5hc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcygnc3VtJywgcmVkdWN0aW9uQXhlcywgcGVybXV0ZWRYLnNoYXBlLmxlbmd0aCk7XG4gICAgY29uc3QgW291dFNoYXBlLCByZWR1Y2VTaGFwZV0gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcyhwZXJtdXRlZFguc2hhcGUsIHJlZHVjdGlvbkF4ZXMpO1xuICAgIGNvbnN0IHJlc3VsdER0eXBlID0gYmFja2VuZF91dGlsLnVwY2FzdFR5cGUocGVybXV0ZWRYLmR0eXBlLCAnaW50MzInKTtcbiAgICBsZXQgcmVzdWx0ID0gemVyb3MoYmFja2VuZCwgb3V0U2hhcGUsIHJlc3VsdER0eXBlKTtcbiAgICBjb25zdCByZWR1Y2VTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcbiAgICBjb25zdCB2YWxzID0gYmFja2VuZC5kYXRhLmdldChyZXN1bHQuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgYVZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHBlcm11dGVkWC5kYXRhSWQpLnZhbHVlcztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gaSAqIHJlZHVjZVNpemU7XG4gICAgICAgIGxldCBzdW0gPSAwO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJlZHVjZVNpemU7ICsraikge1xuICAgICAgICAgICAgc3VtICs9IGFWYWxzW29mZnNldCArIGpdO1xuICAgICAgICB9XG4gICAgICAgIHZhbHNbaV0gPSBzdW07XG4gICAgfVxuICAgIGlmIChrZWVwRGltcykge1xuICAgICAgICBjb25zdCBuZXdTaGFwZSA9IGJhY2tlbmRfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbShyZXN1bHQuc2hhcGUsIGF4ZXMpO1xuICAgICAgICBjb25zdCBvbGRSZXN1bHQgPSByZXN1bHQ7XG4gICAgICAgIHJlc3VsdCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogcmVzdWx0IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBuZXdTaGFwZSB9IH0pO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG9sZFJlc3VsdCk7XG4gICAgfVxuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oJHgpO1xuICAgIGlmIChwZXJtdXRhdGlvbiAhPSBudWxsKSB7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocGVybXV0ZWRYKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBjb25zdCBzdW1Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU3VtLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBzdW1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdW0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFRhbiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgdGFuID0gdW5hcnlLZXJuZWxGdW5jKFRhbiwgKHhpKSA9PiBNYXRoLnRhbih4aSkpO1xuZXhwb3J0IGNvbnN0IHRhbkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBUYW4sXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHRhbixcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1UYW4uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFRhbmggfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IHRhbmggPSB1bmFyeUtlcm5lbEZ1bmMoVGFuaCwgKHhpKSA9PiBNYXRoLnRhbmgoeGkpKTtcbmV4cG9ydCBjb25zdCB0YW5oQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFRhbmgsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHRhbmgsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VGFuaC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBUaWxlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyB0aWxlSW1wbCB9IGZyb20gJy4vVGlsZV9pbXBsJztcbmV4cG9ydCBmdW5jdGlvbiB0aWxlKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyByZXBzIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KHgsICd0aWxlJyk7XG4gICAgY29uc3Qgb3V0QnVmID0gdGlsZUltcGwoYmFja2VuZC5idWZmZXJTeW5jKHgpLCByZXBzKTtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRCdWYuc2hhcGUsIG91dEJ1Zi5kdHlwZSwgb3V0QnVmLnZhbHVlcyk7XG59XG5leHBvcnQgY29uc3QgdGlsZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBUaWxlLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiB0aWxlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VGlsZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBidWZmZXIgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuLyoqXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdGlsZSBrZXJuZWwgc2hhcmVkIGJldHdlZW4gd2ViZ2wgYW5kIGNwdSBmb3Igc3RyaW5nXG4gKiB0ZW5zb3JzIG9ubHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aWxlSW1wbCh4QnVmLCByZXBzKSB7XG4gICAgY29uc3QgbmV3U2hhcGUgPSBuZXcgQXJyYXkoeEJ1Zi5yYW5rKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld1NoYXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG5ld1NoYXBlW2ldID0geEJ1Zi5zaGFwZVtpXSAqIHJlcHNbaV07XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGJ1ZmZlcihuZXdTaGFwZSwgeEJ1Zi5kdHlwZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHQudmFsdWVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IG5ld0xvYyA9IHJlc3VsdC5pbmRleFRvTG9jKGkpO1xuICAgICAgICBjb25zdCBvcmlnaW5hbExvYyA9IG5ldyBBcnJheSh4QnVmLnJhbmspO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG9yaWdpbmFsTG9jLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBvcmlnaW5hbExvY1tqXSA9IG5ld0xvY1tqXSAlIHhCdWYuc2hhcGVbal07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3JpZ2luYWxJbmRleCA9IHhCdWYubG9jVG9JbmRleChvcmlnaW5hbExvYyk7XG4gICAgICAgIHJlc3VsdC52YWx1ZXNbaV0gPSB4QnVmLnZhbHVlc1tvcmlnaW5hbEluZGV4XTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRpbGVfaW1wbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBUb3BLIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyB0b3BLSW1wbCB9IGZyb20gJy4vVG9wS19pbXBsJztcbmV4cG9ydCBmdW5jdGlvbiB0b3BLKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBrLCBzb3J0ZWQgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ3RvcGsnKTtcbiAgICBjb25zdCB4VmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBbYWxsVG9wS1ZhbHMsIGFsbFRvcEtJbmRpY2VzXSA9IHRvcEtJbXBsKHhWYWxzLCB4LnNoYXBlLCB4LmR0eXBlLCBrLCBzb3J0ZWQpO1xuICAgIHJldHVybiBbXG4gICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oYWxsVG9wS1ZhbHMuc2hhcGUsIGFsbFRvcEtWYWxzLmR0eXBlLCBhbGxUb3BLVmFscy52YWx1ZXMpLFxuICAgICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGFsbFRvcEtJbmRpY2VzLnNoYXBlLCBhbGxUb3BLSW5kaWNlcy5kdHlwZSwgYWxsVG9wS0luZGljZXMudmFsdWVzKVxuICAgIF07XG59XG5leHBvcnQgY29uc3QgdG9wS0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBUb3BLLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiB0b3BLXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VG9wSy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vKiogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRvcEsga2VybmVsIHNoYXJlZCBiZXR3ZWVuIHdlYmdsIGFuZCBjcHUuICovXG5pbXBvcnQgeyBidWZmZXIsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuY29uc3QgY29tcGFyZVBhaXIgPSAoYSwgYikgPT4ge1xuICAgIGNvbnN0IHZhbHVlRGlmZiA9IGIudmFsdWUgLSBhLnZhbHVlO1xuICAgIHJldHVybiB2YWx1ZURpZmYgPT09IDAgPyBhLmluZGV4IC0gYi5pbmRleCA6IHZhbHVlRGlmZjtcbn07XG4vKipcbiAqIFBhcnRpdGlvbnMgYXJyYXkgd2hlcmUgYWxsIGVsZW1lbnRzIHNtYWxsZXIgdGhhbiB0aGUgKGsrMSkgc21hbGxlc3QgZWxlbWVudFxuICogYXJlIGZvdW5kIHRvIHRoZSBsZWZ0IG9mIGl0LCBhbmQgYWxsIGxhcmdlciB0byB0aGUgcmlnaHQgb2YgaXQuXG4gKiBCYXNlZCBvbiB0aGUgRmxveWQtUml2ZXN0IEFsZ29yaXRobSwgcmVmOlxuICogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRmxveWQlRTIlODAlOTNSaXZlc3RfYWxnb3JpdGhtXG4gKiBAcGFyYW0gYXJyYXk6IEFycmF5IHRvIHBhcnRpdGlvblxuICogQHBhcmFtIGxlZnQ6IExlZnQgaW5kZXggZm9yIHRoZSBpbnRlcnZhbFxuICogQHBhcmFtIHJpZ2h0OiBSaWdodCBpbmRleCBmb3IgdGhlIGludGVydmFsXG4gKiBAcGFyYW0gazogRGVzaXJlZCBpbmRleCB2YWx1ZSwgd2hlcmUgYXJyYXlba10gaXMgdGhlIChrKzEpdGggc21hbGxlc3QgZWxlbWVudFxuICogICAgICAgICAgIHdoZW4gbGVmdCA9IDBcbiAqL1xuZnVuY3Rpb24gc2VsZWN0KGFycmF5LCBrLCBsZWZ0ID0gMCwgcmlnaHQgPSBhcnJheS5sZW5ndGggLSAxKSB7XG4gICAgd2hpbGUgKHJpZ2h0ID4gbGVmdCkge1xuICAgICAgICAvLyBVc2Ugc2VsZWN0IHJlY3Vyc2l2ZWx5IHRvIHNhbXBsZSBhIHNtYWxsZXIgc2V0IG9mIHNpemUgc1xuICAgICAgICAvLyB0aGUgYXJiaXRyYXJ5IGNvbnN0YW50cyA2MDAgYW5kIDAuNSBhcmUgdXNlZCBpbiB0aGUgb3JpZ2luYWxcbiAgICAgICAgLy8gdmVyc2lvbiB0byBtaW5pbWl6ZSBleGVjdXRpb24gdGltZS5cbiAgICAgICAgaWYgKHJpZ2h0IC0gbGVmdCA+IDYwMCkge1xuICAgICAgICAgICAgY29uc3QgbiA9IHJpZ2h0IC0gbGVmdCArIDE7XG4gICAgICAgICAgICBjb25zdCBpID0gayAtIGxlZnQgKyAxO1xuICAgICAgICAgICAgY29uc3QgeiA9IE1hdGgubG9nKG4pO1xuICAgICAgICAgICAgY29uc3QgcyA9IDAuNSAqIE1hdGguZXhwKDIgKiB6IC8gMyk7XG4gICAgICAgICAgICBjb25zdCBzZCA9IDAuNSAqIE1hdGguc3FydCh6ICogcyAqIChuIC0gcykgLyBuKSAqIE1hdGguc2lnbihpIC0gbiAvIDIpO1xuICAgICAgICAgICAgY29uc3QgbmV3TGVmdCA9IE1hdGgubWF4KGxlZnQsIE1hdGguZmxvb3IoayAtIGkgKiBzIC8gbiArIHNkKSk7XG4gICAgICAgICAgICBjb25zdCBuZXdSaWdodCA9IE1hdGgubWluKHJpZ2h0LCBNYXRoLmZsb29yKGsgKyAobiAtIGkpICogcyAvIG4gKyBzZCkpO1xuICAgICAgICAgICAgc2VsZWN0KGFycmF5LCBrLCBuZXdMZWZ0LCBuZXdSaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcGFydGl0aW9uIHRoZSBlbGVtZW50cyBiZXR3ZWVuIGxlZnQgYW5kIHJpZ2h0IGFyb3VuZCB0XG4gICAgICAgIGNvbnN0IHQgPSBhcnJheVtrXTtcbiAgICAgICAgbGV0IGkgPSBsZWZ0O1xuICAgICAgICBsZXQgaiA9IHJpZ2h0O1xuICAgICAgICB1dGlsLnN3YXAoYXJyYXksIGxlZnQsIGspO1xuICAgICAgICBpZiAoY29tcGFyZVBhaXIoYXJyYXlbcmlnaHRdLCB0KSA+IDApIHtcbiAgICAgICAgICAgIHV0aWwuc3dhcChhcnJheSwgbGVmdCwgcmlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChpIDwgaikge1xuICAgICAgICAgICAgdXRpbC5zd2FwKGFycmF5LCBpLCBqKTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIGotLTtcbiAgICAgICAgICAgIHdoaWxlIChjb21wYXJlUGFpcihhcnJheVtpXSwgdCkgPCAwKSB7XG4gICAgICAgICAgICAgICAgaSA9IGkgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2hpbGUgKGNvbXBhcmVQYWlyKGFycmF5W2pdLCB0KSA+IDApIHtcbiAgICAgICAgICAgICAgICBqID0gaiAtIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbXBhcmVQYWlyKGFycmF5W2xlZnRdLCB0KSA9PT0gMCkge1xuICAgICAgICAgICAgdXRpbC5zd2FwKGFycmF5LCBsZWZ0LCBqKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGogPSBqICsgMTtcbiAgICAgICAgICAgIHV0aWwuc3dhcChhcnJheSwgaiwgcmlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFkanVzdCBsZWZ0IGFuZCByaWdodCB0b3dhcmRzIHRoZSBib3VuZGFyaWVzIG9mIHRoZSBzdWJzZXRcbiAgICAgICAgLy8gY29udGFpbmluZyB0aGUgKGsgLSBsZWZ0ICsgMSl0aCBzbWFsbGVzdCBlbGVtZW50LlxuICAgICAgICBpZiAoaiA8PSBrKSB7XG4gICAgICAgICAgICBsZWZ0ID0gaiArIDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGsgPD0gaikge1xuICAgICAgICAgICAgcmlnaHQgPSBqIC0gMTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiB0b3BLSW1wbCh4LCB4U2hhcGUsIHhEdHlwZSwgaywgc29ydGVkKSB7XG4gICAgLy8gUmVzaGFwZSBpbnRvIGEgMmQgdGVuc29yIFtiYXRjaCwgbGFzdERpbV0gYW5kIGNvbXB1dGUgdG9wayBhbG9uZyBsYXN0RGltLlxuICAgIGNvbnN0IGxhc3REaW0gPSB4U2hhcGVbeFNoYXBlLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IFtiYXRjaCwgc2l6ZV0gPSBbeC5sZW5ndGggLyBsYXN0RGltLCBsYXN0RGltXTtcbiAgICBjb25zdCBhbGxUb3BLVmFscyA9IHV0aWwuZ2V0VHlwZWRBcnJheUZyb21EVHlwZSh4RHR5cGUsIGJhdGNoICogayk7XG4gICAgY29uc3QgYWxsVG9wS0luZGljZXMgPSB1dGlsLmdldFR5cGVkQXJyYXlGcm9tRFR5cGUoJ2ludDMyJywgYmF0Y2ggKiBrKTtcbiAgICBmb3IgKGxldCBiID0gMDsgYiA8IGJhdGNoOyBiKyspIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYiAqIHNpemU7XG4gICAgICAgIGNvbnN0IHZhbHMgPSB4LnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgc2l6ZSk7XG4gICAgICAgIGxldCB2YWxBbmRJbmQgPSBuZXcgQXJyYXkodmFscy5sZW5ndGgpO1xuICAgICAgICB2YWxzLmZvckVhY2goKHZhbHVlLCBpbmRleCkgPT4gdmFsQW5kSW5kW2luZGV4XSA9IHsgdmFsdWUsIGluZGV4IH0pO1xuICAgICAgICBpZiAoayA8IHZhbEFuZEluZC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHNlbGVjdCh2YWxBbmRJbmQsIGspO1xuICAgICAgICAgICAgdmFsQW5kSW5kID0gdmFsQW5kSW5kLnNsaWNlKDAsIGspO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzb3J0ZWQpIHtcbiAgICAgICAgICAgIHZhbEFuZEluZC5zb3J0KGNvbXBhcmVQYWlyKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvdXRPZmZzZXQgPSBiICogaztcbiAgICAgICAgY29uc3QgdG9wS1ZhbHMgPSBhbGxUb3BLVmFscy5zdWJhcnJheShvdXRPZmZzZXQsIG91dE9mZnNldCArIGspO1xuICAgICAgICBjb25zdCB0b3BLSW5kaWNlcyA9IGFsbFRvcEtJbmRpY2VzLnN1YmFycmF5KG91dE9mZnNldCwgb3V0T2Zmc2V0ICsgayk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgazsgaSsrKSB7XG4gICAgICAgICAgICB0b3BLVmFsc1tpXSA9IHZhbEFuZEluZFtpXS52YWx1ZTtcbiAgICAgICAgICAgIHRvcEtJbmRpY2VzW2ldID0gdmFsQW5kSW5kW2ldLmluZGV4O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFJlc2hhcGUgYmFjayB0byB0aGUgb3JpZ2luYWwgaW5wdXQgc2hhcGUsIGV4Y2VwdCB0aGF0IHRoZSBsYXN0XG4gICAgLy8gZGltZW5zaW9uIGlzIGsuXG4gICAgY29uc3Qgb3V0cHV0U2hhcGUgPSB4U2hhcGUuc2xpY2UoKTtcbiAgICBvdXRwdXRTaGFwZVtvdXRwdXRTaGFwZS5sZW5ndGggLSAxXSA9IGs7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgYnVmZmVyKG91dHB1dFNoYXBlLCB4RHR5cGUsIGFsbFRvcEtWYWxzKSxcbiAgICAgICAgYnVmZmVyKG91dHB1dFNoYXBlLCAnaW50MzInLCBhbGxUb3BLSW5kaWNlcylcbiAgICBdO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VG9wS19pbXBsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFRyYW5zZm9ybSwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYXR0cnMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBpbWFnZSwgdHJhbnNmb3JtcyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgaW50ZXJwb2xhdGlvbiwgZmlsbE1vZGUsIGZpbGxWYWx1ZSwgb3V0cHV0U2hhcGUgfSA9IGF0dHJzO1xuICAgIGNvbnN0IFtiYXRjaCwgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIG51bUNoYW5uZWxzXSA9IGltYWdlLnNoYXBlO1xuICAgIGNvbnN0IFtvdXRIZWlnaHQsIG91dFdpZHRoXSA9IG91dHB1dFNoYXBlICE9IG51bGwgPyBvdXRwdXRTaGFwZSA6IFtpbWFnZUhlaWdodCwgaW1hZ2VXaWR0aF07XG4gICAgY29uc3Qgb3V0U2hhcGUgPSBbYmF0Y2gsIG91dEhlaWdodCwgb3V0V2lkdGgsIG51bUNoYW5uZWxzXTtcbiAgICBjb25zdCBzdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhpbWFnZS5zaGFwZSk7XG4gICAgY29uc3QgYmF0Y2hTdHJpZGUgPSBzdHJpZGVzWzBdO1xuICAgIGNvbnN0IHJvd1N0cmlkZSA9IHN0cmlkZXNbMV07XG4gICAgY29uc3QgY29sU3RyaWRlID0gc3RyaWRlc1syXTtcbiAgICBjb25zdCBvdXRWYWxzID0gdXRpbC5nZXRUeXBlZEFycmF5RnJvbURUeXBlKGltYWdlLmR0eXBlLCB1dGlsLnNpemVGcm9tU2hhcGUob3V0U2hhcGUpKTtcbiAgICBvdXRWYWxzLmZpbGwoZmlsbFZhbHVlKTtcbiAgICBjb25zdCBpbWFnZVZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KGltYWdlLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHRyYW5zZm9ybVZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHRyYW5zZm9ybXMuZGF0YUlkKS52YWx1ZXM7XG4gICAgLy8gUmVmIFRGIGltcGxlbWVudGF0aW9uOlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmZsb3cvYmxvYi9tYXN0ZXIvdGVuc29yZmxvdy9jb3JlL2tlcm5lbHMvaW1hZ2UvaW1hZ2Vfb3BzLmhcbiAgICBmb3IgKGxldCBiID0gMDsgYiA8IGJhdGNoOyArK2IpIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gdHJhbnNmb3Jtcy5zaGFwZVswXSA9PT0gMSA/XG4gICAgICAgICAgICB0cmFuc2Zvcm1WYWxzIDpcbiAgICAgICAgICAgIHRyYW5zZm9ybVZhbHMuc3ViYXJyYXkoYiAqIDgsIGIgKiA4ICsgOCk7XG4gICAgICAgIGZvciAobGV0IG91dFkgPSAwOyBvdXRZIDwgb3V0SGVpZ2h0OyArK291dFkpIHtcbiAgICAgICAgICAgIGZvciAobGV0IG91dFggPSAwOyBvdXRYIDwgb3V0V2lkdGg7ICsrb3V0WCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgbnVtQ2hhbm5lbHM7ICsrY2hhbm5lbCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9qZWN0aW9uID0gdHJhbnNmb3JtWzZdICogb3V0WCArIHRyYW5zZm9ybVs3XSAqIG91dFkgKyAxO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvamVjdGlvbiA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBmaWxsIHZhbHVlIGZvciBpbmZpbml0ZSBjb29yZGluYXRlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGFyZSBvdXRzaWRlIHRoZSBpbnB1dCBpbWFnZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5YID0gKHRyYW5zZm9ybVswXSAqIG91dFggKyB0cmFuc2Zvcm1bMV0gKiBvdXRZICsgdHJhbnNmb3JtWzJdKSAvXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0aW9uO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpblkgPSAodHJhbnNmb3JtWzNdICogb3V0WCArIHRyYW5zZm9ybVs0XSAqIG91dFkgKyB0cmFuc2Zvcm1bNV0pIC9cbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3Rpb247XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHggPSBtYXBDb29yZChpblgsIGltYWdlV2lkdGgsIGZpbGxNb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeSA9IG1hcENvb3JkKGluWSwgaW1hZ2VIZWlnaHQsIGZpbGxNb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChpbnRlcnBvbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICduZWFyZXN0JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBuZWFyZXN0SW50ZXJwb2xhdGlvbihpbWFnZVZhbHMsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBiYXRjaFN0cmlkZSwgcm93U3RyaWRlLCBjb2xTdHJpZGUsIGIsIHksIHgsIGNoYW5uZWwsIGZpbGxWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdiaWxpbmVhcic6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gYmlsaW5lYXJJbnRlcnBvbGF0aW9uKGltYWdlVmFscywgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIGJhdGNoU3RyaWRlLCByb3dTdHJpZGUsIGNvbFN0cmlkZSwgYiwgeSwgeCwgY2hhbm5lbCwgZmlsbFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBpbiBUcmFuc2Zvcm06IEV4cGVjdCAnbmVhcmVzdCcgb3IgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAnYmlsaW5lYXInLCBidXQgZ290ICR7aW50ZXJwb2xhdGlvbn1gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmQgPSBiICogYmF0Y2hTdHJpZGUgKyBvdXRZICogcm93U3RyaWRlICsgb3V0WCAqIGNvbFN0cmlkZSArIGNoYW5uZWw7XG4gICAgICAgICAgICAgICAgICAgIG91dFZhbHNbaW5kXSA9IHZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0U2hhcGUsIGltYWdlLmR0eXBlLCBvdXRWYWxzKTtcbiAgICB9XG4gICAgY29uc3QgZGF0YUlkID0gYmFja2VuZC53cml0ZShvdXRWYWxzLCBvdXRTaGFwZSwgaW1hZ2UuZHR5cGUpO1xuICAgIHJldHVybiB7IGRhdGFJZCwgc2hhcGU6IGltYWdlLnNoYXBlLCBkdHlwZTogaW1hZ2UuZHR5cGUgfTtcbn1cbmV4cG9ydCBjb25zdCB0cmFuc2Zvcm1Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogVHJhbnNmb3JtLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiB0cmFuc2Zvcm1cbn07XG5mdW5jdGlvbiBtYXBDb29yZChvdXRDb29yZCwgbGVuLCBtb2RlKSB7XG4gICAgc3dpdGNoIChtb2RlKSB7XG4gICAgICAgIGNhc2UgJ3JlZmxlY3QnOlxuICAgICAgICAgICAgcmV0dXJuIG1hcENvb3JkUmVmbGVjdChvdXRDb29yZCwgbGVuKTtcbiAgICAgICAgY2FzZSAnd3JhcCc6XG4gICAgICAgICAgICByZXR1cm4gbWFwQ29vcmRXcmFwKG91dENvb3JkLCBsZW4pO1xuICAgICAgICBjYXNlICduZWFyZXN0JzpcbiAgICAgICAgICAgIHJldHVybiBtYXBDb29yZE5lYXJlc3Qob3V0Q29vcmQsIGxlbik7XG4gICAgICAgIGNhc2UgJ2NvbnN0YW50JzpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBtYXBDb29yZENvbnN0YW50KG91dENvb3JkLCBsZW4pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG1hcENvb3JkUmVmbGVjdChvdXRDb29yZCwgbGVuKSB7XG4gICAgLy8gUmVmbGVjdCBbYWJjZF0gdG8gW2RjYmF8YWJjZHxkY2JhXS5cbiAgICBsZXQgaW5Db29yZCA9IG91dENvb3JkO1xuICAgIGlmIChpbkNvb3JkIDwgMCkge1xuICAgICAgICBpZiAobGVuIDw9IDEpIHtcbiAgICAgICAgICAgIGluQ29vcmQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc3oyID0gMiAqIGxlbjtcbiAgICAgICAgICAgIGlmIChpbkNvb3JkIDwgc3oyKSB7XG4gICAgICAgICAgICAgICAgaW5Db29yZCA9IHN6MiAqIE1hdGgudHJ1bmMoLWluQ29vcmQgLyBzejIpICsgaW5Db29yZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGluQ29vcmQgPSBpbkNvb3JkIDwgLWxlbiA/IGluQ29vcmQgKyBzejIgOiAtaW5Db29yZCAtIDE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoaW5Db29yZCA+IGxlbiAtIDEpIHtcbiAgICAgICAgaWYgKGxlbiA8PSAxKSB7XG4gICAgICAgICAgICBpbkNvb3JkID0gMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHN6MiA9IDIgKiBsZW47XG4gICAgICAgICAgICBpbkNvb3JkIC09IHN6MiAqIE1hdGgudHJ1bmMoaW5Db29yZCAvIHN6Mik7XG4gICAgICAgICAgICBpZiAoaW5Db29yZCA+PSBsZW4pIHtcbiAgICAgICAgICAgICAgICBpbkNvb3JkID0gc3oyIC0gaW5Db29yZCAtIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gY2xhbXAgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2hlbiBvdXRDb29yZCA9IDMuNSBhbmQgbGVuID0gNCxcbiAgICAvLyBpbkNvb3JkID0gMy41IGFuZCB3aWxsIGJlIHJvdW5kZWQgdG8gNCBpbiBuZWFyZXN0IGludGVycG9sYXRpb24uXG4gICAgcmV0dXJuIHV0aWwuY2xhbXAoMCwgaW5Db29yZCwgbGVuIC0gMSk7XG59XG5mdW5jdGlvbiBtYXBDb29yZFdyYXAob3V0Q29vcmQsIGxlbikge1xuICAgIC8vIFdyYXAgW2FiY2RdIHRvIFthYmNkfGFiY2R8YWJjZF0uXG4gICAgbGV0IGluQ29vcmQgPSBvdXRDb29yZDtcbiAgICBpZiAoaW5Db29yZCA8IDApIHtcbiAgICAgICAgaWYgKGxlbiA8PSAxKSB7XG4gICAgICAgICAgICBpbkNvb3JkID0gMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHN6ID0gbGVuIC0gMTtcbiAgICAgICAgICAgIGluQ29vcmQgKz0gbGVuICogKE1hdGgudHJ1bmMoLWluQ29vcmQgLyBzeikgKyAxKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChpbkNvb3JkID4gbGVuIC0gMSkge1xuICAgICAgICBpZiAobGVuIDw9IDEpIHtcbiAgICAgICAgICAgIGluQ29vcmQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc3ogPSBsZW4gLSAxO1xuICAgICAgICAgICAgaW5Db29yZCAtPSBsZW4gKiBNYXRoLnRydW5jKGluQ29vcmQgLyBzeik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gY2xhbXAgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2hlbiBvdXRDb29yZCA9IC0wLjUgYW5kIGxlbiA9IDQsXG4gICAgLy8gaW5Db29yZCA9IDMuNSBhbmQgd2lsbCBiZSByb3VuZGVkIHRvIDQgaW4gbmVhcmVzdCBpbnRlcnBvbGF0aW9uLlxuICAgIHJldHVybiB1dGlsLmNsYW1wKDAsIGluQ29vcmQsIGxlbiAtIDEpO1xufVxuZnVuY3Rpb24gbWFwQ29vcmRDb25zdGFudChvdXRDb29yZCwgbGVuKSB7XG4gICAgcmV0dXJuIG91dENvb3JkO1xufVxuZnVuY3Rpb24gbWFwQ29vcmROZWFyZXN0KG91dENvb3JkLCBsZW4pIHtcbiAgICByZXR1cm4gdXRpbC5jbGFtcCgwLCBvdXRDb29yZCwgbGVuIC0gMSk7XG59XG5mdW5jdGlvbiByZWFkV2l0aEZpbGxWYWx1ZShpbWFnZVZhbHMsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBiYXRjaFN0cmlkZSwgcm93U3RyaWRlLCBjb2xTdHJpZGUsIGJhdGNoLCB5LCB4LCBjaGFubmVsLCBmaWxsVmFsdWUpIHtcbiAgICBjb25zdCBpbmQgPSBiYXRjaCAqIGJhdGNoU3RyaWRlICsgeSAqIHJvd1N0cmlkZSArIHggKiBjb2xTdHJpZGUgKyBjaGFubmVsO1xuICAgIGlmICgwIDw9IHkgJiYgeSA8IGltYWdlSGVpZ2h0ICYmIDAgPD0geCAmJiB4IDwgaW1hZ2VXaWR0aCkge1xuICAgICAgICByZXR1cm4gaW1hZ2VWYWxzW2luZF07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gZmlsbFZhbHVlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG5lYXJlc3RJbnRlcnBvbGF0aW9uKGltYWdlVmFscywgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIGJhdGNoU3RyaWRlLCByb3dTdHJpZGUsIGNvbFN0cmlkZSwgYmF0Y2gsIHksIHgsIGNoYW5uZWwsIGZpbGxWYWx1ZSkge1xuICAgIGNvbnN0ICR5ID0gTWF0aC5yb3VuZCh5KTtcbiAgICBjb25zdCAkeCA9IE1hdGgucm91bmQoeCk7XG4gICAgcmV0dXJuIHJlYWRXaXRoRmlsbFZhbHVlKGltYWdlVmFscywgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIGJhdGNoU3RyaWRlLCByb3dTdHJpZGUsIGNvbFN0cmlkZSwgYmF0Y2gsICR5LCAkeCwgY2hhbm5lbCwgZmlsbFZhbHVlKTtcbn1cbmZ1bmN0aW9uIGJpbGluZWFySW50ZXJwb2xhdGlvbihpbWFnZVZhbHMsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBiYXRjaFN0cmlkZSwgcm93U3RyaWRlLCBjb2xTdHJpZGUsIGJhdGNoLCB5LCB4LCBjaGFubmVsLCBmaWxsVmFsdWUpIHtcbiAgICBjb25zdCB5Rmxvb3IgPSBNYXRoLmZsb29yKHkpO1xuICAgIGNvbnN0IHhGbG9vciA9IE1hdGguZmxvb3IoeCk7XG4gICAgY29uc3QgeUNlaWwgPSB5Rmxvb3IgKyAxO1xuICAgIGNvbnN0IHhDZWlsID0geEZsb29yICsgMTtcbiAgICAvLyBmKHgsIHlGbG9vcikgPSAoeENlaWwgLSB4KSAvICh4Q2VpbCAtIHhGbG9vcikgKiBmKHhGbG9vciwgeUZsb29yKVxuICAgIC8vICAgICAgICAgICAgICAgKyAoeCAtIHhGbG9vcikgLyAoeENlaWwgLSB4Rmxvb3IpICogZih4Q2VpbCwgeUZsb29yKVxuICAgIGNvbnN0IHZhbHVlWUZsb29yID0gKHhDZWlsIC0geCkgKlxuICAgICAgICByZWFkV2l0aEZpbGxWYWx1ZShpbWFnZVZhbHMsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBiYXRjaFN0cmlkZSwgcm93U3RyaWRlLCBjb2xTdHJpZGUsIGJhdGNoLCB5Rmxvb3IsIHhGbG9vciwgY2hhbm5lbCwgZmlsbFZhbHVlKSArXG4gICAgICAgICh4IC0geEZsb29yKSAqXG4gICAgICAgICAgICByZWFkV2l0aEZpbGxWYWx1ZShpbWFnZVZhbHMsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBiYXRjaFN0cmlkZSwgcm93U3RyaWRlLCBjb2xTdHJpZGUsIGJhdGNoLCB5Rmxvb3IsIHhDZWlsLCBjaGFubmVsLCBmaWxsVmFsdWUpO1xuICAgIC8vIGYoeCwgeUNlaWwpID0gKHhDZWlsIC0geCkgLyAoeENlaWwgLSB4Rmxvb3IpICogZih4Rmxvb3IsIHlDZWlsKVxuICAgIC8vICAgICAgICAgICAgICsgKHggLSB4Rmxvb3IpIC8gKHhDZWlsIC0geEZsb29yKSAqIGYoeENlaWwsIHlDZWlsKVxuICAgIGNvbnN0IHZhbHVlWUNlaWwgPSAoeENlaWwgLSB4KSAqXG4gICAgICAgIHJlYWRXaXRoRmlsbFZhbHVlKGltYWdlVmFscywgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIGJhdGNoU3RyaWRlLCByb3dTdHJpZGUsIGNvbFN0cmlkZSwgYmF0Y2gsIHlDZWlsLCB4Rmxvb3IsIGNoYW5uZWwsIGZpbGxWYWx1ZSkgK1xuICAgICAgICAoeCAtIHhGbG9vcikgKlxuICAgICAgICAgICAgcmVhZFdpdGhGaWxsVmFsdWUoaW1hZ2VWYWxzLCBpbWFnZUhlaWdodCwgaW1hZ2VXaWR0aCwgYmF0Y2hTdHJpZGUsIHJvd1N0cmlkZSwgY29sU3RyaWRlLCBiYXRjaCwgeUNlaWwsIHhDZWlsLCBjaGFubmVsLCBmaWxsVmFsdWUpO1xuICAgIC8vIGYoeCwgeSkgPSAoeUNlaWwgLSB5KSAvICh5Q2VpbCAtIHlGbG9vcikgKiBmKHgsIHlGbG9vcilcbiAgICAvLyAgICAgICAgICsgKHkgLSB5Rmxvb3IpIC8gKHlDZWlsIC0geUZsb29yKSAqIGYoeCwgeUNlaWwpXG4gICAgcmV0dXJuICh5Q2VpbCAtIHkpICogdmFsdWVZRmxvb3IgKyAoeSAtIHlGbG9vcikgKiB2YWx1ZVlDZWlsO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VHJhbnNmb3JtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFRyYW5zcG9zZSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHsgdHJhbnNwb3NlSW1wbCB9IGZyb20gJy4vVHJhbnNwb3NlX2ltcGwnO1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zcG9zZShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGF0dHJzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgcGVybSB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleCh4LCAndHJhbnNwb3NlJyk7XG4gICAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBuZXdTaGFwZSA9IG5ldyBBcnJheSh4UmFuayk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdTaGFwZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBuZXdTaGFwZVtpXSA9IHguc2hhcGVbcGVybVtpXV07XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCByZXN1bHQgPSB0cmFuc3Bvc2VJbXBsKHZhbHVlcywgeC5zaGFwZSwgeC5kdHlwZSwgcGVybSwgbmV3U2hhcGUpO1xuICAgIGNvbnN0IGRhdGFJZCA9IGJhY2tlbmQud3JpdGUocmVzdWx0LCBuZXdTaGFwZSwgeC5kdHlwZSk7XG4gICAgcmV0dXJuIHsgZGF0YUlkLCBzaGFwZTogbmV3U2hhcGUsIGR0eXBlOiB4LmR0eXBlIH07XG59XG5leHBvcnQgY29uc3QgdHJhbnNwb3NlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFRyYW5zcG9zZSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogdHJhbnNwb3NlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VHJhbnNwb3NlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zcG9zZUltcGwoeFZhbHMsIHhTaGFwZSwgZHR5cGUsIHBlcm0sIG5ld1NoYXBlKSB7XG4gICAgY29uc3QgeFJhbmsgPSB4U2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IHhTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHhTaGFwZSk7XG4gICAgY29uc3QgeFN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKHhTaGFwZSk7XG4gICAgY29uc3QgbmV3U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMobmV3U2hhcGUpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHV0aWwuZ2V0VHlwZWRBcnJheUZyb21EVHlwZShkdHlwZSwgdXRpbC5zaXplRnJvbVNoYXBlKG5ld1NoYXBlKSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB4U2l6ZTsgKytpKSB7XG4gICAgICAgIGNvbnN0IGxvYyA9IHV0aWwuaW5kZXhUb0xvYyhpLCB4UmFuaywgeFN0cmlkZXMpO1xuICAgICAgICAvLyBQZXJtdXRlIGxvY2F0aW9uLlxuICAgICAgICBjb25zdCBuZXdMb2MgPSBuZXcgQXJyYXkobG9jLmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3TG9jLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBuZXdMb2NbaV0gPSBsb2NbcGVybVtpXV07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3SW5kZXggPSB1dGlsLmxvY1RvSW5kZXgobmV3TG9jLCB4UmFuaywgbmV3U3RyaWRlcyk7XG4gICAgICAgIHJlc3VsdFtuZXdJbmRleF0gPSB4VmFsc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRyYW5zcG9zZV9pbXBsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBVbmlxdWUgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7IHVuaXF1ZUltcGwgfSBmcm9tICcuL1VuaXF1ZV9pbXBsJztcbmV4cG9ydCBmdW5jdGlvbiB1bmlxdWUoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBhdHRycywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IGF4aXMgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ3VuaXF1ZScpO1xuICAgIGNvbnN0IHZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCB7IG91dHB1dFZhbHVlcywgb3V0cHV0U2hhcGUsIGluZGljZXMgfSA9IHVuaXF1ZUltcGwodmFsdWVzLCBheGlzLCB4LnNoYXBlLCB4LmR0eXBlKTtcbiAgICByZXR1cm4gW1xuICAgICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dHB1dFNoYXBlLCB4LmR0eXBlLCBvdXRwdXRWYWx1ZXMpLFxuICAgICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtpbmRpY2VzLmxlbmd0aF0sICdpbnQzMicsIGluZGljZXMpLFxuICAgIF07XG59XG5leHBvcnQgY29uc3QgdW5pcXVlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFVuaXF1ZSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogdW5pcXVlLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVVuaXF1ZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBUZW5zb3JCdWZmZXIsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIHVuaXF1ZUltcGwodmFsdWVzLCBheGlzLCBzaGFwZSwgZHR5cGUpIHtcbiAgICAvLyBOb3JtYWxpemUgYW5kIHZhbGlkYXRlIGF4aXMuXG4gICAgY29uc3QgJGF4aXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHNoYXBlKVswXTtcbiAgICAvLyBDYWxjdWxhdGUgdGhlIG5ldyBzaGFwZSB0aGF0IGlzIHN1aXRhYmxlIGZvciBleHRyYWN0aW5nIGRhdGEgYWxvbmcgdGhlXG4gICAgLy8gZ2l2ZW4gYXhpcy5cbiAgICAvL1xuICAgIC8vIFRoZSByYW5rIGlzIDMuXG4gICAgLy8gVGhlIHNpemUgb2YgdGhlIDFzdCBkaW1lbnNpb24gaXMgdGhlIHNpemUgb2YgYWxsIHRoZSBheGVzIDwgdGhlIGdpdmVuIGF4aXMuXG4gICAgLy8gVGhlIHNpemUgb2YgdGhlIDJuZCBkaW1lbnNpb24gaXMgdGhlIHNhbWUgYXMgdGhlIHNpemUgb2YgdGhlIGdpdmVuIGF4aXMuXG4gICAgLy8gVGhlIHNpemUgb2YgdGhlIDNyZCBkaW1lbnNpb24gaXMgdGhlIHNpemUgb2YgYWxsIHRoZSBheGVzID4gdGhlIGdpdmVuIGF4aXMuXG4gICAgLy9cbiAgICAvLyBGb3IgZXhhbXBsZSwgZm9yIGEgNEQgdGVuc29yIHdpdGggc2hhcGU9WzIsIDMsIDUsIDRdIGFuZCBheGlzPTIsIHRoZVxuICAgIC8vIG5ld1NoYXBlIHdvdWxkIGJlOiBbMiozLCA1LCA0XS5cbiAgICAvL1xuICAgIC8vIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCB0aGUgZmluYWwgb3V0cHV0IHNoYXBlLiBUaGlzIHdpbGwgYmUgdGhlIHNoYXBlIGZvciBhblxuICAgIC8vIGludGVybWVkaWF0ZSBUZW5zb3JCdWZmZXIgKHNlZSBpbnB1dEJ1ZmZlciBiZWxvdykgdG8gYWxsb3cgdXMgdG8gZXh0cmFjdFxuICAgIC8vIHZhbHVlcyBhbG9uZyB0aGUgZ2l2ZW4gYXhpcy4gVG8gZGVtb25zdHJhdGUgaG93IGl0IHdvcmtzLCBjb25zaWRlciB0aGVcbiAgICAvLyBmb2xsb3dpbmcgZXhhbXBsZTpcbiAgICAvL1xuICAgIC8vIElucHV0OiBhIDNEIHRlbnNvciwgd2l0aCBzaGFwZSBbMSwgMiwgM11cbiAgICAvLyBbXG4gICAgLy8gICBbXG4gICAgLy8gICAgICBbMSwyLDNdLFxuICAgIC8vICAgICAgWzQsNSw2XVxuICAgIC8vICAgXVxuICAgIC8vIF1cbiAgICAvLyBBeGlzOiAyICh0aGUgbGFzdCBheGlzKS5cbiAgICAvLyBBbG9uZyBheGlzIDIsIHdlIGV4cGVjdCB0byBleHRyYWN0IDMgdGVuc29yczogWzEsNF0sIFsyLDVdLCBbMyw2XS5cbiAgICAvL1xuICAgIC8vIEZvciB0aGlzIGV4YW1wbGUsIG5ld1NoYXBlIHdvdWxkIGJlOiBbMiwgMywgMV0sIHdoZXJlIDIgaXMgY2FsY3VsYXRlZCBmcm9tXG4gICAgLy8gMSoyLiBUaGUgcmUtc2hhcGVkIGRhdGEgd291bGQgbG9vayBsaWtlOlxuICAgIC8vXG4gICAgLy8gW1xuICAgIC8vICAgW1xuICAgIC8vICAgICBbMV0sIFsyXSwgWzNdXG4gICAgLy8gICBdLFxuICAgIC8vICAgW1xuICAgIC8vICAgICBbNF0sIFs1XSwgWzZdXG4gICAgLy8gICBdXG4gICAgLy8gXVxuICAgIC8vXG4gICAgLy8gVGhlbiwgd2UgY2FuIGNvbnN0cnVjdCBhIDMtbGV2ZWwgbmVzdGVkIGxvb3AgYnkgdGhlIGZvbGxvd2luZyBkaW1lbnNpb25cbiAgICAvLyBvcmRlciB0byBleHRyYWN0IHRoZSB2YWx1ZXMgYWxvbmcgdGhlIGF4aXMgKGRpbWVuc2lvbjEpOlxuICAgIC8vIGk6IGRpbWVuc2lvbjEgICAgICAgLy8gMCwxLDIgKG5ld1NoYXBlWzFdKVxuICAgIC8vICAgbTogZGltZW5zaW9uMCAgICAgLy8gMCwxICAgKG5ld1NoYXBlWzBdKVxuICAgIC8vICAgICBuOiBkaW1lbnNpb24yICAgLy8gMCAgICAgKG5ld1NoYXBlWzJdKVxuICAgIC8vXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgIG0sIGksIG5cbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS1cbiAgICAvLyBJdGVyYXRpb24gMDogZGF0YSBhdCBbMCwgMCwgMF0gPT4gXCIxXCJcbiAgICAvLyBJdGVyYXRpb24gMTogZGF0YSBhdCBbMSwgMCwgMF0gPT4gXCI0XCJcbiAgICAvLyBXZSBnb3QgWzEsNF0uXG4gICAgLy8gSXRlcmF0aW9uIDI6IGRhdGEgYXQgWzAsIDEsIDBdID0+IFwiMlwiXG4gICAgLy8gSXRlcmF0aW9uIDM6IGRhdGEgYXQgWzEsIDEsIDBdID0+IFwiNVwiXG4gICAgLy8gV2UgZ290IFsyLDVdLlxuICAgIC8vIEl0ZXJhdGlvbiA0OiBkYXRhIGF0IFswLCAyLCAwXSA9PiBcIjNcIlxuICAgIC8vIEl0ZXJhdGlvbiA1OiBkYXRhIGF0IFsxLCAyLCAwXSA9PiBcIjZcIlxuICAgIC8vIFdlIGdvdCBbMyw2XS5cbiAgICBjb25zdCBuZXdTaGFwZSA9IFsxLCBzaGFwZVswXSwgMV07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAkYXhpczsgaSsrKSB7XG4gICAgICAgIG5ld1NoYXBlWzBdICo9IHNoYXBlW2ldO1xuICAgIH1cbiAgICBuZXdTaGFwZVsxXSA9IHNoYXBlWyRheGlzXTtcbiAgICBmb3IgKGxldCBpID0gJGF4aXMgKyAxOyBpIDwgc2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbmV3U2hhcGVbMl0gKj0gc2hhcGVbaV07XG4gICAgfVxuICAgIC8vIEEgbWFwIGZyb20gdW5pcXVlIGVsZW1lbnRzICh0aGVpciBzdHJpbmcgcmVwcmVzZW50YXRpb25zKSB0byB0aGVpciB2YWx1ZXNcbiAgICAvLyBpbiBcImluZGljZXNcIiAoYmVsb3cpLlxuICAgIGNvbnN0IHVuaXF1ZUVsZW1lbnRzID0ge307XG4gICAgLy8gVGhlIGluZGljZXMgb2YgZWFjaCB1bmlxdWUgZWxlbWVudCBpbiB0aGUgb3JpZ2luYWwgdGVuc29yIGFsb25nIHRoZSBnaXZlblxuICAgIC8vIGF4aXMuIEl0IGlzIDFEIGFuZCBoYXMgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgZ2l2ZW4gYXhpcy5cbiAgICBjb25zdCBpbmRpY2VzID0gbmV3IEludDMyQXJyYXkoc2hhcGVbJGF4aXNdKTtcbiAgICAvLyBDcmVhdGUgYSBidWZmZXIgc28gd2UgY2FuIGVhc2lseSBleHRyYWN0IHZhbHVlIGF0IGEgZ2l2ZW4gbG9jYXRpb24uXG4gICAgY29uc3QgaW5wdXRCdWZmZXIgPSBuZXcgVGVuc29yQnVmZmVyKG5ld1NoYXBlLCBkdHlwZSwgdmFsdWVzKTtcbiAgICAvLyBUaGUgaW5kaWNlcyBhbG9uZyB0aGUgZ2l2ZW4gYXhpcyB0aGF0IGhhdmUgdW5pcXVlIGVsZW1lbnRzLiBUaGlzIGlzIGFcbiAgICAvLyBkZS1kdXBlZCB2ZXJzaW9uIG9mIFwiaW5kaWNlc1wiIGFib3ZlLlxuICAgIGNvbnN0IHVuaXF1ZUluZGljZXMgPSBbXTtcbiAgICBjb25zdCBpczFEVGVuc29yID0gbmV3U2hhcGVbMF0gPT09IDEgJiYgbmV3U2hhcGVbMl0gPT09IDE7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaGFwZVskYXhpc107IGkrKykge1xuICAgICAgICAvLyBFeHRyYWN0IHZhbHVlcyBhbG9uZyB0aGUgYXhpcy5cbiAgICAgICAgbGV0IGVsZW1lbnQ7XG4gICAgICAgIGlmIChpczFEVGVuc29yKSB7XG4gICAgICAgICAgICAvLyBGYXN0IHBhdGggZm9yIDFEIHRlbnNvciBpbnB1dC5cbiAgICAgICAgICAgIGVsZW1lbnQgPSB2YWx1ZXNbaV0udG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGF4aXNWYWx1ZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IG0gPSAwOyBtIDwgbmV3U2hhcGVbMF07IG0rKykge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgbmV3U2hhcGVbMl07IG4rKykge1xuICAgICAgICAgICAgICAgICAgICBheGlzVmFsdWVzLnB1c2goaW5wdXRCdWZmZXIuZ2V0KG0sIGksIG4pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbGVtZW50ID0gYXhpc1ZhbHVlcy5qb2luKCcsJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRGVkdXAgYW5kIHVwZGF0ZSB2YXJpb3VzIGluZGljZXMuXG4gICAgICAgIGlmICh1bmlxdWVFbGVtZW50c1tlbGVtZW50XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpbmRpY2VzW2ldID0gdW5pcXVlRWxlbWVudHNbZWxlbWVudF07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB1bmlxdWVJbmRleCA9IE9iamVjdC5rZXlzKHVuaXF1ZUVsZW1lbnRzKS5sZW5ndGg7XG4gICAgICAgICAgICB1bmlxdWVFbGVtZW50c1tlbGVtZW50XSA9IHVuaXF1ZUluZGV4O1xuICAgICAgICAgICAgaW5kaWNlc1tpXSA9IHVuaXF1ZUluZGV4O1xuICAgICAgICAgICAgdW5pcXVlSW5kaWNlcy5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIE5vdyB3ZSBrbm93IHdoZXJlIGVhY2ggb2YgdGhlIHVuaXF1ZSBlbGVtZW50cyBhcmUgbG9jYXRlZCBhbG9uZyB0aGUgYXhpc1xuICAgIC8vICh1bmlxdWVJbmRpY2VzKS4gRXh0cmFjdCB0aGVtIGZyb20gaW5wdXQgYnVmZmVyIGFuZCBzdG9yZSB0aGVtIGluIHRoZVxuICAgIC8vIG91dHB1dCBidWZmZXIuXG4gICAgY29uc3Qgb3V0cHV0VG1wU2hhcGUgPSBuZXdTaGFwZS5zbGljZSgpO1xuICAgIG91dHB1dFRtcFNoYXBlWzFdID0gT2JqZWN0LmtleXModW5pcXVlRWxlbWVudHMpLmxlbmd0aDtcbiAgICBjb25zdCBvdXRwdXRCdWZmZXIgPSBuZXcgVGVuc29yQnVmZmVyKG91dHB1dFRtcFNoYXBlLCBkdHlwZSk7XG4gICAgdW5pcXVlSW5kaWNlcy5mb3JFYWNoKCh1bmlxdWVFbGVtZW50SW5kZXgsIGkpID0+IHtcbiAgICAgICAgZm9yIChsZXQgbSA9IDA7IG0gPCBuZXdTaGFwZVswXTsgbSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IG5ld1NoYXBlWzJdOyBuKyspIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXIuc2V0KGlucHV0QnVmZmVyLmdldChtLCB1bmlxdWVFbGVtZW50SW5kZXgsIG4pLCBtLCBpLCBuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIC8vIFRoZSBvdXRwdXQgc2hhcGUgY2FuIGJlIGNhbGN1bGF0ZWQgZnJvbSB0aGUgaW5wdXQgc2hhcGUgd2l0aCB0aGUgc2l6ZSBvZlxuICAgIC8vIHRoZSBnaXZlbiBheGlzIHJlcGxhY2VkIGJ5IHRoZSBudW1iZXIgb2YgdW5pcXVlIGVsZW1lbnRzIGFsb25nIHRoYXQgYXhpcy5cbiAgICBjb25zdCBvdXRwdXRTaGFwZSA9IHNoYXBlLnNsaWNlKCk7XG4gICAgb3V0cHV0U2hhcGVbJGF4aXNdID0gb3V0cHV0VG1wU2hhcGVbMV07XG4gICAgcmV0dXJuIHtcbiAgICAgICAgb3V0cHV0VmFsdWVzOiBvdXRwdXRCdWZmZXIudmFsdWVzLFxuICAgICAgICBvdXRwdXRTaGFwZSxcbiAgICAgICAgaW5kaWNlcyxcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VW5pcXVlX2ltcGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgVW5wYWNrIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHsgc2xpY2UgfSBmcm9tICcuL1NsaWNlJztcbmV4cG9ydCBmdW5jdGlvbiB1bnBhY2soYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHZhbHVlIH0gPSBpbnB1dHM7XG4gICAgbGV0IHsgYXhpcyB9ID0gYXR0cnM7XG4gICAgaWYgKGF4aXMgPCAwKSB7XG4gICAgICAgIGF4aXMgKz0gdmFsdWUuc2hhcGUubGVuZ3RoO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZVJhbmsgPSB2YWx1ZS5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgbnVtID0gdmFsdWUuc2hhcGVbYXhpc107XG4gICAgY29uc3Qgb3V0U2hhcGUgPSBuZXcgQXJyYXkodmFsdWVSYW5rIC0gMSk7XG4gICAgbGV0IG91dEluZGV4ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlUmFuazsgaSsrKSB7XG4gICAgICAgIGlmIChpICE9PSBheGlzKSB7XG4gICAgICAgICAgICBvdXRTaGFwZVtvdXRJbmRleCsrXSA9IHZhbHVlLnNoYXBlW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGJlZ2luID0gbmV3IEFycmF5KHZhbHVlUmFuaykuZmlsbCgwKTtcbiAgICBjb25zdCBzaXplID0gdmFsdWUuc2hhcGUuc2xpY2UoKTtcbiAgICBzaXplW2F4aXNdID0gMTtcbiAgICBjb25zdCByZXMgPSBuZXcgQXJyYXkobnVtKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBiZWdpbltheGlzXSA9IGk7XG4gICAgICAgIGNvbnN0IHRlbXBSZXMgPSBzbGljZSh7IGlucHV0czogeyB4OiB2YWx1ZSB9LCBiYWNrZW5kLCBhdHRyczogeyBiZWdpbiwgc2l6ZSB9IH0pO1xuICAgICAgICByZXNbaV0gPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHRlbXBSZXMgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IG91dFNoYXBlIH0gfSk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odGVtcFJlcyk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5leHBvcnQgY29uc3QgdW5wYWNrQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFVucGFjayxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogdW5wYWNrXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VW5wYWNrLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFVuc29ydGVkU2VnbWVudFN1bSwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHsgY2FzdCB9IGZyb20gJy4vQ2FzdCc7XG5pbXBvcnQgeyBlcXVhbCB9IGZyb20gJy4vRXF1YWwnO1xuaW1wb3J0IHsgZXhwYW5kRGltcyB9IGZyb20gJy4vRXhwYW5kRGltcyc7XG5pbXBvcnQgeyBtdWx0aXBseSB9IGZyb20gJy4vTXVsdGlwbHknO1xuaW1wb3J0IHsgcGFjayB9IGZyb20gJy4vUGFjayc7XG5pbXBvcnQgeyBzdW0gfSBmcm9tICcuL1N1bSc7XG5leHBvcnQgZnVuY3Rpb24gdW5zb3J0ZWRTZWdtZW50U3VtKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4LCBzZWdtZW50SWRzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBudW1TZWdtZW50cyB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleCh4LCAndW5zb3J0ZWRTZWdtZW50U3VtJyk7XG4gICAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBzZWdtZW50SWRzUmFuayA9IHNlZ21lbnRJZHMuc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IHJlcyA9IFtdO1xuICAgIGNvbnN0IGludGVybWVkaWF0ZXMgPSBbXTtcbiAgICAvLyBSZXNoYXBlIHRoZSBzZWdtZW50IGlkJ3Mgc28gdGhhdCB0aGV5IGNhbiBiZSBicm9hZGNhc3Qgd2l0aFxuICAgIC8vIHguIFRoZSBuZXcgc2hhcGUgc2hvdWxkIGJlIFtzZWdtZW50SWRzLnNoYXBlLCAxLCAuLi4sIDFdXG4gICAgY29uc3QgbnVtSXRlcnMgPSB4UmFuayAtIHNlZ21lbnRJZHNSYW5rO1xuICAgIGxldCAkc2VnbWVudElkcyA9IHNlZ21lbnRJZHM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1JdGVyczsgKytpKSB7XG4gICAgICAgIGNvbnN0IGV4cGFuZGVkID0gZXhwYW5kRGltcyh7IGlucHV0czogeyBpbnB1dDogJHNlZ21lbnRJZHMgfSwgYmFja2VuZCwgYXR0cnM6IHsgZGltOiBpICsgMSB9IH0pO1xuICAgICAgICAkc2VnbWVudElkcyA9IGV4cGFuZGVkO1xuICAgICAgICBpbnRlcm1lZGlhdGVzLnB1c2goZXhwYW5kZWQpO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVNlZ21lbnRzOyArK2kpIHtcbiAgICAgICAgY29uc3Qgc2NhbGFyVmFsdWUgPSB1dGlsLmNyZWF0ZVNjYWxhclZhbHVlKGksICdpbnQzMicpO1xuICAgICAgICBjb25zdCBzZWdtZW50SWQgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtdLCAnaW50MzInLCBzY2FsYXJWYWx1ZSk7XG4gICAgICAgIGNvbnN0IG1hc2sgPSBlcXVhbCh7IGlucHV0czogeyBhOiBzZWdtZW50SWQsIGI6ICRzZWdtZW50SWRzIH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIGNvbnN0IG1hc2tDYXN0ZWQgPSBjYXN0KHsgaW5wdXRzOiB7IHg6IG1hc2sgfSwgYmFja2VuZCwgYXR0cnM6IHsgZHR5cGU6ICdmbG9hdDMyJyB9IH0pO1xuICAgICAgICBjb25zdCBtdWwgPSBtdWx0aXBseSh7IGlucHV0czogeyBhOiBtYXNrQ2FzdGVkLCBiOiB4IH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIGNvbnN0IHN1bVRlbnNvckluZm8gPSBzdW0oeyBpbnB1dHM6IHsgeDogbXVsIH0sIGJhY2tlbmQsIGF0dHJzOiB7IGF4aXM6IDAsIGtlZXBEaW1zOiBmYWxzZSB9IH0pO1xuICAgICAgICByZXMucHVzaChzdW1UZW5zb3JJbmZvKTtcbiAgICAgICAgaW50ZXJtZWRpYXRlcy5wdXNoKHNlZ21lbnRJZCk7XG4gICAgICAgIGludGVybWVkaWF0ZXMucHVzaChtYXNrKTtcbiAgICAgICAgaW50ZXJtZWRpYXRlcy5wdXNoKG1hc2tDYXN0ZWQpO1xuICAgICAgICBpbnRlcm1lZGlhdGVzLnB1c2gobXVsKTtcbiAgICAgICAgaW50ZXJtZWRpYXRlcy5wdXNoKHN1bVRlbnNvckluZm8pO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBwYWNrKHsgaW5wdXRzOiByZXMsIGJhY2tlbmQsIGF0dHJzOiB7IGF4aXM6IDAgfSB9KTtcbiAgICBpbnRlcm1lZGlhdGVzLmZvckVhY2godCA9PiBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHQpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGNvbnN0IHVuc29ydGVkU2VnbWVudFN1bUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBVbnNvcnRlZFNlZ21lbnRTdW0sXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHVuc29ydGVkU2VnbWVudFN1bVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVVuc29ydGVkU2VnbWVudFN1bS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBaZXJvc0xpa2UgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY29tcGxleCB9IGZyb20gJy4vQ29tcGxleCc7XG5pbXBvcnQgeyBmaWxsIH0gZnJvbSAnLi9GaWxsJztcbmltcG9ydCB7IGltYWcgfSBmcm9tICcuL0ltYWcnO1xuaW1wb3J0IHsgcmVhbCB9IGZyb20gJy4vUmVhbCc7XG5leHBvcnQgZnVuY3Rpb24gemVyb3NMaWtlKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBpZiAoeC5kdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd6ZXJvc0xpa2UgaXMgbm90IHN1cHBvcnRlZCBmb3Igc3RyaW5nIHRlbnNvcnMnKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoeC5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgY29uc3QgcmVhbFBhcnQgPSByZWFsKHsgaW5wdXRzOiB7IGlucHV0OiB4IH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIGNvbnN0IHIgPSB6ZXJvc0xpa2UoeyBpbnB1dHM6IHsgeDogcmVhbFBhcnQgfSwgYmFja2VuZCB9KTtcbiAgICAgICAgY29uc3QgaW1hZ1BhcnQgPSBpbWFnKHsgaW5wdXRzOiB7IGlucHV0OiB4IH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIGNvbnN0IGkgPSB6ZXJvc0xpa2UoeyBpbnB1dHM6IHsgeDogaW1hZ1BhcnQgfSwgYmFja2VuZCB9KTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY29tcGxleCh7IGlucHV0czogeyByZWFsOiByLCBpbWFnOiBpIH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVhbFBhcnQpO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHIpO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGltYWdQYXJ0KTtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBmaWxsKHsgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IHguc2hhcGUsIHZhbHVlOiAwLCBkdHlwZTogeC5kdHlwZSB9IH0pO1xuICAgIH1cbn1cbmV4cG9ydCBjb25zdCB6ZXJvc0xpa2VDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogWmVyb3NMaWtlLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiB6ZXJvc0xpa2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1aZXJvc0xpa2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IF9GdXNlZE1hdE11bCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhcHBseUFjdGl2YXRpb24gfSBmcm9tICcuLi91dGlscy9mdXNlZF91dGlscyc7XG5pbXBvcnQgeyBhZGQgfSBmcm9tICcuL0FkZCc7XG5pbXBvcnQgeyBiYXRjaE1hdE11bCB9IGZyb20gJy4vQmF0Y2hNYXRNdWwnO1xuZXhwb3J0IGZ1bmN0aW9uIF9mdXNlZE1hdE11bChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgYSwgYiwgYmlhcywgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgdHJhbnNwb3NlQSwgdHJhbnNwb3NlQiwgYWN0aXZhdGlvbiwgbGVha3lyZWx1QWxwaGEgfSA9IGF0dHJzO1xuICAgIGxldCBjdXJyZW50O1xuICAgIGxldCBhZGRSZXM7XG4gICAgbGV0IGFjdGl2YXRpb25SZXM7XG4gICAgY29uc3QgaW50ZXJtZWRpYXRlcyA9IFtdO1xuICAgIGNvbnN0IG1hdE11bFJlcyA9IGJhdGNoTWF0TXVsKHsgaW5wdXRzOiB7IGEsIGIgfSwgYXR0cnM6IHsgdHJhbnNwb3NlQSwgdHJhbnNwb3NlQiB9LCBiYWNrZW5kIH0pO1xuICAgIGN1cnJlbnQgPSBtYXRNdWxSZXM7XG4gICAgaWYgKGJpYXMpIHtcbiAgICAgICAgYWRkUmVzID0gYWRkKHsgaW5wdXRzOiB7IGE6IGN1cnJlbnQsIGI6IGJpYXMgfSwgYmFja2VuZCB9KTtcbiAgICAgICAgaW50ZXJtZWRpYXRlcy5wdXNoKGN1cnJlbnQpO1xuICAgICAgICBjdXJyZW50ID0gYWRkUmVzO1xuICAgIH1cbiAgICBpZiAoYWN0aXZhdGlvbikge1xuICAgICAgICBhY3RpdmF0aW9uUmVzID0gYXBwbHlBY3RpdmF0aW9uKGJhY2tlbmQsIGN1cnJlbnQsIGFjdGl2YXRpb24sIHByZWx1QWN0aXZhdGlvbldlaWdodHMsIGxlYWt5cmVsdUFscGhhKTtcbiAgICAgICAgaW50ZXJtZWRpYXRlcy5wdXNoKGN1cnJlbnQpO1xuICAgICAgICBjdXJyZW50ID0gYWN0aXZhdGlvblJlcztcbiAgICB9XG4gICAgZm9yIChjb25zdCBpIG9mIGludGVybWVkaWF0ZXMpIHtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpKTtcbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnQ7XG59XG5leHBvcnQgY29uc3QgX2Z1c2VkTWF0TXVsQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IF9GdXNlZE1hdE11bCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogX2Z1c2VkTWF0TXVsLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPV9GdXNlZE1hdE11bC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vLyBXZSBleHBsaWNpdGx5IGltcG9ydCB0aGUgbW9kdWxhciBrZXJuZWxzIHNvIHRoZXkgZ2V0IHJlZ2lzdGVyZWQgaW4gdGhlXG4vLyBnbG9iYWwgcmVnaXN0cnkgd2hlbiB3ZSBjb21waWxlIHRoZSBsaWJyYXJ5LiBBIG1vZHVsYXIgYnVpbGQgd291bGQgcmVwbGFjZVxuLy8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhbmQgaW1wb3J0IG9ubHkgdGhlIGtlcm5lbHMgdGhhdCBhcmUgbmVlZGVkLlxuaW1wb3J0IHsgcmVnaXN0ZXJLZXJuZWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgX2Z1c2VkTWF0TXVsQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL19GdXNlZE1hdE11bCc7XG5pbXBvcnQgeyBhYnNDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQWJzJztcbmltcG9ydCB7IGFjb3NDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQWNvcyc7XG5pbXBvcnQgeyBhY29zaENvbmZpZyB9IGZyb20gJy4va2VybmVscy9BY29zaCc7XG5pbXBvcnQgeyBhZGRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQWRkJztcbmltcG9ydCB7IGFkZE5Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvQWRkTic7XG5pbXBvcnQgeyBhbGxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQWxsJztcbmltcG9ydCB7IGFueUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9BbnknO1xuaW1wb3J0IHsgYXJnTWF4Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0FyZ01heCc7XG5pbXBvcnQgeyBhcmdNaW5Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvQXJnTWluJztcbmltcG9ydCB7IGFzaW5Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvQXNpbic7XG5pbXBvcnQgeyBhc2luaENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Bc2luaCc7XG5pbXBvcnQgeyBhdGFuQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0F0YW4nO1xuaW1wb3J0IHsgYXRhbjJDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQXRhbjInO1xuaW1wb3J0IHsgYXRhbmhDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQXRhbmgnO1xuaW1wb3J0IHsgYXZnUG9vbENvbmZpZyB9IGZyb20gJy4va2VybmVscy9BdmdQb29sJztcbmltcG9ydCB7IGF2Z1Bvb2wzRENvbmZpZyB9IGZyb20gJy4va2VybmVscy9BdmdQb29sM0QnO1xuaW1wb3J0IHsgYXZnUG9vbDNER3JhZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9BdmdQb29sM0RHcmFkJztcbmltcG9ydCB7IGF2Z1Bvb2xHcmFkQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0F2Z1Bvb2xHcmFkJztcbmltcG9ydCB7IGJhdGNoTWF0TXVsQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0JhdGNoTWF0TXVsJztcbmltcG9ydCB7IGJhdGNoTm9ybUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9CYXRjaE5vcm0nO1xuaW1wb3J0IHsgYmF0Y2hUb1NwYWNlTkRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQmF0Y2hUb1NwYWNlTkQnO1xuaW1wb3J0IHsgYmluY291bnRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQmluY291bnQnO1xuaW1wb3J0IHsgY2FzdENvbmZpZyB9IGZyb20gJy4va2VybmVscy9DYXN0JztcbmltcG9ydCB7IGNlaWxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQ2VpbCc7XG5pbXBvcnQgeyBjbGlwQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0NsaXAnO1xuaW1wb3J0IHsgY29tcGxleENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Db21wbGV4JztcbmltcG9ydCB7IGNvbXBsZXhBYnNDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQ29tcGxleEFicyc7XG5pbXBvcnQgeyBjb25jYXRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQ29uY2F0JztcbmltcG9ydCB7IGNvbnYyRENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Db252MkQnO1xuaW1wb3J0IHsgY29udjJEQmFja3Byb3BGaWx0ZXJDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQ29udjJEQmFja3Byb3BGaWx0ZXInO1xuaW1wb3J0IHsgY29udjJEQmFja3Byb3BJbnB1dENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Db252MkRCYWNrcHJvcElucHV0JztcbmltcG9ydCB7IGNvbnYzRENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Db252M0QnO1xuaW1wb3J0IHsgY29udjNEQmFja3Byb3BGaWx0ZXJWMkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9Db252M0RCYWNrcHJvcEZpbHRlclYyJztcbmltcG9ydCB7IGNvbnYzREJhY2twcm9wSW5wdXRWMkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9Db252M0RCYWNrcHJvcElucHV0VjInO1xuaW1wb3J0IHsgY29zQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0Nvcyc7XG5pbXBvcnQgeyBjb3NoQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0Nvc2gnO1xuaW1wb3J0IHsgY3JvcEFuZFJlc2l6ZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9Dcm9wQW5kUmVzaXplJztcbmltcG9ydCB7IGN1bXN1bUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9DdW1zdW0nO1xuaW1wb3J0IHsgZGVuc2VCaW5jb3VudENvbmZpZyB9IGZyb20gJy4va2VybmVscy9EZW5zZUJpbmNvdW50JztcbmltcG9ydCB7IGRlcHRoVG9TcGFjZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9EZXB0aFRvU3BhY2UnO1xuaW1wb3J0IHsgZGVwdGh3aXNlQ29udjJkTmF0aXZlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0RlcHRod2lzZUNvbnYyZE5hdGl2ZSc7XG5pbXBvcnQgeyBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlckNvbmZpZyB9IGZyb20gJy4va2VybmVscy9EZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlcic7XG5pbXBvcnQgeyBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0RlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXQnO1xuaW1wb3J0IHsgZGlhZ0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9EaWFnJztcbmltcG9ydCB7IGRpbGF0aW9uMmRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRGlsYXRpb24yRCc7XG5pbXBvcnQgeyBkaWxhdGlvbjJkQmFja3Byb3BGaWx0ZXJDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRGlsYXRpb24yREJhY2twcm9wRmlsdGVyJztcbmltcG9ydCB7IGRpbGF0aW9uMmRCYWNrcHJvcElucHV0Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0RpbGF0aW9uMkRCYWNrcHJvcElucHV0JztcbmltcG9ydCB7IGVpbnN1bUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9FaW5zdW0nO1xuaW1wb3J0IHsgZWx1Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0VsdSc7XG5pbXBvcnQgeyBlbHVHcmFkQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0VsdUdyYWQnO1xuaW1wb3J0IHsgZXF1YWxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRXF1YWwnO1xuaW1wb3J0IHsgZXJmQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0VyZic7XG5pbXBvcnQgeyBleHBDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRXhwJztcbmltcG9ydCB7IGV4cGFuZERpbXNDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRXhwYW5kRGltcyc7XG5pbXBvcnQgeyBleHBtMUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9FeHBtMSc7XG5pbXBvcnQgeyBmZnRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRkZUJztcbmltcG9ydCB7IGZpbGxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRmlsbCc7XG5pbXBvcnQgeyBmbGlwTGVmdFJpZ2h0Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0ZsaXBMZWZ0UmlnaHQnO1xuaW1wb3J0IHsgZmxvb3JDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRmxvb3InO1xuaW1wb3J0IHsgZmxvb3JEaXZDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRmxvb3JEaXYnO1xuaW1wb3J0IHsgZnVzZWRDb252MkRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRnVzZWRDb252MkQnO1xuaW1wb3J0IHsgZnVzZWREZXB0aHdpc2VDb252MkRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRnVzZWREZXB0aHdpc2VDb252MkQnO1xuaW1wb3J0IHsgZ2F0aGVyTmRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvR2F0aGVyTmQnO1xuaW1wb3J0IHsgZ2F0aGVyVjJDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvR2F0aGVyVjInO1xuaW1wb3J0IHsgZ3JlYXRlckNvbmZpZyB9IGZyb20gJy4va2VybmVscy9HcmVhdGVyJztcbmltcG9ydCB7IGdyZWF0ZXJFcXVhbENvbmZpZyB9IGZyb20gJy4va2VybmVscy9HcmVhdGVyRXF1YWwnO1xuaW1wb3J0IHsgaWRlbnRpdHlDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvSWRlbnRpdHknO1xuaW1wb3J0IHsgaWZmdENvbmZpZyB9IGZyb20gJy4va2VybmVscy9JRkZUJztcbmltcG9ydCB7IGltYWdDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvSW1hZyc7XG5pbXBvcnQgeyBpc0Zpbml0ZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9Jc0Zpbml0ZSc7XG5pbXBvcnQgeyBpc0luZkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9Jc0luZic7XG5pbXBvcnQgeyBpc05hTkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9Jc05hTic7XG5pbXBvcnQgeyBsZWFreVJlbHVDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTGVha3lSZWx1JztcbmltcG9ydCB7IGxlc3NDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTGVzcyc7XG5pbXBvcnQgeyBsZXNzRXF1YWxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTGVzc0VxdWFsJztcbmltcG9ydCB7IGxpblNwYWNlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0xpblNwYWNlJztcbmltcG9ydCB7IGxvZ0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9Mb2cnO1xuaW1wb3J0IHsgbG9nMXBDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTG9nMXAnO1xuaW1wb3J0IHsgbG9naWNhbEFuZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Mb2dpY2FsQW5kJztcbmltcG9ydCB7IGxvZ2ljYWxOb3RDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTG9naWNhbE5vdCc7XG5pbXBvcnQgeyBsb2dpY2FsT3JDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTG9naWNhbE9yJztcbmltcG9ydCB7IGxSTkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9MUk4nO1xuaW1wb3J0IHsgbFJOR3JhZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9MUk5HcmFkJztcbmltcG9ydCB7IG1heENvbmZpZyB9IGZyb20gJy4va2VybmVscy9NYXgnO1xuaW1wb3J0IHsgbWF4aW11bUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9NYXhpbXVtJztcbmltcG9ydCB7IG1heFBvb2xDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTWF4UG9vbCc7XG5pbXBvcnQgeyBtYXhQb29sM0RDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTWF4UG9vbDNEJztcbmltcG9ydCB7IG1heFBvb2wzREdyYWRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTWF4UG9vbDNER3JhZCc7XG5pbXBvcnQgeyBtYXhQb29sR3JhZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9NYXhQb29sR3JhZCc7XG5pbXBvcnQgeyBtYXhQb29sV2l0aEFyZ21heENvbmZpZyB9IGZyb20gJy4va2VybmVscy9NYXhQb29sV2l0aEFyZ21heCc7XG5pbXBvcnQgeyBtZWFuQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL01lYW4nO1xuaW1wb3J0IHsgbWluQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL01pbic7XG5pbXBvcnQgeyBtaW5pbXVtQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL01pbmltdW0nO1xuaW1wb3J0IHsgbWlycm9yUGFkQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL01pcnJvclBhZCc7XG5pbXBvcnQgeyBtb2RDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTW9kJztcbmltcG9ydCB7IG11bHRpbm9taWFsQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL011bHRpbm9taWFsJztcbmltcG9ydCB7IG11bHRpcGx5Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL011bHRpcGx5JztcbmltcG9ydCB7IG5lZ0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9OZWcnO1xuaW1wb3J0IHsgbm9uTWF4U3VwcHJlc3Npb25WM0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9Ob25NYXhTdXBwcmVzc2lvblYzJztcbmltcG9ydCB7IG5vbk1heFN1cHByZXNzaW9uVjRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTm9uTWF4U3VwcHJlc3Npb25WNCc7XG5pbXBvcnQgeyBub25NYXhTdXBwcmVzc2lvblY1Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL05vbk1heFN1cHByZXNzaW9uVjUnO1xuaW1wb3J0IHsgbm90RXF1YWxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTm90RXF1YWwnO1xuaW1wb3J0IHsgb25lSG90Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL09uZUhvdCc7XG5pbXBvcnQgeyBvbmVzTGlrZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9PbmVzTGlrZSc7XG5pbXBvcnQgeyBwYWNrQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1BhY2snO1xuaW1wb3J0IHsgcGFkVjJDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUGFkVjInO1xuaW1wb3J0IHsgcG93Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1Bvdyc7XG5pbXBvcnQgeyBwcmVsdUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9QcmVsdSc7XG5pbXBvcnQgeyBwcm9kQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1Byb2QnO1xuaW1wb3J0IHsgcmFuZ2VDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUmFuZ2UnO1xuaW1wb3J0IHsgcmVhbENvbmZpZyB9IGZyb20gJy4va2VybmVscy9SZWFsJztcbmltcG9ydCB7IHJlYWxEaXZDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUmVhbERpdic7XG5pbXBvcnQgeyByZWNpcHJvY2FsQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1JlY2lwcm9jYWwnO1xuaW1wb3J0IHsgcmVsdUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9SZWx1JztcbmltcG9ydCB7IHJlbHU2Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1JlbHU2JztcbmltcG9ydCB7IHJlc2hhcGVDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUmVzaGFwZSc7XG5pbXBvcnQgeyByZXNpemVCaWxpbmVhckNvbmZpZyB9IGZyb20gJy4va2VybmVscy9SZXNpemVCaWxpbmVhcic7XG5pbXBvcnQgeyByZXNpemVCaWxpbmVhckdyYWRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUmVzaXplQmlsaW5lYXJHcmFkJztcbmltcG9ydCB7IHJlc2l6ZU5lYXJlc3ROZWlnaGJvckNvbmZpZyB9IGZyb20gJy4va2VybmVscy9SZXNpemVOZWFyZXN0TmVpZ2hib3InO1xuaW1wb3J0IHsgcmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9SZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkJztcbmltcG9ydCB7IHJldmVyc2VDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUmV2ZXJzZSc7XG5pbXBvcnQgeyByb3RhdGVXaXRoT2Zmc2V0Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1JvdGF0ZVdpdGhPZmZzZXQnO1xuaW1wb3J0IHsgcm91bmRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUm91bmQnO1xuaW1wb3J0IHsgcnNxcnRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUnNxcnQnO1xuaW1wb3J0IHsgc2NhdHRlck5kQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NjYXR0ZXJOZCc7XG5pbXBvcnQgeyBzZWxlY3RDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU2VsZWN0JztcbmltcG9ydCB7IHNlbHVDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU2VsdSc7XG5pbXBvcnQgeyBzaWdtb2lkQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NpZ21vaWQnO1xuaW1wb3J0IHsgc2lnbkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9TaWduJztcbmltcG9ydCB7IHNpbkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9TaW4nO1xuaW1wb3J0IHsgc2luaENvbmZpZyB9IGZyb20gJy4va2VybmVscy9TaW5oJztcbmltcG9ydCB7IHNsaWNlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NsaWNlJztcbmltcG9ydCB7IHNvZnRtYXhDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU29mdG1heCc7XG5pbXBvcnQgeyBzb2Z0cGx1c0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9Tb2Z0cGx1cyc7XG5pbXBvcnQgeyBzcGFjZVRvQmF0Y2hORENvbmZpZyB9IGZyb20gJy4va2VybmVscy9TcGFjZVRvQmF0Y2hORCc7XG5pbXBvcnQgeyBzcGFyc2VGaWxsRW1wdHlSb3dzQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NwYXJzZUZpbGxFbXB0eVJvd3MnO1xuaW1wb3J0IHsgc3BhcnNlUmVzaGFwZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9TcGFyc2VSZXNoYXBlJztcbmltcG9ydCB7IHNwYXJzZVNlZ21lbnRNZWFuQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NwYXJzZVNlZ21lbnRNZWFuJztcbmltcG9ydCB7IHNwYXJzZVNlZ21lbnRTdW1Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3BhcnNlU2VnbWVudFN1bSc7XG5pbXBvcnQgeyBzcGFyc2VUb0RlbnNlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NwYXJzZVRvRGVuc2UnO1xuaW1wb3J0IHsgc3BsaXRWQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NwbGl0Vic7XG5pbXBvcnQgeyBzcXJ0Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NxcnQnO1xuaW1wb3J0IHsgc3F1YXJlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NxdWFyZSc7XG5pbXBvcnQgeyBzcXVhcmVkRGlmZmVyZW5jZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9TcXVhcmVkRGlmZmVyZW5jZSc7XG5pbXBvcnQgeyBzdGVwQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1N0ZXAnO1xuaW1wb3J0IHsgc3RyaWRlZFNsaWNlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1N0cmlkZWRTbGljZSc7XG5pbXBvcnQgeyBzdHJpbmdOR3JhbXNDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3RyaW5nTkdyYW1zJztcbmltcG9ydCB7IHN0cmluZ1NwbGl0Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1N0cmluZ1NwbGl0JztcbmltcG9ydCB7IHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3RyaW5nVG9IYXNoQnVja2V0RmFzdCc7XG5pbXBvcnQgeyBzdWJDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3ViJztcbmltcG9ydCB7IHN1bUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9TdW0nO1xuaW1wb3J0IHsgdGFuQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1Rhbic7XG5pbXBvcnQgeyB0YW5oQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1RhbmgnO1xuaW1wb3J0IHsgdGlsZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9UaWxlJztcbmltcG9ydCB7IHRvcEtDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvVG9wSyc7XG5pbXBvcnQgeyB0cmFuc2Zvcm1Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvVHJhbnNmb3JtJztcbmltcG9ydCB7IHRyYW5zcG9zZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9UcmFuc3Bvc2UnO1xuaW1wb3J0IHsgdW5pcXVlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1VuaXF1ZSc7XG5pbXBvcnQgeyB1bnBhY2tDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvVW5wYWNrJztcbmltcG9ydCB7IHVuc29ydGVkU2VnbWVudFN1bUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9VbnNvcnRlZFNlZ21lbnRTdW0nO1xuaW1wb3J0IHsgemVyb3NMaWtlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1plcm9zTGlrZSc7XG4vLyBMaXN0IGFsbCBrZXJuZWwgY29uZmlncyBoZXJlXG5jb25zdCBrZXJuZWxDb25maWdzID0gW1xuICAgIF9mdXNlZE1hdE11bENvbmZpZyxcbiAgICBhYnNDb25maWcsXG4gICAgYWNvc0NvbmZpZyxcbiAgICBhY29zaENvbmZpZyxcbiAgICBhZGRDb25maWcsXG4gICAgYWRkTkNvbmZpZyxcbiAgICBhbGxDb25maWcsXG4gICAgYW55Q29uZmlnLFxuICAgIGFyZ01heENvbmZpZyxcbiAgICBhcmdNaW5Db25maWcsXG4gICAgYXNpbkNvbmZpZyxcbiAgICBhc2luaENvbmZpZyxcbiAgICBhdGFuQ29uZmlnLFxuICAgIGF0YW4yQ29uZmlnLFxuICAgIGF0YW5oQ29uZmlnLFxuICAgIGF2Z1Bvb2xDb25maWcsXG4gICAgYXZnUG9vbDNEQ29uZmlnLFxuICAgIGF2Z1Bvb2wzREdyYWRDb25maWcsXG4gICAgYXZnUG9vbEdyYWRDb25maWcsXG4gICAgYmF0Y2hNYXRNdWxDb25maWcsXG4gICAgYmF0Y2hOb3JtQ29uZmlnLFxuICAgIGJhdGNoVG9TcGFjZU5EQ29uZmlnLFxuICAgIGJpbmNvdW50Q29uZmlnLFxuICAgIGNhc3RDb25maWcsXG4gICAgY2VpbENvbmZpZyxcbiAgICBjbGlwQ29uZmlnLFxuICAgIGNvbXBsZXhDb25maWcsXG4gICAgY29tcGxleEFic0NvbmZpZyxcbiAgICBjb25jYXRDb25maWcsXG4gICAgY29udjJEQmFja3Byb3BGaWx0ZXJDb25maWcsXG4gICAgY29udjJEQmFja3Byb3BJbnB1dENvbmZpZyxcbiAgICBjb252MkRDb25maWcsXG4gICAgY29udjNEQmFja3Byb3BGaWx0ZXJWMkNvbmZpZyxcbiAgICBjb252M0RCYWNrcHJvcElucHV0VjJDb25maWcsXG4gICAgY29udjNEQ29uZmlnLFxuICAgIGNvc0NvbmZpZyxcbiAgICBjb3NoQ29uZmlnLFxuICAgIGNyb3BBbmRSZXNpemVDb25maWcsXG4gICAgY3Vtc3VtQ29uZmlnLFxuICAgIGRlbnNlQmluY291bnRDb25maWcsXG4gICAgZGVwdGhUb1NwYWNlQ29uZmlnLFxuICAgIGRlcHRod2lzZUNvbnYyZE5hdGl2ZUNvbmZpZyxcbiAgICBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlckNvbmZpZyxcbiAgICBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0Q29uZmlnLFxuICAgIGRpYWdDb25maWcsXG4gICAgZGlsYXRpb24yZENvbmZpZyxcbiAgICBkaWxhdGlvbjJkQmFja3Byb3BJbnB1dENvbmZpZyxcbiAgICBkaWxhdGlvbjJkQmFja3Byb3BGaWx0ZXJDb25maWcsXG4gICAgcmVhbERpdkNvbmZpZyxcbiAgICBlaW5zdW1Db25maWcsXG4gICAgZWx1Q29uZmlnLFxuICAgIGVsdUdyYWRDb25maWcsXG4gICAgZXF1YWxDb25maWcsXG4gICAgZXJmQ29uZmlnLFxuICAgIGV4cENvbmZpZyxcbiAgICBleHBhbmREaW1zQ29uZmlnLFxuICAgIGV4cG0xQ29uZmlnLFxuICAgIGZmdENvbmZpZyxcbiAgICBmaWxsQ29uZmlnLFxuICAgIGZsaXBMZWZ0UmlnaHRDb25maWcsXG4gICAgZmxvb3JDb25maWcsXG4gICAgZmxvb3JEaXZDb25maWcsXG4gICAgZnVzZWRDb252MkRDb25maWcsXG4gICAgZnVzZWREZXB0aHdpc2VDb252MkRDb25maWcsXG4gICAgZ2F0aGVyTmRDb25maWcsXG4gICAgZ2F0aGVyVjJDb25maWcsXG4gICAgZ3JlYXRlckNvbmZpZyxcbiAgICBncmVhdGVyRXF1YWxDb25maWcsXG4gICAgaWRlbnRpdHlDb25maWcsXG4gICAgaWZmdENvbmZpZyxcbiAgICBpbWFnQ29uZmlnLFxuICAgIGlzRmluaXRlQ29uZmlnLFxuICAgIGlzSW5mQ29uZmlnLFxuICAgIGlzTmFOQ29uZmlnLFxuICAgIGxlYWt5UmVsdUNvbmZpZyxcbiAgICBsZXNzQ29uZmlnLFxuICAgIGxlc3NFcXVhbENvbmZpZyxcbiAgICBsaW5TcGFjZUNvbmZpZyxcbiAgICBsb2dDb25maWcsXG4gICAgbG9nMXBDb25maWcsXG4gICAgbG9naWNhbEFuZENvbmZpZyxcbiAgICBsb2dpY2FsTm90Q29uZmlnLFxuICAgIGxvZ2ljYWxPckNvbmZpZyxcbiAgICBsUk5Db25maWcsXG4gICAgbFJOR3JhZENvbmZpZyxcbiAgICBtYXhpbXVtQ29uZmlnLFxuICAgIG1heFBvb2xDb25maWcsXG4gICAgbWF4UG9vbDNEQ29uZmlnLFxuICAgIG1heFBvb2wzREdyYWRDb25maWcsXG4gICAgbWF4UG9vbEdyYWRDb25maWcsXG4gICAgbWF4UG9vbFdpdGhBcmdtYXhDb25maWcsXG4gICAgbWF4Q29uZmlnLFxuICAgIG1lYW5Db25maWcsXG4gICAgbWluQ29uZmlnLFxuICAgIG1pbmltdW1Db25maWcsXG4gICAgbWlycm9yUGFkQ29uZmlnLFxuICAgIG1vZENvbmZpZyxcbiAgICBtdWx0aW5vbWlhbENvbmZpZyxcbiAgICBtdWx0aXBseUNvbmZpZyxcbiAgICBuZWdDb25maWcsXG4gICAgbm9uTWF4U3VwcHJlc3Npb25WM0NvbmZpZyxcbiAgICBub25NYXhTdXBwcmVzc2lvblY0Q29uZmlnLFxuICAgIG5vbk1heFN1cHByZXNzaW9uVjVDb25maWcsXG4gICAgbm90RXF1YWxDb25maWcsXG4gICAgb25lSG90Q29uZmlnLFxuICAgIG9uZXNMaWtlQ29uZmlnLFxuICAgIHBhY2tDb25maWcsXG4gICAgcGFkVjJDb25maWcsXG4gICAgcG93Q29uZmlnLFxuICAgIHByZWx1Q29uZmlnLFxuICAgIHByb2RDb25maWcsXG4gICAgcmFuZ2VDb25maWcsXG4gICAgcmVhbENvbmZpZyxcbiAgICByZWNpcHJvY2FsQ29uZmlnLFxuICAgIHJlbHVDb25maWcsXG4gICAgcmVsdTZDb25maWcsXG4gICAgcmVzaGFwZUNvbmZpZyxcbiAgICByZXNpemVCaWxpbmVhckNvbmZpZyxcbiAgICByZXNpemVCaWxpbmVhckdyYWRDb25maWcsXG4gICAgcmVzaXplTmVhcmVzdE5laWdoYm9yQ29uZmlnLFxuICAgIHJlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWRDb25maWcsXG4gICAgcmV2ZXJzZUNvbmZpZyxcbiAgICByb3RhdGVXaXRoT2Zmc2V0Q29uZmlnLFxuICAgIHJvdW5kQ29uZmlnLFxuICAgIHJzcXJ0Q29uZmlnLFxuICAgIHNjYXR0ZXJOZENvbmZpZyxcbiAgICBzZWxlY3RDb25maWcsXG4gICAgc2VsdUNvbmZpZyxcbiAgICBzaWdtb2lkQ29uZmlnLFxuICAgIHNpZ25Db25maWcsXG4gICAgc2luQ29uZmlnLFxuICAgIHNpbmhDb25maWcsXG4gICAgc2xpY2VDb25maWcsXG4gICAgc29mdG1heENvbmZpZyxcbiAgICBzb2Z0cGx1c0NvbmZpZyxcbiAgICBzcGFjZVRvQmF0Y2hORENvbmZpZyxcbiAgICBzcGFyc2VGaWxsRW1wdHlSb3dzQ29uZmlnLFxuICAgIHNwYXJzZVJlc2hhcGVDb25maWcsXG4gICAgc3BhcnNlU2VnbWVudE1lYW5Db25maWcsXG4gICAgc3BhcnNlU2VnbWVudFN1bUNvbmZpZyxcbiAgICBzcGFyc2VUb0RlbnNlQ29uZmlnLFxuICAgIHNwbGl0VkNvbmZpZyxcbiAgICBzcXJ0Q29uZmlnLFxuICAgIHNxdWFyZUNvbmZpZyxcbiAgICBzcXVhcmVkRGlmZmVyZW5jZUNvbmZpZyxcbiAgICBzdGVwQ29uZmlnLFxuICAgIHN0cmlkZWRTbGljZUNvbmZpZyxcbiAgICBzdHJpbmdOR3JhbXNDb25maWcsXG4gICAgc3RyaW5nU3BsaXRDb25maWcsXG4gICAgc3RyaW5nVG9IYXNoQnVja2V0RmFzdENvbmZpZyxcbiAgICBzdWJDb25maWcsXG4gICAgc3VtQ29uZmlnLFxuICAgIHRhbkNvbmZpZyxcbiAgICB0YW5oQ29uZmlnLFxuICAgIHRpbGVDb25maWcsXG4gICAgdG9wS0NvbmZpZyxcbiAgICB0cmFuc3Bvc2VDb25maWcsXG4gICAgdHJhbnNmb3JtQ29uZmlnLFxuICAgIHVuaXF1ZUNvbmZpZyxcbiAgICB1bnBhY2tDb25maWcsXG4gICAgdW5zb3J0ZWRTZWdtZW50U3VtQ29uZmlnLFxuICAgIHplcm9zTGlrZUNvbmZpZ1xuXTtcbmZvciAoY29uc3Qga2VybmVsQ29uZmlnIG9mIGtlcm5lbENvbmZpZ3MpIHtcbiAgICByZWdpc3Rlcktlcm5lbChrZXJuZWxDb25maWcpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVnaXN0ZXJfYWxsX2tlcm5lbHMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLy8gU2hhcmVkIGZ1bmN0aW9uYWxpdHkgYW1vbmcgYmFja2VuZHMuXG5leHBvcnQgeyBzaW1wbGVBYnNJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL0Ficyc7XG5leHBvcnQgeyBhZGRJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL0FkZCc7XG5leHBvcnQgeyBiaW5jb3VudEltcGwsIGJpbmNvdW50UmVkdWNlSW1wbCB9IGZyb20gJy4va2VybmVscy9CaW5jb3VudF9pbXBsJztcbmV4cG9ydCB7IGNlaWxJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL0NlaWwnO1xuZXhwb3J0IHsgY29uY2F0SW1wbCB9IGZyb20gJy4va2VybmVscy9Db25jYXRfaW1wbCc7XG5leHBvcnQgeyBlcXVhbEltcGwgfSBmcm9tICcuL2tlcm5lbHMvRXF1YWwnO1xuZXhwb3J0IHsgZXhwSW1wbCB9IGZyb20gJy4va2VybmVscy9FeHAnO1xuZXhwb3J0IHsgZXhwbTFJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL0V4cG0xJztcbmV4cG9ydCB7IGZsb29ySW1wbCB9IGZyb20gJy4va2VybmVscy9GbG9vcic7XG5leHBvcnQgeyBnYXRoZXJOZEltcGwgfSBmcm9tICcuL2tlcm5lbHMvR2F0aGVyTmRfSW1wbCc7XG5leHBvcnQgeyBnYXRoZXJWMkltcGwgfSBmcm9tICcuL2tlcm5lbHMvR2F0aGVyVjJfaW1wbCc7XG5leHBvcnQgeyBncmVhdGVySW1wbCB9IGZyb20gJy4va2VybmVscy9HcmVhdGVyJztcbmV4cG9ydCB7IGdyZWF0ZXJFcXVhbEltcGwgfSBmcm9tICcuL2tlcm5lbHMvR3JlYXRlckVxdWFsJztcbmV4cG9ydCB7IGxlc3NJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL0xlc3MnO1xuZXhwb3J0IHsgbGVzc0VxdWFsSW1wbCB9IGZyb20gJy4va2VybmVscy9MZXNzRXF1YWwnO1xuZXhwb3J0IHsgbGluU3BhY2VJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL0xpblNwYWNlX2ltcGwnO1xuZXhwb3J0IHsgbG9nSW1wbCB9IGZyb20gJy4va2VybmVscy9Mb2cnO1xuZXhwb3J0IHsgbWF4SW1wbCB9IGZyb20gJy4va2VybmVscy9NYXhfaW1wbCc7XG5leHBvcnQgeyBtYXhpbXVtSW1wbCB9IGZyb20gJy4va2VybmVscy9NYXhpbXVtJztcbmV4cG9ydCB7IG1pbmltdW1JbXBsIH0gZnJvbSAnLi9rZXJuZWxzL01pbmltdW0nO1xuZXhwb3J0IHsgbXVsdGlwbHlJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL011bHRpcGx5JztcbmV4cG9ydCB7IG5lZ0ltcGwgfSBmcm9tICcuL2tlcm5lbHMvTmVnJztcbmV4cG9ydCB7IG5vdEVxdWFsSW1wbCB9IGZyb20gJy4va2VybmVscy9Ob3RFcXVhbCc7XG5leHBvcnQgeyBwcm9kSW1wbCB9IGZyb20gJy4va2VybmVscy9Qcm9kJztcbmV4cG9ydCB7IHJhbmdlSW1wbCB9IGZyb20gJy4va2VybmVscy9SYW5nZV9pbXBsJztcbmV4cG9ydCB7IHJzcXJ0SW1wbCB9IGZyb20gJy4va2VybmVscy9Sc3FydCc7XG5leHBvcnQgeyBzbGljZUltcGwgfSBmcm9tICcuL2tlcm5lbHMvU2xpY2UnO1xuZXhwb3J0IHsgc3BhcnNlRmlsbEVtcHR5Um93c0ltcGwgfSBmcm9tICcuL2tlcm5lbHMvU3BhcnNlRmlsbEVtcHR5Um93c19pbXBsJztcbmV4cG9ydCB7IHNwYXJzZVJlc2hhcGVJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL1NwYXJzZVJlc2hhcGVfaW1wbCc7XG5leHBvcnQgeyBzcGFyc2VTZWdtZW50UmVkdWN0aW9uSW1wbCB9IGZyb20gJy4va2VybmVscy9TcGFyc2VTZWdtZW50UmVkdWN0aW9uX2ltcGwnO1xuZXhwb3J0IHsgc3F1YXJlZERpZmZlcmVuY2VJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL1NxdWFyZWREaWZmZXJlbmNlJztcbmV4cG9ydCB7IHN0cmlkZWRTbGljZUltcGwgfSBmcm9tICcuL2tlcm5lbHMvU3RyaWRlZFNsaWNlX2ltcGwnO1xuZXhwb3J0IHsgc3RyaW5nTkdyYW1zSW1wbCB9IGZyb20gJy4va2VybmVscy9TdHJpbmdOR3JhbXNfaW1wbCc7XG5leHBvcnQgeyBzdHJpbmdTcGxpdEltcGwgfSBmcm9tICcuL2tlcm5lbHMvU3RyaW5nU3BsaXRfaW1wbCc7XG5leHBvcnQgeyBzdHJpbmdUb0hhc2hCdWNrZXRGYXN0SW1wbCB9IGZyb20gJy4va2VybmVscy9TdHJpbmdUb0hhc2hCdWNrZXRGYXN0X2ltcGwnO1xuZXhwb3J0IHsgc3ViSW1wbCB9IGZyb20gJy4va2VybmVscy9TdWInO1xuZXhwb3J0IHsgdGlsZUltcGwgfSBmcm9tICcuL2tlcm5lbHMvVGlsZV9pbXBsJztcbmV4cG9ydCB7IHRvcEtJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL1RvcEtfaW1wbCc7XG5leHBvcnQgeyB0cmFuc3Bvc2VJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL1RyYW5zcG9zZV9pbXBsJztcbmV4cG9ydCB7IHVuaXF1ZUltcGwgfSBmcm9tICcuL2tlcm5lbHMvVW5pcXVlX2ltcGwnO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2hhcmVkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG4vKipcbiAqIFRlbXBsYXRlIHRoYXQgY3JlYXRlcyBpbXBsZW1lbnRhdGlvbiBmb3IgYmluYXJ5IG9wcy4gU3VwcG9ydHMgYnJvYWRjYXN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbChvcCkge1xuICAgIHJldHVybiAoYVNoYXBlLCBiU2hhcGUsIGFWYWxzLCBiVmFscywgZHR5cGUpID0+IHtcbiAgICAgICAgY29uc3QgbmV3U2hhcGUgPSBiYWNrZW5kX3V0aWwuYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoYVNoYXBlLCBiU2hhcGUpO1xuICAgICAgICBjb25zdCByZXN1bHRSYW5rID0gbmV3U2hhcGUubGVuZ3RoO1xuICAgICAgICBjb25zdCByZXN1bHRTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhuZXdTaGFwZSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUobmV3U2hhcGUpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSB1dGlsLmdldFR5cGVkQXJyYXlGcm9tRFR5cGUoZHR5cGUsIHJlc3VsdFNpemUpO1xuICAgICAgICBjb25zdCBhUmFuayA9IGFTaGFwZS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGJSYW5rID0gYlNoYXBlLmxlbmd0aDtcbiAgICAgICAgY29uc3QgYVN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGFTaGFwZSk7XG4gICAgICAgIGNvbnN0IGJTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhiU2hhcGUpO1xuICAgICAgICBjb25zdCBhQnJvYWRjYXN0RGltcyA9IGJhY2tlbmRfdXRpbC5nZXRCcm9hZGNhc3REaW1zKGFTaGFwZSwgbmV3U2hhcGUpO1xuICAgICAgICBjb25zdCBiQnJvYWRjYXN0RGltcyA9IGJhY2tlbmRfdXRpbC5nZXRCcm9hZGNhc3REaW1zKGJTaGFwZSwgbmV3U2hhcGUpO1xuICAgICAgICBpZiAoYUJyb2FkY2FzdERpbXMubGVuZ3RoICsgYkJyb2FkY2FzdERpbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IG9wKGFWYWxzW2kgJSBhVmFscy5sZW5ndGhdLCBiVmFsc1tpICUgYlZhbHMubGVuZ3RoXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvYyA9IHV0aWwuaW5kZXhUb0xvYyhpLCByZXN1bHRSYW5rLCByZXN1bHRTdHJpZGVzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhTG9jID0gbG9jLnNsaWNlKC1hUmFuayk7XG4gICAgICAgICAgICAgICAgYUJyb2FkY2FzdERpbXMuZm9yRWFjaChkID0+IGFMb2NbZF0gPSAwKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhSW5kZXggPSB1dGlsLmxvY1RvSW5kZXgoYUxvYywgYVJhbmssIGFTdHJpZGVzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBiTG9jID0gbG9jLnNsaWNlKC1iUmFuayk7XG4gICAgICAgICAgICAgICAgYkJyb2FkY2FzdERpbXMuZm9yRWFjaChkID0+IGJMb2NbZF0gPSAwKTtcbiAgICAgICAgICAgICAgICBjb25zdCBiSW5kZXggPSB1dGlsLmxvY1RvSW5kZXgoYkxvYywgYlJhbmssIGJTdHJpZGVzKTtcbiAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBvcChhVmFsc1thSW5kZXhdLCBiVmFsc1tiSW5kZXhdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW3Jlc3VsdCwgbmV3U2hhcGVdO1xuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iaW5hcnlfaW1wbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7IGNhc3QgfSBmcm9tICcuLi9rZXJuZWxzL0Nhc3QnO1xuaW1wb3J0IHsgY29tcGxleCB9IGZyb20gJy4uL2tlcm5lbHMvQ29tcGxleCc7XG4vKipcbiAqIFRlbXBsYXRlIHRoYXQgY3JlYXRlcyBhIGBLZXJuZWxGdW5jYCBmb3IgYmluYXJ5IG9wcy5cbiAqIEBwYXJhbSBuYW1lIEtlcm5lbCBuYW1lLlxuICogQHBhcmFtIGJpbmFyeUtlcm5lbEltcGwgQSBgU2ltcGxlQmluYXJ5S2VybmVsSW1wbGAgZm9yIHRoZSBrZXJuZWwuXG4gKiBAcGFyYW0gYmluYXJ5S2VybmVsQ29tcGxleEltcGwgT3B0aW9uYWwuIElmIGV4aXN0cywgcmVwcmVzZW50cyBhXG4gKiAgICAgYENvbXBsZXhCaW5hcnlLZXJuZWxJbXBsYCBmb3IgdGhlIGtlcm5lbCwgd2lsbCBiZSB1c2VkIHdoZW4gaW5wdXQgZHR5cGVcbiAqICAgICBpcyBgY29tcGxleDY0YC5cbiAqIEBwYXJhbSBkdHlwZSBPcHRpb25hbC4gSWYgc2V0LCB0aGUgcmVzdWx0IGhhcyB0aGlzIGR0eXBlLiBPdGhlcndpc2UsIHRoZVxuICogICAgIHJlc3VsdCBoYXMgdGhlIHNhbWUgZHR5cGUgYXMgdGhlIGZpcnN0IGlucHV0LiBUaGlzIGlzIG1haW5seSB1c2VkIGluXG4gKiAgICAgY29tcGFyaXNvbiBrZXJuZWxzLCBzdWNoIGFzIEVxdWFsLCBMZXNzLCBHcmVhdGVyLCBldGMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiaW5hcnlLZXJuZWxGdW5jKG5hbWUsIHNpbXBsZUltcGwsIGNvbXBsZXhJbXBsLCBkdHlwZSkge1xuICAgIGlmIChjb21wbGV4SW1wbCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAoeyBpbnB1dHMsIGJhY2tlbmQgfSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBhLCBiIH0gPSBpbnB1dHM7XG4gICAgICAgICAgICBjb25zdCBjcHVCYWNrZW5kID0gYmFja2VuZDtcbiAgICAgICAgICAgIGFzc2VydE5vdENvbXBsZXgoW2EsIGJdLCBuYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IGFWYWxzID0gY3B1QmFja2VuZC5kYXRhLmdldChhLmRhdGFJZCkudmFsdWVzO1xuICAgICAgICAgICAgY29uc3QgYlZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KGIuZGF0YUlkKS52YWx1ZXM7XG4gICAgICAgICAgICBjb25zdCBkZWNvZGVkQVZhbHMgPSBhLmR0eXBlID09PSAnc3RyaW5nJyA/XG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1hbnlcbiAgICAgICAgICAgICAgICBiYWNrZW5kX3V0aWwuZnJvbVVpbnQ4VG9TdHJpbmdBcnJheShhVmFscykgOlxuICAgICAgICAgICAgICAgIGFWYWxzO1xuICAgICAgICAgICAgY29uc3QgZGVjb2RlZEJWYWxzID0gYS5kdHlwZSA9PT0gJ3N0cmluZycgP1xuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tYW55XG4gICAgICAgICAgICAgICAgYmFja2VuZF91dGlsLmZyb21VaW50OFRvU3RyaW5nQXJyYXkoYlZhbHMpIDpcbiAgICAgICAgICAgICAgICBiVmFscztcbiAgICAgICAgICAgIGNvbnN0ICRkdHlwZSA9IGR0eXBlIHx8IGEuZHR5cGU7XG4gICAgICAgICAgICBjb25zdCBbcmVzdWx0RGF0YSwgcmVzdWx0U2hhcGVdID0gc2ltcGxlSW1wbChhLnNoYXBlLCBiLnNoYXBlLCBkZWNvZGVkQVZhbHMsIGRlY29kZWRCVmFscywgJGR0eXBlKTtcbiAgICAgICAgICAgIHJldHVybiBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHJlc3VsdFNoYXBlLCAkZHR5cGUsIHJlc3VsdERhdGEpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gKHsgaW5wdXRzLCBiYWNrZW5kIH0pID0+IHtcbiAgICAgICAgY29uc3QgeyBhLCBiIH0gPSBpbnB1dHM7XG4gICAgICAgIGNvbnN0IGNwdUJhY2tlbmQgPSBiYWNrZW5kO1xuICAgICAgICBpZiAoYS5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcgfHwgYi5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgICAgIGNvbnN0ICRhQ29tcGxleCA9IGNhc3QoeyBpbnB1dHM6IHsgeDogYSB9LCBiYWNrZW5kOiBjcHVCYWNrZW5kLCBhdHRyczogeyBkdHlwZTogJ2NvbXBsZXg2NCcgfSB9KTtcbiAgICAgICAgICAgIGNvbnN0ICRhQ29tcGxleFZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KCRhQ29tcGxleC5kYXRhSWQpO1xuICAgICAgICAgICAgY29uc3QgYVJlYWwgPSAkYUNvbXBsZXhWYWxzLmNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsO1xuICAgICAgICAgICAgY29uc3QgYUltYWcgPSAkYUNvbXBsZXhWYWxzLmNvbXBsZXhUZW5zb3JJbmZvcy5pbWFnO1xuICAgICAgICAgICAgY29uc3QgYVJlYWxWYWxzID0gY3B1QmFja2VuZC5kYXRhLmdldChhUmVhbC5kYXRhSWQpLnZhbHVlcztcbiAgICAgICAgICAgIGNvbnN0IGFJbWFnVmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoYUltYWcuZGF0YUlkKS52YWx1ZXM7XG4gICAgICAgICAgICBjb25zdCAkYkNvbXBsZXggPSBjYXN0KHsgaW5wdXRzOiB7IHg6IGIgfSwgYmFja2VuZDogY3B1QmFja2VuZCwgYXR0cnM6IHsgZHR5cGU6ICdjb21wbGV4NjQnIH0gfSk7XG4gICAgICAgICAgICBjb25zdCAkYkNvbXBsZXhWYWxzID0gY3B1QmFja2VuZC5kYXRhLmdldCgkYkNvbXBsZXguZGF0YUlkKTtcbiAgICAgICAgICAgIGNvbnN0IGJSZWFsID0gJGJDb21wbGV4VmFscy5jb21wbGV4VGVuc29ySW5mb3MucmVhbDtcbiAgICAgICAgICAgIGNvbnN0IGJJbWFnID0gJGJDb21wbGV4VmFscy5jb21wbGV4VGVuc29ySW5mb3MuaW1hZztcbiAgICAgICAgICAgIGNvbnN0IGJSZWFsVmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoYlJlYWwuZGF0YUlkKS52YWx1ZXM7XG4gICAgICAgICAgICBjb25zdCBiSW1hZ1ZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KGJJbWFnLmRhdGFJZCkudmFsdWVzO1xuICAgICAgICAgICAgY29uc3QgW3Jlc3VsdFJlYWxEYXRhLCByZXN1bHRJbWFnRGF0YSwgcmVzdWx0U2hhcGVdID0gY29tcGxleEltcGwoYS5zaGFwZSwgYi5zaGFwZSwgYVJlYWxWYWxzLCBhSW1hZ1ZhbHMsIGJSZWFsVmFscywgYkltYWdWYWxzKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdFJlYWwgPSBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHJlc3VsdFNoYXBlLCAnZmxvYXQzMicsIHJlc3VsdFJlYWxEYXRhKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdEltYWcgPSBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHJlc3VsdFNoYXBlLCAnZmxvYXQzMicsIHJlc3VsdEltYWdEYXRhKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBsZXgoeyBpbnB1dHM6IHsgcmVhbDogcmVzdWx0UmVhbCwgaW1hZzogcmVzdWx0SW1hZyB9LCBiYWNrZW5kOiBjcHVCYWNrZW5kIH0pO1xuICAgICAgICAgICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbygkYUNvbXBsZXgpO1xuICAgICAgICAgICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbygkYkNvbXBsZXgpO1xuICAgICAgICAgICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXN1bHRSZWFsKTtcbiAgICAgICAgICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVzdWx0SW1hZyk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgYVZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KGEuZGF0YUlkKS52YWx1ZXM7XG4gICAgICAgICAgICBjb25zdCBiVmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoYi5kYXRhSWQpLnZhbHVlcztcbiAgICAgICAgICAgIGNvbnN0ICRkdHlwZSA9IGR0eXBlIHx8IGEuZHR5cGU7XG4gICAgICAgICAgICBjb25zdCBbcmVzdWx0RGF0YSwgcmVzdWx0U2hhcGVdID0gc2ltcGxlSW1wbChhLnNoYXBlLCBiLnNoYXBlLCBhVmFscywgYlZhbHMsICRkdHlwZSk7XG4gICAgICAgICAgICByZXR1cm4gY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbyhyZXN1bHRTaGFwZSwgJGR0eXBlLCByZXN1bHREYXRhKTtcbiAgICAgICAgfVxuICAgIH07XG59XG4vKipcbiAqIFRlbXBsYXRlIHRoYXQgY3JlYXRlcyB0aGUgY29tcGxleCB0eXBlIGltcGxlbWVudGF0aW9uIGZvciBiaW5hcnkgb3BzLlxuICogU3VwcG9ydHMgYnJvYWRjYXN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29tcGxleEJpbmFyeUtlcm5lbEltcGwob3ApIHtcbiAgICByZXR1cm4gKGFTaGFwZSwgYlNoYXBlLCBhUmVhbFZhbHMsIGFJbWFnVmFscywgYlJlYWxWYWxzLCBiSW1hZ1ZhbHMpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0U2hhcGUgPSBiYWNrZW5kX3V0aWwuYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoYVNoYXBlLCBiU2hhcGUpO1xuICAgICAgICBjb25zdCByZXN1bHRTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlc3VsdFNoYXBlKTtcbiAgICAgICAgY29uc3QgcmVzdWx0UmFuayA9IHJlc3VsdFNoYXBlLmxlbmd0aDtcbiAgICAgICAgY29uc3QgcmVzdWx0U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMocmVzdWx0U2hhcGUpO1xuICAgICAgICBjb25zdCByZXN1bHRSZWFsVmFscyA9IHV0aWwuZ2V0VHlwZWRBcnJheUZyb21EVHlwZSgnZmxvYXQzMicsIHJlc3VsdFNpemUpO1xuICAgICAgICBjb25zdCByZXN1bHRJbWFnVmFscyA9IHV0aWwuZ2V0VHlwZWRBcnJheUZyb21EVHlwZSgnZmxvYXQzMicsIHJlc3VsdFNpemUpO1xuICAgICAgICBjb25zdCBhQnJvYWRjYXN0RGltcyA9IGJhY2tlbmRfdXRpbC5nZXRCcm9hZGNhc3REaW1zKGFTaGFwZSwgcmVzdWx0U2hhcGUpO1xuICAgICAgICBjb25zdCBiQnJvYWRjYXN0RGltcyA9IGJhY2tlbmRfdXRpbC5nZXRCcm9hZGNhc3REaW1zKGJTaGFwZSwgcmVzdWx0U2hhcGUpO1xuICAgICAgICBjb25zdCBhVmFscyA9IGJhY2tlbmRfdXRpbC5tZXJnZVJlYWxBbmRJbWFnQXJyYXlzKGFSZWFsVmFscywgYUltYWdWYWxzKTtcbiAgICAgICAgY29uc3QgYlZhbHMgPSBiYWNrZW5kX3V0aWwubWVyZ2VSZWFsQW5kSW1hZ0FycmF5cyhiUmVhbFZhbHMsIGJJbWFnVmFscyk7XG4gICAgICAgIGNvbnN0IGFSYW5rID0gYVNoYXBlLmxlbmd0aDtcbiAgICAgICAgY29uc3QgYVN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGFTaGFwZSk7XG4gICAgICAgIGNvbnN0IGJSYW5rID0gYlNoYXBlLmxlbmd0aDtcbiAgICAgICAgY29uc3QgYlN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGJTaGFwZSk7XG4gICAgICAgIGlmIChhQnJvYWRjYXN0RGltcy5sZW5ndGggKyBiQnJvYWRjYXN0RGltcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0UmVhbFZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhSWR4ID0gaSAlIGFWYWxzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBjb25zdCBiSWR4ID0gaSAlIGJWYWxzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvcChhVmFsc1thSWR4ICogMl0sIGFWYWxzW2FJZHggKiAyICsgMV0sIGJWYWxzW2JJZHggKiAyXSwgYlZhbHNbYklkeCAqIDIgKyAxXSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0UmVhbFZhbHNbaV0gPSByZXN1bHQucmVhbDtcbiAgICAgICAgICAgICAgICByZXN1bHRJbWFnVmFsc1tpXSA9IHJlc3VsdC5pbWFnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRSZWFsVmFscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvYyA9IHV0aWwuaW5kZXhUb0xvYyhpLCByZXN1bHRSYW5rLCByZXN1bHRTdHJpZGVzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhTG9jID0gbG9jLnNsaWNlKC1hUmFuayk7XG4gICAgICAgICAgICAgICAgYUJyb2FkY2FzdERpbXMuZm9yRWFjaChkID0+IGFMb2NbZF0gPSAwKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhSW5kZXggPSB1dGlsLmxvY1RvSW5kZXgoYUxvYywgYVJhbmssIGFTdHJpZGVzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBiTG9jID0gbG9jLnNsaWNlKC1iUmFuayk7XG4gICAgICAgICAgICAgICAgYkJyb2FkY2FzdERpbXMuZm9yRWFjaChkID0+IGJMb2NbZF0gPSAwKTtcbiAgICAgICAgICAgICAgICBjb25zdCBiSW5kZXggPSB1dGlsLmxvY1RvSW5kZXgoYkxvYywgYlJhbmssIGJTdHJpZGVzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBvcFJlc3VsdCA9IG9wKGFWYWxzW2FJbmRleCAqIDJdLCBhVmFsc1thSW5kZXggKiAyICsgMV0sIGJWYWxzW2JJbmRleCAqIDJdLCBiVmFsc1tiSW5kZXggKiAyICsgMV0pO1xuICAgICAgICAgICAgICAgIHJlc3VsdFJlYWxWYWxzW2ldID0gb3BSZXN1bHQucmVhbDtcbiAgICAgICAgICAgICAgICByZXN1bHRJbWFnVmFsc1tpXSA9IG9wUmVzdWx0LmltYWc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtyZXN1bHRSZWFsVmFscywgcmVzdWx0SW1hZ1ZhbHMsIHJlc3VsdFNoYXBlXTtcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmluYXJ5X3V0aWxzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhZGQgfSBmcm9tICcuLi9rZXJuZWxzL0FkZCc7XG5pbXBvcnQgeyBjb21wbGV4IH0gZnJvbSAnLi4va2VybmVscy9Db21wbGV4JztcbmltcG9ydCB7IGNvbmNhdCB9IGZyb20gJy4uL2tlcm5lbHMvQ29uY2F0JztcbmltcG9ydCB7IGlkZW50aXR5IH0gZnJvbSAnLi4va2VybmVscy9JZGVudGl0eSc7XG5pbXBvcnQgeyBpbWFnIH0gZnJvbSAnLi4va2VybmVscy9JbWFnJztcbmltcG9ydCB7IG11bHRpcGx5IH0gZnJvbSAnLi4va2VybmVscy9NdWx0aXBseSc7XG5pbXBvcnQgeyByZWFsIH0gZnJvbSAnLi4va2VybmVscy9SZWFsJztcbmltcG9ydCB7IHJlYWxEaXZDb25maWcgfSBmcm9tICcuLi9rZXJuZWxzL1JlYWxEaXYnO1xuaW1wb3J0IHsgc2xpY2UgfSBmcm9tICcuLi9rZXJuZWxzL1NsaWNlJztcbmltcG9ydCB7IHN1YiB9IGZyb20gJy4uL2tlcm5lbHMvU3ViJztcbi8qKlxuICogQ2FsY3VsYXRlIEZGVCBvZiBpbm5lciBtb3N0IGVsZW1lbnRzIG9mIGJhdGNoIHRlbnNvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZmdEJhdGNoKGlucHV0LCBpbnZlcnNlLCBjcHVCYWNrZW5kKSB7XG4gICAgY29uc3QgaW5wdXRTaGFwZSA9IGlucHV0LnNoYXBlO1xuICAgIGNvbnN0IGJhdGNoID0gaW5wdXRTaGFwZVswXTtcbiAgICBjb25zdCBpbm5lckRpbSA9IGlucHV0U2hhcGVbMV07XG4gICAgY29uc3QgaW5wdXRWYWxzID0gY3B1QmFja2VuZC5kYXRhLmdldChpbnB1dC5kYXRhSWQpO1xuICAgIGNvbnN0IHJlYWwyRCA9IGlucHV0VmFscy5jb21wbGV4VGVuc29ySW5mb3MucmVhbDtcbiAgICBjb25zdCBpbWFnMkQgPSBpbnB1dFZhbHMuY29tcGxleFRlbnNvckluZm9zLmltYWc7XG4gICAgLy8gQ29sbGVjdHMgcmVhbCBhbmQgaW1hZ2luYXJ5IHZhbHVlcyBzZXBhcmF0ZWx5LlxuICAgIGNvbnN0IHJlc3VsdFNoYXBlID0gW2JhdGNoLCBpbm5lckRpbV07XG4gICAgY29uc3QgcmVzdWx0U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShyZXN1bHRTaGFwZSk7XG4gICAgY29uc3QgcmVzdWx0UmVhbCA9IHV0aWwuZ2V0VHlwZWRBcnJheUZyb21EVHlwZSgnZmxvYXQzMicsIHJlc3VsdFNpemUpO1xuICAgIGNvbnN0IHJlc3VsdEltYWcgPSB1dGlsLmdldFR5cGVkQXJyYXlGcm9tRFR5cGUoJ2Zsb2F0MzInLCByZXN1bHRTaXplKTtcbiAgICBmb3IgKGxldCBiID0gMDsgYiA8IGJhdGNoOyBiKyspIHtcbiAgICAgICAgLy8gVE9ETzogU3VwcG9ydCBzbGljZSBvcHMgZm9yIGNvbXBsZXggdHlwZS5cbiAgICAgICAgY29uc3QgciA9IHNsaWNlKHtcbiAgICAgICAgICAgIGlucHV0czogeyB4OiByZWFsMkQgfSxcbiAgICAgICAgICAgIGJhY2tlbmQ6IGNwdUJhY2tlbmQsXG4gICAgICAgICAgICBhdHRyczogeyBiZWdpbjogW2IsIDBdLCBzaXplOiBbMSwgaW5uZXJEaW1dIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGkgPSBzbGljZSh7XG4gICAgICAgICAgICBpbnB1dHM6IHsgeDogaW1hZzJEIH0sXG4gICAgICAgICAgICBiYWNrZW5kOiBjcHVCYWNrZW5kLFxuICAgICAgICAgICAgYXR0cnM6IHsgYmVnaW46IFtiLCAwXSwgc2l6ZTogWzEsIGlubmVyRGltXSB9XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBpbnB1dCA9IGNvbXBsZXgoeyBpbnB1dHM6IHsgcmVhbDogciwgaW1hZzogaSB9LCBiYWNrZW5kOiBjcHVCYWNrZW5kIH0pO1xuICAgICAgICAvLyBSdW4gRkZUIGJ5IGJhdGNoIGVsZW1lbnQuXG4gICAgICAgIGNvbnN0IHsgcmVhbCwgaW1hZyB9ID0gZmZ0SW1wbChpbnB1dCwgaW52ZXJzZSwgY3B1QmFja2VuZCk7XG4gICAgICAgIGNvbnN0IHJlcyA9IGJhY2tlbmRfdXRpbC5tZXJnZVJlYWxBbmRJbWFnQXJyYXlzKHJlYWwsIGltYWcpO1xuICAgICAgICBmb3IgKGxldCBkID0gMDsgZCA8IGlubmVyRGltOyBkKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGMgPSBiYWNrZW5kX3V0aWwuZ2V0Q29tcGxleFdpdGhJbmRleChyZXMsIGQpO1xuICAgICAgICAgICAgcmVzdWx0UmVhbFtiICogaW5uZXJEaW0gKyBkXSA9IGMucmVhbDtcbiAgICAgICAgICAgIHJlc3VsdEltYWdbYiAqIGlubmVyRGltICsgZF0gPSBjLmltYWc7XG4gICAgICAgIH1cbiAgICAgICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyKTtcbiAgICAgICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpKTtcbiAgICAgICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpbnB1dCk7XG4gICAgfVxuICAgIGNvbnN0ICRyZWFsSW5mbyA9IGNwdUJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVzdWx0U2hhcGUsICdmbG9hdDMyJywgcmVzdWx0UmVhbCk7XG4gICAgY29uc3QgJGltYWdJbmZvID0gY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbyhyZXN1bHRTaGFwZSwgJ2Zsb2F0MzInLCByZXN1bHRJbWFnKTtcbiAgICBjb25zdCByZXN1bHQgPSBjb21wbGV4KHsgaW5wdXRzOiB7IHJlYWw6ICRyZWFsSW5mbywgaW1hZzogJGltYWdJbmZvIH0sIGJhY2tlbmQ6IGNwdUJhY2tlbmQgfSk7XG4gICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbygkcmVhbEluZm8pO1xuICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oJGltYWdJbmZvKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZmdEltcGwoaW5wdXQsIGludmVyc2UsIGNwdUJhY2tlbmQpIHtcbiAgICBjb25zdCBpbnB1dFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoaW5wdXQuc2hhcGUpO1xuICAgIGNvbnN0IGlucHV0VmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoaW5wdXQuZGF0YUlkKTtcbiAgICBjb25zdCByZWFsVmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoaW5wdXRWYWxzLmNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IGltYWdWYWxzID0gY3B1QmFja2VuZC5kYXRhLmdldChpbnB1dFZhbHMuY29tcGxleFRlbnNvckluZm9zLmltYWcuZGF0YUlkKS52YWx1ZXM7XG4gICAgaWYgKGlzRXhwb25lbnRPZjIoaW5wdXRTaXplKSkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBmZnRSYWRpeDIocmVhbFZhbHMsIGltYWdWYWxzLCBpbnB1dFNpemUsIGludmVyc2UsIGNwdUJhY2tlbmQpO1xuICAgICAgICBjb25zdCByZXN1bHRTaGFwZSA9IFtpbnB1dC5zaGFwZVswXSwgaW5wdXQuc2hhcGVbMV1dO1xuICAgICAgICBpZiAoaW52ZXJzZSkge1xuICAgICAgICAgICAgY29uc3QgcmVhbEluZm8gPSBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHJlc3VsdFNoYXBlLCAnZmxvYXQzMicsIHJlc3VsdC5yZWFsKTtcbiAgICAgICAgICAgIGNvbnN0IGltYWdJbmZvID0gY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbyhyZXN1bHRTaGFwZSwgJ2Zsb2F0MzInLCByZXN1bHQuaW1hZyk7XG4gICAgICAgICAgICBjb25zdCBzaXplSW5mbyA9IGNwdUJhY2tlbmQubWFrZVRlbnNvckluZm8oW10sICdmbG9hdDMyJywgdXRpbC5jcmVhdGVTY2FsYXJWYWx1ZShpbnB1dFNpemUsICdmbG9hdDMyJykpO1xuICAgICAgICAgICAgY29uc3Qgc2l6ZUluZm9Db3B5ID0gaWRlbnRpdHkoeyBpbnB1dHM6IHsgeDogc2l6ZUluZm8gfSwgYmFja2VuZDogY3B1QmFja2VuZCB9KTtcbiAgICAgICAgICAgIGNvbnN0IGRpdlJlYWxJbmZvID0gcmVhbERpdkNvbmZpZy5rZXJuZWxGdW5jKHsgaW5wdXRzOiB7IGE6IHJlYWxJbmZvLCBiOiBzaXplSW5mbyB9LCBiYWNrZW5kOiBjcHVCYWNrZW5kIH0pO1xuICAgICAgICAgICAgY29uc3QgZGl2SW1hZ0luZm8gPSByZWFsRGl2Q29uZmlnLmtlcm5lbEZ1bmMoeyBpbnB1dHM6IHsgYTogaW1hZ0luZm8sIGI6IHNpemVJbmZvQ29weSB9LCBiYWNrZW5kOiBjcHVCYWNrZW5kIH0pO1xuICAgICAgICAgICAgY29uc3QgZGl2UmVhbFZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KGRpdlJlYWxJbmZvLmRhdGFJZCkudmFsdWVzO1xuICAgICAgICAgICAgY29uc3QgZGl2SW1hZ1ZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KGRpdkltYWdJbmZvLmRhdGFJZCkudmFsdWVzO1xuICAgICAgICAgICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZWFsSW5mbyk7XG4gICAgICAgICAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGltYWdJbmZvKTtcbiAgICAgICAgICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oc2l6ZUluZm8pO1xuICAgICAgICAgICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhzaXplSW5mb0NvcHkpO1xuICAgICAgICAgICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhkaXZSZWFsSW5mbyk7XG4gICAgICAgICAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGRpdkltYWdJbmZvKTtcbiAgICAgICAgICAgIHJldHVybiB7IHJlYWw6IGRpdlJlYWxWYWxzLCBpbWFnOiBkaXZJbWFnVmFscyB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBkYXRhID0gYmFja2VuZF91dGlsLm1lcmdlUmVhbEFuZEltYWdBcnJheXMocmVhbFZhbHMsIGltYWdWYWxzKTtcbiAgICAgICAgY29uc3QgcmF3T3V0cHV0ID0gZm91cmllclRyYW5zZm9ybUJ5TWF0bXVsKGRhdGEsIGlucHV0U2l6ZSwgaW52ZXJzZSk7XG4gICAgICAgIHJldHVybiBiYWNrZW5kX3V0aWwuc3BsaXRSZWFsQW5kSW1hZ0FycmF5cyhyYXdPdXRwdXQpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGlzRXhwb25lbnRPZjIoc2l6ZSkge1xuICAgIHJldHVybiAoc2l6ZSAmIHNpemUgLSAxKSA9PT0gMDtcbn1cbi8vIEZGVCB1c2luZyBDb29sZXktVHVrZXkgYWxnb3JpdGhtIG9uIHJhZGl4IDIgZGltZW5zaW9uYWwgaW5wdXQuXG5mdW5jdGlvbiBmZnRSYWRpeDIocmVhbFZhbHMsIGltYWdWYWxzLCBzaXplLCBpbnZlcnNlLCBjcHVCYWNrZW5kKSB7XG4gICAgaWYgKHNpemUgPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHsgcmVhbDogcmVhbFZhbHMsIGltYWc6IGltYWdWYWxzIH07XG4gICAgfVxuICAgIGNvbnN0IGRhdGEgPSBiYWNrZW5kX3V0aWwubWVyZ2VSZWFsQW5kSW1hZ0FycmF5cyhyZWFsVmFscywgaW1hZ1ZhbHMpO1xuICAgIGNvbnN0IGhhbGYgPSBzaXplIC8gMjtcbiAgICBjb25zdCBldmVuQ29tcGxleCA9IGJhY2tlbmRfdXRpbC5jb21wbGV4V2l0aEV2ZW5JbmRleChkYXRhKTtcbiAgICBjb25zdCBldmVuUmVhbFZhbHMgPSBldmVuQ29tcGxleC5yZWFsO1xuICAgIGNvbnN0IGV2ZW5JbWFnVmFscyA9IGV2ZW5Db21wbGV4LmltYWc7XG4gICAgY29uc3QgZXZlblNoYXBlID0gW2V2ZW5SZWFsVmFscy5sZW5ndGhdO1xuICAgIGNvbnN0IGV2ZW5SZWFsSW5mbyA9IGNwdUJhY2tlbmQubWFrZVRlbnNvckluZm8oZXZlblNoYXBlLCAnZmxvYXQzMicsIGV2ZW5SZWFsVmFscyk7XG4gICAgY29uc3QgZXZlbkltYWdJbmZvID0gY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbyhldmVuU2hhcGUsICdmbG9hdDMyJywgZXZlbkltYWdWYWxzKTtcbiAgICBjb25zdCBldmVuVGVuc29ySW5mbyA9IGNvbXBsZXgoeyBpbnB1dHM6IHsgcmVhbDogZXZlblJlYWxJbmZvLCBpbWFnOiBldmVuSW1hZ0luZm8gfSwgYmFja2VuZDogY3B1QmFja2VuZCB9KTtcbiAgICBjb25zdCBvZGRDb21wbGV4ID0gYmFja2VuZF91dGlsLmNvbXBsZXhXaXRoT2RkSW5kZXgoZGF0YSk7XG4gICAgY29uc3Qgb2RkUmVhbFZhbHMgPSBvZGRDb21wbGV4LnJlYWw7XG4gICAgY29uc3Qgb2RkSW1hZ1ZhbHMgPSBvZGRDb21wbGV4LmltYWc7XG4gICAgY29uc3Qgb2RkU2hhcGUgPSBbb2RkUmVhbFZhbHMubGVuZ3RoXTtcbiAgICBjb25zdCBvZGRSZWFsSW5mbyA9IGNwdUJhY2tlbmQubWFrZVRlbnNvckluZm8ob2RkU2hhcGUsICdmbG9hdDMyJywgb2RkUmVhbFZhbHMpO1xuICAgIGNvbnN0IG9kZEltYWdJbmZvID0gY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbyhvZGRTaGFwZSwgJ2Zsb2F0MzInLCBvZGRJbWFnVmFscyk7XG4gICAgY29uc3Qgb2RkVGVuc29ySW5mbyA9IGNvbXBsZXgoeyBpbnB1dHM6IHsgcmVhbDogb2RkUmVhbEluZm8sIGltYWc6IG9kZEltYWdJbmZvIH0sIGJhY2tlbmQ6IGNwdUJhY2tlbmQgfSk7XG4gICAgLy8gUmVjdXJzaXZlIGNhbGwgZm9yIGhhbGYgcGFydCBvZiBvcmlnaW5hbCBpbnB1dC5cbiAgICBjb25zdCAkZXZlbkNvbXBsZXggPSBmZnRSYWRpeDIoZXZlblJlYWxWYWxzLCBldmVuSW1hZ1ZhbHMsIGhhbGYsIGludmVyc2UsIGNwdUJhY2tlbmQpO1xuICAgIGNvbnN0ICRldmVuUmVhbFZhbHMgPSAkZXZlbkNvbXBsZXgucmVhbDtcbiAgICBjb25zdCAkZXZlbkltYWdWYWxzID0gJGV2ZW5Db21wbGV4LmltYWc7XG4gICAgY29uc3QgJGV2ZW5TaGFwZSA9IFskZXZlblJlYWxWYWxzLmxlbmd0aF07XG4gICAgY29uc3QgJGV2ZW5SZWFsSW5mbyA9IGNwdUJhY2tlbmQubWFrZVRlbnNvckluZm8oJGV2ZW5TaGFwZSwgJ2Zsb2F0MzInLCAkZXZlblJlYWxWYWxzKTtcbiAgICBjb25zdCAkZXZlbkltYWdJbmZvID0gY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbygkZXZlblNoYXBlLCAnZmxvYXQzMicsICRldmVuSW1hZ1ZhbHMpO1xuICAgIGNvbnN0ICRldmVuVGVuc29ySW5mbyA9IGNvbXBsZXgoe1xuICAgICAgICBpbnB1dHM6IHsgcmVhbDogJGV2ZW5SZWFsSW5mbywgaW1hZzogJGV2ZW5JbWFnSW5mbyB9LFxuICAgICAgICBiYWNrZW5kOiBjcHVCYWNrZW5kXG4gICAgfSk7XG4gICAgY29uc3QgJG9kZENvbXBsZXggPSBmZnRSYWRpeDIob2RkUmVhbFZhbHMsIG9kZEltYWdWYWxzLCBoYWxmLCBpbnZlcnNlLCBjcHVCYWNrZW5kKTtcbiAgICBjb25zdCAkb2RkUmVhbFZhbHMgPSAkb2RkQ29tcGxleC5yZWFsO1xuICAgIGNvbnN0ICRvZGRJbWFnVmFscyA9ICRvZGRDb21wbGV4LmltYWc7XG4gICAgY29uc3QgJG9kZFNoYXBlID0gWyRvZGRSZWFsVmFscy5sZW5ndGhdO1xuICAgIGNvbnN0ICRvZGRSZWFsSW5mbyA9IGNwdUJhY2tlbmQubWFrZVRlbnNvckluZm8oJG9kZFNoYXBlLCAnZmxvYXQzMicsICRvZGRSZWFsVmFscyk7XG4gICAgY29uc3QgJG9kZEltYWdJbmZvID0gY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbygkb2RkU2hhcGUsICdmbG9hdDMyJywgJG9kZEltYWdWYWxzKTtcbiAgICBjb25zdCAkb2RkVGVuc29ySW5mbyA9IGNvbXBsZXgoeyBpbnB1dHM6IHsgcmVhbDogJG9kZFJlYWxJbmZvLCBpbWFnOiAkb2RkSW1hZ0luZm8gfSwgYmFja2VuZDogY3B1QmFja2VuZCB9KTtcbiAgICBjb25zdCBlID0gYmFja2VuZF91dGlsLmV4cG9uZW50cyhzaXplLCBpbnZlcnNlKTtcbiAgICBjb25zdCBlU2hhcGUgPSBbZS5yZWFsLmxlbmd0aF07XG4gICAgY29uc3QgZVJlYWxJbmZvID0gY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbyhlU2hhcGUsICdmbG9hdDMyJywgZS5yZWFsKTtcbiAgICBjb25zdCBlSW1hZ0luZm8gPSBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGVTaGFwZSwgJ2Zsb2F0MzInLCBlLmltYWcpO1xuICAgIGNvbnN0IGNvbXBsZXhJbmZvID0gY29tcGxleCh7IGlucHV0czogeyByZWFsOiBlUmVhbEluZm8sIGltYWc6IGVJbWFnSW5mbyB9LCBiYWNrZW5kOiBjcHVCYWNrZW5kIH0pO1xuICAgIGNvbnN0IGV4cG9uZW50SW5mbyA9IG11bHRpcGx5KHsgaW5wdXRzOiB7IGE6IGNvbXBsZXhJbmZvLCBiOiAkb2RkVGVuc29ySW5mbyB9LCBiYWNrZW5kOiBjcHVCYWNrZW5kIH0pO1xuICAgIGNvbnN0IGFkZFBhcnQgPSBhZGQoe1xuICAgICAgICBpbnB1dHM6IHsgYTogJGV2ZW5UZW5zb3JJbmZvLCBiOiBleHBvbmVudEluZm8gfSxcbiAgICAgICAgYmFja2VuZDogY3B1QmFja2VuZFxuICAgIH0pO1xuICAgIGNvbnN0IHN1YlBhcnQgPSBzdWIoe1xuICAgICAgICBpbnB1dHM6IHsgYTogJGV2ZW5UZW5zb3JJbmZvLCBiOiBleHBvbmVudEluZm8gfSxcbiAgICAgICAgYmFja2VuZDogY3B1QmFja2VuZFxuICAgIH0pO1xuICAgIGNvbnN0IGFkZFBhcnRSZWFsID0gcmVhbCh7IGlucHV0czogeyBpbnB1dDogYWRkUGFydCB9LCBiYWNrZW5kOiBjcHVCYWNrZW5kIH0pO1xuICAgIGNvbnN0IHN1YlBhcnRSZWFsID0gcmVhbCh7IGlucHV0czogeyBpbnB1dDogc3ViUGFydCB9LCBiYWNrZW5kOiBjcHVCYWNrZW5kIH0pO1xuICAgIGNvbnN0IGFkZFBhcnRJbWFnID0gaW1hZyh7IGlucHV0czogeyBpbnB1dDogYWRkUGFydCB9LCBiYWNrZW5kOiBjcHVCYWNrZW5kIH0pO1xuICAgIGNvbnN0IHN1YlBhcnRJbWFnID0gaW1hZyh7IGlucHV0czogeyBpbnB1dDogc3ViUGFydCB9LCBiYWNrZW5kOiBjcHVCYWNrZW5kIH0pO1xuICAgIGNvbnN0ICRyZWFsID0gY29uY2F0KHtcbiAgICAgICAgaW5wdXRzOiBbYWRkUGFydFJlYWwsIHN1YlBhcnRSZWFsXSxcbiAgICAgICAgYmFja2VuZDogY3B1QmFja2VuZCxcbiAgICAgICAgYXR0cnM6IHsgYXhpczogMCB9XG4gICAgfSk7XG4gICAgY29uc3QgJGltYWcgPSBjb25jYXQoe1xuICAgICAgICBpbnB1dHM6IFthZGRQYXJ0SW1hZywgc3ViUGFydEltYWddLFxuICAgICAgICBiYWNrZW5kOiBjcHVCYWNrZW5kLFxuICAgICAgICBhdHRyczogeyBheGlzOiAwIH1cbiAgICB9KTtcbiAgICBjb25zdCAkcmVhbFZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KCRyZWFsLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0ICRpbWFnVmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoJGltYWcuZGF0YUlkKS52YWx1ZXM7XG4gICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhldmVuUmVhbEluZm8pO1xuICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oZXZlbkltYWdJbmZvKTtcbiAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGV2ZW5UZW5zb3JJbmZvKTtcbiAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG9kZFJlYWxJbmZvKTtcbiAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG9kZEltYWdJbmZvKTtcbiAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG9kZFRlbnNvckluZm8pO1xuICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oJGV2ZW5SZWFsSW5mbyk7XG4gICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbygkZXZlbkltYWdJbmZvKTtcbiAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKCRldmVuVGVuc29ySW5mbyk7XG4gICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbygkb2RkUmVhbEluZm8pO1xuICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oJG9kZEltYWdJbmZvKTtcbiAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKCRvZGRUZW5zb3JJbmZvKTtcbiAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGVSZWFsSW5mbyk7XG4gICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhlSW1hZ0luZm8pO1xuICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oY29tcGxleEluZm8pO1xuICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oZXhwb25lbnRJbmZvKTtcbiAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGFkZFBhcnQpO1xuICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oc3ViUGFydCk7XG4gICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhhZGRQYXJ0UmVhbCk7XG4gICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhhZGRQYXJ0SW1hZyk7XG4gICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhzdWJQYXJ0UmVhbCk7XG4gICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhzdWJQYXJ0SW1hZyk7XG4gICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbygkcmVhbCk7XG4gICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbygkaW1hZyk7XG4gICAgcmV0dXJuIHsgcmVhbDogJHJlYWxWYWxzLCBpbWFnOiAkaW1hZ1ZhbHMgfTtcbn1cbi8vIENhbGN1bGF0ZSBmb3VyaWVyIHRyYW5zZm9ybSBieSBtdWx0cGx5aW5nIHNpbnVzb2lkIG1hdHJpeC5cbmZ1bmN0aW9uIGZvdXJpZXJUcmFuc2Zvcm1CeU1hdG11bChkYXRhLCBzaXplLCBpbnZlcnNlKSB7XG4gICAgY29uc3QgcmV0ID0gbmV3IEZsb2F0MzJBcnJheShzaXplICogMik7XG4gICAgLy8gVE9ETzogVXNlIG1hdG11bCBpbnN0ZWFkIG9uY2UgaXQgc3VwcG9ydHMgY29tcGxleDY0IHR5cGUuXG4gICAgZm9yIChsZXQgciA9IDA7IHIgPCBzaXplOyByKyspIHtcbiAgICAgICAgbGV0IHJlYWwgPSAwLjA7XG4gICAgICAgIGxldCBpbWFnID0gMC4wO1xuICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IHNpemU7IGMrKykge1xuICAgICAgICAgICAgY29uc3QgZSA9IGJhY2tlbmRfdXRpbC5leHBvbmVudChyICogYywgc2l6ZSwgaW52ZXJzZSk7XG4gICAgICAgICAgICBjb25zdCB0ZXJtID0gYmFja2VuZF91dGlsLmdldENvbXBsZXhXaXRoSW5kZXgoZGF0YSwgYyk7XG4gICAgICAgICAgICByZWFsICs9IHRlcm0ucmVhbCAqIGUucmVhbCAtIHRlcm0uaW1hZyAqIGUuaW1hZztcbiAgICAgICAgICAgIGltYWcgKz0gdGVybS5yZWFsICogZS5pbWFnICsgdGVybS5pbWFnICogZS5yZWFsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnZlcnNlKSB7XG4gICAgICAgICAgICByZWFsIC89IHNpemU7XG4gICAgICAgICAgICBpbWFnIC89IHNpemU7XG4gICAgICAgIH1cbiAgICAgICAgYmFja2VuZF91dGlsLmFzc2lnblRvVHlwZWRBcnJheShyZXQsIHJlYWwsIGltYWcsIHIpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmZ0X3V0aWxzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGVsdSB9IGZyb20gJy4uL2tlcm5lbHMvRWx1JztcbmltcG9ydCB7IGlkZW50aXR5IH0gZnJvbSAnLi4va2VybmVscy9JZGVudGl0eSc7XG5pbXBvcnQgeyBsZWFreVJlbHUgfSBmcm9tICcuLi9rZXJuZWxzL0xlYWt5UmVsdSc7XG5pbXBvcnQgeyBwcmVsdSB9IGZyb20gJy4uL2tlcm5lbHMvUHJlbHUnO1xuaW1wb3J0IHsgcmVsdSB9IGZyb20gJy4uL2tlcm5lbHMvUmVsdSc7XG5pbXBvcnQgeyByZWx1NiB9IGZyb20gJy4uL2tlcm5lbHMvUmVsdTYnO1xuaW1wb3J0IHsgc2lnbW9pZCB9IGZyb20gJy4uL2tlcm5lbHMvU2lnbW9pZCc7XG5leHBvcnQgZnVuY3Rpb24gYXBwbHlBY3RpdmF0aW9uKGJhY2tlbmQsIHgsIGFjdGl2YXRpb24sIHByZWx1QWN0aXZhdGlvbldlaWdodHMsIGxlYWt5cmVsdUFscGhhKSB7XG4gICAgaWYgKGFjdGl2YXRpb24gPT09ICdsaW5lYXInKSB7XG4gICAgICAgIHJldHVybiBpZGVudGl0eSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdyZWx1Jykge1xuICAgICAgICByZXR1cm4gcmVsdSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdlbHUnKSB7XG4gICAgICAgIHJldHVybiBlbHUoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChhY3RpdmF0aW9uID09PSAncmVsdTYnKSB7XG4gICAgICAgIHJldHVybiByZWx1Nih7IGlucHV0czogeyB4IH0sIGJhY2tlbmQgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdwcmVsdScpIHtcbiAgICAgICAgcmV0dXJuIHByZWx1KHsgaW5wdXRzOiB7IHgsIGFscGhhOiBwcmVsdUFjdGl2YXRpb25XZWlnaHRzIH0sIGJhY2tlbmQgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdsZWFreXJlbHUnKSB7XG4gICAgICAgIHJldHVybiBsZWFreVJlbHUoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kLCBhdHRyczogeyBhbHBoYTogbGVha3lyZWx1QWxwaGEgfSB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYWN0aXZhdGlvbiA9PT0gJ3NpZ21vaWQnKSB7XG4gICAgICAgIHJldHVybiBzaWdtb2lkKHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCB9KTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBBY3RpdmF0aW9uICR7YWN0aXZhdGlvbn0gaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkIGZvciB0aGUgQ1BVIGJhY2tlbmQuYCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mdXNlZF91dGlscy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBidWZmZXIgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIHBvb2woeFZhbHVlcywgeFNoYXBlLCBkdHlwZSwgc3RyaWRlcywgY29udkluZm8sIHBvb2xUeXBlKSB7XG4gICAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgY29uc3QgZGlsYXRpb25IZWlnaHQgPSBjb252SW5mby5kaWxhdGlvbkhlaWdodDtcbiAgICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJIZWlnaHQ7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVyV2lkdGggPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJXaWR0aDtcbiAgICBjb25zdCBwYWRUb3AgPSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICBjb25zdCBwYWRMZWZ0ID0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgIGNvbnN0IGluaXRpYWxWYWx1ZSA9IChwb29sVHlwZSA9PT0gJ21heCcgPyBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgOlxuICAgICAgICBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpO1xuICAgIGNvbnN0IG91dHB1dCA9IGJ1ZmZlcihjb252SW5mby5vdXRTaGFwZSwgZHR5cGUpO1xuICAgIGNvbnN0IG91dHB1dFZhbHMgPSBvdXRwdXQudmFsdWVzO1xuICAgIGNvbnN0IG91dHB1dEJhdGNoU3RyaWRlcyA9IGNvbnZJbmZvLm91dFNoYXBlWzFdICogY29udkluZm8ub3V0U2hhcGVbMl0gKiBjb252SW5mby5vdXRTaGFwZVszXTtcbiAgICBjb25zdCBvdXRwdXRSb3dTdHJpZGVzID0gY29udkluZm8ub3V0U2hhcGVbMl0gKiBjb252SW5mby5vdXRTaGFwZVszXTtcbiAgICBjb25zdCBvdXRwdXRDb2xTdHJpZGVzID0gY29udkluZm8ub3V0U2hhcGVbM107XG4gICAgZm9yIChsZXQgYiA9IDA7IGIgPCBjb252SW5mby5iYXRjaFNpemU7ICsrYikge1xuICAgICAgICBjb25zdCBvdXRwdXRCYXRjaE9mZnNldCA9IGIgKiBvdXRwdXRCYXRjaFN0cmlkZXM7XG4gICAgICAgIGNvbnN0IGlucHV0QmF0Y2hPZmZzZXQgPSBiICogc3RyaWRlc1swXTtcbiAgICAgICAgZm9yIChsZXQgZCA9IDA7IGQgPCBjb252SW5mby5pbkNoYW5uZWxzOyArK2QpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHlSID0gMDsgeVIgPCBjb252SW5mby5vdXRIZWlnaHQ7ICsreVIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4UkNvcm5lciA9IHlSICogc3RyaWRlSGVpZ2h0IC0gcGFkVG9wO1xuICAgICAgICAgICAgICAgIGNvbnN0IHhSTWluID0gTWF0aC5tYXgoMCwgeFJDb3JuZXIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHhSTWF4ID0gTWF0aC5taW4oY29udkluZm8uaW5IZWlnaHQsIGVmZmVjdGl2ZUZpbHRlckhlaWdodCArIHhSQ29ybmVyKTtcbiAgICAgICAgICAgICAgICBjb25zdCBvdXRwdXRSb3dPZmZzZXQgPSBvdXRwdXRCYXRjaE9mZnNldCArIHlSICogb3V0cHV0Um93U3RyaWRlcztcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB5QyA9IDA7IHlDIDwgY29udkluZm8ub3V0V2lkdGg7ICsreUMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeENDb3JuZXIgPSB5QyAqIHN0cmlkZVdpZHRoIC0gcGFkTGVmdDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeENNaW4gPSBNYXRoLm1heCgwLCB4Q0Nvcm5lcik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhDTWF4ID0gTWF0aC5taW4oY29udkluZm8uaW5XaWR0aCwgZWZmZWN0aXZlRmlsdGVyV2lkdGggKyB4Q0Nvcm5lcik7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtaW5NYXhWYWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGF2Z1ZhbHVlID0gMDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgeFIgPSB4Uk1pbjsgeFIgPCB4Uk1heDsgeFIgKz0gZGlsYXRpb25IZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhST2Zmc2V0ID0gaW5wdXRCYXRjaE9mZnNldCArIHhSICogc3RyaWRlc1sxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHhDID0geENNaW47IHhDIDwgeENNYXg7IHhDICs9IGRpbGF0aW9uV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4Q09mZnNldCA9IHhST2Zmc2V0ICsgeEMgKiBzdHJpZGVzWzJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBpeGVsID0geFZhbHVlc1t4Q09mZnNldCArIGRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocG9vbFR5cGUgPT09ICdtYXgnICYmIHBpeGVsID4gbWluTWF4VmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk1heFZhbHVlID0gcGl4ZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBvb2xUeXBlID09PSAnYXZnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmdWYWx1ZSArPSBwaXhlbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNOYU4obWluTWF4VmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0T2Zmc2V0ID0gb3V0cHV0Um93T2Zmc2V0ICsgeUMgKiBvdXRwdXRDb2xTdHJpZGVzICsgZDtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0VmFsc1tvdXRwdXRPZmZzZXRdID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHBvb2xUeXBlID09PSAnYXZnJyA/IGF2Z1ZhbHVlIC8gY291bnQgOiBtaW5NYXhWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBtYXhQb29sUG9zaXRpb25zKHhWYWx1ZXMsIHhTaGFwZSwgZHR5cGUsIGNvbnZJbmZvLCBmbGF0dGVuUG9zaXRpb25zID0gZmFsc2UsIGluY2x1ZGVCYXRjaEluSW5kZXggPSBmYWxzZSkge1xuICAgIGNvbnN0IG1heFBvc2l0aW9ucyA9IGJ1ZmZlcihjb252SW5mby5vdXRTaGFwZSwgJ2ludDMyJyk7XG4gICAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgY29uc3QgZGlsYXRpb25IZWlnaHQgPSBjb252SW5mby5kaWxhdGlvbkhlaWdodDtcbiAgICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJIZWlnaHQ7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVyV2lkdGggPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJXaWR0aDtcbiAgICBjb25zdCBwYWRUb3AgPSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICBjb25zdCBwYWRMZWZ0ID0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgIGNvbnN0IHhCdWYgPSBidWZmZXIoeFNoYXBlLCBkdHlwZSwgeFZhbHVlcyk7XG4gICAgZm9yIChsZXQgYiA9IDA7IGIgPCBjb252SW5mby5iYXRjaFNpemU7ICsrYikge1xuICAgICAgICBmb3IgKGxldCBkID0gMDsgZCA8IGNvbnZJbmZvLmluQ2hhbm5lbHM7ICsrZCkge1xuICAgICAgICAgICAgZm9yIChsZXQgeVIgPSAwOyB5UiA8IGNvbnZJbmZvLm91dEhlaWdodDsgKyt5Uikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhSQ29ybmVyID0geVIgKiBzdHJpZGVIZWlnaHQgLSBwYWRUb3A7XG4gICAgICAgICAgICAgICAgbGV0IHhSTWluID0geFJDb3JuZXI7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHhSTWluIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICB4Uk1pbiArPSBkaWxhdGlvbkhlaWdodDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gY29uc3QgeFJNaW4gPSBNYXRoLm1heCgwLCB4UkNvcm5lcik7XG4gICAgICAgICAgICAgICAgY29uc3QgeFJNYXggPSBNYXRoLm1pbihjb252SW5mby5pbkhlaWdodCwgZWZmZWN0aXZlRmlsdGVySGVpZ2h0ICsgeFJDb3JuZXIpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHlDID0gMDsgeUMgPCBjb252SW5mby5vdXRXaWR0aDsgKyt5Qykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4Q0Nvcm5lciA9IHlDICogc3RyaWRlV2lkdGggLSBwYWRMZWZ0O1xuICAgICAgICAgICAgICAgICAgICBsZXQgeENNaW4gPSB4Q0Nvcm5lcjtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhDTWluIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgeENNaW4gKz0gZGlsYXRpb25XaWR0aDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCB4Q01heCA9IE1hdGgubWluKGNvbnZJbmZvLmluV2lkdGgsIGVmZmVjdGl2ZUZpbHRlcldpZHRoICsgeENDb3JuZXIpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWF4VmFsdWUgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtYXhQb3NpdGlvbiA9IC0xO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB4UiA9IHhSTWluOyB4UiA8IHhSTWF4OyB4UiArPSBkaWxhdGlvbkhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd1IgPSB4UiAtIHhSQ29ybmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgeEMgPSB4Q01pbjsgeEMgPCB4Q01heDsgeEMgKz0gZGlsYXRpb25XaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdDID0geEMgLSB4Q0Nvcm5lcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwaXhlbCA9IHhCdWYuZ2V0KGIsIHhSLCB4QywgZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBpeGVsID4gbWF4VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4VmFsdWUgPSBwaXhlbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZsYXR0ZW5Qb3NpdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFBvc2l0aW9uID0gaW5jbHVkZUJhdGNoSW5JbmRleCA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChiICogY29udkluZm8uaW5IZWlnaHQgKyB4UikgKiBjb252SW5mby5pbldpZHRoICsgeEMpICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udkluZm8uaW5DaGFubmVscyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh4UiAqIGNvbnZJbmZvLmluV2lkdGggKyB4QykgKiBjb252SW5mby5pbkNoYW5uZWxzICsgZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFBvc2l0aW9uID0gd1IgKiBlZmZlY3RpdmVGaWx0ZXJXaWR0aCArIHdDO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1heFBvc2l0aW9ucy5zZXQobWF4UG9zaXRpb24sIGIsIHlSLCB5QywgZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXhQb3NpdGlvbnM7XG59XG5leHBvcnQgZnVuY3Rpb24gcG9vbDNkKHhWYWx1ZXMsIHhTaGFwZSwgZHR5cGUsIHN0cmlkZXMsIGNvbnZJbmZvLCBwb29sVHlwZSkge1xuICAgIGNvbnN0IHN0cmlkZURlcHRoID0gY29udkluZm8uc3RyaWRlRGVwdGg7XG4gICAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgY29uc3QgZGlsYXRpb25EZXB0aCA9IGNvbnZJbmZvLmRpbGF0aW9uRGVwdGg7XG4gICAgY29uc3QgZGlsYXRpb25IZWlnaHQgPSBjb252SW5mby5kaWxhdGlvbkhlaWdodDtcbiAgICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJEZXB0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckRlcHRoO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckhlaWdodDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoO1xuICAgIGNvbnN0IHBhZEZyb250ID0gY29udkluZm8ucGFkSW5mby5mcm9udDtcbiAgICBjb25zdCBwYWRUb3AgPSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICBjb25zdCBwYWRMZWZ0ID0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgIGNvbnN0IGluaXRpYWxWYWx1ZSA9IChwb29sVHlwZSA9PT0gJ21heCcgPyBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgOlxuICAgICAgICBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpO1xuICAgIGNvbnN0IG91dHB1dCA9IGJ1ZmZlcihjb252SW5mby5vdXRTaGFwZSwgZHR5cGUpO1xuICAgIGNvbnN0IG91dHB1dFZhbHMgPSBvdXRwdXQudmFsdWVzO1xuICAgIGNvbnN0IG91dHB1dEJhdGNoU3RyaWRlcyA9IGNvbnZJbmZvLm91dFNoYXBlWzFdICogY29udkluZm8ub3V0U2hhcGVbMl0gKlxuICAgICAgICBjb252SW5mby5vdXRTaGFwZVszXSAqIGNvbnZJbmZvLm91dFNoYXBlWzRdO1xuICAgIGNvbnN0IG91dHB1dERlcHRoU3RyaWRlcyA9IGNvbnZJbmZvLm91dFNoYXBlWzJdICogY29udkluZm8ub3V0U2hhcGVbM10gKiBjb252SW5mby5vdXRTaGFwZVs0XTtcbiAgICBjb25zdCBvdXRwdXRSb3dTdHJpZGVzID0gY29udkluZm8ub3V0U2hhcGVbM10gKiBjb252SW5mby5vdXRTaGFwZVs0XTtcbiAgICBjb25zdCBvdXRwdXRDb2xTdHJpZGVzID0gY29udkluZm8ub3V0U2hhcGVbNF07XG4gICAgZm9yIChsZXQgYmF0Y2ggPSAwOyBiYXRjaCA8IGNvbnZJbmZvLmJhdGNoU2l6ZTsgKytiYXRjaCkge1xuICAgICAgICBjb25zdCBvdXRwdXRCYXRjaE9mZnNldCA9IGJhdGNoICogb3V0cHV0QmF0Y2hTdHJpZGVzO1xuICAgICAgICBjb25zdCBpbnB1dEJhdGNoT2Zmc2V0ID0gYmF0Y2ggKiBzdHJpZGVzWzBdO1xuICAgICAgICBmb3IgKGxldCBjaGFubmVsID0gMDsgY2hhbm5lbCA8IGNvbnZJbmZvLmluQ2hhbm5lbHM7ICsrY2hhbm5lbCkge1xuICAgICAgICAgICAgZm9yIChsZXQgeURlcHRoID0gMDsgeURlcHRoIDwgY29udkluZm8ub3V0RGVwdGg7ICsreURlcHRoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeERlcHRoQ29ybmVyID0geURlcHRoICogc3RyaWRlRGVwdGggLSBwYWRGcm9udDtcbiAgICAgICAgICAgICAgICBsZXQgeERlcHRoTWluID0geERlcHRoQ29ybmVyO1xuICAgICAgICAgICAgICAgIHdoaWxlICh4RGVwdGhNaW4gPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHhEZXB0aE1pbiArPSBkaWxhdGlvbkRlcHRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB4RGVwdGhNYXggPSBNYXRoLm1pbihjb252SW5mby5pbkRlcHRoLCBlZmZlY3RpdmVGaWx0ZXJEZXB0aCArIHhEZXB0aENvcm5lcik7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0RGVwdGhPZmZzZXQgPSBvdXRwdXRCYXRjaE9mZnNldCArIHlEZXB0aCAqIG91dHB1dERlcHRoU3RyaWRlcztcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB5Um93ID0gMDsgeVJvdyA8IGNvbnZJbmZvLm91dEhlaWdodDsgKyt5Um93KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhSb3dDb3JuZXIgPSB5Um93ICogc3RyaWRlSGVpZ2h0IC0gcGFkVG9wO1xuICAgICAgICAgICAgICAgICAgICBsZXQgeFJvd01pbiA9IHhSb3dDb3JuZXI7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4Um93TWluIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgeFJvd01pbiArPSBkaWxhdGlvbkhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCB4Um93TWF4ID0gTWF0aC5taW4oY29udkluZm8uaW5IZWlnaHQsIGVmZmVjdGl2ZUZpbHRlckhlaWdodCArIHhSb3dDb3JuZXIpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvdXRwdXRSb3dPZmZzZXQgPSBvdXRwdXREZXB0aE9mZnNldCArIHlSb3cgKiBvdXRwdXRSb3dTdHJpZGVzO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB5Q29sID0gMDsgeUNvbCA8IGNvbnZJbmZvLm91dFdpZHRoOyArK3lDb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhDb2xDb3JuZXIgPSB5Q29sICogc3RyaWRlV2lkdGggLSBwYWRMZWZ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHhDb2xNaW4gPSB4Q29sQ29ybmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhDb2xNaW4gPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeENvbE1pbiArPSBkaWxhdGlvbldpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeENvbE1heCA9IE1hdGgubWluKGNvbnZJbmZvLmluV2lkdGgsIGVmZmVjdGl2ZUZpbHRlcldpZHRoICsgeENvbENvcm5lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTaGFkZXIgY29kZSBiZWdpbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG91dHB1dENvbE9mZnNldCA9IG91dHB1dFJvd09mZnNldCArIHlDb2wgKiBvdXRwdXRDb2xTdHJpZGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1pbk1heFZhbHVlID0gaW5pdGlhbFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF2Z1ZhbHVlID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB4RGVwdGggPSB4RGVwdGhNaW47IHhEZXB0aCA8IHhEZXB0aE1heDsgeERlcHRoICs9IGRpbGF0aW9uRGVwdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4RGVwdGhPZmZzZXQgPSBpbnB1dEJhdGNoT2Zmc2V0ICsgeERlcHRoICogc3RyaWRlc1sxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB4Um93ID0geFJvd01pbjsgeFJvdyA8IHhSb3dNYXg7IHhSb3cgKz0gZGlsYXRpb25IZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeFJvd09mZnNldCA9IHhEZXB0aE9mZnNldCArIHhSb3cgKiBzdHJpZGVzWzJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB4Q29sID0geENvbE1pbjsgeENvbCA8IHhDb2xNYXg7IHhDb2wgKz0gZGlsYXRpb25XaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeENvbE9mZnNldCA9IHhSb3dPZmZzZXQgKyB4Q29sICogc3RyaWRlc1szXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBpeGVsID0geFZhbHVlc1t4Q29sT2Zmc2V0ICsgY2hhbm5lbF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHBvb2xUeXBlID09PSAnbWF4JyAmJiBwaXhlbCA+IG1pbk1heFZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk1heFZhbHVlID0gcGl4ZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwb29sVHlwZSA9PT0gJ2F2ZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmdWYWx1ZSArPSBwaXhlbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKG1pbk1heFZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc05hTihtaW5NYXhWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc05hTihtaW5NYXhWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0T2Zmc2V0ID0gb3V0cHV0Q29sT2Zmc2V0ICsgY2hhbm5lbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFZhbHNbb3V0cHV0T2Zmc2V0XSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbFR5cGUgPT09ICdhdmcnID8gYXZnVmFsdWUgLyBjb3VudCA6IG1pbk1heFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG59XG5leHBvcnQgZnVuY3Rpb24gbWF4UG9vbDNkUG9zaXRpb25zKHhCdWYsIGNvbnZJbmZvKSB7XG4gICAgY29uc3QgbWF4UG9zaXRpb25zID0gYnVmZmVyKGNvbnZJbmZvLm91dFNoYXBlLCAnaW50MzInKTtcbiAgICBjb25zdCBzdHJpZGVEZXB0aCA9IGNvbnZJbmZvLnN0cmlkZURlcHRoO1xuICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICAgIGNvbnN0IGRpbGF0aW9uRGVwdGggPSBjb252SW5mby5kaWxhdGlvbkRlcHRoO1xuICAgIGNvbnN0IGRpbGF0aW9uSGVpZ2h0ID0gY29udkluZm8uZGlsYXRpb25IZWlnaHQ7XG4gICAgY29uc3QgZGlsYXRpb25XaWR0aCA9IGNvbnZJbmZvLmRpbGF0aW9uV2lkdGg7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVyRGVwdGggPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJEZXB0aDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJIZWlnaHQ7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVyV2lkdGggPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJXaWR0aDtcbiAgICBjb25zdCBwYWRGcm9udCA9IGNvbnZJbmZvLnBhZEluZm8uZnJvbnQ7XG4gICAgY29uc3QgcGFkVG9wID0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgcGFkTGVmdCA9IGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICBmb3IgKGxldCBiYXRjaCA9IDA7IGJhdGNoIDwgY29udkluZm8uYmF0Y2hTaXplOyArK2JhdGNoKSB7XG4gICAgICAgIGZvciAobGV0IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgY29udkluZm8uaW5DaGFubmVsczsgKytjaGFubmVsKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB5RGVwdGggPSAwOyB5RGVwdGggPCBjb252SW5mby5vdXREZXB0aDsgKyt5RGVwdGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4RGVwdGhDb3JuZXIgPSB5RGVwdGggKiBzdHJpZGVEZXB0aCAtIHBhZEZyb250O1xuICAgICAgICAgICAgICAgIGxldCB4RGVwdGhNaW4gPSB4RGVwdGhDb3JuZXI7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHhEZXB0aE1pbiA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgeERlcHRoTWluICs9IGRpbGF0aW9uRGVwdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHhEZXB0aE1heCA9IE1hdGgubWluKGNvbnZJbmZvLmluRGVwdGgsIGVmZmVjdGl2ZUZpbHRlckRlcHRoICsgeERlcHRoQ29ybmVyKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB5Um93ID0gMDsgeVJvdyA8IGNvbnZJbmZvLm91dEhlaWdodDsgKyt5Um93KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhSb3dDb3JuZXIgPSB5Um93ICogc3RyaWRlSGVpZ2h0IC0gcGFkVG9wO1xuICAgICAgICAgICAgICAgICAgICBsZXQgeFJvd01pbiA9IHhSb3dDb3JuZXI7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4Um93TWluIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgeFJvd01pbiArPSBkaWxhdGlvbkhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCB4Um93TWF4ID0gTWF0aC5taW4oY29udkluZm8uaW5IZWlnaHQsIGVmZmVjdGl2ZUZpbHRlckhlaWdodCArIHhSb3dDb3JuZXIpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB5Q29sID0gMDsgeUNvbCA8IGNvbnZJbmZvLm91dFdpZHRoOyArK3lDb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhDb2xDb3JuZXIgPSB5Q29sICogc3RyaWRlV2lkdGggLSBwYWRMZWZ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHhDb2xNaW4gPSB4Q29sQ29ybmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhDb2xNaW4gPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeENvbE1pbiArPSBkaWxhdGlvbldpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeENvbE1heCA9IE1hdGgubWluKGNvbnZJbmZvLmluV2lkdGgsIGVmZmVjdGl2ZUZpbHRlcldpZHRoICsgeENvbENvcm5lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTaGFkZXIgY29kZSBiZWdpbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtYXhWYWx1ZSA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtYXhQb3NpdGlvbiA9IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgeERlcHRoID0geERlcHRoTWluOyB4RGVwdGggPCB4RGVwdGhNYXg7IHhEZXB0aCArPSBkaWxhdGlvbkRlcHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd0RlcHRoID0geERlcHRoIC0geERlcHRoQ29ybmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHhSb3cgPSB4Um93TWluOyB4Um93IDwgeFJvd01heDsgeFJvdyArPSBkaWxhdGlvbkhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Um93ID0geFJvdyAtIHhSb3dDb3JuZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHhDb2wgPSB4Q29sTWluOyB4Q29sIDwgeENvbE1heDsgeENvbCArPSBkaWxhdGlvbldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Q29sID0geENvbCAtIHhDb2xDb3JuZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwaXhlbCA9IHhCdWYuZ2V0KGJhdGNoLCB4RGVwdGgsIHhSb3csIHhDb2wsIGNoYW5uZWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBpeGVsID49IG1heFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4VmFsdWUgPSBwaXhlbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhQb3NpdGlvbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdEZXB0aCAqIGVmZmVjdGl2ZUZpbHRlckhlaWdodCAqIGVmZmVjdGl2ZUZpbHRlcldpZHRoICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdSb3cgKiBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgKyB3Q29sO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4UG9zaXRpb25zLnNldChtYXhQb3NpdGlvbiwgYmF0Y2gsIHlEZXB0aCwgeVJvdywgeUNvbCwgY2hhbm5lbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1heFBvc2l0aW9ucztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBvb2xfdXRpbHMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG4vKipcbiAqIFRlbXBsYXRlIHRoYXQgY3JlYXRlcyBpbXBsZW1lbnRhdGlvbiBmb3IgdW5hcnkgb3AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTaW1wbGVVbmFyeUltcGwob3ApIHtcbiAgICByZXR1cm4gKHZhbHVlcywgZHR5cGUsIGF0dHJzKSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IHV0aWwuZ2V0VHlwZWRBcnJheUZyb21EVHlwZShkdHlwZSwgdmFsdWVzLmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZXNbaV0gPSBvcCh2YWx1ZXNbaV0sIGF0dHJzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3VmFsdWVzO1xuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11bmFyeV9pbXBsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbi8qKlxuICogVGVtcGxhdGUgdGhhdCBjcmVhdGVzIGEgYEtlcm5lbEZ1bmNgIGZvciB1bmFyeSBvcHMuXG4gKiBAcGFyYW0gbmFtZSBLZXJuZWwgbmFtZS5cbiAqIEBwYXJhbSBvcCBBIGBTaW1wbGVVbmFyeU9wZXJhdGlvbmAgZm9yIHRoZSBrZXJuZWwuXG4gKiBAcGFyYW0gZHR5cGUgT3B0aW9uYWwuIElmIHNldCwgdGhlIHJlc3VsdCBoYXMgdGhpcyBkdHlwZS4gT3RoZXJ3aXNlLCB0aGVcbiAqICAgICByZXN1bHQgaGFzIHRoZSBzYW1lIGR0eXBlIGFzIHRoZSBpbnB1dC4gVGhpcyBpcyBtYWlubHkgdXNlZCBpbiBjZXJ0YWluXG4gKiAgICAga2VybmVscyB0aGF0IHJldHVybiBib29sIHR5cGUsIHN1Y2ggYXMgaXNGaW5pdGUsIGlzSW5mLCBldGMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmFyeUtlcm5lbEZ1bmMobmFtZSwgb3AsIGR0eXBlKSB7XG4gICAgcmV0dXJuICh7IGlucHV0cywgYXR0cnMsIGJhY2tlbmQgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICAgICAgYXNzZXJ0Tm90Q29tcGxleCh4LCBuYW1lKTtcbiAgICAgICAgaWYgKHguZHR5cGUgPT09ICdzdHJpbmcnIHx8IGR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmFyeUtlcm5lbEZ1bmMgZG9lcyBub3Qgc3VwcG9ydCBzdHJpbmcgaW5wdXQvb3V0cHV0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY3B1QmFja2VuZCA9IGJhY2tlbmQ7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcztcbiAgICAgICAgY29uc3QgeFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoeC5zaGFwZSk7XG4gICAgICAgIGNvbnN0ICRkdHlwZSA9IGR0eXBlIHx8IHguZHR5cGU7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IHV0aWwuZ2V0QXJyYXlGcm9tRFR5cGUoJGR0eXBlLCB4U2l6ZSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeFNpemU7ICsraSkge1xuICAgICAgICAgICAgbmV3VmFsdWVzW2ldID0gb3AodmFsdWVzW2ldLCBhdHRycyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNwdUJhY2tlbmQubWFrZVRlbnNvckluZm8oeC5zaGFwZSwgJGR0eXBlLCBuZXdWYWx1ZXMpO1xuICAgIH07XG59XG4vKipcbiAqIFRlbXBsYXRlIHRoYXQgY3JlYXRlcyBhIGBLZXJuZWxGdW5jYCBmb3IgdW5hcnkgb3BzIGZyb20gdGhlIGdpdmVuXG4gKiBgU2ltcGxlVW5hcnlJbXBsYC4uXG4gKiBAcGFyYW0gbmFtZSBLZXJuZWwgbmFtZS5cbiAqIEBwYXJhbSB1bmFyeUltcGwgQSBgU2ltcGxlVW5hcnlJbXBsYCB0aGF0IGltcGxlbWVudHMgdGhlIG9wLlxuICogQHBhcmFtIGR0eXBlIE9wdGlvbmFsLiBJZiBzZXQsIHRoZSByZXN1bHQgaGFzIHRoaXMgZHR5cGUuIE90aGVyd2lzZSwgdGhlXG4gKiAgICAgcmVzdWx0IGhhcyB0aGUgc2FtZSBkdHlwZSBhcyB0aGUgaW5wdXQuIFRoaXMgaXMgbWFpbmx5IHVzZWQgaW4gY2VydGFpblxuICogICAgIGtlcm5lbHMgdGhhdCByZXR1cm4gYm9vbCB0eXBlLCBzdWNoIGFzIGlzRmluaXRlLCBpc0luZiwgZXRjLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5hcnlLZXJuZWxGdW5jRnJvbUltcGwobmFtZSwgdW5hcnlJbXBsLCBkdHlwZSkge1xuICAgIHJldHVybiAoeyBpbnB1dHMsIGF0dHJzLCBiYWNrZW5kIH0pID0+IHtcbiAgICAgICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgICAgIGFzc2VydE5vdENvbXBsZXgoeCwgbmFtZSk7XG4gICAgICAgIGlmICh4LmR0eXBlID09PSAnc3RyaW5nJyB8fCBkdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndW5hcnlLZXJuZWxGdW5jIGRvZXMgbm90IHN1cHBvcnQgc3RyaW5nIGlucHV0L291dHB1dCcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNwdUJhY2tlbmQgPSBiYWNrZW5kO1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgICAgIGNvbnN0ICRkdHlwZSA9IGR0eXBlIHx8IHguZHR5cGU7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IHVuYXJ5SW1wbCh2YWx1ZXMsICRkdHlwZSwgYXR0cnMpO1xuICAgICAgICByZXR1cm4gY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbyh4LnNoYXBlLCAkZHR5cGUsIG5ld1ZhbHVlcyk7XG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVuYXJ5X3V0aWxzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY29tcGxleCB9IGZyb20gJy4uL2tlcm5lbHMvQ29tcGxleCc7XG4vKipcbiAqIEdlbmVyYXRlcyBhIHRlbnNvckluZm8gd2l0aCBhbGwgemVyb3MgdmFsdWUuXG4gKiBAcGFyYW0gYmFja2VuZCBjcHUgYmFja2VuZC5cbiAqIEBwYXJhbSBzaGFwZSBTaGFwZSBmb3IgdGhlIHplcm9zIHRlbnNvci5cbiAqIEBwYXJhbSBkdHlwZSBPcHRpb25hbC4gSWYgc2V0LCB0aGUgcmVzdWx0IGhhcyB0aGlzIGR0eXBlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gemVyb3MoYmFja2VuZCwgc2hhcGUsIGR0eXBlID0gJ2Zsb2F0MzInKSB7XG4gICAgaWYgKGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICBjb25zdCByZWFsID0gemVyb3MoYmFja2VuZCwgc2hhcGUsICdmbG9hdDMyJyk7XG4gICAgICAgIGNvbnN0IGltYWcgPSB6ZXJvcyhiYWNrZW5kLCBzaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICAgICAgcmV0dXJuIGNvbXBsZXgoeyBpbnB1dHM6IHsgcmVhbCwgaW1hZyB9LCBiYWNrZW5kIH0pO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZXMgPSB1dGlsLm1ha2VaZXJvc1R5cGVkQXJyYXkodXRpbC5zaXplRnJvbVNoYXBlKHNoYXBlKSwgZHR5cGUpO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHNoYXBlLCBkdHlwZSwgdmFsdWVzKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXplcm9zX2ltcGwuanMubWFwIiwiLyoqIEBsaWNlbnNlIFNlZSB0aGUgTElDRU5TRSBmaWxlLiAqL1xuLy8gVGhpcyBjb2RlIGlzIGF1dG8tZ2VuZXJhdGVkLCBkbyBub3QgbW9kaWZ5IHRoaXMgZmlsZSFcbmNvbnN0IHZlcnNpb24gPSAnMy44LjAnO1xuZXhwb3J0IHsgdmVyc2lvbiB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dmVyc2lvbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgJy4vZmxhZ3Nfd2FzbSc7XG5pbXBvcnQgeyBEYXRhU3RvcmFnZSwgZGVwcmVjYXRpb25XYXJuLCBlbmdpbmUsIGVudiwgS2VybmVsQmFja2VuZCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgd2FzbUZhY3RvcnlUaHJlYWRlZFNpbWQgZnJvbSAnLi4vd2FzbS1vdXQvdGZqcy1iYWNrZW5kLXdhc20tdGhyZWFkZWQtc2ltZC5qcyc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyB3YXNtV29ya2VyQ29udGVudHMgfSBmcm9tICcuLi93YXNtLW91dC90ZmpzLWJhY2tlbmQtd2FzbS10aHJlYWRlZC1zaW1kLndvcmtlci5qcyc7XG5pbXBvcnQgd2FzbUZhY3RvcnkgZnJvbSAnLi4vd2FzbS1vdXQvdGZqcy1iYWNrZW5kLXdhc20uanMnO1xuZXhwb3J0IGNsYXNzIEJhY2tlbmRXYXNtIGV4dGVuZHMgS2VybmVsQmFja2VuZCB7XG4gICAgY29uc3RydWN0b3Iod2FzbSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLndhc20gPSB3YXNtO1xuICAgICAgICAvLyAwIGlzIHJlc2VydmVkIGZvciBudWxsIGRhdGEgaWRzLlxuICAgICAgICB0aGlzLmRhdGFJZE5leHROdW1iZXIgPSAxO1xuICAgICAgICB0aGlzLndhc20udGZqcy5pbml0KCk7XG4gICAgICAgIHRoaXMuZGF0YUlkTWFwID0gbmV3IERhdGFTdG9yYWdlKHRoaXMsIGVuZ2luZSgpKTtcbiAgICB9XG4gICAgd3JpdGUodmFsdWVzLCBzaGFwZSwgZHR5cGUpIHtcbiAgICAgICAgY29uc3QgZGF0YUlkID0geyBpZDogdGhpcy5kYXRhSWROZXh0TnVtYmVyKysgfTtcbiAgICAgICAgdGhpcy5tb3ZlKGRhdGFJZCwgdmFsdWVzLCBzaGFwZSwgZHR5cGUsIDEpO1xuICAgICAgICByZXR1cm4gZGF0YUlkO1xuICAgIH1cbiAgICBudW1EYXRhSWRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhSWRNYXAubnVtRGF0YUlkcygpO1xuICAgIH1cbiAgICBhc3luYyB0aW1lKGYpIHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSB1dGlsLm5vdygpO1xuICAgICAgICBmKCk7XG4gICAgICAgIGNvbnN0IGtlcm5lbE1zID0gdXRpbC5ub3coKSAtIHN0YXJ0O1xuICAgICAgICByZXR1cm4geyBrZXJuZWxNcyB9O1xuICAgIH1cbiAgICBtb3ZlKGRhdGFJZCwgdmFsdWVzLCBzaGFwZSwgZHR5cGUsIHJlZkNvdW50KSB7XG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5kYXRhSWROZXh0TnVtYmVyKys7XG4gICAgICAgIGlmIChkdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0cmluZ0J5dGVzID0gdmFsdWVzO1xuICAgICAgICAgICAgdGhpcy5kYXRhSWRNYXAuc2V0KGRhdGFJZCwgeyBpZCwgc3RyaW5nQnl0ZXMsIHNoYXBlLCBkdHlwZSwgbWVtb3J5T2Zmc2V0OiBudWxsLCByZWZDb3VudCB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHNoYXBlKTtcbiAgICAgICAgY29uc3QgbnVtQnl0ZXMgPSBzaXplICogdXRpbC5ieXRlc1BlckVsZW1lbnQoZHR5cGUpO1xuICAgICAgICBjb25zdCBtZW1vcnlPZmZzZXQgPSB0aGlzLndhc20uX21hbGxvYyhudW1CeXRlcyk7XG4gICAgICAgIHRoaXMuZGF0YUlkTWFwLnNldChkYXRhSWQsIHsgaWQsIG1lbW9yeU9mZnNldCwgc2hhcGUsIGR0eXBlLCByZWZDb3VudCB9KTtcbiAgICAgICAgdGhpcy53YXNtLnRmanMucmVnaXN0ZXJUZW5zb3IoaWQsIHNpemUsIG1lbW9yeU9mZnNldCk7XG4gICAgICAgIGlmICh2YWx1ZXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy53YXNtLkhFQVBVOC5zZXQobmV3IFVpbnQ4QXJyYXkodmFsdWVzLmJ1ZmZlciwgdmFsdWVzLmJ5dGVPZmZzZXQsIG51bUJ5dGVzKSwgbWVtb3J5T2Zmc2V0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyByZWFkKGRhdGFJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkU3luYyhkYXRhSWQpO1xuICAgIH1cbiAgICByZWFkU3luYyhkYXRhSWQpIHtcbiAgICAgICAgY29uc3QgeyBtZW1vcnlPZmZzZXQsIGR0eXBlLCBzaGFwZSwgc3RyaW5nQnl0ZXMgfSA9IHRoaXMuZGF0YUlkTWFwLmdldChkYXRhSWQpO1xuICAgICAgICBpZiAoZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nQnl0ZXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYnl0ZXMgPSB0aGlzLndhc20uSEVBUFU4LnNsaWNlKG1lbW9yeU9mZnNldCwgbWVtb3J5T2Zmc2V0ICsgdXRpbC5zaXplRnJvbVNoYXBlKHNoYXBlKSAqIHV0aWwuYnl0ZXNQZXJFbGVtZW50KGR0eXBlKSk7XG4gICAgICAgIHJldHVybiB0eXBlZEFycmF5RnJvbUJ1ZmZlcihieXRlcy5idWZmZXIsIGR0eXBlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGlzcG9zZSB0aGUgbWVtb3J5IGlmIHRoZSBkYXRhSWQgaGFzIDAgcmVmQ291bnQuIFJldHVybiB0cnVlIGlmIHRoZSBtZW1vcnlcbiAgICAgKiBpcyByZWxlYXNlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqIEBwYXJhbSBkYXRhSWRcbiAgICAgKiBAb2FyYW0gZm9yY2UgT3B0aW9uYWwsIHJlbW92ZSB0aGUgZGF0YSByZWdhcmRsZXNzIG9mIHJlZkNvdW50XG4gICAgICovXG4gICAgZGlzcG9zZURhdGEoZGF0YUlkLCBmb3JjZSA9IGZhbHNlKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGFJZE1hcC5oYXMoZGF0YUlkKSkge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YUlkTWFwLmdldChkYXRhSWQpO1xuICAgICAgICAgICAgZGF0YS5yZWZDb3VudC0tO1xuICAgICAgICAgICAgaWYgKCFmb3JjZSAmJiBkYXRhLnJlZkNvdW50ID4gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMud2FzbS5fZnJlZShkYXRhLm1lbW9yeU9mZnNldCk7XG4gICAgICAgICAgICB0aGlzLndhc20udGZqcy5kaXNwb3NlRGF0YShkYXRhLmlkKTtcbiAgICAgICAgICAgIHRoaXMuZGF0YUlkTWFwLmRlbGV0ZShkYXRhSWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKiogUmV0dXJuIHJlZkNvdW50IG9mIGEgYFRlbnNvckRhdGFgLiAqL1xuICAgIHJlZkNvdW50KGRhdGFJZCkge1xuICAgICAgICBpZiAodGhpcy5kYXRhSWRNYXAuaGFzKGRhdGFJZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHRlbnNvckRhdGEgPSB0aGlzLmRhdGFJZE1hcC5nZXQoZGF0YUlkKTtcbiAgICAgICAgICAgIHJldHVybiB0ZW5zb3JEYXRhLnJlZkNvdW50O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBpbmNSZWYoZGF0YUlkKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGFJZE1hcC5nZXQoZGF0YUlkKTtcbiAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkge1xuICAgICAgICAgICAgZGF0YS5yZWZDb3VudCsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZsb2F0UHJlY2lzaW9uKCkge1xuICAgICAgICByZXR1cm4gMzI7XG4gICAgfVxuICAgIC8vIFJldHVybnMgdGhlIG1lbW9yeSBvZmZzZXQgb2YgYSB0ZW5zb3IuIFVzZWZ1bCBmb3IgZGVidWdnaW5nIGFuZCB1bml0XG4gICAgLy8gdGVzdGluZy5cbiAgICBnZXRNZW1vcnlPZmZzZXQoZGF0YUlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFJZE1hcC5nZXQoZGF0YUlkKS5tZW1vcnlPZmZzZXQ7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIHRoaXMud2FzbS50ZmpzLmRpc3Bvc2UoKTtcbiAgICAgICAgaWYgKCdQVGhyZWFkJyBpbiB0aGlzLndhc20pIHtcbiAgICAgICAgICAgIHRoaXMud2FzbS5QVGhyZWFkLnRlcm1pbmF0ZUFsbFRocmVhZHMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndhc20gPSBudWxsO1xuICAgIH1cbiAgICBtZW1vcnkoKSB7XG4gICAgICAgIHJldHVybiB7IHVucmVsaWFibGU6IGZhbHNlIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1ha2UgYSB0ZW5zb3IgaW5mbyBmb3IgdGhlIG91dHB1dCBvZiBhbiBvcC4gSWYgYG1lbW9yeU9mZnNldGAgaXMgbm90XG4gICAgICogcHJlc2VudCwgdGhpcyBtZXRob2QgYWxsb2NhdGVzIG1lbW9yeSBvbiB0aGUgV0FTTSBoZWFwLiBJZiBgbWVtb3J5T2Zmc2V0YFxuICAgICAqIGlzIHByZXNlbnQsIHRoZSBtZW1vcnkgd2FzIGFsbG9jYXRlZCBlbHNld2hlcmUgKGluIGMrKykgYW5kIHdlIGp1c3QgcmVjb3JkXG4gICAgICogdGhlIHBvaW50ZXIgd2hlcmUgdGhhdCBtZW1vcnkgbGl2ZXMuXG4gICAgICovXG4gICAgbWFrZU91dHB1dChzaGFwZSwgZHR5cGUsIG1lbW9yeU9mZnNldCkge1xuICAgICAgICBsZXQgZGF0YUlkO1xuICAgICAgICBpZiAobWVtb3J5T2Zmc2V0ID09IG51bGwpIHtcbiAgICAgICAgICAgIGRhdGFJZCA9IHRoaXMud3JpdGUobnVsbCAvKiB2YWx1ZXMgKi8sIHNoYXBlLCBkdHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBpZCA9IHRoaXMuZGF0YUlkTmV4dE51bWJlcisrO1xuICAgICAgICAgICAgZGF0YUlkID0geyBpZCB9O1xuICAgICAgICAgICAgdGhpcy5kYXRhSWRNYXAuc2V0KGRhdGFJZCwgeyBpZCwgbWVtb3J5T2Zmc2V0LCBzaGFwZSwgZHR5cGUsIHJlZkNvdW50OiAxIH0pO1xuICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShzaGFwZSk7XG4gICAgICAgICAgICB0aGlzLndhc20udGZqcy5yZWdpc3RlclRlbnNvcihpZCwgc2l6ZSwgbWVtb3J5T2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBkYXRhSWQsIHNoYXBlLCBkdHlwZSB9O1xuICAgIH1cbiAgICB0eXBlZEFycmF5RnJvbUhlYXAoeyBzaGFwZSwgZHR5cGUsIGRhdGFJZCB9KSB7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMud2FzbS5IRUFQVTguYnVmZmVyO1xuICAgICAgICBjb25zdCB7IG1lbW9yeU9mZnNldCB9ID0gdGhpcy5kYXRhSWRNYXAuZ2V0KGRhdGFJZCk7XG4gICAgICAgIGNvbnN0IHNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoc2hhcGUpO1xuICAgICAgICBzd2l0Y2ggKGR0eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdmbG9hdDMyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheShidWZmZXIsIG1lbW9yeU9mZnNldCwgc2l6ZSk7XG4gICAgICAgICAgICBjYXNlICdpbnQzMic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgbWVtb3J5T2Zmc2V0LCBzaXplKTtcbiAgICAgICAgICAgIGNhc2UgJ2Jvb2wnOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShidWZmZXIsIG1lbW9yeU9mZnNldCwgc2l6ZSk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBkdHlwZSAke2R0eXBlfWApO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gY3JlYXRlSW5zdGFudGlhdGVXYXNtRnVuYyhwYXRoKSB7XG4gICAgLy8gdGhpcyB3aWxsIGJlIHJlcGxhY2UgYnkgcm9sbHVwIHBsdWdpbiBwYXRjaFdlY2hhdFdlYkFzc2VtYmx5IGluIFxuICAgIC8vIG1pbnByb2dyYW0ncyBvdXRwdXQuXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgIHJldHVybiAoaW1wb3J0cywgY2FsbGJhY2spID0+IHtcbiAgICAgICAgdXRpbC5mZXRjaChwYXRoLCB7IGNyZWRlbnRpYWxzOiAnc2FtZS1vcmlnaW4nIH0pLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXJlc3BvbnNlWydvayddKSB7XG4gICAgICAgICAgICAgICAgaW1wb3J0cy5lbnYuYShgZmFpbGVkIHRvIGxvYWQgd2FzbSBiaW5hcnkgZmlsZSBhdCAnJHtwYXRofSdgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3BvbnNlLmFycmF5QnVmZmVyKCkudGhlbihiaW5hcnkgPT4ge1xuICAgICAgICAgICAgICAgIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKGJpbmFyeSwgaW1wb3J0cykudGhlbihvdXRwdXQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhvdXRwdXQuaW5zdGFuY2UsIG91dHB1dC5tb2R1bGUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge307XG4gICAgfTtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgcGF0aCBvZiB0aGUgV0FTTSBiaW5hcnkuXG4gKiBAcGFyYW0gc2ltZFN1cHBvcnRlZCB3aGV0aGVyIFNJTUQgaXMgc3VwcG9ydGVkXG4gKiBAcGFyYW0gdGhyZWFkc1N1cHBvcnRlZCB3aGV0aGVyIG11bHRpdGhyZWFkaW5nIGlzIHN1cHBvcnRlZFxuICogQHBhcmFtIHdhc21Nb2R1bGVGb2xkZXIgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBXQVNNIGJpbmFyaWVzLlxuICovXG5mdW5jdGlvbiBnZXRQYXRoVG9XYXNtQmluYXJ5KHNpbWRTdXBwb3J0ZWQsIHRocmVhZHNTdXBwb3J0ZWQsIHdhc21Nb2R1bGVGb2xkZXIpIHtcbiAgICBpZiAod2FzbVBhdGggIT0gbnVsbCkge1xuICAgICAgICAvLyBJZiB3YXNtUGF0aCBpcyBkZWZpbmVkLCB0aGUgdXNlciBoYXMgc3VwcGxpZWQgYSBmdWxsIHBhdGggdG9cbiAgICAgICAgLy8gdGhlIHZhbmlsbGEgLndhc20gYmluYXJ5LlxuICAgICAgICByZXR1cm4gd2FzbVBhdGg7XG4gICAgfVxuICAgIGxldCBwYXRoID0gJ3RmanMtYmFja2VuZC13YXNtLndhc20nO1xuICAgIGlmIChzaW1kU3VwcG9ydGVkICYmIHRocmVhZHNTdXBwb3J0ZWQpIHtcbiAgICAgICAgcGF0aCA9ICd0ZmpzLWJhY2tlbmQtd2FzbS10aHJlYWRlZC1zaW1kLndhc20nO1xuICAgIH1cbiAgICBlbHNlIGlmIChzaW1kU3VwcG9ydGVkKSB7XG4gICAgICAgIHBhdGggPSAndGZqcy1iYWNrZW5kLXdhc20tc2ltZC53YXNtJztcbiAgICB9XG4gICAgaWYgKHdhc21GaWxlTWFwICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHdhc21GaWxlTWFwW3BhdGhdICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB3YXNtRmlsZU1hcFtwYXRoXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gd2FzbU1vZHVsZUZvbGRlciArIHBhdGg7XG59XG4vKipcbiAqIEluaXRpYWxpemVzIHRoZSB3YXNtIG1vZHVsZSBhbmQgY3JlYXRlcyB0aGUganMgPC0tPiB3YXNtIGJyaWRnZS5cbiAqXG4gKiBOT1RFOiBXZSB3cmFwIHRoZSB3YXNtIG1vZHVsZSBpbiBhIG9iamVjdCB3aXRoIHByb3BlcnR5ICd3YXNtJyBpbnN0ZWFkIG9mXG4gKiByZXR1cm5pbmcgUHJvbWlzZTxCYWNrZW5kV2FzbU1vZHVsZT4gdG8gYXZvaWQgZnJlZXppbmcgQ2hyb21lIChsYXN0IHRlc3RlZFxuICogaW4gQ2hyb21lIDc2KS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgY29uc3QgW3NpbWRTdXBwb3J0ZWQsIHRocmVhZHNTdXBwb3J0ZWRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBlbnYoKS5nZXRBc3luYygnV0FTTV9IQVNfU0lNRF9TVVBQT1JUJyksXG4gICAgICAgIGVudigpLmdldEFzeW5jKCdXQVNNX0hBU19NVUxUSVRIUkVBRF9TVVBQT1JUJylcbiAgICBdKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCBmYWN0b3J5Q29uZmlnID0ge307XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGZ1bmN0aW9uIG92ZXJyaWRlcyB0aGUgRW1zY3JpcHRlbiBtb2R1bGUgbG9jYXRlRmlsZSB1dGlsaXR5LlxuICAgICAgICAgKiBAcGFyYW0gcGF0aCBUaGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgZmlsZSB0aGF0IG5lZWRzIHRvIGJlIGxvYWRlZC5cbiAgICAgICAgICogQHBhcmFtIHByZWZpeCBUaGUgcGF0aCB0byB0aGUgbWFpbiBKYXZhU2NyaXB0IGZpbGUncyBkaXJlY3RvcnkuXG4gICAgICAgICAqL1xuICAgICAgICBmYWN0b3J5Q29uZmlnLmxvY2F0ZUZpbGUgPSAocGF0aCwgcHJlZml4KSA9PiB7XG4gICAgICAgICAgICBpZiAocGF0aC5lbmRzV2l0aCgnLndvcmtlci5qcycpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB3YXNtV29ya2VyQ29udGVudHM7XG4gICAgICAgICAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtyZXNwb25zZV0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL2phdmFzY3JpcHQnIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhdGguZW5kc1dpdGgoJy53YXNtJykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UGF0aFRvV2FzbUJpbmFyeShzaW1kU3VwcG9ydGVkLCB0aHJlYWRzU3VwcG9ydGVkLCB3YXNtUGF0aFByZWZpeCAhPSBudWxsID8gd2FzbVBhdGhQcmVmaXggOiBwcmVmaXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArIHBhdGg7XG4gICAgICAgIH07XG4gICAgICAgIC8vIFVzZSB0aGUgaW5zdGFudGlhdGVXYXNtIG92ZXJyaWRlIHdoZW4gc3lzdGVtIGZldGNoIGlzIG5vdCBhdmFpbGFibGUuXG4gICAgICAgIC8vIFJlZmVyZW5jZTpcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2Vtc2NyaXB0ZW4tY29yZS9lbXNjcmlwdGVuL2Jsb2IvMmJjYTA4M2NiYmQ1YTQxMzNkYjYxZmJkNzRkMDRmN2ZlZWNmYTkwNy90ZXN0cy9tYW51YWxfd2FzbV9pbnN0YW50aWF0ZS5odG1sI0wxNzBcbiAgICAgICAgaWYgKGN1c3RvbUZldGNoKSB7XG4gICAgICAgICAgICBmYWN0b3J5Q29uZmlnLmluc3RhbnRpYXRlV2FzbSA9XG4gICAgICAgICAgICAgICAgY3JlYXRlSW5zdGFudGlhdGVXYXNtRnVuYyhnZXRQYXRoVG9XYXNtQmluYXJ5KHNpbWRTdXBwb3J0ZWQsIHRocmVhZHNTdXBwb3J0ZWQsIHdhc21QYXRoUHJlZml4ICE9IG51bGwgPyB3YXNtUGF0aFByZWZpeCA6ICcnKSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgICAgIGZhY3RvcnlDb25maWcub25BYm9ydCA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChpbml0aWFsaXplZCkge1xuICAgICAgICAgICAgICAgIC8vIEVtc2NyaXB0ZW4gYWxyZWFkeSBjYWxsZWQgY29uc29sZS53YXJuIHNvIG5vIG5lZWQgdG8gZG91YmxlIGxvZy5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5pdEFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBFbXNjcmlwdGVuIGNhbGxzIGBvbkFib3J0YCB0d2ljZSwgcmVzdWx0aW5nIGluIGRvdWJsZSBlcnJvclxuICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzLlxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGluaXRBYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnN0IHJlamVjdE1zZyA9ICdNYWtlIHN1cmUgdGhlIHNlcnZlciBjYW4gc2VydmUgdGhlIGAud2FzbWAgZmlsZSByZWxhdGl2ZSB0byB0aGUgJyArXG4gICAgICAgICAgICAgICAgJ2J1bmRsZWQganMgZmlsZS4gRm9yIG1vcmUgZGV0YWlscyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGZqcy9ibG9iL21hc3Rlci90ZmpzLWJhY2tlbmQtd2FzbS9SRUFETUUubWQjdXNpbmctYnVuZGxlcnMnO1xuICAgICAgICAgICAgcmVqZWN0KHsgbWVzc2FnZTogcmVqZWN0TXNnIH0pO1xuICAgICAgICB9O1xuICAgICAgICBsZXQgd2FzbTtcbiAgICAgICAgLy8gSWYgYHdhc21QYXRoYCBoYXMgYmVlbiBkZWZpbmVkIHdlIG11c3QgaW5pdGlhbGl6ZSB0aGUgdmFuaWxsYSBtb2R1bGUuXG4gICAgICAgIGlmICh0aHJlYWRzU3VwcG9ydGVkICYmIHNpbWRTdXBwb3J0ZWQgJiYgd2FzbVBhdGggPT0gbnVsbCkge1xuICAgICAgICAgICAgZmFjdG9yeUNvbmZpZy5tYWluU2NyaXB0VXJsT3JCbG9iID0gbmV3IEJsb2IoW2B2YXIgV2FzbUJhY2tlbmRNb2R1bGVUaHJlYWRlZFNpbWQgPSBgICtcbiAgICAgICAgICAgICAgICAgICAgd2FzbUZhY3RvcnlUaHJlYWRlZFNpbWQudG9TdHJpbmcoKV0sIHsgdHlwZTogJ3RleHQvamF2YXNjcmlwdCcgfSk7XG4gICAgICAgICAgICB3YXNtID0gd2FzbUZhY3RvcnlUaHJlYWRlZFNpbWQoZmFjdG9yeUNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBUaGUgd2FzbUZhY3Rvcnkgd29ya3MgZm9yIGJvdGggdmFuaWxsYSBhbmQgU0lNRCBiaW5hcmllcy5cbiAgICAgICAgICAgIHdhc20gPSB3YXNtRmFjdG9yeShmYWN0b3J5Q29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgV0FTTSBtb2R1bGUgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgYnkgdGhlIGZhY3RvcnkuXG4gICAgICAgIC8vIEFueSBlcnJvciB3aWxsIGJlIGNhdWdodCBieSB0aGUgb25BYm9ydCBjYWxsYmFjayBkZWZpbmVkIGFib3ZlLlxuICAgICAgICB3YXNtLnRoZW4oKG1vZHVsZSkgPT4ge1xuICAgICAgICAgICAgaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgICAgICAgaW5pdEFib3J0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IHZvaWRSZXR1cm5UeXBlID0gbnVsbDtcbiAgICAgICAgICAgIC8vIFVzaW5nIHRoZSB0ZmpzIG5hbWVzcGFjZSB0byBhdm9pZCBjb25mbGljdCB3aXRoIGVtc2NyaXB0ZW4ncyBBUEkuXG4gICAgICAgICAgICBtb2R1bGUudGZqcyA9IHtcbiAgICAgICAgICAgICAgICBpbml0OiBtb2R1bGUuY3dyYXAoJ2luaXQnLCBudWxsLCBbXSksXG4gICAgICAgICAgICAgICAgcmVnaXN0ZXJUZW5zb3I6IG1vZHVsZS5jd3JhcCgncmVnaXN0ZXJfdGVuc29yJywgbnVsbCwgW1xuICAgICAgICAgICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgICAgIGRpc3Bvc2VEYXRhOiBtb2R1bGUuY3dyYXAoJ2Rpc3Bvc2VfZGF0YScsIHZvaWRSZXR1cm5UeXBlLCBbJ251bWJlciddKSxcbiAgICAgICAgICAgICAgICBkaXNwb3NlOiBtb2R1bGUuY3dyYXAoJ2Rpc3Bvc2UnLCB2b2lkUmV0dXJuVHlwZSwgW10pLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlc29sdmUoeyB3YXNtOiBtb2R1bGUgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gdHlwZWRBcnJheUZyb21CdWZmZXIoYnVmZmVyLCBkdHlwZSkge1xuICAgIHN3aXRjaCAoZHR5cGUpIHtcbiAgICAgICAgY2FzZSAnZmxvYXQzMic6XG4gICAgICAgICAgICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheShidWZmZXIpO1xuICAgICAgICBjYXNlICdpbnQzMic6XG4gICAgICAgICAgICByZXR1cm4gbmV3IEludDMyQXJyYXkoYnVmZmVyKTtcbiAgICAgICAgY2FzZSAnYm9vbCc6XG4gICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBkdHlwZSAke2R0eXBlfWApO1xuICAgIH1cbn1cbmNvbnN0IHdhc21CaW5hcnlOYW1lcyA9IFtcbiAgICAndGZqcy1iYWNrZW5kLXdhc20ud2FzbScsICd0ZmpzLWJhY2tlbmQtd2FzbS1zaW1kLndhc20nLFxuICAgICd0ZmpzLWJhY2tlbmQtd2FzbS10aHJlYWRlZC1zaW1kLndhc20nXG5dO1xubGV0IHdhc21QYXRoID0gbnVsbDtcbmxldCB3YXNtUGF0aFByZWZpeCA9IG51bGw7XG5sZXQgd2FzbUZpbGVNYXAgPSB7fTtcbmxldCBpbml0QWJvcnRlZCA9IGZhbHNlO1xubGV0IGN1c3RvbUZldGNoID0gZmFsc2U7XG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBgc2V0V2FzbVBhdGhzYCBpbnN0ZWFkLlxuICogU2V0cyB0aGUgcGF0aCB0byB0aGUgYC53YXNtYCBmaWxlIHdoaWNoIHdpbGwgYmUgZmV0Y2hlZCB3aGVuIHRoZSB3YXNtXG4gKiBiYWNrZW5kIGlzIGluaXRpYWxpemVkLiBTZWVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RmanMvYmxvYi9tYXN0ZXIvdGZqcy1iYWNrZW5kLXdhc20vUkVBRE1FLm1kI3VzaW5nLWJ1bmRsZXJzXG4gKiBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHBhcmFtIHBhdGggd2FzbSBmaWxlIHBhdGggb3IgdXJsXG4gKiBAcGFyYW0gdXNlUGxhdGZvcm1GZXRjaCBvcHRpb25hbCBib29sZWFuIHRvIHVzZSBwbGF0Zm9ybSBmZXRjaCB0byBkb3dubG9hZFxuICogICAgIHRoZSB3YXNtIGZpbGUsIGRlZmF1bHQgdG8gZmFsc2UuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0Vudmlyb25tZW50JywgbmFtZXNwYWNlOiAnd2FzbSd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRXYXNtUGF0aChwYXRoLCB1c2VQbGF0Zm9ybUZldGNoID0gZmFsc2UpIHtcbiAgICBkZXByZWNhdGlvbldhcm4oJ3NldFdhc21QYXRoIGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2Ygc2V0V2FzbVBhdGhzIGFuZCcgK1xuICAgICAgICAnIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLicpO1xuICAgIGlmIChpbml0QWJvcnRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBXQVNNIGJhY2tlbmQgd2FzIGFscmVhZHkgaW5pdGlhbGl6ZWQuIE1ha2Ugc3VyZSB5b3UgY2FsbCAnICtcbiAgICAgICAgICAgICdgc2V0V2FzbVBhdGgoKWAgYmVmb3JlIHlvdSBjYWxsIGB0Zi5zZXRCYWNrZW5kKClgIG9yIGB0Zi5yZWFkeSgpYCcpO1xuICAgIH1cbiAgICB3YXNtUGF0aCA9IHBhdGg7XG4gICAgY3VzdG9tRmV0Y2ggPSB1c2VQbGF0Zm9ybUZldGNoO1xufVxuLyoqXG4gKiBDb25maWd1cmVzIHRoZSBsb2NhdGlvbnMgb2YgdGhlIFdBU00gYmluYXJpZXMuXG4gKlxuICogYGBganNcbiAqIHNldFdhc21QYXRocyh7XG4gKiAgJ3RmanMtYmFja2VuZC13YXNtLndhc20nOiAncmVuYW1lZC53YXNtJyxcbiAqICAndGZqcy1iYWNrZW5kLXdhc20tc2ltZC53YXNtJzogJ3JlbmFtZWQtc2ltZC53YXNtJyxcbiAqICAndGZqcy1iYWNrZW5kLXdhc20tdGhyZWFkZWQtc2ltZC53YXNtJzogJ3JlbmFtZWQtdGhyZWFkZWQtc2ltZC53YXNtJ1xuICogfSk7XG4gKiB0Zi5zZXRCYWNrZW5kKCd3YXNtJyk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gcHJlZml4T3JGaWxlTWFwIFRoaXMgY2FuIGJlIGVpdGhlciBhIHN0cmluZyBvciBvYmplY3Q6XG4gKiAgLSAoc3RyaW5nKSBUaGUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBXQVNNIGJpbmFyaWVzIGFyZSBsb2NhdGVkLlxuICogICAgIE5vdGUgdGhhdCB0aGlzIHByZWZpeCB3aWxsIGJlIHVzZWQgdG8gbG9hZCBlYWNoIGJpbmFyeSAodmFuaWxsYSxcbiAqICAgICBTSU1ELWVuYWJsZWQsIHRocmVhZGluZy1lbmFibGVkLCBldGMuKS5cbiAqICAtIChvYmplY3QpIE1hcHBpbmcgZnJvbSBuYW1lcyBvZiBXQVNNIGJpbmFyaWVzIHRvIGN1c3RvbVxuICogICAgIGZ1bGwgcGF0aHMgc3BlY2lmeWluZyB0aGUgbG9jYXRpb25zIG9mIHRob3NlIGJpbmFyaWVzLiBUaGlzIGlzIHVzZWZ1bCBpZlxuICogICAgIHlvdXIgV0FTTSBiaW5hcmllcyBhcmUgbm90IGFsbCBsb2NhdGVkIGluIHRoZSBzYW1lIGRpcmVjdG9yeSwgb3IgaWYgeW91clxuICogICAgIFdBU00gYmluYXJpZXMgaGF2ZSBiZWVuIHJlbmFtZWQuXG4gKiBAcGFyYW0gdXNlUGxhdGZvcm1GZXRjaCBvcHRpb25hbCBib29sZWFuIHRvIHVzZSBwbGF0Zm9ybSBmZXRjaCB0byBkb3dubG9hZFxuICogICAgIHRoZSB3YXNtIGZpbGUsIGRlZmF1bHQgdG8gZmFsc2UuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0Vudmlyb25tZW50JywgbmFtZXNwYWNlOiAnd2FzbSd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRXYXNtUGF0aHMocHJlZml4T3JGaWxlTWFwLCB1c2VQbGF0Zm9ybUZldGNoID0gZmFsc2UpIHtcbiAgICBpZiAoaW5pdEFib3J0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgV0FTTSBiYWNrZW5kIHdhcyBhbHJlYWR5IGluaXRpYWxpemVkLiBNYWtlIHN1cmUgeW91IGNhbGwgJyArXG4gICAgICAgICAgICAnYHNldFdhc21QYXRocygpYCBiZWZvcmUgeW91IGNhbGwgYHRmLnNldEJhY2tlbmQoKWAgb3IgJyArXG4gICAgICAgICAgICAnYHRmLnJlYWR5KClgJyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcHJlZml4T3JGaWxlTWFwID09PSAnc3RyaW5nJykge1xuICAgICAgICB3YXNtUGF0aFByZWZpeCA9IHByZWZpeE9yRmlsZU1hcDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHdhc21GaWxlTWFwID0gcHJlZml4T3JGaWxlTWFwO1xuICAgICAgICBjb25zdCBtaXNzaW5nUGF0aHMgPSB3YXNtQmluYXJ5TmFtZXMuZmlsdGVyKG5hbWUgPT4gd2FzbUZpbGVNYXBbbmFtZV0gPT0gbnVsbCk7XG4gICAgICAgIGlmIChtaXNzaW5nUGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGVyZSB3ZXJlIG5vIGVudHJpZXMgZm91bmQgZm9yIHRoZSBmb2xsb3dpbmcgYmluYXJpZXM6IGAgK1xuICAgICAgICAgICAgICAgIGAke21pc3NpbmdQYXRocy5qb2luKCcsJyl9LiBQbGVhc2UgZWl0aGVyIGNhbGwgc2V0V2FzbVBhdGhzIHdpdGggYSBgICtcbiAgICAgICAgICAgICAgICBgbWFwIHByb3ZpZGluZyBhIHBhdGggZm9yIGVhY2ggYmluYXJ5LCBvciB3aXRoIGEgc3RyaW5nIGluZGljYXRpbmcgYCArXG4gICAgICAgICAgICAgICAgYHRoZSBkaXJlY3Rvcnkgd2hlcmUgYWxsIHRoZSBiaW5hcmllcyBjYW4gYmUgZm91bmQuYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY3VzdG9tRmV0Y2ggPSB1c2VQbGF0Zm9ybUZldGNoO1xufVxuLyoqIFVzZWQgaW4gdW5pdCB0ZXN0cy4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNldFdhc21QYXRoKCkge1xuICAgIHdhc21QYXRoID0gbnVsbDtcbiAgICB3YXNtUGF0aFByZWZpeCA9IG51bGw7XG4gICAgd2FzbUZpbGVNYXAgPSB7fTtcbiAgICBjdXN0b21GZXRjaCA9IGZhbHNlO1xuICAgIGluaXRBYm9ydGVkID0gZmFsc2U7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iYWNrZW5kX3dhc20uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0ICcuL2ZsYWdzX3dhc20nO1xuaW1wb3J0IHsgcmVnaXN0ZXJCYWNrZW5kIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IEJhY2tlbmRXYXNtLCBpbml0IH0gZnJvbSAnLi9iYWNrZW5kX3dhc20nO1xuZXhwb3J0IHsgQmFja2VuZFdhc20sIHNldFdhc21QYXRoLCBzZXRXYXNtUGF0aHMgfSBmcm9tICcuL2JhY2tlbmRfd2FzbSc7XG5leHBvcnQgeyB2ZXJzaW9uIGFzIHZlcnNpb25fd2FzbSB9IGZyb20gJy4vdmVyc2lvbic7XG5jb25zdCBXQVNNX1BSSU9SSVRZID0gMjtcbnJlZ2lzdGVyQmFja2VuZCgnd2FzbScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IHdhc20gfSA9IGF3YWl0IGluaXQoKTtcbiAgICByZXR1cm4gbmV3IEJhY2tlbmRXYXNtKHdhc20pO1xufSwgV0FTTV9QUklPUklUWSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iYXNlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGVudiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5jb25zdCBFTlYgPSBlbnYoKTtcbi8qKlxuICogVHJ1ZSBpZiBTSU1EIGlzIHN1cHBvcnRlZC5cbiAqL1xuLy8gRnJvbTogaHR0cHM6Ly9naXRodWIuY29tL0dvb2dsZUNocm9tZUxhYnMvd2FzbS1mZWF0dXJlLWRldGVjdFxuRU5WLnJlZ2lzdGVyRmxhZyhcbi8vIFRoaXMgdHlwZWQgYXJyYXkgcGFzc2VkIGluIHRvIFdlYkFzc2VtYmx5LnZhbGlkYXRlIGlzIFdlYkFzc2VtYmx5IGJpbmFyeVxuLy8gY29kZS4gSW4gdGhpcyBjYXNlIGl0IGlzIGEgc21hbGwgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIFNJTURcbi8vIGluc3RydWN0aW9ucy5cbidXQVNNX0hBU19TSU1EX1NVUFBPUlQnLCBhc3luYyAoKSA9PiBXZWJBc3NlbWJseS52YWxpZGF0ZShuZXcgVWludDhBcnJheShbXG4gICAgMCwgOTcsIDExNSwgMTA5LCAxLCAwLCAwLCAwLCAxLCA0LCAxLCA5NiwgMCwgMCwgMyxcbiAgICAyLCAxLCAwLCAxMCwgOSwgMSwgNywgMCwgNjUsIDAsIDI1MywgMTUsIDI2LCAxMVxuXSkpKTtcbi8qKlxuICogVHJ1ZSBpZiB0aHJlYWRzIGFyZSBzdXBwb3J0ZWQuXG4gKi9cbi8vIEZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9Hb29nbGVDaHJvbWVMYWJzL3dhc20tZmVhdHVyZS1kZXRlY3RcbkVOVi5yZWdpc3RlckZsYWcoJ1dBU01fSEFTX01VTFRJVEhSRUFEX1NVUFBPUlQnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gVE9ETyhhbm54aW5neXVhbik6IEVuYWJsZSBub2RlIHN1cHBvcnQgb25jZSB0aGlzIGlzIHJlc29sdmVkOlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RmanMvaXNzdWVzLzM4MzBcbiAgICBpZiAoRU5WLmdldCgnSVNfTk9ERScpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gVGVzdCBmb3IgdHJhbnNmZXJhYmlsaXR5IG9mIFNBQnMgKG5lZWRlZCBmb3IgRmlyZWZveClcbiAgICAgICAgLy8gaHR0cHM6Ly9ncm91cHMuZ29vZ2xlLmNvbS9mb3J1bS8jIW1zZy9tb3ppbGxhLmRldi5wbGF0Zm9ybS9JSGtCWmxIRVRwQS9kd3NNTmNoV0VRQUpcbiAgICAgICAgbmV3IE1lc3NhZ2VDaGFubmVsKCkucG9ydDEucG9zdE1lc3NhZ2UobmV3IFNoYXJlZEFycmF5QnVmZmVyKDEpKTtcbiAgICAgICAgLy8gVGhpcyB0eXBlZCBhcnJheSBpcyBhIFdlYkFzc2VtYmx5IHByb2dyYW0gY29udGFpbmluZyB0aHJlYWRlZFxuICAgICAgICAvLyBpbnN0cnVjdGlvbnMuXG4gICAgICAgIHJldHVybiBXZWJBc3NlbWJseS52YWxpZGF0ZShuZXcgVWludDhBcnJheShbXG4gICAgICAgICAgICAwLCA5NywgMTE1LCAxMDksIDEsIDAsIDAsIDAsIDEsIDQsIDEsIDk2LCAwLCAwLCAzLCAyLCAxLCAwLCA1LFxuICAgICAgICAgICAgNCwgMSwgMywgMSwgMSwgMTAsIDExLCAxLCA5LCAwLCA2NSwgMCwgMjU0LCAxNiwgMiwgMCwgMjYsIDExXG4gICAgICAgIF0pKTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmxhZ3Nfd2FzbS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgJy4vcmVnaXN0ZXJfYWxsX2tlcm5lbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9iYXNlJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8vIEltcG9ydCBzaGFyZWQgZnVuY3Rpb25hbGl0eSBmcm9tIHRmanMtYmFja2VuZC1jcHUgd2l0aG91dCB0cmlnZ2VyaW5nXG4vLyBzaWRlIGVmZmVjdHMuXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWltcG9ydHMtZnJvbS1kaXN0XG5pbXBvcnQgeyBjb25jYXRJbXBsIGFzIGNvbmNhdEltcGxDUFUgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qvc2hhcmVkJztcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8taW1wb3J0cy1mcm9tLWRpc3RcbmltcG9ydCB7IHNsaWNlSW1wbCBhcyBzbGljZUltcGxDUFUgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qvc2hhcmVkJztcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8taW1wb3J0cy1mcm9tLWRpc3RcbmltcG9ydCB7IHJhbmdlSW1wbCBhcyByYW5nZUltcGxDUFUgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qvc2hhcmVkJztcbmV4cG9ydCB7IGNvbmNhdEltcGxDUFUsIHJhbmdlSW1wbENQVSwgc2xpY2VJbXBsQ1BVIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zaGFyZWQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQWJzIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi91bmFyeV9rZXJuZWwnO1xuZXhwb3J0IGNvbnN0IGFic0NvbmZpZyA9IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnKEFicyk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BYnMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQWRkIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vYmluYXJ5X2tlcm5lbCc7XG5jb25zdCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QgPSB0cnVlO1xuZXhwb3J0IGNvbnN0IGFkZENvbmZpZyA9IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyhBZGQsIHN1cHBvcnRzRnVsbEJyb2FkY2FzdCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BZGQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQWRkTiwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBDcHBEVHlwZSB9IGZyb20gJy4vdHlwZXMnO1xubGV0IHdhc21GdW5jO1xuZnVuY3Rpb24gc2V0dXBGdW5jKGJhY2tlbmQpIHtcbiAgICB3YXNtRnVuYyA9IGJhY2tlbmQud2FzbS5jd3JhcChBZGROLCBudWxsIC8qIHZvaWQgKi8sIFtcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICBdKTtcbn1cbmZ1bmN0aW9uIGFkZG4oYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChpbnB1dHNbMF0uc2hhcGUsIGlucHV0c1swXS5kdHlwZSk7XG4gICAgLy8gU2hvcnQtY2lyY3VpdCB6ZXJvLXNpemVkIHRlbnNvcnMuXG4gICAgaWYgKHV0aWwuc2l6ZUZyb21TaGFwZShvdXQuc2hhcGUpID09PSAwKSB7XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0SWRzID0gaW5wdXRzLm1hcCh4ID0+IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh4LmRhdGFJZCkuaWQpO1xuICAgIGNvbnN0IGlucHV0SWRzQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheShpbnB1dElkcykuYnVmZmVyKTtcbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICB3YXNtRnVuYyhpbnB1dElkc0J5dGVzLCBpbnB1dElkcy5sZW5ndGgsIENwcERUeXBlW291dC5kdHlwZV0sIG91dElkKTtcbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IGFkZE5Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQWRkTixcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYyxcbiAgICBrZXJuZWxGdW5jOiBhZGRuLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFkZE4uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQWxsLCBiYWNrZW5kX3V0aWwsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgcGVybXV0ZUF4ZXNBbmRUcmFuc3Bvc2UgfSBmcm9tICcuL2tlcm5lbF91dGlscyc7XG5sZXQgd2FzbUFsbDtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtQWxsID0gYmFja2VuZC53YXNtLmN3cmFwKEFsbCwgbnVsbCAvKnZvaWQqLywgWydudW1iZXIsIG51bWJlciwgbnVtYmVyJ10pO1xufVxuZnVuY3Rpb24gYWxsKGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGlucHV0cywgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBheGlzLCBrZWVwRGltcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHguZGF0YUlkKS5pZDtcbiAgICBsZXQgaW5wdXRJZCA9IHhJZDtcbiAgICBsZXQgaW5wdXQgPSB4O1xuICAgIGNvbnN0IHsgdHJhbnNwb3NlZCwgYXhlcywgb3JpZ2luYWxBeGVzLCBpbnB1dFdhc1RyYW5zcG9zZWQgfSA9IHBlcm11dGVBeGVzQW5kVHJhbnNwb3NlKHgsIGF4aXMsIGJhY2tlbmQpO1xuICAgIGlmIChpbnB1dFdhc1RyYW5zcG9zZWQpIHtcbiAgICAgICAgY29uc3QgdHJhbnNwb3NlZElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHRyYW5zcG9zZWQuZGF0YUlkKS5pZDtcbiAgICAgICAgaW5wdXQgPSB0cmFuc3Bvc2VkO1xuICAgICAgICBpbnB1dElkID0gdHJhbnNwb3NlZElkO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dFJhbmsgPSBpbnB1dC5zaGFwZS5sZW5ndGg7XG4gICAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdhbGwnLCBheGVzLCBpbnB1dFJhbmspO1xuICAgIGNvbnN0IFtvdXRTaGFwZSwgcmVkdWNlU2hhcGVdID0gYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMoaW5wdXQuc2hhcGUsIGF4ZXMpO1xuICAgIGNvbnN0IHJlZHVjZVNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChvdXRTaGFwZSwgeC5kdHlwZSk7XG4gICAgaWYgKHV0aWwuc2l6ZUZyb21TaGFwZShpbnB1dC5zaGFwZSkgIT09IDApIHtcbiAgICAgICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgICAgIHdhc21BbGwoaW5wdXRJZCwgcmVkdWNlU2l6ZSwgb3V0SWQpO1xuICAgIH1cbiAgICBpZiAoaW5wdXRXYXNUcmFuc3Bvc2VkKSB7XG4gICAgICAgIC8vIGRpc3Bvc2Ugb2YgdGhlIHRyYW5zcG9zZWQgdGVuc29yLlxuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VEYXRhKHRyYW5zcG9zZWQuZGF0YUlkKTtcbiAgICB9XG4gICAgaWYgKGtlZXBEaW1zKSB7XG4gICAgICAgIC8vIHJlc2hhcGVcbiAgICAgICAgY29uc3QgbmV3U2hhcGUgPSBiYWNrZW5kX3V0aWwuZXhwYW5kU2hhcGVUb0tlZXBEaW0ob3V0LnNoYXBlLCBvcmlnaW5hbEF4ZXMpO1xuICAgICAgICBvdXQuc2hhcGUgPSBuZXdTaGFwZTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBhbGxDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQWxsLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiBhbGxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BbGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQW55LCBiYWNrZW5kX3V0aWwsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgcGVybXV0ZUF4ZXNBbmRUcmFuc3Bvc2UgfSBmcm9tICcuL2tlcm5lbF91dGlscyc7XG5sZXQgd2FzbUFueTtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtQW55ID0gYmFja2VuZC53YXNtLmN3cmFwKEFueSwgbnVsbCAvKnZvaWQqLywgWydudW1iZXIsIG51bWJlciwgbnVtYmVyJ10pO1xufVxuZnVuY3Rpb24gYW55KGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGlucHV0cywgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBheGlzLCBrZWVwRGltcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHguZGF0YUlkKS5pZDtcbiAgICBsZXQgaW5wdXRJZCA9IHhJZDtcbiAgICBsZXQgaW5wdXQgPSB4O1xuICAgIGNvbnN0IHsgdHJhbnNwb3NlZCwgYXhlcywgb3JpZ2luYWxBeGVzLCBpbnB1dFdhc1RyYW5zcG9zZWQgfSA9IHBlcm11dGVBeGVzQW5kVHJhbnNwb3NlKHgsIGF4aXMsIGJhY2tlbmQpO1xuICAgIGlmIChpbnB1dFdhc1RyYW5zcG9zZWQpIHtcbiAgICAgICAgY29uc3QgdHJhbnNwb3NlZElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHRyYW5zcG9zZWQuZGF0YUlkKS5pZDtcbiAgICAgICAgaW5wdXQgPSB0cmFuc3Bvc2VkO1xuICAgICAgICBpbnB1dElkID0gdHJhbnNwb3NlZElkO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dFJhbmsgPSBpbnB1dC5zaGFwZS5sZW5ndGg7XG4gICAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdhbnknLCBheGVzLCBpbnB1dFJhbmspO1xuICAgIGNvbnN0IFtvdXRTaGFwZSwgcmVkdWNlU2hhcGVdID0gYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMoaW5wdXQuc2hhcGUsIGF4ZXMpO1xuICAgIGNvbnN0IHJlZHVjZVNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChvdXRTaGFwZSwgeC5kdHlwZSk7XG4gICAgaWYgKHV0aWwuc2l6ZUZyb21TaGFwZShpbnB1dC5zaGFwZSkgIT09IDApIHtcbiAgICAgICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgICAgIHdhc21BbnkoaW5wdXRJZCwgcmVkdWNlU2l6ZSwgb3V0SWQpO1xuICAgIH1cbiAgICBpZiAoaW5wdXRXYXNUcmFuc3Bvc2VkKSB7XG4gICAgICAgIC8vIGRpc3Bvc2Ugb2YgdGhlIHRyYW5zcG9zZWQgdGVuc29yLlxuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VEYXRhKHRyYW5zcG9zZWQuZGF0YUlkKTtcbiAgICB9XG4gICAgaWYgKGtlZXBEaW1zKSB7XG4gICAgICAgIC8vIHJlc2hhcGVcbiAgICAgICAgY29uc3QgbmV3U2hhcGUgPSBiYWNrZW5kX3V0aWwuZXhwYW5kU2hhcGVUb0tlZXBEaW0ob3V0LnNoYXBlLCBvcmlnaW5hbEF4ZXMpO1xuICAgICAgICBvdXQuc2hhcGUgPSBuZXdTaGFwZTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBhbnlDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQW55LFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiBhbnlcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BbnkuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQXJnTWF4LCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHBlcm11dGVBeGVzQW5kVHJhbnNwb3NlIH0gZnJvbSAnLi9rZXJuZWxfdXRpbHMnO1xuaW1wb3J0IHsgQ3BwRFR5cGUgfSBmcm9tICcuL3R5cGVzJztcbmxldCB3YXNtRnVuYztcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtRnVuYyA9IGJhY2tlbmQud2FzbS5jd3JhcChBcmdNYXgsIG51bGwgLyogdm9pZCAqLywgW1xuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicgLy8gb3V0X2lkXG4gICAgXSk7XG59XG5mdW5jdGlvbiBhcmdtYXgoYXJncykge1xuICAgIGNvbnN0IHsgYmFja2VuZCwgaW5wdXRzLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGF4aXMgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHhJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh4LmRhdGFJZCkuaWQ7XG4gICAgbGV0IGlucHV0SWQgPSB4SWQ7XG4gICAgbGV0IGlucHV0ID0geDtcbiAgICBjb25zdCB7IHRyYW5zcG9zZWQsIGF4ZXMsIGlucHV0V2FzVHJhbnNwb3NlZCB9ID0gcGVybXV0ZUF4ZXNBbmRUcmFuc3Bvc2UoeCwgYXhpcywgYmFja2VuZCk7XG4gICAgaWYgKGlucHV0V2FzVHJhbnNwb3NlZCkge1xuICAgICAgICBjb25zdCB0cmFuc3Bvc2VkSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQodHJhbnNwb3NlZC5kYXRhSWQpLmlkO1xuICAgICAgICBpZiAodHJhbnNwb3NlZElkICE9PSB4SWQpIHtcbiAgICAgICAgICAgIC8vIHRyYW5zcG9zZSB3YXMgbm90IGEgbm8tb3AuIFdlIHdpbGwgbmVlZCB0byBkaXNwb3NlIG9mIHRoaXNcbiAgICAgICAgICAgIC8vIG9uY2Ugd2UgYXJlIGRvbmUuXG4gICAgICAgICAgICBpbnB1dCA9IHRyYW5zcG9zZWQ7XG4gICAgICAgICAgICBpbnB1dElkID0gdHJhbnNwb3NlZElkO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG91dFNoYXBlID0gaW5wdXQuc2hhcGUuc2xpY2UoMCwgLTEpO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChvdXRTaGFwZSwgJ2ludDMyJyk7XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgY29uc3Qgb3V0ZXJTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKG91dC5zaGFwZSk7XG4gICAgY29uc3QgaW5uZXJTaXplID0gaW5wdXQuc2hhcGVbYXhlc1swXV07XG4gICAgd2FzbUZ1bmMoaW5wdXRJZCwgQ3BwRFR5cGVbaW5wdXQuZHR5cGVdLCBvdXRlclNpemUsIGlubmVyU2l6ZSwgb3V0SWQpO1xuICAgIGlmIChpbnB1dFdhc1RyYW5zcG9zZWQpIHtcbiAgICAgICAgLy8gZGlzcG9zZSBvZiB0aGUgdHJhbnNwb3NlZCB0ZW5zb3IuXG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZURhdGEodHJhbnNwb3NlZC5kYXRhSWQpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IGFyZ01heENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBBcmdNYXgsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBrZXJuZWxGdW5jOiBhcmdtYXgsXG4gICAgc2V0dXBGdW5jOiBzZXR1cFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFyZ01heC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBdmdQb29sLCBiYWNrZW5kX3V0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xubGV0IHdhc21BdmdQb29sO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21BdmdQb29sID0gYmFja2VuZC53YXNtLmN3cmFwKEF2Z1Bvb2wsIG51bGwgLyogdm9pZCAqLywgW1xuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgXSk7XG59XG5mdW5jdGlvbiBhdmdQb29sKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYXR0cnMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeCA9IGlucHV0cy54O1xuICAgIGNvbnN0IHhJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh4LmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgeyBmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSB9ID0gYXR0cnM7XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wyREluZm8oeC5zaGFwZSwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgMSAvKiBkaWxhdGlvbnMgKi8sIHBhZCwgZGltUm91bmRpbmdNb2RlKTtcbiAgICBjb25zdCBmaWx0ZXJIZWlnaHQgPSBjb252SW5mby5maWx0ZXJIZWlnaHQ7XG4gICAgY29uc3QgZmlsdGVyV2lkdGggPSBjb252SW5mby5maWx0ZXJXaWR0aDtcbiAgICBjb25zdCBwYWRUb3AgPSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICBjb25zdCBwYWRSaWdodCA9IGNvbnZJbmZvLnBhZEluZm8ucmlnaHQ7XG4gICAgY29uc3QgcGFkQm90dG9tID0gY29udkluZm8ucGFkSW5mby5ib3R0b207XG4gICAgY29uc3QgcGFkTGVmdCA9IGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBjaGFubmVscyA9IGNvbnZJbmZvLmluQ2hhbm5lbHM7XG4gICAgaWYgKGNvbnZJbmZvLmRhdGFGb3JtYXQgIT09ICdjaGFubmVsc0xhc3QnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgd2FzbSBiYWNrZW5kIGRvZXMgbm90IHN1cHBvcnQgZGF0YUZvcm1hdDonYCArXG4gICAgICAgICAgICBgJHtjb252SW5mby5kYXRhRm9ybWF0fScuIFBsZWFzZSB1c2UgJ2NoYW5uZWxzTGFzdCcuYCk7XG4gICAgfVxuICAgIGlmIChjb252SW5mby5kaWxhdGlvbldpZHRoICE9PSAxIHx8IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0ICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgd2FzIGJhY2tlbmQgb25seSBzdXBwb3J0cyBhdmVyYWdlIHBvb2xpbmcgd2l0aCBkaWxhdGlvbiA9IFsxLCAxXSwgYCArXG4gICAgICAgICAgICBgZ290IFske2NvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0fSwgJHtjb252SW5mby5kaWxhdGlvbldpZHRofV0uYCk7XG4gICAgfVxuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChjb252SW5mby5vdXRTaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICB3YXNtQXZnUG9vbCh4SWQsIHguc2hhcGVbMF0sIHguc2hhcGVbMV0sIHguc2hhcGVbMl0sIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIHBhZFRvcCwgcGFkUmlnaHQsIHBhZEJvdHRvbSwgcGFkTGVmdCwgc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aCwgY2hhbm5lbHMsIG91dElkKTtcbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IGF2Z1Bvb2xDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQXZnUG9vbCxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogYXZnUG9vbFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUF2Z1Bvb2wuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQmF0Y2hNYXRNdWwsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5sZXQgd2FzbUJhdGNoTWF0TXVsO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21CYXRjaE1hdE11bCA9IGJhY2tlbmQud2FzbS5jd3JhcChCYXRjaE1hdE11bCwgbnVsbCAvKiB2b2lkICovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInIC8vIG91dF9pZFxuICAgIF0pO1xufVxuZnVuY3Rpb24gYmF0Y2hNYXRNdWwoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGEsIGIgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHRyYW5zcG9zZUEsIHRyYW5zcG9zZUIgfSA9IGF0dHJzO1xuICAgIGlmIChhLmR0eXBlICE9PSAnZmxvYXQzMicgfHwgYi5kdHlwZSAhPT0gJ2Zsb2F0MzInKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQmF0Y2hNYXRNdWwgZm9yIG5vbiBub24tZmxvYXQzMiB0ZW5zb3JzIG5vdCB5ZXQgc3VwcG9ydGVkLmApO1xuICAgIH1cbiAgICBjb25zdCBhUmFuayA9IGEuc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IGJSYW5rID0gYi5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgaW5uZXJTaGFwZUEgPSB0cmFuc3Bvc2VBID8gYS5zaGFwZVthUmFuayAtIDJdIDogYS5zaGFwZVthUmFuayAtIDFdO1xuICAgIGNvbnN0IGlubmVyU2hhcGVCID0gdHJhbnNwb3NlQiA/IGIuc2hhcGVbYlJhbmsgLSAxXSA6IGIuc2hhcGVbYlJhbmsgLSAyXTtcbiAgICBjb25zdCBvdXRlclNoYXBlQSA9IHRyYW5zcG9zZUEgPyBhLnNoYXBlW2FSYW5rIC0gMV0gOiBhLnNoYXBlW2FSYW5rIC0gMl07XG4gICAgY29uc3Qgb3V0ZXJTaGFwZUIgPSB0cmFuc3Bvc2VCID8gYi5zaGFwZVtiUmFuayAtIDJdIDogYi5zaGFwZVtiUmFuayAtIDFdO1xuICAgIGNvbnN0IG91dGVyRGltc0EgPSBhLnNoYXBlLnNsaWNlKDAsIC0yKTtcbiAgICBjb25zdCBvdXRlckRpbXNCID0gYi5zaGFwZS5zbGljZSgwLCAtMik7XG4gICAgY29uc3QgYmF0Y2hEaW1BID0gdXRpbC5zaXplRnJvbVNoYXBlKG91dGVyRGltc0EpO1xuICAgIGNvbnN0IGJhdGNoRGltQiA9IHV0aWwuc2l6ZUZyb21TaGFwZShvdXRlckRpbXNCKTtcbiAgICBjb25zdCBiYXRjaERpbXNDb21wYXRpYmxlID0gYmF0Y2hEaW1BID09PSBiYXRjaERpbUIgfHwgYmF0Y2hEaW1BID09PSAxIHx8IGJhdGNoRGltQiA9PT0gMTtcbiAgICB1dGlsLmFzc2VydChhUmFuayA+PSAyICYmIGJSYW5rID49IDIgJiYgYmF0Y2hEaW1zQ29tcGF0aWJsZSwgKCkgPT4gYEVycm9yIGluIG1hdE11bDogdGhlIGlucHV0IGJhdGNoIGRpbWVuc2lvbnMgbXVzdCBlaXRoZXIgYmUgdGhlIGAgK1xuICAgICAgICBgc2FtZSBvciBhdCBsZWFzdCBvbmUgaW5wdXQgYmF0Y2ggZGltZW5zaW9uIG11c3QgYmUgMS4gR290IGlucHV0IGAgK1xuICAgICAgICBgYmF0Y2ggZGltZW5zaW9ucyBvZiAoJHtvdXRlckRpbXNBfSkgYW5kICgke291dGVyRGltc0J9KS5gKTtcbiAgICBjb25zdCBvdXRTaGFwZU91dGVyRGltcyA9IGJhdGNoRGltQSA+IGJhdGNoRGltQiA/IGEuc2hhcGUuc2xpY2UoMCwgLTIpIDogYi5zaGFwZS5zbGljZSgwLCAtMik7XG4gICAgY29uc3Qgb3V0U2hhcGUgPSBvdXRTaGFwZU91dGVyRGltcy5jb25jYXQoW291dGVyU2hhcGVBLCBvdXRlclNoYXBlQl0pO1xuICAgIHV0aWwuYXNzZXJ0KGlubmVyU2hhcGVBID09PSBpbm5lclNoYXBlQiwgKCkgPT4gYEVycm9yIGluIG1hdE11bDogaW5uZXIgc2hhcGVzICgke2lubmVyU2hhcGVBfSkgYW5kIChgICtcbiAgICAgICAgYCR7aW5uZXJTaGFwZUJ9KSBvZiBUZW5zb3JzIHdpdGggc2hhcGVzICR7YS5zaGFwZX0gYW5kIGAgK1xuICAgICAgICBgJHtiLnNoYXBlfSBhbmQgdHJhbnNwb3NlQT0ke3RyYW5zcG9zZUF9YCArXG4gICAgICAgIGAgYW5kIHRyYW5zcG9zZUI9JHt0cmFuc3Bvc2VCfSBtdXN0IG1hdGNoLmApO1xuICAgIGNvbnN0IGEzZFNoYXBlID0gdHJhbnNwb3NlQSA/IFtiYXRjaERpbUEsIGlubmVyU2hhcGVBLCBvdXRlclNoYXBlQV0gOlxuICAgICAgICBbYmF0Y2hEaW1BLCBvdXRlclNoYXBlQSwgaW5uZXJTaGFwZUFdO1xuICAgIGNvbnN0IGIzZFNoYXBlID0gdHJhbnNwb3NlQiA/IFtiYXRjaERpbUIsIG91dGVyU2hhcGVCLCBpbm5lclNoYXBlQl0gOlxuICAgICAgICBbYmF0Y2hEaW1CLCBpbm5lclNoYXBlQiwgb3V0ZXJTaGFwZUJdO1xuICAgIC8vIFRoZSByZXN0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBkZXNpZ25lZCB0byBvcGVyYXRlIG9uIHJhbmstMyB0ZW5zb3JzXG4gICAgY29uc3QgYTNkID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiBhIH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBhM2RTaGFwZSB9IH0pO1xuICAgIGNvbnN0IGIzZCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogYiB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogYjNkU2hhcGUgfSB9KTtcbiAgICBjb25zdCBhM2RJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChhM2QuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBiM2RJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChiM2QuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBsZWZ0RGltID0gdHJhbnNwb3NlQSA/IGEzZC5zaGFwZVsyXSA6IGEzZC5zaGFwZVsxXTtcbiAgICBjb25zdCByaWdodERpbSA9IHRyYW5zcG9zZUIgPyBiM2Quc2hhcGVbMV0gOiBiM2Quc2hhcGVbMl07XG4gICAgY29uc3QgYmF0Y2hEaW0gPSBNYXRoLm1heChiYXRjaERpbUEsIGJhdGNoRGltQik7XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KFtiYXRjaERpbSwgbGVmdERpbSwgcmlnaHREaW1dLCBhM2QuZHR5cGUpO1xuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IGFTaGFwZUJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobmV3IEludDMyQXJyYXkoYTNkLnNoYXBlKS5idWZmZXIpO1xuICAgIGNvbnN0IGJTaGFwZUJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobmV3IEludDMyQXJyYXkoYjNkLnNoYXBlKS5idWZmZXIpO1xuICAgIHdhc21CYXRjaE1hdE11bChhM2RJZCwgYVNoYXBlQnl0ZXMsIGEzZC5zaGFwZS5sZW5ndGgsIGIzZElkLCBiU2hhcGVCeXRlcywgYjNkLnNoYXBlLmxlbmd0aCwgdHJhbnNwb3NlQSwgdHJhbnNwb3NlQiwgb3V0SWQpO1xuICAgIGJhY2tlbmQuZGlzcG9zZURhdGEoYTNkLmRhdGFJZCk7XG4gICAgYmFja2VuZC5kaXNwb3NlRGF0YShiM2QuZGF0YUlkKTtcbiAgICBvdXQuc2hhcGUgPSBvdXRTaGFwZTtcbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IGJhdGNoTWF0TXVsQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEJhdGNoTWF0TXVsLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiBiYXRjaE1hdE11bFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJhdGNoTWF0TXVsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgQmF0Y2hUb1NwYWNlTkQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQgeyBzbGljZSB9IGZyb20gJy4vU2xpY2UnO1xuaW1wb3J0IHsgdHJhbnNwb3NlIH0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuZnVuY3Rpb24gYmF0Y2hUb1NwYWNlTkQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGJsb2NrU2hhcGUsIGNyb3BzIH0gPSBhdHRycztcbiAgICBjb25zdCBwcm9kID0gYmxvY2tTaGFwZS5yZWR1Y2UoKGEsIGIpID0+IGEgKiBiKTtcbiAgICBjb25zdCByZXNoYXBlZCA9IGJhY2tlbmRfdXRpbC5nZXRSZXNoYXBlZCh4LnNoYXBlLCBibG9ja1NoYXBlLCBwcm9kKTtcbiAgICBjb25zdCBwZXJtdXRlZCA9IGJhY2tlbmRfdXRpbC5nZXRQZXJtdXRlZChyZXNoYXBlZC5sZW5ndGgsIGJsb2NrU2hhcGUubGVuZ3RoKTtcbiAgICBjb25zdCByZXNoYXBlZFBlcm11dGVkID0gYmFja2VuZF91dGlsLmdldFJlc2hhcGVkUGVybXV0ZWQoeC5zaGFwZSwgYmxvY2tTaGFwZSwgcHJvZCk7XG4gICAgY29uc3Qgc2xpY2VCZWdpbkNvb3JkcyA9IGJhY2tlbmRfdXRpbC5nZXRTbGljZUJlZ2luQ29vcmRzKGNyb3BzLCBibG9ja1NoYXBlLmxlbmd0aCk7XG4gICAgY29uc3Qgc2xpY2VTaXplID0gYmFja2VuZF91dGlsLmdldFNsaWNlU2l6ZShyZXNoYXBlZFBlcm11dGVkLCBjcm9wcywgYmxvY2tTaGFwZS5sZW5ndGgpO1xuICAgIGNvbnN0IHhSZXNoYXBlZCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogcmVzaGFwZWQgfSB9KTtcbiAgICBjb25zdCB4VHJhbnNwb3NlZCA9IHRyYW5zcG9zZSh7IGlucHV0czogeyB4OiB4UmVzaGFwZWQgfSwgYmFja2VuZCwgYXR0cnM6IHsgcGVybTogcGVybXV0ZWQgfSB9KTtcbiAgICBjb25zdCB4VHJhbnNwb3NlZFJlc2hhcGVkID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiB4VHJhbnNwb3NlZCB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogcmVzaGFwZWRQZXJtdXRlZCB9IH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IHNsaWNlKHtcbiAgICAgICAgaW5wdXRzOiB7IHg6IHhUcmFuc3Bvc2VkUmVzaGFwZWQgfSxcbiAgICAgICAgYmFja2VuZCxcbiAgICAgICAgYXR0cnM6IHsgYmVnaW46IHNsaWNlQmVnaW5Db29yZHMsIHNpemU6IHNsaWNlU2l6ZSB9XG4gICAgfSk7XG4gICAgYmFja2VuZC5kaXNwb3NlRGF0YSh4UmVzaGFwZWQuZGF0YUlkKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VEYXRhKHhUcmFuc3Bvc2VkLmRhdGFJZCk7XG4gICAgYmFja2VuZC5kaXNwb3NlRGF0YSh4UmVzaGFwZWQuZGF0YUlkKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGNvbnN0IGJhdGNoVG9TcGFjZU5EQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEJhdGNoVG9TcGFjZU5ELFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAga2VybmVsRnVuYzogYmF0Y2hUb1NwYWNlTkRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1CYXRjaFRvU3BhY2VORC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBDYXN0IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiBjYXN0KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0czogeyB4IH0sIGF0dHJzOiB7IGR0eXBlIH0sIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KHguc2hhcGUsIGR0eXBlKTtcbiAgICBjb25zdCBpblZhbHMgPSBiYWNrZW5kLnR5cGVkQXJyYXlGcm9tSGVhcCh4KTtcbiAgICBjb25zdCBvdXRWYWxzID0gYmFja2VuZC50eXBlZEFycmF5RnJvbUhlYXAob3V0KTtcbiAgICBvdXRWYWxzLnNldChpblZhbHMpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgY2FzdENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBDYXN0LFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAga2VybmVsRnVuYzogY2FzdCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DYXN0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IENlaWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlVW5hcnlLZXJuZWxDb25maWcgfSBmcm9tICcuL3VuYXJ5X2tlcm5lbCc7XG5leHBvcnQgY29uc3QgY2VpbENvbmZpZyA9IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnKENlaWwpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q2VpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBDbGlwQnlWYWx1ZSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5sZXQgd2FzbUNsaXA7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbUNsaXAgPSBiYWNrZW5kLndhc20uY3dyYXAoQ2xpcEJ5VmFsdWUsIG51bGwgLyogdm9pZCAqLywgW1xuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyAvLyBvdXRfaWRcbiAgICBdKTtcbn1cbmZ1bmN0aW9uIGNsaXAoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGNsaXBWYWx1ZU1pbiwgY2xpcFZhbHVlTWF4IH0gPSBhdHRycztcbiAgICBjb25zdCB4SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dCh4LnNoYXBlLCB4LmR0eXBlKTtcbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICB3YXNtQ2xpcCh4SWQsIGNsaXBWYWx1ZU1pbiwgY2xpcFZhbHVlTWF4LCBvdXRJZCk7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBjbGlwQnlWYWx1ZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBDbGlwQnlWYWx1ZSxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogY2xpcFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNsaXBCeVZhbHVlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgQ29uY2F0LCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNvbmNhdEltcGxDUFUgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmltcG9ydCB7IGlkZW50aXR5IH0gZnJvbSAnLi9JZGVudGl0eSc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmV4cG9ydCBmdW5jdGlvbiBjb25jYXQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IGF4aXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGFyZ3MuYXR0cnMuYXhpcywgaW5wdXRzWzBdLnNoYXBlKVswXTtcbiAgICBsZXQgb3V0U2hhcGUgPSBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dFNoYXBlKGlucHV0cy5tYXAodCA9PiB0LnNoYXBlKSwgYXhpcyk7XG4gICAgLy8gS2VlcCBvbmx5IG5vbi1lbXB0eSB0ZW5zb3JzIChpZ25vcmUgdGVuc29ycyB3aXRoIDAgaW4gdGhlaXIgc2hhcGUpLlxuICAgIGNvbnN0ICRpbnB1dHMgPSBpbnB1dHMuZmlsdGVyKHQgPT4gdXRpbC5zaXplRnJvbVNoYXBlKHQuc2hhcGUpID4gMCk7XG4gICAgaWYgKCRpbnB1dHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiBpZGVudGl0eSh7IGlucHV0czogeyB4OiAkaW5wdXRzWzBdIH0sIGJhY2tlbmQgfSk7XG4gICAgfVxuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChvdXRTaGFwZSwgaW5wdXRzWzBdLmR0eXBlKTtcbiAgICBpZiAodXRpbC5zaXplRnJvbVNoYXBlKG91dFNoYXBlKSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cbiAgICBjb25zdCBzaGFwZXMgPSAkaW5wdXRzLm1hcCh0ID0+IHQuc2hhcGUpO1xuICAgIGJhY2tlbmRfdXRpbC5hc3NlcnRQYXJhbXNDb25zaXN0ZW50KHNoYXBlcywgYXhpcyk7XG4gICAgaWYgKCRpbnB1dHNbMF0uZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIC8vIEFueSBjb25jYXQgb2Ygbi1kaW1lbnNpb25hbCB0ZW5zb3JzIGFjcm9zcyBhbnkgYXhpcyBjYW4gYmUgcmVkdWNlZCB0b1xuICAgICAgICAvLyBhIGNvbmNhdGVuYXRpb24gb2YgdHdvLWRpbWVuc2lvbmFsIHRlbnNvcnMgYWNyb3NzIHRoZSBheGlzIDEgYnkgZmlyc3RcbiAgICAgICAgLy8gcGFydGl0aW9uaW5nIHRoZSBheGVzIG9mIHRoZSBvcmlnaW5hbCB0ZW5zb3JzIGludG8gdGhvc2UgbGVzcyB0aGFuIHRoZVxuICAgICAgICAvLyBheGlzIHRvIGJlIGNvbmNhdGVuYXRlZCBhbmQgdGhlIHJlc3QuIFRoZW4gcmVzaGFwZSB0aGUgdGVuc29yc1xuICAgICAgICAvLyBpbnRvIGEgdHdvLWRpbWVuc2lvbmFsIHRlbnNvciBieSBjb2xsYXBzaW5nIHRoZXNlIHR3byBzZXRzIG9mIGF4ZXMgYW5kXG4gICAgICAgIC8vIGNvbmNhdGVuYXRlIHRoZSByZXN1bHRpbmcgbWF0cmljZXMgYWNyb3NzIHRoZSBheGlzIDEsIGZpbmFsbHkgcmVzaGFwaW5nXG4gICAgICAgIC8vIHRoZSByZXN1bHQgdG8gaGF2ZSB0aGUgcHJvcGVyIHNoYXBlLlxuICAgICAgICBjb25zdCBpbnB1dHMyRCA9ICRpbnB1dHMubWFwKHQgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5uZXJTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHQuc2hhcGUuc2xpY2UoYXhpcykpO1xuICAgICAgICAgICAgY29uc3Qgc2hhcGUgPSBbLTEsIGlubmVyU2l6ZV07XG4gICAgICAgICAgICByZXR1cm4gcmVzaGFwZSh7IGlucHV0czogeyB4OiB0IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlIH0gfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBpbnB1dHNWYWxTaGFwZXMgPSBpbnB1dHMyRC5tYXAodCA9PiB7XG4gICAgICAgICAgICByZXR1cm4geyB2YWxzOiBiYWNrZW5kLnJlYWRTeW5jKHQuZGF0YUlkKSwgc2hhcGU6IHQuc2hhcGUgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIENvbmNhdHMgMmQgdGVuc29ycyBhbG9uZyBheGlzPTEuXG4gICAgICAgIG91dFNoYXBlID1cbiAgICAgICAgICAgIGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0U2hhcGUoaW5wdXRzMkQubWFwKHQgPT4gdC5zaGFwZSksIDEgLyogYXhpcyAqLyk7XG4gICAgICAgIGNvbnN0IHNpbXBseUNvbmNhdCA9IGlucHV0czJEWzBdLnNoYXBlWzBdID09PSAxO1xuICAgICAgICBjb25zdCBvdXRWYWxzID0gY29uY2F0SW1wbENQVShpbnB1dHNWYWxTaGFwZXMsIG91dFNoYXBlLCBpbnB1dHNbMF0uZHR5cGUsIHNpbXBseUNvbmNhdCk7XG4gICAgICAgIGNvbnN0IGZpbmFsT3V0U2hhcGUgPSBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dFNoYXBlKCRpbnB1dHMubWFwKHQgPT4gdC5zaGFwZSksIGF4aXMpO1xuICAgICAgICBvdXQuc2hhcGUgPSBmaW5hbE91dFNoYXBlO1xuICAgICAgICBjb25zdCBvdXREYXRhID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpO1xuICAgICAgICBvdXREYXRhLnN0cmluZ0J5dGVzID0gYmFja2VuZF91dGlsLmZyb21TdHJpbmdBcnJheVRvVWludDgob3V0VmFscyk7XG4gICAgICAgIGlucHV0czJELmZvckVhY2godCA9PiBiYWNrZW5kLmRpc3Bvc2VEYXRhKHQuZGF0YUlkKSk7XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuICAgIGNvbnN0IGJhdGNoRGltID0gdXRpbC5zaXplRnJvbVNoYXBlKCRpbnB1dHNbMF0uc2hhcGUuc2xpY2UoMCwgYXhpcykpO1xuICAgIGxldCBzdW1Jbm5lckRpbXMgPSAwO1xuICAgIGNvbnN0IGlubmVyRGltcyA9ICRpbnB1dHMubWFwKGlucHV0ID0+IHtcbiAgICAgICAgY29uc3QgaW5uZXJEaW0gPSB1dGlsLnNpemVGcm9tU2hhcGUoaW5wdXQuc2hhcGUuc2xpY2UoYXhpcykpO1xuICAgICAgICBzdW1Jbm5lckRpbXMgKz0gaW5uZXJEaW07XG4gICAgICAgIHJldHVybiBpbm5lckRpbTtcbiAgICB9KTtcbiAgICBjb25zdCBpblZhbHMgPSAkaW5wdXRzLm1hcChpbnB1dCA9PiBiYWNrZW5kLnR5cGVkQXJyYXlGcm9tSGVhcChpbnB1dCkpO1xuICAgIGNvbnN0IG91dFZhbHMgPSBiYWNrZW5kLnR5cGVkQXJyYXlGcm9tSGVhcChvdXQpO1xuICAgIGZvciAobGV0IGIgPSAwOyBiIDwgYmF0Y2hEaW07IGIrKykge1xuICAgICAgICBsZXQgb3V0T2Zmc2V0ID0gYiAqIHN1bUlubmVyRGltcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpblZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGlubmVyRGltID0gaW5uZXJEaW1zW2ldO1xuICAgICAgICAgICAgY29uc3QgaW5PZmZzZXQgPSBiICogaW5uZXJEaW07XG4gICAgICAgICAgICBjb25zdCB2YWxzID0gaW5WYWxzW2ldLnN1YmFycmF5KGluT2Zmc2V0LCBpbk9mZnNldCArIGlubmVyRGltKTtcbiAgICAgICAgICAgIG91dFZhbHMuc2V0KHZhbHMsIG91dE9mZnNldCk7XG4gICAgICAgICAgICBvdXRPZmZzZXQgKz0gaW5uZXJEaW07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBjb25jYXRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQ29uY2F0LFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAga2VybmVsRnVuYzogY29uY2F0LFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbmNhdC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIENvbnYyRCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5sZXQgd2FzbUNvbnYyZDtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtQ29udjJkID0gYmFja2VuZC53YXNtLmN3cmFwKENvbnYyRCwgbnVsbCAvKiB2b2lkICovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgIF0pO1xufVxuZnVuY3Rpb24gY29udjJkKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYXR0cnMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4LCBmaWx0ZXIgfSA9IGlucHV0cztcbiAgICBjb25zdCB4SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IGZpbHRlcklkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGZpbHRlci5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IHsgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgZGF0YUZvcm1hdCB9ID0gYXR0cnM7XG4gICAgY29uc3QgJGRhdGFGb3JtYXQgPSBiYWNrZW5kX3V0aWwuY29udmVydENvbnYyRERhdGFGb3JtYXQoZGF0YUZvcm1hdCk7XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZUNvbnYyREluZm8oeC5zaGFwZSwgZmlsdGVyLnNoYXBlLCBzdHJpZGVzLCBkaWxhdGlvbnMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCBmYWxzZSwgJGRhdGFGb3JtYXQpO1xuICAgIGNvbnN0IGZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmZpbHRlckhlaWdodDtcbiAgICBjb25zdCBmaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmZpbHRlcldpZHRoO1xuICAgIGNvbnN0IHBhZFRvcCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IHBhZFJpZ2h0ID0gY29udkluZm8ucGFkSW5mby5yaWdodDtcbiAgICBjb25zdCBwYWRCb3R0b20gPSBjb252SW5mby5wYWRJbmZvLmJvdHRvbTtcbiAgICBjb25zdCBwYWRMZWZ0ID0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgIGNvbnN0IGRpbGF0aW9uSGVpZ2h0ID0gY29udkluZm8uZGlsYXRpb25IZWlnaHQ7XG4gICAgY29uc3QgZGlsYXRpb25XaWR0aCA9IGNvbnZJbmZvLmRpbGF0aW9uV2lkdGg7XG4gICAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgY29uc3QgaW5wdXRDaGFubmVscyA9IGNvbnZJbmZvLmluQ2hhbm5lbHM7XG4gICAgY29uc3Qgb3V0cHV0Q2hhbm5lbHMgPSBjb252SW5mby5vdXRDaGFubmVscztcbiAgICBjb25zdCBpc1NhbWVQYWQgPSBjb252SW5mby5wYWRJbmZvLnR5cGUgPT09ICdTQU1FJyA/IDEgOiAwO1xuICAgIGlmIChjb252SW5mby5kYXRhRm9ybWF0ICE9PSAnY2hhbm5lbHNMYXN0Jykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHdhc20gYmFja2VuZCBDb252MkQgZG9lcyBub3Qgc3VwcG9ydCBkYXRhRm9ybWF0OidgICtcbiAgICAgICAgICAgIGAke2NvbnZJbmZvLmRhdGFGb3JtYXR9Jy4gUGxlYXNlIHVzZSAnY2hhbm5lbHNMYXN0Jy5gKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KGNvbnZJbmZvLm91dFNoYXBlLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIHdhc21Db252MmQoeElkLCB4LnNoYXBlWzBdLCB4LnNoYXBlWzFdLCB4LnNoYXBlWzJdLCBmaWx0ZXJJZCwgZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgcGFkVG9wLCBwYWRSaWdodCwgcGFkQm90dG9tLCBwYWRMZWZ0LCBpc1NhbWVQYWQsIGRpbGF0aW9uSGVpZ2h0LCBkaWxhdGlvbldpZHRoLCBzdHJpZGVIZWlnaHQsIHN0cmlkZVdpZHRoLCBpbnB1dENoYW5uZWxzLCBvdXRwdXRDaGFubmVscywgb3V0SWQpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgY29udjJEQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IENvbnYyRCxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogY29udjJkXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29udjJELmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgQ29udjJEQmFja3Byb3BJbnB1dCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5sZXQgd2FzbUNvbnYyREJhY2twcm9wSW5wdXQ7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbUNvbnYyREJhY2twcm9wSW5wdXQgPSBiYWNrZW5kLndhc20uY3dyYXAoQ29udjJEQmFja3Byb3BJbnB1dCwgbnVsbCwgW1xuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgIF0pO1xufVxuZnVuY3Rpb24gY29udjJEQmFja3Byb3BJbnB1dChhcmdzKSB7XG4gICAgY29uc3QgeyBiYWNrZW5kLCBpbnB1dHMsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgZHksIGZpbHRlciB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0LCBkaW1Sb3VuZGluZ01vZGUsIGlucHV0U2hhcGUgfSA9IGF0dHJzO1xuICAgIGNvbnN0IGRpbGF0aW9ucyA9IDE7XG4gICAgY29uc3QgJGRhdGFGb3JtYXQgPSBiYWNrZW5kX3V0aWwuY29udmVydENvbnYyRERhdGFGb3JtYXQoZGF0YUZvcm1hdCk7XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZUNvbnYyREluZm8oaW5wdXRTaGFwZSwgZmlsdGVyLnNoYXBlLCBzdHJpZGVzLCBkaWxhdGlvbnMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCBmYWxzZSAvKiBkZXB0aHdpc2UgKi8sICRkYXRhRm9ybWF0KTtcbiAgICBjb25zdCB7IGJhdGNoU2l6ZSwgZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5DaGFubmVscywgaW5IZWlnaHQsIGluV2lkdGgsIG91dENoYW5uZWxzLCBvdXRIZWlnaHQsIG91dFdpZHRoLCBzdHJpZGVIZWlnaHQsIHN0cmlkZVdpZHRoIH0gPSBjb252SW5mbztcbiAgICBjb25zdCB0b3BQYWQgPSBmaWx0ZXJIZWlnaHQgLSAxIC0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgbGVmdFBhZCA9IGZpbHRlcldpZHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICBjb25zdCBpc0NoYW5uZWxzTGFzdCA9IGNvbnZJbmZvLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnO1xuICAgIGNvbnN0IGR4U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoY29udkluZm8uaW5TaGFwZSk7XG4gICAgY29uc3QgZHlTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhkeS5zaGFwZSk7XG4gICAgY29uc3QgW2ZsdFMwLCBmbHRTMSwgZmx0UzJdID0gdXRpbC5jb21wdXRlU3RyaWRlcyhmaWx0ZXIuc2hhcGUpO1xuICAgIGNvbnN0IHhCYXRjaFN0cmlkZSA9IGR4U3RyaWRlc1swXTtcbiAgICBjb25zdCB4Um93U3RyaWRlID0gaXNDaGFubmVsc0xhc3QgPyBkeFN0cmlkZXNbMV0gOiBkeFN0cmlkZXNbMl07XG4gICAgY29uc3QgeENvbFN0cmlkZSA9IGlzQ2hhbm5lbHNMYXN0ID8gZHhTdHJpZGVzWzJdIDogMTtcbiAgICBjb25zdCB4Q2hhbm5lbFN0cmlkZSA9IGlzQ2hhbm5lbHNMYXN0ID8gMSA6IGR4U3RyaWRlc1sxXTtcbiAgICBjb25zdCB5QmF0Y2hTdHJpZGUgPSBkeVN0cmlkZXNbMF07XG4gICAgY29uc3QgeVJvd1N0cmlkZSA9IGlzQ2hhbm5lbHNMYXN0ID8gZHlTdHJpZGVzWzFdIDogZHlTdHJpZGVzWzJdO1xuICAgIGNvbnN0IHlDb2xTdHJpZGUgPSBpc0NoYW5uZWxzTGFzdCA/IGR5U3RyaWRlc1syXSA6IDE7XG4gICAgY29uc3QgeUNoYW5uZWxTdHJpZGUgPSBpc0NoYW5uZWxzTGFzdCA/IDEgOiBkeVN0cmlkZXNbMV07XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KGNvbnZJbmZvLmluU2hhcGUsICdmbG9hdDMyJyk7XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgZHlJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChkeS5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IGZpbHRlcklkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGZpbHRlci5kYXRhSWQpLmlkO1xuICAgIHdhc21Db252MkRCYWNrcHJvcElucHV0KGR5SWQsIGZpbHRlcklkLCBiYXRjaFNpemUsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGluSGVpZ2h0LCBpbldpZHRoLCBpbkNoYW5uZWxzLCBvdXRIZWlnaHQsIG91dFdpZHRoLCBvdXRDaGFubmVscywgc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aCwgdG9wUGFkLCBsZWZ0UGFkLCBmbHRTMCwgZmx0UzEsIGZsdFMyLCB4QmF0Y2hTdHJpZGUsIHhSb3dTdHJpZGUsIHhDb2xTdHJpZGUsIHhDaGFubmVsU3RyaWRlLCB5QmF0Y2hTdHJpZGUsIHlSb3dTdHJpZGUsIHlDb2xTdHJpZGUsIHlDaGFubmVsU3RyaWRlLCBvdXRJZCk7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBjb252MkRCYWNrcHJvcElucHV0Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IENvbnYyREJhY2twcm9wSW5wdXQsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IGNvbnYyREJhY2twcm9wSW5wdXRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db252MkRCYWNrcHJvcElucHV0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IENvcyB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVVbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vdW5hcnlfa2VybmVsJztcbmV4cG9ydCBjb25zdCBjb3NDb25maWcgPSBjcmVhdGVVbmFyeUtlcm5lbENvbmZpZyhDb3MpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29zLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IENvc2ggfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlVW5hcnlLZXJuZWxDb25maWcgfSBmcm9tICcuL3VuYXJ5X2tlcm5lbCc7XG5leHBvcnQgY29uc3QgY29zaENvbmZpZyA9IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnKENvc2gpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29zaC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBDcm9wQW5kUmVzaXplIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNhc3QgfSBmcm9tICcuL0Nhc3QnO1xuLy8gTXVzdCBtYXRjaCBlbnVtIGluIENyb3BBbmRSZXNpemUuY2NcbnZhciBJbnRlcnBvbGF0aW9uTWV0aG9kO1xuKGZ1bmN0aW9uIChJbnRlcnBvbGF0aW9uTWV0aG9kKSB7XG4gICAgSW50ZXJwb2xhdGlvbk1ldGhvZFtJbnRlcnBvbGF0aW9uTWV0aG9kW1wiYmlsaW5lYXJcIl0gPSAwXSA9IFwiYmlsaW5lYXJcIjtcbiAgICBJbnRlcnBvbGF0aW9uTWV0aG9kW0ludGVycG9sYXRpb25NZXRob2RbXCJuZWFyZXN0XCJdID0gMV0gPSBcIm5lYXJlc3RcIjtcbn0pKEludGVycG9sYXRpb25NZXRob2QgfHwgKEludGVycG9sYXRpb25NZXRob2QgPSB7fSkpO1xubGV0IHdhc21Dcm9wQW5kUmVzaXplO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21Dcm9wQW5kUmVzaXplID0gYmFja2VuZC53YXNtLmN3cmFwKENyb3BBbmRSZXNpemUsIG51bGwgLyp2b2lkKi8sIFtcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyAvLyBvdXQgaWRcbiAgICBdKTtcbn1cbmZ1bmN0aW9uIGNyb3BBbmRSZXNpemUoYXJncykge1xuICAgIGNvbnN0IHsgYmFja2VuZCwgaW5wdXRzLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IG1ldGhvZCwgZXh0cmFwb2xhdGlvblZhbHVlLCBjcm9wU2l6ZSB9ID0gYXR0cnM7XG4gICAgY29uc3QgeyBpbWFnZSwgYm94ZXMsIGJveEluZCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IG51bUJveGVzID0gYm94ZXMuc2hhcGVbMF07XG4gICAgY29uc3QgW2Nyb3BIZWlnaHQsIGNyb3BXaWR0aF0gPSBjcm9wU2l6ZTtcbiAgICBjb25zdCBvdXRTaGFwZSA9IFtudW1Cb3hlcywgY3JvcEhlaWdodCwgY3JvcFdpZHRoLCBpbWFnZS5zaGFwZVszXV07XG4gICAgbGV0IGltYWdlc0RhdGEgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoaW1hZ2UuZGF0YUlkKTtcbiAgICBsZXQgY2FzdGVkRGF0YTtcbiAgICBpZiAoaW1hZ2UuZHR5cGUgIT09ICdmbG9hdDMyJykge1xuICAgICAgICBjYXN0ZWREYXRhID0gY2FzdCh7IGJhY2tlbmQsIGlucHV0czogeyB4OiBpbWFnZSB9LCBhdHRyczogeyBkdHlwZTogJ2Zsb2F0MzInIH0gfSk7XG4gICAgICAgIGltYWdlc0RhdGEgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoY2FzdGVkRGF0YS5kYXRhSWQpO1xuICAgIH1cbiAgICBjb25zdCBpbWFnZXNJZCA9IGltYWdlc0RhdGEuaWQ7XG4gICAgY29uc3QgYm94ZXNJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChib3hlcy5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IGJveEluZElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGJveEluZC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChvdXRTaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBpbWFnZXNTaGFwZUJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobmV3IEludDMyQXJyYXkoaW1hZ2Uuc2hhcGUpLmJ1ZmZlcik7XG4gICAgd2FzbUNyb3BBbmRSZXNpemUoaW1hZ2VzSWQsIGJveGVzSWQsIGJveEluZElkLCBudW1Cb3hlcywgaW1hZ2VzU2hhcGVCeXRlcywgY3JvcEhlaWdodCwgY3JvcFdpZHRoLCBJbnRlcnBvbGF0aW9uTWV0aG9kW21ldGhvZF0sIGV4dHJhcG9sYXRpb25WYWx1ZSwgb3V0SWQpO1xuICAgIGlmIChjYXN0ZWREYXRhICE9IG51bGwpIHtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlRGF0YShjYXN0ZWREYXRhLmRhdGFJZCk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgY3JvcEFuZFJlc2l6ZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBDcm9wQW5kUmVzaXplLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiBjcm9wQW5kUmVzaXplXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q3JvcEFuZFJlc2l6ZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIEN1bXN1bSwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBDcHBEVHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgdHJhbnNwb3NlIH0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xubGV0IHdhc21DdW1zdW07XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbUN1bXN1bSA9IGJhY2tlbmQud2FzbS5jd3JhcChDdW1zdW0sIG51bGwgLyogdm9pZCAqLywgW1xuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInIC8vIGR0eXBlXG4gICAgXSk7XG59XG5leHBvcnQgZnVuY3Rpb24gY3Vtc3VtKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBheGlzLCBleGNsdXNpdmUsIHJldmVyc2UgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG4gICAgdXRpbC5hc3NlcnQoeC5kdHlwZSA9PT0gJ2Zsb2F0MzInIHx8IHguZHR5cGUgPT09ICdpbnQzMicsICgpID0+IGBjdW1zdW0gZG9lcyBub3Qgc3VwcG9ydCAke3guZHR5cGV9IHRlbnNvcnMgaW4gdGhlIFdBU00gYmFja2VuZGApO1xuICAgIC8vIHBlcm11dGUgcmVxdWlyZWQgYXhpcyB0byBpbm5lciBtb3N0IGF4aXNcbiAgICBjb25zdCBwZXJtdXRhdGlvbiA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oW2F4aXNdLCB4UmFuayk7XG4gICAgbGV0IHBlcm11dGVkWCA9IHg7XG4gICAgaWYgKHBlcm11dGF0aW9uICE9PSBudWxsKSB7XG4gICAgICAgIHBlcm11dGVkWCA9IHRyYW5zcG9zZSh7IGlucHV0czogeyB4IH0sIGF0dHJzOiB7IHBlcm06IHBlcm11dGF0aW9uIH0sIGJhY2tlbmQgfSk7XG4gICAgfVxuICAgIGNvbnN0IHBlcm11dGVkQXhpcyA9IGJhY2tlbmRfdXRpbC5nZXRJbm5lck1vc3RBeGVzKDEsIHhSYW5rKVswXTtcbiAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoJ2N1bXN1bScsIFtwZXJtdXRlZEF4aXNdLCB4UmFuayk7XG4gICAgY29uc3QgcGVybXV0ZWRPdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQocGVybXV0ZWRYLnNoYXBlLCBwZXJtdXRlZFguZHR5cGUpO1xuICAgIGNvbnN0IGZpbmFsRGltID0gcGVybXV0ZWRYLnNoYXBlW3Blcm11dGVkQXhpc107XG4gICAgY29uc3QgcGVybXV0ZWRYSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQocGVybXV0ZWRYLmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgcGVybXV0ZWRPdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChwZXJtdXRlZE91dC5kYXRhSWQpLmlkO1xuICAgIHdhc21DdW1zdW0ocGVybXV0ZWRYSWQsIGV4Y2x1c2l2ZSA/IDEgOiAwLCByZXZlcnNlID8gMSA6IDAsIGZpbmFsRGltLCBwZXJtdXRlZE91dElkLCBDcHBEVHlwZVt4LmR0eXBlXSk7XG4gICAgLy8gdHJhbnNwb3NlIGRhdGEgYmFjayBpZiBwZXJtdXRlZFxuICAgIGxldCBvdXQgPSBwZXJtdXRlZE91dDtcbiAgICBpZiAocGVybXV0YXRpb24gIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgdW5kb1Blcm11dGF0aW9uID0gYmFja2VuZF91dGlsLmdldFVuZG9BeGVzUGVybXV0YXRpb24ocGVybXV0YXRpb24pO1xuICAgICAgICBvdXQgPSB0cmFuc3Bvc2UoeyBpbnB1dHM6IHsgeDogcGVybXV0ZWRPdXQgfSwgYXR0cnM6IHsgcGVybTogdW5kb1Blcm11dGF0aW9uIH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZURhdGEocGVybXV0ZWRYLmRhdGFJZCk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZURhdGEocGVybXV0ZWRPdXQuZGF0YUlkKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBjdW1zdW1Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQ3Vtc3VtLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiBjdW1zdW1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DdW1zdW0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRGVwdGhUb1NwYWNlLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmxldCB3YXNtRGVwdGhUb1NwYWNlO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21EZXB0aFRvU3BhY2UgPSBiYWNrZW5kLndhc20uY3dyYXAoRGVwdGhUb1NwYWNlLCBudWxsIC8qdm9pZCovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgXSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVwdGhUb1NwYWNlKGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGlucHV0cywgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBibG9ja1NpemUsIGRhdGFGb3JtYXQgfSA9IGF0dHJzO1xuICAgIHV0aWwuYXNzZXJ0KGJsb2NrU2l6ZSA+IDEsICgpID0+IGBibG9ja1NpemUgc2hvdWxkIGJlID4gMSBmb3IgZGVwdGhUb1NwYWNlLCBidXQgd2FzOiAke2Jsb2NrU2l6ZX1gKTtcbiAgICBjb25zdCBiYXRjaFNpemUgPSB4LnNoYXBlWzBdO1xuICAgIGNvbnN0IGlucHV0SGVpZ2h0ID0gKGRhdGFGb3JtYXQgPT09ICdOSFdDJykgPyB4LnNoYXBlWzFdIDogeC5zaGFwZVsyXTtcbiAgICBjb25zdCBpbnB1dFdpZHRoID0gKGRhdGFGb3JtYXQgPT09ICdOSFdDJykgPyB4LnNoYXBlWzJdIDogeC5zaGFwZVszXTtcbiAgICBjb25zdCBpbnB1dERlcHRoID0gKGRhdGFGb3JtYXQgPT09ICdOSFdDJykgPyB4LnNoYXBlWzNdIDogeC5zaGFwZVsxXTtcbiAgICBjb25zdCBvdXRwdXRIZWlnaHQgPSBpbnB1dEhlaWdodCAqIGJsb2NrU2l6ZTtcbiAgICBjb25zdCBvdXRwdXRXaWR0aCA9IGlucHV0V2lkdGggKiBibG9ja1NpemU7XG4gICAgY29uc3Qgb3V0cHV0RGVwdGggPSBpbnB1dERlcHRoIC8gKGJsb2NrU2l6ZSAqIGJsb2NrU2l6ZSk7XG4gICAgY29uc3Qgb3V0cHV0U2hhcGUgPSAoZGF0YUZvcm1hdCA9PT0gJ05IV0MnKSA/XG4gICAgICAgIFtiYXRjaFNpemUsIG91dHB1dEhlaWdodCwgb3V0cHV0V2lkdGgsIG91dHB1dERlcHRoXSA6XG4gICAgICAgIFtiYXRjaFNpemUsIG91dHB1dERlcHRoLCBvdXRwdXRIZWlnaHQsIG91dHB1dFdpZHRoXTtcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQob3V0cHV0U2hhcGUsICdmbG9hdDMyJyk7XG4gICAgY29uc3QgeERhdGEgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeC5kYXRhSWQpO1xuICAgIGNvbnN0IHhJZCA9IHhEYXRhLmlkO1xuICAgIGNvbnN0IHhTdHJpZGVzQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheSh1dGlsLmNvbXB1dGVTdHJpZGVzKHguc2hhcGUpKS5idWZmZXIpO1xuICAgIGNvbnN0IG91dHB1dFNoYXBlQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheShvdXRwdXRTaGFwZSkuYnVmZmVyKTtcbiAgICBjb25zdCBvdXRTdHJpZGVzQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheSh1dGlsLmNvbXB1dGVTdHJpZGVzKG91dHB1dFNoYXBlKSkuYnVmZmVyKTtcbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBjaGFubmVsc0xhc3QgPSBkYXRhRm9ybWF0ID09PSAnTkhXQycgPyAxIDogMDtcbiAgICB3YXNtRGVwdGhUb1NwYWNlKHhJZCwgYmxvY2tTaXplLCBjaGFubmVsc0xhc3QsIHhTdHJpZGVzQnl0ZXMsIHguc2hhcGUubGVuZ3RoIC0gMSwgb3V0cHV0U2hhcGVCeXRlcywgb3V0U3RyaWRlc0J5dGVzLCBvdXRwdXRTaGFwZS5sZW5ndGgsIG91dElkKTtcbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IGRlcHRoVG9TcGFjZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBEZXB0aFRvU3BhY2UsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IGRlcHRoVG9TcGFjZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURlcHRoVG9TcGFjZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIERlcHRod2lzZUNvbnYyZE5hdGl2ZSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5sZXQgd2FzbURlcHRod2lzZUNvbnYyZDtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtRGVwdGh3aXNlQ29udjJkID1cbiAgICAgICAgYmFja2VuZC53YXNtLmN3cmFwKERlcHRod2lzZUNvbnYyZE5hdGl2ZSwgbnVsbCAvKiB2b2lkICovLCBbXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgXSk7XG59XG5mdW5jdGlvbiBkZXB0aHdpc2VDb252MmQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBhdHRycywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IHgsIGZpbHRlciB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHhJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh4LmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgZmlsdGVySWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoZmlsdGVyLmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgeyBzdHJpZGVzLCBkaWxhdGlvbnMsIHBhZCwgZGltUm91bmRpbmdNb2RlIH0gPSBhdHRycztcbiAgICBjb25zdCAkZGlsYXRpb25zID0gZGlsYXRpb25zID09IG51bGwgPyBbMSwgMV0gOiBkaWxhdGlvbnM7XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZUNvbnYyREluZm8oeC5zaGFwZSwgZmlsdGVyLnNoYXBlLCBzdHJpZGVzLCAkZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgdHJ1ZSAvKiBkZXB0aHdpc2UgKi8pO1xuICAgIGNvbnN0IGZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmZpbHRlckhlaWdodDtcbiAgICBjb25zdCBmaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmZpbHRlcldpZHRoO1xuICAgIGNvbnN0IHBhZFRvcCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IHBhZFJpZ2h0ID0gY29udkluZm8ucGFkSW5mby5yaWdodDtcbiAgICBjb25zdCBwYWRCb3R0b20gPSBjb252SW5mby5wYWRJbmZvLmJvdHRvbTtcbiAgICBjb25zdCBwYWRMZWZ0ID0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgIGNvbnN0IGRpbGF0aW9uSGVpZ2h0ID0gY29udkluZm8uZGlsYXRpb25IZWlnaHQ7XG4gICAgY29uc3QgZGlsYXRpb25XaWR0aCA9IGNvbnZJbmZvLmRpbGF0aW9uV2lkdGg7XG4gICAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgY29uc3QgaW5wdXRDaGFubmVscyA9IGNvbnZJbmZvLmluQ2hhbm5lbHM7XG4gICAgY29uc3Qgb3V0cHV0Q2hhbm5lbHMgPSBjb252SW5mby5vdXRDaGFubmVscztcbiAgICBjb25zdCBpc1NhbWVQYWQgPSBjb252SW5mby5wYWRJbmZvLnR5cGUgPT09ICdTQU1FJyA/IDEgOiAwO1xuICAgIGlmIChjb252SW5mby5kYXRhRm9ybWF0ICE9PSAnY2hhbm5lbHNMYXN0Jykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHdhc20gYmFja2VuZCBEZXB0aHdpc2VDb252MmROYXRpdmUgZG9lcyBub3Qgc3VwcG9ydCBkYXRhRm9ybWF0OidgICtcbiAgICAgICAgICAgIGAke2NvbnZJbmZvLmRhdGFGb3JtYXR9Jy4gUGxlYXNlIHVzZSAnY2hhbm5lbHNMYXN0Jy5gKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KGNvbnZJbmZvLm91dFNoYXBlLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIHdhc21EZXB0aHdpc2VDb252MmQoeElkLCB4LnNoYXBlWzBdLCB4LnNoYXBlWzFdLCB4LnNoYXBlWzJdLCBmaWx0ZXJJZCwgZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgcGFkVG9wLCBwYWRSaWdodCwgcGFkQm90dG9tLCBwYWRMZWZ0LCBpc1NhbWVQYWQsIGRpbGF0aW9uSGVpZ2h0LCBkaWxhdGlvbldpZHRoLCBzdHJpZGVIZWlnaHQsIHN0cmlkZVdpZHRoLCBpbnB1dENoYW5uZWxzLCBvdXRwdXRDaGFubmVscywgb3V0SWQpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgZGVwdGh3aXNlQ29udjJkTmF0aXZlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IERlcHRod2lzZUNvbnYyZE5hdGl2ZSxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogZGVwdGh3aXNlQ29udjJkXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGVwdGh3aXNlQ29udjJkTmF0aXZlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVxdWFsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vYmluYXJ5X2tlcm5lbCc7XG5jb25zdCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QgPSBmYWxzZTtcbmV4cG9ydCBjb25zdCBlcXVhbENvbmZpZyA9IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyhFcXVhbCwgc3VwcG9ydHNGdWxsQnJvYWRjYXN0LCAnYm9vbCcpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RXF1YWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRXhwIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi91bmFyeV9rZXJuZWwnO1xuZXhwb3J0IGNvbnN0IGV4cENvbmZpZyA9IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnKEV4cCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FeHAuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRXhwYW5kRGltcywgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmV4cG9ydCBmdW5jdGlvbiBleHBhbmREaW1zKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYXR0cnMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBpbnB1dCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgZGltIH0gPSBhdHRycztcbiAgICBjb25zdCBpbnB1dFJhbmsgPSBpbnB1dC5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgbmV3U2hhcGUgPSBpbnB1dC5zaGFwZS5zbGljZSgpO1xuICAgIGxldCAkZGltID0gZGltO1xuICAgIGlmIChkaW0gPCAwKSB7XG4gICAgICAgIC8vIE5lZ2F0aXZlIHZhbHVlIGlzIGNvdW50ZWQgZnJvbSB0aGUgdGFpbCBvZiByYW5rLlxuICAgICAgICB1dGlsLmFzc2VydCgtKGlucHV0UmFuayArIDEpIDw9IGRpbSwgKCkgPT4gYEF4aXMgbXVzdCBiZSBpbiB0aGUgaW50ZXJ2YWwgWyR7LShpbnB1dFJhbmsgKyAxKX0sICR7aW5wdXRSYW5rfV1gKTtcbiAgICAgICAgJGRpbSA9IGlucHV0UmFuayArIGRpbSArIDE7XG4gICAgfVxuICAgIG5ld1NoYXBlLnNwbGljZSgkZGltLCAwLCAxKTtcbiAgICByZXR1cm4gcmVzaGFwZSh7IGlucHV0czogeyB4OiBpbnB1dCB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogbmV3U2hhcGUgfSB9KTtcbn1cbmV4cG9ydCBjb25zdCBleHBhbmREaW1zQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEV4cGFuZERpbXMsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBrZXJuZWxGdW5jOiBleHBhbmREaW1zLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUV4cGFuZERpbXMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRmlsbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5mdW5jdGlvbiBmaWxsKGFyZ3MpIHtcbiAgICBjb25zdCB7IGF0dHJzOiB7IHNoYXBlLCB2YWx1ZSwgZHR5cGUgfSwgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoc2hhcGUsIGR0eXBlKTtcbiAgICBjb25zdCBvdXRWYWxzID0gYmFja2VuZC50eXBlZEFycmF5RnJvbUhlYXAob3V0KTtcbiAgICBvdXRWYWxzLmZpbGwodmFsdWUpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgZmlsbENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBGaWxsLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAga2VybmVsRnVuYzogZmlsbCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GaWxsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEZsaXBMZWZ0UmlnaHQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xubGV0IHdhc21GbGlwTGVmdFJpZ2h0O1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21GbGlwTGVmdFJpZ2h0ID0gYmFja2VuZC53YXNtLmN3cmFwKEZsaXBMZWZ0UmlnaHQsIG51bGwgLyogdm9pZCAqLywgW1xuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgIF0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZsaXBMZWZ0UmlnaHQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW1hZ2UgfSA9IGlucHV0cztcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoaW1hZ2Uuc2hhcGUsIGltYWdlLmR0eXBlKTtcbiAgICBjb25zdCBpbWFnZUlkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGltYWdlLmRhdGFJZCkuaWQ7XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgW2JhdGNoLCBpbWFnZUhlaWdodCwgaW1hZ2VXaWR0aCwgbnVtQ2hhbm5lbHNdID0gaW1hZ2Uuc2hhcGU7XG4gICAgd2FzbUZsaXBMZWZ0UmlnaHQoaW1hZ2VJZCwgYmF0Y2gsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBudW1DaGFubmVscywgb3V0SWQpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgZmxpcExlZnRSaWdodENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBGbGlwTGVmdFJpZ2h0LFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAga2VybmVsRnVuYzogZmxpcExlZnRSaWdodCxcbiAgICBzZXR1cEZ1bmM6IHNldHVwXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RmxpcExlZnRSaWdodC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBGbG9vciB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVVbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vdW5hcnlfa2VybmVsJztcbmV4cG9ydCBjb25zdCBmbG9vckNvbmZpZyA9IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnKEZsb29yKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZsb29yLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEZsb29yRGl2IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vYmluYXJ5X2tlcm5lbCc7XG5jb25zdCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QgPSBmYWxzZTtcbmV4cG9ydCBjb25zdCBmbG9vckRpdkNvbmZpZyA9IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyhGbG9vckRpdiwgc3VwcG9ydHNGdWxsQnJvYWRjYXN0KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZsb29yRGl2LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEZ1c2VkQmF0Y2hOb3JtLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmxldCB3YXNtQmF0Y2hOb3JtO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21CYXRjaE5vcm0gPSBiYWNrZW5kLndhc20uY3dyYXAoRnVzZWRCYXRjaE5vcm0sIG51bGwgLyogdm9pZCAqLywgWydudW1iZXInLCAnbnVtYmVyJywgJ251bWJlcicsICdudW1iZXInLCAnbnVtYmVyJywgJ251bWJlcicsICdudW1iZXInXSk7XG59XG5mdW5jdGlvbiBmdXNlZEJhdGNoTm9ybShhcmdzKSB7XG4gICAgY29uc3QgeyBiYWNrZW5kLCBpbnB1dHMsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgdmFyaWFuY2VFcHNpbG9uIH0gPSBhdHRycztcbiAgICBjb25zdCB7IHgsIG1lYW4sIHZhcmlhbmNlLCBvZmZzZXQsIHNjYWxlIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHguZGF0YUlkKS5pZDtcbiAgICBjb25zdCBtZWFuSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQobWVhbi5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IHZhcmlhbmNlSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQodmFyaWFuY2UuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBvZmZzZXRJZCA9IG9mZnNldCAhPSBudWxsID8gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG9mZnNldC5kYXRhSWQpLmlkIDogMDtcbiAgICBjb25zdCBzY2FsZUlkID0gc2NhbGUgIT0gbnVsbCA/IGJhY2tlbmQuZGF0YUlkTWFwLmdldChzY2FsZS5kYXRhSWQpLmlkIDogMDtcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoeC5zaGFwZSwgeC5kdHlwZSk7XG4gICAgLy8gU2hvcnQtY2lyY3VpdCB6ZXJvLXNpemVkIHRlbnNvcnMuXG4gICAgaWYgKHV0aWwuc2l6ZUZyb21TaGFwZSh4LnNoYXBlKSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICB3YXNtQmF0Y2hOb3JtKHhJZCwgbWVhbklkLCB2YXJpYW5jZUlkLCBvZmZzZXRJZCwgc2NhbGVJZCwgdmFyaWFuY2VFcHNpbG9uLCBvdXRJZCk7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBmdXNlZEJhdGNoTm9ybUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBGdXNlZEJhdGNoTm9ybSxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogZnVzZWRCYXRjaE5vcm1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GdXNlZEJhdGNoTm9ybS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIEZ1c2VkQ29udjJEIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IEZ1c2FibGVBY3RpdmF0aW9uIH0gZnJvbSAnLi90eXBlcyc7XG5sZXQgd2FzbUZ1c2VkQ29udjJkO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21GdXNlZENvbnYyZCA9IGJhY2tlbmQud2FzbS5jd3JhcChGdXNlZENvbnYyRCwgbnVsbCAvKiB2b2lkICovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICBdKTtcbn1cbmZ1bmN0aW9uIGZ1c2VkQ29udjJkKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYXR0cnMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4LCBmaWx0ZXIsIGJpYXMsIHByZWx1QWN0aXZhdGlvbldlaWdodHMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHN0cmlkZXMsIHBhZCwgZGlsYXRpb25zLCBkYXRhRm9ybWF0LCBkaW1Sb3VuZGluZ01vZGUsIGFjdGl2YXRpb24sIGxlYWt5cmVsdUFscGhhIH0gPSBhdHRycztcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyh4LnNoYXBlLCBmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpO1xuICAgIGNvbnN0IGZ1c2VkQWN0aXZhdGlvbiA9IEZ1c2FibGVBY3RpdmF0aW9uW2FjdGl2YXRpb25dO1xuICAgIGlmIChmdXNlZEFjdGl2YXRpb24gPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7YWN0aXZhdGlvbn0gYWN0aXZhdGlvbiBub3QgeWV0IHN1cHBvcnRlZCBmb3IgRnVzZWRDb252MkQgYCArXG4gICAgICAgICAgICBgaW4gdGhlIHdhc20gYmFja2VuZC5gKTtcbiAgICB9XG4gICAgY29uc3QgeElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHguZGF0YUlkKS5pZDtcbiAgICBjb25zdCBmaWx0ZXJJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChmaWx0ZXIuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBvdXRwdXRDaGFubmVscyA9IGNvbnZJbmZvLm91dENoYW5uZWxzO1xuICAgIGxldCBiaWFzSWQgPSAwO1xuICAgIGlmIChiaWFzICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgYmlhc0RhdGEgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoYmlhcy5kYXRhSWQpO1xuICAgICAgICBpZiAoYmlhc0RhdGEuc2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZ1c2VkQ29udjJEIG9ubHkgc3VwcG9ydHMgcmFuay0xIGJpYXMgYnV0IGdvdCBgICtcbiAgICAgICAgICAgICAgICBgcmFuayAke2JpYXNEYXRhLnNoYXBlLmxlbmd0aH0uYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJpYXNEYXRhLnNoYXBlWzBdICE9PSBvdXRwdXRDaGFubmVscykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGdXNlZENvbnYyRCBiaWFzIHNoYXBlICgke2JpYXNEYXRhLnNoYXBlfSkgZG9lcyBub3QgYCArXG4gICAgICAgICAgICAgICAgYG1hdGNoIHRoZSBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzICgke291dHB1dENoYW5uZWxzfSlgKTtcbiAgICAgICAgfVxuICAgICAgICBiaWFzSWQgPSBiaWFzRGF0YS5pZDtcbiAgICB9XG4gICAgY29uc3QgZmlsdGVySGVpZ2h0ID0gY29udkluZm8uZmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG4gICAgY29uc3QgcGFkVG9wID0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgcGFkUmlnaHQgPSBjb252SW5mby5wYWRJbmZvLnJpZ2h0O1xuICAgIGNvbnN0IHBhZEJvdHRvbSA9IGNvbnZJbmZvLnBhZEluZm8uYm90dG9tO1xuICAgIGNvbnN0IHBhZExlZnQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgY29uc3QgZGlsYXRpb25IZWlnaHQgPSBjb252SW5mby5kaWxhdGlvbkhlaWdodDtcbiAgICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBpbnB1dENoYW5uZWxzID0gY29udkluZm8uaW5DaGFubmVscztcbiAgICBjb25zdCBpc1NhbWVQYWQgPSBjb252SW5mby5wYWRJbmZvLnR5cGUgPT09ICdTQU1FJyA/IDEgOiAwO1xuICAgIGNvbnN0IGJhdGNoU2l6ZSA9IGNvbnZJbmZvLmJhdGNoU2l6ZTtcbiAgICBjb25zdCBpbkhlaWdodCA9IGNvbnZJbmZvLmluSGVpZ2h0O1xuICAgIGNvbnN0IGluV2lkdGggPSBjb252SW5mby5pbldpZHRoO1xuICAgIGlmIChkYXRhRm9ybWF0ICE9PSAnTkhXQycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB3YXNtIGJhY2tlbmQgRnVzZWRDb252MkQgZG9lcyBub3Qgc3VwcG9ydCBkYXRhRm9ybWF0OidgICtcbiAgICAgICAgICAgIGAke2RhdGFGb3JtYXR9Jy4gUGxlYXNlIHVzZSAnTkhXQycuYCk7XG4gICAgfVxuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChjb252SW5mby5vdXRTaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBwcmVsdUFjdGl2YXRpb25XZWlnaHRzSWQgPSBwcmVsdUFjdGl2YXRpb25XZWlnaHRzID09IG51bGwgP1xuICAgICAgICAwIDpcbiAgICAgICAgYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHByZWx1QWN0aXZhdGlvbldlaWdodHMuZGF0YUlkKS5pZDtcbiAgICB3YXNtRnVzZWRDb252MmQoeElkLCBiYXRjaFNpemUsIGluSGVpZ2h0LCBpbldpZHRoLCBmaWx0ZXJJZCwgZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgYmlhc0lkLCBwYWRUb3AsIHBhZFJpZ2h0LCBwYWRCb3R0b20sIHBhZExlZnQsIGlzU2FtZVBhZCwgZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGgsIHN0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGgsIGlucHV0Q2hhbm5lbHMsIG91dHB1dENoYW5uZWxzLCBmdXNlZEFjdGl2YXRpb24sIHByZWx1QWN0aXZhdGlvbldlaWdodHNJZCwgbGVha3lyZWx1QWxwaGEgfHwgMCwgb3V0SWQpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgZnVzZWRDb252MkRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRnVzZWRDb252MkQsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IGZ1c2VkQ29udjJkXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RnVzZWRDb252MkQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBGdXNlZERlcHRod2lzZUNvbnYyRCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBGdXNhYmxlQWN0aXZhdGlvbiB9IGZyb20gJy4vdHlwZXMnO1xubGV0IHdhc21GdXNlZERlcHRod2lzZUNvbnYyZDtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtRnVzZWREZXB0aHdpc2VDb252MmQgPVxuICAgICAgICBiYWNrZW5kLndhc20uY3dyYXAoRnVzZWREZXB0aHdpc2VDb252MkQsIG51bGwgLyogdm9pZCAqLywgW1xuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgXSk7XG59XG5mdW5jdGlvbiBmdXNlZERlcHRod2lzZUNvbnYyZChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGF0dHJzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCwgZmlsdGVyLCBiaWFzLCBwcmVsdUFjdGl2YXRpb25XZWlnaHRzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBzdHJpZGVzLCBwYWQsIGRpbGF0aW9ucywgZGF0YUZvcm1hdCwgZGltUm91bmRpbmdNb2RlLCBhY3RpdmF0aW9uLCBsZWFreXJlbHVBbHBoYSB9ID0gYXR0cnM7XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZUNvbnYyREluZm8oeC5zaGFwZSwgZmlsdGVyLnNoYXBlLCBzdHJpZGVzLCBkaWxhdGlvbnMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCB0cnVlIC8qIGRlcHRod2lzZSAqLyk7XG4gICAgY29uc3QgZnVzZWRBY3RpdmF0aW9uID0gRnVzYWJsZUFjdGl2YXRpb25bYWN0aXZhdGlvbl07XG4gICAgaWYgKGZ1c2VkQWN0aXZhdGlvbiA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHthY3RpdmF0aW9ufSBhY3RpdmF0aW9uIG5vdCB5ZXQgc3VwcG9ydGVkIGZvciBGdXNlZERlcHRod2lzZUNvbnYyRCBgICtcbiAgICAgICAgICAgIGBpbiB0aGUgd2FzbSBiYWNrZW5kLmApO1xuICAgIH1cbiAgICBjb25zdCB4SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IGZpbHRlcklkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGZpbHRlci5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IG91dHB1dENoYW5uZWxzID0gY29udkluZm8ub3V0Q2hhbm5lbHM7XG4gICAgbGV0IGJpYXNJZCA9IDA7XG4gICAgaWYgKGJpYXMgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBiaWFzRGF0YSA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChiaWFzLmRhdGFJZCk7XG4gICAgICAgIGlmIChiaWFzRGF0YS5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRnVzZWREZXB0aHdpc2VDb252MkQgb25seSBzdXBwb3J0cyByYW5rLTEgYmlhcyBidXQgZ290IGAgK1xuICAgICAgICAgICAgICAgIGByYW5rICR7Ymlhc0RhdGEuc2hhcGUubGVuZ3RofS5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYmlhc0RhdGEuc2hhcGVbMF0gIT09IG91dHB1dENoYW5uZWxzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZ1c2VkRGVwdGh3aXNlQ29udjJEIGJpYXMgc2hhcGUgKCR7Ymlhc0RhdGEuc2hhcGV9KSBkb2VzIG5vdCBgICtcbiAgICAgICAgICAgICAgICBgbWF0Y2ggdGhlIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMgKCR7b3V0cHV0Q2hhbm5lbHN9KWApO1xuICAgICAgICB9XG4gICAgICAgIGJpYXNJZCA9IGJpYXNEYXRhLmlkO1xuICAgIH1cbiAgICBjb25zdCBmaWx0ZXJIZWlnaHQgPSBjb252SW5mby5maWx0ZXJIZWlnaHQ7XG4gICAgY29uc3QgZmlsdGVyV2lkdGggPSBjb252SW5mby5maWx0ZXJXaWR0aDtcbiAgICBjb25zdCBwYWRUb3AgPSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICBjb25zdCBwYWRSaWdodCA9IGNvbnZJbmZvLnBhZEluZm8ucmlnaHQ7XG4gICAgY29uc3QgcGFkQm90dG9tID0gY29udkluZm8ucGFkSW5mby5ib3R0b207XG4gICAgY29uc3QgcGFkTGVmdCA9IGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICAgIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICAgIGNvbnN0IGlucHV0Q2hhbm5lbHMgPSBjb252SW5mby5pbkNoYW5uZWxzO1xuICAgIGNvbnN0IGlzU2FtZVBhZCA9IGNvbnZJbmZvLnBhZEluZm8udHlwZSA9PT0gJ1NBTUUnID8gMSA6IDA7XG4gICAgY29uc3QgYmF0Y2hTaXplID0gY29udkluZm8uYmF0Y2hTaXplO1xuICAgIGNvbnN0IGluSGVpZ2h0ID0gY29udkluZm8uaW5IZWlnaHQ7XG4gICAgY29uc3QgaW5XaWR0aCA9IGNvbnZJbmZvLmluV2lkdGg7XG4gICAgaWYgKGRhdGFGb3JtYXQgIT09ICdOSFdDJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHdhc20gYmFja2VuZCBGdXNlZERlcHRod2lzZUNvbnYyRCBkb2VzIG5vdCBzdXBwb3J0IGRhdGFGb3JtYXQ6J2AgK1xuICAgICAgICAgICAgYCR7ZGF0YUZvcm1hdH0nLiBQbGVhc2UgdXNlICdOSFdDJy5gKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KGNvbnZJbmZvLm91dFNoYXBlLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IHByZWx1QWN0aXZhdGlvbldlaWdodHNJZCA9IHByZWx1QWN0aXZhdGlvbldlaWdodHMgPT0gbnVsbCA/XG4gICAgICAgIDAgOlxuICAgICAgICBiYWNrZW5kLmRhdGFJZE1hcC5nZXQocHJlbHVBY3RpdmF0aW9uV2VpZ2h0cy5kYXRhSWQpLmlkO1xuICAgIHdhc21GdXNlZERlcHRod2lzZUNvbnYyZCh4SWQsIGJhdGNoU2l6ZSwgaW5IZWlnaHQsIGluV2lkdGgsIGZpbHRlcklkLCBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBiaWFzSWQsIHBhZFRvcCwgcGFkUmlnaHQsIHBhZEJvdHRvbSwgcGFkTGVmdCwgaXNTYW1lUGFkLCBkaWxhdGlvbkhlaWdodCwgZGlsYXRpb25XaWR0aCwgc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aCwgaW5wdXRDaGFubmVscywgb3V0cHV0Q2hhbm5lbHMsIGZ1c2VkQWN0aXZhdGlvbiwgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0c0lkLCBsZWFreXJlbHVBbHBoYSB8fCAwLCBvdXRJZCk7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBmdXNlZERlcHRod2lzZUNvbnYyRENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBGdXNlZERlcHRod2lzZUNvbnYyRCxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogZnVzZWREZXB0aHdpc2VDb252MmRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GdXNlZERlcHRod2lzZUNvbnYyRC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBnYXRoZXJfdXRpbCwgR2F0aGVyTmQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgQ3BwRFR5cGUgfSBmcm9tICcuL3R5cGVzJztcbmxldCB3YXNtR2F0aGVyTmQ7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbUdhdGhlck5kID0gYmFja2VuZC53YXNtLmN3cmFwKEdhdGhlck5kLCBudWxsIC8qdm9pZCovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdudW1iZXInIC8vIG91dElkXG4gICAgXSk7XG59XG5mdW5jdGlvbiBnYXRoZXJOZChhcmdzKSB7XG4gICAgY29uc3QgeyBiYWNrZW5kLCBpbnB1dHMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBwYXJhbXMsIGluZGljZXMgfSA9IGlucHV0cztcbiAgICBjb25zdCBbcmVzdWx0U2hhcGUsIG51bVNsaWNlcywgc2xpY2VTaXplLCBzdHJpZGVzXSA9IGdhdGhlcl91dGlsLnByZXBhcmVBbmRWYWxpZGF0ZShwYXJhbXMsIGluZGljZXMpO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChyZXN1bHRTaGFwZSwgcGFyYW1zLmR0eXBlKTtcbiAgICBpZiAobnVtU2xpY2VzID09PSAwKSB7XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuICAgIGNvbnN0IGluZGljZXNTaGFwZSA9IGluZGljZXMuc2hhcGU7XG4gICAgY29uc3Qgc2xpY2VSYW5rID0gaW5kaWNlc1NoYXBlW2luZGljZXNTaGFwZS5sZW5ndGggLSAxXTtcbiAgICBjb25zdCB4RGF0YSA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChwYXJhbXMuZGF0YUlkKTtcbiAgICBjb25zdCB4SWQgPSB4RGF0YS5pZDtcbiAgICBjb25zdCBpbmRpY2VzRGF0YSA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChpbmRpY2VzLmRhdGFJZCk7XG4gICAgY29uc3QgaW5kaWNlc0lkID0gaW5kaWNlc0RhdGEuaWQ7XG4gICAgY29uc3Qgc3RyaWRlc0J5dGVzID0gbmV3IFVpbnQ4QXJyYXkobmV3IEludDMyQXJyYXkoc3RyaWRlcykuYnVmZmVyKTtcbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICB3YXNtR2F0aGVyTmQoeElkLCBDcHBEVHlwZVtwYXJhbXMuZHR5cGVdLCBpbmRpY2VzSWQsIG51bVNsaWNlcywgc2xpY2VSYW5rLCBzbGljZVNpemUsIHN0cmlkZXNCeXRlcywgb3V0SWQpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgZ2F0aGVyTmRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogR2F0aGVyTmQsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IGdhdGhlck5kXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9R2F0aGVyTmQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBHYXRoZXJWMiwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7IENwcERUeXBlIH0gZnJvbSAnLi90eXBlcyc7XG5sZXQgd2FzbUdhdGhlcjtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtR2F0aGVyID0gYmFja2VuZC53YXNtLmN3cmFwKCdHYXRoZXInLCBudWxsIC8qdm9pZCovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgJ251bWJlcicgLy8gb3V0SWRcbiAgICBdKTtcbn1cbmZ1bmN0aW9uIGdhdGhlclYyKGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGlucHV0cywgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4LCBpbmRpY2VzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBheGlzLCBiYXRjaERpbXMgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHBhcnNlZEF4aXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpWzBdO1xuICAgIGNvbnN0IHNoYXBlSW5mbyA9IGJhY2tlbmRfdXRpbC5zZWdtZW50X3V0aWwuY29sbGVjdEdhdGhlck9wU2hhcGVJbmZvKHgsIGluZGljZXMsIHBhcnNlZEF4aXMsIGJhdGNoRGltcyk7XG4gICAgY29uc3QgZmxhdHRlblggPSByZXNoYXBlKHtcbiAgICAgICAgaW5wdXRzOiB7IHggfSxcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgIHNoYXBlOiBbXG4gICAgICAgICAgICAgICAgc2hhcGVJbmZvLmJhdGNoU2l6ZSwgc2hhcGVJbmZvLm91dGVyU2l6ZSwgc2hhcGVJbmZvLmRpbVNpemUsXG4gICAgICAgICAgICAgICAgc2hhcGVJbmZvLnNsaWNlU2l6ZVxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICBiYWNrZW5kXG4gICAgfSk7XG4gICAgY29uc3QgaW5kaWNlc1NpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoaW5kaWNlcy5zaGFwZSk7XG4gICAgY29uc3QgZmxhdHRlbkluZGV4ID0gcmVzaGFwZSh7XG4gICAgICAgIGlucHV0czogeyB4OiBpbmRpY2VzIH0sXG4gICAgICAgIGF0dHJzOiB7IHNoYXBlOiBbc2hhcGVJbmZvLmJhdGNoU2l6ZSwgaW5kaWNlc1NpemUgLyBzaGFwZUluZm8uYmF0Y2hTaXplXSB9LFxuICAgICAgICBiYWNrZW5kXG4gICAgfSk7XG4gICAgY29uc3QgZmxhdHRlbk91dHB1dFNoYXBlID0gW1xuICAgICAgICBzaGFwZUluZm8uYmF0Y2hTaXplLCBzaGFwZUluZm8ub3V0ZXJTaXplLCBpbmRpY2VzU2l6ZSAvIHNoYXBlSW5mby5iYXRjaFNpemUsXG4gICAgICAgIHNoYXBlSW5mby5zbGljZVNpemVcbiAgICBdO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChmbGF0dGVuT3V0cHV0U2hhcGUsIHguZHR5cGUpO1xuICAgIGlmICh1dGlsLnNpemVGcm9tU2hhcGUoeC5zaGFwZSkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG4gICAgY29uc3Qgc3RyaWRlc1NpemUgPSBmbGF0dGVuWC5zaGFwZS5sZW5ndGggLSAxO1xuICAgIGNvbnN0IHhEYXRhID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGZsYXR0ZW5YLmRhdGFJZCk7XG4gICAgY29uc3QgeElkID0geERhdGEuaWQ7XG4gICAgY29uc3QgaW5kaWNlc0RhdGEgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoZmxhdHRlbkluZGV4LmRhdGFJZCk7XG4gICAgY29uc3QgaW5kaWNlc0lkID0gaW5kaWNlc0RhdGEuaWQ7XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgeFN0cmlkZXNCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KHV0aWwuY29tcHV0ZVN0cmlkZXMoZmxhdHRlblguc2hhcGUpKS5idWZmZXIpO1xuICAgIGNvbnN0IG91dFN0cmlkZXNCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KHV0aWwuY29tcHV0ZVN0cmlkZXMoZmxhdHRlbk91dHB1dFNoYXBlKSkuYnVmZmVyKTtcbiAgICB3YXNtR2F0aGVyKHhJZCwgQ3BwRFR5cGVbeC5kdHlwZV0sIHhTdHJpZGVzQnl0ZXMsIHN0cmlkZXNTaXplLCBpbmRpY2VzSWQsIHNoYXBlSW5mby5iYXRjaFNpemUsIG91dFN0cmlkZXNCeXRlcywgb3V0SWQpO1xuICAgIGJhY2tlbmQuZGlzcG9zZURhdGEoZmxhdHRlblguZGF0YUlkKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VEYXRhKGZsYXR0ZW5JbmRleC5kYXRhSWQpO1xuICAgIC8vIHJlc2hhcGVcbiAgICBvdXQuc2hhcGUgPSBzaGFwZUluZm8ub3V0cHV0U2hhcGU7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBnYXRoZXJWMkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBHYXRoZXJWMixcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogZ2F0aGVyVjJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1HYXRoZXJWMi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBHcmVhdGVyIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vYmluYXJ5X2tlcm5lbCc7XG5jb25zdCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QgPSBmYWxzZTtcbmV4cG9ydCBjb25zdCBncmVhdGVyQ29uZmlnID0gY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnKEdyZWF0ZXIsIHN1cHBvcnRzRnVsbEJyb2FkY2FzdCwgJ2Jvb2wnKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUdyZWF0ZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgR3JlYXRlckVxdWFsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vYmluYXJ5X2tlcm5lbCc7XG5jb25zdCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QgPSBmYWxzZTtcbmV4cG9ydCBjb25zdCBncmVhdGVyRXF1YWxDb25maWcgPSBjcmVhdGVCaW5hcnlLZXJuZWxDb25maWcoR3JlYXRlckVxdWFsLCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QsICdib29sJyk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1HcmVhdGVyRXF1YWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgSWRlbnRpdHkgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0czogeyB4IH0sIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KHguc2hhcGUsIHguZHR5cGUpO1xuICAgIGNvbnN0IGluVmFscyA9IGJhY2tlbmQudHlwZWRBcnJheUZyb21IZWFwKHgpO1xuICAgIGNvbnN0IG91dFZhbHMgPSBiYWNrZW5kLnR5cGVkQXJyYXlGcm9tSGVhcChvdXQpO1xuICAgIG91dFZhbHMuc2V0KGluVmFscyk7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBpZGVudGl0eUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBJZGVudGl0eSxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIGtlcm5lbEZ1bmM6IGlkZW50aXR5LFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUlkZW50aXR5LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IExlYWt5UmVsdSwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5sZXQgd2FzbUZ1bmM7XG5mdW5jdGlvbiBzZXR1cEZ1bmMoYmFja2VuZCkge1xuICAgIHdhc21GdW5jID0gYmFja2VuZC53YXNtLmN3cmFwKExlYWt5UmVsdSwgbnVsbCAvKiB2b2lkICovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicgLy8gb3V0X2lkXG4gICAgXSk7XG59XG5leHBvcnQgZnVuY3Rpb24gbGVha3lSZWx1KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0czogeyB4IH0sIGF0dHJzOiB7IGFscGhhIH0sIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHguZGF0YUlkKS5pZDtcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoeC5zaGFwZSwgeC5kdHlwZSk7XG4gICAgaWYgKHV0aWwuc2l6ZUZyb21TaGFwZSh4LnNoYXBlKSAhPT0gMCkge1xuICAgICAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICAgICAgd2FzbUZ1bmMoeElkLCBhbHBoYSwgb3V0SWQpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IGxlYWt5UmVsdUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBMZWFreVJlbHUsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmMsXG4gICAga2VybmVsRnVuYzogbGVha3lSZWx1LFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxlYWt5UmVsdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBMZXNzIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vYmluYXJ5X2tlcm5lbCc7XG5jb25zdCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QgPSBmYWxzZTtcbmV4cG9ydCBjb25zdCBsZXNzQ29uZmlnID0gY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnKExlc3MsIHN1cHBvcnRzRnVsbEJyb2FkY2FzdCwgJ2Jvb2wnKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxlc3MuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTGVzc0VxdWFsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vYmluYXJ5X2tlcm5lbCc7XG5jb25zdCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QgPSBmYWxzZTtcbmV4cG9ydCBjb25zdCBsZXNzRXF1YWxDb25maWcgPSBjcmVhdGVCaW5hcnlLZXJuZWxDb25maWcoTGVzc0VxdWFsLCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QsICdib29sJyk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1MZXNzRXF1YWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTG9nIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi91bmFyeV9rZXJuZWwnO1xuZXhwb3J0IGNvbnN0IGxvZ0NvbmZpZyA9IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnKExvZyk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Mb2cuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTG9naWNhbEFuZCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVCaW5hcnlLZXJuZWxDb25maWcgfSBmcm9tICcuL2JpbmFyeV9rZXJuZWwnO1xuY29uc3Qgc3VwcG9ydHNGdWxsQnJvYWRjYXN0ID0gZmFsc2U7XG5leHBvcnQgY29uc3QgbG9naWNhbEFuZENvbmZpZyA9IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyhMb2dpY2FsQW5kLCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QsICdib29sJyk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Mb2dpY2FsQW5kLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBNYXggfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgcGVybXV0ZUF4ZXNBbmRUcmFuc3Bvc2UgfSBmcm9tICcuL2tlcm5lbF91dGlscyc7XG5sZXQgd2FzbU1heDtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtTWF4ID0gYmFja2VuZC53YXNtLmN3cmFwKE1heCwgbnVsbCAvKnZvaWQqLywgWydudW1iZXIsIG51bWJlciwgbnVtYmVyJ10pO1xufVxuZnVuY3Rpb24gbWF4KGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGlucHV0cywgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyByZWR1Y3Rpb25JbmRpY2VzOiBheGlzLCBrZWVwRGltcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHguZGF0YUlkKS5pZDtcbiAgICBsZXQgaW5wdXRJZCA9IHhJZDtcbiAgICBsZXQgaW5wdXQgPSB4O1xuICAgIGNvbnN0IHsgdHJhbnNwb3NlZCwgYXhlcywgb3JpZ2luYWxBeGVzLCBpbnB1dFdhc1RyYW5zcG9zZWQgfSA9IHBlcm11dGVBeGVzQW5kVHJhbnNwb3NlKHgsIGF4aXMsIGJhY2tlbmQpO1xuICAgIGlmIChpbnB1dFdhc1RyYW5zcG9zZWQpIHtcbiAgICAgICAgY29uc3QgdHJhbnNwb3NlZElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHRyYW5zcG9zZWQuZGF0YUlkKS5pZDtcbiAgICAgICAgaW5wdXQgPSB0cmFuc3Bvc2VkO1xuICAgICAgICBpbnB1dElkID0gdHJhbnNwb3NlZElkO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dFJhbmsgPSBpbnB1dC5zaGFwZS5sZW5ndGg7XG4gICAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdtYXgnLCBheGVzLCBpbnB1dFJhbmspO1xuICAgIGNvbnN0IFtvdXRTaGFwZSwgcmVkdWNlU2hhcGVdID0gYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMoaW5wdXQuc2hhcGUsIGF4ZXMpO1xuICAgIGNvbnN0IHJlZHVjZVNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChvdXRTaGFwZSwgeC5kdHlwZSk7XG4gICAgaWYgKHV0aWwuc2l6ZUZyb21TaGFwZShpbnB1dC5zaGFwZSkgIT09IDApIHtcbiAgICAgICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgICAgIHdhc21NYXgoaW5wdXRJZCwgcmVkdWNlU2l6ZSwgb3V0SWQpO1xuICAgIH1cbiAgICBpZiAoaW5wdXRXYXNUcmFuc3Bvc2VkKSB7XG4gICAgICAgIC8vIGRpc3Bvc2Ugb2YgdGhlIHRyYW5zcG9zZWQgdGVuc29yLlxuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VEYXRhKHRyYW5zcG9zZWQuZGF0YUlkKTtcbiAgICB9XG4gICAgaWYgKGtlZXBEaW1zKSB7XG4gICAgICAgIC8vIHJlc2hhcGVcbiAgICAgICAgY29uc3QgbmV3U2hhcGUgPSBiYWNrZW5kX3V0aWwuZXhwYW5kU2hhcGVUb0tlZXBEaW0ob3V0LnNoYXBlLCBvcmlnaW5hbEF4ZXMpO1xuICAgICAgICBvdXQuc2hhcGUgPSBuZXdTaGFwZTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBtYXhDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTWF4LFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiBtYXhcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NYXguanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBNYXhQb29sIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmxldCB3YXNtTWF4UG9vbDtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtTWF4UG9vbCA9IGJhY2tlbmQud2FzbS5jd3JhcChNYXhQb29sLCBudWxsIC8qIHZvaWQgKi8sIFtcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgIF0pO1xufVxuZnVuY3Rpb24gbWF4UG9vbChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGF0dHJzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHggPSBpbnB1dHMueDtcbiAgICBjb25zdCB4SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IHsgZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGUgfSA9IGF0dHJzO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVQb29sMkRJbmZvKHguc2hhcGUsIGZpbHRlclNpemUsIHN0cmlkZXMsIDEgLyogZGlsYXRpb25zICovLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSk7XG4gICAgY29uc3QgZmlsdGVySGVpZ2h0ID0gY29udkluZm8uZmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG4gICAgY29uc3QgcGFkVG9wID0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgcGFkUmlnaHQgPSBjb252SW5mby5wYWRJbmZvLnJpZ2h0O1xuICAgIGNvbnN0IHBhZEJvdHRvbSA9IGNvbnZJbmZvLnBhZEluZm8uYm90dG9tO1xuICAgIGNvbnN0IHBhZExlZnQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgY29uc3QgZGlsYXRpb25IZWlnaHQgPSBjb252SW5mby5kaWxhdGlvbkhlaWdodDtcbiAgICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBpbnB1dENoYW5uZWxzID0gY29udkluZm8uaW5DaGFubmVscztcbiAgICBjb25zdCBvdXRwdXRDaGFubmVscyA9IGNvbnZJbmZvLm91dENoYW5uZWxzO1xuICAgIGlmIChjb252SW5mby5kYXRhRm9ybWF0ICE9PSAnY2hhbm5lbHNMYXN0Jykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHdhc20gYmFja2VuZCBkb2VzIG5vdCBzdXBwb3J0IGRhdGFGb3JtYXQ6J2AgK1xuICAgICAgICAgICAgYCR7Y29udkluZm8uZGF0YUZvcm1hdH0nLiBQbGVhc2UgdXNlICdjaGFubmVsc0xhc3QnLmApO1xuICAgIH1cbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoY29udkluZm8ub3V0U2hhcGUsICdmbG9hdDMyJyk7XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgd2FzbU1heFBvb2woeElkLCB4LnNoYXBlWzBdLCB4LnNoYXBlWzFdLCB4LnNoYXBlWzJdLCBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBwYWRUb3AsIHBhZFJpZ2h0LCBwYWRCb3R0b20sIHBhZExlZnQsIGRpbGF0aW9uSGVpZ2h0LCBkaWxhdGlvbldpZHRoLCBzdHJpZGVIZWlnaHQsIHN0cmlkZVdpZHRoLCBpbnB1dENoYW5uZWxzLCBvdXRwdXRDaGFubmVscywgb3V0SWQpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgbWF4UG9vbENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBNYXhQb29sLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiBtYXhQb29sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWF4UG9vbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBNYXhpbXVtIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vYmluYXJ5X2tlcm5lbCc7XG5jb25zdCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QgPSBmYWxzZTtcbmV4cG9ydCBjb25zdCBtYXhpbXVtQ29uZmlnID0gY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnKE1heGltdW0sIHN1cHBvcnRzRnVsbEJyb2FkY2FzdCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NYXhpbXVtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgTWVhbiwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjYXN0IH0gZnJvbSAnLi9DYXN0JztcbmltcG9ydCB7IHBlcm11dGVBeGVzQW5kVHJhbnNwb3NlIH0gZnJvbSAnLi9rZXJuZWxfdXRpbHMnO1xubGV0IHdhc21NZWFuO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21NZWFuID1cbiAgICAgICAgYmFja2VuZC53YXNtLmN3cmFwKE1lYW4sIG51bGwgLyp2b2lkKi8sIFsnbnVtYmVyLCBudW1iZXIsIG51bWJlciddKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBtZWFuKGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGlucHV0cywgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBheGlzLCBrZWVwRGltcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHguZGF0YUlkKS5pZDtcbiAgICBsZXQgaW5wdXRJZCA9IHhJZDtcbiAgICBsZXQgaW5wdXQgPSB4O1xuICAgIGNvbnN0IHsgdHJhbnNwb3NlZCwgYXhlcywgb3JpZ2luYWxBeGVzLCBpbnB1dFdhc1RyYW5zcG9zZWQgfSA9IHBlcm11dGVBeGVzQW5kVHJhbnNwb3NlKHgsIGF4aXMsIGJhY2tlbmQpO1xuICAgIGxldCByZWR1Y3Rpb25BeGVzID0gYXhlcztcbiAgICBpZiAoaW5wdXRXYXNUcmFuc3Bvc2VkKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zcG9zZWRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh0cmFuc3Bvc2VkLmRhdGFJZCkuaWQ7XG4gICAgICAgIGlmICh0cmFuc3Bvc2VkSWQgIT09IHhJZCkge1xuICAgICAgICAgICAgLy8gdHJhbnNwb3NlIHdhcyBub3QgYSBuby1vcC4gV2Ugd2lsbCBuZWVkIHRvIGRpc3Bvc2Ugb2YgdGhpc1xuICAgICAgICAgICAgLy8gb25jZSB3ZSBhcmUgZG9uZS5cbiAgICAgICAgICAgIGlucHV0ID0gdHJhbnNwb3NlZDtcbiAgICAgICAgICAgIGlucHV0SWQgPSB0cmFuc3Bvc2VkSWQ7XG4gICAgICAgICAgICByZWR1Y3Rpb25BeGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMocmVkdWN0aW9uQXhlcy5sZW5ndGgsIGlucHV0LnNoYXBlLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdtZWFuJywgcmVkdWN0aW9uQXhlcywgaW5wdXQuc2hhcGUubGVuZ3RoKTtcbiAgICBjb25zdCBbb3V0U2hhcGUsIHJlZHVjZVNoYXBlXSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKGlucHV0LnNoYXBlLCByZWR1Y3Rpb25BeGVzKTtcbiAgICBjb25zdCByZWR1Y2VTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcbiAgICBsZXQgY2FzdGVkSW5wdXQgPSBpbnB1dDtcbiAgICBpZiAoaW5wdXQuZHR5cGUgIT09ICdmbG9hdDMyJykge1xuICAgICAgICBjYXN0ZWRJbnB1dCA9XG4gICAgICAgICAgICBjYXN0KHsgYmFja2VuZCwgaW5wdXRzOiB7IHg6IGlucHV0IH0sIGF0dHJzOiB7IGR0eXBlOiAnZmxvYXQzMicgfSB9KTtcbiAgICAgICAgaW5wdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChjYXN0ZWRJbnB1dC5kYXRhSWQpLmlkO1xuICAgIH1cbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQob3V0U2hhcGUsICdmbG9hdDMyJyk7XG4gICAgaWYgKHV0aWwuc2l6ZUZyb21TaGFwZShpbnB1dC5zaGFwZSkgIT09IDApIHtcbiAgICAgICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgICAgIHdhc21NZWFuKGlucHV0SWQsIHJlZHVjZVNpemUsIG91dElkKTtcbiAgICB9XG4gICAgaWYgKGlucHV0V2FzVHJhbnNwb3NlZCkge1xuICAgICAgICAvLyBkaXNwb3NlIG9mIHRoZSB0cmFuc3Bvc2VkIHRlbnNvci5cbiAgICAgICAgYmFja2VuZC5kaXNwb3NlRGF0YSh0cmFuc3Bvc2VkLmRhdGFJZCk7XG4gICAgfVxuICAgIGlmIChrZWVwRGltcykge1xuICAgICAgICAvLyByZXNoYXBlXG4gICAgICAgIGNvbnN0IG5ld1NoYXBlID0gYmFja2VuZF91dGlsLmV4cGFuZFNoYXBlVG9LZWVwRGltKG91dC5zaGFwZSwgb3JpZ2luYWxBeGVzKTtcbiAgICAgICAgb3V0LnNoYXBlID0gbmV3U2hhcGU7XG4gICAgfVxuICAgIGlmIChpbnB1dC5kdHlwZSAhPT0gJ2Zsb2F0MzInKSB7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZURhdGEoY2FzdGVkSW5wdXQuZGF0YUlkKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBtZWFuQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE1lYW4sXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IG1lYW5cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NZWFuLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgTWluLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHBlcm11dGVBeGVzQW5kVHJhbnNwb3NlIH0gZnJvbSAnLi9rZXJuZWxfdXRpbHMnO1xubGV0IHdhc21NaW47XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbU1pbiA9IGJhY2tlbmQud2FzbS5jd3JhcChNaW4sIG51bGwgLyp2b2lkKi8sIFsnbnVtYmVyLCBudW1iZXIsIG51bWJlciddKTtcbn1cbmZ1bmN0aW9uIG1pbihhcmdzKSB7XG4gICAgY29uc3QgeyBiYWNrZW5kLCBpbnB1dHMsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgYXhpcywga2VlcERpbXMgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHhJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh4LmRhdGFJZCkuaWQ7XG4gICAgbGV0IGlucHV0SWQgPSB4SWQ7XG4gICAgbGV0IGlucHV0ID0geDtcbiAgICBjb25zdCB7IHRyYW5zcG9zZWQsIGF4ZXMsIG9yaWdpbmFsQXhlcywgaW5wdXRXYXNUcmFuc3Bvc2VkIH0gPSBwZXJtdXRlQXhlc0FuZFRyYW5zcG9zZSh4LCBheGlzLCBiYWNrZW5kKTtcbiAgICBpZiAoaW5wdXRXYXNUcmFuc3Bvc2VkKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zcG9zZWRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh0cmFuc3Bvc2VkLmRhdGFJZCkuaWQ7XG4gICAgICAgIGlmICh0cmFuc3Bvc2VkSWQgIT09IHhJZCkge1xuICAgICAgICAgICAgLy8gdHJhbnNwb3NlIHdhcyBub3QgYSBuby1vcC4gV2Ugd2lsbCBuZWVkIHRvIGRpc3Bvc2Ugb2YgdGhpc1xuICAgICAgICAgICAgLy8gb25jZSB3ZSBhcmUgZG9uZS5cbiAgICAgICAgICAgIGlucHV0ID0gdHJhbnNwb3NlZDtcbiAgICAgICAgICAgIGlucHV0SWQgPSB0cmFuc3Bvc2VkSWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaW5wdXRSYW5rID0gaW5wdXQuc2hhcGUubGVuZ3RoO1xuICAgIGJhY2tlbmRfdXRpbC5hc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcygnbWluJywgYXhlcywgaW5wdXRSYW5rKTtcbiAgICBjb25zdCBbb3V0U2hhcGUsIHJlZHVjZVNoYXBlXSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKGlucHV0LnNoYXBlLCBheGVzKTtcbiAgICBjb25zdCByZWR1Y2VTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQob3V0U2hhcGUsIGlucHV0LmR0eXBlKTtcbiAgICBpZiAodXRpbC5zaXplRnJvbVNoYXBlKGlucHV0LnNoYXBlKSAhPT0gMCkge1xuICAgICAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICAgICAgd2FzbU1pbihpbnB1dElkLCByZWR1Y2VTaXplLCBvdXRJZCk7XG4gICAgfVxuICAgIGlmIChpbnB1dFdhc1RyYW5zcG9zZWQpIHtcbiAgICAgICAgLy8gZGlzcG9zZSBvZiB0aGUgdHJhbnNwb3NlZCB0ZW5zb3IuXG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZURhdGEodHJhbnNwb3NlZC5kYXRhSWQpO1xuICAgIH1cbiAgICBpZiAoa2VlcERpbXMpIHtcbiAgICAgICAgLy8gcmVzaGFwZVxuICAgICAgICBjb25zdCBuZXdTaGFwZSA9IGJhY2tlbmRfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbShvdXQuc2hhcGUsIG9yaWdpbmFsQXhlcyk7XG4gICAgICAgIG91dC5zaGFwZSA9IG5ld1NoYXBlO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IG1pbkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBNaW4sXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IG1pblxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1pbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBNaW5pbXVtIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vYmluYXJ5X2tlcm5lbCc7XG5jb25zdCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QgPSBmYWxzZTtcbmV4cG9ydCBjb25zdCBtaW5pbXVtQ29uZmlnID0gY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnKE1pbmltdW0sIHN1cHBvcnRzRnVsbEJyb2FkY2FzdCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NaW5pbXVtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IE1pcnJvclBhZCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBDcHBEVHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuLy8gTXVzdCBtYXRjaCBlbnVtIGluIE1pcnJvclBhZC5jY1xudmFyIE1pcnJvclBhZGRpbmdNb2RlO1xuKGZ1bmN0aW9uIChNaXJyb3JQYWRkaW5nTW9kZSkge1xuICAgIE1pcnJvclBhZGRpbmdNb2RlW01pcnJvclBhZGRpbmdNb2RlW1wicmVmbGVjdFwiXSA9IDBdID0gXCJyZWZsZWN0XCI7XG4gICAgTWlycm9yUGFkZGluZ01vZGVbTWlycm9yUGFkZGluZ01vZGVbXCJzeW1tZXRyaWNcIl0gPSAxXSA9IFwic3ltbWV0cmljXCI7XG59KShNaXJyb3JQYWRkaW5nTW9kZSB8fCAoTWlycm9yUGFkZGluZ01vZGUgPSB7fSkpO1xubGV0IHdhc21NaXJyb3JQYWQ7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbU1pcnJvclBhZCA9IGJhY2tlbmQud2FzbS5jd3JhcChNaXJyb3JQYWQsIG51bGwgLyogdm9pZCAqLywgW1xuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgXSk7XG59XG5mdW5jdGlvbiBtaXJyb3JQYWQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCwgYXR0cnM6IHsgcGFkZGluZ3MsIG1vZGUgfSB9ID0gYXJncztcbiAgICBjb25zdCBvdXRTaGFwZSA9IHBhZGRpbmdzLm1hcCgocCwgaSkgPT4gcFswXSAvKiBiZWZvcmVQYWQgKi8gKyB4LnNoYXBlW2ldICsgcFsxXSAvKiBhZnRlclBhZCAqLyk7XG4gICAgY29uc3QgeElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHguZGF0YUlkKS5pZDtcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQob3V0U2hhcGUsIHguZHR5cGUpO1xuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IHhTaGFwZUJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobmV3IEludDMyQXJyYXkoeC5zaGFwZSkuYnVmZmVyKTtcbiAgICBjb25zdCBwcmVQYWRkaW5nc0ZsYXQgPSBwYWRkaW5ncy5tYXAocGFkVHVwbGUgPT4gcGFkVHVwbGVbMF0pO1xuICAgIGNvbnN0IHBvc3RQYWRkaW5nc0ZsYXQgPSBwYWRkaW5ncy5tYXAocGFkVHVwbGUgPT4gcGFkVHVwbGVbMV0pO1xuICAgIGNvbnN0IHByZVBhZGRpbmdzQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheShwcmVQYWRkaW5nc0ZsYXQpLmJ1ZmZlcik7XG4gICAgY29uc3QgcG9zdFBhZGRpbmdzQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheShwb3N0UGFkZGluZ3NGbGF0KS5idWZmZXIpO1xuICAgIHdhc21NaXJyb3JQYWQoeElkLCB4U2hhcGVCeXRlcywgeC5zaGFwZS5sZW5ndGgsIENwcERUeXBlW3guZHR5cGVdLCBwcmVQYWRkaW5nc0J5dGVzLCBwb3N0UGFkZGluZ3NCeXRlcywgTWlycm9yUGFkZGluZ01vZGVbbW9kZV0sIG91dElkKTtcbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IG1pcnJvclBhZENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBNaXJyb3JQYWQsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBrZXJuZWxGdW5jOiBtaXJyb3JQYWQsXG4gICAgc2V0dXBGdW5jOiBzZXR1cFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1pcnJvclBhZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBNdWx0aXBseSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVCaW5hcnlLZXJuZWxDb25maWcgfSBmcm9tICcuL2JpbmFyeV9rZXJuZWwnO1xuY29uc3Qgc3VwcG9ydHNGdWxsQnJvYWRjYXN0ID0gdHJ1ZTtcbmV4cG9ydCBjb25zdCBtdWx0aXBseUNvbmZpZyA9IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyhNdWx0aXBseSwgc3VwcG9ydHNGdWxsQnJvYWRjYXN0KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU11bHRpcGx5LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IE5lZyB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVVbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vdW5hcnlfa2VybmVsJztcbmV4cG9ydCBjb25zdCBuZWdDb25maWcgPSBjcmVhdGVVbmFyeUtlcm5lbENvbmZpZyhOZWcpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TmVnLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IE5vbk1heFN1cHByZXNzaW9uVjMgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgcGFyc2VSZXN1bHRTdHJ1Y3QgfSBmcm9tICcuL05vbk1heFN1cHByZXNzaW9uX3V0aWwnO1xubGV0IHdhc21GdW5jO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21GdW5jID0gYmFja2VuZC53YXNtLmN3cmFwKE5vbk1heFN1cHByZXNzaW9uVjMsICdudW1iZXInLCAvLyBSZXN1bHQqXG4gICAgW1xuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgXSk7XG59XG5mdW5jdGlvbiBrZXJuZWxGdW5jKGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGlucHV0cywgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBpb3VUaHJlc2hvbGQsIG1heE91dHB1dFNpemUsIHNjb3JlVGhyZXNob2xkIH0gPSBhdHRycztcbiAgICBjb25zdCB7IGJveGVzLCBzY29yZXMgfSA9IGlucHV0cztcbiAgICBjb25zdCBib3hlc0lkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGJveGVzLmRhdGFJZCkuaWQ7XG4gICAgY29uc3Qgc2NvcmVzSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoc2NvcmVzLmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgcmVzT2Zmc2V0ID0gd2FzbUZ1bmMoYm94ZXNJZCwgc2NvcmVzSWQsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQpO1xuICAgIGNvbnN0IHsgcFNlbGVjdGVkSW5kaWNlcywgc2VsZWN0ZWRTaXplLCBwU2VsZWN0ZWRTY29yZXMsIHBWYWxpZE91dHB1dHMgfSA9IHBhcnNlUmVzdWx0U3RydWN0KGJhY2tlbmQsIHJlc09mZnNldCk7XG4gICAgLy8gU2luY2Ugd2UgYXJlIG5vdCB1c2luZyBzY29yZXMgZm9yIFYzLCB3ZSBoYXZlIHRvIGRlbGV0ZSBpdCBmcm9tIHRoZSBoZWFwLlxuICAgIGJhY2tlbmQud2FzbS5fZnJlZShwU2VsZWN0ZWRTY29yZXMpO1xuICAgIGJhY2tlbmQud2FzbS5fZnJlZShwVmFsaWRPdXRwdXRzKTtcbiAgICBjb25zdCBzZWxlY3RlZEluZGljZXNUZW5zb3IgPSBiYWNrZW5kLm1ha2VPdXRwdXQoW3NlbGVjdGVkU2l6ZV0sICdpbnQzMicsIHBTZWxlY3RlZEluZGljZXMpO1xuICAgIHJldHVybiBzZWxlY3RlZEluZGljZXNUZW5zb3I7XG59XG5leHBvcnQgY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25WM0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBOb25NYXhTdXBwcmVzc2lvblYzLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiBrZXJuZWxGdW5jLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5vbk1heFN1cHByZXNzaW9uVjMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTm9uTWF4U3VwcHJlc3Npb25WNCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBwYXJzZVJlc3VsdFN0cnVjdCB9IGZyb20gJy4vTm9uTWF4U3VwcHJlc3Npb25fdXRpbCc7XG5sZXQgd2FzbUZ1bmM7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbUZ1bmMgPSBiYWNrZW5kLndhc20uY3dyYXAoTm9uTWF4U3VwcHJlc3Npb25WNCwgJ251bWJlcicsIC8vIFJlc3VsdCpcbiAgICBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2Jvb2wnLFxuICAgIF0pO1xufVxuZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25WNChhcmdzKSB7XG4gICAgY29uc3QgeyBiYWNrZW5kLCBpbnB1dHMsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW91VGhyZXNob2xkLCBtYXhPdXRwdXRTaXplLCBzY29yZVRocmVzaG9sZCwgcGFkVG9NYXhPdXRwdXRTaXplIH0gPSBhdHRycztcbiAgICBjb25zdCB7IGJveGVzLCBzY29yZXMgfSA9IGlucHV0cztcbiAgICBjb25zdCBib3hlc0lkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGJveGVzLmRhdGFJZCkuaWQ7XG4gICAgY29uc3Qgc2NvcmVzSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoc2NvcmVzLmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgcmVzT2Zmc2V0ID0gd2FzbUZ1bmMoYm94ZXNJZCwgc2NvcmVzSWQsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsIHBhZFRvTWF4T3V0cHV0U2l6ZSk7XG4gICAgY29uc3QgeyBwU2VsZWN0ZWRJbmRpY2VzLCBzZWxlY3RlZFNpemUsIHBTZWxlY3RlZFNjb3JlcywgcFZhbGlkT3V0cHV0cyB9ID0gcGFyc2VSZXN1bHRTdHJ1Y3QoYmFja2VuZCwgcmVzT2Zmc2V0KTtcbiAgICAvLyBTaW5jZSB3ZSBhcmUgbm90IHVzaW5nIHNjb3JlcyBmb3IgVjQsIHdlIGhhdmUgdG8gZGVsZXRlIGl0IGZyb20gdGhlIGhlYXAuXG4gICAgYmFja2VuZC53YXNtLl9mcmVlKHBTZWxlY3RlZFNjb3Jlcyk7XG4gICAgY29uc3Qgc2VsZWN0ZWRJbmRpY2VzVGVuc29yID0gYmFja2VuZC5tYWtlT3V0cHV0KFtzZWxlY3RlZFNpemVdLCAnaW50MzInLCBwU2VsZWN0ZWRJbmRpY2VzKTtcbiAgICBjb25zdCB2YWxpZE91dHB1dHNUZW5zb3IgPSBiYWNrZW5kLm1ha2VPdXRwdXQoW10sICdpbnQzMicsIHBWYWxpZE91dHB1dHMpO1xuICAgIHJldHVybiBbc2VsZWN0ZWRJbmRpY2VzVGVuc29yLCB2YWxpZE91dHB1dHNUZW5zb3JdO1xufVxuZXhwb3J0IGNvbnN0IG5vbk1heFN1cHByZXNzaW9uVjRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTm9uTWF4U3VwcHJlc3Npb25WNCxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogbm9uTWF4U3VwcHJlc3Npb25WNCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ob25NYXhTdXBwcmVzc2lvblY0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IE5vbk1heFN1cHByZXNzaW9uVjUgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgcGFyc2VSZXN1bHRTdHJ1Y3QgfSBmcm9tICcuL05vbk1heFN1cHByZXNzaW9uX3V0aWwnO1xubGV0IHdhc21GdW5jO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21GdW5jID0gYmFja2VuZC53YXNtLmN3cmFwKE5vbk1heFN1cHByZXNzaW9uVjUsICdudW1iZXInLCAvLyBSZXN1bHQqXG4gICAgW1xuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgIF0pO1xufVxuZnVuY3Rpb24ga2VybmVsRnVuYyhhcmdzKSB7XG4gICAgY29uc3QgeyBiYWNrZW5kLCBpbnB1dHMsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW91VGhyZXNob2xkLCBtYXhPdXRwdXRTaXplLCBzY29yZVRocmVzaG9sZCwgc29mdE5tc1NpZ21hIH0gPSBhdHRycztcbiAgICBjb25zdCB7IGJveGVzLCBzY29yZXMgfSA9IGlucHV0cztcbiAgICBjb25zdCBib3hlc0lkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGJveGVzLmRhdGFJZCkuaWQ7XG4gICAgY29uc3Qgc2NvcmVzSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoc2NvcmVzLmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgcmVzT2Zmc2V0ID0gd2FzbUZ1bmMoYm94ZXNJZCwgc2NvcmVzSWQsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsIHNvZnRObXNTaWdtYSk7XG4gICAgY29uc3QgeyBwU2VsZWN0ZWRJbmRpY2VzLCBzZWxlY3RlZFNpemUsIHBTZWxlY3RlZFNjb3JlcywgcFZhbGlkT3V0cHV0cyB9ID0gcGFyc2VSZXN1bHRTdHJ1Y3QoYmFja2VuZCwgcmVzT2Zmc2V0KTtcbiAgICAvLyBTaW5jZSB3ZSBhcmUgbm90IHVzaW5nIHZhbGlkT3V0cHV0cyBmb3IgVjUsIHdlIGhhdmUgdG8gZGVsZXRlIGl0IGZyb20gdGhlXG4gICAgLy8gaGVhcC5cbiAgICBiYWNrZW5kLndhc20uX2ZyZWUocFZhbGlkT3V0cHV0cyk7XG4gICAgY29uc3Qgc2VsZWN0ZWRJbmRpY2VzVGVuc29yID0gYmFja2VuZC5tYWtlT3V0cHV0KFtzZWxlY3RlZFNpemVdLCAnaW50MzInLCBwU2VsZWN0ZWRJbmRpY2VzKTtcbiAgICBjb25zdCBzZWxlY3RlZFNjb3Jlc1RlbnNvciA9IGJhY2tlbmQubWFrZU91dHB1dChbc2VsZWN0ZWRTaXplXSwgJ2Zsb2F0MzInLCBwU2VsZWN0ZWRTY29yZXMpO1xuICAgIHJldHVybiBbc2VsZWN0ZWRJbmRpY2VzVGVuc29yLCBzZWxlY3RlZFNjb3Jlc1RlbnNvcl07XG59XG5leHBvcnQgY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25WNUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBOb25NYXhTdXBwcmVzc2lvblY1LFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiBrZXJuZWxGdW5jLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5vbk1heFN1cHByZXNzaW9uVjUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLyoqXG4gKiBQYXJzZSB0aGUgcmVzdWx0IG9mIHRoZSBjKysgbWV0aG9kLCB3aGljaCBoYXMgdGhlIHNoYXBlIGVxdWl2YWxlbnQgdG9cbiAqIGBSZXN1bHRgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VSZXN1bHRTdHJ1Y3QoYmFja2VuZCwgcmVzT2Zmc2V0KSB7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IEludDMyQXJyYXkoYmFja2VuZC53YXNtLkhFQVBVOC5idWZmZXIsIHJlc09mZnNldCwgNCk7XG4gICAgY29uc3QgcFNlbGVjdGVkSW5kaWNlcyA9IHJlc3VsdFswXTtcbiAgICBjb25zdCBzZWxlY3RlZFNpemUgPSByZXN1bHRbMV07XG4gICAgY29uc3QgcFNlbGVjdGVkU2NvcmVzID0gcmVzdWx0WzJdO1xuICAgIGNvbnN0IHBWYWxpZE91dHB1dHMgPSByZXN1bHRbM107XG4gICAgLy8gU2luY2UgdGhlIHJlc3VsdCB3YXMgYWxsb2NhdGVkIG9uIHRoZSBoZWFwLCB3ZSBoYXZlIHRvIGRlbGV0ZSBpdC5cbiAgICBiYWNrZW5kLndhc20uX2ZyZWUocmVzT2Zmc2V0KTtcbiAgICByZXR1cm4geyBwU2VsZWN0ZWRJbmRpY2VzLCBzZWxlY3RlZFNpemUsIHBTZWxlY3RlZFNjb3JlcywgcFZhbGlkT3V0cHV0cyB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Tm9uTWF4U3VwcHJlc3Npb25fdXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBOb3RFcXVhbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVCaW5hcnlLZXJuZWxDb25maWcgfSBmcm9tICcuL2JpbmFyeV9rZXJuZWwnO1xuY29uc3Qgc3VwcG9ydHNGdWxsQnJvYWRjYXN0ID0gZmFsc2U7XG5leHBvcnQgY29uc3Qgbm90RXF1YWxDb25maWcgPSBjcmVhdGVCaW5hcnlLZXJuZWxDb25maWcoTm90RXF1YWwsIHN1cHBvcnRzRnVsbEJyb2FkY2FzdCwgJ2Jvb2wnKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5vdEVxdWFsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IE9uZUhvdCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5sZXQgd2FzbU9uZUhvdDtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtT25lSG90ID0gYmFja2VuZC53YXNtLmN3cmFwKE9uZUhvdCwgbnVsbCAvKiB2b2lkICovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyAvLyBvdXRfaWRcbiAgICBdKTtcbn1cbmZ1bmN0aW9uIG9uZUhvdChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW5kaWNlcyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgZGVwdGgsIG9uVmFsdWUsIG9mZlZhbHVlIH0gPSBhdHRycztcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoWy4uLmluZGljZXMuc2hhcGUsIGRlcHRoXSwgJ2ludDMyJyk7XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgaW5kaWNlc0RhdGEgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoaW5kaWNlcy5kYXRhSWQpO1xuICAgIGNvbnN0IGluZGljZXNJZCA9IGluZGljZXNEYXRhLmlkO1xuICAgIHdhc21PbmVIb3QoaW5kaWNlc0lkLCBkZXB0aCwgb25WYWx1ZSwgb2ZmVmFsdWUsIG91dElkKTtcbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IG9uZUhvdENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBPbmVIb3QsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IG9uZUhvdCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1PbmVIb3QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgT25lc0xpa2UgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZnVuY3Rpb24gb25lc0xpa2UoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoeC5zaGFwZSwgeC5kdHlwZSk7XG4gICAgY29uc3Qgb3V0VmFscyA9IGJhY2tlbmQudHlwZWRBcnJheUZyb21IZWFwKG91dCk7XG4gICAgb3V0VmFscy5maWxsKDEpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3Qgb25lc0xpa2VDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogT25lc0xpa2UsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBrZXJuZWxGdW5jOiBvbmVzTGlrZSxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1PbmVzTGlrZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBQYWNrLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNvbmNhdCB9IGZyb20gJy4vQ29uY2F0JztcbmltcG9ydCB7IGV4cGFuZERpbXMgfSBmcm9tICcuL0V4cGFuZERpbXMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhY2soYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGF4aXMgfSA9IGF0dHJzO1xuICAgIGlmIChpbnB1dHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiBleHBhbmREaW1zKHsgaW5wdXRzOiB7IGlucHV0OiBpbnB1dHNbMF0gfSwgYmFja2VuZCwgYXR0cnM6IHsgZGltOiBheGlzIH0gfSk7XG4gICAgfVxuICAgIGNvbnN0IHNoYXBlID0gaW5wdXRzWzBdLnNoYXBlO1xuICAgIGNvbnN0IGR0eXBlID0gaW5wdXRzWzBdLmR0eXBlO1xuICAgIGlucHV0cy5mb3JFYWNoKHQgPT4ge1xuICAgICAgICB1dGlsLmFzc2VydFNoYXBlc01hdGNoKHNoYXBlLCB0LnNoYXBlLCAnQWxsIHRlbnNvcnMgcGFzc2VkIHRvIHN0YWNrIG11c3QgaGF2ZSBtYXRjaGluZyBzaGFwZXMnKTtcbiAgICAgICAgdXRpbC5hc3NlcnQoZHR5cGUgPT09IHQuZHR5cGUsICgpID0+ICdBbGwgdGVuc29ycyBwYXNzZWQgdG8gc3RhY2sgbXVzdCBoYXZlIG1hdGNoaW5nIGR0eXBlcycpO1xuICAgIH0pO1xuICAgIGNvbnN0IGludGVybWVkaWF0ZVRlbnNvckluZm9zID0gW107XG4gICAgY29uc3QgZXhwYW5kZWRUZW5zb3JzID0gaW5wdXRzLm1hcCh0ID0+IHtcbiAgICAgICAgY29uc3QgZXhwYW5kZWRUID0gZXhwYW5kRGltcyh7IGlucHV0czogeyBpbnB1dDogdCB9LCBiYWNrZW5kLCBhdHRyczogeyBkaW06IGF4aXMgfSB9KTtcbiAgICAgICAgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MucHVzaChleHBhbmRlZFQpO1xuICAgICAgICByZXR1cm4gZXhwYW5kZWRUO1xuICAgIH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGNvbmNhdCh7IGlucHV0czogZXhwYW5kZWRUZW5zb3JzLCBiYWNrZW5kLCBhdHRyczogeyBheGlzIH0gfSk7XG4gICAgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZURhdGEodC5kYXRhSWQpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGNvbnN0IHBhY2tDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUGFjayxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIGtlcm5lbEZ1bmM6IHBhY2tcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QYWNrLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFBhZFYyIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IENwcERUeXBlIH0gZnJvbSAnLi90eXBlcyc7XG5sZXQgd2FzbVBhZFYyO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21QYWRWMiA9IGJhY2tlbmQud2FzbS5jd3JhcChQYWRWMiwgbnVsbCAvKiB2b2lkICovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICBdKTtcbn1cbmZ1bmN0aW9uIHBhZChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kLCBhdHRyczogeyBwYWRkaW5ncywgY29uc3RhbnRWYWx1ZSB9IH0gPSBhcmdzO1xuICAgIGNvbnN0IG91dFNoYXBlID0gcGFkZGluZ3MubWFwKChwLCBpKSA9PiBwWzBdIC8qIGJlZm9yZVBhZCAqLyArIHguc2hhcGVbaV0gKyBwWzFdIC8qIGFmdGVyUGFkICovKTtcbiAgICBjb25zdCB4SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChvdXRTaGFwZSwgeC5kdHlwZSk7XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgeFNoYXBlQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheSh4LnNoYXBlKS5idWZmZXIpO1xuICAgIGNvbnN0IHByZVBhZGRpbmdzRmxhdCA9IHBhZGRpbmdzLm1hcChwYWRUdXBsZSA9PiBwYWRUdXBsZVswXSk7XG4gICAgY29uc3QgcG9zdFBhZGRpbmdzRmxhdCA9IHBhZGRpbmdzLm1hcChwYWRUdXBsZSA9PiBwYWRUdXBsZVsxXSk7XG4gICAgY29uc3QgcHJlUGFkZGluZ3NCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KHByZVBhZGRpbmdzRmxhdCkuYnVmZmVyKTtcbiAgICBjb25zdCBwb3N0UGFkZGluZ3NCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KHBvc3RQYWRkaW5nc0ZsYXQpLmJ1ZmZlcik7XG4gICAgd2FzbVBhZFYyKHhJZCwgeFNoYXBlQnl0ZXMsIHguc2hhcGUubGVuZ3RoLCBDcHBEVHlwZVt4LmR0eXBlXSwgcHJlUGFkZGluZ3NCeXRlcywgcG9zdFBhZGRpbmdzQnl0ZXMsIGNvbnN0YW50VmFsdWUsIG91dElkKTtcbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IHBhZFYyQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFBhZFYyLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAga2VybmVsRnVuYzogcGFkLFxuICAgIHNldHVwRnVuYzogc2V0dXBcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QYWRWMi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBQb3cgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi9iaW5hcnlfa2VybmVsJztcbmNvbnN0IHN1cHBvcnRzRnVsbEJyb2FkY2FzdCA9IGZhbHNlO1xuZXhwb3J0IGNvbnN0IHBvd0NvbmZpZyA9IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyhQb3csIHN1cHBvcnRzRnVsbEJyb2FkY2FzdCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Qb3cuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUHJlbHUgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xubGV0IHdhc21QcmVsdTtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtUHJlbHUgPSBiYWNrZW5kLndhc20uY3dyYXAoUHJlbHUsIG51bGwgLyogdm9pZCAqLywgW1xuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInIC8vIG91dF9pZFxuICAgIF0pO1xufVxuZnVuY3Rpb24gcHJlbHUoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCwgYWxwaGEgfSA9IGlucHV0cztcbiAgICBjb25zdCB4SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IHdlaWdodHNJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChhbHBoYS5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dCh4LnNoYXBlLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIHdhc21QcmVsdSh4SWQsIHdlaWdodHNJZCwgb3V0SWQpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgcHJlbHVDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUHJlbHUsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IHByZWx1XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHJlbHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBQcm9kLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHBlcm11dGVBeGVzQW5kVHJhbnNwb3NlIH0gZnJvbSAnLi9rZXJuZWxfdXRpbHMnO1xuaW1wb3J0IHsgQ3BwRFR5cGUgfSBmcm9tICcuL3R5cGVzJztcbmxldCB3YXNtUHJvZDtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtUHJvZCA9IGJhY2tlbmQud2FzbS5jd3JhcChQcm9kLCBudWxsIC8qdm9pZCovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInXG4gICAgXSk7XG59XG5mdW5jdGlvbiBwcm9kKGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGlucHV0cywgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBheGlzLCBrZWVwRGltcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHguZGF0YUlkKS5pZDtcbiAgICBsZXQgaW5wdXRJZCA9IHhJZDtcbiAgICBsZXQgaW5wdXQgPSB4O1xuICAgIGNvbnN0IHsgdHJhbnNwb3NlZCwgYXhlcywgb3JpZ2luYWxBeGVzLCBpbnB1dFdhc1RyYW5zcG9zZWQgfSA9IHBlcm11dGVBeGVzQW5kVHJhbnNwb3NlKHgsIGF4aXMsIGJhY2tlbmQpO1xuICAgIGxldCByZWR1Y3Rpb25BeGVzID0gYXhlcztcbiAgICBpZiAoaW5wdXRXYXNUcmFuc3Bvc2VkKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zcG9zZWRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh0cmFuc3Bvc2VkLmRhdGFJZCkuaWQ7XG4gICAgICAgIGlmICh0cmFuc3Bvc2VkSWQgIT09IHhJZCkge1xuICAgICAgICAgICAgLy8gdHJhbnNwb3NlIHdhcyBub3QgYSBuby1vcC4gV2Ugd2lsbCBuZWVkIHRvIGRpc3Bvc2Ugb2YgdGhpc1xuICAgICAgICAgICAgLy8gb25jZSB3ZSBhcmUgZG9uZS5cbiAgICAgICAgICAgIGlucHV0ID0gdHJhbnNwb3NlZDtcbiAgICAgICAgICAgIGlucHV0SWQgPSB0cmFuc3Bvc2VkSWQ7XG4gICAgICAgICAgICByZWR1Y3Rpb25BeGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMocmVkdWN0aW9uQXhlcy5sZW5ndGgsIGlucHV0LnNoYXBlLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdwcm9kJywgcmVkdWN0aW9uQXhlcywgaW5wdXQuc2hhcGUubGVuZ3RoKTtcbiAgICBjb25zdCBbb3V0U2hhcGUsIHJlZHVjZVNoYXBlXSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKGlucHV0LnNoYXBlLCByZWR1Y3Rpb25BeGVzKTtcbiAgICBjb25zdCByZWR1Y2VTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQob3V0U2hhcGUsIGlucHV0LmR0eXBlKTtcbiAgICBpZiAodXRpbC5zaXplRnJvbVNoYXBlKGlucHV0LnNoYXBlKSAhPT0gMCkge1xuICAgICAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICAgICAgd2FzbVByb2QoaW5wdXRJZCwgcmVkdWNlU2l6ZSwgQ3BwRFR5cGVbb3V0LmR0eXBlXSwgb3V0SWQpO1xuICAgIH1cbiAgICBpZiAoaW5wdXRXYXNUcmFuc3Bvc2VkKSB7XG4gICAgICAgIC8vIGRpc3Bvc2Ugb2YgdGhlIHRyYW5zcG9zZWQgdGVuc29yLlxuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VEYXRhKHRyYW5zcG9zZWQuZGF0YUlkKTtcbiAgICB9XG4gICAgaWYgKGtlZXBEaW1zKSB7XG4gICAgICAgIC8vIHJlc2hhcGVcbiAgICAgICAgY29uc3QgbmV3U2hhcGUgPSBiYWNrZW5kX3V0aWwuZXhwYW5kU2hhcGVUb0tlZXBEaW0ob3V0LnNoYXBlLCBvcmlnaW5hbEF4ZXMpO1xuICAgICAgICBvdXQuc2hhcGUgPSBuZXdTaGFwZTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBwcm9kQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFByb2QsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IHByb2Rcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Qcm9kLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFJhbmdlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHJhbmdlSW1wbENQVSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuZXhwb3J0IGNvbnN0IHJhbmdlID0gKGFyZ3MpID0+IHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgc3RhcnQsIHN0b3AsIHN0ZXAsIGR0eXBlIH0gPSBhdHRycztcbiAgICBjb25zdCB2YWx1ZXMgPSByYW5nZUltcGxDUFUoc3RhcnQsIHN0b3AsIHN0ZXAsIGR0eXBlKTtcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoW3ZhbHVlcy5sZW5ndGhdLCBkdHlwZSk7XG4gICAgY29uc3Qgb3V0VmFscyA9IGJhY2tlbmQudHlwZWRBcnJheUZyb21IZWFwKG91dCk7XG4gICAgb3V0VmFscy5zZXQodmFsdWVzKTtcbiAgICByZXR1cm4gb3V0O1xufTtcbmV4cG9ydCBjb25zdCByYW5nZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBSYW5nZSxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIGtlcm5lbEZ1bmM6IHJhbmdlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmFuZ2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUmVhbERpdiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVCaW5hcnlLZXJuZWxDb25maWcgfSBmcm9tICcuL2JpbmFyeV9rZXJuZWwnO1xuY29uc3Qgc3VwcG9ydHNGdWxsQnJvYWRjYXN0ID0gdHJ1ZTtcbmV4cG9ydCBjb25zdCByZWFsRGl2Q29uZmlnID0gY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnKFJlYWxEaXYsIHN1cHBvcnRzRnVsbEJyb2FkY2FzdCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWFsRGl2LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFJlbHUgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlVW5hcnlLZXJuZWxDb25maWcgfSBmcm9tICcuL3VuYXJ5X2tlcm5lbCc7XG5leHBvcnQgY29uc3QgcmVsdUNvbmZpZyA9IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnKFJlbHUpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVsdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBSZWx1NiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVVbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vdW5hcnlfa2VybmVsJztcbmV4cG9ydCBjb25zdCByZWx1NkNvbmZpZyA9IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnKFJlbHU2KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlbHU2LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFJlc2hhcGUsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2hhcGUoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHNoYXBlIH0gPSBhdHRycztcbiAgICBjb25zdCB4U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSh4LnNoYXBlKTtcbiAgICBjb25zdCAkc2hhcGUgPSB1dGlsLmluZmVyRnJvbUltcGxpY2l0U2hhcGUoc2hhcGUsIHhTaXplKTtcbiAgICB1dGlsLmFzc2VydCh4U2l6ZSA9PT0gdXRpbC5zaXplRnJvbVNoYXBlKCRzaGFwZSksICgpID0+IGBuZXcgc2hhcGU6ICR7JHNoYXBlfSwgb2xkIHNoYXBlOiAke3guc2hhcGV9LiBOZXcgc2hhcGUgYW5kIG9sZCBgICtcbiAgICAgICAgYHNoYXBlIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMuYCk7XG4gICAgLy8gQmFja2VuZCBuZWVkcyB0byB0cmFjayByZWZDb3VudCBmb3IgdGhlIGRhdGFJZCBmb3IgcmVzaGFwZSBvcFxuICAgIGFyZ3MuYmFja2VuZC5pbmNSZWYoeC5kYXRhSWQpO1xuICAgIHJldHVybiB7IGRhdGFJZDogeC5kYXRhSWQsIHNoYXBlOiAkc2hhcGUsIGR0eXBlOiB4LmR0eXBlIH07XG59XG5leHBvcnQgY29uc3QgcmVzaGFwZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBSZXNoYXBlLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAga2VybmVsRnVuYzogcmVzaGFwZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlc2hhcGUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUmVzaXplQmlsaW5lYXIsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY2FzdCB9IGZyb20gJy4vQ2FzdCc7XG5sZXQgd2FzbVJlc2l6ZUJpbGluZWFyO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21SZXNpemVCaWxpbmVhciA9IGJhY2tlbmQud2FzbS5jd3JhcChSZXNpemVCaWxpbmVhciwgbnVsbCAvKnZvaWQqLywgW1xuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyAvLyBvdXRJZFxuICAgIF0pO1xufVxuZnVuY3Rpb24gcmVzaXplQmlsaW5lYXIoYXJncykge1xuICAgIGNvbnN0IHsgYmFja2VuZCwgaW5wdXRzLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGltYWdlcyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYWxpZ25Db3JuZXJzLCBoYWxmUGl4ZWxDZW50ZXJzLCBzaXplIH0gPSBhdHRycztcbiAgICBjb25zdCBbbmV3SGVpZ2h0LCBuZXdXaWR0aF0gPSBzaXplO1xuICAgIGNvbnN0IFtiYXRjaCwgb2xkSGVpZ2h0LCBvbGRXaWR0aCwgbnVtQ2hhbm5lbHNdID0gaW1hZ2VzLnNoYXBlO1xuICAgIGNvbnN0IG91dFNoYXBlID0gW2JhdGNoLCBuZXdIZWlnaHQsIG5ld1dpZHRoLCBudW1DaGFubmVsc107XG4gICAgbGV0IHhEYXRhID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGltYWdlcy5kYXRhSWQpO1xuICAgIGxldCBjYXN0ZWREYXRhO1xuICAgIGlmICh4RGF0YS5kdHlwZSAhPT0gJ2Zsb2F0MzInKSB7XG4gICAgICAgIGNhc3RlZERhdGEgPVxuICAgICAgICAgICAgY2FzdCh7IGJhY2tlbmQsIGlucHV0czogeyB4OiBpbWFnZXMgfSwgYXR0cnM6IHsgZHR5cGU6ICdmbG9hdDMyJyB9IH0pO1xuICAgICAgICB4RGF0YSA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChjYXN0ZWREYXRhLmRhdGFJZCk7XG4gICAgfVxuICAgIGNvbnN0IHhJZCA9IHhEYXRhLmlkO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChvdXRTaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICBpZiAodXRpbC5zaXplRnJvbVNoYXBlKGltYWdlcy5zaGFwZSkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgd2FzbVJlc2l6ZUJpbGluZWFyKHhJZCwgYmF0Y2gsIG9sZEhlaWdodCwgb2xkV2lkdGgsIG51bUNoYW5uZWxzLCBuZXdIZWlnaHQsIG5ld1dpZHRoLCBhbGlnbkNvcm5lcnMgPyAxIDogMCwgaGFsZlBpeGVsQ2VudGVycyA/IDEgOiAwLCBvdXRJZCk7XG4gICAgaWYgKGNhc3RlZERhdGEgIT0gbnVsbCkge1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VEYXRhKGNhc3RlZERhdGEuZGF0YUlkKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCByZXNpemVCaWxpbmVhckNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBSZXNpemVCaWxpbmVhcixcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogcmVzaXplQmlsaW5lYXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZXNpemVCaWxpbmVhci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBSZXZlcnNlLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGlkZW50aXR5IH0gZnJvbSAnLi9JZGVudGl0eSc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmxldCB3YXNtUmV2ZXJzZTtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtUmV2ZXJzZSA9IGJhY2tlbmQud2FzbS5jd3JhcChSZXZlcnNlLCBudWxsLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInIC8vIG91dF9pZFxuICAgIF0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJldmVyc2UoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGRpbXMgfSA9IGF0dHJzO1xuICAgIGNvbnN0IGF4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGRpbXMsIHguc2hhcGUpO1xuICAgIGlmICh4LnNoYXBlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gaWRlbnRpdHkoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kIH0pO1xuICAgIH1cbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoeC5zaGFwZSwgeC5kdHlwZSk7XG4gICAgY29uc3QgeElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHguZGF0YUlkKS5pZDtcbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBheGVzQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheShheGVzKS5idWZmZXIpO1xuICAgIGNvbnN0IG91dFNoYXBlQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheSh4LnNoYXBlKS5idWZmZXIpO1xuICAgIHdhc21SZXZlcnNlKHhJZCwgYXhlc0J5dGVzLCBheGVzLmxlbmd0aCwgb3V0U2hhcGVCeXRlcywgeC5zaGFwZS5sZW5ndGgsIG91dElkKTtcbiAgICBjb25zdCByZXNoYXBlZCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogb3V0IH0sIGF0dHJzOiB7IHNoYXBlOiB4LnNoYXBlIH0sIGJhY2tlbmQgfSk7XG4gICAgYmFja2VuZC5kaXNwb3NlRGF0YShvdXQuZGF0YUlkKTtcbiAgICByZXR1cm4gcmVzaGFwZWQ7XG59XG5leHBvcnQgY29uc3QgcmV2ZXJzZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBSZXZlcnNlLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAga2VybmVsRnVuYzogcmV2ZXJzZSxcbiAgICBzZXR1cEZ1bmM6IHNldHVwXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmV2ZXJzZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBSb3RhdGVXaXRoT2Zmc2V0IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGJhY2tlbmRfdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5sZXQgd2FzbVJvdGF0ZTtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtUm90YXRlID0gYmFja2VuZC53YXNtLmN3cmFwKFJvdGF0ZVdpdGhPZmZzZXQsIG51bGwgLyogdm9pZCAqLywgW1xuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICBdKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVXaXRoT2Zmc2V0KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBpbWFnZSB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgcmFkaWFucywgZmlsbFZhbHVlLCBjZW50ZXIgfSA9IGF0dHJzO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChpbWFnZS5zaGFwZSwgaW1hZ2UuZHR5cGUpO1xuICAgIGNvbnN0IGltYWdlSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoaW1hZ2UuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBbYmF0Y2gsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBudW1DaGFubmVsc10gPSBpbWFnZS5zaGFwZTtcbiAgICBjb25zdCBbY2VudGVyWCwgY2VudGVyWV0gPSBiYWNrZW5kX3V0aWwuZ2V0SW1hZ2VDZW50ZXIoY2VudGVyLCBpbWFnZUhlaWdodCwgaW1hZ2VXaWR0aCk7XG4gICAgY29uc3QgZmlsbElzQmxhY2sgPSBmaWxsVmFsdWUgPT09IDA7XG4gICAgY29uc3QgZnVsbE9wYWNpdHlWYWx1ZSA9IDI1NTtcbiAgICBjb25zdCBmaWxsVmFsdWVzID0gdHlwZW9mIGZpbGxWYWx1ZSA9PT0gJ251bWJlcicgP1xuICAgICAgICBbZmlsbFZhbHVlLCBmaWxsVmFsdWUsIGZpbGxWYWx1ZSwgZmlsbElzQmxhY2sgPyAwIDogZnVsbE9wYWNpdHlWYWx1ZV0gOlxuICAgICAgICBbLi4uZmlsbFZhbHVlLCBmdWxsT3BhY2l0eVZhbHVlXTtcbiAgICBjb25zdCBmaWxsQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheShmaWxsVmFsdWVzKS5idWZmZXIpO1xuICAgIHdhc21Sb3RhdGUoaW1hZ2VJZCwgYmF0Y2gsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBudW1DaGFubmVscywgcmFkaWFucywgY2VudGVyWCwgY2VudGVyWSwgZmlsbEJ5dGVzLCBmaWxsVmFsdWVzLmxlbmd0aCwgb3V0SWQpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3Qgcm90YXRlV2l0aE9mZnNldENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBSb3RhdGVXaXRoT2Zmc2V0LFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAga2VybmVsRnVuYzogcm90YXRlV2l0aE9mZnNldCxcbiAgICBzZXR1cEZ1bmM6IHNldHVwXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Um90YXRlV2l0aE9mZnNldC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBSb3VuZCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVVbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vdW5hcnlfa2VybmVsJztcbmV4cG9ydCBjb25zdCByb3VuZENvbmZpZyA9IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnKFJvdW5kKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJvdW5kLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFJzcXJ0IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi91bmFyeV9rZXJuZWwnO1xuZXhwb3J0IGNvbnN0IHJzcXJ0Q29uZmlnID0gY3JlYXRlVW5hcnlLZXJuZWxDb25maWcoUnNxcnQpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UnNxcnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgc2NhdHRlcl91dGlsLCBTY2F0dGVyTmQsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgQ3BwRFR5cGUgfSBmcm9tICcuL3R5cGVzJztcbmxldCB3YXNtU2NhdHRlck5kO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21TY2F0dGVyTmQgPSBiYWNrZW5kLndhc20uY3dyYXAoU2NhdHRlck5kLCBudWxsIC8qdm9pZCovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyAvLyBvdXRJZFxuICAgIF0pO1xufVxuZnVuY3Rpb24gc2NhdHRlck5kKGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGlucHV0cywgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBpbmRpY2VzLCB1cGRhdGVzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBzaGFwZSB9ID0gYXR0cnM7XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KHNoYXBlLCB1cGRhdGVzLmR0eXBlKTtcbiAgICBpZiAodXRpbC5zaXplRnJvbVNoYXBlKHNoYXBlKSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cbiAgICBjb25zdCB7IHNsaWNlUmFuaywgbnVtVXBkYXRlcywgc2xpY2VTaXplLCBzdHJpZGVzLCBvdXRwdXRTaXplIH0gPSBzY2F0dGVyX3V0aWwuY2FsY3VsYXRlU2hhcGVzKHVwZGF0ZXMsIGluZGljZXMsIHNoYXBlKTtcbiAgICBjb25zdCBpbmRpY2VzRGF0YSA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChpbmRpY2VzLmRhdGFJZCk7XG4gICAgY29uc3QgaW5kaWNlc0lkID0gaW5kaWNlc0RhdGEuaWQ7XG4gICAgY29uc3QgdXBkYXRlc0RhdGEgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQodXBkYXRlcy5kYXRhSWQpO1xuICAgIGNvbnN0IHVwZGF0ZXNJZCA9IHVwZGF0ZXNEYXRhLmlkO1xuICAgIGNvbnN0IHN0cmlkZXNCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KHN0cmlkZXMpLmJ1ZmZlcik7XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgd2FzbVNjYXR0ZXJOZChpbmRpY2VzSWQsIHVwZGF0ZXNJZCwgQ3BwRFR5cGVbdXBkYXRlcy5kdHlwZV0sIHNsaWNlUmFuaywgbnVtVXBkYXRlcywgc2xpY2VTaXplLCBzdHJpZGVzQnl0ZXMsIG91dHB1dFNpemUsIG91dElkKTtcbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IHNjYXR0ZXJOZENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTY2F0dGVyTmQsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IHNjYXR0ZXJOZFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNjYXR0ZXJOZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTZWxlY3QsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xubGV0IHdhc21TZWxlY3Q7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbVNlbGVjdCA9IGJhY2tlbmQud2FzbS5jd3JhcCgnU2VsZWN0VjInLCBudWxsLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICBdKTtcbn1cbmZ1bmN0aW9uIHNlbGVjdChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBjb25kaXRpb24sIHQsIGUgfSA9IGlucHV0cztcbiAgICBjb25zdCBjb25kaXRpb25JZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChjb25kaXRpb24uZGF0YUlkKS5pZDtcbiAgICBjb25zdCB0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQodC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IGVJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChlLmRhdGFJZCkuaWQ7XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KHQuc2hhcGUsIHQuZHR5cGUpO1xuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IGNSYW5rID0gY29uZGl0aW9uLnNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCB0UmFuayA9IHQuc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IG9mZnNldCA9IGNSYW5rID09PSAwIHx8IGNSYW5rID4gMSB8fCB0UmFuayA9PT0gMSA/XG4gICAgICAgIDEgOlxuICAgICAgICB1dGlsLnNpemVGcm9tU2hhcGUodC5zaGFwZS5zbGljZSgxKSk7XG4gICAgd2FzbVNlbGVjdChjb25kaXRpb25JZCwgdElkLCBlSWQsIG9mZnNldCwgb3V0SWQpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3Qgc2VsZWN0Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNlbGVjdCxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIGtlcm5lbEZ1bmM6IHNlbGVjdCxcbiAgICBzZXR1cEZ1bmM6IHNldHVwXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2VsZWN0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFNpZ21vaWQsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xubGV0IHdhc21GdW5jO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21GdW5jID0gYmFja2VuZC53YXNtLmN3cmFwKFNpZ21vaWQsIG51bGwgLyogdm9pZCAqLywgWydudW1iZXInLCAnbnVtYmVyJ10pO1xufVxuZnVuY3Rpb24gc2lnbW9pZChhcmdzKSB7XG4gICAgY29uc3QgeyBiYWNrZW5kLCBpbnB1dHM6IHsgeCB9IH0gPSBhcmdzO1xuICAgIGNvbnN0IHhJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh4LmRhdGFJZCkuaWQ7XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KHguc2hhcGUsIHguZHR5cGUpO1xuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIC8vIFNob3J0LWNpcmN1aXQgemVyby1zaXplZCB0ZW5zb3JzLlxuICAgIGlmICh1dGlsLnNpemVGcm9tU2hhcGUob3V0LnNoYXBlKSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cbiAgICB3YXNtRnVuYyh4SWQsIG91dElkKTtcbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IHNpZ21vaWRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogJ1NpZ21vaWQnLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiBzaWdtb2lkXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2lnbW9pZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTaW4gfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlVW5hcnlLZXJuZWxDb25maWcgfSBmcm9tICcuL3VuYXJ5X2tlcm5lbCc7XG5leHBvcnQgY29uc3Qgc2luQ29uZmlnID0gY3JlYXRlVW5hcnlLZXJuZWxDb25maWcoU2luKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNpbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTbGljZSwgc2xpY2VfdXRpbCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBzbGljZUltcGxDUFUgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmV4cG9ydCBmdW5jdGlvbiBzbGljZShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHM6IHsgeCB9LCBhdHRyczogeyBiZWdpbiwgc2l6ZSB9LCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IFtiZWdpbl8sIHNpemVfXSA9IHNsaWNlX3V0aWwucGFyc2VTbGljZVBhcmFtcyh4LCBiZWdpbiwgc2l6ZSk7XG4gICAgY29uc3QgaXNDb250aW5vdXMgPSBzbGljZV91dGlsLmlzU2xpY2VDb250aW5vdXMoeC5zaGFwZSwgYmVnaW5fLCBzaXplXyk7XG4gICAgY29uc3QgeFZhbHMgPSBiYWNrZW5kLnJlYWRTeW5jKHguZGF0YUlkKTtcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoc2l6ZV8sIHguZHR5cGUpO1xuICAgIGNvbnN0IHhTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyh4LnNoYXBlKTtcbiAgICBjb25zdCBvdXREYXRhID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpO1xuICAgIGlmIChpc0NvbnRpbm91cykge1xuICAgICAgICBjb25zdCBmbGF0T2Zmc2V0ID0gc2xpY2VfdXRpbC5jb21wdXRlRmxhdE9mZnNldChiZWdpbl8sIHhTdHJpZGVzKTtcbiAgICAgICAgaWYgKHguZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBvdXREYXRhLnN0cmluZ0J5dGVzID1cbiAgICAgICAgICAgICAgICB4VmFsc1xuICAgICAgICAgICAgICAgICAgICAuc2xpY2UoZmxhdE9mZnNldCwgZmxhdE9mZnNldCArIHV0aWwuc2l6ZUZyb21TaGFwZShzaXplXykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgb3V0VmFscyA9IGJhY2tlbmQudHlwZWRBcnJheUZyb21IZWFwKG91dCk7XG4gICAgICAgICAgICBvdXRWYWxzLnNldCh4VmFsc1xuICAgICAgICAgICAgICAgIC5zdWJhcnJheShmbGF0T2Zmc2V0LCBmbGF0T2Zmc2V0ICsgdXRpbC5zaXplRnJvbVNoYXBlKHNpemVfKSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuICAgIGlmICh4LmR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCByZXMgPSBzbGljZUltcGxDUFUoeFZhbHMsIGJlZ2luXywgc2l6ZV8sIHguc2hhcGUsIHguZHR5cGUpO1xuICAgICAgICBvdXREYXRhLnN0cmluZ0J5dGVzID0gcmVzO1xuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cbiAgICBjb25zdCBvdXRWYWxzID0gYmFja2VuZC50eXBlZEFycmF5RnJvbUhlYXAob3V0KTtcbiAgICBjb25zdCByYW5rID0geC5zaGFwZS5sZW5ndGg7XG4gICAgaWYgKHJhbmsgPT09IDIpIHtcbiAgICAgICAgc2xpY2UyZCh4VmFscywgeFN0cmlkZXNbMF0sIG91dFZhbHMsIGJlZ2luXywgc2l6ZV8pO1xuICAgIH1cbiAgICBlbHNlIGlmIChyYW5rID09PSAzKSB7XG4gICAgICAgIHNsaWNlM2QoeFZhbHMsIHhTdHJpZGVzWzBdLCB4U3RyaWRlc1sxXSwgb3V0VmFscywgYmVnaW5fLCBzaXplXyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHJhbmsgPT09IDQpIHtcbiAgICAgICAgc2xpY2U0ZCh4VmFscywgeFN0cmlkZXNbMF0sIHhTdHJpZGVzWzFdLCB4U3RyaWRlc1syXSwgb3V0VmFscywgYmVnaW5fLCBzaXplXyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCByZXMgPSBzbGljZUltcGxDUFUoeFZhbHMsIGJlZ2luXywgc2l6ZV8sIHguc2hhcGUsIHguZHR5cGUpO1xuICAgICAgICBvdXRWYWxzLnNldChyZXMpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xufVxuZnVuY3Rpb24gc2xpY2UyZCh4VmFscywgeFN0cmlkZSwgb3V0VmFscywgYmVnaW4sIHNpemUpIHtcbiAgICBsZXQgb3V0T2Zmc2V0ID0gMDtcbiAgICBjb25zdCBiZWdpbkkgPSBiZWdpblswXTtcbiAgICBjb25zdCBiZWdpbkogPSBiZWdpblsxXTtcbiAgICBjb25zdCBlbmRJID0gYmVnaW5JICsgc2l6ZVswXTtcbiAgICBmb3IgKGxldCBpID0gYmVnaW5JOyBpIDwgZW5kSTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHhPZmZzZXQgPSBpICogeFN0cmlkZSArIGJlZ2luSjtcbiAgICAgICAgb3V0VmFscy5zZXQoeFZhbHMuc3ViYXJyYXkoeE9mZnNldCwgeE9mZnNldCArIHNpemVbMV0pLCBvdXRPZmZzZXQpO1xuICAgICAgICBvdXRPZmZzZXQgKz0gc2l6ZVsxXTtcbiAgICB9XG59XG5mdW5jdGlvbiBzbGljZTNkKHhWYWxzLCB4U3RyaWRlMSwgeFN0cmlkZTIsIG91dFZhbHMsIGJlZ2luLCBzaXplKSB7XG4gICAgbGV0IG91dE9mZnNldCA9IDA7XG4gICAgY29uc3QgYmVnaW5JID0gYmVnaW5bMF07XG4gICAgY29uc3QgYmVnaW5KID0gYmVnaW5bMV07XG4gICAgY29uc3QgYmVnaW5LID0gYmVnaW5bMl07XG4gICAgY29uc3QgZW5kSSA9IGJlZ2luSSArIHNpemVbMF07XG4gICAgY29uc3QgZW5kSiA9IGJlZ2luSiArIHNpemVbMV07XG4gICAgZm9yIChsZXQgaSA9IGJlZ2luSTsgaSA8IGVuZEk7IGkrKykge1xuICAgICAgICBmb3IgKGxldCBqID0gYmVnaW5KOyBqIDwgZW5kSjsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCB4T2Zmc2V0ID0gaSAqIHhTdHJpZGUxICsgaiAqIHhTdHJpZGUyICsgYmVnaW5LO1xuICAgICAgICAgICAgb3V0VmFscy5zZXQoeFZhbHMuc3ViYXJyYXkoeE9mZnNldCwgeE9mZnNldCArIHNpemVbMl0pLCBvdXRPZmZzZXQpO1xuICAgICAgICAgICAgb3V0T2Zmc2V0ICs9IHNpemVbMl07XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBzbGljZTRkKHhWYWxzLCB4U3RyaWRlMSwgeFN0cmlkZTIsIHhTdHJpZGUzLCBvdXRWYWxzLCBiZWdpbiwgc2l6ZSkge1xuICAgIGxldCBvdXRPZmZzZXQgPSAwO1xuICAgIGNvbnN0IGJlZ2luSSA9IGJlZ2luWzBdO1xuICAgIGNvbnN0IGJlZ2luSiA9IGJlZ2luWzFdO1xuICAgIGNvbnN0IGJlZ2luSyA9IGJlZ2luWzJdO1xuICAgIGNvbnN0IGVuZEkgPSBiZWdpbkkgKyBzaXplWzBdO1xuICAgIGNvbnN0IGVuZEogPSBiZWdpbkogKyBzaXplWzFdO1xuICAgIGNvbnN0IGVuZEsgPSBiZWdpbksgKyBzaXplWzJdO1xuICAgIGNvbnN0IGJlZ2luTCA9IGJlZ2luWzNdO1xuICAgIGZvciAobGV0IGkgPSBiZWdpbkk7IGkgPCBlbmRJOyBpKyspIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IGJlZ2luSjsgaiA8IGVuZEo7IGorKykge1xuICAgICAgICAgICAgZm9yIChsZXQgayA9IGJlZ2luSzsgayA8IGVuZEs7IGsrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhPZmZzZXQgPSBpICogeFN0cmlkZTEgKyBqICogeFN0cmlkZTIgKyBrICogeFN0cmlkZTMgKyBiZWdpbkw7XG4gICAgICAgICAgICAgICAgb3V0VmFscy5zZXQoeFZhbHMuc3ViYXJyYXkoeE9mZnNldCwgeE9mZnNldCArIHNpemVbM10pLCBvdXRPZmZzZXQpO1xuICAgICAgICAgICAgICAgIG91dE9mZnNldCArPSBzaXplWzNdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IGNvbnN0IHNsaWNlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNsaWNlLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAga2VybmVsRnVuYzogc2xpY2UsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2xpY2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU29mdG1heCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5sZXQgd2FzbUZ1bmM7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbUZ1bmMgPSBiYWNrZW5kLndhc20uY3dyYXAoU29mdG1heCwgbnVsbCAvKiB2b2lkICovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInIC8vIGJhdGNoXG4gICAgXSk7XG59XG5mdW5jdGlvbiBzb2Z0bWF4KGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGlucHV0czogeyBsb2dpdHMgfSwgYXR0cnM6IHsgZGltIH0gfSA9IGFyZ3M7XG4gICAgY29uc3QgeElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGxvZ2l0cy5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChsb2dpdHMuc2hhcGUsIGxvZ2l0cy5kdHlwZSk7XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgY2hhbm5lbHMgPSBsb2dpdHMuc2hhcGVbZGltXTtcbiAgICBjb25zdCBiYXRjaCA9IHV0aWwuc2l6ZUZyb21TaGFwZShsb2dpdHMuc2hhcGUpIC8gY2hhbm5lbHM7XG4gICAgLy8gU2hvcnQtY2lyY3VpdCB6ZXJvLXNpemVkIHRlbnNvcnMuXG4gICAgaWYgKHV0aWwuc2l6ZUZyb21TaGFwZShvdXQuc2hhcGUpID09PSAwKSB7XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuICAgIHdhc21GdW5jKHhJZCwgb3V0SWQsIGNoYW5uZWxzLCBiYXRjaCk7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBzb2Z0bWF4Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNvZnRtYXgsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IHNvZnRtYXhcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Tb2Z0bWF4LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgU3BhY2VUb0JhdGNoTkQsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgcGFkVjJDb25maWcgfSBmcm9tICcuL1BhZFYyJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHsgdHJhbnNwb3NlIH0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuZnVuY3Rpb24gc3BhY2VUb0JhdGNoTkQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGJsb2NrU2hhcGUsIHBhZGRpbmdzIH0gPSBhdHRycztcbiAgICBjb25zdCBwcm9kID0gdXRpbC5zaXplRnJvbVNoYXBlKGJsb2NrU2hhcGUpO1xuICAgIGNvbnN0IGNvbXBsZXRlUGFkZGluZ3MgPSBbWzAsIDBdXTtcbiAgICBjb21wbGV0ZVBhZGRpbmdzLnB1c2goLi4ucGFkZGluZ3MpO1xuICAgIGZvciAobGV0IGkgPSAxICsgYmxvY2tTaGFwZS5sZW5ndGg7IGkgPCB4LnNoYXBlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbXBsZXRlUGFkZGluZ3MucHVzaChbMCwgMF0pO1xuICAgIH1cbiAgICBjb25zdCBwYWRkZWRYID0gcGFkVjJDb25maWcua2VybmVsRnVuYyh7XG4gICAgICAgIGlucHV0czogeyB4IH0sXG4gICAgICAgIGJhY2tlbmQsXG4gICAgICAgIGF0dHJzOiB7IHBhZGRpbmdzOiBjb21wbGV0ZVBhZGRpbmdzLCBjb25zdGFudFZhbHVlOiAwIH1cbiAgICB9KTtcbiAgICBjb25zdCByZXNoYXBlZFBhZGRlZFNoYXBlID0gYmFja2VuZF91dGlsLmdldFJlc2hhcGVkKHBhZGRlZFguc2hhcGUsIGJsb2NrU2hhcGUsIHByb2QsIGZhbHNlKTtcbiAgICBjb25zdCBwZXJtdXRlZFJlc2hhcGVkUGFkZGVkUGVybXV0YXRpb24gPSBiYWNrZW5kX3V0aWwuZ2V0UGVybXV0ZWQocmVzaGFwZWRQYWRkZWRTaGFwZS5sZW5ndGgsIGJsb2NrU2hhcGUubGVuZ3RoLCBmYWxzZSk7XG4gICAgY29uc3QgZmxhdHRlblNoYXBlID0gYmFja2VuZF91dGlsLmdldFJlc2hhcGVkUGVybXV0ZWQocGFkZGVkWC5zaGFwZSwgYmxvY2tTaGFwZSwgcHJvZCwgZmFsc2UpO1xuICAgIGNvbnN0IHJlc2hhcGVJbnB1dHMgPSB7IHg6IHBhZGRlZFggfTtcbiAgICBjb25zdCByZXNoYXBlQXR0cnMgPSB7IHNoYXBlOiByZXNoYXBlZFBhZGRlZFNoYXBlIH07XG4gICAgY29uc3QgcGFkZGVkWFJlc2hhcGVkID0gcmVzaGFwZSh7IGlucHV0czogcmVzaGFwZUlucHV0cywgYmFja2VuZCwgYXR0cnM6IHJlc2hhcGVBdHRycyB9KTtcbiAgICBjb25zdCB0cmFuc3Bvc2VJbnB1dHMgPSB7IHg6IHBhZGRlZFhSZXNoYXBlZCB9O1xuICAgIGNvbnN0IHRyYW5zcG9zZUF0dHJzID0geyBwZXJtOiBwZXJtdXRlZFJlc2hhcGVkUGFkZGVkUGVybXV0YXRpb24gfTtcbiAgICBjb25zdCBwYWRkZWRYVCA9IHRyYW5zcG9zZSh7IGlucHV0czogdHJhbnNwb3NlSW5wdXRzLCBiYWNrZW5kLCBhdHRyczogdHJhbnNwb3NlQXR0cnMgfSk7XG4gICAgY29uc3QgcmVzdWx0UmVzaGFwZUlucHV0cyA9IHsgeDogcGFkZGVkWFQgfTtcbiAgICBjb25zdCByZXN1bHRSZXNoYXBlQXR0cnMgPSB7IHNoYXBlOiBmbGF0dGVuU2hhcGUgfTtcbiAgICBjb25zdCByZXN1bHQgPSByZXNoYXBlKHsgaW5wdXRzOiByZXN1bHRSZXNoYXBlSW5wdXRzLCBiYWNrZW5kLCBhdHRyczogcmVzdWx0UmVzaGFwZUF0dHJzIH0pO1xuICAgIGJhY2tlbmQuZGlzcG9zZURhdGEocGFkZGVkWC5kYXRhSWQpO1xuICAgIGJhY2tlbmQuZGlzcG9zZURhdGEocGFkZGVkWFJlc2hhcGVkLmRhdGFJZCk7XG4gICAgYmFja2VuZC5kaXNwb3NlRGF0YShwYWRkZWRYVC5kYXRhSWQpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgY29uc3Qgc3BhY2VUb0JhdGNoTkRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU3BhY2VUb0JhdGNoTkQsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBrZXJuZWxGdW5jOiBzcGFjZVRvQmF0Y2hORFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNwYWNlVG9CYXRjaE5ELmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFNwbGl0ViwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgc2xpY2UgfSBmcm9tICcuL1NsaWNlJztcbmV4cG9ydCBmdW5jdGlvbiBzcGxpdFYoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBhdHRycywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IG51bU9yU2l6ZVNwbGl0cywgYXhpcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgJGF4aXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpWzBdO1xuICAgIGNvbnN0IHNwbGl0U2l6ZXMgPSBiYWNrZW5kX3V0aWwucHJlcGFyZVNwbGl0U2l6ZSh4LCBudW1PclNpemVTcGxpdHMsICRheGlzKTtcbiAgICBjb25zdCBiZWdpbiA9IG5ldyBBcnJheSh4LnNoYXBlLmxlbmd0aCkuZmlsbCgwKTtcbiAgICBjb25zdCBzaXplID0geC5zaGFwZS5zbGljZSgpO1xuICAgIHJldHVybiBzcGxpdFNpemVzLm1hcChzID0+IHtcbiAgICAgICAgY29uc3QgeFNsaWNlU2l6ZSA9IFsuLi5zaXplXTtcbiAgICAgICAgeFNsaWNlU2l6ZVskYXhpc10gPSBzO1xuICAgICAgICBjb25zdCB4U2xpY2UgPSBzbGljZSh7IGlucHV0czogeyB4IH0sIGF0dHJzOiB7IGJlZ2luLCBzaXplOiB4U2xpY2VTaXplIH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIGJlZ2luWyRheGlzXSArPSBzO1xuICAgICAgICByZXR1cm4geFNsaWNlO1xuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IHNwbGl0VkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTcGxpdFYsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBrZXJuZWxGdW5jOiBzcGxpdFZcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TcGxpdFYuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3FydCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVVbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vdW5hcnlfa2VybmVsJztcbmV4cG9ydCBjb25zdCBzcXJ0Q29uZmlnID0gY3JlYXRlVW5hcnlLZXJuZWxDb25maWcoU3FydCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TcXJ0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFNxdWFyZSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVVbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vdW5hcnlfa2VybmVsJztcbmV4cG9ydCBjb25zdCBzcXVhcmVDb25maWcgPSBjcmVhdGVVbmFyeUtlcm5lbENvbmZpZyhTcXVhcmUpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3F1YXJlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFNxdWFyZWREaWZmZXJlbmNlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vYmluYXJ5X2tlcm5lbCc7XG5jb25zdCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QgPSB0cnVlO1xuZXhwb3J0IGNvbnN0IHNxdWFyZWREaWZmZXJlbmNlQ29uZmlnID0gY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnKFNxdWFyZWREaWZmZXJlbmNlLCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3F1YXJlZERpZmZlcmVuY2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3RlcCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5sZXQgd2FzbVN0ZXA7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbVN0ZXAgPSBiYWNrZW5kLndhc20uY3dyYXAoU3RlcCwgbnVsbCAvKnZvaWQqLywgW1xuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgIF0pO1xufVxuZnVuY3Rpb24gc3RlcChhcmdzKSB7XG4gICAgY29uc3QgeyBiYWNrZW5kLCBpbnB1dHMsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgYWxwaGEgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHhJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh4LmRhdGFJZCkuaWQ7XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KHguc2hhcGUsIHguZHR5cGUpO1xuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIHdhc21TdGVwKHhJZCwgYWxwaGEsIG91dElkKTtcbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IHN0ZXBDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU3RlcCxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogc3RlcFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN0ZXAuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBTdHJpZGVkU2xpY2UsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQgeyBzbGljZSB9IGZyb20gJy4vU2xpY2UnO1xubGV0IHdhc21TdHJpZGVkU2xpY2U7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbVN0cmlkZWRTbGljZSA9IGJhY2tlbmQud2FzbS5jd3JhcChTdHJpZGVkU2xpY2UsIG51bGwgLyp2b2lkKi8sIFtcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgXSk7XG59XG5leHBvcnQgZnVuY3Rpb24gc3RyaWRlZFNsaWNlKGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGlucHV0cywgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgbGV0IHsgYmVnaW4sIGVuZCwgc3RyaWRlcyB9ID0gYXR0cnM7XG4gICAgaWYgKHN0cmlkZXMgPT0gbnVsbCkge1xuICAgICAgICBzdHJpZGVzID0gbmV3IEFycmF5KGJlZ2luLmxlbmd0aCk7XG4gICAgfVxuICAgIGNvbnN0IHsgYmVnaW5NYXNrLCBlbmRNYXNrLCBlbGxpcHNpc01hc2ssIG5ld0F4aXNNYXNrLCBzaHJpbmtBeGlzTWFzayB9ID0gYXR0cnM7XG4gICAgY29uc3QgZWxsaXBzaXNBeGVzID0gYmFja2VuZF91dGlsLnNsaWNlX3V0aWwubWFza1RvQXhlcyhlbGxpcHNpc01hc2spO1xuICAgIGlmIChlbGxpcHNpc0F4ZXMubGVuZ3RoID4gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ011bHRpcGxlIGVsbGlwc2VzIGluIHNsaWNlIGlzIG5vdCBhbGxvd2VkLicpO1xuICAgIH1cbiAgICBpZiAoZWxsaXBzaXNNYXNrICE9PSAwICYmIG5ld0F4aXNNYXNrICE9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVXNpbmcgYm90aCBlbGxpcHNpc01hc2sgYW5kIG5ld0F4aXNNYXNrIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLicpO1xuICAgIH1cbiAgICBpZiAoZWxsaXBzaXNNYXNrICE9PSAwICYmIHNocmlua0F4aXNNYXNrICE9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVXNpbmcgYm90aCBlbGxpcHNpc01hc2sgYW5kIHNocmlua0F4aXNNYXNrIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLicpO1xuICAgIH1cbiAgICBjb25zdCBudW1JbnRlcnBvbGF0ZWRBeGVzID0geC5zaGFwZS5sZW5ndGggLSBiZWdpbi5sZW5ndGg7XG4gICAgLy8gRXhwYW5kIHRoZSBkaW1zIG9mIHggYmFzZWQgb24gdGhlIG5ld0F4aXNNYXNrLlxuICAgIGNvbnN0IGV4cGFuZEF4ZXMgPSBiYWNrZW5kX3V0aWwuc2xpY2VfdXRpbC5tYXNrVG9BeGVzKG5ld0F4aXNNYXNrKTtcbiAgICBjb25zdCBuZXdTaGFwZSA9IHguc2hhcGUuc2xpY2UoKTtcbiAgICBleHBhbmRBeGVzLmZvckVhY2goYXhpcyA9PiB7XG4gICAgICAgIGJlZ2luW2F4aXNdID0gMDtcbiAgICAgICAgZW5kW2F4aXNdID0gMTtcbiAgICAgICAgbmV3U2hhcGUuc3BsaWNlKGF4aXMsIDAsIDEpO1xuICAgIH0pO1xuICAgIGNvbnN0IHhSZXNoYXBlZCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeCB9LCBhdHRyczogeyBzaGFwZTogbmV3U2hhcGUgfSwgYmFja2VuZCB9KTtcbiAgICBjb25zdCB7IGJlZ2luOiBub3JtYWxpemVkQmVnaW4sIGVuZDogbm9ybWFsaXplZEVuZCwgc3RyaWRlczogbm9ybWFsaXplZFN0cmlkZXMgfSA9IGJhY2tlbmRfdXRpbC5zbGljZV91dGlsLmdldE5vcm1hbGl6ZWRBeGVzKHhSZXNoYXBlZC5zaGFwZSwgZWxsaXBzaXNBeGVzLCBudW1JbnRlcnBvbGF0ZWRBeGVzLCBiZWdpbiwgZW5kLCBzdHJpZGVzLCBiZWdpbk1hc2ssIGVuZE1hc2ssIGVsbGlwc2lzTWFzayk7XG4gICAgYmVnaW4gPSBub3JtYWxpemVkQmVnaW47XG4gICAgZW5kID0gbm9ybWFsaXplZEVuZDtcbiAgICBzdHJpZGVzID0gbm9ybWFsaXplZFN0cmlkZXM7XG4gICAgY29uc3Qgc2hyaW5rQXhlcyA9IGJhY2tlbmRfdXRpbC5zbGljZV91dGlsLm1hc2tUb0F4ZXMoc2hyaW5rQXhpc01hc2spO1xuICAgIC8vIEFkanVzdCB0aGUgZW5kcyBiYXNlZCBvbiB0aGUgc2hyaW5rIG1hc2suXG4gICAgc2hyaW5rQXhlcy5mb3JFYWNoKGF4aXMgPT4ge1xuICAgICAgICBlbmRbYXhpc10gPSBiZWdpbltheGlzXSArIDE7XG4gICAgICAgIHN0cmlkZXNbYXhpc10gPSAxO1xuICAgIH0pO1xuICAgIC8vIEZpZ3VyZSBvdXQgdGhlIG91dHB1dCBzaGFwZS5cbiAgICBjb25zdCBzaXplID0gYmFja2VuZF91dGlsLnNsaWNlX3V0aWwuY29tcHV0ZU91dFNoYXBlKGJlZ2luLCBlbmQsIHN0cmlkZXMpO1xuICAgIC8vIFJlbW92ZSB0aGUgYXhlcyBiYXNlZCBvbiBzaHJpbmtNYXNrLlxuICAgIGNvbnN0IG91dFNoYXBlID0gc2l6ZS5maWx0ZXIoKF8sIGF4aXMpID0+IHNocmlua0F4ZXMuaW5kZXhPZihheGlzKSA9PT0gLTEpO1xuICAgIGNvbnN0IG5vblN0cmlkZWQgPSBzdHJpZGVzLmV2ZXJ5KHYgPT4gdiA9PT0gMSk7XG4gICAgaWYgKG5vblN0cmlkZWQpIHtcbiAgICAgICAgY29uc3QgeFNsaWNlZCA9IHNsaWNlKHsgaW5wdXRzOiB7IHg6IHhSZXNoYXBlZCB9LCBhdHRyczogeyBiZWdpbiwgc2l6ZSB9LCBiYWNrZW5kIH0pO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VEYXRhKHhSZXNoYXBlZC5kYXRhSWQpO1xuICAgICAgICBjb25zdCByZXNoYXBlZCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogeFNsaWNlZCB9LCBhdHRyczogeyBzaGFwZTogb3V0U2hhcGUgfSwgYmFja2VuZCB9KTtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlRGF0YSh4U2xpY2VkLmRhdGFJZCk7XG4gICAgICAgIHJldHVybiByZXNoYXBlZDtcbiAgICB9XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KG91dFNoYXBlLCAnZmxvYXQzMicpO1xuICAgIGlmICghb3V0U2hhcGUuc29tZShheGlzID0+IGF4aXMgPT09IDApKSB7XG4gICAgICAgIGNvbnN0IHhJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh4UmVzaGFwZWQuZGF0YUlkKS5pZDtcbiAgICAgICAgY29uc3QgeFN0cmlkZXNCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KHV0aWwuY29tcHV0ZVN0cmlkZXMoeFJlc2hhcGVkLnNoYXBlKSkuYnVmZmVyKTtcbiAgICAgICAgY29uc3QgYmVnaW5CeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KGJlZ2luKS5idWZmZXIpO1xuICAgICAgICBjb25zdCBlbmRCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KGVuZCkuYnVmZmVyKTtcbiAgICAgICAgY29uc3Qgc3RyaWRlc0J5dGVzID0gbmV3IFVpbnQ4QXJyYXkobmV3IEludDMyQXJyYXkoc3RyaWRlcykuYnVmZmVyKTtcbiAgICAgICAgY29uc3Qgb3V0cHV0U2hhcGVCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KG91dFNoYXBlKS5idWZmZXIpO1xuICAgICAgICBjb25zdCBvdXRTdHJpZGVzQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheSh1dGlsLmNvbXB1dGVTdHJpZGVzKG91dFNoYXBlKSkuYnVmZmVyKTtcbiAgICAgICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgICAgIHdhc21TdHJpZGVkU2xpY2UoeElkLCB4U3RyaWRlc0J5dGVzLCB4UmVzaGFwZWQuc2hhcGUubGVuZ3RoLCBiZWdpbkJ5dGVzLCBlbmRCeXRlcywgc3RyaWRlc0J5dGVzLCBvdXRwdXRTaGFwZUJ5dGVzLCBvdXRTdHJpZGVzQnl0ZXMsIG91dFNoYXBlLmxlbmd0aCwgb3V0SWQpO1xuICAgIH1cbiAgICBiYWNrZW5kLmRpc3Bvc2VEYXRhKHhSZXNoYXBlZC5kYXRhSWQpO1xuICAgIGNvbnN0IHJlc2hhcGVkID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiBvdXQgfSwgYXR0cnM6IHsgc2hhcGU6IG91dFNoYXBlIH0sIGJhY2tlbmQgfSk7XG4gICAgYmFja2VuZC5kaXNwb3NlRGF0YShvdXQuZGF0YUlkKTtcbiAgICByZXR1cm4gcmVzaGFwZWQ7XG59XG5leHBvcnQgY29uc3Qgc3RyaWRlZFNsaWNlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFN0cmlkZWRTbGljZSxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogc3RyaWRlZFNsaWNlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3RyaWRlZFNsaWNlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFN1YiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVCaW5hcnlLZXJuZWxDb25maWcgfSBmcm9tICcuL2JpbmFyeV9rZXJuZWwnO1xuY29uc3Qgc3VwcG9ydHNGdWxsQnJvYWRjYXN0ID0gdHJ1ZTtcbmV4cG9ydCBjb25zdCBzdWJDb25maWcgPSBjcmVhdGVCaW5hcnlLZXJuZWxDb25maWcoU3ViLCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3ViLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgU3VtLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHBlcm11dGVBeGVzQW5kVHJhbnNwb3NlIH0gZnJvbSAnLi9rZXJuZWxfdXRpbHMnO1xubGV0IHdhc21TdW07XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbVN1bSA9IGJhY2tlbmQud2FzbS5jd3JhcChTdW0sIG51bGwgLyp2b2lkKi8sIFsnbnVtYmVyLCBudW1iZXIsIG51bWJlciddKTtcbn1cbmZ1bmN0aW9uIHN1bShhcmdzKSB7XG4gICAgY29uc3QgeyBiYWNrZW5kLCBpbnB1dHMsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgYXhpcywga2VlcERpbXMgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHhJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh4LmRhdGFJZCkuaWQ7XG4gICAgbGV0IGlucHV0SWQgPSB4SWQ7XG4gICAgbGV0IGlucHV0ID0geDtcbiAgICBjb25zdCB7IHRyYW5zcG9zZWQsIGF4ZXMsIG9yaWdpbmFsQXhlcywgaW5wdXRXYXNUcmFuc3Bvc2VkIH0gPSBwZXJtdXRlQXhlc0FuZFRyYW5zcG9zZSh4LCBheGlzLCBiYWNrZW5kKTtcbiAgICBsZXQgcmVkdWN0aW9uQXhlcyA9IGF4ZXM7XG4gICAgaWYgKGlucHV0V2FzVHJhbnNwb3NlZCkge1xuICAgICAgICBjb25zdCB0cmFuc3Bvc2VkSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQodHJhbnNwb3NlZC5kYXRhSWQpLmlkO1xuICAgICAgICBpZiAodHJhbnNwb3NlZElkICE9PSB4SWQpIHtcbiAgICAgICAgICAgIC8vIHRyYW5zcG9zZSB3YXMgbm90IGEgbm8tb3AuIFdlIHdpbGwgbmVlZCB0byBkaXNwb3NlIG9mIHRoaXNcbiAgICAgICAgICAgIC8vIG9uY2Ugd2UgYXJlIGRvbmUuXG4gICAgICAgICAgICBpbnB1dCA9IHRyYW5zcG9zZWQ7XG4gICAgICAgICAgICBpbnB1dElkID0gdHJhbnNwb3NlZElkO1xuICAgICAgICAgICAgcmVkdWN0aW9uQXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRJbm5lck1vc3RBeGVzKHJlZHVjdGlvbkF4ZXMubGVuZ3RoLCBpbnB1dC5zaGFwZS5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGJhY2tlbmRfdXRpbC5hc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcygnc3VtJywgcmVkdWN0aW9uQXhlcywgaW5wdXQuc2hhcGUubGVuZ3RoKTtcbiAgICBjb25zdCBbb3V0U2hhcGUsIHJlZHVjZVNoYXBlXSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKGlucHV0LnNoYXBlLCByZWR1Y3Rpb25BeGVzKTtcbiAgICBjb25zdCByZWR1Y2VTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQob3V0U2hhcGUsIGlucHV0LmR0eXBlKTtcbiAgICBpZiAodXRpbC5zaXplRnJvbVNoYXBlKGlucHV0LnNoYXBlKSAhPT0gMCkge1xuICAgICAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICAgICAgd2FzbVN1bShpbnB1dElkLCByZWR1Y2VTaXplLCBvdXRJZCk7XG4gICAgfVxuICAgIGlmIChpbnB1dFdhc1RyYW5zcG9zZWQpIHtcbiAgICAgICAgLy8gZGlzcG9zZSBvZiB0aGUgdHJhbnNwb3NlZCB0ZW5zb3IuXG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZURhdGEodHJhbnNwb3NlZC5kYXRhSWQpO1xuICAgIH1cbiAgICBpZiAoa2VlcERpbXMpIHtcbiAgICAgICAgLy8gcmVzaGFwZVxuICAgICAgICBjb25zdCBuZXdTaGFwZSA9IGJhY2tlbmRfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbShvdXQuc2hhcGUsIG9yaWdpbmFsQXhlcyk7XG4gICAgICAgIG91dC5zaGFwZSA9IG5ld1NoYXBlO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IHN1bUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTdW0sXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IHN1bVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN1bS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBUYW4gfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlVW5hcnlLZXJuZWxDb25maWcgfSBmcm9tICcuL3VuYXJ5X2tlcm5lbCc7XG5leHBvcnQgY29uc3QgdGFuQ29uZmlnID0gY3JlYXRlVW5hcnlLZXJuZWxDb25maWcoVGFuKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRhbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBUYW5oIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi91bmFyeV9rZXJuZWwnO1xuZXhwb3J0IGNvbnN0IHRhbmhDb25maWcgPSBjcmVhdGVVbmFyeUtlcm5lbENvbmZpZyhUYW5oKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRhbmguanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgVGlsZSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBDcHBEVHlwZSB9IGZyb20gJy4vdHlwZXMnO1xubGV0IHdhc21UaWxlO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21UaWxlID0gYmFja2VuZC53YXNtLmN3cmFwKFRpbGUsIG51bGwgLyogdm9pZCAqLywgW1xuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyAvLyBvdXRfaWRcbiAgICBdKTtcbn1cbmZ1bmN0aW9uIHRpbGUoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB4SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IHsgcmVwcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgbmV3U2hhcGUgPSBuZXcgQXJyYXkoeC5zaGFwZS5sZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3U2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbmV3U2hhcGVbaV0gPSB4LnNoYXBlW2ldICogcmVwc1tpXTtcbiAgICB9XG4gICAgY29uc3QgeFNoYXBlQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheSh4LnNoYXBlKS5idWZmZXIpO1xuICAgIGNvbnN0IG5ld1NoYXBlQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheShuZXdTaGFwZSkuYnVmZmVyKTtcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQobmV3U2hhcGUsIHguZHR5cGUpO1xuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIHdhc21UaWxlKHhJZCwgeFNoYXBlQnl0ZXMsIHguc2hhcGUubGVuZ3RoLCBuZXdTaGFwZUJ5dGVzLCBuZXdTaGFwZS5sZW5ndGgsIENwcERUeXBlW291dC5kdHlwZV0sIG91dElkKTtcbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IHRpbGVDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogVGlsZSxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogdGlsZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRpbGUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgVG9wSyB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBDcHBEVHlwZSB9IGZyb20gJy4vdHlwZXMnO1xubGV0IHdhc21Ub3BLO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21Ub3BLID0gYmFja2VuZC53YXNtLmN3cmFwKFRvcEssIG51bGwgLyogdm9pZCAqLywgW1xuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2Jvb2wnLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgXSk7XG59XG5leHBvcnQgY29uc3QgdG9wayA9ICh7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSkgPT4ge1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgaywgc29ydGVkIH0gPSBhdHRycztcbiAgICBjb25zdCB4SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IHhTaGFwZUJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobmV3IEludDMyQXJyYXkoeC5zaGFwZSkuYnVmZmVyKTtcbiAgICBjb25zdCBvdXRwdXRTaGFwZSA9IHguc2hhcGUuc2xpY2UoKTtcbiAgICBvdXRwdXRTaGFwZVtvdXRwdXRTaGFwZS5sZW5ndGggLSAxXSA9IGs7XG4gICAgY29uc3Qgb3V0VmFsdWVzID0gYmFja2VuZC5tYWtlT3V0cHV0KG91dHB1dFNoYXBlLCB4LmR0eXBlKTtcbiAgICBjb25zdCBvdXRWYWx1ZXNJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXRWYWx1ZXMuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBvdXRJbmRpY2VzID0gYmFja2VuZC5tYWtlT3V0cHV0KG91dHB1dFNoYXBlLCAnaW50MzInKTtcbiAgICBjb25zdCBvdXRJbmRpY2VzSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0SW5kaWNlcy5kYXRhSWQpLmlkO1xuICAgIHdhc21Ub3BLKHhJZCwgeFNoYXBlQnl0ZXMsIHguc2hhcGUubGVuZ3RoLCBDcHBEVHlwZVt4LmR0eXBlXSwgaywgc29ydGVkLCBvdXRWYWx1ZXNJZCwgb3V0SW5kaWNlc0lkKTtcbiAgICByZXR1cm4gW291dFZhbHVlcywgb3V0SW5kaWNlc107XG59O1xuZXhwb3J0IGNvbnN0IHRvcEtDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogVG9wSyxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogdG9wayxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ub3BLLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFRyYW5zZm9ybSwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5sZXQgd2FzbVRyYW5zZm9ybTtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtVHJhbnNmb3JtID0gYmFja2VuZC53YXNtLmN3cmFwKFRyYW5zZm9ybSwgbnVsbCAvKnZvaWQqLywgW1xuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdib29sJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInIC8vIG91dElkXG4gICAgXSk7XG59XG5mdW5jdGlvbiB0cmFuc2Zvcm0oYXJncykge1xuICAgIGNvbnN0IHsgYmFja2VuZCwgaW5wdXRzLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGltYWdlLCB0cmFuc2Zvcm1zIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBpbnRlcnBvbGF0aW9uLCBmaWxsTW9kZSwgZmlsbFZhbHVlLCBvdXRwdXRTaGFwZSB9ID0gYXR0cnM7XG4gICAgY29uc3QgW2JhdGNoLCBpbWFnZUhlaWdodCwgaW1hZ2VXaWR0aCwgbnVtQ2hhbm5lbHNdID0gaW1hZ2Uuc2hhcGU7XG4gICAgY29uc3QgW291dEhlaWdodCwgb3V0V2lkdGhdID0gb3V0cHV0U2hhcGUgIT0gbnVsbCA/IG91dHB1dFNoYXBlIDogW2ltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoXTtcbiAgICBjb25zdCBvdXRTaGFwZSA9IFtiYXRjaCwgb3V0SGVpZ2h0LCBvdXRXaWR0aCxcbiAgICAgICAgbnVtQ2hhbm5lbHNdO1xuICAgIGNvbnN0IHN0cmlkZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheSh1dGlsLmNvbXB1dGVTdHJpZGVzKGltYWdlLnNoYXBlKSkuYnVmZmVyKTtcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQob3V0U2hhcGUsIGltYWdlLmR0eXBlKTtcbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBpbWFnZURhdGEgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoaW1hZ2UuZGF0YUlkKTtcbiAgICBjb25zdCBpbWFnZUlkID0gaW1hZ2VEYXRhLmlkO1xuICAgIGNvbnN0IHRyYW5zZm9ybXNEYXRhID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHRyYW5zZm9ybXMuZGF0YUlkKTtcbiAgICBjb25zdCB0cmFuc2Zvcm1zSWQgPSB0cmFuc2Zvcm1zRGF0YS5pZDtcbiAgICBjb25zdCBpbnRlcnBvbGF0aW9uTW9kZUlkID0gaW50ZXJwb2xhdGlvbiA9PT0gJ25lYXJlc3QnID8gMSA6IDI7XG4gICAgbGV0IGZpbGxNb2RlSWQ7XG4gICAgc3dpdGNoIChmaWxsTW9kZSkge1xuICAgICAgICBjYXNlICdjb25zdGFudCc6XG4gICAgICAgICAgICBmaWxsTW9kZUlkID0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdyZWZsZWN0JzpcbiAgICAgICAgICAgIGZpbGxNb2RlSWQgPSAyO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3dyYXAnOlxuICAgICAgICAgICAgZmlsbE1vZGVJZCA9IDM7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbmVhcmVzdCc6XG4gICAgICAgICAgICBmaWxsTW9kZUlkID0gNDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgZmlsbE1vZGVJZCA9IDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgd2FzbVRyYW5zZm9ybShpbWFnZUlkLCB0cmFuc2Zvcm1zSWQsICh0cmFuc2Zvcm1zLnNoYXBlWzBdID4gMSksIGJhdGNoLCBvdXRIZWlnaHQsIG91dFdpZHRoLCBudW1DaGFubmVscywgaW1hZ2VXaWR0aCwgaW1hZ2VIZWlnaHQsIHN0cmlkZXMsIGltYWdlLnNoYXBlLmxlbmd0aCAtIDEsIGludGVycG9sYXRpb25Nb2RlSWQsIGZpbGxNb2RlSWQsIGZpbGxWYWx1ZSwgb3V0SWQpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgdHJhbnNmb3JtQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFRyYW5zZm9ybSxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogdHJhbnNmb3JtXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VHJhbnNmb3JtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFRyYW5zcG9zZSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBpZGVudGl0eSB9IGZyb20gJy4vSWRlbnRpdHknO1xuaW1wb3J0IHsgQ3BwRFR5cGUgfSBmcm9tICcuL3R5cGVzJztcbmxldCB3YXNtVHJhbnNwb3NlO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21UcmFuc3Bvc2UgPSBiYWNrZW5kLndhc20uY3dyYXAoVHJhbnNwb3NlLCBudWxsIC8qIHZvaWQgKi8sIFtcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdudW1iZXInLFxuICAgIF0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zcG9zZShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIC8vIFJlZHVjZSBhbnkgZGltZW5zaW9ucyB3aXRoIHNpemUgb25lLiBMb3dlci1yYW5rIHRyYW5zcG9zZSBrZXJuZWwgcGVyZm9ybXNcbiAgICAvLyBiZXR0ZXIgZHVlIHRvIHNpbXBsZXIgbWVtb3J5IGFjY2VzcyBwYXR0ZXJuLlxuICAgIGNvbnN0IFtyZWR1Y2VkU2hhcGUsIHBlcm1dID0gcmVtb3ZlT25lU2l6ZURpbXMoaW5wdXRzLnguc2hhcGUsIGF0dHJzLnBlcm0pO1xuICAgIGxldCBwZXJtSXNOb09wID0gdHJ1ZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBlcm0ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHBlcm1baV0gIT09IGkpIHtcbiAgICAgICAgICAgIHBlcm1Jc05vT3AgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBvdXRTaGFwZSA9IGNvbXB1dGVPdXRTaGFwZShpbnB1dHMueC5zaGFwZSwgYXR0cnMucGVybSk7XG4gICAgY29uc3QgeCA9IHtcbiAgICAgICAgZGF0YUlkOiBpbnB1dHMueC5kYXRhSWQsXG4gICAgICAgIHNoYXBlOiByZWR1Y2VkU2hhcGUsXG4gICAgICAgIGR0eXBlOiBpbnB1dHMueC5kdHlwZVxuICAgIH07XG4gICAgaWYgKHBlcm1Jc05vT3ApIHtcbiAgICAgICAgY29uc3QgY2xvbmVkID0gaWRlbnRpdHkoeyBpbnB1dHMsIGJhY2tlbmQgfSk7XG4gICAgICAgIGNsb25lZC5zaGFwZSA9IG91dFNoYXBlO1xuICAgICAgICByZXR1cm4gY2xvbmVkO1xuICAgIH1cbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQob3V0U2hhcGUsIHguZHR5cGUpO1xuICAgIGNvbnN0IHhJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh4LmRhdGFJZCkuaWQ7XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgcGVybUJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobmV3IEludDMyQXJyYXkocGVybSkuYnVmZmVyKTtcbiAgICBjb25zdCB4U2hhcGVCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KHguc2hhcGUpLmJ1ZmZlcik7XG4gICAgd2FzbVRyYW5zcG9zZSh4SWQsIHhTaGFwZUJ5dGVzLCB4LnNoYXBlLmxlbmd0aCwgQ3BwRFR5cGVbeC5kdHlwZV0sIG91dElkLCBwZXJtQnl0ZXMsIHBlcm0ubGVuZ3RoKTtcbiAgICByZXR1cm4gb3V0O1xufVxuZnVuY3Rpb24gY29tcHV0ZU91dFNoYXBlKGluU2hhcGUsIHBlcm0pIHtcbiAgICBjb25zdCBvdXRTaGFwZSA9IG5ldyBBcnJheShpblNoYXBlLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRTaGFwZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBvdXRTaGFwZVtpXSA9IGluU2hhcGVbcGVybVtpXV07XG4gICAgfVxuICAgIHJldHVybiBvdXRTaGFwZTtcbn1cbmZ1bmN0aW9uIHJlbW92ZU9uZVNpemVEaW1zKHNoYXBlLCBwZXJtKSB7XG4gICAgY29uc3QgbmV3U2hhcGUgPSBbXTtcbiAgICBjb25zdCBuZXdQZXJtID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaGFwZS5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAoc2hhcGVbaV0gIT09IDEpIHtcbiAgICAgICAgICAgIG5ld1NoYXBlLnB1c2goc2hhcGVbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaGFwZVtwZXJtW2ldXSAhPT0gMSkge1xuICAgICAgICAgICAgbmV3UGVybS5wdXNoKHBlcm1baV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3UGVybS5sZW5ndGg7ICsraSkge1xuICAgICAgICBsZXQgbWluVmFsSWR4ID0gLTE7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbmV3UGVybS5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgaWYgKG5ld1Blcm1bal0gPj0gaSAmJlxuICAgICAgICAgICAgICAgIChtaW5WYWxJZHggPT09IC0xIHx8IG5ld1Blcm1bbWluVmFsSWR4XSA+IG5ld1Blcm1bal0pKSB7XG4gICAgICAgICAgICAgICAgbWluVmFsSWR4ID0gajtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBuZXdQZXJtW21pblZhbElkeF0gPSBpO1xuICAgIH1cbiAgICByZXR1cm4gW25ld1NoYXBlLCBuZXdQZXJtXTtcbn1cbmV4cG9ydCBjb25zdCB0cmFuc3Bvc2VDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogVHJhbnNwb3NlLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAga2VybmVsRnVuYzogdHJhbnNwb3NlLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VHJhbnNwb3NlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFVucGFjayB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBzbGljZSB9IGZyb20gJy4vU2xpY2UnO1xuZnVuY3Rpb24gdW5wYWNrKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB2YWx1ZSB9ID0gaW5wdXRzO1xuICAgIGxldCB7IGF4aXMgfSA9IGF0dHJzO1xuICAgIGlmIChheGlzIDwgMCkge1xuICAgICAgICBheGlzICs9IHZhbHVlLnNoYXBlLmxlbmd0aDtcbiAgICB9XG4gICAgY29uc3QgbnVtT3V0cHV0cyA9IHZhbHVlLnNoYXBlW2F4aXNdO1xuICAgIGNvbnN0IHJhbmsgPSB2YWx1ZS5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3Qgb3V0U2hhcGUgPSBuZXcgQXJyYXkocmFuayAtIDEpO1xuICAgIGxldCBvdXRJbmRleCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5rOyBpKyspIHtcbiAgICAgICAgaWYgKGkgIT09IGF4aXMpIHtcbiAgICAgICAgICAgIG91dFNoYXBlW291dEluZGV4KytdID0gdmFsdWUuc2hhcGVbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgb3V0cyA9IG5ldyBBcnJheShudW1PdXRwdXRzKTtcbiAgICBjb25zdCBiZWdpbiA9IG5ldyBBcnJheShyYW5rKS5maWxsKDApO1xuICAgIGNvbnN0IHNpemUgPSB2YWx1ZS5zaGFwZS5zbGljZSgpO1xuICAgIHNpemVbYXhpc10gPSAxO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBiZWdpbltheGlzXSA9IGk7XG4gICAgICAgIG91dHNbaV0gPSBzbGljZSh7IGlucHV0czogeyB4OiB2YWx1ZSB9LCBhdHRyczogeyBiZWdpbiwgc2l6ZSB9LCBiYWNrZW5kIH0pO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cy5tYXAoKHsgZGF0YUlkLCBkdHlwZSB9KSA9PiAoeyBkYXRhSWQsIGR0eXBlLCBzaGFwZTogb3V0U2hhcGUgfSkpO1xufVxuZXhwb3J0IGNvbnN0IHVucGFja0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBVbnBhY2ssXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBrZXJuZWxGdW5jOiB1bnBhY2ssXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VW5wYWNrLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFplcm9zTGlrZSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5mdW5jdGlvbiB6ZXJvc0xpa2UoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoeC5zaGFwZSwgeC5kdHlwZSk7XG4gICAgY29uc3Qgb3V0VmFscyA9IGJhY2tlbmQudHlwZWRBcnJheUZyb21IZWFwKG91dCk7XG4gICAgb3V0VmFscy5maWxsKDApO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgemVyb3NMaWtlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFplcm9zTGlrZSxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIGtlcm5lbEZ1bmM6IHplcm9zTGlrZSxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1aZXJvc0xpa2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgX0Z1c2VkTWF0TXVsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IEZ1c2FibGVBY3RpdmF0aW9uIH0gZnJvbSAnLi90eXBlcyc7XG5sZXQgd2FzbUZ1c2VkTWF0TXVsO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21GdXNlZE1hdE11bCA9IGJhY2tlbmQud2FzbS5jd3JhcChfRnVzZWRNYXRNdWwsIG51bGwgLyogdm9pZCAqLywgW1xuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicgLy8gb3V0X2lkXG4gICAgXSk7XG59XG5mdW5jdGlvbiBmdXNlZEJhdGNoTWF0TXVsKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBhLCBiLCBiaWFzLCBwcmVsdUFjdGl2YXRpb25XZWlnaHRzIH0gPSBpbnB1dHM7XG4gICAgaWYgKGEuZHR5cGUgIT09ICdmbG9hdDMyJyB8fCBiLmR0eXBlICE9PSAnZmxvYXQzMicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBfRnVzZWRNYXRNdWwgZm9yIG5vbiBub24tZmxvYXQzMiB0ZW5zb3JzIG5vdCB5ZXQgc3VwcG9ydGVkLmApO1xuICAgIH1cbiAgICBjb25zdCB7IHRyYW5zcG9zZUEsIHRyYW5zcG9zZUIsIGFjdGl2YXRpb24sIGxlYWt5cmVsdUFscGhhIH0gPSBhdHRycztcbiAgICBjb25zdCBhSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoYS5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IGJJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChiLmRhdGFJZCkuaWQ7XG4gICAgbGV0IGJpYXNJZCA9IDA7XG4gICAgaWYgKGJpYXMgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBiaWFzRGF0YSA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChiaWFzLmRhdGFJZCk7XG4gICAgICAgIGlmIChiaWFzRGF0YS5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgX0Z1c2VkTWF0TXVsIG9ubHkgc3VwcG9ydHMgcmFuay0xIGJpYXMgYnV0IGdvdCBgICtcbiAgICAgICAgICAgICAgICBgcmFuayAke2JpYXNEYXRhLnNoYXBlLmxlbmd0aH0uYCk7XG4gICAgICAgIH1cbiAgICAgICAgYmlhc0lkID0gYmlhc0RhdGEuaWQ7XG4gICAgfVxuICAgIGNvbnN0IHByZWx1QWN0aXZhdGlvbldlaWdodHNJZCA9IHByZWx1QWN0aXZhdGlvbldlaWdodHMgPT0gbnVsbCA/XG4gICAgICAgIDAgOlxuICAgICAgICBiYWNrZW5kLmRhdGFJZE1hcC5nZXQocHJlbHVBY3RpdmF0aW9uV2VpZ2h0cy5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IGZ1c2VkQWN0aXZhdGlvbiA9IEZ1c2FibGVBY3RpdmF0aW9uW2FjdGl2YXRpb25dO1xuICAgIGlmIChmdXNlZEFjdGl2YXRpb24gPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7YWN0aXZhdGlvbn0gYWN0aXZhdGlvbiBub3QgeWV0IHN1cHBvcnRlZCBmb3IgRnVzZWRDb252MkQgYCArXG4gICAgICAgICAgICBgaW4gdGhlIHdhc20gYmFja2VuZC5gKTtcbiAgICB9XG4gICAgY29uc3QgbGVmdERpbSA9IHRyYW5zcG9zZUEgPyBhLnNoYXBlWzJdIDogYS5zaGFwZVsxXTtcbiAgICBjb25zdCByaWdodERpbSA9IHRyYW5zcG9zZUIgPyBiLnNoYXBlWzFdIDogYi5zaGFwZVsyXTtcbiAgICBjb25zdCBiYXRjaERpbSA9IGEuc2hhcGVbMF07XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KFtiYXRjaERpbSwgbGVmdERpbSwgcmlnaHREaW1dLCBhLmR0eXBlKTtcbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBhU2hhcGVCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KGEuc2hhcGUpLmJ1ZmZlcik7XG4gICAgY29uc3QgYlNoYXBlQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheShiLnNoYXBlKS5idWZmZXIpO1xuICAgIHdhc21GdXNlZE1hdE11bChhSWQsIGFTaGFwZUJ5dGVzLCBhLnNoYXBlLmxlbmd0aCwgYklkLCBiU2hhcGVCeXRlcywgYi5zaGFwZS5sZW5ndGgsIHRyYW5zcG9zZUEsIHRyYW5zcG9zZUIsIGZ1c2VkQWN0aXZhdGlvbiwgYmlhc0lkLCBwcmVsdUFjdGl2YXRpb25XZWlnaHRzSWQsIGxlYWt5cmVsdUFscGhhIHx8IDAsIG91dElkKTtcbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IGZ1c2VkTWF0TXVsQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IF9GdXNlZE1hdE11bCxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogZnVzZWRCYXRjaE1hdE11bFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPV9GdXNlZE1hdE11bC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgQ3BwRFR5cGUgfSBmcm9tICcuL3R5cGVzJztcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCaW5hcnlLZXJuZWxDb25maWcoa2VybmVsTmFtZSwgc3VwcG9ydHNGdWxsQnJvYWRjYXN0LCBkdHlwZSkge1xuICAgIGxldCB3YXNtRnVuYztcbiAgICBmdW5jdGlvbiBzZXR1cEZ1bmMoYmFja2VuZCkge1xuICAgICAgICB3YXNtRnVuYyA9IGJhY2tlbmQud2FzbS5jd3JhcChrZXJuZWxOYW1lLCBudWxsIC8qIHZvaWQgKi8sIFtcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnYXJyYXknLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInIC8vIG91dF9pZFxuICAgICAgICBdKTtcbiAgICB9XG4gICAgZnVuY3Rpb24ga2VybmVsRnVuYyhhcmdzKSB7XG4gICAgICAgIGNvbnN0IHsgYmFja2VuZCwgaW5wdXRzIH0gPSBhcmdzO1xuICAgICAgICBjb25zdCB7IGEsIGIgfSA9IGlucHV0cztcbiAgICAgICAgY29uc3QgYUlkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGEuZGF0YUlkKS5pZDtcbiAgICAgICAgY29uc3QgYklkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGIuZGF0YUlkKS5pZDtcbiAgICAgICAgY29uc3Qgb3V0cHV0VHlwZSA9IGR0eXBlICE9IG51bGwgPyBkdHlwZSA6IGEuZHR5cGU7XG4gICAgICAgIGNvbnN0IG5ld1NoYXBlID0gYmFja2VuZF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKGEuc2hhcGUsIGIuc2hhcGUpO1xuICAgICAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQobmV3U2hhcGUsIG91dHB1dFR5cGUpO1xuICAgICAgICAvLyBTaG9ydC1jaXJjdWl0IHplcm8tc2l6ZWQgdGVuc29ycy5cbiAgICAgICAgaWYgKHV0aWwuc2l6ZUZyb21TaGFwZShuZXdTaGFwZSkgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBvdXQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYVNoYXBlQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheShhLnNoYXBlKS5idWZmZXIpO1xuICAgICAgICBjb25zdCBiU2hhcGVCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KGIuc2hhcGUpLmJ1ZmZlcik7XG4gICAgICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgICAgICBjb25zdCBrZXJuZWxGdW5jID0gKCkgPT4gd2FzbUZ1bmMoYUlkLCBhU2hhcGVCeXRlcywgYS5zaGFwZS5sZW5ndGgsIGJJZCwgYlNoYXBlQnl0ZXMsIGIuc2hhcGUubGVuZ3RoLCBDcHBEVHlwZVthLmR0eXBlXSwgb3V0SWQpO1xuICAgICAgICAvLyBDdXJyZW50bHkgb25seSBzb21lIGZsb2F0IG9wZXJhdGlvbnMgc3VwcG9ydCBmdWxsIGJyb2FkY2FzdC5cbiAgICAgICAgaWYgKHN1cHBvcnRzRnVsbEJyb2FkY2FzdCAmJiBhLmR0eXBlID09PSAnZmxvYXQzMicpIHtcbiAgICAgICAgICAgIGtlcm5lbEZ1bmMoKTtcbiAgICAgICAgICAgIHJldHVybiBvdXQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYUJyb2FkY2FzdERpbXMgPSBiYWNrZW5kX3V0aWwuZ2V0QnJvYWRjYXN0RGltcyhhLnNoYXBlLCBuZXdTaGFwZSk7XG4gICAgICAgIGNvbnN0IGJCcm9hZGNhc3REaW1zID0gYmFja2VuZF91dGlsLmdldEJyb2FkY2FzdERpbXMoYi5zaGFwZSwgbmV3U2hhcGUpO1xuICAgICAgICBjb25zdCBsb29wc092ZXJBbGxPZkEgPSBhQnJvYWRjYXN0RGltcy5ldmVyeSgodiwgaSkgPT4gdiA9PT0gaSk7XG4gICAgICAgIGNvbnN0IGxvb3BzT3ZlckFsbE9mQiA9IGJCcm9hZGNhc3REaW1zLmV2ZXJ5KCh2LCBpKSA9PiB2ID09PSBpKTtcbiAgICAgICAgaWYgKGxvb3BzT3ZlckFsbE9mQSAmJiBsb29wc092ZXJBbGxPZkIpIHtcbiAgICAgICAgICAgIGtlcm5lbEZ1bmMoKTtcbiAgICAgICAgICAgIHJldHVybiBvdXQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJyb2FkY2FzdGluZyBhbG9uZyBvdXRlciBkaW1zIGlzIG5vdCB5ZXQgYCArXG4gICAgICAgICAgICAgICAgYHN1cHBvcnRlZCBmb3IgJHthLmR0eXBlfSAke2tlcm5lbE5hbWV9LmApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGtlcm5lbE5hbWUsIGJhY2tlbmROYW1lOiAnd2FzbScsIHNldHVwRnVuYywga2VybmVsRnVuYyB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmluYXJ5X2tlcm5lbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdHJhbnNwb3NlIH0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuLyoqXG4gKiBDb21wdXRlIHBlcm11dGF0aW9uIGF4ZXMgYW5kIGRvIGEgdHJhbnNwb3NlIGlmIG5lY2Vzc2FyeS5cbiAqXG4gKiBVc2VkIGJ5IHJlZHVjdGlvbiBvcHMuXG4gKiBAcGFyYW0geCBpbnB1dCBUZW5zb3JJbmZvXG4gKiBAcGFyYW0gYXhpcyByZWR1Y3Rpb24gYXhlc1xuICogQHBhcmFtIGJhY2tlbmQgd2FzbSBiYWNrZW5kIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwZXJtdXRlQXhlc0FuZFRyYW5zcG9zZSh4LCBheGlzLCBiYWNrZW5kKSB7XG4gICAgY29uc3QgeFNoYXBlID0geC5zaGFwZTtcbiAgICBjb25zdCB4UmFuayA9IHguc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IG9yaWdpbmFsQXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeFNoYXBlKTtcbiAgICBsZXQgYXhlcyA9IG9yaWdpbmFsQXhlcztcbiAgICBjb25zdCBwZXJtdXRlZEF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKGF4ZXMsIHhSYW5rKTtcbiAgICBsZXQgeFRyYW5zcG9zZWQgPSBudWxsO1xuICAgIGxldCBpbnB1dFdhc1RyYW5zcG9zZWQgPSBmYWxzZTtcbiAgICBpZiAocGVybXV0ZWRBeGVzICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgbmV3U2hhcGUgPSBuZXcgQXJyYXkoeFJhbmspO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld1NoYXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBuZXdTaGFwZVtpXSA9IHhTaGFwZVtwZXJtdXRlZEF4ZXNbaV1dO1xuICAgICAgICB9XG4gICAgICAgIGF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0SW5uZXJNb3N0QXhlcyhheGVzLmxlbmd0aCwgeFJhbmspO1xuICAgICAgICB4VHJhbnNwb3NlZCA9XG4gICAgICAgICAgICB0cmFuc3Bvc2UoeyBpbnB1dHM6IHsgeCB9LCBhdHRyczogeyBwZXJtOiBwZXJtdXRlZEF4ZXMgfSwgYmFja2VuZCB9KTtcbiAgICAgICAgY29uc3QgeElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHguZGF0YUlkKS5pZDtcbiAgICAgICAgY29uc3QgdHJhbnNwb3NlZElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHhUcmFuc3Bvc2VkLmRhdGFJZCkuaWQ7XG4gICAgICAgIGlmICh0cmFuc3Bvc2VkSWQgIT09IHhJZCkge1xuICAgICAgICAgICAgaW5wdXRXYXNUcmFuc3Bvc2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyB0cmFuc3Bvc2VkOiB4VHJhbnNwb3NlZCwgb3JpZ2luYWxBeGVzLCBheGVzLCBpbnB1dFdhc1RyYW5zcG9zZWQgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWtlcm5lbF91dGlscy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vLyBUaGlzIGVudW0gbXVzdCBhbGlnbiB3aXRoIHRoZSBlbnVtIGRlZmluZWQgaW4gY2MvYmFja2VuZC5oLlxuZXhwb3J0IHZhciBDcHBEVHlwZTtcbihmdW5jdGlvbiAoQ3BwRFR5cGUpIHtcbiAgICBDcHBEVHlwZVtDcHBEVHlwZVtcImZsb2F0MzJcIl0gPSAwXSA9IFwiZmxvYXQzMlwiO1xuICAgIENwcERUeXBlW0NwcERUeXBlW1wiaW50MzJcIl0gPSAxXSA9IFwiaW50MzJcIjtcbiAgICBDcHBEVHlwZVtDcHBEVHlwZVtcImJvb2xcIl0gPSAyXSA9IFwiYm9vbFwiO1xuICAgIENwcERUeXBlW0NwcERUeXBlW1wic3RyaW5nXCJdID0gM10gPSBcInN0cmluZ1wiO1xuICAgIENwcERUeXBlW0NwcERUeXBlW1wiY29tcGxleDY0XCJdID0gNF0gPSBcImNvbXBsZXg2NFwiO1xufSkoQ3BwRFR5cGUgfHwgKENwcERUeXBlID0ge30pKTtcbi8vIE11c3QgbWF0Y2ggZW51bSBpbiBjYy9mdXNhYmxlX2FjdGl2YXRpb25zLmguXG5leHBvcnQgdmFyIEZ1c2FibGVBY3RpdmF0aW9uO1xuKGZ1bmN0aW9uIChGdXNhYmxlQWN0aXZhdGlvbikge1xuICAgIEZ1c2FibGVBY3RpdmF0aW9uW0Z1c2FibGVBY3RpdmF0aW9uW1wibGluZWFyXCJdID0gMF0gPSBcImxpbmVhclwiO1xuICAgIEZ1c2FibGVBY3RpdmF0aW9uW0Z1c2FibGVBY3RpdmF0aW9uW1wicmVsdVwiXSA9IDFdID0gXCJyZWx1XCI7XG4gICAgRnVzYWJsZUFjdGl2YXRpb25bRnVzYWJsZUFjdGl2YXRpb25bXCJyZWx1NlwiXSA9IDJdID0gXCJyZWx1NlwiO1xuICAgIEZ1c2FibGVBY3RpdmF0aW9uW0Z1c2FibGVBY3RpdmF0aW9uW1wicHJlbHVcIl0gPSAzXSA9IFwicHJlbHVcIjtcbiAgICBGdXNhYmxlQWN0aXZhdGlvbltGdXNhYmxlQWN0aXZhdGlvbltcImxlYWt5cmVsdVwiXSA9IDRdID0gXCJsZWFreXJlbHVcIjtcbiAgICBGdXNhYmxlQWN0aXZhdGlvbltGdXNhYmxlQWN0aXZhdGlvbltcInNpZ21vaWRcIl0gPSA1XSA9IFwic2lnbW9pZFwiO1xufSkoRnVzYWJsZUFjdGl2YXRpb24gfHwgKEZ1c2FibGVBY3RpdmF0aW9uID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXR5cGVzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnKGtlcm5lbE5hbWUpIHtcbiAgICBsZXQgd2FzbUZ1bmM7XG4gICAgZnVuY3Rpb24gc2V0dXBGdW5jKGJhY2tlbmQpIHtcbiAgICAgICAgd2FzbUZ1bmMgPVxuICAgICAgICAgICAgYmFja2VuZC53YXNtLmN3cmFwKGtlcm5lbE5hbWUsIG51bGwgLyogdm9pZCAqLywgWydudW1iZXInLCAnbnVtYmVyJ10pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBrZXJuZWxGdW5jKGFyZ3MpIHtcbiAgICAgICAgY29uc3QgeyBiYWNrZW5kLCBpbnB1dHM6IHsgeCB9IH0gPSBhcmdzO1xuICAgICAgICBjb25zdCB4SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeC5kYXRhSWQpLmlkO1xuICAgICAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoeC5zaGFwZSwgeC5kdHlwZSk7XG4gICAgICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgICAgICAvLyBTaG9ydC1jaXJjdWl0IHplcm8tc2l6ZWQgdGVuc29ycy5cbiAgICAgICAgaWYgKHV0aWwuc2l6ZUZyb21TaGFwZShvdXQuc2hhcGUpID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gb3V0O1xuICAgICAgICB9XG4gICAgICAgIHdhc21GdW5jKHhJZCwgb3V0SWQpO1xuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cbiAgICByZXR1cm4geyBrZXJuZWxOYW1lLCBiYWNrZW5kTmFtZTogJ3dhc20nLCBzZXR1cEZ1bmMsIGtlcm5lbEZ1bmMgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVuYXJ5X2tlcm5lbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vLyBXZSBleHBsaWNpdGx5IGltcG9ydCB0aGUgbW9kdWxhciBrZXJuZWxzIHNvIHRoZXkgZ2V0IHJlZ2lzdGVyZWQgaW4gdGhlXG4vLyBnbG9iYWwgcmVnaXN0cnkgd2hlbiB3ZSBjb21waWxlIHRoZSBsaWJyYXJ5LiBBIG1vZHVsYXIgYnVpbGQgd291bGQgcmVwbGFjZVxuLy8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhbmQgaW1wb3J0IG9ubHkgdGhlIGtlcm5lbHMgdGhhdCBhcmUgbmVlZGVkLlxuaW1wb3J0IHsgcmVnaXN0ZXJLZXJuZWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgZnVzZWRNYXRNdWxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvX0Z1c2VkTWF0TXVsJztcbmltcG9ydCB7IGFic0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9BYnMnO1xuaW1wb3J0IHsgYWRkQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0FkZCc7XG5pbXBvcnQgeyBhZGROQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0FkZE4nO1xuaW1wb3J0IHsgYWxsQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0FsbCc7XG5pbXBvcnQgeyBhbnlDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQW55JztcbmltcG9ydCB7IGFyZ01heENvbmZpZyB9IGZyb20gJy4va2VybmVscy9BcmdNYXgnO1xuaW1wb3J0IHsgYXZnUG9vbENvbmZpZyB9IGZyb20gJy4va2VybmVscy9BdmdQb29sJztcbmltcG9ydCB7IGJhdGNoTWF0TXVsQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0JhdGNoTWF0TXVsJztcbmltcG9ydCB7IGJhdGNoVG9TcGFjZU5EQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0JhdGNoVG9TcGFjZU5EJztcbmltcG9ydCB7IGNhc3RDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQ2FzdCc7XG5pbXBvcnQgeyBjZWlsQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0NlaWwnO1xuaW1wb3J0IHsgY2xpcEJ5VmFsdWVDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQ2xpcEJ5VmFsdWUnO1xuaW1wb3J0IHsgY29uY2F0Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0NvbmNhdCc7XG5pbXBvcnQgeyBjb252MkRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQ29udjJEJztcbmltcG9ydCB7IGNvbnYyREJhY2twcm9wSW5wdXRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQ29udjJEQmFja3Byb3BJbnB1dCc7XG5pbXBvcnQgeyBjb3NDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQ29zJztcbmltcG9ydCB7IGNvc2hDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQ29zaCc7XG5pbXBvcnQgeyBjcm9wQW5kUmVzaXplQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0Nyb3BBbmRSZXNpemUnO1xuaW1wb3J0IHsgY3Vtc3VtQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0N1bXN1bSc7XG5pbXBvcnQgeyBkZXB0aFRvU3BhY2VDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRGVwdGhUb1NwYWNlJztcbmltcG9ydCB7IGRlcHRod2lzZUNvbnYyZE5hdGl2ZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9EZXB0aHdpc2VDb252MmROYXRpdmUnO1xuaW1wb3J0IHsgZXF1YWxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRXF1YWwnO1xuaW1wb3J0IHsgZXhwQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0V4cCc7XG5pbXBvcnQgeyBleHBhbmREaW1zQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0V4cGFuZERpbXMnO1xuaW1wb3J0IHsgZmlsbENvbmZpZyB9IGZyb20gJy4va2VybmVscy9GaWxsJztcbmltcG9ydCB7IGZsaXBMZWZ0UmlnaHRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRmxpcExlZnRSaWdodCc7XG5pbXBvcnQgeyBmbG9vckNvbmZpZyB9IGZyb20gJy4va2VybmVscy9GbG9vcic7XG5pbXBvcnQgeyBmbG9vckRpdkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9GbG9vckRpdic7XG5pbXBvcnQgeyBmdXNlZEJhdGNoTm9ybUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9GdXNlZEJhdGNoTm9ybSc7XG5pbXBvcnQgeyBmdXNlZENvbnYyRENvbmZpZyB9IGZyb20gJy4va2VybmVscy9GdXNlZENvbnYyRCc7XG5pbXBvcnQgeyBmdXNlZERlcHRod2lzZUNvbnYyRENvbmZpZyB9IGZyb20gJy4va2VybmVscy9GdXNlZERlcHRod2lzZUNvbnYyRCc7XG5pbXBvcnQgeyBnYXRoZXJOZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9HYXRoZXJOZCc7XG5pbXBvcnQgeyBnYXRoZXJWMkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9HYXRoZXJWMic7XG5pbXBvcnQgeyBncmVhdGVyQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0dyZWF0ZXInO1xuaW1wb3J0IHsgZ3JlYXRlckVxdWFsQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0dyZWF0ZXJFcXVhbCc7XG5pbXBvcnQgeyBpZGVudGl0eUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9JZGVudGl0eSc7XG5pbXBvcnQgeyBsZWFreVJlbHVDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTGVha3lSZWx1JztcbmltcG9ydCB7IGxlc3NDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTGVzcyc7XG5pbXBvcnQgeyBsZXNzRXF1YWxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTGVzc0VxdWFsJztcbmltcG9ydCB7IGxvZ0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9Mb2cnO1xuaW1wb3J0IHsgbG9naWNhbEFuZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Mb2dpY2FsQW5kJztcbmltcG9ydCB7IG1heENvbmZpZyB9IGZyb20gJy4va2VybmVscy9NYXgnO1xuaW1wb3J0IHsgbWF4aW11bUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9NYXhpbXVtJztcbmltcG9ydCB7IG1heFBvb2xDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTWF4UG9vbCc7XG5pbXBvcnQgeyBtZWFuQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL01lYW4nO1xuaW1wb3J0IHsgbWluQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL01pbic7XG5pbXBvcnQgeyBtaW5pbXVtQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL01pbmltdW0nO1xuaW1wb3J0IHsgbWlycm9yUGFkQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL01pcnJvclBhZCc7XG5pbXBvcnQgeyBtdWx0aXBseUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9NdWx0aXBseSc7XG5pbXBvcnQgeyBuZWdDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTmVnJztcbmltcG9ydCB7IG5vbk1heFN1cHByZXNzaW9uVjNDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTm9uTWF4U3VwcHJlc3Npb25WMyc7XG5pbXBvcnQgeyBub25NYXhTdXBwcmVzc2lvblY0Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL05vbk1heFN1cHByZXNzaW9uVjQnO1xuaW1wb3J0IHsgbm9uTWF4U3VwcHJlc3Npb25WNUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9Ob25NYXhTdXBwcmVzc2lvblY1JztcbmltcG9ydCB7IG5vdEVxdWFsQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL05vdEVxdWFsJztcbmltcG9ydCB7IG9uZUhvdENvbmZpZyB9IGZyb20gJy4va2VybmVscy9PbmVIb3QnO1xuaW1wb3J0IHsgb25lc0xpa2VDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvT25lc0xpa2UnO1xuaW1wb3J0IHsgcGFja0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9QYWNrJztcbmltcG9ydCB7IHBhZFYyQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1BhZFYyJztcbmltcG9ydCB7IHBvd0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9Qb3cnO1xuaW1wb3J0IHsgcHJlbHVDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUHJlbHUnO1xuaW1wb3J0IHsgcHJvZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Qcm9kJztcbmltcG9ydCB7IHJhbmdlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1JhbmdlJztcbmltcG9ydCB7IHJlYWxEaXZDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUmVhbERpdic7XG5pbXBvcnQgeyByZWx1Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1JlbHUnO1xuaW1wb3J0IHsgcmVsdTZDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUmVsdTYnO1xuaW1wb3J0IHsgcmVzaGFwZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9SZXNoYXBlJztcbmltcG9ydCB7IHJlc2l6ZUJpbGluZWFyQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1Jlc2l6ZUJpbGluZWFyJztcbmltcG9ydCB7IHJldmVyc2VDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUmV2ZXJzZSc7XG5pbXBvcnQgeyByb3RhdGVXaXRoT2Zmc2V0Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1JvdGF0ZVdpdGhPZmZzZXQnO1xuaW1wb3J0IHsgcm91bmRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUm91bmQnO1xuaW1wb3J0IHsgcnNxcnRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUnNxcnQnO1xuaW1wb3J0IHsgc2NhdHRlck5kQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NjYXR0ZXJOZCc7XG5pbXBvcnQgeyBzZWxlY3RDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU2VsZWN0JztcbmltcG9ydCB7IHNpZ21vaWRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU2lnbW9pZCc7XG5pbXBvcnQgeyBzaW5Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvU2luJztcbmltcG9ydCB7IHNsaWNlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NsaWNlJztcbmltcG9ydCB7IHNvZnRtYXhDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU29mdG1heCc7XG5pbXBvcnQgeyBzcGFjZVRvQmF0Y2hORENvbmZpZyB9IGZyb20gJy4va2VybmVscy9TcGFjZVRvQmF0Y2hORCc7XG5pbXBvcnQgeyBzcGxpdFZDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3BsaXRWJztcbmltcG9ydCB7IHNxcnRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3FydCc7XG5pbXBvcnQgeyBzcXVhcmVDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3F1YXJlJztcbmltcG9ydCB7IHNxdWFyZWREaWZmZXJlbmNlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NxdWFyZWREaWZmZXJlbmNlJztcbmltcG9ydCB7IHN0ZXBDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3RlcCc7XG5pbXBvcnQgeyBzdHJpZGVkU2xpY2VDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3RyaWRlZFNsaWNlJztcbmltcG9ydCB7IHN1YkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9TdWInO1xuaW1wb3J0IHsgc3VtQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1N1bSc7XG5pbXBvcnQgeyB0YW5Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvVGFuJztcbmltcG9ydCB7IHRhbmhDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvVGFuaCc7XG5pbXBvcnQgeyB0aWxlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1RpbGUnO1xuaW1wb3J0IHsgdG9wS0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9Ub3BLJztcbmltcG9ydCB7IHRyYW5zZm9ybUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9UcmFuc2Zvcm0nO1xuaW1wb3J0IHsgdHJhbnNwb3NlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1RyYW5zcG9zZSc7XG5pbXBvcnQgeyB1bnBhY2tDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvVW5wYWNrJztcbmltcG9ydCB7IHplcm9zTGlrZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9aZXJvc0xpa2UnO1xuLy8gTGlzdCBhbGwga2VybmVsIGNvbmZpZ3MgaGVyZVxuY29uc3Qga2VybmVsQ29uZmlncyA9IFtcbiAgICBhYnNDb25maWcsXG4gICAgYWRkQ29uZmlnLFxuICAgIGFkZE5Db25maWcsXG4gICAgYWxsQ29uZmlnLFxuICAgIGFueUNvbmZpZyxcbiAgICBhcmdNYXhDb25maWcsXG4gICAgYXZnUG9vbENvbmZpZyxcbiAgICBiYXRjaE1hdE11bENvbmZpZyxcbiAgICBiYXRjaFRvU3BhY2VORENvbmZpZyxcbiAgICBjYXN0Q29uZmlnLFxuICAgIGNlaWxDb25maWcsXG4gICAgY2xpcEJ5VmFsdWVDb25maWcsXG4gICAgY29uY2F0Q29uZmlnLFxuICAgIGNvbnYyRENvbmZpZyxcbiAgICBjb252MkRCYWNrcHJvcElucHV0Q29uZmlnLFxuICAgIGNvc0NvbmZpZyxcbiAgICBjb3NoQ29uZmlnLFxuICAgIGNyb3BBbmRSZXNpemVDb25maWcsXG4gICAgY3Vtc3VtQ29uZmlnLFxuICAgIGRlcHRoVG9TcGFjZUNvbmZpZyxcbiAgICBkZXB0aHdpc2VDb252MmROYXRpdmVDb25maWcsXG4gICAgZXF1YWxDb25maWcsXG4gICAgZXhwQ29uZmlnLFxuICAgIGV4cGFuZERpbXNDb25maWcsXG4gICAgZmlsbENvbmZpZyxcbiAgICBmbGlwTGVmdFJpZ2h0Q29uZmlnLFxuICAgIGZsb29yQ29uZmlnLFxuICAgIGZsb29yRGl2Q29uZmlnLFxuICAgIGZ1c2VkTWF0TXVsQ29uZmlnLFxuICAgIGZ1c2VkQmF0Y2hOb3JtQ29uZmlnLFxuICAgIGZ1c2VkQ29udjJEQ29uZmlnLFxuICAgIGZ1c2VkRGVwdGh3aXNlQ29udjJEQ29uZmlnLFxuICAgIGdhdGhlck5kQ29uZmlnLFxuICAgIGdhdGhlclYyQ29uZmlnLFxuICAgIGdyZWF0ZXJDb25maWcsXG4gICAgZ3JlYXRlckVxdWFsQ29uZmlnLFxuICAgIGlkZW50aXR5Q29uZmlnLFxuICAgIGxlYWt5UmVsdUNvbmZpZyxcbiAgICBsZXNzQ29uZmlnLFxuICAgIGxlc3NFcXVhbENvbmZpZyxcbiAgICBsb2dDb25maWcsXG4gICAgbG9naWNhbEFuZENvbmZpZyxcbiAgICBtYXhDb25maWcsXG4gICAgbWF4aW11bUNvbmZpZyxcbiAgICBtYXhQb29sQ29uZmlnLFxuICAgIG1lYW5Db25maWcsXG4gICAgbWluQ29uZmlnLFxuICAgIG1pbmltdW1Db25maWcsXG4gICAgbWlycm9yUGFkQ29uZmlnLFxuICAgIG11bHRpcGx5Q29uZmlnLFxuICAgIG5lZ0NvbmZpZyxcbiAgICBub25NYXhTdXBwcmVzc2lvblYzQ29uZmlnLFxuICAgIG5vbk1heFN1cHByZXNzaW9uVjRDb25maWcsXG4gICAgbm9uTWF4U3VwcHJlc3Npb25WNUNvbmZpZyxcbiAgICBub3RFcXVhbENvbmZpZyxcbiAgICBvbmVIb3RDb25maWcsXG4gICAgb25lc0xpa2VDb25maWcsXG4gICAgcGFja0NvbmZpZyxcbiAgICBwYWRWMkNvbmZpZyxcbiAgICBwb3dDb25maWcsXG4gICAgcHJlbHVDb25maWcsXG4gICAgcHJvZENvbmZpZyxcbiAgICByYW5nZUNvbmZpZyxcbiAgICByZWFsRGl2Q29uZmlnLFxuICAgIHJlbHVDb25maWcsXG4gICAgcmVsdTZDb25maWcsXG4gICAgcmVzaGFwZUNvbmZpZyxcbiAgICByZXNpemVCaWxpbmVhckNvbmZpZyxcbiAgICByZXZlcnNlQ29uZmlnLFxuICAgIHJvdGF0ZVdpdGhPZmZzZXRDb25maWcsXG4gICAgcnNxcnRDb25maWcsXG4gICAgcm91bmRDb25maWcsXG4gICAgc2NhdHRlck5kQ29uZmlnLFxuICAgIHNlbGVjdENvbmZpZyxcbiAgICBzaWdtb2lkQ29uZmlnLFxuICAgIHNpbkNvbmZpZyxcbiAgICBzbGljZUNvbmZpZyxcbiAgICBzb2Z0bWF4Q29uZmlnLFxuICAgIHNwYWNlVG9CYXRjaE5EQ29uZmlnLFxuICAgIHNwbGl0VkNvbmZpZyxcbiAgICBzcXJ0Q29uZmlnLFxuICAgIHNxdWFyZUNvbmZpZyxcbiAgICBzcXVhcmVkRGlmZmVyZW5jZUNvbmZpZyxcbiAgICBzdGVwQ29uZmlnLFxuICAgIHN0cmlkZWRTbGljZUNvbmZpZyxcbiAgICBzdWJDb25maWcsXG4gICAgc3VtQ29uZmlnLFxuICAgIHRhbkNvbmZpZyxcbiAgICB0YW5oQ29uZmlnLFxuICAgIHRpbGVDb25maWcsXG4gICAgdG9wS0NvbmZpZyxcbiAgICB0cmFuc2Zvcm1Db25maWcsXG4gICAgdHJhbnNwb3NlQ29uZmlnLFxuICAgIHVucGFja0NvbmZpZyxcbiAgICB6ZXJvc0xpa2VDb25maWdcbl07XG5mb3IgKGNvbnN0IGtlcm5lbENvbmZpZyBvZiBrZXJuZWxDb25maWdzKSB7XG4gICAgcmVnaXN0ZXJLZXJuZWwoa2VybmVsQ29uZmlnKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlZ2lzdGVyX2FsbF9rZXJuZWxzLmpzLm1hcCIsIi8qKiBAbGljZW5zZSBTZWUgdGhlIExJQ0VOU0UgZmlsZS4gKi9cbi8vIFRoaXMgY29kZSBpcyBhdXRvLWdlbmVyYXRlZCwgZG8gbm90IG1vZGlmeSB0aGlzIGZpbGUhXG5jb25zdCB2ZXJzaW9uID0gJzMuOC4wJztcbmV4cG9ydCB7IHZlcnNpb24gfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZlcnNpb24uanMubWFwIiwiXG52YXIgV2FzbUJhY2tlbmRNb2R1bGVUaHJlYWRlZFNpbWQgPSAoZnVuY3Rpb24oKSB7XG4gIHZhciBfc2NyaXB0RGlyID0gdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBkb2N1bWVudC5jdXJyZW50U2NyaXB0ID8gZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMgOiB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2YgX19maWxlbmFtZSAhPT0gJ3VuZGVmaW5lZCcpIF9zY3JpcHREaXIgPSBfc2NyaXB0RGlyIHx8IF9fZmlsZW5hbWU7XG4gIHJldHVybiAoXG5mdW5jdGlvbihXYXNtQmFja2VuZE1vZHVsZVRocmVhZGVkU2ltZCkge1xuICBXYXNtQmFja2VuZE1vZHVsZVRocmVhZGVkU2ltZCA9IFdhc21CYWNrZW5kTW9kdWxlVGhyZWFkZWRTaW1kIHx8IHt9O1xuXG5mdW5jdGlvbiBHUk9XQUJMRV9IRUFQX0k4KCl7aWYod2FzbU1lbW9yeS5idWZmZXIhPWJ1ZmZlcil7dXBkYXRlR2xvYmFsQnVmZmVyQW5kVmlld3Mod2FzbU1lbW9yeS5idWZmZXIpfXJldHVybiBIRUFQOH1mdW5jdGlvbiBHUk9XQUJMRV9IRUFQX1U4KCl7aWYod2FzbU1lbW9yeS5idWZmZXIhPWJ1ZmZlcil7dXBkYXRlR2xvYmFsQnVmZmVyQW5kVmlld3Mod2FzbU1lbW9yeS5idWZmZXIpfXJldHVybiBIRUFQVTh9ZnVuY3Rpb24gR1JPV0FCTEVfSEVBUF9JMzIoKXtpZih3YXNtTWVtb3J5LmJ1ZmZlciE9YnVmZmVyKXt1cGRhdGVHbG9iYWxCdWZmZXJBbmRWaWV3cyh3YXNtTWVtb3J5LmJ1ZmZlcil9cmV0dXJuIEhFQVAzMn1mdW5jdGlvbiBHUk9XQUJMRV9IRUFQX1UzMigpe2lmKHdhc21NZW1vcnkuYnVmZmVyIT1idWZmZXIpe3VwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzKHdhc21NZW1vcnkuYnVmZmVyKX1yZXR1cm4gSEVBUFUzMn1mdW5jdGlvbiBHUk9XQUJMRV9IRUFQX0Y2NCgpe2lmKHdhc21NZW1vcnkuYnVmZmVyIT1idWZmZXIpe3VwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzKHdhc21NZW1vcnkuYnVmZmVyKX1yZXR1cm4gSEVBUEY2NH12YXIgTW9kdWxlPXR5cGVvZiBXYXNtQmFja2VuZE1vZHVsZVRocmVhZGVkU2ltZCE9PVwidW5kZWZpbmVkXCI/V2FzbUJhY2tlbmRNb2R1bGVUaHJlYWRlZFNpbWQ6e307dmFyIHJlYWR5UHJvbWlzZVJlc29sdmUscmVhZHlQcm9taXNlUmVqZWN0O01vZHVsZVtcInJlYWR5XCJdPW5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUscmVqZWN0KXtyZWFkeVByb21pc2VSZXNvbHZlPXJlc29sdmU7cmVhZHlQcm9taXNlUmVqZWN0PXJlamVjdH0pO3ZhciBtb2R1bGVPdmVycmlkZXM9e307dmFyIGtleTtmb3Ioa2V5IGluIE1vZHVsZSl7aWYoTW9kdWxlLmhhc093blByb3BlcnR5KGtleSkpe21vZHVsZU92ZXJyaWRlc1trZXldPU1vZHVsZVtrZXldfX12YXIgYXJndW1lbnRzXz1bXTt2YXIgdGhpc1Byb2dyYW09XCIuL3RoaXMucHJvZ3JhbVwiO3ZhciBxdWl0Xz1mdW5jdGlvbihzdGF0dXMsdG9UaHJvdyl7dGhyb3cgdG9UaHJvd307dmFyIEVOVklST05NRU5UX0lTX1dFQj1mYWxzZTt2YXIgRU5WSVJPTk1FTlRfSVNfV09SS0VSPWZhbHNlO3ZhciBFTlZJUk9OTUVOVF9JU19OT0RFPWZhbHNlO3ZhciBFTlZJUk9OTUVOVF9JU19TSEVMTD1mYWxzZTtFTlZJUk9OTUVOVF9JU19XRUI9dHlwZW9mIHdpbmRvdz09PVwib2JqZWN0XCI7RU5WSVJPTk1FTlRfSVNfV09SS0VSPXR5cGVvZiBpbXBvcnRTY3JpcHRzPT09XCJmdW5jdGlvblwiO0VOVklST05NRU5UX0lTX05PREU9dHlwZW9mIHByb2Nlc3M9PT1cIm9iamVjdFwiJiZ0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucz09PVwib2JqZWN0XCImJnR5cGVvZiBwcm9jZXNzLnZlcnNpb25zLm5vZGU9PT1cInN0cmluZ1wiO0VOVklST05NRU5UX0lTX1NIRUxMPSFFTlZJUk9OTUVOVF9JU19XRUImJiFFTlZJUk9OTUVOVF9JU19OT0RFJiYhRU5WSVJPTk1FTlRfSVNfV09SS0VSO3ZhciBFTlZJUk9OTUVOVF9JU19QVEhSRUFEPU1vZHVsZVtcIkVOVklST05NRU5UX0lTX1BUSFJFQURcIl18fGZhbHNlO2lmKEVOVklST05NRU5UX0lTX1BUSFJFQUQpe2J1ZmZlcj1Nb2R1bGVbXCJidWZmZXJcIl19dmFyIHNjcmlwdERpcmVjdG9yeT1cIlwiO2Z1bmN0aW9uIGxvY2F0ZUZpbGUocGF0aCl7aWYoTW9kdWxlW1wibG9jYXRlRmlsZVwiXSl7cmV0dXJuIE1vZHVsZVtcImxvY2F0ZUZpbGVcIl0ocGF0aCxzY3JpcHREaXJlY3RvcnkpfXJldHVybiBzY3JpcHREaXJlY3RvcnkrcGF0aH12YXIgcmVhZF8scmVhZEFzeW5jLHJlYWRCaW5hcnksc2V0V2luZG93VGl0bGU7dmFyIG5vZGVGUzt2YXIgbm9kZVBhdGg7aWYoRU5WSVJPTk1FTlRfSVNfTk9ERSl7aWYoRU5WSVJPTk1FTlRfSVNfV09SS0VSKXtzY3JpcHREaXJlY3Rvcnk9cmVxdWlyZShcInBhdGhcIikuZGlybmFtZShzY3JpcHREaXJlY3RvcnkpK1wiL1wifWVsc2V7c2NyaXB0RGlyZWN0b3J5PV9fZGlybmFtZStcIi9cIn1yZWFkXz1mdW5jdGlvbiBzaGVsbF9yZWFkKGZpbGVuYW1lLGJpbmFyeSl7aWYoIW5vZGVGUylub2RlRlM9cmVxdWlyZShcImZzXCIpO2lmKCFub2RlUGF0aClub2RlUGF0aD1yZXF1aXJlKFwicGF0aFwiKTtmaWxlbmFtZT1ub2RlUGF0aFtcIm5vcm1hbGl6ZVwiXShmaWxlbmFtZSk7cmV0dXJuIG5vZGVGU1tcInJlYWRGaWxlU3luY1wiXShmaWxlbmFtZSxiaW5hcnk/bnVsbDpcInV0ZjhcIil9O3JlYWRCaW5hcnk9ZnVuY3Rpb24gcmVhZEJpbmFyeShmaWxlbmFtZSl7dmFyIHJldD1yZWFkXyhmaWxlbmFtZSx0cnVlKTtpZighcmV0LmJ1ZmZlcil7cmV0PW5ldyBVaW50OEFycmF5KHJldCl9YXNzZXJ0KHJldC5idWZmZXIpO3JldHVybiByZXR9O2lmKHByb2Nlc3NbXCJhcmd2XCJdLmxlbmd0aD4xKXt0aGlzUHJvZ3JhbT1wcm9jZXNzW1wiYXJndlwiXVsxXS5yZXBsYWNlKC9cXFxcL2csXCIvXCIpfWFyZ3VtZW50c189cHJvY2Vzc1tcImFyZ3ZcIl0uc2xpY2UoMik7cHJvY2Vzc1tcIm9uXCJdKFwidW5jYXVnaHRFeGNlcHRpb25cIixmdW5jdGlvbihleCl7aWYoIShleCBpbnN0YW5jZW9mIEV4aXRTdGF0dXMpKXt0aHJvdyBleH19KTtwcm9jZXNzW1wib25cIl0oXCJ1bmhhbmRsZWRSZWplY3Rpb25cIixhYm9ydCk7cXVpdF89ZnVuY3Rpb24oc3RhdHVzKXtwcm9jZXNzW1wiZXhpdFwiXShzdGF0dXMpfTtNb2R1bGVbXCJpbnNwZWN0XCJdPWZ1bmN0aW9uKCl7cmV0dXJuXCJbRW1zY3JpcHRlbiBNb2R1bGUgb2JqZWN0XVwifTt2YXIgbm9kZVdvcmtlclRocmVhZHM7dHJ5e25vZGVXb3JrZXJUaHJlYWRzPXJlcXVpcmUoXCJ3b3JrZXJfdGhyZWFkc1wiKX1jYXRjaChlKXtjb25zb2xlLmVycm9yKCdUaGUgXCJ3b3JrZXJfdGhyZWFkc1wiIG1vZHVsZSBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgbm9kZS5qcyBidWlsZCAtIHBlcmhhcHMgYSBuZXdlciB2ZXJzaW9uIGlzIG5lZWRlZD8nKTt0aHJvdyBlfWdsb2JhbC5Xb3JrZXI9bm9kZVdvcmtlclRocmVhZHMuV29ya2VyfWVsc2UgaWYoRU5WSVJPTk1FTlRfSVNfU0hFTEwpe2lmKHR5cGVvZiByZWFkIT1cInVuZGVmaW5lZFwiKXtyZWFkXz1mdW5jdGlvbiBzaGVsbF9yZWFkKGYpe3JldHVybiByZWFkKGYpfX1yZWFkQmluYXJ5PWZ1bmN0aW9uIHJlYWRCaW5hcnkoZil7dmFyIGRhdGE7aWYodHlwZW9mIHJlYWRidWZmZXI9PT1cImZ1bmN0aW9uXCIpe3JldHVybiBuZXcgVWludDhBcnJheShyZWFkYnVmZmVyKGYpKX1kYXRhPXJlYWQoZixcImJpbmFyeVwiKTthc3NlcnQodHlwZW9mIGRhdGE9PT1cIm9iamVjdFwiKTtyZXR1cm4gZGF0YX07aWYodHlwZW9mIHNjcmlwdEFyZ3MhPVwidW5kZWZpbmVkXCIpe2FyZ3VtZW50c189c2NyaXB0QXJnc31lbHNlIGlmKHR5cGVvZiBhcmd1bWVudHMhPVwidW5kZWZpbmVkXCIpe2FyZ3VtZW50c189YXJndW1lbnRzfWlmKHR5cGVvZiBxdWl0PT09XCJmdW5jdGlvblwiKXtxdWl0Xz1mdW5jdGlvbihzdGF0dXMpe3F1aXQoc3RhdHVzKX19aWYodHlwZW9mIHByaW50IT09XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGNvbnNvbGU9PT1cInVuZGVmaW5lZFwiKWNvbnNvbGU9e307Y29uc29sZS5sb2c9cHJpbnQ7Y29uc29sZS53YXJuPWNvbnNvbGUuZXJyb3I9dHlwZW9mIHByaW50RXJyIT09XCJ1bmRlZmluZWRcIj9wcmludEVycjpwcmludH19ZWxzZSBpZihFTlZJUk9OTUVOVF9JU19XRUJ8fEVOVklST05NRU5UX0lTX1dPUktFUil7aWYoRU5WSVJPTk1FTlRfSVNfV09SS0VSKXtzY3JpcHREaXJlY3Rvcnk9c2VsZi5sb2NhdGlvbi5ocmVmfWVsc2UgaWYodHlwZW9mIGRvY3VtZW50IT09XCJ1bmRlZmluZWRcIiYmZG9jdW1lbnQuY3VycmVudFNjcmlwdCl7c2NyaXB0RGlyZWN0b3J5PWRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjfWlmKHR5cGVvZiBfc2NyaXB0RGlyICE9PSBcInVuZGVmaW5lZFwiICYmIF9zY3JpcHREaXIpe3NjcmlwdERpcmVjdG9yeT1fc2NyaXB0RGlyfWlmKHNjcmlwdERpcmVjdG9yeS5pbmRleE9mKFwiYmxvYjpcIikhPT0wKXtzY3JpcHREaXJlY3Rvcnk9c2NyaXB0RGlyZWN0b3J5LnN1YnN0cigwLHNjcmlwdERpcmVjdG9yeS5sYXN0SW5kZXhPZihcIi9cIikrMSl9ZWxzZXtzY3JpcHREaXJlY3Rvcnk9XCJcIn1pZihFTlZJUk9OTUVOVF9JU19OT0RFKXtyZWFkXz1mdW5jdGlvbiBzaGVsbF9yZWFkKGZpbGVuYW1lLGJpbmFyeSl7aWYoIW5vZGVGUylub2RlRlM9cmVxdWlyZShcImZzXCIpO2lmKCFub2RlUGF0aClub2RlUGF0aD1yZXF1aXJlKFwicGF0aFwiKTtmaWxlbmFtZT1ub2RlUGF0aFtcIm5vcm1hbGl6ZVwiXShmaWxlbmFtZSk7cmV0dXJuIG5vZGVGU1tcInJlYWRGaWxlU3luY1wiXShmaWxlbmFtZSxiaW5hcnk/bnVsbDpcInV0ZjhcIil9O3JlYWRCaW5hcnk9ZnVuY3Rpb24gcmVhZEJpbmFyeShmaWxlbmFtZSl7dmFyIHJldD1yZWFkXyhmaWxlbmFtZSx0cnVlKTtpZighcmV0LmJ1ZmZlcil7cmV0PW5ldyBVaW50OEFycmF5KHJldCl9YXNzZXJ0KHJldC5idWZmZXIpO3JldHVybiByZXR9fWVsc2V7cmVhZF89ZnVuY3Rpb24odXJsKXt2YXIgeGhyPW5ldyBYTUxIdHRwUmVxdWVzdDt4aHIub3BlbihcIkdFVFwiLHVybCxmYWxzZSk7eGhyLnNlbmQobnVsbCk7cmV0dXJuIHhoci5yZXNwb25zZVRleHR9O2lmKEVOVklST05NRU5UX0lTX1dPUktFUil7cmVhZEJpbmFyeT1mdW5jdGlvbih1cmwpe3ZhciB4aHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3hoci5vcGVuKFwiR0VUXCIsdXJsLGZhbHNlKTt4aHIucmVzcG9uc2VUeXBlPVwiYXJyYXlidWZmZXJcIjt4aHIuc2VuZChudWxsKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoeGhyLnJlc3BvbnNlKX19cmVhZEFzeW5jPWZ1bmN0aW9uKHVybCxvbmxvYWQsb25lcnJvcil7dmFyIHhocj1uZXcgWE1MSHR0cFJlcXVlc3Q7eGhyLm9wZW4oXCJHRVRcIix1cmwsdHJ1ZSk7eGhyLnJlc3BvbnNlVHlwZT1cImFycmF5YnVmZmVyXCI7eGhyLm9ubG9hZD1mdW5jdGlvbigpe2lmKHhoci5zdGF0dXM9PTIwMHx8eGhyLnN0YXR1cz09MCYmeGhyLnJlc3BvbnNlKXtvbmxvYWQoeGhyLnJlc3BvbnNlKTtyZXR1cm59b25lcnJvcigpfTt4aHIub25lcnJvcj1vbmVycm9yO3hoci5zZW5kKG51bGwpfX1zZXRXaW5kb3dUaXRsZT1mdW5jdGlvbih0aXRsZSl7ZG9jdW1lbnQudGl0bGU9dGl0bGV9fWVsc2V7fWlmKEVOVklST05NRU5UX0lTX05PREUpe2lmKHR5cGVvZiBwZXJmb3JtYW5jZT09PVwidW5kZWZpbmVkXCIpe2dsb2JhbC5wZXJmb3JtYW5jZT1yZXF1aXJlKFwicGVyZl9ob29rc1wiKS5wZXJmb3JtYW5jZX19dmFyIG91dD1Nb2R1bGVbXCJwcmludFwiXXx8Y29uc29sZS5sb2cuYmluZChjb25zb2xlKTt2YXIgZXJyPU1vZHVsZVtcInByaW50RXJyXCJdfHxjb25zb2xlLndhcm4uYmluZChjb25zb2xlKTtmb3Ioa2V5IGluIG1vZHVsZU92ZXJyaWRlcyl7aWYobW9kdWxlT3ZlcnJpZGVzLmhhc093blByb3BlcnR5KGtleSkpe01vZHVsZVtrZXldPW1vZHVsZU92ZXJyaWRlc1trZXldfX1tb2R1bGVPdmVycmlkZXM9bnVsbDtpZihNb2R1bGVbXCJhcmd1bWVudHNcIl0pYXJndW1lbnRzXz1Nb2R1bGVbXCJhcmd1bWVudHNcIl07aWYoTW9kdWxlW1widGhpc1Byb2dyYW1cIl0pdGhpc1Byb2dyYW09TW9kdWxlW1widGhpc1Byb2dyYW1cIl07aWYoTW9kdWxlW1wicXVpdFwiXSlxdWl0Xz1Nb2R1bGVbXCJxdWl0XCJdO3ZhciBBdG9taWNzX2xvYWQ9QXRvbWljcy5sb2FkO3ZhciBBdG9taWNzX3N0b3JlPUF0b21pY3Muc3RvcmU7dmFyIEF0b21pY3NfY29tcGFyZUV4Y2hhbmdlPUF0b21pY3MuY29tcGFyZUV4Y2hhbmdlO3ZhciB3YXNtQmluYXJ5O2lmKE1vZHVsZVtcIndhc21CaW5hcnlcIl0pd2FzbUJpbmFyeT1Nb2R1bGVbXCJ3YXNtQmluYXJ5XCJdO3ZhciBub0V4aXRSdW50aW1lPU1vZHVsZVtcIm5vRXhpdFJ1bnRpbWVcIl18fHRydWU7aWYodHlwZW9mIFdlYkFzc2VtYmx5IT09XCJvYmplY3RcIil7YWJvcnQoXCJubyBuYXRpdmUgd2FzbSBzdXBwb3J0IGRldGVjdGVkXCIpfXZhciB3YXNtTWVtb3J5O3ZhciB3YXNtTW9kdWxlO3ZhciBBQk9SVD1mYWxzZTt2YXIgRVhJVFNUQVRVUztmdW5jdGlvbiBhc3NlcnQoY29uZGl0aW9uLHRleHQpe2lmKCFjb25kaXRpb24pe2Fib3J0KFwiQXNzZXJ0aW9uIGZhaWxlZDogXCIrdGV4dCl9fWZ1bmN0aW9uIGdldENGdW5jKGlkZW50KXt2YXIgZnVuYz1Nb2R1bGVbXCJfXCIraWRlbnRdO2Fzc2VydChmdW5jLFwiQ2Fubm90IGNhbGwgdW5rbm93biBmdW5jdGlvbiBcIitpZGVudCtcIiwgbWFrZSBzdXJlIGl0IGlzIGV4cG9ydGVkXCIpO3JldHVybiBmdW5jfWZ1bmN0aW9uIGNjYWxsKGlkZW50LHJldHVyblR5cGUsYXJnVHlwZXMsYXJncyxvcHRzKXt2YXIgdG9DPXtcInN0cmluZ1wiOmZ1bmN0aW9uKHN0cil7dmFyIHJldD0wO2lmKHN0ciE9PW51bGwmJnN0ciE9PXVuZGVmaW5lZCYmc3RyIT09MCl7dmFyIGxlbj0oc3RyLmxlbmd0aDw8MikrMTtyZXQ9c3RhY2tBbGxvYyhsZW4pO3N0cmluZ1RvVVRGOChzdHIscmV0LGxlbil9cmV0dXJuIHJldH0sXCJhcnJheVwiOmZ1bmN0aW9uKGFycil7dmFyIHJldD1zdGFja0FsbG9jKGFyci5sZW5ndGgpO3dyaXRlQXJyYXlUb01lbW9yeShhcnIscmV0KTtyZXR1cm4gcmV0fX07ZnVuY3Rpb24gY29udmVydFJldHVyblZhbHVlKHJldCl7aWYocmV0dXJuVHlwZT09PVwic3RyaW5nXCIpcmV0dXJuIFVURjhUb1N0cmluZyhyZXQpO2lmKHJldHVyblR5cGU9PT1cImJvb2xlYW5cIilyZXR1cm4gQm9vbGVhbihyZXQpO3JldHVybiByZXR9dmFyIGZ1bmM9Z2V0Q0Z1bmMoaWRlbnQpO3ZhciBjQXJncz1bXTt2YXIgc3RhY2s9MDtpZihhcmdzKXtmb3IodmFyIGk9MDtpPGFyZ3MubGVuZ3RoO2krKyl7dmFyIGNvbnZlcnRlcj10b0NbYXJnVHlwZXNbaV1dO2lmKGNvbnZlcnRlcil7aWYoc3RhY2s9PT0wKXN0YWNrPXN0YWNrU2F2ZSgpO2NBcmdzW2ldPWNvbnZlcnRlcihhcmdzW2ldKX1lbHNle2NBcmdzW2ldPWFyZ3NbaV19fX12YXIgcmV0PWZ1bmMuYXBwbHkobnVsbCxjQXJncyk7cmV0PWNvbnZlcnRSZXR1cm5WYWx1ZShyZXQpO2lmKHN0YWNrIT09MClzdGFja1Jlc3RvcmUoc3RhY2spO3JldHVybiByZXR9ZnVuY3Rpb24gY3dyYXAoaWRlbnQscmV0dXJuVHlwZSxhcmdUeXBlcyxvcHRzKXthcmdUeXBlcz1hcmdUeXBlc3x8W107dmFyIG51bWVyaWNBcmdzPWFyZ1R5cGVzLmV2ZXJ5KGZ1bmN0aW9uKHR5cGUpe3JldHVybiB0eXBlPT09XCJudW1iZXJcIn0pO3ZhciBudW1lcmljUmV0PXJldHVyblR5cGUhPT1cInN0cmluZ1wiO2lmKG51bWVyaWNSZXQmJm51bWVyaWNBcmdzJiYhb3B0cyl7cmV0dXJuIGdldENGdW5jKGlkZW50KX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gY2NhbGwoaWRlbnQscmV0dXJuVHlwZSxhcmdUeXBlcyxhcmd1bWVudHMsb3B0cyl9fWZ1bmN0aW9uIFVURjhBcnJheVRvU3RyaW5nKGhlYXAsaWR4LG1heEJ5dGVzVG9SZWFkKXt2YXIgZW5kSWR4PWlkeCttYXhCeXRlc1RvUmVhZDt2YXIgc3RyPVwiXCI7d2hpbGUoIShpZHg+PWVuZElkeCkpe3ZhciB1MD1oZWFwW2lkeCsrXTtpZighdTApcmV0dXJuIHN0cjtpZighKHUwJjEyOCkpe3N0cis9U3RyaW5nLmZyb21DaGFyQ29kZSh1MCk7Y29udGludWV9dmFyIHUxPWhlYXBbaWR4KytdJjYzO2lmKCh1MCYyMjQpPT0xOTIpe3N0cis9U3RyaW5nLmZyb21DaGFyQ29kZSgodTAmMzEpPDw2fHUxKTtjb250aW51ZX12YXIgdTI9aGVhcFtpZHgrK10mNjM7aWYoKHUwJjI0MCk9PTIyNCl7dTA9KHUwJjE1KTw8MTJ8dTE8PDZ8dTJ9ZWxzZXt1MD0odTAmNyk8PDE4fHUxPDwxMnx1Mjw8NnxoZWFwW2lkeCsrXSY2M31pZih1MDw2NTUzNil7c3RyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHUwKX1lbHNle3ZhciBjaD11MC02NTUzNjtzdHIrPVN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTZ8Y2g+PjEwLDU2MzIwfGNoJjEwMjMpfX1yZXR1cm4gc3RyfWZ1bmN0aW9uIFVURjhUb1N0cmluZyhwdHIsbWF4Qnl0ZXNUb1JlYWQpe3JldHVybiBwdHI/VVRGOEFycmF5VG9TdHJpbmcoR1JPV0FCTEVfSEVBUF9VOCgpLHB0cixtYXhCeXRlc1RvUmVhZCk6XCJcIn1mdW5jdGlvbiBzdHJpbmdUb1VURjhBcnJheShzdHIsaGVhcCxvdXRJZHgsbWF4Qnl0ZXNUb1dyaXRlKXtpZighKG1heEJ5dGVzVG9Xcml0ZT4wKSlyZXR1cm4gMDt2YXIgc3RhcnRJZHg9b3V0SWR4O3ZhciBlbmRJZHg9b3V0SWR4K21heEJ5dGVzVG9Xcml0ZS0xO2Zvcih2YXIgaT0wO2k8c3RyLmxlbmd0aDsrK2kpe3ZhciB1PXN0ci5jaGFyQ29kZUF0KGkpO2lmKHU+PTU1Mjk2JiZ1PD01NzM0Myl7dmFyIHUxPXN0ci5jaGFyQ29kZUF0KCsraSk7dT02NTUzNisoKHUmMTAyMyk8PDEwKXx1MSYxMDIzfWlmKHU8PTEyNyl7aWYob3V0SWR4Pj1lbmRJZHgpYnJlYWs7aGVhcFtvdXRJZHgrK109dX1lbHNlIGlmKHU8PTIwNDcpe2lmKG91dElkeCsxPj1lbmRJZHgpYnJlYWs7aGVhcFtvdXRJZHgrK109MTkyfHU+PjY7aGVhcFtvdXRJZHgrK109MTI4fHUmNjN9ZWxzZSBpZih1PD02NTUzNSl7aWYob3V0SWR4KzI+PWVuZElkeClicmVhaztoZWFwW291dElkeCsrXT0yMjR8dT4+MTI7aGVhcFtvdXRJZHgrK109MTI4fHU+PjYmNjM7aGVhcFtvdXRJZHgrK109MTI4fHUmNjN9ZWxzZXtpZihvdXRJZHgrMz49ZW5kSWR4KWJyZWFrO2hlYXBbb3V0SWR4KytdPTI0MHx1Pj4xODtoZWFwW291dElkeCsrXT0xMjh8dT4+MTImNjM7aGVhcFtvdXRJZHgrK109MTI4fHU+PjYmNjM7aGVhcFtvdXRJZHgrK109MTI4fHUmNjN9fWhlYXBbb3V0SWR4XT0wO3JldHVybiBvdXRJZHgtc3RhcnRJZHh9ZnVuY3Rpb24gc3RyaW5nVG9VVEY4KHN0cixvdXRQdHIsbWF4Qnl0ZXNUb1dyaXRlKXtyZXR1cm4gc3RyaW5nVG9VVEY4QXJyYXkoc3RyLEdST1dBQkxFX0hFQVBfVTgoKSxvdXRQdHIsbWF4Qnl0ZXNUb1dyaXRlKX1mdW5jdGlvbiBsZW5ndGhCeXRlc1VURjgoc3RyKXt2YXIgbGVuPTA7Zm9yKHZhciBpPTA7aTxzdHIubGVuZ3RoOysraSl7dmFyIHU9c3RyLmNoYXJDb2RlQXQoaSk7aWYodT49NTUyOTYmJnU8PTU3MzQzKXU9NjU1MzYrKCh1JjEwMjMpPDwxMCl8c3RyLmNoYXJDb2RlQXQoKytpKSYxMDIzO2lmKHU8PTEyNykrK2xlbjtlbHNlIGlmKHU8PTIwNDcpbGVuKz0yO2Vsc2UgaWYodTw9NjU1MzUpbGVuKz0zO2Vsc2UgbGVuKz00fXJldHVybiBsZW59ZnVuY3Rpb24gd3JpdGVBcnJheVRvTWVtb3J5KGFycmF5LGJ1ZmZlcil7R1JPV0FCTEVfSEVBUF9JOCgpLnNldChhcnJheSxidWZmZXIpfWZ1bmN0aW9uIGFsaWduVXAoeCxtdWx0aXBsZSl7aWYoeCVtdWx0aXBsZT4wKXt4Kz1tdWx0aXBsZS14JW11bHRpcGxlfXJldHVybiB4fXZhciBidWZmZXIsSEVBUDgsSEVBUFU4LEhFQVAxNixIRUFQVTE2LEhFQVAzMixIRUFQVTMyLEhFQVBGMzIsSEVBUEY2NDtmdW5jdGlvbiB1cGRhdGVHbG9iYWxCdWZmZXJBbmRWaWV3cyhidWYpe2J1ZmZlcj1idWY7TW9kdWxlW1wiSEVBUDhcIl09SEVBUDg9bmV3IEludDhBcnJheShidWYpO01vZHVsZVtcIkhFQVAxNlwiXT1IRUFQMTY9bmV3IEludDE2QXJyYXkoYnVmKTtNb2R1bGVbXCJIRUFQMzJcIl09SEVBUDMyPW5ldyBJbnQzMkFycmF5KGJ1Zik7TW9kdWxlW1wiSEVBUFU4XCJdPUhFQVBVOD1uZXcgVWludDhBcnJheShidWYpO01vZHVsZVtcIkhFQVBVMTZcIl09SEVBUFUxNj1uZXcgVWludDE2QXJyYXkoYnVmKTtNb2R1bGVbXCJIRUFQVTMyXCJdPUhFQVBVMzI9bmV3IFVpbnQzMkFycmF5KGJ1Zik7TW9kdWxlW1wiSEVBUEYzMlwiXT1IRUFQRjMyPW5ldyBGbG9hdDMyQXJyYXkoYnVmKTtNb2R1bGVbXCJIRUFQRjY0XCJdPUhFQVBGNjQ9bmV3IEZsb2F0NjRBcnJheShidWYpfXZhciBJTklUSUFMX01FTU9SWT1Nb2R1bGVbXCJJTklUSUFMX01FTU9SWVwiXXx8MTY3NzcyMTY7aWYoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRCl7d2FzbU1lbW9yeT1Nb2R1bGVbXCJ3YXNtTWVtb3J5XCJdO2J1ZmZlcj1Nb2R1bGVbXCJidWZmZXJcIl19ZWxzZXtpZihNb2R1bGVbXCJ3YXNtTWVtb3J5XCJdKXt3YXNtTWVtb3J5PU1vZHVsZVtcIndhc21NZW1vcnlcIl19ZWxzZXt3YXNtTWVtb3J5PW5ldyBXZWJBc3NlbWJseS5NZW1vcnkoe1wiaW5pdGlhbFwiOklOSVRJQUxfTUVNT1JZLzY1NTM2LFwibWF4aW11bVwiOjIxNDc0ODM2NDgvNjU1MzYsXCJzaGFyZWRcIjp0cnVlfSk7aWYoISh3YXNtTWVtb3J5LmJ1ZmZlciBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyKSl7ZXJyKFwicmVxdWVzdGVkIGEgc2hhcmVkIFdlYkFzc2VtYmx5Lk1lbW9yeSBidXQgdGhlIHJldHVybmVkIGJ1ZmZlciBpcyBub3QgYSBTaGFyZWRBcnJheUJ1ZmZlciwgaW5kaWNhdGluZyB0aGF0IHdoaWxlIHRoZSBicm93c2VyIGhhcyBTaGFyZWRBcnJheUJ1ZmZlciBpdCBkb2VzIG5vdCBoYXZlIFdlYkFzc2VtYmx5IHRocmVhZHMgc3VwcG9ydCAtIHlvdSBtYXkgbmVlZCB0byBzZXQgYSBmbGFnXCIpO2lmKEVOVklST05NRU5UX0lTX05PREUpe2NvbnNvbGUubG9nKFwiKG9uIG5vZGUgeW91IG1heSBuZWVkOiAtLWV4cGVyaW1lbnRhbC13YXNtLXRocmVhZHMgLS1leHBlcmltZW50YWwtd2FzbS1idWxrLW1lbW9yeSBhbmQgYWxzbyB1c2UgYSByZWNlbnQgdmVyc2lvbilcIil9dGhyb3cgRXJyb3IoXCJiYWQgbWVtb3J5XCIpfX19aWYod2FzbU1lbW9yeSl7YnVmZmVyPXdhc21NZW1vcnkuYnVmZmVyfUlOSVRJQUxfTUVNT1JZPWJ1ZmZlci5ieXRlTGVuZ3RoO3VwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzKGJ1ZmZlcik7dmFyIHdhc21UYWJsZTt2YXIgX19BVFBSRVJVTl9fPVtdO3ZhciBfX0FUSU5JVF9fPVtdO3ZhciBfX0FUTUFJTl9fPVtdO3ZhciBfX0FURVhJVF9fPVtdO3ZhciBfX0FUUE9TVFJVTl9fPVtdO3ZhciBydW50aW1lSW5pdGlhbGl6ZWQ9ZmFsc2U7dmFyIHJ1bnRpbWVFeGl0ZWQ9ZmFsc2U7aWYoIUVOVklST05NRU5UX0lTX1BUSFJFQUQpX19BVElOSVRfXy5wdXNoKHtmdW5jOmZ1bmN0aW9uKCl7X19fd2FzbV9jYWxsX2N0b3JzKCl9fSk7ZnVuY3Rpb24gcHJlUnVuKCl7aWYoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRClyZXR1cm47aWYoTW9kdWxlW1wicHJlUnVuXCJdKXtpZih0eXBlb2YgTW9kdWxlW1wicHJlUnVuXCJdPT1cImZ1bmN0aW9uXCIpTW9kdWxlW1wicHJlUnVuXCJdPVtNb2R1bGVbXCJwcmVSdW5cIl1dO3doaWxlKE1vZHVsZVtcInByZVJ1blwiXS5sZW5ndGgpe2FkZE9uUHJlUnVuKE1vZHVsZVtcInByZVJ1blwiXS5zaGlmdCgpKX19Y2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVFBSRVJVTl9fKX1mdW5jdGlvbiBpbml0UnVudGltZSgpe3J1bnRpbWVJbml0aWFsaXplZD10cnVlO2lmKEVOVklST05NRU5UX0lTX1BUSFJFQUQpcmV0dXJuO2NhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRJTklUX18pfWZ1bmN0aW9uIHByZU1haW4oKXtpZihFTlZJUk9OTUVOVF9JU19QVEhSRUFEKXJldHVybjtjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUTUFJTl9fKX1mdW5jdGlvbiBleGl0UnVudGltZSgpe2lmKEVOVklST05NRU5UX0lTX1BUSFJFQUQpcmV0dXJuO3J1bnRpbWVFeGl0ZWQ9dHJ1ZX1mdW5jdGlvbiBwb3N0UnVuKCl7aWYoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRClyZXR1cm47aWYoTW9kdWxlW1wicG9zdFJ1blwiXSl7aWYodHlwZW9mIE1vZHVsZVtcInBvc3RSdW5cIl09PVwiZnVuY3Rpb25cIilNb2R1bGVbXCJwb3N0UnVuXCJdPVtNb2R1bGVbXCJwb3N0UnVuXCJdXTt3aGlsZShNb2R1bGVbXCJwb3N0UnVuXCJdLmxlbmd0aCl7YWRkT25Qb3N0UnVuKE1vZHVsZVtcInBvc3RSdW5cIl0uc2hpZnQoKSl9fWNhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRQT1NUUlVOX18pfWZ1bmN0aW9uIGFkZE9uUHJlUnVuKGNiKXtfX0FUUFJFUlVOX18udW5zaGlmdChjYil9ZnVuY3Rpb24gYWRkT25Qb3N0UnVuKGNiKXtfX0FUUE9TVFJVTl9fLnVuc2hpZnQoY2IpfXZhciBydW5EZXBlbmRlbmNpZXM9MDt2YXIgcnVuRGVwZW5kZW5jeVdhdGNoZXI9bnVsbDt2YXIgZGVwZW5kZW5jaWVzRnVsZmlsbGVkPW51bGw7ZnVuY3Rpb24gYWRkUnVuRGVwZW5kZW5jeShpZCl7YXNzZXJ0KCFFTlZJUk9OTUVOVF9JU19QVEhSRUFELFwiYWRkUnVuRGVwZW5kZW5jeSBjYW5ub3QgYmUgdXNlZCBpbiBhIHB0aHJlYWQgd29ya2VyXCIpO3J1bkRlcGVuZGVuY2llcysrO2lmKE1vZHVsZVtcIm1vbml0b3JSdW5EZXBlbmRlbmNpZXNcIl0pe01vZHVsZVtcIm1vbml0b3JSdW5EZXBlbmRlbmNpZXNcIl0ocnVuRGVwZW5kZW5jaWVzKX19ZnVuY3Rpb24gcmVtb3ZlUnVuRGVwZW5kZW5jeShpZCl7cnVuRGVwZW5kZW5jaWVzLS07aWYoTW9kdWxlW1wibW9uaXRvclJ1bkRlcGVuZGVuY2llc1wiXSl7TW9kdWxlW1wibW9uaXRvclJ1bkRlcGVuZGVuY2llc1wiXShydW5EZXBlbmRlbmNpZXMpfWlmKHJ1bkRlcGVuZGVuY2llcz09MCl7aWYocnVuRGVwZW5kZW5jeVdhdGNoZXIhPT1udWxsKXtjbGVhckludGVydmFsKHJ1bkRlcGVuZGVuY3lXYXRjaGVyKTtydW5EZXBlbmRlbmN5V2F0Y2hlcj1udWxsfWlmKGRlcGVuZGVuY2llc0Z1bGZpbGxlZCl7dmFyIGNhbGxiYWNrPWRlcGVuZGVuY2llc0Z1bGZpbGxlZDtkZXBlbmRlbmNpZXNGdWxmaWxsZWQ9bnVsbDtjYWxsYmFjaygpfX19TW9kdWxlW1wicHJlbG9hZGVkSW1hZ2VzXCJdPXt9O01vZHVsZVtcInByZWxvYWRlZEF1ZGlvc1wiXT17fTtmdW5jdGlvbiBhYm9ydCh3aGF0KXtpZihNb2R1bGVbXCJvbkFib3J0XCJdKXtNb2R1bGVbXCJvbkFib3J0XCJdKHdoYXQpfWlmKEVOVklST05NRU5UX0lTX1BUSFJFQUQpY29uc29sZS5lcnJvcihcIlB0aHJlYWQgYWJvcnRpbmcgYXQgXCIrKG5ldyBFcnJvcikuc3RhY2spO3doYXQrPVwiXCI7ZXJyKHdoYXQpO0FCT1JUPXRydWU7RVhJVFNUQVRVUz0xO3doYXQ9XCJhYm9ydChcIit3aGF0K1wiKS4gQnVpbGQgd2l0aCAtcyBBU1NFUlRJT05TPTEgZm9yIG1vcmUgaW5mby5cIjt2YXIgZT1uZXcgV2ViQXNzZW1ibHkuUnVudGltZUVycm9yKHdoYXQpO3JlYWR5UHJvbWlzZVJlamVjdChlKTt0aHJvdyBlfWZ1bmN0aW9uIGhhc1ByZWZpeChzdHIscHJlZml4KXtyZXR1cm4gU3RyaW5nLnByb3RvdHlwZS5zdGFydHNXaXRoP3N0ci5zdGFydHNXaXRoKHByZWZpeCk6c3RyLmluZGV4T2YocHJlZml4KT09PTB9dmFyIGRhdGFVUklQcmVmaXg9XCJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsXCI7ZnVuY3Rpb24gaXNEYXRhVVJJKGZpbGVuYW1lKXtyZXR1cm4gaGFzUHJlZml4KGZpbGVuYW1lLGRhdGFVUklQcmVmaXgpfXZhciBmaWxlVVJJUHJlZml4PVwiZmlsZTovL1wiO2Z1bmN0aW9uIGlzRmlsZVVSSShmaWxlbmFtZSl7cmV0dXJuIGhhc1ByZWZpeChmaWxlbmFtZSxmaWxlVVJJUHJlZml4KX12YXIgd2FzbUJpbmFyeUZpbGU9XCJ0ZmpzLWJhY2tlbmQtd2FzbS10aHJlYWRlZC1zaW1kLndhc21cIjtpZighaXNEYXRhVVJJKHdhc21CaW5hcnlGaWxlKSl7d2FzbUJpbmFyeUZpbGU9bG9jYXRlRmlsZSh3YXNtQmluYXJ5RmlsZSl9ZnVuY3Rpb24gZ2V0QmluYXJ5KGZpbGUpe3RyeXtpZihmaWxlPT13YXNtQmluYXJ5RmlsZSYmd2FzbUJpbmFyeSl7cmV0dXJuIG5ldyBVaW50OEFycmF5KHdhc21CaW5hcnkpfWlmKHJlYWRCaW5hcnkpe3JldHVybiByZWFkQmluYXJ5KGZpbGUpfWVsc2V7dGhyb3dcImJvdGggYXN5bmMgYW5kIHN5bmMgZmV0Y2hpbmcgb2YgdGhlIHdhc20gZmFpbGVkXCJ9fWNhdGNoKGVycil7YWJvcnQoZXJyKX19ZnVuY3Rpb24gZ2V0QmluYXJ5UHJvbWlzZSgpe2lmKCF3YXNtQmluYXJ5JiYoRU5WSVJPTk1FTlRfSVNfV0VCfHxFTlZJUk9OTUVOVF9JU19XT1JLRVIpKXtpZih0eXBlb2YgZmV0Y2g9PT1cImZ1bmN0aW9uXCImJiFpc0ZpbGVVUkkod2FzbUJpbmFyeUZpbGUpKXtyZXR1cm4gZmV0Y2god2FzbUJpbmFyeUZpbGUse2NyZWRlbnRpYWxzOlwic2FtZS1vcmlnaW5cIn0pLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2Upe2lmKCFyZXNwb25zZVtcIm9rXCJdKXt0aHJvd1wiZmFpbGVkIHRvIGxvYWQgd2FzbSBiaW5hcnkgZmlsZSBhdCAnXCIrd2FzbUJpbmFyeUZpbGUrXCInXCJ9cmV0dXJuIHJlc3BvbnNlW1wiYXJyYXlCdWZmZXJcIl0oKX0pLmNhdGNoKGZ1bmN0aW9uKCl7cmV0dXJuIGdldEJpbmFyeSh3YXNtQmluYXJ5RmlsZSl9KX1lbHNle2lmKHJlYWRBc3luYyl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUscmVqZWN0KXtyZWFkQXN5bmMod2FzbUJpbmFyeUZpbGUsZnVuY3Rpb24ocmVzcG9uc2Upe3Jlc29sdmUobmV3IFVpbnQ4QXJyYXkocmVzcG9uc2UpKX0scmVqZWN0KX0pfX19cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gZ2V0QmluYXJ5KHdhc21CaW5hcnlGaWxlKX0pfWZ1bmN0aW9uIGNyZWF0ZVdhc20oKXt2YXIgaW5mbz17XCJhXCI6YXNtTGlicmFyeUFyZ307ZnVuY3Rpb24gcmVjZWl2ZUluc3RhbmNlKGluc3RhbmNlLG1vZHVsZSl7dmFyIGV4cG9ydHM9aW5zdGFuY2UuZXhwb3J0cztNb2R1bGVbXCJhc21cIl09ZXhwb3J0czt3YXNtVGFibGU9TW9kdWxlW1wiYXNtXCJdW1wiRlwiXTt3YXNtTW9kdWxlPW1vZHVsZTtpZighRU5WSVJPTk1FTlRfSVNfUFRIUkVBRCl7dmFyIG51bVdvcmtlcnNUb0xvYWQ9UFRocmVhZC51bnVzZWRXb3JrZXJzLmxlbmd0aDtQVGhyZWFkLnVudXNlZFdvcmtlcnMuZm9yRWFjaChmdW5jdGlvbih3KXtQVGhyZWFkLmxvYWRXYXNtTW9kdWxlVG9Xb3JrZXIodyxmdW5jdGlvbigpe2lmKCEtLW51bVdvcmtlcnNUb0xvYWQpcmVtb3ZlUnVuRGVwZW5kZW5jeShcIndhc20taW5zdGFudGlhdGVcIil9KX0pfX1pZighRU5WSVJPTk1FTlRfSVNfUFRIUkVBRCl7YWRkUnVuRGVwZW5kZW5jeShcIndhc20taW5zdGFudGlhdGVcIil9ZnVuY3Rpb24gcmVjZWl2ZUluc3RhbnRpYXRlZFNvdXJjZShvdXRwdXQpe3JlY2VpdmVJbnN0YW5jZShvdXRwdXRbXCJpbnN0YW5jZVwiXSxvdXRwdXRbXCJtb2R1bGVcIl0pfWZ1bmN0aW9uIGluc3RhbnRpYXRlQXJyYXlCdWZmZXIocmVjZWl2ZXIpe3JldHVybiBnZXRCaW5hcnlQcm9taXNlKCkudGhlbihmdW5jdGlvbihiaW5hcnkpe3JldHVybiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShiaW5hcnksaW5mbyl9KS50aGVuKHJlY2VpdmVyLGZ1bmN0aW9uKHJlYXNvbil7ZXJyKFwiZmFpbGVkIHRvIGFzeW5jaHJvbm91c2x5IHByZXBhcmUgd2FzbTogXCIrcmVhc29uKTthYm9ydChyZWFzb24pfSl9ZnVuY3Rpb24gaW5zdGFudGlhdGVBc3luYygpe2lmKCF3YXNtQmluYXJ5JiZ0eXBlb2YgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmc9PT1cImZ1bmN0aW9uXCImJiFpc0RhdGFVUkkod2FzbUJpbmFyeUZpbGUpJiYhaXNGaWxlVVJJKHdhc21CaW5hcnlGaWxlKSYmdHlwZW9mIGZldGNoPT09XCJmdW5jdGlvblwiKXtyZXR1cm4gZmV0Y2god2FzbUJpbmFyeUZpbGUse2NyZWRlbnRpYWxzOlwic2FtZS1vcmlnaW5cIn0pLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2Upe3ZhciByZXN1bHQ9V2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcocmVzcG9uc2UsaW5mbyk7cmV0dXJuIHJlc3VsdC50aGVuKHJlY2VpdmVJbnN0YW50aWF0ZWRTb3VyY2UsZnVuY3Rpb24ocmVhc29uKXtlcnIoXCJ3YXNtIHN0cmVhbWluZyBjb21waWxlIGZhaWxlZDogXCIrcmVhc29uKTtlcnIoXCJmYWxsaW5nIGJhY2sgdG8gQXJyYXlCdWZmZXIgaW5zdGFudGlhdGlvblwiKTtyZXR1cm4gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlSW5zdGFudGlhdGVkU291cmNlKX0pfSl9ZWxzZXtyZXR1cm4gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlSW5zdGFudGlhdGVkU291cmNlKX19aWYoTW9kdWxlW1wiaW5zdGFudGlhdGVXYXNtXCJdKXt0cnl7dmFyIGV4cG9ydHM9TW9kdWxlW1wiaW5zdGFudGlhdGVXYXNtXCJdKGluZm8scmVjZWl2ZUluc3RhbmNlKTtyZXR1cm4gZXhwb3J0c31jYXRjaChlKXtlcnIoXCJNb2R1bGUuaW5zdGFudGlhdGVXYXNtIGNhbGxiYWNrIGZhaWxlZCB3aXRoIGVycm9yOiBcIitlKTtyZXR1cm4gZmFsc2V9fWluc3RhbnRpYXRlQXN5bmMoKS5jYXRjaChyZWFkeVByb21pc2VSZWplY3QpO3JldHVybnt9fXZhciBBU01fQ09OU1RTPXs5ODMyOmZ1bmN0aW9uKCl7dGhyb3dcIkNhbmNlbGVkIVwifSw5ODUwOmZ1bmN0aW9uKCQwLCQxKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7X19lbXNjcmlwdGVuX2RvX2Rpc3BhdGNoX3RvX3RocmVhZCgkMCwkMSl9LDApfX07ZnVuY3Rpb24gaW5pdFB0aHJlYWRzSlMoKXtQVGhyZWFkLmluaXRSdW50aW1lKCl9ZnVuY3Rpb24gY2FsbFJ1bnRpbWVDYWxsYmFja3MoY2FsbGJhY2tzKXt3aGlsZShjYWxsYmFja3MubGVuZ3RoPjApe3ZhciBjYWxsYmFjaz1jYWxsYmFja3Muc2hpZnQoKTtpZih0eXBlb2YgY2FsbGJhY2s9PVwiZnVuY3Rpb25cIil7Y2FsbGJhY2soTW9kdWxlKTtjb250aW51ZX12YXIgZnVuYz1jYWxsYmFjay5mdW5jO2lmKHR5cGVvZiBmdW5jPT09XCJudW1iZXJcIil7aWYoY2FsbGJhY2suYXJnPT09dW5kZWZpbmVkKXt3YXNtVGFibGUuZ2V0KGZ1bmMpKCl9ZWxzZXt3YXNtVGFibGUuZ2V0KGZ1bmMpKGNhbGxiYWNrLmFyZyl9fWVsc2V7ZnVuYyhjYWxsYmFjay5hcmc9PT11bmRlZmluZWQ/bnVsbDpjYWxsYmFjay5hcmcpfX19ZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fZnV0ZXhfd2FrZShhZGRyLGNvdW50KXtpZihhZGRyPD0wfHxhZGRyPkdST1dBQkxFX0hFQVBfSTgoKS5sZW5ndGh8fGFkZHImMyE9MHx8Y291bnQ8MClyZXR1cm4tMjg7aWYoY291bnQ9PTApcmV0dXJuIDA7aWYoY291bnQ+PTIxNDc0ODM2NDcpY291bnQ9SW5maW5pdHk7dmFyIG1haW5UaHJlYWRXYWl0QWRkcmVzcz1BdG9taWNzLmxvYWQoR1JPV0FCTEVfSEVBUF9JMzIoKSxfX2Vtc2NyaXB0ZW5fbWFpbl90aHJlYWRfZnV0ZXg+PjIpO3ZhciBtYWluVGhyZWFkV29rZW49MDtpZihtYWluVGhyZWFkV2FpdEFkZHJlc3M9PWFkZHIpe3ZhciBsb2FkZWRBZGRyPUF0b21pY3MuY29tcGFyZUV4Y2hhbmdlKEdST1dBQkxFX0hFQVBfSTMyKCksX19lbXNjcmlwdGVuX21haW5fdGhyZWFkX2Z1dGV4Pj4yLG1haW5UaHJlYWRXYWl0QWRkcmVzcywwKTtpZihsb2FkZWRBZGRyPT1tYWluVGhyZWFkV2FpdEFkZHJlc3Mpey0tY291bnQ7bWFpblRocmVhZFdva2VuPTE7aWYoY291bnQ8PTApcmV0dXJuIDF9fXZhciByZXQ9QXRvbWljcy5ub3RpZnkoR1JPV0FCTEVfSEVBUF9JMzIoKSxhZGRyPj4yLGNvdW50KTtpZihyZXQ+PTApcmV0dXJuIHJldCttYWluVGhyZWFkV29rZW47dGhyb3dcIkF0b21pY3Mubm90aWZ5IHJldHVybmVkIGFuIHVuZXhwZWN0ZWQgdmFsdWUgXCIrcmV0fU1vZHVsZVtcIl9lbXNjcmlwdGVuX2Z1dGV4X3dha2VcIl09X2Vtc2NyaXB0ZW5fZnV0ZXhfd2FrZTtmdW5jdGlvbiBraWxsVGhyZWFkKHB0aHJlYWRfcHRyKXtpZihFTlZJUk9OTUVOVF9JU19QVEhSRUFEKXRocm93XCJJbnRlcm5hbCBFcnJvciEga2lsbFRocmVhZCgpIGNhbiBvbmx5IGV2ZXIgYmUgY2FsbGVkIGZyb20gbWFpbiBhcHBsaWNhdGlvbiB0aHJlYWQhXCI7aWYoIXB0aHJlYWRfcHRyKXRocm93XCJJbnRlcm5hbCBFcnJvciEgTnVsbCBwdGhyZWFkX3B0ciBpbiBraWxsVGhyZWFkIVwiO0dST1dBQkxFX0hFQVBfSTMyKClbcHRocmVhZF9wdHIrMTI+PjJdPTA7dmFyIHB0aHJlYWQ9UFRocmVhZC5wdGhyZWFkc1twdGhyZWFkX3B0cl07cHRocmVhZC53b3JrZXIudGVybWluYXRlKCk7UFRocmVhZC5mcmVlVGhyZWFkRGF0YShwdGhyZWFkKTtQVGhyZWFkLnJ1bm5pbmdXb3JrZXJzLnNwbGljZShQVGhyZWFkLnJ1bm5pbmdXb3JrZXJzLmluZGV4T2YocHRocmVhZC53b3JrZXIpLDEpO3B0aHJlYWQud29ya2VyLnB0aHJlYWQ9dW5kZWZpbmVkfWZ1bmN0aW9uIGNhbmNlbFRocmVhZChwdGhyZWFkX3B0cil7aWYoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRCl0aHJvd1wiSW50ZXJuYWwgRXJyb3IhIGNhbmNlbFRocmVhZCgpIGNhbiBvbmx5IGV2ZXIgYmUgY2FsbGVkIGZyb20gbWFpbiBhcHBsaWNhdGlvbiB0aHJlYWQhXCI7aWYoIXB0aHJlYWRfcHRyKXRocm93XCJJbnRlcm5hbCBFcnJvciEgTnVsbCBwdGhyZWFkX3B0ciBpbiBjYW5jZWxUaHJlYWQhXCI7dmFyIHB0aHJlYWQ9UFRocmVhZC5wdGhyZWFkc1twdGhyZWFkX3B0cl07cHRocmVhZC53b3JrZXIucG9zdE1lc3NhZ2Uoe1wiY21kXCI6XCJjYW5jZWxcIn0pfWZ1bmN0aW9uIGNsZWFudXBUaHJlYWQocHRocmVhZF9wdHIpe2lmKEVOVklST05NRU5UX0lTX1BUSFJFQUQpdGhyb3dcIkludGVybmFsIEVycm9yISBjbGVhbnVwVGhyZWFkKCkgY2FuIG9ubHkgZXZlciBiZSBjYWxsZWQgZnJvbSBtYWluIGFwcGxpY2F0aW9uIHRocmVhZCFcIjtpZighcHRocmVhZF9wdHIpdGhyb3dcIkludGVybmFsIEVycm9yISBOdWxsIHB0aHJlYWRfcHRyIGluIGNsZWFudXBUaHJlYWQhXCI7dmFyIHB0aHJlYWQ9UFRocmVhZC5wdGhyZWFkc1twdGhyZWFkX3B0cl07aWYocHRocmVhZCl7R1JPV0FCTEVfSEVBUF9JMzIoKVtwdGhyZWFkX3B0cisxMj4+Ml09MDt2YXIgd29ya2VyPXB0aHJlYWQud29ya2VyO1BUaHJlYWQucmV0dXJuV29ya2VyVG9Qb29sKHdvcmtlcil9fXZhciBQVGhyZWFkPXt1bnVzZWRXb3JrZXJzOltdLHJ1bm5pbmdXb3JrZXJzOltdLGluaXRNYWluVGhyZWFkQmxvY2s6ZnVuY3Rpb24oKXt2YXIgcHRocmVhZFBvb2xTaXplPU1hdGgubWluKDQsTWF0aC5tYXgoMSwobmF2aWdhdG9yLmhhcmR3YXJlQ29uY3VycmVuY3l8fDEpLzIpKTtmb3IodmFyIGk9MDtpPHB0aHJlYWRQb29sU2l6ZTsrK2kpe1BUaHJlYWQuYWxsb2NhdGVVbnVzZWRXb3JrZXIoKX19LGluaXRSdW50aW1lOmZ1bmN0aW9uKCl7dmFyIHRiPV9tYWxsb2MoMjI4KTtmb3IodmFyIGk9MDtpPDIyOC80OysraSlHUk9XQUJMRV9IRUFQX1UzMigpW3RiLzQraV09MDtHUk9XQUJMRV9IRUFQX0kzMigpW3RiKzEyPj4yXT10Yjt2YXIgaGVhZFB0cj10YisxNTI7R1JPV0FCTEVfSEVBUF9JMzIoKVtoZWFkUHRyPj4yXT1oZWFkUHRyO3ZhciB0bHNNZW1vcnk9X21hbGxvYyg1MTIpO2Zvcih2YXIgaT0wO2k8MTI4OysraSlHUk9XQUJMRV9IRUFQX1UzMigpW3Rsc01lbW9yeS80K2ldPTA7QXRvbWljcy5zdG9yZShHUk9XQUJMRV9IRUFQX1UzMigpLHRiKzEwMD4+Mix0bHNNZW1vcnkpO0F0b21pY3Muc3RvcmUoR1JPV0FCTEVfSEVBUF9VMzIoKSx0Yis0MD4+Mix0Yik7X19lbXNjcmlwdGVuX3RocmVhZF9pbml0KHRiLCFFTlZJUk9OTUVOVF9JU19XT1JLRVIsMSk7X2Vtc2NyaXB0ZW5fcmVnaXN0ZXJfbWFpbl9icm93c2VyX3RocmVhZF9pZCh0Yil9LGluaXRXb3JrZXI6ZnVuY3Rpb24oKXt9LHB0aHJlYWRzOnt9LHRocmVhZEV4aXRIYW5kbGVyczpbXSxzZXRUaHJlYWRTdGF0dXM6ZnVuY3Rpb24oKXt9LHJ1bkV4aXRIYW5kbGVyczpmdW5jdGlvbigpe3doaWxlKFBUaHJlYWQudGhyZWFkRXhpdEhhbmRsZXJzLmxlbmd0aD4wKXtQVGhyZWFkLnRocmVhZEV4aXRIYW5kbGVycy5wb3AoKSgpfWlmKEVOVklST05NRU5UX0lTX1BUSFJFQUQmJl9wdGhyZWFkX3NlbGYoKSlfX19wdGhyZWFkX3RzZF9ydW5fZHRvcnMoKX0scnVuRXhpdEhhbmRsZXJzQW5kRGVpbml0VGhyZWFkOmZ1bmN0aW9uKHRiLGV4aXRDb2RlKXtBdG9taWNzLnN0b3JlKEdST1dBQkxFX0hFQVBfVTMyKCksdGIrNTY+PjIsMSk7QXRvbWljcy5zdG9yZShHUk9XQUJMRV9IRUFQX1UzMigpLHRiKzYwPj4yLDApO1BUaHJlYWQucnVuRXhpdEhhbmRsZXJzKCk7QXRvbWljcy5zdG9yZShHUk9XQUJMRV9IRUFQX1UzMigpLHRiKzQ+PjIsZXhpdENvZGUpO0F0b21pY3Muc3RvcmUoR1JPV0FCTEVfSEVBUF9VMzIoKSx0YiswPj4yLDEpO19lbXNjcmlwdGVuX2Z1dGV4X3dha2UodGIrMCwyMTQ3NDgzNjQ3KTtfX2Vtc2NyaXB0ZW5fdGhyZWFkX2luaXQoMCwwLDApfSx0aHJlYWRFeGl0OmZ1bmN0aW9uKGV4aXRDb2RlKXt2YXIgdGI9X3B0aHJlYWRfc2VsZigpO2lmKHRiKXtQVGhyZWFkLnJ1bkV4aXRIYW5kbGVyc0FuZERlaW5pdFRocmVhZCh0YixleGl0Q29kZSk7aWYoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRCl7cG9zdE1lc3NhZ2Uoe1wiY21kXCI6XCJleGl0XCJ9KX19fSx0aHJlYWRDYW5jZWw6ZnVuY3Rpb24oKXtQVGhyZWFkLnJ1bkV4aXRIYW5kbGVyc0FuZERlaW5pdFRocmVhZChfcHRocmVhZF9zZWxmKCksLTEpO3Bvc3RNZXNzYWdlKHtcImNtZFwiOlwiY2FuY2VsRG9uZVwifSl9LHRlcm1pbmF0ZUFsbFRocmVhZHM6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gUFRocmVhZC5wdGhyZWFkcyl7dmFyIHB0aHJlYWQ9UFRocmVhZC5wdGhyZWFkc1t0XTtpZihwdGhyZWFkJiZwdGhyZWFkLndvcmtlcil7UFRocmVhZC5yZXR1cm5Xb3JrZXJUb1Bvb2wocHRocmVhZC53b3JrZXIpfX1QVGhyZWFkLnB0aHJlYWRzPXt9O2Zvcih2YXIgaT0wO2k8UFRocmVhZC51bnVzZWRXb3JrZXJzLmxlbmd0aDsrK2kpe3ZhciB3b3JrZXI9UFRocmVhZC51bnVzZWRXb3JrZXJzW2ldO3dvcmtlci50ZXJtaW5hdGUoKX1QVGhyZWFkLnVudXNlZFdvcmtlcnM9W107Zm9yKHZhciBpPTA7aTxQVGhyZWFkLnJ1bm5pbmdXb3JrZXJzLmxlbmd0aDsrK2kpe3ZhciB3b3JrZXI9UFRocmVhZC5ydW5uaW5nV29ya2Vyc1tpXTt2YXIgcHRocmVhZD13b3JrZXIucHRocmVhZDtQVGhyZWFkLmZyZWVUaHJlYWREYXRhKHB0aHJlYWQpO3dvcmtlci50ZXJtaW5hdGUoKX1QVGhyZWFkLnJ1bm5pbmdXb3JrZXJzPVtdfSxmcmVlVGhyZWFkRGF0YTpmdW5jdGlvbihwdGhyZWFkKXtpZighcHRocmVhZClyZXR1cm47aWYocHRocmVhZC50aHJlYWRJbmZvU3RydWN0KXt2YXIgdGxzTWVtb3J5PUdST1dBQkxFX0hFQVBfSTMyKClbcHRocmVhZC50aHJlYWRJbmZvU3RydWN0KzEwMD4+Ml07R1JPV0FCTEVfSEVBUF9JMzIoKVtwdGhyZWFkLnRocmVhZEluZm9TdHJ1Y3QrMTAwPj4yXT0wO19mcmVlKHRsc01lbW9yeSk7X2ZyZWUocHRocmVhZC50aHJlYWRJbmZvU3RydWN0KX1wdGhyZWFkLnRocmVhZEluZm9TdHJ1Y3Q9MDtpZihwdGhyZWFkLmFsbG9jYXRlZE93blN0YWNrJiZwdGhyZWFkLnN0YWNrQmFzZSlfZnJlZShwdGhyZWFkLnN0YWNrQmFzZSk7cHRocmVhZC5zdGFja0Jhc2U9MDtpZihwdGhyZWFkLndvcmtlcilwdGhyZWFkLndvcmtlci5wdGhyZWFkPW51bGx9LHJldHVybldvcmtlclRvUG9vbDpmdW5jdGlvbih3b3JrZXIpe1BUaHJlYWQucnVuV2l0aG91dE1haW5UaHJlYWRRdWV1ZWRDYWxscyhmdW5jdGlvbigpe2RlbGV0ZSBQVGhyZWFkLnB0aHJlYWRzW3dvcmtlci5wdGhyZWFkLnRocmVhZEluZm9TdHJ1Y3RdO1BUaHJlYWQudW51c2VkV29ya2Vycy5wdXNoKHdvcmtlcik7UFRocmVhZC5ydW5uaW5nV29ya2Vycy5zcGxpY2UoUFRocmVhZC5ydW5uaW5nV29ya2Vycy5pbmRleE9mKHdvcmtlciksMSk7UFRocmVhZC5mcmVlVGhyZWFkRGF0YSh3b3JrZXIucHRocmVhZCk7d29ya2VyLnB0aHJlYWQ9dW5kZWZpbmVkfSl9LHJ1bldpdGhvdXRNYWluVGhyZWFkUXVldWVkQ2FsbHM6ZnVuY3Rpb24oZnVuYyl7R1JPV0FCTEVfSEVBUF9JMzIoKVtfX2Vtc2NyaXB0ZW5fYWxsb3dfbWFpbl9ydW50aW1lX3F1ZXVlZF9jYWxscz4+Ml09MDt0cnl7ZnVuYygpfWZpbmFsbHl7R1JPV0FCTEVfSEVBUF9JMzIoKVtfX2Vtc2NyaXB0ZW5fYWxsb3dfbWFpbl9ydW50aW1lX3F1ZXVlZF9jYWxscz4+Ml09MX19LHJlY2VpdmVPYmplY3RUcmFuc2ZlcjpmdW5jdGlvbihkYXRhKXt9LGxvYWRXYXNtTW9kdWxlVG9Xb3JrZXI6ZnVuY3Rpb24od29ya2VyLG9uRmluaXNoZWRMb2FkaW5nKXt3b3JrZXIub25tZXNzYWdlPWZ1bmN0aW9uKGUpe3ZhciBkPWVbXCJkYXRhXCJdO3ZhciBjbWQ9ZFtcImNtZFwiXTtpZih3b3JrZXIucHRocmVhZClQVGhyZWFkLmN1cnJlbnRQcm94aWVkT3BlcmF0aW9uQ2FsbGVyVGhyZWFkPXdvcmtlci5wdGhyZWFkLnRocmVhZEluZm9TdHJ1Y3Q7aWYoZFtcInRhcmdldFRocmVhZFwiXSYmZFtcInRhcmdldFRocmVhZFwiXSE9X3B0aHJlYWRfc2VsZigpKXt2YXIgdGhyZWFkPVBUaHJlYWQucHRocmVhZHNbZC50YXJnZXRUaHJlYWRdO2lmKHRocmVhZCl7dGhyZWFkLndvcmtlci5wb3N0TWVzc2FnZShlLmRhdGEsZFtcInRyYW5zZmVyTGlzdFwiXSl9ZWxzZXtjb25zb2xlLmVycm9yKCdJbnRlcm5hbCBlcnJvciEgV29ya2VyIHNlbnQgYSBtZXNzYWdlIFwiJytjbWQrJ1wiIHRvIHRhcmdldCBwdGhyZWFkICcrZFtcInRhcmdldFRocmVhZFwiXStcIiwgYnV0IHRoYXQgdGhyZWFkIG5vIGxvbmdlciBleGlzdHMhXCIpfVBUaHJlYWQuY3VycmVudFByb3hpZWRPcGVyYXRpb25DYWxsZXJUaHJlYWQ9dW5kZWZpbmVkO3JldHVybn1pZihjbWQ9PT1cInByb2Nlc3NRdWV1ZWRNYWluVGhyZWFkV29ya1wiKXtfZW1zY3JpcHRlbl9tYWluX3RocmVhZF9wcm9jZXNzX3F1ZXVlZF9jYWxscygpfWVsc2UgaWYoY21kPT09XCJzcGF3blRocmVhZFwiKXtzcGF3blRocmVhZChlLmRhdGEpfWVsc2UgaWYoY21kPT09XCJjbGVhbnVwVGhyZWFkXCIpe2NsZWFudXBUaHJlYWQoZFtcInRocmVhZFwiXSl9ZWxzZSBpZihjbWQ9PT1cImtpbGxUaHJlYWRcIil7a2lsbFRocmVhZChkW1widGhyZWFkXCJdKX1lbHNlIGlmKGNtZD09PVwiY2FuY2VsVGhyZWFkXCIpe2NhbmNlbFRocmVhZChkW1widGhyZWFkXCJdKX1lbHNlIGlmKGNtZD09PVwibG9hZGVkXCIpe3dvcmtlci5sb2FkZWQ9dHJ1ZTtpZihvbkZpbmlzaGVkTG9hZGluZylvbkZpbmlzaGVkTG9hZGluZyh3b3JrZXIpO2lmKHdvcmtlci5ydW5QdGhyZWFkKXt3b3JrZXIucnVuUHRocmVhZCgpO2RlbGV0ZSB3b3JrZXIucnVuUHRocmVhZH19ZWxzZSBpZihjbWQ9PT1cInByaW50XCIpe291dChcIlRocmVhZCBcIitkW1widGhyZWFkSWRcIl0rXCI6IFwiK2RbXCJ0ZXh0XCJdKX1lbHNlIGlmKGNtZD09PVwicHJpbnRFcnJcIil7ZXJyKFwiVGhyZWFkIFwiK2RbXCJ0aHJlYWRJZFwiXStcIjogXCIrZFtcInRleHRcIl0pfWVsc2UgaWYoY21kPT09XCJhbGVydFwiKXthbGVydChcIlRocmVhZCBcIitkW1widGhyZWFkSWRcIl0rXCI6IFwiK2RbXCJ0ZXh0XCJdKX1lbHNlIGlmKGNtZD09PVwiZXhpdFwiKXt2YXIgZGV0YWNoZWQ9d29ya2VyLnB0aHJlYWQmJkF0b21pY3MubG9hZChHUk9XQUJMRV9IRUFQX1UzMigpLHdvcmtlci5wdGhyZWFkLnRocmVhZEluZm9TdHJ1Y3QrNjQ+PjIpO2lmKGRldGFjaGVkKXtQVGhyZWFkLnJldHVybldvcmtlclRvUG9vbCh3b3JrZXIpfX1lbHNlIGlmKGNtZD09PVwiZXhpdFByb2Nlc3NcIil7dHJ5e2V4aXQoZFtcInJldHVybkNvZGVcIl0pfWNhdGNoKGUpe2lmKGUgaW5zdGFuY2VvZiBFeGl0U3RhdHVzKXJldHVybjt0aHJvdyBlfX1lbHNlIGlmKGNtZD09PVwiY2FuY2VsRG9uZVwiKXtQVGhyZWFkLnJldHVybldvcmtlclRvUG9vbCh3b3JrZXIpfWVsc2UgaWYoY21kPT09XCJvYmplY3RUcmFuc2ZlclwiKXtQVGhyZWFkLnJlY2VpdmVPYmplY3RUcmFuc2ZlcihlLmRhdGEpfWVsc2UgaWYoZS5kYXRhLnRhcmdldD09PVwic2V0aW1tZWRpYXRlXCIpe3dvcmtlci5wb3N0TWVzc2FnZShlLmRhdGEpfWVsc2V7ZXJyKFwid29ya2VyIHNlbnQgYW4gdW5rbm93biBjb21tYW5kIFwiK2NtZCl9UFRocmVhZC5jdXJyZW50UHJveGllZE9wZXJhdGlvbkNhbGxlclRocmVhZD11bmRlZmluZWR9O3dvcmtlci5vbmVycm9yPWZ1bmN0aW9uKGUpe2VycihcInB0aHJlYWQgc2VudCBhbiBlcnJvciEgXCIrZS5maWxlbmFtZStcIjpcIitlLmxpbmVubytcIjogXCIrZS5tZXNzYWdlKX07aWYoRU5WSVJPTk1FTlRfSVNfTk9ERSl7d29ya2VyLm9uKFwibWVzc2FnZVwiLGZ1bmN0aW9uKGRhdGEpe3dvcmtlci5vbm1lc3NhZ2Uoe2RhdGE6ZGF0YX0pfSk7d29ya2VyLm9uKFwiZXJyb3JcIixmdW5jdGlvbihkYXRhKXt3b3JrZXIub25lcnJvcihkYXRhKX0pO3dvcmtlci5vbihcImV4aXRcIixmdW5jdGlvbihkYXRhKXt9KX13b3JrZXIucG9zdE1lc3NhZ2Uoe1wiY21kXCI6XCJsb2FkXCIsXCJ1cmxPckJsb2JcIjpNb2R1bGVbXCJtYWluU2NyaXB0VXJsT3JCbG9iXCJdfHxfc2NyaXB0RGlyLFwid2FzbU1lbW9yeVwiOndhc21NZW1vcnksXCJ3YXNtTW9kdWxlXCI6d2FzbU1vZHVsZX0pfSxhbGxvY2F0ZVVudXNlZFdvcmtlcjpmdW5jdGlvbigpe3ZhciBwdGhyZWFkTWFpbkpzPWxvY2F0ZUZpbGUoXCJ0ZmpzLWJhY2tlbmQtd2FzbS10aHJlYWRlZC1zaW1kLndvcmtlci5qc1wiKTtQVGhyZWFkLnVudXNlZFdvcmtlcnMucHVzaChuZXcgV29ya2VyKHB0aHJlYWRNYWluSnMpKX0sZ2V0TmV3V29ya2VyOmZ1bmN0aW9uKCl7aWYoUFRocmVhZC51bnVzZWRXb3JrZXJzLmxlbmd0aD09MCl7UFRocmVhZC5hbGxvY2F0ZVVudXNlZFdvcmtlcigpO1BUaHJlYWQubG9hZFdhc21Nb2R1bGVUb1dvcmtlcihQVGhyZWFkLnVudXNlZFdvcmtlcnNbMF0pfWlmKFBUaHJlYWQudW51c2VkV29ya2Vycy5sZW5ndGg+MClyZXR1cm4gUFRocmVhZC51bnVzZWRXb3JrZXJzLnBvcCgpO2Vsc2UgcmV0dXJuIG51bGx9LGJ1c3lTcGluV2FpdDpmdW5jdGlvbihtc2Vjcyl7dmFyIHQ9cGVyZm9ybWFuY2Uubm93KCkrbXNlY3M7d2hpbGUocGVyZm9ybWFuY2Uubm93KCk8dCl7fX19O2Z1bmN0aW9uIGVzdGFibGlzaFN0YWNrU3BhY2Uoc3RhY2tUb3Asc3RhY2tNYXgpe19lbXNjcmlwdGVuX3N0YWNrX3NldF9saW1pdHMoc3RhY2tUb3Asc3RhY2tNYXgpO3N0YWNrUmVzdG9yZShzdGFja1RvcCl9TW9kdWxlW1wiZXN0YWJsaXNoU3RhY2tTcGFjZVwiXT1lc3RhYmxpc2hTdGFja1NwYWNlO2Z1bmN0aW9uIGdldE5vRXhpdFJ1bnRpbWUoKXtyZXR1cm4gbm9FeGl0UnVudGltZX1Nb2R1bGVbXCJnZXROb0V4aXRSdW50aW1lXCJdPWdldE5vRXhpdFJ1bnRpbWU7ZnVuY3Rpb24gaW52b2tlRW50cnlQb2ludChwdHIsYXJnKXtyZXR1cm4gd2FzbVRhYmxlLmdldChwdHIpKGFyZyl9TW9kdWxlW1wiaW52b2tlRW50cnlQb2ludFwiXT1pbnZva2VFbnRyeVBvaW50O2Z1bmN0aW9uIF9fX2Fzc2VydF9mYWlsKGNvbmRpdGlvbixmaWxlbmFtZSxsaW5lLGZ1bmMpe2Fib3J0KFwiQXNzZXJ0aW9uIGZhaWxlZDogXCIrVVRGOFRvU3RyaW5nKGNvbmRpdGlvbikrXCIsIGF0OiBcIitbZmlsZW5hbWU/VVRGOFRvU3RyaW5nKGZpbGVuYW1lKTpcInVua25vd24gZmlsZW5hbWVcIixsaW5lLGZ1bmM/VVRGOFRvU3RyaW5nKGZ1bmMpOlwidW5rbm93biBmdW5jdGlvblwiXSl9ZnVuY3Rpb24gX19fY2FsbF9tYWluKGFyZ2MsYXJndil7dmFyIHJldHVybkNvZGU9X21haW4oYXJnYyxhcmd2KX12YXIgX2Vtc2NyaXB0ZW5fZ2V0X25vdztpZihFTlZJUk9OTUVOVF9JU19OT0RFKXtfZW1zY3JpcHRlbl9nZXRfbm93PWZ1bmN0aW9uKCl7dmFyIHQ9cHJvY2Vzc1tcImhydGltZVwiXSgpO3JldHVybiB0WzBdKjFlMyt0WzFdLzFlNn19ZWxzZSBpZihFTlZJUk9OTUVOVF9JU19QVEhSRUFEKXtfZW1zY3JpcHRlbl9nZXRfbm93PWZ1bmN0aW9uKCl7cmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpLU1vZHVsZVtcIl9fcGVyZm9ybWFuY2Vfbm93X2Nsb2NrX2RyaWZ0XCJdfX1lbHNlIGlmKHR5cGVvZiBkYXRlTm93IT09XCJ1bmRlZmluZWRcIil7X2Vtc2NyaXB0ZW5fZ2V0X25vdz1kYXRlTm93fWVsc2UgX2Vtc2NyaXB0ZW5fZ2V0X25vdz1mdW5jdGlvbigpe3JldHVybiBwZXJmb3JtYW5jZS5ub3coKX07ZnVuY3Rpb24gc2V0RXJyTm8odmFsdWUpe0dST1dBQkxFX0hFQVBfSTMyKClbX19fZXJybm9fbG9jYXRpb24oKT4+Ml09dmFsdWU7cmV0dXJuIHZhbHVlfWZ1bmN0aW9uIF9hdGV4aXQoZnVuYyxhcmcpe2lmKEVOVklST05NRU5UX0lTX1BUSFJFQUQpcmV0dXJuIF9lbXNjcmlwdGVuX3Byb3h5X3RvX21haW5fdGhyZWFkX2pzKDEsMSxmdW5jLGFyZyl9ZnVuY3Rpb24gX19lbXNjcmlwdGVuX25vdGlmeV90aHJlYWRfcXVldWUodGFyZ2V0VGhyZWFkSWQsbWFpblRocmVhZElkKXtpZih0YXJnZXRUaHJlYWRJZD09bWFpblRocmVhZElkKXtwb3N0TWVzc2FnZSh7XCJjbWRcIjpcInByb2Nlc3NRdWV1ZWRNYWluVGhyZWFkV29ya1wifSl9ZWxzZSBpZihFTlZJUk9OTUVOVF9JU19QVEhSRUFEKXtwb3N0TWVzc2FnZSh7XCJ0YXJnZXRUaHJlYWRcIjp0YXJnZXRUaHJlYWRJZCxcImNtZFwiOlwicHJvY2Vzc1RocmVhZFF1ZXVlXCJ9KX1lbHNle3ZhciBwdGhyZWFkPVBUaHJlYWQucHRocmVhZHNbdGFyZ2V0VGhyZWFkSWRdO3ZhciB3b3JrZXI9cHRocmVhZCYmcHRocmVhZC53b3JrZXI7aWYoIXdvcmtlcil7cmV0dXJufXdvcmtlci5wb3N0TWVzc2FnZSh7XCJjbWRcIjpcInByb2Nlc3NUaHJlYWRRdWV1ZVwifSl9cmV0dXJuIDF9ZnVuY3Rpb24gX2Fib3J0KCl7YWJvcnQoKX1mdW5jdGlvbiBfZW1zY3JpcHRlbl9hc21fY29uc3RfaW50KGNvZGUsc2lnUHRyLGFyZ2J1Zil7dmFyIGFyZ3M9cmVhZEFzbUNvbnN0QXJncyhzaWdQdHIsYXJnYnVmKTtyZXR1cm4gQVNNX0NPTlNUU1tjb2RlXS5hcHBseShudWxsLGFyZ3MpfWZ1bmN0aW9uIF9lbXNjcmlwdGVuX2NvbmRpdGlvbmFsX3NldF9jdXJyZW50X3RocmVhZF9zdGF0dXMoZXhwZWN0ZWRTdGF0dXMsbmV3U3RhdHVzKXt9ZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fZnV0ZXhfd2FpdChhZGRyLHZhbCx0aW1lb3V0KXtpZihhZGRyPD0wfHxhZGRyPkdST1dBQkxFX0hFQVBfSTgoKS5sZW5ndGh8fGFkZHImMyE9MClyZXR1cm4tMjg7aWYoIUVOVklST05NRU5UX0lTX1dFQil7dmFyIHJldD1BdG9taWNzLndhaXQoR1JPV0FCTEVfSEVBUF9JMzIoKSxhZGRyPj4yLHZhbCx0aW1lb3V0KTtpZihyZXQ9PT1cInRpbWVkLW91dFwiKXJldHVybi03MztpZihyZXQ9PT1cIm5vdC1lcXVhbFwiKXJldHVybi02O2lmKHJldD09PVwib2tcIilyZXR1cm4gMDt0aHJvd1wiQXRvbWljcy53YWl0IHJldHVybmVkIGFuIHVuZXhwZWN0ZWQgdmFsdWUgXCIrcmV0fWVsc2V7aWYoQXRvbWljcy5sb2FkKEdST1dBQkxFX0hFQVBfSTMyKCksYWRkcj4+MikhPXZhbCl7cmV0dXJuLTZ9dmFyIHROb3c9cGVyZm9ybWFuY2Uubm93KCk7dmFyIHRFbmQ9dE5vdyt0aW1lb3V0O3ZhciBsYXN0QWRkcj1BdG9taWNzLmV4Y2hhbmdlKEdST1dBQkxFX0hFQVBfSTMyKCksX19lbXNjcmlwdGVuX21haW5fdGhyZWFkX2Z1dGV4Pj4yLGFkZHIpO3doaWxlKDEpe3ROb3c9cGVyZm9ybWFuY2Uubm93KCk7aWYodE5vdz50RW5kKXtsYXN0QWRkcj1BdG9taWNzLmV4Y2hhbmdlKEdST1dBQkxFX0hFQVBfSTMyKCksX19lbXNjcmlwdGVuX21haW5fdGhyZWFkX2Z1dGV4Pj4yLDApO3JldHVybi03M31sYXN0QWRkcj1BdG9taWNzLmV4Y2hhbmdlKEdST1dBQkxFX0hFQVBfSTMyKCksX19lbXNjcmlwdGVuX21haW5fdGhyZWFkX2Z1dGV4Pj4yLDApO2lmKGxhc3RBZGRyPT0wKXticmVha31fZW1zY3JpcHRlbl9tYWluX3RocmVhZF9wcm9jZXNzX3F1ZXVlZF9jYWxscygpO2lmKEF0b21pY3MubG9hZChHUk9XQUJMRV9IRUFQX0kzMigpLGFkZHI+PjIpIT12YWwpe3JldHVybi02fWxhc3RBZGRyPUF0b21pY3MuZXhjaGFuZ2UoR1JPV0FCTEVfSEVBUF9JMzIoKSxfX2Vtc2NyaXB0ZW5fbWFpbl90aHJlYWRfZnV0ZXg+PjIsYWRkcil9cmV0dXJuIDB9fWZ1bmN0aW9uIF9lbXNjcmlwdGVuX21lbWNweV9iaWcoZGVzdCxzcmMsbnVtKXtHUk9XQUJMRV9IRUFQX1U4KCkuY29weVdpdGhpbihkZXN0LHNyYyxzcmMrbnVtKX1mdW5jdGlvbiBfZW1zY3JpcHRlbl9udW1fbG9naWNhbF9jb3Jlcygpe2lmKEVOVklST05NRU5UX0lTX05PREUpcmV0dXJuIHJlcXVpcmUoXCJvc1wiKS5jcHVzKCkubGVuZ3RoO3JldHVybiBuYXZpZ2F0b3JbXCJoYXJkd2FyZUNvbmN1cnJlbmN5XCJdfWZ1bmN0aW9uIF9lbXNjcmlwdGVuX3Byb3h5X3RvX21haW5fdGhyZWFkX2pzKGluZGV4LHN5bmMpe3ZhciBudW1DYWxsQXJncz1hcmd1bWVudHMubGVuZ3RoLTI7dmFyIHN0YWNrPXN0YWNrU2F2ZSgpO3ZhciBzZXJpYWxpemVkTnVtQ2FsbEFyZ3M9bnVtQ2FsbEFyZ3M7dmFyIGFyZ3M9c3RhY2tBbGxvYyhzZXJpYWxpemVkTnVtQ2FsbEFyZ3MqOCk7dmFyIGI9YXJncz4+Mztmb3IodmFyIGk9MDtpPG51bUNhbGxBcmdzO2krKyl7dmFyIGFyZz1hcmd1bWVudHNbMitpXTtHUk9XQUJMRV9IRUFQX0Y2NCgpW2IraV09YXJnfXZhciByZXQ9X2Vtc2NyaXB0ZW5fcnVuX2luX21haW5fcnVudGltZV90aHJlYWRfanMoaW5kZXgsc2VyaWFsaXplZE51bUNhbGxBcmdzLGFyZ3Msc3luYyk7c3RhY2tSZXN0b3JlKHN0YWNrKTtyZXR1cm4gcmV0fXZhciBfZW1zY3JpcHRlbl9yZWNlaXZlX29uX21haW5fdGhyZWFkX2pzX2NhbGxBcmdzPVtdO3ZhciByZWFkQXNtQ29uc3RBcmdzQXJyYXk9W107ZnVuY3Rpb24gcmVhZEFzbUNvbnN0QXJncyhzaWdQdHIsYnVmKXtyZWFkQXNtQ29uc3RBcmdzQXJyYXkubGVuZ3RoPTA7dmFyIGNoO2J1Zj4+PTI7d2hpbGUoY2g9R1JPV0FCTEVfSEVBUF9VOCgpW3NpZ1B0cisrXSl7dmFyIGRvdWJsZT1jaDwxMDU7aWYoZG91YmxlJiZidWYmMSlidWYrKztyZWFkQXNtQ29uc3RBcmdzQXJyYXkucHVzaChkb3VibGU/R1JPV0FCTEVfSEVBUF9GNjQoKVtidWYrKz4+MV06R1JPV0FCTEVfSEVBUF9JMzIoKVtidWZdKTsrK2J1Zn1yZXR1cm4gcmVhZEFzbUNvbnN0QXJnc0FycmF5fWZ1bmN0aW9uIF9lbXNjcmlwdGVuX3JlY2VpdmVfb25fbWFpbl90aHJlYWRfanMoaW5kZXgsbnVtQ2FsbEFyZ3MsYXJncyl7X2Vtc2NyaXB0ZW5fcmVjZWl2ZV9vbl9tYWluX3RocmVhZF9qc19jYWxsQXJncy5sZW5ndGg9bnVtQ2FsbEFyZ3M7dmFyIGI9YXJncz4+Mztmb3IodmFyIGk9MDtpPG51bUNhbGxBcmdzO2krKyl7X2Vtc2NyaXB0ZW5fcmVjZWl2ZV9vbl9tYWluX3RocmVhZF9qc19jYWxsQXJnc1tpXT1HUk9XQUJMRV9IRUFQX0Y2NCgpW2IraV19dmFyIGlzRW1Bc21Db25zdD1pbmRleDwwO3ZhciBmdW5jPSFpc0VtQXNtQ29uc3Q/cHJveGllZEZ1bmN0aW9uVGFibGVbaW5kZXhdOkFTTV9DT05TVFNbLWluZGV4LTFdO3JldHVybiBmdW5jLmFwcGx5KG51bGwsX2Vtc2NyaXB0ZW5fcmVjZWl2ZV9vbl9tYWluX3RocmVhZF9qc19jYWxsQXJncyl9ZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fZ2V0X2hlYXBfc2l6ZSgpe3JldHVybiBHUk9XQUJMRV9IRUFQX1U4KCkubGVuZ3RofWZ1bmN0aW9uIGVtc2NyaXB0ZW5fcmVhbGxvY19idWZmZXIoc2l6ZSl7dHJ5e3dhc21NZW1vcnkuZ3JvdyhzaXplLWJ1ZmZlci5ieXRlTGVuZ3RoKzY1NTM1Pj4+MTYpO3VwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzKHdhc21NZW1vcnkuYnVmZmVyKTtyZXR1cm4gMX1jYXRjaChlKXt9fWZ1bmN0aW9uIF9lbXNjcmlwdGVuX3Jlc2l6ZV9oZWFwKHJlcXVlc3RlZFNpemUpe3ZhciBvbGRTaXplPV9lbXNjcmlwdGVuX2dldF9oZWFwX3NpemUoKTtpZihyZXF1ZXN0ZWRTaXplPD1vbGRTaXplKXtyZXR1cm4gZmFsc2V9dmFyIG1heEhlYXBTaXplPTIxNDc0ODM2NDg7aWYocmVxdWVzdGVkU2l6ZT5tYXhIZWFwU2l6ZSl7cmV0dXJuIGZhbHNlfWZvcih2YXIgY3V0RG93bj0xO2N1dERvd248PTQ7Y3V0RG93bio9Mil7dmFyIG92ZXJHcm93bkhlYXBTaXplPW9sZFNpemUqKDErLjIvY3V0RG93bik7b3Zlckdyb3duSGVhcFNpemU9TWF0aC5taW4ob3Zlckdyb3duSGVhcFNpemUscmVxdWVzdGVkU2l6ZSsxMDA2NjMyOTYpO3ZhciBuZXdTaXplPU1hdGgubWluKG1heEhlYXBTaXplLGFsaWduVXAoTWF0aC5tYXgocmVxdWVzdGVkU2l6ZSxvdmVyR3Jvd25IZWFwU2l6ZSksNjU1MzYpKTt2YXIgcmVwbGFjZW1lbnQ9ZW1zY3JpcHRlbl9yZWFsbG9jX2J1ZmZlcihuZXdTaXplKTtpZihyZXBsYWNlbWVudCl7cmV0dXJuIHRydWV9fXJldHVybiBmYWxzZX12YXIgSlNFdmVudHM9e2luRXZlbnRIYW5kbGVyOjAscmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnM6ZnVuY3Rpb24oKXtmb3IodmFyIGk9SlNFdmVudHMuZXZlbnRIYW5kbGVycy5sZW5ndGgtMTtpPj0wOy0taSl7SlNFdmVudHMuX3JlbW92ZUhhbmRsZXIoaSl9SlNFdmVudHMuZXZlbnRIYW5kbGVycz1bXTtKU0V2ZW50cy5kZWZlcnJlZENhbGxzPVtdfSxyZWdpc3RlclJlbW92ZUV2ZW50TGlzdGVuZXJzOmZ1bmN0aW9uKCl7aWYoIUpTRXZlbnRzLnJlbW92ZUV2ZW50TGlzdGVuZXJzUmVnaXN0ZXJlZCl7X19BVEVYSVRfXy5wdXNoKEpTRXZlbnRzLnJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzKTtKU0V2ZW50cy5yZW1vdmVFdmVudExpc3RlbmVyc1JlZ2lzdGVyZWQ9dHJ1ZX19LGRlZmVycmVkQ2FsbHM6W10sZGVmZXJDYWxsOmZ1bmN0aW9uKHRhcmdldEZ1bmN0aW9uLHByZWNlZGVuY2UsYXJnc0xpc3Qpe2Z1bmN0aW9uIGFycmF5c0hhdmVFcXVhbENvbnRlbnQoYXJyQSxhcnJCKXtpZihhcnJBLmxlbmd0aCE9YXJyQi5sZW5ndGgpcmV0dXJuIGZhbHNlO2Zvcih2YXIgaSBpbiBhcnJBKXtpZihhcnJBW2ldIT1hcnJCW2ldKXJldHVybiBmYWxzZX1yZXR1cm4gdHJ1ZX1mb3IodmFyIGkgaW4gSlNFdmVudHMuZGVmZXJyZWRDYWxscyl7dmFyIGNhbGw9SlNFdmVudHMuZGVmZXJyZWRDYWxsc1tpXTtpZihjYWxsLnRhcmdldEZ1bmN0aW9uPT10YXJnZXRGdW5jdGlvbiYmYXJyYXlzSGF2ZUVxdWFsQ29udGVudChjYWxsLmFyZ3NMaXN0LGFyZ3NMaXN0KSl7cmV0dXJufX1KU0V2ZW50cy5kZWZlcnJlZENhbGxzLnB1c2goe3RhcmdldEZ1bmN0aW9uOnRhcmdldEZ1bmN0aW9uLHByZWNlZGVuY2U6cHJlY2VkZW5jZSxhcmdzTGlzdDphcmdzTGlzdH0pO0pTRXZlbnRzLmRlZmVycmVkQ2FsbHMuc29ydChmdW5jdGlvbih4LHkpe3JldHVybiB4LnByZWNlZGVuY2U8eS5wcmVjZWRlbmNlfSl9LHJlbW92ZURlZmVycmVkQ2FsbHM6ZnVuY3Rpb24odGFyZ2V0RnVuY3Rpb24pe2Zvcih2YXIgaT0wO2k8SlNFdmVudHMuZGVmZXJyZWRDYWxscy5sZW5ndGg7KytpKXtpZihKU0V2ZW50cy5kZWZlcnJlZENhbGxzW2ldLnRhcmdldEZ1bmN0aW9uPT10YXJnZXRGdW5jdGlvbil7SlNFdmVudHMuZGVmZXJyZWRDYWxscy5zcGxpY2UoaSwxKTstLWl9fX0sY2FuUGVyZm9ybUV2ZW50SGFuZGxlclJlcXVlc3RzOmZ1bmN0aW9uKCl7cmV0dXJuIEpTRXZlbnRzLmluRXZlbnRIYW5kbGVyJiZKU0V2ZW50cy5jdXJyZW50RXZlbnRIYW5kbGVyLmFsbG93c0RlZmVycmVkQ2FsbHN9LHJ1bkRlZmVycmVkQ2FsbHM6ZnVuY3Rpb24oKXtpZighSlNFdmVudHMuY2FuUGVyZm9ybUV2ZW50SGFuZGxlclJlcXVlc3RzKCkpe3JldHVybn1mb3IodmFyIGk9MDtpPEpTRXZlbnRzLmRlZmVycmVkQ2FsbHMubGVuZ3RoOysraSl7dmFyIGNhbGw9SlNFdmVudHMuZGVmZXJyZWRDYWxsc1tpXTtKU0V2ZW50cy5kZWZlcnJlZENhbGxzLnNwbGljZShpLDEpOy0taTtjYWxsLnRhcmdldEZ1bmN0aW9uLmFwcGx5KG51bGwsY2FsbC5hcmdzTGlzdCl9fSxldmVudEhhbmRsZXJzOltdLHJlbW92ZUFsbEhhbmRsZXJzT25UYXJnZXQ6ZnVuY3Rpb24odGFyZ2V0LGV2ZW50VHlwZVN0cmluZyl7Zm9yKHZhciBpPTA7aTxKU0V2ZW50cy5ldmVudEhhbmRsZXJzLmxlbmd0aDsrK2kpe2lmKEpTRXZlbnRzLmV2ZW50SGFuZGxlcnNbaV0udGFyZ2V0PT10YXJnZXQmJighZXZlbnRUeXBlU3RyaW5nfHxldmVudFR5cGVTdHJpbmc9PUpTRXZlbnRzLmV2ZW50SGFuZGxlcnNbaV0uZXZlbnRUeXBlU3RyaW5nKSl7SlNFdmVudHMuX3JlbW92ZUhhbmRsZXIoaS0tKX19fSxfcmVtb3ZlSGFuZGxlcjpmdW5jdGlvbihpKXt2YXIgaD1KU0V2ZW50cy5ldmVudEhhbmRsZXJzW2ldO2gudGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoaC5ldmVudFR5cGVTdHJpbmcsaC5ldmVudExpc3RlbmVyRnVuYyxoLnVzZUNhcHR1cmUpO0pTRXZlbnRzLmV2ZW50SGFuZGxlcnMuc3BsaWNlKGksMSl9LHJlZ2lzdGVyT3JSZW1vdmVIYW5kbGVyOmZ1bmN0aW9uKGV2ZW50SGFuZGxlcil7dmFyIGpzRXZlbnRIYW5kbGVyPWZ1bmN0aW9uIGpzRXZlbnRIYW5kbGVyKGV2ZW50KXsrK0pTRXZlbnRzLmluRXZlbnRIYW5kbGVyO0pTRXZlbnRzLmN1cnJlbnRFdmVudEhhbmRsZXI9ZXZlbnRIYW5kbGVyO0pTRXZlbnRzLnJ1bkRlZmVycmVkQ2FsbHMoKTtldmVudEhhbmRsZXIuaGFuZGxlckZ1bmMoZXZlbnQpO0pTRXZlbnRzLnJ1bkRlZmVycmVkQ2FsbHMoKTstLUpTRXZlbnRzLmluRXZlbnRIYW5kbGVyfTtpZihldmVudEhhbmRsZXIuY2FsbGJhY2tmdW5jKXtldmVudEhhbmRsZXIuZXZlbnRMaXN0ZW5lckZ1bmM9anNFdmVudEhhbmRsZXI7ZXZlbnRIYW5kbGVyLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50SGFuZGxlci5ldmVudFR5cGVTdHJpbmcsanNFdmVudEhhbmRsZXIsZXZlbnRIYW5kbGVyLnVzZUNhcHR1cmUpO0pTRXZlbnRzLmV2ZW50SGFuZGxlcnMucHVzaChldmVudEhhbmRsZXIpO0pTRXZlbnRzLnJlZ2lzdGVyUmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKX1lbHNle2Zvcih2YXIgaT0wO2k8SlNFdmVudHMuZXZlbnRIYW5kbGVycy5sZW5ndGg7KytpKXtpZihKU0V2ZW50cy5ldmVudEhhbmRsZXJzW2ldLnRhcmdldD09ZXZlbnRIYW5kbGVyLnRhcmdldCYmSlNFdmVudHMuZXZlbnRIYW5kbGVyc1tpXS5ldmVudFR5cGVTdHJpbmc9PWV2ZW50SGFuZGxlci5ldmVudFR5cGVTdHJpbmcpe0pTRXZlbnRzLl9yZW1vdmVIYW5kbGVyKGktLSl9fX19LHF1ZXVlRXZlbnRIYW5kbGVyT25UaHJlYWRfaWlpaTpmdW5jdGlvbih0YXJnZXRUaHJlYWQsZXZlbnRIYW5kbGVyRnVuYyxldmVudFR5cGVJZCxldmVudERhdGEsdXNlckRhdGEpe3ZhciBzdGFja1RvcD1zdGFja1NhdmUoKTt2YXIgdmFyYXJncz1zdGFja0FsbG9jKDEyKTtHUk9XQUJMRV9IRUFQX0kzMigpW3ZhcmFyZ3M+PjJdPWV2ZW50VHlwZUlkO0dST1dBQkxFX0hFQVBfSTMyKClbdmFyYXJncys0Pj4yXT1ldmVudERhdGE7R1JPV0FCTEVfSEVBUF9JMzIoKVt2YXJhcmdzKzg+PjJdPXVzZXJEYXRhO19fZW1zY3JpcHRlbl9jYWxsX29uX3RocmVhZCgwLHRhcmdldFRocmVhZCw2Mzc1MzQyMDgsZXZlbnRIYW5kbGVyRnVuYyxldmVudERhdGEsdmFyYXJncyk7c3RhY2tSZXN0b3JlKHN0YWNrVG9wKX0sZ2V0VGFyZ2V0VGhyZWFkRm9yRXZlbnRDYWxsYmFjazpmdW5jdGlvbih0YXJnZXRUaHJlYWQpe3N3aXRjaCh0YXJnZXRUaHJlYWQpe2Nhc2UgMTpyZXR1cm4gMDtjYXNlIDI6cmV0dXJuIFBUaHJlYWQuY3VycmVudFByb3hpZWRPcGVyYXRpb25DYWxsZXJUaHJlYWQ7ZGVmYXVsdDpyZXR1cm4gdGFyZ2V0VGhyZWFkfX0sZ2V0Tm9kZU5hbWVGb3JUYXJnZXQ6ZnVuY3Rpb24odGFyZ2V0KXtpZighdGFyZ2V0KXJldHVyblwiXCI7aWYodGFyZ2V0PT13aW5kb3cpcmV0dXJuXCIjd2luZG93XCI7aWYodGFyZ2V0PT1zY3JlZW4pcmV0dXJuXCIjc2NyZWVuXCI7cmV0dXJuIHRhcmdldCYmdGFyZ2V0Lm5vZGVOYW1lP3RhcmdldC5ub2RlTmFtZTpcIlwifSxmdWxsc2NyZWVuRW5hYmxlZDpmdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC5mdWxsc2NyZWVuRW5hYmxlZHx8ZG9jdW1lbnQud2Via2l0RnVsbHNjcmVlbkVuYWJsZWR9fTtmdW5jdGlvbiBzdHJpbmdUb05ld1VURjgoanNTdHJpbmcpe3ZhciBsZW5ndGg9bGVuZ3RoQnl0ZXNVVEY4KGpzU3RyaW5nKSsxO3ZhciBjU3RyaW5nPV9tYWxsb2MobGVuZ3RoKTtzdHJpbmdUb1VURjgoanNTdHJpbmcsY1N0cmluZyxsZW5ndGgpO3JldHVybiBjU3RyaW5nfWZ1bmN0aW9uIF9lbXNjcmlwdGVuX3NldF9vZmZzY3JlZW5jYW52YXNfc2l6ZV9vbl90YXJnZXRfdGhyZWFkX2pzKHRhcmdldFRocmVhZCx0YXJnZXRDYW52YXMsd2lkdGgsaGVpZ2h0KXt2YXIgc3RhY2tUb3A9c3RhY2tTYXZlKCk7dmFyIHZhcmFyZ3M9c3RhY2tBbGxvYygxMik7dmFyIHRhcmdldENhbnZhc1B0cj0wO2lmKHRhcmdldENhbnZhcyl7dGFyZ2V0Q2FudmFzUHRyPXN0cmluZ1RvTmV3VVRGOCh0YXJnZXRDYW52YXMpfUdST1dBQkxFX0hFQVBfSTMyKClbdmFyYXJncz4+Ml09dGFyZ2V0Q2FudmFzUHRyO0dST1dBQkxFX0hFQVBfSTMyKClbdmFyYXJncys0Pj4yXT13aWR0aDtHUk9XQUJMRV9IRUFQX0kzMigpW3ZhcmFyZ3MrOD4+Ml09aGVpZ2h0O19fZW1zY3JpcHRlbl9jYWxsX29uX3RocmVhZCgwLHRhcmdldFRocmVhZCw2NTc0NTcxNTIsMCx0YXJnZXRDYW52YXNQdHIsdmFyYXJncyk7c3RhY2tSZXN0b3JlKHN0YWNrVG9wKX1mdW5jdGlvbiBfZW1zY3JpcHRlbl9zZXRfb2Zmc2NyZWVuY2FudmFzX3NpemVfb25fdGFyZ2V0X3RocmVhZCh0YXJnZXRUaHJlYWQsdGFyZ2V0Q2FudmFzLHdpZHRoLGhlaWdodCl7dGFyZ2V0Q2FudmFzPXRhcmdldENhbnZhcz9VVEY4VG9TdHJpbmcodGFyZ2V0Q2FudmFzKTpcIlwiO19lbXNjcmlwdGVuX3NldF9vZmZzY3JlZW5jYW52YXNfc2l6ZV9vbl90YXJnZXRfdGhyZWFkX2pzKHRhcmdldFRocmVhZCx0YXJnZXRDYW52YXMsd2lkdGgsaGVpZ2h0KX1mdW5jdGlvbiBtYXliZUNTdHJpbmdUb0pzU3RyaW5nKGNTdHJpbmcpe3JldHVybiBjU3RyaW5nPjI/VVRGOFRvU3RyaW5nKGNTdHJpbmcpOmNTdHJpbmd9dmFyIHNwZWNpYWxIVE1MVGFyZ2V0cz1bMCx0eXBlb2YgZG9jdW1lbnQhPT1cInVuZGVmaW5lZFwiP2RvY3VtZW50OjAsdHlwZW9mIHdpbmRvdyE9PVwidW5kZWZpbmVkXCI/d2luZG93OjBdO2Z1bmN0aW9uIGZpbmRFdmVudFRhcmdldCh0YXJnZXQpe3RhcmdldD1tYXliZUNTdHJpbmdUb0pzU3RyaW5nKHRhcmdldCk7dmFyIGRvbUVsZW1lbnQ9c3BlY2lhbEhUTUxUYXJnZXRzW3RhcmdldF18fCh0eXBlb2YgZG9jdW1lbnQhPT1cInVuZGVmaW5lZFwiP2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0KTp1bmRlZmluZWQpO3JldHVybiBkb21FbGVtZW50fWZ1bmN0aW9uIGZpbmRDYW52YXNFdmVudFRhcmdldCh0YXJnZXQpe3JldHVybiBmaW5kRXZlbnRUYXJnZXQodGFyZ2V0KX1mdW5jdGlvbiBfZW1zY3JpcHRlbl9zZXRfY2FudmFzX2VsZW1lbnRfc2l6ZV9jYWxsaW5nX3RocmVhZCh0YXJnZXQsd2lkdGgsaGVpZ2h0KXt2YXIgY2FudmFzPWZpbmRDYW52YXNFdmVudFRhcmdldCh0YXJnZXQpO2lmKCFjYW52YXMpcmV0dXJuLTQ7aWYoY2FudmFzLmNhbnZhc1NoYXJlZFB0cil7R1JPV0FCTEVfSEVBUF9JMzIoKVtjYW52YXMuY2FudmFzU2hhcmVkUHRyPj4yXT13aWR0aDtHUk9XQUJMRV9IRUFQX0kzMigpW2NhbnZhcy5jYW52YXNTaGFyZWRQdHIrND4+Ml09aGVpZ2h0fWlmKGNhbnZhcy5vZmZzY3JlZW5DYW52YXN8fCFjYW52YXMuY29udHJvbFRyYW5zZmVycmVkT2Zmc2NyZWVuKXtpZihjYW52YXMub2Zmc2NyZWVuQ2FudmFzKWNhbnZhcz1jYW52YXMub2Zmc2NyZWVuQ2FudmFzO3ZhciBhdXRvUmVzaXplVmlld3BvcnQ9ZmFsc2U7aWYoY2FudmFzLkdMY3R4T2JqZWN0JiZjYW52YXMuR0xjdHhPYmplY3QuR0xjdHgpe3ZhciBwcmV2Vmlld3BvcnQ9Y2FudmFzLkdMY3R4T2JqZWN0LkdMY3R4LmdldFBhcmFtZXRlcigyOTc4KTthdXRvUmVzaXplVmlld3BvcnQ9cHJldlZpZXdwb3J0WzBdPT09MCYmcHJldlZpZXdwb3J0WzFdPT09MCYmcHJldlZpZXdwb3J0WzJdPT09Y2FudmFzLndpZHRoJiZwcmV2Vmlld3BvcnRbM109PT1jYW52YXMuaGVpZ2h0fWNhbnZhcy53aWR0aD13aWR0aDtjYW52YXMuaGVpZ2h0PWhlaWdodDtpZihhdXRvUmVzaXplVmlld3BvcnQpe2NhbnZhcy5HTGN0eE9iamVjdC5HTGN0eC52aWV3cG9ydCgwLDAsd2lkdGgsaGVpZ2h0KX19ZWxzZSBpZihjYW52YXMuY2FudmFzU2hhcmVkUHRyKXt2YXIgdGFyZ2V0VGhyZWFkPUdST1dBQkxFX0hFQVBfSTMyKClbY2FudmFzLmNhbnZhc1NoYXJlZFB0cis4Pj4yXTtfZW1zY3JpcHRlbl9zZXRfb2Zmc2NyZWVuY2FudmFzX3NpemVfb25fdGFyZ2V0X3RocmVhZCh0YXJnZXRUaHJlYWQsdGFyZ2V0LHdpZHRoLGhlaWdodCk7cmV0dXJuIDF9ZWxzZXtyZXR1cm4tNH1yZXR1cm4gMH1mdW5jdGlvbiBfZW1zY3JpcHRlbl9zZXRfY2FudmFzX2VsZW1lbnRfc2l6ZV9tYWluX3RocmVhZCh0YXJnZXQsd2lkdGgsaGVpZ2h0KXtpZihFTlZJUk9OTUVOVF9JU19QVEhSRUFEKXJldHVybiBfZW1zY3JpcHRlbl9wcm94eV90b19tYWluX3RocmVhZF9qcygyLDEsdGFyZ2V0LHdpZHRoLGhlaWdodCk7cmV0dXJuIF9lbXNjcmlwdGVuX3NldF9jYW52YXNfZWxlbWVudF9zaXplX2NhbGxpbmdfdGhyZWFkKHRhcmdldCx3aWR0aCxoZWlnaHQpfWZ1bmN0aW9uIF9lbXNjcmlwdGVuX3NldF9jYW52YXNfZWxlbWVudF9zaXplKHRhcmdldCx3aWR0aCxoZWlnaHQpe3ZhciBjYW52YXM9ZmluZENhbnZhc0V2ZW50VGFyZ2V0KHRhcmdldCk7aWYoY2FudmFzKXtyZXR1cm4gX2Vtc2NyaXB0ZW5fc2V0X2NhbnZhc19lbGVtZW50X3NpemVfY2FsbGluZ190aHJlYWQodGFyZ2V0LHdpZHRoLGhlaWdodCl9ZWxzZXtyZXR1cm4gX2Vtc2NyaXB0ZW5fc2V0X2NhbnZhc19lbGVtZW50X3NpemVfbWFpbl90aHJlYWQodGFyZ2V0LHdpZHRoLGhlaWdodCl9fWZ1bmN0aW9uIF9lbXNjcmlwdGVuX3NldF9jdXJyZW50X3RocmVhZF9zdGF0dXMobmV3U3RhdHVzKXt9ZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fc2V0X3RocmVhZF9uYW1lKHRocmVhZElkLG5hbWUpe31mdW5jdGlvbiBfX3dlYmdsX2VuYWJsZV9BTkdMRV9pbnN0YW5jZWRfYXJyYXlzKGN0eCl7dmFyIGV4dD1jdHguZ2V0RXh0ZW5zaW9uKFwiQU5HTEVfaW5zdGFuY2VkX2FycmF5c1wiKTtpZihleHQpe2N0eFtcInZlcnRleEF0dHJpYkRpdmlzb3JcIl09ZnVuY3Rpb24oaW5kZXgsZGl2aXNvcil7ZXh0W1widmVydGV4QXR0cmliRGl2aXNvckFOR0xFXCJdKGluZGV4LGRpdmlzb3IpfTtjdHhbXCJkcmF3QXJyYXlzSW5zdGFuY2VkXCJdPWZ1bmN0aW9uKG1vZGUsZmlyc3QsY291bnQscHJpbWNvdW50KXtleHRbXCJkcmF3QXJyYXlzSW5zdGFuY2VkQU5HTEVcIl0obW9kZSxmaXJzdCxjb3VudCxwcmltY291bnQpfTtjdHhbXCJkcmF3RWxlbWVudHNJbnN0YW5jZWRcIl09ZnVuY3Rpb24obW9kZSxjb3VudCx0eXBlLGluZGljZXMscHJpbWNvdW50KXtleHRbXCJkcmF3RWxlbWVudHNJbnN0YW5jZWRBTkdMRVwiXShtb2RlLGNvdW50LHR5cGUsaW5kaWNlcyxwcmltY291bnQpfTtyZXR1cm4gMX19ZnVuY3Rpb24gX193ZWJnbF9lbmFibGVfT0VTX3ZlcnRleF9hcnJheV9vYmplY3QoY3R4KXt2YXIgZXh0PWN0eC5nZXRFeHRlbnNpb24oXCJPRVNfdmVydGV4X2FycmF5X29iamVjdFwiKTtpZihleHQpe2N0eFtcImNyZWF0ZVZlcnRleEFycmF5XCJdPWZ1bmN0aW9uKCl7cmV0dXJuIGV4dFtcImNyZWF0ZVZlcnRleEFycmF5T0VTXCJdKCl9O2N0eFtcImRlbGV0ZVZlcnRleEFycmF5XCJdPWZ1bmN0aW9uKHZhbyl7ZXh0W1wiZGVsZXRlVmVydGV4QXJyYXlPRVNcIl0odmFvKX07Y3R4W1wiYmluZFZlcnRleEFycmF5XCJdPWZ1bmN0aW9uKHZhbyl7ZXh0W1wiYmluZFZlcnRleEFycmF5T0VTXCJdKHZhbyl9O2N0eFtcImlzVmVydGV4QXJyYXlcIl09ZnVuY3Rpb24odmFvKXtyZXR1cm4gZXh0W1wiaXNWZXJ0ZXhBcnJheU9FU1wiXSh2YW8pfTtyZXR1cm4gMX19ZnVuY3Rpb24gX193ZWJnbF9lbmFibGVfV0VCR0xfZHJhd19idWZmZXJzKGN0eCl7dmFyIGV4dD1jdHguZ2V0RXh0ZW5zaW9uKFwiV0VCR0xfZHJhd19idWZmZXJzXCIpO2lmKGV4dCl7Y3R4W1wiZHJhd0J1ZmZlcnNcIl09ZnVuY3Rpb24obixidWZzKXtleHRbXCJkcmF3QnVmZmVyc1dFQkdMXCJdKG4sYnVmcyl9O3JldHVybiAxfX1mdW5jdGlvbiBfX3dlYmdsX2VuYWJsZV9XRUJHTF9tdWx0aV9kcmF3KGN0eCl7cmV0dXJuISEoY3R4Lm11bHRpRHJhd1dlYmdsPWN0eC5nZXRFeHRlbnNpb24oXCJXRUJHTF9tdWx0aV9kcmF3XCIpKX12YXIgR0w9e2NvdW50ZXI6MSxidWZmZXJzOltdLHByb2dyYW1zOltdLGZyYW1lYnVmZmVyczpbXSxyZW5kZXJidWZmZXJzOltdLHRleHR1cmVzOltdLHVuaWZvcm1zOltdLHNoYWRlcnM6W10sdmFvczpbXSxjb250ZXh0czp7fSxvZmZzY3JlZW5DYW52YXNlczp7fSx0aW1lclF1ZXJpZXNFWFQ6W10scHJvZ3JhbUluZm9zOnt9LHN0cmluZ0NhY2hlOnt9LHVucGFja0FsaWdubWVudDo0LHJlY29yZEVycm9yOmZ1bmN0aW9uIHJlY29yZEVycm9yKGVycm9yQ29kZSl7aWYoIUdMLmxhc3RFcnJvcil7R0wubGFzdEVycm9yPWVycm9yQ29kZX19LGdldE5ld0lkOmZ1bmN0aW9uKHRhYmxlKXt2YXIgcmV0PUdMLmNvdW50ZXIrKztmb3IodmFyIGk9dGFibGUubGVuZ3RoO2k8cmV0O2krKyl7dGFibGVbaV09bnVsbH1yZXR1cm4gcmV0fSxnZXRTb3VyY2U6ZnVuY3Rpb24oc2hhZGVyLGNvdW50LHN0cmluZyxsZW5ndGgpe3ZhciBzb3VyY2U9XCJcIjtmb3IodmFyIGk9MDtpPGNvdW50OysraSl7dmFyIGxlbj1sZW5ndGg/R1JPV0FCTEVfSEVBUF9JMzIoKVtsZW5ndGgraSo0Pj4yXTotMTtzb3VyY2UrPVVURjhUb1N0cmluZyhHUk9XQUJMRV9IRUFQX0kzMigpW3N0cmluZytpKjQ+PjJdLGxlbjwwP3VuZGVmaW5lZDpsZW4pfXJldHVybiBzb3VyY2V9LGNyZWF0ZUNvbnRleHQ6ZnVuY3Rpb24oY2FudmFzLHdlYkdMQ29udGV4dEF0dHJpYnV0ZXMpe3ZhciBjdHg9Y2FudmFzLmdldENvbnRleHQoXCJ3ZWJnbFwiLHdlYkdMQ29udGV4dEF0dHJpYnV0ZXMpO2lmKCFjdHgpcmV0dXJuIDA7dmFyIGhhbmRsZT1HTC5yZWdpc3RlckNvbnRleHQoY3R4LHdlYkdMQ29udGV4dEF0dHJpYnV0ZXMpO3JldHVybiBoYW5kbGV9LHJlZ2lzdGVyQ29udGV4dDpmdW5jdGlvbihjdHgsd2ViR0xDb250ZXh0QXR0cmlidXRlcyl7dmFyIGhhbmRsZT1fbWFsbG9jKDgpO0dST1dBQkxFX0hFQVBfSTMyKClbaGFuZGxlKzQ+PjJdPV9wdGhyZWFkX3NlbGYoKTt2YXIgY29udGV4dD17aGFuZGxlOmhhbmRsZSxhdHRyaWJ1dGVzOndlYkdMQ29udGV4dEF0dHJpYnV0ZXMsdmVyc2lvbjp3ZWJHTENvbnRleHRBdHRyaWJ1dGVzLm1ham9yVmVyc2lvbixHTGN0eDpjdHh9O2lmKGN0eC5jYW52YXMpY3R4LmNhbnZhcy5HTGN0eE9iamVjdD1jb250ZXh0O0dMLmNvbnRleHRzW2hhbmRsZV09Y29udGV4dDtpZih0eXBlb2Ygd2ViR0xDb250ZXh0QXR0cmlidXRlcy5lbmFibGVFeHRlbnNpb25zQnlEZWZhdWx0PT09XCJ1bmRlZmluZWRcInx8d2ViR0xDb250ZXh0QXR0cmlidXRlcy5lbmFibGVFeHRlbnNpb25zQnlEZWZhdWx0KXtHTC5pbml0RXh0ZW5zaW9ucyhjb250ZXh0KX1yZXR1cm4gaGFuZGxlfSxtYWtlQ29udGV4dEN1cnJlbnQ6ZnVuY3Rpb24oY29udGV4dEhhbmRsZSl7R0wuY3VycmVudENvbnRleHQ9R0wuY29udGV4dHNbY29udGV4dEhhbmRsZV07TW9kdWxlLmN0eD1HTGN0eD1HTC5jdXJyZW50Q29udGV4dCYmR0wuY3VycmVudENvbnRleHQuR0xjdHg7cmV0dXJuIShjb250ZXh0SGFuZGxlJiYhR0xjdHgpfSxnZXRDb250ZXh0OmZ1bmN0aW9uKGNvbnRleHRIYW5kbGUpe3JldHVybiBHTC5jb250ZXh0c1tjb250ZXh0SGFuZGxlXX0sZGVsZXRlQ29udGV4dDpmdW5jdGlvbihjb250ZXh0SGFuZGxlKXtpZihHTC5jdXJyZW50Q29udGV4dD09PUdMLmNvbnRleHRzW2NvbnRleHRIYW5kbGVdKUdMLmN1cnJlbnRDb250ZXh0PW51bGw7aWYodHlwZW9mIEpTRXZlbnRzPT09XCJvYmplY3RcIilKU0V2ZW50cy5yZW1vdmVBbGxIYW5kbGVyc09uVGFyZ2V0KEdMLmNvbnRleHRzW2NvbnRleHRIYW5kbGVdLkdMY3R4LmNhbnZhcyk7aWYoR0wuY29udGV4dHNbY29udGV4dEhhbmRsZV0mJkdMLmNvbnRleHRzW2NvbnRleHRIYW5kbGVdLkdMY3R4LmNhbnZhcylHTC5jb250ZXh0c1tjb250ZXh0SGFuZGxlXS5HTGN0eC5jYW52YXMuR0xjdHhPYmplY3Q9dW5kZWZpbmVkO19mcmVlKEdMLmNvbnRleHRzW2NvbnRleHRIYW5kbGVdLmhhbmRsZSk7R0wuY29udGV4dHNbY29udGV4dEhhbmRsZV09bnVsbH0saW5pdEV4dGVuc2lvbnM6ZnVuY3Rpb24oY29udGV4dCl7aWYoIWNvbnRleHQpY29udGV4dD1HTC5jdXJyZW50Q29udGV4dDtpZihjb250ZXh0LmluaXRFeHRlbnNpb25zRG9uZSlyZXR1cm47Y29udGV4dC5pbml0RXh0ZW5zaW9uc0RvbmU9dHJ1ZTt2YXIgR0xjdHg9Y29udGV4dC5HTGN0eDtfX3dlYmdsX2VuYWJsZV9BTkdMRV9pbnN0YW5jZWRfYXJyYXlzKEdMY3R4KTtfX3dlYmdsX2VuYWJsZV9PRVNfdmVydGV4X2FycmF5X29iamVjdChHTGN0eCk7X193ZWJnbF9lbmFibGVfV0VCR0xfZHJhd19idWZmZXJzKEdMY3R4KTtHTGN0eC5kaXNqb2ludFRpbWVyUXVlcnlFeHQ9R0xjdHguZ2V0RXh0ZW5zaW9uKFwiRVhUX2Rpc2pvaW50X3RpbWVyX3F1ZXJ5XCIpO19fd2ViZ2xfZW5hYmxlX1dFQkdMX211bHRpX2RyYXcoR0xjdHgpO3ZhciBleHRzPUdMY3R4LmdldFN1cHBvcnRlZEV4dGVuc2lvbnMoKXx8W107ZXh0cy5mb3JFYWNoKGZ1bmN0aW9uKGV4dCl7aWYoZXh0LmluZGV4T2YoXCJsb3NlX2NvbnRleHRcIik8MCYmZXh0LmluZGV4T2YoXCJkZWJ1Z1wiKTwwKXtHTGN0eC5nZXRFeHRlbnNpb24oZXh0KX19KX0scG9wdWxhdGVVbmlmb3JtVGFibGU6ZnVuY3Rpb24ocHJvZ3JhbSl7dmFyIHA9R0wucHJvZ3JhbXNbcHJvZ3JhbV07dmFyIHB0YWJsZT1HTC5wcm9ncmFtSW5mb3NbcHJvZ3JhbV09e3VuaWZvcm1zOnt9LG1heFVuaWZvcm1MZW5ndGg6MCxtYXhBdHRyaWJ1dGVMZW5ndGg6LTEsbWF4VW5pZm9ybUJsb2NrTmFtZUxlbmd0aDotMX07dmFyIHV0YWJsZT1wdGFibGUudW5pZm9ybXM7dmFyIG51bVVuaWZvcm1zPUdMY3R4LmdldFByb2dyYW1QYXJhbWV0ZXIocCwzNTcxOCk7Zm9yKHZhciBpPTA7aTxudW1Vbmlmb3JtczsrK2kpe3ZhciB1PUdMY3R4LmdldEFjdGl2ZVVuaWZvcm0ocCxpKTt2YXIgbmFtZT11Lm5hbWU7cHRhYmxlLm1heFVuaWZvcm1MZW5ndGg9TWF0aC5tYXgocHRhYmxlLm1heFVuaWZvcm1MZW5ndGgsbmFtZS5sZW5ndGgrMSk7aWYobmFtZS5zbGljZSgtMSk9PVwiXVwiKXtuYW1lPW5hbWUuc2xpY2UoMCxuYW1lLmxhc3RJbmRleE9mKFwiW1wiKSl9dmFyIGxvYz1HTGN0eC5nZXRVbmlmb3JtTG9jYXRpb24ocCxuYW1lKTtpZihsb2Mpe3ZhciBpZD1HTC5nZXROZXdJZChHTC51bmlmb3Jtcyk7dXRhYmxlW25hbWVdPVt1LnNpemUsaWRdO0dMLnVuaWZvcm1zW2lkXT1sb2M7Zm9yKHZhciBqPTE7ajx1LnNpemU7KytqKXt2YXIgbj1uYW1lK1wiW1wiK2orXCJdXCI7bG9jPUdMY3R4LmdldFVuaWZvcm1Mb2NhdGlvbihwLG4pO2lkPUdMLmdldE5ld0lkKEdMLnVuaWZvcm1zKTtHTC51bmlmb3Jtc1tpZF09bG9jfX19fX07dmFyIF9fZW1zY3JpcHRlbl93ZWJnbF9wb3dlcl9wcmVmZXJlbmNlcz1bXCJkZWZhdWx0XCIsXCJsb3ctcG93ZXJcIixcImhpZ2gtcGVyZm9ybWFuY2VcIl07ZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fd2ViZ2xfZG9fY3JlYXRlX2NvbnRleHQodGFyZ2V0LGF0dHJpYnV0ZXMpe3ZhciBhPWF0dHJpYnV0ZXM+PjI7dmFyIHBvd2VyUHJlZmVyZW5jZT1HUk9XQUJMRV9IRUFQX0kzMigpW2ErKDI0Pj4yKV07dmFyIGNvbnRleHRBdHRyaWJ1dGVzPXtcImFscGhhXCI6ISFHUk9XQUJMRV9IRUFQX0kzMigpW2ErKDA+PjIpXSxcImRlcHRoXCI6ISFHUk9XQUJMRV9IRUFQX0kzMigpW2ErKDQ+PjIpXSxcInN0ZW5jaWxcIjohIUdST1dBQkxFX0hFQVBfSTMyKClbYSsoOD4+MildLFwiYW50aWFsaWFzXCI6ISFHUk9XQUJMRV9IRUFQX0kzMigpW2ErKDEyPj4yKV0sXCJwcmVtdWx0aXBsaWVkQWxwaGFcIjohIUdST1dBQkxFX0hFQVBfSTMyKClbYSsoMTY+PjIpXSxcInByZXNlcnZlRHJhd2luZ0J1ZmZlclwiOiEhR1JPV0FCTEVfSEVBUF9JMzIoKVthKygyMD4+MildLFwicG93ZXJQcmVmZXJlbmNlXCI6X19lbXNjcmlwdGVuX3dlYmdsX3Bvd2VyX3ByZWZlcmVuY2VzW3Bvd2VyUHJlZmVyZW5jZV0sXCJmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0XCI6ISFHUk9XQUJMRV9IRUFQX0kzMigpW2ErKDI4Pj4yKV0sbWFqb3JWZXJzaW9uOkdST1dBQkxFX0hFQVBfSTMyKClbYSsoMzI+PjIpXSxtaW5vclZlcnNpb246R1JPV0FCTEVfSEVBUF9JMzIoKVthKygzNj4+MildLGVuYWJsZUV4dGVuc2lvbnNCeURlZmF1bHQ6R1JPV0FCTEVfSEVBUF9JMzIoKVthKyg0MD4+MildLGV4cGxpY2l0U3dhcENvbnRyb2w6R1JPV0FCTEVfSEVBUF9JMzIoKVthKyg0ND4+MildLHByb3h5Q29udGV4dFRvTWFpblRocmVhZDpHUk9XQUJMRV9IRUFQX0kzMigpW2ErKDQ4Pj4yKV0scmVuZGVyVmlhT2Zmc2NyZWVuQmFja0J1ZmZlcjpHUk9XQUJMRV9IRUFQX0kzMigpW2ErKDUyPj4yKV19O3ZhciBjYW52YXM9ZmluZENhbnZhc0V2ZW50VGFyZ2V0KHRhcmdldCk7aWYoIWNhbnZhcyl7cmV0dXJuIDB9aWYoY29udGV4dEF0dHJpYnV0ZXMuZXhwbGljaXRTd2FwQ29udHJvbCl7cmV0dXJuIDB9dmFyIGNvbnRleHRIYW5kbGU9R0wuY3JlYXRlQ29udGV4dChjYW52YXMsY29udGV4dEF0dHJpYnV0ZXMpO3JldHVybiBjb250ZXh0SGFuZGxlfWZ1bmN0aW9uIF9lbXNjcmlwdGVuX3dlYmdsX2NyZWF0ZV9jb250ZXh0KGEwLGExKXtyZXR1cm4gX2Vtc2NyaXB0ZW5fd2ViZ2xfZG9fY3JlYXRlX2NvbnRleHQoYTAsYTEpfXZhciBTWVNDQUxMUz17bWFwcGluZ3M6e30sYnVmZmVyczpbbnVsbCxbXSxbXV0scHJpbnRDaGFyOmZ1bmN0aW9uKHN0cmVhbSxjdXJyKXt2YXIgYnVmZmVyPVNZU0NBTExTLmJ1ZmZlcnNbc3RyZWFtXTtpZihjdXJyPT09MHx8Y3Vycj09PTEwKXsoc3RyZWFtPT09MT9vdXQ6ZXJyKShVVEY4QXJyYXlUb1N0cmluZyhidWZmZXIsMCkpO2J1ZmZlci5sZW5ndGg9MH1lbHNle2J1ZmZlci5wdXNoKGN1cnIpfX0sdmFyYXJnczp1bmRlZmluZWQsZ2V0OmZ1bmN0aW9uKCl7U1lTQ0FMTFMudmFyYXJncys9NDt2YXIgcmV0PUdST1dBQkxFX0hFQVBfSTMyKClbU1lTQ0FMTFMudmFyYXJncy00Pj4yXTtyZXR1cm4gcmV0fSxnZXRTdHI6ZnVuY3Rpb24ocHRyKXt2YXIgcmV0PVVURjhUb1N0cmluZyhwdHIpO3JldHVybiByZXR9LGdldDY0OmZ1bmN0aW9uKGxvdyxoaWdoKXtyZXR1cm4gbG93fX07ZnVuY3Rpb24gX2ZkX2Nsb3NlKGZkKXtpZihFTlZJUk9OTUVOVF9JU19QVEhSRUFEKXJldHVybiBfZW1zY3JpcHRlbl9wcm94eV90b19tYWluX3RocmVhZF9qcygzLDEsZmQpO3JldHVybiAwfWZ1bmN0aW9uIF9mZF9zZWVrKGZkLG9mZnNldF9sb3csb2Zmc2V0X2hpZ2gsd2hlbmNlLG5ld09mZnNldCl7aWYoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRClyZXR1cm4gX2Vtc2NyaXB0ZW5fcHJveHlfdG9fbWFpbl90aHJlYWRfanMoNCwxLGZkLG9mZnNldF9sb3csb2Zmc2V0X2hpZ2gsd2hlbmNlLG5ld09mZnNldCl9ZnVuY3Rpb24gX2ZkX3dyaXRlKGZkLGlvdixpb3ZjbnQscG51bSl7aWYoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRClyZXR1cm4gX2Vtc2NyaXB0ZW5fcHJveHlfdG9fbWFpbl90aHJlYWRfanMoNSwxLGZkLGlvdixpb3ZjbnQscG51bSk7dmFyIG51bT0wO2Zvcih2YXIgaT0wO2k8aW92Y250O2krKyl7dmFyIHB0cj1HUk9XQUJMRV9IRUFQX0kzMigpW2lvditpKjg+PjJdO3ZhciBsZW49R1JPV0FCTEVfSEVBUF9JMzIoKVtpb3YrKGkqOCs0KT4+Ml07Zm9yKHZhciBqPTA7ajxsZW47aisrKXtTWVNDQUxMUy5wcmludENoYXIoZmQsR1JPV0FCTEVfSEVBUF9VOCgpW3B0citqXSl9bnVtKz1sZW59R1JPV0FCTEVfSEVBUF9JMzIoKVtwbnVtPj4yXT1udW07cmV0dXJuIDB9ZnVuY3Rpb24gX3B0aHJlYWRfY2xlYW51cF9wb3AoZXhlY3V0ZSl7dmFyIHJvdXRpbmU9UFRocmVhZC50aHJlYWRFeGl0SGFuZGxlcnMucG9wKCk7aWYoZXhlY3V0ZSlyb3V0aW5lKCl9ZnVuY3Rpb24gX3B0aHJlYWRfY2xlYW51cF9wdXNoKHJvdXRpbmUsYXJnKXtQVGhyZWFkLnRocmVhZEV4aXRIYW5kbGVycy5wdXNoKGZ1bmN0aW9uKCl7d2FzbVRhYmxlLmdldChyb3V0aW5lKShhcmcpfSl9ZnVuY3Rpb24gc3Bhd25UaHJlYWQodGhyZWFkUGFyYW1zKXtpZihFTlZJUk9OTUVOVF9JU19QVEhSRUFEKXRocm93XCJJbnRlcm5hbCBFcnJvciEgc3Bhd25UaHJlYWQoKSBjYW4gb25seSBldmVyIGJlIGNhbGxlZCBmcm9tIG1haW4gYXBwbGljYXRpb24gdGhyZWFkIVwiO3ZhciB3b3JrZXI9UFRocmVhZC5nZXROZXdXb3JrZXIoKTtpZih3b3JrZXIucHRocmVhZCE9PXVuZGVmaW5lZCl0aHJvd1wiSW50ZXJuYWwgZXJyb3IhXCI7aWYoIXRocmVhZFBhcmFtcy5wdGhyZWFkX3B0cil0aHJvd1wiSW50ZXJuYWwgZXJyb3IsIG5vIHB0aHJlYWQgcHRyIVwiO1BUaHJlYWQucnVubmluZ1dvcmtlcnMucHVzaCh3b3JrZXIpO3ZhciB0bHNNZW1vcnk9X21hbGxvYygxMjgqNCk7Zm9yKHZhciBpPTA7aTwxMjg7KytpKXtHUk9XQUJMRV9IRUFQX0kzMigpW3Rsc01lbW9yeStpKjQ+PjJdPTB9dmFyIHN0YWNrSGlnaD10aHJlYWRQYXJhbXMuc3RhY2tCYXNlK3RocmVhZFBhcmFtcy5zdGFja1NpemU7dmFyIHB0aHJlYWQ9UFRocmVhZC5wdGhyZWFkc1t0aHJlYWRQYXJhbXMucHRocmVhZF9wdHJdPXt3b3JrZXI6d29ya2VyLHN0YWNrQmFzZTp0aHJlYWRQYXJhbXMuc3RhY2tCYXNlLHN0YWNrU2l6ZTp0aHJlYWRQYXJhbXMuc3RhY2tTaXplLGFsbG9jYXRlZE93blN0YWNrOnRocmVhZFBhcmFtcy5hbGxvY2F0ZWRPd25TdGFjayx0aHJlYWRJbmZvU3RydWN0OnRocmVhZFBhcmFtcy5wdGhyZWFkX3B0cn07dmFyIHRpcz1wdGhyZWFkLnRocmVhZEluZm9TdHJ1Y3Q+PjI7QXRvbWljcy5zdG9yZShHUk9XQUJMRV9IRUFQX1UzMigpLHRpcysoNjQ+PjIpLHRocmVhZFBhcmFtcy5kZXRhY2hlZCk7QXRvbWljcy5zdG9yZShHUk9XQUJMRV9IRUFQX1UzMigpLHRpcysoMTAwPj4yKSx0bHNNZW1vcnkpO0F0b21pY3Muc3RvcmUoR1JPV0FCTEVfSEVBUF9VMzIoKSx0aXMrKDQwPj4yKSxwdGhyZWFkLnRocmVhZEluZm9TdHJ1Y3QpO0F0b21pY3Muc3RvcmUoR1JPV0FCTEVfSEVBUF9VMzIoKSx0aXMrKDgwPj4yKSx0aHJlYWRQYXJhbXMuc3RhY2tTaXplKTtBdG9taWNzLnN0b3JlKEdST1dBQkxFX0hFQVBfVTMyKCksdGlzKyg3Nj4+Miksc3RhY2tIaWdoKTtBdG9taWNzLnN0b3JlKEdST1dBQkxFX0hFQVBfVTMyKCksdGlzKygxMDQ+PjIpLHRocmVhZFBhcmFtcy5zdGFja1NpemUpO0F0b21pY3Muc3RvcmUoR1JPV0FCTEVfSEVBUF9VMzIoKSx0aXMrKDEwNCs4Pj4yKSxzdGFja0hpZ2gpO0F0b21pY3Muc3RvcmUoR1JPV0FCTEVfSEVBUF9VMzIoKSx0aXMrKDEwNCsxMj4+MiksdGhyZWFkUGFyYW1zLmRldGFjaGVkKTt2YXIgZ2xvYmFsX2xpYmM9X2Vtc2NyaXB0ZW5fZ2V0X2dsb2JhbF9saWJjKCk7dmFyIGdsb2JhbF9sb2NhbGU9Z2xvYmFsX2xpYmMrNDA7QXRvbWljcy5zdG9yZShHUk9XQUJMRV9IRUFQX1UzMigpLHRpcysoMTcyPj4yKSxnbG9iYWxfbG9jYWxlKTt3b3JrZXIucHRocmVhZD1wdGhyZWFkO3ZhciBtc2c9e1wiY21kXCI6XCJydW5cIixcInN0YXJ0X3JvdXRpbmVcIjp0aHJlYWRQYXJhbXMuc3RhcnRSb3V0aW5lLFwiYXJnXCI6dGhyZWFkUGFyYW1zLmFyZyxcInRocmVhZEluZm9TdHJ1Y3RcIjp0aHJlYWRQYXJhbXMucHRocmVhZF9wdHIsXCJzdGFja0Jhc2VcIjp0aHJlYWRQYXJhbXMuc3RhY2tCYXNlLFwic3RhY2tTaXplXCI6dGhyZWFkUGFyYW1zLnN0YWNrU2l6ZX07d29ya2VyLnJ1blB0aHJlYWQ9ZnVuY3Rpb24oKXttc2cudGltZT1wZXJmb3JtYW5jZS5ub3coKTt3b3JrZXIucG9zdE1lc3NhZ2UobXNnLHRocmVhZFBhcmFtcy50cmFuc2Zlckxpc3QpfTtpZih3b3JrZXIubG9hZGVkKXt3b3JrZXIucnVuUHRocmVhZCgpO2RlbGV0ZSB3b3JrZXIucnVuUHRocmVhZH19ZnVuY3Rpb24gX3B0aHJlYWRfY3JlYXRlKHB0aHJlYWRfcHRyLGF0dHIsc3RhcnRfcm91dGluZSxhcmcpe2lmKHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlcj09PVwidW5kZWZpbmVkXCIpe2VycihcIkN1cnJlbnQgZW52aXJvbm1lbnQgZG9lcyBub3Qgc3VwcG9ydCBTaGFyZWRBcnJheUJ1ZmZlciwgcHRocmVhZHMgYXJlIG5vdCBhdmFpbGFibGUhXCIpO3JldHVybiA2fWlmKCFwdGhyZWFkX3B0cil7ZXJyKFwicHRocmVhZF9jcmVhdGUgY2FsbGVkIHdpdGggYSBudWxsIHRocmVhZCBwb2ludGVyIVwiKTtyZXR1cm4gMjh9dmFyIHRyYW5zZmVyTGlzdD1bXTt2YXIgZXJyb3I9MDtpZihFTlZJUk9OTUVOVF9JU19QVEhSRUFEJiYodHJhbnNmZXJMaXN0Lmxlbmd0aD09PTB8fGVycm9yKSl7cmV0dXJuIF9lbXNjcmlwdGVuX3N5bmNfcnVuX2luX21haW5fdGhyZWFkXzQoNjg3ODY1ODU2LHB0aHJlYWRfcHRyLGF0dHIsc3RhcnRfcm91dGluZSxhcmcpfWlmKGVycm9yKXJldHVybiBlcnJvcjt2YXIgc3RhY2tTaXplPTA7dmFyIHN0YWNrQmFzZT0wO3ZhciBkZXRhY2hlZD0wO2lmKGF0dHImJmF0dHIhPS0xKXtzdGFja1NpemU9R1JPV0FCTEVfSEVBUF9JMzIoKVthdHRyPj4yXTtzdGFja1NpemUrPTgxOTIwO3N0YWNrQmFzZT1HUk9XQUJMRV9IRUFQX0kzMigpW2F0dHIrOD4+Ml07ZGV0YWNoZWQ9R1JPV0FCTEVfSEVBUF9JMzIoKVthdHRyKzEyPj4yXSE9PTB9ZWxzZXtzdGFja1NpemU9MjA5NzE1Mn12YXIgYWxsb2NhdGVkT3duU3RhY2s9c3RhY2tCYXNlPT0wO2lmKGFsbG9jYXRlZE93blN0YWNrKXtzdGFja0Jhc2U9X21lbWFsaWduKDE2LHN0YWNrU2l6ZSl9ZWxzZXtzdGFja0Jhc2UtPXN0YWNrU2l6ZTthc3NlcnQoc3RhY2tCYXNlPjApfXZhciB0aHJlYWRJbmZvU3RydWN0PV9tYWxsb2MoMjI4KTtmb3IodmFyIGk9MDtpPDIyOD4+MjsrK2kpR1JPV0FCTEVfSEVBUF9VMzIoKVsodGhyZWFkSW5mb1N0cnVjdD4+MikraV09MDtHUk9XQUJMRV9IRUFQX0kzMigpW3B0aHJlYWRfcHRyPj4yXT10aHJlYWRJbmZvU3RydWN0O0dST1dBQkxFX0hFQVBfSTMyKClbdGhyZWFkSW5mb1N0cnVjdCsxMj4+Ml09dGhyZWFkSW5mb1N0cnVjdDt2YXIgaGVhZFB0cj10aHJlYWRJbmZvU3RydWN0KzE1MjtHUk9XQUJMRV9IRUFQX0kzMigpW2hlYWRQdHI+PjJdPWhlYWRQdHI7dmFyIHRocmVhZFBhcmFtcz17c3RhY2tCYXNlOnN0YWNrQmFzZSxzdGFja1NpemU6c3RhY2tTaXplLGFsbG9jYXRlZE93blN0YWNrOmFsbG9jYXRlZE93blN0YWNrLGRldGFjaGVkOmRldGFjaGVkLHN0YXJ0Um91dGluZTpzdGFydF9yb3V0aW5lLHB0aHJlYWRfcHRyOnRocmVhZEluZm9TdHJ1Y3QsYXJnOmFyZyx0cmFuc2Zlckxpc3Q6dHJhbnNmZXJMaXN0fTtpZihFTlZJUk9OTUVOVF9JU19QVEhSRUFEKXt0aHJlYWRQYXJhbXMuY21kPVwic3Bhd25UaHJlYWRcIjtwb3N0TWVzc2FnZSh0aHJlYWRQYXJhbXMsdHJhbnNmZXJMaXN0KX1lbHNle3NwYXduVGhyZWFkKHRocmVhZFBhcmFtcyl9cmV0dXJuIDB9ZnVuY3Rpb24gX3N5c2NvbmYobmFtZSl7aWYoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRClyZXR1cm4gX2Vtc2NyaXB0ZW5fcHJveHlfdG9fbWFpbl90aHJlYWRfanMoNiwxLG5hbWUpO3N3aXRjaChuYW1lKXtjYXNlIDMwOnJldHVybiAxNjM4NDtjYXNlIDg1OnZhciBtYXhIZWFwU2l6ZT0yMTQ3NDgzNjQ4O3JldHVybiBtYXhIZWFwU2l6ZS8xNjM4NDtjYXNlIDEzMjpjYXNlIDEzMzpjYXNlIDEyOmNhc2UgMTM3OmNhc2UgMTM4OmNhc2UgMTU6Y2FzZSAyMzU6Y2FzZSAxNjpjYXNlIDE3OmNhc2UgMTg6Y2FzZSAxOTpjYXNlIDIwOmNhc2UgMTQ5OmNhc2UgMTM6Y2FzZSAxMDpjYXNlIDIzNjpjYXNlIDE1MzpjYXNlIDk6Y2FzZSAyMTpjYXNlIDIyOmNhc2UgMTU5OmNhc2UgMTU0OmNhc2UgMTQ6Y2FzZSA3NzpjYXNlIDc4OmNhc2UgMTM5OmNhc2UgODI6Y2FzZSA2ODpjYXNlIDY3OmNhc2UgMTY0OmNhc2UgMTE6Y2FzZSAyOTpjYXNlIDQ3OmNhc2UgNDg6Y2FzZSA5NTpjYXNlIDUyOmNhc2UgNTE6Y2FzZSA0NjpyZXR1cm4gMjAwODA5O2Nhc2UgMjc6Y2FzZSAyNDY6Y2FzZSAxMjc6Y2FzZSAxMjg6Y2FzZSAyMzpjYXNlIDI0OmNhc2UgMTYwOmNhc2UgMTYxOmNhc2UgMTgxOmNhc2UgMTgyOmNhc2UgMjQyOmNhc2UgMTgzOmNhc2UgMTg0OmNhc2UgMjQzOmNhc2UgMjQ0OmNhc2UgMjQ1OmNhc2UgMTY1OmNhc2UgMTc4OmNhc2UgMTc5OmNhc2UgNDk6Y2FzZSA1MDpjYXNlIDE2ODpjYXNlIDE2OTpjYXNlIDE3NTpjYXNlIDE3MDpjYXNlIDE3MTpjYXNlIDE3MjpjYXNlIDk3OmNhc2UgNzY6Y2FzZSAzMjpjYXNlIDE3MzpjYXNlIDM1OmNhc2UgODA6Y2FzZSA4MTpjYXNlIDc5OnJldHVybi0xO2Nhc2UgMTc2OmNhc2UgMTc3OmNhc2UgNzpjYXNlIDE1NTpjYXNlIDg6Y2FzZSAxNTc6Y2FzZSAxMjU6Y2FzZSAxMjY6Y2FzZSA5MjpjYXNlIDkzOmNhc2UgMTI5OmNhc2UgMTMwOmNhc2UgMTMxOmNhc2UgOTQ6Y2FzZSA5MTpyZXR1cm4gMTtjYXNlIDc0OmNhc2UgNjA6Y2FzZSA2OTpjYXNlIDcwOmNhc2UgNDpyZXR1cm4gMTAyNDtjYXNlIDMxOmNhc2UgNDI6Y2FzZSA3MjpyZXR1cm4gMzI7Y2FzZSA4NzpjYXNlIDI2OmNhc2UgMzM6cmV0dXJuIDIxNDc0ODM2NDc7Y2FzZSAzNDpjYXNlIDE6cmV0dXJuIDQ3ODM5O2Nhc2UgMzg6Y2FzZSAzNjpyZXR1cm4gOTk7Y2FzZSA0MzpjYXNlIDM3OnJldHVybiAyMDQ4O2Nhc2UgMDpyZXR1cm4gMjA5NzE1MjtjYXNlIDM6cmV0dXJuIDY1NTM2O2Nhc2UgMjg6cmV0dXJuIDMyNzY4O2Nhc2UgNDQ6cmV0dXJuIDMyNzY3O2Nhc2UgNzU6cmV0dXJuIDE2Mzg0O2Nhc2UgMzk6cmV0dXJuIDFlMztjYXNlIDg5OnJldHVybiA3MDA7Y2FzZSA3MTpyZXR1cm4gMjU2O2Nhc2UgNDA6cmV0dXJuIDI1NTtjYXNlIDI6cmV0dXJuIDEwMDtjYXNlIDE4MDpyZXR1cm4gNjQ7Y2FzZSAyNTpyZXR1cm4gMjA7Y2FzZSA1OnJldHVybiAxNjtjYXNlIDY6cmV0dXJuIDY7Y2FzZSA3MzpyZXR1cm4gNDtjYXNlIDg0OntpZih0eXBlb2YgbmF2aWdhdG9yPT09XCJvYmplY3RcIilyZXR1cm4gbmF2aWdhdG9yW1wiaGFyZHdhcmVDb25jdXJyZW5jeVwiXXx8MTtyZXR1cm4gMX19c2V0RXJyTm8oMjgpO3JldHVybi0xfWlmKCFFTlZJUk9OTUVOVF9JU19QVEhSRUFEKVBUaHJlYWQuaW5pdE1haW5UaHJlYWRCbG9jaygpO3ZhciBHTGN0eDt2YXIgcHJveGllZEZ1bmN0aW9uVGFibGU9W251bGwsX2F0ZXhpdCxfZW1zY3JpcHRlbl9zZXRfY2FudmFzX2VsZW1lbnRfc2l6ZV9tYWluX3RocmVhZCxfZmRfY2xvc2UsX2ZkX3NlZWssX2ZkX3dyaXRlLF9zeXNjb25mXTt2YXIgYXNtTGlicmFyeUFyZz17XCJlXCI6X19fYXNzZXJ0X2ZhaWwsXCJyXCI6X19fY2FsbF9tYWluLFwieFwiOl9fZW1zY3JpcHRlbl9ub3RpZnlfdGhyZWFkX3F1ZXVlLFwiYlwiOl9hYm9ydCxcInlcIjpfZW1zY3JpcHRlbl9hc21fY29uc3RfaW50LFwialwiOl9lbXNjcmlwdGVuX2NvbmRpdGlvbmFsX3NldF9jdXJyZW50X3RocmVhZF9zdGF0dXMsXCJjXCI6X2Vtc2NyaXB0ZW5fZnV0ZXhfd2FpdCxcImRcIjpfZW1zY3JpcHRlbl9mdXRleF93YWtlLFwiZlwiOl9lbXNjcmlwdGVuX2dldF9ub3csXCJwXCI6X2Vtc2NyaXB0ZW5fbWVtY3B5X2JpZyxcInpcIjpfZW1zY3JpcHRlbl9udW1fbG9naWNhbF9jb3JlcyxcInVcIjpfZW1zY3JpcHRlbl9yZWNlaXZlX29uX21haW5fdGhyZWFkX2pzLFwicVwiOl9lbXNjcmlwdGVuX3Jlc2l6ZV9oZWFwLFwidlwiOl9lbXNjcmlwdGVuX3NldF9jYW52YXNfZWxlbWVudF9zaXplLFwiaVwiOl9lbXNjcmlwdGVuX3NldF9jdXJyZW50X3RocmVhZF9zdGF0dXMsXCJ0XCI6X2Vtc2NyaXB0ZW5fc2V0X3RocmVhZF9uYW1lLFwid1wiOl9lbXNjcmlwdGVuX3dlYmdsX2NyZWF0ZV9jb250ZXh0LFwibVwiOl9mZF9jbG9zZSxcIm5cIjpfZmRfc2VlayxcImdcIjpfZmRfd3JpdGUsXCJvXCI6aW5pdFB0aHJlYWRzSlMsXCJhXCI6d2FzbU1lbW9yeXx8TW9kdWxlW1wid2FzbU1lbW9yeVwiXSxcImtcIjpfcHRocmVhZF9jbGVhbnVwX3BvcCxcImxcIjpfcHRocmVhZF9jbGVhbnVwX3B1c2gsXCJoXCI6X3B0aHJlYWRfY3JlYXRlLFwic1wiOl9zeXNjb25mfTt2YXIgYXNtPWNyZWF0ZVdhc20oKTt2YXIgX19fd2FzbV9jYWxsX2N0b3JzPU1vZHVsZVtcIl9fX3dhc21fY2FsbF9jdG9yc1wiXT1mdW5jdGlvbigpe3JldHVybihfX193YXNtX2NhbGxfY3RvcnM9TW9kdWxlW1wiX19fd2FzbV9jYWxsX2N0b3JzXCJdPU1vZHVsZVtcImFzbVwiXVtcIkFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9pbml0PU1vZHVsZVtcIl9pbml0XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9pbml0PU1vZHVsZVtcIl9pbml0XCJdPU1vZHVsZVtcImFzbVwiXVtcIkJcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9yZWdpc3Rlcl90ZW5zb3I9TW9kdWxlW1wiX3JlZ2lzdGVyX3RlbnNvclwiXT1mdW5jdGlvbigpe3JldHVybihfcmVnaXN0ZXJfdGVuc29yPU1vZHVsZVtcIl9yZWdpc3Rlcl90ZW5zb3JcIl09TW9kdWxlW1wiYXNtXCJdW1wiQ1wiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX2Rpc3Bvc2VfZGF0YT1Nb2R1bGVbXCJfZGlzcG9zZV9kYXRhXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9kaXNwb3NlX2RhdGE9TW9kdWxlW1wiX2Rpc3Bvc2VfZGF0YVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJEXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfZGlzcG9zZT1Nb2R1bGVbXCJfZGlzcG9zZVwiXT1mdW5jdGlvbigpe3JldHVybihfZGlzcG9zZT1Nb2R1bGVbXCJfZGlzcG9zZVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJFXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQWJzPU1vZHVsZVtcIl9BYnNcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0Ficz1Nb2R1bGVbXCJfQWJzXCJdPU1vZHVsZVtcImFzbVwiXVtcIkdcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9BZGQ9TW9kdWxlW1wiX0FkZFwiXT1mdW5jdGlvbigpe3JldHVybihfQWRkPU1vZHVsZVtcIl9BZGRcIl09TW9kdWxlW1wiYXNtXCJdW1wiSFwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0FkZE49TW9kdWxlW1wiX0FkZE5cIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0FkZE49TW9kdWxlW1wiX0FkZE5cIl09TW9kdWxlW1wiYXNtXCJdW1wiSVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0FsbD1Nb2R1bGVbXCJfQWxsXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9BbGw9TW9kdWxlW1wiX0FsbFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJKXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQW55PU1vZHVsZVtcIl9BbnlcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0FueT1Nb2R1bGVbXCJfQW55XCJdPU1vZHVsZVtcImFzbVwiXVtcIktcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9BcmdNYXg9TW9kdWxlW1wiX0FyZ01heFwiXT1mdW5jdGlvbigpe3JldHVybihfQXJnTWF4PU1vZHVsZVtcIl9BcmdNYXhcIl09TW9kdWxlW1wiYXNtXCJdW1wiTFwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0F2Z1Bvb2w9TW9kdWxlW1wiX0F2Z1Bvb2xcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0F2Z1Bvb2w9TW9kdWxlW1wiX0F2Z1Bvb2xcIl09TW9kdWxlW1wiYXNtXCJdW1wiTVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0JhdGNoTWF0TXVsPU1vZHVsZVtcIl9CYXRjaE1hdE11bFwiXT1mdW5jdGlvbigpe3JldHVybihfQmF0Y2hNYXRNdWw9TW9kdWxlW1wiX0JhdGNoTWF0TXVsXCJdPU1vZHVsZVtcImFzbVwiXVtcIk5cIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9DZWlsPU1vZHVsZVtcIl9DZWlsXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9DZWlsPU1vZHVsZVtcIl9DZWlsXCJdPU1vZHVsZVtcImFzbVwiXVtcIk9cIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9DbGlwQnlWYWx1ZT1Nb2R1bGVbXCJfQ2xpcEJ5VmFsdWVcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0NsaXBCeVZhbHVlPU1vZHVsZVtcIl9DbGlwQnlWYWx1ZVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJQXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQ29udjJEPU1vZHVsZVtcIl9Db252MkRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0NvbnYyRD1Nb2R1bGVbXCJfQ29udjJEXCJdPU1vZHVsZVtcImFzbVwiXVtcIlFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Db252MkRCYWNrcHJvcElucHV0PU1vZHVsZVtcIl9Db252MkRCYWNrcHJvcElucHV0XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Db252MkRCYWNrcHJvcElucHV0PU1vZHVsZVtcIl9Db252MkRCYWNrcHJvcElucHV0XCJdPU1vZHVsZVtcImFzbVwiXVtcIlJcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Db3M9TW9kdWxlW1wiX0Nvc1wiXT1mdW5jdGlvbigpe3JldHVybihfQ29zPU1vZHVsZVtcIl9Db3NcIl09TW9kdWxlW1wiYXNtXCJdW1wiU1wiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0Nvc2g9TW9kdWxlW1wiX0Nvc2hcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0Nvc2g9TW9kdWxlW1wiX0Nvc2hcIl09TW9kdWxlW1wiYXNtXCJdW1wiVFwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0Nyb3BBbmRSZXNpemU9TW9kdWxlW1wiX0Nyb3BBbmRSZXNpemVcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0Nyb3BBbmRSZXNpemU9TW9kdWxlW1wiX0Nyb3BBbmRSZXNpemVcIl09TW9kdWxlW1wiYXNtXCJdW1wiVVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0N1bXN1bT1Nb2R1bGVbXCJfQ3Vtc3VtXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9DdW1zdW09TW9kdWxlW1wiX0N1bXN1bVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJWXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfRGVwdGhUb1NwYWNlPU1vZHVsZVtcIl9EZXB0aFRvU3BhY2VcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0RlcHRoVG9TcGFjZT1Nb2R1bGVbXCJfRGVwdGhUb1NwYWNlXCJdPU1vZHVsZVtcImFzbVwiXVtcIldcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9EZXB0aHdpc2VDb252MmROYXRpdmU9TW9kdWxlW1wiX0RlcHRod2lzZUNvbnYyZE5hdGl2ZVwiXT1mdW5jdGlvbigpe3JldHVybihfRGVwdGh3aXNlQ29udjJkTmF0aXZlPU1vZHVsZVtcIl9EZXB0aHdpc2VDb252MmROYXRpdmVcIl09TW9kdWxlW1wiYXNtXCJdW1wiWFwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0VxdWFsPU1vZHVsZVtcIl9FcXVhbFwiXT1mdW5jdGlvbigpe3JldHVybihfRXF1YWw9TW9kdWxlW1wiX0VxdWFsXCJdPU1vZHVsZVtcImFzbVwiXVtcIllcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9FeHA9TW9kdWxlW1wiX0V4cFwiXT1mdW5jdGlvbigpe3JldHVybihfRXhwPU1vZHVsZVtcIl9FeHBcIl09TW9kdWxlW1wiYXNtXCJdW1wiWlwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0ZsaXBMZWZ0UmlnaHQ9TW9kdWxlW1wiX0ZsaXBMZWZ0UmlnaHRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0ZsaXBMZWZ0UmlnaHQ9TW9kdWxlW1wiX0ZsaXBMZWZ0UmlnaHRcIl09TW9kdWxlW1wiYXNtXCJdW1wiX1wiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0Zsb29yPU1vZHVsZVtcIl9GbG9vclwiXT1mdW5jdGlvbigpe3JldHVybihfRmxvb3I9TW9kdWxlW1wiX0Zsb29yXCJdPU1vZHVsZVtcImFzbVwiXVtcIiRcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9GbG9vckRpdj1Nb2R1bGVbXCJfRmxvb3JEaXZcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0Zsb29yRGl2PU1vZHVsZVtcIl9GbG9vckRpdlwiXT1Nb2R1bGVbXCJhc21cIl1bXCJhYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0Z1c2VkQmF0Y2hOb3JtPU1vZHVsZVtcIl9GdXNlZEJhdGNoTm9ybVwiXT1mdW5jdGlvbigpe3JldHVybihfRnVzZWRCYXRjaE5vcm09TW9kdWxlW1wiX0Z1c2VkQmF0Y2hOb3JtXCJdPU1vZHVsZVtcImFzbVwiXVtcImJhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfRnVzZWRDb252MkQ9TW9kdWxlW1wiX0Z1c2VkQ29udjJEXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9GdXNlZENvbnYyRD1Nb2R1bGVbXCJfRnVzZWRDb252MkRcIl09TW9kdWxlW1wiYXNtXCJdW1wiY2FcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9GdXNlZERlcHRod2lzZUNvbnYyRD1Nb2R1bGVbXCJfRnVzZWREZXB0aHdpc2VDb252MkRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0Z1c2VkRGVwdGh3aXNlQ29udjJEPU1vZHVsZVtcIl9GdXNlZERlcHRod2lzZUNvbnYyRFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJkYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0dhdGhlcj1Nb2R1bGVbXCJfR2F0aGVyXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9HYXRoZXI9TW9kdWxlW1wiX0dhdGhlclwiXT1Nb2R1bGVbXCJhc21cIl1bXCJlYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0dhdGhlck5kPU1vZHVsZVtcIl9HYXRoZXJOZFwiXT1mdW5jdGlvbigpe3JldHVybihfR2F0aGVyTmQ9TW9kdWxlW1wiX0dhdGhlck5kXCJdPU1vZHVsZVtcImFzbVwiXVtcImZhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfR3JlYXRlcj1Nb2R1bGVbXCJfR3JlYXRlclwiXT1mdW5jdGlvbigpe3JldHVybihfR3JlYXRlcj1Nb2R1bGVbXCJfR3JlYXRlclwiXT1Nb2R1bGVbXCJhc21cIl1bXCJnYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0dyZWF0ZXJFcXVhbD1Nb2R1bGVbXCJfR3JlYXRlckVxdWFsXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9HcmVhdGVyRXF1YWw9TW9kdWxlW1wiX0dyZWF0ZXJFcXVhbFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJoYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0xlYWt5UmVsdT1Nb2R1bGVbXCJfTGVha3lSZWx1XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9MZWFreVJlbHU9TW9kdWxlW1wiX0xlYWt5UmVsdVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJpYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0xlc3M9TW9kdWxlW1wiX0xlc3NcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0xlc3M9TW9kdWxlW1wiX0xlc3NcIl09TW9kdWxlW1wiYXNtXCJdW1wiamFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9MZXNzRXF1YWw9TW9kdWxlW1wiX0xlc3NFcXVhbFwiXT1mdW5jdGlvbigpe3JldHVybihfTGVzc0VxdWFsPU1vZHVsZVtcIl9MZXNzRXF1YWxcIl09TW9kdWxlW1wiYXNtXCJdW1wia2FcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Mb2c9TW9kdWxlW1wiX0xvZ1wiXT1mdW5jdGlvbigpe3JldHVybihfTG9nPU1vZHVsZVtcIl9Mb2dcIl09TW9kdWxlW1wiYXNtXCJdW1wibGFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Mb2dpY2FsQW5kPU1vZHVsZVtcIl9Mb2dpY2FsQW5kXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Mb2dpY2FsQW5kPU1vZHVsZVtcIl9Mb2dpY2FsQW5kXCJdPU1vZHVsZVtcImFzbVwiXVtcIm1hXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTWF4PU1vZHVsZVtcIl9NYXhcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX01heD1Nb2R1bGVbXCJfTWF4XCJdPU1vZHVsZVtcImFzbVwiXVtcIm5hXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTWF4UG9vbD1Nb2R1bGVbXCJfTWF4UG9vbFwiXT1mdW5jdGlvbigpe3JldHVybihfTWF4UG9vbD1Nb2R1bGVbXCJfTWF4UG9vbFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJvYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX01heGltdW09TW9kdWxlW1wiX01heGltdW1cIl09ZnVuY3Rpb24oKXtyZXR1cm4oX01heGltdW09TW9kdWxlW1wiX01heGltdW1cIl09TW9kdWxlW1wiYXNtXCJdW1wicGFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9NZWFuPU1vZHVsZVtcIl9NZWFuXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9NZWFuPU1vZHVsZVtcIl9NZWFuXCJdPU1vZHVsZVtcImFzbVwiXVtcInFhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTWluPU1vZHVsZVtcIl9NaW5cIl09ZnVuY3Rpb24oKXtyZXR1cm4oX01pbj1Nb2R1bGVbXCJfTWluXCJdPU1vZHVsZVtcImFzbVwiXVtcInJhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTWluaW11bT1Nb2R1bGVbXCJfTWluaW11bVwiXT1mdW5jdGlvbigpe3JldHVybihfTWluaW11bT1Nb2R1bGVbXCJfTWluaW11bVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJzYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX01pcnJvclBhZD1Nb2R1bGVbXCJfTWlycm9yUGFkXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9NaXJyb3JQYWQ9TW9kdWxlW1wiX01pcnJvclBhZFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJ0YVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX011bHRpcGx5PU1vZHVsZVtcIl9NdWx0aXBseVwiXT1mdW5jdGlvbigpe3JldHVybihfTXVsdGlwbHk9TW9kdWxlW1wiX011bHRpcGx5XCJdPU1vZHVsZVtcImFzbVwiXVtcInVhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTmVnPU1vZHVsZVtcIl9OZWdcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX05lZz1Nb2R1bGVbXCJfTmVnXCJdPU1vZHVsZVtcImFzbVwiXVtcInZhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTm9uTWF4U3VwcHJlc3Npb25WMz1Nb2R1bGVbXCJfTm9uTWF4U3VwcHJlc3Npb25WM1wiXT1mdW5jdGlvbigpe3JldHVybihfTm9uTWF4U3VwcHJlc3Npb25WMz1Nb2R1bGVbXCJfTm9uTWF4U3VwcHJlc3Npb25WM1wiXT1Nb2R1bGVbXCJhc21cIl1bXCJ3YVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX05vbk1heFN1cHByZXNzaW9uVjQ9TW9kdWxlW1wiX05vbk1heFN1cHByZXNzaW9uVjRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX05vbk1heFN1cHByZXNzaW9uVjQ9TW9kdWxlW1wiX05vbk1heFN1cHByZXNzaW9uVjRcIl09TW9kdWxlW1wiYXNtXCJdW1wieGFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Ob25NYXhTdXBwcmVzc2lvblY1PU1vZHVsZVtcIl9Ob25NYXhTdXBwcmVzc2lvblY1XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Ob25NYXhTdXBwcmVzc2lvblY1PU1vZHVsZVtcIl9Ob25NYXhTdXBwcmVzc2lvblY1XCJdPU1vZHVsZVtcImFzbVwiXVtcInlhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTm90RXF1YWw9TW9kdWxlW1wiX05vdEVxdWFsXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Ob3RFcXVhbD1Nb2R1bGVbXCJfTm90RXF1YWxcIl09TW9kdWxlW1wiYXNtXCJdW1wiemFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9PbmVIb3Q9TW9kdWxlW1wiX09uZUhvdFwiXT1mdW5jdGlvbigpe3JldHVybihfT25lSG90PU1vZHVsZVtcIl9PbmVIb3RcIl09TW9kdWxlW1wiYXNtXCJdW1wiQWFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9QYWRWMj1Nb2R1bGVbXCJfUGFkVjJcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1BhZFYyPU1vZHVsZVtcIl9QYWRWMlwiXT1Nb2R1bGVbXCJhc21cIl1bXCJCYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1Bvdz1Nb2R1bGVbXCJfUG93XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Qb3c9TW9kdWxlW1wiX1Bvd1wiXT1Nb2R1bGVbXCJhc21cIl1bXCJDYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1ByZWx1PU1vZHVsZVtcIl9QcmVsdVwiXT1mdW5jdGlvbigpe3JldHVybihfUHJlbHU9TW9kdWxlW1wiX1ByZWx1XCJdPU1vZHVsZVtcImFzbVwiXVtcIkRhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfUHJvZD1Nb2R1bGVbXCJfUHJvZFwiXT1mdW5jdGlvbigpe3JldHVybihfUHJvZD1Nb2R1bGVbXCJfUHJvZFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJFYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1JlYWxEaXY9TW9kdWxlW1wiX1JlYWxEaXZcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1JlYWxEaXY9TW9kdWxlW1wiX1JlYWxEaXZcIl09TW9kdWxlW1wiYXNtXCJdW1wiRmFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9SZWx1PU1vZHVsZVtcIl9SZWx1XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9SZWx1PU1vZHVsZVtcIl9SZWx1XCJdPU1vZHVsZVtcImFzbVwiXVtcIkdhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfUmVsdTY9TW9kdWxlW1wiX1JlbHU2XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9SZWx1Nj1Nb2R1bGVbXCJfUmVsdTZcIl09TW9kdWxlW1wiYXNtXCJdW1wiSGFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9SZXNpemVCaWxpbmVhcj1Nb2R1bGVbXCJfUmVzaXplQmlsaW5lYXJcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1Jlc2l6ZUJpbGluZWFyPU1vZHVsZVtcIl9SZXNpemVCaWxpbmVhclwiXT1Nb2R1bGVbXCJhc21cIl1bXCJJYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1JldmVyc2U9TW9kdWxlW1wiX1JldmVyc2VcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1JldmVyc2U9TW9kdWxlW1wiX1JldmVyc2VcIl09TW9kdWxlW1wiYXNtXCJdW1wiSmFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Sb3RhdGVXaXRoT2Zmc2V0PU1vZHVsZVtcIl9Sb3RhdGVXaXRoT2Zmc2V0XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Sb3RhdGVXaXRoT2Zmc2V0PU1vZHVsZVtcIl9Sb3RhdGVXaXRoT2Zmc2V0XCJdPU1vZHVsZVtcImFzbVwiXVtcIkthXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfUm91bmQ9TW9kdWxlW1wiX1JvdW5kXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Sb3VuZD1Nb2R1bGVbXCJfUm91bmRcIl09TW9kdWxlW1wiYXNtXCJdW1wiTGFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Sc3FydD1Nb2R1bGVbXCJfUnNxcnRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1JzcXJ0PU1vZHVsZVtcIl9Sc3FydFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJNYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1NjYXR0ZXJOZD1Nb2R1bGVbXCJfU2NhdHRlck5kXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9TY2F0dGVyTmQ9TW9kdWxlW1wiX1NjYXR0ZXJOZFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJOYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1NlbGVjdFYyPU1vZHVsZVtcIl9TZWxlY3RWMlwiXT1mdW5jdGlvbigpe3JldHVybihfU2VsZWN0VjI9TW9kdWxlW1wiX1NlbGVjdFYyXCJdPU1vZHVsZVtcImFzbVwiXVtcIk9hXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfU2lnbW9pZD1Nb2R1bGVbXCJfU2lnbW9pZFwiXT1mdW5jdGlvbigpe3JldHVybihfU2lnbW9pZD1Nb2R1bGVbXCJfU2lnbW9pZFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJQYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1Npbj1Nb2R1bGVbXCJfU2luXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9TaW49TW9kdWxlW1wiX1NpblwiXT1Nb2R1bGVbXCJhc21cIl1bXCJRYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1NvZnRtYXg9TW9kdWxlW1wiX1NvZnRtYXhcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1NvZnRtYXg9TW9kdWxlW1wiX1NvZnRtYXhcIl09TW9kdWxlW1wiYXNtXCJdW1wiUmFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9TcXJ0PU1vZHVsZVtcIl9TcXJ0XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9TcXJ0PU1vZHVsZVtcIl9TcXJ0XCJdPU1vZHVsZVtcImFzbVwiXVtcIlNhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfU3F1YXJlPU1vZHVsZVtcIl9TcXVhcmVcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1NxdWFyZT1Nb2R1bGVbXCJfU3F1YXJlXCJdPU1vZHVsZVtcImFzbVwiXVtcIlRhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfU3F1YXJlZERpZmZlcmVuY2U9TW9kdWxlW1wiX1NxdWFyZWREaWZmZXJlbmNlXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9TcXVhcmVkRGlmZmVyZW5jZT1Nb2R1bGVbXCJfU3F1YXJlZERpZmZlcmVuY2VcIl09TW9kdWxlW1wiYXNtXCJdW1wiVWFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9TdGVwPU1vZHVsZVtcIl9TdGVwXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9TdGVwPU1vZHVsZVtcIl9TdGVwXCJdPU1vZHVsZVtcImFzbVwiXVtcIlZhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfU3RyaWRlZFNsaWNlPU1vZHVsZVtcIl9TdHJpZGVkU2xpY2VcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1N0cmlkZWRTbGljZT1Nb2R1bGVbXCJfU3RyaWRlZFNsaWNlXCJdPU1vZHVsZVtcImFzbVwiXVtcIldhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfU3ViPU1vZHVsZVtcIl9TdWJcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1N1Yj1Nb2R1bGVbXCJfU3ViXCJdPU1vZHVsZVtcImFzbVwiXVtcIlhhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfU3VtPU1vZHVsZVtcIl9TdW1cIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1N1bT1Nb2R1bGVbXCJfU3VtXCJdPU1vZHVsZVtcImFzbVwiXVtcIllhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfVGFuPU1vZHVsZVtcIl9UYW5cIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1Rhbj1Nb2R1bGVbXCJfVGFuXCJdPU1vZHVsZVtcImFzbVwiXVtcIlphXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfVGFuaD1Nb2R1bGVbXCJfVGFuaFwiXT1mdW5jdGlvbigpe3JldHVybihfVGFuaD1Nb2R1bGVbXCJfVGFuaFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJfYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1RpbGU9TW9kdWxlW1wiX1RpbGVcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1RpbGU9TW9kdWxlW1wiX1RpbGVcIl09TW9kdWxlW1wiYXNtXCJdW1wiJGFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Ub3BLPU1vZHVsZVtcIl9Ub3BLXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Ub3BLPU1vZHVsZVtcIl9Ub3BLXCJdPU1vZHVsZVtcImFzbVwiXVtcImFiXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfVHJhbnNmb3JtPU1vZHVsZVtcIl9UcmFuc2Zvcm1cIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1RyYW5zZm9ybT1Nb2R1bGVbXCJfVHJhbnNmb3JtXCJdPU1vZHVsZVtcImFzbVwiXVtcImJiXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfVHJhbnNwb3NlPU1vZHVsZVtcIl9UcmFuc3Bvc2VcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1RyYW5zcG9zZT1Nb2R1bGVbXCJfVHJhbnNwb3NlXCJdPU1vZHVsZVtcImFzbVwiXVtcImNiXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfX0Z1c2VkTWF0TXVsPU1vZHVsZVtcIl9fRnVzZWRNYXRNdWxcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX19GdXNlZE1hdE11bD1Nb2R1bGVbXCJfX0Z1c2VkTWF0TXVsXCJdPU1vZHVsZVtcImFzbVwiXVtcImRiXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfbWFsbG9jPU1vZHVsZVtcIl9tYWxsb2NcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX21hbGxvYz1Nb2R1bGVbXCJfbWFsbG9jXCJdPU1vZHVsZVtcImFzbVwiXVtcImViXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfZnJlZT1Nb2R1bGVbXCJfZnJlZVwiXT1mdW5jdGlvbigpe3JldHVybihfZnJlZT1Nb2R1bGVbXCJfZnJlZVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJmYlwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX19fZXJybm9fbG9jYXRpb249TW9kdWxlW1wiX19fZXJybm9fbG9jYXRpb25cIl09ZnVuY3Rpb24oKXtyZXR1cm4oX19fZXJybm9fbG9jYXRpb249TW9kdWxlW1wiX19fZXJybm9fbG9jYXRpb25cIl09TW9kdWxlW1wiYXNtXCJdW1wiZ2JcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9lbXNjcmlwdGVuX2dldF9nbG9iYWxfbGliYz1Nb2R1bGVbXCJfZW1zY3JpcHRlbl9nZXRfZ2xvYmFsX2xpYmNcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX2Vtc2NyaXB0ZW5fZ2V0X2dsb2JhbF9saWJjPU1vZHVsZVtcIl9lbXNjcmlwdGVuX2dldF9nbG9iYWxfbGliY1wiXT1Nb2R1bGVbXCJhc21cIl1bXCJoYlwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX3B0aHJlYWRfc2VsZj1Nb2R1bGVbXCJfcHRocmVhZF9zZWxmXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9wdGhyZWFkX3NlbGY9TW9kdWxlW1wiX3B0aHJlYWRfc2VsZlwiXT1Nb2R1bGVbXCJhc21cIl1bXCJpYlwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX19fcHRocmVhZF90c2RfcnVuX2R0b3JzPU1vZHVsZVtcIl9fX3B0aHJlYWRfdHNkX3J1bl9kdG9yc1wiXT1mdW5jdGlvbigpe3JldHVybihfX19wdGhyZWFkX3RzZF9ydW5fZHRvcnM9TW9kdWxlW1wiX19fcHRocmVhZF90c2RfcnVuX2R0b3JzXCJdPU1vZHVsZVtcImFzbVwiXVtcImpiXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfZW1zY3JpcHRlbl9tYWluX3RocmVhZF9wcm9jZXNzX3F1ZXVlZF9jYWxscz1Nb2R1bGVbXCJfZW1zY3JpcHRlbl9tYWluX3RocmVhZF9wcm9jZXNzX3F1ZXVlZF9jYWxsc1wiXT1mdW5jdGlvbigpe3JldHVybihfZW1zY3JpcHRlbl9tYWluX3RocmVhZF9wcm9jZXNzX3F1ZXVlZF9jYWxscz1Nb2R1bGVbXCJfZW1zY3JpcHRlbl9tYWluX3RocmVhZF9wcm9jZXNzX3F1ZXVlZF9jYWxsc1wiXT1Nb2R1bGVbXCJhc21cIl1bXCJrYlwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX2Vtc2NyaXB0ZW5fY3VycmVudF90aHJlYWRfcHJvY2Vzc19xdWV1ZWRfY2FsbHM9TW9kdWxlW1wiX2Vtc2NyaXB0ZW5fY3VycmVudF90aHJlYWRfcHJvY2Vzc19xdWV1ZWRfY2FsbHNcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX2Vtc2NyaXB0ZW5fY3VycmVudF90aHJlYWRfcHJvY2Vzc19xdWV1ZWRfY2FsbHM9TW9kdWxlW1wiX2Vtc2NyaXB0ZW5fY3VycmVudF90aHJlYWRfcHJvY2Vzc19xdWV1ZWRfY2FsbHNcIl09TW9kdWxlW1wiYXNtXCJdW1wibGJcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9lbXNjcmlwdGVuX3JlZ2lzdGVyX21haW5fYnJvd3Nlcl90aHJlYWRfaWQ9TW9kdWxlW1wiX2Vtc2NyaXB0ZW5fcmVnaXN0ZXJfbWFpbl9icm93c2VyX3RocmVhZF9pZFwiXT1mdW5jdGlvbigpe3JldHVybihfZW1zY3JpcHRlbl9yZWdpc3Rlcl9tYWluX2Jyb3dzZXJfdGhyZWFkX2lkPU1vZHVsZVtcIl9lbXNjcmlwdGVuX3JlZ2lzdGVyX21haW5fYnJvd3Nlcl90aHJlYWRfaWRcIl09TW9kdWxlW1wiYXNtXCJdW1wibWJcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9fZW1zY3JpcHRlbl9kb19kaXNwYXRjaF90b190aHJlYWQ9TW9kdWxlW1wiX19lbXNjcmlwdGVuX2RvX2Rpc3BhdGNoX3RvX3RocmVhZFwiXT1mdW5jdGlvbigpe3JldHVybihfX2Vtc2NyaXB0ZW5fZG9fZGlzcGF0Y2hfdG9fdGhyZWFkPU1vZHVsZVtcIl9fZW1zY3JpcHRlbl9kb19kaXNwYXRjaF90b190aHJlYWRcIl09TW9kdWxlW1wiYXNtXCJdW1wibmJcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9lbXNjcmlwdGVuX3N5bmNfcnVuX2luX21haW5fdGhyZWFkXzQ9TW9kdWxlW1wiX2Vtc2NyaXB0ZW5fc3luY19ydW5faW5fbWFpbl90aHJlYWRfNFwiXT1mdW5jdGlvbigpe3JldHVybihfZW1zY3JpcHRlbl9zeW5jX3J1bl9pbl9tYWluX3RocmVhZF80PU1vZHVsZVtcIl9lbXNjcmlwdGVuX3N5bmNfcnVuX2luX21haW5fdGhyZWFkXzRcIl09TW9kdWxlW1wiYXNtXCJdW1wib2JcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9lbXNjcmlwdGVuX3J1bl9pbl9tYWluX3J1bnRpbWVfdGhyZWFkX2pzPU1vZHVsZVtcIl9lbXNjcmlwdGVuX3J1bl9pbl9tYWluX3J1bnRpbWVfdGhyZWFkX2pzXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9lbXNjcmlwdGVuX3J1bl9pbl9tYWluX3J1bnRpbWVfdGhyZWFkX2pzPU1vZHVsZVtcIl9lbXNjcmlwdGVuX3J1bl9pbl9tYWluX3J1bnRpbWVfdGhyZWFkX2pzXCJdPU1vZHVsZVtcImFzbVwiXVtcInBiXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfX2Vtc2NyaXB0ZW5fY2FsbF9vbl90aHJlYWQ9TW9kdWxlW1wiX19lbXNjcmlwdGVuX2NhbGxfb25fdGhyZWFkXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9fZW1zY3JpcHRlbl9jYWxsX29uX3RocmVhZD1Nb2R1bGVbXCJfX2Vtc2NyaXB0ZW5fY2FsbF9vbl90aHJlYWRcIl09TW9kdWxlW1wiYXNtXCJdW1wicWJcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9lbXNjcmlwdGVuX3Rsc19pbml0PU1vZHVsZVtcIl9lbXNjcmlwdGVuX3Rsc19pbml0XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9lbXNjcmlwdGVuX3Rsc19pbml0PU1vZHVsZVtcIl9lbXNjcmlwdGVuX3Rsc19pbml0XCJdPU1vZHVsZVtcImFzbVwiXVtcInJiXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfX2Vtc2NyaXB0ZW5fdGhyZWFkX2luaXQ9TW9kdWxlW1wiX19lbXNjcmlwdGVuX3RocmVhZF9pbml0XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9fZW1zY3JpcHRlbl90aHJlYWRfaW5pdD1Nb2R1bGVbXCJfX2Vtc2NyaXB0ZW5fdGhyZWFkX2luaXRcIl09TW9kdWxlW1wiYXNtXCJdW1wic2JcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIHN0YWNrU2F2ZT1Nb2R1bGVbXCJzdGFja1NhdmVcIl09ZnVuY3Rpb24oKXtyZXR1cm4oc3RhY2tTYXZlPU1vZHVsZVtcInN0YWNrU2F2ZVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJ0YlwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgc3RhY2tSZXN0b3JlPU1vZHVsZVtcInN0YWNrUmVzdG9yZVwiXT1mdW5jdGlvbigpe3JldHVybihzdGFja1Jlc3RvcmU9TW9kdWxlW1wic3RhY2tSZXN0b3JlXCJdPU1vZHVsZVtcImFzbVwiXVtcInViXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBzdGFja0FsbG9jPU1vZHVsZVtcInN0YWNrQWxsb2NcIl09ZnVuY3Rpb24oKXtyZXR1cm4oc3RhY2tBbGxvYz1Nb2R1bGVbXCJzdGFja0FsbG9jXCJdPU1vZHVsZVtcImFzbVwiXVtcInZiXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfZW1zY3JpcHRlbl9zdGFja19zZXRfbGltaXRzPU1vZHVsZVtcIl9lbXNjcmlwdGVuX3N0YWNrX3NldF9saW1pdHNcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX2Vtc2NyaXB0ZW5fc3RhY2tfc2V0X2xpbWl0cz1Nb2R1bGVbXCJfZW1zY3JpcHRlbl9zdGFja19zZXRfbGltaXRzXCJdPU1vZHVsZVtcImFzbVwiXVtcIndiXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfbWVtYWxpZ249TW9kdWxlW1wiX21lbWFsaWduXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9tZW1hbGlnbj1Nb2R1bGVbXCJfbWVtYWxpZ25cIl09TW9kdWxlW1wiYXNtXCJdW1wieGJcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9fZW1zY3JpcHRlbl9hbGxvd19tYWluX3J1bnRpbWVfcXVldWVkX2NhbGxzPU1vZHVsZVtcIl9fZW1zY3JpcHRlbl9hbGxvd19tYWluX3J1bnRpbWVfcXVldWVkX2NhbGxzXCJdPTk4MjQ7dmFyIF9fZW1zY3JpcHRlbl9tYWluX3RocmVhZF9mdXRleD1Nb2R1bGVbXCJfX2Vtc2NyaXB0ZW5fbWFpbl90aHJlYWRfZnV0ZXhcIl09MTE0NDg7TW9kdWxlW1wiY3dyYXBcIl09Y3dyYXA7TW9kdWxlW1wiUFRocmVhZFwiXT1QVGhyZWFkO01vZHVsZVtcIlBUaHJlYWRcIl09UFRocmVhZDtNb2R1bGVbXCJ3YXNtTWVtb3J5XCJdPXdhc21NZW1vcnk7TW9kdWxlW1wiRXhpdFN0YXR1c1wiXT1FeGl0U3RhdHVzO3ZhciBjYWxsZWRSdW47ZnVuY3Rpb24gRXhpdFN0YXR1cyhzdGF0dXMpe3RoaXMubmFtZT1cIkV4aXRTdGF0dXNcIjt0aGlzLm1lc3NhZ2U9XCJQcm9ncmFtIHRlcm1pbmF0ZWQgd2l0aCBleGl0KFwiK3N0YXR1cytcIilcIjt0aGlzLnN0YXR1cz1zdGF0dXN9ZGVwZW5kZW5jaWVzRnVsZmlsbGVkPWZ1bmN0aW9uIHJ1bkNhbGxlcigpe2lmKCFjYWxsZWRSdW4pcnVuKCk7aWYoIWNhbGxlZFJ1bilkZXBlbmRlbmNpZXNGdWxmaWxsZWQ9cnVuQ2FsbGVyfTtmdW5jdGlvbiBydW4oYXJncyl7YXJncz1hcmdzfHxhcmd1bWVudHNfO2lmKHJ1bkRlcGVuZGVuY2llcz4wKXtyZXR1cm59aWYoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRCl7cmVhZHlQcm9taXNlUmVzb2x2ZShNb2R1bGUpO2luaXRSdW50aW1lKCk7cG9zdE1lc3NhZ2Uoe1wiY21kXCI6XCJsb2FkZWRcIn0pO3JldHVybn1wcmVSdW4oKTtpZihydW5EZXBlbmRlbmNpZXM+MCl7cmV0dXJufWZ1bmN0aW9uIGRvUnVuKCl7aWYoY2FsbGVkUnVuKXJldHVybjtjYWxsZWRSdW49dHJ1ZTtNb2R1bGVbXCJjYWxsZWRSdW5cIl09dHJ1ZTtpZihBQk9SVClyZXR1cm47aW5pdFJ1bnRpbWUoKTtwcmVNYWluKCk7cmVhZHlQcm9taXNlUmVzb2x2ZShNb2R1bGUpO2lmKE1vZHVsZVtcIm9uUnVudGltZUluaXRpYWxpemVkXCJdKU1vZHVsZVtcIm9uUnVudGltZUluaXRpYWxpemVkXCJdKCk7cG9zdFJ1bigpfWlmKE1vZHVsZVtcInNldFN0YXR1c1wiXSl7TW9kdWxlW1wic2V0U3RhdHVzXCJdKFwiUnVubmluZy4uLlwiKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe01vZHVsZVtcInNldFN0YXR1c1wiXShcIlwiKX0sMSk7ZG9SdW4oKX0sMSl9ZWxzZXtkb1J1bigpfX1Nb2R1bGVbXCJydW5cIl09cnVuO2Z1bmN0aW9uIGV4aXQoc3RhdHVzLGltcGxpY2l0KXtpZihpbXBsaWNpdCYmbm9FeGl0UnVudGltZSYmc3RhdHVzPT09MCl7cmV0dXJufWlmKCFpbXBsaWNpdCl7aWYoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRCl7cG9zdE1lc3NhZ2Uoe1wiY21kXCI6XCJleGl0UHJvY2Vzc1wiLFwicmV0dXJuQ29kZVwiOnN0YXR1c30pO3Rocm93IG5ldyBFeGl0U3RhdHVzKHN0YXR1cyl9ZWxzZXt9fWlmKG5vRXhpdFJ1bnRpbWUpe31lbHNle1BUaHJlYWQudGVybWluYXRlQWxsVGhyZWFkcygpO0VYSVRTVEFUVVM9c3RhdHVzO2V4aXRSdW50aW1lKCk7aWYoTW9kdWxlW1wib25FeGl0XCJdKU1vZHVsZVtcIm9uRXhpdFwiXShzdGF0dXMpO0FCT1JUPXRydWV9cXVpdF8oc3RhdHVzLG5ldyBFeGl0U3RhdHVzKHN0YXR1cykpfWlmKE1vZHVsZVtcInByZUluaXRcIl0pe2lmKHR5cGVvZiBNb2R1bGVbXCJwcmVJbml0XCJdPT1cImZ1bmN0aW9uXCIpTW9kdWxlW1wicHJlSW5pdFwiXT1bTW9kdWxlW1wicHJlSW5pdFwiXV07d2hpbGUoTW9kdWxlW1wicHJlSW5pdFwiXS5sZW5ndGg+MCl7TW9kdWxlW1wicHJlSW5pdFwiXS5wb3AoKSgpfX1pZihFTlZJUk9OTUVOVF9JU19QVEhSRUFEKXtub0V4aXRSdW50aW1lPWZhbHNlO1BUaHJlYWQuaW5pdFdvcmtlcigpfXJ1bigpO1xuXG5cbiAgcmV0dXJuIFdhc21CYWNrZW5kTW9kdWxlVGhyZWFkZWRTaW1kLnJlYWR5XG59XG4pO1xufSkoKTtcbmlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG4gIG1vZHVsZS5leHBvcnRzID0gV2FzbUJhY2tlbmRNb2R1bGVUaHJlYWRlZFNpbWQ7XG5lbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZVsnYW1kJ10pXG4gIGRlZmluZShbXSwgZnVuY3Rpb24oKSB7IHJldHVybiBXYXNtQmFja2VuZE1vZHVsZVRocmVhZGVkU2ltZDsgfSk7XG5lbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG4gIGV4cG9ydHNbXCJXYXNtQmFja2VuZE1vZHVsZVRocmVhZGVkU2ltZFwiXSA9IFdhc21CYWNrZW5kTW9kdWxlVGhyZWFkZWRTaW1kO1xuIiwiZXhwb3J0IGNvbnN0IHdhc21Xb3JrZXJDb250ZW50cyA9ICd2YXIgTW9kdWxlPXt9O2Z1bmN0aW9uIHRocmVhZFByaW50RXJyKCl7dmFyIHRleHQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKS5qb2luKFwiIFwiKTtjb25zb2xlLmVycm9yKHRleHQpfWZ1bmN0aW9uIHRocmVhZEFsZXJ0KCl7dmFyIHRleHQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKS5qb2luKFwiIFwiKTtwb3N0TWVzc2FnZSh7Y21kOlwiYWxlcnRcIix0ZXh0OnRleHQsdGhyZWFkSWQ6TW9kdWxlW1wiX3B0aHJlYWRfc2VsZlwiXSgpfSl9dmFyIGVycj10aHJlYWRQcmludEVycjt0aGlzLmFsZXJ0PXRocmVhZEFsZXJ0O01vZHVsZVtcImluc3RhbnRpYXRlV2FzbVwiXT1mdW5jdGlvbihpbmZvLHJlY2VpdmVJbnN0YW5jZSl7dmFyIGluc3RhbmNlPW5ldyBXZWJBc3NlbWJseS5JbnN0YW5jZShNb2R1bGVbXCJ3YXNtTW9kdWxlXCJdLGluZm8pO01vZHVsZVtcIndhc21Nb2R1bGVcIl09bnVsbDtyZWNlaXZlSW5zdGFuY2UoaW5zdGFuY2UpO3JldHVybiBpbnN0YW5jZS5leHBvcnRzfTtmdW5jdGlvbiBtb2R1bGVMb2FkZWQoKXt9dGhpcy5vbm1lc3NhZ2U9ZnVuY3Rpb24oZSl7dHJ5e2lmKGUuZGF0YS5jbWQ9PT1cImxvYWRcIil7TW9kdWxlW1wid2FzbU1vZHVsZVwiXT1lLmRhdGEud2FzbU1vZHVsZTtNb2R1bGVbXCJ3YXNtTWVtb3J5XCJdPWUuZGF0YS53YXNtTWVtb3J5O01vZHVsZVtcImJ1ZmZlclwiXT1Nb2R1bGVbXCJ3YXNtTWVtb3J5XCJdLmJ1ZmZlcjtNb2R1bGVbXCJFTlZJUk9OTUVOVF9JU19QVEhSRUFEXCJdPXRydWU7aWYodHlwZW9mIGUuZGF0YS51cmxPckJsb2I9PT1cInN0cmluZ1wiKXtpbXBvcnRTY3JpcHRzKGUuZGF0YS51cmxPckJsb2IpfWVsc2V7dmFyIG9iamVjdFVybD1VUkwuY3JlYXRlT2JqZWN0VVJMKGUuZGF0YS51cmxPckJsb2IpO2ltcG9ydFNjcmlwdHMob2JqZWN0VXJsKTtVUkwucmV2b2tlT2JqZWN0VVJMKG9iamVjdFVybCl9V2FzbUJhY2tlbmRNb2R1bGVUaHJlYWRlZFNpbWQoTW9kdWxlKS50aGVuKGZ1bmN0aW9uKGluc3RhbmNlKXtNb2R1bGU9aW5zdGFuY2U7bW9kdWxlTG9hZGVkKCl9KX1lbHNlIGlmKGUuZGF0YS5jbWQ9PT1cIm9iamVjdFRyYW5zZmVyXCIpe01vZHVsZVtcIlBUaHJlYWRcIl0ucmVjZWl2ZU9iamVjdFRyYW5zZmVyKGUuZGF0YSl9ZWxzZSBpZihlLmRhdGEuY21kPT09XCJydW5cIil7TW9kdWxlW1wiX19wZXJmb3JtYW5jZV9ub3dfY2xvY2tfZHJpZnRcIl09cGVyZm9ybWFuY2Uubm93KCktZS5kYXRhLnRpbWU7TW9kdWxlW1wiX19lbXNjcmlwdGVuX3RocmVhZF9pbml0XCJdKGUuZGF0YS50aHJlYWRJbmZvU3RydWN0LDAsMCk7dmFyIG1heD1lLmRhdGEuc3RhY2tCYXNlO3ZhciB0b3A9ZS5kYXRhLnN0YWNrQmFzZStlLmRhdGEuc3RhY2tTaXplO01vZHVsZVtcImVzdGFibGlzaFN0YWNrU3BhY2VcIl0odG9wLG1heCk7TW9kdWxlW1wiX2Vtc2NyaXB0ZW5fdGxzX2luaXRcIl0oKTtNb2R1bGVbXCJQVGhyZWFkXCJdLnJlY2VpdmVPYmplY3RUcmFuc2ZlcihlLmRhdGEpO01vZHVsZVtcIlBUaHJlYWRcIl0uc2V0VGhyZWFkU3RhdHVzKE1vZHVsZVtcIl9wdGhyZWFkX3NlbGZcIl0oKSwxKTt0cnl7dmFyIHJlc3VsdD1Nb2R1bGVbXCJpbnZva2VFbnRyeVBvaW50XCJdKGUuZGF0YS5zdGFydF9yb3V0aW5lLGUuZGF0YS5hcmcpO2lmKCFNb2R1bGVbXCJnZXROb0V4aXRSdW50aW1lXCJdKCkpTW9kdWxlW1wiUFRocmVhZFwiXS50aHJlYWRFeGl0KHJlc3VsdCl9Y2F0Y2goZXgpe2lmKGV4PT09XCJDYW5jZWxlZCFcIil7TW9kdWxlW1wiUFRocmVhZFwiXS50aHJlYWRDYW5jZWwoKX1lbHNlIGlmKGV4IT1cInVud2luZFwiKXtpZihleCBpbnN0YW5jZW9mIE1vZHVsZVtcIkV4aXRTdGF0dXNcIl0pe2lmKE1vZHVsZVtcImdldE5vRXhpdFJ1bnRpbWVcIl0oKSl7fWVsc2V7TW9kdWxlW1wiUFRocmVhZFwiXS50aHJlYWRFeGl0KGV4LnN0YXR1cyl9fWVsc2V7TW9kdWxlW1wiUFRocmVhZFwiXS50aHJlYWRFeGl0KC0yKTt0aHJvdyBleH19fX1lbHNlIGlmKGUuZGF0YS5jbWQ9PT1cImNhbmNlbFwiKXtpZihNb2R1bGVbXCJfcHRocmVhZF9zZWxmXCJdKCkpe01vZHVsZVtcIlBUaHJlYWRcIl0udGhyZWFkQ2FuY2VsKCl9fWVsc2UgaWYoZS5kYXRhLnRhcmdldD09PVwic2V0aW1tZWRpYXRlXCIpe31lbHNlIGlmKGUuZGF0YS5jbWQ9PT1cInByb2Nlc3NUaHJlYWRRdWV1ZVwiKXtpZihNb2R1bGVbXCJfcHRocmVhZF9zZWxmXCJdKCkpe01vZHVsZVtcIl9lbXNjcmlwdGVuX2N1cnJlbnRfdGhyZWFkX3Byb2Nlc3NfcXVldWVkX2NhbGxzXCJdKCl9fWVsc2V7ZXJyKFwid29ya2VyLmpzIHJlY2VpdmVkIHVua25vd24gY29tbWFuZCBcIitlLmRhdGEuY21kKTtlcnIoZS5kYXRhKX19Y2F0Y2goZXgpe2VycihcIndvcmtlci5qcyBvbm1lc3NhZ2UoKSBjYXB0dXJlZCBhbiB1bmNhdWdodCBleGNlcHRpb246IFwiK2V4KTtpZihleCYmZXguc3RhY2spZXJyKGV4LnN0YWNrKTt0aHJvdyBleH19O2lmKHR5cGVvZiBwcm9jZXNzPT09XCJvYmplY3RcIiYmdHlwZW9mIHByb2Nlc3MudmVyc2lvbnM9PT1cIm9iamVjdFwiJiZ0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlPT09XCJzdHJpbmdcIil7c2VsZj17bG9jYXRpb246e2hyZWY6X19maWxlbmFtZX19O3ZhciBvbm1lc3NhZ2U9dGhpcy5vbm1lc3NhZ2U7dmFyIG5vZGVXb3JrZXJUaHJlYWRzPXJlcXVpcmUoXCJ3b3JrZXJfdGhyZWFkc1wiKTtnbG9iYWwuV29ya2VyPW5vZGVXb3JrZXJUaHJlYWRzLldvcmtlcjt2YXIgcGFyZW50UG9ydD1ub2RlV29ya2VyVGhyZWFkcy5wYXJlbnRQb3J0O3BhcmVudFBvcnQub24oXCJtZXNzYWdlXCIsZnVuY3Rpb24oZGF0YSl7b25tZXNzYWdlKHtkYXRhOmRhdGF9KX0pO3ZhciBub2RlRlM9cmVxdWlyZShcImZzXCIpO3ZhciBub2RlUmVhZD1mdW5jdGlvbihmaWxlbmFtZSl7cmV0dXJuIG5vZGVGUy5yZWFkRmlsZVN5bmMoZmlsZW5hbWUsXCJ1dGY4XCIpfTtmdW5jdGlvbiBnbG9iYWxFdmFsKHgpe2dsb2JhbC5yZXF1aXJlPXJlcXVpcmU7Z2xvYmFsLk1vZHVsZT1Nb2R1bGU7ZXZhbC5jYWxsKG51bGwseCl9aW1wb3J0U2NyaXB0cz1mdW5jdGlvbihmKXtnbG9iYWxFdmFsKG5vZGVSZWFkKGYpKX07cG9zdE1lc3NhZ2U9ZnVuY3Rpb24obXNnKXtwYXJlbnRQb3J0LnBvc3RNZXNzYWdlKG1zZyl9O2lmKHR5cGVvZiBwZXJmb3JtYW5jZT09PVwidW5kZWZpbmVkXCIpe3BlcmZvcm1hbmNlPXtub3c6ZnVuY3Rpb24oKXtyZXR1cm4gRGF0ZS5ub3coKX19fX0nOyIsIlxudmFyIFdhc21CYWNrZW5kTW9kdWxlID0gKGZ1bmN0aW9uKCkge1xuICB2YXIgX3NjcmlwdERpciA9IHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQuY3VycmVudFNjcmlwdCA/IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjIDogdW5kZWZpbmVkO1xuICBpZiAodHlwZW9mIF9fZmlsZW5hbWUgIT09ICd1bmRlZmluZWQnKSBfc2NyaXB0RGlyID0gX3NjcmlwdERpciB8fCBfX2ZpbGVuYW1lO1xuICByZXR1cm4gKFxuZnVuY3Rpb24oV2FzbUJhY2tlbmRNb2R1bGUpIHtcbiAgV2FzbUJhY2tlbmRNb2R1bGUgPSBXYXNtQmFja2VuZE1vZHVsZSB8fCB7fTtcblxudmFyIE1vZHVsZT10eXBlb2YgV2FzbUJhY2tlbmRNb2R1bGUhPT1cInVuZGVmaW5lZFwiP1dhc21CYWNrZW5kTW9kdWxlOnt9O3ZhciByZWFkeVByb21pc2VSZXNvbHZlLHJlYWR5UHJvbWlzZVJlamVjdDtNb2R1bGVbXCJyZWFkeVwiXT1uZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLHJlamVjdCl7cmVhZHlQcm9taXNlUmVzb2x2ZT1yZXNvbHZlO3JlYWR5UHJvbWlzZVJlamVjdD1yZWplY3R9KTt2YXIgbW9kdWxlT3ZlcnJpZGVzPXt9O3ZhciBrZXk7Zm9yKGtleSBpbiBNb2R1bGUpe2lmKE1vZHVsZS5oYXNPd25Qcm9wZXJ0eShrZXkpKXttb2R1bGVPdmVycmlkZXNba2V5XT1Nb2R1bGVba2V5XX19dmFyIGFyZ3VtZW50c189W107dmFyIHRoaXNQcm9ncmFtPVwiLi90aGlzLnByb2dyYW1cIjt2YXIgcXVpdF89ZnVuY3Rpb24oc3RhdHVzLHRvVGhyb3cpe3Rocm93IHRvVGhyb3d9O3ZhciBFTlZJUk9OTUVOVF9JU19XRUI9ZmFsc2U7dmFyIEVOVklST05NRU5UX0lTX1dPUktFUj1mYWxzZTt2YXIgRU5WSVJPTk1FTlRfSVNfTk9ERT1mYWxzZTt2YXIgRU5WSVJPTk1FTlRfSVNfU0hFTEw9ZmFsc2U7RU5WSVJPTk1FTlRfSVNfV0VCPXR5cGVvZiB3aW5kb3c9PT1cIm9iamVjdFwiO0VOVklST05NRU5UX0lTX1dPUktFUj10eXBlb2YgaW1wb3J0U2NyaXB0cz09PVwiZnVuY3Rpb25cIjtFTlZJUk9OTUVOVF9JU19OT0RFPXR5cGVvZiBwcm9jZXNzPT09XCJvYmplY3RcIiYmdHlwZW9mIHByb2Nlc3MudmVyc2lvbnM9PT1cIm9iamVjdFwiJiZ0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlPT09XCJzdHJpbmdcIjtFTlZJUk9OTUVOVF9JU19TSEVMTD0hRU5WSVJPTk1FTlRfSVNfV0VCJiYhRU5WSVJPTk1FTlRfSVNfTk9ERSYmIUVOVklST05NRU5UX0lTX1dPUktFUjt2YXIgc2NyaXB0RGlyZWN0b3J5PVwiXCI7ZnVuY3Rpb24gbG9jYXRlRmlsZShwYXRoKXtpZihNb2R1bGVbXCJsb2NhdGVGaWxlXCJdKXtyZXR1cm4gTW9kdWxlW1wibG9jYXRlRmlsZVwiXShwYXRoLHNjcmlwdERpcmVjdG9yeSl9cmV0dXJuIHNjcmlwdERpcmVjdG9yeStwYXRofXZhciByZWFkXyxyZWFkQXN5bmMscmVhZEJpbmFyeSxzZXRXaW5kb3dUaXRsZTt2YXIgbm9kZUZTO3ZhciBub2RlUGF0aDtpZihFTlZJUk9OTUVOVF9JU19OT0RFKXtpZihFTlZJUk9OTUVOVF9JU19XT1JLRVIpe3NjcmlwdERpcmVjdG9yeT1yZXF1aXJlKFwicGF0aFwiKS5kaXJuYW1lKHNjcmlwdERpcmVjdG9yeSkrXCIvXCJ9ZWxzZXtzY3JpcHREaXJlY3Rvcnk9X19kaXJuYW1lK1wiL1wifXJlYWRfPWZ1bmN0aW9uIHNoZWxsX3JlYWQoZmlsZW5hbWUsYmluYXJ5KXtpZighbm9kZUZTKW5vZGVGUz1yZXF1aXJlKFwiZnNcIik7aWYoIW5vZGVQYXRoKW5vZGVQYXRoPXJlcXVpcmUoXCJwYXRoXCIpO2ZpbGVuYW1lPW5vZGVQYXRoW1wibm9ybWFsaXplXCJdKGZpbGVuYW1lKTtyZXR1cm4gbm9kZUZTW1wicmVhZEZpbGVTeW5jXCJdKGZpbGVuYW1lLGJpbmFyeT9udWxsOlwidXRmOFwiKX07cmVhZEJpbmFyeT1mdW5jdGlvbiByZWFkQmluYXJ5KGZpbGVuYW1lKXt2YXIgcmV0PXJlYWRfKGZpbGVuYW1lLHRydWUpO2lmKCFyZXQuYnVmZmVyKXtyZXQ9bmV3IFVpbnQ4QXJyYXkocmV0KX1hc3NlcnQocmV0LmJ1ZmZlcik7cmV0dXJuIHJldH07aWYocHJvY2Vzc1tcImFyZ3ZcIl0ubGVuZ3RoPjEpe3RoaXNQcm9ncmFtPXByb2Nlc3NbXCJhcmd2XCJdWzFdLnJlcGxhY2UoL1xcXFwvZyxcIi9cIil9YXJndW1lbnRzXz1wcm9jZXNzW1wiYXJndlwiXS5zbGljZSgyKTtwcm9jZXNzW1wib25cIl0oXCJ1bmNhdWdodEV4Y2VwdGlvblwiLGZ1bmN0aW9uKGV4KXtpZighKGV4IGluc3RhbmNlb2YgRXhpdFN0YXR1cykpe3Rocm93IGV4fX0pO3Byb2Nlc3NbXCJvblwiXShcInVuaGFuZGxlZFJlamVjdGlvblwiLGFib3J0KTtxdWl0Xz1mdW5jdGlvbihzdGF0dXMpe3Byb2Nlc3NbXCJleGl0XCJdKHN0YXR1cyl9O01vZHVsZVtcImluc3BlY3RcIl09ZnVuY3Rpb24oKXtyZXR1cm5cIltFbXNjcmlwdGVuIE1vZHVsZSBvYmplY3RdXCJ9fWVsc2UgaWYoRU5WSVJPTk1FTlRfSVNfU0hFTEwpe2lmKHR5cGVvZiByZWFkIT1cInVuZGVmaW5lZFwiKXtyZWFkXz1mdW5jdGlvbiBzaGVsbF9yZWFkKGYpe3JldHVybiByZWFkKGYpfX1yZWFkQmluYXJ5PWZ1bmN0aW9uIHJlYWRCaW5hcnkoZil7dmFyIGRhdGE7aWYodHlwZW9mIHJlYWRidWZmZXI9PT1cImZ1bmN0aW9uXCIpe3JldHVybiBuZXcgVWludDhBcnJheShyZWFkYnVmZmVyKGYpKX1kYXRhPXJlYWQoZixcImJpbmFyeVwiKTthc3NlcnQodHlwZW9mIGRhdGE9PT1cIm9iamVjdFwiKTtyZXR1cm4gZGF0YX07aWYodHlwZW9mIHNjcmlwdEFyZ3MhPVwidW5kZWZpbmVkXCIpe2FyZ3VtZW50c189c2NyaXB0QXJnc31lbHNlIGlmKHR5cGVvZiBhcmd1bWVudHMhPVwidW5kZWZpbmVkXCIpe2FyZ3VtZW50c189YXJndW1lbnRzfWlmKHR5cGVvZiBxdWl0PT09XCJmdW5jdGlvblwiKXtxdWl0Xz1mdW5jdGlvbihzdGF0dXMpe3F1aXQoc3RhdHVzKX19aWYodHlwZW9mIHByaW50IT09XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGNvbnNvbGU9PT1cInVuZGVmaW5lZFwiKWNvbnNvbGU9e307Y29uc29sZS5sb2c9cHJpbnQ7Y29uc29sZS53YXJuPWNvbnNvbGUuZXJyb3I9dHlwZW9mIHByaW50RXJyIT09XCJ1bmRlZmluZWRcIj9wcmludEVycjpwcmludH19ZWxzZSBpZihFTlZJUk9OTUVOVF9JU19XRUJ8fEVOVklST05NRU5UX0lTX1dPUktFUil7aWYoRU5WSVJPTk1FTlRfSVNfV09SS0VSKXtzY3JpcHREaXJlY3Rvcnk9c2VsZi5sb2NhdGlvbi5ocmVmfWVsc2UgaWYodHlwZW9mIGRvY3VtZW50IT09XCJ1bmRlZmluZWRcIiYmZG9jdW1lbnQuY3VycmVudFNjcmlwdCl7c2NyaXB0RGlyZWN0b3J5PWRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjfWlmKF9zY3JpcHREaXIpe3NjcmlwdERpcmVjdG9yeT1fc2NyaXB0RGlyfWlmKHNjcmlwdERpcmVjdG9yeS5pbmRleE9mKFwiYmxvYjpcIikhPT0wKXtzY3JpcHREaXJlY3Rvcnk9c2NyaXB0RGlyZWN0b3J5LnN1YnN0cigwLHNjcmlwdERpcmVjdG9yeS5sYXN0SW5kZXhPZihcIi9cIikrMSl9ZWxzZXtzY3JpcHREaXJlY3Rvcnk9XCJcIn17cmVhZF89ZnVuY3Rpb24odXJsKXt2YXIgeGhyPW5ldyBYTUxIdHRwUmVxdWVzdDt4aHIub3BlbihcIkdFVFwiLHVybCxmYWxzZSk7eGhyLnNlbmQobnVsbCk7cmV0dXJuIHhoci5yZXNwb25zZVRleHR9O2lmKEVOVklST05NRU5UX0lTX1dPUktFUil7cmVhZEJpbmFyeT1mdW5jdGlvbih1cmwpe3ZhciB4aHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3hoci5vcGVuKFwiR0VUXCIsdXJsLGZhbHNlKTt4aHIucmVzcG9uc2VUeXBlPVwiYXJyYXlidWZmZXJcIjt4aHIuc2VuZChudWxsKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoeGhyLnJlc3BvbnNlKX19cmVhZEFzeW5jPWZ1bmN0aW9uKHVybCxvbmxvYWQsb25lcnJvcil7dmFyIHhocj1uZXcgWE1MSHR0cFJlcXVlc3Q7eGhyLm9wZW4oXCJHRVRcIix1cmwsdHJ1ZSk7eGhyLnJlc3BvbnNlVHlwZT1cImFycmF5YnVmZmVyXCI7eGhyLm9ubG9hZD1mdW5jdGlvbigpe2lmKHhoci5zdGF0dXM9PTIwMHx8eGhyLnN0YXR1cz09MCYmeGhyLnJlc3BvbnNlKXtvbmxvYWQoeGhyLnJlc3BvbnNlKTtyZXR1cm59b25lcnJvcigpfTt4aHIub25lcnJvcj1vbmVycm9yO3hoci5zZW5kKG51bGwpfX1zZXRXaW5kb3dUaXRsZT1mdW5jdGlvbih0aXRsZSl7ZG9jdW1lbnQudGl0bGU9dGl0bGV9fWVsc2V7fXZhciBvdXQ9TW9kdWxlW1wicHJpbnRcIl18fGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSk7dmFyIGVycj1Nb2R1bGVbXCJwcmludEVyclwiXXx8Y29uc29sZS53YXJuLmJpbmQoY29uc29sZSk7Zm9yKGtleSBpbiBtb2R1bGVPdmVycmlkZXMpe2lmKG1vZHVsZU92ZXJyaWRlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKXtNb2R1bGVba2V5XT1tb2R1bGVPdmVycmlkZXNba2V5XX19bW9kdWxlT3ZlcnJpZGVzPW51bGw7aWYoTW9kdWxlW1wiYXJndW1lbnRzXCJdKWFyZ3VtZW50c189TW9kdWxlW1wiYXJndW1lbnRzXCJdO2lmKE1vZHVsZVtcInRoaXNQcm9ncmFtXCJdKXRoaXNQcm9ncmFtPU1vZHVsZVtcInRoaXNQcm9ncmFtXCJdO2lmKE1vZHVsZVtcInF1aXRcIl0pcXVpdF89TW9kdWxlW1wicXVpdFwiXTt2YXIgd2FzbUJpbmFyeTtpZihNb2R1bGVbXCJ3YXNtQmluYXJ5XCJdKXdhc21CaW5hcnk9TW9kdWxlW1wid2FzbUJpbmFyeVwiXTt2YXIgbm9FeGl0UnVudGltZT1Nb2R1bGVbXCJub0V4aXRSdW50aW1lXCJdfHx0cnVlO2lmKHR5cGVvZiBXZWJBc3NlbWJseSE9PVwib2JqZWN0XCIpe2Fib3J0KFwibm8gbmF0aXZlIHdhc20gc3VwcG9ydCBkZXRlY3RlZFwiKX12YXIgd2FzbU1lbW9yeTt2YXIgQUJPUlQ9ZmFsc2U7dmFyIEVYSVRTVEFUVVM7ZnVuY3Rpb24gYXNzZXJ0KGNvbmRpdGlvbix0ZXh0KXtpZighY29uZGl0aW9uKXthYm9ydChcIkFzc2VydGlvbiBmYWlsZWQ6IFwiK3RleHQpfX1mdW5jdGlvbiBnZXRDRnVuYyhpZGVudCl7dmFyIGZ1bmM9TW9kdWxlW1wiX1wiK2lkZW50XTthc3NlcnQoZnVuYyxcIkNhbm5vdCBjYWxsIHVua25vd24gZnVuY3Rpb24gXCIraWRlbnQrXCIsIG1ha2Ugc3VyZSBpdCBpcyBleHBvcnRlZFwiKTtyZXR1cm4gZnVuY31mdW5jdGlvbiBjY2FsbChpZGVudCxyZXR1cm5UeXBlLGFyZ1R5cGVzLGFyZ3Msb3B0cyl7dmFyIHRvQz17XCJzdHJpbmdcIjpmdW5jdGlvbihzdHIpe3ZhciByZXQ9MDtpZihzdHIhPT1udWxsJiZzdHIhPT11bmRlZmluZWQmJnN0ciE9PTApe3ZhciBsZW49KHN0ci5sZW5ndGg8PDIpKzE7cmV0PXN0YWNrQWxsb2MobGVuKTtzdHJpbmdUb1VURjgoc3RyLHJldCxsZW4pfXJldHVybiByZXR9LFwiYXJyYXlcIjpmdW5jdGlvbihhcnIpe3ZhciByZXQ9c3RhY2tBbGxvYyhhcnIubGVuZ3RoKTt3cml0ZUFycmF5VG9NZW1vcnkoYXJyLHJldCk7cmV0dXJuIHJldH19O2Z1bmN0aW9uIGNvbnZlcnRSZXR1cm5WYWx1ZShyZXQpe2lmKHJldHVyblR5cGU9PT1cInN0cmluZ1wiKXJldHVybiBVVEY4VG9TdHJpbmcocmV0KTtpZihyZXR1cm5UeXBlPT09XCJib29sZWFuXCIpcmV0dXJuIEJvb2xlYW4ocmV0KTtyZXR1cm4gcmV0fXZhciBmdW5jPWdldENGdW5jKGlkZW50KTt2YXIgY0FyZ3M9W107dmFyIHN0YWNrPTA7aWYoYXJncyl7Zm9yKHZhciBpPTA7aTxhcmdzLmxlbmd0aDtpKyspe3ZhciBjb252ZXJ0ZXI9dG9DW2FyZ1R5cGVzW2ldXTtpZihjb252ZXJ0ZXIpe2lmKHN0YWNrPT09MClzdGFjaz1zdGFja1NhdmUoKTtjQXJnc1tpXT1jb252ZXJ0ZXIoYXJnc1tpXSl9ZWxzZXtjQXJnc1tpXT1hcmdzW2ldfX19dmFyIHJldD1mdW5jLmFwcGx5KG51bGwsY0FyZ3MpO3JldD1jb252ZXJ0UmV0dXJuVmFsdWUocmV0KTtpZihzdGFjayE9PTApc3RhY2tSZXN0b3JlKHN0YWNrKTtyZXR1cm4gcmV0fWZ1bmN0aW9uIGN3cmFwKGlkZW50LHJldHVyblR5cGUsYXJnVHlwZXMsb3B0cyl7YXJnVHlwZXM9YXJnVHlwZXN8fFtdO3ZhciBudW1lcmljQXJncz1hcmdUeXBlcy5ldmVyeShmdW5jdGlvbih0eXBlKXtyZXR1cm4gdHlwZT09PVwibnVtYmVyXCJ9KTt2YXIgbnVtZXJpY1JldD1yZXR1cm5UeXBlIT09XCJzdHJpbmdcIjtpZihudW1lcmljUmV0JiZudW1lcmljQXJncyYmIW9wdHMpe3JldHVybiBnZXRDRnVuYyhpZGVudCl9cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGNjYWxsKGlkZW50LHJldHVyblR5cGUsYXJnVHlwZXMsYXJndW1lbnRzLG9wdHMpfX12YXIgVVRGOERlY29kZXI9dHlwZW9mIFRleHREZWNvZGVyIT09XCJ1bmRlZmluZWRcIj9uZXcgVGV4dERlY29kZXIoXCJ1dGY4XCIpOnVuZGVmaW5lZDtmdW5jdGlvbiBVVEY4QXJyYXlUb1N0cmluZyhoZWFwLGlkeCxtYXhCeXRlc1RvUmVhZCl7dmFyIGVuZElkeD1pZHgrbWF4Qnl0ZXNUb1JlYWQ7dmFyIGVuZFB0cj1pZHg7d2hpbGUoaGVhcFtlbmRQdHJdJiYhKGVuZFB0cj49ZW5kSWR4KSkrK2VuZFB0cjtpZihlbmRQdHItaWR4PjE2JiZoZWFwLnN1YmFycmF5JiZVVEY4RGVjb2Rlcil7cmV0dXJuIFVURjhEZWNvZGVyLmRlY29kZShoZWFwLnN1YmFycmF5KGlkeCxlbmRQdHIpKX1lbHNle3ZhciBzdHI9XCJcIjt3aGlsZShpZHg8ZW5kUHRyKXt2YXIgdTA9aGVhcFtpZHgrK107aWYoISh1MCYxMjgpKXtzdHIrPVN0cmluZy5mcm9tQ2hhckNvZGUodTApO2NvbnRpbnVlfXZhciB1MT1oZWFwW2lkeCsrXSY2MztpZigodTAmMjI0KT09MTkyKXtzdHIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKHUwJjMxKTw8Nnx1MSk7Y29udGludWV9dmFyIHUyPWhlYXBbaWR4KytdJjYzO2lmKCh1MCYyNDApPT0yMjQpe3UwPSh1MCYxNSk8PDEyfHUxPDw2fHUyfWVsc2V7dTA9KHUwJjcpPDwxOHx1MTw8MTJ8dTI8PDZ8aGVhcFtpZHgrK10mNjN9aWYodTA8NjU1MzYpe3N0cis9U3RyaW5nLmZyb21DaGFyQ29kZSh1MCl9ZWxzZXt2YXIgY2g9dTAtNjU1MzY7c3RyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2fGNoPj4xMCw1NjMyMHxjaCYxMDIzKX19fXJldHVybiBzdHJ9ZnVuY3Rpb24gVVRGOFRvU3RyaW5nKHB0cixtYXhCeXRlc1RvUmVhZCl7cmV0dXJuIHB0cj9VVEY4QXJyYXlUb1N0cmluZyhIRUFQVTgscHRyLG1heEJ5dGVzVG9SZWFkKTpcIlwifWZ1bmN0aW9uIHN0cmluZ1RvVVRGOEFycmF5KHN0cixoZWFwLG91dElkeCxtYXhCeXRlc1RvV3JpdGUpe2lmKCEobWF4Qnl0ZXNUb1dyaXRlPjApKXJldHVybiAwO3ZhciBzdGFydElkeD1vdXRJZHg7dmFyIGVuZElkeD1vdXRJZHgrbWF4Qnl0ZXNUb1dyaXRlLTE7Zm9yKHZhciBpPTA7aTxzdHIubGVuZ3RoOysraSl7dmFyIHU9c3RyLmNoYXJDb2RlQXQoaSk7aWYodT49NTUyOTYmJnU8PTU3MzQzKXt2YXIgdTE9c3RyLmNoYXJDb2RlQXQoKytpKTt1PTY1NTM2KygodSYxMDIzKTw8MTApfHUxJjEwMjN9aWYodTw9MTI3KXtpZihvdXRJZHg+PWVuZElkeClicmVhaztoZWFwW291dElkeCsrXT11fWVsc2UgaWYodTw9MjA0Nyl7aWYob3V0SWR4KzE+PWVuZElkeClicmVhaztoZWFwW291dElkeCsrXT0xOTJ8dT4+NjtoZWFwW291dElkeCsrXT0xMjh8dSY2M31lbHNlIGlmKHU8PTY1NTM1KXtpZihvdXRJZHgrMj49ZW5kSWR4KWJyZWFrO2hlYXBbb3V0SWR4KytdPTIyNHx1Pj4xMjtoZWFwW291dElkeCsrXT0xMjh8dT4+NiY2MztoZWFwW291dElkeCsrXT0xMjh8dSY2M31lbHNle2lmKG91dElkeCszPj1lbmRJZHgpYnJlYWs7aGVhcFtvdXRJZHgrK109MjQwfHU+PjE4O2hlYXBbb3V0SWR4KytdPTEyOHx1Pj4xMiY2MztoZWFwW291dElkeCsrXT0xMjh8dT4+NiY2MztoZWFwW291dElkeCsrXT0xMjh8dSY2M319aGVhcFtvdXRJZHhdPTA7cmV0dXJuIG91dElkeC1zdGFydElkeH1mdW5jdGlvbiBzdHJpbmdUb1VURjgoc3RyLG91dFB0cixtYXhCeXRlc1RvV3JpdGUpe3JldHVybiBzdHJpbmdUb1VURjhBcnJheShzdHIsSEVBUFU4LG91dFB0cixtYXhCeXRlc1RvV3JpdGUpfWZ1bmN0aW9uIHdyaXRlQXJyYXlUb01lbW9yeShhcnJheSxidWZmZXIpe0hFQVA4LnNldChhcnJheSxidWZmZXIpfWZ1bmN0aW9uIGFsaWduVXAoeCxtdWx0aXBsZSl7aWYoeCVtdWx0aXBsZT4wKXt4Kz1tdWx0aXBsZS14JW11bHRpcGxlfXJldHVybiB4fXZhciBidWZmZXIsSEVBUDgsSEVBUFU4LEhFQVAxNixIRUFQVTE2LEhFQVAzMixIRUFQVTMyLEhFQVBGMzIsSEVBUEY2NDtmdW5jdGlvbiB1cGRhdGVHbG9iYWxCdWZmZXJBbmRWaWV3cyhidWYpe2J1ZmZlcj1idWY7TW9kdWxlW1wiSEVBUDhcIl09SEVBUDg9bmV3IEludDhBcnJheShidWYpO01vZHVsZVtcIkhFQVAxNlwiXT1IRUFQMTY9bmV3IEludDE2QXJyYXkoYnVmKTtNb2R1bGVbXCJIRUFQMzJcIl09SEVBUDMyPW5ldyBJbnQzMkFycmF5KGJ1Zik7TW9kdWxlW1wiSEVBUFU4XCJdPUhFQVBVOD1uZXcgVWludDhBcnJheShidWYpO01vZHVsZVtcIkhFQVBVMTZcIl09SEVBUFUxNj1uZXcgVWludDE2QXJyYXkoYnVmKTtNb2R1bGVbXCJIRUFQVTMyXCJdPUhFQVBVMzI9bmV3IFVpbnQzMkFycmF5KGJ1Zik7TW9kdWxlW1wiSEVBUEYzMlwiXT1IRUFQRjMyPW5ldyBGbG9hdDMyQXJyYXkoYnVmKTtNb2R1bGVbXCJIRUFQRjY0XCJdPUhFQVBGNjQ9bmV3IEZsb2F0NjRBcnJheShidWYpfXZhciBJTklUSUFMX01FTU9SWT1Nb2R1bGVbXCJJTklUSUFMX01FTU9SWVwiXXx8MTY3NzcyMTY7dmFyIHdhc21UYWJsZTt2YXIgX19BVFBSRVJVTl9fPVtdO3ZhciBfX0FUSU5JVF9fPVtdO3ZhciBfX0FUTUFJTl9fPVtdO3ZhciBfX0FUUE9TVFJVTl9fPVtdO3ZhciBydW50aW1lSW5pdGlhbGl6ZWQ9ZmFsc2U7X19BVElOSVRfXy5wdXNoKHtmdW5jOmZ1bmN0aW9uKCl7X19fd2FzbV9jYWxsX2N0b3JzKCl9fSk7ZnVuY3Rpb24gcHJlUnVuKCl7aWYoTW9kdWxlW1wicHJlUnVuXCJdKXtpZih0eXBlb2YgTW9kdWxlW1wicHJlUnVuXCJdPT1cImZ1bmN0aW9uXCIpTW9kdWxlW1wicHJlUnVuXCJdPVtNb2R1bGVbXCJwcmVSdW5cIl1dO3doaWxlKE1vZHVsZVtcInByZVJ1blwiXS5sZW5ndGgpe2FkZE9uUHJlUnVuKE1vZHVsZVtcInByZVJ1blwiXS5zaGlmdCgpKX19Y2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVFBSRVJVTl9fKX1mdW5jdGlvbiBpbml0UnVudGltZSgpe3J1bnRpbWVJbml0aWFsaXplZD10cnVlO2NhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRJTklUX18pfWZ1bmN0aW9uIHByZU1haW4oKXtjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUTUFJTl9fKX1mdW5jdGlvbiBwb3N0UnVuKCl7aWYoTW9kdWxlW1wicG9zdFJ1blwiXSl7aWYodHlwZW9mIE1vZHVsZVtcInBvc3RSdW5cIl09PVwiZnVuY3Rpb25cIilNb2R1bGVbXCJwb3N0UnVuXCJdPVtNb2R1bGVbXCJwb3N0UnVuXCJdXTt3aGlsZShNb2R1bGVbXCJwb3N0UnVuXCJdLmxlbmd0aCl7YWRkT25Qb3N0UnVuKE1vZHVsZVtcInBvc3RSdW5cIl0uc2hpZnQoKSl9fWNhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRQT1NUUlVOX18pfWZ1bmN0aW9uIGFkZE9uUHJlUnVuKGNiKXtfX0FUUFJFUlVOX18udW5zaGlmdChjYil9ZnVuY3Rpb24gYWRkT25Qb3N0UnVuKGNiKXtfX0FUUE9TVFJVTl9fLnVuc2hpZnQoY2IpfXZhciBydW5EZXBlbmRlbmNpZXM9MDt2YXIgcnVuRGVwZW5kZW5jeVdhdGNoZXI9bnVsbDt2YXIgZGVwZW5kZW5jaWVzRnVsZmlsbGVkPW51bGw7ZnVuY3Rpb24gYWRkUnVuRGVwZW5kZW5jeShpZCl7cnVuRGVwZW5kZW5jaWVzKys7aWYoTW9kdWxlW1wibW9uaXRvclJ1bkRlcGVuZGVuY2llc1wiXSl7TW9kdWxlW1wibW9uaXRvclJ1bkRlcGVuZGVuY2llc1wiXShydW5EZXBlbmRlbmNpZXMpfX1mdW5jdGlvbiByZW1vdmVSdW5EZXBlbmRlbmN5KGlkKXtydW5EZXBlbmRlbmNpZXMtLTtpZihNb2R1bGVbXCJtb25pdG9yUnVuRGVwZW5kZW5jaWVzXCJdKXtNb2R1bGVbXCJtb25pdG9yUnVuRGVwZW5kZW5jaWVzXCJdKHJ1bkRlcGVuZGVuY2llcyl9aWYocnVuRGVwZW5kZW5jaWVzPT0wKXtpZihydW5EZXBlbmRlbmN5V2F0Y2hlciE9PW51bGwpe2NsZWFySW50ZXJ2YWwocnVuRGVwZW5kZW5jeVdhdGNoZXIpO3J1bkRlcGVuZGVuY3lXYXRjaGVyPW51bGx9aWYoZGVwZW5kZW5jaWVzRnVsZmlsbGVkKXt2YXIgY2FsbGJhY2s9ZGVwZW5kZW5jaWVzRnVsZmlsbGVkO2RlcGVuZGVuY2llc0Z1bGZpbGxlZD1udWxsO2NhbGxiYWNrKCl9fX1Nb2R1bGVbXCJwcmVsb2FkZWRJbWFnZXNcIl09e307TW9kdWxlW1wicHJlbG9hZGVkQXVkaW9zXCJdPXt9O2Z1bmN0aW9uIGFib3J0KHdoYXQpe2lmKE1vZHVsZVtcIm9uQWJvcnRcIl0pe01vZHVsZVtcIm9uQWJvcnRcIl0od2hhdCl9d2hhdCs9XCJcIjtlcnIod2hhdCk7QUJPUlQ9dHJ1ZTtFWElUU1RBVFVTPTE7d2hhdD1cImFib3J0KFwiK3doYXQrXCIpLiBCdWlsZCB3aXRoIC1zIEFTU0VSVElPTlM9MSBmb3IgbW9yZSBpbmZvLlwiO3ZhciBlPW5ldyBXZWJBc3NlbWJseS5SdW50aW1lRXJyb3Iod2hhdCk7cmVhZHlQcm9taXNlUmVqZWN0KGUpO3Rocm93IGV9ZnVuY3Rpb24gaGFzUHJlZml4KHN0cixwcmVmaXgpe3JldHVybiBTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGg/c3RyLnN0YXJ0c1dpdGgocHJlZml4KTpzdHIuaW5kZXhPZihwcmVmaXgpPT09MH12YXIgZGF0YVVSSVByZWZpeD1cImRhdGE6YXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtO2Jhc2U2NCxcIjtmdW5jdGlvbiBpc0RhdGFVUkkoZmlsZW5hbWUpe3JldHVybiBoYXNQcmVmaXgoZmlsZW5hbWUsZGF0YVVSSVByZWZpeCl9dmFyIGZpbGVVUklQcmVmaXg9XCJmaWxlOi8vXCI7ZnVuY3Rpb24gaXNGaWxlVVJJKGZpbGVuYW1lKXtyZXR1cm4gaGFzUHJlZml4KGZpbGVuYW1lLGZpbGVVUklQcmVmaXgpfXZhciB3YXNtQmluYXJ5RmlsZT1cInRmanMtYmFja2VuZC13YXNtLndhc21cIjtpZighaXNEYXRhVVJJKHdhc21CaW5hcnlGaWxlKSl7d2FzbUJpbmFyeUZpbGU9bG9jYXRlRmlsZSh3YXNtQmluYXJ5RmlsZSl9ZnVuY3Rpb24gZ2V0QmluYXJ5KGZpbGUpe3RyeXtpZihmaWxlPT13YXNtQmluYXJ5RmlsZSYmd2FzbUJpbmFyeSl7cmV0dXJuIG5ldyBVaW50OEFycmF5KHdhc21CaW5hcnkpfWlmKHJlYWRCaW5hcnkpe3JldHVybiByZWFkQmluYXJ5KGZpbGUpfWVsc2V7dGhyb3dcImJvdGggYXN5bmMgYW5kIHN5bmMgZmV0Y2hpbmcgb2YgdGhlIHdhc20gZmFpbGVkXCJ9fWNhdGNoKGVycil7YWJvcnQoZXJyKX19ZnVuY3Rpb24gZ2V0QmluYXJ5UHJvbWlzZSgpe2lmKCF3YXNtQmluYXJ5JiYoRU5WSVJPTk1FTlRfSVNfV0VCfHxFTlZJUk9OTUVOVF9JU19XT1JLRVIpKXtpZih0eXBlb2YgZmV0Y2g9PT1cImZ1bmN0aW9uXCImJiFpc0ZpbGVVUkkod2FzbUJpbmFyeUZpbGUpKXtyZXR1cm4gZmV0Y2god2FzbUJpbmFyeUZpbGUse2NyZWRlbnRpYWxzOlwic2FtZS1vcmlnaW5cIn0pLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2Upe2lmKCFyZXNwb25zZVtcIm9rXCJdKXt0aHJvd1wiZmFpbGVkIHRvIGxvYWQgd2FzbSBiaW5hcnkgZmlsZSBhdCAnXCIrd2FzbUJpbmFyeUZpbGUrXCInXCJ9cmV0dXJuIHJlc3BvbnNlW1wiYXJyYXlCdWZmZXJcIl0oKX0pLmNhdGNoKGZ1bmN0aW9uKCl7cmV0dXJuIGdldEJpbmFyeSh3YXNtQmluYXJ5RmlsZSl9KX1lbHNle2lmKHJlYWRBc3luYyl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUscmVqZWN0KXtyZWFkQXN5bmMod2FzbUJpbmFyeUZpbGUsZnVuY3Rpb24ocmVzcG9uc2Upe3Jlc29sdmUobmV3IFVpbnQ4QXJyYXkocmVzcG9uc2UpKX0scmVqZWN0KX0pfX19cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gZ2V0QmluYXJ5KHdhc21CaW5hcnlGaWxlKX0pfWZ1bmN0aW9uIGNyZWF0ZVdhc20oKXt2YXIgaW5mbz17XCJhXCI6YXNtTGlicmFyeUFyZ307ZnVuY3Rpb24gcmVjZWl2ZUluc3RhbmNlKGluc3RhbmNlLG1vZHVsZSl7dmFyIGV4cG9ydHM9aW5zdGFuY2UuZXhwb3J0cztNb2R1bGVbXCJhc21cIl09ZXhwb3J0czt3YXNtTWVtb3J5PU1vZHVsZVtcImFzbVwiXVtcImlcIl07dXBkYXRlR2xvYmFsQnVmZmVyQW5kVmlld3Mod2FzbU1lbW9yeS5idWZmZXIpO3dhc21UYWJsZT1Nb2R1bGVbXCJhc21cIl1bXCJvXCJdO3JlbW92ZVJ1bkRlcGVuZGVuY3koXCJ3YXNtLWluc3RhbnRpYXRlXCIpfWFkZFJ1bkRlcGVuZGVuY3koXCJ3YXNtLWluc3RhbnRpYXRlXCIpO2Z1bmN0aW9uIHJlY2VpdmVJbnN0YW50aWF0ZWRTb3VyY2Uob3V0cHV0KXtyZWNlaXZlSW5zdGFuY2Uob3V0cHV0W1wiaW5zdGFuY2VcIl0pfWZ1bmN0aW9uIGluc3RhbnRpYXRlQXJyYXlCdWZmZXIocmVjZWl2ZXIpe3JldHVybiBnZXRCaW5hcnlQcm9taXNlKCkudGhlbihmdW5jdGlvbihiaW5hcnkpe3JldHVybiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShiaW5hcnksaW5mbyl9KS50aGVuKHJlY2VpdmVyLGZ1bmN0aW9uKHJlYXNvbil7ZXJyKFwiZmFpbGVkIHRvIGFzeW5jaHJvbm91c2x5IHByZXBhcmUgd2FzbTogXCIrcmVhc29uKTthYm9ydChyZWFzb24pfSl9ZnVuY3Rpb24gaW5zdGFudGlhdGVBc3luYygpe2lmKCF3YXNtQmluYXJ5JiZ0eXBlb2YgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmc9PT1cImZ1bmN0aW9uXCImJiFpc0RhdGFVUkkod2FzbUJpbmFyeUZpbGUpJiYhaXNGaWxlVVJJKHdhc21CaW5hcnlGaWxlKSYmdHlwZW9mIGZldGNoPT09XCJmdW5jdGlvblwiKXtyZXR1cm4gZmV0Y2god2FzbUJpbmFyeUZpbGUse2NyZWRlbnRpYWxzOlwic2FtZS1vcmlnaW5cIn0pLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2Upe3ZhciByZXN1bHQ9V2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcocmVzcG9uc2UsaW5mbyk7cmV0dXJuIHJlc3VsdC50aGVuKHJlY2VpdmVJbnN0YW50aWF0ZWRTb3VyY2UsZnVuY3Rpb24ocmVhc29uKXtlcnIoXCJ3YXNtIHN0cmVhbWluZyBjb21waWxlIGZhaWxlZDogXCIrcmVhc29uKTtlcnIoXCJmYWxsaW5nIGJhY2sgdG8gQXJyYXlCdWZmZXIgaW5zdGFudGlhdGlvblwiKTtyZXR1cm4gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlSW5zdGFudGlhdGVkU291cmNlKX0pfSl9ZWxzZXtyZXR1cm4gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlSW5zdGFudGlhdGVkU291cmNlKX19aWYoTW9kdWxlW1wiaW5zdGFudGlhdGVXYXNtXCJdKXt0cnl7dmFyIGV4cG9ydHM9TW9kdWxlW1wiaW5zdGFudGlhdGVXYXNtXCJdKGluZm8scmVjZWl2ZUluc3RhbmNlKTtyZXR1cm4gZXhwb3J0c31jYXRjaChlKXtlcnIoXCJNb2R1bGUuaW5zdGFudGlhdGVXYXNtIGNhbGxiYWNrIGZhaWxlZCB3aXRoIGVycm9yOiBcIitlKTtyZXR1cm4gZmFsc2V9fWluc3RhbnRpYXRlQXN5bmMoKS5jYXRjaChyZWFkeVByb21pc2VSZWplY3QpO3JldHVybnt9fWZ1bmN0aW9uIGNhbGxSdW50aW1lQ2FsbGJhY2tzKGNhbGxiYWNrcyl7d2hpbGUoY2FsbGJhY2tzLmxlbmd0aD4wKXt2YXIgY2FsbGJhY2s9Y2FsbGJhY2tzLnNoaWZ0KCk7aWYodHlwZW9mIGNhbGxiYWNrPT1cImZ1bmN0aW9uXCIpe2NhbGxiYWNrKE1vZHVsZSk7Y29udGludWV9dmFyIGZ1bmM9Y2FsbGJhY2suZnVuYztpZih0eXBlb2YgZnVuYz09PVwibnVtYmVyXCIpe2lmKGNhbGxiYWNrLmFyZz09PXVuZGVmaW5lZCl7d2FzbVRhYmxlLmdldChmdW5jKSgpfWVsc2V7d2FzbVRhYmxlLmdldChmdW5jKShjYWxsYmFjay5hcmcpfX1lbHNle2Z1bmMoY2FsbGJhY2suYXJnPT09dW5kZWZpbmVkP251bGw6Y2FsbGJhY2suYXJnKX19fWZ1bmN0aW9uIF9hYm9ydCgpe2Fib3J0KCl9ZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fbWVtY3B5X2JpZyhkZXN0LHNyYyxudW0pe0hFQVBVOC5jb3B5V2l0aGluKGRlc3Qsc3JjLHNyYytudW0pfWZ1bmN0aW9uIF9lbXNjcmlwdGVuX2dldF9oZWFwX3NpemUoKXtyZXR1cm4gSEVBUFU4Lmxlbmd0aH1mdW5jdGlvbiBlbXNjcmlwdGVuX3JlYWxsb2NfYnVmZmVyKHNpemUpe3RyeXt3YXNtTWVtb3J5Lmdyb3coc2l6ZS1idWZmZXIuYnl0ZUxlbmd0aCs2NTUzNT4+PjE2KTt1cGRhdGVHbG9iYWxCdWZmZXJBbmRWaWV3cyh3YXNtTWVtb3J5LmJ1ZmZlcik7cmV0dXJuIDF9Y2F0Y2goZSl7fX1mdW5jdGlvbiBfZW1zY3JpcHRlbl9yZXNpemVfaGVhcChyZXF1ZXN0ZWRTaXplKXt2YXIgb2xkU2l6ZT1fZW1zY3JpcHRlbl9nZXRfaGVhcF9zaXplKCk7dmFyIG1heEhlYXBTaXplPTIxNDc0ODM2NDg7aWYocmVxdWVzdGVkU2l6ZT5tYXhIZWFwU2l6ZSl7cmV0dXJuIGZhbHNlfWZvcih2YXIgY3V0RG93bj0xO2N1dERvd248PTQ7Y3V0RG93bio9Mil7dmFyIG92ZXJHcm93bkhlYXBTaXplPW9sZFNpemUqKDErLjIvY3V0RG93bik7b3Zlckdyb3duSGVhcFNpemU9TWF0aC5taW4ob3Zlckdyb3duSGVhcFNpemUscmVxdWVzdGVkU2l6ZSsxMDA2NjMyOTYpO3ZhciBuZXdTaXplPU1hdGgubWluKG1heEhlYXBTaXplLGFsaWduVXAoTWF0aC5tYXgocmVxdWVzdGVkU2l6ZSxvdmVyR3Jvd25IZWFwU2l6ZSksNjU1MzYpKTt2YXIgcmVwbGFjZW1lbnQ9ZW1zY3JpcHRlbl9yZWFsbG9jX2J1ZmZlcihuZXdTaXplKTtpZihyZXBsYWNlbWVudCl7cmV0dXJuIHRydWV9fXJldHVybiBmYWxzZX12YXIgU1lTQ0FMTFM9e21hcHBpbmdzOnt9LGJ1ZmZlcnM6W251bGwsW10sW11dLHByaW50Q2hhcjpmdW5jdGlvbihzdHJlYW0sY3Vycil7dmFyIGJ1ZmZlcj1TWVNDQUxMUy5idWZmZXJzW3N0cmVhbV07aWYoY3Vycj09PTB8fGN1cnI9PT0xMCl7KHN0cmVhbT09PTE/b3V0OmVycikoVVRGOEFycmF5VG9TdHJpbmcoYnVmZmVyLDApKTtidWZmZXIubGVuZ3RoPTB9ZWxzZXtidWZmZXIucHVzaChjdXJyKX19LHZhcmFyZ3M6dW5kZWZpbmVkLGdldDpmdW5jdGlvbigpe1NZU0NBTExTLnZhcmFyZ3MrPTQ7dmFyIHJldD1IRUFQMzJbU1lTQ0FMTFMudmFyYXJncy00Pj4yXTtyZXR1cm4gcmV0fSxnZXRTdHI6ZnVuY3Rpb24ocHRyKXt2YXIgcmV0PVVURjhUb1N0cmluZyhwdHIpO3JldHVybiByZXR9LGdldDY0OmZ1bmN0aW9uKGxvdyxoaWdoKXtyZXR1cm4gbG93fX07ZnVuY3Rpb24gX2ZkX2Nsb3NlKGZkKXtyZXR1cm4gMH1mdW5jdGlvbiBfZmRfc2VlayhmZCxvZmZzZXRfbG93LG9mZnNldF9oaWdoLHdoZW5jZSxuZXdPZmZzZXQpe31mdW5jdGlvbiBfZmRfd3JpdGUoZmQsaW92LGlvdmNudCxwbnVtKXt2YXIgbnVtPTA7Zm9yKHZhciBpPTA7aTxpb3ZjbnQ7aSsrKXt2YXIgcHRyPUhFQVAzMltpb3YraSo4Pj4yXTt2YXIgbGVuPUhFQVAzMltpb3YrKGkqOCs0KT4+Ml07Zm9yKHZhciBqPTA7ajxsZW47aisrKXtTWVNDQUxMUy5wcmludENoYXIoZmQsSEVBUFU4W3B0citqXSl9bnVtKz1sZW59SEVBUDMyW3BudW0+PjJdPW51bTtyZXR1cm4gMH1mdW5jdGlvbiBfcHRocmVhZF9jcmVhdGUoKXtyZXR1cm4gNn1mdW5jdGlvbiBzZXRFcnJObyh2YWx1ZSl7SEVBUDMyW19fX2Vycm5vX2xvY2F0aW9uKCk+PjJdPXZhbHVlO3JldHVybiB2YWx1ZX1mdW5jdGlvbiBfc3lzY29uZihuYW1lKXtzd2l0Y2gobmFtZSl7Y2FzZSAzMDpyZXR1cm4gMTYzODQ7Y2FzZSA4NTp2YXIgbWF4SGVhcFNpemU9MjE0NzQ4MzY0ODtyZXR1cm4gbWF4SGVhcFNpemUvMTYzODQ7Y2FzZSAxMzI6Y2FzZSAxMzM6Y2FzZSAxMjpjYXNlIDEzNzpjYXNlIDEzODpjYXNlIDE1OmNhc2UgMjM1OmNhc2UgMTY6Y2FzZSAxNzpjYXNlIDE4OmNhc2UgMTk6Y2FzZSAyMDpjYXNlIDE0OTpjYXNlIDEzOmNhc2UgMTA6Y2FzZSAyMzY6Y2FzZSAxNTM6Y2FzZSA5OmNhc2UgMjE6Y2FzZSAyMjpjYXNlIDE1OTpjYXNlIDE1NDpjYXNlIDE0OmNhc2UgNzc6Y2FzZSA3ODpjYXNlIDEzOTpjYXNlIDgyOmNhc2UgNjg6Y2FzZSA2NzpjYXNlIDE2NDpjYXNlIDExOmNhc2UgMjk6Y2FzZSA0NzpjYXNlIDQ4OmNhc2UgOTU6Y2FzZSA1MjpjYXNlIDUxOmNhc2UgNDY6cmV0dXJuIDIwMDgwOTtjYXNlIDI3OmNhc2UgMjQ2OmNhc2UgMTI3OmNhc2UgMTI4OmNhc2UgMjM6Y2FzZSAyNDpjYXNlIDE2MDpjYXNlIDE2MTpjYXNlIDE4MTpjYXNlIDE4MjpjYXNlIDI0MjpjYXNlIDE4MzpjYXNlIDE4NDpjYXNlIDI0MzpjYXNlIDI0NDpjYXNlIDI0NTpjYXNlIDE2NTpjYXNlIDE3ODpjYXNlIDE3OTpjYXNlIDQ5OmNhc2UgNTA6Y2FzZSAxNjg6Y2FzZSAxNjk6Y2FzZSAxNzU6Y2FzZSAxNzA6Y2FzZSAxNzE6Y2FzZSAxNzI6Y2FzZSA5NzpjYXNlIDc2OmNhc2UgMzI6Y2FzZSAxNzM6Y2FzZSAzNTpjYXNlIDgwOmNhc2UgODE6Y2FzZSA3OTpyZXR1cm4tMTtjYXNlIDE3NjpjYXNlIDE3NzpjYXNlIDc6Y2FzZSAxNTU6Y2FzZSA4OmNhc2UgMTU3OmNhc2UgMTI1OmNhc2UgMTI2OmNhc2UgOTI6Y2FzZSA5MzpjYXNlIDEyOTpjYXNlIDEzMDpjYXNlIDEzMTpjYXNlIDk0OmNhc2UgOTE6cmV0dXJuIDE7Y2FzZSA3NDpjYXNlIDYwOmNhc2UgNjk6Y2FzZSA3MDpjYXNlIDQ6cmV0dXJuIDEwMjQ7Y2FzZSAzMTpjYXNlIDQyOmNhc2UgNzI6cmV0dXJuIDMyO2Nhc2UgODc6Y2FzZSAyNjpjYXNlIDMzOnJldHVybiAyMTQ3NDgzNjQ3O2Nhc2UgMzQ6Y2FzZSAxOnJldHVybiA0NzgzOTtjYXNlIDM4OmNhc2UgMzY6cmV0dXJuIDk5O2Nhc2UgNDM6Y2FzZSAzNzpyZXR1cm4gMjA0ODtjYXNlIDA6cmV0dXJuIDIwOTcxNTI7Y2FzZSAzOnJldHVybiA2NTUzNjtjYXNlIDI4OnJldHVybiAzMjc2ODtjYXNlIDQ0OnJldHVybiAzMjc2NztjYXNlIDc1OnJldHVybiAxNjM4NDtjYXNlIDM5OnJldHVybiAxZTM7Y2FzZSA4OTpyZXR1cm4gNzAwO2Nhc2UgNzE6cmV0dXJuIDI1NjtjYXNlIDQwOnJldHVybiAyNTU7Y2FzZSAyOnJldHVybiAxMDA7Y2FzZSAxODA6cmV0dXJuIDY0O2Nhc2UgMjU6cmV0dXJuIDIwO2Nhc2UgNTpyZXR1cm4gMTY7Y2FzZSA2OnJldHVybiA2O2Nhc2UgNzM6cmV0dXJuIDQ7Y2FzZSA4NDp7aWYodHlwZW9mIG5hdmlnYXRvcj09PVwib2JqZWN0XCIpcmV0dXJuIG5hdmlnYXRvcltcImhhcmR3YXJlQ29uY3VycmVuY3lcIl18fDE7cmV0dXJuIDF9fXNldEVyck5vKDI4KTtyZXR1cm4tMX12YXIgYXNtTGlicmFyeUFyZz17XCJhXCI6X2Fib3J0LFwiZFwiOl9lbXNjcmlwdGVuX21lbWNweV9iaWcsXCJlXCI6X2Vtc2NyaXB0ZW5fcmVzaXplX2hlYXAsXCJmXCI6X2ZkX2Nsb3NlLFwiY1wiOl9mZF9zZWVrLFwiYlwiOl9mZF93cml0ZSxcImdcIjpfcHRocmVhZF9jcmVhdGUsXCJoXCI6X3N5c2NvbmZ9O3ZhciBhc209Y3JlYXRlV2FzbSgpO3ZhciBfX193YXNtX2NhbGxfY3RvcnM9TW9kdWxlW1wiX19fd2FzbV9jYWxsX2N0b3JzXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9fX3dhc21fY2FsbF9jdG9ycz1Nb2R1bGVbXCJfX193YXNtX2NhbGxfY3RvcnNcIl09TW9kdWxlW1wiYXNtXCJdW1wialwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX2luaXQ9TW9kdWxlW1wiX2luaXRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX2luaXQ9TW9kdWxlW1wiX2luaXRcIl09TW9kdWxlW1wiYXNtXCJdW1wia1wiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX3JlZ2lzdGVyX3RlbnNvcj1Nb2R1bGVbXCJfcmVnaXN0ZXJfdGVuc29yXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9yZWdpc3Rlcl90ZW5zb3I9TW9kdWxlW1wiX3JlZ2lzdGVyX3RlbnNvclwiXT1Nb2R1bGVbXCJhc21cIl1bXCJsXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfZGlzcG9zZV9kYXRhPU1vZHVsZVtcIl9kaXNwb3NlX2RhdGFcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX2Rpc3Bvc2VfZGF0YT1Nb2R1bGVbXCJfZGlzcG9zZV9kYXRhXCJdPU1vZHVsZVtcImFzbVwiXVtcIm1cIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9kaXNwb3NlPU1vZHVsZVtcIl9kaXNwb3NlXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9kaXNwb3NlPU1vZHVsZVtcIl9kaXNwb3NlXCJdPU1vZHVsZVtcImFzbVwiXVtcIm5cIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9BYnM9TW9kdWxlW1wiX0Fic1wiXT1mdW5jdGlvbigpe3JldHVybihfQWJzPU1vZHVsZVtcIl9BYnNcIl09TW9kdWxlW1wiYXNtXCJdW1wicFwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0FkZD1Nb2R1bGVbXCJfQWRkXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9BZGQ9TW9kdWxlW1wiX0FkZFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJxXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQWRkTj1Nb2R1bGVbXCJfQWRkTlwiXT1mdW5jdGlvbigpe3JldHVybihfQWRkTj1Nb2R1bGVbXCJfQWRkTlwiXT1Nb2R1bGVbXCJhc21cIl1bXCJyXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQWxsPU1vZHVsZVtcIl9BbGxcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0FsbD1Nb2R1bGVbXCJfQWxsXCJdPU1vZHVsZVtcImFzbVwiXVtcInNcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Bbnk9TW9kdWxlW1wiX0FueVwiXT1mdW5jdGlvbigpe3JldHVybihfQW55PU1vZHVsZVtcIl9BbnlcIl09TW9kdWxlW1wiYXNtXCJdW1widFwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0FyZ01heD1Nb2R1bGVbXCJfQXJnTWF4XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9BcmdNYXg9TW9kdWxlW1wiX0FyZ01heFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJ1XCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQXZnUG9vbD1Nb2R1bGVbXCJfQXZnUG9vbFwiXT1mdW5jdGlvbigpe3JldHVybihfQXZnUG9vbD1Nb2R1bGVbXCJfQXZnUG9vbFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJ2XCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQmF0Y2hNYXRNdWw9TW9kdWxlW1wiX0JhdGNoTWF0TXVsXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9CYXRjaE1hdE11bD1Nb2R1bGVbXCJfQmF0Y2hNYXRNdWxcIl09TW9kdWxlW1wiYXNtXCJdW1wid1wiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0NlaWw9TW9kdWxlW1wiX0NlaWxcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0NlaWw9TW9kdWxlW1wiX0NlaWxcIl09TW9kdWxlW1wiYXNtXCJdW1wieFwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0NsaXBCeVZhbHVlPU1vZHVsZVtcIl9DbGlwQnlWYWx1ZVwiXT1mdW5jdGlvbigpe3JldHVybihfQ2xpcEJ5VmFsdWU9TW9kdWxlW1wiX0NsaXBCeVZhbHVlXCJdPU1vZHVsZVtcImFzbVwiXVtcInlcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Db252MkQ9TW9kdWxlW1wiX0NvbnYyRFwiXT1mdW5jdGlvbigpe3JldHVybihfQ29udjJEPU1vZHVsZVtcIl9Db252MkRcIl09TW9kdWxlW1wiYXNtXCJdW1wielwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0NvbnYyREJhY2twcm9wSW5wdXQ9TW9kdWxlW1wiX0NvbnYyREJhY2twcm9wSW5wdXRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0NvbnYyREJhY2twcm9wSW5wdXQ9TW9kdWxlW1wiX0NvbnYyREJhY2twcm9wSW5wdXRcIl09TW9kdWxlW1wiYXNtXCJdW1wiQVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0Nvcz1Nb2R1bGVbXCJfQ29zXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Db3M9TW9kdWxlW1wiX0Nvc1wiXT1Nb2R1bGVbXCJhc21cIl1bXCJCXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQ29zaD1Nb2R1bGVbXCJfQ29zaFwiXT1mdW5jdGlvbigpe3JldHVybihfQ29zaD1Nb2R1bGVbXCJfQ29zaFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJDXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQ3JvcEFuZFJlc2l6ZT1Nb2R1bGVbXCJfQ3JvcEFuZFJlc2l6ZVwiXT1mdW5jdGlvbigpe3JldHVybihfQ3JvcEFuZFJlc2l6ZT1Nb2R1bGVbXCJfQ3JvcEFuZFJlc2l6ZVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJEXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQ3Vtc3VtPU1vZHVsZVtcIl9DdW1zdW1cIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0N1bXN1bT1Nb2R1bGVbXCJfQ3Vtc3VtXCJdPU1vZHVsZVtcImFzbVwiXVtcIkVcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9EZXB0aFRvU3BhY2U9TW9kdWxlW1wiX0RlcHRoVG9TcGFjZVwiXT1mdW5jdGlvbigpe3JldHVybihfRGVwdGhUb1NwYWNlPU1vZHVsZVtcIl9EZXB0aFRvU3BhY2VcIl09TW9kdWxlW1wiYXNtXCJdW1wiRlwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0RlcHRod2lzZUNvbnYyZE5hdGl2ZT1Nb2R1bGVbXCJfRGVwdGh3aXNlQ29udjJkTmF0aXZlXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9EZXB0aHdpc2VDb252MmROYXRpdmU9TW9kdWxlW1wiX0RlcHRod2lzZUNvbnYyZE5hdGl2ZVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJHXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfRXF1YWw9TW9kdWxlW1wiX0VxdWFsXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9FcXVhbD1Nb2R1bGVbXCJfRXF1YWxcIl09TW9kdWxlW1wiYXNtXCJdW1wiSFwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0V4cD1Nb2R1bGVbXCJfRXhwXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9FeHA9TW9kdWxlW1wiX0V4cFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJJXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfRmxpcExlZnRSaWdodD1Nb2R1bGVbXCJfRmxpcExlZnRSaWdodFwiXT1mdW5jdGlvbigpe3JldHVybihfRmxpcExlZnRSaWdodD1Nb2R1bGVbXCJfRmxpcExlZnRSaWdodFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJKXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfRmxvb3I9TW9kdWxlW1wiX0Zsb29yXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9GbG9vcj1Nb2R1bGVbXCJfRmxvb3JcIl09TW9kdWxlW1wiYXNtXCJdW1wiS1wiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0Zsb29yRGl2PU1vZHVsZVtcIl9GbG9vckRpdlwiXT1mdW5jdGlvbigpe3JldHVybihfRmxvb3JEaXY9TW9kdWxlW1wiX0Zsb29yRGl2XCJdPU1vZHVsZVtcImFzbVwiXVtcIkxcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9GdXNlZEJhdGNoTm9ybT1Nb2R1bGVbXCJfRnVzZWRCYXRjaE5vcm1cIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0Z1c2VkQmF0Y2hOb3JtPU1vZHVsZVtcIl9GdXNlZEJhdGNoTm9ybVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJNXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfRnVzZWRDb252MkQ9TW9kdWxlW1wiX0Z1c2VkQ29udjJEXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9GdXNlZENvbnYyRD1Nb2R1bGVbXCJfRnVzZWRDb252MkRcIl09TW9kdWxlW1wiYXNtXCJdW1wiTlwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0Z1c2VkRGVwdGh3aXNlQ29udjJEPU1vZHVsZVtcIl9GdXNlZERlcHRod2lzZUNvbnYyRFwiXT1mdW5jdGlvbigpe3JldHVybihfRnVzZWREZXB0aHdpc2VDb252MkQ9TW9kdWxlW1wiX0Z1c2VkRGVwdGh3aXNlQ29udjJEXCJdPU1vZHVsZVtcImFzbVwiXVtcIk9cIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9HYXRoZXI9TW9kdWxlW1wiX0dhdGhlclwiXT1mdW5jdGlvbigpe3JldHVybihfR2F0aGVyPU1vZHVsZVtcIl9HYXRoZXJcIl09TW9kdWxlW1wiYXNtXCJdW1wiUFwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0dhdGhlck5kPU1vZHVsZVtcIl9HYXRoZXJOZFwiXT1mdW5jdGlvbigpe3JldHVybihfR2F0aGVyTmQ9TW9kdWxlW1wiX0dhdGhlck5kXCJdPU1vZHVsZVtcImFzbVwiXVtcIlFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9HcmVhdGVyPU1vZHVsZVtcIl9HcmVhdGVyXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9HcmVhdGVyPU1vZHVsZVtcIl9HcmVhdGVyXCJdPU1vZHVsZVtcImFzbVwiXVtcIlJcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9HcmVhdGVyRXF1YWw9TW9kdWxlW1wiX0dyZWF0ZXJFcXVhbFwiXT1mdW5jdGlvbigpe3JldHVybihfR3JlYXRlckVxdWFsPU1vZHVsZVtcIl9HcmVhdGVyRXF1YWxcIl09TW9kdWxlW1wiYXNtXCJdW1wiU1wiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0xlYWt5UmVsdT1Nb2R1bGVbXCJfTGVha3lSZWx1XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9MZWFreVJlbHU9TW9kdWxlW1wiX0xlYWt5UmVsdVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJUXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTGVzcz1Nb2R1bGVbXCJfTGVzc1wiXT1mdW5jdGlvbigpe3JldHVybihfTGVzcz1Nb2R1bGVbXCJfTGVzc1wiXT1Nb2R1bGVbXCJhc21cIl1bXCJVXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTGVzc0VxdWFsPU1vZHVsZVtcIl9MZXNzRXF1YWxcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0xlc3NFcXVhbD1Nb2R1bGVbXCJfTGVzc0VxdWFsXCJdPU1vZHVsZVtcImFzbVwiXVtcIlZcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Mb2c9TW9kdWxlW1wiX0xvZ1wiXT1mdW5jdGlvbigpe3JldHVybihfTG9nPU1vZHVsZVtcIl9Mb2dcIl09TW9kdWxlW1wiYXNtXCJdW1wiV1wiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0xvZ2ljYWxBbmQ9TW9kdWxlW1wiX0xvZ2ljYWxBbmRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0xvZ2ljYWxBbmQ9TW9kdWxlW1wiX0xvZ2ljYWxBbmRcIl09TW9kdWxlW1wiYXNtXCJdW1wiWFwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX01heD1Nb2R1bGVbXCJfTWF4XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9NYXg9TW9kdWxlW1wiX01heFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJZXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTWF4UG9vbD1Nb2R1bGVbXCJfTWF4UG9vbFwiXT1mdW5jdGlvbigpe3JldHVybihfTWF4UG9vbD1Nb2R1bGVbXCJfTWF4UG9vbFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJaXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTWF4aW11bT1Nb2R1bGVbXCJfTWF4aW11bVwiXT1mdW5jdGlvbigpe3JldHVybihfTWF4aW11bT1Nb2R1bGVbXCJfTWF4aW11bVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJfXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTWVhbj1Nb2R1bGVbXCJfTWVhblwiXT1mdW5jdGlvbigpe3JldHVybihfTWVhbj1Nb2R1bGVbXCJfTWVhblwiXT1Nb2R1bGVbXCJhc21cIl1bXCIkXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTWluPU1vZHVsZVtcIl9NaW5cIl09ZnVuY3Rpb24oKXtyZXR1cm4oX01pbj1Nb2R1bGVbXCJfTWluXCJdPU1vZHVsZVtcImFzbVwiXVtcImFhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTWluaW11bT1Nb2R1bGVbXCJfTWluaW11bVwiXT1mdW5jdGlvbigpe3JldHVybihfTWluaW11bT1Nb2R1bGVbXCJfTWluaW11bVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJiYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX01pcnJvclBhZD1Nb2R1bGVbXCJfTWlycm9yUGFkXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9NaXJyb3JQYWQ9TW9kdWxlW1wiX01pcnJvclBhZFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJjYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX011bHRpcGx5PU1vZHVsZVtcIl9NdWx0aXBseVwiXT1mdW5jdGlvbigpe3JldHVybihfTXVsdGlwbHk9TW9kdWxlW1wiX011bHRpcGx5XCJdPU1vZHVsZVtcImFzbVwiXVtcImRhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTmVnPU1vZHVsZVtcIl9OZWdcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX05lZz1Nb2R1bGVbXCJfTmVnXCJdPU1vZHVsZVtcImFzbVwiXVtcImVhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTm9uTWF4U3VwcHJlc3Npb25WMz1Nb2R1bGVbXCJfTm9uTWF4U3VwcHJlc3Npb25WM1wiXT1mdW5jdGlvbigpe3JldHVybihfTm9uTWF4U3VwcHJlc3Npb25WMz1Nb2R1bGVbXCJfTm9uTWF4U3VwcHJlc3Npb25WM1wiXT1Nb2R1bGVbXCJhc21cIl1bXCJmYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX05vbk1heFN1cHByZXNzaW9uVjQ9TW9kdWxlW1wiX05vbk1heFN1cHByZXNzaW9uVjRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX05vbk1heFN1cHByZXNzaW9uVjQ9TW9kdWxlW1wiX05vbk1heFN1cHByZXNzaW9uVjRcIl09TW9kdWxlW1wiYXNtXCJdW1wiZ2FcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Ob25NYXhTdXBwcmVzc2lvblY1PU1vZHVsZVtcIl9Ob25NYXhTdXBwcmVzc2lvblY1XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Ob25NYXhTdXBwcmVzc2lvblY1PU1vZHVsZVtcIl9Ob25NYXhTdXBwcmVzc2lvblY1XCJdPU1vZHVsZVtcImFzbVwiXVtcImhhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTm90RXF1YWw9TW9kdWxlW1wiX05vdEVxdWFsXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Ob3RFcXVhbD1Nb2R1bGVbXCJfTm90RXF1YWxcIl09TW9kdWxlW1wiYXNtXCJdW1wiaWFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9PbmVIb3Q9TW9kdWxlW1wiX09uZUhvdFwiXT1mdW5jdGlvbigpe3JldHVybihfT25lSG90PU1vZHVsZVtcIl9PbmVIb3RcIl09TW9kdWxlW1wiYXNtXCJdW1wiamFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9QYWRWMj1Nb2R1bGVbXCJfUGFkVjJcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1BhZFYyPU1vZHVsZVtcIl9QYWRWMlwiXT1Nb2R1bGVbXCJhc21cIl1bXCJrYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1Bvdz1Nb2R1bGVbXCJfUG93XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Qb3c9TW9kdWxlW1wiX1Bvd1wiXT1Nb2R1bGVbXCJhc21cIl1bXCJsYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1ByZWx1PU1vZHVsZVtcIl9QcmVsdVwiXT1mdW5jdGlvbigpe3JldHVybihfUHJlbHU9TW9kdWxlW1wiX1ByZWx1XCJdPU1vZHVsZVtcImFzbVwiXVtcIm1hXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfUHJvZD1Nb2R1bGVbXCJfUHJvZFwiXT1mdW5jdGlvbigpe3JldHVybihfUHJvZD1Nb2R1bGVbXCJfUHJvZFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJuYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1JlYWxEaXY9TW9kdWxlW1wiX1JlYWxEaXZcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1JlYWxEaXY9TW9kdWxlW1wiX1JlYWxEaXZcIl09TW9kdWxlW1wiYXNtXCJdW1wib2FcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9SZWx1PU1vZHVsZVtcIl9SZWx1XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9SZWx1PU1vZHVsZVtcIl9SZWx1XCJdPU1vZHVsZVtcImFzbVwiXVtcInBhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfUmVsdTY9TW9kdWxlW1wiX1JlbHU2XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9SZWx1Nj1Nb2R1bGVbXCJfUmVsdTZcIl09TW9kdWxlW1wiYXNtXCJdW1wicWFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9SZXNpemVCaWxpbmVhcj1Nb2R1bGVbXCJfUmVzaXplQmlsaW5lYXJcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1Jlc2l6ZUJpbGluZWFyPU1vZHVsZVtcIl9SZXNpemVCaWxpbmVhclwiXT1Nb2R1bGVbXCJhc21cIl1bXCJyYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1JldmVyc2U9TW9kdWxlW1wiX1JldmVyc2VcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1JldmVyc2U9TW9kdWxlW1wiX1JldmVyc2VcIl09TW9kdWxlW1wiYXNtXCJdW1wic2FcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Sb3RhdGVXaXRoT2Zmc2V0PU1vZHVsZVtcIl9Sb3RhdGVXaXRoT2Zmc2V0XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Sb3RhdGVXaXRoT2Zmc2V0PU1vZHVsZVtcIl9Sb3RhdGVXaXRoT2Zmc2V0XCJdPU1vZHVsZVtcImFzbVwiXVtcInRhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfUm91bmQ9TW9kdWxlW1wiX1JvdW5kXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Sb3VuZD1Nb2R1bGVbXCJfUm91bmRcIl09TW9kdWxlW1wiYXNtXCJdW1widWFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Sc3FydD1Nb2R1bGVbXCJfUnNxcnRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1JzcXJ0PU1vZHVsZVtcIl9Sc3FydFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJ2YVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1NjYXR0ZXJOZD1Nb2R1bGVbXCJfU2NhdHRlck5kXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9TY2F0dGVyTmQ9TW9kdWxlW1wiX1NjYXR0ZXJOZFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJ3YVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1NlbGVjdFYyPU1vZHVsZVtcIl9TZWxlY3RWMlwiXT1mdW5jdGlvbigpe3JldHVybihfU2VsZWN0VjI9TW9kdWxlW1wiX1NlbGVjdFYyXCJdPU1vZHVsZVtcImFzbVwiXVtcInhhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfU2lnbW9pZD1Nb2R1bGVbXCJfU2lnbW9pZFwiXT1mdW5jdGlvbigpe3JldHVybihfU2lnbW9pZD1Nb2R1bGVbXCJfU2lnbW9pZFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJ5YVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1Npbj1Nb2R1bGVbXCJfU2luXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9TaW49TW9kdWxlW1wiX1NpblwiXT1Nb2R1bGVbXCJhc21cIl1bXCJ6YVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1NvZnRtYXg9TW9kdWxlW1wiX1NvZnRtYXhcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1NvZnRtYXg9TW9kdWxlW1wiX1NvZnRtYXhcIl09TW9kdWxlW1wiYXNtXCJdW1wiQWFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9TcXJ0PU1vZHVsZVtcIl9TcXJ0XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9TcXJ0PU1vZHVsZVtcIl9TcXJ0XCJdPU1vZHVsZVtcImFzbVwiXVtcIkJhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfU3F1YXJlPU1vZHVsZVtcIl9TcXVhcmVcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1NxdWFyZT1Nb2R1bGVbXCJfU3F1YXJlXCJdPU1vZHVsZVtcImFzbVwiXVtcIkNhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfU3F1YXJlZERpZmZlcmVuY2U9TW9kdWxlW1wiX1NxdWFyZWREaWZmZXJlbmNlXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9TcXVhcmVkRGlmZmVyZW5jZT1Nb2R1bGVbXCJfU3F1YXJlZERpZmZlcmVuY2VcIl09TW9kdWxlW1wiYXNtXCJdW1wiRGFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9TdGVwPU1vZHVsZVtcIl9TdGVwXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9TdGVwPU1vZHVsZVtcIl9TdGVwXCJdPU1vZHVsZVtcImFzbVwiXVtcIkVhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfU3RyaWRlZFNsaWNlPU1vZHVsZVtcIl9TdHJpZGVkU2xpY2VcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1N0cmlkZWRTbGljZT1Nb2R1bGVbXCJfU3RyaWRlZFNsaWNlXCJdPU1vZHVsZVtcImFzbVwiXVtcIkZhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfU3ViPU1vZHVsZVtcIl9TdWJcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1N1Yj1Nb2R1bGVbXCJfU3ViXCJdPU1vZHVsZVtcImFzbVwiXVtcIkdhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfU3VtPU1vZHVsZVtcIl9TdW1cIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1N1bT1Nb2R1bGVbXCJfU3VtXCJdPU1vZHVsZVtcImFzbVwiXVtcIkhhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfVGFuPU1vZHVsZVtcIl9UYW5cIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1Rhbj1Nb2R1bGVbXCJfVGFuXCJdPU1vZHVsZVtcImFzbVwiXVtcIklhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfVGFuaD1Nb2R1bGVbXCJfVGFuaFwiXT1mdW5jdGlvbigpe3JldHVybihfVGFuaD1Nb2R1bGVbXCJfVGFuaFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJKYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1RpbGU9TW9kdWxlW1wiX1RpbGVcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1RpbGU9TW9kdWxlW1wiX1RpbGVcIl09TW9kdWxlW1wiYXNtXCJdW1wiS2FcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Ub3BLPU1vZHVsZVtcIl9Ub3BLXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Ub3BLPU1vZHVsZVtcIl9Ub3BLXCJdPU1vZHVsZVtcImFzbVwiXVtcIkxhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfVHJhbnNmb3JtPU1vZHVsZVtcIl9UcmFuc2Zvcm1cIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1RyYW5zZm9ybT1Nb2R1bGVbXCJfVHJhbnNmb3JtXCJdPU1vZHVsZVtcImFzbVwiXVtcIk1hXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfVHJhbnNwb3NlPU1vZHVsZVtcIl9UcmFuc3Bvc2VcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1RyYW5zcG9zZT1Nb2R1bGVbXCJfVHJhbnNwb3NlXCJdPU1vZHVsZVtcImFzbVwiXVtcIk5hXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfX0Z1c2VkTWF0TXVsPU1vZHVsZVtcIl9fRnVzZWRNYXRNdWxcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX19GdXNlZE1hdE11bD1Nb2R1bGVbXCJfX0Z1c2VkTWF0TXVsXCJdPU1vZHVsZVtcImFzbVwiXVtcIk9hXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfbWFsbG9jPU1vZHVsZVtcIl9tYWxsb2NcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX21hbGxvYz1Nb2R1bGVbXCJfbWFsbG9jXCJdPU1vZHVsZVtcImFzbVwiXVtcIlBhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfZnJlZT1Nb2R1bGVbXCJfZnJlZVwiXT1mdW5jdGlvbigpe3JldHVybihfZnJlZT1Nb2R1bGVbXCJfZnJlZVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJRYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX19fZXJybm9fbG9jYXRpb249TW9kdWxlW1wiX19fZXJybm9fbG9jYXRpb25cIl09ZnVuY3Rpb24oKXtyZXR1cm4oX19fZXJybm9fbG9jYXRpb249TW9kdWxlW1wiX19fZXJybm9fbG9jYXRpb25cIl09TW9kdWxlW1wiYXNtXCJdW1wiUmFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIHN0YWNrU2F2ZT1Nb2R1bGVbXCJzdGFja1NhdmVcIl09ZnVuY3Rpb24oKXtyZXR1cm4oc3RhY2tTYXZlPU1vZHVsZVtcInN0YWNrU2F2ZVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJTYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgc3RhY2tSZXN0b3JlPU1vZHVsZVtcInN0YWNrUmVzdG9yZVwiXT1mdW5jdGlvbigpe3JldHVybihzdGFja1Jlc3RvcmU9TW9kdWxlW1wic3RhY2tSZXN0b3JlXCJdPU1vZHVsZVtcImFzbVwiXVtcIlRhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBzdGFja0FsbG9jPU1vZHVsZVtcInN0YWNrQWxsb2NcIl09ZnVuY3Rpb24oKXtyZXR1cm4oc3RhY2tBbGxvYz1Nb2R1bGVbXCJzdGFja0FsbG9jXCJdPU1vZHVsZVtcImFzbVwiXVtcIlVhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O01vZHVsZVtcImN3cmFwXCJdPWN3cmFwO3ZhciBjYWxsZWRSdW47ZnVuY3Rpb24gRXhpdFN0YXR1cyhzdGF0dXMpe3RoaXMubmFtZT1cIkV4aXRTdGF0dXNcIjt0aGlzLm1lc3NhZ2U9XCJQcm9ncmFtIHRlcm1pbmF0ZWQgd2l0aCBleGl0KFwiK3N0YXR1cytcIilcIjt0aGlzLnN0YXR1cz1zdGF0dXN9ZGVwZW5kZW5jaWVzRnVsZmlsbGVkPWZ1bmN0aW9uIHJ1bkNhbGxlcigpe2lmKCFjYWxsZWRSdW4pcnVuKCk7aWYoIWNhbGxlZFJ1bilkZXBlbmRlbmNpZXNGdWxmaWxsZWQ9cnVuQ2FsbGVyfTtmdW5jdGlvbiBydW4oYXJncyl7YXJncz1hcmdzfHxhcmd1bWVudHNfO2lmKHJ1bkRlcGVuZGVuY2llcz4wKXtyZXR1cm59cHJlUnVuKCk7aWYocnVuRGVwZW5kZW5jaWVzPjApe3JldHVybn1mdW5jdGlvbiBkb1J1bigpe2lmKGNhbGxlZFJ1bilyZXR1cm47Y2FsbGVkUnVuPXRydWU7TW9kdWxlW1wiY2FsbGVkUnVuXCJdPXRydWU7aWYoQUJPUlQpcmV0dXJuO2luaXRSdW50aW1lKCk7cHJlTWFpbigpO3JlYWR5UHJvbWlzZVJlc29sdmUoTW9kdWxlKTtpZihNb2R1bGVbXCJvblJ1bnRpbWVJbml0aWFsaXplZFwiXSlNb2R1bGVbXCJvblJ1bnRpbWVJbml0aWFsaXplZFwiXSgpO3Bvc3RSdW4oKX1pZihNb2R1bGVbXCJzZXRTdGF0dXNcIl0pe01vZHVsZVtcInNldFN0YXR1c1wiXShcIlJ1bm5pbmcuLi5cIik7c2V0VGltZW91dChmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtNb2R1bGVbXCJzZXRTdGF0dXNcIl0oXCJcIil9LDEpO2RvUnVuKCl9LDEpfWVsc2V7ZG9SdW4oKX19TW9kdWxlW1wicnVuXCJdPXJ1bjtpZihNb2R1bGVbXCJwcmVJbml0XCJdKXtpZih0eXBlb2YgTW9kdWxlW1wicHJlSW5pdFwiXT09XCJmdW5jdGlvblwiKU1vZHVsZVtcInByZUluaXRcIl09W01vZHVsZVtcInByZUluaXRcIl1dO3doaWxlKE1vZHVsZVtcInByZUluaXRcIl0ubGVuZ3RoPjApe01vZHVsZVtcInByZUluaXRcIl0ucG9wKCkoKX19cnVuKCk7XG5cblxuICByZXR1cm4gV2FzbUJhY2tlbmRNb2R1bGUucmVhZHlcbn1cbik7XG59KSgpO1xuaWYgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JylcbiAgbW9kdWxlLmV4cG9ydHMgPSBXYXNtQmFja2VuZE1vZHVsZTtcbmVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lWydhbWQnXSlcbiAgZGVmaW5lKFtdLCBmdW5jdGlvbigpIHsgcmV0dXJuIFdhc21CYWNrZW5kTW9kdWxlOyB9KTtcbmVsc2UgaWYgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JylcbiAgZXhwb3J0c1tcIldhc21CYWNrZW5kTW9kdWxlXCJdID0gV2FzbUJhY2tlbmRNb2R1bGU7XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5leHBvcnQgY2xhc3MgQWRkTlByb2dyYW0ge1xuICAgIGNvbnN0cnVjdG9yKG91dHB1dFNoYXBlLCBzaGFwZXMpIHtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IFtdO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGU7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IHNoYXBlcy5tYXAoKF8sIGkpID0+IGBUJHtpfWApO1xuICAgICAgICBjb25zdCBzbmlwcGV0cyA9IFtdO1xuICAgICAgICAvLyBHZXQgdGFyZ2V0IGVsZW1lbnRzIGZyb20gZXZlcnkgaW5wdXQgdGVuc29yLlxuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMuZm9yRWFjaCh2YXJpYWJsZSA9PiB7XG4gICAgICAgICAgICBzbmlwcGV0cy5wdXNoKGBmbG9hdCB2JHt2YXJpYWJsZX0gPSBnZXQke3ZhcmlhYmxlfUF0T3V0Q29vcmRzKCk7YCk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIHN1bSBvZiBhbGwgZWxlbWVudHMuXG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbiA9IHRoaXMudmFyaWFibGVOYW1lc1xuICAgICAgICAgICAgLm1hcCh2YXJpYWJsZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYHYke3ZhcmlhYmxlfWA7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbignICsgJyk7XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICR7c25pcHBldHMuam9pbignXFxuICAgICAgICAnKX1cblxuICAgICAgICBmbG9hdCByZXN1bHQgPSAke29wZXJhdGlvbn07XG4gICAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWRkbl9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuZXhwb3J0IGNsYXNzIEFkZE5QYWNrZWRQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3RvcihvdXRwdXRTaGFwZSwgc2hhcGVzKSB7XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBbXTtcbiAgICAgICAgdGhpcy5wYWNrZWRJbnB1dHMgPSB0cnVlO1xuICAgICAgICB0aGlzLnBhY2tlZE91dHB1dCA9IHRydWU7XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gc2hhcGVzLm1hcCgoXywgaSkgPT4gYFQke2l9YCk7XG4gICAgICAgIGNvbnN0IHNuaXBwZXRzID0gW107XG4gICAgICAgIC8vIEdldCB0YXJnZXQgZWxlbWVudHMgZnJvbSBldmVyeSBpbnB1dCB0ZW5zb3IuXG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcy5mb3JFYWNoKHZhcmlhYmxlID0+IHtcbiAgICAgICAgICAgIHNuaXBwZXRzLnB1c2goYHZlYzQgdiR7dmFyaWFibGV9ID0gZ2V0JHt2YXJpYWJsZX1BdE91dENvb3JkcygpO2ApO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBzdW0gb2YgYWxsIGVsZW1lbnRzLlxuICAgICAgICBjb25zdCBvcGVyYXRpb24gPSB0aGlzLnZhcmlhYmxlTmFtZXNcbiAgICAgICAgICAgIC5tYXAodmFyaWFibGUgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGB2JHt2YXJpYWJsZX1gO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmpvaW4oJyArICcpO1xuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke3NuaXBwZXRzLmpvaW4oJ1xcbiAgICAgICAgJyl9XG5cbiAgICAgICAgdmVjNCByZXN1bHQgPSAke29wZXJhdGlvbn07XG4gICAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWRkbl9wYWNrZWRfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmV4cG9ydCBjbGFzcyBBcmdNaW5NYXhQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3RvcihyZWR1Y2VJbmZvLCBvcCwgZmlyc3RQYXNzKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICAgICAgICBjb25zdCB7IHdpbmRvd1NpemUsIGJhdGNoU2l6ZSwgb3V0U2l6ZSB9ID0gcmVkdWNlSW5mbztcbiAgICAgICAgaWYgKCFmaXJzdFBhc3MpIHtcbiAgICAgICAgICAgIHRoaXMudmFyaWFibGVOYW1lcy5wdXNoKCdiZXN0SW5kaWNlc0EnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gW2JhdGNoU2l6ZSwgb3V0U2l6ZV07XG4gICAgICAgIGNvbnN0IGNvbXBPcCA9IChvcCA9PT0gJ21heCcpID8gJz4nIDogJzwnO1xuICAgICAgICBjb25zdCBpbmRleFNuaXBwZXQgPSBmaXJzdFBhc3MgP1xuICAgICAgICAgICAgJ2luT2Zmc2V0ICsgaTsnIDpcbiAgICAgICAgICAgICdyb3VuZChnZXRCZXN0SW5kaWNlc0EoYmF0Y2gsIGluT2Zmc2V0ICsgaSkpOyc7XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWMyIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHNbMF07XG4gICAgICAgIGludCBvdXRJZHggPSBjb29yZHNbMV07XG4gICAgICAgIGludCBpbk9mZnNldCA9IG91dElkeCAqICR7d2luZG93U2l6ZX07XG5cbiAgICAgICAgaW50IGJlc3RJbmRleCA9IGluT2Zmc2V0O1xuICAgICAgICBmbG9hdCBiZXN0VmFsdWUgPSBnZXRBKGJhdGNoLCBiZXN0SW5kZXgpO1xuXG4gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgJHt3aW5kb3dTaXplfTsgaSsrKSB7XG4gICAgICAgICAgaW50IGluSWR4ID0gJHtpbmRleFNuaXBwZXR9O1xuICAgICAgICAgIGZsb2F0IGNhbmRpZGF0ZSA9IGdldEEoYmF0Y2gsIGluSWR4KTtcbiAgICAgICAgICBpZiAoY2FuZGlkYXRlICR7Y29tcE9wfSBiZXN0VmFsdWUpIHtcbiAgICAgICAgICAgIGJlc3RWYWx1ZSA9IGNhbmRpZGF0ZTtcbiAgICAgICAgICAgIGJlc3RJbmRleCA9IGluSWR4O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQoZmxvYXQoYmVzdEluZGV4KSk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hcmdtaW5tYXhfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgZ2V0Q2hhbm5lbHMgfSBmcm9tICcuL3BhY2tpbmdfdXRpbCc7XG5pbXBvcnQgeyBnZXRDb29yZHNEYXRhVHlwZSB9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcbmV4cG9ydCBjbGFzcyBBcmdNaW5NYXhQYWNrZWRQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3RvcihzaGFwZSwgd2luZG93U2l6ZSwgb3AsIGZpcnN0UGFzcykge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgICAgICAgdGhpcy5wYWNrZWRJbnB1dHMgPSB0cnVlO1xuICAgICAgICB0aGlzLnBhY2tlZE91dHB1dCA9IHRydWU7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHNoYXBlLmxlbmd0aCA+IDIsICgpID0+IGBQYWNrZWQgYXJnJHtvcC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArXG4gICAgICAgICAgICBvcC5zbGljZSgxKX0gc3VwcG9ydHMgb25seSBpbnB1dHMgd2l0aCByYW5rIGFib3ZlIDIuYCk7XG4gICAgICAgIGNvbnN0IGluU2l6ZSA9IHNoYXBlW3NoYXBlLmxlbmd0aCAtIDFdO1xuICAgICAgICBjb25zdCBvdXRTaXplID0gTWF0aC5jZWlsKGluU2l6ZSAvIHdpbmRvd1NpemUpO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gc2hhcGUuc2xpY2UoMCwgLTEpO1xuICAgICAgICBpZiAob3V0U2l6ZSA+IDEpIHtcbiAgICAgICAgICAgIHRoaXMub3V0cHV0U2hhcGUucHVzaChvdXRTaXplKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZpcnN0UGFzcykge1xuICAgICAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzLnB1c2goJ2Jlc3RJbmRpY2VzQScpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG91dFNoYXBlID0gdGhpcy5vdXRwdXRTaGFwZTtcbiAgICAgICAgY29uc3QgcmFuayA9IG91dFNoYXBlLmxlbmd0aDtcbiAgICAgICAgY29uc3QgZHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShyYW5rKTtcbiAgICAgICAgY29uc3QgY29vcmRzID0gZ2V0Q2hhbm5lbHMoJ2Nvb3JkcycsIHJhbmspO1xuICAgICAgICBsZXQgc291cmNlTG9jU2V0dXA7XG4gICAgICAgIGxldCBzb3VyY2VSYW5rO1xuICAgICAgICBpZiAob3V0U2l6ZSA9PT0gMSkge1xuICAgICAgICAgICAgc291cmNlUmFuayA9IHJhbmsgKyAxO1xuICAgICAgICAgICAgY29uc3Qgc291cmNlTG9jRFR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShzb3VyY2VSYW5rKTtcbiAgICAgICAgICAgIHNvdXJjZUxvY1NldHVwID0gYFxuICAgICAgICAke3NvdXJjZUxvY0RUeXBlfSBzb3VyY2VMb2NSID0gJHtzb3VyY2VMb2NEVHlwZX0oJHtjb29yZHMuam9pbigpfSwgMCk7XG4gICAgICAgICsrJHtjb29yZHNbcmFuayAtIDFdfTtcbiAgICAgICAgJHtzb3VyY2VMb2NEVHlwZX0gc291cmNlTG9jRyA9ICR7c291cmNlTG9jRFR5cGV9KCR7Y29vcmRzLmpvaW4oKX0sIDApO1xuICAgICAgICArKyR7Y29vcmRzW3JhbmsgLSAyXX07XG4gICAgICAgICR7c291cmNlTG9jRFR5cGV9IHNvdXJjZUxvY0EgPSAke3NvdXJjZUxvY0RUeXBlfSgke2Nvb3Jkcy5qb2luKCl9LCAwKTtcbiAgICAgICAgLS0ke2Nvb3Jkc1tyYW5rIC0gMV19O1xuICAgICAgICAke3NvdXJjZUxvY0RUeXBlfSBzb3VyY2VMb2NCID0gJHtzb3VyY2VMb2NEVHlwZX0oJHtjb29yZHMuam9pbigpfSwgMCk7XG4gICAgICAgIC0tJHtjb29yZHNbcmFuayAtIDJdfTtgO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc291cmNlUmFuayA9IHJhbms7XG4gICAgICAgICAgICBzb3VyY2VMb2NTZXR1cCA9IGBcbiAgICAgICAgJHtkdHlwZX0gc291cmNlTG9jUiA9IGNvb3JkcztcbiAgICAgICAgKyske2Nvb3Jkc1tyYW5rIC0gMV19O1xuICAgICAgICAke2R0eXBlfSBzb3VyY2VMb2NHID0gY29vcmRzO1xuICAgICAgICArKyR7Y29vcmRzW3JhbmsgLSAyXX07XG4gICAgICAgICR7ZHR5cGV9IHNvdXJjZUxvY0EgPSBjb29yZHM7XG4gICAgICAgIC0tJHtjb29yZHNbcmFuayAtIDFdfTtcbiAgICAgICAgJHtkdHlwZX0gc291cmNlTG9jQiA9IGNvb3JkcztcbiAgICAgICAgLS0ke2Nvb3Jkc1tyYW5rIC0gMl19O2A7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2hhbm5lbHMgPSBbJ3gnLCAneScsICd6JywgJ3cnLCAndScsICd2J10uc2xpY2UoMCwgc291cmNlUmFuayk7XG4gICAgICAgIGNvbnN0IGluQ2hhbm5lbCA9ICcuJyArIGNoYW5uZWxzW3NvdXJjZVJhbmsgLSAxXTsgLy8gZS5nLiBcIi5iXCIgZm9yIHJhbmsgMy5cbiAgICAgICAgY29uc3QgaW50Q2hhbm5lbHMgPSBjaGFubmVscy5tYXAoeCA9PiAnaW50ICcgKyB4KTtcbiAgICAgICAgY29uc3Qgc3JjUkNvb3JkcyA9IGdldENoYW5uZWxzKCdzb3VyY2VMb2NSJywgc291cmNlUmFuayAtIDEpLmNvbmNhdCgnaW5JZHgucicpO1xuICAgICAgICBjb25zdCBzcmNHQ29vcmRzID0gZ2V0Q2hhbm5lbHMoJ3NvdXJjZUxvY0cnLCBzb3VyY2VSYW5rIC0gMSkuY29uY2F0KCdpbklkeC5nJyk7XG4gICAgICAgIGNvbnN0IHNyY0JDb29yZHMgPSBnZXRDaGFubmVscygnc291cmNlTG9jQicsIHNvdXJjZVJhbmsgLSAxKS5jb25jYXQoJ2luSWR4LmInKTtcbiAgICAgICAgY29uc3Qgc3JjQUNvb3JkcyA9IGdldENoYW5uZWxzKCdzb3VyY2VMb2NBJywgc291cmNlUmFuayAtIDEpLmNvbmNhdCgnaW5JZHguYScpO1xuICAgICAgICBjb25zdCBjb21wT3AgPSAob3AgPT09ICdtYXgnKSA/ICdncmVhdGVyVGhhbicgOiAnbGVzc1RoYW4nO1xuICAgICAgICBjb25zdCBmZXRjaENhbmRpZGF0ZUlkeCA9IGZpcnN0UGFzcyA/ICcnIDogYFxuICAgICAgICAgIGluSWR4ID0gcm91bmQodmVjNChnZXRCZXN0SW5kaWNlc0FDaGFubmVsKCR7c3JjUkNvb3Jkcy5qb2luKCl9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QmVzdEluZGljZXNBQ2hhbm5lbCgke3NyY0dDb29yZHMuam9pbigpfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEJlc3RJbmRpY2VzQUNoYW5uZWwoJHtzcmNCQ29vcmRzLmpvaW4oKX0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRCZXN0SW5kaWNlc0FDaGFubmVsKCR7c3JjQUNvb3Jkcy5qb2luKCl9KSkpO2A7XG4gICAgICAgIGNvbnN0IGZldGNoVmFsdWUgPSBgdmVjNChcbiAgICAgICAgICAgIGdldEFDaGFubmVsKCR7c3JjUkNvb3Jkcy5qb2luKCl9KSxcbiAgICAgICAgICAgIGhhc05leHRDb2wgPyBnZXRBQ2hhbm5lbCgke3NyY0dDb29yZHMuam9pbigpfSkgOiAwLixcbiAgICAgICAgICAgIGhhc05leHRSb3cgPyBnZXRBQ2hhbm5lbCgke3NyY0JDb29yZHMuam9pbigpfSkgOiAwLixcbiAgICAgICAgICAgIGhhc05leHRSb3cgJiYgaGFzTmV4dENvbCA/IGdldEFDaGFubmVsKCR7c3JjQUNvb3Jkcy5qb2luKCl9KSA6IDAuKWA7XG4gICAgICAgIGNvbnN0IGdldEJlc3RJbmRpY2VzQUNoYW5uZWxTbmlwcGV0ID0gZmlyc3RQYXNzID8gJycgOiBgXG4gICAgICBmbG9hdCBnZXRCZXN0SW5kaWNlc0FDaGFubmVsKCR7aW50Q2hhbm5lbHMuam9pbigpfSkge1xuICAgICAgICByZXR1cm4gZ2V0Q2hhbm5lbChnZXRCZXN0SW5kaWNlc0EoJHtjaGFubmVscy5qb2luKCl9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoJHtjaGFubmVscy5zbGljZSgtMikuam9pbigpfSkpO1xuICAgICAgfWA7XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBmbG9hdCBnZXRBQ2hhbm5lbCgke2ludENoYW5uZWxzLmpvaW4oKX0pIHtcbiAgICAgICAgcmV0dXJuIGdldENoYW5uZWwoZ2V0QSgke2NoYW5uZWxzLmpvaW4oKX0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoJHtjaGFubmVscy5zbGljZSgtMikuam9pbigpfSkpO1xuICAgICAgfVxuICAgICAgJHtnZXRCZXN0SW5kaWNlc0FDaGFubmVsU25pcHBldH1cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgJHtkdHlwZX0gY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGJvb2wgaGFzTmV4dENvbCA9ICR7Y29vcmRzW3JhbmsgLSAxXX0gPCAke291dFNoYXBlW3JhbmsgLSAxXSAtIDF9O1xuICAgICAgICBib29sIGhhc05leHRSb3cgPSAke2Nvb3Jkc1tyYW5rIC0gMl19IDwgJHtvdXRTaGFwZVtyYW5rIC0gMl0gLSAxfTtcbiAgICAgICAgJHtzb3VyY2VMb2NTZXR1cH1cbiAgICAgICAgaXZlYzQgc3JjSWR4ID0gaXZlYzQoc291cmNlTG9jUiR7aW5DaGFubmVsfSwgc291cmNlTG9jRyR7aW5DaGFubmVsfSxcbiAgICAgICAgICBzb3VyY2VMb2NCJHtpbkNoYW5uZWx9LCBzb3VyY2VMb2NBJHtpbkNoYW5uZWx9KSAqICR7d2luZG93U2l6ZX07XG4gICAgICAgIGl2ZWM0IGluSWR4ID0gc3JjSWR4O1xuICAgICAgICB2ZWM0IGJlc3RJbmRleCA9IHZlYzQoaW5JZHgpO1xuICAgICAgICB2ZWM0IGJlc3RWYWx1ZSA9ICR7ZmV0Y2hWYWx1ZX07XG5cbiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAke3dpbmRvd1NpemV9OyBpKyspIHtcbiAgICAgICAgICBpbklkeCA9IHNyY0lkeDtcbiAgICAgICAgICAke2ZldGNoQ2FuZGlkYXRlSWR4fVxuICAgICAgICAgIHZlYzQgY2FuZGlkYXRlID0gJHtmZXRjaFZhbHVlfTtcbiAgICAgICAgICBidmVjNCBuYW4gPSBpc25hbihjYW5kaWRhdGUpO1xuICAgICAgICAgIGJ2ZWM0IHJlcGxhY2UgPSBidmVjNChcbiAgICAgICAgICAgIHZlYzQoJHtjb21wT3B9KGNhbmRpZGF0ZSwgYmVzdFZhbHVlKSkgKiAodmVjNCgxLjApIC0gdmVjNChuYW4pKSk7XG5cbiAgICAgICAgICBiZXN0VmFsdWUgPSB2ZWM0KHJlcGxhY2UueCAgPyBjYW5kaWRhdGUueCA6IGJlc3RWYWx1ZS54LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZS55ICA/IGNhbmRpZGF0ZS55IDogYmVzdFZhbHVlLnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlLnogID8gY2FuZGlkYXRlLnogOiBiZXN0VmFsdWUueixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2UudyAgPyBjYW5kaWRhdGUudyA6IGJlc3RWYWx1ZS53KTtcbiAgICAgICAgICBiZXN0SW5kZXggPSBtaXgoYmVzdEluZGV4LCB2ZWM0KGluSWR4KSwgdmVjNChyZXBsYWNlKSk7XG4gICAgICAgICAgc3JjSWR4Kys7XG4gICAgICAgIH1cbiAgICAgICAgc2V0T3V0cHV0KGJlc3RJbmRleCk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hcmdtaW5tYXhfcGFja2VkX2dwdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5leHBvcnQgY2xhc3MgQXZnUG9vbDJEQmFja3Byb3BQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3Rvcihjb252SW5mbykge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ2R5J107XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5pblNoYXBlO1xuICAgICAgICBjb25zdCBmaWx0ZXJIZWlnaHQgPSBjb252SW5mby5maWx0ZXJIZWlnaHQ7XG4gICAgICAgIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG4gICAgICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICAgICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICAgICAgY29uc3QgZGlsYXRpb25IZWlnaHQgPSBjb252SW5mby5kaWxhdGlvbkhlaWdodDtcbiAgICAgICAgY29uc3QgZGlsYXRpb25XaWR0aCA9IGNvbnZJbmZvLmRpbGF0aW9uV2lkdGg7XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckhlaWdodDtcbiAgICAgICAgY29uc3QgZWZmZWN0aXZlRmlsdGVyV2lkdGggPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJXaWR0aDtcbiAgICAgICAgY29uc3QgcGFkVG9wID0gZWZmZWN0aXZlRmlsdGVySGVpZ2h0IC0gMSAtIGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgICAgICBjb25zdCBwYWRMZWZ0ID0gZWZmZWN0aXZlRmlsdGVyV2lkdGggLSAxIC0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgICAgICBjb25zdCBhdmdNdWx0aXBsaWVyID0gMSAvIChmaWx0ZXJIZWlnaHQgKiBmaWx0ZXJXaWR0aCk7XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCBpdmVjMiBwYWRzID0gaXZlYzIoJHtwYWRUb3B9LCAke3BhZExlZnR9KTtcbiAgICAgIGNvbnN0IGZsb2F0IGF2Z011bHRpcGxpZXIgPSBmbG9hdCgke2F2Z011bHRpcGxpZXJ9KTtcblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGIgPSBjb29yZHNbMF07XG4gICAgICAgIGludCBkID0gY29vcmRzWzNdO1xuXG4gICAgICAgIGl2ZWMyIGR5UkNDb3JuZXIgPSBjb29yZHMueXogLSBwYWRzO1xuICAgICAgICBpbnQgZHlSQ29ybmVyID0gZHlSQ0Nvcm5lci54O1xuICAgICAgICBpbnQgZHlDQ29ybmVyID0gZHlSQ0Nvcm5lci55O1xuXG4gICAgICAgIC8vIENvbnZvbHZlIGR5KD8sID8sIGQpIHdpdGggcG9zIG1hc2soOiwgOiwgZCkgdG8gZ2V0IGR4KHhSLCB4QywgZCkuXG4gICAgICAgIC8vID8gPSB0byBiZSBkZXRlcm1pbmVkLiA6ID0gYWNyb3NzIGFsbCB2YWx1ZXMgaW4gdGhhdCBheGlzLlxuICAgICAgICBmbG9hdCBkb3RQcm9kID0gMC4wO1xuICAgICAgICBmb3IgKGludCB3UiA9IDA7IHdSIDwgJHtlZmZlY3RpdmVGaWx0ZXJIZWlnaHR9O1xuICAgICAgICAgICAgd1IgKz0gJHtkaWxhdGlvbkhlaWdodH0pIHtcbiAgICAgICAgICBmbG9hdCBkeVIgPSBmbG9hdChkeVJDb3JuZXIgKyB3UikgLyAke3N0cmlkZUhlaWdodH0uMDtcblxuICAgICAgICAgIGlmIChkeVIgPCAwLjAgfHwgZHlSID49ICR7Y29udkluZm8ub3V0SGVpZ2h0fS4wIHx8IGZyYWN0KGR5UikgPiAwLjApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpbnQgaWR5UiA9IGludChkeVIpO1xuXG4gICAgICAgICAgZm9yIChpbnQgd0MgPSAwOyB3QyA8ICR7ZWZmZWN0aXZlRmlsdGVyV2lkdGh9O1xuICAgICAgICAgICAgd0MrPSAke2RpbGF0aW9uV2lkdGh9KSB7XG4gICAgICAgICAgICBmbG9hdCBkeUMgPSBmbG9hdChkeUNDb3JuZXIgKyB3QykgLyAke3N0cmlkZVdpZHRofS4wO1xuXG4gICAgICAgICAgICBpZiAoZHlDIDwgMC4wIHx8IGR5QyA+PSAke2NvbnZJbmZvLm91dFdpZHRofS4wIHx8XG4gICAgICAgICAgICAgICAgZnJhY3QoZHlDKSA+IDAuMCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGludCBpZHlDID0gaW50KGR5Qyk7XG5cbiAgICAgICAgICAgIGZsb2F0IGR5VmFsdWUgPSBnZXREeShiLCBpZHlSLCBpZHlDLCBkKTtcblxuICAgICAgICAgICAgZG90UHJvZCArPSBkeVZhbHVlICogYXZnTXVsdGlwbGllcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0T3V0cHV0KGRvdFByb2QpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEF2Z1Bvb2wzREJhY2twcm9wUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoY29udkluZm8pIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWydkeSddO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gY29udkluZm8uaW5TaGFwZTtcbiAgICAgICAgY29uc3QgZmlsdGVyRGVwdGggPSBjb252SW5mby5maWx0ZXJEZXB0aDtcbiAgICAgICAgY29uc3QgZmlsdGVySGVpZ2h0ID0gY29udkluZm8uZmlsdGVySGVpZ2h0O1xuICAgICAgICBjb25zdCBmaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmZpbHRlcldpZHRoO1xuICAgICAgICBjb25zdCBzdHJpZGVEZXB0aCA9IGNvbnZJbmZvLnN0cmlkZURlcHRoO1xuICAgICAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgICAgIGNvbnN0IGRpbGF0aW9uRGVwdGggPSBjb252SW5mby5kaWxhdGlvbkRlcHRoO1xuICAgICAgICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICAgICAgICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgICAgICAgY29uc3QgZWZmZWN0aXZlRmlsdGVyRGVwdGggPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJEZXB0aDtcbiAgICAgICAgY29uc3QgZWZmZWN0aXZlRmlsdGVySGVpZ2h0ID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVySGVpZ2h0O1xuICAgICAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoO1xuICAgICAgICBjb25zdCBwYWRGcm9udCA9IGVmZmVjdGl2ZUZpbHRlckRlcHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8uZnJvbnQ7XG4gICAgICAgIGNvbnN0IHBhZFRvcCA9IGVmZmVjdGl2ZUZpbHRlckhlaWdodCAtIDEgLSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICAgICAgY29uc3QgcGFkTGVmdCA9IGVmZmVjdGl2ZUZpbHRlcldpZHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICAgICAgY29uc3QgYXZnTXVsdGlwbGllciA9IDEgLyAoZmlsdGVyRGVwdGggKiBmaWx0ZXJIZWlnaHQgKiBmaWx0ZXJXaWR0aCk7XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCBpdmVjMyBwYWRzID0gaXZlYzMoJHtwYWRGcm9udH0sICR7cGFkVG9wfSwgJHtwYWRMZWZ0fSk7XG4gICAgICBjb25zdCBmbG9hdCBhdmdNdWx0aXBsaWVyID0gZmxvYXQoJHthdmdNdWx0aXBsaWVyfSk7XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzUgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiYXRjaCA9IGNvb3Jkcy54O1xuICAgICAgICBpbnQgY2ggPSBjb29yZHMudTtcblxuICAgICAgICBpdmVjMyBkeUNvcm5lciA9IGl2ZWMzKGNvb3Jkcy55LCBjb29yZHMueiwgY29vcmRzLncpIC0gcGFkcztcbiAgICAgICAgaW50IGR5RENvcm5lciA9IGR5Q29ybmVyLng7XG4gICAgICAgIGludCBkeVJDb3JuZXIgPSBkeUNvcm5lci55O1xuICAgICAgICBpbnQgZHlDQ29ybmVyID0gZHlDb3JuZXIuejtcblxuICAgICAgICAvLyBDb252b2x2ZSBkeSg/LCA/LCA/LCBkKSB3aXRoIHBvcyBtYXNrKDosIDosIDosIGNoKSB0byBnZXRcbiAgICAgICAgLy8gZHgoeEQsIHhSLCB4QywgY2gpLlxuICAgICAgICAvLyA/ID0gdG8gYmUgZGV0ZXJtaW5lZC4gOiA9IGFjcm9zcyBhbGwgdmFsdWVzIGluIHRoYXQgYXhpcy5cbiAgICAgICAgZmxvYXQgZG90UHJvZCA9IDAuMDtcblxuICAgICAgICBmb3IgKGludCB3RCA9IDA7IHdEIDwgJHtlZmZlY3RpdmVGaWx0ZXJEZXB0aH07XG4gICAgICAgICAgICB3RCArPSAke2RpbGF0aW9uRGVwdGh9KSB7XG4gICAgICAgICAgZmxvYXQgZHlEID0gZmxvYXQoZHlEQ29ybmVyICsgd0QpIC8gJHtzdHJpZGVEZXB0aH0uMDtcblxuICAgICAgICAgIGlmIChkeUQgPCAwLjAgfHwgZHlEID49ICR7Y29udkluZm8ub3V0RGVwdGh9LjAgfHwgZnJhY3QoZHlEKSA+IDAuMCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGludCBpZHlEID0gaW50KGR5RCk7XG5cbiAgICAgICAgICBmb3IgKGludCB3UiA9IDA7IHdSIDwgJHtlZmZlY3RpdmVGaWx0ZXJIZWlnaHR9O1xuICAgICAgICAgICAgICB3UiArPSAke2RpbGF0aW9uSGVpZ2h0fSkge1xuICAgICAgICAgICAgZmxvYXQgZHlSID0gZmxvYXQoZHlSQ29ybmVyICsgd1IpIC8gJHtzdHJpZGVIZWlnaHR9LjA7XG5cbiAgICAgICAgICAgIGlmIChkeVIgPCAwLjAgfHwgZHlSID49ICR7Y29udkluZm8ub3V0SGVpZ2h0fS4wIHx8XG4gICAgICAgICAgICAgICAgZnJhY3QoZHlSKSA+IDAuMCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGludCBpZHlSID0gaW50KGR5Uik7XG5cbiAgICAgICAgICAgIGZvciAoaW50IHdDID0gMDsgd0MgPCAke2VmZmVjdGl2ZUZpbHRlcldpZHRofTtcbiAgICAgICAgICAgICAgICB3QyArPSAke2RpbGF0aW9uV2lkdGh9KSB7XG4gICAgICAgICAgICAgIGZsb2F0IGR5QyA9IGZsb2F0KGR5Q0Nvcm5lciArIHdDKSAvICR7c3RyaWRlV2lkdGh9LjA7XG5cbiAgICAgICAgICAgICAgaWYgKGR5QyA8IDAuMCB8fCBkeUMgPj0gJHtjb252SW5mby5vdXRXaWR0aH0uMCB8fFxuICAgICAgICAgICAgICAgICAgZnJhY3QoZHlDKSA+IDAuMCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGludCBpZHlDID0gaW50KGR5Qyk7XG5cbiAgICAgICAgICAgICAgZmxvYXQgZHlWYWx1ZSA9IGdldER5KGJhdGNoLCBpZHlELCBpZHlSLCBpZHlDLCBjaCk7XG5cbiAgICAgICAgICAgICAgZG90UHJvZCArPSBkeVZhbHVlICogYXZnTXVsdGlwbGllcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0T3V0cHV0KGRvdFByb2QpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXZnX3Bvb2xfYmFja3Byb3BfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8vIEltcG9ydCB3ZWJnbCBmbGFncy5cbmltcG9ydCAnLi9mbGFnc193ZWJnbCc7XG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIGJ1ZmZlciwgRGF0YVN0b3JhZ2UsIGVuZ2luZSwgZW52LCBrZXJuZWxfaW1wbHMsIEtlcm5lbEJhY2tlbmQsIHNjYWxhciwgdGlkeSwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBnZXRXZWJHTENvbnRleHQgfSBmcm9tICcuL2NhbnZhc191dGlsJztcbmltcG9ydCB7IERlY29kZU1hdHJpeFByb2dyYW0gfSBmcm9tICcuL2RlY29kZV9tYXRyaXhfZ3B1JztcbmltcG9ydCB7IERlY29kZU1hdHJpeFBhY2tlZFByb2dyYW0gfSBmcm9tICcuL2RlY29kZV9tYXRyaXhfcGFja2VkX2dwdSc7XG5pbXBvcnQgeyBFbmNvZGVGbG9hdFByb2dyYW0gfSBmcm9tICcuL2VuY29kZV9mbG9hdF9ncHUnO1xuaW1wb3J0IHsgRW5jb2RlRmxvYXRQYWNrZWRQcm9ncmFtIH0gZnJvbSAnLi9lbmNvZGVfZmxvYXRfcGFja2VkX2dwdSc7XG5pbXBvcnQgeyBFbmNvZGVNYXRyaXhQcm9ncmFtIH0gZnJvbSAnLi9lbmNvZGVfbWF0cml4X2dwdSc7XG5pbXBvcnQgeyBFbmNvZGVNYXRyaXhQYWNrZWRQcm9ncmFtIH0gZnJvbSAnLi9lbmNvZGVfbWF0cml4X3BhY2tlZF9ncHUnO1xuaW1wb3J0IHsgR1BHUFVDb250ZXh0IH0gZnJvbSAnLi9ncGdwdV9jb250ZXh0JztcbmltcG9ydCAqIGFzIGdwZ3B1X21hdGggZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7IHNpbXBsZUFic0ltcGxDUFUgfSBmcm9tICcuL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuaW1wb3J0IHsgUGFja1Byb2dyYW0gfSBmcm9tICcuL3BhY2tfZ3B1JztcbmltcG9ydCB7IFJlc2hhcGVQYWNrZWRQcm9ncmFtIH0gZnJvbSAnLi9yZXNoYXBlX3BhY2tlZF9ncHUnO1xuaW1wb3J0ICogYXMgdGV4X3V0aWwgZnJvbSAnLi90ZXhfdXRpbCc7XG5pbXBvcnQgeyBUZXh0dXJlVXNhZ2UgfSBmcm9tICcuL3RleF91dGlsJztcbmltcG9ydCB7IFRleHR1cmVNYW5hZ2VyIH0gZnJvbSAnLi90ZXh0dXJlX21hbmFnZXInO1xuaW1wb3J0ICogYXMgdW5hcnlfb3AgZnJvbSAnLi91bmFyeW9wX2dwdSc7XG5pbXBvcnQgeyBVbmFyeU9wUHJvZ3JhbSB9IGZyb20gJy4vdW5hcnlvcF9ncHUnO1xuaW1wb3J0IHsgVW5hcnlPcFBhY2tlZFByb2dyYW0gfSBmcm9tICcuL3VuYXJ5b3BfcGFja2VkX2dwdSc7XG5pbXBvcnQgeyBVbnBhY2tQcm9ncmFtIH0gZnJvbSAnLi91bnBhY2tfZ3B1JztcbmltcG9ydCAqIGFzIHdlYmdsX3V0aWwgZnJvbSAnLi93ZWJnbF91dGlsJztcbmNvbnN0IHdoZXJlSW1wbCA9IGtlcm5lbF9pbXBscy53aGVyZUltcGw7XG5leHBvcnQgY29uc3QgRVBTSUxPTl9GTE9BVDMyID0gMWUtNztcbmV4cG9ydCBjb25zdCBFUFNJTE9OX0ZMT0FUMTYgPSAxZS00O1xuY29uc3QgYmluYXJ5Q2FjaGVzID0ge307XG5leHBvcnQgZnVuY3Rpb24gZ2V0QmluYXJ5Q2FjaGUod2ViR0xWZXJzaW9uKSB7XG4gICAgaWYgKHdlYkdMVmVyc2lvbiBpbiBiaW5hcnlDYWNoZXMpIHtcbiAgICAgICAgcmV0dXJuIGJpbmFyeUNhY2hlc1t3ZWJHTFZlcnNpb25dO1xuICAgIH1cbiAgICBiaW5hcnlDYWNoZXNbd2ViR0xWZXJzaW9uXSA9IHt9O1xuICAgIHJldHVybiBiaW5hcnlDYWNoZXNbd2ViR0xWZXJzaW9uXTtcbn1cbi8vIEVtcGlyaWNhbGx5IGRldGVybWluZWQgY29uc3RhbnQgdXNlZCB0byBkZXRlcm1pbmUgc2l6ZSB0aHJlc2hvbGQgZm9yIGhhbmRpbmdcbi8vIG9mZiBleGVjdXRpb24gdG8gdGhlIENQVS5cbmNvbnN0IENQVV9IQU5ET0ZGX1NJWkVfVEhSRVNIT0xEID0gZW52KCkuZ2V0TnVtYmVyKCdDUFVfSEFORE9GRl9TSVpFX1RIUkVTSE9MRCcpO1xuLy8gRW1waXJpY2FsbHkgZGV0ZXJtaW5lZCBjb25zdGFudCB1c2VkIHRvIGRlY2lkZSB0aGUgbnVtYmVyIG9mIE1CIG9uIEdQVVxuLy8gYmVmb3JlIHdlIHdhcm4gYWJvdXQgaGlnaCBtZW1vcnkgdXNlLiBUaGUgTUIgYXJlIHRoaXMgY29uc3RhbnQgKiBzY3JlZW4gYXJlYVxuLy8gKiBkcGkgLyAxMDI0IC8gMTAyNC5cbmNvbnN0IEJFRk9SRV9QQUdJTkdfQ09OU1RBTlQgPSA2MDA7XG5mdW5jdGlvbiBudW1NQkJlZm9yZVdhcm5pbmcoKSB7XG4gICAgaWYgKGVudigpLmdsb2JhbC5zY3JlZW4gPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gMTAyNDsgLy8gMSBHQi5cbiAgICB9XG4gICAgcmV0dXJuIChlbnYoKS5nbG9iYWwuc2NyZWVuLmhlaWdodCAqIGVudigpLmdsb2JhbC5zY3JlZW4ud2lkdGggKlxuICAgICAgICB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbykgKlxuICAgICAgICBCRUZPUkVfUEFHSU5HX0NPTlNUQU5UIC8gMTAyNCAvIDEwMjQ7XG59XG5leHBvcnQgY2xhc3MgTWF0aEJhY2tlbmRXZWJHTCBleHRlbmRzIEtlcm5lbEJhY2tlbmQge1xuICAgIGNvbnN0cnVjdG9yKGdwZ3B1KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIC8vIE1hcHMgZGF0YSBpZHMgdGhhdCBoYXZlIGEgcGVuZGluZyByZWFkIG9wZXJhdGlvbiwgdG8gbGlzdCBvZiBzdWJzY3JpYmVycy5cbiAgICAgICAgdGhpcy5wZW5kaW5nUmVhZCA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIC8vIExpc3Qgb2YgZGF0YSBpZHMgdGhhdCBhcmUgc2NoZWR1bGVkIGZvciBkaXNwb3NhbCwgYnV0IGFyZSB3YWl0aW5nIG9uIGFcbiAgICAgICAgLy8gcGVuZGluZyByZWFkIG9wZXJhdGlvbi5cbiAgICAgICAgdGhpcy5wZW5kaW5nRGlzcG9zYWwgPSBuZXcgV2Vha1NldCgpO1xuICAgICAgICAvLyBVc2VkIHRvIGNvdW50IHRoZSBudW1iZXIgb2YgJ3NoYWxsb3cnIHNsaWNlZCB0ZW5zb3JzIHRoYXQgcG9pbnQgdG8gdGhlXG4gICAgICAgIC8vIHNhbWUgZGF0YSBpZC5cbiAgICAgICAgdGhpcy5kYXRhUmVmQ291bnQgPSBuZXcgV2Vha01hcCgpO1xuICAgICAgICB0aGlzLm51bUJ5dGVzSW5HUFUgPSAwO1xuICAgICAgICAvLyBBY2N1bXVsYXRlZCB0aW1lIHNwZW50IChpbmNsdWRpbmcgYmxvY2tpbmcpIGluIHVwbG9hZGluZyBkYXRhIHRvIHdlYmdsLlxuICAgICAgICB0aGlzLnVwbG9hZFdhaXRNcyA9IDA7XG4gICAgICAgIC8vIEFjY3VtdWxhdGVkIHRpbWUgc3BlbnQgKGluY2x1ZGluZyBibG9ja2luZyBpbiBkb3dubG9hZGluZyBkYXRhIGZyb20gd2ViZ2wuXG4gICAgICAgIHRoaXMuZG93bmxvYWRXYWl0TXMgPSAwO1xuICAgICAgICAvLyByZWNvcmQgdGhlIGxhc3QgbWFudWFsIEdMIEZsdXNoIHRpbWUuXG4gICAgICAgIHRoaXMubGFzdEdsRmx1c2hUaW1lID0gMDtcbiAgICAgICAgdGhpcy53YXJuZWRBYm91dE1lbW9yeSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBlbmRpbmdEZWxldGVzID0gMDtcbiAgICAgICAgdGhpcy5kaXNwb3NlZCA9IGZhbHNlO1xuICAgICAgICBpZiAoIWVudigpLmdldEJvb2woJ0hBU19XRUJHTCcpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlYkdMIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBkZXZpY2UnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ3BncHUgPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgZ2wgPSBnZXRXZWJHTENvbnRleHQoZW52KCkuZ2V0TnVtYmVyKCdXRUJHTF9WRVJTSU9OJykpO1xuICAgICAgICAgICAgdGhpcy5iaW5hcnlDYWNoZSA9IGdldEJpbmFyeUNhY2hlKGVudigpLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpKTtcbiAgICAgICAgICAgIHRoaXMuZ3BncHUgPSBuZXcgR1BHUFVDb250ZXh0KGdsKTtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzID0gZ2wuY2FudmFzO1xuICAgICAgICAgICAgdGhpcy5ncGdwdUNyZWF0ZWRMb2NhbGx5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZ3BncHUgPSBncGdwdTtcbiAgICAgICAgICAgIHRoaXMuYmluYXJ5Q2FjaGUgPSB7fTtcbiAgICAgICAgICAgIHRoaXMuZ3BncHVDcmVhdGVkTG9jYWxseSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5jYW52YXMgPSBncGdwdS5nbC5jYW52YXM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50ZXh0dXJlTWFuYWdlciA9IG5ldyBUZXh0dXJlTWFuYWdlcih0aGlzLmdwZ3B1KTtcbiAgICAgICAgdGhpcy5udW1NQkJlZm9yZVdhcm5pbmcgPSBudW1NQkJlZm9yZVdhcm5pbmcoKTtcbiAgICAgICAgdGhpcy50ZXhEYXRhID0gbmV3IERhdGFTdG9yYWdlKHRoaXMsIGVuZ2luZSgpKTtcbiAgICB9XG4gICAgbmV4dERhdGFJZCgpIHtcbiAgICAgICAgcmV0dXJuIE1hdGhCYWNrZW5kV2ViR0wubmV4dERhdGFJZCsrO1xuICAgIH1cbiAgICBudW1EYXRhSWRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50ZXhEYXRhLm51bURhdGFJZHMoKSAtIHRoaXMucGVuZGluZ0RlbGV0ZXM7XG4gICAgfVxuICAgIHdyaXRlKHZhbHVlcywgc2hhcGUsIGR0eXBlKSB7XG4gICAgICAgIGlmIChlbnYoKS5nZXRCb29sKCdXRUJHTF9DSEVDS19OVU1FUklDQUxfUFJPQkxFTVMnKSB8fFxuICAgICAgICAgICAgZW52KCkuZ2V0Qm9vbCgnREVCVUcnKSkge1xuICAgICAgICAgICAgdGhpcy5jaGVja051bWVyaWNhbFByb2JsZW1zKHZhbHVlcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGR0eXBlID09PSAnY29tcGxleDY0JyAmJiB2YWx1ZXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgd3JpdGUgdG8gYSBjb21wbGV4NjQgZHR5cGUuIGAgK1xuICAgICAgICAgICAgICAgIGBQbGVhc2UgdXNlIHRmLmNvbXBsZXgocmVhbCwgaW1hZykuYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YUlkID0geyBpZDogdGhpcy5uZXh0RGF0YUlkKCkgfTtcbiAgICAgICAgdGhpcy50ZXhEYXRhLnNldChkYXRhSWQsIHsgc2hhcGUsIGR0eXBlLCB2YWx1ZXMsIHVzYWdlOiBUZXh0dXJlVXNhZ2UuVVBMT0FELCByZWZDb3VudDogMSB9KTtcbiAgICAgICAgcmV0dXJuIGRhdGFJZDtcbiAgICB9XG4gICAgLyoqIFJldHVybiByZWZDb3VudCBvZiBhIGBUZW5zb3JEYXRhYC4gKi9cbiAgICByZWZDb3VudChkYXRhSWQpIHtcbiAgICAgICAgaWYgKHRoaXMudGV4RGF0YS5oYXMoZGF0YUlkKSkge1xuICAgICAgICAgICAgY29uc3QgdGVuc29yRGF0YSA9IHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKTtcbiAgICAgICAgICAgIHJldHVybiB0ZW5zb3JEYXRhLnJlZkNvdW50O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICAvKiogSW5jcmVhc2UgcmVmQ291bnQgb2YgYSBgVGV4dHVyZURhdGFgLiAqL1xuICAgIGluY1JlZihkYXRhSWQpIHtcbiAgICAgICAgY29uc3QgdGV4RGF0YSA9IHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKTtcbiAgICAgICAgdGV4RGF0YS5yZWZDb3VudCsrO1xuICAgIH1cbiAgICAvKiogRGVjcmVhc2UgcmVmQ291bnQgb2YgYSBgVGV4dHVyZURhdGFgLiAqL1xuICAgIGRlY1JlZihkYXRhSWQpIHtcbiAgICAgICAgaWYgKHRoaXMudGV4RGF0YS5oYXMoZGF0YUlkKSkge1xuICAgICAgICAgICAgY29uc3QgdGV4RGF0YSA9IHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKTtcbiAgICAgICAgICAgIHRleERhdGEucmVmQ291bnQtLTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBtb3ZlKGRhdGFJZCwgdmFsdWVzLCBzaGFwZSwgZHR5cGUsIHJlZkNvdW50KSB7XG4gICAgICAgIGlmIChlbnYoKS5nZXRCb29sKCdERUJVRycpKSB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrTnVtZXJpY2FsUHJvYmxlbXModmFsdWVzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCB3cml0ZSB0byBhIGNvbXBsZXg2NCBkdHlwZS4gYCArXG4gICAgICAgICAgICAgICAgYFBsZWFzZSB1c2UgdGYuY29tcGxleChyZWFsLCBpbWFnKS5gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRleERhdGEuc2V0KGRhdGFJZCwgeyBzaGFwZSwgZHR5cGUsIHZhbHVlcywgdXNhZ2U6IFRleHR1cmVVc2FnZS5VUExPQUQsIHJlZkNvdW50IH0pO1xuICAgIH1cbiAgICBkaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0ZW5zb3JJbmZvKSB7XG4gICAgICAgIHRoaXMuZGlzcG9zZURhdGEodGVuc29ySW5mby5kYXRhSWQpO1xuICAgIH1cbiAgICByZWFkU3luYyhkYXRhSWQpIHtcbiAgICAgICAgY29uc3QgdGV4RGF0YSA9IHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKTtcbiAgICAgICAgY29uc3QgeyB2YWx1ZXMsIGR0eXBlLCBjb21wbGV4VGVuc29ySW5mb3MsIHNsaWNlLCBzaGFwZSwgaXNQYWNrZWQgfSA9IHRleERhdGE7XG4gICAgICAgIC8vIFRoZSBwcmVzZW5jZSBvZiBgc2xpY2VgIGluZGljYXRlcyB0aGlzIHRlbnNvciBpcyBhIHNoYWxsb3cgc2xpY2Ugb2YgYVxuICAgICAgICAvLyBkaWZmZXJlbnQgdGVuc29yLCBhbmQgaXMgdXNpbmcgdGhhdCBvcmlnaW5hbCB0ZW5zb3IncyB0ZXh0dXJlLiBSdW5cbiAgICAgICAgLy8gYGNsb25lYCBpbiBvcmRlciB0byBjb3B5IHRoYXQgdGV4dHVyZSBhbmQgcmVhZCBmcm9tIGl0LlxuICAgICAgICBpZiAoc2xpY2UgIT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IHByb2dyYW07XG4gICAgICAgICAgICBpZiAoaXNQYWNrZWQpIHtcbiAgICAgICAgICAgICAgICBwcm9ncmFtID0gbmV3IFVuYXJ5T3BQYWNrZWRQcm9ncmFtKHNoYXBlLCB1bmFyeV9vcC5DTE9ORSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwcm9ncmFtID0gbmV3IFVuYXJ5T3BQcm9ncmFtKHNoYXBlLCB1bmFyeV9vcC5DTE9ORSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXMgPSB0aGlzLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeyBkYXRhSWQsIHNoYXBlLCBkdHlwZSB9XSwgZHR5cGUpO1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMucmVhZFN5bmMocmVzLmRhdGFJZCk7XG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlcyk7XG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWVzICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRBbmRDYWNoZU9uQ1BVKGRhdGFJZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzaG91bGRUaW1lUHJvZ3JhbSA9IHRoaXMuYWN0aXZlVGltZXJzICE9IG51bGw7XG4gICAgICAgIGxldCBzdGFydDtcbiAgICAgICAgaWYgKHNob3VsZFRpbWVQcm9ncmFtKSB7XG4gICAgICAgICAgICBzdGFydCA9IHV0aWwubm93KCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlc3VsdDtcbiAgICAgICAgaWYgKGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICAgICAgY29uc3QgcmVhbFZhbHVlcyA9IHRoaXMucmVhZFN5bmMoY29tcGxleFRlbnNvckluZm9zLnJlYWwuZGF0YUlkKTtcbiAgICAgICAgICAgIGNvbnN0IGltYWdWYWx1ZXMgPSB0aGlzLnJlYWRTeW5jKGNvbXBsZXhUZW5zb3JJbmZvcy5pbWFnLmRhdGFJZCk7XG4gICAgICAgICAgICByZXN1bHQgPSBiYWNrZW5kX3V0aWwubWVyZ2VSZWFsQW5kSW1hZ0FycmF5cyhyZWFsVmFsdWVzLCBpbWFnVmFsdWVzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuZ2V0VmFsdWVzRnJvbVRleHR1cmUoZGF0YUlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2hvdWxkVGltZVByb2dyYW0pIHtcbiAgICAgICAgICAgIHRoaXMuZG93bmxvYWRXYWl0TXMgKz0gdXRpbC5ub3coKSAtIHN0YXJ0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRBbmRDYWNoZU9uQ1BVKGRhdGFJZCwgcmVzdWx0KTtcbiAgICB9XG4gICAgYXN5bmMgcmVhZChkYXRhSWQpIHtcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ1JlYWQuaGFzKGRhdGFJZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHN1YnNjcmliZXJzID0gdGhpcy5wZW5kaW5nUmVhZC5nZXQoZGF0YUlkKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHN1YnNjcmliZXJzLnB1c2gocmVzb2x2ZSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRleERhdGEgPSB0aGlzLnRleERhdGEuZ2V0KGRhdGFJZCk7XG4gICAgICAgIGNvbnN0IHsgdmFsdWVzLCBzaGFwZSwgc2xpY2UsIGR0eXBlLCBjb21wbGV4VGVuc29ySW5mb3MsIGlzUGFja2VkIH0gPSB0ZXhEYXRhO1xuICAgICAgICAvLyBUaGUgcHJlc2VuY2Ugb2YgYHNsaWNlYCBpbmRpY2F0ZXMgdGhpcyB0ZW5zb3IgaXMgYSBzaGFsbG93IHNsaWNlIG9mIGFcbiAgICAgICAgLy8gZGlmZmVyZW50IHRlbnNvciwgYW5kIGlzIHVzaW5nIHRoYXQgb3JpZ2luYWwgdGVuc29yJ3MgdGV4dHVyZS4gUnVuXG4gICAgICAgIC8vIGBjbG9uZWAgaW4gb3JkZXIgdG8gY29weSB0aGF0IHRleHR1cmUgYW5kIHJlYWQgZnJvbSBpdC5cbiAgICAgICAgaWYgKHNsaWNlICE9IG51bGwpIHtcbiAgICAgICAgICAgIGxldCBwcm9ncmFtO1xuICAgICAgICAgICAgaWYgKGlzUGFja2VkKSB7XG4gICAgICAgICAgICAgICAgcHJvZ3JhbSA9IG5ldyBVbmFyeU9wUGFja2VkUHJvZ3JhbShzaGFwZSwgdW5hcnlfb3AuQ0xPTkUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcHJvZ3JhbSA9IG5ldyBVbmFyeU9wUHJvZ3JhbShzaGFwZSwgdW5hcnlfb3AuQ0xPTkUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVzID0gdGhpcy5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3sgZGF0YUlkLCBzaGFwZSwgZHR5cGUgfV0sIGR0eXBlKTtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLnJlYWQocmVzLmRhdGFJZCk7XG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlcyk7XG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWVzICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRBbmRDYWNoZU9uQ1BVKGRhdGFJZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFlbnYoKS5nZXRCb29sKCdXRUJHTF9ET1dOTE9BRF9GTE9BVF9FTkFCTEVEJykgJiZcbiAgICAgICAgICAgIGVudigpLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpID09PSAyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHRlbnNvci5kYXRhKCkgd2l0aCBXRUJHTF9ET1dOTE9BRF9GTE9BVF9FTkFCTEVEPWZhbHNlIGFuZCBgICtcbiAgICAgICAgICAgICAgICBgV0VCR0xfVkVSU0lPTj0yIG5vdCB5ZXQgc3VwcG9ydGVkLmApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBidWZmZXIgPSBudWxsO1xuICAgICAgICBsZXQgdG1wRG93bmxvYWRUYXJnZXQ7XG4gICAgICAgIGlmIChkdHlwZSAhPT0gJ2NvbXBsZXg2NCcgJiYgZW52KCkuZ2V0KCdXRUJHTF9CVUZGRVJfU1VQUE9SVEVEJykpIHtcbiAgICAgICAgICAgIC8vIFBvc3NpYmx5IGNvcHkgdGhlIHRleHR1cmUgaW50byBhIGJ1ZmZlciBiZWZvcmUgaW5zZXJ0aW5nIGEgZmVuY2UuXG4gICAgICAgICAgICB0bXBEb3dubG9hZFRhcmdldCA9IHRoaXMuZGVjb2RlKGRhdGFJZCk7XG4gICAgICAgICAgICBjb25zdCB0bXBEYXRhID0gdGhpcy50ZXhEYXRhLmdldCh0bXBEb3dubG9hZFRhcmdldC5kYXRhSWQpO1xuICAgICAgICAgICAgYnVmZmVyID0gdGhpcy5ncGdwdS5jcmVhdGVCdWZmZXJGcm9tVGV4dHVyZSh0bXBEYXRhLnRleHR1cmUsIC4uLnRleF91dGlsLmdldERlbnNlVGV4U2hhcGUoc2hhcGUpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBlbmRpbmdSZWFkLnNldChkYXRhSWQsIFtdKTtcbiAgICAgICAgaWYgKGR0eXBlICE9PSAnY29tcGxleDY0Jykge1xuICAgICAgICAgICAgLy8gQ3JlYXRlIGEgZmVuY2UgYW5kIHdhaXQgZm9yIGl0IHRvIHJlc29sdmUuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmdwZ3B1LmNyZWF0ZUFuZFdhaXRGb3JGZW5jZSgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIERvd25sb2FkIHRoZSB2YWx1ZXMgZnJvbSB0aGUgR1BVLlxuICAgICAgICBsZXQgdmFscztcbiAgICAgICAgaWYgKGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICAgICAgY29uc3QgcHMgPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgdGhpcy5yZWFkKGNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsLmRhdGFJZCksXG4gICAgICAgICAgICAgICAgdGhpcy5yZWFkKGNvbXBsZXhUZW5zb3JJbmZvcy5pbWFnLmRhdGFJZClcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgY29uc3QgcmVhbFZhbHVlcyA9IHBzWzBdO1xuICAgICAgICAgICAgY29uc3QgaW1hZ1ZhbHVlcyA9IHBzWzFdO1xuICAgICAgICAgICAgdmFscyA9IGJhY2tlbmRfdXRpbC5tZXJnZVJlYWxBbmRJbWFnQXJyYXlzKHJlYWxWYWx1ZXMsIGltYWdWYWx1ZXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGJ1ZmZlciA9PSBudWxsKSB7XG4gICAgICAgICAgICB2YWxzID0gdGhpcy5nZXRWYWx1ZXNGcm9tVGV4dHVyZShkYXRhSWQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShzaGFwZSk7XG4gICAgICAgICAgICB2YWxzID0gdGhpcy5ncGdwdS5kb3dubG9hZEZsb2F0MzJNYXRyaXhGcm9tQnVmZmVyKGJ1ZmZlciwgc2l6ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRtcERvd25sb2FkVGFyZ2V0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odG1wRG93bmxvYWRUYXJnZXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChidWZmZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdwZ3B1LmdsO1xuICAgICAgICAgICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmRlbGV0ZUJ1ZmZlcihidWZmZXIpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkVHlwZVZhbHMgPSB0aGlzLmNvbnZlcnRBbmRDYWNoZU9uQ1BVKGRhdGFJZCwgdmFscyk7XG4gICAgICAgIGNvbnN0IHN1YnNjcmliZXJzID0gdGhpcy5wZW5kaW5nUmVhZC5nZXQoZGF0YUlkKTtcbiAgICAgICAgdGhpcy5wZW5kaW5nUmVhZC5kZWxldGUoZGF0YUlkKTtcbiAgICAgICAgLy8gTm90aWZ5IGFsbCBwZW5kaW5nIHJlYWRzLlxuICAgICAgICBzdWJzY3JpYmVycy5mb3JFYWNoKHJlc29sdmUgPT4gcmVzb2x2ZShkVHlwZVZhbHMpKTtcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ0Rpc3Bvc2FsLmhhcyhkYXRhSWQpKSB7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdEaXNwb3NhbC5kZWxldGUoZGF0YUlkKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRpc3Bvc2VEYXRhKGRhdGFJZCkpIHtcbiAgICAgICAgICAgICAgICBlbmdpbmUoKS5yZW1vdmVEYXRhSWQoZGF0YUlkLCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0RlbGV0ZXMtLTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZFR5cGVWYWxzO1xuICAgIH1cbiAgICBidWZmZXJTeW5jKHQpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMucmVhZFN5bmModC5kYXRhSWQpO1xuICAgICAgICBsZXQgZGVjb2RlZERhdGEgPSBkYXRhO1xuICAgICAgICBpZiAodC5kdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8gRGVjb2RlIHRoZSBieXRlcyBpbnRvIHN0cmluZy5cbiAgICAgICAgICAgICAgICBkZWNvZGVkRGF0YSA9IGRhdGEubWFwKGQgPT4gdXRpbC5kZWNvZGVTdHJpbmcoZCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZGVjb2RlIGVuY29kZWQgc3RyaW5nIGJ5dGVzIGludG8gdXRmLTgnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVmZmVyKHQuc2hhcGUsIHQuZHR5cGUsIGRlY29kZWREYXRhKTtcbiAgICB9XG4gICAgY2hlY2tOdW1lcmljYWxQcm9ibGVtcyh2YWx1ZXMpIHtcbiAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG51bSA9IHZhbHVlc1tpXTtcbiAgICAgICAgICAgIGlmICghd2ViZ2xfdXRpbC5jYW5CZVJlcHJlc2VudGVkKG51bSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUkVOREVSX0ZMT0FUMzJfQ0FQQUJMRScpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGBUaGUgdmFsdWUgJHtudW19IGNhbm5vdCBiZSByZXByZXNlbnRlZCB3aXRoIHlvdXIgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgY3VycmVudCBzZXR0aW5ncy4gQ29uc2lkZXIgZW5hYmxpbmcgZmxvYXQzMiByZW5kZXJpbmc6IGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCd0Zi5lbnYoKS5zZXQoJ1dFQkdMX1JFTkRFUl9GTE9BVDMyX0VOQUJMRUQnLCB0cnVlKTsnYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGBUaGUgdmFsdWUgJHtudW19IGNhbm5vdCBiZSByZXByZXNlbnRlZCBvbiB0aGlzIGRldmljZS5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRWYWx1ZXNGcm9tVGV4dHVyZShkYXRhSWQpIHtcbiAgICAgICAgY29uc3QgeyBzaGFwZSwgZHR5cGUsIGlzUGFja2VkIH0gPSB0aGlzLnRleERhdGEuZ2V0KGRhdGFJZCk7XG4gICAgICAgIGNvbnN0IHNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoc2hhcGUpO1xuICAgICAgICBpZiAoZW52KCkuZ2V0Qm9vbCgnV0VCR0xfRE9XTkxPQURfRkxPQVRfRU5BQkxFRCcpKSB7XG4gICAgICAgICAgICBjb25zdCB0bXBUYXJnZXQgPSB0aGlzLmRlY29kZShkYXRhSWQpO1xuICAgICAgICAgICAgY29uc3QgdG1wRGF0YSA9IHRoaXMudGV4RGF0YS5nZXQodG1wVGFyZ2V0LmRhdGFJZCk7XG4gICAgICAgICAgICBjb25zdCB2YWxzID0gdGhpcy5ncGdwdVxuICAgICAgICAgICAgICAgIC5kb3dubG9hZE1hdHJpeEZyb21QYWNrZWRUZXh0dXJlKHRtcERhdGEudGV4dHVyZSwgLi4udGV4X3V0aWwuZ2V0RGVuc2VUZXhTaGFwZShzaGFwZSkpXG4gICAgICAgICAgICAgICAgLnN1YmFycmF5KDAsIHNpemUpO1xuICAgICAgICAgICAgdGhpcy5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0bXBUYXJnZXQpO1xuICAgICAgICAgICAgcmV0dXJuIHZhbHM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2hvdWxkVXNlUGFja2VkUHJvZ3JhbSA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0snKSAmJiBpc1BhY2tlZCA9PT0gdHJ1ZTtcbiAgICAgICAgY29uc3Qgb3V0cHV0U2hhcGUgPSBzaG91bGRVc2VQYWNrZWRQcm9ncmFtID8gd2ViZ2xfdXRpbC5nZXRTaGFwZUFzM0Qoc2hhcGUpIDogc2hhcGU7XG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSBzaG91bGRVc2VQYWNrZWRQcm9ncmFtID9cbiAgICAgICAgICAgIG5ldyBFbmNvZGVGbG9hdFBhY2tlZFByb2dyYW0ob3V0cHV0U2hhcGUpIDpcbiAgICAgICAgICAgIG5ldyBFbmNvZGVGbG9hdFByb2dyYW0ob3V0cHV0U2hhcGUpO1xuICAgICAgICBjb25zdCBvdXRwdXQgPSB0aGlzLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeyBzaGFwZTogb3V0cHV0U2hhcGUsIGR0eXBlLCBkYXRhSWQgfV0sICdmbG9hdDMyJyk7XG4gICAgICAgIGNvbnN0IHRtcERhdGEgPSB0aGlzLnRleERhdGEuZ2V0KG91dHB1dC5kYXRhSWQpO1xuICAgICAgICBjb25zdCB2YWxzID0gdGhpcy5ncGdwdVxuICAgICAgICAgICAgLmRvd25sb2FkQnl0ZUVuY29kZWRGbG9hdE1hdHJpeEZyb21PdXRwdXRUZXh0dXJlKHRtcERhdGEudGV4dHVyZSwgdG1wRGF0YS50ZXhTaGFwZVswXSwgdG1wRGF0YS50ZXhTaGFwZVsxXSlcbiAgICAgICAgICAgIC5zdWJhcnJheSgwLCBzaXplKTtcbiAgICAgICAgdGhpcy5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhvdXRwdXQpO1xuICAgICAgICByZXR1cm4gdmFscztcbiAgICB9XG4gICAgdGltZXJBdmFpbGFibGUoKSB7XG4gICAgICAgIHJldHVybiBlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX0RJU0pPSU5UX1FVRVJZX1RJTUVSX0VYVEVOU0lPTl9SRUxJQUJMRScpID4gMDtcbiAgICB9XG4gICAgYXN5bmMgdGltZShmKSB7XG4gICAgICAgIGNvbnN0IG9sZEFjdGl2ZVRpbWVycyA9IHRoaXMuYWN0aXZlVGltZXJzO1xuICAgICAgICBjb25zdCBuZXdBY3RpdmVUaW1lcnMgPSBbXTtcbiAgICAgICAgbGV0IG91dGVyTW9zdFRpbWUgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMucHJvZ3JhbVRpbWVyc1N0YWNrID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMucHJvZ3JhbVRpbWVyc1N0YWNrID0gbmV3QWN0aXZlVGltZXJzO1xuICAgICAgICAgICAgb3V0ZXJNb3N0VGltZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZVRpbWVycy5wdXNoKG5ld0FjdGl2ZVRpbWVycyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hY3RpdmVUaW1lcnMgPSBuZXdBY3RpdmVUaW1lcnM7XG4gICAgICAgIGYoKTtcbiAgICAgICAgLy8gbmVlZGluZyB0byBzcGxpdCB0aGVzZSB1cCBiZWNhdXNlIHV0aWwuZmxhdHRlbiBvbmx5IGFjY2VwdHMgY2VydGFpbiB0eXBlc1xuICAgICAgICBjb25zdCBmbGF0dGVuZWRBY3RpdmVUaW1lclF1ZXJpZXMgPSB1dGlsLmZsYXR0ZW4odGhpcy5hY3RpdmVUaW1lcnMubWFwKChkKSA9PiBkLnF1ZXJ5KSlcbiAgICAgICAgICAgIC5maWx0ZXIoZCA9PiBkICE9IG51bGwpO1xuICAgICAgICBjb25zdCBmbGF0dGVuZWRBY3RpdmVUaW1lck5hbWVzID0gdXRpbC5mbGF0dGVuKHRoaXMuYWN0aXZlVGltZXJzLm1hcCgoZCkgPT4gZC5uYW1lKSlcbiAgICAgICAgICAgIC5maWx0ZXIoZCA9PiBkICE9IG51bGwpO1xuICAgICAgICB0aGlzLmFjdGl2ZVRpbWVycyA9IG9sZEFjdGl2ZVRpbWVycztcbiAgICAgICAgaWYgKG91dGVyTW9zdFRpbWUpIHtcbiAgICAgICAgICAgIHRoaXMucHJvZ3JhbVRpbWVyc1N0YWNrID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXMgPSB7XG4gICAgICAgICAgICB1cGxvYWRXYWl0TXM6IHRoaXMudXBsb2FkV2FpdE1zLFxuICAgICAgICAgICAgZG93bmxvYWRXYWl0TXM6IHRoaXMuZG93bmxvYWRXYWl0TXMsXG4gICAgICAgICAgICBrZXJuZWxNczogbnVsbCxcbiAgICAgICAgICAgIHdhbGxNczogbnVsbCAvLyB3aWxsIGJlIGZpbGxlZCBieSB0aGUgZW5naW5lXG4gICAgICAgIH07XG4gICAgICAgIGlmIChlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX0RJU0pPSU5UX1FVRVJZX1RJTUVSX0VYVEVOU0lPTl9SRUxJQUJMRScpID4gMCkge1xuICAgICAgICAgICAgY29uc3Qga2VybmVsTXMgPSBhd2FpdCBQcm9taXNlLmFsbChmbGF0dGVuZWRBY3RpdmVUaW1lclF1ZXJpZXMpO1xuICAgICAgICAgICAgcmVzWydrZXJuZWxNcyddID0gdXRpbC5zdW0oa2VybmVsTXMpO1xuICAgICAgICAgICAgcmVzWydnZXRFeHRyYVByb2ZpbGVJbmZvJ10gPSAoKSA9PiBrZXJuZWxNcy5tYXAoKGQsIGkpID0+ICh7IG5hbWU6IGZsYXR0ZW5lZEFjdGl2ZVRpbWVyTmFtZXNbaV0sIG1zOiBkIH0pKVxuICAgICAgICAgICAgICAgIC5tYXAoZCA9PiBgJHtkLm5hbWV9OiAke2QubXN9YClcbiAgICAgICAgICAgICAgICAuam9pbignLCAnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc1sna2VybmVsTXMnXSA9IHtcbiAgICAgICAgICAgICAgICBlcnJvcjogJ1dlYkdMIHF1ZXJ5IHRpbWVycyBhcmUgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGVudmlyb25tZW50LidcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGxvYWRXYWl0TXMgPSAwO1xuICAgICAgICB0aGlzLmRvd25sb2FkV2FpdE1zID0gMDtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgbWVtb3J5KCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdW5yZWxpYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBudW1CeXRlc0luR1BVOiB0aGlzLm51bUJ5dGVzSW5HUFUsXG4gICAgICAgICAgICBudW1CeXRlc0luR1BVQWxsb2NhdGVkOiB0aGlzLnRleHR1cmVNYW5hZ2VyLm51bUJ5dGVzQWxsb2NhdGVkLFxuICAgICAgICAgICAgbnVtQnl0ZXNJbkdQVUZyZWU6IHRoaXMudGV4dHVyZU1hbmFnZXIubnVtQnl0ZXNGcmVlXG4gICAgICAgIH07XG4gICAgfVxuICAgIHN0YXJ0VGltZXIoKSB7XG4gICAgICAgIGlmIChlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX0RJU0pPSU5UX1FVRVJZX1RJTUVSX0VYVEVOU0lPTl9SRUxJQUJMRScpID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ3BncHUuYmVnaW5RdWVyeSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHN0YXJ0TXM6IHV0aWwubm93KCksIGVuZE1zOiBudWxsIH07XG4gICAgfVxuICAgIGVuZFRpbWVyKHF1ZXJ5KSB7XG4gICAgICAgIGlmIChlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX0RJU0pPSU5UX1FVRVJZX1RJTUVSX0VYVEVOU0lPTl9SRUxJQUJMRScpID4gMCkge1xuICAgICAgICAgICAgdGhpcy5ncGdwdS5lbmRRdWVyeSgpO1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5O1xuICAgICAgICB9XG4gICAgICAgIHF1ZXJ5LmVuZE1zID0gdXRpbC5ub3coKTtcbiAgICAgICAgcmV0dXJuIHF1ZXJ5O1xuICAgIH1cbiAgICBhc3luYyBnZXRRdWVyeVRpbWUocXVlcnkpIHtcbiAgICAgICAgaWYgKGVudigpLmdldE51bWJlcignV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1JFTElBQkxFJykgPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ncGdwdS53YWl0Rm9yUXVlcnlBbmRHZXRUaW1lKHF1ZXJ5KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0aW1lclF1ZXJ5ID0gcXVlcnk7XG4gICAgICAgIHJldHVybiB0aW1lclF1ZXJ5LmVuZE1zIC0gdGltZXJRdWVyeS5zdGFydE1zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWNyZWFzZSB0aGUgUmVmQ291bnQgb24gdGhlIGRhdGFJZCBhbmQgZGlzcG9zZSB0aGUgbWVtb3J5IGlmIHRoZSBkYXRhSWRcbiAgICAgKiBoYXMgMCByZWZDb3VudC4gSWYgdGhlcmUgYXJlIHBlbmRpbmcgcmVhZCBvbiB0aGUgZGF0YSwgdGhlIGRpc3Bvc2FsIHdvdWxkXG4gICAgICogYWRkZWQgdG8gdGhlIHBlbmRpbmcgZGVsZXRlIHF1ZXVlLiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZGF0YUlkIGlzIHJlbW92ZWRcbiAgICAgKiBmcm9tIGJhY2tlbmQgb3IgdGhlIGJhY2tlbmQgZG9lcyBub3QgY29udGFpbiB0aGUgZGF0YUlkLCBmYWxzZSBpZiB0aGVcbiAgICAgKiBkYXRhSWQgaXMgbm90IHJlbW92ZWQuIE1lbW9yeSBtYXkgb3IgbWF5IG5vdCBiZSByZWxlYXNlZCBldmVuIHdoZW4gZGF0YUlkXG4gICAgICogaXMgcmVtb3ZlZCwgd2hpY2ggYWxzbyBkZXBlbmRzIG9uIGRhdGFSZWZDb3VudCwgc2VlIGByZWxlYXNlR1BVYC5cbiAgICAgKiBAcGFyYW0gZGF0YUlkXG4gICAgICogQG9hcmFtIGZvcmNlIE9wdGlvbmFsLCByZW1vdmUgdGhlIGRhdGEgcmVnYXJkbGVzcyBvZiByZWZDb3VudFxuICAgICAqL1xuICAgIGRpc3Bvc2VEYXRhKGRhdGFJZCwgZm9yY2UgPSBmYWxzZSkge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nRGlzcG9zYWwuaGFzKGRhdGFJZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBOby1vcCBpZiBhbHJlYWR5IGRpc3Bvc2VkLlxuICAgICAgICBpZiAoIXRoaXMudGV4RGF0YS5oYXMoZGF0YUlkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgZm9yY2UgZmxhZyBpcyBzZXQsIGNoYW5nZSByZWZDb3VudCB0byAwLCB0aGlzIHdvdWxkIGVuc3VyZSBkaXNwb3NhbFxuICAgICAgICAvLyB3aGVuIGFkZGVkIHRvIHRoZSBwZW5kaW5nRGlzcG9zYWwgcXVldWUuIE1lbW9yeSBtYXkgb3IgbWF5IG5vdCBiZVxuICAgICAgICAvLyByZWxlYXNlZCwgd2hpY2ggYWxzbyBkZXBlbmRzIG9uIGRhdGFSZWZDb3VudCwgc2VlIGByZWxlYXNlR1BVYC5cbiAgICAgICAgaWYgKGZvcmNlKSB7XG4gICAgICAgICAgICB0aGlzLnRleERhdGEuZ2V0KGRhdGFJZCkucmVmQ291bnQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50ZXhEYXRhLmdldChkYXRhSWQpLnJlZkNvdW50LS07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmb3JjZSAmJiB0aGlzLnRleERhdGEuZ2V0KGRhdGFJZCkucmVmQ291bnQgPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ1JlYWQuaGFzKGRhdGFJZCkpIHtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0Rpc3Bvc2FsLmFkZChkYXRhSWQpO1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nRGVsZXRlcysrO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVsZWFzZUdQVURhdGEoZGF0YUlkKTtcbiAgICAgICAgY29uc3QgeyBjb21wbGV4VGVuc29ySW5mb3MgfSA9IHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKTtcbiAgICAgICAgaWYgKGNvbXBsZXhUZW5zb3JJbmZvcyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2VEYXRhKGNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsLmRhdGFJZCwgZm9yY2UpO1xuICAgICAgICAgICAgdGhpcy5kaXNwb3NlRGF0YShjb21wbGV4VGVuc29ySW5mb3MuaW1hZy5kYXRhSWQsIGZvcmNlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRleERhdGEuZGVsZXRlKGRhdGFJZCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZWxlYXNlR1BVRGF0YShkYXRhSWQpIHtcbiAgICAgICAgY29uc3QgeyB0ZXh0dXJlLCBkdHlwZSwgdGV4U2hhcGUsIHVzYWdlLCBpc1BhY2tlZCwgc2xpY2UgfSA9IHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKTtcbiAgICAgICAgY29uc3Qga2V5ID0gc2xpY2UgJiYgc2xpY2Uub3JpZ0RhdGFJZCB8fCBkYXRhSWQ7XG4gICAgICAgIGNvbnN0IHJlZkNvdW50ID0gdGhpcy5kYXRhUmVmQ291bnQuZ2V0KGtleSk7XG4gICAgICAgIGlmIChyZWZDb3VudCA+IDEpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVJlZkNvdW50LnNldChrZXksIHJlZkNvdW50IC0gMSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRhdGFSZWZDb3VudC5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgIGlmICh0ZXh0dXJlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm51bUJ5dGVzSW5HUFUgLT0gdGhpcy5jb21wdXRlQnl0ZXModGV4U2hhcGUsIGR0eXBlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRleHR1cmVNYW5hZ2VyLnJlbGVhc2VUZXh0dXJlKHRleHR1cmUsIHRleFNoYXBlLCB1c2FnZSwgaXNQYWNrZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRleERhdGEgPSB0aGlzLnRleERhdGEuZ2V0KGRhdGFJZCk7XG4gICAgICAgIHRleERhdGEudGV4dHVyZSA9IG51bGw7XG4gICAgICAgIHRleERhdGEudGV4U2hhcGUgPSBudWxsO1xuICAgICAgICB0ZXhEYXRhLmlzUGFja2VkID0gZmFsc2U7XG4gICAgICAgIHRleERhdGEuc2xpY2UgPSBudWxsO1xuICAgIH1cbiAgICBnZXRUZXh0dXJlKGRhdGFJZCkge1xuICAgICAgICB0aGlzLnVwbG9hZFRvR1BVKGRhdGFJZCk7XG4gICAgICAgIHJldHVybiB0aGlzLnRleERhdGEuZ2V0KGRhdGFJZCkudGV4dHVyZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpbnRlcm5hbCBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmljIGRhdGEgYnVja2V0LiBVc2VkIGluIHVuaXRcbiAgICAgKiB0ZXN0cy5cbiAgICAgKi9cbiAgICBnZXREYXRhSW5mbyhkYXRhSWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKTtcbiAgICB9XG4gICAgLypcbiAgICBUZXN0cyB3aGV0aGVyIGFsbCB0aGUgaW5wdXRzIHRvIGFuIG9wIGFyZSBzbWFsbCBhbmQgb24gdGhlIENQVS4gVGhpcyBoZXVyaXN0aWNcbiAgICBkZXRlcm1pbmVzIHdoZW4gaXQgd291bGQgYmUgZmFzdGVyIHRvIGV4ZWN1dGUgYSBrZXJuZWwgb24gdGhlIENQVS4gV2ViR0xcbiAgICBrZXJuZWxzIG9wdCBpbnRvIHJ1bm5pbmcgdGhpcyBjaGVjayBhbmQgZm9yd2FyZGluZyB3aGVuIGFwcHJvcHJpYXRlLlxuICAgIFRPRE8oaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGZqcy9pc3N1ZXMvODcyKTogRGV2ZWxvcCBhIG1vcmVcbiAgICBzdXN0YWluYWJsZSBzdHJhdGVneSBmb3Igb3B0aW1pemluZyBiYWNrZW5kIGV4ZWN1dGlvbiBvZiBvcHMuXG4gICAgICovXG4gICAgc2hvdWxkRXhlY3V0ZU9uQ1BVKGlucHV0cywgc2l6ZVRocmVzaG9sZCA9IENQVV9IQU5ET0ZGX1NJWkVfVEhSRVNIT0xEKSB7XG4gICAgICAgIHJldHVybiBlbnYoKS5nZXRCb29sKCdXRUJHTF9DUFVfRk9SV0FSRCcpICYmXG4gICAgICAgICAgICBpbnB1dHMuZXZlcnkoaW5wdXQgPT4gdGhpcy50ZXhEYXRhLmdldChpbnB1dC5kYXRhSWQpLnRleHR1cmUgPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgIHV0aWwuc2l6ZUZyb21TaGFwZShpbnB1dC5zaGFwZSkgPCBzaXplVGhyZXNob2xkKTtcbiAgICB9XG4gICAgZ2V0R1BHUFVDb250ZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ncGdwdTtcbiAgICB9XG4gICAgd2hlcmUoY29uZGl0aW9uKSB7XG4gICAgICAgIGJhY2tlbmRfdXRpbC53YXJuKCd0Zi53aGVyZSgpIGluIHdlYmdsIGxvY2tzIHRoZSBVSSB0aHJlYWQuICcgK1xuICAgICAgICAgICAgJ0NhbGwgdGYud2hlcmVBc3luYygpIGluc3RlYWQnKTtcbiAgICAgICAgY29uc3QgY29uZFZhbHMgPSBjb25kaXRpb24uZGF0YVN5bmMoKTtcbiAgICAgICAgcmV0dXJuIHdoZXJlSW1wbChjb25kaXRpb24uc2hhcGUsIGNvbmRWYWxzKTtcbiAgICB9XG4gICAgcGFja2VkVW5hcnlPcCh4LCBvcCwgZHR5cGUpIHtcbiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBVbmFyeU9wUGFja2VkUHJvZ3JhbSh4LnNoYXBlLCBvcCk7XG4gICAgICAgIGNvbnN0IG91dEluZm8gPSB0aGlzLmNvbXBpbGVBbmRSdW4ocHJvZ3JhbSwgW3hdLCBkdHlwZSk7XG4gICAgICAgIHJldHVybiBlbmdpbmUoKS5tYWtlVGVuc29yRnJvbURhdGFJZChvdXRJbmZvLmRhdGFJZCwgb3V0SW5mby5zaGFwZSwgb3V0SW5mby5kdHlwZSk7XG4gICAgfVxuICAgIC8vIFRPRE8obXNvdWxhbmlsbGUpIHJlbW92ZSB0aGlzIG9uY2UgdGhlIGJhY2tlbmQgaGFzIGJlZW4gbW9kdWxhcml6ZWRcbiAgICAvLyBhIGNvcHkgaXMgbmVlZGVkIGhlcmUgdG8gYnJlYWsgYSBjaXJjdWxhciBkZXBlbmRlbmN5LlxuICAgIC8vIEFsc28gcmVtb3ZlIHRoZSBvcCBmcm9tIHVuYXJ5X29wLlxuICAgIGFicyh4KSB7XG4gICAgICAgIC8vIFRPRE86IGhhbmRsZSBjYXNlcyB3aGVuIHggaXMgY29tcGxleC5cbiAgICAgICAgaWYgKHRoaXMuc2hvdWxkRXhlY3V0ZU9uQ1BVKFt4XSkgJiYgeC5kdHlwZSAhPT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgICAgIGNvbnN0IG91dFZhbHVlcyA9IHNpbXBsZUFic0ltcGxDUFUodGhpcy50ZXhEYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1ha2VPdXRwdXQoeC5zaGFwZSwgeC5kdHlwZSwgb3V0VmFsdWVzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19VTkFSWV9PUEVSQVRJT05TJykpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhY2tlZFVuYXJ5T3AoeCwgdW5hcnlfb3AuQUJTLCB4LmR0eXBlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9ncmFtID0gbmV3IFVuYXJ5T3BQcm9ncmFtKHguc2hhcGUsIHVuYXJ5X29wLkFCUyk7XG4gICAgICAgIGNvbnN0IG91dEluZm8gPSB0aGlzLmNvbXBpbGVBbmRSdW4ocHJvZ3JhbSwgW3hdKTtcbiAgICAgICAgcmV0dXJuIGVuZ2luZSgpLm1ha2VUZW5zb3JGcm9tRGF0YUlkKG91dEluZm8uZGF0YUlkLCBvdXRJbmZvLnNoYXBlLCBvdXRJbmZvLmR0eXBlKTtcbiAgICB9XG4gICAgbWFrZVRlbnNvckluZm8oc2hhcGUsIGR0eXBlLCB2YWx1ZXMpIHtcbiAgICAgICAgbGV0IGRhdGFJZDtcbiAgICAgICAgaWYgKGR0eXBlID09PSAnc3RyaW5nJyAmJiB2YWx1ZXMgIT0gbnVsbCAmJiB2YWx1ZXMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgdXRpbC5pc1N0cmluZyh2YWx1ZXNbMF0pKSB7XG4gICAgICAgICAgICBjb25zdCBlbmNvZGVkVmFsdWVzID0gdmFsdWVzLm1hcChkID0+IHV0aWwuZW5jb2RlU3RyaW5nKGQpKTtcbiAgICAgICAgICAgIGRhdGFJZCA9IHRoaXMud3JpdGUoZW5jb2RlZFZhbHVlcywgc2hhcGUsIGR0eXBlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRhdGFJZCA9IHRoaXMud3JpdGUodmFsdWVzLCBzaGFwZSwgZHR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKS51c2FnZSA9IG51bGw7XG4gICAgICAgIHJldHVybiB7IGRhdGFJZCwgc2hhcGUsIGR0eXBlIH07XG4gICAgfVxuICAgIG1ha2VPdXRwdXQoc2hhcGUsIGR0eXBlLCB2YWx1ZXMpIHtcbiAgICAgICAgY29uc3QgeyBkYXRhSWQgfSA9IHRoaXMubWFrZVRlbnNvckluZm8oc2hhcGUsIGR0eXBlLCB2YWx1ZXMpO1xuICAgICAgICByZXR1cm4gZW5naW5lKCkubWFrZVRlbnNvckZyb21EYXRhSWQoZGF0YUlkLCBzaGFwZSwgZHR5cGUsIHRoaXMpO1xuICAgIH1cbiAgICB1bnBhY2tUZW5zb3IoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBVbnBhY2tQcm9ncmFtKGlucHV0LnNoYXBlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtpbnB1dF0sIGlucHV0LmR0eXBlKTtcbiAgICB9XG4gICAgcGFja1RlbnNvcihpbnB1dCkge1xuICAgICAgICBjb25zdCBwcm9ncmFtID0gbmV3IFBhY2tQcm9ncmFtKGlucHV0LnNoYXBlKTtcbiAgICAgICAgY29uc3QgcHJldmVudEVhZ2VyVW5wYWNraW5nT3V0cHV0ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtpbnB1dF0sIGlucHV0LmR0eXBlLCBudWxsIC8qIGN1c3RvbVVuaWZvcm1WYWx1ZXMgKi8sIHByZXZlbnRFYWdlclVucGFja2luZ091dHB1dCk7XG4gICAgfVxuICAgIHBhY2tlZFJlc2hhcGUoaW5wdXQsIGFmdGVyU2hhcGUpIHtcbiAgICAgICAgY29uc3QgaW5wdXQzRFNoYXBlID0gW1xuICAgICAgICAgICAgd2ViZ2xfdXRpbC5nZXRCYXRjaERpbShpbnB1dC5zaGFwZSksXG4gICAgICAgICAgICAuLi53ZWJnbF91dGlsLmdldFJvd3NDb2xzKGlucHV0LnNoYXBlKVxuICAgICAgICBdO1xuICAgICAgICBjb25zdCBpbnB1dDNEID0ge1xuICAgICAgICAgICAgZHR5cGU6IGlucHV0LmR0eXBlLFxuICAgICAgICAgICAgc2hhcGU6IGlucHV0M0RTaGFwZSxcbiAgICAgICAgICAgIGRhdGFJZDogaW5wdXQuZGF0YUlkXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGFmdGVyU2hhcGVBczNEID0gW1xuICAgICAgICAgICAgd2ViZ2xfdXRpbC5nZXRCYXRjaERpbShhZnRlclNoYXBlKSwgLi4ud2ViZ2xfdXRpbC5nZXRSb3dzQ29scyhhZnRlclNoYXBlKVxuICAgICAgICBdO1xuICAgICAgICBjb25zdCBwcm9ncmFtID0gbmV3IFJlc2hhcGVQYWNrZWRQcm9ncmFtKGFmdGVyU2hhcGVBczNELCBpbnB1dDNEU2hhcGUpO1xuICAgICAgICBjb25zdCBwcmV2ZW50RWFnZXJVbnBhY2tpbmdPZk91dHB1dCA9IHRydWU7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IHRoaXMucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtpbnB1dDNEXSwgaW5wdXQuZHR5cGUsIG51bGwgLyogY3VzdG9tVW5pZm9ybVZhbHVlcyAqLywgcHJldmVudEVhZ2VyVW5wYWNraW5nT2ZPdXRwdXQpO1xuICAgICAgICByZXR1cm4geyBkYXRhSWQ6IG91dHB1dC5kYXRhSWQsIHNoYXBlOiBhZnRlclNoYXBlLCBkdHlwZTogb3V0cHV0LmR0eXBlIH07XG4gICAgfVxuICAgIGRlY29kZShkYXRhSWQpIHtcbiAgICAgICAgY29uc3QgdGV4RGF0YSA9IHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKTtcbiAgICAgICAgY29uc3QgeyBpc1BhY2tlZCwgc2hhcGUsIGR0eXBlIH0gPSB0ZXhEYXRhO1xuICAgICAgICBjb25zdCBzaGFwZUFzM0QgPSB3ZWJnbF91dGlsLmdldFNoYXBlQXMzRChzaGFwZSk7XG4gICAgICAgIGxldCBwcm9ncmFtO1xuICAgICAgICBpZiAoaXNQYWNrZWQpIHtcbiAgICAgICAgICAgIHByb2dyYW0gPSBuZXcgRGVjb2RlTWF0cml4UGFja2VkUHJvZ3JhbShzaGFwZUFzM0QpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcHJvZ3JhbSA9IG5ldyBEZWNvZGVNYXRyaXhQcm9ncmFtKHNoYXBlQXMzRCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJldmVudEVhZ2VyVW5wYWNraW5nT2ZPdXRwdXQgPSB0cnVlO1xuICAgICAgICBjb25zdCBvdXQgPSB0aGlzLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeyBzaGFwZTogc2hhcGVBczNELCBkdHlwZSwgZGF0YUlkIH1dLCBkdHlwZSwgbnVsbCAvKiBjdXN0b21Vbmlmb3JtVmFsdWVzICovLCBwcmV2ZW50RWFnZXJVbnBhY2tpbmdPZk91dHB1dCk7XG4gICAgICAgIHJldHVybiB7IGR0eXBlLCBzaGFwZSwgZGF0YUlkOiBvdXQuZGF0YUlkIH07XG4gICAgfVxuICAgIHJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBpbnB1dHMsIG91dHB1dER0eXBlLCBjdXN0b21Vbmlmb3JtVmFsdWVzLCBwcmV2ZW50RWFnZXJVbnBhY2tpbmdPZk91dHB1dCA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IHRoaXMubWFrZVRlbnNvckluZm8ocHJvZ3JhbS5vdXRwdXRTaGFwZSwgb3V0cHV0RHR5cGUpO1xuICAgICAgICBjb25zdCBvdXREYXRhID0gdGhpcy50ZXhEYXRhLmdldChvdXRwdXQuZGF0YUlkKTtcbiAgICAgICAgaWYgKHByb2dyYW0ucGFja2VkT3V0cHV0KSB7XG4gICAgICAgICAgICBvdXREYXRhLmlzUGFja2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbS5vdXRQYWNraW5nU2NoZW1lID09PSB0ZXhfdXRpbC5QYWNraW5nU2NoZW1lLkRFTlNFKSB7XG4gICAgICAgICAgICBjb25zdCB0ZXhlbFNoYXBlID0gdGV4X3V0aWwuZ2V0RGVuc2VUZXhTaGFwZShwcm9ncmFtLm91dHB1dFNoYXBlKTtcbiAgICAgICAgICAgIC8vIEZvciBhIGRlbnNlbHkgcGFja2VkIG91dHB1dCwgd2UgZXhwbGljaXRseSBzZXQgdGV4U2hhcGVcbiAgICAgICAgICAgIC8vIHNvIGl0IGRvZXNuJ3QgZ2V0IGFzc2lnbmVkIGxhdGVyIGFjY29yZGluZyB0byBvdXIgdHlwaWNhbCBwYWNraW5nXG4gICAgICAgICAgICAvLyBzY2hlbWUgd2hlcmVpbiBhIHNpbmdsZSB0ZXhlbCBjYW4gb25seSBjb250YWluIHZhbHVlcyBmcm9tIGFkamFjZW50XG4gICAgICAgICAgICAvLyByb3dzL2NvbHMuXG4gICAgICAgICAgICBvdXREYXRhLnRleFNoYXBlID0gdGV4ZWxTaGFwZS5tYXAoZCA9PiBkICogMik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW0ub3V0VGV4VXNhZ2UgIT0gbnVsbCkge1xuICAgICAgICAgICAgb3V0RGF0YS51c2FnZSA9IHByb2dyYW0ub3V0VGV4VXNhZ2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHV0aWwuc2l6ZUZyb21TaGFwZShvdXRwdXQuc2hhcGUpID09PSAwKSB7XG4gICAgICAgICAgICAvLyBTaG9ydC1jaXJjdWl0IHRoZSBjb21wdXRhdGlvbiBzaW5jZSB0aGUgcmVzdWx0IGlzIGVtcHR5IChoYXMgMCBpbiBpdHNcbiAgICAgICAgICAgIC8vIHNoYXBlKS5cbiAgICAgICAgICAgIG91dERhdGEudmFsdWVzID1cbiAgICAgICAgICAgICAgICB1dGlsLmdldFR5cGVkQXJyYXlGcm9tRFR5cGUob3V0cHV0LmR0eXBlLCAwKTtcbiAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YVRvRGlzcG9zZSA9IFtdO1xuICAgICAgICBjb25zdCBpbnB1dHNEYXRhID0gaW5wdXRzLm1hcChpbnB1dCA9PiB7XG4gICAgICAgICAgICBpZiAoaW5wdXQuZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBHUEdQVVByb2dyYW0gZG9lcyBub3Qgc3VwcG9ydCBjb21wbGV4NjQgaW5wdXQuIEZvciBjb21wbGV4NjQgYCArXG4gICAgICAgICAgICAgICAgICAgIGBkdHlwZXMsIHBsZWFzZSBzZXBhcmF0ZSB0aGUgcHJvZ3JhbSBpbnRvIHJlYWwgYW5kIGltYWdpbmFyeSBgICtcbiAgICAgICAgICAgICAgICAgICAgYHBhcnRzLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHRleERhdGEgPSB0aGlzLnRleERhdGEuZ2V0KGlucHV0LmRhdGFJZCk7XG4gICAgICAgICAgICBpZiAodGV4RGF0YS50ZXh0dXJlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXByb2dyYW0ucGFja2VkSW5wdXRzICYmXG4gICAgICAgICAgICAgICAgICAgIHV0aWwuc2l6ZUZyb21TaGFwZShpbnB1dC5zaGFwZSkgPD1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVudigpLmdldE51bWJlcignV0VCR0xfU0laRV9VUExPQURfVU5JRk9STScpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFVwbG9hZCBzbWFsbCB0ZW5zb3JzIHRoYXQgbGl2ZSBvbiB0aGUgQ1BVIGFzIHVuaWZvcm1zLCBub3QgYXNcbiAgICAgICAgICAgICAgICAgICAgLy8gdGV4dHVyZXMuIERvIHRoaXMgb25seSB3aGVuIHRoZSBlbnZpcm9ubWVudCBzdXBwb3J0cyAzMmJpdCBmbG9hdHNcbiAgICAgICAgICAgICAgICAgICAgLy8gZHVlIHRvIHByb2JsZW1zIHdoZW4gY29tcGFyaW5nIDE2Yml0IGZsb2F0cyB3aXRoIDMyYml0IGZsb2F0cy5cbiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZmpzL2lzc3Vlcy84MjEpOiBNYWtlIGl0XG4gICAgICAgICAgICAgICAgICAgIC8vIHBvc3NpYmxlIGZvciBwYWNrZWQgc2hhZGVycyB0byBzYW1wbGUgZnJvbSB1bmlmb3Jtcy5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlOiBpbnB1dC5zaGFwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleERhdGE6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBpc1VuaWZvcm06IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB1bmlmb3JtVmFsdWVzOiB0ZXhEYXRhLnZhbHVlc1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBUaGlzIGVuc3VyZXMgdGhhdCBpZiBhIHBhY2tlZCBwcm9ncmFtJ3MgaW5wdXRzIGhhdmUgbm90IHlldCBiZWVuXG4gICAgICAgICAgICAgICAgLy8gdXBsb2FkZWQgdG8gdGhlIEdQVSwgdGhleSBnZXQgdXBsb2FkZWQgYXMgcGFja2VkIHJpZ2h0IG9mZiB0aGUgYmF0LlxuICAgICAgICAgICAgICAgIGlmIChwcm9ncmFtLnBhY2tlZElucHV0cykge1xuICAgICAgICAgICAgICAgICAgICB0ZXhEYXRhLmlzUGFja2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGV4RGF0YS5zaGFwZSA9IGlucHV0LnNoYXBlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCEhdGV4RGF0YS5pc1BhY2tlZCAhPT0gISFwcm9ncmFtLnBhY2tlZElucHV0cykge1xuICAgICAgICAgICAgICAgIGlucHV0ID0gdGV4RGF0YS5pc1BhY2tlZCA/IHRoaXMudW5wYWNrVGVuc29yKGlucHV0KSA6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFja1RlbnNvcihpbnB1dCk7XG4gICAgICAgICAgICAgICAgZGF0YVRvRGlzcG9zZS5wdXNoKGlucHV0KTtcbiAgICAgICAgICAgICAgICB0ZXhEYXRhID0gdGhpcy50ZXhEYXRhLmdldChpbnB1dC5kYXRhSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGV4RGF0YS5pc1BhY2tlZCAmJlxuICAgICAgICAgICAgICAgICF3ZWJnbF91dGlsLmlzUmVzaGFwZUZyZWUodGV4RGF0YS5zaGFwZSwgaW5wdXQuc2hhcGUpKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSB3aGVyZSBhIHRleHR1cmUgZXhpc3RzIGZvciBhIHRlbnNvclxuICAgICAgICAgICAgICAgIC8vIGJ1dCB0aGUgc2hhcGVzIGFyZSBpbmNvbXBhdGlibGUgKGR1ZSB0byBwYWNraW5nIGNvbnN0cmFpbnRzKSBiZWNhdXNlXG4gICAgICAgICAgICAgICAgLy8gdGhlIHRlbnNvciBkaWQgbm90IGhhdmUgYSBjaGFuY2UgdG8gZ28gdGhyb3VnaCB0aGUgcGFja2VkIHJlc2hhcGVcbiAgICAgICAgICAgICAgICAvLyBzaGFkZXIuIFRoaXMgb25seSBoYXBwZW5zIHdoZW4gd2UgcmVzaGFwZSB0aGUgKnNhbWUqIHRlbnNvciB0byBmb3JtXG4gICAgICAgICAgICAgICAgLy8gKmRpc3RpbmN0KiBpbnB1dHMgdG8gYW4gb3AsIGUuZy4gZG90dGluZyBhIHZlY3RvciB3aXRoIGl0c2VsZi4gVGhpc1xuICAgICAgICAgICAgICAgIC8vIGNhc2Ugd2lsbCBkaXNhcHBlYXIgb25jZSBwYWNrZWQgdXBsb2FkaW5nIGlzIHRoZSBkZWZhdWx0LlxuICAgICAgICAgICAgICAgIGNvbnN0IHNhdmVkSW5wdXQgPSBpbnB1dDtcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRTaGFwZSA9IGlucHV0LnNoYXBlO1xuICAgICAgICAgICAgICAgIGlucHV0LnNoYXBlID0gdGV4RGF0YS5zaGFwZTtcbiAgICAgICAgICAgICAgICBpbnB1dCA9IHRoaXMucGFja2VkUmVzaGFwZShpbnB1dCwgdGFyZ2V0U2hhcGUpO1xuICAgICAgICAgICAgICAgIGRhdGFUb0Rpc3Bvc2UucHVzaChpbnB1dCk7XG4gICAgICAgICAgICAgICAgdGV4RGF0YSA9IHRoaXMudGV4RGF0YS5nZXQoaW5wdXQuZGF0YUlkKTtcbiAgICAgICAgICAgICAgICBzYXZlZElucHV0LnNoYXBlID0gdGFyZ2V0U2hhcGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnVwbG9hZFRvR1BVKGlucHV0LmRhdGFJZCk7XG4gICAgICAgICAgICByZXR1cm4geyBzaGFwZTogaW5wdXQuc2hhcGUsIHRleERhdGEsIGlzVW5pZm9ybTogZmFsc2UgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudXBsb2FkVG9HUFUob3V0cHV0LmRhdGFJZCk7XG4gICAgICAgIGNvbnN0IG91dHB1dERhdGEgPSB7IHNoYXBlOiBvdXRwdXQuc2hhcGUsIHRleERhdGE6IG91dERhdGEsIGlzVW5pZm9ybTogZmFsc2UgfTtcbiAgICAgICAgY29uc3Qga2V5ID0gZ3BncHVfbWF0aC5tYWtlU2hhZGVyS2V5KHByb2dyYW0sIGlucHV0c0RhdGEsIG91dHB1dERhdGEpO1xuICAgICAgICBjb25zdCBiaW5hcnkgPSB0aGlzLmdldEFuZFNhdmVCaW5hcnkoa2V5LCAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZ3BncHVfbWF0aC5jb21waWxlUHJvZ3JhbSh0aGlzLmdwZ3B1LCBwcm9ncmFtLCBpbnB1dHNEYXRhLCBvdXRwdXREYXRhKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHNob3VsZFRpbWVQcm9ncmFtID0gdGhpcy5hY3RpdmVUaW1lcnMgIT0gbnVsbDtcbiAgICAgICAgbGV0IHF1ZXJ5O1xuICAgICAgICBpZiAoc2hvdWxkVGltZVByb2dyYW0pIHtcbiAgICAgICAgICAgIHF1ZXJ5ID0gdGhpcy5zdGFydFRpbWVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgZ3BncHVfbWF0aC5ydW5Qcm9ncmFtKHRoaXMuZ3BncHUsIGJpbmFyeSwgaW5wdXRzRGF0YSwgb3V0cHV0RGF0YSwgY3VzdG9tVW5pZm9ybVZhbHVlcyk7XG4gICAgICAgIGRhdGFUb0Rpc3Bvc2UuZm9yRWFjaChpbmZvID0+IHRoaXMuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaW5mbykpO1xuICAgICAgICBpZiAoc2hvdWxkVGltZVByb2dyYW0pIHtcbiAgICAgICAgICAgIHF1ZXJ5ID0gdGhpcy5lbmRUaW1lcihxdWVyeSk7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZVRpbWVycy5wdXNoKHsgbmFtZTogcHJvZ3JhbS5jb25zdHJ1Y3Rvci5uYW1lLCBxdWVyeTogdGhpcy5nZXRRdWVyeVRpbWUocXVlcnkpIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGdsRmx1c2hUaHJlc2hvbGQgPSBlbnYoKS5nZXQoJ1dFQkdMX0ZMVVNIX1RIUkVTSE9MRCcpO1xuICAgICAgICAvLyBNYW51YWxseSBHTCBmbHVzaCByZXF1ZXN0ZWRcbiAgICAgICAgaWYgKGdsRmx1c2hUaHJlc2hvbGQgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCB0aW1lID0gdXRpbC5ub3coKTtcbiAgICAgICAgICAgIGlmICgodGltZSAtIHRoaXMubGFzdEdsRmx1c2hUaW1lKSA+IGdsRmx1c2hUaHJlc2hvbGQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdwZ3B1LmdsLmZsdXNoKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0R2xGbHVzaFRpbWUgPSB0aW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghZW52KCkuZ2V0Qm9vbCgnV0VCR0xfTEFaSUxZX1VOUEFDSycpICYmIG91dERhdGEuaXNQYWNrZWQgJiZcbiAgICAgICAgICAgIHByZXZlbnRFYWdlclVucGFja2luZ09mT3V0cHV0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgY29uc3QgdW5wYWNrZWQgPSB0aGlzLnVucGFja1RlbnNvcihvdXRwdXQpO1xuICAgICAgICAgICAgdGhpcy5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhvdXRwdXQpO1xuICAgICAgICAgICAgcmV0dXJuIHVucGFja2VkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfVxuICAgIGNvbXBpbGVBbmRSdW4ocHJvZ3JhbSwgaW5wdXRzLCBvdXRwdXREdHlwZSwgY3VzdG9tVW5pZm9ybVZhbHVlcywgcHJldmVudEVhZ2VyVW5wYWNraW5nT2ZPdXRwdXQgPSBmYWxzZSkge1xuICAgICAgICBvdXRwdXREdHlwZSA9IG91dHB1dER0eXBlIHx8IGlucHV0c1swXS5kdHlwZTtcbiAgICAgICAgY29uc3Qgb3V0SW5mbyA9IHRoaXMucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIGlucHV0cywgb3V0cHV0RHR5cGUsIGN1c3RvbVVuaWZvcm1WYWx1ZXMsIHByZXZlbnRFYWdlclVucGFja2luZ09mT3V0cHV0KTtcbiAgICAgICAgcmV0dXJuIG91dEluZm87XG4gICAgfVxuICAgIGdldEFuZFNhdmVCaW5hcnkoa2V5LCBnZXRCaW5hcnkpIHtcbiAgICAgICAgaWYgKCEoa2V5IGluIHRoaXMuYmluYXJ5Q2FjaGUpKSB7XG4gICAgICAgICAgICB0aGlzLmJpbmFyeUNhY2hlW2tleV0gPSBnZXRCaW5hcnkoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5iaW5hcnlDYWNoZVtrZXldO1xuICAgIH1cbiAgICBnZXRUZXh0dXJlTWFuYWdlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dHVyZU1hbmFnZXI7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmRpc3Bvc2VkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXZvaWQgZGlzcG9zaW5nIHRoZSBjb21waWxlZCB3ZWJnbCBwcm9ncmFtcyBkdXJpbmcgdW5pdCB0ZXN0aW5nIGJlY2F1c2VcbiAgICAgICAgLy8gaXQgc2xvd3MgZG93biB0ZXN0IGV4ZWN1dGlvbi5cbiAgICAgICAgaWYgKCFlbnYoKS5nZXRCb29sKCdJU19URVNUJykpIHtcbiAgICAgICAgICAgIGNvbnN0IGFsbEtleXMgPSBPYmplY3Qua2V5cyh0aGlzLmJpbmFyeUNhY2hlKTtcbiAgICAgICAgICAgIGFsbEtleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZ3BncHUuZGVsZXRlUHJvZ3JhbSh0aGlzLmJpbmFyeUNhY2hlW2tleV0ud2ViR0xQcm9ncmFtKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5iaW5hcnlDYWNoZVtrZXldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50ZXh0dXJlTWFuYWdlci5kaXNwb3NlKCk7XG4gICAgICAgIGlmICh0aGlzLmNhbnZhcyAhPSBudWxsICYmXG4gICAgICAgICAgICAodHlwZW9mIChIVE1MQ2FudmFzRWxlbWVudCkgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXMgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jYW52YXMgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmdwZ3B1Q3JlYXRlZExvY2FsbHkpIHtcbiAgICAgICAgICAgIHRoaXMuZ3BncHUucHJvZ3JhbSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmdwZ3B1LmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRpc3Bvc2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgZmxvYXRQcmVjaXNpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLmZsb2F0UHJlY2lzaW9uVmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5mbG9hdFByZWNpc2lvblZhbHVlID0gdGlkeSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFlbnYoKS5nZXQoJ1dFQkdMX1JFTkRFUl9GTE9BVDMyX0VOQUJMRUQnKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBNb21lbnRhcmlseSBzd2l0Y2hpbmcgREVCVUcgZmxhZyB0byBmYWxzZSBzbyB3ZSBkb24ndCB0aHJvdyBhblxuICAgICAgICAgICAgICAgICAgICAvLyBlcnJvciB0cnlpbmcgdG8gdXBsb2FkIGEgc21hbGwgdmFsdWUuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlYnVnRmxhZyA9IGVudigpLmdldEJvb2woJ0RFQlVHJyk7XG4gICAgICAgICAgICAgICAgICAgIGVudigpLnNldCgnREVCVUcnLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuZGVyZmxvd0NoZWNrVmFsdWUgPSB0aGlzLmFicyhzY2FsYXIoMWUtOCkpLmRhdGFTeW5jKClbMF07XG4gICAgICAgICAgICAgICAgICAgIGVudigpLnNldCgnREVCVUcnLCBkZWJ1Z0ZsYWcpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodW5kZXJmbG93Q2hlY2tWYWx1ZSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAzMjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gMTY7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5mbG9hdFByZWNpc2lvblZhbHVlO1xuICAgIH1cbiAgICAvKiogUmV0dXJucyB0aGUgc21hbGxlc3QgcmVwcmVzZW50YWJsZSBudW1iZXIuICAqL1xuICAgIGVwc2lsb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZsb2F0UHJlY2lzaW9uKCkgPT09IDMyID8gRVBTSUxPTl9GTE9BVDMyIDogRVBTSUxPTl9GTE9BVDE2O1xuICAgIH1cbiAgICB1cGxvYWRUb0dQVShkYXRhSWQpIHtcbiAgICAgICAgY29uc3QgdGV4RGF0YSA9IHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKTtcbiAgICAgICAgY29uc3QgeyBzaGFwZSwgZHR5cGUsIHZhbHVlcywgdGV4dHVyZSwgdXNhZ2UsIGlzUGFja2VkIH0gPSB0ZXhEYXRhO1xuICAgICAgICBpZiAodGV4dHVyZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBBcnJheSBpcyBhbHJlYWR5IG9uIEdQVS4gTm8tb3AuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2hvdWxkVGltZVByb2dyYW0gPSB0aGlzLmFjdGl2ZVRpbWVycyAhPSBudWxsO1xuICAgICAgICBsZXQgc3RhcnQ7XG4gICAgICAgIGlmIChzaG91bGRUaW1lUHJvZ3JhbSkge1xuICAgICAgICAgICAgc3RhcnQgPSB1dGlsLm5vdygpO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0ZXhTaGFwZSA9IHRleERhdGEudGV4U2hhcGU7XG4gICAgICAgIGlmICh0ZXhTaGFwZSA9PSBudWxsKSB7XG4gICAgICAgICAgICB0ZXhTaGFwZSA9IHdlYmdsX3V0aWwuZ2V0VGV4dHVyZVNoYXBlRnJvbUxvZ2ljYWxTaGFwZShzaGFwZSwgaXNQYWNrZWQpO1xuICAgICAgICAgICAgdGV4RGF0YS50ZXhTaGFwZSA9IHRleFNoYXBlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3Qgc2hhcGVBczNEID0gd2ViZ2xfdXRpbC5nZXRTaGFwZUFzM0Qoc2hhcGUpO1xuICAgICAgICAgICAgbGV0IHByb2dyYW07XG4gICAgICAgICAgICBsZXQgd2lkdGggPSB0ZXhTaGFwZVsxXSwgaGVpZ2h0ID0gdGV4U2hhcGVbMF07XG4gICAgICAgICAgICBjb25zdCBpc0J5dGVBcnJheSA9IHZhbHVlcyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXk7XG4gICAgICAgICAgICBpZiAoaXNQYWNrZWQpIHtcbiAgICAgICAgICAgICAgICBbd2lkdGgsIGhlaWdodF0gPSB0ZXhfdXRpbC5nZXRQYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodCh0ZXhTaGFwZVswXSwgdGV4U2hhcGVbMV0pO1xuICAgICAgICAgICAgICAgIHByb2dyYW0gPSBuZXcgRW5jb2RlTWF0cml4UGFja2VkUHJvZ3JhbShzaGFwZUFzM0QsIFtoZWlnaHQsIHdpZHRoXSwgaXNCeXRlQXJyYXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcHJvZ3JhbSA9XG4gICAgICAgICAgICAgICAgICAgIG5ldyBFbmNvZGVNYXRyaXhQcm9ncmFtKHNoYXBlQXMzRCwgW2hlaWdodCwgd2lkdGhdLCBpc0J5dGVBcnJheSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0ZW1wRGVuc2VJbnB1dEhhbmRsZSA9IHRoaXMubWFrZVRlbnNvckluZm8oW2hlaWdodCwgd2lkdGhdLCBkdHlwZSk7XG4gICAgICAgICAgICBpZiAoaXNCeXRlQXJyYXkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRleERhdGEuZ2V0KHRlbXBEZW5zZUlucHV0SGFuZGxlLmRhdGFJZCkudXNhZ2UgPVxuICAgICAgICAgICAgICAgICAgICBUZXh0dXJlVXNhZ2UuUElYRUxTO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy50ZXhEYXRhLmdldCh0ZW1wRGVuc2VJbnB1dEhhbmRsZS5kYXRhSWQpLnVzYWdlID1cbiAgICAgICAgICAgICAgICAgICAgVGV4dHVyZVVzYWdlLlVQTE9BRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZ3BncHUudXBsb2FkRGVuc2VNYXRyaXhUb1RleHR1cmUodGhpcy5nZXRUZXh0dXJlKHRlbXBEZW5zZUlucHV0SGFuZGxlLmRhdGFJZCksIHdpZHRoLCBoZWlnaHQsIHZhbHVlcyk7XG4gICAgICAgICAgICAvLyBXZSB3YW50IHRoZSBvdXRwdXQgdG8gcmVtYWluIHBhY2tlZCByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZSBvZlxuICAgICAgICAgICAgLy8gV0VCR0xfUEFDSy5cbiAgICAgICAgICAgIGNvbnN0IHByZXZlbnRFYWdlclVucGFja2luZyA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCBlbmNvZGVkT3V0cHV0VGFyZ2V0ID0gdGhpcy5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3RlbXBEZW5zZUlucHV0SGFuZGxlXSwgZHR5cGUsIG51bGwsIHByZXZlbnRFYWdlclVucGFja2luZyk7XG4gICAgICAgICAgICAvLyBIYXZlIHRoZSBvcmlnaW5hbCB0ZXh0dXJlIGFzc3VtZSB0aGUgaWRlbnRpdHkgb2YgdGhlIGVuY29kZWQgb3V0cHV0LlxuICAgICAgICAgICAgY29uc3Qgb3V0cHV0VGV4RGF0YSA9IHRoaXMudGV4RGF0YS5nZXQoZW5jb2RlZE91dHB1dFRhcmdldC5kYXRhSWQpO1xuICAgICAgICAgICAgdGV4RGF0YS50ZXh0dXJlID0gb3V0cHV0VGV4RGF0YS50ZXh0dXJlO1xuICAgICAgICAgICAgdGV4RGF0YS50ZXhTaGFwZSA9IG91dHB1dFRleERhdGEudGV4U2hhcGU7XG4gICAgICAgICAgICB0ZXhEYXRhLmlzUGFja2VkID0gb3V0cHV0VGV4RGF0YS5pc1BhY2tlZDtcbiAgICAgICAgICAgIHRleERhdGEudXNhZ2UgPSBvdXRwdXRUZXhEYXRhLnVzYWdlO1xuICAgICAgICAgICAgdGhpcy5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0ZW1wRGVuc2VJbnB1dEhhbmRsZSk7XG4gICAgICAgICAgICB0aGlzLnRleERhdGEuZGVsZXRlKGVuY29kZWRPdXRwdXRUYXJnZXQuZGF0YUlkKTtcbiAgICAgICAgICAgIC8vIE9uY2UgdXBsb2FkZWQsIGRvbid0IHN0b3JlIHRoZSB2YWx1ZXMgb24gY3B1LlxuICAgICAgICAgICAgdGV4RGF0YS52YWx1ZXMgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHNob3VsZFRpbWVQcm9ncmFtKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGxvYWRXYWl0TXMgKz0gdXRpbC5ub3coKSAtIHN0YXJ0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbmV3VGV4dHVyZSA9IHRoaXMuYWNxdWlyZVRleHR1cmUodGV4U2hhcGUsIHVzYWdlLCBkdHlwZSwgaXNQYWNrZWQpO1xuICAgICAgICAgICAgdGV4RGF0YS50ZXh0dXJlID0gbmV3VGV4dHVyZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb252ZXJ0QW5kQ2FjaGVPbkNQVShkYXRhSWQsIGZsb2F0MzJWYWx1ZXMpIHtcbiAgICAgICAgY29uc3QgdGV4RGF0YSA9IHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKTtcbiAgICAgICAgY29uc3QgeyBkdHlwZSB9ID0gdGV4RGF0YTtcbiAgICAgICAgdGhpcy5yZWxlYXNlR1BVRGF0YShkYXRhSWQpO1xuICAgICAgICBpZiAoZmxvYXQzMlZhbHVlcyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0ZXhEYXRhLnZhbHVlcyA9IGZsb2F0MzJUb1R5cGVkQXJyYXkoZmxvYXQzMlZhbHVlcywgZHR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0ZXhEYXRhLnZhbHVlcztcbiAgICB9XG4gICAgYWNxdWlyZVRleHR1cmUodGV4U2hhcGUsIHRleFR5cGUsIGR0eXBlLCBpc1BhY2tlZCkge1xuICAgICAgICB0aGlzLm51bUJ5dGVzSW5HUFUgKz0gdGhpcy5jb21wdXRlQnl0ZXModGV4U2hhcGUsIGR0eXBlKTtcbiAgICAgICAgaWYgKCF0aGlzLndhcm5lZEFib3V0TWVtb3J5ICYmXG4gICAgICAgICAgICB0aGlzLm51bUJ5dGVzSW5HUFUgPiB0aGlzLm51bU1CQmVmb3JlV2FybmluZyAqIDEwMjQgKiAxMDI0KSB7XG4gICAgICAgICAgICBjb25zdCBtYiA9ICh0aGlzLm51bUJ5dGVzSW5HUFUgLyAxMDI0IC8gMTAyNCkudG9GaXhlZCgyKTtcbiAgICAgICAgICAgIHRoaXMud2FybmVkQWJvdXRNZW1vcnkgPSB0cnVlO1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBIaWdoIG1lbW9yeSB1c2FnZSBpbiBHUFU6ICR7bWJ9IE1CLCBgICtcbiAgICAgICAgICAgICAgICBgbW9zdCBsaWtlbHkgZHVlIHRvIGEgbWVtb3J5IGxlYWtgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy50ZXh0dXJlTWFuYWdlci5hY3F1aXJlVGV4dHVyZSh0ZXhTaGFwZSwgdGV4VHlwZSwgaXNQYWNrZWQpO1xuICAgIH1cbiAgICBjb21wdXRlQnl0ZXMoc2hhcGUsIGR0eXBlKSB7XG4gICAgICAgIHJldHVybiBzaGFwZVswXSAqIHNoYXBlWzFdICogdXRpbC5ieXRlc1BlckVsZW1lbnQoZHR5cGUpO1xuICAgIH1cbn1cbk1hdGhCYWNrZW5kV2ViR0wubmV4dERhdGFJZCA9IDA7XG5mdW5jdGlvbiBmbG9hdDMyVG9UeXBlZEFycmF5KGEsIGR0eXBlKSB7XG4gICAgaWYgKGR0eXBlID09PSAnZmxvYXQzMicgfHwgZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICAgIHJldHVybiBhO1xuICAgIH1cbiAgICBlbHNlIGlmIChkdHlwZSA9PT0gJ2ludDMyJyB8fCBkdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IChkdHlwZSA9PT0gJ2ludDMyJykgPyBuZXcgSW50MzJBcnJheShhLmxlbmd0aCkgOlxuICAgICAgICAgICAgbmV3IFVpbnQ4QXJyYXkoYS5sZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgcmVzdWx0W2ldID0gTWF0aC5yb3VuZChhW2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGR0eXBlICR7ZHR5cGV9YCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmFja2VuZF93ZWJnbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vLyBiYXNlLnRzIGlzIHRoZSB3ZWJnbCBiYWNrZW5kIHdpdGhvdXQgYXV0byBrZXJuZWwgcmVnaXN0cmF0aW9uLlxuaW1wb3J0IHsgZGV2aWNlX3V0aWwsIHJlZ2lzdGVyQmFja2VuZCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBNYXRoQmFja2VuZFdlYkdMIH0gZnJvbSAnLi9iYWNrZW5kX3dlYmdsJztcbmV4cG9ydCB7IHZlcnNpb24gYXMgdmVyc2lvbl93ZWJnbCB9IGZyb20gJy4vdmVyc2lvbic7XG5pZiAoZGV2aWNlX3V0aWwuaXNCcm93c2VyKCkpIHtcbiAgICByZWdpc3RlckJhY2tlbmQoJ3dlYmdsJywgKCkgPT4gbmV3IE1hdGhCYWNrZW5kV2ViR0woKSwgMiAvKiBwcmlvcml0eSAqLyk7XG59XG4vLyBFeHBvcnQgd2ViZ2wgdXRpbGl0aWVzXG5leHBvcnQgKiBmcm9tICcuL3dlYmdsJztcbi8vIEV4cG9ydCBmb3JjZUhhbGZGbG9zdCB1bmRlciB3ZWJnbCBuYW1lc3BhY2UgZm9yIHRoZSB1bmlvbiBidW5kbGUuXG5pbXBvcnQgeyBmb3JjZUhhbGZGbG9hdCB9IGZyb20gJy4vd2ViZ2wnO1xuZXhwb3J0IGNvbnN0IHdlYmdsID0geyBmb3JjZUhhbGZGbG9hdCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmFzZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGNsYXNzIEJhdGNoTm9ybVByb2dyYW0ge1xuICAgIGNvbnN0cnVjdG9yKHhTaGFwZSwgbWVhblNoYXBlLCB2YXJpYW5jZVNoYXBlLCBvZmZzZXRTaGFwZSwgc2NhbGVTaGFwZSwgdmFyaWFuY2VFcHNpbG9uKSB7XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBbXTtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWyd4JywgJ21lYW4nLCAndmFyaWFuY2UnXTtcbiAgICAgICAgYmFja2VuZF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKHhTaGFwZSwgbWVhblNoYXBlKTtcbiAgICAgICAgYmFja2VuZF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKHhTaGFwZSwgdmFyaWFuY2VTaGFwZSk7XG4gICAgICAgIGxldCBvZmZzZXRTbmlwcGV0ID0gJzAuMCc7XG4gICAgICAgIGlmIChvZmZzZXRTaGFwZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoeFNoYXBlLCBvZmZzZXRTaGFwZSk7XG4gICAgICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMucHVzaCgnb2Zmc2V0Jyk7XG4gICAgICAgICAgICBvZmZzZXRTbmlwcGV0ID0gJ2dldE9mZnNldEF0T3V0Q29vcmRzKCknO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzY2FsZVNuaXBwZXQgPSAnMS4wJztcbiAgICAgICAgaWYgKHNjYWxlU2hhcGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgYmFja2VuZF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKHhTaGFwZSwgc2NhbGVTaGFwZSk7XG4gICAgICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMucHVzaCgnc2NhbGUnKTtcbiAgICAgICAgICAgIHNjYWxlU25pcHBldCA9ICdnZXRTY2FsZUF0T3V0Q29vcmRzKCknO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSB4U2hhcGU7XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGZsb2F0IHggPSBnZXRYQXRPdXRDb29yZHMoKTtcbiAgICAgICAgZmxvYXQgbWVhbiA9IGdldE1lYW5BdE91dENvb3JkcygpO1xuICAgICAgICBmbG9hdCB2YXJpYW5jZSA9IGdldFZhcmlhbmNlQXRPdXRDb29yZHMoKTtcbiAgICAgICAgZmxvYXQgb2Zmc2V0ID0gJHtvZmZzZXRTbmlwcGV0fTtcbiAgICAgICAgZmxvYXQgc2NhbGUgPSAke3NjYWxlU25pcHBldH07XG4gICAgICAgIGZsb2F0IGludiA9IHNjYWxlICogaW52ZXJzZXNxcnQodmFyaWFuY2UgKyBmbG9hdCgke3ZhcmlhbmNlRXBzaWxvbn0pKTtcbiAgICAgICAgc2V0T3V0cHV0KGRvdCh2ZWMzKHgsIC1tZWFuLCBvZmZzZXQpLCB2ZWMzKGludiwgaW52LCAxKSkpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmF0Y2hub3JtX2dwdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGNsYXNzIEJhdGNoTm9ybVBhY2tlZFByb2dyYW0ge1xuICAgIGNvbnN0cnVjdG9yKHhTaGFwZSwgbWVhblNoYXBlLCB2YXJpYW5jZVNoYXBlLCBvZmZzZXRTaGFwZSwgc2NhbGVTaGFwZSwgdmFyaWFuY2VFcHNpbG9uKSB7XG4gICAgICAgIHRoaXMucGFja2VkSW5wdXRzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wYWNrZWRPdXRwdXQgPSB0cnVlO1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ3gnLCAnbWVhbicsICd2YXJpYW5jZSddO1xuICAgICAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoeFNoYXBlLCBtZWFuU2hhcGUpO1xuICAgICAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoeFNoYXBlLCB2YXJpYW5jZVNoYXBlKTtcbiAgICAgICAgbGV0IG9mZnNldFNuaXBwZXQgPSAndmVjNCgwLjApJztcbiAgICAgICAgaWYgKG9mZnNldFNoYXBlICE9IG51bGwpIHtcbiAgICAgICAgICAgIGJhY2tlbmRfdXRpbC5hc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSh4U2hhcGUsIG9mZnNldFNoYXBlKTtcbiAgICAgICAgICAgIHRoaXMudmFyaWFibGVOYW1lcy5wdXNoKCdvZmZzZXQnKTtcbiAgICAgICAgICAgIG9mZnNldFNuaXBwZXQgPSAnZ2V0T2Zmc2V0QXRPdXRDb29yZHMoKSc7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHNjYWxlU25pcHBldCA9ICd2ZWM0KDEuMCknO1xuICAgICAgICBpZiAoc2NhbGVTaGFwZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoeFNoYXBlLCBzY2FsZVNoYXBlKTtcbiAgICAgICAgICAgIHRoaXMudmFyaWFibGVOYW1lcy5wdXNoKCdzY2FsZScpO1xuICAgICAgICAgICAgc2NhbGVTbmlwcGV0ID0gJ2dldFNjYWxlQXRPdXRDb29yZHMoKSc7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IHhTaGFwZTtcbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgdmVjNCBvZmZzZXQgPSAke29mZnNldFNuaXBwZXR9O1xuICAgICAgICB2ZWM0IHNjYWxlID0gJHtzY2FsZVNuaXBwZXR9O1xuXG4gICAgICAgIHZlYzQgeCA9IGdldFhBdE91dENvb3JkcygpO1xuICAgICAgICB2ZWM0IG1lYW4gPSBnZXRNZWFuQXRPdXRDb29yZHMoKTtcbiAgICAgICAgdmVjNCB2YXJpYW5jZSA9IGdldFZhcmlhbmNlQXRPdXRDb29yZHMoKTtcblxuICAgICAgICB2ZWM0IGludiA9IHNjYWxlICogaW52ZXJzZXNxcnQodmFyaWFuY2UgKyB2ZWM0KCR7dmFyaWFuY2VFcHNpbG9ufSkpO1xuXG4gICAgICAgIHNldE91dHB1dCgoeCAtIG1lYW4pICogaW52ICsgb2Zmc2V0KTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJhdGNobm9ybV9wYWNrZWRfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG4vLyAoQXIgKyBBaSkoQnIgKyBCaSkgPVxuLy8gQXJCciArIEFyQmkgKyBBaUJyICsgQWlCaSA9IEFyQnIgLSBBQiArIEFyQmkgKyBBaUJyXG4vLyBZciA9IEFyQnIgLSBBQlxuLy8gWWkgPSBBckJpICsgQWlCclxuZXhwb3J0IGNvbnN0IENPTVBMRVhfTVVMVElQTFkgPSB7XG4gICAgUkVBTDogJ3JldHVybiBhcmVhbCAqIGJyZWFsIC0gYWltYWcgKiBiaW1hZzsnLFxuICAgIElNQUc6ICdyZXR1cm4gYXJlYWwgKiBiaW1hZyArIGFpbWFnICogYnJlYWw7J1xufTtcbmV4cG9ydCBjbGFzcyBCaW5hcnlPcENvbXBsZXhQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3RvcihvcCwgYVNoYXBlLCBiU2hhcGUpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWydBUmVhbCcsICdBSW1hZycsICdCUmVhbCcsICdCSW1hZyddO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gYmFja2VuZF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKGFTaGFwZSwgYlNoYXBlKTtcbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGZsb2F0IGJpbmFyeU9wQ29tcGxleChcbiAgICAgICAgICBmbG9hdCBhcmVhbCwgZmxvYXQgYWltYWcsIGZsb2F0IGJyZWFsLCBmbG9hdCBiaW1hZykge1xuICAgICAgICAke29wfVxuICAgICAgfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGZsb2F0IGFyZWFsID0gZ2V0QVJlYWxBdE91dENvb3JkcygpO1xuICAgICAgICBmbG9hdCBhaW1hZyA9IGdldEFJbWFnQXRPdXRDb29yZHMoKTtcbiAgICAgICAgZmxvYXQgYnJlYWwgPSBnZXRCUmVhbEF0T3V0Q29vcmRzKCk7XG4gICAgICAgIGZsb2F0IGJpbWFnID0gZ2V0QkltYWdBdE91dENvb3JkcygpO1xuICAgICAgICBzZXRPdXRwdXQoYmluYXJ5T3BDb21wbGV4KGFyZWFsLCBhaW1hZywgYnJlYWwsIGJpbWFnKSk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iaW5hcnlvcF9jb21wbGV4X2dwdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdXNlU2hhcGVVbmlmb3JtcyB9IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5leHBvcnQgY29uc3QgQ0hFQ0tfTkFOX1NOSVBQRVQgPSBgXG4gIGlmIChpc25hbihhKSkgcmV0dXJuIGE7XG4gIGlmIChpc25hbihiKSkgcmV0dXJuIGI7XG5gO1xuZXhwb3J0IGNvbnN0IFNRVUFSRURfRElGRkVSRU5DRSA9ICdyZXR1cm4gKGEgLSBiKSAqIChhIC0gYik7JztcbmV4cG9ydCBjbGFzcyBCaW5hcnlPcFByb2dyYW0ge1xuICAgIGNvbnN0cnVjdG9yKG9wLCBhU2hhcGUsIGJTaGFwZSkge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ0EnLCAnQiddO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gYmFja2VuZF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKGFTaGFwZSwgYlNoYXBlKTtcbiAgICAgICAgdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID0gdXNlU2hhcGVVbmlmb3Jtcyh0aGlzLm91dHB1dFNoYXBlLmxlbmd0aCk7XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBmbG9hdCBiaW5hcnlPcGVyYXRpb24oZmxvYXQgYSwgZmxvYXQgYikge1xuICAgICAgICAke29wfVxuICAgICAgfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGZsb2F0IGEgPSBnZXRBQXRPdXRDb29yZHMoKTtcbiAgICAgICAgZmxvYXQgYiA9IGdldEJBdE91dENvb3JkcygpO1xuICAgICAgICBzZXRPdXRwdXQoYmluYXJ5T3BlcmF0aW9uKGEsIGIpKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJpbmFyeW9wX2dwdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdXNlU2hhcGVVbmlmb3JtcyB9IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5pbXBvcnQgeyBnZXRDaGFubmVscyB9IGZyb20gJy4vcGFja2luZ191dGlsJztcbmltcG9ydCB7IGdldENvb3Jkc0RhdGFUeXBlIH0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuZXhwb3J0IGNvbnN0IENIRUNLX05BTl9TTklQUEVUID0gYFxuICByZXN1bHQuciA9IGlzTmFOLnIgPiAwLiA/IE5BTiA6IHJlc3VsdC5yO1xuICByZXN1bHQuZyA9IGlzTmFOLmcgPiAwLiA/IE5BTiA6IHJlc3VsdC5nO1xuICByZXN1bHQuYiA9IGlzTmFOLmIgPiAwLiA/IE5BTiA6IHJlc3VsdC5iO1xuICByZXN1bHQuYSA9IGlzTmFOLmEgPiAwLiA/IE5BTiA6IHJlc3VsdC5hO1xuYDtcbmV4cG9ydCBjb25zdCBFTFVfREVSID0gYFxuICB2ZWM0IGJHVEVaZXJvID0gdmVjNChncmVhdGVyVGhhbkVxdWFsKGIsIHZlYzQoMC4pKSk7XG4gIHJldHVybiAoYkdURVplcm8gKiBhKSArICgodmVjNCgxLjApIC0gYkdURVplcm8pICogKGEgKiAoYiArIHZlYzQoMS4wKSkpKTtcbmA7XG5leHBvcnQgY29uc3QgTk9UX0VRVUFMID0gYFxuICByZXR1cm4gdmVjNChub3RFcXVhbChhLCBiKSk7XG5gO1xuZXhwb3J0IGNsYXNzIEJpbmFyeU9wUGFja2VkUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3Iob3AsIGFTaGFwZSwgYlNoYXBlLCBjaGVja091dE9mQm91bmRzID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWydBJywgJ0InXTtcbiAgICAgICAgdGhpcy5zdXBwb3J0c0Jyb2FkY2FzdGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMucGFja2VkSW5wdXRzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wYWNrZWRPdXRwdXQgPSB0cnVlO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gYmFja2VuZF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKGFTaGFwZSwgYlNoYXBlKTtcbiAgICAgICAgY29uc3QgcmFuayA9IHRoaXMub3V0cHV0U2hhcGUubGVuZ3RoO1xuICAgICAgICB0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMgPSB1c2VTaGFwZVVuaWZvcm1zKHJhbmspO1xuICAgICAgICBsZXQgY2hlY2tPdXRPZkJvdW5kc1N0cmluZyA9ICcnO1xuICAgICAgICBpZiAoY2hlY2tPdXRPZkJvdW5kcykge1xuICAgICAgICAgICAgaWYgKHJhbmsgPT09IDAgfHwgdXRpbC5zaXplRnJvbVNoYXBlKHRoaXMub3V0cHV0U2hhcGUpID09PSAxKSB7XG4gICAgICAgICAgICAgICAgY2hlY2tPdXRPZkJvdW5kc1N0cmluZyA9IGBcbiAgICAgICAgICByZXN1bHQueSA9IDAuO1xuICAgICAgICAgIHJlc3VsdC56ID0gMC47XG4gICAgICAgICAgcmVzdWx0LncgPSAwLjtcbiAgICAgICAgYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGR0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUocmFuayk7XG4gICAgICAgICAgICAgICAgY2hlY2tPdXRPZkJvdW5kc1N0cmluZyA9IGBcbiAgICAgICAgICAke2R0eXBlfSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgYDtcbiAgICAgICAgICAgICAgICBpZiAocmFuayA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja091dE9mQm91bmRzU3RyaW5nICs9IGBcbiAgICAgICAgICAgIHJlc3VsdC55ID0gKGNvb3JkcyArIDEpID49IG91dFNoYXBlID8gMC4gOiByZXN1bHQueTtcbiAgICAgICAgICAgIHJlc3VsdC56ID0gMC47XG4gICAgICAgICAgICByZXN1bHQudyA9IDAuO1xuICAgICAgICAgIGA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja091dE9mQm91bmRzU3RyaW5nICs9IGBcbiAgICAgICAgICAgIHJlc3VsdC55ID0gKGNvb3JkcyArIDEpID49ICR7dGhpcy5vdXRwdXRTaGFwZVswXX0gPyAwLiA6IHJlc3VsdC55O1xuICAgICAgICAgICAgcmVzdWx0LnogPSAwLjtcbiAgICAgICAgICAgIHJlc3VsdC53ID0gMC47XG4gICAgICAgICAgYDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhbm5lbHMgPSBnZXRDaGFubmVscygnY29vcmRzJywgcmFuayk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrT3V0T2ZCb3VuZHNTdHJpbmcgKz0gYFxuICAgICAgICAgICAgYm9vbCBuZXh0Um93T3V0T2ZCb3VuZHMgPVxuICAgICAgICAgICAgICAoJHtjaGFubmVsc1tyYW5rIC0gMl19ICsgMSkgPj0gb3V0U2hhcGVbJHtyYW5rfSAtIDJdO1xuICAgICAgICAgICAgYm9vbCBuZXh0Q29sT3V0T2ZCb3VuZHMgPVxuICAgICAgICAgICAgICAoJHtjaGFubmVsc1tyYW5rIC0gMV19ICsgMSkgPj0gb3V0U2hhcGVbJHtyYW5rfSAtIDFdO1xuICAgICAgICAgICAgcmVzdWx0LnkgPSBuZXh0Q29sT3V0T2ZCb3VuZHMgPyAwLiA6IHJlc3VsdC55O1xuICAgICAgICAgICAgcmVzdWx0LnogPSBuZXh0Um93T3V0T2ZCb3VuZHMgPyAwLiA6IHJlc3VsdC56O1xuICAgICAgICAgICAgcmVzdWx0LncgPSBuZXh0Q29sT3V0T2ZCb3VuZHMgfHwgbmV4dFJvd091dE9mQm91bmRzID8gMC4gOiByZXN1bHQudztcbiAgICAgICAgICBgO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tPdXRPZkJvdW5kc1N0cmluZyArPSBgXG4gICAgICAgICAgICBib29sIG5leHRSb3dPdXRPZkJvdW5kcyA9XG4gICAgICAgICAgICAgICgke2NoYW5uZWxzW3JhbmsgLSAyXX0gKyAxKSA+PSAke3RoaXMub3V0cHV0U2hhcGVbcmFuayAtIDJdfTtcbiAgICAgICAgICAgIGJvb2wgbmV4dENvbE91dE9mQm91bmRzID1cbiAgICAgICAgICAgICAgKCR7Y2hhbm5lbHNbcmFuayAtIDFdfSArIDEpID49ICR7dGhpcy5vdXRwdXRTaGFwZVtyYW5rIC0gMV19O1xuICAgICAgICAgICAgcmVzdWx0LnkgPSBuZXh0Q29sT3V0T2ZCb3VuZHMgPyAwLiA6IHJlc3VsdC55O1xuICAgICAgICAgICAgcmVzdWx0LnogPSBuZXh0Um93T3V0T2ZCb3VuZHMgPyAwLiA6IHJlc3VsdC56O1xuICAgICAgICAgICAgcmVzdWx0LncgPSBuZXh0Q29sT3V0T2ZCb3VuZHMgfHwgbmV4dFJvd091dE9mQm91bmRzID8gMC4gOiByZXN1bHQudztcbiAgICAgICAgICBgO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2ZWM0IGJpbmFyeU9wZXJhdGlvbih2ZWM0IGEsIHZlYzQgYikge1xuICAgICAgICAke29wfVxuICAgICAgfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIHZlYzQgYSA9IGdldEFBdE91dENvb3JkcygpO1xuICAgICAgICB2ZWM0IGIgPSBnZXRCQXRPdXRDb29yZHMoKTtcblxuICAgICAgICB2ZWM0IHJlc3VsdCA9IGJpbmFyeU9wZXJhdGlvbihhLCBiKTtcbiAgICAgICAgJHtjaGVja091dE9mQm91bmRzU3RyaW5nfVxuXG4gICAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmluYXJ5b3BfcGFja2VkX2dwdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5jb25zdCBjb250ZXh0cyA9IHt9O1xuY29uc3QgV0VCR0xfQVRUUklCVVRFUyA9IHtcbiAgICBhbHBoYTogZmFsc2UsXG4gICAgYW50aWFsaWFzOiBmYWxzZSxcbiAgICBwcmVtdWx0aXBsaWVkQWxwaGE6IGZhbHNlLFxuICAgIHByZXNlcnZlRHJhd2luZ0J1ZmZlcjogZmFsc2UsXG4gICAgZGVwdGg6IGZhbHNlLFxuICAgIHN0ZW5jaWw6IGZhbHNlLFxuICAgIGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ6IHRydWVcbn07XG5leHBvcnQgZnVuY3Rpb24gY2xlYXJXZWJHTENvbnRleHQod2ViR0xWZXJzaW9uKSB7XG4gICAgZGVsZXRlIGNvbnRleHRzW3dlYkdMVmVyc2lvbl07XG59XG5leHBvcnQgZnVuY3Rpb24gc2V0V2ViR0xDb250ZXh0KHdlYkdMVmVyc2lvbiwgZ2wpIHtcbiAgICBjb250ZXh0c1t3ZWJHTFZlcnNpb25dID0gZ2w7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0V2ViR0xDb250ZXh0KHdlYkdMVmVyc2lvbikge1xuICAgIGlmICghKHdlYkdMVmVyc2lvbiBpbiBjb250ZXh0cykpIHtcbiAgICAgICAgY29uc3QgbmV3Q3R4ID0gZ2V0V2ViR0xSZW5kZXJpbmdDb250ZXh0KHdlYkdMVmVyc2lvbik7XG4gICAgICAgIGlmIChuZXdDdHggIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnRleHRzW3dlYkdMVmVyc2lvbl0gPSBuZXdDdHg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnQ291bGQgbm90IGdldCBjb250ZXh0IGZvciBXZWJHTCB2ZXJzaW9uJywgd2ViR0xWZXJzaW9uKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGdsID0gY29udGV4dHNbd2ViR0xWZXJzaW9uXTtcbiAgICBpZiAoZ2wuaXNDb250ZXh0TG9zdCgpKSB7XG4gICAgICAgIGRlbGV0ZSBjb250ZXh0c1t3ZWJHTFZlcnNpb25dO1xuICAgICAgICByZXR1cm4gZ2V0V2ViR0xDb250ZXh0KHdlYkdMVmVyc2lvbik7XG4gICAgfVxuICAgIGdsLmRpc2FibGUoZ2wuREVQVEhfVEVTVCk7XG4gICAgZ2wuZGlzYWJsZShnbC5TVEVOQ0lMX1RFU1QpO1xuICAgIGdsLmRpc2FibGUoZ2wuQkxFTkQpO1xuICAgIGdsLmRpc2FibGUoZ2wuRElUSEVSKTtcbiAgICBnbC5kaXNhYmxlKGdsLlBPTFlHT05fT0ZGU0VUX0ZJTEwpO1xuICAgIGdsLmRpc2FibGUoZ2wuU0FNUExFX0NPVkVSQUdFKTtcbiAgICBnbC5lbmFibGUoZ2wuU0NJU1NPUl9URVNUKTtcbiAgICBnbC5lbmFibGUoZ2wuQ1VMTF9GQUNFKTtcbiAgICBnbC5jdWxsRmFjZShnbC5CQUNLKTtcbiAgICByZXR1cm4gY29udGV4dHNbd2ViR0xWZXJzaW9uXTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUNhbnZhcyh3ZWJHTFZlcnNpb24pIHtcbiAgICBpZiAodHlwZW9mIE9mZnNjcmVlbkNhbnZhcyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2ViR0xWZXJzaW9uID09PSAyKSB7XG4gICAgICAgIHJldHVybiBuZXcgT2Zmc2NyZWVuQ2FudmFzKDMwMCwgMTUwKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjcmVhdGUgYSBjYW52YXMgaW4gdGhpcyBjb250ZXh0Jyk7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0V2ViR0xSZW5kZXJpbmdDb250ZXh0KHdlYkdMVmVyc2lvbikge1xuICAgIGlmICh3ZWJHTFZlcnNpb24gIT09IDEgJiYgd2ViR0xWZXJzaW9uICE9PSAyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGdldCBXZWJHTCByZW5kZXJpbmcgY29udGV4dCwgV2ViR0wgaXMgZGlzYWJsZWQuJyk7XG4gICAgfVxuICAgIGNvbnN0IGNhbnZhcyA9IGNyZWF0ZUNhbnZhcyh3ZWJHTFZlcnNpb24pO1xuICAgIGNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCd3ZWJnbGNvbnRleHRsb3N0JywgKGV2KSA9PiB7XG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGRlbGV0ZSBjb250ZXh0c1t3ZWJHTFZlcnNpb25dO1xuICAgIH0sIGZhbHNlKTtcbiAgICBpZiAod2ViR0xWZXJzaW9uID09PSAxKSB7XG4gICAgICAgIHJldHVybiAoY2FudmFzLmdldENvbnRleHQoJ3dlYmdsJywgV0VCR0xfQVRUUklCVVRFUykgfHxcbiAgICAgICAgICAgIGNhbnZhcy5nZXRDb250ZXh0KCdleHBlcmltZW50YWwtd2ViZ2wnLCBXRUJHTF9BVFRSSUJVVEVTKSk7XG4gICAgfVxuICAgIHJldHVybiBjYW52YXMuZ2V0Q29udGV4dCgnd2ViZ2wyJywgV0VCR0xfQVRUUklCVVRFUyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jYW52YXNfdXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5leHBvcnQgY2xhc3MgQ2xpcFByb2dyYW0ge1xuICAgIGNvbnN0cnVjdG9yKGFTaGFwZSkge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgICAgICAgdGhpcy5jdXN0b21Vbmlmb3JtcyA9IFtcbiAgICAgICAgICAgIHsgbmFtZTogJ21pblZhbCcsIHR5cGU6ICdmbG9hdCcgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ21heFZhbCcsIHR5cGU6ICdmbG9hdCcgfVxuICAgICAgICBdO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gYVNoYXBlO1xuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGZsb2F0IHZhbHVlID0gZ2V0QUF0T3V0Q29vcmRzKCk7XG4gICAgICAgIGlmIChpc25hbih2YWx1ZSkpIHtcbiAgICAgICAgICBzZXRPdXRwdXQodmFsdWUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHNldE91dHB1dChjbGFtcCh2YWx1ZSwgbWluVmFsLCBtYXhWYWwpKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNsaXBfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmV4cG9ydCBjbGFzcyBDbGlwUGFja2VkUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoYVNoYXBlKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICAgICAgICB0aGlzLnBhY2tlZElucHV0cyA9IHRydWU7XG4gICAgICAgIHRoaXMucGFja2VkT3V0cHV0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jdXN0b21Vbmlmb3JtcyA9IFtcbiAgICAgICAgICAgIHsgbmFtZTogJ21pblZhbCcsIHR5cGU6ICdmbG9hdCcgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ21heFZhbCcsIHR5cGU6ICdmbG9hdCcgfVxuICAgICAgICBdO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gYVNoYXBlO1xuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICB2ZWM0IHZhbHVlID0gZ2V0QUF0T3V0Q29vcmRzKCk7XG5cbiAgICAgICAgaWYgKGFueShpc25hbih2YWx1ZSkpKSB7XG4gICAgICAgICAgc2V0T3V0cHV0KHZhbHVlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBzZXRPdXRwdXQoY2xhbXAodmFsdWUsIHZlYzQobWluVmFsKSwgdmVjNChtYXhWYWwpKSk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jbGlwX3BhY2tlZF9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuZXhwb3J0IGNsYXNzIENvbXBsZXhBYnNQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3RvcihzaGFwZSkge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ3JlYWwnLCAnaW1hZyddO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gc2hhcGU7XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGZsb2F0IHJlID0gYWJzKGdldFJlYWxBdE91dENvb3JkcygpKTtcbiAgICAgICAgZmxvYXQgaW0gPSBhYnMoZ2V0SW1hZ0F0T3V0Q29vcmRzKCkpO1xuICAgICAgICBmbG9hdCBteCA9IG1heChyZSwgaW0pO1xuXG4gICAgICAgIC8vIHNhZGx5IHRoZSBsZW5ndGggZnVuY3Rpb24gaW4gZ2xzbCBpcyBub3QgdW5kZXJmbG93LXNhZmVcbiAgICAgICAgLy8gKGF0IGxlYXN0IG5vdCBvbiBJbnRlbCBHUFVzKS4gU28gdGhlIHNhZmUgc29sdXRpb24gaXNcbiAgICAgICAgLy8gdG8gZW5zdXJlIHVuZGVyZmxvdy1zYWZldHkgaW4gYWxsIGNhc2VzLlxuICAgICAgICBzZXRPdXRwdXQoXG4gICAgICAgICAgbXggPT0gMC4wID8gMC4wIDogbXggKiBsZW5ndGgodmVjMigxLCBtaW4ocmUsIGltKS9teCkpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb21wbGV4X2Fic19ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBjbGFzcyBDb25jYXRQcm9ncmFtIHtcbiAgICAvLyBDb25jYXRzIDJkIHRlbnNvcnMgYWxvbmcgYXhpcz0xLiBTZWUgY29tbWVudHMgaW4gTWF0aEJhY2tlbmRXZWJHTC5jb25jYXQoKS5cbiAgICBjb25zdHJ1Y3RvcihzaGFwZXMpIHtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IFtdO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gYmFja2VuZF91dGlsLmNvbXB1dGVPdXRTaGFwZShzaGFwZXMsIDEgLyogYXhpcyAqLyk7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IHNoYXBlcy5tYXAoKF8sIGkpID0+IGBUJHtpfWApO1xuICAgICAgICBjb25zdCBvZmZzZXRzID0gbmV3IEFycmF5KHNoYXBlcy5sZW5ndGggLSAxKTtcbiAgICAgICAgb2Zmc2V0c1swXSA9IHNoYXBlc1swXVsxXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBvZmZzZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBvZmZzZXRzW2ldID0gb2Zmc2V0c1tpIC0gMV0gKyBzaGFwZXNbaV1bMV07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc25pcHBldHMgPSBbYGlmICh5QyA8ICR7b2Zmc2V0c1swXX0pIHNldE91dHB1dChnZXRUMCh5UiwgeUMpKTtgXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBvZmZzZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzaGlmdCA9IG9mZnNldHNbaSAtIDFdO1xuICAgICAgICAgICAgc25pcHBldHMucHVzaChgZWxzZSBpZiAoeUMgPCAke29mZnNldHNbaV19KSBgICtcbiAgICAgICAgICAgICAgICBgc2V0T3V0cHV0KGdldFQke2l9KHlSLCB5Qy0ke3NoaWZ0fSkpO2ApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxhc3RJbmRleCA9IG9mZnNldHMubGVuZ3RoO1xuICAgICAgICBjb25zdCBsYXN0U2hpZnQgPSBvZmZzZXRzW29mZnNldHMubGVuZ3RoIC0gMV07XG4gICAgICAgIHNuaXBwZXRzLnB1c2goYGVsc2Ugc2V0T3V0cHV0KGdldFQke2xhc3RJbmRleH0oeVIsIHlDLSR7bGFzdFNoaWZ0fSkpO2ApO1xuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMiBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IHlSID0gY29vcmRzLng7XG4gICAgICAgIGludCB5QyA9IGNvb3Jkcy55O1xuXG4gICAgICAgICR7c25pcHBldHMuam9pbignXFxuICAgICAgICAnKX1cbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbmNhdF9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGdldENoYW5uZWxzIH0gZnJvbSAnLi9wYWNraW5nX3V0aWwnO1xuaW1wb3J0IHsgZ2V0Q29vcmRzRGF0YVR5cGUgfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5leHBvcnQgY2xhc3MgQ29uY2F0UGFja2VkUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3Ioc2hhcGVzLCBheGlzKSB7XG4gICAgICAgIHRoaXMucGFja2VkSW5wdXRzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wYWNrZWRPdXRwdXQgPSB0cnVlO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gW107XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dFNoYXBlKHNoYXBlcywgYXhpcyk7XG4gICAgICAgIGNvbnN0IHNoYXBlID0gdGhpcy5vdXRwdXRTaGFwZTtcbiAgICAgICAgY29uc3QgcmFuayA9IHNoYXBlLmxlbmd0aDtcbiAgICAgICAgY29uc3QgZHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShyYW5rKTtcbiAgICAgICAgY29uc3QgY29vcmRzID0gZ2V0Q2hhbm5lbHMoJ2Nvb3JkcycsIHJhbmspO1xuICAgICAgICBjb25zdCBjaGFubmVscyA9IFsneCcsICd5JywgJ3onLCAndycsICd1JywgJ3YnXS5zbGljZSgwLCByYW5rKTtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gc2hhcGVzLm1hcCgoXywgaSkgPT4gYFQke2l9YCk7XG4gICAgICAgIGNvbnN0IG9mZnNldHMgPSBuZXcgQXJyYXkoc2hhcGVzLmxlbmd0aCAtIDEpO1xuICAgICAgICBvZmZzZXRzWzBdID0gc2hhcGVzWzBdW2F4aXNdO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IG9mZnNldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIG9mZnNldHNbaV0gPSBvZmZzZXRzW2kgLSAxXSArIHNoYXBlc1tpXVtheGlzXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjaGFubmVsID0gY2hhbm5lbHNbYXhpc107XG4gICAgICAgIGNvbnN0IGxhc3RDaGFubmVscyA9IGNoYW5uZWxzLnNsaWNlKC0yKTtcbiAgICAgICAgY29uc3QgYWxsQ2hhbm5lbHMgPSBjaGFubmVscy5qb2luKCk7XG4gICAgICAgIGxldCBnZXRWYWx1ZVNuaXBwZXQgPSBgaWYgKCR7Y2hhbm5lbH0gPCAke29mZnNldHNbMF19KSB7XG4gICAgICAgIHJldHVybiBnZXRDaGFubmVsKFxuICAgICAgICAgICAgZ2V0VDAoJHthbGxDaGFubmVsc30pLCB2ZWMyKCR7bGFzdENoYW5uZWxzLmpvaW4oKX0pKTtcbiAgICAgICAgfWA7XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgb2Zmc2V0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgc2hpZnQgPSBvZmZzZXRzW2kgLSAxXTtcbiAgICAgICAgICAgIC8vIE5vdGU6IHRoZSA+PSBjb21wYXJpc29uIGJlbG93IG1heSBzZWVtIHVubmVjZXNzYXJ5IGdpdmVuIHRoZSBjaGVja1xuICAgICAgICAgICAgLy8gYWJvdmUgYnV0IGlzIG5lZWRlZCB0byB3b3JrYXJvdW5kIGJyYW5jaCBleGVjdXRpb24gaXNzdWVzIG9uIHNvbWVcbiAgICAgICAgICAgIC8vIGRldmljZXMuIEl0IG1ha2VzIGFsbCB0aGUgY29uZGl0aW9ucyBleGNsdXNpdmUgd2l0aG91dCByZWx5aW5nIG9uXG4gICAgICAgICAgICAvLyBleGVjdXRpb24gb3JkZXIuXG4gICAgICAgICAgICBnZXRWYWx1ZVNuaXBwZXQgKz0gYFxuICAgICAgICBpZiAoJHtjaGFubmVsfSA8ICR7b2Zmc2V0c1tpXX0gICYmICR7Y2hhbm5lbH0gPj0gJHtvZmZzZXRzW2kgLSAxXX0pIHtcbiAgICAgICAgICByZXR1cm4gZ2V0Q2hhbm5lbChcbiAgICAgICAgICAgIGdldFQke2l9KCR7c2hpZnRlZENoYW5uZWxzKGNoYW5uZWxzLCBjaGFubmVsLCBzaGlmdCl9KSxcbiAgICAgICAgICAgIHZlYzIoJHtzaGlmdGVkQ2hhbm5lbHMobGFzdENoYW5uZWxzLCBjaGFubmVsLCBzaGlmdCl9KSk7XG4gICAgICAgIH1gO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxhc3RJbmRleCA9IG9mZnNldHMubGVuZ3RoO1xuICAgICAgICBjb25zdCBzaGlmdCA9IG9mZnNldHNbb2Zmc2V0cy5sZW5ndGggLSAxXTtcbiAgICAgICAgZ2V0VmFsdWVTbmlwcGV0ICs9IGBcbiAgICAgICAgcmV0dXJuIGdldENoYW5uZWwoXG4gICAgICAgICAgZ2V0VCR7bGFzdEluZGV4fSgke3NoaWZ0ZWRDaGFubmVscyhjaGFubmVscywgY2hhbm5lbCwgc2hpZnQpfSksXG4gICAgICAgICAgdmVjMigke3NoaWZ0ZWRDaGFubmVscyhsYXN0Q2hhbm5lbHMsIGNoYW5uZWwsIHNoaWZ0KX0pKTtgO1xuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgZmxvYXQgZ2V0VmFsdWUoJHtjaGFubmVscy5tYXAoeCA9PiAnaW50ICcgKyB4KX0pIHtcbiAgICAgICAgJHtnZXRWYWx1ZVNuaXBwZXR9XG4gICAgICB9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgJHtkdHlwZX0gY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIHZlYzQgcmVzdWx0ID0gdmVjNChnZXRWYWx1ZSgke2Nvb3Jkc30pLCAwLiwgMC4sIDAuKTtcblxuICAgICAgICAke2Nvb3Jkc1tyYW5rIC0gMV19ID0gJHtjb29yZHNbcmFuayAtIDFdfSArIDE7XG4gICAgICAgIGlmICgke2Nvb3Jkc1tyYW5rIC0gMV19IDwgJHtzaGFwZVtyYW5rIC0gMV19KSB7XG4gICAgICAgICAgcmVzdWx0LmcgPSBnZXRWYWx1ZSgke2Nvb3Jkc30pO1xuICAgICAgICB9XG5cbiAgICAgICAgJHtjb29yZHNbcmFuayAtIDJdfSA9ICR7Y29vcmRzW3JhbmsgLSAyXX0gKyAxO1xuICAgICAgICBpZiAoJHtjb29yZHNbcmFuayAtIDJdfSA8ICR7c2hhcGVbcmFuayAtIDJdfSkge1xuICAgICAgICAgIHJlc3VsdC5hID0gZ2V0VmFsdWUoJHtjb29yZHN9KTtcbiAgICAgICAgfVxuXG4gICAgICAgICR7Y29vcmRzW3JhbmsgLSAxXX0gPSAke2Nvb3Jkc1tyYW5rIC0gMV19IC0gMTtcbiAgICAgICAgaWYgKCR7Y29vcmRzW3JhbmsgLSAyXX0gPCAke3NoYXBlW3JhbmsgLSAyXX0gJiZcbiAgICAgICAgICAgICR7Y29vcmRzW3JhbmsgLSAxXX0gPCAke3NoYXBlW3JhbmsgLSAxXX0pIHtcbiAgICAgICAgICByZXN1bHQuYiA9IGdldFZhbHVlKCR7Y29vcmRzfSk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0T3V0cHV0KHJlc3VsdCk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG4vKipcbiAqIFJldHVybiBhbiBleHByZXNzaW9uIGZvciBjb29yZGluYXRlcyBpbnRvIGEgdmVjdG9yIHdoZXJlIGEgZ2l2ZW4gY2hhbm5lbFxuICogd2lsbCBiZSBvZmZzZXQgYnkgW3NoaWZ0XS5cbiAqXG4gKiBAcGFyYW0gY2hhbm5lbHMgdGhlIGNoYW5uZWxzIHRvIGNvbnNpZGVyXG4gKiBAcGFyYW0gY2hhbm5lbCB0aGUgY2hhbm5lbCB3ZSB3YW50IHNoaWZ0ZWRcbiAqIEBwYXJhbSBzaGlmdCAgdGhlIGFtb3VudCB0byBzdWJ0cmFjdCBmcm9tIHRoZSBjaGFubmVsLlxuICpcbiAqIEByZXR1cm5zIGEgc3RyaW5nIG9mIHRoZSBmb3JtICd4LCB5LVtzaGlmdF0sIHonIHdoZXJlIGFueSBvbmUgY2hhbm5lbCBjYW5cbiAqIGhhdmUgdGhlIHNoaWZ0IGFwcGxpZWQuXG4gKi9cbmZ1bmN0aW9uIHNoaWZ0ZWRDaGFubmVscyhjaGFubmVscywgY2hhbm5lbCwgc2hpZnQpIHtcbiAgICBjb25zdCBjaGFubmVsSWR4ID0gY2hhbm5lbHMuaW5kZXhPZihjaGFubmVsKTtcbiAgICBjb25zdCByZXMgPSBjaGFubmVscy5tYXAoKGMsIGlkeCkgPT4ge1xuICAgICAgICBpZiAoaWR4ID09PSBjaGFubmVsSWR4KSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7Y30gLSAke3NoaWZ0fWA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gYztcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXMuam9pbigpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uY2F0X3BhY2tlZF9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuZXhwb3J0IGNsYXNzIENvbnYyRERlckZpbHRlclByb2dyYW0ge1xuICAgIGNvbnN0cnVjdG9yKGNvbnZJbmZvKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsneCcsICdkeSddO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gY29udkluZm8uZmlsdGVyU2hhcGU7XG4gICAgICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICAgICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICAgICAgY29uc3QgcGFkVG9wID0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgICAgIGNvbnN0IHBhZExlZnQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgICAgIGNvbnN0IGlzQ2hhbm5lbHNMYXN0ID0gY29udkluZm8uZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzTGFzdCc7XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgd1IgPSBjb29yZHMueDtcbiAgICAgICAgaW50IHdDID0gY29vcmRzLnk7XG4gICAgICAgIGludCBkMSA9IGNvb3Jkcy56O1xuICAgICAgICBpbnQgZDIgPSBjb29yZHMudztcblxuICAgICAgICAvLyBDb252b2x2ZSB4KD8sID8sIGQxKSB3aXRoIGR5KDosIDosIGQyKSB0byBnZXQgZHcod1IsIHdDLCBkMSwgZDIpLlxuICAgICAgICAvLyA/ID0gdG8gYmUgZGV0ZXJtaW5lZC4gOiA9IGFjcm9zcyBhbGwgdmFsdWVzIGluIHRoYXQgYXhpcy5cbiAgICAgICAgZmxvYXQgZG90UHJvZCA9IDAuMDtcblxuICAgICAgICBmb3IgKGludCBiID0gMDsgYiA8ICR7Y29udkluZm8uYmF0Y2hTaXplfTsgYisrKSB7XG4gICAgICAgICAgZm9yIChpbnQgeVIgPSAwOyB5UiA8ICR7Y29udkluZm8ub3V0SGVpZ2h0fTsgeVIrKykge1xuICAgICAgICAgICAgaW50IHhSID0gd1IgKyB5UiAqICR7c3RyaWRlSGVpZ2h0fSAtICR7cGFkVG9wfTtcblxuICAgICAgICAgICAgaWYgKHhSIDwgMCB8fCB4UiA+PSAke2NvbnZJbmZvLmluSGVpZ2h0fSkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChpbnQgeUMgPSAwOyB5QyA8ICR7Y29udkluZm8ub3V0V2lkdGh9OyB5QysrKSB7XG4gICAgICAgICAgICAgIGludCB4QyA9IHdDICsgeUMgKiAke3N0cmlkZVdpZHRofSAtICR7cGFkTGVmdH07XG5cbiAgICAgICAgICAgICAgaWYgKHhDIDwgMCB8fCB4QyA+PSAke2NvbnZJbmZvLmluV2lkdGh9KSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoJHtpc0NoYW5uZWxzTGFzdH0pIHtcbiAgICAgICAgICAgICAgICBmbG9hdCBkeVZhbHVlID0gZ2V0RHkoYiwgeVIsIHlDLCBkMik7XG4gICAgICAgICAgICAgICAgZmxvYXQgeFZhbHVlID0gZ2V0WChiLCB4UiwgeEMsIGQxKTtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9ICh4VmFsdWUgKiBkeVZhbHVlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmbG9hdCBkeVZhbHVlID0gZ2V0RHkoYiwgZDIsIHlSLCB5Qyk7XG4gICAgICAgICAgICAgICAgZmxvYXQgeFZhbHVlID0gZ2V0WChiLCBkMSwgeFIsIHhDKTtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9ICh4VmFsdWUgKiBkeVZhbHVlKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNldE91dHB1dChkb3RQcm9kKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBDb252MkREZXJJbnB1dFByb2dyYW0ge1xuICAgIGNvbnN0cnVjdG9yKGNvbnZJbmZvKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsnZHknLCAnVyddO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gY29udkluZm8uaW5TaGFwZTtcbiAgICAgICAgY29uc3QgZmlsdGVySGVpZ2h0ID0gY29udkluZm8uZmlsdGVySGVpZ2h0O1xuICAgICAgICBjb25zdCBmaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmZpbHRlcldpZHRoO1xuICAgICAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgICAgIGNvbnN0IGlzQ2hhbm5lbHNMYXN0ID0gY29udkluZm8uZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzTGFzdCc7XG4gICAgICAgIGNvbnN0IHBhZFRvcCA9IGZpbHRlckhlaWdodCAtIDEgLSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICAgICAgY29uc3QgcGFkTGVmdCA9IGZpbHRlcldpZHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICAgICAgY29uc3Qgcm93RGltID0gaXNDaGFubmVsc0xhc3QgPyAxIDogMjtcbiAgICAgICAgY29uc3QgY29sRGltID0gaXNDaGFubmVsc0xhc3QgPyAyIDogMztcbiAgICAgICAgY29uc3QgY2hhbm5lbERpbSA9IGlzQ2hhbm5lbHNMYXN0ID8gMyA6IDE7XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCBpdmVjMiBwYWRzID0gaXZlYzIoJHtwYWRUb3B9LCAke3BhZExlZnR9KTtcblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgZDEgPSBjb29yZHNbJHtjaGFubmVsRGltfV07XG5cbiAgICAgICAgaXZlYzIgZHlDb3JuZXIgPSBpdmVjMihjb29yZHNbJHtyb3dEaW19XSwgY29vcmRzWyR7Y29sRGltfV0pIC0gcGFkcztcbiAgICAgICAgaW50IGR5UkNvcm5lciA9IGR5Q29ybmVyLng7XG4gICAgICAgIGludCBkeUNDb3JuZXIgPSBkeUNvcm5lci55O1xuXG4gICAgICAgIC8vIENvbnZvbHZlIGR5KD8sID8sIGQyKSB3aXRoIHcoOiwgOiwgZDEsIGQyKSB0byBjb21wdXRlIGR4KHhSLCB4QywgZDEpLlxuICAgICAgICAvLyA/ID0gdG8gYmUgZGV0ZXJtaW5lZC4gOiA9IGFjcm9zcyBhbGwgdmFsdWVzIGluIHRoYXQgYXhpcy5cbiAgICAgICAgZmxvYXQgZG90UHJvZCA9IDAuMDtcbiAgICAgICAgZm9yIChpbnQgd1IgPSAwOyB3UiA8ICR7ZmlsdGVySGVpZ2h0fTsgd1IrKykge1xuICAgICAgICAgIGZsb2F0IGR5UiA9IGZsb2F0KGR5UkNvcm5lciArIHdSKSAvICR7c3RyaWRlSGVpZ2h0fS4wO1xuXG4gICAgICAgICAgaWYgKGR5UiA8IDAuMCB8fCBkeVIgPj0gJHtjb252SW5mby5vdXRIZWlnaHR9LjAgfHwgZnJhY3QoZHlSKSA+IDAuMCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGludCBpZHlSID0gaW50KGR5Uik7XG5cbiAgICAgICAgICBpbnQgd1JQZXJtID0gJHtmaWx0ZXJIZWlnaHR9IC0gMSAtIHdSO1xuXG4gICAgICAgICAgZm9yIChpbnQgd0MgPSAwOyB3QyA8ICR7ZmlsdGVyV2lkdGh9OyB3QysrKSB7XG4gICAgICAgICAgICBmbG9hdCBkeUMgPSBmbG9hdChkeUNDb3JuZXIgKyB3QykgLyAke3N0cmlkZVdpZHRofS4wO1xuXG4gICAgICAgICAgICBpZiAoZHlDIDwgMC4wIHx8IGR5QyA+PSAke2NvbnZJbmZvLm91dFdpZHRofS4wIHx8XG4gICAgICAgICAgICAgICAgZnJhY3QoZHlDKSA+IDAuMCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGludCBpZHlDID0gaW50KGR5Qyk7XG5cbiAgICAgICAgICAgIGludCB3Q1Blcm0gPSAke2ZpbHRlcldpZHRofSAtIDEgLSB3QztcblxuICAgICAgICAgICAgZm9yIChpbnQgZDIgPSAwOyBkMiA8ICR7Y29udkluZm8ub3V0Q2hhbm5lbHN9OyBkMisrKSB7XG5cbiAgICAgICAgICAgICAgaWYgKCR7aXNDaGFubmVsc0xhc3R9KSB7XG4gICAgICAgICAgICAgICAgZmxvYXQgeFZhbHVlID0gZ2V0RHkoYmF0Y2gsIGlkeVIsIGlkeUMsIGQyKTtcbiAgICAgICAgICAgICAgICBmbG9hdCB3VmFsdWUgPSBnZXRXKHdSUGVybSwgd0NQZXJtLCBkMSwgZDIpO1xuICAgICAgICAgICAgICAgIGRvdFByb2QgKz0geFZhbHVlICogd1ZhbHVlO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZsb2F0IHhWYWx1ZSA9IGdldER5KGJhdGNoLCBkMiwgaWR5UiwgaWR5Qyk7XG4gICAgICAgICAgICAgICAgZmxvYXQgd1ZhbHVlID0gZ2V0Vyh3UlBlcm0sIHdDUGVybSwgZDEsIGQyKTtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9IHhWYWx1ZSAqIHdWYWx1ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNldE91dHB1dChkb3RQcm9kKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBDb252M0REZXJGaWx0ZXJQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3Rvcihjb252SW5mbykge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ3gnLCAnZHknXTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IGNvbnZJbmZvLmZpbHRlclNoYXBlO1xuICAgICAgICBjb25zdCBzdHJpZGVEZXB0aCA9IGNvbnZJbmZvLnN0cmlkZURlcHRoO1xuICAgICAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgICAgIGNvbnN0IHBhZEZyb250ID0gY29udkluZm8ucGFkSW5mby5mcm9udDtcbiAgICAgICAgY29uc3QgcGFkVG9wID0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgICAgIGNvbnN0IHBhZExlZnQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM1IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgd0YgPSBjb29yZHMueDtcbiAgICAgICAgaW50IHdSID0gY29vcmRzLnk7XG4gICAgICAgIGludCB3QyA9IGNvb3Jkcy56O1xuICAgICAgICBpbnQgZDEgPSBjb29yZHMudztcbiAgICAgICAgaW50IGQyID0gY29vcmRzLnU7XG5cbiAgICAgICAgZmxvYXQgZG90UHJvZCA9IDAuMDtcblxuICAgICAgICBmb3IgKGludCBiID0gMDsgYiA8ICR7Y29udkluZm8uYmF0Y2hTaXplfTsgYisrKSB7XG4gICAgICAgICAgZm9yIChpbnQgeUYgPSAwOyB5RiA8ICR7Y29udkluZm8ub3V0RGVwdGh9OyB5RisrKSB7XG4gICAgICAgICAgICBpbnQgeEYgPSB3RiArIHlGICogJHtzdHJpZGVEZXB0aH0gLSAke3BhZEZyb250fTtcblxuICAgICAgICAgICAgaWYgKHhGIDwgMCB8fCB4RiA+PSAke2NvbnZJbmZvLmluRGVwdGh9KSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGludCB5UiA9IDA7IHlSIDwgJHtjb252SW5mby5vdXRIZWlnaHR9OyB5UisrKSB7XG4gICAgICAgICAgICAgIGludCB4UiA9IHdSICsgeVIgKiAke3N0cmlkZUhlaWdodH0gLSAke3BhZFRvcH07XG5cbiAgICAgICAgICAgICAgaWYgKHhSIDwgMCB8fCB4UiA+PSAke2NvbnZJbmZvLmluSGVpZ2h0fSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZm9yIChpbnQgeUMgPSAwOyB5QyA8ICR7Y29udkluZm8ub3V0V2lkdGh9OyB5QysrKSB7XG4gICAgICAgICAgICAgICAgaW50IHhDID0gd0MgKyB5QyAqICR7c3RyaWRlV2lkdGh9IC0gJHtwYWRMZWZ0fTtcblxuICAgICAgICAgICAgICAgIGlmICh4QyA8IDAgfHwgeEMgPj0gJHtjb252SW5mby5pbldpZHRofSkge1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZmxvYXQgZHlWYWx1ZSA9IGdldER5KGIsIHlGLCB5UiwgeUMsIGQyKTtcbiAgICAgICAgICAgICAgICBmbG9hdCB4VmFsdWUgPSBnZXRYKGIsIHhGLCB4UiwgeEMsIGQxKTtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9ICh4VmFsdWUgKiBkeVZhbHVlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQoZG90UHJvZCk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgQ29udjNERGVySW5wdXRQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3Rvcihjb252SW5mbykge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ2R5JywgJ1cnXTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IGNvbnZJbmZvLmluU2hhcGU7XG4gICAgICAgIGNvbnN0IGZpbHRlckRlcHRoID0gY29udkluZm8uZmlsdGVyRGVwdGg7XG4gICAgICAgIGNvbnN0IGZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmZpbHRlckhlaWdodDtcbiAgICAgICAgY29uc3QgZmlsdGVyV2lkdGggPSBjb252SW5mby5maWx0ZXJXaWR0aDtcbiAgICAgICAgY29uc3Qgc3RyaWRlRGVwdGggPSBjb252SW5mby5zdHJpZGVEZXB0aDtcbiAgICAgICAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICAgICAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICAgICAgICBjb25zdCBwYWRGcm9udCA9IGZpbHRlckRlcHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8uZnJvbnQ7XG4gICAgICAgIGNvbnN0IHBhZFRvcCA9IGZpbHRlckhlaWdodCAtIDEgLSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICAgICAgY29uc3QgcGFkTGVmdCA9IGZpbHRlcldpZHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IGl2ZWMzIHBhZHMgPSBpdmVjMygke3BhZEZyb250fSwgJHtwYWRUb3B9LCAke3BhZExlZnR9KTtcblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjNSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzLng7XG4gICAgICAgIGludCBkMSA9IGNvb3Jkcy51O1xuXG5cbiAgICAgICAgaXZlYzMgZHlDb3JuZXIgPSBpdmVjMyhjb29yZHMueSwgY29vcmRzLnosIGNvb3Jkcy53KSAtIHBhZHM7XG4gICAgICAgIGludCBkeUZDb3JuZXIgPSBkeUNvcm5lci54O1xuICAgICAgICBpbnQgZHlSQ29ybmVyID0gZHlDb3JuZXIueTtcbiAgICAgICAgaW50IGR5Q0Nvcm5lciA9IGR5Q29ybmVyLno7XG5cbiAgICAgICAgZmxvYXQgZG90UHJvZCA9IDAuMDtcbiAgICAgICAgZm9yIChpbnQgd0YgPSAwOyB3RiA8ICR7ZmlsdGVyRGVwdGh9OyB3RisrKSB7XG4gICAgICAgICAgZmxvYXQgZHlGID0gZmxvYXQoZHlGQ29ybmVyICsgd0YpIC8gJHtzdHJpZGVEZXB0aH0uMDtcblxuICAgICAgICAgIGlmIChkeUYgPCAwLjAgfHwgZHlGID49ICR7Y29udkluZm8ub3V0RGVwdGh9LjAgfHwgZnJhY3QoZHlGKSA+IDAuMCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGludCBpZHlGID0gaW50KGR5Rik7XG5cbiAgICAgICAgICBpbnQgd0ZQZXJtID0gJHtmaWx0ZXJEZXB0aH0gLSAxIC0gd0Y7XG5cbiAgICAgICAgICBmb3IgKGludCB3UiA9IDA7IHdSIDwgJHtmaWx0ZXJIZWlnaHR9OyB3UisrKSB7XG4gICAgICAgICAgICBmbG9hdCBkeVIgPSBmbG9hdChkeVJDb3JuZXIgKyB3UikgLyAke3N0cmlkZUhlaWdodH0uMDtcblxuICAgICAgICAgICAgaWYgKGR5UiA8IDAuMCB8fCBkeVIgPj0gJHtjb252SW5mby5vdXRIZWlnaHR9LjAgfHxcbiAgICAgICAgICAgICAgZnJhY3QoZHlSKSA+IDAuMCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGludCBpZHlSID0gaW50KGR5Uik7XG5cbiAgICAgICAgICAgIGludCB3UlBlcm0gPSAke2ZpbHRlckhlaWdodH0gLSAxIC0gd1I7XG5cbiAgICAgICAgICAgIGZvciAoaW50IHdDID0gMDsgd0MgPCAke2ZpbHRlcldpZHRofTsgd0MrKykge1xuICAgICAgICAgICAgICBmbG9hdCBkeUMgPSBmbG9hdChkeUNDb3JuZXIgKyB3QykgLyAke3N0cmlkZVdpZHRofS4wO1xuXG4gICAgICAgICAgICAgIGlmIChkeUMgPCAwLjAgfHwgZHlDID49ICR7Y29udkluZm8ub3V0V2lkdGh9LjAgfHxcbiAgICAgICAgICAgICAgICAgIGZyYWN0KGR5QykgPiAwLjApIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpbnQgaWR5QyA9IGludChkeUMpO1xuXG4gICAgICAgICAgICAgIGludCB3Q1Blcm0gPSAke2ZpbHRlcldpZHRofSAtIDEgLSB3QztcblxuICAgICAgICAgICAgICBmb3IgKGludCBkMiA9IDA7IGQyIDwgJHtjb252SW5mby5vdXRDaGFubmVsc307IGQyKyspIHtcbiAgICAgICAgICAgICAgICBmbG9hdCB4VmFsdWUgPSBnZXREeShiYXRjaCwgaWR5RiwgaWR5UiwgaWR5QywgZDIpO1xuICAgICAgICAgICAgICAgIGZsb2F0IHdWYWx1ZSA9IGdldFcod0ZQZXJtLCB3UlBlcm0sIHdDUGVybSwgZDEsIGQyKTtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9IHhWYWx1ZSAqIHdWYWx1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQoZG90UHJvZCk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb252X2JhY2twcm9wX2dwdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5leHBvcnQgY2xhc3MgRGVwdGh3aXNlQ29udjJERGVyRmlsdGVyUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoY29udkluZm8pIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWyd4JywgJ2R5J107XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5maWx0ZXJTaGFwZTtcbiAgICAgICAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICAgICAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICAgICAgICBjb25zdCBwYWRUb3AgPSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICAgICAgY29uc3QgcGFkTGVmdCA9IGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICAgICAgY29uc3QgY2hhbm5lbE11bCA9IGNvbnZJbmZvLm91dENoYW5uZWxzIC8gY29udkluZm8uaW5DaGFubmVscztcbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCB3UiA9IGNvb3Jkcy54O1xuICAgICAgICBpbnQgd0MgPSBjb29yZHMueTtcbiAgICAgICAgaW50IGQxID0gY29vcmRzLno7XG4gICAgICAgIGludCBkbSA9IGNvb3Jkcy53O1xuICAgICAgICBpbnQgZDIgPSBkMSAqICR7Y2hhbm5lbE11bH0gKyBkbTtcblxuICAgICAgICBmbG9hdCBkb3RQcm9kID0gMC4wO1xuXG4gICAgICAgIC8vIFRPIERPOiBWZWM0IG92ZXIgdGhlIGJhdGNoIHNpemVcbiAgICAgICAgZm9yIChpbnQgYiA9IDA7IGIgPCAke2NvbnZJbmZvLmJhdGNoU2l6ZX07IGIrKykge1xuICAgICAgICAgIGZvciAoaW50IHlSID0gMDsgeVIgPCAke2NvbnZJbmZvLm91dEhlaWdodH07IHlSKyspIHtcbiAgICAgICAgICAgIGludCB4UiA9IHdSICsgeVIgKiAke3N0cmlkZUhlaWdodH0gLSAke3BhZFRvcH07XG5cbiAgICAgICAgICAgIGlmICh4UiA8IDAgfHwgeFIgPj0gJHtjb252SW5mby5pbkhlaWdodH0pIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoaW50IHlDID0gMDsgeUMgPCAke2NvbnZJbmZvLm91dFdpZHRofTsgeUMrKykge1xuICAgICAgICAgICAgICBpbnQgeEMgPSB3QyArIHlDICogJHtzdHJpZGVXaWR0aH0gLSAke3BhZExlZnR9O1xuXG4gICAgICAgICAgICAgIGlmICh4QyA8IDAgfHwgeEMgPj0gJHtjb252SW5mby5pbldpZHRofSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZmxvYXQgZHlWYWx1ZSA9IGdldER5KGIsIHlSLCB5QywgZDIpO1xuICAgICAgICAgICAgICBmbG9hdCB4VmFsdWUgPSBnZXRYKGIsIHhSLCB4QywgZDEpO1xuICAgICAgICAgICAgICBkb3RQcm9kICs9ICh4VmFsdWUgKiBkeVZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0T3V0cHV0KGRvdFByb2QpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIERlcHRod2lzZUNvbnYyRERlcklucHV0UHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoY29udkluZm8pIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWydkeScsICdXJ107XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5pblNoYXBlO1xuICAgICAgICBjb25zdCBmaWx0ZXJIZWlnaHQgPSBjb252SW5mby5maWx0ZXJIZWlnaHQ7XG4gICAgICAgIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG4gICAgICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICAgICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICAgICAgY29uc3QgcGFkVG9wID0gZmlsdGVySGVpZ2h0IC0gMSAtIGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgICAgICBjb25zdCBwYWRMZWZ0ID0gZmlsdGVyV2lkdGggLSAxIC0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgICAgICBjb25zdCBjaGFubmVsTXVsID0gY29udkluZm8ub3V0Q2hhbm5lbHMgLyBjb252SW5mby5pbkNoYW5uZWxzO1xuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgY29uc3QgaXZlYzIgcGFkcyA9IGl2ZWMyKCR7cGFkVG9wfSwgJHtwYWRMZWZ0fSk7XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiYXRjaCA9IGNvb3Jkc1swXTtcbiAgICAgICAgaW50IGQxID0gY29vcmRzWzNdO1xuICAgICAgICBpdmVjMiBkeUNvcm5lciA9IGNvb3Jkcy55eiAtIHBhZHM7XG4gICAgICAgIGludCBkeVJDb3JuZXIgPSBkeUNvcm5lci54O1xuICAgICAgICBpbnQgZHlDQ29ybmVyID0gZHlDb3JuZXIueTtcblxuICAgICAgICBmbG9hdCBkb3RQcm9kID0gMC4wO1xuXG4gICAgICAgIGZvciAoaW50IHdSID0gMDsgd1IgPCAke2ZpbHRlckhlaWdodH07IHdSKyspIHtcbiAgICAgICAgICBmbG9hdCBkeVIgPSBmbG9hdChkeVJDb3JuZXIgKyB3UikgLyAke3N0cmlkZUhlaWdodH0uMDtcblxuICAgICAgICAgIGlmIChkeVIgPCAwLjAgfHwgZHlSID49ICR7Y29udkluZm8ub3V0SGVpZ2h0fS4wIHx8IGZyYWN0KGR5UikgPiAwLjApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpbnQgaWR5UiA9IGludChkeVIpO1xuXG4gICAgICAgICAgaW50IHdSUGVybSA9ICR7ZmlsdGVySGVpZ2h0fSAtIDEgLSB3UjtcblxuICAgICAgICAgIGZvciAoaW50IHdDID0gMDsgd0MgPCAke2ZpbHRlcldpZHRofTsgd0MrKykge1xuICAgICAgICAgICAgZmxvYXQgZHlDID0gZmxvYXQoZHlDQ29ybmVyICsgd0MpIC8gJHtzdHJpZGVXaWR0aH0uMDtcblxuICAgICAgICAgICAgaWYgKGR5QyA8IDAuMCB8fCBkeUMgPj0gJHtjb252SW5mby5vdXRXaWR0aH0uMCB8fFxuICAgICAgICAgICAgICAgIGZyYWN0KGR5QykgPiAwLjApIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbnQgaWR5QyA9IGludChkeUMpO1xuXG4gICAgICAgICAgICBpbnQgd0NQZXJtID0gJHtmaWx0ZXJXaWR0aH0gLSAxIC0gd0M7XG5cbiAgICAgICAgICAgIC8vIFRPIERPOiBWZWM0IG92ZXIgdGhlIGNoYW5uZWxNdWxcbiAgICAgICAgICAgIGZvciAoaW50IGRtID0gMDsgZG0gPCAke2NoYW5uZWxNdWx9OyBkbSsrKSB7XG4gICAgICAgICAgICAgIGludCBkMiA9IGQxICogJHtjaGFubmVsTXVsfSArIGRtO1xuICAgICAgICAgICAgICBmbG9hdCB4VmFsdWUgPSBnZXREeShiYXRjaCwgaWR5UiwgaWR5QywgZDIpO1xuICAgICAgICAgICAgICBmbG9hdCB3VmFsdWUgPSBnZXRXKHdSUGVybSwgd0NQZXJtLCBkMSwgZG0pO1xuICAgICAgICAgICAgICBkb3RQcm9kICs9IHhWYWx1ZSAqIHdWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0T3V0cHV0KGRvdFByb2QpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29udl9iYWNrcHJvcF9ncHVfZGVwdGh3aXNlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmV4cG9ydCBjbGFzcyBDb252MkRQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3Rvcihjb252SW5mbywgYWRkQmlhcyA9IGZhbHNlLCBhY3RpdmF0aW9uID0gbnVsbCwgaGFzUHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyA9IGZhbHNlLCBoYXNMZWFreXJlbHVBbHBoYSA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsneCcsICdXJ107XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5vdXRTaGFwZTtcbiAgICAgICAgY29uc3QgcGFkVG9wID0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgICAgIGNvbnN0IHBhZExlZnQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICAgICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICAgICAgY29uc3QgZGlsYXRpb25IZWlnaHQgPSBjb252SW5mby5kaWxhdGlvbkhlaWdodDtcbiAgICAgICAgY29uc3QgZGlsYXRpb25XaWR0aCA9IGNvbnZJbmZvLmRpbGF0aW9uV2lkdGg7XG4gICAgICAgIGNvbnN0IGZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmZpbHRlckhlaWdodDtcbiAgICAgICAgY29uc3QgZmlsdGVyV2lkdGggPSBjb252SW5mby5maWx0ZXJXaWR0aDtcbiAgICAgICAgY29uc3QgaW5wdXREZXB0aE5lYXJlc3RWZWM0ID0gTWF0aC5mbG9vcihjb252SW5mby5pbkNoYW5uZWxzIC8gNCkgKiA0O1xuICAgICAgICBjb25zdCBpbnB1dERlcHRoVmVjNFJlbWFpbmRlciA9IGNvbnZJbmZvLmluQ2hhbm5lbHMgJSA0O1xuICAgICAgICBjb25zdCBpc0NoYW5uZWxzTGFzdCA9IGNvbnZJbmZvLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnO1xuICAgICAgICBjb25zdCByb3dEaW0gPSBpc0NoYW5uZWxzTGFzdCA/IDEgOiAyO1xuICAgICAgICBjb25zdCBjb2xEaW0gPSBpc0NoYW5uZWxzTGFzdCA/IDIgOiAzO1xuICAgICAgICBjb25zdCBjaGFubmVsRGltID0gaXNDaGFubmVsc0xhc3QgPyAzIDogMTtcbiAgICAgICAgbGV0IGFjdGl2YXRpb25TbmlwcGV0ID0gJycsIGFwcGx5QWN0aXZhdGlvblNuaXBwZXQgPSAnJztcbiAgICAgICAgaWYgKGFjdGl2YXRpb24pIHtcbiAgICAgICAgICAgIGlmIChoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzKSB7XG4gICAgICAgICAgICAgICAgYWN0aXZhdGlvblNuaXBwZXQgPSBgZmxvYXQgYWN0aXZhdGlvbihmbG9hdCBhKSB7XG4gICAgICAgICAgZmxvYXQgYiA9IGdldFByZWx1QWN0aXZhdGlvbldlaWdodHNBdE91dENvb3JkcygpO1xuICAgICAgICAgICR7YWN0aXZhdGlvbn1cbiAgICAgICAgfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChoYXNMZWFreXJlbHVBbHBoYSkge1xuICAgICAgICAgICAgICAgIGFjdGl2YXRpb25TbmlwcGV0ID0gYGZsb2F0IGFjdGl2YXRpb24oZmxvYXQgYSkge1xuICAgICAgICAgIGZsb2F0IGIgPSBnZXRMZWFreXJlbHVBbHBoYUF0T3V0Q29vcmRzKCk7XG4gICAgICAgICAgJHthY3RpdmF0aW9ufVxuICAgICAgICB9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGFjdGl2YXRpb25TbmlwcGV0ID0gYFxuICAgICAgICAgIGZsb2F0IGFjdGl2YXRpb24oZmxvYXQgeCkge1xuICAgICAgICAgICAgJHthY3RpdmF0aW9ufVxuICAgICAgICAgIH1cbiAgICAgICAgYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFwcGx5QWN0aXZhdGlvblNuaXBwZXQgPSBgcmVzdWx0ID0gYWN0aXZhdGlvbihyZXN1bHQpO2A7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWRkQmlhc1NuaXBwZXQgPSBhZGRCaWFzID8gJ3Jlc3VsdCArPSBnZXRCaWFzQXRPdXRDb29yZHMoKTsnIDogJyc7XG4gICAgICAgIGlmIChhZGRCaWFzKSB7XG4gICAgICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMucHVzaCgnYmlhcycpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzKSB7XG4gICAgICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMucHVzaCgncHJlbHVBY3RpdmF0aW9uV2VpZ2h0cycpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNMZWFreXJlbHVBbHBoYSkge1xuICAgICAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzLnB1c2goJ2xlYWt5cmVsdUFscGhhJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICR7YWN0aXZhdGlvblNuaXBwZXR9XG5cbiAgICAgIGNvbnN0IGl2ZWMyIHN0cmlkZXMgPSBpdmVjMigke3N0cmlkZUhlaWdodH0sICR7c3RyaWRlV2lkdGh9KTtcbiAgICAgIGNvbnN0IGl2ZWMyIHBhZHMgPSBpdmVjMigke3BhZFRvcH0sICR7cGFkTGVmdH0pO1xuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHNbMF07XG4gICAgICAgIGludCBkMiA9IGNvb3Jkc1ske2NoYW5uZWxEaW19XTtcblxuICAgICAgICBpdmVjMiB4UkNDb3JuZXIgPVxuICAgICAgICAgICAgaXZlYzIoY29vcmRzWyR7cm93RGltfV0sIGNvb3Jkc1ske2NvbERpbX1dKSAqIHN0cmlkZXMgLSBwYWRzO1xuICAgICAgICBpbnQgeFJDb3JuZXIgPSB4UkNDb3JuZXIueDtcbiAgICAgICAgaW50IHhDQ29ybmVyID0geFJDQ29ybmVyLnk7XG5cbiAgICAgICAgLy8gQ29udm9sdmUgeCg/LCA/LCBkMSkgd2l0aCB3KDosIDosIGQxLCBkMikgdG8gZ2V0IHkoeVIsIHlDLCBkMikuXG4gICAgICAgIC8vID8gPSB0byBiZSBkZXRlcm1pbmVkLiA6ID0gYWNyb3NzIGFsbCB2YWx1ZXMgaW4gdGhhdCBheGlzLlxuICAgICAgICBmbG9hdCBkb3RQcm9kID0gMC4wO1xuICAgICAgICBmb3IgKGludCB3UiA9IDA7IHdSIDwgJHtmaWx0ZXJIZWlnaHR9OyB3UisrKSB7XG4gICAgICAgICAgaW50IHhSID0geFJDb3JuZXIgKyB3UiAqICR7ZGlsYXRpb25IZWlnaHR9O1xuXG4gICAgICAgICAgaWYgKHhSIDwgMCB8fCB4UiA+PSAke2NvbnZJbmZvLmluSGVpZ2h0fSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yIChpbnQgd0MgPSAwOyB3QyA8ICR7ZmlsdGVyV2lkdGh9OyB3QysrKSB7XG4gICAgICAgICAgICBpbnQgeEMgPSB4Q0Nvcm5lciArIHdDICogJHtkaWxhdGlvbldpZHRofTtcblxuICAgICAgICAgICAgaWYgKHhDIDwgMCB8fCB4QyA+PSAke2NvbnZJbmZvLmluV2lkdGh9KSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGludCBkMSA9IDA7IGQxIDwgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9OyBkMSArPSA0KSB7XG4gICAgICAgICAgICAgIHZlYzQgd1ZhbHVlcyA9IHZlYzQoXG4gICAgICAgICAgICAgICAgZ2V0Vyh3Uiwgd0MsIGQxLCBkMiksXG4gICAgICAgICAgICAgICAgZ2V0Vyh3Uiwgd0MsIGQxICsgMSwgZDIpLFxuICAgICAgICAgICAgICAgIGdldFcod1IsIHdDLCBkMSArIDIsIGQyKSxcbiAgICAgICAgICAgICAgICBnZXRXKHdSLCB3QywgZDEgKyAzLCBkMilcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICBpZiAoJHtpc0NoYW5uZWxzTGFzdH0pIHtcbiAgICAgICAgICAgICAgICB2ZWM0IHhWYWx1ZXMgPSB2ZWM0KFxuICAgICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgeFIsIHhDLCBkMSksXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4UiwgeEMsIGQxICsgMSksXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4UiwgeEMsIGQxICsgMiksXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4UiwgeEMsIGQxICsgMylcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGRvdFByb2QgKz0gZG90KHhWYWx1ZXMsIHdWYWx1ZXMpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZlYzQgeFZhbHVlcyA9IHZlYzQoXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCBkMSwgeFIsIHhDKSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIGQxICsgMSwgeFIsIHhDKSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIGQxICsgMiwgeFIsIHhDKSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIGQxICsgMywgeFIsIHhDKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZG90UHJvZCArPSBkb3QoeFZhbHVlcywgd1ZhbHVlcyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCR7aW5wdXREZXB0aFZlYzRSZW1haW5kZXIgPT09IDF9KSB7XG5cbiAgICAgICAgICAgICAgaWYgKCR7aXNDaGFubmVsc0xhc3R9KSB7XG4gICAgICAgICAgICAgICAgZG90UHJvZCArPVxuICAgICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4UiwgeEMsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSkgKlxuICAgICAgICAgICAgICAgICAgICBnZXRXKHdSLCB3QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9LCBkMik7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZG90UHJvZCArPVxuICAgICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0sIHhSLCB4QykgKlxuICAgICAgICAgICAgICAgICAgICBnZXRXKHdSLCB3QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9LCBkMik7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSBlbHNlIGlmICgke2lucHV0RGVwdGhWZWM0UmVtYWluZGVyID09PSAyfSkge1xuICAgICAgICAgICAgICB2ZWMyIHdWYWx1ZXMgPSB2ZWMyKFxuICAgICAgICAgICAgICAgIGdldFcod1IsIHdDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0sIGQyKSxcbiAgICAgICAgICAgICAgICBnZXRXKHdSLCB3QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9ICsgMSwgZDIpXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgaWYgKCR7aXNDaGFubmVsc0xhc3R9KSB7XG4gICAgICAgICAgICAgICAgdmVjMiB4VmFsdWVzID0gdmVjMihcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhSLCB4QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9KSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhSLCB4QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9ICsgMSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGRvdFByb2QgKz0gZG90KHhWYWx1ZXMsIHdWYWx1ZXMpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZlYzIgeFZhbHVlcyA9IHZlYzIoXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0sIHhSLCB4QyksXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0gKyAxLCB4UiwgeEMpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9IGRvdCh4VmFsdWVzLCB3VmFsdWVzKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCR7aW5wdXREZXB0aFZlYzRSZW1haW5kZXIgPT09IDN9KSB7XG4gICAgICAgICAgICAgIHZlYzMgd1ZhbHVlcyA9IHZlYzMoXG4gICAgICAgICAgICAgICAgZ2V0Vyh3Uiwgd0MsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSwgZDIpLFxuICAgICAgICAgICAgICAgIGdldFcod1IsIHdDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0gKyAxLCBkMiksXG4gICAgICAgICAgICAgICAgZ2V0Vyh3Uiwgd0MsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSArIDIsIGQyKVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIGlmICgke2lzQ2hhbm5lbHNMYXN0fSkge1xuICAgICAgICAgICAgICAgIHZlYzMgeFZhbHVlcyA9IHZlYzMoXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4UiwgeEMsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSksXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4UiwgeEMsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSArIDEpLFxuICAgICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgeFIsIHhDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0gKyAyKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZG90UHJvZCArPSBkb3QoeFZhbHVlcywgd1ZhbHVlcyk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmVjMyB4VmFsdWVzID0gdmVjMyhcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSwgeFIsIHhDKSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSArIDEsIHhSLCB4QyksXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0gKyAyLCB4UiwgeEMpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9IGRvdCh4VmFsdWVzLCB3VmFsdWVzKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZmxvYXQgcmVzdWx0ID0gZG90UHJvZDtcbiAgICAgICAgJHthZGRCaWFzU25pcHBldH1cbiAgICAgICAgJHthcHBseUFjdGl2YXRpb25TbmlwcGV0fVxuICAgICAgICBzZXRPdXRwdXQocmVzdWx0KTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBDb252M0RQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3Rvcihjb252SW5mbykge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ3gnLCAnVyddO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gY29udkluZm8ub3V0U2hhcGU7XG4gICAgICAgIGNvbnN0IHBhZEZyb250ID0gY29udkluZm8ucGFkSW5mby5mcm9udDtcbiAgICAgICAgY29uc3QgcGFkVG9wID0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgICAgIGNvbnN0IHBhZExlZnQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgICAgIGNvbnN0IHN0cmlkZURlcHRoID0gY29udkluZm8uc3RyaWRlRGVwdGg7XG4gICAgICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICAgICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICAgICAgY29uc3QgZGlsYXRpb25EZXB0aCA9IGNvbnZJbmZvLmRpbGF0aW9uRGVwdGg7XG4gICAgICAgIGNvbnN0IGRpbGF0aW9uSGVpZ2h0ID0gY29udkluZm8uZGlsYXRpb25IZWlnaHQ7XG4gICAgICAgIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICAgICAgICBjb25zdCBmaWx0ZXJEZXB0aCA9IGNvbnZJbmZvLmZpbHRlckRlcHRoO1xuICAgICAgICBjb25zdCBmaWx0ZXJIZWlnaHQgPSBjb252SW5mby5maWx0ZXJIZWlnaHQ7XG4gICAgICAgIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG4gICAgICAgIGNvbnN0IGlucHV0RGVwdGhOZWFyZXN0VmVjNCA9IE1hdGguZmxvb3IoY29udkluZm8uaW5DaGFubmVscyAvIDQpICogNDtcbiAgICAgICAgY29uc3QgaW5wdXREZXB0aFZlYzRSZW1haW5kZXIgPSBjb252SW5mby5pbkNoYW5uZWxzICUgNDtcbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IGl2ZWMzIHN0cmlkZXMgPSBpdmVjMygke3N0cmlkZURlcHRofSwgJHtzdHJpZGVIZWlnaHR9LCAke3N0cmlkZVdpZHRofSk7XG4gICAgICBjb25zdCBpdmVjMyBwYWRzID0gaXZlYzMoJHtwYWRGcm9udH0sICR7cGFkVG9wfSwgJHtwYWRMZWZ0fSk7XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzUgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiYXRjaCA9IGNvb3Jkcy54O1xuICAgICAgICBpbnQgZDIgPSBjb29yZHMudTtcblxuICAgICAgICBpdmVjMyB4RlJDQ29ybmVyID0gaXZlYzMoY29vcmRzLnksIGNvb3Jkcy56LCBjb29yZHMudykgKiBzdHJpZGVzIC0gcGFkcztcbiAgICAgICAgaW50IHhGQ29ybmVyID0geEZSQ0Nvcm5lci54O1xuICAgICAgICBpbnQgeFJDb3JuZXIgPSB4RlJDQ29ybmVyLnk7XG4gICAgICAgIGludCB4Q0Nvcm5lciA9IHhGUkNDb3JuZXIuejtcblxuICAgICAgICAvLyBDb252b2x2ZSB4KD8sID8sID8sIGQxKSB3aXRoIHcoOiwgOiwgOiwgZDEsIGQyKSB0byBnZXRcbiAgICAgICAgLy8geSh5RiwgeVIsIHlDLCBkMikuID8gPSB0byBiZSBkZXRlcm1pbmVkLiA6ID0gYWNyb3NzIGFsbFxuICAgICAgICAvLyB2YWx1ZXMgaW4gdGhhdCBheGlzLlxuICAgICAgICBmbG9hdCBkb3RQcm9kID0gMC4wO1xuICAgICAgICBmb3IgKGludCB3RiA9IDA7IHdGIDwgJHtmaWx0ZXJEZXB0aH07IHdGKyspIHtcbiAgICAgICAgICBpbnQgeEYgPSB4RkNvcm5lciArIHdGICogJHtkaWxhdGlvbkRlcHRofTtcblxuICAgICAgICAgIGlmICh4RiA8IDAgfHwgeEYgPj0gJHtjb252SW5mby5pbkRlcHRofSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yIChpbnQgd1IgPSAwOyB3UiA8ICR7ZmlsdGVySGVpZ2h0fTsgd1IrKykge1xuICAgICAgICAgICAgaW50IHhSID0geFJDb3JuZXIgKyB3UiAqICR7ZGlsYXRpb25IZWlnaHR9O1xuXG4gICAgICAgICAgICBpZiAoeFIgPCAwIHx8IHhSID49ICR7Y29udkluZm8uaW5IZWlnaHR9KSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGludCB3QyA9IDA7IHdDIDwgJHtmaWx0ZXJXaWR0aH07IHdDKyspIHtcbiAgICAgICAgICAgICAgaW50IHhDID0geENDb3JuZXIgKyB3QyAqICR7ZGlsYXRpb25XaWR0aH07XG5cbiAgICAgICAgICAgICAgaWYgKHhDIDwgMCB8fCB4QyA+PSAke2NvbnZJbmZvLmluV2lkdGh9KSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBmb3IgKGludCBkMSA9IDA7IGQxIDwgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9OyBkMSArPSA0KSB7XG4gICAgICAgICAgICAgICAgdmVjNCB4VmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhGLCB4UiwgeEMsIGQxKSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhGLCB4UiwgeEMsIGQxICsgMSksXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4RiwgeFIsIHhDLCBkMSArIDIpLFxuICAgICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgeEYsIHhSLCB4QywgZDEgKyAzKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdmVjNCB3VmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgICAgICAgIGdldFcod0YsIHdSLCB3QywgZDEsIGQyKSxcbiAgICAgICAgICAgICAgICAgIGdldFcod0YsIHdSLCB3QywgZDEgKyAxLCBkMiksXG4gICAgICAgICAgICAgICAgICBnZXRXKHdGLCB3Uiwgd0MsIGQxICsgMiwgZDIpLFxuICAgICAgICAgICAgICAgICAgZ2V0Vyh3Riwgd1IsIHdDLCBkMSArIDMsIGQyKVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9IGRvdCh4VmFsdWVzLCB3VmFsdWVzKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmICgke2lucHV0RGVwdGhWZWM0UmVtYWluZGVyID09PSAxfSkge1xuICAgICAgICAgICAgICAgIGRvdFByb2QgKz1cbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhGLCB4UiwgeEMsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSkgKlxuICAgICAgICAgICAgICAgICAgZ2V0Vyh3Riwgd1IsIHdDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0sIGQyKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICgke2lucHV0RGVwdGhWZWM0UmVtYWluZGVyID09PSAyfSkge1xuICAgICAgICAgICAgICAgIHZlYzIgeFZhbHVlcyA9IHZlYzIoXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4RiwgeFIsIHhDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0pLFxuICAgICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgeEYsIHhSLCB4QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9ICsgMSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHZlYzIgd1ZhbHVlcyA9IHZlYzIoXG4gICAgICAgICAgICAgICAgICBnZXRXKHdGLCB3Uiwgd0MsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSwgZDIpLFxuICAgICAgICAgICAgICAgICAgZ2V0Vyh3Riwgd1IsIHdDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0gKyAxLCBkMilcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGRvdFByb2QgKz0gZG90KHhWYWx1ZXMsIHdWYWx1ZXMpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKCR7aW5wdXREZXB0aFZlYzRSZW1haW5kZXIgPT09IDN9KSB7XG4gICAgICAgICAgICAgICAgdmVjMyB4VmFsdWVzID0gdmVjMyhcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhGLCB4UiwgeEMsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSksXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4RiwgeFIsIHhDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0gKyAxKSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhGLCB4UiwgeEMsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSArIDIpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB2ZWMzIHdWYWx1ZXMgPSB2ZWMzKFxuICAgICAgICAgICAgICAgICAgZ2V0Vyh3Riwgd1IsIHdDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0sIGQyKSxcbiAgICAgICAgICAgICAgICAgIGdldFcod0YsIHdSLCB3QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9ICsgMSwgZDIpLFxuICAgICAgICAgICAgICAgICAgZ2V0Vyh3Riwgd1IsIHdDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0gKyAyLCBkMilcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGRvdFByb2QgKz0gZG90KHhWYWx1ZXMsIHdWYWx1ZXMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNldE91dHB1dChkb3RQcm9kKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnZfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmV4cG9ydCBjbGFzcyBEZXB0aHdpc2VDb252MkRQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3Rvcihjb252SW5mbywgYWRkQmlhcyA9IGZhbHNlLCBhY3RpdmF0aW9uID0gbnVsbCwgaGFzUHJlbHVBY3RpdmF0aW9uID0gZmFsc2UsIGhhc0xlYWt5UmVsdUFscGhhID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWyd4JywgJ1cnXTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IGNvbnZJbmZvLm91dFNoYXBlO1xuICAgICAgICBjb25zdCB4TnVtUm93cyA9IGNvbnZJbmZvLmluSGVpZ2h0O1xuICAgICAgICBjb25zdCB4TnVtQ29scyA9IGNvbnZJbmZvLmluV2lkdGg7XG4gICAgICAgIGNvbnN0IHBhZFRvcCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgICAgICBjb25zdCBwYWRMZWZ0ID0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgICAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgICAgIGNvbnN0IGRpbGF0aW9uSGVpZ2h0ID0gY29udkluZm8uZGlsYXRpb25IZWlnaHQ7XG4gICAgICAgIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICAgICAgICBjb25zdCBmaWx0ZXJIZWlnaHQgPSBjb252SW5mby5maWx0ZXJIZWlnaHQ7XG4gICAgICAgIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG4gICAgICAgIGNvbnN0IGNoYW5uZWxNdWwgPSBjb252SW5mby5vdXRDaGFubmVscyAvIGNvbnZJbmZvLmluQ2hhbm5lbHM7XG4gICAgICAgIGxldCBhY3RpdmF0aW9uU25pcHBldCA9ICcnLCBhcHBseUFjdGl2YXRpb25TbmlwcGV0ID0gJyc7XG4gICAgICAgIGlmIChhY3RpdmF0aW9uKSB7XG4gICAgICAgICAgICBpZiAoaGFzUHJlbHVBY3RpdmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYWN0aXZhdGlvblNuaXBwZXQgPSBgZmxvYXQgYWN0aXZhdGlvbihmbG9hdCBhKSB7XG4gICAgICAgICAgZmxvYXQgYiA9IGdldFByZWx1QWN0aXZhdGlvbldlaWdodHNBdE91dENvb3JkcygpO1xuICAgICAgICAgICR7YWN0aXZhdGlvbn1cbiAgICAgICAgfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChoYXNMZWFreVJlbHVBbHBoYSkge1xuICAgICAgICAgICAgICAgIGFjdGl2YXRpb25TbmlwcGV0ID0gYGZsb2F0IGFjdGl2YXRpb24oZmxvYXQgYSkge1xuICAgICAgICAgIGZsb2F0IGIgPSBnZXRMZWFreXJlbHVBbHBoYUF0T3V0Q29vcmRzKCk7XG4gICAgICAgICAgJHthY3RpdmF0aW9ufVxuICAgICAgICB9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGFjdGl2YXRpb25TbmlwcGV0ID0gYFxuICAgICAgICAgIGZsb2F0IGFjdGl2YXRpb24oZmxvYXQgeCkge1xuICAgICAgICAgICAgJHthY3RpdmF0aW9ufVxuICAgICAgICAgIH1cbiAgICAgICAgYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFwcGx5QWN0aXZhdGlvblNuaXBwZXQgPSBgcmVzdWx0ID0gYWN0aXZhdGlvbihyZXN1bHQpO2A7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWRkQmlhc1NuaXBwZXQgPSBhZGRCaWFzID8gJ3Jlc3VsdCArPSBnZXRCaWFzQXRPdXRDb29yZHMoKTsnIDogJyc7XG4gICAgICAgIGlmIChhZGRCaWFzKSB7XG4gICAgICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMucHVzaCgnYmlhcycpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNQcmVsdUFjdGl2YXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMudmFyaWFibGVOYW1lcy5wdXNoKCdwcmVsdUFjdGl2YXRpb25XZWlnaHRzJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc0xlYWt5UmVsdUFscGhhKSB7XG4gICAgICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMucHVzaCgnbGVha3lyZWx1QWxwaGEnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgJHthY3RpdmF0aW9uU25pcHBldH1cblxuICAgICAgY29uc3QgaXZlYzIgc3RyaWRlcyA9IGl2ZWMyKCR7c3RyaWRlSGVpZ2h0fSwgJHtzdHJpZGVXaWR0aH0pO1xuICAgICAgY29uc3QgaXZlYzIgcGFkcyA9IGl2ZWMyKCR7cGFkVG9wfSwgJHtwYWRMZWZ0fSk7XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiYXRjaCA9IGNvb3Jkcy54O1xuICAgICAgICBpdmVjMiB4UkNDb3JuZXIgPSBjb29yZHMueXogKiBzdHJpZGVzIC0gcGFkcztcbiAgICAgICAgaW50IGQyID0gY29vcmRzLnc7XG4gICAgICAgIGludCBkMSA9IGQyIC8gJHtjaGFubmVsTXVsfTtcbiAgICAgICAgaW50IHEgPSBkMiAtIGQxICogJHtjaGFubmVsTXVsfTtcblxuICAgICAgICBpbnQgeFJDb3JuZXIgPSB4UkNDb3JuZXIueDtcbiAgICAgICAgaW50IHhDQ29ybmVyID0geFJDQ29ybmVyLnk7XG5cbiAgICAgICAgLy8gQ29udm9sdmUgeCg/LCA/LCBkMSkgd2l0aCB3KDosIDosIGQxLCBxKSB0byBnZXQgeSh5UiwgeUMsIGQyKS5cbiAgICAgICAgLy8gPyA9IHRvIGJlIGRldGVybWluZWQuIDogPSBhY3Jvc3MgYWxsIHZhbHVlcyBpbiB0aGF0IGF4aXMuXG4gICAgICAgIGZsb2F0IGRvdFByb2QgPSAwLjA7XG4gICAgICAgIC8vIFRPIERPKGRzbWlsa292KTogRmxhdHRlbiB0aGUgdHdvIGZvciBsb29wcyBhbmQgdmVjNCB0aGUgb3BlcmF0aW9ucy5cbiAgICAgICAgZm9yIChpbnQgd1IgPSAwOyB3UiA8ICR7ZmlsdGVySGVpZ2h0fTsgd1IrKykge1xuICAgICAgICAgIGludCB4UiA9IHhSQ29ybmVyICsgd1IgKiAke2RpbGF0aW9uSGVpZ2h0fTtcblxuICAgICAgICAgIGlmICh4UiA8IDAgfHwgeFIgPj0gJHt4TnVtUm93c30pIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAoaW50IHdDID0gMDsgd0MgPCAke2ZpbHRlcldpZHRofTsgd0MrKykge1xuICAgICAgICAgICAgaW50IHhDID0geENDb3JuZXIgKyB3QyAqICR7ZGlsYXRpb25XaWR0aH07XG5cbiAgICAgICAgICAgIGlmICh4QyA8IDAgfHwgeEMgPj0gJHt4TnVtQ29sc30pIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZsb2F0IHhWYWwgPSBnZXRYKGJhdGNoLCB4UiwgeEMsIGQxKTtcbiAgICAgICAgICAgIGZsb2F0IHdWYWwgPSBnZXRXKHdSLCB3QywgZDEsIHEpO1xuICAgICAgICAgICAgZG90UHJvZCArPSB4VmFsICogd1ZhbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmbG9hdCByZXN1bHQgPSBkb3RQcm9kO1xuICAgICAgICAke2FkZEJpYXNTbmlwcGV0fVxuICAgICAgICAke2FwcGx5QWN0aXZhdGlvblNuaXBwZXR9XG4gICAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29udl9ncHVfZGVwdGh3aXNlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGNsYXNzIERlcHRod2lzZUNvbnZQYWNrZWQyRFByb2dyYW0ge1xuICAgIGNvbnN0cnVjdG9yKGNvbnZJbmZvLCBhZGRCaWFzID0gZmFsc2UsIGFjdGl2YXRpb24gPSBudWxsLCBoYXNQcmVsdUFjdGl2YXRpb24gPSBmYWxzZSwgaGFzTGVha3lSZWx1QWxwaGEgPSBmYWxzZSkge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ3gnLCAnVyddO1xuICAgICAgICB0aGlzLnBhY2tlZElucHV0cyA9IHRydWU7XG4gICAgICAgIHRoaXMucGFja2VkT3V0cHV0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IGNvbnZJbmZvLm91dFNoYXBlO1xuICAgICAgICBjb25zdCBjaGFubmVsTXVsID0gY29udkluZm8ub3V0Q2hhbm5lbHMgLyBjb252SW5mby5pbkNoYW5uZWxzO1xuICAgICAgICBjb25zdCB4TnVtUm93cyA9IGNvbnZJbmZvLmluSGVpZ2h0O1xuICAgICAgICBjb25zdCB4TnVtQ29scyA9IGNvbnZJbmZvLmluV2lkdGg7XG4gICAgICAgIGNvbnN0IHBhZFRvcCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgICAgICBjb25zdCBwYWRMZWZ0ID0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgICAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgICAgIGNvbnN0IGRpbGF0aW9uSGVpZ2h0ID0gY29udkluZm8uZGlsYXRpb25IZWlnaHQ7XG4gICAgICAgIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICAgICAgICBjb25zdCBmaWx0ZXJIZWlnaHQgPSBjb252SW5mby5maWx0ZXJIZWlnaHQ7XG4gICAgICAgIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG4gICAgICAgIGNvbnN0IHRleGVsc0Fjcm9zcyA9IGZpbHRlcldpZHRoO1xuICAgICAgICBsZXQgbWFpbkxvb3AgPSBgXG4gICAgICBpbnQgeFI7IGludCB4QzsgaW50IHhDT2Zmc2V0O1xuICAgICAgdmVjNCB3VGV4ZWw7IHZlYzQgcHJldmlvdXM7IHZlYzQgZmluYWw7YDtcbiAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBmaWx0ZXJXaWR0aDsgYysrKSB7XG4gICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgdmVjNCB4VGV4ZWxDJHtjICogMn07XG4gICAgICAgICAgaW50IHhUZXhlbEMke2MgKiAyfVJlYWR5O1xuICAgICAgICAgIHZlYzQgeFRleGVsQyR7YyAqIDIgKyAxfTtcbiAgICAgICAgICBpbnQgeFRleGVsQyR7YyAqIDIgKyAxfVJlYWR5O1xuICAgICAgICAgIHZlYzQgeEMke2N9O2A7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgdmVjdG9yaXplZCBpbXBsZW1lbnRhdGlvbiB3b3JrcyBieSBnYXRoZXJpbmcgdGhlIHZhbHVlcyBuZWVkZWQgZm9yXG4gICAgICAgICAqIGVhY2ggb3V0cHV0IGNoYW5uZWwncyBkb3QgcHJvZHVjdCBpbnRvIHZlYzQncyBhbmQgdGhlbiBtdWx0aXBseWluZyB0aGVtXG4gICAgICAgICAqIGFsbCB0b2dldGhlciAodGhpcyBoYXBwZW5zIGluIHRoZSBmaW5hbCBkb3VibGUgZm9yLWxvb3AgYmVsb3cpLiBNb3N0IG9mXG4gICAgICAgICAqIHRoZSBtYWluIGxvb3AgY29uc2lzdHMgb2YgY29uc3RydWN0aW5nIHRoZXNlIHZlYzQncyB3aXRoIHRoZSBtaW5pbXVtXG4gICAgICAgICAqIG51bWJlciBvZiB0ZXh0dXJlMkQgY2FsbHMsIHdoaWNoIG1lYW5zIG1ha2luZyB1c2Ugb2YgYWxsIGZvdXIgcmV0dXJuZWRcbiAgICAgICAgICogdmFsdWVzIGZyb20gYSB0ZXh0dXJlMkQgY2FsbCBhdCBvbmNlLlxuICAgICAgICAgKi9cbiAgICAgICAgZm9yIChsZXQgciA9IDA7IHIgPCBmaWx0ZXJIZWlnaHQ7IHIrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBmaWx0ZXJXaWR0aDsgYysrKSB7XG4gICAgICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgIHhUZXhlbEMke2MgKiAyfSA9IHZlYzQoMC4wKTtcbiAgICAgICAgICB4VGV4ZWxDJHtjICogMn1SZWFkeSA9IDA7XG4gICAgICAgICAgeFRleGVsQyR7YyAqIDIgKyAxfSA9IHZlYzQoMC4wKTtcbiAgICAgICAgICB4VGV4ZWxDJHtjICogMiArIDF9UmVhZHkgPSAwO1xuICAgICAgICAgIHhDJHtjfSA9IHZlYzQoMC4wKTtgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICB4UiA9IHhSQ29ybmVyICsgJHtyICogZGlsYXRpb25IZWlnaHR9O1xuICAgICAgICBpZiAoeFIgPj0wICYmIHhSIDwgJHt4TnVtUm93c30pIHtcbiAgICAgIGA7XG4gICAgICAgICAgICBmb3IgKGxldCB0ZXhlbEMgPSAwOyB0ZXhlbEMgPCAodGV4ZWxzQWNyb3NzICsgMSkgLyAyOyB0ZXhlbEMrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbEluZGV4ID0gdGV4ZWxDICogMjtcbiAgICAgICAgICAgICAgICBjb25zdCBjID0gY29sSW5kZXggKiBkaWxhdGlvbldpZHRoO1xuICAgICAgICAgICAgICAgIG1haW5Mb29wICs9IGBcbiAgICAgICAgICB4QyA9IHhDQ29ybmVyICsgJHtjfTtcbiAgICAgICAgICBgO1xuICAgICAgICAgICAgICAgIGlmIChzdHJpZGVXaWR0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29sSW5kZXggPCBmaWx0ZXJXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgcGFkZGluZyBpcyBvZGQsIHRoZSBvdXRlciB0ZXhlbHMgaGF2ZSB0byBiZSBjb21wb3NlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWRMZWZ0ICUgMiA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IEVuc3VyZSB2ZWM0IHByZXZpb3VzIGRvZXMgbm90IHJlc3VsdCBpbiByZWR1bmRhbnQgc2FtcGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBhdm9pZCBzZXR0aW5nIHhUZXhlbFJDJ3MgdGhhdCBleGNlZWQgdGhlIGJvdW5kYXJ5IGluIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IHBsYWNlIHJhdGhlciB0aGFuIHJlc2V0dGluZyB0aGVtIHRvIHZlYzQoMCkpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRvIGNvbXB1dGUgeENPZmZzZXQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLSBJZiBwYWRkaW5nIGlzIG9kZCwgd2UgbXVzdCBhZGQgMSB0byBlbnN1cmUgd2UgYXNrIGZvciBhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW4tbnVtYmVyZWQgcm93LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC0gV2Ugc3VidHJhY3QgMiB0byBhY2Nlc3MgdGhlIHByZXZpb3VzIHRleGVsLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5Mb29wICs9IGBcbiAgICAgICAgICAgICAgICB4Q09mZnNldCA9IHhDICsgMTtcbiAgICAgICAgICAgICAgICBpZiAoeENPZmZzZXQgPj0gMCAmJiB4Q09mZnNldCA8ICR7eE51bUNvbHN9ICYmIHhUZXhlbEMke2NvbEluZGV4fVJlYWR5ID09IDApIHtcbiAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4fSA9IGdldFgoYmF0Y2gsIHhSLCB4Q09mZnNldCwgZDEpO1xuXG4gICAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIG1hbnVhbGx5IGNsZWFyIHVudXNlZCBjaGFubmVscyBpbiBjYXNlXG4gICAgICAgICAgICAgICAgICAvLyB3ZSdyZSByZWFkaW5nIGZyb20gcmVjeWNsZWQgdGV4dHVyZS5cbiAgICAgICAgICAgICAgICAgIGlmICh4Q09mZnNldCArIDEgPj0gJHt4TnVtQ29sc30pIHtcbiAgICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXh9Lnp3ID0gdmVjMigwLjApO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXh9UmVhZHkgPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHRleGVsIGhhcyBiZWVuIHJlYWQgaW4gcHJldmlvdXMgaXRlcmF0aW9uIGlmIHRoZSBkaWxhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIDEuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpbGF0aW9uV2lkdGggPT09IDEgJiYgYyA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICAgIHhDJHtjb2xJbmRleH0gPSB2ZWM0KHhUZXhlbEMke2NvbEluZGV4IC0gMn0uencsIHhUZXhlbEMke2NvbEluZGV4fS54eSk7XG4gICAgICAgICAgICAgICAgYDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5Mb29wICs9IGBcbiAgICAgICAgICAgICAgICAgIHhDT2Zmc2V0ID0geEMgKyAxIC0gMjtcblxuICAgICAgICAgICAgICAgICAgaWYgKHhDT2Zmc2V0ID49IDAgJiYgeENPZmZzZXQgPCAke3hOdW1Db2xzfSkge1xuICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyA9IGdldFgoYmF0Y2gsIHhSLCB4Q09mZnNldCwgZDEpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gbWFudWFsbHkgY2xlYXIgdW51c2VkIGNoYW5uZWxzIGluIGNhc2VcbiAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgcmVhZGluZyBmcm9tIHJlY3ljbGVkIHRleHR1cmUuXG4gICAgICAgICAgICAgICAgICAgIGlmICh4Q09mZnNldCArIDEgPj0gJHt4TnVtQ29sc30pIHtcbiAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91cy56dyA9IHZlYzIoMC4wKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHhDJHtjb2xJbmRleH0gPSB2ZWM0KHByZXZpb3VzLnp3LCB4VGV4ZWxDJHtjb2xJbmRleH0ueHkpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgeEMke2NvbEluZGV4fSA9IHZlYzQoMC4wLCAwLjAsIHhUZXhlbEMke2NvbEluZGV4fS54eSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhZGRpbmcgaXMgZXZlbiwgc28geFJDIGNvcnJlc3BvbmRzIHRvIGEgc2luZ2xlIHRleGVsLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5Mb29wICs9IGBcbiAgICAgICAgICAgICAgICBpZiAoeEMgPj0gMCAmJiB4QyA8ICR7eE51bUNvbHN9ICYmIHhUZXhlbEMke2NvbEluZGV4fVJlYWR5ID09IDApIHtcbiAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4fSA9IGdldFgoYmF0Y2gsIHhSLCB4QywgZDEpO1xuICAgICAgICAgICAgICAgICAgaWYgKHhDICsgMSA+PSAke3hOdW1Db2xzfSkge1xuICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH0uencgPSB2ZWMyKDAuMCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH1SZWFkeSA9IDE7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgeEMke2NvbEluZGV4fSA9IHhUZXhlbEMke2NvbEluZGV4fTtcbiAgICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgKyAxIDwgZmlsdGVyV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBkaWxhdGlvbiBpcyBldmVuLCB0aGUgc2Vjb25kIGVudHJ5IHNob3VsZCBtYXRjaCB0aGUgZmlyc3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoZWl0aGVyIGJvdGggYXJlIGNvbXBvc2VkIG9yIGJvdGggYXJlIHNpbmdsZSBzYW1wbGVzKS4gQnV0IGlmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlsYXRpb24gaXMgb2RkLCB0aGVuIHRoZSBzZWNvbmQgZW50cnkgc2hvdWxkIGJlIHRoZSBvcHBvc2l0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBmaXJzdCAoaWYgdGhlIGZpcnN0IGlzIGNvbXBvc2VkLCB0aGUgc2Vjb25kIGlzIGEgc2luZ2xlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2FtcGxlLCBhbmQgdmljZSB2ZXJzYS4pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFRleGVsT2Zmc2V0ID0gcGFkTGVmdCAlIDIgPT09IDAgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsLm5lYXJlc3RMYXJnZXJFdmVuKGRpbGF0aW9uV2lkdGgpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlsYXRpb25XaWR0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGRpbGF0aW9uV2lkdGggJSAyID09PSAwICYmIHBhZExlZnQgJSAyID09PSAxKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGlsYXRpb25XaWR0aCAlIDIgIT09IDAgJiYgcGFkTGVmdCAlIDIgIT09IDEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5Mb29wICs9IGBcbiAgICAgICAgICAgICAgICAgIHhDT2Zmc2V0ID0geEMgKyAke3BhZExlZnQgJSAyfSArICR7bmV4dFRleGVsT2Zmc2V0fTtcblxuICAgICAgICAgICAgICAgICAgaWYgKHhDT2Zmc2V0ID49IDAgJiYgeENPZmZzZXQgPCAke3hOdW1Db2xzfSAmJiB4VGV4ZWxDJHtjb2xJbmRleCArIDF9UmVhZHkgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleCArIDF9ID0gZ2V0WChiYXRjaCwgeFIsIHhDT2Zmc2V0LCBkMSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gTmVlZCB0byBtYW51YWxseSBjbGVhciB1bnVzZWQgY2hhbm5lbHMgaW4gY2FzZVxuICAgICAgICAgICAgICAgICAgICAvLyB3ZSdyZSByZWFkaW5nIGZyb20gcmVjeWNsZWQgdGV4dHVyZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHhDT2Zmc2V0ICsgMSA+PSAke3hOdW1Db2xzfSkge1xuICAgICAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4ICsgMX0uencgPSB2ZWMyKDAuMCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXggKyAxfVJlYWR5ID0gMTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGRpbGF0aW9uID4gMSB0aGVuIHRoZSB4UkMncyB3aWxsIG5vdCBiZSBhYmxlIHRvIHNoYXJlIGFueVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZXMsIHNvIGVhY2ggeFJDIHdpbGwgcmVxdWlyZSB0d28gdW5pcXVlIGNhbGxzIHRvIGdldFguXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaWxhdGlvbldpZHRoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICAgICAgICB4Q09mZnNldCAtPSAyO1xuICAgICAgICAgICAgICAgICAgICBpZiAoeENPZmZzZXQgPj0gMCAmJiB4Q09mZnNldCA8ICR7eE51bUNvbHN9ICYmIHhUZXhlbEMke2NvbEluZGV4fVJlYWR5ID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH0gPSBnZXRYKGJhdGNoLCB4UiwgeENPZmZzZXQsIGQxKTtcbiAgICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH1SZWFkeSA9IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgICAgICB4QyR7Y29sSW5kZXggKyAxfSA9IHZlYzQoeFRleGVsQyR7Y29sSW5kZXh9Lnp3LCB4VGV4ZWxDJHtjb2xJbmRleCArIDF9Lnh5KTtcbiAgICAgICAgICAgICAgICAgIGA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBkaWxhdGlvbiBpcyAxIGFuZCBwYWRkaW5nIGlzIG9kZCwgd2UgaGF2ZSBhbHJlYWR5IHJlYWQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRleGVsIHdoZW4gY29uc3RydWN0aW5nIHRoZSBwcmV2aW91cyB4IHZhbHVlLiBIZXJlIHdlIGNhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaW1wbHkgc2tpcCB0aGUgdGV4dHVyZSByZWFkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dFRleGVsT2Zmc2V0ID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgICAgICAgIHhDJHtjb2xJbmRleCArIDF9ID0geFRleGVsQyR7Y29sSW5kZXh9O1xuICAgICAgICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICAgICAgICB4Q09mZnNldCA9IHhDICsgJHtuZXh0VGV4ZWxPZmZzZXR9O1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh4Q09mZnNldCA+PSAwICYmIHhDT2Zmc2V0IDwgJHt4TnVtQ29sc30gJiYgeFRleGVsQyR7Y29sSW5kZXggKyAxfVJlYWR5ID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleCArIDF9ID0gZ2V0WChiYXRjaCwgeFIsIHhDT2Zmc2V0LCBkMSk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHhDT2Zmc2V0ICsgMSA+PSAke3hOdW1Db2xzfSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXggKyAxfS56dyA9IHZlYzIoMC4wKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXggKyAxfVJlYWR5ID0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHhDJHtjb2xJbmRleCArIDF9ID0geFRleGVsQyR7Y29sSW5kZXggKyAxfTtcbiAgICAgICAgICAgICAgICAgICAgYDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHsgLy8gc3RyaWRlID09PSAyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjIDwgZmlsdGVyV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlcGVuZGluZyBvbiB3aGV0aGVyIHBhZExlZnQgaXMgZXZlbiBvciBvZGQsIHdlIHdhbnQgZWl0aGVyIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8geHkgb3IgencgY2hhbm5lbHMgZnJvbSBYIHRleGVscyBmb3IgeEMke2NvbEluZGV4fS4gSWYgcGFkTGVmdCBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbiwgeEMke2NvbEluZGV4ICsxfSBpcyBzaW1wbHkgdGhlIHp3IGNoYW5uZWxzIG9mIHRleGVscyB3ZSd2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBzYW1wbGVkLiBCdXQgaWYgcGFkTGVmdCBpcyBvZGQsIHhDeyRjICsgMX0uencgd2lsbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBjb21lIGZyb20gdGhlIHh5IGNoYW5uZWxzIG9mIGEgbmV3IHRleGVsLCBoZW5jZSB0aGUgYFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmVjNFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluYWxgIGluaXRpYWxpemVkIGJlbG93LlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhZExlZnQgJSAyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICAgIHhDT2Zmc2V0ID0geEMgKyAxIC0gJHtzdHJpZGVXaWR0aH07XG4gICAgICAgICAgICAgICAgaWYoeENPZmZzZXQgPj0gMCAmJiB4Q09mZnNldCA8ICR7eE51bUNvbHN9ICYmIHhUZXhlbEMke2NvbEluZGV4fVJlYWR5ID09IDApIHtcbiAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4fSA9IGdldFgoYmF0Y2gsIHhSLCB4Q09mZnNldCwgZDEpO1xuICAgICAgICAgICAgICAgICAgLy8gTmVlZCB0byBtYW51YWxseSBjbGVhciB1bnVzZWQgY2hhbm5lbHMgaW4gY2FzZVxuICAgICAgICAgICAgICAgICAgLy8gd2UncmUgcmVhZGluZyBmcm9tIHJlY3ljbGVkIHRleHR1cmUuXG4gICAgICAgICAgICAgICAgICBpZiAoeENPZmZzZXQgKyAxID49ICR7eE51bUNvbHN9KSB7XG4gICAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4fS56dyA9IHZlYzIoMC4wKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4fVJlYWR5ID0gMTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZih4QyArIDEgPj0gMCAmJiB4QyArIDEgPCAke3hOdW1Db2xzfSAmJiB4VGV4ZWxDJHtjb2xJbmRleCArIDF9UmVhZHkgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXggKyAxfSA9IGdldFgoYmF0Y2gsIHhSLCB4QyArIDEsIGQxKTtcbiAgICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gbWFudWFsbHkgY2xlYXIgdW51c2VkIGNoYW5uZWxzIGluIGNhc2VcbiAgICAgICAgICAgICAgICAgIC8vIHdlJ3JlIHJlYWRpbmcgZnJvbSByZWN5Y2xlZCB0ZXh0dXJlLlxuICAgICAgICAgICAgICAgICAgaWYgKHhDICsgMiA+PSAke3hOdW1Db2xzfSkge1xuICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleCArIDF9Lnp3ID0gdmVjMigwLjApO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXggKyAxfVJlYWR5ID0gMTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB4QyR7Y29sSW5kZXh9ID0gdmVjNCh4VGV4ZWxDJHtjb2xJbmRleH0uencsIHhUZXhlbEMke2NvbEluZGV4ICsgMX0uencpO1xuICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjICsgMSA8IGZpbHRlcldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5Mb29wICs9IGBcbiAgICAgICAgICAgICAgICAgIGZpbmFsID0gdmVjNCgwLjApO1xuICAgICAgICAgICAgICAgICAgeENPZmZzZXQgPSB4QyArIDEgKyAke3N0cmlkZVdpZHRofTtcbiAgICAgICAgICAgICAgICAgIGlmKHhDT2Zmc2V0ID49IDAgJiYgeENPZmZzZXQgPCAke3hOdW1Db2xzfSkge1xuICAgICAgICAgICAgICAgICAgICBmaW5hbCA9IGdldFgoYmF0Y2gsIHhSLCB4Q09mZnNldCwgZDEpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgeEMke2NvbEluZGV4ICsgMX0gPSB2ZWM0KHhUZXhlbEMke2NvbEluZGV4ICsgMX0ueHksIGZpbmFsLnh5KTtcbiAgICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5Mb29wICs9IGBcbiAgICAgICAgICAgICAgICBpZih4QyA+PSAwICYmIHhDIDwgJHt4TnVtQ29sc30gJiYgeFRleGVsQyR7Y29sSW5kZXh9UmVhZHkgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXh9ID0gZ2V0WChiYXRjaCwgeFIsIHhDLCBkMSk7XG4gICAgICAgICAgICAgICAgICBpZiAoeEMgKyAxID49ICR7eE51bUNvbHN9KSB7XG4gICAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4fS56dyA9IHZlYzIoMC4wKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4fVJlYWR5ID0gMTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB4Q09mZnNldCA9IHhDICsgJHtzdHJpZGVXaWR0aH07XG4gICAgICAgICAgICAgICAgaWYoeENPZmZzZXQgPj0gMCAmJiB4Q09mZnNldCA8ICR7eE51bUNvbHN9ICYmIHhUZXhlbEMke2NvbEluZGV4ICsgMX1SZWFkeSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleCArIDF9ID0gZ2V0WChiYXRjaCwgeFIsIHhDT2Zmc2V0LCBkMSk7XG4gICAgICAgICAgICAgICAgICBpZiAoeENPZmZzZXQgKyAxID49ICR7eE51bUNvbHN9KSB7XG4gICAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4ICsgMX0uencgPSB2ZWMyKDAuKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4ICsgMX1SZWFkeSA9IDE7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgeEMke2NvbEluZGV4fSA9IHZlYzQoXG4gICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH0ueHksIHhUZXhlbEMke2NvbEluZGV4ICsgMX0ueHkpO1xuICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjICsgMSA8IGZpbHRlcldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5Mb29wICs9IGBcbiAgICAgICAgICAgICAgICAgIHhDJHtjb2xJbmRleCArIDF9ID0gdmVjNCh4VGV4ZWxDJHtjb2xJbmRleH0uencsIHhUZXhlbEMke2NvbEluZGV4ICsgMX0uencpO1xuICAgICAgICAgICAgICAgIGA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGxvY2FsaXplIHRoZSBkb3RQcm9kIGFjY3VtdWxhdGlvbiB3aXRoaW4gdGhlIGxvb3AsIHRoZSB0aGVvcnkgaXMgZm9yXG4gICAgICAgICAgICAgICAgLy8gR1BVIHdpdGggbGltaXRlZCBjYWNoZSwgYWNjdW11bGF0ZSBzdW0gYWNyb3NzIGxhcmdlIGFtb3VudCBvZlxuICAgICAgICAgICAgICAgIC8vIHZlcmlhYmxlcyB3aWxsIGNhdXNlIGxvdHMgb2YgY2FjaGUgbWlzc2VzLiAoaS5lLiA1eDUgZmlsdGVyIHdpbGwgaGF2ZVxuICAgICAgICAgICAgICAgIC8vIDUwIHZhcmlhYmxlcylcbiAgICAgICAgICAgICAgICBpZiAoY29sSW5kZXggPCBmaWx0ZXJXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICB3VGV4ZWwgPSBnZXRXKCR7cn0sICR7Y30sIGQxLCBxKTtcbiAgICAgICAgICAgIGRvdFByb2QgKz0geEMke2NvbEluZGV4fSAqIHZlYzQod1RleGVsLnh6LCB3VGV4ZWwueHopO1xuICAgICAgICAgIGA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjICsgMSA8IGZpbHRlcldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgIHdUZXhlbCA9IGdldFcoJHtyfSwgJHtjICsgMX0sIGQxLCBxKTtcbiAgICAgICAgICAgICAgZG90UHJvZCArPSB4QyR7Y29sSW5kZXggKyAxfSAqIHZlYzQod1RleGVsLnh6LCB3VGV4ZWwueHopO1xuICAgICAgICAgICAgYDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1haW5Mb29wICs9IGBcbiAgICAgICAgfVxuICAgICAgYDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYWN0aXZhdGlvblNuaXBwZXQgPSAnJywgYXBwbHlBY3RpdmF0aW9uU25pcHBldCA9ICcnO1xuICAgICAgICBpZiAoYWN0aXZhdGlvbikge1xuICAgICAgICAgICAgaWYgKGhhc1ByZWx1QWN0aXZhdGlvbikge1xuICAgICAgICAgICAgICAgIGFjdGl2YXRpb25TbmlwcGV0ID0gYHZlYzQgYWN0aXZhdGlvbih2ZWM0IGEpIHtcbiAgICAgICAgICB2ZWM0IGIgPSBnZXRQcmVsdUFjdGl2YXRpb25XZWlnaHRzQXRPdXRDb29yZHMoKTtcbiAgICAgICAgICAke2FjdGl2YXRpb259XG4gICAgICAgIH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaGFzTGVha3lSZWx1QWxwaGEpIHtcbiAgICAgICAgICAgICAgICBhY3RpdmF0aW9uU25pcHBldCA9IGB2ZWM0IGFjdGl2YXRpb24odmVjNCBhKSB7XG4gICAgICAgICAgdmVjNCBiID0gZ2V0TGVha3lyZWx1QWxwaGFBdE91dENvb3JkcygpO1xuICAgICAgICAgICR7YWN0aXZhdGlvbn1cbiAgICAgICAgfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhY3RpdmF0aW9uU25pcHBldCA9IGB2ZWM0IGFjdGl2YXRpb24odmVjNCB4KSB7XG4gICAgICAgICAgJHthY3RpdmF0aW9ufVxuICAgICAgICB9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFwcGx5QWN0aXZhdGlvblNuaXBwZXQgPSBgcmVzdWx0ID0gYWN0aXZhdGlvbihyZXN1bHQpO2A7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWRkQmlhc1NuaXBwZXQgPSBhZGRCaWFzID8gJ3Jlc3VsdCArPSBnZXRCaWFzQXRPdXRDb29yZHMoKTsnIDogJyc7XG4gICAgICAgIGlmIChhZGRCaWFzKSB7XG4gICAgICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMucHVzaCgnYmlhcycpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNQcmVsdUFjdGl2YXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMudmFyaWFibGVOYW1lcy5wdXNoKCdwcmVsdUFjdGl2YXRpb25XZWlnaHRzJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc0xlYWt5UmVsdUFscGhhKSB7XG4gICAgICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMucHVzaCgnbGVha3lyZWx1QWxwaGEnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgJHthY3RpdmF0aW9uU25pcHBldH1cblxuICAgICAgY29uc3QgaXZlYzIgc3RyaWRlcyA9IGl2ZWMyKCR7c3RyaWRlSGVpZ2h0fSwgJHtzdHJpZGVXaWR0aH0pO1xuICAgICAgY29uc3QgaXZlYzIgcGFkcyA9IGl2ZWMyKCR7cGFkVG9wfSwgJHtwYWRMZWZ0fSk7XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcblxuICAgICAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzLng7XG4gICAgICAgIGl2ZWMyIHhSQ0Nvcm5lciA9IGNvb3Jkcy55eiAqIHN0cmlkZXMgLSBwYWRzO1xuICAgICAgICBpbnQgZDIgPSBjb29yZHMudztcbiAgICAgICAgaW50IGQxID0gZDIgLyAke2NoYW5uZWxNdWx9O1xuICAgICAgICBpbnQgcSA9IGQyIC0gZDEgKiAke2NoYW5uZWxNdWx9O1xuICAgICAgICBpbnQgeFJDb3JuZXIgPSB4UkNDb3JuZXIueDtcbiAgICAgICAgaW50IHhDQ29ybmVyID0geFJDQ29ybmVyLnk7XG5cbiAgICAgICAgLy9pbnRpYWxpemUgZG90UHJvZCB3aXRoIGEgc21hbGwgZXBzaWxvbiBzZWVtcyB0byByZWR1Y2UgR1BVIGFjY3VyYWN5IGxvc3MuXG4gICAgICAgIHZlYzQgZG90UHJvZCA9IHZlYzQoMC4wMDAwMDAwMDAwMDAwMDEpO1xuXG4gICAgICAgICR7bWFpbkxvb3B9XG5cbiAgICAgICAgdmVjNCByZXN1bHQgPSBkb3RQcm9kIC0gdmVjNCgwLjAwMDAwMDAwMDAwMDAwMSk7XG4gICAgICAgICR7YWRkQmlhc1NuaXBwZXR9XG4gICAgICAgICR7YXBwbHlBY3RpdmF0aW9uU25pcHBldH1cbiAgICAgICAgc2V0T3V0cHV0KHJlc3VsdCk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb252X3BhY2tlZF9ncHVfZGVwdGh3aXNlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmV4cG9ydCBjbGFzcyBDcm9wQW5kUmVzaXplUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoaW1hZ2VTaGFwZSwgYm94U2hhcGUsIGNyb3BTaXplLCBtZXRob2QsIGV4dHJhcG9sYXRpb25WYWx1ZSkge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ0ltYWdlJywgJ0JveGVzJywgJ0JveEluZCddO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gW107XG4gICAgICAgIGNvbnN0IFtiYXRjaCwgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIGRlcHRoXSA9IGltYWdlU2hhcGU7XG4gICAgICAgIGNvbnN0IFtudW1Cb3hlcyxdID0gYm94U2hhcGU7XG4gICAgICAgIGNvbnN0IFtjcm9wSGVpZ2h0LCBjcm9wV2lkdGhdID0gY3JvcFNpemU7XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBbbnVtQm94ZXMsIGNyb3BIZWlnaHQsIGNyb3BXaWR0aCwgZGVwdGhdO1xuICAgICAgICBjb25zdCBtZXRob2RJZCA9IG1ldGhvZCA9PT0gJ2JpbGluZWFyJyA/IDEgOiAwO1xuICAgICAgICBjb25zdCBbaW5wdXRIZWlnaHRGbG9hdCwgaW5wdXRXaWR0aEZsb2F0XSA9IFtgJHtpbWFnZUhlaWdodCAtIDF9LjBgLCBgJHtpbWFnZVdpZHRoIC0gMX0uMGBdO1xuICAgICAgICBjb25zdCBbaGVpZ2h0UmF0aW8sIGhlaWdodFNjYWxlLCBpblldID0gY3JvcEhlaWdodCA+IDEgP1xuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIGAkeyhpbWFnZUhlaWdodCAtIDEpIC8gKGNyb3BIZWlnaHQgLSAxKX1gLFxuICAgICAgICAgICAgICAgICcoeTIteTEpICogaGVpZ2h0X3JhdGlvJyxcbiAgICAgICAgICAgICAgICBgeTEqJHtpbnB1dEhlaWdodEZsb2F0fSArIGZsb2F0KHkpKihoZWlnaHRfc2NhbGUpYCxcbiAgICAgICAgICAgIF0gOlxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICcwLjAnLFxuICAgICAgICAgICAgICAgICcwLjAnLFxuICAgICAgICAgICAgICAgIGAwLjUgKiAoeTEreTIpICogJHtpbnB1dEhlaWdodEZsb2F0fWAsXG4gICAgICAgICAgICBdO1xuICAgICAgICBjb25zdCBbd2lkdGhSYXRpbywgd2lkdGhTY2FsZSwgaW5YXSA9IGNyb3BXaWR0aCA+IDEgP1xuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIGAkeyhpbWFnZVdpZHRoIC0gMSkgLyAoY3JvcFdpZHRoIC0gMSl9YCxcbiAgICAgICAgICAgICAgICAnKHgyLXgxKSAqIHdpZHRoX3JhdGlvJyxcbiAgICAgICAgICAgICAgICBgeDEqJHtpbnB1dFdpZHRoRmxvYXR9ICsgZmxvYXQoeCkqKHdpZHRoX3NjYWxlKWAsXG4gICAgICAgICAgICBdIDpcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAnMC4wJyxcbiAgICAgICAgICAgICAgICAnMC4wJyxcbiAgICAgICAgICAgICAgICBgMC41ICogKHgxK3gyKSAqICR7aW5wdXRXaWR0aEZsb2F0fWAsXG4gICAgICAgICAgICBdO1xuICAgICAgICAvLyBSZWZlcmVuY2UgaW1wbGVtZW50YXRpb25cbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3JmbG93L2Jsb2IvbWFzdGVyL3RlbnNvcmZsb3cvY29yZS9rZXJuZWxzL2Nyb3BfYW5kX3Jlc2l6ZV9vcF9ncHUuY3UuY2NcbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IGZsb2F0IGhlaWdodF9yYXRpbyA9IGZsb2F0KCR7aGVpZ2h0UmF0aW99KTtcbiAgICAgIGNvbnN0IGZsb2F0IHdpZHRoX3JhdGlvID0gZmxvYXQoJHt3aWR0aFJhdGlvfSk7XG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYiA9IGNvb3Jkc1swXTtcbiAgICAgICAgaW50IHkgPSBjb29yZHNbMV07XG4gICAgICAgIGludCB4ID0gY29vcmRzWzJdO1xuICAgICAgICBpbnQgZCA9IGNvb3Jkc1szXTtcblxuICAgICAgICAvLyBnZXQgYm94IHZhbHNcbiAgICAgICAgZmxvYXQgeTEgPSBnZXRCb3hlcyhiLDApO1xuICAgICAgICBmbG9hdCB4MSA9IGdldEJveGVzKGIsMSk7XG4gICAgICAgIGZsb2F0IHkyID0gZ2V0Qm94ZXMoYiwyKTtcbiAgICAgICAgZmxvYXQgeDIgPSBnZXRCb3hlcyhiLDMpO1xuXG4gICAgICAgIC8vIGdldCBpbWFnZSBpbiBiYXRjaCBpbmRleFxuICAgICAgICBpbnQgYkluZCA9IHJvdW5kKGdldEJveEluZChiKSk7XG4gICAgICAgIGlmKGJJbmQgPCAwIHx8IGJJbmQgPj0gJHtiYXRjaH0pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmbG9hdCBoZWlnaHRfc2NhbGUgPSAke2hlaWdodFNjYWxlfTtcbiAgICAgICAgZmxvYXQgd2lkdGhfc2NhbGUgPSAke3dpZHRoU2NhbGV9O1xuXG4gICAgICAgIGZsb2F0IGluX3kgPSAke2luWX07XG4gICAgICAgIGlmKCBpbl95IDwgMC4wIHx8IGluX3kgPiAke2lucHV0SGVpZ2h0RmxvYXR9ICkge1xuICAgICAgICAgIHNldE91dHB1dChmbG9hdCgke2V4dHJhcG9sYXRpb25WYWx1ZX0pKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZmxvYXQgaW5feCA9ICR7aW5YfTtcbiAgICAgICAgaWYoIGluX3ggPCAwLjAgfHwgaW5feCA+ICR7aW5wdXRXaWR0aEZsb2F0fSApIHtcbiAgICAgICAgICBzZXRPdXRwdXQoZmxvYXQoJHtleHRyYXBvbGF0aW9uVmFsdWV9KSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmVjMiBzb3VyY2VGcmFjSW5kZXhDUiA9IHZlYzIoaW5feCxpbl95KTtcbiAgICAgICAgaWYoJHttZXRob2RJZH0gPT0gMSkge1xuICAgICAgICAgIC8vIENvbXB1dGUgdGhlIGZvdXIgaW50ZWdlciBpbmRpY2VzLlxuICAgICAgICAgIGl2ZWMyIHNvdXJjZUZsb29yQ1IgPSBpdmVjMihzb3VyY2VGcmFjSW5kZXhDUik7XG4gICAgICAgICAgaXZlYzIgc291cmNlQ2VpbENSID0gaXZlYzIoY2VpbChzb3VyY2VGcmFjSW5kZXhDUikpO1xuXG4gICAgICAgICAgZmxvYXQgdG9wTGVmdCA9IGdldEltYWdlKGIsIHNvdXJjZUZsb29yQ1IueSwgc291cmNlRmxvb3JDUi54LCBkKTtcbiAgICAgICAgICBmbG9hdCBib3R0b21MZWZ0ID0gZ2V0SW1hZ2UoYiwgc291cmNlQ2VpbENSLnksIHNvdXJjZUZsb29yQ1IueCwgZCk7XG4gICAgICAgICAgZmxvYXQgdG9wUmlnaHQgPSBnZXRJbWFnZShiLCBzb3VyY2VGbG9vckNSLnksIHNvdXJjZUNlaWxDUi54LCBkKTtcbiAgICAgICAgICBmbG9hdCBib3R0b21SaWdodCA9IGdldEltYWdlKGIsIHNvdXJjZUNlaWxDUi55LCBzb3VyY2VDZWlsQ1IueCwgZCk7XG5cbiAgICAgICAgICB2ZWMyIGZyYWNDUiA9IHNvdXJjZUZyYWNJbmRleENSIC0gdmVjMihzb3VyY2VGbG9vckNSKTtcblxuICAgICAgICAgIGZsb2F0IHRvcCA9IHRvcExlZnQgKyAodG9wUmlnaHQgLSB0b3BMZWZ0KSAqIGZyYWNDUi54O1xuICAgICAgICAgIGZsb2F0IGJvdHRvbSA9IGJvdHRvbUxlZnQgKyAoYm90dG9tUmlnaHQgLSBib3R0b21MZWZ0KSAqIGZyYWNDUi54O1xuICAgICAgICAgIGZsb2F0IG5ld1ZhbHVlID0gdG9wICsgKGJvdHRvbSAtIHRvcCkgKiBmcmFjQ1IueTtcbiAgICAgICAgICBzZXRPdXRwdXQobmV3VmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIENvbXB1dGUgdGhlIGNvb3JkaW5hdG9ycyBvZiBuZWFyZXN0IG5laWdoYm9yIHBvaW50LlxuICAgICAgICAgIGl2ZWMyIHNvdXJjZU5lYXJlc3RDUiA9IGl2ZWMyKGZsb29yKFxuICAgICAgICAgICAgc291cmNlRnJhY0luZGV4Q1IgKyB2ZWMyKDAuNSwwLjUpKSk7XG4gICAgICAgICAgZmxvYXQgbmV3VmFsdWUgPSBnZXRJbWFnZShiLCBzb3VyY2VOZWFyZXN0Q1IueSwgc291cmNlTmVhcmVzdENSLngsIGQpO1xuICAgICAgICAgIHNldE91dHB1dChuZXdWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNyb3BfYW5kX3Jlc2l6ZV9ncHUuanMubWFwIiwiaW1wb3J0IHsgZ2V0Q29vcmRzRGF0YVR5cGUgfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5leHBvcnQgY2xhc3MgQ3VtU3VtUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3Ioc2hhcGUsIGV4Y2x1c2l2ZSwgcmV2ZXJzZSkge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgICAgICAgdGhpcy5jdXN0b21Vbmlmb3JtcyA9IFt7IG5hbWU6ICdpbmRleCcsIHR5cGU6ICdmbG9hdCcgfV07XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBzaGFwZTtcbiAgICAgICAgY29uc3QgcmFuayA9IHNoYXBlLmxlbmd0aDtcbiAgICAgICAgY29uc3QgdmFsID0gZXhjbHVzaXZlID8gJzAuMCcgOiBgZ2V0WCgke2dldENvb3JkcyhyYW5rLCAnY29vcmRzJyl9KWA7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHNoYXBlW3NoYXBlLmxlbmd0aCAtIDFdO1xuICAgICAgICBsZXQgY29uZGl0aW9uID0gJyc7XG4gICAgICAgIGxldCBpZHhTdHJpbmcgPSAnJztcbiAgICAgICAgLy8gV2hlbiBleGNsdXNpdmUgaXMgc2V0LCB0aGUgY3Vtc3VtIG9wIGJlY29tZXMgcm9sbCBvcCB0aGF0IGNvcGllcyB0aGVcbiAgICAgICAgLy8gdmFsdWUgZnJvbSB0aGUgcHJldmlvdXMgaW5kZXggYmFzZWQgb24gdGhlIGRpcmVjdGlvbiBzcGVjaWZpZWQgYnkgdGhlXG4gICAgICAgIC8vIHJldmVyc2UgZmxhZy5cbiAgICAgICAgaWYgKGV4Y2x1c2l2ZSkge1xuICAgICAgICAgICAgY29uZGl0aW9uID0gcmV2ZXJzZSA/IGBlbmQgIT0gJHtsZW5ndGggLSAxfWAgOiAnZW5kICE9IDAnO1xuICAgICAgICAgICAgaWR4U3RyaW5nID0gcmV2ZXJzZSA/ICdlbmQgKyAxJyA6ICdlbmQgLSAxJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IHJldmVyc2UgPyBgZW5kICsgcG93MiA8ICR7bGVuZ3RofWAgOiAnZW5kID49IHBvdzInO1xuICAgICAgICAgICAgaWR4U3RyaW5nID0gKHJldmVyc2UgPyAnZW5kICsgcG93MicgOiAnZW5kIC0gcG93MicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICR7Z2V0Q29vcmRzRGF0YVR5cGUocmFuayl9IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgZW5kID0gJHtnZXRGaW5hbENvb3JkKHJhbmssICdjb29yZHMnKX07XG4gICAgICAgIGZsb2F0IHZhbCA9ICR7dmFsfTtcbiAgICAgICAgaW50IHBvdzIgPSBpbnQocG93KDIuMCwgaW5kZXgpKTtcbiAgICAgICAgaWYgKCR7Y29uZGl0aW9ufSkge1xuICAgICAgICAgIGludCBpZHggPSAke2lkeFN0cmluZ307XG4gICAgICAgICAgJHtnZXRGaW5hbENvb3JkKHJhbmssICdjb29yZHMnKX0gPSBpZHg7XG4gICAgICAgICAgdmFsICs9IGdldFgoJHtnZXRDb29yZHMocmFuaywgJ2Nvb3JkcycpfSk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0T3V0cHV0KHZhbCk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRDb29yZHMocmFuaywgbmFtZSkge1xuICAgIGlmIChyYW5rID09PSAxKSB7XG4gICAgICAgIHJldHVybiBgJHtuYW1lfWA7XG4gICAgfVxuICAgIGVsc2UgaWYgKHJhbmsgPT09IDIpIHtcbiAgICAgICAgcmV0dXJuIGAke25hbWV9LngsICR7bmFtZX0ueWA7XG4gICAgfVxuICAgIGVsc2UgaWYgKHJhbmsgPT09IDMpIHtcbiAgICAgICAgcmV0dXJuIGAke25hbWV9LngsICR7bmFtZX0ueSwgJHtuYW1lfS56YDtcbiAgICB9XG4gICAgZWxzZSBpZiAocmFuayA9PT0gNCkge1xuICAgICAgICByZXR1cm4gYCR7bmFtZX0ueCwgJHtuYW1lfS55LCAke25hbWV9LnosICR7bmFtZX0ud2A7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBFcnJvcihgQ3VtdWxhdGl2ZSBzdW0gZm9yIHJhbmsgJHtyYW5rfSBpcyBub3QgeWV0IHN1cHBvcnRlZGApO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldEZpbmFsQ29vcmQocmFuaywgbmFtZSkge1xuICAgIGlmIChyYW5rID09PSAxKSB7XG4gICAgICAgIHJldHVybiBgJHtuYW1lfWA7XG4gICAgfVxuICAgIGVsc2UgaWYgKHJhbmsgPT09IDIpIHtcbiAgICAgICAgcmV0dXJuIGAke25hbWV9LnlgO1xuICAgIH1cbiAgICBlbHNlIGlmIChyYW5rID09PSAzKSB7XG4gICAgICAgIHJldHVybiBgJHtuYW1lfS56YDtcbiAgICB9XG4gICAgZWxzZSBpZiAocmFuayA9PT0gNCkge1xuICAgICAgICByZXR1cm4gYCR7bmFtZX0ud2A7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBFcnJvcihgQ3VtdWxhdGl2ZSBzdW0gZm9yIHJhbmsgJHtyYW5rfSBpcyBub3QgeWV0IHN1cHBvcnRlZGApO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWN1bXN1bV9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZ2V0R2xzbERpZmZlcmVuY2VzIH0gZnJvbSAnLi9nbHNsX3ZlcnNpb24nO1xuaW1wb3J0ICogYXMgc2hhZGVyX3V0aWwgZnJvbSAnLi9zaGFkZXJfY29tcGlsZXJfdXRpbCc7XG5pbXBvcnQgeyBnZXREZW5zZVRleFNoYXBlLCBQYWNraW5nU2NoZW1lIH0gZnJvbSAnLi90ZXhfdXRpbCc7XG5leHBvcnQgY2xhc3MgRGVjb2RlTWF0cml4UHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3Iob3V0cHV0U2hhcGUpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWydBJ107XG4gICAgICAgIHRoaXMucGFja2VkSW5wdXRzID0gZmFsc2U7XG4gICAgICAgIHRoaXMucGFja2VkT3V0cHV0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5vdXRQYWNraW5nU2NoZW1lID0gUGFja2luZ1NjaGVtZS5ERU5TRTtcbiAgICAgICAgY29uc3QgdGV4U2hhcGUgPSBnZXREZW5zZVRleFNoYXBlKG91dHB1dFNoYXBlKTtcbiAgICAgICAgY29uc3QgZ2xzbCA9IGdldEdsc2xEaWZmZXJlbmNlcygpO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGU7XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBpdmVjMyBvdXRDb29yZHNGcm9tRmxhdEluZGV4KGludCBpbmRleCkge1xuICAgICAgICAke3NoYWRlcl91dGlsLmdldExvZ2ljYWxDb29yZGluYXRlc0Zyb21GbGF0SW5kZXgoWydyJywgJ2MnLCAnZCddLCBvdXRwdXRTaGFwZSl9XG4gICAgICAgIHJldHVybiBpdmVjMyhyLCBjLCBkKTtcbiAgICAgIH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICB2ZWMyKCR7dGV4U2hhcGVbMF19LCAke3RleFNoYXBlWzFdfSkpO1xuICAgICAgICBpbnQgaW5kZXggPSA0ICogKHJlc1RleFJDLnggKiAke3RleFNoYXBlWzFdfSArIHJlc1RleFJDLnkpO1xuXG4gICAgICAgIHZlYzQgcmVzdWx0ID0gdmVjNCgwLik7XG5cbiAgICAgICAgZm9yIChpbnQgaT0wOyBpPDQ7IGkrKykge1xuICAgICAgICAgIGludCBmbGF0SW5kZXggPSBpbmRleCArIGk7XG4gICAgICAgICAgaXZlYzMgcmMgPSBvdXRDb29yZHNGcm9tRmxhdEluZGV4KGZsYXRJbmRleCk7XG4gICAgICAgICAgcmVzdWx0W2ldID0gZ2V0QShyYy54LCByYy55LCByYy56KTtcbiAgICAgICAgfVxuXG4gICAgICAgICR7Z2xzbC5vdXRwdXR9ID0gcmVzdWx0O1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGVjb2RlX21hdHJpeF9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZ2V0R2xzbERpZmZlcmVuY2VzIH0gZnJvbSAnLi9nbHNsX3ZlcnNpb24nO1xuaW1wb3J0ICogYXMgc2hhZGVyX3V0aWwgZnJvbSAnLi9zaGFkZXJfY29tcGlsZXJfdXRpbCc7XG5pbXBvcnQgeyBnZXREZW5zZVRleFNoYXBlLCBQYWNraW5nU2NoZW1lIH0gZnJvbSAnLi90ZXhfdXRpbCc7XG5leHBvcnQgY2xhc3MgRGVjb2RlTWF0cml4UGFja2VkUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3Iob3V0cHV0U2hhcGUpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWydBJ107XG4gICAgICAgIHRoaXMucGFja2VkSW5wdXRzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wYWNrZWRPdXRwdXQgPSB0cnVlO1xuICAgICAgICB0aGlzLm91dFBhY2tpbmdTY2hlbWUgPSBQYWNraW5nU2NoZW1lLkRFTlNFO1xuICAgICAgICBjb25zdCB0ZXhTaGFwZSA9IGdldERlbnNlVGV4U2hhcGUob3V0cHV0U2hhcGUpO1xuICAgICAgICBjb25zdCBnbHNsID0gZ2V0R2xzbERpZmZlcmVuY2VzKCk7XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGl2ZWMzIG91dENvb3Jkc0Zyb21GbGF0SW5kZXgoaW50IGluZGV4KSB7XG4gICAgICAgICR7c2hhZGVyX3V0aWwuZ2V0TG9naWNhbENvb3JkaW5hdGVzRnJvbUZsYXRJbmRleChbJ3InLCAnYycsICdkJ10sIG91dHB1dFNoYXBlKX1cbiAgICAgICAgcmV0dXJuIGl2ZWMzKHIsIGMsIGQpO1xuICAgICAgfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIocmVzdWx0VVYueXggKlxuICAgICAgICAgIHZlYzIoJHt0ZXhTaGFwZVswXX0sICR7dGV4U2hhcGVbMV19KSk7XG4gICAgICAgIGludCBpbmRleCA9IDQgKiAocmVzVGV4UkMueCAqICR7dGV4U2hhcGVbMV19ICsgcmVzVGV4UkMueSk7XG5cbiAgICAgICAgdmVjNCByZXN1bHQgPSB2ZWM0KDAuKTtcblxuICAgICAgICBmb3IgKGludCBpPTA7IGk8NDsgaSsrKSB7XG4gICAgICAgICAgaW50IGZsYXRJbmRleCA9IGluZGV4ICsgaTtcbiAgICAgICAgICBpdmVjMyByYyA9IG91dENvb3Jkc0Zyb21GbGF0SW5kZXgoZmxhdEluZGV4KTtcbiAgICAgICAgICByZXN1bHRbaV0gPSBnZXRDaGFubmVsKGdldEEocmMueCwgcmMueSwgcmMueiksIHZlYzIocmMueSwgcmMueikpO1xuICAgICAgICB9XG5cbiAgICAgICAgJHtnbHNsLm91dHB1dH0gPSByZXN1bHQ7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWNvZGVfbWF0cml4X3BhY2tlZF9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuZXhwb3J0IGNsYXNzIERlcHRoVG9TcGFjZVByb2dyYW0ge1xuICAgIGNvbnN0cnVjdG9yKG91dHB1dFNoYXBlLCBibG9ja1NpemUsIGRhdGFGb3JtYXQpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWyd4J107XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBbXTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IG91dHB1dFNoYXBlO1xuICAgICAgICB0aGlzLmJsb2NrU2l6ZSA9IGJsb2NrU2l6ZTtcbiAgICAgICAgdGhpcy5kYXRhRm9ybWF0ID0gZGF0YUZvcm1hdDtcbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICB2b2lkIG1haW4oKSB7XG4gICAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgIGludCBiID0gY29vcmRzWzBdO1xuICAgICAgaW50IGggPSAke3RoaXMuZ2V0SGVpZ2h0Q29vcmRTdHJpbmcoKX07XG4gICAgICBpbnQgdyA9ICR7dGhpcy5nZXRXaWR0aENvb3JkU3RyaW5nKCl9O1xuICAgICAgaW50IGQgPSAke3RoaXMuZ2V0RGVwdGhDb29yZFN0cmluZygpfTtcblxuICAgICAgaW50IGluX2ggPSBoIC8gJHtibG9ja1NpemV9O1xuICAgICAgaW50IG9mZnNldF9oID0gaW1vZChoLCAke2Jsb2NrU2l6ZX0pO1xuICAgICAgaW50IGluX3cgPSB3IC8gJHtibG9ja1NpemV9O1xuICAgICAgaW50IG9mZnNldF93ID0gaW1vZCh3LCAke2Jsb2NrU2l6ZX0pO1xuICAgICAgaW50IG9mZnNldF9kID0gKG9mZnNldF9oICogJHtibG9ja1NpemV9ICsgb2Zmc2V0X3cpICpcbiAgICAgICAgJHt0aGlzLmdldE91dHB1dERlcHRoU2l6ZSgpfTtcbiAgICAgIGludCBpbl9kID0gZCArIG9mZnNldF9kO1xuXG4gICAgICBmbG9hdCByZXN1bHQgPSAke3RoaXMuZ2V0SW5wdXRTYW1wbGluZ1N0cmluZygpfTtcbiAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgIH1cbiAgYDtcbiAgICB9XG4gICAgZ2V0SGVpZ2h0Q29vcmRTdHJpbmcoKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGFGb3JtYXQgPT09ICdOSFdDJykge1xuICAgICAgICAgICAgcmV0dXJuIGBjb29yZHNbMV1gO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGBjb29yZHNbMl1gO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldFdpZHRoQ29vcmRTdHJpbmcoKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGFGb3JtYXQgPT09ICdOSFdDJykge1xuICAgICAgICAgICAgcmV0dXJuIGBjb29yZHNbMl1gO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGBjb29yZHNbM11gO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldERlcHRoQ29vcmRTdHJpbmcoKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGFGb3JtYXQgPT09ICdOSFdDJykge1xuICAgICAgICAgICAgcmV0dXJuIGBjb29yZHNbM11gO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGBjb29yZHNbMV1gO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldE91dHB1dERlcHRoU2l6ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YUZvcm1hdCA9PT0gJ05IV0MnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5vdXRwdXRTaGFwZVszXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm91dHB1dFNoYXBlWzFdO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldElucHV0U2FtcGxpbmdTdHJpbmcoKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGFGb3JtYXQgPT09ICdOSFdDJykge1xuICAgICAgICAgICAgcmV0dXJuIGBnZXRYKGIsIGluX2gsIGluX3csIGluX2QpYDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBgZ2V0WChiLCBpbl9kLCBpbl9oLCBpbl93KWA7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZXB0aF90b19zcGFjZV9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuZXhwb3J0IGNsYXNzIERpYWdQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3RvcihzaXplKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsnWCddO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gW3NpemUsIHNpemVdO1xuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgIGl2ZWMyIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgIGZsb2F0IHZhbCA9IGNvb3Jkc1swXSA9PSBjb29yZHNbMV0gPyBnZXRYKGNvb3Jkc1swXSkgOiAwLjA7XG4gICAgICAgICAgc2V0T3V0cHV0KHZhbCk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaWFnX2dwdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5leHBvcnQgY2xhc3MgRGlsYXRpb24yRFByb2dyYW0ge1xuICAgIGNvbnN0cnVjdG9yKGNvbnZJbmZvKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsneCcsICdXJ107XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5vdXRTaGFwZTtcbiAgICAgICAgY29uc3QgeyBpbkhlaWdodCwgaW5XaWR0aCwgcGFkSW5mbywgc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aCwgZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGggfSA9IGNvbnZJbmZvO1xuICAgICAgICBjb25zdCB7IHRvcDogcGFkVG9wLCBsZWZ0OiBwYWRMZWZ0IH0gPSBwYWRJbmZvO1xuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgY29uc3QgaXZlYzIgc3RyaWRlcyA9IGl2ZWMyKCR7c3RyaWRlSGVpZ2h0fSwgJHtzdHJpZGVXaWR0aH0pO1xuICAgICAgY29uc3QgaXZlYzIgcGFkcyA9IGl2ZWMyKCR7cGFkVG9wfSwgJHtwYWRMZWZ0fSk7XG4gICAgICBjb25zdCBmbG9hdCBuZWdfaW5maW5pdHkgPSAtMy40ZTM4O1xuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHMueDtcbiAgICAgICAgaW50IGQxID0gY29vcmRzLnc7XG4gICAgICAgIGl2ZWMyIG91dFRvcExlZnRDb3JuZXIgPVxuICAgICAgICAgICAgY29vcmRzLnl6ICogc3RyaWRlcyAtIHBhZHM7XG4gICAgICAgIGludCBoQmVnID0gb3V0VG9wTGVmdENvcm5lci54O1xuICAgICAgICBpbnQgd0JlZyA9IG91dFRvcExlZnRDb3JuZXIueTtcblxuICAgICAgICBmbG9hdCBjdXJWYWwgPSBuZWdfaW5maW5pdHk7XG4gICAgICAgIGZvciAoaW50IGggPSAwOyBoIDwgJHtmaWx0ZXJIZWlnaHR9OyBoKyspIHtcbiAgICAgICAgICBpbnQgaEluID0gaEJlZyArIGggKiAke2RpbGF0aW9uSGVpZ2h0fTtcblxuICAgICAgICAgIGlmIChoSW4gPj0gMCAmJiBoSW4gPCAke2luSGVpZ2h0fSkge1xuICAgICAgICAgICAgZm9yIChpbnQgdyA9IDA7IHcgPCAke2ZpbHRlcldpZHRofTsgdysrKSB7XG4gICAgICAgICAgICAgIGludCB3SW4gPSB3QmVnICsgdyAqICR7ZGlsYXRpb25XaWR0aH07XG5cbiAgICAgICAgICAgICAgaWYgKHdJbiA+PSAwICYmIHdJbiA8ICR7aW5XaWR0aH0pIHtcbiAgICAgICAgICAgICAgICBmbG9hdCB4VmFsID0gZ2V0WChiYXRjaCwgaEluLCB3SW4sIGQxKTtcbiAgICAgICAgICAgICAgICBmbG9hdCB3VmFsID0gZ2V0VyhoLCB3LCBkMSk7XG5cbiAgICAgICAgICAgICAgICBmbG9hdCB2YWwgPSB4VmFsICsgd1ZhbDtcbiAgICAgICAgICAgICAgICBpZiAodmFsID4gY3VyVmFsKSB7XG4gICAgICAgICAgICAgICAgICBjdXJWYWwgPSB2YWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZmxvYXQgcmVzdWx0ID0gY3VyVmFsO1xuICAgICAgICBzZXRPdXRwdXQocmVzdWx0KTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRpbGF0aW9uX2dwdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBnZXRHbHNsRGlmZmVyZW5jZXMgfSBmcm9tICcuL2dsc2xfdmVyc2lvbic7XG5pbXBvcnQgeyBFTkNPREVfRkxPQVRfU05JUFBFVCB9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyX3V0aWwnO1xuaW1wb3J0IHsgVGV4dHVyZVVzYWdlIH0gZnJvbSAnLi90ZXhfdXRpbCc7XG5leHBvcnQgY2xhc3MgRW5jb2RlRmxvYXRQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3RvcihvdXRwdXRTaGFwZSkge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgICAgICAgdGhpcy5vdXRUZXhVc2FnZSA9IFRleHR1cmVVc2FnZS5ET1dOTE9BRDtcbiAgICAgICAgY29uc3QgZ2xzbCA9IGdldEdsc2xEaWZmZXJlbmNlcygpO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGU7XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAke0VOQ09ERV9GTE9BVF9TTklQUEVUfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGZsb2F0IHggPSBnZXRBQXRPdXRDb29yZHMoKTtcbiAgICAgICAgJHtnbHNsLm91dHB1dH0gPSBlbmNvZGVfZmxvYXQoeCk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lbmNvZGVfZmxvYXRfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGdldEdsc2xEaWZmZXJlbmNlcyB9IGZyb20gJy4vZ2xzbF92ZXJzaW9uJztcbmltcG9ydCB7IEVOQ09ERV9GTE9BVF9TTklQUEVUIH0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXJfdXRpbCc7XG5pbXBvcnQgeyBUZXh0dXJlVXNhZ2UgfSBmcm9tICcuL3RleF91dGlsJztcbmV4cG9ydCBjbGFzcyBFbmNvZGVGbG9hdFBhY2tlZFByb2dyYW0ge1xuICAgIGNvbnN0cnVjdG9yKG91dHB1dFNoYXBlKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICAgICAgICB0aGlzLnBhY2tlZElucHV0cyA9IHRydWU7XG4gICAgICAgIHRoaXMucGFja2VkT3V0cHV0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMub3V0VGV4VXNhZ2UgPSBUZXh0dXJlVXNhZ2UuRE9XTkxPQUQ7XG4gICAgICAgIGNvbnN0IGdsc2wgPSBnZXRHbHNsRGlmZmVyZW5jZXMoKTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IG91dHB1dFNoYXBlO1xuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgJHtFTkNPREVfRkxPQVRfU05JUFBFVH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMyBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgZmxvYXQgeCA9IGdldENoYW5uZWwoZ2V0QUF0T3V0Q29vcmRzKCksIHZlYzIoY29vcmRzLnksIGNvb3Jkcy56KSk7XG4gICAgICAgICR7Z2xzbC5vdXRwdXR9ID0gZW5jb2RlX2Zsb2F0KHgpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZW5jb2RlX2Zsb2F0X3BhY2tlZF9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZ2V0R2xzbERpZmZlcmVuY2VzIH0gZnJvbSAnLi9nbHNsX3ZlcnNpb24nO1xuaW1wb3J0ICogYXMgc2hhZGVyX3V0aWwgZnJvbSAnLi9zaGFkZXJfY29tcGlsZXJfdXRpbCc7XG5leHBvcnQgY2xhc3MgRW5jb2RlTWF0cml4UHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3Iob3V0cHV0U2hhcGUsIHRleFNoYXBlLCBpbnB1dElzVW5zaWduZWRCeXRlID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWydBJ107XG4gICAgICAgIGNvbnN0IGdsc2wgPSBnZXRHbHNsRGlmZmVyZW5jZXMoKTtcbiAgICAgICAgY29uc3QgW2hlaWdodCwgd2lkdGhdID0gdGV4U2hhcGU7XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICAgICAgbGV0IG91dHB1dCA9IGByZXN1bHRgO1xuICAgICAgICBpZiAoaW5wdXRJc1Vuc2lnbmVkQnl0ZSkge1xuICAgICAgICAgICAgb3V0cHV0ID0gYGZsb29yKHJlc3VsdCAqIDI1NS4gKyAwLjUpYDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgJHtzaGFkZXJfdXRpbC5nZXRGbGF0SW5kZXhGcm9tM0Qob3V0cHV0U2hhcGUpfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWMzIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuXG4gICAgICAgIGludCBmbGF0SW5kZXggPSBnZXRGbGF0SW5kZXgoY29vcmRzKTtcbiAgICAgICAgaW50IG9mZnNldCA9IGltb2QoZmxhdEluZGV4LCA0KTtcblxuICAgICAgICBmbGF0SW5kZXggPSBpZGl2KGZsYXRJbmRleCwgNCwgMS4pO1xuXG4gICAgICAgIGludCByID0gZmxhdEluZGV4IC8gJHt3aWR0aH07XG4gICAgICAgIGludCBjID0gaW1vZChmbGF0SW5kZXgsICR7d2lkdGh9KTtcbiAgICAgICAgdmVjMiB1diA9ICh2ZWMyKGMsIHIpICsgaGFsZkNSKSAvIHZlYzIoJHt3aWR0aH0uMCwgJHtoZWlnaHR9LjApO1xuICAgICAgICB2ZWM0IHZhbHVlcyA9ICR7Z2xzbC50ZXh0dXJlMkR9KEEsIHV2KTtcblxuICAgICAgICBmbG9hdCByZXN1bHQ7XG5cbiAgICAgICAgaWYob2Zmc2V0ID09IDApIHtcbiAgICAgICAgICByZXN1bHQgPSB2YWx1ZXNbMF07XG4gICAgICAgIH0gZWxzZSBpZihvZmZzZXQgPT0gMSkge1xuICAgICAgICAgIHJlc3VsdCA9IHZhbHVlc1sxXTtcbiAgICAgICAgfSBlbHNlIGlmKG9mZnNldCA9PSAyKSB7XG4gICAgICAgICAgcmVzdWx0ID0gdmFsdWVzWzJdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdCA9IHZhbHVlc1szXTtcbiAgICAgICAgfVxuXG4gICAgICAgICR7Z2xzbC5vdXRwdXR9ID0gdmVjNCgke291dHB1dH0sIDAuLCAwLiwgMC4pO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZW5jb2RlX21hdHJpeF9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZ2V0R2xzbERpZmZlcmVuY2VzIH0gZnJvbSAnLi9nbHNsX3ZlcnNpb24nO1xuaW1wb3J0ICogYXMgc2hhZGVyX3V0aWwgZnJvbSAnLi9zaGFkZXJfY29tcGlsZXJfdXRpbCc7XG4vKlxuVGhpcyBpcyBob3cgdGhlIHNoYWRlciBlbmNvZGVzIGEgdGVuc29yIHdpdGggc2hhcGUgPSBbMiwgMywgNV1cbihpbmRpY2VzIGFyZSBbYmF0Y2gsIHJvdywgY29sXSkuXG5cbjAwMHwwMDEgICAwMDJ8MDAzICAgMDA0fHh4eCAgIDAyMHwwMjEgICAwMjJ8MDIzICAgMDI0fHh4eFxuLS0tLS0tLSAgIC0tLS0tLS0gICAtLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS0gICAtLS0tLS0tXG4wMTB8MDExICAgMDEyfDAxMyAgIDAxNHx4eHggICB4eHh8eHh4ICAgeHh4fHh4eCAgIHh4eHx4eHhcblxuMTAwfDEwMSAgIDEwMnwxMDMgICAxMDR8eHh4ICAgMTIwfDEyMSAgIDEyMnwxMjMgICAxMjR8eHh4XG4tLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS0gICAtLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS1cbjExMHwxMTEgICAxMTJ8MTEzICAgMTE0fHh4eCAgIHh4eHx4eHggICB4eHh8eHh4ICAgeHh4fHh4eFxuXG5TaW5nbGUgdGV4ZWxzIGNvbnRhaW4gb25seSB2YWx1ZXMgZnJvbSB0aGUgc2FtZSBiYXRjaCwgYW5kIGZyb20gYWRqYWNlbnQgcm93c1xuYW5kIGNvbHVtbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBFbmNvZGVNYXRyaXhQYWNrZWRQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3RvcihvdXRwdXRTaGFwZSwgdGV4U2hhcGUsIGlucHV0SXNVbnNpZ25lZEJ5dGUgPSBmYWxzZSkge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgICAgICAgdGhpcy5wYWNrZWRJbnB1dHMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wYWNrZWRPdXRwdXQgPSB0cnVlO1xuICAgICAgICBjb25zdCBnbHNsID0gZ2V0R2xzbERpZmZlcmVuY2VzKCk7XG4gICAgICAgIGNvbnN0IFtoZWlnaHQsIHdpZHRoXSA9IHRleFNoYXBlO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGU7XG4gICAgICAgIGxldCBtYWluTG9vcCA9ICcnO1xuICAgICAgICBsZXQgb3V0cHV0ID0gJ3Jlc3VsdCc7XG4gICAgICAgIGlmIChpbnB1dElzVW5zaWduZWRCeXRlKSB7XG4gICAgICAgICAgICBvdXRwdXQgPSAnZmxvb3IocmVzdWx0ICogMjU1LiArIDAuNSknO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8PSAxOyByb3crKykge1xuICAgICAgICAgICAgZm9yIChsZXQgY29sID0gMDsgY29sIDw9IDE7IGNvbCsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hhbm5lbCA9IHJvdyAqIDIgKyBjb2w7XG4gICAgICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgIGxvY2FsQ29vcmRzID0gY29vcmRzO1xuICAgICAgICAgIGlmKGxvY2FsQ29vcmRzWzJdICsgJHtjb2x9IDwgJHtvdXRwdXRTaGFwZVsyXX0pIHtcbiAgICAgICAgICAgIGxvY2FsQ29vcmRzWzJdICs9ICR7Y29sfTtcbiAgICAgICAgICAgIGlmKGxvY2FsQ29vcmRzWzFdICsgJHtyb3d9IDwgJHtvdXRwdXRTaGFwZVsxXX0pIHtcbiAgICAgICAgICAgICAgbG9jYWxDb29yZHNbMV0gKz0gJHtyb3d9O1xuXG4gICAgICAgICAgICAgIGZsYXRJbmRleCA9IGdldEZsYXRJbmRleChsb2NhbENvb3Jkcyk7XG4gICAgICAgICAgICAgIG9mZnNldCA9IGltb2QoZmxhdEluZGV4LCA0KTtcblxuICAgICAgICAgICAgICBmbGF0SW5kZXggPSBpZGl2KGZsYXRJbmRleCwgNCwgMS4pO1xuXG4gICAgICAgICAgICAgIHIgPSBmbGF0SW5kZXggLyAke3dpZHRofTtcbiAgICAgICAgICAgICAgYyA9IGltb2QoZmxhdEluZGV4LCAke3dpZHRofSk7XG4gICAgICAgICAgICAgIHV2ID0gKHZlYzIoYywgcikgKyBoYWxmQ1IpIC8gdmVjMigke3dpZHRofS4wLCAke2hlaWdodH0uMCk7XG4gICAgICAgICAgICAgIHZhbHVlcyA9ICR7Z2xzbC50ZXh0dXJlMkR9KEEsIHV2KTtcblxuICAgICAgICAgICAgICBpZihvZmZzZXQgPT0gMCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdFske2NoYW5uZWx9XSA9IHZhbHVlc1swXTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmKG9mZnNldCA9PSAxKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0WyR7Y2hhbm5lbH1dID0gdmFsdWVzWzFdO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYob2Zmc2V0ID09IDIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRbJHtjaGFubmVsfV0gPSB2YWx1ZXNbMl07XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0WyR7Y2hhbm5lbH1dID0gdmFsdWVzWzNdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICBgO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAke3NoYWRlcl91dGlsLmdldEZsYXRJbmRleEZyb20zRChvdXRwdXRTaGFwZSl9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzMgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG5cbiAgICAgICAgdmVjNCByZXN1bHQgPSB2ZWM0KDAuKTtcbiAgICAgICAgaW50IGZsYXRJbmRleCwgciwgYywgb2Zmc2V0O1xuICAgICAgICBpdmVjMyBsb2NhbENvb3JkcztcbiAgICAgICAgdmVjMiB1djtcbiAgICAgICAgdmVjNCB2YWx1ZXM7XG5cbiAgICAgICAgJHttYWluTG9vcH1cblxuICAgICAgICAke2dsc2wub3V0cHV0fSA9ICR7b3V0cHV0fTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVuY29kZV9tYXRyaXhfcGFja2VkX2dwdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5leHBvcnQgY2xhc3MgRkZUUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoY29tcG9uZW50LCBpbnB1dFNoYXBlLCBpbnZlcnNlKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsncmVhbCcsICdpbWFnJ107XG4gICAgICAgIGNvbnN0IGlubmVyRGltID0gaW5wdXRTaGFwZVsxXTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IGlucHV0U2hhcGU7XG4gICAgICAgIGNvbnN0IGV4cG9uZW50TXVsdGlwbGllclNuaXBwZXQgPSBpbnZlcnNlID8gYDIuMCAqICR7TWF0aC5QSX1gIDogYC0yLjAgKiAke01hdGguUEl9YDtcbiAgICAgICAgY29uc3QgcmVzdWx0RGVub21pbmF0b3IgPSBpbnZlcnNlID8gYCR7aW5uZXJEaW19LjBgIDogJzEuMCc7XG4gICAgICAgIGxldCBvcFN0cmluZztcbiAgICAgICAgaWYgKGNvbXBvbmVudCA9PT0gJ3JlYWwnKSB7XG4gICAgICAgICAgICBvcFN0cmluZyA9ICdyZXR1cm4gcmVhbCAqIGV4cFIgLSBpbWFnICogZXhwSTsnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvbXBvbmVudCA9PT0gJ2ltYWcnKSB7XG4gICAgICAgICAgICBvcFN0cmluZyA9ICdyZXR1cm4gcmVhbCAqIGV4cEkgKyBpbWFnICogZXhwUjsnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGRlQgY29tcG9uZW50IG11c3QgYmUgZWl0aGVyIFwicmVhbFwiIG9yIFwiaW1hZ1wiLCBnb3QgJHtjb21wb25lbnR9LmApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCBmbG9hdCBleHBvbmVudE11bHRpcGxpZXIgPSAke2V4cG9uZW50TXVsdGlwbGllclNuaXBwZXR9O1xuXG4gICAgICBmbG9hdCB1bmFyeU9wQ29tcGxleChmbG9hdCByZWFsLCBmbG9hdCBleHBSLCBmbG9hdCBpbWFnLCBmbG9hdCBleHBJKSB7XG4gICAgICAgICR7b3BTdHJpbmd9XG4gICAgICB9XG5cbiAgICAgIGZsb2F0IG11bE1hdERGVChpbnQgYmF0Y2gsIGludCBpbmRleCkge1xuICAgICAgICBmbG9hdCBpbmRleFJhdGlvID0gZmxvYXQoaW5kZXgpIC8gZmxvYXQoJHtpbm5lckRpbX0pO1xuICAgICAgICBmbG9hdCBleHBvbmVudE11bHRpcGxpZXJUaW1lc0luZGV4UmF0aW8gPVxuICAgICAgICAgICAgZXhwb25lbnRNdWx0aXBsaWVyICogaW5kZXhSYXRpbztcblxuICAgICAgICBmbG9hdCByZXN1bHQgPSAwLjA7XG5cbiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAke2lubmVyRGltfTsgaSsrKSB7XG4gICAgICAgICAgLy8geCA9ICgtMnwyICogUEkgLyBOKSAqIGluZGV4ICogaTtcbiAgICAgICAgICBmbG9hdCB4ID0gZXhwb25lbnRNdWx0aXBsaWVyVGltZXNJbmRleFJhdGlvICogZmxvYXQoaSk7XG4gICAgICAgICAgZmxvYXQgZXhwUiA9IGNvcyh4KTtcbiAgICAgICAgICBmbG9hdCBleHBJID0gc2luKHgpO1xuICAgICAgICAgIGZsb2F0IHJlYWwgPSBnZXRSZWFsKGJhdGNoLCBpKTtcbiAgICAgICAgICBmbG9hdCBpbWFnID0gZ2V0SW1hZyhiYXRjaCwgaSk7XG5cbiAgICAgICAgICByZXN1bHQgKz1cbiAgICAgICAgICAgICAgdW5hcnlPcENvbXBsZXgocmVhbCwgZXhwUiwgaW1hZywgZXhwSSkgLyAke3Jlc3VsdERlbm9taW5hdG9yfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzIgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIHNldE91dHB1dChtdWxNYXRERlQoY29vcmRzWzBdLCBjb29yZHNbMV0pKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZmdF9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuZXhwb3J0IGNsYXNzIEZpbGxQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3RvcihzaGFwZSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IFtdO1xuICAgICAgICB0aGlzLmN1c3RvbVVuaWZvcm1zID0gW3sgbmFtZTogJ3ZhbHVlJywgdHlwZTogJ2Zsb2F0JyB9XTtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWyd4J107XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBzaGFwZTtcbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgLy8gSW5wdXQgY2FuIGJlIG9idGFpbmVkIGZyb20gdW5pZm9ybSB2YWx1ZS5cbiAgICAgICAgc2V0T3V0cHV0KHZhbHVlKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZpbGxfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGRldmljZV91dGlsLCBlbnYgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgZ2V0TWF4VGV4dHVyZXNJblNoYWRlciwgZ2V0V2ViR0xEaXNqb2ludFF1ZXJ5VGltZXJWZXJzaW9uLCBnZXRXZWJHTE1heFRleHR1cmVTaXplLCBpc0NhcGFibGVPZlJlbmRlcmluZ1RvRmxvYXRUZXh0dXJlLCBpc0Rvd25sb2FkRmxvYXRUZXh0dXJlRW5hYmxlZCwgaXNXZWJHTEZlbmNlRW5hYmxlZCwgaXNXZWJHTFZlcnNpb25FbmFibGVkIH0gZnJvbSAnLi93ZWJnbF91dGlsJztcbmNvbnN0IEVOViA9IGVudigpO1xuLyoqXG4gKiBUaGlzIGZpbGUgY29udGFpbnMgV2ViR0wtc3BlY2lmaWMgZmxhZyByZWdpc3RyYXRpb25zLlxuICovXG4vKipcbiAqIFRydWUgaWYgV2ViR0wgaXMgc3VwcG9ydGVkLlxuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdIQVNfV0VCR0wnLCAoKSA9PiBFTlYuZ2V0TnVtYmVyKCdXRUJHTF9WRVJTSU9OJykgPiAwKTtcbi8qKiAwOiBObyBXZWJHTCwgMTogV2ViR0wgMS4wLCAyOiBXZWJHTCAyLjAuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdXRUJHTF9WRVJTSU9OJywgKCkgPT4ge1xuICAgIGlmIChpc1dlYkdMVmVyc2lvbkVuYWJsZWQoMikpIHtcbiAgICAgICAgcmV0dXJuIDI7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzV2ViR0xWZXJzaW9uRW5hYmxlZCgxKSkge1xuICAgICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG59KTtcbi8qKiBXaGV0aGVyIHRvIGNoZWNrIGZvciBudW1lcmljYWwgcmVwcmVzZW50YXRpb24gcHJvYmxlbXMuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdXRUJHTF9DSEVDS19OVU1FUklDQUxfUFJPQkxFTVMnLCAoKSA9PiBmYWxzZSk7XG5FTlYucmVnaXN0ZXJGbGFnKCdXRUJHTF9CVUZGRVJfU1VQUE9SVEVEJywgKCkgPT4gRU5WLmdldCgnV0VCR0xfVkVSU0lPTicpID09PSAyKTtcbi8qKiBXaGV0aGVyIHRoZSBXZWJHTCBiYWNrZW5kIHdpbGwgc29tZXRpbWVzIGZvcndhcmQgb3BzIHRvIHRoZSBDUFUuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdXRUJHTF9DUFVfRk9SV0FSRCcsICgpID0+IHRydWUpO1xuLyoqIFdoZXRoZXIgdGhlIFdlYkdMIGJhY2tlbmQgd2lsbCBhbHdheXMgdXNlIGYxNiB0ZXh0dXJlcyBmb3IgcmVuZGVyaW5nLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfRk9SQ0VfRjE2X1RFWFRVUkVTJywgKCkgPT4gZmFsc2UpO1xuLyoqIFdoZXRoZXIgdG8gdHVybiBhbGwgcGFja2luZyByZWxhdGVkIGZsYWdzIG9uLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfUEFDSycsICgpID0+IEVOVi5nZXRCb29sKCdIQVNfV0VCR0wnKSk7XG4vKiogV2hldGhlciB3ZSB3aWxsIHBhY2sgdGhlIGJhdGNobm9ybWFsaXphdGlvbiBvcC4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1dFQkdMX1BBQ0tfTk9STUFMSVpBVElPTicsICgpID0+IEVOVi5nZXRCb29sKCdXRUJHTF9QQUNLJykpO1xuLyoqIFdoZXRoZXIgd2Ugd2lsbCBwYWNrIHRoZSBjbGlwIG9wLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfUEFDS19DTElQJywgKCkgPT4gRU5WLmdldEJvb2woJ1dFQkdMX1BBQ0snKSk7XG4vKiogV2hldGhlciB3ZSB3aWxsIHBhY2sgdGhlIGRlcHRod2lzZSBjb252IG9wLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfUEFDS19ERVBUSFdJU0VDT05WJywgKCkgPT4gRU5WLmdldEJvb2woJ1dFQkdMX1BBQ0snKSk7XG4vKiogV2hldGhlciB3ZSB3aWxsIHBhY2sgYmluYXJ5IG9wcy4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1dFQkdMX1BBQ0tfQklOQVJZX09QRVJBVElPTlMnLCAoKSA9PiBFTlYuZ2V0Qm9vbCgnV0VCR0xfUEFDSycpKTtcbi8qKiBXaGV0aGVyIHdlIHdpbGwgcGFjayB1bmFyeSBvcHMuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdXRUJHTF9QQUNLX1VOQVJZX09QRVJBVElPTlMnLCAoKSA9PiBFTlYuZ2V0Qm9vbCgnV0VCR0xfUEFDSycpKTtcbi8qKiBXaGV0aGVyIHdlIHdpbGwgcGFjayBhcnJheSBvcHMuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdXRUJHTF9QQUNLX0FSUkFZX09QRVJBVElPTlMnLCAoKSA9PiBFTlYuZ2V0Qm9vbCgnV0VCR0xfUEFDSycpKTtcbi8qKiBXaGV0aGVyIHdlIHdpbGwgcGFjayBpbWFnZSBvcHMuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdXRUJHTF9QQUNLX0lNQUdFX09QRVJBVElPTlMnLCAoKSA9PiBFTlYuZ2V0Qm9vbCgnV0VCR0xfUEFDSycpKTtcbi8qKiBXaGV0aGVyIHdlIHdpbGwgcGFjayByZWR1Y2Ugb3BzLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfUEFDS19SRURVQ0UnLCAoKSA9PiBFTlYuZ2V0Qm9vbCgnV0VCR0xfUEFDSycpKTtcbi8qKiBXaGV0aGVyIHBhY2tlZCBXZWJHTCBrZXJuZWxzIGxhemlseSB1bnBhY2sgdGhlaXIgb3V0cHV0cy4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1dFQkdMX0xBWklMWV9VTlBBQ0snLCAoKSA9PiBFTlYuZ2V0Qm9vbCgnV0VCR0xfUEFDSycpKTtcbi8qKiBXaGV0aGVyIHdlIHdpbGwgdXNlIHRoZSBpbTJjb2wgYWxnb3JpdGhtIHRvIHNwZWVkIHVwIGNvbnZvbHV0aW9ucy4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1dFQkdMX0NPTlZfSU0yQ09MJywgKCkgPT4gRU5WLmdldEJvb2woJ1dFQkdMX1BBQ0snKSk7XG4vKiogVGhlIG1heGltdW0gdGV4dHVyZSBkaW1lbnNpb24uICovXG5FTlYucmVnaXN0ZXJGbGFnKCdXRUJHTF9NQVhfVEVYVFVSRV9TSVpFJywgKCkgPT4gZ2V0V2ViR0xNYXhUZXh0dXJlU2l6ZShFTlYuZ2V0TnVtYmVyKCdXRUJHTF9WRVJTSU9OJykpKTtcbi8qKiBUaGUgbWF4aW11bSB0ZXh0dXJlIGRpbWVuc2lvbi4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1dFQkdMX01BWF9URVhUVVJFU19JTl9TSEFERVInLCAoKSA9PiBnZXRNYXhUZXh0dXJlc0luU2hhZGVyKEVOVi5nZXROdW1iZXIoJ1dFQkdMX1ZFUlNJT04nKSkpO1xuLyoqXG4gKiBUaGUgZGlzam9pbnRfcXVlcnlfdGltZXIgZXh0ZW5zaW9uIHZlcnNpb24uXG4gKiAwOiBkaXNhYmxlZCwgMTogRVhUX2Rpc2pvaW50X3RpbWVyX3F1ZXJ5LCAyOlxuICogRVhUX2Rpc2pvaW50X3RpbWVyX3F1ZXJ5X3dlYmdsMi5cbiAqIEluIEZpcmVmb3ggd2l0aCBXZWJHTCAyLjAsXG4gKiBFWFRfZGlzam9pbnRfdGltZXJfcXVlcnlfd2ViZ2wyIGlzIG5vdCBhdmFpbGFibGUsIHNvIHdlIG11c3QgdXNlIHRoZVxuICogV2ViR0wgMS4wIGV4dGVuc2lvbi5cbiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1ZFUlNJT04nLCAoKSA9PiB7XG4gICAgY29uc3Qgd2ViR0xWZXJzaW9uID0gRU5WLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpO1xuICAgIGlmICh3ZWJHTFZlcnNpb24gPT09IDApIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHJldHVybiBnZXRXZWJHTERpc2pvaW50UXVlcnlUaW1lclZlcnNpb24od2ViR0xWZXJzaW9uKTtcbn0pO1xuLyoqXG4gKiBXaGV0aGVyIHRoZSB0aW1lciBvYmplY3QgZnJvbSB0aGUgZGlzam9pbnRfcXVlcnlfdGltZXIgZXh0ZW5zaW9uIGdpdmVzXG4gKiB0aW1pbmcgaW5mb3JtYXRpb24gdGhhdCBpcyByZWxpYWJsZS5cbiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1JFTElBQkxFJywgKCkgPT4gRU5WLmdldE51bWJlcignV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1ZFUlNJT04nKSA+IDAgJiZcbiAgICAhZGV2aWNlX3V0aWwuaXNNb2JpbGUoKSk7XG4vKipcbiAqIFdoZXRoZXIgdGhlIGRldmljZSBpcyBwaHlzaWNhbGx5IGNhcGFibGUgb2YgcmVuZGVyaW5nIHRvIGZsb2F0MzIgdGV4dHVyZXMuXG4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1dFQkdMX1JFTkRFUl9GTE9BVDMyX0NBUEFCTEUnLCAoKSA9PiBpc0NhcGFibGVPZlJlbmRlcmluZ1RvRmxvYXRUZXh0dXJlKEVOVi5nZXROdW1iZXIoJ1dFQkdMX1ZFUlNJT04nKSkpO1xuLyoqXG4gKiBXaGV0aGVyIHJlbmRlcmluZyB0byBmbG9hdDMyIHRleHR1cmVzIGlzIGVuYWJsZWQuIElmIGRpc2FibGVkLCByZW5kZXJzIHRvXG4gKiBmbG9hdDE2IHRleHR1cmVzLlxuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdXRUJHTF9SRU5ERVJfRkxPQVQzMl9FTkFCTEVEJywgKCkgPT4ge1xuICAgIHJldHVybiBFTlYuZ2V0Qm9vbCgnV0VCR0xfRk9SQ0VfRjE2X1RFWFRVUkVTJykgP1xuICAgICAgICBmYWxzZSA6XG4gICAgICAgIEVOVi5nZXRCb29sKCdXRUJHTF9SRU5ERVJfRkxPQVQzMl9DQVBBQkxFJyk7XG59KTtcbi8qKlxuICogV2hldGhlciBkb3dubG9hZGluZyBmbG9hdCB0ZXh0dXJlcyBpcyBlbmFibGVkICgxNiBvciAzMiBiaXQpLiBJZiBkaXNhYmxlZCxcbiAqIHVzZXMgSUVFRSA3NTQgZW5jb2Rpbmcgb2YgdGhlIGZsb2F0MzIgdmFsdWVzIHRvIDQgdWludDggd2hlbiBkb3dubG9hZGluZy5cbiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfRE9XTkxPQURfRkxPQVRfRU5BQkxFRCcsICgpID0+IGlzRG93bmxvYWRGbG9hdFRleHR1cmVFbmFibGVkKEVOVi5nZXROdW1iZXIoJ1dFQkdMX1ZFUlNJT04nKSkpO1xuLyoqIFdoZXRoZXIgdGhlIGZlbmNlIEFQSSBpcyBhdmFpbGFibGUuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdXRUJHTF9GRU5DRV9BUElfRU5BQkxFRCcsICgpID0+IGlzV2ViR0xGZW5jZUVuYWJsZWQoRU5WLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpKSk7XG4vKipcbiAqIFRlbnNvcnMgd2l0aCBzaXplIDw9IHRoYW4gdGhpcyB3aWxsIGJlIHVwbG9hZGVkIGFzIHVuaWZvcm1zLCBub3QgdGV4dHVyZXMuXG4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1dFQkdMX1NJWkVfVVBMT0FEX1VOSUZPUk0nLCAoKSA9PiB7XG4gICAgLy8gVXNlIHVuaWZvcm0gdXBsb2FkcyBvbmx5IHdoZW4gMzJiaXQgZmxvYXRzIGFyZSBzdXBwb3J0ZWQuIEluXG4gICAgLy8gMTZiaXRcbiAgICAvLyBlbnZpcm9ubWVudHMgdGhlcmUgYXJlIHByb2JsZW1zIHdpdGggY29tcGFyaW5nIGEgMTZiaXQgdGV4dHVyZSB2YWx1ZVxuICAgIC8vIHdpdGggYSAzMmJpdCB1bmlmb3JtIHZhbHVlLlxuICAgIGNvbnN0IHVzZVVuaWZvcm1zID0gRU5WLmdldEJvb2woJ1dFQkdMX1JFTkRFUl9GTE9BVDMyX0VOQUJMRUQnKTtcbiAgICByZXR1cm4gdXNlVW5pZm9ybXMgPyA0IDogMDtcbn0pO1xuLyoqXG4gKiBJZiB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIGFsbG9jYXRlZCBvbiB0aGUgR1BVIGlzIGdyZWF0ZXIgdGhhbiB0aGlzXG4gKiBudW1iZXIsIHdlIHdpbGwgYWdncmVzc2l2ZWx5IGRlbGV0ZSB0ZXh0dXJlcyB1cG9uIGRpc3Bvc2FsIHdpdGhcbiAqIGdsLmRlbGV0ZU1hdHJpeFRleHR1cmUsIHJhdGhlciB0aGFuIG1ha2luZyB0aGVtIGF2YWlsYWJsZSBmb3IgcmV1c2UuXG4gKlxuICogRGVmYXVsdCB2YWx1ZSAtMSBpbmRpY2F0ZXMgdGhhdCB3ZSB3aWxsIG5ldmVyIGFnZ3Jlc3NpdmVseSBkZWxldGUgdGV4dHVyZXMuXG4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1dFQkdMX0RFTEVURV9URVhUVVJFX1RIUkVTSE9MRCcsICgpID0+IHtcbiAgICByZXR1cm4gLTE7XG59LCB0aHJlc2hvbGQgPT4ge1xuICAgIGlmICh0aHJlc2hvbGQgPCAwICYmIHRocmVzaG9sZCAhPT0gLTEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBXRUJHTF9ERUxFVEVfVEVYVFVSRV9USFJFU0hPTEQgbXVzdCBiZSAtMSAoaW5kaWNhdGluZyBuZXZlciBgICtcbiAgICAgICAgICAgIGBkZWxldGUpIG9yIGF0IGxlYXN0IDAsIGJ1dCBnb3QgJHt0aHJlc2hvbGR9LmApO1xuICAgIH1cbn0pO1xuLyoqXG4gKiBUcmlnZ2VyIGEgbWFudWFsIEdMIGNvbW1hbmQgZmx1c2ggaWYgdGhlIHRocmVzaG9sZCBvZiB0aW1lIGhhcyBwYXNzZWQgc2luY2VcbiAqIHByZXZpb3VzIEtlcm5lbCBleGVjdXRpb24uIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgQW5kb3JpZCBkZXZpY2Ugd2hlcmUgR0xcbiAqIGNvbW1hbmQgZmx1c2ggYXJlIGRlbGF5ZWQgdW4gdGlsIHRoZSBlbmQgb2YgamF2YXNjcmlwdCB0YXNrLiBUaGlzIHZhbHVlIGlzXG4gKiBtZWFzdXJlZCBpbiBtaWxsaXNlY29uZC4gVHlwaWNhbGx5IHlvdSB3YW50IHRvIHNldCB0aGlzIHZhbHVlIHRvIGNsb3NlIHRvIDEuXG4gKlxuICogRGVmYXVsdCB2YWx1ZSAxIGZvciBtb2JpbGUgY2hyb21lLCBhbmQgLTEgZm9yIHJlc3QgY2FzZXMuIC0xIGluZGljYXRlcyB0aGF0XG4gKiB3ZSB3aWxsIG5vdCBlbmZvcmNlIG1hbnVhbCBmbHVzaCBhbmQgZGVwZW5kIG9uIHN5c3RlbSBkZWZhdWx0IGZsdXNoIHNjaGVkdWxlLlxuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdXRUJHTF9GTFVTSF9USFJFU0hPTEQnLCAoKSA9PiB7XG4gICAgcmV0dXJuIGRldmljZV91dGlsLmlzTW9iaWxlKCkgJiYgRU5WLmdldEJvb2woJ0lTX0NIUk9NRScpID8gMSA6IC0xO1xufSwgdGhyZXNob2xkID0+IHtcbiAgICBpZiAodGhyZXNob2xkIDwgMCAmJiB0aHJlc2hvbGQgIT09IC0xKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgV0VCR0xfRkxVU0hfVEhSRVNIT0xEIG11c3QgYmUgLTEgKGluZGljYXRpbmcgbmV2ZXIgYCArXG4gICAgICAgICAgICBgbWFudWFsIGZsdXNoKSBvciBhdCBsZWFzdCAwLCBidXQgZ290ICR7dGhyZXNob2xkfS5gKTtcbiAgICB9XG59KTtcbi8qKlxuICogVGhyZXNob2xkIGZvciBpbnB1dCB0ZW5zb3Igc2l6ZSB0aGF0IGRldGVybWluZXMgd2hldGhlciBXZWJHTCBiYWNrZW5kIHdpbGxcbiAqIGRlbGVnYXRlIGNvbXB1dGF0aW9uIHRvIENQVS5cbiAqXG4gKiBEZWZhdWx0IHZhbHVlIGlzIDEyOC5cbiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnQ1BVX0hBTkRPRkZfU0laRV9USFJFU0hPTEQnLCAoKSA9PiAxMjgpO1xuLyoqIFdoZXRoZXIgd2Ugd2lsbCB1c2Ugc2hhcGVzIHVuaWZvcm1zLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfVVNFX1NIQVBFU19VTklGT1JNUycsICgpID0+IGZhbHNlKTtcbi8qKlxuICogVGhyZXNob2xkIGZvciBsYXN0IGRpbWVuc2lvbiBvZiBpbnB1dCB0ZW5zb3IgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXJcbiAqIFdlYkdMIGJhY2tlbmQgZm9yIHRoZSBUb3AgSyBvcCB3aWxsIGRlbGVnYXRlIGNvbXB1dGF0aW9uIHRvIENQVS4gSWYgaW5wdXRcbiAqIGlzIHNtYWxsZXIgdGhhbiB0aHJlc2hvbGQgdGhlbiBDUFUgd2lsbCBiZSB1c2VkXG4gKlxuICogRGVmYXVsdCB2YWx1ZSBpcyAxMDAwMDAuXG4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1RPUEtfTEFTVF9ESU1fQ1BVX0hBTkRPRkZfU0laRV9USFJFU0hPTEQnLCAoKSA9PiAxMDAwMDApO1xuLyoqXG4gKiBUaHJlc2hvbGQgZm9yIEsgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXJcbiAqIFdlYkdMIGJhY2tlbmQgZm9yIHRoZSBUb3AgSyBvcCB3aWxsIGRlbGVnYXRlIGNvbXB1dGF0aW9uIHRvIENQVS4gSWYga1xuICogaXMgbGFyZ2VyIHRoYW4gdGhyZXNob2xkIHRoZW4gQ1BVIHdpbGwgYmUgdXNlZFxuICpcbiAqIERlZmF1bHQgdmFsdWUgaXMgMTI4LlxuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdUT1BLX0tfQ1BVX0hBTkRPRkZfVEhSRVNIT0xEJywgKCkgPT4gMTI4KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZsYWdzX3dlYmdsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmV4cG9ydCBjbGFzcyBGbGlwTGVmdFJpZ2h0UHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoaW1hZ2VTaGFwZSkge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ0ltYWdlJ107XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBbXTtcbiAgICAgICAgY29uc3QgaW1hZ2VXaWR0aCA9IGltYWdlU2hhcGVbMl07XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBpbWFnZVNoYXBlO1xuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgICAgaW50IHggPSBjb29yZHNbMl07XG5cbiAgICAgICAgICBpbnQgY29vcmRYID0gJHtpbWFnZVdpZHRofSAtIHggLSAxO1xuICAgICAgICAgIGZsb2F0IG91dHB1dFZhbHVlO1xuICAgICAgICAgIGlmKGNvb3JkWCA+PSAwICYmIGNvb3JkWCA8ICR7aW1hZ2VXaWR0aH0pIHtcbiAgICAgICAgICAgIG91dHB1dFZhbHVlID0gZ2V0SW1hZ2UoY29vcmRzWzBdLCBjb29yZHNbMV0sIGNvb3JkWCwgY29vcmRzWzNdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0cHV0VmFsdWUgPSBnZXRJbWFnZShjb29yZHNbMF0sIGNvb3Jkc1sxXSwgY29vcmRzWzJdLCBjb29yZHNbM10pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZXRPdXRwdXQob3V0cHV0VmFsdWUpO1xuICAgICAgICB9XG4gICAgYDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mbGlwX2xlZnRfcmlnaHRfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGdldENvb3Jkc0RhdGFUeXBlIH0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuZXhwb3J0IGNsYXNzIEdhdGhlclByb2dyYW0ge1xuICAgIGNvbnN0cnVjdG9yKGFTaGFwZSwgb3V0cHV0U2hhcGUpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWydBJywgJ2luZGljZXMnXTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IG91dHB1dFNoYXBlO1xuICAgICAgICB0aGlzLnJhbmsgPSBvdXRwdXRTaGFwZS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGR0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUodGhpcy5yYW5rKTtcbiAgICAgICAgY29uc3Qgc291cmNlQ29vcmRzID0gZ2V0U291cmNlQ29vcmRzKGFTaGFwZSwgMik7XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICR7ZHR5cGV9IHJlc1JDID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIHNldE91dHB1dChnZXRBKCR7c291cmNlQ29vcmRzfSkpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuLy8gVGhlIGlucHV0IGFuZCBvdXRwdXQgYXJlIGFsd2F5cyBmbGF0dGVuZWQgaW50byByYW5rIDQgdGVuc29ycy5cbmZ1bmN0aW9uIGdldFNvdXJjZUNvb3JkcyhhU2hhcGUsIGF4aXMpIHtcbiAgICBjb25zdCBjdXJyZW50Q29vcmRzID0gWydyZXNSQy54JywgJ3Jlc1JDLnknLCAncmVzUkMueicsICdyZXNSQy53J107XG4gICAgY29uc3Qgc291cmNlQ29vcmRzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhU2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGkgPT09IDIpIHtcbiAgICAgICAgICAgIHNvdXJjZUNvb3Jkcy5wdXNoKCdpbnQoZ2V0SW5kaWNlcyhyZXNSQy54LCByZXNSQy56KSknKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNvdXJjZUNvb3Jkcy5wdXNoKGAke2N1cnJlbnRDb29yZHNbaV19YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNvdXJjZUNvb3Jkcy5qb2luKCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nYXRoZXJfZ3B1LmpzLm1hcCIsImltcG9ydCB7IGdldENvb3Jkc0RhdGFUeXBlIH0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuZXhwb3J0IGNsYXNzIEdhdGhlck5EUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3Ioc2xpY2VEaW0sIHN0cmlkZXMsIHNoYXBlKSB7XG4gICAgICAgIHRoaXMuc2xpY2VEaW0gPSBzbGljZURpbTtcbiAgICAgICAgdGhpcy5zdHJpZGVzID0gc3RyaWRlcztcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWyd4JywgJ2luZGljZXMnXTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IHNoYXBlO1xuICAgICAgICBjb25zdCBzdHJpZGVzVHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHN0cmlkZXMubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgZHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShzaGFwZS5sZW5ndGgpO1xuICAgICAgICBjb25zdCBzdHJpZGVTdHJpbmcgPSB0aGlzLnNsaWNlRGltID4gMSA/ICdzdHJpZGVzW2pdJyA6ICdzdHJpZGVzJztcbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICAgJHtzdHJpZGVzVHlwZX0gc3RyaWRlcyA9ICR7c3RyaWRlc1R5cGV9KCR7dGhpcy5zdHJpZGVzfSk7XG4gICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgJHtkdHlwZX0gY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgICAgaW50IGZsYXR0ZW5JbmRleCA9IDA7XG4gICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAke3RoaXMuc2xpY2VEaW19OyBqKyspIHtcbiAgICAgICAgICAgIGludCBpbmRleCA9IHJvdW5kKGdldEluZGljZXMoY29vcmRzWzBdLCBqKSk7XG4gICAgICAgICAgICBmbGF0dGVuSW5kZXggKz0gaW5kZXggKiAke3N0cmlkZVN0cmluZ307XG4gICAgICAgICAgfVxuICAgICAgICAgIHNldE91dHB1dChnZXRYKGZsYXR0ZW5JbmRleCwgY29vcmRzWzFdKSk7XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2F0aGVyX25kX2dwdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBlbnYgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIGdldEdsc2xEaWZmZXJlbmNlcygpIHtcbiAgICBsZXQgdmVyc2lvbjtcbiAgICBsZXQgYXR0cmlidXRlO1xuICAgIGxldCB2YXJ5aW5nVnM7XG4gICAgbGV0IHZhcnlpbmdGcztcbiAgICBsZXQgdGV4dHVyZTJEO1xuICAgIGxldCBvdXRwdXQ7XG4gICAgbGV0IGRlZmluZU91dHB1dDtcbiAgICBsZXQgZGVmaW5lU3BlY2lhbE5hTjtcbiAgICBsZXQgZGVmaW5lU3BlY2lhbEluZjtcbiAgICBsZXQgZGVmaW5lUm91bmQ7XG4gICAgaWYgKGVudigpLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpID09PSAyKSB7XG4gICAgICAgIHZlcnNpb24gPSAnI3ZlcnNpb24gMzAwIGVzJztcbiAgICAgICAgYXR0cmlidXRlID0gJ2luJztcbiAgICAgICAgdmFyeWluZ1ZzID0gJ291dCc7XG4gICAgICAgIHZhcnlpbmdGcyA9ICdpbic7XG4gICAgICAgIHRleHR1cmUyRCA9ICd0ZXh0dXJlJztcbiAgICAgICAgb3V0cHV0ID0gJ291dHB1dENvbG9yJztcbiAgICAgICAgZGVmaW5lT3V0cHV0ID0gJ291dCB2ZWM0IG91dHB1dENvbG9yOyc7XG4gICAgICAgIC8vIFVzZSBjdXN0b20gaXNuYW4gZGVmaW5pdGlvbiB0byB3b3JrIGFjcm9zcyBkaWZmZXJlbmNlcyBiZXR3ZWVuXG4gICAgICAgIC8vIGltcGxlbWVudGF0aW9ucyBvbiB2YXJpb3VzIHBsYXRmb3Jtcy4gV2hpbGUgdGhpcyBzaG91bGQgaGFwcGVuIGluIEFOR0xFXG4gICAgICAgIC8vIHdlIHN0aWxsIHNlZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGFuZHJvaWQgYW5kIHdpbmRvd3MgKG9uIGNocm9tZSkgd2hlblxuICAgICAgICAvLyB1c2luZyBpc25hbiBkaXJlY3RseS5cbiAgICAgICAgZGVmaW5lU3BlY2lhbE5hTiA9IGBcbiAgICAgIGJvb2wgaXNuYW5fY3VzdG9tKGZsb2F0IHZhbCkge1xuICAgICAgICByZXR1cm4gKHZhbCA+IDAuMCB8fCB2YWwgPCAwLjApID8gZmFsc2UgOiB2YWwgIT0gMC4wO1xuICAgICAgfVxuXG4gICAgICBidmVjNCBpc25hbl9jdXN0b20odmVjNCB2YWwpIHtcbiAgICAgICAgcmV0dXJuIGJ2ZWM0KGlzbmFuX2N1c3RvbSh2YWwueCksXG4gICAgICAgICAgaXNuYW5fY3VzdG9tKHZhbC55KSwgaXNuYW5fY3VzdG9tKHZhbC56KSwgaXNuYW5fY3VzdG9tKHZhbC53KSk7XG4gICAgICB9XG5cbiAgICAgICNkZWZpbmUgaXNuYW4odmFsdWUpIGlzbmFuX2N1c3RvbSh2YWx1ZSlcbiAgICBgO1xuICAgICAgICAvLyBJbiB3ZWJnbCAyIHdlIGRvIG5vdCBuZWVkIHRvIHNwZWNpZnkgYSBjdXN0b20gaXNpbmYgc28gdGhlcmUgaXMgbm9cbiAgICAgICAgLy8gbmVlZCBmb3IgYSBzcGVjaWFsIElORklOSVRZIGNvbnN0YW50LlxuICAgICAgICBkZWZpbmVTcGVjaWFsSW5mID0gYGA7XG4gICAgICAgIGRlZmluZVJvdW5kID0gYFxuICAgICAgI2RlZmluZSByb3VuZCh2YWx1ZSkgbmV3Um91bmQodmFsdWUpXG4gICAgICBpbnQgbmV3Um91bmQoZmxvYXQgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGludChmbG9vcih2YWx1ZSArIDAuNSkpO1xuICAgICAgfVxuXG4gICAgICBpdmVjNCBuZXdSb3VuZCh2ZWM0IHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBpdmVjNChmbG9vcih2YWx1ZSArIHZlYzQoMC41KSkpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2ZXJzaW9uID0gJyc7XG4gICAgICAgIGF0dHJpYnV0ZSA9ICdhdHRyaWJ1dGUnO1xuICAgICAgICB2YXJ5aW5nVnMgPSAndmFyeWluZyc7XG4gICAgICAgIHZhcnlpbmdGcyA9ICd2YXJ5aW5nJztcbiAgICAgICAgdGV4dHVyZTJEID0gJ3RleHR1cmUyRCc7XG4gICAgICAgIG91dHB1dCA9ICdnbF9GcmFnQ29sb3InO1xuICAgICAgICBkZWZpbmVPdXRwdXQgPSAnJztcbiAgICAgICAgLy8gV2ViR0wxIGhhcyBubyBidWlsdCBpbiBpc25hbiBzbyB3ZSBkZWZpbmUgb25lIGhlcmUuXG4gICAgICAgIGRlZmluZVNwZWNpYWxOYU4gPSBgXG4gICAgICAjZGVmaW5lIGlzbmFuKHZhbHVlKSBpc25hbl9jdXN0b20odmFsdWUpXG4gICAgICBib29sIGlzbmFuX2N1c3RvbShmbG9hdCB2YWwpIHtcbiAgICAgICAgcmV0dXJuICh2YWwgPiAwLiB8fCB2YWwgPCAxLiB8fCB2YWwgPT0gMC4pID8gZmFsc2UgOiB0cnVlO1xuICAgICAgfVxuICAgICAgYnZlYzQgaXNuYW5fY3VzdG9tKHZlYzQgdmFsKSB7XG4gICAgICAgIHJldHVybiBidmVjNChpc25hbih2YWwueCksIGlzbmFuKHZhbC55KSwgaXNuYW4odmFsLnopLCBpc25hbih2YWwudykpO1xuICAgICAgfVxuICAgIGA7XG4gICAgICAgIGRlZmluZVNwZWNpYWxJbmYgPSBgXG4gICAgICB1bmlmb3JtIGZsb2F0IElORklOSVRZO1xuXG4gICAgICBib29sIGlzaW5mKGZsb2F0IHZhbCkge1xuICAgICAgICByZXR1cm4gYWJzKHZhbCkgPT0gSU5GSU5JVFk7XG4gICAgICB9XG4gICAgICBidmVjNCBpc2luZih2ZWM0IHZhbCkge1xuICAgICAgICByZXR1cm4gZXF1YWwoYWJzKHZhbCksIHZlYzQoSU5GSU5JVFkpKTtcbiAgICAgIH1cbiAgICBgO1xuICAgICAgICBkZWZpbmVSb3VuZCA9IGBcbiAgICAgIGludCByb3VuZChmbG9hdCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gaW50KGZsb29yKHZhbHVlICsgMC41KSk7XG4gICAgICB9XG5cbiAgICAgIGl2ZWM0IHJvdW5kKHZlYzQgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGl2ZWM0KGZsb29yKHZhbHVlICsgdmVjNCgwLjUpKSk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdmVyc2lvbixcbiAgICAgICAgYXR0cmlidXRlLFxuICAgICAgICB2YXJ5aW5nVnMsXG4gICAgICAgIHZhcnlpbmdGcyxcbiAgICAgICAgdGV4dHVyZTJELFxuICAgICAgICBvdXRwdXQsXG4gICAgICAgIGRlZmluZU91dHB1dCxcbiAgICAgICAgZGVmaW5lU3BlY2lhbE5hTixcbiAgICAgICAgZGVmaW5lU3BlY2lhbEluZixcbiAgICAgICAgZGVmaW5lUm91bmRcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2xzbF92ZXJzaW9uLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGVudiwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBnZXRXZWJHTENvbnRleHQsIHNldFdlYkdMQ29udGV4dCB9IGZyb20gJy4vY2FudmFzX3V0aWwnO1xuaW1wb3J0ICogYXMgZ3BncHVfdXRpbCBmcm9tICcuL2dwZ3B1X3V0aWwnO1xuaW1wb3J0ICogYXMgdGV4X3V0aWwgZnJvbSAnLi90ZXhfdXRpbCc7XG5pbXBvcnQgKiBhcyB3ZWJnbF91dGlsIGZyb20gJy4vd2ViZ2xfdXRpbCc7XG5leHBvcnQgY2xhc3MgR1BHUFVDb250ZXh0IHtcbiAgICBjb25zdHJ1Y3RvcihnbCkge1xuICAgICAgICB0aGlzLm91dHB1dFRleHR1cmUgPSBudWxsO1xuICAgICAgICB0aGlzLnByb2dyYW0gPSBudWxsO1xuICAgICAgICB0aGlzLmRpc3Bvc2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMudmVydGV4QXR0cnNBcmVCb3VuZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLml0ZW1zVG9Qb2xsID0gW107XG4gICAgICAgIGNvbnN0IGdsVmVyc2lvbiA9IGVudigpLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpO1xuICAgICAgICBpZiAoZ2wgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5nbCA9IGdsO1xuICAgICAgICAgICAgc2V0V2ViR0xDb250ZXh0KGdsVmVyc2lvbiwgZ2wpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5nbCA9IGdldFdlYkdMQ29udGV4dChnbFZlcnNpb24pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlYkdMIDIuMCBlbmFibGVzIHRleHR1cmUgZmxvYXRzIHdpdGhvdXQgYW4gZXh0ZW5zaW9uLlxuICAgICAgICBsZXQgQ09MT1JfQlVGRkVSX0ZMT0FUID0gJ1dFQkdMX2NvbG9yX2J1ZmZlcl9mbG9hdCc7XG4gICAgICAgIGNvbnN0IENPTE9SX0JVRkZFUl9IQUxGX0ZMT0FUID0gJ0VYVF9jb2xvcl9idWZmZXJfaGFsZl9mbG9hdCc7XG4gICAgICAgIGlmIChlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX1ZFUlNJT04nKSA9PT0gMSkge1xuICAgICAgICAgICAgY29uc3QgVEVYVFVSRV9GTE9BVCA9ICdPRVNfdGV4dHVyZV9mbG9hdCc7XG4gICAgICAgICAgICBjb25zdCBURVhUVVJFX0hBTEZfRkxPQVQgPSAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdCc7XG4gICAgICAgICAgICB0aGlzLnRleHR1cmVGbG9hdEV4dGVuc2lvbiA9XG4gICAgICAgICAgICAgICAgd2ViZ2xfdXRpbC5nZXRFeHRlbnNpb25PclRocm93KHRoaXMuZ2wsIFRFWFRVUkVfRkxPQVQpO1xuICAgICAgICAgICAgaWYgKHdlYmdsX3V0aWwuaGFzRXh0ZW5zaW9uKHRoaXMuZ2wsIFRFWFRVUkVfSEFMRl9GTE9BVCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRleHR1cmVIYWxmRmxvYXRFeHRlbnNpb24gPVxuICAgICAgICAgICAgICAgICAgICB3ZWJnbF91dGlsLmdldEV4dGVuc2lvbk9yVGhyb3codGhpcy5nbCwgVEVYVFVSRV9IQUxGX0ZMT0FUKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGVudigpLmdldCgnV0VCR0xfRk9SQ0VfRjE2X1RFWFRVUkVTJykpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dMIGNvbnRleHQgZG9lcyBub3Qgc3VwcG9ydCBoYWxmIGZsb2F0IHRleHR1cmVzLCB5ZXQgdGhlICcgK1xuICAgICAgICAgICAgICAgICAgICAnZW52aXJvbm1lbnQgZmxhZyBXRUJHTF9GT1JDRV9GMTZfVEVYVFVSRVMgaXMgc2V0IHRvIHRydWUuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbG9yQnVmZmVyRmxvYXRFeHRlbnNpb24gPSB0aGlzLmdsLmdldEV4dGVuc2lvbihDT0xPUl9CVUZGRVJfRkxPQVQpO1xuICAgICAgICAgICAgaWYgKHdlYmdsX3V0aWwuaGFzRXh0ZW5zaW9uKHRoaXMuZ2wsIENPTE9SX0JVRkZFUl9IQUxGX0ZMT0FUKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29sb3JCdWZmZXJIYWxmRmxvYXRFeHRlbnNpb24gPVxuICAgICAgICAgICAgICAgICAgICB3ZWJnbF91dGlsLmdldEV4dGVuc2lvbk9yVGhyb3codGhpcy5nbCwgQ09MT1JfQlVGRkVSX0hBTEZfRkxPQVQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZW52KCkuZ2V0KCdXRUJHTF9GT1JDRV9GMTZfVEVYVFVSRVMnKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignR0wgY29udGV4dCBkb2VzIG5vdCBzdXBwb3J0IGNvbG9yIHJlbmRlcmFibGUgaGFsZiBmbG9hdHMsIHlldCAnICtcbiAgICAgICAgICAgICAgICAgICAgJ3RoZSBlbnZpcm9ubWVudCBmbGFnIFdFQkdMX0ZPUkNFX0YxNl9URVhUVVJFUyBpcyBzZXQgdG8gdHJ1ZS4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIENPTE9SX0JVRkZFUl9GTE9BVCA9ICdFWFRfY29sb3JfYnVmZmVyX2Zsb2F0JztcbiAgICAgICAgICAgIGlmICh3ZWJnbF91dGlsLmhhc0V4dGVuc2lvbih0aGlzLmdsLCBDT0xPUl9CVUZGRVJfRkxPQVQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb2xvckJ1ZmZlckZsb2F0RXh0ZW5zaW9uID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nbC5nZXRFeHRlbnNpb24oQ09MT1JfQlVGRkVSX0ZMT0FUKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHdlYmdsX3V0aWwuaGFzRXh0ZW5zaW9uKHRoaXMuZ2wsIENPTE9SX0JVRkZFUl9IQUxGX0ZMT0FUKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29sb3JCdWZmZXJIYWxmRmxvYXRFeHRlbnNpb24gPVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdsLmdldEV4dGVuc2lvbihDT0xPUl9CVUZGRVJfSEFMRl9GTE9BVCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dMIGNvbnRleHQgZG9lcyBub3Qgc3VwcG9ydCBjb2xvciByZW5kZXJhYmxlIGZsb2F0cycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudmVydGV4QnVmZmVyID0gZ3BncHVfdXRpbC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5nbCk7XG4gICAgICAgIHRoaXMuaW5kZXhCdWZmZXIgPSBncGdwdV91dGlsLmNyZWF0ZUluZGV4QnVmZmVyKHRoaXMuZ2wpO1xuICAgICAgICB0aGlzLmZyYW1lYnVmZmVyID0gd2ViZ2xfdXRpbC5jcmVhdGVGcmFtZWJ1ZmZlcih0aGlzLmdsKTtcbiAgICAgICAgdGhpcy50ZXh0dXJlQ29uZmlnID1cbiAgICAgICAgICAgIHRleF91dGlsLmdldFRleHR1cmVDb25maWcodGhpcy5nbCwgdGhpcy50ZXh0dXJlSGFsZkZsb2F0RXh0ZW5zaW9uKTtcbiAgICB9XG4gICAgZ2V0IGRlYnVnKCkge1xuICAgICAgICByZXR1cm4gZW52KCkuZ2V0Qm9vbCgnREVCVUcnKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wcm9ncmFtICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignRGlzcG9zaW5nIGEgR1BHUFVDb250ZXh0IHRoYXQgc3RpbGwgaGFzIGEgYm91bmQgV2ViR0xQcm9ncmFtLicgK1xuICAgICAgICAgICAgICAgICcgVGhpcyBpcyBwcm9iYWJseSBhIHJlc291cmNlIGxlYWssIGRlbGV0ZSB0aGUgcHJvZ3JhbSB3aXRoICcgK1xuICAgICAgICAgICAgICAgICdHUEdQVUNvbnRleHQuZGVsZXRlUHJvZ3JhbSBiZWZvcmUgZGlzcG9zaW5nLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm91dHB1dFRleHR1cmUgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdEaXNwb3NpbmcgYSBHUEdQVUNvbnRleHQgdGhhdCBzdGlsbCBoYXMgYSBib3VuZCBvdXRwdXQgbWF0cml4ICcgK1xuICAgICAgICAgICAgICAgICd0ZXh0dXJlLiAgVGhpcyBpcyBwcm9iYWJseSBhIHJlc291cmNlIGxlYWssIGRlbGV0ZSB0aGUgb3V0cHV0ICcgK1xuICAgICAgICAgICAgICAgICdtYXRyaXggdGV4dHVyZSB3aXRoIEdQR1BVQ29udGV4dC5kZWxldGVNYXRyaXhUZXh0dXJlIGJlZm9yZSAnICtcbiAgICAgICAgICAgICAgICAnZGlzcG9zaW5nLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICAgICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmZpbmlzaCgpKTtcbiAgICAgICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgbnVsbCkpO1xuICAgICAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuZGVsZXRlRnJhbWVidWZmZXIodGhpcy5mcmFtZWJ1ZmZlcikpO1xuICAgICAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIG51bGwpKTtcbiAgICAgICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJpbmRCdWZmZXIoZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIG51bGwpKTtcbiAgICAgICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmRlbGV0ZUJ1ZmZlcih0aGlzLmluZGV4QnVmZmVyKSk7XG4gICAgICAgIHRoaXMuZGlzcG9zZWQgPSB0cnVlO1xuICAgIH1cbiAgICBjcmVhdGVGbG9hdDMyTWF0cml4VGV4dHVyZShyb3dzLCBjb2x1bW5zKSB7XG4gICAgICAgIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gICAgICAgIHJldHVybiBncGdwdV91dGlsLmNyZWF0ZUZsb2F0MzJNYXRyaXhUZXh0dXJlKHRoaXMuZ2wsIHJvd3MsIGNvbHVtbnMsIHRoaXMudGV4dHVyZUNvbmZpZyk7XG4gICAgfVxuICAgIGNyZWF0ZUZsb2F0MTZNYXRyaXhUZXh0dXJlKHJvd3MsIGNvbHVtbnMpIHtcbiAgICAgICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICAgICAgcmV0dXJuIGdwZ3B1X3V0aWwuY3JlYXRlRmxvYXQxNk1hdHJpeFRleHR1cmUodGhpcy5nbCwgcm93cywgY29sdW1ucywgdGhpcy50ZXh0dXJlQ29uZmlnKTtcbiAgICB9XG4gICAgY3JlYXRlVW5zaWduZWRCeXRlc01hdHJpeFRleHR1cmUocm93cywgY29sdW1ucykge1xuICAgICAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgICAgICByZXR1cm4gZ3BncHVfdXRpbC5jcmVhdGVVbnNpZ25lZEJ5dGVzTWF0cml4VGV4dHVyZSh0aGlzLmdsLCByb3dzLCBjb2x1bW5zLCB0aGlzLnRleHR1cmVDb25maWcpO1xuICAgIH1cbiAgICB1cGxvYWRQaXhlbERhdGFUb1RleHR1cmUodGV4dHVyZSwgcGl4ZWxzKSB7XG4gICAgICAgIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gICAgICAgIGdwZ3B1X3V0aWwudXBsb2FkUGl4ZWxEYXRhVG9UZXh0dXJlKHRoaXMuZ2wsIHRleHR1cmUsIHBpeGVscyk7XG4gICAgfVxuICAgIHVwbG9hZERlbnNlTWF0cml4VG9UZXh0dXJlKHRleHR1cmUsIHdpZHRoLCBoZWlnaHQsIGRhdGEpIHtcbiAgICAgICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICAgICAgZ3BncHVfdXRpbC51cGxvYWREZW5zZU1hdHJpeFRvVGV4dHVyZSh0aGlzLmdsLCB0ZXh0dXJlLCB3aWR0aCwgaGVpZ2h0LCBkYXRhLCB0aGlzLnRleHR1cmVDb25maWcpO1xuICAgIH1cbiAgICBjcmVhdGVGbG9hdDE2UGFja2VkTWF0cml4VGV4dHVyZShyb3dzLCBjb2x1bW5zKSB7XG4gICAgICAgIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gICAgICAgIHJldHVybiBncGdwdV91dGlsLmNyZWF0ZUZsb2F0MTZQYWNrZWRNYXRyaXhUZXh0dXJlKHRoaXMuZ2wsIHJvd3MsIGNvbHVtbnMsIHRoaXMudGV4dHVyZUNvbmZpZyk7XG4gICAgfVxuICAgIGNyZWF0ZVBhY2tlZE1hdHJpeFRleHR1cmUocm93cywgY29sdW1ucykge1xuICAgICAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgICAgICByZXR1cm4gZ3BncHVfdXRpbC5jcmVhdGVQYWNrZWRNYXRyaXhUZXh0dXJlKHRoaXMuZ2wsIHJvd3MsIGNvbHVtbnMsIHRoaXMudGV4dHVyZUNvbmZpZyk7XG4gICAgfVxuICAgIGRlbGV0ZU1hdHJpeFRleHR1cmUodGV4dHVyZSkge1xuICAgICAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgICAgICBpZiAodGhpcy5vdXRwdXRUZXh0dXJlID09PSB0ZXh0dXJlKSB7XG4gICAgICAgICAgICB3ZWJnbF91dGlsLnVuYmluZENvbG9yVGV4dHVyZUZyb21GcmFtZWJ1ZmZlcih0aGlzLmdsLCB0aGlzLmZyYW1lYnVmZmVyKTtcbiAgICAgICAgICAgIHRoaXMub3V0cHV0VGV4dHVyZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2sodGhpcy5nbCwgKCkgPT4gdGhpcy5nbC5kZWxldGVUZXh0dXJlKHRleHR1cmUpKTtcbiAgICB9XG4gICAgZG93bmxvYWRCeXRlRW5jb2RlZEZsb2F0TWF0cml4RnJvbU91dHB1dFRleHR1cmUodGV4dHVyZSwgcm93cywgY29sdW1ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5kb3dubG9hZE1hdHJpeERyaXZlcih0ZXh0dXJlLCAoKSA9PiBncGdwdV91dGlsLmRvd25sb2FkQnl0ZUVuY29kZWRGbG9hdE1hdHJpeEZyb21PdXRwdXRUZXh0dXJlKHRoaXMuZ2wsIHJvd3MsIGNvbHVtbnMsIHRoaXMudGV4dHVyZUNvbmZpZykpO1xuICAgIH1cbiAgICBkb3dubG9hZFBhY2tlZE1hdHJpeEZyb21CdWZmZXIoYnVmZmVyLCBiYXRjaCwgcm93cywgY29sdW1ucywgcGh5c2ljYWxSb3dzLCBwaHlzaWNhbENvbHMpIHtcbiAgICAgICAgcmV0dXJuIGdwZ3B1X3V0aWwuZG93bmxvYWRQYWNrZWRNYXRyaXhGcm9tQnVmZmVyKHRoaXMuZ2wsIGJ1ZmZlciwgYmF0Y2gsIHJvd3MsIGNvbHVtbnMsIHBoeXNpY2FsUm93cywgcGh5c2ljYWxDb2xzLCB0aGlzLnRleHR1cmVDb25maWcpO1xuICAgIH1cbiAgICBkb3dubG9hZEZsb2F0MzJNYXRyaXhGcm9tQnVmZmVyKGJ1ZmZlciwgc2l6ZSkge1xuICAgICAgICByZXR1cm4gZ3BncHVfdXRpbC5kb3dubG9hZEZsb2F0MzJNYXRyaXhGcm9tQnVmZmVyKHRoaXMuZ2wsIGJ1ZmZlciwgc2l6ZSk7XG4gICAgfVxuICAgIGNyZWF0ZUJ1ZmZlckZyb21UZXh0dXJlKHRleHR1cmUsIHJvd3MsIGNvbHVtbnMpIHtcbiAgICAgICAgdGhpcy5iaW5kVGV4dHVyZVRvRnJhbWVCdWZmZXIodGV4dHVyZSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGdwZ3B1X3V0aWwuY3JlYXRlQnVmZmVyRnJvbU91dHB1dFRleHR1cmUodGhpcy5nbCwgcm93cywgY29sdW1ucywgdGhpcy50ZXh0dXJlQ29uZmlnKTtcbiAgICAgICAgdGhpcy51bmJpbmRUZXh0dXJlVG9GcmFtZUJ1ZmZlcigpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBjcmVhdGVBbmRXYWl0Rm9yRmVuY2UoKSB7XG4gICAgICAgIGNvbnN0IGZlbmNlQ29udGV4dCA9IHRoaXMuY3JlYXRlRmVuY2UodGhpcy5nbCk7XG4gICAgICAgIHJldHVybiB0aGlzLnBvbGxGZW5jZShmZW5jZUNvbnRleHQpO1xuICAgIH1cbiAgICBjcmVhdGVGZW5jZShnbCkge1xuICAgICAgICBsZXQgcXVlcnk7XG4gICAgICAgIGxldCBpc0ZlbmNlUGFzc2VkO1xuICAgICAgICBpZiAoZW52KCkuZ2V0Qm9vbCgnV0VCR0xfRkVOQ0VfQVBJX0VOQUJMRUQnKSkge1xuICAgICAgICAgICAgY29uc3QgZ2wyID0gZ2w7XG4gICAgICAgICAgICBjb25zdCBzeW5jID0gZ2wyLmZlbmNlU3luYyhnbDIuU1lOQ19HUFVfQ09NTUFORFNfQ09NUExFVEUsIDApO1xuICAgICAgICAgICAgZ2wuZmx1c2goKTtcbiAgICAgICAgICAgIGlzRmVuY2VQYXNzZWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdHVzID0gZ2wyLmNsaWVudFdhaXRTeW5jKHN5bmMsIDAsIDApO1xuICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXMgPT09IGdsMi5BTFJFQURZX1NJR05BTEVEIHx8XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9PT0gZ2wyLkNPTkRJVElPTl9TQVRJU0ZJRUQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcXVlcnkgPSBzeW5jO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGVudigpLmdldE51bWJlcignV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1ZFUlNJT04nKSA+IDApIHtcbiAgICAgICAgICAgIHF1ZXJ5ID0gdGhpcy5iZWdpblF1ZXJ5KCk7XG4gICAgICAgICAgICB0aGlzLmVuZFF1ZXJ5KCk7XG4gICAgICAgICAgICBpc0ZlbmNlUGFzc2VkID0gKCkgPT4gdGhpcy5pc1F1ZXJ5QXZhaWxhYmxlKHF1ZXJ5LCBlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX0RJU0pPSU5UX1FVRVJZX1RJTUVSX0VYVEVOU0lPTl9WRVJTSU9OJykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBubyB3YXkgdG8gZmVuY2UsIHJldHVybiB0cnVlIGltbWVkaWF0ZWx5LiBUaGlzIHdpbGwgZmlyZSBpblxuICAgICAgICAgICAgLy8gV2ViR0wgMS4wIHdoZW4gdGhlcmUgaXMgbm8gZGlzam9pbnQgcXVlcnkgdGltZXIuIEluIHRoaXMgY2FzZSwgYmVjYXVzZVxuICAgICAgICAgICAgLy8gdGhlIGZlbmNlIHBhc3NlcyBpbW1lZGlhdGVseSwgd2UnbGwgaW1tZWRpYXRlbHkgYXNrIGZvciBhIGRvd25sb2FkIG9mXG4gICAgICAgICAgICAvLyB0aGUgdGV4dHVyZSwgd2hpY2ggd2lsbCBjYXVzZSB0aGUgVUkgdGhyZWFkIHRvIGhhbmcuXG4gICAgICAgICAgICBpc0ZlbmNlUGFzc2VkID0gKCkgPT4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBxdWVyeSwgaXNGZW5jZVBhc3NlZCB9O1xuICAgIH1cbiAgICBkb3dubG9hZE1hdHJpeEZyb21QYWNrZWRUZXh0dXJlKHRleHR1cmUsIHBoeXNpY2FsUm93cywgcGh5c2ljYWxDb2xzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvd25sb2FkTWF0cml4RHJpdmVyKHRleHR1cmUsICgpID0+IGdwZ3B1X3V0aWwuZG93bmxvYWRNYXRyaXhGcm9tUGFja2VkT3V0cHV0VGV4dHVyZSh0aGlzLmdsLCBwaHlzaWNhbFJvd3MsIHBoeXNpY2FsQ29scykpO1xuICAgIH1cbiAgICBjcmVhdGVQcm9ncmFtKGZyYWdtZW50U2hhZGVyU291cmNlKSB7XG4gICAgICAgIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSB3ZWJnbF91dGlsLmNyZWF0ZUZyYWdtZW50U2hhZGVyKGdsLCBmcmFnbWVudFNoYWRlclNvdXJjZSk7XG4gICAgICAgIGlmICh0aGlzLnZlcnRleFNoYWRlciA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnZlcnRleFNoYWRlciA9IGdwZ3B1X3V0aWwuY3JlYXRlVmVydGV4U2hhZGVyKGdsKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9ncmFtID0gd2ViZ2xfdXRpbC5jcmVhdGVQcm9ncmFtKGdsKTtcbiAgICAgICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmF0dGFjaFNoYWRlcihwcm9ncmFtLCB0aGlzLnZlcnRleFNoYWRlcikpO1xuICAgICAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuYXR0YWNoU2hhZGVyKHByb2dyYW0sIGZyYWdtZW50U2hhZGVyKSk7XG4gICAgICAgIHdlYmdsX3V0aWwubGlua1Byb2dyYW0oZ2wsIHByb2dyYW0pO1xuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgd2ViZ2xfdXRpbC52YWxpZGF0ZVByb2dyYW0oZ2wsIHByb2dyYW0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy52ZXJ0ZXhBdHRyc0FyZUJvdW5kKSB7XG4gICAgICAgICAgICB0aGlzLnNldFByb2dyYW0ocHJvZ3JhbSk7XG4gICAgICAgICAgICB0aGlzLnZlcnRleEF0dHJzQXJlQm91bmQgPSBncGdwdV91dGlsLmJpbmRWZXJ0ZXhQcm9ncmFtQXR0cmlidXRlU3RyZWFtcyhnbCwgdGhpcy5wcm9ncmFtLCB0aGlzLnZlcnRleEJ1ZmZlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb2dyYW07XG4gICAgfVxuICAgIGRlbGV0ZVByb2dyYW0ocHJvZ3JhbSkge1xuICAgICAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgICAgICBpZiAocHJvZ3JhbSA9PT0gdGhpcy5wcm9ncmFtKSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyYW0gPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtICE9IG51bGwpIHtcbiAgICAgICAgICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKHRoaXMuZ2wsICgpID0+IHRoaXMuZ2wuZGVsZXRlUHJvZ3JhbShwcm9ncmFtKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0UHJvZ3JhbShwcm9ncmFtKSB7XG4gICAgICAgIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IHByb2dyYW07XG4gICAgICAgIGlmICgodGhpcy5wcm9ncmFtICE9IG51bGwpICYmIHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHdlYmdsX3V0aWwudmFsaWRhdGVQcm9ncmFtKHRoaXMuZ2wsIHRoaXMucHJvZ3JhbSk7XG4gICAgICAgIH1cbiAgICAgICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2sodGhpcy5nbCwgKCkgPT4gdGhpcy5nbC51c2VQcm9ncmFtKHByb2dyYW0pKTtcbiAgICB9XG4gICAgZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sIHVuaWZvcm1OYW1lLCBzaG91bGRUaHJvdyA9IHRydWUpIHtcbiAgICAgICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICAgICAgaWYgKHNob3VsZFRocm93KSB7XG4gICAgICAgICAgICByZXR1cm4gd2ViZ2xfdXRpbC5nZXRQcm9ncmFtVW5pZm9ybUxvY2F0aW9uT3JUaHJvdyh0aGlzLmdsLCBwcm9ncmFtLCB1bmlmb3JtTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gd2ViZ2xfdXRpbC5nZXRQcm9ncmFtVW5pZm9ybUxvY2F0aW9uKHRoaXMuZ2wsIHByb2dyYW0sIHVuaWZvcm1OYW1lKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRBdHRyaWJ1dGVMb2NhdGlvbihwcm9ncmFtLCBhdHRyaWJ1dGUpIHtcbiAgICAgICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICAgICAgcmV0dXJuIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKHRoaXMuZ2wsICgpID0+IHRoaXMuZ2wuZ2V0QXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgYXR0cmlidXRlKSk7XG4gICAgfVxuICAgIGdldFVuaWZvcm1Mb2NhdGlvbk5vVGhyb3cocHJvZ3JhbSwgdW5pZm9ybU5hbWUpIHtcbiAgICAgICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sIHVuaWZvcm1OYW1lKTtcbiAgICB9XG4gICAgc2V0SW5wdXRNYXRyaXhUZXh0dXJlKGlucHV0TWF0cml4VGV4dHVyZSwgdW5pZm9ybUxvY2F0aW9uLCB0ZXh0dXJlVW5pdCkge1xuICAgICAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgICAgICB0aGlzLnRocm93SWZOb1Byb2dyYW0oKTtcbiAgICAgICAgd2ViZ2xfdXRpbC5iaW5kVGV4dHVyZVRvUHJvZ3JhbVVuaWZvcm1TYW1wbGVyKHRoaXMuZ2wsIGlucHV0TWF0cml4VGV4dHVyZSwgdW5pZm9ybUxvY2F0aW9uLCB0ZXh0dXJlVW5pdCk7XG4gICAgfVxuICAgIHNldE91dHB1dE1hdHJpeFRleHR1cmUob3V0cHV0TWF0cml4VGV4dHVyZSwgcm93cywgY29sdW1ucykge1xuICAgICAgICB0aGlzLnNldE91dHB1dE1hdHJpeFRleHR1cmVEcml2ZXIob3V0cHV0TWF0cml4VGV4dHVyZSwgY29sdW1ucywgcm93cyk7XG4gICAgfVxuICAgIHNldE91dHB1dFBhY2tlZE1hdHJpeFRleHR1cmUob3V0cHV0UGFja2VkTWF0cml4VGV4dHVyZSwgcm93cywgY29sdW1ucykge1xuICAgICAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgICAgICBjb25zdCBbd2lkdGgsIGhlaWdodF0gPSB0ZXhfdXRpbC5nZXRQYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodChyb3dzLCBjb2x1bW5zKTtcbiAgICAgICAgdGhpcy5zZXRPdXRwdXRNYXRyaXhUZXh0dXJlRHJpdmVyKG91dHB1dFBhY2tlZE1hdHJpeFRleHR1cmUsIHdpZHRoLCBoZWlnaHQpO1xuICAgIH1cbiAgICBzZXRPdXRwdXRNYXRyaXhXcml0ZVJlZ2lvbihzdGFydFJvdywgbnVtUm93cywgc3RhcnRDb2x1bW4sIG51bUNvbHVtbnMpIHtcbiAgICAgICAgdGhpcy5zZXRPdXRwdXRNYXRyaXhXcml0ZVJlZ2lvbkRyaXZlcihzdGFydENvbHVtbiwgc3RhcnRSb3csIG51bUNvbHVtbnMsIG51bVJvd3MpO1xuICAgIH1cbiAgICBzZXRPdXRwdXRQYWNrZWRNYXRyaXhXcml0ZVJlZ2lvbihzdGFydFJvdywgbnVtUm93cywgc3RhcnRDb2x1bW4sIG51bUNvbHVtbnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzZXRPdXRwdXRQYWNrZWRNYXRyaXhXcml0ZVJlZ2lvbiBub3QgaW1wbGVtZW50ZWQuJyk7XG4gICAgfVxuICAgIGRlYnVnVmFsaWRhdGUoKSB7XG4gICAgICAgIGlmICh0aGlzLnByb2dyYW0gIT0gbnVsbCkge1xuICAgICAgICAgICAgd2ViZ2xfdXRpbC52YWxpZGF0ZVByb2dyYW0odGhpcy5nbCwgdGhpcy5wcm9ncmFtKTtcbiAgICAgICAgfVxuICAgICAgICB3ZWJnbF91dGlsLnZhbGlkYXRlRnJhbWVidWZmZXIodGhpcy5nbCk7XG4gICAgfVxuICAgIGV4ZWN1dGVQcm9ncmFtKCkge1xuICAgICAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgICAgICB0aGlzLnRocm93SWZOb1Byb2dyYW0oKTtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsO1xuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5kZWJ1Z1ZhbGlkYXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmRyYXdFbGVtZW50cyhnbC5UUklBTkdMRVMsIDYsIGdsLlVOU0lHTkVEX1NIT1JULCAwKSk7XG4gICAgfVxuICAgIGJsb2NrVW50aWxBbGxQcm9ncmFtc0NvbXBsZXRlZCgpIHtcbiAgICAgICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICAgICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2sodGhpcy5nbCwgKCkgPT4gdGhpcy5nbC5maW5pc2goKSk7XG4gICAgfVxuICAgIGdldFF1ZXJ5VGltZXJFeHRlbnNpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLmRpc2pvaW50UXVlcnlUaW1lckV4dGVuc2lvbiA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmRpc2pvaW50UXVlcnlUaW1lckV4dGVuc2lvbiA9XG4gICAgICAgICAgICAgICAgd2ViZ2xfdXRpbC5nZXRFeHRlbnNpb25PclRocm93KHRoaXMuZ2wsIGVudigpLmdldE51bWJlcignV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1ZFUlNJT04nKSA9PT0gMiA/XG4gICAgICAgICAgICAgICAgICAgICdFWFRfZGlzam9pbnRfdGltZXJfcXVlcnlfd2ViZ2wyJyA6XG4gICAgICAgICAgICAgICAgICAgICdFWFRfZGlzam9pbnRfdGltZXJfcXVlcnknKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5kaXNqb2ludFF1ZXJ5VGltZXJFeHRlbnNpb247XG4gICAgfVxuICAgIGdldFF1ZXJ5VGltZXJFeHRlbnNpb25XZWJHTDIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFF1ZXJ5VGltZXJFeHRlbnNpb24oKTtcbiAgICB9XG4gICAgZ2V0UXVlcnlUaW1lckV4dGVuc2lvbldlYkdMMSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UXVlcnlUaW1lckV4dGVuc2lvbigpO1xuICAgIH1cbiAgICBiZWdpblF1ZXJ5KCkge1xuICAgICAgICBpZiAoZW52KCkuZ2V0TnVtYmVyKCdXRUJHTF9ESVNKT0lOVF9RVUVSWV9USU1FUl9FWFRFTlNJT05fVkVSU0lPTicpID09PSAyKSB7XG4gICAgICAgICAgICBjb25zdCBnbDIgPSB0aGlzLmdsO1xuICAgICAgICAgICAgY29uc3QgZXh0ID0gdGhpcy5nZXRRdWVyeVRpbWVyRXh0ZW5zaW9uV2ViR0wyKCk7XG4gICAgICAgICAgICBjb25zdCBxdWVyeSA9IGdsMi5jcmVhdGVRdWVyeSgpO1xuICAgICAgICAgICAgZ2wyLmJlZ2luUXVlcnkoZXh0LlRJTUVfRUxBUFNFRF9FWFQsIHF1ZXJ5KTtcbiAgICAgICAgICAgIHJldHVybiBxdWVyeTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBleHQgPSB0aGlzLmdldFF1ZXJ5VGltZXJFeHRlbnNpb25XZWJHTDEoKTtcbiAgICAgICAgY29uc3QgcXVlcnkgPSBleHQuY3JlYXRlUXVlcnlFWFQoKTtcbiAgICAgICAgZXh0LmJlZ2luUXVlcnlFWFQoZXh0LlRJTUVfRUxBUFNFRF9FWFQsIHF1ZXJ5KTtcbiAgICAgICAgcmV0dXJuIHF1ZXJ5O1xuICAgIH1cbiAgICBlbmRRdWVyeSgpIHtcbiAgICAgICAgaWYgKGVudigpLmdldE51bWJlcignV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1ZFUlNJT04nKSA9PT0gMikge1xuICAgICAgICAgICAgY29uc3QgZ2wyID0gdGhpcy5nbDtcbiAgICAgICAgICAgIGNvbnN0IGV4dCA9IHRoaXMuZ2V0UXVlcnlUaW1lckV4dGVuc2lvbldlYkdMMigpO1xuICAgICAgICAgICAgZ2wyLmVuZFF1ZXJ5KGV4dC5USU1FX0VMQVBTRURfRVhUKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBleHQgPSB0aGlzLmdldFF1ZXJ5VGltZXJFeHRlbnNpb25XZWJHTDEoKTtcbiAgICAgICAgZXh0LmVuZFF1ZXJ5RVhUKGV4dC5USU1FX0VMQVBTRURfRVhUKTtcbiAgICB9XG4gICAgYXN5bmMgd2FpdEZvclF1ZXJ5QW5kR2V0VGltZShxdWVyeSkge1xuICAgICAgICBhd2FpdCB1dGlsLnJlcGVhdGVkVHJ5KCgpID0+IHRoaXMuZGlzcG9zZWQgfHwgLy8gd2hpbGUgdGVzdGluZyBjb250ZXh0cyBhcmUgY3JlYXRlZCAvIGRpc3Bvc2VkXG4gICAgICAgICAgICAvLyBpbiByYXBpZCBzdWNjZXNzaW9uLCBzbyB3aXRob3V0IHRoaXMgY2hlY2sgd2VcbiAgICAgICAgICAgIC8vIG1heSBwb2xsIGZvciB0aGUgcXVlcnkgdGltZXIgaW5kZWZpbml0ZWx5XG4gICAgICAgICAgICB0aGlzLmlzUXVlcnlBdmFpbGFibGUocXVlcnksIGVudigpLmdldE51bWJlcignV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1ZFUlNJT04nKSkpO1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRRdWVyeVRpbWUocXVlcnksIGVudigpLmdldE51bWJlcignV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1ZFUlNJT04nKSk7XG4gICAgfVxuICAgIGdldFF1ZXJ5VGltZShxdWVyeSwgcXVlcnlUaW1lclZlcnNpb24pIHtcbiAgICAgICAgaWYgKHF1ZXJ5VGltZXJWZXJzaW9uID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocXVlcnlUaW1lclZlcnNpb24gPT09IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IGdsMiA9IHRoaXMuZ2w7XG4gICAgICAgICAgICBjb25zdCB0aW1lRWxhcHNlZE5hbm9zID0gZ2wyLmdldFF1ZXJ5UGFyYW1ldGVyKHF1ZXJ5LCBnbDIuUVVFUllfUkVTVUxUKTtcbiAgICAgICAgICAgIC8vIFJldHVybiBtaWxsaXNlY29uZHMuXG4gICAgICAgICAgICByZXR1cm4gdGltZUVsYXBzZWROYW5vcyAvIDEwMDAwMDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBleHQgPSB0aGlzLmdldFF1ZXJ5VGltZXJFeHRlbnNpb25XZWJHTDEoKTtcbiAgICAgICAgICAgIGNvbnN0IHRpbWVFbGFwc2VkTmFub3MgPSBleHQuZ2V0UXVlcnlPYmplY3RFWFQocXVlcnksIGV4dC5RVUVSWV9SRVNVTFRfRVhUKTtcbiAgICAgICAgICAgIC8vIFJldHVybiBtaWxsaXNlY29uZHMuXG4gICAgICAgICAgICByZXR1cm4gdGltZUVsYXBzZWROYW5vcyAvIDEwMDAwMDA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaXNRdWVyeUF2YWlsYWJsZShxdWVyeSwgcXVlcnlUaW1lclZlcnNpb24pIHtcbiAgICAgICAgaWYgKHF1ZXJ5VGltZXJWZXJzaW9uID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocXVlcnlUaW1lclZlcnNpb24gPT09IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IGdsMiA9IHRoaXMuZ2w7XG4gICAgICAgICAgICBjb25zdCBleHQgPSB0aGlzLmdldFF1ZXJ5VGltZXJFeHRlbnNpb25XZWJHTDIoKTtcbiAgICAgICAgICAgIGNvbnN0IGF2YWlsYWJsZSA9IGdsMi5nZXRRdWVyeVBhcmFtZXRlcihxdWVyeSwgZ2wyLlFVRVJZX1JFU1VMVF9BVkFJTEFCTEUpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZGlzam9pbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzam9pbnQgPSB0aGlzLmdsLmdldFBhcmFtZXRlcihleHQuR1BVX0RJU0pPSU5UX0VYVCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXZhaWxhYmxlICYmICF0aGlzLmRpc2pvaW50O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZXh0ID0gdGhpcy5nZXRRdWVyeVRpbWVyRXh0ZW5zaW9uV2ViR0wxKCk7XG4gICAgICAgICAgICBjb25zdCBhdmFpbGFibGUgPSBleHQuZ2V0UXVlcnlPYmplY3RFWFQocXVlcnksIGV4dC5RVUVSWV9SRVNVTFRfQVZBSUxBQkxFX0VYVCk7XG4gICAgICAgICAgICBpZiAodGhpcy5kaXNqb2ludCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNqb2ludCA9IHRoaXMuZ2wuZ2V0UGFyYW1ldGVyKGV4dC5HUFVfRElTSk9JTlRfRVhUKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhdmFpbGFibGUgJiYgIXRoaXMuZGlzam9pbnQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcG9sbEZlbmNlKGZlbmNlQ29udGV4dCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFkZEl0ZW1Ub1BvbGwoKCkgPT4gZmVuY2VDb250ZXh0LmlzRmVuY2VQYXNzZWQoKSwgKCkgPT4gcmVzb2x2ZSgpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHBvbGxJdGVtcygpIHtcbiAgICAgICAgLy8gRmluZCB0aGUgbGFzdCBxdWVyeSB0aGF0IGhhcyBmaW5pc2hlZC5cbiAgICAgICAgY29uc3QgaW5kZXggPSBsaW5lYXJTZWFyY2hMYXN0VHJ1ZSh0aGlzLml0ZW1zVG9Qb2xsLm1hcCh4ID0+IHguaXNEb25lRm4pKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gaW5kZXg7ICsraSkge1xuICAgICAgICAgICAgY29uc3QgeyByZXNvbHZlRm4gfSA9IHRoaXMuaXRlbXNUb1BvbGxbaV07XG4gICAgICAgICAgICByZXNvbHZlRm4oKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLml0ZW1zVG9Qb2xsID0gdGhpcy5pdGVtc1RvUG9sbC5zbGljZShpbmRleCArIDEpO1xuICAgIH1cbiAgICBhZGRJdGVtVG9Qb2xsKGlzRG9uZUZuLCByZXNvbHZlRm4pIHtcbiAgICAgICAgdGhpcy5pdGVtc1RvUG9sbC5wdXNoKHsgaXNEb25lRm4sIHJlc29sdmVGbiB9KTtcbiAgICAgICAgaWYgKHRoaXMuaXRlbXNUb1BvbGwubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgLy8gV2UgYWxyZWFkeSBoYXZlIGEgcnVubmluZyBsb29wIHRoYXQgcG9sbHMuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gU3RhcnQgYSBuZXcgbG9vcCB0aGF0IHBvbGxzLlxuICAgICAgICB1dGlsLnJlcGVhdGVkVHJ5KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucG9sbEl0ZW1zKCk7XG4gICAgICAgICAgICAvLyBFbmQgdGhlIGxvb3AgaWYgbm8gbW9yZSBpdGVtcyB0byBwb2xsLlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXRlbXNUb1BvbGwubGVuZ3RoID09PSAwO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYmluZFRleHR1cmVUb0ZyYW1lQnVmZmVyKHRleHR1cmUpIHtcbiAgICAgICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICAgICAgd2ViZ2xfdXRpbC5iaW5kQ29sb3JUZXh0dXJlVG9GcmFtZWJ1ZmZlcih0aGlzLmdsLCB0ZXh0dXJlLCB0aGlzLmZyYW1lYnVmZmVyKTtcbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHdlYmdsX3V0aWwudmFsaWRhdGVGcmFtZWJ1ZmZlcih0aGlzLmdsKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB1bmJpbmRUZXh0dXJlVG9GcmFtZUJ1ZmZlcigpIHtcbiAgICAgICAgaWYgKHRoaXMub3V0cHV0VGV4dHVyZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB3ZWJnbF91dGlsLmJpbmRDb2xvclRleHR1cmVUb0ZyYW1lYnVmZmVyKHRoaXMuZ2wsIHRoaXMub3V0cHV0VGV4dHVyZSwgdGhpcy5mcmFtZWJ1ZmZlcik7XG4gICAgICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgICAgIHdlYmdsX3V0aWwudmFsaWRhdGVGcmFtZWJ1ZmZlcih0aGlzLmdsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHdlYmdsX3V0aWwudW5iaW5kQ29sb3JUZXh0dXJlRnJvbUZyYW1lYnVmZmVyKHRoaXMuZ2wsIHRoaXMuZnJhbWVidWZmZXIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRvd25sb2FkTWF0cml4RHJpdmVyKHRleHR1cmUsIGRvd25sb2FkQW5kRGVjb2RlKSB7XG4gICAgICAgIHRoaXMuYmluZFRleHR1cmVUb0ZyYW1lQnVmZmVyKHRleHR1cmUpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBkb3dubG9hZEFuZERlY29kZSgpO1xuICAgICAgICB0aGlzLnVuYmluZFRleHR1cmVUb0ZyYW1lQnVmZmVyKCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHNldE91dHB1dE1hdHJpeFRleHR1cmVEcml2ZXIob3V0cHV0TWF0cml4VGV4dHVyZU1heWJlUGFja2VkLCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICAgICAgd2ViZ2xfdXRpbC5iaW5kQ29sb3JUZXh0dXJlVG9GcmFtZWJ1ZmZlcihnbCwgb3V0cHV0TWF0cml4VGV4dHVyZU1heWJlUGFja2VkLCB0aGlzLmZyYW1lYnVmZmVyKTtcbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHdlYmdsX3V0aWwudmFsaWRhdGVGcmFtZWJ1ZmZlcihnbCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vdXRwdXRUZXh0dXJlID0gb3V0cHV0TWF0cml4VGV4dHVyZU1heWJlUGFja2VkO1xuICAgICAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wudmlld3BvcnQoMCwgMCwgd2lkdGgsIGhlaWdodCkpO1xuICAgICAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuc2Npc3NvcigwLCAwLCB3aWR0aCwgaGVpZ2h0KSk7XG4gICAgfVxuICAgIHNldE91dHB1dE1hdHJpeFdyaXRlUmVnaW9uRHJpdmVyKHgsIHksIHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICAgICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2sodGhpcy5nbCwgKCkgPT4gdGhpcy5nbC5zY2lzc29yKHgsIHksIHdpZHRoLCBoZWlnaHQpKTtcbiAgICB9XG4gICAgdGhyb3dJZkRpc3Bvc2VkKCkge1xuICAgICAgICBpZiAodGhpcy5kaXNwb3NlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdHRlbXB0ZWQgdG8gdXNlIGRpc3Bvc2VkIEdQR1BVQ29udGV4dC4nKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0aHJvd0lmTm9Qcm9ncmFtKCkge1xuICAgICAgICBpZiAodGhpcy5wcm9ncmFtID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gR1BVIHByb2dyYW0gaXMgY3VycmVudGx5IHNldC4nKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogRmluZHMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IHRydWUgZWxlbWVudCB1c2luZyBsaW5lYXIgc2VhcmNoLlxuICogTm90ZTogV2UgY2FuJ3QgZG8gYmluYXJ5IHNlYXJjaCBiZWNhdXNlIENocm9tZSBleHBlY3RzIHVzIHRvIGV4cGxpY2l0bHlcbiAqIHRlc3QgYWxsIGZlbmNlcyBiZWZvcmUgZG93bmxvYWQ6XG4gKiBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZmpzL2lzc3Vlcy8xMTQ1XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaW5lYXJTZWFyY2hMYXN0VHJ1ZShhcnIpIHtcbiAgICBsZXQgaSA9IDA7XG4gICAgZm9yICg7IGkgPCBhcnIubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3QgaXNEb25lID0gYXJyW2ldKCk7XG4gICAgICAgIGlmICghaXNEb25lKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaSAtIDE7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ncGdwdV9jb250ZXh0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgZW52LCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCAqIGFzIHNoYWRlcl9jb21waWxlciBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5leHBvcnQgZnVuY3Rpb24gY29tcGlsZVByb2dyYW0oZ3BncHUsIHByb2dyYW0sIGlucHV0cywgb3V0cHV0KSB7XG4gICAgY29uc3QgaW5wdXRJbmZvcyA9IGlucHV0cy5tYXAoKGlucHV0LCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IHNoYXBlSW5mbyA9IHtcbiAgICAgICAgICAgIGxvZ2ljYWxTaGFwZTogaW5wdXQuc2hhcGUsXG4gICAgICAgICAgICB0ZXhTaGFwZTogaW5wdXQuaXNVbmlmb3JtID8gbnVsbCA6IGlucHV0LnRleERhdGEudGV4U2hhcGUsXG4gICAgICAgICAgICBpc1VuaWZvcm06IGlucHV0LmlzVW5pZm9ybSxcbiAgICAgICAgICAgIGlzUGFja2VkOiBpbnB1dC5pc1VuaWZvcm0gPyBmYWxzZSA6IGlucHV0LnRleERhdGEuaXNQYWNrZWQsXG4gICAgICAgICAgICBmbGF0T2Zmc2V0OiBudWxsXG4gICAgICAgIH07XG4gICAgICAgIGlmIChpbnB1dC50ZXhEYXRhICE9IG51bGwgJiYgaW5wdXQudGV4RGF0YS5zbGljZSAhPSBudWxsICYmXG4gICAgICAgICAgICBpbnB1dC50ZXhEYXRhLnNsaWNlLmZsYXRPZmZzZXQgPiAwKSB7XG4gICAgICAgICAgICBzaGFwZUluZm8uZmxhdE9mZnNldCA9IGlucHV0LnRleERhdGEuc2xpY2UuZmxhdE9mZnNldDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBuYW1lOiBwcm9ncmFtLnZhcmlhYmxlTmFtZXNbaV0sIHNoYXBlSW5mbyB9O1xuICAgIH0pO1xuICAgIGNvbnN0IGluU2hhcGVJbmZvcyA9IGlucHV0SW5mb3MubWFwKHggPT4geC5zaGFwZUluZm8pO1xuICAgIGNvbnN0IG91dFNoYXBlSW5mbyA9IHtcbiAgICAgICAgbG9naWNhbFNoYXBlOiBvdXRwdXQuc2hhcGUsXG4gICAgICAgIHRleFNoYXBlOiBvdXRwdXQudGV4RGF0YS50ZXhTaGFwZSxcbiAgICAgICAgaXNVbmlmb3JtOiBmYWxzZSxcbiAgICAgICAgaXNQYWNrZWQ6IG91dHB1dC50ZXhEYXRhLmlzUGFja2VkLFxuICAgICAgICBmbGF0T2Zmc2V0OiBudWxsXG4gICAgfTtcbiAgICBjb25zdCBzb3VyY2UgPSBzaGFkZXJfY29tcGlsZXIubWFrZVNoYWRlcihpbnB1dEluZm9zLCBvdXRTaGFwZUluZm8sIHByb2dyYW0pO1xuICAgIGNvbnN0IHdlYkdMUHJvZ3JhbSA9IGdwZ3B1LmNyZWF0ZVByb2dyYW0oc291cmNlKTtcbiAgICAvLyBBZGQgc3BlY2lhbCB1bmlmb3JtcyAoTkFOLCBJTkZJTklUWSlcbiAgICBsZXQgaW5mTG9jID0gbnVsbDtcbiAgICBjb25zdCBuYW5Mb2MgPSBncGdwdS5nZXRVbmlmb3JtTG9jYXRpb24od2ViR0xQcm9ncmFtLCAnTkFOJywgZmFsc2UpO1xuICAgIGlmIChlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX1ZFUlNJT04nKSA9PT0gMSkge1xuICAgICAgICBpbmZMb2MgPSBncGdwdS5nZXRVbmlmb3JtTG9jYXRpb24od2ViR0xQcm9ncmFtLCAnSU5GSU5JVFknLCBmYWxzZSk7XG4gICAgfVxuICAgIC8vIEFkZCB1c2VyLWRlZmluZWQgdW5pZm9ybXNcbiAgICBjb25zdCBzaG91bGRUaHJvdyA9IGZhbHNlO1xuICAgIGNvbnN0IHVuaWZvcm1Mb2NhdGlvbnMgPSB7fTtcbiAgICBjb25zdCBpblNoYXBlc0xvY2F0aW9ucyA9IHt9O1xuICAgIGNvbnN0IGluVGV4U2hhcGVzTG9jYXRpb25zID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9ncmFtLnZhcmlhYmxlTmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgdmFyTmFtZSA9IHByb2dyYW0udmFyaWFibGVOYW1lc1tpXTtcbiAgICAgICAgdW5pZm9ybUxvY2F0aW9uc1t2YXJOYW1lXSA9XG4gICAgICAgICAgICBncGdwdS5nZXRVbmlmb3JtTG9jYXRpb24od2ViR0xQcm9ncmFtLCB2YXJOYW1lLCBzaG91bGRUaHJvdyk7XG4gICAgICAgIHVuaWZvcm1Mb2NhdGlvbnNbYG9mZnNldCR7dmFyTmFtZX1gXSA9XG4gICAgICAgICAgICBncGdwdS5nZXRVbmlmb3JtTG9jYXRpb24od2ViR0xQcm9ncmFtLCBgb2Zmc2V0JHt2YXJOYW1lfWAsIHNob3VsZFRocm93KTtcbiAgICAgICAgaWYgKHByb2dyYW0uZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgICAgICAgaW5TaGFwZXNMb2NhdGlvbnNbYCR7dmFyTmFtZX1TaGFwZWBdID0gZ3BncHUuZ2V0VW5pZm9ybUxvY2F0aW9uKHdlYkdMUHJvZ3JhbSwgYCR7dmFyTmFtZX1TaGFwZWAsIHNob3VsZFRocm93KTtcbiAgICAgICAgICAgIGluVGV4U2hhcGVzTG9jYXRpb25zW2Ake3Zhck5hbWV9VGV4U2hhcGVgXSA9IGdwZ3B1LmdldFVuaWZvcm1Mb2NhdGlvbih3ZWJHTFByb2dyYW0sIGAke3Zhck5hbWV9VGV4U2hhcGVgLCBzaG91bGRUaHJvdyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IG91dFNoYXBlTG9jYXRpb247XG4gICAgbGV0IG91dFRleFNoYXBlTG9jYXRpb247XG4gICAgbGV0IG91dFNoYXBlU3RyaWRlc0xvY2F0aW9uO1xuICAgIGlmIChwcm9ncmFtLmVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgICAgb3V0U2hhcGVMb2NhdGlvbiA9XG4gICAgICAgICAgICBncGdwdS5nZXRVbmlmb3JtTG9jYXRpb24od2ViR0xQcm9ncmFtLCAnb3V0U2hhcGUnLCBzaG91bGRUaHJvdyk7XG4gICAgICAgIG91dFNoYXBlU3RyaWRlc0xvY2F0aW9uID1cbiAgICAgICAgICAgIGdwZ3B1LmdldFVuaWZvcm1Mb2NhdGlvbih3ZWJHTFByb2dyYW0sICdvdXRTaGFwZVN0cmlkZXMnLCBzaG91bGRUaHJvdyk7XG4gICAgICAgIG91dFRleFNoYXBlTG9jYXRpb24gPVxuICAgICAgICAgICAgZ3BncHUuZ2V0VW5pZm9ybUxvY2F0aW9uKHdlYkdMUHJvZ3JhbSwgJ291dFRleFNoYXBlJywgc2hvdWxkVGhyb3cpO1xuICAgIH1cbiAgICBjb25zdCBjdXN0b21Vbmlmb3JtTG9jYXRpb25zID0gW107XG4gICAgaWYgKHByb2dyYW0uY3VzdG9tVW5pZm9ybXMpIHtcbiAgICAgICAgcHJvZ3JhbS5jdXN0b21Vbmlmb3Jtcy5mb3JFYWNoKChkLCBpKSA9PiB7XG4gICAgICAgICAgICBjdXN0b21Vbmlmb3JtTG9jYXRpb25zW2ldID1cbiAgICAgICAgICAgICAgICBncGdwdS5nZXRVbmlmb3JtTG9jYXRpb24od2ViR0xQcm9ncmFtLCBkLm5hbWUsIHNob3VsZFRocm93KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHByb2dyYW0sXG4gICAgICAgIHNvdXJjZSxcbiAgICAgICAgd2ViR0xQcm9ncmFtLFxuICAgICAgICB1bmlmb3JtTG9jYXRpb25zLFxuICAgICAgICBjdXN0b21Vbmlmb3JtTG9jYXRpb25zLFxuICAgICAgICBpblNoYXBlSW5mb3MsXG4gICAgICAgIG91dFNoYXBlSW5mbyxcbiAgICAgICAgaW5mTG9jLFxuICAgICAgICBuYW5Mb2MsXG4gICAgICAgIGluU2hhcGVzTG9jYXRpb25zLFxuICAgICAgICBpblRleFNoYXBlc0xvY2F0aW9ucyxcbiAgICAgICAgb3V0U2hhcGVMb2NhdGlvbixcbiAgICAgICAgb3V0U2hhcGVTdHJpZGVzTG9jYXRpb24sXG4gICAgICAgIG91dFRleFNoYXBlTG9jYXRpb25cbiAgICB9O1xufVxuZnVuY3Rpb24gdmFsaWRhdGVCaW5hcnlBbmRQcm9ncmFtKHNoYXBlSW5mb3MsIGlucHV0cykge1xuICAgIGlmIChzaGFwZUluZm9zLmxlbmd0aCAhPT0gaW5wdXRzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBFcnJvcihgQmluYXJ5IHdhcyBjb21waWxlZCB3aXRoICR7c2hhcGVJbmZvcy5sZW5ndGh9IGlucHV0cywgYnV0IGAgK1xuICAgICAgICAgICAgYHdhcyBleGVjdXRlZCB3aXRoICR7aW5wdXRzLmxlbmd0aH0gaW5wdXRzYCk7XG4gICAgfVxuICAgIHNoYXBlSW5mb3MuZm9yRWFjaCgocywgaSkgPT4ge1xuICAgICAgICBjb25zdCBzaGFwZUEgPSBzLmxvZ2ljYWxTaGFwZTtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBpbnB1dHNbaV07XG4gICAgICAgIGNvbnN0IHNoYXBlQiA9IGlucHV0LnNoYXBlO1xuICAgICAgICBpZiAoIXV0aWwuYXJyYXlzRXF1YWwoc2hhcGVBLCBzaGFwZUIpKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcihgQmluYXJ5IHdhcyBjb21waWxlZCB3aXRoIGRpZmZlcmVudCBzaGFwZXMgdGhhbiBgICtcbiAgICAgICAgICAgICAgICBgdGhlIGN1cnJlbnQgYXJncy4gU2hhcGVzICR7c2hhcGVBfSBhbmQgJHtzaGFwZUJ9IG11c3QgbWF0Y2hgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgaW5wdXQgaXMgdXBsb2FkZWQgYXMgdW5pZm9ybS5cbiAgICAgICAgaWYgKHMuaXNVbmlmb3JtICYmIGlucHV0LmlzVW5pZm9ybSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRleFNoYXBlQSA9IHMudGV4U2hhcGU7XG4gICAgICAgIGNvbnN0IHRleFNoYXBlQiA9IGlucHV0LmlzVW5pZm9ybSA/IG51bGwgOiBpbnB1dC50ZXhEYXRhLnRleFNoYXBlO1xuICAgICAgICBpZiAoIXV0aWwuYXJyYXlzRXF1YWwodGV4U2hhcGVBLCB0ZXhTaGFwZUIpKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcihgQmluYXJ5IHdhcyBjb21waWxlZCB3aXRoIGRpZmZlcmVudCB0ZXh0dXJlIHNoYXBlcyB0aGFuIHRoZWAgK1xuICAgICAgICAgICAgICAgIGAgY3VycmVudCBhcmdzLiBTaGFwZSAke3RleFNoYXBlQX0gYW5kICR7dGV4U2hhcGVCfSBtdXN0IG1hdGNoYCk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBydW5Qcm9ncmFtKGdwZ3B1LCBiaW5hcnksIGlucHV0cywgb3V0cHV0LCBjdXN0b21Vbmlmb3JtVmFsdWVzKSB7XG4gICAgaWYgKCFiaW5hcnkucHJvZ3JhbS5lbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICAgIHZhbGlkYXRlQmluYXJ5QW5kUHJvZ3JhbShiaW5hcnkuaW5TaGFwZUluZm9zLCBpbnB1dHMpO1xuICAgICAgICB2YWxpZGF0ZUJpbmFyeUFuZFByb2dyYW0oW2JpbmFyeS5vdXRTaGFwZUluZm9dLCBbb3V0cHV0XSk7XG4gICAgfVxuICAgIGNvbnN0IG91dFRleCA9IG91dHB1dC50ZXhEYXRhLnRleHR1cmU7XG4gICAgY29uc3Qgb3V0VGV4U2hhcGUgPSBvdXRwdXQudGV4RGF0YS50ZXhTaGFwZTtcbiAgICBpZiAob3V0cHV0LnRleERhdGEuaXNQYWNrZWQpIHtcbiAgICAgICAgZ3BncHUuc2V0T3V0cHV0UGFja2VkTWF0cml4VGV4dHVyZShvdXRUZXgsIG91dFRleFNoYXBlWzBdLCBvdXRUZXhTaGFwZVsxXSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBncGdwdS5zZXRPdXRwdXRNYXRyaXhUZXh0dXJlKG91dFRleCwgb3V0VGV4U2hhcGVbMF0sIG91dFRleFNoYXBlWzFdKTtcbiAgICB9XG4gICAgZ3BncHUuc2V0UHJvZ3JhbShiaW5hcnkud2ViR0xQcm9ncmFtKTtcbiAgICAvLyBTZXQgc3BlY2lhbCB1bmlmb3JtcyAoTkFOLCBJTkZJTklUWSlcbiAgICBpZiAoZW52KCkuZ2V0TnVtYmVyKCdXRUJHTF9WRVJTSU9OJykgPT09IDEpIHtcbiAgICAgICAgaWYgKGJpbmFyeS5pbmZMb2MgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGdwZ3B1LmdsLnVuaWZvcm0xZihiaW5hcnkuaW5mTG9jLCBJbmZpbml0eSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGJpbmFyeS5uYW5Mb2MgIT09IG51bGwpIHtcbiAgICAgICAgZ3BncHUuZ2wudW5pZm9ybTFmKGJpbmFyeS5uYW5Mb2MsIE5hTik7XG4gICAgfVxuICAgIC8vIFNldCB1c2VyLWRlZmluZWQgaW5wdXRzXG4gICAgaW5wdXRzLmZvckVhY2goKGlucHV0LCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhck5hbWUgPSBiaW5hcnkucHJvZ3JhbS52YXJpYWJsZU5hbWVzW2ldO1xuICAgICAgICBjb25zdCB2YXJMb2MgPSBiaW5hcnkudW5pZm9ybUxvY2F0aW9uc1t2YXJOYW1lXTtcbiAgICAgICAgY29uc3QgdmFyT2Zmc2V0TG9jID0gYmluYXJ5LnVuaWZvcm1Mb2NhdGlvbnNbYG9mZnNldCR7dmFyTmFtZX1gXTtcbiAgICAgICAgY29uc3QgdmFyU2hhcGVMb2MgPSBiaW5hcnkuaW5TaGFwZXNMb2NhdGlvbnNbYCR7dmFyTmFtZX1TaGFwZWBdO1xuICAgICAgICBjb25zdCB2YXJUZXhTaGFwZUxvYyA9IGJpbmFyeS5pblRleFNoYXBlc0xvY2F0aW9uc1tgJHt2YXJOYW1lfVRleFNoYXBlYF07XG4gICAgICAgIGlmICh2YXJTaGFwZUxvYykge1xuICAgICAgICAgICAgY29uc3QgeyB1bmlmb3JtU2hhcGUgfSA9IHNoYWRlcl9jb21waWxlci5nZXRVbmlmb3JtSW5mb0Zyb21TaGFwZShiaW5hcnkucHJvZ3JhbS5wYWNrZWRJbnB1dHMsIGlucHV0LnNoYXBlLCBpbnB1dC50ZXhEYXRhLnRleFNoYXBlKTtcbiAgICAgICAgICAgIHN3aXRjaCAodW5pZm9ybVNoYXBlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgZ3BncHUuZ2wudW5pZm9ybTFpdih2YXJTaGFwZUxvYywgbmV3IEludDMyQXJyYXkodW5pZm9ybVNoYXBlKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgZ3BncHUuZ2wudW5pZm9ybTJpdih2YXJTaGFwZUxvYywgbmV3IEludDMyQXJyYXkodW5pZm9ybVNoYXBlKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgZ3BncHUuZ2wudW5pZm9ybTNpdih2YXJTaGFwZUxvYywgbmV3IEludDMyQXJyYXkodW5pZm9ybVNoYXBlKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgZ3BncHUuZ2wudW5pZm9ybTRpdih2YXJTaGFwZUxvYywgbmV3IEludDMyQXJyYXkodW5pZm9ybVNoYXBlKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh2YXJUZXhTaGFwZUxvYykge1xuICAgICAgICAgICAgZ3BncHUuZ2wudW5pZm9ybTJpKHZhclRleFNoYXBlTG9jLCBpbnB1dC50ZXhEYXRhLnRleFNoYXBlWzBdLCBpbnB1dC50ZXhEYXRhLnRleFNoYXBlWzFdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFyTG9jID09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFRoZSBjb21waWxlciBpbmZlcnJlZCB0aGF0IHRoaXMgdmFyaWFibGUgaXMgbm90IHVzZWQgaW4gdGhpcyBzaGFkZXIuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlucHV0LmlzVW5pZm9ybSkge1xuICAgICAgICAgICAgLy8gVXBsb2FkIHRoZSB2YWx1ZXMgb2YgdGhlIHRlbnNvciBhcyB1bmlmb3JtLlxuICAgICAgICAgICAgaWYgKHV0aWwuc2l6ZUZyb21TaGFwZShpbnB1dC5zaGFwZSkgPCAyKSB7XG4gICAgICAgICAgICAgICAgZ3BncHUuZ2wudW5pZm9ybTFmKHZhckxvYywgaW5wdXQudW5pZm9ybVZhbHVlc1swXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgdmFscyA9IGlucHV0LnVuaWZvcm1WYWx1ZXM7XG4gICAgICAgICAgICAgICAgaWYgKCEodmFscyBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFscyA9IG5ldyBGbG9hdDMyQXJyYXkodmFscyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGdwZ3B1LmdsLnVuaWZvcm0xZnYodmFyTG9jLCB2YWxzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGUgaW5wdXQgd2FzIHNsaWNlZCwgdXBsb2FkIHRoZSBmbGF0IG9mZnNldCBpbmRleC5cbiAgICAgICAgaWYgKGlucHV0LnRleERhdGEuc2xpY2UgIT0gbnVsbCAmJiB2YXJPZmZzZXRMb2MgIT0gbnVsbCkge1xuICAgICAgICAgICAgZ3BncHUuZ2wudW5pZm9ybTFpKHZhck9mZnNldExvYywgaW5wdXQudGV4RGF0YS5zbGljZS5mbGF0T2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICBncGdwdS5zZXRJbnB1dE1hdHJpeFRleHR1cmUoaW5wdXQudGV4RGF0YS50ZXh0dXJlLCB2YXJMb2MsIGkpO1xuICAgIH0pO1xuICAgIGNvbnN0IG91dFNoYXBlTG9jID0gYmluYXJ5Lm91dFNoYXBlTG9jYXRpb247XG4gICAgaWYgKG91dFNoYXBlTG9jKSB7XG4gICAgICAgIHN3aXRjaCAob3V0cHV0LnNoYXBlLmxlbmd0aCkge1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIGdwZ3B1LmdsLnVuaWZvcm0xaXYob3V0U2hhcGVMb2MsIG5ldyBJbnQzMkFycmF5KG91dHB1dC5zaGFwZSkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIGdwZ3B1LmdsLnVuaWZvcm0yaXYob3V0U2hhcGVMb2MsIG5ldyBJbnQzMkFycmF5KG91dHB1dC5zaGFwZSkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgIGdwZ3B1LmdsLnVuaWZvcm0zaXYob3V0U2hhcGVMb2MsIG5ldyBJbnQzMkFycmF5KG91dHB1dC5zaGFwZSkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgIGdwZ3B1LmdsLnVuaWZvcm00aXYob3V0U2hhcGVMb2MsIG5ldyBJbnQzMkFycmF5KG91dHB1dC5zaGFwZSkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoYmluYXJ5Lm91dFNoYXBlU3RyaWRlc0xvY2F0aW9uKSB7XG4gICAgICAgIGNvbnN0IHN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKG91dHB1dC5zaGFwZSk7XG4gICAgICAgIHN3aXRjaCAob3V0cHV0LnNoYXBlLmxlbmd0aCkge1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIGdwZ3B1LmdsLnVuaWZvcm0xaXYoYmluYXJ5Lm91dFNoYXBlU3RyaWRlc0xvY2F0aW9uLCBuZXcgSW50MzJBcnJheShzdHJpZGVzKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgZ3BncHUuZ2wudW5pZm9ybTJpdihiaW5hcnkub3V0U2hhcGVTdHJpZGVzTG9jYXRpb24sIG5ldyBJbnQzMkFycmF5KHN0cmlkZXMpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICBncGdwdS5nbC51bmlmb3JtM2l2KGJpbmFyeS5vdXRTaGFwZVN0cmlkZXNMb2NhdGlvbiwgbmV3IEludDMyQXJyYXkoc3RyaWRlcykpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoYmluYXJ5Lm91dFRleFNoYXBlTG9jYXRpb24pIHtcbiAgICAgICAgZ3BncHUuZ2wudW5pZm9ybTJpKGJpbmFyeS5vdXRUZXhTaGFwZUxvY2F0aW9uLCBvdXRwdXQudGV4RGF0YS50ZXhTaGFwZVswXSwgb3V0cHV0LnRleERhdGEudGV4U2hhcGVbMV0pO1xuICAgIH1cbiAgICBpZiAoYmluYXJ5LnByb2dyYW0uY3VzdG9tVW5pZm9ybXMgJiYgY3VzdG9tVW5pZm9ybVZhbHVlcykge1xuICAgICAgICBiaW5hcnkucHJvZ3JhbS5jdXN0b21Vbmlmb3Jtcy5mb3JFYWNoKChkLCBpKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjdXN0b21Mb2MgPSBiaW5hcnkuY3VzdG9tVW5pZm9ybUxvY2F0aW9uc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGN1c3RvbVZhbHVlID0gY3VzdG9tVW5pZm9ybVZhbHVlc1tpXTtcbiAgICAgICAgICAgIGlmIChkLnR5cGUgPT09ICdmbG9hdCcpIHtcbiAgICAgICAgICAgICAgICBncGdwdS5nbC51bmlmb3JtMWZ2KGN1c3RvbUxvYywgY3VzdG9tVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZC50eXBlID09PSAndmVjMicpIHtcbiAgICAgICAgICAgICAgICBncGdwdS5nbC51bmlmb3JtMmZ2KGN1c3RvbUxvYywgY3VzdG9tVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZC50eXBlID09PSAndmVjMycpIHtcbiAgICAgICAgICAgICAgICBncGdwdS5nbC51bmlmb3JtM2Z2KGN1c3RvbUxvYywgY3VzdG9tVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZC50eXBlID09PSAndmVjNCcpIHtcbiAgICAgICAgICAgICAgICBncGdwdS5nbC51bmlmb3JtNGZ2KGN1c3RvbUxvYywgY3VzdG9tVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZC50eXBlID09PSAnaW50Jykge1xuICAgICAgICAgICAgICAgIGdwZ3B1LmdsLnVuaWZvcm0xaXYoY3VzdG9tTG9jLCBjdXN0b21WYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChkLnR5cGUgPT09ICdpdmVjMicpIHtcbiAgICAgICAgICAgICAgICBncGdwdS5nbC51bmlmb3JtMml2KGN1c3RvbUxvYywgY3VzdG9tVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZC50eXBlID09PSAnaXZlYzMnKSB7XG4gICAgICAgICAgICAgICAgZ3BncHUuZ2wudW5pZm9ybTNpdihjdXN0b21Mb2MsIGN1c3RvbVZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGQudHlwZSA9PT0gJ2l2ZWM0Jykge1xuICAgICAgICAgICAgICAgIGdwZ3B1LmdsLnVuaWZvcm00aXYoY3VzdG9tTG9jLCBjdXN0b21WYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgdW5pZm9ybSB0eXBlICR7ZC50eXBlfSBpcyBub3Qgc3VwcG9ydGVkIHlldC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdwZ3B1LmV4ZWN1dGVQcm9ncmFtKCk7XG59XG5leHBvcnQgZnVuY3Rpb24gbWFrZVNoYWRlcktleShwcm9ncmFtLCBpbnB1dHMsIG91dHB1dCkge1xuICAgIGxldCBrZXlJbnB1dHMgPSAnJztcbiAgICBpbnB1dHMuY29uY2F0KG91dHB1dCkuZm9yRWFjaCh4ID0+IHtcbiAgICAgICAgY29uc3QgaGFzT2Zmc2V0ID0geC50ZXhEYXRhICE9IG51bGwgJiYgeC50ZXhEYXRhLnNsaWNlICE9IG51bGwgJiZcbiAgICAgICAgICAgIHgudGV4RGF0YS5zbGljZS5mbGF0T2Zmc2V0ID4gMDtcbiAgICAgICAgLy8gVE9ETzogUmVtb3ZlIHRoZSBjb25kaXRpb24gb2YgIXguaXNVbmlmb3JtLlxuICAgICAgICBpZiAocHJvZ3JhbS5lbmFibGVTaGFwZVVuaWZvcm1zICYmICF4LmlzVW5pZm9ybSkge1xuICAgICAgICAgICAgY29uc3QgeFRleFNoYXBlID0geC50ZXhEYXRhLnRleFNoYXBlO1xuICAgICAgICAgICAgY29uc3QgeyB1c2VTcXVlZXplU2hhcGUsIHVuaWZvcm1TaGFwZSB9ID0gc2hhZGVyX2NvbXBpbGVyLmdldFVuaWZvcm1JbmZvRnJvbVNoYXBlKHByb2dyYW0ucGFja2VkSW5wdXRzLCB4LnNoYXBlLCB4VGV4U2hhcGUpO1xuICAgICAgICAgICAgbGV0IHJhbmsxID0gJycsIHJhbmsyID0gJycsIHJhbmszNCA9ICcnO1xuICAgICAgICAgICAgaWYgKHVuaWZvcm1TaGFwZS5sZW5ndGggPT09IDEgJiYgcHJvZ3JhbS5wYWNrZWRJbnB1dHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWNrZWRUZXhTaGFwZSA9IFtNYXRoLmNlaWwoeFRleFNoYXBlWzBdIC8gMiksIE1hdGguY2VpbCh4VGV4U2hhcGVbMV0gLyAyKV07XG4gICAgICAgICAgICAgICAgcmFuazEgPSBgJHtwYWNrZWRUZXhTaGFwZVswXSA+IDF9XyR7cGFja2VkVGV4U2hhcGVbMV0gPiAxfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh1bmlmb3JtU2hhcGUubGVuZ3RoID09PSAyICYmICFwcm9ncmFtLnBhY2tlZElucHV0cykge1xuICAgICAgICAgICAgICAgIHJhbmsyID0gYCR7dW5pZm9ybVNoYXBlWzBdID4gMX1fJHt1bmlmb3JtU2hhcGVbMV0gPiAxfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh1bmlmb3JtU2hhcGUubGVuZ3RoID4gMiAmJiAhcHJvZ3JhbS5wYWNrZWRJbnB1dHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyh1bmlmb3JtU2hhcGUpO1xuICAgICAgICAgICAgICAgIHJhbmszNCA9IGAke3N0cmlkZXNbMF0gPT09IHhUZXhTaGFwZVsxXX1fJHtzdHJpZGVzW3N0cmlkZXMubGVuZ3RoIC0gMV0gPT09IHhUZXhTaGFwZVsxXX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IGlzTG9naWNhbFNoYXBUZXhTaGFwZUVxdWFsID0geFJhbmsgPT09IDIgJiYgdXRpbC5hcnJheXNFcXVhbCh4LnNoYXBlLCB4VGV4U2hhcGUpO1xuICAgICAgICAgICAgY29uc3QgaXNTY2FsYXIgPSB1dGlsLnNpemVGcm9tU2hhcGUoeC5zaGFwZSkgPT09IDE7XG4gICAgICAgICAgICBjb25zdCBicm9hZGNhc3REaW1zID0gYmFja2VuZF91dGlsLmdldEJyb2FkY2FzdERpbXMoeC5zaGFwZSwgb3V0cHV0LnNoYXBlKTtcbiAgICAgICAgICAgIGNvbnN0IGlzSW5PdXRUZXhTaGFwZUVxdWFsID0gIXByb2dyYW0ucGFja2VkSW5wdXRzICYmXG4gICAgICAgICAgICAgICAgeFJhbmsgPT09IG91dHB1dC5zaGFwZS5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICB1dGlsLmFycmF5c0VxdWFsKHhUZXhTaGFwZSwgb3V0cHV0LnRleERhdGEudGV4U2hhcGUpO1xuICAgICAgICAgICAgY29uc3QgaXNUZXhTaGFwZUdyZWF0ZXJUaGFuT25lID0gcHJvZ3JhbS5wYWNrZWRJbnB1dHMgfHwgeFJhbmsgPiAyID9cbiAgICAgICAgICAgICAgICAnJyA6XG4gICAgICAgICAgICAgICAgYCR7eFRleFNoYXBlWzBdID4gMX1fJHt4VGV4U2hhcGVbMV0gPiAxfWA7XG4gICAgICAgICAgICAvLyBUaGVzZSBrZXkgY29tcG9uZW50cyBhcmUgbmVlZGVkIGR1ZSB0byBzaGFkZXJfY29tcGlsZXIgaXMgZW1iZWRkaW5nXG4gICAgICAgICAgICAvLyB0aGVtIGluIHRoZSBzaGFkZXIuXG4gICAgICAgICAgICAvLyB8eFJhbmt8IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBjb29yZHMgbGVuZ3RoLiBTZWVcbiAgICAgICAgICAgIC8vIGdldFtQYWNrZWRdU2FtcGxlckF0T3V0cHV0Q29vcmRzLlxuICAgICAgICAgICAgLy8gfGlzSW5PdXRUZXhTaGFwZUVxdWFsfCBpcyB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIGdvaW5nIHRvIGFuXG4gICAgICAgICAgICAvLyBvcHRpbWl6YXRpb24gcGF0aCBpbiBnZXRTYW1wbGVyQXRPdXRwdXRDb29yZHMuXG4gICAgICAgICAgICAvLyB8dXNlU3F1ZWV6ZVNoYXBlfCBpcyBleHRyYWN0ZWQgZnJvbSBzcXVlZXplSW5wdXRJbmZvIG9mXG4gICAgICAgICAgICAvLyBnZXRTYW1wbGVyWzJ8M3w0XUQvZ2V0UGFja2VkU2FtcGxlcjNELlxuICAgICAgICAgICAgLy8gfGlzU2NhbGFyfCBpcyBleHRyYWN0ZWQgZnJvbSBpc0lucHV0U2NhbGFyL2lzT3V0cHV0U2NhbGFyIGluXG4gICAgICAgICAgICAvLyBnZXRQYWNrZWRTYW1wbGVyQXRPdXRwdXRDb29yZHMuXG4gICAgICAgICAgICAvLyB8YnJvYWRjYXN0RGltc3wgaXMgZXh0cmFjdGVkIGZyb20gZ2V0W1BhY2tlZF1TYW1wbGVyQXRPdXRwdXRDb29yZHMuXG4gICAgICAgICAgICAvLyB8aXNMb2dpY2FsU2hhcFRleFNoYXBlRXF1YWx8IGlzIHVzZWQgaW5cbiAgICAgICAgICAgIC8vIGdldE91dHB1dFtQYWNrZWRdMkRDb29yZHMvZ2V0W1BhY2tlZF1TYW1wbGVyMkQuXG4gICAgICAgICAgICAvLyB8cmFuazF8IGlzIHVzZWQgaW4gZ2V0T3V0cHV0UGFja2VkMURDb29yZHMuXG4gICAgICAgICAgICAvLyB8cmFuazJ8IGlzIHVzZWQgaW4gZ2V0T3V0cHV0MkRDb29yZHMuXG4gICAgICAgICAgICAvLyB8cmFuazM0fCBpcyB1c2VkIGluIGdldFNhbXBsZXIzRC9nZXRTYW1wbGVyNEQuXG4gICAgICAgICAgICAvLyB8aXNUZXhTaGFwZUdyZWF0ZXJUaGFuT25lfCBhcmUgdXNlZCBpblxuICAgICAgICAgICAgLy8gZ2V0U2FtcGxlcltTY2FsYXJ8MUR8MkRdL2dldE91dHB1dDFEQ29vcmRzLlxuICAgICAgICAgICAga2V5SW5wdXRzICs9IGAke3hSYW5rfV8ke2lzSW5PdXRUZXhTaGFwZUVxdWFsfV8ke3VzZVNxdWVlemVTaGFwZX1fJHt1bmlmb3JtU2hhcGUubGVuZ3RofV8ke2lzU2NhbGFyfV8ke2Jyb2FkY2FzdERpbXN9XyR7aXNMb2dpY2FsU2hhcFRleFNoYXBlRXF1YWx9XyR7cmFuazF9XyR7cmFuazJ9XyR7cmFuazM0fV8ke2lzVGV4U2hhcGVHcmVhdGVyVGhhbk9uZX1fJHtoYXNPZmZzZXR9YDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHRleFNoYXBlID0geC5pc1VuaWZvcm0gPyAndW5pZm9ybScgOiB4LnRleERhdGEudGV4U2hhcGU7XG4gICAgICAgICAgICBrZXlJbnB1dHMgKz0gYCR7eC5zaGFwZX1fJHt0ZXhTaGFwZX1fJHtoYXNPZmZzZXR9YDtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGtleVVzZXJDb2RlID0gcHJvZ3JhbS51c2VyQ29kZTtcbiAgICBsZXQga2V5ID0gcHJvZ3JhbS5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgIC8vIEZhc3Qgc3RyaW5nIGNvbmNhdC4gU2VlIGh0dHBzOi8vanNwZXJmLmNvbS9zdHJpbmctY29uY2F0ZW5hdGlvbi8xNC5cbiAgICBrZXkgKz0gJ18nICsga2V5SW5wdXRzICsgJ18nICsga2V5VXNlckNvZGUgK1xuICAgICAgICBgJHtlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX1ZFUlNJT04nKX1gO1xuICAgIHJldHVybiBrZXk7XG59XG5leHBvcnQgZnVuY3Rpb24gdXNlU2hhcGVVbmlmb3JtcyhyYW5rKSB7XG4gICAgLy8gVE9ETzogUmVtb3ZlIHRoZSBsaW1pdGFpb24gb2YgcmFuayA8PSA0LlxuICAgIHJldHVybiBlbnYoKS5nZXRCb29sKCdXRUJHTF9VU0VfU0hBUEVTX1VOSUZPUk1TJykgJiYgcmFuayA8PSA0O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z3BncHVfbWF0aC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBnZXRHbHNsRGlmZmVyZW5jZXMgfSBmcm9tICcuL2dsc2xfdmVyc2lvbic7XG5pbXBvcnQgKiBhcyB0ZXhfdXRpbCBmcm9tICcuL3RleF91dGlsJztcbmltcG9ydCAqIGFzIHdlYmdsX3V0aWwgZnJvbSAnLi93ZWJnbF91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVWZXJ0ZXhTaGFkZXIoZ2wpIHtcbiAgICBjb25zdCBnbHNsID0gZ2V0R2xzbERpZmZlcmVuY2VzKCk7XG4gICAgY29uc3QgdmVydGV4U2hhZGVyU291cmNlID0gYCR7Z2xzbC52ZXJzaW9ufVxuICAgIHByZWNpc2lvbiBoaWdocCBmbG9hdDtcbiAgICAke2dsc2wuYXR0cmlidXRlfSB2ZWMzIGNsaXBTcGFjZVBvcztcbiAgICAke2dsc2wuYXR0cmlidXRlfSB2ZWMyIHV2O1xuICAgICR7Z2xzbC52YXJ5aW5nVnN9IHZlYzIgcmVzdWx0VVY7XG5cbiAgICB2b2lkIG1haW4oKSB7XG4gICAgICBnbF9Qb3NpdGlvbiA9IHZlYzQoY2xpcFNwYWNlUG9zLCAxKTtcbiAgICAgIHJlc3VsdFVWID0gdXY7XG4gICAgfWA7XG4gICAgcmV0dXJuIHdlYmdsX3V0aWwuY3JlYXRlVmVydGV4U2hhZGVyKGdsLCB2ZXJ0ZXhTaGFkZXJTb3VyY2UpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVZlcnRleEJ1ZmZlcihnbCkge1xuICAgIC8vIFt4IHkgeiB1IHZdICogW3VwcGVyLWxlZnQsIGxvd2VyLWxlZnQsIHVwcGVyLXJpZ2h0LCBsb3dlci1yaWdodF1cbiAgICBjb25zdCB2ZXJ0ZXhBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoWy0xLCAxLCAwLCAwLCAxLCAtMSwgLTEsIDAsIDAsIDAsIDEsIDEsIDAsIDEsIDEsIDEsIC0xLCAwLCAxLCAwXSk7XG4gICAgcmV0dXJuIHdlYmdsX3V0aWwuY3JlYXRlU3RhdGljVmVydGV4QnVmZmVyKGdsLCB2ZXJ0ZXhBcnJheSk7XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSW5kZXhCdWZmZXIoZ2wpIHtcbiAgICAvLyBPcGVuR0wgKGFuZCBXZWJHTCkgaGF2ZSBcIkNDVyA9PSBmcm9udFwiIHdpbmRpbmdcbiAgICBjb25zdCB0cmlhbmdsZVZlcnRleEluZGljZXMgPSBuZXcgVWludDE2QXJyYXkoWzAsIDEsIDIsIDIsIDEsIDNdKTtcbiAgICByZXR1cm4gd2ViZ2xfdXRpbC5jcmVhdGVTdGF0aWNJbmRleEJ1ZmZlcihnbCwgdHJpYW5nbGVWZXJ0ZXhJbmRpY2VzKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUFuZENvbmZpZ3VyZVRleHR1cmUoZ2wsIHdpZHRoLCBoZWlnaHQsIGludGVybmFsRm9ybWF0LCB0ZXh0dXJlRm9ybWF0LCB0ZXh0dXJlVHlwZSkge1xuICAgIHdlYmdsX3V0aWwudmFsaWRhdGVUZXh0dXJlU2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICBjb25zdCB0ZXh0dXJlID0gd2ViZ2xfdXRpbC5jcmVhdGVUZXh0dXJlKGdsKTtcbiAgICBjb25zdCB0ZXgyZCA9IGdsLlRFWFRVUkVfMkQ7XG4gICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJpbmRUZXh0dXJlKHRleDJkLCB0ZXh0dXJlKSk7XG4gICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLnRleFBhcmFtZXRlcmkodGV4MmQsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5DTEFNUF9UT19FREdFKSk7XG4gICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLnRleFBhcmFtZXRlcmkodGV4MmQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKSk7XG4gICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLnRleFBhcmFtZXRlcmkodGV4MmQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTkVBUkVTVCkpO1xuICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC50ZXhQYXJhbWV0ZXJpKHRleDJkLCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLk5FQVJFU1QpKTtcbiAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wudGV4SW1hZ2UyRCh0ZXgyZCwgMCwgaW50ZXJuYWxGb3JtYXQsIHdpZHRoLCBoZWlnaHQsIDAsIHRleHR1cmVGb3JtYXQsIHRleHR1cmVUeXBlLCBudWxsKSk7XG4gICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIG51bGwpKTtcbiAgICByZXR1cm4gdGV4dHVyZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnRlcm5hbEZvcm1hdEZvckZsb2F0MzJNYXRyaXhUZXh0dXJlKHRleHR1cmVDb25maWcpIHtcbiAgICByZXR1cm4gdGV4dHVyZUNvbmZpZy5pbnRlcm5hbEZvcm1hdEZsb2F0O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZsb2F0MzJNYXRyaXhUZXh0dXJlKGdsLCByb3dzLCBjb2x1bW5zLCB0ZXh0dXJlQ29uZmlnKSB7XG4gICAgY29uc3QgW3dpZHRoLCBoZWlnaHRdID0gdGV4X3V0aWwuZ2V0VW5wYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodChyb3dzLCBjb2x1bW5zKTtcbiAgICByZXR1cm4gY3JlYXRlQW5kQ29uZmlndXJlVGV4dHVyZShnbCwgd2lkdGgsIGhlaWdodCwgZ2V0SW50ZXJuYWxGb3JtYXRGb3JGbG9hdDMyTWF0cml4VGV4dHVyZSh0ZXh0dXJlQ29uZmlnKSwgdGV4dHVyZUNvbmZpZy50ZXh0dXJlRm9ybWF0RmxvYXQsIGdsLkZMT0FUKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnRlcm5hbEZvcm1hdEZvckZsb2F0MTZNYXRyaXhUZXh0dXJlKHRleHR1cmVDb25maWcpIHtcbiAgICByZXR1cm4gdGV4dHVyZUNvbmZpZy5pbnRlcm5hbEZvcm1hdEhhbGZGbG9hdDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGbG9hdDE2TWF0cml4VGV4dHVyZShnbCwgcm93cywgY29sdW1ucywgdGV4dHVyZUNvbmZpZykge1xuICAgIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IHRleF91dGlsLmdldFVucGFja2VkTWF0cml4VGV4dHVyZVNoYXBlV2lkdGhIZWlnaHQocm93cywgY29sdW1ucyk7XG4gICAgcmV0dXJuIGNyZWF0ZUFuZENvbmZpZ3VyZVRleHR1cmUoZ2wsIHdpZHRoLCBoZWlnaHQsIGdldEludGVybmFsRm9ybWF0Rm9yRmxvYXQxNk1hdHJpeFRleHR1cmUodGV4dHVyZUNvbmZpZyksIHRleHR1cmVDb25maWcudGV4dHVyZUZvcm1hdEZsb2F0LCB0ZXh0dXJlQ29uZmlnLnRleHR1cmVUeXBlSGFsZkZsb2F0KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnRlcm5hbEZvcm1hdEZvclVuc2lnbmVkQnl0ZXNNYXRyaXhUZXh0dXJlKHRleHR1cmVDb25maWcpIHtcbiAgICByZXR1cm4gdGV4dHVyZUNvbmZpZy5kb3dubG9hZFRleHR1cmVGb3JtYXQ7XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVW5zaWduZWRCeXRlc01hdHJpeFRleHR1cmUoZ2wsIHJvd3MsIGNvbHVtbnMsIHRleHR1cmVDb25maWcpIHtcbiAgICBjb25zdCBbd2lkdGgsIGhlaWdodF0gPSB0ZXhfdXRpbC5nZXRVbnBhY2tlZE1hdHJpeFRleHR1cmVTaGFwZVdpZHRoSGVpZ2h0KHJvd3MsIGNvbHVtbnMpO1xuICAgIHJldHVybiBjcmVhdGVBbmRDb25maWd1cmVUZXh0dXJlKGdsLCB3aWR0aCwgaGVpZ2h0LCBnZXRJbnRlcm5hbEZvcm1hdEZvclVuc2lnbmVkQnl0ZXNNYXRyaXhUZXh0dXJlKHRleHR1cmVDb25maWcpLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnRlcm5hbEZvcm1hdEZvclBhY2tlZE1hdHJpeFRleHR1cmUodGV4dHVyZUNvbmZpZykge1xuICAgIHJldHVybiB0ZXh0dXJlQ29uZmlnLmludGVybmFsRm9ybWF0UGFja2VkRmxvYXQ7XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUGFja2VkTWF0cml4VGV4dHVyZShnbCwgcm93cywgY29sdW1ucywgdGV4dHVyZUNvbmZpZykge1xuICAgIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IHRleF91dGlsLmdldFBhY2tlZE1hdHJpeFRleHR1cmVTaGFwZVdpZHRoSGVpZ2h0KHJvd3MsIGNvbHVtbnMpO1xuICAgIHJldHVybiBjcmVhdGVBbmRDb25maWd1cmVUZXh0dXJlKGdsLCB3aWR0aCwgaGVpZ2h0LCBnZXRJbnRlcm5hbEZvcm1hdEZvclBhY2tlZE1hdHJpeFRleHR1cmUodGV4dHVyZUNvbmZpZyksIGdsLlJHQkEsIGdsLkZMT0FUKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnRlcm5hbEZvcm1hdEZvckZsb2F0MTZQYWNrZWRNYXRyaXhUZXh0dXJlKHRleHR1cmVDb25maWcpIHtcbiAgICByZXR1cm4gdGV4dHVyZUNvbmZpZy5pbnRlcm5hbEZvcm1hdFBhY2tlZEhhbGZGbG9hdDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGbG9hdDE2UGFja2VkTWF0cml4VGV4dHVyZShnbCwgcm93cywgY29sdW1ucywgdGV4dHVyZUNvbmZpZykge1xuICAgIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IHRleF91dGlsLmdldFBhY2tlZE1hdHJpeFRleHR1cmVTaGFwZVdpZHRoSGVpZ2h0KHJvd3MsIGNvbHVtbnMpO1xuICAgIHJldHVybiBjcmVhdGVBbmRDb25maWd1cmVUZXh0dXJlKGdsLCB3aWR0aCwgaGVpZ2h0LCBnZXRJbnRlcm5hbEZvcm1hdEZvckZsb2F0MTZQYWNrZWRNYXRyaXhUZXh0dXJlKHRleHR1cmVDb25maWcpLCBnbC5SR0JBLCB0ZXh0dXJlQ29uZmlnLnRleHR1cmVUeXBlSGFsZkZsb2F0KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBiaW5kVmVydGV4UHJvZ3JhbUF0dHJpYnV0ZVN0cmVhbXMoZ2wsIHByb2dyYW0sIHZlcnRleEJ1ZmZlcikge1xuICAgIGNvbnN0IHBvc09mZnNldCA9IDA7IC8vIHggaXMgdGhlIGZpcnN0IGJ1ZmZlciBlbGVtZW50XG4gICAgY29uc3QgdXZPZmZzZXQgPSAzICogNDsgLy8gdXYgY29tZXMgYWZ0ZXIgW3ggeSB6XVxuICAgIGNvbnN0IHN0cmlkZSA9ICgzICogNCkgKyAoMiAqIDQpOyAvLyB4eXogKyB1diwgZWFjaCBlbnRyeSBpcyA0LWJ5dGUgZmxvYXQuXG4gICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCB2ZXJ0ZXhCdWZmZXIpKTtcbiAgICBjb25zdCBzdWNjZXNzID0gd2ViZ2xfdXRpbC5iaW5kVmVydGV4QnVmZmVyVG9Qcm9ncmFtQXR0cmlidXRlKGdsLCBwcm9ncmFtLCAnY2xpcFNwYWNlUG9zJywgdmVydGV4QnVmZmVyLCAzLCBzdHJpZGUsIHBvc09mZnNldCk7XG4gICAgcmV0dXJuIHN1Y2Nlc3MgJiZcbiAgICAgICAgd2ViZ2xfdXRpbC5iaW5kVmVydGV4QnVmZmVyVG9Qcm9ncmFtQXR0cmlidXRlKGdsLCBwcm9ncmFtLCAndXYnLCB2ZXJ0ZXhCdWZmZXIsIDIsIHN0cmlkZSwgdXZPZmZzZXQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVwbG9hZERlbnNlTWF0cml4VG9UZXh0dXJlKGdsLCB0ZXh0dXJlLCB3aWR0aCwgaGVpZ2h0LCBkYXRhLCB0ZXh0dXJlQ29uZmlnKSB7XG4gICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRleHR1cmUpKTtcbiAgICBsZXQgZGF0YUZvclVwbG9hZCwgdGV4ZWxEYXRhVHlwZSwgaW50ZXJuYWxGb3JtYXQ7XG4gICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgICAgIGRhdGFGb3JVcGxvYWQgPSBuZXcgVWludDhBcnJheSh3aWR0aCAqIGhlaWdodCAqIDQpO1xuICAgICAgICB0ZXhlbERhdGFUeXBlID0gZ2wuVU5TSUdORURfQllURTtcbiAgICAgICAgaW50ZXJuYWxGb3JtYXQgPSBnbC5SR0JBO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZGF0YUZvclVwbG9hZCA9IG5ldyBGbG9hdDMyQXJyYXkod2lkdGggKiBoZWlnaHQgKiA0KTtcbiAgICAgICAgdGV4ZWxEYXRhVHlwZSA9IGdsLkZMT0FUO1xuICAgICAgICBpbnRlcm5hbEZvcm1hdCA9IHRleHR1cmVDb25maWcuaW50ZXJuYWxGb3JtYXRQYWNrZWRGbG9hdDtcbiAgICB9XG4gICAgZGF0YUZvclVwbG9hZC5zZXQoZGF0YSk7XG4gICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgaW50ZXJuYWxGb3JtYXQsIHdpZHRoLCBoZWlnaHQsIDAsIGdsLlJHQkEsIHRleGVsRGF0YVR5cGUsIGRhdGFGb3JVcGxvYWQpKTtcbiAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgbnVsbCkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVwbG9hZFBpeGVsRGF0YVRvVGV4dHVyZShnbCwgdGV4dHVyZSwgcGl4ZWxzKSB7XG4gICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRleHR1cmUpKTtcbiAgICBpZiAocGl4ZWxzLmRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC50ZXhJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIGdsLlJHQkEsIHBpeGVscy53aWR0aCwgcGl4ZWxzLmhlaWdodCwgMCwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgcGl4ZWxzLmRhdGEpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC50ZXhJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIGdsLlJHQkEsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIHBpeGVscykpO1xuICAgIH1cbiAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgbnVsbCkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlckZyb21PdXRwdXRUZXh0dXJlKGdsMiwgcm93cywgY29sdW1ucywgdGV4dHVyZUNvbmZpZykge1xuICAgIC8vIENyZWF0ZSBhbmQgYmluZCB0aGUgYnVmZmVyLlxuICAgIGNvbnN0IGJ1ZmZlciA9IGdsMi5jcmVhdGVCdWZmZXIoKTtcbiAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhnbDIsICgpID0+IGdsMi5iaW5kQnVmZmVyKGdsMi5QSVhFTF9QQUNLX0JVRkZFUiwgYnVmZmVyKSk7XG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgYnVmZmVyIHRvIHRoZSBzaXplIG9mIHRoZSB0ZXh0dXJlIGluIGJ5dGVzLlxuICAgIGNvbnN0IGJ5dGVzUGVyRmxvYXQgPSA0O1xuICAgIGNvbnN0IHZhbHVlc1BlclRleGVsID0gNDtcbiAgICBjb25zdCBidWZmZXJTaXplQnl0ZXMgPSBieXRlc1BlckZsb2F0ICogdmFsdWVzUGVyVGV4ZWwgKiByb3dzICogY29sdW1ucztcbiAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhnbDIsICgpID0+IGdsMi5idWZmZXJEYXRhKGdsMi5QSVhFTF9QQUNLX0JVRkZFUiwgYnVmZmVyU2l6ZUJ5dGVzLCBnbDIuU1RSRUFNX1JFQUQpKTtcbiAgICAvLyBFbnF1ZXVlIGEgY29tbWFuZCBvbiB0aGUgR1BVIGNvbW1hbmQgcXVldWUgdG8gY29weSBvZiB0ZXh0dXJlIGludG8gdGhlXG4gICAgLy8gYnVmZmVyLlxuICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKGdsMiwgKCkgPT4gZ2wyLnJlYWRQaXhlbHMoMCwgMCwgY29sdW1ucywgcm93cywgZ2wyLlJHQkEsIGdsMi5GTE9BVCwgMCkpO1xuICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKGdsMiwgKCkgPT4gZ2wyLmJpbmRCdWZmZXIoZ2wyLlBJWEVMX1BBQ0tfQlVGRkVSLCBudWxsKSk7XG4gICAgcmV0dXJuIGJ1ZmZlcjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkb3dubG9hZEZsb2F0MzJNYXRyaXhGcm9tQnVmZmVyKGdsLCBidWZmZXIsIHNpemUpIHtcbiAgICBjb25zdCBnbDIgPSBnbDtcbiAgICBjb25zdCBkb3dubG9hZFRhcmdldCA9IG5ldyBGbG9hdDMyQXJyYXkoc2l6ZSk7XG4gICAgZ2wyLmJpbmRCdWZmZXIoZ2wyLlBJWEVMX1BBQ0tfQlVGRkVSLCBidWZmZXIpO1xuICAgIGdsMi5nZXRCdWZmZXJTdWJEYXRhKGdsMi5QSVhFTF9QQUNLX0JVRkZFUiwgMCwgZG93bmxvYWRUYXJnZXQpO1xuICAgIGdsMi5iaW5kQnVmZmVyKGdsMi5QSVhFTF9QQUNLX0JVRkZFUiwgbnVsbCk7XG4gICAgcmV0dXJuIGRvd25sb2FkVGFyZ2V0O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRvd25sb2FkQnl0ZUVuY29kZWRGbG9hdE1hdHJpeEZyb21PdXRwdXRUZXh0dXJlKGdsLCByb3dzLCBjb2x1bW5zLCB0ZXh0dXJlQ29uZmlnKSB7XG4gICAgY29uc3QgW3csIGhdID0gdGV4X3V0aWwuZ2V0VW5wYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodChyb3dzLCBjb2x1bW5zKTtcbiAgICBjb25zdCBudW1DaGFubmVscyA9IDQ7XG4gICAgY29uc3QgZG93bmxvYWRUYXJnZXQgPSBuZXcgVWludDhBcnJheSh0ZXhfdXRpbC5nZXRVbnBhY2tlZEFycmF5U2l6ZUZyb21NYXRyaXhTaXplKHJvd3MgKiBjb2x1bW5zLCBudW1DaGFubmVscykpO1xuICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5yZWFkUGl4ZWxzKDAsIDAsIHcsIGgsIHRleHR1cmVDb25maWcuZG93bmxvYWRUZXh0dXJlRm9ybWF0LCBnbC5VTlNJR05FRF9CWVRFLCBkb3dubG9hZFRhcmdldCkpO1xuICAgIC8vIEJ5IHdyYXBwaW5nIHRoZSBidWZmZXIgaW4gYSBGbG9hdDMyQXJyYXksIHdlIHVzZSBuYXRpdmUgYnJvd3NlciBJRUVFIDc1NFxuICAgIC8vIGRlY29kaW5nIG9mIHRoZSA0IGJ5dGVzIHRoYXQgYmFjayBlYWNoIDMyIGJpdCBmbG9hdC5cbiAgICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheShkb3dubG9hZFRhcmdldC5idWZmZXIpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRvd25sb2FkUGFja2VkTWF0cml4RnJvbUJ1ZmZlcihnbCwgYnVmZmVyLCBiYXRjaCwgcm93cywgY29scywgcGh5c2ljYWxSb3dzLCBwaHlzaWNhbENvbHMsIHRleHR1cmVDb25maWcpIHtcbiAgICBjb25zdCBnbDIgPSBnbDtcbiAgICBjb25zdCBkb3dubG9hZFRhcmdldCA9IG5ldyBGbG9hdDMyQXJyYXkodGV4X3V0aWwuZ2V0UGFja2VkUkdCQUFycmF5U2l6ZUZyb21NYXRyaXhTaGFwZShwaHlzaWNhbFJvd3MsIHBoeXNpY2FsQ29scykpO1xuICAgIGdsMi5iaW5kQnVmZmVyKGdsMi5QSVhFTF9QQUNLX0JVRkZFUiwgYnVmZmVyKTtcbiAgICBnbDIuZ2V0QnVmZmVyU3ViRGF0YShnbDIuUElYRUxfUEFDS19CVUZGRVIsIDAsIGRvd25sb2FkVGFyZ2V0KTtcbiAgICBnbDIuYmluZEJ1ZmZlcihnbDIuUElYRUxfUEFDS19CVUZGRVIsIG51bGwpO1xuICAgIHJldHVybiBkb3dubG9hZFRhcmdldDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkb3dubG9hZE1hdHJpeEZyb21QYWNrZWRPdXRwdXRUZXh0dXJlKGdsLCBwaHlzaWNhbFJvd3MsIHBoeXNpY2FsQ29scykge1xuICAgIGNvbnN0IHBhY2tlZFJHQkEgPSBuZXcgRmxvYXQzMkFycmF5KHBoeXNpY2FsUm93cyAqIHBoeXNpY2FsQ29scyAqIDQpO1xuICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5yZWFkUGl4ZWxzKDAsIDAsIHBoeXNpY2FsQ29scywgcGh5c2ljYWxSb3dzLCBnbC5SR0JBLCBnbC5GTE9BVCwgcGFja2VkUkdCQSkpO1xuICAgIHJldHVybiBwYWNrZWRSR0JBO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z3BncHVfdXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBnZXRHbHNsRGlmZmVyZW5jZXMgfSBmcm9tICcuL2dsc2xfdmVyc2lvbic7XG5leHBvcnQgY2xhc3MgSW0yQ29sUGFja2VkUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3Iob3V0cHV0U2hhcGUsIGlucHV0U2hhcGUsIGNvbnZJbmZvKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICAgICAgICB0aGlzLnBhY2tlZElucHV0cyA9IHRydWU7XG4gICAgICAgIHRoaXMucGFja2VkT3V0cHV0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IG91dHB1dFNoYXBlO1xuICAgICAgICBjb25zdCB7IGZpbHRlcldpZHRoLCBpbkNoYW5uZWxzLCBzdHJpZGVXaWR0aCwgc3RyaWRlSGVpZ2h0LCBwYWRJbmZvLCBvdXRXaWR0aCwgZGlsYXRpb25XaWR0aCwgZGlsYXRpb25IZWlnaHQsIGRhdGFGb3JtYXQgfSA9IGNvbnZJbmZvO1xuICAgICAgICBjb25zdCB7IGxlZnQsIHRvcCB9ID0gcGFkSW5mbztcbiAgICAgICAgY29uc3QgaXRlbXNQZXJCbG9ja1JvdyA9IGluQ2hhbm5lbHMgKiBmaWx0ZXJXaWR0aDtcbiAgICAgICAgY29uc3QgZ2xzbCA9IGdldEdsc2xEaWZmZXJlbmNlcygpO1xuICAgICAgICBjb25zdCBpc0NoYW5uZWxzTGFzdCA9IGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnO1xuICAgICAgICBjb25zdCByb3dEaW0gPSBpc0NoYW5uZWxzTGFzdCA/IDAgOiAxO1xuICAgICAgICBjb25zdCBjb2xEaW0gPSBpc0NoYW5uZWxzTGFzdCA/IDEgOiAyO1xuICAgICAgICBsZXQgdW5yb2xsZWQgPSBgYDtcbiAgICAgICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDw9IDE7IHJvdysrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPD0gMTsgY29sKyspIHtcbiAgICAgICAgICAgICAgICB1bnJvbGxlZCArPSBgXG4gICAgICAgICAgYmxvY2tJbmRleCA9IHJjLnkgKyAke2NvbH07XG4gICAgICAgICAgcG9zID0gcmMueCArICR7cm93fTtcblxuICAgICAgICAgIGlmKGJsb2NrSW5kZXggPCAke291dHB1dFNoYXBlWzFdfSAmJiBwb3MgPCAke291dHB1dFNoYXBlWzBdfSkge1xuICAgICAgICAgICAgb2Zmc2V0WSA9IGludChibG9ja0luZGV4IC8gKCR7b3V0V2lkdGh9KSkgKiAke3N0cmlkZUhlaWdodH0gLSAke3RvcH07XG4gICAgICAgICAgICBkMCA9IG9mZnNldFkgKyAke2RpbGF0aW9uSGVpZ2h0fSAqIChwb3MgLyAke2l0ZW1zUGVyQmxvY2tSb3d9KTtcblxuICAgICAgICAgICAgaWYoZDAgPCAke2lucHV0U2hhcGVbcm93RGltXX0gJiYgZDAgPj0gMCkge1xuXG4gICAgICAgICAgICAgIG9mZnNldFggPSBpbnQobW9kKGZsb2F0KGJsb2NrSW5kZXgpLCAke291dFdpZHRofS4pICogJHtzdHJpZGVXaWR0aH0uIC0gJHtsZWZ0fS4pO1xuICAgICAgICAgICAgICBkMSA9IG9mZnNldFggKyAke2RpbGF0aW9uV2lkdGh9ICogKGludChtb2QoZmxvYXQocG9zKSwgJHtpdGVtc1BlckJsb2NrUm93fS4pIC8gJHtpbkNoYW5uZWxzfS4pKTtcblxuICAgICAgICAgICAgICBpZihkMSA8ICR7aW5wdXRTaGFwZVtjb2xEaW1dfSAmJiBkMSA+PSAwKSB7XG5cbiAgICAgICAgICAgICAgICBjaCA9IGludChtb2QoZmxvYXQocG9zKSwgJHtpbkNoYW5uZWxzfS4pKTtcblxuICAgICAgICAgICAgICAgIGlmICgke2lzQ2hhbm5lbHNMYXN0fSkge1xuICAgICAgICAgICAgICAgICAgaW5uZXJEaW1zID0gdmVjMihkMSwgY2gpO1xuICAgICAgICAgICAgICAgICAgcmVzdWx0WyR7cm93ICogMiArIGNvbH1dID0gZ2V0Q2hhbm5lbChcbiAgICAgICAgICAgICAgICAgICAgZ2V0QShkMCwgaW50KGlubmVyRGltcy54KSxcbiAgICAgICAgICAgICAgICAgICAgaW50KGlubmVyRGltcy55KSksIGlubmVyRGltcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGlubmVyRGltcyA9IHZlYzIoZDAsIGQxKTtcbiAgICAgICAgICAgICAgICAgIHJlc3VsdFske3JvdyAqIDIgKyBjb2x9XSA9IGdldENoYW5uZWwoXG4gICAgICAgICAgICAgICAgICAgIGdldEEoY2gsIGludChpbm5lckRpbXMueCksXG4gICAgICAgICAgICAgICAgICAgIGludChpbm5lckRpbXMueSkpLCBpbm5lckRpbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMiByYyA9IGdldE91dHB1dENvb3JkcygpO1xuXG4gICAgICAgIHZlYzQgcmVzdWx0ID0gdmVjNCgwKTtcblxuICAgICAgICBpbnQgYmxvY2tJbmRleCwgcG9zLCBvZmZzZXRZLCBkMCwgb2Zmc2V0WCwgZDEsIGNoO1xuICAgICAgICB2ZWMyIGlubmVyRGltcztcblxuICAgICAgICAke3Vucm9sbGVkfVxuXG4gICAgICAgICR7Z2xzbC5vdXRwdXR9ID0gcmVzdWx0O1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW0yY29sX3BhY2tlZF9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLy8gQWxsIGV4cG9ydHMgZnJvbSB0aGlzIHBhY2thZ2Ugc2hvdWxkIGJlIGluIGJhc2UuXG5leHBvcnQgKiBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0ICcuL3JlZ2lzdGVyX2FsbF9rZXJuZWxzJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgZW52LCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IEFyZ01pbk1heFByb2dyYW0gfSBmcm9tICcuLi9hcmdtaW5tYXhfZ3B1JztcbmltcG9ydCB7IEFyZ01pbk1heFBhY2tlZFByb2dyYW0gfSBmcm9tICcuLi9hcmdtaW5tYXhfcGFja2VkX2dwdSc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi4va2VybmVscy9SZXNoYXBlJztcbmZ1bmN0aW9uIGFyZ1JlZHVjZShiYWNrZW5kLCB4LCByZWR1Y2VUeXBlLCBiZXN0SW5kaWNlc0EgPSBudWxsKSB7XG4gICAgbGV0IGJhdGNoU2l6ZSA9IHguc2hhcGVbMF07XG4gICAgbGV0IGluU2l6ZSA9IHguc2hhcGVbMV07XG4gICAgaWYgKGJlc3RJbmRpY2VzQSAhPSBudWxsKSB7XG4gICAgICAgIGJhdGNoU2l6ZSA9IGJlc3RJbmRpY2VzQS5zaGFwZVswXTtcbiAgICAgICAgaW5TaXplID0gYmVzdEluZGljZXNBLnNoYXBlWzFdO1xuICAgIH1cbiAgICBjb25zdCB3aW5kb3dTaXplID0gYmFja2VuZF91dGlsLmNvbXB1dGVPcHRpbWFsV2luZG93U2l6ZShpblNpemUpO1xuICAgIGNvbnN0IHJlZHVjZUluZm8gPSB7IHdpbmRvd1NpemUsIGluU2l6ZSwgYmF0Y2hTaXplLCBvdXRTaXplOiBNYXRoLmNlaWwoaW5TaXplIC8gd2luZG93U2l6ZSkgfTtcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IEFyZ01pbk1heFByb2dyYW0ocmVkdWNlSW5mbywgcmVkdWNlVHlwZSwgYmVzdEluZGljZXNBID09IG51bGwpO1xuICAgIGNvbnN0IGlucHV0cyA9IFt4XTtcbiAgICBpZiAoYmVzdEluZGljZXNBICE9IG51bGwpIHtcbiAgICAgICAgaW5wdXRzLnB1c2goYmVzdEluZGljZXNBKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0cHV0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgaW5wdXRzLCAnaW50MzInKTtcbiAgICAvLyBObyBuZWVkIHRvIHJ1biBhbm90aGVyIEdQR1BVIHByb2dyYW0uXG4gICAgaWYgKG91dHB1dC5zaGFwZVsxXSA9PT0gMSkge1xuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBhcmdSZWR1Y2UoYmFja2VuZCwgeCwgcmVkdWNlVHlwZSwgb3V0cHV0KTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG91dHB1dCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGFyZ1JlZHVjZVBhY2tlZChiYWNrZW5kLCB4LCByZWR1Y2VUeXBlLCBiZXN0SW5kaWNlc0EgPSBudWxsKSB7XG4gICAgY29uc3QgaW5TaGFwZSA9IGJlc3RJbmRpY2VzQSAhPSBudWxsID8gYmVzdEluZGljZXNBLnNoYXBlIDogeC5zaGFwZTtcbiAgICBjb25zdCBpblNpemUgPSBpblNoYXBlW2luU2hhcGUubGVuZ3RoIC0gMV07XG4gICAgY29uc3Qgd2luZG93U2l6ZSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3B0aW1hbFdpbmRvd1NpemUoaW5TaXplKTtcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IEFyZ01pbk1heFBhY2tlZFByb2dyYW0oaW5TaGFwZSwgd2luZG93U2l6ZSwgcmVkdWNlVHlwZSwgYmVzdEluZGljZXNBID09IG51bGwpO1xuICAgIGNvbnN0IGlucHV0cyA9IGJlc3RJbmRpY2VzQSA9PSBudWxsID8gW3hdIDogW3gsIGJlc3RJbmRpY2VzQV07XG4gICAgY29uc3Qgb3V0cHV0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgaW5wdXRzLCAnaW50MzInKTtcbiAgICBpZiAob3V0cHV0LnNoYXBlLmxlbmd0aCA9PT0geC5zaGFwZS5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXJnUmVkdWNlUGFja2VkKGJhY2tlbmQsIHgsIHJlZHVjZVR5cGUsIG91dHB1dCk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ob3V0cHV0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhcmdNaW5NYXhSZWR1Y2UoYmFja2VuZCwgeCwgYXhpcywgcmVkdWNlVHlwZSkge1xuICAgIGNvbnN0IGF4ZXMgPSBbYXhpc107XG4gICAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdhcmcnICsgcmVkdWNlVHlwZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHJlZHVjZVR5cGUuc2xpY2UoMSksIGF4ZXMsIHguc2hhcGUubGVuZ3RoKTtcbiAgICBpZiAoIWVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfUkVEVUNFJykgfHwgeC5zaGFwZS5sZW5ndGggPD0gMikge1xuICAgICAgICBjb25zdCBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcyA9IFtdO1xuICAgICAgICBjb25zdCBbb3V0U2hhcGUsIHJlZHVjZVNoYXBlXSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKHguc2hhcGUsIGF4ZXMpO1xuICAgICAgICBjb25zdCBpblNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuICAgICAgICBjb25zdCBhMkQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IFstMSwgaW5TaXplXSB9IH0pO1xuICAgICAgICBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcy5wdXNoKGEyRCk7XG4gICAgICAgIGNvbnN0IHJlZHVjZWQgPSBhcmdSZWR1Y2UoYmFja2VuZCwgYTJELCByZWR1Y2VUeXBlKTtcbiAgICAgICAgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MucHVzaChyZWR1Y2VkKTtcbiAgICAgICAgY29uc3QgcmVzaGFwZWQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHJlZHVjZWQgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IG91dFNoYXBlIH0gfSk7XG4gICAgICAgIGludGVybWVkaWF0ZVRlbnNvckluZm9zLmZvckVhY2godCA9PiBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHQpKTtcbiAgICAgICAgcmV0dXJuIHJlc2hhcGVkO1xuICAgIH1cbiAgICByZXR1cm4gYXJnUmVkdWNlUGFja2VkKGJhY2tlbmQsIHgsIHJlZHVjZVR5cGUpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXJnX21pbl9tYXguanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgVW5hcnlPcFByb2dyYW0gfSBmcm9tICcuLi91bmFyeW9wX2dwdSc7XG5jb25zdCBUT19JTlQgPSBgcmV0dXJuIGZsb2F0KGludCh4KSk7YDtcbmV4cG9ydCBmdW5jdGlvbiBpbnQoaW5wdXQsIGJhY2tlbmQpIHtcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IFVuYXJ5T3BQcm9ncmFtKGlucHV0LnNoYXBlLCBUT19JTlQpO1xuICAgIGNvbnN0IG91dHB1dCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtpbnB1dF0sICdpbnQzMicpO1xuICAgIHJldHVybiB7IGRhdGFJZDogb3V0cHV0LmRhdGFJZCwgc2hhcGU6IG91dHB1dC5zaGFwZSwgZHR5cGU6IG91dHB1dC5kdHlwZSB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW50LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgZW52LCB1cGNhc3RUeXBlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IEJpbmFyeU9wUHJvZ3JhbSB9IGZyb20gJy4uL2JpbmFyeW9wX2dwdSc7XG5pbXBvcnQgeyBCaW5hcnlPcFBhY2tlZFByb2dyYW0gfSBmcm9tICcuLi9iaW5hcnlvcF9wYWNrZWRfZ3B1JztcbmltcG9ydCB7IGNvbXBsZXggfSBmcm9tICcuLi9rZXJuZWxzL0NvbXBsZXgnO1xuaW1wb3J0IHsgTEVBS1lSRUxVLCBMRUFLWVJFTFVfUEFDS0VEIH0gZnJvbSAnLi4va2VybmVscy9MZWFreVJlbHUnO1xuaW1wb3J0IHsgUFJFTFUsIFBSRUxVX1BBQ0tFRCB9IGZyb20gJy4uL2tlcm5lbHMvUHJlbHUnO1xuaW1wb3J0ICogYXMgdW5hcnlfb3AgZnJvbSAnLi4vdW5hcnlvcF9ncHUnO1xuaW1wb3J0IHsgVW5hcnlPcFByb2dyYW0gfSBmcm9tICcuLi91bmFyeW9wX2dwdSc7XG5pbXBvcnQgKiBhcyB1bmFyeV9wYWNrZWRfb3AgZnJvbSAnLi4vdW5hcnlvcF9wYWNrZWRfZ3B1JztcbmltcG9ydCB7IFVuYXJ5T3BQYWNrZWRQcm9ncmFtIH0gZnJvbSAnLi4vdW5hcnlvcF9wYWNrZWRfZ3B1JztcbmV4cG9ydCBjb25zdCBDSEVDS19OQU5fU05JUFBFVF9VTkFSWSA9IGBpZiAoaXNuYW4oeCkpIHJldHVybiB4O2A7XG5leHBvcnQgY29uc3QgQ0hFQ0tfTkFOX1NOSVBQRVRfQklOQVJZID0gYFxuICBpZiAoaXNuYW4oYSkpIHJldHVybiBhO1xuICBpZiAoaXNuYW4oYikpIHJldHVybiBiO1xuYDtcbmV4cG9ydCBjb25zdCBDSEVDS19OQU5fU05JUFBFVF9CSU5BUllfUEFDS0VEID0gYFxuICByZXN1bHQuciA9IGlzTmFOLnIgPiAwLiA/IE5BTiA6IHJlc3VsdC5yO1xuICByZXN1bHQuZyA9IGlzTmFOLmcgPiAwLiA/IE5BTiA6IHJlc3VsdC5nO1xuICByZXN1bHQuYiA9IGlzTmFOLmIgPiAwLiA/IE5BTiA6IHJlc3VsdC5iO1xuICByZXN1bHQuYSA9IGlzTmFOLmEgPiAwLiA/IE5BTiA6IHJlc3VsdC5hO1xuYDtcbi8qKlxuICogVGVtcGxhdGUgdGhhdCBjcmVhdGVzIGEgYEtlcm5lbEZ1bmNgIGZvciB1bmFyeSBvcHMuXG4gKiBAcGFyYW0gb3BTbmlwcGV0IE9wIHNuaXBwZXQgdG8gY3JlYXRlIGBVbmFyeU9wUHJvZ3JhbWAuXG4gKiBAcGFyYW0gcGFja2VkT3BTbmlwcGV0IE9wIHNuaXBwZXQgdG8gY3JlYXRlIGBVbmFyeU9wUGFja2VkUHJvZ3JhbWAuXG4gKiBAcGFyYW0gZHR5cGUgT3B0aW9uYWwuIElmIHNldCwgdGhlIHJlc3VsdCBoYXMgdGhpcyBkdHlwZS4gT3RoZXJ3aXNlLCB0aGVcbiAqICAgICByZXN1bHQgaGFzIHRoZSBzYW1lIGR0eXBlIGFzIHRoZSBmaXJzdCBpbnB1dC4gVGhpcyBpcyBtYWlubHkgdXNlZCBpblxuICogICAgIGNvbXBhcmlzb24ga2VybmVscywgc3VjaCBhcyBFcXVhbCwgTGVzcywgR3JlYXRlciwgZXRjLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5hcnlLZXJuZWxGdW5jKHsgb3BTbmlwcGV0LCBwYWNrZWRPcFNuaXBwZXQsIGNwdUtlcm5lbEltcGwsIGR0eXBlIH0pIHtcbiAgICByZXR1cm4gKHsgaW5wdXRzLCBiYWNrZW5kIH0pID0+IHtcbiAgICAgICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgICAgIGNvbnN0IHdlYmdsQmFja2VuZCA9IGJhY2tlbmQ7XG4gICAgICAgIGNvbnN0ICRkdHlwZSA9IGR0eXBlIHx8IHguZHR5cGU7XG4gICAgICAgIGlmICh3ZWJnbEJhY2tlbmQuc2hvdWxkRXhlY3V0ZU9uQ1BVKFt4XSkgJiYgY3B1S2VybmVsSW1wbCAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCB4RGF0YSA9IHdlYmdsQmFja2VuZC50ZXhEYXRhLmdldCh4LmRhdGFJZCk7XG4gICAgICAgICAgICBjb25zdCBvdXRWYWx1ZXMgPSBjcHVLZXJuZWxJbXBsKHhEYXRhLnZhbHVlcywgJGR0eXBlKTtcbiAgICAgICAgICAgIHJldHVybiB3ZWJnbEJhY2tlbmQubWFrZVRlbnNvckluZm8oeC5zaGFwZSwgJGR0eXBlLCBvdXRWYWx1ZXMpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNob3VsZFVzZVBhY2tlZFByb2dyYW0gPSBlbnYoKS5nZXRCb29sKCdXRUJHTF9QQUNLX1VOQVJZX09QRVJBVElPTlMnKSAmJiBwYWNrZWRPcFNuaXBwZXQgIT0gbnVsbDtcbiAgICAgICAgbGV0IHByb2dyYW07XG4gICAgICAgIGlmIChzaG91bGRVc2VQYWNrZWRQcm9ncmFtKSB7XG4gICAgICAgICAgICBwcm9ncmFtID0gbmV3IFVuYXJ5T3BQYWNrZWRQcm9ncmFtKHguc2hhcGUsIHBhY2tlZE9wU25pcHBldCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwcm9ncmFtID0gbmV3IFVuYXJ5T3BQcm9ncmFtKHguc2hhcGUsIG9wU25pcHBldCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdlYmdsQmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3hdLCAkZHR5cGUpO1xuICAgIH07XG59XG4vKipcbiAqIFRlbXBsYXRlIHRoYXQgY3JlYXRlcyBhIGBLZXJuZWxGdW5jYCBmb3IgYmluYXJ5IG9wcy5cbiAqIEBwYXJhbSBvcFNuaXBwZXQgT3Agc25pcHBldCB0byBjcmVhdGUgYEJpbmFyeU9wUHJvZ3JhbWAuXG4gKiBAcGFyYW0gcGFja2VkT3BTbmlwcGV0IE9wIHNuaXBwZXQgdG8gY3JlYXRlIGBCaW5hcnlPcFBhY2tlZFByb2dyYW1gLlxuICogQHBhcmFtIGNoZWNrT3V0T2ZCb3VuZHNGb3JQYWNrZWRQcm9ncmFtIFdoZXRoZXIgdG8gc2V0IGNoZWNrT3V0T2ZCb3VuZHM9dHJ1ZVxuICogICAgIHdoZW4gY3JlYXRpbmcgQmluYXJ5T3BQYWNrZWRQcm9ncmFtLlxuICogQHBhcmFtIGR0eXBlIE9wdGlvbmFsLiBJZiBzZXQsIHRoZSByZXN1bHQgaGFzIHRoaXMgZHR5cGUuIE90aGVyd2lzZSwgdGhlXG4gKiAgICAgcmVzdWx0IGhhcyB0aGUgc2FtZSBkdHlwZSBhcyB0aGUgZmlyc3QgaW5wdXQuIFRoaXMgaXMgbWFpbmx5IHVzZWQgaW5cbiAqICAgICBjb21wYXJpc29uIGtlcm5lbHMsIHN1Y2ggYXMgRXF1YWwsIExlc3MsIEdyZWF0ZXIsIGV0Yy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmFyeUtlcm5lbEZ1bmMoeyBvcFNuaXBwZXQsIHBhY2tlZE9wU25pcHBldCwgY2hlY2tPdXRPZkJvdW5kcyA9IGZhbHNlLCBzdXBwb3J0c0NvbXBsZXggPSBmYWxzZSwgY3B1S2VybmVsSW1wbCwgZHR5cGUgfSkge1xuICAgIHJldHVybiAoeyBpbnB1dHMsIGJhY2tlbmQgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IGEsIGIgfSA9IGlucHV0cztcbiAgICAgICAgY29uc3Qgd2ViZ2xCYWNrZW5kID0gYmFja2VuZDtcbiAgICAgICAgaWYgKHN1cHBvcnRzQ29tcGxleCAmJiBhLmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICAgICAgY29uc3QgYURhdGEgPSB3ZWJnbEJhY2tlbmQudGV4RGF0YS5nZXQoYS5kYXRhSWQpO1xuICAgICAgICAgICAgY29uc3QgYkRhdGEgPSB3ZWJnbEJhY2tlbmQudGV4RGF0YS5nZXQoYi5kYXRhSWQpO1xuICAgICAgICAgICAgY29uc3QgW3JlYWwsIGltYWddID0gW1xuICAgICAgICAgICAgICAgIFthRGF0YS5jb21wbGV4VGVuc29ySW5mb3MucmVhbCwgYkRhdGEuY29tcGxleFRlbnNvckluZm9zLnJlYWxdLFxuICAgICAgICAgICAgICAgIFthRGF0YS5jb21wbGV4VGVuc29ySW5mb3MuaW1hZywgYkRhdGEuY29tcGxleFRlbnNvckluZm9zLmltYWddXG4gICAgICAgICAgICBdLm1hcChjb21wbGV4UGFydHMgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IFthUGFydCwgYlBhcnRdID0gY29tcGxleFBhcnRzO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFIYW5kbGUgPSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFJZDogYVBhcnQuZGF0YUlkLFxuICAgICAgICAgICAgICAgICAgICBkdHlwZTogYVBhcnQuZHR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHNoYXBlOiBhLnNoYXBlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCBiSGFuZGxlID0ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhSWQ6IGJQYXJ0LmRhdGFJZCxcbiAgICAgICAgICAgICAgICAgICAgZHR5cGU6IGJQYXJ0LmR0eXBlLFxuICAgICAgICAgICAgICAgICAgICBzaGFwZTogYi5zaGFwZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBCaW5hcnlPcFByb2dyYW0ob3BTbmlwcGV0LCBhLnNoYXBlLCBiLnNoYXBlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gd2ViZ2xCYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbYUhhbmRsZSwgYkhhbmRsZV0sIHVwY2FzdFR5cGUoYVBhcnQuZHR5cGUsIGJQYXJ0LmR0eXBlKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBsZXhPdXRwdXQgPSBjb21wbGV4KHsgaW5wdXRzOiB7IHJlYWwsIGltYWcgfSwgYmFja2VuZDogd2ViZ2xCYWNrZW5kIH0pO1xuICAgICAgICAgICAgd2ViZ2xCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlYWwpO1xuICAgICAgICAgICAgd2ViZ2xCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGltYWcpO1xuICAgICAgICAgICAgLy8gVE9ETyhhbm54aW5neXVhbik6IEltcGxlbWVudCBDUFUgZm9yd2FyZGluZyBmb3IgY29tcGxleCBpbnB1dHMuXG4gICAgICAgICAgICByZXR1cm4gY29tcGxleE91dHB1dDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCAkZHR5cGUgPSBkdHlwZSB8fCB1cGNhc3RUeXBlKGEuZHR5cGUsIGIuZHR5cGUpO1xuICAgICAgICBpZiAoKGEuZHR5cGUgPT09ICdzdHJpbmcnIHx8IGIuZHR5cGUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICB3ZWJnbEJhY2tlbmQuc2hvdWxkRXhlY3V0ZU9uQ1BVKFthLCBiXSkpICYmXG4gICAgICAgICAgICBjcHVLZXJuZWxJbXBsICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGFWYWxzID0gd2ViZ2xCYWNrZW5kLnRleERhdGEuZ2V0KGEuZGF0YUlkKS52YWx1ZXM7XG4gICAgICAgICAgICBjb25zdCBiVmFscyA9IHdlYmdsQmFja2VuZC50ZXhEYXRhLmdldChiLmRhdGFJZCkudmFsdWVzO1xuICAgICAgICAgICAgY29uc3QgZGVjb2RlZEFWYWxzID0gYS5kdHlwZSA9PT0gJ3N0cmluZycgP1xuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tYW55XG4gICAgICAgICAgICAgICAgYmFja2VuZF91dGlsLmZyb21VaW50OFRvU3RyaW5nQXJyYXkoYVZhbHMpIDpcbiAgICAgICAgICAgICAgICBhVmFscztcbiAgICAgICAgICAgIGNvbnN0IGRlY29kZWRCVmFscyA9IGEuZHR5cGUgPT09ICdzdHJpbmcnID9cbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWFueVxuICAgICAgICAgICAgICAgIGJhY2tlbmRfdXRpbC5mcm9tVWludDhUb1N0cmluZ0FycmF5KGJWYWxzKSA6XG4gICAgICAgICAgICAgICAgYlZhbHM7XG4gICAgICAgICAgICBjb25zdCBbb3V0VmFsdWVzLCBvdXRTaGFwZV0gPSBjcHVLZXJuZWxJbXBsKGEuc2hhcGUsIGIuc2hhcGUsIGRlY29kZWRBVmFscywgZGVjb2RlZEJWYWxzLCAkZHR5cGUpO1xuICAgICAgICAgICAgY29uc3Qgb3V0ID0gd2ViZ2xCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dFNoYXBlLCAkZHR5cGUpO1xuICAgICAgICAgICAgY29uc3Qgb3V0RGF0YSA9IHdlYmdsQmFja2VuZC50ZXhEYXRhLmdldChvdXQuZGF0YUlkKTtcbiAgICAgICAgICAgIG91dERhdGEudmFsdWVzID0gb3V0VmFsdWVzO1xuICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzaG91bGRVc2VQYWNrZWRQcm9ncmFtID0gZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19CSU5BUllfT1BFUkFUSU9OUycpICYmXG4gICAgICAgICAgICBwYWNrZWRPcFNuaXBwZXQgIT0gbnVsbDtcbiAgICAgICAgbGV0IHByb2dyYW07XG4gICAgICAgIGlmIChzaG91bGRVc2VQYWNrZWRQcm9ncmFtKSB7XG4gICAgICAgICAgICBwcm9ncmFtID0gbmV3IEJpbmFyeU9wUGFja2VkUHJvZ3JhbShwYWNrZWRPcFNuaXBwZXQsIGEuc2hhcGUsIGIuc2hhcGUsIGNoZWNrT3V0T2ZCb3VuZHMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcHJvZ3JhbSA9IG5ldyBCaW5hcnlPcFByb2dyYW0ob3BTbmlwcGV0LCBhLnNoYXBlLCBiLnNoYXBlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd2ViZ2xCYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbYSwgYl0sICRkdHlwZSk7XG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBtYXBBY3RpdmF0aW9uVG9TaGFkZXJQcm9ncmFtKGFjdGl2YXRpb24sIHBhY2tlZCA9IGZhbHNlKSB7XG4gICAgaWYgKGFjdGl2YXRpb24gPT09ICdsaW5lYXInKSB7XG4gICAgICAgIGlmIChwYWNrZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmFyeV9wYWNrZWRfb3AuTElORUFSO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmFyeV9vcC5MSU5FQVI7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdyZWx1Jykge1xuICAgICAgICBpZiAocGFja2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5hcnlfcGFja2VkX29wLlJFTFU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuYXJ5X29wLlJFTFU7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdlbHUnKSB7XG4gICAgICAgIGlmIChwYWNrZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmFyeV9wYWNrZWRfb3AuRUxVO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmFyeV9vcC5FTFU7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdyZWx1NicpIHtcbiAgICAgICAgaWYgKHBhY2tlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuYXJ5X3BhY2tlZF9vcC5SRUxVNjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5hcnlfb3AuUkVMVTY7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdwcmVsdScpIHtcbiAgICAgICAgaWYgKHBhY2tlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFBSRUxVX1BBQ0tFRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUFJFTFU7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdsZWFreXJlbHUnKSB7XG4gICAgICAgIGlmIChwYWNrZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBMRUFLWVJFTFVfUEFDS0VEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBMRUFLWVJFTFU7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdzaWdtb2lkJykge1xuICAgICAgICBpZiAocGFja2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5hcnlfcGFja2VkX29wLlNJR01PSUQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuYXJ5X29wLlNJR01PSUQ7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgQWN0aXZhdGlvbiAke2FjdGl2YXRpb259IGhhcyBub3QgYmVlbiBpbXBsZW1lbnRlZCBmb3IgdGhlIFdlYkdMIGJhY2tlbmQuYCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1rZXJuZWxfZnVuY3NfdXRpbHMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IE1lYW5Qcm9ncmFtIH0gZnJvbSAnLi4vbWVhbl9ncHUnO1xuaW1wb3J0IHsgUmVkdWNlUHJvZ3JhbSB9IGZyb20gJy4uL3JlZHVjZV9ncHUnO1xuLy8gUmV0dXJucyBhbiBhcnJheSBvZiBjb25maWd1cmF0aW9uIG9iamVjdHMgdGhhdCBkZXNjcmliZSBlYWNoIHN0YWdlIG9mIHRoZVxuLy8gcmVkdWN0aW9uLlxuZnVuY3Rpb24gZ2V0UmVkdWN0aW9uU3RhZ2VzKGluU2hhcGUpIHtcbiAgICBjb25zdCBzdGFnZXMgPSBbXTtcbiAgICB3aGlsZSAoc3RhZ2VzLmxlbmd0aCA9PT0gMCB8fCBzdGFnZXNbc3RhZ2VzLmxlbmd0aCAtIDFdLm91dFNpemUgIT09IDEpIHtcbiAgICAgICAgY29uc3Qgb3V0U2l6ZSA9IHN0YWdlcy5sZW5ndGggPyBzdGFnZXNbc3RhZ2VzLmxlbmd0aCAtIDFdLm91dFNpemUgOiBpblNoYXBlWzFdO1xuICAgICAgICBjb25zdCB3aW5kb3dTaXplID0gYmFja2VuZF91dGlsLmNvbXB1dGVPcHRpbWFsV2luZG93U2l6ZShvdXRTaXplKTtcbiAgICAgICAgc3RhZ2VzLnB1c2goe1xuICAgICAgICAgICAgaW5TaXplOiBvdXRTaXplLFxuICAgICAgICAgICAgd2luZG93U2l6ZSxcbiAgICAgICAgICAgIG91dFNpemU6IE1hdGguY2VpbChvdXRTaXplIC8gd2luZG93U2l6ZSlcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBzdGFnZXM7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVkdWNlKHgsIGR0eXBlLCByZWR1Y3Rpb25UeXBlLCBiYWNrZW5kKSB7XG4gICAgY29uc3QgcmVkdWN0aW9uU3RhZ2VzID0gZ2V0UmVkdWN0aW9uU3RhZ2VzKHguc2hhcGUpO1xuICAgIGxldCByZXN1bHQgPSB4O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVkdWN0aW9uU3RhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHsgaW5TaXplLCB3aW5kb3dTaXplLCBvdXRTaXplIH0gPSByZWR1Y3Rpb25TdGFnZXNbaV07XG4gICAgICAgIGxldCBwcm9ncmFtO1xuICAgICAgICBsZXQgcHJldmlvdXNSZXN1bHQ7XG4gICAgICAgIGlmIChyZWR1Y3Rpb25UeXBlID09PSAnbWVhbicpIHtcbiAgICAgICAgICAgIHByb2dyYW0gPSBpID09PSAwID9cbiAgICAgICAgICAgICAgICBuZXcgTWVhblByb2dyYW0oeyB3aW5kb3dTaXplLCBpblNpemUsIGJhdGNoU2l6ZTogeC5zaGFwZVswXSwgb3V0U2l6ZSB9LCBpblNpemUpIDpcbiAgICAgICAgICAgICAgICBuZXcgTWVhblByb2dyYW0oeyB3aW5kb3dTaXplLCBpblNpemUsIGJhdGNoU2l6ZTogeC5zaGFwZVswXSwgb3V0U2l6ZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHByb2dyYW0gPSBuZXcgUmVkdWNlUHJvZ3JhbSh7IHdpbmRvd1NpemUsIGluU2l6ZSwgYmF0Y2hTaXplOiB4LnNoYXBlWzBdLCBvdXRTaXplIH0sIHJlZHVjdGlvblR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIHByZXZpb3VzUmVzdWx0ID0gcmVzdWx0O1xuICAgICAgICByZXN1bHQgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbcmVzdWx0XSwgZHR5cGUpO1xuICAgICAgICBpZiAocHJldmlvdXNSZXN1bHQuZGF0YUlkICE9PSB4LmRhdGFJZCkge1xuICAgICAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhwcmV2aW91c1Jlc3VsdCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlZHVjZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBSZXNoYXBlUGFja2VkUHJvZ3JhbSB9IGZyb20gJy4uL3Jlc2hhcGVfcGFja2VkX2dwdSc7XG5pbXBvcnQgeyBnZXRCYXRjaERpbSwgZ2V0Um93c0NvbHMgfSBmcm9tICcuLi93ZWJnbF91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBwYWNrZWRSZXNoYXBlKGlucHV0LCBhZnRlclNoYXBlLCBiYWNrZW5kKSB7XG4gICAgY29uc3QgaW5wdXQzRFNoYXBlID0gW2dldEJhdGNoRGltKGlucHV0LnNoYXBlKSxcbiAgICAgICAgLi4uZ2V0Um93c0NvbHMoaW5wdXQuc2hhcGUpXTtcbiAgICBjb25zdCBpbnB1dDNEID0ge1xuICAgICAgICBkdHlwZTogaW5wdXQuZHR5cGUsXG4gICAgICAgIHNoYXBlOiBpbnB1dDNEU2hhcGUsXG4gICAgICAgIGRhdGFJZDogaW5wdXQuZGF0YUlkXG4gICAgfTtcbiAgICBjb25zdCBhZnRlclNoYXBlQXMzRCA9IFtnZXRCYXRjaERpbShhZnRlclNoYXBlKSxcbiAgICAgICAgLi4uZ2V0Um93c0NvbHMoYWZ0ZXJTaGFwZSldO1xuICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgUmVzaGFwZVBhY2tlZFByb2dyYW0oYWZ0ZXJTaGFwZUFzM0QsIGlucHV0M0RTaGFwZSk7XG4gICAgY29uc3QgcHJldmVudEVhZ2VyVW5wYWNraW5nT2ZPdXRwdXQgPSB0cnVlO1xuICAgIGNvbnN0IG91dHB1dCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtpbnB1dDNEXSwgaW5wdXQuZHR5cGUsIG51bGwgLyogY3VzdG9tU2V0dXAgKi8sIHByZXZlbnRFYWdlclVucGFja2luZ09mT3V0cHV0KTtcbiAgICByZXR1cm4geyBkYXRhSWQ6IG91dHB1dC5kYXRhSWQsIHNoYXBlOiBhZnRlclNoYXBlLCBkdHlwZTogb3V0cHV0LmR0eXBlIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZXNoYXBlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8vIEltcG9ydCBzaGFyZWQgZnVuY3Rpb25hbGl0eSBmcm9tIHRmanMtYmFja2VuZC1jcHUgd2l0aG91dCB0cmlnZ2VyaW5nXG4vLyBzaWRlIGVmZmVjdHMuXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWltcG9ydHMtZnJvbS1kaXN0XG5pbXBvcnQgKiBhcyBzaGFyZWQgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L3NoYXJlZCc7XG5jb25zdCB7IGFkZEltcGw6IGFkZEltcGxDUFUsIGJpbmNvdW50SW1wbDogYmluY291bnRJbXBsQ1BVLCBiaW5jb3VudFJlZHVjZUltcGw6IGJpbmNvdW50UmVkdWNlSW1wbENQVSwgY2VpbEltcGw6IGNlaWxJbXBsQ1BVLCBjb25jYXRJbXBsOiBjb25jYXRJbXBsQ1BVLCBlcXVhbEltcGw6IGVxdWFsSW1wbENQVSwgZXhwSW1wbDogZXhwSW1wbENQVSwgZXhwbTFJbXBsOiBleHBtMUltcGxDUFUsIGZsb29ySW1wbDogZmxvb3JJbXBsQ1BVLCBnYXRoZXJOZEltcGw6IGdhdGhlck5kSW1wbENQVSwgZ2F0aGVyVjJJbXBsOiBnYXRoZXJWMkltcGxDUFUsIGdyZWF0ZXJJbXBsOiBncmVhdGVySW1wbENQVSwgZ3JlYXRlckVxdWFsSW1wbDogZ3JlYXRlckVxdWFsSW1wbENQVSwgbGVzc0ltcGw6IGxlc3NJbXBsQ1BVLCBsZXNzRXF1YWxJbXBsOiBsZXNzRXF1YWxJbXBsQ1BVLCBsaW5TcGFjZUltcGw6IGxpblNwYWNlSW1wbENQVSwgbG9nSW1wbDogbG9nSW1wbENQVSwgbWF4SW1wbDogbWF4SW1wbENQVSwgbWF4aW11bUltcGw6IG1heGltdW1JbXBsQ1BVLCBtaW5pbXVtSW1wbDogbWluaW11bUltcGxDUFUsIG11bHRpcGx5SW1wbDogbXVsdGlwbHlJbXBsQ1BVLCBuZWdJbXBsOiBuZWdJbXBsQ1BVLCBub3RFcXVhbEltcGw6IG5vdEVxdWFsSW1wbENQVSwgcHJvZEltcGw6IHByb2RJbXBsQ1BVLCByYW5nZUltcGw6IHJhbmdlSW1wbENQVSwgcnNxcnRJbXBsOiByc3FydEltcGxDUFUsIHNpbXBsZUFic0ltcGw6IHNpbXBsZUFic0ltcGxDUFUsIHNsaWNlSW1wbDogc2xpY2VJbXBsQ1BVLCBzcGFyc2VGaWxsRW1wdHlSb3dzSW1wbDogc3BhcnNlRmlsbEVtcHR5Um93c0ltcGxDUFUsIHNwYXJzZVJlc2hhcGVJbXBsOiBzcGFyc2VSZXNoYXBlSW1wbENQVSwgc3BhcnNlU2VnbWVudFJlZHVjdGlvbkltcGw6IHNwYXJzZVNlZ21lbnRSZWR1Y3Rpb25JbXBsQ1BVLCBzdHJpZGVkU2xpY2VJbXBsOiBzdHJpZGVkU2xpY2VJbXBsQ1BVLCBzdHJpbmdOR3JhbXNJbXBsOiBzdHJpbmdOR3JhbXNJbXBsQ1BVLCBzdHJpbmdTcGxpdEltcGw6IHN0cmluZ1NwbGl0SW1wbENQVSwgc3RyaW5nVG9IYXNoQnVja2V0RmFzdEltcGw6IHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RJbXBsQ1BVLCBzdWJJbXBsOiBzdWJJbXBsQ1BVLCB0aWxlSW1wbDogdGlsZUltcGxDUFUsIHRvcEtJbXBsOiB0b3BLSW1wbENQVSwgdHJhbnNwb3NlSW1wbDogdHJhbnNwb3NlSW1wbENQVSwgdW5pcXVlSW1wbDogdW5pcXVlSW1wbENQVSwgfSA9IHNoYXJlZDtcbmV4cG9ydCB7IGFkZEltcGxDUFUsIGJpbmNvdW50SW1wbENQVSwgYmluY291bnRSZWR1Y2VJbXBsQ1BVLCBjZWlsSW1wbENQVSwgY29uY2F0SW1wbENQVSwgZXF1YWxJbXBsQ1BVLCBleHBJbXBsQ1BVLCBleHBtMUltcGxDUFUsIGZsb29ySW1wbENQVSwgZ2F0aGVyTmRJbXBsQ1BVLCBnYXRoZXJWMkltcGxDUFUsIGdyZWF0ZXJFcXVhbEltcGxDUFUsIGdyZWF0ZXJJbXBsQ1BVLCBsZXNzRXF1YWxJbXBsQ1BVLCBsZXNzSW1wbENQVSwgbGluU3BhY2VJbXBsQ1BVLCBsb2dJbXBsQ1BVLCBtYXhJbXBsQ1BVLCBtYXhpbXVtSW1wbENQVSwgbWluaW11bUltcGxDUFUsIG11bHRpcGx5SW1wbENQVSwgbmVnSW1wbENQVSwgbm90RXF1YWxJbXBsQ1BVLCBwcm9kSW1wbENQVSwgc2ltcGxlQWJzSW1wbENQVSwgc2xpY2VJbXBsQ1BVLCBzcGFyc2VGaWxsRW1wdHlSb3dzSW1wbENQVSwgc3BhcnNlUmVzaGFwZUltcGxDUFUsIHNwYXJzZVNlZ21lbnRSZWR1Y3Rpb25JbXBsQ1BVLCBzdHJpZGVkU2xpY2VJbXBsQ1BVLCBzdHJpbmdOR3JhbXNJbXBsQ1BVLCBzdHJpbmdTcGxpdEltcGxDUFUsIHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RJbXBsQ1BVLCBzdWJJbXBsQ1BVLCByYW5nZUltcGxDUFUsIHJzcXJ0SW1wbENQVSwgdGlsZUltcGxDUFUsIHRvcEtJbXBsQ1BVLCB0cmFuc3Bvc2VJbXBsQ1BVLCB1bmlxdWVJbXBsQ1BVLCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2hhcmVkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEFicywgZW52IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHNpbXBsZUFic0ltcGxDUFUgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmltcG9ydCB7IFVuYXJ5T3BQcm9ncmFtIH0gZnJvbSAnLi4vdW5hcnlvcF9ncHUnO1xuaW1wb3J0IHsgVW5hcnlPcFBhY2tlZFByb2dyYW0gfSBmcm9tICcuLi91bmFyeW9wX3BhY2tlZF9ncHUnO1xuY29uc3QgQUJTID0gYHJldHVybiBhYnMoeCk7YDtcbmV4cG9ydCBmdW5jdGlvbiBhYnMoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIC8vIFRPRE86IGhhbmRsZSBjYXNlcyB3aGVuIHggaXMgY29tcGxleC4gT25jZSB0aGUgY3B1IGltcGxlbWVudGF0aW9uXG4gICAgLy8gY2FuIGhhbmRsZSBjb21wbGV4IHZhbHVlcywgcmVmYWN0b3IgdG8gdXNlIHVuYXJ5S2VybmVsRnVuYy5cbiAgICBpZiAoYmFja2VuZC5zaG91bGRFeGVjdXRlT25DUFUoW3hdKSAmJiB4LmR0eXBlICE9PSAnY29tcGxleDY0Jykge1xuICAgICAgICBjb25zdCB4RGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQoeC5kYXRhSWQpO1xuICAgICAgICBjb25zdCBvdXRWYWx1ZXMgPSBzaW1wbGVBYnNJbXBsQ1BVKHhEYXRhLnZhbHVlcyk7XG4gICAgICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHguc2hhcGUsIHguZHR5cGUsIG91dFZhbHVlcyk7XG4gICAgfVxuICAgIGxldCBwcm9ncmFtO1xuICAgIGlmIChlbnYoKS5nZXRCb29sKCdXRUJHTF9QQUNLX1VOQVJZX09QRVJBVElPTlMnKSkge1xuICAgICAgICBwcm9ncmFtID0gbmV3IFVuYXJ5T3BQYWNrZWRQcm9ncmFtKHguc2hhcGUsIEFCUyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBwcm9ncmFtID0gbmV3IFVuYXJ5T3BQcm9ncmFtKHguc2hhcGUsIEFCUyk7XG4gICAgfVxuICAgIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeF0sIHguZHR5cGUpO1xufVxuZXhwb3J0IGNvbnN0IGFic0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBBYnMsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogYWJzXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QWJzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEFjb3MgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQgeyBDSEVDS19OQU5fU05JUFBFVCB9IGZyb20gJy4uL3VuYXJ5b3BfZ3B1JztcbmNvbnN0IEFDT1MgPSBDSEVDS19OQU5fU05JUFBFVCArIGBcbiAgaWYgKGFicyh4KSA+IDEuKSB7XG4gICAgcmV0dXJuIE5BTjtcbiAgfVxuICByZXR1cm4gYWNvcyh4KTtcbmA7XG5leHBvcnQgY29uc3QgYWNvcyA9IHVuYXJ5S2VybmVsRnVuYyh7IG9wU25pcHBldDogQUNPUyB9KTtcbmV4cG9ydCBjb25zdCBhY29zQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEFjb3MsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogYWNvcyxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BY29zLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEFjb3NoIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHsgQ0hFQ0tfTkFOX1NOSVBQRVQgfSBmcm9tICcuLi91bmFyeW9wX2dwdSc7XG5jb25zdCBBQ09TSCA9IENIRUNLX05BTl9TTklQUEVUICsgYFxuICBpZiAoeCA8IDEuMCkgcmV0dXJuIE5BTjtcbnJldHVybiBsb2coeCArIHNxcnQoeCAqIHggLSAxLjApKTtgO1xuZXhwb3J0IGNvbnN0IGFjb3NoID0gdW5hcnlLZXJuZWxGdW5jKHsgb3BTbmlwcGV0OiBBQ09TSCB9KTtcbmV4cG9ydCBjb25zdCBhY29zaENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBBY29zaCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBhY29zaCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BY29zaC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBZGQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYmluYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHsgYWRkSW1wbENQVSBhcyBjcHVBZGQgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmNvbnN0IEFERCA9ICdyZXR1cm4gYSArIGI7JztcbmV4cG9ydCBjb25zdCBhZGRLZXJuZWxGdW5jID0gYmluYXJ5S2VybmVsRnVuYyh7XG4gICAgb3BTbmlwcGV0OiBBREQsXG4gICAgcGFja2VkT3BTbmlwcGV0OiBBREQsXG4gICAgc3VwcG9ydHNDb21wbGV4OiB0cnVlLFxuICAgIGNwdUtlcm5lbEltcGw6IGNwdUFkZFxufSk7XG5leHBvcnQgY29uc3QgYWRkQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEFkZCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBhZGRLZXJuZWxGdW5jXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QWRkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEFkZE4sIGVudiwgdXBjYXN0VHlwZSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBBZGROUHJvZ3JhbSB9IGZyb20gJy4uL2FkZG5fZ3B1JztcbmltcG9ydCB7IEFkZE5QYWNrZWRQcm9ncmFtIH0gZnJvbSAnLi4vYWRkbl9wYWNrZWRfZ3B1JztcbmltcG9ydCB7IGlkZW50aXR5IH0gZnJvbSAnLi9JZGVudGl0eSc7XG5leHBvcnQgZnVuY3Rpb24gYWRkTihhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgdGVuc29ycyA9IGlucHV0cztcbiAgICBpZiAodGVuc29ycy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGlkZW50aXR5KHsgaW5wdXRzOiB7IHg6IHRlbnNvcnNbMF0gfSwgYmFja2VuZCB9KTtcbiAgICB9XG4gICAgLy8gTGltaXQgdGhlIG51bWJlciBvZiB1cGxvYWRlZCB0ZXh0dXJlcyBmb3Igb3B0aW1pemF0aW9uLlxuICAgIGlmICh0ZW5zb3JzLmxlbmd0aCA+IGVudigpLmdldCgnV0VCR0xfTUFYX1RFWFRVUkVTX0lOX1NIQURFUicpKSB7XG4gICAgICAgIGNvbnN0IG1pZEluZGV4ID0gTWF0aC5mbG9vcih0ZW5zb3JzLmxlbmd0aCAvIDIpO1xuICAgICAgICBjb25zdCBsZWZ0U2lkZSA9IGFkZE4oeyBpbnB1dHM6IHRlbnNvcnMuc2xpY2UoMCwgbWlkSW5kZXgpLCBiYWNrZW5kIH0pO1xuICAgICAgICBjb25zdCByaWdodFNpZGUgPSBhZGROKHsgaW5wdXRzOiB0ZW5zb3JzLnNsaWNlKG1pZEluZGV4KSwgYmFja2VuZCB9KTtcbiAgICAgICAgcmV0dXJuIGFkZE4oeyBpbnB1dHM6IFtsZWZ0U2lkZSwgcmlnaHRTaWRlXSwgYmFja2VuZCB9KTtcbiAgICB9XG4gICAgY29uc3QgZHR5cGUgPSB0ZW5zb3JzLm1hcCh0ID0+IHQuZHR5cGUpLnJlZHVjZSgoZDEsIGQyKSA9PiB1cGNhc3RUeXBlKGQxLCBkMikpO1xuICAgIGNvbnN0IHNoYXBlcyA9IHRlbnNvcnMubWFwKHQgPT4gdC5zaGFwZSk7XG4gICAgLy8gV2UgY2FuIG1ha2Ugc3VyZSBzaGFwZXMgYXJlIGlkZW50aWNhbCBpbiBvcCBsZXZlbC5cbiAgICBjb25zdCB1c2VQYWNrZWRPcCA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0snKTtcbiAgICBjb25zdCBwcm9ncmFtID0gdXNlUGFja2VkT3AgP1xuICAgICAgICBuZXcgQWRkTlBhY2tlZFByb2dyYW0odGVuc29yc1swXS5zaGFwZSwgc2hhcGVzKSA6XG4gICAgICAgIG5ldyBBZGROUHJvZ3JhbSh0ZW5zb3JzWzBdLnNoYXBlLCBzaGFwZXMpO1xuICAgIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCB0ZW5zb3JzLCBkdHlwZSk7XG59XG5leHBvcnQgY29uc3QgYWRkTkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBBZGROLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGFkZE5cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BZGROLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEFsbCwgYmFja2VuZF91dGlsLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHJlZHVjZSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9yZWR1Y2UnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQgeyB0cmFuc3Bvc2UgfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5leHBvcnQgZnVuY3Rpb24gYWxsKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBheGlzLCBrZWVwRGltcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBvcmlnQXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG4gICAgbGV0IGF4ZXMgPSBvcmlnQXhlcztcbiAgICBjb25zdCBwZXJtdXRlZEF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKGF4ZXMsIHhSYW5rKTtcbiAgICBsZXQgcGVybXV0ZWRYID0geDtcbiAgICBpZiAocGVybXV0ZWRBeGVzICE9IG51bGwpIHtcbiAgICAgICAgcGVybXV0ZWRYID0gdHJhbnNwb3NlKHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCwgYXR0cnM6IHsgcGVybTogcGVybXV0ZWRBeGVzIH0gfSk7XG4gICAgICAgIGF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0SW5uZXJNb3N0QXhlcyhheGVzLmxlbmd0aCwgeFJhbmspO1xuICAgIH1cbiAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoJ2FsbCcsIGF4ZXMsIHhSYW5rKTtcbiAgICBjb25zdCBbb3V0U2hhcGUsIHJlZHVjZVNoYXBlXSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKHBlcm11dGVkWC5zaGFwZSwgYXhlcyk7XG4gICAgY29uc3QgaW5TaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcbiAgICBjb25zdCBhMkQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHBlcm11dGVkWCB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogWy0xLCBpblNpemVdIH0gfSk7XG4gICAgY29uc3QgcmVkdWNlZCA9IHJlZHVjZShhMkQsIGEyRC5kdHlwZSwgJ2FsbCcsIGJhY2tlbmQpO1xuICAgIGxldCByZXM7XG4gICAgaWYgKGtlZXBEaW1zKSB7XG4gICAgICAgIGNvbnN0IG5ld1NoYXBlID0gYmFja2VuZF91dGlsLmV4cGFuZFNoYXBlVG9LZWVwRGltKG91dFNoYXBlLCBvcmlnQXhlcyk7XG4gICAgICAgIHJlcyA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogcmVkdWNlZCB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogbmV3U2hhcGUgfSB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlcyA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogcmVkdWNlZCB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogb3V0U2hhcGUgfSB9KTtcbiAgICB9XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhhMkQpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVkdWNlZCk7XG4gICAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocGVybXV0ZWRYKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydCBjb25zdCBhbGxDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQWxsLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGFsbFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFsbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBbnksIGJhY2tlbmRfdXRpbCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyByZWR1Y2UgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvcmVkdWNlJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHsgdHJhbnNwb3NlIH0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuZXhwb3J0IGZ1bmN0aW9uIGFueShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYXhpcywga2VlcERpbXMgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3Qgb3JpZ0F4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpO1xuICAgIGxldCBheGVzID0gb3JpZ0F4ZXM7XG4gICAgY29uc3QgcGVybXV0ZWRBeGVzID0gYmFja2VuZF91dGlsLmdldEF4ZXNQZXJtdXRhdGlvbihheGVzLCB4UmFuayk7XG4gICAgbGV0IHBlcm11dGVkWCA9IHg7XG4gICAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgICAgIHBlcm11dGVkWCA9IHRyYW5zcG9zZSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHBlcm06IHBlcm11dGVkQXhlcyB9IH0pO1xuICAgICAgICBheGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoYXhlcy5sZW5ndGgsIHhSYW5rKTtcbiAgICB9XG4gICAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdhbnknLCBheGVzLCB4UmFuayk7XG4gICAgY29uc3QgW291dFNoYXBlLCByZWR1Y2VTaGFwZV0gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcyhwZXJtdXRlZFguc2hhcGUsIGF4ZXMpO1xuICAgIGNvbnN0IGluU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShyZWR1Y2VTaGFwZSk7XG4gICAgY29uc3QgYTJEID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiBwZXJtdXRlZFggfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IFstMSwgaW5TaXplXSB9IH0pO1xuICAgIGNvbnN0IHJlZHVjZWQgPSByZWR1Y2UoYTJELCBhMkQuZHR5cGUsICdhbnknLCBiYWNrZW5kKTtcbiAgICBsZXQgcmVzO1xuICAgIGlmIChrZWVwRGltcykge1xuICAgICAgICBjb25zdCBuZXdTaGFwZSA9IGJhY2tlbmRfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbShvdXRTaGFwZSwgb3JpZ0F4ZXMpO1xuICAgICAgICByZXMgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHJlZHVjZWQgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IG5ld1NoYXBlIH0gfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXMgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHJlZHVjZWQgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IG91dFNoYXBlIH0gfSk7XG4gICAgfVxuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oYTJEKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlZHVjZWQpO1xuICAgIGlmIChwZXJtdXRlZEF4ZXMgIT0gbnVsbCkge1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHBlcm11dGVkWCk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5leHBvcnQgY29uc3QgYW55Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEFueSxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBhbnlcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BbnkuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQXJnTWF4LCBiYWNrZW5kX3V0aWwsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXJnTWluTWF4UmVkdWNlIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2FyZ19taW5fbWF4JztcbmltcG9ydCB7IHRyYW5zcG9zZSB9IGZyb20gJy4vVHJhbnNwb3NlJztcbmV4cG9ydCBmdW5jdGlvbiBhcmdNYXgoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGF4aXMgfSA9IGF0dHJzO1xuICAgIGxldCBheGVzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShheGlzLCB4LnNoYXBlKTtcbiAgICBjb25zdCBwZXJtdXRlZEF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKGF4ZXMsIHguc2hhcGUubGVuZ3RoKTtcbiAgICBsZXQgJHggPSB4O1xuICAgIGNvbnN0IGludGVybWVkaWF0ZVRlbnNvckluZm9zID0gW107XG4gICAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgICAgICR4ID0gdHJhbnNwb3NlKHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCwgYXR0cnM6IHsgcGVybTogcGVybXV0ZWRBeGVzIH0gfSk7XG4gICAgICAgIGludGVybWVkaWF0ZVRlbnNvckluZm9zLnB1c2goJHgpO1xuICAgICAgICBheGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoYXhlcy5sZW5ndGgsICR4LnNoYXBlLmxlbmd0aCk7XG4gICAgfVxuICAgIGJhY2tlbmRfdXRpbC5hc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcygnYXJnTWF4JywgW2F4ZXNbMF1dLCAkeC5zaGFwZS5sZW5ndGgpO1xuICAgIGNvbnN0IG91dCA9IGFyZ01pbk1heFJlZHVjZShiYWNrZW5kLCAkeCwgYXhlc1swXSwgJ21heCcpO1xuICAgIGludGVybWVkaWF0ZVRlbnNvckluZm9zLmZvckVhY2godCA9PiBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHQpKTtcbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IGFyZ01heENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBBcmdNYXgsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogYXJnTWF4XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXJnTWF4LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEFyZ01pbiwgYmFja2VuZF91dGlsLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFyZ01pbk1heFJlZHVjZSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9hcmdfbWluX21heCc7XG5pbXBvcnQgeyB0cmFuc3Bvc2UgfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5leHBvcnQgZnVuY3Rpb24gYXJnTWluKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBheGlzIH0gPSBhdHRycztcbiAgICBsZXQgYXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG4gICAgY29uc3QgcGVybXV0ZWRBeGVzID0gYmFja2VuZF91dGlsLmdldEF4ZXNQZXJtdXRhdGlvbihheGVzLCB4LnNoYXBlLmxlbmd0aCk7XG4gICAgbGV0ICR4ID0geDtcbiAgICBjb25zdCBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcyA9IFtdO1xuICAgIGlmIChwZXJtdXRlZEF4ZXMgIT0gbnVsbCkge1xuICAgICAgICAkeCA9IHRyYW5zcG9zZSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHBlcm06IHBlcm11dGVkQXhlcyB9IH0pO1xuICAgICAgICBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcy5wdXNoKCR4KTtcbiAgICAgICAgYXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRJbm5lck1vc3RBeGVzKGF4ZXMubGVuZ3RoLCAkeC5zaGFwZS5sZW5ndGgpO1xuICAgIH1cbiAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoJ2FyZ01pbicsIFtheGVzWzBdXSwgJHguc2hhcGUubGVuZ3RoKTtcbiAgICBjb25zdCBvdXQgPSBhcmdNaW5NYXhSZWR1Y2UoYmFja2VuZCwgJHgsIGF4ZXNbMF0sICdtaW4nKTtcbiAgICBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcy5mb3JFYWNoKHQgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0KSk7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBhcmdNaW5Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQXJnTWluLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGFyZ01pblxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFyZ01pbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBc2luIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHsgQ0hFQ0tfTkFOX1NOSVBQRVQgfSBmcm9tICcuLi91bmFyeW9wX2dwdSc7XG5jb25zdCBBU0lOID0gQ0hFQ0tfTkFOX1NOSVBQRVQgKyBgXG4gIGlmIChhYnMoeCkgPiAxLikge1xuICAgIHJldHVybiBOQU47XG4gIH1cbiAgcmV0dXJuIGFzaW4oeCk7XG5gO1xuZXhwb3J0IGNvbnN0IGFzaW4gPSB1bmFyeUtlcm5lbEZ1bmMoeyBvcFNuaXBwZXQ6IEFTSU4gfSk7XG5leHBvcnQgY29uc3QgYXNpbkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBBc2luLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGFzaW4sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXNpbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBc2luaCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7IENIRUNLX05BTl9TTklQUEVUIH0gZnJvbSAnLi4vdW5hcnlvcF9ncHUnO1xuY29uc3QgQVNJTkggPSBDSEVDS19OQU5fU05JUFBFVCArIGByZXR1cm4gbG9nKHggKyBzcXJ0KHggKiB4ICsgMS4wKSk7YDtcbmV4cG9ydCBjb25zdCBhc2luaCA9IHVuYXJ5S2VybmVsRnVuYyh7IG9wU25pcHBldDogQVNJTkggfSk7XG5leHBvcnQgY29uc3QgYXNpbmhDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQXNpbmgsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogYXNpbmgsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXNpbmguanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQXRhbiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7IENIRUNLX05BTl9TTklQUEVUIH0gZnJvbSAnLi4vdW5hcnlvcF9ncHUnO1xuY29uc3QgQVRBTiA9IENIRUNLX05BTl9TTklQUEVUICsgYFxuICByZXR1cm4gYXRhbih4KTtcbmA7XG5leHBvcnQgY29uc3QgYXRhbiA9IHVuYXJ5S2VybmVsRnVuYyh7IG9wU25pcHBldDogQVRBTiB9KTtcbmV4cG9ydCBjb25zdCBhdGFuQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEF0YW4sXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogYXRhbixcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BdGFuLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEF0YW4yIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMsIENIRUNLX05BTl9TTklQUEVUX0JJTkFSWSwgQ0hFQ0tfTkFOX1NOSVBQRVRfQklOQVJZX1BBQ0tFRCB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuY29uc3QgQVRBTjIgPSBDSEVDS19OQU5fU05JUFBFVF9CSU5BUlkgKyBgXG4gIHJldHVybiBhdGFuKGEsIGIpO1xuYDtcbmNvbnN0IEFUQU4yX1BBQ0tFRCA9IGBcbiAgdmVjNCByZXN1bHQgPSBhdGFuKGEsIGIpO1xuICB2ZWM0IGlzTmFOID0gbWluKHZlYzQoaXNuYW4oYSkpICsgdmVjNChpc25hbihiKSksIHZlYzQoMS4wKSk7XG4gIGAgK1xuICAgIENIRUNLX05BTl9TTklQUEVUX0JJTkFSWV9QQUNLRUQgKyBgXG4gIHJldHVybiByZXN1bHQ7XG5gO1xuZXhwb3J0IGNvbnN0IGF0YW4yID0gYmluYXJ5S2VybmVsRnVuYyh7IG9wU25pcHBldDogQVRBTjIsIHBhY2tlZE9wU25pcHBldDogQVRBTjJfUEFDS0VEIH0pO1xuZXhwb3J0IGNvbnN0IGF0YW4yQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEF0YW4yLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGF0YW4yLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUF0YW4yLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEF0YW5oIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHsgQ0hFQ0tfTkFOX1NOSVBQRVQgfSBmcm9tICcuLi91bmFyeW9wX2dwdSc7XG5jb25zdCBBVEFOSCA9IENIRUNLX05BTl9TTklQUEVUICsgYFxuICBpZiAoKHggPCAtMS4wKSB8fCAoeCA+IDEuMCkpIHJldHVybiBOQU47XG5yZXR1cm4gKGxvZygxLjAgKyB4KSAtIGxvZygxLjAgLSB4KSkgLyAyLjA7YDtcbmV4cG9ydCBjb25zdCBhdGFuaCA9IHVuYXJ5S2VybmVsRnVuYyh7IG9wU25pcHBldDogQVRBTkggfSk7XG5leHBvcnQgY29uc3QgYXRhbmhDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQXRhbmgsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogYXRhbmgsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXRhbmguanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQXZnUG9vbCwgYmFja2VuZF91dGlsLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IFBvb2wyRFByb2dyYW0gfSBmcm9tICcuLi9wb29sX2dwdSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vd2ViZ2xfdXRpbCc7XG5pbXBvcnQgeyBpZGVudGl0eSB9IGZyb20gJy4vSWRlbnRpdHknO1xuZXhwb3J0IGZ1bmN0aW9uIGF2Z1Bvb2woYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBhc3NlcnROb3RDb21wbGV4KHgsICdhdmdQb29sJyk7XG4gICAgY29uc3QgeyBmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSB9ID0gYXR0cnM7XG4gICAgY29uc3QgZGlsYXRpb25zID0gMTtcbiAgICB1dGlsLmFzc2VydChiYWNrZW5kX3V0aWwuZWl0aGVyU3RyaWRlc09yRGlsYXRpb25zQXJlT25lKHN0cmlkZXMsIGRpbGF0aW9ucyksICgpID0+ICdFcnJvciBpbiBhdmdQb29sOiBFaXRoZXIgc3RyaWRlcyBvciBkaWxhdGlvbnMgbXVzdCBiZSAxLiAnICtcbiAgICAgICAgYEdvdCBzdHJpZGVzICR7c3RyaWRlc30gYW5kIGRpbGF0aW9ucyAnJHtkaWxhdGlvbnN9J2ApO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVQb29sMkRJbmZvKHguc2hhcGUsIGZpbHRlclNpemUsIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpO1xuICAgIGlmIChjb252SW5mby5maWx0ZXJXaWR0aCA9PT0gMSAmJiBjb252SW5mby5maWx0ZXJIZWlnaHQgPT09IDEgJiZcbiAgICAgICAgdXRpbC5hcnJheXNFcXVhbChjb252SW5mby5pblNoYXBlLCBjb252SW5mby5vdXRTaGFwZSkpIHtcbiAgICAgICAgcmV0dXJuIGlkZW50aXR5KHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCB9KTtcbiAgICB9XG4gICAgY29uc3QgYXZnUG9vbFByb2dyYW0gPSBuZXcgUG9vbDJEUHJvZ3JhbShjb252SW5mbywgJ2F2ZycsIGZhbHNlKTtcbiAgICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0oYXZnUG9vbFByb2dyYW0sIFt4XSwgJ2Zsb2F0MzInKTtcbn1cbmV4cG9ydCBjb25zdCBhdmdQb29sQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEF2Z1Bvb2wsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogYXZnUG9vbFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUF2Z1Bvb2wuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQXZnUG9vbDNELCBiYWNrZW5kX3V0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgUG9vbDNEUHJvZ3JhbSB9IGZyb20gJy4uL3Bvb2xfZ3B1JztcbmV4cG9ydCBmdW5jdGlvbiBhdmdQb29sM0QoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCBkYXRhRm9ybWF0IH0gPSBhdHRycztcbiAgICBjb25zdCBkaWxhdGlvbnMgPSBbMSwgMSwgMV07XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wzREluZm8oeC5zaGFwZSwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgZGF0YUZvcm1hdCk7XG4gICAgY29uc3QgYXZnUG9vbFByb2dyYW0gPSBuZXcgUG9vbDNEUHJvZ3JhbShjb252SW5mbywgJ2F2ZycsIGZhbHNlKTtcbiAgICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0oYXZnUG9vbFByb2dyYW0sIFt4XSwgJ2Zsb2F0MzInKTtcbn1cbmV4cG9ydCBjb25zdCBhdmdQb29sM0RDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQXZnUG9vbDNELFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGF2Z1Bvb2wzRFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUF2Z1Bvb2wzRC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBdmdQb29sM0RHcmFkLCBiYWNrZW5kX3V0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgQXZnUG9vbDNEQmFja3Byb3BQcm9ncmFtIH0gZnJvbSAnLi4vYXZnX3Bvb2xfYmFja3Byb3BfZ3B1JztcbmV4cG9ydCBmdW5jdGlvbiBhdmdQb29sM0RHcmFkKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBkeSwgaW5wdXQgfSA9IGlucHV0cztcbiAgICBjb25zdCB4ID0gaW5wdXQ7XG4gICAgY29uc3QgeyBmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSB9ID0gYXR0cnM7XG4gICAgY29uc3QgZGlsYXRpb25zID0gWzEsIDEsIDFdO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVQb29sM0RJbmZvKHguc2hhcGUsIGZpbHRlclNpemUsIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpO1xuICAgIGNvbnN0IGF2Z1Bvb2xCYWNrcHJvcFByb2dyYW0gPSBuZXcgQXZnUG9vbDNEQmFja3Byb3BQcm9ncmFtKGNvbnZJbmZvKTtcbiAgICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0oYXZnUG9vbEJhY2twcm9wUHJvZ3JhbSwgW2R5XSwgeC5kdHlwZSk7XG59XG5leHBvcnQgY29uc3QgYXZnUG9vbEdyYWQzRENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBBdmdQb29sM0RHcmFkLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGF2Z1Bvb2wzREdyYWRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BdmdQb29sM0RHcmFkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEF2Z1Bvb2xHcmFkLCBiYWNrZW5kX3V0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgQXZnUG9vbDJEQmFja3Byb3BQcm9ncmFtIH0gZnJvbSAnLi4vYXZnX3Bvb2xfYmFja3Byb3BfZ3B1JztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi93ZWJnbF91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBhdmdQb29sR3JhZChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgZHksIGlucHV0IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeCA9IGlucHV0O1xuICAgIGFzc2VydE5vdENvbXBsZXgoW2R5LCBpbnB1dF0sICdhdmdQb29sR3JhZCcpO1xuICAgIGNvbnN0IHsgZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkIH0gPSBhdHRycztcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlUG9vbDJESW5mbyh4LnNoYXBlLCBmaWx0ZXJTaXplLCBzdHJpZGVzLCAxIC8qIGRpbGF0aW9ucyAqLywgcGFkKTtcbiAgICBjb25zdCBhdmdQb29sQmFja3Byb3BQcm9ncmFtID0gbmV3IEF2Z1Bvb2wyREJhY2twcm9wUHJvZ3JhbShjb252SW5mbyk7XG4gICAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKGF2Z1Bvb2xCYWNrcHJvcFByb2dyYW0sIFtkeV0sIHguZHR5cGUpO1xufVxuZXhwb3J0IGNvbnN0IGF2Z1Bvb2xHcmFkQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEF2Z1Bvb2xHcmFkLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGF2Z1Bvb2xHcmFkXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXZnUG9vbEdyYWQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQmF0Y2hNYXRNdWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYmF0Y2hNYXRNdWxJbXBsIH0gZnJvbSAnLi9CYXRjaE1hdE11bF9pbXBsJztcbmV4cG9ydCBmdW5jdGlvbiBiYXRjaE1hdE11bChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgYSwgYiB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgdHJhbnNwb3NlQSwgdHJhbnNwb3NlQiB9ID0gYXR0cnM7XG4gICAgcmV0dXJuIGJhdGNoTWF0TXVsSW1wbCh7IGEsIGIsIHRyYW5zcG9zZUEsIHRyYW5zcG9zZUIsIGJhY2tlbmQgfSk7XG59XG5leHBvcnQgY29uc3QgYmF0Y2hNYXRNdWxDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQmF0Y2hNYXRNdWwsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogYmF0Y2hNYXRNdWwsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QmF0Y2hNYXRNdWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgdXBjYXN0VHlwZSwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBtYXBBY3RpdmF0aW9uVG9TaGFkZXJQcm9ncmFtIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQgeyBNYXRNdWxQYWNrZWRQcm9ncmFtIH0gZnJvbSAnLi4vbXVsbWF0X3BhY2tlZF9ncHUnO1xuaW1wb3J0IHsgbXVsdGlwbHkgfSBmcm9tICcuL011bHRpcGx5JztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHsgc3VtIH0gZnJvbSAnLi9TdW0nO1xuaW1wb3J0IHsgdHJhbnNwb3NlIH0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuLy8gRW1waXJpY2FsbHkgZGV0ZXJtaW5lZCBtaW5pbWFsIHNoYXJlZCBkaW1lbnNpb24gaW4gbWF0bXVsIGJlZm9yZSB3ZSBmb3J3YXJkXG4vLyB0byBhLm11bChiKS5zdW0oKSBpbiBvcmRlciB0byB0YWtlIGFkdmFudGFnZSBvZiBHUFUgcGFyYWxsZWxpc20uIFNlZVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGZqcy1jb3JlL3B1bGwvMTM3OSBmb3IgYmVuY2htYXJrcy5cbmV4cG9ydCBjb25zdCBNQVRNVUxfU0hBUkVEX0RJTV9USFJFU0hPTEQgPSAxMDAwO1xuZXhwb3J0IGZ1bmN0aW9uIGJhdGNoTWF0TXVsSW1wbCh7IGEsIGIsIHRyYW5zcG9zZUEsIHRyYW5zcG9zZUIsIGJhY2tlbmQsIGJpYXMgPSBudWxsLCBwcmVsdUFjdGl2YXRpb25XZWlnaHRzID0gbnVsbCwgbGVha3lyZWx1QWxwaGEgPSAwLCBhY3RpdmF0aW9uID0gbnVsbCB9KSB7XG4gICAgY29uc3QgYVJhbmsgPSBhLnNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBiUmFuayA9IGIuc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IGlubmVyU2hhcGVBID0gdHJhbnNwb3NlQSA/IGEuc2hhcGVbYVJhbmsgLSAyXSA6IGEuc2hhcGVbYVJhbmsgLSAxXTtcbiAgICBjb25zdCBpbm5lclNoYXBlQiA9IHRyYW5zcG9zZUIgPyBiLnNoYXBlW2JSYW5rIC0gMV0gOiBiLnNoYXBlW2JSYW5rIC0gMl07XG4gICAgY29uc3Qgb3V0ZXJTaGFwZUEgPSB0cmFuc3Bvc2VBID8gYS5zaGFwZVthUmFuayAtIDFdIDogYS5zaGFwZVthUmFuayAtIDJdO1xuICAgIGNvbnN0IG91dGVyU2hhcGVCID0gdHJhbnNwb3NlQiA/IGIuc2hhcGVbYlJhbmsgLSAyXSA6IGIuc2hhcGVbYlJhbmsgLSAxXTtcbiAgICBjb25zdCBvdXRlckRpbXNBID0gYS5zaGFwZS5zbGljZSgwLCAtMik7XG4gICAgY29uc3Qgb3V0ZXJEaW1zQiA9IGIuc2hhcGUuc2xpY2UoMCwgLTIpO1xuICAgIGNvbnN0IGJhdGNoRGltQSA9IHV0aWwuc2l6ZUZyb21TaGFwZShvdXRlckRpbXNBKTtcbiAgICBjb25zdCBiYXRjaERpbUIgPSB1dGlsLnNpemVGcm9tU2hhcGUob3V0ZXJEaW1zQik7XG4gICAgY29uc3QgYmF0Y2hEaW1zQ29tcGF0aWJsZSA9IGJhdGNoRGltQSA9PT0gYmF0Y2hEaW1CIHx8IGJhdGNoRGltQSA9PT0gMSB8fCBiYXRjaERpbUIgPT09IDE7XG4gICAgdXRpbC5hc3NlcnQoYVJhbmsgPj0gMiAmJiBiUmFuayA+PSAyICYmIGJhdGNoRGltc0NvbXBhdGlibGUsICgpID0+IGBFcnJvciBpbiBtYXRNdWw6IHRoZSBpbnB1dCBiYXRjaCBkaW1lbnNpb25zIG11c3QgZWl0aGVyIGJlIHRoZSBgICtcbiAgICAgICAgYHNhbWUgb3IgYXQgbGVhc3Qgb25lIGlucHV0IGJhdGNoIGRpbWVuc2lvbiBtdXN0IGJlIDEuIEdvdCBpbnB1dCBgICtcbiAgICAgICAgYGJhdGNoIGRpbWVuc2lvbnMgb2YgKCR7b3V0ZXJEaW1zQX0pIGFuZCAoJHtvdXRlckRpbXNCfSkuYCk7XG4gICAgY29uc3Qgb3V0U2hhcGVPdXRlckRpbXMgPSBiYXRjaERpbUEgPiBiYXRjaERpbUIgPyBhLnNoYXBlLnNsaWNlKDAsIC0yKSA6IGIuc2hhcGUuc2xpY2UoMCwgLTIpO1xuICAgIGNvbnN0IG91dFNoYXBlID0gb3V0U2hhcGVPdXRlckRpbXMuY29uY2F0KFtvdXRlclNoYXBlQSwgb3V0ZXJTaGFwZUJdKTtcbiAgICB1dGlsLmFzc2VydChpbm5lclNoYXBlQSA9PT0gaW5uZXJTaGFwZUIsICgpID0+IGBFcnJvciBpbiBtYXRNdWw6IGlubmVyIHNoYXBlcyAoJHtpbm5lclNoYXBlQX0pIGFuZCAoYCArXG4gICAgICAgIGAke2lubmVyU2hhcGVCfSkgb2YgVGVuc29ycyB3aXRoIHNoYXBlcyAke2Euc2hhcGV9IGFuZCBgICtcbiAgICAgICAgYCR7Yi5zaGFwZX0gYW5kIHRyYW5zcG9zZUE9JHt0cmFuc3Bvc2VBfWAgK1xuICAgICAgICBgIGFuZCB0cmFuc3Bvc2VCPSR7dHJhbnNwb3NlQn0gbXVzdCBtYXRjaC5gKTtcbiAgICBjb25zdCBhM2RTaGFwZSA9IHRyYW5zcG9zZUEgP1xuICAgICAgICBbYmF0Y2hEaW1BLCBpbm5lclNoYXBlQSwgb3V0ZXJTaGFwZUFdIDpcbiAgICAgICAgW2JhdGNoRGltQSwgb3V0ZXJTaGFwZUEsIGlubmVyU2hhcGVBXTtcbiAgICBjb25zdCBiM2RTaGFwZSA9IHRyYW5zcG9zZUIgP1xuICAgICAgICBbYmF0Y2hEaW1CLCBvdXRlclNoYXBlQiwgaW5uZXJTaGFwZUJdIDpcbiAgICAgICAgW2JhdGNoRGltQiwgaW5uZXJTaGFwZUIsIG91dGVyU2hhcGVCXTtcbiAgICAvLyBUaGUgcmVzdCBvZiB0aGUgaW1wbGVtZW50YXRpb24gaXMgZGVzaWduZWQgdG8gb3BlcmF0ZSBvbiByYW5rLTMgdGVuc29yc1xuICAgIGNvbnN0IGEzZCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogYSB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogYTNkU2hhcGUgfSB9KTtcbiAgICBjb25zdCBiM2QgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IGIgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IGIzZFNoYXBlIH0gfSk7XG4gICAgY29uc3QgaW50ZXJtZWRpYXRlcyA9IFthM2QsIGIzZF07XG4gICAgY29uc3QgYmF0Y2hEaW0gPSBNYXRoLm1heChiYXRjaERpbUEsIGJhdGNoRGltQik7XG4gICAgY29uc3Qgc2hhcmVkRGltID0gdHJhbnNwb3NlQSA/IGEzZC5zaGFwZVsxXSA6IGEzZC5zaGFwZVsyXTtcbiAgICBjb25zdCBoYXNCaWFzID0gYmlhcyAhPSBudWxsO1xuICAgIGNvbnN0IGhhc1ByZWx1QWN0aXZhdGlvbldlaWdodHMgPSBwcmVsdUFjdGl2YXRpb25XZWlnaHRzICE9IG51bGw7XG4gICAgY29uc3QgaGFzTGVha3lyZWx1QWxwaGEgPSBhY3RpdmF0aW9uID09PSAnbGVha3lyZWx1JztcbiAgICBjb25zdCBmdXNlZEFjdGl2YXRpb24gPSBhY3RpdmF0aW9uICE9IG51bGwgP1xuICAgICAgICBtYXBBY3RpdmF0aW9uVG9TaGFkZXJQcm9ncmFtKGFjdGl2YXRpb24sIHRydWUpIDpcbiAgICAgICAgbnVsbDtcbiAgICBjb25zdCBjb250YWluc0Z1c2VkT3BzID0gaGFzQmlhcyB8fCBoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzIHx8XG4gICAgICAgIGhhc0xlYWt5cmVsdUFscGhhIHx8IGZ1c2VkQWN0aXZhdGlvbiAhPSBudWxsO1xuICAgIGxldCBvdXQ7XG4gICAgLy8gU2luY2UgdGhlIG1hdHJpY2VzIGFyZSB2ZWN0b3JzLCBpdCBpcyBmYXN0ZXIgdG8gY2FsbCBtdWwoKS5zdW0oKVxuICAgIC8vIGJlY2F1c2Ugc3VtKCkgaXMgTyhzcXJ0KE4pKSBkdWUgdG8gZGl2aWRlLWFuZC1jb25xdWVyLlxuICAgIGlmICgob3V0ZXJTaGFwZUEgPT09IDEgfHwgb3V0ZXJTaGFwZUIgPT09IDEpICYmXG4gICAgICAgIHNoYXJlZERpbSA+IE1BVE1VTF9TSEFSRURfRElNX1RIUkVTSE9MRCAmJiBjb250YWluc0Z1c2VkT3BzID09PSBmYWxzZSkge1xuICAgICAgICBsZXQgYVZlYyA9IGEzZDtcbiAgICAgICAgbGV0IGJWZWMgPSBiM2Q7XG4gICAgICAgIGlmICh0cmFuc3Bvc2VBKSB7XG4gICAgICAgICAgICBhVmVjID0gdHJhbnNwb3NlKHsgaW5wdXRzOiB7IHg6IGEzZCB9LCBiYWNrZW5kLCBhdHRyczogeyBwZXJtOiBbMCwgMiwgMV0gfSB9KTtcbiAgICAgICAgICAgIGludGVybWVkaWF0ZXMucHVzaChhVmVjKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhbnNwb3NlQikge1xuICAgICAgICAgICAgYlZlYyA9IHRyYW5zcG9zZSh7IGlucHV0czogeyB4OiBiM2QgfSwgYmFja2VuZCwgYXR0cnM6IHsgcGVybTogWzAsIDIsIDFdIH0gfSk7XG4gICAgICAgICAgICBpbnRlcm1lZGlhdGVzLnB1c2goYlZlYyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2hvdWxkUmVzaGFwZUEgPSBvdXRlclNoYXBlQiAhPT0gMTtcbiAgICAgICAgY29uc3Qgc2hvdWxkUmVzaGFwZUIgPSBvdXRlclNoYXBlQiA9PT0gMTtcbiAgICAgICAgbGV0IGFWZWMzZCA9IGFWZWM7XG4gICAgICAgIGlmIChzaG91bGRSZXNoYXBlQSkge1xuICAgICAgICAgICAgYVZlYzNkID0gcmVzaGFwZSh7XG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7IHg6IGFWZWMgfSxcbiAgICAgICAgICAgICAgICBiYWNrZW5kLFxuICAgICAgICAgICAgICAgIGF0dHJzOiB7IHNoYXBlOiBbYmF0Y2hEaW0sIHNoYXJlZERpbSwgMV0gfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpbnRlcm1lZGlhdGVzLnB1c2goYVZlYzNkKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBheGlzID0gb3V0ZXJTaGFwZUIgPT09IDEgPyAyIDogMTtcbiAgICAgICAgbGV0IGJWZWMzZCA9IGJWZWM7XG4gICAgICAgIGlmIChzaG91bGRSZXNoYXBlQikge1xuICAgICAgICAgICAgYlZlYzNkID0gcmVzaGFwZSh7XG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7IHg6IGJWZWMgfSxcbiAgICAgICAgICAgICAgICBiYWNrZW5kLFxuICAgICAgICAgICAgICAgIGF0dHJzOiB7IHNoYXBlOiBbYmF0Y2hEaW0sIDEsIHNoYXJlZERpbV0gfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpbnRlcm1lZGlhdGVzLnB1c2goYlZlYzNkKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9kdWN0ID0gbXVsdGlwbHkoeyBpbnB1dHM6IHsgYTogYVZlYzNkLCBiOiBiVmVjM2QgfSwgYmFja2VuZCB9KTtcbiAgICAgICAgb3V0ID0gc3VtKHsgaW5wdXRzOiB7IHg6IHByb2R1Y3QgfSwgYmFja2VuZCwgYXR0cnM6IHsgYXhpcywga2VlcERpbXM6IHRydWUgfSB9KTtcbiAgICAgICAgaW50ZXJtZWRpYXRlcy5wdXNoKHByb2R1Y3QpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgZHR5cGUgPSB1cGNhc3RUeXBlKGEuZHR5cGUsIGIuZHR5cGUpO1xuICAgICAgICBjb25zdCBwcm9ncmFtID0gbmV3IE1hdE11bFBhY2tlZFByb2dyYW0oYTNkU2hhcGUsIGIzZFNoYXBlLCBbYmF0Y2hEaW0sIG91dGVyU2hhcGVBLCBvdXRlclNoYXBlQl0sIHRyYW5zcG9zZUEsIHRyYW5zcG9zZUIsIGhhc0JpYXMsIGZ1c2VkQWN0aXZhdGlvbiwgaGFzUHJlbHVBY3RpdmF0aW9uV2VpZ2h0cywgaGFzTGVha3lyZWx1QWxwaGEpO1xuICAgICAgICBjb25zdCBpbnB1dHMgPSBbYTNkLCBiM2RdO1xuICAgICAgICBpZiAoYmlhcyAhPSBudWxsKSB7XG4gICAgICAgICAgICBpbnB1dHMucHVzaChiaWFzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzUHJlbHVBY3RpdmF0aW9uV2VpZ2h0cykge1xuICAgICAgICAgICAgaW5wdXRzLnB1c2gocHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc0xlYWt5cmVsdUFscGhhKSB7XG4gICAgICAgICAgICBjb25zdCAkbGVha3lyZWx1QWxwaGEgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtdLCAnZmxvYXQzMicsIHV0aWwuY3JlYXRlU2NhbGFyVmFsdWUobGVha3lyZWx1QWxwaGEsICdmbG9hdDMyJykpO1xuICAgICAgICAgICAgaW5wdXRzLnB1c2goJGxlYWt5cmVsdUFscGhhKTtcbiAgICAgICAgICAgIGludGVybWVkaWF0ZXMucHVzaCgkbGVha3lyZWx1QWxwaGEpO1xuICAgICAgICB9XG4gICAgICAgIG91dCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIGlucHV0cywgZHR5cGUpO1xuICAgIH1cbiAgICBjb25zdCBvdXRSZXNoYXBlZCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogb3V0IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBvdXRTaGFwZSB9IH0pO1xuICAgIGludGVybWVkaWF0ZXMucHVzaChvdXQpO1xuICAgIGZvciAoY29uc3QgaSBvZiBpbnRlcm1lZGlhdGVzKSB7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaSk7XG4gICAgfVxuICAgIHJldHVybiBvdXRSZXNoYXBlZDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJhdGNoTWF0TXVsX2ltcGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZW52LCBGdXNlZEJhdGNoTm9ybSwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBCYXRjaE5vcm1Qcm9ncmFtIH0gZnJvbSAnLi4vYmF0Y2hub3JtX2dwdSc7XG5pbXBvcnQgeyBCYXRjaE5vcm1QYWNrZWRQcm9ncmFtIH0gZnJvbSAnLi4vYmF0Y2hub3JtX3BhY2tlZF9ncHUnO1xuZXhwb3J0IGNvbnN0IGJhdGNoTm9ybSA9ICh7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSkgPT4ge1xuICAgIGNvbnN0IHsgeCwgbWVhbiwgdmFyaWFuY2UsIG9mZnNldCwgc2NhbGUgfSA9IGlucHV0cztcbiAgICB1dGlsLmFzc2VydChtZWFuLnNoYXBlLmxlbmd0aCA9PT0gdmFyaWFuY2Uuc2hhcGUubGVuZ3RoLCAoKSA9PiAnQmF0Y2ggbm9ybWFsaXphdGlvbiBncmFkaWVudCByZXF1aXJlcyBtZWFuIGFuZCB2YXJpYW5jZSB0byBoYXZlICcgK1xuICAgICAgICAnZXF1YWwgcmFua3MuJyk7XG4gICAgdXRpbC5hc3NlcnQob2Zmc2V0ID09IG51bGwgfHwgbWVhbi5zaGFwZS5sZW5ndGggPT09IG9mZnNldC5zaGFwZS5sZW5ndGgsICgpID0+ICdCYXRjaCBub3JtYWxpemF0aW9uIGdyYWRpZW50IHJlcXVpcmVzIG1lYW4gYW5kIG9mZnNldCB0byBoYXZlICcgK1xuICAgICAgICAnZXF1YWwgcmFua3MuJyk7XG4gICAgdXRpbC5hc3NlcnQoc2NhbGUgPT0gbnVsbCB8fCBtZWFuLnNoYXBlLmxlbmd0aCA9PT0gc2NhbGUuc2hhcGUubGVuZ3RoLCAoKSA9PiAnQmF0Y2ggbm9ybWFsaXphdGlvbiBncmFkaWVudCByZXF1aXJlcyBtZWFuIGFuZCBzY2FsZSB0byBoYXZlICcgK1xuICAgICAgICAnZXF1YWwgcmFua3MuJyk7XG4gICAgbGV0IHsgdmFyaWFuY2VFcHNpbG9uIH0gPSBhdHRycztcbiAgICBpZiAodmFyaWFuY2VFcHNpbG9uID09IG51bGwpIHtcbiAgICAgICAgdmFyaWFuY2VFcHNpbG9uID0gMC4wMDE7XG4gICAgfVxuICAgIGNvbnN0IGZpbmFsSW5wdXRzID0gW3gsIG1lYW4sIHZhcmlhbmNlXTtcbiAgICBsZXQgb2Zmc2V0U2hhcGUgPSBudWxsO1xuICAgIGlmIChvZmZzZXQgIT0gbnVsbCkge1xuICAgICAgICBvZmZzZXRTaGFwZSA9IG9mZnNldC5zaGFwZTtcbiAgICAgICAgZmluYWxJbnB1dHMucHVzaChvZmZzZXQpO1xuICAgIH1cbiAgICBsZXQgc2NhbGVTaGFwZSA9IG51bGw7XG4gICAgaWYgKHNjYWxlICE9IG51bGwpIHtcbiAgICAgICAgc2NhbGVTaGFwZSA9IHNjYWxlLnNoYXBlO1xuICAgICAgICBmaW5hbElucHV0cy5wdXNoKHNjYWxlKTtcbiAgICB9XG4gICAgY29uc3QgcHJvZ3JhbSA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfTk9STUFMSVpBVElPTicpID9cbiAgICAgICAgbmV3IEJhdGNoTm9ybVBhY2tlZFByb2dyYW0oeC5zaGFwZSwgbWVhbi5zaGFwZSwgdmFyaWFuY2Uuc2hhcGUsIG9mZnNldFNoYXBlLCBzY2FsZVNoYXBlLCB2YXJpYW5jZUVwc2lsb24pIDpcbiAgICAgICAgbmV3IEJhdGNoTm9ybVByb2dyYW0oeC5zaGFwZSwgbWVhbi5zaGFwZSwgdmFyaWFuY2Uuc2hhcGUsIG9mZnNldFNoYXBlLCBzY2FsZVNoYXBlLCB2YXJpYW5jZUVwc2lsb24pO1xuICAgIGNvbnN0IG91dHB1dCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIGZpbmFsSW5wdXRzLCBmaW5hbElucHV0c1swXS5kdHlwZSk7XG4gICAgcmV0dXJuIG91dHB1dDtcbn07XG5leHBvcnQgY29uc3QgYmF0Y2hOb3JtQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEZ1c2VkQmF0Y2hOb3JtLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGJhdGNoTm9ybSxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1CYXRjaE5vcm0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBCYXRjaFRvU3BhY2VORCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7IHNsaWNlIH0gZnJvbSAnLi9TbGljZSc7XG5pbXBvcnQgeyB0cmFuc3Bvc2UgfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5leHBvcnQgY29uc3QgYmF0Y2hUb1NwYWNlTkQgPSAoYXJncykgPT4ge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGJsb2NrU2hhcGUsIGNyb3BzIH0gPSBhdHRycztcbiAgICB1dGlsLmFzc2VydCh4LnNoYXBlLmxlbmd0aCA8PSA0LCAoKSA9PiAnYmF0Y2hUb1NwYWNlTkQgZm9yIHJhbmsgPiA0IHdpdGggYSBXZWJHTCBiYWNrZW5kIG5vdCAnICtcbiAgICAgICAgJ2ltcGxlbWVudGVkIHlldCcpO1xuICAgIGNvbnN0IHByb2QgPSBibG9ja1NoYXBlLnJlZHVjZSgoYSwgYikgPT4gYSAqIGIpO1xuICAgIGNvbnN0IHJlc2hhcGVkID0gYmFja2VuZF91dGlsLmdldFJlc2hhcGVkKHguc2hhcGUsIGJsb2NrU2hhcGUsIHByb2QpO1xuICAgIGNvbnN0IHBlcm11dGVkID0gYmFja2VuZF91dGlsLmdldFBlcm11dGVkKHJlc2hhcGVkLmxlbmd0aCwgYmxvY2tTaGFwZS5sZW5ndGgpO1xuICAgIGNvbnN0IHJlc2hhcGVkUGVybXV0ZWQgPSBiYWNrZW5kX3V0aWwuZ2V0UmVzaGFwZWRQZXJtdXRlZCh4LnNoYXBlLCBibG9ja1NoYXBlLCBwcm9kKTtcbiAgICBjb25zdCBzbGljZUJlZ2luQ29vcmRzID0gYmFja2VuZF91dGlsLmdldFNsaWNlQmVnaW5Db29yZHMoY3JvcHMsIGJsb2NrU2hhcGUubGVuZ3RoKTtcbiAgICBjb25zdCBzbGljZVNpemUgPSBiYWNrZW5kX3V0aWwuZ2V0U2xpY2VTaXplKHJlc2hhcGVkUGVybXV0ZWQsIGNyb3BzLCBibG9ja1NoYXBlLmxlbmd0aCk7XG4gICAgY29uc3QgdG9EaXNwb3NlID0gW107XG4gICAgY29uc3QgcmVzaGFwZWRJbnRlcm1lZGlhdGUgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IHJlc2hhcGVkIH0gfSk7XG4gICAgY29uc3QgdHJhbnNwb3NlZEludGVybWVkaWF0ZSA9IHRyYW5zcG9zZSh7IGlucHV0czogeyB4OiByZXNoYXBlZEludGVybWVkaWF0ZSB9LCBiYWNrZW5kLCBhdHRyczogeyBwZXJtOiBwZXJtdXRlZCB9IH0pO1xuICAgIGNvbnN0IHJlc2hhcGVkSW50ZXJtZWRpYXRlMiA9IHJlc2hhcGUoe1xuICAgICAgICBpbnB1dHM6IHsgeDogdHJhbnNwb3NlZEludGVybWVkaWF0ZSB9LFxuICAgICAgICBiYWNrZW5kLFxuICAgICAgICBhdHRyczogeyBzaGFwZTogcmVzaGFwZWRQZXJtdXRlZCB9XG4gICAgfSk7XG4gICAgY29uc3Qgc2xpY2VkID0gc2xpY2Uoe1xuICAgICAgICBpbnB1dHM6IHsgeDogcmVzaGFwZWRJbnRlcm1lZGlhdGUyIH0sXG4gICAgICAgIGJhY2tlbmQsXG4gICAgICAgIGF0dHJzOiB7IGJlZ2luOiBzbGljZUJlZ2luQ29vcmRzLCBzaXplOiBzbGljZVNpemUgfVxuICAgIH0pO1xuICAgIHRvRGlzcG9zZS5wdXNoKHJlc2hhcGVkSW50ZXJtZWRpYXRlKTtcbiAgICB0b0Rpc3Bvc2UucHVzaCh0cmFuc3Bvc2VkSW50ZXJtZWRpYXRlKTtcbiAgICB0b0Rpc3Bvc2UucHVzaChyZXNoYXBlZEludGVybWVkaWF0ZTIpO1xuICAgIHRvRGlzcG9zZS5mb3JFYWNoKHQgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0KSk7XG4gICAgcmV0dXJuIHNsaWNlZDtcbn07XG5leHBvcnQgY29uc3QgYmF0Y2hUb1NwYWNlTkRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQmF0Y2hUb1NwYWNlTkQsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogYmF0Y2hUb1NwYWNlTkRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1CYXRjaFRvU3BhY2VORC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBCaW5jb3VudCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBiaW5jb3VudEltcGxDUFUgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmV4cG9ydCBmdW5jdGlvbiBiaW5jb3VudChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCwgd2VpZ2h0cyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgc2l6ZSB9ID0gYXR0cnM7XG4gICAgY29uc3QgeFZhbHMgPSBiYWNrZW5kLnJlYWRTeW5jKHguZGF0YUlkKTtcbiAgICBjb25zdCB3ZWlnaHRzVmFscyA9IGJhY2tlbmQucmVhZFN5bmMod2VpZ2h0cy5kYXRhSWQpO1xuICAgIGNvbnN0IG91dFZhbHMgPSBiaW5jb3VudEltcGxDUFUoeFZhbHMsIHdlaWdodHNWYWxzLCB3ZWlnaHRzLmR0eXBlLCB3ZWlnaHRzLnNoYXBlLCBzaXplKTtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbc2l6ZV0sIHdlaWdodHMuZHR5cGUsIG91dFZhbHMpO1xufVxuZXhwb3J0IGNvbnN0IGJpbmNvdW50Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEJpbmNvdW50LFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGJpbmNvdW50XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QmluY291bnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IENhc3QsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY29tcGxleCB9IGZyb20gJy4vQ29tcGxleCc7XG5pbXBvcnQgeyBpZGVudGl0eSB9IGZyb20gJy4vSWRlbnRpdHknO1xuaW1wb3J0IHsgbm90RXF1YWwgfSBmcm9tICcuL05vdEVxdWFsJztcbmltcG9ydCB7IHJlYWwgfSBmcm9tICcuL1JlYWwnO1xuaW1wb3J0IHsgaW50IH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2ludCc7XG5leHBvcnQgZnVuY3Rpb24gY2FzdChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgZHR5cGUgfSA9IGF0dHJzO1xuICAgIC8vIENhc3RpbmcgdG8gY29tcGxleDY0LlxuICAgIGlmIChkdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgaWYgKHguZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICAgICAgICByZXR1cm4gaWRlbnRpdHkoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRPRE8oYW5ueGluZ3l1YW4pOiBJbXBvcnQga2VybmVsIGZ1bmN0aW9uIG9uY2UgemVyb3MgaXMgbW9kdWxhcml6ZWQuXG4gICAgICAgIGNvbnN0IHplcm9zVGVuc29yID0gdGYuemVyb3MoeC5zaGFwZSk7XG4gICAgICAgIGNvbnN0IGZsb2F0WCA9IGNhc3QoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kLCBhdHRyczogeyBkdHlwZTogJ2Zsb2F0MzInIH0gfSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBsZXgoeyBpbnB1dHM6IHsgcmVhbDogZmxvYXRYLCBpbWFnOiB6ZXJvc1RlbnNvciB9LCBiYWNrZW5kIH0pO1xuICAgICAgICB6ZXJvc1RlbnNvci5kaXNwb3NlKCk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oZmxvYXRYKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLy8gQ2FzdGluZyBmcm9tIGNvbXBsZXg2NFxuICAgIGlmICh4LmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICBjb25zdCByZWFsUGFydCA9IHJlYWwoeyBpbnB1dHM6IHsgaW5wdXQ6IHggfSwgYmFja2VuZCB9KTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY2FzdCh7IGlucHV0czogeyB4OiByZWFsUGFydCB9LCBiYWNrZW5kLCBhdHRyczogeyBkdHlwZSB9IH0pO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlYWxQYXJ0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgaWYgKCF1dGlsLmhhc0VuY29kaW5nTG9zcyh4LmR0eXBlLCBkdHlwZSkpIHtcbiAgICAgICAgLy8gV2UgZG9uJ3QgY2hhbmdlIHRoZSB1bmRlcmx5aW5nIGRhdGEsIHNpbmNlIHdlIGNhc3QgdG8gaGlnaGVyXG4gICAgICAgIC8vIHByZWNpc2lvbi5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gaWRlbnRpdHkoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kIH0pO1xuICAgICAgICByZXR1cm4geyBkYXRhSWQ6IHJlc3VsdC5kYXRhSWQsIHNoYXBlOiByZXN1bHQuc2hhcGUsIGR0eXBlIH07XG4gICAgfVxuICAgIGlmIChkdHlwZSA9PT0gJ2ludDMyJykge1xuICAgICAgICByZXR1cm4gaW50KHgsIGJhY2tlbmQpO1xuICAgIH1cbiAgICBpZiAoZHR5cGUgPT09ICdib29sJykge1xuICAgICAgICBjb25zdCB6ZXJvc1RlbnNvckluZm8gPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtdLCAnYm9vbCcsIHV0aWwuZ2V0VHlwZWRBcnJheUZyb21EVHlwZSgnYm9vbCcsIDEpKTtcbiAgICAgICAgY29uc3QgYmluYXJ5SW5wdXRzID0geyBhOiB4LCBiOiB6ZXJvc1RlbnNvckluZm8gfTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbm90RXF1YWwoeyBpbnB1dHM6IGJpbmFyeUlucHV0cywgYmFja2VuZCB9KTtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh6ZXJvc1RlbnNvckluZm8pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIENhc3Q6IGZhaWxlZCB0byBjYXN0ICR7eC5kdHlwZX0gdG8gJHtkdHlwZX1gKTtcbn1cbmV4cG9ydCBjb25zdCBjYXN0Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IENhc3QsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogY2FzdFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNhc3QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQ2VpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7IGNlaWxJbXBsQ1BVIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5jb25zdCBDRUlMID0gYHJldHVybiBjZWlsKHgpO2A7XG5leHBvcnQgY29uc3QgY2VpbCA9IHVuYXJ5S2VybmVsRnVuYyh7IG9wU25pcHBldDogQ0VJTCwgcGFja2VkT3BTbmlwcGV0OiBDRUlMLCBjcHVLZXJuZWxJbXBsOiBjZWlsSW1wbENQVSB9KTtcbmV4cG9ydCBjb25zdCBjZWlsQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IENlaWwsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogY2VpbFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNlaWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQ2xpcEJ5VmFsdWUsIGVudiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBDbGlwUHJvZ3JhbSB9IGZyb20gJy4uL2NsaXBfZ3B1JztcbmltcG9ydCB7IENsaXBQYWNrZWRQcm9ncmFtIH0gZnJvbSAnLi4vY2xpcF9wYWNrZWRfZ3B1JztcbmV4cG9ydCBmdW5jdGlvbiBjbGlwQnlWYWx1ZShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgY2xpcFZhbHVlTWluLCBjbGlwVmFsdWVNYXggfSA9IGF0dHJzO1xuICAgIGxldCBwcm9ncmFtO1xuICAgIGlmIChlbnYoKS5nZXRCb29sKCdXRUJHTF9QQUNLX0NMSVAnKSkge1xuICAgICAgICBwcm9ncmFtID0gbmV3IENsaXBQYWNrZWRQcm9ncmFtKHguc2hhcGUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcHJvZ3JhbSA9IG5ldyBDbGlwUHJvZ3JhbSh4LnNoYXBlKTtcbiAgICB9XG4gICAgY29uc3QgY3VzdG9tVmFsdWVzID0gW1tjbGlwVmFsdWVNaW5dLCBbY2xpcFZhbHVlTWF4XV07XG4gICAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4XSwgeC5kdHlwZSwgY3VzdG9tVmFsdWVzKTtcbn1cbmV4cG9ydCBjb25zdCBjbGlwQnlWYWx1ZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBDbGlwQnlWYWx1ZSxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBjbGlwQnlWYWx1ZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNsaXBCeVZhbHVlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IENvbXBsZXggfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgaWRlbnRpdHkgfSBmcm9tICcuL0lkZW50aXR5Jztcbi8qKlxuICogSW4gV2ViR0wgZGF0YSBpcyBzdG9yZWQgaW4gR1BVIHRleHR1cmVzIHdoaWNoIGNhbid0IGJlIGVmZmljaWVudGx5IGNvcGllZCwgc29cbiAqIGNvbXBsZXggdGVuc29ycyBzaGFyZSBkYXRhIHdpdGggdGhlaXIgcmVhbCBhbmQgaW1hZ2luYXJ5IGNvbXBvbmVudHMuIENvbXBsZXhcbiAqIHRlbnNvcnMnIHJlZmVyZW5jZSB0byB0aGUgY29tcG9uZW50cyBpcyB0cmFja2VkIGJ5IHJlZkNvdW50IG9uIHRoZSBpbmRpdmlkdWFsXG4gKiBjb21wb25lbnQuIFRoZSByZWZDb3VudHMgYXJlIGluY3JlYXNlZCBieSB0aGUgaWRlbnRpdHkgY2FsbC5cbiAqXG4gKiBXaGVuIGEgY29tcGxleCB0ZW5zb3IgaXMgZGlzcG9zZWQsIGl0IHdpbGwgcmVkdWNlIHRoZSByZWZDb3VudCBvbiB0aGVcbiAqIGNvbXBvbmVudHMgYnkgY2FsbGluZyBkaXNwb3NlRGF0YSBvbiBlYWNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcGxleChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyByZWFsLCBpbWFnIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgY29tcGxleEluZm8gPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHJlYWwuc2hhcGUsICdjb21wbGV4NjQnKTtcbiAgICBjb25zdCBjb21wbGV4ID0gYmFja2VuZC50ZXhEYXRhLmdldChjb21wbGV4SW5mby5kYXRhSWQpO1xuICAgIGNvbnN0IHJlYWxUZW5zb3JJbmZvID0gaWRlbnRpdHkoeyBpbnB1dHM6IHsgeDogcmVhbCB9LCBiYWNrZW5kIH0pO1xuICAgIGNvbnN0IGltYWdUZW5zb3JJbmZvID0gaWRlbnRpdHkoeyBpbnB1dHM6IHsgeDogaW1hZyB9LCBiYWNrZW5kIH0pO1xuICAgIGNvbXBsZXguY29tcGxleFRlbnNvckluZm9zID0geyByZWFsOiByZWFsVGVuc29ySW5mbywgaW1hZzogaW1hZ1RlbnNvckluZm8gfTtcbiAgICByZXR1cm4gY29tcGxleEluZm87XG59XG5leHBvcnQgY29uc3QgY29tcGxleENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBDb21wbGV4LFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGNvbXBsZXhcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db21wbGV4LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IENvbXBsZXhBYnMgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgQ29tcGxleEFic1Byb2dyYW0gfSBmcm9tICcuLi9jb21wbGV4X2Fic19ncHUnO1xuLy8gUmV0dXJucyBhIFRlbnNvckluZm8gd2l0aCB0aGUgY29tcGxleCBzaGFwZSBhbmQgdGhlIGRhdGFJZCBvZiB0aGVcbi8vIHVuZGVybHlpbmcgcGFydC4gV2UgbmVlZCB0byBkbyB0aGlzIGJlY2F1c2UgYSByZXNoYXBlZCBjb21wbGV4IHRlbnNvciBpc1xuLy8gbm90IHJlZmxlY3RlZCBpbiBpdHMgcGFydHMuXG5mdW5jdGlvbiBtYWtlQ29tcGxleENvbXBvbmVudFRlbnNvckluZm8oY29tcGxleFRlbnNvciwgY29tcGxleFBhcnQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBkYXRhSWQ6IGNvbXBsZXhQYXJ0LmRhdGFJZCxcbiAgICAgICAgZHR5cGU6IGNvbXBsZXhQYXJ0LmR0eXBlLFxuICAgICAgICBzaGFwZTogY29tcGxleFRlbnNvci5zaGFwZVxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gY29tcGxleEFicyhhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KHguZGF0YUlkKTtcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IENvbXBsZXhBYnNQcm9ncmFtKHguc2hhcGUpO1xuICAgIGNvbnN0IHByb2dyYW1JbnB1dHMgPSBbXG4gICAgICAgIG1ha2VDb21wbGV4Q29tcG9uZW50VGVuc29ySW5mbyh4LCB4RGF0YS5jb21wbGV4VGVuc29ySW5mb3MucmVhbCksXG4gICAgICAgIG1ha2VDb21wbGV4Q29tcG9uZW50VGVuc29ySW5mbyh4LCB4RGF0YS5jb21wbGV4VGVuc29ySW5mb3MuaW1hZyksXG4gICAgXTtcbiAgICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgcHJvZ3JhbUlucHV0cywgcHJvZ3JhbUlucHV0c1swXS5kdHlwZSk7XG59XG5leHBvcnQgY29uc3QgY29tcGxleEFic0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBDb21wbGV4QWJzLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGNvbXBsZXhBYnNcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db21wbGV4QWJzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgQ29uY2F0LCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNvbmNhdEltcGwgfSBmcm9tICcuL0NvbmNhdF9pbXBsJztcbmltcG9ydCB7IGlkZW50aXR5IH0gZnJvbSAnLi9JZGVudGl0eSc7XG5leHBvcnQgZnVuY3Rpb24gY29uY2F0KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBheGlzIH0gPSBhdHRycztcbiAgICBjb25zdCAkYXhpcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgaW5wdXRzWzBdLnNoYXBlKVswXTtcbiAgICBjb25zdCBvdXRTaGFwZSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0U2hhcGUoaW5wdXRzLm1hcCh0ID0+IHQuc2hhcGUpLCAkYXhpcyk7XG4gICAgaWYgKHV0aWwuc2l6ZUZyb21TaGFwZShvdXRTaGFwZSkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0U2hhcGUsIGlucHV0c1swXS5kdHlwZSwgW10pO1xuICAgIH1cbiAgICAvLyBLZWVwIG9ubHkgbm9uLWVtcHR5IHRlbnNvcnMgKGlnbm9yZSB0ZW5zb3JzIHdpdGggMCBpbiB0aGVpciBzaGFwZSkuXG4gICAgY29uc3QgJGlucHV0cyA9IGlucHV0cy5maWx0ZXIodCA9PiB1dGlsLnNpemVGcm9tU2hhcGUodC5zaGFwZSkgPiAwKTtcbiAgICBpZiAoJGlucHV0cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGlkZW50aXR5KHsgaW5wdXRzOiB7IHg6ICRpbnB1dHNbMF0gfSwgYmFja2VuZCB9KTtcbiAgICB9XG4gICAgY29uc3Qgc2hhcGVzID0gJGlucHV0cy5tYXAodCA9PiB0LnNoYXBlKTtcbiAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0UGFyYW1zQ29uc2lzdGVudChzaGFwZXMsICRheGlzKTtcbiAgICByZXR1cm4gY29uY2F0SW1wbCgkaW5wdXRzLCAkYXhpcywgYmFja2VuZCk7XG59XG5leHBvcnQgY29uc3QgY29uY2F0Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IENvbmNhdCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBjb25jYXRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db25jYXQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBlbnYsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgQ29uY2F0UHJvZ3JhbSB9IGZyb20gJy4uL2NvbmNhdF9ncHUnO1xuaW1wb3J0IHsgQ29uY2F0UGFja2VkUHJvZ3JhbSB9IGZyb20gJy4uL2NvbmNhdF9wYWNrZWRfZ3B1JztcbmltcG9ydCB7IGNvbmNhdEltcGxDUFUgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmltcG9ydCB7IGNvbXBsZXggfSBmcm9tICcuL0NvbXBsZXgnO1xuaW1wb3J0IHsgaW1hZyB9IGZyb20gJy4vSW1hZyc7XG5pbXBvcnQgeyByZWFsIH0gZnJvbSAnLi9SZWFsJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmNhdEltcGwoaW5wdXRzLCBheGlzLCBiYWNrZW5kKSB7XG4gICAgY29uc3QgZHR5cGUgPSBpbnB1dHNbMF0uZHR5cGU7XG4gICAgaWYgKGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICBjb25zdCByZWFscyA9IGlucHV0cy5tYXAoKHQpID0+IHJlYWwoeyBpbnB1dHM6IHsgaW5wdXQ6IHQgfSwgYmFja2VuZCB9KSk7XG4gICAgICAgIGNvbnN0IGltYWdzID0gaW5wdXRzLm1hcCgodCkgPT4gaW1hZyh7IGlucHV0czogeyBpbnB1dDogdCB9LCBiYWNrZW5kIH0pKTtcbiAgICAgICAgY29uc3QgcmVhbENvbmNhdGVkID0gY29uY2F0SW1wbChyZWFscywgYXhpcywgYmFja2VuZCk7XG4gICAgICAgIGNvbnN0IGltYWdDb25jYXRlZCA9IGNvbmNhdEltcGwoaW1hZ3MsIGF4aXMsIGJhY2tlbmQpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBjb21wbGV4KHsgaW5wdXRzOiB7IHJlYWw6IHJlYWxDb25jYXRlZCwgaW1hZzogaW1hZ0NvbmNhdGVkIH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIHJlYWxzLmZvckVhY2gociA9PiBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHIpKTtcbiAgICAgICAgaW1hZ3MuZm9yRWFjaChpID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaSkpO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlYWxDb25jYXRlZCk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaW1hZ0NvbmNhdGVkKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgbGV0IHJ1bk9uQ3B1ID0gYmFja2VuZC5zaG91bGRFeGVjdXRlT25DUFUoaW5wdXRzKTtcbiAgICAvLyBSdW4gb24gY3B1IGlmIGR0eXBlIGlzIHN0cmluZy4gRm9yIHN0cmluZywgdGhlIGJhY2tlbmQgcmVwcmVzZW50cyBpdFxuICAgIC8vIGFzIFVpbnQ4QXJyYXlbXSwgd2hlcmUgZWFjaCBVaW50OEFycmF5IGlzIGEgY2hhcmFjdGVyLiBHaXZlbiB0aGF0IHRoZVxuICAgIC8vIGNvbXB1dGF0aW9uIGlzIG9ubHkgb24gdGhlIG91dGVyIGFycmF5LCB1cGxvYWRpbmcgdGhlIHdob2xlIGRhdGEgb250b1xuICAgIC8vIGdwdSBpcyB3YXN0ZWZ1bC4gQWxzbywgY3VycmVudGx5IHdlYmdsIGRvZXNuJ3QgaGF2ZSBhIGRlc2lnbiB0b1xuICAgIC8vIHVwbG9hZCBhbmQgcmV0cmlldmUgVWludDhBcnJheVtdIGJldHdlZW4gY3B1IGFuZCBncHUuIFRoZXJlZm9yZSwgd2VcbiAgICAvLyBqdXN0IHJ1biB0aGUga2VybmVsIG9uIGNwdSBpZiBkdHlwZSBpcyBzdHJpbmcuXG4gICAgaWYgKGR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICBydW5PbkNwdSA9IHRydWU7XG4gICAgfVxuICAgIGlmIChydW5PbkNwdSkge1xuICAgICAgICAvLyBBbnkgY29uY2F0IG9mIG4tZGltZW5zaW9uYWwgdGVuc29ycyBhY3Jvc3MgYW55IGF4aXMgY2FuIGJlIHJlZHVjZWQgdG9cbiAgICAgICAgLy8gYSBjb25jYXRlbmF0aW9uIG9mIHR3by1kaW1lbnNpb25hbCB0ZW5zb3JzIGFjcm9zcyB0aGUgYXhpcyAxIGJ5IGZpcnN0XG4gICAgICAgIC8vIHBhcnRpdGlvbmluZyB0aGUgYXhlcyBvZiB0aGUgb3JpZ2luYWwgdGVuc29ycyBpbnRvIHRob3NlIGxlc3MgdGhhbiB0aGVcbiAgICAgICAgLy8gYXhpcyB0byBiZSBjb25jYXRlbmF0ZWQgYW5kIHRoZSByZXN0LiBUaGVuIHJlc2hhcGUgdGhlIHRlbnNvcnNcbiAgICAgICAgLy8gaW50byBhIHR3by1kaW1lbnNpb25hbCB0ZW5zb3IgYnkgY29sbGFwc2luZyB0aGVzZSB0d28gc2V0cyBvZiBheGVzIGFuZFxuICAgICAgICAvLyBjb25jYXRlbmF0ZSB0aGUgcmVzdWx0aW5nIG1hdHJpY2VzIGFjcm9zcyB0aGUgYXhpcyAxLCBmaW5hbGx5IHJlc2hhcGluZ1xuICAgICAgICAvLyB0aGUgcmVzdWx0IHRvIGhhdmUgdGhlIHByb3BlciBzaGFwZS5cbiAgICAgICAgY29uc3QgdGVuc29yczJEID0gaW5wdXRzLm1hcCh0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlubmVyU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSh0LnNoYXBlLnNsaWNlKGF4aXMpKTtcbiAgICAgICAgICAgIGNvbnN0IHNoYXBlID0gWy0xLCBpbm5lclNpemVdO1xuICAgICAgICAgICAgcmV0dXJuIHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogdCB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZSB9IH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgaW5wdXRzVmFsU2hhcGVzID0gdGVuc29yczJELm1hcCh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHM6IGJhY2tlbmQucmVhZFN5bmModC5kYXRhSWQpLCBzaGFwZTogdC5zaGFwZSB9O1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gQ29uY2F0cyAyZCB0ZW5zb3JzIGFsb25nIGF4aXM9MS5cbiAgICAgICAgY29uc3Qgb3V0U2hhcGUgPSBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dFNoYXBlKHRlbnNvcnMyRC5tYXAodCA9PiB0LnNoYXBlKSwgMSAvKiBheGlzICovKTtcbiAgICAgICAgY29uc3Qgc2ltcGx5Q29uY2F0ID0gdGVuc29yczJEWzBdLnNoYXBlWzBdID09PSAxO1xuICAgICAgICBjb25zdCBvdXRWYWxzID0gY29uY2F0SW1wbENQVShpbnB1dHNWYWxTaGFwZXMsIG91dFNoYXBlLCBkdHlwZSwgc2ltcGx5Q29uY2F0KTtcbiAgICAgICAgY29uc3QgZmluYWxPdXRTaGFwZSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0U2hhcGUoaW5wdXRzLm1hcCh0ID0+IHQuc2hhcGUpLCBheGlzKTtcbiAgICAgICAgY29uc3Qgb3V0SW5mbyA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8oZmluYWxPdXRTaGFwZSwgZHR5cGUsIG91dFZhbHMpO1xuICAgICAgICB0ZW5zb3JzMkQuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuICAgICAgICByZXR1cm4gb3V0SW5mbztcbiAgICB9XG4gICAgaWYgKGlucHV0cy5sZW5ndGggPiBlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX01BWF9URVhUVVJFU19JTl9TSEFERVInKSkge1xuICAgICAgICBjb25zdCBtaWRJbmRleCA9IE1hdGguZmxvb3IoaW5wdXRzLmxlbmd0aCAvIDIpO1xuICAgICAgICBjb25zdCBsZWZ0U2lkZSA9IGNvbmNhdEltcGwoaW5wdXRzLnNsaWNlKDAsIG1pZEluZGV4KSwgYXhpcywgYmFja2VuZCk7XG4gICAgICAgIGNvbnN0IHJpZ2h0U2lkZSA9IGNvbmNhdEltcGwoaW5wdXRzLnNsaWNlKG1pZEluZGV4KSwgYXhpcywgYmFja2VuZCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbmNhdEltcGwoW2xlZnRTaWRlLCByaWdodFNpZGVdLCBheGlzLCBiYWNrZW5kKTtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhsZWZ0U2lkZSk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmlnaHRTaWRlKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgaWYgKGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfQVJSQVlfT1BFUkFUSU9OUycpICYmXG4gICAgICAgIGlucHV0c1swXS5zaGFwZS5sZW5ndGggPiAxKSB7XG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgQ29uY2F0UGFja2VkUHJvZ3JhbShpbnB1dHMubWFwKHQgPT4gdC5zaGFwZSksIGF4aXMpO1xuICAgICAgICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgaW5wdXRzLCBkdHlwZSk7XG4gICAgfVxuICAgIGNvbnN0IHsgdGVuc29yczJELCBvdXRTaGFwZSB9ID0gY29tcHV0ZVRlbnNvcnMyRChpbnB1dHMsIGF4aXMsIGJhY2tlbmQpO1xuICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgQ29uY2F0UHJvZ3JhbSh0ZW5zb3JzMkQubWFwKHQgPT4gdC5zaGFwZSkpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIHRlbnNvcnMyRCwgZHR5cGUpO1xuICAgIHRlbnNvcnMyRC5mb3JFYWNoKHIgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyKSk7XG4gICAgY29uc3QgcmVzaGFwZWRSZXN1bHQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHJlc3VsdCB9LCBhdHRyczogeyBzaGFwZTogb3V0U2hhcGUgfSwgYmFja2VuZCB9KTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc2hhcGVkUmVzdWx0O1xufVxuZnVuY3Rpb24gY29tcHV0ZVRlbnNvcnMyRChpbnB1dHMsIGF4aXMsIGJhY2tlbmQpIHtcbiAgICAvLyBBbnkgY29uY2F0IG9mIG4tZGltZW5zaW9uYWwgdGVuc29ycyBhY3Jvc3MgYW55IGF4aXMgY2FuIGJlIHJlZHVjZWQgdG9cbiAgICAvLyBhIGNvbmNhdGVuYXRpb24gb2YgdHdvLWRpbWVuc2lvbmFsIHRlbnNvcnMgYWNyb3NzIHRoZSBheGlzIDEgYnkgZmlyc3RcbiAgICAvLyBwYXJ0aXRpb25pbmcgdGhlIGF4ZXMgb2YgdGhlIG9yaWdpbmFsIHRlbnNvcnMgaW50byB0aG9zZSBsZXNzIHRoYW4gdGhlXG4gICAgLy8gYXhpcyB0byBiZSBjb25jYXRlbmF0ZWQgYW5kIHRoZSByZXN0LiBUaGVuIHJlc2hhcGUgdGhlIHRlbnNvcnNcbiAgICAvLyBpbnRvIGEgdHdvLWRpbWVuc2lvbmFsIHRlbnNvciBieSBjb2xsYXBzaW5nIHRoZXNlIHR3byBzZXRzIG9mIGF4ZXMgYW5kXG4gICAgLy8gY29uY2F0ZW5hdGUgdGhlIHJlc3VsdGluZyBtYXRyaWNlcyBhY3Jvc3MgdGhlIGF4aXMgMSwgZmluYWxseSByZXNoYXBpbmdcbiAgICAvLyB0aGUgcmVzdWx0IHRvIGhhdmUgdGhlIHByb3BlciBzaGFwZS5cbiAgICBjb25zdCBvdXRTaGFwZSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0U2hhcGUoaW5wdXRzLm1hcCh0ID0+IHQuc2hhcGUpLCBheGlzKTtcbiAgICBjb25zdCB0ZW5zb3JzMkQgPSBpbnB1dHMubWFwKHggPT4gcmVzaGFwZSh7XG4gICAgICAgIGlucHV0czogeyB4IH0sXG4gICAgICAgIGF0dHJzOiB7IHNoYXBlOiBbLTEsIHV0aWwuc2l6ZUZyb21TaGFwZSh4LnNoYXBlLnNsaWNlKGF4aXMpKV0gfSxcbiAgICAgICAgYmFja2VuZFxuICAgIH0pKTtcbiAgICByZXR1cm4geyB0ZW5zb3JzMkQsIG91dFNoYXBlIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db25jYXRfaW1wbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIENvbnYyRCwgZW52IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IENvbnYyRFByb2dyYW0gfSBmcm9tICcuLi9jb252X2dwdSc7XG5pbXBvcnQgeyBjb252MmRCeU1hdE11bCwgY29udjJkV2l0aEltMlJvdyB9IGZyb20gJy4vQ29udjJEX2ltcGwnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5leHBvcnQgZnVuY3Rpb24gY29udjJkKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4LCBmaWx0ZXIgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGlsYXRpb25zLCBkaW1Sb3VuZGluZ01vZGUgfSA9IGF0dHJzO1xuICAgIGNvbnN0ICRkYXRhRm9ybWF0ID0gYmFja2VuZF91dGlsLmNvbnZlcnRDb252MkREYXRhRm9ybWF0KGRhdGFGb3JtYXQpO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252MkRJbmZvKHguc2hhcGUsIGZpbHRlci5zaGFwZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgZmFsc2UgLyogZGVwdGh3aXNlICovLCAkZGF0YUZvcm1hdCk7XG4gICAgbGV0IG91dDtcbiAgICBpZiAoY29udkluZm8uZmlsdGVySGVpZ2h0ID09PSAxICYmIGNvbnZJbmZvLmZpbHRlcldpZHRoID09PSAxICYmXG4gICAgICAgIGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0ID09PSAxICYmIGNvbnZJbmZvLmRpbGF0aW9uV2lkdGggPT09IDEgJiZcbiAgICAgICAgY29udkluZm8uc3RyaWRlSGVpZ2h0ID09PSAxICYmIGNvbnZJbmZvLnN0cmlkZVdpZHRoID09PSAxICYmXG4gICAgICAgIChjb252SW5mby5wYWRJbmZvLnR5cGUgPT09ICdTQU1FJyB8fCBjb252SW5mby5wYWRJbmZvLnR5cGUgPT09ICdWQUxJRCcpKSB7XG4gICAgICAgIG91dCA9IGNvbnYyZEJ5TWF0TXVsKHsgeCwgZmlsdGVyLCBjb252SW5mbywgYmFja2VuZCB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZW52KCkuZ2V0Qm9vbCgnV0VCR0xfQ09OVl9JTTJDT0wnKSAmJiB4LnNoYXBlWzBdID09PSAxKSB7XG4gICAgICAgIG91dCA9IGNvbnYyZFdpdGhJbTJSb3coeyB4LCBmaWx0ZXIsIGNvbnZJbmZvLCBiYWNrZW5kIH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBDb252MkRQcm9ncmFtKGNvbnZJbmZvKTtcbiAgICAgICAgb3V0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3gsIGZpbHRlcl0sICdmbG9hdDMyJyk7XG4gICAgfVxuICAgIGNvbnN0IG91dFJlc2hhcGVkID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiBvdXQgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IGNvbnZJbmZvLm91dFNoYXBlIH0gfSk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhvdXQpO1xuICAgIHJldHVybiBvdXRSZXNoYXBlZDtcbn1cbmV4cG9ydCBjb25zdCBjb252MkRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQ29udjJELFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGNvbnYyZCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db252MkQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBDb252MkRCYWNrcHJvcEZpbHRlciB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBDb252MkREZXJGaWx0ZXJQcm9ncmFtIH0gZnJvbSAnLi4vY29udl9iYWNrcHJvcF9ncHUnO1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnYyREJhY2twcm9wRmlsdGVyKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4LCBkeSB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0LCBkaW1Sb3VuZGluZ01vZGUsIGZpbHRlclNoYXBlIH0gPSBhdHRycztcbiAgICBjb25zdCAkZGF0YUZvcm1hdCA9IGJhY2tlbmRfdXRpbC5jb252ZXJ0Q29udjJERGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyh4LnNoYXBlLCBmaWx0ZXJTaGFwZSwgc3RyaWRlcywgMSAvKiBkaWxhdGlvbnMgKi8sIHBhZCwgZGltUm91bmRpbmdNb2RlLCBmYWxzZSAvKiBkZXB0aHdpc2UgKi8sICRkYXRhRm9ybWF0KTtcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IENvbnYyRERlckZpbHRlclByb2dyYW0oY29udkluZm8pO1xuICAgIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeCwgZHldLCAnZmxvYXQzMicpO1xufVxuZXhwb3J0IGNvbnN0IGNvbnYyREJhY2twcm9wRmlsdGVyQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IENvbnYyREJhY2twcm9wRmlsdGVyLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGNvbnYyREJhY2twcm9wRmlsdGVyLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbnYyREJhY2twcm9wRmlsdGVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgQ29udjJEQmFja3Byb3BJbnB1dCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBDb252MkREZXJJbnB1dFByb2dyYW0gfSBmcm9tICcuLi9jb252X2JhY2twcm9wX2dwdSc7XG5leHBvcnQgZnVuY3Rpb24gY29udjJEQmFja3Byb3BJbnB1dChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgZHksIGZpbHRlciB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgaW5wdXRTaGFwZSwgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0LCBkaW1Sb3VuZGluZ01vZGUgfSA9IGF0dHJzO1xuICAgIGNvbnN0ICRkYXRhRm9ybWF0ID0gYmFja2VuZF91dGlsLmNvbnZlcnRDb252MkREYXRhRm9ybWF0KGRhdGFGb3JtYXQpO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252MkRJbmZvKGlucHV0U2hhcGUsIGZpbHRlci5zaGFwZSwgc3RyaWRlcywgMSAvKiBkaWxhdGlvbnMgKi8sIHBhZCwgZGltUm91bmRpbmdNb2RlLCBmYWxzZSwgJGRhdGFGb3JtYXQpO1xuICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgQ29udjJERGVySW5wdXRQcm9ncmFtKGNvbnZJbmZvKTtcbiAgICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW2R5LCBmaWx0ZXJdLCAnZmxvYXQzMicpO1xufVxuZXhwb3J0IGNvbnN0IGNvbnYyREJhY2twcm9wSW5wdXRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQ29udjJEQmFja3Byb3BJbnB1dCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBjb252MkRCYWNrcHJvcElucHV0LFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbnYyREJhY2twcm9wSW5wdXQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZW52LCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IEltMkNvbFBhY2tlZFByb2dyYW0gfSBmcm9tICcuLi9pbTJjb2xfcGFja2VkX2dwdSc7XG5pbXBvcnQgeyBtYXBBY3RpdmF0aW9uVG9TaGFkZXJQcm9ncmFtIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQgeyBNYXRNdWxQYWNrZWRQcm9ncmFtIH0gZnJvbSAnLi4vbXVsbWF0X3BhY2tlZF9ncHUnO1xuaW1wb3J0ICogYXMgd2ViZ2xfdXRpbCBmcm9tICcuLi93ZWJnbF91dGlsJztcbmltcG9ydCB7IGJhdGNoTWF0TXVsSW1wbCwgTUFUTVVMX1NIQVJFRF9ESU1fVEhSRVNIT0xEIH0gZnJvbSAnLi9CYXRjaE1hdE11bF9pbXBsJztcbmltcG9ydCB7IGlkZW50aXR5IH0gZnJvbSAnLi9JZGVudGl0eSc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbi8vIEZvciAxeDEga2VybmVscyB0aGF0IGl0ZXJhdGUgdGhyb3VnaCBldmVyeSBwb2ludCBpbiB0aGUgaW5wdXQsIGNvbnZvbHV0aW9uXG4vLyBjYW4gYmUgZXhwcmVzc2VkIGFzIG1hdHJpeCBtdWx0aXBsaWNhdGlvbiAod2l0aG91dCBuZWVkIGZvciBtZW1vcnlcbi8vIHJlbWFwcGluZykuXG5leHBvcnQgZnVuY3Rpb24gY29udjJkQnlNYXRNdWwoeyB4LCBmaWx0ZXIsIGNvbnZJbmZvLCBiYWNrZW5kLCBiaWFzID0gbnVsbCwgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyA9IG51bGwsIGxlYWt5cmVsdUFscGhhID0gMCwgYWN0aXZhdGlvbiA9IG51bGwgfSkge1xuICAgIC8vIFJlc2hhcGVzIGNvbnYyRCBpbnB1dCB0byAyRCB0ZW5zb3JzLCB1c2VzIG1hdE11bCBhbmQgdGhlbiByZXNoYXBlIHRoZVxuICAgIC8vIHJlc3VsdCBmcm9tIDJEIHRvIDRELlxuICAgIGNvbnN0IHhTaGFwZSA9IHguc2hhcGU7XG4gICAgY29uc3QgeFRleERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KHguZGF0YUlkKTtcbiAgICBjb25zdCBzaGFyZWRNYXRNdWxEaW0gPSBjb252SW5mby5pbkNoYW5uZWxzO1xuICAgIGNvbnN0IG91dGVyU2hhcGVYID0geFNoYXBlWzBdICogeFNoYXBlWzFdICogeFNoYXBlWzJdO1xuICAgIGNvbnN0IG91dGVyU2hhcGVGaWx0ZXIgPSBjb252SW5mby5vdXRDaGFubmVscztcbiAgICBjb25zdCBpc0NoYW5uZWxzTGFzdCA9IGNvbnZJbmZvLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnO1xuICAgIGNvbnN0IHRyYW5zcG9zZUEgPSBmYWxzZTtcbiAgICBjb25zdCB0cmFuc3Bvc2VCID0gZmFsc2U7XG4gICAgbGV0IG91dDtcbiAgICBjb25zdCBpbnRlcm1lZGlhdGVzID0gW107XG4gICAgLy8gVE9ETzogT25jZSByZWR1Y3Rpb24gb3BzIGFyZSBwYWNrZWQsIGJhdGNoTWF0TXVsIHdpbGwgYWx3YXlzIGJlIHBhY2tlZFxuICAgIC8vIGFuZCB3ZSBjYW4gcmVtb3ZlIHRoaXMgY29uZGl0aW9uLlxuICAgIGNvbnN0IGJhdGNoTWF0TXVsV2lsbEJlVW5wYWNrZWQgPSAob3V0ZXJTaGFwZVggPT09IDEgfHwgb3V0ZXJTaGFwZUZpbHRlciA9PT0gMSkgJiZcbiAgICAgICAgc2hhcmVkTWF0TXVsRGltID4gTUFUTVVMX1NIQVJFRF9ESU1fVEhSRVNIT0xEO1xuICAgIGNvbnN0IHJlc2hhcGVXaWxsQmVFeHBlbnNpdmUgPSB4U2hhcGVbMl0gJSAyICE9PSAwICYmICEheFRleERhdGEuaXNQYWNrZWQ7XG4gICAgaWYgKGJhdGNoTWF0TXVsV2lsbEJlVW5wYWNrZWQgfHwgIWVudigpLmdldEJvb2woJ1dFQkdMX0xBWklMWV9VTlBBQ0snKSB8fFxuICAgICAgICAhZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19CSU5BUllfT1BFUkFUSU9OUycpIHx8XG4gICAgICAgICFyZXNoYXBlV2lsbEJlRXhwZW5zaXZlKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldFNoYXBlID0gaXNDaGFubmVsc0xhc3QgPyB4U2hhcGVbMF0gKiB4U2hhcGVbMV0gKiB4U2hhcGVbMl0gOlxuICAgICAgICAgICAgeFNoYXBlWzBdICogeFNoYXBlWzJdICogeFNoYXBlWzNdO1xuICAgICAgICBjb25zdCB4UmVzaGFwZWQgPSByZXNoYXBlKHtcbiAgICAgICAgICAgIGlucHV0czogeyB4IH0sXG4gICAgICAgICAgICBiYWNrZW5kLFxuICAgICAgICAgICAgYXR0cnM6IHsgc2hhcGU6IFsxLCB0YXJnZXRTaGFwZSwgY29udkluZm8uaW5DaGFubmVsc10gfVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZmlsdGVyUmVzaGFwZWQgPSByZXNoYXBlKHtcbiAgICAgICAgICAgIGlucHV0czogeyB4OiBmaWx0ZXIgfSxcbiAgICAgICAgICAgIGJhY2tlbmQsXG4gICAgICAgICAgICBhdHRyczogeyBzaGFwZTogWzEsIGNvbnZJbmZvLmluQ2hhbm5lbHMsIGNvbnZJbmZvLm91dENoYW5uZWxzXSB9XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBiYXRjaE1hdE11bEltcGwoe1xuICAgICAgICAgICAgYTogeFJlc2hhcGVkLFxuICAgICAgICAgICAgYjogZmlsdGVyUmVzaGFwZWQsXG4gICAgICAgICAgICB0cmFuc3Bvc2VBLFxuICAgICAgICAgICAgdHJhbnNwb3NlQixcbiAgICAgICAgICAgIGJhY2tlbmQsXG4gICAgICAgICAgICBiaWFzLFxuICAgICAgICAgICAgYWN0aXZhdGlvbixcbiAgICAgICAgICAgIHByZWx1QWN0aXZhdGlvbldlaWdodHMsXG4gICAgICAgICAgICBsZWFreXJlbHVBbHBoYVxuICAgICAgICB9KTtcbiAgICAgICAgb3V0ID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiByZXN1bHQgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IGNvbnZJbmZvLm91dFNoYXBlIH0gfSk7XG4gICAgICAgIGludGVybWVkaWF0ZXMucHVzaCh4UmVzaGFwZWQpO1xuICAgICAgICBpbnRlcm1lZGlhdGVzLnB1c2goZmlsdGVyUmVzaGFwZWQpO1xuICAgICAgICBpbnRlcm1lZGlhdGVzLnB1c2gocmVzdWx0KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIEZvbGxvd2luZyBvcHRpbWl6YXRpb24gaXMgc3BlY2lmaWMgdG8gcGFja2VkIHx4fCB3aXRoIG9kZCByb3cgY291bnRcbiAgICAgICAgLy8gKEZvciBleGFtcGxlLCBpbiBjaGFubmVsTGFzdCBtb2RlLCAncm93IGNvdW50JyByZWZlcnMgdG8geC5zaGFwZVsyXSk6XG4gICAgICAgIC8vIHdlIGF2b2lkIGV4cGVuc2l2ZSBwYWNrZWQgMngyIHJlc2hhcGUgYnkgcGFkZGluZyByb3cgY291bnQgdG8gbmV4dCxcbiAgICAgICAgLy8gZXZlbiBudW1iZXIuIFdoZW4geC5zaGFwZVsyXSBpcyBvZGQsIHRoZSByZXN1bHQgb2YgcGFja2VkIGJhdGNoTWF0TXVsIGlzXG4gICAgICAgIC8vIHRoZSBzYW1lIChoYXMgdGhlIHNhbWUgdGV4dHVyZSBsYXlvdXQgYW5kIGFuZCB2YWx1ZXMgaW4gdGhlIHRleHR1cmUpIGFzXG4gICAgICAgIC8vIGl0IGlzIGZvciBldmVuIHguc2hhcGVbMl0gKyAxLiBXZSBtYWtlIHRoZSBvZGQtcm93cyB0ZW5zb3IgdG8gbG9vayBsaWtlXG4gICAgICAgIC8vIGV2ZW4tcm93cyB0ZW5zb3IgYmVmb3JlIHRoZSBvcGVyYXRpb24gYW5kLCBhZnRlciB0aGUgYmF0Y2hNYXRNdWwsXG4gICAgICAgIC8vIGZpeCB0aGUgZXZlbi1yb3dzIHJlc3VsdCB0byBoYXZlIG9kZCBudW1iZXIgb2Ygcm93cy5cbiAgICAgICAgY29uc3QgdGFyZ2V0U2hhcGUgPSBpc0NoYW5uZWxzTGFzdCA/XG4gICAgICAgICAgICB4U2hhcGVbMF0gKiB4U2hhcGVbMV0gKiAoeFNoYXBlWzJdICsgMSkgOlxuICAgICAgICAgICAgeFNoYXBlWzBdICogeFNoYXBlWzJdICogKHhTaGFwZVszXSArIDEpO1xuICAgICAgICBjb25zdCB4UmVzaGFwZWQgPSB7XG4gICAgICAgICAgICBkYXRhSWQ6IHguZGF0YUlkLFxuICAgICAgICAgICAgc2hhcGU6IFsxLCB0YXJnZXRTaGFwZSwgY29udkluZm8uaW5DaGFubmVsc10sXG4gICAgICAgICAgICBkdHlwZTogeC5kdHlwZVxuICAgICAgICB9O1xuICAgICAgICAvLyB4VGV4RGF0YS5zaGFwZSBnZXRzIHJlZmVyZW5jZWQgZnJvbSBHUEdQVUJpbmFyeS5pblNoYXBlSW5mb3MuXG4gICAgICAgIC8vIERlY3JlbWVudGluZyByb3cgY291bnQsIGFmdGVyIGJhdGNoTWF0TXVsLT4uLi4tPmNvbXBpbGVQcm9ncmFtIGxlYWRzIHRvXG4gICAgICAgIC8vIGludmFsaWQgcm93IGNvdW50IHdpdGhpbiB0aGUgcmVmZXJlbmNlIGluIEdQR1BVQmluYXJ5LmluU2hhcGVJbmZvcy5cbiAgICAgICAgLy8gQWx0ZXJuYXRpdmUgZml4IHdvdWxkIGJlIHRvIHByb3ZpZGUgYSBjb3B5IHRvIEdQR1BVQmluYXJ5LmluU2hhcGVJbmZvc1xuICAgICAgICAvLyBpbiBjb21waWxlUHJvZ3JhbSBtZXRob2QsIGJ1dCB0aGF0IHdvdWxkIGFmZmVjdCBjb21waWxhdGlvbiBvZiBhbGxcbiAgICAgICAgLy8gcHJvZ3JhbXMgLSBpbnN0ZWFkLCBwcm92aWRlIGEgY29weSBoZXJlLCB3aXRoIGV2ZW4gcm93IGNvdW50LCBiZWZvcmVcbiAgICAgICAgLy8gY2FsbGluZyBiYXRjaE1hdE11bC0+Li4uLT5jb21waWxlUHJvZ3JhbSBhbmQgYWZ0ZXIgdGhhdCwgdGhlIG9yaWdpbmFsXG4gICAgICAgIC8vIHhUZXhEYXRhLnNoYXBlIGlzIHJlc3RvcmVkLlxuICAgICAgICBjb25zdCBvcmlnaW5hbFhUZXhEYXRhU2hhcGUgPSB4VGV4RGF0YS5zaGFwZTtcbiAgICAgICAgeFRleERhdGEuc2hhcGUgPSB4VGV4RGF0YS5zaGFwZS5zbGljZSgpO1xuICAgICAgICB4VGV4RGF0YS5zaGFwZVt4VGV4RGF0YS5zaGFwZS5sZW5ndGggLSAyXSsrO1xuICAgICAgICB1dGlsLmFzc2VydCh3ZWJnbF91dGlsLmlzUmVzaGFwZUZyZWUoeFRleERhdGEuc2hhcGUsIHhSZXNoYXBlZC5zaGFwZSksICgpID0+IGBwYWNrZWQgcmVzaGFwZSAke3hUZXhEYXRhLnNoYXBlfSB0byAke3hSZXNoYXBlZC5zaGFwZX0gaXNuJ3QgZnJlZWApO1xuICAgICAgICBjb25zdCBmaWx0ZXJSZXNoYXBlZCA9IHJlc2hhcGUoe1xuICAgICAgICAgICAgaW5wdXRzOiB7IHg6IGZpbHRlciB9LFxuICAgICAgICAgICAgYmFja2VuZCxcbiAgICAgICAgICAgIGF0dHJzOiB7IHNoYXBlOiBbMSwgY29udkluZm8uaW5DaGFubmVscywgY29udkluZm8ub3V0Q2hhbm5lbHNdIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGludGVybWVkaWF0ZXMucHVzaChmaWx0ZXJSZXNoYXBlZCk7XG4gICAgICAgIGNvbnN0IHBvaW50d2lzZUNvbnYgPSBiYXRjaE1hdE11bEltcGwoe1xuICAgICAgICAgICAgYTogeFJlc2hhcGVkLFxuICAgICAgICAgICAgYjogZmlsdGVyUmVzaGFwZWQsXG4gICAgICAgICAgICBiYWNrZW5kLFxuICAgICAgICAgICAgdHJhbnNwb3NlQSxcbiAgICAgICAgICAgIHRyYW5zcG9zZUIsXG4gICAgICAgICAgICBiaWFzLFxuICAgICAgICAgICAgYWN0aXZhdGlvbixcbiAgICAgICAgICAgIHByZWx1QWN0aXZhdGlvbldlaWdodHMsXG4gICAgICAgICAgICBsZWFreXJlbHVBbHBoYVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcG9pbnR3aXNlQ29udlRleERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KHBvaW50d2lzZUNvbnYuZGF0YUlkKTtcbiAgICAgICAgdXRpbC5hc3NlcnQocG9pbnR3aXNlQ29udlRleERhdGEuaXNQYWNrZWQsICgpID0+ICdiYXRjaE1hdE11bCByZXN1bHQgaXMgZXhwZWN0ZWQgdG8gYmUgcGFja2VkJyk7XG4gICAgICAgIC8vIFJlc3RvcmUgdGhlIGlucHV0IHNoYXBlIHRvIG9yaWdpbmFsLlxuICAgICAgICB4VGV4RGF0YS5zaGFwZSA9IG9yaWdpbmFsWFRleERhdGFTaGFwZTtcbiAgICAgICAgLy8gU2V0IHRoZSBvdXRwdXQgc2hhcGUgLSB0aGVyZSBpcyBubyBuZWVkIGZvciBleHBlbnNpdmUgcmVzaGFwZSBhcyBkYXRhXG4gICAgICAgIC8vIGxheW91dCBpcyBhbHJlYWR5IGNvcnJlY3QuXG4gICAgICAgIHBvaW50d2lzZUNvbnZUZXhEYXRhLnNoYXBlID0gY29udkluZm8ub3V0U2hhcGU7XG4gICAgICAgIG91dCA9IGlkZW50aXR5KHsgaW5wdXRzOiB7IHg6IHBvaW50d2lzZUNvbnYgfSwgYmFja2VuZCB9KTtcbiAgICAgICAgb3V0LnNoYXBlID0gY29udkluZm8ub3V0U2hhcGU7XG4gICAgICAgIGludGVybWVkaWF0ZXMucHVzaChwb2ludHdpc2VDb252KTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBpIG9mIGludGVybWVkaWF0ZXMpIHtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbi8vIEltcGxlbWVudHMgdGhlIGltMnJvdyBhbGdvcml0aG0gYXMgb3V0bGluZWQgaW4gXCJIaWdoIFBlcmZvcm1hbmNlXG4vLyBDb252b2x1dGlvbmFsIE5ldXJhbCBOZXR3b3JrcyBmb3IgRG9jdW1lbnQgUHJvY2Vzc2luZ1wiIChTdXZpc29mdCwgMjAwNilcbmV4cG9ydCBmdW5jdGlvbiBjb252MmRXaXRoSW0yUm93KHsgeCwgZmlsdGVyLCBjb252SW5mbywgYmFja2VuZCwgYmlhcyA9IG51bGwsIHByZWx1QWN0aXZhdGlvbldlaWdodHMgPSBudWxsLCBsZWFreXJlbHVBbHBoYSA9IDAsIGFjdGl2YXRpb24gPSBudWxsIH0pIHtcbiAgICAvLyBSZWFycmFuZ2VzIGNvbnYyZCBpbnB1dCBzbyBlYWNoIGJsb2NrIHRvIGJlIGNvbnZvbHZlZCBvdmVyIGZvcm1zIHRoZVxuICAgIC8vIGNvbHVtbiBvZiBhIG5ldyBtYXRyaXggd2l0aCBzaGFwZSBbZmlsdGVyV2lkdGggKiBmaWx0ZXJIZWlnaHQgKlxuICAgIC8vIGluQ2hhbm5lbHMsIG91dEhlaWdodCAqIG91dFdpZHRoXS4gVGhlIGZpbHRlciBpcyBhbHNvIHJlYXJyYW5nZWQgc28gZWFjaFxuICAgIC8vIG91dHB1dCBjaGFubmVsIGZvcm1zIGEgcm93IG9mIGEgbmV3IG1hdHJpeCB3aXRoIHNoYXBlIFtvdXRDaGFubmVscyxcbiAgICAvLyBmaWx0ZXJXaWR0aCAqIGZpbHRlckhlaWdodCAqIGluQ2hhbm5lbHNdLiBUaGUgY29udm9sdXRpb24gaXMgdGhlblxuICAgIC8vIGNvbXB1dGVkIGJ5IG11bHRpcGx5aW5nIHRoZXNlIG1hdHJpY2VzIGFuZCByZXNoYXBpbmcgdGhlIHJlc3VsdC5cbiAgICBjb25zdCB7IGZpbHRlcldpZHRoLCBmaWx0ZXJIZWlnaHQsIGluQ2hhbm5lbHMsIG91dFdpZHRoLCBvdXRIZWlnaHQsIGRhdGFGb3JtYXQgfSA9IGNvbnZJbmZvO1xuICAgIGNvbnN0IGlzQ2hhbm5lbHNMYXN0ID0gZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzTGFzdCc7XG4gICAgY29uc3Qgc2hhcmVkRGltID0gZmlsdGVyV2lkdGggKiBmaWx0ZXJIZWlnaHQgKiBpbkNoYW5uZWxzO1xuICAgIGNvbnN0IG51bUNvbHMgPSBvdXRIZWlnaHQgKiBvdXRXaWR0aDtcbiAgICBjb25zdCB4MkNvbFNoYXBlID0gW3NoYXJlZERpbSwgbnVtQ29sc107XG4gICAgY29uc3QgdHJhbnNwb3NlQSA9IHRydWU7XG4gICAgY29uc3QgdHJhbnNwb3NlQiA9IGZhbHNlO1xuICAgIGNvbnN0IGludGVybWVkaWF0ZXMgPSBbXTtcbiAgICBjb25zdCB4U3F1ZWV6ZWQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IHguc2hhcGUuc2xpY2UoMSkgfSB9KTtcbiAgICBjb25zdCB3MlJvdyA9IHJlc2hhcGUoe1xuICAgICAgICBpbnB1dHM6IHsgeDogZmlsdGVyIH0sXG4gICAgICAgIGJhY2tlbmQsXG4gICAgICAgIGF0dHJzOiB7IHNoYXBlOiBbMSwgc2hhcmVkRGltLCB1dGlsLnNpemVGcm9tU2hhcGUoZmlsdGVyLnNoYXBlKSAvIHNoYXJlZERpbV0gfVxuICAgIH0pO1xuICAgIGludGVybWVkaWF0ZXMucHVzaCh4U3F1ZWV6ZWQpO1xuICAgIGludGVybWVkaWF0ZXMucHVzaCh3MlJvdyk7XG4gICAgY29uc3QgaW0yQ29sUHJvZ3JhbSA9IG5ldyBJbTJDb2xQYWNrZWRQcm9ncmFtKHgyQ29sU2hhcGUsIHhTcXVlZXplZC5zaGFwZSwgY29udkluZm8pO1xuICAgIGNvbnN0IGltMkNvbCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKGltMkNvbFByb2dyYW0sIFt4U3F1ZWV6ZWRdLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IGltMkNvbFJlc2hhcGVkID0gcmVzaGFwZSh7XG4gICAgICAgIGlucHV0czogeyB4OiBpbTJDb2wgfSxcbiAgICAgICAgYmFja2VuZCxcbiAgICAgICAgYXR0cnM6IHsgc2hhcGU6IFsxLCB4MkNvbFNoYXBlWzBdLCB4MkNvbFNoYXBlWzFdXSB9XG4gICAgfSk7XG4gICAgaW50ZXJtZWRpYXRlcy5wdXNoKGltMkNvbCk7XG4gICAgaW50ZXJtZWRpYXRlcy5wdXNoKGltMkNvbFJlc2hhcGVkKTtcbiAgICBjb25zdCBoYXNCaWFzID0gYmlhcyAhPSBudWxsO1xuICAgIGNvbnN0IGhhc1ByZWx1QWN0aXZhdGlvbldlaWdodHMgPSBwcmVsdUFjdGl2YXRpb25XZWlnaHRzICE9IG51bGw7XG4gICAgY29uc3QgaGFzTGVha3lyZWx1QWxwaGEgPSBhY3RpdmF0aW9uID09PSAnbGVha3lyZWx1JztcbiAgICBjb25zdCBmdXNlZEFjdGl2YXRpb24gPSBhY3RpdmF0aW9uID8gbWFwQWN0aXZhdGlvblRvU2hhZGVyUHJvZ3JhbShhY3RpdmF0aW9uLCB0cnVlKSA6IG51bGw7XG4gICAgY29uc3QgbWF0bXVsUHJvZ3JhbSA9IG5ldyBNYXRNdWxQYWNrZWRQcm9ncmFtKGltMkNvbFJlc2hhcGVkLnNoYXBlLCB3MlJvdy5zaGFwZSwgWzEsIG51bUNvbHMsIGNvbnZJbmZvLm91dENoYW5uZWxzXSwgdHJhbnNwb3NlQSwgdHJhbnNwb3NlQiwgaGFzQmlhcywgZnVzZWRBY3RpdmF0aW9uLCBoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzLCBoYXNMZWFreXJlbHVBbHBoYSk7XG4gICAgY29uc3QgaW5wdXRzID0gW2ltMkNvbFJlc2hhcGVkLCB3MlJvd107XG4gICAgaWYgKGJpYXMpIHtcbiAgICAgICAgaW5wdXRzLnB1c2goYmlhcyk7XG4gICAgfVxuICAgIGlmIChoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzKSB7XG4gICAgICAgIGlucHV0cy5wdXNoKHByZWx1QWN0aXZhdGlvbldlaWdodHMpO1xuICAgIH1cbiAgICBpZiAoaGFzTGVha3lyZWx1QWxwaGEpIHtcbiAgICAgICAgY29uc3QgJGxlYWt5cmVsdUFscGhhID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbXSwgJ2Zsb2F0MzInLCB1dGlsLmNyZWF0ZVNjYWxhclZhbHVlKGxlYWt5cmVsdUFscGhhLCAnZmxvYXQzMicpKTtcbiAgICAgICAgaW5wdXRzLnB1c2goJGxlYWt5cmVsdUFscGhhKTtcbiAgICAgICAgaW50ZXJtZWRpYXRlcy5wdXNoKCRsZWFreXJlbHVBbHBoYSk7XG4gICAgfVxuICAgIGNvbnN0IHByb2R1Y3QgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShtYXRtdWxQcm9ncmFtLCBpbnB1dHMsICdmbG9hdDMyJyk7XG4gICAgY29uc3Qgb3V0U2hhcGUgPSBpc0NoYW5uZWxzTGFzdCA/XG4gICAgICAgIFsxLCBvdXRIZWlnaHQsIG91dFdpZHRoLCBjb252SW5mby5vdXRDaGFubmVsc10gOlxuICAgICAgICBbMSwgY29udkluZm8ub3V0Q2hhbm5lbHMsIG91dEhlaWdodCwgb3V0V2lkdGhdO1xuICAgIGNvbnN0IG91dCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogcHJvZHVjdCB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogb3V0U2hhcGUgfSB9KTtcbiAgICBpbnRlcm1lZGlhdGVzLnB1c2gocHJvZHVjdCk7XG4gICAgZm9yIChjb25zdCBpIG9mIGludGVybWVkaWF0ZXMpIHtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbnYyRF9pbXBsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgQ29udjNEIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IENvbnYzRFByb2dyYW0gfSBmcm9tICcuLi9jb252X2dwdSc7XG5leHBvcnQgZnVuY3Rpb24gY29udjNEKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4LCBmaWx0ZXIgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHN0cmlkZXMsIHBhZCwgZGlsYXRpb25zIH0gPSBhdHRycztcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjNESW5mbyh4LnNoYXBlLCBmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkKTtcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IENvbnYzRFByb2dyYW0oY29udkluZm8pO1xuICAgIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeCwgZmlsdGVyXSwgJ2Zsb2F0MzInKTtcbn1cbmV4cG9ydCBjb25zdCBjb252M0RDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQ29udjNELFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGNvbnYzRCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db252M0QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBDb252M0RCYWNrcHJvcEZpbHRlclYyIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IENvbnYzRERlckZpbHRlclByb2dyYW0gfSBmcm9tICcuLi9jb252X2JhY2twcm9wX2dwdSc7XG5leHBvcnQgZnVuY3Rpb24gY29udjNEQmFja3Byb3BGaWx0ZXJWMihhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCwgZHkgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHN0cmlkZXMsIHBhZCwgZmlsdGVyU2hhcGUgfSA9IGF0dHJzO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252M0RJbmZvKHguc2hhcGUsIGZpbHRlclNoYXBlLCBzdHJpZGVzLCAxIC8qIGRpbGF0aW9ucyAqLywgcGFkKTtcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IENvbnYzRERlckZpbHRlclByb2dyYW0oY29udkluZm8pO1xuICAgIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeCwgZHldLCAnZmxvYXQzMicpO1xufVxuZXhwb3J0IGNvbnN0IGNvbnYzREJhY2twcm9wRmlsdGVyVjJDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQ29udjNEQmFja3Byb3BGaWx0ZXJWMixcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBjb252M0RCYWNrcHJvcEZpbHRlclYyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29udjNEQmFja3Byb3BGaWx0ZXJWMi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIENvbnYzREJhY2twcm9wSW5wdXRWMiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBDb252M0REZXJJbnB1dFByb2dyYW0gfSBmcm9tICcuLi9jb252X2JhY2twcm9wX2dwdSc7XG5leHBvcnQgZnVuY3Rpb24gY29udjNEQmFja3Byb3BJbnB1dChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgZHksIGZpbHRlciB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgcGFkLCBzdHJpZGVzLCBpbnB1dFNoYXBlIH0gPSBhdHRycztcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjNESW5mbyhpbnB1dFNoYXBlLCBmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsIDEgLyogZGlsYXRpb25zICovLCBwYWQpO1xuICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgQ29udjNERGVySW5wdXRQcm9ncmFtKGNvbnZJbmZvKTtcbiAgICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW2R5LCBmaWx0ZXJdLCAnZmxvYXQzMicpO1xufVxuZXhwb3J0IGNvbnN0IGNvbnYzREJhY2twcm9wSW5wdXRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQ29udjNEQmFja3Byb3BJbnB1dFYyLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGNvbnYzREJhY2twcm9wSW5wdXQsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29udjNEQmFja3Byb3BJbnB1dFYyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IENvcyB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBDSEVDS19OQU5fU05JUFBFVF9VTkFSWSwgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5jb25zdCBDT1MgPSBDSEVDS19OQU5fU05JUFBFVF9VTkFSWSArIGBcbiAgcmV0dXJuIGNvcyh4KTtcbmA7XG5leHBvcnQgY29uc3QgY29zID0gdW5hcnlLZXJuZWxGdW5jKHsgb3BTbmlwcGV0OiBDT1MgfSk7XG5leHBvcnQgY29uc3QgY29zQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IENvcyxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBjb3MsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29zLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IENvc2ggfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5jb25zdCBDT1NIID0gYFxuICBmbG9hdCBlMnggPSBleHAoLXgpO1xuICByZXR1cm4gKGUyeCArIDEuMCAvIGUyeCkgLyAyLjA7XG5gO1xuZXhwb3J0IGNvbnN0IGNvc2ggPSB1bmFyeUtlcm5lbEZ1bmMoeyBvcFNuaXBwZXQ6IENPU0ggfSk7XG5leHBvcnQgY29uc3QgY29zaENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBDb3NoLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGNvc2gsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29zaC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBDcm9wQW5kUmVzaXplIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IENyb3BBbmRSZXNpemVQcm9ncmFtIH0gZnJvbSAnLi4vY3JvcF9hbmRfcmVzaXplX2dwdSc7XG5leHBvcnQgY29uc3QgY3JvcEFuZFJlc2l6ZSA9IChhcmdzKSA9PiB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW1hZ2UsIGJveGVzLCBib3hJbmQgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGNyb3BTaXplLCBtZXRob2QsIGV4dHJhcG9sYXRpb25WYWx1ZSB9ID0gYXR0cnM7XG4gICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBDcm9wQW5kUmVzaXplUHJvZ3JhbShpbWFnZS5zaGFwZSwgYm94ZXMuc2hhcGUsIGNyb3BTaXplLCBtZXRob2QsIGV4dHJhcG9sYXRpb25WYWx1ZSk7XG4gICAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtpbWFnZSwgYm94ZXMsIGJveEluZF0sICdmbG9hdDMyJyk7XG59O1xuZXhwb3J0IGNvbnN0IGNyb3BBbmRSZXNpemVDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQ3JvcEFuZFJlc2l6ZSxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBjcm9wQW5kUmVzaXplXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q3JvcEFuZFJlc2l6ZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIEN1bXN1bSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBDdW1TdW1Qcm9ncmFtIH0gZnJvbSAnLi4vY3Vtc3VtX2dwdSc7XG5pbXBvcnQgeyBpZGVudGl0eSB9IGZyb20gJy4vSWRlbnRpdHknO1xuaW1wb3J0IHsgdHJhbnNwb3NlIH0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuZXhwb3J0IGZ1bmN0aW9uIGN1bXN1bShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYXhpcywgZXhjbHVzaXZlLCByZXZlcnNlIH0gPSBhdHRycztcbiAgICBjb25zdCB4UmFuayA9IHguc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IHBlcm11dGF0aW9uID0gYmFja2VuZF91dGlsLmdldEF4ZXNQZXJtdXRhdGlvbihbYXhpc10sIHhSYW5rKTtcbiAgICBsZXQgcGVybXV0ZWRYID0geDtcbiAgICBpZiAocGVybXV0YXRpb24gIT0gbnVsbCkge1xuICAgICAgICBwZXJtdXRlZFggPSB0cmFuc3Bvc2UoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kLCBhdHRyczogeyBwZXJtOiBwZXJtdXRhdGlvbiB9IH0pO1xuICAgIH1cbiAgICBjb25zdCBwZXJtdXRlZEF4aXMgPSBiYWNrZW5kX3V0aWwuZ2V0SW5uZXJNb3N0QXhlcygxLCB4UmFuaylbMF07XG4gICAgaWYgKHBlcm11dGVkQXhpcyAhPT0geFJhbmsgLSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgV2ViR0wgY3Vtc3VtIHNoYWRlciBleHBlY3RzIGFuIGlubmVyLW1vc3QgYXhpcz0ke3guc2hhcGUubGVuZ3RoIC0gMX0gYCArXG4gICAgICAgICAgICBgYnV0IGdvdCBheGlzPSR7YXhpc31gKTtcbiAgICB9XG4gICAgY29uc3Qgc2l6ZSA9IHBlcm11dGVkWC5zaGFwZVtwZXJtdXRlZEF4aXNdO1xuICAgIGxldCByZXN1bHQgPSBpZGVudGl0eSh7IGlucHV0czogeyB4OiBwZXJtdXRlZFggfSwgYmFja2VuZCB9KTtcbiAgICAvLyBVc2UgY3Vtc3VtIHBhcmFsbGVsIGFsZ29yaXRobSwgcmVmOlxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm52aWRpYS5jb20vZ3B1Z2Vtcy9ncHVnZW1zMy9wYXJ0LXZpLWdwdS1jb21wdXRpbmcvY2hhcHRlci0zOS1wYXJhbGxlbC1wcmVmaXgtc3VtLXNjYW4tY3VkYVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IE1hdGguY2VpbChNYXRoLmxvZzIoc2l6ZSkpIC0gMTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgQ3VtU3VtUHJvZ3JhbShwZXJtdXRlZFguc2hhcGUsIGZhbHNlLCByZXZlcnNlKTtcbiAgICAgICAgY29uc3QgY3VzdG9tVmFsdWVzID0gW1tpXV07XG4gICAgICAgIGNvbnN0IHByZXZSZXN1bHQgPSByZXN1bHQ7XG4gICAgICAgIHJlc3VsdCA9XG4gICAgICAgICAgICBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbcmVzdWx0XSwgcmVzdWx0LmR0eXBlLCBjdXN0b21WYWx1ZXMpO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHByZXZSZXN1bHQpO1xuICAgIH1cbiAgICAvLyBGb3IgZXhjbHVzaXZlIGN1bXN1bSwgc2hpZnQgdGhlIGVuZCByZXN1bHQgaW4gdGhlIGRpcmVjdGlvbiBvZiBzdW1cbiAgICAvLyBhbmQgYWRkIDAgdG8gdGhlIGZyb250IGluZGV4LlxuICAgIGlmIChleGNsdXNpdmUpIHtcbiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBDdW1TdW1Qcm9ncmFtKHBlcm11dGVkWC5zaGFwZSwgZXhjbHVzaXZlLCByZXZlcnNlKTtcbiAgICAgICAgY29uc3QgcHJldlJlc3VsdCA9IHJlc3VsdDtcbiAgICAgICAgcmVzdWx0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3Jlc3VsdF0sIHJlc3VsdC5kdHlwZSk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocHJldlJlc3VsdCk7XG4gICAgfVxuICAgIGlmIChwZXJtdXRhdGlvbiAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHJldmVyc2VQZXJtdXRhdGlvbiA9IGJhY2tlbmRfdXRpbC5nZXRVbmRvQXhlc1Blcm11dGF0aW9uKHBlcm11dGF0aW9uKTtcbiAgICAgICAgY29uc3QgcmV2ZXJzZVRyYW5zcG9zZWRSZXN1bHQgPSB0cmFuc3Bvc2UoeyBpbnB1dHM6IHsgeDogcmVzdWx0IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHBlcm06IHJldmVyc2VQZXJtdXRhdGlvbiB9IH0pO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc3VsdCk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocGVybXV0ZWRYKTtcbiAgICAgICAgcmV0dXJuIHJldmVyc2VUcmFuc3Bvc2VkUmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGNvbnN0IGN1bXN1bUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBDdW1zdW0sXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogY3Vtc3VtXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q3Vtc3VtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IERlbnNlQmluY291bnQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYmluY291bnRJbXBsQ1BVLCBiaW5jb3VudFJlZHVjZUltcGxDUFUgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmV4cG9ydCBmdW5jdGlvbiBkZW5zZUJpbmNvdW50KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4LCB3ZWlnaHRzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBzaXplLCBiaW5hcnlPdXRwdXQgfSA9IGF0dHJzO1xuICAgIGlmICh4LnNoYXBlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCB4VmFscyA9IGJhY2tlbmQucmVhZFN5bmMoeC5kYXRhSWQpO1xuICAgICAgICBjb25zdCB3ZWlnaHRzVmFscyA9IGJhY2tlbmQucmVhZFN5bmMod2VpZ2h0cy5kYXRhSWQpO1xuICAgICAgICBjb25zdCBvdXRWYWxzID0gYmluY291bnRJbXBsQ1BVKHhWYWxzLCB3ZWlnaHRzVmFscywgd2VpZ2h0cy5kdHlwZSwgd2VpZ2h0cy5zaGFwZSwgc2l6ZSk7XG4gICAgICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtzaXplXSwgd2VpZ2h0cy5kdHlwZSwgb3V0VmFscyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHguc2hhcGUubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIGNvbnN0IHhCdWYgPSBiYWNrZW5kLmJ1ZmZlclN5bmMoeCk7XG4gICAgICAgIGNvbnN0IHdlaWdodHNCdWYgPSBiYWNrZW5kLmJ1ZmZlclN5bmMod2VpZ2h0cyk7XG4gICAgICAgIGNvbnN0IG91dEJ1ZiA9IGJpbmNvdW50UmVkdWNlSW1wbENQVSh4QnVmLCB3ZWlnaHRzQnVmLCBzaXplLCBiaW5hcnlPdXRwdXQpO1xuICAgICAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRCdWYuc2hhcGUsIHdlaWdodHMuZHR5cGUsIG91dEJ1Zi52YWx1ZXMpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIGRlbnNlQmluY291bnQ6IGlucHV0IG11c3QgYmUgYXQgbW9zdCByYW5rIDIsIGJ1dCBnb3QgcmFua2AgK1xuICAgICAgICBgJHt4LnNoYXBlLmxlbmd0aH0uYCk7XG59XG5leHBvcnQgY29uc3QgZGVuc2VCaW5jb3VudENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBEZW5zZUJpbmNvdW50LFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGRlbnNlQmluY291bnRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EZW5zZUJpbmNvdW50LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IERlcHRoVG9TcGFjZSwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBEZXB0aFRvU3BhY2VQcm9ncmFtIH0gZnJvbSAnLi4vZGVwdGhfdG9fc3BhY2VfZ3B1JztcbmV4cG9ydCBmdW5jdGlvbiBkZXB0aFRvU3BhY2UoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGJsb2NrU2l6ZSwgZGF0YUZvcm1hdCB9ID0gYXR0cnM7XG4gICAgdXRpbC5hc3NlcnQoYmxvY2tTaXplID4gMSwgKCkgPT4gYGJsb2NrU2l6ZSBzaG91bGQgYmUgPiAxIGZvciBkZXB0aFRvU3BhY2UsIGJ1dCB3YXM6ICR7YmxvY2tTaXplfWApO1xuICAgIGNvbnN0IGJhdGNoU2l6ZSA9IHguc2hhcGVbMF07XG4gICAgY29uc3QgaW5wdXRIZWlnaHQgPSAoZGF0YUZvcm1hdCA9PT0gJ05IV0MnKSA/IHguc2hhcGVbMV0gOiB4LnNoYXBlWzJdO1xuICAgIGNvbnN0IGlucHV0V2lkdGggPSAoZGF0YUZvcm1hdCA9PT0gJ05IV0MnKSA/IHguc2hhcGVbMl0gOiB4LnNoYXBlWzNdO1xuICAgIGNvbnN0IGlucHV0RGVwdGggPSAoZGF0YUZvcm1hdCA9PT0gJ05IV0MnKSA/IHguc2hhcGVbM10gOiB4LnNoYXBlWzFdO1xuICAgIGNvbnN0IG91dHB1dEhlaWdodCA9IGlucHV0SGVpZ2h0ICogYmxvY2tTaXplO1xuICAgIGNvbnN0IG91dHB1dFdpZHRoID0gaW5wdXRXaWR0aCAqIGJsb2NrU2l6ZTtcbiAgICBjb25zdCBvdXRwdXREZXB0aCA9IGlucHV0RGVwdGggLyAoYmxvY2tTaXplICogYmxvY2tTaXplKTtcbiAgICBjb25zdCBvdXRwdXRTaGFwZSA9IChkYXRhRm9ybWF0ID09PSAnTkhXQycpID9cbiAgICAgICAgW2JhdGNoU2l6ZSwgb3V0cHV0SGVpZ2h0LCBvdXRwdXRXaWR0aCwgb3V0cHV0RGVwdGhdIDpcbiAgICAgICAgW2JhdGNoU2l6ZSwgb3V0cHV0RGVwdGgsIG91dHB1dEhlaWdodCwgb3V0cHV0V2lkdGhdO1xuICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgRGVwdGhUb1NwYWNlUHJvZ3JhbShvdXRwdXRTaGFwZSwgYmxvY2tTaXplLCBkYXRhRm9ybWF0KTtcbiAgICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3hdLCB4LmR0eXBlKTtcbn1cbmV4cG9ydCBjb25zdCBkZXB0aFRvU3BhY2VDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRGVwdGhUb1NwYWNlLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGRlcHRoVG9TcGFjZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURlcHRoVG9TcGFjZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIERlcHRod2lzZUNvbnYyZE5hdGl2ZSwgZW52LCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IERlcHRod2lzZUNvbnYyRFByb2dyYW0gfSBmcm9tICcuLi9jb252X2dwdV9kZXB0aHdpc2UnO1xuaW1wb3J0IHsgRGVwdGh3aXNlQ29udlBhY2tlZDJEUHJvZ3JhbSB9IGZyb20gJy4uL2NvbnZfcGFja2VkX2dwdV9kZXB0aHdpc2UnO1xuZXhwb3J0IGZ1bmN0aW9uIGRlcHRod2lzZUNvbnYyZE5hdGl2ZShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCwgZmlsdGVyIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBzdHJpZGVzLCBwYWQsIGRpbGF0aW9ucywgZGltUm91bmRpbmdNb2RlIH0gPSBhdHRycztcbiAgICBsZXQgJGRpbGF0aW9ucyA9IGRpbGF0aW9ucztcbiAgICBpZiAoJGRpbGF0aW9ucyA9PSBudWxsKSB7XG4gICAgICAgICRkaWxhdGlvbnMgPSBbMSwgMV07XG4gICAgfVxuICAgIHV0aWwuYXNzZXJ0KGJhY2tlbmRfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgJGRpbGF0aW9ucyksICgpID0+ICdFcnJvciBpbiBkZXB0aHdpc2VDb252MmQ6IEVpdGhlciBzdHJpZGVzIG9yIGRpbGF0aW9ucyBtdXN0IGJlICcgK1xuICAgICAgICBgMS4gR290IHN0cmlkZXMgJHtzdHJpZGVzfSBhbmQgZGlsYXRpb25zICckeyRkaWxhdGlvbnN9J2ApO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252MkRJbmZvKHguc2hhcGUsIGZpbHRlci5zaGFwZSwgc3RyaWRlcywgJGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIHRydWUgLyogZGVwdGh3aXNlICovKTtcbiAgICBsZXQgcHJvZ3JhbTtcbiAgICBpZiAoZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19ERVBUSFdJU0VDT05WJykgJiYgY29udkluZm8uc3RyaWRlV2lkdGggPD0gMiAmJlxuICAgICAgICBjb252SW5mby5vdXRDaGFubmVscyAvIGNvbnZJbmZvLmluQ2hhbm5lbHMgPT09IDEpIHtcbiAgICAgICAgcHJvZ3JhbSA9IG5ldyBEZXB0aHdpc2VDb252UGFja2VkMkRQcm9ncmFtKGNvbnZJbmZvKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHByb2dyYW0gPSBuZXcgRGVwdGh3aXNlQ29udjJEUHJvZ3JhbShjb252SW5mbyk7XG4gICAgfVxuICAgIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeCwgZmlsdGVyXSwgJ2Zsb2F0MzInKTtcbn1cbmV4cG9ydCBjb25zdCBkZXB0aHdpc2VDb252MmROYXRpdmVDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRGVwdGh3aXNlQ29udjJkTmF0aXZlLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGRlcHRod2lzZUNvbnYyZE5hdGl2ZSxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EZXB0aHdpc2VDb252MmROYXRpdmUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlciB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBEZXB0aHdpc2VDb252MkREZXJGaWx0ZXJQcm9ncmFtIH0gZnJvbSAnLi4vY29udl9iYWNrcHJvcF9ncHVfZGVwdGh3aXNlJztcbmV4cG9ydCBmdW5jdGlvbiBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlcihhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCwgZHkgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGZpbHRlclNoYXBlIH0gPSBhdHRycztcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyh4LnNoYXBlLCBmaWx0ZXJTaGFwZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgdHJ1ZSAvKiBkZXB0aHdpc2UgKi8pO1xuICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgRGVwdGh3aXNlQ29udjJERGVyRmlsdGVyUHJvZ3JhbShjb252SW5mbyk7XG4gICAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4LCBkeV0sICdmbG9hdDMyJyk7XG59XG5leHBvcnQgY29uc3QgZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXJDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIERlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgRGVwdGh3aXNlQ29udjJERGVySW5wdXRQcm9ncmFtIH0gZnJvbSAnLi4vY29udl9iYWNrcHJvcF9ncHVfZGVwdGh3aXNlJztcbmV4cG9ydCBmdW5jdGlvbiBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBkeSwgZmlsdGVyIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBzdHJpZGVzLCBkaWxhdGlvbnMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCBpbnB1dFNoYXBlIH0gPSBhdHRycztcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyhpbnB1dFNoYXBlLCBmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIHRydWUgLyogZGVwdGh3aXNlICovKTtcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IERlcHRod2lzZUNvbnYyRERlcklucHV0UHJvZ3JhbShjb252SW5mbyk7XG4gICAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtkeSwgZmlsdGVyXSwgJ2Zsb2F0MzInKTtcbn1cbmV4cG9ydCBjb25zdCBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IERlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXQsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRGlhZywgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBEaWFnUHJvZ3JhbSB9IGZyb20gJy4uL2RpYWdfZ3B1JztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuZXhwb3J0IGZ1bmN0aW9uIGRpYWcoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IG91dFNoYXBlID0gWy4uLnguc2hhcGUsIC4uLnguc2hhcGVdO1xuICAgIGNvbnN0IHhTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHguc2hhcGUpO1xuICAgIGNvbnN0IGZsYXQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IFt4U2l6ZV0gfSB9KTtcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IERpYWdQcm9ncmFtKHhTaXplKTtcbiAgICBjb25zdCByZXMgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbZmxhdF0sIGZsYXQuZHR5cGUpO1xuICAgIGNvbnN0IG91dCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogcmVzIH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBvdXRTaGFwZSB9IH0pO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oZmxhdCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXMpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgZGlhZ0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBEaWFnLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGRpYWdcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EaWFnLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgRGlsYXRpb24yRCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBEaWxhdGlvbjJEUHJvZ3JhbSB9IGZyb20gJy4uL2RpbGF0aW9uX2dwdSc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmV4cG9ydCBmdW5jdGlvbiBkaWxhdGlvbjJEKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4LCBmaWx0ZXIgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHN0cmlkZXMsIHBhZCwgZGlsYXRpb25zIH0gPSBhdHRycztcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlRGlsYXRpb24yREluZm8oeC5zaGFwZSwgZmlsdGVyLnNoYXBlLCBzdHJpZGVzLCBwYWQsICdOSFdDJyAvKiBkYXRhRm9ybWF0ICovLCBkaWxhdGlvbnMpO1xuICAgIGxldCBvdXQ7XG4gICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBEaWxhdGlvbjJEUHJvZ3JhbShjb252SW5mbyk7XG4gICAgb3V0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3gsIGZpbHRlcl0sICdmbG9hdDMyJyk7XG4gICAgY29uc3Qgb3V0UmVzaGFwZWQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IG91dCB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogY29udkluZm8ub3V0U2hhcGUgfSB9KTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG91dCk7XG4gICAgcmV0dXJuIG91dFJlc2hhcGVkO1xufVxuZXhwb3J0IGNvbnN0IGRpbGF0aW9uMkRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRGlsYXRpb24yRCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBkaWxhdGlvbjJELFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURpbGF0aW9uMkQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBFaW5zdW0sIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgbXVsdGlwbHkgfSBmcm9tICcuL011bHRpcGx5JztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHsgc3VtIH0gZnJvbSAnLi9TdW0nO1xuaW1wb3J0IHsgdHJhbnNwb3NlIH0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuZXhwb3J0IGZ1bmN0aW9uIGVpbnN1bShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgZXF1YXRpb24gfSA9IGF0dHJzO1xuICAgIGNvbnN0IHRlbnNvcnMgPSBpbnB1dHM7XG4gICAgY29uc3QgeyBhbGxEaW1zLCBzdW1tZWREaW1zLCBpZERpbXMgfSA9IGJhY2tlbmRfdXRpbC5kZWNvZGVFaW5zdW1FcXVhdGlvbihlcXVhdGlvbiwgdGVuc29ycy5sZW5ndGgpO1xuICAgIGJhY2tlbmRfdXRpbC5jaGVja0VpbnN1bURpbVNpemVzKGFsbERpbXMubGVuZ3RoLCBpZERpbXMsIHRlbnNvcnMpO1xuICAgIGNvbnN0IHsgcGF0aCwgc3RlcHMgfSA9IGJhY2tlbmRfdXRpbC5nZXRFaW5zdW1Db21wdXRlUGF0aChzdW1tZWREaW1zLCBpZERpbXMpO1xuICAgIGNvbnN0IG5TdGVwcyA9IHN0ZXBzLmxlbmd0aDtcbiAgICBsZXQgb3V0ID0gbnVsbDtcbiAgICBsZXQgbnVtRGltc1JlbWFpbmluZyA9IGFsbERpbXMubGVuZ3RoO1xuICAgIGNvbnN0IHRlbnNvcnNUb0Rpc3Bvc2UgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5TdGVwczsgKytpKSB7XG4gICAgICAgIGZvciAoY29uc3QgaWRUZXJtIG9mIHN0ZXBzW2ldKSB7XG4gICAgICAgICAgICBjb25zdCB7IHBlcm11dGF0aW9uSW5kaWNlczogcGVybSwgZXhwYW5kRGltczogZGltc1RvRXhwYW5kIH0gPSBiYWNrZW5kX3V0aWwuZ2V0RWluc3VtUGVybXV0YXRpb24obnVtRGltc1JlbWFpbmluZywgaWREaW1zW2lkVGVybV0pO1xuICAgICAgICAgICAgbGV0IHg7XG4gICAgICAgICAgICBpZiAoYmFja2VuZF91dGlsLmlzSWRlbnRpdHlQZXJtdXRhdGlvbihwZXJtKSkge1xuICAgICAgICAgICAgICAgIHggPSB0ZW5zb3JzW2lkVGVybV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB4ID0gdHJhbnNwb3NlKHsgaW5wdXRzOiB7IHg6IHRlbnNvcnNbaWRUZXJtXSB9LCBiYWNrZW5kLCBhdHRyczogeyBwZXJtIH0gfSk7XG4gICAgICAgICAgICAgICAgdGVuc29yc1RvRGlzcG9zZS5wdXNoKHgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0U2hhcGUgPSB4LnNoYXBlLnNsaWNlKCk7XG4gICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGRpbXNUb0V4cGFuZC5sZW5ndGg7ICsraykge1xuICAgICAgICAgICAgICAgIHRhcmdldFNoYXBlLnNwbGljZShkaW1zVG9FeHBhbmRba10sIDAsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF1dGlsLmFycmF5c0VxdWFsKHguc2hhcGUsIHRhcmdldFNoYXBlKSkge1xuICAgICAgICAgICAgICAgIHggPSByZXNoYXBlKHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IHRhcmdldFNoYXBlIH0gfSk7XG4gICAgICAgICAgICAgICAgdGVuc29yc1RvRGlzcG9zZS5wdXNoKHgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG91dCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG91dCA9IHg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgICAgICAgICAgICAgb3V0ID0gbXVsdGlwbHkoeyBpbnB1dHM6IHsgYTogeCwgYjogb3V0IH0sIGJhY2tlbmQgfSk7XG4gICAgICAgICAgICAgICAgdGVuc29yc1RvRGlzcG9zZS5wdXNoKG91dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgPCBuU3RlcHMgLSAxKSB7XG4gICAgICAgICAgICBpZiAocGF0aFtpXSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgb3V0ID0gc3VtKHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiB7IHg6IG91dCB9LFxuICAgICAgICAgICAgICAgICAgICBiYWNrZW5kLFxuICAgICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXhpczogcGF0aFtpXSAtIChhbGxEaW1zLmxlbmd0aCAtIG51bURpbXNSZW1haW5pbmcpLFxuICAgICAgICAgICAgICAgICAgICAgICAga2VlcERpbXM6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0ZW5zb3JzVG9EaXNwb3NlLnB1c2gob3V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG51bURpbXNSZW1haW5pbmctLTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBDbGVhbiB1cCBpbnRlcm1lZGlhdGUgdGVuc29ycy5cbiAgICBmb3IgKGNvbnN0IHRlbnNvckluZm8gb2YgdGVuc29yc1RvRGlzcG9zZSkge1xuICAgICAgICBpZiAodGVuc29ySW5mbyA9PT0gb3V0KSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHRlbnNvckluZm8pO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IGVpbnN1bUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBFaW5zdW0sXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogZWluc3VtXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RWluc3VtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVsdSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmNvbnN0IEVMVSA9IGByZXR1cm4gKHggPj0gMC4wKSA/IHggOiAoZXhwKHgpIC0gMS4wKTtgO1xuY29uc3QgRUxVX1BBQ0tFRCA9IGBcbiAgdmVjNCByZXN1bHQ7XG5cbiAgcmVzdWx0LnIgPSAoeC5yID49IDAuMCkgPyB4LnIgOiAoZXhwKHgucikgLSAxLjApO1xuICByZXN1bHQuZyA9ICh4LmcgPj0gMC4wKSA/IHguZyA6IChleHAoeC5nKSAtIDEuMCk7XG4gIHJlc3VsdC5iID0gKHguYiA+PSAwLjApID8geC5iIDogKGV4cCh4LmIpIC0gMS4wKTtcbiAgcmVzdWx0LmEgPSAoeC5hID49IDAuMCkgPyB4LmEgOiAoZXhwKHguYSkgLSAxLjApO1xuXG4gIHJldHVybiByZXN1bHQ7XG5gO1xuY29uc3QgZWx1ID0gdW5hcnlLZXJuZWxGdW5jKHsgb3BTbmlwcGV0OiBFTFUsIHBhY2tlZE9wU25pcHBldDogRUxVX1BBQ0tFRCB9KTtcbmV4cG9ydCBjb25zdCBlbHVDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRWx1LFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGVsdVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUVsdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFbHVHcmFkLCBlbnYgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgQmluYXJ5T3BQcm9ncmFtIH0gZnJvbSAnLi4vYmluYXJ5b3BfZ3B1JztcbmltcG9ydCB7IEJpbmFyeU9wUGFja2VkUHJvZ3JhbSB9IGZyb20gJy4uL2JpbmFyeW9wX3BhY2tlZF9ncHUnO1xuY29uc3QgRUxVX0RFUiA9IGByZXR1cm4gKGIgPj0gMS4wKSA/IGEgOiBhICogKGIgKyAxLjApO2A7XG5jb25zdCBFTFVfREVSX1BBQ0tFRCA9IGBcbiAgdmVjNCBiR1RFWmVybyA9IHZlYzQoZ3JlYXRlclRoYW5FcXVhbChiLCB2ZWM0KDAuKSkpO1xuICByZXR1cm4gKGJHVEVaZXJvICogYSkgKyAoKHZlYzQoMS4wKSAtIGJHVEVaZXJvKSAqIChhICogKGIgKyB2ZWM0KDEuMCkpKSk7XG5gO1xuZXhwb3J0IGNvbnN0IGVsdUdyYWQgPSAoYXJncykgPT4ge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgZHksIHkgfSA9IGlucHV0cztcbiAgICBjb25zdCBwcm9ncmFtID0gZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19CSU5BUllfT1BFUkFUSU9OUycpID9cbiAgICAgICAgbmV3IEJpbmFyeU9wUGFja2VkUHJvZ3JhbShFTFVfREVSX1BBQ0tFRCwgZHkuc2hhcGUsIHkuc2hhcGUpIDpcbiAgICAgICAgbmV3IEJpbmFyeU9wUHJvZ3JhbShFTFVfREVSLCBkeS5zaGFwZSwgeS5zaGFwZSk7XG4gICAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtkeSwgeV0sIGR5LmR0eXBlKTtcbn07XG5leHBvcnQgY29uc3QgZWx1R3JhZENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBFbHVHcmFkLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGVsdUdyYWRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FbHVHcmFkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVxdWFsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7IGVxdWFsSW1wbENQVSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuY29uc3QgUEFDS0VEX0VRVUFMID0gYFxuICByZXR1cm4gdmVjNChlcXVhbChhLCBiKSk7XG5gO1xuY29uc3QgRVFVQUwgPSBgcmV0dXJuIGZsb2F0KGEgPT0gYik7YDtcbmV4cG9ydCBjb25zdCBlcXVhbCA9IGJpbmFyeUtlcm5lbEZ1bmMoe1xuICAgIG9wU25pcHBldDogRVFVQUwsXG4gICAgcGFja2VkT3BTbmlwcGV0OiBQQUNLRURfRVFVQUwsXG4gICAgZHR5cGU6ICdib29sJyxcbiAgICBjcHVLZXJuZWxJbXBsOiBlcXVhbEltcGxDUFUsXG59KTtcbmV4cG9ydCBjb25zdCBlcXVhbENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBFcXVhbCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBlcXVhbFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUVxdWFsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgRXJmIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuY29uc3QgRVJGID0gYFxuICAvLyBFcnJvciBmdW5jdGlvbiBpcyBjYWxjdWxhdGVkIGFwcHJveGltYXRlbHkgd2l0aCBlbGVtZW50YXJ5IGZ1bmN0aW9uLlxuICAvLyBTZWUgXCJIYW5kYm9vayBvZiBNYXRoZW1hdGljYWwgRnVuY3Rpb25zIHdpdGggRm9ybXVsYXMsXG4gIC8vIEdyYXBocywgYW5kIE1hdGhlbWF0aWNhbCBUYWJsZXNcIiwgQWJyYW1vd2l0eiBhbmQgU3RlZ3VuLlxuICBmbG9hdCBwID0gJHtiYWNrZW5kX3V0aWwuRVJGX1B9O1xuICBmbG9hdCBhMSA9ICR7YmFja2VuZF91dGlsLkVSRl9BMX07XG4gIGZsb2F0IGEyID0gJHtiYWNrZW5kX3V0aWwuRVJGX0EyfTtcbiAgZmxvYXQgYTMgPSAke2JhY2tlbmRfdXRpbC5FUkZfQTN9O1xuICBmbG9hdCBhNCA9ICR7YmFja2VuZF91dGlsLkVSRl9BNH07XG4gIGZsb2F0IGE1ID0gJHtiYWNrZW5kX3V0aWwuRVJGX0E1fTtcblxuICBmbG9hdCBzaWduID0gc2lnbih4KTtcbiAgeCA9IGFicyh4KTtcbiAgZmxvYXQgdCA9IDEuMCAvICgxLjAgKyBwICogeCk7XG4gIHJldHVybiBzaWduICogKDEuMCAtICgoKCgoYTUqdCArIGE0KSp0KSArIGEzKSp0ICsgYTIpKnQgKyBhMSkqdCpleHAoLXgqeCkpO1xuYDtcbmV4cG9ydCBjb25zdCBlcmYgPSB1bmFyeUtlcm5lbEZ1bmMoeyBvcFNuaXBwZXQ6IEVSRiB9KTtcbmV4cG9ydCBjb25zdCBlcmZDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRXJmLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGVyZixcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FcmYuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRXhwIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHsgZXhwSW1wbENQVSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuZXhwb3J0IGNvbnN0IEVYUCA9IGByZXR1cm4gZXhwKHgpO2A7XG5leHBvcnQgY29uc3QgZXhwID0gdW5hcnlLZXJuZWxGdW5jKHsgb3BTbmlwcGV0OiBFWFAsIHBhY2tlZE9wU25pcHBldDogRVhQLCBjcHVLZXJuZWxJbXBsOiBleHBJbXBsQ1BVIH0pO1xuZXhwb3J0IGNvbnN0IGV4cENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBFeHAsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogZXhwXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RXhwLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFeHBhbmREaW1zLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuZXhwb3J0IGZ1bmN0aW9uIGV4cGFuZERpbXMoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBhdHRycywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IGRpbSB9ID0gYXR0cnM7XG4gICAgY29uc3QgeyBpbnB1dCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IGlucHV0UmFuayA9IGlucHV0LnNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBuZXdTaGFwZSA9IGlucHV0LnNoYXBlLnNsaWNlKCk7XG4gICAgbGV0ICRkaW0gPSBkaW07XG4gICAgaWYgKGRpbSA8IDApIHtcbiAgICAgICAgLy8gTmVnYXRpdmUgdmFsdWUgaXMgY291bnRlZCBmcm9tIHRoZSB0YWlsIG9mIHJhbmsuXG4gICAgICAgIHV0aWwuYXNzZXJ0KC0oaW5wdXRSYW5rICsgMSkgPD0gZGltLCAoKSA9PiBgQXhpcyBtdXN0IGJlIGluIHRoZSBpbnRlcnZhbCBbJHstKGlucHV0UmFuayArIDEpfSwgJHtpbnB1dFJhbmt9XWApO1xuICAgICAgICAkZGltID0gaW5wdXRSYW5rICsgZGltICsgMTtcbiAgICB9XG4gICAgbmV3U2hhcGUuc3BsaWNlKCRkaW0sIDAsIDEpO1xuICAgIHJldHVybiByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IGlucHV0IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBuZXdTaGFwZSB9IH0pO1xufVxuZXhwb3J0IGNvbnN0IGV4cGFuZERpbXNDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRXhwYW5kRGltcyxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBleHBhbmREaW1zLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUV4cGFuZERpbXMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRXhwbTEgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQgeyBleHBtMUltcGxDUFUgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmNvbnN0IEVYUE0xID0gYHJldHVybiBleHAoeCkgLSAxLjA7YDtcbmV4cG9ydCBjb25zdCBleHBtMSA9IHVuYXJ5S2VybmVsRnVuYyh7IG9wU25pcHBldDogRVhQTTEsIHBhY2tlZE9wU25pcHBldDogRVhQTTEsIGNwdUtlcm5lbEltcGw6IGV4cG0xSW1wbENQVSB9KTtcbmV4cG9ydCBjb25zdCBleHBtMUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBFeHBtMSxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBleHBtMVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUV4cG0xLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEZGVCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBmZnRJbXBsIH0gZnJvbSAnLi9GRlRfaW1wbCc7XG5leHBvcnQgZnVuY3Rpb24gZmZ0KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IGlucHV0IH0gPSBpbnB1dHM7XG4gICAgcmV0dXJuIGZmdEltcGwoaW5wdXQsIGZhbHNlIC8qIGludmVyc2UgKi8sIGJhY2tlbmQpO1xufVxuZXhwb3J0IGNvbnN0IGZmdENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBGRlQsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogZmZ0XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RkZULmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgRkZUUHJvZ3JhbSB9IGZyb20gJy4uL2ZmdF9ncHUnO1xuaW1wb3J0IHsgY29tcGxleCB9IGZyb20gJy4vQ29tcGxleCc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmV4cG9ydCBmdW5jdGlvbiBmZnRJbXBsKHgsIGludmVyc2UsIGJhY2tlbmQpIHtcbiAgICBjb25zdCB4RGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQoeC5kYXRhSWQpO1xuICAgIGNvbnN0IGlucHV0U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSh4LnNoYXBlKTtcbiAgICAvLyBDb2xsYXBzZSBhbGwgb3V0ZXIgZGltZW5zaW9ucyB0byBhIHNpbmdsZSBiYXRjaCBkaW1lbnNpb24uXG4gICAgY29uc3QgaW5uZXJEaW1lbnNpb25TaXplID0geC5zaGFwZVt4LnNoYXBlLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IGJhdGNoID0gaW5wdXRTaXplIC8gaW5uZXJEaW1lbnNpb25TaXplO1xuICAgIGNvbnN0IGlucHV0MkQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IFtiYXRjaCwgaW5uZXJEaW1lbnNpb25TaXplXSB9IH0pO1xuICAgIGNvbnN0IHhTaGFwZSA9IGlucHV0MkQuc2hhcGU7XG4gICAgY29uc3QgcmVhbFByb2dyYW0gPSBuZXcgRkZUUHJvZ3JhbSgncmVhbCcsIHhTaGFwZSwgaW52ZXJzZSk7XG4gICAgY29uc3QgaW1hZ1Byb2dyYW0gPSBuZXcgRkZUUHJvZ3JhbSgnaW1hZycsIHhTaGFwZSwgaW52ZXJzZSk7XG4gICAgY29uc3QgaW5wdXRzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgICBkYXRhSWQ6IHhEYXRhLmNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsLmRhdGFJZCxcbiAgICAgICAgICAgIGR0eXBlOiB4RGF0YS5jb21wbGV4VGVuc29ySW5mb3MucmVhbC5kdHlwZSxcbiAgICAgICAgICAgIHNoYXBlOiB4U2hhcGVcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgZGF0YUlkOiB4RGF0YS5jb21wbGV4VGVuc29ySW5mb3MuaW1hZy5kYXRhSWQsXG4gICAgICAgICAgICBkdHlwZTogeERhdGEuY29tcGxleFRlbnNvckluZm9zLmltYWcuZHR5cGUsXG4gICAgICAgICAgICBzaGFwZTogeFNoYXBlXG4gICAgICAgIH1cbiAgICBdO1xuICAgIGNvbnN0IHJlYWxQYXJ0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocmVhbFByb2dyYW0sIGlucHV0cywgJ2Zsb2F0MzInKTtcbiAgICBjb25zdCBpbWFnUGFydCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKGltYWdQcm9ncmFtLCBpbnB1dHMsICdmbG9hdDMyJyk7XG4gICAgY29uc3QgY29tcGxleE91dHB1dCA9IGNvbXBsZXgoeyBpbnB1dHM6IHsgcmVhbDogcmVhbFBhcnQsIGltYWc6IGltYWdQYXJ0IH0sIGJhY2tlbmQgfSk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZWFsUGFydCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpbWFnUGFydCk7XG4gICAgY29uc3QgY29tcGxleE91dHB1dFJlc2hhcGVkID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiBjb21wbGV4T3V0cHV0IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiB4LnNoYXBlIH0gfSk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpbnB1dDJEKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGNvbXBsZXhPdXRwdXQpO1xuICAgIHJldHVybiBjb21wbGV4T3V0cHV0UmVzaGFwZWQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GRlRfaW1wbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBGaWxsLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IEZpbGxQcm9ncmFtIH0gZnJvbSAnLi4vZmlsbF9ncHUnO1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGwoYXJncykge1xuICAgIGNvbnN0IHsgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBzaGFwZSwgdmFsdWUgfSA9IGF0dHJzO1xuICAgIGxldCB7IGR0eXBlIH0gPSBhdHRycztcbiAgICBkdHlwZSA9IGR0eXBlIHx8IHV0aWwuaW5mZXJEdHlwZSh2YWx1ZSk7XG4gICAgaWYgKGR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBTdHJpbmcgdHlwZSBzaG91bGQgYmUgaGFuZGxlZCBpbiBDUFUgbWVtb3J5LlxuICAgICAgICBjb25zdCB2YWx1ZXMgPSB1dGlsLmdldEFycmF5RnJvbURUeXBlKGR0eXBlLCB1dGlsLnNpemVGcm9tU2hhcGUoc2hhcGUpKTtcbiAgICAgICAgdmFsdWVzLmZpbGwodmFsdWUpO1xuICAgICAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhzaGFwZSwgZHR5cGUsIHZhbHVlcyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBwcm9ncmFtID0gbmV3IEZpbGxQcm9ncmFtKHNoYXBlLCB2YWx1ZSk7XG4gICAgICAgIGNvbnN0IGN1c3RvbVZhbHVlcyA9IFtbdmFsdWVdXTtcbiAgICAgICAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtdLCBkdHlwZSwgY3VzdG9tVmFsdWVzKTtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgZmlsbENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBGaWxsLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGZpbGxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GaWxsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEZsaXBMZWZ0UmlnaHQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgRmxpcExlZnRSaWdodFByb2dyYW0gfSBmcm9tICcuLi9mbGlwX2xlZnRfcmlnaHRfZ3B1JztcbmV4cG9ydCBjb25zdCBmbGlwTGVmdFJpZ2h0Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEZsaXBMZWZ0UmlnaHQsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogKHsgaW5wdXRzLCBiYWNrZW5kIH0pID0+IHtcbiAgICAgICAgY29uc3QgeyBpbWFnZSB9ID0gaW5wdXRzO1xuICAgICAgICBjb25zdCB3ZWJnbEJhY2tlbmQgPSBiYWNrZW5kO1xuICAgICAgICBjb25zdCBwcm9ncmFtID0gbmV3IEZsaXBMZWZ0UmlnaHRQcm9ncmFtKGltYWdlLnNoYXBlKTtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gd2ViZ2xCYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbaW1hZ2VdLCBpbWFnZS5kdHlwZSk7XG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZsaXBMZWZ0UmlnaHQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRmxvb3IgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQgeyBmbG9vckltcGxDUFUgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmNvbnN0IEZMT09SID0gYHJldHVybiBmbG9vcih4KTtgO1xuZXhwb3J0IGNvbnN0IGZsb29yID0gdW5hcnlLZXJuZWxGdW5jKHsgb3BTbmlwcGV0OiBGTE9PUiwgcGFja2VkT3BTbmlwcGV0OiBGTE9PUiwgY3B1S2VybmVsSW1wbDogZmxvb3JJbXBsQ1BVIH0pO1xuZXhwb3J0IGNvbnN0IGZsb29yQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEZsb29yLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGZsb29yLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZsb29yLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEZsb29yRGl2IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbi8vIFdlIHVzZSBuYXRpdmUgaW50ZWdlciBkaXZpc2lvbiB0byBkZWFsIHdpdGggZmxvYXRpbmcgcG9pbnQgaW1wcmVjaXNpb24uIFNpbmNlXG4vLyB3ZSBpbXBsZW1lbnQgZmxvb3IgZGl2aXNpb24gYW5kIGdsc2wgaW1wbGVtZW50cyB0cnVuY2F0ZWQgZGl2aXNpb24sIHdlXG4vLyBjb3JyZWN0IGZvciB0aGlzIGJ5IHN1YnRyYWN0aW5nIDEgZnJvbSByZXN1bHQgd2hlbiB0aGUgcmVzdWx0IGlzIG5lZ2F0aXZlIGFuZFxuLy8gdGhlcmUgaXMgYSByZW1haW5kZXIuXG5jb25zdCBJTlRfRElWID0gYFxuICBmbG9hdCBzID0gc2lnbihhKSAqIHNpZ24oYik7XG4gIGludCBpYSA9IHJvdW5kKGEpO1xuICBpbnQgaWIgPSByb3VuZChiKTtcbiAgaWYgKGliICE9IDApIHtcbiAgICAvLyBXaW5kb3dzIChEM0QpIHdhbnRzIGd1YXJhbnRlZWQgbm9uLXplcm8gaW50IGRpdmlzaW9uIGF0IGNvbXBpbGUtdGltZS5cbiAgICByZXR1cm4gZmxvYXQoaWRpdihpYSwgaWIsIHMpKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gTkFOO1xuICB9XG5gO1xuY29uc3QgSU5UX0RJVl9QQUNLRUQgPSBgXG4gIGl2ZWM0IGlhID0gcm91bmQoYSk7XG4gIGl2ZWM0IGliID0gcm91bmQoYik7XG4gIGJ2ZWM0IGNvbmQgPSBub3RFcXVhbChpYiwgaXZlYzQoMCkpO1xuICBpdmVjNCByZXN1bHQgPSBpdmVjNCgwKTtcbiAgdmVjNCBzID0gc2lnbihhKSAqIHNpZ24oYik7XG5cbiAgLy8gV2luZG93cyAoRDNEKSB3YW50cyBndWFyYW50ZWVkIG5vbi16ZXJvIGludCBkaXZpc2lvbiBhdCBjb21waWxlLXRpbWUuXG4gIGlmIChjb25kWzBdKSB7XG4gICAgcmVzdWx0WzBdID0gaWRpdihpYVswXSwgaWJbMF0sIHNbMF0pO1xuICB9XG4gIGlmIChjb25kWzFdKSB7XG4gICAgcmVzdWx0WzFdID0gaWRpdihpYVsxXSwgaWJbMV0sIHNbMV0pO1xuICB9XG4gIGlmIChjb25kWzJdKSB7XG4gICAgcmVzdWx0WzJdID0gaWRpdihpYVsyXSwgaWJbMl0sIHNbMl0pO1xuICB9XG4gIGlmIChjb25kWzNdKSB7XG4gICAgcmVzdWx0WzNdID0gaWRpdihpYVszXSwgaWJbM10sIHNbM10pO1xuICB9XG4gIHJldHVybiB2ZWM0KHJlc3VsdCk7XG5gO1xuZXhwb3J0IGNvbnN0IGZsb29yRGl2ID0gYmluYXJ5S2VybmVsRnVuYyh7IG9wU25pcHBldDogSU5UX0RJViwgcGFja2VkT3BTbmlwcGV0OiBJTlRfRElWX1BBQ0tFRCwgZHR5cGU6ICdpbnQzMicgfSk7XG5leHBvcnQgY29uc3QgZmxvb3JEaXZDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRmxvb3JEaXYsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogZmxvb3JEaXZcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GbG9vckRpdi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBlbnYgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgRnJvbVBpeGVscyB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBUZXh0dXJlVXNhZ2UgfSBmcm9tICcuLi90ZXhfdXRpbCc7XG5pbXBvcnQgeyBGcm9tUGl4ZWxzUHJvZ3JhbSB9IGZyb20gJy4vRnJvbVBpeGVsc191dGlscy9mcm9tX3BpeGVsc19ncHUnO1xuaW1wb3J0IHsgRnJvbVBpeGVsc1BhY2tlZFByb2dyYW0gfSBmcm9tICcuL0Zyb21QaXhlbHNfdXRpbHMvZnJvbV9waXhlbHNfcGFja2VkX2dwdSc7XG5leHBvcnQgY29uc3QgZnJvbVBpeGVsc0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBGcm9tUGl4ZWxzLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGZyb21QaXhlbHMsXG59O1xubGV0IGZyb21QaXhlbHMyRENvbnRleHQ7XG5mdW5jdGlvbiBmcm9tUGl4ZWxzKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgbGV0IHsgcGl4ZWxzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBudW1DaGFubmVscyB9ID0gYXR0cnM7XG4gICAgY29uc3QgaXNWaWRlbyA9IHR5cGVvZiAoSFRNTFZpZGVvRWxlbWVudCkgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIHBpeGVscyBpbnN0YW5jZW9mIEhUTUxWaWRlb0VsZW1lbnQ7XG4gICAgY29uc3QgaXNJbWFnZSA9IHR5cGVvZiAoSFRNTEltYWdlRWxlbWVudCkgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIHBpeGVscyBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQ7XG4gICAgY29uc3QgW3dpZHRoLCBoZWlnaHRdID0gaXNWaWRlbyA/XG4gICAgICAgIFtcbiAgICAgICAgICAgIHBpeGVscy52aWRlb1dpZHRoLFxuICAgICAgICAgICAgcGl4ZWxzLnZpZGVvSGVpZ2h0XG4gICAgICAgIF0gOlxuICAgICAgICBbcGl4ZWxzLndpZHRoLCBwaXhlbHMuaGVpZ2h0XTtcbiAgICBjb25zdCB0ZXhTaGFwZSA9IFtoZWlnaHQsIHdpZHRoXTtcbiAgICBjb25zdCBvdXRTaGFwZSA9IFtoZWlnaHQsIHdpZHRoLCBudW1DaGFubmVsc107XG4gICAgaWYgKGlzSW1hZ2UgfHwgaXNWaWRlbykge1xuICAgICAgICBpZiAoZnJvbVBpeGVsczJEQ29udGV4dCA9PSBudWxsKSB7XG4gICAgICAgICAgICBmcm9tUGl4ZWxzMkRDb250ZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJykuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgfVxuICAgICAgICBmcm9tUGl4ZWxzMkRDb250ZXh0LmNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgICAgICBmcm9tUGl4ZWxzMkRDb250ZXh0LmNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIGZyb21QaXhlbHMyRENvbnRleHQuZHJhd0ltYWdlKHBpeGVscywgMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIHBpeGVscyA9IGZyb21QaXhlbHMyRENvbnRleHQuY2FudmFzO1xuICAgIH1cbiAgICBjb25zdCB0ZW1wUGl4ZWxIYW5kbGUgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHRleFNoYXBlLCAnaW50MzInKTtcbiAgICAvLyBUaGlzIGlzIGEgYnl0ZSB0ZXh0dXJlIHdpdGggcGl4ZWxzLlxuICAgIGJhY2tlbmQudGV4RGF0YS5nZXQodGVtcFBpeGVsSGFuZGxlLmRhdGFJZCkudXNhZ2UgPSBUZXh0dXJlVXNhZ2UuUElYRUxTO1xuICAgIGJhY2tlbmQuZ3BncHUudXBsb2FkUGl4ZWxEYXRhVG9UZXh0dXJlKGJhY2tlbmQuZ2V0VGV4dHVyZSh0ZW1wUGl4ZWxIYW5kbGUuZGF0YUlkKSwgcGl4ZWxzKTtcbiAgICBjb25zdCBwcm9ncmFtID0gZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDSycpID9cbiAgICAgICAgbmV3IEZyb21QaXhlbHNQYWNrZWRQcm9ncmFtKG91dFNoYXBlKSA6XG4gICAgICAgIG5ldyBGcm9tUGl4ZWxzUHJvZ3JhbShvdXRTaGFwZSk7XG4gICAgY29uc3QgcmVzID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3RlbXBQaXhlbEhhbmRsZV0sICdpbnQzMicpO1xuICAgIGJhY2tlbmQuZGlzcG9zZURhdGEodGVtcFBpeGVsSGFuZGxlLmRhdGFJZCk7XG4gICAgcmV0dXJuIHJlcztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZyb21QaXhlbHMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZ2V0R2xzbERpZmZlcmVuY2VzIH0gZnJvbSAnLi4vLi4vZ2xzbF92ZXJzaW9uJztcbmV4cG9ydCBjbGFzcyBGcm9tUGl4ZWxzUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3Iob3V0cHV0U2hhcGUpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWydBJ107XG4gICAgICAgIGNvbnN0IGdsc2wgPSBnZXRHbHNsRGlmZmVyZW5jZXMoKTtcbiAgICAgICAgY29uc3QgW2hlaWdodCwgd2lkdGgsXSA9IG91dHB1dFNoYXBlO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGU7XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWMzIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgdGV4UiA9IGNvb3Jkc1swXTtcbiAgICAgICAgaW50IHRleEMgPSBjb29yZHNbMV07XG4gICAgICAgIGludCBkZXB0aCA9IGNvb3Jkc1syXTtcbiAgICAgICAgdmVjMiB1diA9ICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvIHZlYzIoJHt3aWR0aH0uMCwgJHtoZWlnaHR9LjApO1xuXG4gICAgICAgIHZlYzQgdmFsdWVzID0gJHtnbHNsLnRleHR1cmUyRH0oQSwgdXYpO1xuICAgICAgICBmbG9hdCB2YWx1ZTtcbiAgICAgICAgaWYgKGRlcHRoID09IDApIHtcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlcy5yO1xuICAgICAgICB9IGVsc2UgaWYgKGRlcHRoID09IDEpIHtcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlcy5nO1xuICAgICAgICB9IGVsc2UgaWYgKGRlcHRoID09IDIpIHtcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlcy5iO1xuICAgICAgICB9IGVsc2UgaWYgKGRlcHRoID09IDMpIHtcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlcy5hO1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0T3V0cHV0KGZsb29yKHZhbHVlICogMjU1LjAgKyAwLjUpKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZyb21fcGl4ZWxzX2dwdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBnZXRHbHNsRGlmZmVyZW5jZXMgfSBmcm9tICcuLi8uLi9nbHNsX3ZlcnNpb24nO1xuZXhwb3J0IGNsYXNzIEZyb21QaXhlbHNQYWNrZWRQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3RvcihvdXRwdXRTaGFwZSkge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgICAgICAgdGhpcy5wYWNrZWRJbnB1dHMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wYWNrZWRPdXRwdXQgPSB0cnVlO1xuICAgICAgICBjb25zdCBnbHNsID0gZ2V0R2xzbERpZmZlcmVuY2VzKCk7XG4gICAgICAgIGNvbnN0IFtoZWlnaHQsIHdpZHRoLF0gPSBvdXRwdXRTaGFwZTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IG91dHB1dFNoYXBlO1xuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMyBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IHRleFIgPSBjb29yZHNbMF07XG4gICAgICAgIGludCB0ZXhDID0gY29vcmRzWzFdO1xuICAgICAgICBpbnQgZGVwdGggPSBjb29yZHNbMl07XG5cbiAgICAgICAgdmVjNCByZXN1bHQgPSB2ZWM0KDAuKTtcblxuICAgICAgICBmb3IoaW50IHJvdz0wOyByb3c8PTE7IHJvdysrKSB7XG4gICAgICAgICAgZm9yKGludCBjb2w9MDsgY29sPD0xOyBjb2wrKykge1xuICAgICAgICAgICAgdGV4QyA9IGNvb3Jkc1sxXSArIHJvdztcbiAgICAgICAgICAgIGRlcHRoID0gY29vcmRzWzJdICsgY29sO1xuXG4gICAgICAgICAgICB2ZWMyIHV2ID0gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC9cbiAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3dpZHRofS4wLCAke2hlaWdodH0uMCk7XG4gICAgICAgICAgICB2ZWM0IHZhbHVlcyA9ICR7Z2xzbC50ZXh0dXJlMkR9KEEsIHV2KTtcbiAgICAgICAgICAgIGZsb2F0IHZhbHVlO1xuICAgICAgICAgICAgaWYgKGRlcHRoID09IDApIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZXMucjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVwdGggPT0gMSkge1xuICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlcy5nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkZXB0aCA9PSAyKSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gdmFsdWVzLmI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRlcHRoID09IDMpIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZXMuYTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzdWx0W3JvdyAqIDIgKyBjb2xdID0gZmxvb3IodmFsdWUgKiAyNTUuMCArIDAuNSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgJHtnbHNsLm91dHB1dH0gPSByZXN1bHQ7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mcm9tX3BpeGVsc19wYWNrZWRfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgZW52LCBGdXNlZENvbnYyRCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBDb252MkRQcm9ncmFtIH0gZnJvbSAnLi4vY29udl9ncHUnO1xuaW1wb3J0IHsgbWFwQWN0aXZhdGlvblRvU2hhZGVyUHJvZ3JhbSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHsgY29udjJkQnlNYXRNdWwsIGNvbnYyZFdpdGhJbTJSb3cgfSBmcm9tICcuL0NvbnYyRF9pbXBsJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuZXhwb3J0IGZ1bmN0aW9uIGZ1c2VkQ29udjJkKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4LCBmaWx0ZXIsIGJpYXMsIHByZWx1QWN0aXZhdGlvbldlaWdodHMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGlsYXRpb25zLCBkaW1Sb3VuZGluZ01vZGUsIGFjdGl2YXRpb24sIGxlYWt5cmVsdUFscGhhIH0gPSBhdHRycztcbiAgICBjb25zdCAkZGF0YUZvcm1hdCA9IGJhY2tlbmRfdXRpbC5jb252ZXJ0Q29udjJERGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyh4LnNoYXBlLCBmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGZhbHNlIC8qIGRlcHRod2lzZSAqLywgJGRhdGFGb3JtYXQpO1xuICAgIGxldCBvdXQ7XG4gICAgY29uc3QgaW50ZXJtZWRpYXRlcyA9IFtdO1xuICAgIGlmIChjb252SW5mby5maWx0ZXJIZWlnaHQgPT09IDEgJiYgY29udkluZm8uZmlsdGVyV2lkdGggPT09IDEgJiZcbiAgICAgICAgY29udkluZm8uZGlsYXRpb25IZWlnaHQgPT09IDEgJiYgY29udkluZm8uZGlsYXRpb25XaWR0aCA9PT0gMSAmJlxuICAgICAgICBjb252SW5mby5zdHJpZGVIZWlnaHQgPT09IDEgJiYgY29udkluZm8uc3RyaWRlV2lkdGggPT09IDEgJiZcbiAgICAgICAgKGNvbnZJbmZvLnBhZEluZm8udHlwZSA9PT0gJ1NBTUUnIHx8IGNvbnZJbmZvLnBhZEluZm8udHlwZSA9PT0gJ1ZBTElEJykpIHtcbiAgICAgICAgb3V0ID0gY29udjJkQnlNYXRNdWwoe1xuICAgICAgICAgICAgeCxcbiAgICAgICAgICAgIGZpbHRlcixcbiAgICAgICAgICAgIGNvbnZJbmZvLFxuICAgICAgICAgICAgYmFja2VuZCxcbiAgICAgICAgICAgIGJpYXMsXG4gICAgICAgICAgICBhY3RpdmF0aW9uLFxuICAgICAgICAgICAgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyxcbiAgICAgICAgICAgIGxlYWt5cmVsdUFscGhhXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChlbnYoKS5nZXRCb29sKCdXRUJHTF9DT05WX0lNMkNPTCcpICYmIHguc2hhcGVbMF0gPT09IDEpIHtcbiAgICAgICAgb3V0ID0gY29udjJkV2l0aEltMlJvdyh7XG4gICAgICAgICAgICB4LFxuICAgICAgICAgICAgZmlsdGVyLFxuICAgICAgICAgICAgY29udkluZm8sXG4gICAgICAgICAgICBiYWNrZW5kLFxuICAgICAgICAgICAgYmlhcyxcbiAgICAgICAgICAgIGFjdGl2YXRpb24sXG4gICAgICAgICAgICBwcmVsdUFjdGl2YXRpb25XZWlnaHRzLFxuICAgICAgICAgICAgbGVha3lyZWx1QWxwaGFcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBoYXNCaWFzID0gYmlhcyAhPSBudWxsO1xuICAgICAgICBjb25zdCBoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzID0gcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyAhPSBudWxsO1xuICAgICAgICBjb25zdCBoYXNMZWFreXJlbHVBbHBoYSA9IGFjdGl2YXRpb24gPT09ICdsZWFreXJlbHUnO1xuICAgICAgICBjb25zdCBmdXNlZEFjdGl2YXRpb24gPSBhY3RpdmF0aW9uID8gbWFwQWN0aXZhdGlvblRvU2hhZGVyUHJvZ3JhbShhY3RpdmF0aW9uLCBmYWxzZSkgOiBudWxsO1xuICAgICAgICBjb25zdCBwcm9ncmFtID0gbmV3IENvbnYyRFByb2dyYW0oY29udkluZm8sIGhhc0JpYXMsIGZ1c2VkQWN0aXZhdGlvbiwgaGFzUHJlbHVBY3RpdmF0aW9uV2VpZ2h0cywgaGFzTGVha3lyZWx1QWxwaGEpO1xuICAgICAgICBjb25zdCBpbnB1dHMgPSBbeCwgZmlsdGVyXTtcbiAgICAgICAgaWYgKGJpYXMpIHtcbiAgICAgICAgICAgIGlucHV0cy5wdXNoKGJpYXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcmVsdUFjdGl2YXRpb25XZWlnaHRzKSB7XG4gICAgICAgICAgICBpbnB1dHMucHVzaChwcmVsdUFjdGl2YXRpb25XZWlnaHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzTGVha3lyZWx1QWxwaGEpIHtcbiAgICAgICAgICAgIGNvbnN0ICRsZWFreXJlbHVBbHBoYSA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8oW10sICdmbG9hdDMyJywgdXRpbC5jcmVhdGVTY2FsYXJWYWx1ZShsZWFreXJlbHVBbHBoYSwgJ2Zsb2F0MzInKSk7XG4gICAgICAgICAgICBpbnB1dHMucHVzaCgkbGVha3lyZWx1QWxwaGEpO1xuICAgICAgICAgICAgaW50ZXJtZWRpYXRlcy5wdXNoKCRsZWFreXJlbHVBbHBoYSk7XG4gICAgICAgIH1cbiAgICAgICAgb3V0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgaW5wdXRzLCAnZmxvYXQzMicpO1xuICAgIH1cbiAgICBjb25zdCBvdXRSZXNoYXBlZCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogb3V0IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBjb252SW5mby5vdXRTaGFwZSB9IH0pO1xuICAgIGludGVybWVkaWF0ZXMucHVzaChvdXQpO1xuICAgIGludGVybWVkaWF0ZXMuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuICAgIHJldHVybiBvdXRSZXNoYXBlZDtcbn1cbmV4cG9ydCBjb25zdCBmdXNlZENvbnYyRENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBGdXNlZENvbnYyRCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBmdXNlZENvbnYyZCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GdXNlZENvbnYyRC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIGVudiwgRnVzZWREZXB0aHdpc2VDb252MkQsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgRGVwdGh3aXNlQ29udjJEUHJvZ3JhbSB9IGZyb20gJy4uL2NvbnZfZ3B1X2RlcHRod2lzZSc7XG5pbXBvcnQgeyBEZXB0aHdpc2VDb252UGFja2VkMkRQcm9ncmFtIH0gZnJvbSAnLi4vY29udl9wYWNrZWRfZ3B1X2RlcHRod2lzZSc7XG5pbXBvcnQgeyBtYXBBY3RpdmF0aW9uVG9TaGFkZXJQcm9ncmFtIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5leHBvcnQgZnVuY3Rpb24gZnVzZWREZXB0aHdpc2VDb252MkQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHgsIGZpbHRlciwgYmlhcywgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgc3RyaWRlcywgcGFkLCBkaWxhdGlvbnMsIGRpbVJvdW5kaW5nTW9kZSwgYWN0aXZhdGlvbiwgbGVha3lyZWx1QWxwaGEgfSA9IGF0dHJzO1xuICAgIGNvbnN0IGludGVybWVkaWF0ZXMgPSBbXTtcbiAgICBsZXQgJGRpbGF0aW9ucyA9IGRpbGF0aW9ucztcbiAgICBpZiAoJGRpbGF0aW9ucyA9PSBudWxsKSB7XG4gICAgICAgICRkaWxhdGlvbnMgPSBbMSwgMV07XG4gICAgfVxuICAgIHV0aWwuYXNzZXJ0KGJhY2tlbmRfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgJGRpbGF0aW9ucyksICgpID0+ICdFcnJvciBpbiBkZXB0aHdpc2VDb252MmQ6IEVpdGhlciBzdHJpZGVzIG9yIGRpbGF0aW9ucyBtdXN0IGJlICcgK1xuICAgICAgICBgMS4gR290IHN0cmlkZXMgJHtzdHJpZGVzfSBhbmQgZGlsYXRpb25zICckeyRkaWxhdGlvbnN9J2ApO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252MkRJbmZvKHguc2hhcGUsIGZpbHRlci5zaGFwZSwgc3RyaWRlcywgJGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIHRydWUgLyogZGVwdGh3aXNlICovKTtcbiAgICBjb25zdCBzaG91bGRQYWNrRGVwdGh3aXNlQ29udiA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfREVQVEhXSVNFQ09OVicpICYmXG4gICAgICAgIGNvbnZJbmZvLnN0cmlkZVdpZHRoIDw9IDIgJiZcbiAgICAgICAgY29udkluZm8ub3V0Q2hhbm5lbHMgLyBjb252SW5mby5pbkNoYW5uZWxzID09PSAxO1xuICAgIGNvbnN0IGZ1c2VkQWN0aXZhdGlvbiA9IGFjdGl2YXRpb24gP1xuICAgICAgICBtYXBBY3RpdmF0aW9uVG9TaGFkZXJQcm9ncmFtKGFjdGl2YXRpb24sIHNob3VsZFBhY2tEZXB0aHdpc2VDb252KSA6XG4gICAgICAgIG51bGw7XG4gICAgY29uc3QgcHJvZ3JhbUlucHV0cyA9IFt4LCBmaWx0ZXJdO1xuICAgIGNvbnN0IGhhc0JpYXMgPSBiaWFzICE9IG51bGw7XG4gICAgY29uc3QgaGFzUHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyA9IHByZWx1QWN0aXZhdGlvbldlaWdodHMgIT0gbnVsbDtcbiAgICBjb25zdCBoYXNMZWFreXJlbHVBbHBoYSA9IGFjdGl2YXRpb24gPT09ICdsZWFreXJlbHUnO1xuICAgIGlmIChoYXNCaWFzKSB7XG4gICAgICAgIHByb2dyYW1JbnB1dHMucHVzaChiaWFzKTtcbiAgICB9XG4gICAgaWYgKGhhc1ByZWx1QWN0aXZhdGlvbldlaWdodHMpIHtcbiAgICAgICAgcHJvZ3JhbUlucHV0cy5wdXNoKHByZWx1QWN0aXZhdGlvbldlaWdodHMpO1xuICAgIH1cbiAgICBpZiAoaGFzTGVha3lyZWx1QWxwaGEpIHtcbiAgICAgICAgY29uc3QgJGxlYWt5cmVsdUFscGhhID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbXSwgJ2Zsb2F0MzInLCB1dGlsLmNyZWF0ZVNjYWxhclZhbHVlKGxlYWt5cmVsdUFscGhhLCAnZmxvYXQzMicpKTtcbiAgICAgICAgcHJvZ3JhbUlucHV0cy5wdXNoKCRsZWFreXJlbHVBbHBoYSk7XG4gICAgICAgIGludGVybWVkaWF0ZXMucHVzaCgkbGVha3lyZWx1QWxwaGEpO1xuICAgIH1cbiAgICBsZXQgcHJvZ3JhbTtcbiAgICBpZiAoc2hvdWxkUGFja0RlcHRod2lzZUNvbnYpIHtcbiAgICAgICAgcHJvZ3JhbSA9IG5ldyBEZXB0aHdpc2VDb252UGFja2VkMkRQcm9ncmFtKGNvbnZJbmZvLCBoYXNCaWFzLCBmdXNlZEFjdGl2YXRpb24sIGhhc1ByZWx1QWN0aXZhdGlvbldlaWdodHMsIGhhc0xlYWt5cmVsdUFscGhhKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHByb2dyYW0gPSBuZXcgRGVwdGh3aXNlQ29udjJEUHJvZ3JhbShjb252SW5mbywgaGFzQmlhcywgZnVzZWRBY3RpdmF0aW9uLCBoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzLCBoYXNMZWFreXJlbHVBbHBoYSk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIHByb2dyYW1JbnB1dHMsICdmbG9hdDMyJyk7XG4gICAgaW50ZXJtZWRpYXRlcy5mb3JFYWNoKHQgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0KSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBjb25zdCBmdXNlZERlcHRod2lzZUNvbnYyRENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBGdXNlZERlcHRod2lzZUNvbnYyRCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBmdXNlZERlcHRod2lzZUNvbnYyRCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GdXNlZERlcHRod2lzZUNvbnYyRC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIEdhdGhlck5kLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IEdhdGhlck5EUHJvZ3JhbSB9IGZyb20gJy4uL2dhdGhlcl9uZF9ncHUnO1xuaW1wb3J0IHsgZ2F0aGVyTmRJbXBsQ1BVIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmV4cG9ydCBmdW5jdGlvbiBnYXRoZXJOZChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBwYXJhbXMsIGluZGljZXMgfSA9IGlucHV0cztcbiAgICBjb25zdCBpbmRpY2VzU2hhcGUgPSBpbmRpY2VzLnNoYXBlO1xuICAgIGNvbnN0IHNsaWNlUmFuayA9IGluZGljZXNTaGFwZVtpbmRpY2VzU2hhcGUubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgcGFyYW1zU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShwYXJhbXMuc2hhcGUpO1xuICAgIGNvbnN0IFtyZXN1bHRTaGFwZSwgbnVtU2xpY2VzLCBzbGljZVNpemUsIHN0cmlkZXNdID0gYmFja2VuZF91dGlsLnByZXBhcmVBbmRWYWxpZGF0ZShwYXJhbXMsIGluZGljZXMpO1xuICAgIGNvbnN0IGZsYXR0ZW5JbmRpY2VzID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiBpbmRpY2VzIH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBbbnVtU2xpY2VzLCBzbGljZVJhbmtdIH0gfSk7XG4gICAgY29uc3QgZmxhdHRlblggPSByZXNoYXBlKHtcbiAgICAgICAgaW5wdXRzOiB7IHg6IHBhcmFtcyB9LFxuICAgICAgICBiYWNrZW5kLFxuICAgICAgICBhdHRyczogeyBzaGFwZTogWyh1dGlsLnNpemVGcm9tU2hhcGUocGFyYW1zLnNoYXBlKSAvIHNsaWNlU2l6ZSksIHNsaWNlU2l6ZV0gfVxuICAgIH0pO1xuICAgIGlmIChiYWNrZW5kLnNob3VsZEV4ZWN1dGVPbkNQVShbcGFyYW1zLCBpbmRpY2VzXSkgfHxcbiAgICAgICAgcGFyYW1zLmR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCBpbmRpY2VzRGF0YSA9IGJhY2tlbmQucmVhZFN5bmMoaW5kaWNlcy5kYXRhSWQpO1xuICAgICAgICBjb25zdCBwYXJhbXNCdWYgPSBiYWNrZW5kLmJ1ZmZlclN5bmMocGFyYW1zKTtcbiAgICAgICAgY29uc3Qgb3V0VmFsdWUgPSBnYXRoZXJOZEltcGxDUFUoaW5kaWNlc0RhdGEsIHBhcmFtc0J1ZiwgcGFyYW1zLmR0eXBlLCBudW1TbGljZXMsIHNsaWNlUmFuaywgc2xpY2VTaXplLCBzdHJpZGVzLCBwYXJhbXMuc2hhcGUsIHBhcmFtc1NpemUpO1xuICAgICAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhyZXN1bHRTaGFwZSwgcGFyYW1zLmR0eXBlLCBvdXRWYWx1ZS52YWx1ZXMpO1xuICAgIH1cbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IEdhdGhlck5EUHJvZ3JhbShzbGljZVJhbmssIHN0cmlkZXMsIFtudW1TbGljZXMsIHNsaWNlU2l6ZV0pO1xuICAgIGNvbnN0IHJlcyA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtmbGF0dGVuWCwgZmxhdHRlbkluZGljZXNdLCBmbGF0dGVuWC5kdHlwZSk7XG4gICAgY29uc3QgcmVzaGFwZWQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHJlcyB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogcmVzdWx0U2hhcGUgfSB9KTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGZsYXR0ZW5JbmRpY2VzKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGZsYXR0ZW5YKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlcyk7XG4gICAgcmV0dXJuIHJlc2hhcGVkO1xufVxuZXhwb3J0IGNvbnN0IGdhdGhlck5kQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEdhdGhlck5kLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGdhdGhlck5kXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9R2F0aGVyTmQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBHYXRoZXJWMiwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBHYXRoZXJQcm9ncmFtIH0gZnJvbSAnLi4vZ2F0aGVyX2dwdSc7XG5pbXBvcnQgeyBnYXRoZXJWMkltcGxDUFUgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuZXhwb3J0IGZ1bmN0aW9uIGdhdGhlclYyKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4LCBpbmRpY2VzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBheGlzLCBiYXRjaERpbXMgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHBhcnNlZEF4aXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpWzBdO1xuICAgIGNvbnN0IHNoYXBlSW5mbyA9IGJhY2tlbmRfdXRpbC5zZWdtZW50X3V0aWwuY29sbGVjdEdhdGhlck9wU2hhcGVJbmZvKHgsIGluZGljZXMsIHBhcnNlZEF4aXMsIGJhdGNoRGltcyk7XG4gICAgY29uc3QgaW5kaWNlc1NpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoaW5kaWNlcy5zaGFwZSk7XG4gICAgY29uc3QgdG9EaXNwb3NlID0gW107XG4gICAgY29uc3QgZmxhdHRlblggPSByZXNoYXBlKHtcbiAgICAgICAgaW5wdXRzOiB7IHggfSxcbiAgICAgICAgYmFja2VuZCxcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgIHNoYXBlOiBbXG4gICAgICAgICAgICAgICAgc2hhcGVJbmZvLmJhdGNoU2l6ZSwgc2hhcGVJbmZvLm91dGVyU2l6ZSwgc2hhcGVJbmZvLmRpbVNpemUsXG4gICAgICAgICAgICAgICAgc2hhcGVJbmZvLnNsaWNlU2l6ZVxuICAgICAgICAgICAgXVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgZmxhdHRlbkluZGV4ID0gcmVzaGFwZSh7XG4gICAgICAgIGlucHV0czogeyB4OiBpbmRpY2VzIH0sXG4gICAgICAgIGJhY2tlbmQsXG4gICAgICAgIGF0dHJzOiB7IHNoYXBlOiBbc2hhcGVJbmZvLmJhdGNoU2l6ZSwgaW5kaWNlc1NpemUgLyBzaGFwZUluZm8uYmF0Y2hTaXplXSB9XG4gICAgfSk7XG4gICAgdG9EaXNwb3NlLnB1c2goZmxhdHRlblgpO1xuICAgIHRvRGlzcG9zZS5wdXNoKGZsYXR0ZW5JbmRleCk7XG4gICAgY29uc3QgZmxhdHRlbk91dHB1dFNoYXBlID0gW1xuICAgICAgICBzaGFwZUluZm8uYmF0Y2hTaXplLCBzaGFwZUluZm8ub3V0ZXJTaXplLCBpbmRpY2VzU2l6ZSAvIHNoYXBlSW5mby5iYXRjaFNpemUsXG4gICAgICAgIHNoYXBlSW5mby5zbGljZVNpemVcbiAgICBdO1xuICAgIGlmIChiYWNrZW5kLnNob3VsZEV4ZWN1dGVPbkNQVShbeCwgaW5kaWNlc10pIHx8IHguZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IGluZGljZXNCdWYgPSBiYWNrZW5kLmJ1ZmZlclN5bmMoZmxhdHRlbkluZGV4KTtcbiAgICAgICAgY29uc3QgeEJ1ZiA9IGJhY2tlbmQuYnVmZmVyU3luYyhmbGF0dGVuWCk7XG4gICAgICAgIGNvbnN0IG91dEJ1ZiA9IGdhdGhlclYySW1wbENQVSh4QnVmLCBpbmRpY2VzQnVmLCBmbGF0dGVuT3V0cHV0U2hhcGUpO1xuICAgICAgICB0b0Rpc3Bvc2UuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuICAgICAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhzaGFwZUluZm8ub3V0cHV0U2hhcGUsIG91dEJ1Zi5kdHlwZSwgb3V0QnVmLnZhbHVlcyk7XG4gICAgfVxuICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgR2F0aGVyUHJvZ3JhbShmbGF0dGVuWC5zaGFwZSwgZmxhdHRlbk91dHB1dFNoYXBlKTtcbiAgICBjb25zdCByZXMgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbZmxhdHRlblgsIGZsYXR0ZW5JbmRleF0sIGZsYXR0ZW5YLmR0eXBlKTtcbiAgICB0b0Rpc3Bvc2UucHVzaChyZXMpO1xuICAgIGNvbnN0IHJlc2hhcGVkID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiByZXMgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IHNoYXBlSW5mby5vdXRwdXRTaGFwZSB9IH0pO1xuICAgIHRvRGlzcG9zZS5mb3JFYWNoKHQgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0KSk7XG4gICAgcmV0dXJuIHJlc2hhcGVkO1xufVxuZXhwb3J0IGNvbnN0IGdhdGhlclYyQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEdhdGhlclYyLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGdhdGhlclYyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9R2F0aGVyVjIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgR3JlYXRlciB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBiaW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQgeyBncmVhdGVySW1wbENQVSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuY29uc3QgR1JFQVRFUiA9IGByZXR1cm4gZmxvYXQoYSA+IGIpO2A7XG5jb25zdCBHUkVBVEVSX1BBQ0tFRCA9IGBcbiAgcmV0dXJuIHZlYzQoZ3JlYXRlclRoYW4oYSwgYikpO1xuYDtcbmV4cG9ydCBjb25zdCBncmVhdGVyID0gYmluYXJ5S2VybmVsRnVuYyh7XG4gICAgb3BTbmlwcGV0OiBHUkVBVEVSLFxuICAgIHBhY2tlZE9wU25pcHBldDogR1JFQVRFUl9QQUNLRUQsXG4gICAgY3B1S2VybmVsSW1wbDogZ3JlYXRlckltcGxDUFUsXG4gICAgZHR5cGU6ICdib29sJ1xufSk7XG5leHBvcnQgY29uc3QgZ3JlYXRlckNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBHcmVhdGVyLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGdyZWF0ZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1HcmVhdGVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEdyZWF0ZXJFcXVhbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBiaW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQgeyBncmVhdGVyRXF1YWxJbXBsQ1BVIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5jb25zdCBHUkVBVEVSX0VRVUFMID0gYHJldHVybiBmbG9hdChhID49IGIpO2A7XG5jb25zdCBHUkVBVEVSX0VRVUFMX1BBQ0tFRCA9IGBcbiAgcmV0dXJuIHZlYzQoZ3JlYXRlclRoYW5FcXVhbChhLCBiKSk7XG5gO1xuZXhwb3J0IGNvbnN0IGdyZWF0ZXJFcXVhbCA9IGJpbmFyeUtlcm5lbEZ1bmMoe1xuICAgIG9wU25pcHBldDogR1JFQVRFUl9FUVVBTCxcbiAgICBwYWNrZWRPcFNuaXBwZXQ6IEdSRUFURVJfRVFVQUxfUEFDS0VELFxuICAgIGR0eXBlOiAnYm9vbCcsXG4gICAgY3B1S2VybmVsSW1wbDogZ3JlYXRlckVxdWFsSW1wbENQVVxufSk7XG5leHBvcnQgY29uc3QgZ3JlYXRlckVxdWFsQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEdyZWF0ZXJFcXVhbCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBncmVhdGVyRXF1YWxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1HcmVhdGVyRXF1YWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgSUZGVCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBmZnRJbXBsIH0gZnJvbSAnLi9GRlRfaW1wbCc7XG5leHBvcnQgZnVuY3Rpb24gaWZmdChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBpbnB1dCB9ID0gaW5wdXRzO1xuICAgIHJldHVybiBmZnRJbXBsKGlucHV0LCB0cnVlIC8qIGludmVyc2UgKi8sIGJhY2tlbmQpO1xufVxuZXhwb3J0IGNvbnN0IGlmZnRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogSUZGVCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBpZmZ0XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SUZGVC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBJZGVudGl0eSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHkoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGJhY2tlbmQuaW5jUmVmKHguZGF0YUlkKTtcbiAgICByZXR1cm4geyBkYXRhSWQ6IHguZGF0YUlkLCBzaGFwZTogeC5zaGFwZSwgZHR5cGU6IHguZHR5cGUgfTtcbn1cbmV4cG9ydCBjb25zdCBpZGVudGl0eUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBJZGVudGl0eSxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBpZGVudGl0eVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUlkZW50aXR5LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEltYWcgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgaWRlbnRpdHkgfSBmcm9tICcuL0lkZW50aXR5JztcbmV4cG9ydCBmdW5jdGlvbiBpbWFnKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IGlucHV0IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgaW5wdXREYXRhID0gYmFja2VuZC50ZXhEYXRhLmdldChpbnB1dC5kYXRhSWQpO1xuICAgIHJldHVybiBpZGVudGl0eSh7IGlucHV0czogeyB4OiBpbnB1dERhdGEuY29tcGxleFRlbnNvckluZm9zLmltYWcgfSwgYmFja2VuZCB9KTtcbn1cbmV4cG9ydCBjb25zdCBpbWFnQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEltYWcsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogaW1hZ1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUltYWcuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgSXNGaW5pdGUgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5jb25zdCBJU19GSU5JVEUgPSBgcmV0dXJuIGZsb2F0KCFpc25hbih4KSAmJiAhaXNpbmYoeCkpO2A7XG5leHBvcnQgY29uc3QgaXNGaW5pdGUgPSB1bmFyeUtlcm5lbEZ1bmMoeyBvcFNuaXBwZXQ6IElTX0ZJTklURSwgZHR5cGU6ICdib29sJyB9KTtcbmV4cG9ydCBjb25zdCBpc0Zpbml0ZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBJc0Zpbml0ZSxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBpc0Zpbml0ZSxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Jc0Zpbml0ZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBJc0luZiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmNvbnN0IElTX0lORiA9IGByZXR1cm4gZmxvYXQoaXNpbmYoeCkpO2A7XG5leHBvcnQgY29uc3QgaXNJbmYgPSB1bmFyeUtlcm5lbEZ1bmMoeyBvcFNuaXBwZXQ6IElTX0lORiwgZHR5cGU6ICdib29sJyB9KTtcbmV4cG9ydCBjb25zdCBpc0luZkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBJc0luZixcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBpc0luZixcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Jc0luZi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBJc05hbiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmNvbnN0IElTX05BTiA9IGByZXR1cm4gZmxvYXQoaXNuYW4oeCkpO2A7XG5leHBvcnQgY29uc3QgaXNOYU4gPSB1bmFyeUtlcm5lbEZ1bmMoeyBvcFNuaXBwZXQ6IElTX05BTiwgZHR5cGU6ICdib29sJyB9KTtcbmV4cG9ydCBjb25zdCBpc05hTkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBJc05hbixcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBpc05hTixcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Jc05hTi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBlbnYsIExSTiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBMUk5Qcm9ncmFtIH0gZnJvbSAnLi4vbHJuX2dwdSc7XG5pbXBvcnQgeyBMUk5QYWNrZWRQcm9ncmFtIH0gZnJvbSAnLi4vbHJuX3BhY2tlZF9ncHUnO1xuZXhwb3J0IGNvbnN0IGxybiA9IChhcmdzKSA9PiB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgZGVwdGhSYWRpdXMsIGJpYXMsIGFscGhhLCBiZXRhIH0gPSBhdHRycztcbiAgICBjb25zdCBwcm9ncmFtID0gZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19OT1JNQUxJWkFUSU9OJykgP1xuICAgICAgICBuZXcgTFJOUGFja2VkUHJvZ3JhbSh4LnNoYXBlLCBkZXB0aFJhZGl1cywgYmlhcywgYWxwaGEsIGJldGEpIDpcbiAgICAgICAgbmV3IExSTlByb2dyYW0oeC5zaGFwZSwgZGVwdGhSYWRpdXMsIGJpYXMsIGFscGhhLCBiZXRhKTtcbiAgICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3hdLCB4LmR0eXBlKTtcbn07XG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHZhcmlhYmxlLW5hbWVcbmV4cG9ydCBjb25zdCBMUk5Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTFJOLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGxyblxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxSTi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBMUk5HcmFkIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IExSTkdyYWRQcm9ncmFtIH0gZnJvbSAnLi4vbHJuX2dyYWRfZ3B1JztcbmV4cG9ydCBjb25zdCBscm5HcmFkID0gKGFyZ3MpID0+IHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4LCB5LCBkeSB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgZGVwdGhSYWRpdXMsIGJpYXMsIGFscGhhLCBiZXRhIH0gPSBhdHRycztcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IExSTkdyYWRQcm9ncmFtKHguc2hhcGUsIGRlcHRoUmFkaXVzLCBiaWFzLCBhbHBoYSwgYmV0YSk7XG4gICAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4LCB5LCBkeV0sIHguZHR5cGUpO1xufTtcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogdmFyaWFibGUtbmFtZVxuZXhwb3J0IGNvbnN0IExSTkdyYWRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTFJOR3JhZCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBscm5HcmFkXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TFJOR3JhZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBlbnYsIExlYWt5UmVsdSwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBCaW5hcnlPcFByb2dyYW0gfSBmcm9tICcuLi9iaW5hcnlvcF9ncHUnO1xuaW1wb3J0IHsgQmluYXJ5T3BQYWNrZWRQcm9ncmFtIH0gZnJvbSAnLi4vYmluYXJ5b3BfcGFja2VkX2dwdSc7XG5leHBvcnQgY29uc3QgTEVBS1lSRUxVID0gYHJldHVybiAoYSA8IDAuKSA/IGIgKiBhIDogYTtgO1xuZXhwb3J0IGNvbnN0IExFQUtZUkVMVV9QQUNLRUQgPSBgXG4gIHZlYzQgYUxlc3NUaGFuWmVybyA9IHZlYzQobGVzc1RoYW4oYSwgdmVjNCgwLikpKTtcbiAgcmV0dXJuIChhTGVzc1RoYW5aZXJvICogKGIgKiBhKSkgKyAoKHZlYzQoMS4wKSAtIGFMZXNzVGhhblplcm8pICogYSk7XG5gO1xuZXhwb3J0IGZ1bmN0aW9uIGxlYWt5UmVsdShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYWxwaGEgfSA9IGF0dHJzO1xuICAgIGNvbnN0ICRhbHBoYSA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8oW10sICdmbG9hdDMyJywgdXRpbC5jcmVhdGVTY2FsYXJWYWx1ZShhbHBoYSwgJ2Zsb2F0MzInKSk7XG4gICAgY29uc3QgcHJvZ3JhbSA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfQklOQVJZX09QRVJBVElPTlMnKSA/XG4gICAgICAgIG5ldyBCaW5hcnlPcFBhY2tlZFByb2dyYW0oTEVBS1lSRUxVX1BBQ0tFRCwgeC5zaGFwZSwgJGFscGhhLnNoYXBlKSA6XG4gICAgICAgIG5ldyBCaW5hcnlPcFByb2dyYW0oTEVBS1lSRUxVLCB4LnNoYXBlLCAkYWxwaGEuc2hhcGUpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4LCAkYWxwaGFdLCB4LmR0eXBlKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKCRhbHBoYSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBjb25zdCBsZWFreVJlbHVDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTGVha3lSZWx1LFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGxlYWt5UmVsdVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxlYWt5UmVsdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBMZXNzIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7IGxlc3NJbXBsQ1BVIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5jb25zdCBMRVNTID0gYHJldHVybiBmbG9hdChhIDwgYik7YDtcbmNvbnN0IExFU1NfUEFDS0VEID0gYFxuICByZXR1cm4gdmVjNChsZXNzVGhhbihhLCBiKSk7XG5gO1xuZXhwb3J0IGNvbnN0IGxlc3MgPSBiaW5hcnlLZXJuZWxGdW5jKHtcbiAgICBvcFNuaXBwZXQ6IExFU1MsXG4gICAgcGFja2VkT3BTbmlwcGV0OiBMRVNTX1BBQ0tFRCxcbiAgICBjcHVLZXJuZWxJbXBsOiBsZXNzSW1wbENQVSxcbiAgICBkdHlwZTogJ2Jvb2wnXG59KTtcbmV4cG9ydCBjb25zdCBsZXNzQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IExlc3MsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogbGVzc1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxlc3MuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTGVzc0VxdWFsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7IGxlc3NFcXVhbEltcGxDUFUgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmV4cG9ydCBjb25zdCBMRVNTX0VRVUFMID0gYHJldHVybiBmbG9hdChhIDw9IGIpO2A7XG5leHBvcnQgY29uc3QgTEVTU19FUVVBTF9QQUNLRUQgPSBgXG4gIHJldHVybiB2ZWM0KGxlc3NUaGFuRXF1YWwoYSwgYikpO1xuYDtcbmV4cG9ydCBjb25zdCBsZXNzRXF1YWwgPSBiaW5hcnlLZXJuZWxGdW5jKHtcbiAgICBvcFNuaXBwZXQ6IExFU1NfRVFVQUwsXG4gICAgcGFja2VkT3BTbmlwcGV0OiBMRVNTX0VRVUFMX1BBQ0tFRCxcbiAgICBjcHVLZXJuZWxJbXBsOiBsZXNzRXF1YWxJbXBsQ1BVLFxuICAgIGR0eXBlOiAnYm9vbCdcbn0pO1xuZXhwb3J0IGNvbnN0IGxlc3NFcXVhbENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBMZXNzRXF1YWwsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogbGVzc0VxdWFsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TGVzc0VxdWFsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IExpblNwYWNlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGxpblNwYWNlSW1wbENQVSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuZXhwb3J0IGZ1bmN0aW9uIGxpblNwYWNlKGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgc3RhcnQsIHN0b3AsIG51bSB9ID0gYXR0cnM7XG4gICAgLy8gVE9ETzogVXNlIENQVSBpbXBsZW1lbnRhdGlvbiBkdWUgdG8gdGhlIHByZWNpc2lvbiBwcm9ibGVtIGluIFNhZmFyaS5cbiAgICBjb25zdCBvdXRWYWxzID0gbGluU3BhY2VJbXBsQ1BVKHN0YXJ0LCBzdG9wLCBudW0pO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtvdXRWYWxzLmxlbmd0aF0sICdmbG9hdDMyJywgb3V0VmFscyk7XG59XG5leHBvcnQgY29uc3QgbGluU3BhY2VDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTGluU3BhY2UsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogbGluU3BhY2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1MaW5TcGFjZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBMb2cgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQgeyBsb2dJbXBsQ1BVIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5jb25zdCBMT0cgPSBgaWYgKHggPCAwLjApIHJldHVybiBOQU47XG4gIHJldHVybiBsb2coeCk7YDtcbmNvbnN0IExPR19QQUNLRUQgPSBgXG4gIHZlYzQgcmVzdWx0ID0gbG9nKHgpO1xuICB2ZWM0IGlzTmFOID0gdmVjNChsZXNzVGhhbih4LCB2ZWM0KDAuMCkpKTtcbiAgcmVzdWx0LnIgPSBpc05hTi5yID09IDEuMCA/IE5BTiA6IHJlc3VsdC5yO1xuICByZXN1bHQuZyA9IGlzTmFOLmcgPT0gMS4wID8gTkFOIDogcmVzdWx0Lmc7XG4gIHJlc3VsdC5iID0gaXNOYU4uYiA9PSAxLjAgPyBOQU4gOiByZXN1bHQuYjtcbiAgcmVzdWx0LmEgPSBpc05hTi5hID09IDEuMCA/IE5BTiA6IHJlc3VsdC5hO1xuXG4gIHJldHVybiByZXN1bHQ7XG5gO1xuZXhwb3J0IGNvbnN0IGxvZyA9IHVuYXJ5S2VybmVsRnVuYyh7IG9wU25pcHBldDogTE9HLCBwYWNrZWRPcFNuaXBwZXQ6IExPR19QQUNLRUQsIGNwdUtlcm5lbEltcGw6IGxvZ0ltcGxDUFUgfSk7XG5leHBvcnQgY29uc3QgbG9nQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IExvZyxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBsb2dcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Mb2cuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTG9nMXAgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5jb25zdCBMT0cxUCA9IGByZXR1cm4gbG9nKDEuMCArIHgpO2A7XG5leHBvcnQgY29uc3QgbG9nMXAgPSB1bmFyeUtlcm5lbEZ1bmMoeyBvcFNuaXBwZXQ6IExPRzFQIH0pO1xuZXhwb3J0IGNvbnN0IGxvZzFwQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IExvZzFwLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGxvZzFwLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxvZzFwLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IExvZ2ljYWxBbmQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYmluYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuY29uc3QgTE9HSUNBTF9BTkQgPSBgcmV0dXJuIGZsb2F0KGEgPj0gMS4wICYmIGIgPj0gMS4wKTtgO1xuY29uc3QgTE9HSUNBTF9BTkRfUEFDS0VEID0gYFxuICByZXR1cm4gdmVjNChcbiAgICB2ZWM0KGdyZWF0ZXJUaGFuRXF1YWwoYSwgdmVjNCgxLjApKSkgKlxuICAgIHZlYzQoZ3JlYXRlclRoYW5FcXVhbChiLCB2ZWM0KDEuMCkpKSk7XG5gO1xuZXhwb3J0IGNvbnN0IGxvZ2ljYWxBbmQgPSBiaW5hcnlLZXJuZWxGdW5jKHtcbiAgICBvcFNuaXBwZXQ6IExPR0lDQUxfQU5ELFxuICAgIHBhY2tlZE9wU25pcHBldDogTE9HSUNBTF9BTkRfUEFDS0VELFxuICAgIGR0eXBlOiAnYm9vbCdcbn0pO1xuZXhwb3J0IGNvbnN0IGxvZ2ljYWxBbmRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTG9naWNhbEFuZCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBsb2dpY2FsQW5kXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TG9naWNhbEFuZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBMb2dpY2FsTm90IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuY29uc3QgTE9HSUNBTF9OT1QgPSBgcmV0dXJuIGZsb2F0KCEoeCA+PSAxLjApKTtgO1xuZXhwb3J0IGNvbnN0IGxvZ2ljYWxOb3QgPSB1bmFyeUtlcm5lbEZ1bmMoeyBvcFNuaXBwZXQ6IExPR0lDQUxfTk9UIH0pO1xuZXhwb3J0IGNvbnN0IGxvZ2ljYWxOb3RDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTG9naWNhbE5vdCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBsb2dpY2FsTm90LFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxvZ2ljYWxOb3QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTG9naWNhbE9yIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmNvbnN0IExPR0lDQUxfT1IgPSBgcmV0dXJuIGZsb2F0KGEgPj0gMS4wIHx8IGIgPj0gMS4wKTtgO1xuY29uc3QgTE9HSUNBTF9PUl9QQUNLRUQgPSBgXG4gIHJldHVybiBtaW4oXG4gICAgdmVjNChncmVhdGVyVGhhbkVxdWFsKGEsIHZlYzQoMS4wKSkpICtcbiAgICB2ZWM0KGdyZWF0ZXJUaGFuRXF1YWwoYiwgdmVjNCgxLjApKSksXG4gICAgdmVjNCgxLjApKTtcbmA7XG5leHBvcnQgY29uc3QgbG9naWNhbE9yID0gYmluYXJ5S2VybmVsRnVuYyh7IG9wU25pcHBldDogTE9HSUNBTF9PUiwgcGFja2VkT3BTbmlwcGV0OiBMT0dJQ0FMX09SX1BBQ0tFRCwgZHR5cGU6ICdib29sJyB9KTtcbmV4cG9ydCBjb25zdCBsb2dpY2FsT3JDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTG9naWNhbE9yLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IGxvZ2ljYWxPclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxvZ2ljYWxPci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBNYXggfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IG1heEltcGxDUFUgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmltcG9ydCB7IG1heEltcGwgfSBmcm9tICcuL01heF9pbXBsJztcbmltcG9ydCB7IHRyYW5zcG9zZUltcGwsIHRyYW5zcG9zZUltcGxDUFUgfSBmcm9tICcuL1RyYW5zcG9zZV9pbXBsJztcbmV4cG9ydCBmdW5jdGlvbiBtYXgoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHJlZHVjdGlvbkluZGljZXMsIGtlZXBEaW1zIH0gPSBhdHRycztcbiAgICBjb25zdCB4UmFuayA9IHguc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IG9yaWdBeGVzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShyZWR1Y3Rpb25JbmRpY2VzLCB4LnNoYXBlKTtcbiAgICBsZXQgYXhlcyA9IG9yaWdBeGVzO1xuICAgIGNvbnN0IHBlcm11dGVkQXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oYXhlcywgeFJhbmspO1xuICAgIGNvbnN0IG1heElucHV0SXNUcmFuc3Bvc2VkID0gcGVybXV0ZWRBeGVzICE9IG51bGw7XG4gICAgY29uc3Qgc2hvdWxkRXhlY3V0ZU9uQ1BVID0gYmFja2VuZC5zaG91bGRFeGVjdXRlT25DUFUoW3hdKTtcbiAgICBsZXQgbWF4SW5wdXQgPSB4O1xuICAgIGlmIChtYXhJbnB1dElzVHJhbnNwb3NlZCkge1xuICAgICAgICBpZiAoc2hvdWxkRXhlY3V0ZU9uQ1BVKSB7XG4gICAgICAgICAgICBjb25zdCB4VGV4RGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQobWF4SW5wdXQuZGF0YUlkKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IHhUZXhEYXRhLnZhbHVlcztcbiAgICAgICAgICAgIGNvbnN0IG5ld1NoYXBlID0gbmV3IEFycmF5KHhSYW5rKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3U2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBuZXdTaGFwZVtpXSA9IHguc2hhcGVbcGVybXV0ZWRBeGVzW2ldXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG1heElucHV0VmFsdWVzID0gdHJhbnNwb3NlSW1wbENQVSh2YWx1ZXMsIHguc2hhcGUsIHguZHR5cGUsIHBlcm11dGVkQXhlcywgbmV3U2hhcGUpO1xuICAgICAgICAgICAgbWF4SW5wdXQgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG5ld1NoYXBlLCB4LmR0eXBlKTtcbiAgICAgICAgICAgIGNvbnN0IG1heElucHV0RGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQobWF4SW5wdXQuZGF0YUlkKTtcbiAgICAgICAgICAgIG1heElucHV0RGF0YS52YWx1ZXMgPSBtYXhJbnB1dFZhbHVlcztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG1heElucHV0ID0gdHJhbnNwb3NlSW1wbCh4LCBwZXJtdXRlZEF4ZXMsIGJhY2tlbmQpO1xuICAgICAgICB9XG4gICAgICAgIGF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0SW5uZXJNb3N0QXhlcyhheGVzLmxlbmd0aCwgeFJhbmspO1xuICAgIH1cbiAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoJ21heCcsIGF4ZXMsIHhSYW5rKTtcbiAgICBjb25zdCBbbWF4T3V0U2hhcGUsIHJlZHVjZVNoYXBlXSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKG1heElucHV0LnNoYXBlLCBheGVzKTtcbiAgICBsZXQgb3V0U2hhcGUgPSBtYXhPdXRTaGFwZTtcbiAgICBpZiAoa2VlcERpbXMpIHtcbiAgICAgICAgLy8gcmF0aGVyIHRoYW4gcmVzaGFwZSBhdCB0aGUgZW5kLCBzZXQgdGhlIHRhcmdldCBzaGFwZSBoZXJlLlxuICAgICAgICBvdXRTaGFwZSA9IGJhY2tlbmRfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbShtYXhPdXRTaGFwZSwgb3JpZ0F4ZXMpO1xuICAgIH1cbiAgICBsZXQgb3V0O1xuICAgIGlmIChzaG91bGRFeGVjdXRlT25DUFUpIHtcbiAgICAgICAgY29uc3QgeFRleERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KG1heElucHV0LmRhdGFJZCk7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHhUZXhEYXRhLnZhbHVlcztcbiAgICAgICAgY29uc3Qgb3V0VmFsdWVzID0gbWF4SW1wbENQVSh2YWx1ZXMsIHV0aWwuc2l6ZUZyb21TaGFwZShyZWR1Y2VTaGFwZSksIG91dFNoYXBlLCB4LmR0eXBlKTtcbiAgICAgICAgb3V0ID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRTaGFwZSwgeC5kdHlwZSk7XG4gICAgICAgIGNvbnN0IG91dERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KG91dC5kYXRhSWQpO1xuICAgICAgICBvdXREYXRhLnZhbHVlcyA9IG91dFZhbHVlcztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIG91dCA9IG1heEltcGwobWF4SW5wdXQsIHJlZHVjZVNoYXBlLCBvdXRTaGFwZSwgYmFja2VuZCk7XG4gICAgfVxuICAgIGlmIChtYXhJbnB1dElzVHJhbnNwb3NlZCkge1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG1heElucHV0KTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBtYXhDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTWF4LFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IG1heFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1heC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIE1heFBvb2wsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgUG9vbDJEUHJvZ3JhbSB9IGZyb20gJy4uL3Bvb2xfZ3B1JztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi93ZWJnbF91dGlsJztcbmltcG9ydCB7IGlkZW50aXR5IH0gZnJvbSAnLi9JZGVudGl0eSc7XG5leHBvcnQgZnVuY3Rpb24gbWF4UG9vbChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ21heFBvb2wnKTtcbiAgICBjb25zdCB7IGZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlIH0gPSBhdHRycztcbiAgICBjb25zdCBkaWxhdGlvbnMgPSAxO1xuICAgIHV0aWwuYXNzZXJ0KGJhY2tlbmRfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgZGlsYXRpb25zKSwgKCkgPT4gJ0Vycm9yIGluIG1heFBvb2w6IEVpdGhlciBzdHJpZGVzIG9yIGRpbGF0aW9ucyBtdXN0IGJlIDEuICcgK1xuICAgICAgICBgR290IHN0cmlkZXMgJHtzdHJpZGVzfSBhbmQgZGlsYXRpb25zICcke2RpbGF0aW9uc30nYCk7XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wyREluZm8oeC5zaGFwZSwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSk7XG4gICAgaWYgKGNvbnZJbmZvLmZpbHRlcldpZHRoID09PSAxICYmIGNvbnZJbmZvLmZpbHRlckhlaWdodCA9PT0gMSAmJlxuICAgICAgICB1dGlsLmFycmF5c0VxdWFsKGNvbnZJbmZvLmluU2hhcGUsIGNvbnZJbmZvLm91dFNoYXBlKSkge1xuICAgICAgICByZXR1cm4gaWRlbnRpdHkoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kIH0pO1xuICAgIH1cbiAgICBjb25zdCBtYXhQb29sUHJvZ3JhbSA9IG5ldyBQb29sMkRQcm9ncmFtKGNvbnZJbmZvLCAnbWF4JywgZmFsc2UpO1xuICAgIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShtYXhQb29sUHJvZ3JhbSwgW3hdLCB4LmR0eXBlKTtcbn1cbmV4cG9ydCBjb25zdCBtYXhQb29sQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE1heFBvb2wsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogbWF4UG9vbFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1heFBvb2wuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBNYXhQb29sM0QgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgUG9vbDNEUHJvZ3JhbSB9IGZyb20gJy4uL3Bvb2xfZ3B1JztcbmV4cG9ydCBmdW5jdGlvbiBtYXhQb29sM2QoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGltUm91bmRpbmdNb2RlIH0gPSBhdHRycztcbiAgICBjb25zdCBkaWxhdGlvbnMgPSBbMSwgMSwgMV07XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wzREluZm8oeC5zaGFwZSwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgZGF0YUZvcm1hdCk7XG4gICAgY29uc3QgbWF4UG9vbFByb2dyYW0gPSBuZXcgUG9vbDNEUHJvZ3JhbShjb252SW5mbywgJ21heCcsIGZhbHNlKTtcbiAgICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0obWF4UG9vbFByb2dyYW0sIFt4XSwgeC5kdHlwZSk7XG59XG5leHBvcnQgY29uc3QgbWF4UG9vbDNEQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE1heFBvb2wzRCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBtYXhQb29sM2Rcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NYXhQb29sM0QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBNYXhQb29sM0RHcmFkIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IE1heFBvb2wzREJhY2twcm9wUHJvZ3JhbSB9IGZyb20gJy4uL21heF9wb29sX2JhY2twcm9wX2dwdSc7XG5pbXBvcnQgeyBQb29sM0RQcm9ncmFtIH0gZnJvbSAnLi4vcG9vbF9ncHUnO1xuZXhwb3J0IGZ1bmN0aW9uIG1heFBvb2wzREdyYWQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGR5LCBpbnB1dCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHggPSBpbnB1dDtcbiAgICBjb25zdCB7IGZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlIH0gPSBhdHRycztcbiAgICBjb25zdCBkaWxhdGlvbnMgPSBbMSwgMSwgMV07XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wzREluZm8oeC5zaGFwZSwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSk7XG4gICAgY29uc3QgbWF4UG9vbDNkUG9zaXRpb25zUHJvZ3JhbSA9IG5ldyBQb29sM0RQcm9ncmFtKGNvbnZJbmZvLCAnbWF4JywgdHJ1ZSAvKiBnZXQgcG9zaXRpb25zICovKTtcbiAgICBjb25zdCBtYXhQb29sM2RQb3NpdGlvbnMgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShtYXhQb29sM2RQb3NpdGlvbnNQcm9ncmFtLCBbeF0sIHguZHR5cGUpO1xuICAgIGNvbnN0IG1heFBvb2xCYWNrcHJvcFByb2dyYW0gPSBuZXcgTWF4UG9vbDNEQmFja3Byb3BQcm9ncmFtKGNvbnZJbmZvKTtcbiAgICBjb25zdCByZXN1bHQgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShtYXhQb29sQmFja3Byb3BQcm9ncmFtLCBbZHksIG1heFBvb2wzZFBvc2l0aW9uc10sIHguZHR5cGUpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8obWF4UG9vbDNkUG9zaXRpb25zKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGNvbnN0IG1heFBvb2xHcmFkM0RDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTWF4UG9vbDNER3JhZCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBtYXhQb29sM0RHcmFkXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWF4UG9vbDNER3JhZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIE1heFBvb2xHcmFkIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IE1heFBvb2wyREJhY2twcm9wUHJvZ3JhbSB9IGZyb20gJy4uL21heF9wb29sX2JhY2twcm9wX2dwdSc7XG5pbXBvcnQgeyBQb29sMkRQcm9ncmFtIH0gZnJvbSAnLi4vcG9vbF9ncHUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL3dlYmdsX3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIG1heFBvb2xHcmFkKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBkeSwgaW5wdXQsIG91dHB1dCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHggPSBpbnB1dDtcbiAgICBhc3NlcnROb3RDb21wbGV4KFtpbnB1dCwgb3V0cHV0XSwgJ21heFBvb2xHcmFkJyk7XG4gICAgY29uc3QgeyBmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSB9ID0gYXR0cnM7XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wyREluZm8oeC5zaGFwZSwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgMSAvKiBkaWxhdGlvbnMgKi8sIHBhZCwgZGltUm91bmRpbmdNb2RlKTtcbiAgICBjb25zdCBnZXRQb3NpdGlvbnMgPSB0cnVlO1xuICAgIGNvbnN0IG1heFBvb2xQb3NpdGlvbnNQcm9ncmFtID0gbmV3IFBvb2wyRFByb2dyYW0oY29udkluZm8sICdtYXgnLCBnZXRQb3NpdGlvbnMpO1xuICAgIGNvbnN0IG1heFBvb2xQb3NpdGlvbnMgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShtYXhQb29sUG9zaXRpb25zUHJvZ3JhbSwgW3hdLCB4LmR0eXBlKTtcbiAgICBjb25zdCBtYXhQb29sQmFja1Byb3BQcm9ncmFtID0gbmV3IE1heFBvb2wyREJhY2twcm9wUHJvZ3JhbShjb252SW5mbyk7XG4gICAgY29uc3QgcmVzdWx0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0obWF4UG9vbEJhY2tQcm9wUHJvZ3JhbSwgW2R5LCBtYXhQb29sUG9zaXRpb25zXSwgeC5kdHlwZSk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhtYXhQb29sUG9zaXRpb25zKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGNvbnN0IG1heFBvb2xHcmFkQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE1heFBvb2xHcmFkLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IG1heFBvb2xHcmFkXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWF4UG9vbEdyYWQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTWF4UG9vbFdpdGhBcmdtYXggfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IG1heFBvb2xXaXRoQXJnbWF4SW1wbCB9IGZyb20gJy4vTWF4UG9vbFdpdGhBcmdtYXhfaW1wbCc7XG5leHBvcnQgY29uc3QgbWF4UG9vbFdpdGhBcmdtYXhDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTWF4UG9vbFdpdGhBcmdtYXgsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogKHsgaW5wdXRzLCBhdHRycywgYmFja2VuZCB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgICAgICBjb25zdCB7IGZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgaW5jbHVkZUJhdGNoSW5JbmRleCB9ID0gYXR0cnM7XG4gICAgICAgIGNvbnN0IHdlYmdsQmFja2VuZCA9IGJhY2tlbmQ7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHguc2hhcGUubGVuZ3RoID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gbWF4UG9vbDogaW5wdXQgbXVzdCBiZSByYW5rIDQgYnV0IGdvdCByYW5rICR7eC5zaGFwZS5sZW5ndGh9LmApO1xuICAgICAgICBjb25zdCBkaWxhdGlvbnMgPSBbMSwgMV07XG4gICAgICAgIHV0aWwuYXNzZXJ0KGJhY2tlbmRfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgZGlsYXRpb25zKSwgKCkgPT4gJ0Vycm9yIGluIG1heFBvb2w6IEVpdGhlciBzdHJpZGVzIG9yIGRpbGF0aW9ucyBtdXN0IGJlIDEuICcgK1xuICAgICAgICAgICAgYEdvdCBzdHJpZGVzICR7c3RyaWRlc30gYW5kIGRpbGF0aW9ucyAnJHtkaWxhdGlvbnN9J2ApO1xuICAgICAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlUG9vbDJESW5mbyh4LnNoYXBlLCBmaWx0ZXJTaXplLCBzdHJpZGVzLCBkaWxhdGlvbnMsIHBhZCk7XG4gICAgICAgIGNvbnN0IFtyZXN1bHQsIGluZGV4ZXNdID0gbWF4UG9vbFdpdGhBcmdtYXhJbXBsKHgsIGluY2x1ZGVCYXRjaEluSW5kZXgsIGNvbnZJbmZvLCB3ZWJnbEJhY2tlbmQpO1xuICAgICAgICByZXR1cm4gW3Jlc3VsdCwgaW5kZXhlc107XG4gICAgfVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1heFBvb2xXaXRoQXJnbWF4LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFBvb2wyRFByb2dyYW0gfSBmcm9tICcuLi9wb29sX2dwdSc7XG5leHBvcnQgZnVuY3Rpb24gbWF4UG9vbFdpdGhBcmdtYXhJbXBsKHgsIGluY2x1ZGVCYXRjaEluSW5kZXgsIGNvbnZJbmZvLCBiYWNrZW5kKSB7XG4gICAgbGV0IHByb2dyYW0gPSBuZXcgUG9vbDJEUHJvZ3JhbShjb252SW5mbywgJ21heCcsIGZhbHNlKTtcbiAgICBjb25zdCBwb29sT3V0cHV0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3hdLCAnZmxvYXQzMicpO1xuICAgIHByb2dyYW0gPSBuZXcgUG9vbDJEUHJvZ3JhbShjb252SW5mbywgJ21heCcsIHRydWUsIHRydWUsIGluY2x1ZGVCYXRjaEluSW5kZXgpO1xuICAgIGNvbnN0IGluZGV4T3V0cHV0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3hdLCAnZmxvYXQzMicpO1xuICAgIHJldHVybiBbcG9vbE91dHB1dCwgaW5kZXhPdXRwdXRdO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWF4UG9vbFdpdGhBcmdtYXhfaW1wbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHJlZHVjZSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9yZWR1Y2UnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4uL2tlcm5lbHMvUmVzaGFwZSc7XG5leHBvcnQgZnVuY3Rpb24gbWF4SW1wbCh4LCByZWR1Y2VTaGFwZSwgb3V0U2hhcGUsIGJhY2tlbmQpIHtcbiAgICBjb25zdCBpblNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuICAgIGNvbnN0IHhTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHguc2hhcGUpO1xuICAgIGNvbnN0IGJhdGNoU2l6ZSA9IHhTaXplIC8gaW5TaXplO1xuICAgIGNvbnN0IHJlc2hhcGVkSW5wdXQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHggfSwgYXR0cnM6IHsgc2hhcGU6IFtiYXRjaFNpemUsIGluU2l6ZV0gfSwgYmFja2VuZCB9KTtcbiAgICBjb25zdCByZWR1Y2VkID0gcmVkdWNlKHJlc2hhcGVkSW5wdXQsIHguZHR5cGUsICdtYXgnLCBiYWNrZW5kKTtcbiAgICBjb25zdCByZXNoYXBlZE91dHB1dCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogcmVkdWNlZCB9LCBhdHRyczogeyBzaGFwZTogb3V0U2hhcGUgfSwgYmFja2VuZCB9KTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc2hhcGVkSW5wdXQpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVkdWNlZCk7XG4gICAgcmV0dXJuIHJlc2hhcGVkT3V0cHV0O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWF4X2ltcGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTWF4aW11bSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBDSEVDS19OQU5fU05JUFBFVCB9IGZyb20gJy4uL2JpbmFyeW9wX2dwdSc7XG5pbXBvcnQgeyBDSEVDS19OQU5fU05JUFBFVCBhcyBDSEVDS19OQU5fU05JUFBFVF9QQUNLRUQgfSBmcm9tICcuLi9iaW5hcnlvcF9wYWNrZWRfZ3B1JztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7IG1heGltdW1JbXBsQ1BVIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5jb25zdCBNQVhJTVVNID0gQ0hFQ0tfTkFOX1NOSVBQRVQgKyBgXG4gIHJldHVybiBtYXgoYSwgYik7XG5gO1xuY29uc3QgTUFYSU1VTV9QQUNLRUQgPSBgXG4gIHZlYzQgcmVzdWx0ID0gdmVjNChtYXgoYSwgYikpO1xuICB2ZWM0IGlzTmFOID0gbWluKHZlYzQoaXNuYW4oYSkpICsgdmVjNChpc25hbihiKSksIHZlYzQoMS4wKSk7XG4gIGAgK1xuICAgIENIRUNLX05BTl9TTklQUEVUX1BBQ0tFRCArIGBcbiAgcmV0dXJuIHJlc3VsdDtcbmA7XG5leHBvcnQgY29uc3QgbWF4aW11bSA9IGJpbmFyeUtlcm5lbEZ1bmMoe1xuICAgIG9wU25pcHBldDogTUFYSU1VTSxcbiAgICBwYWNrZWRPcFNuaXBwZXQ6IE1BWElNVU1fUEFDS0VELFxuICAgIGNwdUtlcm5lbEltcGw6IG1heGltdW1JbXBsQ1BVXG59KTtcbmV4cG9ydCBjb25zdCBtYXhpbXVtQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE1heGltdW0sXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogbWF4aW11bVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1heGltdW0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBNZWFuLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IG1lYW5JbXBsIH0gZnJvbSAnLi9NZWFuX2ltcGwnO1xuaW1wb3J0IHsgdHJhbnNwb3NlSW1wbCwgdHJhbnNwb3NlSW1wbENQVSB9IGZyb20gJy4vVHJhbnNwb3NlX2ltcGwnO1xuZXhwb3J0IGNvbnN0IG1lYW5Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTWVhbixcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiAoeyBpbnB1dHMsIGF0dHJzLCBiYWNrZW5kIH0pID0+IHtcbiAgICAgICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgICAgIGNvbnN0IHsga2VlcERpbXMsIGF4aXMgfSA9IGF0dHJzO1xuICAgICAgICBjb25zdCB3ZWJnbEJhY2tlbmQgPSBiYWNrZW5kO1xuICAgICAgICBjb25zdCB4UmFuayA9IHguc2hhcGUubGVuZ3RoO1xuICAgICAgICBjb25zdCBvcmlnQXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG4gICAgICAgIGxldCBheGVzID0gb3JpZ0F4ZXM7XG4gICAgICAgIGNvbnN0IHBlcm11dGVkQXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oYXhlcywgeFJhbmspO1xuICAgICAgICBjb25zdCBtZWFuSW5wdXRJc1RyYW5zcG9zZWQgPSBwZXJtdXRlZEF4ZXMgIT0gbnVsbDtcbiAgICAgICAgY29uc3Qgc2hvdWxkRXhlY3V0ZU9uQ1BVID0gd2ViZ2xCYWNrZW5kLnNob3VsZEV4ZWN1dGVPbkNQVShbeF0pO1xuICAgICAgICBjb25zdCBpbnRlcm1lZGlhdGVzID0gW107XG4gICAgICAgIGxldCBtZWFuSW5wdXQgPSB4O1xuICAgICAgICBpZiAobWVhbklucHV0SXNUcmFuc3Bvc2VkKSB7XG4gICAgICAgICAgICBpZiAoc2hvdWxkRXhlY3V0ZU9uQ1BVKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeFRleERhdGEgPSB3ZWJnbEJhY2tlbmQudGV4RGF0YS5nZXQobWVhbklucHV0LmRhdGFJZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVzID0geFRleERhdGEudmFsdWVzO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1NoYXBlID0gbmV3IEFycmF5KHhSYW5rKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld1NoYXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld1NoYXBlW2ldID0geC5zaGFwZVtwZXJtdXRlZEF4ZXNbaV1dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBtZWFuSW5wdXRWYWx1ZXMgPSB0cmFuc3Bvc2VJbXBsQ1BVKHZhbHVlcywgeC5zaGFwZSwgeC5kdHlwZSwgcGVybXV0ZWRBeGVzLCBuZXdTaGFwZSk7XG4gICAgICAgICAgICAgICAgbWVhbklucHV0ID0gd2ViZ2xCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG5ld1NoYXBlLCB4LmR0eXBlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtZWFuSW5wdXREYXRhID0gd2ViZ2xCYWNrZW5kLnRleERhdGEuZ2V0KG1lYW5JbnB1dC5kYXRhSWQpO1xuICAgICAgICAgICAgICAgIG1lYW5JbnB1dERhdGEudmFsdWVzID0gbWVhbklucHV0VmFsdWVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbWVhbklucHV0ID0gdHJhbnNwb3NlSW1wbCh4LCBwZXJtdXRlZEF4ZXMsIHdlYmdsQmFja2VuZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbnRlcm1lZGlhdGVzLnB1c2gobWVhbklucHV0KTtcbiAgICAgICAgICAgIGF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0SW5uZXJNb3N0QXhlcyhheGVzLmxlbmd0aCwgeFJhbmspO1xuICAgICAgICB9XG4gICAgICAgIGJhY2tlbmRfdXRpbC5hc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcygnc3VtJywgYXhlcywgeFJhbmspO1xuICAgICAgICBjb25zdCBbbWVhbk91dFNoYXBlLCByZWR1Y2VTaGFwZV0gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcyhtZWFuSW5wdXQuc2hhcGUsIGF4ZXMpO1xuICAgICAgICBsZXQgb3V0U2hhcGUgPSBtZWFuT3V0U2hhcGU7XG4gICAgICAgIGlmIChrZWVwRGltcykge1xuICAgICAgICAgICAgLy8gcmF0aGVyIHRoYW4gcmVzaGFwZSBhdCB0aGUgZW5kLCBzZXQgdGhlIHRhcmdldCBzaGFwZSBoZXJlLlxuICAgICAgICAgICAgb3V0U2hhcGUgPSBiYWNrZW5kX3V0aWwuZXhwYW5kU2hhcGVUb0tlZXBEaW0obWVhbk91dFNoYXBlLCBvcmlnQXhlcyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3V0ID0gbWVhbkltcGwobWVhbklucHV0LCByZWR1Y2VTaGFwZSwgb3V0U2hhcGUsIHdlYmdsQmFja2VuZCk7XG4gICAgICAgIGZvciAoY29uc3QgaSBvZiBpbnRlcm1lZGlhdGVzKSB7XG4gICAgICAgICAgICB3ZWJnbEJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWVhbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHJlZHVjZSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9yZWR1Y2UnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4uL2tlcm5lbHMvUmVzaGFwZSc7XG5leHBvcnQgZnVuY3Rpb24gbWVhbkltcGwoeCwgcmVkdWNlU2hhcGUsIG91dFNoYXBlLCBiYWNrZW5kKSB7XG4gICAgY29uc3QgaW5TaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcbiAgICBjb25zdCB4U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSh4LnNoYXBlKTtcbiAgICBjb25zdCBiYXRjaFNpemUgPSB4U2l6ZSAvIGluU2l6ZTtcbiAgICBjb25zdCByZXNoYXBlZElucHV0ID0gcmVzaGFwZSh7IGlucHV0czogeyB4IH0sIGF0dHJzOiB7IHNoYXBlOiBbYmF0Y2hTaXplLCBpblNpemVdIH0sIGJhY2tlbmQgfSk7XG4gICAgY29uc3QgcmVkdWNlZCA9IHJlZHVjZShyZXNoYXBlZElucHV0LCAnZmxvYXQzMicsICdtZWFuJywgYmFja2VuZCk7XG4gICAgY29uc3QgcmVzaGFwZWRPdXRwdXQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHJlZHVjZWQgfSwgYXR0cnM6IHsgc2hhcGU6IG91dFNoYXBlIH0sIGJhY2tlbmQgfSk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXNoYXBlZElucHV0KTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlZHVjZWQpO1xuICAgIHJldHVybiByZXNoYXBlZE91dHB1dDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1lYW5faW1wbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIE1pbiwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyByZWR1Y2UgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvcmVkdWNlJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHsgdHJhbnNwb3NlIH0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuZXhwb3J0IGZ1bmN0aW9uIG1pbihhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYXhpcywga2VlcERpbXMgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3Qgb3JpZ0F4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpO1xuICAgIGxldCBheGVzID0gb3JpZ0F4ZXM7XG4gICAgY29uc3QgcGVybXV0ZWRBeGVzID0gYmFja2VuZF91dGlsLmdldEF4ZXNQZXJtdXRhdGlvbihheGVzLCB4UmFuayk7XG4gICAgbGV0IHBlcm11dGVkWCA9IHg7XG4gICAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgICAgIHBlcm11dGVkWCA9IHRyYW5zcG9zZSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHBlcm06IHBlcm11dGVkQXhlcyB9IH0pO1xuICAgICAgICBheGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoYXhlcy5sZW5ndGgsIHguc2hhcGUubGVuZ3RoKTtcbiAgICB9XG4gICAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdtaW4nLCBheGVzLCB4UmFuayk7XG4gICAgY29uc3QgW291dFNoYXBlLCByZWR1Y2VTaGFwZV0gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcyhwZXJtdXRlZFguc2hhcGUsIGF4ZXMpO1xuICAgIGNvbnN0IGluU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShyZWR1Y2VTaGFwZSk7XG4gICAgY29uc3QgYTJEID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiBwZXJtdXRlZFggfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IFstMSwgaW5TaXplXSB9IH0pO1xuICAgIGNvbnN0IHJlZHVjZWQgPSByZWR1Y2UoYTJELCBhMkQuZHR5cGUsICdtaW4nLCBiYWNrZW5kKTtcbiAgICBsZXQgcmVzO1xuICAgIGlmIChrZWVwRGltcykge1xuICAgICAgICBjb25zdCBuZXdTaGFwZSA9IGJhY2tlbmRfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbShvdXRTaGFwZSwgb3JpZ0F4ZXMpO1xuICAgICAgICByZXMgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHJlZHVjZWQgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IG5ld1NoYXBlIH0gfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXMgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHJlZHVjZWQgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IG91dFNoYXBlIH0gfSk7XG4gICAgfVxuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oYTJEKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlZHVjZWQpO1xuICAgIGlmIChwZXJtdXRlZEF4ZXMgIT0gbnVsbCkge1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHBlcm11dGVkWCk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5leHBvcnQgY29uc3QgbWluQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE1pbixcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBtaW5cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NaW4uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTWluaW11bSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBDSEVDS19OQU5fU05JUFBFVCB9IGZyb20gJy4uL2JpbmFyeW9wX2dwdSc7XG5pbXBvcnQgeyBDSEVDS19OQU5fU05JUFBFVCBhcyBDSEVDS19OQU5fU05JUFBFVF9QQUNLRUQgfSBmcm9tICcuLi9iaW5hcnlvcF9wYWNrZWRfZ3B1JztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7IG1pbmltdW1JbXBsQ1BVIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5jb25zdCBNSU5JTVVNID0gQ0hFQ0tfTkFOX1NOSVBQRVQgKyBgXG4gIHJldHVybiBtaW4oYSwgYik7XG5gO1xuY29uc3QgTUlOSU1VTV9QQUNLRUQgPSBgXG4gIHZlYzQgcmVzdWx0ID0gdmVjNChtaW4oYSwgYikpO1xuICB2ZWM0IGlzTmFOID0gbWluKHZlYzQoaXNuYW4oYSkpICsgdmVjNChpc25hbihiKSksIHZlYzQoMS4wKSk7XG4gIGAgK1xuICAgIENIRUNLX05BTl9TTklQUEVUX1BBQ0tFRCArIGBcbiAgcmV0dXJuIHJlc3VsdDtcbmA7XG5leHBvcnQgY29uc3QgbWluaW11bSA9IGJpbmFyeUtlcm5lbEZ1bmMoe1xuICAgIG9wU25pcHBldDogTUlOSU1VTSxcbiAgICBwYWNrZWRPcFNuaXBwZXQ6IE1JTklNVU1fUEFDS0VELFxuICAgIGNwdUtlcm5lbEltcGw6IG1pbmltdW1JbXBsQ1BVXG59KTtcbmV4cG9ydCBjb25zdCBtaW5pbXVtQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE1pbmltdW0sXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogbWluaW11bVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1pbmltdW0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZW52LCBNaXJyb3JQYWQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgTWlycm9yUGFkUHJvZ3JhbSB9IGZyb20gJy4uL21pcnJvcl9wYWRfZ3B1JztcbmltcG9ydCB7IE1pcnJvclBhZFBhY2tlZFByb2dyYW0gfSBmcm9tICcuLi9taXJyb3JfcGFkX3BhY2tlZF9ncHUnO1xuZXhwb3J0IGNvbnN0IG1pcnJvclBhZEtlcm5lbEZ1bmMgPSAoeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0pID0+IHtcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHBhZGRpbmdzLCBtb2RlIH0gPSBhdHRycztcbiAgICBjb25zdCBwcm9ncmFtID0gZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19BUlJBWV9PUEVSQVRJT05TJykgP1xuICAgICAgICBuZXcgTWlycm9yUGFkUGFja2VkUHJvZ3JhbSh4LnNoYXBlLCBwYWRkaW5ncywgbW9kZSkgOlxuICAgICAgICBuZXcgTWlycm9yUGFkUHJvZ3JhbSh4LnNoYXBlLCBwYWRkaW5ncywgbW9kZSk7XG4gICAgY29uc3Qgb3V0cHV0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3hdLCB4LmR0eXBlKTtcbiAgICByZXR1cm4gb3V0cHV0O1xufTtcbmV4cG9ydCBjb25zdCBtaXJyb3JQYWRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTWlycm9yUGFkLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IG1pcnJvclBhZEtlcm5lbEZ1bmMsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWlycm9yUGFkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IE1vZCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBDSEVDS19OQU5fU05JUFBFVCB9IGZyb20gJy4uL2JpbmFyeW9wX3BhY2tlZF9ncHUnO1xuaW1wb3J0IHsgYmluYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuY29uc3QgTU9EID0gYGlmIChiID09IDAuMCkgcmV0dXJuIE5BTjtcbiAgcmV0dXJuIG1vZChhLCBiKTtgO1xuY29uc3QgTU9EX1BBQ0tFRCA9IGBcbiAgdmVjNCByZXN1bHQgPSBtb2QoYSwgYik7XG4gIHZlYzQgaXNOYU4gPSB2ZWM0KGVxdWFsKGIsIHZlYzQoMC4wKSkpO1xuICBgICtcbiAgICBDSEVDS19OQU5fU05JUFBFVCArIGBcbiAgcmV0dXJuIHJlc3VsdDtcbmA7XG5leHBvcnQgY29uc3QgbW9kID0gYmluYXJ5S2VybmVsRnVuYyh7XG4gICAgb3BTbmlwcGV0OiBNT0QsXG4gICAgcGFja2VkT3BTbmlwcGV0OiBNT0RfUEFDS0VELFxufSk7XG5leHBvcnQgY29uc3QgbW9kQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE1vZCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBtb2Rcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Nb2QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTXVsdGlub21pYWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgTXVsdGlub21pYWxQcm9ncmFtIH0gZnJvbSAnLi4vbXVsdGlub21pYWxfZ3B1JztcbmltcG9ydCB7IHNvZnRtYXggfSBmcm9tICcuL1NvZnRtYXgnO1xuZXhwb3J0IGZ1bmN0aW9uIG11bHRpbm9taWFsKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBsb2dpdHMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IG51bVNhbXBsZXMsIHNlZWQsIG5vcm1hbGl6ZWQgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHByb2JzID0gbm9ybWFsaXplZCA/XG4gICAgICAgIGxvZ2l0cyA6XG4gICAgICAgIHNvZnRtYXgoeyBpbnB1dHM6IHsgbG9naXRzIH0sIGJhY2tlbmQsIGF0dHJzOiB7IGRpbTogbG9naXRzLnNoYXBlLmxlbmd0aCAtIDEgfSB9KTtcbiAgICBjb25zdCBiYXRjaFNpemUgPSBwcm9icy5zaGFwZVswXTtcbiAgICBjb25zdCBudW1PdXRjb21lcyA9IHByb2JzLnNoYXBlWzFdO1xuICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgTXVsdGlub21pYWxQcm9ncmFtKGJhdGNoU2l6ZSwgbnVtT3V0Y29tZXMsIG51bVNhbXBsZXMpO1xuICAgIGNvbnN0IGN1c3RvbVZhbHVlcyA9IFtbc2VlZF1dO1xuICAgIGNvbnN0IHJlcyA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtwcm9ic10sICdpbnQzMicsIGN1c3RvbVZhbHVlcyk7XG4gICAgaWYgKCFub3JtYWxpemVkKSB7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocHJvYnMpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IG11bHRpbm9taWFsQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE11bHRpbm9taWFsLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IG11bHRpbm9taWFsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TXVsdGlub21pYWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBlbnYsIE11bHRpcGx5IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCAqIGFzIGJpbmFyeW9wX2NvbXBsZXhfZ3B1IGZyb20gJy4uL2JpbmFyeW9wX2NvbXBsZXhfZ3B1JztcbmltcG9ydCB7IEJpbmFyeU9wQ29tcGxleFByb2dyYW0gfSBmcm9tICcuLi9iaW5hcnlvcF9jb21wbGV4X2dwdSc7XG5pbXBvcnQgeyBCaW5hcnlPcFByb2dyYW0gfSBmcm9tICcuLi9iaW5hcnlvcF9ncHUnO1xuaW1wb3J0IHsgQmluYXJ5T3BQYWNrZWRQcm9ncmFtIH0gZnJvbSAnLi4vYmluYXJ5b3BfcGFja2VkX2dwdSc7XG5pbXBvcnQgeyBtdWx0aXBseUltcGxDUFUgYXMgY3B1TXVsdGlwbHkgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmltcG9ydCB7IGNvbXBsZXggfSBmcm9tICcuL0NvbXBsZXgnO1xuY29uc3QgTVVMID0gJ3JldHVybiBhICogYjsnO1xuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IGEsIGIgfSA9IGlucHV0cztcbiAgICBjb25zdCBkdHlwZSA9IGJhY2tlbmRfdXRpbC51cGNhc3RUeXBlKGEuZHR5cGUsIGIuZHR5cGUpO1xuICAgIGlmIChhLmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICBjb25zdCBhRGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQoYS5kYXRhSWQpO1xuICAgICAgICBjb25zdCBiRGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQoYi5kYXRhSWQpO1xuICAgICAgICBjb25zdCByZWFsUHJvZ3JhbSA9IG5ldyBCaW5hcnlPcENvbXBsZXhQcm9ncmFtKGJpbmFyeW9wX2NvbXBsZXhfZ3B1LkNPTVBMRVhfTVVMVElQTFkuUkVBTCwgYS5zaGFwZSwgYi5zaGFwZSk7XG4gICAgICAgIGNvbnN0IGltYWdQcm9ncmFtID0gbmV3IEJpbmFyeU9wQ29tcGxleFByb2dyYW0oYmluYXJ5b3BfY29tcGxleF9ncHUuQ09NUExFWF9NVUxUSVBMWS5JTUFHLCBhLnNoYXBlLCBiLnNoYXBlKTtcbiAgICAgICAgY29uc3QgaW5wdXRzID0gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRhdGFJZDogYURhdGEuY29tcGxleFRlbnNvckluZm9zLnJlYWwuZGF0YUlkLFxuICAgICAgICAgICAgICAgIGR0eXBlOiBhRGF0YS5jb21wbGV4VGVuc29ySW5mb3MucmVhbC5kdHlwZSxcbiAgICAgICAgICAgICAgICBzaGFwZTogYS5zaGFwZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkYXRhSWQ6IGFEYXRhLmNvbXBsZXhUZW5zb3JJbmZvcy5pbWFnLmRhdGFJZCxcbiAgICAgICAgICAgICAgICBkdHlwZTogYURhdGEuY29tcGxleFRlbnNvckluZm9zLmltYWcuZHR5cGUsXG4gICAgICAgICAgICAgICAgc2hhcGU6IGEuc2hhcGVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGF0YUlkOiBiRGF0YS5jb21wbGV4VGVuc29ySW5mb3MucmVhbC5kYXRhSWQsXG4gICAgICAgICAgICAgICAgZHR5cGU6IGJEYXRhLmNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsLmR0eXBlLFxuICAgICAgICAgICAgICAgIHNoYXBlOiBiLnNoYXBlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRhdGFJZDogYkRhdGEuY29tcGxleFRlbnNvckluZm9zLmltYWcuZGF0YUlkLFxuICAgICAgICAgICAgICAgIGR0eXBlOiBiRGF0YS5jb21wbGV4VGVuc29ySW5mb3MuaW1hZy5kdHlwZSxcbiAgICAgICAgICAgICAgICBzaGFwZTogYi5zaGFwZVxuICAgICAgICAgICAgfVxuICAgICAgICBdO1xuICAgICAgICBjb25zdCByZWFsUGFydCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHJlYWxQcm9ncmFtLCBpbnB1dHMsICdmbG9hdDMyJyk7XG4gICAgICAgIGNvbnN0IGltYWdQYXJ0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0oaW1hZ1Byb2dyYW0sIGlucHV0cywgJ2Zsb2F0MzInKTtcbiAgICAgICAgY29uc3QgY29tcGxleE91dHB1dCA9IGNvbXBsZXgoeyBpbnB1dHM6IHsgcmVhbDogcmVhbFBhcnQsIGltYWc6IGltYWdQYXJ0IH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVhbFBhcnQpO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGltYWdQYXJ0KTtcbiAgICAgICAgLy8gVE9ETyhhbm54aW5neXVhbik6IENQVSBmb3J3YXJkaW5nIGZvciBjb21wbGV4IGlucHV0cy5cbiAgICAgICAgcmV0dXJuIGNvbXBsZXhPdXRwdXQ7XG4gICAgfVxuICAgIGlmIChiYWNrZW5kLnNob3VsZEV4ZWN1dGVPbkNQVShbYSwgYl0pKSB7XG4gICAgICAgIGNvbnN0IGFEYXRhID0gYmFja2VuZC50ZXhEYXRhLmdldChhLmRhdGFJZCk7XG4gICAgICAgIGNvbnN0IGJEYXRhID0gYmFja2VuZC50ZXhEYXRhLmdldChiLmRhdGFJZCk7XG4gICAgICAgIGNvbnN0IFtvdXRWYWx1ZXMsIG91dFNoYXBlXSA9IGNwdU11bHRpcGx5KGEuc2hhcGUsIGIuc2hhcGUsIGFEYXRhLnZhbHVlcywgYkRhdGEudmFsdWVzLCBkdHlwZSk7XG4gICAgICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0U2hhcGUsIGR0eXBlKTtcbiAgICAgICAgY29uc3Qgb3V0RGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQob3V0LmRhdGFJZCk7XG4gICAgICAgIG91dERhdGEudmFsdWVzID0gb3V0VmFsdWVzO1xuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cbiAgICBsZXQgcHJvZ3JhbTtcbiAgICBpZiAoZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19CSU5BUllfT1BFUkFUSU9OUycpKSB7XG4gICAgICAgIHByb2dyYW0gPSBuZXcgQmluYXJ5T3BQYWNrZWRQcm9ncmFtKE1VTCwgYS5zaGFwZSwgYi5zaGFwZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBwcm9ncmFtID0gbmV3IEJpbmFyeU9wUHJvZ3JhbShNVUwsIGEuc2hhcGUsIGIuc2hhcGUpO1xuICAgIH1cbiAgICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW2EsIGJdLCBkdHlwZSk7XG59XG5leHBvcnQgY29uc3QgbXVsdGlwbHlDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTXVsdGlwbHksXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogbXVsdGlwbHlcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NdWx0aXBseS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBlbnYsIE5lZyB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBuZWdJbXBsQ1BVIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5pbXBvcnQgeyBVbmFyeU9wUHJvZ3JhbSB9IGZyb20gJy4uL3VuYXJ5b3BfZ3B1JztcbmltcG9ydCB7IFVuYXJ5T3BQYWNrZWRQcm9ncmFtIH0gZnJvbSAnLi4vdW5hcnlvcF9wYWNrZWRfZ3B1JztcbmNvbnN0IE5FRyA9IGByZXR1cm4gLXg7YDtcbi8vIFRoaXMgZG9lc24ndCB1c2UgdW5hcnlLZXJuZWxGdW5jIGJlY2F1c2UgbmVnSW1wbENQVSBpcyBub3Qgb2YgdHlwZVxuLy8gU2ltcGxlVW5hcnlLZXJuZWxJbXBsQ1BVLlxuZXhwb3J0IGZ1bmN0aW9uIG5lZyhhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgaWYgKGJhY2tlbmQuc2hvdWxkRXhlY3V0ZU9uQ1BVKFt4XSkpIHtcbiAgICAgICAgY29uc3QgeERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KHguZGF0YUlkKTtcbiAgICAgICAgY29uc3QgW291dFZhbHVlcywgbmV3U2hhcGVdID0gbmVnSW1wbENQVSh4RGF0YS52YWx1ZXMsIHguc2hhcGUsIHguZHR5cGUpO1xuICAgICAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhuZXdTaGFwZSwgeC5kdHlwZSwgb3V0VmFsdWVzKTtcbiAgICB9XG4gICAgbGV0IHByb2dyYW07XG4gICAgaWYgKGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfVU5BUllfT1BFUkFUSU9OUycpKSB7XG4gICAgICAgIHByb2dyYW0gPSBuZXcgVW5hcnlPcFBhY2tlZFByb2dyYW0oeC5zaGFwZSwgTkVHKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHByb2dyYW0gPSBuZXcgVW5hcnlPcFByb2dyYW0oeC5zaGFwZSwgTkVHKTtcbiAgICB9XG4gICAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4XSwgeC5kdHlwZSk7XG59XG5leHBvcnQgY29uc3QgbmVnQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE5lZyxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBuZWdcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1OZWcuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBrZXJuZWxfaW1wbHMsIE5vbk1heFN1cHByZXNzaW9uVjMgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25WM0ltcGwgPSBrZXJuZWxfaW1wbHMubm9uTWF4U3VwcHJlc3Npb25WM0ltcGw7XG5leHBvcnQgZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25WMyhhcmdzKSB7XG4gICAgYmFja2VuZF91dGlsLndhcm4oJ3RmLm5vbk1heFN1cHByZXNzaW9uKCkgaW4gd2ViZ2wgbG9ja3MgdGhlIFVJIHRocmVhZC4gJyArXG4gICAgICAgICdDYWxsIHRmLm5vbk1heFN1cHByZXNzaW9uQXN5bmMoKSBpbnN0ZWFkJyk7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgYm94ZXMsIHNjb3JlcyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCB9ID0gYXR0cnM7XG4gICAgY29uc3QgYm94ZXNWYWxzID0gYmFja2VuZC5yZWFkU3luYyhib3hlcy5kYXRhSWQpO1xuICAgIGNvbnN0IHNjb3Jlc1ZhbHMgPSBiYWNrZW5kLnJlYWRTeW5jKHNjb3Jlcy5kYXRhSWQpO1xuICAgIGNvbnN0IHsgc2VsZWN0ZWRJbmRpY2VzIH0gPSBub25NYXhTdXBwcmVzc2lvblYzSW1wbChib3hlc1ZhbHMsIHNjb3Jlc1ZhbHMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQpO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtzZWxlY3RlZEluZGljZXMubGVuZ3RoXSwgJ2ludDMyJywgbmV3IEludDMyQXJyYXkoc2VsZWN0ZWRJbmRpY2VzKSk7XG59XG5leHBvcnQgY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25WM0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBOb25NYXhTdXBwcmVzc2lvblYzLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IG5vbk1heFN1cHByZXNzaW9uVjNcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ob25NYXhTdXBwcmVzc2lvblYzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwga2VybmVsX2ltcGxzLCBOb25NYXhTdXBwcmVzc2lvblY0IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmNvbnN0IG5vbk1heFN1cHByZXNzaW9uVjRJbXBsID0ga2VybmVsX2ltcGxzLm5vbk1heFN1cHByZXNzaW9uVjRJbXBsO1xuZXhwb3J0IGZ1bmN0aW9uIG5vbk1heFN1cHByZXNzaW9uVjQoYXJncykge1xuICAgIGJhY2tlbmRfdXRpbC53YXJuKCd0Zi5ub25NYXhTdXBwcmVzc2lvbigpIGluIHdlYmdsIGxvY2tzIHRoZSBVSSB0aHJlYWQuICcgK1xuICAgICAgICAnQ2FsbCB0Zi5ub25NYXhTdXBwcmVzc2lvbkFzeW5jKCkgaW5zdGVhZCcpO1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGJveGVzLCBzY29yZXMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsIHBhZFRvTWF4T3V0cHV0U2l6ZSB9ID0gYXR0cnM7XG4gICAgY29uc3QgYm94ZXNWYWxzID0gYmFja2VuZC5yZWFkU3luYyhib3hlcy5kYXRhSWQpO1xuICAgIGNvbnN0IHNjb3Jlc1ZhbHMgPSBiYWNrZW5kLnJlYWRTeW5jKHNjb3Jlcy5kYXRhSWQpO1xuICAgIGNvbnN0IHsgc2VsZWN0ZWRJbmRpY2VzLCB2YWxpZE91dHB1dHMgfSA9IG5vbk1heFN1cHByZXNzaW9uVjRJbXBsKGJveGVzVmFscywgc2NvcmVzVmFscywgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCwgcGFkVG9NYXhPdXRwdXRTaXplKTtcbiAgICByZXR1cm4gW1xuICAgICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtzZWxlY3RlZEluZGljZXMubGVuZ3RoXSwgJ2ludDMyJywgbmV3IEludDMyQXJyYXkoc2VsZWN0ZWRJbmRpY2VzKSksXG4gICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW10sICdpbnQzMicsIG5ldyBJbnQzMkFycmF5KFt2YWxpZE91dHB1dHNdKSlcbiAgICBdO1xufVxuZXhwb3J0IGNvbnN0IG5vbk1heFN1cHByZXNzaW9uVjRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTm9uTWF4U3VwcHJlc3Npb25WNCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBub25NYXhTdXBwcmVzc2lvblY0XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Tm9uTWF4U3VwcHJlc3Npb25WNC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIGtlcm5lbF9pbXBscywgTm9uTWF4U3VwcHJlc3Npb25WNSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5jb25zdCBub25NYXhTdXBwcmVzc2lvblY1SW1wbCA9IGtlcm5lbF9pbXBscy5ub25NYXhTdXBwcmVzc2lvblY1SW1wbDtcbmV4cG9ydCBmdW5jdGlvbiBub25NYXhTdXBwcmVzc2lvblY1KGFyZ3MpIHtcbiAgICBiYWNrZW5kX3V0aWwud2FybigndGYubm9uTWF4U3VwcHJlc3Npb24oKSBpbiB3ZWJnbCBsb2NrcyB0aGUgVUkgdGhyZWFkLiAnICtcbiAgICAgICAgJ0NhbGwgdGYubm9uTWF4U3VwcHJlc3Npb25Bc3luYygpIGluc3RlYWQnKTtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBib3hlcywgc2NvcmVzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBtYXhPdXRwdXRTaXplLCBpb3VUaHJlc2hvbGQsIHNjb3JlVGhyZXNob2xkLCBzb2Z0Tm1zU2lnbWEgfSA9IGF0dHJzO1xuICAgIGNvbnN0IGJveGVzVmFscyA9IGJhY2tlbmQucmVhZFN5bmMoYm94ZXMuZGF0YUlkKTtcbiAgICBjb25zdCBzY29yZXNWYWxzID0gYmFja2VuZC5yZWFkU3luYyhzY29yZXMuZGF0YUlkKTtcbiAgICBjb25zdCBtYXhPdXRwdXRTaXplVmFsID0gbWF4T3V0cHV0U2l6ZTtcbiAgICBjb25zdCBpb3VUaHJlc2hvbGRWYWwgPSBpb3VUaHJlc2hvbGQ7XG4gICAgY29uc3Qgc2NvcmVUaHJlc2hvbGRWYWwgPSBzY29yZVRocmVzaG9sZDtcbiAgICBjb25zdCBzb2Z0Tm1zU2lnbWFWYWwgPSBzb2Z0Tm1zU2lnbWE7XG4gICAgY29uc3QgeyBzZWxlY3RlZEluZGljZXMsIHNlbGVjdGVkU2NvcmVzIH0gPSBub25NYXhTdXBwcmVzc2lvblY1SW1wbChib3hlc1ZhbHMsIHNjb3Jlc1ZhbHMsIG1heE91dHB1dFNpemVWYWwsIGlvdVRocmVzaG9sZFZhbCwgc2NvcmVUaHJlc2hvbGRWYWwsIHNvZnRObXNTaWdtYVZhbCk7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbc2VsZWN0ZWRJbmRpY2VzLmxlbmd0aF0sICdpbnQzMicsIG5ldyBJbnQzMkFycmF5KHNlbGVjdGVkSW5kaWNlcykpLFxuICAgICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtzZWxlY3RlZFNjb3Jlcy5sZW5ndGhdLCAnZmxvYXQzMicsIG5ldyBGbG9hdDMyQXJyYXkoc2VsZWN0ZWRTY29yZXMpKVxuICAgIF07XG59XG5leHBvcnQgY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25WNUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBOb25NYXhTdXBwcmVzc2lvblY1LFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IG5vbk1heFN1cHByZXNzaW9uVjVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ob25NYXhTdXBwcmVzc2lvblY1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IE5vdEVxdWFsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7IG5vdEVxdWFsSW1wbENQVSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuY29uc3QgTk9UX0VRVUFMID0gYHJldHVybiBmbG9hdChhICE9IGIpO2A7XG5leHBvcnQgY29uc3Qgbm90RXF1YWwgPSBiaW5hcnlLZXJuZWxGdW5jKHsgb3BTbmlwcGV0OiBOT1RfRVFVQUwsIGNwdUtlcm5lbEltcGw6IG5vdEVxdWFsSW1wbENQVSwgZHR5cGU6ICdib29sJyB9KTtcbmV4cG9ydCBjb25zdCBub3RFcXVhbENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBOb3RFcXVhbCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBub3RFcXVhbCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ob3RFcXVhbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBPbmVIb3QsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgT25lSG90UHJvZ3JhbSB9IGZyb20gJy4uL29uZWhvdF9ncHUnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5leHBvcnQgY29uc3Qgb25lSG90ID0gKGFyZ3MpID0+IHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBpbmRpY2VzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBkZXB0aCwgb25WYWx1ZSwgb2ZmVmFsdWUgfSA9IGF0dHJzO1xuICAgIGNvbnN0IGluZGljZXNTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKGluZGljZXMuc2hhcGUpO1xuICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgT25lSG90UHJvZ3JhbShpbmRpY2VzU2l6ZSwgZGVwdGgsIG9uVmFsdWUsIG9mZlZhbHVlKTtcbiAgICBjb25zdCByZXNoYXBlZCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogaW5kaWNlcyB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogW2luZGljZXNTaXplXSB9IH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtyZXNoYXBlZF0sIGluZGljZXMuZHR5cGUpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVzaGFwZWQpO1xuICAgIGNvbnN0IG91dFNoYXBlID0gWy4uLmluZGljZXMuc2hhcGUsIGRlcHRoXTtcbiAgICBjb25zdCBvdXQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHJlc3VsdCB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogb3V0U2hhcGUgfSB9KTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc3VsdCk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5leHBvcnQgY29uc3Qgb25lSG90Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE9uZUhvdCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBvbmVIb3Rcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1PbmVIb3QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgT25lc0xpa2UgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY29tcGxleCB9IGZyb20gJy4vQ29tcGxleCc7XG5pbXBvcnQgeyBmaWxsIH0gZnJvbSAnLi9GaWxsJztcbmltcG9ydCB7IGltYWcgfSBmcm9tICcuL0ltYWcnO1xuaW1wb3J0IHsgcmVhbCB9IGZyb20gJy4vUmVhbCc7XG5pbXBvcnQgeyB6ZXJvc0xpa2UgfSBmcm9tICcuL1plcm9zTGlrZSc7XG5leHBvcnQgZnVuY3Rpb24gb25lc0xpa2UoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGlmICh4LmR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ29uZXNMaWtlIGlzIG5vdCBzdXBwb3J0ZWQgdW5kZXIgc3RyaW5nIGR0eXBlJyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHguZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICAgIGNvbnN0IHJlYWxQYXJ0ID0gcmVhbCh7IGlucHV0czogeyBpbnB1dDogeCB9LCBiYWNrZW5kIH0pO1xuICAgICAgICBjb25zdCByID0gb25lc0xpa2UoeyBpbnB1dHM6IHsgeDogcmVhbFBhcnQgfSwgYmFja2VuZCB9KTtcbiAgICAgICAgY29uc3QgaW1hZ1BhcnQgPSBpbWFnKHsgaW5wdXRzOiB7IGlucHV0OiB4IH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIGNvbnN0IGkgPSB6ZXJvc0xpa2UoeyBpbnB1dHM6IHsgeDogaW1hZ1BhcnQgfSwgYmFja2VuZCB9KTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY29tcGxleCh7IGlucHV0czogeyByZWFsOiByLCBpbWFnOiBpIH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVhbFBhcnQpO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHIpO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGltYWdQYXJ0KTtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIFRPRE8oY2Fpcywgc21pbGtvdik6IEFkZCBXZWJHTCBzaGFkZXIgZm9yIG9uZXNMaWtlOlxuICAgICAgICAvLyAgIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RmanMvaXNzdWVzLzEyOTNcbiAgICAgICAgcmV0dXJuIGZpbGwoeyBhdHRyczogeyBzaGFwZTogeC5zaGFwZSwgZHR5cGU6IHguZHR5cGUsIHZhbHVlOiAxIH0sIGJhY2tlbmQgfSk7XG4gICAgfVxufVxuZXhwb3J0IGNvbnN0IG9uZXNMaWtlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE9uZXNMaWtlLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IG9uZXNMaWtlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9T25lc0xpa2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUGFjaywgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjb25jYXQgfSBmcm9tICcuL0NvbmNhdCc7XG5pbXBvcnQgeyBleHBhbmREaW1zIH0gZnJvbSAnLi9FeHBhbmREaW1zJztcbmV4cG9ydCBmdW5jdGlvbiBwYWNrKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBheGlzIH0gPSBhdHRycztcbiAgICBpZiAoaW5wdXRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gZXhwYW5kRGltcyh7IGlucHV0czogeyBpbnB1dDogaW5wdXRzWzBdIH0sIGJhY2tlbmQsIGF0dHJzOiB7IGRpbTogYXhpcyB9IH0pO1xuICAgIH1cbiAgICBjb25zdCBzaGFwZSA9IGlucHV0c1swXS5zaGFwZTtcbiAgICBjb25zdCBkdHlwZSA9IGlucHV0c1swXS5kdHlwZTtcbiAgICBpbnB1dHMuZm9yRWFjaCh0ID0+IHtcbiAgICAgICAgdXRpbC5hc3NlcnRTaGFwZXNNYXRjaChzaGFwZSwgdC5zaGFwZSwgJ0FsbCB0ZW5zb3JzIHBhc3NlZCB0byBzdGFjayBtdXN0IGhhdmUgbWF0Y2hpbmcgc2hhcGVzJyk7XG4gICAgICAgIHV0aWwuYXNzZXJ0KGR0eXBlID09PSB0LmR0eXBlLCAoKSA9PiAnQWxsIHRlbnNvcnMgcGFzc2VkIHRvIHN0YWNrIG11c3QgaGF2ZSBtYXRjaGluZyBkdHlwZXMnKTtcbiAgICB9KTtcbiAgICBjb25zdCBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcyA9IFtdO1xuICAgIGNvbnN0IGV4cGFuZGVkVGVuc29ycyA9IGlucHV0cy5tYXAodCA9PiB7XG4gICAgICAgIGNvbnN0IGV4cGFuZGVkVCA9IGV4cGFuZERpbXMoeyBpbnB1dHM6IHsgaW5wdXQ6IHQgfSwgYmFja2VuZCwgYXR0cnM6IHsgZGltOiBheGlzIH0gfSk7XG4gICAgICAgIGludGVybWVkaWF0ZVRlbnNvckluZm9zLnB1c2goZXhwYW5kZWRUKTtcbiAgICAgICAgcmV0dXJuIGV4cGFuZGVkVDtcbiAgICB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBjb25jYXQoeyBpbnB1dHM6IGV4cGFuZGVkVGVuc29ycywgYmFja2VuZCwgYXR0cnM6IHsgYXhpcyB9IH0pO1xuICAgIGludGVybWVkaWF0ZVRlbnNvckluZm9zLmZvckVhY2godCA9PiBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHQpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGNvbnN0IHBhY2tDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUGFjayxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBwYWNrXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UGFjay5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBlbnYsIFBhZFYyIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IFBhZFByb2dyYW0gfSBmcm9tICcuLi9wYWRfZ3B1JztcbmltcG9ydCB7IFBhZFBhY2tlZFByb2dyYW0gfSBmcm9tICcuLi9wYWRfcGFja2VkX2dwdSc7XG5leHBvcnQgY29uc3QgcGFkVjIgPSAoYXJncykgPT4ge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHBhZGRpbmdzLCBjb25zdGFudFZhbHVlIH0gPSBhdHRycztcbiAgICBjb25zdCBwcm9ncmFtID0gZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19BUlJBWV9PUEVSQVRJT05TJykgP1xuICAgICAgICBuZXcgUGFkUGFja2VkUHJvZ3JhbSh4LnNoYXBlLCBwYWRkaW5ncywgY29uc3RhbnRWYWx1ZSkgOlxuICAgICAgICBuZXcgUGFkUHJvZ3JhbSh4LnNoYXBlLCBwYWRkaW5ncywgY29uc3RhbnRWYWx1ZSk7XG4gICAgY29uc3QgY3VzdG9tVmFsdWVzID0gW1tjb25zdGFudFZhbHVlXV07XG4gICAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4XSwgeC5kdHlwZSwgY3VzdG9tVmFsdWVzKTtcbn07XG5leHBvcnQgY29uc3QgcGFkVjJDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUGFkVjIsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogcGFkVjJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QYWRWMi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBQb3cgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgQ0hFQ0tfTkFOX1NOSVBQRVQgfSBmcm9tICcuLi9iaW5hcnlvcF9wYWNrZWRfZ3B1JztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmNvbnN0IFBPVyA9IGBcbiAgaWYoYSA8IDAuMCAmJiBmbG9vcihiKSA8IGIpe1xuICAgIHJldHVybiBOQU47XG4gIH1cbiAgaWYgKGIgPT0gMC4wKSB7XG4gICAgcmV0dXJuIDEuMDtcbiAgfVxuICByZXR1cm4gKHJvdW5kKG1vZChiLCAyLjApKSAhPSAxKSA/XG4gICAgICBwb3coYWJzKGEpLCBiKSA6IHNpZ24oYSkgKiBwb3coYWJzKGEpLCBiKTtcbmA7XG5jb25zdCBQT1dfUEFDS0VEID0gYFxuICAvLyBpc01vZFJvdW5kMSBoYXMgMSBmb3IgY29tcG9uZW50cyB3aXRoIHJvdW5kKG1vZChiLCAyLjApKSA9PSAxLCAwIG90aGVyd2lzZS5cbiAgdmVjNCBpc01vZFJvdW5kMSA9IHZlYzQoZXF1YWwocm91bmQobW9kKGIsIDIuMCkpLCBpdmVjNCgxKSkpO1xuICB2ZWM0IG11bHRpcGxpZXIgPSBzaWduKGEpICogaXNNb2RSb3VuZDEgKyAodmVjNCgxLjApIC0gaXNNb2RSb3VuZDEpO1xuICB2ZWM0IHJlc3VsdCA9IG11bHRpcGxpZXIgKiBwb3coYWJzKGEpLCBiKTtcblxuICAvLyBFbnN1cmUgdGhhdCBhXjAgPSAxLCBpbmNsdWRpbmcgMF4wID0gMSBhcyB0aGlzIGNvcnJlc3BvbmQgdG8gVEYgYW5kIEpTXG4gIGJ2ZWM0IGlzRXhwWmVybyA9IGVxdWFsKGIsIHZlYzQoMC4wKSk7XG4gIHJlc3VsdC5yID0gaXNFeHBaZXJvLnIgPyAxLjAgOiByZXN1bHQucjtcbiAgcmVzdWx0LmcgPSBpc0V4cFplcm8uZyA/IDEuMCA6IHJlc3VsdC5nO1xuICByZXN1bHQuYiA9IGlzRXhwWmVyby5iID8gMS4wIDogcmVzdWx0LmI7XG4gIHJlc3VsdC5hID0gaXNFeHBaZXJvLmEgPyAxLjAgOiByZXN1bHQuYTtcblxuICB2ZWM0IGlzTmFOID0gdmVjNChsZXNzVGhhbihhLCB2ZWM0KDAuMCkpKSAqIHZlYzQobGVzc1RoYW4oZmxvb3IoYiksIGIpKTtcbiAgYCArXG4gICAgQ0hFQ0tfTkFOX1NOSVBQRVQgKyBgXG4gIHJldHVybiByZXN1bHQ7XG5gO1xuZXhwb3J0IGNvbnN0IHBvdyA9IGJpbmFyeUtlcm5lbEZ1bmMoeyBvcFNuaXBwZXQ6IFBPVywgcGFja2VkT3BTbmlwcGV0OiBQT1dfUEFDS0VEIH0pO1xuZXhwb3J0IGNvbnN0IHBvd0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBQb3csXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogcG93XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UG93LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGVudiwgUHJlbHUgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgQmluYXJ5T3BQcm9ncmFtIH0gZnJvbSAnLi4vYmluYXJ5b3BfZ3B1JztcbmltcG9ydCB7IEJpbmFyeU9wUGFja2VkUHJvZ3JhbSB9IGZyb20gJy4uL2JpbmFyeW9wX3BhY2tlZF9ncHUnO1xuZXhwb3J0IGNvbnN0IFBSRUxVID0gYHJldHVybiAoYSA8IDAuKSA/IGIgKiBhIDogYTtgO1xuZXhwb3J0IGNvbnN0IFBSRUxVX1BBQ0tFRCA9IGBcbiAgdmVjNCBhTGVzc1RoYW5aZXJvID0gdmVjNChsZXNzVGhhbihhLCB2ZWM0KDAuKSkpO1xuICByZXR1cm4gKGFMZXNzVGhhblplcm8gKiAoYiAqIGEpKSArICgodmVjNCgxLjApIC0gYUxlc3NUaGFuWmVybykgKiBhKTtcbmA7XG5leHBvcnQgZnVuY3Rpb24gcHJlbHUoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCwgYWxwaGEgfSA9IGlucHV0cztcbiAgICBjb25zdCBwcm9ncmFtID0gZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19CSU5BUllfT1BFUkFUSU9OUycpID9cbiAgICAgICAgbmV3IEJpbmFyeU9wUGFja2VkUHJvZ3JhbShQUkVMVV9QQUNLRUQsIHguc2hhcGUsIGFscGhhLnNoYXBlKSA6XG4gICAgICAgIG5ldyBCaW5hcnlPcFByb2dyYW0oUFJFTFUsIHguc2hhcGUsIGFscGhhLnNoYXBlKTtcbiAgICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3gsIGFscGhhXSwgeC5kdHlwZSk7XG59XG5leHBvcnQgY29uc3QgcHJlbHVDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUHJlbHUsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogcHJlbHVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QcmVsdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIFByb2QsIHN1bU91dFR5cGUsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgcmVkdWNlIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3JlZHVjZSc7XG5pbXBvcnQgeyBwcm9kSW1wbENQVSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQgeyB0cmFuc3Bvc2UgfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5leHBvcnQgZnVuY3Rpb24gcHJvZChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYXhpcywga2VlcERpbXMgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgdG9EaXNwb3NlID0gW107XG4gICAgY29uc3Qgb3JpZ0F4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpO1xuICAgIGxldCBheGVzID0gb3JpZ0F4ZXM7XG4gICAgY29uc3QgcGVybXV0ZWRBeGVzID0gYmFja2VuZF91dGlsLmdldEF4ZXNQZXJtdXRhdGlvbihheGVzLCB4UmFuayk7XG4gICAgbGV0IHBlcm11dGVkWCA9IHg7XG4gICAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgICAgIHBlcm11dGVkWCA9IHRyYW5zcG9zZSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHBlcm06IHBlcm11dGVkQXhlcyB9IH0pO1xuICAgICAgICBheGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoYXhlcy5sZW5ndGgsIHhSYW5rKTtcbiAgICAgICAgdG9EaXNwb3NlLnB1c2gocGVybXV0ZWRYKTtcbiAgICB9XG4gICAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdwcm9kJywgYXhlcywgeFJhbmspO1xuICAgIGxldCByZXM7XG4gICAgaWYgKGJhY2tlbmQuc2hvdWxkRXhlY3V0ZU9uQ1BVKFtwZXJtdXRlZFhdKSkge1xuICAgICAgICBjb25zdCB4VmFscyA9IGJhY2tlbmQudGV4RGF0YS5nZXQocGVybXV0ZWRYLmRhdGFJZCkudmFsdWVzO1xuICAgICAgICBjb25zdCB7IG91dFZhbHMsIG91dFNoYXBlLCBvdXREdHlwZSB9ID0gcHJvZEltcGxDUFUocGVybXV0ZWRYLnNoYXBlLCBwZXJtdXRlZFguZHR5cGUsIHhWYWxzLCBheGVzKTtcbiAgICAgICAgcmVzID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRTaGFwZSwgb3V0RHR5cGUsIG91dFZhbHMpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgW291dFNoYXBlLCByZWR1Y2VTaGFwZV0gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcyhwZXJtdXRlZFguc2hhcGUsIGF4ZXMpO1xuICAgICAgICBjb25zdCBpblNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuICAgICAgICBjb25zdCBhMkQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHBlcm11dGVkWCB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogWy0xLCBpblNpemVdIH0gfSk7XG4gICAgICAgIGNvbnN0IG91dHB1dERUeXBlID0gc3VtT3V0VHlwZSh4LmR0eXBlKTtcbiAgICAgICAgY29uc3QgcmVkdWNlZCA9IHJlZHVjZShhMkQsIG91dHB1dERUeXBlLCAncHJvZCcsIGJhY2tlbmQpO1xuICAgICAgICByZXMgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHJlZHVjZWQgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IG91dFNoYXBlIH0gfSk7XG4gICAgICAgIHRvRGlzcG9zZS5wdXNoKGEyRCk7XG4gICAgICAgIHRvRGlzcG9zZS5wdXNoKHJlZHVjZWQpO1xuICAgIH1cbiAgICBpZiAoa2VlcERpbXMpIHtcbiAgICAgICAgdG9EaXNwb3NlLnB1c2gocmVzKTtcbiAgICAgICAgY29uc3QgbmV3U2hhcGUgPSBiYWNrZW5kX3V0aWwuZXhwYW5kU2hhcGVUb0tlZXBEaW0ocmVzLnNoYXBlLCBvcmlnQXhlcyk7XG4gICAgICAgIHJlcyA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogcmVzIH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBuZXdTaGFwZSB9IH0pO1xuICAgIH1cbiAgICB0b0Rpc3Bvc2UuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuICAgIHJldHVybiByZXM7XG59XG5leHBvcnQgY29uc3QgcHJvZENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBQcm9kLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IHByb2Rcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Qcm9kLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFJhbmdlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHJhbmdlSW1wbENQVSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuZXhwb3J0IGNvbnN0IHJhbmdlID0gKGFyZ3MpID0+IHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgc3RhcnQsIHN0b3AsIHN0ZXAsIGR0eXBlIH0gPSBhdHRycztcbiAgICBjb25zdCB2YWx1ZXMgPSByYW5nZUltcGxDUFUoc3RhcnQsIHN0b3AsIHN0ZXAsIGR0eXBlKTtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbdmFsdWVzLmxlbmd0aF0sIGR0eXBlLCB2YWx1ZXMpO1xufTtcbmV4cG9ydCBjb25zdCByYW5nZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBSYW5nZSxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiByYW5nZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJhbmdlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFJlYWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgaWRlbnRpdHkgfSBmcm9tICcuL0lkZW50aXR5JztcbmV4cG9ydCBmdW5jdGlvbiByZWFsKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IGlucHV0IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgaW5wdXREYXRhID0gYmFja2VuZC50ZXhEYXRhLmdldChpbnB1dC5kYXRhSWQpO1xuICAgIHJldHVybiBpZGVudGl0eSh7IGlucHV0czogeyB4OiBpbnB1dERhdGEuY29tcGxleFRlbnNvckluZm9zLnJlYWwgfSwgYmFja2VuZCB9KTtcbn1cbmV4cG9ydCBjb25zdCByZWFsQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJlYWwsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogcmVhbFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlYWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUmVhbERpdiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBiaW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG4vLyBXaXRob3V0IHRoZSBlcXVhbGl0eSBjaGVjayBkaXYgcHJvZHVjZXMgMC45OTk5IGZvciBhID0gYiwgd2hpY2ggd2hlblxuLy8gZmxvb3JlZCBjYW4gY2F1c2UgZXJyb3JzLlxuY29uc3QgRElWID0gYFxuaWYgKGEgPT0gYikge1xuICByZXR1cm4gMS4wO1xufTtcbnJldHVybiBhIC8gYjtgO1xuLy8gV2UgZG8gdGhlIHNhbWUgYXMgaW4gLi9iaW5hcnlvcF9ncHUsIHdpdGggdmVjNCBhbmQgaXZlYzQuXG4vLyBPbiBMaW51eCwgdGhlIHZlY3Rvcml6ZWQgaW1wbGVtZW50YXRpb24gcHJvZHVjZXMgTmFOcyB3aGVuIGEgYW5kIGIgYXJlIDAuXG5jb25zdCBESVZfUEFDS0VEID0gYFxuICAvLyB2ZWM0IG9uZSA9IHZlYzQoZXF1YWwoYSwgYikpO1xuICAvLyByZXR1cm4gb25lICsgKHZlYzQoMS4wKSAtIG9uZSkgKiBhIC8gYjtcbiAgdmVjNCByZXN1bHQgPSBhIC8gYjtcbiAgaWYoYS54ID09IGIueCkge1xuICAgIHJlc3VsdC54ID0gMS47XG4gIH1cbiAgaWYoYS55ID09IGIueSkge1xuICAgIHJlc3VsdC55ID0gMS47XG4gIH1cbiAgaWYoYS56ID09IGIueikge1xuICAgIHJlc3VsdC56ID0gMS47XG4gIH1cbiAgaWYoYS53ID09IGIudykge1xuICAgIHJlc3VsdC53ID0gMS47XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xuYDtcbmV4cG9ydCBjb25zdCByZWFsRGl2ID0gYmluYXJ5S2VybmVsRnVuYyh7IG9wU25pcHBldDogRElWLCBwYWNrZWRPcFNuaXBwZXQ6IERJVl9QQUNLRUQsIGNoZWNrT3V0T2ZCb3VuZHM6IHRydWUgfSk7XG5leHBvcnQgY29uc3QgcmVhbERpdkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBSZWFsRGl2LFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IHJlYWxEaXYsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVhbERpdi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBSZWNpcHJvY2FsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuY29uc3QgUkVDSVBST0NBTCA9IGByZXR1cm4gMS4wIC8geDtgO1xuZXhwb3J0IGNvbnN0IHJlY2lwcm9jYWwgPSB1bmFyeUtlcm5lbEZ1bmMoeyBvcFNuaXBwZXQ6IFJFQ0lQUk9DQUwgfSk7XG5leHBvcnQgY29uc3QgcmVjaXByb2NhbENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBSZWNpcHJvY2FsLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IHJlY2lwcm9jYWwsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVjaXByb2NhbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBSZWx1IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHsgQ0hFQ0tfTkFOX1NOSVBQRVQgfSBmcm9tICcuLi91bmFyeW9wX2dwdSc7XG5jb25zdCBSRUxVID0gQ0hFQ0tfTkFOX1NOSVBQRVQgKyBgXG4gIHJldHVybiAoeCA8IDAuMCkgPyAwLjAgOiB4O1xuYDtcbmNvbnN0IFJFTFVfUEFDS0VEID0gYFxuICB2ZWM0IHJlc3VsdCA9IHggKiB2ZWM0KGdyZWF0ZXJUaGFuRXF1YWwoeCwgdmVjNCgwLjApKSk7XG4gIGJ2ZWM0IGlzTmFOID0gaXNuYW4oeCk7XG5cbiAgcmVzdWx0LnIgPSBpc05hTi5yID8geC5yIDogcmVzdWx0LnI7XG4gIHJlc3VsdC5nID0gaXNOYU4uZyA/IHguZyA6IHJlc3VsdC5nO1xuICByZXN1bHQuYiA9IGlzTmFOLmIgPyB4LmIgOiByZXN1bHQuYjtcbiAgcmVzdWx0LmEgPSBpc05hTi5hID8geC5hIDogcmVzdWx0LmE7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbmA7XG5leHBvcnQgY29uc3QgcmVsdSA9IHVuYXJ5S2VybmVsRnVuYyh7IG9wU25pcHBldDogUkVMVSwgcGFja2VkT3BTbmlwcGV0OiBSRUxVX1BBQ0tFRCB9KTtcbmV4cG9ydCBjb25zdCByZWx1Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJlbHUsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogcmVsdVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlbHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUmVsdTYgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQgeyBDSEVDS19OQU5fU05JUFBFVCB9IGZyb20gJy4uL3VuYXJ5b3BfZ3B1JztcbmNvbnN0IFJFTFU2ID0gQ0hFQ0tfTkFOX1NOSVBQRVQgKyBgXG4gIHJldHVybiAoeCA8IDAuMCkgPyAwLjAgOiBtaW4oNi4wLCB4KTtcbmA7XG5jb25zdCBSRUxVNl9QQUNLRUQgPSBgXG4gIHZlYzQgcmVzdWx0ID0gbWluKHgsIHZlYzQoNi4pKSAqIHZlYzQoZ3JlYXRlclRoYW5FcXVhbCh4LCB2ZWM0KDAuMCkpKTtcbiAgYnZlYzQgaXNOYU4gPSBpc25hbih4KTtcblxuICByZXN1bHQuciA9IGlzTmFOLnIgPyB4LnIgOiByZXN1bHQucjtcbiAgcmVzdWx0LmcgPSBpc05hTi5nID8geC5nIDogcmVzdWx0Lmc7XG4gIHJlc3VsdC5iID0gaXNOYU4uYiA/IHguYiA6IHJlc3VsdC5iO1xuICByZXN1bHQuYSA9IGlzTmFOLmEgPyB4LmEgOiByZXN1bHQuYTtcblxuICByZXR1cm4gcmVzdWx0O1xuYDtcbmV4cG9ydCBjb25zdCByZWx1NiA9IHVuYXJ5S2VybmVsRnVuYyh7IG9wU25pcHBldDogUkVMVTYsIHBhY2tlZE9wU25pcHBldDogUkVMVTZfUEFDS0VEIH0pO1xuZXhwb3J0IGNvbnN0IHJlbHU2Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJlbHU2LFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IHJlbHU2XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVsdTYuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUmVzaGFwZSwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBwYWNrZWRSZXNoYXBlIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3Jlc2hhcGUnO1xuaW1wb3J0IHsgaXNSZXNoYXBlRnJlZSB9IGZyb20gJy4uL3dlYmdsX3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2hhcGUoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHNoYXBlIH0gPSBhdHRycztcbiAgICBjb25zdCB3ZWJnbEJhY2tlbmQgPSBiYWNrZW5kO1xuICAgIGNvbnN0IHhTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHguc2hhcGUpO1xuICAgIGNvbnN0ICRzaGFwZSA9IHV0aWwuaW5mZXJGcm9tSW1wbGljaXRTaGFwZShzaGFwZSwgeFNpemUpO1xuICAgIGNvbnN0ICR4U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSgkc2hhcGUpO1xuICAgIHV0aWwuYXNzZXJ0KHhTaXplID09PSAkeFNpemUsICgpID0+IGBUaGUgbmV3IHNoYXBlICgkeyRzaGFwZX0pIGhhcyAkeyR4U2l6ZX0gZWxlbWVudHMgYW5kIHRoZSBvbGQgYCArXG4gICAgICAgIGBzaGFwZSAoJHt4LnNoYXBlfSkgaGFzICR7eFNpemV9IGVsZW1lbnRzLiBUaGUgbmV3IHNoYXBlIGFuZCBvbGQgYCArXG4gICAgICAgIGBzaGFwZSBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGVsZW1lbnRzLmApO1xuICAgIGNvbnN0IHhUZXhEYXRhID0gd2ViZ2xCYWNrZW5kLnRleERhdGEuZ2V0KHguZGF0YUlkKTtcbiAgICBpZiAoeFRleERhdGEuaXNQYWNrZWQgJiYgIWlzUmVzaGFwZUZyZWUoeC5zaGFwZSwgJHNoYXBlKSAmJlxuICAgICAgICAhKHhUZXhEYXRhLnRleHR1cmUgIT09IG51bGwgJiYgaXNSZXNoYXBlRnJlZSh4VGV4RGF0YS5zaGFwZSwgJHNoYXBlKSkpIHtcbiAgICAgICAgcmV0dXJuIHBhY2tlZFJlc2hhcGUoeCwgJHNoYXBlLCB3ZWJnbEJhY2tlbmQpO1xuICAgIH1cbiAgICB3ZWJnbEJhY2tlbmQuaW5jUmVmKHguZGF0YUlkKTtcbiAgICByZXR1cm4geyBkYXRhSWQ6IHguZGF0YUlkLCBzaGFwZTogJHNoYXBlLCBkdHlwZTogeC5kdHlwZSB9O1xufVxuZXhwb3J0IGNvbnN0IHJlc2hhcGVDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUmVzaGFwZSxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiByZXNoYXBlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVzaGFwZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBlbnYsIFJlc2l6ZUJpbGluZWFyIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IFJlc2l6ZUJpbGluZWFyUHJvZ3JhbSB9IGZyb20gJy4uL3Jlc2l6ZV9iaWxpbmVhcl9ncHUnO1xuaW1wb3J0IHsgUmVzaXplQmlsaW5lYXJQYWNrZWRQcm9ncmFtIH0gZnJvbSAnLi4vcmVzaXplX2JpbGluZWFyX3BhY2tlZF9ncHUnO1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2l6ZUJpbGluZWFyKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBpbWFnZXMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGFsaWduQ29ybmVycywgaGFsZlBpeGVsQ2VudGVycywgc2l6ZSB9ID0gYXR0cnM7XG4gICAgY29uc3QgW25ld0hlaWdodCwgbmV3V2lkdGhdID0gc2l6ZTtcbiAgICBjb25zdCBwcm9ncmFtID0gZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19JTUFHRV9PUEVSQVRJT05TJykgP1xuICAgICAgICBuZXcgUmVzaXplQmlsaW5lYXJQYWNrZWRQcm9ncmFtKGltYWdlcy5zaGFwZSwgbmV3SGVpZ2h0LCBuZXdXaWR0aCwgYWxpZ25Db3JuZXJzLCBoYWxmUGl4ZWxDZW50ZXJzKSA6XG4gICAgICAgIG5ldyBSZXNpemVCaWxpbmVhclByb2dyYW0oaW1hZ2VzLnNoYXBlLCBuZXdIZWlnaHQsIG5ld1dpZHRoLCBhbGlnbkNvcm5lcnMsIGhhbGZQaXhlbENlbnRlcnMpO1xuICAgIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbaW1hZ2VzXSwgJ2Zsb2F0MzInKTtcbn1cbmV4cG9ydCBjb25zdCByZXNpemVCaWxpbmVhckNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBSZXNpemVCaWxpbmVhcixcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiByZXNpemVCaWxpbmVhclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlc2l6ZUJpbGluZWFyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFJlc2l6ZUJpbGluZWFyR3JhZCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBSZXNpemVCaWxpbmVhckJhY2twcm9wUHJvZ3JhbSB9IGZyb20gJy4uL3Jlc2l6ZV9iaWxpbmVhcl9iYWNrcHJvcF9ncHUnO1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2l6ZUJpbGluZWFyR3JhZChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW1hZ2VzLCBkeSB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYWxpZ25Db3JuZXJzIH0gPSBhdHRycztcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IFJlc2l6ZUJpbGluZWFyQmFja3Byb3BQcm9ncmFtKGR5LnNoYXBlLCBpbWFnZXMuc2hhcGUsIGFsaWduQ29ybmVycyk7XG4gICAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtkeV0sIGR5LmR0eXBlKTtcbn1cbmV4cG9ydCBjb25zdCByZXNpemVCaWxpbmVhckdyYWRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUmVzaXplQmlsaW5lYXJHcmFkLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IHJlc2l6ZUJpbGluZWFyR3JhZFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlc2l6ZUJpbGluZWFyR3JhZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBlbnYsIFJlc2l6ZU5lYXJlc3ROZWlnaGJvciB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBSZXNpemVOZWFyZXN0TmVpZ2hib3JQcm9ncmFtIH0gZnJvbSAnLi4vcmVzaXplX25lYXJlc3RfbmVpZ2hib3JfZ3B1JztcbmltcG9ydCB7IFJlc2l6ZU5lYXJlc3ROZWlnaGJvclBhY2tlZFByb2dyYW0gfSBmcm9tICcuLi9yZXNpemVfbmVhcmVzdF9uZWlnaGJvcl9wYWNrZWRfZ3B1JztcbmV4cG9ydCBmdW5jdGlvbiByZXNpemVOZWFyZXN0TmVpZ2hib3IoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGltYWdlcyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYWxpZ25Db3JuZXJzLCBoYWxmUGl4ZWxDZW50ZXJzLCBzaXplIH0gPSBhdHRycztcbiAgICBjb25zdCBbbmV3SGVpZ2h0LCBuZXdXaWR0aF0gPSBzaXplO1xuICAgIGNvbnN0IHByb2dyYW0gPSBlbnYoKS5nZXRCb29sKCdXRUJHTF9QQUNLX0lNQUdFX09QRVJBVElPTlMnKSA/XG4gICAgICAgIG5ldyBSZXNpemVOZWFyZXN0TmVpZ2hib3JQYWNrZWRQcm9ncmFtKGltYWdlcy5zaGFwZSwgbmV3SGVpZ2h0LCBuZXdXaWR0aCwgYWxpZ25Db3JuZXJzLCBoYWxmUGl4ZWxDZW50ZXJzKSA6XG4gICAgICAgIG5ldyBSZXNpemVOZWFyZXN0TmVpZ2hib3JQcm9ncmFtKGltYWdlcy5zaGFwZSwgbmV3SGVpZ2h0LCBuZXdXaWR0aCwgYWxpZ25Db3JuZXJzLCBoYWxmUGl4ZWxDZW50ZXJzKTtcbiAgICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW2ltYWdlc10sIGltYWdlcy5kdHlwZSk7XG59XG5leHBvcnQgY29uc3QgcmVzaXplTmVhcmVzdE5laWdoYm9yQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJlc2l6ZU5lYXJlc3ROZWlnaGJvcixcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiByZXNpemVOZWFyZXN0TmVpZ2hib3Jcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZXNpemVOZWFyZXN0TmVpZ2hib3IuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBSZXNpemVOZWFyZXN0TmVpZ2JvckJhY2twcm9wUHJvZ3JhbSB9IGZyb20gJy4uL3Jlc2l6ZV9uZWFyZXN0X25laWdoYm9yX2JhY2twcm9wX2dwdSc7XG5leHBvcnQgZnVuY3Rpb24gcmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW1hZ2VzLCBkeSB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYWxpZ25Db3JuZXJzIH0gPSBhdHRycztcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IFJlc2l6ZU5lYXJlc3ROZWlnYm9yQmFja3Byb3BQcm9ncmFtKGR5LnNoYXBlLCBpbWFnZXMuc2hhcGUsIGFsaWduQ29ybmVycyk7XG4gICAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtkeV0sIGR5LmR0eXBlKTtcbn1cbmV4cG9ydCBjb25zdCByZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWQsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogcmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZW52LCBSZXZlcnNlLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IFJldmVyc2VQcm9ncmFtIH0gZnJvbSAnLi4vcmV2ZXJzZV9ncHUnO1xuaW1wb3J0IHsgUmV2ZXJzZVBhY2tlZFByb2dyYW0gfSBmcm9tICcuLi9yZXZlcnNlX3BhY2tlZF9ncHUnO1xuaW1wb3J0IHsgaWRlbnRpdHkgfSBmcm9tICcuL0lkZW50aXR5JztcbmV4cG9ydCBmdW5jdGlvbiByZXZlcnNlKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBkaW1zIH0gPSBhdHRycztcbiAgICBjb25zdCB4UmFuayA9IHguc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0ICRkaW1zID0gdXRpbC5wYXJzZUF4aXNQYXJhbShkaW1zLCB4LnNoYXBlKTtcbiAgICBpZiAoeFJhbmsgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGlkZW50aXR5KHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCB9KTtcbiAgICB9XG4gICAgY29uc3QgcHJvZ3JhbSA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfQVJSQVlfT1BFUkFUSU9OUycpID9cbiAgICAgICAgbmV3IFJldmVyc2VQYWNrZWRQcm9ncmFtKHguc2hhcGUsICRkaW1zKSA6XG4gICAgICAgIG5ldyBSZXZlcnNlUHJvZ3JhbSh4LnNoYXBlLCAkZGltcyk7XG4gICAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4XSwgeC5kdHlwZSk7XG59XG5leHBvcnQgY29uc3QgcmV2ZXJzZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBSZXZlcnNlLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IHJldmVyc2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZXZlcnNlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBSb3RhdGVXaXRoT2Zmc2V0IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IFJvdGF0ZVByb2dyYW0gfSBmcm9tICcuLi9yb3RhdGVfZ3B1JztcbmV4cG9ydCBjb25zdCByb3RhdGVXaXRoT2Zmc2V0Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJvdGF0ZVdpdGhPZmZzZXQsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogKHsgaW5wdXRzLCBhdHRycywgYmFja2VuZCB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgaW1hZ2UgfSA9IGlucHV0cztcbiAgICAgICAgY29uc3QgeyByYWRpYW5zLCBmaWxsVmFsdWUsIGNlbnRlciB9ID0gYXR0cnM7XG4gICAgICAgIGNvbnN0IHdlYmdsQmFja2VuZCA9IGJhY2tlbmQ7XG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgUm90YXRlUHJvZ3JhbShpbWFnZS5zaGFwZSwgZmlsbFZhbHVlKTtcbiAgICAgICAgY29uc3QgW2NlbnRlclgsIGNlbnRlclldID0gYmFja2VuZF91dGlsLmdldEltYWdlQ2VudGVyKGNlbnRlciwgaW1hZ2Uuc2hhcGVbMV0sIGltYWdlLnNoYXBlWzJdKTtcbiAgICAgICAgY29uc3QgY3VzdG9tVmFsdWVzID0gW1tjZW50ZXJYLCBjZW50ZXJZLCBNYXRoLnNpbihyYWRpYW5zKSwgTWF0aC5jb3MocmFkaWFucyldXTtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gd2ViZ2xCYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbaW1hZ2VdLCBpbWFnZS5kdHlwZSwgY3VzdG9tVmFsdWVzKTtcbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Um90YXRlV2l0aE9mZnNldC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBSb3VuZCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmNvbnN0IFJPVU5EID0gYFxuICAvLyBPcGVuR0wgRVMgZG9lcyBub3Qgc3VwcG9ydCByb3VuZCBmdW5jdGlvbi5cbiAgLy8gVGhlIGFsZ29yaXRobSBpcyBiYXNlZCBvbiBiYW5rZXIncyByb3VuZGluZy5cbiAgZmxvYXQgYmFzZSA9IGZsb29yKHgpO1xuICBpZiAoKHggLSBiYXNlKSA8IDAuNSkge1xuICAgIHJldHVybiBmbG9vcih4KTtcbiAgfSBlbHNlIGlmICgoeCAtIGJhc2UpID4gMC41KSB7XG4gICAgcmV0dXJuIGNlaWwoeCk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKG1vZChiYXNlLCAyLjApID09IDAuMCkge1xuICAgICAgcmV0dXJuIGJhc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBiYXNlICsgMS4wO1xuICAgIH1cbiAgfVxuYDtcbmV4cG9ydCBjb25zdCByb3VuZCA9IHVuYXJ5S2VybmVsRnVuYyh7IG9wU25pcHBldDogUk9VTkQgfSk7XG5leHBvcnQgY29uc3Qgcm91bmRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUm91bmQsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogcm91bmQsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Um91bmQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUnNxcnQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQgeyByc3FydEltcGxDUFUgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmNvbnN0IFJTUVJUID0gYHJldHVybiBpbnZlcnNlc3FydCh4KTtgO1xuZXhwb3J0IGNvbnN0IHJzcXJ0ID0gdW5hcnlLZXJuZWxGdW5jKHsgb3BTbmlwcGV0OiBSU1FSVCwgY3B1S2VybmVsSW1wbDogcnNxcnRJbXBsQ1BVIH0pO1xuZXhwb3J0IGNvbnN0IHJzcXJ0Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJzcXJ0LFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IHJzcXJ0XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UnNxcnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBTY2F0dGVyTmQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgU2NhdHRlclByb2dyYW0gfSBmcm9tICcuLi9zY2F0dGVyX2dwdSc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmV4cG9ydCBmdW5jdGlvbiBzY2F0dGVyTmQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGluZGljZXMsIHVwZGF0ZXMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHNoYXBlIH0gPSBhdHRycztcbiAgICBjb25zdCB7IHNsaWNlUmFuaywgbnVtVXBkYXRlcywgc2xpY2VTaXplLCBzdHJpZGVzLCBvdXRwdXRTaXplIH0gPSBiYWNrZW5kX3V0aWwuY2FsY3VsYXRlU2hhcGVzKHVwZGF0ZXMsIGluZGljZXMsIHNoYXBlKTtcbiAgICBjb25zdCBmbGF0dGVuU2hhcGUgPSBbb3V0cHV0U2l6ZSAvIHNsaWNlU2l6ZSwgc2xpY2VTaXplXTtcbiAgICBpZiAob3V0cHV0U2l6ZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhzaGFwZSwgaW5kaWNlcy5kdHlwZSk7XG4gICAgfVxuICAgIGNvbnN0IGZsYXR0ZW5JbmRpY2VzID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiBpbmRpY2VzIH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBbbnVtVXBkYXRlcywgc2xpY2VSYW5rXSB9IH0pO1xuICAgIGNvbnN0IGZsYXR0ZW5YID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiB1cGRhdGVzIH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBbbnVtVXBkYXRlcywgc2xpY2VTaXplXSB9IH0pO1xuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8oW10sICdmbG9hdDMyJywgbmV3IEZsb2F0MzJBcnJheShbMF0pKTsgLy8gc2NhbGFyKDApXG4gICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBTY2F0dGVyUHJvZ3JhbShudW1VcGRhdGVzLCBzbGljZVJhbmssIGZsYXR0ZW5JbmRpY2VzLnNoYXBlLmxlbmd0aCwgZmxhdHRlblguc2hhcGUubGVuZ3RoLCBzdHJpZGVzLCBmbGF0dGVuU2hhcGUpO1xuICAgIGNvbnN0IHJlcyA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtmbGF0dGVuWCwgZmxhdHRlbkluZGljZXMsIGRlZmF1bHRWYWx1ZV0sIGZsYXR0ZW5YLmR0eXBlKTtcbiAgICBjb25zdCByZXNoYXBlZCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogcmVzIH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlIH0gfSk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhmbGF0dGVuSW5kaWNlcyk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhmbGF0dGVuWCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXMpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oZGVmYXVsdFZhbHVlKTtcbiAgICByZXR1cm4gcmVzaGFwZWQ7XG59XG5leHBvcnQgY29uc3Qgc2NhdHRlck5kQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNjYXR0ZXJOZCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBzY2F0dGVyTmRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TY2F0dGVyTmQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU2VsZWN0LCB1cGNhc3RUeXBlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IFNlbGVjdFByb2dyYW0gfSBmcm9tICcuLi9zZWxlY3RfZ3B1JztcbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3QoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgY29uZGl0aW9uLCB0LCBlIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBTZWxlY3RQcm9ncmFtKGNvbmRpdGlvbi5zaGFwZS5sZW5ndGgsIHQuc2hhcGUsIHQuc2hhcGUubGVuZ3RoKTtcbiAgICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW2NvbmRpdGlvbiwgdCwgZV0sIHVwY2FzdFR5cGUodC5kdHlwZSwgZS5kdHlwZSkpO1xufVxuZXhwb3J0IGNvbnN0IHNlbGVjdENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTZWxlY3QsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogc2VsZWN0XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2VsZWN0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgU2VsdSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmNvbnN0IFNFTFUgPSBgXG4gIC8vIFN0YWJsZSBhbmQgQXR0cmFjdGluZyBGaXhlZCBQb2ludCAoMCwgMSkgZm9yIE5vcm1hbGl6ZWQgV2VpZ2h0cy5cbiAgLy8gc2VlOiBodHRwczovL2FyeGl2Lm9yZy9hYnMvMTcwNi4wMjUxNVxuICBmbG9hdCBzY2FsZUFscGhhID0gJHtiYWNrZW5kX3V0aWwuU0VMVV9TQ0FMRUFMUEhBfTtcbiAgZmxvYXQgc2NhbGUgPSAke2JhY2tlbmRfdXRpbC5TRUxVX1NDQUxFfTtcbiAgcmV0dXJuICh4ID49IDAuMCkgPyBzY2FsZSAqIHggOiBzY2FsZUFscGhhICogKGV4cCh4KSAtIDEuMCk7XG5gO1xuZXhwb3J0IGNvbnN0IHNlbHUgPSB1bmFyeUtlcm5lbEZ1bmMoeyBvcFNuaXBwZXQ6IFNFTFUgfSk7XG5leHBvcnQgY29uc3Qgc2VsdUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTZWx1LFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IHNlbHUsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2VsdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTaWdtb2lkIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuY29uc3QgU0lHTU9JRCA9IGByZXR1cm4gMS4wIC8gKDEuMCArIGV4cCgtMS4wICogeCkpO2A7XG5leHBvcnQgY29uc3Qgc2lnbW9pZCA9IHVuYXJ5S2VybmVsRnVuYyh7IG9wU25pcHBldDogU0lHTU9JRCB9KTtcbmV4cG9ydCBjb25zdCBzaWdtb2lkQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNpZ21vaWQsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogc2lnbW9pZCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TaWdtb2lkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFNpZ24gfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG4vLyBTaWduIGRvZXMgbm90IHByb3BhZ2F0ZSBOQU5zLlxuY29uc3QgU0lHTiA9IGBcbiAgaWYgKGlzbmFuKHgpKSB7IHJldHVybiAwLjA7IH1cbiAgcmV0dXJuIHNpZ24oeCk7XG5gO1xuZXhwb3J0IGNvbnN0IHNpZ24gPSB1bmFyeUtlcm5lbEZ1bmMoeyBvcFNuaXBwZXQ6IFNJR04gfSk7XG5leHBvcnQgY29uc3Qgc2lnbkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTaWduLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IHNpZ24sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2lnbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTaW4gfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgQ0hFQ0tfTkFOX1NOSVBQRVRfVU5BUlksIHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuY29uc3QgU0lOID0gQ0hFQ0tfTkFOX1NOSVBQRVRfVU5BUlkgKyBgXG4gIHJldHVybiBzaW4oeCk7XG5gO1xuZXhwb3J0IGNvbnN0IHNpbiA9IHVuYXJ5S2VybmVsRnVuYyh7IG9wU25pcHBldDogU0lOIH0pO1xuZXhwb3J0IGNvbnN0IHNpbkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTaW4sXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogc2luLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNpbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTaW5oIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuY29uc3QgU0lOSCA9IGBcbiAgZmxvYXQgZTJ4ID0gZXhwKHgpO1xuICByZXR1cm4gKGUyeCAtIDEuMCAvIGUyeCkgLyAyLjA7XG5gO1xuZXhwb3J0IGNvbnN0IHNpbmggPSB1bmFyeUtlcm5lbEZ1bmMoeyBvcFNuaXBwZXQ6IFNJTkggfSk7XG5leHBvcnQgY29uc3Qgc2luaENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTaW5oLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IHNpbmgsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2luaC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBlbnYsIFNsaWNlLCBzbGljZV91dGlsLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHNsaWNlSW1wbENQVSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuaW1wb3J0IHsgU2xpY2VQcm9ncmFtIH0gZnJvbSAnLi4vc2xpY2VfZ3B1JztcbmltcG9ydCB7IFNsaWNlUGFja2VkUHJvZ3JhbSB9IGZyb20gJy4uL3NsaWNlX3BhY2tlZF9ncHUnO1xuZnVuY3Rpb24gc2hhbGxvd1NsaWNlKHgsIGJlZ2luLCBzaXplLCBiYWNrZW5kKSB7XG4gICAgY29uc3QgeFRleERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KHguZGF0YUlkKTtcbiAgICBjb25zdCB0ID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhzaXplLCB4LmR0eXBlKTtcbiAgICBjb25zdCBuZXdUZXhEYXRhID0gYmFja2VuZC50ZXhEYXRhLmdldCh0LmRhdGFJZCk7XG4gICAgLy8gQ29weSB0ZXh0dXJlIGRhdGEgZnJvbSB0aGUgb3JpZ2luYWwgdGVuc29yLlxuICAgIE9iamVjdC5hc3NpZ24obmV3VGV4RGF0YSwgeFRleERhdGEpO1xuICAgIG5ld1RleERhdGEucmVmQ291bnQgPSAxO1xuICAgIG5ld1RleERhdGEuc2hhcGUgPSBzaXplO1xuICAgIG5ld1RleERhdGEuZHR5cGUgPSB4LmR0eXBlO1xuICAgIGxldCBmbGF0T2Zmc2V0ID0gc2xpY2VfdXRpbC5jb21wdXRlRmxhdE9mZnNldChiZWdpbiwgdXRpbC5jb21wdXRlU3RyaWRlcyh4LnNoYXBlKSk7XG4gICAgaWYgKHhUZXhEYXRhLnNsaWNlKSB7XG4gICAgICAgIC8vIFdlIGFyZSBzbGljaW5nIGFuIGFscmVhZHkgc2xpY2VkIHRlbnNvciwgc28gd2UgaGF2ZSB0byBhY2N1bXVsYXRlXG4gICAgICAgIC8vIHRoZSBvZmZzZXQuXG4gICAgICAgIGZsYXRPZmZzZXQgKz0geFRleERhdGEuc2xpY2UuZmxhdE9mZnNldDtcbiAgICB9XG4gICAgbmV3VGV4RGF0YS5zbGljZSA9IHtcbiAgICAgICAgZmxhdE9mZnNldCxcbiAgICAgICAgLy8gUG9pbnQgdG8gdGhlIG9yaWdpbmFsIGRhdGFJZCwgd2hpY2ggaXMgdXNlZCB0byBkbyByZWYgY291bnRpbmcuXG4gICAgICAgIG9yaWdEYXRhSWQ6IHhUZXhEYXRhLnNsaWNlICYmIHhUZXhEYXRhLnNsaWNlLm9yaWdEYXRhSWQgfHwgeC5kYXRhSWRcbiAgICB9O1xuICAgIC8vIEluY3JlYXNlIHRoZSByZWYgY291bnQgZm9yIHRoYXQgZGF0YSBidWNrZXQuXG4gICAgY29uc3QgcmVmQ291bnQgPSBiYWNrZW5kLmRhdGFSZWZDb3VudC5nZXQobmV3VGV4RGF0YS5zbGljZS5vcmlnRGF0YUlkKSB8fCAxO1xuICAgIGJhY2tlbmQuZGF0YVJlZkNvdW50LnNldChuZXdUZXhEYXRhLnNsaWNlLm9yaWdEYXRhSWQsIHJlZkNvdW50ICsgMSk7XG4gICAgcmV0dXJuIHQ7XG59XG5leHBvcnQgZnVuY3Rpb24gc2xpY2UoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGJlZ2luLCBzaXplIH0gPSBhdHRycztcbiAgICBjb25zdCBbJGJlZ2luLCAkc2l6ZV0gPSBzbGljZV91dGlsLnBhcnNlU2xpY2VQYXJhbXMoeCwgYmVnaW4sIHNpemUpO1xuICAgIHNsaWNlX3V0aWwuYXNzZXJ0UGFyYW1zVmFsaWQoeCwgJGJlZ2luLCAkc2l6ZSk7XG4gICAgaWYgKHV0aWwuc2l6ZUZyb21TaGFwZSgkc2l6ZSkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oJHNpemUsIHguZHR5cGUsIFtdKTtcbiAgICB9XG4gICAgLy8gUnVuIG9uIGNwdSBpZiBkdHlwZSBpcyBzdHJpbmcuIEZvciBzdHJpbmcsIHRoZSBiYWNrZW5kIHJlcHJlc2VudHMgaXRcbiAgICAvLyBhcyBVaW50OEFycmF5W10sIHdoZXJlIGVhY2ggVWludDhBcnJheSBpcyBhIGNoYXJhY3Rlci4gR2l2ZW4gdGhhdCB0aGVcbiAgICAvLyBjb21wdXRhdGlvbiBpcyBvbmx5IG9uIHRoZSBvdXRlciBhcnJheSwgdXBsb2FkaW5nIHRoZSB3aG9sZSBkYXRhIG9udG9cbiAgICAvLyBncHUgaXMgd2FzdGVmdWwuIEFsc28sIGN1cnJlbnRseSB3ZWJnbCBkb2Vzbid0IGhhdmUgYSBkZXNpZ24gdG9cbiAgICAvLyB1cGxvYWQgYW5kIHJldHJpZXZlIFVpbnQ4QXJyYXlbXSBiZXR3ZWVuIGNwdSBhbmQgZ3B1LiBUaGVyZWZvcmUsIHdlXG4gICAgLy8ganVzdCBydW4gdGhlIGtlcm5lbCBvbiBjcHUgaWYgZHR5cGUgaXMgc3RyaW5nLlxuICAgIGlmIChiYWNrZW5kLnNob3VsZEV4ZWN1dGVPbkNQVShbeF0pIHx8IHguZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IHhUZXhEYXRhID0gYmFja2VuZC50ZXhEYXRhLmdldCh4LmRhdGFJZCk7XG4gICAgICAgIGNvbnN0IG91dFZhbHVlcyA9IHNsaWNlSW1wbENQVSh4VGV4RGF0YS52YWx1ZXMsICRiZWdpbiwgJHNpemUsIHguc2hhcGUsIHguZHR5cGUpO1xuICAgICAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbygkc2l6ZSwgeC5kdHlwZSwgb3V0VmFsdWVzKTtcbiAgICB9XG4gICAgY29uc3QgeyBpc1BhY2tlZCB9ID0gYmFja2VuZC50ZXhEYXRhLmdldCh4LmRhdGFJZCk7XG4gICAgY29uc3QgaXNDb250aW5vdXMgPSBzbGljZV91dGlsLmlzU2xpY2VDb250aW5vdXMoeC5zaGFwZSwgJGJlZ2luLCAkc2l6ZSk7XG4gICAgaWYgKGlzUGFja2VkIHx8ICFpc0NvbnRpbm91cykge1xuICAgICAgICBjb25zdCBwcm9ncmFtID0gZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19BUlJBWV9PUEVSQVRJT05TJykgP1xuICAgICAgICAgICAgbmV3IFNsaWNlUGFja2VkUHJvZ3JhbSgkc2l6ZSkgOlxuICAgICAgICAgICAgbmV3IFNsaWNlUHJvZ3JhbSgkc2l6ZSk7XG4gICAgICAgIGNvbnN0IGN1c3RvbVZhbHVlcyA9IFskYmVnaW5dO1xuICAgICAgICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3hdLCB4LmR0eXBlLCBjdXN0b21WYWx1ZXMpO1xuICAgIH1cbiAgICBiYWNrZW5kLnVwbG9hZFRvR1BVKHguZGF0YUlkKTtcbiAgICByZXR1cm4gc2hhbGxvd1NsaWNlKHgsICRiZWdpbiwgJHNpemUsIGJhY2tlbmQpO1xufVxuZXhwb3J0IGNvbnN0IHNsaWNlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNsaWNlLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IHNsaWNlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2xpY2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBTb2Z0bWF4LCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGV4cCB9IGZyb20gJy4vRXhwJztcbmltcG9ydCB7IG1heCB9IGZyb20gJy4vTWF4JztcbmltcG9ydCB7IHJlYWxEaXYgfSBmcm9tICcuL1JlYWxEaXYnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQgeyBzdWIgfSBmcm9tICcuL1N1Yic7XG5pbXBvcnQgeyBzdW0gfSBmcm9tICcuL1N1bSc7XG5leHBvcnQgZnVuY3Rpb24gc29mdG1heChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgbG9naXRzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBkaW0gfSA9IGF0dHJzO1xuICAgIGNvbnN0IGF4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKFtkaW1dLCBsb2dpdHMuc2hhcGUpO1xuICAgIGNvbnN0IG1heExvZ2l0ID0gbWF4KHtcbiAgICAgICAgaW5wdXRzOiB7IHg6IGxvZ2l0cyB9LFxuICAgICAgICBiYWNrZW5kLFxuICAgICAgICBhdHRyczogeyByZWR1Y3Rpb25JbmRpY2VzOiBheGVzLCBrZWVwRGltczogZmFsc2UgfVxuICAgIH0pO1xuICAgIGNvbnN0IGV4cGFuZGVkU2hhcGUgPSBiYWNrZW5kX3V0aWwuZXhwYW5kU2hhcGVUb0tlZXBEaW0obWF4TG9naXQuc2hhcGUsIGF4ZXMpO1xuICAgIGNvbnN0IG1heExvZ2l0c1Jlc2hhcGVkID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiBtYXhMb2dpdCB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogZXhwYW5kZWRTaGFwZSB9IH0pO1xuICAgIGNvbnN0IGEgPSBzdWIoeyBpbnB1dHM6IHsgYTogbG9naXRzLCBiOiBtYXhMb2dpdHNSZXNoYXBlZCB9LCBiYWNrZW5kIH0pO1xuICAgIGNvbnN0IGIgPSBleHAoeyBpbnB1dHM6IHsgeDogYSB9LCBiYWNrZW5kIH0pO1xuICAgIGNvbnN0IHN1bUV4cCA9IHN1bSh7IGlucHV0czogeyB4OiBiIH0sIGJhY2tlbmQsIGF0dHJzOiB7IGF4aXM6IGF4ZXMsIGtlZXBEaW1zOiBmYWxzZSB9IH0pO1xuICAgIGNvbnN0IHN1bUV4cFJlc2hhcGVkID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiBzdW1FeHAgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IGV4cGFuZGVkU2hhcGUgfSB9KTtcbiAgICBjb25zdCByZXMgPSByZWFsRGl2KHsgaW5wdXRzOiB7IGE6IGIsIGI6IHN1bUV4cFJlc2hhcGVkIH0sIGJhY2tlbmQgfSk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhtYXhMb2dpdCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhtYXhMb2dpdHNSZXNoYXBlZCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhhKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGIpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oc3VtRXhwKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHN1bUV4cFJlc2hhcGVkKTtcbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IHNvZnRtYXhDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU29mdG1heCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBzb2Z0bWF4XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U29mdG1heC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTb2Z0cGx1cyB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmNvbnN0IFNPRlRQTFVTID0gYFxuICBmbG9hdCBlcHNpbG9uID0gMS4xOTIwOTI4OTU1MDc4MTI1ZS03O1xuICBmbG9hdCB0aHJlc2hvbGQgPSBsb2coZXBzaWxvbikgKyAyLjA7XG5cbiAgYm9vbCB0b29fbGFyZ2UgPSB4ID4gLXRocmVzaG9sZDtcbiAgYm9vbCB0b29fc21hbGwgPSB4IDwgdGhyZXNob2xkO1xuXG4gIGZsb2F0IHJlc3VsdDtcbiAgZmxvYXQgZXhwX3ggPSBleHAoeCk7XG5cbiAgaWYgKHRvb19sYXJnZSl7XG4gICAgcmVzdWx0ID0geDtcbiAgfVxuICBlbHNlIGlmICh0b29fc21hbGwpe1xuICAgIHJlc3VsdCA9IGV4cF94O1xuICB9XG4gIGVsc2V7XG4gICAgcmVzdWx0ID0gbG9nKGV4cF94ICsgMS4wKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xuYDtcbmV4cG9ydCBjb25zdCBzb2Z0cGx1cyA9IHVuYXJ5S2VybmVsRnVuYyh7IG9wU25pcHBldDogU09GVFBMVVMgfSk7XG5leHBvcnQgY29uc3Qgc29mdHBsdXNDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU29mdHBsdXMsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogc29mdHBsdXMsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U29mdHBsdXMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBTcGFjZVRvQmF0Y2hORCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBwYWRWMiB9IGZyb20gJy4vUGFkVjInO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQgeyB0cmFuc3Bvc2UgfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5leHBvcnQgY29uc3Qgc3BhY2VUb0JhdGNoTkQgPSAoYXJncykgPT4ge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGJsb2NrU2hhcGUsIHBhZGRpbmdzIH0gPSBhdHRycztcbiAgICB1dGlsLmFzc2VydCh4LnNoYXBlLmxlbmd0aCA8PSA0LCAoKSA9PiAnc3BhY2VUb0JhdGNoTkQgZm9yIHJhbmsgPiA0IHdpdGggYSBXZWJHTCBiYWNrZW5kIG5vdCAnICtcbiAgICAgICAgJ2ltcGxlbWVudGVkIHlldCcpO1xuICAgIGNvbnN0IHByb2QgPSBibG9ja1NoYXBlLnJlZHVjZSgoYSwgYikgPT4gYSAqIGIpO1xuICAgIGNvbnN0IGNvbXBsZXRlUGFkZGluZ3MgPSBbWzAsIDBdXTtcbiAgICBjb21wbGV0ZVBhZGRpbmdzLnB1c2goLi4ucGFkZGluZ3MpO1xuICAgIGZvciAobGV0IGkgPSAxICsgYmxvY2tTaGFwZS5sZW5ndGg7IGkgPCB4LnNoYXBlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbXBsZXRlUGFkZGluZ3MucHVzaChbMCwgMF0pO1xuICAgIH1cbiAgICBjb25zdCB0b0Rpc3Bvc2UgPSBbXTtcbiAgICBjb25zdCBwYWRkZWRYID0gcGFkVjIoe1xuICAgICAgICBpbnB1dHM6IHsgeCB9LFxuICAgICAgICBiYWNrZW5kLFxuICAgICAgICBhdHRyczogeyBwYWRkaW5nczogY29tcGxldGVQYWRkaW5ncywgY29uc3RhbnRWYWx1ZTogMCB9XG4gICAgfSk7XG4gICAgY29uc3QgcmVzaGFwZWRQYWRkZWRTaGFwZSA9IGJhY2tlbmRfdXRpbC5nZXRSZXNoYXBlZChwYWRkZWRYLnNoYXBlLCBibG9ja1NoYXBlLCBwcm9kLCBmYWxzZSk7XG4gICAgY29uc3QgcGVybXV0ZWRSZXNoYXBlZFBhZGRlZFBlcm11dGF0aW9uID0gYmFja2VuZF91dGlsLmdldFBlcm11dGVkKHJlc2hhcGVkUGFkZGVkU2hhcGUubGVuZ3RoLCBibG9ja1NoYXBlLmxlbmd0aCwgZmFsc2UpO1xuICAgIGNvbnN0IGZsYXR0ZW5TaGFwZSA9IGJhY2tlbmRfdXRpbC5nZXRSZXNoYXBlZFBlcm11dGVkKHBhZGRlZFguc2hhcGUsIGJsb2NrU2hhcGUsIHByb2QsIGZhbHNlKTtcbiAgICBjb25zdCByZXNoYXBlZFBhZGRlZFggPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHBhZGRlZFggfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IHJlc2hhcGVkUGFkZGVkU2hhcGUgfSB9KTtcbiAgICBjb25zdCBwYWRkZWRYVCA9IHRyYW5zcG9zZSh7XG4gICAgICAgIGlucHV0czogeyB4OiByZXNoYXBlZFBhZGRlZFggfSxcbiAgICAgICAgYmFja2VuZCxcbiAgICAgICAgYXR0cnM6IHsgcGVybTogcGVybXV0ZWRSZXNoYXBlZFBhZGRlZFBlcm11dGF0aW9uIH1cbiAgICB9KTtcbiAgICBjb25zdCByZXN1bHQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHBhZGRlZFhUIH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBmbGF0dGVuU2hhcGUgfSB9KTtcbiAgICB0b0Rpc3Bvc2UucHVzaChwYWRkZWRYKTtcbiAgICB0b0Rpc3Bvc2UucHVzaChyZXNoYXBlZFBhZGRlZFgpO1xuICAgIHRvRGlzcG9zZS5wdXNoKHBhZGRlZFhUKTtcbiAgICB0b0Rpc3Bvc2UuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuZXhwb3J0IGNvbnN0IHNwYWNlVG9CYXRjaE5EQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNwYWNlVG9CYXRjaE5ELFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IHNwYWNlVG9CYXRjaE5EXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3BhY2VUb0JhdGNoTkQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3BhcnNlRmlsbEVtcHR5Um93cyB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBzcGFyc2VGaWxsRW1wdHlSb3dzSW1wbENQVSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuZXhwb3J0IGZ1bmN0aW9uIHNwYXJzZUZpbGxFbXB0eVJvd3MoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW5kaWNlcywgdmFsdWVzLCBkZW5zZVNoYXBlLCBkZWZhdWx0VmFsdWUgfSA9IGlucHV0cztcbiAgICBpZiAoZGVuc2VTaGFwZS5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEZW5zZSBzaGFwZSBtdXN0IGJlIGEgdmVjdG9yLCBzYXc6XG4gICAgICAgICAke2RlbnNlU2hhcGUuc2hhcGV9YCk7XG4gICAgfVxuICAgIGlmIChpbmRpY2VzLnNoYXBlLmxlbmd0aCAhPT0gMikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluZGljZXMgbXVzdCBiZSBhIG1hdHJpeCwgc2F3OlxuICAgICAgICAgJHtpbmRpY2VzLnNoYXBlfWApO1xuICAgIH1cbiAgICBpZiAodmFsdWVzLnNoYXBlLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFZhbHVlcyBtdXN0IGJlIGEgdmVjdG9yLCBzYXc6XG4gICAgICAgICAke3ZhbHVlcy5zaGFwZX1gKTtcbiAgICB9XG4gICAgaWYgKGRlZmF1bHRWYWx1ZS5zaGFwZS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEZWZhdWx0IHZhbHVlIG11c3QgYmUgYSBzY2FsYXIsIHNhdzpcbiAgICAgICAgJHtkZWZhdWx0VmFsdWUuc2hhcGV9YCk7XG4gICAgfVxuICAgIGNvbnN0ICRpbmRpY2VzID0gYmFja2VuZC5yZWFkU3luYyhpbmRpY2VzLmRhdGFJZCk7XG4gICAgY29uc3QgJHZhbHVlcyA9IGJhY2tlbmQucmVhZFN5bmModmFsdWVzLmRhdGFJZCk7XG4gICAgY29uc3QgJGRlbnNlU2hhcGUgPSBiYWNrZW5kLnJlYWRTeW5jKGRlbnNlU2hhcGUuZGF0YUlkKTtcbiAgICBjb25zdCAkZGVmYXVsdFZhbHVlID0gYmFja2VuZC5yZWFkU3luYyhkZWZhdWx0VmFsdWUuZGF0YUlkKVswXTtcbiAgICBjb25zdCBbb3V0cHV0SW5kaWNlcywgb3V0cHV0SW5kaWNlc1NoYXBlLCBvdXRwdXRWYWx1ZXMsIGVtcHR5Um93SW5kaWNhdG9yLCByZXZlcnNlSW5kZXhNYXBdID0gc3BhcnNlRmlsbEVtcHR5Um93c0ltcGxDUFUoJGluZGljZXMsIGluZGljZXMuc2hhcGUsIGluZGljZXMuZHR5cGUsICR2YWx1ZXMsIHZhbHVlcy5kdHlwZSwgJGRlbnNlU2hhcGUsICRkZWZhdWx0VmFsdWUpO1xuICAgIHJldHVybiBbXG4gICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0cHV0SW5kaWNlc1NoYXBlLCBpbmRpY2VzLmR0eXBlLCBvdXRwdXRJbmRpY2VzKSxcbiAgICAgICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbb3V0cHV0SW5kaWNlc1NoYXBlWzBdXSwgdmFsdWVzLmR0eXBlLCBvdXRwdXRWYWx1ZXMpLFxuICAgICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtlbXB0eVJvd0luZGljYXRvci5sZW5ndGhdLCAnYm9vbCcsIG5ldyBVaW50OEFycmF5KGVtcHR5Um93SW5kaWNhdG9yLm1hcCgodmFsdWUpID0+IE51bWJlcih2YWx1ZSkpKSksXG4gICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW3JldmVyc2VJbmRleE1hcC5sZW5ndGhdLCBpbmRpY2VzLmR0eXBlLCBuZXcgSW50MzJBcnJheShyZXZlcnNlSW5kZXhNYXApKSxcbiAgICBdO1xufVxuZXhwb3J0IGNvbnN0IHNwYXJzZUZpbGxFbXB0eVJvd3NDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU3BhcnNlRmlsbEVtcHR5Um93cyxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBzcGFyc2VGaWxsRW1wdHlSb3dzLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNwYXJzZUZpbGxFbXB0eVJvd3MuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3BhcnNlUmVzaGFwZSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBzcGFyc2VSZXNoYXBlSW1wbENQVSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuZXhwb3J0IGZ1bmN0aW9uIHNwYXJzZVJlc2hhcGUoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW5wdXRJbmRpY2VzLCBpbnB1dFNoYXBlLCBuZXdTaGFwZSB9ID0gaW5wdXRzO1xuICAgIGlmIChpbnB1dEluZGljZXMuc2hhcGUubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW5wdXQgaW5kaWNlcyBzaG91bGQgYmUgYSBtYXRyaXggYnV0IHJlY2VpdmVkIHNoYXBlICR7aW5wdXRJbmRpY2VzLnNoYXBlfWApO1xuICAgIH1cbiAgICBpZiAoaW5wdXRTaGFwZS5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnB1dCBzaGFwZSBzaG91bGQgYmUgYSB2ZWN0b3IgYnV0IHJlY2VpdmVkIHNoYXBlICR7aW5wdXRTaGFwZS5zaGFwZX1gKTtcbiAgICB9XG4gICAgaWYgKG5ld1NoYXBlLnNoYXBlLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRhcmdldCBzaGFwZSBzaG91bGQgYmUgYSB2ZWN0b3IgYnV0IHJlY2VpdmVkIHNoYXBlICR7bmV3U2hhcGUuc2hhcGV9YCk7XG4gICAgfVxuICAgIGNvbnN0ICRpbnB1dFNoYXBlID0gQXJyYXkuZnJvbShiYWNrZW5kLnJlYWRTeW5jKGlucHV0U2hhcGUuZGF0YUlkKSk7XG4gICAgY29uc3QgJGlucHV0SW5kaWNlcyA9IGJhY2tlbmQucmVhZFN5bmMoaW5wdXRJbmRpY2VzLmRhdGFJZCk7XG4gICAgY29uc3QgdGFyZ2V0U2hhcGUgPSBBcnJheS5mcm9tKGJhY2tlbmQucmVhZFN5bmMobmV3U2hhcGUuZGF0YUlkKSk7XG4gICAgY29uc3QgW25ld0luZGljZXMsIGluZGljZXNTaGFwZSwgb3V0cHV0U2hhcGVdID0gc3BhcnNlUmVzaGFwZUltcGxDUFUoJGlucHV0SW5kaWNlcywgaW5wdXRJbmRpY2VzLnNoYXBlLCBpbnB1dEluZGljZXMuZHR5cGUsICRpbnB1dFNoYXBlLCB0YXJnZXRTaGFwZSk7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhpbmRpY2VzU2hhcGUsIGlucHV0SW5kaWNlcy5kdHlwZSwgbmV3SW5kaWNlcyksXG4gICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW291dHB1dFNoYXBlLmxlbmd0aF0sIG5ld1NoYXBlLmR0eXBlLCBuZXcgSW50MzJBcnJheShvdXRwdXRTaGFwZSkpLFxuICAgIF07XG59XG5leHBvcnQgY29uc3Qgc3BhcnNlUmVzaGFwZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTcGFyc2VSZXNoYXBlLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IHNwYXJzZVJlc2hhcGUsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3BhcnNlUmVzaGFwZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTcGFyc2VTZWdtZW50TWVhbiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBzcGFyc2VTZWdtZW50UmVkdWN0aW9uSW1wbENQVSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuZXhwb3J0IGZ1bmN0aW9uIHNwYXJzZVNlZ21lbnRNZWFuKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IGRhdGEsIGluZGljZXMsIHNlZ21lbnRJZHMgfSA9IGlucHV0cztcbiAgICBpZiAoZGF0YS5zaGFwZS5sZW5ndGggPCAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRGF0YSBzaG91bGQgYmUgYXQgbGVhc3QgMSBkaW1lbnNpb25hbCBidXQgcmVjZWl2ZWQgc2NhbGFyYCk7XG4gICAgfVxuICAgIGlmIChpbmRpY2VzLnNoYXBlLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluZGljZXMgc2hvdWxkIGJlIGEgdmVjdG9yIGJ1dCByZWNlaXZlZCBzaGFwZVxuICAgICAgICAgICAgICAke2luZGljZXMuc2hhcGV9YCk7XG4gICAgfVxuICAgIGlmIChzZWdtZW50SWRzLnNoYXBlLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNlZ21lbnQgaWRzIHNob3VsZCBiZSBhIHZlY3RvciBidXQgcmVjZWl2ZWQgc2hhcGVcbiAgICAgICAgICAgICAgJHtzZWdtZW50SWRzLnNoYXBlfWApO1xuICAgIH1cbiAgICBjb25zdCAkZGF0YSA9IGJhY2tlbmQucmVhZFN5bmMoZGF0YS5kYXRhSWQpO1xuICAgIGNvbnN0ICRpbmRpY2VzID0gYmFja2VuZC5yZWFkU3luYyhpbmRpY2VzLmRhdGFJZCk7XG4gICAgY29uc3QgJHNlZ21lbnRJZHMgPSBiYWNrZW5kLnJlYWRTeW5jKHNlZ21lbnRJZHMuZGF0YUlkKTtcbiAgICBjb25zdCBbb3V0cHV0RGF0YSwgb3V0cHV0RGF0YVNoYXBlXSA9IHNwYXJzZVNlZ21lbnRSZWR1Y3Rpb25JbXBsQ1BVKCRkYXRhLCBkYXRhLnNoYXBlLCBkYXRhLmR0eXBlLCAkaW5kaWNlcywgJHNlZ21lbnRJZHMsIHRydWUpO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dHB1dERhdGFTaGFwZSwgZGF0YS5kdHlwZSwgb3V0cHV0RGF0YSk7XG59XG5leHBvcnQgY29uc3Qgc3BhcnNlU2VnbWVudE1lYW5Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU3BhcnNlU2VnbWVudE1lYW4sXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogc3BhcnNlU2VnbWVudE1lYW4sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3BhcnNlU2VnbWVudE1lYW4uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3BhcnNlU2VnbWVudFN1bSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBzcGFyc2VTZWdtZW50UmVkdWN0aW9uSW1wbENQVSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuZXhwb3J0IGZ1bmN0aW9uIHNwYXJzZVNlZ21lbnRTdW0oYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgZGF0YSwgaW5kaWNlcywgc2VnbWVudElkcyB9ID0gaW5wdXRzO1xuICAgIGlmIChkYXRhLnNoYXBlLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEYXRhIHNob3VsZCBiZSBhdCBsZWFzdCAxIGRpbWVuc2lvbmFsIGJ1dCByZWNlaXZlZCBzY2FsYXJgKTtcbiAgICB9XG4gICAgaWYgKGluZGljZXMuc2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW5kaWNlcyBzaG91bGQgYmUgYSB2ZWN0b3IgYnV0IHJlY2VpdmVkIHNoYXBlXG4gICAgICAgICAgICAgJHtpbmRpY2VzLnNoYXBlfWApO1xuICAgIH1cbiAgICBpZiAoc2VnbWVudElkcy5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZWdtZW50IGlkcyBzaG91bGQgYmUgYSB2ZWN0b3IgYnV0IHJlY2VpdmVkIHNoYXBlXG4gICAgICAgICAgICAgJHtzZWdtZW50SWRzLnNoYXBlfWApO1xuICAgIH1cbiAgICBjb25zdCAkZGF0YSA9IGJhY2tlbmQucmVhZFN5bmMoZGF0YS5kYXRhSWQpO1xuICAgIGNvbnN0ICRpbmRpY2VzID0gYmFja2VuZC5yZWFkU3luYyhpbmRpY2VzLmRhdGFJZCk7XG4gICAgY29uc3QgJHNlZ21lbnRJZHMgPSBiYWNrZW5kLnJlYWRTeW5jKHNlZ21lbnRJZHMuZGF0YUlkKTtcbiAgICBjb25zdCBbb3V0cHV0RGF0YSwgb3V0cHV0RGF0YVNoYXBlXSA9IHNwYXJzZVNlZ21lbnRSZWR1Y3Rpb25JbXBsQ1BVKCRkYXRhLCBkYXRhLnNoYXBlLCBkYXRhLmR0eXBlLCAkaW5kaWNlcywgJHNlZ21lbnRJZHMpO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dHB1dERhdGFTaGFwZSwgZGF0YS5kdHlwZSwgb3V0cHV0RGF0YSk7XG59XG5leHBvcnQgY29uc3Qgc3BhcnNlU2VnbWVudFN1bUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTcGFyc2VTZWdtZW50U3VtLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IHNwYXJzZVNlZ21lbnRTdW0sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3BhcnNlU2VnbWVudFN1bS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIFNwYXJzZVRvRGVuc2UgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgU2NhdHRlclByb2dyYW0gfSBmcm9tICcuLi9zY2F0dGVyX2dwdSc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmV4cG9ydCBmdW5jdGlvbiBzcGFyc2VUb0RlbnNlKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBzcGFyc2VJbmRpY2VzLCBzcGFyc2VWYWx1ZXMsIGRlZmF1bHRWYWx1ZSB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgb3V0cHV0U2hhcGUgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHsgc2xpY2VSYW5rLCBudW1VcGRhdGVzLCBzdHJpZGVzLCBvdXRwdXRTaXplIH0gPSBiYWNrZW5kX3V0aWwuY2FsY3VsYXRlU2hhcGVzKHNwYXJzZVZhbHVlcywgc3BhcnNlSW5kaWNlcywgb3V0cHV0U2hhcGUpO1xuICAgIGNvbnN0IHN1bUR1cGVJbmRpY2VzID0gZmFsc2U7XG4gICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBTY2F0dGVyUHJvZ3JhbShudW1VcGRhdGVzLCBzbGljZVJhbmssIHNwYXJzZUluZGljZXMuc2hhcGUubGVuZ3RoLCBzcGFyc2VWYWx1ZXMuc2hhcGUubGVuZ3RoLCBzdHJpZGVzLCBbb3V0cHV0U2l6ZSwgMV0sIHN1bUR1cGVJbmRpY2VzKTtcbiAgICBjb25zdCByZXMgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbc3BhcnNlVmFsdWVzLCBzcGFyc2VJbmRpY2VzLCBkZWZhdWx0VmFsdWVdLCBzcGFyc2VWYWx1ZXMuZHR5cGUpO1xuICAgIGNvbnN0IHJlc2hhcGVkID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiByZXMgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IG91dHB1dFNoYXBlIH0gfSk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXMpO1xuICAgIHJldHVybiByZXNoYXBlZDtcbn1cbmV4cG9ydCBjb25zdCBzcGFyc2VUb0RlbnNlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNwYXJzZVRvRGVuc2UsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogc3BhcnNlVG9EZW5zZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNwYXJzZVRvRGVuc2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBTcGxpdFYsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgc2xpY2UgfSBmcm9tICcuL1NsaWNlJztcbmV4cG9ydCBmdW5jdGlvbiBzcGxpdFYoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IG51bU9yU2l6ZVNwbGl0cywgYXhpcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgJGF4aXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpWzBdO1xuICAgIGNvbnN0IHNwbGl0U2l6ZXMgPSBiYWNrZW5kX3V0aWwucHJlcGFyZVNwbGl0U2l6ZSh4LCBudW1PclNpemVTcGxpdHMsICRheGlzKTtcbiAgICBjb25zdCB4UmFuayA9IHguc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IGJlZ2luID0gbmV3IEFycmF5KHhSYW5rKS5maWxsKDApO1xuICAgIGNvbnN0IHNpemUgPSB4LnNoYXBlLnNsaWNlKCk7XG4gICAgcmV0dXJuIHNwbGl0U2l6ZXMubWFwKHMgPT4ge1xuICAgICAgICBjb25zdCBzbGljZVNpemUgPSBbLi4uc2l6ZV07XG4gICAgICAgIHNsaWNlU2l6ZVskYXhpc10gPSBzO1xuICAgICAgICBjb25zdCBzbGljZVQgPSBzbGljZSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQsIGF0dHJzOiB7IGJlZ2luLCBzaXplOiBzbGljZVNpemUgfSB9KTtcbiAgICAgICAgYmVnaW5bJGF4aXNdICs9IHM7XG4gICAgICAgIHJldHVybiBzbGljZVQ7XG4gICAgfSk7XG59XG5leHBvcnQgY29uc3Qgc3BsaXRWQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNwbGl0VixcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBzcGxpdFZcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TcGxpdFYuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3FydCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmNvbnN0IFNRUlQgPSBgcmV0dXJuIHNxcnQoeCk7YDtcbmV4cG9ydCBjb25zdCBzcXJ0ID0gdW5hcnlLZXJuZWxGdW5jKHsgb3BTbmlwcGV0OiBTUVJUIH0pO1xuZXhwb3J0IGNvbnN0IHNxcnRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU3FydCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBzcXJ0XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3FydC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTcXVhcmUgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5jb25zdCBTUVVBUkUgPSBgcmV0dXJuIHggKiB4O2A7XG5leHBvcnQgY29uc3Qgc3F1YXJlID0gdW5hcnlLZXJuZWxGdW5jKHsgb3BTbmlwcGV0OiBTUVVBUkUgfSk7XG5leHBvcnQgY29uc3Qgc3F1YXJlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNxdWFyZSxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBzcXVhcmUsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3F1YXJlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFNxdWFyZWREaWZmZXJlbmNlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmNvbnN0IFNRVUFSRURfRElGRkVSRU5DRSA9ICdyZXR1cm4gKGEgLSBiKSAqIChhIC0gYik7JztcbmV4cG9ydCBjb25zdCBzcXVhcmVkRGlmZmVyZW5jZSA9IGJpbmFyeUtlcm5lbEZ1bmMoeyBvcFNuaXBwZXQ6IFNRVUFSRURfRElGRkVSRU5DRSwgcGFja2VkT3BTbmlwcGV0OiBTUVVBUkVEX0RJRkZFUkVOQ0UgfSk7XG5leHBvcnQgY29uc3Qgc3F1YXJlZERpZmZlcmVuY2VDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU3F1YXJlZERpZmZlcmVuY2UsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogc3F1YXJlZERpZmZlcmVuY2UsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3F1YXJlZERpZmZlcmVuY2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3RlcCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBDSEVDS19OQU5fU05JUFBFVCwgVW5hcnlPcFByb2dyYW0gfSBmcm9tICcuLi91bmFyeW9wX2dwdSc7XG5leHBvcnQgZnVuY3Rpb24gc3RlcCh7IGlucHV0cywgYXR0cnMsIGJhY2tlbmQgfSkge1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IG9wU25pcHBldCA9IENIRUNLX05BTl9TTklQUEVUICsgYFxuICAgIHJldHVybiB4ID4gMC4wID8gMS4wIDogZmxvYXQoJHthdHRycy5hbHBoYX0pO1xuICBgO1xuICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgVW5hcnlPcFByb2dyYW0oeC5zaGFwZSwgb3BTbmlwcGV0KTtcbiAgICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3hdLCB4LmR0eXBlKTtcbn1cbmV4cG9ydCBjb25zdCBzdGVwQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFN0ZXAsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogc3RlcCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdGVwLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJ1ZmZlciwgc2xpY2VfdXRpbCwgU3RyaWRlZFNsaWNlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHN0cmlkZWRTbGljZUltcGxDUFUgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmltcG9ydCB7IFN0cmlkZWRTbGljZVByb2dyYW0gfSBmcm9tICcuLi9zdHJpZGVkX3NsaWNlX2dwdSc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7IHNsaWNlIH0gZnJvbSAnLi9TbGljZSc7XG5leHBvcnQgZnVuY3Rpb24gc3RyaWRlZFNsaWNlKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBiZWdpbiwgZW5kLCBzdHJpZGVzLCBiZWdpbk1hc2ssIGVuZE1hc2ssIGVsbGlwc2lzTWFzaywgbmV3QXhpc01hc2ssIHNocmlua0F4aXNNYXNrIH0gPSBhdHRycztcbiAgICBjb25zdCB7IG5vblN0cmlkZWQsICRiZWdpbiwgJHN0cmlkZXMsIHNpemUsIG5ld1NoYXBlLCBvdXRTaGFwZSB9ID0gc2xpY2VfdXRpbC5zbGljZUluZm8oeC5zaGFwZSwgYmVnaW4sIGVuZCwgc3RyaWRlcywgYmVnaW5NYXNrLCBlbmRNYXNrLCBlbGxpcHNpc01hc2ssIG5ld0F4aXNNYXNrLCBzaHJpbmtBeGlzTWFzayk7XG4gICAgY29uc3QgJHggPSByZXNoYXBlKHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IG5ld1NoYXBlIH0gfSk7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBpZiAobm9uU3RyaWRlZCkge1xuICAgICAgICBjb25zdCBzbGljZWQgPSBzbGljZSh7IGlucHV0czogeyB4OiAkeCB9LCBiYWNrZW5kLCBhdHRyczogeyBiZWdpbjogJGJlZ2luLCBzaXplIH0gfSk7XG4gICAgICAgIHJlc3VsdCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogc2xpY2VkIH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBvdXRTaGFwZSB9IH0pO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHNsaWNlZCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKG91dFNoYXBlLnNvbWUoYXhpcyA9PiBheGlzID09PSAwKSkge1xuICAgICAgICByZXN1bHQgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dFNoYXBlLCB4LmR0eXBlLCBbXSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBzaG91bGRFeGVjdXRlT25DUFUgPSBiYWNrZW5kLnNob3VsZEV4ZWN1dGVPbkNQVShbJHhdKTtcbiAgICAgICAgaWYgKHNob3VsZEV4ZWN1dGVPbkNQVSkge1xuICAgICAgICAgICAgY29uc3QgeFRleERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KCR4LmRhdGFJZCk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSB4VGV4RGF0YS52YWx1ZXM7XG4gICAgICAgICAgICBjb25zdCB4QnVmID0gYnVmZmVyKCR4LnNoYXBlLCAkeC5kdHlwZSwgdmFsdWVzKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdFZhbHVlcyA9IHN0cmlkZWRTbGljZUltcGxDUFUob3V0U2hhcGUsIHhCdWYsICRzdHJpZGVzLCAkYmVnaW4pO1xuICAgICAgICAgICAgcmVzdWx0ID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRTaGFwZSwgJHguZHR5cGUsIHJlc3VsdFZhbHVlcy52YWx1ZXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBTdHJpZGVkU2xpY2VQcm9ncmFtKCRiZWdpbiwgJHN0cmlkZXMsIG91dFNoYXBlKTtcbiAgICAgICAgICAgIHJlc3VsdCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFskeF0sICR4LmR0eXBlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXN1bHRSZXNoYXBlZCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogcmVzdWx0IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBvdXRTaGFwZSB9IH0pO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oJHgpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0UmVzaGFwZWQ7XG59XG5leHBvcnQgY29uc3Qgc3RyaWRlZFNsaWNlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFN0cmlkZWRTbGljZSxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBzdHJpZGVkU2xpY2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdHJpZGVkU2xpY2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3RyaW5nTkdyYW1zIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHN0cmluZ05HcmFtc0ltcGxDUFUgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdOR3JhbXMoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHNlcGFyYXRvciwgbkdyYW1XaWR0aHMsIGxlZnRQYWQsIHJpZ2h0UGFkLCBwYWRXaWR0aCwgcHJlc2VydmVTaG9ydFNlcXVlbmNlcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgeyBkYXRhLCBkYXRhU3BsaXRzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgJGRhdGEgPSBiYWNrZW5kLnJlYWRTeW5jKGRhdGEuZGF0YUlkKTtcbiAgICBjb25zdCAkZGF0YVNwbGl0cyA9IGJhY2tlbmQucmVhZFN5bmMoZGF0YVNwbGl0cy5kYXRhSWQpO1xuICAgIGNvbnN0IFtuR3JhbXMsIG5HcmFtc1NwbGl0c10gPSBzdHJpbmdOR3JhbXNJbXBsQ1BVKCRkYXRhLCAkZGF0YVNwbGl0cywgc2VwYXJhdG9yLCBuR3JhbVdpZHRocywgbGVmdFBhZCwgcmlnaHRQYWQsIHBhZFdpZHRoLCBwcmVzZXJ2ZVNob3J0U2VxdWVuY2VzKTtcbiAgICByZXR1cm4gW1xuICAgICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtuR3JhbXMubGVuZ3RoXSwgJ3N0cmluZycsIG5HcmFtcyksXG4gICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oZGF0YVNwbGl0cy5zaGFwZSwgJ2ludDMyJywgbkdyYW1zU3BsaXRzKSxcbiAgICBdO1xufVxuZXhwb3J0IGNvbnN0IHN0cmluZ05HcmFtc0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTdHJpbmdOR3JhbXMsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogc3RyaW5nTkdyYW1zLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN0cmluZ05HcmFtcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTdHJpbmdTcGxpdCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBzdHJpbmdTcGxpdEltcGxDUFUgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdTcGxpdChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgc2tpcEVtcHR5IH0gPSBhdHRycztcbiAgICBjb25zdCB7IGlucHV0LCBkZWxpbWl0ZXIgfSA9IGlucHV0cztcbiAgICBpZiAoaW5wdXQuZHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW5wdXQgbXVzdCBiZSBvZiBkYXRhdHlwZSBzdHJpbmcnKTtcbiAgICB9XG4gICAgaWYgKGlucHV0LnNoYXBlLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYElucHV0IG11c3QgYmUgYSB2ZWN0b3IsIGdvdCBzaGFwZTogJHtpbnB1dC5zaGFwZX1gKTtcbiAgICB9XG4gICAgaWYgKGRlbGltaXRlci5zaGFwZS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEZWxpbWl0ZXIgbXVzdCBiZSBhIHNjYWxhciwgZ290IHNoYXBlOiAke2RlbGltaXRlci5zaGFwZX1gKTtcbiAgICB9XG4gICAgY29uc3QgJGlucHV0ID0gYmFja2VuZC5yZWFkU3luYyhpbnB1dC5kYXRhSWQpO1xuICAgIGNvbnN0ICRkZWxpbWl0ZXIgPSBiYWNrZW5kLnJlYWRTeW5jKGRlbGltaXRlci5kYXRhSWQpWzBdO1xuICAgIGNvbnN0IFtpbmRpY2VzLCB2YWx1ZXMsIHNoYXBlXSA9IHN0cmluZ1NwbGl0SW1wbENQVSgkaW5wdXQsICRkZWxpbWl0ZXIsIHNraXBFbXB0eSk7XG4gICAgY29uc3Qgb3V0cHV0U2l6ZSA9IHZhbHVlcy5sZW5ndGg7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbb3V0cHV0U2l6ZSwgMl0sICdpbnQzMicsIGluZGljZXMpLFxuICAgICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtvdXRwdXRTaXplXSwgJ3N0cmluZycsIHZhbHVlcyksXG4gICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oWzJdLCAnaW50MzInLCBuZXcgSW50MzJBcnJheShzaGFwZSkpXG4gICAgXTtcbn1cbmV4cG9ydCBjb25zdCBzdHJpbmdTcGxpdENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTdHJpbmdTcGxpdCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBzdHJpbmdTcGxpdCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdHJpbmdTcGxpdC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTdHJpbmdUb0hhc2hCdWNrZXRGYXN0IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RJbXBsQ1BVIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nVG9IYXNoQnVja2V0RmFzdChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgbnVtQnVja2V0cyB9ID0gYXR0cnM7XG4gICAgY29uc3QgeyBpbnB1dCB9ID0gaW5wdXRzO1xuICAgIGlmIChpbnB1dC5kdHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnB1dCBtdXN0IGJlIG9mIGRhdGF0eXBlIHN0cmluZycpO1xuICAgIH1cbiAgICBpZiAobnVtQnVja2V0cyA8PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTnVtYmVyIG9mIGJ1Y2tldHMgbXVzdCBiZSBhdCBsZWFzdCAxYCk7XG4gICAgfVxuICAgIGNvbnN0ICRpbnB1dCA9IGJhY2tlbmQucmVhZFN5bmMoaW5wdXQuZGF0YUlkKTtcbiAgICBjb25zdCBvdXRwdXQgPSBzdHJpbmdUb0hhc2hCdWNrZXRGYXN0SW1wbENQVSgkaW5wdXQsIG51bUJ1Y2tldHMpO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGlucHV0LnNoYXBlLCAnaW50MzInLCBvdXRwdXQpO1xufVxuZXhwb3J0IGNvbnN0IHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU3RyaW5nVG9IYXNoQnVja2V0RmFzdCxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBzdHJpbmdUb0hhc2hCdWNrZXRGYXN0LFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN0cmluZ1RvSGFzaEJ1Y2tldEZhc3QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3ViIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7IHN1YkltcGxDUFUgYXMgY3B1U3ViIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5jb25zdCBTVUIgPSAncmV0dXJuIGEgLSBiOyc7XG5leHBvcnQgY29uc3Qgc3ViID0gYmluYXJ5S2VybmVsRnVuYyh7XG4gICAgb3BTbmlwcGV0OiBTVUIsXG4gICAgcGFja2VkT3BTbmlwcGV0OiBTVUIsXG4gICAgc3VwcG9ydHNDb21wbGV4OiB0cnVlLFxuICAgIGNwdUtlcm5lbEltcGw6IGNwdVN1YlxufSk7XG5leHBvcnQgY29uc3Qgc3ViQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFN1YixcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBzdWJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdWIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3VtIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHN1bUltcGwgfSBmcm9tICcuL1N1bV9pbXBsJztcbmV4cG9ydCBmdW5jdGlvbiBzdW0oYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGF4aXMsIGtlZXBEaW1zIH0gPSBhdHRycztcbiAgICByZXR1cm4gc3VtSW1wbCh4LCBheGlzLCBrZWVwRGltcywgYmFja2VuZCk7XG59XG5leHBvcnQgY29uc3Qgc3VtQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFN1bSxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiBzdW1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdW0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBzdW1PdXRUeXBlLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHJlZHVjZSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9yZWR1Y2UnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQgeyB0cmFuc3Bvc2VJbXBsIH0gZnJvbSAnLi9UcmFuc3Bvc2VfaW1wbCc7XG5leHBvcnQgZnVuY3Rpb24gc3VtSW1wbCh4LCBheGlzLCBrZWVwRGltcywgYmFja2VuZCkge1xuICAgIGNvbnN0IHJlZHVjdGlvbkluZGljZXMgPSBheGlzO1xuICAgIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3Qgb3JpZ0F4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKHJlZHVjdGlvbkluZGljZXMsIHguc2hhcGUpO1xuICAgIGxldCBheGVzID0gb3JpZ0F4ZXM7XG4gICAgY29uc3QgcGVybXV0ZWRBeGVzID0gYmFja2VuZF91dGlsLmdldEF4ZXNQZXJtdXRhdGlvbihheGVzLCB4UmFuayk7XG4gICAgY29uc3Qgc3VtSW5wdXRJc1RyYW5zcG9zZWQgPSBwZXJtdXRlZEF4ZXMgIT0gbnVsbDtcbiAgICBsZXQgc3VtSW5wdXQgPSB4O1xuICAgIGlmIChzdW1JbnB1dElzVHJhbnNwb3NlZCkge1xuICAgICAgICBzdW1JbnB1dCA9IHRyYW5zcG9zZUltcGwoeCwgcGVybXV0ZWRBeGVzLCBiYWNrZW5kKTtcbiAgICAgICAgYXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRJbm5lck1vc3RBeGVzKGF4ZXMubGVuZ3RoLCB4UmFuayk7XG4gICAgfVxuICAgIGJhY2tlbmRfdXRpbC5hc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcygnc3VtJywgYXhlcywgeFJhbmspO1xuICAgIGNvbnN0IFtzdW1PdXRTaGFwZSwgcmVkdWNlU2hhcGVdID0gYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMoc3VtSW5wdXQuc2hhcGUsIGF4ZXMpO1xuICAgIGxldCBvdXRTaGFwZSA9IHN1bU91dFNoYXBlO1xuICAgIGlmIChrZWVwRGltcykge1xuICAgICAgICAvLyByYXRoZXIgdGhhbiByZXNoYXBlIGF0IHRoZSBlbmQsIHNldCB0aGUgdGFyZ2V0IHNoYXBlIGhlcmUuXG4gICAgICAgIG91dFNoYXBlID0gYmFja2VuZF91dGlsLmV4cGFuZFNoYXBlVG9LZWVwRGltKHN1bU91dFNoYXBlLCBvcmlnQXhlcyk7XG4gICAgfVxuICAgIGNvbnN0IGluU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShyZWR1Y2VTaGFwZSk7XG4gICAgY29uc3QgeFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoeC5zaGFwZSk7XG4gICAgY29uc3QgYmF0Y2hTaXplID0geFNpemUgLyBpblNpemU7XG4gICAgY29uc3QgcmVzaGFwZWRJbnB1dCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogc3VtSW5wdXQgfSwgYXR0cnM6IHsgc2hhcGU6IFtiYXRjaFNpemUsIGluU2l6ZV0gfSwgYmFja2VuZCB9KTtcbiAgICBjb25zdCBvdXRUeXBlID0gc3VtT3V0VHlwZSh4LmR0eXBlKTtcbiAgICBjb25zdCByZWR1Y2VkID0gcmVkdWNlKHJlc2hhcGVkSW5wdXQsIG91dFR5cGUsICdzdW0nLCBiYWNrZW5kKTtcbiAgICBjb25zdCBvdXQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHJlZHVjZWQgfSwgYXR0cnM6IHsgc2hhcGU6IG91dFNoYXBlIH0sIGJhY2tlbmQgfSk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXNoYXBlZElucHV0KTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlZHVjZWQpO1xuICAgIGlmIChzdW1JbnB1dElzVHJhbnNwb3NlZCkge1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHN1bUlucHV0KTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN1bV9pbXBsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFRhbiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmNvbnN0IFRBTiA9IGByZXR1cm4gdGFuKHgpO2A7XG5leHBvcnQgY29uc3QgdGFuID0gdW5hcnlLZXJuZWxGdW5jKHsgb3BTbmlwcGV0OiBUQU4gfSk7XG5leHBvcnQgY29uc3QgdGFuQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFRhbixcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiB0YW4sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VGFuLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFRhbmggfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5jb25zdCBUQU5IID0gYFxuICBmbG9hdCBlMnggPSBleHAoLTIuMCAqIGFicyh4KSk7XG4gIHJldHVybiBzaWduKHgpICogKDEuMCAtIGUyeCkgLyAoMS4wICsgZTJ4KTtcbmA7XG5leHBvcnQgY29uc3QgdGFuaCA9IHVuYXJ5S2VybmVsRnVuYyh7IG9wU25pcHBldDogVEFOSCB9KTtcbmV4cG9ydCBjb25zdCB0YW5oQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFRhbmgsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogdGFuaCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1UYW5oLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJ1ZmZlciwgVGlsZSwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB0aWxlSW1wbENQVSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuaW1wb3J0IHsgVGlsZVByb2dyYW0gfSBmcm9tICcuLi90aWxlX2dwdSc7XG5leHBvcnQgZnVuY3Rpb24gdGlsZShwYXJhbXMpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IHBhcmFtcztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHJlcHMgfSA9IGF0dHJzO1xuICAgIC8vIHRpbGUgZ3B1IHByb2dyYW0gY2Fubm90IGhhbmRsZSByYW5rID4gNSBjYXNlLlxuICAgIGlmICh4LmR0eXBlID09PSAnc3RyaW5nJyB8fCB4LnNoYXBlLmxlbmd0aCA+IDUpIHtcbiAgICAgICAgLy8gRXZlbiB0aG91Z2h0IHN0cmluZyB0ZW5zb3IgaXMgYWx3YXlzIG9uIENQVSwganVzdCB0byBiZSBjb25zaXN0ZW50IG9uIGhvd1xuICAgICAgICAvLyB0byBhY2Nlc3MgdGVuc29yIGRhdGEuXG4gICAgICAgIGNvbnN0IGRhdGEgPSBiYWNrZW5kLnJlYWRTeW5jKHguZGF0YUlkKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB4LmR0eXBlID09PSAnc3RyaW5nJyA/XG4gICAgICAgICAgICBkYXRhLm1hcChkID0+IHV0aWwuZGVjb2RlU3RyaW5nKGQpKSA6XG4gICAgICAgICAgICBkYXRhO1xuICAgICAgICBjb25zdCBidWYgPSBidWZmZXIoeC5zaGFwZSwgeC5kdHlwZSwgdmFsdWUpO1xuICAgICAgICBjb25zdCBvdXRCdWYgPSB0aWxlSW1wbENQVShidWYsIHJlcHMpO1xuICAgICAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRCdWYuc2hhcGUsIG91dEJ1Zi5kdHlwZSwgb3V0QnVmLnZhbHVlcyk7XG4gICAgfVxuICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgVGlsZVByb2dyYW0oeC5zaGFwZSwgcmVwcyk7XG4gICAgY29uc3Qgb3V0cHV0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3hdLCB4LmR0eXBlKTtcbiAgICByZXR1cm4gb3V0cHV0O1xufVxuZXhwb3J0IGNvbnN0IHRpbGVDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogVGlsZSxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiB0aWxlLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRpbGUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZW52LCBUb3BLLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHRvcEtJbXBsQ1BVIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5pbXBvcnQgeyBNZXJnZVByb2dyYW0sIFN3YXBQcm9ncmFtIH0gZnJvbSAnLi4vdG9wX2tfZ3B1JztcbmltcG9ydCB7IGZpbGwgfSBmcm9tICcuL0ZpbGwnO1xuaW1wb3J0IHsgZ2F0aGVyVjIgfSBmcm9tICcuL0dhdGhlclYyJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHsgc2xpY2UgfSBmcm9tICcuL1NsaWNlJztcbmZ1bmN0aW9uIGRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvT3JOdWxsKGJhY2tlbmQsIHRlbnNvckluZm8pIHtcbiAgICBpZiAodGVuc29ySW5mbyAhPT0gbnVsbCkge1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHRlbnNvckluZm8pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJvdW5kVXBUb1BvdzIobnVtKSB7XG4gICAgbGV0IHBvdzIgPSAxO1xuICAgIHdoaWxlIChwb3cyIDwgbnVtKSB7XG4gICAgICAgIHBvdzIgKj0gMjtcbiAgICB9XG4gICAgcmV0dXJuIHBvdzI7XG59XG4vLyBCYXNlZCBvbiBBbGdvcml0aG0gMiBvZiBCaXRvbmljIFRvcCBLLCByZWY6XG4vLyBodHRwczovL2FuaWxzaGFuYmhhZy5pbi9zdGF0aWMvcGFwZXJzL2dwdXRvcGtfc2lnbW9kMTgucGRmXG5leHBvcnQgZnVuY3Rpb24gdG9wSyhhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgaywgc29ydGVkIH0gPSBhdHRycztcbiAgICAvLyBFbXBpcmljYWxseSBkZXRlcm1pbmVkIGNvbnN0YW50IHVzZWQgdG8gZGV0ZXJtaW5lIGxhc3QgZGltIHRocmVzaG9sZCBmb3JcbiAgICAvLyBoYW5kaW5nIG9mZiBleGVjdXRpb24gdG8gdGhlIENQVS5cbiAgICBjb25zdCBUT1BLX0xBU1RfRElNX0NQVV9IQU5ET0ZGX1NJWkVfVEhSRVNIT0xEID0gZW52KCkuZ2V0TnVtYmVyKCdUT1BLX0xBU1RfRElNX0NQVV9IQU5ET0ZGX1NJWkVfVEhSRVNIT0xEJyk7XG4gICAgLy8gRW1waXJpY2FsbHkgZGV0ZXJtaW5lZCBjb25zdGFudCB1c2VkIHRvIGRldGVybWluZSBrIHRocmVzaG9sZCBmb3IgaGFuZGluZ1xuICAgIC8vIG9mZiBleGVjdXRpb24gdG8gdGhlIENQVS5cbiAgICBjb25zdCBUT1BLX0tfQ1BVX0hBTkRPRkZfVEhSRVNIT0xEID0gZW52KCkuZ2V0TnVtYmVyKCdUT1BLX0tfQ1BVX0hBTkRPRkZfVEhSRVNIT0xEJyk7XG4gICAgY29uc3QgeFNoYXBlID0geC5zaGFwZTtcbiAgICBjb25zdCBsYXN0RGltID0geFNoYXBlW3hTaGFwZS5sZW5ndGggLSAxXTtcbiAgICBpZiAoYmFja2VuZC5zaG91bGRFeGVjdXRlT25DUFUoW3hdKSB8fFxuICAgICAgICBsYXN0RGltIDwgVE9QS19MQVNUX0RJTV9DUFVfSEFORE9GRl9TSVpFX1RIUkVTSE9MRCB8fFxuICAgICAgICBrID4gVE9QS19LX0NQVV9IQU5ET0ZGX1RIUkVTSE9MRCkge1xuICAgICAgICBjb25zdCB4VmFscyA9IGJhY2tlbmQucmVhZFN5bmMoeC5kYXRhSWQpO1xuICAgICAgICBjb25zdCBbYWxsVG9wS1ZhbHMsIGFsbFRvcEtJbmRpY2VzXSA9IHRvcEtJbXBsQ1BVKHhWYWxzLCB4U2hhcGUsIHguZHR5cGUsIGssIHNvcnRlZCk7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGFsbFRvcEtWYWxzLnNoYXBlLCBhbGxUb3BLVmFscy5kdHlwZSwgYWxsVG9wS1ZhbHMudmFsdWVzKSxcbiAgICAgICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oYWxsVG9wS0luZGljZXMuc2hhcGUsIGFsbFRvcEtJbmRpY2VzLmR0eXBlLCBhbGxUb3BLSW5kaWNlcy52YWx1ZXMpXG4gICAgICAgIF07XG4gICAgfVxuICAgIGlmIChrID09PSAwKSB7XG4gICAgICAgIHhTaGFwZVt4U2hhcGUubGVuZ3RoIC0gMV0gPSAwO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyh4U2hhcGUsIHguZHR5cGUsIFtdKSxcbiAgICAgICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oeFNoYXBlLCAnaW50MzInLCBbXSlcbiAgICAgICAgXTtcbiAgICB9XG4gICAgaWYgKGxhc3REaW0gPT09IDEgLyogZmlyc3RQYXNzICovKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB4LCBmaWxsKHsgYXR0cnM6IHsgc2hhcGU6IHhTaGFwZSwgZHR5cGU6ICdpbnQzMicsIHZhbHVlOiAwIH0sIGJhY2tlbmQgfSlcbiAgICAgICAgXTtcbiAgICB9XG4gICAgLy8gRWFnZXJseSB1bnBhY2sgeCBpbnB1dCBzaW5jZSBpdCBpcyBwYXNzZWQgaW4gdG8gYWxsIHRoZSBzaGFkZXJzIHdoaWNoXG4gICAgLy8gcmVxdWlyZSB1bnBhY2tlZCBpbnB1dHMuXG4gICAgY29uc3QgeHRleERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KHguZGF0YUlkKTtcbiAgICBjb25zdCB4SXNQYWNrZWQgPSB4dGV4RGF0YSAhPT0gbnVsbCAmJiB4dGV4RGF0YS5pc1BhY2tlZDtcbiAgICBjb25zdCB4VW5QYWNrZWQgPSB4SXNQYWNrZWQgPyBiYWNrZW5kLnVucGFja1RlbnNvcih4KSA6IHg7XG4gICAgLy8gUmVzaGFwZSBpbnRvIGEgMmQgdGVuc29yIFtiYXRjaCwgbGFzdERpbV0gYW5kIGNvbXB1dGUgdG9wayBhbG9uZyBsYXN0RGltLlxuICAgIGNvbnN0IHhTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHhTaGFwZSk7XG4gICAgY29uc3QgYmF0Y2ggPSB4U2l6ZSAvIGxhc3REaW07XG4gICAgY29uc3QgeDJEID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiB4VW5QYWNrZWQgfSwgYXR0cnM6IHsgc2hhcGU6IFtiYXRjaCwgbGFzdERpbV0gfSwgYmFja2VuZCB9KTtcbiAgICBpZiAoeElzUGFja2VkKSB7XG4gICAgICAgIGRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvT3JOdWxsKGJhY2tlbmQsIHhVblBhY2tlZCk7XG4gICAgfVxuICAgIGNvbnN0IGtQb3cyID0gcm91bmRVcFRvUG93MihrKTtcbiAgICBjb25zdCBsYXN0RGltUG93MiA9IHJvdW5kVXBUb1BvdzIobGFzdERpbSk7XG4gICAgLy8gT25seSB0aGUgaW5kaWNlcyBjb250YWluaW5nIHRoZSB0b3AgSyBhcmUga2VwdCBhdCBldmVyeSBzdGVwIHRvIHJlZHVjZVxuICAgIC8vIG51bWJlciBvZiBvdXRwdXRzIGluIHRoZSBHUFUgYWxnb3JpdGhtcywgc28gb25jZSB0aGUgZmluYWwgc2V0IG9mIGluZGljZXNcbiAgICAvLyBpcyBjb21wdXRlZCB0aGVuIGdhdGhlciBpcyB1c2VkIHRvIGdyYWIgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzXG4gICAgLy8gZnJvbSB0aGUgb3JpZ2luYWwgaW5wdXQuXG4gICAgbGV0IGluZGljZXMgPSBudWxsO1xuICAgIC8vIEdQVSBhbGdvcml0aG0gYWx3YXlzIHRha2VzIGluIGFuIGluZGljZXMgaW5wdXQgYnV0IHRoaXMgaW5wdXQgaXMgbm90IHVzZWRcbiAgICAvLyBvbiB0aGUgZmlyc3QgcnVuIG9mIGEgR1BVIGFsZ29yaXRobSwgdGhlcmVmb3JlIGlmIGluZGljZXMgaXMgbnVsbCB3ZSBzaW1wbHlcbiAgICAvLyBwYXNzIGluIHgyRCBpbnN0ZWFkIG9mIGl0IGJ1dCB0aGUgdmFsdWUgd2lsbCBub3QgYWN0dWFsbHkgYmUgdXNlZFxuICAgIGNvbnN0IGdldElucHV0cyA9ICgpID0+IGluZGljZXMgPT09IG51bGwgPyBbeDJELCB4MkRdIDogW3gyRCwgaW5kaWNlc107XG4gICAgY29uc3QgcnVuU3dhcCA9IChkaXIsIGluYywgc2hhcGUpID0+IHtcbiAgICAgICAgY29uc3QgaW5wdXRzID0gZ2V0SW5wdXRzKCk7XG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgU3dhcFByb2dyYW0oc2hhcGUpO1xuICAgICAgICBjb25zdCBmaXN0UGFzcyA9IGluZGljZXMgPT09IG51bGwgPyAxIDogMDtcbiAgICAgICAgY29uc3QgY3VzdG9tVmFsdWVzID0gW1tsYXN0RGltXSwgW2Zpc3RQYXNzXSwgW051bWJlci5ORUdBVElWRV9JTkZJTklUWV0sIFtkaXJdLCBbaW5jXV07XG4gICAgICAgIGNvbnN0IHByZXZJbmRpY2VzID0gaW5kaWNlcztcbiAgICAgICAgaW5kaWNlcyA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIGlucHV0cywgJ2ludDMyJywgY3VzdG9tVmFsdWVzKTtcbiAgICAgICAgZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm9Pck51bGwoYmFja2VuZCwgcHJldkluZGljZXMpO1xuICAgIH07XG4gICAgLy8gU3RlcCAxOiBsb2NhbCBzb3J0XG4gICAgZm9yIChsZXQgbGVuID0gMTsgbGVuIDwga1BvdzI7IGxlbiAqPSAyKSB7XG4gICAgICAgIGNvbnN0IGRpciA9IGxlbiAqIDI7XG4gICAgICAgIGZvciAobGV0IGluYyA9IGxlbjsgaW5jID49IDE7IGluYyAvPSAyKSB7XG4gICAgICAgICAgICBydW5Td2FwKGRpciwgaW5jLCBbYmF0Y2gsIGxhc3REaW1Qb3cyXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gU3RlcCAyOiBtZXJnZVxuICAgIGZvciAobGV0IGluZGljZXNTaXplID0gbGFzdERpbVBvdzI7IGluZGljZXNTaXplID4ga1BvdzI7IGluZGljZXNTaXplIC89IDIpIHtcbiAgICAgICAgY29uc3QgaW5wdXRzID0gZ2V0SW5wdXRzKCk7XG4gICAgICAgIGNvbnN0IG1lcmdlUHJvZ3JhbSA9IG5ldyBNZXJnZVByb2dyYW0oW2JhdGNoLCBpbmRpY2VzU2l6ZSAvIDJdKTtcbiAgICAgICAgY29uc3QgZmlyc3RQYXNzID0gaW5kaWNlcyA9PT0gbnVsbCA/IDEgOiAwO1xuICAgICAgICBjb25zdCBjdXN0b21WYWx1ZXMgPSBbW2xhc3REaW1dLCBbZmlyc3RQYXNzXSwgW2tQb3cyXV07XG4gICAgICAgIGNvbnN0IHByZXZJbmRpY2VzID0gaW5kaWNlcztcbiAgICAgICAgaW5kaWNlcyA9XG4gICAgICAgICAgICBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShtZXJnZVByb2dyYW0sIGlucHV0cywgJ2ludDMyJywgY3VzdG9tVmFsdWVzKTtcbiAgICAgICAgZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm9Pck51bGwoYmFja2VuZCwgcHJldkluZGljZXMpO1xuICAgICAgICAvLyBTdGVwIDM6IHJlYnVpbGRcbiAgICAgICAgY29uc3QgbGVuID0ga1BvdzIgLyAyO1xuICAgICAgICBjb25zdCBkaXIgPSBsZW4gKiAyO1xuICAgICAgICBmb3IgKGxldCBpbmMgPSBsZW47IGluYyA+PSAxOyBpbmMgLz0gMikge1xuICAgICAgICAgICAgcnVuU3dhcChkaXIsIGluYywgaW5kaWNlcy5zaGFwZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gS2VlcCBvbmx5IHRoZSByZXF1ZXN0ZWQgdG9wIEsgcmVzdWx0cyBpbnN0ZWFkIG9mIGtQb3cyXG4gICAgbGV0IHByZXZJbmRpY2VzID0gaW5kaWNlcztcbiAgICBpbmRpY2VzID0gc2xpY2UoeyBpbnB1dHM6IHsgeDogaW5kaWNlcyB9LCBiYWNrZW5kLCBhdHRyczogeyBiZWdpbjogMCwgc2l6ZTogW2JhdGNoLCBrXSB9IH0pO1xuICAgIGRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvT3JOdWxsKGJhY2tlbmQsIHByZXZJbmRpY2VzKTtcbiAgICAvLyBHYXRoZXIgdmFsdWVzIG9uIGxhc3QgZGltZW5zaW9uXG4gICAgbGV0IHZhbHVlcyA9IGdhdGhlclYyKHsgaW5wdXRzOiB7IHg6IHgyRCwgaW5kaWNlcyB9LCBiYWNrZW5kLCBhdHRyczogeyBheGlzOiAxLCBiYXRjaERpbXM6IDEgfSB9KTtcbiAgICBkaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mb09yTnVsbChiYWNrZW5kLCB4MkQpO1xuICAgIC8vIFJlc2hhcGUgYmFjayB0byB0aGUgb3JpZ2luYWwgaW5wdXQgc2hhcGUsIGV4Y2VwdCB0aGF0IHRoZSBsYXN0XG4gICAgLy8gZGltZW5zaW9uIGlzIGsuXG4gICAgY29uc3QgbmV3U2hhcGUgPSB4U2hhcGUuc2xpY2UoMCwgLTEpO1xuICAgIG5ld1NoYXBlLnB1c2goayk7XG4gICAgcHJldkluZGljZXMgPSBpbmRpY2VzO1xuICAgIGluZGljZXMgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IGluZGljZXMgfSwgYXR0cnM6IHsgc2hhcGU6IG5ld1NoYXBlIH0sIGJhY2tlbmQgfSk7XG4gICAgZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm9Pck51bGwoYmFja2VuZCwgcHJldkluZGljZXMpO1xuICAgIGNvbnN0IHByZXZWYWx1ZXMgPSB2YWx1ZXM7XG4gICAgdmFsdWVzID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiB2YWx1ZXMgfSwgYXR0cnM6IHsgc2hhcGU6IG5ld1NoYXBlIH0sIGJhY2tlbmQgfSk7XG4gICAgZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm9Pck51bGwoYmFja2VuZCwgcHJldlZhbHVlcyk7XG4gICAgcmV0dXJuIFt2YWx1ZXMsIGluZGljZXNdO1xufVxuZXhwb3J0IGNvbnN0IHRvcEtDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogVG9wSyxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiB0b3BLXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VG9wSy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBUcmFuc2Zvcm0gfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgVHJhbnNmb3JtUHJvZ3JhbSB9IGZyb20gJy4uL3RyYW5zZm9ybV9ncHUnO1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW1hZ2UsIHRyYW5zZm9ybXMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGludGVycG9sYXRpb24sIGZpbGxNb2RlLCBmaWxsVmFsdWUsIG91dHB1dFNoYXBlIH0gPSBhdHRycztcbiAgICBjb25zdCBbYmF0Y2gsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBudW1DaGFubmVsc10gPSBpbWFnZS5zaGFwZTtcbiAgICBjb25zdCBbb3V0SGVpZ2h0LCBvdXRXaWR0aF0gPSBvdXRwdXRTaGFwZSAhPSBudWxsID8gb3V0cHV0U2hhcGUgOiBbaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGhdO1xuICAgIGNvbnN0IG91dFNoYXBlID0gW2JhdGNoLCBvdXRIZWlnaHQsIG91dFdpZHRoLFxuICAgICAgICBudW1DaGFubmVsc107XG4gICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBUcmFuc2Zvcm1Qcm9ncmFtKGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBpbnRlcnBvbGF0aW9uLCBmaWxsTW9kZSwgZmlsbFZhbHVlLCBvdXRTaGFwZSk7XG4gICAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtpbWFnZSwgdHJhbnNmb3Jtc10sICdmbG9hdDMyJyk7XG59XG5leHBvcnQgY29uc3QgdHJhbnNmb3JtQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFRyYW5zZm9ybSxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiB0cmFuc2Zvcm1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1UcmFuc2Zvcm0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgVHJhbnNwb3NlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHRyYW5zcG9zZUltcGwgfSBmcm9tICcuL1RyYW5zcG9zZV9pbXBsJztcbmltcG9ydCB7IHRyYW5zcG9zZUltcGxDUFUgYXMgY3B1VHJhbnNwb3NlIH0gZnJvbSAnLi9UcmFuc3Bvc2VfaW1wbCc7XG5leHBvcnQgZnVuY3Rpb24gdHJhbnNwb3NlKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBwZXJtIH0gPSBhdHRycztcbiAgICBjb25zdCB3ZWJnbEJhY2tlbmQgPSBiYWNrZW5kO1xuICAgIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgbmV3U2hhcGUgPSBuZXcgQXJyYXkoeFJhbmspO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3U2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbmV3U2hhcGVbaV0gPSB4LnNoYXBlW3Blcm1baV1dO1xuICAgIH1cbiAgICBsZXQgb3V0O1xuICAgIGlmICh3ZWJnbEJhY2tlbmQuc2hvdWxkRXhlY3V0ZU9uQ1BVKFt4XSkpIHtcbiAgICAgICAgY29uc3QgeFRleERhdGEgPSB3ZWJnbEJhY2tlbmQudGV4RGF0YS5nZXQoeC5kYXRhSWQpO1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSB4VGV4RGF0YS52YWx1ZXM7XG4gICAgICAgIGNvbnN0IG91dFZhbHVlcyA9IGNwdVRyYW5zcG9zZSh2YWx1ZXMsIHguc2hhcGUsIHguZHR5cGUsIHBlcm0sIG5ld1NoYXBlKTtcbiAgICAgICAgb3V0ID0gd2ViZ2xCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG5ld1NoYXBlLCB4LmR0eXBlKTtcbiAgICAgICAgY29uc3Qgb3V0RGF0YSA9IHdlYmdsQmFja2VuZC50ZXhEYXRhLmdldChvdXQuZGF0YUlkKTtcbiAgICAgICAgb3V0RGF0YS52YWx1ZXMgPSBvdXRWYWx1ZXM7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBvdXQgPSB0cmFuc3Bvc2VJbXBsKHgsIHBlcm0sIHdlYmdsQmFja2VuZCk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgdHJhbnNwb3NlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFRyYW5zcG9zZSxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiB0cmFuc3Bvc2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1UcmFuc3Bvc2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHRyYW5zcG9zZUltcGxDUFUgfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmltcG9ydCB7IFRyYW5zcG9zZVByb2dyYW0gfSBmcm9tICcuLi90cmFuc3Bvc2VfZ3B1JztcbmltcG9ydCB7IFRyYW5zcG9zZVBhY2tlZFByb2dyYW0gfSBmcm9tICcuLi90cmFuc3Bvc2VfcGFja2VkX2dwdSc7XG5leHBvcnQgZnVuY3Rpb24gdHJhbnNwb3NlSW1wbCh4LCBwZXJtLCBiYWNrZW5kKSB7XG4gICAgY29uc3QgcHJvZ3JhbSA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfQVJSQVlfT1BFUkFUSU9OUycpID9cbiAgICAgICAgbmV3IFRyYW5zcG9zZVBhY2tlZFByb2dyYW0oeC5zaGFwZSwgcGVybSkgOlxuICAgICAgICBuZXcgVHJhbnNwb3NlUHJvZ3JhbSh4LnNoYXBlLCBwZXJtKTtcbiAgICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3hdLCB4LmR0eXBlKTtcbn1cbmV4cG9ydCB7IHRyYW5zcG9zZUltcGxDUFUgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRyYW5zcG9zZV9pbXBsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBVbmlxdWUgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5pcXVlSW1wbENQVSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL3dlYmdsX3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIHVuaXF1ZShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGF0dHJzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgYXhpcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleCh4LCAndW5pcXVlJyk7XG4gICAgLy8gRm9yIG5vdywgYWx3YXlzIGZvcndhcmQgY2FsY3VsYXRpb24gdG8gdGhlIENQVSBiYWNrZW5kLlxuICAgIGNvbnNvbGUud2FybignV0FSTklORzogJywgJ1VJIG1pZ2h0IGJlIGxvY2tlZCB0ZW1wb3JhcmlseSBhcyBkYXRhIGlzIGJlaW5nIGRvd25sb2FkZWQnKTtcbiAgICBjb25zdCB2YWx1ZXMgPSBiYWNrZW5kLnJlYWRTeW5jKHguZGF0YUlkKTtcbiAgICBjb25zdCB7IG91dHB1dFZhbHVlcywgb3V0cHV0U2hhcGUsIGluZGljZXMgfSA9IHVuaXF1ZUltcGxDUFUodmFsdWVzLCBheGlzLCB4LnNoYXBlLCB4LmR0eXBlKTtcbiAgICByZXR1cm4gW1xuICAgICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dHB1dFNoYXBlLCB4LmR0eXBlLCBvdXRwdXRWYWx1ZXMpLFxuICAgICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtpbmRpY2VzLmxlbmd0aF0sICdpbnQzMicsIGluZGljZXMpLFxuICAgIF07XG59XG5leHBvcnQgY29uc3QgdW5pcXVlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFVuaXF1ZSxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiB1bmlxdWUsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VW5pcXVlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFVucGFjayB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7IHNsaWNlIH0gZnJvbSAnLi9TbGljZSc7XG5leHBvcnQgZnVuY3Rpb24gdW5wYWNrKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB2YWx1ZSB9ID0gaW5wdXRzO1xuICAgIGxldCB7IGF4aXMgfSA9IGF0dHJzO1xuICAgIGlmIChheGlzIDwgMCkge1xuICAgICAgICBheGlzICs9IHZhbHVlLnNoYXBlLmxlbmd0aDtcbiAgICB9XG4gICAgY29uc3QgeCA9IHZhbHVlO1xuICAgIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgbnVtID0gdmFsdWUuc2hhcGVbYXhpc107XG4gICAgY29uc3Qgb3V0U2hhcGUgPSBuZXcgQXJyYXkoeFJhbmsgLSAxKTtcbiAgICBsZXQgb3V0SW5kZXggPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeFJhbms7IGkrKykge1xuICAgICAgICBpZiAoaSAhPT0gYXhpcykge1xuICAgICAgICAgICAgb3V0U2hhcGVbb3V0SW5kZXgrK10gPSB4LnNoYXBlW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHRvRGlzcG9zZSA9IFtdO1xuICAgIGNvbnN0IGJlZ2luID0gbmV3IEFycmF5KHhSYW5rKS5maWxsKDApO1xuICAgIGNvbnN0IHNpemUgPSB4LnNoYXBlLnNsaWNlKCk7XG4gICAgc2l6ZVtheGlzXSA9IDE7XG4gICAgY29uc3QgcmVzID0gbmV3IEFycmF5KG51bSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYmVnaW5bYXhpc10gPSBpO1xuICAgICAgICBjb25zdCBzbGljZWQgPSBzbGljZSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQsIGF0dHJzOiB7IGJlZ2luLCBzaXplIH0gfSk7XG4gICAgICAgIGNvbnN0IHJlc2hhcGVkID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiBzbGljZWQgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IG91dFNoYXBlIH0gfSk7XG4gICAgICAgIHJlc1tpXSA9IHJlc2hhcGVkO1xuICAgICAgICB0b0Rpc3Bvc2UucHVzaChzbGljZWQpO1xuICAgIH1cbiAgICB0b0Rpc3Bvc2UuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuICAgIHJldHVybiByZXM7XG59XG5leHBvcnQgY29uc3QgdW5wYWNrQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFVucGFjayxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiB1bnBhY2tcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1VbnBhY2suanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBzdW1PdXRUeXBlLCBVbnNvcnRlZFNlZ21lbnRTdW0sIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgU2VnbWVudE9wUHJvZ3JhbSB9IGZyb20gJy4uL3NlZ21lbnRfZ3B1JztcbmltcG9ydCB7IHJhbmdlIH0gZnJvbSAnLi9SYW5nZSc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7IHRpbGUgfSBmcm9tICcuL1RpbGUnO1xuaW1wb3J0IHsgdHJhbnNwb3NlIH0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuZXhwb3J0IGZ1bmN0aW9uIHVuc29ydGVkU2VnbWVudFN1bShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCwgc2VnbWVudElkcyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgbnVtU2VnbWVudHMgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgdG9EaXNwb3NlID0gW107XG4gICAgbGV0IGF4aXMgPSAwO1xuICAgIGNvbnN0IHBlcm11dGF0aW9uID0gYmFja2VuZF91dGlsLmdldEF4ZXNQZXJtdXRhdGlvbihbYXhpc10sIHhSYW5rKTtcbiAgICBsZXQgcGVybXV0ZWRYID0geDtcbiAgICBpZiAocGVybXV0YXRpb24gIT0gbnVsbCkge1xuICAgICAgICBwZXJtdXRlZFggPSB0cmFuc3Bvc2UoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kLCBhdHRyczogeyBwZXJtOiBwZXJtdXRhdGlvbiB9IH0pO1xuICAgICAgICB0b0Rpc3Bvc2UucHVzaChwZXJtdXRlZFgpO1xuICAgICAgICBheGlzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoMSwgeFJhbmspWzBdO1xuICAgIH1cbiAgICBjb25zdCBvdXRTaGFwZSA9IGJhY2tlbmRfdXRpbC5zZWdtZW50X3V0aWwuY29tcHV0ZU91dFNoYXBlKHBlcm11dGVkWC5zaGFwZSwgYXhpcywgbnVtU2VnbWVudHMpO1xuICAgIGNvbnN0IGluU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShbcGVybXV0ZWRYLnNoYXBlW2F4aXNdXSk7XG4gICAgY29uc3QgYTJEID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiBwZXJtdXRlZFggfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IFstMSwgaW5TaXplXSB9IH0pO1xuICAgIHRvRGlzcG9zZS5wdXNoKGEyRCk7XG4gICAgY29uc3Qgb3V0cHV0RFR5cGUgPSBzdW1PdXRUeXBlKHguZHR5cGUpO1xuICAgIGNvbnN0IHNlZ09wQ29tcHV0ZSA9ICh4LCBzZWdPcFR5cGUsIHNlZ21lbnRJZHMsIGR0eXBlLCBudW1TZWdtZW50cykgPT4ge1xuICAgICAgICBjb25zdCBiYXRjaFNpemUgPSB4LnNoYXBlWzBdO1xuICAgICAgICBjb25zdCBpblNpemUgPSB4LnNoYXBlWzFdO1xuICAgICAgICBjb25zdCB3aW5kb3dTaXplID0gYmFja2VuZF91dGlsLnNlZ21lbnRfdXRpbC5zZWdPcENvbXB1dGVPcHRpbWFsV2luZG93U2l6ZShpblNpemUsIG51bVNlZ21lbnRzKTtcbiAgICAgICAgY29uc3Qgc2VnT3BJbmZvID0geyB3aW5kb3dTaXplLCBpblNpemUsIGJhdGNoU2l6ZSwgbnVtU2VnbWVudHMgfTtcbiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBTZWdtZW50T3BQcm9ncmFtKHNlZ09wSW5mbywgc2VnT3BUeXBlKTtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gYmFja2VuZC5jb21waWxlQW5kUnVuKHByb2dyYW0sIFt4LCBzZWdtZW50SWRzXSwgZHR5cGUpO1xuICAgICAgICB0b0Rpc3Bvc2UucHVzaChvdXRwdXQpO1xuICAgICAgICAvLyBObyBuZWVkIHRvIHJ1biBhbm90aGVyIEdQR1BVIHByb2dyYW0uXG4gICAgICAgIGlmIChvdXRwdXQuc2hhcGVbMV0gPT09IG51bVNlZ21lbnRzKSB7XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJhbmdlSW5mbyA9IHJhbmdlKHtcbiAgICAgICAgICAgIGJhY2tlbmQsXG4gICAgICAgICAgICBhdHRyczogeyBzdGFydDogMCwgc3RvcDogbnVtU2VnbWVudHMsIHN0ZXA6IDEsIGR0eXBlOiAnZmxvYXQzMicgfVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgdGlsZUluZm8gPSB0aWxlKHtcbiAgICAgICAgICAgIGlucHV0czogeyB4OiByYW5nZUluZm8gfSxcbiAgICAgICAgICAgIGJhY2tlbmQsXG4gICAgICAgICAgICBhdHRyczogeyByZXBzOiBbaW5TaXplIC8gd2luZG93U2l6ZV0gfVxuICAgICAgICB9KTtcbiAgICAgICAgdG9EaXNwb3NlLnB1c2gocmFuZ2VJbmZvKTtcbiAgICAgICAgdG9EaXNwb3NlLnB1c2godGlsZUluZm8pO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBzZWdPcENvbXB1dGUob3V0cHV0LCBzZWdPcFR5cGUsIHRpbGVJbmZvLCBkdHlwZSwgbnVtU2VnbWVudHMpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgY29uc3Qgc2VnT3BSZXN1bHQgPSBzZWdPcENvbXB1dGUoYTJELCAndW5zb3J0ZWRTZWdtZW50U3VtJywgc2VnbWVudElkcywgb3V0cHV0RFR5cGUsIG51bVNlZ21lbnRzKTtcbiAgICBjb25zdCByZXNoYXBlZCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogc2VnT3BSZXN1bHQgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IG91dFNoYXBlIH0gfSk7XG4gICAgbGV0IHJlc3VsdCA9IHJlc2hhcGVkO1xuICAgIGlmIChwZXJtdXRhdGlvbiAhPSBudWxsKSB7XG4gICAgICAgIHRvRGlzcG9zZS5wdXNoKHJlc2hhcGVkKTtcbiAgICAgICAgY29uc3QgcGVybSA9IGJhY2tlbmRfdXRpbC5nZXRVbmRvQXhlc1Blcm11dGF0aW9uKHBlcm11dGF0aW9uKTtcbiAgICAgICAgcmVzdWx0ID0gdHJhbnNwb3NlKHsgaW5wdXRzOiB7IHg6IHJlc3VsdCB9LCBiYWNrZW5kLCBhdHRyczogeyBwZXJtIH0gfSk7XG4gICAgfVxuICAgIHRvRGlzcG9zZS5mb3JFYWNoKHQgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0KSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBjb25zdCB1bnNvcnRlZFNlZ21lbnRTdW1Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogVW5zb3J0ZWRTZWdtZW50U3VtLFxuICAgIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICAgIGtlcm5lbEZ1bmM6IHVuc29ydGVkU2VnbWVudFN1bVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVVuc29ydGVkU2VnbWVudFN1bS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBaZXJvc0xpa2UgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY29tcGxleCB9IGZyb20gJy4vQ29tcGxleCc7XG5pbXBvcnQgeyBmaWxsIH0gZnJvbSAnLi9GaWxsJztcbmltcG9ydCB7IGltYWcgfSBmcm9tICcuL0ltYWcnO1xuaW1wb3J0IHsgcmVhbCB9IGZyb20gJy4vUmVhbCc7XG5leHBvcnQgZnVuY3Rpb24gemVyb3NMaWtlKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBpZiAoeC5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgY29uc3QgcmVhbFBhcnQgPSByZWFsKHsgaW5wdXRzOiB7IGlucHV0OiB4IH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIGNvbnN0IHIgPSB6ZXJvc0xpa2UoeyBpbnB1dHM6IHsgeDogcmVhbFBhcnQgfSwgYmFja2VuZCB9KTtcbiAgICAgICAgY29uc3QgaW1hZ1BhcnQgPSBpbWFnKHsgaW5wdXRzOiB7IGlucHV0OiB4IH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIGNvbnN0IGkgPSB6ZXJvc0xpa2UoeyBpbnB1dHM6IHsgeDogaW1hZ1BhcnQgfSwgYmFja2VuZCB9KTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY29tcGxleCh7IGlucHV0czogeyByZWFsOiByLCBpbWFnOiBpIH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVhbFBhcnQpO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHIpO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGltYWdQYXJ0KTtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBmaWxsKHtcbiAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgc2hhcGU6IHguc2hhcGUsXG4gICAgICAgICAgICAgICAgZHR5cGU6IHguZHR5cGUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHguZHR5cGUgPT09ICdzdHJpbmcnID8gJycgOiAwXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmFja2VuZFxuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgemVyb3NMaWtlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFplcm9zTGlrZSxcbiAgICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAgICBrZXJuZWxGdW5jOiB6ZXJvc0xpa2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1aZXJvc0xpa2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IF9GdXNlZE1hdE11bCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBiYXRjaE1hdE11bEltcGwgfSBmcm9tICcuL0JhdGNoTWF0TXVsX2ltcGwnO1xuZXhwb3J0IGZ1bmN0aW9uIF9mdXNlZE1hdE11bChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgYSwgYiwgYmlhcywgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgdHJhbnNwb3NlQSwgdHJhbnNwb3NlQiwgYWN0aXZhdGlvbiwgbGVha3lyZWx1QWxwaGEgfSA9IGF0dHJzO1xuICAgIHJldHVybiBiYXRjaE1hdE11bEltcGwoe1xuICAgICAgICBhLFxuICAgICAgICBiLFxuICAgICAgICB0cmFuc3Bvc2VBLFxuICAgICAgICB0cmFuc3Bvc2VCLFxuICAgICAgICBiYWNrZW5kLFxuICAgICAgICBiaWFzLFxuICAgICAgICBwcmVsdUFjdGl2YXRpb25XZWlnaHRzLFxuICAgICAgICBsZWFreXJlbHVBbHBoYSxcbiAgICAgICAgYWN0aXZhdGlvblxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IF9mdXNlZE1hdE11bENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBfRnVzZWRNYXRNdWwsXG4gICAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gICAga2VybmVsRnVuYzogX2Z1c2VkTWF0TXVsLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPV9GdXNlZE1hdE11bC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5leHBvcnQgY2xhc3MgTFJOUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoeFNoYXBlLCByYWRpdXMsIGJpYXMsIGFscGhhLCBiZXRhKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsneCddO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gW107XG4gICAgICAgIGNvbnN0IHJhZCA9IHJhZGl1cztcbiAgICAgICAgY29uc3QgbWF4RCA9IHhTaGFwZVszXSAtIDE7XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSB4U2hhcGU7XG4gICAgICAgIC8vIG9wdGltaXplIHBvdyhiaWFzICsgYWxwaGEgKiBzdW0sIC1iZXRhKVxuICAgICAgICAvLyBzcmM6IGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmZsb3cvLi5cbiAgICAgICAgLy8gYmxvYi8yNjAzM2ExNjQ0YTljNGE1ZmJlMzE3MGFiMmU4NjRiNmE0Y2NkNGNhLy4uXG4gICAgICAgIC8vIHRlbnNvcmZsb3cvY29yZS9rZXJuZWxzL21rbF9scm5fb3AuY2MjTDMyMFxuICAgICAgICBsZXQgcG93T3BlcmF0b3I7XG4gICAgICAgIGNvbnN0IGJhc2lzID0gYGZsb2F0KCR7Ymlhc30pICsgZmxvYXQoJHthbHBoYX0pICogc3VtYDtcbiAgICAgICAgaWYgKGJldGEgPT09IDAuNSkge1xuICAgICAgICAgICAgcG93T3BlcmF0b3IgPSBgaW52ZXJzZXNxcnQoJHtiYXNpc30pYDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChiZXRhID09PSAxLjApIHtcbiAgICAgICAgICAgIHBvd09wZXJhdG9yID0gYDEuMC8oJHtiYXNpc30pYDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHBvd09wZXJhdG9yID0gYGV4cChsb2coJHtiYXNpc30pICogZmxvYXQoLSR7YmV0YX0pKTtgO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYiA9IGNvb3Jkc1swXTtcbiAgICAgICAgaW50IHIgPSBjb29yZHNbMV07XG4gICAgICAgIGludCBjID0gY29vcmRzWzJdO1xuICAgICAgICBpbnQgZCA9IGNvb3Jkc1szXTtcbiAgICAgICAgZmxvYXQgeCA9IGdldFgoYiwgciwgYywgZCk7XG4gICAgICAgIGZsb2F0IHN1bSA9IDAuMDtcbiAgICAgICAgZm9yIChpbnQgaiA9IC0ke3JhZH07IGogPD0gJHtyYWR9OyBqKyspIHtcbiAgICAgICAgICBpbnQgaWR4ID0gZCArIGo7XG4gICAgICAgICAgaWYgKGlkeCA+PSAwICYmIGlkeCA8PSAgJHttYXhEfSkge1xuICAgICAgICAgICAgZmxvYXQgeiA9IGdldFgoYiwgciwgYywgaWR4KTtcbiAgICAgICAgICAgIHN1bSArPSB6ICogejtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmxvYXQgdmFsID0geCAqICR7cG93T3BlcmF0b3J9O1xuICAgICAgICBzZXRPdXRwdXQodmFsKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxybl9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuZXhwb3J0IGNsYXNzIExSTkdyYWRQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3RvcihpbnB1dFNoYXBlLCBkZXB0aFJhZGl1cywgYmlhcywgYWxwaGEsIGJldGEpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWydpbnB1dEltYWdlJywgJ291dHB1dEltYWdlJywgJ2R5J107XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBbXTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IGlucHV0U2hhcGU7XG4gICAgICAgIHRoaXMuZGVwdGggPSBpbnB1dFNoYXBlWzNdO1xuICAgICAgICB0aGlzLmRlcHRoUmFkaXVzID0gZGVwdGhSYWRpdXM7XG4gICAgICAgIHRoaXMuYmlhcyA9IGJpYXM7XG4gICAgICAgIHRoaXMuYWxwaGEgPSBhbHBoYTtcbiAgICAgICAgdGhpcy5iZXRhID0gYmV0YTtcbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgciA9IGNvb3Jkc1sxXTtcbiAgICAgICAgaW50IGMgPSBjb29yZHNbMl07XG5cbiAgICAgICAgZmxvYXQgcmVzdWx0ID0gMC4wO1xuICAgICAgICBmb3IgKGludCBkID0gMDsgZCA8ICR7dGhpcy5kZXB0aH07ICsrZCkge1xuICAgICAgICAgIGludCBkZXB0aEJlZ2luID0gaW50KG1heCgwLjAsIGZsb2F0KGQgLSAke2RlcHRoUmFkaXVzfSkpKTtcbiAgICAgICAgICBpbnQgZGVwdGhFbmQgPSBpbnQobWluKGZsb2F0KCR7dGhpcy5kZXB0aH0pLFxuICAgICAgICAgICAgICBmbG9hdChkICsgJHtkZXB0aFJhZGl1c30gKyAxKSkpO1xuXG4gICAgICAgICAgY29uc3QgaW50IE1JTl9ERVBUSF9CRUdJTiA9IDA7XG4gICAgICAgICAgY29uc3QgaW50IE1BWF9ERVBUSF9FTkQgPSAke3RoaXMuZGVwdGh9O1xuXG4gICAgICAgICAgZmxvYXQgbm9ybSA9IDAuMDtcbiAgICAgICAgICBmb3IgKGludCBrID0gTUlOX0RFUFRIX0JFR0lOOyBrIDwgTUFYX0RFUFRIX0VORDsgKytrKSB7XG4gICAgICAgICAgICBpZiAoayA8IGRlcHRoQmVnaW4pe1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGsgPj0gZGVwdGhCZWdpbiAmJiBrIDwgZGVwdGhFbmQpIHtcbiAgICAgICAgICAgICAgbm9ybSArPSBnZXRJbnB1dEltYWdlKGIsIHIsIGMsIGspICogZ2V0SW5wdXRJbWFnZShiLCByLCBjLCBrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBub3JtID0gZmxvYXQoJHthbHBoYX0pICogbm9ybSArIGZsb2F0KCR7Ymlhc30pO1xuXG4gICAgICAgICAgZm9yKGludCBrID0gTUlOX0RFUFRIX0JFR0lOOyBrIDwgTUFYX0RFUFRIX0VORDsgKytrKXtcbiAgICAgICAgICAgIGlmIChrIDwgZGVwdGhCZWdpbil7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoayA+PSBkZXB0aEJlZ2luICYmIGsgPCBkZXB0aEVuZCl7XG4gICAgICAgICAgICAgIGZsb2F0IGR5aSA9IC0yLjAgKiBmbG9hdCgke2FscGhhfSlcbiAgICAgICAgICAgICAgICAqIGZsb2F0KCR7YmV0YX0pXG4gICAgICAgICAgICAgICAgKiBnZXRJbnB1dEltYWdlKGIgLHIgLGMsIGspICogZ2V0T3V0cHV0SW1hZ2UoYiwgciwgYywgZClcbiAgICAgICAgICAgICAgICAvIG5vcm07XG4gICAgICAgICAgICAgIGlmIChrID09IGQpIHtcbiAgICAgICAgICAgICAgICBkeWkgKz0gcG93KG5vcm0sIC0xLjAgKiAke2JldGF9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoayA9PSBjb29yZHNbM10pIHtcbiAgICAgICAgICAgICAgICBkeWkgKj0gZ2V0RHkoYiwgciwgYywgZCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGR5aTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bHJuX2dyYWRfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmV4cG9ydCBjbGFzcyBMUk5QYWNrZWRQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3Rvcih4U2hhcGUsIHJhZGl1cywgYmlhcywgYWxwaGEsIGJldGEpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWyd4J107XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBbXTtcbiAgICAgICAgdGhpcy5wYWNrZWRJbnB1dHMgPSB0cnVlO1xuICAgICAgICB0aGlzLnBhY2tlZE91dHB1dCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHJhZCA9IHJhZGl1cztcbiAgICAgICAgY29uc3QgbWF4RCA9IHhTaGFwZVszXSAtIDE7XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSB4U2hhcGU7XG4gICAgICAgIC8vIG9wdGltaXplIHBvdyhiaWFzICsgYWxwaGEgKiBzdW0sIC1iZXRhKVxuICAgICAgICAvLyBzcmM6IGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmZsb3cvLi5cbiAgICAgICAgLy8gYmxvYi8yNjAzM2ExNjQ0YTljNGE1ZmJlMzE3MGFiMmU4NjRiNmE0Y2NkNGNhLy4uXG4gICAgICAgIC8vIHRlbnNvcmZsb3cvY29yZS9rZXJuZWxzL21rbF9scm5fb3AuY2MjTDMyMFxuICAgICAgICBsZXQgcG93T3BlcmF0b3I7XG4gICAgICAgIGNvbnN0IGJhc2lzID0gYGZsb2F0KCR7Ymlhc30pICsgZmxvYXQoJHthbHBoYX0pICogc3VtYDtcbiAgICAgICAgaWYgKGJldGEgPT09IDAuNSkge1xuICAgICAgICAgICAgcG93T3BlcmF0b3IgPSBgaW52ZXJzZXNxcnQoJHtiYXNpc30pYDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChiZXRhID09PSAxLjApIHtcbiAgICAgICAgICAgIHBvd09wZXJhdG9yID0gYDEuMC8oJHtiYXNpc30pYDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHBvd09wZXJhdG9yID0gYGV4cChsb2coJHtiYXNpc30pICogZmxvYXQoLSR7YmV0YX0pKTtgO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYiA9IGNvb3Jkcy54O1xuICAgICAgICBpbnQgciA9IGNvb3Jkcy55O1xuICAgICAgICBpbnQgYyA9IGNvb3Jkcy56O1xuICAgICAgICBpbnQgZCA9IGNvb3Jkcy53O1xuXG4gICAgICAgIGJvb2wgaGFzTmV4dENvbCA9IGQgPCAke3RoaXMub3V0cHV0U2hhcGVbM119O1xuICAgICAgICBib29sIGhhc05leHRSb3cgPSBjIDwgJHt0aGlzLm91dHB1dFNoYXBlWzJdfTtcblxuICAgICAgICB2ZWM0IHN1bSA9IHZlYzQoMC4pO1xuICAgICAgICB2ZWM0IHhGcmFnQXRPdXRwdXRDb29yZHMgPSBnZXRYKGIsIHIsIGMsIGQpO1xuXG4gICAgICAgIHZlYzQgeEF0T3V0cHV0Q29vcmRzID0gdmVjNChcbiAgICAgICAgICBnZXRDaGFubmVsKHhGcmFnQXRPdXRwdXRDb29yZHMsIHZlYzIoYywgZCkpLFxuICAgICAgICAgIGhhc05leHRDb2wgP1xuICAgICAgICAgICAgZ2V0Q2hhbm5lbCh4RnJhZ0F0T3V0cHV0Q29vcmRzLCB2ZWMyKGMsIGQgKyAxKSkgOiAwLjAsXG4gICAgICAgICAgaGFzTmV4dFJvdyA/XG4gICAgICAgICAgICBnZXRDaGFubmVsKHhGcmFnQXRPdXRwdXRDb29yZHMgLCB2ZWMyKGMgKyAxLCBkKSkgOiAwLjAsXG4gICAgICAgICAgKGhhc05leHRSb3cgJiYgaGFzTmV4dENvbCkgP1xuICAgICAgICAgICAgZ2V0Q2hhbm5lbCh4RnJhZ0F0T3V0cHV0Q29vcmRzLCB2ZWMyKGMgKyAxLCBkICsgMSkpIDogMC4wXG4gICAgICAgICk7XG5cbiAgICAgICAgaW50IGZpcnN0Q2hhbm5lbCA9IGQgLSAke3JhZH07XG4gICAgICAgIHZlYzIgY2FjaGUgPSB2ZWMyKDAuKTtcbiAgICAgICAgaWYoZmlyc3RDaGFubmVsID49IDApe1xuICAgICAgICAgIHZlYzQgZmlyc3RDaGFubmVsRnJhZyA9IGdldFgoYiwgciwgYywgZmlyc3RDaGFubmVsKTtcbiAgICAgICAgICBjYWNoZS54ID0gZ2V0Q2hhbm5lbChmaXJzdENoYW5uZWxGcmFnLCB2ZWMyKGMsIGZpcnN0Q2hhbm5lbCkpO1xuICAgICAgICAgICAgaWYoaGFzTmV4dFJvdyl7XG4gICAgICAgICAgICAgIGNhY2hlLnkgPSBnZXRDaGFubmVsKGZpcnN0Q2hhbm5lbEZyYWcsIHZlYzIoYyArIDEsIGZpcnN0Q2hhbm5lbCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaXZlYzIgZGVwdGggPSBpdmVjMihkLCBkICsgMSk7XG4gICAgICAgIGZvciAoaW50IGogPSAtICR7cmFkfTsgaiA8PSAke3JhZH07IGorKykge1xuICAgICAgICAgIGl2ZWMyIGlkeCA9IGRlcHRoICsgajtcbiAgICAgICAgICBidmVjMiBhYm92ZUxvd2VyQm91bmQgPSBncmVhdGVyVGhhbkVxdWFsKGlkeCwgaXZlYzIoMCkpO1xuICAgICAgICAgIGJ2ZWMyIGJlbG93VXBwZXJCb3VuZCA9IGxlc3NUaGFuRXF1YWwoaWR4LCBpdmVjMigke21heER9KSk7XG5cbiAgICAgICAgICBib29sIGRlcHRoSW5SYW5nZSA9IGFib3ZlTG93ZXJCb3VuZC54ICYmIGJlbG93VXBwZXJCb3VuZC54O1xuICAgICAgICAgIGJvb2wgZGVwdGhQbHVzT25lSW5SYW5nZSA9IGFib3ZlTG93ZXJCb3VuZC55ICYmIGJlbG93VXBwZXJCb3VuZC55O1xuXG4gICAgICAgICAgaWYoZGVwdGhJblJhbmdlIHx8IGRlcHRoUGx1c09uZUluUmFuZ2Upe1xuICAgICAgICAgICAgdmVjNCB6ID0gdmVjNCgwLik7XG4gICAgICAgICAgICB2ZWM0IHhGcmFnQXRDdXJyZW50RGVwdGg7XG4gICAgICAgICAgICB6Lnh6ID0gY2FjaGUueHk7XG4gICAgICAgICAgICBpZihkZXB0aFBsdXNPbmVJblJhbmdlICYmIGhhc05leHRDb2wpe1xuICAgICAgICAgICAgICB4RnJhZ0F0Q3VycmVudERlcHRoID0gaWR4LnkgIT0gZCA/XG4gICAgICAgICAgICAgICAgZ2V0WChiLCByLCBjLCBpZHgueSkgOiB4RnJhZ0F0T3V0cHV0Q29vcmRzO1xuICAgICAgICAgICAgICB6LnkgPSBnZXRDaGFubmVsKHhGcmFnQXRDdXJyZW50RGVwdGgsIHZlYzIoYywgaWR4LnkpKTtcbiAgICAgICAgICAgICAgaWYoaGFzTmV4dFJvdyl7XG4gICAgICAgICAgICAgICAgei53ID0gZ2V0Q2hhbm5lbCh4RnJhZ0F0Q3VycmVudERlcHRoLCB2ZWMyKGMgKyAxLCBpZHgueSkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYWNoZS54eSA9IHoueXc7XG4gICAgICAgICAgICBzdW0gKz0geiAqIHo7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZlYzQgcmVzdWx0ID0geEF0T3V0cHV0Q29vcmRzICogJHtwb3dPcGVyYXRvcn07XG4gICAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bHJuX3BhY2tlZF9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuZXhwb3J0IGNsYXNzIE1heFBvb2wyREJhY2twcm9wUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoY29udkluZm8pIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWydkeScsICdtYXhQb3MnXTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IGNvbnZJbmZvLmluU2hhcGU7XG4gICAgICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICAgICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICAgICAgY29uc3QgZGlsYXRpb25IZWlnaHQgPSBjb252SW5mby5kaWxhdGlvbkhlaWdodDtcbiAgICAgICAgY29uc3QgZWZmZWN0aXZlRmlsdGVySGVpZ2h0ID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVySGVpZ2h0O1xuICAgICAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoO1xuICAgICAgICBjb25zdCBwYWRUb3AgPSBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgLSAxIC0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgICAgIGNvbnN0IHBhZExlZnQgPSBlZmZlY3RpdmVGaWx0ZXJXaWR0aCAtIDEgLSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgICAgIGNvbnN0IGxhc3RJbmRleCA9IGVmZmVjdGl2ZUZpbHRlckhlaWdodCAqIGVmZmVjdGl2ZUZpbHRlcldpZHRoIC0gMTtcbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IGl2ZWMyIHBhZHMgPSBpdmVjMigke3BhZFRvcH0sICR7cGFkTGVmdH0pO1xuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYiA9IGNvb3Jkc1swXTtcbiAgICAgICAgaW50IGQgPSBjb29yZHNbM107XG5cbiAgICAgICAgaXZlYzIgZHlSQ0Nvcm5lciA9IGNvb3Jkcy55eiAtIHBhZHM7XG4gICAgICAgIGludCBkeVJDb3JuZXIgPSBkeVJDQ29ybmVyLng7XG4gICAgICAgIGludCBkeUNDb3JuZXIgPSBkeVJDQ29ybmVyLnk7XG5cbiAgICAgICAgLy8gQ29udm9sdmUgZHkoPywgPywgZCkgd2l0aCBwb3MgbWFzayg6LCA6LCBkKSB0byBnZXQgZHgoeFIsIHhDLCBkKS5cbiAgICAgICAgLy8gPyA9IHRvIGJlIGRldGVybWluZWQuIDogPSBhY3Jvc3MgYWxsIHZhbHVlcyBpbiB0aGF0IGF4aXMuXG4gICAgICAgIGZsb2F0IGRvdFByb2QgPSAwLjA7XG4gICAgICAgIGZvciAoaW50IHdSID0gMDsgd1IgPCAke2VmZmVjdGl2ZUZpbHRlckhlaWdodH07XG4gICAgICAgICAgd1IgKz0gJHtkaWxhdGlvbkhlaWdodH0pIHtcbiAgICAgICAgICBmbG9hdCBkeVIgPSBmbG9hdChkeVJDb3JuZXIgKyB3UikgLyAke3N0cmlkZUhlaWdodH0uMDtcblxuICAgICAgICAgIGlmIChkeVIgPCAwLjAgfHwgZHlSID49ICR7Y29udkluZm8ub3V0SGVpZ2h0fS4wIHx8IGZyYWN0KGR5UikgPiAwLjApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpbnQgaWR5UiA9IGludChkeVIpO1xuXG4gICAgICAgICAgZm9yIChpbnQgd0MgPSAwOyB3QyA8ICR7ZWZmZWN0aXZlRmlsdGVyV2lkdGh9OyB3QysrKSB7XG4gICAgICAgICAgICBmbG9hdCBkeUMgPSBmbG9hdChkeUNDb3JuZXIgKyB3QykgLyAke3N0cmlkZVdpZHRofS4wO1xuXG4gICAgICAgICAgICBpZiAoZHlDIDwgMC4wIHx8IGR5QyA+PSAke2NvbnZJbmZvLm91dFdpZHRofS4wIHx8XG4gICAgICAgICAgICAgICAgZnJhY3QoZHlDKSA+IDAuMCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGludCBpZHlDID0gaW50KGR5Qyk7XG5cbiAgICAgICAgICAgIGZsb2F0IGR5VmFsdWUgPSBnZXREeShiLCBpZHlSLCBpZHlDLCBkKTtcbiAgICAgICAgICAgIGludCBtYXhQb3NWYWx1ZSA9ICR7bGFzdEluZGV4fSAtIGludChnZXRNYXhQb3MoYiwgaWR5UiwgaWR5QywgZCkpO1xuXG4gICAgICAgICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgdmFsdWUsIGNoZWNrIGl0IGFnYWluc3QgdGhlIHZhbHVlIGZyb20gdGhlXG4gICAgICAgICAgICAvLyBwb3NpdGlvbiBtYXRyaXguXG4gICAgICAgICAgICBpbnQgY3VyUG9zVmFsdWUgPSB3UiAqICR7ZWZmZWN0aXZlRmlsdGVyV2lkdGh9ICsgd0M7XG4gICAgICAgICAgICBmbG9hdCBtYXNrID0gZmxvYXQobWF4UG9zVmFsdWUgPT0gY3VyUG9zVmFsdWUgPyAxLjAgOiAwLjApO1xuXG4gICAgICAgICAgICBkb3RQcm9kICs9IGR5VmFsdWUgKiBtYXNrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQoZG90UHJvZCk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgTWF4UG9vbDNEQmFja3Byb3BQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3Rvcihjb252SW5mbykge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ2R5JywgJ21heFBvcyddO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gY29udkluZm8uaW5TaGFwZTtcbiAgICAgICAgY29uc3Qgc3RyaWRlRGVwdGggPSBjb252SW5mby5zdHJpZGVEZXB0aDtcbiAgICAgICAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICAgICAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICAgICAgICBjb25zdCBkaWxhdGlvbkRlcHRoID0gY29udkluZm8uZGlsYXRpb25EZXB0aDtcbiAgICAgICAgY29uc3QgZGlsYXRpb25IZWlnaHQgPSBjb252SW5mby5kaWxhdGlvbkhlaWdodDtcbiAgICAgICAgY29uc3QgZGlsYXRpb25XaWR0aCA9IGNvbnZJbmZvLmRpbGF0aW9uV2lkdGg7XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckRlcHRoID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVyRGVwdGg7XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckhlaWdodDtcbiAgICAgICAgY29uc3QgZWZmZWN0aXZlRmlsdGVyV2lkdGggPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJXaWR0aDtcbiAgICAgICAgY29uc3QgcGFkRnJvbnQgPSBlZmZlY3RpdmVGaWx0ZXJEZXB0aCAtIDEgLSBjb252SW5mby5wYWRJbmZvLmZyb250O1xuICAgICAgICBjb25zdCBwYWRUb3AgPSBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgLSAxIC0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgICAgIGNvbnN0IHBhZExlZnQgPSBlZmZlY3RpdmVGaWx0ZXJXaWR0aCAtIDEgLSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgICAgIGNvbnN0IGxhc3RJbmRleCA9IGVmZmVjdGl2ZUZpbHRlckRlcHRoICogZWZmZWN0aXZlRmlsdGVySGVpZ2h0ICogZWZmZWN0aXZlRmlsdGVyV2lkdGggLSAxO1xuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgY29uc3QgaXZlYzMgcGFkcyA9IGl2ZWMzKCR7cGFkRnJvbnR9LCAke3BhZFRvcH0sICR7cGFkTGVmdH0pO1xuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM1IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHMueDtcbiAgICAgICAgaW50IGNoID0gY29vcmRzLnU7XG5cbiAgICAgICAgaXZlYzMgZHlDb3JuZXIgPSBpdmVjMyhjb29yZHMueSwgY29vcmRzLnosIGNvb3Jkcy53KSAtIHBhZHM7XG4gICAgICAgIGludCBkeURDb3JuZXIgPSBkeUNvcm5lci54O1xuICAgICAgICBpbnQgZHlSQ29ybmVyID0gZHlDb3JuZXIueTtcbiAgICAgICAgaW50IGR5Q0Nvcm5lciA9IGR5Q29ybmVyLno7XG5cbiAgICAgICAgLy8gQ29udm9sdmUgZHkoPywgPywgPywgY2gpIHdpdGggcG9zIG1hc2soOiwgOiwgOiwgZCkgdG8gZ2V0XG4gICAgICAgIC8vIGR4KHhELCB4UiwgeEMsIGNoKS5cbiAgICAgICAgLy8gPyA9IHRvIGJlIGRldGVybWluZWQuIDogPSBhY3Jvc3MgYWxsIHZhbHVlcyBpbiB0aGF0IGF4aXMuXG4gICAgICAgIGZsb2F0IGRvdFByb2QgPSAwLjA7XG5cbiAgICAgICAgZm9yIChpbnQgd0QgPSAwOyB3RCA8ICR7ZWZmZWN0aXZlRmlsdGVyRGVwdGh9O1xuICAgICAgICAgICB3RCArPSAke2RpbGF0aW9uRGVwdGh9KSB7XG4gICAgICAgICAgZmxvYXQgZHlEID0gZmxvYXQoZHlEQ29ybmVyICsgd0QpIC8gJHtzdHJpZGVEZXB0aH0uMDtcblxuICAgICAgICAgIGlmIChkeUQgPCAwLjAgfHwgZHlEID49ICR7Y29udkluZm8ub3V0RGVwdGh9LjAgfHwgZnJhY3QoZHlEKSA+IDAuMCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGludCBpZHlEID0gaW50KGR5RCk7XG5cbiAgICAgICAgICBmb3IgKGludCB3UiA9IDA7IHdSIDwgJHtlZmZlY3RpdmVGaWx0ZXJIZWlnaHR9O1xuICAgICAgICAgICAgICB3UiArPSAke2RpbGF0aW9uSGVpZ2h0fSkge1xuICAgICAgICAgICAgZmxvYXQgZHlSID0gZmxvYXQoZHlSQ29ybmVyICsgd1IpIC8gJHtzdHJpZGVIZWlnaHR9LjA7XG5cbiAgICAgICAgICAgIGlmIChkeVIgPCAwLjAgfHwgZHlSID49ICR7Y29udkluZm8ub3V0SGVpZ2h0fS4wIHx8XG4gICAgICAgICAgICAgICAgZnJhY3QoZHlSKSA+IDAuMCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGludCBpZHlSID0gaW50KGR5Uik7XG5cbiAgICAgICAgICAgIGZvciAoaW50IHdDID0gMDsgd0MgPCAke2VmZmVjdGl2ZUZpbHRlcldpZHRofTtcbiAgICAgICAgICAgICAgICB3QyArPSAke2RpbGF0aW9uV2lkdGh9KSB7XG4gICAgICAgICAgICAgIGZsb2F0IGR5QyA9IGZsb2F0KGR5Q0Nvcm5lciArIHdDKSAvICR7c3RyaWRlV2lkdGh9LjA7XG5cbiAgICAgICAgICAgICAgaWYgKGR5QyA8IDAuMCB8fCBkeUMgPj0gJHtjb252SW5mby5vdXRXaWR0aH0uMCB8fFxuICAgICAgICAgICAgICAgICAgZnJhY3QoZHlDKSA+IDAuMCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGludCBpZHlDID0gaW50KGR5Qyk7XG5cbiAgICAgICAgICAgICAgZmxvYXQgZHlWYWx1ZSA9IGdldER5KGJhdGNoLCBpZHlELCBpZHlSLCBpZHlDLCBjaCk7XG4gICAgICAgICAgICAgIGludCBtYXhQb3NWYWx1ZSA9ICR7bGFzdEluZGV4fSAtXG4gICAgICAgICAgICAgICAgICBpbnQoZ2V0TWF4UG9zKGJhdGNoLCBpZHlELCBpZHlSLCBpZHlDLCBjaCkpO1xuXG4gICAgICAgICAgICAgIC8vIEdldCB0aGUgY3VycmVudCB2YWx1ZSwgY2hlY2sgaXQgYWdhaW5zdCB0aGUgdmFsdWUgZnJvbSB0aGVcbiAgICAgICAgICAgICAgLy8gcG9zaXRpb24gbWF0cml4LlxuICAgICAgICAgICAgICBpbnQgY3VyUG9zVmFsdWUgPVxuICAgICAgICAgICAgICAgICAgd0QgKiAke2VmZmVjdGl2ZUZpbHRlckhlaWdodH0gKiAke2VmZmVjdGl2ZUZpbHRlcldpZHRofSArXG4gICAgICAgICAgICAgICAgICB3UiAqICR7ZWZmZWN0aXZlRmlsdGVyV2lkdGh9ICsgd0M7XG4gICAgICAgICAgICAgIGZsb2F0IG1hc2sgPSBmbG9hdChtYXhQb3NWYWx1ZSA9PSBjdXJQb3NWYWx1ZSA/IDEuMCA6IDAuMCk7XG5cbiAgICAgICAgICAgICAgZG90UHJvZCArPSBkeVZhbHVlICogbWFzaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0T3V0cHV0KGRvdFByb2QpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWF4X3Bvb2xfYmFja3Byb3BfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGNsYXNzIE1lYW5Qcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3RvcihyZWR1Y2VJbmZvLCBkaXZpc29yKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsneCddO1xuICAgICAgICBjb25zdCB7IHdpbmRvd1NpemUsIGJhdGNoU2l6ZSwgaW5TaXplLCBvdXRTaXplIH0gPSByZWR1Y2VJbmZvO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gW2JhdGNoU2l6ZSwgb3V0U2l6ZV07XG4gICAgICAgIGNvbnN0IHdpbmRvd1NpemVOZWFyZXN0VmVjNCA9IE1hdGguZmxvb3Iod2luZG93U2l6ZSAvIDQpICogNDtcbiAgICAgICAgY29uc3Qgd2luZG93U2l6ZVZlYzRSZW1haW5kZXIgPSB3aW5kb3dTaXplICUgNDtcbiAgICAgICAgbGV0IHVwZGF0ZVNuaXBwZXQgPSBgc3VtVmFsdWUgKz0gZG90KHZhbHVlcywgb25lcyk7YDtcbiAgICAgICAgaWYgKGRpdmlzb3IgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgZGVub21pbmF0b3IgPSAxIC8gZGl2aXNvcjtcbiAgICAgICAgICAgIHVwZGF0ZVNuaXBwZXQgPSBgc3VtVmFsdWUgKz0gZG90KHZhbHVlcyAqICR7dXRpbC5pc0ludChkZW5vbWluYXRvcikgPyBkZW5vbWluYXRvci50b1ByZWNpc2lvbigyKSA6XG4gICAgICAgICAgICAgICAgZGVub21pbmF0b3J9LCBvbmVzKTtgO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjaGVja091dE9mQm91bmRzID0gJyc7XG4gICAgICAgIGlmIChpblNpemUgJSB3aW5kb3dTaXplID4gMCkge1xuICAgICAgICAgICAgY2hlY2tPdXRPZkJvdW5kcyA9IGBcbiAgICAgICAgaWYgKGluSWR4IDwgMCB8fCBpbklkeCA+PSAke2luU2l6ZX0pIHtcbiAgICAgICAgICByZXR1cm4gMC4wO1xuICAgICAgICB9XG4gICAgICBgO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCB2ZWM0IG9uZXMgPSB2ZWM0KDEuMCwgMS4wLCAxLjAsIDEuMCk7XG5cbiAgICAgIGZsb2F0IGdldFZhbHVlKGludCBiYXRjaCwgaW50IGluSWR4KSB7XG4gICAgICAgICR7Y2hlY2tPdXRPZkJvdW5kc31cbiAgICAgICAgcmV0dXJuIGdldFgoYmF0Y2gsIGluSWR4KTtcbiAgICAgIH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMiBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgb3V0SWR4ID0gY29vcmRzWzFdO1xuICAgICAgICBpbnQgaW5PZmZzZXQgPSBvdXRJZHggKiAke3dpbmRvd1NpemV9O1xuXG4gICAgICAgIGZsb2F0IHN1bVZhbHVlID0gMC4wO1xuXG4gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgJHt3aW5kb3dTaXplTmVhcmVzdFZlYzR9OyBpICs9IDQpIHtcbiAgICAgICAgICBpbnQgaW5JZHggPSBpbk9mZnNldCArIGk7XG4gICAgICAgICAgdmVjNCB2YWx1ZXMgPSB2ZWM0KFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4KSxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDEpLFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4ICsgMiksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAzKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAke3VwZGF0ZVNuaXBwZXR9XG4gICAgICAgIH1cblxuICAgICAgICBpbnQgaW5JZHggPSBpbk9mZnNldCArICR7d2luZG93U2l6ZU5lYXJlc3RWZWM0fTtcbiAgICAgICAgaWYgKCR7d2luZG93U2l6ZVZlYzRSZW1haW5kZXIgPT09IDF9KSB7XG4gICAgICAgICAgdmVjNCB2YWx1ZXMgPSB2ZWM0KGdldFZhbHVlKGJhdGNoLCBpbklkeCksIDAuMCwgMC4wLCAwLjApO1xuXG4gICAgICAgICAgJHt1cGRhdGVTbmlwcGV0fVxuICAgICAgICB9IGVsc2UgaWYgKCR7d2luZG93U2l6ZVZlYzRSZW1haW5kZXIgPT09IDJ9KSB7XG4gICAgICAgICAgdmVjNCB2YWx1ZXMgPSB2ZWM0KFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4KSxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDEpLCAwLjAsIDAuMCk7XG5cbiAgICAgICAgICAke3VwZGF0ZVNuaXBwZXR9XG4gICAgICAgIH0gZWxzZSBpZiAoJHt3aW5kb3dTaXplVmVjNFJlbWFpbmRlciA9PT0gM30pIHtcbiAgICAgICAgICB2ZWM0IHZhbHVlcyA9IHZlYzQoXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHgpLFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4ICsgMSksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAyKSwgMC4wKTtcblxuICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQoc3VtVmFsdWUpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVhbl9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZ2V0Q29vcmRzRGF0YVR5cGUgfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5leHBvcnQgY2xhc3MgTWlycm9yUGFkUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoeFNoYXBlLCBwYWRkaW5ncywgbW9kZSkge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IHBhZGRpbmdzLm1hcCgocCwgaSkgPT4gcFswXSAvKiBiZWZvcmVQYWQgKi8gKyB4U2hhcGVbaV0gKyBwWzFdIC8qIGFmdGVyUGFkICovKTtcbiAgICAgICAgY29uc3QgcmFuayA9IHhTaGFwZS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGR0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUocmFuayk7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gcGFkZGluZ3MubWFwKHAgPT4gcFswXSkuam9pbignLCcpO1xuICAgICAgICBjb25zdCBlbmQgPSBwYWRkaW5ncy5tYXAoKHAsIGkpID0+IHBbMF0gKyB4U2hhcGVbaV0pLmpvaW4oJywnKTtcbiAgICAgICAgY29uc3QgdW5wYWNrZWRDb29yZHMgPSBbJ2Nvb3Jkc1swXScsICdjb29yZHNbMV0nLCAnY29vcmRzWzJdJywgJ2Nvb3Jkc1szXSddLnNsaWNlKDAsIHJhbmspO1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBtb2RlID09PSAncmVmbGVjdCcgPyAwIDogMTtcbiAgICAgICAgaWYgKHJhbmsgPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAgIGludCBzdGFydCA9ICR7c3RhcnR9O1xuICAgICAgICBpbnQgZW5kID0gJHtlbmR9O1xuXG4gICAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgICBpbnQgb3V0QyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgIGlmIChvdXRDIDwgc3RhcnQpIHtcbiAgICAgICAgICAgIG91dEMgPSBzdGFydCAqIDIgLSBvdXRDIC0gJHtvZmZzZXR9O1xuICAgICAgICAgIH0gZWxzZSBpZihvdXRDID49IGVuZCkge1xuICAgICAgICAgICAgb3V0QyA9IChlbmQgLSAxKSAqIDIgLSBvdXRDICsgJHtvZmZzZXR9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZXRPdXRwdXQoZ2V0WChvdXRDIC0gc3RhcnQpKTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgJHtkdHlwZX0gc3RhcnQgPSAke2R0eXBlfSgke3N0YXJ0fSk7XG4gICAgICAke2R0eXBlfSBlbmQgPSAke2R0eXBlfSgke2VuZH0pO1xuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICR7ZHR5cGV9IG91dEMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAke3Jhbmt9OyBpKyspIHtcbiAgICAgICAgICBpZiAob3V0Q1tpXSA8IHN0YXJ0W2ldKSB7XG4gICAgICAgICAgICBvdXRDW2ldID0gc3RhcnRbaV0gKiAyIC0gb3V0Q1tpXSAtICR7b2Zmc2V0fTtcbiAgICAgICAgICB9IGVsc2UgaWYob3V0Q1tpXSA+PSBlbmRbaV0pIHtcbiAgICAgICAgICAgIG91dENbaV0gPSAoZW5kW2ldIC0gMSkgKiAyIC0gb3V0Q1tpXSArICR7b2Zmc2V0fTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgJHtkdHlwZX0gY29vcmRzID0gb3V0QyAtIHN0YXJ0O1xuICAgICAgICBzZXRPdXRwdXQoZ2V0WCgke3VucGFja2VkQ29vcmRzfSkpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWlycm9yX3BhZF9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZ2V0Q2hhbm5lbHMgfSBmcm9tICcuL3BhY2tpbmdfdXRpbCc7XG5pbXBvcnQgeyBnZXRDb29yZHNEYXRhVHlwZSB9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcbi8qKlxuICogRXhhbXBsZSBzaGFkZXIgY29kZSBmb3JcbiAqIGBtaXJyb3JQYWQodGYudGVuc29yMWQoWzEsIDIsIDNdLCAnaW50MzInKSwgW1syLCAyXV0sICdyZWZsZWN0JylgXG4gKiBgYGBcbiAqICAgIGNvbnN0IGludCBzdGFydCA9IGludCgyKTtcbiAqICAgIGNvbnN0IGludCBlbmQgPSBpbnQoNSk7XG4gKlxuICogICAgdm9pZCBtYWluKCkge1xuICogICAgICAgaW50IG91dHB1dExvYyA9IGdldE91dHB1dENvb3JkcygpO1xuICogICAgICAgdmVjNCByZXN1bHQgPSB2ZWM0KDAuKTtcbiAqXG4gKiAgICAgICBpbnQgcmMgPSBvdXRwdXRMb2M7XG4gKlxuICogICAgICAgaW50IHNvdXJjZSA9IHJjO1xuICogICAgICAgaWYgKHNvdXJjZSA8IHN0YXJ0KSB7XG4gKiAgICAgICAgIHNvdXJjZSA9IHN0YXJ0ICogMiAtIHNvdXJjZSAtIDA7XG4gKiAgICAgICB9IGVsc2UgaWYgKHNvdXJjZSA+PSBlbmQpIHtcbiAqICAgICAgICAgc291cmNlID0gKGVuZCAtIDEpICogMiAtIHNvdXJjZSArIDA7XG4gKiAgICAgICB9XG4gKiAgICAgICBzb3VyY2UgLT0gc3RhcnQ7XG4gKlxuICogICAgICAgcmVzdWx0WzBdID0gZ2V0Q2hhbm5lbChnZXRYKHNvdXJjZSksIHNvdXJjZSk7XG4gKiAgICAgICByYyArPSAxO1xuICogICAgICAgaWYocmMgPCA2KSB7XG4gKiAgICAgICAgICBpbnQgc291cmNlID0gcmM7XG4gKiAgICAgICAgICBpZiAoc291cmNlIDwgc3RhcnQpIHtcbiAqICAgICAgICAgICAgc291cmNlID0gc3RhcnQgKiAyIC0gc291cmNlIC0gMDtcbiAqICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlID49IGVuZCkge1xuICogICAgICAgICAgICBzb3VyY2UgPSAoZW5kIC0gMSkgKiAyIC0gc291cmNlICsgMDtcbiAqICAgICAgICAgIH1cbiAqICAgICAgICAgIHNvdXJjZSAtPSBzdGFydDtcbiAqXG4gKiAgICAgICAgIHJlc3VsdFsxXSA9IGdldENoYW5uZWwoZ2V0WChzb3VyY2UpLCBzb3VyY2UpO1xuICogICAgICAgfVxuICpcbiAqICAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICogICAgIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgTWlycm9yUGFkUGFja2VkUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoeFNoYXBlLCBwYWRkaW5ncywgbW9kZSkge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgICAgICAgdGhpcy5wYWNrZWRJbnB1dHMgPSB0cnVlO1xuICAgICAgICB0aGlzLnBhY2tlZE91dHB1dCA9IHRydWU7XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBwYWRkaW5ncy5tYXAoKHAsIGkpID0+IHBbMF0gLyogYmVmb3JlUGFkICovICsgeFNoYXBlW2ldICsgcFsxXSAvKiBhZnRlclBhZCAqLyk7XG4gICAgICAgIGNvbnN0IHJhbmsgPSB4U2hhcGUubGVuZ3RoO1xuICAgICAgICBjb25zdCBkdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHJhbmspO1xuICAgICAgICBjb25zdCBzdGFydCA9IHBhZGRpbmdzLm1hcChwID0+IHBbMF0pLmpvaW4oJywnKTtcbiAgICAgICAgY29uc3QgZW5kID0gcGFkZGluZ3MubWFwKChwLCBpKSA9PiBwWzBdICsgeFNoYXBlW2ldKS5qb2luKCcsJyk7XG4gICAgICAgIGNvbnN0IGNvb3JkcyA9IGdldENoYW5uZWxzKCdyYycsIHJhbmspO1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBnZXRDaGFubmVscygnc291cmNlJywgcmFuayk7XG4gICAgICAgIGNvbnN0IGNMaW1pdCA9IGAke2Nvb3Jkc1tyYW5rIC0gMV19IDwgJHt0aGlzLm91dHB1dFNoYXBlW3JhbmsgLSAxXX1gO1xuICAgICAgICBjb25zdCBpbm5lckRpbXMgPSByYW5rID09PSAxID8gJ3NvdXJjZScgOiBgdmVjMigke3NvdXJjZS5zbGljZSgtMikuam9pbigpfSlgO1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBtb2RlID09PSAncmVmbGVjdCcgPyAwIDogMTtcbiAgICAgICAgbGV0IG1haW5Mb29wID0gJyc7XG4gICAgICAgIGlmIChyYW5rID09PSAxKSB7XG4gICAgICAgICAgICBjb25zdCBwYWRTZXR1cCA9IGBcbiAgICAgICAgJHtkdHlwZX0gc291cmNlID0gcmM7XG4gICAgICAgIGlmIChzb3VyY2UgPCBzdGFydCkge1xuICAgICAgICAgIHNvdXJjZSA9IHN0YXJ0ICogMiAtIHNvdXJjZSAtICR7b2Zmc2V0fTtcbiAgICAgICAgfSBlbHNlIGlmIChzb3VyY2UgPj0gZW5kKSB7XG4gICAgICAgICAgc291cmNlID0gKGVuZCAtIDEpICogMiAtIHNvdXJjZSArICR7b2Zmc2V0fTtcbiAgICAgICAgfVxuICAgICAgICBzb3VyY2UgLT0gc3RhcnQ7XG4gICAgICBgO1xuICAgICAgICAgICAgbWFpbkxvb3AgPSBgXG4gICAgICAgICR7ZHR5cGV9IHJjID0gb3V0cHV0TG9jO1xuICAgICAgICAke3BhZFNldHVwfVxuICAgICAgICByZXN1bHRbMF0gPSBnZXRDaGFubmVsKGdldFgoJHtzb3VyY2Uuam9pbigpfSksICR7aW5uZXJEaW1zfSk7XG4gICAgICAgICR7Y29vcmRzW3JhbmsgLSAxXX0gKz0gMTtcbiAgICAgICAgaWYoJHtjTGltaXR9KSB7XG4gICAgICAgICAgJHtwYWRTZXR1cH1cbiAgICAgICAgICByZXN1bHRbMV0gPSBnZXRDaGFubmVsKGdldFgoJHtzb3VyY2Uuam9pbigpfSksICR7aW5uZXJEaW1zfSk7XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBwYWRTZXR1cCA9IGBcbiAgICAgICAgJHtkdHlwZX0gc291cmNlID0gcmM7XG4gICAgICAgICR7ZHR5cGV9IGx0ID0gJHtkdHlwZX0obGVzc1RoYW4oc291cmNlLCBzdGFydCkpO1xuICAgICAgICAke2R0eXBlfSBndGUgPSAke2R0eXBlfShncmVhdGVyVGhhbkVxdWFsKHNvdXJjZSwgZW5kKSk7XG4gICAgICAgICR7ZHR5cGV9IG9yaWcgPSAxIC0gKGx0ICsgZ3RlKTtcbiAgICAgICAgc291cmNlID0gb3JpZyAqIHNvdXJjZSArXG4gICAgICAgICAgICAgICAgbHQgKiAoc3RhcnQgKiAyIC0gc291cmNlIC0gJHtvZmZzZXR9KSArXG4gICAgICAgICAgICAgICAgZ3RlICogKChlbmQgLSAxKSAqIDIgLSBzb3VyY2UgKyAke29mZnNldH0pO1xuICAgICAgICBzb3VyY2UgLT0gc3RhcnQ7XG4gICAgICBgO1xuICAgICAgICAgICAgbWFpbkxvb3AgPSBgXG4gICAgICAgICR7ZHR5cGV9IHJjID0gb3V0cHV0TG9jO1xuICAgICAgICAke3BhZFNldHVwfVxuICAgICAgICByZXN1bHRbMF0gPSBnZXRDaGFubmVsKGdldFgoJHtzb3VyY2Uuam9pbigpfSksICR7aW5uZXJEaW1zfSk7XG4gICAgICAgICR7Y29vcmRzW3JhbmsgLSAxXX0gKz0gMTtcbiAgICAgICAgaWYoJHtjTGltaXR9KSB7XG4gICAgICAgICAgJHtwYWRTZXR1cH1cbiAgICAgICAgICByZXN1bHRbMV0gPSBnZXRDaGFubmVsKGdldFgoJHtzb3VyY2Uuam9pbigpfSksICR7aW5uZXJEaW1zfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmMgPSBvdXRwdXRMb2M7XG4gICAgICAgICR7Y29vcmRzW3JhbmsgLSAyXX0gKz0gMTtcbiAgICAgICAgaWYoJHtjb29yZHNbcmFuayAtIDJdfSA8ICR7dGhpcy5vdXRwdXRTaGFwZVtyYW5rIC0gMl19KSB7XG4gICAgICAgICAgJHtwYWRTZXR1cH1cbiAgICAgICAgICByZXN1bHRbMl0gPSBnZXRDaGFubmVsKGdldFgoJHtzb3VyY2Uuam9pbigpfSksICR7aW5uZXJEaW1zfSk7XG4gICAgICAgICAgJHtjb29yZHNbcmFuayAtIDFdfSArPSAxO1xuICAgICAgICAgIGlmKCR7Y0xpbWl0fSkge1xuICAgICAgICAgICAgJHtwYWRTZXR1cH1cbiAgICAgICAgICAgIHJlc3VsdFszXSA9IGdldENoYW5uZWwoZ2V0WCgke3NvdXJjZS5qb2luKCl9KSwgJHtpbm5lckRpbXN9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0ICR7ZHR5cGV9IHN0YXJ0ID0gJHtkdHlwZX0oJHtzdGFydH0pO1xuICAgICAgY29uc3QgJHtkdHlwZX0gZW5kID0gJHtkdHlwZX0oJHtlbmR9KTtcblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke2R0eXBlfSBvdXRwdXRMb2MgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgdmVjNCByZXN1bHQgPSB2ZWM0KDAuKTtcbiAgICAgICAgJHttYWluTG9vcH1cbiAgICAgICAgc2V0T3V0cHV0KHJlc3VsdCk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1taXJyb3JfcGFkX3BhY2tlZF9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuZXhwb3J0IGNsYXNzIE1hdE11bFBhY2tlZFByb2dyYW0ge1xuICAgIGNvbnN0cnVjdG9yKGFTaGFwZSwgYlNoYXBlLCBvdXRwdXRTaGFwZSwgdHJhbnNwb3NlQSA9IGZhbHNlLCB0cmFuc3Bvc2VCID0gZmFsc2UsIGFkZEJpYXMgPSBmYWxzZSwgYWN0aXZhdGlvbiA9IG51bGwsIGhhc1ByZWx1QWN0aXZhdGlvbiA9IGZhbHNlLCBoYXNMZWFreXJlbHVBY3RpdmF0aW9uID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWydtYXRyaXhBJywgJ21hdHJpeEInXTtcbiAgICAgICAgdGhpcy5wYWNrZWRJbnB1dHMgPSB0cnVlO1xuICAgICAgICB0aGlzLnBhY2tlZE91dHB1dCA9IHRydWU7XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICAgICAgY29uc3Qgc2hhcmVkRGltID0gdHJhbnNwb3NlQSA/IGFTaGFwZVsxXSA6IGFTaGFwZVsyXTtcbiAgICAgICAgY29uc3Qgc2hhcmVkRGltZW5zaW9uUGFja2VkID0gTWF0aC5jZWlsKHNoYXJlZERpbSAvIDIpO1xuICAgICAgICBjb25zdCBhU2FtcGxlID0gdHJhbnNwb3NlQSA/ICdpICogMiwgcmMueScgOiAncmMueSwgaSAqIDInO1xuICAgICAgICBjb25zdCBiU2FtcGxlID0gdHJhbnNwb3NlQiA/ICdyYy56LCBpICogMicgOiAnaSAqIDIsIHJjLnonO1xuICAgICAgICBjb25zdCBhU3dpenpsZSA9IHRyYW5zcG9zZUEgPyBbJ2EueHh5eScsICdhLnp6d3cnXSA6IFsnYS54eHp6JywgJ2EueXl3dyddO1xuICAgICAgICBjb25zdCBiU3dpenpsZSA9IHRyYW5zcG9zZUIgPyBbJ2IueHp4eicsICdiLnl3eXcnXSA6IFsnYi54eXh5JywgJ2Iuend6dyddO1xuICAgICAgICBsZXQgYWN0aXZhdGlvblNuaXBwZXQgPSAnJywgYXBwbHlBY3RpdmF0aW9uU25pcHBldCA9ICcnO1xuICAgICAgICBpZiAoYWN0aXZhdGlvbikge1xuICAgICAgICAgICAgaWYgKGhhc1ByZWx1QWN0aXZhdGlvbikge1xuICAgICAgICAgICAgICAgIGFjdGl2YXRpb25TbmlwcGV0ID0gYHZlYzQgYWN0aXZhdGlvbih2ZWM0IGEpIHtcbiAgICAgICAgICB2ZWM0IGIgPSBnZXRQcmVsdUFjdGl2YXRpb25XZWlnaHRzQXRPdXRDb29yZHMoKTtcbiAgICAgICAgICAke2FjdGl2YXRpb259XG4gICAgICAgIH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaGFzTGVha3lyZWx1QWN0aXZhdGlvbikge1xuICAgICAgICAgICAgICAgIGFjdGl2YXRpb25TbmlwcGV0ID0gYHZlYzQgYWN0aXZhdGlvbih2ZWM0IGEpIHtcbiAgICAgICAgICB2ZWM0IGIgPSBnZXRMZWFreXJlbHVBbHBoYUF0T3V0Q29vcmRzKCk7XG4gICAgICAgICAgJHthY3RpdmF0aW9ufVxuICAgICAgICB9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGFjdGl2YXRpb25TbmlwcGV0ID0gYHZlYzQgYWN0aXZhdGlvbih2ZWM0IHgpIHtcbiAgICAgICAgICAke2FjdGl2YXRpb259XG4gICAgICAgIH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXBwbHlBY3RpdmF0aW9uU25pcHBldCA9IGByZXN1bHQgPSBhY3RpdmF0aW9uKHJlc3VsdCk7YDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhZGRCaWFzU25pcHBldCA9IGFkZEJpYXMgPyAncmVzdWx0ICs9IGdldEJpYXNBdE91dENvb3JkcygpOycgOiAnJztcbiAgICAgICAgaWYgKGFkZEJpYXMpIHtcbiAgICAgICAgICAgIHRoaXMudmFyaWFibGVOYW1lcy5wdXNoKCdiaWFzJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc1ByZWx1QWN0aXZhdGlvbikge1xuICAgICAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzLnB1c2goJ3ByZWx1QWN0aXZhdGlvbldlaWdodHMnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzTGVha3lyZWx1QWN0aXZhdGlvbikge1xuICAgICAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzLnB1c2goJ2xlYWt5cmVsdUFscGhhJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGJhdGNoQVNuaXBwZXQgPSAncmMueCc7XG4gICAgICAgIGxldCBiYXRjaEJTbmlwcGV0ID0gJ3JjLngnO1xuICAgICAgICBpZiAoYVNoYXBlWzBdIDwgYlNoYXBlWzBdKSB7XG4gICAgICAgICAgICBiYXRjaEFTbmlwcGV0ID0gYGludChtaW4oZmxvYXQocmMueCksICR7YVNoYXBlWzBdIC0gMX0uKSlgO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGJTaGFwZVswXSA8IGFTaGFwZVswXSkge1xuICAgICAgICAgICAgYmF0Y2hCU25pcHBldCA9IGBpbnQobWluKGZsb2F0KHJjLngpLCAke2JTaGFwZVswXSAtIDF9LikpYDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgJHthY3RpdmF0aW9uU25pcHBldH1cblxuICAgICAgY29uc3QgZmxvYXQgc2hhcmVkRGltZW5zaW9uID0gJHtzaGFyZWREaW1lbnNpb25QYWNrZWR9LjA7XG5cbiAgICAgIHZlYzQgZG90MngyQVJvd0JDb2woaXZlYzMgcmMpIHtcbiAgICAgICAgdmVjNCByZXN1bHQgPSB2ZWM0KDApO1xuICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8ICR7c2hhcmVkRGltZW5zaW9uUGFja2VkfTsgaSsrKSB7XG4gICAgICAgICAgaW50IGJhdGNoQSA9ICR7YmF0Y2hBU25pcHBldH07XG4gICAgICAgICAgaW50IGJhdGNoQiA9ICR7YmF0Y2hCU25pcHBldH07XG4gICAgICAgICAgdmVjNCBhID0gZ2V0TWF0cml4QShiYXRjaEEsICR7YVNhbXBsZX0pO1xuICAgICAgICAgIHZlYzQgYiA9IGdldE1hdHJpeEIoYmF0Y2hCLCAke2JTYW1wbGV9KTtcblxuICAgICAgICAgIC8vIFRoZXNlIHN3aXp6bGVkIHByb2R1Y3RzIG5lZWQgdG8gYmUgc2VwYXJhdGVseSBhZGRlZC5cbiAgICAgICAgICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RmanMvaXNzdWVzLzE3MzVcbiAgICAgICAgICByZXN1bHQgKz0gKCR7YVN3aXp6bGVbMF19ICogJHtiU3dpenpsZVswXX0pO1xuICAgICAgICAgIHJlc3VsdCArPSAoJHthU3dpenpsZVsxXX0gKiAke2JTd2l6emxlWzFdfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMyByYyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICB2ZWM0IHJlc3VsdCA9IGRvdDJ4MkFSb3dCQ29sKHJjKTtcblxuICAgICAgICAke2FkZEJpYXNTbmlwcGV0fVxuXG4gICAgICAgICR7YXBwbHlBY3RpdmF0aW9uU25pcHBldH1cblxuICAgICAgICBzZXRPdXRwdXQocmVzdWx0KTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW11bG1hdF9wYWNrZWRfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmV4cG9ydCBjbGFzcyBNdWx0aW5vbWlhbFByb2dyYW0ge1xuICAgIGNvbnN0cnVjdG9yKGJhdGNoU2l6ZSwgbnVtT3V0Y29tZXMsIG51bVNhbXBsZXMpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWydwcm9icyddO1xuICAgICAgICB0aGlzLmN1c3RvbVVuaWZvcm1zID0gW3sgbmFtZTogJ3NlZWQnLCB0eXBlOiAnZmxvYXQnIH1dO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gW2JhdGNoU2l6ZSwgbnVtU2FtcGxlc107XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWMyIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHNbMF07XG5cbiAgICAgICAgZmxvYXQgciA9IHJhbmRvbShzZWVkKTtcbiAgICAgICAgZmxvYXQgY2RmID0gMC4wO1xuXG4gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgJHtudW1PdXRjb21lcyAtIDF9OyBpKyspIHtcbiAgICAgICAgICBjZGYgKz0gZ2V0UHJvYnMoYmF0Y2gsIGkpO1xuXG4gICAgICAgICAgaWYgKHIgPCBjZGYpIHtcbiAgICAgICAgICAgIHNldE91dHB1dChmbG9hdChpKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgbm8gb3RoZXIgZXZlbnQgaGFwcGVuZWQsIGxhc3QgZXZlbnQgaGFwcGVuZWQuXG4gICAgICAgIHNldE91dHB1dChmbG9hdCgke251bU91dGNvbWVzIC0gMX0pKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW11bHRpbm9taWFsX2dwdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5leHBvcnQgY2xhc3MgT25lSG90UHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IobnVtSW5kaWNlcywgZGVwdGgsIG9uVmFsdWUsIG9mZlZhbHVlKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsnaW5kaWNlcyddO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gW251bUluZGljZXMsIGRlcHRoXTtcbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzIgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBpbmRleCA9IHJvdW5kKGdldEluZGljZXMoY29vcmRzLngpKTtcbiAgICAgICAgc2V0T3V0cHV0KG1peChmbG9hdCgke29mZlZhbHVlfSksIGZsb2F0KCR7b25WYWx1ZX0pLFxuICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KGluZGV4ID09IGNvb3Jkcy55KSkpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b25laG90X2dwdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBnZXRDaGFubmVscyB9IGZyb20gJy4vcGFja2luZ191dGlsJztcbmltcG9ydCB7IGdldENvb3Jkc0RhdGFUeXBlIH0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuZXhwb3J0IGNsYXNzIFBhY2tQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3RvcihvdXRwdXRTaGFwZSkge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgICAgICAgdGhpcy5wYWNrZWRJbnB1dHMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wYWNrZWRPdXRwdXQgPSB0cnVlO1xuICAgICAgICAvLyBPbmx5IGlucHV0IC8gb3V0cHV0IDNEIHRlbnNvcnMuXG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICAgICAgY29uc3QgcmFuayA9IG91dHB1dFNoYXBlLmxlbmd0aDtcbiAgICAgICAgaWYgKHJhbmsgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgICBzZXRPdXRwdXQodmVjNChnZXRBKCksIDAuLCAwLiwgMC4pKTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGNoYW5uZWxzID0gZ2V0Q2hhbm5lbHMoJ3JjJywgcmFuayk7XG4gICAgICAgICAgICBjb25zdCBkdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHJhbmspO1xuICAgICAgICAgICAgY29uc3Qgb3V0T2ZCb3VuZHNDb25kaXRpb24gPSBnZXRPdXRPZkJvdW5kc0NvbmRpdGlvbihyYW5rLCBvdXRwdXRTaGFwZSwgY2hhbm5lbHMpO1xuICAgICAgICAgICAgY29uc3Qgc2V0dXAgPSBnZXRTZXR1cChyYW5rLCBvdXRwdXRTaGFwZVtvdXRwdXRTaGFwZS5sZW5ndGggLSAxXSwgb3V0cHV0U2hhcGVbb3V0cHV0U2hhcGUubGVuZ3RoIC0gMl0sIGNoYW5uZWxzKTtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dCA9IGdldE91dHB1dChvdXRwdXRTaGFwZSwgY2hhbm5lbHMpO1xuICAgICAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgICR7ZHR5cGV9IHJjID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG5cbiAgICAgICAgICBpZigke291dE9mQm91bmRzQ29uZGl0aW9ufSkge1xuICAgICAgICAgICAgc2V0T3V0cHV0KHZlYzQoMCkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAke3NldHVwfVxuXG4gICAgICAgICAgICBzZXRPdXRwdXQodmVjNCgke291dHB1dH0pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBnZXRTb3VyY2VDb29yZHNBcnIocmFuaywgZGltcykge1xuICAgIGNvbnN0IGNvb3JkcyA9IFtdO1xuICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8PSAxOyByb3crKykge1xuICAgICAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPD0gMTsgY29sKyspIHtcbiAgICAgICAgICAgIGxldCBjb29yZCA9IGAke3JvdyA9PT0gMCA/ICdyJyA6ICdycDEnfSwgJHtjb2wgPT09IDAgPyAnYycgOiAnY3AxJ31gO1xuICAgICAgICAgICAgZm9yIChsZXQgZCA9IDI7IGQgPCByYW5rOyBkKyspIHtcbiAgICAgICAgICAgICAgICBjb29yZCA9IGAke2RpbXNbZGltcy5sZW5ndGggLSAxIC0gZF19LGAgKyBjb29yZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvb3Jkcy5wdXNoKGNvb3JkKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29vcmRzO1xufVxuZnVuY3Rpb24gZ2V0T3V0T2ZCb3VuZHNDb25kaXRpb24ocmFuaywgc2hhcGUsIGRpbXMpIHtcbiAgICBpZiAocmFuayA9PT0gMSkge1xuICAgICAgICByZXR1cm4gYHJjID4gJHtzaGFwZVswXX1gO1xuICAgIH1cbiAgICBsZXQgY29uZCA9ICcnO1xuICAgIGZvciAobGV0IGkgPSByYW5rIC0gMjsgaSA8IHJhbms7IGkrKykge1xuICAgICAgICBjb25kICs9IGAke2RpbXNbaV19ID49ICR7c2hhcGVbaV19YDtcbiAgICAgICAgaWYgKGkgPCByYW5rIC0gMSkge1xuICAgICAgICAgICAgY29uZCArPSAnfHwnO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb25kO1xufVxuZnVuY3Rpb24gZ2V0U2V0dXAocmFuaywgY29scywgcm93cywgZGltcykge1xuICAgIGlmIChyYW5rID09PSAxKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgY29uc3QgaW5uZXJEaW1zID0gZGltcy5zbGljZSgtMik7XG4gICAgcmV0dXJuIGBcbiAgICBpbnQgciA9ICR7aW5uZXJEaW1zWzBdfTtcbiAgICBpbnQgYyA9ICR7aW5uZXJEaW1zWzFdfTtcbiAgICBpbnQgcnAxID0gciArIDE7XG4gICAgaW50IGNwMSA9IGMgKyAxO1xuXG4gICAgYm9vbCBjRWRnZSA9IGNwMSA+PSAke2NvbHN9O1xuICAgIGJvb2wgckVkZ2UgPSBycDEgPj0gJHtyb3dzfTtcbiAgYDtcbn1cbmZ1bmN0aW9uIGdldE91dHB1dChzaGFwZSwgZGltcykge1xuICAgIGNvbnN0IHJhbmsgPSBzaGFwZS5sZW5ndGg7XG4gICAgY29uc3Qgc291cmNlQ29vcmRzID0gZ2V0U291cmNlQ29vcmRzQXJyKHJhbmssIGRpbXMpO1xuICAgIGlmIChyYW5rID09PSAxKSB7XG4gICAgICAgIHJldHVybiBgZ2V0QShyYyksXG4gICAgICAgICAgICByYyArIDEgPj0gJHtzaGFwZVswXX0gPyAwLiA6IGdldEEocmMgKyAxKSxcbiAgICAgICAgICAgIDAsIDBgO1xuICAgIH1cbiAgICByZXR1cm4gYGdldEEoJHtzb3VyY2VDb29yZHNbMF19KSxcbiAgICAgICAgICBjRWRnZSA/IDAuIDogZ2V0QSgke3NvdXJjZUNvb3Jkc1sxXX0pLFxuICAgICAgICAgIHJFZGdlID8gMC4gOiBnZXRBKCR7c291cmNlQ29vcmRzWzJdfSksXG4gICAgICAgICAgckVkZ2UgfHwgY0VkZ2UgPyAwLiA6IGdldEEoJHtzb3VyY2VDb29yZHNbM119KWA7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYWNrX2dwdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmVjQ2hhbm5lbHMobmFtZSwgcmFuaykge1xuICAgIHJldHVybiBbJ3gnLCAneScsICd6JywgJ3cnLCAndScsICd2J10uc2xpY2UoMCwgcmFuaykubWFwKGQgPT4gYCR7bmFtZX0uJHtkfWApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldENoYW5uZWxzKG5hbWUsIHJhbmspIHtcbiAgICBpZiAocmFuayA9PT0gMSkge1xuICAgICAgICByZXR1cm4gW25hbWVdO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0VmVjQ2hhbm5lbHMobmFtZSwgcmFuayk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0U291cmNlQ29vcmRzKHJhbmssIGRpbXMpIHtcbiAgICBpZiAocmFuayA9PT0gMSkge1xuICAgICAgICByZXR1cm4gJ3JjJztcbiAgICB9XG4gICAgbGV0IGNvb3JkcyA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuazsgaSsrKSB7XG4gICAgICAgIGNvb3JkcyArPSBkaW1zW2ldO1xuICAgICAgICBpZiAoaSA8IHJhbmsgLSAxKSB7XG4gICAgICAgICAgICBjb29yZHMgKz0gJywnO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb29yZHM7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYWNraW5nX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZ2V0Q29vcmRzRGF0YVR5cGUgfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5leHBvcnQgY2xhc3MgUGFkUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoeFNoYXBlLCBwYWRkaW5ncywgY29uc3RhbnRWYWx1ZSkge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgICAgICAgdGhpcy5jdXN0b21Vbmlmb3JtcyA9IFt7IG5hbWU6ICd2YWx1ZScsIHR5cGU6ICdmbG9hdCcgfV07XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBwYWRkaW5ncy5tYXAoKHAsIGkpID0+IHBbMF0gLyogYmVmb3JlUGFkICovICsgeFNoYXBlW2ldICsgcFsxXSAvKiBhZnRlclBhZCAqLyk7XG4gICAgICAgIGNvbnN0IHJhbmsgPSB4U2hhcGUubGVuZ3RoO1xuICAgICAgICBjb25zdCB0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUocmFuayk7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gcGFkZGluZ3MubWFwKHAgPT4gcFswXSkuam9pbignLCcpO1xuICAgICAgICBjb25zdCBlbmQgPSBwYWRkaW5ncy5tYXAoKHAsIGkpID0+IHBbMF0gKyB4U2hhcGVbaV0pLmpvaW4oJywnKTtcbiAgICAgICAgY29uc3QgdW5wYWNrZWRDb29yZHMgPSBbJ2Nvb3Jkc1swXScsICdjb29yZHNbMV0nLCAnY29vcmRzWzJdJywgJ2Nvb3Jkc1szXSddLnNsaWNlKDAsIHJhbmspO1xuICAgICAgICBpZiAocmFuayA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICAgaW50IHN0YXJ0ID0gJHtzdGFydH07XG4gICAgICAgIGludCBlbmQgPSAke2VuZH07XG5cbiAgICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgIGludCBvdXRDID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgICAgaWYgKG91dEMgPCBzdGFydCB8fCBvdXRDID49IGVuZCkge1xuICAgICAgICAgICAgc2V0T3V0cHV0KHZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2V0T3V0cHV0KGdldFgob3V0QyAtIHN0YXJ0KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBgO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAke3R5cGV9IHN0YXJ0ID0gJHt0eXBlfSgke3N0YXJ0fSk7XG4gICAgICAke3R5cGV9IGVuZCA9ICR7dHlwZX0oJHtlbmR9KTtcblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke3R5cGV9IG91dEMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaWYgKGFueShsZXNzVGhhbihvdXRDLCBzdGFydCkpIHx8IGFueShncmVhdGVyVGhhbkVxdWFsKG91dEMsIGVuZCkpKSB7XG4gICAgICAgICAgc2V0T3V0cHV0KHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAke3R5cGV9IGNvb3JkcyA9IG91dEMgLSBzdGFydDtcbiAgICAgICAgICBzZXRPdXRwdXQoZ2V0WCgke3VucGFja2VkQ29vcmRzfSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYWRfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGdldENoYW5uZWxzIH0gZnJvbSAnLi9wYWNraW5nX3V0aWwnO1xuaW1wb3J0IHsgZ2V0Q29vcmRzRGF0YVR5cGUgfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5leHBvcnQgY2xhc3MgUGFkUGFja2VkUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoeFNoYXBlLCBwYWRkaW5ncywgY29uc3RhbnRWYWx1ZSkge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgICAgICAgdGhpcy5wYWNrZWRJbnB1dHMgPSB0cnVlO1xuICAgICAgICB0aGlzLnBhY2tlZE91dHB1dCA9IHRydWU7XG4gICAgICAgIHRoaXMuY3VzdG9tVW5pZm9ybXMgPSBbeyBuYW1lOiAndmFsdWUnLCB0eXBlOiAnZmxvYXQnIH1dO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gcGFkZGluZ3MubWFwKChwLCBpKSA9PiBwWzBdIC8qIGJlZm9yZVBhZCAqLyArIHhTaGFwZVtpXSArIHBbMV0gLyogYWZ0ZXJQYWQgKi8pO1xuICAgICAgICBjb25zdCByYW5rID0geFNoYXBlLmxlbmd0aDtcbiAgICAgICAgY29uc3QgZHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShyYW5rKTtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBwYWRkaW5ncy5tYXAocCA9PiBwWzBdKS5qb2luKCcsJyk7XG4gICAgICAgIGNvbnN0IGVuZCA9IHBhZGRpbmdzLm1hcCgocCwgaSkgPT4gcFswXSArIHhTaGFwZVtpXSkuam9pbignLCcpO1xuICAgICAgICBjb25zdCBjb29yZHMgPSBnZXRDaGFubmVscygncmMnLCByYW5rKTtcbiAgICAgICAgY29uc3Qgc291cmNlID0gZ2V0Q2hhbm5lbHMoJ3NvdXJjZScsIHJhbmspO1xuICAgICAgICBjb25zdCBjTGltaXQgPSBgJHtjb29yZHNbcmFuayAtIDFdfSA8ICR7dGhpcy5vdXRwdXRTaGFwZVtyYW5rIC0gMV19YDtcbiAgICAgICAgY29uc3QgaW5uZXJEaW1zID0gcmFuayA9PT0gMSA/ICdzb3VyY2UnIDogYHZlYzIoJHtzb3VyY2Uuc2xpY2UoLTIpLmpvaW4oKX0pYDtcbiAgICAgICAgY29uc3QgY29tcG9uZW50U2V0dXAgPSBbXG4gICAgICAgICAgICBgJHtkdHlwZX0gcmMgPSBvdXRwdXRMb2M7YCwgYCR7Y29vcmRzW3JhbmsgLSAxXX0gKz0gMTtcbiAgICAgICBpZigke2NMaW1pdH0pIHtcbiAgICAgIGAsXG4gICAgICAgICAgICByYW5rID09PSAxID8gJycgOiBgfVxuICAgICAgIHJjID0gb3V0cHV0TG9jO1xuICAgICAgICR7Y29vcmRzW3JhbmsgLSAyXX0gKz0gMTtcbiAgICAgICBpZigke2Nvb3Jkc1tyYW5rIC0gMl19IDwgJHt0aGlzLm91dHB1dFNoYXBlW3JhbmsgLSAyXX0pIHtgLFxuICAgICAgICAgICAgcmFuayA9PT0gMSA/ICcnIDogYCAgJHtjb29yZHNbcmFuayAtIDFdfSArPSAxO1xuICAgICAgICAgaWYoJHtjTGltaXR9KSB7YFxuICAgICAgICBdO1xuICAgICAgICBjb25zdCBwYWRkaW5nQXJlYSA9IHJhbmsgPT09IDEgP1xuICAgICAgICAgICAgJ3JjIDwgc3RhcnQgfHwgcmMgPj0gZW5kJyA6XG4gICAgICAgICAgICAnYW55KGxlc3NUaGFuKHJjLCBzdGFydCkpIHx8IGFueShncmVhdGVyVGhhbkVxdWFsKHJjLCBlbmQpKSc7XG4gICAgICAgIGxldCBtYWluTG9vcCA9ICcnO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgaiA9IHJhbmsgPT09IDEgPyAyIDogNDsgaSA8IGo7IGkrKykge1xuICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAke2NvbXBvbmVudFNldHVwW2ldfVxuICAgICAgICBpZiAoJHtwYWRkaW5nQXJlYX0pIHtcbiAgICAgICAgICByZXN1bHRbJHtpfV0gPSBmbG9hdCh2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgJHtkdHlwZX0gc291cmNlID0gcmMgLSBzdGFydDtcbiAgICAgICAgICByZXN1bHRbJHtpfV0gPSBnZXRDaGFubmVsKGdldFgoJHtzb3VyY2Uuam9pbigpfSksICR7aW5uZXJEaW1zfSk7XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgICAgIH1cbiAgICAgICAgbWFpbkxvb3AgKz0gKHJhbmsgPT09IDEgPyBgfSBgIDogYH19YCk7XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCAke2R0eXBlfSBzdGFydCA9ICR7ZHR5cGV9KCR7c3RhcnR9KTtcbiAgICAgIGNvbnN0ICR7ZHR5cGV9IGVuZCA9ICR7ZHR5cGV9KCR7ZW5kfSk7XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgJHtkdHlwZX0gb3V0cHV0TG9jID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIHZlYzQgcmVzdWx0ID0gdmVjNCgwLik7XG4gICAgICAgICR7bWFpbkxvb3B9XG4gICAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGFkX3BhY2tlZF9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuZXhwb3J0IGNsYXNzIFBvb2wyRFByb2dyYW0ge1xuICAgIGNvbnN0cnVjdG9yKGNvbnZJbmZvLCBwb29sVHlwZSwgY29tcHV0ZVBvc2l0aW9ucywgZmxhdHRlblBvc2l0aW9ucyA9IGZhbHNlLCBpbmNsdWRlQmF0Y2hJbkluZGV4ID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWyd4J107XG4gICAgICAgIGlmIChwb29sVHlwZSA9PT0gJ2F2ZycgJiYgY29tcHV0ZVBvc2l0aW9ucykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29tcHV0ZSBwb3NpdGlvbnMgZm9yIGF2ZXJhZ2UgcG9vbC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmZpbHRlcldpZHRoO1xuICAgICAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgICAgIGNvbnN0IGRpbGF0aW9uSGVpZ2h0ID0gY29udkluZm8uZGlsYXRpb25IZWlnaHQ7XG4gICAgICAgIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICAgICAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJIZWlnaHQ7XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlcldpZHRoID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVyV2lkdGg7XG4gICAgICAgIGNvbnN0IHBhZFRvcCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgICAgICBjb25zdCBwYWRMZWZ0ID0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gY29udkluZm8ub3V0U2hhcGU7XG4gICAgICAgIGNvbnN0IGlzQXZnUG9vbCA9IHBvb2xUeXBlID09PSAnYXZnJztcbiAgICAgICAgY29uc3QgYmF0Y2hGbGF0dGVuUG9zaXRpb25TdHIgPSBgKChiYXRjaCAgKiAke2NvbnZJbmZvLmluSGVpZ2h0fSArIHhSKSAqICR7Y29udkluZm8uaW5XaWR0aH0gKyB4QykgKiAke2NvbnZJbmZvLmluQ2hhbm5lbHN9ICsgZGA7XG4gICAgICAgIGNvbnN0IGZsYXR0ZW5Qb3NpdGlvblN0ciA9IGAoeFIgKiAke2NvbnZJbmZvLmluV2lkdGh9ICsgeEMpICogJHtjb252SW5mby5pbkNoYW5uZWxzfSArIGRgO1xuICAgICAgICBsZXQgaW5pdGlhbGl6YXRpb25WYWx1ZSA9ICcwLjAnO1xuICAgICAgICBpZiAoIWlzQXZnUG9vbCkge1xuICAgICAgICAgICAgLy8gV2ViR0wgb24gRmlyZWZveCBMaW51eCBjYW4ndCBjb21waWxlIDEvMCBzbyB3ZSBkbyAxL2Vwcy5cbiAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUgPSAnLTEuMCAvIDFlLTIwJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tcHV0ZVBvc2l0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgY29tcGFyZU9wID0gJz49JztcbiAgICAgICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAgIGNvbnN0IGl2ZWMyIHN0cmlkZXMgPSBpdmVjMigke3N0cmlkZUhlaWdodH0sICR7c3RyaWRlV2lkdGh9KTtcbiAgICAgICAgY29uc3QgaXZlYzIgcGFkcyA9IGl2ZWMyKCR7cGFkVG9wfSwgJHtwYWRMZWZ0fSk7XG5cbiAgICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgIGludCBiYXRjaCA9IGNvb3Jkc1swXTtcbiAgICAgICAgICBpbnQgZCA9IGNvb3Jkc1szXTtcblxuICAgICAgICAgIGl2ZWMyIHhSQ0Nvcm5lciA9IGNvb3Jkcy55eiAqIHN0cmlkZXMgLSBwYWRzO1xuICAgICAgICAgIGludCB4UkNvcm5lciA9IHhSQ0Nvcm5lci54O1xuICAgICAgICAgIGludCB4Q0Nvcm5lciA9IHhSQ0Nvcm5lci55O1xuXG4gICAgICAgICAgLy8gbWF4L21pbiB4KD8sID8sIGQpIHRvIGdldCB5KHlSLCB5QywgZCkuXG4gICAgICAgICAgLy8gPyA9IHRvIGJlIGRldGVybWluZWRcbiAgICAgICAgICBmbG9hdCBtaW5NYXhWYWx1ZSA9IDAuMDtcbiAgICAgICAgICBmbG9hdCBtaW5NYXhWYWx1ZUZvdW5kID0gMC4wO1xuICAgICAgICAgIGludCBtaW5NYXhQb3NpdGlvbiA9IDA7XG4gICAgICAgICAgZmxvYXQgYXZnVmFsdWUgPSAwLjA7XG5cbiAgICAgICAgICBmb3IgKGludCB3UiA9IDA7IHdSIDwgJHtlZmZlY3RpdmVGaWx0ZXJIZWlnaHR9O1xuICAgICAgICAgICAgICB3UiArPSAke2RpbGF0aW9uSGVpZ2h0fSkge1xuICAgICAgICAgICAgaW50IHhSID0geFJDb3JuZXIgKyB3UjtcblxuICAgICAgICAgICAgaWYgKHhSIDwgMCB8fCB4UiA+PSAke2NvbnZJbmZvLmluSGVpZ2h0fSkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChpbnQgd0MgPSAwOyB3QyA8ICR7ZWZmZWN0aXZlRmlsdGVyV2lkdGh9O1xuICAgICAgICAgICAgICAgIHdDICs9ICR7ZGlsYXRpb25XaWR0aH0pIHtcbiAgICAgICAgICAgICAgaW50IHhDID0geENDb3JuZXIgKyB3QztcblxuICAgICAgICAgICAgICBpZiAoeEMgPCAwIHx8IHhDID49ICR7Y29udkluZm8uaW5XaWR0aH0pIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGZsb2F0IHZhbHVlID0gZ2V0WChiYXRjaCwgeFIsIHhDLCBkKTtcblxuICAgICAgICAgICAgICAvLyBJZiBhIG1pbiAvIG1heCB2YWx1ZSBoYXMgYWxyZWFkeSBiZWVuIGZvdW5kLCB1c2UgaXQuIElmIG5vdCxcbiAgICAgICAgICAgICAgLy8gdXNlIHRoZSBjdXJyZW50IHZhbHVlLlxuICAgICAgICAgICAgICBmbG9hdCBjdXJyTWluTWF4VmFsdWUgPSBtaXgoXG4gICAgICAgICAgICAgICAgICB2YWx1ZSwgbWluTWF4VmFsdWUsIG1pbk1heFZhbHVlRm91bmQpO1xuICAgICAgICAgICAgICBpZiAodmFsdWUgJHtjb21wYXJlT3B9IGN1cnJNaW5NYXhWYWx1ZSkge1xuICAgICAgICAgICAgICAgIG1pbk1heFZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgbWluTWF4VmFsdWVGb3VuZCA9IDEuMDtcbiAgICAgICAgICAgICAgICBtaW5NYXhQb3NpdGlvbiA9ICR7ZmxhdHRlblBvc2l0aW9ucyA/IChpbmNsdWRlQmF0Y2hJbkluZGV4ID8gYmF0Y2hGbGF0dGVuUG9zaXRpb25TdHIgOlxuICAgICAgICAgICAgICAgIGZsYXR0ZW5Qb3NpdGlvblN0cikgOlxuICAgICAgICAgICAgICAgIGB3UiAqICR7ZWZmZWN0aXZlRmlsdGVyV2lkdGh9ICsgd0NgfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBzZXRPdXRwdXQoZmxvYXQobWluTWF4UG9zaXRpb24pKTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb21wYXJlT3AgPSAnbWF4JztcbiAgICAgICAgbGV0IHJldHVyblZhbHVlID0gYCR7cG9vbFR5cGV9KCR7cG9vbFR5cGV9KCR7cG9vbFR5cGV9KGAgK1xuICAgICAgICAgICAgJ21pbk1heFZhbHVlWzBdLCBtaW5NYXhWYWx1ZVsxXSksIG1pbk1heFZhbHVlWzJdKSwgbWluTWF4VmFsdWVbM10pJztcbiAgICAgICAgaWYgKHBvb2xUeXBlID09PSAnYXZnJykge1xuICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBgYXZnVmFsdWUgLyBjb3VudGA7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmlsdGVyV2lkdGhOZWFyZXN0VmVjNCA9IE1hdGguZmxvb3IoZmlsdGVyV2lkdGggLyA0KSAqIDQ7XG4gICAgICAgIGNvbnN0IGZpbHRlcldpZHRoVmVjNFJlbWFpbmRlciA9IGZpbHRlcldpZHRoICUgNDtcbiAgICAgICAgY29uc3QgdXBkYXRlU25pcHBldCA9IGBcbiAgICAgIGlmICgke2lzQXZnUG9vbH0pIHtcbiAgICAgICAgYXZnVmFsdWUgKz0gZG90KHZhbHVlcywgb25lcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtaW5NYXhWYWx1ZSA9ICR7Y29tcGFyZU9wfSh2YWx1ZXMsIG1pbk1heFZhbHVlKTtcbiAgICAgIH1cbiAgICBgO1xuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgY29uc3QgaXZlYzIgc3RyaWRlcyA9IGl2ZWMyKCR7c3RyaWRlSGVpZ2h0fSwgJHtzdHJpZGVXaWR0aH0pO1xuICAgICAgY29uc3QgaXZlYzIgcGFkcyA9IGl2ZWMyKCR7cGFkVG9wfSwgJHtwYWRMZWZ0fSk7XG4gICAgICBjb25zdCBmbG9hdCBpbml0aWFsaXphdGlvblZhbHVlID0gJHtpbml0aWFsaXphdGlvblZhbHVlfTtcbiAgICAgIGNvbnN0IHZlYzQgb25lcyA9IHZlYzQoMS4wLCAxLjAsIDEuMCwgMS4wKTtcblxuICAgICAgZmxvYXQgY291bnQgPSAwLjA7XG5cbiAgICAgIGZsb2F0IGdldFZhbHVlKGludCBiYXRjaCwgaW50IHhSLCBpbnQgeEMsIGludCBkKSB7XG4gICAgICAgIGlmICh4QyA8IDAgfHwgeEMgPj0gJHtjb252SW5mby5pbldpZHRofSkge1xuICAgICAgICAgIHJldHVybiBpbml0aWFsaXphdGlvblZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGNvdW50ICs9IDEuMDtcbiAgICAgICAgcmV0dXJuIGdldFgoYmF0Y2gsIHhSLCB4QywgZCk7XG4gICAgICB9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiYXRjaCA9IGNvb3Jkc1swXTtcbiAgICAgICAgaW50IGQgPSBjb29yZHNbM107XG5cbiAgICAgICAgaXZlYzIgeFJDQ29ybmVyID0gY29vcmRzLnl6ICogc3RyaWRlcyAtIHBhZHM7XG4gICAgICAgIGludCB4UkNvcm5lciA9IHhSQ0Nvcm5lci54O1xuICAgICAgICBpbnQgeENDb3JuZXIgPSB4UkNDb3JuZXIueTtcblxuICAgICAgICAvLyBtYXgvbWluIHgoPywgPywgZCkgdG8gZ2V0IHkoeVIsIHlDLCBkKS5cbiAgICAgICAgLy8gPyA9IHRvIGJlIGRldGVybWluZWRcbiAgICAgICAgdmVjNCBtaW5NYXhWYWx1ZSA9IHZlYzQoJHtpbml0aWFsaXphdGlvblZhbHVlfSk7XG4gICAgICAgIGZsb2F0IGF2Z1ZhbHVlID0gMC4wO1xuICAgICAgICBjb3VudCA9IDAuMDtcblxuICAgICAgICBmb3IgKGludCB3UiA9IDA7IHdSIDwgJHtlZmZlY3RpdmVGaWx0ZXJIZWlnaHR9O1xuICAgICAgICAgICAgd1IgKz0gJHtkaWxhdGlvbkhlaWdodH0pIHtcbiAgICAgICAgICBpbnQgeFIgPSB4UkNvcm5lciArIHdSO1xuXG4gICAgICAgICAgaWYgKHhSIDwgMCB8fCB4UiA+PSAke2NvbnZJbmZvLmluSGVpZ2h0fSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yIChpbnQgd0MgPSAwOyB3QyA8ICR7ZmlsdGVyV2lkdGhOZWFyZXN0VmVjNH07IHdDICs9IDQpIHtcbiAgICAgICAgICAgIGludCB4QyA9IHhDQ29ybmVyICsgd0MgKiAke2RpbGF0aW9uV2lkdGh9O1xuXG4gICAgICAgICAgICB2ZWM0IHZhbHVlcyA9IHZlYzQoXG4gICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4UiwgeEMsIGQpLFxuICAgICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgeFIsIHhDICsgJHtkaWxhdGlvbldpZHRofSwgZCksXG4gICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4UiwgeEMgKyAyICogJHtkaWxhdGlvbldpZHRofSwgZCksXG4gICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4UiwgeEMgKyAzICogJHtkaWxhdGlvbldpZHRofSwgZClcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpbnQgeEMgPSB4Q0Nvcm5lciArICR7ZmlsdGVyV2lkdGhOZWFyZXN0VmVjNH07XG4gICAgICAgICAgaWYgKCR7ZmlsdGVyV2lkdGhWZWM0UmVtYWluZGVyID09PSAxfSkge1xuICAgICAgICAgICAgdmVjNCB2YWx1ZXMgPSB2ZWM0KFxuICAgICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgeFIsIHhDLCBkKSxcbiAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZSxcbiAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZSxcbiAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgJHt1cGRhdGVTbmlwcGV0fVxuICAgICAgICAgIH0gZWxzZSBpZiAoJHtmaWx0ZXJXaWR0aFZlYzRSZW1haW5kZXIgPT09IDJ9KSB7XG4gICAgICAgICAgICB2ZWM0IHZhbHVlcyA9IHZlYzQoXG4gICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4UiwgeEMsIGQpLFxuICAgICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgeFIsIHhDICsgJHtkaWxhdGlvbldpZHRofSwgZCksXG4gICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUsXG4gICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWVcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgICB9IGVsc2UgaWYgKCR7ZmlsdGVyV2lkdGhWZWM0UmVtYWluZGVyID09PSAzfSkge1xuICAgICAgICAgICAgdmVjNCB2YWx1ZXMgPSB2ZWM0KFxuICAgICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgeFIsIHhDLCBkKSxcbiAgICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIHhSLCB4QyArICR7ZGlsYXRpb25XaWR0aH0sIGQpLFxuICAgICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgeFIsIHhDICsgMiAqICR7ZGlsYXRpb25XaWR0aH0sIGQpLFxuICAgICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAke3VwZGF0ZVNuaXBwZXR9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNldE91dHB1dCgke3JldHVyblZhbHVlfSk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgUG9vbDNEUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoY29udkluZm8sIHBvb2xUeXBlLCBjb21wdXRlUG9zaXRpb25zLCBmbGF0dGVuUG9zaXRpb25zID0gZmFsc2UsIGluY2x1ZGVCYXRjaEluSW5kZXggPSBmYWxzZSkge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgICAgICAgaWYgKHBvb2xUeXBlID09PSAnYXZnJyAmJiBjb21wdXRlUG9zaXRpb25zKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjb21wdXRlIHBvc2l0aW9ucyBmb3IgYXZlcmFnZSBwb29sLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG4gICAgICAgIGNvbnN0IHN0cmlkZURlcHRoID0gY29udkluZm8uc3RyaWRlRGVwdGg7XG4gICAgICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICAgICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICAgICAgY29uc3QgZGlsYXRpb25EZXB0aCA9IGNvbnZJbmZvLmRpbGF0aW9uRGVwdGg7XG4gICAgICAgIGNvbnN0IGRpbGF0aW9uSGVpZ2h0ID0gY29udkluZm8uZGlsYXRpb25IZWlnaHQ7XG4gICAgICAgIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICAgICAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJEZXB0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckRlcHRoO1xuICAgICAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJIZWlnaHQ7XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlcldpZHRoID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVyV2lkdGg7XG4gICAgICAgIGNvbnN0IHBhZEZyb250ID0gY29udkluZm8ucGFkSW5mby5mcm9udDtcbiAgICAgICAgY29uc3QgcGFkVG9wID0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgICAgIGNvbnN0IHBhZExlZnQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5vdXRTaGFwZTtcbiAgICAgICAgY29uc3QgaXNBdmdQb29sID0gcG9vbFR5cGUgPT09ICdhdmcnO1xuICAgICAgICBsZXQgaW5pdGlhbGl6YXRpb25WYWx1ZSA9ICcwLjAnO1xuICAgICAgICBpZiAoIWlzQXZnUG9vbCkge1xuICAgICAgICAgICAgLy8gV2ViR0wgb24gRmlyZWZveCBMaW51eCBjYW4ndCBjb21waWxlIDEvMCBzbyB3ZSBkbyAxL2Vwcy5cbiAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUgPSAnLTEuMCAvIDFlLTIwJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tcHV0ZVBvc2l0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgY29tcGFyZU9wID0gJz49JztcbiAgICAgICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAgIGNvbnN0IGl2ZWMzIHN0cmlkZXMgPVxuICAgICAgICAgICAgaXZlYzMoJHtzdHJpZGVEZXB0aH0sICR7c3RyaWRlSGVpZ2h0fSwgJHtzdHJpZGVXaWR0aH0pO1xuICAgICAgICBjb25zdCBpdmVjMyBwYWRzID0gaXZlYzMoJHtwYWRGcm9udH0sICR7cGFkVG9wfSwgJHtwYWRMZWZ0fSk7XG5cbiAgICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgIGl2ZWM1IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgIGludCBiYXRjaCA9IGNvb3Jkcy54O1xuICAgICAgICAgIGludCBjaCA9IGNvb3Jkcy51O1xuXG4gICAgICAgICAgaXZlYzMgeENvcm5lciA9IGl2ZWMzKGNvb3Jkcy55LCBjb29yZHMueiwgY29vcmRzLncpICogc3RyaWRlcyAtIHBhZHM7XG4gICAgICAgICAgaW50IHhEQ29ybmVyID0geENvcm5lci54O1xuICAgICAgICAgIGludCB4UkNvcm5lciA9IHhDb3JuZXIueTtcbiAgICAgICAgICBpbnQgeENDb3JuZXIgPSB4Q29ybmVyLno7XG5cbiAgICAgICAgICAvLyBtYXgvbWluIHgoPywgPywgPywgY2gpIHRvIGdldCB5KHlELCB5UiwgeUMsIGNoKS5cbiAgICAgICAgICAvLyA/ID0gdG8gYmUgZGV0ZXJtaW5lZFxuICAgICAgICAgIGZsb2F0IG1pbk1heFZhbHVlID0gMC4wO1xuICAgICAgICAgIGZsb2F0IG1pbk1heFZhbHVlRm91bmQgPSAwLjA7XG4gICAgICAgICAgaW50IG1pbk1heFBvc2l0aW9uID0gMDtcblxuICAgICAgICAgIGZvciAoaW50IHdEID0gMDsgd0QgPCAke2VmZmVjdGl2ZUZpbHRlckRlcHRofTtcbiAgICAgICAgICAgICAgd0QgKz0gJHtkaWxhdGlvbkRlcHRofSkge1xuICAgICAgICAgICAgaW50IHhEID0geERDb3JuZXIgKyB3RDtcblxuICAgICAgICAgICAgaWYgKHhEIDwgMCB8fCB4RCA+PSAke2NvbnZJbmZvLmluRGVwdGh9KSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGludCB3UiA9IDA7IHdSIDwgJHtlZmZlY3RpdmVGaWx0ZXJIZWlnaHR9O1xuICAgICAgICAgICAgICAgIHdSICs9ICR7ZGlsYXRpb25IZWlnaHR9KSB7XG4gICAgICAgICAgICAgIGludCB4UiA9IHhSQ29ybmVyICsgd1I7XG5cbiAgICAgICAgICAgICAgaWYgKHhSIDwgMCB8fCB4UiA+PSAke2NvbnZJbmZvLmluSGVpZ2h0fSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZm9yIChpbnQgd0MgPSAwOyB3QyA8ICR7ZWZmZWN0aXZlRmlsdGVyV2lkdGh9O1xuICAgICAgICAgICAgICAgICAgd0MgKz0gJHtkaWxhdGlvbldpZHRofSkge1xuICAgICAgICAgICAgICAgIGludCB4QyA9IHhDQ29ybmVyICsgd0M7XG5cbiAgICAgICAgICAgICAgICBpZiAoeEMgPCAwIHx8IHhDID49ICR7Y29udkluZm8uaW5XaWR0aH0pIHtcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZsb2F0IHZhbHVlID0gZ2V0WChiYXRjaCwgeEQsIHhSLCB4QywgY2gpO1xuXG4gICAgICAgICAgICAgICAgLy8gSWYgYSBtaW4gLyBtYXggdmFsdWUgaGFzIGFscmVhZHkgYmVlbiBmb3VuZCwgdXNlIGl0LiBJZiBub3QsXG4gICAgICAgICAgICAgICAgLy8gdXNlIHRoZSBjdXJyZW50IHZhbHVlLlxuICAgICAgICAgICAgICAgIGZsb2F0IGN1cnJNaW5NYXhWYWx1ZSA9IG1peChcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsIG1pbk1heFZhbHVlLCBtaW5NYXhWYWx1ZUZvdW5kKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgJHtjb21wYXJlT3B9IGN1cnJNaW5NYXhWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgbWluTWF4VmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgIG1pbk1heFZhbHVlRm91bmQgPSAxLjA7XG4gICAgICAgICAgICAgICAgICBtaW5NYXhQb3NpdGlvbiA9ICR7ZmxhdHRlblBvc2l0aW9ucyA/XG4gICAgICAgICAgICAgICAgKGluY2x1ZGVCYXRjaEluSW5kZXggP1xuICAgICAgICAgICAgICAgICAgICBgKCgoYmF0Y2ggKiAke2NvbnZJbmZvLmluRGVwdGh9ICsgeEQpICogJHtjb252SW5mby5pbkhlaWdodH0gKyB4UikgKiAke2NvbnZJbmZvLmluV2lkdGh9ICsgeEMpICogJHtjb252SW5mby5pbkNoYW5uZWxzfSArIGNoYCA6XG4gICAgICAgICAgICAgICAgICAgIGAoKHhEICogJHtjb252SW5mby5pbkhlaWdodH0gKyB4UikgKiAke2NvbnZJbmZvLmluV2lkdGh9ICsgeEMpICogJHtjb252SW5mby5pbkNoYW5uZWxzfSArIGNoYCkgOlxuICAgICAgICAgICAgICAgIGB3RCAqICR7ZWZmZWN0aXZlRmlsdGVySGVpZ2h0fSAqICR7ZWZmZWN0aXZlRmlsdGVyV2lkdGh9ICtcbiAgICAgICAgICAgICAgICAgICAgICB3UiAqICR7ZWZmZWN0aXZlRmlsdGVyV2lkdGh9ICsgd0NgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgc2V0T3V0cHV0KGZsb2F0KG1pbk1heFBvc2l0aW9uKSk7XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tcGFyZU9wID0gJ21heCc7XG4gICAgICAgIGxldCByZXR1cm5WYWx1ZSA9IGAke3Bvb2xUeXBlfSgke3Bvb2xUeXBlfSgke3Bvb2xUeXBlfShgICtcbiAgICAgICAgICAgICdtaW5NYXhWYWx1ZVswXSwgbWluTWF4VmFsdWVbMV0pLCBtaW5NYXhWYWx1ZVsyXSksIG1pbk1heFZhbHVlWzNdKSc7XG4gICAgICAgIGlmIChwb29sVHlwZSA9PT0gJ2F2ZycpIHtcbiAgICAgICAgICAgIHJldHVyblZhbHVlID0gYGF2Z1ZhbHVlIC8gY291bnRgO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpbHRlcldpZHRoTmVhcmVzdFZlYzQgPSBNYXRoLmZsb29yKGZpbHRlcldpZHRoIC8gNCkgKiA0O1xuICAgICAgICBjb25zdCBmaWx0ZXJXaWR0aFZlYzRSZW1haW5kZXIgPSBmaWx0ZXJXaWR0aCAlIDQ7XG4gICAgICAgIGNvbnN0IHVwZGF0ZVNuaXBwZXQgPSBgXG4gICAgICBpZiAoJHtpc0F2Z1Bvb2x9KSB7XG4gICAgICAgIGF2Z1ZhbHVlICs9IGRvdCh2YWx1ZXMsIG9uZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWluTWF4VmFsdWUgPSAke2NvbXBhcmVPcH0odmFsdWVzLCBtaW5NYXhWYWx1ZSk7XG4gICAgICB9XG4gICAgYDtcbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IGl2ZWMzIHN0cmlkZXMgPVxuICAgICAgICBpdmVjMygke3N0cmlkZURlcHRofSwgJHtzdHJpZGVIZWlnaHR9LCAke3N0cmlkZVdpZHRofSk7XG4gICAgICBjb25zdCBpdmVjMyBwYWRzID0gaXZlYzMoJHtwYWRGcm9udH0sICR7cGFkVG9wfSwgJHtwYWRMZWZ0fSk7XG4gICAgICBjb25zdCBmbG9hdCBpbml0aWFsaXphdGlvblZhbHVlID0gJHtpbml0aWFsaXphdGlvblZhbHVlfTtcbiAgICAgIGNvbnN0IHZlYzQgb25lcyA9IHZlYzQoMS4wLCAxLjAsIDEuMCwgMS4wKTtcblxuICAgICAgZmxvYXQgY291bnQgPSAwLjA7XG5cbiAgICAgIGZsb2F0IGdldFZhbHVlKGludCBiYXRjaCwgaW50IHhELCBpbnQgeFIsIGludCB4QywgaW50IGNoKSB7XG4gICAgICAgIGlmICh4QyA8IDAgfHwgeEMgPj0gJHtjb252SW5mby5pbldpZHRofSkge1xuICAgICAgICAgIHJldHVybiBpbml0aWFsaXphdGlvblZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGNvdW50ICs9IDEuMDtcbiAgICAgICAgcmV0dXJuIGdldFgoYmF0Y2gsIHhELCB4UiwgeEMsIGNoKTtcbiAgICAgIH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjNSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzLng7XG4gICAgICAgIGludCBjaCA9IGNvb3Jkcy51O1xuXG4gICAgICAgIGl2ZWMzIHhDb3JuZXIgPSBpdmVjMyhjb29yZHMueSwgY29vcmRzLnosIGNvb3Jkcy53KSAqIHN0cmlkZXMgLSBwYWRzO1xuICAgICAgICBpbnQgeERDb3JuZXIgPSB4Q29ybmVyLng7XG4gICAgICAgIGludCB4UkNvcm5lciA9IHhDb3JuZXIueTtcbiAgICAgICAgaW50IHhDQ29ybmVyID0geENvcm5lci56O1xuXG4gICAgICAgIC8vIG1heC9taW4geCg/LCA/LCA/LCBkKSB0byBnZXQgeSh5RCwgeVIsIHlDLCBjaCkuXG4gICAgICAgIC8vID8gPSB0byBiZSBkZXRlcm1pbmVkXG4gICAgICAgIHZlYzQgbWluTWF4VmFsdWUgPSB2ZWM0KCR7aW5pdGlhbGl6YXRpb25WYWx1ZX0pO1xuICAgICAgICBmbG9hdCBhdmdWYWx1ZSA9IDAuMDtcbiAgICAgICAgY291bnQgPSAwLjA7XG5cbiAgICAgICAgZm9yIChpbnQgd0QgPSAwOyB3RCA8ICR7ZWZmZWN0aXZlRmlsdGVyRGVwdGh9O1xuICAgICAgICAgICAgd0QgKz0gJHtkaWxhdGlvbkRlcHRofSkge1xuICAgICAgICAgIGludCB4RCA9IHhEQ29ybmVyICsgd0Q7XG5cbiAgICAgICAgICBpZiAoeEQgPCAwIHx8IHhEID49ICR7Y29udkluZm8uaW5EZXB0aH0pIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAoaW50IHdSID0gMDsgd1IgPCAke2VmZmVjdGl2ZUZpbHRlckhlaWdodH07XG4gICAgICAgICAgICB3UiArPSAke2RpbGF0aW9uSGVpZ2h0fSkge1xuICAgICAgICAgICAgaW50IHhSID0geFJDb3JuZXIgKyB3UjtcblxuICAgICAgICAgICAgaWYgKHhSIDwgMCB8fCB4UiA+PSAke2NvbnZJbmZvLmluSGVpZ2h0fSkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChpbnQgd0MgPSAwOyB3QyA8ICR7ZmlsdGVyV2lkdGhOZWFyZXN0VmVjNH07IHdDICs9IDQpIHtcbiAgICAgICAgICAgICAgaW50IHhDID0geENDb3JuZXIgKyB3QyAqICR7ZGlsYXRpb25XaWR0aH07XG5cbiAgICAgICAgICAgICAgdmVjNCB2YWx1ZXMgPSB2ZWM0KFxuICAgICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4RCwgeFIsIHhDLCBjaCksXG4gICAgICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIHhELCB4UiwgeEMgKyAke2RpbGF0aW9uV2lkdGh9LCBjaCksXG4gICAgICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIHhELCB4UiwgeEMgKyAyICogJHtkaWxhdGlvbldpZHRofSwgY2gpLFxuICAgICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4RCwgeFIsIHhDICsgMyAqICR7ZGlsYXRpb25XaWR0aH0sIGNoKVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW50IHhDID0geENDb3JuZXIgKyAke2ZpbHRlcldpZHRoTmVhcmVzdFZlYzR9O1xuICAgICAgICAgICAgaWYgKCR7ZmlsdGVyV2lkdGhWZWM0UmVtYWluZGVyID09PSAxfSkge1xuICAgICAgICAgICAgICB2ZWM0IHZhbHVlcyA9IHZlYzQoXG4gICAgICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIHhELCB4UiwgeEMsIGNoKSxcbiAgICAgICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlLFxuICAgICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUsXG4gICAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoJHtmaWx0ZXJXaWR0aFZlYzRSZW1haW5kZXIgPT09IDJ9KSB7XG4gICAgICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgeEQsIHhSLCB4QywgY2gpLFxuICAgICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4RCwgeFIsIHhDICsgJHtkaWxhdGlvbldpZHRofSwgY2gpLFxuICAgICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUsXG4gICAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoJHtmaWx0ZXJXaWR0aFZlYzRSZW1haW5kZXIgPT09IDN9KSB7XG4gICAgICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgeEQsIHhSLCB4QywgY2gpLFxuICAgICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4RCwgeFIsIHhDICsgJHtkaWxhdGlvbldpZHRofSwgY2gpLFxuICAgICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4RCwgeFIsIHhDICsgMiAqICR7ZGlsYXRpb25XaWR0aH0sIGNoKSxcbiAgICAgICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgJHt1cGRhdGVTbmlwcGV0fVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBzZXRPdXRwdXQoJHtyZXR1cm5WYWx1ZX0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wb29sX2dwdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5leHBvcnQgY2xhc3MgUmVkdWNlUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IocmVkdWNlSW5mbywgcmVkdWNlVHlwZSkge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgICAgICAgY29uc3QgeyB3aW5kb3dTaXplLCBiYXRjaFNpemUsIGluU2l6ZSwgb3V0U2l6ZSB9ID0gcmVkdWNlSW5mbztcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IFtiYXRjaFNpemUsIG91dFNpemVdO1xuICAgICAgICBsZXQgaW5pdGlhbGl6YXRpb25WYWx1ZSA9ICcwLjAnO1xuICAgICAgICBsZXQgY29tcGFyZU9wID0gYGA7XG4gICAgICAgIGlmIChyZWR1Y2VUeXBlID09PSAncHJvZCcpIHtcbiAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUgPSAnMS4wJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChyZWR1Y2VUeXBlID09PSAnbWluJykge1xuICAgICAgICAgICAgLy8gV2ViR0wgb24gRmlyZWZveCBMaW51eCBjYW4ndCBjb21waWxlIDEvMCBzbyB3ZSBkbyAxL2Vwcy5cbiAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUgPSAnMS4wIC8gMWUtMjAnO1xuICAgICAgICAgICAgY29tcGFyZU9wID0gYG1pbmA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocmVkdWNlVHlwZSA9PT0gJ21heCcpIHtcbiAgICAgICAgICAgIC8vIFdlYkdMIG9uIEZpcmVmb3ggTGludXggY2FuJ3QgY29tcGlsZSAxLzAgc28gd2UgZG8gMS9lcHMuXG4gICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlID0gJy0xLjAgLyAxZS0yMCc7XG4gICAgICAgICAgICBjb21wYXJlT3AgPSBgbWF4YDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmV0dXJuVmFsdWUgPSBgJHtyZWR1Y2VUeXBlfSgke3JlZHVjZVR5cGV9KCR7cmVkdWNlVHlwZX0oYCArXG4gICAgICAgICAgICAnbWluTWF4VmFsdWVbMF0sIG1pbk1heFZhbHVlWzFdKSwgbWluTWF4VmFsdWVbMl0pLCBtaW5NYXhWYWx1ZVszXSknO1xuICAgICAgICBpZiAocmVkdWNlVHlwZSA9PT0gJ3N1bScpIHtcbiAgICAgICAgICAgIHJldHVyblZhbHVlID0gYHN1bVZhbHVlYDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChyZWR1Y2VUeXBlID09PSAncHJvZCcpIHtcbiAgICAgICAgICAgIHJldHVyblZhbHVlID0gYHByb2RWYWx1ZWA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocmVkdWNlVHlwZSA9PT0gJ2FsbCcpIHtcbiAgICAgICAgICAgIHJldHVyblZhbHVlID0gYGFsbFZhbHVlYDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChyZWR1Y2VUeXBlID09PSAnYW55Jykge1xuICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBgYW55VmFsdWVgO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHdpbmRvd1NpemVOZWFyZXN0VmVjNCA9IE1hdGguZmxvb3Iod2luZG93U2l6ZSAvIDQpICogNDtcbiAgICAgICAgY29uc3Qgd2luZG93U2l6ZVZlYzRSZW1haW5kZXIgPSB3aW5kb3dTaXplICUgNDtcbiAgICAgICAgbGV0IHVwZGF0ZVNuaXBwZXQgPSBgXG4gICAgICBpZiAoJHtyZWR1Y2VUeXBlID09PSAnc3VtJ30pIHtcbiAgICAgICAgc3VtVmFsdWUgKz0gZG90KHZhbHVlcywgb25lcyk7XG4gICAgICB9IGVsc2UgaWYgKCR7cmVkdWNlVHlwZSA9PT0gJ3Byb2QnfSkge1xuICAgICAgICB2ZWMyIHRtcCA9IHZlYzIodmFsdWVzWzBdLCB2YWx1ZXNbMV0pICogdmVjMih2YWx1ZXNbMl0sIHZhbHVlc1szXSk7XG4gICAgICAgIHByb2RWYWx1ZSAqPSB0bXBbMF0gKiB0bXBbMV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtaW5NYXhWYWx1ZSA9ICR7Y29tcGFyZU9wfSh2YWx1ZXMsIG1pbk1heFZhbHVlKTtcbiAgICAgICAgaWYgKCR7cmVkdWNlVHlwZSA9PT0gJ21pbid9IHx8ICR7cmVkdWNlVHlwZSA9PT0gJ21heCd9KSB7XG4gICAgICAgICAgbWluTWF4VmFsdWUgPSAke2NvbXBhcmVPcH0odmFsdWVzLCBtaW5NYXhWYWx1ZSk7XG4gICAgICAgICAgYnZlYzQgaXNOYU4gPSBpc25hbih2YWx1ZXMpO1xuICAgICAgICAgIGlmIChpc05hTi5yIHx8IGlzTmFOLmcgfHwgaXNOYU4uYiB8fCBpc05hTi5hKSB7XG4gICAgICAgICAgICBtaW5NYXhWYWx1ZSA9IHZlYzQoTkFOKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICBgO1xuICAgICAgICBsZXQgdmVjVHlwZSA9IGB2ZWM0YDtcbiAgICAgICAgaWYgKHJlZHVjZVR5cGUgPT09ICdhbGwnKSB7XG4gICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlID0gJzEuMCc7XG4gICAgICAgICAgICB1cGRhdGVTbmlwcGV0ID0gYFxuICAgICAgICBib29sIHJlZHVjZWRBbGxWYWx1ZSA9IGFsbCh2YWx1ZXMpO1xuICAgICAgICBmbG9hdCBmbG9hdGVkUmVkdWNlZEFsbFZhbHVlID0gZmxvYXQocmVkdWNlZEFsbFZhbHVlKTtcbiAgICAgICAgYWxsVmFsdWUgPSBmbG9hdChhbGxWYWx1ZSA+PSAxLjAgJiYgZmxvYXRlZFJlZHVjZWRBbGxWYWx1ZSA+PSAxLjApO1xuICAgICAgYDtcbiAgICAgICAgICAgIHZlY1R5cGUgPSBgYnZlYzRgO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHJlZHVjZVR5cGUgPT09ICdhbnknKSB7XG4gICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlID0gJzAuMCc7XG4gICAgICAgICAgICB1cGRhdGVTbmlwcGV0ID0gYFxuICAgICAgICBib29sIHJlZHVjZWRBbnlWYWx1ZSA9IGFueSh2YWx1ZXMpO1xuICAgICAgICBmbG9hdCBmbG9hdGVkUmVkdWNlZEFueVZhbHVlID0gZmxvYXQocmVkdWNlZEFueVZhbHVlKTtcbiAgICAgICAgYW55VmFsdWUgPSBmbG9hdChhbnlWYWx1ZSA+PSAxLjAgfHwgZmxvYXRlZFJlZHVjZWRBbnlWYWx1ZSA+PSAxLjApO1xuICAgICAgYDtcbiAgICAgICAgICAgIHZlY1R5cGUgPSBgYnZlYzRgO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjaGVja091dE9mQm91bmRzID0gJyc7XG4gICAgICAgIGlmIChpblNpemUgJSB3aW5kb3dTaXplID4gMCkge1xuICAgICAgICAgICAgY2hlY2tPdXRPZkJvdW5kcyA9IGBcbiAgICAgICAgaWYgKGluSWR4IDwgMCB8fCBpbklkeCA+PSAke2luU2l6ZX0pIHtcbiAgICAgICAgICByZXR1cm4gaW5pdGlhbGl6YXRpb25WYWx1ZTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgY29uc3QgZmxvYXQgaW5pdGlhbGl6YXRpb25WYWx1ZSA9ICR7aW5pdGlhbGl6YXRpb25WYWx1ZX07XG4gICAgICBjb25zdCB2ZWM0IG9uZXMgPSB2ZWM0KDEuMCwgMS4wLCAxLjAsIDEuMCk7XG5cbiAgICAgIGZsb2F0IGdldFZhbHVlKGludCBiYXRjaCwgaW50IGluSWR4KSB7XG4gICAgICAgICR7Y2hlY2tPdXRPZkJvdW5kc31cbiAgICAgICAgcmV0dXJuIGdldFgoYmF0Y2gsIGluSWR4KTtcbiAgICAgIH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMiBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgb3V0SWR4ID0gY29vcmRzWzFdO1xuICAgICAgICBpbnQgaW5PZmZzZXQgPSBvdXRJZHggKiAke3dpbmRvd1NpemV9O1xuXG4gICAgICAgIHZlYzQgbWluTWF4VmFsdWUgPSB2ZWM0KCR7aW5pdGlhbGl6YXRpb25WYWx1ZX0pO1xuICAgICAgICBmbG9hdCBwcm9kVmFsdWUgPSAxLjA7XG4gICAgICAgIGZsb2F0IHN1bVZhbHVlID0gMC4wO1xuICAgICAgICBmbG9hdCBhbGxWYWx1ZSA9IDEuMDtcbiAgICAgICAgZmxvYXQgYW55VmFsdWUgPSAwLjA7XG5cbiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAke3dpbmRvd1NpemVOZWFyZXN0VmVjNH07IGkgKz0gNCkge1xuICAgICAgICAgIGludCBpbklkeCA9IGluT2Zmc2V0ICsgaTtcbiAgICAgICAgICAke3ZlY1R5cGV9IHZhbHVlcyA9ICR7dmVjVHlwZX0oXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHgpLFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4ICsgMSksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAyKSxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDMpXG4gICAgICAgICAgKTtcblxuICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgfVxuXG4gICAgICAgIGludCBpbklkeCA9IGluT2Zmc2V0ICsgJHt3aW5kb3dTaXplTmVhcmVzdFZlYzR9O1xuICAgICAgICBpZiAoJHt3aW5kb3dTaXplVmVjNFJlbWFpbmRlciA9PT0gMX0pIHtcbiAgICAgICAgICAke3ZlY1R5cGV9IHZhbHVlcyA9ICR7dmVjVHlwZX0oXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHgpLFxuICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZSxcbiAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUsXG4gICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlXG4gICAgICAgICAgKTtcblxuICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgfSBlbHNlIGlmICgke3dpbmRvd1NpemVWZWM0UmVtYWluZGVyID09PSAyfSkge1xuICAgICAgICAgICR7dmVjVHlwZX0gdmFsdWVzID0gJHt2ZWNUeXBlfShcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAxKSxcbiAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUsXG4gICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlXG4gICAgICAgICAgKTtcblxuICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgfSBlbHNlIGlmICgke3dpbmRvd1NpemVWZWM0UmVtYWluZGVyID09PSAzfSkge1xuICAgICAgICAgICR7dmVjVHlwZX0gdmFsdWVzID0gJHt2ZWNUeXBlfShcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAxKSxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDIpLFxuICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAke3VwZGF0ZVNuaXBwZXR9XG4gICAgICAgIH1cbiAgICAgICAgc2V0T3V0cHV0KCR7cmV0dXJuVmFsdWV9KTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlZHVjZV9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgcmVnaXN0ZXJLZXJuZWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgX2Z1c2VkTWF0TXVsQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL19GdXNlZE1hdE11bCc7XG5pbXBvcnQgeyBhYnNDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQWJzJztcbmltcG9ydCB7IGFjb3NDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQWNvcyc7XG5pbXBvcnQgeyBhY29zaENvbmZpZyB9IGZyb20gJy4va2VybmVscy9BY29zaCc7XG5pbXBvcnQgeyBhZGRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQWRkJztcbmltcG9ydCB7IGFkZE5Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvQWRkTic7XG5pbXBvcnQgeyBhbGxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQWxsJztcbmltcG9ydCB7IGFueUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9BbnknO1xuaW1wb3J0IHsgYXJnTWF4Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0FyZ01heCc7XG5pbXBvcnQgeyBhcmdNaW5Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvQXJnTWluJztcbmltcG9ydCB7IGFzaW5Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvQXNpbic7XG5pbXBvcnQgeyBhc2luaENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Bc2luaCc7XG5pbXBvcnQgeyBhdGFuQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0F0YW4nO1xuaW1wb3J0IHsgYXRhbjJDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQXRhbjInO1xuaW1wb3J0IHsgYXRhbmhDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQXRhbmgnO1xuaW1wb3J0IHsgYXZnUG9vbENvbmZpZyB9IGZyb20gJy4va2VybmVscy9BdmdQb29sJztcbmltcG9ydCB7IGF2Z1Bvb2wzRENvbmZpZyB9IGZyb20gJy4va2VybmVscy9BdmdQb29sM0QnO1xuaW1wb3J0IHsgYXZnUG9vbEdyYWQzRENvbmZpZyB9IGZyb20gJy4va2VybmVscy9BdmdQb29sM0RHcmFkJztcbmltcG9ydCB7IGF2Z1Bvb2xHcmFkQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0F2Z1Bvb2xHcmFkJztcbmltcG9ydCB7IGJhdGNoTWF0TXVsQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0JhdGNoTWF0TXVsJztcbmltcG9ydCB7IGJhdGNoTm9ybUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9CYXRjaE5vcm0nO1xuaW1wb3J0IHsgYmF0Y2hUb1NwYWNlTkRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQmF0Y2hUb1NwYWNlTkQnO1xuaW1wb3J0IHsgYmluY291bnRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQmluY291bnQnO1xuaW1wb3J0IHsgY2FzdENvbmZpZyB9IGZyb20gJy4va2VybmVscy9DYXN0JztcbmltcG9ydCB7IGNlaWxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQ2VpbCc7XG5pbXBvcnQgeyBjbGlwQnlWYWx1ZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9DbGlwQnlWYWx1ZSc7XG5pbXBvcnQgeyBjb21wbGV4Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0NvbXBsZXgnO1xuaW1wb3J0IHsgY29tcGxleEFic0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9Db21wbGV4QWJzJztcbmltcG9ydCB7IGNvbmNhdENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Db25jYXQnO1xuaW1wb3J0IHsgY29udjJEQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0NvbnYyRCc7XG5pbXBvcnQgeyBjb252MkRCYWNrcHJvcEZpbHRlckNvbmZpZyB9IGZyb20gJy4va2VybmVscy9Db252MkRCYWNrcHJvcEZpbHRlcic7XG5pbXBvcnQgeyBjb252MkRCYWNrcHJvcElucHV0Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0NvbnYyREJhY2twcm9wSW5wdXQnO1xuaW1wb3J0IHsgY29udjNEQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0NvbnYzRCc7XG5pbXBvcnQgeyBjb252M0RCYWNrcHJvcEZpbHRlclYyQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0NvbnYzREJhY2twcm9wRmlsdGVyVjInO1xuaW1wb3J0IHsgY29udjNEQmFja3Byb3BJbnB1dENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Db252M0RCYWNrcHJvcElucHV0VjInO1xuaW1wb3J0IHsgY29zQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0Nvcyc7XG5pbXBvcnQgeyBjb3NoQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0Nvc2gnO1xuaW1wb3J0IHsgY3JvcEFuZFJlc2l6ZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9Dcm9wQW5kUmVzaXplJztcbmltcG9ydCB7IGN1bXN1bUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9DdW1zdW0nO1xuaW1wb3J0IHsgZGVuc2VCaW5jb3VudENvbmZpZyB9IGZyb20gJy4va2VybmVscy9EZW5zZUJpbmNvdW50JztcbmltcG9ydCB7IGRlcHRoVG9TcGFjZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9EZXB0aFRvU3BhY2UnO1xuaW1wb3J0IHsgZGVwdGh3aXNlQ29udjJkTmF0aXZlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0RlcHRod2lzZUNvbnYyZE5hdGl2ZSc7XG5pbXBvcnQgeyBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlckNvbmZpZyB9IGZyb20gJy4va2VybmVscy9EZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlcic7XG5pbXBvcnQgeyBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0RlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXQnO1xuaW1wb3J0IHsgZGlhZ0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9EaWFnJztcbmltcG9ydCB7IGRpbGF0aW9uMkRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRGlsYXRpb24yRCc7XG5pbXBvcnQgeyBlaW5zdW1Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvRWluc3VtJztcbmltcG9ydCB7IGVsdUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9FbHUnO1xuaW1wb3J0IHsgZWx1R3JhZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9FbHVHcmFkJztcbmltcG9ydCB7IGVxdWFsQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0VxdWFsJztcbmltcG9ydCB7IGVyZkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9FcmYnO1xuaW1wb3J0IHsgZXhwQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0V4cCc7XG5pbXBvcnQgeyBleHBhbmREaW1zQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0V4cGFuZERpbXMnO1xuaW1wb3J0IHsgZXhwbTFDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRXhwbTEnO1xuaW1wb3J0IHsgZmZ0Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0ZGVCc7XG5pbXBvcnQgeyBmaWxsQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0ZpbGwnO1xuaW1wb3J0IHsgZmxpcExlZnRSaWdodENvbmZpZyB9IGZyb20gJy4va2VybmVscy9GbGlwTGVmdFJpZ2h0JztcbmltcG9ydCB7IGZsb29yQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0Zsb29yJztcbmltcG9ydCB7IGZsb29yRGl2Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0Zsb29yRGl2JztcbmltcG9ydCB7IGZyb21QaXhlbHNDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRnJvbVBpeGVscyc7XG5pbXBvcnQgeyBmdXNlZENvbnYyRENvbmZpZyB9IGZyb20gJy4va2VybmVscy9GdXNlZENvbnYyRCc7XG5pbXBvcnQgeyBmdXNlZERlcHRod2lzZUNvbnYyRENvbmZpZyB9IGZyb20gJy4va2VybmVscy9GdXNlZERlcHRod2lzZUNvbnYyRCc7XG5pbXBvcnQgeyBnYXRoZXJOZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9HYXRoZXJOZCc7XG5pbXBvcnQgeyBnYXRoZXJWMkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9HYXRoZXJWMic7XG5pbXBvcnQgeyBncmVhdGVyQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0dyZWF0ZXInO1xuaW1wb3J0IHsgZ3JlYXRlckVxdWFsQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0dyZWF0ZXJFcXVhbCc7XG5pbXBvcnQgeyBpZGVudGl0eUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9JZGVudGl0eSc7XG5pbXBvcnQgeyBpZmZ0Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0lGRlQnO1xuaW1wb3J0IHsgaW1hZ0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9JbWFnJztcbmltcG9ydCB7IGlzRmluaXRlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0lzRmluaXRlJztcbmltcG9ydCB7IGlzSW5mQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0lzSW5mJztcbmltcG9ydCB7IGlzTmFOQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0lzTmFOJztcbmltcG9ydCB7IGxlYWt5UmVsdUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9MZWFreVJlbHUnO1xuaW1wb3J0IHsgbGVzc0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9MZXNzJztcbmltcG9ydCB7IGxlc3NFcXVhbENvbmZpZyB9IGZyb20gJy4va2VybmVscy9MZXNzRXF1YWwnO1xuaW1wb3J0IHsgbGluU3BhY2VDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTGluU3BhY2UnO1xuaW1wb3J0IHsgbG9nQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0xvZyc7XG5pbXBvcnQgeyBsb2cxcENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Mb2cxcCc7XG5pbXBvcnQgeyBsb2dpY2FsQW5kQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0xvZ2ljYWxBbmQnO1xuaW1wb3J0IHsgbG9naWNhbE5vdENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Mb2dpY2FsTm90JztcbmltcG9ydCB7IGxvZ2ljYWxPckNvbmZpZyB9IGZyb20gJy4va2VybmVscy9Mb2dpY2FsT3InO1xuaW1wb3J0IHsgTFJOQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0xSTic7XG5pbXBvcnQgeyBMUk5HcmFkQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0xSTkdyYWQnO1xuaW1wb3J0IHsgbWF4Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL01heCc7XG5pbXBvcnQgeyBtYXhpbXVtQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL01heGltdW0nO1xuaW1wb3J0IHsgbWF4UG9vbENvbmZpZyB9IGZyb20gJy4va2VybmVscy9NYXhQb29sJztcbmltcG9ydCB7IG1heFBvb2wzRENvbmZpZyB9IGZyb20gJy4va2VybmVscy9NYXhQb29sM0QnO1xuaW1wb3J0IHsgbWF4UG9vbEdyYWQzRENvbmZpZyB9IGZyb20gJy4va2VybmVscy9NYXhQb29sM0RHcmFkJztcbmltcG9ydCB7IG1heFBvb2xHcmFkQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL01heFBvb2xHcmFkJztcbmltcG9ydCB7IG1heFBvb2xXaXRoQXJnbWF4Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL01heFBvb2xXaXRoQXJnbWF4JztcbmltcG9ydCB7IG1lYW5Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvTWVhbic7XG5pbXBvcnQgeyBtaW5Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvTWluJztcbmltcG9ydCB7IG1pbmltdW1Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvTWluaW11bSc7XG5pbXBvcnQgeyBtaXJyb3JQYWRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTWlycm9yUGFkJztcbmltcG9ydCB7IG1vZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Nb2QnO1xuaW1wb3J0IHsgbXVsdGlub21pYWxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTXVsdGlub21pYWwnO1xuaW1wb3J0IHsgbXVsdGlwbHlDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTXVsdGlwbHknO1xuaW1wb3J0IHsgbmVnQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL05lZyc7XG5pbXBvcnQgeyBub25NYXhTdXBwcmVzc2lvblYzQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL05vbk1heFN1cHByZXNzaW9uVjMnO1xuaW1wb3J0IHsgbm9uTWF4U3VwcHJlc3Npb25WNENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Ob25NYXhTdXBwcmVzc2lvblY0JztcbmltcG9ydCB7IG5vbk1heFN1cHByZXNzaW9uVjVDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTm9uTWF4U3VwcHJlc3Npb25WNSc7XG5pbXBvcnQgeyBub3RFcXVhbENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Ob3RFcXVhbCc7XG5pbXBvcnQgeyBvbmVIb3RDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvT25lSG90JztcbmltcG9ydCB7IG9uZXNMaWtlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL09uZXNMaWtlJztcbmltcG9ydCB7IHBhY2tDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUGFjayc7XG5pbXBvcnQgeyBwYWRWMkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9QYWRWMic7XG5pbXBvcnQgeyBwb3dDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUG93JztcbmltcG9ydCB7IHByZWx1Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1ByZWx1JztcbmltcG9ydCB7IHByb2RDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUHJvZCc7XG5pbXBvcnQgeyByYW5nZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9SYW5nZSc7XG5pbXBvcnQgeyByZWFsQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1JlYWwnO1xuaW1wb3J0IHsgcmVhbERpdkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9SZWFsRGl2JztcbmltcG9ydCB7IHJlY2lwcm9jYWxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUmVjaXByb2NhbCc7XG5pbXBvcnQgeyByZWx1Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1JlbHUnO1xuaW1wb3J0IHsgcmVsdTZDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUmVsdTYnO1xuaW1wb3J0IHsgcmVzaGFwZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9SZXNoYXBlJztcbmltcG9ydCB7IHJlc2l6ZUJpbGluZWFyQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1Jlc2l6ZUJpbGluZWFyJztcbmltcG9ydCB7IHJlc2l6ZUJpbGluZWFyR3JhZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9SZXNpemVCaWxpbmVhckdyYWQnO1xuaW1wb3J0IHsgcmVzaXplTmVhcmVzdE5laWdoYm9yQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1Jlc2l6ZU5lYXJlc3ROZWlnaGJvcic7XG5pbXBvcnQgeyByZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1Jlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWQnO1xuaW1wb3J0IHsgcmV2ZXJzZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9SZXZlcnNlJztcbmltcG9ydCB7IHJvdGF0ZVdpdGhPZmZzZXRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUm90YXRlV2l0aE9mZnNldCc7XG5pbXBvcnQgeyByb3VuZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Sb3VuZCc7XG5pbXBvcnQgeyByc3FydENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Sc3FydCc7XG5pbXBvcnQgeyBzY2F0dGVyTmRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU2NhdHRlck5kJztcbmltcG9ydCB7IHNlbGVjdENvbmZpZyB9IGZyb20gJy4va2VybmVscy9TZWxlY3QnO1xuaW1wb3J0IHsgc2VsdUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9TZWx1JztcbmltcG9ydCB7IHNpZ21vaWRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU2lnbW9pZCc7XG5pbXBvcnQgeyBzaWduQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NpZ24nO1xuaW1wb3J0IHsgc2luQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1Npbic7XG5pbXBvcnQgeyBzaW5oQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NpbmgnO1xuaW1wb3J0IHsgc2xpY2VDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU2xpY2UnO1xuaW1wb3J0IHsgc29mdG1heENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Tb2Z0bWF4JztcbmltcG9ydCB7IHNvZnRwbHVzQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NvZnRwbHVzJztcbmltcG9ydCB7IHNwYWNlVG9CYXRjaE5EQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NwYWNlVG9CYXRjaE5EJztcbmltcG9ydCB7IHNwYXJzZUZpbGxFbXB0eVJvd3NDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3BhcnNlRmlsbEVtcHR5Um93cyc7XG5pbXBvcnQgeyBzcGFyc2VSZXNoYXBlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NwYXJzZVJlc2hhcGUnO1xuaW1wb3J0IHsgc3BhcnNlU2VnbWVudE1lYW5Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3BhcnNlU2VnbWVudE1lYW4nO1xuaW1wb3J0IHsgc3BhcnNlU2VnbWVudFN1bUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9TcGFyc2VTZWdtZW50U3VtJztcbmltcG9ydCB7IHNwYXJzZVRvRGVuc2VDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3BhcnNlVG9EZW5zZSc7XG5pbXBvcnQgeyBzcGxpdFZDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3BsaXRWJztcbmltcG9ydCB7IHNxcnRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3FydCc7XG5pbXBvcnQgeyBzcXVhcmVDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3F1YXJlJztcbmltcG9ydCB7IHNxdWFyZWREaWZmZXJlbmNlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NxdWFyZWREaWZmZXJlbmNlJztcbmltcG9ydCB7IHN0ZXBDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3RlcCc7XG5pbXBvcnQgeyBzdHJpZGVkU2xpY2VDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3RyaWRlZFNsaWNlJztcbmltcG9ydCB7IHN0cmluZ05HcmFtc0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9TdHJpbmdOR3JhbXMnO1xuaW1wb3J0IHsgc3RyaW5nU3BsaXRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3RyaW5nU3BsaXQnO1xuaW1wb3J0IHsgc3RyaW5nVG9IYXNoQnVja2V0RmFzdENvbmZpZyB9IGZyb20gJy4va2VybmVscy9TdHJpbmdUb0hhc2hCdWNrZXRGYXN0JztcbmltcG9ydCB7IHN1YkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9TdWInO1xuaW1wb3J0IHsgc3VtQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1N1bSc7XG5pbXBvcnQgeyB0YW5Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvVGFuJztcbmltcG9ydCB7IHRhbmhDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvVGFuaCc7XG5pbXBvcnQgeyB0aWxlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1RpbGUnO1xuaW1wb3J0IHsgdG9wS0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9Ub3BLJztcbmltcG9ydCB7IHRyYW5zZm9ybUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9UcmFuc2Zvcm0nO1xuaW1wb3J0IHsgdHJhbnNwb3NlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1RyYW5zcG9zZSc7XG5pbXBvcnQgeyB1bmlxdWVDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvVW5pcXVlJztcbmltcG9ydCB7IHVucGFja0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9VbnBhY2snO1xuaW1wb3J0IHsgdW5zb3J0ZWRTZWdtZW50U3VtQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1Vuc29ydGVkU2VnbWVudFN1bSc7XG5pbXBvcnQgeyB6ZXJvc0xpa2VDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvWmVyb3NMaWtlJztcbi8vIExpc3QgYWxsIGtlcm5lbCBjb25maWdzIGhlcmVcbmNvbnN0IGtlcm5lbENvbmZpZ3MgPSBbXG4gICAgTFJOQ29uZmlnLFxuICAgIExSTkdyYWRDb25maWcsXG4gICAgX2Z1c2VkTWF0TXVsQ29uZmlnLFxuICAgIGFic0NvbmZpZyxcbiAgICBhY29zQ29uZmlnLFxuICAgIGFjb3NoQ29uZmlnLFxuICAgIGFkZENvbmZpZyxcbiAgICBhZGROQ29uZmlnLFxuICAgIGFsbENvbmZpZyxcbiAgICBhbnlDb25maWcsXG4gICAgYXJnTWF4Q29uZmlnLFxuICAgIGFyZ01pbkNvbmZpZyxcbiAgICBhc2luQ29uZmlnLFxuICAgIGFzaW5oQ29uZmlnLFxuICAgIGF0YW4yQ29uZmlnLFxuICAgIGF0YW5Db25maWcsXG4gICAgYXRhbmhDb25maWcsXG4gICAgYXZnUG9vbDNEQ29uZmlnLFxuICAgIGF2Z1Bvb2xDb25maWcsXG4gICAgYXZnUG9vbEdyYWQzRENvbmZpZyxcbiAgICBhdmdQb29sR3JhZENvbmZpZyxcbiAgICBiYXRjaE1hdE11bENvbmZpZyxcbiAgICBiYXRjaE5vcm1Db25maWcsXG4gICAgYmF0Y2hUb1NwYWNlTkRDb25maWcsXG4gICAgYmluY291bnRDb25maWcsXG4gICAgY2FzdENvbmZpZyxcbiAgICBjZWlsQ29uZmlnLFxuICAgIGNsaXBCeVZhbHVlQ29uZmlnLFxuICAgIGNvbXBsZXhBYnNDb25maWcsXG4gICAgY29tcGxleENvbmZpZyxcbiAgICBjb25jYXRDb25maWcsXG4gICAgY29udjJEQmFja3Byb3BGaWx0ZXJDb25maWcsXG4gICAgY29udjJEQmFja3Byb3BJbnB1dENvbmZpZyxcbiAgICBjb252MkRDb25maWcsXG4gICAgY29udjNEQmFja3Byb3BGaWx0ZXJWMkNvbmZpZyxcbiAgICBjb252M0RCYWNrcHJvcElucHV0Q29uZmlnLFxuICAgIGNvbnYzRENvbmZpZyxcbiAgICBjb3NDb25maWcsXG4gICAgY29zaENvbmZpZyxcbiAgICBjcm9wQW5kUmVzaXplQ29uZmlnLFxuICAgIGN1bXN1bUNvbmZpZyxcbiAgICBkZW5zZUJpbmNvdW50Q29uZmlnLFxuICAgIGRlcHRoVG9TcGFjZUNvbmZpZyxcbiAgICBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlckNvbmZpZyxcbiAgICBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0Q29uZmlnLFxuICAgIGRlcHRod2lzZUNvbnYyZE5hdGl2ZUNvbmZpZyxcbiAgICBkaWFnQ29uZmlnLFxuICAgIGRpbGF0aW9uMkRDb25maWcsXG4gICAgZWluc3VtQ29uZmlnLFxuICAgIGVsdUNvbmZpZyxcbiAgICBlbHVHcmFkQ29uZmlnLFxuICAgIGVxdWFsQ29uZmlnLFxuICAgIGVyZkNvbmZpZyxcbiAgICBleHBDb25maWcsXG4gICAgZXhwYW5kRGltc0NvbmZpZyxcbiAgICBleHBtMUNvbmZpZyxcbiAgICBmZnRDb25maWcsXG4gICAgZmlsbENvbmZpZyxcbiAgICBmbGlwTGVmdFJpZ2h0Q29uZmlnLFxuICAgIGZsb29yQ29uZmlnLFxuICAgIGZsb29yRGl2Q29uZmlnLFxuICAgIGZyb21QaXhlbHNDb25maWcsXG4gICAgZnVzZWRDb252MkRDb25maWcsXG4gICAgZnVzZWREZXB0aHdpc2VDb252MkRDb25maWcsXG4gICAgZ2F0aGVyTmRDb25maWcsXG4gICAgZ2F0aGVyVjJDb25maWcsXG4gICAgZ3JlYXRlckNvbmZpZyxcbiAgICBncmVhdGVyRXF1YWxDb25maWcsXG4gICAgaWRlbnRpdHlDb25maWcsXG4gICAgaWZmdENvbmZpZyxcbiAgICBpbWFnQ29uZmlnLFxuICAgIGlzRmluaXRlQ29uZmlnLFxuICAgIGlzSW5mQ29uZmlnLFxuICAgIGlzTmFOQ29uZmlnLFxuICAgIGxlYWt5UmVsdUNvbmZpZyxcbiAgICBsZXNzQ29uZmlnLFxuICAgIGxlc3NFcXVhbENvbmZpZyxcbiAgICBsaW5TcGFjZUNvbmZpZyxcbiAgICBsb2cxcENvbmZpZyxcbiAgICBsb2dDb25maWcsXG4gICAgbG9naWNhbEFuZENvbmZpZyxcbiAgICBsb2dpY2FsTm90Q29uZmlnLFxuICAgIGxvZ2ljYWxPckNvbmZpZyxcbiAgICBtYXhDb25maWcsXG4gICAgbWF4UG9vbDNEQ29uZmlnLFxuICAgIG1heFBvb2xDb25maWcsXG4gICAgbWF4UG9vbEdyYWQzRENvbmZpZyxcbiAgICBtYXhQb29sR3JhZENvbmZpZyxcbiAgICBtYXhQb29sV2l0aEFyZ21heENvbmZpZyxcbiAgICBtYXhpbXVtQ29uZmlnLFxuICAgIG1lYW5Db25maWcsXG4gICAgbWluQ29uZmlnLFxuICAgIG1pbmltdW1Db25maWcsXG4gICAgbWlycm9yUGFkQ29uZmlnLFxuICAgIG1vZENvbmZpZyxcbiAgICBtdWx0aW5vbWlhbENvbmZpZyxcbiAgICBtdWx0aXBseUNvbmZpZyxcbiAgICBuZWdDb25maWcsXG4gICAgbm9uTWF4U3VwcHJlc3Npb25WM0NvbmZpZyxcbiAgICBub25NYXhTdXBwcmVzc2lvblY0Q29uZmlnLFxuICAgIG5vbk1heFN1cHByZXNzaW9uVjVDb25maWcsXG4gICAgbm90RXF1YWxDb25maWcsXG4gICAgb25lSG90Q29uZmlnLFxuICAgIG9uZXNMaWtlQ29uZmlnLFxuICAgIHBhY2tDb25maWcsXG4gICAgcGFkVjJDb25maWcsXG4gICAgcG93Q29uZmlnLFxuICAgIHByZWx1Q29uZmlnLFxuICAgIHByb2RDb25maWcsXG4gICAgcmFuZ2VDb25maWcsXG4gICAgcmVhbENvbmZpZyxcbiAgICByZWFsRGl2Q29uZmlnLFxuICAgIHJlY2lwcm9jYWxDb25maWcsXG4gICAgcmVsdTZDb25maWcsXG4gICAgcmVsdUNvbmZpZyxcbiAgICByZXNoYXBlQ29uZmlnLFxuICAgIHJlc2l6ZUJpbGluZWFyQ29uZmlnLFxuICAgIHJlc2l6ZUJpbGluZWFyR3JhZENvbmZpZyxcbiAgICByZXNpemVOZWFyZXN0TmVpZ2hib3JDb25maWcsXG4gICAgcmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZENvbmZpZyxcbiAgICByZXZlcnNlQ29uZmlnLFxuICAgIHJvdGF0ZVdpdGhPZmZzZXRDb25maWcsXG4gICAgcm91bmRDb25maWcsXG4gICAgcnNxcnRDb25maWcsXG4gICAgc2NhdHRlck5kQ29uZmlnLFxuICAgIHNlbGVjdENvbmZpZyxcbiAgICBzZWx1Q29uZmlnLFxuICAgIHNpZ21vaWRDb25maWcsXG4gICAgc2lnbkNvbmZpZyxcbiAgICBzaW5Db25maWcsXG4gICAgc2luaENvbmZpZyxcbiAgICBzbGljZUNvbmZpZyxcbiAgICBzb2Z0bWF4Q29uZmlnLFxuICAgIHNvZnRwbHVzQ29uZmlnLFxuICAgIHNwYWNlVG9CYXRjaE5EQ29uZmlnLFxuICAgIHNwYXJzZUZpbGxFbXB0eVJvd3NDb25maWcsXG4gICAgc3BhcnNlUmVzaGFwZUNvbmZpZyxcbiAgICBzcGFyc2VTZWdtZW50TWVhbkNvbmZpZyxcbiAgICBzcGFyc2VTZWdtZW50U3VtQ29uZmlnLFxuICAgIHNwYXJzZVRvRGVuc2VDb25maWcsXG4gICAgc3BsaXRWQ29uZmlnLFxuICAgIHNxcnRDb25maWcsXG4gICAgc3F1YXJlQ29uZmlnLFxuICAgIHNxdWFyZWREaWZmZXJlbmNlQ29uZmlnLFxuICAgIHN0ZXBDb25maWcsXG4gICAgc3RyaWRlZFNsaWNlQ29uZmlnLFxuICAgIHN0cmluZ05HcmFtc0NvbmZpZyxcbiAgICBzdHJpbmdTcGxpdENvbmZpZyxcbiAgICBzdHJpbmdUb0hhc2hCdWNrZXRGYXN0Q29uZmlnLFxuICAgIHN1YkNvbmZpZyxcbiAgICBzdW1Db25maWcsXG4gICAgdGFuQ29uZmlnLFxuICAgIHRhbmhDb25maWcsXG4gICAgdGlsZUNvbmZpZyxcbiAgICB0b3BLQ29uZmlnLFxuICAgIHRyYW5zZm9ybUNvbmZpZyxcbiAgICB0cmFuc3Bvc2VDb25maWcsXG4gICAgdW5pcXVlQ29uZmlnLFxuICAgIHVucGFja0NvbmZpZyxcbiAgICB1bnNvcnRlZFNlZ21lbnRTdW1Db25maWcsXG4gICAgemVyb3NMaWtlQ29uZmlnXG5dO1xuZm9yIChjb25zdCBrZXJuZWxDb25maWcgb2Yga2VybmVsQ29uZmlncykge1xuICAgIHJlZ2lzdGVyS2VybmVsKGtlcm5lbENvbmZpZyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWdpc3Rlcl9hbGxfa2VybmVscy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgKiBhcyBzaGFkZXJfdXRpbCBmcm9tICcuL3NoYWRlcl9jb21waWxlcl91dGlsJztcbmV4cG9ydCBjbGFzcyBSZXNoYXBlUGFja2VkUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3Iob3V0cHV0U2hhcGUsIGlucHV0U2hhcGUpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWydBJ107XG4gICAgICAgIHRoaXMucGFja2VkSW5wdXRzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wYWNrZWRPdXRwdXQgPSB0cnVlO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGU7XG4gICAgICAgIGxldCBtYWluTG9vcCA9IGBgO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgICAgICAgICAgbGV0IHRoaXNSQyA9IGB0aGlzUkMgPSByYztgO1xuICAgICAgICAgICAgaWYgKGkgJSAyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgdGhpc1JDICs9IGB0aGlzUkMueiArPSAxO2A7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaSA+IDEpIHtcbiAgICAgICAgICAgICAgICB0aGlzUkMgKz0gYHRoaXNSQy55ICs9IDE7YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1haW5Mb29wICs9IGBcbiAgICAgICAgJHt0aGlzUkN9XG4gICAgICAgICR7aSA+IDAgPyBgaWYodGhpc1JDLnkgPCByb3dzICYmIHRoaXNSQy56IDwgY29scyl7YCA6ICcnfVxuICAgICAgICAgIGludCBmbGF0SW5kZXggPSBnZXRGbGF0SW5kZXgodGhpc1JDKTtcblxuICAgICAgICAgIGl2ZWMzIGlucHV0UkMgPSBpbnB1dENvb3Jkc0Zyb21SZXNoYXBlZE91dENvb3JkcyhmbGF0SW5kZXgpO1xuICAgICAgICAgIHZlYzIgaW5wdXRSQ0lubmVyRGltcyA9IHZlYzIoZmxvYXQoaW5wdXRSQy55KSxmbG9hdChpbnB1dFJDLnopKTtcblxuICAgICAgICAgIHJlc3VsdFske2l9XSA9XG4gICAgICAgICAgICBnZXRDaGFubmVsKGdldEEoaW5wdXRSQy54LCBpbnB1dFJDLnksIGlucHV0UkMueiksIGlucHV0UkNJbm5lckRpbXMpO1xuICAgICAgICAke2kgPiAwID8gJ30nIDogJyd9XG4gICAgICBgO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAke2dldFJlc2hhcGVkSW5wdXRDb29yZHMoaW5wdXRTaGFwZSl9XG4gICAgICAke3NoYWRlcl91dGlsLmdldEZsYXRJbmRleEZyb20zRChvdXRwdXRTaGFwZSl9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzMgcmMgPSBnZXRPdXRwdXRDb29yZHMoKTtcblxuICAgICAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoMC4pO1xuXG4gICAgICAgIGl2ZWMzIHRoaXNSQztcbiAgICAgICAgaW50IHJvd3MgPSAke291dHB1dFNoYXBlWzFdfTtcbiAgICAgICAgaW50IGNvbHMgPSAke291dHB1dFNoYXBlWzJdfTtcblxuICAgICAgICAke21haW5Mb29wfVxuXG4gICAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0UmVzaGFwZWRJbnB1dENvb3JkcyhzaGFwZSkge1xuICAgIGNvbnN0IGNvb3Jkc0Zyb21JbmRleFNuaXBwZXQgPSBzaGFkZXJfdXRpbC5nZXRMb2dpY2FsQ29vcmRpbmF0ZXNGcm9tRmxhdEluZGV4KFsncicsICdjJywgJ2QnXSwgc2hhcGUpO1xuICAgIHJldHVybiBgXG4gICAgaXZlYzMgaW5wdXRDb29yZHNGcm9tUmVzaGFwZWRPdXRDb29yZHMoaW50IGluZGV4KSB7XG4gICAgICAke2Nvb3Jkc0Zyb21JbmRleFNuaXBwZXR9XG4gICAgICByZXR1cm4gaXZlYzMociwgYywgZCk7XG4gICAgfVxuICBgO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVzaGFwZV9wYWNrZWRfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmV4cG9ydCBjbGFzcyBSZXNpemVCaWxpbmVhckJhY2twcm9wUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoZHlTaGFwZSwgaW5wdXRTaGFwZSwgYWxpZ25Db3JuZXJzKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsnZHknXTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IFtdO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gaW5wdXRTaGFwZTtcbiAgICAgICAgY29uc3QgWywgeEhlaWdodCwgeFdpZHRoLF0gPSBpbnB1dFNoYXBlO1xuICAgICAgICBjb25zdCBbLCB5SGVpZ2h0LCB5V2lkdGhdID0gZHlTaGFwZTtcbiAgICAgICAgLy8gSW4gdGhlIGJhY2t3YXJkcyBwYXNzLCB3ZSB3YW50IHRvIGZpbmQgdGhlIHBpeGVscyB0aGF0IHdlcmUgZ2VuZXJhdGVkIGZvclxuICAgICAgICAvLyBlYWNoIHBpeGVsIGluIHRoZSBpbnB1dCBpbWFnZSB0aGUgZm9yd2FyZCBwYXNzIGFuZCBhZGQgdGhlIGNvcnJlc3BvbmRpbmdcbiAgICAgICAgLy8gY29lZmZpY2llbnQgZnJvbSBkeSB0byB0aGUgZ3JhZGllbnQgKHdpdGggc29tZSBpbnRlcnBvbGF0aW9uKS5cbiAgICAgICAgY29uc3QgZWZmZWN0aXZlWFNpemUgPSBbXG4gICAgICAgICAgICAoYWxpZ25Db3JuZXJzICYmIHlIZWlnaHQgPiAxKSA/IHhIZWlnaHQgLSAxIDogeEhlaWdodCxcbiAgICAgICAgICAgIChhbGlnbkNvcm5lcnMgJiYgeVdpZHRoID4gMSkgPyB4V2lkdGggLSAxIDogeFdpZHRoXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZVlTaXplID0gW1xuICAgICAgICAgICAgKGFsaWduQ29ybmVycyAmJiB5SGVpZ2h0ID4gMSkgPyB5SGVpZ2h0IC0gMSA6IHlIZWlnaHQsXG4gICAgICAgICAgICAoYWxpZ25Db3JuZXJzICYmIHlXaWR0aCA+IDEpID8geVdpZHRoIC0gMSA6IHlXaWR0aFxuICAgICAgICBdO1xuICAgICAgICBjb25zdCBoZWlnaHRTY2FsZSA9IGVmZmVjdGl2ZVhTaXplWzBdIC8gZWZmZWN0aXZlWVNpemVbMF07XG4gICAgICAgIGNvbnN0IHdpZHRoU2NhbGUgPSBlZmZlY3RpdmVYU2l6ZVsxXSAvIGVmZmVjdGl2ZVlTaXplWzFdO1xuICAgICAgICBjb25zdCBpbnZIZWlnaHRTY2FsZSA9IDEgLyBoZWlnaHRTY2FsZTtcbiAgICAgICAgY29uc3QgaW52V2lkdGhTY2FsZSA9IDEgLyB3aWR0aFNjYWxlO1xuICAgICAgICAvLyBUaGlzIGRlZmluZXMgdGhlIHNpemUgb2YgdGhlIHdpbmRvdyBvZiB2YWx1ZXMgYXJvdW5kIGEgcGFydGljdWxhclxuICAgICAgICAvLyBpbmRleCBpbiBkeSB0aGF0IHdlIHdhbnQgdG8gc2VhcmNoIGZvciBjb250cmlidXRpb25zIHRvIGR4LlxuICAgICAgICBjb25zdCB3aW5IZWlnaHQgPSAoTWF0aC5jZWlsKGludkhlaWdodFNjYWxlKSAqIDIpICsgMjtcbiAgICAgICAgY29uc3Qgd2luV2lkdGggPSAoTWF0aC5jZWlsKGludldpZHRoU2NhbGUpICogMikgKyAyO1xuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGIgPSBjb29yZHNbMF07XG4gICAgICAgIGludCBkID0gY29vcmRzWzNdO1xuICAgICAgICBpbnQgciA9IGNvb3Jkc1sxXTtcbiAgICAgICAgaW50IGMgPSBjb29yZHNbMl07XG5cbiAgICAgICAgZmxvYXQgYWNjdW11bGF0b3IgPSAwLjA7XG5cbiAgICAgICAgY29uc3QgZmxvYXQgaGVpZ2h0U2NhbGUgPSBmbG9hdCgke2hlaWdodFNjYWxlfSk7XG4gICAgICAgIGNvbnN0IGZsb2F0IHdpZHRoU2NhbGUgPSBmbG9hdCgke3dpZHRoU2NhbGV9KTtcblxuICAgICAgICBjb25zdCBmbG9hdCBpbnZIZWlnaHRTY2FsZSA9IGZsb2F0KCR7aW52SGVpZ2h0U2NhbGV9KTtcbiAgICAgICAgY29uc3QgZmxvYXQgaW52V2lkdGhTY2FsZSA9IGZsb2F0KCR7aW52V2lkdGhTY2FsZX0pO1xuXG4gICAgICAgIGNvbnN0IGludCB3aW5IZWlnaHQgPSBpbnQoJHt3aW5IZWlnaHR9KTtcbiAgICAgICAgY29uc3QgaW50IHdpbldpZHRoID0gaW50KCR7d2luV2lkdGh9KTtcblxuICAgICAgICAvLyBDb21wdXRlIGJvdW5kcyBmb3Igd2hlcmUgaW4gZHkgd2Ugd2lsbCBsb29rXG4gICAgICAgIGZsb2F0IHN0YXJ0UkxlcnAgPSBmbG9vcihmbG9hdChyKSAqIGludkhlaWdodFNjYWxlKTtcbiAgICAgICAgaW50IHN0YXJ0RHlSID0gaW50KHN0YXJ0UkxlcnAgLSBmbG9hdCh3aW5IZWlnaHQgLyAyKSk7XG5cbiAgICAgICAgZmxvYXQgc3RhcnRDTGVycCA9IGZsb29yKGZsb2F0KGMpICogaW52V2lkdGhTY2FsZSk7XG4gICAgICAgIGludCBzdGFydER5QyA9IGludChzdGFydENMZXJwIC0gZmxvYXQod2luV2lkdGggLyAyKSk7XG5cbiAgICAgICAgLy8gTG9vcCBvdmVyIGR5XG4gICAgICAgIGZvciAoaW50IGR5Uk9mZnNldCA9IDA7IGR5Uk9mZnNldCA8IHdpbkhlaWdodDsgZHlST2Zmc2V0KyspIHtcbiAgICAgICAgICBpbnQgZHlSID0gZHlST2Zmc2V0ICsgc3RhcnREeVI7XG5cbiAgICAgICAgICAvLyBHdWFyZCBhZ2FpbnN0IHRoZSB3aW5kb3cgZXhjZWVkaW5nIHRoZSBib3VuZHMgb2YgZHlcbiAgICAgICAgICBpZiAoZHlSIDwgMCB8fCBkeVIgPj0gJHt5SGVpZ2h0fSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yIChpbnQgZHlDT2Zmc2V0ID0gMDsgZHlDT2Zmc2V0IDwgd2luV2lkdGg7IGR5Q09mZnNldCsrKSB7XG4gICAgICAgICAgICBpbnQgZHlDID0gZHlDT2Zmc2V0ICsgc3RhcnREeUM7XG5cbiAgICAgICAgICAgIC8vIEd1YXJkIGFnYWluc3QgdGhlIHdpbmRvdyBleGNlZWRpbmcgdGhlIGJvdW5kcyBvZiBkeVxuICAgICAgICAgICAgaWYgKGR5QyA8IDAgfHwgZHlDID49ICR7eVdpZHRofSkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZmxvYXQgZHhSID0gZmxvYXQoZHlSKSAqIGhlaWdodFNjYWxlO1xuICAgICAgICAgICAgaW50IHRvcER4UkluZGV4ID0gaW50KGZsb29yKGR4UikpO1xuICAgICAgICAgICAgaW50IGJvdHRvbUR4UkluZGV4ID0gaW50KG1pbihjZWlsKGR4UiksICR7eEhlaWdodCAtIDF9LjApKTtcbiAgICAgICAgICAgIGZsb2F0IGR4UkxlcnAgPSBkeFIgLSBmbG9hdCh0b3BEeFJJbmRleCk7XG4gICAgICAgICAgICBmbG9hdCBpbnZlcnNlRHhSTGVycCA9IDEuMCAtIGR4UkxlcnA7XG5cbiAgICAgICAgICAgIGZsb2F0IGR4QyA9IGZsb2F0KGR5QykgKiB3aWR0aFNjYWxlO1xuICAgICAgICAgICAgaW50IGxlZnREeENJbmRleCA9IGludChmbG9vcihkeEMpKTtcbiAgICAgICAgICAgIGludCByaWdodER4Q0luZGV4ID0gaW50KG1pbihjZWlsKGR4QyksICR7eFdpZHRoIC0gMX0uMCkpO1xuICAgICAgICAgICAgZmxvYXQgZHhDTGVycCA9IGR4QyAtIGZsb2F0KGxlZnREeENJbmRleCk7XG4gICAgICAgICAgICBmbG9hdCBpbnZlcnNlRHhDTGVycCA9IDEuMCAtIGR4Q0xlcnA7XG5cbiAgICAgICAgICAgIGlmIChyID09IHRvcER4UkluZGV4ICYmIGMgPT0gbGVmdER4Q0luZGV4KSB7XG4gICAgICAgICAgICAgIC8vIHRvcExlZnRcbiAgICAgICAgICAgICAgYWNjdW11bGF0b3IgKz1cbiAgICAgICAgICAgICAgICBnZXREeShiLCBkeVIsIGR5QywgZCkgKiBpbnZlcnNlRHhSTGVycCAqIGludmVyc2VEeENMZXJwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAociA9PSB0b3BEeFJJbmRleCAmJiBjID09IHJpZ2h0RHhDSW5kZXgpIHtcbiAgICAgICAgICAgICAgLy8gdG9wUmlnaHRcbiAgICAgICAgICAgICAgYWNjdW11bGF0b3IgKz0gZ2V0RHkoYiwgZHlSLCBkeUMsIGQpICogaW52ZXJzZUR4UkxlcnAgKiBkeENMZXJwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAociA9PSBib3R0b21EeFJJbmRleCAmJiBjID09IGxlZnREeENJbmRleCkge1xuICAgICAgICAgICAgICAvLyBib3R0b21MZWZ0XG4gICAgICAgICAgICAgIGFjY3VtdWxhdG9yICs9IGdldER5KGIsIGR5UiwgZHlDLCBkKSAqIGR4UkxlcnAgKiBpbnZlcnNlRHhDTGVycDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHIgPT0gYm90dG9tRHhSSW5kZXggJiYgYyA9PSByaWdodER4Q0luZGV4KSB7XG4gICAgICAgICAgICAgIC8vIGJvdHRvbVJpZ2h0XG4gICAgICAgICAgICAgIGFjY3VtdWxhdG9yICs9IGdldER5KGIsIGR5UiwgZHlDLCBkKSAqIGR4UkxlcnAgKiBkeENMZXJwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBFbmQgbG9vcCBvdmVyIGR5XG5cbiAgICAgICAgc2V0T3V0cHV0KGFjY3VtdWxhdG9yKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlc2l6ZV9iaWxpbmVhcl9iYWNrcHJvcF9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuZXhwb3J0IGNsYXNzIFJlc2l6ZUJpbGluZWFyUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoaW5wdXRTaGFwZSwgbmV3SGVpZ2h0LCBuZXdXaWR0aCwgYWxpZ25Db3JuZXJzLCBoYWxmUGl4ZWxDZW50ZXJzKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gW107XG4gICAgICAgIGNvbnN0IFtiYXRjaCwgb2xkSGVpZ2h0LCBvbGRXaWR0aCwgZGVwdGhdID0gaW5wdXRTaGFwZTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IFtiYXRjaCwgbmV3SGVpZ2h0LCBuZXdXaWR0aCwgZGVwdGhdO1xuICAgICAgICBjb25zdCBlZmZlY3RpdmVJblNpemUgPSBbXG4gICAgICAgICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld0hlaWdodCA+IDEpID8gb2xkSGVpZ2h0IC0gMSA6IG9sZEhlaWdodCxcbiAgICAgICAgICAgIChhbGlnbkNvcm5lcnMgJiYgbmV3V2lkdGggPiAxKSA/IG9sZFdpZHRoIC0gMSA6IG9sZFdpZHRoXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZU91dFNpemUgPSBbXG4gICAgICAgICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld0hlaWdodCA+IDEpID8gbmV3SGVpZ2h0IC0gMSA6IG5ld0hlaWdodCxcbiAgICAgICAgICAgIChhbGlnbkNvcm5lcnMgJiYgbmV3V2lkdGggPiAxKSA/IG5ld1dpZHRoIC0gMSA6IG5ld1dpZHRoXG4gICAgICAgIF07XG4gICAgICAgIGxldCBzb3VyY2VGcmFjSW5kZXhSQztcbiAgICAgICAgaWYgKGhhbGZQaXhlbENlbnRlcnMpIHtcbiAgICAgICAgICAgIHNvdXJjZUZyYWNJbmRleFJDID1cbiAgICAgICAgICAgICAgICBgKHZlYzIoeVJDKSArIHZlYzIoMC41KSkgKiBlZmZlY3RpdmVJbnB1dE92ZXJPdXRwdXRSYXRpb1JDYCArXG4gICAgICAgICAgICAgICAgICAgIGAgLSB2ZWMyKDAuNSlgO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc291cmNlRnJhY0luZGV4UkMgPSBgdmVjMih5UkMpICogZWZmZWN0aXZlSW5wdXRPdmVyT3V0cHV0UmF0aW9SQ2A7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IHZlYzIgZWZmZWN0aXZlSW5wdXRPdmVyT3V0cHV0UmF0aW9SQyA9IHZlYzIoXG4gICAgICAgICAgJHtlZmZlY3RpdmVJblNpemVbMF0gLyBlZmZlY3RpdmVPdXRTaXplWzBdfSxcbiAgICAgICAgICAke2VmZmVjdGl2ZUluU2l6ZVsxXSAvIGVmZmVjdGl2ZU91dFNpemVbMV19KTtcbiAgICAgIGNvbnN0IHZlYzIgaW5wdXRTaGFwZVJDID0gdmVjMigke29sZEhlaWdodH0uMCwgJHtvbGRXaWR0aH0uMCk7XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgZCA9IGNvb3Jkc1szXTtcbiAgICAgICAgaXZlYzIgeVJDID0gY29vcmRzLnl6O1xuXG4gICAgICAgIC8vIEZyYWN0aW9uYWwgc291cmNlIGluZGV4LlxuICAgICAgICB2ZWMyIHNvdXJjZUZyYWNJbmRleFJDID0gJHtzb3VyY2VGcmFjSW5kZXhSQ307XG5cbiAgICAgICAgLy8gQ29tcHV0ZSB0aGUgZm91ciBpbnRlZ2VyIGluZGljZXMuXG4gICAgICAgIGl2ZWMyIHNvdXJjZUZsb29yUkMgPSBpdmVjMihtYXgoc291cmNlRnJhY0luZGV4UkMsIHZlYzIoMC4wKSkpO1xuICAgICAgICBpdmVjMiBzb3VyY2VDZWlsUkMgPSBpdmVjMihcbiAgICAgICAgICBtaW4oaW5wdXRTaGFwZVJDIC0gMS4wLCBjZWlsKHNvdXJjZUZyYWNJbmRleFJDKSkpO1xuXG4gICAgICAgIGZsb2F0IHRvcExlZnQgPSBnZXRBKGIsIHNvdXJjZUZsb29yUkMueCwgc291cmNlRmxvb3JSQy55LCBkKTtcbiAgICAgICAgZmxvYXQgYm90dG9tTGVmdCA9IGdldEEoYiwgc291cmNlQ2VpbFJDLngsIHNvdXJjZUZsb29yUkMueSwgZCk7XG4gICAgICAgIGZsb2F0IHRvcFJpZ2h0ID0gZ2V0QShiLCBzb3VyY2VGbG9vclJDLngsIHNvdXJjZUNlaWxSQy55LCBkKTtcbiAgICAgICAgZmxvYXQgYm90dG9tUmlnaHQgPSBnZXRBKGIsIHNvdXJjZUNlaWxSQy54LCBzb3VyY2VDZWlsUkMueSwgZCk7XG5cbiAgICAgICAgdmVjMiBmcmFjUkMgPSBzb3VyY2VGcmFjSW5kZXhSQyAtIHZlYzIoc291cmNlRmxvb3JSQyk7XG5cbiAgICAgICAgZmxvYXQgdG9wID0gdG9wTGVmdCArICh0b3BSaWdodCAtIHRvcExlZnQpICogZnJhY1JDLnk7XG4gICAgICAgIGZsb2F0IGJvdHRvbSA9IGJvdHRvbUxlZnQgKyAoYm90dG9tUmlnaHQgLSBib3R0b21MZWZ0KSAqIGZyYWNSQy55O1xuICAgICAgICBmbG9hdCBuZXdWYWx1ZSA9IHRvcCArIChib3R0b20gLSB0b3ApICogZnJhY1JDLng7XG5cbiAgICAgICAgc2V0T3V0cHV0KG5ld1ZhbHVlKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlc2l6ZV9iaWxpbmVhcl9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuZXhwb3J0IGNsYXNzIFJlc2l6ZUJpbGluZWFyUGFja2VkUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoaW5wdXRTaGFwZSwgbmV3SGVpZ2h0LCBuZXdXaWR0aCwgYWxpZ25Db3JuZXJzLCBoYWxmUGl4ZWxDZW50ZXJzKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICAgICAgICB0aGlzLnBhY2tlZElucHV0cyA9IHRydWU7XG4gICAgICAgIHRoaXMucGFja2VkT3V0cHV0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IFtdO1xuICAgICAgICBjb25zdCBbYmF0Y2gsIG9sZEhlaWdodCwgb2xkV2lkdGgsIGRlcHRoXSA9IGlucHV0U2hhcGU7XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBbYmF0Y2gsIG5ld0hlaWdodCwgbmV3V2lkdGgsIGRlcHRoXTtcbiAgICAgICAgY29uc3QgZWZmZWN0aXZlSW5TaXplID0gW1xuICAgICAgICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdIZWlnaHQgPiAxKSA/IG9sZEhlaWdodCAtIDEgOiBvbGRIZWlnaHQsXG4gICAgICAgICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld1dpZHRoID4gMSkgPyBvbGRXaWR0aCAtIDEgOiBvbGRXaWR0aFxuICAgICAgICBdO1xuICAgICAgICBjb25zdCBlZmZlY3RpdmVPdXRTaXplID0gW1xuICAgICAgICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdIZWlnaHQgPiAxKSA/IG5ld0hlaWdodCAtIDEgOiBuZXdIZWlnaHQsXG4gICAgICAgICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld1dpZHRoID4gMSkgPyBuZXdXaWR0aCAtIDEgOiBuZXdXaWR0aFxuICAgICAgICBdO1xuICAgICAgICBsZXQgc291cmNlRnJhY0luZGV4UkM7XG4gICAgICAgIGlmIChoYWxmUGl4ZWxDZW50ZXJzKSB7XG4gICAgICAgICAgICBzb3VyY2VGcmFjSW5kZXhSQyA9IGAodmVjMyh5UkMpICsgdmVjMygwLjUpKSAqIGAgK1xuICAgICAgICAgICAgICAgIGBlZmZlY3RpdmVJbnB1dE92ZXJPdXRwdXRSYXRpb1JDIC0gdmVjMygwLjUpYDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNvdXJjZUZyYWNJbmRleFJDID0gYHZlYzMoeVJDKSAqIGVmZmVjdGl2ZUlucHV0T3Zlck91dHB1dFJhdGlvUkNgO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCB2ZWMzIGVmZmVjdGl2ZUlucHV0T3Zlck91dHB1dFJhdGlvUkMgPSB2ZWMzKFxuICAgICAgICAgICR7ZWZmZWN0aXZlSW5TaXplWzBdIC8gZWZmZWN0aXZlT3V0U2l6ZVswXX0sXG4gICAgICAgICAgJHtlZmZlY3RpdmVJblNpemVbMV0gLyBlZmZlY3RpdmVPdXRTaXplWzFdfSxcbiAgICAgICAgICAke2VmZmVjdGl2ZUluU2l6ZVsxXSAvIGVmZmVjdGl2ZU91dFNpemVbMV19KTtcbiAgICAgIGNvbnN0IHZlYzMgaW5wdXRTaGFwZVJDID0gdmVjMygke29sZEhlaWdodH0uMCwgJHtvbGRXaWR0aH0uMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke29sZFdpZHRofS4wKTtcblxuICAgICAgZmxvYXQgZ2V0QVZhbHVlKGludCBiLCBpbnQgciwgaW50IGMsIGludCBkKSB7XG4gICAgICAgIHJldHVybiBnZXRDaGFubmVsKGdldEEoYiwgciwgYywgZCksIHZlYzIoYywgZCkpO1xuICAgICAgfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYiA9IGNvb3Jkc1swXTtcbiAgICAgICAgaW50IGQgPSBjb29yZHNbM107XG4gICAgICAgIC8vIENhbGN1bGF0ZSB2YWx1ZXMgZm9yIG5leHQgY29sdW1uIGluIHlSQy56LlxuICAgICAgICBpdmVjMyB5UkMgPSBjb29yZHMueXp6ICsgaXZlYzMoMCwgMCwgMSk7XG5cbiAgICAgICAgLy8gRnJhY3Rpb25hbCBzb3VyY2UgaW5kZXguXG4gICAgICAgIHZlYzMgc291cmNlRnJhY0luZGV4UkMgPSAke3NvdXJjZUZyYWNJbmRleFJDfTtcblxuICAgICAgICAvLyBDb21wdXRlIHRoZSBmb3VyIGludGVnZXIgaW5kaWNlcy5cbiAgICAgICAgaXZlYzMgc291cmNlRmxvb3JSQyA9IGl2ZWMzKG1heChzb3VyY2VGcmFjSW5kZXhSQywgdmVjMygwLjApKSk7XG4gICAgICAgIGl2ZWMzIHNvdXJjZUNlaWxSQyA9IGl2ZWMzKFxuICAgICAgICAgIG1pbihpbnB1dFNoYXBlUkMgLSAxLjAsIGNlaWwoc291cmNlRnJhY0luZGV4UkMpKSk7XG5cbiAgICAgICAgLy8gU2hvdWxkIHdlIGNhbGN1bGF0ZSBuZXh0IGNvbHVtbiBhbmQgcm93IGVsZW1lbnRzIGluIDJ4MiBwYWNrZWQgY2VsbC5cbiAgICAgICAgYm9vbCBoYXNOZXh0Q29sID0gZCA8ICR7ZGVwdGggLSAxfTtcbiAgICAgICAgYm9vbCBoYXNOZXh0Um93ID0gY29vcmRzLnogPCAke25ld1dpZHRoIC0gMX07XG5cbiAgICAgICAgLy8gSW4gcGFyYWxsZWwsIGNvbnN0cnVjdCBmb3VyIGNvcm5lcnMgZm9yIGFsbCBmb3VyIGNvbXBvbmVudHMgaW5cbiAgICAgICAgLy8gcGFja2VkIDJ4MiBjZWxsLlxuICAgICAgICB2ZWM0IHRvcExlZnQgPSB2ZWM0KFxuICAgICAgICAgIGdldEFWYWx1ZShiLCBzb3VyY2VGbG9vclJDLngsIHNvdXJjZUZsb29yUkMueSwgZCksXG4gICAgICAgICAgaGFzTmV4dENvbCA/IGdldEFWYWx1ZShiLCBzb3VyY2VGbG9vclJDLngsIHNvdXJjZUZsb29yUkMueSwgZCArIDEpXG4gICAgICAgICAgICAgICAgICAgICA6IDAuMCxcbiAgICAgICAgICBoYXNOZXh0Um93ID8gZ2V0QVZhbHVlKGIsIHNvdXJjZUZsb29yUkMueCwgc291cmNlRmxvb3JSQy56LCBkKVxuICAgICAgICAgICAgICAgICAgICAgOiAwLjAsXG4gICAgICAgICAgKGhhc05leHRSb3cgJiYgaGFzTmV4dENvbCkgP1xuICAgICAgICAgICAgZ2V0QVZhbHVlKGIsIHNvdXJjZUZsb29yUkMueCwgc291cmNlRmxvb3JSQy56LCBkICsgMSkgOiAwLjApO1xuXG4gICAgICAgIHZlYzQgYm90dG9tTGVmdCA9IHZlYzQoXG4gICAgICAgICAgZ2V0QVZhbHVlKGIsIHNvdXJjZUNlaWxSQy54LCBzb3VyY2VGbG9vclJDLnksIGQpLFxuICAgICAgICAgIGhhc05leHRDb2wgPyBnZXRBVmFsdWUoYiwgc291cmNlQ2VpbFJDLngsIHNvdXJjZUZsb29yUkMueSwgZCArIDEpXG4gICAgICAgICAgICAgICAgICAgICA6IDAuMCxcbiAgICAgICAgICBoYXNOZXh0Um93ID8gZ2V0QVZhbHVlKGIsIHNvdXJjZUNlaWxSQy54LCBzb3VyY2VGbG9vclJDLnosIGQpXG4gICAgICAgICAgICAgICAgICAgICA6IDAuMCxcbiAgICAgICAgICAoaGFzTmV4dFJvdyAmJiBoYXNOZXh0Q29sKSA/XG4gICAgICAgICAgICBnZXRBVmFsdWUoYiwgc291cmNlQ2VpbFJDLngsIHNvdXJjZUZsb29yUkMueiwgZCArIDEpIDogMC4wKTtcblxuICAgICAgICB2ZWM0IHRvcFJpZ2h0ID0gdmVjNChcbiAgICAgICAgICBnZXRBVmFsdWUoYiwgc291cmNlRmxvb3JSQy54LCBzb3VyY2VDZWlsUkMueSwgZCksXG4gICAgICAgICAgaGFzTmV4dENvbCA/IGdldEFWYWx1ZShiLCBzb3VyY2VGbG9vclJDLngsIHNvdXJjZUNlaWxSQy55LCBkICsgMSlcbiAgICAgICAgICAgICAgICAgICAgIDogMC4wLFxuICAgICAgICAgIGhhc05leHRSb3cgPyBnZXRBVmFsdWUoYiwgc291cmNlRmxvb3JSQy54LCBzb3VyY2VDZWlsUkMueiwgZClcbiAgICAgICAgICAgICAgICAgICAgIDogMC4wLFxuICAgICAgICAgIChoYXNOZXh0Um93ICYmIGhhc05leHRDb2wpID9cbiAgICAgICAgICAgIGdldEFWYWx1ZShiLCBzb3VyY2VGbG9vclJDLngsIHNvdXJjZUNlaWxSQy56LCBkICsgMSkgOiAwLjApO1xuXG4gICAgICAgIHZlYzQgYm90dG9tUmlnaHQgPSB2ZWM0KFxuICAgICAgICAgIGdldEFWYWx1ZShiLCBzb3VyY2VDZWlsUkMueCwgc291cmNlQ2VpbFJDLnksIGQpLFxuICAgICAgICAgIGhhc05leHRDb2wgPyBnZXRBVmFsdWUoYiwgc291cmNlQ2VpbFJDLngsIHNvdXJjZUNlaWxSQy55LCBkICsgMSlcbiAgICAgICAgICAgICAgICAgICAgIDogMC4wLFxuICAgICAgICAgIGhhc05leHRSb3cgPyBnZXRBVmFsdWUoYiwgc291cmNlQ2VpbFJDLngsIHNvdXJjZUNlaWxSQy56LCBkKVxuICAgICAgICAgICAgICAgICAgICAgOiAwLjAsXG4gICAgICAgICAgKGhhc05leHRSb3cgJiYgaGFzTmV4dENvbCkgP1xuICAgICAgICAgICAgZ2V0QVZhbHVlKGIsIHNvdXJjZUNlaWxSQy54LCBzb3VyY2VDZWlsUkMueiwgZCArIDEpIDogMC4wKTtcblxuICAgICAgICB2ZWMzIGZyYWNSQyA9IHNvdXJjZUZyYWNJbmRleFJDIC0gdmVjMyhzb3VyY2VGbG9vclJDKTtcblxuICAgICAgICB2ZWM0IHRvcCA9IG1peCh0b3BMZWZ0LCB0b3BSaWdodCwgZnJhY1JDLnl5enopO1xuICAgICAgICB2ZWM0IGJvdHRvbSA9IG1peChib3R0b21MZWZ0LCBib3R0b21SaWdodCwgZnJhY1JDLnl5enopO1xuICAgICAgICB2ZWM0IG5ld1ZhbHVlID0gbWl4KHRvcCwgYm90dG9tLCBmcmFjUkMueCk7XG5cbiAgICAgICAgc2V0T3V0cHV0KG5ld1ZhbHVlKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlc2l6ZV9iaWxpbmVhcl9wYWNrZWRfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmV4cG9ydCBjbGFzcyBSZXNpemVOZWFyZXN0TmVpZ2JvckJhY2twcm9wUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoZHlTaGFwZSwgaW5wdXRTaGFwZSwgYWxpZ25Db3JuZXJzKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsnZHknXTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IFtdO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gaW5wdXRTaGFwZTtcbiAgICAgICAgY29uc3QgWywgeEhlaWdodCwgeFdpZHRoLF0gPSBpbnB1dFNoYXBlO1xuICAgICAgICBjb25zdCBbLCB5SGVpZ2h0LCB5V2lkdGhdID0gZHlTaGFwZTtcbiAgICAgICAgLy8gSW4gdGhlIGJhY2t3YXJkcyBwYXNzLCB3ZSB3YW50IHRvIGZpbmQgdGhlIHBpeGVscyB0aGF0IHdlcmUgZ2VuZXJhdGVkIGZvclxuICAgICAgICAvLyBlYWNoIHBpeGVsIGluIHRoZSBpbnB1dCBpbWFnZSB0aGUgZm9yd2FyZCBwYXNzIGFuZCBhZGQgdGhlIGNvcnJlc3BvbmRpbmdcbiAgICAgICAgLy8gY29lZmZpY2llbnQgZnJvbSBkeSB0byB0aGUgZ3JhZGllbnQgKHdpdGggc29tZSBpbnRlcnBvbGF0aW9uKS5cbiAgICAgICAgY29uc3QgZWZmZWN0aXZlWFNpemUgPSBbXG4gICAgICAgICAgICAoYWxpZ25Db3JuZXJzICYmIHlIZWlnaHQgPiAxKSA/IHhIZWlnaHQgLSAxIDogeEhlaWdodCxcbiAgICAgICAgICAgIChhbGlnbkNvcm5lcnMgJiYgeVdpZHRoID4gMSkgPyB4V2lkdGggLSAxIDogeFdpZHRoXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZVlTaXplID0gW1xuICAgICAgICAgICAgKGFsaWduQ29ybmVycyAmJiB5SGVpZ2h0ID4gMSkgPyB5SGVpZ2h0IC0gMSA6IHlIZWlnaHQsXG4gICAgICAgICAgICAoYWxpZ25Db3JuZXJzICYmIHlXaWR0aCA+IDEpID8geVdpZHRoIC0gMSA6IHlXaWR0aFxuICAgICAgICBdO1xuICAgICAgICBjb25zdCBoZWlnaHRTY2FsZSA9IGVmZmVjdGl2ZVhTaXplWzBdIC8gZWZmZWN0aXZlWVNpemVbMF07XG4gICAgICAgIGNvbnN0IHdpZHRoU2NhbGUgPSBlZmZlY3RpdmVYU2l6ZVsxXSAvIGVmZmVjdGl2ZVlTaXplWzFdO1xuICAgICAgICBjb25zdCBpbnZIZWlnaHRTY2FsZSA9IDEgLyBoZWlnaHRTY2FsZTtcbiAgICAgICAgY29uc3QgaW52V2lkdGhTY2FsZSA9IDEgLyB3aWR0aFNjYWxlO1xuICAgICAgICAvLyBUaGlzIGRlZmluZXMgdGhlIHNpemUgb2YgdGhlIHdpbmRvdyBvZiB2YWx1ZXMgYXJvdW5kIGEgcGFydGljdWxhclxuICAgICAgICAvLyBpbmRleCBpbiBkeSB0aGF0IHdlIHdhbnQgdG8gc2VhcmNoIGZvciBjb250cmlidXRpb25zIHRvIGR4LlxuICAgICAgICBjb25zdCB3aW5IZWlnaHQgPSAoTWF0aC5jZWlsKGludkhlaWdodFNjYWxlKSAqIDIpICsgMjtcbiAgICAgICAgY29uc3Qgd2luV2lkdGggPSAoTWF0aC5jZWlsKGludldpZHRoU2NhbGUpICogMikgKyAyO1xuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGIgPSBjb29yZHNbMF07XG4gICAgICAgIGludCBkID0gY29vcmRzWzNdO1xuICAgICAgICBpbnQgciA9IGNvb3Jkc1sxXTtcbiAgICAgICAgaW50IGMgPSBjb29yZHNbMl07XG5cbiAgICAgICAgZmxvYXQgYWNjdW11bGF0b3IgPSAwLjA7XG5cbiAgICAgICAgY29uc3QgZmxvYXQgaGVpZ2h0U2NhbGUgPSBmbG9hdCgke2hlaWdodFNjYWxlfSk7XG4gICAgICAgIGNvbnN0IGZsb2F0IHdpZHRoU2NhbGUgPSBmbG9hdCgke3dpZHRoU2NhbGV9KTtcblxuICAgICAgICBjb25zdCBmbG9hdCBpbnZIZWlnaHRTY2FsZSA9IGZsb2F0KCR7aW52SGVpZ2h0U2NhbGV9KTtcbiAgICAgICAgY29uc3QgZmxvYXQgaW52V2lkdGhTY2FsZSA9IGZsb2F0KCR7aW52V2lkdGhTY2FsZX0pO1xuXG4gICAgICAgIGNvbnN0IGludCB3aW5IZWlnaHQgPSBpbnQoJHt3aW5IZWlnaHR9KTtcbiAgICAgICAgY29uc3QgaW50IHdpbldpZHRoID0gaW50KCR7d2luV2lkdGh9KTtcblxuICAgICAgICAvLyBDb21wdXRlIGJvdW5kcyBmb3Igd2hlcmUgaW4gZHkgd2Ugd2lsbCBsb29rXG4gICAgICAgIGZsb2F0IHN0YXJ0UkxlcnAgPSBmbG9vcihmbG9hdChyKSAqIGludkhlaWdodFNjYWxlKTtcbiAgICAgICAgaW50IHN0YXJ0RHlSID0gaW50KGZsb29yKHN0YXJ0UkxlcnAgLSBmbG9hdCh3aW5IZWlnaHQgLyAyKSkpO1xuXG4gICAgICAgIGZsb2F0IHN0YXJ0Q0xlcnAgPSBmbG9vcihmbG9hdChjKSAqIGludldpZHRoU2NhbGUpO1xuICAgICAgICBpbnQgc3RhcnREeUMgPSBpbnQoZmxvb3Ioc3RhcnRDTGVycCAtIGZsb2F0KHdpbldpZHRoIC8gMikpKTtcblxuICAgICAgICAvLyBMb29wIG92ZXIgZHlcbiAgICAgICAgZm9yIChpbnQgZHlST2Zmc2V0ID0gMDsgZHlST2Zmc2V0IDwgd2luSGVpZ2h0OyBkeVJPZmZzZXQrKykge1xuICAgICAgICAgIGludCBkeVIgPSBkeVJPZmZzZXQgKyBzdGFydER5UjtcblxuICAgICAgICAgIC8vIEd1YXJkIGFnYWluc3QgdGhlIHdpbmRvdyBleGNlZWRpbmcgdGhlIGJvdW5kcyBvZiBkeVxuICAgICAgICAgIGlmIChkeVIgPCAwIHx8IGR5UiA+PSAke3lIZWlnaHR9KSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKGludCBkeUNPZmZzZXQgPSAwOyBkeUNPZmZzZXQgPCB3aW5XaWR0aDsgZHlDT2Zmc2V0KyspIHtcbiAgICAgICAgICAgIGludCBkeUMgPSBkeUNPZmZzZXQgKyBzdGFydER5QztcblxuICAgICAgICAgICAgLy8gR3VhcmQgYWdhaW5zdCB0aGUgd2luZG93IGV4Y2VlZGluZyB0aGUgYm91bmRzIG9mIGR5XG4gICAgICAgICAgICBpZiAoZHlDIDwgMCB8fCBkeUMgPj0gJHt5V2lkdGh9KSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmbG9hdCBzb3VyY2VGcmFjUm93ID1cbiAgICAgICAgICAgICAgZmxvYXQoJHtlZmZlY3RpdmVYU2l6ZVswXX0pICpcbiAgICAgICAgICAgICAgICAoZmxvYXQoZHlSKSAvIGZsb2F0KCR7ZWZmZWN0aXZlWVNpemVbMF19KSk7XG5cbiAgICAgICAgICAgIGZsb2F0IHNvdXJjZUZyYWNDb2wgPVxuICAgICAgICAgICAgICAgIGZsb2F0KCR7ZWZmZWN0aXZlWFNpemVbMV19KSAqXG4gICAgICAgICAgICAgICAgICAoZmxvYXQoZHlDKSAvIGZsb2F0KCR7ZWZmZWN0aXZlWVNpemVbMV19KSk7XG5cbiAgICAgICAgICAgIGludCBzb3VyY2VOZWFyZXN0Um93ID0gaW50KG1pbihcbiAgICAgICAgICAgICAgICBmbG9hdChpbnQoJHt4SGVpZ2h0fSkgLSAxKSxcbiAgICAgICAgICAgICAgICAke2FsaWduQ29ybmVyc30gPyBmbG9hdChyb3VuZChzb3VyY2VGcmFjUm93KSkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KGZsb29yKHNvdXJjZUZyYWNSb3cpKSkpO1xuXG4gICAgICAgICAgICBpbnQgc291cmNlTmVhcmVzdENvbCA9IGludChtaW4oXG4gICAgICAgICAgICAgICAgZmxvYXQoaW50KCR7eFdpZHRofSkgLSAxKSxcbiAgICAgICAgICAgICAgICAke2FsaWduQ29ybmVyc30gPyBmbG9hdChyb3VuZChzb3VyY2VGcmFjQ29sKSkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KGZsb29yKHNvdXJjZUZyYWNDb2wpKSkpO1xuXG4gICAgICAgICAgICBpZiAociA9PSBzb3VyY2VOZWFyZXN0Um93ICYmIGMgPT0gc291cmNlTmVhcmVzdENvbCkge1xuICAgICAgICAgICAgICBhY2N1bXVsYXRvciArPSBnZXREeShiLCBkeVIsIGR5QywgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEVuZCBsb29wIG92ZXIgZHlcblxuICAgICAgICBzZXRPdXRwdXQoYWNjdW11bGF0b3IpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVzaXplX25lYXJlc3RfbmVpZ2hib3JfYmFja3Byb3BfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmV4cG9ydCBjbGFzcyBSZXNpemVOZWFyZXN0TmVpZ2hib3JQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3RvcihpbnB1dFNoYXBlLCBuZXdIZWlnaHQsIG5ld1dpZHRoLCBhbGlnbkNvcm5lcnMsIGhhbGZQaXhlbENlbnRlcnMpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWydBJ107XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBbXTtcbiAgICAgICAgY29uc3QgW2JhdGNoLCBvbGRIZWlnaHQsIG9sZFdpZHRoLCBkZXB0aF0gPSBpbnB1dFNoYXBlO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gW2JhdGNoLCBuZXdIZWlnaHQsIG5ld1dpZHRoLCBkZXB0aF07XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZUluU2l6ZSA9IFtcbiAgICAgICAgICAgIChhbGlnbkNvcm5lcnMgJiYgbmV3SGVpZ2h0ID4gMSkgPyBvbGRIZWlnaHQgLSAxIDogb2xkSGVpZ2h0LFxuICAgICAgICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdXaWR0aCA+IDEpID8gb2xkV2lkdGggLSAxIDogb2xkV2lkdGhcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgZWZmZWN0aXZlT3V0U2l6ZSA9IFtcbiAgICAgICAgICAgIChhbGlnbkNvcm5lcnMgJiYgbmV3SGVpZ2h0ID4gMSkgPyBuZXdIZWlnaHQgLSAxIDogbmV3SGVpZ2h0LFxuICAgICAgICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdXaWR0aCA+IDEpID8gbmV3V2lkdGggLSAxIDogbmV3V2lkdGhcbiAgICAgICAgXTtcbiAgICAgICAgLy8gV2hlbiBhbGlnbiBjb3JuZXJzIGlzIGZhbHNlLCB3ZSByb3VuZHMgdGhlIHZhbHVlIHdpdGggZmxvb3IuXG4gICAgICAgIGNvbnN0IHJvdW5kQmFzZSA9IGFsaWduQ29ybmVycyA/ICcwLjUnIDogJzAuMCc7XG4gICAgICAgIGxldCBzb3VyY2VGcmFjSW5kZXhSQztcbiAgICAgICAgaWYgKGhhbGZQaXhlbENlbnRlcnMpIHtcbiAgICAgICAgICAgIHNvdXJjZUZyYWNJbmRleFJDID1cbiAgICAgICAgICAgICAgICBgbWF4KCh2ZWMyKHlSQykgKyB2ZWMyKDAuNSkpICogZWZmZWN0aXZlSW5wdXRPdmVyT3V0cHV0UmF0aW9SQ2AgK1xuICAgICAgICAgICAgICAgICAgICBgLCB2ZWMyKDAuMCkpYDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNvdXJjZUZyYWNJbmRleFJDID0gYHZlYzIoeVJDKSAqIGVmZmVjdGl2ZUlucHV0T3Zlck91dHB1dFJhdGlvUkNgO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCB2ZWMyIGVmZmVjdGl2ZUlucHV0T3Zlck91dHB1dFJhdGlvUkMgPSB2ZWMyKFxuICAgICAgICAgICR7ZWZmZWN0aXZlSW5TaXplWzBdIC8gZWZmZWN0aXZlT3V0U2l6ZVswXX0sXG4gICAgICAgICAgJHtlZmZlY3RpdmVJblNpemVbMV0gLyBlZmZlY3RpdmVPdXRTaXplWzFdfSk7XG4gICAgICBjb25zdCB2ZWMyIGlucHV0U2hhcGVSQyA9IHZlYzIoJHtvbGRIZWlnaHR9LjAsICR7b2xkV2lkdGh9LjApO1xuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYiA9IGNvb3Jkc1swXTtcbiAgICAgICAgaW50IGQgPSBjb29yZHNbM107XG4gICAgICAgIGl2ZWMyIHlSQyA9IGNvb3Jkcy55ejtcblxuICAgICAgICAvLyBGcmFjdGlvbmFsIHNvdXJjZSBpbmRleC5cbiAgICAgICAgdmVjMiBzb3VyY2VGcmFjSW5kZXhSQyA9ICR7c291cmNlRnJhY0luZGV4UkN9O1xuXG4gICAgICAgIC8vIENvbXB1dGUgdGhlIGNvb3JkaW5hdG9ycyBvZiBuZWFyZXN0IG5laWdoYm9yIHBvaW50LlxuICAgICAgICBpdmVjMiBzb3VyY2VOZWFyZXN0UkMgPSBpdmVjMihcbiAgICAgICAgICBtaW4oaW5wdXRTaGFwZVJDIC0gMS4wLCBmbG9vcihzb3VyY2VGcmFjSW5kZXhSQyArICR7cm91bmRCYXNlfSkpKTtcbiAgICAgICAgZmxvYXQgbmV3VmFsdWUgPSBnZXRBKGIsIHNvdXJjZU5lYXJlc3RSQy54LCBzb3VyY2VOZWFyZXN0UkMueSwgZCk7XG5cbiAgICAgICAgc2V0T3V0cHV0KG5ld1ZhbHVlKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlc2l6ZV9uZWFyZXN0X25laWdoYm9yX2dwdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5leHBvcnQgY2xhc3MgUmVzaXplTmVhcmVzdE5laWdoYm9yUGFja2VkUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoaW5wdXRTaGFwZSwgbmV3SGVpZ2h0LCBuZXdXaWR0aCwgYWxpZ25Db3JuZXJzLCBoYWxmUGl4ZWxDZW50ZXJzKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICAgICAgICB0aGlzLnBhY2tlZElucHV0cyA9IHRydWU7XG4gICAgICAgIHRoaXMucGFja2VkT3V0cHV0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IFtdO1xuICAgICAgICBjb25zdCBbYmF0Y2gsIG9sZEhlaWdodCwgb2xkV2lkdGgsIGRlcHRoXSA9IGlucHV0U2hhcGU7XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBbYmF0Y2gsIG5ld0hlaWdodCwgbmV3V2lkdGgsIGRlcHRoXTtcbiAgICAgICAgY29uc3QgZWZmZWN0aXZlSW5TaXplID0gW1xuICAgICAgICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdIZWlnaHQgPiAxKSA/IG9sZEhlaWdodCAtIDEgOiBvbGRIZWlnaHQsXG4gICAgICAgICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld1dpZHRoID4gMSkgPyBvbGRXaWR0aCAtIDEgOiBvbGRXaWR0aFxuICAgICAgICBdO1xuICAgICAgICBjb25zdCBlZmZlY3RpdmVPdXRTaXplID0gW1xuICAgICAgICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdIZWlnaHQgPiAxKSA/IG5ld0hlaWdodCAtIDEgOiBuZXdIZWlnaHQsXG4gICAgICAgICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld1dpZHRoID4gMSkgPyBuZXdXaWR0aCAtIDEgOiBuZXdXaWR0aFxuICAgICAgICBdO1xuICAgICAgICAvLyBXaGVuIGFsaWduIGNvcm5lcnMgaXMgZmFsc2UsIHdlIHJvdW5kcyB0aGUgdmFsdWUgd2l0aCBmbG9vci5cbiAgICAgICAgY29uc3Qgcm91bmRCYXNlID0gYWxpZ25Db3JuZXJzID8gJzAuNScgOiAnMC4wJztcbiAgICAgICAgbGV0IHNvdXJjZUZyYWNJbmRleFJDO1xuICAgICAgICBpZiAoaGFsZlBpeGVsQ2VudGVycykge1xuICAgICAgICAgICAgc291cmNlRnJhY0luZGV4UkMgPSBgbWF4KCh2ZWMzKHlSQykgKyB2ZWMzKDAuNSkpICogYCArXG4gICAgICAgICAgICAgICAgYGVmZmVjdGl2ZUlucHV0T3Zlck91dHB1dFJhdGlvUkMsIHZlYzMoMC4wKSlgO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc291cmNlRnJhY0luZGV4UkMgPSBgdmVjMyh5UkMpICogZWZmZWN0aXZlSW5wdXRPdmVyT3V0cHV0UmF0aW9SQ2A7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IHZlYzMgZWZmZWN0aXZlSW5wdXRPdmVyT3V0cHV0UmF0aW9SQyA9IHZlYzMoXG4gICAgICAgICAgJHtlZmZlY3RpdmVJblNpemVbMF0gLyBlZmZlY3RpdmVPdXRTaXplWzBdfSxcbiAgICAgICAgICAke2VmZmVjdGl2ZUluU2l6ZVsxXSAvIGVmZmVjdGl2ZU91dFNpemVbMV19LFxuICAgICAgICAgICR7ZWZmZWN0aXZlSW5TaXplWzFdIC8gZWZmZWN0aXZlT3V0U2l6ZVsxXX0pO1xuICAgICAgY29uc3QgdmVjMyBpbnB1dFNoYXBlUkMgPSB2ZWMzKCR7b2xkSGVpZ2h0fS4wLCAke29sZFdpZHRofS4wLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7b2xkV2lkdGh9LjApO1xuXG4gICAgICBmbG9hdCBnZXRBVmFsdWUoaW50IGIsIGludCByLCBpbnQgYywgaW50IGQpIHtcbiAgICAgICAgcmV0dXJuIGdldENoYW5uZWwoZ2V0QShiLCByLCBjLCBkKSwgdmVjMihjLCBkKSk7XG4gICAgICB9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgZCA9IGNvb3Jkc1szXTtcbiAgICAgICAgLy8gQ2FsY3VsYXRlIHZhbHVlcyBmb3IgbmV4dCBjb2x1bW4gaW4geVJDLnouXG4gICAgICAgIGl2ZWMzIHlSQyA9IGNvb3Jkcy55enogKyBpdmVjMygwLCAwLCAxKTtcblxuICAgICAgICAvLyBGcmFjdGlvbmFsIHNvdXJjZSBpbmRleC5cbiAgICAgICAgdmVjMyBzb3VyY2VGcmFjSW5kZXhSQyA9ICR7c291cmNlRnJhY0luZGV4UkN9O1xuXG4gICAgICAgIC8vIENvbXB1dGUgdGhlIGNvb3JkaW5hdG9ycyBvZiBuZWFyZXN0IG5laWdoYm9yIHBvaW50LlxuICAgICAgICBpdmVjMyBzb3VyY2VOZWFyZXN0UkMgPSBpdmVjMyhcbiAgICAgICAgICBtaW4oaW5wdXRTaGFwZVJDIC0gMS4wLCBmbG9vcihzb3VyY2VGcmFjSW5kZXhSQyArICR7cm91bmRCYXNlfSkpKTtcblxuICAgICAgICAvLyBTaG91bGQgd2UgY2FsY3VsYXRlIG5leHQgY29sdW1uIGFuZCByb3cgZWxlbWVudHMgaW4gMngyIHBhY2tlZCBjZWxsLlxuICAgICAgICBib29sIGhhc05leHRDb2wgPSBkIDwgJHtkZXB0aCAtIDF9O1xuICAgICAgICBib29sIGhhc05leHRSb3cgPSBjb29yZHMueiA8ICR7bmV3V2lkdGggLSAxfTtcblxuICAgICAgICB2ZWM0IG5ld1ZhbHVlID0gdmVjNChcbiAgICAgICAgICBnZXRBVmFsdWUoYiwgc291cmNlTmVhcmVzdFJDLngsIHNvdXJjZU5lYXJlc3RSQy55LCBkKSxcbiAgICAgICAgICBoYXNOZXh0Q29sID8gZ2V0QVZhbHVlKGIsIHNvdXJjZU5lYXJlc3RSQy54LCBzb3VyY2VOZWFyZXN0UkMueSwgZCArIDEpXG4gICAgICAgICAgICAgICAgICAgICA6IDAuMCxcbiAgICAgICAgICBoYXNOZXh0Um93ID8gZ2V0QVZhbHVlKGIsIHNvdXJjZU5lYXJlc3RSQy54LCBzb3VyY2VOZWFyZXN0UkMueiwgZClcbiAgICAgICAgICAgICAgICAgICAgIDogMC4wLFxuICAgICAgICAgIChoYXNOZXh0Um93ICYmIGhhc05leHRDb2wpID9cbiAgICAgICAgICAgIGdldEFWYWx1ZShiLCBzb3VyY2VOZWFyZXN0UkMueCwgc291cmNlTmVhcmVzdFJDLnosIGQgKyAxKSA6IDAuMCk7XG5cbiAgICAgICAgc2V0T3V0cHV0KG5ld1ZhbHVlKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlc2l6ZV9uZWFyZXN0X25laWdoYm9yX3BhY2tlZF9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZ2V0Q29vcmRzRGF0YVR5cGUgfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5leHBvcnQgY2xhc3MgUmV2ZXJzZVByb2dyYW0ge1xuICAgIGNvbnN0cnVjdG9yKHhTaGFwZSwgYXhpcykge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgICAgICAgY29uc3QgcmFuayA9IHhTaGFwZS5sZW5ndGg7XG4gICAgICAgIGlmIChyYW5rID4gNCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBXZWJHTCBiYWNrZW5kOiBSZXZlcnNlIG9mIHJhbmstJHtyYW5rfSB0ZW5zb3IgaXMgbm90IHlldCBzdXBwb3J0ZWRgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0geFNoYXBlO1xuICAgICAgICBpZiAocmFuayA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgIGludCBjb29yZCA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgIHNldE91dHB1dChnZXRYKCR7eFNoYXBlWzBdfSAtIGNvb3JkIC0gMSkpO1xuICAgICAgICB9XG4gICAgICBgO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGdldEluQ29vcmQgPSAoaSkgPT4ge1xuICAgICAgICAgICAgaWYgKGF4aXMuaW5kZXhPZihpKSAhPT0gLTEgJiYgeFNoYXBlW2ldICE9PSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke3hTaGFwZVtpXX0gLSBjb29yZHNbJHtpfV0gLSAxYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBgY29vcmRzWyR7aX1dYDtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgaW5Db29yZHMgPSB4U2hhcGUubWFwKChfLCBpKSA9PiBnZXRJbkNvb3JkKGkpKS5qb2luKCcsJyk7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShyYW5rKTtcbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgJHt0eXBlfSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgc2V0T3V0cHV0KGdldFgoJHtpbkNvb3Jkc30pKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJldmVyc2VfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGdldENoYW5uZWxzIH0gZnJvbSAnLi9wYWNraW5nX3V0aWwnO1xuaW1wb3J0IHsgZ2V0Q29vcmRzRGF0YVR5cGUgfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5leHBvcnQgY2xhc3MgUmV2ZXJzZVBhY2tlZFByb2dyYW0ge1xuICAgIGNvbnN0cnVjdG9yKHhTaGFwZSwgYXhpcykge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgICAgICAgdGhpcy5wYWNrZWRJbnB1dHMgPSB0cnVlO1xuICAgICAgICB0aGlzLnBhY2tlZE91dHB1dCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHJhbmsgPSB4U2hhcGUubGVuZ3RoO1xuICAgICAgICBpZiAocmFuayA+IDQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgV2ViR0wgYmFja2VuZDogUmV2ZXJzZSBvZiByYW5rLSR7cmFua30gdGVuc29yIGlzIG5vdCB5ZXQgc3VwcG9ydGVkYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IHhTaGFwZTtcbiAgICAgICAgY29uc3QgY2hhbm5lbHMgPSBnZXRDaGFubmVscygncmMnLCByYW5rKTtcbiAgICAgICAgY29uc3QgbmV4dENvbHVtbiA9IGAke2NoYW5uZWxzW3JhbmsgLSAxXX0gKyAxIDwgJHt0aGlzLm91dHB1dFNoYXBlW3JhbmsgLSAxXX1gO1xuICAgICAgICBjb25zdCBuZXh0Um93ID0gYCR7Y2hhbm5lbHNbcmFuayAtIDJdfSArIDEgPCAke3RoaXMub3V0cHV0U2hhcGVbcmFuayAtIDJdfWA7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShyYW5rKTtcbiAgICAgICAgaWYgKHJhbmsgPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAgIHZvaWQgbWFpbigpe1xuICAgICAgICAgIGludCByYyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgIHZlYzQgcmVzdWx0ID0gdmVjNCgwLik7XG4gICAgICAgICAgcmVzdWx0LnIgPSBnZXRDaGFubmVsKGdldFgoJHt4U2hhcGVbMF19IC0gcmMgLSAxKSxcbiAgICAgICAgICAgICR7eFNoYXBlWzBdfSAtIHJjIC0gMSk7XG4gICAgICAgICAgaWYoJHtuZXh0Q29sdW1ufSl7XG4gICAgICAgICAgICAgIHJlc3VsdC5nID0gZ2V0Q2hhbm5lbChnZXRYKCR7eFNoYXBlWzBdfSAtIChyYyAgKyAxKSAtIDEpLFxuICAgICAgICAgICAgICAgICR7eFNoYXBlWzBdfSAtIChyYyAgKyAxKSAtIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZXRPdXRwdXQocmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgICAke3R5cGV9IHJjID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgICAgdmVjNCByZXN1bHQgPSB2ZWM0KDAuKTtcbiAgICAgICAgICByZXN1bHQuciA9ICR7Z2V0UihjaGFubmVscy5zbGljZSgpKX07XG4gICAgICAgICAgaWYoJHtuZXh0Q29sdW1ufSl7XG4gICAgICAgICAgICByZXN1bHQuZyA9ICR7Z2V0RyhjaGFubmVscy5zbGljZSgpKX07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKCR7bmV4dFJvd30pIHtcbiAgICAgICAgICAgIHJlc3VsdC5iID0gJHtnZXRCKGNoYW5uZWxzLnNsaWNlKCkpfTtcbiAgICAgICAgICAgIGlmKCR7bmV4dENvbHVtbn0pIHtcbiAgICAgICAgICAgICAgcmVzdWx0LmEgPSAke2dldEEoY2hhbm5lbHMuc2xpY2UoKSl9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBzZXRPdXRwdXQocmVzdWx0KTtcbiAgICAgICAgfVxuICAgIGA7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gZ2V0UihjaGFubmVscykge1xuICAgICAgICAgICAgcmV0dXJuIGdldENoYW5uZWwoY2hhbm5lbHMpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGdldEcoY2hhbm5lbHMpIHtcbiAgICAgICAgICAgIGNoYW5uZWxzW3JhbmsgLSAxXSA9ICcoJyArIGNoYW5uZWxzW3JhbmsgLSAxXSArIGAgKyAxKWA7XG4gICAgICAgICAgICByZXR1cm4gZ2V0Q2hhbm5lbChjaGFubmVscyk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gZ2V0QihjaGFubmVscykge1xuICAgICAgICAgICAgY2hhbm5lbHNbcmFuayAtIDJdID0gJygnICsgY2hhbm5lbHNbcmFuayAtIDJdICsgYCArIDEpYDtcbiAgICAgICAgICAgIHJldHVybiBnZXRDaGFubmVsKGNoYW5uZWxzKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBnZXRBKGNoYW5uZWxzKSB7XG4gICAgICAgICAgICBjaGFubmVsc1tyYW5rIC0gMV0gPSAnKCcgKyBjaGFubmVsc1tyYW5rIC0gMV0gKyBgICsgMSlgO1xuICAgICAgICAgICAgY2hhbm5lbHNbcmFuayAtIDJdID0gJygnICsgY2hhbm5lbHNbcmFuayAtIDJdICsgYCArIDEpYDtcbiAgICAgICAgICAgIHJldHVybiBnZXRDaGFubmVsKGNoYW5uZWxzKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBnZXRDaGFubmVsKGNoYW5uZWxzKSB7XG4gICAgICAgICAgICBjb25zdCBpbkNvb3Jkc0FycmF5ID0geFNoYXBlLm1hcCgoXywgaSkgPT4gZ2V0SW5Db29yZChpLCBjaGFubmVscykpO1xuICAgICAgICAgICAgY29uc3QgaW5Db29yZHMgPSBpbkNvb3Jkc0FycmF5LmpvaW4oJywnKTtcbiAgICAgICAgICAgIGNvbnN0IGlubmVyRGltcyA9IGluQ29vcmRzQXJyYXkuc2xpY2UoLTIpLmpvaW4oJywnKTtcbiAgICAgICAgICAgIHJldHVybiBgZ2V0Q2hhbm5lbChnZXRYKCR7aW5Db29yZHN9KSwgdmVjMigke2lubmVyRGltc30pKWA7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gZ2V0SW5Db29yZChpLCBjaGFubmVsczEpIHtcbiAgICAgICAgICAgIGlmIChheGlzLmluZGV4T2YoaSkgIT09IC0xICYmIHhTaGFwZVtpXSAhPT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBgJHt4U2hhcGVbaV19IC0gJHtjaGFubmVsczFbaV19IC0gMWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7Y2hhbm5lbHMxW2ldfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZXZlcnNlX3BhY2tlZF9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuZXhwb3J0IGNsYXNzIFJvdGF0ZVByb2dyYW0ge1xuICAgIGNvbnN0cnVjdG9yKGltYWdlU2hhcGUsIGZpbGxWYWx1ZSkge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ0ltYWdlJ107XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBbXTtcbiAgICAgICAgdGhpcy5jdXN0b21Vbmlmb3JtcyA9IFt7IG5hbWU6ICdwYXJhbXMnLCB0eXBlOiAndmVjNCcgfV07XG4gICAgICAgIGNvbnN0IGltYWdlSGVpZ2h0ID0gaW1hZ2VTaGFwZVsxXTtcbiAgICAgICAgY29uc3QgaW1hZ2VXaWR0aCA9IGltYWdlU2hhcGVbMl07XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBpbWFnZVNoYXBlO1xuICAgICAgICBsZXQgZmlsbFNuaXBwZXQgPSAnJztcbiAgICAgICAgaWYgKHR5cGVvZiBmaWxsVmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBmaWxsU25pcHBldCA9IGBmbG9hdCBvdXRwdXRWYWx1ZSA9ICR7ZmlsbFZhbHVlLnRvRml4ZWQoMil9O2A7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmaWxsU25pcHBldCA9IGBcbiAgICAgICAgdmVjMyBmaWxsID0gdmVjMygke2ZpbGxWYWx1ZS5qb2luKCcsJyl9KTtcbiAgICAgICAgZmxvYXQgb3V0cHV0VmFsdWUgPSBmaWxsW2Nvb3Jkc1szXV07YDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgICAgaW50IHggPSBjb29yZHNbMl07XG4gICAgICAgICAgaW50IHkgPSBjb29yZHNbMV07XG4gICAgICAgICAgZmxvYXQgY29vcmRYRmxvYXQgPSAoZmxvYXQoeCkgLSBwYXJhbXNbMF0pICogcGFyYW1zWzNdIC1cbiAgICAgICAgICAgIChmbG9hdCh5KSAtIHBhcmFtc1sxXSkgKiBwYXJhbXNbMl07XG4gICAgICAgICAgZmxvYXQgY29vcmRZRmxvYXQgPSAoZmxvYXQoeCkgLSBwYXJhbXNbMF0pICogcGFyYW1zWzJdICtcbiAgICAgICAgICAgIChmbG9hdCh5KSAtIHBhcmFtc1sxXSkgKiBwYXJhbXNbM107XG4gICAgICAgICAgaW50IGNvb3JkWCA9IGludChyb3VuZChjb29yZFhGbG9hdCArIHBhcmFtc1swXSkpO1xuICAgICAgICAgIGludCBjb29yZFkgPSBpbnQocm91bmQoY29vcmRZRmxvYXQgKyBwYXJhbXNbMV0pKTtcbiAgICAgICAgICAke2ZpbGxTbmlwcGV0fVxuICAgICAgICAgIGlmKGNvb3JkWCA+PSAwICYmIGNvb3JkWCA8ICR7aW1hZ2VXaWR0aH0gJiYgY29vcmRZID49IDAgJiYgY29vcmRZIDwgJHtpbWFnZUhlaWdodH0pIHtcbiAgICAgICAgICAgIG91dHB1dFZhbHVlID0gZ2V0SW1hZ2UoY29vcmRzWzBdLCBjb29yZFksIGNvb3JkWCwgY29vcmRzWzNdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2V0T3V0cHV0KG91dHB1dFZhbHVlKTtcbiAgICAgICAgfVxuICAgIGA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cm90YXRlX2dwdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBnZXRDb29yZHNEYXRhVHlwZSB9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcbmV4cG9ydCBjbGFzcyBTY2F0dGVyUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IodXBkYXRlU2l6ZSwgc2xpY2VEaW0sIGluZGljZXNSYW5rLCB1cGRhdGVzUmFuaywgc3RyaWRlcywgc2hhcGUsIHN1bW1pbmdEdXBlSW5kZXggPSB0cnVlKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsndXBkYXRlcycsICdpbmRpY2VzJywgJ2RlZmF1bHRWYWx1ZSddO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gc2hhcGU7XG4gICAgICAgIGNvbnN0IHN0cmlkZXNUeXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUoc3RyaWRlcy5sZW5ndGgpO1xuICAgICAgICBjb25zdCBkdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHNoYXBlLmxlbmd0aCk7XG4gICAgICAgIGxldCBpbmRpY2VzU3RyaW5nID0gJyc7XG4gICAgICAgIGlmIChpbmRpY2VzUmFuayA9PT0gMSkge1xuICAgICAgICAgICAgaW5kaWNlc1N0cmluZyA9ICdpJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpbmRpY2VzUmFuayA9PT0gMikge1xuICAgICAgICAgICAgaW5kaWNlc1N0cmluZyA9ICdpLCBqJztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmRpY2VzU25pcHBldCA9IGBnZXRJbmRpY2VzKCR7aW5kaWNlc1N0cmluZ30pYDtcbiAgICAgICAgbGV0IHVwZGF0ZXNTdHJpbmcgPSAnJztcbiAgICAgICAgaWYgKHVwZGF0ZXNSYW5rID09PSAxKSB7XG4gICAgICAgICAgICB1cGRhdGVzU3RyaW5nID0gJ2knO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHVwZGF0ZXNSYW5rID09PSAyKSB7XG4gICAgICAgICAgICB1cGRhdGVzU3RyaW5nID0gJ2ksIGNvb3Jkc1sxXSc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXBkYXRlc1NuaXBwZXQgPSBgZ2V0VXBkYXRlcygke3VwZGF0ZXNTdHJpbmd9KWA7XG4gICAgICAgIGNvbnN0IHN0cmlkZVN0cmluZyA9IHNsaWNlRGltID4gMSA/ICdzdHJpZGVzW2pdJyA6ICdzdHJpZGVzJztcbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICAgJHtzdHJpZGVzVHlwZX0gc3RyaWRlcyA9ICR7c3RyaWRlc1R5cGV9KCR7c3RyaWRlc30pO1xuXG4gICAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgICAke2R0eXBlfSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgICBmbG9hdCBzdW0gPSAwLjA7XG4gICAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlO1xuICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgJHt1cGRhdGVTaXplfTsgaSsrKSB7XG4gICAgICAgICAgICBpbnQgZmxhdHRlbmVkSW5kZXggPSAwO1xuICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAke3NsaWNlRGltfTsgaisrKSB7XG4gICAgICAgICAgICAgIGludCBpbmRleCA9IHJvdW5kKCR7aW5kaWNlc1NuaXBwZXR9KTtcbiAgICAgICAgICAgICAgZmxhdHRlbmVkSW5kZXggKz0gaW5kZXggKiAke3N0cmlkZVN0cmluZ307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmxhdHRlbmVkSW5kZXggPT0gY29vcmRzWzBdKSB7XG4gICAgICAgICAgICAgIHN1bSArPSAke3VwZGF0ZXNTbmlwcGV0fTtcbiAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBzZXRPdXRwdXQobWl4KGdldERlZmF1bHRWYWx1ZSgpLCBzdW0sIGZsb2F0KGZvdW5kKSkpO1xuICAgICAgICB9XG4gICAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNjYXR0ZXJfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmV4cG9ydCBjbGFzcyBTZWdtZW50T3BQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3RvcihzZWdPcEluZm8sIHNlZ09wVHlwZSkge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ3gnLCAnc2VnbWVudElkcyddO1xuICAgICAgICBjb25zdCB3aW5kb3dTaXplID0gc2VnT3BJbmZvLndpbmRvd1NpemU7XG4gICAgICAgIGNvbnN0IGJhdGNoU2l6ZSA9IHNlZ09wSW5mby5iYXRjaFNpemU7XG4gICAgICAgIGNvbnN0IGluU2l6ZSA9IHNlZ09wSW5mby5pblNpemU7XG4gICAgICAgIGNvbnN0IG51bVNlZ21lbnRzID0gc2VnT3BJbmZvLm51bVNlZ21lbnRzO1xuICAgICAgICBjb25zdCBvdXRTaXplID0gbnVtU2VnbWVudHMgKiBNYXRoLmNlaWwoaW5TaXplIC8gd2luZG93U2l6ZSk7XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBbYmF0Y2hTaXplLCBvdXRTaXplXTtcbiAgICAgICAgY29uc3QgaW5pdGlhbGl6YXRpb25WYWx1ZSA9ICcwLjAnO1xuICAgICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IGBzdW1WYWx1ZWA7XG4gICAgICAgIGNvbnN0IHdpbmRvd1NpemVOZWFyZXN0VmVjNCA9IE1hdGguZmxvb3Iod2luZG93U2l6ZSAvIDQpICogNDtcbiAgICAgICAgY29uc3Qgd2luZG93U2l6ZVZlYzRSZW1haW5kZXIgPSB3aW5kb3dTaXplICUgNDtcbiAgICAgICAgY29uc3QgdXBkYXRlU25pcHBldCA9IGBcbiAgICAgICAgc3VtVmFsdWUgKz0gZG90KHZhbHVlcywgc2VnRmlsdGVyKTtcbiAgICBgO1xuICAgICAgICBsZXQgY2hlY2tWYWx1ZU91dE9mQm91bmRzID0gJyc7XG4gICAgICAgIGlmIChpblNpemUgJSB3aW5kb3dTaXplID4gMCkge1xuICAgICAgICAgICAgY2hlY2tWYWx1ZU91dE9mQm91bmRzID0gYFxuICAgICAgICBpZiAoaW5JZHggPCAwIHx8IGluSWR4ID49ICR7aW5TaXplfSkge1xuICAgICAgICAgIHJldHVybiBpbml0aWFsaXphdGlvblZhbHVlO1xuICAgICAgICB9XG4gICAgICBgO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjaGVja1NlZ21lbnRJZE91dE9mQm91bmRzID0gJyc7XG4gICAgICAgIGlmIChpblNpemUgJSB3aW5kb3dTaXplID4gMCkge1xuICAgICAgICAgICAgY2hlY2tTZWdtZW50SWRPdXRPZkJvdW5kcyA9IGBcbiAgICAgICAgaWYgKGluSWR4IDwgMCB8fCBpbklkeCA+PSAke2luU2l6ZX0pIHtcbiAgICAgICAgICByZXR1cm4gLTEuMDtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgY29uc3QgZmxvYXQgaW5pdGlhbGl6YXRpb25WYWx1ZSA9ICR7aW5pdGlhbGl6YXRpb25WYWx1ZX07XG5cbiAgICAgIGZsb2F0IGdldFZhbHVlKGludCBiYXRjaCwgaW50IGluSWR4KSB7XG4gICAgICAgICR7Y2hlY2tWYWx1ZU91dE9mQm91bmRzfVxuICAgICAgICByZXR1cm4gZ2V0WChiYXRjaCwgaW5JZHgpO1xuICAgICAgfVxuXG4gICAgICBmbG9hdCBnZXRTZWdtZW50SWRBdEluZGV4KGludCBpbklkeCkge1xuICAgICAgICAke2NoZWNrU2VnbWVudElkT3V0T2ZCb3VuZHN9XG4gICAgICAgIHJldHVybiBnZXRTZWdtZW50SWRzKGluSWR4KTtcbiAgICAgIH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMiBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgb3V0SWR4ID0gY29vcmRzWzFdO1xuICAgICAgICBpbnQgaW5PZmZzZXQgPSBpbnQoZmxvb3IoZmxvYXQob3V0SWR4KSAvIGZsb2F0KFxuICAgICAgICAgICR7bnVtU2VnbWVudHN9KSkgKiBmbG9hdCgke3dpbmRvd1NpemV9KSk7XG4gICAgICAgIGludCBjdXJyZW50U2VnID0gaW50KG1vZChmbG9hdChvdXRJZHgpLCBmbG9hdCgke251bVNlZ21lbnRzfSkpKTtcblxuICAgICAgICBmbG9hdCBzdW1WYWx1ZSA9IDAuMDtcblxuICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8ICR7d2luZG93U2l6ZU5lYXJlc3RWZWM0fTsgaSArPSA0KSB7XG4gICAgICAgICAgaW50IGluSWR4ID0gaW5PZmZzZXQgKyBpO1xuICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAxKSxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDIpLFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4ICsgMylcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgdmVjNCBzZWdGaWx0ZXIgPSB2ZWM0KFxuICAgICAgICAgICAgaW50KGdldFNlZ21lbnRJZEF0SW5kZXgoaW5JZHgpKSA9PSBjdXJyZW50U2VnID8gMSA6IDAsXG4gICAgICAgICAgICBpbnQoZ2V0U2VnbWVudElkQXRJbmRleChpbklkeCArIDEpKSA9PSBjdXJyZW50U2VnID8gMSA6IDAsXG4gICAgICAgICAgICBpbnQoZ2V0U2VnbWVudElkQXRJbmRleChpbklkeCArIDIpKSA9PSBjdXJyZW50U2VnID8gMSA6IDAsXG4gICAgICAgICAgICBpbnQoZ2V0U2VnbWVudElkQXRJbmRleChpbklkeCArIDMpKSA9PSBjdXJyZW50U2VnID8gMSA6IDBcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgJHt1cGRhdGVTbmlwcGV0fVxuICAgICAgICB9XG5cbiAgICAgICAgaW50IGluSWR4ID0gaW5PZmZzZXQgKyAke3dpbmRvd1NpemVOZWFyZXN0VmVjNH07XG4gICAgICAgIGlmICgke3dpbmRvd1NpemVWZWM0UmVtYWluZGVyID09PSAxfSkge1xuICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCksXG4gICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlLFxuICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZSxcbiAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWVcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaW50IGluSWR4U2VnID0gaW50KGdldFNlZ21lbnRJZEF0SW5kZXgoaW5JZHgpKTtcblxuICAgICAgICAgIHZlYzQgc2VnRmlsdGVyID0gdmVjNChcbiAgICAgICAgICAgIGludChnZXRTZWdtZW50SWRBdEluZGV4KGluSWR4KSkgPT0gY3VycmVudFNlZyA/IDEgOiAwLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAwXG4gICAgICAgICAgKTtcblxuICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgfSBlbHNlIGlmICgke3dpbmRvd1NpemVWZWM0UmVtYWluZGVyID09PSAyfSkge1xuICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAxKSxcbiAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUsXG4gICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHZlYzQgc2VnRmlsdGVyID0gdmVjNChcbiAgICAgICAgICAgIGludChnZXRTZWdtZW50SWRBdEluZGV4KGluSWR4KSkgPT0gY3VycmVudFNlZyA/IDEgOiAwLFxuICAgICAgICAgICAgaW50KGdldFNlZ21lbnRJZEF0SW5kZXgoaW5JZHggKyAxKSkgPT0gY3VycmVudFNlZyA/IDEgOiAwLFxuICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAwXG4gICAgICAgICAgKTtcblxuICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgfSBlbHNlIGlmICgke3dpbmRvd1NpemVWZWM0UmVtYWluZGVyID09PSAzfSkge1xuICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAxKSxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDIpLFxuICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICB2ZWM0IHNlZ0ZpbHRlciA9IHZlYzQoXG4gICAgICAgICAgICBpbnQoZ2V0U2VnbWVudElkQXRJbmRleChpbklkeCkpID09IGN1cnJlbnRTZWcgPyAxIDogMCxcbiAgICAgICAgICAgIGludChnZXRTZWdtZW50SWRBdEluZGV4KGluSWR4ICsgMSkpID09IGN1cnJlbnRTZWcgPyAxIDogMCxcbiAgICAgICAgICAgIGludChnZXRTZWdtZW50SWRBdEluZGV4KGluSWR4ICsgMikpID09IGN1cnJlbnRTZWcgPyAxIDogMCxcbiAgICAgICAgICAgIDBcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgJHt1cGRhdGVTbmlwcGV0fVxuICAgICAgICB9XG4gICAgICAgIHNldE91dHB1dCgke3JldHVyblZhbHVlfSk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zZWdtZW50X2dwdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBnZXRDb29yZHNEYXRhVHlwZSB9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcbmV4cG9ydCBjbGFzcyBTZWxlY3RQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3RvcihjUmFuaywgc2hhcGUsIHJhbmspIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWydjJywgJ2EnLCAnYiddO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gc2hhcGU7XG4gICAgICAgIGxldCBjQ29vcmRzO1xuICAgICAgICBsZXQgYWJDb29yZHM7XG4gICAgICAgIGlmIChyYW5rID4gNCkge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoYFdoZXJlIGZvciByYW5rICR7cmFua30gaXMgbm90IHlldCBzdXBwb3J0ZWRgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmFuayA9PT0gMSkge1xuICAgICAgICAgICAgYWJDb29yZHMgPSBgcmVzUkNgO1xuICAgICAgICAgICAgY0Nvb3JkcyA9IGByZXNSQ2A7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50Q29vcmRzID0gWydyZXNSQy54JywgJ3Jlc1JDLnknLCAncmVzUkMueicsICdyZXNSQy53J107XG4gICAgICAgICAgICBjb25zdCBjQ29vcmRWYXJzID0gW107XG4gICAgICAgICAgICBjb25zdCBhYkNvb3JkVmFycyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaGFwZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGFiQ29vcmRWYXJzLnB1c2goYCR7Y3VycmVudENvb3Jkc1tpXX1gKTtcbiAgICAgICAgICAgICAgICBpZiAoaSA8IGNSYW5rKSB7XG4gICAgICAgICAgICAgICAgICAgIGNDb29yZFZhcnMucHVzaChgJHtjdXJyZW50Q29vcmRzW2ldfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNDb29yZHMgPSBjQ29vcmRWYXJzLmpvaW4oKTtcbiAgICAgICAgICAgIGFiQ29vcmRzID0gYWJDb29yZFZhcnMuam9pbigpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGR0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUocmFuayk7XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICR7ZHR5cGV9IHJlc1JDID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGZsb2F0IGNWYWwgPSBnZXRDKCR7Y0Nvb3Jkc30pO1xuICAgICAgICBpZiAoY1ZhbCA+PSAxLjApIHtcbiAgICAgICAgICBzZXRPdXRwdXQoZ2V0QSgke2FiQ29vcmRzfSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldE91dHB1dChnZXRCKCR7YWJDb29yZHN9KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlbGVjdF9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLy8gUGxlYXNlIG1ha2Ugc3VyZSB0aGUgc2hha2VyIGtleSBpbiBtYWtlU2hhZGVyS2V5IGluIGdwZ3B1X21hdGgudHMgaXMgd2VsbFxuLy8gbWFwcGVkIGlmIGFueSBzaGFkZXIgc291cmNlIGNvZGUgaXMgY2hhbmdlZCBpbiB0aGlzIGZpbGUuXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuY29uc3QgeyBnZXRCcm9hZGNhc3REaW1zIH0gPSBiYWNrZW5kX3V0aWw7XG5pbXBvcnQgeyBnZXRHbHNsRGlmZmVyZW5jZXMgfSBmcm9tICcuL2dsc2xfdmVyc2lvbic7XG5pbXBvcnQgKiBhcyBzaGFkZXJfdXRpbCBmcm9tICcuL3NoYWRlcl9jb21waWxlcl91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBtYWtlU2hhZGVyKGlucHV0c0luZm8sIG91dHB1dFNoYXBlLCBwcm9ncmFtKSB7XG4gICAgY29uc3QgcHJlZml4U25pcHBldHMgPSBbXTtcbiAgICBpbnB1dHNJbmZvLmZvckVhY2goeCA9PiB7XG4gICAgICAgIGNvbnN0IHNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoeC5zaGFwZUluZm8ubG9naWNhbFNoYXBlKTtcbiAgICAgICAgLy8gU25pcHBldCB3aGVuIHdlIGRlY2lkZWQgdG8gdXBsb2FkIHRoZSB2YWx1ZXMgYXMgdW5pZm9ybS5cbiAgICAgICAgaWYgKHguc2hhcGVJbmZvLmlzVW5pZm9ybSkge1xuICAgICAgICAgICAgcHJlZml4U25pcHBldHMucHVzaChgdW5pZm9ybSBmbG9hdCAke3gubmFtZX0ke3NpemUgPiAxID8gYFske3NpemV9XWAgOiAnJ307YCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwcmVmaXhTbmlwcGV0cy5wdXNoKGB1bmlmb3JtIHNhbXBsZXIyRCAke3gubmFtZX07YCk7XG4gICAgICAgICAgICBwcmVmaXhTbmlwcGV0cy5wdXNoKGB1bmlmb3JtIGludCBvZmZzZXQke3gubmFtZX07YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW0uZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgICAgICAgY29uc3QgeyB1bmlmb3JtU2hhcGUgfSA9IGdldFVuaWZvcm1JbmZvRnJvbVNoYXBlKHByb2dyYW0ucGFja2VkSW5wdXRzLCB4LnNoYXBlSW5mby5sb2dpY2FsU2hhcGUsIHguc2hhcGVJbmZvLnRleFNoYXBlKTtcbiAgICAgICAgICAgIHN3aXRjaCAodW5pZm9ybVNoYXBlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgcHJlZml4U25pcHBldHMucHVzaChgdW5pZm9ybSBpbnQgJHt4Lm5hbWV9U2hhcGU7YCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgcHJlZml4U25pcHBldHMucHVzaChgdW5pZm9ybSBpdmVjMiAke3gubmFtZX1TaGFwZTtgKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBwcmVmaXhTbmlwcGV0cy5wdXNoKGB1bmlmb3JtIGl2ZWMzICR7eC5uYW1lfVNoYXBlO2ApO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIHByZWZpeFNuaXBwZXRzLnB1c2goYHVuaWZvcm0gaXZlYzQgJHt4Lm5hbWV9U2hhcGU7YCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJlZml4U25pcHBldHMucHVzaChgdW5pZm9ybSBpdmVjMiAke3gubmFtZX1UZXhTaGFwZTtgKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChwcm9ncmFtLmVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgICAgc3dpdGNoIChvdXRwdXRTaGFwZS5sb2dpY2FsU2hhcGUubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgcHJlZml4U25pcHBldHMucHVzaChgdW5pZm9ybSBpbnQgb3V0U2hhcGU7YCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgcHJlZml4U25pcHBldHMucHVzaChgdW5pZm9ybSBpdmVjMiBvdXRTaGFwZTtgKTtcbiAgICAgICAgICAgICAgICBwcmVmaXhTbmlwcGV0cy5wdXNoKGB1bmlmb3JtIGludCBvdXRTaGFwZVN0cmlkZXM7YCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgcHJlZml4U25pcHBldHMucHVzaChgdW5pZm9ybSBpdmVjMyBvdXRTaGFwZTtgKTtcbiAgICAgICAgICAgICAgICBwcmVmaXhTbmlwcGV0cy5wdXNoKGB1bmlmb3JtIGl2ZWMyIG91dFNoYXBlU3RyaWRlcztgKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICBwcmVmaXhTbmlwcGV0cy5wdXNoKGB1bmlmb3JtIGl2ZWM0IG91dFNoYXBlO2ApO1xuICAgICAgICAgICAgICAgIHByZWZpeFNuaXBwZXRzLnB1c2goYHVuaWZvcm0gaXZlYzMgb3V0U2hhcGVTdHJpZGVzO2ApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBwcmVmaXhTbmlwcGV0cy5wdXNoKGB1bmlmb3JtIGl2ZWMyIG91dFRleFNoYXBlO2ApO1xuICAgIH1cbiAgICBpZiAocHJvZ3JhbS5jdXN0b21Vbmlmb3Jtcykge1xuICAgICAgICBwcm9ncmFtLmN1c3RvbVVuaWZvcm1zLmZvckVhY2goKGQpID0+IHtcbiAgICAgICAgICAgIHByZWZpeFNuaXBwZXRzLnB1c2goYHVuaWZvcm0gJHtkLnR5cGV9ICR7ZC5uYW1lfSR7ZC5hcnJheUluZGV4ID8gYFske2QuYXJyYXlJbmRleH1dYCA6ICcnfTtgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0UHJlZml4U25pcHBldCA9IHByZWZpeFNuaXBwZXRzLmpvaW4oJ1xcbicpO1xuICAgIGNvbnN0IGlucHV0U2FtcGxpbmdTbmlwcGV0ID0gaW5wdXRzSW5mb1xuICAgICAgICAubWFwKHggPT4gZ2V0SW5wdXRTYW1wbGluZ1NuaXBwZXQoeCwgb3V0cHV0U2hhcGUsIHByb2dyYW0ucGFja2VkSW5wdXRzLCBwcm9ncmFtLmVuYWJsZVNoYXBlVW5pZm9ybXMpKVxuICAgICAgICAuam9pbignXFxuJyk7XG4gICAgY29uc3Qgb3V0VGV4U2hhcGUgPSBvdXRwdXRTaGFwZS50ZXhTaGFwZTtcbiAgICBjb25zdCBnbHNsID0gZ2V0R2xzbERpZmZlcmVuY2VzKCk7XG4gICAgY29uc3QgZmxvYXRUZXh0dXJlU2FtcGxlU25pcHBldCA9IGdldEZsb2F0VGV4dHVyZVNhbXBsZVNuaXBwZXQoZ2xzbCk7XG4gICAgbGV0IG91dHB1dFNhbXBsaW5nU25pcHBldDtcbiAgICBsZXQgZmxvYXRUZXh0dXJlU2V0T3V0cHV0U25pcHBldDtcbiAgICBsZXQgc2hhZGVyUHJlZml4ID0gZ2V0U2hhZGVyUHJlZml4KGdsc2wpO1xuICAgIGlmIChvdXRwdXRTaGFwZS5pc1BhY2tlZCkge1xuICAgICAgICBvdXRwdXRTYW1wbGluZ1NuaXBwZXQgPSBnZXRQYWNrZWRPdXRwdXRTYW1wbGluZ1NuaXBwZXQob3V0cHV0U2hhcGUubG9naWNhbFNoYXBlLCBvdXRUZXhTaGFwZSwgcHJvZ3JhbS5lbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICAgICAgZmxvYXRUZXh0dXJlU2V0T3V0cHV0U25pcHBldCA9IGdldEZsb2F0VGV4dHVyZVNldFJHQkFTbmlwcGV0KGdsc2wpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgb3V0cHV0U2FtcGxpbmdTbmlwcGV0ID0gZ2V0T3V0cHV0U2FtcGxpbmdTbmlwcGV0KG91dHB1dFNoYXBlLmxvZ2ljYWxTaGFwZSwgb3V0VGV4U2hhcGUsIHByb2dyYW0uZW5hYmxlU2hhcGVVbmlmb3Jtcyk7XG4gICAgICAgIGZsb2F0VGV4dHVyZVNldE91dHB1dFNuaXBwZXQgPSBnZXRGbG9hdFRleHR1cmVTZXRSU25pcHBldChnbHNsKTtcbiAgICB9XG4gICAgaWYgKHByb2dyYW0ucGFja2VkSW5wdXRzKSB7XG4gICAgICAgIHNoYWRlclByZWZpeCArPSBTSEFERVJfUEFDS0VEX1BSRUZJWDtcbiAgICB9XG4gICAgY29uc3Qgc291cmNlID0gW1xuICAgICAgICBzaGFkZXJQcmVmaXgsIGZsb2F0VGV4dHVyZVNhbXBsZVNuaXBwZXQsIGZsb2F0VGV4dHVyZVNldE91dHB1dFNuaXBwZXQsXG4gICAgICAgIGlucHV0UHJlZml4U25pcHBldCwgb3V0cHV0U2FtcGxpbmdTbmlwcGV0LCBpbnB1dFNhbXBsaW5nU25pcHBldCxcbiAgICAgICAgcHJvZ3JhbS51c2VyQ29kZVxuICAgIF0uam9pbignXFxuJyk7XG4gICAgcmV0dXJuIHNvdXJjZTtcbn1cbmZ1bmN0aW9uIGdldFNhbXBsZXJGcm9tSW5JbmZvKGluSW5mbywgZW5hYmxlU2hhcGVVbmlmb3JtcyA9IGZhbHNlKSB7XG4gICAgY29uc3Qgc2hhcGUgPSBpbkluZm8uc2hhcGVJbmZvLmxvZ2ljYWxTaGFwZTtcbiAgICBzd2l0Y2ggKHNoYXBlLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICByZXR1cm4gZ2V0U2FtcGxlclNjYWxhcihpbkluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICByZXR1cm4gZ2V0U2FtcGxlcjFEKGluSW5mbywgZW5hYmxlU2hhcGVVbmlmb3Jtcyk7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIHJldHVybiBnZXRTYW1wbGVyMkQoaW5JbmZvLCBlbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgcmV0dXJuIGdldFNhbXBsZXIzRChpbkluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICByZXR1cm4gZ2V0U2FtcGxlcjREKGluSW5mbywgZW5hYmxlU2hhcGVVbmlmb3Jtcyk7XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIHJldHVybiBnZXRTYW1wbGVyNUQoaW5JbmZvKTtcbiAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgcmV0dXJuIGdldFNhbXBsZXI2RChpbkluZm8pO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3NoYXBlLmxlbmd0aH0tRCBpbnB1dCBzYW1wbGluZ2AgK1xuICAgICAgICAgICAgICAgIGAgaXMgbm90IHlldCBzdXBwb3J0ZWRgKTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRQYWNrZWRTYW1wbGVyRnJvbUluSW5mbyhpbkluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICBjb25zdCBzaGFwZSA9IGluSW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlO1xuICAgIHN3aXRjaCAoc2hhcGUubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIHJldHVybiBnZXRQYWNrZWRTYW1wbGVyU2NhbGFyKGluSW5mbyk7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIHJldHVybiBnZXRQYWNrZWRTYW1wbGVyMUQoaW5JbmZvLCBlbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgcmV0dXJuIGdldFBhY2tlZFNhbXBsZXIyRChpbkluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICByZXR1cm4gZ2V0UGFja2VkU2FtcGxlcjNEKGluSW5mbywgZW5hYmxlU2hhcGVVbmlmb3Jtcyk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZ2V0UGFja2VkU2FtcGxlck5EKGluSW5mbywgZW5hYmxlU2hhcGVVbmlmb3Jtcyk7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0SW5wdXRTYW1wbGluZ1NuaXBwZXQoaW5JbmZvLCBvdXRTaGFwZUluZm8sIHVzZXNQYWNrZWRUZXh0dXJlcyA9IGZhbHNlLCBlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgbGV0IHJlcyA9ICcnO1xuICAgIGlmICh1c2VzUGFja2VkVGV4dHVyZXMpIHtcbiAgICAgICAgcmVzICs9IGdldFBhY2tlZFNhbXBsZXJGcm9tSW5JbmZvKGluSW5mbywgZW5hYmxlU2hhcGVVbmlmb3Jtcyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXMgKz0gZ2V0U2FtcGxlckZyb21JbkluZm8oaW5JbmZvLCBlbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICB9XG4gICAgY29uc3QgaW5TaGFwZSA9IGluSW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlO1xuICAgIGNvbnN0IG91dFNoYXBlID0gb3V0U2hhcGVJbmZvLmxvZ2ljYWxTaGFwZTtcbiAgICBpZiAoaW5TaGFwZS5sZW5ndGggPD0gb3V0U2hhcGUubGVuZ3RoKSB7XG4gICAgICAgIGlmICh1c2VzUGFja2VkVGV4dHVyZXMpIHtcbiAgICAgICAgICAgIHJlcyArPSBnZXRQYWNrZWRTYW1wbGVyQXRPdXRwdXRDb29yZHMoaW5JbmZvLCBvdXRTaGFwZUluZm8pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzICs9IGdldFNhbXBsZXJBdE91dHB1dENvb3JkcyhpbkluZm8sIG91dFNoYXBlSW5mbyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmZ1bmN0aW9uIGdldFBhY2tlZE91dHB1dFNhbXBsaW5nU25pcHBldChvdXRTaGFwZSwgb3V0VGV4U2hhcGUsIGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICBzd2l0Y2ggKG91dFNoYXBlLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICByZXR1cm4gZ2V0T3V0cHV0U2NhbGFyQ29vcmRzKCk7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIHJldHVybiBnZXRPdXRwdXRQYWNrZWQxRENvb3JkcyhvdXRTaGFwZSwgb3V0VGV4U2hhcGUsIGVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICByZXR1cm4gZ2V0T3V0cHV0UGFja2VkMkRDb29yZHMob3V0U2hhcGUsIG91dFRleFNoYXBlLCBlbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgcmV0dXJuIGdldE91dHB1dFBhY2tlZDNEQ29vcmRzKG91dFNoYXBlLCBvdXRUZXhTaGFwZSwgZW5hYmxlU2hhcGVVbmlmb3Jtcyk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZ2V0T3V0cHV0UGFja2VkTkRDb29yZHMob3V0U2hhcGUsIG91dFRleFNoYXBlLCBlbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRPdXRwdXRTYW1wbGluZ1NuaXBwZXQob3V0U2hhcGUsIG91dFRleFNoYXBlLCBlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgc3dpdGNoIChvdXRTaGFwZS5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgcmV0dXJuIGdldE91dHB1dFNjYWxhckNvb3JkcygpO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICByZXR1cm4gZ2V0T3V0cHV0MURDb29yZHMob3V0U2hhcGUsIG91dFRleFNoYXBlLCBlbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgcmV0dXJuIGdldE91dHB1dDJEQ29vcmRzKG91dFNoYXBlLCBvdXRUZXhTaGFwZSwgZW5hYmxlU2hhcGVVbmlmb3Jtcyk7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIHJldHVybiBnZXRPdXRwdXQzRENvb3JkcyhvdXRTaGFwZSwgb3V0VGV4U2hhcGUsIGVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICByZXR1cm4gZ2V0T3V0cHV0NERDb29yZHMob3V0U2hhcGUsIG91dFRleFNoYXBlLCBlbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgcmV0dXJuIGdldE91dHB1dDVEQ29vcmRzKG91dFNoYXBlLCBvdXRUZXhTaGFwZSk7XG4gICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgIHJldHVybiBnZXRPdXRwdXQ2RENvb3JkcyhvdXRTaGFwZSwgb3V0VGV4U2hhcGUpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke291dFNoYXBlLmxlbmd0aH0tRCBvdXRwdXQgc2FtcGxpbmcgaXMgbm90IHlldCBzdXBwb3J0ZWRgKTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRGbG9hdFRleHR1cmVTYW1wbGVTbmlwcGV0KGdsc2wpIHtcbiAgICByZXR1cm4gYFxuICAgIGZsb2F0IHNhbXBsZVRleHR1cmUoc2FtcGxlcjJEIHRleHR1cmVTYW1wbGVyLCB2ZWMyIHV2KSB7XG4gICAgICByZXR1cm4gJHtnbHNsLnRleHR1cmUyRH0odGV4dHVyZVNhbXBsZXIsIHV2KS5yO1xuICAgIH1cbiAgYDtcbn1cbmZ1bmN0aW9uIGdldEZsb2F0VGV4dHVyZVNldFJTbmlwcGV0KGdsc2wpIHtcbiAgICByZXR1cm4gYFxuICAgIHZvaWQgc2V0T3V0cHV0KGZsb2F0IHZhbCkge1xuICAgICAgJHtnbHNsLm91dHB1dH0gPSB2ZWM0KHZhbCwgMCwgMCwgMCk7XG4gICAgfVxuICBgO1xufVxuZnVuY3Rpb24gZ2V0RmxvYXRUZXh0dXJlU2V0UkdCQVNuaXBwZXQoZ2xzbCkge1xuICAgIHJldHVybiBgXG4gICAgdm9pZCBzZXRPdXRwdXQodmVjNCB2YWwpIHtcbiAgICAgICR7Z2xzbC5vdXRwdXR9ID0gdmFsO1xuICAgIH1cbiAgYDtcbn1cbmZ1bmN0aW9uIGdldFNoYWRlclByZWZpeChnbHNsKSB7XG4gICAgY29uc3QgU0hBREVSX1BSRUZJWCA9IGAke2dsc2wudmVyc2lvbn1cbiAgICBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7XG4gICAgcHJlY2lzaW9uIGhpZ2hwIGludDtcbiAgICBwcmVjaXNpb24gaGlnaHAgc2FtcGxlcjJEO1xuICAgICR7Z2xzbC52YXJ5aW5nRnN9IHZlYzIgcmVzdWx0VVY7XG4gICAgJHtnbHNsLmRlZmluZU91dHB1dH1cbiAgICBjb25zdCB2ZWMyIGhhbGZDUiA9IHZlYzIoMC41LCAwLjUpO1xuXG4gICAgc3RydWN0IGl2ZWM1XG4gICAge1xuICAgICAgaW50IHg7XG4gICAgICBpbnQgeTtcbiAgICAgIGludCB6O1xuICAgICAgaW50IHc7XG4gICAgICBpbnQgdTtcbiAgICB9O1xuXG4gICAgc3RydWN0IGl2ZWM2XG4gICAge1xuICAgICAgaW50IHg7XG4gICAgICBpbnQgeTtcbiAgICAgIGludCB6O1xuICAgICAgaW50IHc7XG4gICAgICBpbnQgdTtcbiAgICAgIGludCB2O1xuICAgIH07XG5cbiAgICB1bmlmb3JtIGZsb2F0IE5BTjtcbiAgICAke2dsc2wuZGVmaW5lU3BlY2lhbE5hTn1cbiAgICAke2dsc2wuZGVmaW5lU3BlY2lhbEluZn1cbiAgICAke2dsc2wuZGVmaW5lUm91bmR9XG5cbiAgICBpbnQgaW1vZChpbnQgeCwgaW50IHkpIHtcbiAgICAgIHJldHVybiB4IC0geSAqICh4IC8geSk7XG4gICAgfVxuXG4gICAgaW50IGlkaXYoaW50IGEsIGludCBiLCBmbG9hdCBzaWduKSB7XG4gICAgICBpbnQgcmVzID0gYSAvIGI7XG4gICAgICBpbnQgbW9kID0gaW1vZChhLCBiKTtcbiAgICAgIGlmIChzaWduIDwgMC4gJiYgbW9kICE9IDApIHtcbiAgICAgICAgcmVzIC09IDE7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8vQmFzZWQgb24gdGhlIHdvcmsgb2YgRGF2ZSBIb3NraW5zXG4gICAgLy9odHRwczovL3d3dy5zaGFkZXJ0b3kuY29tL3ZpZXcvNGRqU1JXXG4gICAgI2RlZmluZSBIQVNIU0NBTEUxIDQ0My44OTc1XG4gICAgZmxvYXQgcmFuZG9tKGZsb2F0IHNlZWQpe1xuICAgICAgdmVjMiBwID0gcmVzdWx0VVYgKiBzZWVkO1xuICAgICAgdmVjMyBwMyAgPSBmcmFjdCh2ZWMzKHAueHl4KSAqIEhBU0hTQ0FMRTEpO1xuICAgICAgcDMgKz0gZG90KHAzLCBwMy55enggKyAxOS4xOSk7XG4gICAgICByZXR1cm4gZnJhY3QoKHAzLnggKyBwMy55KSAqIHAzLnopO1xuICAgIH1cblxuICAgICR7U0FNUExFXzFEX1NOSVBQRVR9XG4gICAgJHtTQU1QTEVfMkRfU05JUFBFVH1cbiAgICAke1NBTVBMRV8zRF9TTklQUEVUfVxuICBgO1xuICAgIHJldHVybiBTSEFERVJfUFJFRklYO1xufVxuY29uc3QgU0FNUExFXzFEX1NOSVBQRVQgPSBgXG52ZWMyIHV2RnJvbUZsYXQoaW50IHRleE51bVIsIGludCB0ZXhOdW1DLCBpbnQgaW5kZXgpIHtcbiAgaW50IHRleFIgPSBpbmRleCAvIHRleE51bUM7XG4gIGludCB0ZXhDID0gaW5kZXggLSB0ZXhSICogdGV4TnVtQztcbiAgcmV0dXJuICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvIHZlYzIodGV4TnVtQywgdGV4TnVtUik7XG59XG52ZWMyIHBhY2tlZFVWZnJvbTFEKGludCB0ZXhOdW1SLCBpbnQgdGV4TnVtQywgaW50IGluZGV4KSB7XG4gIGludCB0ZXhlbEluZGV4ID0gaW5kZXggLyAyO1xuICBpbnQgdGV4UiA9IHRleGVsSW5kZXggLyB0ZXhOdW1DO1xuICBpbnQgdGV4QyA9IHRleGVsSW5kZXggLSB0ZXhSICogdGV4TnVtQztcbiAgcmV0dXJuICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvIHZlYzIodGV4TnVtQywgdGV4TnVtUik7XG59XG5gO1xuY29uc3QgU0FNUExFXzJEX1NOSVBQRVQgPSBgXG52ZWMyIHBhY2tlZFVWZnJvbTJEKGludCB0ZXhlbHNJbkxvZ2ljYWxSb3csIGludCB0ZXhOdW1SLFxuICBpbnQgdGV4TnVtQywgaW50IHJvdywgaW50IGNvbCkge1xuICBpbnQgdGV4ZWxJbmRleCA9IChyb3cgLyAyKSAqIHRleGVsc0luTG9naWNhbFJvdyArIChjb2wgLyAyKTtcbiAgaW50IHRleFIgPSB0ZXhlbEluZGV4IC8gdGV4TnVtQztcbiAgaW50IHRleEMgPSB0ZXhlbEluZGV4IC0gdGV4UiAqIHRleE51bUM7XG4gIHJldHVybiAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgLyB2ZWMyKHRleE51bUMsIHRleE51bVIpO1xufVxuYDtcbmNvbnN0IFNBTVBMRV8zRF9TTklQUEVUID0gYFxudmVjMiBwYWNrZWRVVmZyb20zRChpbnQgdGV4TnVtUiwgaW50IHRleE51bUMsXG4gICAgaW50IHRleGVsc0luQmF0Y2gsIGludCB0ZXhlbHNJbkxvZ2ljYWxSb3csIGludCBiLFxuICAgIGludCByb3csIGludCBjb2wpIHtcbiAgaW50IGluZGV4ID0gYiAqIHRleGVsc0luQmF0Y2ggKyAocm93IC8gMikgKiB0ZXhlbHNJbkxvZ2ljYWxSb3cgKyAoY29sIC8gMik7XG4gIGludCB0ZXhSID0gaW5kZXggLyB0ZXhOdW1DO1xuICBpbnQgdGV4QyA9IGluZGV4IC0gdGV4UiAqIHRleE51bUM7XG4gIHJldHVybiAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgLyB2ZWMyKHRleE51bUMsIHRleE51bVIpO1xufVxuYDtcbmNvbnN0IFNIQURFUl9QQUNLRURfUFJFRklYID0gYFxuICBmbG9hdCBnZXRDaGFubmVsKHZlYzQgZnJhZywgdmVjMiBpbm5lckRpbXMpIHtcbiAgICB2ZWMyIG1vZENvb3JkID0gbW9kKGlubmVyRGltcywgMi4pO1xuICAgIHJldHVybiBtb2RDb29yZC54ID09IDAuID9cbiAgICAgIChtb2RDb29yZC55ID09IDAuID8gZnJhZy5yIDogZnJhZy5nKSA6XG4gICAgICAobW9kQ29vcmQueSA9PSAwLiA/IGZyYWcuYiA6IGZyYWcuYSk7XG4gIH1cbiAgZmxvYXQgZ2V0Q2hhbm5lbCh2ZWM0IGZyYWcsIGludCBkaW0pIHtcbiAgICBmbG9hdCBtb2RDb29yZCA9IG1vZChmbG9hdChkaW0pLCAyLik7XG4gICAgcmV0dXJuIG1vZENvb3JkID09IDAuID8gZnJhZy5yIDogZnJhZy5nO1xuICB9XG5gO1xuZnVuY3Rpb24gZ2V0T3V0cHV0U2NhbGFyQ29vcmRzKCkge1xuICAgIHJldHVybiBgXG4gICAgaW50IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgYDtcbn1cbmZ1bmN0aW9uIGdldE91dHB1dFBhY2tlZDFEQ29vcmRzKHNoYXBlLCB0ZXhTaGFwZSwgZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgIGNvbnN0IHBhY2tlZFRleFNoYXBlID0gW01hdGguY2VpbCh0ZXhTaGFwZVswXSAvIDIpLCBNYXRoLmNlaWwodGV4U2hhcGVbMV0gLyAyKV07XG4gICAgaWYgKHBhY2tlZFRleFNoYXBlWzBdID09PSAxKSB7XG4gICAgICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICAgICAgICByZXR1cm4gYFxuICAgICAgaW50IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgcmV0dXJuIDIgKiBpbnQocmVzdWx0VVYueCAqIGNlaWwoZmxvYXQob3V0VGV4U2hhcGVbMV0pIC8gMi4wKSk7XG4gICAgICB9XG4gICAgYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYFxuICAgICAgaW50IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgcmV0dXJuIDIgKiBpbnQocmVzdWx0VVYueCAqICR7cGFja2VkVGV4U2hhcGVbMV19LjApO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIGlmIChwYWNrZWRUZXhTaGFwZVsxXSA9PT0gMSkge1xuICAgICAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgICAgICAgcmV0dXJuIGBcbiAgICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgIHJldHVybiAyICogaW50KHJlc3VsdFVWLnkgKiBjZWlsKGZsb2F0KG91dFRleFNoYXBlWzBdKSAvIDIuMCkpO1xuICAgICAgfVxuICAgIGA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGBcbiAgICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgIHJldHVybiAyICogaW50KHJlc3VsdFVWLnkgKiAke3BhY2tlZFRleFNoYXBlWzBdfS4wKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgICByZXR1cm4gYFxuICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiBwYWNrZWRUZXhTaGFwZSA9IGl2ZWMyKGNlaWwoZmxvYXQob3V0VGV4U2hhcGVbMF0pIC8gMi4wKSwgY2VpbChmbG9hdChvdXRUZXhTaGFwZVsxXSkgLyAyLjApKTtcbiAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIocmVzdWx0VVYueXggKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKHBhY2tlZFRleFNoYXBlWzBdLCBwYWNrZWRUZXhTaGFwZVsxXSkpO1xuICAgICAgcmV0dXJuIDIgKiAocmVzVGV4UkMueCAqIHBhY2tlZFRleFNoYXBlWzFdICsgcmVzVGV4UkMueSk7XG4gICAgfVxuICBgO1xuICAgIH1cbiAgICByZXR1cm4gYFxuICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3BhY2tlZFRleFNoYXBlWzBdfSwgJHtwYWNrZWRUZXhTaGFwZVsxXX0pKTtcbiAgICAgIHJldHVybiAyICogKHJlc1RleFJDLnggKiAke3BhY2tlZFRleFNoYXBlWzFdfSArIHJlc1RleFJDLnkpO1xuICAgIH1cbiAgYDtcbn1cbmZ1bmN0aW9uIGdldE91dHB1dDFEQ29vcmRzKHNoYXBlLCB0ZXhTaGFwZSwgZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgIGlmICh0ZXhTaGFwZVswXSA9PT0gMSkge1xuICAgICAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgICAgICAgcmV0dXJuIGBcbiAgICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgIHJldHVybiBpbnQocmVzdWx0VVYueCAqIGZsb2F0KG91dFRleFNoYXBlWzFdKSk7XG4gICAgICB9XG4gICAgYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYFxuICAgICAgaW50IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgcmV0dXJuIGludChyZXN1bHRVVi54ICogJHt0ZXhTaGFwZVsxXX0uMCk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG4gICAgaWYgKHRleFNoYXBlWzFdID09PSAxKSB7XG4gICAgICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICAgICAgICByZXR1cm4gYFxuICAgICAgaW50IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgcmV0dXJuIGludChyZXN1bHRVVi55ICogZmxvYXQob3V0VGV4U2hhcGVbMF0pKTtcbiAgICAgIH1cbiAgICBgO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgXG4gICAgICBpbnQgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgICByZXR1cm4gaW50KHJlc3VsdFVWLnkgKiAke3RleFNoYXBlWzBdfS4wKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgICByZXR1cm4gYFxuICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMihvdXRUZXhTaGFwZVswXSwgb3V0VGV4U2hhcGVbMV0pKTtcbiAgICAgIHJldHVybiByZXNUZXhSQy54ICogb3V0VGV4U2hhcGVbMV0gKyByZXNUZXhSQy55O1xuICAgIH1cbiAgYDtcbiAgICB9XG4gICAgcmV0dXJuIGBcbiAgICBpbnQgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihyZXN1bHRVVi55eCAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoJHt0ZXhTaGFwZVswXX0sICR7dGV4U2hhcGVbMV19KSk7XG4gICAgICByZXR1cm4gcmVzVGV4UkMueCAqICR7dGV4U2hhcGVbMV19ICsgcmVzVGV4UkMueTtcbiAgICB9XG4gIGA7XG59XG5mdW5jdGlvbiBnZXRPdXRwdXRQYWNrZWQzRENvb3JkcyhzaGFwZSwgdGV4U2hhcGUsIGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgICByZXR1cm4gYFxuICAgIGl2ZWMzIGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgIGl2ZWMyIHBhY2tlZFRleFNoYXBlID0gaXZlYzIoY2VpbChmbG9hdChvdXRUZXhTaGFwZVswXSkgLyAyLjApLCBjZWlsKGZsb2F0KG91dFRleFNoYXBlWzFdKSAvIDIuMCkpO1xuICAgICAgaW50IHRleGVsc0luTG9naWNhbFJvdyA9IGludChjZWlsKGZsb2F0KG91dFNoYXBlWzJdKSAvIDIuMCkpO1xuICAgICAgaW50IHRleGVsc0luQmF0Y2ggPSB0ZXhlbHNJbkxvZ2ljYWxSb3cgKiBpbnQoY2VpbChmbG9hdChvdXRTaGFwZVsxXSkgLyAyLjApKTtcbiAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIocmVzdWx0VVYueXggKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKHBhY2tlZFRleFNoYXBlWzBdLCBwYWNrZWRUZXhTaGFwZVsxXSkpO1xuICAgICAgaW50IGluZGV4ID0gcmVzVGV4UkMueCAqIHBhY2tlZFRleFNoYXBlWzFdICsgcmVzVGV4UkMueTtcblxuICAgICAgaW50IGIgPSBpbmRleCAvIHRleGVsc0luQmF0Y2g7XG4gICAgICBpbmRleCAtPSBiICogdGV4ZWxzSW5CYXRjaDtcblxuICAgICAgaW50IHIgPSAyICogKGluZGV4IC8gdGV4ZWxzSW5Mb2dpY2FsUm93KTtcbiAgICAgIGludCBjID0gaW1vZChpbmRleCwgdGV4ZWxzSW5Mb2dpY2FsUm93KSAqIDI7XG5cbiAgICAgIHJldHVybiBpdmVjMyhiLCByLCBjKTtcbiAgICB9XG4gIGA7XG4gICAgfVxuICAgIGNvbnN0IHBhY2tlZFRleFNoYXBlID0gW01hdGguY2VpbCh0ZXhTaGFwZVswXSAvIDIpLCBNYXRoLmNlaWwodGV4U2hhcGVbMV0gLyAyKV07XG4gICAgY29uc3QgdGV4ZWxzSW5Mb2dpY2FsUm93ID0gTWF0aC5jZWlsKHNoYXBlWzJdIC8gMik7XG4gICAgY29uc3QgdGV4ZWxzSW5CYXRjaCA9IHRleGVsc0luTG9naWNhbFJvdyAqIE1hdGguY2VpbChzaGFwZVsxXSAvIDIpO1xuICAgIHJldHVybiBgXG4gICAgaXZlYzMgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihyZXN1bHRVVi55eCAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoJHtwYWNrZWRUZXhTaGFwZVswXX0sICR7cGFja2VkVGV4U2hhcGVbMV19KSk7XG4gICAgICBpbnQgaW5kZXggPSByZXNUZXhSQy54ICogJHtwYWNrZWRUZXhTaGFwZVsxXX0gKyByZXNUZXhSQy55O1xuXG4gICAgICBpbnQgYiA9IGluZGV4IC8gJHt0ZXhlbHNJbkJhdGNofTtcbiAgICAgIGluZGV4IC09IGIgKiAke3RleGVsc0luQmF0Y2h9O1xuXG4gICAgICBpbnQgciA9IDIgKiAoaW5kZXggLyAke3RleGVsc0luTG9naWNhbFJvd30pO1xuICAgICAgaW50IGMgPSBpbW9kKGluZGV4LCAke3RleGVsc0luTG9naWNhbFJvd30pICogMjtcblxuICAgICAgcmV0dXJuIGl2ZWMzKGIsIHIsIGMpO1xuICAgIH1cbiAgYDtcbn1cbmZ1bmN0aW9uIGdldE91dHB1dDNEQ29vcmRzKHNoYXBlLCB0ZXhTaGFwZSwgZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICAgIGNvbnN0IGNvb3Jkc0Zyb21JbmRleFNuaXBwZXQgPSBzaGFkZXJfdXRpbC5nZXRMb2dpY2FsQ29vcmRpbmF0ZXNGcm9tRmxhdEluZGV4QnlVbmlmb3JtKFsncicsICdjJywgJ2QnXSwgc2hhcGUpO1xuICAgICAgICByZXR1cm4gYFxuICBpdmVjMyBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihyZXN1bHRVVi55eCAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKG91dFRleFNoYXBlWzBdLCBvdXRUZXhTaGFwZVsxXSkpO1xuICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiBvdXRUZXhTaGFwZVsxXSArIHJlc1RleFJDLnk7XG4gICAgJHtjb29yZHNGcm9tSW5kZXhTbmlwcGV0fVxuICAgIHJldHVybiBpdmVjMyhyLCBjLCBkKTtcbiAgfVxuYDtcbiAgICB9XG4gICAgY29uc3QgY29vcmRzRnJvbUluZGV4U25pcHBldCA9IHNoYWRlcl91dGlsLmdldExvZ2ljYWxDb29yZGluYXRlc0Zyb21GbGF0SW5kZXgoWydyJywgJ2MnLCAnZCddLCBzaGFwZSk7XG4gICAgcmV0dXJuIGBcbiAgICBpdmVjMyBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3RleFNoYXBlWzBdfSwgJHt0ZXhTaGFwZVsxXX0pKTtcbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiAke3RleFNoYXBlWzFdfSArIHJlc1RleFJDLnk7XG4gICAgICAke2Nvb3Jkc0Zyb21JbmRleFNuaXBwZXR9XG4gICAgICByZXR1cm4gaXZlYzMociwgYywgZCk7XG4gICAgfVxuICBgO1xufVxuZnVuY3Rpb24gZ2V0T3V0cHV0UGFja2VkTkRDb29yZHMoc2hhcGUsIHRleFNoYXBlLCBlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgICAgLy8gVE9ETzogc3VwcG9ydCA1ZCBhbmQgNmRcbiAgICAgICAgcmV0dXJuIGBcbiAgICBpdmVjNCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiBwYWNrZWRUZXhTaGFwZSA9IGl2ZWMyKGNlaWwoZmxvYXQob3V0VGV4U2hhcGVbMF0pIC8gMi4wKSwgY2VpbChmbG9hdChvdXRUZXhTaGFwZVsxXSkgLyAyLjApKTtcbiAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIocmVzdWx0VVYueXggKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKHBhY2tlZFRleFNoYXBlWzBdLCBwYWNrZWRUZXhTaGFwZVsxXSkpO1xuICAgICAgaW50IGluZGV4ID0gcmVzVGV4UkMueCAqIHBhY2tlZFRleFNoYXBlWzFdICsgcmVzVGV4UkMueTtcblxuICAgICAgaW50IHRleGVsc0luTG9naWNhbFJvdyA9IGludChjZWlsKGZsb2F0KG91dFNoYXBlWzNdKSAvIDIuMCkpO1xuICAgICAgaW50IHRleGVsc0luQmF0Y2ggPSB0ZXhlbHNJbkxvZ2ljYWxSb3cgKiBpbnQoY2VpbChmbG9hdChvdXRTaGFwZVsyXSkgLyAyLjApKTtcbiAgICAgIGludCB0ZXhlbHNJbkJhdGNoTiA9IHRleGVsc0luQmF0Y2ggKiBvdXRTaGFwZVsxXTtcblxuICAgICAgaW50IGIyID0gaW5kZXggLyB0ZXhlbHNJbkJhdGNoTjtcbiAgICAgIGluZGV4IC09IGIyICogdGV4ZWxzSW5CYXRjaE47XG5cbiAgICAgIGludCBiID0gaW5kZXggLyB0ZXhlbHNJbkJhdGNoO1xuICAgICAgaW5kZXggLT0gYiAqIHRleGVsc0luQmF0Y2g7XG5cbiAgICAgIGludCByID0gMiAqIChpbmRleCAvIHRleGVsc0luTG9naWNhbFJvdyk7XG4gICAgICBpbnQgYyA9IGltb2QoaW5kZXgsIHRleGVsc0luTG9naWNhbFJvdykgKiAyO1xuXG4gICAgICByZXR1cm4gaXZlYzQoYjIsIGIsIHIsIGMpO1xuICAgIH1cbiAgYDtcbiAgICB9XG4gICAgY29uc3QgcGFja2VkVGV4U2hhcGUgPSBbTWF0aC5jZWlsKHRleFNoYXBlWzBdIC8gMiksIE1hdGguY2VpbCh0ZXhTaGFwZVsxXSAvIDIpXTtcbiAgICBjb25zdCB0ZXhlbHNJbkxvZ2ljYWxSb3cgPSBNYXRoLmNlaWwoc2hhcGVbc2hhcGUubGVuZ3RoIC0gMV0gLyAyKTtcbiAgICBjb25zdCB0ZXhlbHNJbkJhdGNoID0gdGV4ZWxzSW5Mb2dpY2FsUm93ICogTWF0aC5jZWlsKHNoYXBlW3NoYXBlLmxlbmd0aCAtIDJdIC8gMik7XG4gICAgbGV0IHRleGVsc0luQmF0Y2hOID0gdGV4ZWxzSW5CYXRjaDtcbiAgICBsZXQgYmF0Y2hlcyA9IGBgO1xuICAgIGxldCBjb29yZHMgPSAnYiwgciwgYyc7XG4gICAgZm9yIChsZXQgYiA9IDI7IGIgPCBzaGFwZS5sZW5ndGggLSAxOyBiKyspIHtcbiAgICAgICAgdGV4ZWxzSW5CYXRjaE4gKj0gc2hhcGVbc2hhcGUubGVuZ3RoIC0gYiAtIDFdO1xuICAgICAgICBiYXRjaGVzID0gYFxuICAgICAgaW50IGIke2J9ID0gaW5kZXggLyAke3RleGVsc0luQmF0Y2hOfTtcbiAgICAgIGluZGV4IC09IGIke2J9ICogJHt0ZXhlbHNJbkJhdGNoTn07XG4gICAgYCArIGJhdGNoZXM7XG4gICAgICAgIGNvb3JkcyA9IGBiJHtifSwgYCArIGNvb3JkcztcbiAgICB9XG4gICAgcmV0dXJuIGBcbiAgICBpdmVjJHtzaGFwZS5sZW5ndGh9IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIocmVzdWx0VVYueXggKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKCR7cGFja2VkVGV4U2hhcGVbMF19LCAke3BhY2tlZFRleFNoYXBlWzFdfSkpO1xuICAgICAgaW50IGluZGV4ID0gcmVzVGV4UkMueCAqICR7cGFja2VkVGV4U2hhcGVbMV19ICsgcmVzVGV4UkMueTtcblxuICAgICAgJHtiYXRjaGVzfVxuXG4gICAgICBpbnQgYiA9IGluZGV4IC8gJHt0ZXhlbHNJbkJhdGNofTtcbiAgICAgIGluZGV4IC09IGIgKiAke3RleGVsc0luQmF0Y2h9O1xuXG4gICAgICBpbnQgciA9IDIgKiAoaW5kZXggLyAke3RleGVsc0luTG9naWNhbFJvd30pO1xuICAgICAgaW50IGMgPSBpbW9kKGluZGV4LCAke3RleGVsc0luTG9naWNhbFJvd30pICogMjtcblxuICAgICAgcmV0dXJuIGl2ZWMke3NoYXBlLmxlbmd0aH0oJHtjb29yZHN9KTtcbiAgICB9XG4gIGA7XG59XG5mdW5jdGlvbiBnZXRPdXRwdXQ0RENvb3JkcyhzaGFwZSwgdGV4U2hhcGUsIGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgICBjb25zdCBjb29yZHNGcm9tSW5kZXhTbmlwcGV0ID0gc2hhZGVyX3V0aWwuZ2V0TG9naWNhbENvb3JkaW5hdGVzRnJvbUZsYXRJbmRleEJ5VW5pZm9ybShbJ3InLCAnYycsICdkJywgJ2QyJ10sIHNoYXBlKTtcbiAgICAgICAgcmV0dXJuIGBcbiAgICBpdmVjNCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgdmVjMihvdXRUZXhTaGFwZVswXSwgb3V0VGV4U2hhcGVbMV0pKTtcbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiBvdXRUZXhTaGFwZVsxXSArIHJlc1RleFJDLnk7XG4gICAgICAke2Nvb3Jkc0Zyb21JbmRleFNuaXBwZXR9XG4gICAgICByZXR1cm4gaXZlYzQociwgYywgZCwgZDIpO1xuICAgIH1cbiAgYDtcbiAgICB9XG4gICAgY29uc3QgY29vcmRzRnJvbUluZGV4U25pcHBldCA9IHNoYWRlcl91dGlsLmdldExvZ2ljYWxDb29yZGluYXRlc0Zyb21GbGF0SW5kZXgoWydyJywgJ2MnLCAnZCcsICdkMiddLCBzaGFwZSk7XG4gICAgcmV0dXJuIGBcbiAgICBpdmVjNCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgdmVjMigke3RleFNoYXBlWzBdfSwgJHt0ZXhTaGFwZVsxXX0pKTtcbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiAke3RleFNoYXBlWzFdfSArIHJlc1RleFJDLnk7XG4gICAgICAke2Nvb3Jkc0Zyb21JbmRleFNuaXBwZXR9XG4gICAgICByZXR1cm4gaXZlYzQociwgYywgZCwgZDIpO1xuICAgIH1cbiAgYDtcbn1cbmZ1bmN0aW9uIGdldE91dHB1dDVEQ29vcmRzKHNoYXBlLCB0ZXhTaGFwZSkge1xuICAgIGNvbnN0IGNvb3Jkc0Zyb21JbmRleFNuaXBwZXQgPSBzaGFkZXJfdXRpbC5nZXRMb2dpY2FsQ29vcmRpbmF0ZXNGcm9tRmxhdEluZGV4KFsncicsICdjJywgJ2QnLCAnZDInLCAnZDMnXSwgc2hhcGUpO1xuICAgIHJldHVybiBgXG4gICAgaXZlYzUgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihyZXN1bHRVVi55eCAqIHZlYzIoJHt0ZXhTaGFwZVswXX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7dGV4U2hhcGVbMV19KSk7XG5cbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiAke3RleFNoYXBlWzFdfSArIHJlc1RleFJDLnk7XG5cbiAgICAgICR7Y29vcmRzRnJvbUluZGV4U25pcHBldH1cblxuICAgICAgaXZlYzUgb3V0U2hhcGUgPSBpdmVjNShyLCBjLCBkLCBkMiwgZDMpO1xuICAgICAgcmV0dXJuIG91dFNoYXBlO1xuICAgIH1cbiAgYDtcbn1cbmZ1bmN0aW9uIGdldE91dHB1dDZEQ29vcmRzKHNoYXBlLCB0ZXhTaGFwZSkge1xuICAgIGNvbnN0IGNvb3Jkc0Zyb21JbmRleFNuaXBwZXQgPSBzaGFkZXJfdXRpbC5nZXRMb2dpY2FsQ29vcmRpbmF0ZXNGcm9tRmxhdEluZGV4KFsncicsICdjJywgJ2QnLCAnZDInLCAnZDMnLCAnZDQnXSwgc2hhcGUpO1xuICAgIHJldHVybiBgXG4gICAgaXZlYzYgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihyZXN1bHRVVi55eCAqXG4gICAgICAgIHZlYzIoJHt0ZXhTaGFwZVswXX0sICR7dGV4U2hhcGVbMV19KSk7XG4gICAgICBpbnQgaW5kZXggPSByZXNUZXhSQy54ICogJHt0ZXhTaGFwZVsxXX0gKyByZXNUZXhSQy55O1xuXG4gICAgICAke2Nvb3Jkc0Zyb21JbmRleFNuaXBwZXR9XG5cbiAgICAgIGl2ZWM2IHJlc3VsdCA9IGl2ZWM2KHIsIGMsIGQsIGQyLCBkMywgZDQpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIGA7XG59XG5mdW5jdGlvbiBnZXRPdXRwdXRQYWNrZWQyRENvb3JkcyhzaGFwZSwgdGV4U2hhcGUsIGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICBjb25zdCBwYWNrZWRUZXhTaGFwZSA9IFtNYXRoLmNlaWwodGV4U2hhcGVbMF0gLyAyKSwgTWF0aC5jZWlsKHRleFNoYXBlWzFdIC8gMildO1xuICAgIGlmICh1dGlsLmFycmF5c0VxdWFsKHNoYXBlLCB0ZXhTaGFwZSkpIHtcbiAgICAgICAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgICAgICAgIHJldHVybiBgXG4gICAgICBpdmVjMiBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgIGl2ZWMyIHBhY2tlZFRleFNoYXBlID0gaXZlYzIoY2VpbChmbG9hdChvdXRUZXhTaGFwZVswXSkgLyAyLjApLCBjZWlsKGZsb2F0KG91dFRleFNoYXBlWzFdKSAvIDIuMCkpO1xuICAgICAgICByZXR1cm4gMiAqIGl2ZWMyKHJlc3VsdFVWLnl4ICogdmVjMihwYWNrZWRUZXhTaGFwZVswXSwgcGFja2VkVGV4U2hhcGVbMV0pKTtcbiAgICAgIH1cbiAgICBgO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgXG4gICAgICBpdmVjMiBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgIHJldHVybiAyICogaXZlYzIocmVzdWx0VVYueXggKiB2ZWMyKCR7cGFja2VkVGV4U2hhcGVbMF19LCAke3BhY2tlZFRleFNoYXBlWzFdfSkpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIC8vIHRleGVscyBuZWVkZWQgdG8gYWNjb21tb2RhdGUgYSBsb2dpY2FsIHJvd1xuICAgIGNvbnN0IHRleGVsc0luTG9naWNhbFJvdyA9IE1hdGguY2VpbChzaGFwZVsxXSAvIDIpO1xuICAgIC8qKlxuICAgICAqIGdldE91dHB1dENvb3Jkc1xuICAgICAqXG4gICAgICogcmVzVGV4UkM6IFRoZSByb3dzIGFuZCBjb2x1bW5zIG9mIHRoZSB0ZXhlbHMuIElmIHlvdSBtb3ZlIG92ZXIgb25lXG4gICAgICogdGV4ZWwgdG8gdGhlIHJpZ2h0IGluIHRoZSBwYWNrZWQgdGV4dHVyZSwgeW91IGFyZSBtb3Zpbmcgb3ZlciBvbmUgY29sdW1uXG4gICAgICogKG5vdCB0d28pLlxuICAgICAqXG4gICAgICogaW5kZXg6IFRoZSB0ZXhlbCBpbmRleFxuICAgICAqL1xuICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICAgIHJldHVybiBgXG4gICAgaXZlYzIgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgaXZlYzIgcGFja2VkVGV4U2hhcGUgPSBpdmVjMihjZWlsKGZsb2F0KG91dFRleFNoYXBlWzBdKSAvIDIuMCksIGNlaWwoZmxvYXQob3V0VGV4U2hhcGVbMV0pIC8gMi4wKSk7XG4gICAgICBpbnQgdGV4ZWxzSW5Mb2dpY2FsUm93ID0gaW50KGNlaWwoZmxvYXQob3V0U2hhcGVbMV0pIC8gMi4wKSk7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMihwYWNrZWRUZXhTaGFwZVswXSwgcGFja2VkVGV4U2hhcGVbMV0pKTtcblxuICAgICAgaW50IGluZGV4ID0gcmVzVGV4UkMueCAqIHBhY2tlZFRleFNoYXBlWzFdICsgcmVzVGV4UkMueTtcbiAgICAgIGludCByID0gMiAqIChpbmRleCAvIHRleGVsc0luTG9naWNhbFJvdyk7XG4gICAgICBpbnQgYyA9IGltb2QoaW5kZXgsIHRleGVsc0luTG9naWNhbFJvdykgKiAyO1xuXG4gICAgICByZXR1cm4gaXZlYzIociwgYyk7XG4gICAgfVxuICBgO1xuICAgIH1cbiAgICByZXR1cm4gYFxuICAgIGl2ZWMyIGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIocmVzdWx0VVYueXggKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKCR7cGFja2VkVGV4U2hhcGVbMF19LCAke3BhY2tlZFRleFNoYXBlWzFdfSkpO1xuXG4gICAgICBpbnQgaW5kZXggPSByZXNUZXhSQy54ICogJHtwYWNrZWRUZXhTaGFwZVsxXX0gKyByZXNUZXhSQy55O1xuICAgICAgaW50IHIgPSAyICogKGluZGV4IC8gJHt0ZXhlbHNJbkxvZ2ljYWxSb3d9KTtcbiAgICAgIGludCBjID0gaW1vZChpbmRleCwgJHt0ZXhlbHNJbkxvZ2ljYWxSb3d9KSAqIDI7XG5cbiAgICAgIHJldHVybiBpdmVjMihyLCBjKTtcbiAgICB9XG4gIGA7XG59XG5mdW5jdGlvbiBnZXRPdXRwdXQyRENvb3JkcyhzaGFwZSwgdGV4U2hhcGUsIGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICBpZiAodXRpbC5hcnJheXNFcXVhbChzaGFwZSwgdGV4U2hhcGUpKSB7XG4gICAgICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICAgICAgICByZXR1cm4gYFxuICAgICAgaXZlYzIgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgICByZXR1cm4gaXZlYzIocmVzdWx0VVYueXggKiB2ZWMyKG91dFRleFNoYXBlWzBdLCBvdXRUZXhTaGFwZVsxXSkpO1xuICAgICAgfVxuICAgIGA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGBcbiAgICAgIGl2ZWMyIGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgcmV0dXJuIGl2ZWMyKHJlc3VsdFVWLnl4ICogdmVjMigke3RleFNoYXBlWzBdfSwgJHt0ZXhTaGFwZVsxXX0pKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbiAgICBpZiAoc2hhcGVbMV0gPT09IDEpIHtcbiAgICAgICAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgICAgICAgIHJldHVybiBgXG4gICAgICBpdmVjMiBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIocmVzdWx0VVYueXggKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIob3V0VGV4U2hhcGVbMF0sIG91dFRleFNoYXBlWzFdKSk7XG4gICAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiBvdXRUZXhTaGFwZVsxXSArIHJlc1RleFJDLnk7XG4gICAgICAgIHJldHVybiBpdmVjMihpbmRleCwgMCk7XG4gICAgICB9XG4gICAgYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYFxuICAgICAgaXZlYzIgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKCR7dGV4U2hhcGVbMF19LCAke3RleFNoYXBlWzFdfSkpO1xuICAgICAgICBpbnQgaW5kZXggPSByZXNUZXhSQy54ICogJHt0ZXhTaGFwZVsxXX0gKyByZXNUZXhSQy55O1xuICAgICAgICByZXR1cm4gaXZlYzIoaW5kZXgsIDApO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIGlmIChzaGFwZVswXSA9PT0gMSkge1xuICAgICAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgICAgICAgcmV0dXJuIGBcbiAgICAgIGl2ZWMyIGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihyZXN1bHRVVi55eCAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMihvdXRUZXhTaGFwZVswXSwgb3V0VGV4U2hhcGVbMV0pKTtcbiAgICAgICAgaW50IGluZGV4ID0gcmVzVGV4UkMueCAqIG91dFRleFNoYXBlWzFdICsgcmVzVGV4UkMueTtcbiAgICAgICAgcmV0dXJuIGl2ZWMyKDAsIGluZGV4KTtcbiAgICAgIH1cbiAgICBgO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgXG4gICAgICBpdmVjMiBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIocmVzdWx0VVYueXggKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoJHt0ZXhTaGFwZVswXX0sICR7dGV4U2hhcGVbMV19KSk7XG4gICAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiAke3RleFNoYXBlWzFdfSArIHJlc1RleFJDLnk7XG4gICAgICAgIHJldHVybiBpdmVjMigwLCBpbmRleCk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG4gICAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgICAgcmV0dXJuIGBcbiAgICBpdmVjMiBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMihvdXRUZXhTaGFwZVswXSwgb3V0VGV4U2hhcGVbMV0pKTtcbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiBvdXRUZXhTaGFwZVsxXSArIHJlc1RleFJDLnk7XG4gICAgICBpbnQgciA9IGluZGV4IC8gb3V0U2hhcGVbMV07XG4gICAgICBpbnQgYyA9IGluZGV4IC0gciAqIG91dFNoYXBlWzFdO1xuICAgICAgcmV0dXJuIGl2ZWMyKHIsIGMpO1xuICAgIH1cbiAgYDtcbiAgICB9XG4gICAgcmV0dXJuIGBcbiAgICBpdmVjMiBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3RleFNoYXBlWzBdfSwgJHt0ZXhTaGFwZVsxXX0pKTtcbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiAke3RleFNoYXBlWzFdfSArIHJlc1RleFJDLnk7XG4gICAgICBpbnQgciA9IGluZGV4IC8gJHtzaGFwZVsxXX07XG4gICAgICBpbnQgYyA9IGluZGV4IC0gciAqICR7c2hhcGVbMV19O1xuICAgICAgcmV0dXJuIGl2ZWMyKHIsIGMpO1xuICAgIH1cbiAgYDtcbn1cbmZ1bmN0aW9uIGdldEZsYXRPZmZzZXRVbmlmb3JtTmFtZSh0ZXhOYW1lKSB7XG4gICAgcmV0dXJuIGBvZmZzZXQke3RleE5hbWV9YDtcbn1cbmZ1bmN0aW9uIGdldFBhY2tlZFNhbXBsZXJTY2FsYXIoaW5wdXRJbmZvKSB7XG4gICAgY29uc3QgdGV4TmFtZSA9IGlucHV0SW5mby5uYW1lO1xuICAgIGNvbnN0IGZ1bmNOYW1lID0gJ2dldCcgKyB0ZXhOYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGV4TmFtZS5zbGljZSgxKTtcbiAgICBjb25zdCBnbHNsID0gZ2V0R2xzbERpZmZlcmVuY2VzKCk7XG4gICAgcmV0dXJuIGBcbiAgICB2ZWM0ICR7ZnVuY05hbWV9KCkge1xuICAgICAgcmV0dXJuICR7Z2xzbC50ZXh0dXJlMkR9KCR7dGV4TmFtZX0sIGhhbGZDUik7XG4gICAgfVxuICBgO1xufVxuZnVuY3Rpb24gZ2V0U2FtcGxlclNjYWxhcihpbnB1dEluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICBjb25zdCB0ZXhOYW1lID0gaW5wdXRJbmZvLm5hbWU7XG4gICAgY29uc3QgZnVuY05hbWUgPSAnZ2V0JyArIHRleE5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0ZXhOYW1lLnNsaWNlKDEpO1xuICAgIGlmIChpbnB1dEluZm8uc2hhcGVJbmZvLmlzVW5pZm9ybSkge1xuICAgICAgICByZXR1cm4gYGZsb2F0ICR7ZnVuY05hbWV9KCkge3JldHVybiAke3RleE5hbWV9O31gO1xuICAgIH1cbiAgICBjb25zdCBbdGV4TnVtUiwgdGV4TnVtQ10gPSBpbnB1dEluZm8uc2hhcGVJbmZvLnRleFNoYXBlO1xuICAgIGlmICh0ZXhOdW1SID09PSAxICYmIHRleE51bUMgPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KCkge1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCBoYWxmQ1IpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIGNvbnN0IG9mZnNldCA9IGdldEZsYXRPZmZzZXRVbmlmb3JtTmFtZSh0ZXhOYW1lKTtcbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgICByZXR1cm4gYFxuICAgIGZsb2F0ICR7ZnVuY05hbWV9KCkge1xuICAgICAgdmVjMiB1diA9IHV2RnJvbUZsYXQoJHt0ZXhOYW1lfVRleFNoYXBlWzBdLCAke3RleE5hbWV9VGV4U2hhcGVbMV0sICR7b2Zmc2V0fSk7XG4gICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgfVxuICBgO1xuICAgIH1cbiAgICBjb25zdCBbdE51bVIsIHROdW1DXSA9IGlucHV0SW5mby5zaGFwZUluZm8udGV4U2hhcGU7XG4gICAgcmV0dXJuIGBcbiAgICBmbG9hdCAke2Z1bmNOYW1lfSgpIHtcbiAgICAgIHZlYzIgdXYgPSB1dkZyb21GbGF0KCR7dE51bVJ9LCAke3ROdW1DfSwgJHtvZmZzZXR9KTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG59XG5mdW5jdGlvbiBnZXRQYWNrZWRTYW1wbGVyMUQoaW5wdXRJbmZvLCBlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgY29uc3QgdGV4TmFtZSA9IGlucHV0SW5mby5uYW1lO1xuICAgIGNvbnN0IGZ1bmNOYW1lID0gJ2dldCcgKyB0ZXhOYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGV4TmFtZS5zbGljZSgxKTtcbiAgICBjb25zdCB0ZXhTaGFwZSA9IGlucHV0SW5mby5zaGFwZUluZm8udGV4U2hhcGU7XG4gICAgY29uc3QgZ2xzbCA9IGdldEdsc2xEaWZmZXJlbmNlcygpO1xuICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICAgIHJldHVybiBgXG4gICAgdmVjNCAke2Z1bmNOYW1lfShpbnQgaW5kZXgpIHtcbiAgICAgIGl2ZWMyIHBhY2tlZFRleFNoYXBlID0gaXZlYzIoY2VpbChmbG9hdCgke3RleE5hbWV9VGV4U2hhcGVbMF0pIC8gMi4wKSwgY2VpbChmbG9hdCgke3RleE5hbWV9VGV4U2hhcGVbMV0pIC8gMi4wKSk7XG4gICAgICB2ZWMyIHV2ID0gcGFja2VkVVZmcm9tMUQoXG4gICAgICAgIHBhY2tlZFRleFNoYXBlWzBdLCBwYWNrZWRUZXhTaGFwZVsxXSwgaW5kZXgpO1xuICAgICAgcmV0dXJuICR7Z2xzbC50ZXh0dXJlMkR9KCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG4gICAgfVxuICAgIGNvbnN0IHBhY2tlZFRleFNoYXBlID0gW01hdGguY2VpbCh0ZXhTaGFwZVswXSAvIDIpLCBNYXRoLmNlaWwodGV4U2hhcGVbMV0gLyAyKV07XG4gICAgcmV0dXJuIGBcbiAgICB2ZWM0ICR7ZnVuY05hbWV9KGludCBpbmRleCkge1xuICAgICAgdmVjMiB1diA9IHBhY2tlZFVWZnJvbTFEKFxuICAgICAgICAke3BhY2tlZFRleFNoYXBlWzBdfSwgJHtwYWNrZWRUZXhTaGFwZVsxXX0sIGluZGV4KTtcbiAgICAgIHJldHVybiAke2dsc2wudGV4dHVyZTJEfSgke3RleE5hbWV9LCB1dik7XG4gICAgfVxuICBgO1xufVxuZnVuY3Rpb24gZ2V0U2FtcGxlcjFEKGlucHV0SW5mbywgZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgIGNvbnN0IHRleE5hbWUgPSBpbnB1dEluZm8ubmFtZTtcbiAgICBjb25zdCBmdW5jTmFtZSA9ICdnZXQnICsgdGV4TmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRleE5hbWUuc2xpY2UoMSk7XG4gICAgaWYgKGlucHV0SW5mby5zaGFwZUluZm8uaXNVbmlmb3JtKSB7XG4gICAgICAgIC8vIFVuaWZvcm0gYXJyYXlzIHdpbGwgYmUgbGVzcyB0aGFuIDY1NTA1IChubyByaXNrIG9mIGZsb2F0MTYgb3ZlcmZsb3cpLlxuICAgICAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IGluZGV4KSB7XG4gICAgICAgICR7Z2V0VW5pZm9ybVNhbXBsZXIoaW5wdXRJbmZvKX1cbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbiAgICBjb25zdCB0ZXhTaGFwZSA9IGlucHV0SW5mby5zaGFwZUluZm8udGV4U2hhcGU7XG4gICAgY29uc3QgdE51bVIgPSB0ZXhTaGFwZVswXTtcbiAgICBjb25zdCB0TnVtQyA9IHRleFNoYXBlWzFdO1xuICAgIGlmICh0TnVtQyA9PT0gMSAmJiB0TnVtUiA9PT0gMSkge1xuICAgICAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IGluZGV4KSB7XG4gICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIGhhbGZDUik7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG4gICAgY29uc3Qgb2Zmc2V0ID0gZ2V0RmxhdE9mZnNldFVuaWZvcm1OYW1lKHRleE5hbWUpO1xuICAgIGlmICh0TnVtQyA9PT0gMSkge1xuICAgICAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgICAgICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCBpbmRleCkge1xuICAgICAgICB2ZWMyIHV2ID0gdmVjMigwLjUsIChmbG9hdChpbmRleCArICR7b2Zmc2V0fSkgKyAwLjUpIC8gZmxvYXQoJHt0ZXhOYW1lfVRleFNoYXBlWzBdKSk7XG4gICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICAgIH1cbiAgICBgO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgaW5kZXgpIHtcbiAgICAgICAgdmVjMiB1diA9IHZlYzIoMC41LCAoZmxvYXQoaW5kZXggKyAke29mZnNldH0pICsgMC41KSAvICR7dE51bVJ9LjApO1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG4gICAgaWYgKHROdW1SID09PSAxKSB7XG4gICAgICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICAgICAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IGluZGV4KSB7XG4gICAgICAgIHZlYzIgdXYgPSB2ZWMyKChmbG9hdChpbmRleCArICR7b2Zmc2V0fSkgKyAwLjUpIC8gZmxvYXQoJHt0ZXhOYW1lfVRleFNoYXBlWzFdKSwgMC41KTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCBpbmRleCkge1xuICAgICAgICB2ZWMyIHV2ID0gdmVjMigoZmxvYXQoaW5kZXggKyAke29mZnNldH0pICsgMC41KSAvICR7dE51bUN9LjAsIDAuNSk7XG4gICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgICByZXR1cm4gYFxuICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCBpbmRleCkge1xuICAgICAgdmVjMiB1diA9IHV2RnJvbUZsYXQoJHt0ZXhOYW1lfVRleFNoYXBlWzBdLCAke3RleE5hbWV9VGV4U2hhcGVbMV0sIGluZGV4ICsgJHtvZmZzZXR9KTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG4gICAgfVxuICAgIHJldHVybiBgXG4gICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IGluZGV4KSB7XG4gICAgICB2ZWMyIHV2ID0gdXZGcm9tRmxhdCgke3ROdW1SfSwgJHt0TnVtQ30sIGluZGV4ICsgJHtvZmZzZXR9KTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG59XG5mdW5jdGlvbiBnZXRQYWNrZWRTYW1wbGVyMkQoaW5wdXRJbmZvLCBlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgY29uc3Qgc2hhcGUgPSBpbnB1dEluZm8uc2hhcGVJbmZvLmxvZ2ljYWxTaGFwZTtcbiAgICBjb25zdCB0ZXhOYW1lID0gaW5wdXRJbmZvLm5hbWU7XG4gICAgY29uc3QgZnVuY05hbWUgPSAnZ2V0JyArIHRleE5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0ZXhOYW1lLnNsaWNlKDEpO1xuICAgIGNvbnN0IHRleFNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby50ZXhTaGFwZTtcbiAgICBjb25zdCB0ZXhOdW1SID0gdGV4U2hhcGVbMF07XG4gICAgY29uc3QgdGV4TnVtQyA9IHRleFNoYXBlWzFdO1xuICAgIGNvbnN0IGdsc2wgPSBnZXRHbHNsRGlmZmVyZW5jZXMoKTtcbiAgICBpZiAodGV4U2hhcGUgIT0gbnVsbCAmJiB1dGlsLmFycmF5c0VxdWFsKHNoYXBlLCB0ZXhTaGFwZSkpIHtcbiAgICAgICAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgICAgICAgIHJldHVybiBgXG4gICAgICB2ZWM0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wpIHtcbiAgICAgICAgdmVjMiB1diA9ICh2ZWMyKGNvbCwgcm93KSArIGhhbGZDUikgLyB2ZWMyKCR7dGV4TmFtZX1UZXhTaGFwZVsxXSwgJHt0ZXhOYW1lfVRleFNoYXBlWzBdKTtcblxuICAgICAgICByZXR1cm4gJHtnbHNsLnRleHR1cmUyRH0oJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGBcbiAgICAgIHZlYzQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgICB2ZWMyIHV2ID0gKHZlYzIoY29sLCByb3cpICsgaGFsZkNSKSAvIHZlYzIoJHt0ZXhOdW1DfS4wLCAke3RleE51bVJ9LjApO1xuXG4gICAgICAgIHJldHVybiAke2dsc2wudGV4dHVyZTJEfSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG4gICAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgICAgcmV0dXJuIGBcbiAgICB2ZWM0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wpIHtcbiAgICAgIGl2ZWMyIHBhY2tlZFRleFNoYXBlID0gaXZlYzIoY2VpbChmbG9hdCgke3RleE5hbWV9VGV4U2hhcGVbMF0pIC8gMi4wKSwgY2VpbChmbG9hdCgke3RleE5hbWV9VGV4U2hhcGVbMV0pIC8gMi4wKSk7XG4gICAgICBpbnQgdmFsdWVzUGVyUm93ID0gaW50KGNlaWwoZmxvYXQoJHt0ZXhOYW1lfVNoYXBlWzFdKSAvIDIuMCkpO1xuICAgICAgdmVjMiB1diA9IHBhY2tlZFVWZnJvbTJEKHZhbHVlc1BlclJvdywgcGFja2VkVGV4U2hhcGVbMF0sIHBhY2tlZFRleFNoYXBlWzFdLCByb3csIGNvbCk7XG4gICAgICByZXR1cm4gJHtnbHNsLnRleHR1cmUyRH0oJHt0ZXhOYW1lfSwgdXYpO1xuICAgIH1cbiAgYDtcbiAgICB9XG4gICAgY29uc3QgcGFja2VkVGV4U2hhcGUgPSBbTWF0aC5jZWlsKHRleFNoYXBlWzBdIC8gMiksIE1hdGguY2VpbCh0ZXhTaGFwZVsxXSAvIDIpXTtcbiAgICBjb25zdCB2YWx1ZXNQZXJSb3cgPSBNYXRoLmNlaWwoc2hhcGVbMV0gLyAyKTtcbiAgICByZXR1cm4gYFxuICAgIHZlYzQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgdmVjMiB1diA9IHBhY2tlZFVWZnJvbTJEKCR7dmFsdWVzUGVyUm93fSwgJHtwYWNrZWRUZXhTaGFwZVswXX0sICR7cGFja2VkVGV4U2hhcGVbMV19LCByb3csIGNvbCk7XG4gICAgICByZXR1cm4gJHtnbHNsLnRleHR1cmUyRH0oJHt0ZXhOYW1lfSwgdXYpO1xuICAgIH1cbiAgYDtcbn1cbmZ1bmN0aW9uIGdldFNhbXBsZXIyRChpbnB1dEluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICBjb25zdCBzaGFwZSA9IGlucHV0SW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlO1xuICAgIGNvbnN0IHRleE5hbWUgPSBpbnB1dEluZm8ubmFtZTtcbiAgICBjb25zdCBmdW5jTmFtZSA9ICdnZXQnICsgdGV4TmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRleE5hbWUuc2xpY2UoMSk7XG4gICAgY29uc3QgdGV4U2hhcGUgPSBpbnB1dEluZm8uc2hhcGVJbmZvLnRleFNoYXBlO1xuICAgIGlmICh0ZXhTaGFwZSAhPSBudWxsICYmIHV0aWwuYXJyYXlzRXF1YWwoc2hhcGUsIHRleFNoYXBlKSkge1xuICAgICAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgICAgICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wpIHtcbiAgICAgICAgdmVjMiB1diA9ICh2ZWMyKGNvbCwgcm93KSArIGhhbGZDUikgLyB2ZWMyKCR7dGV4TmFtZX1UZXhTaGFwZVsxXSwgJHt0ZXhOYW1lfVRleFNoYXBlWzBdKTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGV4TnVtUiA9IHRleFNoYXBlWzBdO1xuICAgICAgICBjb25zdCB0ZXhOdW1DID0gdGV4U2hhcGVbMV07XG4gICAgICAgIHJldHVybiBgXG4gICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgdmVjMiB1diA9ICh2ZWMyKGNvbCwgcm93KSArIGhhbGZDUikgLyB2ZWMyKCR7dGV4TnVtQ30uMCwgJHt0ZXhOdW1SfS4wKTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG4gICAgfVxuICAgIGNvbnN0IHsgbmV3U2hhcGUsIGtlcHREaW1zIH0gPSB1dGlsLnNxdWVlemVTaGFwZShzaGFwZSk7XG4gICAgY29uc3Qgc3F1ZWV6ZWRTaGFwZSA9IG5ld1NoYXBlO1xuICAgIGlmIChzcXVlZXplZFNoYXBlLmxlbmd0aCA8IHNoYXBlLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBuZXdJbnB1dEluZm8gPSBzcXVlZXplSW5wdXRJbmZvKGlucHV0SW5mbywgc3F1ZWV6ZWRTaGFwZSk7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IFsncm93JywgJ2NvbCddO1xuICAgICAgICByZXR1cm4gYFxuICAgICAgJHtnZXRTYW1wbGVyRnJvbUluSW5mbyhuZXdJbnB1dEluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpfVxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgICByZXR1cm4gJHtmdW5jTmFtZX0oJHtnZXRTcXVlZXplZFBhcmFtcyhwYXJhbXMsIGtlcHREaW1zKX0pO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIGlmIChpbnB1dEluZm8uc2hhcGVJbmZvLmlzVW5pZm9ybSkge1xuICAgICAgICAvLyBVbmlmb3JtIGFycmF5cyB3aWxsIGJlIGxlc3MgdGhhbiA2NTUwNSAobm8gcmlzayBvZiBmbG9hdDE2IG92ZXJmbG93KS5cbiAgICAgICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wpIHtcbiAgICAgICAgaW50IGluZGV4ID0gcm91bmQoZG90KHZlYzIocm93LCBjb2wpLCB2ZWMyKCR7c2hhcGVbMV19LCAxKSkpO1xuICAgICAgICAke2dldFVuaWZvcm1TYW1wbGVyKGlucHV0SW5mbyl9XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG4gICAgY29uc3QgdGV4TnVtUiA9IHRleFNoYXBlWzBdO1xuICAgIGNvbnN0IHRleE51bUMgPSB0ZXhTaGFwZVsxXTtcbiAgICBjb25zdCBvZmZzZXQgPSBnZXRGbGF0T2Zmc2V0VW5pZm9ybU5hbWUodGV4TmFtZSk7XG4gICAgaWYgKHRleE51bUMgPT09IDEpIHtcbiAgICAgICAgLy8gaW5kZXggaXMgdXNlZCBkaXJlY3RseSBhcyBwaHlzaWNhbCAobm8gcmlzayBvZiBmbG9hdDE2IG92ZXJmbG93KS5cbiAgICAgICAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgICAgICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICAgIGZsb2F0IGluZGV4ID0gZG90KHZlYzMocm93LCBjb2wsICR7b2Zmc2V0fSksIHZlYzMoJHt0ZXhOYW1lfVNoYXBlWzFdLCAxLCAxKSk7XG4gICAgICAgIHZlYzIgdXYgPSB2ZWMyKDAuNSwgKGluZGV4ICsgMC41KSAvIGZsb2F0KCR7dGV4TmFtZX1UZXhTaGFwZVswXSkpO1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gICAgYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYFxuICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wpIHtcbiAgICAgIGZsb2F0IGluZGV4ID0gZG90KHZlYzMocm93LCBjb2wsICR7b2Zmc2V0fSksIHZlYzMoJHtzaGFwZVsxXX0sIDEsIDEpKTtcbiAgICAgIHZlYzIgdXYgPSB2ZWMyKDAuNSwgKGluZGV4ICsgMC41KSAvICR7dGV4TnVtUn0uMCk7XG4gICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgfVxuICBgO1xuICAgIH1cbiAgICBpZiAodGV4TnVtUiA9PT0gMSkge1xuICAgICAgICAvLyBpbmRleCBpcyB1c2VkIGRpcmVjdGx5IGFzIHBoeXNpY2FsIChubyByaXNrIG9mIGZsb2F0MTYgb3ZlcmZsb3cpLlxuICAgICAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgICAgICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wpIHtcbiAgICAgICAgZmxvYXQgaW5kZXggPSBkb3QodmVjMyhyb3csIGNvbCwgJHtvZmZzZXR9KSwgdmVjMygke3RleE5hbWV9U2hhcGVbMV0sIDEsIDEpKTtcbiAgICAgICAgdmVjMiB1diA9IHZlYzIoKGluZGV4ICsgMC41KSAvIGZsb2F0KCR7dGV4TmFtZX1UZXhTaGFwZVsxXSksIDAuNSk7XG4gICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICAgIH1cbiAgICBgO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgXG4gICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgZmxvYXQgaW5kZXggPSBkb3QodmVjMyhyb3csIGNvbCwgJHtvZmZzZXR9KSwgdmVjMygke3NoYXBlWzFdfSwgMSwgMSkpO1xuICAgICAgdmVjMiB1diA9IHZlYzIoKGluZGV4ICsgMC41KSAvICR7dGV4TnVtQ30uMCwgMC41KTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG4gICAgfVxuICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICAgIC8vIEV4cGxpY2l0bHkgdXNlIGludGVnZXIgb3BlcmF0aW9ucyBhcyBkb3QoKSBvbmx5IHdvcmtzIG9uIGZsb2F0cy5cbiAgICAgICAgaW50IGluZGV4ID0gcm93ICogJHt0ZXhOYW1lfVNoYXBlWzFdICsgY29sICsgJHtvZmZzZXR9O1xuICAgICAgICB2ZWMyIHV2ID0gdXZGcm9tRmxhdCgke3RleE5hbWV9VGV4U2hhcGVbMF0sICR7dGV4TmFtZX1UZXhTaGFwZVsxXSwgaW5kZXgpO1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG4gICAgcmV0dXJuIGBcbiAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgIC8vIEV4cGxpY2l0bHkgdXNlIGludGVnZXIgb3BlcmF0aW9ucyBhcyBkb3QoKSBvbmx5IHdvcmtzIG9uIGZsb2F0cy5cbiAgICBpbnQgaW5kZXggPSByb3cgKiAke3NoYXBlWzFdfSArIGNvbCArICR7b2Zmc2V0fTtcbiAgICB2ZWMyIHV2ID0gdXZGcm9tRmxhdCgke3RleE51bVJ9LCAke3RleE51bUN9LCBpbmRleCk7XG4gICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICB9XG5gO1xufVxuZnVuY3Rpb24gZ2V0UGFja2VkU2FtcGxlcjNEKGlucHV0SW5mbywgZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgIGNvbnN0IHNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby5sb2dpY2FsU2hhcGU7XG4gICAgY29uc3QgdGV4TmFtZSA9IGlucHV0SW5mby5uYW1lO1xuICAgIGNvbnN0IGZ1bmNOYW1lID0gJ2dldCcgKyB0ZXhOYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGV4TmFtZS5zbGljZSgxKTtcbiAgICBjb25zdCB0ZXhTaGFwZSA9IGlucHV0SW5mby5zaGFwZUluZm8udGV4U2hhcGU7XG4gICAgY29uc3QgcGFja2VkVGV4U2hhcGUgPSBbTWF0aC5jZWlsKHRleFNoYXBlWzBdIC8gMiksIE1hdGguY2VpbCh0ZXhTaGFwZVsxXSAvIDIpXTtcbiAgICBpZiAoc2hhcGVbMF0gPT09IDEpIHtcbiAgICAgICAgY29uc3Qgc3F1ZWV6ZWRTaGFwZSA9IHNoYXBlLnNsaWNlKDEpO1xuICAgICAgICBjb25zdCBrZXB0RGltcyA9IFsxLCAyXTtcbiAgICAgICAgY29uc3QgbmV3SW5wdXRJbmZvID0gc3F1ZWV6ZUlucHV0SW5mbyhpbnB1dEluZm8sIHNxdWVlemVkU2hhcGUpO1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBbJ2InLCAncm93JywgJ2NvbCddO1xuICAgICAgICByZXR1cm4gYFxuICAgICAgICAke2dldFBhY2tlZFNhbXBsZXJGcm9tSW5JbmZvKG5ld0lucHV0SW5mbywgZW5hYmxlU2hhcGVVbmlmb3Jtcyl9XG4gICAgICAgIHZlYzQgJHtmdW5jTmFtZX0oaW50IGIsIGludCByb3csIGludCBjb2wpIHtcbiAgICAgICAgICByZXR1cm4gJHtmdW5jTmFtZX0oJHtnZXRTcXVlZXplZFBhcmFtcyhwYXJhbXMsIGtlcHREaW1zKX0pO1xuICAgICAgICB9XG4gICAgICBgO1xuICAgIH1cbiAgICBjb25zdCBnbHNsID0gZ2V0R2xzbERpZmZlcmVuY2VzKCk7XG4gICAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgICAgcmV0dXJuIGBcbiAgICB2ZWM0ICR7ZnVuY05hbWV9KGludCBiLCBpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICBpdmVjMiBwYWNrZWRUZXhTaGFwZSA9IGl2ZWMyKGNlaWwoZmxvYXQoJHt0ZXhOYW1lfVRleFNoYXBlWzBdKSAvIDIuMCksIGNlaWwoZmxvYXQoJHt0ZXhOYW1lfVRleFNoYXBlWzFdKSAvIDIuMCkpO1xuICAgICAgaW50IHZhbHVlc1BlclJvdyA9IGludChjZWlsKGZsb2F0KCR7dGV4TmFtZX1TaGFwZVsyXSkgLyAyLjApKTtcbiAgICAgIGludCB0ZXhlbHNJbkJhdGNoID0gdmFsdWVzUGVyUm93ICogaW50KGNlaWwoZmxvYXQoJHt0ZXhOYW1lfVNoYXBlWzFdKSAvIDIuMCkpO1xuICAgICAgdmVjMiB1diA9IHBhY2tlZFVWZnJvbTNEKFxuICAgICAgICBwYWNrZWRUZXhTaGFwZVswXSwgcGFja2VkVGV4U2hhcGVbMV0sIHRleGVsc0luQmF0Y2gsIHZhbHVlc1BlclJvdywgYiwgcm93LCBjb2wpO1xuICAgICAgcmV0dXJuICR7Z2xzbC50ZXh0dXJlMkR9KCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG4gICAgfVxuICAgIGNvbnN0IHRleE51bVIgPSBwYWNrZWRUZXhTaGFwZVswXTtcbiAgICBjb25zdCB0ZXhOdW1DID0gcGFja2VkVGV4U2hhcGVbMV07XG4gICAgY29uc3QgdmFsdWVzUGVyUm93ID0gTWF0aC5jZWlsKHNoYXBlWzJdIC8gMik7XG4gICAgY29uc3QgdGV4ZWxzSW5CYXRjaCA9IHZhbHVlc1BlclJvdyAqIE1hdGguY2VpbChzaGFwZVsxXSAvIDIpO1xuICAgIHJldHVybiBgXG4gICAgdmVjNCAke2Z1bmNOYW1lfShpbnQgYiwgaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgdmVjMiB1diA9IHBhY2tlZFVWZnJvbTNEKFxuICAgICAgICAke3RleE51bVJ9LCAke3RleE51bUN9LCAke3RleGVsc0luQmF0Y2h9LCAke3ZhbHVlc1BlclJvd30sIGIsIHJvdywgY29sKTtcbiAgICAgIHJldHVybiAke2dsc2wudGV4dHVyZTJEfSgke3RleE5hbWV9LCB1dik7XG4gICAgfVxuICBgO1xufVxuZnVuY3Rpb24gZ2V0U2FtcGxlcjNEKGlucHV0SW5mbywgZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgIGNvbnN0IHNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby5sb2dpY2FsU2hhcGU7XG4gICAgY29uc3QgdGV4TmFtZSA9IGlucHV0SW5mby5uYW1lO1xuICAgIGNvbnN0IGZ1bmNOYW1lID0gJ2dldCcgKyB0ZXhOYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGV4TmFtZS5zbGljZSgxKTtcbiAgICBjb25zdCBzdHJpZGUwID0gc2hhcGVbMV0gKiBzaGFwZVsyXTtcbiAgICBjb25zdCBzdHJpZGUxID0gc2hhcGVbMl07XG4gICAgY29uc3QgeyBuZXdTaGFwZSwga2VwdERpbXMgfSA9IHV0aWwuc3F1ZWV6ZVNoYXBlKHNoYXBlKTtcbiAgICBjb25zdCBzcXVlZXplZFNoYXBlID0gbmV3U2hhcGU7XG4gICAgaWYgKHNxdWVlemVkU2hhcGUubGVuZ3RoIDwgc2hhcGUubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IG5ld0lucHV0SW5mbyA9IHNxdWVlemVJbnB1dEluZm8oaW5wdXRJbmZvLCBzcXVlZXplZFNoYXBlKTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gWydyb3cnLCAnY29sJywgJ2RlcHRoJ107XG4gICAgICAgIHJldHVybiBgXG4gICAgICAgICR7Z2V0U2FtcGxlckZyb21JbkluZm8obmV3SW5wdXRJbmZvLCBlbmFibGVTaGFwZVVuaWZvcm1zKX1cbiAgICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoKSB7XG4gICAgICAgICAgcmV0dXJuICR7ZnVuY05hbWV9KCR7Z2V0U3F1ZWV6ZWRQYXJhbXMocGFyYW1zLCBrZXB0RGltcyl9KTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgICB9XG4gICAgaWYgKGlucHV0SW5mby5zaGFwZUluZm8uaXNVbmlmb3JtKSB7XG4gICAgICAgIC8vIFVuaWZvcm0gYXJyYXlzIHdpbGwgYmUgbGVzcyB0aGFuIDY1NTA1IChubyByaXNrIG9mIGZsb2F0MTYgb3ZlcmZsb3cpLlxuICAgICAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoKSB7XG4gICAgICAgIGludCBpbmRleCA9IHJvdW5kKGRvdCh2ZWMzKHJvdywgY29sLCBkZXB0aCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzMoJHtzdHJpZGUwfSwgJHtzdHJpZGUxfSwgMSkpKTtcbiAgICAgICAgJHtnZXRVbmlmb3JtU2FtcGxlcihpbnB1dEluZm8pfVxuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIGNvbnN0IHRleFNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby50ZXhTaGFwZTtcbiAgICBjb25zdCB0ZXhOdW1SID0gdGV4U2hhcGVbMF07XG4gICAgY29uc3QgdGV4TnVtQyA9IHRleFNoYXBlWzFdO1xuICAgIGNvbnN0IGZsYXRPZmZzZXQgPSBpbnB1dEluZm8uc2hhcGVJbmZvLmZsYXRPZmZzZXQ7XG4gICAgaWYgKHRleE51bUMgPT09IHN0cmlkZTAgJiYgZmxhdE9mZnNldCA9PSBudWxsKSB7XG4gICAgICAgIC8vIHRleEMgaXMgdXNlZCBkaXJlY3RseSBhcyBwaHlzaWNhbCAobm8gcmlzayBvZiBmbG9hdDE2IG92ZXJmbG93KS5cbiAgICAgICAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgICAgICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgpIHtcbiAgICAgICAgaW50IHN0cmlkZTEgPSAke3RleE5hbWV9U2hhcGVbMl07XG4gICAgICAgIGZsb2F0IHRleFIgPSBmbG9hdChyb3cpO1xuICAgICAgICBmbG9hdCB0ZXhDID0gZG90KHZlYzIoY29sLCBkZXB0aCksIHZlYzIoc3RyaWRlMSwgMSkpO1xuICAgICAgICB2ZWMyIHV2ID0gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC9cbiAgICAgICAgICAgICAgICAgICB2ZWMyKCR7dGV4TmFtZX1UZXhTaGFwZVsxXSwgJHt0ZXhOYW1lfVRleFNoYXBlWzBdKTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGBcbiAgICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoKSB7XG4gICAgICAgICAgZmxvYXQgdGV4UiA9IGZsb2F0KHJvdyk7XG4gICAgICAgICAgZmxvYXQgdGV4QyA9IGRvdCh2ZWMyKGNvbCwgZGVwdGgpLCB2ZWMyKCR7c3RyaWRlMX0sIDEpKTtcbiAgICAgICAgICB2ZWMyIHV2ID0gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC9cbiAgICAgICAgICAgICAgICAgICAgIHZlYzIoJHt0ZXhOdW1DfS4wLCAke3RleE51bVJ9LjApO1xuICAgICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgICB9XG4gICAgaWYgKHRleE51bUMgPT09IHN0cmlkZTEgJiYgZmxhdE9mZnNldCA9PSBudWxsKSB7XG4gICAgICAgIC8vIHRleFIgaXMgdXNlZCBkaXJlY3RseSBhcyBwaHlzaWNhbCAobm8gcmlzayBvZiBmbG9hdDE2IG92ZXJmbG93KS5cbiAgICAgICAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgICAgICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgpIHtcbiAgICAgICAgZmxvYXQgdGV4UiA9IGRvdCh2ZWMyKHJvdywgY29sKSwgdmVjMigke3RleE5hbWV9U2hhcGVbMV0sIDEpKTtcbiAgICAgICAgZmxvYXQgdGV4QyA9IGZsb2F0KGRlcHRoKTtcbiAgICAgICAgdmVjMiB1diA9ICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvIHZlYzIoJHt0ZXhOYW1lfVRleFNoYXBlWzFdLCAke3RleE5hbWV9VGV4U2hhcGVbMF0pO1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gICAgYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYFxuICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCkge1xuICAgICAgZmxvYXQgdGV4UiA9IGRvdCh2ZWMyKHJvdywgY29sKSwgdmVjMigke3NoYXBlWzFdfSwgMSkpO1xuICAgICAgZmxvYXQgdGV4QyA9IGZsb2F0KGRlcHRoKTtcbiAgICAgIHZlYzIgdXYgPSAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgLyB2ZWMyKCR7dGV4TnVtQ30uMCwgJHt0ZXhOdW1SfS4wKTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG4gICAgfVxuICAgIGNvbnN0IG9mZnNldCA9IGdldEZsYXRPZmZzZXRVbmlmb3JtTmFtZSh0ZXhOYW1lKTtcbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgICByZXR1cm4gYFxuICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCkge1xuICAgICAgLy8gRXhwbGljaXRseSB1c2UgaW50ZWdlciBvcGVyYXRpb25zIGFzIGRvdCgpIG9ubHkgd29ya3Mgb24gZmxvYXRzLlxuICAgICAgaW50IHN0cmlkZTAgPSAke3RleE5hbWV9U2hhcGVbMV0gKiAke3RleE5hbWV9U2hhcGVbMl07XG4gICAgICBpbnQgc3RyaWRlMSA9ICR7dGV4TmFtZX1TaGFwZVsyXTtcbiAgICAgIGludCBpbmRleCA9IHJvdyAqICR7c3RyaWRlMH0gKyBjb2wgKiAke3N0cmlkZTF9ICsgZGVwdGggKyAke29mZnNldH07XG4gICAgICB2ZWMyIHV2ID0gdXZGcm9tRmxhdCgke3RleE5hbWV9VGV4U2hhcGVbMF0sICR7dGV4TmFtZX1UZXhTaGFwZVsxXSwgaW5kZXgpO1xuICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgIH1cbiAgICBgO1xuICAgIH1cbiAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoKSB7XG4gICAgICAgIC8vIEV4cGxpY2l0bHkgdXNlIGludGVnZXIgb3BlcmF0aW9ucyBhcyBkb3QoKSBvbmx5IHdvcmtzIG9uIGZsb2F0cy5cbiAgICAgICAgaW50IGluZGV4ID0gcm93ICogJHtzdHJpZGUwfSArIGNvbCAqICR7c3RyaWRlMX0gKyBkZXB0aCArICR7b2Zmc2V0fTtcbiAgICAgICAgdmVjMiB1diA9IHV2RnJvbUZsYXQoJHt0ZXhOdW1SfSwgJHt0ZXhOdW1DfSwgaW5kZXgpO1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gIGA7XG59XG5mdW5jdGlvbiBnZXRQYWNrZWRTYW1wbGVyTkQoaW5wdXRJbmZvLCBlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgY29uc3QgdGV4TmFtZSA9IGlucHV0SW5mby5uYW1lO1xuICAgIGNvbnN0IGZ1bmNOYW1lID0gJ2dldCcgKyB0ZXhOYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGV4TmFtZS5zbGljZSgxKTtcbiAgICBjb25zdCBnbHNsID0gZ2V0R2xzbERpZmZlcmVuY2VzKCk7XG4gICAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgICAgLy8gVE9ETzogc3VwcG9ydCA1ZCBhbmQgNmRcbiAgICAgICAgcmV0dXJuIGBcbiAgICB2ZWM0ICR7ZnVuY05hbWV9KGludCBiMiwgaW50IGIsIGludCByb3csIGludCBjb2wpIHtcbiAgICAgIGludCB2YWx1ZXNQZXJSb3cgPSBpbnQoY2VpbChmbG9hdCgke3RleE5hbWV9U2hhcGVbM10pIC8gMi4wKSk7XG4gICAgICBpbnQgdGV4ZWxzSW5CYXRjaCA9IHZhbHVlc1BlclJvdyAqIGludChjZWlsKGZsb2F0KCR7dGV4TmFtZX1TaGFwZVsyXSkgLyAyLjApKTtcbiAgICAgIGludCBpbmRleCA9IGIgKiB0ZXhlbHNJbkJhdGNoICsgKHJvdyAvIDIpICogdmFsdWVzUGVyUm93ICsgKGNvbCAvIDIpO1xuICAgICAgdGV4ZWxzSW5CYXRjaCAqPSAke3RleE5hbWV9U2hhcGVbMV07XG4gICAgICBpbmRleCA9IGIyICogdGV4ZWxzSW5CYXRjaCArIGluZGV4O1xuICAgICAgaXZlYzIgcGFja2VkVGV4U2hhcGUgPSBpdmVjMihjZWlsKGZsb2F0KCR7dGV4TmFtZX1UZXhTaGFwZVswXSkgLyAyLjApLCBjZWlsKGZsb2F0KCR7dGV4TmFtZX1UZXhTaGFwZVsxXSkgLyAyLjApKTtcbiAgICAgIGludCB0ZXhSID0gaW5kZXggLyBwYWNrZWRUZXhTaGFwZVsxXTtcbiAgICAgIGludCB0ZXhDID0gaW5kZXggLSB0ZXhSICogcGFja2VkVGV4U2hhcGVbMV07XG4gICAgICB2ZWMyIHV2ID0gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC8gdmVjMihwYWNrZWRUZXhTaGFwZVsxXSwgcGFja2VkVGV4U2hhcGVbMF0pOyByZXR1cm4gJHtnbHNsLnRleHR1cmUyRH0oJHt0ZXhOYW1lfSwgdXYpO1xuICAgIH1cbiAgYDtcbiAgICB9XG4gICAgY29uc3Qgc2hhcGUgPSBpbnB1dEluZm8uc2hhcGVJbmZvLmxvZ2ljYWxTaGFwZTtcbiAgICBjb25zdCByYW5rID0gc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IHRleFNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby50ZXhTaGFwZTtcbiAgICBjb25zdCBwYWNrZWRUZXhTaGFwZSA9IFtNYXRoLmNlaWwodGV4U2hhcGVbMF0gLyAyKSwgTWF0aC5jZWlsKHRleFNoYXBlWzFdIC8gMildO1xuICAgIGNvbnN0IHRleE51bVIgPSBwYWNrZWRUZXhTaGFwZVswXTtcbiAgICBjb25zdCB0ZXhOdW1DID0gcGFja2VkVGV4U2hhcGVbMV07XG4gICAgY29uc3QgdmFsdWVzUGVyUm93ID0gTWF0aC5jZWlsKHNoYXBlW3JhbmsgLSAxXSAvIDIpO1xuICAgIGxldCB0ZXhlbHNJbkJhdGNoID0gdmFsdWVzUGVyUm93ICogTWF0aC5jZWlsKHNoYXBlW3JhbmsgLSAyXSAvIDIpO1xuICAgIGxldCBwYXJhbXMgPSBgaW50IGIsIGludCByb3csIGludCBjb2xgO1xuICAgIGxldCBpbmRleCA9IGBiICogJHt0ZXhlbHNJbkJhdGNofSArIChyb3cgLyAyKSAqICR7dmFsdWVzUGVyUm93fSArIChjb2wgLyAyKWA7XG4gICAgZm9yIChsZXQgYiA9IDI7IGIgPCByYW5rIC0gMTsgYisrKSB7XG4gICAgICAgIHBhcmFtcyA9IGBpbnQgYiR7Yn0sIGAgKyBwYXJhbXM7XG4gICAgICAgIHRleGVsc0luQmF0Y2ggKj0gc2hhcGVbcmFuayAtIGIgLSAxXTtcbiAgICAgICAgaW5kZXggPSBgYiR7Yn0gKiAke3RleGVsc0luQmF0Y2h9ICsgYCArIGluZGV4O1xuICAgIH1cbiAgICByZXR1cm4gYFxuICAgIHZlYzQgJHtmdW5jTmFtZX0oJHtwYXJhbXN9KSB7XG4gICAgICBpbnQgaW5kZXggPSAke2luZGV4fTtcbiAgICAgIGludCB0ZXhSID0gaW5kZXggLyAke3RleE51bUN9O1xuICAgICAgaW50IHRleEMgPSBpbmRleCAtIHRleFIgKiAke3RleE51bUN9O1xuICAgICAgdmVjMiB1diA9ICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvIHZlYzIoJHt0ZXhOdW1DfSwgJHt0ZXhOdW1SfSk7XG4gICAgICByZXR1cm4gJHtnbHNsLnRleHR1cmUyRH0oJHt0ZXhOYW1lfSwgdXYpO1xuICAgIH1cbiAgYDtcbn1cbmZ1bmN0aW9uIGdldFNhbXBsZXI0RChpbnB1dEluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICBjb25zdCBzaGFwZSA9IGlucHV0SW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlO1xuICAgIGNvbnN0IHRleE5hbWUgPSBpbnB1dEluZm8ubmFtZTtcbiAgICBjb25zdCBmdW5jTmFtZSA9ICdnZXQnICsgdGV4TmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRleE5hbWUuc2xpY2UoMSk7XG4gICAgY29uc3Qgc3RyaWRlMiA9IHNoYXBlWzNdO1xuICAgIGNvbnN0IHN0cmlkZTEgPSBzaGFwZVsyXSAqIHN0cmlkZTI7XG4gICAgY29uc3Qgc3RyaWRlMCA9IHNoYXBlWzFdICogc3RyaWRlMTtcbiAgICBjb25zdCB7IG5ld1NoYXBlLCBrZXB0RGltcyB9ID0gdXRpbC5zcXVlZXplU2hhcGUoc2hhcGUpO1xuICAgIGlmIChuZXdTaGFwZS5sZW5ndGggPCBzaGFwZS5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgbmV3SW5wdXRJbmZvID0gc3F1ZWV6ZUlucHV0SW5mbyhpbnB1dEluZm8sIG5ld1NoYXBlKTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gWydyb3cnLCAnY29sJywgJ2RlcHRoJywgJ2RlcHRoMiddO1xuICAgICAgICByZXR1cm4gYFxuICAgICAgJHtnZXRTYW1wbGVyRnJvbUluSW5mbyhuZXdJbnB1dEluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpfVxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLCBpbnQgZGVwdGgyKSB7XG4gICAgICAgIHJldHVybiAke2Z1bmNOYW1lfSgke2dldFNxdWVlemVkUGFyYW1zKHBhcmFtcywga2VwdERpbXMpfSk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG4gICAgaWYgKGlucHV0SW5mby5zaGFwZUluZm8uaXNVbmlmb3JtKSB7XG4gICAgICAgIC8vIFVuaWZvcm0gYXJyYXlzIHdpbGwgYmUgbGVzcyB0aGFuIDY1NTA1IChubyByaXNrIG9mIGZsb2F0MTYgb3ZlcmZsb3cpLlxuICAgICAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLCBpbnQgZGVwdGgyKSB7XG4gICAgICAgIGludCBpbmRleCA9IHJvdW5kKGRvdCh2ZWM0KHJvdywgY29sLCBkZXB0aCwgZGVwdGgyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjNCgke3N0cmlkZTB9LCAke3N0cmlkZTF9LCAke3N0cmlkZTJ9LCAxKSkpO1xuICAgICAgICAke2dldFVuaWZvcm1TYW1wbGVyKGlucHV0SW5mbyl9XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG4gICAgY29uc3QgZmxhdE9mZnNldCA9IGlucHV0SW5mby5zaGFwZUluZm8uZmxhdE9mZnNldDtcbiAgICBjb25zdCB0ZXhTaGFwZSA9IGlucHV0SW5mby5zaGFwZUluZm8udGV4U2hhcGU7XG4gICAgY29uc3QgdGV4TnVtUiA9IHRleFNoYXBlWzBdO1xuICAgIGNvbnN0IHRleE51bUMgPSB0ZXhTaGFwZVsxXTtcbiAgICBjb25zdCBzdHJpZGUyU3RyID0gYGludCBzdHJpZGUyID0gJHt0ZXhOYW1lfVNoYXBlWzNdO2A7XG4gICAgY29uc3Qgc3RyaWRlMVN0ciA9IGBpbnQgc3RyaWRlMSA9ICR7dGV4TmFtZX1TaGFwZVsyXSAqIHN0cmlkZTI7YDtcbiAgICBjb25zdCBzdHJpZGUwU3RyID0gYGludCBzdHJpZGUwID0gJHt0ZXhOYW1lfVNoYXBlWzFdICogc3RyaWRlMTtgO1xuICAgIGlmICh0ZXhOdW1DID09PSBzdHJpZGUwICYmIGZsYXRPZmZzZXQgPT0gbnVsbCkge1xuICAgICAgICAvLyB0ZXhDIGlzIHVzZWQgZGlyZWN0bHkgYXMgcGh5c2ljYWwgKG5vIHJpc2sgb2YgZmxvYXQxNiBvdmVyZmxvdykuXG4gICAgICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICAgICAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLCBpbnQgZGVwdGgyKSB7XG4gICAgICAgICR7c3RyaWRlMlN0cn1cbiAgICAgICAgJHtzdHJpZGUxU3RyfVxuICAgICAgICBmbG9hdCB0ZXhSID0gZmxvYXQocm93KTtcbiAgICAgICAgZmxvYXQgdGV4QyA9XG4gICAgICAgICAgICBkb3QodmVjMyhjb2wsIGRlcHRoLCBkZXB0aDIpLFxuICAgICAgICAgICAgICAgIHZlYzMoc3RyaWRlMSwgc3RyaWRlMiwgMSkpO1xuICAgICAgICB2ZWMyIHV2ID0gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC9cbiAgICAgICAgICAgICAgICAgICB2ZWMyKCR7dGV4TmFtZX1UZXhTaGFwZVsxXSwgJHt0ZXhOYW1lfVRleFNoYXBlWzBdKTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCwgaW50IGRlcHRoMikge1xuICAgICAgICBmbG9hdCB0ZXhSID0gZmxvYXQocm93KTtcbiAgICAgICAgZmxvYXQgdGV4QyA9XG4gICAgICAgICAgICBkb3QodmVjMyhjb2wsIGRlcHRoLCBkZXB0aDIpLFxuICAgICAgICAgICAgICAgIHZlYzMoJHtzdHJpZGUxfSwgJHtzdHJpZGUyfSwgMSkpO1xuICAgICAgICB2ZWMyIHV2ID0gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC9cbiAgICAgICAgICAgICAgICAgICB2ZWMyKCR7dGV4TnVtQ30uMCwgJHt0ZXhOdW1SfS4wKTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIGlmICh0ZXhOdW1DID09PSBzdHJpZGUyICYmIGZsYXRPZmZzZXQgPT0gbnVsbCkge1xuICAgICAgICAvLyB0ZXhSIGlzIHVzZWQgZGlyZWN0bHkgYXMgcGh5c2ljYWwgKG5vIHJpc2sgb2YgZmxvYXQxNiBvdmVyZmxvdykuXG4gICAgICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICAgICAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLCBpbnQgZGVwdGgyKSB7XG4gICAgICAgIGZsb2F0IHRleFIgPSBkb3QodmVjMyhyb3csIGNvbCwgZGVwdGgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzMoJHt0ZXhOYW1lfVNoYXBlWzFdICogJHt0ZXhOYW1lfVNoYXBlWzJdLCAke3RleE5hbWV9U2hhcGVbMl0sIDEpKTtcbiAgICAgICAgZmxvYXQgdGV4QyA9IGZsb2F0KGRlcHRoMik7XG4gICAgICAgIHZlYzIgdXYgPSAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgL1xuICAgICAgICAgICAgICAgICAgdmVjMigke3RleE5hbWV9VGV4U2hhcGVbMV0sICR7dGV4TmFtZX1UZXhTaGFwZVswXSk7XG4gICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICAgIH1cbiAgICBgO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsIGludCBkZXB0aDIpIHtcbiAgICAgICAgZmxvYXQgdGV4UiA9IGRvdCh2ZWMzKHJvdywgY29sLCBkZXB0aCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgdmVjMygke3NoYXBlWzFdICogc2hhcGVbMl19LCAke3NoYXBlWzJdfSwgMSkpO1xuICAgICAgICBmbG9hdCB0ZXhDID0gZmxvYXQoZGVwdGgyKTtcbiAgICAgICAgdmVjMiB1diA9ICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvXG4gICAgICAgICAgICAgICAgICB2ZWMyKCR7dGV4TnVtQ30uMCwgJHt0ZXhOdW1SfS4wKTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIGNvbnN0IG9mZnNldCA9IGdldEZsYXRPZmZzZXRVbmlmb3JtTmFtZSh0ZXhOYW1lKTtcbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgICByZXR1cm4gYFxuICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCwgaW50IGRlcHRoMikge1xuICAgICAgLy8gRXhwbGljaXRseSB1c2UgaW50ZWdlciBvcGVyYXRpb25zIGFzIGRvdCgpIG9ubHkgd29ya3Mgb24gZmxvYXRzLlxuICAgICAgJHtzdHJpZGUyU3RyfVxuICAgICAgJHtzdHJpZGUxU3RyfVxuICAgICAgJHtzdHJpZGUwU3RyfVxuICAgICAgaW50IGluZGV4ID0gcm93ICogc3RyaWRlMCArIGNvbCAqIHN0cmlkZTEgK1xuICAgICAgICAgIGRlcHRoICogc3RyaWRlMiArIGRlcHRoMjtcbiAgICAgIHZlYzIgdXYgPSB1dkZyb21GbGF0KCR7dGV4TmFtZX1UZXhTaGFwZVswXSwgJHt0ZXhOYW1lfVRleFNoYXBlWzFdLCBpbmRleCArICR7b2Zmc2V0fSk7XG4gICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgfVxuICBgO1xuICAgIH1cbiAgICByZXR1cm4gYFxuICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCwgaW50IGRlcHRoMikge1xuICAgICAgLy8gRXhwbGljaXRseSB1c2UgaW50ZWdlciBvcGVyYXRpb25zIGFzIGRvdCgpIG9ubHkgd29ya3Mgb24gZmxvYXRzLlxuICAgICAgaW50IGluZGV4ID0gcm93ICogJHtzdHJpZGUwfSArIGNvbCAqICR7c3RyaWRlMX0gK1xuICAgICAgICAgIGRlcHRoICogJHtzdHJpZGUyfSArIGRlcHRoMjtcbiAgICAgIHZlYzIgdXYgPSB1dkZyb21GbGF0KCR7dGV4TnVtUn0sICR7dGV4TnVtQ30sIGluZGV4ICsgJHtvZmZzZXR9KTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG59XG5mdW5jdGlvbiBnZXRTYW1wbGVyNUQoaW5wdXRJbmZvKSB7XG4gICAgY29uc3Qgc2hhcGUgPSBpbnB1dEluZm8uc2hhcGVJbmZvLmxvZ2ljYWxTaGFwZTtcbiAgICBjb25zdCB0ZXhOYW1lID0gaW5wdXRJbmZvLm5hbWU7XG4gICAgY29uc3QgZnVuY05hbWUgPSAnZ2V0JyArIHRleE5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0ZXhOYW1lLnNsaWNlKDEpO1xuICAgIGNvbnN0IHN0cmlkZTMgPSBzaGFwZVs0XTtcbiAgICBjb25zdCBzdHJpZGUyID0gc2hhcGVbM10gKiBzdHJpZGUzO1xuICAgIGNvbnN0IHN0cmlkZTEgPSBzaGFwZVsyXSAqIHN0cmlkZTI7XG4gICAgY29uc3Qgc3RyaWRlMCA9IHNoYXBlWzFdICogc3RyaWRlMTtcbiAgICBjb25zdCB7IG5ld1NoYXBlLCBrZXB0RGltcyB9ID0gdXRpbC5zcXVlZXplU2hhcGUoc2hhcGUpO1xuICAgIGlmIChuZXdTaGFwZS5sZW5ndGggPCBzaGFwZS5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgbmV3SW5wdXRJbmZvID0gc3F1ZWV6ZUlucHV0SW5mbyhpbnB1dEluZm8sIG5ld1NoYXBlKTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gWydyb3cnLCAnY29sJywgJ2RlcHRoJywgJ2RlcHRoMicsICdkZXB0aDMnXTtcbiAgICAgICAgcmV0dXJuIGBcbiAgICAgICR7Z2V0U2FtcGxlckZyb21JbkluZm8obmV3SW5wdXRJbmZvKX1cbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCwgaW50IGRlcHRoMiwgaW50IGRlcHRoMykge1xuICAgICAgICByZXR1cm4gJHtmdW5jTmFtZX0oJHtnZXRTcXVlZXplZFBhcmFtcyhwYXJhbXMsIGtlcHREaW1zKX0pO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIGlmIChpbnB1dEluZm8uc2hhcGVJbmZvLmlzVW5pZm9ybSkge1xuICAgICAgICAvLyBVbmlmb3JtIGFycmF5cyB3aWxsIGJlIGxlc3MgdGhhbiA2NTUwNSAobm8gcmlzayBvZiBmbG9hdDE2IG92ZXJmbG93KS5cbiAgICAgICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCwgaW50IGRlcHRoMiwgaW50IGRlcHRoMykge1xuICAgICAgICBmbG9hdCBpbmRleCA9IGRvdChcbiAgICAgICAgICB2ZWM0KHJvdywgY29sLCBkZXB0aCwgZGVwdGgyKSxcbiAgICAgICAgICB2ZWM0KCR7c3RyaWRlMH0sICR7c3RyaWRlMX0sICR7c3RyaWRlMn0sICR7c3RyaWRlM30pKSArXG4gICAgICAgICAgZGVwdGgzO1xuICAgICAgICAke2dldFVuaWZvcm1TYW1wbGVyKGlucHV0SW5mbyl9XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG4gICAgY29uc3QgZmxhdE9mZnNldCA9IGlucHV0SW5mby5zaGFwZUluZm8uZmxhdE9mZnNldDtcbiAgICBjb25zdCB0ZXhTaGFwZSA9IGlucHV0SW5mby5zaGFwZUluZm8udGV4U2hhcGU7XG4gICAgY29uc3QgdGV4TnVtUiA9IHRleFNoYXBlWzBdO1xuICAgIGNvbnN0IHRleE51bUMgPSB0ZXhTaGFwZVsxXTtcbiAgICBpZiAodGV4TnVtQyA9PT0gc3RyaWRlMCAmJiBmbGF0T2Zmc2V0ID09IG51bGwpIHtcbiAgICAgICAgLy8gdGV4QyBpcyB1c2VkIGRpcmVjdGx5IGFzIHBoeXNpY2FsIChubyByaXNrIG9mIGZsb2F0MTYgb3ZlcmZsb3cpLlxuICAgICAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLCBpbnQgZGVwdGgyLCBpbnQgZGVwdGgzKSB7XG4gICAgICAgIGludCB0ZXhSID0gcm93O1xuICAgICAgICBmbG9hdCB0ZXhDID0gZG90KHZlYzQoY29sLCBkZXB0aCwgZGVwdGgyLCBkZXB0aDMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzQoJHtzdHJpZGUxfSwgJHtzdHJpZGUyfSwgJHtzdHJpZGUzfSwgMSkpO1xuICAgICAgICB2ZWMyIHV2ID0gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC9cbiAgICAgICAgICAgICAgICAgICB2ZWMyKCR7dGV4TnVtQ30uMCwgJHt0ZXhOdW1SfS4wKTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIGlmICh0ZXhOdW1DID09PSBzdHJpZGUzICYmIGZsYXRPZmZzZXQgPT0gbnVsbCkge1xuICAgICAgICAvLyB0ZXhSIGlzIHVzZWQgZGlyZWN0bHkgYXMgcGh5c2ljYWwgKG5vIHJpc2sgb2YgZmxvYXQxNiBvdmVyZmxvdykuXG4gICAgICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsIGludCBkZXB0aDIsIGludCBkZXB0aDMpIHtcbiAgICAgICAgZmxvYXQgdGV4UiA9IGRvdChcbiAgICAgICAgICB2ZWM0KHJvdywgY29sLCBkZXB0aCwgZGVwdGgyKSxcbiAgICAgICAgICB2ZWM0KCR7c2hhcGVbMV0gKiBzaGFwZVsyXSAqIHNoYXBlWzNdfSxcbiAgICAgICAgICAgICAgICR7c2hhcGVbMl0gKiBzaGFwZVszXX0sICR7c2hhcGVbM119LCAxKSk7XG4gICAgICAgIGludCB0ZXhDID0gZGVwdGgzO1xuICAgICAgICB2ZWMyIHV2ID0gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC9cbiAgICAgICAgICAgICAgICAgIHZlYzIoJHt0ZXhOdW1DfS4wLCAke3RleE51bVJ9LjApO1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG4gICAgY29uc3Qgb2Zmc2V0ID0gZ2V0RmxhdE9mZnNldFVuaWZvcm1OYW1lKHRleE5hbWUpO1xuICAgIHJldHVybiBgXG4gICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLCBpbnQgZGVwdGgyLCBpbnQgZGVwdGgzKSB7XG4gICAgICAvLyBFeHBsaWNpdGx5IHVzZSBpbnRlZ2VyIG9wZXJhdGlvbnMgYXMgZG90KCkgb25seSB3b3JrcyBvbiBmbG9hdHMuXG4gICAgICBpbnQgaW5kZXggPSByb3cgKiAke3N0cmlkZTB9ICsgY29sICogJHtzdHJpZGUxfSArIGRlcHRoICogJHtzdHJpZGUyfSArXG4gICAgICAgICAgZGVwdGgyICogJHtzdHJpZGUzfSArIGRlcHRoMyArICR7b2Zmc2V0fTtcbiAgICAgIHZlYzIgdXYgPSB1dkZyb21GbGF0KCR7dGV4TnVtUn0sICR7dGV4TnVtQ30sIGluZGV4KTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG59XG5mdW5jdGlvbiBnZXRTYW1wbGVyNkQoaW5wdXRJbmZvKSB7XG4gICAgY29uc3Qgc2hhcGUgPSBpbnB1dEluZm8uc2hhcGVJbmZvLmxvZ2ljYWxTaGFwZTtcbiAgICBjb25zdCB0ZXhOYW1lID0gaW5wdXRJbmZvLm5hbWU7XG4gICAgY29uc3QgZnVuY05hbWUgPSAnZ2V0JyArIHRleE5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0ZXhOYW1lLnNsaWNlKDEpO1xuICAgIGNvbnN0IHsgbmV3U2hhcGUsIGtlcHREaW1zIH0gPSB1dGlsLnNxdWVlemVTaGFwZShzaGFwZSk7XG4gICAgaWYgKG5ld1NoYXBlLmxlbmd0aCA8IHNoYXBlLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBuZXdJbnB1dEluZm8gPSBzcXVlZXplSW5wdXRJbmZvKGlucHV0SW5mbywgbmV3U2hhcGUpO1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBbJ3JvdycsICdjb2wnLCAnZGVwdGgnLCAnZGVwdGgyJywgJ2RlcHRoMycsICdkZXB0aDQnXTtcbiAgICAgICAgcmV0dXJuIGBcbiAgICAgICR7Z2V0U2FtcGxlckZyb21JbkluZm8obmV3SW5wdXRJbmZvKX1cbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCxcbiAgICAgICAgICAgICAgICAgICAgaW50IGRlcHRoMiwgaW50IGRlcHRoMywgaW50IGRlcHRoNCkge1xuICAgICAgICByZXR1cm4gJHtmdW5jTmFtZX0oJHtnZXRTcXVlZXplZFBhcmFtcyhwYXJhbXMsIGtlcHREaW1zKX0pO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIGNvbnN0IHN0cmlkZTQgPSBzaGFwZVs1XTtcbiAgICBjb25zdCBzdHJpZGUzID0gc2hhcGVbNF0gKiBzdHJpZGU0O1xuICAgIGNvbnN0IHN0cmlkZTIgPSBzaGFwZVszXSAqIHN0cmlkZTM7XG4gICAgY29uc3Qgc3RyaWRlMSA9IHNoYXBlWzJdICogc3RyaWRlMjtcbiAgICBjb25zdCBzdHJpZGUwID0gc2hhcGVbMV0gKiBzdHJpZGUxO1xuICAgIGlmIChpbnB1dEluZm8uc2hhcGVJbmZvLmlzVW5pZm9ybSkge1xuICAgICAgICAvLyBVbmlmb3JtIGFycmF5cyB3aWxsIGJlIGxlc3MgdGhhbiA2NTUwNSAobm8gcmlzayBvZiBmbG9hdDE2IG92ZXJmbG93KS5cbiAgICAgICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCxcbiAgICAgICAgICAgICAgICAgIGludCBkZXB0aDIsIGludCBkZXB0aDMsIGludCBkZXB0aDQpIHtcbiAgICAgICAgaW50IGluZGV4ID0gcm91bmQoZG90KFxuICAgICAgICAgIHZlYzQocm93LCBjb2wsIGRlcHRoLCBkZXB0aDIpLFxuICAgICAgICAgIHZlYzQoJHtzdHJpZGUwfSwgJHtzdHJpZGUxfSwgJHtzdHJpZGUyfSwgJHtzdHJpZGUzfSkpICtcbiAgICAgICAgICBkb3QoXG4gICAgICAgICAgICB2ZWMyKGRlcHRoMywgZGVwdGg0KSxcbiAgICAgICAgICAgIHZlYzIoJHtzdHJpZGU0fSwgMSkpKTtcbiAgICAgICAgJHtnZXRVbmlmb3JtU2FtcGxlcihpbnB1dEluZm8pfVxuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIGNvbnN0IGZsYXRPZmZzZXQgPSBpbnB1dEluZm8uc2hhcGVJbmZvLmZsYXRPZmZzZXQ7XG4gICAgY29uc3QgdGV4U2hhcGUgPSBpbnB1dEluZm8uc2hhcGVJbmZvLnRleFNoYXBlO1xuICAgIGNvbnN0IHRleE51bVIgPSB0ZXhTaGFwZVswXTtcbiAgICBjb25zdCB0ZXhOdW1DID0gdGV4U2hhcGVbMV07XG4gICAgaWYgKHRleE51bUMgPT09IHN0cmlkZTAgJiYgZmxhdE9mZnNldCA9PSBudWxsKSB7XG4gICAgICAgIC8vIHRleEMgaXMgdXNlZCBkaXJlY3RseSBhcyBwaHlzaWNhbCAobm8gcmlzayBvZiBmbG9hdDE2IG92ZXJmbG93KS5cbiAgICAgICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCxcbiAgICAgICAgICAgICAgICAgICAgaW50IGRlcHRoMiwgaW50IGRlcHRoMywgaW50IGRlcHRoNCkge1xuICAgICAgICBpbnQgdGV4UiA9IHJvdztcbiAgICAgICAgZmxvYXQgdGV4QyA9IGRvdCh2ZWM0KGNvbCwgZGVwdGgsIGRlcHRoMiwgZGVwdGgzKSxcbiAgICAgICAgICB2ZWM0KCR7c3RyaWRlMX0sICR7c3RyaWRlMn0sICR7c3RyaWRlM30sICR7c3RyaWRlNH0pKSArXG4gICAgICAgICAgICAgICBmbG9hdChkZXB0aDQpO1xuICAgICAgICB2ZWMyIHV2ID0gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC9cbiAgICAgICAgICAgICAgICAgICB2ZWMyKCR7dGV4TnVtQ30uMCwgJHt0ZXhOdW1SfS4wKTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIGlmICh0ZXhOdW1DID09PSBzdHJpZGU0ICYmIGZsYXRPZmZzZXQgPT0gbnVsbCkge1xuICAgICAgICAvLyB0ZXhSIGlzIHVzZWQgZGlyZWN0bHkgYXMgcGh5c2ljYWwgKG5vIHJpc2sgb2YgZmxvYXQxNiBvdmVyZmxvdykuXG4gICAgICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsXG4gICAgICAgICAgICAgICAgICAgIGludCBkZXB0aDIsIGludCBkZXB0aDMsIGludCBkZXB0aDQpIHtcbiAgICAgICAgZmxvYXQgdGV4UiA9IGRvdCh2ZWM0KHJvdywgY29sLCBkZXB0aCwgZGVwdGgyKSxcbiAgICAgICAgICB2ZWM0KCR7c2hhcGVbMV0gKiBzaGFwZVsyXSAqIHNoYXBlWzNdICogc2hhcGVbNF19LFxuICAgICAgICAgICAgICAgJHtzaGFwZVsyXSAqIHNoYXBlWzNdICogc2hhcGVbNF19LFxuICAgICAgICAgICAgICAgJHtzaGFwZVszXSAqIHNoYXBlWzRdfSxcbiAgICAgICAgICAgICAgICR7c2hhcGVbNF19KSkgKyBmbG9hdChkZXB0aDMpO1xuICAgICAgICBpbnQgdGV4QyA9IGRlcHRoNDtcbiAgICAgICAgdmVjMiB1diA9ICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvXG4gICAgICAgICAgICAgICAgICB2ZWMyKCR7dGV4TnVtQ30uMCwgJHt0ZXhOdW1SfS4wKTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIGNvbnN0IG9mZnNldCA9IGdldEZsYXRPZmZzZXRVbmlmb3JtTmFtZSh0ZXhOYW1lKTtcbiAgICByZXR1cm4gYFxuICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCxcbiAgICAgICAgICAgICAgICAgIGludCBkZXB0aDIsIGludCBkZXB0aDMsIGludCBkZXB0aDQpIHtcbiAgICAgIC8vIEV4cGxpY2l0bHkgdXNlIGludGVnZXIgb3BlcmF0aW9ucyBhcyBkb3QoKSBvbmx5IHdvcmtzIG9uIGZsb2F0cy5cbiAgICAgIGludCBpbmRleCA9IHJvdyAqICR7c3RyaWRlMH0gKyBjb2wgKiAke3N0cmlkZTF9ICsgZGVwdGggKiAke3N0cmlkZTJ9ICtcbiAgICAgICAgICBkZXB0aDIgKiAke3N0cmlkZTN9ICsgZGVwdGgzICogJHtzdHJpZGU0fSArIGRlcHRoNCArICR7b2Zmc2V0fTtcbiAgICAgIHZlYzIgdXYgPSB1dkZyb21GbGF0KCR7dGV4TnVtUn0sICR7dGV4TnVtQ30sIGluZGV4KTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG59XG5mdW5jdGlvbiBnZXRVbmlmb3JtU2FtcGxlcihpbnB1dEluZm8pIHtcbiAgICBjb25zdCB0ZXhOYW1lID0gaW5wdXRJbmZvLm5hbWU7XG4gICAgY29uc3QgaW5TaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKGlucHV0SW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlKTtcbiAgICBpZiAoaW5TaXplIDwgMikge1xuICAgICAgICByZXR1cm4gYHJldHVybiAke3RleE5hbWV9O2A7XG4gICAgfVxuICAgIHJldHVybiBgXG4gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAke2luU2l6ZX07IGkrKykge1xuICAgICAgaWYgKGkgPT0gaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuICR7dGV4TmFtZX1baV07XG4gICAgICB9XG4gICAgfVxuICBgO1xufVxuZnVuY3Rpb24gZ2V0UGFja2VkU2FtcGxlckF0T3V0cHV0Q29vcmRzKGlucHV0SW5mbywgb3V0U2hhcGVJbmZvKSB7XG4gICAgY29uc3QgdGV4TmFtZSA9IGlucHV0SW5mby5uYW1lO1xuICAgIGNvbnN0IHRleEZ1bmNTbmlwcGV0ID0gdGV4TmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRleE5hbWUuc2xpY2UoMSk7XG4gICAgY29uc3QgZnVuY05hbWUgPSAnZ2V0JyArIHRleEZ1bmNTbmlwcGV0ICsgJ0F0T3V0Q29vcmRzJztcbiAgICBjb25zdCBpblJhbmsgPSBpbnB1dEluZm8uc2hhcGVJbmZvLmxvZ2ljYWxTaGFwZS5sZW5ndGg7XG4gICAgY29uc3Qgb3V0UmFuayA9IG91dFNoYXBlSW5mby5sb2dpY2FsU2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IGJyb2FkY2FzdERpbXMgPSBnZXRCcm9hZGNhc3REaW1zKGlucHV0SW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlLCBvdXRTaGFwZUluZm8ubG9naWNhbFNoYXBlKTtcbiAgICBjb25zdCB0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUob3V0UmFuayk7XG4gICAgY29uc3QgcmFua0RpZmYgPSBvdXRSYW5rIC0gaW5SYW5rO1xuICAgIGxldCBjb29yZHNTbmlwcGV0O1xuICAgIGNvbnN0IGZpZWxkcyA9IFsneCcsICd5JywgJ3onLCAndycsICd1JywgJ3YnXTtcbiAgICBpZiAoaW5SYW5rID09PSAwKSB7XG4gICAgICAgIGNvb3Jkc1NuaXBwZXQgPSAnJztcbiAgICB9XG4gICAgZWxzZSBpZiAob3V0UmFuayA8IDIgJiYgYnJvYWRjYXN0RGltcy5sZW5ndGggPj0gMSkge1xuICAgICAgICBjb29yZHNTbmlwcGV0ID0gJ2Nvb3JkcyA9IDA7JztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvb3Jkc1NuaXBwZXQgPVxuICAgICAgICAgICAgYnJvYWRjYXN0RGltcy5tYXAoZCA9PiBgY29vcmRzLiR7ZmllbGRzW2QgKyByYW5rRGlmZl19ID0gMDtgKVxuICAgICAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcbiAgICB9XG4gICAgbGV0IHVucGFja2VkQ29vcmRzU25pcHBldCA9ICcnO1xuICAgIGlmIChvdXRSYW5rIDwgMiAmJiBpblJhbmsgPiAwKSB7XG4gICAgICAgIHVucGFja2VkQ29vcmRzU25pcHBldCA9ICdjb29yZHMnO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdW5wYWNrZWRDb29yZHNTbmlwcGV0ID0gaW5wdXRJbmZvLnNoYXBlSW5mby5sb2dpY2FsU2hhcGVcbiAgICAgICAgICAgIC5tYXAoKHMsIGkpID0+IGBjb29yZHMuJHtmaWVsZHNbaSArIHJhbmtEaWZmXX1gKVxuICAgICAgICAgICAgLmpvaW4oJywgJyk7XG4gICAgfVxuICAgIGxldCBvdXRwdXQgPSBgcmV0dXJuIG91dHB1dFZhbHVlO2A7XG4gICAgY29uc3QgaW5TaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKGlucHV0SW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlKTtcbiAgICBjb25zdCBpc0lucHV0U2NhbGFyID0gaW5TaXplID09PSAxO1xuICAgIGNvbnN0IG91dFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUob3V0U2hhcGVJbmZvLmxvZ2ljYWxTaGFwZSk7XG4gICAgY29uc3QgaXNPdXRwdXRTY2FsYXIgPSBvdXRTaXplID09PSAxO1xuICAgIGlmIChpblJhbmsgPT09IDEgJiYgIWlzSW5wdXRTY2FsYXIgJiYgIWlzT3V0cHV0U2NhbGFyKSB7XG4gICAgICAgIG91dHB1dCA9IGBcbiAgICAgIHJldHVybiB2ZWM0KG91dHB1dFZhbHVlLnh5LCBvdXRwdXRWYWx1ZS54eSk7XG4gICAgYDtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNJbnB1dFNjYWxhciAmJiAhaXNPdXRwdXRTY2FsYXIpIHtcbiAgICAgICAgaWYgKG91dFJhbmsgPT09IDEpIHtcbiAgICAgICAgICAgIG91dHB1dCA9IGBcbiAgICAgICAgcmV0dXJuIHZlYzQob3V0cHV0VmFsdWUueCwgb3V0cHV0VmFsdWUueCwgMC4sIDAuKTtcbiAgICAgIGA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvdXRwdXQgPSBgXG4gICAgICAgIHJldHVybiB2ZWM0KG91dHB1dFZhbHVlLngpO1xuICAgICAgYDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChicm9hZGNhc3REaW1zLmxlbmd0aCkge1xuICAgICAgICBjb25zdCByb3dzID0gaW5SYW5rIC0gMjtcbiAgICAgICAgY29uc3QgY29scyA9IGluUmFuayAtIDE7XG4gICAgICAgIGlmIChicm9hZGNhc3REaW1zLmluZGV4T2Yocm93cykgPiAtMSAmJiBicm9hZGNhc3REaW1zLmluZGV4T2YoY29scykgPiAtMSkge1xuICAgICAgICAgICAgb3V0cHV0ID0gYHJldHVybiB2ZWM0KG91dHB1dFZhbHVlLngpO2A7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYnJvYWRjYXN0RGltcy5pbmRleE9mKHJvd3MpID4gLTEpIHtcbiAgICAgICAgICAgIG91dHB1dCA9IGByZXR1cm4gdmVjNChvdXRwdXRWYWx1ZS54LCBvdXRwdXRWYWx1ZS55LCBgICtcbiAgICAgICAgICAgICAgICBgb3V0cHV0VmFsdWUueCwgb3V0cHV0VmFsdWUueSk7YDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChicm9hZGNhc3REaW1zLmluZGV4T2YoY29scykgPiAtMSkge1xuICAgICAgICAgICAgb3V0cHV0ID0gYHJldHVybiB2ZWM0KG91dHB1dFZhbHVlLnh4LCBvdXRwdXRWYWx1ZS56eik7YDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYFxuICAgIHZlYzQgJHtmdW5jTmFtZX0oKSB7XG4gICAgICAke3R5cGV9IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgJHtjb29yZHNTbmlwcGV0fVxuICAgICAgdmVjNCBvdXRwdXRWYWx1ZSA9IGdldCR7dGV4RnVuY1NuaXBwZXR9KCR7dW5wYWNrZWRDb29yZHNTbmlwcGV0fSk7XG4gICAgICAke291dHB1dH1cbiAgICB9XG4gIGA7XG59XG5mdW5jdGlvbiBnZXRTYW1wbGVyQXRPdXRwdXRDb29yZHMoaW5wdXRJbmZvLCBvdXRTaGFwZUluZm8pIHtcbiAgICBjb25zdCB0ZXhOYW1lID0gaW5wdXRJbmZvLm5hbWU7XG4gICAgY29uc3QgdGV4RnVuY1NuaXBwZXQgPSB0ZXhOYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGV4TmFtZS5zbGljZSgxKTtcbiAgICBjb25zdCBmdW5jTmFtZSA9ICdnZXQnICsgdGV4RnVuY1NuaXBwZXQgKyAnQXRPdXRDb29yZHMnO1xuICAgIGNvbnN0IG91dFRleFNoYXBlID0gb3V0U2hhcGVJbmZvLnRleFNoYXBlO1xuICAgIGNvbnN0IGluVGV4U2hhcGUgPSBpbnB1dEluZm8uc2hhcGVJbmZvLnRleFNoYXBlO1xuICAgIGNvbnN0IGluUmFuayA9IGlucHV0SW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBvdXRSYW5rID0gb3V0U2hhcGVJbmZvLmxvZ2ljYWxTaGFwZS5sZW5ndGg7XG4gICAgaWYgKCFpbnB1dEluZm8uc2hhcGVJbmZvLmlzVW5pZm9ybSAmJiBpblJhbmsgPT09IG91dFJhbmsgJiZcbiAgICAgICAgaW5wdXRJbmZvLnNoYXBlSW5mby5mbGF0T2Zmc2V0ID09IG51bGwgJiZcbiAgICAgICAgdXRpbC5hcnJheXNFcXVhbChpblRleFNoYXBlLCBvdXRUZXhTaGFwZSkpIHtcbiAgICAgICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KCkge1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCByZXN1bHRVVik7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG4gICAgY29uc3QgdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKG91dFJhbmspO1xuICAgIGNvbnN0IGJyb2FkY2FzdERpbXMgPSBnZXRCcm9hZGNhc3REaW1zKGlucHV0SW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlLCBvdXRTaGFwZUluZm8ubG9naWNhbFNoYXBlKTtcbiAgICBjb25zdCByYW5rRGlmZiA9IG91dFJhbmsgLSBpblJhbms7XG4gICAgbGV0IGNvb3Jkc1NuaXBwZXQ7XG4gICAgY29uc3QgZmllbGRzID0gWyd4JywgJ3knLCAneicsICd3JywgJ3UnLCAndiddO1xuICAgIGlmIChpblJhbmsgPT09IDApIHtcbiAgICAgICAgY29vcmRzU25pcHBldCA9ICcnO1xuICAgIH1cbiAgICBlbHNlIGlmIChvdXRSYW5rIDwgMiAmJiBicm9hZGNhc3REaW1zLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgIGNvb3Jkc1NuaXBwZXQgPSAnY29vcmRzID0gMDsnO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29vcmRzU25pcHBldCA9XG4gICAgICAgICAgICBicm9hZGNhc3REaW1zLm1hcChkID0+IGBjb29yZHMuJHtmaWVsZHNbZCArIHJhbmtEaWZmXX0gPSAwO2ApXG4gICAgICAgICAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgIH1cbiAgICBsZXQgdW5wYWNrZWRDb29yZHNTbmlwcGV0ID0gJyc7XG4gICAgaWYgKG91dFJhbmsgPCAyICYmIGluUmFuayA+IDApIHtcbiAgICAgICAgdW5wYWNrZWRDb29yZHNTbmlwcGV0ID0gJ2Nvb3Jkcyc7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB1bnBhY2tlZENvb3Jkc1NuaXBwZXQgPSBpbnB1dEluZm8uc2hhcGVJbmZvLmxvZ2ljYWxTaGFwZVxuICAgICAgICAgICAgLm1hcCgocywgaSkgPT4gYGNvb3Jkcy4ke2ZpZWxkc1tpICsgcmFua0RpZmZdfWApXG4gICAgICAgICAgICAuam9pbignLCAnKTtcbiAgICB9XG4gICAgcmV0dXJuIGBcbiAgICBmbG9hdCAke2Z1bmNOYW1lfSgpIHtcbiAgICAgICR7dHlwZX0gY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAke2Nvb3Jkc1NuaXBwZXR9XG4gICAgICByZXR1cm4gZ2V0JHt0ZXhGdW5jU25pcHBldH0oJHt1bnBhY2tlZENvb3Jkc1NuaXBwZXR9KTtcbiAgICB9XG4gIGA7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29vcmRzRGF0YVR5cGUocmFuaykge1xuICAgIGlmIChyYW5rIDw9IDEpIHtcbiAgICAgICAgcmV0dXJuICdpbnQnO1xuICAgIH1cbiAgICBlbHNlIGlmIChyYW5rID09PSAyKSB7XG4gICAgICAgIHJldHVybiAnaXZlYzInO1xuICAgIH1cbiAgICBlbHNlIGlmIChyYW5rID09PSAzKSB7XG4gICAgICAgIHJldHVybiAnaXZlYzMnO1xuICAgIH1cbiAgICBlbHNlIGlmIChyYW5rID09PSA0KSB7XG4gICAgICAgIHJldHVybiAnaXZlYzQnO1xuICAgIH1cbiAgICBlbHNlIGlmIChyYW5rID09PSA1KSB7XG4gICAgICAgIHJldHVybiAnaXZlYzUnO1xuICAgIH1cbiAgICBlbHNlIGlmIChyYW5rID09PSA2KSB7XG4gICAgICAgIHJldHVybiAnaXZlYzYnO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoYEdQVSBmb3IgcmFuayAke3Jhbmt9IGlzIG5vdCB5ZXQgc3VwcG9ydGVkYCk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFVuaWZvcm1JbmZvRnJvbVNoYXBlKGlzUGFja2VkLCBzaGFwZSwgdGV4U2hhcGUpIHtcbiAgICBjb25zdCB7IG5ld1NoYXBlIH0gPSB1dGlsLnNxdWVlemVTaGFwZShzaGFwZSk7XG4gICAgY29uc3QgcmFuayA9IHNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCB1c2VTcXVlZXplUGFja2VkU2hhcGUgPSBpc1BhY2tlZCAmJiByYW5rID09PSAzICYmIHNoYXBlWzBdID09PSAxO1xuICAgIGNvbnN0IHNxdWVlemVTaGFwZSA9IHVzZVNxdWVlemVQYWNrZWRTaGFwZSA/IHNoYXBlLnNsaWNlKDEpIDogbmV3U2hhcGU7XG4gICAgY29uc3QgdXNlU3F1ZWV6ZVNoYXBlID0gKCFpc1BhY2tlZCAmJiByYW5rID4gMSAmJiAhdXRpbC5hcnJheXNFcXVhbChzaGFwZSwgdGV4U2hhcGUpICYmXG4gICAgICAgIG5ld1NoYXBlLmxlbmd0aCA8IHJhbmspIHx8XG4gICAgICAgIHVzZVNxdWVlemVQYWNrZWRTaGFwZTtcbiAgICBjb25zdCB1bmlmb3JtU2hhcGUgPSB1c2VTcXVlZXplU2hhcGUgPyBzcXVlZXplU2hhcGUgOiBzaGFwZTtcbiAgICByZXR1cm4geyB1c2VTcXVlZXplU2hhcGUsIHVuaWZvcm1TaGFwZSB9O1xufVxuLyoqIFJldHVybnMgYSBuZXcgaW5wdXQgaW5mbyAoYSBjb3B5KSB0aGF0IGhhcyBhIHNxdWVlemVkIGxvZ2ljYWwgc2hhcGUuICovXG5leHBvcnQgZnVuY3Rpb24gc3F1ZWV6ZUlucHV0SW5mbyhpbkluZm8sIHNxdWVlemVkU2hhcGUpIHtcbiAgICAvLyBEZWVwIGNvcHkuXG4gICAgY29uc3QgbmV3SW5wdXRJbmZvID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShpbkluZm8pKTtcbiAgICBuZXdJbnB1dEluZm8uc2hhcGVJbmZvLmxvZ2ljYWxTaGFwZSA9IHNxdWVlemVkU2hhcGU7XG4gICAgcmV0dXJuIG5ld0lucHV0SW5mbztcbn1cbmZ1bmN0aW9uIGdldFNxdWVlemVkUGFyYW1zKHBhcmFtcywga2VwdERpbXMpIHtcbiAgICByZXR1cm4ga2VwdERpbXMubWFwKGQgPT4gcGFyYW1zW2RdKS5qb2luKCcsICcpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2hhZGVyX2NvbXBpbGVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuLyoqXG4gKiBQcm9kdWNlcyBHTFNMIGNvZGUgdGhhdCBkZXJpdmVzIGxvZ2ljYWwgY29vcmRpbmF0ZXMgZnJvbSBhIGZsYXRcbiAqIGluZGV4LiBUaGUgY29kZSBwZXJmb3JtcyBpbnRlZ2VyIGRpdmlzaW9uIHdpdGggZWFjaCBzdHJpZGUgYW5kIGRlY3JlbWVudHNcbiAqIHRoZSBpbmRleCB1bnRpbCB0aGUgaW5kZXggZXF1YWxzIHRoZSBmaW5hbCBkaW1lbnNpb24gY29vcmRpbmF0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExvZ2ljYWxDb29yZGluYXRlc0Zyb21GbGF0SW5kZXgoY29vcmRzLCBzaGFwZSwgaW5kZXggPSAnaW5kZXgnKSB7XG4gICAgY29uc3Qgc3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoc2hhcGUpO1xuICAgIHJldHVybiBzdHJpZGVzXG4gICAgICAgIC5tYXAoKHN0cmlkZSwgaSkgPT4ge1xuICAgICAgICBjb25zdCBsaW5lMSA9IGBpbnQgJHtjb29yZHNbaV19ID0gJHtpbmRleH0gLyAke3N0cmlkZX1gO1xuICAgICAgICBjb25zdCBsaW5lMiA9IGkgPT09IHN0cmlkZXMubGVuZ3RoIC0gMSA/XG4gICAgICAgICAgICBgaW50ICR7Y29vcmRzW2kgKyAxXX0gPSAke2luZGV4fSAtICR7Y29vcmRzW2ldfSAqICR7c3RyaWRlfWAgOlxuICAgICAgICAgICAgYGluZGV4IC09ICR7Y29vcmRzW2ldfSAqICR7c3RyaWRlfWA7XG4gICAgICAgIHJldHVybiBgJHtsaW5lMX07ICR7bGluZTJ9O2A7XG4gICAgfSlcbiAgICAgICAgLmpvaW4oJycpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldExvZ2ljYWxDb29yZGluYXRlc0Zyb21GbGF0SW5kZXhCeVVuaWZvcm0oY29vcmRzLCBzaGFwZSwgaW5kZXggPSAnaW5kZXgnKSB7XG4gICAgY29uc3Qgc3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoc2hhcGUpO1xuICAgIHJldHVybiBzdHJpZGVzXG4gICAgICAgIC5tYXAoKF8sIGkpID0+IHtcbiAgICAgICAgY29uc3QgbGluZTEgPSBgaW50ICR7Y29vcmRzW2ldfSA9ICR7aW5kZXh9IC8gb3V0U2hhcGVTdHJpZGVzWyR7aX1dYDtcbiAgICAgICAgY29uc3QgbGluZTIgPSBpID09PSBzdHJpZGVzLmxlbmd0aCAtIDEgP1xuICAgICAgICAgICAgYGludCAke2Nvb3Jkc1tpICsgMV19ID0gJHtpbmRleH0gLSAke2Nvb3Jkc1tpXX0gKiBvdXRTaGFwZVN0cmlkZXNbJHtpfV1gIDpcbiAgICAgICAgICAgIGBpbmRleCAtPSAke2Nvb3Jkc1tpXX0gKiBvdXRTaGFwZVN0cmlkZXNbJHtpfV1gO1xuICAgICAgICByZXR1cm4gYCR7bGluZTF9OyAke2xpbmUyfTtgO1xuICAgIH0pXG4gICAgICAgIC5qb2luKCcnKTtcbn1cbmZ1bmN0aW9uIGJ1aWxkVmVjKHgpIHtcbiAgICBpZiAoeC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGAke3hbMF19YDtcbiAgICB9XG4gICAgcmV0dXJuIGB2ZWMke3gubGVuZ3RofSgke3guam9pbignLCcpfSlgO1xufVxuLyoqXG4gKiBQcm9kdWNlcyBHTFNMIGNvZGUgdGhhdCBjb21wdXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdGhlIGlucHV0IHggYW5kIHlcbiAqIHZlY3RvcnMuIEhhbmRsZXMgc3BsaXR0aW5nIGlucHV0cyBpbnRvIGluY3JlbWVudHMgb2YgdmVjNHMgd2hlbiBuZWNlc3NhcnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkb3RpZnkoeCwgeSkge1xuICAgIGlmICh4Lmxlbmd0aCAhPT0geS5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBWZWN0b3JzIHRvIGJlIGRvdHRlZCBtdXN0IGJlIG9mIHRoZSBzYW1lIGxlbmd0aCAtYCArXG4gICAgICAgICAgICBgZ290ICR7eC5sZW5ndGh9IGFuZCAke3kubGVuZ3RofWApO1xuICAgIH1cbiAgICBjb25zdCBzbGljZXMgPSBbXTtcbiAgICBjb25zdCBuZWFyZXN0VmVjNCA9IE1hdGguZmxvb3IoeC5sZW5ndGggLyA0KTtcbiAgICBjb25zdCBuZWFyZXN0VmVjNFJlbWFpbmRlciA9IHgubGVuZ3RoICUgNDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5lYXJlc3RWZWM0OyBpKyspIHtcbiAgICAgICAgY29uc3QgeFNsaWNlID0geC5zbGljZShpICogNCwgaSAqIDQgKyA0KTtcbiAgICAgICAgY29uc3QgeVNsaWNlID0geS5zbGljZShpICogNCwgaSAqIDQgKyA0KTtcbiAgICAgICAgc2xpY2VzLnB1c2goYCR7YnVpbGRWZWMoeFNsaWNlKX0sICR7YnVpbGRWZWMoeVNsaWNlKX1gKTtcbiAgICB9XG4gICAgaWYgKG5lYXJlc3RWZWM0UmVtYWluZGVyICE9PSAwKSB7XG4gICAgICAgIGxldCB4U2xpY2UgPSB4LnNsaWNlKG5lYXJlc3RWZWM0ICogNCk7XG4gICAgICAgIGxldCB5U2xpY2UgPSB5LnNsaWNlKG5lYXJlc3RWZWM0ICogNCk7XG4gICAgICAgIGlmICh4U2xpY2UubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICB4U2xpY2UgPSB4U2xpY2UubWFwKGQgPT4gYGZsb2F0KCR7ZH0pYCk7XG4gICAgICAgICAgICB5U2xpY2UgPSB5U2xpY2UubWFwKGQgPT4gYGZsb2F0KCR7ZH0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgc2xpY2VzLnB1c2goYCR7YnVpbGRWZWMoeFNsaWNlKX0sICR7YnVpbGRWZWMoeVNsaWNlKX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHNsaWNlcy5tYXAoKGQsIGkpID0+IGBkb3QoJHtkfSlgKS5qb2luKCcrJyk7XG59XG4vKipcbiAqIFByb2R1Y2VzIEdMU0wgdGhhdCBjb21wdXRlcyB0aGUgZmxhdCBpbmRleCBmcm9tIDNEIGNvb3JkaW5hdGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmxhdEluZGV4RnJvbTNEKHNoYXBlKSB7XG4gICAgY29uc3Qgc3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoc2hhcGUpLm1hcChkID0+IGQudG9TdHJpbmcoKSk7XG4gICAgcmV0dXJuIGBcbiAgaW50IGdldEZsYXRJbmRleChpdmVjMyBjb29yZHMpIHtcbiAgICByZXR1cm4gY29vcmRzLnggKiAke3N0cmlkZXNbMF19ICsgY29vcmRzLnkgKiAke3N0cmlkZXNbMV19ICsgY29vcmRzLno7XG4gIH1cbmA7XG59XG5leHBvcnQgY29uc3QgRU5DT0RFX0ZMT0FUX1NOSVBQRVQgPSBgXG4gIGNvbnN0IGZsb2F0IEZMT0FUX01BWCA9IDEuNzAxNDExODRlMzg7XG4gIGNvbnN0IGZsb2F0IEZMT0FUX01JTiA9IDEuMTc1NDk0MzVlLTM4O1xuXG4gIGxvd3AgdmVjNCBlbmNvZGVfZmxvYXQoaGlnaHAgZmxvYXQgdikge1xuICAgIGlmIChpc25hbih2KSkge1xuICAgICAgcmV0dXJuIHZlYzQoMjU1LCAyNTUsIDI1NSwgMjU1KTtcbiAgICB9XG5cbiAgICBoaWdocCBmbG9hdCBhdiA9IGFicyh2KTtcblxuICAgIGlmKGF2IDwgRkxPQVRfTUlOKSB7XG4gICAgICByZXR1cm4gdmVjNCgwLjAsIDAuMCwgMC4wLCAwLjApO1xuICAgIH0gZWxzZSBpZih2ID4gRkxPQVRfTUFYKSB7XG4gICAgICByZXR1cm4gdmVjNCgwLjAsIDAuMCwgMTI4LjAsIDEyNy4wKSAvIDI1NS4wO1xuICAgIH0gZWxzZSBpZih2IDwgLUZMT0FUX01BWCkge1xuICAgICAgcmV0dXJuIHZlYzQoMC4wLCAwLjAsICAxMjguMCwgMjU1LjApIC8gMjU1LjA7XG4gICAgfVxuXG4gICAgaGlnaHAgdmVjNCBjID0gdmVjNCgwLDAsMCwwKTtcblxuICAgIGhpZ2hwIGZsb2F0IGUgPSBmbG9vcihsb2cyKGF2KSk7XG4gICAgaGlnaHAgZmxvYXQgbSA9IGV4cDIoZnJhY3QobG9nMihhdikpKSAtIDEuMDtcblxuICAgIGNbMl0gPSBmbG9vcigxMjguMCAqIG0pO1xuICAgIG0gLT0gY1syXSAvIDEyOC4wO1xuICAgIGNbMV0gPSBmbG9vcigzMjc2OC4wICogbSk7XG4gICAgbSAtPSBjWzFdIC8gMzI3NjguMDtcbiAgICBjWzBdID0gZmxvb3IoODM4ODYwOC4wICogbSk7XG5cbiAgICBoaWdocCBmbG9hdCBlYmlhcyA9IGUgKyAxMjcuMDtcbiAgICBjWzNdID0gZmxvb3IoZWJpYXMgLyAyLjApO1xuICAgIGViaWFzIC09IGNbM10gKiAyLjA7XG4gICAgY1syXSArPSBmbG9vcihlYmlhcykgKiAxMjguMDtcblxuICAgIGNbM10gKz0gMTI4LjAgKiBzdGVwKDAuMCwgLXYpO1xuXG4gICAgcmV0dXJuIGMgLyAyNTUuMDtcbiAgfVxuYDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNoYWRlcl9jb21waWxlcl91dGlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGdldENvb3Jkc0RhdGFUeXBlIH0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuZXhwb3J0IGNsYXNzIFNsaWNlUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoZGVzdFNpemUpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWydzb3VyY2UnXTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IGRlc3RTaXplO1xuICAgICAgICB0aGlzLnJhbmsgPSBkZXN0U2l6ZS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGR0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUodGhpcy5yYW5rKTtcbiAgICAgICAgdGhpcy5jdXN0b21Vbmlmb3JtcyA9IFt7IG5hbWU6ICdzdGFydCcsIGFycmF5SW5kZXg6IHRoaXMucmFuaywgdHlwZTogJ2ludCcgfV07XG4gICAgICAgIGNvbnN0IHNvdXJjZUNvb3JkcyA9IGdldENvb3Jkcyh0aGlzLnJhbmspO1xuICAgICAgICBsZXQgYm9keTtcbiAgICAgICAgY29uc3QgY29vcmRTdW0gPSBkZXN0U2l6ZS5tYXAoKF8sIGkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgc291cmNlTG9jLiR7Y29vcmRzW2ldfSA9IHN0YXJ0WyR7aX1dICsgY29vcmRzLiR7Y29vcmRzW2ldfTtgO1xuICAgICAgICB9KTtcbiAgICAgICAgYm9keSA9IGBcbiAgICAgICAgJHtkdHlwZX0gc291cmNlTG9jO1xuICAgICAgICAke2R0eXBlfSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgJHtjb29yZFN1bS5qb2luKCdcXG4nKX1cbiAgICAgIGA7XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICR7Ym9keX1cbiAgICAgICAgc2V0T3V0cHV0KGdldFNvdXJjZSgke3NvdXJjZUNvb3Jkc30pKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbmNvbnN0IGNvb3JkcyA9IFsneCcsICd5JywgJ3onLCAndycsICd1JywgJ3YnXTtcbmZ1bmN0aW9uIGdldENvb3JkcyhyYW5rKSB7XG4gICAgaWYgKHJhbmsgPT09IDEpIHtcbiAgICAgICAgcmV0dXJuICdzb3VyY2VMb2MnO1xuICAgIH1cbiAgICBlbHNlIGlmIChyYW5rIDw9IDYpIHtcbiAgICAgICAgcmV0dXJuIGNvb3Jkcy5zbGljZSgwLCByYW5rKS5tYXAoeCA9PiAnc291cmNlTG9jLicgKyB4KS5qb2luKCcsJyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBFcnJvcihgU2xpY2luZyBmb3IgcmFuayAke3Jhbmt9IGlzIG5vdCB5ZXQgc3VwcG9ydGVkYCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2xpY2VfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGdldENoYW5uZWxzIH0gZnJvbSAnLi9wYWNraW5nX3V0aWwnO1xuaW1wb3J0IHsgZ2V0Q29vcmRzRGF0YVR5cGUgfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5leHBvcnQgY2xhc3MgU2xpY2VQYWNrZWRQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3RvcihkZXN0U2l6ZSkge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ3NvdXJjZSddO1xuICAgICAgICB0aGlzLnBhY2tlZElucHV0cyA9IHRydWU7XG4gICAgICAgIHRoaXMucGFja2VkT3V0cHV0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IGRlc3RTaXplO1xuICAgICAgICB0aGlzLnJhbmsgPSBkZXN0U2l6ZS5sZW5ndGg7XG4gICAgICAgIHRoaXMuY3VzdG9tVW5pZm9ybXMgPSBbeyBuYW1lOiAnc3RhcnQnLCBhcnJheUluZGV4OiB0aGlzLnJhbmssIHR5cGU6ICdpbnQnIH1dO1xuICAgICAgICBjb25zdCBkdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHRoaXMucmFuayk7XG4gICAgICAgIGNvbnN0IGNvb3JkcyA9IGdldENoYW5uZWxzKCdjb29yZHMnLCB0aGlzLnJhbmspO1xuICAgICAgICBjb25zdCBzb3VyY2VMb2MgPSBnZXRDaGFubmVscygnc291cmNlTG9jJywgdGhpcy5yYW5rKTtcbiAgICAgICAgY29uc3QgaW5uZXJEaW1zID0gdGhpcy5yYW5rID09PSAxID8gJ3NvdXJjZUxvYycgOiBgdmVjMigke3NvdXJjZUxvYy5zbGljZSgtMikuam9pbigpfSlgO1xuICAgICAgICBjb25zdCBnZXRDaGFubmVsID0gYGdldENoYW5uZWwoZ2V0U291cmNlKCR7c291cmNlTG9jLmpvaW4oKX0pLCAke2lubmVyRGltc30pYDtcbiAgICAgICAgY29uc3QgdXBwZXJSb3cgPSBgXG4gICAgICByZXN1bHQueCA9ICR7Z2V0Q2hhbm5lbH07XG4gICAgICBpZiAoKyske2Nvb3Jkc1t0aGlzLnJhbmsgLSAxXX0gPCAke2Rlc3RTaXplW3RoaXMucmFuayAtIDFdfSkge1xuICAgICAgICArKyR7c291cmNlTG9jW3RoaXMucmFuayAtIDFdfTtcbiAgICAgICAgcmVzdWx0LnkgPSAke2dldENoYW5uZWx9O1xuICAgICAgICAtLSR7c291cmNlTG9jW3RoaXMucmFuayAtIDFdfTtcbiAgICAgIH1cbiAgICBgO1xuICAgICAgICBjb25zdCBsb3dlclJvdyA9IHRoaXMucmFuayA9PT0gMSA/ICcnIDogYFxuICAgICAgLS0ke2Nvb3Jkc1t0aGlzLnJhbmsgLSAxXX07XG4gICAgICBpZiAoKyske2Nvb3Jkc1t0aGlzLnJhbmsgLSAyXX0gPCAke2Rlc3RTaXplW3RoaXMucmFuayAtIDJdfSkge1xuICAgICAgICArKyR7c291cmNlTG9jW3RoaXMucmFuayAtIDJdfTtcbiAgICAgICAgcmVzdWx0LnogPSAke2dldENoYW5uZWx9O1xuICAgICAgICBpZiAoKyske2Nvb3Jkc1t0aGlzLnJhbmsgLSAxXX0gPCAke2Rlc3RTaXplW3RoaXMucmFuayAtIDFdfSkge1xuICAgICAgICAgICsrJHtzb3VyY2VMb2NbdGhpcy5yYW5rIC0gMV19O1xuICAgICAgICAgIHJlc3VsdC53ID0gJHtnZXRDaGFubmVsfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIGA7XG4gICAgICAgIGNvbnN0IHNvdXJjZUxvY1NldHVwID0gdGhpcy5yYW5rIDw9IDQgP1xuICAgICAgICAgICAgYHNvdXJjZUxvYyA9IGNvb3JkcyArXG4gICAgICAgICAgICAke2R0eXBlfSgke2Rlc3RTaXplLm1hcCgoXywgaSkgPT4gYHN0YXJ0WyR7aX1dYCkuam9pbigpfSk7YCA6XG4gICAgICAgICAgICBkZXN0U2l6ZS5tYXAoKF8sIGkpID0+IGAke3NvdXJjZUxvY1tpXX0gPSAke2Nvb3Jkc1tpXX0gKyBzdGFydFske2l9XTtgKVxuICAgICAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgJHtkdHlwZX0gY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgICR7ZHR5cGV9IHNvdXJjZUxvYztcbiAgICAgICAgJHtzb3VyY2VMb2NTZXR1cH1cbiAgICAgICAgdmVjNCByZXN1bHQgPSB2ZWM0KDAuKTtcbiAgICAgICAgJHt1cHBlclJvd31cbiAgICAgICAgJHtsb3dlclJvd31cbiAgICAgICAgc2V0T3V0cHV0KHJlc3VsdCk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zbGljZV9wYWNrZWRfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGdldENvb3Jkc0RhdGFUeXBlIH0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuZXhwb3J0IGNsYXNzIFN0cmlkZWRTbGljZVByb2dyYW0ge1xuICAgIGNvbnN0cnVjdG9yKGJlZ2luLCBzdHJpZGVzLCBzaXplKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsneCddO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gc2l6ZTtcbiAgICAgICAgY29uc3QgcmFuayA9IHNpemUubGVuZ3RoO1xuICAgICAgICBjb25zdCBpbnB1dER0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUoc2l6ZS5sZW5ndGgpO1xuICAgICAgICBjb25zdCBkdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHNpemUubGVuZ3RoKTtcbiAgICAgICAgbGV0IG5ld0Nvb3JkcyA9ICcnO1xuICAgICAgICBpZiAocmFuayA9PT0gMSkge1xuICAgICAgICAgICAgbmV3Q29vcmRzID0gJ2Nvb3JkcyAqIHN0cmlkZXMgKyBiZWdpbic7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgb3V0cHV0QXhpcyA9IDA7XG4gICAgICAgICAgICBuZXdDb29yZHMgPVxuICAgICAgICAgICAgICAgIHNpemUubWFwKChfLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dEF4aXMrKztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpemUubGVuZ3RoID09PSAxID9cbiAgICAgICAgICAgICAgICAgICAgICAgIGBjb29yZHMgKiBzdHJpZGVzWyR7aX1dICsgYmVnaW5bJHtpfV1gIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGBjb29yZHNbJHtvdXRwdXRBeGlzIC0gMX1dICogc3RyaWRlc1ske2l9XSArIGJlZ2luWyR7aX1dYDtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuam9pbignLCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAke2lucHV0RHR5cGV9IGJlZ2luID0gJHtpbnB1dER0eXBlfSgke2JlZ2lufSk7XG4gICAgICAke2lucHV0RHR5cGV9IHN0cmlkZXMgPSAke2lucHV0RHR5cGV9KCR7c3RyaWRlc30pO1xuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICR7ZHR5cGV9IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBzZXRPdXRwdXQoZ2V0WCgke25ld0Nvb3Jkc30pKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN0cmlkZWRfc2xpY2VfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGVudiwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgdmFyIFBhY2tpbmdTY2hlbWU7XG4oZnVuY3Rpb24gKFBhY2tpbmdTY2hlbWUpIHtcbiAgICAvKipcbiAgICAgKiBBbGwgdmFsdWVzIGluIGEgc2luZ2xlIHRleGVsIGFyZSBkZW5zZWx5IHBhY2tlZCB3aXRob3V0IGFueSBjb25zdHJhaW50cy5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgaG93IHRoZSBzaGFkZXIgZW5jb2RlcyBhIHRlbnNvciB3aXRoIHNoYXBlID0gWzIsIDMsIDRdXG4gICAgICogKGluZGljZXMgYXJlIFtiYXRjaCwgcm93LCBjb2xdKS5cbiAgICAgKlxuICAgICAqIDAwMHwwMDEgICAwMTB8MDExICAgMDIwfDAyMVxuICAgICAqIC0tLS0tLS0gICAtLS0tLS0tICAgLS0tLS0tLVxuICAgICAqIDAwMnwwMDMgICAwMTJ8MDEzICAgMDIyfDAyM1xuICAgICAqXG4gICAgICogMTAwfDEwMSAgIDExMHwxMTEgICAxMjB8MTIxXG4gICAgICogLS0tLS0tLSAgIC0tLS0tLS0gICAtLS0tLS0tXG4gICAgICogMTAyfDEwMyAgIDExMnwxMTMgICAxMjJ8MTIzXG4gICAgICpcbiAgICAgKi9cbiAgICBQYWNraW5nU2NoZW1lW1BhY2tpbmdTY2hlbWVbXCJERU5TRVwiXSA9IDBdID0gXCJERU5TRVwiO1xuICAgIC8qKlxuICAgICAqIFNpbmdsZSB0ZXhlbHMgY29udGFpbiBvbmx5IHZhbHVlcyBmcm9tIHRoZSBzYW1lIGJhdGNoLCBhbmQgZnJvbSBhZGphY2VudFxuICAgICAqIHJvd3MgYW5kIGNvbHVtbnMuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIGhvdyB0aGUgc2hhZGVyIGVuY29kZXMgYSB0ZW5zb3Igd2l0aCBzaGFwZSA9IFsyLCAzLCA1XVxuICAgICAqIChpbmRpY2VzIGFyZSBbYmF0Y2gsIHJvdywgY29sXSkuXG4gICAgICpcbiAgICAgKiAwMDB8MDAxICAgMDAyfDAwMyAgIDAwNHx4eHggICAwMjB8MDIxICAgMDIyfDAyMyAgIDAyNHx4eHhcbiAgICAgKiAtLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS0gICAtLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS1cbiAgICAgKiAwMTB8MDExICAgMDEyfDAxMyAgIDAxNHx4eHggICB4eHh8eHh4ICAgeHh4fHh4eCAgIHh4eHx4eHhcbiAgICAgKlxuICAgICAqIDEwMHwxMDEgICAxMDJ8MTAzICAgMTA0fHh4eCAgIDEyMHwxMjEgICAxMjJ8MTIzICAgMTI0fHh4eFxuICAgICAqIC0tLS0tLS0gICAtLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS0gICAtLS0tLS0tICAgLS0tLS0tLVxuICAgICAqIDExMHwxMTEgICAxMTJ8MTEzICAgMTE0fHh4eCAgIHh4eHx4eHggICB4eHh8eHh4ICAgeHh4fHh4eFxuICAgICAqXG4gICAgICovXG4gICAgUGFja2luZ1NjaGVtZVtQYWNraW5nU2NoZW1lW1wiU0hBUkVEX0JBVENIXCJdID0gMV0gPSBcIlNIQVJFRF9CQVRDSFwiO1xufSkoUGFja2luZ1NjaGVtZSB8fCAoUGFja2luZ1NjaGVtZSA9IHt9KSk7XG5leHBvcnQgdmFyIFRleHR1cmVVc2FnZTtcbihmdW5jdGlvbiAoVGV4dHVyZVVzYWdlKSB7XG4gICAgVGV4dHVyZVVzYWdlW1RleHR1cmVVc2FnZVtcIlJFTkRFUlwiXSA9IDBdID0gXCJSRU5ERVJcIjtcbiAgICBUZXh0dXJlVXNhZ2VbVGV4dHVyZVVzYWdlW1wiVVBMT0FEXCJdID0gMV0gPSBcIlVQTE9BRFwiO1xuICAgIFRleHR1cmVVc2FnZVtUZXh0dXJlVXNhZ2VbXCJQSVhFTFNcIl0gPSAyXSA9IFwiUElYRUxTXCI7XG4gICAgVGV4dHVyZVVzYWdlW1RleHR1cmVVc2FnZVtcIkRPV05MT0FEXCJdID0gM10gPSBcIkRPV05MT0FEXCI7XG59KShUZXh0dXJlVXNhZ2UgfHwgKFRleHR1cmVVc2FnZSA9IHt9KSk7XG5leHBvcnQgdmFyIFBoeXNpY2FsVGV4dHVyZVR5cGU7XG4oZnVuY3Rpb24gKFBoeXNpY2FsVGV4dHVyZVR5cGUpIHtcbiAgICBQaHlzaWNhbFRleHR1cmVUeXBlW1BoeXNpY2FsVGV4dHVyZVR5cGVbXCJVTlBBQ0tFRF9GTE9BVDE2XCJdID0gMF0gPSBcIlVOUEFDS0VEX0ZMT0FUMTZcIjtcbiAgICBQaHlzaWNhbFRleHR1cmVUeXBlW1BoeXNpY2FsVGV4dHVyZVR5cGVbXCJVTlBBQ0tFRF9GTE9BVDMyXCJdID0gMV0gPSBcIlVOUEFDS0VEX0ZMT0FUMzJcIjtcbiAgICBQaHlzaWNhbFRleHR1cmVUeXBlW1BoeXNpY2FsVGV4dHVyZVR5cGVbXCJQQUNLRURfNFgxX1VOU0lHTkVEX0JZVEVcIl0gPSAyXSA9IFwiUEFDS0VEXzRYMV9VTlNJR05FRF9CWVRFXCI7XG4gICAgUGh5c2ljYWxUZXh0dXJlVHlwZVtQaHlzaWNhbFRleHR1cmVUeXBlW1wiUEFDS0VEXzJYMl9GTE9BVDMyXCJdID0gM10gPSBcIlBBQ0tFRF8yWDJfRkxPQVQzMlwiO1xuICAgIFBoeXNpY2FsVGV4dHVyZVR5cGVbUGh5c2ljYWxUZXh0dXJlVHlwZVtcIlBBQ0tFRF8yWDJfRkxPQVQxNlwiXSA9IDRdID0gXCJQQUNLRURfMlgyX0ZMT0FUMTZcIjtcbn0pKFBoeXNpY2FsVGV4dHVyZVR5cGUgfHwgKFBoeXNpY2FsVGV4dHVyZVR5cGUgPSB7fSkpO1xuZXhwb3J0IGZ1bmN0aW9uIGdldFVucGFja2VkTWF0cml4VGV4dHVyZVNoYXBlV2lkdGhIZWlnaHQocm93cywgY29sdW1ucykge1xuICAgIHJldHVybiBbY29sdW1ucywgcm93c107XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0VW5wYWNrZWRBcnJheVNpemVGcm9tTWF0cml4U2l6ZShtYXRyaXhTaXplLCBjaGFubmVsc1BlclRleHR1cmUpIHtcbiAgICByZXR1cm4gbWF0cml4U2l6ZSAqIGNoYW5uZWxzUGVyVGV4dHVyZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb2xvck1hdHJpeFRleHR1cmVTaGFwZVdpZHRoSGVpZ2h0KHJvd3MsIGNvbHVtbnMpIHtcbiAgICByZXR1cm4gW2NvbHVtbnMgKiA0LCByb3dzXTtcbn1cbi8qKlxuICogR2V0IHNoYXBlIGZvciBkZW5zZWx5IHBhY2tlZCBSR0JBIHRleHR1cmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZW5zZVRleFNoYXBlKHNoYXBlKSB7XG4gICAgY29uc3Qgc2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShzaGFwZSk7XG4gICAgY29uc3QgdGV4ZWxzTmVlZGVkID0gTWF0aC5jZWlsKHNpemUgLyA0KTtcbiAgICByZXR1cm4gdXRpbC5zaXplVG9TcXVhcmlzaFNoYXBlKHRleGVsc05lZWRlZCk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0TWF0cml4U2l6ZUZyb21VbnBhY2tlZEFycmF5U2l6ZSh1bnBhY2tlZFNpemUsIGNoYW5uZWxzUGVyVGV4dHVyZSkge1xuICAgIGlmICh1bnBhY2tlZFNpemUgJSBjaGFubmVsc1BlclRleHR1cmUgIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bnBhY2tlZFNpemUgKCR7dW5wYWNrZWRTaXplfSkgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGAgK1xuICAgICAgICAgICAgYCR7Y2hhbm5lbHNQZXJUZXh0dXJlfWApO1xuICAgIH1cbiAgICByZXR1cm4gdW5wYWNrZWRTaXplIC8gY2hhbm5lbHNQZXJUZXh0dXJlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZU1hdHJpeEZyb21VbnBhY2tlZENvbG9yUkdCQUFycmF5KHVucGFja2VkQXJyYXksIG1hdHJpeCwgY2hhbm5lbHMpIHtcbiAgICBjb25zdCByZXF1aXJlZFNpemUgPSB1bnBhY2tlZEFycmF5Lmxlbmd0aCAqIGNoYW5uZWxzIC8gNDtcbiAgICBpZiAobWF0cml4Lmxlbmd0aCA8IHJlcXVpcmVkU2l6ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG1hdHJpeCBsZW5ndGggKCR7bWF0cml4Lmxlbmd0aH0pIG11c3QgYmUgPj0gJHtyZXF1aXJlZFNpemV9YCk7XG4gICAgfVxuICAgIGxldCBkc3QgPSAwO1xuICAgIGZvciAobGV0IHNyYyA9IDA7IHNyYyA8IHVucGFja2VkQXJyYXkubGVuZ3RoOyBzcmMgKz0gNCkge1xuICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGNoYW5uZWxzOyBjKyspIHtcbiAgICAgICAgICAgIG1hdHJpeFtkc3QrK10gPSB1bnBhY2tlZEFycmF5W3NyYyArIGNdO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhY2tlZE1hdHJpeFRleHR1cmVTaGFwZVdpZHRoSGVpZ2h0KHJvd3MsIGNvbHVtbnMpIHtcbiAgICByZXR1cm4gW1xuICAgICAgICBNYXRoLm1heCgxLCBNYXRoLmNlaWwoY29sdW1ucyAvIDIpKSwgTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHJvd3MgLyAyKSlcbiAgICBdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhY2tlZFJHQkFBcnJheVNpemVGcm9tTWF0cml4U2hhcGUocm93cywgY29sdW1ucykge1xuICAgIGNvbnN0IFt3LCBoXSA9IGdldFBhY2tlZE1hdHJpeFRleHR1cmVTaGFwZVdpZHRoSGVpZ2h0KHJvd3MsIGNvbHVtbnMpO1xuICAgIHJldHVybiB3ICogaCAqIDQ7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0VGV4dHVyZUNvbmZpZyhcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbmdsLCB0ZXh0dXJlSGFsZkZsb2F0RXh0ZW5zaW9uKSB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgIGNvbnN0IGdsYW55ID0gZ2w7XG4gICAgbGV0IGludGVybmFsRm9ybWF0RmxvYXQ7XG4gICAgbGV0IGludGVybmFsRm9ybWF0SGFsZkZsb2F0O1xuICAgIGxldCBpbnRlcm5hbEZvcm1hdFBhY2tlZEhhbGZGbG9hdDtcbiAgICBsZXQgaW50ZXJuYWxGb3JtYXRQYWNrZWRGbG9hdDtcbiAgICBsZXQgdGV4dHVyZUZvcm1hdEZsb2F0O1xuICAgIGxldCBkb3dubG9hZFRleHR1cmVGb3JtYXQ7XG4gICAgbGV0IGRvd25sb2FkVW5wYWNrTnVtQ2hhbm5lbHM7XG4gICAgbGV0IGRlZmF1bHROdW1DaGFubmVscztcbiAgICBsZXQgdGV4dHVyZVR5cGVIYWxmRmxvYXQ7XG4gICAgbGV0IHRleHR1cmVUeXBlRmxvYXQ7XG4gICAgaWYgKGVudigpLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpID09PSAyKSB7XG4gICAgICAgIGludGVybmFsRm9ybWF0RmxvYXQgPSBnbGFueS5SMzJGO1xuICAgICAgICBpbnRlcm5hbEZvcm1hdEhhbGZGbG9hdCA9IGdsYW55LlIxNkY7XG4gICAgICAgIGludGVybmFsRm9ybWF0UGFja2VkSGFsZkZsb2F0ID0gZ2xhbnkuUkdCQTE2RjtcbiAgICAgICAgaW50ZXJuYWxGb3JtYXRQYWNrZWRGbG9hdCA9IGdsYW55LlJHQkEzMkY7XG4gICAgICAgIHRleHR1cmVGb3JtYXRGbG9hdCA9IGdsYW55LlJFRDtcbiAgICAgICAgZG93bmxvYWRVbnBhY2tOdW1DaGFubmVscyA9IDQ7XG4gICAgICAgIGRlZmF1bHROdW1DaGFubmVscyA9IDE7XG4gICAgICAgIHRleHR1cmVUeXBlSGFsZkZsb2F0ID0gZ2xhbnkuSEFMRl9GTE9BVDtcbiAgICAgICAgdGV4dHVyZVR5cGVGbG9hdCA9IGdsYW55LkZMT0FUO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaW50ZXJuYWxGb3JtYXRGbG9hdCA9IGdsLlJHQkE7XG4gICAgICAgIGludGVybmFsRm9ybWF0SGFsZkZsb2F0ID0gZ2wuUkdCQTtcbiAgICAgICAgaW50ZXJuYWxGb3JtYXRQYWNrZWRIYWxmRmxvYXQgPSBnbC5SR0JBO1xuICAgICAgICBpbnRlcm5hbEZvcm1hdFBhY2tlZEZsb2F0ID0gZ2xhbnkuUkdCQTtcbiAgICAgICAgdGV4dHVyZUZvcm1hdEZsb2F0ID0gZ2wuUkdCQTtcbiAgICAgICAgZG93bmxvYWRVbnBhY2tOdW1DaGFubmVscyA9IDQ7XG4gICAgICAgIGRlZmF1bHROdW1DaGFubmVscyA9IDQ7XG4gICAgICAgIHRleHR1cmVUeXBlSGFsZkZsb2F0ID0gdGV4dHVyZUhhbGZGbG9hdEV4dGVuc2lvbiAhPSBudWxsID9cbiAgICAgICAgICAgIHRleHR1cmVIYWxmRmxvYXRFeHRlbnNpb24uSEFMRl9GTE9BVF9PRVMgOlxuICAgICAgICAgICAgbnVsbDtcbiAgICAgICAgdGV4dHVyZVR5cGVGbG9hdCA9IGdsLkZMT0FUO1xuICAgIH1cbiAgICBkb3dubG9hZFRleHR1cmVGb3JtYXQgPSBnbC5SR0JBO1xuICAgIHJldHVybiB7XG4gICAgICAgIGludGVybmFsRm9ybWF0RmxvYXQsXG4gICAgICAgIGludGVybmFsRm9ybWF0SGFsZkZsb2F0LFxuICAgICAgICBpbnRlcm5hbEZvcm1hdFBhY2tlZEhhbGZGbG9hdCxcbiAgICAgICAgaW50ZXJuYWxGb3JtYXRQYWNrZWRGbG9hdCxcbiAgICAgICAgdGV4dHVyZUZvcm1hdEZsb2F0LFxuICAgICAgICBkb3dubG9hZFRleHR1cmVGb3JtYXQsXG4gICAgICAgIGRvd25sb2FkVW5wYWNrTnVtQ2hhbm5lbHMsXG4gICAgICAgIGRlZmF1bHROdW1DaGFubmVscyxcbiAgICAgICAgdGV4dHVyZVR5cGVIYWxmRmxvYXQsXG4gICAgICAgIHRleHR1cmVUeXBlRmxvYXRcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGV4X3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGdldEludGVybmFsRm9ybWF0Rm9yRmxvYXQxNk1hdHJpeFRleHR1cmUsIGdldEludGVybmFsRm9ybWF0Rm9yRmxvYXQxNlBhY2tlZE1hdHJpeFRleHR1cmUsIGdldEludGVybmFsRm9ybWF0Rm9yRmxvYXQzMk1hdHJpeFRleHR1cmUsIGdldEludGVybmFsRm9ybWF0Rm9yUGFja2VkTWF0cml4VGV4dHVyZSwgZ2V0SW50ZXJuYWxGb3JtYXRGb3JVbnNpZ25lZEJ5dGVzTWF0cml4VGV4dHVyZSB9IGZyb20gJy4vZ3BncHVfdXRpbCc7XG5pbXBvcnQgeyBnZXRQYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodCwgZ2V0VW5wYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodCwgUGh5c2ljYWxUZXh0dXJlVHlwZSwgVGV4dHVyZVVzYWdlIH0gZnJvbSAnLi90ZXhfdXRpbCc7XG5leHBvcnQgY2xhc3MgVGV4dHVyZU1hbmFnZXIge1xuICAgIGNvbnN0cnVjdG9yKGdwZ3B1KSB7XG4gICAgICAgIHRoaXMuZ3BncHUgPSBncGdwdTtcbiAgICAgICAgdGhpcy5udW1Vc2VkVGV4dHVyZXMgPSAwO1xuICAgICAgICB0aGlzLm51bUZyZWVUZXh0dXJlcyA9IDA7XG4gICAgICAgIHRoaXMuX251bUJ5dGVzQWxsb2NhdGVkID0gMDtcbiAgICAgICAgdGhpcy5fbnVtQnl0ZXNGcmVlID0gMDsgLy8gSG93IG1hbnkgYnl0ZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkXG4gICAgICAgIC8vIGFyZSBhdmFpbGFibGUgZm9yIHJldXNlLlxuICAgICAgICB0aGlzLmZyZWVUZXh0dXJlcyA9IHt9O1xuICAgICAgICB0aGlzLmxvZ0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy51c2VkVGV4dHVyZXMgPSB7fTtcbiAgICB9XG4gICAgYWNxdWlyZVRleHR1cmUoc2hhcGVSQywgdXNhZ2UsIGlzUGFja2VkKSB7XG4gICAgICAgIGNvbnN0IHBoeXNpY2FsVGV4VHlwZSA9IGdldFBoeXNpY2FsRnJvbUxvZ2ljYWxUZXh0dXJlVHlwZSh1c2FnZSwgaXNQYWNrZWQpO1xuICAgICAgICBjb25zdCBzaGFwZUtleSA9IGdldEtleUZyb21UZXh0dXJlU2hhcGUoc2hhcGVSQywgcGh5c2ljYWxUZXhUeXBlLCBpc1BhY2tlZCk7XG4gICAgICAgIGlmICghKHNoYXBlS2V5IGluIHRoaXMuZnJlZVRleHR1cmVzKSkge1xuICAgICAgICAgICAgdGhpcy5mcmVlVGV4dHVyZXNbc2hhcGVLZXldID0gW107XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEoc2hhcGVLZXkgaW4gdGhpcy51c2VkVGV4dHVyZXMpKSB7XG4gICAgICAgICAgICB0aGlzLnVzZWRUZXh0dXJlc1tzaGFwZUtleV0gPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0ZXhCeXRlcyA9IGNvbXB1dGVCeXRlcyhzaGFwZVJDLCBwaHlzaWNhbFRleFR5cGUsIHRoaXMuZ3BncHUuZ2wsIHRoaXMuZ3BncHUudGV4dHVyZUNvbmZpZywgaXNQYWNrZWQpO1xuICAgICAgICBpZiAodGhpcy5mcmVlVGV4dHVyZXNbc2hhcGVLZXldLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMubnVtRnJlZVRleHR1cmVzLS07XG4gICAgICAgICAgICB0aGlzLm51bVVzZWRUZXh0dXJlcysrO1xuICAgICAgICAgICAgdGhpcy5fbnVtQnl0ZXNGcmVlIC09IHRleEJ5dGVzO1xuICAgICAgICAgICAgdGhpcy5sb2coKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld1RleHR1cmUgPSB0aGlzLmZyZWVUZXh0dXJlc1tzaGFwZUtleV0uc2hpZnQoKTtcbiAgICAgICAgICAgIHRoaXMudXNlZFRleHR1cmVzW3NoYXBlS2V5XS5wdXNoKG5ld1RleHR1cmUpO1xuICAgICAgICAgICAgcmV0dXJuIG5ld1RleHR1cmU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG5ld1RleHR1cmU7XG4gICAgICAgIGlmIChwaHlzaWNhbFRleFR5cGUgPT09IFBoeXNpY2FsVGV4dHVyZVR5cGUuUEFDS0VEXzJYMl9GTE9BVDMyKSB7XG4gICAgICAgICAgICBuZXdUZXh0dXJlID0gdGhpcy5ncGdwdS5jcmVhdGVQYWNrZWRNYXRyaXhUZXh0dXJlKHNoYXBlUkNbMF0sIHNoYXBlUkNbMV0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBoeXNpY2FsVGV4VHlwZSA9PT0gUGh5c2ljYWxUZXh0dXJlVHlwZS5QQUNLRURfMlgyX0ZMT0FUMTYpIHtcbiAgICAgICAgICAgIG5ld1RleHR1cmUgPVxuICAgICAgICAgICAgICAgIHRoaXMuZ3BncHUuY3JlYXRlRmxvYXQxNlBhY2tlZE1hdHJpeFRleHR1cmUoc2hhcGVSQ1swXSwgc2hhcGVSQ1sxXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGh5c2ljYWxUZXhUeXBlID09PSBQaHlzaWNhbFRleHR1cmVUeXBlLlVOUEFDS0VEX0ZMT0FUMzIpIHtcbiAgICAgICAgICAgIG5ld1RleHR1cmUgPVxuICAgICAgICAgICAgICAgIHRoaXMuZ3BncHUuY3JlYXRlRmxvYXQzMk1hdHJpeFRleHR1cmUoc2hhcGVSQ1swXSwgc2hhcGVSQ1sxXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGh5c2ljYWxUZXhUeXBlID09PSBQaHlzaWNhbFRleHR1cmVUeXBlLlVOUEFDS0VEX0ZMT0FUMTYpIHtcbiAgICAgICAgICAgIG5ld1RleHR1cmUgPVxuICAgICAgICAgICAgICAgIHRoaXMuZ3BncHUuY3JlYXRlRmxvYXQxNk1hdHJpeFRleHR1cmUoc2hhcGVSQ1swXSwgc2hhcGVSQ1sxXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGh5c2ljYWxUZXhUeXBlID09PSBQaHlzaWNhbFRleHR1cmVUeXBlLlBBQ0tFRF80WDFfVU5TSUdORURfQllURSkge1xuICAgICAgICAgICAgbmV3VGV4dHVyZSA9XG4gICAgICAgICAgICAgICAgdGhpcy5ncGdwdS5jcmVhdGVVbnNpZ25lZEJ5dGVzTWF0cml4VGV4dHVyZShzaGFwZVJDWzBdLCBzaGFwZVJDWzFdKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVzZWRUZXh0dXJlc1tzaGFwZUtleV0ucHVzaChuZXdUZXh0dXJlKTtcbiAgICAgICAgdGhpcy5udW1Vc2VkVGV4dHVyZXMrKztcbiAgICAgICAgdGhpcy5fbnVtQnl0ZXNBbGxvY2F0ZWQgKz0gdGV4Qnl0ZXM7XG4gICAgICAgIHRoaXMubG9nKCk7XG4gICAgICAgIHJldHVybiBuZXdUZXh0dXJlO1xuICAgIH1cbiAgICByZWxlYXNlVGV4dHVyZSh0ZXh0dXJlLCBzaGFwZSwgbG9naWNhbFRleFR5cGUsIGlzUGFja2VkKSB7XG4gICAgICAgIGlmICh0aGlzLmZyZWVUZXh0dXJlcyA9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBBbHJlYWR5IGRpc3Bvc2VkLlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBoeXNpY2FsVGV4VHlwZSA9IGdldFBoeXNpY2FsRnJvbUxvZ2ljYWxUZXh0dXJlVHlwZShsb2dpY2FsVGV4VHlwZSwgaXNQYWNrZWQpO1xuICAgICAgICBjb25zdCBzaGFwZUtleSA9IGdldEtleUZyb21UZXh0dXJlU2hhcGUoc2hhcGUsIHBoeXNpY2FsVGV4VHlwZSwgaXNQYWNrZWQpO1xuICAgICAgICBpZiAoIShzaGFwZUtleSBpbiB0aGlzLmZyZWVUZXh0dXJlcykpIHtcbiAgICAgICAgICAgIHRoaXMuZnJlZVRleHR1cmVzW3NoYXBlS2V5XSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRleEJ5dGVzID0gY29tcHV0ZUJ5dGVzKHNoYXBlLCBwaHlzaWNhbFRleFR5cGUsIHRoaXMuZ3BncHUuZ2wsIHRoaXMuZ3BncHUudGV4dHVyZUNvbmZpZywgaXNQYWNrZWQpO1xuICAgICAgICBjb25zdCBkZWxldGVUZXhUaHJlc2hvbGQgPSBlbnYoKS5nZXQoJ1dFQkdMX0RFTEVURV9URVhUVVJFX1RIUkVTSE9MRCcpO1xuICAgICAgICBpZiAoZGVsZXRlVGV4VGhyZXNob2xkICE9PSAtMSAmJlxuICAgICAgICAgICAgdGhpcy5fbnVtQnl0ZXNBbGxvY2F0ZWQgPiBkZWxldGVUZXhUaHJlc2hvbGQpIHtcbiAgICAgICAgICAgIHRoaXMuZ3BncHUuZGVsZXRlTWF0cml4VGV4dHVyZSh0ZXh0dXJlKTtcbiAgICAgICAgICAgIHRoaXMuX251bUJ5dGVzQWxsb2NhdGVkIC09IHRleEJ5dGVzO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5mcmVlVGV4dHVyZXNbc2hhcGVLZXldLnB1c2godGV4dHVyZSk7XG4gICAgICAgICAgICB0aGlzLm51bUZyZWVUZXh0dXJlcysrO1xuICAgICAgICAgICAgdGhpcy5fbnVtQnl0ZXNGcmVlICs9IHRleEJ5dGVzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubnVtVXNlZFRleHR1cmVzLS07XG4gICAgICAgIGNvbnN0IHRleExpc3QgPSB0aGlzLnVzZWRUZXh0dXJlc1tzaGFwZUtleV07XG4gICAgICAgIGNvbnN0IHRleEluZGV4ID0gdGV4TGlzdC5pbmRleE9mKHRleHR1cmUpO1xuICAgICAgICBpZiAodGV4SW5kZXggPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZWxlYXNlIGEgdGV4dHVyZSB0aGF0IHdhcyBuZXZlciBwcm92aWRlZCBieSB0aGlzICcgK1xuICAgICAgICAgICAgICAgICd0ZXh0dXJlIG1hbmFnZXInKTtcbiAgICAgICAgfVxuICAgICAgICB0ZXhMaXN0LnNwbGljZSh0ZXhJbmRleCwgMSk7XG4gICAgICAgIHRoaXMubG9nKCk7XG4gICAgfVxuICAgIGxvZygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmxvZ0VuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b3RhbCA9IHRoaXMubnVtRnJlZVRleHR1cmVzICsgdGhpcy5udW1Vc2VkVGV4dHVyZXM7XG4gICAgICAgIGNvbnNvbGUubG9nKCdGcmVlL1VzZWQnLCBgJHt0aGlzLm51bUZyZWVUZXh0dXJlc30gLyAke3RoaXMubnVtVXNlZFRleHR1cmVzfWAsIGAoJHt0b3RhbH0pYCk7XG4gICAgICAgIGNvbnN0IGZyZWVSYXRpbyA9IHRoaXMuX251bUJ5dGVzRnJlZSAvIHRoaXMuX251bUJ5dGVzQWxsb2NhdGVkO1xuICAgICAgICBjb25zb2xlLmxvZyhgQnl0ZXMgYWxsb2NhdGVkOiAke3RoaXMuX251bUJ5dGVzQWxsb2NhdGVkfWApO1xuICAgICAgICBjb25zb2xlLmxvZyhgQnl0ZXMgdW51c2VkOiAke3RoaXMuX251bUJ5dGVzRnJlZX0gKCR7TWF0aC5yb3VuZCgxMDAgKiBmcmVlUmF0aW8pfSUpYCk7XG4gICAgfVxuICAgIGdldCBudW1CeXRlc0FsbG9jYXRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX251bUJ5dGVzQWxsb2NhdGVkO1xuICAgIH1cbiAgICBnZXQgbnVtQnl0ZXNGcmVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbnVtQnl0ZXNGcmVlO1xuICAgIH1cbiAgICBnZXROdW1Vc2VkVGV4dHVyZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm51bVVzZWRUZXh0dXJlcztcbiAgICB9XG4gICAgZ2V0TnVtRnJlZVRleHR1cmVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5udW1GcmVlVGV4dHVyZXM7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmZyZWVUZXh0dXJlcyA9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBBbHJlYWR5IGRpc3Bvc2VkLlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgdGV4U2hhcGUgaW4gdGhpcy5mcmVlVGV4dHVyZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZnJlZVRleHR1cmVzW3RleFNoYXBlXS5mb3JFYWNoKHRleCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5ncGdwdS5kZWxldGVNYXRyaXhUZXh0dXJlKHRleCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHRleFNoYXBlIGluIHRoaXMudXNlZFRleHR1cmVzKSB7XG4gICAgICAgICAgICB0aGlzLnVzZWRUZXh0dXJlc1t0ZXhTaGFwZV0uZm9yRWFjaCh0ZXggPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZ3BncHUuZGVsZXRlTWF0cml4VGV4dHVyZSh0ZXgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mcmVlVGV4dHVyZXMgPSBudWxsO1xuICAgICAgICB0aGlzLnVzZWRUZXh0dXJlcyA9IG51bGw7XG4gICAgICAgIHRoaXMubnVtVXNlZFRleHR1cmVzID0gMDtcbiAgICAgICAgdGhpcy5udW1GcmVlVGV4dHVyZXMgPSAwO1xuICAgICAgICB0aGlzLl9udW1CeXRlc0FsbG9jYXRlZCA9IDA7XG4gICAgICAgIHRoaXMuX251bUJ5dGVzRnJlZSA9IDA7XG4gICAgfVxufVxuZnVuY3Rpb24gbnVtQnl0ZXNGb3JJbnRlcm5hbEZvcm1hdChnbCwgaW50ZXJuYWxGb3JtYXQpIHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgY29uc3QgZ2xhbnkgPSBnbDtcbiAgICBpZiAoaW50ZXJuYWxGb3JtYXQgPT09IGdsYW55LlIzMkYpIHtcbiAgICAgICAgcmV0dXJuIDQ7XG4gICAgfVxuICAgIGVsc2UgaWYgKGludGVybmFsRm9ybWF0ID09PSBnbGFueS5SMTZGKSB7XG4gICAgICAgIHJldHVybiAyO1xuICAgIH1cbiAgICBlbHNlIGlmIChpbnRlcm5hbEZvcm1hdCA9PT0gZ2xhbnkuUkdCQTMyRikge1xuICAgICAgICByZXR1cm4gMTY7XG4gICAgfVxuICAgIGVsc2UgaWYgKGludGVybmFsRm9ybWF0ID09PSBnbC5SR0JBKSB7XG4gICAgICAgIHJldHVybiAxNjtcbiAgICB9XG4gICAgZWxzZSBpZiAoaW50ZXJuYWxGb3JtYXQgPT09IGdsYW55LlJHQkExNkYpIHtcbiAgICAgICAgcmV0dXJuIDg7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBpbnRlcm5hbCBmb3JtYXQgJHtpbnRlcm5hbEZvcm1hdH1gKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlQnl0ZXMoc2hhcGUsIHBoeXNpY2FsVGV4VHlwZSwgZ2wsIHRleHR1cmVDb25maWcsIGlzUGFja2VkKSB7XG4gICAgLy8gSXQgaXMgbm90IHBvc3NpYmxlIHRvIGluZmVyIHBhY2tlZCBzdGF0dXMgZnJvbSB0aGUgdGV4dHVyZSB0eXBlIGJlY2F1c2VcbiAgICAvLyBkZXBlbmRpbmcgb24gdGhlIHRleHR1cmVDb25maWcsIGRpZmZlcmVudCAgdGV4dHVyZSB0eXBlcyBtYXkgcmVzb2x2ZSB0byB0aGVcbiAgICAvLyBzYW1lIGludGVybmFsIGZvcm1hdCAoZS5nLiBpbiBXZWJHTDEsIHRoZSBpbnRlcm5hbCBmb3JtYXQgZm9yXG4gICAgLy8gVU5QQUNLRURfRkxPQVQxNiB0ZXh0dXJlcyBpcyBnbC5SR0JBKS4gVGhlcmVmb3JlIHdlIHBhc3MgaW4gYGlzUGFja2VkYFxuICAgIC8vIGV4cGxpY2l0bHkuXG4gICAgY29uc3QgaW50ZXJuYWxGb3JtYXQgPSBpbnRlcm5hbEZvcm1hdEZvclBoeXNpY2FsVGV4VHlwZShwaHlzaWNhbFRleFR5cGUsIHRleHR1cmVDb25maWcpO1xuICAgIGxldCBudW1FbGVtZW50cztcbiAgICBpZiAoaXNQYWNrZWQpIHtcbiAgICAgICAgY29uc3QgW3BhY2tlZFdpZHRoLCBwYWNrZWRIZWlnaHRdID0gZ2V0UGFja2VkTWF0cml4VGV4dHVyZVNoYXBlV2lkdGhIZWlnaHQoc2hhcGVbMF0sIHNoYXBlWzFdKTtcbiAgICAgICAgbnVtRWxlbWVudHMgPSBwYWNrZWRXaWR0aCAqIHBhY2tlZEhlaWdodDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IGdldFVucGFja2VkTWF0cml4VGV4dHVyZVNoYXBlV2lkdGhIZWlnaHQoc2hhcGVbMF0sIHNoYXBlWzFdKTtcbiAgICAgICAgbnVtRWxlbWVudHMgPSB3aWR0aCAqIGhlaWdodDtcbiAgICB9XG4gICAgY29uc3QgYnl0ZXNQZXJFbGVtZW50ID0gbnVtQnl0ZXNGb3JJbnRlcm5hbEZvcm1hdChnbCwgaW50ZXJuYWxGb3JtYXQpO1xuICAgIHJldHVybiBudW1FbGVtZW50cyAqIGJ5dGVzUGVyRWxlbWVudDtcbn1cbmZ1bmN0aW9uIGludGVybmFsRm9ybWF0Rm9yUGh5c2ljYWxUZXhUeXBlKHBoeXNpY2FsVGV4VHlwZSwgdGV4dHVyZUNvbmZpZykge1xuICAgIHN3aXRjaCAocGh5c2ljYWxUZXhUeXBlKSB7XG4gICAgICAgIGNhc2UgUGh5c2ljYWxUZXh0dXJlVHlwZS5QQUNLRURfMlgyX0ZMT0FUMzI6XG4gICAgICAgICAgICByZXR1cm4gZ2V0SW50ZXJuYWxGb3JtYXRGb3JQYWNrZWRNYXRyaXhUZXh0dXJlKHRleHR1cmVDb25maWcpO1xuICAgICAgICBjYXNlIFBoeXNpY2FsVGV4dHVyZVR5cGUuUEFDS0VEXzJYMl9GTE9BVDE2OlxuICAgICAgICAgICAgcmV0dXJuIGdldEludGVybmFsRm9ybWF0Rm9yRmxvYXQxNlBhY2tlZE1hdHJpeFRleHR1cmUodGV4dHVyZUNvbmZpZyk7XG4gICAgICAgIGNhc2UgUGh5c2ljYWxUZXh0dXJlVHlwZS5VTlBBQ0tFRF9GTE9BVDMyOlxuICAgICAgICAgICAgcmV0dXJuIGdldEludGVybmFsRm9ybWF0Rm9yRmxvYXQzMk1hdHJpeFRleHR1cmUodGV4dHVyZUNvbmZpZyk7XG4gICAgICAgIGNhc2UgUGh5c2ljYWxUZXh0dXJlVHlwZS5VTlBBQ0tFRF9GTE9BVDE2OlxuICAgICAgICAgICAgcmV0dXJuIGdldEludGVybmFsRm9ybWF0Rm9yRmxvYXQxNk1hdHJpeFRleHR1cmUodGV4dHVyZUNvbmZpZyk7XG4gICAgICAgIGNhc2UgUGh5c2ljYWxUZXh0dXJlVHlwZS5QQUNLRURfNFgxX1VOU0lHTkVEX0JZVEU6XG4gICAgICAgICAgICByZXR1cm4gZ2V0SW50ZXJuYWxGb3JtYXRGb3JVbnNpZ25lZEJ5dGVzTWF0cml4VGV4dHVyZSh0ZXh0dXJlQ29uZmlnKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwaHlzaWNhbCB0ZXh0dXJlIHR5cGUgJHtwaHlzaWNhbFRleFR5cGV9YCk7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0UGh5c2ljYWxUZXh0dXJlRm9yUmVuZGVyaW5nKGlzUGFja2VkKSB7XG4gICAgaWYgKGVudigpLmdldEJvb2woJ1dFQkdMX1JFTkRFUl9GTE9BVDMyX0VOQUJMRUQnKSkge1xuICAgICAgICBpZiAoaXNQYWNrZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBQaHlzaWNhbFRleHR1cmVUeXBlLlBBQ0tFRF8yWDJfRkxPQVQzMjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUGh5c2ljYWxUZXh0dXJlVHlwZS5VTlBBQ0tFRF9GTE9BVDMyO1xuICAgIH1cbiAgICBpZiAoaXNQYWNrZWQpIHtcbiAgICAgICAgcmV0dXJuIFBoeXNpY2FsVGV4dHVyZVR5cGUuUEFDS0VEXzJYMl9GTE9BVDE2O1xuICAgIH1cbiAgICByZXR1cm4gUGh5c2ljYWxUZXh0dXJlVHlwZS5VTlBBQ0tFRF9GTE9BVDE2O1xufVxuZnVuY3Rpb24gZ2V0UGh5c2ljYWxGcm9tTG9naWNhbFRleHR1cmVUeXBlKGxvZ2ljYWxUZXhUeXBlLCBpc1BhY2tlZCkge1xuICAgIGlmIChsb2dpY2FsVGV4VHlwZSA9PT0gVGV4dHVyZVVzYWdlLlVQTE9BRCkge1xuICAgICAgICByZXR1cm4gUGh5c2ljYWxUZXh0dXJlVHlwZS5QQUNLRURfMlgyX0ZMT0FUMzI7XG4gICAgfVxuICAgIGVsc2UgaWYgKGxvZ2ljYWxUZXhUeXBlID09PSBUZXh0dXJlVXNhZ2UuUkVOREVSIHx8IGxvZ2ljYWxUZXhUeXBlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGdldFBoeXNpY2FsVGV4dHVyZUZvclJlbmRlcmluZyhpc1BhY2tlZCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGxvZ2ljYWxUZXhUeXBlID09PSBUZXh0dXJlVXNhZ2UuRE9XTkxPQUQgfHxcbiAgICAgICAgbG9naWNhbFRleFR5cGUgPT09IFRleHR1cmVVc2FnZS5QSVhFTFMpIHtcbiAgICAgICAgcmV0dXJuIFBoeXNpY2FsVGV4dHVyZVR5cGUuUEFDS0VEXzRYMV9VTlNJR05FRF9CWVRFO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbG9naWNhbCB0ZXh0dXJlIHR5cGUgJHtsb2dpY2FsVGV4VHlwZX1gKTtcbn1cbmZ1bmN0aW9uIGdldEtleUZyb21UZXh0dXJlU2hhcGUoc2hhcGVSb3dzQ29sLCBwaHlzaWNhbFRleFR5cGUsIGlzUGFja2VkKSB7XG4gICAgcmV0dXJuIGAke3NoYXBlUm93c0NvbFswXX1fJHtzaGFwZVJvd3NDb2xbMV19XyR7cGh5c2ljYWxUZXhUeXBlfV8ke2lzUGFja2VkfWA7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD10ZXh0dXJlX21hbmFnZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZ2V0Q29vcmRzRGF0YVR5cGUgfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5leHBvcnQgY2xhc3MgVGlsZVByb2dyYW0ge1xuICAgIGNvbnN0cnVjdG9yKGFTaGFwZSwgcmVwcykge1xuICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgICAgICAgY29uc3Qgb3V0cHV0U2hhcGUgPSBuZXcgQXJyYXkoYVNoYXBlLmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0cHV0U2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIG91dHB1dFNoYXBlW2ldID0gYVNoYXBlW2ldICogcmVwc1tpXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGU7XG4gICAgICAgIHRoaXMucmFuayA9IG91dHB1dFNoYXBlLmxlbmd0aDtcbiAgICAgICAgY29uc3QgZHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZSh0aGlzLnJhbmspO1xuICAgICAgICBjb25zdCBzb3VyY2VDb29yZHMgPSBnZXRTb3VyY2VDb29yZHMoYVNoYXBlKTtcbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgJHtkdHlwZX0gcmVzUkMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgc2V0T3V0cHV0KGdldEEoJHtzb3VyY2VDb29yZHN9KSk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRTb3VyY2VDb29yZHMoYVNoYXBlKSB7XG4gICAgY29uc3QgcmFuayA9IGFTaGFwZS5sZW5ndGg7XG4gICAgaWYgKHJhbmsgPiA1KSB7XG4gICAgICAgIHRocm93IEVycm9yKGBUaWxlIGZvciByYW5rICR7cmFua30gaXMgbm90IHlldCBzdXBwb3J0ZWRgKTtcbiAgICB9XG4gICAgaWYgKHJhbmsgPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGBpbW9kKHJlc1JDLCAke2FTaGFwZVswXX0pYDtcbiAgICB9XG4gICAgY29uc3QgY3VycmVudENvb3JkcyA9IFsncmVzUkMueCcsICdyZXNSQy55JywgJ3Jlc1JDLnonLCAncmVzUkMudycsICdyZXNSQy51J107XG4gICAgY29uc3Qgc291cmNlQ29vcmRzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhU2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc291cmNlQ29vcmRzLnB1c2goYGltb2QoJHtjdXJyZW50Q29vcmRzW2ldfSwgJHthU2hhcGVbaV19KWApO1xuICAgIH1cbiAgICByZXR1cm4gc291cmNlQ29vcmRzLmpvaW4oKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRpbGVfZ3B1LmpzLm1hcCIsIi8vIEJhc2VkIG9uIEFsZ29yaXRobSAyIG9mIEJpdG9uaWMgVG9wIEssIHJlZjpcbi8vIGh0dHBzOi8vYW5pbHNoYW5iaGFnLmluL3N0YXRpYy9wYXBlcnMvZ3B1dG9wa19zaWdtb2QxOC5wZGZcbi8vIFRoZSBvcmlnaW5hbCBhbGdvcml0aG0gaXMgYmFzZWQgb24gY29tcHV0aW5nIHRoZSB0b3AgSyBvbmx5LCBob3dldmVyXG4vLyBzaW5jZSBmb3IgVEZKUyB3ZSByZXF1aXJlIHRoZSBpbmRpY2VzIG9mIHRoZSB0b3AgSyB2YWx1ZXMgYXMgd2VsbCB0aGVuIHRoZVxuLy8gYWxnb3JpdGhtIGZvdW5kIGhlcmUgaXMgYSBiaXQgbW9kaWZpZWQuIFJhdGhlciB0aGFuIHByb2R1Y2luZyB0aGUgdmFsdWVzXG4vLyBhdCBlYWNoIHN0ZXAsIHRoZSBpbmRpY2VzIGNvbnRhaW5pbmcgdGhlIHRvcCBLIGFyZSBnZW5lcmF0ZWQgaW5zdGVhZC5cbi8vIFRoZSBvdXRwdXQgdmFsdWVzIGFyZSBub3QgZ2VuZXJhdGVkIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIG91dHB1dHMgaW4gdGhlXG4vLyBHUFUsIHRoZSB2YWx1ZXMgY2FuIGVhc2lseSBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgaW5kaWNlcyB1c2luZyBhIGdhdGhlclxuLy8gb3AuXG5leHBvcnQgY2xhc3MgU3dhcFByb2dyYW0ge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBzaGFwZSBkZXNpcmVkIG91dHB1dCBzaGFwZSAoY2FuIGJlIGxhcmdlciB0aGFuIGlucHV0IHNoYXBlLCBvdXRwdXRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgcGFkZGVkIHdpdGggLUluZmluaXR5KVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHNoYXBlKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsneCcsICdpbmRpY2VzJ107XG4gICAgICAgIC8vIHxufCBTaXplIG9mIHRoZSBvcmlnaW5hbCBpbnB1dCBvZiBUb3BLLlxuICAgICAgICAvLyB8Zmlyc3RQYXNzfGluZGljYXRlcyBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHN3YXAgaXMgYmVpbmcgdXNlZCB3aGljaFxuICAgICAgICAvLyBtZWFucyBubyBpbmRpY2VzIGlucHV0IGNvbnRhaW5pbmcgdGhlIHRvcCBLIGlzIHByZXNlbnQgeWV0LlxuICAgICAgICAvLyB8aW5jfCBTd2FwcyBwYWlycyBvZiBpbmRpY2VzICgwLCBpbmMpLCAoMSwgaW5jICsgMSksICgyLCBpbmMgKyAyKSAuLi5cbiAgICAgICAgdGhpcy5jdXN0b21Vbmlmb3JtcyA9IFtcbiAgICAgICAgICAgIHsgbmFtZTogJ24nLCB0eXBlOiAnaW50JyB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnZmlyc3RQYXNzJywgdHlwZTogJ2ludCcgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ25lZ2F0aXZlSW5mJywgdHlwZTogJ2Zsb2F0JyB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnZGlyJywgdHlwZTogJ2ludCcgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ2luYycsIHR5cGU6ICdpbnQnIH1cbiAgICAgICAgXTtcbiAgICAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IHNoYXBlO1xuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgIGl2ZWMyIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgaW50IGJhdGNoID0gY29vcmRzWzBdO1xuICAgICAgICAgaW50IGVsZW1JZHggPSBjb29yZHNbMV07XG5cbiAgICAgICAgIC8vIFdlIGNvbXBhcmUgZWxlbWVudHMgcGFpci13aXNlIHdpdGhpbiBhIGdyb3VwIG9mIHNpemUgMiAqIGluYy5cbiAgICAgICAgIC8vIFRoZSBjb21wYXJpbmcgcnVsZSBmb3IgZWFjaCBncm91cCBhbHRlcm5hdGVzIGJldHdlZW4gYXNjZW5kaW5nXG4gICAgICAgICAvLyBhbmQgZGVzY2VuZGluZy4gV2l0aGluIGVhY2ggZ3JvdXAsIHdlIGNvbXBhcmUgZWFjaCBwYWlyIGF0XG4gICAgICAgICAvLyBwb3NpdGlvbnMgaSBhbmQgaStpbmMuIFRvIGRlY2lkZSB3aGV0aGVyIGFuIGVsZW1lbnQgYXQgcG9zaXRpb24gaVxuICAgICAgICAgLy8gaXMgeDAgb3IgeDEsIHdlIG1vZCBpdCBieSAyICogaW5jLCBpZiB0aGUgcmVzdWx0IGlzIHNtYWxsZXIgdGhhblxuICAgICAgICAgLy8gaW5jLCBpdCBpcyBpbiB0aGUgZmlyc3QgaGFsZiBvZiB0aGUgZ3JvdXAsIHdlIGRlbm90ZSBpdCBhcyB4MCxcbiAgICAgICAgIC8vIG90aGVyd2lzZSB3ZSBkZW5vdGUgaXQgYXMgeDEuXG4gICAgICAgICAvLyBGb3IgZXhhbXBsZSwgYXMgc2hvd24gaW4gdGhlIEJpdG9uaWMgdG9wIEsgcGFwZXIgcmVmZXJlbmNlZCBhYm92ZSxcbiAgICAgICAgIC8vIEZpZ3VyZTUoYSkgc2hvd3MgdGhhdCBlbGVtZW50WzFdIGlzIGluIHRoZVxuICAgICAgICAgLy8gc2Vjb25kIGhhbGYgb2YgdGhlIGdyb3VwIHdoZW4gZ3JvdXAgc2l6ZSBpcyAyLCBidXQgaXQgaXMgaW4gdGhlXG4gICAgICAgICAvLyBmaXJzdCBoYWxmIG9mIHRoZSBncm91cCB3aGVuIGdyb3VwIHNpemUgaXMgNC5cblxuICAgICAgICAgYm9vbCBpc0ZpcnN0SW5QYWlyID0gaW1vZChlbGVtSWR4LCAyICogaW5jKSA8IGluYztcbiAgICAgICAgIGludCBpID0gaXNGaXJzdEluUGFpciA/IGVsZW1JZHggOiBlbGVtSWR4IC0gaW5jO1xuXG4gICAgICAgICBpbnQgaTAgPSBmaXJzdFBhc3MgPT0gMSA/IGkgOiBpbnQoZ2V0SW5kaWNlcyhiYXRjaCwgaSkpO1xuICAgICAgICAgaW50IGkxID0gZmlyc3RQYXNzID09IDEgPyBpICsgaW5jIDogaW50KGdldEluZGljZXMoYmF0Y2gsIGkgKyBpbmMpKTtcbiAgICAgICAgIGZsb2F0IHgwID0gaTAgPCBuID8gZ2V0WChiYXRjaCwgaTApIDogbmVnYXRpdmVJbmY7XG4gICAgICAgICBmbG9hdCB4MSA9IGkxIDwgbiA/IGdldFgoYmF0Y2gsIGkxKSA6IG5lZ2F0aXZlSW5mO1xuXG4gICAgICAgICAvLyBEZW5vdGVzIHdoaWNoIGRpcmVjdGlvbiBpbmRpY2VzIGFyZSBpbiAoYXNjZW5kaW5nIG9yIGRlc2NlbmRpbmcpLlxuICAgICAgICAgYm9vbCByZXZlcnNlID0gaW1vZChlbGVtSWR4LCAyICogZGlyKSA+PSBkaXI7XG4gICAgICAgICBib29sIGlzR3JlYXRlciA9IHgwID4geDEgfHwgKHgwID09IHgxICYmIGkxID4gaTApO1xuICAgICAgICAgaWYgKHJldmVyc2UgPT0gaXNHcmVhdGVyKSB7IC8vIEVsZW1lbnRzIGluIG9wcG9zaXRlIG9yZGVyIG9mIGRpcmVjdGlvblxuICAgICAgICAgICBpbnQgaVRlbXAgPSBpMDtcbiAgICAgICAgICAgaTAgPSBpMTtcbiAgICAgICAgICAgaTEgPSBpVGVtcDtcbiAgICAgICAgIH1cbiAgICAgICAgIGlmIChpc0ZpcnN0SW5QYWlyKSB7XG4gICAgICAgICAgICBzZXRPdXRwdXQoZmxvYXQoaTApKTtcbiAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXRPdXRwdXQoZmxvYXQoaTEpKTtcbiAgICAgICAgIH1cbiAgICAgICB9XG4gICAgIGA7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIE1lcmdlUHJvZ3JhbSB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHNoYXBlIGRlc2lyZWQgb3V0cHV0IHNoYXBlIChtdXN0IGJlIGhhbGYgb2YgdGhlIGlucHV0IHNpemUpXG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioc2hhcGUpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWyd4JywgJ2luZGljZXMnXTtcbiAgICAgICAgLy8gfG58IFNpemUgb2YgdGhlIG9yaWdpbmFsIGlucHV0IG9mIFRvcEtcbiAgICAgICAgLy8gfGZpcnN0UGFzc3wgaW5kaWNhdGVzIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgc3dhcCBpcyBiZWluZyB1c2VkIHdoaWNoXG4gICAgICAgIC8vIG1lYW5zIG5vIGluZGljZXMgaW5wdXQgY29udGFpbmluZyB0aGUgdG9wIEsgaXMgcHJlc2VudCB5ZXQuXG4gICAgICAgIC8vIHxrfCBUb3AgayBlbGVtZW50cyBkZXNpcmVkXG4gICAgICAgIHRoaXMuY3VzdG9tVW5pZm9ybXMgPSBbXG4gICAgICAgICAgICB7IG5hbWU6ICduJywgdHlwZTogJ2ludCcgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ2ZpcnN0UGFzcycsIHR5cGU6ICdpbnQnIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdrJywgdHlwZTogJ2ludCcgfVxuICAgICAgICBdO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gc2hhcGU7XG4gICAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgLy8gVGFrZXMgbWF4IG9mIGluZGljZXMgKDAsIGspLCAoMSwgayArIDEpLCAoMiwgayArIDIpIC4uLlxuICAgICAgICAgaXZlYzIgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHNbMF07XG4gICAgICAgICBpbnQgZWxlbUlkeCA9IGNvb3Jkc1sxXTtcblxuICAgICAgICAgLy8gVGhlIG91dHB1dCBzaXplIGlzIGhhbGYgb2YgdGhlIHByZXZpb3VzIHNpemUuXG4gICAgICAgICAvLyBJZiB0aGUgcHJldmlvdXMgc2VxdWVuY2UgaXMgfCB8IHwgfCBfIF8gXyBfICB8IHwgfCB8ICBfIF8gXyBfIChrPTQpLFxuICAgICAgICAgLy8gd2Ugb25seSBuZWVkIHRvIG91dHB1dCB0aGUgaW5kaWNlcyBhdCBwb3NpdGlvbnMgfCwgdGhlIGluZGljZXMgYXRcbiAgICAgICAgIC8vIHBvc2l0aW9ucyBfIGNhbiBiZSB0aHJvd24gYXdheSwgc2VlIEZpZ3VyZTUoYikgQWZ0ZXIgUGhhc2UgMlxuICAgICAgICAgLy8gKE1lcmdlIHBoYXNlKSBpbiB0aGUgQml0b25pYyBUb3AgSyBwYXBlciByZWZlcmVuY2VkIGFib3ZlLlxuICAgICAgICAgLy8gRm9yIGV4YW1wbGUsIHRoZSBwYXBlciBzaG93cyB3ZSBvbmx5IG5lZWQgdG8gb3V0cHV0IHRoZSBvcmFuZ2UgYmFycy5cbiAgICAgICAgIC8vIFRoZSBvdXRwdXQgc2VxdWVuY2Ugc2hvdWxkIGxvb2sgbGlrZSB0aGlzIHwgfCB8IHwgfCB8IHwgfC5cbiAgICAgICAgIC8vIEJlY2F1c2UgdGhlIHNlcXVlbmNlIGlzIGhhbHZlZCwgdG8gbWFwIHRoZSBvdXRwdXQgaW5kZXggYmFja1xuICAgICAgICAgLy8gdG8gdGhlIHByZXZpb3VzIHNlcXVlbmNlIHRvIGZpbmQgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUsXG4gICAgICAgICAvLyB3ZSBuZWVkIHRvIGRvdWJsZSB0aGUgaW5kZXguIFdoZW4gd2UgZG91YmxlIHRoZSBpbmRleCxcbiAgICAgICAgIC8vIHdlIGJhc2ljYWxseSBpbnRlcnBvbGF0ZSBhIHBvc2l0aW9uLCBzbyAyaSBsb29rcyBsaWtlXG4gICAgICAgICAvLyB8IF8gfCBfIHwgXyB8IF8gfCBfIHwgXyB8IF8uIFdlIG1vdmUgdGhlIHwgdG8gdGhlIGZpcnN0IGsgcG9zaXRpb25cbiAgICAgICAgIC8vIG9mIGVhY2ggMmsgcG9zaXRpb25zIGJ5IC0gZWxlbUlkeCAlIGsuIEUuZy4gZm9yIG91dHB1dCBhdFxuICAgICAgICAgLy8gaW5kZXggNCw1LDYsNywgd2Ugd2FudCB0byBnZXQgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBhdFxuICAgICAgICAgLy8gb3JpZ2luYWwgaW5kZXggOCw5LDEwLDExLCBmb3Igb3V0cHV0IGF0IGluZGV4IDgsOSwxMCwxMSxcbiAgICAgICAgIC8vIHdlIHdhbnQgdG8gZ2V0IHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgYXQgb3JpZ2luYWwgaW5kZXhcbiAgICAgICAgIC8vIDE2LDE3LDE4LDE5LCBzbyBvbiBhbmQgc28gZm9ydGguXG5cbiAgICAgICAgIGludCBpID0gZWxlbUlkeCA8IGsgPyBlbGVtSWR4IDogKGVsZW1JZHggKiAyIC0gaW1vZChlbGVtSWR4LCBrKSk7XG4gICAgICAgICBpbnQgaTAgPSBmaXJzdFBhc3MgPT0gMSA/IGkgOiBpbnQoZ2V0SW5kaWNlcyhiYXRjaCwgaSkpO1xuICAgICAgICAgaW50IGkxID0gZmlyc3RQYXNzID09IDEgPyBpICsgayA6IGludChnZXRJbmRpY2VzKGJhdGNoLCBpICsgaykpO1xuXG4gICAgICAgICBmbG9hdCB4MCA9IGdldFgoYmF0Y2gsIGkwKTtcbiAgICAgICAgIGZsb2F0IHgxID0gaTEgPCBuID8gZ2V0WChiYXRjaCwgaTEpIDogeDA7XG5cbiAgICAgICAgIHNldE91dHB1dCh4MCA+PSB4MSA/IGZsb2F0KGkwKSA6IGZsb2F0KGkxKSk7XG4gICAgICAgfVxuICAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRvcF9rX2dwdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5leHBvcnQgY2xhc3MgVHJhbnNmb3JtUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIGludGVycG9sYXRpb24sIGZpbGxNb2RlLCBmaWxsVmFsdWUsIG91dFNoYXBlKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsnSW1hZ2UnLCAnVHJhbnNmb3JtcyddO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gb3V0U2hhcGU7XG4gICAgICAgIGNvbnN0IGludGVycG9sYXRpb25Nb2RlSWQgPSBpbnRlcnBvbGF0aW9uID09PSAnbmVhcmVzdCcgPyAxIDogMjtcbiAgICAgICAgbGV0IGZpbGxNb2RlSWQ7XG4gICAgICAgIHN3aXRjaCAoZmlsbE1vZGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2NvbnN0YW50JzpcbiAgICAgICAgICAgICAgICBmaWxsTW9kZUlkID0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3JlZmxlY3QnOlxuICAgICAgICAgICAgICAgIGZpbGxNb2RlSWQgPSAyO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnd3JhcCc6XG4gICAgICAgICAgICAgICAgZmlsbE1vZGVJZCA9IDM7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICduZWFyZXN0JzpcbiAgICAgICAgICAgICAgICBmaWxsTW9kZUlkID0gNDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgZmlsbE1vZGVJZCA9IDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICAgICAgIGZsb2F0IG1hcENvb3JkKGZsb2F0IG91dENvb3JkLCBmbG9hdCBsZW4pIHtcbiAgICAgICAgICAgICAgZmxvYXQgaW5Db29yZCA9IG91dENvb3JkO1xuICAgICAgICAgICAgICBpZigke2ZpbGxNb2RlSWR9ID09IDIpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5Db29yZCA8IDAuMCkge1xuICAgICAgICAgICAgICAgICAgaWYgKGxlbiA8PSAxLjApIHtcbiAgICAgICAgICAgICAgICAgICAgaW5Db29yZCA9IDAuMDtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZsb2F0IHN6MiA9IDIuMCAqIGxlbjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluQ29vcmQgPCBzejIpIHtcbiAgICAgICAgICAgICAgICAgICAgICBpbkNvb3JkID0gc3oyICogZmxvYXQoaW50KGZsb2F0KC1pbkNvb3JkIC8gc3oyKSkpICtcbiAgICAgICAgICAgICAgICAgICAgICBpbkNvb3JkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGluQ29vcmQgPSBpbkNvb3JkIDwgLWxlbiA/IGluQ29vcmQgKyBzejIgOiAtaW5Db29yZCAtIDEuMDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluQ29vcmQgPiBsZW4gLSAxLjApIHtcbiAgICAgICAgICAgICAgICAgIGlmIChsZW4gPD0gMS4wKSB7XG4gICAgICAgICAgICAgICAgICAgIGluQ29vcmQgPSAwLjA7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmbG9hdCBzejIgPSAyLjAgKiBsZW47XG4gICAgICAgICAgICAgICAgICAgIGluQ29vcmQgLT0gc3oyICogZmxvYXQoaW50KGZsb2F0KGluQ29vcmQgLyBzejIpKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbkNvb3JkID49IGxlbikge1xuICAgICAgICAgICAgICAgICAgICAgIGluQ29vcmQgPSBzejIgLSBpbkNvb3JkIC0gMS4wO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjbGFtcChpbkNvb3JkLCAwLjAsIGxlbiAtIDEuMCk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoJHtmaWxsTW9kZUlkfSA9PSAzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGluQ29vcmQgPCAwLjApIHtcbiAgICAgICAgICAgICAgICAgIGlmIChsZW4gPD0gMS4wKSB7XG4gICAgICAgICAgICAgICAgICAgIGluQ29vcmQgPSAwLjA7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmbG9hdCBzeiA9IGxlbiAtIDEuMDtcbiAgICAgICAgICAgICAgICAgICAgaW5Db29yZCArPSBsZW4gKiAoZmxvYXQoaW50KGZsb2F0KC1pbkNvb3JkIC8gc3opKSkgKyAxLjApO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5Db29yZCA+IGxlbiAtIDEuMCkge1xuICAgICAgICAgICAgICAgICAgaWYgKGxlbiA8PSAxLjApIHtcbiAgICAgICAgICAgICAgICAgICAgaW5Db29yZCA9IDAuMDtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZsb2F0IHN6ID0gbGVuIC0gMS4wO1xuICAgICAgICAgICAgICAgICAgICBpbkNvb3JkIC09IGxlbiAqIGZsb2F0KGludChmbG9hdChpbkNvb3JkIC8gc3opKSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjbGFtcChpbkNvb3JkLCAwLjAsIGxlbiAtIDEuMCk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoJHtmaWxsTW9kZUlkfSA9PSA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNsYW1wKG91dENvb3JkLCAwLjAsIGxlbiAtIDEuMCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG91dENvb3JkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZsb2F0IHJlYWRXaXRoRmlsbFZhbHVlKGludCBiYXRjaCwgaW50IGNvb3JkWSwgaW50IGNvb3JkWCxcbiAgICAgICAgICAgICAgaW50IGNoYW5uZWwpIHtcbiAgICAgICAgICAgICAgZmxvYXQgb3V0cHV0VmFsdWU7XG4gICAgICAgICAgICAgIGlmICgwIDw9IGNvb3JkWSAmJiBjb29yZFkgPCAke2ltYWdlSGVpZ2h0fSAmJiAwIDw9IGNvb3JkWCAmJiBjb29yZFggPCAke2ltYWdlV2lkdGh9KSB7XG4gICAgICAgICAgICAgICAgICBvdXRwdXRWYWx1ZSA9IGdldEltYWdlKGJhdGNoLCBjb29yZFksIGNvb3JkWCwgY2hhbm5lbCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0VmFsdWUgPSBmbG9hdCgke2ZpbGxWYWx1ZX0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBvdXRwdXRWYWx1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgICAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgICAgICAgZmxvYXQgb3V0cHV0VmFsdWU7XG4gICAgICAgICAgICAgIGludCBiYXRjaCA9IGNvb3Jkc1swXTtcbiAgICAgICAgICAgICAgaW50IHggPSBjb29yZHNbMl07XG4gICAgICAgICAgICAgIGludCB5ID0gY29vcmRzWzFdO1xuICAgICAgICAgICAgICBpbnQgY2hhbm5lbCA9IGNvb3Jkc1szXTtcbiAgICAgICAgICAgICAgZmxvYXQgeGYgPSBmbG9hdCh4KTtcbiAgICAgICAgICAgICAgZmxvYXQgeWYgPSBmbG9hdCh5KTtcbiAgICAgICAgICAgICAgZmxvYXQgYTEgPSBnZXRUcmFuc2Zvcm1zKGJhdGNoLCAwKTtcbiAgICAgICAgICAgICAgZmxvYXQgYTIgPSBnZXRUcmFuc2Zvcm1zKGJhdGNoLCAxKTtcbiAgICAgICAgICAgICAgZmxvYXQgYTMgPSBnZXRUcmFuc2Zvcm1zKGJhdGNoLCAyKTtcbiAgICAgICAgICAgICAgZmxvYXQgYjEgPSBnZXRUcmFuc2Zvcm1zKGJhdGNoLCAzKTtcbiAgICAgICAgICAgICAgZmxvYXQgYjIgPSBnZXRUcmFuc2Zvcm1zKGJhdGNoLCA0KTtcbiAgICAgICAgICAgICAgZmxvYXQgYjMgPSBnZXRUcmFuc2Zvcm1zKGJhdGNoLCA1KTtcbiAgICAgICAgICAgICAgZmxvYXQgYzEgPSBnZXRUcmFuc2Zvcm1zKGJhdGNoLCA2KTtcbiAgICAgICAgICAgICAgZmxvYXQgYzIgPSBnZXRUcmFuc2Zvcm1zKGJhdGNoLCA3KTtcbiAgICAgICAgICAgICAgZmxvYXQgcHJvamVjdGlvbiA9IGMxICogeGYgKyBjMiAqIHlmICsgMS4wO1xuICAgICAgICAgICAgICBpZiAocHJvamVjdGlvbiA9PSAwLjApIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRWYWx1ZSA9IGZsb2F0KCR7ZmlsbFZhbHVlfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZmxvYXQgaW5YID0gKGExICogeGYgKyBhMiAqIHlmICsgYTMpIC8gcHJvamVjdGlvbjtcbiAgICAgICAgICAgICAgICBmbG9hdCBpblkgPSAoYjEgKiB4ZiArIGIyICogeWYgKyBiMykgLyBwcm9qZWN0aW9uO1xuICAgICAgICAgICAgICAgIGZsb2F0IG1hcFggPSBtYXBDb29yZChpblgsIGZsb2F0KCR7aW1hZ2VXaWR0aH0pKTtcbiAgICAgICAgICAgICAgICBmbG9hdCBtYXBZID0gbWFwQ29vcmQoaW5ZLCBmbG9hdCgke2ltYWdlSGVpZ2h0fSkpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCR7aW50ZXJwb2xhdGlvbk1vZGVJZH0gPT0gMSkge1xuICAgICAgICAgICAgICAgICAgaW50IGNvb3JkWSA9IGludChyb3VuZChtYXBZKSk7XG4gICAgICAgICAgICAgICAgICBpbnQgY29vcmRYID0gaW50KHJvdW5kKG1hcFgpKTtcbiAgICAgICAgICAgICAgICAgIG91dHB1dFZhbHVlID0gcmVhZFdpdGhGaWxsVmFsdWUoYmF0Y2gsIGNvb3JkWSwgY29vcmRYLFxuICAgICAgICAgICAgICAgICAgICBjaGFubmVsKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgZmxvYXQgeUZsb29yID0gZmxvb3IobWFwWSk7XG4gICAgICAgICAgICAgICAgICBmbG9hdCB4Rmxvb3IgPSBmbG9vcihtYXBYKTtcbiAgICAgICAgICAgICAgICAgIGZsb2F0IHlDZWlsID0geUZsb29yICsgMS4wO1xuICAgICAgICAgICAgICAgICAgZmxvYXQgeENlaWwgPSB4Rmxvb3IgKyAxLjA7XG4gICAgICAgICAgICAgICAgICBmbG9hdCB2YWx1ZVlGbG9vciA9ICh4Q2VpbCAtIG1hcFgpICpcbiAgICAgICAgICAgICAgICAgIHJlYWRXaXRoRmlsbFZhbHVlKGJhdGNoLCBpbnQoeUZsb29yKSwgaW50KHhGbG9vciksIGNoYW5uZWwpICtcbiAgICAgICAgICAgICAgICAgIChtYXBYIC0geEZsb29yKSAqXG4gICAgICAgICAgICAgICAgICByZWFkV2l0aEZpbGxWYWx1ZShiYXRjaCwgaW50KHlGbG9vciksIGludCh4Q2VpbCksIGNoYW5uZWwpO1xuICAgICAgICAgICAgICAgICAgZmxvYXQgdmFsdWVZQ2VpbCA9ICh4Q2VpbCAtIG1hcFgpICpcbiAgICAgICAgICAgICAgICAgIHJlYWRXaXRoRmlsbFZhbHVlKGJhdGNoLCBpbnQoeUNlaWwpLCBpbnQoeEZsb29yKSwgY2hhbm5lbCkgK1xuICAgICAgICAgICAgICAgICAgKG1hcFggLSB4Rmxvb3IpICpcbiAgICAgICAgICAgICAgICAgIHJlYWRXaXRoRmlsbFZhbHVlKGJhdGNoLCBpbnQoeUNlaWwpLCBpbnQoeENlaWwpLCBjaGFubmVsKTtcbiAgICAgICAgICAgICAgICAgIG91dHB1dFZhbHVlID0gKHlDZWlsIC0gbWFwWSkgKiB2YWx1ZVlGbG9vciArXG4gICAgICAgICAgICAgICAgICAobWFwWSAtIHlGbG9vcikgKiB2YWx1ZVlDZWlsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzZXRPdXRwdXQob3V0cHV0VmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRyYW5zZm9ybV9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZ2V0Q29vcmRzRGF0YVR5cGUgfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5leHBvcnQgY2xhc3MgVHJhbnNwb3NlUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoYVNoYXBlLCBuZXdEaW0pIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWydBJ107XG4gICAgICAgIGNvbnN0IG91dHB1dFNoYXBlID0gbmV3IEFycmF5KGFTaGFwZS5sZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dHB1dFNoYXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBvdXRwdXRTaGFwZVtpXSA9IGFTaGFwZVtuZXdEaW1baV1dO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICAgICAgdGhpcy5yYW5rID0gb3V0cHV0U2hhcGUubGVuZ3RoO1xuICAgICAgICBjb25zdCBkdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHRoaXMucmFuayk7XG4gICAgICAgIGNvbnN0IHN3aXRjaGVkID0gZ2V0U3dpdGNoZWRDb29yZHMobmV3RGltKTtcbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICB2b2lkIG1haW4oKSB7XG4gICAgICAke2R0eXBlfSByZXNSQyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgc2V0T3V0cHV0KGdldEEoJHtzd2l0Y2hlZH0pKTtcbiAgICB9XG4gICAgYDtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRTd2l0Y2hlZENvb3JkcyhuZXdEaW0pIHtcbiAgICBjb25zdCByYW5rID0gbmV3RGltLmxlbmd0aDtcbiAgICBpZiAocmFuayA+IDYpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoYFRyYW5zcG9zZSBmb3IgcmFuayAke3Jhbmt9IGlzIG5vdCB5ZXQgc3VwcG9ydGVkYCk7XG4gICAgfVxuICAgIGNvbnN0IG9yaWdpbmFsT3JkZXIgPSBbJ3Jlc1JDLngnLCAncmVzUkMueScsICdyZXNSQy56JywgJ3Jlc1JDLncnLCAncmVzUkMudScsICdyZXNSQy52J107XG4gICAgY29uc3Qgc3dpdGNoZWRDb29yZHMgPSBuZXcgQXJyYXkocmFuayk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdEaW0ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc3dpdGNoZWRDb29yZHNbbmV3RGltW2ldXSA9IG9yaWdpbmFsT3JkZXJbaV07XG4gICAgfVxuICAgIHJldHVybiBzd2l0Y2hlZENvb3Jkcy5qb2luKCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD10cmFuc3Bvc2VfZ3B1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGdldFZlY0NoYW5uZWxzIH0gZnJvbSAnLi9wYWNraW5nX3V0aWwnO1xuaW1wb3J0IHsgZ2V0Q29vcmRzRGF0YVR5cGUgfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5leHBvcnQgY2xhc3MgVHJhbnNwb3NlUGFja2VkUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoYVNoYXBlLCBuZXdEaW0pIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWydBJ107XG4gICAgICAgIHRoaXMucGFja2VkSW5wdXRzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wYWNrZWRPdXRwdXQgPSB0cnVlO1xuICAgICAgICBjb25zdCBvdXRwdXRTaGFwZSA9IG5ldyBBcnJheShhU2hhcGUubGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRwdXRTaGFwZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgb3V0cHV0U2hhcGVbaV0gPSBhU2hhcGVbbmV3RGltW2ldXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGU7XG4gICAgICAgIHRoaXMucmFuayA9IG91dHB1dFNoYXBlLmxlbmd0aDtcbiAgICAgICAgaWYgKHRoaXMucmFuayA+IDYpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKGBQYWNrZWQgdHJhbnNwb3NlIGZvciByYW5rICR7dGhpcy5yYW5rfSBpcyBub3QgeWV0IHN1cHBvcnRlZC5gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHRoaXMucmFuayk7XG4gICAgICAgIGNvbnN0IG91dHB1dE9yZGVyID0gZ2V0VmVjQ2hhbm5lbHMoJ3JjJywgdGhpcy5yYW5rKTtcbiAgICAgICAgY29uc3Qgc3dpdGNoZWRPcmRlciA9IG5ldyBBcnJheSh0aGlzLnJhbmspO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld0RpbS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgc3dpdGNoZWRPcmRlcltuZXdEaW1baV1dID0gb3V0cHV0T3JkZXJbaV07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5uZXJEaW1zID0gYHZlYzIoJHtzd2l0Y2hlZE9yZGVyLnNsaWNlKC0yKS5qb2luKCl9KWA7XG4gICAgICAgIGNvbnN0IG5leHRDb2x1bW4gPSBgKyske291dHB1dE9yZGVyW3RoaXMucmFuayAtIDFdfSA8ICR7b3V0cHV0U2hhcGVbdGhpcy5yYW5rIC0gMV19YDtcbiAgICAgICAgY29uc3QgZ2V0YyA9IGBnZXRDaGFubmVsKGdldEEoJHtzd2l0Y2hlZE9yZGVyLmpvaW4oKX0pLCAke2lubmVyRGltc30pYDtcbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICB2b2lkIG1haW4oKSB7XG4gICAgICAke2R0eXBlfSByYyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgdmVjNCByZXN1bHQgPSB2ZWM0KDAuKTtcbiAgICAgIHJlc3VsdFswXSA9ICR7Z2V0Y307XG4gICAgICBpZigke25leHRDb2x1bW59KSB7XG4gICAgICAgIHJlc3VsdFsxXSA9ICR7Z2V0Y307XG4gICAgICB9XG4gICAgICAtLSR7b3V0cHV0T3JkZXJbdGhpcy5yYW5rIC0gMV19O1xuICAgICAgaWYoKyske291dHB1dE9yZGVyW3RoaXMucmFuayAtIDJdfSA8ICR7b3V0cHV0U2hhcGVbdGhpcy5yYW5rIC0gMl19KSB7XG4gICAgICAgIHJlc3VsdFsyXSA9ICR7Z2V0Y307XG4gICAgICAgIGlmKCR7bmV4dENvbHVtbn0pIHtcbiAgICAgICAgICByZXN1bHRbM10gPSAke2dldGN9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzZXRPdXRwdXQocmVzdWx0KTtcbiAgICB9XG4gICAgYDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD10cmFuc3Bvc2VfcGFja2VkX2dwdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyB1c2VTaGFwZVVuaWZvcm1zIH0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmV4cG9ydCBjbGFzcyBVbmFyeU9wUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoYVNoYXBlLCBvcFNuaXBwZXQpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWydBJ107XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBhU2hhcGU7XG4gICAgICAgIHRoaXMuZW5hYmxlU2hhcGVVbmlmb3JtcyA9IHVzZVNoYXBlVW5pZm9ybXModGhpcy5vdXRwdXRTaGFwZS5sZW5ndGgpO1xuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgZmxvYXQgdW5hcnlPcGVyYXRpb24oZmxvYXQgeCkge1xuICAgICAgICAke29wU25pcHBldH1cbiAgICAgIH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBmbG9hdCB4ID0gZ2V0QUF0T3V0Q29vcmRzKCk7XG4gICAgICAgIGZsb2F0IHkgPSB1bmFyeU9wZXJhdGlvbih4KTtcblxuICAgICAgICBzZXRPdXRwdXQoeSk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgQ0hFQ0tfTkFOX1NOSVBQRVQgPSBgaWYgKGlzbmFuKHgpKSByZXR1cm4geDtgO1xuZXhwb3J0IGNvbnN0IExJTkVBUiA9IGByZXR1cm4geDtgO1xuZXhwb3J0IGNvbnN0IEFCUyA9IGByZXR1cm4gYWJzKHgpO2A7XG5leHBvcnQgZnVuY3Rpb24gU1RFUChhbHBoYSA9IDAuMCkge1xuICAgIHJldHVybiBDSEVDS19OQU5fU05JUFBFVCArIGBcbiAgICByZXR1cm4geCA+IDAuMCA/IDEuMCA6IGZsb2F0KCR7YWxwaGF9KTtcbiAgYDtcbn1cbmV4cG9ydCBjb25zdCBFTFUgPSBgcmV0dXJuICh4ID49IDAuMCkgPyB4IDogKGV4cCh4KSAtIDEuMCk7YDtcbmV4cG9ydCBjb25zdCBSRUxVID0gQ0hFQ0tfTkFOX1NOSVBQRVQgKyBgXG4gIHJldHVybiAoeCA8IDAuMCkgPyAwLjAgOiB4O1xuYDtcbmV4cG9ydCBjb25zdCBSRUxVNiA9IENIRUNLX05BTl9TTklQUEVUICsgYFxuICByZXR1cm4gKHggPCAwLjApID8gMC4wIDogbWluKDYuMCwgeCk7XG5gO1xuZXhwb3J0IGNvbnN0IENMT05FID0gJ3JldHVybiB4Oyc7XG5leHBvcnQgY29uc3QgU0lHTU9JRCA9IGByZXR1cm4gMS4wIC8gKDEuMCArIGV4cCgtMS4wICogeCkpO2A7XG4vLyMgc291cmNlTWFwcGluZ1VSTD11bmFyeW9wX2dwdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyB1c2VTaGFwZVVuaWZvcm1zIH0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmV4cG9ydCBjb25zdCBMSU5FQVIgPSBgcmV0dXJuIHg7YDtcbmV4cG9ydCBjb25zdCBFTFUgPSBgXG4gIHZlYzQgcmVzdWx0O1xuXG4gIHJlc3VsdC5yID0gKHguciA+PSAwLjApID8geC5yIDogKGV4cCh4LnIpIC0gMS4wKTtcbiAgcmVzdWx0LmcgPSAoeC5nID49IDAuMCkgPyB4LmcgOiAoZXhwKHguZykgLSAxLjApO1xuICByZXN1bHQuYiA9ICh4LmIgPj0gMC4wKSA/IHguYiA6IChleHAoeC5iKSAtIDEuMCk7XG4gIHJlc3VsdC5hID0gKHguYSA+PSAwLjApID8geC5hIDogKGV4cCh4LmEpIC0gMS4wKTtcblxuICByZXR1cm4gcmVzdWx0O1xuYDtcbmV4cG9ydCBjb25zdCBSRUxVID0gYFxuICB2ZWM0IHJlc3VsdCA9IHggKiB2ZWM0KGdyZWF0ZXJUaGFuRXF1YWwoeCwgdmVjNCgwLjApKSk7XG4gIGJ2ZWM0IGlzTmFOID0gaXNuYW4oeCk7XG5cbiAgcmVzdWx0LnIgPSBpc05hTi5yID8geC5yIDogcmVzdWx0LnI7XG4gIHJlc3VsdC5nID0gaXNOYU4uZyA/IHguZyA6IHJlc3VsdC5nO1xuICByZXN1bHQuYiA9IGlzTmFOLmIgPyB4LmIgOiByZXN1bHQuYjtcbiAgcmVzdWx0LmEgPSBpc05hTi5hID8geC5hIDogcmVzdWx0LmE7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbmA7XG5leHBvcnQgY29uc3QgUkVMVTYgPSBgXG4gIHZlYzQgcmVzdWx0ID0gbWluKHgsIHZlYzQoNi4pKSAqIHZlYzQoZ3JlYXRlclRoYW5FcXVhbCh4LCB2ZWM0KDAuMCkpKTtcbiAgYnZlYzQgaXNOYU4gPSBpc25hbih4KTtcblxuICByZXN1bHQuciA9IGlzTmFOLnIgPyB4LnIgOiByZXN1bHQucjtcbiAgcmVzdWx0LmcgPSBpc05hTi5nID8geC5nIDogcmVzdWx0Lmc7XG4gIHJlc3VsdC5iID0gaXNOYU4uYiA/IHguYiA6IHJlc3VsdC5iO1xuICByZXN1bHQuYSA9IGlzTmFOLmEgPyB4LmEgOiByZXN1bHQuYTtcblxuICByZXR1cm4gcmVzdWx0O1xuYDtcbmV4cG9ydCBjb25zdCBTSUdNT0lEID0gYHJldHVybiAxLjAgLyAoMS4wICsgZXhwKC0xLjAgKiB4KSk7YDtcbmV4cG9ydCBjbGFzcyBVbmFyeU9wUGFja2VkUHJvZ3JhbSB7XG4gICAgY29uc3RydWN0b3IoYVNoYXBlLCBvcFNuaXBwZXQpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWydBJ107XG4gICAgICAgIHRoaXMucGFja2VkSW5wdXRzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wYWNrZWRPdXRwdXQgPSB0cnVlO1xuICAgICAgICB0aGlzLm91dHB1dFNoYXBlID0gYVNoYXBlO1xuICAgICAgICB0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMgPSB1c2VTaGFwZVVuaWZvcm1zKHRoaXMub3V0cHV0U2hhcGUubGVuZ3RoKTtcbiAgICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZlYzQgdW5hcnlPcGVyYXRpb24odmVjNCB4KSB7XG4gICAgICAgICR7b3BTbmlwcGV0fVxuICAgICAgfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIHZlYzQgeCA9IGdldEFBdE91dENvb3JkcygpO1xuICAgICAgICB2ZWM0IHkgPSB1bmFyeU9wZXJhdGlvbih4KTtcblxuICAgICAgICBzZXRPdXRwdXQoeSk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11bmFyeW9wX3BhY2tlZF9ncHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZ2V0Q2hhbm5lbHMsIGdldFNvdXJjZUNvb3JkcyB9IGZyb20gJy4vcGFja2luZ191dGlsJztcbmltcG9ydCB7IGdldENvb3Jkc0RhdGFUeXBlIH0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuZXhwb3J0IGNsYXNzIFVucGFja1Byb2dyYW0ge1xuICAgIGNvbnN0cnVjdG9yKG91dHB1dFNoYXBlKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICAgICAgICB0aGlzLnBhY2tlZElucHV0cyA9IHRydWU7XG4gICAgICAgIHRoaXMucGFja2VkT3V0cHV0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICAgICAgY29uc3QgcmFuayA9IG91dHB1dFNoYXBlLmxlbmd0aDtcbiAgICAgICAgY29uc3QgY2hhbm5lbHMgPSBnZXRDaGFubmVscygncmMnLCByYW5rKTtcbiAgICAgICAgY29uc3QgZHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShyYW5rKTtcbiAgICAgICAgY29uc3Qgc291cmNlQ29vcmRzID0gZ2V0U291cmNlQ29vcmRzKHJhbmssIGNoYW5uZWxzKTtcbiAgICAgICAgY29uc3QgaW5uZXJEaW1zID0gY2hhbm5lbHMuc2xpY2UoLTIpO1xuICAgICAgICBjb25zdCBjb29yZHMgPSByYW5rIDw9IDEgPyAncmMnIDogYHZlYzIoJHtpbm5lckRpbXMuam9pbignLCcpfSlgO1xuICAgICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke2R0eXBlfSByYyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICB2ZWM0IHBhY2tlZElucHV0ID0gZ2V0QSgke3NvdXJjZUNvb3Jkc30pO1xuXG4gICAgICAgIHNldE91dHB1dChnZXRDaGFubmVsKHBhY2tlZElucHV0LCAke2Nvb3Jkc30pKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVucGFja19ncHUuanMubWFwIiwiLyoqIEBsaWNlbnNlIFNlZSB0aGUgTElDRU5TRSBmaWxlLiAqL1xuLy8gVGhpcyBjb2RlIGlzIGF1dG8tZ2VuZXJhdGVkLCBkbyBub3QgbW9kaWZ5IHRoaXMgZmlsZSFcbmNvbnN0IHZlcnNpb24gPSAnMy44LjAnO1xuZXhwb3J0IHsgdmVyc2lvbiB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dmVyc2lvbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBlbnYgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0ICogYXMgZ3BncHVfdXRpbCBmcm9tICcuL2dwZ3B1X3V0aWwnO1xuaW1wb3J0ICogYXMgd2ViZ2xfdXRpbCBmcm9tICcuL3dlYmdsX3V0aWwnO1xuZXhwb3J0IHsgTWF0aEJhY2tlbmRXZWJHTCB9IGZyb20gJy4vYmFja2VuZF93ZWJnbCc7XG5leHBvcnQgeyBzZXRXZWJHTENvbnRleHQgfSBmcm9tICcuL2NhbnZhc191dGlsJztcbmV4cG9ydCB7IEdQR1BVQ29udGV4dCB9IGZyb20gJy4vZ3BncHVfY29udGV4dCc7XG4vLyBXZWJHTCBzcGVjaWZpYyB1dGlscy5cbmV4cG9ydCB7IGdwZ3B1X3V0aWwsIHdlYmdsX3V0aWwgfTtcbi8qKlxuICogRW5mb3JjZSB1c2Ugb2YgaGFsZiBwcmVjaXNpb24gdGV4dHVyZXMgaWYgYXZhaWxhYmxlIG9uIHRoZSBwbGF0Zm9ybS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnRW52aXJvbm1lbnQnLCBuYW1lc3BhY2U6ICd3ZWJnbCd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JjZUhhbGZGbG9hdCgpIHtcbiAgICBlbnYoKS5zZXQoJ1dFQkdMX0ZPUkNFX0YxNl9URVhUVVJFUycsIHRydWUpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d2ViZ2wuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZW52LCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGdldFdlYkdMQ29udGV4dCB9IGZyb20gJy4vY2FudmFzX3V0aWwnO1xuaW1wb3J0IHsgZ2V0VGV4dHVyZUNvbmZpZyB9IGZyb20gJy4vdGV4X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGxBbmRDaGVjayhnbCwgZnVuYykge1xuICAgIGNvbnN0IHJldHVyblZhbHVlID0gZnVuYygpO1xuICAgIGlmIChlbnYoKS5nZXRCb29sKCdERUJVRycpKSB7XG4gICAgICAgIGNoZWNrV2ViR0xFcnJvcihnbCk7XG4gICAgfVxuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbn1cbmZ1bmN0aW9uIGNoZWNrV2ViR0xFcnJvcihnbCkge1xuICAgIGNvbnN0IGVycm9yID0gZ2wuZ2V0RXJyb3IoKTtcbiAgICBpZiAoZXJyb3IgIT09IGdsLk5PX0VSUk9SKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignV2ViR0wgRXJyb3I6ICcgKyBnZXRXZWJHTEVycm9yTWVzc2FnZShnbCwgZXJyb3IpKTtcbiAgICB9XG59XG4vLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IYWxmLXByZWNpc2lvbl9mbG9hdGluZy1wb2ludF9mb3JtYXRcbmNvbnN0IE1JTl9GTE9BVDE2ID0gNS45NmUtODtcbmNvbnN0IE1BWF9GTE9BVDE2ID0gNjU1MDQ7XG5leHBvcnQgZnVuY3Rpb24gY2FuQmVSZXByZXNlbnRlZChudW0pIHtcbiAgICBpZiAoZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUkVOREVSX0ZMT0FUMzJfRU5BQkxFRCcpIHx8IG51bSA9PT0gMCB8fFxuICAgICAgICAoTUlOX0ZMT0FUMTYgPCBNYXRoLmFicyhudW0pICYmIE1hdGguYWJzKG51bSkgPCBNQVhfRkxPQVQxNikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRXZWJHTEVycm9yTWVzc2FnZShnbCwgc3RhdHVzKSB7XG4gICAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICAgICAgY2FzZSBnbC5OT19FUlJPUjpcbiAgICAgICAgICAgIHJldHVybiAnTk9fRVJST1InO1xuICAgICAgICBjYXNlIGdsLklOVkFMSURfRU5VTTpcbiAgICAgICAgICAgIHJldHVybiAnSU5WQUxJRF9FTlVNJztcbiAgICAgICAgY2FzZSBnbC5JTlZBTElEX1ZBTFVFOlxuICAgICAgICAgICAgcmV0dXJuICdJTlZBTElEX1ZBTFVFJztcbiAgICAgICAgY2FzZSBnbC5JTlZBTElEX09QRVJBVElPTjpcbiAgICAgICAgICAgIHJldHVybiAnSU5WQUxJRF9PUEVSQVRJT04nO1xuICAgICAgICBjYXNlIGdsLklOVkFMSURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OOlxuICAgICAgICAgICAgcmV0dXJuICdJTlZBTElEX0ZSQU1FQlVGRkVSX09QRVJBVElPTic7XG4gICAgICAgIGNhc2UgZ2wuT1VUX09GX01FTU9SWTpcbiAgICAgICAgICAgIHJldHVybiAnT1VUX09GX01FTU9SWSc7XG4gICAgICAgIGNhc2UgZ2wuQ09OVEVYVF9MT1NUX1dFQkdMOlxuICAgICAgICAgICAgcmV0dXJuICdDT05URVhUX0xPU1RfV0VCR0wnO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGBVbmtub3duIGVycm9yIGNvZGUgJHtzdGF0dXN9YDtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uT3JUaHJvdyhnbCwgZXh0ZW5zaW9uTmFtZSkge1xuICAgIHJldHVybiB0aHJvd0lmTnVsbChnbCwgKCkgPT4gZ2wuZ2V0RXh0ZW5zaW9uKGV4dGVuc2lvbk5hbWUpLCAnRXh0ZW5zaW9uIFwiJyArIGV4dGVuc2lvbk5hbWUgKyAnXCIgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGJyb3dzZXIuJyk7XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVmVydGV4U2hhZGVyKGdsLCB2ZXJ0ZXhTaGFkZXJTb3VyY2UpIHtcbiAgICBjb25zdCB2ZXJ0ZXhTaGFkZXIgPSB0aHJvd0lmTnVsbChnbCwgKCkgPT4gZ2wuY3JlYXRlU2hhZGVyKGdsLlZFUlRFWF9TSEFERVIpLCAnVW5hYmxlIHRvIGNyZWF0ZSB2ZXJ0ZXggV2ViR0xTaGFkZXIuJyk7XG4gICAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5zaGFkZXJTb3VyY2UodmVydGV4U2hhZGVyLCB2ZXJ0ZXhTaGFkZXJTb3VyY2UpKTtcbiAgICBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmNvbXBpbGVTaGFkZXIodmVydGV4U2hhZGVyKSk7XG4gICAgaWYgKGdsLmdldFNoYWRlclBhcmFtZXRlcih2ZXJ0ZXhTaGFkZXIsIGdsLkNPTVBJTEVfU1RBVFVTKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgY29uc29sZS5sb2coZ2wuZ2V0U2hhZGVySW5mb0xvZyh2ZXJ0ZXhTaGFkZXIpKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gY29tcGlsZSB2ZXJ0ZXggc2hhZGVyLicpO1xuICAgIH1cbiAgICByZXR1cm4gdmVydGV4U2hhZGVyO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZyYWdtZW50U2hhZGVyKGdsLCBmcmFnbWVudFNoYWRlclNvdXJjZSkge1xuICAgIGNvbnN0IGZyYWdtZW50U2hhZGVyID0gdGhyb3dJZk51bGwoZ2wsICgpID0+IGdsLmNyZWF0ZVNoYWRlcihnbC5GUkFHTUVOVF9TSEFERVIpLCAnVW5hYmxlIHRvIGNyZWF0ZSBmcmFnbWVudCBXZWJHTFNoYWRlci4nKTtcbiAgICBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLnNoYWRlclNvdXJjZShmcmFnbWVudFNoYWRlciwgZnJhZ21lbnRTaGFkZXJTb3VyY2UpKTtcbiAgICBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmNvbXBpbGVTaGFkZXIoZnJhZ21lbnRTaGFkZXIpKTtcbiAgICBpZiAoZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKGZyYWdtZW50U2hhZGVyLCBnbC5DT01QSUxFX1NUQVRVUykgPT09IGZhbHNlKSB7XG4gICAgICAgIGxvZ1NoYWRlclNvdXJjZUFuZEluZm9Mb2coZnJhZ21lbnRTaGFkZXJTb3VyY2UsIGdsLmdldFNoYWRlckluZm9Mb2coZnJhZ21lbnRTaGFkZXIpKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gY29tcGlsZSBmcmFnbWVudCBzaGFkZXIuJyk7XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudFNoYWRlcjtcbn1cbmNvbnN0IGxpbmVOdW1iZXJSZWdleCA9IC9FUlJPUjogWzAtOV0rOihbMC05XSspOi9nO1xuZnVuY3Rpb24gbG9nU2hhZGVyU291cmNlQW5kSW5mb0xvZyhzaGFkZXJTb3VyY2UsIHNoYWRlckluZm9Mb2cpIHtcbiAgICBjb25zdCBsaW5lTnVtYmVyUmVnZXhSZXN1bHQgPSBsaW5lTnVtYmVyUmVnZXguZXhlYyhzaGFkZXJJbmZvTG9nKTtcbiAgICBpZiAobGluZU51bWJlclJlZ2V4UmVzdWx0ID09IG51bGwpIHtcbiAgICAgICAgY29uc29sZS5sb2coYENvdWxkbid0IHBhcnNlIGxpbmUgbnVtYmVyIGluIGVycm9yOiAke3NoYWRlckluZm9Mb2d9YCk7XG4gICAgICAgIGNvbnNvbGUubG9nKHNoYWRlclNvdXJjZSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbGluZU51bWJlciA9ICtsaW5lTnVtYmVyUmVnZXhSZXN1bHRbMV07XG4gICAgY29uc3Qgc2hhZGVyTGluZXMgPSBzaGFkZXJTb3VyY2Uuc3BsaXQoJ1xcbicpO1xuICAgIGNvbnN0IHBhZCA9IHNoYWRlckxpbmVzLmxlbmd0aC50b1N0cmluZygpLmxlbmd0aCArIDI7XG4gICAgY29uc3QgbGluZXNXaXRoTGluZU51bWJlcnMgPSBzaGFkZXJMaW5lcy5tYXAoKGxpbmUsIGxpbmVOdW1iZXIpID0+IHV0aWwucmlnaHRQYWQoKGxpbmVOdW1iZXIgKyAxKS50b1N0cmluZygpLCBwYWQpICsgbGluZSk7XG4gICAgbGV0IG1heExpbmVMZW5ndGggPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXNXaXRoTGluZU51bWJlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbWF4TGluZUxlbmd0aCA9IE1hdGgubWF4KGxpbmVzV2l0aExpbmVOdW1iZXJzW2ldLmxlbmd0aCwgbWF4TGluZUxlbmd0aCk7XG4gICAgfVxuICAgIGNvbnN0IGJlZm9yZUVycm9yTGluZXMgPSBsaW5lc1dpdGhMaW5lTnVtYmVycy5zbGljZSgwLCBsaW5lTnVtYmVyIC0gMSk7XG4gICAgY29uc3QgZXJyb3JMaW5lID0gbGluZXNXaXRoTGluZU51bWJlcnMuc2xpY2UobGluZU51bWJlciAtIDEsIGxpbmVOdW1iZXIpO1xuICAgIGNvbnN0IGFmdGVyRXJyb3JMaW5lcyA9IGxpbmVzV2l0aExpbmVOdW1iZXJzLnNsaWNlKGxpbmVOdW1iZXIpO1xuICAgIGNvbnNvbGUubG9nKGJlZm9yZUVycm9yTGluZXMuam9pbignXFxuJykpO1xuICAgIGNvbnNvbGUubG9nKHNoYWRlckluZm9Mb2cuc3BsaXQoJ1xcbicpWzBdKTtcbiAgICBjb25zb2xlLmxvZyhgJWMgJHt1dGlsLnJpZ2h0UGFkKGVycm9yTGluZVswXSwgbWF4TGluZUxlbmd0aCl9YCwgJ2JvcmRlcjoxcHggc29saWQgcmVkOyBiYWNrZ3JvdW5kLWNvbG9yOiNlM2QyZDI7IGNvbG9yOiNhNjE3MTcnKTtcbiAgICBjb25zb2xlLmxvZyhhZnRlckVycm9yTGluZXMuam9pbignXFxuJykpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVByb2dyYW0oZ2wpIHtcbiAgICByZXR1cm4gdGhyb3dJZk51bGwoZ2wsICgpID0+IGdsLmNyZWF0ZVByb2dyYW0oKSwgJ1VuYWJsZSB0byBjcmVhdGUgV2ViR0xQcm9ncmFtLicpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGxpbmtQcm9ncmFtKGdsLCBwcm9ncmFtKSB7XG4gICAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5saW5rUHJvZ3JhbShwcm9ncmFtKSk7XG4gICAgaWYgKGdsLmdldFByb2dyYW1QYXJhbWV0ZXIocHJvZ3JhbSwgZ2wuTElOS19TVEFUVVMpID09PSBmYWxzZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhnbC5nZXRQcm9ncmFtSW5mb0xvZyhwcm9ncmFtKSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGxpbmsgdmVydGV4IGFuZCBmcmFnbWVudCBzaGFkZXJzLicpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVByb2dyYW0oZ2wsIHByb2dyYW0pIHtcbiAgICBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLnZhbGlkYXRlUHJvZ3JhbShwcm9ncmFtKSk7XG4gICAgaWYgKGdsLmdldFByb2dyYW1QYXJhbWV0ZXIocHJvZ3JhbSwgZ2wuVkFMSURBVEVfU1RBVFVTKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgY29uc29sZS5sb2coZ2wuZ2V0UHJvZ3JhbUluZm9Mb2cocHJvZ3JhbSkpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NoYWRlciBwcm9ncmFtIHZhbGlkYXRpb24gZmFpbGVkLicpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTdGF0aWNWZXJ0ZXhCdWZmZXIoZ2wsIGRhdGEpIHtcbiAgICBjb25zdCBidWZmZXIgPSB0aHJvd0lmTnVsbChnbCwgKCkgPT4gZ2wuY3JlYXRlQnVmZmVyKCksICdVbmFibGUgdG8gY3JlYXRlIFdlYkdMQnVmZmVyJyk7XG4gICAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgYnVmZmVyKSk7XG4gICAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgZGF0YSwgZ2wuU1RBVElDX0RSQVcpKTtcbiAgICByZXR1cm4gYnVmZmVyO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0YXRpY0luZGV4QnVmZmVyKGdsLCBkYXRhKSB7XG4gICAgY29uc3QgYnVmZmVyID0gdGhyb3dJZk51bGwoZ2wsICgpID0+IGdsLmNyZWF0ZUJ1ZmZlcigpLCAnVW5hYmxlIHRvIGNyZWF0ZSBXZWJHTEJ1ZmZlcicpO1xuICAgIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuYmluZEJ1ZmZlcihnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgYnVmZmVyKSk7XG4gICAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5idWZmZXJEYXRhKGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBkYXRhLCBnbC5TVEFUSUNfRFJBVykpO1xuICAgIHJldHVybiBidWZmZXI7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0TnVtQ2hhbm5lbHMoKSB7XG4gICAgaWYgKGVudigpLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpID09PSAyKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICByZXR1cm4gNDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUZXh0dXJlKGdsKSB7XG4gICAgcmV0dXJuIHRocm93SWZOdWxsKGdsLCAoKSA9PiBnbC5jcmVhdGVUZXh0dXJlKCksICdVbmFibGUgdG8gY3JlYXRlIFdlYkdMVGV4dHVyZS4nKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVRleHR1cmVTaXplKHdpZHRoLCBoZWlnaHQpIHtcbiAgICBjb25zdCBtYXhUZXh0dXJlU2l6ZSA9IGVudigpLmdldE51bWJlcignV0VCR0xfTUFYX1RFWFRVUkVfU0laRScpO1xuICAgIGlmICgod2lkdGggPD0gMCkgfHwgKGhlaWdodCA8PSAwKSkge1xuICAgICAgICBjb25zdCByZXF1ZXN0ZWQgPSBgWyR7d2lkdGh9eCR7aGVpZ2h0fV1gO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVlc3RlZCB0ZXh0dXJlIHNpemUgJyArIHJlcXVlc3RlZCArICcgaXMgaW52YWxpZC4nKTtcbiAgICB9XG4gICAgaWYgKCh3aWR0aCA+IG1heFRleHR1cmVTaXplKSB8fCAoaGVpZ2h0ID4gbWF4VGV4dHVyZVNpemUpKSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RlZCA9IGBbJHt3aWR0aH14JHtoZWlnaHR9XWA7XG4gICAgICAgIGNvbnN0IG1heCA9IGBbJHttYXhUZXh0dXJlU2l6ZX14JHttYXhUZXh0dXJlU2l6ZX1dYDtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1ZXN0ZWQgdGV4dHVyZSBzaXplICcgKyByZXF1ZXN0ZWQgK1xuICAgICAgICAgICAgJyBncmVhdGVyIHRoYW4gV2ViR0wgbWF4aW11bSBvbiB0aGlzIGJyb3dzZXIgLyBHUFUgJyArIG1heCArICcuJyk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZyYW1lYnVmZmVyKGdsKSB7XG4gICAgcmV0dXJuIHRocm93SWZOdWxsKGdsLCAoKSA9PiBnbC5jcmVhdGVGcmFtZWJ1ZmZlcigpLCAnVW5hYmxlIHRvIGNyZWF0ZSBXZWJHTEZyYW1lYnVmZmVyLicpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGJpbmRWZXJ0ZXhCdWZmZXJUb1Byb2dyYW1BdHRyaWJ1dGUoZ2wsIHByb2dyYW0sIGF0dHJpYnV0ZSwgYnVmZmVyLCBhcnJheUVudHJpZXNQZXJJdGVtLCBpdGVtU3RyaWRlSW5CeXRlcywgaXRlbU9mZnNldEluQnl0ZXMpIHtcbiAgICBjb25zdCBsb2MgPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCBhdHRyaWJ1dGUpO1xuICAgIGlmIChsb2MgPT09IC0xKSB7XG4gICAgICAgIC8vIFRoZSBHUFUgY29tcGlsZXIgZGVjaWRlZCB0byBzdHJpcCBvdXQgdGhpcyBhdHRyaWJ1dGUgYmVjYXVzZSBpdCdzIHVudXNlZCxcbiAgICAgICAgLy8gdGh1cyBubyBuZWVkIHRvIGJpbmQuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgYnVmZmVyKSk7XG4gICAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGxvYywgYXJyYXlFbnRyaWVzUGVySXRlbSwgZ2wuRkxPQVQsIGZhbHNlLCBpdGVtU3RyaWRlSW5CeXRlcywgaXRlbU9mZnNldEluQnl0ZXMpKTtcbiAgICBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGxvYykpO1xuICAgIHJldHVybiB0cnVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGJpbmRUZXh0dXJlVW5pdChnbCwgdGV4dHVyZSwgdGV4dHVyZVVuaXQpIHtcbiAgICB2YWxpZGF0ZVRleHR1cmVVbml0KGdsLCB0ZXh0dXJlVW5pdCk7XG4gICAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUwICsgdGV4dHVyZVVuaXQpKTtcbiAgICBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRleHR1cmUpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB1bmJpbmRUZXh0dXJlVW5pdChnbCwgdGV4dHVyZVVuaXQpIHtcbiAgICB2YWxpZGF0ZVRleHR1cmVVbml0KGdsLCB0ZXh0dXJlVW5pdCk7XG4gICAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUwICsgdGV4dHVyZVVuaXQpKTtcbiAgICBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIG51bGwpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcm9ncmFtVW5pZm9ybUxvY2F0aW9uT3JUaHJvdyhnbCwgcHJvZ3JhbSwgdW5pZm9ybU5hbWUpIHtcbiAgICByZXR1cm4gdGhyb3dJZk51bGwoZ2wsICgpID0+IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCB1bmlmb3JtTmFtZSksICd1bmlmb3JtIFwiJyArIHVuaWZvcm1OYW1lICsgJ1wiIG5vdCBwcmVzZW50IGluIHByb2dyYW0uJyk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvZ3JhbVVuaWZvcm1Mb2NhdGlvbihnbCwgcHJvZ3JhbSwgdW5pZm9ybU5hbWUpIHtcbiAgICByZXR1cm4gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sIHVuaWZvcm1OYW1lKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBiaW5kVGV4dHVyZVRvUHJvZ3JhbVVuaWZvcm1TYW1wbGVyKGdsLCB0ZXh0dXJlLCB1bmlmb3JtU2FtcGxlckxvY2F0aW9uLCB0ZXh0dXJlVW5pdCkge1xuICAgIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gYmluZFRleHR1cmVVbml0KGdsLCB0ZXh0dXJlLCB0ZXh0dXJlVW5pdCkpO1xuICAgIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wudW5pZm9ybTFpKHVuaWZvcm1TYW1wbGVyTG9jYXRpb24sIHRleHR1cmVVbml0KSk7XG59XG5leHBvcnQgZnVuY3Rpb24gYmluZENhbnZhc1RvRnJhbWVidWZmZXIoZ2wpIHtcbiAgICBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgbnVsbCkpO1xuICAgIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wudmlld3BvcnQoMCwgMCwgZ2wuY2FudmFzLndpZHRoLCBnbC5jYW52YXMuaGVpZ2h0KSk7XG4gICAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5zY2lzc29yKDAsIDAsIGdsLmNhbnZhcy53aWR0aCwgZ2wuY2FudmFzLmhlaWdodCkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGJpbmRDb2xvclRleHR1cmVUb0ZyYW1lYnVmZmVyKGdsLCB0ZXh0dXJlLCBmcmFtZWJ1ZmZlcikge1xuICAgIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBmcmFtZWJ1ZmZlcikpO1xuICAgIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCB0ZXh0dXJlLCAwKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gdW5iaW5kQ29sb3JUZXh0dXJlRnJvbUZyYW1lYnVmZmVyKGdsLCBmcmFtZWJ1ZmZlcikge1xuICAgIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBmcmFtZWJ1ZmZlcikpO1xuICAgIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCBudWxsLCAwKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVGcmFtZWJ1ZmZlcihnbCkge1xuICAgIGNvbnN0IHN0YXR1cyA9IGdsLmNoZWNrRnJhbWVidWZmZXJTdGF0dXMoZ2wuRlJBTUVCVUZGRVIpO1xuICAgIGlmIChzdGF0dXMgIT09IGdsLkZSQU1FQlVGRkVSX0NPTVBMRVRFKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXJyb3IgYmluZGluZyBmcmFtZWJ1ZmZlcjogJyArIGdldEZyYW1lYnVmZmVyRXJyb3JNZXNzYWdlKGdsLCBzdGF0dXMpKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0RnJhbWVidWZmZXJFcnJvck1lc3NhZ2UoZ2wsIHN0YXR1cykge1xuICAgIHN3aXRjaCAoc3RhdHVzKSB7XG4gICAgICAgIGNhc2UgZ2wuRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5UOlxuICAgICAgICAgICAgcmV0dXJuICdGUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0FUVEFDSE1FTlQnO1xuICAgICAgICBjYXNlIGdsLkZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTUlTU0lOR19BVFRBQ0hNRU5UOlxuICAgICAgICAgICAgcmV0dXJuICdGUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01JU1NJTkdfQVRUQUNITUVOVCc7XG4gICAgICAgIGNhc2UgZ2wuRlJBTUVCVUZGRVJfSU5DT01QTEVURV9ESU1FTlNJT05TOlxuICAgICAgICAgICAgcmV0dXJuICdGUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJTUVOU0lPTlMnO1xuICAgICAgICBjYXNlIGdsLkZSQU1FQlVGRkVSX1VOU1VQUE9SVEVEOlxuICAgICAgICAgICAgcmV0dXJuICdGUkFNRUJVRkZFUl9VTlNVUFBPUlRFRCc7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gYHVua25vd24gZXJyb3IgJHtzdGF0dXN9YDtcbiAgICB9XG59XG5mdW5jdGlvbiB0aHJvd0lmTnVsbChnbCwgcmV0dXJuVE9yTnVsbCwgZmFpbHVyZU1lc3NhZ2UpIHtcbiAgICBjb25zdCB0T3JOdWxsID0gY2FsbEFuZENoZWNrKGdsLCAoKSA9PiByZXR1cm5UT3JOdWxsKCkpO1xuICAgIGlmICh0T3JOdWxsID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGZhaWx1cmVNZXNzYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRPck51bGw7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZVRleHR1cmVVbml0KGdsLCB0ZXh0dXJlVW5pdCkge1xuICAgIGNvbnN0IG1heFRleHR1cmVVbml0ID0gZ2wuTUFYX0NPTUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFMgLSAxO1xuICAgIGNvbnN0IGdsVGV4dHVyZVVuaXQgPSB0ZXh0dXJlVW5pdCArIGdsLlRFWFRVUkUwO1xuICAgIGlmIChnbFRleHR1cmVVbml0IDwgZ2wuVEVYVFVSRTAgfHwgZ2xUZXh0dXJlVW5pdCA+IG1heFRleHR1cmVVbml0KSB7XG4gICAgICAgIGNvbnN0IHRleHR1cmVVbml0UmFuZ2UgPSBgW2dsLlRFWFRVUkUwLCBnbC5URVhUVVJFJHttYXhUZXh0dXJlVW5pdH1dYDtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB0ZXh0dXJlVW5pdCBtdXN0IGJlIGluICR7dGV4dHVyZVVuaXRSYW5nZX0uYCk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEJhdGNoRGltKHNoYXBlLCBkaW1zVG9Ta2lwID0gMikge1xuICAgIHJldHVybiB1dGlsLnNpemVGcm9tU2hhcGUoc2hhcGUuc2xpY2UoMCwgc2hhcGUubGVuZ3RoIC0gZGltc1RvU2tpcCkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFJvd3NDb2xzKHNoYXBlKSB7XG4gICAgaWYgKHNoYXBlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBFcnJvcignQ2Fubm90IGdldCByb3dzIGFuZCBjb2x1bW5zIG9mIGFuIGVtcHR5IHNoYXBlIGFycmF5LicpO1xuICAgIH1cbiAgICByZXR1cm4gW1xuICAgICAgICBzaGFwZS5sZW5ndGggPiAxID8gc2hhcGVbc2hhcGUubGVuZ3RoIC0gMl0gOiAxLCBzaGFwZVtzaGFwZS5sZW5ndGggLSAxXVxuICAgIF07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0U2hhcGVBczNEKHNoYXBlKSB7XG4gICAgbGV0IHNoYXBlQXMzRCA9IFsxLCAxLCAxXTtcbiAgICBjb25zdCBpc1NjYWxhciA9IHNoYXBlLmxlbmd0aCA9PT0gMCB8fCAoc2hhcGUubGVuZ3RoID09PSAxICYmIHNoYXBlWzBdID09PSAxKTtcbiAgICBpZiAoIWlzU2NhbGFyKSB7XG4gICAgICAgIHNoYXBlQXMzRCA9XG4gICAgICAgICAgICBbZ2V0QmF0Y2hEaW0oc2hhcGUpLCAuLi5nZXRSb3dzQ29scyhzaGFwZSldO1xuICAgIH1cbiAgICByZXR1cm4gc2hhcGVBczNEO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFRleHR1cmVTaGFwZUZyb21Mb2dpY2FsU2hhcGUobG9nU2hhcGUsIGlzUGFja2VkID0gZmFsc2UpIHtcbiAgICBsZXQgbWF4VGV4U2l6ZSA9IGVudigpLmdldE51bWJlcignV0VCR0xfTUFYX1RFWFRVUkVfU0laRScpO1xuICAgIGlmIChpc1BhY2tlZCkge1xuICAgICAgICBtYXhUZXhTaXplID0gbWF4VGV4U2l6ZSAqIDI7XG4gICAgICAgIC8vIFRoaXMgbG9naWMgZW5zdXJlcyB3ZSBhY2N1cmF0ZWx5IGNvdW50IHRoZSBudW1iZXIgb2YgcGFja2VkIHRleGVscyBuZWVkZWRcbiAgICAgICAgLy8gdG8gYWNjb21tb2RhdGUgdGhlIHRlbnNvci4gV2UgY2FuIG9ubHkgcGFjayB2YWx1ZXMgaW4gdGhlIHNhbWUgdGV4ZWwgaWZcbiAgICAgICAgLy8gdGhleSBhcmUgZnJvbSBhZGphY2VudCBwYWlycyBvZiByb3dzL2NvbHMgd2l0aGluIHRoZSBzYW1lIGJhdGNoLiBTbyBpZiBhXG4gICAgICAgIC8vIHRlbnNvciBoYXMgMyByb3dzLCB3ZSBwcmV0ZW5kIGl0IGhhcyA0IHJvd3MgaW4gb3JkZXIgdG8gYWNjb3VudCBmb3IgdGhlXG4gICAgICAgIC8vIGZhY3QgdGhhdCB0aGUgdGV4ZWxzIGNvbnRhaW5pbmcgdGhlIHRoaXJkIHJvdyBhcmUgaGFsZiBlbXB0eS5cbiAgICAgICAgbG9nU2hhcGUgPSBsb2dTaGFwZS5tYXAoKGQsIGkpID0+IGkgPj0gbG9nU2hhcGUubGVuZ3RoIC0gMiA/XG4gICAgICAgICAgICB1dGlsLm5lYXJlc3RMYXJnZXJFdmVuKGxvZ1NoYXBlW2ldKSA6XG4gICAgICAgICAgICBsb2dTaGFwZVtpXSk7XG4gICAgICAgIC8vIFBhY2tlZCB0ZXh0dXJlIGhlaWdodCBpcyBhdCBsZWFzdCAyICh0aGUgY2hhbm5lbCBoZWlnaHQgb2YgYSBzaW5nbGVcbiAgICAgICAgLy8gdGV4ZWwpLlxuICAgICAgICBpZiAobG9nU2hhcGUubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBsb2dTaGFwZSA9IFsyLCBsb2dTaGFwZVswXV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gSWYgbG9naWNhbCBzaGFwZSBpcyAyLCB3ZSBkb24ndCBzcXVlZXplLCBzaW5jZSB3ZSB3YW50IHRvIG1hdGNoIHBoeXNpY2FsLlxuICAgIGlmIChsb2dTaGFwZS5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgY29uc3Qgc3F1ZWV6ZVJlc3VsdCA9IHV0aWwuc3F1ZWV6ZVNoYXBlKGxvZ1NoYXBlKTtcbiAgICAgICAgbG9nU2hhcGUgPSBzcXVlZXplUmVzdWx0Lm5ld1NoYXBlO1xuICAgIH1cbiAgICBsZXQgc2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShsb2dTaGFwZSk7XG4gICAgaWYgKGxvZ1NoYXBlLmxlbmd0aCA8PSAxICYmIHNpemUgPD0gbWF4VGV4U2l6ZSkge1xuICAgICAgICByZXR1cm4gWzEsIHNpemVdO1xuICAgIH1cbiAgICBlbHNlIGlmIChsb2dTaGFwZS5sZW5ndGggPT09IDIgJiYgbG9nU2hhcGVbMF0gPD0gbWF4VGV4U2l6ZSAmJlxuICAgICAgICBsb2dTaGFwZVsxXSA8PSBtYXhUZXhTaXplKSB7XG4gICAgICAgIHJldHVybiBsb2dTaGFwZTtcbiAgICB9XG4gICAgZWxzZSBpZiAobG9nU2hhcGUubGVuZ3RoID09PSAzICYmIGxvZ1NoYXBlWzBdICogbG9nU2hhcGVbMV0gPD0gbWF4VGV4U2l6ZSAmJlxuICAgICAgICBsb2dTaGFwZVsyXSA8PSBtYXhUZXhTaXplKSB7XG4gICAgICAgIHJldHVybiBbbG9nU2hhcGVbMF0gKiBsb2dTaGFwZVsxXSwgbG9nU2hhcGVbMl1dO1xuICAgIH1cbiAgICBlbHNlIGlmIChsb2dTaGFwZS5sZW5ndGggPT09IDMgJiYgbG9nU2hhcGVbMF0gPD0gbWF4VGV4U2l6ZSAmJlxuICAgICAgICBsb2dTaGFwZVsxXSAqIGxvZ1NoYXBlWzJdIDw9IG1heFRleFNpemUpIHtcbiAgICAgICAgcmV0dXJuIFtsb2dTaGFwZVswXSwgbG9nU2hhcGVbMV0gKiBsb2dTaGFwZVsyXV07XG4gICAgfVxuICAgIGVsc2UgaWYgKGxvZ1NoYXBlLmxlbmd0aCA9PT0gNCAmJlxuICAgICAgICBsb2dTaGFwZVswXSAqIGxvZ1NoYXBlWzFdICogbG9nU2hhcGVbMl0gPD0gbWF4VGV4U2l6ZSAmJlxuICAgICAgICBsb2dTaGFwZVszXSA8PSBtYXhUZXhTaXplKSB7XG4gICAgICAgIHJldHVybiBbbG9nU2hhcGVbMF0gKiBsb2dTaGFwZVsxXSAqIGxvZ1NoYXBlWzJdLCBsb2dTaGFwZVszXV07XG4gICAgfVxuICAgIGVsc2UgaWYgKGxvZ1NoYXBlLmxlbmd0aCA9PT0gNCAmJiBsb2dTaGFwZVswXSA8PSBtYXhUZXhTaXplICYmXG4gICAgICAgIGxvZ1NoYXBlWzFdICogbG9nU2hhcGVbMl0gKiBsb2dTaGFwZVszXSA8PSBtYXhUZXhTaXplKSB7XG4gICAgICAgIHJldHVybiBbbG9nU2hhcGVbMF0sIGxvZ1NoYXBlWzFdICogbG9nU2hhcGVbMl0gKiBsb2dTaGFwZVszXV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoaXNQYWNrZWQpIHtcbiAgICAgICAgICAgIC8vIEZvciBwYWNrZWQgdGV4dHVyZXMgc2l6ZSBlcXVhbHMgdGhlIG51bWJlciBvZiBjaGFubmVscyByZXF1aXJlZCB0b1xuICAgICAgICAgICAgLy8gYWNjb21tb2RhdGUgdGhlIHRleHR1cmUgZGF0YS4gSG93ZXZlciBpbiBvcmRlciB0byBzcXVhcmlmeSBzdWNoIHRoYXRcbiAgICAgICAgICAgIC8vIGlubmVyIGRpbWVuc2lvbnMgc3RheSBldmVuLCB3ZSByZXdyaXRlIHNpemUgdG8gZXF1YWwgdGhlIG51bWJlciBvZlxuICAgICAgICAgICAgLy8gdGV4ZWxzLiBUaGVuIGluIHRoZSByZXR1cm4gc3RhdGVtZW50IHdlIHJlaHlkcmF0ZSB0aGUgc3F1YXJpZmllZFxuICAgICAgICAgICAgLy8gZGltZW5zaW9ucyB0byBjaGFubmVsIHVuaXRzLlxuICAgICAgICAgICAgY29uc3QgYmF0Y2hEaW0gPSBnZXRCYXRjaERpbShsb2dTaGFwZSk7XG4gICAgICAgICAgICBsZXQgcm93cyA9IDIsIGNvbHMgPSAyO1xuICAgICAgICAgICAgaWYgKGxvZ1NoYXBlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIFtyb3dzLCBjb2xzXSA9IGdldFJvd3NDb2xzKGxvZ1NoYXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNpemUgPSBiYXRjaERpbSAqIChyb3dzIC8gMikgKiAoY29scyAvIDIpO1xuICAgICAgICAgICAgcmV0dXJuIHV0aWwuc2l6ZVRvU3F1YXJpc2hTaGFwZShzaXplKS5tYXAoZCA9PiBkICogMik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHV0aWwuc2l6ZVRvU3F1YXJpc2hTaGFwZShzaXplKTtcbiAgICB9XG59XG5mdW5jdGlvbiBpc0V2ZW4obikge1xuICAgIHJldHVybiBuICUgMiA9PT0gMDtcbn1cbi8qKlxuICogVGhpcyBkZXRlcm1pbmVzIHdoZXRoZXIgcmVzaGFwaW5nIGEgcGFja2VkIHRleHR1cmUgcmVxdWlyZXMgcmVhcnJhbmdpbmdcbiAqIHRoZSBkYXRhIHdpdGhpbiB0aGUgdGV4dHVyZSwgYXNzdW1pbmcgMngyIHBhY2tpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Jlc2hhcGVGcmVlKHNoYXBlMSwgc2hhcGUyKSB7XG4gICAgc2hhcGUxID0gc2hhcGUxLnNsaWNlKC0yKTtcbiAgICBzaGFwZTIgPSBzaGFwZTIuc2xpY2UoLTIpO1xuICAgIGlmICh1dGlsLmFycmF5c0VxdWFsKHNoYXBlMSwgc2hhcGUyKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCFzaGFwZTEubGVuZ3RoIHx8ICFzaGFwZTIubGVuZ3RoKSB7IC8vIE9uZSBvZiB0aGUgc2hhcGVzIGlzIGEgc2NhbGFyLlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHNoYXBlMVswXSA9PT0gMCB8fCBzaGFwZTFbMV0gPT09IDAgfHwgc2hhcGUyWzBdID09PSAwIHx8XG4gICAgICAgIHNoYXBlMlsxXSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHNoYXBlMS5sZW5ndGggIT09IHNoYXBlMi5sZW5ndGgpIHsgLy8gT25lIG9mIHRoZSBzaGFwZXMgaXMgYSB2ZWN0b3IuXG4gICAgICAgIGNvbnN0IHNoYXBlMUNvbHMgPSBzaGFwZTEuc2xpY2UoLTEpWzBdO1xuICAgICAgICBjb25zdCBzaGFwZTJDb2xzID0gc2hhcGUyLnNsaWNlKC0xKVswXTtcbiAgICAgICAgaWYgKHNoYXBlMUNvbHMgPT09IHNoYXBlMkNvbHMpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0V2ZW4oc2hhcGUxQ29scykgJiYgaXNFdmVuKHNoYXBlMkNvbHMpICYmXG4gICAgICAgICAgICAoc2hhcGUxWzBdID09PSAxIHx8IHNoYXBlMlswXSA9PT0gMSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzaGFwZTFbMV0gPT09IHNoYXBlMlsxXSAmJiBpc0V2ZW4oc2hhcGUxWzBdKSAmJiBpc0V2ZW4oc2hhcGUyWzBdKTtcbn1cbi8vIFdlIGNhY2hlIHdlYmdsIHBhcmFtcyBiZWNhdXNlIHRoZSBlbnZpcm9ubWVudCBnZXRzIHJlc2V0IGJldHdlZW5cbi8vIHVuaXQgdGVzdHMgYW5kIHdlIGRvbid0IHdhbnQgdG8gY29uc3RhbnRseSBxdWVyeSB0aGUgV2ViR0xDb250ZXh0IGZvclxuLy8gTUFYX1RFWFRVUkVfU0laRS5cbmxldCBNQVhfVEVYVFVSRV9TSVpFO1xubGV0IE1BWF9URVhUVVJFU19JTl9TSEFERVI7XG5leHBvcnQgZnVuY3Rpb24gZ2V0V2ViR0xNYXhUZXh0dXJlU2l6ZSh3ZWJHTFZlcnNpb24pIHtcbiAgICBpZiAoTUFYX1RFWFRVUkVfU0laRSA9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGdsID0gZ2V0V2ViR0xDb250ZXh0KHdlYkdMVmVyc2lvbik7XG4gICAgICAgIE1BWF9URVhUVVJFX1NJWkUgPSBnbC5nZXRQYXJhbWV0ZXIoZ2wuTUFYX1RFWFRVUkVfU0laRSk7XG4gICAgfVxuICAgIHJldHVybiBNQVhfVEVYVFVSRV9TSVpFO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0TWF4VGV4dHVyZVNpemUoKSB7XG4gICAgTUFYX1RFWFRVUkVfU0laRSA9IG51bGw7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVzZXRNYXhUZXh0dXJlc0luU2hhZGVyKCkge1xuICAgIE1BWF9URVhUVVJFU19JTl9TSEFERVIgPSBudWxsO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldE1heFRleHR1cmVzSW5TaGFkZXIod2ViR0xWZXJzaW9uKSB7XG4gICAgaWYgKE1BWF9URVhUVVJFU19JTl9TSEFERVIgPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBnbCA9IGdldFdlYkdMQ29udGV4dCh3ZWJHTFZlcnNpb24pO1xuICAgICAgICBNQVhfVEVYVFVSRVNfSU5fU0hBREVSID0gZ2wuZ2V0UGFyYW1ldGVyKGdsLk1BWF9URVhUVVJFX0lNQUdFX1VOSVRTKTtcbiAgICB9XG4gICAgLy8gV2UgY2FwIGF0IDE2IHRvIGF2b2lkIHNwdXJpb3VzIHJ1bnRpbWUgXCJtZW1vcnkgZXhoYXVzdGVkXCIgZXJyb3IuXG4gICAgcmV0dXJuIE1hdGgubWluKDE2LCBNQVhfVEVYVFVSRVNfSU5fU0hBREVSKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRXZWJHTERpc2pvaW50UXVlcnlUaW1lclZlcnNpb24od2ViR0xWZXJzaW9uKSB7XG4gICAgaWYgKHdlYkdMVmVyc2lvbiA9PT0gMCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgbGV0IHF1ZXJ5VGltZXJWZXJzaW9uO1xuICAgIGNvbnN0IGdsID0gZ2V0V2ViR0xDb250ZXh0KHdlYkdMVmVyc2lvbik7XG4gICAgaWYgKGhhc0V4dGVuc2lvbihnbCwgJ0VYVF9kaXNqb2ludF90aW1lcl9xdWVyeV93ZWJnbDInKSAmJlxuICAgICAgICB3ZWJHTFZlcnNpb24gPT09IDIpIHtcbiAgICAgICAgcXVlcnlUaW1lclZlcnNpb24gPSAyO1xuICAgIH1cbiAgICBlbHNlIGlmIChoYXNFeHRlbnNpb24oZ2wsICdFWFRfZGlzam9pbnRfdGltZXJfcXVlcnknKSkge1xuICAgICAgICBxdWVyeVRpbWVyVmVyc2lvbiA9IDE7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBxdWVyeVRpbWVyVmVyc2lvbiA9IDA7XG4gICAgfVxuICAgIHJldHVybiBxdWVyeVRpbWVyVmVyc2lvbjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBoYXNFeHRlbnNpb24oZ2wsIGV4dGVuc2lvbk5hbWUpIHtcbiAgICBjb25zdCBleHQgPSBnbC5nZXRFeHRlbnNpb24oZXh0ZW5zaW9uTmFtZSk7XG4gICAgcmV0dXJuIGV4dCAhPSBudWxsO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzV2ViR0xWZXJzaW9uRW5hYmxlZCh3ZWJHTFZlcnNpb24pIHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBnbCA9IGdldFdlYkdMQ29udGV4dCh3ZWJHTFZlcnNpb24pO1xuICAgICAgICBpZiAoZ2wgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ0Vycm9yIHdoZW4gZ2V0dGluZyBXZWJHTCBjb250ZXh0OiAnLCBlKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNDYXBhYmxlT2ZSZW5kZXJpbmdUb0Zsb2F0VGV4dHVyZSh3ZWJHTFZlcnNpb24pIHtcbiAgICBpZiAod2ViR0xWZXJzaW9uID09PSAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgZ2wgPSBnZXRXZWJHTENvbnRleHQod2ViR0xWZXJzaW9uKTtcbiAgICBpZiAod2ViR0xWZXJzaW9uID09PSAxKSB7XG4gICAgICAgIGlmICghaGFzRXh0ZW5zaW9uKGdsLCAnT0VTX3RleHR1cmVfZmxvYXQnKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoIWhhc0V4dGVuc2lvbihnbCwgJ0VYVF9jb2xvcl9idWZmZXJfZmxvYXQnKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGlzRnJhbWVCdWZmZXJDb21wbGV0ZSA9IGNyZWF0ZUZsb2F0VGV4dHVyZUFuZEJpbmRUb0ZyYW1lYnVmZmVyKGdsKTtcbiAgICByZXR1cm4gaXNGcmFtZUJ1ZmZlckNvbXBsZXRlO1xufVxuLyoqXG4gKiBDaGVjayBpZiB3ZSBjYW4gZG93bmxvYWQgdmFsdWVzIGZyb20gYSBmbG9hdC9oYWxmLWZsb2F0IHRleHR1cmUuXG4gKlxuICogTm90ZSB0aGF0IGZvciBwZXJmb3JtYW5jZSByZWFzb25zIHdlIHVzZSBiaW5kaW5nIGEgdGV4dHVyZSB0byBhIGZyYW1lYnVmZmVyXG4gKiBhcyBhIHByb3h5IGZvciBhYmlsaXR5IHRvIGRvd25sb2FkIGZsb2F0IHZhbHVlcyBsYXRlciB1c2luZyByZWFkUGl4ZWxzLiBUaGVcbiAqIHRleHR1cmUgcGFyYW1zIG9mIHRoaXMgdGV4dHVyZSB3aWxsIG5vdCBtYXRjaCB0aG9zZSBpbiByZWFkUGl4ZWxzIGV4YWN0bHlcbiAqIGJ1dCBpZiB3ZSBhcmUgdW5hYmxlIHRvIGJpbmQgc29tZSBraW5kIG9mIGZsb2F0IHRleHR1cmUgdG8gdGhlIGZyYW1lQnVmZmVyXG4gKiB0aGVuIHdlIGRlZmluaXRlbHkgd2lsbCBub3QgYmUgYWJsZSB0byByZWFkIGZsb2F0IHZhbHVlcyBmcm9tIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEb3dubG9hZEZsb2F0VGV4dHVyZUVuYWJsZWQod2ViR0xWZXJzaW9uKSB7XG4gICAgaWYgKHdlYkdMVmVyc2lvbiA9PT0gMCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGdsID0gZ2V0V2ViR0xDb250ZXh0KHdlYkdMVmVyc2lvbik7XG4gICAgaWYgKHdlYkdMVmVyc2lvbiA9PT0gMSkge1xuICAgICAgICBpZiAoIWhhc0V4dGVuc2lvbihnbCwgJ09FU190ZXh0dXJlX2Zsb2F0JykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWhhc0V4dGVuc2lvbihnbCwgJ1dFQkdMX2NvbG9yX2J1ZmZlcl9mbG9hdCcpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmIChoYXNFeHRlbnNpb24oZ2wsICdFWFRfY29sb3JfYnVmZmVyX2Zsb2F0JykpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVGbG9hdFRleHR1cmVBbmRCaW5kVG9GcmFtZWJ1ZmZlcihnbCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgQ09MT1JfQlVGRkVSX0hBTEZfRkxPQVQgPSAnRVhUX2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0JztcbiAgICAgICAgaWYgKGhhc0V4dGVuc2lvbihnbCwgQ09MT1JfQlVGRkVSX0hBTEZfRkxPQVQpKSB7XG4gICAgICAgICAgICBjb25zdCB0ZXh0dXJlSGFsZkZsb2F0RXh0ZW5zaW9uID0gZ2wuZ2V0RXh0ZW5zaW9uKENPTE9SX0JVRkZFUl9IQUxGX0ZMT0FUKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVIYWxmRmxvYXRUZXh0dXJlQW5kQmluZFRvRnJhbWVidWZmZXIoZ2wsIHRleHR1cmVIYWxmRmxvYXRFeHRlbnNpb24pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgaXNGcmFtZUJ1ZmZlckNvbXBsZXRlID0gY3JlYXRlRmxvYXRUZXh0dXJlQW5kQmluZFRvRnJhbWVidWZmZXIoZ2wpO1xuICAgIHJldHVybiBpc0ZyYW1lQnVmZmVyQ29tcGxldGU7XG59XG5mdW5jdGlvbiBjcmVhdGVGbG9hdFRleHR1cmVBbmRCaW5kVG9GcmFtZWJ1ZmZlcihnbCkge1xuICAgIGNvbnN0IHRleENvbmZpZyA9IGdldFRleHR1cmVDb25maWcoZ2wpO1xuICAgIGNvbnN0IHRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7XG4gICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZSk7XG4gICAgY29uc3Qgd2lkdGggPSAxO1xuICAgIGNvbnN0IGhlaWdodCA9IDE7XG4gICAgZ2wudGV4SW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCB0ZXhDb25maWcuaW50ZXJuYWxGb3JtYXRGbG9hdCwgd2lkdGgsIGhlaWdodCwgMCwgdGV4Q29uZmlnLnRleHR1cmVGb3JtYXRGbG9hdCwgdGV4Q29uZmlnLnRleHR1cmVUeXBlRmxvYXQsIG51bGwpO1xuICAgIGNvbnN0IGZyYW1lQnVmZmVyID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTtcbiAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyKTtcbiAgICBnbC5mcmFtZWJ1ZmZlclRleHR1cmUyRChnbC5GUkFNRUJVRkZFUiwgZ2wuQ09MT1JfQVRUQUNITUVOVDAsIGdsLlRFWFRVUkVfMkQsIHRleHR1cmUsIDApO1xuICAgIGNvbnN0IGlzRnJhbWVCdWZmZXJDb21wbGV0ZSA9IGdsLmNoZWNrRnJhbWVidWZmZXJTdGF0dXMoZ2wuRlJBTUVCVUZGRVIpID09PSBnbC5GUkFNRUJVRkZFUl9DT01QTEVURTtcbiAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBudWxsKTtcbiAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIG51bGwpO1xuICAgIGdsLmRlbGV0ZVRleHR1cmUodGV4dHVyZSk7XG4gICAgZ2wuZGVsZXRlRnJhbWVidWZmZXIoZnJhbWVCdWZmZXIpO1xuICAgIHJldHVybiBpc0ZyYW1lQnVmZmVyQ29tcGxldGU7XG59XG5mdW5jdGlvbiBjcmVhdGVIYWxmRmxvYXRUZXh0dXJlQW5kQmluZFRvRnJhbWVidWZmZXIoXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG5nbCwgdGV4dHVyZUhhbGZGbG9hdEV4dGVuc2lvbikge1xuICAgIGNvbnN0IHRleENvbmZpZyA9IGdldFRleHR1cmVDb25maWcoZ2wsIHRleHR1cmVIYWxmRmxvYXRFeHRlbnNpb24pO1xuICAgIGNvbnN0IHRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7XG4gICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZSk7XG4gICAgY29uc3Qgd2lkdGggPSAxO1xuICAgIGNvbnN0IGhlaWdodCA9IDE7XG4gICAgZ2wudGV4SW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCB0ZXhDb25maWcuaW50ZXJuYWxGb3JtYXRIYWxmRmxvYXQsIHdpZHRoLCBoZWlnaHQsIDAsIHRleENvbmZpZy50ZXh0dXJlRm9ybWF0RmxvYXQsIHRleENvbmZpZy50ZXh0dXJlVHlwZUhhbGZGbG9hdCwgbnVsbCk7XG4gICAgY29uc3QgZnJhbWVCdWZmZXIgPSBnbC5jcmVhdGVGcmFtZWJ1ZmZlcigpO1xuICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgZnJhbWVCdWZmZXIpO1xuICAgIGdsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKGdsLkZSQU1FQlVGRkVSLCBnbC5DT0xPUl9BVFRBQ0hNRU5UMCwgZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZSwgMCk7XG4gICAgY29uc3QgaXNGcmFtZUJ1ZmZlckNvbXBsZXRlID0gZ2wuY2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyhnbC5GUkFNRUJVRkZFUikgPT09IGdsLkZSQU1FQlVGRkVSX0NPTVBMRVRFO1xuICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIG51bGwpO1xuICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgbnVsbCk7XG4gICAgZ2wuZGVsZXRlVGV4dHVyZSh0ZXh0dXJlKTtcbiAgICBnbC5kZWxldGVGcmFtZWJ1ZmZlcihmcmFtZUJ1ZmZlcik7XG4gICAgcmV0dXJuIGlzRnJhbWVCdWZmZXJDb21wbGV0ZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1dlYkdMRmVuY2VFbmFibGVkKHdlYkdMVmVyc2lvbikge1xuICAgIGlmICh3ZWJHTFZlcnNpb24gIT09IDIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBnbCA9IGdldFdlYkdMQ29udGV4dCh3ZWJHTFZlcnNpb24pO1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICBjb25zdCBpc0VuYWJsZWQgPSBnbC5mZW5jZVN5bmMgIT0gbnVsbDtcbiAgICByZXR1cm4gaXNFbmFibGVkO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE5vdENvbXBsZXgodGVuc29yLCBvcE5hbWUpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodGVuc29yKSkge1xuICAgICAgICB0ZW5zb3IgPSBbdGVuc29yXTtcbiAgICB9XG4gICAgdGVuc29yLmZvckVhY2godCA9PiB7XG4gICAgICAgIGlmICh0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHV0aWwuYXNzZXJ0KHQuZHR5cGUgIT09ICdjb21wbGV4NjQnLCAoKSA9PiBgJHtvcE5hbWV9IGRvZXMgbm90IHN1cHBvcnQgY29tcGxleDY0IHRlbnNvcnMgYCArXG4gICAgICAgICAgICAgICAgJ2luIHRoZSBXZWJHTCBiYWNrZW5kLicpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD13ZWJnbF91dGlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmV4cG9ydCBjb25zdCBFUFNJTE9OX0ZMT0FUMzIgPSAxZS03O1xuZXhwb3J0IGNvbnN0IEVQU0lMT05fRkxPQVQxNiA9IDFlLTQ7XG4vKiogQ29udmVuaWVudCBjbGFzcyBmb3Igc3RvcmluZyB0ZW5zb3ItcmVsYXRlZCBkYXRhLiAqL1xuZXhwb3J0IGNsYXNzIERhdGFTdG9yYWdlIHtcbiAgICBjb25zdHJ1Y3RvcihiYWNrZW5kLCBkYXRhTW92ZXIpIHtcbiAgICAgICAgdGhpcy5iYWNrZW5kID0gYmFja2VuZDtcbiAgICAgICAgdGhpcy5kYXRhTW92ZXIgPSBkYXRhTW92ZXI7XG4gICAgICAgIHRoaXMuZGF0YSA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIHRoaXMuZGF0YUlkc0NvdW50ID0gMDtcbiAgICB9XG4gICAgZ2V0KGRhdGFJZCkge1xuICAgICAgICBpZiAoIXRoaXMuZGF0YS5oYXMoZGF0YUlkKSkge1xuICAgICAgICAgICAgdGhpcy5kYXRhTW92ZXIubW92ZURhdGEodGhpcy5iYWNrZW5kLCBkYXRhSWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuZ2V0KGRhdGFJZCk7XG4gICAgfVxuICAgIHNldChkYXRhSWQsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuZGF0YUlkc0NvdW50Kys7XG4gICAgICAgIHRoaXMuZGF0YS5zZXQoZGF0YUlkLCB2YWx1ZSk7XG4gICAgfVxuICAgIGhhcyhkYXRhSWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5oYXMoZGF0YUlkKTtcbiAgICB9XG4gICAgZGVsZXRlKGRhdGFJZCkge1xuICAgICAgICB0aGlzLmRhdGFJZHNDb3VudC0tO1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmRlbGV0ZShkYXRhSWQpO1xuICAgIH1cbiAgICBudW1EYXRhSWRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhSWRzQ291bnQ7XG4gICAgfVxufVxuLyoqXG4gKiBUaGUgaW50ZXJmYWNlIHRoYXQgZGVmaW5lcyB0aGUga2VybmVscyB0aGF0IHNob3VsZCBiZSBpbXBsZW1lbnRlZCB3aGVuXG4gKiBhZGRpbmcgYSBuZXcgYmFja2VuZC4gTmV3IGJhY2tlbmRzIGRvbid0IG5lZWQgdG8gaW1wbGVtZW50IGV2ZXJ5IG9uZSBvZiB0aGVcbiAqIG1ldGhvZHMsIHRoaXMgY2FuIGJlIGRvbmUgZ3JhZHVhbGx5ICh0aHJvdyBhbiBlcnJvciBmb3IgdW5pbXBsZW1lbnRlZFxuICogbWV0aG9kcykuXG4gKi9cbmV4cG9ydCBjbGFzcyBLZXJuZWxCYWNrZW5kIHtcbiAgICByZWZDb3VudChkYXRhSWQpIHtcbiAgICAgICAgcmV0dXJuIG5vdFlldEltcGxlbWVudGVkKCdyZWZDb3VudCcpO1xuICAgIH1cbiAgICBpbmNSZWYoZGF0YUlkKSB7XG4gICAgICAgIHJldHVybiBub3RZZXRJbXBsZW1lbnRlZCgnaW5jUmVmJyk7XG4gICAgfVxuICAgIHRpbWVyQXZhaWxhYmxlKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdGltZShmKSB7XG4gICAgICAgIHJldHVybiBub3RZZXRJbXBsZW1lbnRlZCgndGltZScpO1xuICAgIH1cbiAgICByZWFkKGRhdGFJZCkge1xuICAgICAgICByZXR1cm4gbm90WWV0SW1wbGVtZW50ZWQoJ3JlYWQnKTtcbiAgICB9XG4gICAgcmVhZFN5bmMoZGF0YUlkKSB7XG4gICAgICAgIHJldHVybiBub3RZZXRJbXBsZW1lbnRlZCgncmVhZFN5bmMnKTtcbiAgICB9XG4gICAgbnVtRGF0YUlkcygpIHtcbiAgICAgICAgcmV0dXJuIG5vdFlldEltcGxlbWVudGVkKCdudW1EYXRhSWRzJyk7XG4gICAgfVxuICAgIGRpc3Bvc2VEYXRhKGRhdGFJZCwgZm9yY2UpIHtcbiAgICAgICAgcmV0dXJuIG5vdFlldEltcGxlbWVudGVkKCdkaXNwb3NlRGF0YScpO1xuICAgIH1cbiAgICB3cml0ZSh2YWx1ZXMsIHNoYXBlLCBkdHlwZSkge1xuICAgICAgICByZXR1cm4gbm90WWV0SW1wbGVtZW50ZWQoJ3dyaXRlJyk7XG4gICAgfVxuICAgIG1vdmUoZGF0YUlkLCB2YWx1ZXMsIHNoYXBlLCBkdHlwZSwgcmVmQ291bnQpIHtcbiAgICAgICAgcmV0dXJuIG5vdFlldEltcGxlbWVudGVkKCdtb3ZlJyk7XG4gICAgfVxuICAgIG1lbW9yeSgpIHtcbiAgICAgICAgcmV0dXJuIG5vdFlldEltcGxlbWVudGVkKCdtZW1vcnknKTtcbiAgICB9XG4gICAgLyoqIFJldHVybnMgdGhlIGhpZ2hlc3QgcHJlY2lzaW9uIGZvciBmbG9hdHMgaW4gYml0cyAoZS5nLiAxNiBvciAzMikgKi9cbiAgICBmbG9hdFByZWNpc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIG5vdFlldEltcGxlbWVudGVkKCdmbG9hdFByZWNpc2lvbicpO1xuICAgIH1cbiAgICAvKiogUmV0dXJucyB0aGUgc21hbGxlc3QgcmVwcmVzZW50YWJsZSBudW1iZXIuICAqL1xuICAgIGVwc2lsb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZsb2F0UHJlY2lzaW9uKCkgPT09IDMyID8gRVBTSUxPTl9GTE9BVDMyIDogRVBTSUxPTl9GTE9BVDE2O1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICByZXR1cm4gbm90WWV0SW1wbGVtZW50ZWQoJ2Rpc3Bvc2UnKTtcbiAgICB9XG59XG5mdW5jdGlvbiBub3RZZXRJbXBsZW1lbnRlZChrZXJuZWxOYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAnJHtrZXJuZWxOYW1lfScgbm90IHlldCBpbXBsZW1lbnRlZCBvciBub3QgZm91bmQgaW4gdGhlIHJlZ2lzdHJ5LiBgICtcbiAgICAgICAgYFRoaXMga2VybmVsIG1heSBub3QgYmUgc3VwcG9ydGVkIGJ5IHRoZSB0ZmpzIGJhY2tlbmQgeW91IGhhdmUgY2hvc2VuYCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iYWNrZW5kLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGRlY29kZVN0cmluZywgZW5jb2RlU3RyaW5nIH0gZnJvbSAnLi4vdXRpbCc7XG4vLyBVdGlsaXRpZXMgbmVlZGVkIGJ5IGJhY2tlbmQgY29uc3VtZXJzIG9mIHRmLWNvcmUuXG5leHBvcnQgKiBmcm9tICcuLi9vcHMvYXhpc191dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL29wcy9icm9hZGNhc3RfdXRpbCc7XG5leHBvcnQgKiBmcm9tICcuLi9vcHMvY29uY2F0X3V0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi4vb3BzL2NvbnZfdXRpbCc7XG5leHBvcnQgKiBmcm9tICcuLi9vcHMvZnVzZWRfdXRpbCc7XG5leHBvcnQgKiBmcm9tICcuLi9vcHMvcmVkdWNlX3V0aWwnO1xuaW1wb3J0ICogYXMgc2xpY2VfdXRpbCBmcm9tICcuLi9vcHMvc2xpY2VfdXRpbCc7XG5leHBvcnQgeyBzbGljZV91dGlsIH07XG5leHBvcnQgeyB1cGNhc3RUeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi4vb3BzL3JvdGF0ZV91dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL29wcy9hcnJheV9vcHNfdXRpbCc7XG5leHBvcnQgKiBmcm9tICcuLi9vcHMvZ2F0aGVyX25kX3V0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi4vb3BzL3NjYXR0ZXJfbmRfdXRpbCc7XG5leHBvcnQgKiBmcm9tICcuLi9vcHMvc2VsdV91dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL29wcy9mdXNlZF91dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL29wcy9lcmZfdXRpbCc7XG5leHBvcnQgKiBmcm9tICcuLi9sb2cnO1xuZXhwb3J0ICogZnJvbSAnLi4vYmFja2VuZHMvY29tcGxleF91dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL2JhY2tlbmRzL2VpbnN1bV91dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL29wcy9zcGxpdF91dGlsJztcbmltcG9ydCAqIGFzIHNlZ21lbnRfdXRpbCBmcm9tICcuLi9vcHMvc2VnbWVudF91dGlsJztcbmV4cG9ydCB7IHNlZ21lbnRfdXRpbCB9O1xuZXhwb3J0IGZ1bmN0aW9uIGZyb21VaW50OFRvU3RyaW5nQXJyYXkodmFscykge1xuICAgIHRyeSB7XG4gICAgICAgIC8vIERlY29kZSB0aGUgYnl0ZXMgaW50byBzdHJpbmcuXG4gICAgICAgIHJldHVybiB2YWxzLm1hcCh2YWwgPT4gZGVjb2RlU3RyaW5nKHZhbCkpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGRlY29kZSBlbmNvZGVkIHN0cmluZyBieXRlcyBpbnRvIHV0Zi04LCBlcnJvcjogJHtlcnJ9YCk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGZyb21TdHJpbmdBcnJheVRvVWludDgoc3RyaW5ncykge1xuICAgIHJldHVybiBzdHJpbmdzLm1hcChzID0+IGVuY29kZVN0cmluZyhzKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iYWNrZW5kX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLyoqXG4gKiBNZXJnZXMgcmVhbCBhbmQgaW1hZ2luYXJ5IEZsb2F0MzJBcnJheXMgaW50byBhIHNpbmdsZSBjb21wbGV4IEZsb2F0MzJBcnJheS5cbiAqXG4gKiBUaGUgbWVtb3J5IGxheW91dCBpcyBpbnRlcmxlYXZlZCBhcyBmb2xsb3dzOlxuICogcmVhbDogW3IwLCByMSwgcjJdXG4gKiBpbWFnOiBbaTAsIGkxLCBpMl1cbiAqIGNvbXBsZXg6IFtyMCwgaTAsIHIxLCBpMSwgcjIsIGkyXVxuICpcbiAqIFRoaXMgaXMgdGhlIGludmVyc2Ugb2Ygc3BsaXRSZWFsQW5kSW1hZ0FycmF5cy5cbiAqXG4gKiBAcGFyYW0gcmVhbCBUaGUgcmVhbCB2YWx1ZXMgb2YgdGhlIGNvbXBsZXggdGVuc29yIHZhbHVlcy5cbiAqIEBwYXJhbSBpbWFnIFRoZSBpbWFnIHZhbHVlcyBvZiB0aGUgY29tcGxleCB0ZW5zb3IgdmFsdWVzLlxuICogQHJldHVybnMgQSBjb21wbGV4IHRlbnNvciBhcyBhIEZsb2F0MzJBcnJheSB3aXRoIG1lcmdlZCB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVJlYWxBbmRJbWFnQXJyYXlzKHJlYWwsIGltYWcpIHtcbiAgICBpZiAocmVhbC5sZW5ndGggIT09IGltYWcubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IG1lcmdlIHJlYWwgYW5kIGltYWcgYXJyYXlzIG9mIGRpZmZlcmVudCBsZW5ndGhzLiByZWFsOmAgK1xuICAgICAgICAgICAgYCR7cmVhbC5sZW5ndGh9LCBpbWFnOiAke2ltYWcubGVuZ3RofS5gKTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IEZsb2F0MzJBcnJheShyZWFsLmxlbmd0aCAqIDIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgIHJlc3VsdFtpXSA9IHJlYWxbaSAvIDJdO1xuICAgICAgICByZXN1bHRbaSArIDFdID0gaW1hZ1tpIC8gMl07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIFNwbGl0cyBhIGNvbXBsZXggRmxvYXQzMkFycmF5IGludG8gcmVhbCBhbmQgaW1hZyBwYXJ0cy5cbiAqXG4gKiBUaGUgbWVtb3J5IGxheW91dCBpcyBpbnRlcmxlYXZlZCBhcyBmb2xsb3dzOlxuICogY29tcGxleDogW3IwLCBpMCwgcjEsIGkxLCByMiwgaTJdXG4gKiByZWFsOiBbcjAsIHIxLCByMl1cbiAqIGltYWc6IFtpMCwgaTEsIGkyXVxuICpcbiAqIFRoaXMgaXMgdGhlIGludmVyc2Ugb2YgbWVyZ2VSZWFsQW5kSW1hZ0FycmF5cy5cbiAqXG4gKiBAcGFyYW0gY29tcGxleCBUaGUgY29tcGxleCB0ZW5zb3IgdmFsdWVzLlxuICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggcmVhbCBhbmQgaW1hZyBGbG9hdDMyQXJyYXkgY29tcG9uZW50cyBvZiB0aGUgY29tcGxleFxuICogICAgIHRlbnNvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0UmVhbEFuZEltYWdBcnJheXMoY29tcGxleCkge1xuICAgIGNvbnN0IHJlYWwgPSBuZXcgRmxvYXQzMkFycmF5KGNvbXBsZXgubGVuZ3RoIC8gMik7XG4gICAgY29uc3QgaW1hZyA9IG5ldyBGbG9hdDMyQXJyYXkoY29tcGxleC5sZW5ndGggLyAyKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbXBsZXgubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgcmVhbFtpIC8gMl0gPSBjb21wbGV4W2ldO1xuICAgICAgICBpbWFnW2kgLyAyXSA9IGNvbXBsZXhbaSArIDFdO1xuICAgIH1cbiAgICByZXR1cm4geyByZWFsLCBpbWFnIH07XG59XG4vKipcbiAqIEV4dHJhY3RzIGV2ZW4gaW5kZXhlZCBjb21wbGV4IHZhbHVlcyBpbiB0aGUgZ2l2ZW4gYXJyYXkuXG4gKiBAcGFyYW0gY29tcGxleCBUaGUgY29tcGxleCB0ZW5zb3IgdmFsdWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wbGV4V2l0aEV2ZW5JbmRleChjb21wbGV4KSB7XG4gICAgY29uc3QgbGVuID0gTWF0aC5jZWlsKGNvbXBsZXgubGVuZ3RoIC8gNCk7XG4gICAgY29uc3QgcmVhbCA9IG5ldyBGbG9hdDMyQXJyYXkobGVuKTtcbiAgICBjb25zdCBpbWFnID0gbmV3IEZsb2F0MzJBcnJheShsZW4pO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tcGxleC5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgICByZWFsW01hdGguZmxvb3IoaSAvIDQpXSA9IGNvbXBsZXhbaV07XG4gICAgICAgIGltYWdbTWF0aC5mbG9vcihpIC8gNCldID0gY29tcGxleFtpICsgMV07XG4gICAgfVxuICAgIHJldHVybiB7IHJlYWwsIGltYWcgfTtcbn1cbi8qKlxuICogRXh0cmFjdHMgb2RkIGluZGV4ZWQgY29tcGxlIHZhbHVlcyBpbiB0aGUgZ2l2ZW4gYXJyYXkuXG4gKiBAcGFyYW0gY29tcGxleCBUaGUgY29tcGxleCB0ZW5zb3IgdmFsdWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wbGV4V2l0aE9kZEluZGV4KGNvbXBsZXgpIHtcbiAgICBjb25zdCBsZW4gPSBNYXRoLmZsb29yKGNvbXBsZXgubGVuZ3RoIC8gNCk7XG4gICAgY29uc3QgcmVhbCA9IG5ldyBGbG9hdDMyQXJyYXkobGVuKTtcbiAgICBjb25zdCBpbWFnID0gbmV3IEZsb2F0MzJBcnJheShsZW4pO1xuICAgIGZvciAobGV0IGkgPSAyOyBpIDwgY29tcGxleC5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgICByZWFsW01hdGguZmxvb3IoaSAvIDQpXSA9IGNvbXBsZXhbaV07XG4gICAgICAgIGltYWdbTWF0aC5mbG9vcihpIC8gNCldID0gY29tcGxleFtpICsgMV07XG4gICAgfVxuICAgIHJldHVybiB7IHJlYWwsIGltYWcgfTtcbn1cbi8qKlxuICogR2V0IHRoZSBtYXAgcmVwcmVzZW50aW5nIGEgY29tcGxleCB2YWx1ZSBpbiB0aGUgZ2l2ZW4gYXJyYXkuXG4gKiBAcGFyYW0gY29tcGxleCBUaGUgY29tcGxleCB0ZW5zb3IgdmFsdWVzLlxuICogQHBhcmFtIGluZGV4IEFuIGluZGV4IG9mIHRoZSB0YXJnZXQgY29tcGxleCB2YWx1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvbXBsZXhXaXRoSW5kZXgoY29tcGxleCwgaW5kZXgpIHtcbiAgICBjb25zdCByZWFsID0gY29tcGxleFtpbmRleCAqIDJdO1xuICAgIGNvbnN0IGltYWcgPSBjb21wbGV4W2luZGV4ICogMiArIDFdO1xuICAgIHJldHVybiB7IHJlYWwsIGltYWcgfTtcbn1cbi8qKlxuICogSW5zZXJ0IGEgZ2l2ZW4gY29tcGxleCB2YWx1ZSBpbnRvIHRoZSBUeXBlZEFycmF5LlxuICogQHBhcmFtIGRhdGEgVGhlIGFycmF5IGluIHdoaWNoIHRoZSBjb21wbGV4IHZhbHVlIGlzIGluc2VydGVkLlxuICogQHBhcmFtIGMgVGhlIGNvbXBsZXggdmFsdWUgdG8gYmUgaW5zZXJ0ZWQuXG4gKiBAcGFyYW0gaW5kZXggQW4gaW5kZXggb2YgdGhlIHRhcmdldCBjb21wbGV4IHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzaWduVG9UeXBlZEFycmF5KGRhdGEsIHJlYWwsIGltYWcsIGluZGV4KSB7XG4gICAgZGF0YVtpbmRleCAqIDJdID0gcmVhbDtcbiAgICBkYXRhW2luZGV4ICogMiArIDFdID0gaW1hZztcbn1cbi8qKlxuICogTWFrZSB0aGUgbGlzdCBvZiBleHBvbmVudCB0ZXJtcyB1c2VkIGJ5IEZGVC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4cG9uZW50cyhuLCBpbnZlcnNlKSB7XG4gICAgY29uc3QgcmVhbCA9IG5ldyBGbG9hdDMyQXJyYXkobiAvIDIpO1xuICAgIGNvbnN0IGltYWcgPSBuZXcgRmxvYXQzMkFycmF5KG4gLyAyKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGguY2VpbChuIC8gMik7IGkrKykge1xuICAgICAgICBjb25zdCB4ID0gKGludmVyc2UgPyAyIDogLTIpICogTWF0aC5QSSAqIChpIC8gbik7XG4gICAgICAgIHJlYWxbaV0gPSBNYXRoLmNvcyh4KTtcbiAgICAgICAgaW1hZ1tpXSA9IE1hdGguc2luKHgpO1xuICAgIH1cbiAgICByZXR1cm4geyByZWFsLCBpbWFnIH07XG59XG4vKipcbiAqIE1ha2UgdGhlIGV4cG9uZW50IHRlcm0gdXNlZCBieSBGRlQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHBvbmVudChrLCBuLCBpbnZlcnNlKSB7XG4gICAgY29uc3QgeCA9IChpbnZlcnNlID8gMiA6IC0yKSAqIE1hdGguUEkgKiAoayAvIG4pO1xuICAgIGNvbnN0IHJlYWwgPSBNYXRoLmNvcyh4KTtcbiAgICBjb25zdCBpbWFnID0gTWF0aC5zaW4oeCk7XG4gICAgcmV0dXJuIHsgcmVhbCwgaW1hZyB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29tcGxleF91dGlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWxfYmFzZSc7XG5jb25zdCBBUlJPVyA9ICctPic7XG5jb25zdCBBUlJPV19SRUdFWCA9IC8tPi9nO1xuY29uc3QgQ09NTUEgPSAnLCc7XG5jb25zdCBFTExJUFNJUyA9ICcuLi4nO1xuLyoqXG4gKiBQYXJzZSBhbiBlcXVhdGlvbiBmb3IgZWluc3VtLlxuICpcbiAqIEBwYXJhbSBlcXVhdGlvbiBUaGUgZWluc3VtIGVxdWF0aW9uIChlLmcuLCBcImlqLGprLT5pa1wiKS5cbiAqIEBwYXJhbSBudW1UZW5zb3JzIE51bWJlciBvZiB0ZW5zb3JzIHByb3ZpZGVkIGFsb25nIHdpdGggYGVxdWF0aW9uYC4gVXNlZCB0b1xuICogICBjaGVjayBtYXRjaGluZyBudW1iZXIgb2YgaW5wdXQgdGVuc29ycy5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCBjb25zaXN0aW5nIG9mIHRoZSBmb2xsb3dpbmcgZmllbGRzOlxuICogICAtIGFsbERpbXM6IGFsbCBkaW1lbnNpb24gbmFtZXMgYXMgc3RyaW5ncy5cbiAqICAgLSBzdW1tZWREaW1zOiBhIGxpc3Qgb2YgYWxsIGRpbWVuc2lvbnMgYmVpbmcgc3VtbWVkIG92ZXIsIGFzIGluZGljZXMgdG9cbiAqICAgICB0aGUgZWxlbWVudHMgb2YgYGFsbERpbXNgLlxuICogICAtIGlkRGltczogaW5kaWNlcyBvZiB0aGUgZGltZW5zaW9ucyBpbiBlYWNoIGlucHV0IHRlbnNvciwgYXMgaW5kaWNlcyB0b1xuICogICAgIHRoZSBlbGVtZW50cyBvZiBgYWxsRGltcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUVpbnN1bUVxdWF0aW9uKGVxdWF0aW9uLCBudW1UZW5zb3JzKSB7XG4gICAgZXF1YXRpb24gPSBlcXVhdGlvbi5yZXBsYWNlKC9cXHMvZywgJycpOyAvLyBSZW1vdmUgd2l0ZXNwYWNlIGluIGVxdWF0aW9uLlxuICAgIGNvbnN0IG51bUFycm93cyA9IChlcXVhdGlvbi5sZW5ndGggLSBlcXVhdGlvbi5yZXBsYWNlKEFSUk9XX1JFR0VYLCAnJykubGVuZ3RoKSAvXG4gICAgICAgIEFSUk9XLmxlbmd0aDtcbiAgICBpZiAobnVtQXJyb3dzIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VxdWF0aW9ucyB3aXRob3V0IGFuIGFycm93IGFyZSBub3Qgc3VwcG9ydGVkLicpO1xuICAgIH1cbiAgICBlbHNlIGlmIChudW1BcnJvd3MgPiAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXF1YXRpb24gbXVzdCBjb250YWluIGV4YWN0bHkgb25lIGFycm93IChcIiR7QVJST1d9XCIpLmApO1xuICAgIH1cbiAgICBjb25zdCBbaW5wdXRTdHJpbmcsIG91dHB1dFN0cmluZ10gPSBlcXVhdGlvbi5zcGxpdChBUlJPVyk7XG4gICAgYXNzZXJ0KGlucHV0U3RyaW5nLmluZGV4T2YoRUxMSVBTSVMpID09PSAtMSwgKCkgPT4gYFRoZSBlbGxpcHNpcyBub3RhdGlvbiAoXCIke0VMTElQU0lTfVwiKSBpcyBub3Qgc3VwcG9ydGVkIHlldC5gKTtcbiAgICBjb25zdCBpbnB1dFRlcm1zID0gaW5wdXRTdHJpbmcuc3BsaXQoQ09NTUEpO1xuICAgIGNvbnN0IG51bUlucHV0cyA9IGlucHV0VGVybXMubGVuZ3RoO1xuICAgIGlmIChudW1UZW5zb3JzICE9PSBudW1JbnB1dHMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke251bUlucHV0c30gaW5wdXQgdGVuc29ycywgcmVjZWl2ZWQgJHtudW1UZW5zb3JzfWApO1xuICAgIH1cbiAgICBpZiAobnVtSW5wdXRzID4gMikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N1cHBvcnQgZm9yIG1vcmUgdGhhbiAyIGlucHV0IHRlbnNvcnMgaXMgbm90IGltcGxlbWVudGVkIHlldC4nKTtcbiAgICB9XG4gICAgY29uc3QgYWxsRGltcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0cHV0U3RyaW5nLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IGRpbU5hbWUgPSBvdXRwdXRTdHJpbmdbaV07XG4gICAgICAgIGlmICghaW5wdXRUZXJtcy5zb21lKGlucHV0VGVybSA9PiBpbnB1dFRlcm0uaW5kZXhPZihkaW1OYW1lKSAhPT0gLTEpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE91dHB1dCBzdWJzY3JpcHRzIGNvbnRhaW4gdGhlIGxhYmVsICR7ZGltTmFtZX0gYCArXG4gICAgICAgICAgICAgICAgYG5vdCBwcmVzZW50IGluIHRoZSBpbnB1dCBzdWJzY3JpcHRzLmApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbGxEaW1zLmluZGV4T2YoZGltTmFtZSkgPT09IC0xKSB7XG4gICAgICAgICAgICBhbGxEaW1zLnB1c2goZGltTmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dFN0cmluZy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBkaW1OYW1lID0gaW5wdXRTdHJpbmdbaV07XG4gICAgICAgIGlmIChhbGxEaW1zLmluZGV4T2YoZGltTmFtZSkgPT09IC0xICYmIGRpbU5hbWUgIT09IENPTU1BKSB7XG4gICAgICAgICAgICBhbGxEaW1zLnB1c2goZGltTmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaWREaW1zID0gbmV3IEFycmF5KGlucHV0VGVybXMubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUlucHV0czsgKytpKSB7XG4gICAgICAgIGlmIChuZXcgU2V0KGlucHV0VGVybXNbaV0uc3BsaXQoJycpKS5zaXplICE9PSBpbnB1dFRlcm1zW2ldLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGb3VuZCBkdXBsaWNhdGUgYXhlcyBpbiBpbnB1dCBjb21wb25lbnQgJHtpbnB1dFRlcm1zW2ldfS4gYCArXG4gICAgICAgICAgICAgICAgYFN1cHBvcnQgZm9yIGR1cGxpY2F0ZSBheGVzIGluIGlucHV0IGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWREaW1zW2ldID0gW107XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaW5wdXRUZXJtc1tpXS5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgaWREaW1zW2ldLnB1c2goYWxsRGltcy5pbmRleE9mKGlucHV0VGVybXNbaV1bal0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBudW1EaW1zID0gYWxsRGltcy5sZW5ndGg7IC8vIE51bWJlciBvZiB1bmlxdWUgZGltZW5zaW9ucy5cbiAgICBjb25zdCBudW1PdXREaW1zID0gb3V0cHV0U3RyaW5nLmxlbmd0aDsgLy8gTnVtYmVyIG9mIG91dHB1dCBkaW1lbnNpb25zLlxuICAgIGNvbnN0IHN1bW1lZERpbXMgPSBbXTsgLy8gRGltZW5zaW9ucyBiZWluZyBzdW1tZWQgb3Zlci5cbiAgICBmb3IgKGxldCBpID0gbnVtT3V0RGltczsgaSA8IG51bURpbXM7ICsraSkge1xuICAgICAgICBzdW1tZWREaW1zLnB1c2goaSk7XG4gICAgfVxuICAgIHJldHVybiB7IGFsbERpbXMsIHN1bW1lZERpbXMsIGlkRGltcyB9O1xufVxuLyoqXG4gKiBHZXQgdGhlIHBlcm11dGF0aW9uIGZvciBhIGdpdmVuIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAcGFyYW0gbkRpbXMgVG90YWwgbnVtYmVyIG9mIGRpbWVuc2lvbiBvZiBhbGwgdGVuc29ycyBpbnZvbHZlZCBpbiB0aGUgZWluc3VtXG4gKiAgIG9wZXJhdGlvbi5cbiAqIEBwYXJhbSBpZERpbXMgRGltZW5zaW9uIGluZGljZXMgaW52b2x2ZSBpbiB0aGUgdGVuc29yIGluIHF1ZXN0aW9uLlxuICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnNpc3Rpbmcgb2YgdGhlIGZvbGxvd2luZyBmaWVsZHM6XG4gKiAgIC0gcGVybXV0YXRpb25JbmRpY2VzOiBJbmRpY2VzIHRvIHBlcm11dGUgdGhlIGF4ZXMgb2YgdGhlIHRlbnNvciB3aXRoLlxuICogICAtIGV4cGFuZERpbXM6IEluZGljZXMgdG8gdGhlIGRpbWVuc2lvbiB0aGF0IG5lZWQgdG8gYmUgZXhwYW5kZWQgZnJvbSB0aGVcbiAqICAgICB0ZW5zb3IgYWZ0ZXIgcGVybXV0YXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFaW5zdW1QZXJtdXRhdGlvbihuRGltcywgaWREaW1zKSB7XG4gICAgbGV0IHBlcm11dGF0aW9uSW5kaWNlcyA9IG5ldyBBcnJheShuRGltcyk7XG4gICAgcGVybXV0YXRpb25JbmRpY2VzLmZpbGwoLTEpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaWREaW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHBlcm11dGF0aW9uSW5kaWNlc1tpZERpbXNbaV1dID0gaTtcbiAgICB9XG4gICAgY29uc3QgZXhwYW5kRGltcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbkRpbXM7ICsraSkge1xuICAgICAgICBpZiAocGVybXV0YXRpb25JbmRpY2VzW2ldID09PSAtMSkge1xuICAgICAgICAgICAgZXhwYW5kRGltcy5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHBlcm11dGF0aW9uSW5kaWNlcyA9IHBlcm11dGF0aW9uSW5kaWNlcy5maWx0ZXIoZCA9PiBkICE9PSAtMSk7XG4gICAgcmV0dXJuIHsgcGVybXV0YXRpb25JbmRpY2VzLCBleHBhbmREaW1zIH07XG59XG4vKipcbiAqIENoZWNrcyB0aGF0IHRoZSBkaW1lbnNpb24gc2l6ZXMgZnJvbSBkaWZmZXJlbnQgaW5wdXQgdGVuc29ycyBtYXRjaCB0aGVcbiAqIGVxdWF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tFaW5zdW1EaW1TaXplcyhuRGltcywgaWREaW1zLCB0ZW5zb3JzKSB7XG4gICAgY29uc3QgZGltU2l6ZXMgPSBuZXcgQXJyYXkobkRpbXMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGVuc29ycy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBzaGFwZSA9IHRlbnNvcnNbaV0uc2hhcGU7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaWREaW1zW2ldLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICBpZiAoZGltU2l6ZXNbaWREaW1zW2ldW2pdXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZGltU2l6ZXNbaWREaW1zW2ldW2pdXSA9IHNoYXBlW2pdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KGRpbVNpemVzW2lkRGltc1tpXVtqXV0gPT09IHNoYXBlW2pdLCAoKSA9PiBgRXhwZWN0ZWQgZGltZW5zaW9uICR7ZGltU2l6ZXNbaWREaW1zW2ldW2pdXX0gYXQgYXhpcyAke2p9IGAgK1xuICAgICAgICAgICAgICAgICAgICBgb2YgaW5wdXQgc2hhcGVkICR7SlNPTi5zdHJpbmdpZnkoc2hhcGUpfSwgYCArXG4gICAgICAgICAgICAgICAgICAgIGBidXQgZ290IGRpbWVuc2lvbiAke3NoYXBlW2pdfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBHZXRzIHBhdGggb2YgY29tcHV0YXRpb24gZm9yIGVpbnN1bS5cbiAqXG4gKiBAcGFyYW0gc3VtbWVkRGltcyBpbmRpY2VzIHRvIHRoZSBkaW1lbnNpb25zIGJlaW5nIHN1bW1lZCBvdmVyLlxuICogQHBhcmFtIGlkRGltcyBBIGxvb2sgdXAgdGFibGUgZm9yIHRoZSBkaW1lbnNpb25zIHByZXNlbnQgaW4gZWFjaCBpbnB1dFxuICogICAgIHRlbnNvci4gRWFjaCBjb25zaXR1ZW50IGFycmF5IGNvbnRhaW5zIGluZGljZXMgZm9yIHRoZSBkaW1lbnNpb25zIGluIHRoZVxuICogICAgIGNvcnJlc3BvbmRpbmcgaW5wdXQgdGVuc29yLlxuICpcbiAqIEByZXR1cm4gQSBtYXAgd2l0aCB0d28gZmllbGRzOlxuICogICAtIHBhdGg6IFRoZSBwYXRoIG9mIGNvbXB1dGF0aW9uLCB3aXRoIGVhY2ggZWxlbWVudCBpbmRpY2F0aW5nIHRoZSBkaW1lbnNpb25cbiAqICAgICBiZWluZyBzdW1tZWQgb3ZlciBhZnRlciB0aGUgZWxlbWVudC13aXNlIG11bHRpcGxpY2F0aW9uIGluIHRoYXQgc3RlcC5cbiAqICAgLSBzdGVwczogV2l0aCB0aGUgc2FtZSBsZW5ndGggYXMgYHBhdGhgLiBFYWNoIGVsZW1lbnQgY29udGFpbnMgdGhlIGluZGljZXNcbiAqICAgICB0byB0aGUgaW5wdXQgdGVuc29ycyBiZWluZyB1c2VkIGZvciBlbGVtZW50LXdpc2UgbXVsdGlwbGljYXRpb24gaW4gdGhlXG4gKiAgICAgY29ycmVzcG9uZGluZyBzdGVwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWluc3VtQ29tcHV0ZVBhdGgoc3VtbWVkRGltcywgaWREaW1zKSB7XG4gICAgY29uc3QgcGF0aCA9IHN1bW1lZERpbXM7XG4gICAgY29uc3Qgc3RlcHMgPSBbXTtcbiAgICBsZXQgblN0ZXBzID0gMDtcbiAgICBpZiAoc3VtbWVkRGltcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gRWluc3VtIHRoYXQgaW52b2xlcyBubyBzdW1taW5nOiBlLmcuLCB0cmFuc3Bvc2UgYW5kIG91dGVyIHByb2R1Y3QuXG4gICAgICAgIHBhdGgucHVzaCgtMSk7XG4gICAgfVxuICAgIG5TdGVwcyA9IHN1bW1lZERpbXMubGVuZ3RoICsgMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5TdGVwczsgKytpKSB7XG4gICAgICAgIHN0ZXBzLnB1c2goW10pO1xuICAgIH1cbiAgICBjb25zdCBjb21wdXRlZFRlcm1JbmRpY2VzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IHN1bW1lZERpbSA9IHBhdGhbaV07XG4gICAgICAgIGNvbnN0IHRlcm1JbmRpY2VzID0gZmluZFRlcm1zV2l0aERpbShpZERpbXMsIHN1bW1lZERpbSk7XG4gICAgICAgIGZvciAoY29uc3QgdGVybUluZGV4IG9mIHRlcm1JbmRpY2VzKSB7XG4gICAgICAgICAgICBpZiAoY29tcHV0ZWRUZXJtSW5kaWNlcy5pbmRleE9mKHRlcm1JbmRleCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgc3RlcHNbaV0ucHVzaCh0ZXJtSW5kZXgpO1xuICAgICAgICAgICAgICAgIGNvbXB1dGVkVGVybUluZGljZXMucHVzaCh0ZXJtSW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IHBhdGgsIHN0ZXBzIH07XG59XG4vKiogRGV0ZXJtaW5lcyBpZiBhbiBheGVzIHBlcm11dGF0aW9uIGlzIHRoZSBpZGVudGl0eSBwZXJtdXRhdGlvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0lkZW50aXR5UGVybXV0YXRpb24ocGVybSkge1xuICAgIHJldHVybiBwZXJtLmV2ZXJ5KChkaW0sIGluZGV4KSA9PiBkaW0gPT09IGluZGV4KTtcbn1cbmZ1bmN0aW9uIGZpbmRUZXJtc1dpdGhEaW0oaWREaW1zLCBkaW0pIHtcbiAgICBjb25zdCB0ZXJtSW5kaWNlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaWREaW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmIChpZERpbXNbaV0ubGVuZ3RoID09PSAwIHx8IGlkRGltc1tpXS5pbmRleE9mKGRpbSkgIT09IC0xIHx8IGRpbSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRlcm1JbmRpY2VzLnB1c2goaSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRlcm1JbmRpY2VzO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZWluc3VtX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuZXhwb3J0IHsgbm9uTWF4U3VwcHJlc3Npb25WM0ltcGwsIG5vbk1heFN1cHByZXNzaW9uVjRJbXBsLCBub25NYXhTdXBwcmVzc2lvblY1SW1wbCB9IGZyb20gJy4vbm9uX21heF9zdXBwcmVzc2lvbl9pbXBsJztcbmV4cG9ydCB7IHdoZXJlSW1wbCB9IGZyb20gJy4vd2hlcmVfaW1wbCc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1rZXJuZWxfaW1wbHMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmluYXJ5SW5zZXJ0IH0gZnJvbSAnLi9ub25fbWF4X3N1cHByZXNzaW9uX3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIG5vbk1heFN1cHByZXNzaW9uVjNJbXBsKGJveGVzLCBzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQpIHtcbiAgICByZXR1cm4gbm9uTWF4U3VwcHJlc3Npb25JbXBsXyhib3hlcywgc2NvcmVzLCBtYXhPdXRwdXRTaXplLCBpb3VUaHJlc2hvbGQsIHNjb3JlVGhyZXNob2xkLCAwIC8qIHNvZnRObXNTaWdtYSAqLyk7XG59XG5leHBvcnQgZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25WNEltcGwoYm94ZXMsIHNjb3JlcywgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCwgcGFkVG9NYXhPdXRwdXRTaXplKSB7XG4gICAgcmV0dXJuIG5vbk1heFN1cHByZXNzaW9uSW1wbF8oYm94ZXMsIHNjb3JlcywgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCwgMCAvKiBzb2Z0Tm1zU2lnbWEgKi8sIGZhbHNlIC8qIHJldHVyblNjb3Jlc1RlbnNvciAqLywgcGFkVG9NYXhPdXRwdXRTaXplIC8qIHBhZFRvTWF4T3V0cHV0U2l6ZSAqLywgdHJ1ZVxuICAgIC8qIHJldHVyblZhbGlkT3V0cHV0cyAqLyApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG5vbk1heFN1cHByZXNzaW9uVjVJbXBsKGJveGVzLCBzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsIHNvZnRObXNTaWdtYSkge1xuICAgIHJldHVybiBub25NYXhTdXBwcmVzc2lvbkltcGxfKGJveGVzLCBzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsIHNvZnRObXNTaWdtYSwgdHJ1ZSAvKiByZXR1cm5TY29yZXNUZW5zb3IgKi8pO1xufVxuZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25JbXBsXyhib3hlcywgc2NvcmVzLCBtYXhPdXRwdXRTaXplLCBpb3VUaHJlc2hvbGQsIHNjb3JlVGhyZXNob2xkLCBzb2Z0Tm1zU2lnbWEsIHJldHVyblNjb3Jlc1RlbnNvciA9IGZhbHNlLCBwYWRUb01heE91dHB1dFNpemUgPSBmYWxzZSwgcmV0dXJuVmFsaWRPdXRwdXRzID0gZmFsc2UpIHtcbiAgICAvLyBUaGUgbGlzdCBpcyBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyLCBzbyB0aGF0IHdlIGNhbiBhbHdheXMgcG9wIHRoZVxuICAgIC8vIGNhbmRpZGF0ZSB3aXRoIHRoZSBsYXJnZXN0IHNjb3JlIGluIE8oMSkgdGltZS5cbiAgICBjb25zdCBjYW5kaWRhdGVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY29yZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHNjb3Jlc1tpXSA+IHNjb3JlVGhyZXNob2xkKSB7XG4gICAgICAgICAgICBjYW5kaWRhdGVzLnB1c2goeyBzY29yZTogc2NvcmVzW2ldLCBib3hJbmRleDogaSwgc3VwcHJlc3NCZWdpbkluZGV4OiAwIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhbmRpZGF0ZXMuc29ydChhc2NlbmRpbmdDb21wYXJhdG9yKTtcbiAgICAvLyBJZiBzb2Z0Tm1zU2lnbWEgaXMgMCwgdGhlIG91dGNvbWUgb2YgdGhpcyBhbGdvcml0aG0gaXMgZXhhY3RseSBzYW1lIGFzXG4gICAgLy8gYmVmb3JlLlxuICAgIGNvbnN0IHNjYWxlID0gc29mdE5tc1NpZ21hID4gMCA/ICgtMC41IC8gc29mdE5tc1NpZ21hKSA6IDAuMDtcbiAgICBjb25zdCBzZWxlY3RlZEluZGljZXMgPSBbXTtcbiAgICBjb25zdCBzZWxlY3RlZFNjb3JlcyA9IFtdO1xuICAgIHdoaWxlIChzZWxlY3RlZEluZGljZXMubGVuZ3RoIDwgbWF4T3V0cHV0U2l6ZSAmJiBjYW5kaWRhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gY2FuZGlkYXRlcy5wb3AoKTtcbiAgICAgICAgY29uc3QgeyBzY29yZTogb3JpZ2luYWxTY29yZSwgYm94SW5kZXgsIHN1cHByZXNzQmVnaW5JbmRleCB9ID0gY2FuZGlkYXRlO1xuICAgICAgICBpZiAob3JpZ2luYWxTY29yZSA8IHNjb3JlVGhyZXNob2xkKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLyBPdmVybGFwcGluZyBib3hlcyBhcmUgbGlrZWx5IHRvIGhhdmUgc2ltaWxhciBzY29yZXMsIHRoZXJlZm9yZSB3ZVxuICAgICAgICAvLyBpdGVyYXRlIHRocm91Z2ggdGhlIHByZXZpb3VzbHkgc2VsZWN0ZWQgYm94ZXMgYmFja3dhcmRzIGluIG9yZGVyIHRvXG4gICAgICAgIC8vIHNlZSBpZiBjYW5kaWRhdGUncyBzY29yZSBzaG91bGQgYmUgc3VwcHJlc3NlZC4gV2UgdXNlXG4gICAgICAgIC8vIHN1cHByZXNzQmVnaW5JbmRleCB0byB0cmFjayBhbmQgZW5zdXJlIGEgY2FuZGlkYXRlIGNhbiBiZSBzdXBwcmVzc2VkXG4gICAgICAgIC8vIGJ5IGEgc2VsZWN0ZWQgYm94IG5vIG1vcmUgdGhhbiBvbmNlLiBBbHNvLCBpZiB0aGUgb3ZlcmxhcCBleGNlZWRzXG4gICAgICAgIC8vIGlvdVRocmVzaG9sZCwgd2Ugc2ltcGx5IGlnbm9yZSB0aGUgY2FuZGlkYXRlLlxuICAgICAgICBsZXQgaWdub3JlQ2FuZGlkYXRlID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGogPSBzZWxlY3RlZEluZGljZXMubGVuZ3RoIC0gMTsgaiA+PSBzdXBwcmVzc0JlZ2luSW5kZXg7IC0taikge1xuICAgICAgICAgICAgY29uc3QgaW91ID0gaW50ZXJzZWN0aW9uT3ZlclVuaW9uKGJveGVzLCBib3hJbmRleCwgc2VsZWN0ZWRJbmRpY2VzW2pdKTtcbiAgICAgICAgICAgIGlmIChpb3UgPj0gaW91VGhyZXNob2xkKSB7XG4gICAgICAgICAgICAgICAgaWdub3JlQ2FuZGlkYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbmRpZGF0ZS5zY29yZSA9XG4gICAgICAgICAgICAgICAgY2FuZGlkYXRlLnNjb3JlICogc3VwcHJlc3NXZWlnaHQoaW91VGhyZXNob2xkLCBzY2FsZSwgaW91KTtcbiAgICAgICAgICAgIGlmIChjYW5kaWRhdGUuc2NvcmUgPD0gc2NvcmVUaHJlc2hvbGQpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCBpZiBgY2FuZGlkYXRlLnNjb3JlYCBoYXMgbm90IGRyb3BwZWQgYmVsb3dcbiAgICAgICAgLy8gYHNjb3JlVGhyZXNob2xkYCwgdGhlbiB3ZSBrbm93IHRoYXQgd2Ugd2VudCB0aHJvdWdoIGFsbCBvZiB0aGVcbiAgICAgICAgLy8gcHJldmlvdXMgc2VsZWN0aW9ucyBhbmQgY2FuIHNhZmVseSB1cGRhdGUgYHN1cHByZXNzQmVnaW5JbmRleGAgdG8gdGhlXG4gICAgICAgIC8vIGVuZCBvZiB0aGUgc2VsZWN0ZWQgYXJyYXkuIFRoZW4gd2UgY2FuIHJlLWluc2VydCB0aGUgY2FuZGlkYXRlIHdpdGhcbiAgICAgICAgLy8gdGhlIHVwZGF0ZWQgc2NvcmUgYW5kIHN1cHByZXNzQmVnaW5JbmRleCBiYWNrIGluIHRoZSBjYW5kaWRhdGUgbGlzdC5cbiAgICAgICAgLy8gSWYgb24gdGhlIG90aGVyIGhhbmQsIGBjYW5kaWRhdGUuc2NvcmVgIGhhcyBkcm9wcGVkIGJlbG93IHRoZSBzY29yZVxuICAgICAgICAvLyB0aHJlc2hvbGQsIHdlIHdpbGwgbm90IGFkZCBpdCBiYWNrIHRvIHRoZSBjYW5kaWRhdGVzIGxpc3QuXG4gICAgICAgIGNhbmRpZGF0ZS5zdXBwcmVzc0JlZ2luSW5kZXggPSBzZWxlY3RlZEluZGljZXMubGVuZ3RoO1xuICAgICAgICBpZiAoIWlnbm9yZUNhbmRpZGF0ZSkge1xuICAgICAgICAgICAgLy8gQ2FuZGlkYXRlIGhhcyBwYXNzZWQgYWxsIHRoZSB0ZXN0cywgYW5kIGlzIG5vdCBzdXBwcmVzc2VkLCBzb1xuICAgICAgICAgICAgLy8gc2VsZWN0IHRoZSBjYW5kaWRhdGUuXG4gICAgICAgICAgICBpZiAoY2FuZGlkYXRlLnNjb3JlID09PSBvcmlnaW5hbFNjb3JlKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRJbmRpY2VzLnB1c2goYm94SW5kZXgpO1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkU2NvcmVzLnB1c2goY2FuZGlkYXRlLnNjb3JlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNhbmRpZGF0ZS5zY29yZSA+IHNjb3JlVGhyZXNob2xkKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2FuZGlkYXRlJ3Mgc2NvcmUgaXMgc3VwcHJlc3NlZCBidXQgaXMgc3RpbGwgaGlnaCBlbm91Z2ggdG8gYmVcbiAgICAgICAgICAgICAgICAvLyBjb25zaWRlcmVkLCBzbyBhZGQgYmFjayB0byB0aGUgY2FuZGlkYXRlcyBsaXN0LlxuICAgICAgICAgICAgICAgIGJpbmFyeUluc2VydChjYW5kaWRhdGVzLCBjYW5kaWRhdGUsIGFzY2VuZGluZ0NvbXBhcmF0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIE5vbk1heFN1cHByZXNzaW9uVjQgZmVhdHVyZTogcGFkZGluZyBvdXRwdXQgdG8gbWF4T3V0cHV0U2l6ZS5cbiAgICBjb25zdCB2YWxpZE91dHB1dHMgPSBzZWxlY3RlZEluZGljZXMubGVuZ3RoO1xuICAgIGNvbnN0IGVsZW1zVG9QYWQgPSBtYXhPdXRwdXRTaXplIC0gdmFsaWRPdXRwdXRzO1xuICAgIGlmIChwYWRUb01heE91dHB1dFNpemUgJiYgZWxlbXNUb1BhZCA+IDApIHtcbiAgICAgICAgc2VsZWN0ZWRJbmRpY2VzLnB1c2goLi4ubmV3IEFycmF5KGVsZW1zVG9QYWQpLmZpbGwoMCkpO1xuICAgICAgICBzZWxlY3RlZFNjb3Jlcy5wdXNoKC4uLm5ldyBBcnJheShlbGVtc1RvUGFkKS5maWxsKDAuMCkpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSB7IHNlbGVjdGVkSW5kaWNlcyB9O1xuICAgIGlmIChyZXR1cm5TY29yZXNUZW5zb3IpIHtcbiAgICAgICAgcmVzdWx0WydzZWxlY3RlZFNjb3JlcyddID0gc2VsZWN0ZWRTY29yZXM7XG4gICAgfVxuICAgIGlmIChyZXR1cm5WYWxpZE91dHB1dHMpIHtcbiAgICAgICAgcmVzdWx0Wyd2YWxpZE91dHB1dHMnXSA9IHZhbGlkT3V0cHV0cztcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGludGVyc2VjdGlvbk92ZXJVbmlvbihib3hlcywgaSwgaikge1xuICAgIGNvbnN0IGlDb29yZCA9IGJveGVzLnN1YmFycmF5KGkgKiA0LCBpICogNCArIDQpO1xuICAgIGNvbnN0IGpDb29yZCA9IGJveGVzLnN1YmFycmF5KGogKiA0LCBqICogNCArIDQpO1xuICAgIGNvbnN0IHltaW5JID0gTWF0aC5taW4oaUNvb3JkWzBdLCBpQ29vcmRbMl0pO1xuICAgIGNvbnN0IHhtaW5JID0gTWF0aC5taW4oaUNvb3JkWzFdLCBpQ29vcmRbM10pO1xuICAgIGNvbnN0IHltYXhJID0gTWF0aC5tYXgoaUNvb3JkWzBdLCBpQ29vcmRbMl0pO1xuICAgIGNvbnN0IHhtYXhJID0gTWF0aC5tYXgoaUNvb3JkWzFdLCBpQ29vcmRbM10pO1xuICAgIGNvbnN0IHltaW5KID0gTWF0aC5taW4oakNvb3JkWzBdLCBqQ29vcmRbMl0pO1xuICAgIGNvbnN0IHhtaW5KID0gTWF0aC5taW4oakNvb3JkWzFdLCBqQ29vcmRbM10pO1xuICAgIGNvbnN0IHltYXhKID0gTWF0aC5tYXgoakNvb3JkWzBdLCBqQ29vcmRbMl0pO1xuICAgIGNvbnN0IHhtYXhKID0gTWF0aC5tYXgoakNvb3JkWzFdLCBqQ29vcmRbM10pO1xuICAgIGNvbnN0IGFyZWFJID0gKHltYXhJIC0geW1pbkkpICogKHhtYXhJIC0geG1pbkkpO1xuICAgIGNvbnN0IGFyZWFKID0gKHltYXhKIC0geW1pbkopICogKHhtYXhKIC0geG1pbkopO1xuICAgIGlmIChhcmVhSSA8PSAwIHx8IGFyZWFKIDw9IDApIHtcbiAgICAgICAgcmV0dXJuIDAuMDtcbiAgICB9XG4gICAgY29uc3QgaW50ZXJzZWN0aW9uWW1pbiA9IE1hdGgubWF4KHltaW5JLCB5bWluSik7XG4gICAgY29uc3QgaW50ZXJzZWN0aW9uWG1pbiA9IE1hdGgubWF4KHhtaW5JLCB4bWluSik7XG4gICAgY29uc3QgaW50ZXJzZWN0aW9uWW1heCA9IE1hdGgubWluKHltYXhJLCB5bWF4Sik7XG4gICAgY29uc3QgaW50ZXJzZWN0aW9uWG1heCA9IE1hdGgubWluKHhtYXhJLCB4bWF4Sik7XG4gICAgY29uc3QgaW50ZXJzZWN0aW9uQXJlYSA9IE1hdGgubWF4KGludGVyc2VjdGlvblltYXggLSBpbnRlcnNlY3Rpb25ZbWluLCAwLjApICpcbiAgICAgICAgTWF0aC5tYXgoaW50ZXJzZWN0aW9uWG1heCAtIGludGVyc2VjdGlvblhtaW4sIDAuMCk7XG4gICAgcmV0dXJuIGludGVyc2VjdGlvbkFyZWEgLyAoYXJlYUkgKyBhcmVhSiAtIGludGVyc2VjdGlvbkFyZWEpO1xufVxuLy8gQSBHYXVzc2lhbiBwZW5hbHR5IGZ1bmN0aW9uLCB0aGlzIG1ldGhvZCBhbHdheXMgcmV0dXJucyB2YWx1ZXMgaW4gWzAsIDFdLlxuLy8gVGhlIHdlaWdodCBpcyBhIGZ1bmN0aW9uIG9mIHNpbWlsYXJpdHksIHRoZSBtb3JlIG92ZXJsYXAgdHdvIGJveGVzIGFyZSwgdGhlXG4vLyBzbWFsbGVyIHRoZSB3ZWlnaHQgaXMsIG1lYW5pbmcgaGlnaGx5IG92ZXJsYXBwaW5nIGJveGUgd2lsbCBiZSBzaWduaWZpY2FudGx5XG4vLyBwZW5hbGl6ZWQuIE9uIHRoZSBvdGhlciBoYW5kLCBhIG5vbi1vdmVybGFwcGluZyBib3ggd2lsbCBub3QgYmUgcGVuYWxpemVkLlxuZnVuY3Rpb24gc3VwcHJlc3NXZWlnaHQoaW91VGhyZXNob2xkLCBzY2FsZSwgaW91KSB7XG4gICAgY29uc3Qgd2VpZ2h0ID0gTWF0aC5leHAoc2NhbGUgKiBpb3UgKiBpb3UpO1xuICAgIHJldHVybiBpb3UgPD0gaW91VGhyZXNob2xkID8gd2VpZ2h0IDogMC4wO1xufVxuZnVuY3Rpb24gYXNjZW5kaW5nQ29tcGFyYXRvcihjMSwgYzIpIHtcbiAgICAvLyBGb3Igb2JqZWN0cyB3aXRoIHNhbWUgc2NvcmVzLCB3ZSBtYWtlIHRoZSBvYmplY3Qgd2l0aCB0aGUgbGFyZ2VyIGluZGV4IGdvXG4gICAgLy8gZmlyc3QuIEluIGFuIGFycmF5IHRoYXQgcG9wcyBmcm9tIHRoZSBlbmQsIHRoaXMgbWVhbnMgdGhhdCB0aGUgb2JqZWN0IHdpdGhcbiAgICAvLyB0aGUgc21hbGxlciBpbmRleCB3aWxsIGJlIHBvcHBlZCBmaXJzdC4gVGhpcyBlbnN1cmVzIHRoZSBzYW1lIG91dHB1dCBhc1xuICAgIC8vIHRoZSBUZW5zb3JGbG93IHB5dGhvbiB2ZXJzaW9uLlxuICAgIHJldHVybiAoYzEuc2NvcmUgLSBjMi5zY29yZSkgfHxcbiAgICAgICAgKChjMS5zY29yZSA9PT0gYzIuc2NvcmUpICYmIChjMi5ib3hJbmRleCAtIGMxLmJveEluZGV4KSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ub25fbWF4X3N1cHByZXNzaW9uX2ltcGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLyoqXG4gKiBJbnNlcnRzIGEgdmFsdWUgaW50byBhIHNvcnRlZCBhcnJheS4gVGhpcyBtZXRob2QgYWxsb3dzIGR1cGxpY2F0ZSwgbWVhbmluZyBpdFxuICogYWxsb3dzIGluc2VydGluZyBkdXBsaWNhdGUgdmFsdWUsIGluIHdoaWNoIGNhc2UsIHRoZSBlbGVtZW50IHdpbGwgYmUgaW5zZXJ0ZWRcbiAqIGF0IHRoZSBsb3dlc3QgaW5kZXggb2YgdGhlIHZhbHVlLlxuICogQHBhcmFtIGFyciBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICogQHBhcmFtIGVsZW1lbnQgVGhlIGVsZW1lbnQgdG8gaW5zZXJ0LlxuICogQHBhcmFtIGNvbXBhcmF0b3IgT3B0aW9uYWwuIElmIG5vIGNvbXBhcmF0b3IgaXMgc3BlY2lmaWVkLCBlbGVtZW50cyBhcmVcbiAqIGNvbXBhcmVkIHVzaW5nIGFycmF5X3V0aWwuZGVmYXVsdENvbXBhcmF0b3IsIHdoaWNoIGlzIHN1aXRhYmxlIGZvciBTdHJpbmdzXG4gKiBhbmQgTnVtYmVycyBpbiBhc2NlbmRpbmcgYXJyYXlzLiBJZiB0aGUgYXJyYXkgY29udGFpbnMgbXVsdGlwbGUgaW5zdGFuY2VzIG9mXG4gKiB0aGUgdGFyZ2V0IHZhbHVlLCB0aGUgbGVmdC1tb3N0IGluc3RhbmNlIHdpbGwgYmUgcmV0dXJuZWQuIFRvIHByb3ZpZGUgYVxuICogY29tcGFyYXRvciwgaXQgc2hvdWxkIHRha2UgMiBhcmd1bWVudHMgdG8gY29tcGFyZSBhbmQgcmV0dXJuIGEgbmVnYXRpdmUsXG4gKiB6ZXJvLCBvciBhIHBvc2l0aXZlIG51bWJlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmFyeUluc2VydChhcnIsIGVsZW1lbnQsIGNvbXBhcmF0b3IpIHtcbiAgICBjb25zdCBpbmRleCA9IGJpbmFyeVNlYXJjaChhcnIsIGVsZW1lbnQsIGNvbXBhcmF0b3IpO1xuICAgIGNvbnN0IGluc2VydGlvblBvaW50ID0gaW5kZXggPCAwID8gLShpbmRleCArIDEpIDogaW5kZXg7XG4gICAgYXJyLnNwbGljZShpbnNlcnRpb25Qb2ludCwgMCwgZWxlbWVudCk7XG59XG4vKipcbiAqIFNlYXJjaGVzIHRoZSBhcnJheSBmb3IgdGhlIHRhcmdldCB1c2luZyBiaW5hcnkgc2VhcmNoLCByZXR1cm5zIHRoZSBpbmRleFxuICogb2YgdGhlIGZvdW5kIGVsZW1lbnQsIG9yIHBvc2l0aW9uIHRvIGluc2VydCBpZiBlbGVtZW50IG5vdCBmb3VuZC4gSWYgbm9cbiAqIGNvbXBhcmF0b3IgaXMgc3BlY2lmaWVkLCBlbGVtZW50cyBhcmUgY29tcGFyZWQgdXNpbmcgYXJyYXlfXG4gKiB1dGlsLmRlZmF1bHRDb21wYXJhdG9yLCB3aGljaCBpcyBzdWl0YWJsZSBmb3IgU3RyaW5ncyBhbmQgTnVtYmVycyBpblxuICogYXNjZW5kaW5nIGFycmF5cy4gSWYgdGhlIGFycmF5IGNvbnRhaW5zIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgdGFyZ2V0XG4gKiB2YWx1ZSwgdGhlIGxlZnQtbW9zdCBpbnN0YW5jZSB3aWxsIGJlIHJldHVybmVkLlxuICogQHBhcmFtIGFyciBUaGUgYXJyYXkgdG8gYmUgc2VhcmNoZWQgaW4uXG4gKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgdG8gYmUgc2VhcmNoZWQgZm9yLlxuICogQHBhcmFtIGNvbXBhcmF0b3IgU2hvdWxkIHRha2UgMiBhcmd1bWVudHMgdG8gY29tcGFyZSBhbmQgcmV0dXJuIGEgbmVnYXRpdmUsXG4gKiAgICB6ZXJvLCBvciBhIHBvc2l0aXZlIG51bWJlci5cbiAqIEByZXR1cm4gTG93ZXN0IGluZGV4IG9mIHRoZSB0YXJnZXQgdmFsdWUgaWYgZm91bmQsIG90aGVyd2lzZSB0aGUgaW5zZXJ0aW9uXG4gKiAgICBwb2ludCB3aGVyZSB0aGUgdGFyZ2V0IHNob3VsZCBiZSBpbnNlcnRlZCwgaW4gdGhlIGZvcm0gb2ZcbiAqICAgICgtaW5zZXJ0aW9uUG9pbnQgLSAxKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmFyeVNlYXJjaChhcnIsIHRhcmdldCwgY29tcGFyYXRvcikge1xuICAgIHJldHVybiBiaW5hcnlTZWFyY2hfKGFyciwgdGFyZ2V0LCBjb21wYXJhdG9yIHx8IGRlZmF1bHRDb21wYXJhdG9yKTtcbn1cbi8qKlxuICogQ29tcGFyZXMgaXRzIHR3byBhcmd1bWVudHMgZm9yIG9yZGVyLlxuICogQHBhcmFtIGEgVGhlIGZpcnN0IGVsZW1lbnQgdG8gYmUgY29tcGFyZWQuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIGVsZW1lbnQgdG8gYmUgY29tcGFyZWQuXG4gKiBAcmV0dXJuIEEgbmVnYXRpdmUgbnVtYmVyLCB6ZXJvLCBvciBhIHBvc2l0aXZlIG51bWJlciBhcyB0aGUgZmlyc3RcbiAqICAgICBhcmd1bWVudCBpcyBsZXNzIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIHNlY29uZC5cbiAqL1xuZnVuY3Rpb24gZGVmYXVsdENvbXBhcmF0b3IoYSwgYikge1xuICAgIHJldHVybiBhID4gYiA/IDEgOiBhIDwgYiA/IC0xIDogMDtcbn1cbmZ1bmN0aW9uIGJpbmFyeVNlYXJjaF8oYXJyLCB0YXJnZXQsIGNvbXBhcmF0b3IpIHtcbiAgICBsZXQgbGVmdCA9IDA7XG4gICAgbGV0IHJpZ2h0ID0gYXJyLmxlbmd0aDtcbiAgICBsZXQgbWlkZGxlID0gMDtcbiAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICB3aGlsZSAobGVmdCA8IHJpZ2h0KSB7XG4gICAgICAgIG1pZGRsZSA9IGxlZnQgKyAoKHJpZ2h0IC0gbGVmdCkgPj4+IDEpO1xuICAgICAgICBjb25zdCBjb21wYXJlUmVzdWx0ID0gY29tcGFyYXRvcih0YXJnZXQsIGFyclttaWRkbGVdKTtcbiAgICAgICAgaWYgKGNvbXBhcmVSZXN1bHQgPiAwKSB7XG4gICAgICAgICAgICBsZWZ0ID0gbWlkZGxlICsgMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJpZ2h0ID0gbWlkZGxlO1xuICAgICAgICAgICAgLy8gSWYgY29tcGFyZVJlc3VsdCBpcyAwLCB0aGUgdmFsdWUgaXMgZm91bmQuIFdlIHJlY29yZCBpdCBpcyBmb3VuZCxcbiAgICAgICAgICAgIC8vIGFuZCB0aGVuIGtlZXAgbG9va2luZyBiZWNhdXNlIHRoZXJlIG1heSBiZSBkdXBsaWNhdGUuXG4gICAgICAgICAgICBmb3VuZCA9ICFjb21wYXJlUmVzdWx0O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3VuZCA/IGxlZnQgOiAtbGVmdCAtIDE7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ub25fbWF4X3N1cHByZXNzaW9uX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLyoqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBXaGVyZSBrZXJuZWwgc2hhcmVkIGJldHdlZW4gY3B1IGFuZCB3ZWJnbCAqL1xuaW1wb3J0IHsgYnVmZmVyIH0gZnJvbSAnLi4vb3BzL2J1ZmZlcic7XG5leHBvcnQgZnVuY3Rpb24gd2hlcmVJbXBsKGNvbmRTaGFwZSwgY29uZFZhbHMpIHtcbiAgICBjb25zdCBpbmRpY2VzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25kVmFscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoY29uZFZhbHNbaV0pIHtcbiAgICAgICAgICAgIGluZGljZXMucHVzaChpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBpbkJ1ZmZlciA9IGJ1ZmZlcihjb25kU2hhcGUsICdpbnQzMicpO1xuICAgIGNvbnN0IG91dCA9IGJ1ZmZlcihbaW5kaWNlcy5sZW5ndGgsIGNvbmRTaGFwZS5sZW5ndGhdLCAnaW50MzInKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgbG9jID0gaW5CdWZmZXIuaW5kZXhUb0xvYyhpbmRpY2VzW2ldKTtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gaSAqIGNvbmRTaGFwZS5sZW5ndGg7XG4gICAgICAgIG91dC52YWx1ZXMuc2V0KGxvYywgb2Zmc2V0KTtcbiAgICB9XG4gICAgcmV0dXJuIG91dC50b1RlbnNvcigpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d2hlcmVfaW1wbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vLyBiYXNlLnRzIGlzIHRmanMtY29yZSB3aXRob3V0IGF1dG8gcmVnaXN0cmF0aW9uIG9mIHRoaW5ncyBsaWtlIGZsYWdzLFxuLy8gZ3JhZGllbnRzLCBjaGFpbmVkIG9wcyBvciB0aGUgb3BIYW5kbGVyLiBTZWUgYmFzZV9zaWRlX2VmZmVjdHMudHMgZm9yIHBhcnRzXG4vLyB0ZmpzIGNvcmUgdGhhdCBhcmUgcmVxdWlyZWQgc2lkZSBlZmZlY3RzLlxuLyoqXG4gKiBAZmlsZW92ZXJ2aWV3XG4gKiBAc3VwcHJlc3Mge3BhcnRpYWxBbGlhc30gT3B0aW1pemF0aW9uIGRpc2FibGVkIGR1ZSB0byBwYXNzaW5nIHRoZSBtb2R1bGVcbiAqIG9iamVjdCBpbnRvIGEgZnVuY3Rpb24gYmVsb3c6XG4gKlxuICogICBpbXBvcnQgKiBhcyBvcHMgZnJvbSAnLi9vcHMvb3BzJztcbiAqICAgc2V0T3BIYW5kbGVyKG9wcyk7XG4gKi9cbi8vIFNlcmlhbGl6YXRpb24uXG5pbXBvcnQgKiBhcyBpbyBmcm9tICcuL2lvL2lvJztcbmltcG9ydCAqIGFzIG1hdGggZnJvbSAnLi9tYXRoJztcbmltcG9ydCAqIGFzIGJyb3dzZXIgZnJvbSAnLi9vcHMvYnJvd3Nlcic7XG5pbXBvcnQgKiBhcyBnYXRoZXJfdXRpbCBmcm9tICcuL29wcy9nYXRoZXJfbmRfdXRpbCc7XG5pbXBvcnQgKiBhcyBzY2F0dGVyX3V0aWwgZnJvbSAnLi9vcHMvc2NhdHRlcl9uZF91dGlsJztcbmltcG9ydCAqIGFzIHNsaWNlX3V0aWwgZnJvbSAnLi9vcHMvc2xpY2VfdXRpbCc7XG5pbXBvcnQgKiBhcyBzZXJpYWxpemF0aW9uIGZyb20gJy4vc2VyaWFsaXphdGlvbic7XG5pbXBvcnQgKiBhcyB0ZW5zb3JfdXRpbCBmcm9tICcuL3RlbnNvcl91dGlsJztcbmltcG9ydCAqIGFzIHRlc3RfdXRpbCBmcm9tICcuL3Rlc3RfdXRpbCc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4vdXRpbCc7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi92ZXJzaW9uJztcbi8vIE9wdGltaXplcnMuXG5leHBvcnQgeyBBZGFkZWx0YU9wdGltaXplciB9IGZyb20gJy4vb3B0aW1pemVycy9hZGFkZWx0YV9vcHRpbWl6ZXInO1xuZXhwb3J0IHsgQWRhZ3JhZE9wdGltaXplciB9IGZyb20gJy4vb3B0aW1pemVycy9hZGFncmFkX29wdGltaXplcic7XG5leHBvcnQgeyBBZGFtT3B0aW1pemVyIH0gZnJvbSAnLi9vcHRpbWl6ZXJzL2FkYW1fb3B0aW1pemVyJztcbmV4cG9ydCB7IEFkYW1heE9wdGltaXplciB9IGZyb20gJy4vb3B0aW1pemVycy9hZGFtYXhfb3B0aW1pemVyJztcbmV4cG9ydCB7IE1vbWVudHVtT3B0aW1pemVyIH0gZnJvbSAnLi9vcHRpbWl6ZXJzL21vbWVudHVtX29wdGltaXplcic7XG5leHBvcnQgeyBPcHRpbWl6ZXIgfSBmcm9tICcuL29wdGltaXplcnMvb3B0aW1pemVyJztcbmV4cG9ydCB7IFJNU1Byb3BPcHRpbWl6ZXIgfSBmcm9tICcuL29wdGltaXplcnMvcm1zcHJvcF9vcHRpbWl6ZXInO1xuZXhwb3J0IHsgU0dET3B0aW1pemVyIH0gZnJvbSAnLi9vcHRpbWl6ZXJzL3NnZF9vcHRpbWl6ZXInO1xuZXhwb3J0IHsgVGVuc29yLCBUZW5zb3JCdWZmZXIsIFZhcmlhYmxlIH0gZnJvbSAnLi90ZW5zb3InO1xuZXhwb3J0IHsgUmFuaywgc3VtT3V0VHlwZSwgdXBjYXN0VHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9vcHMvb3BzJztcbmV4cG9ydCB7IFJlZHVjdGlvbiB9IGZyb20gJy4vb3BzL2xvc3Nfb3BzX3V0aWxzJztcbmV4cG9ydCAqIGZyb20gJy4vdHJhaW4nO1xuZXhwb3J0ICogZnJvbSAnLi9nbG9iYWxzJztcbmV4cG9ydCAqIGZyb20gJy4va2VybmVsX3JlZ2lzdHJ5JztcbmV4cG9ydCB7IGN1c3RvbUdyYWQsIGdyYWQsIGdyYWRzLCB2YWx1ZUFuZEdyYWQsIHZhbHVlQW5kR3JhZHMsIHZhcmlhYmxlR3JhZHMgfSBmcm9tICcuL2dyYWRpZW50cyc7XG5leHBvcnQgeyBFbnZpcm9ubWVudCwgZW52LCBFTlYgfSBmcm9tICcuL2Vudmlyb25tZW50JztcbmV4cG9ydCB7IHZlcnNpb24gYXMgdmVyc2lvbl9jb3JlIH07XG4vLyBUb3AtbGV2ZWwgbWV0aG9kIGV4cG9ydHMuXG5leHBvcnQgeyBuZXh0RnJhbWUgfSBmcm9tICcuL2Jyb3dzZXJfdXRpbCc7XG4vLyBTZWNvbmQgbGV2ZWwgZXhwb3J0cy5cbmltcG9ydCAqIGFzIGJhY2tlbmRfdXRpbCBmcm9tICcuL2JhY2tlbmRzL2JhY2tlbmRfdXRpbCc7XG5pbXBvcnQgKiBhcyBkZXZpY2VfdXRpbCBmcm9tICcuL2RldmljZV91dGlsJztcbmV4cG9ydCB7IGJyb3dzZXIsIGlvLCBtYXRoLCBzZXJpYWxpemF0aW9uLCB0ZXN0X3V0aWwsIHV0aWwsIGJhY2tlbmRfdXRpbCwgdGVuc29yX3V0aWwsIHNsaWNlX3V0aWwsIGdhdGhlcl91dGlsLCBzY2F0dGVyX3V0aWwsIGRldmljZV91dGlsIH07XG5pbXBvcnQgKiBhcyBrZXJuZWxfaW1wbHMgZnJvbSAnLi9iYWNrZW5kcy9rZXJuZWxfaW1wbHMnO1xuZXhwb3J0IHsga2VybmVsX2ltcGxzIH07XG4vLyBCYWNrZW5kIHNwZWNpZmljLlxuZXhwb3J0IHsgS2VybmVsQmFja2VuZCwgRGF0YVN0b3JhZ2UgfSBmcm9tICcuL2JhY2tlbmRzL2JhY2tlbmQnO1xuLy8gRXhwb3J0IGFsbCBrZXJuZWwgbmFtZXMgLyBpbmZvLlxuZXhwb3J0ICogZnJvbSAnLi9rZXJuZWxfbmFtZXMnO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmFzZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vLyBSZXF1aXJlZCBzaWRlIGVmZmVjdGZ1bCBjb2RlIGZvciB0ZmpzLWNvcmVcbi8vIFNldCB1cCBFbmdpbmUgYW5kIEVOVlxuaW1wb3J0IHsgZ2V0T3JNYWtlRW5naW5lIH0gZnJvbSAnLi9lbmdpbmUnO1xuZ2V0T3JNYWtlRW5naW5lKCk7XG4vLyBSZWdpc3RlciBiYWNrZW5kLWFnbm9zdGljIGZsYWdzLlxuaW1wb3J0ICcuL2ZsYWdzJztcbi8vIFJlZ2lzdGVyIHBsYXRmb3Jtc1xuaW1wb3J0ICcuL3BsYXRmb3Jtcy9wbGF0Zm9ybV9icm93c2VyJztcbmltcG9ydCAnLi9wbGF0Zm9ybXMvcGxhdGZvcm1fbm9kZSc7XG4vLyBTZXQgdXAgT3BIYW5kbGVyXG5pbXBvcnQgeyBidWZmZXIgfSBmcm9tICcuL29wcy9idWZmZXInO1xuaW1wb3J0IHsgY2FzdCB9IGZyb20gJy4vb3BzL2Nhc3QnO1xuaW1wb3J0IHsgY2xvbmUgfSBmcm9tICcuL29wcy9jbG9uZSc7XG5pbXBvcnQgeyBwcmludCB9IGZyb20gJy4vb3BzL3ByaW50JztcbmltcG9ydCB7IHNldE9wSGFuZGxlciB9IGZyb20gJy4vdGVuc29yJztcbmNvbnN0IG9wSGFuZGxlciA9IHtcbiAgICBidWZmZXIsXG4gICAgY2FzdCxcbiAgICBjbG9uZSxcbiAgICBwcmludFxufTtcbnNldE9wSGFuZGxlcihvcEhhbmRsZXIpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmFzZV9zaWRlX2VmZmVjdHMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuY29uc3QgZGVsYXlDYWxsYmFjayA9ICgoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiByZXF1ZXN0QW5pbWF0aW9uRnJhbWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBzZXRJbW1lZGlhdGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBzZXRJbW1lZGlhdGU7XG4gICAgfVxuICAgIHJldHVybiAoZikgPT4gZigpOyAvLyBubyBkZWxheXNcbn0pKCk7XG4vKipcbiAqIFJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZSB3aGVuIGEgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIGhhcyBjb21wbGV0ZWQuXG4gKlxuICogT24gTm9kZS5qcyB0aGlzIHVzZXMgc2V0SW1tZWRpYXRlIGluc3RlYWQgb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lLlxuICpcbiAqIFRoaXMgaXMgc2ltcGx5IGEgc3VnYXIgbWV0aG9kIHNvIHRoYXQgdXNlcnMgY2FuIGRvIHRoZSBmb2xsb3dpbmc6XG4gKiBgYXdhaXQgdGYubmV4dEZyYW1lKCk7YFxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdQZXJmb3JtYW5jZScsIHN1YmhlYWRpbmc6ICdUaW1pbmcnfVxuICovXG5mdW5jdGlvbiBuZXh0RnJhbWUoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gZGVsYXlDYWxsYmFjaygoKSA9PiByZXNvbHZlKCkpKTtcbn1cbmV4cG9ydCB7IG5leHRGcmFtZSB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YnJvd3Nlcl91dGlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbmZ1bmN0aW9uIF9pc05hdmlnYXRvckRlZmluZWQoKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvciAhPSBudWxsO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTW9iaWxlKG5hdikge1xuICAgIGlmIChuYXYgfHwgX2lzTmF2aWdhdG9yRGVmaW5lZCgpKSB7XG4gICAgICAgIGlmICghbmF2KSB7XG4gICAgICAgICAgICBuYXYgPSBuYXZpZ2F0b3I7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hdi5wcm9kdWN0ID09PSAnUmVhY3ROYXRpdmUnKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgICAgIGNvbnN0IGEgPSBuYXYudXNlckFnZW50IHx8IG5hdi52ZW5kb3IgfHwgd2luZG93Lm9wZXJhO1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgIHJldHVybiAvKGFuZHJvaWR8YmJcXGQrfG1lZWdvKS4rbW9iaWxlfGF2YW50Z298YmFkYVxcL3xibGFja2JlcnJ5fGJsYXplcnxjb21wYWx8ZWxhaW5lfGZlbm5lY3xoaXB0b3B8aWVtb2JpbGV8aXAoaG9uZXxvZCl8aXJpc3xraW5kbGV8bGdlIHxtYWVtb3xtaWRwfG1tcHxtb2JpbGUuK2ZpcmVmb3h8bmV0ZnJvbnR8b3BlcmEgbShvYnxpbilpfHBhbG0oIG9zKT98cGhvbmV8cChpeGl8cmUpXFwvfHBsdWNrZXJ8cG9ja2V0fHBzcHxzZXJpZXMoNHw2KTB8c3ltYmlhbnx0cmVvfHVwXFwuKGJyb3dzZXJ8bGluayl8dm9kYWZvbmV8d2FwfHdpbmRvd3MgY2V8eGRhfHhpaW5vL2lcbiAgICAgICAgICAgIC50ZXN0KGEpIHx8XG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgICAgICAvMTIwN3w2MzEwfDY1OTB8M2dzb3w0dGhwfDUwWzEtNl1pfDc3MHN8ODAyc3xhIHdhfGFiYWN8YWMoZXJ8b298c1xcLSl8YWkoa298cm4pfGFsKGF2fGNhfGNvKXxhbW9pfGFuKGV4fG55fHl3KXxhcHR1fGFyKGNofGdvKXxhcyh0ZXx1cyl8YXR0d3xhdShkaXxcXC1tfHIgfHMgKXxhdmFufGJlKGNrfGxsfG5xKXxiaShsYnxyZCl8YmwoYWN8YXopfGJyKGV8dil3fGJ1bWJ8YndcXC0obnx1KXxjNTVcXC98Y2FwaXxjY3dhfGNkbVxcLXxjZWxsfGNodG18Y2xkY3xjbWRcXC18Y28obXB8bmQpfGNyYXd8ZGEoaXR8bGx8bmcpfGRidGV8ZGNcXC1zfGRldml8ZGljYXxkbW9ifGRvKGN8cClvfGRzKDEyfFxcLWQpfGVsKDQ5fGFpKXxlbShsMnx1bCl8ZXIoaWN8azApfGVzbDh8ZXooWzQtN10wfG9zfHdhfHplKXxmZXRjfGZseShcXC18Xyl8ZzEgdXxnNTYwfGdlbmV8Z2ZcXC01fGdcXC1tb3xnbyhcXC53fG9kKXxncihhZHx1bil8aGFpZXxoY2l0fGhkXFwtKG18cHx0KXxoZWlcXC18aGkocHR8dGEpfGhwKCBpfGlwKXxoc1xcLWN8aHQoYyhcXC18IHxffGF8Z3xwfHN8dCl8dHApfGh1KGF3fHRjKXxpXFwtKDIwfGdvfG1hKXxpMjMwfGlhYyggfFxcLXxcXC8pfGlicm98aWRlYXxpZzAxfGlrb218aW0xa3xpbm5vfGlwYXF8aXJpc3xqYSh0fHYpYXxqYnJvfGplbXV8amlnc3xrZGRpfGtlaml8a2d0KCB8XFwvKXxrbG9ufGtwdCB8a3djXFwtfGt5byhjfGspfGxlKG5vfHhpKXxsZyggZ3xcXC8oa3xsfHUpfDUwfDU0fFxcLVthLXddKXxsaWJ3fGx5bnh8bTFcXC13fG0zZ2F8bTUwXFwvfG1hKHRlfHVpfHhvKXxtYygwMXwyMXxjYSl8bVxcLWNyfG1lKHJjfHJpKXxtaShvOHxvYXx0cyl8bW1lZnxtbygwMXwwMnxiaXxkZXxkb3x0KFxcLXwgfG98dil8enopfG10KDUwfHAxfHYgKXxtd2JwfG15d2F8bjEwWzAtMl18bjIwWzItM118bjMwKDB8Mil8bjUwKDB8Mnw1KXxuNygwKDB8MSl8MTApfG5lKChjfG0pXFwtfG9ufHRmfHdmfHdnfHd0KXxub2soNnxpKXxuenBofG8yaW18b3AodGl8d3YpfG9yYW58b3dnMXxwODAwfHBhbihhfGR8dCl8cGR4Z3xwZygxM3xcXC0oWzEtOF18YykpfHBoaWx8cGlyZXxwbChheXx1Yyl8cG5cXC0yfHBvKGNrfHJ0fHNlKXxwcm94fHBzaW98cHRcXC1nfHFhXFwtYXxxYygwN3wxMnwyMXwzMnw2MHxcXC1bMi03XXxpXFwtKXxxdGVrfHIzODB8cjYwMHxyYWtzfHJpbTl8cm8odmV8em8pfHM1NVxcL3xzYShnZXxtYXxtbXxtc3xueXx2YSl8c2MoMDF8aFxcLXxvb3xwXFwtKXxzZGtcXC98c2UoYyhcXC18MHwxKXw0N3xtY3xuZHxyaSl8c2doXFwtfHNoYXJ8c2llKFxcLXxtKXxza1xcLTB8c2woNDV8aWQpfHNtKGFsfGFyfGIzfGl0fHQ1KXxzbyhmdHxueSl8c3AoMDF8aFxcLXx2XFwtfHYgKXxzeSgwMXxtYil8dDIoMTh8NTApfHQ2KDAwfDEwfDE4KXx0YShndHxsayl8dGNsXFwtfHRkZ1xcLXx0ZWwoaXxtKXx0aW1cXC18dFxcLW1vfHRvKHBsfHNoKXx0cyg3MHxtXFwtfG0zfG01KXx0eFxcLTl8dXAoXFwuYnxnMXxzaSl8dXRzdHx2NDAwfHY3NTB8dmVyaXx2aShyZ3x0ZSl8dmsoNDB8NVswLTNdfFxcLXYpfHZtNDB8dm9kYXx2dWxjfHZ4KDUyfDUzfDYwfDYxfDcwfDgwfDgxfDgzfDg1fDk4KXx3M2MoXFwtfCApfHdlYmN8d2hpdHx3aShnIHxuY3xudyl8d21sYnx3b251fHg3MDB8eWFzXFwtfHlvdXJ8emV0b3x6dGVcXC0vaVxuICAgICAgICAgICAgICAgIC50ZXN0KGEuc3Vic3RyKDAsIDQpKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQnJvd3NlcigpIHtcbiAgICByZXR1cm4gKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5kb2N1bWVudCAhPSBudWxsKSB8fFxuICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgKHR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZSAhPT0gJ3VuZGVmaW5lZCcpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGV2aWNlX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgS2VybmVsQmFja2VuZCB9IGZyb20gJy4vYmFja2VuZHMvYmFja2VuZCc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudCwgc2V0RW52aXJvbm1lbnRHbG9iYWwgfSBmcm9tICcuL2Vudmlyb25tZW50JztcbmltcG9ydCB7IGdldEdsb2JhbE5hbWVzcGFjZSB9IGZyb20gJy4vZ2xvYmFsX3V0aWwnO1xuaW1wb3J0IHsgQWRkLCBDYXN0LCBJZGVudGl0eSB9IGZyb20gJy4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGdldEdyYWRpZW50LCBnZXRLZXJuZWwsIGdldEtlcm5lbHNGb3JCYWNrZW5kIH0gZnJvbSAnLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHsgUHJvZmlsZXIgfSBmcm9tICcuL3Byb2ZpbGVyJztcbmltcG9ydCB7IGJhY2twcm9wYWdhdGVHcmFkaWVudHMsIGdldEZpbHRlcmVkTm9kZXNYVG9ZIH0gZnJvbSAnLi90YXBlJztcbmltcG9ydCB7IHNldFRlbnNvclRyYWNrZXIsIFRlbnNvciwgVmFyaWFibGUgfSBmcm9tICcuL3RlbnNvcic7XG5pbXBvcnQgeyBnZXRUZW5zb3JzSW5Db250YWluZXIgfSBmcm9tICcuL3RlbnNvcl91dGlsJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi91dGlsJztcbmltcG9ydCB7IGJ5dGVzRnJvbVN0cmluZ0FycmF5LCBtYWtlT25lc1R5cGVkQXJyYXksIG5vdywgc2l6ZUZyb21TaGFwZSB9IGZyb20gJy4vdXRpbCc7XG5mdW5jdGlvbiBpc1JlZ2lzdGVyZWRLZXJuZWxJbnZvY2F0aW9uKGtlcm5lbEludm9jYXRpb24pIHtcbiAgICByZXR1cm4ga2VybmVsSW52b2NhdGlvbi5rZXJuZWxOYW1lICE9IG51bGw7XG59XG5jbGFzcyBFbmdpbmVTdGF0ZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8vIFB1YmxpYyBzaW5jZSBvcHRpbWl6ZXJzIHdpbGwgdXNlIGl0LlxuICAgICAgICB0aGlzLnJlZ2lzdGVyZWRWYXJpYWJsZXMgPSB7fTtcbiAgICAgICAgdGhpcy5uZXh0VGFwZU5vZGVJZCA9IDA7XG4gICAgICAgIHRoaXMubnVtQnl0ZXMgPSAwO1xuICAgICAgICB0aGlzLm51bVRlbnNvcnMgPSAwO1xuICAgICAgICB0aGlzLm51bVN0cmluZ1RlbnNvcnMgPSAwO1xuICAgICAgICB0aGlzLm51bURhdGFCdWZmZXJzID0gMDtcbiAgICAgICAgLy8gTnVtYmVyIG9mIG5lc3RlZCB0Zi5ncmFkKCkgc3RhdGVtZW50cyB3aGVuIGNvbXB1dGluZyBoaWdoZXItb3JkZXJcbiAgICAgICAgLy8gZ3JhZGllbnRzLiBFLmcuIGAxYCBmb3IgZmlyc3Qtb3JkZXIgZ3JhZGllbnRzIGFuZCBgMmAgZm9yIHNlY29uZC1vcmRlclxuICAgICAgICAvLyBncmFkaWVudHMuIFVzZWQgdG8gdHJhY2sgaWYgdGhlIHRhcGUgc2hvdWxkIGJlIHJlbW92ZWQgYWZ0ZXIgYSBiYWNrcHJvcC5cbiAgICAgICAgdGhpcy5ncmFkaWVudERlcHRoID0gMDtcbiAgICAgICAgLy8gTnVtYmVyIG9mIG5lc3RlZCBrZXJuZWwgY2FsbHMuIFdoZW4ga2VybmVsIGRlcHRoIGlzIGdyZWF0ZXIgdGhhbiAxLCB3ZSB0dXJuXG4gICAgICAgIC8vIG9mZiB0aGUgdGFwZS5cbiAgICAgICAgdGhpcy5rZXJuZWxEZXB0aCA9IDA7XG4gICAgICAgIHRoaXMuc2NvcGVTdGFjayA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogS2VlcHMgdHJhY2sgb2YgdGhlIG51bWJlciBvZiBkYXRhIG1vdmVzIGR1cmluZyBhIGtlcm5lbCBleGVjdXRpb24uIFdlXG4gICAgICAgICAqIG1haW50YWluIGEgc3RhY2sgc2luY2Uga2VybmVscyBjYW4gY2FsbCBvdGhlciBrZXJuZWxzLCByZWN1cnNpdmVseS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubnVtRGF0YU1vdmVzU3RhY2sgPSBbXTtcbiAgICAgICAgdGhpcy5uZXh0U2NvcGVJZCA9IDA7XG4gICAgICAgIHRoaXMudGVuc29ySW5mbyA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIHRoaXMucHJvZmlsaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYWN0aXZlUHJvZmlsZSA9IHtcbiAgICAgICAgICAgIG5ld0J5dGVzOiAwLFxuICAgICAgICAgICAgbmV3VGVuc29yczogMCxcbiAgICAgICAgICAgIHBlYWtCeXRlczogMCxcbiAgICAgICAgICAgIGtlcm5lbHM6IFtdLFxuICAgICAgICAgICAgcmVzdWx0OiBudWxsLFxuICAgICAgICAgICAgZ2V0IGtlcm5lbE5hbWVzKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQodGhpcy5rZXJuZWxzLm1hcChrID0+IGsubmFtZSkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgZm9yIChjb25zdCB2YXJpYWJsZU5hbWUgaW4gdGhpcy5yZWdpc3RlcmVkVmFyaWFibGVzKSB7XG4gICAgICAgICAgICB0aGlzLnJlZ2lzdGVyZWRWYXJpYWJsZXNbdmFyaWFibGVOYW1lXS5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgY2xhc3MgRW5naW5lIHtcbiAgICBjb25zdHJ1Y3RvcihFTlYpIHtcbiAgICAgICAgdGhpcy5FTlYgPSBFTlY7XG4gICAgICAgIHRoaXMucmVnaXN0cnkgPSB7fTtcbiAgICAgICAgdGhpcy5yZWdpc3RyeUZhY3RvcnkgPSB7fTtcbiAgICAgICAgdGhpcy5wZW5kaW5nQmFja2VuZEluaXRJZCA9IDA7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBuZXcgRW5naW5lU3RhdGUoKTtcbiAgICB9XG4gICAgYXN5bmMgcmVhZHkoKSB7XG4gICAgICAgIGlmICh0aGlzLnBlbmRpbmdCYWNrZW5kSW5pdCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wZW5kaW5nQmFja2VuZEluaXQudGhlbigoKSA9PiB7IH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmJhY2tlbmRJbnN0YW5jZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc29ydGVkQmFja2VuZHMgPSB0aGlzLmdldFNvcnRlZEJhY2tlbmRzKCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc29ydGVkQmFja2VuZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGJhY2tlbmROYW1lID0gc29ydGVkQmFja2VuZHNbaV07XG4gICAgICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgdGhpcy5pbml0aWFsaXplQmFja2VuZChiYWNrZW5kTmFtZSkuc3VjY2VzcztcbiAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRCYWNrZW5kKGJhY2tlbmROYW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgaW5pdGlhbGl6ZSBhbnkgYmFja2VuZHMsIGFsbCBiYWNrZW5kIGluaXRpYWxpemF0aW9ucyBgICtcbiAgICAgICAgICAgIGBmYWlsZWQuYCk7XG4gICAgfVxuICAgIGdldCBiYWNrZW5kKCkge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nQmFja2VuZEluaXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCYWNrZW5kICcke3RoaXMuYmFja2VuZE5hbWV9JyBoYXMgbm90IHlldCBiZWVuIGluaXRpYWxpemVkLiBNYWtlIGAgK1xuICAgICAgICAgICAgICAgIGBzdXJlIHRvIGF3YWl0IHRmLnJlYWR5KCkgb3IgYXdhaXQgdGYuc2V0QmFja2VuZCgpIGJlZm9yZSBjYWxsaW5nIGAgK1xuICAgICAgICAgICAgICAgIGBvdGhlciBtZXRob2RzYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYmFja2VuZEluc3RhbmNlID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgbmFtZSwgYXN5bmNJbml0IH0gPSB0aGlzLmluaXRpYWxpemVCYWNrZW5kc0FuZFJldHVybkJlc3QoKTtcbiAgICAgICAgICAgIGlmIChhc3luY0luaXQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBoaWdoZXN0IHByaW9yaXR5IGJhY2tlbmQgJyR7bmFtZX0nIGhhcyBub3QgeWV0IGJlZW4gYCArXG4gICAgICAgICAgICAgICAgICAgIGBpbml0aWFsaXplZC4gTWFrZSBzdXJlIHRvIGF3YWl0IHRmLnJlYWR5KCkgb3IgYCArXG4gICAgICAgICAgICAgICAgICAgIGBhd2FpdCB0Zi5zZXRCYWNrZW5kKCkgYmVmb3JlIGNhbGxpbmcgb3RoZXIgbWV0aG9kc2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZXRCYWNrZW5kKG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmJhY2tlbmRJbnN0YW5jZTtcbiAgICB9XG4gICAgYmFja2VuZE5hbWVzKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5yZWdpc3RyeUZhY3RvcnkpO1xuICAgIH1cbiAgICBmaW5kQmFja2VuZChiYWNrZW5kTmFtZSkge1xuICAgICAgICBpZiAoIShiYWNrZW5kTmFtZSBpbiB0aGlzLnJlZ2lzdHJ5KSkge1xuICAgICAgICAgICAgLy8gSWYgdGhlIGJhY2tlbmQgaGFzbid0IGJlZW4gaW5pdGlhbGl6ZWQgYnV0IHdlIGhhdmUgYSByZWdpc3RyeSBlbnRyeSBmb3JcbiAgICAgICAgICAgIC8vIGl0LCBpbml0aWFsaXplIGl0IGFuZCByZXR1cm4gaXQuXG4gICAgICAgICAgICBpZiAoYmFja2VuZE5hbWUgaW4gdGhpcy5yZWdpc3RyeUZhY3RvcnkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGFzeW5jSW5pdCB9ID0gdGhpcy5pbml0aWFsaXplQmFja2VuZChiYWNrZW5kTmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGFzeW5jSW5pdCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBCYWNrZW5kIGlzIG5vdCByZWFkeSB5ZXQuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5W2JhY2tlbmROYW1lXTtcbiAgICB9XG4gICAgZmluZEJhY2tlbmRGYWN0b3J5KGJhY2tlbmROYW1lKSB7XG4gICAgICAgIGlmICghKGJhY2tlbmROYW1lIGluIHRoaXMucmVnaXN0cnlGYWN0b3J5KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucmVnaXN0cnlGYWN0b3J5W2JhY2tlbmROYW1lXS5mYWN0b3J5O1xuICAgIH1cbiAgICByZWdpc3RlckJhY2tlbmQoYmFja2VuZE5hbWUsIGZhY3RvcnksIHByaW9yaXR5ID0gMSkge1xuICAgICAgICBpZiAoYmFja2VuZE5hbWUgaW4gdGhpcy5yZWdpc3RyeUZhY3RvcnkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgJHtiYWNrZW5kTmFtZX0gYmFja2VuZCB3YXMgYWxyZWFkeSByZWdpc3RlcmVkLiBgICtcbiAgICAgICAgICAgICAgICBgUmV1c2luZyBleGlzdGluZyBiYWNrZW5kIGZhY3RvcnkuYCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWdpc3RyeUZhY3RvcnlbYmFja2VuZE5hbWVdID0geyBmYWN0b3J5LCBwcmlvcml0eSB9O1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgYXN5bmMgc2V0QmFja2VuZChiYWNrZW5kTmFtZSkge1xuICAgICAgICBpZiAodGhpcy5yZWdpc3RyeUZhY3RvcnlbYmFja2VuZE5hbWVdID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQmFja2VuZCBuYW1lICcke2JhY2tlbmROYW1lfScgbm90IGZvdW5kIGluIHJlZ2lzdHJ5YCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5iYWNrZW5kTmFtZSA9IGJhY2tlbmROYW1lO1xuICAgICAgICBpZiAodGhpcy5yZWdpc3RyeVtiYWNrZW5kTmFtZV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5iYWNrZW5kSW5zdGFuY2UgPSBudWxsO1xuICAgICAgICAgICAgY29uc3QgeyBzdWNjZXNzLCBhc3luY0luaXQgfSA9IHRoaXMuaW5pdGlhbGl6ZUJhY2tlbmQoYmFja2VuZE5hbWUpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXN5bmNJbml0ID8gYXdhaXQgc3VjY2VzcyA6IHN1Y2Nlc3M7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJhY2tlbmRJbnN0YW5jZSA9IHRoaXMucmVnaXN0cnlbYmFja2VuZE5hbWVdO1xuICAgICAgICB0aGlzLnNldHVwUmVnaXN0ZXJlZEtlcm5lbHMoKTtcbiAgICAgICAgLy8gUmVzZXQgdGhlIHByb2ZpbGVyLlxuICAgICAgICB0aGlzLnByb2ZpbGVyID0gbmV3IFByb2ZpbGVyKHRoaXMuYmFja2VuZEluc3RhbmNlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHNldHVwUmVnaXN0ZXJlZEtlcm5lbHMoKSB7XG4gICAgICAgIGNvbnN0IGtlcm5lbHMgPSBnZXRLZXJuZWxzRm9yQmFja2VuZCh0aGlzLmJhY2tlbmROYW1lKTtcbiAgICAgICAga2VybmVscy5mb3JFYWNoKGtlcm5lbCA9PiB7XG4gICAgICAgICAgICBpZiAoa2VybmVsLnNldHVwRnVuYyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAga2VybmVsLnNldHVwRnVuYyh0aGlzLmJhY2tlbmRJbnN0YW5jZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBkaXNwb3NlUmVnaXN0ZXJlZEtlcm5lbHMoYmFja2VuZE5hbWUpIHtcbiAgICAgICAgY29uc3Qga2VybmVscyA9IGdldEtlcm5lbHNGb3JCYWNrZW5kKGJhY2tlbmROYW1lKTtcbiAgICAgICAga2VybmVscy5mb3JFYWNoKGtlcm5lbCA9PiB7XG4gICAgICAgICAgICBpZiAoa2VybmVsLmRpc3Bvc2VGdW5jICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBrZXJuZWwuZGlzcG9zZUZ1bmModGhpcy5yZWdpc3RyeVtiYWNrZW5kTmFtZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZXMgYSBiYWNrZW5kIGJ5IGxvb2tpbmcgdXAgdGhlIGJhY2tlbmQgbmFtZSBpbiB0aGUgZmFjdG9yeVxuICAgICAqIHJlZ2lzdHJ5IGFuZCBjYWxsaW5nIHRoZSBmYWN0b3J5IG1ldGhvZC4gUmV0dXJucyBhIGJvb2xlYW4gcmVwcmVzZW50aW5nXG4gICAgICogd2hldGhlciB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGJhY2tlbmQgc3VjZWVkZWQuIFRocm93cyBhbiBlcnJvciBpZlxuICAgICAqIHRoZXJlIGlzIG5vIGJhY2tlbmQgaW4gdGhlIGZhY3RvcnkgcmVnaXN0cnkuXG4gICAgICovXG4gICAgaW5pdGlhbGl6ZUJhY2tlbmQoYmFja2VuZE5hbWUpIHtcbiAgICAgICAgY29uc3QgcmVnaXN0cnlGYWN0b3J5RW50cnkgPSB0aGlzLnJlZ2lzdHJ5RmFjdG9yeVtiYWNrZW5kTmFtZV07XG4gICAgICAgIGlmIChyZWdpc3RyeUZhY3RvcnlFbnRyeSA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBpbml0aWFsaXplIGJhY2tlbmQgJHtiYWNrZW5kTmFtZX0sIG5vIHJlZ2lzdHJhdGlvbiBmb3VuZC5gKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgYmFja2VuZCA9IHJlZ2lzdHJ5RmFjdG9yeUVudHJ5LmZhY3RvcnkoKTtcbiAgICAgICAgICAgIC8qIFRlc3QgaWYgdGhlIGZhY3RvcnkgcmV0dXJucyBhIHByb21pc2UuXG4gICAgICAgICAgICBEb25lIGluIGEgbW9yZSBsaWJlcmFsIHdheSB0aGFuXG4gICAgICAgICAgICBwcmV2aW91cyAnUHJvbWlzZS5yZXNvbHZlKGJhY2tlbmQpPT09YmFja2VuZCdcbiAgICAgICAgICAgIGFzIHdlIG5lZWRlZCB0byBhY2NvdW50IGZvciBjdXN0b20gUHJvbWlzZVxuICAgICAgICAgICAgaW1wbGVtZW50YXRpb25zIChlLmcuIEFuZ3VsYXIpICovXG4gICAgICAgICAgICBpZiAoYmFja2VuZCAmJiAhKGJhY2tlbmQgaW5zdGFuY2VvZiBLZXJuZWxCYWNrZW5kKSAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBiYWNrZW5kLnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9taXNlSWQgPSArK3RoaXMucGVuZGluZ0JhY2tlbmRJbml0SWQ7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGJhY2tlbmRcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oYmFja2VuZEluc3RhbmNlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gT3V0ZGF0ZWQgcHJvbWlzZS4gQW5vdGhlciBiYWNrZW5kIHdhcyBzZXQgaW4gdGhlIG1lYW50aW1lLlxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvbWlzZUlkIDwgdGhpcy5wZW5kaW5nQmFja2VuZEluaXRJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVnaXN0cnlbYmFja2VuZE5hbWVdID0gYmFja2VuZEluc3RhbmNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdCYWNrZW5kSW5pdCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBPdXRkYXRlZCBwcm9taXNlLiBBbm90aGVyIGJhY2tlbmQgd2FzIHNldCBpbiB0aGUgbWVhbnRpbWUuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9taXNlSWQgPCB0aGlzLnBlbmRpbmdCYWNrZW5kSW5pdElkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nQmFja2VuZEluaXQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYEluaXRpYWxpemF0aW9uIG9mIGJhY2tlbmQgJHtiYWNrZW5kTmFtZX0gZmFpbGVkYCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihlcnIuc3RhY2sgfHwgZXJyLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nQmFja2VuZEluaXQgPSBzdWNjZXNzO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3MsIGFzeW5jSW5pdDogdHJ1ZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWdpc3RyeVtiYWNrZW5kTmFtZV0gPSBiYWNrZW5kO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGFzeW5jSW5pdDogZmFsc2UgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYEluaXRpYWxpemF0aW9uIG9mIGJhY2tlbmQgJHtiYWNrZW5kTmFtZX0gZmFpbGVkYCk7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oZXJyLnN0YWNrIHx8IGVyci5tZXNzYWdlKTtcbiAgICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBhc3luY0luaXQ6IGZhbHNlIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVtb3ZlQmFja2VuZChiYWNrZW5kTmFtZSkge1xuICAgICAgICBpZiAoIShiYWNrZW5kTmFtZSBpbiB0aGlzLnJlZ2lzdHJ5RmFjdG9yeSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtiYWNrZW5kTmFtZX0gYmFja2VuZCBub3QgZm91bmQgaW4gcmVnaXN0cnlgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5iYWNrZW5kTmFtZSA9PT0gYmFja2VuZE5hbWUgJiYgdGhpcy5wZW5kaW5nQmFja2VuZEluaXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gVGhlcmUgaXMgYSBwZW5kaW5nIHByb21pc2Ugb2YgdGhlIGJhY2tlbmQgd2Ugd2FudCB0byByZW1vdmUuIE1ha2UgaXRcbiAgICAgICAgICAgIC8vIG9ic29sZXRlLlxuICAgICAgICAgICAgdGhpcy5wZW5kaW5nQmFja2VuZEluaXRJZCsrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiYWNrZW5kTmFtZSBpbiB0aGlzLnJlZ2lzdHJ5KSB7XG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2VSZWdpc3RlcmVkS2VybmVscyhiYWNrZW5kTmFtZSk7XG4gICAgICAgICAgICB0aGlzLnJlZ2lzdHJ5W2JhY2tlbmROYW1lXS5kaXNwb3NlKCk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5yZWdpc3RyeVtiYWNrZW5kTmFtZV07XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIHRoaXMucmVnaXN0cnlGYWN0b3J5W2JhY2tlbmROYW1lXTtcbiAgICAgICAgLy8gVW5zZXQgdGhlIGJhY2tlbmQgaWYgaXQgaXMgYWN0aXZlLlxuICAgICAgICBpZiAodGhpcy5iYWNrZW5kTmFtZSA9PT0gYmFja2VuZE5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0JhY2tlbmRJbml0ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuYmFja2VuZE5hbWUgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5iYWNrZW5kSW5zdGFuY2UgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldFNvcnRlZEJhY2tlbmRzKCkge1xuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5yZWdpc3RyeUZhY3RvcnkpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBiYWNrZW5kIGZvdW5kIGluIHJlZ2lzdHJ5LicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLnJlZ2lzdHJ5RmFjdG9yeSkuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgLy8gSGlnaGVzdCBwcmlvcml0eSBjb21lcyBmaXJzdC5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5RmFjdG9yeVtiXS5wcmlvcml0eSAtXG4gICAgICAgICAgICAgICAgdGhpcy5yZWdpc3RyeUZhY3RvcnlbYV0ucHJpb3JpdHk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpbml0aWFsaXplQmFja2VuZHNBbmRSZXR1cm5CZXN0KCkge1xuICAgICAgICBjb25zdCBzb3J0ZWRCYWNrZW5kcyA9IHRoaXMuZ2V0U29ydGVkQmFja2VuZHMoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3J0ZWRCYWNrZW5kcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgYmFja2VuZE5hbWUgPSBzb3J0ZWRCYWNrZW5kc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IHsgc3VjY2VzcywgYXN5bmNJbml0IH0gPSB0aGlzLmluaXRpYWxpemVCYWNrZW5kKGJhY2tlbmROYW1lKTtcbiAgICAgICAgICAgIGlmIChhc3luY0luaXQgfHwgc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IG5hbWU6IGJhY2tlbmROYW1lLCBhc3luY0luaXQgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBpbml0aWFsaXplIGFueSBiYWNrZW5kcywgYWxsIGJhY2tlbmQgaW5pdGlhbGl6YXRpb25zIGAgK1xuICAgICAgICAgICAgYGZhaWxlZC5gKTtcbiAgICB9XG4gICAgbW92ZURhdGEoYmFja2VuZCwgZGF0YUlkKSB7XG4gICAgICAgIGNvbnN0IGluZm8gPSB0aGlzLnN0YXRlLnRlbnNvckluZm8uZ2V0KGRhdGFJZCk7XG4gICAgICAgIGNvbnN0IHNyY0JhY2tlbmQgPSBpbmZvLmJhY2tlbmQ7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMucmVhZFN5bmMoZGF0YUlkKTtcbiAgICAgICAgY29uc3QgcmVmQ291bnQgPSBzcmNCYWNrZW5kLnJlZkNvdW50KGRhdGFJZCk7XG4gICAgICAgIC8vIERlbGV0ZSB0aGUgdGVuc29yIGZyb20gdGhlIG9sZCBiYWNrZW5kIGFuZCBtb3ZlIGl0IHRvIHRoZSBuZXdcbiAgICAgICAgLy8gYmFja2VuZC5cbiAgICAgICAgc3JjQmFja2VuZC5kaXNwb3NlRGF0YShkYXRhSWQsIHRydWUpO1xuICAgICAgICBpbmZvLmJhY2tlbmQgPSBiYWNrZW5kO1xuICAgICAgICBiYWNrZW5kLm1vdmUoZGF0YUlkLCB2YWx1ZXMsIGluZm8uc2hhcGUsIGluZm8uZHR5cGUsIHJlZkNvdW50KTtcbiAgICAgICAgaWYgKHRoaXMuc2hvdWxkQ2hlY2tGb3JNZW1MZWFrcygpKSB7XG4gICAgICAgICAgICAvLyBUcmFjayB0aGUgbnVtYmVyIG9mIG1vdmVzIGR1cmluZyBhIGtlcm5lbCBleGVjdXRpb24gdG8gY29ycmVjdGx5XG4gICAgICAgICAgICAvLyBkZXRlY3QgbWVtb3J5IGxlYWtzLlxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5udW1EYXRhTW92ZXNTdGFja1t0aGlzLnN0YXRlLm51bURhdGFNb3Zlc1N0YWNrLmxlbmd0aCAtIDFdKys7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGlkeShuYW1lT3JGbiwgZm4pIHtcbiAgICAgICAgbGV0IG5hbWUgPSBudWxsO1xuICAgICAgICBpZiAoZm4gPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gQ2FsbGVkIHdpdGggb25seSAxIGFyZ3VtZW50LlxuICAgICAgICAgICAgaWYgKHR5cGVvZiBuYW1lT3JGbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIHByb3ZpZGUgYSBmdW5jdGlvbiB0byB0aWR5KCknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZuID0gbmFtZU9yRm47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBDYWxsZWQgd2l0aCAyIGFyZ3VtZW50cy5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgbmFtZU9yRm4gIT09ICdzdHJpbmcnICYmICEobmFtZU9yRm4gaW5zdGFuY2VvZiBTdHJpbmcpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXaGVuIGNhbGxpbmcgd2l0aCB0d28gYXJndW1lbnRzLCB0aGUgZmlyc3QgYXJndW1lbnQgJyArXG4gICAgICAgICAgICAgICAgICAgICd0byB0aWR5KCkgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV2hlbiBjYWxsaW5nIHdpdGggdHdvIGFyZ3VtZW50cywgdGhlIDJuZCBhcmd1bWVudCAnICtcbiAgICAgICAgICAgICAgICAgICAgJ3RvIHRpZHkoKSBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5hbWUgPSBuYW1lT3JGbjtcbiAgICAgICAgICAgIC8vIFRPRE8obnN0aG9yYXQsc21pbGtvdik6IERvIG9wZXJhdGlvbiBsb2dnaW5nIGFuZCBwZXJmb3JtYW5jZVxuICAgICAgICAgICAgLy8gcHJvZmlsaW5nLlxuICAgICAgICB9XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIHJldHVybiB0aGlzLnNjb3BlZFJ1bigoKSA9PiB0aGlzLnN0YXJ0U2NvcGUobmFtZSksICgpID0+IHRoaXMuZW5kU2NvcGUocmVzdWx0KSwgKCkgPT4ge1xuICAgICAgICAgICAgcmVzdWx0ID0gZm4oKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ2Fubm90IHJldHVybiBhIFByb21pc2UgaW5zaWRlIG9mIHRpZHkuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2NvcGVkUnVuKHN0YXJ0LCBlbmQsIGYpIHtcbiAgICAgICAgc3RhcnQoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGYoKTtcbiAgICAgICAgICAgIGVuZCgpO1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgIGVuZCgpO1xuICAgICAgICAgICAgdGhyb3cgZXg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmV4dFRlbnNvcklkKCkge1xuICAgICAgICByZXR1cm4gRW5naW5lLm5leHRUZW5zb3JJZCsrO1xuICAgIH1cbiAgICBuZXh0VmFyaWFibGVJZCgpIHtcbiAgICAgICAgcmV0dXJuIEVuZ2luZS5uZXh0VmFyaWFibGVJZCsrO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgaW5zdGVhZCBvZiB0aGUgcHVibGljLWZhY2luZyB0ZW5zb3IuY2xvbmUoKSB3aGVuXG4gICAgICogc2F2aW5nIGEgdGVuc29yIGZvciBiYWNrd2FyZHMgcGFzcy4gSXQgbWFrZXMgc3VyZSB0byBhZGQgdGhlIGNsb25lXG4gICAgICogb3BlcmF0aW9uIHRvIHRoZSB0YXBlIHJlZ2FyZGxlc3Mgb2YgYmVpbmcgY2FsbGVkIGluc2lkZSBhIGtlcm5lbFxuICAgICAqIGV4ZWN1dGlvbi5cbiAgICAgKi9cbiAgICBjbG9uZSh4KSB7XG4gICAgICAgIGNvbnN0IHkgPSBFTkdJTkUucnVuS2VybmVsKElkZW50aXR5LCB7IHggfSk7XG4gICAgICAgIGNvbnN0IGlucHV0cyA9IHsgeCB9O1xuICAgICAgICBjb25zdCBncmFkID0gKGR5KSA9PiAoe1xuICAgICAgICAgICAgeDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGR0eXBlID0gJ2Zsb2F0MzInO1xuICAgICAgICAgICAgICAgIGNvbnN0IGdyYWRJbnB1dHMgPSB7IHg6IGR5IH07XG4gICAgICAgICAgICAgICAgY29uc3QgYXR0cnMgPSB7IGR0eXBlIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoQ2FzdCwgZ3JhZElucHV0cywgXG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgICAgICAgICAgICAgIGF0dHJzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHNhdmVkID0gW107XG4gICAgICAgIHRoaXMuYWRkVGFwZU5vZGUodGhpcy5zdGF0ZS5hY3RpdmVTY29wZS5uYW1lLCBpbnB1dHMsIFt5XSwgZ3JhZCwgc2F2ZWQsIHt9KTtcbiAgICAgICAgcmV0dXJuIHk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGUgYSBrZXJuZWwgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgcmV0dXJuIHRoZSBvdXRwdXQgdGVuc29yLlxuICAgICAqXG4gICAgICogQHBhcmFtIGtlcm5lbE5hbWUgVGhlIG5hbWUgb2YgdGhlIGtlcm5lbCB0byBleGVjdXRlLlxuICAgICAqIEBwYXJhbSBpbnB1dHMgQSBtYXAgb2YgaW5wdXQgbmFtZXMgdG8gdGVuc29ycy5cbiAgICAgKiBAcGFyYW0gYXR0cnMgQSBtYXAgb2YgYXR0cmlidXRlIG5hbWVzIHRvIHRoZWlyIHZhbHVlcy4gQW4gYXR0cmlidXRlIGlzIGFcbiAgICAgKiAgICAgcHJpbWl0aXZlIChub24tdGVuc29yKSBpbnB1dCB0byB0aGUga2VybmVsLlxuICAgICAqIEBwYXJhbSBpbnB1dHNUb1NhdmUgQSBsaXN0IG9mIHRlbnNvcnMsIGlucHV0cyB0byBzYXZlIGZvciB0aGUgYmFja3Byb3BcbiAgICAgKiAgICAgY29tcHV0YXRpb24uXG4gICAgICogQHBhcmFtIG91dHB1dHNUb1NhdmUgQSBsaXN0IG9mIGJvb2xlYW5zLCBzcGVjaWZ5aW5nIHdoaWNoIG91dHB1dCB0byBzYXZlXG4gICAgICogICAgIGZvciB0aGUgYmFja3Byb3AgY29tcHV0YXRpb24uIFRoZXNlIGFyZSBib29sZWFucyBzaW5jZSB0aGUgb3V0cHV0XG4gICAgICogdGVuc29ycyBhcmUgbm90IHZpc2libGUgdG8gdGhlIHVzZXIuXG4gICAgICovXG4gICAgcnVuS2VybmVsKGtlcm5lbE5hbWUsIGlucHV0cywgYXR0cnMpIHtcbiAgICAgICAgaWYgKHRoaXMuYmFja2VuZE5hbWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gYmFja2VuZCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0IChiYWNrZW5kIGluaXRpYWxpemF0aW9uIGlzIGxhenlcbiAgICAgICAgICAgIC8vIGNhbiBiZSBkZWZlcnJlZCB1bnRpbCBhbiBvcC8ga2VybmVsIGlzIHJ1bikuXG4gICAgICAgICAgICAvLyBUaGUgYmVsb3cgZ2V0dGVyIGhhcyBzaWRlIGVmZmVjdHMgdGhhdCB3aWxsIHRyeSB0byBpbml0aWFsaXplIHRoZVxuICAgICAgICAgICAgLy8gYmFja2VuZCBhbmQgc2V0IHByb3BlcnRpZXMgbGlrZSB0aGlzLmJhY2tlbmROYW1lXG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVudXNlZC1leHByZXNzaW9uXG4gICAgICAgICAgICB0aGlzLmJhY2tlbmQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaGFzS2VybmVsID0gZ2V0S2VybmVsKGtlcm5lbE5hbWUsIHRoaXMuYmFja2VuZE5hbWUpICE9IG51bGw7XG4gICAgICAgIGlmICghaGFzS2VybmVsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEtlcm5lbCAnJHtrZXJuZWxOYW1lfScgbm90IHJlZ2lzdGVyZWQgZm9yIGJhY2tlbmQgJyR7dGhpcy5iYWNrZW5kTmFtZX0nYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucnVuS2VybmVsRnVuYyh7IGtlcm5lbE5hbWUsIGlucHV0cywgYXR0cnMgfSk7XG4gICAgfVxuICAgIHNob3VsZENoZWNrRm9yTWVtTGVha3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkVOVi5nZXRCb29sKCdJU19URVNUJyk7XG4gICAgfVxuICAgIGNoZWNrS2VybmVsRm9yTWVtTGVhayhrZXJuZWxOYW1lLCBudW1EYXRhSWRzQmVmb3JlLCBvdXRJbmZvcykge1xuICAgICAgICBjb25zdCBudW1EYXRhSWRzQWZ0ZXIgPSB0aGlzLmJhY2tlbmQubnVtRGF0YUlkcygpO1xuICAgICAgICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIGRhdGEgaWRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZSBrZXJuZWwuXG4gICAgICAgIGxldCBudW1PdXRwdXREYXRhSWRzID0gMDtcbiAgICAgICAgb3V0SW5mb3MuZm9yRWFjaChpbmZvID0+IHtcbiAgICAgICAgICAgIC8vIENvbXBsZXggbnVtYmVycyBhbGxvY2F0ZSAzIGRhdGEgaWRzLCBvbmUgZm9yICdyZWFsJywgb25lIGZvclxuICAgICAgICAgICAgLy8gJ2ltYWdpbmFyeScsIGFuZCBvbmUgZm9yIHRoZSBjb250YWluZXIgdGhhdCBob2xkcyB0aGUgZm9ybWVyIHR3by5cbiAgICAgICAgICAgIG51bU91dHB1dERhdGFJZHMgKz0gKGluZm8uZHR5cGUgPT09ICdjb21wbGV4NjQnID8gMyA6IDEpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gQWNjb3VudCBmb3IgdGhlIG51bWJlciBvZiBtb3ZlcyBkdXJpbmcga2VybmVsIGV4ZWN1dGlvbi4gQSBcImRhdGEgbW92ZVwiXG4gICAgICAgIC8vIGNhbiBoYXBwZW4gaW4gdGhlIG1pZGRsZSBvZiBhIGtlcm5lbCBleGVjdXRpb24sIHBsYWNpbmcgYSBuZXcgKGtleSx2YWx1ZSlcbiAgICAgICAgLy8gcGFpciBpbiB0aGUgZGF0YSBzdG9yYWdlLiBTaW5jZSBkYXRhIG1vdmVzIGhhdmUgbmV0IHplcm8gZWZmZWN0ICh3ZVxuICAgICAgICAvLyBhbHdheXMgcmVtb3ZlIHRoZSBkYXRhIGZyb20gdGhlIG9sZCBiYWNrZW5kKSwgd2UgaGF2ZSB0byBjYW5jZWwgdGhlbSBvdXRcbiAgICAgICAgLy8gd2hlbiBkZXRlY3RpbmcgbWVtb3J5IGxlYWtzLlxuICAgICAgICBjb25zdCBudW1Nb3ZlcyA9IHRoaXMuc3RhdGUubnVtRGF0YU1vdmVzU3RhY2tbdGhpcy5zdGF0ZS5udW1EYXRhTW92ZXNTdGFjay5sZW5ndGggLSAxXTtcbiAgICAgICAgY29uc3QgZGF0YUlkc0xlYWtlZCA9IG51bURhdGFJZHNBZnRlciAtIG51bURhdGFJZHNCZWZvcmUgLSBudW1PdXRwdXREYXRhSWRzIC0gbnVtTW92ZXM7XG4gICAgICAgIGlmIChkYXRhSWRzTGVha2VkID4gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCYWNrZW5kICcke3RoaXMuYmFja2VuZE5hbWV9JyBoYXMgYW4gaW50ZXJuYWwgbWVtb3J5IGxlYWsgYCArXG4gICAgICAgICAgICAgICAgYCgke2RhdGFJZHNMZWFrZWR9IGRhdGEgaWRzKSBhZnRlciBydW5uaW5nICcke2tlcm5lbE5hbWV9J2ApO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEludGVybmFsIGhlbHBlciBtZXRob2QgdG8gZXhlY3V0ZSBhIGtlcm5lbCBGdW5jXG4gICAgICpcbiAgICAgKiBVc2UgYHJ1bktlcm5lbGAgdG8gZXhlY3V0ZSBrZXJuZWxzIGZyb20gb3V0c2lkZSBvZiBlbmdpbmUuXG4gICAgICovXG4gICAgcnVuS2VybmVsRnVuYyhrZXJuZWxQYXJhbXMpIHtcbiAgICAgICAgbGV0IG91dHB1dHM7XG4gICAgICAgIGxldCBzYXZlZCA9IFtdO1xuICAgICAgICBjb25zdCBpc1RhcGVPbiA9IHRoaXMuaXNUYXBlT24oKTtcbiAgICAgICAgY29uc3Qgc3RhcnRpbmdCeXRlY291bnQgPSB0aGlzLnN0YXRlLm51bUJ5dGVzO1xuICAgICAgICBjb25zdCBzdGFydGluZ051bVRlbnNvcnMgPSB0aGlzLnN0YXRlLm51bVRlbnNvcnM7XG4gICAgICAgIGlmICh0aGlzLnNob3VsZENoZWNrRm9yTWVtTGVha3MoKSkge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS5udW1EYXRhTW92ZXNTdGFjay5wdXNoKDApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBrZXJuZWxGdW5jO1xuICAgICAgICBpZiAodGhpcy5iYWNrZW5kTmFtZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBiYWNrZW5kIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXQgKGJhY2tlbmQgaW5pdGlhbGl6YXRpb24gaXMgbGF6eVxuICAgICAgICAgICAgLy8gY2FuIGJlIGRlZmVycmVkIHVudGlsIGFuIG9wLyBrZXJuZWwgaXMgcnVuKS5cbiAgICAgICAgICAgIC8vIFRoZSBiZWxvdyBnZXR0ZXIgaGFzIHNpZGUgZWZmZWN0cyB0aGF0IHdpbGwgdHJ5IHRvIGluaXRpYWxpemUgdGhlXG4gICAgICAgICAgICAvLyBiYWNrZW5kIGFuZCBzZXQgcHJvcGVydGllcyBsaWtlIHRoaXMuYmFja2VuZE5hbWVcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW51c2VkLWV4cHJlc3Npb25cbiAgICAgICAgICAgIHRoaXMuYmFja2VuZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb3V0O1xuICAgICAgICBjb25zdCBrZXJuZWxPclNjb3BlTmFtZSA9IGlzUmVnaXN0ZXJlZEtlcm5lbEludm9jYXRpb24oa2VybmVsUGFyYW1zKSA/XG4gICAgICAgICAgICBrZXJuZWxQYXJhbXMua2VybmVsTmFtZSA6XG4gICAgICAgICAgICB0aGlzLnN0YXRlLmFjdGl2ZVNjb3BlICE9IG51bGwgPyB0aGlzLnN0YXRlLmFjdGl2ZVNjb3BlLm5hbWUgOiAnJztcbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBrZXJuZWxGdW5jIGZyb20gZWl0aGVyIGEgcmVnaXN0ZXJlZCBrZXJuZWwgT1IgcGFzc2VkIGluXG4gICAgICAgIC8vIGZvcndhcmQvYmFja3dhcmQgZnVuY3Rpb25zICh1c2VkIGJ5IGN1c3RvbSBncmFkKS4gSW4gdGhpcyBjb250ZXh0IGFcbiAgICAgICAgLy8ga2VybmVsRnVuYyB3cmFwcyBhIGtlcm5lbCBpbXBsZW1lbnRhdGlvbiB3aXRoIHNvbWUgYm9va2tlZXBpbmcuXG4gICAgICAgIGlmIChpc1JlZ2lzdGVyZWRLZXJuZWxJbnZvY2F0aW9uKGtlcm5lbFBhcmFtcykpIHtcbiAgICAgICAgICAgIGNvbnN0IHsga2VybmVsTmFtZSwgaW5wdXRzLCBhdHRycyB9ID0ga2VybmVsUGFyYW1zO1xuICAgICAgICAgICAgaWYgKHRoaXMuYmFja2VuZE5hbWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIGJhY2tlbmQgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIHlldCAoYmFja2VuZCBpbml0aWFsaXphdGlvbiBpcyBsYXp5XG4gICAgICAgICAgICAgICAgLy8gY2FuIGJlIGRlZmVycmVkIHVudGlsIGFuIG9wLyBrZXJuZWwgaXMgcnVuKS5cbiAgICAgICAgICAgICAgICAvLyBUaGUgYmVsb3cgZ2V0dGVyIGhhcyBzaWRlIGVmZmVjdHMgdGhhdCB3aWxsIHRyeSB0byBpbml0aWFsaXplIHRoZVxuICAgICAgICAgICAgICAgIC8vIGJhY2tlbmQgYW5kIHNldCBwcm9wZXJ0aWVzIGxpa2UgdGhpcy5iYWNrZW5kTmFtZVxuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW51c2VkLWV4cHJlc3Npb25cbiAgICAgICAgICAgICAgICB0aGlzLmJhY2tlbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBrZXJuZWwgPSBnZXRLZXJuZWwoa2VybmVsTmFtZSwgdGhpcy5iYWNrZW5kTmFtZSk7XG4gICAgICAgICAgICB1dGlsLmFzc2VydChrZXJuZWwgIT0gbnVsbCwgKCkgPT4gYENhbm5vdCBmaW5kIHJlZ2lzdGVyZWQga2VybmVsICcke2tlcm5lbE5hbWV9JyBmb3IgYmFja2VuZCAnJHt0aGlzLmJhY2tlbmROYW1lfSdgKTtcbiAgICAgICAgICAgIGtlcm5lbEZ1bmMgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbnVtRGF0YUlkc0JlZm9yZSA9IHRoaXMuYmFja2VuZC5udW1EYXRhSWRzKCk7XG4gICAgICAgICAgICAgICAgb3V0ID0ga2VybmVsLmtlcm5lbEZ1bmMoeyBpbnB1dHMsIGF0dHJzLCBiYWNrZW5kOiB0aGlzLmJhY2tlbmQgfSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3V0SW5mb3MgPSBBcnJheS5pc0FycmF5KG91dCkgPyBvdXQgOiBbb3V0XTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG91bGRDaGVja0Zvck1lbUxlYWtzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja0tlcm5lbEZvck1lbUxlYWsoa2VybmVsTmFtZSwgbnVtRGF0YUlkc0JlZm9yZSwgb3V0SW5mb3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBvdXRUZW5zb3JzID0gb3V0SW5mb3MubWFwKChvdXRJbmZvKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRvZG8gKHlhc3NvZ2JhKSByZW1vdmUgdGhpcyBvcHRpb24gKFRlbnNvcikgd2hlbiBub2RlIGJhY2tlbmRcbiAgICAgICAgICAgICAgICAgICAgLy8gbWV0aG9kcyBoYXZlIGJlZW4gbW9kdWxhcml6ZWQgYW5kIHRoZXkgYWxsIHJldHVybiB0ZW5zb3JJbmZvLlxuICAgICAgICAgICAgICAgICAgICAvLyBUZW5zb3JJbmZvcyBkbyBub3QgaGF2ZSBhIHJhbmsgYXR0cmlidXRlLlxuICAgICAgICAgICAgICAgICAgICBpZiAob3V0SW5mby5yYW5rICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvdXRJbmZvO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgZGF0YUlkLCBzaGFwZSwgZHR5cGUgfSA9IG91dEluZm87XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1ha2VUZW5zb3JGcm9tRGF0YUlkKGRhdGFJZCwgc2hhcGUsIGR0eXBlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAvLyBTYXZlIGFueSByZXF1aXJlZCBpbnB1dHMgYW5kIG91dHB1dHMuXG4gICAgICAgICAgICAgICAgLy8gRG8gbm90IHNhdmUgdW5sZXNzIHdlIGFyZSByZWNvcmRpbmcgdG8gdGhlIHRhcGUuIE90aGVyd2lzZSBpdCB3b3VsZFxuICAgICAgICAgICAgICAgIC8vIGNhdXNlIGEgbWVtIGxlYWsgc2luY2UgdGhlcmUgd291bGQgYmUgbm8gYmFja3Byb3AgZm9yIHRoZXNlIHRlbnNvcnNcbiAgICAgICAgICAgICAgICAvLyAod2hpY2ggd291bGQgb3RoZXJ3aXNlIGRpc3Bvc2UgdGhlbSkuXG4gICAgICAgICAgICAgICAgaWYgKGlzVGFwZU9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlbnNvcnNUb1NhdmUgPSB0aGlzLmdldFRlbnNvcnNGb3JHcmFkaWVudChrZXJuZWxOYW1lLCBpbnB1dHMsIG91dFRlbnNvcnMpO1xuICAgICAgICAgICAgICAgICAgICBzYXZlZCA9IHRoaXMuc2F2ZVRlbnNvcnNGb3JCYWNrd2FyZE1vZGUodGVuc29yc1RvU2F2ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBvdXRUZW5zb3JzO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHsgZm9yd2FyZEZ1bmMgfSA9IGtlcm5lbFBhcmFtcztcbiAgICAgICAgICAgIC8vIFJ1bm5pbmcgYSBjdXN0b21HcmFkIG9wLlxuICAgICAgICAgICAgY29uc3Qgc2F2ZUZ1bmMgPSAodGVuc29ycykgPT4ge1xuICAgICAgICAgICAgICAgIC8vIERvIG5vdCBzYXZlIHVubGVzcyB3ZSBhcmUgcmVjb3JkaW5nIHRvIHRoZSB0YXBlLiBPdGhlcndpc2UgaXQgd291bGRcbiAgICAgICAgICAgICAgICAvLyBjYXVzZSBhIG1lbSBsZWFrIHNpbmNlIHdlIHdvdWxkIG5ldmVyIHJ1biBiYWNrcHJvcCwgd2hpY2ggZGlzcG9zZXNcbiAgICAgICAgICAgICAgICAvLyB0aGUga2VwdCB0ZW5zb3JzLlxuICAgICAgICAgICAgICAgIGlmICghaXNUYXBlT24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzYXZlZCA9IHRlbnNvcnMubWFwKHRlbnNvciA9PiB0aGlzLmtlZXAodGhpcy5jbG9uZSh0ZW5zb3IpKSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAga2VybmVsRnVuYyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBudW1EYXRhSWRzQmVmb3JlID0gdGhpcy5iYWNrZW5kLm51bURhdGFJZHMoKTtcbiAgICAgICAgICAgICAgICBvdXQgPSB0aGlzLnRpZHkoKCkgPT4gZm9yd2FyZEZ1bmModGhpcy5iYWNrZW5kLCBzYXZlRnVuYykpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG91dHMgPSAoQXJyYXkuaXNBcnJheShvdXQpID8gb3V0IDogW291dF0pO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3VsZENoZWNrRm9yTWVtTGVha3MoKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTY29wZSBuYW1lIGlzIHVzZWQgdG8gcHJpbnQgYSBtb3JlIGhlbHBmdWwgZXJyb3IgbWVzc2FnZSBpZiBuZWVkZWQuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tLZXJuZWxGb3JNZW1MZWFrKGtlcm5lbE9yU2NvcGVOYW1lLCBudW1EYXRhSWRzQmVmb3JlLCBvdXRzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG91dHM7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIC8vXG4gICAgICAgIC8vIFJ1biB0aGUga2VybmVsRnVuYy4gT3B0aW9uYWxseSBwcm9maWxpbmcgaXQuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHsgaW5wdXRzLCBhdHRycyB9ID0ga2VybmVsUGFyYW1zO1xuICAgICAgICBjb25zdCBiYWNrd2FyZHNGdW5jID0gaXNSZWdpc3RlcmVkS2VybmVsSW52b2NhdGlvbihrZXJuZWxQYXJhbXMpID9cbiAgICAgICAgICAgIG51bGwgOlxuICAgICAgICAgICAga2VybmVsUGFyYW1zLmJhY2t3YXJkc0Z1bmM7XG4gICAgICAgIGxldCBrZXJuZWxQcm9maWxlO1xuICAgICAgICB0aGlzLnNjb3BlZFJ1bihcbiAgICAgICAgLy8gU3RvcCByZWNvcmRpbmcgdG8gYSB0YXBlIHdoZW4gcnVubmluZyBhIGtlcm5lbC5cbiAgICAgICAgKCkgPT4gdGhpcy5zdGF0ZS5rZXJuZWxEZXB0aCsrLCAoKSA9PiB0aGlzLnN0YXRlLmtlcm5lbERlcHRoLS0sICgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5FTlYuZ2V0Qm9vbCgnREVCVUcnKSAmJiAhdGhpcy5zdGF0ZS5wcm9maWxpbmcpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRzID0ga2VybmVsRnVuYygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAga2VybmVsUHJvZmlsZSA9IHRoaXMucHJvZmlsZXIucHJvZmlsZUtlcm5lbChrZXJuZWxPclNjb3BlTmFtZSwgaW5wdXRzLCAoKSA9PiBrZXJuZWxGdW5jKCkpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLkVOVi5nZXRCb29sKCdERUJVRycpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvZmlsZXIubG9nS2VybmVsUHJvZmlsZShrZXJuZWxQcm9maWxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3V0cHV0cyA9IGtlcm5lbFByb2ZpbGUub3V0cHV0cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChpc1RhcGVPbikge1xuICAgICAgICAgICAgdGhpcy5hZGRUYXBlTm9kZShrZXJuZWxPclNjb3BlTmFtZSwgaW5wdXRzLCBvdXRwdXRzLCBiYWNrd2FyZHNGdW5jLCBzYXZlZCwgYXR0cnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLnByb2ZpbGluZykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS5hY3RpdmVQcm9maWxlLmtlcm5lbHMucHVzaCh7XG4gICAgICAgICAgICAgICAgbmFtZToga2VybmVsT3JTY29wZU5hbWUsXG4gICAgICAgICAgICAgICAgYnl0ZXNBZGRlZDogdGhpcy5zdGF0ZS5udW1CeXRlcyAtIHN0YXJ0aW5nQnl0ZWNvdW50LFxuICAgICAgICAgICAgICAgIHRvdGFsQnl0ZXNTbmFwc2hvdDogdGhpcy5zdGF0ZS5udW1CeXRlcyxcbiAgICAgICAgICAgICAgICB0ZW5zb3JzQWRkZWQ6IHRoaXMuc3RhdGUubnVtVGVuc29ycyAtIHN0YXJ0aW5nTnVtVGVuc29ycyxcbiAgICAgICAgICAgICAgICB0b3RhbFRlbnNvcnNTbmFwc2hvdDogdGhpcy5zdGF0ZS5udW1UZW5zb3JzLFxuICAgICAgICAgICAgICAgIGlucHV0U2hhcGVzOiBPYmplY3Qua2V5cyhpbnB1dHMpLm1hcChrZXkgPT4gaW5wdXRzW2tleV0gIT0gbnVsbCA/IGlucHV0c1trZXldLnNoYXBlIDogbnVsbCksXG4gICAgICAgICAgICAgICAgb3V0cHV0U2hhcGVzOiBvdXRwdXRzLm1hcChpdGVtID0+IGl0ZW0uc2hhcGUpLFxuICAgICAgICAgICAgICAgIGtlcm5lbFRpbWVNczoga2VybmVsUHJvZmlsZS50aW1lTXMsXG4gICAgICAgICAgICAgICAgZXh0cmFJbmZvOiBrZXJuZWxQcm9maWxlLmV4dHJhSW5mb1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChBcnJheS5pc0FycmF5KG91dCkgPyBvdXRwdXRzIDogb3V0cHV0c1swXSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNhdmVzIHRlbnNvcnMgdXNlZCBpbiBmb3J3YXJkIG1vZGUgZm9yIHVzZSBpbiBiYWNrd2FyZCBtb2RlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRlbnNvcnMgdGhlIGxpc3Qgb2YgdGVuc29ycyB0byBzYXZlLlxuICAgICAqL1xuICAgIHNhdmVUZW5zb3JzRm9yQmFja3dhcmRNb2RlKHRlbnNvcnMpIHtcbiAgICAgICAgY29uc3Qgc2F2ZWQgPSB0ZW5zb3JzLm1hcCh0ZW5zb3IgPT4gdGhpcy5rZWVwKHRoaXMuY2xvbmUodGVuc29yKSkpO1xuICAgICAgICByZXR1cm4gc2F2ZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHRlbnNvcnMgdG8gc2F2ZSBmb3IgYSBnaXZlbiBncmFkaWVudCBjYWxjdWxhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBrZXJuZWxOYW1lIG5hbWUgb2Yga2VybmVsIHRvIGxvb2sgdXAgZ3JhZGllbnQgZm9yLlxuICAgICAqIEBwYXJhbSBpbnB1dHMgYSBtYXAgb2YgaW5wdXQgdGVuc29ycy5cbiAgICAgKiBAcGFyYW0gb3V0cHV0cyBhbiBhcnJheSBvZiBvdXRwdXQgdGVuc29ycyBmcm9tIGZvcndhcmQgbW9kZSBvZiBrZXJuZWwuXG4gICAgICovXG4gICAgZ2V0VGVuc29yc0ZvckdyYWRpZW50KGtlcm5lbE5hbWUsIGlucHV0cywgb3V0cHV0cykge1xuICAgICAgICBjb25zdCBncmFkQ29uZmlnID0gZ2V0R3JhZGllbnQoa2VybmVsTmFtZSk7XG4gICAgICAgIGlmIChncmFkQ29uZmlnICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0c1RvU2F2ZSA9IGdyYWRDb25maWcuaW5wdXRzVG9TYXZlIHx8IFtdO1xuICAgICAgICAgICAgY29uc3Qgb3V0cHV0c1RvU2F2ZSA9IGdyYWRDb25maWcub3V0cHV0c1RvU2F2ZSB8fCBbXTtcbiAgICAgICAgICAgIC8vIElmIHNhdmVBbGxJbnB1dHMgaXMgdHJ1ZSwgYWxsIGlucHV0cyB3aWxsIGJlIHNhdmVkLiBPdGhlcndpc2UsIGlucHV0c1xuICAgICAgICAgICAgLy8gc3BlY2lmaWVkIGluIGlucHV0c1RvU2F2ZSB3aWxsIGJlIHNhdmVkLlxuICAgICAgICAgICAgbGV0IGlucHV0VGVuc29yc1RvU2F2ZTtcbiAgICAgICAgICAgIGlmIChncmFkQ29uZmlnLnNhdmVBbGxJbnB1dHMpIHtcbiAgICAgICAgICAgICAgICB1dGlsLmFzc2VydChBcnJheS5pc0FycmF5KGlucHV0cyksICgpID0+ICdzYXZlQWxsSW5wdXRzIGlzIHRydWUsIGV4cGVjdGVkIGlucHV0cyB0byBiZSBhbiBhcnJheS4nKTtcbiAgICAgICAgICAgICAgICBpbnB1dFRlbnNvcnNUb1NhdmUgPSBPYmplY3Qua2V5cyhpbnB1dHMpLm1hcCgoa2V5KSA9PiBpbnB1dHNba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbnB1dFRlbnNvcnNUb1NhdmUgPSBpbnB1dHNUb1NhdmUubWFwKChpbnB1dE5hbWUpID0+IGlucHV0c1tpbnB1dE5hbWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG91dHB1dFRlbnNvcnNUb1NhdmUgPSBvdXRwdXRzLmZpbHRlcigoXywgaSkgPT4gb3V0cHV0c1RvU2F2ZVtpXSk7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXRUZW5zb3JzVG9TYXZlLmNvbmNhdChvdXRwdXRUZW5zb3JzVG9TYXZlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXZSByZXR1cm4gYW4gZW1wdHkgbGlzdCByYXRoZXIgdGhhbiB0aHJvdyBhbiBlcnJvciBiZWNhdXNlIHRoZSBrZXJuZWwgd2VcbiAgICAgICAgLy8gYXJlIGxvb2tpbmcgdXAgbWF5IG5vdCBhY3R1YWxseSBiZSByZWxldmFudCB0byBiYWNrcHJvcGluZyB0aHJvdWdoIHRoZVxuICAgICAgICAvLyBvdmVyYWxsIGZ1bmN0aW9uXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFNlZSAnZG9lcyBub3QgZXJyb3IgaWYgaXJyZWxldmFudCAocHJ1bmVkKSBvcHMgYXJlIG1pc3NpbmcgZ3JhZHMnIHRlc3RcbiAgICAgICAgLy8gaW4gZ3JhZGllbnRzX3Rlc3QudHMgZm9yIGFuIGV4YW1wbGUuXG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgbWV0aG9kIHVzZWQgYnkgcHVibGljIEFQSXMgZm9yIHRlbnNvciBjcmVhdGlvbi4gTWFrZXMgYSBuZXdcbiAgICAgKiB0ZW5zb3Igd2l0aCB0aGUgcHJvdmlkZWQgc2hhcGUsIGR0eXBlIGFuZCB2YWx1ZXMuIEl0IGFsd2F5c1xuICAgICAqIGNyZWF0ZXMgYSBuZXcgZGF0YSBpZCBhbmQgd3JpdGVzIHRoZSB2YWx1ZXMgdG8gdGhlIHVuZGVybHlpbmcgYmFja2VuZC5cbiAgICAgKi9cbiAgICBtYWtlVGVuc29yKHZhbHVlcywgc2hhcGUsIGR0eXBlLCBiYWNrZW5kKSB7XG4gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZXMgcGFzc2VkIHRvIGVuZ2luZS5tYWtlVGVuc29yKCkgYXJlIG51bGwnKTtcbiAgICAgICAgfVxuICAgICAgICBkdHlwZSA9IGR0eXBlIHx8ICdmbG9hdDMyJztcbiAgICAgICAgYmFja2VuZCA9IGJhY2tlbmQgfHwgdGhpcy5iYWNrZW5kO1xuICAgICAgICBsZXQgYmFja2VuZFZhbHMgPSB2YWx1ZXM7XG4gICAgICAgIGlmIChkdHlwZSA9PT0gJ3N0cmluZycgJiYgdXRpbC5pc1N0cmluZyh2YWx1ZXNbMF0pKSB7XG4gICAgICAgICAgICBiYWNrZW5kVmFscyA9IHZhbHVlcy5tYXAoZCA9PiB1dGlsLmVuY29kZVN0cmluZyhkKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YUlkID0gYmFja2VuZC53cml0ZShiYWNrZW5kVmFscywgc2hhcGUsIGR0eXBlKTtcbiAgICAgICAgY29uc3QgdCA9IG5ldyBUZW5zb3Ioc2hhcGUsIGR0eXBlLCBkYXRhSWQsIHRoaXMubmV4dFRlbnNvcklkKCkpO1xuICAgICAgICB0aGlzLnRyYWNrVGVuc29yKHQsIGJhY2tlbmQpO1xuICAgICAgICAvLyBDb3VudCBieXRlcyBmb3Igc3RyaW5nIHRlbnNvcnMuXG4gICAgICAgIGlmIChkdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZm8gPSB0aGlzLnN0YXRlLnRlbnNvckluZm8uZ2V0KGRhdGFJZCk7XG4gICAgICAgICAgICBjb25zdCBuZXdCeXRlcyA9IGJ5dGVzRnJvbVN0cmluZ0FycmF5KGJhY2tlbmRWYWxzKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUubnVtQnl0ZXMgKz0gbmV3Qnl0ZXMgLSBpbmZvLmJ5dGVzO1xuICAgICAgICAgICAgaW5mby5ieXRlcyA9IG5ld0J5dGVzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnRlcm5hbCBtZXRob2QgdXNlZCBieSBiYWNrZW5kcy4gTWFrZXMgYSBuZXcgdGVuc29yXG4gICAgICogdGhhdCBpcyBhIHdyYXBwZXIgYXJvdW5kIGFuIGV4aXN0aW5nIGRhdGEgaWQuIEl0IGRvZXNuJ3QgY3JlYXRlXG4gICAgICogYSBuZXcgZGF0YSBpZCwgb25seSBpbmNyZW1lbnRzIHRoZSByZWYgY291bnQgdXNlZCBpbiBtZW1vcnkgdHJhY2tpbmcuXG4gICAgICovXG4gICAgbWFrZVRlbnNvckZyb21EYXRhSWQoZGF0YUlkLCBzaGFwZSwgZHR5cGUsIGJhY2tlbmQpIHtcbiAgICAgICAgZHR5cGUgPSBkdHlwZSB8fCAnZmxvYXQzMic7XG4gICAgICAgIGNvbnN0IHQgPSBuZXcgVGVuc29yKHNoYXBlLCBkdHlwZSwgZGF0YUlkLCB0aGlzLm5leHRUZW5zb3JJZCgpKTtcbiAgICAgICAgdGhpcy50cmFja1RlbnNvcih0LCBiYWNrZW5kKTtcbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfVxuICAgIG1ha2VWYXJpYWJsZShpbml0aWFsVmFsdWUsIHRyYWluYWJsZSA9IHRydWUsIG5hbWUsIGR0eXBlKSB7XG4gICAgICAgIG5hbWUgPSBuYW1lIHx8IHRoaXMubmV4dFZhcmlhYmxlSWQoKS50b1N0cmluZygpO1xuICAgICAgICBpZiAoZHR5cGUgIT0gbnVsbCAmJiBkdHlwZSAhPT0gaW5pdGlhbFZhbHVlLmR0eXBlKSB7XG4gICAgICAgICAgICBpbml0aWFsVmFsdWUgPSBpbml0aWFsVmFsdWUuY2FzdChkdHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdiA9IG5ldyBWYXJpYWJsZShpbml0aWFsVmFsdWUsIHRyYWluYWJsZSwgbmFtZSwgdGhpcy5uZXh0VGVuc29ySWQoKSk7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLnJlZ2lzdGVyZWRWYXJpYWJsZXNbdi5uYW1lXSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFZhcmlhYmxlIHdpdGggbmFtZSAke3YubmFtZX0gd2FzIGFscmVhZHkgcmVnaXN0ZXJlZGApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdGUucmVnaXN0ZXJlZFZhcmlhYmxlc1t2Lm5hbWVdID0gdjtcbiAgICAgICAgdGhpcy5pbmNSZWYodiwgdGhpcy5iYWNrZW5kKTtcbiAgICAgICAgcmV0dXJuIHY7XG4gICAgfVxuICAgIHRyYWNrVGVuc29yKGEsIGJhY2tlbmQpIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5udW1UZW5zb3JzKys7XG4gICAgICAgIGlmIChhLmR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS5udW1TdHJpbmdUZW5zb3JzKys7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQnl0ZXMgZm9yIGNvbXBsZXggbnVtYmVycyBhcmUgY291bnRlZCBieSB0aGVpciBjb21wb25lbnRzLiBCeXRlcyBmb3JcbiAgICAgICAgLy8gc3RyaW5nIHRlbnNvcnMgYXJlIGNvdW50ZWQgd2hlbiB3cml0aW5nIHZhbHVlcy5cbiAgICAgICAgbGV0IGJ5dGVzID0gMDtcbiAgICAgICAgaWYgKGEuZHR5cGUgIT09ICdjb21wbGV4NjQnICYmIGEuZHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBieXRlcyA9IGEuc2l6ZSAqIHV0aWwuYnl0ZXNQZXJFbGVtZW50KGEuZHR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdGUubnVtQnl0ZXMgKz0gYnl0ZXM7XG4gICAgICAgIGlmICghdGhpcy5zdGF0ZS50ZW5zb3JJbmZvLmhhcyhhLmRhdGFJZCkpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUubnVtRGF0YUJ1ZmZlcnMrKztcbiAgICAgICAgICAgIHRoaXMuc3RhdGUudGVuc29ySW5mby5zZXQoYS5kYXRhSWQsIHtcbiAgICAgICAgICAgICAgICBiYWNrZW5kOiBiYWNrZW5kIHx8IHRoaXMuYmFja2VuZCxcbiAgICAgICAgICAgICAgICBkdHlwZTogYS5kdHlwZSxcbiAgICAgICAgICAgICAgICBzaGFwZTogYS5zaGFwZSxcbiAgICAgICAgICAgICAgICBieXRlc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEoYSBpbnN0YW5jZW9mIFZhcmlhYmxlKSkge1xuICAgICAgICAgICAgdGhpcy50cmFjayhhKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUcmFjayB0aGUgdGVuc29yIGJ5IGRhdGFJZCBhbmQgaW5jcmVhc2UgdGhlIHJlZkNvdW50IGZvciB0aGUgZGF0YUlkIGluIHRoZVxuICAgIC8vIGJhY2tlbmQuXG4gICAgLy8gVE9ETyhweXUxMDA1NSk6IFRoaXMgaXMgY3VycmVudGx5IHVzZWQgYnkgbWFrZVZhcmlhYmxlIG1ldGhvZCwgdG8gaW5jcmVhc2VcbiAgICAvLyByZWZDb3VudCBvbiB0aGUgYmFja2VuZCBmb3IgdGhlIGRhdGFJZC4gSXQgY2FuIHBvdGVudGlhbGx5IGJlIHJlcGxhY2VkIHdpdGhcbiAgICAvLyBJZGVudGl0eSBvcCBpbmRlYWQgb2YgY2FsbGluZyBiYWNrZW5kIGRpcmVjdGx5LlxuICAgIGluY1JlZihhLCBiYWNrZW5kKSB7XG4gICAgICAgIHRoaXMudHJhY2tUZW5zb3IoYSwgYmFja2VuZCk7XG4gICAgICAgIHRoaXMuYmFja2VuZC5pbmNSZWYoYS5kYXRhSWQpO1xuICAgIH1cbiAgICByZW1vdmVEYXRhSWQoZGF0YUlkLCBiYWNrZW5kKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLnRlbnNvckluZm8uaGFzKGRhdGFJZCkgJiZcbiAgICAgICAgICAgIHRoaXMuc3RhdGUudGVuc29ySW5mby5nZXQoZGF0YUlkKS5iYWNrZW5kID09PSBiYWNrZW5kKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlLnRlbnNvckluZm8uZGVsZXRlKGRhdGFJZCk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlLm51bURhdGFCdWZmZXJzLS07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGlzcG9zZVRlbnNvcihhKSB7XG4gICAgICAgIGlmICghdGhpcy5zdGF0ZS50ZW5zb3JJbmZvLmhhcyhhLmRhdGFJZCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmZvID0gdGhpcy5zdGF0ZS50ZW5zb3JJbmZvLmdldChhLmRhdGFJZCk7XG4gICAgICAgIHRoaXMuc3RhdGUubnVtVGVuc29ycy0tO1xuICAgICAgICBpZiAoYS5kdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUubnVtU3RyaW5nVGVuc29ycy0tO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS5udW1CeXRlcyAtPSBpbmZvLmJ5dGVzO1xuICAgICAgICB9XG4gICAgICAgIC8vIERvbid0IGNvdW50IGJ5dGVzIGZvciBjb21wbGV4IG51bWJlcnMgYXMgdGhleSBhcmUgY291bnRlZCBieSB0aGVpclxuICAgICAgICAvLyBjb21wb25lbnRzLlxuICAgICAgICBpZiAoYS5kdHlwZSAhPT0gJ2NvbXBsZXg2NCcgJiYgYS5kdHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnN0IGJ5dGVzID0gYS5zaXplICogdXRpbC5ieXRlc1BlckVsZW1lbnQoYS5kdHlwZSk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlLm51bUJ5dGVzIC09IGJ5dGVzO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlbW92ZSB0aGUgcmVmZXJlbmNlIHRvIGRhdGFJZCBpZiBiYWNrZW5kIGRpc3Bvc2UgdGhlIGRhdGEgc3VjY2Vzc2Z1bGx5XG4gICAgICAgIGlmIChpbmZvLmJhY2tlbmQuZGlzcG9zZURhdGEoYS5kYXRhSWQpKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZURhdGFJZChhLmRhdGFJZCwgaW5mby5iYWNrZW5kKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPKG5zdGhvcmF0KTogQ29uc3RydWN0IGFuIGVycm9yIGFuZCBzYXZlIHRoZSBzdGFjayB0cmFjZSBmb3JcbiAgICAgICAgLy8gZGVidWdnaW5nIHdoZW4gaW4gZGVidWcgbW9kZS4gQ3JlYXRpbmcgYSBzdGFjayB0cmFjZSBpcyB0b28gZXhwZW5zaXZlXG4gICAgICAgIC8vIHRvIGRvIHVuY29uZGl0aW9uYWxseS5cbiAgICB9XG4gICAgZGlzcG9zZVZhcmlhYmxlcygpIHtcbiAgICAgICAgZm9yIChjb25zdCB2YXJOYW1lIGluIHRoaXMuc3RhdGUucmVnaXN0ZXJlZFZhcmlhYmxlcykge1xuICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMuc3RhdGUucmVnaXN0ZXJlZFZhcmlhYmxlc1t2YXJOYW1lXTtcbiAgICAgICAgICAgIHRoaXMuZGlzcG9zZVZhcmlhYmxlKHYpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2VWYXJpYWJsZSh2KSB7XG4gICAgICAgIHRoaXMuZGlzcG9zZVRlbnNvcih2KTtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUucmVnaXN0ZXJlZFZhcmlhYmxlc1t2Lm5hbWVdICE9IG51bGwpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnN0YXRlLnJlZ2lzdGVyZWRWYXJpYWJsZXNbdi5uYW1lXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBtZW1vcnkoKSB7XG4gICAgICAgIGNvbnN0IGluZm8gPSB0aGlzLmJhY2tlbmQubWVtb3J5KCk7XG4gICAgICAgIGluZm8ubnVtVGVuc29ycyA9IHRoaXMuc3RhdGUubnVtVGVuc29ycztcbiAgICAgICAgaW5mby5udW1EYXRhQnVmZmVycyA9IHRoaXMuc3RhdGUubnVtRGF0YUJ1ZmZlcnM7XG4gICAgICAgIGluZm8ubnVtQnl0ZXMgPSB0aGlzLnN0YXRlLm51bUJ5dGVzO1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5udW1TdHJpbmdUZW5zb3JzID4gMCkge1xuICAgICAgICAgICAgaW5mby51bnJlbGlhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChpbmZvLnJlYXNvbnMgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGluZm8ucmVhc29ucyA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5mby5yZWFzb25zLnB1c2goJ01lbW9yeSB1c2FnZSBieSBzdHJpbmcgdGVuc29ycyBpcyBhcHByb3hpbWF0ZSAnICtcbiAgICAgICAgICAgICAgICAnKDIgYnl0ZXMgcGVyIGNoYXJhY3RlciknKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5mbztcbiAgICB9XG4gICAgYXN5bmMgcHJvZmlsZShxdWVyeSkge1xuICAgICAgICB0aGlzLnN0YXRlLnByb2ZpbGluZyA9IHRydWU7XG4gICAgICAgIGNvbnN0IHN0YXJ0Qnl0ZXMgPSB0aGlzLnN0YXRlLm51bUJ5dGVzO1xuICAgICAgICBjb25zdCBzdGFydE51bVRlbnNvcnMgPSB0aGlzLnN0YXRlLm51bVRlbnNvcnM7XG4gICAgICAgIHRoaXMuc3RhdGUuYWN0aXZlUHJvZmlsZS5rZXJuZWxzID0gW107XG4gICAgICAgIHRoaXMuc3RhdGUuYWN0aXZlUHJvZmlsZS5yZXN1bHQgPSBhd2FpdCBxdWVyeSgpO1xuICAgICAgICB0aGlzLnN0YXRlLnByb2ZpbGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnN0YXRlLmFjdGl2ZVByb2ZpbGUucGVha0J5dGVzID0gTWF0aC5tYXgoLi4udGhpcy5zdGF0ZS5hY3RpdmVQcm9maWxlLmtlcm5lbHMubWFwKGQgPT4gZC50b3RhbEJ5dGVzU25hcHNob3QpKTtcbiAgICAgICAgdGhpcy5zdGF0ZS5hY3RpdmVQcm9maWxlLm5ld0J5dGVzID0gdGhpcy5zdGF0ZS5udW1CeXRlcyAtIHN0YXJ0Qnl0ZXM7XG4gICAgICAgIHRoaXMuc3RhdGUuYWN0aXZlUHJvZmlsZS5uZXdUZW5zb3JzID1cbiAgICAgICAgICAgIHRoaXMuc3RhdGUubnVtVGVuc29ycyAtIHN0YXJ0TnVtVGVuc29ycztcbiAgICAgICAgZm9yIChjb25zdCBrZXJuZWwgb2YgdGhpcy5zdGF0ZS5hY3RpdmVQcm9maWxlLmtlcm5lbHMpIHtcbiAgICAgICAgICAgIGtlcm5lbC5rZXJuZWxUaW1lTXMgPSBhd2FpdCBrZXJuZWwua2VybmVsVGltZU1zO1xuICAgICAgICAgICAga2VybmVsLmV4dHJhSW5mbyA9IGF3YWl0IGtlcm5lbC5leHRyYUluZm87XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuYWN0aXZlUHJvZmlsZTtcbiAgICB9XG4gICAgaXNUYXBlT24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLmdyYWRpZW50RGVwdGggPiAwICYmIHRoaXMuc3RhdGUua2VybmVsRGVwdGggPT09IDA7XG4gICAgfVxuICAgIGFkZFRhcGVOb2RlKGtlcm5lbE5hbWUsIGlucHV0cywgb3V0cHV0cywgZ3JhZGllbnRzRnVuYywgc2F2ZWQsIGF0dHJzKSB7XG4gICAgICAgIGNvbnN0IHRhcGVOb2RlID0geyBpZDogdGhpcy5zdGF0ZS5uZXh0VGFwZU5vZGVJZCsrLCBrZXJuZWxOYW1lLCBpbnB1dHMsIG91dHB1dHMsIHNhdmVkIH07XG4gICAgICAgIGNvbnN0IGdyYWRDb25maWcgPSBnZXRHcmFkaWVudChrZXJuZWxOYW1lKTtcbiAgICAgICAgaWYgKGdyYWRDb25maWcgIT0gbnVsbCkge1xuICAgICAgICAgICAgZ3JhZGllbnRzRnVuYyA9IGdyYWRDb25maWcuZ3JhZEZ1bmM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdyYWRpZW50c0Z1bmMgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGFwZU5vZGUuZ3JhZGllbnQgPSAoZHlzKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETyhzbWlsa292KTogVG8gb3B0aW1pemUgYmFjay1wcm9wLCBwYXNzIGR5cyB0aGF0IGFyZSBub3QgdXNlZCBpblxuICAgICAgICAgICAgICAgIC8vIHRoZSBiYWNrcHJvcCBncmFwaCB0byB0aGUgdXNlciBhcyBudWxsIGluc3RlYWQgb2YgemVyb3NcbiAgICAgICAgICAgICAgICBkeXMgPSBkeXMubWFwKChkeSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZHkgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0ID0gb3V0cHV0c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHMgPSB1dGlsLm1ha2VaZXJvc1R5cGVkQXJyYXkob3V0cHV0LnNpemUsIG91dHB1dC5kdHlwZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tYWtlVGVuc29yKHZhbHMsIG91dHB1dC5zaGFwZSwgb3V0cHV0LmR0eXBlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZHk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gR3JhZCBmdW5jdGlvbnMgb2Ygb3BzIHdpdGggc2luZ2xlIG91dHB1dHMgZXhwZWN0IGEgZHksIHdoaWxlIG9wc1xuICAgICAgICAgICAgICAgIC8vIHdpdGggbXVsdGlwbGUgb3V0cHV0cyBleHBlY3QgZHlzIChhcnJheSBvZiBkeSkuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGdyYWRpZW50c0Z1bmMoZHlzLmxlbmd0aCA+IDEgPyBkeXMgOiBkeXNbMF0sIHNhdmVkLCBhdHRycyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdGUuYWN0aXZlVGFwZS5wdXNoKHRhcGVOb2RlKTtcbiAgICB9XG4gICAga2VlcChyZXN1bHQpIHtcbiAgICAgICAgcmVzdWx0LmtlcHQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBzdGFydFRhcGUoKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmdyYWRpZW50RGVwdGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuYWN0aXZlVGFwZSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdGUuZ3JhZGllbnREZXB0aCsrO1xuICAgIH1cbiAgICBlbmRUYXBlKCkge1xuICAgICAgICB0aGlzLnN0YXRlLmdyYWRpZW50RGVwdGgtLTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RhcnQgYSBzY29wZS4gVXNlIHRoaXMgd2l0aCBlbmRTY29wZSgpIHRvIGFjaGlldmUgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eVxuICAgICAqIGFzIHNjb3BlKCkgd2l0aG91dCB0aGUgbmVlZCBmb3IgYSBmdW5jdGlvbiBjbG9zdXJlLlxuICAgICAqL1xuICAgIHN0YXJ0U2NvcGUobmFtZSkge1xuICAgICAgICBjb25zdCBzY29wZUluZm8gPSB7XG4gICAgICAgICAgICB0cmFjazogW10sXG4gICAgICAgICAgICBuYW1lOiAndW5uYW1lZCBzY29wZScsXG4gICAgICAgICAgICBpZDogdGhpcy5zdGF0ZS5uZXh0U2NvcGVJZCsrXG4gICAgICAgIH07XG4gICAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgICAgICBzY29wZUluZm8ubmFtZSA9IG5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGF0ZS5zY29wZVN0YWNrLnB1c2goc2NvcGVJbmZvKTtcbiAgICAgICAgdGhpcy5zdGF0ZS5hY3RpdmVTY29wZSA9IHNjb3BlSW5mbztcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5kIGEgc2NvcGUuIFVzZSB0aGlzIHdpdGggc3RhcnRTY29wZSgpIHRvIGFjaGlldmUgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eVxuICAgICAqIGFzIHNjb3BlKCkgd2l0aG91dCB0aGUgbmVlZCBmb3IgYSBmdW5jdGlvbiBjbG9zdXJlLlxuICAgICAqL1xuICAgIGVuZFNjb3BlKHJlc3VsdCkge1xuICAgICAgICBjb25zdCB0ZW5zb3JzVG9UcmFja0luUGFyZW50ID0gZ2V0VGVuc29yc0luQ29udGFpbmVyKHJlc3VsdCk7XG4gICAgICAgIGNvbnN0IHRlbnNvcnNUb1RyYWNrSW5QYXJlbnRTZXQgPSBuZXcgU2V0KHRlbnNvcnNUb1RyYWNrSW5QYXJlbnQubWFwKHQgPT4gdC5pZCkpO1xuICAgICAgICAvLyBEaXNwb3NlIHRoZSBhcnJheXMgdHJhY2tlZCBpbiB0aGlzIHNjb3BlLlxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc3RhdGUuYWN0aXZlU2NvcGUudHJhY2subGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHRlbnNvciA9IHRoaXMuc3RhdGUuYWN0aXZlU2NvcGUudHJhY2tbaV07XG4gICAgICAgICAgICBpZiAoIXRlbnNvci5rZXB0ICYmICF0ZW5zb3JzVG9UcmFja0luUGFyZW50U2V0Lmhhcyh0ZW5zb3IuaWQpKSB7XG4gICAgICAgICAgICAgICAgdGVuc29yLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvbGRTY29wZSA9IHRoaXMuc3RhdGUuc2NvcGVTdGFjay5wb3AoKTtcbiAgICAgICAgdGhpcy5zdGF0ZS5hY3RpdmVTY29wZSA9IHRoaXMuc3RhdGUuc2NvcGVTdGFjay5sZW5ndGggPT09IDAgP1xuICAgICAgICAgICAgbnVsbCA6XG4gICAgICAgICAgICB0aGlzLnN0YXRlLnNjb3BlU3RhY2tbdGhpcy5zdGF0ZS5zY29wZVN0YWNrLmxlbmd0aCAtIDFdO1xuICAgICAgICAvLyBUcmFjayB0aGUgY3VycmVudCByZXN1bHQgaW4gdGhlIHBhcmVudCBzY29wZS5cbiAgICAgICAgdGVuc29yc1RvVHJhY2tJblBhcmVudC5mb3JFYWNoKHRlbnNvciA9PiB7XG4gICAgICAgICAgICAvLyBPbmx5IHRyYWNrIHRoZSB0ZW5zb3IgaWYgd2FzIGFsbG9jYXRlZCBpbiB0aGUgaW5uZXIgc2NvcGUgYW5kIGlzIG5vdFxuICAgICAgICAgICAgLy8gZ2xvYmFsbHkga2VwdC5cbiAgICAgICAgICAgIGlmICghdGVuc29yLmtlcHQgJiYgdGVuc29yLnNjb3BlSWQgPT09IG9sZFNjb3BlLmlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmFjayh0ZW5zb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBncmFkaWVudHMgb2YgYGZgIHdpdGggcmVzcGVjdCB0byBlYWNoIG9mIHRoZSBgeHNgLiBUaGUgZ3JhZGllbnRzXG4gICAgICogcmV0dXJuZWQgYXJlIG9mIHRoZSBzYW1lIGxlbmd0aCBhcyBgeHNgLCBidXQgc29tZSBtaWdodCBiZSBudWxsIGlmIGBmYFxuICAgICAqIHdhcyBub3QgYSBmdW5jdGlvbiBvZiB0aGF0IGB4YC4gSXQgYWxzbyB0YWtlcyBvcHRpb25hbCBkeSB0byBtdWx0aXBseSB0aGVcbiAgICAgKiBncmFkaWVudCwgd2hpY2ggZGVmYXVsdHMgdG8gYDFgLlxuICAgICAqL1xuICAgIGdyYWRpZW50cyhmLCB4cywgZHksIGFsbG93Tm9HcmFkaWVudHMgPSBmYWxzZSkge1xuICAgICAgICB1dGlsLmFzc2VydCh4cy5sZW5ndGggPiAwLCAoKSA9PiAnZ3JhZGllbnRzKCkgcmVjZWl2ZWQgYW4gZW1wdHkgbGlzdCBvZiB4cy4nKTtcbiAgICAgICAgaWYgKGR5ICE9IG51bGwgJiYgZHkuZHR5cGUgIT09ICdmbG9hdDMyJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBkeSBtdXN0IGhhdmUgJ2Zsb2F0MzInIGR0eXBlLCBidXQgaGFzICcke2R5LmR0eXBlfSdgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB5ID0gdGhpcy5zY29wZWRSdW4oKCkgPT4gdGhpcy5zdGFydFRhcGUoKSwgKCkgPT4gdGhpcy5lbmRUYXBlKCksICgpID0+IHRoaXMudGlkeSgnZm9yd2FyZCcsIGYpKTtcbiAgICAgICAgdXRpbC5hc3NlcnQoeSBpbnN0YW5jZW9mIFRlbnNvciwgKCkgPT4gJ1RoZSByZXN1bHQgeSByZXR1cm5lZCBieSBmKCkgbXVzdCBiZSBhIHRlbnNvci4nKTtcbiAgICAgICAgLy8gRmlsdGVyIG91dCB0aGUgbm9kZXMgdGhhdCBkb24ndCBjb25uZWN0IHggPT4geS5cbiAgICAgICAgY29uc3QgZmlsdGVyZWRUYXBlID0gZ2V0RmlsdGVyZWROb2Rlc1hUb1kodGhpcy5zdGF0ZS5hY3RpdmVUYXBlLCB4cywgeSk7XG4gICAgICAgIGlmICghYWxsb3dOb0dyYWRpZW50cyAmJiBmaWx0ZXJlZFRhcGUubGVuZ3RoID09PSAwICYmIHhzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNvbXB1dGUgZ3JhZGllbnQgb2YgeT1mKHgpIHdpdGggcmVzcGVjdCB0byB4LiBNYWtlIHN1cmUgJyArXG4gICAgICAgICAgICAgICAgJ3RoYXQgdGhlIGYgeW91IHBhc3NlZCBlbmNsb3NlcyBhbGwgb3BlcmF0aW9ucyB0aGF0IGxlYWQgZnJvbSB4ICcgK1xuICAgICAgICAgICAgICAgICd0byB5LicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnRpZHkoJ2JhY2t3YXJkJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYWNjdW11bGF0ZWRHcmFkaWVudE1hcCA9IHt9O1xuICAgICAgICAgICAgYWNjdW11bGF0ZWRHcmFkaWVudE1hcFt5LmlkXSA9IChkeSA9PSBudWxsKSA/IG9uZXMoeS5zaGFwZSkgOiBkeTtcbiAgICAgICAgICAgIC8vIEJhY2twcm9wIGdyYWRpZW50cyB0aHJvdWdoIHRoZSBmaWx0ZXJlZCBub2Rlcy5cbiAgICAgICAgICAgIGJhY2twcm9wYWdhdGVHcmFkaWVudHMoYWNjdW11bGF0ZWRHcmFkaWVudE1hcCwgZmlsdGVyZWRUYXBlLCBcbiAgICAgICAgICAgIC8vIFBhc3MgdGhlIHRpZHkgZnVuY3Rpb24gdG8gYXZvaWQgY2lyY3VsYXIgZGVwIHdpdGggYHRhcGUudHNgLlxuICAgICAgICAgICAgZiA9PiB0aGlzLnRpZHkoZiksIFxuICAgICAgICAgICAgLy8gUGFzcyBhbiBhZGQgZnVuY3Rpb24gdG8gYXZvaWRlIGEgY2lyY3VsYXIgZGVwIHdpdGggYHRhcGUudHNgLlxuICAgICAgICAgICAgYWRkKTtcbiAgICAgICAgICAgIGNvbnN0IGdyYWRzID0geHMubWFwKHggPT4gYWNjdW11bGF0ZWRHcmFkaWVudE1hcFt4LmlkXSk7XG4gICAgICAgICAgICBpZiAodGhpcy5zdGF0ZS5ncmFkaWVudERlcHRoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBtZWFucyB0aGF0IHdlIGFyZSBub3QgY29tcHV0aW5nIGhpZ2hlci1vcmRlciBncmFkaWVudHNcbiAgICAgICAgICAgICAgICAvLyBhbmQgY2FuIGNsZWFuIHVwIHRoZSB0YXBlLlxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUuYWN0aXZlVGFwZS5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRlbnNvciBvZiBub2RlLnNhdmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW5zb3IuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5hY3RpdmVUYXBlID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB5LCBncmFkcyB9O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgY3VzdG9tR3JhZChmKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNGdW5jdGlvbihmKSwgKCkgPT4gJ1RoZSBmIHBhc3NlZCBpbiBjdXN0b21HcmFkKGYpIG11c3QgYmUgYSBmdW5jdGlvbi4nKTtcbiAgICAgICAgcmV0dXJuICguLi5pbnB1dHMpID0+IHtcbiAgICAgICAgICAgIHV0aWwuYXNzZXJ0KGlucHV0cy5ldmVyeSh0ID0+IHQgaW5zdGFuY2VvZiBUZW5zb3IpLCAoKSA9PiAnVGhlIGFyZ3MgcGFzc2VkIGluIGN1c3RvbUdyYWQoZikoeDEsIHgyLC4uLikgbXVzdCBhbGwgYmUgJyArXG4gICAgICAgICAgICAgICAgJ3RlbnNvcnMnKTtcbiAgICAgICAgICAgIGxldCByZXM7XG4gICAgICAgICAgICBjb25zdCBpbnB1dE1hcCA9IHt9O1xuICAgICAgICAgICAgaW5wdXRzLmZvckVhY2goKGlucHV0LCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgaW5wdXRNYXBbaV0gPSBpbnB1dDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgZm9yd2FyZEZ1bmMgPSAoXywgc2F2ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJlcyA9IGYoLi4uWy4uLmlucHV0cywgc2F2ZV0pO1xuICAgICAgICAgICAgICAgIHV0aWwuYXNzZXJ0KHJlcy52YWx1ZSBpbnN0YW5jZW9mIFRlbnNvciwgKCkgPT4gJ1RoZSBmdW5jdGlvbiBmIHBhc3NlZCBpbiBjdXN0b21HcmFkKGYpIG11c3QgcmV0dXJuIGFuICcgK1xuICAgICAgICAgICAgICAgICAgICAnb2JqZWN0IHdoZXJlIGBvYmoudmFsdWVgIGlzIGEgdGVuc29yJyk7XG4gICAgICAgICAgICAgICAgdXRpbC5hc3NlcnQodXRpbC5pc0Z1bmN0aW9uKHJlcy5ncmFkRnVuYyksICgpID0+ICdUaGUgZnVuY3Rpb24gZiBwYXNzZWQgaW4gY3VzdG9tR3JhZChmKSBtdXN0IHJldHVybiBhbiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ29iamVjdCB3aGVyZSBgb2JqLmdyYWRGdW5jYCBpcyBhIGZ1bmN0aW9uLicpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXMudmFsdWU7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgYmFja3dhcmRzRnVuYyA9IChkeSwgc2F2ZWQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBncmFkUmVzID0gcmVzLmdyYWRGdW5jKGR5LCBzYXZlZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JhZHMgPSBBcnJheS5pc0FycmF5KGdyYWRSZXMpID8gZ3JhZFJlcyA6IFtncmFkUmVzXTtcbiAgICAgICAgICAgICAgICB1dGlsLmFzc2VydChncmFkcy5sZW5ndGggPT09IGlucHV0cy5sZW5ndGgsICgpID0+ICdUaGUgZnVuY3Rpb24gZiBwYXNzZWQgaW4gY3VzdG9tR3JhZChmKSBtdXN0IHJldHVybiBhbiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ29iamVjdCB3aGVyZSBgb2JqLmdyYWRGdW5jYCBpcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyAnICtcbiAgICAgICAgICAgICAgICAgICAgJ3RoZSBzYW1lIG51bWJlciBvZiB0ZW5zb3JzIGFzIGlucHV0cyBwYXNzZWQgdG8gZiguLi4pLicpO1xuICAgICAgICAgICAgICAgIHV0aWwuYXNzZXJ0KGdyYWRzLmV2ZXJ5KHQgPT4gdCBpbnN0YW5jZW9mIFRlbnNvciksICgpID0+ICdUaGUgZnVuY3Rpb24gZiBwYXNzZWQgaW4gY3VzdG9tR3JhZChmKSBtdXN0IHJldHVybiBhbiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ29iamVjdCB3aGVyZSBgb2JqLmdyYWRGdW5jYCBpcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyAnICtcbiAgICAgICAgICAgICAgICAgICAgJ2EgbGlzdCBvZiBvbmx5IHRlbnNvcnMuJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JhZE1hcCA9IHt9O1xuICAgICAgICAgICAgICAgIGdyYWRzLmZvckVhY2goKGdyYWQsIGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZ3JhZE1hcFtpXSA9ICgpID0+IGdyYWQ7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdyYWRNYXA7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucnVuS2VybmVsRnVuYyh7XG4gICAgICAgICAgICAgICAgZm9yd2FyZEZ1bmMsXG4gICAgICAgICAgICAgICAgYmFja3dhcmRzRnVuYyxcbiAgICAgICAgICAgICAgICBpbnB1dHM6IGlucHV0TWFwLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJlYWRTeW5jKGRhdGFJZCkge1xuICAgICAgICAvLyBSb3V0ZSB0aGUgcmVhZCB0byB0aGUgY29ycmVjdCBiYWNrZW5kLlxuICAgICAgICBjb25zdCBpbmZvID0gdGhpcy5zdGF0ZS50ZW5zb3JJbmZvLmdldChkYXRhSWQpO1xuICAgICAgICByZXR1cm4gaW5mby5iYWNrZW5kLnJlYWRTeW5jKGRhdGFJZCk7XG4gICAgfVxuICAgIHJlYWQoZGF0YUlkKSB7XG4gICAgICAgIC8vIFJvdXRlIHRoZSByZWFkIHRvIHRoZSBjb3JyZWN0IGJhY2tlbmQuXG4gICAgICAgIGNvbnN0IGluZm8gPSB0aGlzLnN0YXRlLnRlbnNvckluZm8uZ2V0KGRhdGFJZCk7XG4gICAgICAgIHJldHVybiBpbmZvLmJhY2tlbmQucmVhZChkYXRhSWQpO1xuICAgIH1cbiAgICBhc3luYyB0aW1lKHF1ZXJ5KSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gbm93KCk7XG4gICAgICAgIGNvbnN0IHRpbWluZ0luZm8gPSBhd2FpdCB0aGlzLmJhY2tlbmQudGltZShxdWVyeSk7XG4gICAgICAgIHRpbWluZ0luZm8ud2FsbE1zID0gbm93KCkgLSBzdGFydDtcbiAgICAgICAgcmV0dXJuIHRpbWluZ0luZm87XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRyYWNrcyBhIFRlbnNvciBpbiB0aGUgY3VycmVudCBzY29wZSB0byBiZSBhdXRvbWF0aWNhbGx5IGNsZWFuZWQgdXBcbiAgICAgKiB3aGVuIHRoZSBjdXJyZW50IHNjb3BlIGVuZHMsIGFuZCByZXR1cm5zIHRoZSB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXN1bHQgVGhlIFRlbnNvciB0byB0cmFjayBpbiB0aGUgY3VycmVudCBzY29wZS5cbiAgICAgKi9cbiAgICB0cmFjayhyZXN1bHQpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuYWN0aXZlU2NvcGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0LnNjb3BlSWQgPSB0aGlzLnN0YXRlLmFjdGl2ZVNjb3BlLmlkO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS5hY3RpdmVTY29wZS50cmFjay5wdXNoKHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZ2V0IHJlZ2lzdGVyZWRWYXJpYWJsZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLnJlZ2lzdGVyZWRWYXJpYWJsZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgZW5naW5lIHN0YXRlLiBSZW1vdmVzIGFsbCBiYWNrZW5kcyBidXQgZG9lcyBub3QgcmVtb3ZlXG4gICAgICogcmVnaXN0ZXJlZCBiYWNrZW5kIGZhY3Rvcmllcy5cbiAgICAgKi9cbiAgICByZXNldCgpIHtcbiAgICAgICAgLy8gTWFrZSBhbnkgcGVuZGluZyBwcm9taXNlIG9ic29sZXRlLlxuICAgICAgICB0aGlzLnBlbmRpbmdCYWNrZW5kSW5pdElkKys7XG4gICAgICAgIHRoaXMuc3RhdGUuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLkVOVi5yZXNldCgpO1xuICAgICAgICB0aGlzLnN0YXRlID0gbmV3IEVuZ2luZVN0YXRlKCk7XG4gICAgICAgIGZvciAoY29uc3QgYmFja2VuZE5hbWUgaW4gdGhpcy5yZWdpc3RyeSkge1xuICAgICAgICAgICAgdGhpcy5kaXNwb3NlUmVnaXN0ZXJlZEtlcm5lbHMoYmFja2VuZE5hbWUpO1xuICAgICAgICAgICAgdGhpcy5yZWdpc3RyeVtiYWNrZW5kTmFtZV0uZGlzcG9zZSgpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMucmVnaXN0cnlbYmFja2VuZE5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYmFja2VuZE5hbWUgPSBudWxsO1xuICAgICAgICB0aGlzLmJhY2tlbmRJbnN0YW5jZSA9IG51bGw7XG4gICAgICAgIHRoaXMucGVuZGluZ0JhY2tlbmRJbml0ID0gbnVsbDtcbiAgICB9XG59XG5FbmdpbmUubmV4dFRlbnNvcklkID0gMDtcbkVuZ2luZS5uZXh0VmFyaWFibGVJZCA9IDA7XG5mdW5jdGlvbiBvbmVzKHNoYXBlKSB7XG4gICAgY29uc3QgdmFsdWVzID0gbWFrZU9uZXNUeXBlZEFycmF5KHNpemVGcm9tU2hhcGUoc2hhcGUpLCAnZmxvYXQzMicpO1xuICAgIHJldHVybiBFTkdJTkUubWFrZVRlbnNvcih2YWx1ZXMsIHNoYXBlLCAnZmxvYXQzMicpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldE9yTWFrZUVuZ2luZSgpIHtcbiAgICBjb25zdCBucyA9IGdldEdsb2JhbE5hbWVzcGFjZSgpO1xuICAgIGlmIChucy5fdGZlbmdpbmUgPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBlbnZpcm9ubWVudCA9IG5ldyBFbnZpcm9ubWVudChucyk7XG4gICAgICAgIG5zLl90ZmVuZ2luZSA9IG5ldyBFbmdpbmUoZW52aXJvbm1lbnQpO1xuICAgIH1cbiAgICBzZXRFbnZpcm9ubWVudEdsb2JhbChucy5fdGZlbmdpbmUuRU5WKTtcbiAgICAvLyBUZWxsIHRoZSBjdXJyZW50IHRlbnNvciBpbnRlcmZhY2UgdGhhdCB0aGUgZ2xvYmFsIGVuZ2luZSBpcyByZXNwb25zaWJsZVxuICAgIC8vIGZvciB0cmFja2luZy5cbiAgICBzZXRUZW5zb3JUcmFja2VyKCgpID0+IG5zLl90ZmVuZ2luZSk7XG4gICAgcmV0dXJuIG5zLl90ZmVuZ2luZTtcbn1cbmV4cG9ydCBjb25zdCBFTkdJTkUgPSBnZXRPck1ha2VFbmdpbmUoKTtcbi8qKlxuICogQSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYWRkIG9wIGZvciB1c2Ugd2l0aGluIGVuZ2luZSBhbmQgdGFwZS5cbiAqXG4gKiBUaGlzIGFsbG93cyB1cyB0byBhdm9pZCBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgYmV0d2VlbiBhZGQudHMgYW5kIGVuZ2luZS5cbiAqIEl0IGlzIGV4cG9ydGVkIHRvIGJlIGF2YWlsYWJsZSBpbiB0YXBlIHRlc3RzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkKGEsIGIpIHtcbiAgICAvLyBXZSBkdXBsaWNhdGUgQWRkIGhlcmUgdG8gYXZvaWQgYSBjaXJjdWxhciBkZXBlbmRlbmN5IHdpdGggYWRkLnRzLlxuICAgIGNvbnN0IGlucHV0cyA9IHsgYSwgYiB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEFkZCwgaW5wdXRzKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVuZ2luZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBpc1Byb21pc2UgfSBmcm9tICcuL3V0aWxfYmFzZSc7XG4vLyBFeHBlY3RzIGZsYWdzIGZyb20gVVJMIGluIHRoZSBmb3JtYXQgP3RmanNmbGFncz1GTEFHMToxLEZMQUcyOnRydWUuXG5jb25zdCBURU5TT1JGTE9XSlNfRkxBR1NfUFJFRklYID0gJ3RmanNmbGFncyc7XG4vKipcbiAqIFRoZSBlbnZpcm9ubWVudCBjb250YWlucyBldmFsdWF0ZWQgZmxhZ3MgYXMgd2VsbCBhcyB0aGUgcmVnaXN0ZXJlZCBwbGF0Zm9ybS5cbiAqIFRoaXMgaXMgYWx3YXlzIHVzZWQgYXMgYSBnbG9iYWwgc2luZ2xldG9uIGFuZCBjYW4gYmUgcmV0cmlldmVkIHdpdGhcbiAqIGB0Zi5lbnYoKWAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0Vudmlyb25tZW50J31cbiAqL1xuZXhwb3J0IGNsYXNzIEVudmlyb25tZW50IHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWFueVxuICAgIGNvbnN0cnVjdG9yKGdsb2JhbCkge1xuICAgICAgICB0aGlzLmdsb2JhbCA9IGdsb2JhbDtcbiAgICAgICAgdGhpcy5mbGFncyA9IHt9O1xuICAgICAgICB0aGlzLmZsYWdSZWdpc3RyeSA9IHt9O1xuICAgICAgICB0aGlzLnVybEZsYWdzID0ge307XG4gICAgICAgIC8vIEphc21pbmUgc3BpZXMgb24gdGhpcyBpbiAnZW52aXJvbm1lbnRfdGVzdC50cydcbiAgICAgICAgdGhpcy5nZXRRdWVyeVBhcmFtcyA9IGdldFF1ZXJ5UGFyYW1zO1xuICAgICAgICB0aGlzLnBvcHVsYXRlVVJMRmxhZ3MoKTtcbiAgICB9XG4gICAgc2V0UGxhdGZvcm0ocGxhdGZvcm1OYW1lLCBwbGF0Zm9ybSkge1xuICAgICAgICBpZiAodGhpcy5wbGF0Zm9ybSAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFBsYXRmb3JtICR7dGhpcy5wbGF0Zm9ybU5hbWV9IGhhcyBhbHJlYWR5IGJlZW4gc2V0LiBgICtcbiAgICAgICAgICAgICAgICBgT3ZlcndyaXRpbmcgdGhlIHBsYXRmb3JtIHdpdGggJHtwbGF0Zm9ybX0uYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wbGF0Zm9ybU5hbWUgPSBwbGF0Zm9ybU5hbWU7XG4gICAgICAgIHRoaXMucGxhdGZvcm0gPSBwbGF0Zm9ybTtcbiAgICB9XG4gICAgcmVnaXN0ZXJGbGFnKGZsYWdOYW1lLCBldmFsdWF0aW9uRm4sIHNldEhvb2spIHtcbiAgICAgICAgdGhpcy5mbGFnUmVnaXN0cnlbZmxhZ05hbWVdID0geyBldmFsdWF0aW9uRm4sIHNldEhvb2sgfTtcbiAgICAgICAgLy8gT3ZlcnJpZGUgdGhlIGZsYWcgdmFsdWUgZnJvbSB0aGUgVVJMLiBUaGlzIGhhcyB0byBoYXBwZW4gaGVyZSBiZWNhdXNlIHRoZVxuICAgICAgICAvLyBlbnZpcm9ubWVudCBpcyBpbml0aWFsaXplZCBiZWZvcmUgZmxhZ3MgZ2V0IHJlZ2lzdGVyZWQuXG4gICAgICAgIGlmICh0aGlzLnVybEZsYWdzW2ZsYWdOYW1lXSAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBmbGFnVmFsdWUgPSB0aGlzLnVybEZsYWdzW2ZsYWdOYW1lXTtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgU2V0dGluZyBmZWF0dXJlIG92ZXJyaWRlIGZyb20gVVJMICR7ZmxhZ05hbWV9OiAke2ZsYWdWYWx1ZX0uYCk7XG4gICAgICAgICAgICB0aGlzLnNldChmbGFnTmFtZSwgZmxhZ1ZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBnZXRBc3luYyhmbGFnTmFtZSkge1xuICAgICAgICBpZiAoZmxhZ05hbWUgaW4gdGhpcy5mbGFncykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmxhZ3NbZmxhZ05hbWVdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmxhZ3NbZmxhZ05hbWVdID0gYXdhaXQgdGhpcy5ldmFsdWF0ZUZsYWcoZmxhZ05hbWUpO1xuICAgICAgICByZXR1cm4gdGhpcy5mbGFnc1tmbGFnTmFtZV07XG4gICAgfVxuICAgIGdldChmbGFnTmFtZSkge1xuICAgICAgICBpZiAoZmxhZ05hbWUgaW4gdGhpcy5mbGFncykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmxhZ3NbZmxhZ05hbWVdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZsYWdWYWx1ZSA9IHRoaXMuZXZhbHVhdGVGbGFnKGZsYWdOYW1lKTtcbiAgICAgICAgaWYgKGlzUHJvbWlzZShmbGFnVmFsdWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZsYWcgJHtmbGFnTmFtZX0gY2Fubm90IGJlIHN5bmNocm9ub3VzbHkgZXZhbHVhdGVkLiBgICtcbiAgICAgICAgICAgICAgICBgUGxlYXNlIHVzZSBnZXRBc3luYygpIGluc3RlYWQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mbGFnc1tmbGFnTmFtZV0gPSBmbGFnVmFsdWU7XG4gICAgICAgIHJldHVybiB0aGlzLmZsYWdzW2ZsYWdOYW1lXTtcbiAgICB9XG4gICAgZ2V0TnVtYmVyKGZsYWdOYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldChmbGFnTmFtZSk7XG4gICAgfVxuICAgIGdldEJvb2woZmxhZ05hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KGZsYWdOYW1lKTtcbiAgICB9XG4gICAgZ2V0RmxhZ3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZsYWdzO1xuICAgIH1cbiAgICAvLyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG4gICAgZ2V0IGZlYXR1cmVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mbGFncztcbiAgICB9XG4gICAgc2V0KGZsYWdOYW1lLCB2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5mbGFnUmVnaXN0cnlbZmxhZ05hbWVdID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHNldCBmbGFnICR7ZmxhZ05hbWV9IGFzIGl0IGhhcyBub3QgYmVlbiByZWdpc3RlcmVkLmApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmxhZ3NbZmxhZ05hbWVdID0gdmFsdWU7XG4gICAgICAgIGlmICh0aGlzLmZsYWdSZWdpc3RyeVtmbGFnTmFtZV0uc2V0SG9vayAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmZsYWdSZWdpc3RyeVtmbGFnTmFtZV0uc2V0SG9vayh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZXZhbHVhdGVGbGFnKGZsYWdOYW1lKSB7XG4gICAgICAgIGlmICh0aGlzLmZsYWdSZWdpc3RyeVtmbGFnTmFtZV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZXZhbHVhdGUgZmxhZyAnJHtmbGFnTmFtZX0nOiBubyBldmFsdWF0aW9uIGZ1bmN0aW9uIGZvdW5kLmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmZsYWdSZWdpc3RyeVtmbGFnTmFtZV0uZXZhbHVhdGlvbkZuKCk7XG4gICAgfVxuICAgIHNldEZsYWdzKGZsYWdzKSB7XG4gICAgICAgIHRoaXMuZmxhZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBmbGFncyk7XG4gICAgfVxuICAgIHJlc2V0KCkge1xuICAgICAgICB0aGlzLmZsYWdzID0ge307XG4gICAgICAgIHRoaXMudXJsRmxhZ3MgPSB7fTtcbiAgICAgICAgdGhpcy5wb3B1bGF0ZVVSTEZsYWdzKCk7XG4gICAgfVxuICAgIHBvcHVsYXRlVVJMRmxhZ3MoKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5nbG9iYWwgPT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5nbG9iYWwubG9jYXRpb24gPT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5nbG9iYWwubG9jYXRpb24uc2VhcmNoID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVybFBhcmFtcyA9IHRoaXMuZ2V0UXVlcnlQYXJhbXModGhpcy5nbG9iYWwubG9jYXRpb24uc2VhcmNoKTtcbiAgICAgICAgaWYgKFRFTlNPUkZMT1dKU19GTEFHU19QUkVGSVggaW4gdXJsUGFyYW1zKSB7XG4gICAgICAgICAgICBjb25zdCBrZXlWYWx1ZXMgPSB1cmxQYXJhbXNbVEVOU09SRkxPV0pTX0ZMQUdTX1BSRUZJWF0uc3BsaXQoJywnKTtcbiAgICAgICAgICAgIGtleVZhbHVlcy5mb3JFYWNoKGtleVZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBrZXlWYWx1ZS5zcGxpdCgnOicpO1xuICAgICAgICAgICAgICAgIHRoaXMudXJsRmxhZ3Nba2V5XSA9IHBhcnNlVmFsdWUoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRRdWVyeVBhcmFtcyhxdWVyeVN0cmluZykge1xuICAgIGNvbnN0IHBhcmFtcyA9IHt9O1xuICAgIHF1ZXJ5U3RyaW5nLnJlcGxhY2UoL1s/Jl0oW149PyZdKykoPzo9KFteJl0qKSk/L2csIChzLCAuLi50KSA9PiB7XG4gICAgICAgIGRlY29kZVBhcmFtKHBhcmFtcywgdFswXSwgdFsxXSk7XG4gICAgICAgIHJldHVybiB0LmpvaW4oJz0nKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcGFyYW1zO1xufVxuZnVuY3Rpb24gZGVjb2RlUGFyYW0ocGFyYW1zLCBuYW1lLCB2YWx1ZSkge1xuICAgIHBhcmFtc1tkZWNvZGVVUklDb21wb25lbnQobmFtZSldID0gZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlIHx8ICcnKTtcbn1cbmZ1bmN0aW9uIHBhcnNlVmFsdWUoZmxhZ05hbWUsIHZhbHVlKSB7XG4gICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICh2YWx1ZSA9PT0gJ3RydWUnIHx8IHZhbHVlID09PSAnZmFsc2UnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gJ3RydWUnO1xuICAgIH1cbiAgICBlbHNlIGlmIChgJHsrdmFsdWV9YCA9PT0gdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuICt2YWx1ZTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgcGFyc2UgdmFsdWUgZmxhZyB2YWx1ZSAke3ZhbHVlfSBmb3IgZmxhZyAke2ZsYWdOYW1lfS5gKTtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgY3VycmVudCBlbnZpcm9ubWVudCAoYSBnbG9iYWwgc2luZ2xldG9uKS5cbiAqXG4gKiBUaGUgZW52aXJvbm1lbnQgb2JqZWN0IGNvbnRhaW5zIHRoZSBldmFsdWF0ZWQgZmVhdHVyZSB2YWx1ZXMgYXMgd2VsbCBhcyB0aGVcbiAqIGFjdGl2ZSBwbGF0Zm9ybS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnRW52aXJvbm1lbnQnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZW52KCkge1xuICAgIHJldHVybiBFTlY7XG59XG5leHBvcnQgbGV0IEVOViA9IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gc2V0RW52aXJvbm1lbnRHbG9iYWwoZW52aXJvbm1lbnQpIHtcbiAgICBFTlYgPSBlbnZpcm9ubWVudDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVudmlyb25tZW50LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCAnLi9lbmdpbmUnO1xuaW1wb3J0ICogYXMgZGV2aWNlX3V0aWwgZnJvbSAnLi9kZXZpY2VfdXRpbCc7XG5pbXBvcnQgeyBlbnYgfSBmcm9tICcuL2Vudmlyb25tZW50JztcbmNvbnN0IEVOViA9IGVudigpO1xuLyoqXG4gKiBUaGlzIGZpbGUgY29udGFpbnMgZW52aXJvbm1lbnQtcmVsYXRlZCBmbGFnIHJlZ2lzdHJhdGlvbnMuXG4gKi9cbi8qKiBXaGV0aGVyIHRvIGVuYWJsZSBkZWJ1ZyBtb2RlLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnREVCVUcnLCAoKSA9PiBmYWxzZSwgZGVidWdWYWx1ZSA9PiB7XG4gICAgaWYgKGRlYnVnVmFsdWUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdEZWJ1Z2dpbmcgbW9kZSBpcyBPTi4gVGhlIG91dHB1dCBvZiBldmVyeSBtYXRoIGNhbGwgd2lsbCAnICtcbiAgICAgICAgICAgICdiZSBkb3dubG9hZGVkIHRvIENQVSBhbmQgY2hlY2tlZCBmb3IgTmFOcy4gJyArXG4gICAgICAgICAgICAnVGhpcyBzaWduaWZpY2FudGx5IGltcGFjdHMgcGVyZm9ybWFuY2UuJyk7XG4gICAgfVxufSk7XG4vKiogV2hldGhlciB3ZSBhcmUgaW4gYSBicm93c2VyIChhcyB2ZXJzdXMsIHNheSwgbm9kZS5qcykgZW52aXJvbm1lbnQuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdJU19CUk9XU0VSJywgKCkgPT4gZGV2aWNlX3V0aWwuaXNCcm93c2VyKCkpO1xuLyoqIFdoZXRoZXIgd2UgYXJlIGluIGEgYnJvd3NlciAoYXMgdmVyc3VzLCBzYXksIG5vZGUuanMpIGVudmlyb25tZW50LiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnSVNfTk9ERScsICgpID0+ICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcpICYmXG4gICAgKHR5cGVvZiBwcm9jZXNzLnZlcnNpb25zICE9PSAndW5kZWZpbmVkJykgJiZcbiAgICAodHlwZW9mIHByb2Nlc3MudmVyc2lvbnMubm9kZSAhPT0gJ3VuZGVmaW5lZCcpKTtcbi8qKiBXaGV0aGVyIHRoaXMgYnJvd3NlciBpcyBDaHJvbWUuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdJU19DSFJPTUUnLCAoKSA9PiB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IgIT0gbnVsbCAmJlxuICAgIG5hdmlnYXRvci51c2VyQWdlbnQgIT0gbnVsbCAmJiAvQ2hyb21lLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpICYmXG4gICAgL0dvb2dsZSBJbmMvLnRlc3QobmF2aWdhdG9yLnZlbmRvcikpO1xuLyoqXG4gKiBUcnVlIHdoZW4gdGhlIGVudmlyb25tZW50IGlzIFwicHJvZHVjdGlvblwiIHdoZXJlIHdlIGRpc2FibGUgc2FmZXR5IGNoZWNrc1xuICogdG8gZ2FpbiBwZXJmb3JtYW5jZS5cbiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnUFJPRCcsICgpID0+IGZhbHNlKTtcbi8qKlxuICogV2hldGhlciB0byBkbyBzYW5pdHkgY2hlY2tzIHdoZW4gaW5mZXJyaW5nIGEgc2hhcGUgZnJvbSB1c2VyLXByb3ZpZGVkXG4gKiB2YWx1ZXMsIHVzZWQgd2hlbiBjcmVhdGluZyBhIG5ldyB0ZW5zb3IuXG4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1RFTlNPUkxJS0VfQ0hFQ0tfU0hBUEVfQ09OU0lTVEVOQ1knLCAoKSA9PiBFTlYuZ2V0Qm9vbCgnREVCVUcnKSk7XG4vKiogV2hldGhlciBkZXByZWNhdGlvbiB3YXJuaW5ncyBhcmUgZW5hYmxlZC4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ0RFUFJFQ0FUSU9OX1dBUk5JTkdTX0VOQUJMRUQnLCAoKSA9PiB0cnVlKTtcbi8qKiBUcnVlIGlmIHJ1bm5pbmcgdW5pdCB0ZXN0cy4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ0lTX1RFU1QnLCAoKSA9PiBmYWxzZSk7XG4vKiogV2hldGhlciB0byBjaGVjayBjb21wdXRhdGlvbiByZXN1bHQgZm9yIGVycm9ycy4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ0NIRUNLX0NPTVBVVEFUSU9OX0ZPUl9FUlJPUlMnLCAoKSA9PiB0cnVlKTtcbi8qKiBXaGV0aGVyIHRoZSBiYWNrZW5kIG5lZWRzIHRvIHdyYXAgaW5wdXQgdG8gaW1hZ2VCaXRtYXAuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdXUkFQX1RPX0lNQUdFQklUTUFQJywgKCkgPT4gZmFsc2UpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmxhZ3MuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLy8gTm90ZSB0aGF0IHRoZSBpZGVudGlmaWVyIGdsb2JhbE5hbWVTcGFjZSBpcyBzY29wZWQgdG8gdGhpcyBtb2R1bGUsIGJ1dCB3aWxsXG4vLyBhbHdheXMgcmVzb2x2ZSB0byB0aGUgc2FtZSBnbG9iYWwgb2JqZWN0IHJlZ2FyZGxlc3Mgb2YgaG93IHRoZSBtb2R1bGUgaXNcbi8vIHJlc29sdmVkLlxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxubGV0IGdsb2JhbE5hbWVTcGFjZTtcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbmV4cG9ydCBmdW5jdGlvbiBnZXRHbG9iYWxOYW1lc3BhY2UoKSB7XG4gICAgaWYgKGdsb2JhbE5hbWVTcGFjZSA9PSBudWxsKSB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICAgICAgbGV0IG5zO1xuICAgICAgICBpZiAodHlwZW9mICh3aW5kb3cpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgbnMgPSB3aW5kb3c7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIChnbG9iYWwpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgbnMgPSBnbG9iYWw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIChwcm9jZXNzKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIG5zID0gcHJvY2VzcztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgKHNlbGYpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgbnMgPSBzZWxmO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCBhIGdsb2JhbCBvYmplY3QnKTtcbiAgICAgICAgfVxuICAgICAgICBnbG9iYWxOYW1lU3BhY2UgPSBucztcbiAgICB9XG4gICAgcmV0dXJuIGdsb2JhbE5hbWVTcGFjZTtcbn1cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbmZ1bmN0aW9uIGdldEdsb2JhbE1hcCgpIHtcbiAgICBjb25zdCBucyA9IGdldEdsb2JhbE5hbWVzcGFjZSgpO1xuICAgIGlmIChucy5fdGZHbG9iYWxzID09IG51bGwpIHtcbiAgICAgICAgbnMuX3RmR2xvYmFscyA9IG5ldyBNYXAoKTtcbiAgICB9XG4gICAgcmV0dXJuIG5zLl90Zkdsb2JhbHM7XG59XG4vKipcbiAqIFJldHVybnMgYSBnbG9iYWxseSBhY2Nlc3NpYmxlICdzaW5nbGV0b24nIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ga2V5IHRoZSBuYW1lIG9mIHRoZSBvYmplY3RcbiAqIEBwYXJhbSBpbml0IGEgZnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSB0byBpbml0aWFsaXplIHRoaXMgb2JqZWN0XG4gKiAgICAgICAgICAgICB0aGUgZmlyc3QgdGltZSBpdCBpcyBmZXRjaGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2xvYmFsKGtleSwgaW5pdCkge1xuICAgIGNvbnN0IGdsb2JhbE1hcCA9IGdldEdsb2JhbE1hcCgpO1xuICAgIGlmIChnbG9iYWxNYXAuaGFzKGtleSkpIHtcbiAgICAgICAgcmV0dXJuIGdsb2JhbE1hcC5nZXQoa2V5KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IHNpbmdsZXRvbiA9IGluaXQoKTtcbiAgICAgICAgZ2xvYmFsTWFwLnNldChrZXksIHNpbmdsZXRvbik7XG4gICAgICAgIHJldHVybiBnbG9iYWxNYXAuZ2V0KGtleSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2xvYmFsX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi9lbmdpbmUnO1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBzZXREZXByZWNhdGlvbldhcm5pbmdGbiB9IGZyb20gJy4vdGVuc29yJztcbmltcG9ydCB7IGdldFRlbnNvcnNJbkNvbnRhaW5lciB9IGZyb20gJy4vdGVuc29yX3V0aWwnO1xuLyoqXG4gKiBFbmFibGVzIHByb2R1Y3Rpb24gbW9kZSB3aGljaCBkaXNhYmxlcyBjb3JyZWN0bmVzcyBjaGVja3MgaW4gZmF2b3Igb2ZcbiAqIHBlcmZvcm1hbmNlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdFbnZpcm9ubWVudCd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmFibGVQcm9kTW9kZSgpIHtcbiAgICBlbnYoKS5zZXQoJ1BST0QnLCB0cnVlKTtcbn1cbi8qKlxuICogRW5hYmxlcyBkZWJ1ZyBtb2RlIHdoaWNoIHdpbGwgbG9nIGluZm9ybWF0aW9uIGFib3V0IGFsbCBleGVjdXRlZCBrZXJuZWxzOlxuICogdGhlIGVsYXBzZWQgdGltZSBvZiB0aGUga2VybmVsIGV4ZWN1dGlvbiwgYXMgd2VsbCBhcyB0aGUgcmFuaywgc2hhcGUsIGFuZFxuICogc2l6ZSBvZiB0aGUgb3V0cHV0IHRlbnNvci5cbiAqXG4gKiBEZWJ1ZyBtb2RlIHdpbGwgc2lnbmlmaWNhbnRseSBzbG93IGRvd24geW91ciBhcHBsaWNhdGlvbiBhcyBpdCB3aWxsXG4gKiBkb3dubG9hZCB0aGUgcmVzdWx0IG9mIGV2ZXJ5IG9wZXJhdGlvbiB0byB0aGUgQ1BVLiBUaGlzIHNob3VsZCBub3QgYmUgdXNlZCBpblxuICogcHJvZHVjdGlvbi4gRGVidWcgbW9kZSBkb2VzIG5vdCBhZmZlY3QgdGhlIHRpbWluZyBpbmZvcm1hdGlvbiBvZiB0aGUga2VybmVsXG4gKiBleGVjdXRpb24gYXMgd2UgZG8gbm90IG1lYXN1cmUgZG93bmxvYWQgdGltZSBpbiB0aGUga2VybmVsIGV4ZWN1dGlvbiB0aW1lLlxuICpcbiAqIFNlZSBhbHNvOiBgdGYucHJvZmlsZWAsIGB0Zi5tZW1vcnlgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdFbnZpcm9ubWVudCd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmFibGVEZWJ1Z01vZGUoKSB7XG4gICAgZW52KCkuc2V0KCdERUJVRycsIHRydWUpO1xufVxuLyoqIEdsb2JhbGx5IGRpc2FibGVzIGRlcHJlY2F0aW9uIHdhcm5pbmdzICovXG5leHBvcnQgZnVuY3Rpb24gZGlzYWJsZURlcHJlY2F0aW9uV2FybmluZ3MoKSB7XG4gICAgZW52KCkuc2V0KCdERVBSRUNBVElPTl9XQVJOSU5HU19FTkFCTEVEJywgZmFsc2UpO1xuICAgIGNvbnNvbGUud2FybihgVGVuc29yRmxvdy5qcyBkZXByZWNhdGlvbiB3YXJuaW5ncyBoYXZlIGJlZW4gZGlzYWJsZWQuYCk7XG59XG4vKiogV2FybiB1c2VycyBhYm91dCBkZXByZWNhdGVkIGZ1bmN0aW9uYWxpdHkuICovXG5leHBvcnQgZnVuY3Rpb24gZGVwcmVjYXRpb25XYXJuKG1zZykge1xuICAgIGlmIChlbnYoKS5nZXRCb29sKCdERVBSRUNBVElPTl9XQVJOSU5HU19FTkFCTEVEJykpIHtcbiAgICAgICAgY29uc29sZS53YXJuKG1zZyArICcgWW91IGNhbiBkaXNhYmxlIGRlcHJlY2F0aW9uIHdhcm5pbmdzIHdpdGggJyArXG4gICAgICAgICAgICAndGYuZGlzYWJsZURlcHJlY2F0aW9uV2FybmluZ3MoKS4nKTtcbiAgICB9XG59XG5zZXREZXByZWNhdGlvbldhcm5pbmdGbihkZXByZWNhdGlvbldhcm4pO1xuLyoqXG4gKiBEaXNwb3NlIGFsbCB2YXJpYWJsZXMga2VwdCBpbiBiYWNrZW5kIGVuZ2luZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnRW52aXJvbm1lbnQnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzcG9zZVZhcmlhYmxlcygpIHtcbiAgICBFTkdJTkUuZGlzcG9zZVZhcmlhYmxlcygpO1xufVxuLyoqXG4gKiBJdCByZXR1cm5zIHRoZSBnbG9iYWwgZW5naW5lIHRoYXQga2VlcHMgdHJhY2sgb2YgYWxsIHRlbnNvcnMgYW5kIGJhY2tlbmRzLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdFbnZpcm9ubWVudCd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmdpbmUoKSB7XG4gICAgcmV0dXJuIEVOR0lORTtcbn1cbi8qKlxuICogUmV0dXJucyBtZW1vcnkgaW5mbyBhdCB0aGUgY3VycmVudCB0aW1lIGluIHRoZSBwcm9ncmFtLiBUaGUgcmVzdWx0IGlzIGFuXG4gKiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogLSBgbnVtQnl0ZXNgOiBOdW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkICh1bmRpc3Bvc2VkKSBhdCB0aGlzIHRpbWUuXG4gKiAtIGBudW1UZW5zb3JzYDogTnVtYmVyIG9mIHVuaXF1ZSB0ZW5zb3JzIGFsbG9jYXRlZC5cbiAqIC0gYG51bURhdGFCdWZmZXJzYDogTnVtYmVyIG9mIHVuaXF1ZSBkYXRhIGJ1ZmZlcnMgYWxsb2NhdGVkXG4gKiAgICh1bmRpc3Bvc2VkKSBhdCB0aGlzIHRpbWUsIHdoaWNoIGlzIOKJpCB0aGUgbnVtYmVyIG9mIHRlbnNvcnNcbiAqICAgKGUuZy4gYGEucmVzaGFwZShuZXdTaGFwZSlgIG1ha2VzIGEgbmV3IFRlbnNvciB0aGF0IHNoYXJlcyB0aGUgc2FtZVxuICogICBkYXRhIGJ1ZmZlciB3aXRoIGBhYCkuXG4gKiAtIGB1bnJlbGlhYmxlYDogVHJ1ZSBpZiB0aGUgbWVtb3J5IHVzYWdlIGlzIHVucmVsaWFibGUuIFNlZSBgcmVhc29uc2Agd2hlblxuICogICAgYHVucmVsaWFibGVgIGlzIHRydWUuXG4gKiAtIGByZWFzb25zYDogYHN0cmluZ1tdYCwgcmVhc29ucyB3aHkgdGhlIG1lbW9yeSBpcyB1bnJlbGlhYmxlLCBwcmVzZW50IGlmXG4gKiAgICBgdW5yZWxpYWJsZWAgaXMgdHJ1ZS5cbiAqXG4gKiBXZWJHTCBQcm9wZXJ0aWVzOlxuICogLSBgbnVtQnl0ZXNJbkdQVWA6IE51bWJlciBvZiBieXRlcyBhbGxvY2F0ZWQgKHVuZGlzcG9zZWQpIGluIHRoZSBHUFUgb25seSBhdFxuICogICAgIHRoaXMgdGltZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnUGVyZm9ybWFuY2UnLCBzdWJoZWFkaW5nOiAnTWVtb3J5J31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lbW9yeSgpIHtcbiAgICByZXR1cm4gRU5HSU5FLm1lbW9yeSgpO1xufVxuLyoqXG4gKiBFeGVjdXRlcyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gYGYoKWAgYW5kIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXNcbiAqIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZ1bmN0aW9uJ3MgbWVtb3J5IHVzZTpcbiAqIC0gYG5ld0J5dGVzYDogdGhlIG51bWJlciBvZiBuZXcgYnl0ZXMgYWxsb2NhdGVkXG4gKiAtIGBuZXdUZW5zb3JzYDogdGhlIG51bWJlciBvZiBuZXcgdGVuc29ycyBjcmVhdGVkXG4gKiAtIGBwZWFrQnl0ZXNgOiB0aGUgcGVhayBudW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkXG4gKiAtIGBrZXJuZWxzYDogYW4gYXJyYXkgb2Ygb2JqZWN0cyBmb3IgZWFjaCBrZXJuZWwgaW52b2x2ZWQgdGhhdCByZXBvcnRzXG4gKiB0aGVpciBpbnB1dCBhbmQgb3V0cHV0IHNoYXBlcywgbnVtYmVyIG9mIGJ5dGVzIHVzZWQsIGFuZCBudW1iZXIgb2YgbmV3XG4gKiB0ZW5zb3JzIGNyZWF0ZWQuXG4gKiAtIGBrZXJuZWxOYW1lc2A6IGFuIGFycmF5IG9mIHVuaXF1ZSBzdHJpbmdzIHdpdGgganVzdCB0aGUgbmFtZXMgb2YgdGhlXG4gKiBrZXJuZWxzIGluIHRoZSBga2VybmVsc2AgYXJyYXkuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHByb2ZpbGUgPSBhd2FpdCB0Zi5wcm9maWxlKCgpID0+IHtcbiAqICAgY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKiAgIGxldCB4MiA9IHguc3F1YXJlKCk7XG4gKiAgIHgyLmRpc3Bvc2UoKTtcbiAqICAgeDIgPSB4LnNxdWFyZSgpO1xuICogICB4Mi5kaXNwb3NlKCk7XG4gKiAgIHJldHVybiB4O1xuICogfSk7XG4gKlxuICogY29uc29sZS5sb2coYG5ld0J5dGVzOiAke3Byb2ZpbGUubmV3Qnl0ZXN9YCk7XG4gKiBjb25zb2xlLmxvZyhgbmV3VGVuc29yczogJHtwcm9maWxlLm5ld1RlbnNvcnN9YCk7XG4gKiBjb25zb2xlLmxvZyhgYnl0ZSB1c2FnZSBvdmVyIGFsbCBrZXJuZWxzOiAke3Byb2ZpbGUua2VybmVscy5tYXAoayA9PlxuICogay50b3RhbEJ5dGVzU25hcHNob3QpfWApO1xuICogYGBgXG4gKlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdQZXJmb3JtYW5jZScsIHN1YmhlYWRpbmc6ICdQcm9maWxlJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb2ZpbGUoZikge1xuICAgIHJldHVybiBFTkdJTkUucHJvZmlsZShmKTtcbn1cbi8qKlxuICogRXhlY3V0ZXMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIGBmbmAgYW5kIGFmdGVyIGl0IGlzIGV4ZWN1dGVkLCBjbGVhbnMgdXAgYWxsXG4gKiBpbnRlcm1lZGlhdGUgdGVuc29ycyBhbGxvY2F0ZWQgYnkgYGZuYCBleGNlcHQgdGhvc2UgcmV0dXJuZWQgYnkgYGZuYC5cbiAqIGBmbmAgbXVzdCBub3QgcmV0dXJuIGEgUHJvbWlzZSAoYXN5bmMgZnVuY3Rpb25zIG5vdCBhbGxvd2VkKS4gVGhlIHJldHVybmVkXG4gKiByZXN1bHQgY2FuIGJlIGEgY29tcGxleCBvYmplY3QuXG4gKlxuICogVXNpbmcgdGhpcyBtZXRob2QgaGVscHMgYXZvaWQgbWVtb3J5IGxlYWtzLiBJbiBnZW5lcmFsLCB3cmFwIGNhbGxzIHRvXG4gKiBvcGVyYXRpb25zIGluIGB0Zi50aWR5YCBmb3IgYXV0b21hdGljIG1lbW9yeSBjbGVhbnVwLlxuICpcbiAqIE5PVEU6IFZhcmlhYmxlcyBkbyAqbm90KiBnZXQgY2xlYW5lZCB1cCB3aGVuIGluc2lkZSBhIHRpZHkoKS4gSWYgeW91IHdhbnQgdG9cbiAqIGRpc3Bvc2UgdmFyaWFibGVzLCBwbGVhc2UgdXNlIGB0Zi5kaXNwb3NlVmFyaWFibGVzYCBvciBjYWxsIGRpc3Bvc2UoKVxuICogZGlyZWN0bHkgb24gdmFyaWFibGVzLlxuICpcbiAqIGBgYGpzXG4gKiAvLyB5ID0gMiBeIDIgKyAxXG4gKiBjb25zdCB5ID0gdGYudGlkeSgoKSA9PiB7XG4gKiAgIC8vIGEsIGIsIGFuZCBvbmUgd2lsbCBiZSBjbGVhbmVkIHVwIHdoZW4gdGhlIHRpZHkgZW5kcy5cbiAqICAgY29uc3Qgb25lID0gdGYuc2NhbGFyKDEpO1xuICogICBjb25zdCBhID0gdGYuc2NhbGFyKDIpO1xuICogICBjb25zdCBiID0gYS5zcXVhcmUoKTtcbiAqXG4gKiAgIGNvbnNvbGUubG9nKCdudW1UZW5zb3JzIChpbiB0aWR5KTogJyArIHRmLm1lbW9yeSgpLm51bVRlbnNvcnMpO1xuICpcbiAqICAgLy8gVGhlIHZhbHVlIHJldHVybmVkIGluc2lkZSB0aGUgdGlkeSBmdW5jdGlvbiB3aWxsIHJldHVyblxuICogICAvLyB0aHJvdWdoIHRoZSB0aWR5LCBpbiB0aGlzIGNhc2UgdG8gdGhlIHZhcmlhYmxlIHkuXG4gKiAgIHJldHVybiBiLmFkZChvbmUpO1xuICogfSk7XG4gKlxuICogY29uc29sZS5sb2coJ251bVRlbnNvcnMgKG91dHNpZGUgdGlkeSk6ICcgKyB0Zi5tZW1vcnkoKS5udW1UZW5zb3JzKTtcbiAqIHkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBuYW1lT3JGbiBUaGUgbmFtZSBvZiB0aGUgY2xvc3VyZSwgb3IgdGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUuXG4gKiAgICAgSWYgYSBuYW1lIGlzIHByb3ZpZGVkLCB0aGUgMm5kIGFyZ3VtZW50IHNob3VsZCBiZSB0aGUgZnVuY3Rpb24uXG4gKiAgICAgSWYgZGVidWcgbW9kZSBpcyBvbiwgdGhlIHRpbWluZyBhbmQgdGhlIG1lbW9yeSB1c2FnZSBvZiB0aGUgZnVuY3Rpb25cbiAqICAgICB3aWxsIGJlIHRyYWNrZWQgYW5kIGRpc3BsYXllZCBvbiB0aGUgY29uc29sZSB1c2luZyB0aGUgcHJvdmlkZWQgbmFtZS5cbiAqIEBwYXJhbSBmbiBUaGUgZnVuY3Rpb24gdG8gZXhlY3V0ZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnUGVyZm9ybWFuY2UnLCBzdWJoZWFkaW5nOiAnTWVtb3J5J31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRpZHkobmFtZU9yRm4sIGZuKSB7XG4gICAgcmV0dXJuIEVOR0lORS50aWR5KG5hbWVPckZuLCBmbik7XG59XG4vKipcbiAqIERpc3Bvc2VzIGFueSBgdGYuVGVuc29yYHMgZm91bmQgd2l0aGluIHRoZSBwcm92aWRlZCBvYmplY3QuXG4gKlxuICogQHBhcmFtIGNvbnRhaW5lciBhbiBvYmplY3QgdGhhdCBtYXkgYmUgYSBgdGYuVGVuc29yYCBvciBtYXkgZGlyZWN0bHlcbiAqICAgICBjb250YWluIGB0Zi5UZW5zb3Jgcywgc3VjaCBhcyBhIGBUZW5zb3JbXWAgb3IgYHtrZXk6IFRlbnNvciwgLi4ufWAuIElmXG4gKiAgICAgdGhlIG9iamVjdCBpcyBub3QgYSBgdGYuVGVuc29yYCBvciBkb2VzIG5vdCBjb250YWluIGBUZW5zb3JzYCwgbm90aGluZ1xuICogICAgIGhhcHBlbnMuIEluIGdlbmVyYWwgaXQgaXMgc2FmZSB0byBwYXNzIGFueSBvYmplY3QgaGVyZSwgZXhjZXB0IHRoYXRcbiAqICAgICBgUHJvbWlzZWBzIGFyZSBub3Qgc3VwcG9ydGVkLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdQZXJmb3JtYW5jZScsIHN1YmhlYWRpbmc6ICdNZW1vcnknfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzcG9zZShjb250YWluZXIpIHtcbiAgICBjb25zdCB0ZW5zb3JzID0gZ2V0VGVuc29yc0luQ29udGFpbmVyKGNvbnRhaW5lcik7XG4gICAgdGVuc29ycy5mb3JFYWNoKHRlbnNvciA9PiB0ZW5zb3IuZGlzcG9zZSgpKTtcbn1cbi8qKlxuICogS2VlcHMgYSBgdGYuVGVuc29yYCBnZW5lcmF0ZWQgaW5zaWRlIGEgYHRmLnRpZHlgIGZyb20gYmVpbmcgZGlzcG9zZWRcbiAqIGF1dG9tYXRpY2FsbHkuXG4gKlxuICogYGBganNcbiAqIGxldCBiO1xuICogY29uc3QgeSA9IHRmLnRpZHkoKCkgPT4ge1xuICogICBjb25zdCBvbmUgPSB0Zi5zY2FsYXIoMSk7XG4gKiAgIGNvbnN0IGEgPSB0Zi5zY2FsYXIoMik7XG4gKlxuICogICAvLyBiIHdpbGwgbm90IGJlIGNsZWFuZWQgdXAgYnkgdGhlIHRpZHkuIGEgYW5kIG9uZSB3aWxsIGJlIGNsZWFuZWQgdXBcbiAqICAgLy8gd2hlbiB0aGUgdGlkeSBlbmRzLlxuICogICBiID0gdGYua2VlcChhLnNxdWFyZSgpKTtcbiAqXG4gKiAgIGNvbnNvbGUubG9nKCdudW1UZW5zb3JzIChpbiB0aWR5KTogJyArIHRmLm1lbW9yeSgpLm51bVRlbnNvcnMpO1xuICpcbiAqICAgLy8gVGhlIHZhbHVlIHJldHVybmVkIGluc2lkZSB0aGUgdGlkeSBmdW5jdGlvbiB3aWxsIHJldHVyblxuICogICAvLyB0aHJvdWdoIHRoZSB0aWR5LCBpbiB0aGlzIGNhc2UgdG8gdGhlIHZhcmlhYmxlIHkuXG4gKiAgIHJldHVybiBiLmFkZChvbmUpO1xuICogfSk7XG4gKlxuICogY29uc29sZS5sb2coJ251bVRlbnNvcnMgKG91dHNpZGUgdGlkeSk6ICcgKyB0Zi5tZW1vcnkoKS5udW1UZW5zb3JzKTtcbiAqIGNvbnNvbGUubG9nKCd5OicpO1xuICogeS5wcmludCgpO1xuICogY29uc29sZS5sb2coJ2I6Jyk7XG4gKiBiLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gcmVzdWx0IFRoZSB0ZW5zb3IgdG8ga2VlcCBmcm9tIGJlaW5nIGRpc3Bvc2VkLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdQZXJmb3JtYW5jZScsIHN1YmhlYWRpbmc6ICdNZW1vcnknfVxuICovXG5leHBvcnQgZnVuY3Rpb24ga2VlcChyZXN1bHQpIHtcbiAgICByZXR1cm4gRU5HSU5FLmtlZXAocmVzdWx0KTtcbn1cbi8qKlxuICogRXhlY3V0ZXMgYGYoKWAgYW5kIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aW1pbmdcbiAqIGluZm9ybWF0aW9uLlxuICpcbiAqIFRoZSByZXN1bHQgaXMgYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqIC0gYHdhbGxNc2A6IFdhbGwgZXhlY3V0aW9uIHRpbWUuXG4gKiAtIGBrZXJuZWxNc2A6IEtlcm5lbCBleGVjdXRpb24gdGltZSwgaWdub3JpbmcgZGF0YSB0cmFuc2Zlci4gSWYgdXNpbmcgdGhlXG4gKiBXZWJHTCBiYWNrZW5kIGFuZCB0aGUgcXVlcnkgdGltZXIgZXh0ZW5zaW9uIGlzIG5vdCBhdmFpbGFibGUsIHRoaXMgd2lsbFxuICogcmV0dXJuIGFuIGVycm9yIG9iamVjdC5cbiAqIC0gT24gYFdlYkdMYCBUaGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgcHJvcGVydGllcyBleGlzdDpcbiAqICAgLSBgdXBsb2FkV2FpdE1zYDogQ1BVIGJsb2NraW5nIHRpbWUgb24gdGV4dHVyZSB1cGxvYWRzLlxuICogICAtIGBkb3dubG9hZFdhaXRNc2A6IENQVSBibG9ja2luZyB0aW1lIG9uIHRleHR1cmUgZG93bmxvYWRzIChyZWFkUGl4ZWxzKS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnJhbmRvbU5vcm1hbChbMjAsIDIwXSk7XG4gKiBjb25zdCB0aW1lID0gYXdhaXQgdGYudGltZSgoKSA9PiB4Lm1hdE11bCh4KSk7XG4gKlxuICogY29uc29sZS5sb2coYGtlcm5lbE1zOiAke3RpbWUua2VybmVsTXN9LCB3YWxsVGltZU1zOiAke3RpbWUud2FsbE1zfWApO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGYgVGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgYW5kIHRpbWUuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1BlcmZvcm1hbmNlJywgc3ViaGVhZGluZzogJ1RpbWluZyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aW1lKGYpIHtcbiAgICByZXR1cm4gRU5HSU5FLnRpbWUoZik7XG59XG4vKipcbiAqIFNldHMgdGhlIGJhY2tlbmQgKGNwdSwgd2ViZ2wsIHdhc20sIGV0YykgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRlbnNvcnMgYW5kXG4gKiBleGVjdXRpbmcgb3BlcmF0aW9ucyBvbiB0aG9zZSB0ZW5zb3JzLiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzXG4gKiB0byBhIGJvb2xlYW4gaWYgdGhlIGJhY2tlbmQgaW5pdGlhbGl6YXRpb24gd2FzIHN1Y2Nlc3NmdWwuXG4gKlxuICogTm90ZSB0aGlzIGRpc3Bvc2VzIHRoZSBjdXJyZW50IGJhY2tlbmQsIGlmIGFueSwgYXMgd2VsbCBhcyBhbnkgdGVuc29yc1xuICogYXNzb2NpYXRlZCB3aXRoIGl0LiBBIG5ldyBiYWNrZW5kIGlzIGluaXRpYWxpemVkLCBldmVuIGlmIGl0IGlzIG9mIHRoZVxuICogc2FtZSB0eXBlIGFzIHRoZSBwcmV2aW91cyBvbmUuXG4gKlxuICogQHBhcmFtIGJhY2tlbmROYW1lIFRoZSBuYW1lIG9mIHRoZSBiYWNrZW5kLiBDdXJyZW50bHkgc3VwcG9ydHNcbiAqICAgICBgJ3dlYmdsJ3wnY3B1J2AgaW4gdGhlIGJyb3dzZXIsIGAndGVuc29yZmxvdydgIHVuZGVyIG5vZGUuanNcbiAqICAgICAocmVxdWlyZXMgdGZqcy1ub2RlKSwgYW5kIGAnd2FzbSdgIChyZXF1aXJlcyB0ZmpzLWJhY2tlbmQtd2FzbSkuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0JhY2tlbmRzJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEJhY2tlbmQoYmFja2VuZE5hbWUpIHtcbiAgICByZXR1cm4gRU5HSU5FLnNldEJhY2tlbmQoYmFja2VuZE5hbWUpO1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBiYWNrZW5kIChvciB0aGVcbiAqIGhpZ2hlc3QgcHJpb3JpdHkgb25lKSBoYXMgaW5pdGlhbGl6ZWQuIEF3YWl0IHRoaXMgcHJvbWlzZSB3aGVuIHlvdSBhcmUgdXNpbmdcbiAqIGEgYmFja2VuZCB0aGF0IGhhcyBhc3luYyBpbml0aWFsaXphdGlvbi5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnQmFja2VuZHMnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZHkoKSB7XG4gICAgcmV0dXJuIEVOR0lORS5yZWFkeSgpO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjdXJyZW50IGJhY2tlbmQgbmFtZSAoY3B1LCB3ZWJnbCwgZXRjKS4gVGhlIGJhY2tlbmQgaXNcbiAqIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0ZW5zb3JzIGFuZCBleGVjdXRpbmcgb3BlcmF0aW9ucyBvbiB0aG9zZSB0ZW5zb3JzLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdCYWNrZW5kcyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRCYWNrZW5kKCkge1xuICAgIHJldHVybiBFTkdJTkUuYmFja2VuZE5hbWU7XG59XG4vKipcbiAqIFJlbW92ZXMgYSBiYWNrZW5kIGFuZCB0aGUgcmVnaXN0ZXJlZCBmYWN0b3J5LlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdCYWNrZW5kcyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVCYWNrZW5kKG5hbWUpIHtcbiAgICBFTkdJTkUucmVtb3ZlQmFja2VuZChuYW1lKTtcbn1cbi8qKlxuICogRmluZHMgdGhlIGJhY2tlbmQgcmVnaXN0ZXJlZCB1bmRlciB0aGUgcHJvdmlkZWQgbmFtZS4gUmV0dXJucyBudWxsIGlmIHRoZVxuICogbmFtZSBpcyBub3QgaW4gdGhlIHJlZ2lzdHJ5LCBvciB0aGUgcmVnaXN0cmF0aW9uIGhhc24ndCBmaW5pc2hlZCB5ZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQmFja2VuZChuYW1lKSB7XG4gICAgcmV0dXJuIEVOR0lORS5maW5kQmFja2VuZChuYW1lKTtcbn1cbi8qKlxuICogRmluZHMgdGhlIGJhY2tlbmQgZmFjdG9yeSByZWdpc3RlcmVkIHVuZGVyIHRoZSBwcm92aWRlZCBuYW1lLiBSZXR1cm5zIGFcbiAqIGZ1bmN0aW9uIHRoYXQgcHJvZHVjZXMgYSBuZXcgYmFja2VuZCB3aGVuIGNhbGxlZC4gUmV0dXJucyBudWxsIGlmIHRoZSBuYW1lXG4gKiBpcyBub3QgaW4gdGhlIHJlZ2lzdHJ5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZEJhY2tlbmRGYWN0b3J5KG5hbWUpIHtcbiAgICByZXR1cm4gRU5HSU5FLmZpbmRCYWNrZW5kRmFjdG9yeShuYW1lKTtcbn1cbi8qKlxuICogUmVnaXN0ZXJzIGEgZ2xvYmFsIGJhY2tlbmQuIFRoZSByZWdpc3RyYXRpb24gc2hvdWxkIGhhcHBlbiB3aGVuIGltcG9ydGluZ1xuICogYSBtb2R1bGUgZmlsZSAoZS5nLiB3aGVuIGltcG9ydGluZyBgYmFja2VuZF93ZWJnbC50c2ApLCBhbmQgaXMgdXNlZCBmb3JcbiAqIG1vZHVsYXIgYnVpbGRzIChlLmcuIGN1c3RvbSB0ZmpzIGJ1bmRsZSB3aXRoIG9ubHkgd2ViZ2wgc3VwcG9ydCkuXG4gKlxuICogQHBhcmFtIGZhY3RvcnkgVGhlIGJhY2tlbmQgZmFjdG9yeSBmdW5jdGlvbi4gV2hlbiBjYWxsZWQsIGl0IHNob3VsZFxuICogcmV0dXJuIGEgYmFja2VuZCBpbnN0YW5jZSwgb3IgYSBwcm9taXNlIG9mIGFuIGluc3RhbmNlLlxuICogQHBhcmFtIHByaW9yaXR5IFRoZSBwcmlvcml0eSBvZiB0aGUgYmFja2VuZCAoaGlnaGVyID0gbW9yZSBpbXBvcnRhbnQpLlxuICogICAgIEluIGNhc2UgbXVsdGlwbGUgYmFja2VuZHMgYXJlIHJlZ2lzdGVyZWQsIHRoZSBwcmlvcml0eSBpcyB1c2VkIHRvIGZpbmRcbiAqICAgICB0aGUgYmVzdCBiYWNrZW5kLiBEZWZhdWx0cyB0byAxLlxuICogQHJldHVybiBGYWxzZSBpZiB0aGVyZSBpcyBhbHJlYWR5IGEgcmVnaXN0ZXJlZCBiYWNrZW5kIHVuZGVyIHRoaXMgbmFtZSwgdHJ1ZVxuICogICAgIGlmIG5vdC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnQmFja2VuZHMnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJCYWNrZW5kKG5hbWUsIGZhY3RvcnksIHByaW9yaXR5ID0gMSkge1xuICAgIHJldHVybiBFTkdJTkUucmVnaXN0ZXJCYWNrZW5kKG5hbWUsIGZhY3RvcnksIHByaW9yaXR5KTtcbn1cbi8qKlxuICogR2V0cyB0aGUgY3VycmVudCBiYWNrZW5kLiBJZiBubyBiYWNrZW5kcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQsIHRoaXMgd2lsbFxuICogYXR0ZW1wdCB0byBpbml0aWFsaXplIHRoZSBiZXN0IGJhY2tlbmQuIFdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgdGhlIGhpZ2hlc3RcbiAqIHByaW9yaXR5IGJhY2tlbmQgaGFzIGFzeW5jIGluaXRpYWxpemF0aW9uLCBpbiB3aGljaCBjYXNlLCB5b3Ugc2hvdWxkIGNhbGxcbiAqICdhd2FpdCB0Zi5yZWFkeSgpJyBiZWZvcmUgcnVubmluZyBvdGhlciBjb2RlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdCYWNrZW5kcyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiYWNrZW5kKCkge1xuICAgIHJldHVybiBFTkdJTkUuYmFja2VuZDtcbn1cbi8qKlxuICogU2V0cyB0aGUgZ2xvYmFsIHBsYXRmb3JtLlxuICpcbiAqIEBwYXJhbSBwbGF0Zm9ybU5hbWUgVGhlIG5hbWUgb2YgdGhpcyBwbGF0Zm9ybS5cbiAqIEBwYXJhbSBwbGF0Zm9ybSBBIHBsYXRmb3JtIGltcGxlbWVudGF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0UGxhdGZvcm0ocGxhdGZvcm1OYW1lLCBwbGF0Zm9ybSkge1xuICAgIGVudigpLnNldFBsYXRmb3JtKHBsYXRmb3JtTmFtZSwgcGxhdGZvcm0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2xvYmFscy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuL2VuZ2luZSc7XG5pbXBvcnQgeyBUZW5zb3IsIFZhcmlhYmxlIH0gZnJvbSAnLi90ZW5zb3InO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yLCBjb252ZXJ0VG9UZW5zb3JBcnJheSB9IGZyb20gJy4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi91dGlsJztcbi8qKlxuICogUHJvdmlkZWQgYGYoeClgLCByZXR1cm5zIGFub3RoZXIgZnVuY3Rpb24gYGcoeCwgZHk/KWAsIHdoaWNoIGdpdmVzIHRoZVxuICogZ3JhZGllbnQgb2YgYGYoeClgIHdpdGggcmVzcGVjdCB0byBgeGAuXG4gKlxuICogSWYgYGR5YCBpcyBwcm92aWRlZCwgdGhlIGdyYWRpZW50IG9mIGBmKHgpLm11bChkeSkuc3VtKClgIHdpdGggcmVzcGVjdCB0b1xuICogYHhgIGlzIGNvbXB1dGVkIGluc3RlYWQuIGBmKHgpYCBtdXN0IHRha2UgYSBzaW5nbGUgdGVuc29yIGB4YCBhbmQgcmV0dXJuIGFcbiAqIHNpbmdsZSB0ZW5zb3IgYHlgLiBJZiBgZigpYCB0YWtlcyBtdWx0aXBsZSBpbnB1dHMsIHVzZSBgdGYuZ3JhZHNgIGluc3RlYWQuXG4gKlxuICogYGBganNcbiAqIC8vIGYoeCkgPSB4IF4gMlxuICogY29uc3QgZiA9IHggPT4geC5zcXVhcmUoKTtcbiAqIC8vIGYnKHgpID0gMnhcbiAqIGNvbnN0IGcgPSB0Zi5ncmFkKGYpO1xuICpcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMiwgM10pO1xuICogZyh4KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogYGBganNcbiAqIC8vIGYoeCkgPSB4IF4gM1xuICogY29uc3QgZiA9IHggPT4geC5wb3codGYuc2NhbGFyKDMsICdpbnQzMicpKTtcbiAqIC8vIGYnKHgpID0gM3ggXiAyXG4gKiBjb25zdCBnID0gdGYuZ3JhZChmKTtcbiAqIC8vIGYnJyh4KSA9IDZ4XG4gKiBjb25zdCBnZyA9IHRmLmdyYWQoZyk7XG4gKlxuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsyLCAzXSk7XG4gKiBnZyh4KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGYgVGhlIGZ1bmN0aW9uIGYoeCksIHRvIGNvbXB1dGUgZ3JhZGllbnQgZm9yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdHcmFkaWVudHMnfVxuICovXG5mdW5jdGlvbiBncmFkKGYpIHtcbiAgICB1dGlsLmFzc2VydCh1dGlsLmlzRnVuY3Rpb24oZiksICgpID0+ICdUaGUgZiBwYXNzZWQgaW4gZ3JhZChmKSBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICByZXR1cm4gKHgsIGR5KSA9PiB7XG4gICAgICAgIC8vIHggY2FuIGJlIG9mIGFueSBkdHlwZSwgdGh1cyBudWxsIGFzIHRoZSBsYXN0IGFyZ3VtZW50LlxuICAgICAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICd0Zi5ncmFkJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG4gICAgICAgIGNvbnN0ICRkeSA9IChkeSAhPSBudWxsKSA/IGNvbnZlcnRUb1RlbnNvcihkeSwgJ2R5JywgJ3RmLmdyYWQnKSA6IG51bGw7XG4gICAgICAgIHJldHVybiBFTkdJTkUudGlkeSgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IHZhbHVlLCBncmFkcyB9ID0gRU5HSU5FLmdyYWRpZW50cygoKSA9PiBmKCR4KSwgWyR4XSwgJGR5KTtcbiAgICAgICAgICAgIGlmICgkZHkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHV0aWwuYXNzZXJ0U2hhcGVzTWF0Y2godmFsdWUuc2hhcGUsICRkeS5zaGFwZSwgJ1RoZSBzaGFwZSBvZiBkeSBwYXNzZWQgaW4gZ3JhZChmKSh4LCBkeSkgbXVzdCBtYXRjaCB0aGUgc2hhcGUgJyArXG4gICAgICAgICAgICAgICAgICAgICdyZXR1cm5lZCBieSBmKHgpJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaGVja0dyYWRzKGdyYWRzKTtcbiAgICAgICAgICAgIHJldHVybiBncmFkc1swXTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cbi8qKlxuICogUHJvdmlkZWQgYGYoeDEsIHgyLC4uLilgLCByZXR1cm5zIGFub3RoZXIgZnVuY3Rpb24gYGcoW3gxLCB4MiwuLi5dLCBkeT8pYCxcbiAqIHdoaWNoIGdpdmVzIGFuIGFycmF5IG9mIGdyYWRpZW50cyBvZiBgZigpYCB3aXRoIHJlc3BlY3QgdG8gZWFjaCBpbnB1dFxuICogW2B4MWAsYHgyYCwuLi5dLlxuICpcbiAqIElmIGBkeWAgaXMgcGFzc2VkIHdoZW4gY2FsbGluZyBgZygpYCwgdGhlIGdyYWRpZW50IG9mXG4gKiBgZih4MSwuLi4pLm11bChkeSkuc3VtKClgIHdpdGggcmVzcGVjdCB0byBlYWNoIGlucHV0IGlzIGNvbXB1dGVkIGluc3RlYWQuXG4gKiBUaGUgcHJvdmlkZWQgYGZgIG11c3QgdGFrZSBvbmUgb3IgbW9yZSB0ZW5zb3JzIGFuZCByZXR1cm4gYSBzaW5nbGUgdGVuc29yXG4gKiBgeWAuIElmIGBmKClgIHRha2VzIGEgc2luZ2xlIGlucHV0LCB3ZSByZWNvbW1lbmQgdXNpbmcgYHRmLmdyYWRgIGluc3RlYWQuXG4gKlxuICogYGBganNcbiAqIC8vIGYoYSwgYikgPSBhICogYlxuICogY29uc3QgZiA9IChhLCBiKSA9PiBhLm11bChiKTtcbiAqIC8vIGRmIC8gZGEgPSBiLCBkZiAvIGRiID0gYVxuICogY29uc3QgZyA9IHRmLmdyYWRzKGYpO1xuICpcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMiwgM10pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFstMiwgLTNdKTtcbiAqIGNvbnN0IFtkYSwgZGJdID0gZyhbYSwgYl0pO1xuICogY29uc29sZS5sb2coJ2RhJyk7XG4gKiBkYS5wcmludCgpO1xuICogY29uc29sZS5sb2coJ2RiJyk7XG4gKiBkYi5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGYgVGhlIGZ1bmN0aW9uIGBmKHgxLCB4MiwuLi4pYCB0byBjb21wdXRlIGdyYWRpZW50cyBmb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0dyYWRpZW50cyd9XG4gKi9cbmZ1bmN0aW9uIGdyYWRzKGYpIHtcbiAgICB1dGlsLmFzc2VydCh1dGlsLmlzRnVuY3Rpb24oZiksICgpID0+ICdUaGUgZiBwYXNzZWQgaW4gZ3JhZHMoZikgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgcmV0dXJuIChhcmdzLCBkeSkgPT4ge1xuICAgICAgICB1dGlsLmFzc2VydChBcnJheS5pc0FycmF5KGFyZ3MpLCAoKSA9PiAnVGhlIGFyZ3MgcGFzc2VkIGluIGdyYWRzKGYpKGFyZ3MpIG11c3QgYmUgYW4gYXJyYXkgJyArXG4gICAgICAgICAgICAnb2YgYFRlbnNvcmBzIG9yIGBUZW5zb3JMaWtlYHMnKTtcbiAgICAgICAgLy8gYXJncyBjYW4gYmUgb2YgYW55IGR0eXBlLCB0aHVzIG51bGwgYXMgdGhlIGxhc3QgYXJndW1lbnQuXG4gICAgICAgIGNvbnN0ICRhcmdzID0gY29udmVydFRvVGVuc29yQXJyYXkoYXJncywgJ2FyZ3MnLCAndGYuZ3JhZHMnLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgICAgICAgY29uc3QgJGR5ID0gKGR5ICE9IG51bGwpID8gY29udmVydFRvVGVuc29yKGR5LCAnZHknLCAndGYuZ3JhZHMnKSA6IG51bGw7XG4gICAgICAgIHJldHVybiBFTkdJTkUudGlkeSgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IHZhbHVlLCBncmFkcyB9ID0gRU5HSU5FLmdyYWRpZW50cygoKSA9PiBmKC4uLiRhcmdzKSwgJGFyZ3MsICRkeSk7XG4gICAgICAgICAgICBpZiAoJGR5ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB1dGlsLmFzc2VydFNoYXBlc01hdGNoKHZhbHVlLnNoYXBlLCAkZHkuc2hhcGUsICdUaGUgc2hhcGUgb2YgZHkgcGFzc2VkIGluIGdyYWRzKGYpKFt4MSwuLi5dLCBkeSkgbXVzdCAnICtcbiAgICAgICAgICAgICAgICAgICAgJ21hdGNoIHRoZSBzaGFwZSByZXR1cm5lZCBieSBmKFt4MSwuLi5dKScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2hlY2tHcmFkcyhncmFkcyk7XG4gICAgICAgICAgICByZXR1cm4gZ3JhZHM7XG4gICAgICAgIH0pO1xuICAgIH07XG59XG4vKipcbiAqIExpa2UgYHRmLmdyYWRgLCBidXQgYWxzbyByZXR1cm5zIHRoZSB2YWx1ZSBvZiBgZigpYC4gVXNlZnVsIHdoZW4gYGYoKWBcbiAqIHJldHVybnMgYSBtZXRyaWMgeW91IHdhbnQgdG8gc2hvdy5cbiAqXG4gKiBUaGUgcmVzdWx0IGlzIGEgcmljaCBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAtIGdyYWQ6IFRoZSBncmFkaWVudCBvZiBgZih4KWAgdy5yLnQgYHhgIChyZXN1bHQgb2YgYHRmLmdyYWRgKS5cbiAqIC0gdmFsdWU6IFRoZSB2YWx1ZSByZXR1cm5lZCBieSBgZih4KWAuXG4gKlxuICogYGBganNcbiAqIC8vIGYoeCkgPSB4IF4gMlxuICogY29uc3QgZiA9IHggPT4geC5zcXVhcmUoKTtcbiAqIC8vIGYnKHgpID0gMnhcbiAqIGNvbnN0IGcgPSB0Zi52YWx1ZUFuZEdyYWQoZik7XG4gKlxuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsyLCAzXSk7XG4gKiBjb25zdCB7dmFsdWUsIGdyYWR9ID0gZyh4KTtcbiAqXG4gKiBjb25zb2xlLmxvZygndmFsdWUnKTtcbiAqIHZhbHVlLnByaW50KCk7XG4gKiBjb25zb2xlLmxvZygnZ3JhZCcpO1xuICogZ3JhZC5wcmludCgpO1xuICogYGBgXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0dyYWRpZW50cyd9XG4gKi9cbmZ1bmN0aW9uIHZhbHVlQW5kR3JhZChmKSB7XG4gICAgdXRpbC5hc3NlcnQodXRpbC5pc0Z1bmN0aW9uKGYpLCAoKSA9PiAnVGhlIGYgcGFzc2VkIGluIHZhbHVlQW5kR3JhZChmKSBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICByZXR1cm4gKHgsIGR5KSA9PiB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHggaW5zdGFuY2VvZiBUZW5zb3IsICgpID0+ICdUaGUgeCBwYXNzZWQgaW4gdmFsdWVBbmRHcmFkKGYpKHgpIG11c3QgYmUgYSB0ZW5zb3InKTtcbiAgICAgICAgdXRpbC5hc3NlcnQoZHkgPT0gbnVsbCB8fCBkeSBpbnN0YW5jZW9mIFRlbnNvciwgKCkgPT4gJ1RoZSBkeSBwYXNzZWQgaW4gdmFsdWVBbmRHcmFkKGYpKHgsIGR5KSBtdXN0IGJlIGEgdGVuc29yJyk7XG4gICAgICAgIGNvbnN0IHsgZ3JhZHMsIHZhbHVlIH0gPSBFTkdJTkUuZ3JhZGllbnRzKCgpID0+IGYoeCksIFt4XSwgZHkpO1xuICAgICAgICBjaGVja0dyYWRzKGdyYWRzKTtcbiAgICAgICAgcmV0dXJuIHsgZ3JhZDogZ3JhZHNbMF0sIHZhbHVlIH07XG4gICAgfTtcbn1cbi8qKlxuICogTGlrZSBgdGYuZ3JhZHNgLCBidXQgcmV0dXJucyBhbHNvIHRoZSB2YWx1ZSBvZiBgZigpYC4gVXNlZnVsIHdoZW4gYGYoKWBcbiAqIHJldHVybnMgYSBtZXRyaWMgeW91IHdhbnQgdG8gc2hvdy5cbiAqXG4gKiBUaGUgcmVzdWx0IGlzIGEgcmljaCBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAtIGdyYWRzOiBUaGUgZ3JhZGllbnRzIG9mIGBmKClgIHcuci50IGVhY2ggaW5wdXQgKHJlc3VsdCBvZiBgdGYuZ3JhZHNgKS5cbiAqIC0gdmFsdWU6IFRoZSB2YWx1ZSByZXR1cm5lZCBieSBgZih4KWAuXG4gKlxuICogYGBganNcbiAqIC8vIGYoYSwgYikgPSBhICogYlxuICogY29uc3QgZiA9IChhLCBiKSA9PiBhLm11bChiKTtcbiAqIC8vIGRmL2RhID0gYiwgZGYvZGIgPSBhXG4gKiBjb25zdCBnID0gdGYudmFsdWVBbmRHcmFkcyhmKTtcbiAqXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzIsIDNdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbLTIsIC0zXSk7XG4gKiBjb25zdCB7dmFsdWUsIGdyYWRzfSA9IGcoW2EsIGJdKTtcbiAqXG4gKiBjb25zdCBbZGEsIGRiXSA9IGdyYWRzO1xuICpcbiAqIGNvbnNvbGUubG9nKCd2YWx1ZScpO1xuICogdmFsdWUucHJpbnQoKTtcbiAqXG4gKiBjb25zb2xlLmxvZygnZGEnKTtcbiAqIGRhLnByaW50KCk7XG4gKiBjb25zb2xlLmxvZygnZGInKTtcbiAqIGRiLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVHJhaW5pbmcnLCBzdWJoZWFkaW5nOiAnR3JhZGllbnRzJ31cbiAqL1xuZnVuY3Rpb24gdmFsdWVBbmRHcmFkcyhmKSB7XG4gICAgdXRpbC5hc3NlcnQodXRpbC5pc0Z1bmN0aW9uKGYpLCAoKSA9PiAnVGhlIGYgcGFzc2VkIGluIHZhbHVlQW5kR3JhZHMoZikgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgcmV0dXJuIChhcmdzLCBkeSkgPT4ge1xuICAgICAgICB1dGlsLmFzc2VydChBcnJheS5pc0FycmF5KGFyZ3MpICYmIGFyZ3MuZXZlcnkoYXJnID0+IGFyZyBpbnN0YW5jZW9mIFRlbnNvciksICgpID0+ICdUaGUgYXJncyBwYXNzZWQgaW4gdmFsdWVBbmRHcmFkcyhmKShhcmdzKSBtdXN0IGJlIGFycmF5IG9mICcgK1xuICAgICAgICAgICAgJ3RlbnNvcnMnKTtcbiAgICAgICAgdXRpbC5hc3NlcnQoZHkgPT0gbnVsbCB8fCBkeSBpbnN0YW5jZW9mIFRlbnNvciwgKCkgPT4gJ1RoZSBkeSBwYXNzZWQgaW4gdmFsdWVBbmRHcmFkcyhmKShhcmdzLCBkeSkgbXVzdCBiZSBhIHRlbnNvcicpO1xuICAgICAgICBjb25zdCByZXMgPSBFTkdJTkUuZ3JhZGllbnRzKCgpID0+IGYoLi4uYXJncyksIGFyZ3MsIGR5KTtcbiAgICAgICAgaWYgKGR5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHV0aWwuYXNzZXJ0U2hhcGVzTWF0Y2gocmVzLnZhbHVlLnNoYXBlLCBkeS5zaGFwZSwgJ1RoZSBzaGFwZSBvZiBkeSBwYXNzZWQgaW4gdmFsdWVBbmRHcmFkcyhmKShbeDEsLi4uXSwgZHkpIG11c3QgJyArXG4gICAgICAgICAgICAgICAgJ21hdGNoIHRoZSBzaGFwZSByZXR1cm5lZCBieSBmKFt4MSwuLi5dKScpO1xuICAgICAgICB9XG4gICAgICAgIGNoZWNrR3JhZHMocmVzLmdyYWRzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9O1xufVxuLyoqXG4gKiBDb21wdXRlcyBhbmQgcmV0dXJucyB0aGUgZ3JhZGllbnQgb2YgZih4KSB3aXRoIHJlc3BlY3QgdG8gdGhlIGxpc3Qgb2ZcbiAqIHRyYWluYWJsZSB2YXJpYWJsZXMgcHJvdmlkZWQgYnkgYHZhckxpc3RgLiBJZiBubyBsaXN0IGlzIHByb3ZpZGVkLCBpdFxuICogZGVmYXVsdHMgdG8gYWxsIHRyYWluYWJsZSB2YXJpYWJsZXMuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi52YXJpYWJsZSh0Zi50ZW5zb3IxZChbMywgNF0pKTtcbiAqIGNvbnN0IGIgPSB0Zi52YXJpYWJsZSh0Zi50ZW5zb3IxZChbNSwgNl0pKTtcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMl0pO1xuICpcbiAqIC8vIGYoYSwgYikgPSBhICogeCBeIDIgKyBiICogeFxuICogY29uc3QgZiA9ICgpID0+IGEubXVsKHguc3F1YXJlKCkpLmFkZChiLm11bCh4KSkuc3VtKCk7XG4gKiAvLyBkZi9kYSA9IHggXiAyLCBkZi9kYiA9IHhcbiAqIGNvbnN0IHt2YWx1ZSwgZ3JhZHN9ID0gdGYudmFyaWFibGVHcmFkcyhmKTtcbiAqXG4gKiBPYmplY3Qua2V5cyhncmFkcykuZm9yRWFjaCh2YXJOYW1lID0+IGdyYWRzW3Zhck5hbWVdLnByaW50KCkpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGYgVGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUuIGYoKSBzaG91bGQgcmV0dXJuIGEgc2NhbGFyLlxuICogQHBhcmFtIHZhckxpc3QgVGhlIGxpc3Qgb2YgdmFyaWFibGVzIHRvIGNvbXB1dGUgdGhlIGdyYWRpZW50cyB3aXRoIHJlc3BlY3RcbiAqICAgICB0by4gRGVmYXVsdHMgdG8gYWxsIHRyYWluYWJsZSB2YXJpYWJsZXMuXG4gKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIGtleXMgYW5kIHZhbHVlczpcbiAqICAgLSBgdmFsdWVgOiBUaGUgdmFsdWUgb2YgdGhlIGZ1bmN0aW9uIGBmYC5cbiAqICAgLSBgZ3JhZHNgOiBBIG1hcCBmcm9tIHRoZSBuYW1lcyBvZiB0aGUgdmFyaWFibGVzIHRvIHRoZSBncmFkaWVudHMuXG4gKiAgICAgSWYgdGhlIGB2YXJMaXN0YCBhcmd1bWVudCBpcyBwcm92aWRlZCBleHBsaWNpdGx5IGFuZCBjb250YWlucyBhIHN1YnNldCBvZlxuICogICAgIG5vbi10cmFpbmFibGUgdmFyaWFibGVzLCB0aGlzIG1hcCBpbiB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgY29udGFpbiBrZXlzXG4gKiAgICAgdGhhdCBtYXAgdGhlIG5hbWVzIG9mIHRoZSBub24tdHJhaW5hYmxlIHZhcmlhYmxlcyB0byBgbnVsbGAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0dyYWRpZW50cyd9XG4gKi9cbmZ1bmN0aW9uIHZhcmlhYmxlR3JhZHMoZiwgdmFyTGlzdCkge1xuICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNGdW5jdGlvbihmKSwgKCkgPT4gJ1RoZSBmIHBhc3NlZCBpbiB2YXJpYWJsZUdyYWRzKGYpIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgIHV0aWwuYXNzZXJ0KHZhckxpc3QgPT0gbnVsbCB8fFxuICAgICAgICBBcnJheS5pc0FycmF5KHZhckxpc3QpICYmIHZhckxpc3QuZXZlcnkodiA9PiB2IGluc3RhbmNlb2YgVmFyaWFibGUpLCAoKSA9PiAnVGhlIHZhckxpc3QgcGFzc2VkIGluIHZhcmlhYmxlR3JhZHMoZiwgdmFyTGlzdCkgbXVzdCBiZSBhbiBhcnJheSAnICtcbiAgICAgICAgJ29mIHZhcmlhYmxlcycpO1xuICAgIGNvbnN0IHNwZWNpZmllZFZhckxpc3QgPSB2YXJMaXN0ICE9IG51bGw7XG4gICAgaWYgKCFzcGVjaWZpZWRWYXJMaXN0KSB7XG4gICAgICAgIC8vIEdldCBhbGwgb2YgdGhlIHRyYWluYWJsZSB2YXJpYWJsZXMuXG4gICAgICAgIHZhckxpc3QgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCB2YXJOYW1lIGluIEVOR0lORS5yZWdpc3RlcmVkVmFyaWFibGVzKSB7XG4gICAgICAgICAgICB2YXJMaXN0LnB1c2goRU5HSU5FLnJlZ2lzdGVyZWRWYXJpYWJsZXNbdmFyTmFtZV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHNwZWNpZmllZE5vblRyYWluYWJsZSA9IHNwZWNpZmllZFZhckxpc3QgPyB2YXJMaXN0LmZpbHRlcih2YXJpYWJsZSA9PiAhdmFyaWFibGUudHJhaW5hYmxlKSA6IG51bGw7XG4gICAgLy8gUHJ1bmUgbm9uLXRyYWluYWJsZSB2YXJpYWJsZXMuXG4gICAgY29uc3Qgb3JpZ2luYWxWYXJDb3VudCA9IHZhckxpc3QubGVuZ3RoO1xuICAgIHZhckxpc3QgPSB2YXJMaXN0LmZpbHRlcih2YXJpYWJsZSA9PiB2YXJpYWJsZS50cmFpbmFibGUpO1xuICAgIHV0aWwuYXNzZXJ0KHZhckxpc3QubGVuZ3RoID4gMCwgKCkgPT4gYHZhcmlhYmxlR3JhZHMoKSBleHBlY3RzIGF0IGxlYXN0IG9uZSBvZiB0aGUgaW5wdXQgdmFyaWFibGVzIHRvIGAgK1xuICAgICAgICBgYmUgdHJhaW5hYmxlLCBidXQgbm9uZSBvZiB0aGUgJHtvcmlnaW5hbFZhckNvdW50fSB2YXJpYWJsZXMgaXMgYCArXG4gICAgICAgIGB0cmFpbmFibGUuYCk7XG4gICAgY29uc3QgYWxsb3dOb0dyYWRpZW50cyA9IHRydWU7XG4gICAgY29uc3QgeyB2YWx1ZSwgZ3JhZHMgfSA9IEVOR0lORS5ncmFkaWVudHMoZiwgdmFyTGlzdCwgbnVsbCwgYWxsb3dOb0dyYWRpZW50cyk7XG4gICAgdXRpbC5hc3NlcnQoZ3JhZHMuc29tZShnID0+IGcgIT0gbnVsbCksICgpID0+ICdDYW5ub3QgZmluZCBhIGNvbm5lY3Rpb24gYmV0d2VlbiBhbnkgdmFyaWFibGUgYW5kIHRoZSByZXN1bHQgb2YgJyArXG4gICAgICAgICd0aGUgbG9zcyBmdW5jdGlvbiB5PWYoeCkuIFBsZWFzZSBtYWtlIHN1cmUgdGhlIG9wZXJhdGlvbnMgdGhhdCAnICtcbiAgICAgICAgJ3VzZSB2YXJpYWJsZXMgYXJlIGluc2lkZSB0aGUgZnVuY3Rpb24gZiBwYXNzZWQgdG8gbWluaW1pemUoKS4nKTtcbiAgICB1dGlsLmFzc2VydCh2YWx1ZS5yYW5rID09PSAwLCAoKSA9PiBgVGhlIGYgcGFzc2VkIGluIHZhcmlhYmxlR3JhZHMoZikgbXVzdCByZXR1cm4gYSBzY2FsYXIsIGJ1dCBpdCBgICtcbiAgICAgICAgYHJldHVybmVkIGEgcmFuay0ke3ZhbHVlLnJhbmt9IHRlbnNvcmApO1xuICAgIGNvbnN0IG5hbWVkR3JhZHMgPSB7fTtcbiAgICB2YXJMaXN0LmZvckVhY2goKHYsIGkpID0+IHtcbiAgICAgICAgaWYgKGdyYWRzW2ldICE9IG51bGwpIHtcbiAgICAgICAgICAgIG5hbWVkR3JhZHNbdi5uYW1lXSA9IGdyYWRzW2ldO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHNwZWNpZmllZE5vblRyYWluYWJsZSAhPSBudWxsKSB7XG4gICAgICAgIC8vIElmIHZhckxpc3QgaXMgZXhwbGljaXRseSBwcm92aWRlZCBhbmQgY29udGFpbnMgbm9uLXRyYWluYWJsZSB2YWx1ZXMsXG4gICAgICAgIC8vIGFkZCB0aGVtIHRvIHRoZSByZXR1cm5lZCBncmFkaWVudHMgd2l0aCBgbnVsbGAgdmFsdWVzLlxuICAgICAgICBzcGVjaWZpZWROb25UcmFpbmFibGUuZm9yRWFjaCh2ID0+IG5hbWVkR3JhZHNbdi5uYW1lXSA9IG51bGwpO1xuICAgIH1cbiAgICByZXR1cm4geyB2YWx1ZSwgZ3JhZHM6IG5hbWVkR3JhZHMgfTtcbn1cbi8qKlxuICogT3ZlcnJpZGVzIHRoZSBncmFkaWVudCBjb21wdXRhdGlvbiBvZiBhIGZ1bmN0aW9uIGBmYC5cbiAqXG4gKiBUYWtlcyBhIGZ1bmN0aW9uXG4gKiBgZiguLi5pbnB1dHMsIHNhdmUpID0+IHt2YWx1ZTogVGVuc29yLCBncmFkRnVuYzogKGR5LCBzYXZlZCkgPT4gVGVuc29yW119YFxuICogYW5kIHJldHVybnMgYW5vdGhlciBmdW5jdGlvbiBgZyguLi5pbnB1dHMpYCB3aGljaCB0YWtlcyB0aGUgc2FtZSBpbnB1dHMgYXNcbiAqIGBmYC4gV2hlbiBjYWxsZWQsIGBnYCByZXR1cm5zIGBmKCkudmFsdWVgLiBJbiBiYWNrd2FyZCBtb2RlLCBjdXN0b20gZ3JhZGllbnRzXG4gKiB3aXRoIHJlc3BlY3QgdG8gZWFjaCBpbnB1dCBvZiBgZmAgYXJlIGNvbXB1dGVkIHVzaW5nIGBmKCkuZ3JhZEZ1bmNgLlxuICpcbiAqIFRoZSBgc2F2ZWAgZnVuY3Rpb24gcGFzc3NlZCB0byBgZmAgc2hvdWxkIGJlIHVzZWQgZm9yIHNhdmluZyB0ZW5zb3JzIG5lZWRlZFxuICogaW4gdGhlIGdyYWRpZW50LiBBbmQgdGhlIGBzYXZlZGAgcGFzc2VkIHRvIHRoZSBgZ3JhZEZ1bmNgIGlzIGFcbiAqIGBOYW1lZFRlbnNvck1hcGAsIHdoaWNoIGNvbnRhaW5zIHRob3NlIHNhdmVkIHRlbnNvci5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgY3VzdG9tT3AgPSB0Zi5jdXN0b21HcmFkKCh4LCBzYXZlKSA9PiB7XG4gKiAgIC8vIFNhdmUgeCB0byBtYWtlIHN1cmUgaXQncyBhdmFpbGFibGUgbGF0ZXIgZm9yIHRoZSBncmFkaWVudC5cbiAqICAgc2F2ZShbeF0pO1xuICogICAvLyBPdmVycmlkZSBncmFkaWVudCBvZiBvdXIgY3VzdG9tIHggXiAyIG9wIHRvIGJlIGR5ICogYWJzKHgpO1xuICogICByZXR1cm4ge1xuICogICAgIHZhbHVlOiB4LnNxdWFyZSgpLFxuICogICAgIC8vIE5vdGUgYHNhdmVkLnhgIHdoaWNoIHBvaW50cyB0byB0aGUgYHhgIHdlIHNhdmVkIGVhcmxpZXIuXG4gKiAgICAgZ3JhZEZ1bmM6IChkeSwgc2F2ZWQpID0+IFtkeS5tdWwoc2F2ZWRbMF0uYWJzKCkpXVxuICogICB9O1xuICogfSk7XG4gKlxuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFstMSwgLTIsIDNdKTtcbiAqIGNvbnN0IGR4ID0gdGYuZ3JhZCh4ID0+IGN1c3RvbU9wKHgpKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhgZih4KTpgKTtcbiAqIGN1c3RvbU9wKHgpLnByaW50KCk7XG4gKiBjb25zb2xlLmxvZyhgZicoeCk6YCk7XG4gKiBkeCh4KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGYgVGhlIGZ1bmN0aW9uIHRvIGV2YWx1YXRlIGluIGZvcndhcmQgbW9kZSwgd2hpY2ggc2hvdWxkIHJldHVyblxuICogICAgIGB7dmFsdWU6IFRlbnNvciwgZ3JhZEZ1bmM6IChkeSwgc2F2ZWQpID0+IFRlbnNvcltdfWAsIHdoZXJlIGBncmFkRnVuY2BcbiAqICAgICByZXR1cm5zIHRoZSBjdXN0b20gZ3JhZGllbnRzIG9mIGBmYCB3aXRoIHJlc3BlY3QgdG8gaXRzIGlucHV0cy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVHJhaW5pbmcnLCBzdWJoZWFkaW5nOiAnR3JhZGllbnRzJ31cbiAqL1xuZnVuY3Rpb24gY3VzdG9tR3JhZChmKSB7XG4gICAgcmV0dXJuIEVOR0lORS5jdXN0b21HcmFkKGYpO1xufVxuZnVuY3Rpb24gY2hlY2tHcmFkcyhncmFkcykge1xuICAgIGNvbnN0IG51bU51bGxHcmFkaWVudHMgPSBncmFkcy5maWx0ZXIoZyA9PiBnID09IG51bGwpLmxlbmd0aDtcbiAgICBpZiAobnVtTnVsbEdyYWRpZW50cyA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29tcHV0ZSBncmFkaWVudCBvZiB5PWYoeCkgd2l0aCByZXNwZWN0IHRvIHguIE1ha2Ugc3VyZSB0aGF0XG4gICAgdGhlIGYgeW91IHBhc3NlZCBlbmNsb3NlcyBhbGwgb3BlcmF0aW9ucyB0aGF0IGxlYWQgZnJvbSB4IHRvIHkuYCk7XG4gICAgfVxufVxuZXhwb3J0IHsgY3VzdG9tR3JhZCwgdmFyaWFibGVHcmFkcywgdmFsdWVBbmRHcmFkLCB2YWx1ZUFuZEdyYWRzLCBncmFkLCBncmFkcywgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdyYWRpZW50cy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vLyBXb3JrYXJvdW5kIGZvciBhbGxvd2luZyBjanMgbW9kdWxlIHRvIGJlIGluY2x1ZGVkIGluIGJ1bmRsZSBjcmVhdGVkIGJ5XG4vLyByb2xsdXAuXG5pbXBvcnQgKiBhcyBMb25nRXhwb3J0cyBmcm9tICdsb25nJztcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuY29uc3QgTG9uZyA9IFxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG5Mb25nRXhwb3J0cy5kZWZhdWx0IHx8IExvbmdFeHBvcnRzO1xuZXhwb3J0IGZ1bmN0aW9uIGhleFRvTG9uZyhoZXgpIHtcbiAgICByZXR1cm4gTG9uZy5mcm9tU3RyaW5nKGhleCwgdHJ1ZSwgMTYpO1xufVxuLy8gU29tZSBwcmltZXMgYmV0d2VlbiAyXjYzIGFuZCAyXjY0IGZvciB2YXJpb3VzIHVzZXMuXG4vLyBIZXggMHhjM2E1Yzg1Yzk3Y2IzMTI3XG5jb25zdCBrMCA9IGhleFRvTG9uZygnYzNhNWM4NWM5N2NiMzEyNycpO1xuLy8gSGV4IDB4YjQ5MmI2NmZiZTk4ZjI3M1xuY29uc3QgazEgPSBoZXhUb0xvbmcoJ2I0OTJiNjZmYmU5OGYyNzMnKTtcbi8vIEhleCAweDlhZTE2YTNiMmY5MDQwNGZcbmNvbnN0IGsyID0gaGV4VG9Mb25nKCc5YWUxNmEzYjJmOTA0MDRmJyk7XG5mdW5jdGlvbiBzaGlmdE1peCh2YWwpIHtcbiAgICByZXR1cm4gdmFsLnhvcih2YWwuc2hydSg0NykpO1xufVxuZnVuY3Rpb24gZmV0Y2gocywgb2Zmc2V0LCBudW1CeXRlcykge1xuICAgIGNvbnN0IGJ5dGVzID0gcy5zbGljZShvZmZzZXQsIG9mZnNldCArIG51bUJ5dGVzKTtcbiAgICByZXR1cm4gTG9uZy5mcm9tQnl0ZXMoQXJyYXkuZnJvbShieXRlcyksIHRydWUsIHRydWUpO1xufVxuZnVuY3Rpb24gZmV0Y2g2NChzLCBvZmZzZXQpIHtcbiAgICByZXR1cm4gZmV0Y2gocywgb2Zmc2V0LCA4KTtcbn1cbmZ1bmN0aW9uIGZldGNoMzIocywgb2Zmc2V0KSB7XG4gICAgcmV0dXJuIGZldGNoKHMsIG9mZnNldCwgNCk7XG59XG5mdW5jdGlvbiByb3RhdGU2NCh2YWwsIHNoaWZ0KSB7XG4gICAgLy8gQXZvaWQgc2hpZnRpbmcgYnkgNjQ6IGRvaW5nIHNvIHlpZWxkcyBhbiB1bmRlZmluZWQgcmVzdWx0LlxuICAgIHJldHVybiBzaGlmdCA9PT0gMCA/IHZhbCA6IHZhbC5zaHJ1KHNoaWZ0KS5vcih2YWwuc2hsKDY0IC0gc2hpZnQpKTtcbn1cbmZ1bmN0aW9uIGhhc2hMZW4xNih1LCB2LCBtdWwgPSBoZXhUb0xvbmcoJzlkZGZlYTA4ZWIzODJkNjknKSkge1xuICAgIC8vIE11cm11ci1pbnNwaXJlZCBoYXNoaW5nLlxuICAgIGxldCBhID0gdS54b3IodikubXVsKG11bCk7XG4gICAgYSA9IGEueG9yKGEuc2hydSg0NykpO1xuICAgIGxldCBiID0gdi54b3IoYSkubXVsKG11bCk7XG4gICAgYiA9IGIueG9yKGIuc2hydSg0NykpO1xuICAgIGIgPSBiLm11bChtdWwpO1xuICAgIHJldHVybiBiO1xufVxuLy8gUmV0dXJuIGEgMTYtYnl0ZSBoYXNoIGZvciA0OCBieXRlcy4gIFF1aWNrIGFuZCBkaXJ0eS5cbi8vIENhbGxlcnMgZG8gYmVzdCB0byB1c2UgXCJyYW5kb20tbG9va2luZ1wiIHZhbHVlcyBmb3IgYSBhbmQgYi5cbmZ1bmN0aW9uIHdlYWtIYXNoTGVuMzJXaXRoU2VlZHModywgeCwgeSwgeiwgYSwgYikge1xuICAgIGEgPSBhLmFkZCh3KTtcbiAgICBiID0gcm90YXRlNjQoYi5hZGQoYSkuYWRkKHopLCAyMSk7XG4gICAgY29uc3QgYyA9IGE7XG4gICAgYSA9IGEuYWRkKHgpO1xuICAgIGEgPSBhLmFkZCh5KTtcbiAgICBiID0gYi5hZGQocm90YXRlNjQoYSwgNDQpKTtcbiAgICByZXR1cm4gW2EuYWRkKHopLCBiLmFkZChjKV07XG59XG5mdW5jdGlvbiB3ZWFrSGFzaExlbjMyV2l0aFNlZWRzU3RyKHMsIG9mZnNldCwgYSwgYikge1xuICAgIHJldHVybiB3ZWFrSGFzaExlbjMyV2l0aFNlZWRzKGZldGNoNjQocywgb2Zmc2V0KSwgZmV0Y2g2NChzLCBvZmZzZXQgKyA4KSwgZmV0Y2g2NChzLCBvZmZzZXQgKyAxNiksIGZldGNoNjQocywgb2Zmc2V0ICsgMjQpLCBhLCBiKTtcbn1cbmZ1bmN0aW9uIGhhc2hMZW4wdG8xNihzLCBsZW4gPSBzLmxlbmd0aCkge1xuICAgIGlmIChsZW4gPj0gOCkge1xuICAgICAgICBjb25zdCBtdWwgPSBrMi5hZGQobGVuICogMik7XG4gICAgICAgIGNvbnN0IGEgPSBmZXRjaDY0KHMsIDApLmFkZChrMik7XG4gICAgICAgIGNvbnN0IGIgPSBmZXRjaDY0KHMsIGxlbiAtIDgpO1xuICAgICAgICBjb25zdCBjID0gcm90YXRlNjQoYiwgMzcpLm11bChtdWwpLmFkZChhKTtcbiAgICAgICAgY29uc3QgZCA9IHJvdGF0ZTY0KGEsIDI1KS5hZGQoYikubXVsKG11bCk7XG4gICAgICAgIHJldHVybiBoYXNoTGVuMTYoYywgZCwgbXVsKTtcbiAgICB9XG4gICAgaWYgKGxlbiA+PSA0KSB7XG4gICAgICAgIGNvbnN0IG11bCA9IGsyLmFkZChsZW4gKiAyKTtcbiAgICAgICAgY29uc3QgYSA9IGZldGNoMzIocywgMCk7XG4gICAgICAgIHJldHVybiBoYXNoTGVuMTYoYS5zaGwoMykuYWRkKGxlbiksIGZldGNoMzIocywgbGVuIC0gNCksIG11bCk7XG4gICAgfVxuICAgIGlmIChsZW4gPiAwKSB7XG4gICAgICAgIGNvbnN0IGEgPSBzWzBdO1xuICAgICAgICBjb25zdCBiID0gc1tsZW4gPj4gMV07XG4gICAgICAgIGNvbnN0IGMgPSBzW2xlbiAtIDFdO1xuICAgICAgICBjb25zdCB5ID0gYSArIChiIDw8IDgpO1xuICAgICAgICBjb25zdCB6ID0gbGVuICsgKGMgPDwgMik7XG4gICAgICAgIHJldHVybiBzaGlmdE1peChrMi5tdWwoeSkueG9yKGswLm11bCh6KSkpLm11bChrMik7XG4gICAgfVxuICAgIHJldHVybiBrMjtcbn1cbmZ1bmN0aW9uIGhhc2hMZW4xN3RvMzIocywgbGVuID0gcy5sZW5ndGgpIHtcbiAgICBjb25zdCBtdWwgPSBrMi5hZGQobGVuICogMik7XG4gICAgY29uc3QgYSA9IGZldGNoNjQocywgMCkubXVsKGsxKTtcbiAgICBjb25zdCBiID0gZmV0Y2g2NChzLCA4KTtcbiAgICBjb25zdCBjID0gZmV0Y2g2NChzLCBsZW4gLSA4KS5tdWwobXVsKTtcbiAgICBjb25zdCBkID0gZmV0Y2g2NChzLCBsZW4gLSAxNikubXVsKGsyKTtcbiAgICByZXR1cm4gaGFzaExlbjE2KHJvdGF0ZTY0KGEuYWRkKGIpLCA0MykuYWRkKHJvdGF0ZTY0KGMsIDMwKSkuYWRkKGQpLCBhLmFkZChyb3RhdGU2NChiLmFkZChrMiksIDE4KSkuYWRkKGMpLCBtdWwpO1xufVxuZnVuY3Rpb24gaGFzaExlbjMzdG82NChzLCBsZW4gPSBzLmxlbmd0aCkge1xuICAgIGNvbnN0IG11bCA9IGsyLmFkZChsZW4gKiAyKTtcbiAgICBjb25zdCBhID0gZmV0Y2g2NChzLCAwKS5tdWwoazIpO1xuICAgIGNvbnN0IGIgPSBmZXRjaDY0KHMsIDgpO1xuICAgIGNvbnN0IGMgPSBmZXRjaDY0KHMsIGxlbiAtIDgpLm11bChtdWwpO1xuICAgIGNvbnN0IGQgPSBmZXRjaDY0KHMsIGxlbiAtIDE2KS5tdWwoazIpO1xuICAgIGNvbnN0IHkgPSByb3RhdGU2NChhLmFkZChiKSwgNDMpLmFkZChyb3RhdGU2NChjLCAzMCkpLmFkZChkKTtcbiAgICBjb25zdCB6ID0gaGFzaExlbjE2KHksIGEuYWRkKHJvdGF0ZTY0KGIuYWRkKGsyKSwgMTgpKS5hZGQoYyksIG11bCk7XG4gICAgY29uc3QgZSA9IGZldGNoNjQocywgMTYpLm11bChtdWwpO1xuICAgIGNvbnN0IGYgPSBmZXRjaDY0KHMsIDI0KTtcbiAgICBjb25zdCBnID0geS5hZGQoZmV0Y2g2NChzLCBsZW4gLSAzMikpLm11bChtdWwpO1xuICAgIGNvbnN0IGggPSB6LmFkZChmZXRjaDY0KHMsIGxlbiAtIDI0KSkubXVsKG11bCk7XG4gICAgcmV0dXJuIGhhc2hMZW4xNihyb3RhdGU2NChlLmFkZChmKSwgNDMpLmFkZChyb3RhdGU2NChnLCAzMCkpLmFkZChoKSwgZS5hZGQocm90YXRlNjQoZi5hZGQoYSksIDE4KSkuYWRkKGcpLCBtdWwpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZpbmdlclByaW50NjQocywgbGVuID0gcy5sZW5ndGgpIHtcbiAgICBjb25zdCBzZWVkID0gTG9uZy5mcm9tTnVtYmVyKDgxLCB0cnVlKTtcbiAgICBpZiAobGVuIDw9IDMyKSB7XG4gICAgICAgIGlmIChsZW4gPD0gMTYpIHtcbiAgICAgICAgICAgIHJldHVybiBoYXNoTGVuMHRvMTYocywgbGVuKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBoYXNoTGVuMTd0bzMyKHMsIGxlbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAobGVuIDw9IDY0KSB7XG4gICAgICAgIHJldHVybiBoYXNoTGVuMzN0bzY0KHMsIGxlbik7XG4gICAgfVxuICAgIC8vIEZvciBzdHJpbmdzIG92ZXIgNjQgYnl0ZXMgd2UgbG9vcC4gIEludGVybmFsIHN0YXRlIGNvbnNpc3RzIG9mXG4gICAgLy8gNTYgYnl0ZXM6IHYsIHcsIHgsIHksIGFuZCB6LlxuICAgIGxldCB4ID0gc2VlZDtcbiAgICBsZXQgeSA9IHNlZWQubXVsKGsxKS5hZGQoMTEzKTtcbiAgICBsZXQgeiA9IHNoaWZ0TWl4KHkubXVsKGsyKS5hZGQoMTEzKSkubXVsKGsyKTtcbiAgICBsZXQgdiA9IFtMb25nLlVaRVJPLCBMb25nLlVaRVJPXTtcbiAgICBsZXQgdyA9IFtMb25nLlVaRVJPLCBMb25nLlVaRVJPXTtcbiAgICB4ID0geC5tdWwoazIpLmFkZChmZXRjaDY0KHMsIDApKTtcbiAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICAvLyBTZXQgZW5kIHNvIHRoYXQgYWZ0ZXIgdGhlIGxvb3Agd2UgaGF2ZSAxIHRvIDY0IGJ5dGVzIGxlZnQgdG8gcHJvY2Vzcy5cbiAgICBjb25zdCBlbmQgPSAoKGxlbiAtIDEpID4+IDYpICogNjQ7XG4gICAgY29uc3QgbGFzdDY0ID0gZW5kICsgKChsZW4gLSAxKSAmIDYzKSAtIDYzO1xuICAgIGRvIHtcbiAgICAgICAgeCA9IHJvdGF0ZTY0KHguYWRkKHkpLmFkZCh2WzBdKS5hZGQoZmV0Y2g2NChzLCBvZmZzZXQgKyA4KSksIDM3KS5tdWwoazEpO1xuICAgICAgICB5ID0gcm90YXRlNjQoeS5hZGQodlsxXSkuYWRkKGZldGNoNjQocywgb2Zmc2V0ICsgNDgpKSwgNDIpLm11bChrMSk7XG4gICAgICAgIHggPSB4Lnhvcih3WzFdKTtcbiAgICAgICAgeSA9IHkuYWRkKHZbMF0pLmFkZChmZXRjaDY0KHMsIG9mZnNldCArIDQwKSk7XG4gICAgICAgIHogPSByb3RhdGU2NCh6LmFkZCh3WzBdKSwgMzMpLm11bChrMSk7XG4gICAgICAgIHYgPSB3ZWFrSGFzaExlbjMyV2l0aFNlZWRzU3RyKHMsIG9mZnNldCwgdlsxXS5tdWwoazEpLCB4LmFkZCh3WzBdKSk7XG4gICAgICAgIHcgPSB3ZWFrSGFzaExlbjMyV2l0aFNlZWRzU3RyKHMsIG9mZnNldCArIDMyLCB6LmFkZCh3WzFdKSwgeS5hZGQoZmV0Y2g2NChzLCBvZmZzZXQgKyAxNikpKTtcbiAgICAgICAgW3osIHhdID0gW3gsIHpdO1xuICAgICAgICBvZmZzZXQgKz0gNjQ7XG4gICAgfSB3aGlsZSAob2Zmc2V0ICE9PSBlbmQpO1xuICAgIGNvbnN0IG11bCA9IGsxLmFkZCh6LmFuZCgweGZmKS5zaGwoMSkpO1xuICAgIC8vIFBvaW50IHRvIHRoZSBsYXN0IDY0IGJ5dGVzIG9mIGlucHV0LlxuICAgIG9mZnNldCA9IGxhc3Q2NDtcbiAgICB3WzBdID0gd1swXS5hZGQoKGxlbiAtIDEpICYgNjMpO1xuICAgIHZbMF0gPSB2WzBdLmFkZCh3WzBdKTtcbiAgICB3WzBdID0gd1swXS5hZGQodlswXSk7XG4gICAgeCA9IHJvdGF0ZTY0KHguYWRkKHkpLmFkZCh2WzBdKS5hZGQoZmV0Y2g2NChzLCBvZmZzZXQgKyA4KSksIDM3KS5tdWwobXVsKTtcbiAgICB5ID0gcm90YXRlNjQoeS5hZGQodlsxXSkuYWRkKGZldGNoNjQocywgb2Zmc2V0ICsgNDgpKSwgNDIpLm11bChtdWwpO1xuICAgIHggPSB4Lnhvcih3WzFdLm11bCg5KSk7XG4gICAgeSA9IHkuYWRkKHZbMF0ubXVsKDkpLmFkZChmZXRjaDY0KHMsIG9mZnNldCArIDQwKSkpO1xuICAgIHogPSByb3RhdGU2NCh6LmFkZCh3WzBdKSwgMzMpLm11bChtdWwpO1xuICAgIHYgPSB3ZWFrSGFzaExlbjMyV2l0aFNlZWRzU3RyKHMsIG9mZnNldCwgdlsxXS5tdWwobXVsKSwgeC5hZGQod1swXSkpO1xuICAgIHcgPSB3ZWFrSGFzaExlbjMyV2l0aFNlZWRzU3RyKHMsIG9mZnNldCArIDMyLCB6LmFkZCh3WzFdKSwgeS5hZGQoZmV0Y2g2NChzLCBvZmZzZXQgKyAxNikpKTtcbiAgICBbeiwgeF0gPSBbeCwgel07XG4gICAgcmV0dXJuIGhhc2hMZW4xNihoYXNoTGVuMTYodlswXSwgd1swXSwgbXVsKS5hZGQoc2hpZnRNaXgoeSkubXVsKGswKSkuYWRkKHopLCBoYXNoTGVuMTYodlsxXSwgd1sxXSwgbXVsKS5hZGQoeCksIG11bCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1oYXNoX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLy8gUmVxdWlyZWQgc2lkZSBlZmZlY3RmdWwgY29kZS5cbmltcG9ydCAnLi9iYXNlX3NpZGVfZWZmZWN0cyc7XG4vLyBBbGwgZXhwb3J0cyBmcm9tIHRoaXMgcGFja2FnZSBzaG91bGQgYmUgaW4gYmFzZS5cbmV4cG9ydCAqIGZyb20gJy4vYmFzZSc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vKipcbiAqIElPSGFuZGxlcnMgcmVsYXRlZCB0byBmaWxlcywgc3VjaCBhcyBicm93c2VyLXRyaWdnZXJlZCBmaWxlIGRvd25sb2FkcyxcbiAqIHVzZXItc2VsZWN0ZWQgZmlsZXMgaW4gYnJvd3Nlci5cbiAqL1xuaW1wb3J0ICcuLi9mbGFncyc7XG5pbXBvcnQgeyBlbnYgfSBmcm9tICcuLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBiYXNlbmFtZSwgY29uY2F0ZW5hdGVBcnJheUJ1ZmZlcnMsIGdldE1vZGVsQXJ0aWZhY3RzRm9ySlNPTiwgZ2V0TW9kZWxBcnRpZmFjdHNJbmZvRm9ySlNPTiwgZ2V0TW9kZWxKU09ORm9yTW9kZWxBcnRpZmFjdHMgfSBmcm9tICcuL2lvX3V0aWxzJztcbmltcG9ydCB7IElPUm91dGVyUmVnaXN0cnkgfSBmcm9tICcuL3JvdXRlcl9yZWdpc3RyeSc7XG5jb25zdCBERUZBVUxUX0ZJTEVfTkFNRV9QUkVGSVggPSAnbW9kZWwnO1xuY29uc3QgREVGQVVMVF9KU09OX0VYVEVOU0lPTl9OQU1FID0gJy5qc29uJztcbmNvbnN0IERFRkFVTFRfV0VJR0hUX0RBVEFfRVhURU5TSU9OX05BTUUgPSAnLndlaWdodHMuYmluJztcbmZ1bmN0aW9uIGRlZmVyKGYpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUpKS50aGVuKGYpO1xufVxuZXhwb3J0IGNsYXNzIEJyb3dzZXJEb3dubG9hZHMge1xuICAgIGNvbnN0cnVjdG9yKGZpbGVOYW1lUHJlZml4KSB7XG4gICAgICAgIGlmICghZW52KCkuZ2V0Qm9vbCgnSVNfQlJPV1NFUicpKSB7XG4gICAgICAgICAgICAvLyBUT0RPKGNhaXMpOiBQcm92aWRlIGluZm8gb24gd2hhdCBJT0hhbmRsZXJzIGFyZSBhdmFpbGFibGUgdW5kZXIgdGhlXG4gICAgICAgICAgICAvLyAgIGN1cnJlbnQgZW52aXJvbm1lbnQuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Jyb3dzZXJEb3dubG9hZHMoKSBjYW5ub3QgcHJvY2VlZCBiZWNhdXNlIHRoZSBjdXJyZW50IGVudmlyb25tZW50ICcgK1xuICAgICAgICAgICAgICAgICdpcyBub3QgYSBicm93c2VyLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWxlTmFtZVByZWZpeC5zdGFydHNXaXRoKEJyb3dzZXJEb3dubG9hZHMuVVJMX1NDSEVNRSkpIHtcbiAgICAgICAgICAgIGZpbGVOYW1lUHJlZml4ID0gZmlsZU5hbWVQcmVmaXguc2xpY2UoQnJvd3NlckRvd25sb2Fkcy5VUkxfU0NIRU1FLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbGVOYW1lUHJlZml4ID09IG51bGwgfHwgZmlsZU5hbWVQcmVmaXgubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBmaWxlTmFtZVByZWZpeCA9IERFRkFVTFRfRklMRV9OQU1FX1BSRUZJWDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1vZGVsSnNvbkZpbGVOYW1lID0gZmlsZU5hbWVQcmVmaXggKyBERUZBVUxUX0pTT05fRVhURU5TSU9OX05BTUU7XG4gICAgICAgIHRoaXMud2VpZ2h0RGF0YUZpbGVOYW1lID1cbiAgICAgICAgICAgIGZpbGVOYW1lUHJlZml4ICsgREVGQVVMVF9XRUlHSFRfREFUQV9FWFRFTlNJT05fTkFNRTtcbiAgICB9XG4gICAgYXN5bmMgc2F2ZShtb2RlbEFydGlmYWN0cykge1xuICAgICAgICBpZiAodHlwZW9mIChkb2N1bWVudCkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Jyb3dzZXIgZG93bmxvYWRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICcgK1xuICAgICAgICAgICAgICAgICd0aGlzIGVudmlyb25tZW50IHNpbmNlIGBkb2N1bWVudGAgaXMgbm90IHByZXNlbnQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB3ZWlnaHRzVVJMID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW21vZGVsQXJ0aWZhY3RzLndlaWdodERhdGFdLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nIH0pKTtcbiAgICAgICAgaWYgKG1vZGVsQXJ0aWZhY3RzLm1vZGVsVG9wb2xvZ3kgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCcm93c2VyRG93bmxvYWRzLnNhdmUoKSBkb2VzIG5vdCBzdXBwb3J0IHNhdmluZyBtb2RlbCB0b3BvbG9neSAnICtcbiAgICAgICAgICAgICAgICAnaW4gYmluYXJ5IGZvcm1hdHMgeWV0LicpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgd2VpZ2h0c01hbmlmZXN0ID0gW3tcbiAgICAgICAgICAgICAgICAgICAgcGF0aHM6IFsnLi8nICsgdGhpcy53ZWlnaHREYXRhRmlsZU5hbWVdLFxuICAgICAgICAgICAgICAgICAgICB3ZWlnaHRzOiBtb2RlbEFydGlmYWN0cy53ZWlnaHRTcGVjc1xuICAgICAgICAgICAgICAgIH1dO1xuICAgICAgICAgICAgY29uc3QgbW9kZWxKU09OID0gZ2V0TW9kZWxKU09ORm9yTW9kZWxBcnRpZmFjdHMobW9kZWxBcnRpZmFjdHMsIHdlaWdodHNNYW5pZmVzdCk7XG4gICAgICAgICAgICBjb25zdCBtb2RlbEpzb25VUkwgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkobW9kZWxKU09OKV0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nIH0pKTtcbiAgICAgICAgICAgIC8vIElmIGFuY2hvciBlbGVtZW50cyBhcmUgbm90IHByb3ZpZGVkLCBjcmVhdGUgdGhlbSB3aXRob3V0IGF0dGFjaGluZyB0aGVtXG4gICAgICAgICAgICAvLyB0byBwYXJlbnRzLCBzbyB0aGF0IHRoZSBkb3dubG9hZGVkIGZpbGUgbmFtZXMgY2FuIGJlIGNvbnRyb2xsZWQuXG4gICAgICAgICAgICBjb25zdCBqc29uQW5jaG9yID0gdGhpcy5tb2RlbEpzb25BbmNob3IgPT0gbnVsbCA/XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpIDpcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsSnNvbkFuY2hvcjtcbiAgICAgICAgICAgIGpzb25BbmNob3IuZG93bmxvYWQgPSB0aGlzLm1vZGVsSnNvbkZpbGVOYW1lO1xuICAgICAgICAgICAganNvbkFuY2hvci5ocmVmID0gbW9kZWxKc29uVVJMO1xuICAgICAgICAgICAgLy8gVHJpZ2dlciBkb3dubG9hZHMgYnkgZXZva2luZyBhIGNsaWNrIGV2ZW50IG9uIHRoZSBkb3dubG9hZCBhbmNob3JzLlxuICAgICAgICAgICAgLy8gV2hlbiBtdWx0aXBsZSBkb3dubG9hZHMgYXJlIHN0YXJ0ZWQgc3luY2hyb25vdXNseSwgRmlyZWZveCB3aWxsIG9ubHlcbiAgICAgICAgICAgIC8vIHNhdmUgdGhlIGxhc3Qgb25lLlxuICAgICAgICAgICAgYXdhaXQgZGVmZXIoKCkgPT4ganNvbkFuY2hvci5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KCdjbGljaycpKSk7XG4gICAgICAgICAgICBpZiAobW9kZWxBcnRpZmFjdHMud2VpZ2h0RGF0YSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2VpZ2h0RGF0YUFuY2hvciA9IHRoaXMud2VpZ2h0RGF0YUFuY2hvciA9PSBudWxsID9cbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpIDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53ZWlnaHREYXRhQW5jaG9yO1xuICAgICAgICAgICAgICAgIHdlaWdodERhdGFBbmNob3IuZG93bmxvYWQgPSB0aGlzLndlaWdodERhdGFGaWxlTmFtZTtcbiAgICAgICAgICAgICAgICB3ZWlnaHREYXRhQW5jaG9yLmhyZWYgPSB3ZWlnaHRzVVJMO1xuICAgICAgICAgICAgICAgIGF3YWl0IGRlZmVyKCgpID0+IHdlaWdodERhdGFBbmNob3IuZGlzcGF0Y2hFdmVudChuZXcgTW91c2VFdmVudCgnY2xpY2snKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgbW9kZWxBcnRpZmFjdHNJbmZvOiBnZXRNb2RlbEFydGlmYWN0c0luZm9Gb3JKU09OKG1vZGVsQXJ0aWZhY3RzKSB9O1xuICAgICAgICB9XG4gICAgfVxufVxuQnJvd3NlckRvd25sb2Fkcy5VUkxfU0NIRU1FID0gJ2Rvd25sb2FkczovLyc7XG5jbGFzcyBCcm93c2VyRmlsZXMge1xuICAgIGNvbnN0cnVjdG9yKGZpbGVzKSB7XG4gICAgICAgIGlmIChmaWxlcyA9PSBudWxsIHx8IGZpbGVzLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgV2hlbiBjYWxsaW5nIGJyb3dzZXJGaWxlcywgYXQgbGVhc3QgMSBmaWxlIGlzIHJlcXVpcmVkLCBgICtcbiAgICAgICAgICAgICAgICBgYnV0IHJlY2VpdmVkICR7ZmlsZXN9YCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5qc29uRmlsZSA9IGZpbGVzWzBdO1xuICAgICAgICB0aGlzLndlaWdodHNGaWxlcyA9IGZpbGVzLnNsaWNlKDEpO1xuICAgIH1cbiAgICBhc3luYyBsb2FkKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QganNvblJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgICAgICBqc29uUmVhZGVyLm9ubG9hZCA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICAgICAgICAgICAgICBjb25zdCBtb2RlbEpTT04gPSBKU09OLnBhcnNlKGV2ZW50LnRhcmdldC5yZXN1bHQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1vZGVsVG9wb2xvZ3kgPSBtb2RlbEpTT04ubW9kZWxUb3BvbG9neTtcbiAgICAgICAgICAgICAgICBpZiAobW9kZWxUb3BvbG9neSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYG1vZGVsVG9wb2xvZ3kgZmllbGQgaXMgbWlzc2luZyBmcm9tIGZpbGUgJHt0aGlzLmpzb25GaWxlLm5hbWV9YCkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHdlaWdodHNNYW5pZmVzdCA9IG1vZGVsSlNPTi53ZWlnaHRzTWFuaWZlc3Q7XG4gICAgICAgICAgICAgICAgaWYgKHdlaWdodHNNYW5pZmVzdCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYHdlaWdodE1hbmlmZXN0IGZpZWxkIGlzIG1pc3NpbmcgZnJvbSBmaWxlICR7dGhpcy5qc29uRmlsZS5uYW1lfWApKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy53ZWlnaHRzRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoeyBtb2RlbFRvcG9sb2d5IH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG1vZGVsQXJ0aWZhY3RzUHJvbWlzZSA9IGdldE1vZGVsQXJ0aWZhY3RzRm9ySlNPTihtb2RlbEpTT04sICh3ZWlnaHRzTWFuaWZlc3QpID0+IHRoaXMubG9hZFdlaWdodHMod2VpZ2h0c01hbmlmZXN0KSk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShtb2RlbEFydGlmYWN0c1Byb21pc2UpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGpzb25SZWFkZXIub25lcnJvciA9IGVycm9yID0+IHJlamVjdChgRmFpbGVkIHRvIHJlYWQgbW9kZWwgdG9wb2xvZ3kgYW5kIHdlaWdodHMgbWFuaWZlc3QgSlNPTiBgICtcbiAgICAgICAgICAgICAgICBgZnJvbSBmaWxlICcke3RoaXMuanNvbkZpbGUubmFtZX0nLiBCcm93c2VyRmlsZXMgc3VwcG9ydHMgbG9hZGluZyBgICtcbiAgICAgICAgICAgICAgICBgS2VyYXMtc3R5bGUgdGYuTW9kZWwgYXJ0aWZhY3RzIG9ubHkuYCk7XG4gICAgICAgICAgICBqc29uUmVhZGVyLnJlYWRBc1RleHQodGhpcy5qc29uRmlsZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBsb2FkV2VpZ2h0cyh3ZWlnaHRzTWFuaWZlc3QpIHtcbiAgICAgICAgY29uc3Qgd2VpZ2h0U3BlY3MgPSBbXTtcbiAgICAgICAgY29uc3QgcGF0aHMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiB3ZWlnaHRzTWFuaWZlc3QpIHtcbiAgICAgICAgICAgIHdlaWdodFNwZWNzLnB1c2goLi4uZW50cnkud2VpZ2h0cyk7XG4gICAgICAgICAgICBwYXRocy5wdXNoKC4uLmVudHJ5LnBhdGhzKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXRoVG9GaWxlID0gdGhpcy5jaGVja01hbmlmZXN0QW5kV2VpZ2h0RmlsZXMod2VpZ2h0c01hbmlmZXN0KTtcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBwYXRocy5tYXAocGF0aCA9PiB0aGlzLmxvYWRXZWlnaHRzRmlsZShwYXRoLCBwYXRoVG9GaWxlW3BhdGhdKSk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbihidWZmZXJzID0+IFt3ZWlnaHRTcGVjcywgY29uY2F0ZW5hdGVBcnJheUJ1ZmZlcnMoYnVmZmVycyldKTtcbiAgICB9XG4gICAgbG9hZFdlaWdodHNGaWxlKHBhdGgsIGZpbGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHdlaWdodEZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICAgICAgd2VpZ2h0RmlsZVJlYWRlci5vbmxvYWQgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgICAgICAgICAgICAgY29uc3Qgd2VpZ2h0RGF0YSA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh3ZWlnaHREYXRhKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB3ZWlnaHRGaWxlUmVhZGVyLm9uZXJyb3IgPSBlcnJvciA9PiByZWplY3QoYEZhaWxlZCB0byB3ZWlnaHRzIGRhdGEgZnJvbSBmaWxlIG9mIHBhdGggJyR7cGF0aH0nLmApO1xuICAgICAgICAgICAgd2VpZ2h0RmlsZVJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihmaWxlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrIHRoZSBjb21wYXRpYmlsaXR5IGJldHdlZW4gd2VpZ2h0cyBtYW5pZmVzdCBhbmQgd2VpZ2h0IGZpbGVzLlxuICAgICAqL1xuICAgIGNoZWNrTWFuaWZlc3RBbmRXZWlnaHRGaWxlcyhtYW5pZmVzdCkge1xuICAgICAgICBjb25zdCBiYXNlbmFtZXMgPSBbXTtcbiAgICAgICAgY29uc3QgZmlsZU5hbWVzID0gdGhpcy53ZWlnaHRzRmlsZXMubWFwKGZpbGUgPT4gYmFzZW5hbWUoZmlsZS5uYW1lKSk7XG4gICAgICAgIGNvbnN0IHBhdGhUb0ZpbGUgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBncm91cCBvZiBtYW5pZmVzdCkge1xuICAgICAgICAgICAgZ3JvdXAucGF0aHMuZm9yRWFjaChwYXRoID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRoQmFzZW5hbWUgPSBiYXNlbmFtZShwYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoYmFzZW5hbWVzLmluZGV4T2YocGF0aEJhc2VuYW1lKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEdXBsaWNhdGUgZmlsZSBiYXNlbmFtZSBmb3VuZCBpbiB3ZWlnaHRzIG1hbmlmZXN0OiBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAnJHtwYXRoQmFzZW5hbWV9J2ApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBiYXNlbmFtZXMucHVzaChwYXRoQmFzZW5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChmaWxlTmFtZXMuaW5kZXhPZihwYXRoQmFzZW5hbWUpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFdlaWdodCBmaWxlIHdpdGggYmFzZW5hbWUgJyR7cGF0aEJhc2VuYW1lfScgaXMgbm90IHByb3ZpZGVkLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcGF0aFRvRmlsZVtwYXRoXSA9IHRoaXMud2VpZ2h0c0ZpbGVzW2ZpbGVOYW1lcy5pbmRleE9mKHBhdGhCYXNlbmFtZSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiYXNlbmFtZXMubGVuZ3RoICE9PSB0aGlzLndlaWdodHNGaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzbWF0Y2ggaW4gdGhlIG51bWJlciBvZiBmaWxlcyBpbiB3ZWlnaHRzIG1hbmlmZXN0IGAgK1xuICAgICAgICAgICAgICAgIGAoJHtiYXNlbmFtZXMubGVuZ3RofSkgYW5kIHRoZSBudW1iZXIgb2Ygd2VpZ2h0IGZpbGVzIHByb3ZpZGVkIGAgK1xuICAgICAgICAgICAgICAgIGAoJHt0aGlzLndlaWdodHNGaWxlcy5sZW5ndGh9KS5gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF0aFRvRmlsZTtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgYnJvd3NlckRvd25sb2Fkc1JvdXRlciA9ICh1cmwpID0+IHtcbiAgICBpZiAoIWVudigpLmdldEJvb2woJ0lTX0JST1dTRVInKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh1cmwpICYmIHVybC5zdGFydHNXaXRoKEJyb3dzZXJEb3dubG9hZHMuVVJMX1NDSEVNRSkpIHtcbiAgICAgICAgICAgIHJldHVybiBicm93c2VyRG93bmxvYWRzKHVybC5zbGljZShCcm93c2VyRG93bmxvYWRzLlVSTF9TQ0hFTUUubGVuZ3RoKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn07XG5JT1JvdXRlclJlZ2lzdHJ5LnJlZ2lzdGVyU2F2ZVJvdXRlcihicm93c2VyRG93bmxvYWRzUm91dGVyKTtcbi8qKlxuICogQ3JlYXRlcyBhbiBJT0hhbmRsZXIgdGhhdCB0cmlnZ2VycyBmaWxlIGRvd25sb2FkcyBmcm9tIHRoZSBicm93c2VyLlxuICpcbiAqIFRoZSByZXR1cm5lZCBgSU9IYW5kbGVyYCBpbnN0YW5jZSBjYW4gYmUgdXNlZCBhcyBtb2RlbCBleHBvcnRpbmcgbWV0aG9kcyBzdWNoXG4gKiBhcyBgdGYuTW9kZWwuc2F2ZWAgYW5kIHN1cHBvcnRzIG9ubHkgc2F2aW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtb2RlbCA9IHRmLnNlcXVlbnRpYWwoKTtcbiAqIG1vZGVsLmFkZCh0Zi5sYXllcnMuZGVuc2UoXG4gKiAgICAge3VuaXRzOiAxLCBpbnB1dFNoYXBlOiBbMTBdLCBhY3RpdmF0aW9uOiAnc2lnbW9pZCd9KSk7XG4gKiBjb25zdCBzYXZlUmVzdWx0ID0gYXdhaXQgbW9kZWwuc2F2ZSgnZG93bmxvYWRzOi8vbXltb2RlbCcpO1xuICogLy8gVGhpcyB3aWxsIHRyaWdnZXIgZG93bmxvYWRpbmcgb2YgdHdvIGZpbGVzOlxuICogLy8gICAnbXltb2RlbC5qc29uJyBhbmQgJ215bW9kZWwud2VpZ2h0cy5iaW4nLlxuICogY29uc29sZS5sb2coc2F2ZVJlc3VsdCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gZmlsZU5hbWVQcmVmaXggUHJlZml4IG5hbWUgb2YgdGhlIGZpbGVzIHRvIGJlIGRvd25sb2FkZWQuIEZvciB1c2Ugd2l0aFxuICogICBgdGYuTW9kZWxgLCBgZmlsZU5hbWVQcmVmaXhgIHNob3VsZCBmb2xsb3cgZWl0aGVyIG9mIHRoZSBmb2xsb3dpbmcgdHdvXG4gKiAgIGZvcm1hdHM6XG4gKiAgIDEuIGBudWxsYCBvciBgdW5kZWZpbmVkYCwgaW4gd2hpY2ggY2FzZSB0aGUgZGVmYXVsdCBmaWxlXG4gKiAgICAgIG5hbWVzIHdpbGwgYmUgdXNlZDpcbiAqICAgICAgLSAnbW9kZWwuanNvbicgZm9yIHRoZSBKU09OIGZpbGUgY29udGFpbmluZyB0aGUgbW9kZWwgdG9wb2xvZ3kgYW5kXG4gKiAgICAgICAgd2VpZ2h0cyBtYW5pZmVzdC5cbiAqICAgICAgLSAnbW9kZWwud2VpZ2h0cy5iaW4nIGZvciB0aGUgYmluYXJ5IGZpbGUgY29udGFpbmluZyB0aGUgYmluYXJ5IHdlaWdodFxuICogICAgICAgIHZhbHVlcy5cbiAqICAgMi4gQSBzaW5nbGUgc3RyaW5nIG9yIGFuIEFycmF5IG9mIGEgc2luZ2xlIHN0cmluZywgYXMgdGhlIGZpbGUgbmFtZSBwcmVmaXguXG4gKiAgICAgIEZvciBleGFtcGxlLCBpZiBgJ2ZvbydgIGlzIHByb3ZpZGVkLCB0aGUgZG93bmxvYWRlZCBKU09OXG4gKiAgICAgIGZpbGUgYW5kIGJpbmFyeSB3ZWlnaHRzIGZpbGUgd2lsbCBiZSBuYW1lZCAnZm9vLmpzb24nIGFuZFxuICogICAgICAnZm9vLndlaWdodHMuYmluJywgcmVzcGVjdGl2ZWx5LlxuICogQHBhcmFtIGNvbmZpZyBBZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gZm9yIHRyaWdnZXJpbmcgZG93bmxvYWRzLlxuICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgYEJyb3dzZXJEb3dubG9hZHNgIGBJT0hhbmRsZXJgLlxuICpcbiAqIEBkb2Mge1xuICogICBoZWFkaW5nOiAnTW9kZWxzJyxcbiAqICAgc3ViaGVhZGluZzogJ0xvYWRpbmcnLFxuICogICBuYW1lc3BhY2U6ICdpbycsXG4gKiAgIGlnbm9yZUNJOiB0cnVlXG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBicm93c2VyRG93bmxvYWRzKGZpbGVOYW1lUHJlZml4ID0gJ21vZGVsJykge1xuICAgIHJldHVybiBuZXcgQnJvd3NlckRvd25sb2FkcyhmaWxlTmFtZVByZWZpeCk7XG59XG4vKipcbiAqIENyZWF0ZXMgYW4gSU9IYW5kbGVyIHRoYXQgbG9hZHMgbW9kZWwgYXJ0aWZhY3RzIGZyb20gdXNlci1zZWxlY3RlZCBmaWxlcy5cbiAqXG4gKiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCBmb3IgbG9hZGluZyBmcm9tIGZpbGVzIHN1Y2ggYXMgdXNlci1zZWxlY3RlZCBmaWxlc1xuICogaW4gdGhlIGJyb3dzZXIuXG4gKiBXaGVuIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBgdGYubG9hZExheWVyc01vZGVsYCwgYW4gaW5zdGFuY2Ugb2ZcbiAqIGB0Zi5MYXllcnNNb2RlbGAgKEtlcmFzLXN0eWxlKSBjYW4gYmUgY29uc3RydWN0ZWQgZnJvbSB0aGUgbG9hZGVkIGFydGlmYWN0cy5cbiAqXG4gKiBgYGBqc1xuICogLy8gTm90ZTogVGhpcyBjb2RlIHNuaXBwZXQgd29uJ3QgcnVuIHByb3Blcmx5IHdpdGhvdXQgdGhlIGFjdHVhbCBmaWxlIGlucHV0XG4gKiAvLyAgIGVsZW1lbnRzIGluIHRoZSBIVE1MIERPTS5cbiAqXG4gKiAvLyBTdXBwb3NlIHRoZXJlIGFyZSB0d28gSFRNTCBmaWxlIGlucHV0IChgPGlucHV0IHR5cGU9XCJmaWxlXCIgLi4uPmApXG4gKiAvLyBlbGVtZW50cy5cbiAqIGNvbnN0IHVwbG9hZEpTT05JbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGxvYWQtanNvbicpO1xuICogY29uc3QgdXBsb2FkV2VpZ2h0c0lucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwbG9hZC13ZWlnaHRzJyk7XG4gKiBjb25zdCBtb2RlbCA9IGF3YWl0IHRmLmxvYWRMYXllcnNNb2RlbCh0Zi5pby5icm93c2VyRmlsZXMoXG4gKiAgICAgW3VwbG9hZEpTT05JbnB1dC5maWxlc1swXSwgdXBsb2FkV2VpZ2h0c0lucHV0LmZpbGVzWzBdXSkpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGZpbGVzIGBGaWxlYHMgdG8gbG9hZCBmcm9tLiBDdXJyZW50bHksIHRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgb25seVxuICogICBsb2FkaW5nIGZyb20gZmlsZXMgdGhhdCBjb250YWluIEtlcmFzLXN0eWxlIG1vZGVscyAoaS5lLiwgYHRmLk1vZGVsYHMpLCBmb3JcbiAqICAgd2hpY2ggYW4gYEFycmF5YCBvZiBgRmlsZWBzIGlzIGV4cGVjdGVkIChpbiB0aGF0IG9yZGVyKTpcbiAqICAgLSBBIEpTT04gZmlsZSBjb250YWluaW5nIHRoZSBtb2RlbCB0b3BvbG9neSBhbmQgd2VpZ2h0IG1hbmlmZXN0LlxuICogICAtIE9wdGlvbmFsbHksIE9uZSBvciBtb3JlIGJpbmFyeSBmaWxlcyBjb250YWluaW5nIHRoZSBiaW5hcnkgd2VpZ2h0cy5cbiAqICAgICBUaGVzZSBmaWxlcyBtdXN0IGhhdmUgbmFtZXMgdGhhdCBtYXRjaCB0aGUgcGF0aHMgaW4gdGhlIGB3ZWlnaHRzTWFuaWZlc3RgXG4gKiAgICAgY29udGFpbmVkIGJ5IHRoZSBhZm9yZW1lbnRpb25lZCBKU09OIGZpbGUsIG9yIGVycm9ycyB3aWxsIGJlIHRocm93blxuICogICAgIGR1cmluZyBsb2FkaW5nLiBUaGVzZSB3ZWlnaHRzIGZpbGVzIGhhdmUgdGhlIHNhbWUgZm9ybWF0IGFzIHRoZSBvbmVzXG4gKiAgICAgZ2VuZXJhdGVkIGJ5IGB0ZW5zb3JmbG93anNfY29udmVydGVyYCB0aGF0IGNvbWVzIHdpdGggdGhlIGB0ZW5zb3JmbG93anNgXG4gKiAgICAgUHl0aG9uIFBJUCBwYWNrYWdlLiBJZiBubyB3ZWlnaHRzIGZpbGVzIGFyZSBwcm92aWRlZCwgb25seSB0aGUgbW9kZWxcbiAqICAgICB0b3BvbG9neSB3aWxsIGJlIGxvYWRlZCBmcm9tIHRoZSBKU09OIGZpbGUgYWJvdmUuXG4gKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiBgRmlsZXNgIGBJT0hhbmRsZXJgLlxuICpcbiAqIEBkb2Mge1xuICogICBoZWFkaW5nOiAnTW9kZWxzJyxcbiAqICAgc3ViaGVhZGluZzogJ0xvYWRpbmcnLFxuICogICBuYW1lc3BhY2U6ICdpbycsXG4gKiAgIGlnbm9yZUNJOiB0cnVlXG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBicm93c2VyRmlsZXMoZmlsZXMpIHtcbiAgICByZXR1cm4gbmV3IEJyb3dzZXJGaWxlcyhmaWxlcyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1icm93c2VyX2ZpbGVzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qKlxuICogSU9IYW5kbGVyIGltcGxlbWVudGF0aW9ucyBiYXNlZCBvbiBIVFRQIHJlcXVlc3RzIGluIHRoZSB3ZWIgYnJvd3Nlci5cbiAqXG4gKiBVc2VzIFtgZmV0Y2hgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRmV0Y2hfQVBJKS5cbiAqL1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi4vZW52aXJvbm1lbnQnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBjb25jYXRlbmF0ZUFycmF5QnVmZmVycywgZ2V0TW9kZWxBcnRpZmFjdHNGb3JKU09OLCBnZXRNb2RlbEFydGlmYWN0c0luZm9Gb3JKU09OLCBnZXRNb2RlbEpTT05Gb3JNb2RlbEFydGlmYWN0cyB9IGZyb20gJy4vaW9fdXRpbHMnO1xuaW1wb3J0IHsgSU9Sb3V0ZXJSZWdpc3RyeSB9IGZyb20gJy4vcm91dGVyX3JlZ2lzdHJ5JztcbmltcG9ydCB7IGxvYWRXZWlnaHRzQXNBcnJheUJ1ZmZlciB9IGZyb20gJy4vd2VpZ2h0c19sb2FkZXInO1xuY29uc3QgT0NURVRfU1RSRUFNX01JTUVfVFlQRSA9ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nO1xuY29uc3QgSlNPTl9UWVBFID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuZXhwb3J0IGNsYXNzIEhUVFBSZXF1ZXN0IHtcbiAgICBjb25zdHJ1Y3RvcihwYXRoLCBsb2FkT3B0aW9ucykge1xuICAgICAgICB0aGlzLkRFRkFVTFRfTUVUSE9EID0gJ1BPU1QnO1xuICAgICAgICBpZiAobG9hZE9wdGlvbnMgPT0gbnVsbCkge1xuICAgICAgICAgICAgbG9hZE9wdGlvbnMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndlaWdodFBhdGhQcmVmaXggPSBsb2FkT3B0aW9ucy53ZWlnaHRQYXRoUHJlZml4O1xuICAgICAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBsb2FkT3B0aW9ucy5vblByb2dyZXNzO1xuICAgICAgICB0aGlzLndlaWdodFVybENvbnZlcnRlciA9IGxvYWRPcHRpb25zLndlaWdodFVybENvbnZlcnRlcjtcbiAgICAgICAgaWYgKGxvYWRPcHRpb25zLmZldGNoRnVuYyAhPSBudWxsKSB7XG4gICAgICAgICAgICBhc3NlcnQodHlwZW9mIGxvYWRPcHRpb25zLmZldGNoRnVuYyA9PT0gJ2Z1bmN0aW9uJywgKCkgPT4gJ011c3QgcGFzcyBhIGZ1bmN0aW9uIHRoYXQgbWF0Y2hlcyB0aGUgc2lnbmF0dXJlIG9mICcgK1xuICAgICAgICAgICAgICAgICdgZmV0Y2hgIChzZWUgJyArXG4gICAgICAgICAgICAgICAgJ2h0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GZXRjaF9BUEkpJyk7XG4gICAgICAgICAgICB0aGlzLmZldGNoID0gbG9hZE9wdGlvbnMuZmV0Y2hGdW5jO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5mZXRjaCA9IGVudigpLnBsYXRmb3JtLmZldGNoO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydChwYXRoICE9IG51bGwgJiYgcGF0aC5sZW5ndGggPiAwLCAoKSA9PiAnVVJMIHBhdGggZm9yIGh0dHAgbXVzdCBub3QgYmUgbnVsbCwgdW5kZWZpbmVkIG9yICcgK1xuICAgICAgICAgICAgJ2VtcHR5LicpO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXRoKSkge1xuICAgICAgICAgICAgYXNzZXJ0KHBhdGgubGVuZ3RoID09PSAyLCAoKSA9PiAnVVJMIHBhdGhzIGZvciBodHRwIG11c3QgaGF2ZSBhIGxlbmd0aCBvZiAyLCAnICtcbiAgICAgICAgICAgICAgICBgKGFjdHVhbCBsZW5ndGggaXMgJHtwYXRoLmxlbmd0aH0pLmApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgICAgIGlmIChsb2FkT3B0aW9ucy5yZXF1ZXN0SW5pdCAhPSBudWxsICYmXG4gICAgICAgICAgICBsb2FkT3B0aW9ucy5yZXF1ZXN0SW5pdC5ib2R5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWVzdEluaXQgaXMgZXhwZWN0ZWQgdG8gaGF2ZSBubyBwcmUtZXhpc3RpbmcgYm9keSwgYnV0IGhhcyBvbmUuJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXF1ZXN0SW5pdCA9IGxvYWRPcHRpb25zLnJlcXVlc3RJbml0IHx8IHt9O1xuICAgIH1cbiAgICBhc3luYyBzYXZlKG1vZGVsQXJ0aWZhY3RzKSB7XG4gICAgICAgIGlmIChtb2RlbEFydGlmYWN0cy5tb2RlbFRvcG9sb2d5IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnJvd3NlckhUVFBSZXF1ZXN0LnNhdmUoKSBkb2VzIG5vdCBzdXBwb3J0IHNhdmluZyBtb2RlbCB0b3BvbG9neSAnICtcbiAgICAgICAgICAgICAgICAnaW4gYmluYXJ5IGZvcm1hdHMgeWV0LicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluaXQgPSBPYmplY3QuYXNzaWduKHsgbWV0aG9kOiB0aGlzLkRFRkFVTFRfTUVUSE9EIH0sIHRoaXMucmVxdWVzdEluaXQpO1xuICAgICAgICBpbml0LmJvZHkgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgY29uc3Qgd2VpZ2h0c01hbmlmZXN0ID0gW3tcbiAgICAgICAgICAgICAgICBwYXRoczogWycuL21vZGVsLndlaWdodHMuYmluJ10sXG4gICAgICAgICAgICAgICAgd2VpZ2h0czogbW9kZWxBcnRpZmFjdHMud2VpZ2h0U3BlY3MsXG4gICAgICAgICAgICB9XTtcbiAgICAgICAgY29uc3QgbW9kZWxUb3BvbG9neUFuZFdlaWdodE1hbmlmZXN0ID0gZ2V0TW9kZWxKU09ORm9yTW9kZWxBcnRpZmFjdHMobW9kZWxBcnRpZmFjdHMsIHdlaWdodHNNYW5pZmVzdCk7XG4gICAgICAgIGluaXQuYm9keS5hcHBlbmQoJ21vZGVsLmpzb24nLCBuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkobW9kZWxUb3BvbG9neUFuZFdlaWdodE1hbmlmZXN0KV0sIHsgdHlwZTogSlNPTl9UWVBFIH0pLCAnbW9kZWwuanNvbicpO1xuICAgICAgICBpZiAobW9kZWxBcnRpZmFjdHMud2VpZ2h0RGF0YSAhPSBudWxsKSB7XG4gICAgICAgICAgICBpbml0LmJvZHkuYXBwZW5kKCdtb2RlbC53ZWlnaHRzLmJpbicsIG5ldyBCbG9iKFttb2RlbEFydGlmYWN0cy53ZWlnaHREYXRhXSwgeyB0eXBlOiBPQ1RFVF9TVFJFQU1fTUlNRV9UWVBFIH0pLCAnbW9kZWwud2VpZ2h0cy5iaW4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZmV0Y2godGhpcy5wYXRoLCBpbml0KTtcbiAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG1vZGVsQXJ0aWZhY3RzSW5mbzogZ2V0TW9kZWxBcnRpZmFjdHNJbmZvRm9ySlNPTihtb2RlbEFydGlmYWN0cyksXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VzOiBbcmVzcG9uc2VdLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQnJvd3NlckhUVFBSZXF1ZXN0LnNhdmUoKSBmYWlsZWQgZHVlIHRvIEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGAgK1xuICAgICAgICAgICAgICAgIGAke3Jlc3BvbnNlLnN0YXR1c30uYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogTG9hZCBtb2RlbCBhcnRpZmFjdHMgdmlhIEhUVFAgcmVxdWVzdChzKS5cbiAgICAgKlxuICAgICAqIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiB0byBgdGYuaW8uaHR0cGAgZm9yIGRldGFpbHMgb24gdGhlIHNhdmVkXG4gICAgICogYXJ0aWZhY3RzLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIGxvYWRlZCBtb2RlbCBhcnRpZmFjdHMgKGlmIGxvYWRpbmcgc3VjY2VlZHMpLlxuICAgICAqL1xuICAgIGFzeW5jIGxvYWQoKSB7XG4gICAgICAgIGNvbnN0IG1vZGVsQ29uZmlnUmVxdWVzdCA9IGF3YWl0IHRoaXMuZmV0Y2godGhpcy5wYXRoLCB0aGlzLnJlcXVlc3RJbml0KTtcbiAgICAgICAgaWYgKCFtb2RlbENvbmZpZ1JlcXVlc3Qub2spIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVxdWVzdCB0byAke3RoaXMucGF0aH0gZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgYCArXG4gICAgICAgICAgICAgICAgYCR7bW9kZWxDb25maWdSZXF1ZXN0LnN0YXR1c30uIFBsZWFzZSB2ZXJpZnkgdGhpcyBVUkwgcG9pbnRzIHRvIGAgK1xuICAgICAgICAgICAgICAgIGB0aGUgbW9kZWwgSlNPTiBvZiB0aGUgbW9kZWwgdG8gbG9hZC5gKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbW9kZWxKU09OO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbW9kZWxKU09OID0gYXdhaXQgbW9kZWxDb25maWdSZXF1ZXN0Lmpzb24oKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBgRmFpbGVkIHRvIHBhcnNlIG1vZGVsIEpTT04gb2YgcmVzcG9uc2UgZnJvbSAke3RoaXMucGF0aH0uYDtcbiAgICAgICAgICAgIC8vIFRPRE8obnN0aG9yYXQpOiBSZW1vdmUgdGhpcyBhZnRlciBzb21lIHRpbWUgd2hlbiB3ZSdyZSBjb21mb3J0YWJsZSB0aGF0XG4gICAgICAgICAgICAvLyAucGIgZmlsZXMgYXJlIG1vc3RseSBnb25lLlxuICAgICAgICAgICAgaWYgKHRoaXMucGF0aC5lbmRzV2l0aCgnLnBiJykpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlICs9ICcgWW91ciBwYXRoIGNvbnRhaW5zIGEgLnBiIGZpbGUgZXh0ZW5zaW9uLiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ1N1cHBvcnQgZm9yIC5wYiBtb2RlbHMgaGF2ZSBiZWVuIHJlbW92ZWQgaW4gVGVuc29yRmxvdy5qcyAxLjAgJyArXG4gICAgICAgICAgICAgICAgICAgICdpbiBmYXZvciBvZiAuanNvbiBtb2RlbHMuIFlvdSBjYW4gcmUtY29udmVydCB5b3VyIFB5dGhvbiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ1RlbnNvckZsb3cgbW9kZWwgdXNpbmcgdGhlIFRlbnNvckZsb3cuanMgMS4wIGNvbnZlcnNpb24gc2NyaXB0cyAnICtcbiAgICAgICAgICAgICAgICAgICAgJ29yIHlvdSBjYW4gY29udmVydCB5b3VyLnBiIG1vZGVscyB3aXRoIHRoZSBcXCdwYjJqc29uXFwnJyArXG4gICAgICAgICAgICAgICAgICAgICdOUE0gc2NyaXB0IGluIHRoZSB0ZW5zb3JmbG93L3RmanMtY29udmVydGVyIHJlcG9zaXRvcnkuJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgKz0gJyBQbGVhc2UgbWFrZSBzdXJlIHRoZSBzZXJ2ZXIgaXMgc2VydmluZyB2YWxpZCAnICtcbiAgICAgICAgICAgICAgICAgICAgJ0pTT04gZm9yIHRoaXMgcmVxdWVzdC4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlIGRvIG5vdCBhbGxvdyBib3RoIG1vZGVsVG9wb2xvZ3kgYW5kIHdlaWdodHNNYW5pZmVzdCB0byBiZSBtaXNzaW5nLlxuICAgICAgICBjb25zdCBtb2RlbFRvcG9sb2d5ID0gbW9kZWxKU09OLm1vZGVsVG9wb2xvZ3k7XG4gICAgICAgIGNvbnN0IHdlaWdodHNNYW5pZmVzdCA9IG1vZGVsSlNPTi53ZWlnaHRzTWFuaWZlc3Q7XG4gICAgICAgIGlmIChtb2RlbFRvcG9sb2d5ID09IG51bGwgJiYgd2VpZ2h0c01hbmlmZXN0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIEpTT04gZnJvbSBIVFRQIHBhdGggJHt0aGlzLnBhdGh9IGNvbnRhaW5zIG5laXRoZXIgbW9kZWwgYCArXG4gICAgICAgICAgICAgICAgYHRvcG9sb2d5IG9yIG1hbmlmZXN0IGZvciB3ZWlnaHRzLmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnZXRNb2RlbEFydGlmYWN0c0ZvckpTT04obW9kZWxKU09OLCAod2VpZ2h0c01hbmlmZXN0KSA9PiB0aGlzLmxvYWRXZWlnaHRzKHdlaWdodHNNYW5pZmVzdCkpO1xuICAgIH1cbiAgICBhc3luYyBsb2FkV2VpZ2h0cyh3ZWlnaHRzTWFuaWZlc3QpIHtcbiAgICAgICAgY29uc3Qgd2VpZ2h0UGF0aCA9IEFycmF5LmlzQXJyYXkodGhpcy5wYXRoKSA/IHRoaXMucGF0aFsxXSA6IHRoaXMucGF0aDtcbiAgICAgICAgY29uc3QgW3ByZWZpeCwgc3VmZml4XSA9IHBhcnNlVXJsKHdlaWdodFBhdGgpO1xuICAgICAgICBjb25zdCBwYXRoUHJlZml4ID0gdGhpcy53ZWlnaHRQYXRoUHJlZml4IHx8IHByZWZpeDtcbiAgICAgICAgY29uc3Qgd2VpZ2h0U3BlY3MgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiB3ZWlnaHRzTWFuaWZlc3QpIHtcbiAgICAgICAgICAgIHdlaWdodFNwZWNzLnB1c2goLi4uZW50cnkud2VpZ2h0cyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmV0Y2hVUkxzID0gW107XG4gICAgICAgIGNvbnN0IHVybFByb21pc2VzID0gW107XG4gICAgICAgIGZvciAoY29uc3Qgd2VpZ2h0c0dyb3VwIG9mIHdlaWdodHNNYW5pZmVzdCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwYXRoIG9mIHdlaWdodHNHcm91cC5wYXRocykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLndlaWdodFVybENvbnZlcnRlciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHVybFByb21pc2VzLnB1c2godGhpcy53ZWlnaHRVcmxDb252ZXJ0ZXIocGF0aCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmV0Y2hVUkxzLnB1c2gocGF0aFByZWZpeCArIHBhdGggKyBzdWZmaXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy53ZWlnaHRVcmxDb252ZXJ0ZXIpIHtcbiAgICAgICAgICAgIGZldGNoVVJMcy5wdXNoKC4uLmF3YWl0IFByb21pc2UuYWxsKHVybFByb21pc2VzKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYnVmZmVycyA9IGF3YWl0IGxvYWRXZWlnaHRzQXNBcnJheUJ1ZmZlcihmZXRjaFVSTHMsIHtcbiAgICAgICAgICAgIHJlcXVlc3RJbml0OiB0aGlzLnJlcXVlc3RJbml0LFxuICAgICAgICAgICAgZmV0Y2hGdW5jOiB0aGlzLmZldGNoLFxuICAgICAgICAgICAgb25Qcm9ncmVzczogdGhpcy5vblByb2dyZXNzXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gW3dlaWdodFNwZWNzLCBjb25jYXRlbmF0ZUFycmF5QnVmZmVycyhidWZmZXJzKV07XG4gICAgfVxufVxuSFRUUFJlcXVlc3QuVVJMX1NDSEVNRV9SRUdFWCA9IC9eaHR0cHM/OlxcL1xcLy87XG4vKipcbiAqIEV4dHJhY3QgdGhlIHByZWZpeCBhbmQgc3VmZml4IG9mIHRoZSB1cmwsIHdoZXJlIHRoZSBwcmVmaXggaXMgdGhlIHBhdGggYmVmb3JlXG4gKiB0aGUgbGFzdCBmaWxlLCBhbmQgc3VmZml4IGlzIHRoZSBzZWFyY2ggcGFyYW1zIGFmdGVyIHRoZSBsYXN0IGZpbGUuXG4gKiBgYGBcbiAqIGNvbnN0IHVybCA9ICdodHRwOi8vdGZodWIuZGV2L21vZGVsLzEvdGVuc29yZmxvd2pzX21vZGVsLnBiP3RmanMtZm9ybWF0PWZpbGUnXG4gKiBbcHJlZml4LCBzdWZmaXhdID0gcGFyc2VVcmwodXJsKVxuICogLy8gcHJlZml4ID0gJ2h0dHA6Ly90Zmh1Yi5kZXYvbW9kZWwvMS8nXG4gKiAvLyBzdWZmaXggPSAnP3RmanMtZm9ybWF0PWZpbGUnXG4gKiBgYGBcbiAqIEBwYXJhbSB1cmwgdGhlIG1vZGVsIHVybCB0byBiZSBwYXJzZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVVybCh1cmwpIHtcbiAgICBjb25zdCBsYXN0U2xhc2ggPSB1cmwubGFzdEluZGV4T2YoJy8nKTtcbiAgICBjb25zdCBsYXN0U2VhcmNoUGFyYW0gPSB1cmwubGFzdEluZGV4T2YoJz8nKTtcbiAgICBjb25zdCBwcmVmaXggPSB1cmwuc3Vic3RyaW5nKDAsIGxhc3RTbGFzaCk7XG4gICAgY29uc3Qgc3VmZml4ID0gbGFzdFNlYXJjaFBhcmFtID4gbGFzdFNsYXNoID8gdXJsLnN1YnN0cmluZyhsYXN0U2VhcmNoUGFyYW0pIDogJyc7XG4gICAgcmV0dXJuIFtwcmVmaXggKyAnLycsIHN1ZmZpeF07XG59XG5leHBvcnQgZnVuY3Rpb24gaXNIVFRQU2NoZW1lKHVybCkge1xuICAgIHJldHVybiB1cmwubWF0Y2goSFRUUFJlcXVlc3QuVVJMX1NDSEVNRV9SRUdFWCkgIT0gbnVsbDtcbn1cbmV4cG9ydCBjb25zdCBodHRwUm91dGVyID0gKHVybCwgbG9hZE9wdGlvbnMpID0+IHtcbiAgICBpZiAodHlwZW9mIGZldGNoID09PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAobG9hZE9wdGlvbnMgPT0gbnVsbCB8fCBsb2FkT3B0aW9ucy5mZXRjaEZ1bmMgPT0gbnVsbCkpIHtcbiAgICAgICAgLy8gYGh0dHBgIHVzZXMgYGZldGNoYCBvciBgbm9kZS1mZXRjaGAsIGlmIG9uZSB3YW50cyB0byB1c2UgaXQgaW5cbiAgICAgICAgLy8gYW4gZW52aXJvbm1lbnQgdGhhdCBpcyBub3QgdGhlIGJyb3dzZXIgb3Igbm9kZSB0aGV5IGhhdmUgdG8gc2V0dXAgYVxuICAgICAgICAvLyBnbG9iYWwgZmV0Y2ggcG9seWZpbGwuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IGlzSFRUUCA9IHRydWU7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHVybCkpIHtcbiAgICAgICAgICAgIGlzSFRUUCA9IHVybC5ldmVyeSh1cmxJdGVtID0+IGlzSFRUUFNjaGVtZSh1cmxJdGVtKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpc0hUVFAgPSBpc0hUVFBTY2hlbWUodXJsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNIVFRQKSB7XG4gICAgICAgICAgICByZXR1cm4gaHR0cCh1cmwsIGxvYWRPcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn07XG5JT1JvdXRlclJlZ2lzdHJ5LnJlZ2lzdGVyU2F2ZVJvdXRlcihodHRwUm91dGVyKTtcbklPUm91dGVyUmVnaXN0cnkucmVnaXN0ZXJMb2FkUm91dGVyKGh0dHBSb3V0ZXIpO1xuLyoqXG4gKiBDcmVhdGVzIGFuIElPSGFuZGxlciBzdWJ0eXBlIHRoYXQgc2VuZHMgbW9kZWwgYXJ0aWZhY3RzIHRvIEhUVFAgc2VydmVyLlxuICpcbiAqIEFuIEhUVFAgcmVxdWVzdCBvZiB0aGUgYG11bHRpcGFydC9mb3JtLWRhdGFgIG1pbWUgdHlwZSB3aWxsIGJlIHNlbnQgdG8gdGhlXG4gKiBgcGF0aGAgVVJMLiBUaGUgZm9ybSBkYXRhIGluY2x1ZGVzIGFydGlmYWN0cyB0aGF0IHJlcHJlc2VudCB0aGUgdG9wb2xvZ3lcbiAqIGFuZC9vciB3ZWlnaHRzIG9mIHRoZSBtb2RlbC4gSW4gdGhlIGNhc2Ugb2YgS2VyYXMtc3R5bGUgYHRmLk1vZGVsYCwgdHdvXG4gKiBibG9icyAoZmlsZXMpIGV4aXN0IGluIGZvcm0tZGF0YTpcbiAqICAgLSBBIEpTT04gZmlsZSBjb25zaXN0aW5nIG9mIGBtb2RlbFRvcG9sb2d5YCBhbmQgYHdlaWdodHNNYW5pZmVzdGAuXG4gKiAgIC0gQSBiaW5hcnkgd2VpZ2h0cyBmaWxlIGNvbnNpc3Rpbmcgb2YgdGhlIGNvbmNhdGVuYXRlZCB3ZWlnaHQgdmFsdWVzLlxuICogVGhlc2UgZmlsZXMgYXJlIGluIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgb25lIGdlbmVyYXRlZCBieVxuICogW3RmanNfY29udmVydGVyXShodHRwczovL2pzLnRlbnNvcmZsb3cub3JnL3R1dG9yaWFscy9pbXBvcnQta2VyYXMuaHRtbCkuXG4gKlxuICogVGhlIGZvbGxvd2luZyBjb2RlIHNuaXBwZXQgZXhlbXBsaWZpZXMgdGhlIGNsaWVudC1zaWRlIGNvZGUgdGhhdCB1c2VzIHRoaXNcbiAqIGZ1bmN0aW9uOlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtb2RlbCA9IHRmLnNlcXVlbnRpYWwoKTtcbiAqIG1vZGVsLmFkZChcbiAqICAgICB0Zi5sYXllcnMuZGVuc2Uoe3VuaXRzOiAxLCBpbnB1dFNoYXBlOiBbMTAwXSwgYWN0aXZhdGlvbjogJ3NpZ21vaWQnfSkpO1xuICpcbiAqIGNvbnN0IHNhdmVSZXN1bHQgPSBhd2FpdCBtb2RlbC5zYXZlKHRmLmlvLmh0dHAoXG4gKiAgICAgJ2h0dHA6Ly9tb2RlbC1zZXJ2ZXI6NTAwMC91cGxvYWQnLCB7cmVxdWVzdEluaXQ6IHttZXRob2Q6ICdQVVQnfX0pKTtcbiAqIGNvbnNvbGUubG9nKHNhdmVSZXN1bHQpO1xuICogYGBgXG4gKlxuICogSWYgdGhlIGRlZmF1bHQgYFBPU1RgIG1ldGhvZCBpcyB0byBiZSB1c2VkLCB3aXRob3V0IGFueSBjdXN0b20gcGFyYW1ldGVyc1xuICogc3VjaCBhcyBoZWFkZXJzLCB5b3UgY2FuIHNpbXBseSBwYXNzIGFuIEhUVFAgb3IgSFRUUFMgVVJMIHRvIGBtb2RlbC5zYXZlYDpcbiAqXG4gKiBgYGBqc1xuICogY29uc3Qgc2F2ZVJlc3VsdCA9IGF3YWl0IG1vZGVsLnNhdmUoJ2h0dHA6Ly9tb2RlbC1zZXJ2ZXI6NTAwMC91cGxvYWQnKTtcbiAqIGBgYFxuICpcbiAqIFRoZSBmb2xsb3dpbmcgR2l0SHViIEdpc3RcbiAqIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2RzbWlsa292LzFiNjA0NmZkNjEzMmQ3NDA4ZDUyNTdiMDk3NmY3ODY0XG4gKiBpbXBsZW1lbnRzIGEgc2VydmVyIGJhc2VkIG9uIFtmbGFza10oaHR0cHM6Ly9naXRodWIuY29tL3BhbGxldHMvZmxhc2spIHRoYXRcbiAqIGNhbiByZWNlaXZlIHRoZSByZXF1ZXN0LiBVcG9uIHJlY2VpdmluZyB0aGUgbW9kZWwgYXJ0aWZhY3RzIHZpYSB0aGUgcmVxdXN0LFxuICogdGhpcyBwYXJ0aWN1bGFyIHNlcnZlciByZWNvbnNpc3R1dGVzIGluc3RhbmNlcyBvZiBbS2VyYXNcbiAqIE1vZGVsc10oaHR0cHM6Ly9rZXJhcy5pby9tb2RlbHMvbW9kZWwvKSBpbiBtZW1vcnkuXG4gKlxuICpcbiAqIEBwYXJhbSBwYXRoIEEgVVJMIHBhdGggdG8gdGhlIG1vZGVsLlxuICogICBDYW4gYmUgYW4gYWJzb2x1dGUgSFRUUCBwYXRoIChlLmcuLFxuICogICAnaHR0cDovL2xvY2FsaG9zdDo4MDAwL21vZGVsLXVwbG9hZCknKSBvciBhIHJlbGF0aXZlIHBhdGggKGUuZy4sXG4gKiAgICcuL21vZGVsLXVwbG9hZCcpLlxuICogQHBhcmFtIHJlcXVlc3RJbml0IFJlcXVlc3QgY29uZmlndXJhdGlvbnMgdG8gYmUgdXNlZCB3aGVuIHNlbmRpbmdcbiAqICAgIEhUVFAgcmVxdWVzdCB0byBzZXJ2ZXIgdXNpbmcgYGZldGNoYC4gSXQgY2FuIGNvbnRhaW4gZmllbGRzIHN1Y2ggYXNcbiAqICAgIGBtZXRob2RgLCBgY3JlZGVudGlhbHNgLCBgaGVhZGVyc2AsIGBtb2RlYCwgZXRjLiBTZWVcbiAqICAgIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9SZXF1ZXN0L1JlcXVlc3RcbiAqICAgIGZvciBtb3JlIGluZm9ybWF0aW9uLiBgcmVxdWVzdEluaXRgIG11c3Qgbm90IGhhdmUgYSBib2R5LCBiZWNhdXNlIHRoZVxuICogYm9keSB3aWxsIGJlIHNldCBieSBUZW5zb3JGbG93LmpzLiBGaWxlIGJsb2JzIHJlcHJlc2VudGluZyB0aGUgbW9kZWxcbiAqIHRvcG9sb2d5IChmaWxlbmFtZTogJ21vZGVsLmpzb24nKSBhbmQgdGhlIHdlaWdodHMgb2YgdGhlIG1vZGVsIChmaWxlbmFtZTpcbiAqICdtb2RlbC53ZWlnaHRzLmJpbicpIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGJvZHkuIElmIGByZXF1ZXN0SW5pdGAgaGFzIGFcbiAqIGBib2R5YCwgYW4gRXJyb3Igd2lsbCBiZSB0aHJvd24uXG4gKiBAcGFyYW0gbG9hZE9wdGlvbnMgT3B0aW9uYWwgY29uZmlndXJhdGlvbiBmb3IgdGhlIGxvYWRpbmcuIEl0IGluY2x1ZGVzIHRoZVxuICogICBmb2xsb3dpbmcgZmllbGRzOlxuICogICAtIHdlaWdodFBhdGhQcmVmaXggT3B0aW9uYWwsIHRoaXMgc3BlY2lmaWVzIHRoZSBwYXRoIHByZWZpeCBmb3Igd2VpZ2h0XG4gKiAgICAgZmlsZXMsIGJ5IGRlZmF1bHQgdGhpcyBpcyBjYWxjdWxhdGVkIGZyb20gdGhlIHBhdGggcGFyYW0uXG4gKiAgIC0gZmV0Y2hGdW5jIE9wdGlvbmFsLCBjdXN0b20gYGZldGNoYCBmdW5jdGlvbi4gRS5nLiwgaW4gTm9kZS5qcyxcbiAqICAgICB0aGUgYGZldGNoYCBmcm9tIG5vZGUtZmV0Y2ggY2FuIGJlIHVzZWQgaGVyZS5cbiAqICAgLSBvblByb2dyZXNzIE9wdGlvbmFsLCBwcm9ncmVzcyBjYWxsYmFjayBmdW5jdGlvbiwgZmlyZWQgcGVyaW9kaWNhbGx5XG4gKiAgICAgYmVmb3JlIHRoZSBsb2FkIGlzIGNvbXBsZXRlZC5cbiAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIGBJT0hhbmRsZXJgLlxuICpcbiAqIEBkb2Mge1xuICogICBoZWFkaW5nOiAnTW9kZWxzJyxcbiAqICAgc3ViaGVhZGluZzogJ0xvYWRpbmcnLFxuICogICBuYW1lc3BhY2U6ICdpbycsXG4gKiAgIGlnbm9yZUNJOiB0cnVlXG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBodHRwKHBhdGgsIGxvYWRPcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBIVFRQUmVxdWVzdChwYXRoLCBsb2FkT3B0aW9ucyk7XG59XG4vKipcbiAqIERlcHJlY2F0ZWQuIFVzZSBgdGYuaW8uaHR0cGAuXG4gKiBAcGFyYW0gcGF0aFxuICogQHBhcmFtIGxvYWRPcHRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBicm93c2VySFRUUFJlcXVlc3QocGF0aCwgbG9hZE9wdGlvbnMpIHtcbiAgICByZXR1cm4gaHR0cChwYXRoLCBsb2FkT3B0aW9ucyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1odHRwLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCAnLi4vZmxhZ3MnO1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi4vZW52aXJvbm1lbnQnO1xuaW1wb3J0IHsgZ2V0TW9kZWxBcnRpZmFjdHNJbmZvRm9ySlNPTiB9IGZyb20gJy4vaW9fdXRpbHMnO1xuaW1wb3J0IHsgSU9Sb3V0ZXJSZWdpc3RyeSB9IGZyb20gJy4vcm91dGVyX3JlZ2lzdHJ5JztcbmNvbnN0IERBVEFCQVNFX05BTUUgPSAndGVuc29yZmxvd2pzJztcbmNvbnN0IERBVEFCQVNFX1ZFUlNJT04gPSAxO1xuLy8gTW9kZWwgZGF0YSBhbmQgTW9kZWxBcnRpZmFjdHNJbmZvIChtZXRhZGF0YSkgYXJlIHN0b3JlZCBpbiB0d28gc2VwYXJhdGVcbi8vIHN0b3JlcyBmb3IgZWZmaWNpZW50IGFjY2VzcyBvZiB0aGUgbGlzdCBvZiBzdG9yZWQgbW9kZWxzIGFuZCB0aGVpciBtZXRhZGF0YS5cbi8vIDEuIFRoZSBvYmplY3Qgc3RvcmUgZm9yIG1vZGVsIGRhdGE6IHRvcG9sb2d5LCB3ZWlnaHRzIGFuZCB3ZWlnaHQgbWFuaWZlc3RzLlxuY29uc3QgTU9ERUxfU1RPUkVfTkFNRSA9ICdtb2RlbHNfc3RvcmUnO1xuLy8gMi4gVGhlIG9iamVjdCBzdG9yZSBmb3IgTW9kZWxBcnRpZmFjdHNJbmZvLCBpbmNsdWRpbmcgbWV0YS1pbmZvcm1hdGlvbiBzdWNoXG4vLyAgICBhcyB0aGUgdHlwZSBvZiB0b3BvbG9neSAoSlNPTiB2cyBiaW5hcnkpLCBieXRlIHNpemUgb2YgdGhlIHRvcG9sb2d5LCBieXRlXG4vLyAgICBzaXplIG9mIHRoZSB3ZWlnaHRzLCBldGMuXG5jb25zdCBJTkZPX1NUT1JFX05BTUUgPSAnbW9kZWxfaW5mb19zdG9yZSc7XG4vKipcbiAqIERlbGV0ZSB0aGUgZW50aXJlIGRhdGFiYXNlIGZvciB0ZW5zb3JmbG93LmpzLCBpbmNsdWRpbmcgdGhlIG1vZGVscyBzdG9yZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZURhdGFiYXNlKCkge1xuICAgIGNvbnN0IGlkYkZhY3RvcnkgPSBnZXRJbmRleGVkREJGYWN0b3J5KCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgZGVsZXRlUmVxdWVzdCA9IGlkYkZhY3RvcnkuZGVsZXRlRGF0YWJhc2UoREFUQUJBU0VfTkFNRSk7XG4gICAgICAgIGRlbGV0ZVJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4gcmVzb2x2ZSgpO1xuICAgICAgICBkZWxldGVSZXF1ZXN0Lm9uZXJyb3IgPSBlcnJvciA9PiByZWplY3QoZXJyb3IpO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gZ2V0SW5kZXhlZERCRmFjdG9yeSgpIHtcbiAgICBpZiAoIWVudigpLmdldEJvb2woJ0lTX0JST1dTRVInKSkge1xuICAgICAgICAvLyBUT0RPKGNhaXMpOiBBZGQgbW9yZSBpbmZvIGFib3V0IHdoYXQgSU9IYW5kbGVyIHN1YnR5cGVzIGFyZSBhdmFpbGFibGUuXG4gICAgICAgIC8vICAgTWF5YmUgcG9pbnQgdG8gYSBkb2MgcGFnZSBvbiB0aGUgd2ViIGFuZC9vciBhdXRvbWF0aWNhbGx5IGRldGVybWluZVxuICAgICAgICAvLyAgIHRoZSBhdmFpbGFibGUgSU9IYW5kbGVycyBhbmQgcHJpbnQgdGhlbSBpbiB0aGUgZXJyb3IgbWVzc2FnZS5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gb2J0YWluIEluZGV4ZWREQiBmYWN0b3J5IGJlY2F1c2UgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQnICtcbiAgICAgICAgICAgICdpcyBub3QgYSB3ZWIgYnJvd3Nlci4nKTtcbiAgICB9XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgIGNvbnN0IHRoZVdpbmRvdyA9IHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHdpbmRvdztcbiAgICBjb25zdCBmYWN0b3J5ID0gdGhlV2luZG93LmluZGV4ZWREQiB8fCB0aGVXaW5kb3cubW96SW5kZXhlZERCIHx8XG4gICAgICAgIHRoZVdpbmRvdy53ZWJraXRJbmRleGVkREIgfHwgdGhlV2luZG93Lm1zSW5kZXhlZERCIHx8XG4gICAgICAgIHRoZVdpbmRvdy5zaGltSW5kZXhlZERCO1xuICAgIGlmIChmYWN0b3J5ID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgY3VycmVudCBicm93c2VyIGRvZXMgbm90IGFwcGVhciB0byBzdXBwb3J0IEluZGV4ZWREQi4nKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhY3Rvcnk7XG59XG5mdW5jdGlvbiBzZXRVcERhdGFiYXNlKG9wZW5SZXF1ZXN0KSB7XG4gICAgY29uc3QgZGIgPSBvcGVuUmVxdWVzdC5yZXN1bHQ7XG4gICAgZGIuY3JlYXRlT2JqZWN0U3RvcmUoTU9ERUxfU1RPUkVfTkFNRSwgeyBrZXlQYXRoOiAnbW9kZWxQYXRoJyB9KTtcbiAgICBkYi5jcmVhdGVPYmplY3RTdG9yZShJTkZPX1NUT1JFX05BTUUsIHsga2V5UGF0aDogJ21vZGVsUGF0aCcgfSk7XG59XG4vKipcbiAqIElPSGFuZGxlciBzdWJjbGFzczogQnJvd3NlciBJbmRleGVkREIuXG4gKlxuICogU2VlIHRoZSBkb2Mgc3RyaW5nIG9mIGBicm93c2VySW5kZXhlZERCYCBmb3IgbW9yZSBkZXRhaWxzLlxuICovXG5leHBvcnQgY2xhc3MgQnJvd3NlckluZGV4ZWREQiB7XG4gICAgY29uc3RydWN0b3IobW9kZWxQYXRoKSB7XG4gICAgICAgIHRoaXMuaW5kZXhlZERCID0gZ2V0SW5kZXhlZERCRmFjdG9yeSgpO1xuICAgICAgICBpZiAobW9kZWxQYXRoID09IG51bGwgfHwgIW1vZGVsUGF0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3IgSW5kZXhlZERCLCBtb2RlbFBhdGggbXVzdCBub3QgYmUgbnVsbCwgdW5kZWZpbmVkIG9yIGVtcHR5LicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubW9kZWxQYXRoID0gbW9kZWxQYXRoO1xuICAgIH1cbiAgICBhc3luYyBzYXZlKG1vZGVsQXJ0aWZhY3RzKSB7XG4gICAgICAgIC8vIFRPRE8oY2Fpcyk6IFN1cHBvcnQgc2F2aW5nIEdyYXBoRGVmIG1vZGVscy5cbiAgICAgICAgaWYgKG1vZGVsQXJ0aWZhY3RzLm1vZGVsVG9wb2xvZ3kgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCcm93c2VyTG9jYWxTdG9yYWdlLnNhdmUoKSBkb2VzIG5vdCBzdXBwb3J0IHNhdmluZyBtb2RlbCB0b3BvbG9neSAnICtcbiAgICAgICAgICAgICAgICAnaW4gYmluYXJ5IGZvcm1hdHMgeWV0LicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlQWN0aW9uKHRoaXMubW9kZWxQYXRoLCBtb2RlbEFydGlmYWN0cyk7XG4gICAgfVxuICAgIGFzeW5jIGxvYWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlQWN0aW9uKHRoaXMubW9kZWxQYXRoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGVyZm9ybSBkYXRhYmFzZSBhY3Rpb24gdG8gcHV0IG1vZGVsIGFydGlmYWN0cyBpbnRvIG9yIHJlYWQgbW9kZWwgYXJ0aWZhY3RzXG4gICAgICogZnJvbSBJbmRleGVkREIgb2JqZWN0IHN0b3JlLlxuICAgICAqXG4gICAgICogV2hldGhlciB0aGUgYWN0aW9uIGlzIHB1dCBvciBnZXQgZGVwZW5kcyBvbiB3aGV0aGVyIGBtb2RlbEFydGlmYWN0c2AgaXNcbiAgICAgKiBzcGVjaWZpZWQuIElmIGl0IGlzIHNwZWNpZmllZCwgdGhlIGFjdGlvbiB3aWxsIGJlIHB1dDsgb3RoZXJ3aXNlIHRoZSBhY3Rpb25cbiAgICAgKiB3aWxsIGJlIGdldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtb2RlbFBhdGggQSB1bmlxdWUgc3RyaW5nIHBhdGggZm9yIHRoZSBtb2RlbC5cbiAgICAgKiBAcGFyYW0gbW9kZWxBcnRpZmFjdHMgSWYgc3BlY2lmaWVkLCBpdCB3aWxsIGJlIHRoZSBtb2RlbCBhcnRpZmFjdHMgdG8gYmVcbiAgICAgKiAgIHN0b3JlZCBpbiBJbmRleGVkREIuXG4gICAgICogQHJldHVybnMgQSBgUHJvbWlzZWAgb2YgYFNhdmVSZXN1bHRgLCBpZiB0aGUgYWN0aW9uIGlzIHB1dCwgb3IgYSBgUHJvbWlzZWBcbiAgICAgKiAgIG9mIGBNb2RlbEFydGlmYWN0c2AsIGlmIHRoZSBhY3Rpb24gaXMgZ2V0LlxuICAgICAqL1xuICAgIGRhdGFiYXNlQWN0aW9uKG1vZGVsUGF0aCwgbW9kZWxBcnRpZmFjdHMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9wZW5SZXF1ZXN0ID0gdGhpcy5pbmRleGVkREIub3BlbihEQVRBQkFTRV9OQU1FLCBEQVRBQkFTRV9WRVJTSU9OKTtcbiAgICAgICAgICAgIG9wZW5SZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9ICgpID0+IHNldFVwRGF0YWJhc2Uob3BlblJlcXVlc3QpO1xuICAgICAgICAgICAgb3BlblJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRiID0gb3BlblJlcXVlc3QucmVzdWx0O1xuICAgICAgICAgICAgICAgIGlmIChtb2RlbEFydGlmYWN0cyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJlYWQgbW9kZWwgb3V0IGZyb20gb2JqZWN0IHN0b3JlLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtb2RlbFR4ID0gZGIudHJhbnNhY3Rpb24oTU9ERUxfU1RPUkVfTkFNRSwgJ3JlYWRvbmx5Jyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1vZGVsU3RvcmUgPSBtb2RlbFR4Lm9iamVjdFN0b3JlKE1PREVMX1NUT1JFX05BTUUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBnZXRSZXF1ZXN0ID0gbW9kZWxTdG9yZS5nZXQodGhpcy5tb2RlbFBhdGgpO1xuICAgICAgICAgICAgICAgICAgICBnZXRSZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRSZXF1ZXN0LnJlc3VsdCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGIuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgbW9kZWwgd2l0aCBwYXRoICcke3RoaXMubW9kZWxQYXRofScgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBpbiBJbmRleGVkREIuYCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShnZXRSZXF1ZXN0LnJlc3VsdC5tb2RlbEFydGlmYWN0cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGdldFJlcXVlc3Qub25lcnJvciA9IGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KGdldFJlcXVlc3QuZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBtb2RlbFR4Lm9uY29tcGxldGUgPSAoKSA9PiBkYi5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUHV0IG1vZGVsIGludG8gb2JqZWN0IHN0b3JlLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtb2RlbEFydGlmYWN0c0luZm8gPSBnZXRNb2RlbEFydGlmYWN0c0luZm9Gb3JKU09OKG1vZGVsQXJ0aWZhY3RzKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gRmlyc3QsIHB1dCBNb2RlbEFydGlmYWN0c0luZm8gaW50byBpbmZvIHN0b3JlLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmZvVHggPSBkYi50cmFuc2FjdGlvbihJTkZPX1NUT1JFX05BTUUsICdyZWFkd3JpdGUnKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluZm9TdG9yZSA9IGluZm9UeC5vYmplY3RTdG9yZShJTkZPX1NUT1JFX05BTUUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwdXRJbmZvUmVxdWVzdCA9IGluZm9TdG9yZS5wdXQoeyBtb2RlbFBhdGg6IHRoaXMubW9kZWxQYXRoLCBtb2RlbEFydGlmYWN0c0luZm8gfSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtb2RlbFR4O1xuICAgICAgICAgICAgICAgICAgICBwdXRJbmZvUmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWNvbmQsIHB1dCBtb2RlbCBkYXRhIGludG8gbW9kZWwgc3RvcmUuXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbFR4ID0gZGIudHJhbnNhY3Rpb24oTU9ERUxfU1RPUkVfTkFNRSwgJ3JlYWR3cml0ZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9kZWxTdG9yZSA9IG1vZGVsVHgub2JqZWN0U3RvcmUoTU9ERUxfU1RPUkVfTkFNRSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwdXRNb2RlbFJlcXVlc3QgPSBtb2RlbFN0b3JlLnB1dCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxQYXRoOiB0aGlzLm1vZGVsUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbEFydGlmYWN0cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbEFydGlmYWN0c0luZm9cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHV0TW9kZWxSZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHJlc29sdmUoeyBtb2RlbEFydGlmYWN0c0luZm8gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwdXRNb2RlbFJlcXVlc3Qub25lcnJvciA9IGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcHV0LW1vZGVsIHJlcXVlc3QgZmFpbHMsIHJvbGwgYmFjayB0aGUgaW5mbyBlbnRyeSBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlbGwuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1N0b3JlID0gaW5mb1R4Lm9iamVjdFN0b3JlKElORk9fU1RPUkVfTkFNRSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVsZXRlSW5mb1JlcXVlc3QgPSBpbmZvU3RvcmUuZGVsZXRlKHRoaXMubW9kZWxQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVJbmZvUmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QocHV0TW9kZWxSZXF1ZXN0LmVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUluZm9SZXF1ZXN0Lm9uZXJyb3IgPSBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QocHV0TW9kZWxSZXF1ZXN0LmVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgcHV0SW5mb1JlcXVlc3Qub25lcnJvciA9IGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KHB1dEluZm9SZXF1ZXN0LmVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaW5mb1R4Lm9uY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kZWxUeCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGIuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsVHgub25jb21wbGV0ZSA9ICgpID0+IGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIG9wZW5SZXF1ZXN0Lm9uZXJyb3IgPSBlcnJvciA9PiByZWplY3Qob3BlblJlcXVlc3QuZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5Ccm93c2VySW5kZXhlZERCLlVSTF9TQ0hFTUUgPSAnaW5kZXhlZGRiOi8vJztcbmV4cG9ydCBjb25zdCBpbmRleGVkREJSb3V0ZXIgPSAodXJsKSA9PiB7XG4gICAgaWYgKCFlbnYoKS5nZXRCb29sKCdJU19CUk9XU0VSJykpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodXJsKSAmJiB1cmwuc3RhcnRzV2l0aChCcm93c2VySW5kZXhlZERCLlVSTF9TQ0hFTUUpKSB7XG4gICAgICAgICAgICByZXR1cm4gYnJvd3NlckluZGV4ZWREQih1cmwuc2xpY2UoQnJvd3NlckluZGV4ZWREQi5VUkxfU0NIRU1FLmxlbmd0aCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG59O1xuSU9Sb3V0ZXJSZWdpc3RyeS5yZWdpc3RlclNhdmVSb3V0ZXIoaW5kZXhlZERCUm91dGVyKTtcbklPUm91dGVyUmVnaXN0cnkucmVnaXN0ZXJMb2FkUm91dGVyKGluZGV4ZWREQlJvdXRlcik7XG4vKipcbiAqIENyZWF0ZXMgYSBicm93c2VyIEluZGV4ZWREQiBJT0hhbmRsZXIgZm9yIHNhdmluZyBhbmQgbG9hZGluZyBtb2RlbHMuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1vZGVsID0gdGYuc2VxdWVudGlhbCgpO1xuICogbW9kZWwuYWRkKFxuICogICAgIHRmLmxheWVycy5kZW5zZSh7dW5pdHM6IDEsIGlucHV0U2hhcGU6IFsxMDBdLCBhY3RpdmF0aW9uOiAnc2lnbW9pZCd9KSk7XG4gKlxuICogY29uc3Qgc2F2ZVJlc3VsdCA9IGF3YWl0IG1vZGVsLnNhdmUoJ2luZGV4ZWRkYjovL015TW9kZWwnKSk7XG4gKiBjb25zb2xlLmxvZyhzYXZlUmVzdWx0KTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBtb2RlbFBhdGggQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG1vZGVsIHRvIGJlIHNhdmVkLiBNdXN0IGJlIGFcbiAqICAgbm9uLWVtcHR5IHN0cmluZy5cbiAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIGBCcm93c2VySW5kZXhlZERCYCAoc3VibGNhc3Mgb2YgYElPSGFuZGxlcmApLFxuICogICB3aGljaCBjYW4gYmUgdXNlZCB3aXRoLCBlLmcuLCBgdGYuTW9kZWwuc2F2ZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBicm93c2VySW5kZXhlZERCKG1vZGVsUGF0aCkge1xuICAgIHJldHVybiBuZXcgQnJvd3NlckluZGV4ZWREQihtb2RlbFBhdGgpO1xufVxuZnVuY3Rpb24gbWF5YmVTdHJpcFNjaGVtZShrZXkpIHtcbiAgICByZXR1cm4ga2V5LnN0YXJ0c1dpdGgoQnJvd3NlckluZGV4ZWREQi5VUkxfU0NIRU1FKSA/XG4gICAgICAgIGtleS5zbGljZShCcm93c2VySW5kZXhlZERCLlVSTF9TQ0hFTUUubGVuZ3RoKSA6XG4gICAgICAgIGtleTtcbn1cbmV4cG9ydCBjbGFzcyBCcm93c2VySW5kZXhlZERCTWFuYWdlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuaW5kZXhlZERCID0gZ2V0SW5kZXhlZERCRmFjdG9yeSgpO1xuICAgIH1cbiAgICBhc3luYyBsaXN0TW9kZWxzKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3BlblJlcXVlc3QgPSB0aGlzLmluZGV4ZWREQi5vcGVuKERBVEFCQVNFX05BTUUsIERBVEFCQVNFX1ZFUlNJT04pO1xuICAgICAgICAgICAgb3BlblJlcXVlc3Qub251cGdyYWRlbmVlZGVkID0gKCkgPT4gc2V0VXBEYXRhYmFzZShvcGVuUmVxdWVzdCk7XG4gICAgICAgICAgICBvcGVuUmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGIgPSBvcGVuUmVxdWVzdC5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgY29uc3QgdHggPSBkYi50cmFuc2FjdGlvbihJTkZPX1NUT1JFX05BTUUsICdyZWFkb25seScpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0b3JlID0gdHgub2JqZWN0U3RvcmUoSU5GT19TVE9SRV9OQU1FKTtcbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZTptYXgtbGluZS1sZW5ndGhcbiAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIGNhc3QgYHN0b3JlYCBhcyBgYW55YCBoZXJlIGJlY2F1c2UgVHlwZVNjcmlwdCdzIERPTVxuICAgICAgICAgICAgICAgIC8vIGxpYnJhcnkgZG9lcyBub3QgaGF2ZSB0aGUgYGdldEFsbCgpYCBtZXRob2QgZXZlbiB0aG91Z2ggdGhlXG4gICAgICAgICAgICAgICAgLy8gbWV0aG9kIGlzIHN1cHBvcnRlZCBpbiB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgbW9zdCBtYWluc3RyZWFtXG4gICAgICAgICAgICAgICAgLy8gYnJvd3NlcnM6XG4gICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0lEQk9iamVjdFN0b3JlL2dldEFsbFxuICAgICAgICAgICAgICAgIC8vIHRzbGludDplbmFibGU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgICAgICAgICAgICAgIGNvbnN0IGdldEFsbEluZm9SZXF1ZXN0ID0gc3RvcmUuZ2V0QWxsKCk7XG4gICAgICAgICAgICAgICAgZ2V0QWxsSW5mb1JlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvdXQgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGdldEFsbEluZm9SZXF1ZXN0LnJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0W2l0ZW0ubW9kZWxQYXRoXSA9IGl0ZW0ubW9kZWxBcnRpZmFjdHNJbmZvO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUob3V0KTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGdldEFsbEluZm9SZXF1ZXN0Lm9uZXJyb3IgPSBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QoZ2V0QWxsSW5mb1JlcXVlc3QuZXJyb3IpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdHgub25jb21wbGV0ZSA9ICgpID0+IGRiLmNsb3NlKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgb3BlblJlcXVlc3Qub25lcnJvciA9IGVycm9yID0+IHJlamVjdChvcGVuUmVxdWVzdC5lcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyByZW1vdmVNb2RlbChwYXRoKSB7XG4gICAgICAgIHBhdGggPSBtYXliZVN0cmlwU2NoZW1lKHBhdGgpO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3BlblJlcXVlc3QgPSB0aGlzLmluZGV4ZWREQi5vcGVuKERBVEFCQVNFX05BTUUsIERBVEFCQVNFX1ZFUlNJT04pO1xuICAgICAgICAgICAgb3BlblJlcXVlc3Qub251cGdyYWRlbmVlZGVkID0gKCkgPT4gc2V0VXBEYXRhYmFzZShvcGVuUmVxdWVzdCk7XG4gICAgICAgICAgICBvcGVuUmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGIgPSBvcGVuUmVxdWVzdC5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5mb1R4ID0gZGIudHJhbnNhY3Rpb24oSU5GT19TVE9SRV9OQU1FLCAncmVhZHdyaXRlJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5mb1N0b3JlID0gaW5mb1R4Lm9iamVjdFN0b3JlKElORk9fU1RPUkVfTkFNRSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZ2V0SW5mb1JlcXVlc3QgPSBpbmZvU3RvcmUuZ2V0KHBhdGgpO1xuICAgICAgICAgICAgICAgIGxldCBtb2RlbFR4O1xuICAgICAgICAgICAgICAgIGdldEluZm9SZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGdldEluZm9SZXF1ZXN0LnJlc3VsdCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYi5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoYENhbm5vdCBmaW5kIG1vZGVsIHdpdGggcGF0aCAnJHtwYXRofScgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYGluIEluZGV4ZWREQi5gKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXJzdCwgZGVsZXRlIHRoZSBlbnRyeSBpbiB0aGUgaW5mbyBzdG9yZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbGV0ZUluZm9SZXF1ZXN0ID0gaW5mb1N0b3JlLmRlbGV0ZShwYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbGV0ZU1vZGVsRGF0YSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWNvbmQsIGRlbGV0ZSB0aGUgZW50cnkgaW4gdGhlIG1vZGVsIHN0b3JlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsVHggPSBkYi50cmFuc2FjdGlvbihNT0RFTF9TVE9SRV9OQU1FLCAncmVhZHdyaXRlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9kZWxTdG9yZSA9IG1vZGVsVHgub2JqZWN0U3RvcmUoTU9ERUxfU1RPUkVfTkFNRSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVsZXRlTW9kZWxSZXF1ZXN0ID0gbW9kZWxTdG9yZS5kZWxldGUocGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlTW9kZWxSZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHJlc29sdmUoZ2V0SW5mb1JlcXVlc3QucmVzdWx0Lm1vZGVsQXJ0aWZhY3RzSW5mbyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlTW9kZWxSZXF1ZXN0Lm9uZXJyb3IgPSBlcnJvciA9PiByZWplY3QoZ2V0SW5mb1JlcXVlc3QuZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByb2NlZWQgd2l0aCBkZWxldGluZyBtb2RlbCBkYXRhIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBkZWxldGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgaW5mbyBkYXRhIHN1Y2NlZWRzIG9yIG5vdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUluZm9SZXF1ZXN0Lm9uc3VjY2VzcyA9IGRlbGV0ZU1vZGVsRGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUluZm9SZXF1ZXN0Lm9uZXJyb3IgPSBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlTW9kZWxEYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGIuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KGdldEluZm9SZXF1ZXN0LmVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGdldEluZm9SZXF1ZXN0Lm9uZXJyb3IgPSBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QoZ2V0SW5mb1JlcXVlc3QuZXJyb3IpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaW5mb1R4Lm9uY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtb2RlbFR4ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbFR4Lm9uY29tcGxldGUgPSAoKSA9PiBkYi5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBvcGVuUmVxdWVzdC5vbmVycm9yID0gZXJyb3IgPT4gcmVqZWN0KG9wZW5SZXF1ZXN0LmVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXhlZF9kYi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vLyBJbXBvcnRpbmcgbG9jYWxfc3RvcmFnZSBhbmQgaW5kZXhlZF9kYiBpcyBuZWNlc3NhcnkgZm9yIHRoZSByb3V0ZXJzIHRvIGJlXG4vLyByZWdpc3RlcmVkLlxuaW1wb3J0ICcuL2luZGV4ZWRfZGInO1xuaW1wb3J0ICcuL2xvY2FsX3N0b3JhZ2UnO1xuaW1wb3J0IHsgYnJvd3NlckZpbGVzIH0gZnJvbSAnLi9icm93c2VyX2ZpbGVzJztcbmltcG9ydCB7IGJyb3dzZXJIVFRQUmVxdWVzdCwgaHR0cCwgaXNIVFRQU2NoZW1lIH0gZnJvbSAnLi9odHRwJztcbmltcG9ydCB7IGNvbmNhdGVuYXRlQXJyYXlCdWZmZXJzLCBkZWNvZGVXZWlnaHRzLCBlbmNvZGVXZWlnaHRzLCBnZXRNb2RlbEFydGlmYWN0c0ZvckpTT04sIGdldE1vZGVsQXJ0aWZhY3RzSW5mb0ZvckpTT04gfSBmcm9tICcuL2lvX3V0aWxzJztcbmltcG9ydCB7IGZyb21NZW1vcnksIHdpdGhTYXZlSGFuZGxlciB9IGZyb20gJy4vcGFzc3Rocm91Z2gnO1xuaW1wb3J0IHsgZ2V0TG9hZEhhbmRsZXJzLCBnZXRTYXZlSGFuZGxlcnMsIHJlZ2lzdGVyTG9hZFJvdXRlciwgcmVnaXN0ZXJTYXZlUm91dGVyIH0gZnJvbSAnLi9yb3V0ZXJfcmVnaXN0cnknO1xuaW1wb3J0IHsgbG9hZFdlaWdodHMsIHdlaWdodHNMb2FkZXJGYWN0b3J5IH0gZnJvbSAnLi93ZWlnaHRzX2xvYWRlcic7XG5leHBvcnQgeyBjb3B5TW9kZWwsIGxpc3RNb2RlbHMsIG1vdmVNb2RlbCwgcmVtb3ZlTW9kZWwgfSBmcm9tICcuL21vZGVsX21hbmFnZW1lbnQnO1xuZXhwb3J0IHsgYnJvd3NlckZpbGVzLCBicm93c2VySFRUUFJlcXVlc3QsIGNvbmNhdGVuYXRlQXJyYXlCdWZmZXJzLCBkZWNvZGVXZWlnaHRzLCBlbmNvZGVXZWlnaHRzLCBmcm9tTWVtb3J5LCBnZXRMb2FkSGFuZGxlcnMsIGdldE1vZGVsQXJ0aWZhY3RzRm9ySlNPTiwgZ2V0TW9kZWxBcnRpZmFjdHNJbmZvRm9ySlNPTiwgZ2V0U2F2ZUhhbmRsZXJzLCBodHRwLCBpc0hUVFBTY2hlbWUsIGxvYWRXZWlnaHRzLCByZWdpc3RlckxvYWRSb3V0ZXIsIHJlZ2lzdGVyU2F2ZVJvdXRlciwgd2VpZ2h0c0xvYWRlckZhY3RvcnksIHdpdGhTYXZlSGFuZGxlciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW8uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29tcGxleCB9IGZyb20gJy4uL29wcy9jb21wbGV4JztcbmltcG9ydCB7IHRlbnNvciB9IGZyb20gJy4uL29wcy90ZW5zb3InO1xuaW1wb3J0IHsgc2l6ZUZyb21TaGFwZSB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgRFRZUEVfVkFMVUVfU0laRV9NQVAgfSBmcm9tICcuL3R5cGVzJztcbi8qKiBOdW1iZXIgb2YgYnl0ZXMgcmVzZXJ2ZWQgZm9yIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZy4gKDMyYml0IGludGVnZXIpLiAqL1xuY29uc3QgTlVNX0JZVEVTX1NUUklOR19MRU5HVEggPSA0O1xuLyoqXG4gKiBFbmNvZGUgYSBtYXAgZnJvbSBuYW1lcyB0byB3ZWlnaHQgdmFsdWVzIGFzIGFuIEFycmF5QnVmZmVyLCBhbG9uZyB3aXRoIGFuXG4gKiBgQXJyYXlgIG9mIGBXZWlnaHRzTWFuaWZlc3RFbnRyeWAgYXMgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZW5jb2RlZCB3ZWlnaHRzLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcGVyZm9ybSBzaGFyZGluZy5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSByZXZlcnNlIG9mIGBkZWNvZGVXZWlnaHRzYC5cbiAqXG4gKiBAcGFyYW0gdGVuc29ycyBBIG1hcCAoXCJkaWN0XCIpIGZyb20gbmFtZXMgdG8gdGVuc29ycy5cbiAqIEBwYXJhbSBncm91cCBHcm91cCB0byB3aGljaCB0aGUgd2VpZ2h0cyBiZWxvbmcgKG9wdGlvbmFsKS5cbiAqIEByZXR1cm5zIEEgYFByb21pc2VgIG9mXG4gKiAgIC0gQSBmbGF0IGBBcnJheUJ1ZmZlcmAgd2l0aCBhbGwgdGhlIGJpbmFyeSB2YWx1ZXMgb2YgdGhlIGBUZW5zb3Jgc1xuICogICAgIGNvbmNhdGVuYXRlZC5cbiAqICAgLSBBbiBgQXJyYXlgIG9mIGBXZWlnaHRNYW5pZmVzdEVudHJ5YHMsIGNhcnJ5aW5nIGluZm9ybWF0aW9uIGluY2x1ZGluZ1xuICogICAgIHRlbnNvciBuYW1lcywgYGR0eXBlYHMgYW5kIHNoYXBlcy5cbiAqIEB0aHJvd3MgRXJyb3I6IG9uIHVuc3VwcG9ydGVkIHRlbnNvciBgZHR5cGVgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5jb2RlV2VpZ2h0cyh0ZW5zb3JzLCBncm91cCkge1xuICAgIC8vIFRPRE8oYWRhcm9iLCBjYWlzKTogU3VwcG9ydCBxdWFudGl6YXRpb24uXG4gICAgY29uc3Qgc3BlY3MgPSBbXTtcbiAgICBjb25zdCBkYXRhUHJvbWlzZXMgPSBbXTtcbiAgICBjb25zdCBuYW1lcyA9IEFycmF5LmlzQXJyYXkodGVuc29ycykgP1xuICAgICAgICB0ZW5zb3JzLm1hcCh0ZW5zb3IgPT4gdGVuc29yLm5hbWUpIDpcbiAgICAgICAgT2JqZWN0LmtleXModGVuc29ycyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBuYW1lID0gbmFtZXNbaV07XG4gICAgICAgIGNvbnN0IHQgPSBBcnJheS5pc0FycmF5KHRlbnNvcnMpID8gdGVuc29yc1tpXS50ZW5zb3IgOiB0ZW5zb3JzW25hbWVdO1xuICAgICAgICBpZiAodC5kdHlwZSAhPT0gJ2Zsb2F0MzInICYmIHQuZHR5cGUgIT09ICdpbnQzMicgJiYgdC5kdHlwZSAhPT0gJ2Jvb2wnICYmXG4gICAgICAgICAgICB0LmR0eXBlICE9PSAnc3RyaW5nJyAmJiB0LmR0eXBlICE9PSAnY29tcGxleDY0Jykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBkdHlwZSBpbiB3ZWlnaHQgJyR7bmFtZX0nOiAke3QuZHR5cGV9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3BlYyA9IHsgbmFtZSwgc2hhcGU6IHQuc2hhcGUsIGR0eXBlOiB0LmR0eXBlIH07XG4gICAgICAgIGlmICh0LmR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3QgdXRmOGJ5dGVzID0gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWxzID0gYXdhaXQgdC5ieXRlcygpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvdGFsTnVtQnl0ZXMgPSB2YWxzLnJlZHVjZSgocCwgYykgPT4gcCArIGMubGVuZ3RoLCAwKSArXG4gICAgICAgICAgICAgICAgICAgIE5VTV9CWVRFU19TVFJJTkdfTEVOR1RIICogdmFscy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheSh0b3RhbE51bUJ5dGVzKTtcbiAgICAgICAgICAgICAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gdmFsc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnl0ZXNPZkxlbmd0aCA9IG5ldyBVaW50OEFycmF5KG5ldyBVaW50MzJBcnJheShbdmFsLmxlbmd0aF0pLmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIGJ5dGVzLnNldChieXRlc09mTGVuZ3RoLCBvZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gTlVNX0JZVEVTX1NUUklOR19MRU5HVEg7XG4gICAgICAgICAgICAgICAgICAgIGJ5dGVzLnNldCh2YWwsIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSB2YWwubGVuZ3RoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXNvbHZlKGJ5dGVzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZGF0YVByb21pc2VzLnB1c2godXRmOGJ5dGVzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRhdGFQcm9taXNlcy5wdXNoKHQuZGF0YSgpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ3JvdXAgIT0gbnVsbCkge1xuICAgICAgICAgICAgc3BlYy5ncm91cCA9IGdyb3VwO1xuICAgICAgICB9XG4gICAgICAgIHNwZWNzLnB1c2goc3BlYyk7XG4gICAgfVxuICAgIGNvbnN0IHRlbnNvclZhbHVlcyA9IGF3YWl0IFByb21pc2UuYWxsKGRhdGFQcm9taXNlcyk7XG4gICAgcmV0dXJuIHsgZGF0YTogY29uY2F0ZW5hdGVUeXBlZEFycmF5cyh0ZW5zb3JWYWx1ZXMpLCBzcGVjcyB9O1xufVxuLyoqXG4gKiBEZWNvZGUgZmxhdCBBcnJheUJ1ZmZlciBhcyB3ZWlnaHRzLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaGFuZGxlIHNoYXJkaW5nLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaXMgdGhlIHJldmVyc2Ugb2YgYGVuY29kZVdlaWdodHNgLlxuICpcbiAqIEBwYXJhbSBidWZmZXIgQSBmbGF0IEFycmF5QnVmZmVyIGNhcnJ5aW5nIHRoZSBiaW5hcnkgdmFsdWVzIG9mIHRoZSB0ZW5zb3JzXG4gKiAgIGNvbmNhdGVuYXRlZCBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkIGluIGBzcGVjc2AuXG4gKiBAcGFyYW0gc3BlY3MgU3BlY2lmaWNhdGlvbnMgb2YgdGhlIG5hbWVzLCBkdHlwZXMgYW5kIHNoYXBlcyBvZiB0aGUgdGVuc29yc1xuICogICB3aG9zZSB2YWx1ZSBhcmUgZW5jb2RlZCBieSBgYnVmZmVyYC5cbiAqIEByZXR1cm4gQSBtYXAgZnJvbSB0ZW5zb3IgbmFtZSB0byB0ZW5zb3IgdmFsdWUsIHdpdGggdGhlIG5hbWVzIGNvcnJlc3BvbmRpbmdcbiAqICAgdG8gbmFtZXMgaW4gYHNwZWNzYC5cbiAqIEB0aHJvd3MgRXJyb3IsIGlmIGFueSBvZiB0aGUgdGVuc29ycyBoYXMgdW5zdXBwb3J0ZWQgZHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVXZWlnaHRzKGJ1ZmZlciwgc3BlY3MpIHtcbiAgICAvLyBUT0RPKGFkYXJvYiwgY2Fpcyk6IFN1cHBvcnQgcXVhbnRpemF0aW9uLlxuICAgIGNvbnN0IG91dCA9IHt9O1xuICAgIGxldCBmbG9hdDE2RGVjb2RlO1xuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIGZvciAoY29uc3Qgc3BlYyBvZiBzcGVjcykge1xuICAgICAgICBjb25zdCBuYW1lID0gc3BlYy5uYW1lO1xuICAgICAgICBjb25zdCBkdHlwZSA9IHNwZWMuZHR5cGU7XG4gICAgICAgIGNvbnN0IHNoYXBlID0gc3BlYy5zaGFwZTtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHNpemVGcm9tU2hhcGUoc2hhcGUpO1xuICAgICAgICBsZXQgdmFsdWVzO1xuICAgICAgICBpZiAoJ3F1YW50aXphdGlvbicgaW4gc3BlYykge1xuICAgICAgICAgICAgY29uc3QgcXVhbnRpemF0aW9uID0gc3BlYy5xdWFudGl6YXRpb247XG4gICAgICAgICAgICBpZiAocXVhbnRpemF0aW9uLmR0eXBlID09PSAndWludDgnIHx8IHF1YW50aXphdGlvbi5kdHlwZSA9PT0gJ3VpbnQxNicpIHtcbiAgICAgICAgICAgICAgICBpZiAoISgnbWluJyBpbiBxdWFudGl6YXRpb24gJiYgJ3NjYWxlJyBpbiBxdWFudGl6YXRpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgV2VpZ2h0ICR7c3BlYy5uYW1lfSB3aXRoIHF1YW50aXphdGlvbiAke3F1YW50aXphdGlvbi5kdHlwZX0gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgZG9lc24ndCBoYXZlIGNvcnJlc3BvbmRpbmcgbWV0YWRhdGEgbWluIGFuZCBzY2FsZS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChxdWFudGl6YXRpb24uZHR5cGUgPT09ICdmbG9hdDE2Jykge1xuICAgICAgICAgICAgICAgIGlmIChkdHlwZSAhPT0gJ2Zsb2F0MzInKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgV2VpZ2h0ICR7c3BlYy5uYW1lfSBpcyBxdWFudGl6ZWQgd2l0aCAke3F1YW50aXphdGlvbi5kdHlwZX0gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgd2hpY2ggb25seSBzdXBwb3J0cyB3ZWlnaHRzIG9mIHR5cGUgZmxvYXQzMiBub3QgJHtkdHlwZX0uYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBXZWlnaHQgJHtzcGVjLm5hbWV9IGhhcyB1bmtub3duIGAgK1xuICAgICAgICAgICAgICAgICAgICBgcXVhbnRpemF0aW9uIGR0eXBlICR7cXVhbnRpemF0aW9uLmR0eXBlfS4gYCArXG4gICAgICAgICAgICAgICAgICAgIGBTdXBwb3J0ZWQgcXVhbnRpemF0aW9uIGR0eXBlcyBhcmU6IGAgK1xuICAgICAgICAgICAgICAgICAgICBgJ3VpbnQ4JywgJ3VpbnQxNicsIGFuZCAnZmxvYXQxNicuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBxdWFudGl6YXRpb25TaXplRmFjdG9yID0gRFRZUEVfVkFMVUVfU0laRV9NQVBbcXVhbnRpemF0aW9uLmR0eXBlXTtcbiAgICAgICAgICAgIGNvbnN0IGJ5dGVCdWZmZXIgPSBidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBzaXplICogcXVhbnRpemF0aW9uU2l6ZUZhY3Rvcik7XG4gICAgICAgICAgICBjb25zdCBxdWFudGl6ZWRBcnJheSA9IChxdWFudGl6YXRpb24uZHR5cGUgPT09ICd1aW50OCcpID9cbiAgICAgICAgICAgICAgICBuZXcgVWludDhBcnJheShieXRlQnVmZmVyKSA6XG4gICAgICAgICAgICAgICAgbmV3IFVpbnQxNkFycmF5KGJ5dGVCdWZmZXIpO1xuICAgICAgICAgICAgaWYgKGR0eXBlID09PSAnZmxvYXQzMicpIHtcbiAgICAgICAgICAgICAgICBpZiAocXVhbnRpemF0aW9uLmR0eXBlID09PSAndWludDgnIHx8IHF1YW50aXphdGlvbi5kdHlwZSA9PT0gJ3VpbnQxNicpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gbmV3IEZsb2F0MzJBcnJheShxdWFudGl6ZWRBcnJheS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHF1YW50aXplZEFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ID0gcXVhbnRpemVkQXJyYXlbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbaV0gPSB2ICogcXVhbnRpemF0aW9uLnNjYWxlICsgcXVhbnRpemF0aW9uLm1pbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChxdWFudGl6YXRpb24uZHR5cGUgPT09ICdmbG9hdDE2Jykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmxvYXQxNkRlY29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdDE2RGVjb2RlID0gZ2V0RmxvYXQxNkRlY29kZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBmbG9hdDE2RGVjb2RlKHF1YW50aXplZEFycmF5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgcXVhbnRpemF0aW9uIHR5cGUgJHtxdWFudGl6YXRpb24uZHR5cGV9IGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYGZvciB3ZWlnaHQgdHlwZSBmbG9hdDMyLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGR0eXBlID09PSAnaW50MzInKSB7XG4gICAgICAgICAgICAgICAgaWYgKHF1YW50aXphdGlvbi5kdHlwZSAhPT0gJ3VpbnQ4JyAmJiBxdWFudGl6YXRpb24uZHR5cGUgIT09ICd1aW50MTYnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgcXVhbnRpemF0aW9uIHR5cGUgJHtxdWFudGl6YXRpb24uZHR5cGV9IGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYGZvciB3ZWlnaHQgdHlwZSBpbnQzMi5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFsdWVzID0gbmV3IEludDMyQXJyYXkocXVhbnRpemVkQXJyYXkubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHF1YW50aXplZEFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHYgPSBxdWFudGl6ZWRBcnJheVtpXTtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzW2ldID0gTWF0aC5yb3VuZCh2ICogcXVhbnRpemF0aW9uLnNjYWxlICsgcXVhbnRpemF0aW9uLm1pbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBkdHlwZSBpbiB3ZWlnaHQgJyR7bmFtZX0nOiAke2R0eXBlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2Zmc2V0ICs9IHNpemUgKiBxdWFudGl6YXRpb25TaXplRmFjdG9yO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IHNpemVGcm9tU2hhcGUoc3BlYy5zaGFwZSk7XG4gICAgICAgICAgICB2YWx1ZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYnl0ZUxlbmd0aCA9IG5ldyBVaW50MzJBcnJheShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBOVU1fQllURVNfU1RSSU5HX0xFTkdUSCkpWzBdO1xuICAgICAgICAgICAgICAgIG9mZnNldCArPSBOVU1fQllURVNfU1RSSU5HX0xFTkdUSDtcbiAgICAgICAgICAgICAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIGJ5dGVMZW5ndGgpKTtcbiAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaChieXRlcyk7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGJ5dGVMZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBkdHlwZUZhY3RvciA9IERUWVBFX1ZBTFVFX1NJWkVfTUFQW2R0eXBlXTtcbiAgICAgICAgICAgIGNvbnN0IGJ5dGVCdWZmZXIgPSBidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBzaXplICogZHR5cGVGYWN0b3IpO1xuICAgICAgICAgICAgaWYgKGR0eXBlID09PSAnZmxvYXQzMicpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgRmxvYXQzMkFycmF5KGJ5dGVCdWZmZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZHR5cGUgPT09ICdpbnQzMicpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgSW50MzJBcnJheShieXRlQnVmZmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGR0eXBlID09PSAnYm9vbCcpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgVWludDhBcnJheShieXRlQnVmZmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBGbG9hdDMyQXJyYXkoYnl0ZUJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVhbCA9IG5ldyBGbG9hdDMyQXJyYXkodmFsdWVzLmxlbmd0aCAvIDIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGltYWdlID0gbmV3IEZsb2F0MzJBcnJheSh2YWx1ZXMubGVuZ3RoIC8gMik7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlYWxbaV0gPSB2YWx1ZXNbaSAqIDJdO1xuICAgICAgICAgICAgICAgICAgICBpbWFnZVtpXSA9IHZhbHVlc1tpICogMiArIDFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCByZWFsVGVuc29yID0gdGVuc29yKHJlYWwsIHNoYXBlLCAnZmxvYXQzMicpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGltYWdlVGVuc29yID0gdGVuc29yKGltYWdlLCBzaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICAgICAgICAgICAgICBvdXRbbmFtZV0gPSBjb21wbGV4KHJlYWxUZW5zb3IsIGltYWdlVGVuc29yKTtcbiAgICAgICAgICAgICAgICByZWFsVGVuc29yLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgICAgICBpbWFnZVRlbnNvci5kaXNwb3NlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGR0eXBlIGluIHdlaWdodCAnJHtuYW1lfSc6ICR7ZHR5cGV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZSAqIGR0eXBlRmFjdG9yO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkdHlwZSAhPT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgICAgIG91dFtuYW1lXSA9IHRlbnNvcih2YWx1ZXMsIHNoYXBlLCBkdHlwZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ29uY2F0ZW5hdGUgVHlwZWRBcnJheXMgaW50byBhbiBBcnJheUJ1ZmZlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmNhdGVuYXRlVHlwZWRBcnJheXMoeHMpIHtcbiAgICAvLyBUT0RPKGFkYXJvYiwgY2Fpcyk6IFN1cHBvcnQgcXVhbnRpemF0aW9uLlxuICAgIGlmICh4cyA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaW5wdXQgdmFsdWU6ICR7SlNPTi5zdHJpbmdpZnkoeHMpfWApO1xuICAgIH1cbiAgICBsZXQgdG90YWxCeXRlTGVuZ3RoID0gMDtcbiAgICAvLyBgbm9ybWFsaXplZFhzYCBpcyBoZXJlIGZvciB0aGlzIHJlYXNvbjogYSBgVHlwZWRBcnJheWAncyBgYnVmZmVyJ1xuICAgIC8vIGNhbiBoYXZlIGEgZGlmZmVyZW50IGJ5dGUgbGVuZ3RoIGZyb20gdGhhdCBvZiB0aGUgYFR5cGVkQXJyYXlgIGl0c2VsZixcbiAgICAvLyBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgYFR5cGVkQXJyYXlgIGlzIGNyZWF0ZWQgZnJvbSBhbiBvZmZzZXQgaW4gYW5cbiAgICAvLyBgQXJyYXlCdWZmZXJgLiBgbm9ybWxpYXplZFhzYCBob2xkcyBgVHlwZWRBcnJheWBzIHdob3NlIGBidWZmZXJgcyBtYXRjaFxuICAgIC8vIHRoZSBgVHlwZWRBcnJheWAgaW4gYnl0ZSBsZW5ndGguIElmIGFuIGVsZW1lbnQgb2YgYHhzYCBkb2VzIG5vdCBzaG93XG4gICAgLy8gdGhpcyBwcm9wZXJ0eSwgYSBuZXcgYFR5cGVkQXJyYXlgIHRoYXQgc2F0aXNmeSB0aGlzIHByb3BlcnR5IHdpbGwgYmVcbiAgICAvLyBjb25zdHJ1Y3RlZCBhbmQgcHVzaGVkIGludG8gYG5vcm1hbGl6ZWRYc2AuXG4gICAgY29uc3Qgbm9ybWFsaXplZFhzID0gW107XG4gICAgeHMuZm9yRWFjaCgoeCkgPT4ge1xuICAgICAgICB0b3RhbEJ5dGVMZW5ndGggKz0geC5ieXRlTGVuZ3RoO1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby1hbnlcbiAgICAgICAgbm9ybWFsaXplZFhzLnB1c2goeC5ieXRlTGVuZ3RoID09PSB4LmJ1ZmZlci5ieXRlTGVuZ3RoID8geCA6XG4gICAgICAgICAgICBuZXcgeC5jb25zdHJ1Y3Rvcih4KSk7XG4gICAgICAgIGlmICghKHggaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkgfHwgeCBpbnN0YW5jZW9mIEludDMyQXJyYXkgfHxcbiAgICAgICAgICAgIHggaW5zdGFuY2VvZiBVaW50OEFycmF5KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBUeXBlZEFycmF5IHN1YnR5cGU6ICR7eC5jb25zdHJ1Y3Rvci5uYW1lfWApO1xuICAgICAgICB9XG4gICAgICAgIC8vIHRzbGludDplbmFibGU6bm8tYW55XG4gICAgfSk7XG4gICAgY29uc3QgeSA9IG5ldyBVaW50OEFycmF5KHRvdGFsQnl0ZUxlbmd0aCk7XG4gICAgbGV0IG9mZnNldCA9IDA7XG4gICAgbm9ybWFsaXplZFhzLmZvckVhY2goKHgpID0+IHtcbiAgICAgICAgeS5zZXQobmV3IFVpbnQ4QXJyYXkoeC5idWZmZXIpLCBvZmZzZXQpO1xuICAgICAgICBvZmZzZXQgKz0geC5ieXRlTGVuZ3RoO1xuICAgIH0pO1xuICAgIHJldHVybiB5LmJ1ZmZlcjtcbn1cbi8vIFVzZSBCdWZmZXIgb24gTm9kZS5qcyBpbnN0ZWFkIG9mIEJsb2IvYXRvYi9idG9hXG5jb25zdCB1c2VOb2RlQnVmZmVyID0gdHlwZW9mIEJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAodHlwZW9mIEJsb2IgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBhdG9iID09PSAndW5kZWZpbmVkJyB8fFxuICAgICAgICB0eXBlb2YgYnRvYSA9PT0gJ3VuZGVmaW5lZCcpO1xuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIGJ5dGUgbGVuZ3RoIG9mIGEgSmF2YVNjcmlwdCBzdHJpbmcuXG4gKlxuICogTm90ZSB0aGF0IGEgSmF2YVNjcmlwdCBzdHJpbmcgY2FuIGNvbnRhaW4gd2lkZSBjaGFyYWN0ZXJzLCB0aGVyZWZvcmUgdGhlXG4gKiBsZW5ndGggb2YgdGhlIHN0cmluZyBpcyBub3QgbmVjZXNzYXJpbHkgZXF1YWwgdG8gdGhlIGJ5dGUgbGVuZ3RoLlxuICpcbiAqIEBwYXJhbSBzdHIgSW5wdXQgc3RyaW5nLlxuICogQHJldHVybnMgQnl0ZSBsZW5ndGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdCeXRlTGVuZ3RoKHN0cikge1xuICAgIGlmICh1c2VOb2RlQnVmZmVyKSB7XG4gICAgICAgIHJldHVybiBCdWZmZXIuYnl0ZUxlbmd0aChzdHIpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEJsb2IoW3N0cl0pLnNpemU7XG59XG4vKipcbiAqIEVuY29kZSBhbiBBcnJheUJ1ZmZlciBhcyBhIGJhc2U2NCBlbmNvZGVkIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gYnVmZmVyIGBBcnJheUJ1ZmZlcmAgdG8gYmUgY29udmVydGVkLlxuICogQHJldHVybnMgQSBzdHJpbmcgdGhhdCBiYXNlNjQtZW5jb2RlcyBgYnVmZmVyYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFycmF5QnVmZmVyVG9CYXNlNjRTdHJpbmcoYnVmZmVyKSB7XG4gICAgaWYgKHVzZU5vZGVCdWZmZXIpIHtcbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGJ1ZmZlcikudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgIH1cbiAgICBjb25zdCBidWYgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xuICAgIGxldCBzID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSBidWYubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gYnRvYShzKTtcbn1cbi8qKlxuICogRGVjb2RlIGEgYmFzZTY0IHN0cmluZyBhcyBhbiBBcnJheUJ1ZmZlci5cbiAqXG4gKiBAcGFyYW0gc3RyIEJhc2U2NCBzdHJpbmcuXG4gKiBAcmV0dXJucyBEZWNvZGVkIGBBcnJheUJ1ZmZlcmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiYXNlNjRTdHJpbmdUb0FycmF5QnVmZmVyKHN0cikge1xuICAgIGlmICh1c2VOb2RlQnVmZmVyKSB7XG4gICAgICAgIGNvbnN0IGJ1ZiA9IEJ1ZmZlci5mcm9tKHN0ciwgJ2Jhc2U2NCcpO1xuICAgICAgICByZXR1cm4gYnVmLmJ1ZmZlci5zbGljZShidWYuYnl0ZU9mZnNldCwgYnVmLmJ5dGVPZmZzZXQgKyBidWYuYnl0ZUxlbmd0aCk7XG4gICAgfVxuICAgIGNvbnN0IHMgPSBhdG9iKHN0cik7XG4gICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkocy5sZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBidWZmZXIuc2V0KFtzLmNoYXJDb2RlQXQoaSldLCBpKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1ZmZlci5idWZmZXI7XG59XG4vKipcbiAqIENvbmNhdGVuYXRlIGEgbnVtYmVyIG9mIEFycmF5QnVmZmVycyBpbnRvIG9uZS5cbiAqXG4gKiBAcGFyYW0gYnVmZmVycyBBIG51bWJlciBvZiBhcnJheSBidWZmZXJzIHRvIGNvbmNhdGVuYXRlLlxuICogQHJldHVybnMgUmVzdWx0IG9mIGNvbmNhdGVuYXRpbmcgYGJ1ZmZlcnNgIGluIG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uY2F0ZW5hdGVBcnJheUJ1ZmZlcnMoYnVmZmVycykge1xuICAgIGlmIChidWZmZXJzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gYnVmZmVyc1swXTtcbiAgICB9XG4gICAgbGV0IHRvdGFsQnl0ZUxlbmd0aCA9IDA7XG4gICAgYnVmZmVycy5mb3JFYWNoKChidWZmZXIpID0+IHtcbiAgICAgICAgdG90YWxCeXRlTGVuZ3RoICs9IGJ1ZmZlci5ieXRlTGVuZ3RoO1xuICAgIH0pO1xuICAgIGNvbnN0IHRlbXAgPSBuZXcgVWludDhBcnJheSh0b3RhbEJ5dGVMZW5ndGgpO1xuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIGJ1ZmZlcnMuZm9yRWFjaCgoYnVmZmVyKSA9PiB7XG4gICAgICAgIHRlbXAuc2V0KG5ldyBVaW50OEFycmF5KGJ1ZmZlciksIG9mZnNldCk7XG4gICAgICAgIG9mZnNldCArPSBidWZmZXIuYnl0ZUxlbmd0aDtcbiAgICB9KTtcbiAgICByZXR1cm4gdGVtcC5idWZmZXI7XG59XG4vKipcbiAqIEdldCB0aGUgYmFzZW5hbWUgb2YgYSBwYXRoLlxuICpcbiAqIEJlaGF2ZXMgaW4gYSB3YXkgYW5hbG9nb3VzIHRvIExpbnV4J3MgYmFzZW5hbWUgY29tbWFuZC5cbiAqXG4gKiBAcGFyYW0gcGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gYmFzZW5hbWUocGF0aCkge1xuICAgIGNvbnN0IFNFUEFSQVRPUiA9ICcvJztcbiAgICBwYXRoID0gcGF0aC50cmltKCk7XG4gICAgd2hpbGUgKHBhdGguZW5kc1dpdGgoU0VQQVJBVE9SKSkge1xuICAgICAgICBwYXRoID0gcGF0aC5zbGljZSgwLCBwYXRoLmxlbmd0aCAtIDEpO1xuICAgIH1cbiAgICBjb25zdCBpdGVtcyA9IHBhdGguc3BsaXQoU0VQQVJBVE9SKTtcbiAgICByZXR1cm4gaXRlbXNbaXRlbXMubGVuZ3RoIC0gMV07XG59XG4vKipcbiAqIENyZWF0ZSBgTW9kZWxKU09OYCBmcm9tIGBNb2RlbEFydGlmYWN0c2AuXG4gKlxuICogQHBhcmFtIGFydGlmYWN0cyBNb2RlbCBhcnRpZmFjdHMsIGRlc2NyaWJpbmcgdGhlIG1vZGVsIGFuZCBpdHMgd2VpZ2h0cy5cbiAqIEBwYXJhbSBtYW5pZmVzdCBXZWlnaHQgbWFuaWZlc3QsIGRlc2NyaWJpbmcgd2hlcmUgdGhlIHdlaWdodHMgb2YgdGhlXG4gKiAgICAgYE1vZGVsQXJ0aWZhY3RzYCBhcmUgc3RvcmVkLCBhbmQgc29tZSBtZXRhZGF0YSBhYm91dCB0aGVtLlxuICogQHJldHVybnMgT2JqZWN0IHJlcHJlc2VudGluZyB0aGUgYG1vZGVsLmpzb25gIGZpbGUgZGVzY3JpYmluZyB0aGUgbW9kZWxcbiAqICAgICBhcnRpZmFjdHMgYW5kIHdlaWdodHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1vZGVsSlNPTkZvck1vZGVsQXJ0aWZhY3RzKGFydGlmYWN0cywgbWFuaWZlc3QpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgIG1vZGVsVG9wb2xvZ3k6IGFydGlmYWN0cy5tb2RlbFRvcG9sb2d5LFxuICAgICAgICBmb3JtYXQ6IGFydGlmYWN0cy5mb3JtYXQsXG4gICAgICAgIGdlbmVyYXRlZEJ5OiBhcnRpZmFjdHMuZ2VuZXJhdGVkQnksXG4gICAgICAgIGNvbnZlcnRlZEJ5OiBhcnRpZmFjdHMuY29udmVydGVkQnksXG4gICAgICAgIHdlaWdodHNNYW5pZmVzdDogbWFuaWZlc3RcbiAgICB9O1xuICAgIGlmIChhcnRpZmFjdHMuc2lnbmF0dXJlICE9IG51bGwpIHtcbiAgICAgICAgcmVzdWx0LnNpZ25hdHVyZSA9IGFydGlmYWN0cy5zaWduYXR1cmU7XG4gICAgfVxuICAgIGlmIChhcnRpZmFjdHMudXNlckRlZmluZWRNZXRhZGF0YSAhPSBudWxsKSB7XG4gICAgICAgIHJlc3VsdC51c2VyRGVmaW5lZE1ldGFkYXRhID0gYXJ0aWZhY3RzLnVzZXJEZWZpbmVkTWV0YWRhdGE7XG4gICAgfVxuICAgIGlmIChhcnRpZmFjdHMubW9kZWxJbml0aWFsaXplciAhPSBudWxsKSB7XG4gICAgICAgIHJlc3VsdC5tb2RlbEluaXRpYWxpemVyID0gYXJ0aWZhY3RzLm1vZGVsSW5pdGlhbGl6ZXI7XG4gICAgfVxuICAgIGlmIChhcnRpZmFjdHMudHJhaW5pbmdDb25maWcgIT0gbnVsbCkge1xuICAgICAgICByZXN1bHQudHJhaW5pbmdDb25maWcgPSBhcnRpZmFjdHMudHJhaW5pbmdDb25maWc7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIENyZWF0ZSBgTW9kZWxBcnRpZmFjdHNgIGZyb20gYSBKU09OIGZpbGUuXG4gKlxuICogQHBhcmFtIG1vZGVsSlNPTiBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyc2VkIEpTT04gb2YgYG1vZGVsLmpzb25gXG4gKiBAcGFyYW0gbG9hZFdlaWdodHMgRnVuY3Rpb24gdGhhdCB0YWtlcyB0aGUgSlNPTiBmaWxlJ3Mgd2VpZ2h0cyBtYW5pZmVzdCxcbiAqICAgICByZWFkcyB3ZWlnaHRzIGZyb20gdGhlIGxpc3RlZCBwYXRoKHMpLCBhbmQgcmV0dXJucyBhIFByb21pc2Ugb2YgdGhlXG4gKiAgICAgd2VpZ2h0IG1hbmlmZXN0IGVudHJpZXMgYWxvbmcgd2l0aCB0aGUgd2VpZ2h0cyBkYXRhLlxuICogQHJldHVybnMgQSBQcm9taXNlIG9mIHRoZSBgTW9kZWxBcnRpZmFjdHNgLCBhcyBkZXNjcmliZWQgYnkgdGhlIEpTT04gZmlsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE1vZGVsQXJ0aWZhY3RzRm9ySlNPTihtb2RlbEpTT04sIGxvYWRXZWlnaHRzKSB7XG4gICAgY29uc3QgbW9kZWxBcnRpZmFjdHMgPSB7XG4gICAgICAgIG1vZGVsVG9wb2xvZ3k6IG1vZGVsSlNPTi5tb2RlbFRvcG9sb2d5LFxuICAgICAgICBmb3JtYXQ6IG1vZGVsSlNPTi5mb3JtYXQsXG4gICAgICAgIGdlbmVyYXRlZEJ5OiBtb2RlbEpTT04uZ2VuZXJhdGVkQnksXG4gICAgICAgIGNvbnZlcnRlZEJ5OiBtb2RlbEpTT04uY29udmVydGVkQnlcbiAgICB9O1xuICAgIGlmIChtb2RlbEpTT04udHJhaW5pbmdDb25maWcgIT0gbnVsbCkge1xuICAgICAgICBtb2RlbEFydGlmYWN0cy50cmFpbmluZ0NvbmZpZyA9IG1vZGVsSlNPTi50cmFpbmluZ0NvbmZpZztcbiAgICB9XG4gICAgaWYgKG1vZGVsSlNPTi53ZWlnaHRzTWFuaWZlc3QgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBbd2VpZ2h0U3BlY3MsIHdlaWdodERhdGFdID0gYXdhaXQgbG9hZFdlaWdodHMobW9kZWxKU09OLndlaWdodHNNYW5pZmVzdCk7XG4gICAgICAgIG1vZGVsQXJ0aWZhY3RzLndlaWdodFNwZWNzID0gd2VpZ2h0U3BlY3M7XG4gICAgICAgIG1vZGVsQXJ0aWZhY3RzLndlaWdodERhdGEgPSB3ZWlnaHREYXRhO1xuICAgIH1cbiAgICBpZiAobW9kZWxKU09OLnNpZ25hdHVyZSAhPSBudWxsKSB7XG4gICAgICAgIG1vZGVsQXJ0aWZhY3RzLnNpZ25hdHVyZSA9IG1vZGVsSlNPTi5zaWduYXR1cmU7XG4gICAgfVxuICAgIGlmIChtb2RlbEpTT04udXNlckRlZmluZWRNZXRhZGF0YSAhPSBudWxsKSB7XG4gICAgICAgIG1vZGVsQXJ0aWZhY3RzLnVzZXJEZWZpbmVkTWV0YWRhdGEgPSBtb2RlbEpTT04udXNlckRlZmluZWRNZXRhZGF0YTtcbiAgICB9XG4gICAgaWYgKG1vZGVsSlNPTi5tb2RlbEluaXRpYWxpemVyICE9IG51bGwpIHtcbiAgICAgICAgbW9kZWxBcnRpZmFjdHMubW9kZWxJbml0aWFsaXplciA9IG1vZGVsSlNPTi5tb2RlbEluaXRpYWxpemVyO1xuICAgIH1cbiAgICByZXR1cm4gbW9kZWxBcnRpZmFjdHM7XG59XG4vKipcbiAqIFBvcHVsYXRlIE1vZGVsQXJ0aWZhY3RzSW5mbyBmaWVsZHMgZm9yIGEgbW9kZWwgd2l0aCBKU09OIHRvcG9sb2d5LlxuICogQHBhcmFtIG1vZGVsQXJ0aWZhY3RzXG4gKiBAcmV0dXJucyBBIE1vZGVsQXJ0aWZhY3RzSW5mbyBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNb2RlbEFydGlmYWN0c0luZm9Gb3JKU09OKG1vZGVsQXJ0aWZhY3RzKSB7XG4gICAgaWYgKG1vZGVsQXJ0aWZhY3RzLm1vZGVsVG9wb2xvZ3kgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIEpTT04gbW9kZWwgdG9wb2xvZ3ksIHJlY2VpdmVkIEFycmF5QnVmZmVyLicpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBkYXRlU2F2ZWQ6IG5ldyBEYXRlKCksXG4gICAgICAgIG1vZGVsVG9wb2xvZ3lUeXBlOiAnSlNPTicsXG4gICAgICAgIG1vZGVsVG9wb2xvZ3lCeXRlczogbW9kZWxBcnRpZmFjdHMubW9kZWxUb3BvbG9neSA9PSBudWxsID9cbiAgICAgICAgICAgIDAgOlxuICAgICAgICAgICAgc3RyaW5nQnl0ZUxlbmd0aChKU09OLnN0cmluZ2lmeShtb2RlbEFydGlmYWN0cy5tb2RlbFRvcG9sb2d5KSksXG4gICAgICAgIHdlaWdodFNwZWNzQnl0ZXM6IG1vZGVsQXJ0aWZhY3RzLndlaWdodFNwZWNzID09IG51bGwgP1xuICAgICAgICAgICAgMCA6XG4gICAgICAgICAgICBzdHJpbmdCeXRlTGVuZ3RoKEpTT04uc3RyaW5naWZ5KG1vZGVsQXJ0aWZhY3RzLndlaWdodFNwZWNzKSksXG4gICAgICAgIHdlaWdodERhdGFCeXRlczogbW9kZWxBcnRpZmFjdHMud2VpZ2h0RGF0YSA9PSBudWxsID9cbiAgICAgICAgICAgIDAgOlxuICAgICAgICAgICAgbW9kZWxBcnRpZmFjdHMud2VpZ2h0RGF0YS5ieXRlTGVuZ3RoLFxuICAgIH07XG59XG4vKipcbiAqIENvbXB1dGVzIG1hbnRpc2EgdGFibGUgZm9yIGNhc3RpbmcgRmxvYXQxNiB0byBGbG9hdDMyXG4gKiBTZWUgaHR0cDovL3d3dy5mb3gtdG9vbGtpdC5vcmcvZnRwL2Zhc3RoYWxmZmxvYXRjb252ZXJzaW9uLnBkZlxuICpcbiAqIEByZXR1cm5zIFVpbnQzMkFycmF5LCAyMDQ4IG1hbnRpc3NhIGxvb2t1cCB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVGbG9hdDE2TWFudGlzYVRhYmxlKCkge1xuICAgIGNvbnN0IGNvbnZlcnRNYW50aXNzYSA9IChpKSA9PiB7XG4gICAgICAgIGxldCBtID0gaSA8PCAxMztcbiAgICAgICAgbGV0IGUgPSAwO1xuICAgICAgICB3aGlsZSAoKG0gJiAweDAwODAwMDAwKSA9PT0gMCkge1xuICAgICAgICAgICAgZSAtPSAweDAwODAwMDAwO1xuICAgICAgICAgICAgbSA8PD0gMTtcbiAgICAgICAgfVxuICAgICAgICBtICY9IH4weDAwODAwMDAwO1xuICAgICAgICBlICs9IDB4Mzg4MDAwMDA7XG4gICAgICAgIHJldHVybiBtIHwgZTtcbiAgICB9O1xuICAgIGNvbnN0IG1hbnRpc2FUYWJsZSA9IG5ldyBVaW50MzJBcnJheSgyMDQ4KTtcbiAgICBtYW50aXNhVGFibGVbMF0gPSAwO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgMTAyNDsgaSsrKSB7XG4gICAgICAgIG1hbnRpc2FUYWJsZVtpXSA9IGNvbnZlcnRNYW50aXNzYShpKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDEwMjQ7IGkgPCAyMDQ4OyBpKyspIHtcbiAgICAgICAgbWFudGlzYVRhYmxlW2ldID0gMHgzODAwMDAwMCArICgoaSAtIDEwMjQpIDw8IDEzKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hbnRpc2FUYWJsZTtcbn1cbi8qKlxuICogQ29tcHV0ZXMgZXhwb25lbnQgdGFibGUgZm9yIGNhc3RpbmcgRmxvYXQxNiB0byBGbG9hdDMyXG4gKiBTZWUgaHR0cDovL3d3dy5mb3gtdG9vbGtpdC5vcmcvZnRwL2Zhc3RoYWxmZmxvYXRjb252ZXJzaW9uLnBkZlxuICpcbiAqIEByZXR1cm5zIFVpbnQzMkFycmF5LCA2NCBleHBvbmVudCBsb29rdXAgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBjb21wdXRlRmxvYXQxNkV4cG9uZW50VGFibGUoKSB7XG4gICAgY29uc3QgZXhwb25lbnRUYWJsZSA9IG5ldyBVaW50MzJBcnJheSg2NCk7XG4gICAgZXhwb25lbnRUYWJsZVswXSA9IDA7XG4gICAgZXhwb25lbnRUYWJsZVszMV0gPSAweDQ3ODAwMDAwO1xuICAgIGV4cG9uZW50VGFibGVbMzJdID0gMHg4MDAwMDAwMDtcbiAgICBleHBvbmVudFRhYmxlWzYzXSA9IDB4Yzc4MDAwMDA7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCAzMTsgaSsrKSB7XG4gICAgICAgIGV4cG9uZW50VGFibGVbaV0gPSBpIDw8IDIzO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMzM7IGkgPCA2MzsgaSsrKSB7XG4gICAgICAgIGV4cG9uZW50VGFibGVbaV0gPSAweDgwMDAwMDAwICsgKChpIC0gMzIpIDw8IDIzKTtcbiAgICB9XG4gICAgcmV0dXJuIGV4cG9uZW50VGFibGU7XG59XG4vKipcbiAqIENvbXB1dGVzIG9mZnNldCB0YWJsZSBmb3IgY2FzdGluZyBGbG9hdDE2IHRvIEZsb2F0MzJcbiAqIFNlZSBodHRwOi8vd3d3LmZveC10b29sa2l0Lm9yZy9mdHAvZmFzdGhhbGZmbG9hdGNvbnZlcnNpb24ucGRmXG4gKlxuICogQHJldHVybnMgVWludDMyQXJyYXksIDZkIG9mZnNldCB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVGbG9hdDE2T2Zmc2V0VGFibGUoKSB7XG4gICAgY29uc3Qgb2Zmc2V0VGFibGUgPSBuZXcgVWludDMyQXJyYXkoNjQpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNjQ7IGkrKykge1xuICAgICAgICBvZmZzZXRUYWJsZVtpXSA9IDEwMjQ7XG4gICAgfVxuICAgIG9mZnNldFRhYmxlWzBdID0gb2Zmc2V0VGFibGVbMzJdID0gMDtcbiAgICByZXR1cm4gb2Zmc2V0VGFibGU7XG59XG4vKipcbiAqIFJldHJpZXZlIGEgRmxvYXQxNiBkZWNvZGVyIHdoaWNoIHdpbGwgZGVjb2RlIGEgQnl0ZUFycmF5IG9mIEZsb2F0MTYgdmFsdWVzXG4gKiB0byBhIEZsb2F0MzJBcnJheS5cbiAqXG4gKiBAcmV0dXJucyBGdW5jdGlvbiAoYnVmZmVyOiBVaW50MTZBcnJheSkgPT4gRmxvYXQzMkFycmF5IHdoaWNoIGRlY29kZXNcbiAqICAgICAgICAgIHRoZSBVaW50MTZBcnJheSBvZiBGbG9hdDE2IGJ5dGVzIHRvIGEgRmxvYXQzMkFycmF5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmxvYXQxNkRlY29kZXIoKSB7XG4gICAgLy8gQWxnb3JpdGhtIGlzIGJhc2VkIG9mZiBvZlxuICAgIC8vIGh0dHA6Ly93d3cuZm94LXRvb2xraXQub3JnL2Z0cC9mYXN0aGFsZmZsb2F0Y29udmVyc2lvbi5wZGZcbiAgICAvLyBDYWNoZSBsb29rdXAgdGFibGVzXG4gICAgY29uc3QgbWFudGlzYVRhYmxlID0gY29tcHV0ZUZsb2F0MTZNYW50aXNhVGFibGUoKTtcbiAgICBjb25zdCBleHBvbmVudFRhYmxlID0gY29tcHV0ZUZsb2F0MTZFeHBvbmVudFRhYmxlKCk7XG4gICAgY29uc3Qgb2Zmc2V0VGFibGUgPSBjb21wdXRlRmxvYXQxNk9mZnNldFRhYmxlKCk7XG4gICAgcmV0dXJuIChxdWFudGl6ZWRBcnJheSkgPT4ge1xuICAgICAgICBjb25zdCBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoNCAqIHF1YW50aXplZEFycmF5Lmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IGJ1ZmZlclVpbnQzMlZpZXcgPSBuZXcgVWludDMyQXJyYXkoYnVmZmVyKTtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHF1YW50aXplZEFycmF5Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgZmxvYXQxNkJpdHMgPSBxdWFudGl6ZWRBcnJheVtpbmRleF07XG4gICAgICAgICAgICBjb25zdCBmbG9hdDMyQml0cyA9IG1hbnRpc2FUYWJsZVtvZmZzZXRUYWJsZVtmbG9hdDE2Qml0cyA+PiAxMF0gKyAoZmxvYXQxNkJpdHMgJiAweDNmZildICtcbiAgICAgICAgICAgICAgICBleHBvbmVudFRhYmxlW2Zsb2F0MTZCaXRzID4+IDEwXTtcbiAgICAgICAgICAgIGJ1ZmZlclVpbnQzMlZpZXdbaW5kZXhdID0gZmxvYXQzMkJpdHM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoYnVmZmVyKTtcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW9fdXRpbHMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0ICcuLi9mbGFncyc7XG5pbXBvcnQgeyBlbnYgfSBmcm9tICcuLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IGFycmF5QnVmZmVyVG9CYXNlNjRTdHJpbmcsIGJhc2U2NFN0cmluZ1RvQXJyYXlCdWZmZXIsIGdldE1vZGVsQXJ0aWZhY3RzSW5mb0ZvckpTT04gfSBmcm9tICcuL2lvX3V0aWxzJztcbmltcG9ydCB7IElPUm91dGVyUmVnaXN0cnkgfSBmcm9tICcuL3JvdXRlcl9yZWdpc3RyeSc7XG5jb25zdCBQQVRIX1NFUEFSQVRPUiA9ICcvJztcbmNvbnN0IFBBVEhfUFJFRklYID0gJ3RlbnNvcmZsb3dqc19tb2RlbHMnO1xuY29uc3QgSU5GT19TVUZGSVggPSAnaW5mbyc7XG5jb25zdCBNT0RFTF9UT1BPTE9HWV9TVUZGSVggPSAnbW9kZWxfdG9wb2xvZ3knO1xuY29uc3QgV0VJR0hUX1NQRUNTX1NVRkZJWCA9ICd3ZWlnaHRfc3BlY3MnO1xuY29uc3QgV0VJR0hUX0RBVEFfU1VGRklYID0gJ3dlaWdodF9kYXRhJztcbmNvbnN0IE1PREVMX01FVEFEQVRBX1NVRkZJWCA9ICdtb2RlbF9tZXRhZGF0YSc7XG4vKipcbiAqIFB1cmdlIGFsbCB0ZW5zb3JmbG93LmpzLXNhdmVkIG1vZGVsIGFydGlmYWN0cyBmcm9tIGxvY2FsIHN0b3JhZ2UuXG4gKlxuICogQHJldHVybnMgUGF0aHMgb2YgdGhlIG1vZGVscyBwdXJnZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwdXJnZUxvY2FsU3RvcmFnZUFydGlmYWN0cygpIHtcbiAgICBpZiAoIWVudigpLmdldEJvb2woJ0lTX0JST1dTRVInKSB8fCB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyB8fFxuICAgICAgICB0eXBlb2Ygd2luZG93LmxvY2FsU3RvcmFnZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwdXJnZUxvY2FsU3RvcmFnZU1vZGVscygpIGNhbm5vdCBwcm9jZWVkIGJlY2F1c2UgbG9jYWwgc3RvcmFnZSBpcyAnICtcbiAgICAgICAgICAgICd1bmF2YWlsYWJsZSBpbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudC4nKTtcbiAgICB9XG4gICAgY29uc3QgTFMgPSB3aW5kb3cubG9jYWxTdG9yYWdlO1xuICAgIGNvbnN0IHB1cmdlZE1vZGVsUGF0aHMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IExTLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IExTLmtleShpKTtcbiAgICAgICAgY29uc3QgcHJlZml4ID0gUEFUSF9QUkVGSVggKyBQQVRIX1NFUEFSQVRPUjtcbiAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKHByZWZpeCkgJiYga2V5Lmxlbmd0aCA+IHByZWZpeC5sZW5ndGgpIHtcbiAgICAgICAgICAgIExTLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgICAgICAgIGNvbnN0IG1vZGVsTmFtZSA9IGdldE1vZGVsUGF0aEZyb21LZXkoa2V5KTtcbiAgICAgICAgICAgIGlmIChwdXJnZWRNb2RlbFBhdGhzLmluZGV4T2YobW9kZWxOYW1lKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBwdXJnZWRNb2RlbFBhdGhzLnB1c2gobW9kZWxOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHVyZ2VkTW9kZWxQYXRocztcbn1cbmZ1bmN0aW9uIGdldE1vZGVsS2V5cyhwYXRoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaW5mbzogW1BBVEhfUFJFRklYLCBwYXRoLCBJTkZPX1NVRkZJWF0uam9pbihQQVRIX1NFUEFSQVRPUiksXG4gICAgICAgIHRvcG9sb2d5OiBbUEFUSF9QUkVGSVgsIHBhdGgsIE1PREVMX1RPUE9MT0dZX1NVRkZJWF0uam9pbihQQVRIX1NFUEFSQVRPUiksXG4gICAgICAgIHdlaWdodFNwZWNzOiBbUEFUSF9QUkVGSVgsIHBhdGgsIFdFSUdIVF9TUEVDU19TVUZGSVhdLmpvaW4oUEFUSF9TRVBBUkFUT1IpLFxuICAgICAgICB3ZWlnaHREYXRhOiBbUEFUSF9QUkVGSVgsIHBhdGgsIFdFSUdIVF9EQVRBX1NVRkZJWF0uam9pbihQQVRIX1NFUEFSQVRPUiksXG4gICAgICAgIG1vZGVsTWV0YWRhdGE6IFtQQVRIX1BSRUZJWCwgcGF0aCwgTU9ERUxfTUVUQURBVEFfU1VGRklYXS5qb2luKFBBVEhfU0VQQVJBVE9SKVxuICAgIH07XG59XG5mdW5jdGlvbiByZW1vdmVJdGVtcyhrZXlzKSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LnZhbHVlcyhrZXlzKSkge1xuICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICB9XG59XG4vKipcbiAqIEdldCBtb2RlbCBwYXRoIGZyb20gYSBsb2NhbC1zdG9yYWdlIGtleS5cbiAqXG4gKiBFLmcuLCAndGVuc29yZmxvd2pzX21vZGVscy9teS9tb2RlbC8xL2luZm8nIC0tPiAnbXkvbW9kZWwvMSdcbiAqXG4gKiBAcGFyYW0ga2V5XG4gKi9cbmZ1bmN0aW9uIGdldE1vZGVsUGF0aEZyb21LZXkoa2V5KSB7XG4gICAgY29uc3QgaXRlbXMgPSBrZXkuc3BsaXQoUEFUSF9TRVBBUkFUT1IpO1xuICAgIGlmIChpdGVtcy5sZW5ndGggPCAzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBrZXkgZm9ybWF0OiAke2tleX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zLnNsaWNlKDEsIGl0ZW1zLmxlbmd0aCAtIDEpLmpvaW4oUEFUSF9TRVBBUkFUT1IpO1xufVxuZnVuY3Rpb24gbWF5YmVTdHJpcFNjaGVtZShrZXkpIHtcbiAgICByZXR1cm4ga2V5LnN0YXJ0c1dpdGgoQnJvd3NlckxvY2FsU3RvcmFnZS5VUkxfU0NIRU1FKSA/XG4gICAgICAgIGtleS5zbGljZShCcm93c2VyTG9jYWxTdG9yYWdlLlVSTF9TQ0hFTUUubGVuZ3RoKSA6XG4gICAgICAgIGtleTtcbn1cbi8qKlxuICogSU9IYW5kbGVyIHN1YmNsYXNzOiBCcm93c2VyIExvY2FsIFN0b3JhZ2UuXG4gKlxuICogU2VlIHRoZSBkb2Mgc3RyaW5nIHRvIGBicm93c2VyTG9jYWxTdG9yYWdlYCBmb3IgbW9yZSBkZXRhaWxzLlxuICovXG5leHBvcnQgY2xhc3MgQnJvd3NlckxvY2FsU3RvcmFnZSB7XG4gICAgY29uc3RydWN0b3IobW9kZWxQYXRoKSB7XG4gICAgICAgIGlmICghZW52KCkuZ2V0Qm9vbCgnSVNfQlJPV1NFUicpIHx8IHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAgICAgICB0eXBlb2Ygd2luZG93LmxvY2FsU3RvcmFnZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIC8vIFRPRE8oY2Fpcyk6IEFkZCBtb3JlIGluZm8gYWJvdXQgd2hhdCBJT0hhbmRsZXIgc3VidHlwZXMgYXJlXG4gICAgICAgICAgICAvLyBhdmFpbGFibGUuXG4gICAgICAgICAgICAvLyAgIE1heWJlIHBvaW50IHRvIGEgZG9jIHBhZ2Ugb24gdGhlIHdlYiBhbmQvb3IgYXV0b21hdGljYWxseSBkZXRlcm1pbmVcbiAgICAgICAgICAgIC8vICAgdGhlIGF2YWlsYWJsZSBJT0hhbmRsZXJzIGFuZCBwcmludCB0aGVtIGluIHRoZSBlcnJvciBtZXNzYWdlLlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgY3VycmVudCBlbnZpcm9ubWVudCBkb2VzIG5vdCBzdXBwb3J0IGxvY2FsIHN0b3JhZ2UuJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5MUyA9IHdpbmRvdy5sb2NhbFN0b3JhZ2U7XG4gICAgICAgIGlmIChtb2RlbFBhdGggPT0gbnVsbCB8fCAhbW9kZWxQYXRoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvciBsb2NhbCBzdG9yYWdlLCBtb2RlbFBhdGggbXVzdCBub3QgYmUgbnVsbCwgdW5kZWZpbmVkIG9yIGVtcHR5LicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubW9kZWxQYXRoID0gbW9kZWxQYXRoO1xuICAgICAgICB0aGlzLmtleXMgPSBnZXRNb2RlbEtleXModGhpcy5tb2RlbFBhdGgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTYXZlIG1vZGVsIGFydGlmYWN0cyB0byBicm93c2VyIGxvY2FsIHN0b3JhZ2UuXG4gICAgICpcbiAgICAgKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gdG8gYGJyb3dzZXJMb2NhbFN0b3JhZ2VgIGZvciBkZXRhaWxzIG9uIHRoZSBzYXZlZFxuICAgICAqIGFydGlmYWN0cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtb2RlbEFydGlmYWN0cyBUaGUgbW9kZWwgYXJ0aWZhY3RzIHRvIGJlIHN0b3JlZC5cbiAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiBTYXZlUmVzdWx0LlxuICAgICAqL1xuICAgIGFzeW5jIHNhdmUobW9kZWxBcnRpZmFjdHMpIHtcbiAgICAgICAgaWYgKG1vZGVsQXJ0aWZhY3RzLm1vZGVsVG9wb2xvZ3kgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCcm93c2VyTG9jYWxTdG9yYWdlLnNhdmUoKSBkb2VzIG5vdCBzdXBwb3J0IHNhdmluZyBtb2RlbCB0b3BvbG9neSAnICtcbiAgICAgICAgICAgICAgICAnaW4gYmluYXJ5IGZvcm1hdHMgeWV0LicpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdG9wb2xvZ3kgPSBKU09OLnN0cmluZ2lmeShtb2RlbEFydGlmYWN0cy5tb2RlbFRvcG9sb2d5KTtcbiAgICAgICAgICAgIGNvbnN0IHdlaWdodFNwZWNzID0gSlNPTi5zdHJpbmdpZnkobW9kZWxBcnRpZmFjdHMud2VpZ2h0U3BlY3MpO1xuICAgICAgICAgICAgY29uc3QgbW9kZWxBcnRpZmFjdHNJbmZvID0gZ2V0TW9kZWxBcnRpZmFjdHNJbmZvRm9ySlNPTihtb2RlbEFydGlmYWN0cyk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuTFMuc2V0SXRlbSh0aGlzLmtleXMuaW5mbywgSlNPTi5zdHJpbmdpZnkobW9kZWxBcnRpZmFjdHNJbmZvKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5MUy5zZXRJdGVtKHRoaXMua2V5cy50b3BvbG9neSwgdG9wb2xvZ3kpO1xuICAgICAgICAgICAgICAgIHRoaXMuTFMuc2V0SXRlbSh0aGlzLmtleXMud2VpZ2h0U3BlY3MsIHdlaWdodFNwZWNzKTtcbiAgICAgICAgICAgICAgICB0aGlzLkxTLnNldEl0ZW0odGhpcy5rZXlzLndlaWdodERhdGEsIGFycmF5QnVmZmVyVG9CYXNlNjRTdHJpbmcobW9kZWxBcnRpZmFjdHMud2VpZ2h0RGF0YSkpO1xuICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBKU09OLnN0cmluZ2lmeSBkb2Vzbid0IHdyaXRlIG91dCBrZXlzIHRoYXQgaGF2ZSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAvLyB2YWx1ZXMsIHNvIGZvciBzb21lIGtleXMsIHdlIHNldCB1bmRlZmluZWQgaW5zdGVhZCBvZiBhIG51bGwtaXNoXG4gICAgICAgICAgICAgICAgLy8gdmFsdWUuXG4gICAgICAgICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdDogbW9kZWxBcnRpZmFjdHMuZm9ybWF0LFxuICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRCeTogbW9kZWxBcnRpZmFjdHMuZ2VuZXJhdGVkQnksXG4gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZEJ5OiBtb2RlbEFydGlmYWN0cy5jb252ZXJ0ZWRCeSxcbiAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlOiBtb2RlbEFydGlmYWN0cy5zaWduYXR1cmUgIT0gbnVsbCA/XG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbEFydGlmYWN0cy5zaWduYXR1cmUgOlxuICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICB1c2VyRGVmaW5lZE1ldGFkYXRhOiBtb2RlbEFydGlmYWN0cy51c2VyRGVmaW5lZE1ldGFkYXRhICE9IG51bGwgP1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxBcnRpZmFjdHMudXNlckRlZmluZWRNZXRhZGF0YSA6XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIG1vZGVsSW5pdGlhbGl6ZXI6IG1vZGVsQXJ0aWZhY3RzLm1vZGVsSW5pdGlhbGl6ZXIgIT0gbnVsbCA/XG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbEFydGlmYWN0cy5tb2RlbEluaXRpYWxpemVyIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgdHJhaW5pbmdDb25maWc6IG1vZGVsQXJ0aWZhY3RzLnRyYWluaW5nQ29uZmlnICE9IG51bGwgP1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxBcnRpZmFjdHMudHJhaW5pbmdDb25maWcgOlxuICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLkxTLnNldEl0ZW0odGhpcy5rZXlzLm1vZGVsTWV0YWRhdGEsIEpTT04uc3RyaW5naWZ5KG1ldGFkYXRhKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbW9kZWxBcnRpZmFjdHNJbmZvIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgc2F2aW5nIGZhaWxlZCwgY2xlYW4gdXAgYWxsIGl0ZW1zIHNhdmVkIHNvIGZhci5cbiAgICAgICAgICAgICAgICByZW1vdmVJdGVtcyh0aGlzLmtleXMpO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHNhdmUgbW9kZWwgJyR7dGhpcy5tb2RlbFBhdGh9JyB0byBsb2NhbCBzdG9yYWdlOiBgICtcbiAgICAgICAgICAgICAgICAgICAgYHNpemUgcXVvdGEgYmVpbmcgZXhjZWVkZWQgaXMgYSBwb3NzaWJsZSBjYXVzZSBvZiB0aGlzIGZhaWx1cmU6IGAgK1xuICAgICAgICAgICAgICAgICAgICBgbW9kZWxUb3BvbG9neUJ5dGVzPSR7bW9kZWxBcnRpZmFjdHNJbmZvLm1vZGVsVG9wb2xvZ3lCeXRlc30sIGAgK1xuICAgICAgICAgICAgICAgICAgICBgd2VpZ2h0U3BlY3NCeXRlcz0ke21vZGVsQXJ0aWZhY3RzSW5mby53ZWlnaHRTcGVjc0J5dGVzfSwgYCArXG4gICAgICAgICAgICAgICAgICAgIGB3ZWlnaHREYXRhQnl0ZXM9JHttb2RlbEFydGlmYWN0c0luZm8ud2VpZ2h0RGF0YUJ5dGVzfS5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb2FkIGEgbW9kZWwgZnJvbSBsb2NhbCBzdG9yYWdlLlxuICAgICAqXG4gICAgICogU2VlIHRoZSBkb2N1bWVudGF0aW9uIHRvIGBicm93c2VyTG9jYWxTdG9yYWdlYCBmb3IgZGV0YWlscyBvbiB0aGUgc2F2ZWRcbiAgICAgKiBhcnRpZmFjdHMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgbG9hZGVkIG1vZGVsIChpZiBsb2FkaW5nIHN1Y2NlZWRzKS5cbiAgICAgKi9cbiAgICBhc3luYyBsb2FkKCkge1xuICAgICAgICBjb25zdCBpbmZvID0gSlNPTi5wYXJzZSh0aGlzLkxTLmdldEl0ZW0odGhpcy5rZXlzLmluZm8pKTtcbiAgICAgICAgaWYgKGluZm8gPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBsb2NhbCBzdG9yYWdlLCB0aGVyZSBpcyBubyBtb2RlbCB3aXRoIG5hbWUgJyR7dGhpcy5tb2RlbFBhdGh9J2ApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbmZvLm1vZGVsVG9wb2xvZ3lUeXBlICE9PSAnSlNPTicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnJvd3NlckxvY2FsU3RvcmFnZSBkb2VzIG5vdCBzdXBwb3J0IGxvYWRpbmcgbm9uLUpTT04gbW9kZWwgJyArXG4gICAgICAgICAgICAgICAgJ3RvcG9sb2d5IHlldC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvdXQgPSB7fTtcbiAgICAgICAgLy8gTG9hZCB0b3BvbG9neS5cbiAgICAgICAgY29uc3QgdG9wb2xvZ3kgPSBKU09OLnBhcnNlKHRoaXMuTFMuZ2V0SXRlbSh0aGlzLmtleXMudG9wb2xvZ3kpKTtcbiAgICAgICAgaWYgKHRvcG9sb2d5ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW4gbG9jYWwgc3RvcmFnZSwgdGhlIHRvcG9sb2d5IG9mIG1vZGVsICcke3RoaXMubW9kZWxQYXRofScgYCArXG4gICAgICAgICAgICAgICAgYGlzIG1pc3NpbmcuYCk7XG4gICAgICAgIH1cbiAgICAgICAgb3V0Lm1vZGVsVG9wb2xvZ3kgPSB0b3BvbG9neTtcbiAgICAgICAgLy8gTG9hZCB3ZWlnaHQgc3BlY3MuXG4gICAgICAgIGNvbnN0IHdlaWdodFNwZWNzID0gSlNPTi5wYXJzZSh0aGlzLkxTLmdldEl0ZW0odGhpcy5rZXlzLndlaWdodFNwZWNzKSk7XG4gICAgICAgIGlmICh3ZWlnaHRTcGVjcyA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluIGxvY2FsIHN0b3JhZ2UsIHRoZSB3ZWlnaHQgc3BlY3Mgb2YgbW9kZWwgJyR7dGhpcy5tb2RlbFBhdGh9JyBgICtcbiAgICAgICAgICAgICAgICBgYXJlIG1pc3NpbmcuYCk7XG4gICAgICAgIH1cbiAgICAgICAgb3V0LndlaWdodFNwZWNzID0gd2VpZ2h0U3BlY3M7XG4gICAgICAgIC8vIExvYWQgbWV0YS1kYXRhIGZpZWxkcy5cbiAgICAgICAgY29uc3QgbWV0YWRhdGFTdHJpbmcgPSB0aGlzLkxTLmdldEl0ZW0odGhpcy5rZXlzLm1vZGVsTWV0YWRhdGEpO1xuICAgICAgICBpZiAobWV0YWRhdGFTdHJpbmcgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBKU09OLnBhcnNlKG1ldGFkYXRhU3RyaW5nKTtcbiAgICAgICAgICAgIG91dC5mb3JtYXQgPSBtZXRhZGF0YS5mb3JtYXQ7XG4gICAgICAgICAgICBvdXQuZ2VuZXJhdGVkQnkgPSBtZXRhZGF0YS5nZW5lcmF0ZWRCeTtcbiAgICAgICAgICAgIG91dC5jb252ZXJ0ZWRCeSA9IG1ldGFkYXRhLmNvbnZlcnRlZEJ5O1xuICAgICAgICAgICAgaWYgKG1ldGFkYXRhLnNpZ25hdHVyZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgb3V0LnNpZ25hdHVyZSA9IG1ldGFkYXRhLnNpZ25hdHVyZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXRhZGF0YS51c2VyRGVmaW5lZE1ldGFkYXRhICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBvdXQudXNlckRlZmluZWRNZXRhZGF0YSA9IG1ldGFkYXRhLnVzZXJEZWZpbmVkTWV0YWRhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWV0YWRhdGEubW9kZWxJbml0aWFsaXplciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgb3V0Lm1vZGVsSW5pdGlhbGl6ZXIgPSBtZXRhZGF0YS5tb2RlbEluaXRpYWxpemVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1ldGFkYXRhLnRyYWluaW5nQ29uZmlnICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBvdXQudHJhaW5pbmdDb25maWcgPSBtZXRhZGF0YS50cmFpbmluZ0NvbmZpZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBMb2FkIHdlaWdodCBkYXRhLlxuICAgICAgICBjb25zdCB3ZWlnaHREYXRhQmFzZTY0ID0gdGhpcy5MUy5nZXRJdGVtKHRoaXMua2V5cy53ZWlnaHREYXRhKTtcbiAgICAgICAgaWYgKHdlaWdodERhdGFCYXNlNjQgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBsb2NhbCBzdG9yYWdlLCB0aGUgYmluYXJ5IHdlaWdodCB2YWx1ZXMgb2YgbW9kZWwgYCArXG4gICAgICAgICAgICAgICAgYCcke3RoaXMubW9kZWxQYXRofScgYXJlIG1pc3NpbmcuYCk7XG4gICAgICAgIH1cbiAgICAgICAgb3V0LndlaWdodERhdGEgPSBiYXNlNjRTdHJpbmdUb0FycmF5QnVmZmVyKHdlaWdodERhdGFCYXNlNjQpO1xuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cbn1cbkJyb3dzZXJMb2NhbFN0b3JhZ2UuVVJMX1NDSEVNRSA9ICdsb2NhbHN0b3JhZ2U6Ly8nO1xuZXhwb3J0IGNvbnN0IGxvY2FsU3RvcmFnZVJvdXRlciA9ICh1cmwpID0+IHtcbiAgICBpZiAoIWVudigpLmdldEJvb2woJ0lTX0JST1dTRVInKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh1cmwpICYmIHVybC5zdGFydHNXaXRoKEJyb3dzZXJMb2NhbFN0b3JhZ2UuVVJMX1NDSEVNRSkpIHtcbiAgICAgICAgICAgIHJldHVybiBicm93c2VyTG9jYWxTdG9yYWdlKHVybC5zbGljZShCcm93c2VyTG9jYWxTdG9yYWdlLlVSTF9TQ0hFTUUubGVuZ3RoKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn07XG5JT1JvdXRlclJlZ2lzdHJ5LnJlZ2lzdGVyU2F2ZVJvdXRlcihsb2NhbFN0b3JhZ2VSb3V0ZXIpO1xuSU9Sb3V0ZXJSZWdpc3RyeS5yZWdpc3RlckxvYWRSb3V0ZXIobG9jYWxTdG9yYWdlUm91dGVyKTtcbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgbG9jYWwgc3RvcmFnZSBJT0hhbmRsZXIuXG4gKlxuICogVGhpcyBgSU9IYW5kbGVyYCBzdXBwb3J0cyBib3RoIGBzYXZlYCBhbmQgYGxvYWRgLlxuICpcbiAqIEZvciBlYWNoIG1vZGVsJ3Mgc2F2ZWQgYXJ0aWZhY3RzLCBmb3VyIGl0ZW1zIGFyZSBzYXZlZCB0byBsb2NhbCBzdG9yYWdlLlxuICogICAtIGAke1BBVEhfU0VQQVJBVE9SfS8ke21vZGVsUGF0aH0vaW5mb2A6IENvbnRhaW5zIG1ldGEtaW5mbyBhYm91dCB0aGVcbiAqICAgICBtb2RlbCwgc3VjaCBhcyBkYXRlIHNhdmVkLCB0eXBlIG9mIHRoZSB0b3BvbG9neSwgc2l6ZSBpbiBieXRlcywgZXRjLlxuICogICAtIGAke1BBVEhfU0VQQVJBVE9SfS8ke21vZGVsUGF0aH0vdG9wb2xvZ3lgOiBNb2RlbCB0b3BvbG9neS4gRm9yIEtlcmFzLVxuICogICAgIHN0eWxlIG1vZGVscywgdGhpcyBpcyBhIHN0cmluZ2l6ZWQgSlNPTi5cbiAqICAgLSBgJHtQQVRIX1NFUEFSQVRPUn0vJHttb2RlbFBhdGh9L3dlaWdodF9zcGVjc2A6IFdlaWdodCBzcGVjcyBvZiB0aGVcbiAqICAgICBtb2RlbCwgY2FuIGJlIHVzZWQgdG8gZGVjb2RlIHRoZSBzYXZlZCBiaW5hcnkgd2VpZ2h0IHZhbHVlcyAoc2VlXG4gKiAgICAgaXRlbSBiZWxvdykuXG4gKiAgIC0gYCR7UEFUSF9TRVBBUkFUT1J9LyR7bW9kZWxQYXRofS93ZWlnaHRfZGF0YWA6IENvbmNhdGVuYXRlZCBiaW5hcnlcbiAqICAgICB3ZWlnaHQgdmFsdWVzLCBzdG9yZWQgYXMgYSBiYXNlNjQtZW5jb2RlZCBzdHJpbmcuXG4gKlxuICogU2F2aW5nIG1heSB0aHJvdyBhbiBgRXJyb3JgIGlmIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBhcnRpZmFjdHMgZXhjZWVkIHRoZVxuICogYnJvd3Nlci1zcGVjaWZpYyBxdW90YS5cbiAqXG4gKiBAcGFyYW0gbW9kZWxQYXRoIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBtb2RlbCB0byBiZSBzYXZlZC4gTXVzdCBiZSBhXG4gKiAgIG5vbi1lbXB0eSBzdHJpbmcuXG4gKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiBgSU9IYW5kbGVyYCwgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCwgZS5nLixcbiAqICAgYHRmLk1vZGVsLnNhdmVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnJvd3NlckxvY2FsU3RvcmFnZShtb2RlbFBhdGgpIHtcbiAgICByZXR1cm4gbmV3IEJyb3dzZXJMb2NhbFN0b3JhZ2UobW9kZWxQYXRoKTtcbn1cbmV4cG9ydCBjbGFzcyBCcm93c2VyTG9jYWxTdG9yYWdlTWFuYWdlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGFzc2VydChlbnYoKS5nZXRCb29sKCdJU19CUk9XU0VSJyksICgpID0+ICdDdXJyZW50IGVudmlyb25tZW50IGlzIG5vdCBhIHdlYiBicm93c2VyJyk7XG4gICAgICAgIGFzc2VydCh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyB8fFxuICAgICAgICAgICAgdHlwZW9mIHdpbmRvdy5sb2NhbFN0b3JhZ2UgIT09ICd1bmRlZmluZWQnLCAoKSA9PiAnQ3VycmVudCBicm93c2VyIGRvZXMgbm90IGFwcGVhciB0byBzdXBwb3J0IGxvY2FsU3RvcmFnZScpO1xuICAgICAgICB0aGlzLkxTID0gd2luZG93LmxvY2FsU3RvcmFnZTtcbiAgICB9XG4gICAgYXN5bmMgbGlzdE1vZGVscygpIHtcbiAgICAgICAgY29uc3Qgb3V0ID0ge307XG4gICAgICAgIGNvbnN0IHByZWZpeCA9IFBBVEhfUFJFRklYICsgUEFUSF9TRVBBUkFUT1I7XG4gICAgICAgIGNvbnN0IHN1ZmZpeCA9IFBBVEhfU0VQQVJBVE9SICsgSU5GT19TVUZGSVg7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5MUy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5MUy5rZXkoaSk7XG4gICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgocHJlZml4KSAmJiBrZXkuZW5kc1dpdGgoc3VmZml4KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1vZGVsUGF0aCA9IGdldE1vZGVsUGF0aEZyb21LZXkoa2V5KTtcbiAgICAgICAgICAgICAgICBvdXRbbW9kZWxQYXRoXSA9IEpTT04ucGFyc2UodGhpcy5MUy5nZXRJdGVtKGtleSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuICAgIGFzeW5jIHJlbW92ZU1vZGVsKHBhdGgpIHtcbiAgICAgICAgcGF0aCA9IG1heWJlU3RyaXBTY2hlbWUocGF0aCk7XG4gICAgICAgIGNvbnN0IGtleXMgPSBnZXRNb2RlbEtleXMocGF0aCk7XG4gICAgICAgIGlmICh0aGlzLkxTLmdldEl0ZW0oa2V5cy5pbmZvKSA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBmaW5kIG1vZGVsIGF0IHBhdGggJyR7cGF0aH0nYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5mbyA9IEpTT04ucGFyc2UodGhpcy5MUy5nZXRJdGVtKGtleXMuaW5mbykpO1xuICAgICAgICByZW1vdmVJdGVtcyhrZXlzKTtcbiAgICAgICAgcmV0dXJuIGluZm87XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG9jYWxfc3RvcmFnZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vKipcbiAqIENsYXNzZXMgYW5kIGZ1bmN0aW9ucyBmb3IgbW9kZWwgbWFuYWdlbWVudCBhY3Jvc3MgbXVsdGlwbGUgc3RvcmFnZSBtZWRpdW1zLlxuICpcbiAqIFN1cHBvcnRlZCBjbGllbnQgYWN0aW9uczpcbiAqIC0gTGlzdGluZyBtb2RlbHMgb24gYWxsIHJlZ2lzdGVyZWQgc3RvcmFnZSBtZWRpdW1zLlxuICogLSBSZW1vdmUgbW9kZWwgYnkgVVJMIGZyb20gYW55IHJlZ2lzdGVyZWQgc3RvcmFnZSBtZWRpdW1zLCBieSB1c2luZyBVUkxcbiAqICAgc3RyaW5nLlxuICogLSBNb3Zpbmcgb3IgY29weWluZyBtb2RlbCBmcm9tIG9uZSBwYXRoIHRvIGFub3RoZXIgaW4gdGhlIHNhbWUgbWVkaXVtIG9yIGZyb21cbiAqICAgb25lIG1lZGl1bSB0byBhbm90aGVyLCBieSB1c2luZyBVUkwgc3RyaW5ncy5cbiAqL1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBJT1JvdXRlclJlZ2lzdHJ5IH0gZnJvbSAnLi9yb3V0ZXJfcmVnaXN0cnknO1xuY29uc3QgVVJMX1NDSEVNRV9TVUZGSVggPSAnOi8vJztcbmV4cG9ydCBjbGFzcyBNb2RlbFN0b3JlTWFuYWdlclJlZ2lzdHJ5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5tYW5hZ2VycyA9IHt9O1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0SW5zdGFuY2UoKSB7XG4gICAgICAgIGlmIChNb2RlbFN0b3JlTWFuYWdlclJlZ2lzdHJ5Lmluc3RhbmNlID09IG51bGwpIHtcbiAgICAgICAgICAgIE1vZGVsU3RvcmVNYW5hZ2VyUmVnaXN0cnkuaW5zdGFuY2UgPSBuZXcgTW9kZWxTdG9yZU1hbmFnZXJSZWdpc3RyeSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBNb2RlbFN0b3JlTWFuYWdlclJlZ2lzdHJ5Lmluc3RhbmNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlciBhIHNhdmUtaGFuZGxlciByb3V0ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2F2ZVJvdXRlciBBIGZ1bmN0aW9uIHRoYXQgbWFwcyBhIFVSTC1saWtlIHN0cmluZyBvbnRvIGFuIGluc3RhbmNlXG4gICAgICogb2YgYElPSGFuZGxlcmAgd2l0aCB0aGUgYHNhdmVgIG1ldGhvZCBkZWZpbmVkIG9yIGBudWxsYC5cbiAgICAgKi9cbiAgICBzdGF0aWMgcmVnaXN0ZXJNYW5hZ2VyKHNjaGVtZSwgbWFuYWdlcikge1xuICAgICAgICBhc3NlcnQoc2NoZW1lICE9IG51bGwsICgpID0+ICdzY2hlbWUgbXVzdCBub3QgYmUgdW5kZWZpbmVkIG9yIG51bGwuJyk7XG4gICAgICAgIGlmIChzY2hlbWUuZW5kc1dpdGgoVVJMX1NDSEVNRV9TVUZGSVgpKSB7XG4gICAgICAgICAgICBzY2hlbWUgPSBzY2hlbWUuc2xpY2UoMCwgc2NoZW1lLmluZGV4T2YoVVJMX1NDSEVNRV9TVUZGSVgpKTtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnQoc2NoZW1lLmxlbmd0aCA+IDAsICgpID0+ICdzY2hlbWUgbXVzdCBub3QgYmUgYW4gZW1wdHkgc3RyaW5nLicpO1xuICAgICAgICBjb25zdCByZWdpc3RyeSA9IE1vZGVsU3RvcmVNYW5hZ2VyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTtcbiAgICAgICAgYXNzZXJ0KHJlZ2lzdHJ5Lm1hbmFnZXJzW3NjaGVtZV0gPT0gbnVsbCwgKCkgPT4gYEEgbW9kZWwgc3RvcmUgbWFuYWdlciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIHNjaGVtZSAnJHtzY2hlbWV9Jy5gKTtcbiAgICAgICAgcmVnaXN0cnkubWFuYWdlcnNbc2NoZW1lXSA9IG1hbmFnZXI7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRNYW5hZ2VyKHNjaGVtZSkge1xuICAgICAgICBjb25zdCBtYW5hZ2VyID0gdGhpcy5nZXRJbnN0YW5jZSgpLm1hbmFnZXJzW3NjaGVtZV07XG4gICAgICAgIGlmIChtYW5hZ2VyID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgbW9kZWwgbWFuYWdlciBmb3Igc2NoZW1lICcke3NjaGVtZX0nYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1hbmFnZXI7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRTY2hlbWVzKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5nZXRJbnN0YW5jZSgpLm1hbmFnZXJzKTtcbiAgICB9XG59XG4vKipcbiAqIEhlbHBlciBtZXRob2QgZm9yIHBhcnNpbmcgYSBVUkwgc3RyaW5nIGludG8gYSBzY2hlbWUgYW5kIGEgcGF0aC5cbiAqXG4gKiBAcGFyYW0gdXJsIEUuZy4sICdsb2NhbHN0b3JhZ2U6Ly9teS1tb2RlbCdcbiAqIEByZXR1cm5zIEEgZGljdGlvbmFyeSB3aXRoIHR3byBmaWVsZHM6IHNjaGVtZSBhbmQgcGF0aC5cbiAqICAgU2NoZW1lOiBlLmcuLCAnbG9jYWxzdG9yYWdlJyBpbiB0aGUgZXhhbXBsZSBhYm92ZS5cbiAqICAgUGF0aDogZS5nLiwgJ215LW1vZGVsJyBpbiB0aGUgZXhhbXBsZSBhYm92ZS5cbiAqL1xuZnVuY3Rpb24gcGFyc2VVUkwodXJsKSB7XG4gICAgaWYgKHVybC5pbmRleE9mKFVSTF9TQ0hFTUVfU1VGRklYKSA9PT0gLTEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgdXJsIHN0cmluZyBwcm92aWRlZCBkb2VzIG5vdCBjb250YWluIGEgc2NoZW1lLiBgICtcbiAgICAgICAgICAgIGBTdXBwb3J0ZWQgc2NoZW1lcyBhcmU6IGAgK1xuICAgICAgICAgICAgYCR7TW9kZWxTdG9yZU1hbmFnZXJSZWdpc3RyeS5nZXRTY2hlbWVzKCkuam9pbignLCcpfWApO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBzY2hlbWU6IHVybC5zcGxpdChVUkxfU0NIRU1FX1NVRkZJWClbMF0sXG4gICAgICAgIHBhdGg6IHVybC5zcGxpdChVUkxfU0NIRU1FX1NVRkZJWClbMV0sXG4gICAgfTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGNsb25lTW9kZWxJbnRlcm5hbChzb3VyY2VVUkwsIGRlc3RVUkwsIGRlbGV0ZVNvdXJjZSA9IGZhbHNlKSB7XG4gICAgYXNzZXJ0KHNvdXJjZVVSTCAhPT0gZGVzdFVSTCwgKCkgPT4gYE9sZCBwYXRoIGFuZCBuZXcgcGF0aCBhcmUgdGhlIHNhbWU6ICcke3NvdXJjZVVSTH0nYCk7XG4gICAgY29uc3QgbG9hZEhhbmRsZXJzID0gSU9Sb3V0ZXJSZWdpc3RyeS5nZXRMb2FkSGFuZGxlcnMoc291cmNlVVJMKTtcbiAgICBhc3NlcnQobG9hZEhhbmRsZXJzLmxlbmd0aCA+IDAsICgpID0+IGBDb3B5aW5nIGZhaWxlZCBiZWNhdXNlIG5vIGxvYWQgaGFuZGxlciBpcyBmb3VuZCBmb3Igc291cmNlIFVSTCAke3NvdXJjZVVSTH0uYCk7XG4gICAgYXNzZXJ0KGxvYWRIYW5kbGVycy5sZW5ndGggPCAyLCAoKSA9PiBgQ29weWluZyBmYWlsZWQgYmVjYXVzZSBtb3JlIHRoYW4gb25lICgke2xvYWRIYW5kbGVycy5sZW5ndGh9KSBgICtcbiAgICAgICAgYGxvYWQgaGFuZGxlcnMgZm9yIHNvdXJjZSBVUkwgJHtzb3VyY2VVUkx9LmApO1xuICAgIGNvbnN0IGxvYWRIYW5kbGVyID0gbG9hZEhhbmRsZXJzWzBdO1xuICAgIGNvbnN0IHNhdmVIYW5kbGVycyA9IElPUm91dGVyUmVnaXN0cnkuZ2V0U2F2ZUhhbmRsZXJzKGRlc3RVUkwpO1xuICAgIGFzc2VydChzYXZlSGFuZGxlcnMubGVuZ3RoID4gMCwgKCkgPT4gYENvcHlpbmcgZmFpbGVkIGJlY2F1c2Ugbm8gc2F2ZSBoYW5kbGVyIGlzIGZvdW5kIGZvciBkZXN0aW5hdGlvbiBgICtcbiAgICAgICAgYFVSTCAke2Rlc3RVUkx9LmApO1xuICAgIGFzc2VydChzYXZlSGFuZGxlcnMubGVuZ3RoIDwgMiwgKCkgPT4gYENvcHlpbmcgZmFpbGVkIGJlY2F1c2UgbW9yZSB0aGFuIG9uZSAoJHtsb2FkSGFuZGxlcnMubGVuZ3RofSkgYCArXG4gICAgICAgIGBzYXZlIGhhbmRsZXJzIGZvciBkZXN0aW5hdGlvbiBVUkwgJHtkZXN0VVJMfS5gKTtcbiAgICBjb25zdCBzYXZlSGFuZGxlciA9IHNhdmVIYW5kbGVyc1swXTtcbiAgICBjb25zdCBzb3VyY2VTY2hlbWUgPSBwYXJzZVVSTChzb3VyY2VVUkwpLnNjaGVtZTtcbiAgICBjb25zdCBzb3VyY2VQYXRoID0gcGFyc2VVUkwoc291cmNlVVJMKS5wYXRoO1xuICAgIGNvbnN0IHNhbWVNZWRpdW0gPSBzb3VyY2VTY2hlbWUgPT09IHBhcnNlVVJMKHNvdXJjZVVSTCkuc2NoZW1lO1xuICAgIGNvbnN0IG1vZGVsQXJ0aWZhY3RzID0gYXdhaXQgbG9hZEhhbmRsZXIubG9hZCgpO1xuICAgIC8vIElmIG1vdmluZyB3aXRoaW4gdGhlIHNhbWUgc3RvcmFnZSBtZWRpdW0sIHJlbW92ZSB0aGUgb2xkIG1vZGVsIGFzIHNvb24gYXNcbiAgICAvLyB0aGUgbG9hZGluZyBpcyBkb25lLiBXaXRob3V0IGRvaW5nIHRoaXMsIGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIGNvbWJpbmVkXG4gICAgLy8gc2l6ZSBvZiB0aGUgdHdvIG1vZGVscyB3aWxsIGNhdXNlIHRoZSBjbG9uaW5nIHRvIGZhaWwuXG4gICAgaWYgKGRlbGV0ZVNvdXJjZSAmJiBzYW1lTWVkaXVtKSB7XG4gICAgICAgIGF3YWl0IE1vZGVsU3RvcmVNYW5hZ2VyUmVnaXN0cnkuZ2V0TWFuYWdlcihzb3VyY2VTY2hlbWUpXG4gICAgICAgICAgICAucmVtb3ZlTW9kZWwoc291cmNlUGF0aCk7XG4gICAgfVxuICAgIGNvbnN0IHNhdmVSZXN1bHQgPSBhd2FpdCBzYXZlSGFuZGxlci5zYXZlKG1vZGVsQXJ0aWZhY3RzKTtcbiAgICAvLyBJZiBtb3ZpbmcgYmV0d2VlbiBtZWRpdW1zLCB0aGUgZGVsZXRpb24gaXMgZG9uZSBhZnRlciB0aGUgc2F2ZSBzdWNjZWVkcy5cbiAgICAvLyBUaGlzIGd1YXJkcyBhZ2FpbnN0IHRoZSBjYXNlIGluIHdoaWNoIHNhdmluZyB0byB0aGUgZGVzdGluYXRpb24gbWVkaXVtXG4gICAgLy8gZmFpbHMuXG4gICAgaWYgKGRlbGV0ZVNvdXJjZSAmJiAhc2FtZU1lZGl1bSkge1xuICAgICAgICBhd2FpdCBNb2RlbFN0b3JlTWFuYWdlclJlZ2lzdHJ5LmdldE1hbmFnZXIoc291cmNlU2NoZW1lKVxuICAgICAgICAgICAgLnJlbW92ZU1vZGVsKHNvdXJjZVBhdGgpO1xuICAgIH1cbiAgICByZXR1cm4gc2F2ZVJlc3VsdC5tb2RlbEFydGlmYWN0c0luZm87XG59XG4vKipcbiAqIExpc3QgYWxsIG1vZGVscyBzdG9yZWQgaW4gcmVnaXN0ZXJlZCBzdG9yYWdlIG1lZGl1bXMuXG4gKlxuICogRm9yIGEgd2ViIGJyb3dzZXIgZW52aXJvbm1lbnQsIHRoZSByZWdpc3RlcmVkIG1lZGl1bXMgYXJlIExvY2FsIFN0b3JhZ2UgYW5kXG4gKiBJbmRleGVkREIuXG4gKlxuICogYGBganNcbiAqIC8vIEZpcnN0IGNyZWF0ZSBhbmQgc2F2ZSBhIG1vZGVsLlxuICogY29uc3QgbW9kZWwgPSB0Zi5zZXF1ZW50aWFsKCk7XG4gKiBtb2RlbC5hZGQodGYubGF5ZXJzLmRlbnNlKFxuICogICAgIHt1bml0czogMSwgaW5wdXRTaGFwZTogWzEwXSwgYWN0aXZhdGlvbjogJ3NpZ21vaWQnfSkpO1xuICogYXdhaXQgbW9kZWwuc2F2ZSgnbG9jYWxzdG9yYWdlOi8vZGVtby9tYW5hZ2VtZW50L21vZGVsMScpO1xuICpcbiAqIC8vIFRoZW4gbGlzdCBleGlzdGluZyBtb2RlbHMuXG4gKiBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShhd2FpdCB0Zi5pby5saXN0TW9kZWxzKCkpKTtcbiAqXG4gKiAvLyBEZWxldGUgdGhlIG1vZGVsLlxuICogYXdhaXQgdGYuaW8ucmVtb3ZlTW9kZWwoJ2xvY2Fsc3RvcmFnZTovL2RlbW8vbWFuYWdlbWVudC9tb2RlbDEnKTtcbiAqXG4gKiAvLyBMaXN0IG1vZGVscyBhZ2Fpbi5cbiAqIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGF3YWl0IHRmLmlvLmxpc3RNb2RlbHMoKSkpO1xuICogYGBgXG4gKlxuICogQHJldHVybnMgQSBgUHJvbWlzZWAgb2YgYSBkaWN0aW9uYXJ5IG1hcHBpbmcgVVJMcyBvZiBleGlzdGluZyBtb2RlbHMgdG9cbiAqIHRoZWlyIG1vZGVsIGFydGlmYWN0cyBpbmZvLiBVUkxzIGluY2x1ZGUgbWVkaXVtLXNwZWNpZmljIHNjaGVtZXMsIGUuZy4sXG4gKiAgICdpbmRleGVkZGI6Ly9teS9tb2RlbC8xJy4gTW9kZWwgYXJ0aWZhY3RzIGluZm8gaW5jbHVkZSB0eXBlIG9mIHRoZVxuICogbW9kZWwncyB0b3BvbG9neSwgYnl0ZSBzaXplcyBvZiB0aGUgdG9wb2xvZ3ksIHdlaWdodHMsIGV0Yy5cbiAqXG4gKiBAZG9jIHtcbiAqICAgaGVhZGluZzogJ01vZGVscycsXG4gKiAgIHN1YmhlYWRpbmc6ICdNYW5hZ2VtZW50JyxcbiAqICAgbmFtZXNwYWNlOiAnaW8nLFxuICogICBpZ25vcmVDSTogdHJ1ZVxuICogfVxuICovXG5hc3luYyBmdW5jdGlvbiBsaXN0TW9kZWxzKCkge1xuICAgIGNvbnN0IHNjaGVtZXMgPSBNb2RlbFN0b3JlTWFuYWdlclJlZ2lzdHJ5LmdldFNjaGVtZXMoKTtcbiAgICBjb25zdCBvdXQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IHNjaGVtZSBvZiBzY2hlbWVzKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtZU91dCA9IGF3YWl0IE1vZGVsU3RvcmVNYW5hZ2VyUmVnaXN0cnkuZ2V0TWFuYWdlcihzY2hlbWUpLmxpc3RNb2RlbHMoKTtcbiAgICAgICAgZm9yIChjb25zdCBwYXRoIGluIHNjaGVtZU91dCkge1xuICAgICAgICAgICAgY29uc3QgdXJsID0gc2NoZW1lICsgVVJMX1NDSEVNRV9TVUZGSVggKyBwYXRoO1xuICAgICAgICAgICAgb3V0W3VybF0gPSBzY2hlbWVPdXRbcGF0aF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUmVtb3ZlIGEgbW9kZWwgc3BlY2lmaWVkIGJ5IFVSTCBmcm9tIGEgcmVpZ3N0ZXJlZCBzdG9yYWdlIG1lZGl1bS5cbiAqXG4gKiBgYGBqc1xuICogLy8gRmlyc3QgY3JlYXRlIGFuZCBzYXZlIGEgbW9kZWwuXG4gKiBjb25zdCBtb2RlbCA9IHRmLnNlcXVlbnRpYWwoKTtcbiAqIG1vZGVsLmFkZCh0Zi5sYXllcnMuZGVuc2UoXG4gKiAgICAge3VuaXRzOiAxLCBpbnB1dFNoYXBlOiBbMTBdLCBhY3RpdmF0aW9uOiAnc2lnbW9pZCd9KSk7XG4gKiBhd2FpdCBtb2RlbC5zYXZlKCdsb2NhbHN0b3JhZ2U6Ly9kZW1vL21hbmFnZW1lbnQvbW9kZWwxJyk7XG4gKlxuICogLy8gVGhlbiBsaXN0IGV4aXN0aW5nIG1vZGVscy5cbiAqIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGF3YWl0IHRmLmlvLmxpc3RNb2RlbHMoKSkpO1xuICpcbiAqIC8vIERlbGV0ZSB0aGUgbW9kZWwuXG4gKiBhd2FpdCB0Zi5pby5yZW1vdmVNb2RlbCgnbG9jYWxzdG9yYWdlOi8vZGVtby9tYW5hZ2VtZW50L21vZGVsMScpO1xuICpcbiAqIC8vIExpc3QgbW9kZWxzIGFnYWluLlxuICogY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoYXdhaXQgdGYuaW8ubGlzdE1vZGVscygpKSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdXJsIEEgVVJMIHRvIGEgc3RvcmVkIG1vZGVsLCB3aXRoIGEgc2NoZW1lIHByZWZpeCwgZS5nLixcbiAqICAgJ2xvY2Fsc3RvcmFnZTovL215LW1vZGVsLTEnLCAnaW5kZXhlZGRiOi8vbXkvbW9kZWwvMicuXG4gKiBAcmV0dXJucyBNb2RlbEFydGlmYWN0c0luZm8gb2YgdGhlIGRlbGV0ZWQgbW9kZWwgKGlmIGFuZCBvbmx5IGlmIGRlbGV0aW9uXG4gKiAgIGlzIHN1Y2Nlc3NmdWwpLlxuICogQHRocm93cyBFcnJvciBpZiBkZWxldGlvbiBmYWlscywgZS5nLiwgaWYgbm8gbW9kZWwgZXhpc3RzIGF0IGBwYXRoYC5cbiAqXG4gKiBAZG9jIHtcbiAqICAgaGVhZGluZzogJ01vZGVscycsXG4gKiAgIHN1YmhlYWRpbmc6ICdNYW5hZ2VtZW50JyxcbiAqICAgbmFtZXNwYWNlOiAnaW8nLFxuICogICBpZ25vcmVDSTogdHJ1ZVxuICogfVxuICovXG5hc3luYyBmdW5jdGlvbiByZW1vdmVNb2RlbCh1cmwpIHtcbiAgICBjb25zdCBzY2hlbWVBbmRQYXRoID0gcGFyc2VVUkwodXJsKTtcbiAgICBjb25zdCBtYW5hZ2VyID0gTW9kZWxTdG9yZU1hbmFnZXJSZWdpc3RyeS5nZXRNYW5hZ2VyKHNjaGVtZUFuZFBhdGguc2NoZW1lKTtcbiAgICByZXR1cm4gbWFuYWdlci5yZW1vdmVNb2RlbChzY2hlbWVBbmRQYXRoLnBhdGgpO1xufVxuLyoqXG4gKiBDb3B5IGEgbW9kZWwgZnJvbSBvbmUgVVJMIHRvIGFub3RoZXIuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBzdXBwb3J0czpcbiAqXG4gKiAxLiBDb3B5aW5nIHdpdGhpbiBhIHN0b3JhZ2UgbWVkaXVtLCBlLmcuLFxuICogICAgYHRmLmlvLmNvcHlNb2RlbCgnbG9jYWxzdG9yYWdlOi8vbW9kZWwtMScsICdsb2NhbHN0b3JhZ2U6Ly9tb2RlbC0yJylgXG4gKiAyLiBDb3B5aW5nIGJldHdlZW4gdHdvIHN0b3JhZ2UgbWVkaXVtcywgZS5nLixcbiAqICAgIGB0Zi5pby5jb3B5TW9kZWwoJ2xvY2Fsc3RvcmFnZTovL21vZGVsLTEnLCAnaW5kZXhlZGRiOi8vbW9kZWwtMScpYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBGaXJzdCBjcmVhdGUgYW5kIHNhdmUgYSBtb2RlbC5cbiAqIGNvbnN0IG1vZGVsID0gdGYuc2VxdWVudGlhbCgpO1xuICogbW9kZWwuYWRkKHRmLmxheWVycy5kZW5zZShcbiAqICAgICB7dW5pdHM6IDEsIGlucHV0U2hhcGU6IFsxMF0sIGFjdGl2YXRpb246ICdzaWdtb2lkJ30pKTtcbiAqIGF3YWl0IG1vZGVsLnNhdmUoJ2xvY2Fsc3RvcmFnZTovL2RlbW8vbWFuYWdlbWVudC9tb2RlbDEnKTtcbiAqXG4gKiAvLyBUaGVuIGxpc3QgZXhpc3RpbmcgbW9kZWxzLlxuICogY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoYXdhaXQgdGYuaW8ubGlzdE1vZGVscygpKSk7XG4gKlxuICogLy8gQ29weSB0aGUgbW9kZWwsIGZyb20gTG9jYWwgU3RvcmFnZSB0byBJbmRleGVkREIuXG4gKiBhd2FpdCB0Zi5pby5jb3B5TW9kZWwoXG4gKiAgICAgJ2xvY2Fsc3RvcmFnZTovL2RlbW8vbWFuYWdlbWVudC9tb2RlbDEnLFxuICogICAgICdpbmRleGVkZGI6Ly9kZW1vL21hbmFnZW1lbnQvbW9kZWwxJyk7XG4gKlxuICogLy8gTGlzdCBtb2RlbHMgYWdhaW4uXG4gKiBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShhd2FpdCB0Zi5pby5saXN0TW9kZWxzKCkpKTtcbiAqXG4gKiAvLyBSZW1vdmUgYm90aCBtb2RlbHMuXG4gKiBhd2FpdCB0Zi5pby5yZW1vdmVNb2RlbCgnbG9jYWxzdG9yYWdlOi8vZGVtby9tYW5hZ2VtZW50L21vZGVsMScpO1xuICogYXdhaXQgdGYuaW8ucmVtb3ZlTW9kZWwoJ2luZGV4ZWRkYjovL2RlbW8vbWFuYWdlbWVudC9tb2RlbDEnKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBzb3VyY2VVUkwgU291cmNlIFVSTCBvZiBjb3B5aW5nLlxuICogQHBhcmFtIGRlc3RVUkwgRGVzdGluYXRpb24gVVJMIG9mIGNvcHlpbmcuXG4gKiBAcmV0dXJucyBNb2RlbEFydGlmYWN0c0luZm8gb2YgdGhlIGNvcGllZCBtb2RlbCAoaWYgYW5kIG9ubHkgaWYgY29weWluZ1xuICogICBpcyBzdWNjZXNzZnVsKS5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgY29weWluZyBmYWlscywgZS5nLiwgaWYgbm8gbW9kZWwgZXhpc3RzIGF0IGBzb3VyY2VVUkxgLCBvclxuICogICBpZiBgb2xkUGF0aGAgYW5kIGBuZXdQYXRoYCBhcmUgaWRlbnRpY2FsLlxuICpcbiAqIEBkb2Mge1xuICogICBoZWFkaW5nOiAnTW9kZWxzJyxcbiAqICAgc3ViaGVhZGluZzogJ01hbmFnZW1lbnQnLFxuICogICBuYW1lc3BhY2U6ICdpbycsXG4gKiAgIGlnbm9yZUNJOiB0cnVlXG4gKiB9XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvcHlNb2RlbChzb3VyY2VVUkwsIGRlc3RVUkwpIHtcbiAgICBjb25zdCBkZWxldGVTb3VyY2UgPSBmYWxzZTtcbiAgICByZXR1cm4gY2xvbmVNb2RlbEludGVybmFsKHNvdXJjZVVSTCwgZGVzdFVSTCwgZGVsZXRlU291cmNlKTtcbn1cbi8qKlxuICogTW92ZSBhIG1vZGVsIGZyb20gb25lIFVSTCB0byBhbm90aGVyLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHM6XG4gKlxuICogMS4gTW92aW5nIHdpdGhpbiBhIHN0b3JhZ2UgbWVkaXVtLCBlLmcuLFxuICogICAgYHRmLmlvLm1vdmVNb2RlbCgnbG9jYWxzdG9yYWdlOi8vbW9kZWwtMScsICdsb2NhbHN0b3JhZ2U6Ly9tb2RlbC0yJylgXG4gKiAyLiBNb3ZpbmcgYmV0d2VlbiB0d28gc3RvcmFnZSBtZWRpdW1zLCBlLmcuLFxuICogICAgYHRmLmlvLm1vdmVNb2RlbCgnbG9jYWxzdG9yYWdlOi8vbW9kZWwtMScsICdpbmRleGVkZGI6Ly9tb2RlbC0xJylgXG4gKlxuICogYGBganNcbiAqIC8vIEZpcnN0IGNyZWF0ZSBhbmQgc2F2ZSBhIG1vZGVsLlxuICogY29uc3QgbW9kZWwgPSB0Zi5zZXF1ZW50aWFsKCk7XG4gKiBtb2RlbC5hZGQodGYubGF5ZXJzLmRlbnNlKFxuICogICAgIHt1bml0czogMSwgaW5wdXRTaGFwZTogWzEwXSwgYWN0aXZhdGlvbjogJ3NpZ21vaWQnfSkpO1xuICogYXdhaXQgbW9kZWwuc2F2ZSgnbG9jYWxzdG9yYWdlOi8vZGVtby9tYW5hZ2VtZW50L21vZGVsMScpO1xuICpcbiAqIC8vIFRoZW4gbGlzdCBleGlzdGluZyBtb2RlbHMuXG4gKiBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShhd2FpdCB0Zi5pby5saXN0TW9kZWxzKCkpKTtcbiAqXG4gKiAvLyBNb3ZlIHRoZSBtb2RlbCwgZnJvbSBMb2NhbCBTdG9yYWdlIHRvIEluZGV4ZWREQi5cbiAqIGF3YWl0IHRmLmlvLm1vdmVNb2RlbChcbiAqICAgICAnbG9jYWxzdG9yYWdlOi8vZGVtby9tYW5hZ2VtZW50L21vZGVsMScsXG4gKiAgICAgJ2luZGV4ZWRkYjovL2RlbW8vbWFuYWdlbWVudC9tb2RlbDEnKTtcbiAqXG4gKiAvLyBMaXN0IG1vZGVscyBhZ2Fpbi5cbiAqIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGF3YWl0IHRmLmlvLmxpc3RNb2RlbHMoKSkpO1xuICpcbiAqIC8vIFJlbW92ZSB0aGUgbW92ZWQgbW9kZWwuXG4gKiBhd2FpdCB0Zi5pby5yZW1vdmVNb2RlbCgnaW5kZXhlZGRiOi8vZGVtby9tYW5hZ2VtZW50L21vZGVsMScpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHNvdXJjZVVSTCBTb3VyY2UgVVJMIG9mIG1vdmluZy5cbiAqIEBwYXJhbSBkZXN0VVJMIERlc3RpbmF0aW9uIFVSTCBvZiBtb3ZpbmcuXG4gKiBAcmV0dXJucyBNb2RlbEFydGlmYWN0c0luZm8gb2YgdGhlIGNvcGllZCBtb2RlbCAoaWYgYW5kIG9ubHkgaWYgY29weWluZ1xuICogICBpcyBzdWNjZXNzZnVsKS5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgbW92aW5nIGZhaWxzLCBlLmcuLCBpZiBubyBtb2RlbCBleGlzdHMgYXQgYHNvdXJjZVVSTGAsIG9yXG4gKiAgIGlmIGBvbGRQYXRoYCBhbmQgYG5ld1BhdGhgIGFyZSBpZGVudGljYWwuXG4gKlxuICogQGRvYyB7XG4gKiAgIGhlYWRpbmc6ICdNb2RlbHMnLFxuICogICBzdWJoZWFkaW5nOiAnTWFuYWdlbWVudCcsXG4gKiAgIG5hbWVzcGFjZTogJ2lvJyxcbiAqICAgaWdub3JlQ0k6IHRydWVcbiAqIH1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbW92ZU1vZGVsKHNvdXJjZVVSTCwgZGVzdFVSTCkge1xuICAgIGNvbnN0IGRlbGV0ZVNvdXJjZSA9IHRydWU7XG4gICAgcmV0dXJuIGNsb25lTW9kZWxJbnRlcm5hbChzb3VyY2VVUkwsIGRlc3RVUkwsIGRlbGV0ZVNvdXJjZSk7XG59XG5leHBvcnQgeyBtb3ZlTW9kZWwsIGNvcHlNb2RlbCwgcmVtb3ZlTW9kZWwsIGxpc3RNb2RlbHMgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1vZGVsX21hbmFnZW1lbnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuY2xhc3MgUGFzc3Rocm91Z2hMb2FkZXIge1xuICAgIGNvbnN0cnVjdG9yKG1vZGVsQXJ0aWZhY3RzKSB7XG4gICAgICAgIHRoaXMubW9kZWxBcnRpZmFjdHMgPSBtb2RlbEFydGlmYWN0cztcbiAgICB9XG4gICAgYXN5bmMgbG9hZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZWxBcnRpZmFjdHM7XG4gICAgfVxufVxuY2xhc3MgUGFzc3Rocm91Z2hTYXZlciB7XG4gICAgY29uc3RydWN0b3Ioc2F2ZUhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5zYXZlSGFuZGxlciA9IHNhdmVIYW5kbGVyO1xuICAgIH1cbiAgICBhc3luYyBzYXZlKG1vZGVsQXJ0aWZhY3RzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNhdmVIYW5kbGVyKG1vZGVsQXJ0aWZhY3RzKTtcbiAgICB9XG59XG4vKipcbiAqIENyZWF0ZXMgYW4gSU9IYW5kbGVyIHRoYXQgbG9hZHMgbW9kZWwgYXJ0aWZhY3RzIGZyb20gbWVtb3J5LlxuICpcbiAqIFdoZW4gdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGB0Zi5sb2FkTGF5ZXJzTW9kZWxgLCBhbiBpbnN0YW5jZSBvZlxuICogYHRmLkxheWVyc01vZGVsYCAoS2VyYXMtc3R5bGUpIGNhbiBiZSBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBsb2FkZWQgYXJ0aWZhY3RzLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtb2RlbCA9IGF3YWl0IHRmLmxvYWRMYXllcnNNb2RlbCh0Zi5pby5mcm9tTWVtb3J5KFxuICogICAgIG1vZGVsVG9wb2xvZ3ksIHdlaWdodFNwZWNzLCB3ZWlnaHREYXRhKSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gbW9kZWxBcnRpZmFjdHMgYSBvYmplY3QgY29udGFpbmluZyBtb2RlbCB0b3BvbG9neSAoaS5lLiwgcGFyc2VkIGZyb21cbiAqICAgdGhlIEpTT04gZm9ybWF0KS5cbiAqIEBwYXJhbSB3ZWlnaHRTcGVjcyBBbiBhcnJheSBvZiBgV2VpZ2h0c01hbmlmZXN0RW50cnlgIG9iamVjdHMgZGVzY3JpYmluZyB0aGVcbiAqICAgbmFtZXMsIHNoYXBlcywgdHlwZXMsIGFuZCBxdWFudGl6YXRpb24gb2YgdGhlIHdlaWdodCBkYXRhLlxuICogQHBhcmFtIHdlaWdodERhdGEgQSBzaW5nbGUgYEFycmF5QnVmZmVyYCBjb250YWluaW5nIHRoZSB3ZWlnaHQgZGF0YSxcbiAqICAgY29uY2F0ZW5hdGVkIGluIHRoZSBvcmRlciBkZXNjcmliZWQgYnkgdGhlIHdlaWdodFNwZWNzLlxuICogQHBhcmFtIHRyYWluaW5nQ29uZmlnIE1vZGVsIHRyYWluaW5nIGNvbmZpZ3VyYXRpb24uIE9wdGlvbmFsLlxuICpcbiAqIEByZXR1cm5zIEEgcGFzc3Rocm91Z2ggYElPSGFuZGxlcmAgdGhhdCBzaW1wbHkgbG9hZHMgdGhlIHByb3ZpZGVkIGRhdGEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tTWVtb3J5KG1vZGVsQXJ0aWZhY3RzLCB3ZWlnaHRTcGVjcywgd2VpZ2h0RGF0YSwgdHJhaW5pbmdDb25maWcpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCBpc01vZGVsQXJ0aWZhY3RzID0gbW9kZWxBcnRpZmFjdHMubW9kZWxUb3BvbG9neSAhPSBudWxsIHx8XG4gICAgICAgICAgICBtb2RlbEFydGlmYWN0cy53ZWlnaHRTcGVjcyAhPSBudWxsO1xuICAgICAgICBpZiAoaXNNb2RlbEFydGlmYWN0cykge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXNzdGhyb3VnaExvYWRlcihtb2RlbEFydGlmYWN0cyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBMZWdhY3kgc3VwcG9ydDogd2l0aCBvbmx5IG1vZGVsVG9wb2xvZ3kuXG4gICAgICAgICAgICAvLyBUT0RPKGNhaXMpOiBSZW1vdmUgdGhpcyBkZXByZWNhdGVkIEFQSS5cbiAgICAgICAgICAgIGNvbnNvbGUud2FybignUGxlYXNlIGNhbGwgdGYuaW8uZnJvbU1lbW9yeSgpIHdpdGggb25seSBvbmUgYXJndW1lbnQuICcgK1xuICAgICAgICAgICAgICAgICdUaGUgYXJndW1lbnQgc2hvdWxkIGJlIG9mIHR5cGUgTW9kZWxBcnRpZmFjdHMuICcgK1xuICAgICAgICAgICAgICAgICdUaGUgbXVsdGktYXJndW1lbnQgc2lnbmF0dXJlIG9mIHRmLmlvLmZyb21NZW1vcnkoKSBoYXMgYmVlbiAnICtcbiAgICAgICAgICAgICAgICAnZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuJyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBhc3N0aHJvdWdoTG9hZGVyKHsgbW9kZWxUb3BvbG9neTogbW9kZWxBcnRpZmFjdHMgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIExlZ2FjeSBzdXBwb3J0LlxuICAgICAgICAvLyBUT0RPKGNhaXMpOiBSZW1vdmUgdGhpcyBkZXByZWNhdGVkIEFQSS5cbiAgICAgICAgY29uc29sZS53YXJuKCdQbGVhc2UgY2FsbCB0Zi5pby5mcm9tTWVtb3J5KCkgd2l0aCBvbmx5IG9uZSBhcmd1bWVudC4gJyArXG4gICAgICAgICAgICAnVGhlIGFyZ3VtZW50IHNob3VsZCBiZSBvZiB0eXBlIE1vZGVsQXJ0aWZhY3RzLiAnICtcbiAgICAgICAgICAgICdUaGUgbXVsdGktYXJndW1lbnQgc2lnbmF0dXJlIG9mIHRmLmlvLmZyb21NZW1vcnkoKSBoYXMgYmVlbiAnICtcbiAgICAgICAgICAgICdkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4nKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQYXNzdGhyb3VnaExvYWRlcih7XG4gICAgICAgICAgICBtb2RlbFRvcG9sb2d5OiBtb2RlbEFydGlmYWN0cyxcbiAgICAgICAgICAgIHdlaWdodFNwZWNzLFxuICAgICAgICAgICAgd2VpZ2h0RGF0YSxcbiAgICAgICAgICAgIHRyYWluaW5nQ29uZmlnXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbi8qKlxuICogQ3JlYXRlcyBhbiBJT0hhbmRsZXIgdGhhdCBwYXNzZXMgc2F2ZWQgbW9kZWwgYXJ0aWZhY3RzIHRvIGEgY2FsbGJhY2suXG4gKlxuICogYGBganNcbiAqIGZ1bmN0aW9uIGhhbmRsZVNhdmUoYXJ0aWZhY3RzKSB7XG4gKiAgIC8vIC4uLiBkbyBzb21ldGhpbmcgd2l0aCB0aGUgYXJ0aWZhY3RzIC4uLlxuICogICByZXR1cm4ge21vZGVsQXJ0aWZhY3RzSW5mbzogey4uLn0sIC4uLn07XG4gKiB9XG4gKlxuICogY29uc3Qgc2F2ZVJlc3VsdCA9IG1vZGVsLnNhdmUodGYuaW8ud2l0aFNhdmVIYW5kbGVyKGhhbmRsZVNhdmUpKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBzYXZlSGFuZGxlciBBIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBhIGBNb2RlbEFydGlmYWN0c2AgYW5kIHJldHVybnMgYVxuICogICAgIGBTYXZlUmVzdWx0YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhTYXZlSGFuZGxlcihzYXZlSGFuZGxlcikge1xuICAgIHJldHVybiBuZXcgUGFzc3Rocm91Z2hTYXZlcihzYXZlSGFuZGxlcik7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXNzdGhyb3VnaC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsJztcbi8qKlxuICogTW9uaXRvciBQcm9taXNlLmFsbCBwcm9ncmVzcywgZmlyZSBvblByb2dyZXNzIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSBwcm9taXNlcyBQcm9taXNlIGxpc3QgZ29pbmcgdG8gYmUgbW9uaXRvcmVkXG4gKiBAcGFyYW0gb25Qcm9ncmVzcyBDYWxsYmFjayBmdW5jdGlvbi4gRmlyZWQgd2hlbiBhIHByb21pc2UgcmVzb2x2ZWQuXG4gKiBAcGFyYW0gc3RhcnRGcmFjdGlvbiBPcHRpb25hbCBmcmFjdGlvbiBzdGFydC4gRGVmYXVsdCB0byAwLlxuICogQHBhcmFtIGVuZEZyYWN0aW9uIE9wdGlvbmFsIGZyYWN0aW9uIGVuZC4gRGVmYXVsdCB0byAxLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbW9uaXRvclByb21pc2VzUHJvZ3Jlc3MocHJvbWlzZXMsIG9uUHJvZ3Jlc3MsIHN0YXJ0RnJhY3Rpb24sIGVuZEZyYWN0aW9uKSB7XG4gICAgY2hlY2tQcm9taXNlcyhwcm9taXNlcyk7XG4gICAgc3RhcnRGcmFjdGlvbiA9IHN0YXJ0RnJhY3Rpb24gPT0gbnVsbCA/IDAgOiBzdGFydEZyYWN0aW9uO1xuICAgIGVuZEZyYWN0aW9uID0gZW5kRnJhY3Rpb24gPT0gbnVsbCA/IDEgOiBlbmRGcmFjdGlvbjtcbiAgICBjaGVja0ZyYWN0aW9uKHN0YXJ0RnJhY3Rpb24sIGVuZEZyYWN0aW9uKTtcbiAgICBsZXQgcmVzb2x2ZWRQcm9taXNlID0gMDtcbiAgICBjb25zdCByZWdpc3Rlck1vbml0b3IgPSAocHJvbWlzZSkgPT4ge1xuICAgICAgICBwcm9taXNlLnRoZW4odmFsdWUgPT4ge1xuICAgICAgICAgICAgY29uc3QgZnJhY3Rpb24gPSBzdGFydEZyYWN0aW9uICtcbiAgICAgICAgICAgICAgICArK3Jlc29sdmVkUHJvbWlzZSAvIHByb21pc2VzLmxlbmd0aCAqIChlbmRGcmFjdGlvbiAtIHN0YXJ0RnJhY3Rpb24pO1xuICAgICAgICAgICAgLy8gcGFzcyBmcmFjdGlvbiBhcyBwYXJhbWV0ZXIgdG8gY2FsbGJhY2sgZnVuY3Rpb24uXG4gICAgICAgICAgICBvblByb2dyZXNzKGZyYWN0aW9uKTtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH07XG4gICAgZnVuY3Rpb24gY2hlY2tQcm9taXNlcyhwcm9taXNlcykge1xuICAgICAgICBhc3NlcnQocHJvbWlzZXMgIT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KHByb21pc2VzKSAmJiBwcm9taXNlcy5sZW5ndGggPiAwLCAoKSA9PiAncHJvbWlzZXMgbXVzdCBiZSBhIG5vbmUgZW1wdHkgYXJyYXknKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2hlY2tGcmFjdGlvbihzdGFydEZyYWN0aW9uLCBlbmRGcmFjdGlvbikge1xuICAgICAgICBhc3NlcnQoc3RhcnRGcmFjdGlvbiA+PSAwICYmIHN0YXJ0RnJhY3Rpb24gPD0gMSwgKCkgPT4gYFByb2dyZXNzIGZyYWN0aW9uIG11c3QgYmUgaW4gcmFuZ2UgWzAsIDFdLCBidXQgYCArXG4gICAgICAgICAgICBgZ290IHN0YXJ0RnJhY3Rpb24gJHtzdGFydEZyYWN0aW9ufWApO1xuICAgICAgICBhc3NlcnQoZW5kRnJhY3Rpb24gPj0gMCAmJiBlbmRGcmFjdGlvbiA8PSAxLCAoKSA9PiBgUHJvZ3Jlc3MgZnJhY3Rpb24gbXVzdCBiZSBpbiByYW5nZSBbMCwgMV0sIGJ1dCBgICtcbiAgICAgICAgICAgIGBnb3QgZW5kRnJhY3Rpb24gJHtlbmRGcmFjdGlvbn1gKTtcbiAgICAgICAgYXNzZXJ0KGVuZEZyYWN0aW9uID49IHN0YXJ0RnJhY3Rpb24sICgpID0+IGBzdGFydEZyYWN0aW9uIG11c3QgYmUgbm8gbW9yZSB0aGFuIGVuZEZyYWN0aW9uLCBidXQgYCArXG4gICAgICAgICAgICBgZ290IHN0YXJ0RnJhY3Rpb24gJHtzdGFydEZyYWN0aW9ufSBhbmQgZW5kRnJhY3Rpb24gYCArXG4gICAgICAgICAgICBgJHtlbmRGcmFjdGlvbn1gKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzLm1hcChyZWdpc3Rlck1vbml0b3IpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXByb2dyZXNzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmV4cG9ydCBjbGFzcyBJT1JvdXRlclJlZ2lzdHJ5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5zYXZlUm91dGVycyA9IFtdO1xuICAgICAgICB0aGlzLmxvYWRSb3V0ZXJzID0gW107XG4gICAgfVxuICAgIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHtcbiAgICAgICAgaWYgKElPUm91dGVyUmVnaXN0cnkuaW5zdGFuY2UgPT0gbnVsbCkge1xuICAgICAgICAgICAgSU9Sb3V0ZXJSZWdpc3RyeS5pbnN0YW5jZSA9IG5ldyBJT1JvdXRlclJlZ2lzdHJ5KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIElPUm91dGVyUmVnaXN0cnkuaW5zdGFuY2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIGEgc2F2ZS1oYW5kbGVyIHJvdXRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzYXZlUm91dGVyIEEgZnVuY3Rpb24gdGhhdCBtYXBzIGEgVVJMLWxpa2Ugc3RyaW5nIG9udG8gYW4gaW5zdGFuY2VcbiAgICAgKiBvZiBgSU9IYW5kbGVyYCB3aXRoIHRoZSBgc2F2ZWAgbWV0aG9kIGRlZmluZWQgb3IgYG51bGxgLlxuICAgICAqL1xuICAgIHN0YXRpYyByZWdpc3RlclNhdmVSb3V0ZXIoc2F2ZVJvdXRlcikge1xuICAgICAgICBJT1JvdXRlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuc2F2ZVJvdXRlcnMucHVzaChzYXZlUm91dGVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXIgYSBsb2FkLWhhbmRsZXIgcm91dGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIGxvYWRSb3V0ZXIgQSBmdW5jdGlvbiB0aGF0IG1hcHMgYSBVUkwtbGlrZSBzdHJpbmcgb250byBhbiBpbnN0YW5jZVxuICAgICAqIG9mIGBJT0hhbmRsZXJgIHdpdGggdGhlIGBsb2FkYCBtZXRob2QgZGVmaW5lZCBvciBgbnVsbGAuXG4gICAgICovXG4gICAgc3RhdGljIHJlZ2lzdGVyTG9hZFJvdXRlcihsb2FkUm91dGVyKSB7XG4gICAgICAgIElPUm91dGVyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5sb2FkUm91dGVycy5wdXNoKGxvYWRSb3V0ZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb29rIHVwIElPSGFuZGxlciBmb3Igc2F2aW5nLCBnaXZlbiBhIFVSTC1saWtlIHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB1cmxcbiAgICAgKiBAcmV0dXJucyBJZiBvbmx5IG9uZSBtYXRjaCBpcyBmb3VuZCwgYW4gaW5zdGFuY2Ugb2YgSU9IYW5kbGVyIHdpdGggdGhlXG4gICAgICogYHNhdmVgIG1ldGhvZCBkZWZpbmVkLiBJZiBubyBtYXRjaCBpcyBmb3VuZCwgYG51bGxgLlxuICAgICAqIEB0aHJvd3MgRXJyb3IsIGlmIG1vcmUgdGhhbiBvbmUgbWF0Y2ggaXMgZm91bmQuXG4gICAgICovXG4gICAgc3RhdGljIGdldFNhdmVIYW5kbGVycyh1cmwpIHtcbiAgICAgICAgcmV0dXJuIElPUm91dGVyUmVnaXN0cnkuZ2V0SGFuZGxlcnModXJsLCAnc2F2ZScpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb29rIHVwIElPSGFuZGxlciBmb3IgbG9hZGluZywgZ2l2ZW4gYSBVUkwtbGlrZSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdXJsXG4gICAgICogQHBhcmFtIGxvYWRPcHRpb25zIE9wdGlvbmFsLCBjdXN0b20gbG9hZCBvcHRpb25zLlxuICAgICAqIEByZXR1cm5zIEFsbCB2YWxpZCBoYW5kbGVycyBmb3IgYHVybGAsIGdpdmVuIHRoZSBjdXJyZW50bHkgcmVnaXN0ZXJlZFxuICAgICAqICAgaGFuZGxlciByb3V0ZXJzLlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRMb2FkSGFuZGxlcnModXJsLCBsb2FkT3B0aW9ucykge1xuICAgICAgICByZXR1cm4gSU9Sb3V0ZXJSZWdpc3RyeS5nZXRIYW5kbGVycyh1cmwsICdsb2FkJywgbG9hZE9wdGlvbnMpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0SGFuZGxlcnModXJsLCBoYW5kbGVyVHlwZSwgbG9hZE9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgdmFsaWRIYW5kbGVycyA9IFtdO1xuICAgICAgICBjb25zdCByb3V0ZXJzID0gaGFuZGxlclR5cGUgPT09ICdsb2FkJyA/XG4gICAgICAgICAgICBJT1JvdXRlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkubG9hZFJvdXRlcnMgOlxuICAgICAgICAgICAgSU9Sb3V0ZXJSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLnNhdmVSb3V0ZXJzO1xuICAgICAgICByb3V0ZXJzLmZvckVhY2gocm91dGVyID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSByb3V0ZXIodXJsLCBsb2FkT3B0aW9ucyk7XG4gICAgICAgICAgICBpZiAoaGFuZGxlciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZhbGlkSGFuZGxlcnMucHVzaChoYW5kbGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB2YWxpZEhhbmRsZXJzO1xuICAgIH1cbn1cbmV4cG9ydCBjb25zdCByZWdpc3RlclNhdmVSb3V0ZXIgPSAobG91ZFJvdXRlcikgPT4gSU9Sb3V0ZXJSZWdpc3RyeS5yZWdpc3RlclNhdmVSb3V0ZXIobG91ZFJvdXRlcik7XG5leHBvcnQgY29uc3QgcmVnaXN0ZXJMb2FkUm91dGVyID0gKGxvdWRSb3V0ZXIpID0+IElPUm91dGVyUmVnaXN0cnkucmVnaXN0ZXJMb2FkUm91dGVyKGxvdWRSb3V0ZXIpO1xuZXhwb3J0IGNvbnN0IGdldFNhdmVIYW5kbGVycyA9ICh1cmwpID0+IElPUm91dGVyUmVnaXN0cnkuZ2V0U2F2ZUhhbmRsZXJzKHVybCk7XG5leHBvcnQgY29uc3QgZ2V0TG9hZEhhbmRsZXJzID0gKHVybCwgbG9hZE9wdGlvbnMpID0+IElPUm91dGVyUmVnaXN0cnkuZ2V0TG9hZEhhbmRsZXJzKHVybCwgbG9hZE9wdGlvbnMpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cm91dGVyX3JlZ2lzdHJ5LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qIFR5cGUgZGVmaW5pdGlvbnMgZm9yIGV4cG9ydGluZyBhbmQgaW1wb3J0aW5nIG9mIG1vZGVscy4gKi9cbi8qKlxuICogQSBtYXAgZnJvbSBUZW5zb3IgZHR5cGUgdG8gbnVtYmVyIG9mIGJ5dGVzIHBlciBlbGVtZW50IG9mIHRoZSBUZW5zb3IuXG4gKi9cbmV4cG9ydCBjb25zdCBEVFlQRV9WQUxVRV9TSVpFX01BUCA9IHtcbiAgICAnZmxvYXQzMic6IDQsXG4gICAgJ2Zsb2F0MTYnOiAyLFxuICAgICdpbnQzMic6IDQsXG4gICAgJ3VpbnQxNic6IDIsXG4gICAgJ3VpbnQ4JzogMSxcbiAgICAnYm9vbCc6IDEsXG4gICAgJ2NvbXBsZXg2NCc6IDhcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD10eXBlcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBlbnYgfSBmcm9tICcuLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgZGVjb2RlV2VpZ2h0cyB9IGZyb20gJy4vaW9fdXRpbHMnO1xuaW1wb3J0IHsgbW9uaXRvclByb21pc2VzUHJvZ3Jlc3MgfSBmcm9tICcuL3Byb2dyZXNzJztcbmltcG9ydCB7IERUWVBFX1ZBTFVFX1NJWkVfTUFQIH0gZnJvbSAnLi90eXBlcyc7XG4vKipcbiAqIFJlYWRzIGJpbmFyeSB3ZWlnaHRzIGRhdGEgZnJvbSBhIG51bWJlciBvZiBVUkxzLlxuICpcbiAqIEBwYXJhbSBmZXRjaFVSTHMgVVJMcyB0byBzZW5kIHRoZSBIVFRQIHJlcXVlc3RzIGF0LCB1c2luZyBgZmV0Y2hgIGNhbGxzLlxuICogQHBhcmFtIHJlcXVlc3RPcHRpb25zIFJlcXVlc3RJbml0IChvcHRpb25zKSBmb3IgdGhlIEhUVFAgcmVxdWVzdHMuXG4gKiBAcGFyYW0gZmV0Y2hGdW5jIE9wdGlvbmFsIG92ZXJyaWRpbmcgdmFsdWUgZm9yIHRoZSBgd2luZG93LmZldGNoYCBmdW5jdGlvbi5cbiAqIEBwYXJhbSBvblByb2dyZXNzIE9wdGlvbmFsLCBwcm9ncmVzcyBjYWxsYmFjayBmdW5jdGlvbiwgZmlyZWQgcGVyaW9kaWNhbGx5XG4gKiAgIGJlZm9yZSB0aGUgbG9hZCBpcyBjb21wbGV0ZWQuXG4gKiBAcmV0dXJucyBBIGBQcm9taXNlYCBvZiBhbiBBcnJheSBvZiBgQXJyYXlCdWZmZXJgLiBUaGUgQXJyYXkgaGFzIHRoZSBzYW1lXG4gKiAgIGxlbmd0aCBhcyBgZmV0Y2hVUkxzYC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRXZWlnaHRzQXNBcnJheUJ1ZmZlcihmZXRjaFVSTHMsIGxvYWRPcHRpb25zKSB7XG4gICAgaWYgKGxvYWRPcHRpb25zID09IG51bGwpIHtcbiAgICAgICAgbG9hZE9wdGlvbnMgPSB7fTtcbiAgICB9XG4gICAgY29uc3QgZmV0Y2hGdW5jID0gbG9hZE9wdGlvbnMuZmV0Y2hGdW5jID09IG51bGwgPyBlbnYoKS5wbGF0Zm9ybS5mZXRjaCA6XG4gICAgICAgIGxvYWRPcHRpb25zLmZldGNoRnVuYztcbiAgICAvLyBDcmVhdGUgdGhlIHJlcXVlc3RzIGZvciBhbGwgb2YgdGhlIHdlaWdodHMgaW4gcGFyYWxsZWwuXG4gICAgY29uc3QgcmVxdWVzdHMgPSBmZXRjaFVSTHMubWFwKGZldGNoVVJMID0+IGZldGNoRnVuYyhmZXRjaFVSTCwgbG9hZE9wdGlvbnMucmVxdWVzdEluaXQsIHsgaXNCaW5hcnk6IHRydWUgfSkpO1xuICAgIGNvbnN0IGZldGNoU3RhcnRGcmFjdGlvbiA9IDA7XG4gICAgY29uc3QgZmV0Y2hFbmRGcmFjdGlvbiA9IDAuNTtcbiAgICBjb25zdCByZXNwb25zZXMgPSBsb2FkT3B0aW9ucy5vblByb2dyZXNzID09IG51bGwgP1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChyZXF1ZXN0cykgOlxuICAgICAgICBhd2FpdCBtb25pdG9yUHJvbWlzZXNQcm9ncmVzcyhyZXF1ZXN0cywgbG9hZE9wdGlvbnMub25Qcm9ncmVzcywgZmV0Y2hTdGFydEZyYWN0aW9uLCBmZXRjaEVuZEZyYWN0aW9uKTtcbiAgICBjb25zdCBidWZmZXJQcm9taXNlcyA9IHJlc3BvbnNlcy5tYXAocmVzcG9uc2UgPT4gcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSk7XG4gICAgY29uc3QgYnVmZmVyU3RhcnRGcmFjdGlvbiA9IDAuNTtcbiAgICBjb25zdCBidWZmZXJFbmRGcmFjdGlvbiA9IDE7XG4gICAgY29uc3QgYnVmZmVycyA9IGxvYWRPcHRpb25zLm9uUHJvZ3Jlc3MgPT0gbnVsbCA/XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKGJ1ZmZlclByb21pc2VzKSA6XG4gICAgICAgIGF3YWl0IG1vbml0b3JQcm9taXNlc1Byb2dyZXNzKGJ1ZmZlclByb21pc2VzLCBsb2FkT3B0aW9ucy5vblByb2dyZXNzLCBidWZmZXJTdGFydEZyYWN0aW9uLCBidWZmZXJFbmRGcmFjdGlvbik7XG4gICAgcmV0dXJuIGJ1ZmZlcnM7XG59XG4vKipcbiAqIFJlYWRzIGEgd2VpZ2h0cyBtYW5pZmVzdCBKU09OIGNvbmZpZ3VyYXRpb24sIGZldGNoZXMgdGhlIHdlaWdodHMgYW5kXG4gKiByZXR1cm5zIHRoZW0gYXMgYFRlbnNvcmBzLlxuICpcbiAqIEBwYXJhbSBtYW5pZmVzdCBUaGUgd2VpZ2h0cyBtYW5pZmVzdCBKU09OLlxuICogQHBhcmFtIGZpbGVQYXRoUHJlZml4IFRoZSBwYXRoIHByZWZpeCBmb3IgZmlsZW5hbWVzIGdpdmVuIGluIHRoZSBtYW5pZmVzdC5cbiAqICAgICBEZWZhdWx0cyB0byB0aGUgZW1wdHkgc3RyaW5nLlxuICogQHBhcmFtIHdlaWdodE5hbWVzIFRoZSBuYW1lcyBvZiB0aGUgd2VpZ2h0cyB0byBiZSBmZXRjaGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFdlaWdodHMobWFuaWZlc3QsIGZpbGVQYXRoUHJlZml4ID0gJycsIHdlaWdodE5hbWVzLCByZXF1ZXN0SW5pdCkge1xuICAgIC8vIFRPRE8obnN0aG9yYXQpOiBHcm91cHMgYXJlIGN1cnJlbnRseSBmZXRjaGVkIGF0b21pY2FsbHkuIElmIHlvdSBuZWVkIGFcbiAgICAvLyBzaW5nbGUgd2VpZ2h0IGZyb20gYSBncm91cCwgdGhlIHdob2xlIGdyb3VwIHdpbGwgYmUgZmV0Y2hlZC4gQXQgYSBmdXR1cmVcbiAgICAvLyBkYXRlLCB3ZSBzaG91bGQgc3VwcG9ydCBmZXRjaGluZyBvbmx5IHRoZSBpbmRpdmlkdWFsIHNoYXJkcyB3aXRoaW4gYVxuICAgIC8vIGdyb3VwIHRoYXQgYXJlIG5lZWRlZCB0byByZWNvbnN0cnVjdCB0aGUgcmVxdWVzdGVkIHdlaWdodC5cbiAgICAvLyBUT0RPKGNhaXMpOiBVc2UgYGRlY29kZVdlaWdodHNgIGZvciBpbXBsZW1lbnRhdGlvbi5cbiAgICBjb25zdCBmZXRjaFdlaWdodHMgPSAoZmV0Y2hVcmxzKSA9PiBsb2FkV2VpZ2h0c0FzQXJyYXlCdWZmZXIoZmV0Y2hVcmxzLCB7IHJlcXVlc3RJbml0IH0pO1xuICAgIGNvbnN0IGxvYWRXZWlnaHRzID0gd2VpZ2h0c0xvYWRlckZhY3RvcnkoZmV0Y2hXZWlnaHRzKTtcbiAgICByZXR1cm4gbG9hZFdlaWdodHMobWFuaWZlc3QsIGZpbGVQYXRoUHJlZml4LCB3ZWlnaHROYW1lcyk7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiwgd2hpY2ggcmVhZHMgYSB3ZWlnaHRzIG1hbmlmZXN0IEpTT04gY29uZmlndXJhdGlvbixcbiAqIGZldGNoZXMgdGhlIHdlaWdodCBmaWxlcyB1c2luZyB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIGFuZCByZXR1cm5zIHRoZW0gYXNcbiAqIGBUZW5zb3Jgcy5cbiAqXG4gKiBgYGBqc1xuICogLy8gZXhhbXBsZSBmb3IgY3JlYXRpbmcgYSBub2RlanMgd2VpZ2h0IGxvYWRlciwgd2hpY2ggcmVhZHMgdGhlIHdlaWdodCBmaWxlc1xuICogLy8gZnJvbSBkaXNrIHVzaW5nIGZzLnJlYWRGaWxlU3luY1xuICpcbiAqIGltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJ1xuICpcbiAqIGNvbnN0IGZldGNoV2VpZ2h0c0Zyb21EaXNrID0gKGZpbGVQYXRoczogc3RyaW5nW10pID0+XG4gKiAgIGZpbGVQYXRocy5tYXAoZmlsZVBhdGggPT4gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoKS5idWZmZXIpXG4gKlxuICogY29uc3QgbG9hZFdlaWdodHMgPSB0Zi5pby53ZWlnaHRzTG9hZGVyRmFjdG9yeShmZXRjaFdlaWdodHNGcm9tRGlzaylcbiAqXG4gKiBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoXG4gKiAgIGZzLnJlYWRGaWxlU3luYygnLi9teV9tb2RlbC13ZWlnaHRzX21hbmlmZXN0JykudG9TdHJpbmcoKVxuICogKVxuICogY29uc3Qgd2VpZ2h0TWFwID0gYXdhaXQgbG9hZFdlaWdodHMobWFuaWZlc3QsICcuLycpXG4gKiBgYGBcbiAqIEBwYXJhbSBmZXRjaFdlaWdodHNGdW5jdGlvbiBUaGUgZnVuY3Rpb24gdXNlZCBmb3IgZmV0Y2hpbmcgdGhlIHdlaWdodCBmaWxlcy5cbiAqIEByZXR1cm5zIFdlaWdodCBsb2FkaW5nIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2VpZ2h0c0xvYWRlckZhY3RvcnkoZmV0Y2hXZWlnaHRzRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gYXN5bmMgKG1hbmlmZXN0LCBmaWxlUGF0aFByZWZpeCA9ICcnLCB3ZWlnaHROYW1lcykgPT4ge1xuICAgICAgICAvLyBDb2xsZWN0IGFsbCB0aGUgZ3JvdXBzLCB3ZWlnaHRzLCBhbmQgdGhlaXIgcmVsYXRpdmUgb2Zmc2V0cyB0byBiZVxuICAgICAgICAvLyBmZXRjaGVkLlxuICAgICAgICBjb25zdCBncm91cEluZGljZXNUb0ZldGNoTWFwID0gbWFuaWZlc3QubWFwKCgpID0+IGZhbHNlKTtcbiAgICAgICAgY29uc3QgZ3JvdXBXZWlnaHRzVG9GZXRjaCA9IHt9O1xuICAgICAgICBjb25zdCB3ZWlnaHRzRm91bmQgPSB3ZWlnaHROYW1lcyAhPSBudWxsID8gd2VpZ2h0TmFtZXMubWFwKCgpID0+IGZhbHNlKSA6IFtdO1xuICAgICAgICBjb25zdCBhbGxNYW5pZmVzdFdlaWdodE5hbWVzID0gW107XG4gICAgICAgIG1hbmlmZXN0LmZvckVhY2goKG1hbmlmZXN0R3JvdXBDb25maWcsIGdyb3VwSW5kZXgpID0+IHtcbiAgICAgICAgICAgIGxldCBncm91cE9mZnNldCA9IDA7XG4gICAgICAgICAgICBtYW5pZmVzdEdyb3VwQ29uZmlnLndlaWdodHMuZm9yRWFjaCh3ZWlnaHRzRW50cnkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhd0R0eXBlID0gKCdxdWFudGl6YXRpb24nIGluIHdlaWdodHNFbnRyeSkgP1xuICAgICAgICAgICAgICAgICAgICB3ZWlnaHRzRW50cnkucXVhbnRpemF0aW9uLmR0eXBlIDpcbiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0c0VudHJ5LmR0eXBlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHdlaWdodHNCeXRlcyA9IERUWVBFX1ZBTFVFX1NJWkVfTUFQW3Jhd0R0eXBlXSAqXG4gICAgICAgICAgICAgICAgICAgIHV0aWwuc2l6ZUZyb21TaGFwZSh3ZWlnaHRzRW50cnkuc2hhcGUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVucXVldWVXZWlnaHRzRm9yRmV0Y2hpbmdGbiA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBJbmRpY2VzVG9GZXRjaE1hcFtncm91cEluZGV4XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChncm91cFdlaWdodHNUb0ZldGNoW2dyb3VwSW5kZXhdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwV2VpZ2h0c1RvRmV0Y2hbZ3JvdXBJbmRleF0gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBncm91cFdlaWdodHNUb0ZldGNoW2dyb3VwSW5kZXhdLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3RFbnRyeTogd2VpZ2h0c0VudHJ5LFxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBPZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplQnl0ZXM6IHdlaWdodHNCeXRlc1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmICh3ZWlnaHROYW1lcyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHdlaWdodE5hbWVzLmZvckVhY2goKHdlaWdodE5hbWUsIHdlaWdodEluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAod2VpZ2h0TmFtZSA9PT0gd2VpZ2h0c0VudHJ5Lm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnF1ZXVlV2VpZ2h0c0ZvckZldGNoaW5nRm4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRzRm91bmRbd2VpZ2h0SW5kZXhdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlbnF1ZXVlV2VpZ2h0c0ZvckZldGNoaW5nRm4oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYWxsTWFuaWZlc3RXZWlnaHROYW1lcy5wdXNoKHdlaWdodHNFbnRyeS5uYW1lKTtcbiAgICAgICAgICAgICAgICBncm91cE9mZnNldCArPSB3ZWlnaHRzQnl0ZXM7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghd2VpZ2h0c0ZvdW5kLmV2ZXJ5KGZvdW5kID0+IGZvdW5kKSkge1xuICAgICAgICAgICAgY29uc3Qgd2VpZ2h0c05vdEZvdW5kID0gd2VpZ2h0TmFtZXMuZmlsdGVyKChfLCBpKSA9PiAhd2VpZ2h0c0ZvdW5kW2ldKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgd2VpZ2h0cyBpbiBtYW5pZmVzdCB3aXRoIG5hbWVzOiBgICtcbiAgICAgICAgICAgICAgICBgJHt3ZWlnaHRzTm90Rm91bmQuam9pbignLCAnKX0uIFxcbmAgK1xuICAgICAgICAgICAgICAgIGBNYW5pZmVzdCBKU09OIGhhcyB3ZWlnaHRzIHdpdGggbmFtZXM6IGAgK1xuICAgICAgICAgICAgICAgIGAke2FsbE1hbmlmZXN0V2VpZ2h0TmFtZXMuam9pbignLCAnKX0uYCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ29udmVydCB0aGUgb25lLWhvdCBib29sZWFuIGdyb3VwSWQgPT4gc2hvdWxkRmV0Y2ggbWFwIHRvIGEgbGlzdCBvZiBncm91cFxuICAgICAgICAvLyBJRHMuXG4gICAgICAgIGNvbnN0IGdyb3VwSW5kaWNlc1RvRmV0Y2ggPSBncm91cEluZGljZXNUb0ZldGNoTWFwLnJlZHVjZSgoYWNjdW11bGF0b3IsIHNob3VsZEZldGNoLCBpKSA9PiB7XG4gICAgICAgICAgICBpZiAoc2hvdWxkRmV0Y2gpIHtcbiAgICAgICAgICAgICAgICBhY2N1bXVsYXRvci5wdXNoKGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICAgICAgICB9LCBbXSk7XG4gICAgICAgIGNvbnN0IGZldGNoVXJscyA9IFtdO1xuICAgICAgICBncm91cEluZGljZXNUb0ZldGNoLmZvckVhY2goaSA9PiB7XG4gICAgICAgICAgICBtYW5pZmVzdFtpXS5wYXRocy5mb3JFYWNoKGZpbGVwYXRoID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmZXRjaFVybCA9IGZpbGVQYXRoUHJlZml4ICtcbiAgICAgICAgICAgICAgICAgICAgKCFmaWxlUGF0aFByZWZpeC5lbmRzV2l0aCgnLycpID8gJy8nIDogJycpICsgZmlsZXBhdGg7XG4gICAgICAgICAgICAgICAgZmV0Y2hVcmxzLnB1c2goZmV0Y2hVcmwpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBidWZmZXJzID0gYXdhaXQgZmV0Y2hXZWlnaHRzRnVuY3Rpb24oZmV0Y2hVcmxzKTtcbiAgICAgICAgY29uc3Qgd2VpZ2h0c1RlbnNvck1hcCA9IHt9O1xuICAgICAgICBsZXQgYnVmZmVySW5kZXhPZmZzZXQgPSAwO1xuICAgICAgICBncm91cEluZGljZXNUb0ZldGNoLmZvckVhY2goaSA9PiB7XG4gICAgICAgICAgICBjb25zdCBudW1CdWZmZXJzID0gbWFuaWZlc3RbaV0ucGF0aHMubGVuZ3RoO1xuICAgICAgICAgICAgbGV0IGdyb3VwQnl0ZXMgPSAwO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1CdWZmZXJzOyBpKyspIHtcbiAgICAgICAgICAgICAgICBncm91cEJ5dGVzICs9IGJ1ZmZlcnNbYnVmZmVySW5kZXhPZmZzZXQgKyBpXS5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ3JlYXRlIGEgYnVmZmVyIGZvciB0aGUgd2hvbGUgZ3JvdXAuXG4gICAgICAgICAgICBjb25zdCBncm91cEJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihncm91cEJ5dGVzKTtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwQnl0ZUJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KGdyb3VwQnVmZmVyKTtcbiAgICAgICAgICAgIGxldCBncm91cEJ1ZmZlck9mZnNldCA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUJ1ZmZlcnM7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcnNbYnVmZmVySW5kZXhPZmZzZXQgKyBpXSk7XG4gICAgICAgICAgICAgICAgZ3JvdXBCeXRlQnVmZmVyLnNldChidWZmZXIsIGdyb3VwQnVmZmVyT2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBncm91cEJ1ZmZlck9mZnNldCArPSBidWZmZXIuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHdlaWdodHNFbnRyaWVzID0gZ3JvdXBXZWlnaHRzVG9GZXRjaFtpXTtcbiAgICAgICAgICAgIHdlaWdodHNFbnRyaWVzLmZvckVhY2god2VpZ2h0c0VudHJ5ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBieXRlQnVmZmVyID0gZ3JvdXBCdWZmZXIuc2xpY2Uod2VpZ2h0c0VudHJ5Lmdyb3VwT2Zmc2V0LCB3ZWlnaHRzRW50cnkuZ3JvdXBPZmZzZXQgKyB3ZWlnaHRzRW50cnkuc2l6ZUJ5dGVzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lVG9UZW5zb3JNYXAgPSBkZWNvZGVXZWlnaHRzKGJ5dGVCdWZmZXIsIFt3ZWlnaHRzRW50cnkubWFuaWZlc3RFbnRyeV0pO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBuYW1lVG9UZW5zb3JNYXApIHtcbiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0c1RlbnNvck1hcFtuYW1lXSA9IG5hbWVUb1RlbnNvck1hcFtuYW1lXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJ1ZmZlckluZGV4T2Zmc2V0ICs9IG51bUJ1ZmZlcnM7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gd2VpZ2h0c1RlbnNvck1hcDtcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d2VpZ2h0c19sb2FkZXIuanMubWFwIiwiZXhwb3J0IGNvbnN0IEFicyA9ICdBYnMnO1xuZXhwb3J0IGNvbnN0IEFjb3MgPSAnQWNvcyc7XG5leHBvcnQgY29uc3QgQWNvc2ggPSAnQWNvc2gnO1xuZXhwb3J0IGNvbnN0IEFkZCA9ICdBZGQnO1xuZXhwb3J0IGNvbnN0IEFkZE4gPSAnQWRkTic7XG5leHBvcnQgY29uc3QgQWxsID0gJ0FsbCc7XG5leHBvcnQgY29uc3QgQW55ID0gJ0FueSc7XG5leHBvcnQgY29uc3QgQXJnTWF4ID0gJ0FyZ01heCc7XG5leHBvcnQgY29uc3QgQXJnTWluID0gJ0FyZ01pbic7XG5leHBvcnQgY29uc3QgQXNpbiA9ICdBc2luJztcbmV4cG9ydCBjb25zdCBBc2luaCA9ICdBc2luaCc7XG5leHBvcnQgY29uc3QgQXRhbiA9ICdBdGFuJztcbmV4cG9ydCBjb25zdCBBdGFuaCA9ICdBdGFuaCc7XG5leHBvcnQgY29uc3QgQXRhbjIgPSAnQXRhbjInO1xuZXhwb3J0IGNvbnN0IEF2Z1Bvb2wgPSAnQXZnUG9vbCc7XG5leHBvcnQgY29uc3QgQXZnUG9vbEdyYWQgPSAnQXZnUG9vbEdyYWQnO1xuZXhwb3J0IGNvbnN0IEF2Z1Bvb2wzRCA9ICdBdmdQb29sM0QnO1xuZXhwb3J0IGNvbnN0IEF2Z1Bvb2wzREdyYWQgPSAnQXZnUG9vbDNER3JhZCc7XG5leHBvcnQgY29uc3QgQmF0Y2hNYXRNdWwgPSAnQmF0Y2hNYXRNdWwnO1xuZXhwb3J0IGNvbnN0IEJhdGNoVG9TcGFjZU5EID0gJ0JhdGNoVG9TcGFjZU5EJztcbmV4cG9ydCBjb25zdCBCaW5jb3VudCA9ICdCaW5jb3VudCc7XG5leHBvcnQgY29uc3QgQnJvYWRjYXN0VG8gPSAnQnJvYWRjYXN0VG8nO1xuZXhwb3J0IGNvbnN0IENhc3QgPSAnQ2FzdCc7XG5leHBvcnQgY29uc3QgQ2VpbCA9ICdDZWlsJztcbmV4cG9ydCBjb25zdCBDbGlwQnlWYWx1ZSA9ICdDbGlwQnlWYWx1ZSc7XG5leHBvcnQgY29uc3QgQ29tcGxleCA9ICdDb21wbGV4JztcbmV4cG9ydCBjb25zdCBDb21wbGV4QWJzID0gJ0NvbXBsZXhBYnMnO1xuZXhwb3J0IGNvbnN0IENvbmNhdCA9ICdDb25jYXQnO1xuZXhwb3J0IGNvbnN0IENvbnYyRCA9ICdDb252MkQnO1xuZXhwb3J0IGNvbnN0IENvbnYyREJhY2twcm9wRmlsdGVyID0gJ0NvbnYyREJhY2twcm9wRmlsdGVyJztcbmV4cG9ydCBjb25zdCBDb252MkRCYWNrcHJvcElucHV0ID0gJ0NvbnYyREJhY2twcm9wSW5wdXQnO1xuZXhwb3J0IGNvbnN0IENvbnYzRCA9ICdDb252M0QnO1xuZXhwb3J0IGNvbnN0IENvbnYzREJhY2twcm9wRmlsdGVyVjIgPSAnQ29udjNEQmFja3Byb3BGaWx0ZXJWMic7XG5leHBvcnQgY29uc3QgQ29udjNEQmFja3Byb3BJbnB1dFYyID0gJ0NvbnYzREJhY2twcm9wSW5wdXRWMic7XG5leHBvcnQgY29uc3QgQ29zID0gJ0Nvcyc7XG5leHBvcnQgY29uc3QgQ29zaCA9ICdDb3NoJztcbmV4cG9ydCBjb25zdCBDdW1zdW0gPSAnQ3Vtc3VtJztcbmV4cG9ydCBjb25zdCBDcm9wQW5kUmVzaXplID0gJ0Nyb3BBbmRSZXNpemUnO1xuZXhwb3J0IGNvbnN0IERlbnNlQmluY291bnQgPSAnRGVuc2VCaW5jb3VudCc7XG5leHBvcnQgY29uc3QgRGVwdGhUb1NwYWNlID0gJ0RlcHRoVG9TcGFjZSc7XG5leHBvcnQgY29uc3QgRGVwdGh3aXNlQ29udjJkTmF0aXZlID0gJ0RlcHRod2lzZUNvbnYyZE5hdGl2ZSc7XG5leHBvcnQgY29uc3QgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIgPSAnRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXInO1xuZXhwb3J0IGNvbnN0IERlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXQgPSAnRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCc7XG5leHBvcnQgY29uc3QgRGlhZyA9ICdEaWFnJztcbmV4cG9ydCBjb25zdCBEaWxhdGlvbjJEID0gJ0RpbGF0aW9uMkQnO1xuZXhwb3J0IGNvbnN0IERpbGF0aW9uMkRCYWNrcHJvcElucHV0ID0gJ0RpbGF0aW9uMkRCYWNrcHJvcElucHV0JztcbmV4cG9ydCBjb25zdCBEaWxhdGlvbjJEQmFja3Byb3BGaWx0ZXIgPSAnRGlsYXRpb24yREJhY2twcm9wRmlsdGVyJztcbmV4cG9ydCBjb25zdCBSZWFsRGl2ID0gJ1JlYWxEaXYnO1xuZXhwb3J0IGNvbnN0IEVpbnN1bSA9ICdFaW5zdW0nO1xuZXhwb3J0IGNvbnN0IEVsdSA9ICdFbHUnO1xuZXhwb3J0IGNvbnN0IEVsdUdyYWQgPSAnRWx1R3JhZCc7XG5leHBvcnQgY29uc3QgRXJmID0gJ0VyZic7XG5leHBvcnQgY29uc3QgRXF1YWwgPSAnRXF1YWwnO1xuZXhwb3J0IGNvbnN0IEV4cCA9ICdFeHAnO1xuZXhwb3J0IGNvbnN0IEV4cGFuZERpbXMgPSAnRXhwYW5kRGltcyc7XG5leHBvcnQgY29uc3QgRXhwbTEgPSAnRXhwbTEnO1xuZXhwb3J0IGNvbnN0IEZGVCA9ICdGRlQnO1xuZXhwb3J0IGNvbnN0IEZpbGwgPSAnRmlsbCc7XG5leHBvcnQgY29uc3QgRmxpcExlZnRSaWdodCA9ICdGbGlwTGVmdFJpZ2h0JztcbmV4cG9ydCBjb25zdCBGbG9vciA9ICdGbG9vcic7XG5leHBvcnQgY29uc3QgRmxvb3JEaXYgPSAnRmxvb3JEaXYnO1xuZXhwb3J0IGNvbnN0IEZ1c2VkQmF0Y2hOb3JtID0gJ0Z1c2VkQmF0Y2hOb3JtJztcbmV4cG9ydCBjb25zdCBHYXRoZXJWMiA9ICdHYXRoZXJWMic7XG5leHBvcnQgY29uc3QgR2F0aGVyTmQgPSAnR2F0aGVyTmQnO1xuZXhwb3J0IGNvbnN0IEdyZWF0ZXIgPSAnR3JlYXRlcic7XG5leHBvcnQgY29uc3QgR3JlYXRlckVxdWFsID0gJ0dyZWF0ZXJFcXVhbCc7XG5leHBvcnQgY29uc3QgSWRlbnRpdHkgPSAnSWRlbnRpdHknO1xuZXhwb3J0IGNvbnN0IElGRlQgPSAnSUZGVCc7XG5leHBvcnQgY29uc3QgSW1hZyA9ICdJbWFnJztcbmV4cG9ydCBjb25zdCBJc0Zpbml0ZSA9ICdJc0Zpbml0ZSc7XG5leHBvcnQgY29uc3QgSXNJbmYgPSAnSXNJbmYnO1xuZXhwb3J0IGNvbnN0IElzTmFuID0gJ0lzTmFuJztcbmV4cG9ydCBjb25zdCBMZWFreVJlbHUgPSAnTGVha3lSZWx1JztcbmV4cG9ydCBjb25zdCBMZXNzID0gJ0xlc3MnO1xuZXhwb3J0IGNvbnN0IExlc3NFcXVhbCA9ICdMZXNzRXF1YWwnO1xuZXhwb3J0IGNvbnN0IExpblNwYWNlID0gJ0xpblNwYWNlJztcbmV4cG9ydCBjb25zdCBMb2cgPSAnTG9nJztcbmV4cG9ydCBjb25zdCBMb2cxcCA9ICdMb2cxcCc7XG5leHBvcnQgY29uc3QgTG9naWNhbEFuZCA9ICdMb2dpY2FsQW5kJztcbmV4cG9ydCBjb25zdCBMb2dpY2FsTm90ID0gJ0xvZ2ljYWxOb3QnO1xuZXhwb3J0IGNvbnN0IExvZ2ljYWxPciA9ICdMb2dpY2FsT3InO1xuZXhwb3J0IGNvbnN0IExvZ1NvZnRtYXggPSAnTG9nU29mdG1heCc7XG5leHBvcnQgY29uc3QgTFJOID0gJ0xSTic7XG5leHBvcnQgY29uc3QgTFJOR3JhZCA9ICdMUk5HcmFkJztcbmV4cG9ydCBjb25zdCBNYXggPSAnTWF4JztcbmV4cG9ydCBjb25zdCBNYXhpbXVtID0gJ01heGltdW0nO1xuZXhwb3J0IGNvbnN0IE1heFBvb2wgPSAnTWF4UG9vbCc7XG5leHBvcnQgY29uc3QgTWF4UG9vbEdyYWQgPSAnTWF4UG9vbEdyYWQnO1xuZXhwb3J0IGNvbnN0IE1heFBvb2wzRCA9ICdNYXhQb29sM0QnO1xuZXhwb3J0IGNvbnN0IE1heFBvb2wzREdyYWQgPSAnTWF4UG9vbDNER3JhZCc7XG5leHBvcnQgY29uc3QgTWF4UG9vbFdpdGhBcmdtYXggPSAnTWF4UG9vbFdpdGhBcmdtYXgnO1xuZXhwb3J0IGNvbnN0IE1lYW4gPSAnTWVhbic7XG5leHBvcnQgY29uc3QgTWluID0gJ01pbic7XG5leHBvcnQgY29uc3QgTWluaW11bSA9ICdNaW5pbXVtJztcbmV4cG9ydCBjb25zdCBNaXJyb3JQYWQgPSAnTWlycm9yUGFkJztcbmV4cG9ydCBjb25zdCBNb2QgPSAnTW9kJztcbmV4cG9ydCBjb25zdCBNdWx0aW5vbWlhbCA9ICdNdWx0aW5vbWlhbCc7XG5leHBvcnQgY29uc3QgTXVsdGlwbHkgPSAnTXVsdGlwbHknO1xuZXhwb3J0IGNvbnN0IE5lZyA9ICdOZWcnO1xuZXhwb3J0IGNvbnN0IE5vdEVxdWFsID0gJ05vdEVxdWFsJztcbmV4cG9ydCBjb25zdCBOb25NYXhTdXBwcmVzc2lvblYzID0gJ05vbk1heFN1cHByZXNzaW9uVjMnO1xuZXhwb3J0IGNvbnN0IE5vbk1heFN1cHByZXNzaW9uVjQgPSAnTm9uTWF4U3VwcHJlc3Npb25WNCc7XG5leHBvcnQgY29uc3QgTm9uTWF4U3VwcHJlc3Npb25WNSA9ICdOb25NYXhTdXBwcmVzc2lvblY1JztcbmV4cG9ydCBjb25zdCBPbmVzTGlrZSA9ICdPbmVzTGlrZSc7XG5leHBvcnQgY29uc3QgT25lSG90ID0gJ09uZUhvdCc7XG5leHBvcnQgY29uc3QgUGFjayA9ICdQYWNrJztcbmV4cG9ydCBjb25zdCBQYWRWMiA9ICdQYWRWMic7XG5leHBvcnQgY29uc3QgUG9vbCA9ICdQb29sJztcbmV4cG9ydCBjb25zdCBQb3cgPSAnUG93JztcbmV4cG9ydCBjb25zdCBQcmVsdSA9ICdQcmVsdSc7XG5leHBvcnQgY29uc3QgUHJvZCA9ICdQcm9kJztcbmV4cG9ydCBjb25zdCBSYW5nZSA9ICdSYW5nZSc7XG5leHBvcnQgY29uc3QgUmVhbCA9ICdSZWFsJztcbmV4cG9ydCBjb25zdCBSZWNpcHJvY2FsID0gJ1JlY2lwcm9jYWwnO1xuZXhwb3J0IGNvbnN0IFJlbHUgPSAnUmVsdSc7XG5leHBvcnQgY29uc3QgUmVzaGFwZSA9ICdSZXNoYXBlJztcbmV4cG9ydCBjb25zdCBSZXNpemVOZWFyZXN0TmVpZ2hib3IgPSAnUmVzaXplTmVhcmVzdE5laWdoYm9yJztcbmV4cG9ydCBjb25zdCBSZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkID0gJ1Jlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWQnO1xuZXhwb3J0IGNvbnN0IFJlc2l6ZUJpbGluZWFyID0gJ1Jlc2l6ZUJpbGluZWFyJztcbmV4cG9ydCBjb25zdCBSZXNpemVCaWxpbmVhckdyYWQgPSAnUmVzaXplQmlsaW5lYXJHcmFkJztcbmV4cG9ydCBjb25zdCBSZWx1NiA9ICdSZWx1Nic7XG5leHBvcnQgY29uc3QgUmV2ZXJzZSA9ICdSZXZlcnNlJztcbmV4cG9ydCBjb25zdCBSb3VuZCA9ICdSb3VuZCc7XG5leHBvcnQgY29uc3QgUnNxcnQgPSAnUnNxcnQnO1xuZXhwb3J0IGNvbnN0IFNjYXR0ZXJOZCA9ICdTY2F0dGVyTmQnO1xuZXhwb3J0IGNvbnN0IFNlbGVjdCA9ICdTZWxlY3QnO1xuZXhwb3J0IGNvbnN0IFNlbHUgPSAnU2VsdSc7XG5leHBvcnQgY29uc3QgU2xpY2UgPSAnU2xpY2UnO1xuZXhwb3J0IGNvbnN0IFNpbiA9ICdTaW4nO1xuZXhwb3J0IGNvbnN0IFNpbmggPSAnU2luaCc7XG5leHBvcnQgY29uc3QgU2lnbiA9ICdTaWduJztcbmV4cG9ydCBjb25zdCBTaWdtb2lkID0gJ1NpZ21vaWQnO1xuZXhwb3J0IGNvbnN0IFNvZnRwbHVzID0gJ1NvZnRwbHVzJztcbmV4cG9ydCBjb25zdCBTcXJ0ID0gJ1NxcnQnO1xuZXhwb3J0IGNvbnN0IFN1bSA9ICdTdW0nO1xuZXhwb3J0IGNvbnN0IFNwYWNlVG9CYXRjaE5EID0gJ1NwYWNlVG9CYXRjaE5EJztcbmV4cG9ydCBjb25zdCBTcGxpdFYgPSAnU3BsaXRWJztcbmV4cG9ydCBjb25zdCBTb2Z0bWF4ID0gJ1NvZnRtYXgnO1xuZXhwb3J0IGNvbnN0IFNwYXJzZUZpbGxFbXB0eVJvd3MgPSAnU3BhcnNlRmlsbEVtcHR5Um93cyc7XG5leHBvcnQgY29uc3QgU3BhcnNlUmVzaGFwZSA9ICdTcGFyc2VSZXNoYXBlJztcbmV4cG9ydCBjb25zdCBTcGFyc2VTZWdtZW50TWVhbiA9ICdTcGFyc2VTZWdtZW50TWVhbic7XG5leHBvcnQgY29uc3QgU3BhcnNlU2VnbWVudFN1bSA9ICdTcGFyc2VTZWdtZW50U3VtJztcbmV4cG9ydCBjb25zdCBTcGFyc2VUb0RlbnNlID0gJ1NwYXJzZVRvRGVuc2UnO1xuZXhwb3J0IGNvbnN0IFNxdWFyZWREaWZmZXJlbmNlID0gJ1NxdWFyZWREaWZmZXJlbmNlJztcbmV4cG9ydCBjb25zdCBTcXVhcmUgPSAnU3F1YXJlJztcbmV4cG9ydCBjb25zdCBTdHJpZGVkU2xpY2UgPSAnU3RyaWRlZFNsaWNlJztcbmV4cG9ydCBjb25zdCBTdHJpbmdOR3JhbXMgPSAnU3RyaW5nTkdyYW1zJztcbmV4cG9ydCBjb25zdCBTdHJpbmdTcGxpdCA9ICdTdHJpbmdTcGxpdCc7XG5leHBvcnQgY29uc3QgU3RyaW5nVG9IYXNoQnVja2V0RmFzdCA9ICdTdHJpbmdUb0hhc2hCdWNrZXRGYXN0JztcbmV4cG9ydCBjb25zdCBTdWIgPSAnU3ViJztcbmV4cG9ydCBjb25zdCBUYW4gPSAnVGFuJztcbmV4cG9ydCBjb25zdCBUYW5oID0gJ1RhbmgnO1xuZXhwb3J0IGNvbnN0IFRpbGUgPSAnVGlsZSc7XG5leHBvcnQgY29uc3QgVG9wSyA9ICdUb3BLJztcbmV4cG9ydCBjb25zdCBUcmFuc2Zvcm0gPSAnVHJhbnNmb3JtJztcbmV4cG9ydCBjb25zdCBUcmFuc3Bvc2UgPSAnVHJhbnNwb3NlJztcbmV4cG9ydCBjb25zdCBVbmlxdWUgPSAnVW5pcXVlJztcbmV4cG9ydCBjb25zdCBVbnBhY2sgPSAnVW5wYWNrJztcbmV4cG9ydCBjb25zdCBVbnNvcnRlZFNlZ21lbnRTdW0gPSAnVW5zb3J0ZWRTZWdtZW50U3VtJztcbmV4cG9ydCBjb25zdCBaZXJvc0xpa2UgPSAnWmVyb3NMaWtlJztcbi8qKlxuICogVGVuc29yRmxvdy5qcy1vbmx5IGtlcm5lbHNcbiAqL1xuZXhwb3J0IGNvbnN0IFN0ZXAgPSAnU3RlcCc7XG5leHBvcnQgY29uc3QgRnJvbVBpeGVscyA9ICdGcm9tUGl4ZWxzJztcbmV4cG9ydCBjb25zdCBSb3RhdGVXaXRoT2Zmc2V0ID0gJ1JvdGF0ZVdpdGhPZmZzZXQnO1xuZXhwb3J0IGNvbnN0IF9GdXNlZE1hdE11bCA9ICdfRnVzZWRNYXRNdWwnO1xuZXhwb3J0IGNvbnN0IEZ1c2VkQ29udjJEID0gJ0Z1c2VkQ29udjJEJztcbmV4cG9ydCBjb25zdCBGdXNlZERlcHRod2lzZUNvbnYyRCA9ICdGdXNlZERlcHRod2lzZUNvbnYyRCc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1rZXJuZWxfbmFtZXMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBnZXRHbG9iYWwgfSBmcm9tICcuL2dsb2JhbF91dGlsJztcbmNvbnN0IGtlcm5lbFJlZ2lzdHJ5ID0gZ2V0R2xvYmFsKCdrZXJuZWxSZWdpc3RyeScsICgpID0+IG5ldyBNYXAoKSk7XG5jb25zdCBncmFkUmVnaXN0cnkgPSBnZXRHbG9iYWwoJ2dyYWRSZWdpc3RyeScsICgpID0+IG5ldyBNYXAoKSk7XG4vKipcbiAqIFJldHVybnMgdGhlIGtlcm5lbCBmdW5jdGlvbiAoY29kZSkgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBuYW1lcy5cbiAqXG4gKiBAcGFyYW0ga2VybmVsTmFtZSBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUga2VybmVsLlxuICogQHBhcmFtIGJhY2tlbmROYW1lIFRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBiYWNrZW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0S2VybmVsKGtlcm5lbE5hbWUsIGJhY2tlbmROYW1lKSB7XG4gICAgY29uc3Qga2V5ID0gbWFrZUtleShrZXJuZWxOYW1lLCBiYWNrZW5kTmFtZSk7XG4gICAgcmV0dXJuIGtlcm5lbFJlZ2lzdHJ5LmdldChrZXkpO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSByZWdpc3RlcmVkIGdyYWRpZW50IGluZm8gYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBrZXJuZWwuXG4gKiBAcGFyYW0ga2VybmVsTmFtZSBUaGUgb2ZmaWNpYWwgVEYga2VybmVsIG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRHcmFkaWVudChrZXJuZWxOYW1lKSB7XG4gICAgcmV0dXJuIGdyYWRSZWdpc3RyeS5nZXQoa2VybmVsTmFtZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0S2VybmVsc0ZvckJhY2tlbmQoYmFja2VuZE5hbWUpIHtcbiAgICBjb25zdCBpdCA9IGtlcm5lbFJlZ2lzdHJ5LmVudHJpZXMoKTtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBpdC5uZXh0KCk7XG4gICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBba2V5LCBjb25maWddID0gdmFsdWU7XG4gICAgICAgIGNvbnN0IFtiYWNrZW5kLF0gPSBrZXkuc3BsaXQoJ18nKTtcbiAgICAgICAgaWYgKGJhY2tlbmQgPT09IGJhY2tlbmROYW1lKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChjb25maWcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIFJlZ2lzdGVycyB0aGUgZnVuY3Rpb24gKGZvcndhcmQgcGFzcykgZm9yIHRoZSBrZXJuZWwgaW4gYSBnbG9iYWwgcmVnaXN0cnkuXG4gKlxuICogQHBhcmFtIGNvbmZpZyBBIGNvbmZpZyBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAtIGBrZXJuZWxOYW1lYCBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUga2VybmVsLlxuICogLSBgYmFja2VuZE5hbWVgIFRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBiYWNrZW5kLlxuICogLSBga2VybmVsRnVuY2AgVGhlIGZ1bmN0aW9uIHRvIHJ1biBkdXJpbmcgdGhlIGZvcndhcmQgcGFzcyBvZiB0aGUga2VybmVsLlxuICogLSBgc2V0dXBGdW5jYCBPcHRpb25hbC4gR2V0cyBjYWxsZWQgb25jZSwgYWZ0ZXIgdGhlIGJhY2tlbmQgaW5pdGlhbGl6ZXMuXG4gKiAtIGBkaXNwb3NlRnVuY2AgT3B0aW9uYWwuIEdldHMgY2FsbGVkIG9uY2UsIHJpZ2h0IGJlZm9yZSB0aGUgYmFja2VuZCBpc1xuICogZGlzcG9zZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3Rlcktlcm5lbChjb25maWcpIHtcbiAgICBjb25zdCB7IGtlcm5lbE5hbWUsIGJhY2tlbmROYW1lIH0gPSBjb25maWc7XG4gICAgY29uc3Qga2V5ID0gbWFrZUtleShrZXJuZWxOYW1lLCBiYWNrZW5kTmFtZSk7XG4gICAgaWYgKGtlcm5lbFJlZ2lzdHJ5LmhhcyhrZXkpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgVGhlIGtlcm5lbCAnJHtrZXJuZWxOYW1lfScgZm9yIGJhY2tlbmQgYCArXG4gICAgICAgICAgICBgJyR7YmFja2VuZE5hbWV9JyBpcyBhbHJlYWR5IHJlZ2lzdGVyZWRgKTtcbiAgICB9XG4gICAga2VybmVsUmVnaXN0cnkuc2V0KGtleSwgY29uZmlnKTtcbn1cbi8qKlxuICogUmVnaXN0ZXJzIGEgZ3JhZGllbnQgZnVuY3Rpb24gZm9yIGEgZ2l2ZW4ga2VybmVsIGluIHRoZSBnbG9iYWwgcmVnaXN0cnksXG4gKiB0byBiZSB1c2VkIGR1cmluZyB0aGUgYmFjay1wcm9wYWdhdGlvbiBvZiB0aGF0IGtlcm5lbC5cbiAqXG4gKiBAcGFyYW0gY29uZmlnIEFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqIC0gYGtlcm5lbE5hbWVgIFRoZSBuYW1lIG9mIHRoZSBrZXJuZWwgdGhhdCB0aGUgZ3JhZGllbnQgZnVuY3Rpb24gaXMgZm9yLlxuICogLSBgZ3JhZEZ1bmNgIFRoZSBmdW5jdGlvbiB0byBydW4gZHVyaW5nIGJhY2stcHJvcGFnYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckdyYWRpZW50KGNvbmZpZykge1xuICAgIGNvbnN0IHsga2VybmVsTmFtZSB9ID0gY29uZmlnO1xuICAgIGlmIChncmFkUmVnaXN0cnkuaGFzKGtlcm5lbE5hbWUpKSB7XG4gICAgICAgIC8vIFRPRE8gKHlhc3NvZ2JhKSBhZnRlciAzLjAgYXNzZXNzIHdoZXRoZXIgd2UgbmVlZCB0byBrZWVwIHRoaXMgZ2F0ZWRcbiAgICAgICAgLy8gdG8gZGVidWcgbW9kZS5cbiAgICAgICAgaWYgKGVudigpLmdldEJvb2woJ0RFQlVHJykpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgT3ZlcnJpZGluZyB0aGUgZ3JhZGllbnQgZm9yICcke2tlcm5lbE5hbWV9J2ApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdyYWRSZWdpc3RyeS5zZXQoa2VybmVsTmFtZSwgY29uZmlnKTtcbn1cbi8qKlxuICogUmVtb3ZlcyB0aGUga2VybmVsIGZ1bmN0aW9uIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICpcbiAqIEBwYXJhbSBrZXJuZWxOYW1lIFRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBrZXJuZWwuXG4gKiBAcGFyYW0gYmFja2VuZE5hbWUgVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGJhY2tlbmQuXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5yZWdpc3Rlcktlcm5lbChrZXJuZWxOYW1lLCBiYWNrZW5kTmFtZSkge1xuICAgIGNvbnN0IGtleSA9IG1ha2VLZXkoa2VybmVsTmFtZSwgYmFja2VuZE5hbWUpO1xuICAgIGlmICgha2VybmVsUmVnaXN0cnkuaGFzKGtleSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUga2VybmVsICcke2tlcm5lbE5hbWV9JyBmb3IgYmFja2VuZCBgICtcbiAgICAgICAgICAgIGAnJHtiYWNrZW5kTmFtZX0nIGlzIG5vdCByZWdpc3RlcmVkYCk7XG4gICAgfVxuICAgIGtlcm5lbFJlZ2lzdHJ5LmRlbGV0ZShrZXkpO1xufVxuLyoqIFJlbW92ZXMgdGhlIHJlZ2lzdGVyZWQgZ3JhZGllbnQgZnJvbSB0aGUgZ2xvYmFsIHJlZ2lzdHJ5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVucmVnaXN0ZXJHcmFkaWVudChrZXJuZWxOYW1lKSB7XG4gICAgaWYgKCFncmFkUmVnaXN0cnkuaGFzKGtlcm5lbE5hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGdyYWRpZW50ICcke2tlcm5lbE5hbWV9JyBmb3IgYmFja2VuZCBpcyBub3QgcmVnaXN0ZXJlZGApO1xuICAgIH1cbiAgICBncmFkUmVnaXN0cnkuZGVsZXRlKGtlcm5lbE5hbWUpO1xufVxuLyoqXG4gKiBGaW5kcyBrZXJuZWxzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCB0byBhIGJhY2tlbmQgYW5kIHJlLXJlZ2lzdGVyc1xuICogdGhlbSBmb3IgYSBuZXcgYmFja2VuZC4gVXNlZnVsIGZvciByZWdpc3RlcmluZyBjdXN0b20gYmFja2VuZHMuXG4gKiBAcGFyYW0gcmVnaXN0ZXJlZEJhY2tlbmROYW1lIEFscmVhZHkgcmVnaXN0ZXJlZCBiYWNrZW5kLlxuICogQHBhcmFtIG5ld0JhY2tlbmROYW1lIE5ldyBiYWNrZW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29weVJlZ2lzdGVyZWRLZXJuZWxzKHJlZ2lzdGVyZWRCYWNrZW5kTmFtZSwgbmV3QmFja2VuZE5hbWUpIHtcbiAgICBjb25zdCBrZXJuZWxzID0gZ2V0S2VybmVsc0ZvckJhY2tlbmQocmVnaXN0ZXJlZEJhY2tlbmROYW1lKTtcbiAgICBrZXJuZWxzLmZvckVhY2goa2VybmVsQ29uZmlnID0+IHtcbiAgICAgICAgY29uc3QgbmV3S2VybmVsQ29uZmlnID0gT2JqZWN0LmFzc2lnbih7fSwga2VybmVsQ29uZmlnLCB7IGJhY2tlbmROYW1lOiBuZXdCYWNrZW5kTmFtZSB9KTtcbiAgICAgICAgcmVnaXN0ZXJLZXJuZWwobmV3S2VybmVsQ29uZmlnKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIG1ha2VLZXkoa2VybmVsTmFtZSwgYmFja2VuZE5hbWUpIHtcbiAgICByZXR1cm4gYCR7YmFja2VuZE5hbWV9XyR7a2VybmVsTmFtZX1gO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9a2VybmVsX3JlZ2lzdHJ5LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGVudiB9IGZyb20gJy4vZW52aXJvbm1lbnQnO1xuZXhwb3J0IGZ1bmN0aW9uIHdhcm4oLi4ubXNnKSB7XG4gICAgaWYgKCFlbnYoKS5nZXRCb29sKCdJU19URVNUJykpIHtcbiAgICAgICAgY29uc29sZS53YXJuKC4uLm1zZyk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGxvZyguLi5tc2cpIHtcbiAgICBpZiAoIWVudigpLmdldEJvb2woJ0lTX1RFU1QnKSkge1xuICAgICAgICBjb25zb2xlLmxvZyguLi5tc2cpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxvZy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vKipcbiAqIEV4cG9ydHMgdW5kZXIgdGhlIHRmLm1hdGguKiBuYW1lc3BhY2UuXG4gKi9cbmltcG9ydCB7IGNvbmZ1c2lvbk1hdHJpeCB9IGZyb20gJy4vb3BzL2NvbmZ1c2lvbl9tYXRyaXgnO1xuZXhwb3J0IHsgY29uZnVzaW9uTWF0cml4IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tYXRoLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBBYnMsIENvbXBsZXhBYnMgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBhYnNvbHV0ZSB2YWx1ZSBlbGVtZW50LXdpc2U6IGBhYnMoeClgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbLTEsIDIsIC0zLCA0XSk7XG4gKlxuICogeC5hYnMoKS5wcmludCgpOyAgLy8gb3IgdGYuYWJzKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBgdGYuVGVuc29yYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gYWJzXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnYWJzJyk7XG4gICAgaWYgKCR4LmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKENvbXBsZXhBYnMsIGlucHV0cyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEFicywgaW5wdXRzKTtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgYWJzID0gb3AoeyBhYnNfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWJzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBBY29zIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgYWNvcyBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOiBgYWNvcyh4KWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFswLCAxLCAtMSwgLjddKTtcbiAqXG4gKiB4LmFjb3MoKS5wcmludCgpOyAgLy8gb3IgdGYuYWNvcyh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGFjb3NfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdhY29zJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEFjb3MsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgYWNvcyA9IG9wKHsgYWNvc18gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hY29zLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBBY29zaCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBpbnZlcnNlIGh5cGVyYm9saWMgY29zIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6XG4gKiBgYWNvc2goeClgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMTAsIDEsIDMsIDUuN10pO1xuICpcbiAqIHguYWNvc2goKS5wcmludCgpOyAgLy8gb3IgdGYuYWNvc2goeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gYWNvc2hfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdhY29zaCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChBY29zaCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBhY29zaCA9IG9wKHsgYWNvc2hfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWNvc2guanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEFkZCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBtYWtlVHlwZXNNYXRjaCB9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQWRkcyB0d28gYHRmLlRlbnNvcmBzIGVsZW1lbnQtd2lzZSwgQSArIEIuIFN1cHBvcnRzIGJyb2FkY2FzdGluZy5cbiAqXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMiwgMywgNF0pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFsxMCwgMjAsIDMwLCA0MF0pO1xuICpcbiAqIGEuYWRkKGIpLnByaW50KCk7ICAvLyBvciB0Zi5hZGQoYSwgYilcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBCcm9hZGNhc3QgYWRkIGEgd2l0aCBiLlxuICogY29uc3QgYSA9IHRmLnNjYWxhcig1KTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbMTAsIDIwLCAzMCwgNDBdKTtcbiAqXG4gKiBhLmFkZChiKS5wcmludCgpOyAgLy8gb3IgdGYuYWRkKGEsIGIpXG4gKiBgYGBcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBgdGYuVGVuc29yYCB0byBhZGQuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIGB0Zi5UZW5zb3JgIHRvIGFkZC4gTXVzdCBoYXZlIHRoZSBzYW1lIHR5cGUgYXMgYGFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0FyaXRobWV0aWMnfVxuICovXG5mdW5jdGlvbiBhZGRfKGEsIGIpIHtcbiAgICBsZXQgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnYWRkJyk7XG4gICAgbGV0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ2FkZCcpO1xuICAgIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGE6ICRhLCBiOiAkYiB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEFkZCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBhZGQgPSBvcCh7IGFkZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hZGQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEFkZE4gfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQWRkcyBhIGxpc3Qgb2YgYHRmLlRlbnNvcmBzIGVsZW1lbnQtd2lzZSwgZWFjaCB3aXRoIHRoZSBzYW1lIHNoYXBlIGFuZCBkdHlwZS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCAyXSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzMsIDRdKTtcbiAqIGNvbnN0IGMgPSB0Zi50ZW5zb3IxZChbNSwgNl0pO1xuICpcbiAqIHRmLmFkZE4oW2EsIGIsIGNdKS5wcmludCgpO1xuICogYGBgXG4gKiBAcGFyYW0gdGVuc29ycyBBIGxpc3Qgb2YgdGVuc29ycyB3aXRoIHRoZSBzYW1lIHNoYXBlIGFuZCBkdHlwZS5cbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0FyaXRobWV0aWMnfVxuICovXG5mdW5jdGlvbiBhZGROXyh0ZW5zb3JzKSB7XG4gICAgdXRpbC5hc3NlcnQoQXJyYXkuaXNBcnJheSh0ZW5zb3JzKSwgKCkgPT4gJ1RoZSBhcmd1bWVudCBwYXNzZWQgdG8gdGYuYWRkTigpIG11c3QgYmUgYSBsaXN0IG9mIHRlbnNvcnMnKTtcbiAgICB1dGlsLmFzc2VydCh0ZW5zb3JzLmxlbmd0aCA+PSAxLCAoKSA9PiBgTXVzdCBwYXNzIGF0IGxlYXN0IG9uZSB0ZW5zb3IgdG8gdGYuYWRkTigpLCBidXQgZ290IGAgK1xuICAgICAgICBgJHt0ZW5zb3JzLmxlbmd0aH1gKTtcbiAgICBjb25zdCAkdGVuc29ycyA9IHRlbnNvcnMubWFwKCh0LCBpKSA9PiBjb252ZXJ0VG9UZW5zb3IodCwgYHRlbnNvcnMke2l9YCwgJ2FkZE4nKSk7XG4gICAgY29uc3QgZmlyc3RUZW5zb3IgPSAkdGVuc29yc1swXTtcbiAgICAkdGVuc29ycy5mb3JFYWNoKHQgPT4ge1xuICAgICAgICBpZiAodC5kdHlwZSAhPT0gZmlyc3RUZW5zb3IuZHR5cGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQWxsIHRlbnNvcnMgcGFzc2VkIHRvIHRmLmFkZE4oKSBtdXN0IGhhdmUgdGhlIHNhbWUgZHR5cGUnKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgICR0ZW5zb3JzLmZvckVhY2godCA9PiB7XG4gICAgICAgIGlmICghdXRpbC5hcnJheXNFcXVhbCh0LnNoYXBlLCBmaXJzdFRlbnNvci5zaGFwZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQWxsIHRlbnNvcnMgcGFzc2VkIHRvIHRmLmFkZE4oKSBtdXN0IGhhdmUgdGhlIHNhbWUgc2hhcGUnKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGlucHV0cyA9ICR0ZW5zb3JzO1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEFkZE4sIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgYWRkTiA9IG9wKHsgYWRkTl8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hZGRfbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgQWxsIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIGxvZ2ljYWwgYW5kIG9mIGVsZW1lbnRzIGFjcm9zcyBkaW1lbnNpb25zIG9mIGEgYHRmLlRlbnNvcmAuXG4gKlxuICogUmVkdWNlcyB0aGUgaW5wdXQgYWxvbmcgdGhlIGRpbWVuc2lvbnMgZ2l2ZW4gaW4gYGF4ZXNgLiBVbmxlc3MgYGtlZXBEaW1zYFxuICogaXMgdHJ1ZSwgdGhlIHJhbmsgb2YgdGhlIGB0Zi5UZW5zb3JgIGlzIHJlZHVjZWQgYnkgMSBmb3IgZWFjaCBlbnRyeSBpblxuICogYGF4ZXNgLiBJZiBga2VlcERpbXNgIGlzIHRydWUsIHRoZSByZWR1Y2VkIGRpbWVuc2lvbnMgYXJlIHJldGFpbmVkIHdpdGhcbiAqIGxlbmd0aCAxLiBJZiBgYXhlc2AgaGFzIG5vIGVudHJpZXMsIGFsbCBkaW1lbnNpb25zIGFyZSByZWR1Y2VkLCBhbmQgYW5cbiAqIGB0Zi5UZW5zb3JgIHdpdGggYSBzaW5nbGUgZWxlbWVudCBpcyByZXR1cm5lZC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAxLCAxXSwgJ2Jvb2wnKTtcbiAqXG4gKiB4LmFsbCgpLnByaW50KCk7ICAvLyBvciB0Zi5hbGwoeClcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDEsIDAsIDBdLCBbMiwgMl0sICdib29sJyk7XG4gKlxuICogY29uc3QgYXhpcyA9IDE7XG4gKiB4LmFsbChheGlzKS5wcmludCgpOyAgLy8gb3IgdGYuYWxsKHgsIGF4aXMpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLiBNdXN0IGJlIG9mIGR0eXBlIGJvb2wuXG4gKiBAcGFyYW0gYXhpcyBUaGUgZGltZW5zaW9uKHMpIHRvIHJlZHVjZS4gQnkgZGVmYXVsdCBpdCByZWR1Y2VzXG4gKiAgICAgYWxsIGRpbWVuc2lvbnMuXG4gKiBAcGFyYW0ga2VlcERpbXMgSWYgdHJ1ZSwgcmV0YWlucyByZWR1Y2VkIGRpbWVuc2lvbnMgd2l0aCBzaXplIDEuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnUmVkdWN0aW9uJ31cbiAqL1xuZnVuY3Rpb24gYWxsXyh4LCBheGlzID0gbnVsbCwga2VlcERpbXMgPSBmYWxzZSkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2FsbCcsICdib29sJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBheGlzLCBrZWVwRGltcyB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEFsbCwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgYWxsID0gb3AoeyBhbGxfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWxsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBBbnkgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgbG9naWNhbCBvciBvZiBlbGVtZW50cyBhY3Jvc3MgZGltZW5zaW9ucyBvZiBhIGB0Zi5UZW5zb3JgLlxuICpcbiAqIFJlZHVjZXMgdGhlIGlucHV0IGFsb25nIHRoZSBkaW1lbnNpb25zIGdpdmVuIGluIGBheGVzYC4gVW5sZXNzIGBrZWVwRGltc2BcbiAqIGlzIHRydWUsIHRoZSByYW5rIG9mIHRoZSBgdGYuVGVuc29yYCBpcyByZWR1Y2VkIGJ5IDEgZm9yIGVhY2ggZW50cnkgaW5cbiAqIGBheGVzYC4gSWYgYGtlZXBEaW1zYCBpcyB0cnVlLCB0aGUgcmVkdWNlZCBkaW1lbnNpb25zIGFyZSByZXRhaW5lZCB3aXRoXG4gKiBsZW5ndGggMS4gSWYgYGF4ZXNgIGhhcyBubyBlbnRyaWVzLCBhbGwgZGltZW5zaW9ucyBhcmUgcmVkdWNlZCwgYW5kIGFuXG4gKiBgdGYuVGVuc29yYCB3aXRoIGEgc2luZ2xlIGVsZW1lbnQgaXMgcmV0dXJuZWQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMSwgMV0sICdib29sJyk7XG4gKlxuICogeC5hbnkoKS5wcmludCgpOyAgLy8gb3IgdGYuYW55KHgpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjJkKFsxLCAxLCAwLCAwXSwgWzIsIDJdLCAnYm9vbCcpO1xuICpcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5hbnkoYXhpcykucHJpbnQoKTsgIC8vIG9yIHRmLmFueSh4LCBheGlzKVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci4gTXVzdCBiZSBvZiBkdHlwZSBib29sLlxuICogQHBhcmFtIGF4aXMgVGhlIGRpbWVuc2lvbihzKSB0byByZWR1Y2UuIEJ5IGRlZmF1bHQgaXQgcmVkdWNlc1xuICogICAgIGFsbCBkaW1lbnNpb25zLlxuICogQHBhcmFtIGtlZXBEaW1zIElmIHRydWUsIHJldGFpbnMgcmVkdWNlZCBkaW1lbnNpb25zIHdpdGggc2l6ZSAxLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1JlZHVjdGlvbid9XG4gKi9cbmZ1bmN0aW9uIGFueV8oeCwgYXhpcyA9IG51bGwsIGtlZXBEaW1zID0gZmFsc2UpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdhbnknLCAnYm9vbCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICBjb25zdCBhdHRycyA9IHsgYXhpcywga2VlcERpbXMgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChBbnksIGlucHV0cywgYXR0cnMpO1xufVxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWVcbmV4cG9ydCBjb25zdCBhbnkgPSBvcCh7IGFueV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hbnkuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEFyZ01heCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIFJldHVybnMgdGhlIGluZGljZXMgb2YgdGhlIG1heGltdW0gdmFsdWVzIGFsb25nIGFuIGBheGlzYC5cbiAqXG4gKiBUaGUgcmVzdWx0IGhhcyB0aGUgc2FtZSBzaGFwZSBhcyBgaW5wdXRgIHdpdGggdGhlIGRpbWVuc2lvbiBhbG9uZyBgYXhpc2BcbiAqIHJlbW92ZWQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICpcbiAqIHguYXJnTWF4KCkucHJpbnQoKTsgIC8vIG9yIHRmLmFyZ01heCh4KVxuICogYGBgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IyZChbMSwgMiwgNCwgM10sIFsyLCAyXSk7XG4gKlxuICogY29uc3QgYXhpcyA9IDE7XG4gKiB4LmFyZ01heChheGlzKS5wcmludCgpOyAgLy8gb3IgdGYuYXJnTWF4KHgsIGF4aXMpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICogQHBhcmFtIGF4aXMgVGhlIGRpbWVuc2lvbiB0byByZWR1Y2UuIERlZmF1bHRzIHRvIDAgKG91dGVyLW1vc3QgZGltZW5zaW9uKS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdSZWR1Y3Rpb24nfVxuICovXG5mdW5jdGlvbiBhcmdNYXhfKHgsIGF4aXMgPSAwKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnYXJnTWF4Jyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBheGlzIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoQXJnTWF4LCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBhcmdNYXggPSBvcCh7IGFyZ01heF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hcmdfbWF4LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBBcmdNaW4gfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbmRpY2VzIG9mIHRoZSBtaW5pbXVtIHZhbHVlcyBhbG9uZyBhbiBgYXhpc2AuXG4gKlxuICogVGhlIHJlc3VsdCBoYXMgdGhlIHNhbWUgc2hhcGUgYXMgYGlucHV0YCB3aXRoIHRoZSBkaW1lbnNpb24gYWxvbmcgYGF4aXNgXG4gKiByZW1vdmVkLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqXG4gKiB4LmFyZ01pbigpLnByaW50KCk7ICAvLyBvciB0Zi5hcmdNaW4oeClcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDQsIDNdLCBbMiwgMl0pO1xuICpcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5hcmdNaW4oYXhpcykucHJpbnQoKTsgIC8vIG9yIHRmLmFyZ01pbih4LCBheGlzKVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBheGlzIFRoZSBkaW1lbnNpb24gdG8gcmVkdWNlLiBEZWZhdWx0cyB0byAwIChvdXRlci1tb3N0IGRpbWVuc2lvbikuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnUmVkdWN0aW9uJ31cbiAqL1xuZnVuY3Rpb24gYXJnTWluXyh4LCBheGlzID0gMCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2FyZ01pbicpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICBjb25zdCBhdHRycyA9IHsgYXhpcyB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEFyZ01pbiwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgYXJnTWluID0gb3AoeyBhcmdNaW5fIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXJnX21pbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vKipcbiAqIEdldHMgdGhlIG5ldyBzaGFwZSBvZiB0aGUgaW5wdXQgVGVuc29yIGFmdGVyIGl0J3MgYmVlbiByZXNoYXBlZFxuICogdG86XG4gKiBbYmxvY2tTaGFwZVswXSwgLi4uLCBibG9ja1NoYXBlW00tMV0sIGJhdGNoIC8gcHJvZChibG9ja1NoYXBlKSxcbiAqIGlucHV0U2hhcGVbMV0sIC4uLiwgaW5wdXRTaGFwZVtOLTFdXVxuICpcbiAqIFNlZSBzdGVwIDE6IGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9iYXRjaF90b19zcGFjZV9uZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVzaGFwZWQoaW5wdXRTaGFwZSwgYmxvY2tTaGFwZSwgcHJvZCwgYmF0Y2hUb1NwYWNlID0gdHJ1ZSkge1xuICAgIGxldCByZXNoYXBlZCA9IFtdO1xuICAgIGlmIChiYXRjaFRvU3BhY2UpIHtcbiAgICAgICAgcmVzaGFwZWQgPSByZXNoYXBlZC5jb25jYXQoYmxvY2tTaGFwZS5zbGljZSgwKSk7XG4gICAgICAgIHJlc2hhcGVkLnB1c2goaW5wdXRTaGFwZVswXSAvIHByb2QpO1xuICAgICAgICByZXNoYXBlZCA9IHJlc2hhcGVkLmNvbmNhdChpbnB1dFNoYXBlLnNsaWNlKDEpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlc2hhcGVkID0gcmVzaGFwZWQuY29uY2F0KGlucHV0U2hhcGVbMF0pO1xuICAgICAgICBjb25zdCBzcGF0aWFsTGVuZ3RoID0gYmxvY2tTaGFwZS5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BhdGlhbExlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICByZXNoYXBlZCA9XG4gICAgICAgICAgICAgICAgcmVzaGFwZWQuY29uY2F0KFtpbnB1dFNoYXBlW2kgKyAxXSAvIGJsb2NrU2hhcGVbaV0sIGJsb2NrU2hhcGVbaV1dKTtcbiAgICAgICAgfVxuICAgICAgICByZXNoYXBlZCA9IHJlc2hhcGVkLmNvbmNhdChpbnB1dFNoYXBlLnNsaWNlKHNwYXRpYWxMZW5ndGggKyAxKSk7XG4gICAgfVxuICAgIHJldHVybiByZXNoYXBlZDtcbn1cbi8qKlxuICogR2V0cyB0aGUgcGVybXV0YXRpb24gdGhhdCB3aWxsIHRyYW5zcG9zZSB0aGUgZGltZW5zaW9ucyBvZiB0aGVcbiAqIHJlc2hhcGVkIHRlbnNvciB0byBzaGFwZTpcbiAqXG4gKiBbYmF0Y2ggLyBwcm9kKGJsb2NrX3NoYXBlKSxpbnB1dFNoYXBlWzFdLCBibG9ja1NoYXBlWzBdLCAuLi4sXG4gKiBpbnB1dFNoYXBlW01dLCBibG9ja1NoYXBlW00tMV0saW5wdXRTaGFwZVtNKzFdLCAuLi4sIGlucHV0U2hhcGVbTi0xXV1cbiAqXG4gKiBzZWUgc3RlcCAyOiBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvYmF0Y2hfdG9fc3BhY2VfbmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBlcm11dGVkKHJlc2hhcGVkUmFuaywgYmxvY2tTaGFwZVJhbmssIGJhdGNoVG9TcGFjZSA9IHRydWUpIHtcbiAgICBjb25zdCBwZXJtdXRlZCA9IFtdO1xuICAgIGlmIChiYXRjaFRvU3BhY2UpIHtcbiAgICAgICAgcGVybXV0ZWQucHVzaChibG9ja1NoYXBlUmFuayk7XG4gICAgICAgIGZvciAobGV0IGkgPSBibG9ja1NoYXBlUmFuayArIDE7IGkgPCByZXNoYXBlZFJhbms7ICsraSkge1xuICAgICAgICAgICAgaWYgKGkgPD0gMiAqIGJsb2NrU2hhcGVSYW5rKSB7XG4gICAgICAgICAgICAgICAgcGVybXV0ZWQucHVzaChpKTtcbiAgICAgICAgICAgICAgICBwZXJtdXRlZC5wdXNoKGkgLSAoYmxvY2tTaGFwZVJhbmsgKyAxKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZXJtdXRlZC5wdXNoKGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBwZXJtdXRlZEJlZm9yZUJhdGNoID0gW107XG4gICAgICAgIGNvbnN0IHBlcm11dGVkQWZ0ZXJCYXRjaCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHJlc2hhcGVkUmFuazsgKytpKSB7XG4gICAgICAgICAgICBpZiAoaSA+PSBibG9ja1NoYXBlUmFuayAqIDIgKyAxIHx8IGkgJSAyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcGVybXV0ZWRBZnRlckJhdGNoLnB1c2goaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZXJtdXRlZEJlZm9yZUJhdGNoLnB1c2goaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcGVybXV0ZWQucHVzaCguLi5wZXJtdXRlZEJlZm9yZUJhdGNoKTtcbiAgICAgICAgcGVybXV0ZWQucHVzaCgwKTtcbiAgICAgICAgcGVybXV0ZWQucHVzaCguLi5wZXJtdXRlZEFmdGVyQmF0Y2gpO1xuICAgIH1cbiAgICByZXR1cm4gcGVybXV0ZWQ7XG59XG4vKipcbiAqIEdldHMgdGhlIHNoYXBlIG9mIHRoZSByZXNoYXBlZCBhbmQgcGVybXV0ZWQgaW5wdXQgVGVuc29yIGJlZm9yZSBhbnkgY3JvcHBpbmdcbiAqIGlzIGFwcGxpZWQuICBUaGUgbmV3IHNoYXBlIHdpbGwgYmU6XG4gKlxuICogW2JhdGNoIC8gcHJvZChibG9ja1NoYXBlKSxpbnB1dFNoYXBlWzFdICogYmxvY2tTaGFwZVswXSwgLi4uLFxuICogaW5wdXRTaGFwZVtNXSAqIGJsb2NrU2hhcGVbTS0xXSxpbnB1dFNoYXBlW00rMV0sIC4uLiwgaW5wdXRTaGFwZVtOLTFdXVxuICpcbiAqIFNlZSBzdGVwIDM6IGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9iYXRjaF90b19zcGFjZV9uZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVzaGFwZWRQZXJtdXRlZChpbnB1dFNoYXBlLCBibG9ja1NoYXBlLCBwcm9kLCBiYXRjaFRvU3BhY2UgPSB0cnVlKSB7XG4gICAgY29uc3QgcmVzaGFwZWRQZXJtdXRlZCA9IFtdO1xuICAgIGlmIChiYXRjaFRvU3BhY2UpIHtcbiAgICAgICAgcmVzaGFwZWRQZXJtdXRlZC5wdXNoKGlucHV0U2hhcGVbMF0gLyBwcm9kKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlc2hhcGVkUGVybXV0ZWQucHVzaChpbnB1dFNoYXBlWzBdICogcHJvZCk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgaW5wdXRTaGFwZS5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAoaSA8PSBibG9ja1NoYXBlLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGJhdGNoVG9TcGFjZSkge1xuICAgICAgICAgICAgICAgIHJlc2hhcGVkUGVybXV0ZWQucHVzaChibG9ja1NoYXBlW2kgLSAxXSAqIGlucHV0U2hhcGVbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzaGFwZWRQZXJtdXRlZC5wdXNoKGlucHV0U2hhcGVbaV0gLyBibG9ja1NoYXBlW2kgLSAxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXNoYXBlZFBlcm11dGVkLnB1c2goaW5wdXRTaGFwZVtpXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc2hhcGVkUGVybXV0ZWQ7XG59XG4vKipcbiAqIENvbnZlcnRzIHRoZSBjcm9wcyBhcmd1bWVudCBpbnRvIHRoZSBiZWdpbm5pbmcgY29vcmRpbmF0ZXMgb2YgYSBzbGljZVxuICogb3BlcmF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2xpY2VCZWdpbkNvb3Jkcyhjcm9wcywgYmxvY2tTaGFwZSkge1xuICAgIGNvbnN0IHNsaWNlQmVnaW5Db29yZHMgPSBbMF07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBibG9ja1NoYXBlOyArK2kpIHtcbiAgICAgICAgc2xpY2VCZWdpbkNvb3Jkcy5wdXNoKGNyb3BzW2ldWzBdKTtcbiAgICB9XG4gICAgcmV0dXJuIHNsaWNlQmVnaW5Db29yZHM7XG59XG4vKipcbiAqIENvbnZlcnRzIHRoZSBjcm9wcyBhcmd1bWVudCBpbnRvIHRoZSBzaXplIG9mIGEgc2xpY2Ugb3BlcmF0aW9uLiAgV2hlblxuICogY29tYmluZWQgd2l0aCBnZXRTbGljZUJlZ2luQ29vcmRzIHRoaXMgZnVuY3Rpb24gYWxsb3dzIHRoZSByZXNoYXBlZCBhbmRcbiAqIHBlcm11dGVkIFRlbnNvciB0byBiZSBjcm9wcGVkIHRvIGl0cyBmaW5hbCBvdXRwdXQgc2hhcGUgb2Y6XG4gKlxuICogaW5wdXRTaGFwZVsxXSAqIGJsb2NrU2hhcGVbMF0gLSBjcm9wc1swLDBdIC0gY3JvcHNbMCwxXSwgLi4uLFxuICogaW5wdXRTaGFwZVtNXSAqIGJsb2NrU2hhcGVbTS0xXSAtY3JvcHNbTS0xLDBdIC1cbiAqIGNyb3BzW00tMSwxXSxpbnB1dFNoYXBlW00rMV0sIC4uLiwgaW5wdXRTaGFwZVtOLTFdXVxuICpcbiAqIFNlZSBzdGVwIDQ6IGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9iYXRjaF90b19zcGFjZV9uZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2xpY2VTaXplKHVuY3JvcHBlZFNoYXBlLCBjcm9wcywgYmxvY2tTaGFwZSkge1xuICAgIGNvbnN0IHNsaWNlU2l6ZSA9IHVuY3JvcHBlZFNoYXBlLnNsaWNlKDAsIDEpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmxvY2tTaGFwZTsgKytpKSB7XG4gICAgICAgIHNsaWNlU2l6ZS5wdXNoKHVuY3JvcHBlZFNoYXBlW2kgKyAxXSAtIGNyb3BzW2ldWzBdIC0gY3JvcHNbaV1bMV0pO1xuICAgIH1cbiAgICByZXR1cm4gc2xpY2VTaXplO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXJyYXlfb3BzX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEFzaW4gfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBhc2luIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6IGBhc2luKHgpYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzAsIDEsIC0xLCAuN10pO1xuICpcbiAqIHguYXNpbigpLnByaW50KCk7ICAvLyBvciB0Zi5hc2luKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gYXNpbl8oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2FzaW4nKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoQXNpbiwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBhc2luID0gb3AoeyBhc2luXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFzaW4uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEFzaW5oIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgaW52ZXJzZSBoeXBlcmJvbGljIHNpbiBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOlxuICogYGFzaW5oKHgpYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzAsIDEsIC0xLCAuN10pO1xuICpcbiAqIHguYXNpbmgoKS5wcmludCgpOyAgLy8gb3IgdGYuYXNpbmgoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gYXNpbmhfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdhc2luaCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChBc2luaCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBhc2luaCA9IG9wKHsgYXNpbmhfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXNpbmguanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEF0YW4gfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBhdGFuIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6IGBhdGFuKHgpYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzAsIDEsIC0xLCAuN10pO1xuICpcbiAqIHguYXRhbigpLnByaW50KCk7ICAvLyBvciB0Zi5hdGFuKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGF0YW5fKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdhdGFuJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEF0YW4sIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgYXRhbiA9IG9wKHsgYXRhbl8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hdGFuLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBBdGFuMiB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBtYWtlVHlwZXNNYXRjaCB9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgYXJjdGFuZ2VudCBvZiBgdGYuVGVuc29yYHMgYSAvIGIgZWxlbWVudC13aXNlOiBgYXRhbjIoYSwgYilgLlxuICogU3VwcG9ydHMgYnJvYWRjYXN0aW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEuMCwgMS4wLCAtMS4wLCAuN10pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFsyLjAsIDEzLjAsIDMuNSwgLjIxXSk7XG4gKlxuICogdGYuYXRhbjIoYSwgYikucHJpbnQoKVxuICogYGBgXG4gKlxuICogQHBhcmFtIGEgVGhlIGZpcnN0IHRlbnNvci5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgdGVuc29yLiBNdXN0IGhhdmUgdGhlIHNhbWUgZHR5cGUgYXMgYGFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBhdGFuMl8oYSwgYikge1xuICAgIGxldCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdhdGFuMicpO1xuICAgIGxldCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdhdGFuMicpO1xuICAgIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGE6ICRhLCBiOiAkYiB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEF0YW4yLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGF0YW4yID0gb3AoeyBhdGFuMl8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hdGFuMi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgQXRhbmggfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBpbnZlcnNlIGh5cGVyYm9saWMgdGFuIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6XG4gKiBgYXRhbmgoeClgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMCwgLjEsIC0uMSwgLjddKTtcbiAqXG4gKiB4LmF0YW5oKCkucHJpbnQoKTsgIC8vIG9yIHRmLmF0YW5oKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGF0YW5oXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnYXRhbmgnKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoQXRhbmgsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgYXRhbmggPSBvcCh7IGF0YW5oXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWF0YW5oLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBBdmdQb29sIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgY2FzdCB9IGZyb20gJy4vY2FzdCc7XG5pbXBvcnQgKiBhcyBjb252X3V0aWwgZnJvbSAnLi9jb252X3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIDJEIGF2ZXJhZ2UgcG9vbGluZyBvZiBhbiBpbWFnZS5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDQgb3IgcmFuayAzIG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgaW5DaGFubmVsc11gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXJTaXplIFRoZSBmaWx0ZXIgc2l6ZTogYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoXWAuIElmXG4gKiAgICAgYGZpbHRlclNpemVgIGlzIGEgc2luZ2xlIG51bWJlciwgdGhlbiBgZmlsdGVySGVpZ2h0ID09IGZpbHRlcldpZHRoYC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBwb29saW5nOiBgW3N0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGhdYC4gSWZcbiAqICAgICBgc3RyaWRlc2AgaXMgYSBzaW5nbGUgbnVtYmVyLCB0aGVuIGBzdHJpZGVIZWlnaHQgPT0gc3RyaWRlV2lkdGhgLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobTpcbiAqICAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAgLSBGb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uXShcbiAqICAgICAgICAgaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uKVxuICogQHBhcmFtIGRpbVJvdW5kaW5nTW9kZSBBIHN0cmluZyBmcm9tOiAnY2VpbCcsICdyb3VuZCcsICdmbG9vcicuIElmIG5vbmUgaXNcbiAqICAgICBwcm92aWRlZCwgaXQgd2lsbCBkZWZhdWx0IHRvIHRydW5jYXRlLlxuICovXG5mdW5jdGlvbiBhdmdQb29sXyh4LCBmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2F2Z1Bvb2wnLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IGRpbGF0aW9ucyA9IDE7XG4gICAgdXRpbC5hc3NlcnQoY29udl91dGlsLmVpdGhlclN0cmlkZXNPckRpbGF0aW9uc0FyZU9uZShzdHJpZGVzLCBkaWxhdGlvbnMpLCAoKSA9PiAnRXJyb3IgaW4gYXZnUG9vbDogRWl0aGVyIHN0cmlkZXMgb3IgZGlsYXRpb25zIG11c3QgYmUgMS4gJyArXG4gICAgICAgIGBHb3Qgc3RyaWRlcyAke3N0cmlkZXN9IGFuZCBkaWxhdGlvbnMgJyR7ZGlsYXRpb25zfSdgKTtcbiAgICBsZXQgeDREID0gJHg7XG4gICAgbGV0IHJlc2hhcGVkVG80RCA9IGZhbHNlO1xuICAgIGlmICgkeC5yYW5rID09PSAzKSB7XG4gICAgICAgIHJlc2hhcGVkVG80RCA9IHRydWU7XG4gICAgICAgIHg0RCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV0sICR4LnNoYXBlWzJdXSk7XG4gICAgfVxuICAgIHV0aWwuYXNzZXJ0KHg0RC5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gYXZnUG9vbDogeCBtdXN0IGJlIHJhbmsgNCBidXQgZ290IHJhbmsgJHt4NEQucmFua30uYCk7XG4gICAgaWYgKGRpbVJvdW5kaW5nTW9kZSAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNJbnQocGFkKSwgKCkgPT4gYEVycm9yIGluIGF2Z1Bvb2w6IHBhZCBtdXN0IGJlIGFuIGludGVnZXIgd2hlbiB1c2luZywgYCArXG4gICAgICAgICAgICBgZGltUm91bmRpbmdNb2RlICR7ZGltUm91bmRpbmdNb2RlfSBidXQgZ290IHBhZCAke3BhZH0uYCk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogeDREIH07XG4gICAgY29uc3QgYXR0cnMgPSB7IGZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlIH07XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgIGxldCByZXMgPSBFTkdJTkUucnVuS2VybmVsKEF2Z1Bvb2wsIGlucHV0cywgYXR0cnMpO1xuICAgIHJlcyA9IGNhc3QocmVzLCAkeC5kdHlwZSk7XG4gICAgaWYgKHJlc2hhcGVkVG80RCkge1xuICAgICAgICByZXR1cm4gcmVzaGFwZShyZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdXSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5leHBvcnQgY29uc3QgYXZnUG9vbCA9IG9wKHsgYXZnUG9vbF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hdmdfcG9vbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgQXZnUG9vbDNEIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgY2FzdCB9IGZyb20gJy4vY2FzdCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL3Jlc2hhcGUnO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgM0QgYXZlcmFnZSBwb29saW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yNWQoWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDhdLCBbMSwgMiwgMiwgMiwgMV0pO1xuICogY29uc3QgcmVzdWx0ID0gdGYuYXZnUG9vbDNkKHgsIDIsIDEsICd2YWxpZCcpO1xuICogcmVzdWx0LnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDUgb3IgcmFuayA0IG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgZGVwdGgsIGhlaWdodCwgd2lkdGgsIGluQ2hhbm5lbHNdYC5cbiAqIEBwYXJhbSBmaWx0ZXJTaXplIFRoZSBmaWx0ZXIgc2l6ZTpcbiAqICAgICBgW2ZpbHRlckRlcHRoLCBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoXWAuXG4gKiAgICAgSWYgYGZpbHRlclNpemVgIGlzIGEgc2luZ2xlIG51bWJlcixcbiAqICAgICB0aGVuIGBmaWx0ZXJEZXB0aCA9PSBmaWx0ZXJIZWlnaHQgPT0gZmlsdGVyV2lkdGhgLlxuICogQHBhcmFtIHN0cmlkZXMgVGhlIHN0cmlkZXMgb2YgdGhlIHBvb2xpbmc6XG4gKiAgICAgYFtzdHJpZGVEZXB0aCwgc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aF1gLlxuICogICAgIElmIGBzdHJpZGVzYCBpcyBhIHNpbmdsZSBudW1iZXIsXG4gKiAgICAgdGhlbiBgc3RyaWRlRGVwdGggPT0gc3RyaWRlSGVpZ2h0ID09IHN0cmlkZVdpZHRoYC5cbiAqIEBwYXJhbSBwYWQgVGhlIHR5cGUgb2YgcGFkZGluZyBhbGdvcml0aG0uXG4gKiAgICAtIGBzYW1lYCBhbmQgc3RyaWRlIDE6IG91dHB1dCB3aWxsIGJlIG9mIHNhbWUgc2l6ZSBhcyBpbnB1dCxcbiAqICAgICAgIHJlZ2FyZGxlc3Mgb2YgZmlsdGVyIHNpemUuXG4gKiAgICAtIGB2YWxpZGA6IG91dHB1dCB3aWxsIGJlIHNtYWxsZXIgdGhhbiBpbnB1dCBpZiBmaWx0ZXIgaXMgbGFyZ2VyXG4gKiAgICAgICB0aGFuIDEqMXgxLlxuICogICAgLSBGb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uXShcbiAqICAgICAgICAgIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbilcbiAqIEBwYXJhbSBkaW1Sb3VuZGluZ01vZGUgQSBzdHJpbmcgZnJvbTogJ2NlaWwnLCAncm91bmQnLCAnZmxvb3InLiBJZiBub25lIGlzXG4gKiAgICAgcHJvdmlkZWQsIGl0IHdpbGwgZGVmYXVsdCB0byB0cnVuY2F0ZS5cbiAqIEBwYXJhbSBkYXRhRm9ybWF0IEFuIG9wdGlvbmFsIHN0cmluZyBmcm9tOiBcIk5ESFdDXCIsIFwiTkNESFdcIi4gRGVmYXVsdHMgdG9cbiAqICAgICBcIk5ESFdDXCIuIFNwZWNpZnkgdGhlIGRhdGEgZm9ybWF0IG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEuIFdpdGggdGhlXG4gKiAgICAgZGVmYXVsdCBmb3JtYXQgXCJOREhXQ1wiLCB0aGUgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIG9yZGVyIG9mOiBbYmF0Y2gsXG4gKiAgICAgZGVwdGgsIGhlaWdodCwgd2lkdGgsIGNoYW5uZWxzXS4gT25seSBcIk5ESFdDXCIgaXMgY3VycmVudGx5IHN1cHBvcnRlZC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdDb252b2x1dGlvbid9XG4gKi9cbmZ1bmN0aW9uIGF2Z1Bvb2wzZF8oeCwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGRhdGFGb3JtYXQgPSAnTkRIV0MnKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnYXZnUG9vbDNkJywgJ2Zsb2F0MzInKTtcbiAgICBsZXQgeDVEID0gJHg7XG4gICAgbGV0IHJlc2hhcGVkVG81RCA9IGZhbHNlO1xuICAgIGlmICgkeC5yYW5rID09PSA0KSB7XG4gICAgICAgIHJlc2hhcGVkVG81RCA9IHRydWU7XG4gICAgICAgIHg1RCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV0sICR4LnNoYXBlWzJdLCAkeC5zaGFwZVszXV0pO1xuICAgIH1cbiAgICB1dGlsLmFzc2VydCh4NUQucmFuayA9PT0gNSwgKCkgPT4gYEVycm9yIGluIGF2Z1Bvb2wzZDogeCBtdXN0IGJlIHJhbmsgNSBidXQgZ290IHJhbmsgJHt4NUQucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoZGF0YUZvcm1hdCA9PT0gJ05ESFdDJywgKCkgPT4gYEVycm9yIGluIGF2Z1Bvb2wzZDogT25seSBOREhXQyBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLCBgICtcbiAgICAgICAgYGJ1dCBnb3QgZGF0YUZvcm1hdCBvZiAke2RhdGFGb3JtYXR9YCk7XG4gICAgaWYgKGRpbVJvdW5kaW5nTW9kZSAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNJbnQocGFkKSwgKCkgPT4gYEVycm9yIGluIGF2Z1Bvb2wzZDogcGFkIG11c3QgYmUgYW4gaW50ZWdlciB3aGVuIHVzaW5nLCBgICtcbiAgICAgICAgICAgIGBkaW1Sb3VuZGluZ01vZGUgJHtkaW1Sb3VuZGluZ01vZGV9IGJ1dCBnb3QgcGFkICR7cGFkfS5gKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiB4NUQgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGRhdGFGb3JtYXQgfTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgbGV0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoQXZnUG9vbDNELCBpbnB1dHMsIGF0dHJzKTtcbiAgICByZXMgPSBjYXN0KHJlcywgeDVELmR0eXBlKTtcbiAgICBpZiAocmVzaGFwZWRUbzVEKSB7XG4gICAgICAgIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM10sIHJlcy5zaGFwZVs0XV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IGF2Z1Bvb2wzZCA9IG9wKHsgYXZnUG9vbDNkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWF2Z19wb29sXzNkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYXhpcyBzcGVjaWZpZXMgdGhlIGlubmVyIG1vc3QgZGltZW5zaW9ucyBvZiB0aGVcbiAqIGFycmF5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXhlc0FyZUlubmVyTW9zdERpbXMoYXhlcywgcmFuaykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXhlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAoYXhlc1theGVzLmxlbmd0aCAtIGkgLSAxXSAhPT0gcmFuayAtIDEgLSBpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5leHBvcnQgZnVuY3Rpb24gY29tYmluZUxvY2F0aW9ucyhvdXRwdXRMb2MsIHJlZHVjZUxvYywgYXhlcykge1xuICAgIGNvbnN0IHJhbmsgPSBvdXRwdXRMb2MubGVuZ3RoICsgcmVkdWNlTG9jLmxlbmd0aDtcbiAgICBjb25zdCBsb2MgPSBbXTtcbiAgICBsZXQgb3V0SWR4ID0gMDtcbiAgICBsZXQgcmVkdWNlSWR4ID0gMDtcbiAgICBmb3IgKGxldCBkaW0gPSAwOyBkaW0gPCByYW5rOyBkaW0rKykge1xuICAgICAgICBpZiAoYXhlcy5pbmRleE9mKGRpbSkgPT09IC0xKSB7XG4gICAgICAgICAgICBsb2MucHVzaChvdXRwdXRMb2Nbb3V0SWR4KytdKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxvYy5wdXNoKHJlZHVjZUxvY1tyZWR1Y2VJZHgrK10pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsb2M7XG59XG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcyhhU2hhcGUsIGF4ZXMpIHtcbiAgICBjb25zdCBvdXRTaGFwZSA9IFtdO1xuICAgIGNvbnN0IHJhbmsgPSBhU2hhcGUubGVuZ3RoO1xuICAgIGZvciAobGV0IGRpbSA9IDA7IGRpbSA8IHJhbms7IGRpbSsrKSB7XG4gICAgICAgIGlmIChheGVzLmluZGV4T2YoZGltKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIG91dFNoYXBlLnB1c2goYVNoYXBlW2RpbV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlZHVjZVNoYXBlID0gYXhlcy5tYXAoZGltID0+IGFTaGFwZVtkaW1dKTtcbiAgICByZXR1cm4gW291dFNoYXBlLCByZWR1Y2VTaGFwZV07XG59XG5leHBvcnQgZnVuY3Rpb24gZXhwYW5kU2hhcGVUb0tlZXBEaW0oc2hhcGUsIGF4ZXMpIHtcbiAgICBjb25zdCByZWR1Y2VTdWJTaGFwZSA9IGF4ZXMubWFwKHggPT4gMSk7XG4gICAgcmV0dXJuIGNvbWJpbmVMb2NhdGlvbnMoc2hhcGUsIHJlZHVjZVN1YlNoYXBlLCBheGVzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcyhtc2csIGF4ZXMsIHJhbmspIHtcbiAgICB1dGlsLmFzc2VydChheGVzQXJlSW5uZXJNb3N0RGltcyhheGVzLCByYW5rKSwgKCkgPT4gYCR7bXNnfSBzdXBwb3J0cyBvbmx5IGlubmVyLW1vc3QgYXhlcyBmb3Igbm93LiBgICtcbiAgICAgICAgYEdvdCBheGVzICR7YXhlc30gYW5kIHJhbmstJHtyYW5rfSBpbnB1dC5gKTtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgYXhlcyBwZXJtdXRhdGlvbiB0byBiZSB1c2VkIHdpdGggYHRmLnRyYW5zcG9zZWAsIGlmIHN1Y2hcbiAqIHBlcm11dGF0aW9uIGlzIG5lY2Vzc2FyeS4gT3RoZXJ3aXNlIGl0IHJldHVybnMgbnVsbC4gVGhpcyBtZXRob2QgaXMgdXNlZCBieVxuICogb3BlcmF0aW9ucyB0aGF0IG9wZXJhdGUgb25seSBvbiBpbm5lci1tb3N0IGF4ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBeGVzUGVybXV0YXRpb24oYXhlcywgcmFuaykge1xuICAgIGlmIChheGVzQXJlSW5uZXJNb3N0RGltcyhheGVzLCByYW5rKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5rOyArK2kpIHtcbiAgICAgICAgaWYgKGF4ZXMuaW5kZXhPZihpKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGF4ZXMuZm9yRWFjaChheGlzID0+IHJlc3VsdC5wdXNoKGF4aXMpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqIFJldHVybnMgdGhlIGF4ZXMgcGVybXV0YXRpb24gdGhhdCB1bmRvZXMgdGhlIG9yaWdpbmFsIHBlcm11dGF0aW9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFVuZG9BeGVzUGVybXV0YXRpb24oYXhlcykge1xuICAgIHJldHVybiBheGVzLm1hcCgoYXhpcywgaSkgPT4gW2ksIGF4aXNdKVxuICAgICAgICAuc29ydCgoYSwgYikgPT4gYVsxXSAtIGJbMV0pXG4gICAgICAgIC5tYXAoeCA9PiB4WzBdKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbm5lck1vc3RBeGVzKG51bUF4ZXMsIHJhbmspIHtcbiAgICBjb25zdCByZXMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gcmFuayAtIG51bUF4ZXM7IGkgPCByYW5rOyArK2kpIHtcbiAgICAgICAgcmVzLnB1c2goaSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1heGlzX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGFkZCB9IGZyb20gJy4vYWRkJztcbmltcG9ydCB7IGNvbmNhdCB9IGZyb20gJy4vY29uY2F0JztcbmltcG9ydCB7IG1hdE11bCB9IGZyb20gJy4vbWF0X211bCc7XG5pbXBvcnQgeyBtdWwgfSBmcm9tICcuL211bCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHNpZ21vaWQgfSBmcm9tICcuL3NpZ21vaWQnO1xuaW1wb3J0IHsgc2xpY2UgfSBmcm9tICcuL3NsaWNlJztcbmltcG9ydCB7IHRhbmggfSBmcm9tICcuL3RhbmgnO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgbmV4dCBzdGF0ZSBhbmQgb3V0cHV0IG9mIGEgQmFzaWNMU1RNQ2VsbC5cbiAqXG4gKiBSZXR1cm5zIGBbbmV3QywgbmV3SF1gLlxuICpcbiAqIERlcml2ZWQgZnJvbSB0Zi5jb250cmliLnJubi5CYXNpY0xTVE1DZWxsLlxuICpcbiAqIEBwYXJhbSBmb3JnZXRCaWFzIEZvcmdldCBiaWFzIGZvciB0aGUgY2VsbC5cbiAqIEBwYXJhbSBsc3RtS2VybmVsIFRoZSB3ZWlnaHRzIGZvciB0aGUgY2VsbC5cbiAqIEBwYXJhbSBsc3RtQmlhcyBUaGUgYmlhcyBmb3IgdGhlIGNlbGwuXG4gKiBAcGFyYW0gZGF0YSBUaGUgaW5wdXQgdG8gdGhlIGNlbGwuXG4gKiBAcGFyYW0gYyBQcmV2aW91cyBjZWxsIHN0YXRlLlxuICogQHBhcmFtIGggUHJldmlvdXMgY2VsbCBvdXRwdXQuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnUk5OJ31cbiAqL1xuZnVuY3Rpb24gYmFzaWNMU1RNQ2VsbF8oZm9yZ2V0QmlhcywgbHN0bUtlcm5lbCwgbHN0bUJpYXMsIGRhdGEsIGMsIGgpIHtcbiAgICBjb25zdCAkZm9yZ2V0QmlhcyA9IGNvbnZlcnRUb1RlbnNvcihmb3JnZXRCaWFzLCAnZm9yZ2V0QmlhcycsICdiYXNpY0xTVE1DZWxsJyk7XG4gICAgY29uc3QgJGxzdG1LZXJuZWwgPSBjb252ZXJ0VG9UZW5zb3IobHN0bUtlcm5lbCwgJ2xzdG1LZXJuZWwnLCAnYmFzaWNMU1RNQ2VsbCcpO1xuICAgIGNvbnN0ICRsc3RtQmlhcyA9IGNvbnZlcnRUb1RlbnNvcihsc3RtQmlhcywgJ2xzdG1CaWFzJywgJ2Jhc2ljTFNUTUNlbGwnKTtcbiAgICBjb25zdCAkZGF0YSA9IGNvbnZlcnRUb1RlbnNvcihkYXRhLCAnZGF0YScsICdiYXNpY0xTVE1DZWxsJyk7XG4gICAgY29uc3QgJGMgPSBjb252ZXJ0VG9UZW5zb3IoYywgJ2MnLCAnYmFzaWNMU1RNQ2VsbCcpO1xuICAgIGNvbnN0ICRoID0gY29udmVydFRvVGVuc29yKGgsICdoJywgJ2Jhc2ljTFNUTUNlbGwnKTtcbiAgICBjb25zdCBjb21iaW5lZCA9IGNvbmNhdChbJGRhdGEsICRoXSwgMSk7XG4gICAgY29uc3Qgd2VpZ2h0ZWQgPSBtYXRNdWwoY29tYmluZWQsICRsc3RtS2VybmVsKTtcbiAgICBjb25zdCByZXMgPSBhZGQod2VpZ2h0ZWQsICRsc3RtQmlhcyk7XG4gICAgLy8gaSA9IGlucHV0X2dhdGUsIGogPSBuZXdfaW5wdXQsIGYgPSBmb3JnZXRfZ2F0ZSwgbyA9IG91dHB1dF9nYXRlXG4gICAgY29uc3QgYmF0Y2hTaXplID0gcmVzLnNoYXBlWzBdO1xuICAgIGNvbnN0IHNsaWNlQ29scyA9IHJlcy5zaGFwZVsxXSAvIDQ7XG4gICAgY29uc3Qgc2xpY2VTaXplID0gW2JhdGNoU2l6ZSwgc2xpY2VDb2xzXTtcbiAgICBjb25zdCBpID0gc2xpY2UocmVzLCBbMCwgMF0sIHNsaWNlU2l6ZSk7XG4gICAgY29uc3QgaiA9IHNsaWNlKHJlcywgWzAsIHNsaWNlQ29sc10sIHNsaWNlU2l6ZSk7XG4gICAgY29uc3QgZiA9IHNsaWNlKHJlcywgWzAsIHNsaWNlQ29scyAqIDJdLCBzbGljZVNpemUpO1xuICAgIGNvbnN0IG8gPSBzbGljZShyZXMsIFswLCBzbGljZUNvbHMgKiAzXSwgc2xpY2VTaXplKTtcbiAgICBjb25zdCBuZXdDID0gYWRkKG11bChzaWdtb2lkKGkpLCB0YW5oKGopKSwgbXVsKCRjLCBzaWdtb2lkKGFkZCgkZm9yZ2V0QmlhcywgZikpKSk7XG4gICAgY29uc3QgbmV3SCA9IG11bCh0YW5oKG5ld0MpLCBzaWdtb2lkKG8pKTtcbiAgICByZXR1cm4gW25ld0MsIG5ld0hdO1xufVxuZXhwb3J0IGNvbnN0IGJhc2ljTFNUTUNlbGwgPSBvcCh7IGJhc2ljTFNUTUNlbGxfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmFzaWNfbHN0bV9jZWxsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBCYXRjaFRvU3BhY2VORCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBUaGlzIG9wZXJhdGlvbiByZXNoYXBlcyB0aGUgXCJiYXRjaFwiIGRpbWVuc2lvbiAwIGludG8gYE0gKyAxYCBkaW1lbnNpb25zIG9mXG4gKiBzaGFwZSBgYmxvY2tTaGFwZSArIFtiYXRjaF1gLCBpbnRlcmxlYXZlcyB0aGVzZSBibG9ja3MgYmFjayBpbnRvIHRoZSBncmlkXG4gKiBkZWZpbmVkIGJ5IHRoZSBzcGF0aWFsIGRpbWVuc2lvbnMgYFsxLCAuLi4sIE1dYCwgdG8gb2J0YWluIGEgcmVzdWx0IHdpdGhcbiAqIHRoZSBzYW1lIHJhbmsgYXMgdGhlIGlucHV0LiBUaGUgc3BhdGlhbCBkaW1lbnNpb25zIG9mIHRoaXMgaW50ZXJtZWRpYXRlXG4gKiByZXN1bHQgYXJlIHRoZW4gb3B0aW9uYWxseSBjcm9wcGVkIGFjY29yZGluZyB0byBgY3JvcHNgIHRvIHByb2R1Y2UgdGhlXG4gKiBvdXRwdXQuIFRoaXMgaXMgdGhlIHJldmVyc2Ugb2YgYHRmLnNwYWNlVG9CYXRjaE5EYC4gU2VlIGJlbG93IGZvciBhIHByZWNpc2VcbiAqIGRlc2NyaXB0aW9uLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yNGQoWzEsIDIsIDMsIDRdLCBbNCwgMSwgMSwgMV0pO1xuICogY29uc3QgYmxvY2tTaGFwZSA9IFsyLCAyXTtcbiAqIGNvbnN0IGNyb3BzID0gW1swLCAwXSwgWzAsIDBdXTtcbiAqXG4gKiB4LmJhdGNoVG9TcGFjZU5EKGJsb2NrU2hhcGUsIGNyb3BzKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHggQSBgdGYuVGVuc29yYC4gTi1EIHdpdGggYHguc2hhcGVgID0gYFtiYXRjaF0gKyBzcGF0aWFsU2hhcGUgK1xuICogcmVtYWluaW5nU2hhcGVgLCB3aGVyZSBzcGF0aWFsU2hhcGUgaGFzIGBNYCBkaW1lbnNpb25zLlxuICogQHBhcmFtIGJsb2NrU2hhcGUgQSAxLUQgYXJyYXkuIE11c3QgaGF2ZSBzaGFwZSBgW01dYCwgYWxsIHZhbHVlcyBtdXN0XG4gKiBiZSA+PSAxLlxuICogQHBhcmFtIGNyb3BzIEEgMi1EIGFycmF5LiAgTXVzdCBoYXZlIHNoYXBlIGBbTSwgMl1gLCBhbGwgdmFsdWVzIG11c3QgYmUgPj0gMC5cbiAqIGBjcm9wc1tpXSA9IFtjcm9wU3RhcnQsIGNyb3BFbmRdYCBzcGVjaWZpZXMgdGhlIGFtb3VudCB0byBjcm9wIGZyb20gaW5wdXRcbiAqIGRpbWVuc2lvbiBgaSArIDFgLCB3aGljaCBjb3JyZXNwb25kcyB0byBzcGF0aWFsIGRpbWVuc2lvbiBgaWAuIEl0IGlzIHJlcXVpcmVkXG4gKiB0aGF0IGBjcm9wU3RhcnRbaV0gKyBjcm9wRW5kW2ldIDw9IGJsb2NrU2hhcGVbaV0gKiBpbnB1dFNoYXBlW2kgKyAxXWBcbiAqXG4gKiBUaGlzIG9wZXJhdGlvbiBpcyBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmcgc3RlcHM6XG4gKlxuICogMS4gUmVzaGFwZSBgeGAgdG8gYHJlc2hhcGVkYCBvZiBzaGFwZTogYFtibG9ja1NoYXBlWzBdLCAuLi4sXG4gKiBibG9ja1NoYXBlW00tMV0sIGJhdGNoIC8gcHJvZChibG9ja1NoYXBlKSwgeC5zaGFwZVsxXSwgLi4uLFxuICogeC5zaGFwZVtOLTFdXWBcbiAqXG4gKiAyLiBQZXJtdXRlIGRpbWVuc2lvbnMgb2YgYHJlc2hhcGVkYHRvIHByb2R1Y2UgYHBlcm11dGVkYCBvZiBzaGFwZSBgW2JhdGNoIC9cbiAqIHByb2QoYmxvY2tTaGFwZSkseC5zaGFwZVsxXSwgYmxvY2tTaGFwZVswXSwgLi4uLCB4LnNoYXBlW01dLFxuICogYmxvY2tTaGFwZVtNLTFdLHguc2hhcGVbTSsxXSwgLi4uLCB4LnNoYXBlW04tMV1dYFxuICpcbiAqIDMuIFJlc2hhcGUgYHBlcm11dGVkYCB0byBwcm9kdWNlIGByZXNoYXBlZFBlcm11dGVkYCBvZiBzaGFwZSBgW2JhdGNoIC9cbiAqIHByb2QoYmxvY2tTaGFwZSkseC5zaGFwZVsxXSAqIGJsb2NrU2hhcGVbMF0sIC4uLiwgeC5zaGFwZVtNXSAqXG4gKiBibG9ja1NoYXBlW00tMV0seC5zaGFwZVtNKzFdLCAuLi4sIHguc2hhcGVbTi0xXV1gXG4gKlxuICogNC4gQ3JvcCB0aGUgc3RhcnQgYW5kIGVuZCBvZiBkaW1lbnNpb25zIGBbMSwgLi4uLCBNXWAgb2YgYHJlc2hhcGVkUGVybXV0ZWRgXG4gKiBhY2NvcmRpbmcgdG8gYGNyb3BzYCB0byBwcm9kdWNlIHRoZSBvdXRwdXQgb2Ygc2hhcGU6IGBbYmF0Y2ggL1xuICogcHJvZChibG9ja1NoYXBlKSx4LnNoYXBlWzFdICogYmxvY2tTaGFwZVswXSAtIGNyb3BzWzAsMF0gLSBjcm9wc1swLDFdLFxuICogLi4uLCB4LnNoYXBlW01dICogYmxvY2tTaGFwZVtNLTFdIC0gY3JvcHNbTS0xLDBdIC1cbiAqIGNyb3BzW00tMSwxXSx4LnNoYXBlW00rMV0sIC4uLiwgeC5zaGFwZVtOLTFdXWBcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdUcmFuc2Zvcm1hdGlvbnMnfVxuICovXG5mdW5jdGlvbiBiYXRjaFRvU3BhY2VORF8oeCwgYmxvY2tTaGFwZSwgY3JvcHMpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdiYXRjaFRvU3BhY2VORCcpO1xuICAgIGNvbnN0IHByb2QgPSBibG9ja1NoYXBlLnJlZHVjZSgoYSwgYikgPT4gYSAqIGIpO1xuICAgIHV0aWwuYXNzZXJ0KCR4LnJhbmsgPj0gMSArIGJsb2NrU2hhcGUubGVuZ3RoLCAoKSA9PiBgaW5wdXQgcmFuayBpcyAkeyR4LnJhbmt9IGJ1dCBzaG91bGQgYmUgPiB0aGFuIGJsb2NrU2hhcGUubGVuZ3RoICR7YmxvY2tTaGFwZS5sZW5ndGh9YCk7XG4gICAgdXRpbC5hc3NlcnQoY3JvcHMubGVuZ3RoID09PSBibG9ja1NoYXBlLmxlbmd0aCwgKCkgPT4gYGNyb3BzLmxlbmd0aCBpcyAke2Nyb3BzLmxlbmd0aH0gYnV0IHNob3VsZCBiZSBlcXVhbCB0byBibG9ja1NoYXBlLmxlbmd0aCAgJHtibG9ja1NoYXBlLmxlbmd0aH1gKTtcbiAgICB1dGlsLmFzc2VydCgkeC5zaGFwZVswXSAlIHByb2QgPT09IDAsICgpID0+IGBpbnB1dCB0ZW5zb3IgYmF0Y2ggaXMgJHskeC5zaGFwZVswXX0gYnV0IGlzIG5vdCBkaXZpc2libGUgYnkgdGhlIHByb2R1Y3Qgb2YgYCArXG4gICAgICAgIGB0aGUgZWxlbWVudHMgb2YgYmxvY2tTaGFwZSAke2Jsb2NrU2hhcGUuam9pbignICogJyl9ID09PSAke3Byb2R9YCk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBibG9ja1NoYXBlLCBjcm9wcyB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEJhdGNoVG9TcGFjZU5ELCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBiYXRjaFRvU3BhY2VORCA9IG9wKHsgYmF0Y2hUb1NwYWNlTkRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmF0Y2hfdG9fc3BhY2VfbmQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEZ1c2VkQmF0Y2hOb3JtIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgeEFzNEQgfSBmcm9tICcuL2JhdGNobm9ybV91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vcmVzaGFwZSc7XG4vKipcbiAqIEJhdGNoIG5vcm1hbGl6YXRpb24uXG4gKlxuICogQXMgZGVzY3JpYmVkIGluXG4gKiBbaHR0cDovL2FyeGl2Lm9yZy9hYnMvMTUwMi4wMzE2N10oaHR0cDovL2FyeGl2Lm9yZy9hYnMvMTUwMi4wMzE2NykuXG4gKlxuICogTWVhbiwgdmFyaWFuY2UsIHNjYWxlLCBhbmQgb2Zmc2V0IGNhbiBiZSBvZiB0d28gc2hhcGVzOlxuICogICAtIFRoZSBzYW1lIHNoYXBlIGFzIHRoZSBpbnB1dC5cbiAqICAgLSBJbiB0aGUgY29tbW9uIGNhc2UsIHRoZSBkZXB0aCBkaW1lbnNpb24gaXMgdGhlIGxhc3QgZGltZW5zaW9uIG9mIHgsIHNvXG4gKiAgICAgdGhlIHZhbHVlcyB3b3VsZCBiZSBhbiBgdGYuVGVuc29yMURgIG9mIHNoYXBlIFtkZXB0aF0uXG4gKlxuICogQWxzbyBhdmFpbGFibGUgYXJlIHN0cmljdGVyIHJhbmstc3BlY2lmaWMgbWV0aG9kcyB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZVxuICogYXMgdGhpcyBtZXRob2QgdGhhdCBhc3NlcnQgdGhhdCBwYXJhbWV0ZXJzIHBhc3NlZCBhcmUgb2YgZ2l2ZW4gcmFua1xuICogICAtIGB0Zi5iYXRjaE5vcm0yZGBcbiAqICAgLSBgdGYuYmF0Y2hOb3JtM2RgXG4gKiAgIC0gYHRmLmJhdGNoTm9ybTRkYFxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBUZW5zb3IuXG4gKiBAcGFyYW0gbWVhbiBBIG1lYW4gVGVuc29yLlxuICogQHBhcmFtIHZhcmlhbmNlIEEgdmFyaWFuY2UgVGVuc29yLlxuICogQHBhcmFtIG9mZnNldCBBbiBvZmZzZXQgVGVuc29yLlxuICogQHBhcmFtIHNjYWxlIEEgc2NhbGUgVGVuc29yLlxuICogQHBhcmFtIHZhcmlhbmNlRXBzaWxvbiBBIHNtYWxsIGZsb2F0IG51bWJlciB0byBhdm9pZCBkaXZpZGluZyBieSAwLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ05vcm1hbGl6YXRpb24nfVxuICovXG5mdW5jdGlvbiBiYXRjaE5vcm1fKHgsIG1lYW4sIHZhcmlhbmNlLCBvZmZzZXQsIHNjYWxlLCB2YXJpYW5jZUVwc2lsb24pIHtcbiAgICBpZiAodmFyaWFuY2VFcHNpbG9uID09IG51bGwpIHtcbiAgICAgICAgdmFyaWFuY2VFcHNpbG9uID0gMC4wMDE7XG4gICAgfVxuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2JhdGNoTm9ybScpO1xuICAgIGNvbnN0ICRtZWFuID0gY29udmVydFRvVGVuc29yKG1lYW4sICdtZWFuJywgJ2JhdGNoTm9ybScpO1xuICAgIGNvbnN0ICR2YXJpYW5jZSA9IGNvbnZlcnRUb1RlbnNvcih2YXJpYW5jZSwgJ3ZhcmlhbmNlJywgJ2JhdGNoTm9ybScpO1xuICAgIGxldCAkc2NhbGU7XG4gICAgaWYgKHNjYWxlICE9IG51bGwpIHtcbiAgICAgICAgJHNjYWxlID0gY29udmVydFRvVGVuc29yKHNjYWxlLCAnc2NhbGUnLCAnYmF0Y2hOb3JtJyk7XG4gICAgfVxuICAgIGxldCAkb2Zmc2V0O1xuICAgIGlmIChvZmZzZXQgIT0gbnVsbCkge1xuICAgICAgICAkb2Zmc2V0ID0gY29udmVydFRvVGVuc29yKG9mZnNldCwgJ29mZnNldCcsICdiYXRjaE5vcm0nKTtcbiAgICB9XG4gICAgdXRpbC5hc3NlcnQoJG1lYW4ucmFuayA9PT0gJHZhcmlhbmNlLnJhbmssICgpID0+ICdCYXRjaCBub3JtYWxpemF0aW9uIGdyYWRpZW50IHJlcXVpcmVzIG1lYW4gYW5kIHZhcmlhbmNlIHRvIGhhdmUgJyArXG4gICAgICAgICdlcXVhbCByYW5rcy4nKTtcbiAgICB1dGlsLmFzc2VydCgkb2Zmc2V0ID09IG51bGwgfHwgJG1lYW4ucmFuayA9PT0gJG9mZnNldC5yYW5rLCAoKSA9PiAnQmF0Y2ggbm9ybWFsaXphdGlvbiBncmFkaWVudCByZXF1aXJlcyBtZWFuIGFuZCBvZmZzZXQgdG8gaGF2ZSAnICtcbiAgICAgICAgJ2VxdWFsIHJhbmtzLicpO1xuICAgIHV0aWwuYXNzZXJ0KCRzY2FsZSA9PSBudWxsIHx8ICRtZWFuLnJhbmsgPT09ICRzY2FsZS5yYW5rLCAoKSA9PiAnQmF0Y2ggbm9ybWFsaXphdGlvbiBncmFkaWVudCByZXF1aXJlcyBtZWFuIGFuZCBzY2FsZSB0byBoYXZlICcgK1xuICAgICAgICAnZXF1YWwgcmFua3MuJyk7XG4gICAgY29uc3QgeDREID0geEFzNEQoJHgpO1xuICAgIGNvbnN0IGlucHV0cyA9IHtcbiAgICAgICAgeDogeDRELFxuICAgICAgICBzY2FsZTogJHNjYWxlLFxuICAgICAgICBvZmZzZXQ6ICRvZmZzZXQsXG4gICAgICAgIG1lYW46ICRtZWFuLFxuICAgICAgICB2YXJpYW5jZTogJHZhcmlhbmNlXG4gICAgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgdmFyaWFuY2VFcHNpbG9uIH07XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgIGNvbnN0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoRnVzZWRCYXRjaE5vcm0sIGlucHV0cywgYXR0cnMpO1xuICAgIHJldHVybiByZXNoYXBlKHJlcywgJHguc2hhcGUpO1xufVxuZXhwb3J0IGNvbnN0IGJhdGNoTm9ybSA9IG9wKHsgYmF0Y2hOb3JtXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJhdGNobm9ybS5qcy5tYXAiLCJpbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IGJhdGNoTm9ybSB9IGZyb20gJy4vYmF0Y2hub3JtJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBCYXRjaCBub3JtYWxpemF0aW9uLCBzdHJpY3RseSBmb3IgMkQuIEZvciB0aGUgbW9yZSByZWxheGVkIHZlcnNpb24sIHNlZVxuICogYHRmLmJhdGNoTm9ybWAuXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IFRlbnNvci5cbiAqIEBwYXJhbSBtZWFuIEEgbWVhbiBUZW5zb3IuXG4gKiBAcGFyYW0gdmFyaWFuY2UgQSB2YXJpYW5jZSBUZW5zb3IuXG4gKiBAcGFyYW0gb2Zmc2V0IEFuIG9mZnNldCBUZW5zb3IuXG4gKiBAcGFyYW0gc2NhbGUgQSBzY2FsZSBUZW5zb3IuXG4gKiBAcGFyYW0gdmFyaWFuY2VFcHNpbG9uIEEgc21hbGwgZmxvYXQgbnVtYmVyIHRvIGF2b2lkIGRpdmlkaW5nIGJ5IDAuXG4gKi9cbmZ1bmN0aW9uIGJhdGNoTm9ybTJkXyh4LCBtZWFuLCB2YXJpYW5jZSwgb2Zmc2V0LCBzY2FsZSwgdmFyaWFuY2VFcHNpbG9uKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnYmF0Y2hOb3JtJyk7XG4gICAgY29uc3QgJG1lYW4gPSBjb252ZXJ0VG9UZW5zb3IobWVhbiwgJ21lYW4nLCAnYmF0Y2hOb3JtJyk7XG4gICAgY29uc3QgJHZhcmlhbmNlID0gY29udmVydFRvVGVuc29yKHZhcmlhbmNlLCAndmFyaWFuY2UnLCAnYmF0Y2hOb3JtJyk7XG4gICAgbGV0ICRzY2FsZTtcbiAgICBpZiAoc2NhbGUgIT0gbnVsbCkge1xuICAgICAgICAkc2NhbGUgPSBjb252ZXJ0VG9UZW5zb3Ioc2NhbGUsICdzY2FsZScsICdiYXRjaE5vcm0nKTtcbiAgICB9XG4gICAgbGV0ICRvZmZzZXQ7XG4gICAgaWYgKG9mZnNldCAhPSBudWxsKSB7XG4gICAgICAgICRvZmZzZXQgPSBjb252ZXJ0VG9UZW5zb3Iob2Zmc2V0LCAnb2Zmc2V0JywgJ2JhdGNoTm9ybScpO1xuICAgIH1cbiAgICB1dGlsLmFzc2VydCgkeC5yYW5rID09PSAyLCAoKSA9PiBgRXJyb3IgaW4gYmF0Y2hOb3JtMkQ6IHggbXVzdCBiZSByYW5rIDIgYnV0IGdvdCByYW5rIGAgK1xuICAgICAgICBgJHskeC5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydCgkbWVhbi5yYW5rID09PSAyIHx8ICRtZWFuLnJhbmsgPT09IDEsICgpID0+IGBFcnJvciBpbiBiYXRjaE5vcm0yRDogbWVhbiBtdXN0IGJlIHJhbmsgMiBvciByYW5rIDEgYnV0IGAgK1xuICAgICAgICBgZ290IHJhbmsgJHskbWVhbi5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydCgkdmFyaWFuY2UucmFuayA9PT0gMiB8fCAkdmFyaWFuY2UucmFuayA9PT0gMSwgKCkgPT4gYEVycm9yIGluIGJhdGNoTm9ybTJEOiB2YXJpYW5jZSBtdXN0IGJlIHJhbmsgMiBvciByYW5rIDEgYCArXG4gICAgICAgIGBidXQgZ290IHJhbmsgJHskdmFyaWFuY2UucmFua30uYCk7XG4gICAgaWYgKCRzY2FsZSAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KCRzY2FsZS5yYW5rID09PSAyIHx8ICRzY2FsZS5yYW5rID09PSAxLCAoKSA9PiBgRXJyb3IgaW4gYmF0Y2hOb3JtMkQ6IHNjYWxlIG11c3QgYmUgcmFuayAyIG9yIHJhbmsgMSBgICtcbiAgICAgICAgICAgIGBidXQgZ290IHJhbmsgJHskc2NhbGUucmFua30uYCk7XG4gICAgfVxuICAgIGlmICgkb2Zmc2V0ICE9IG51bGwpIHtcbiAgICAgICAgdXRpbC5hc3NlcnQoJG9mZnNldC5yYW5rID09PSAyIHx8ICRvZmZzZXQucmFuayA9PT0gMSwgKCkgPT4gYEVycm9yIGluIGJhdGNoTm9ybTJEOiBvZmZzZXQgbXVzdCBiZSByYW5rIDIgb3IgcmFuayAxIGAgK1xuICAgICAgICAgICAgYGJ1dCBnb3QgcmFuayAkeyRvZmZzZXQucmFua30uYCk7XG4gICAgfVxuICAgIHJldHVybiBiYXRjaE5vcm0oJHgsICRtZWFuLCAkdmFyaWFuY2UsICRvZmZzZXQsICRzY2FsZSwgdmFyaWFuY2VFcHNpbG9uKTtcbn1cbmV4cG9ydCBjb25zdCBiYXRjaE5vcm0yZCA9IG9wKHsgYmF0Y2hOb3JtMmRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmF0Y2hub3JtMmQuanMubWFwIiwiaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBiYXRjaE5vcm0gfSBmcm9tICcuL2JhdGNobm9ybSc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQmF0Y2ggbm9ybWFsaXphdGlvbiwgc3RyaWN0bHkgZm9yIDNELiBGb3IgdGhlIG1vcmUgcmVsYXhlZCB2ZXJzaW9uLCBzZWVcbiAqIGB0Zi5iYXRjaE5vcm1gLlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBUZW5zb3IuXG4gKiBAcGFyYW0gbWVhbiBBIG1lYW4gVGVuc29yLlxuICogQHBhcmFtIHZhcmlhbmNlIEEgdmFyaWFuY2UgVGVuc29yLlxuICogQHBhcmFtIG9mZnNldCBBbiBvZmZzZXQgVGVuc29yLlxuICogQHBhcmFtIHNjYWxlIEEgc2NhbGUgVGVuc29yLlxuICogQHBhcmFtIHZhcmlhbmNlRXBzaWxvbiBBIHNtYWxsIGZsb2F0IG51bWJlciB0byBhdm9pZCBkaXZpZGluZyBieSAwLlxuICovXG5mdW5jdGlvbiBiYXRjaE5vcm0zZF8oeCwgbWVhbiwgdmFyaWFuY2UsIG9mZnNldCwgc2NhbGUsIHZhcmlhbmNlRXBzaWxvbikge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2JhdGNoTm9ybScpO1xuICAgIGNvbnN0ICRtZWFuID0gY29udmVydFRvVGVuc29yKG1lYW4sICdtZWFuJywgJ2JhdGNoTm9ybScpO1xuICAgIGNvbnN0ICR2YXJpYW5jZSA9IGNvbnZlcnRUb1RlbnNvcih2YXJpYW5jZSwgJ3ZhcmlhbmNlJywgJ2JhdGNoTm9ybScpO1xuICAgIGxldCAkc2NhbGU7XG4gICAgaWYgKHNjYWxlICE9IG51bGwpIHtcbiAgICAgICAgJHNjYWxlID0gY29udmVydFRvVGVuc29yKHNjYWxlLCAnc2NhbGUnLCAnYmF0Y2hOb3JtJyk7XG4gICAgfVxuICAgIGxldCAkb2Zmc2V0O1xuICAgIGlmIChvZmZzZXQgIT0gbnVsbCkge1xuICAgICAgICAkb2Zmc2V0ID0gY29udmVydFRvVGVuc29yKG9mZnNldCwgJ29mZnNldCcsICdiYXRjaE5vcm0nKTtcbiAgICB9XG4gICAgdXRpbC5hc3NlcnQoJHgucmFuayA9PT0gMywgKCkgPT4gYEVycm9yIGluIGJhdGNoTm9ybTNEOiB4IG11c3QgYmUgcmFuayAzIGJ1dCBnb3QgcmFuayBgICtcbiAgICAgICAgYCR7JHgucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoJG1lYW4ucmFuayA9PT0gMyB8fCAkbWVhbi5yYW5rID09PSAxLCAoKSA9PiBgRXJyb3IgaW4gYmF0Y2hOb3JtM0Q6IG1lYW4gbXVzdCBiZSByYW5rIDMgb3IgcmFuayAxIGJ1dCBgICtcbiAgICAgICAgYGdvdCByYW5rICR7JG1lYW4ucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoJHZhcmlhbmNlLnJhbmsgPT09IDMgfHwgJHZhcmlhbmNlLnJhbmsgPT09IDEsICgpID0+IGBFcnJvciBpbiBiYXRjaE5vcm0zRDogdmFyaWFuY2UgbXVzdCBiZSByYW5rIDMgb3IgcmFuayAxIGAgK1xuICAgICAgICBgYnV0IGdvdCByYW5rICR7JHZhcmlhbmNlLnJhbmt9LmApO1xuICAgIGlmICgkc2NhbGUgIT0gbnVsbCkge1xuICAgICAgICB1dGlsLmFzc2VydCgkc2NhbGUucmFuayA9PT0gMyB8fCAkc2NhbGUucmFuayA9PT0gMSwgKCkgPT4gYEVycm9yIGluIGJhdGNoTm9ybTNEOiBzY2FsZSBtdXN0IGJlIHJhbmsgMyBvciByYW5rIDEgYCArXG4gICAgICAgICAgICBgYnV0IGdvdCByYW5rICR7JHNjYWxlLnJhbmt9LmApO1xuICAgIH1cbiAgICBpZiAoJG9mZnNldCAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KCRvZmZzZXQucmFuayA9PT0gMyB8fCAkb2Zmc2V0LnJhbmsgPT09IDEsICgpID0+IGBFcnJvciBpbiBiYXRjaE5vcm0zRDogb2Zmc2V0IG11c3QgYmUgcmFuayAzIG9yIHJhbmsgMSBgICtcbiAgICAgICAgICAgIGBidXQgZ290IHJhbmsgJHskb2Zmc2V0LnJhbmt9LmApO1xuICAgIH1cbiAgICByZXR1cm4gYmF0Y2hOb3JtKCR4LCAkbWVhbiwgJHZhcmlhbmNlLCAkb2Zmc2V0LCAkc2NhbGUsIHZhcmlhbmNlRXBzaWxvbik7XG59XG5leHBvcnQgY29uc3QgYmF0Y2hOb3JtM2QgPSBvcCh7IGJhdGNoTm9ybTNkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJhdGNobm9ybTNkLmpzLm1hcCIsImltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgYmF0Y2hOb3JtIH0gZnJvbSAnLi9iYXRjaG5vcm0nO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIEJhdGNoIG5vcm1hbGl6YXRpb24sIHN0cmljdGx5IGZvciA0RC4gRm9yIHRoZSBtb3JlIHJlbGF4ZWQgdmVyc2lvbiwgc2VlXG4gKiBgdGYuYmF0Y2hOb3JtYC5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgVGVuc29yLlxuICogQHBhcmFtIG1lYW4gQSBtZWFuIFRlbnNvci5cbiAqIEBwYXJhbSB2YXJpYW5jZSBBIHZhcmlhbmNlIFRlbnNvci5cbiAqIEBwYXJhbSBvZmZzZXQgQW4gb2Zmc2V0IFRlbnNvci5cbiAqIEBwYXJhbSBzY2FsZSBBIHNjYWxlIFRlbnNvci5cbiAqIEBwYXJhbSB2YXJpYW5jZUVwc2lsb24gQSBzbWFsbCBmbG9hdCBudW1iZXIgdG8gYXZvaWQgZGl2aWRpbmcgYnkgMC5cbiAqL1xuZnVuY3Rpb24gYmF0Y2hOb3JtNGRfKHgsIG1lYW4sIHZhcmlhbmNlLCBvZmZzZXQsIHNjYWxlLCB2YXJpYW5jZUVwc2lsb24pIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdiYXRjaE5vcm0nKTtcbiAgICBjb25zdCAkbWVhbiA9IGNvbnZlcnRUb1RlbnNvcihtZWFuLCAnbWVhbicsICdiYXRjaE5vcm0nKTtcbiAgICBjb25zdCAkdmFyaWFuY2UgPSBjb252ZXJ0VG9UZW5zb3IodmFyaWFuY2UsICd2YXJpYW5jZScsICdiYXRjaE5vcm0nKTtcbiAgICBsZXQgJHNjYWxlO1xuICAgIGlmIChzY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICRzY2FsZSA9IGNvbnZlcnRUb1RlbnNvcihzY2FsZSwgJ3NjYWxlJywgJ2JhdGNoTm9ybScpO1xuICAgIH1cbiAgICBsZXQgJG9mZnNldDtcbiAgICBpZiAob2Zmc2V0ICE9IG51bGwpIHtcbiAgICAgICAgJG9mZnNldCA9IGNvbnZlcnRUb1RlbnNvcihvZmZzZXQsICdvZmZzZXQnLCAnYmF0Y2hOb3JtJyk7XG4gICAgfVxuICAgIHV0aWwuYXNzZXJ0KCR4LnJhbmsgPT09IDQsICgpID0+IGBFcnJvciBpbiBiYXRjaE5vcm00RDogeCBtdXN0IGJlIHJhbmsgNCBidXQgZ290IHJhbmsgYCArXG4gICAgICAgIGAkeyR4LnJhbmt9LmApO1xuICAgIHV0aWwuYXNzZXJ0KCRtZWFuLnJhbmsgPT09IDQgfHwgJG1lYW4ucmFuayA9PT0gMSwgKCkgPT4gYEVycm9yIGluIGJhdGNoTm9ybTREOiBtZWFuIG11c3QgYmUgcmFuayA0IG9yIHJhbmsgMSBidXQgYCArXG4gICAgICAgIGBnb3QgcmFuayAkeyRtZWFuLnJhbmt9LmApO1xuICAgIHV0aWwuYXNzZXJ0KCR2YXJpYW5jZS5yYW5rID09PSA0IHx8ICR2YXJpYW5jZS5yYW5rID09PSAxLCAoKSA9PiBgRXJyb3IgaW4gYmF0Y2hOb3JtNEQ6IHZhcmlhbmNlIG11c3QgYmUgcmFuayA0IG9yIHJhbmsgMSBgICtcbiAgICAgICAgYGJ1dCBnb3QgcmFuayAkeyR2YXJpYW5jZS5yYW5rfS5gKTtcbiAgICBpZiAoJHNjYWxlICE9IG51bGwpIHtcbiAgICAgICAgdXRpbC5hc3NlcnQoJHNjYWxlLnJhbmsgPT09IDQgfHwgJHNjYWxlLnJhbmsgPT09IDEsICgpID0+IGBFcnJvciBpbiBiYXRjaE5vcm00RDogc2NhbGUgbXVzdCBiZSByYW5rIDQgb3IgcmFuayAxIGAgK1xuICAgICAgICAgICAgYGJ1dCBnb3QgcmFuayAkeyRzY2FsZS5yYW5rfS5gKTtcbiAgICB9XG4gICAgaWYgKCRvZmZzZXQgIT0gbnVsbCkge1xuICAgICAgICB1dGlsLmFzc2VydCgkb2Zmc2V0LnJhbmsgPT09IDQgfHwgJG9mZnNldC5yYW5rID09PSAxLCAoKSA9PiBgRXJyb3IgaW4gYmF0Y2hOb3JtNEQ6IG9mZnNldCBtdXN0IGJlIHJhbmsgNCBvciByYW5rIDEgYCArXG4gICAgICAgICAgICBgYnV0IGdvdCByYW5rICR7JG9mZnNldC5yYW5rfS5gKTtcbiAgICB9XG4gICAgcmV0dXJuIGJhdGNoTm9ybSgkeCwgJG1lYW4sICR2YXJpYW5jZSwgJG9mZnNldCwgJHNjYWxlLCB2YXJpYW5jZUVwc2lsb24pO1xufVxuZXhwb3J0IGNvbnN0IGJhdGNoTm9ybTRkID0gb3AoeyBiYXRjaE5vcm00ZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iYXRjaG5vcm00ZC5qcy5tYXAiLCJpbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbmV4cG9ydCBmdW5jdGlvbiB4QXM0RCh4KSB7XG4gICAgbGV0IHg0RDtcbiAgICBpZiAoeC5yYW5rID09PSAwIHx8IHgucmFuayA9PT0gMSkge1xuICAgICAgICB4NEQgPSByZXNoYXBlKHgsIFsxLCAxLCAxLCB4LnNpemVdKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoeC5yYW5rID09PSAyKSB7XG4gICAgICAgIHg0RCA9IHJlc2hhcGUoeCwgWzEsIDEsIHguc2hhcGVbMF0sIHguc2hhcGVbMV1dKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoeC5yYW5rID09PSAzKSB7XG4gICAgICAgIHg0RCA9IHJlc2hhcGUoeCwgWzEsIHguc2hhcGVbMF0sIHguc2hhcGVbMV0sIHguc2hhcGVbMl1dKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHg0RCA9IHg7XG4gICAgfVxuICAgIHJldHVybiB4NEQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iYXRjaG5vcm1fdXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgQmluY291bnQgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogT3V0cHV0cyBhIHZlY3RvciB3aXRoIGxlbmd0aCBgc2l6ZWAgYW5kIHRoZSBzYW1lIGR0eXBlIGFzIGB3ZWlnaHRzYC5cbiAqXG4gKiBJZiBgd2VpZ2h0c2AgYXJlIGVtcHR5LCB0aGVuIGluZGV4IGBpYCBzdG9yZXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgdmFsdWVcbiAqIGBpYCBpcyBjb3VudGVkIGluIGB4YC4gSWYgYHdlaWdodHNgIGFyZSBub24tZW1wdHksIHRoZW4gaW5kZXggYGlgIHN0b3JlcyB0aGVcbiAqIHN1bSBvZiB0aGUgdmFsdWUgaW4gYHdlaWdodHNgIGF0IGVhY2ggaW5kZXggd2hlcmUgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgaW5cbiAqIGB4YCBpcyBgaWAuXG4gKlxuICogVmFsdWVzIGluIGB4YCBvdXRzaWRlIG9mIHRoZSByYW5nZSBbMCwgc2l6ZSkgYXJlIGlnbm9yZWQuXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IGludCB0ZW5zb3IsIHJhbmsgMS5cbiAqIEBwYXJhbSB3ZWlnaHRzIFRoZSB3ZWlnaHRzIHRlbnNvciwgbXVzdCBoYXZlIHRoZSBzYW1lIHNoYXBlIGFzIHgsIG9yIGFcbiAqICAgICBsZW5ndGgtMCBUZW5zb3IsIGluIHdoaWNoIGNhc2UgaXQgYWN0cyBhcyBhbGwgd2VpZ2h0cyBlcXVhbCB0byAxLlxuICogQHBhcmFtIHNpemUgTm9uLW5lZ2F0aXZlIGludGVnZXIuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnUmVkdWN0aW9uJ31cbiAqL1xuZnVuY3Rpb24gYmluY291bnRfKHgsIHdlaWdodHMsIHNpemUpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdiaW5jb3VudCcpO1xuICAgIGNvbnN0ICR3ZWlnaHRzID0gY29udmVydFRvVGVuc29yKHdlaWdodHMsICd3ZWlnaHRzJywgJ2JpbmNvdW50Jyk7XG4gICAgdXRpbC5hc3NlcnQoJHguZHR5cGUgPT09ICdpbnQzMicsICgpID0+IGBFcnJvciBpbiBiaW5jb3VudDogaW5wdXQgYCArXG4gICAgICAgIGBkdHlwZSBtdXN0IGJlIGludDMyLCBidXQgZ290ICR7JHguZHR5cGV9YCk7XG4gICAgdXRpbC5hc3NlcnQoc2l6ZSA+PSAwLCAoKSA9PiBgc2l6ZSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSwgYnV0IGdvdCAke3NpemV9LmApO1xuICAgIHV0aWwuYXNzZXJ0KCR3ZWlnaHRzLnNpemUgPT09ICR4LnNpemUgfHwgJHdlaWdodHMuc2l6ZSA9PT0gMCwgKCkgPT4gYEVycm9yIGluIGJpbmNvdW50OiB3ZWlnaHRzIG11c3QgaGF2ZSB0aGUgc2FtZSBzaXplIGFzIGlucHV0IG9yYCArXG4gICAgICAgIGAwLWxlbmd0aCwgYnV0IGdvdCBpbnB1dCBzaGFwZTogJHskeC5zaGFwZX0sIHdlaWdodHMgc2hhcGU6IGAgK1xuICAgICAgICBgJHskd2VpZ2h0cy5zaGFwZX0uYCk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCwgd2VpZ2h0czogJHdlaWdodHMgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgc2l6ZSB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEJpbmNvdW50LCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBiaW5jb3VudCA9IG9wKHsgYmluY291bnRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmluY291bnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBnYXRoZXIgfSBmcm9tICcuL2dhdGhlcic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbmltcG9ydCB7IHNxdWVlemUgfSBmcm9tICcuL3NxdWVlemUnO1xuaW1wb3J0IHsgd2hlcmVBc3luYyB9IGZyb20gJy4vd2hlcmVfYXN5bmMnO1xuLyoqXG4gKiBBcHBseSBib29sZWFuIG1hc2sgdG8gdGVuc29yLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB0ZW5zb3IgPSB0Zi50ZW5zb3IyZChbMSwgMiwgMywgNCwgNSwgNl0sIFszLCAyXSk7XG4gKiBjb25zdCBtYXNrID0gdGYudGVuc29yMWQoWzEsIDAsIDFdLCAnYm9vbCcpO1xuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGYuYm9vbGVhbk1hc2tBc3luYyh0ZW5zb3IsIG1hc2spO1xuICogcmVzdWx0LnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdGVuc29yIE4tRCB0ZW5zb3IuXG4gKiBAcGFyYW0gbWFzayBLLUQgYm9vbGVhbiB0ZW5zb3IsIEsgPD0gTiBhbmQgSyBtdXN0IGJlIGtub3duIHN0YXRpY2FsbHkuXG4gKiBAcGFyYW0gYXhpcyBBIDAtRCBpbnQgVGVuc29yIHJlcHJlc2VudGluZyB0aGUgYXhpcyBpbiB0ZW5zb3IgdG8gbWFzayBmcm9tLlxuICogICAgIEJ5IGRlZmF1bHQsIGF4aXMgaXMgMCB3aGljaCB3aWxsIG1hc2sgZnJvbSB0aGUgZmlyc3QgZGltZW5zaW9uLlxuICogICAgIE90aGVyd2lzZSBLICsgYXhpcyA8PSBOLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1NsaWNpbmcgYW5kIEpvaW5pbmcnfVxuICovXG5hc3luYyBmdW5jdGlvbiBib29sZWFuTWFza0FzeW5jXyh0ZW5zb3IsIG1hc2ssIGF4aXMpIHtcbiAgICBjb25zdCAkdGVuc29yID0gY29udmVydFRvVGVuc29yKHRlbnNvciwgJ3RlbnNvcicsICdib29sTWFzaycpO1xuICAgIGNvbnN0ICRtYXNrID0gY29udmVydFRvVGVuc29yKG1hc2ssICdtYXNrJywgJ2Jvb2xNYXNrJywgJ2Jvb2wnKTtcbiAgICBjb25zdCBheGlzRnJvbSA9IGF4aXMgPT0gbnVsbCA/IDAgOiBheGlzO1xuICAgIGNvbnN0IG1hc2tEaW0gPSAkbWFzay5yYW5rO1xuICAgIGNvbnN0IHRlbnNvclNoYXBlID0gJHRlbnNvci5zaGFwZTtcbiAgICB1dGlsLmFzc2VydChtYXNrRGltID4gMCwgKCkgPT4gJ21hc2sgY2Fubm90IGJlIHNjYWxhcicpO1xuICAgIHV0aWwuYXNzZXJ0U2hhcGVzTWF0Y2godGVuc29yU2hhcGUuc2xpY2UoYXhpc0Zyb20sIGF4aXNGcm9tICsgbWFza0RpbSksICRtYXNrLnNoYXBlLCBgbWFzaydzIHNoYXBlIG11c3QgbWF0Y2ggdGhlIGZpcnN0IEsgZGltZW5zaW9ucyBvZiB0ZW5zb3IncyBzaGFwZSxgKTtcbiAgICBsZXQgbGVhZGluZ1NpemUgPSAxO1xuICAgIGZvciAobGV0IGkgPSBheGlzRnJvbTsgaSA8IGF4aXNGcm9tICsgbWFza0RpbTsgaSsrKSB7XG4gICAgICAgIGxlYWRpbmdTaXplICo9IHRlbnNvclNoYXBlW2ldO1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXRUZW5zb3JTaGFwZSA9IHRlbnNvclNoYXBlLnNsaWNlKDAsIGF4aXNGcm9tKVxuICAgICAgICAuY29uY2F0KFtsZWFkaW5nU2l6ZV0sIHRlbnNvclNoYXBlLnNsaWNlKGF4aXNGcm9tICsgbWFza0RpbSkpO1xuICAgIGNvbnN0IHJlc2hhcGVkVGVuc29yID0gcmVzaGFwZSgkdGVuc29yLCB0YXJnZXRUZW5zb3JTaGFwZSk7XG4gICAgY29uc3QgcmVzaGFwZWRNYXNrID0gcmVzaGFwZSgkbWFzaywgWy0xXSk7XG4gICAgY29uc3QgcG9zaXRpdmVQb3NpdGlvbnMgPSBhd2FpdCB3aGVyZUFzeW5jKHJlc2hhcGVkTWFzayk7XG4gICAgY29uc3QgaW5kaWNlcyA9IHNxdWVlemUocG9zaXRpdmVQb3NpdGlvbnMsIFsxXSk7XG4gICAgY29uc3QgcmVzID0gZ2F0aGVyKHJlc2hhcGVkVGVuc29yLCBpbmRpY2VzLCBheGlzRnJvbSk7XG4gICAgLy8gRW5zdXJlIG5vIG1lbW9yeSBsZWFrLlxuICAgIGlmICh0ZW5zb3IgIT09ICR0ZW5zb3IpIHtcbiAgICAgICAgJHRlbnNvci5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGlmIChtYXNrICE9PSAkbWFzaykge1xuICAgICAgICAkbWFzay5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGluZGljZXMuZGlzcG9zZSgpO1xuICAgIHJlc2hhcGVkVGVuc29yLmRpc3Bvc2UoKTtcbiAgICByZXNoYXBlZE1hc2suZGlzcG9zZSgpO1xuICAgIHBvc2l0aXZlUG9zaXRpb25zLmRpc3Bvc2UoKTtcbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IGJvb2xlYW5NYXNrQXN5bmMgPSBib29sZWFuTWFza0FzeW5jXztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJvb2xlYW5fbWFzay5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgVGlsZSB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgY2xvbmUgfSBmcm9tICcuL2Nsb25lJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vcmVzaGFwZSc7XG4vKipcbiAqIEJyb2FkY2FzdCBhbiBhcnJheSB0byBhIGNvbXBhdGlibGUgc2hhcGUgTnVtUHktc3R5bGUuXG4gKlxuICogVGhlIHRlbnNvcidzIHNoYXBlIGlzIGNvbXBhcmVkIHRvIHRoZSBicm9hZGNhc3Qgc2hhcGUgZnJvbSBlbmQgdG8gYmVnaW5uaW5nLlxuICogT25lcyBhcmUgcHJlcGVuZGVkIHRvIHRoZSB0ZW5zb3IncyBzaGFwZSB1bnRpbCBpcyBoYXMgdGhlIHNhbWUgbGVuZ3RoIGFzXG4gKiB0aGUgYnJvYWRjYXN0IHNoYXBlLiBJZiBpbnB1dC5zaGFwZVtpXT09c2hhcGVbaV0sIHRoZSAoaSsxKS10aCBheGlzIGlzXG4gKiBhbHJlYWR5IGJyb2FkY2FzdC1jb21wYXRpYmxlLiBJZiBpbnB1dC5zaGFwZVtpXT09MSBhbmQgc2hhcGVbaV09PU4sIHRoZW5cbiAqIHRoZSBpbnB1dCB0ZW5zb3IgaXMgdGlsZWQgTiB0aW1lcyBhbG9uZyB0aGF0IGF4aXMgKHVzaW5nIHRmLnRpbGUpLlxuICpcbiAqIEBwYXJhbSBpbnB1dCBUaGUgdGVuc29yIHRoYXQgaXMgdG8gYmUgYnJvYWRjYXN0ZWQuXG4gKiBAcGFyYW0gc2hhcGUgVGhlIGlucHV0IGlzIHRvIGJlIGJyb2FkY2FzdCB0byB0aGlzIHNoYXBlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1RyYW5zZm9ybWF0aW9ucyd9XG4gKi9cbmZ1bmN0aW9uIGJyb2FkY2FzdFRvXyh4LCBzaGFwZSkge1xuICAgIGxldCBpbnB1dCA9IGNvbnZlcnRUb1RlbnNvcih4LCAnYnJvYWRjYXN0VG8nLCAneCcpO1xuICAgIGNvbnN0IHhTaGFwZSA9IGlucHV0LnNoYXBlO1xuICAgIGlmIChzaGFwZS5zb21lKGQgPT4gIShkID4gMCkgfHwgZCAlIDEgIT09IDApKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgYnJvYWRjYXN0VG8oKTogSW52YWxpZCBicm9hZGNhc3Qgc2hhcGUgWyR7c2hhcGV9XS5gKTtcbiAgICB9XG4gICAgaWYgKHNoYXBlLmxlbmd0aCA8IGlucHV0LnJhbmspIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBicm9hZGNhc3RUbygpOiBzaGFwZS5sZW5ndGg9JHtzaGFwZS5sZW5ndGh9IDwgaW5wdXQucmFuaz0ke2lucHV0LnJhbmt9LmApO1xuICAgIH1cbiAgICBpZiAoc2hhcGUubGVuZ3RoID4gaW5wdXQucmFuaykge1xuICAgICAgICBjb25zdCBuZXdTaGFwZSA9IGlucHV0LnNoYXBlLnNsaWNlKCk7XG4gICAgICAgIHdoaWxlIChuZXdTaGFwZS5sZW5ndGggPCBzaGFwZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIG5ld1NoYXBlLnVuc2hpZnQoMSk7XG4gICAgICAgIH1cbiAgICAgICAgaW5wdXQgPSByZXNoYXBlKGlucHV0LCBuZXdTaGFwZSk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0U2hhcGUgPSBpbnB1dC5zaGFwZTtcbiAgICBjb25zdCByZXBzID0gQXJyYXkuZnJvbShzaGFwZSk7XG4gICAgZm9yIChsZXQgaSA9IHNoYXBlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGlmIChpbnB1dFNoYXBlW2ldID09PSBzaGFwZVtpXSkge1xuICAgICAgICAgICAgcmVwc1tpXSA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaW5wdXQuc2hhcGVbaV0gIT09IDEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgYnJvYWRjYXN0VG8oKTogWyR7eFNoYXBlfV0gY2Fubm90IGJlIGJyb2FkY2FzdCB0byBbJHtzaGFwZX1dLmApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGF4ZXMgPSByZXBzLm1hcCgobiwgaSkgPT4gbiA+IDEgPyBpIDogLTEpLmZpbHRlcihpID0+IGkgPj0gMCk7XG4gICAgaWYgKGF4ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBjbG9uZShpbnB1dCk7XG4gICAgfVxuICAgIC8vIFRPRE8gY2FsbCBicm9hZGNhc3RUbyBrZXJuZWwgZGlyZWN0bHkgb25jZSBiYWNrZW5kcyBpbXBsZW1lbnQgYnJvYWRjc3RUb1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogaW5wdXQgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgcmVwcyB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFRpbGUsIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IGJyb2FkY2FzdFRvID0gb3AoeyBicm9hZGNhc3RUb18gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1icm9hZGNhc3RfdG8uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBkaW1lbnNpb25zIGluIHRoZSBpbnB1dCBzaGFwZSB0aGF0IGFyZSBicm9hZGNhc3RlZCB0b1xuICogcHJvZHVjZSB0aGUgcHJvdmlkZWQgb3V0cHV0IHNoYXBlLlxuICpcbiAqIFRoZSByZXR1cm5lZCBkaW1lbnNpb25zIGFyZSAwLWluZGV4ZWQgYW5kIHNvcnRlZC4gQW4gZXhhbXBsZTpcbiAqIGluU2hhcGUgPSBbNCwgMSwgM11cbiAqIG91dFNoYXBlID0gWzUsIDQsIDMsIDNdXG4gKiByZXN1bHQgPSBbMV0uIERpbWVuc2lvbiAxICgybmQgZGltZW5zaW9uIG9mIGlucHV0KSBnZXRzIGJyb2FkY2FzdGVkIDEgPT4gMy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJyb2FkY2FzdERpbXMoaW5TaGFwZSwgb3V0U2hhcGUpIHtcbiAgICBjb25zdCBpblJhbmsgPSBpblNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBkaW1zID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpblJhbms7IGkrKykge1xuICAgICAgICBjb25zdCBkaW0gPSBpblJhbmsgLSAxIC0gaTtcbiAgICAgICAgY29uc3QgYSA9IGluU2hhcGVbZGltXSB8fCAxO1xuICAgICAgICBjb25zdCBiID0gb3V0U2hhcGVbb3V0U2hhcGUubGVuZ3RoIC0gMSAtIGldIHx8IDE7XG4gICAgICAgIGlmIChiID4gMSAmJiBhID09PSAxKSB7XG4gICAgICAgICAgICBkaW1zLnVuc2hpZnQoZGltKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGltcztcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgYXhlcyBpbiB0aGUgb3V0cHV0IHNwYWNlIHRoYXQgc2hvdWxkIGJlIHJlZHVjZWQgdG8gcHJvZHVjZVxuICogdGhlIGlucHV0IHNwYWNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVkdWN0aW9uQXhlcyhpblNoYXBlLCBvdXRTaGFwZSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0U2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgaW5EaW0gPSBpblNoYXBlW2luU2hhcGUubGVuZ3RoIC0gaSAtIDFdO1xuICAgICAgICBjb25zdCBvdXRBeGlzID0gb3V0U2hhcGUubGVuZ3RoIC0gaSAtIDE7XG4gICAgICAgIGNvbnN0IG91dERpbSA9IG91dFNoYXBlW291dEF4aXNdO1xuICAgICAgICBpZiAoaW5EaW0gPT0gbnVsbCB8fCAoaW5EaW0gPT09IDEgJiYgb3V0RGltID4gMSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC51bnNoaWZ0KG91dEF4aXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoc2hhcGVBLCBzaGFwZUIpIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBjb25zdCBsID0gTWF0aC5tYXgoc2hhcGVBLmxlbmd0aCwgc2hhcGVCLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgbGV0IGEgPSBzaGFwZUFbc2hhcGVBLmxlbmd0aCAtIGkgLSAxXTtcbiAgICAgICAgaWYgKGEgPT0gbnVsbCkge1xuICAgICAgICAgICAgYSA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGIgPSBzaGFwZUJbc2hhcGVCLmxlbmd0aCAtIGkgLSAxXTtcbiAgICAgICAgaWYgKGIgPT0gbnVsbCkge1xuICAgICAgICAgICAgYiA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGEgPT09IDEpIHtcbiAgICAgICAgICAgIHJlc3VsdC51bnNoaWZ0KGIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGIgPT09IDEpIHtcbiAgICAgICAgICAgIHJlc3VsdC51bnNoaWZ0KGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGEgIT09IGIpIHtcbiAgICAgICAgICAgIGNvbnN0IGVyck1zZyA9IGBPcGVyYW5kcyBjb3VsZCBub3QgYmUgYnJvYWRjYXN0IHRvZ2V0aGVyIHdpdGggc2hhcGVzIGAgK1xuICAgICAgICAgICAgICAgIGAke3NoYXBlQX0gYW5kICR7c2hhcGVCfS5gO1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoZXJyTXNnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdC51bnNoaWZ0KGEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1icm9hZGNhc3RfdXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi4vZW52aXJvbm1lbnQnO1xuaW1wb3J0IHsgRnJvbVBpeGVscyB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBnZXRLZXJuZWwgfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHsgVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBjYXN0IH0gZnJvbSAnLi9jYXN0JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgdGVuc29yM2QgfSBmcm9tICcuL3RlbnNvcjNkJztcbmxldCBmcm9tUGl4ZWxzMkRDb250ZXh0O1xuLyoqXG4gKiBDcmVhdGVzIGEgYHRmLlRlbnNvcmAgZnJvbSBhbiBpbWFnZS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2VEYXRhKDEsIDEpO1xuICogaW1hZ2UuZGF0YVswXSA9IDEwMDtcbiAqIGltYWdlLmRhdGFbMV0gPSAxNTA7XG4gKiBpbWFnZS5kYXRhWzJdID0gMjAwO1xuICogaW1hZ2UuZGF0YVszXSA9IDI1NTtcbiAqXG4gKiB0Zi5icm93c2VyLmZyb21QaXhlbHMoaW1hZ2UpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gcGl4ZWxzIFRoZSBpbnB1dCBpbWFnZSB0byBjb25zdHJ1Y3QgdGhlIHRlbnNvciBmcm9tLiBUaGVcbiAqIHN1cHBvcnRlZCBpbWFnZSB0eXBlcyBhcmUgYWxsIDQtY2hhbm5lbC4gWW91IGNhbiBhbHNvIHBhc3MgaW4gYW4gaW1hZ2VcbiAqIG9iamVjdCB3aXRoIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuICogYHtkYXRhOiBVaW50OEFycmF5OyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlcn1gXG4gKiBAcGFyYW0gbnVtQ2hhbm5lbHMgVGhlIG51bWJlciBvZiBjaGFubmVscyBvZiB0aGUgb3V0cHV0IHRlbnNvci4gQVxuICogbnVtQ2hhbm5lbHMgdmFsdWUgbGVzcyB0aGFuIDQgYWxsb3dzIHlvdSB0byBpZ25vcmUgY2hhbm5lbHMuIERlZmF1bHRzIHRvXG4gKiAzIChpZ25vcmVzIGFscGhhIGNoYW5uZWwgb2YgaW5wdXQgaW1hZ2UpLlxuICpcbiAqIEByZXR1cm5zIEEgVGVuc29yM0Qgd2l0aCB0aGUgc2hhcGUgYFtoZWlnaHQsIHdpZHRoLCBudW1DaGFubmVsc11gLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdCcm93c2VyJywgbmFtZXNwYWNlOiAnYnJvd3NlcicsIGlnbm9yZUNJOiB0cnVlfVxuICovXG5mdW5jdGlvbiBmcm9tUGl4ZWxzXyhwaXhlbHMsIG51bUNoYW5uZWxzID0gMykge1xuICAgIC8vIFNhbml0eSBjaGVja3MuXG4gICAgaWYgKG51bUNoYW5uZWxzID4gNCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjb25zdHJ1Y3QgVGVuc29yIHdpdGggbW9yZSB0aGFuIDQgY2hhbm5lbHMgZnJvbSBwaXhlbHMuJyk7XG4gICAgfVxuICAgIGlmIChwaXhlbHMgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BpeGVscyBwYXNzZWQgdG8gdGYuYnJvd3Nlci5mcm9tUGl4ZWxzKCkgY2FuIG5vdCBiZSBudWxsJyk7XG4gICAgfVxuICAgIGxldCBpc1BpeGVsRGF0YSA9IGZhbHNlO1xuICAgIGxldCBpc0ltYWdlRGF0YSA9IGZhbHNlO1xuICAgIGxldCBpc1ZpZGVvID0gZmFsc2U7XG4gICAgbGV0IGlzSW1hZ2UgPSBmYWxzZTtcbiAgICBsZXQgaXNDYW52YXNMaWtlID0gZmFsc2U7XG4gICAgbGV0IGlzSW1hZ2VCaXRtYXAgPSBmYWxzZTtcbiAgICBpZiAocGl4ZWxzLmRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgICAgIGlzUGl4ZWxEYXRhID0gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIChJbWFnZURhdGEpICE9PSAndW5kZWZpbmVkJyAmJiBwaXhlbHMgaW5zdGFuY2VvZiBJbWFnZURhdGEpIHtcbiAgICAgICAgaXNJbWFnZURhdGEgPSB0cnVlO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgKEhUTUxWaWRlb0VsZW1lbnQpICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICBwaXhlbHMgaW5zdGFuY2VvZiBIVE1MVmlkZW9FbGVtZW50KSB7XG4gICAgICAgIGlzVmlkZW8gPSB0cnVlO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgKEhUTUxJbWFnZUVsZW1lbnQpICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICBwaXhlbHMgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50KSB7XG4gICAgICAgIGlzSW1hZ2UgPSB0cnVlO1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWFueVxuICAgIH1cbiAgICBlbHNlIGlmIChwaXhlbHMuZ2V0Q29udGV4dCAhPSBudWxsKSB7XG4gICAgICAgIGlzQ2FudmFzTGlrZSA9IHRydWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiAoSW1hZ2VCaXRtYXApICE9PSAndW5kZWZpbmVkJyAmJiBwaXhlbHMgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCkge1xuICAgICAgICBpc0ltYWdlQml0bWFwID0gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigncGl4ZWxzIHBhc3NlZCB0byB0Zi5icm93c2VyLmZyb21QaXhlbHMoKSBtdXN0IGJlIGVpdGhlciBhbiAnICtcbiAgICAgICAgICAgIGBIVE1MVmlkZW9FbGVtZW50LCBIVE1MSW1hZ2VFbGVtZW50LCBIVE1MQ2FudmFzRWxlbWVudCwgSW1hZ2VEYXRhIGAgK1xuICAgICAgICAgICAgYGluIGJyb3dzZXIsIG9yIE9mZnNjcmVlbkNhbnZhcywgSW1hZ2VEYXRhIGluIHdlYndvcmtlcmAgK1xuICAgICAgICAgICAgYCBvciB7ZGF0YTogVWludDMyQXJyYXksIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyfSwgYCArXG4gICAgICAgICAgICBgYnV0IHdhcyAke3BpeGVscy5jb25zdHJ1Y3Rvci5uYW1lfWApO1xuICAgIH1cbiAgICBpZiAoaXNWaWRlbykge1xuICAgICAgICBjb25zdCBIQVZFX0NVUlJFTlRfREFUQV9SRUFEWV9TVEFURSA9IDI7XG4gICAgICAgIGlmIChpc1ZpZGVvICYmXG4gICAgICAgICAgICBwaXhlbHMucmVhZHlTdGF0ZSA8XG4gICAgICAgICAgICAgICAgSEFWRV9DVVJSRU5UX0RBVEFfUkVBRFlfU1RBVEUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHZpZGVvIGVsZW1lbnQgaGFzIG5vdCBsb2FkZWQgZGF0YSB5ZXQuIFBsZWFzZSB3YWl0IGZvciAnICtcbiAgICAgICAgICAgICAgICAnYGxvYWRlZGRhdGFgIGV2ZW50IG9uIHRoZSA8dmlkZW8+IGVsZW1lbnQuJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gSWYgdGhlIGN1cnJlbnQgYmFja2VuZCBoYXMgJ0Zyb21QaXhlbHMnIHJlZ2lzdGVyZWQsIGl0IGhhcyBhIG1vcmVcbiAgICAvLyBlZmZpY2llbnQgd2F5IG9mIGhhbmRsaW5nIHBpeGVsIHVwbG9hZHMsIHNvIHdlIGNhbGwgdGhhdC5cbiAgICBjb25zdCBrZXJuZWwgPSBnZXRLZXJuZWwoRnJvbVBpeGVscywgRU5HSU5FLmJhY2tlbmROYW1lKTtcbiAgICBpZiAoa2VybmVsICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgaW5wdXRzID0geyBwaXhlbHMgfTtcbiAgICAgICAgY29uc3QgYXR0cnMgPSB7IG51bUNoYW5uZWxzIH07XG4gICAgICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEZyb21QaXhlbHMsIGlucHV0cywgYXR0cnMpO1xuICAgIH1cbiAgICBjb25zdCBbd2lkdGgsIGhlaWdodF0gPSBpc1ZpZGVvID9cbiAgICAgICAgW1xuICAgICAgICAgICAgcGl4ZWxzLnZpZGVvV2lkdGgsXG4gICAgICAgICAgICBwaXhlbHMudmlkZW9IZWlnaHRcbiAgICAgICAgXSA6XG4gICAgICAgIFtwaXhlbHMud2lkdGgsIHBpeGVscy5oZWlnaHRdO1xuICAgIGxldCB2YWxzO1xuICAgIGlmIChpc0NhbnZhc0xpa2UpIHtcbiAgICAgICAgdmFscyA9XG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgICAgICAgICBwaXhlbHMuZ2V0Q29udGV4dCgnMmQnKS5nZXRJbWFnZURhdGEoMCwgMCwgd2lkdGgsIGhlaWdodCkuZGF0YTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNJbWFnZURhdGEgfHwgaXNQaXhlbERhdGEpIHtcbiAgICAgICAgdmFscyA9IHBpeGVscy5kYXRhO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc0ltYWdlIHx8IGlzVmlkZW8gfHwgaXNJbWFnZUJpdG1hcCkge1xuICAgICAgICBpZiAoZnJvbVBpeGVsczJEQ29udGV4dCA9PSBudWxsKSB7XG4gICAgICAgICAgICBmcm9tUGl4ZWxzMkRDb250ZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJykuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgfVxuICAgICAgICBmcm9tUGl4ZWxzMkRDb250ZXh0LmNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgICAgICBmcm9tUGl4ZWxzMkRDb250ZXh0LmNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIGZyb21QaXhlbHMyRENvbnRleHQuZHJhd0ltYWdlKHBpeGVscywgMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIHZhbHMgPSBmcm9tUGl4ZWxzMkRDb250ZXh0LmdldEltYWdlRGF0YSgwLCAwLCB3aWR0aCwgaGVpZ2h0KS5kYXRhO1xuICAgIH1cbiAgICBsZXQgdmFsdWVzO1xuICAgIGlmIChudW1DaGFubmVscyA9PT0gNCkge1xuICAgICAgICB2YWx1ZXMgPSBuZXcgSW50MzJBcnJheSh2YWxzKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IG51bVBpeGVscyA9IHdpZHRoICogaGVpZ2h0O1xuICAgICAgICB2YWx1ZXMgPSBuZXcgSW50MzJBcnJheShudW1QaXhlbHMgKiBudW1DaGFubmVscyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtUGl4ZWxzOyBpKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgbnVtQ2hhbm5lbHM7ICsrY2hhbm5lbCkge1xuICAgICAgICAgICAgICAgIHZhbHVlc1tpICogbnVtQ2hhbm5lbHMgKyBjaGFubmVsXSA9IHZhbHNbaSAqIDQgKyBjaGFubmVsXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBvdXRTaGFwZSA9IFtoZWlnaHQsIHdpZHRoLCBudW1DaGFubmVsc107XG4gICAgcmV0dXJuIHRlbnNvcjNkKHZhbHVlcywgb3V0U2hhcGUsICdpbnQzMicpO1xufVxuLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgfGZyb21QaXhlbHNBc3luY3wgdG8gY2hlY2sgd2hldGhlciB0aGUgaW5wdXQgY2FuXG4vLyBiZSB3cmFwcGVkIGludG8gaW1hZ2VCaXRtYXAuXG5mdW5jdGlvbiBpc1BpeGVsRGF0YShwaXhlbHMpIHtcbiAgICByZXR1cm4gKHBpeGVscyAhPSBudWxsKSAmJiAocGl4ZWxzLmRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KTtcbn1cbmZ1bmN0aW9uIGlzSW1hZ2VCaXRtYXBGdWxseVN1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgdHlwZW9mIChJbWFnZUJpdG1hcCkgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIHdpbmRvdy5oYXNPd25Qcm9wZXJ0eSgnY3JlYXRlSW1hZ2VCaXRtYXAnKTtcbn1cbmZ1bmN0aW9uIGlzTm9uRW1wdHlQaXhlbHMocGl4ZWxzKSB7XG4gICAgcmV0dXJuIHBpeGVscyAhPSBudWxsICYmIHBpeGVscy53aWR0aCAhPT0gMCAmJiBwaXhlbHMuaGVpZ2h0ICE9PSAwO1xufVxuZnVuY3Rpb24gY2FuV3JhcFBpeGVsc1RvSW1hZ2VCaXRtYXAocGl4ZWxzKSB7XG4gICAgcmV0dXJuIGlzSW1hZ2VCaXRtYXBGdWxseVN1cHBvcnRlZCgpICYmICEocGl4ZWxzIGluc3RhbmNlb2YgSW1hZ2VCaXRtYXApICYmXG4gICAgICAgIGlzTm9uRW1wdHlQaXhlbHMocGl4ZWxzKSAmJiAhaXNQaXhlbERhdGEocGl4ZWxzKTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIGB0Zi5UZW5zb3JgIGZyb20gYW4gaW1hZ2UgaW4gYXN5bmMgd2F5LlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBpbWFnZSA9IG5ldyBJbWFnZURhdGEoMSwgMSk7XG4gKiBpbWFnZS5kYXRhWzBdID0gMTAwO1xuICogaW1hZ2UuZGF0YVsxXSA9IDE1MDtcbiAqIGltYWdlLmRhdGFbMl0gPSAyMDA7XG4gKiBpbWFnZS5kYXRhWzNdID0gMjU1O1xuICpcbiAqIChhd2FpdCB0Zi5icm93c2VyLmZyb21QaXhlbHNBc3luYyhpbWFnZSkpLnByaW50KCk7XG4gKiBgYGBcbiAqIFRoaXMgQVBJIGlzIHRoZSBhc3luYyB2ZXJzaW9uIG9mIGZyb21QaXhlbHMuIFRoZSBBUEkgd2lsbCBmaXJzdFxuICogY2hlY2sgfFdSQVBfVE9fSU1BR0VCSVRNQVB8IGZsYWcsIGFuZCB0cnkgdG8gd3JhcCB0aGUgaW5wdXQgdG9cbiAqIGltYWdlQml0bWFwIGlmIHRoZSBmbGFnIGlzIHNldCB0byB0cnVlLlxuICpcbiAqIEBwYXJhbSBwaXhlbHMgVGhlIGlucHV0IGltYWdlIHRvIGNvbnN0cnVjdCB0aGUgdGVuc29yIGZyb20uIFRoZVxuICogc3VwcG9ydGVkIGltYWdlIHR5cGVzIGFyZSBhbGwgNC1jaGFubmVsLiBZb3UgY2FuIGFsc28gcGFzcyBpbiBhbiBpbWFnZVxuICogb2JqZWN0IHdpdGggZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG4gKiBge2RhdGE6IFVpbnQ4QXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyfWBcbiAqIEBwYXJhbSBudW1DaGFubmVscyBUaGUgbnVtYmVyIG9mIGNoYW5uZWxzIG9mIHRoZSBvdXRwdXQgdGVuc29yLiBBXG4gKiBudW1DaGFubmVscyB2YWx1ZSBsZXNzIHRoYW4gNCBhbGxvd3MgeW91IHRvIGlnbm9yZSBjaGFubmVscy4gRGVmYXVsdHMgdG9cbiAqIDMgKGlnbm9yZXMgYWxwaGEgY2hhbm5lbCBvZiBpbnB1dCBpbWFnZSkuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0Jyb3dzZXInLCBuYW1lc3BhY2U6ICdicm93c2VyJywgaWdub3JlQ0k6IHRydWV9XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmcm9tUGl4ZWxzQXN5bmMocGl4ZWxzLCBudW1DaGFubmVscyA9IDMpIHtcbiAgICBsZXQgaW5wdXRzID0gbnVsbDtcbiAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBiYWNrZW5kIG5lZWRzIHRvIHdyYXAgfHBpeGVsc3wgdG8gaW1hZ2VCaXRtYXAgYW5kXG4gICAgLy8gd2hldGhlciB8cGl4ZWxzfCBjYW4gYmUgd3JhcHBlZCB0byBpbWFnZUJpdG1hcC5cbiAgICBpZiAoZW52KCkuZ2V0Qm9vbCgnV1JBUF9UT19JTUFHRUJJVE1BUCcpICYmXG4gICAgICAgIGNhbldyYXBQaXhlbHNUb0ltYWdlQml0bWFwKHBpeGVscykpIHtcbiAgICAgICAgLy8gRm9yY2UgdGhlIGltYWdlQml0bWFwIGNyZWF0aW9uIHRvIG5vdCBkbyBhbnkgcHJlbXVsdGlwbHkgYWxwaGFcbiAgICAgICAgLy8gb3BzLlxuICAgICAgICBsZXQgaW1hZ2VCaXRtYXA7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyB3cmFwIGluIHRyeS1jYXRjaCBibG9jaywgYmVjYXVzZSBjcmVhdGVJbWFnZUJpdG1hcCBtYXkgbm90IHdvcmtcbiAgICAgICAgICAgIC8vIHByb3Blcmx5IGluIHNvbWUgYnJvd3NlcnMsIGUuZy5cbiAgICAgICAgICAgIC8vIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTEzMzU1OTRcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tYW55XG4gICAgICAgICAgICBpbWFnZUJpdG1hcCA9IGF3YWl0IGNyZWF0ZUltYWdlQml0bWFwKHBpeGVscywgeyBwcmVtdWx0aXBseUFscGhhOiAnbm9uZScgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGltYWdlQml0bWFwID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBjcmVhdGVJbWFnZUJpdG1hcCB3aWxsIGNsaXAgdGhlIHNvdXJjZSBzaXplLlxuICAgICAgICAvLyBJbiBzb21lIGNhc2VzLCB0aGUgaW5wdXQgd2lsbCBoYXZlIGxhcmdlciBzaXplIHRoYW4gaXRzIGNvbnRlbnQuXG4gICAgICAgIC8vIEUuZy4gbmV3IEltYWdlKDEwLCAxMCkgYnV0IHdpdGggMSB4IDEgY29udGVudC4gVXNpbmdcbiAgICAgICAgLy8gY3JlYXRlSW1hZ2VCaXRtYXAgd2lsbCBjbGlwIHRoZSBzaXplIGZyb20gMTAgeCAxMCB0byAxIHggMSwgd2hpY2hcbiAgICAgICAgLy8gaXMgbm90IGNvcnJlY3QuIFdlIHNob3VsZCBhdm9pZCB3cmFwcGluZyBzdWNoIHJlc291Y2UgdG9cbiAgICAgICAgLy8gaW1hZ2VCaXRtYXAuXG4gICAgICAgIGlmIChpbWFnZUJpdG1hcCAhPSBudWxsICYmIGltYWdlQml0bWFwLndpZHRoID09PSBwaXhlbHMud2lkdGggJiZcbiAgICAgICAgICAgIGltYWdlQml0bWFwLmhlaWdodCA9PT0gcGl4ZWxzLmhlaWdodCkge1xuICAgICAgICAgICAgaW5wdXRzID0gaW1hZ2VCaXRtYXA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpbnB1dHMgPSBwaXhlbHM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlucHV0cyA9IHBpeGVscztcbiAgICB9XG4gICAgcmV0dXJuIGZyb21QaXhlbHNfKGlucHV0cywgbnVtQ2hhbm5lbHMpO1xufVxuLyoqXG4gKiBEcmF3cyBhIGB0Zi5UZW5zb3JgIG9mIHBpeGVsIHZhbHVlcyB0byBhIGJ5dGUgYXJyYXkgb3Igb3B0aW9uYWxseSBhXG4gKiBjYW52YXMuXG4gKlxuICogV2hlbiB0aGUgZHR5cGUgb2YgdGhlIGlucHV0IGlzICdmbG9hdDMyJywgd2UgYXNzdW1lIHZhbHVlcyBpbiB0aGUgcmFuZ2VcbiAqIFswLTFdLiBPdGhlcndpc2UsIHdoZW4gaW5wdXQgaXMgJ2ludDMyJywgd2UgYXNzdW1lIHZhbHVlcyBpbiB0aGUgcmFuZ2VcbiAqIFswLTI1NV0uXG4gKlxuICogUmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjYW52YXMgaGFzIGJlZW4gZHJhd24gdG8uXG4gKlxuICogQHBhcmFtIGltZyBBIHJhbmstMiB0ZW5zb3Igd2l0aCBzaGFwZSBgW2hlaWdodCwgd2lkdGhdYCwgb3IgYSByYW5rLTMgdGVuc29yXG4gKiBvZiBzaGFwZSBgW2hlaWdodCwgd2lkdGgsIG51bUNoYW5uZWxzXWAuIElmIHJhbmstMiwgZHJhd3MgZ3JheXNjYWxlLiBJZlxuICogcmFuay0zLCBtdXN0IGhhdmUgZGVwdGggb2YgMSwgMyBvciA0LiBXaGVuIGRlcHRoIG9mIDEsIGRyYXdzXG4gKiBncmF5c2NhbGUuIFdoZW4gZGVwdGggb2YgMywgd2UgZHJhdyB3aXRoIHRoZSBmaXJzdCB0aHJlZSBjb21wb25lbnRzIG9mXG4gKiB0aGUgZGVwdGggZGltZW5zaW9uIGNvcnJlc3BvbmRpbmcgdG8gciwgZywgYiBhbmQgYWxwaGEgPSAxLiBXaGVuIGRlcHRoIG9mXG4gKiA0LCBhbGwgZm91ciBjb21wb25lbnRzIG9mIHRoZSBkZXB0aCBkaW1lbnNpb24gY29ycmVzcG9uZCB0byByLCBnLCBiLCBhLlxuICogQHBhcmFtIGNhbnZhcyBUaGUgY2FudmFzIHRvIGRyYXcgdG8uXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0Jyb3dzZXInLCBuYW1lc3BhY2U6ICdicm93c2VyJ31cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRvUGl4ZWxzKGltZywgY2FudmFzKSB7XG4gICAgbGV0ICRpbWcgPSBjb252ZXJ0VG9UZW5zb3IoaW1nLCAnaW1nJywgJ3RvUGl4ZWxzJyk7XG4gICAgaWYgKCEoaW1nIGluc3RhbmNlb2YgVGVuc29yKSkge1xuICAgICAgICAvLyBBc3N1bWUgaW50MzIgaWYgdXNlciBwYXNzZWQgYSBuYXRpdmUgYXJyYXkuXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsSW1nVGVuc29yID0gJGltZztcbiAgICAgICAgJGltZyA9IGNhc3Qob3JpZ2luYWxJbWdUZW5zb3IsICdpbnQzMicpO1xuICAgICAgICBvcmlnaW5hbEltZ1RlbnNvci5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGlmICgkaW1nLnJhbmsgIT09IDIgJiYgJGltZy5yYW5rICE9PSAzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdG9QaXhlbHMgb25seSBzdXBwb3J0cyByYW5rIDIgb3IgMyB0ZW5zb3JzLCBnb3QgcmFuayAkeyRpbWcucmFua30uYCk7XG4gICAgfVxuICAgIGNvbnN0IFtoZWlnaHQsIHdpZHRoXSA9ICRpbWcuc2hhcGUuc2xpY2UoMCwgMik7XG4gICAgY29uc3QgZGVwdGggPSAkaW1nLnJhbmsgPT09IDIgPyAxIDogJGltZy5zaGFwZVsyXTtcbiAgICBpZiAoZGVwdGggPiA0IHx8IGRlcHRoID09PSAyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdG9QaXhlbHMgb25seSBzdXBwb3J0cyBkZXB0aCBvZiBzaXplIGAgK1xuICAgICAgICAgICAgYDEsIDMgb3IgNCBidXQgZ290ICR7ZGVwdGh9YCk7XG4gICAgfVxuICAgIGlmICgkaW1nLmR0eXBlICE9PSAnZmxvYXQzMicgJiYgJGltZy5kdHlwZSAhPT0gJ2ludDMyJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHR5cGUgZm9yIHRvUGl4ZWxzOiAkeyRpbWcuZHR5cGV9LmAgK1xuICAgICAgICAgICAgYCBQbGVhc2UgdXNlIGZsb2F0MzIgb3IgaW50MzIgdGVuc29ycy5gKTtcbiAgICB9XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0ICRpbWcuZGF0YSgpO1xuICAgIGNvbnN0IG11bHRpcGxpZXIgPSAkaW1nLmR0eXBlID09PSAnZmxvYXQzMicgPyAyNTUgOiAxO1xuICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHdpZHRoICogaGVpZ2h0ICogNCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWlnaHQgKiB3aWR0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IHJnYmEgPSBbMCwgMCwgMCwgMjU1XTtcbiAgICAgICAgZm9yIChsZXQgZCA9IDA7IGQgPCBkZXB0aDsgZCsrKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGRhdGFbaSAqIGRlcHRoICsgZF07XG4gICAgICAgICAgICBpZiAoJGltZy5kdHlwZSA9PT0gJ2Zsb2F0MzInKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUZW5zb3IgdmFsdWVzIGZvciBhIGZsb2F0MzIgVGVuc29yIG11c3QgYmUgaW4gdGhlIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYHJhbmdlIFswIC0gMV0gYnV0IGVuY291bnRlcmVkICR7dmFsdWV9LmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCRpbWcuZHR5cGUgPT09ICdpbnQzMicpIHtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gMjU1KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGVuc29yIHZhbHVlcyBmb3IgYSBpbnQzMiBUZW5zb3IgbXVzdCBiZSBpbiB0aGUgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgcmFuZ2UgWzAgLSAyNTVdIGJ1dCBlbmNvdW50ZXJlZCAke3ZhbHVlfS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGVwdGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZ2JhWzBdID0gdmFsdWUgKiBtdWx0aXBsaWVyO1xuICAgICAgICAgICAgICAgIHJnYmFbMV0gPSB2YWx1ZSAqIG11bHRpcGxpZXI7XG4gICAgICAgICAgICAgICAgcmdiYVsyXSA9IHZhbHVlICogbXVsdGlwbGllcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJnYmFbZF0gPSB2YWx1ZSAqIG11bHRpcGxpZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaiA9IGkgKiA0O1xuICAgICAgICBieXRlc1tqICsgMF0gPSBNYXRoLnJvdW5kKHJnYmFbMF0pO1xuICAgICAgICBieXRlc1tqICsgMV0gPSBNYXRoLnJvdW5kKHJnYmFbMV0pO1xuICAgICAgICBieXRlc1tqICsgMl0gPSBNYXRoLnJvdW5kKHJnYmFbMl0pO1xuICAgICAgICBieXRlc1tqICsgM10gPSBNYXRoLnJvdW5kKHJnYmFbM10pO1xuICAgIH1cbiAgICBpZiAoY2FudmFzICE9IG51bGwpIHtcbiAgICAgICAgY2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICBjb25zdCBpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKGJ5dGVzLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgY3R4LnB1dEltYWdlRGF0YShpbWFnZURhdGEsIDAsIDApO1xuICAgIH1cbiAgICBpZiAoJGltZyAhPT0gaW1nKSB7XG4gICAgICAgICRpbWcuZGlzcG9zZSgpO1xuICAgIH1cbiAgICByZXR1cm4gYnl0ZXM7XG59XG5leHBvcnQgY29uc3QgZnJvbVBpeGVscyA9IG9wKHsgZnJvbVBpeGVsc18gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1icm93c2VyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFRlbnNvckJ1ZmZlciB9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuLyoqXG4gKiBDcmVhdGVzIGFuIGVtcHR5IGB0Zi5UZW5zb3JCdWZmZXJgIHdpdGggdGhlIHNwZWNpZmllZCBgc2hhcGVgIGFuZCBgZHR5cGVgLlxuICpcbiAqIFRoZSB2YWx1ZXMgYXJlIHN0b3JlZCBpbiBDUFUgYXMgYFR5cGVkQXJyYXlgLiBGaWxsIHRoZSBidWZmZXIgdXNpbmdcbiAqIGBidWZmZXIuc2V0KClgLCBvciBieSBtb2RpZnlpbmcgZGlyZWN0bHkgYGJ1ZmZlci52YWx1ZXNgLlxuICpcbiAqIFdoZW4gZG9uZSwgY2FsbCBgYnVmZmVyLnRvVGVuc29yKClgIHRvIGdldCBhbiBpbW11dGFibGUgYHRmLlRlbnNvcmAgd2l0aFxuICogdGhvc2UgdmFsdWVzLlxuICpcbiAqIGBgYGpzXG4gKiAvLyBDcmVhdGUgYSBidWZmZXIgYW5kIHNldCB2YWx1ZXMgYXQgcGFydGljdWxhciBpbmRpY2VzLlxuICogY29uc3QgYnVmZmVyID0gdGYuYnVmZmVyKFsyLCAyXSk7XG4gKiBidWZmZXIuc2V0KDMsIDAsIDApO1xuICogYnVmZmVyLnNldCg1LCAxLCAwKTtcbiAqXG4gKiAvLyBDb252ZXJ0IHRoZSBidWZmZXIgYmFjayB0byBhIHRlbnNvci5cbiAqIGJ1ZmZlci50b1RlbnNvcigpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gc2hhcGUgQW4gYXJyYXkgb2YgaW50ZWdlcnMgZGVmaW5pbmcgdGhlIG91dHB1dCB0ZW5zb3Igc2hhcGUuXG4gKiBAcGFyYW0gZHR5cGUgVGhlIGR0eXBlIG9mIHRoZSBidWZmZXIuIERlZmF1bHRzIHRvICdmbG9hdDMyJy5cbiAqIEBwYXJhbSB2YWx1ZXMgVGhlIHZhbHVlcyBvZiB0aGUgYnVmZmVyIGFzIGBUeXBlZEFycmF5YC4gRGVmYXVsdHMgdG9cbiAqIHplcm9zLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1ZmZlcihzaGFwZSwgZHR5cGUgPSAnZmxvYXQzMicsIHZhbHVlcykge1xuICAgIGR0eXBlID0gZHR5cGUgfHwgJ2Zsb2F0MzInO1xuICAgIHV0aWwuYXNzZXJ0Tm9uTmVnYXRpdmVJbnRlZ2VyRGltZW5zaW9ucyhzaGFwZSk7XG4gICAgcmV0dXJuIG5ldyBUZW5zb3JCdWZmZXIoc2hhcGUsIGR0eXBlLCB2YWx1ZXMpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YnVmZmVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBDYXN0IH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENhc3RzIGEgYHRmLlRlbnNvcmAgdG8gYSBuZXcgZHR5cGUuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMS41LCAyLjUsIDNdKTtcbiAqIHRmLmNhc3QoeCwgJ2ludDMyJykucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciB0byBiZSBjYXN0ZWQuXG4gKiBAcGFyYW0gZHR5cGUgVGhlIGR0eXBlIHRvIGNhc3QgdGhlIGlucHV0IHRlbnNvciB0by5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdUcmFuc2Zvcm1hdGlvbnMnfVxuICovXG5mdW5jdGlvbiBjYXN0Xyh4LCBkdHlwZSkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2Nhc3QnKTtcbiAgICAvLyBTYW5pdHkgY2hlY2tzLlxuICAgIGlmICghdXRpbC5pc1ZhbGlkRHR5cGUoZHR5cGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGNhc3QgdG8gdW5rbm93biBkdHlwZSAke2R0eXBlfWApO1xuICAgIH1cbiAgICBpZiAoZHR5cGUgPT09ICdzdHJpbmcnICYmICR4LmR0eXBlICE9PSAnc3RyaW5nJyB8fFxuICAgICAgICBkdHlwZSAhPT0gJ3N0cmluZycgJiYgJHguZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignT25seSBzdHJpbmdzIGNhbiBiZSBjYXN0ZWQgdG8gc3RyaW5ncycpO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgY29uc3QgYXR0cnMgPSB7IGR0eXBlIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoQ2FzdCwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgY2FzdCA9IG9wKHsgY2FzdF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jYXN0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBDZWlsIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgY2VpbGluZyBvZiBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6IGBjZWlsKHgpYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWy42LCAxLjEsIC0zLjNdKTtcbiAqXG4gKiB4LmNlaWwoKS5wcmludCgpOyAgLy8gb3IgdGYuY2VpbCh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgVGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBjZWlsXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnY2VpbCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChDZWlsLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGNlaWwgPSBvcCh7IGNlaWxfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2VpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgQ2xpcEJ5VmFsdWUgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ2xpcHMgdmFsdWVzIGVsZW1lbnQtd2lzZS4gYG1heChtaW4oeCwgY2xpcFZhbHVlTWF4KSwgY2xpcFZhbHVlTWluKWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFstMSwgMiwgLTMsIDRdKTtcbiAqXG4gKiB4LmNsaXBCeVZhbHVlKC0yLCAzKS5wcmludCgpOyAgLy8gb3IgdGYuY2xpcEJ5VmFsdWUoeCwgLTIsIDMpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gY2xpcFZhbHVlTWluIExvd2VyLWJvdW5kIG9mIHJhbmdlIHRvIGJlIGNsaXBwZWQgdG8uXG4gKiBAcGFyYW0gY2xpcFZhbHVlTWF4IFVwcGVyLWJvdW5kIG9mIHJhbmdlIHRvIGJlIGNsaXBwZWQgdG8uXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGNsaXBCeVZhbHVlXyh4LCBjbGlwVmFsdWVNaW4sIGNsaXBWYWx1ZU1heCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2NsaXBCeVZhbHVlJyk7XG4gICAgdXRpbC5hc3NlcnQoKGNsaXBWYWx1ZU1pbiA8PSBjbGlwVmFsdWVNYXgpLCAoKSA9PiBgRXJyb3IgaW4gY2xpcDogbWluICgke2NsaXBWYWx1ZU1pbn0pIG11c3QgYmUgYCArXG4gICAgICAgIGBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gbWF4ICgke2NsaXBWYWx1ZU1heH0pLmApO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICBjb25zdCBhdHRycyA9IHsgY2xpcFZhbHVlTWluLCBjbGlwVmFsdWVNYXggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChDbGlwQnlWYWx1ZSwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgY2xpcEJ5VmFsdWUgPSBvcCh7IGNsaXBCeVZhbHVlXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNsaXBfYnlfdmFsdWUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IElkZW50aXR5IH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB0ZW5zb3Igd2l0aCB0aGUgc2FtZSB2YWx1ZXMgYW5kIHNoYXBlIGFzIHRoZSBzcGVjaWZpZWRcbiAqIHRlbnNvci5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcihbMSwgMl0pO1xuICpcbiAqIHguY2xvbmUoKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIHRlbnNvciB0byBjbG9uZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmZ1bmN0aW9uIGNsb25lXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnY2xvbmUnLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgLy8gTm90ZSB0aGlzIG9wIGlzIGNhbGxlZCB0Zi5pZGVudGl0eSBpbiBweXRob24uIEhlbmNlIHRoZSBrZXJuZWwgbmFtZSB1c2VkXG4gICAgLy8gaGVyZS5cbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChJZGVudGl0eSwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBjbG9uZSA9IG9wKHsgY2xvbmVfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2xvbmUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IENvbXBsZXggfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29udmVydHMgdHdvIHJlYWwgbnVtYmVycyB0byBhIGNvbXBsZXggbnVtYmVyLlxuICpcbiAqIEdpdmVuIGEgdGVuc29yIGByZWFsYCByZXByZXNlbnRpbmcgdGhlIHJlYWwgcGFydCBvZiBhIGNvbXBsZXggbnVtYmVyLCBhbmQgYVxuICogdGVuc29yIGBpbWFnYCByZXByZXNlbnRpbmcgdGhlIGltYWdpbmFyeSBwYXJ0IG9mIGEgY29tcGxleCBudW1iZXIsIHRoaXNcbiAqIG9wZXJhdGlvbiByZXR1cm5zIGNvbXBsZXggbnVtYmVycyBlbGVtZW50d2lzZSBvZiB0aGUgZm9ybSBbcjAsIGkwLCByMSwgaTFdLFxuICogd2hlcmUgciByZXByZXNlbnRzIHRoZSByZWFsIHBhcnQgYW5kIGkgcmVwcmVzZW50cyB0aGUgaW1hZyBwYXJ0LlxuICpcbiAqIFRoZSBpbnB1dCB0ZW5zb3JzIHJlYWwgYW5kIGltYWcgbXVzdCBoYXZlIHRoZSBzYW1lIHNoYXBlLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCByZWFsID0gdGYudGVuc29yMWQoWzIuMjUsIDMuMjVdKTtcbiAqIGNvbnN0IGltYWcgPSB0Zi50ZW5zb3IxZChbNC43NSwgNS43NV0pO1xuICogY29uc3QgY29tcGxleCA9IHRmLmNvbXBsZXgocmVhbCwgaW1hZyk7XG4gKlxuICogY29tcGxleC5wcmludCgpO1xuICogYGBgXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5mdW5jdGlvbiBjb21wbGV4XyhyZWFsLCBpbWFnKSB7XG4gICAgY29uc3QgJHJlYWwgPSBjb252ZXJ0VG9UZW5zb3IocmVhbCwgJ3JlYWwnLCAnY29tcGxleCcpO1xuICAgIGNvbnN0ICRpbWFnID0gY29udmVydFRvVGVuc29yKGltYWcsICdpbWFnJywgJ2NvbXBsZXgnKTtcbiAgICB1dGlsLmFzc2VydFNoYXBlc01hdGNoKCRyZWFsLnNoYXBlLCAkaW1hZy5zaGFwZSwgYHJlYWwgYW5kIGltYWcgc2hhcGVzLCAkeyRyZWFsLnNoYXBlfSBhbmQgJHskaW1hZy5zaGFwZX0sIGAgK1xuICAgICAgICBgbXVzdCBtYXRjaCBpbiBjYWxsIHRvIHRmLmNvbXBsZXgoKS5gKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHJlYWw6ICRyZWFsLCBpbWFnOiAkaW1hZyB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKENvbXBsZXgsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgY29tcGxleCA9IG9wKHsgY29tcGxleF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb21wbGV4LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBDb25jYXQgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yQXJyYXkgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBjbG9uZSB9IGZyb20gJy4vY2xvbmUnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbmNhdGVuYXRlcyBhIGxpc3Qgb2YgYHRmLlRlbnNvcmBzIGFsb25nIGEgZ2l2ZW4gYXhpcy5cbiAqXG4gKiBUaGUgdGVuc29ycyByYW5rcyBhbmQgdHlwZXMgbXVzdCBtYXRjaCwgYW5kIHRoZWlyIHNpemVzIG11c3QgbWF0Y2ggaW4gYWxsXG4gKiBkaW1lbnNpb25zIGV4Y2VwdCBgYXhpc2AuXG4gKlxuICogQWxzbyBhdmFpbGFibGUgYXJlIHN0cmljdGVyIHJhbmstc3BlY2lmaWMgbWV0aG9kcyB0aGF0IGFzc2VydCB0aGF0XG4gKiBgdGVuc29yc2AgYXJlIG9mIHRoZSBnaXZlbiByYW5rOlxuICogICAtIGB0Zi5jb25jYXQxZGBcbiAqICAgLSBgdGYuY29uY2F0MmRgXG4gKiAgIC0gYHRmLmNvbmNhdDNkYFxuICogICAtIGB0Zi5jb25jYXQ0ZGBcbiAqXG4gKiBFeGNlcHQgYHRmLmNvbmNhdDFkYCAod2hpY2ggZG9lcyBub3QgaGF2ZSBheGlzIHBhcmFtKSwgYWxsIG1ldGhvZHMgaGF2ZVxuICogc2FtZSBzaWduYXR1cmUgYXMgdGhpcyBtZXRob2QuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMl0pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFszLCA0XSk7XG4gKiBhLmNvbmNhdChiKS5wcmludCgpOyAgLy8gb3IgYS5jb25jYXQoYilcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDJdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbMywgNF0pO1xuICogY29uc3QgYyA9IHRmLnRlbnNvcjFkKFs1LCA2XSk7XG4gKiB0Zi5jb25jYXQoW2EsIGIsIGNdKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IyZChbWzEsIDJdLCBbMTAsIDIwXV0pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjJkKFtbMywgNF0sIFszMCwgNDBdXSk7XG4gKiBjb25zdCBheGlzID0gMTtcbiAqIHRmLmNvbmNhdChbYSwgYl0sIGF4aXMpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSB0ZW5zb3JzIEEgbGlzdCBvZiB0ZW5zb3JzIHRvIGNvbmNhdGVuYXRlLlxuICogQHBhcmFtIGF4aXMgVGhlIGF4aXMgdG8gY29uY2F0ZSBhbG9uZy4gRGVmYXVsdHMgdG8gMCAodGhlIGZpcnN0IGRpbSkuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnU2xpY2luZyBhbmQgSm9pbmluZyd9XG4gKi9cbmZ1bmN0aW9uIGNvbmNhdF8odGVuc29ycywgYXhpcyA9IDApIHtcbiAgICBhc3NlcnQodGVuc29ycy5sZW5ndGggPj0gMSwgKCkgPT4gJ1Bhc3MgYXQgbGVhc3Qgb25lIHRlbnNvciB0byBjb25jYXQnKTtcbiAgICBjb25zdCAkdGVuc29ycyA9IGNvbnZlcnRUb1RlbnNvckFycmF5KHRlbnNvcnMsICd0ZW5zb3JzJywgJ2NvbmNhdCcsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICAgIGlmICgkdGVuc29yc1swXS5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgJHRlbnNvcnMuZm9yRWFjaCh0ZW5zb3IgPT4ge1xuICAgICAgICAgICAgaWYgKHRlbnNvci5kdHlwZSAhPT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb25jYXRlbmF0ZSBjb21wbGV4NjQgdGVuc29ycyB3aXRoIGEgdGVuc29yXG4gICAgICAgICAgd2l0aCBkdHlwZSAke3RlbnNvci5kdHlwZX0uIGApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKCR0ZW5zb3JzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gY2xvbmUoJHRlbnNvcnNbMF0pO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dHMgPSAkdGVuc29ycztcbiAgICBjb25zdCBhdHRyID0geyBheGlzIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoQ29uY2F0LCBpbnB1dHMsIGF0dHIpO1xufVxuZXhwb3J0IGNvbnN0IGNvbmNhdCA9IG9wKHsgY29uY2F0XyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbmNhdC5qcy5tYXAiLCJpbXBvcnQgeyBjb25jYXQgfSBmcm9tICcuL2NvbmNhdCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29uY2F0ZW5hdGVzIGEgbGlzdCBvZmB0Zi5UZW5zb3IxRGBzIGFsb25nIGFuIGF4aXMuIFNlZSBgY29uY2F0YCBmb3IgZGV0YWlscy5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgaWY6XG4gKiBBOiBzaGFwZSgzKSA9IHxyMSwgZzEsIGIxfFxuICogQjogc2hhcGUoMikgPSB8cjIsIGcyfFxuICogQyA9IHRmLmNvbmNhdDFkKFtBLCBCXSkgPT0gfHIxLCBnMSwgYjEsIHIyLCBnMnxcbiAqXG4gKiBAcGFyYW0gdGVuc29ycyBBIGxpc3Qgb2ZgdGYuVGVuc29yYHMgdG8gY29uY2F0ZW5hdGUuXG4gKiBAcmV0dXJuIFRoZSBjb25jYXRlbmF0ZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGNvbmNhdDFkXyh0ZW5zb3JzKSB7XG4gICAgcmV0dXJuIGNvbmNhdCh0ZW5zb3JzLCAwIC8qIGF4aXMgKi8pO1xufVxuZXhwb3J0IGNvbnN0IGNvbmNhdDFkID0gb3AoeyBjb25jYXQxZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25jYXRfMWQuanMubWFwIiwiaW1wb3J0IHsgY29uY2F0IH0gZnJvbSAnLi9jb25jYXQnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbmNhdGVuYXRlcyBhIGxpc3Qgb2ZgdGYuVGVuc29yMkRgcyBhbG9uZyBhbiBheGlzLiBTZWUgYGNvbmNhdGAgZm9yIGRldGFpbHMuXG4gKlxuICogRm9yIGV4YW1wbGUsIGlmOlxuICogQTogc2hhcGUoMiwgMykgPSB8IHIxLCBnMSwgYjEgfFxuICogICAgICAgICAgICAgICAgICB8IHIyLCBnMiwgYjIgfFxuICpcbiAqIEI6IHNoYXBlKDIsIDMpID0gfCByMywgZzMsIGIzIHxcbiAqICAgICAgICAgICAgICAgICAgfCByNCwgZzQsIGI0IHxcbiAqXG4gKiBDID0gdGYuY29uY2F0MmQoW0EsIEJdLCBheGlzKVxuICpcbiAqIGlmIGF4aXMgPSAwOlxuICogQzogc2hhcGUoNCwgMykgPSB8IHIxLCBnMSwgYjEgfFxuICogICAgICAgICAgICAgICAgICB8IHIyLCBnMiwgYjIgfFxuICogICAgICAgICAgICAgICAgICB8IHIzLCBnMywgYjMgfFxuICogICAgICAgICAgICAgICAgICB8IHI0LCBnNCwgYjQgfFxuICpcbiAqIGlmIGF4aXMgPSAxOlxuICogQyA9IHNoYXBlKDIsIDYpID0gfCByMSwgZzEsIGIxLCByMywgZzMsIGIzIHxcbiAqICAgICAgICAgICAgICAgICAgIHwgcjIsIGcyLCBiMiwgcjQsIGc0LCBiNCB8XG4gKlxuICpcbiAqIEBwYXJhbSB0ZW5zb3JzIEEgbGlzdCBvZiBgdGYuVGVuc29yYHMgdG8gY29uY2F0ZW5hdGUuXG4gKiBAcGFyYW0gYXhpcyBUaGUgYXhpcyB0byBjb25jYXRlbmF0ZSBhbG9uZy5cbiAqIEByZXR1cm4gVGhlIGNvbmNhdGVuYXRlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gY29uY2F0MmRfKHRlbnNvcnMsIGF4aXMpIHtcbiAgICByZXR1cm4gY29uY2F0KHRlbnNvcnMsIGF4aXMpO1xufVxuZXhwb3J0IGNvbnN0IGNvbmNhdDJkID0gb3AoeyBjb25jYXQyZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25jYXRfMmQuanMubWFwIiwiaW1wb3J0IHsgY29uY2F0IH0gZnJvbSAnLi9jb25jYXQnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbmNhdGVuYXRlcyBhIGxpc3Qgb2YgYHRmLlRlbnNvcjNEYHMgYWxvbmcgYW4gYXhpcy5cbiAqIFNlZSBgY29uY2F0YCBmb3IgZGV0YWlscy5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgaWY6XG4gKiBBOiBzaGFwZSgyLCAxLCAzKSA9IHwgcjEsIGcxLCBiMSB8XG4gKiAgICAgICAgICAgICAgICAgICAgIHwgcjIsIGcyLCBiMiB8XG4gKlxuICogQjogc2hhcGUoMiwgMSwgMykgPSB8IHIzLCBnMywgYjMgfFxuICogICAgICAgICAgICAgICAgICAgICB8IHI0LCBnNCwgYjQgfFxuICpcbiAqIEMgPSB0Zi5jb25jYXQzZChbQSwgQl0sIGF4aXMpXG4gKlxuICogaWYgYXhpcyA9IDA6XG4gKiBDOiBzaGFwZSg0LCAxLCAzKSA9IHwgcjEsIGcxLCBiMSB8XG4gKiAgICAgICAgICAgICAgICAgICAgIHwgcjIsIGcyLCBiMiB8XG4gKiAgICAgICAgICAgICAgICAgICAgIHwgcjMsIGczLCBiMyB8XG4gKiAgICAgICAgICAgICAgICAgICAgIHwgcjQsIGc0LCBiNCB8XG4gKlxuICogaWYgYXhpcyA9IDE6XG4gKiBDOiBzaGFwZSgyLCAyLCAzKSA9IHwgcjEsIGcxLCBiMSwgcjMsIGczLCBiMyB8XG4gKiAgICAgICAgICAgICAgICAgICAgIHwgcjIsIGcyLCBiMiwgcjQsIGc0LCBiNCB8XG4gKlxuICogaWYgYXhpcyA9IDI6XG4gKiBDID0gc2hhcGUoMiwgMSwgNikgPSB8IHIxLCBnMSwgYjEsIHIzLCBnMywgYjMgfFxuICogICAgICAgICAgICAgICAgICAgICAgfCByMiwgZzIsIGIyLCByNCwgZzQsIGI0IHxcbiAqXG4gKiBAcGFyYW0gdGVuc29ycyBBIGxpc3Qgb2ZgdGYuVGVuc29yYHMgdG8gY29uY2F0ZW5hdGUuXG4gKiBAcGFyYW0gYXhpcyBUaGUgYXhpcyB0byBjb25jYXRlIGFsb25nLlxuICogQHJldHVybiBUaGUgY29uY2F0ZW5hdGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBjb25jYXQzZF8odGVuc29ycywgYXhpcykge1xuICAgIHJldHVybiBjb25jYXQodGVuc29ycywgYXhpcyk7XG59XG5leHBvcnQgY29uc3QgY29uY2F0M2QgPSBvcCh7IGNvbmNhdDNkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbmNhdF8zZC5qcy5tYXAiLCJpbXBvcnQgeyBjb25jYXQgfSBmcm9tICcuL2NvbmNhdCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29uY2F0ZW5hdGVzIGEgbGlzdCBvZiBgdGYuVGVuc29yNERgcyBhbG9uZyBhbiBheGlzLlxuICogU2VlIGBjb25jYXRgIGZvciBkZXRhaWxzLlxuICpcbiAqIEBwYXJhbSB0ZW5zb3JzIEEgbGlzdCBvZiBgdGYuVGVuc29yYHMgdG8gY29uY2F0ZW5hdGUuXG4gKiBAcGFyYW0gYXhpcyBUaGUgYXhpcyB0byBjb25jYXRlIGFsb25nLlxuICogQHJldHVybiBUaGUgY29uY2F0ZW5hdGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBjb25jYXQ0ZF8odGVuc29ycywgYXhpcykge1xuICAgIHJldHVybiBjb25jYXQodGVuc29ycywgYXhpcyk7XG59XG5leHBvcnQgY29uc3QgY29uY2F0NGQgPSBvcCh7IGNvbmNhdDRkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbmNhdF80ZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFBhcmFtc0NvbnNpc3RlbnQoc2hhcGVzLCBheGlzKSB7XG4gICAgY29uc3QgcmFuayA9IHNoYXBlc1swXS5sZW5ndGg7XG4gICAgc2hhcGVzLmZvckVhY2goKHNoYXBlLCBpKSA9PiB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHNoYXBlLmxlbmd0aCA9PT0gcmFuaywgKCkgPT4gYEVycm9yIGluIGNvbmNhdCR7cmFua31EOiByYW5rIG9mIHRlbnNvcnNbJHtpfV0gbXVzdCBiZSB0aGUgc2FtZSBgICtcbiAgICAgICAgICAgIGBhcyB0aGUgcmFuayBvZiB0aGUgcmVzdCAoJHtyYW5rfSlgKTtcbiAgICB9KTtcbiAgICB1dGlsLmFzc2VydChheGlzID49IDAgJiYgYXhpcyA8IHJhbmssICgpID0+IGBFcnJvciBpbiBjb25jYXQke3Jhbmt9RDogYXhpcyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgJHtyYW5rIC0gMX0uYCk7XG4gICAgY29uc3QgZmlyc3RTaGFwZSA9IHNoYXBlc1swXTtcbiAgICBzaGFwZXMuZm9yRWFjaCgoc2hhcGUsIGkpID0+IHtcbiAgICAgICAgZm9yIChsZXQgciA9IDA7IHIgPCByYW5rOyByKyspIHtcbiAgICAgICAgICAgIHV0aWwuYXNzZXJ0KChyID09PSBheGlzKSB8fCAoc2hhcGVbcl0gPT09IGZpcnN0U2hhcGVbcl0pLCAoKSA9PiBgRXJyb3IgaW4gY29uY2F0JHtyYW5rfUQ6IFNoYXBlIG9mIHRlbnNvcnNbJHtpfV0gKCR7c2hhcGV9KSBgICtcbiAgICAgICAgICAgICAgICBgZG9lcyBub3QgbWF0Y2ggdGhlIHNoYXBlIG9mIHRoZSByZXN0ICgke2ZpcnN0U2hhcGV9KSBgICtcbiAgICAgICAgICAgICAgICBgYWxvbmcgdGhlIG5vbi1jb25jYXRlbmF0ZWQgYXhpcyAke2l9LmApO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZU91dFNoYXBlKHNoYXBlcywgYXhpcykge1xuICAgIGNvbnN0IG91dHB1dFNoYXBlID0gc2hhcGVzWzBdLnNsaWNlKCk7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzaGFwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgb3V0cHV0U2hhcGVbYXhpc10gKz0gc2hhcGVzW2ldW2F4aXNdO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0U2hhcGU7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25jYXRfdXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IGNhc3QgfSBmcm9tICcuL2Nhc3QnO1xuaW1wb3J0IHsgbWF0TXVsIH0gZnJvbSAnLi9tYXRfbXVsJztcbmltcG9ydCB7IG9uZUhvdCB9IGZyb20gJy4vb25lX2hvdCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHRyYW5zcG9zZSB9IGZyb20gJy4vdHJhbnNwb3NlJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIGNvbmZ1c2lvbiBtYXRyaXggZnJvbSB0cnVlIGxhYmVscyBhbmQgcHJlZGljdGVkIGxhYmVscy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbGFiZWxzID0gdGYudGVuc29yMWQoWzAsIDEsIDIsIDEsIDBdLCAnaW50MzInKTtcbiAqIGNvbnN0IHByZWRpY3Rpb25zID0gdGYudGVuc29yMWQoWzAsIDIsIDIsIDEsIDBdLCAnaW50MzInKTtcbiAqIGNvbnN0IG51bUNsYXNzZXMgPSAzO1xuICogY29uc3Qgb3V0ID0gdGYubWF0aC5jb25mdXNpb25NYXRyaXgobGFiZWxzLCBwcmVkaWN0aW9ucywgbnVtQ2xhc3Nlcyk7XG4gKiBvdXQucHJpbnQoKTtcbiAqIC8vIEV4cGVjdGVkIG91dHB1dCBtYXRyaXg6XG4gKiAvLyBbWzIsIDAsIDBdLFxuICogLy8gIFswLCAxLCAxXSxcbiAqIC8vICBbMCwgMCwgMV1dXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gbGFiZWxzIFRoZSB0YXJnZXQgbGFiZWxzLCBhc3N1bWVkIHRvIGJlIDAtYmFzZWQgaW50ZWdlcnNcbiAqICAgZm9yIHRoZSBjbGFzc2VzLiBUaGUgc2hhcGUgaXMgYFtudW1FeGFtcGxlc11gLCB3aGVyZVxuICogICBgbnVtRXhhbXBsZXNgIGlzIHRoZSBudW1iZXIgb2YgZXhhbXBsZXMgaW5jbHVkZWQuXG4gKiBAcGFyYW0gcHJlZGljdGlvbnMgVGhlIHByZWRpY3RlZCBjbGFzc2VzLCBhc3N1bWVkIHRvIGJlXG4gKiAgIDAtYmFzZWQgaW50ZWdlcnMgZm9yIHRoZSBjbGFzc2VzLiBNdXN0IGhhdmUgdGhlIHNhbWUgc2hhcGUgYXMgYGxhYmVsc2AuXG4gKiBAcGFyYW0gbnVtQ2xhc3NlcyBOdW1iZXIgb2YgYWxsIGNsYXNzZXMsIGFzIGFuIGludGVnZXIuXG4gKiAgIEl0cyB2YWx1ZSBtdXN0IGJlIGxhcmdlciB0aGFuIHRoZSBsYXJnZXN0IGVsZW1lbnQgaW4gYGxhYmVsc2AgYW5kXG4gKiAgIGBwcmVkaWN0aW9uc2AuXG4gKiBAcmV0dXJucyBUaGUgY29uZnVzaW9uIG1hdHJpeCBhcyBhIGludDMyLXR5cGUgMkQgdGVuc29yLiBUaGUgdmFsdWUgYXRcbiAqICAgcm93IGByYCBhbmQgY29sdW1uIGBjYCBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIGV4YW1wbGVzIG9mIGFjdHVhbCBjbGFzc1xuICogICBgcmAgd2VyZSBwcmVkaWN0ZWQgYXMgY2xhc3MgYGNgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0V2YWx1YXRpb24nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uZnVzaW9uTWF0cml4XyhsYWJlbHMsIHByZWRpY3Rpb25zLCBudW1DbGFzc2VzKSB7XG4gICAgY29uc3QgJGxhYmVscyA9IGNvbnZlcnRUb1RlbnNvcihsYWJlbHMsICdsYWJlbHMnLCAnY29uZnVzaW9uTWF0cml4Jyk7XG4gICAgY29uc3QgJHByZWRpY3Rpb25zID0gY29udmVydFRvVGVuc29yKHByZWRpY3Rpb25zLCAncHJlZGljdGlvbnMnLCAnY29uZnVzaW9uTWF0cml4Jyk7XG4gICAgdXRpbC5hc3NlcnQobnVtQ2xhc3NlcyA9PSBudWxsIHx8IG51bUNsYXNzZXMgPiAwICYmIE51bWJlci5pc0ludGVnZXIobnVtQ2xhc3NlcyksICgpID0+IGBJZiBwcm92aWRlZCwgbnVtQ2xhc3NlcyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciwgYCArXG4gICAgICAgIGBidXQgZ290ICR7bnVtQ2xhc3Nlc31gKTtcbiAgICB1dGlsLmFzc2VydCgkbGFiZWxzLnJhbmsgPT09IDEsICgpID0+IGBFeHBlY3RlZCB0aGUgcmFuayBvZiBsYWJlbHMgdG8gYmUgMSwgYnV0IGdvdCAkeyRsYWJlbHMucmFua31gKTtcbiAgICB1dGlsLmFzc2VydCgkcHJlZGljdGlvbnMucmFuayA9PT0gMSwgKCkgPT4gYEV4cGVjdGVkIHRoZSByYW5rIG9mIHByZWRpY3Rpb25zIHRvIGJlIDEsIGAgK1xuICAgICAgICBgYnV0IGdvdCAkeyRwcmVkaWN0aW9ucy5yYW5rfWApO1xuICAgIHV0aWwuYXNzZXJ0KCRsYWJlbHMuc2hhcGVbMF0gPT09ICRwcmVkaWN0aW9ucy5zaGFwZVswXSwgKCkgPT4gYE1pc21hdGNoIGluIHRoZSBudW1iZXIgb2YgZXhhbXBsZXM6IGAgK1xuICAgICAgICBgJHskbGFiZWxzLnNoYXBlWzBdfSB2cy4gJHskcHJlZGljdGlvbnMuc2hhcGVbMF19LiBgICtcbiAgICAgICAgYExhYmVscyBhbmQgcHJlZGljdGlvbnMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGVsZW1lbnRzLmApO1xuICAgIHV0aWwuYXNzZXJ0KG51bUNsYXNzZXMgPiAwICYmIE51bWJlci5pc0ludGVnZXIobnVtQ2xhc3NlcyksICgpID0+IGBudW1DbGFzc2VzIGlzIHJlcXVpcmVkIHRvIGJlIGEgcG9zaXRpdmUgaW50ZWdlciwgYnV0IGdvdCBgICtcbiAgICAgICAgYCR7bnVtQ2xhc3Nlc31gKTtcbiAgICAvLyBUT0RPKGNhaXMpOiBJbiB0aGUgZnV0dXJlLCBpZiBvbmVIb3Qgc3VwcG9ydHMgdGVuc29ycyBpbnB1dHMgZm9yXG4gICAgLy8gICBgbnVtQ2xhc3Nlc2AsIGBjb25mdXNpb25NYXRyaXhgIGNhbiBtYWtlIGBudW1DbGFzc2VzYCBvcHRpb25hbC5cbiAgICBjb25zdCBvbmVIb3RMYWJlbHMgPSBvbmVIb3QoY2FzdCgkbGFiZWxzLCAnaW50MzInKSwgbnVtQ2xhc3Nlcyk7XG4gICAgY29uc3Qgb25lSG90UHJlZGljdGlvbnMgPSBvbmVIb3QoY2FzdCgkcHJlZGljdGlvbnMsICdpbnQzMicpLCBudW1DbGFzc2VzKTtcbiAgICBjb25zdCBvbmVIb3RMYWJlbHNUID0gdHJhbnNwb3NlKG9uZUhvdExhYmVscyk7XG4gICAgY29uc3QgcHJvZHVjdCA9IG1hdE11bChvbmVIb3RMYWJlbHNULCBvbmVIb3RQcmVkaWN0aW9ucyk7XG4gICAgcmV0dXJuIGNhc3QocHJvZHVjdCwgJ2ludDMyJyk7XG59XG5leHBvcnQgY29uc3QgY29uZnVzaW9uTWF0cml4ID0gb3AoeyBjb25mdXNpb25NYXRyaXhfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uZnVzaW9uX21hdHJpeC5qcy5tYXAiLCJpbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IGNvbnYyZCB9IGZyb20gJy4vY29udjJkJztcbmltcG9ydCAqIGFzIGNvbnZfdXRpbCBmcm9tICcuL2NvbnZfdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL3Jlc2hhcGUnO1xuLyoqXG4gKiBDb21wdXRlcyBhIDFEIGNvbnZvbHV0aW9uIG92ZXIgdGhlIGlucHV0IHguXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciwgb2YgcmFuayAzIG9yIHJhbmsgMiwgb2Ygc2hhcGVcbiAqICAgICBgW2JhdGNoLCB3aWR0aCwgaW5DaGFubmVsc11gLiBJZiByYW5rIDIsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciwgcmFuayAzLCBvZiBzaGFwZVxuICogICAgIGBbZmlsdGVyV2lkdGgsIGluRGVwdGgsIG91dERlcHRoXWAuXG4gKiBAcGFyYW0gc3RyaWRlIFRoZSBudW1iZXIgb2YgZW50cmllcyBieSB3aGljaCB0aGUgZmlsdGVyIGlzIG1vdmVkIHJpZ2h0IGF0XG4gKiAgICAgZWFjaCBzdGVwLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobS5cbiAqICAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAtIEZvciBtb3JlIGluZm8sIHNlZSB0aGlzIGd1aWRlOlxuICogICAgIFtodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb25dKFxuICogICAgICAgICAgaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uKVxuICogQHBhcmFtIGRhdGFGb3JtYXQgQW4gb3B0aW9uYWwgc3RyaW5nIGZyb20gXCJOV0NcIiwgXCJOQ1dcIi4gRGVmYXVsdHMgdG8gXCJOV0NcIixcbiAqICAgICB0aGUgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIG9yZGVyIG9mIFtiYXRjaCwgaW5fd2lkdGgsIGluX2NoYW5uZWxzXS4gT25seVxuICogICAgIFwiTldDXCIgaXMgY3VycmVudGx5IHN1cHBvcnRlZC5cbiAqIEBwYXJhbSBkaWxhdGlvbiBUaGUgZGlsYXRpb24gcmF0ZSBpbiB3aGljaCB3ZSBzYW1wbGUgaW5wdXQgdmFsdWVzIGluXG4gKiAgICAgYXRyb3VzIGNvbnZvbHV0aW9uLiBEZWZhdWx0cyB0byBgMWAuIElmIGl0IGlzIGdyZWF0ZXIgdGhhbiAxLCB0aGVuXG4gKiAgICAgc3RyaWRlIG11c3QgYmUgYDFgLlxuICogQHBhcmFtIGRpbVJvdW5kaW5nTW9kZSBBIHN0cmluZyBmcm9tOiAnY2VpbCcsICdyb3VuZCcsICdmbG9vcicuIElmIG5vbmUgaXNcbiAqICAgICBwcm92aWRlZCwgaXQgd2lsbCBkZWZhdWx0IHRvIHRydW5jYXRlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0NvbnZvbHV0aW9uJ31cbiAqL1xuZnVuY3Rpb24gY29udjFkXyh4LCBmaWx0ZXIsIHN0cmlkZSwgcGFkLCBkYXRhRm9ybWF0ID0gJ05XQycsIGRpbGF0aW9uID0gMSwgZGltUm91bmRpbmdNb2RlKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnY29udjFkJyk7XG4gICAgY29uc3QgJGZpbHRlciA9IGNvbnZlcnRUb1RlbnNvcihmaWx0ZXIsICdmaWx0ZXInLCAnY29udjFkJyk7XG4gICAgbGV0IHgzRCA9ICR4O1xuICAgIGxldCByZXNoYXBlZFRvM0QgPSBmYWxzZTtcbiAgICBpZiAoJHgucmFuayA9PT0gMikge1xuICAgICAgICByZXNoYXBlZFRvM0QgPSB0cnVlO1xuICAgICAgICB4M0QgPSByZXNoYXBlKCR4LCBbMSwgJHguc2hhcGVbMF0sICR4LnNoYXBlWzFdXSk7XG4gICAgfVxuICAgIHV0aWwuYXNzZXJ0KHgzRC5yYW5rID09PSAzLCAoKSA9PiBgRXJyb3IgaW4gY29udjFkOiBpbnB1dCBtdXN0IGJlIHJhbmsgMywgYnV0IGdvdCByYW5rICR7eDNELnJhbmt9LmApO1xuICAgIHV0aWwuYXNzZXJ0KCRmaWx0ZXIucmFuayA9PT0gMywgKCkgPT4gYEVycm9yIGluIGNvbnYxZDogZmlsdGVyIG11c3QgYmUgcmFuayAzLCBidXQgZ290IHJhbmsgYCArXG4gICAgICAgIGAkeyRmaWx0ZXIucmFua30uYCk7XG4gICAgaWYgKGRpbVJvdW5kaW5nTW9kZSAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNJbnQocGFkKSwgKCkgPT4gYEVycm9yIGluIGNvbnYxZDogcGFkIG11c3QgYmUgYW4gaW50ZWdlciB3aGVuIHVzaW5nLCBgICtcbiAgICAgICAgICAgIGBkaW1Sb3VuZGluZ01vZGUgJHtkaW1Sb3VuZGluZ01vZGV9IGJ1dCBnb3QgcGFkICR7cGFkfS5gKTtcbiAgICB9XG4gICAgdXRpbC5hc3NlcnQoeDNELnNoYXBlWzJdID09PSAkZmlsdGVyLnNoYXBlWzFdLCAoKSA9PiBgRXJyb3IgaW4gY29udjFkOiBkZXB0aCBvZiBpbnB1dCAoJHt4M0Quc2hhcGVbMl19KSBtdXN0IG1hdGNoIGAgK1xuICAgICAgICBgaW5wdXQgZGVwdGggZm9yIGZpbHRlciAkeyRmaWx0ZXIuc2hhcGVbMV19LmApO1xuICAgIHV0aWwuYXNzZXJ0KGNvbnZfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlLCBkaWxhdGlvbiksICgpID0+ICdFcnJvciBpbiBjb252MUQ6IEVpdGhlciBzdHJpZGUgb3IgZGlsYXRpb24gbXVzdCBiZSAxLiAnICtcbiAgICAgICAgYEdvdCBzdHJpZGUgJHtzdHJpZGV9IGFuZCBkaWxhdGlvbiAnJHtkaWxhdGlvbn0nYCk7XG4gICAgdXRpbC5hc3NlcnQoZGF0YUZvcm1hdCA9PT0gJ05XQycsICgpID0+IGBFcnJvciBpbiBjb252MWQ6IGdvdCBkYXRhRm9ybWF0IG9mICR7ZGF0YUZvcm1hdH0gYnV0IG9ubHkgTldDIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQuYCk7XG4gICAgY29uc3QgZmlsdGVyNEQgPSByZXNoYXBlKCRmaWx0ZXIsIFsxLCAkZmlsdGVyLnNoYXBlWzBdLCAkZmlsdGVyLnNoYXBlWzFdLCAkZmlsdGVyLnNoYXBlWzJdXSk7XG4gICAgY29uc3QgaW5wdXQ0RCA9IHJlc2hhcGUoeDNELCBbeDNELnNoYXBlWzBdLCAxLCB4M0Quc2hhcGVbMV0sIHgzRC5zaGFwZVsyXV0pO1xuICAgIGNvbnN0IHN0cmlkZXMgPSBbMSwgc3RyaWRlXTtcbiAgICBjb25zdCBkaWxhdGlvbnMgPSBbMSwgZGlsYXRpb25dO1xuICAgIGNvbnN0IGNvbnYyZERhdGFGb3JtYXQgPSAnTkhXQyc7XG4gICAgY29uc3QgcmVzID0gY29udjJkKGlucHV0NEQsIGZpbHRlcjRELCBzdHJpZGVzLCBwYWQsIGNvbnYyZERhdGFGb3JtYXQsIGRpbGF0aW9ucywgZGltUm91bmRpbmdNb2RlKTtcbiAgICBpZiAocmVzaGFwZWRUbzNEKSB7XG4gICAgICAgIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdXSk7XG4gICAgfVxuICAgIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVswXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKTtcbn1cbmV4cG9ydCBjb25zdCBjb252MWQgPSBvcCh7IGNvbnYxZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb252MWQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IENvbnYyRCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCAqIGFzIGNvbnZfdXRpbCBmcm9tICcuL2NvbnZfdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL3Jlc2hhcGUnO1xuLyoqXG4gKiBDb21wdXRlcyBhIDJEIGNvbnZvbHV0aW9uIG92ZXIgdGhlIGlucHV0IHguXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciwgb2YgcmFuayA0IG9yIHJhbmsgMywgb2Ygc2hhcGVcbiAqICAgICBgW2JhdGNoLCBoZWlnaHQsIHdpZHRoLCBpbkNoYW5uZWxzXWAuIElmIHJhbmsgMywgYmF0Y2ggb2YgMSBpc1xuICogYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciwgcmFuayA0LCBvZiBzaGFwZVxuICogICAgIGBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5EZXB0aCwgb3V0RGVwdGhdYC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBjb252b2x1dGlvbjogYFtzdHJpZGVIZWlnaHQsXG4gKiBzdHJpZGVXaWR0aF1gLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobS5cbiAqICAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAtIEZvciBtb3JlIGluZm8sIHNlZSB0aGlzIGd1aWRlOlxuICogICAgIFtodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb25dKFxuICogICAgICAgICAgaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uKVxuICogQHBhcmFtIGRhdGFGb3JtYXQ6IEFuIG9wdGlvbmFsIHN0cmluZyBmcm9tOiBcIk5IV0NcIiwgXCJOQ0hXXCIuIERlZmF1bHRzIHRvXG4gKiAgICAgXCJOSFdDXCIuIFNwZWNpZnkgdGhlIGRhdGEgZm9ybWF0IG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEuIFdpdGggdGhlXG4gKiAgICAgZGVmYXVsdCBmb3JtYXQgXCJOSFdDXCIsIHRoZSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgb3JkZXIgb2Y6IFtiYXRjaCxcbiAqICAgICBoZWlnaHQsIHdpZHRoLCBjaGFubmVsc10uXG4gKiBAcGFyYW0gZGlsYXRpb25zIFRoZSBkaWxhdGlvbiByYXRlczogYFtkaWxhdGlvbkhlaWdodCwgZGlsYXRpb25XaWR0aF1gXG4gKiAgICAgaW4gd2hpY2ggd2Ugc2FtcGxlIGlucHV0IHZhbHVlcyBhY3Jvc3MgdGhlIGhlaWdodCBhbmQgd2lkdGggZGltZW5zaW9uc1xuICogICAgIGluIGF0cm91cyBjb252b2x1dGlvbi4gRGVmYXVsdHMgdG8gYFsxLCAxXWAuIElmIGBkaWxhdGlvbnNgIGlzIGEgc2luZ2xlXG4gKiAgICAgbnVtYmVyLCB0aGVuIGBkaWxhdGlvbkhlaWdodCA9PSBkaWxhdGlvbldpZHRoYC4gSWYgaXQgaXMgZ3JlYXRlciB0aGFuXG4gKiAgICAgMSwgdGhlbiBhbGwgdmFsdWVzIG9mIGBzdHJpZGVzYCBtdXN0IGJlIDEuXG4gKiBAcGFyYW0gZGltUm91bmRpbmdNb2RlIEEgc3RyaW5nIGZyb206ICdjZWlsJywgJ3JvdW5kJywgJ2Zsb29yJy4gSWYgbm9uZSBpc1xuICogICAgIHByb3ZpZGVkLCBpdCB3aWxsIGRlZmF1bHQgdG8gdHJ1bmNhdGUuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQ29udm9sdXRpb24nfVxuICovXG5mdW5jdGlvbiBjb252MmRfKHgsIGZpbHRlciwgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0ID0gJ05IV0MnLCBkaWxhdGlvbnMgPSBbMSwgMV0sIGRpbVJvdW5kaW5nTW9kZSkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2NvbnYyZCcpO1xuICAgIGNvbnN0ICRmaWx0ZXIgPSBjb252ZXJ0VG9UZW5zb3IoZmlsdGVyLCAnZmlsdGVyJywgJ2NvbnYyZCcpO1xuICAgIGxldCB4NEQgPSAkeDtcbiAgICBsZXQgcmVzaGFwZWRUbzREID0gZmFsc2U7XG4gICAgaWYgKCR4LnJhbmsgPT09IDMpIHtcbiAgICAgICAgcmVzaGFwZWRUbzREID0gdHJ1ZTtcbiAgICAgICAgeDREID0gcmVzaGFwZSgkeCwgWzEsICR4LnNoYXBlWzBdLCAkeC5zaGFwZVsxXSwgJHguc2hhcGVbMl1dKTtcbiAgICB9XG4gICAgdXRpbC5hc3NlcnQoeDRELnJhbmsgPT09IDQsICgpID0+IGBFcnJvciBpbiBjb252MmQ6IGlucHV0IG11c3QgYmUgcmFuayA0LCBidXQgZ290IHJhbmsgJHt4NEQucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoJGZpbHRlci5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gY29udjJkOiBmaWx0ZXIgbXVzdCBiZSByYW5rIDQsIGJ1dCBnb3QgcmFuayBgICtcbiAgICAgICAgYCR7JGZpbHRlci5yYW5rfS5gKTtcbiAgICBpZiAoZGltUm91bmRpbmdNb2RlICE9IG51bGwpIHtcbiAgICAgICAgdXRpbC5hc3NlcnQodXRpbC5pc0ludChwYWQpLCAoKSA9PiBgRXJyb3IgaW4gY29udjJkOiBwYWQgbXVzdCBiZSBhbiBpbnRlZ2VyIHdoZW4gdXNpbmcsIGAgK1xuICAgICAgICAgICAgYGRpbVJvdW5kaW5nTW9kZSAke2RpbVJvdW5kaW5nTW9kZX0gYnV0IGdvdCBwYWQgJHtwYWR9LmApO1xuICAgIH1cbiAgICBjb25zdCBpbkRlcHRoID0gZGF0YUZvcm1hdCA9PT0gJ05IV0MnID8geDRELnNoYXBlWzNdIDogeDRELnNoYXBlWzFdO1xuICAgIHV0aWwuYXNzZXJ0KGluRGVwdGggPT09ICRmaWx0ZXIuc2hhcGVbMl0sICgpID0+IGBFcnJvciBpbiBjb252MmQ6IGRlcHRoIG9mIGlucHV0ICgke2luRGVwdGh9KSBtdXN0IG1hdGNoIGAgK1xuICAgICAgICBgaW5wdXQgZGVwdGggZm9yIGZpbHRlciAkeyRmaWx0ZXIuc2hhcGVbMl19LmApO1xuICAgIHV0aWwuYXNzZXJ0KGNvbnZfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgZGlsYXRpb25zKSwgKCkgPT4gJ0Vycm9yIGluIGNvbnYyRDogRWl0aGVyIHN0cmlkZXMgb3IgZGlsYXRpb25zIG11c3QgYmUgMS4gJyArXG4gICAgICAgIGBHb3Qgc3RyaWRlcyAke3N0cmlkZXN9IGFuZCBkaWxhdGlvbnMgJyR7ZGlsYXRpb25zfSdgKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6IHg0RCwgZmlsdGVyOiAkZmlsdGVyIH07XG4gICAgY29uc3QgYXR0cnMgPSB7IHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGlsYXRpb25zLCBkaW1Sb3VuZGluZ01vZGUgfTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgY29uc3QgcmVzID0gRU5HSU5FLnJ1bktlcm5lbChDb252MkQsIGlucHV0cywgYXR0cnMpO1xuICAgIGlmIChyZXNoYXBlZFRvNEQpIHtcbiAgICAgICAgcmV0dXJuIHJlc2hhcGUocmVzLCBbcmVzLnNoYXBlWzFdLCByZXMuc2hhcGVbMl0sIHJlcy5zaGFwZVszXV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IGNvbnYyZCA9IG9wKHsgY29udjJkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnYyZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgQ29udjJEQmFja3Byb3BGaWx0ZXIgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vcmVzaGFwZSc7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBkZXJpdmF0aXZlIG9mIHRoZSBmaWx0ZXIgb2YgYSAyRCBjb252b2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDQgb3IgcmFuayAzIG9mIHNoYXBlXG4gKiAgICAgW2JhdGNoLCBoZWlnaHQsIHdpZHRoLCBpbkNoYW5uZWxzXS4gSWYgcmFuayAzLCBiYXRjaCBvZiAxIGlzIGFzc3VtZWQuXG4gKiBAcGFyYW0gZHkgVGhlIGR5IGltYWdlLCBvZiByYW5rIDQgb3IgcmFuayAzLCBvZiBzaGFwZVxuICogICAgIFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgb3V0RGVwdGhdLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXJTaGFwZSBUaGUgc2hhcGUgb2YgdGhlIGZpbHRlciwgbGVuZ3RoIDQsXG4gKiAgICAgW2ZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGluRGVwdGgsIG91dERlcHRoXS5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBjb252b2x1dGlvbjogW3N0cmlkZUhlaWdodCxcbiAqIHN0cmlkZVdpZHRoXS5cbiAqIEBwYXJhbSBwYWQgQSBzdHJpbmcgZnJvbTogJ3NhbWUnLCAndmFsaWQnLiBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobVxuICogICAgIHVzZWQgaW4gdGhlIGZvcndhcmQgcHJvcCBvZiB0aGUgb3AuXG4gKiBAcGFyYW0gZGF0YUZvcm1hdDogQW4gb3B0aW9uYWwgc3RyaW5nIGZyb206IFwiTkhXQ1wiLCBcIk5DSFdcIi4gRGVmYXVsdHMgdG9cbiAqICAgICBcIk5IV0NcIi4gU3BlY2lmeSB0aGUgZGF0YSBmb3JtYXQgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YS4gV2l0aCB0aGVcbiAqICAgICBkZWZhdWx0IGZvcm1hdCBcIk5IV0NcIiwgdGhlIGRhdGEgaXMgc3RvcmVkIGluIHRoZSBvcmRlciBvZjogW2JhdGNoLFxuICogICAgIGhlaWdodCwgd2lkdGgsIGNoYW5uZWxzXS5cbiAqIEBwYXJhbSBkaW1Sb3VuZGluZ01vZGUgQSBzdHJpbmcgZnJvbTogJ2NlaWwnLCAncm91bmQnLCAnZmxvb3InLiBJZiBub25lIGlzXG4gKiAgICAgcHJvdmlkZWQsIGl0IHdpbGwgZGVmYXVsdCB0byB0cnVuY2F0ZS5cbiAqL1xuZnVuY3Rpb24gY29udjJEQmFja3Byb3BGaWx0ZXJfKHgsIGR5LCBmaWx0ZXJTaGFwZSwgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0ID0gJ05IV0MnLCBkaW1Sb3VuZGluZ01vZGUpIHtcbiAgICBsZXQgeDREID0geDtcbiAgICBpZiAoeC5yYW5rID09PSAzKSB7XG4gICAgICAgIHg0RCA9IHJlc2hhcGUoeCwgWzEsIHguc2hhcGVbMF0sIHguc2hhcGVbMV0sIHguc2hhcGVbMl1dKTtcbiAgICB9XG4gICAgbGV0IGR5NEQgPSBkeTtcbiAgICBpZiAoZHk0RC5yYW5rID09PSAzKSB7XG4gICAgICAgIGR5NEQgPSByZXNoYXBlKGR5LCBbMSwgZHkuc2hhcGVbMF0sIGR5LnNoYXBlWzFdLCBkeS5zaGFwZVsyXV0pO1xuICAgIH1cbiAgICB1dGlsLmFzc2VydCh4NEQucmFuayA9PT0gNCwgKCkgPT4gYEVycm9yIGluIGNvbnYyZERlckZpbHRlcjogaW5wdXQgbXVzdCBiZSByYW5rIDQsIGJ1dCBnb3Qgc2hhcGUgYCArXG4gICAgICAgIGAke3g0RC5zaGFwZX0uYCk7XG4gICAgdXRpbC5hc3NlcnQoZHk0RC5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gY29udjJkRGVyRmlsdGVyOiBkeSBtdXN0IGJlIHJhbmsgNCwgYnV0IGdvdCBzaGFwZSBgICtcbiAgICAgICAgYCR7ZHk0RC5zaGFwZX0uYCk7XG4gICAgdXRpbC5hc3NlcnQoZmlsdGVyU2hhcGUubGVuZ3RoID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gY29udjJkRGVyRmlsdGVyOiBmaWx0ZXJTaGFwZSBtdXN0IGJlIGxlbmd0aCA0LCBidXQgZ290IGAgK1xuICAgICAgICBgJHtmaWx0ZXJTaGFwZX0uYCk7XG4gICAgY29uc3QgaW5EZXB0aCA9IGRhdGFGb3JtYXQgPT09ICdOSFdDJyA/IHg0RC5zaGFwZVszXSA6IHg0RC5zaGFwZVsxXTtcbiAgICBjb25zdCBvdXREZXB0aCA9IGRhdGFGb3JtYXQgPT09ICdOSFdDJyA/IGR5NEQuc2hhcGVbM10gOiBkeTRELnNoYXBlWzFdO1xuICAgIHV0aWwuYXNzZXJ0KGluRGVwdGggPT09IGZpbHRlclNoYXBlWzJdLCAoKSA9PiBgRXJyb3IgaW4gY29udjJkRGVyRmlsdGVyOiBkZXB0aCBvZiBpbnB1dCAke2luRGVwdGh9KSBtdXN0IGAgK1xuICAgICAgICBgbWF0Y2ggaW5wdXQgZGVwdGggaW4gZmlsdGVyICgke2ZpbHRlclNoYXBlWzJdfS5gKTtcbiAgICB1dGlsLmFzc2VydChvdXREZXB0aCA9PT0gZmlsdGVyU2hhcGVbM10sICgpID0+IGBFcnJvciBpbiBjb252MmREZXJGaWx0ZXI6IGRlcHRoIG9mIGR5ICgke291dERlcHRofSkgbXVzdCBgICtcbiAgICAgICAgYG1hdGNoIG91dHB1dCBkZXB0aCBmb3IgZmlsdGVyICgke2ZpbHRlclNoYXBlWzNdfSkuYCk7XG4gICAgaWYgKGRpbVJvdW5kaW5nTW9kZSAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNJbnQocGFkKSwgKCkgPT4gYEVycm9yIGluIGNvbnYyZERlckZpbHRlcjogcGFkIG11c3QgYmUgYW4gaW50ZWdlciB3aGVuIHVzaW5nLCBgICtcbiAgICAgICAgICAgIGBkaW1Sb3VuZGluZ01vZGUgJHtkaW1Sb3VuZGluZ01vZGV9IGJ1dCBnb3QgcGFkICR7cGFkfS5gKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiB4NEQsIGR5OiBkeTREIH07XG4gICAgY29uc3QgYXR0cnMgPSB7IHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGltUm91bmRpbmdNb2RlLCBmaWx0ZXJTaGFwZSB9O1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChDb252MkRCYWNrcHJvcEZpbHRlciwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgY29udjJEQmFja3Byb3BGaWx0ZXIgPSBvcCh7IGNvbnYyREJhY2twcm9wRmlsdGVyXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnYyZF9iYWNrcHJvcF9maWx0ZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IENvbnYyREJhY2twcm9wSW5wdXQgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vcmVzaGFwZSc7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBkZXJpdmF0aXZlIG9mIHRoZSBpbnB1dCBvZiBhIDJEIGNvbnZvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB4U2hhcGUgVGhlIHNoYXBlIG9mIHRoZSBpbnB1dDogW2JhdGNoLCBoZWlnaHQsIHdpZHRoLCBpbkRlcHRoXS5cbiAqIElmIGxlbmd0aCBvZiAzLCBiYXRjaCBvZiAxIGlzIGFzc3VtZWQuXG4gKiBAcGFyYW0gZHkgVGhlIGRlcml2YXRpdmUgb2YgdGhlIG91dHB1dCwgb2YgcmFuayA0IG9yIHJhbmsgMyBvZiBzaGFwZVxuICogICBgW2JhdGNoLCBvdXRIZWlnaHQsIG91dFdpZHRoLCBvdXREZXB0aF1gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXNcbiAqIGFzc3VtZWQuXG4gKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIsIHJhbmsgNCwgb2Ygc2hhcGVcbiAqICAgICBgW2ZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGluRGVwdGgsIG91dERlcHRoXWAuXG4gKiBAcGFyYW0gc3RyaWRlcyBUaGUgc3RyaWRlcyBvZiB0aGUgY29udm9sdXRpb246IGBbc3RyaWRlSGVpZ2h0LFxuICogc3RyaWRlV2lkdGhdYC5cbiAqIEBwYXJhbSBwYWQgVGhlIHR5cGUgb2YgcGFkZGluZyBhbGdvcml0aG0gdXNlZDpcbiAqICAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogQHBhcmFtIGRhdGFGb3JtYXQ6IEFuIG9wdGlvbmFsIHN0cmluZyBmcm9tOiBcIk5IV0NcIiwgXCJOQ0hXXCIuIERlZmF1bHRzIHRvXG4gKiAgICAgXCJOSFdDXCIuIFNwZWNpZnkgdGhlIGRhdGEgZm9ybWF0IG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEuIFdpdGggdGhlXG4gKiAgICAgZGVmYXVsdCBmb3JtYXQgXCJOSFdDXCIsIHRoZSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgb3JkZXIgb2Y6IFtiYXRjaCxcbiAqICAgICBoZWlnaHQsIHdpZHRoLCBjaGFubmVsc10uXG4gKiBAcGFyYW0gZGltUm91bmRpbmdNb2RlIEEgc3RyaW5nIGZyb206ICdjZWlsJywgJ3JvdW5kJywgJ2Zsb29yJy4gSWYgbm9uZSBpc1xuICogICAgIHByb3ZpZGVkLCBpdCB3aWxsIGRlZmF1bHQgdG8gdHJ1bmNhdGUuXG4gKi9cbmZ1bmN0aW9uIGNvbnYyREJhY2twcm9wSW5wdXRfKHhTaGFwZSwgZHksIGZpbHRlciwgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0ID0gJ05IV0MnLCBkaW1Sb3VuZGluZ01vZGUpIHtcbiAgICB1dGlsLmFzc2VydCh4U2hhcGUubGVuZ3RoID09PSBkeS5yYW5rLCAoKSA9PiBgTGVuZ3RoIG9mIGluU2hhcGUgYCArXG4gICAgICAgIGAoJHt4U2hhcGUubGVuZ3RofSkgYW5kIHJhbmsgb2YgZHkgKCR7ZHkucmFua30pIG11c3QgbWF0Y2hgKTtcbiAgICBsZXQgeFNoYXBlNEQgPSB4U2hhcGU7XG4gICAgbGV0IGR5NEQgPSBkeTtcbiAgICBsZXQgcmVzaGFwZWRUbzREID0gZmFsc2U7XG4gICAgaWYgKGR5LnJhbmsgPT09IDMpIHtcbiAgICAgICAgcmVzaGFwZWRUbzREID0gdHJ1ZTtcbiAgICAgICAgZHk0RCA9IHJlc2hhcGUoZHksIFsxLCBkeS5zaGFwZVswXSwgZHkuc2hhcGVbMV0sIGR5LnNoYXBlWzJdXSk7XG4gICAgICAgIHhTaGFwZTREID0gWzEsIHhTaGFwZVswXSwgeFNoYXBlWzFdLCB4U2hhcGVbMl1dO1xuICAgIH1cbiAgICB1dGlsLmFzc2VydCh4U2hhcGU0RC5sZW5ndGggPT09IDQsICgpID0+IGBFcnJvciBpbiBjb252MmREZXJJbnB1dDogaW5TaGFwZSBtdXN0IGJlIGxlbmd0aCA0LCBidXQgZ290IGxlbmd0aCBgICtcbiAgICAgICAgYCR7eFNoYXBlNEQubGVuZ3RofS5gKTtcbiAgICB1dGlsLmFzc2VydChkeTRELnJhbmsgPT09IDQsICgpID0+IGBFcnJvciBpbiBjb252MmREZXJJbnB1dDogZHkgbXVzdCBiZSByYW5rIDQsIGJ1dCBnb3QgYCArXG4gICAgICAgIGByYW5rICR7ZHk0RC5yYW5rfWApO1xuICAgIHV0aWwuYXNzZXJ0KGZpbHRlci5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gY29udjJkRGVySW5wdXQ6IGZpbHRlciBtdXN0IGJlIHJhbmsgNCwgYnV0IGdvdCBgICtcbiAgICAgICAgYHJhbmsgJHtmaWx0ZXIucmFua31gKTtcbiAgICBjb25zdCBpbkRlcHRoID0gZGF0YUZvcm1hdCA9PT0gJ05IV0MnID8geFNoYXBlNERbM10gOiB4U2hhcGU0RFsxXTtcbiAgICBjb25zdCBvdXREZXB0aCA9IGRhdGFGb3JtYXQgPT09ICdOSFdDJyA/IGR5NEQuc2hhcGVbM10gOiBkeTRELnNoYXBlWzFdO1xuICAgIHV0aWwuYXNzZXJ0KGluRGVwdGggPT09IGZpbHRlci5zaGFwZVsyXSwgKCkgPT4gYEVycm9yIGluIGNvbnYyZERlcklucHV0OiBkZXB0aCBvZiBpbnB1dCAoJHtpbkRlcHRofSkgbXVzdCBgICtcbiAgICAgICAgYG1hdGNoIGlucHV0IGRlcHRoIGZvciBmaWx0ZXIgJHtmaWx0ZXIuc2hhcGVbMl19LmApO1xuICAgIHV0aWwuYXNzZXJ0KG91dERlcHRoID09PSBmaWx0ZXIuc2hhcGVbM10sICgpID0+IGBFcnJvciBpbiBjb252MmREZXJJbnB1dDogZGVwdGggb2Ygb3V0cHV0ICgke291dERlcHRofSkgbXVzdCBgICtcbiAgICAgICAgYG1hdGNoIG91dHB1dCBkZXB0aCBmb3IgZmlsdGVyICR7ZmlsdGVyLnNoYXBlWzNdfS5gKTtcbiAgICBpZiAoZGltUm91bmRpbmdNb2RlICE9IG51bGwpIHtcbiAgICAgICAgdXRpbC5hc3NlcnQodXRpbC5pc0ludChwYWQpLCAoKSA9PiBgRXJyb3IgaW4gY29udjJkRGVySW5wdXQ6IHBhZCBtdXN0IGJlIGFuIGludGVnZXIgd2hlbiB1c2luZywgYCArXG4gICAgICAgICAgICBgZGltUm91bmRpbmdNb2RlICR7ZGltUm91bmRpbmdNb2RlfSBidXQgZ290IHBhZCAke3BhZH0uYCk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0cyA9IHsgZHk6IGR5NEQsIGZpbHRlciB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQsIGRpbVJvdW5kaW5nTW9kZSwgaW5wdXRTaGFwZTogeFNoYXBlNEQgfTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgY29uc3QgcmVzID0gRU5HSU5FLnJ1bktlcm5lbChDb252MkRCYWNrcHJvcElucHV0LCBpbnB1dHMsIGF0dHJzKTtcbiAgICBpZiAocmVzaGFwZWRUbzREKSB7XG4gICAgICAgIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydCBjb25zdCBjb252MkRCYWNrcHJvcElucHV0ID0gb3AoeyBjb252MkRCYWNrcHJvcElucHV0XyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnYyZF9iYWNrcHJvcF9pbnB1dC5qcy5tYXAiLCJpbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgY29udjJEQmFja3Byb3BJbnB1dCB9IGZyb20gJy4vY29udjJkX2JhY2twcm9wX2lucHV0JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgdHJhbnNwb3NlZCAyRCBjb252b2x1dGlvbiBvZiBhbiBpbWFnZSwgYWxzbyBrbm93biBhcyBhXG4gKiBkZWNvbnZvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBpbWFnZSwgb2YgcmFuayA0IG9yIHJhbmsgMywgb2Ygc2hhcGVcbiAqICAgYFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgaW5EZXB0aF1gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciwgcmFuayA0LCBvZiBzaGFwZVxuICogICAgIGBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgb3V0RGVwdGgsIGluRGVwdGhdYC5cbiAqICAgICBgaW5EZXB0aGAgbXVzdCBtYXRjaCBgaW5EZXB0aGAgaW4gYHhgLlxuICogQHBhcmFtIG91dHB1dFNoYXBlIE91dHB1dCBzaGFwZSwgb2YgcmFuayA0IG9yIHJhbmsgMzpcbiAqICAgICBgW2JhdGNoLCBoZWlnaHQsIHdpZHRoLCBvdXREZXB0aF1gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBvcmlnaW5hbCBjb252b2x1dGlvbjpcbiAqICAgICBgW3N0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGhdYC5cbiAqIEBwYXJhbSBwYWQgIFRoZSB0eXBlIG9mIHBhZGRpbmcgYWxnb3JpdGhtIHVzZWQgaW4gdGhlIG5vbi10cmFuc3Bvc2UgdmVyc2lvblxuICogICAgb2YgdGhlIG9wLlxuICogQHBhcmFtIGRpbVJvdW5kaW5nTW9kZSBBIHN0cmluZyBmcm9tOiAnY2VpbCcsICdyb3VuZCcsICdmbG9vcicuIElmIG5vbmUgaXNcbiAqICAgICBwcm92aWRlZCwgaXQgd2lsbCBkZWZhdWx0IHRvIHRydW5jYXRlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0NvbnZvbHV0aW9uJ31cbiAqL1xuZnVuY3Rpb24gY29udjJkVHJhbnNwb3NlXyh4LCBmaWx0ZXIsIG91dHB1dFNoYXBlLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2NvbnYyZFRyYW5zcG9zZScpO1xuICAgIGNvbnN0ICRmaWx0ZXIgPSBjb252ZXJ0VG9UZW5zb3IoZmlsdGVyLCAnZmlsdGVyJywgJ2NvbnYyZFRyYW5zcG9zZScpO1xuICAgIHJldHVybiBjb252MkRCYWNrcHJvcElucHV0KG91dHB1dFNoYXBlLCAkeCwgJGZpbHRlciwgc3RyaWRlcywgcGFkLCAnTkhXQycsIGRpbVJvdW5kaW5nTW9kZSk7XG59XG5leHBvcnQgY29uc3QgY29udjJkVHJhbnNwb3NlID0gb3AoeyBjb252MmRUcmFuc3Bvc2VfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29udjJkX3RyYW5zcG9zZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgQ29udjNEIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgZWl0aGVyU3RyaWRlc09yRGlsYXRpb25zQXJlT25lIH0gZnJvbSAnLi9jb252X3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbi8qKlxuICogQ29tcHV0ZXMgYSAzRCBjb252b2x1dGlvbiBvdmVyIHRoZSBpbnB1dCB4LlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IsIG9mIHJhbmsgNSBvciByYW5rIDQsIG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgZGVwdGgsIGhlaWdodCwgd2lkdGgsIGNoYW5uZWxzXWAuIElmIHJhbmsgNCxcbiAqIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciwgcmFuayA1LCBvZiBzaGFwZVxuICogICAgIGBbZmlsdGVyRGVwdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGluQ2hhbm5lbHMsIG91dENoYW5uZWxzXWAuXG4gKiAgICAgIGluQ2hhbm5lbHMgbXVzdCBtYXRjaCBiZXR3ZWVuIGlucHV0IGFuZCBmaWx0ZXIuXG4gKiBAcGFyYW0gc3RyaWRlcyBUaGUgc3RyaWRlcyBvZiB0aGUgY29udm9sdXRpb246IGBbc3RyaWRlRGVwdGgsIHN0cmlkZUhlaWdodCxcbiAqIHN0cmlkZVdpZHRoXWAuXG4gKiBAcGFyYW0gcGFkIFRoZSB0eXBlIG9mIHBhZGRpbmcgYWxnb3JpdGhtLlxuICogICAgLSBgc2FtZWAgYW5kIHN0cmlkZSAxOiBvdXRwdXQgd2lsbCBiZSBvZiBzYW1lIHNpemUgYXMgaW5wdXQsXG4gKiAgICAgICByZWdhcmRsZXNzIG9mIGZpbHRlciBzaXplLlxuICogICAgLSBgdmFsaWRgOiBvdXRwdXQgd2lsbCBiZSBzbWFsbGVyIHRoYW4gaW5wdXQgaWYgZmlsdGVyIGlzIGxhcmdlclxuICogICAgICAgdGhhbiAxeDEuXG4gKiAgIC0gRm9yIG1vcmUgaW5mbywgc2VlIHRoaXMgZ3VpZGU6XG4gKiAgICAgW2h0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbl0oXG4gKiAgICAgICAgICBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb24pXG4gKiBAcGFyYW0gZGF0YUZvcm1hdDogQW4gb3B0aW9uYWwgc3RyaW5nIGZyb206IFwiTkRIV0NcIiwgXCJOQ0RIV1wiLiBEZWZhdWx0cyB0b1xuICogICAgIFwiTkRIV0NcIi4gU3BlY2lmeSB0aGUgZGF0YSBmb3JtYXQgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YS4gV2l0aCB0aGVcbiAqICAgICBkZWZhdWx0IGZvcm1hdCBcIk5ESFdDXCIsIHRoZSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgb3JkZXIgb2Y6IFtiYXRjaCxcbiAqICAgICBkZXB0aCwgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbHNdLiBPbmx5IFwiTkRIV0NcIiBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlxuICogQHBhcmFtIGRpbGF0aW9ucyBUaGUgZGlsYXRpb24gcmF0ZXM6IGBbZGlsYXRpb25EZXB0aCwgZGlsYXRpb25IZWlnaHQsXG4gKiAgICAgZGlsYXRpb25XaWR0aF1gIGluIHdoaWNoIHdlIHNhbXBsZSBpbnB1dCB2YWx1ZXMgYWNyb3NzIHRoZSBoZWlnaHRcbiAqICAgICBhbmQgd2lkdGggZGltZW5zaW9ucyBpbiBhdHJvdXMgY29udm9sdXRpb24uIERlZmF1bHRzIHRvIGBbMSwgMSwgMV1gLlxuICogICAgIElmIGBkaWxhdGlvbnNgIGlzIGEgc2luZ2xlIG51bWJlciwgdGhlblxuICogICAgIGBkaWxhdGlvbkRlcHRoID09IGRpbGF0aW9uSGVpZ2h0ID09IGRpbGF0aW9uV2lkdGhgLiBJZiBpdCBpcyBncmVhdGVyXG4gKiAgICAgdGhhbiAxLCB0aGVuIGFsbCB2YWx1ZXMgb2YgYHN0cmlkZXNgIG11c3QgYmUgMS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdDb252b2x1dGlvbid9XG4gKi9cbmZ1bmN0aW9uIGNvbnYzZF8oeCwgZmlsdGVyLCBzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQgPSAnTkRIV0MnLCBkaWxhdGlvbnMgPSBbMSwgMSwgMV0pIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdjb252M2QnKTtcbiAgICBjb25zdCAkZmlsdGVyID0gY29udmVydFRvVGVuc29yKGZpbHRlciwgJ2ZpbHRlcicsICdjb252M2QnKTtcbiAgICBsZXQgeDVEID0gJHg7XG4gICAgbGV0IHJlc2hhcGVkVG81RCA9IGZhbHNlO1xuICAgIGlmICgkeC5yYW5rID09PSA0KSB7XG4gICAgICAgIHJlc2hhcGVkVG81RCA9IHRydWU7XG4gICAgICAgIHg1RCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV0sICR4LnNoYXBlWzJdLCAkeC5zaGFwZVszXV0pO1xuICAgIH1cbiAgICB1dGlsLmFzc2VydCh4NUQucmFuayA9PT0gNSwgKCkgPT4gYEVycm9yIGluIGNvbnYzZDogaW5wdXQgbXVzdCBiZSByYW5rIDUsIGJ1dCBnb3QgcmFuayAke3g1RC5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydCgkZmlsdGVyLnJhbmsgPT09IDUsICgpID0+IGBFcnJvciBpbiBjb252M2Q6IGZpbHRlciBtdXN0IGJlIHJhbmsgNSwgYnV0IGdvdCByYW5rIGAgK1xuICAgICAgICBgJHskZmlsdGVyLnJhbmt9LmApO1xuICAgIHV0aWwuYXNzZXJ0KHg1RC5zaGFwZVs0XSA9PT0gJGZpbHRlci5zaGFwZVszXSwgKCkgPT4gYEVycm9yIGluIGNvbnYzZDogZGVwdGggb2YgaW5wdXQgKCR7eDVELnNoYXBlWzRdfSkgbXVzdCBtYXRjaCBgICtcbiAgICAgICAgYGlucHV0IGRlcHRoIGZvciBmaWx0ZXIgJHskZmlsdGVyLnNoYXBlWzNdfS5gKTtcbiAgICB1dGlsLmFzc2VydChlaXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgZGlsYXRpb25zKSwgKCkgPT4gJ0Vycm9yIGluIGNvbnYzRDogRWl0aGVyIHN0cmlkZXMgb3IgZGlsYXRpb25zIG11c3QgYmUgMS4gJyArXG4gICAgICAgIGBHb3Qgc3RyaWRlcyAke3N0cmlkZXN9IGFuZCBkaWxhdGlvbnMgJyR7ZGlsYXRpb25zfSdgKTtcbiAgICB1dGlsLmFzc2VydChkYXRhRm9ybWF0ID09PSAnTkRIV0MnLCAoKSA9PiBgRXJyb3IgaW4gY29udjNkOiBnb3QgZGF0YUZvcm1hdCBvZiAke2RhdGFGb3JtYXR9IGJ1dCBvbmx5IE5ESFdDIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQuYCk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiB4NUQsIGZpbHRlcjogJGZpbHRlciB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQsIGRpbGF0aW9ucyB9O1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICBjb25zdCByZXMgPSBFTkdJTkUucnVuS2VybmVsKENvbnYzRCwgaW5wdXRzLCBhdHRycyk7XG4gICAgaWYgKHJlc2hhcGVkVG81RCkge1xuICAgICAgICByZXR1cm4gcmVzaGFwZShyZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdLCByZXMuc2hhcGVbNF1dKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydCBjb25zdCBjb252M2QgPSBvcCh7IGNvbnYzZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb252M2QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IENvbnYzREJhY2twcm9wSW5wdXRWMiB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIGRlcml2YXRpdmUgb2YgdGhlIGlucHV0IG9mIGEgM0QgY29udm9sdXRpb24uXG4gKlxuICogQHBhcmFtIHhTaGFwZSBUaGUgc2hhcGUgb2YgdGhlIGlucHV0OiBbYmF0Y2gsIGRlcHRoLCBoZWlnaHQsIHdpZHRoLFxuICogaW5fY2hhbm5lbHNdLiBJZiBsZW5ndGggb2YgNCwgYmF0Y2ggb2YgMSBpcyBhc3N1bWVkLlxuICogQHBhcmFtIGR5IFRoZSBkZXJpdmF0aXZlIG9mIHRoZSBvdXRwdXQsIG9mIHJhbmsgNSBvciByYW5rIDQgb2Ygc2hhcGVcbiAqICAgYFtiYXRjaCwgb3V0RGVwdGgsIG91dEhlaWdodCwgb3V0V2lkdGgsIGluX2NoYW5uZWxzXWAuXG4gKiBJZiByYW5rIDQsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciwgcmFuayA1LCBvZiBzaGFwZVxuICogICAgIGBbZmlsdGVyRGVwdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGluRGVwdGgsIG91dERlcHRoXWAuXG4gKiBAcGFyYW0gc3RyaWRlcyBUaGUgc3RyaWRlcyBvZiB0aGUgY29udm9sdXRpb246IGBbc3RyaWRlRGVwdGgsIHN0cmlkZUhlaWdodCxcbiAqIHN0cmlkZVdpZHRoXWAuXG4gKiBAcGFyYW0gcGFkIFRoZSB0eXBlIG9mIHBhZGRpbmcgYWxnb3JpdGhtIHVzZWQ6XG4gKiAgICAtIGBzYW1lYCBhbmQgc3RyaWRlIDE6IG91dHB1dCB3aWxsIGJlIG9mIHNhbWUgc2l6ZSBhcyBpbnB1dCxcbiAqICAgICAgIHJlZ2FyZGxlc3Mgb2YgZmlsdGVyIHNpemUuXG4gKiAgICAtIGB2YWxpZGA6IG91dHB1dCB3aWxsIGJlIHNtYWxsZXIgdGhhbiBpbnB1dCBpZiBmaWx0ZXIgaXMgbGFyZ2VyXG4gKiAgICAgICB0aGFuIDF4MS5cbiAqL1xuZnVuY3Rpb24gY29udjNEQmFja3Byb3BJbnB1dF8oeFNoYXBlLCBkeSwgZmlsdGVyLCBzdHJpZGVzLCBwYWQpIHtcbiAgICB1dGlsLmFzc2VydCh4U2hhcGUubGVuZ3RoID09PSBkeS5yYW5rLCAoKSA9PiBgTGVuZ3RoIG9mIGluU2hhcGUgYCArXG4gICAgICAgIGAoJHt4U2hhcGUubGVuZ3RofSkgYW5kIHJhbmsgb2YgZHkgKCR7ZHkucmFua30pIG11c3QgbWF0Y2hgKTtcbiAgICBsZXQgeFNoYXBlNUQgPSB4U2hhcGU7XG4gICAgbGV0IGR5NUQgPSBkeTtcbiAgICBsZXQgcmVzaGFwZWRUbzVEID0gZmFsc2U7XG4gICAgaWYgKGR5LnJhbmsgPT09IDQpIHtcbiAgICAgICAgcmVzaGFwZWRUbzVEID0gdHJ1ZTtcbiAgICAgICAgZHk1RCA9IHJlc2hhcGUoZHksIFsxLCBkeS5zaGFwZVswXSwgZHkuc2hhcGVbMV0sIGR5LnNoYXBlWzJdLCBkeS5zaGFwZVszXV0pO1xuICAgICAgICB4U2hhcGU1RCA9IFsxLCB4U2hhcGVbMF0sIHhTaGFwZVsxXSwgeFNoYXBlWzJdLCB4U2hhcGVbM11dO1xuICAgIH1cbiAgICBjb25zdCBpbkRlcHRoID0geFNoYXBlNURbNF07XG4gICAgY29uc3Qgb3V0RGVwdGggPSBkeTVELnNoYXBlWzRdO1xuICAgIHV0aWwuYXNzZXJ0KHhTaGFwZTVELmxlbmd0aCA9PT0gNSwgKCkgPT4gYEVycm9yIGluIGNvbnYzZERlcklucHV0OiBpblNoYXBlIG11c3QgYmUgbGVuZ3RoIDUsIGJ1dCBnb3QgbGVuZ3RoIGAgK1xuICAgICAgICBgJHt4U2hhcGU1RC5sZW5ndGh9LmApO1xuICAgIHV0aWwuYXNzZXJ0KGR5NUQucmFuayA9PT0gNSwgKCkgPT4gYEVycm9yIGluIGNvbnYzZERlcklucHV0OiBkeSBtdXN0IGJlIHJhbmsgNSwgYnV0IGdvdCBgICtcbiAgICAgICAgYHJhbmsgJHtkeTVELnJhbmt9YCk7XG4gICAgdXRpbC5hc3NlcnQoZmlsdGVyLnJhbmsgPT09IDUsICgpID0+IGBFcnJvciBpbiBjb252M2REZXJJbnB1dDogZmlsdGVyIG11c3QgYmUgcmFuayA1LCBidXQgZ290IGAgK1xuICAgICAgICBgcmFuayAke2ZpbHRlci5yYW5rfWApO1xuICAgIHV0aWwuYXNzZXJ0KGluRGVwdGggPT09IGZpbHRlci5zaGFwZVszXSwgKCkgPT4gYEVycm9yIGluIGNvbnYzZERlcklucHV0OiBkZXB0aCBvZiBpbnB1dCAoJHtpbkRlcHRofSkgbXVzdCBgICtcbiAgICAgICAgYG1hdGNoIGlucHV0IGRlcHRoIGZvciBmaWx0ZXIgJHtmaWx0ZXIuc2hhcGVbM119LmApO1xuICAgIHV0aWwuYXNzZXJ0KG91dERlcHRoID09PSBmaWx0ZXIuc2hhcGVbNF0sICgpID0+IGBFcnJvciBpbiBjb252M2REZXJJbnB1dDogZGVwdGggb2Ygb3V0cHV0ICgke291dERlcHRofSkgbXVzdCBgICtcbiAgICAgICAgYG1hdGNoIG91dHB1dCBkZXB0aCBmb3IgZmlsdGVyICR7ZmlsdGVyLnNoYXBlWzRdfS5gKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGR5OiBkeTVELCBmaWx0ZXIgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgcGFkLCBzdHJpZGVzLCBpbnB1dFNoYXBlOiB4U2hhcGU1RCB9O1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICBjb25zdCByZXMgPSBFTkdJTkUucnVuS2VybmVsKENvbnYzREJhY2twcm9wSW5wdXRWMiwgaW5wdXRzLCBhdHRycyk7XG4gICAgaWYgKHJlc2hhcGVkVG81RCkge1xuICAgICAgICByZXR1cm4gcmVzaGFwZShyZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdLCByZXMuc2hhcGVbNF1dKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydCBjb25zdCBjb252M0RCYWNrcHJvcElucHV0ID0gb3AoeyBjb252M0RCYWNrcHJvcElucHV0XyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnYzZF9iYWNrcHJvcF9pbnB1dC5qcy5tYXAiLCJpbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgY29udjNEQmFja3Byb3BJbnB1dCB9IGZyb20gJy4vY29udjNkX2JhY2twcm9wX2lucHV0JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgdHJhbnNwb3NlZCAzRCBjb252b2x1dGlvbiBvZiBhIHZvbHVtZSwgYWxzbyBrbm93biBhcyBhXG4gKiBkZWNvbnZvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBpbWFnZSwgb2YgcmFuayA1IG9yIHJhbmsgNCwgb2Ygc2hhcGVcbiAqICAgYFtiYXRjaCwgZGVwdGgsIGhlaWdodCwgd2lkdGgsIGluRGVwdGhdYC4gSWYgcmFuayA0LCBiYXRjaCBvZiAxIGlzIGFzc3VtZWQuXG4gKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIsIHJhbmsgNCwgb2Ygc2hhcGVcbiAqICAgICBgW2RlcHRoLCBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBvdXREZXB0aCwgaW5EZXB0aF1gLlxuICogICAgIGBpbkRlcHRoYCBtdXN0IG1hdGNoIGBpbkRlcHRoYCBpbiBgeGAuXG4gKiBAcGFyYW0gb3V0cHV0U2hhcGUgT3V0cHV0IHNoYXBlLCBvZiByYW5rIDUgb3IgcmFuayA0OlxuICogICAgIGBbYmF0Y2gsIGRlcHRoLCBoZWlnaHQsIHdpZHRoLCBvdXREZXB0aF1gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXNcbiAqICAgIGFzc3VtZWQuXG4gKiBAcGFyYW0gc3RyaWRlcyBUaGUgc3RyaWRlcyBvZiB0aGUgb3JpZ2luYWwgY29udm9sdXRpb246XG4gKiAgICAgYFtzdHJpZGVEZXB0aCwgc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aF1gLlxuICogQHBhcmFtIHBhZCAgVGhlIHR5cGUgb2YgcGFkZGluZyBhbGdvcml0aG0gdXNlZCBpbiB0aGUgbm9uLXRyYW5zcG9zZSB2ZXJzaW9uXG4gKiAgICBvZiB0aGUgb3AuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQ29udm9sdXRpb24nfVxuICovXG5mdW5jdGlvbiBjb252M2RUcmFuc3Bvc2VfKHgsIGZpbHRlciwgb3V0cHV0U2hhcGUsIHN0cmlkZXMsIHBhZCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2NvbnYzZFRyYW5zcG9zZScpO1xuICAgIGNvbnN0ICRmaWx0ZXIgPSBjb252ZXJ0VG9UZW5zb3IoZmlsdGVyLCAnZmlsdGVyJywgJ2NvbnYzZFRyYW5zcG9zZScpO1xuICAgIHJldHVybiBjb252M0RCYWNrcHJvcElucHV0KG91dHB1dFNoYXBlLCAkeCwgJGZpbHRlciwgc3RyaWRlcywgcGFkKTtcbn1cbmV4cG9ydCBjb25zdCBjb252M2RUcmFuc3Bvc2UgPSBvcCh7IGNvbnYzZFRyYW5zcG9zZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb252M2RfdHJhbnNwb3NlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qKlxuICpcbiAqIEBwYXJhbSBpbnB1dFNoYXBlIElucHV0IHRlbnNvciBzaGFwZSBpcyBvZiB0aGUgZm9sbG93aW5nIGRpbWVuc2lvbnM6XG4gKiAgICAgYFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgaW5DaGFubmVsc11gLlxuICogQHBhcmFtIGZpbHRlclNoYXBlIFRoZSBmaWx0ZXIgc2hhcGUgaXMgb2YgdGhlIGZvbGxvd2luZyBkaW1lbnNpb25zOlxuICogICAgIGBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgZGVwdGhdYC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBzbGlkaW5nIHdpbmRvdyBmb3IgZWFjaCBkaW1lbnNpb24gb2YgdGhlXG4gKiAgICAgaW5wdXQgdGVuc29yOiBgW3N0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGhdYC5cbiAqICAgICBJZiBgc3RyaWRlc2AgaXMgYSBzaW5nbGUgbnVtYmVyLFxuICogICAgIHRoZW4gYHN0cmlkZUhlaWdodCA9PSBzdHJpZGVXaWR0aGAuXG4gKiBAcGFyYW0gcGFkIFRoZSB0eXBlIG9mIHBhZGRpbmcgYWxnb3JpdGhtLlxuICogICAgLSBgc2FtZWAgYW5kIHN0cmlkZSAxOiBvdXRwdXQgd2lsbCBiZSBvZiBzYW1lIHNpemUgYXMgaW5wdXQsXG4gKiAgICAgICByZWdhcmRsZXNzIG9mIGZpbHRlciBzaXplLlxuICogICAgLSBgdmFsaWRgOiBvdXRwdXQgd2lsbCBiZSBzbWFsbGVyIHRoYW4gaW5wdXQgaWYgZmlsdGVyIGlzIGxhcmdlclxuICogICAgICAgdGhhbiAxKjF4MS5cbiAqICAgIC0gRm9yIG1vcmUgaW5mbywgc2VlIHRoaXMgZ3VpZGU6XG4gKiAgICAgW2h0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbl0oXG4gKiAgICAgICAgICBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb24pXG4gKiBAcGFyYW0gZGF0YUZvcm1hdCBUaGUgZGF0YSBmb3JtYXQgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YS5cbiAqICAgICBEZWZhdWx0cyB0byAnTkhXQycuXG4gKiBAcGFyYW0gZGlsYXRpb25zIFRoZSBkaWxhdGlvbiByYXRlczogYFtkaWxhdGlvbkhlaWdodCwgZGlsYXRpb25XaWR0aF1gLlxuICogICAgIERlZmF1bHRzIHRvIGBbMSwgMV1gLiBJZiBgZGlsYXRpb25zYCBpcyBhIHNpbmdsZSBudW1iZXIsIHRoZW5cbiAqICAgICBgZGlsYXRpb25IZWlnaHQgPT0gZGlsYXRpb25XaWR0aGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlRGlsYXRpb24yREluZm8oaW5wdXRTaGFwZSwgZmlsdGVyU2hhcGUsIHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCA9ICdOSFdDJywgZGlsYXRpb25zKSB7XG4gICAgLy8gYGNvbXB1dGVyQ29udjJESW5mb2AgcmVxdWlyZSBmaWx0ZXJTaGFwZSB0byBiZSBpbiB0aGUgZGltZW5zaW9uIG9mOlxuICAgIC8vIGBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgZGVwdGgsIG91dERlcHRoXWAsIGRpbGF0aW9uMmQgZG9lc24ndCBoYXZlXG4gICAgLy8gb3V0RGVwdGgsIGl0IHNob3VsZCBoYXZlIHRoZSBzYW1lIGRlcHRoIGFzIHRoZSBpbnB1dC5cbiAgICAvLyBJbnB1dCBzaGFwZTogW2JhdGNoLCBoZWlnaHQsIHdpZHRoLCBpbkNoYW5uZWxzXVxuICAgIGNvbnN0IGlucHV0Q2hhbm5lbHMgPSBpbnB1dFNoYXBlWzNdO1xuICAgIGNvbnN0ICRmaWx0ZXJTaGFwZSA9IFsuLi5maWx0ZXJTaGFwZSwgaW5wdXRDaGFubmVsc107XG4gICAgY29uc3QgJGRhdGFGb3JtYXQgPSBjb252ZXJ0Q29udjJERGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcbiAgICByZXR1cm4gY29tcHV0ZUNvbnYyREluZm8oaW5wdXRTaGFwZSwgJGZpbHRlclNoYXBlLCBzdHJpZGVzLCBkaWxhdGlvbnMsIHBhZCwgbnVsbCAvKiByb3VuZGluZ01vZGUgKi8sIG51bGwgLyogZGVwdGhXaXNlICovLCAkZGF0YUZvcm1hdCk7XG59XG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVBvb2wyREluZm8oaW5TaGFwZSwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIHJvdW5kaW5nTW9kZSwgZGF0YUZvcm1hdCA9ICdjaGFubmVsc0xhc3QnKSB7XG4gICAgY29uc3QgW2ZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGhdID0gcGFyc2VUdXBsZVBhcmFtKGZpbHRlclNpemUpO1xuICAgIGxldCBmaWx0ZXJTaGFwZTtcbiAgICBpZiAoZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzTGFzdCcpIHtcbiAgICAgICAgZmlsdGVyU2hhcGUgPSBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5TaGFwZVszXSwgaW5TaGFwZVszXV07XG4gICAgfVxuICAgIGVsc2UgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0Jykge1xuICAgICAgICBmaWx0ZXJTaGFwZSA9IFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBpblNoYXBlWzFdLCBpblNoYXBlWzFdXTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBkYXRhRm9ybWF0ICR7ZGF0YUZvcm1hdH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbXB1dGVDb252MkRJbmZvKGluU2hhcGUsIGZpbHRlclNoYXBlLCBzdHJpZGVzLCBkaWxhdGlvbnMsIHBhZCwgcm91bmRpbmdNb2RlLCBmYWxzZSwgZGF0YUZvcm1hdCk7XG59XG4vKipcbiAqIENvbXB1dGVzIHRoZSBpbmZvcm1hdGlvbiBmb3IgYSBmb3J3YXJkIHBhc3Mgb2YgYSBwb29saW5nM0Qgb3BlcmF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVBvb2wzREluZm8oaW5TaGFwZSwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIHJvdW5kaW5nTW9kZSwgZGF0YUZvcm1hdCA9ICdOREhXQycpIHtcbiAgICBjb25zdCBbZmlsdGVyRGVwdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGhdID0gcGFyc2UzVHVwbGVQYXJhbShmaWx0ZXJTaXplKTtcbiAgICBsZXQgZmlsdGVyU2hhcGU7XG4gICAgbGV0ICRkYXRhRm9ybWF0O1xuICAgIGlmIChkYXRhRm9ybWF0ID09PSAnTkRIV0MnKSB7XG4gICAgICAgICRkYXRhRm9ybWF0ID0gJ2NoYW5uZWxzTGFzdCc7XG4gICAgICAgIGZpbHRlclNoYXBlID1cbiAgICAgICAgICAgIFtmaWx0ZXJEZXB0aCwgZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5TaGFwZVs0XSwgaW5TaGFwZVs0XV07XG4gICAgfVxuICAgIGVsc2UgaWYgKGRhdGFGb3JtYXQgPT09ICdOQ0RIVycpIHtcbiAgICAgICAgJGRhdGFGb3JtYXQgPSAnY2hhbm5lbHNGaXJzdCc7XG4gICAgICAgIGZpbHRlclNoYXBlID1cbiAgICAgICAgICAgIFtmaWx0ZXJEZXB0aCwgZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5TaGFwZVsxXSwgaW5TaGFwZVsxXV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZGF0YUZvcm1hdCAke2RhdGFGb3JtYXR9YCk7XG4gICAgfVxuICAgIHJldHVybiBjb21wdXRlQ29udjNESW5mbyhpblNoYXBlLCBmaWx0ZXJTaGFwZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGZhbHNlLCAkZGF0YUZvcm1hdCwgcm91bmRpbmdNb2RlKTtcbn1cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGluZm9ybWF0aW9uIGZvciBhIGZvcndhcmQgcGFzcyBvZiBhIGNvbnZvbHV0aW9uL3Bvb2xpbmdcbiAqIG9wZXJhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVDb252MkRJbmZvKGluU2hhcGUsIGZpbHRlclNoYXBlLCBzdHJpZGVzLCBkaWxhdGlvbnMsIHBhZCwgcm91bmRpbmdNb2RlLCBkZXB0aHdpc2UgPSBmYWxzZSwgZGF0YUZvcm1hdCA9ICdjaGFubmVsc0xhc3QnKSB7XG4gICAgbGV0IFtiYXRjaFNpemUsIGluSGVpZ2h0LCBpbldpZHRoLCBpbkNoYW5uZWxzXSA9IFstMSwgLTEsIC0xLCAtMV07XG4gICAgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnKSB7XG4gICAgICAgIFtiYXRjaFNpemUsIGluSGVpZ2h0LCBpbldpZHRoLCBpbkNoYW5uZWxzXSA9IGluU2hhcGU7XG4gICAgfVxuICAgIGVsc2UgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0Jykge1xuICAgICAgICBbYmF0Y2hTaXplLCBpbkNoYW5uZWxzLCBpbkhlaWdodCwgaW5XaWR0aF0gPSBpblNoYXBlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGRhdGFGb3JtYXQgJHtkYXRhRm9ybWF0fWApO1xuICAgIH1cbiAgICBjb25zdCBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgLCBmaWx0ZXJDaGFubmVsc10gPSBmaWx0ZXJTaGFwZTtcbiAgICBjb25zdCBbc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aF0gPSBwYXJzZVR1cGxlUGFyYW0oc3RyaWRlcyk7XG4gICAgY29uc3QgW2RpbGF0aW9uSGVpZ2h0LCBkaWxhdGlvbldpZHRoXSA9IHBhcnNlVHVwbGVQYXJhbShkaWxhdGlvbnMpO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckhlaWdodCA9IGdldEVmZmVjdGl2ZUZpbHRlclNpemUoZmlsdGVySGVpZ2h0LCBkaWxhdGlvbkhlaWdodCk7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVyV2lkdGggPSBnZXRFZmZlY3RpdmVGaWx0ZXJTaXplKGZpbHRlcldpZHRoLCBkaWxhdGlvbldpZHRoKTtcbiAgICBjb25zdCB7IHBhZEluZm8sIG91dEhlaWdodCwgb3V0V2lkdGggfSA9IGdldFBhZEFuZE91dEluZm8ocGFkLCBpbkhlaWdodCwgaW5XaWR0aCwgc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aCwgZWZmZWN0aXZlRmlsdGVySGVpZ2h0LCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCwgcm91bmRpbmdNb2RlLCBkYXRhRm9ybWF0KTtcbiAgICBjb25zdCBvdXRDaGFubmVscyA9IGRlcHRod2lzZSA/IGZpbHRlckNoYW5uZWxzICogaW5DaGFubmVscyA6IGZpbHRlckNoYW5uZWxzO1xuICAgIGxldCBvdXRTaGFwZTtcbiAgICBpZiAoZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzRmlyc3QnKSB7XG4gICAgICAgIG91dFNoYXBlID0gW2JhdGNoU2l6ZSwgb3V0Q2hhbm5lbHMsIG91dEhlaWdodCwgb3V0V2lkdGhdO1xuICAgIH1cbiAgICBlbHNlIGlmIChkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNMYXN0Jykge1xuICAgICAgICBvdXRTaGFwZSA9IFtiYXRjaFNpemUsIG91dEhlaWdodCwgb3V0V2lkdGgsIG91dENoYW5uZWxzXTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYmF0Y2hTaXplLFxuICAgICAgICBkYXRhRm9ybWF0LFxuICAgICAgICBpbkhlaWdodCxcbiAgICAgICAgaW5XaWR0aCxcbiAgICAgICAgaW5DaGFubmVscyxcbiAgICAgICAgb3V0SGVpZ2h0LFxuICAgICAgICBvdXRXaWR0aCxcbiAgICAgICAgb3V0Q2hhbm5lbHMsXG4gICAgICAgIHBhZEluZm8sXG4gICAgICAgIHN0cmlkZUhlaWdodCxcbiAgICAgICAgc3RyaWRlV2lkdGgsXG4gICAgICAgIGZpbHRlckhlaWdodCxcbiAgICAgICAgZmlsdGVyV2lkdGgsXG4gICAgICAgIGVmZmVjdGl2ZUZpbHRlckhlaWdodCxcbiAgICAgICAgZWZmZWN0aXZlRmlsdGVyV2lkdGgsXG4gICAgICAgIGRpbGF0aW9uSGVpZ2h0LFxuICAgICAgICBkaWxhdGlvbldpZHRoLFxuICAgICAgICBpblNoYXBlLFxuICAgICAgICBvdXRTaGFwZSxcbiAgICAgICAgZmlsdGVyU2hhcGVcbiAgICB9O1xufVxuLyoqXG4gKiBDb21wdXRlcyB0aGUgaW5mb3JtYXRpb24gZm9yIGEgZm9yd2FyZCBwYXNzIG9mIGEgM0QgY29udm9sdXRpb24vcG9vbGluZ1xuICogb3BlcmF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZUNvbnYzREluZm8oaW5TaGFwZSwgZmlsdGVyU2hhcGUsIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLCBkZXB0aHdpc2UgPSBmYWxzZSwgZGF0YUZvcm1hdCA9ICdjaGFubmVsc0xhc3QnLCByb3VuZGluZ01vZGUpIHtcbiAgICBsZXQgW2JhdGNoU2l6ZSwgaW5EZXB0aCwgaW5IZWlnaHQsIGluV2lkdGgsIGluQ2hhbm5lbHNdID0gWy0xLCAtMSwgLTEsIC0xLCAtMV07XG4gICAgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnKSB7XG4gICAgICAgIFtiYXRjaFNpemUsIGluRGVwdGgsIGluSGVpZ2h0LCBpbldpZHRoLCBpbkNoYW5uZWxzXSA9IGluU2hhcGU7XG4gICAgfVxuICAgIGVsc2UgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0Jykge1xuICAgICAgICBbYmF0Y2hTaXplLCBpbkNoYW5uZWxzLCBpbkRlcHRoLCBpbkhlaWdodCwgaW5XaWR0aF0gPSBpblNoYXBlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGRhdGFGb3JtYXQgJHtkYXRhRm9ybWF0fWApO1xuICAgIH1cbiAgICBjb25zdCBbZmlsdGVyRGVwdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsICwgZmlsdGVyQ2hhbm5lbHNdID0gZmlsdGVyU2hhcGU7XG4gICAgY29uc3QgW3N0cmlkZURlcHRoLCBzdHJpZGVIZWlnaHQsIHN0cmlkZVdpZHRoXSA9IHBhcnNlM1R1cGxlUGFyYW0oc3RyaWRlcyk7XG4gICAgY29uc3QgW2RpbGF0aW9uRGVwdGgsIGRpbGF0aW9uSGVpZ2h0LCBkaWxhdGlvbldpZHRoXSA9IHBhcnNlM1R1cGxlUGFyYW0oZGlsYXRpb25zKTtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJEZXB0aCA9IGdldEVmZmVjdGl2ZUZpbHRlclNpemUoZmlsdGVyRGVwdGgsIGRpbGF0aW9uRGVwdGgpO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckhlaWdodCA9IGdldEVmZmVjdGl2ZUZpbHRlclNpemUoZmlsdGVySGVpZ2h0LCBkaWxhdGlvbkhlaWdodCk7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVyV2lkdGggPSBnZXRFZmZlY3RpdmVGaWx0ZXJTaXplKGZpbHRlcldpZHRoLCBkaWxhdGlvbldpZHRoKTtcbiAgICBjb25zdCB7IHBhZEluZm8sIG91dERlcHRoLCBvdXRIZWlnaHQsIG91dFdpZHRoIH0gPSBnZXQzRFBhZEFuZE91dEluZm8ocGFkLCBpbkRlcHRoLCBpbkhlaWdodCwgaW5XaWR0aCwgc3RyaWRlRGVwdGgsIHN0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGgsIGVmZmVjdGl2ZUZpbHRlckRlcHRoLCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQsIGVmZmVjdGl2ZUZpbHRlcldpZHRoLCByb3VuZGluZ01vZGUpO1xuICAgIGNvbnN0IG91dENoYW5uZWxzID0gZGVwdGh3aXNlID8gZmlsdGVyQ2hhbm5lbHMgKiBpbkNoYW5uZWxzIDogZmlsdGVyQ2hhbm5lbHM7XG4gICAgbGV0IG91dFNoYXBlO1xuICAgIGlmIChkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNGaXJzdCcpIHtcbiAgICAgICAgb3V0U2hhcGUgPSBbYmF0Y2hTaXplLCBvdXRDaGFubmVscywgb3V0RGVwdGgsIG91dEhlaWdodCwgb3V0V2lkdGhdO1xuICAgIH1cbiAgICBlbHNlIGlmIChkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNMYXN0Jykge1xuICAgICAgICBvdXRTaGFwZSA9IFtiYXRjaFNpemUsIG91dERlcHRoLCBvdXRIZWlnaHQsIG91dFdpZHRoLCBvdXRDaGFubmVsc107XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGJhdGNoU2l6ZSxcbiAgICAgICAgZGF0YUZvcm1hdCxcbiAgICAgICAgaW5EZXB0aCxcbiAgICAgICAgaW5IZWlnaHQsXG4gICAgICAgIGluV2lkdGgsXG4gICAgICAgIGluQ2hhbm5lbHMsXG4gICAgICAgIG91dERlcHRoLFxuICAgICAgICBvdXRIZWlnaHQsXG4gICAgICAgIG91dFdpZHRoLFxuICAgICAgICBvdXRDaGFubmVscyxcbiAgICAgICAgcGFkSW5mbyxcbiAgICAgICAgc3RyaWRlRGVwdGgsXG4gICAgICAgIHN0cmlkZUhlaWdodCxcbiAgICAgICAgc3RyaWRlV2lkdGgsXG4gICAgICAgIGZpbHRlckRlcHRoLFxuICAgICAgICBmaWx0ZXJIZWlnaHQsXG4gICAgICAgIGZpbHRlcldpZHRoLFxuICAgICAgICBlZmZlY3RpdmVGaWx0ZXJEZXB0aCxcbiAgICAgICAgZWZmZWN0aXZlRmlsdGVySGVpZ2h0LFxuICAgICAgICBlZmZlY3RpdmVGaWx0ZXJXaWR0aCxcbiAgICAgICAgZGlsYXRpb25EZXB0aCxcbiAgICAgICAgZGlsYXRpb25IZWlnaHQsXG4gICAgICAgIGRpbGF0aW9uV2lkdGgsXG4gICAgICAgIGluU2hhcGUsXG4gICAgICAgIG91dFNoYXBlLFxuICAgICAgICBmaWx0ZXJTaGFwZVxuICAgIH07XG59XG5mdW5jdGlvbiBjb21wdXRlT3V0cHV0U2hhcGUyRChpblNoYXBlLCBmaWVsZFNpemUsIHN0cmlkZSwgemVyb1BhZCwgcm91bmRpbmdNb2RlKSB7XG4gICAgaWYgKHplcm9QYWQgPT0gbnVsbCkge1xuICAgICAgICB6ZXJvUGFkID0gY29tcHV0ZURlZmF1bHRQYWQoaW5TaGFwZSwgZmllbGRTaXplLCBzdHJpZGUpO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dFJvd3MgPSBpblNoYXBlWzBdO1xuICAgIGNvbnN0IGlucHV0Q29scyA9IGluU2hhcGVbMV07XG4gICAgY29uc3Qgb3V0cHV0Um93cyA9IHJvdW5kKChpbnB1dFJvd3MgLSBmaWVsZFNpemUgKyAyICogemVyb1BhZCkgLyBzdHJpZGUgKyAxLCByb3VuZGluZ01vZGUpO1xuICAgIGNvbnN0IG91dHB1dENvbHMgPSByb3VuZCgoaW5wdXRDb2xzIC0gZmllbGRTaXplICsgMiAqIHplcm9QYWQpIC8gc3RyaWRlICsgMSwgcm91bmRpbmdNb2RlKTtcbiAgICByZXR1cm4gW291dHB1dFJvd3MsIG91dHB1dENvbHNdO1xufVxuZnVuY3Rpb24gY29tcHV0ZU91dHB1dFNoYXBlNEQoaW5TaGFwZSwgZmllbGRTaXplLCBvdXRDaGFubmVscywgc3RyaWRlLCB6ZXJvUGFkLCByb3VuZGluZ01vZGUpIHtcbiAgICBpZiAoemVyb1BhZCA9PSBudWxsKSB7XG4gICAgICAgIHplcm9QYWQgPSBjb21wdXRlRGVmYXVsdFBhZChpblNoYXBlLCBmaWVsZFNpemUsIHN0cmlkZSk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0RGVwdGggPSBpblNoYXBlWzBdO1xuICAgIGNvbnN0IGlucHV0Um93cyA9IGluU2hhcGVbMV07XG4gICAgY29uc3QgaW5wdXRDb2xzID0gaW5TaGFwZVsyXTtcbiAgICBjb25zdCBvdXRwdXREZXB0aHMgPSByb3VuZCgoaW5wdXREZXB0aCAtIGZpZWxkU2l6ZSArIDIgKiB6ZXJvUGFkKSAvIHN0cmlkZSArIDEsIHJvdW5kaW5nTW9kZSk7XG4gICAgY29uc3Qgb3V0cHV0Um93cyA9IHJvdW5kKChpbnB1dFJvd3MgLSBmaWVsZFNpemUgKyAyICogemVyb1BhZCkgLyBzdHJpZGUgKyAxLCByb3VuZGluZ01vZGUpO1xuICAgIGNvbnN0IG91dHB1dENvbHMgPSByb3VuZCgoaW5wdXRDb2xzIC0gZmllbGRTaXplICsgMiAqIHplcm9QYWQpIC8gc3RyaWRlICsgMSwgcm91bmRpbmdNb2RlKTtcbiAgICByZXR1cm4gW291dHB1dERlcHRocywgb3V0cHV0Um93cywgb3V0cHV0Q29scywgb3V0Q2hhbm5lbHNdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVEZWZhdWx0UGFkKGlucHV0U2hhcGUsIGZpZWxkU2l6ZSwgc3RyaWRlLCBkaWxhdGlvbiA9IDEpIHtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWVsZFNpemUgPSBnZXRFZmZlY3RpdmVGaWx0ZXJTaXplKGZpZWxkU2l6ZSwgZGlsYXRpb24pO1xuICAgIHJldHVybiBNYXRoLmZsb29yKChpbnB1dFNoYXBlWzBdICogKHN0cmlkZSAtIDEpIC0gc3RyaWRlICsgZWZmZWN0aXZlRmllbGRTaXplKSAvIDIpO1xufVxuZnVuY3Rpb24gcGFyc2VUdXBsZVBhcmFtKHBhcmFtKSB7XG4gICAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIFtwYXJhbSwgcGFyYW0sIHBhcmFtXTtcbiAgICB9XG4gICAgaWYgKHBhcmFtLmxlbmd0aCA9PT0gMikge1xuICAgICAgICByZXR1cm4gW3BhcmFtWzBdLCBwYXJhbVsxXSwgMV07XG4gICAgfVxuICAgIHJldHVybiBwYXJhbTtcbn1cbmZ1bmN0aW9uIHBhcnNlM1R1cGxlUGFyYW0ocGFyYW0pIHtcbiAgICByZXR1cm4gdHlwZW9mIHBhcmFtID09PSAnbnVtYmVyJyA/IFtwYXJhbSwgcGFyYW0sIHBhcmFtXSA6IHBhcmFtO1xufVxuLyogU2VlIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9hdHJvdXNfY29udjJkXG4gKiBBdHJvdXMgY29udm9sdXRpb24gaXMgZXF1aXZhbGVudCB0byBzdGFuZGFyZCBjb252b2x1dGlvbiB3aXRoIHVwc2FtcGxlZFxuICogZmlsdGVycyB3aXRoIGVmZmVjdGl2ZV9maWx0ZXJfaGVpZ2h0ID1cbiAqIGZpbHRlcl9oZWlnaHQgKyAoZmlsdGVyX2hlaWdodCAtIDEpICogKGRpbGF0aW9uIC0gMSlcbiAqIGFuZCBlZmZlY3RpdmVfZmlsdGVyX3dpZHRoID1cbiAqIGZpbHRlcl93aWR0aCArIChmaWx0ZXJfd2lkdGggLSAxKSAqIChkaWxhdGlvbiAtIDEpLFxuICogcHJvZHVjZWQgYnkgaW5zZXJ0aW5nIGRpbGF0aW9uIC0gMSB6ZXJvcyBhbG9uZyBjb25zZWN1dGl2ZSBlbGVtZW50cyBhY3Jvc3NcbiAqIHRoZSBmaWx0ZXJzJyBzcGF0aWFsIGRpbWVuc2lvbnMuXG4gKiBXaGVuIHRoZXJlIGlzIGEgZGlsYXRpb24sIHRoaXMgY29udmVydHMgYSBmaWx0ZXIgZGltZW5zaW9uIHRvIHRoZVxuICogZWZmZWN0aXZlIGZpbHRlciBkaW1lbnNpb24sIHNvIGl0IGNhbiBiZSB1c2VkIGluIGEgc3RhbmRhcmQgY29udm9sdXRpb24uXG4gKi9cbmZ1bmN0aW9uIGdldEVmZmVjdGl2ZUZpbHRlclNpemUoZmlsdGVyU2l6ZSwgZGlsYXRpb24pIHtcbiAgICBpZiAoZGlsYXRpb24gPD0gMSkge1xuICAgICAgICByZXR1cm4gZmlsdGVyU2l6ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZpbHRlclNpemUgKyAoZmlsdGVyU2l6ZSAtIDEpICogKGRpbGF0aW9uIC0gMSk7XG59XG5mdW5jdGlvbiBnZXRQYWRBbmRPdXRJbmZvKHBhZCwgaW5IZWlnaHQsIGluV2lkdGgsIHN0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIHJvdW5kaW5nTW9kZSwgZGF0YUZvcm1hdCkge1xuICAgIGxldCBwYWRJbmZvO1xuICAgIGxldCBvdXRIZWlnaHQ7XG4gICAgbGV0IG91dFdpZHRoO1xuICAgIGlmICh0eXBlb2YgcGFkID09PSAnbnVtYmVyJykge1xuICAgICAgICBjb25zdCBwYWRUeXBlID0gKHBhZCA9PT0gMCkgPyAnVkFMSUQnIDogJ05VTUJFUic7XG4gICAgICAgIHBhZEluZm8gPSB7IHRvcDogcGFkLCBib3R0b206IHBhZCwgbGVmdDogcGFkLCByaWdodDogcGFkLCB0eXBlOiBwYWRUeXBlIH07XG4gICAgICAgIGNvbnN0IG91dFNoYXBlID0gY29tcHV0ZU91dHB1dFNoYXBlMkQoW2luSGVpZ2h0LCBpbldpZHRoXSwgZmlsdGVySGVpZ2h0LCBzdHJpZGVIZWlnaHQsIHBhZCwgcm91bmRpbmdNb2RlKTtcbiAgICAgICAgb3V0SGVpZ2h0ID0gb3V0U2hhcGVbMF07XG4gICAgICAgIG91dFdpZHRoID0gb3V0U2hhcGVbMV07XG4gICAgfVxuICAgIGVsc2UgaWYgKHBhZCA9PT0gJ3NhbWUnKSB7XG4gICAgICAgIG91dEhlaWdodCA9IE1hdGguY2VpbChpbkhlaWdodCAvIHN0cmlkZUhlaWdodCk7XG4gICAgICAgIG91dFdpZHRoID0gTWF0aC5jZWlsKGluV2lkdGggLyBzdHJpZGVXaWR0aCk7XG4gICAgICAgIGNvbnN0IHBhZEFsb25nSGVpZ2h0ID0gTWF0aC5tYXgoMCwgKG91dEhlaWdodCAtIDEpICogc3RyaWRlSGVpZ2h0ICsgZmlsdGVySGVpZ2h0IC0gaW5IZWlnaHQpO1xuICAgICAgICBjb25zdCBwYWRBbG9uZ1dpZHRoID0gTWF0aC5tYXgoMCwgKG91dFdpZHRoIC0gMSkgKiBzdHJpZGVXaWR0aCArIGZpbHRlcldpZHRoIC0gaW5XaWR0aCk7XG4gICAgICAgIGNvbnN0IHRvcCA9IE1hdGguZmxvb3IocGFkQWxvbmdIZWlnaHQgLyAyKTtcbiAgICAgICAgY29uc3QgYm90dG9tID0gcGFkQWxvbmdIZWlnaHQgLSB0b3A7XG4gICAgICAgIGNvbnN0IGxlZnQgPSBNYXRoLmZsb29yKHBhZEFsb25nV2lkdGggLyAyKTtcbiAgICAgICAgY29uc3QgcmlnaHQgPSBwYWRBbG9uZ1dpZHRoIC0gbGVmdDtcbiAgICAgICAgcGFkSW5mbyA9IHsgdG9wLCBib3R0b20sIGxlZnQsIHJpZ2h0LCB0eXBlOiAnU0FNRScgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAocGFkID09PSAndmFsaWQnKSB7XG4gICAgICAgIHBhZEluZm8gPSB7IHRvcDogMCwgYm90dG9tOiAwLCBsZWZ0OiAwLCByaWdodDogMCwgdHlwZTogJ1ZBTElEJyB9O1xuICAgICAgICBvdXRIZWlnaHQgPSBNYXRoLmNlaWwoKGluSGVpZ2h0IC0gZmlsdGVySGVpZ2h0ICsgMSkgLyBzdHJpZGVIZWlnaHQpO1xuICAgICAgICBvdXRXaWR0aCA9IE1hdGguY2VpbCgoaW5XaWR0aCAtIGZpbHRlcldpZHRoICsgMSkgLyBzdHJpZGVXaWR0aCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBwYWQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGNvbnN0IHRvcCA9IGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnID8gcGFkWzFdWzBdIDogcGFkWzJdWzBdO1xuICAgICAgICBjb25zdCBib3R0b20gPSBkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNMYXN0JyA/IHBhZFsxXVsxXSA6IHBhZFsyXVsxXTtcbiAgICAgICAgY29uc3QgbGVmdCA9IGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnID8gcGFkWzJdWzBdIDogcGFkWzNdWzBdO1xuICAgICAgICBjb25zdCByaWdodCA9IGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnID8gcGFkWzJdWzFdIDogcGFkWzNdWzFdO1xuICAgICAgICBjb25zdCBwYWRUeXBlID0gKHRvcCA9PT0gMCAmJiBib3R0b20gPT09IDAgJiYgbGVmdCA9PT0gMCAmJiByaWdodCA9PT0gMCkgP1xuICAgICAgICAgICAgJ1ZBTElEJyA6XG4gICAgICAgICAgICAnRVhQTElDSVQnO1xuICAgICAgICBwYWRJbmZvID0geyB0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHQsIHR5cGU6IHBhZFR5cGUgfTtcbiAgICAgICAgb3V0SGVpZ2h0ID0gcm91bmQoKGluSGVpZ2h0IC0gZmlsdGVySGVpZ2h0ICsgdG9wICsgYm90dG9tKSAvIHN0cmlkZUhlaWdodCArIDEsIHJvdW5kaW5nTW9kZSk7XG4gICAgICAgIG91dFdpZHRoID0gcm91bmQoKGluV2lkdGggLSBmaWx0ZXJXaWR0aCArIGxlZnQgKyByaWdodCkgLyBzdHJpZGVXaWR0aCArIDEsIHJvdW5kaW5nTW9kZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBFcnJvcihgVW5rbm93biBwYWRkaW5nIHBhcmFtZXRlcjogJHtwYWR9YCk7XG4gICAgfVxuICAgIHJldHVybiB7IHBhZEluZm8sIG91dEhlaWdodCwgb3V0V2lkdGggfTtcbn1cbmZ1bmN0aW9uIGdldDNEUGFkQW5kT3V0SW5mbyhwYWQsIGluRGVwdGgsIGluSGVpZ2h0LCBpbldpZHRoLCBzdHJpZGVEZXB0aCwgc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aCwgZmlsdGVyRGVwdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIHJvdW5kaW5nTW9kZSkge1xuICAgIGxldCBwYWRJbmZvO1xuICAgIGxldCBvdXREZXB0aDtcbiAgICBsZXQgb3V0SGVpZ2h0O1xuICAgIGxldCBvdXRXaWR0aDtcbiAgICBpZiAodHlwZW9mIHBhZCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgY29uc3QgcGFkVHlwZSA9IChwYWQgPT09IDApID8gJ1ZBTElEJyA6ICdOVU1CRVInO1xuICAgICAgICBwYWRJbmZvID0ge1xuICAgICAgICAgICAgdG9wOiBwYWQsXG4gICAgICAgICAgICBib3R0b206IHBhZCxcbiAgICAgICAgICAgIGxlZnQ6IHBhZCxcbiAgICAgICAgICAgIHJpZ2h0OiBwYWQsXG4gICAgICAgICAgICBmcm9udDogcGFkLFxuICAgICAgICAgICAgYmFjazogcGFkLFxuICAgICAgICAgICAgdHlwZTogcGFkVHlwZVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBvdXRTaGFwZSA9IGNvbXB1dGVPdXRwdXRTaGFwZTREKFtpbkRlcHRoLCBpbkhlaWdodCwgaW5XaWR0aCwgMV0sIGZpbHRlckRlcHRoLCAxLCBzdHJpZGVEZXB0aCwgcGFkLCByb3VuZGluZ01vZGUpO1xuICAgICAgICBvdXREZXB0aCA9IG91dFNoYXBlWzBdO1xuICAgICAgICBvdXRIZWlnaHQgPSBvdXRTaGFwZVsxXTtcbiAgICAgICAgb3V0V2lkdGggPSBvdXRTaGFwZVsyXTtcbiAgICB9XG4gICAgZWxzZSBpZiAocGFkID09PSAnc2FtZScpIHtcbiAgICAgICAgb3V0RGVwdGggPSBNYXRoLmNlaWwoaW5EZXB0aCAvIHN0cmlkZURlcHRoKTtcbiAgICAgICAgb3V0SGVpZ2h0ID0gTWF0aC5jZWlsKGluSGVpZ2h0IC8gc3RyaWRlSGVpZ2h0KTtcbiAgICAgICAgb3V0V2lkdGggPSBNYXRoLmNlaWwoaW5XaWR0aCAvIHN0cmlkZVdpZHRoKTtcbiAgICAgICAgY29uc3QgcGFkQWxvbmdEZXB0aCA9IChvdXREZXB0aCAtIDEpICogc3RyaWRlRGVwdGggKyBmaWx0ZXJEZXB0aCAtIGluRGVwdGg7XG4gICAgICAgIGNvbnN0IHBhZEFsb25nSGVpZ2h0ID0gKG91dEhlaWdodCAtIDEpICogc3RyaWRlSGVpZ2h0ICsgZmlsdGVySGVpZ2h0IC0gaW5IZWlnaHQ7XG4gICAgICAgIGNvbnN0IHBhZEFsb25nV2lkdGggPSAob3V0V2lkdGggLSAxKSAqIHN0cmlkZVdpZHRoICsgZmlsdGVyV2lkdGggLSBpbldpZHRoO1xuICAgICAgICBjb25zdCBmcm9udCA9IE1hdGguZmxvb3IocGFkQWxvbmdEZXB0aCAvIDIpO1xuICAgICAgICBjb25zdCBiYWNrID0gcGFkQWxvbmdEZXB0aCAtIGZyb250O1xuICAgICAgICBjb25zdCB0b3AgPSBNYXRoLmZsb29yKHBhZEFsb25nSGVpZ2h0IC8gMik7XG4gICAgICAgIGNvbnN0IGJvdHRvbSA9IHBhZEFsb25nSGVpZ2h0IC0gdG9wO1xuICAgICAgICBjb25zdCBsZWZ0ID0gTWF0aC5mbG9vcihwYWRBbG9uZ1dpZHRoIC8gMik7XG4gICAgICAgIGNvbnN0IHJpZ2h0ID0gcGFkQWxvbmdXaWR0aCAtIGxlZnQ7XG4gICAgICAgIHBhZEluZm8gPSB7IHRvcCwgYm90dG9tLCBsZWZ0LCByaWdodCwgZnJvbnQsIGJhY2ssIHR5cGU6ICdTQU1FJyB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChwYWQgPT09ICd2YWxpZCcpIHtcbiAgICAgICAgcGFkSW5mbyA9IHtcbiAgICAgICAgICAgIHRvcDogMCxcbiAgICAgICAgICAgIGJvdHRvbTogMCxcbiAgICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgICByaWdodDogMCxcbiAgICAgICAgICAgIGZyb250OiAwLFxuICAgICAgICAgICAgYmFjazogMCxcbiAgICAgICAgICAgIHR5cGU6ICdWQUxJRCdcbiAgICAgICAgfTtcbiAgICAgICAgb3V0RGVwdGggPSBNYXRoLmNlaWwoKGluRGVwdGggLSBmaWx0ZXJEZXB0aCArIDEpIC8gc3RyaWRlRGVwdGgpO1xuICAgICAgICBvdXRIZWlnaHQgPSBNYXRoLmNlaWwoKGluSGVpZ2h0IC0gZmlsdGVySGVpZ2h0ICsgMSkgLyBzdHJpZGVIZWlnaHQpO1xuICAgICAgICBvdXRXaWR0aCA9IE1hdGguY2VpbCgoaW5XaWR0aCAtIGZpbHRlcldpZHRoICsgMSkgLyBzdHJpZGVXaWR0aCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBFcnJvcihgVW5rbm93biBwYWRkaW5nIHBhcmFtZXRlcjogJHtwYWR9YCk7XG4gICAgfVxuICAgIHJldHVybiB7IHBhZEluZm8sIG91dERlcHRoLCBvdXRIZWlnaHQsIG91dFdpZHRoIH07XG59XG4vKipcbiAqIFJvdW5kcyBhIHZhbHVlIGRlcGVuZGluZyBvbiB0aGUgcm91bmRpbmcgbW9kZVxuICogQHBhcmFtIHZhbHVlXG4gKiBAcGFyYW0gcm91bmRpbmdNb2RlIEEgc3RyaW5nIGZyb206ICdjZWlsJywgJ3JvdW5kJywgJ2Zsb29yJy4gSWYgbm9uZSBpc1xuICogICAgIHByb3ZpZGVkLCBpdCB3aWxsIGRlZmF1bHQgdG8gdHJ1bmNhdGUuXG4gKi9cbmZ1bmN0aW9uIHJvdW5kKHZhbHVlLCByb3VuZGluZ01vZGUpIHtcbiAgICBpZiAoIXJvdW5kaW5nTW9kZSkge1xuICAgICAgICByZXR1cm4gTWF0aC50cnVuYyh2YWx1ZSk7XG4gICAgfVxuICAgIHN3aXRjaCAocm91bmRpbmdNb2RlKSB7XG4gICAgICAgIGNhc2UgJ3JvdW5kJzpcbiAgICAgICAgICAgIC8vIHVzZWQgZm9yIENhZmZlIENvbnZcbiAgICAgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlKTtcbiAgICAgICAgY2FzZSAnY2VpbCc6XG4gICAgICAgICAgICAvLyB1c2VkIGZvciBDYWZmZSBQb29sXG4gICAgICAgICAgICByZXR1cm4gTWF0aC5jZWlsKHZhbHVlKTtcbiAgICAgICAgY2FzZSAnZmxvb3InOlxuICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IodmFsdWUpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHJvdW5kaW5nTW9kZSAke3JvdW5kaW5nTW9kZX1gKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gdHVwbGVWYWx1ZXNBcmVPbmUocGFyYW0pIHtcbiAgICBjb25zdCBbZGltQSwgZGltQiwgZGltQ10gPSBwYXJzZVR1cGxlUGFyYW0ocGFyYW0pO1xuICAgIHJldHVybiBkaW1BID09PSAxICYmIGRpbUIgPT09IDEgJiYgZGltQyA9PT0gMTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBlaXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgZGlsYXRpb25zKSB7XG4gICAgcmV0dXJuIHR1cGxlVmFsdWVzQXJlT25lKHN0cmlkZXMpIHx8IHR1cGxlVmFsdWVzQXJlT25lKGRpbGF0aW9ucyk7XG59XG4vKipcbiAqIENvbnZlcnQgQ29udjJEIGRhdGFGb3JtYXQgZnJvbSAnTkhXQyd8J05DSFcnIHRvXG4gKiAgICAnY2hhbm5lbHNMYXN0J3wnY2hhbm5lbHNGaXJzdCdcbiAqIEBwYXJhbSBkYXRhRm9ybWF0IGluICdOSFdDJ3wnTkNIVycgbW9kZVxuICogQHJldHVybiBkYXRhRm9ybWF0IGluICdjaGFubmVsc0xhc3QnfCdjaGFubmVsc0ZpcnN0JyBtb2RlXG4gKiBAdGhyb3dzIHVua25vd24gZGF0YUZvcm1hdFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydENvbnYyRERhdGFGb3JtYXQoZGF0YUZvcm1hdCkge1xuICAgIGlmIChkYXRhRm9ybWF0ID09PSAnTkhXQycpIHtcbiAgICAgICAgcmV0dXJuICdjaGFubmVsc0xhc3QnO1xuICAgIH1cbiAgICBlbHNlIGlmIChkYXRhRm9ybWF0ID09PSAnTkNIVycpIHtcbiAgICAgICAgcmV0dXJuICdjaGFubmVsc0ZpcnN0JztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBkYXRhRm9ybWF0ICR7ZGF0YUZvcm1hdH1gKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb252X3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IENvcyB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIGNvcyBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOiBgY29zKHgpYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzAsIE1hdGguUEkgLyAyLCBNYXRoLlBJICogMyAvIDRdKTtcbiAqXG4gKiB4LmNvcygpLnByaW50KCk7ICAvLyBvciB0Zi5jb3MoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gY29zXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnY29zJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKENvcywgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBjb3MgPSBvcCh7IGNvc18gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb3MuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IENvc2ggfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBoeXBlcmJvbGljIGNvcyBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOiBgY29zaCh4KWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFswLCAxLCAtMSwgLjddKTtcbiAqXG4gKiB4LmNvc2goKS5wcmludCgpOyAgLy8gb3IgdGYuY29zaCh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBjb3NoXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnY29zaCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChDb3NoLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGNvc2ggPSBvcCh7IGNvc2hfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29zaC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgQ3Vtc3VtIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIGN1bXVsYXRpdmUgc3VtIG9mIGEgYHRmLlRlbnNvcmAgYWxvbmcgYGF4aXNgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yKFsxLCAyLCAzLCA0XSk7XG4gKiB4LmN1bXN1bSgpLnByaW50KCk7XG4gKiBgYGBcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yKFtbMSwgMl0sIFszLCA0XV0pO1xuICogeC5jdW1zdW0oKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciB0byBiZSBzdW1tZWQuXG4gKiBAcGFyYW0gYXhpcyBUaGUgYXhpcyBhbG9uZyB3aGljaCB0byBzdW0uIE9wdGlvbmFsLiBEZWZhdWx0cyB0byAwLlxuICogQHBhcmFtIGV4Y2x1c2l2ZSBXaGV0aGVyIHRvIHBlcmZvcm0gZXhjbHVzaXZlIGN1bXVsYXRpdmUgc3VtLiBPcHRpb25hbC5cbiAqICAgICBEZWZhdWx0cyB0byBmYWxzZS4gSWYgc2V0IHRvIHRydWUgdGhlbiB0aGUgc3VtIG9mIGVhY2ggdGVuc29yIGVudHJ5XG4gKiAgICAgZG9lcyBub3QgaW5jbHVkZSBpdHMgb3duIHZhbHVlLCBidXQgb25seSB0aGUgdmFsdWVzIHByZXZpb3VzIHRvIGl0XG4gKiAgICAgYWxvbmcgdGhlIHNwZWNpZmllZCBheGlzLlxuICogQHBhcmFtIHJldmVyc2UgV2hldGhlciB0byBzdW0gaW4gdGhlIG9wcG9zaXRlIGRpcmVjdGlvbi4gT3B0aW9uYWwuXG4gKiAgICAgRGVmYXVsdHMgdG8gZmFsc2UuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU2Nhbid9XG4gKi9cbmZ1bmN0aW9uIGN1bXN1bV8oeCwgYXhpcyA9IDAsIGV4Y2x1c2l2ZSA9IGZhbHNlLCByZXZlcnNlID0gZmFsc2UpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdjdW1zdW0nKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgY29uc3QgYXR0cnMgPSB7IGF4aXMsIGV4Y2x1c2l2ZSwgcmV2ZXJzZSB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEN1bXN1bSwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgY3Vtc3VtID0gb3AoeyBjdW1zdW1fIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y3Vtc3VtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBEZW5zZUJpbmNvdW50IH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIE91dHB1dHMgYSB2ZWN0b3Igd2l0aCBsZW5ndGggYHNpemVgIGFuZCB0aGUgc2FtZSBkdHlwZSBhcyBgd2VpZ2h0c2AuXG4gKlxuICogSWYgYHdlaWdodHNgIGFyZSBlbXB0eSwgdGhlbiBpbmRleCBgaWAgc3RvcmVzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIHZhbHVlXG4gKiBgaWAgaXMgY291bnRlZCBpbiBgeGAuIElmIGB3ZWlnaHRzYCBhcmUgbm9uLWVtcHR5LCB0aGVuIGluZGV4IGBpYCBzdG9yZXMgdGhlXG4gKiBzdW0gb2YgdGhlIHZhbHVlIGluIGB3ZWlnaHRzYCBhdCBlYWNoIGluZGV4IHdoZXJlIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGluXG4gKiBgeGAgaXMgYGlgLlxuICpcbiAqIFZhbHVlcyBpbiBgeGAgb3V0c2lkZSBvZiB0aGUgcmFuZ2UgWzAsIHNpemUpIGFyZSBpZ25vcmVkLlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBpbnQgdGVuc29yLCByYW5rIDEgb3IgcmFuayAyLlxuICogQHBhcmFtIHdlaWdodHMgVGhlIHdlaWdodHMgdGVuc29yLCBtdXN0IGhhdmUgdGhlIHNhbWUgc2hhcGUgYXMgeCwgb3IgYVxuICogICAgIGxlbmd0aC0wIFRlbnNvciwgaW4gd2hpY2ggY2FzZSBpdCBhY3RzIGFzIGFsbCB3ZWlnaHRzIGVxdWFsIHRvIDEuXG4gKiBAcGFyYW0gc2l6ZSBOb24tbmVnYXRpdmUgaW50ZWdlci5cbiAqIEBwYXJhbSBiaW5hcnlPdXRwdXQgT3B0aW9uYWwuIFdoZXRoZXIgdGhlIGtlcm5lbCBzaG91bGQgY291bnQgdGhlIGFwcGVhcmFuY2VcbiAqICAgICBvciBudW1iZXIgb2Ygb2NjdXJyZW5jZXMuIERlZmF1bHRzIHRvIEZhbHNlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1JlZHVjdGlvbid9XG4gKi9cbmZ1bmN0aW9uIGRlbnNlQmluY291bnRfKHgsIHdlaWdodHMsIHNpemUsIGJpbmFyeU91dHB1dCA9IGZhbHNlKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnZGVuc2VCaW5jb3VudCcpO1xuICAgIGNvbnN0ICR3ZWlnaHRzID0gY29udmVydFRvVGVuc29yKHdlaWdodHMsICd3ZWlnaHRzJywgJ2RlbnNlQmluY291bnQnKTtcbiAgICB1dGlsLmFzc2VydCgkeC5kdHlwZSA9PT0gJ2ludDMyJywgKCkgPT4gYEVycm9yIGluIGRlbnNlQmluY291bnQ6IGlucHV0IGAgK1xuICAgICAgICBgZHR5cGUgbXVzdCBiZSBpbnQzMiwgYnV0IGdvdCAkeyR4LmR0eXBlfWApO1xuICAgIHV0aWwuYXNzZXJ0KCR4LnJhbmsgPD0gMiwgKCkgPT4gYEVycm9yIGluIGRlbnNlQmluY291bnQ6IGlucHV0IG11c3QgYmUgYXQgbW9zdCByYW5rIDIsIGJ1dCBnb3QgYCArXG4gICAgICAgIGByYW5rICR7JHgucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoc2l6ZSA+PSAwLCAoKSA9PiBgc2l6ZSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSwgYnV0IGdvdCAke3NpemV9LmApO1xuICAgIHV0aWwuYXNzZXJ0KCR3ZWlnaHRzLnNpemUgPT09ICR4LnNpemUgfHwgJHdlaWdodHMuc2l6ZSA9PT0gMCwgKCkgPT4gYEVycm9yIGluIGRlbnNlQmluY291bnQ6IHdlaWdodHMgbXVzdCBoYXZlIHRoZSBzYW1lIHNoYXBlIGFzIHggb3IgYCArXG4gICAgICAgIGAwLWxlbmd0aCwgYnV0IGdvdCB4IHNoYXBlOiAkeyR4LnNoYXBlfSwgd2VpZ2h0cyBzaGFwZTogYCArXG4gICAgICAgIGAkeyR3ZWlnaHRzLnNoYXBlfS5gKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4LCB3ZWlnaHRzOiAkd2VpZ2h0cyB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBzaXplLCBiaW5hcnlPdXRwdXQgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChEZW5zZUJpbmNvdW50LCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBkZW5zZUJpbmNvdW50ID0gb3AoeyBkZW5zZUJpbmNvdW50XyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRlbnNlX2JpbmNvdW50LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBEZXB0aFRvU3BhY2UgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmVhcnJhbmdlcyBkYXRhIGZyb20gZGVwdGggaW50byBibG9ja3Mgb2Ygc3BhdGlhbCBkYXRhLiBNb3JlIHNwZWNpZmljYWxseSxcbiAqIHRoaXMgb3Agb3V0cHV0cyBhIGNvcHkgb2YgdGhlIGlucHV0IHRlbnNvciB3aGVyZSB2YWx1ZXMgZnJvbSB0aGUgYGRlcHRoYFxuICogZGltZW5zaW9uIGFyZSBtb3ZlZCBpbiBzcGF0aWFsIGJsb2NrcyB0byB0aGUgYGhlaWdodGAgYW5kIGB3aWR0aGAgZGltZW5zaW9ucy5cbiAqIFRoZSBhdHRyIGBibG9ja1NpemVgIGluZGljYXRlcyB0aGUgaW5wdXQgYmxvY2sgc2l6ZSBhbmQgaG93IHRoZSBkYXRhIGlzXG4gKiBtb3ZlZC5cbiAqXG4gKiAgLSBDaHVua3Mgb2YgZGF0YSBvZiBzaXplIGBibG9ja1NpemUgKiBibG9ja1NpemVgIGZyb20gZGVwdGggYXJlIHJlYXJyYW5nZWRcbiAqIGludG8gbm9uLW92ZXJsYXBwaW5nIGJsb2NrcyBvZiBzaXplIGBibG9ja1NpemUgeCBibG9ja1NpemVgXG4gKlxuICogIC0gVGhlIHdpZHRoIHRoZSBvdXRwdXQgdGVuc29yIGlzIGBpbnB1dFdpZHRoICogYmxvY2tTaXplYCwgd2hlcmVhcyB0aGVcbiAqIGhlaWdodCBpcyBgaW5wdXRIZWlnaHQgKiBibG9ja1NpemVgXG4gKlxuICogIC0gVGhlIFksIFggY29vcmRpbmF0ZXMgd2l0aGluIGVhY2ggYmxvY2sgb2YgdGhlIG91dHB1dCBpbWFnZSBhcmUgZGV0ZXJtaW5lZFxuICogYnkgdGhlIGhpZ2ggb3JkZXIgY29tcG9uZW50IG9mIHRoZSBpbnB1dCBjaGFubmVsIGluZGV4XG4gKlxuICogIC0gVGhlIGRlcHRoIG9mIHRoZSBpbnB1dCB0ZW5zb3IgbXVzdCBiZSBkaXZpc2libGUgYnkgYGJsb2NrU2l6ZSAqXG4gKiBibG9ja1NpemVgXG4gKlxuICogVGhlIGBkYXRhRm9ybWF0YCBhdHRyIHNwZWNpZmllcyB0aGUgbGF5b3V0IG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IHRlbnNvcnNcbiAqIHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zOiBcIk5IV0NcIjogWyBgYmF0Y2gsIGhlaWdodCwgd2lkdGgsIGNoYW5uZWxzYCBdXG4gKiBcIk5DSFdcIjogWyBgYmF0Y2gsIGNoYW5uZWxzLCBoZWlnaHQsIHdpZHRoYCBdXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3I0ZChbMSwgMiwgMywgNF0sIFsxLCAxLCAxLCA0XSk7XG4gKiBjb25zdCBibG9ja1NpemUgPSAyO1xuICogY29uc3QgZGF0YUZvcm1hdCA9IFwiTkhXQ1wiO1xuICpcbiAqIHRmLmRlcHRoVG9TcGFjZSh4LCBibG9ja1NpemUsIGRhdGFGb3JtYXQpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yIG9mIHJhbmsgNFxuICogQHBhcmFtIGJsb2NrU0l6ZSAgQW4gYGludGAgdGhhdCBpcyBgPj0gMmAuIFRoZSBzaXplIG9mIHRoZSBzcGF0aWFsIGJsb2NrXG4gKiBAcGFyYW0gZGF0YUZvcm1hdCBBbiBvcHRpb25hbCBzdHJpbmcgZnJvbTogXCJOSFdDXCIsIFwiTkNIV1wiLiBEZWZhdWx0cyB0byBcIk5IV0NcIlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1RyYW5zZm9ybWF0aW9ucyd9XG4gKi9cbmZ1bmN0aW9uIGRlcHRoVG9TcGFjZV8oeCwgYmxvY2tTaXplLCBkYXRhRm9ybWF0ID0gJ05IV0MnKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnZGVwdGhUb1NwYWNlJyk7XG4gICAgY29uc3QgaW5wdXRIZWlnaHQgPSAoZGF0YUZvcm1hdCA9PT0gJ05IV0MnKSA/ICR4LnNoYXBlWzFdIDogJHguc2hhcGVbMl07XG4gICAgY29uc3QgaW5wdXRXaWR0aCA9IChkYXRhRm9ybWF0ID09PSAnTkhXQycpID8gJHguc2hhcGVbMl0gOiAkeC5zaGFwZVszXTtcbiAgICBjb25zdCBpbnB1dERlcHRoID0gKGRhdGFGb3JtYXQgPT09ICdOSFdDJykgPyAkeC5zaGFwZVszXSA6ICR4LnNoYXBlWzFdO1xuICAgIHV0aWwuYXNzZXJ0KGlucHV0SGVpZ2h0ICogYmxvY2tTaXplID49IDAsICgpID0+IGBOZWdhdGl2ZSBkaW1lbnNpb24gc2l6ZSBjYXVzZWQgYnkgb3ZlcmZsb3cgd2hlbiBtdWx0aXBseWluZ1xuICAgICR7aW5wdXRIZWlnaHR9IGFuZCAke2Jsb2NrU2l6ZX0gIGZvciBkZXB0aFRvU3BhY2Ugd2l0aCBpbnB1dCBzaGFwZVxuICAgICR7JHguc2hhcGV9YCk7XG4gICAgdXRpbC5hc3NlcnQoaW5wdXRXaWR0aCAqIGJsb2NrU2l6ZSA+PSAwLCAoKSA9PiBgTmVnYXRpdmUgZGltZW5zaW9uIHNpemUgY2F1c2VkIGJ5IG92ZXJmbG93IHdoZW4gbXVsdGlwbHlpbmdcbiAgICAke2lucHV0V2lkdGh9IGFuZCAke2Jsb2NrU2l6ZX0gZm9yIGRlcHRoVG9TcGFjZSB3aXRoIGlucHV0IHNoYXBlXG4gICAgICAgICR7JHguc2hhcGV9YCk7XG4gICAgdXRpbC5hc3NlcnQoKGlucHV0RGVwdGggJSAoYmxvY2tTaXplICogYmxvY2tTaXplKSA9PT0gMCksICgpID0+IGBEaW1lbnNpb24gc2l6ZSBtdXN0IGJlIGV2ZW5seSBkaXZpc2libGUgYnkgJHtibG9ja1NpemUgKiBibG9ja1NpemV9IGJ1dCBpcyAke2lucHV0RGVwdGh9IGZvciBkZXB0aFRvU3BhY2Ugd2l0aCBpbnB1dCBzaGFwZSAkeyR4LnNoYXBlfWApO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICBjb25zdCBhdHRycyA9IHsgYmxvY2tTaXplLCBkYXRhRm9ybWF0IH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoRGVwdGhUb1NwYWNlLCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBkZXB0aFRvU3BhY2UgPSBvcCh7IGRlcHRoVG9TcGFjZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZXB0aF90b19zcGFjZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgRGVwdGh3aXNlQ29udjJkTmF0aXZlIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbi8qKlxuICogRGVwdGh3aXNlIDJEIGNvbnZvbHV0aW9uLlxuICpcbiAqIEdpdmVuIGEgNEQgYGlucHV0YCBhcnJheSBhbmQgYSBgZmlsdGVyYCBhcnJheSBvZiBzaGFwZVxuICogYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBpbkNoYW5uZWxzLCBjaGFubmVsTXVsdGlwbGllcl1gIGNvbnRhaW5pbmdcbiAqIGBpbkNoYW5uZWxzYCBjb252b2x1dGlvbmFsIGZpbHRlcnMgb2YgZGVwdGggMSwgdGhpcyBvcCBhcHBsaWVzIGFcbiAqIGRpZmZlcmVudCBmaWx0ZXIgdG8gZWFjaCBpbnB1dCBjaGFubmVsIChleHBhbmRpbmcgZnJvbSAxIGNoYW5uZWwgdG9cbiAqIGBjaGFubmVsTXVsdGlwbGllcmAgY2hhbm5lbHMgZm9yIGVhY2gpLCB0aGVuIGNvbmNhdGVuYXRlcyB0aGUgcmVzdWx0c1xuICogdG9nZXRoZXIuIFRoZSBvdXRwdXQgaGFzIGBpbkNoYW5uZWxzICogY2hhbm5lbE11bHRpcGxpZXJgIGNoYW5uZWxzLlxuICpcbiAqIFNlZVxuICogW2h0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9kZXB0aHdpc2VfY29udjJkXShcbiAqICAgICBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vZGVwdGh3aXNlX2NvbnYyZClcbiAqIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciwgb2YgcmFuayA0IG9yIHJhbmsgMywgb2Ygc2hhcGVcbiAqICAgICBgW2JhdGNoLCBoZWlnaHQsIHdpZHRoLCBpbkNoYW5uZWxzXWAuIElmIHJhbmsgMywgYmF0Y2ggb2YgMSBpc1xuICogYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciB0ZW5zb3IsIHJhbmsgNCwgb2Ygc2hhcGVcbiAqICAgICBgW2ZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGluQ2hhbm5lbHMsIGNoYW5uZWxNdWx0aXBsaWVyXWAuXG4gKiBAcGFyYW0gc3RyaWRlcyBUaGUgc3RyaWRlcyBvZiB0aGUgY29udm9sdXRpb246IGBbc3RyaWRlSGVpZ2h0LFxuICogc3RyaWRlV2lkdGhdYC4gSWYgc3RyaWRlcyBpcyBhIHNpbmdsZSBudW1iZXIsIHRoZW4gYHN0cmlkZUhlaWdodCA9PVxuICogc3RyaWRlV2lkdGhgLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobS5cbiAqICAgLSBgc2FtZWAgYW5kIHN0cmlkZSAxOiBvdXRwdXQgd2lsbCBiZSBvZiBzYW1lIHNpemUgYXMgaW5wdXQsXG4gKiAgICAgICByZWdhcmRsZXNzIG9mIGZpbHRlciBzaXplLlxuICogICAtIGB2YWxpZGA6IG91dHB1dCB3aWxsIGJlIHNtYWxsZXIgdGhhbiBpbnB1dCBpZiBmaWx0ZXIgaXMgbGFyZ2VyXG4gKiAgICAgICB0aGFuIDF4MS5cbiAqICAgLSBGb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uXShcbiAqICAgICAgICAgIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbilcbiAqIEBwYXJhbSBkaWxhdGlvbnMgVGhlIGRpbGF0aW9uIHJhdGVzOiBgW2RpbGF0aW9uSGVpZ2h0LCBkaWxhdGlvbldpZHRoXWBcbiAqICAgICBpbiB3aGljaCB3ZSBzYW1wbGUgaW5wdXQgdmFsdWVzIGFjcm9zcyB0aGUgaGVpZ2h0IGFuZCB3aWR0aCBkaW1lbnNpb25zXG4gKiAgICAgaW4gYXRyb3VzIGNvbnZvbHV0aW9uLiBEZWZhdWx0cyB0byBgWzEsIDFdYC4gSWYgYHJhdGVgIGlzIGEgc2luZ2xlXG4gKiAgICAgbnVtYmVyLCB0aGVuIGBkaWxhdGlvbkhlaWdodCA9PSBkaWxhdGlvbldpZHRoYC4gSWYgaXQgaXMgZ3JlYXRlciB0aGFuXG4gKiAgICAgMSwgdGhlbiBhbGwgdmFsdWVzIG9mIGBzdHJpZGVzYCBtdXN0IGJlIDEuXG4gKiBAcGFyYW0gZGF0YUZvcm1hdDogQW4gb3B0aW9uYWwgc3RyaW5nIGZyb206IFwiTkhXQ1wiLCBcIk5DSFdcIi4gRGVmYXVsdHMgdG9cbiAqICAgICBcIk5IV0NcIi4gU3BlY2lmeSB0aGUgZGF0YSBmb3JtYXQgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YS4gV2l0aCB0aGVcbiAqICAgICBkZWZhdWx0IGZvcm1hdCBcIk5IV0NcIiwgdGhlIGRhdGEgaXMgc3RvcmVkIGluIHRoZSBvcmRlciBvZjogW2JhdGNoLFxuICogICAgIGhlaWdodCwgd2lkdGgsIGNoYW5uZWxzXS4gT25seSBcIk5IV0NcIiBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlxuICogQHBhcmFtIGRpbVJvdW5kaW5nTW9kZSBBIHN0cmluZyBmcm9tOiAnY2VpbCcsICdyb3VuZCcsICdmbG9vcicuIElmIG5vbmUgaXNcbiAqICAgICBwcm92aWRlZCwgaXQgd2lsbCBkZWZhdWx0IHRvIHRydW5jYXRlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0NvbnZvbHV0aW9uJ31cbiAqL1xuZnVuY3Rpb24gZGVwdGh3aXNlQ29udjJkXyh4LCBmaWx0ZXIsIHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCA9ICdOSFdDJywgZGlsYXRpb25zID0gWzEsIDFdLCBkaW1Sb3VuZGluZ01vZGUpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdkZXB0aHdpc2VDb252MmQnKTtcbiAgICBjb25zdCAkZmlsdGVyID0gY29udmVydFRvVGVuc29yKGZpbHRlciwgJ2ZpbHRlcicsICdkZXB0aHdpc2VDb252MmQnKTtcbiAgICBsZXQgeDREID0gJHg7XG4gICAgbGV0IHJlc2hhcGVkVG80RCA9IGZhbHNlO1xuICAgIGlmICgkeC5yYW5rID09PSAzKSB7XG4gICAgICAgIHJlc2hhcGVkVG80RCA9IHRydWU7XG4gICAgICAgIHg0RCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV0sICR4LnNoYXBlWzJdXSk7XG4gICAgfVxuICAgIHV0aWwuYXNzZXJ0KHg0RC5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gZGVwdGh3aXNlQ29udjJkOiBpbnB1dCBtdXN0IGJlIHJhbmsgNCwgYnV0IGdvdCBgICtcbiAgICAgICAgYHJhbmsgJHt4NEQucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoJGZpbHRlci5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gZGVwdGh3aXNlQ29udjJkOiBmaWx0ZXIgbXVzdCBiZSByYW5rIDQsIGJ1dCBnb3QgcmFuayBgICtcbiAgICAgICAgYCR7JGZpbHRlci5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydCh4NEQuc2hhcGVbM10gPT09ICRmaWx0ZXIuc2hhcGVbMl0sICgpID0+IGBFcnJvciBpbiBkZXB0aHdpc2VDb252MmQ6IG51bWJlciBvZiBpbnB1dCBjaGFubmVscyBgICtcbiAgICAgICAgYCgke3g0RC5zaGFwZVszXX0pIG11c3QgbWF0Y2ggdGhlIGluQ2hhbm5lbHMgZGltZW5zaW9uIGluIGAgK1xuICAgICAgICBgZmlsdGVyICR7JGZpbHRlci5zaGFwZVsyXX0uYCk7XG4gICAgaWYgKGRpbVJvdW5kaW5nTW9kZSAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNJbnQocGFkKSwgKCkgPT4gYEVycm9yIGluIGRlcHRod2lzZUNvbnYyZDogcGFkIG11c3QgYmUgYW4gaW50ZWdlciB3aGVuIHVzaW5nLCBgICtcbiAgICAgICAgICAgIGBkaW1Sb3VuZGluZ01vZGUgJHtkaW1Sb3VuZGluZ01vZGV9IGJ1dCBnb3QgcGFkICR7cGFkfS5gKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiB4NEQsIGZpbHRlcjogJGZpbHRlciB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQsIGRpbGF0aW9ucywgZGltUm91bmRpbmdNb2RlIH07XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgIGNvbnN0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoRGVwdGh3aXNlQ29udjJkTmF0aXZlLCBpbnB1dHMsIGF0dHJzKTtcbiAgICBpZiAocmVzaGFwZWRUbzREKSB7XG4gICAgICAgIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydCBjb25zdCBkZXB0aHdpc2VDb252MmQgPSBvcCh7IGRlcHRod2lzZUNvbnYyZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZXB0aHdpc2VfY29udjJkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlciB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL3Jlc2hhcGUnO1xuZnVuY3Rpb24gZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXJfKHgsIGR5LCBmaWx0ZXJTaGFwZSwgc3RyaWRlcywgcGFkLCBkaWxhdGlvbnMgPSBbMSwgMV0sIGRpbVJvdW5kaW5nTW9kZSkge1xuICAgIGxldCB4NEQgPSB4O1xuICAgIGlmICh4LnJhbmsgPT09IDMpIHtcbiAgICAgICAgeDREID0gcmVzaGFwZSh4LCBbMSwgeC5zaGFwZVswXSwgeC5zaGFwZVsxXSwgeC5zaGFwZVsyXV0pO1xuICAgIH1cbiAgICBsZXQgZHk0RCA9IGR5O1xuICAgIGlmIChkeTRELnJhbmsgPT09IDMpIHtcbiAgICAgICAgZHk0RCA9IHJlc2hhcGUoZHksIFsxLCBkeS5zaGFwZVswXSwgZHkuc2hhcGVbMV0sIGR5LnNoYXBlWzJdXSk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogeDRELCBkeTogZHk0RCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgZGlsYXRpb25zLCBmaWx0ZXJTaGFwZSB9O1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlciwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIgPSBvcCh7IGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRlcHRod2lzZV9jb252MmRfbmF0aXZlX2JhY2twcm9wX2ZpbHRlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL3Jlc2hhcGUnO1xuZnVuY3Rpb24gZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dF8oeFNoYXBlLCBkeSwgZmlsdGVyLCBzdHJpZGVzLCBwYWQsIGRpbGF0aW9ucyA9IFsxLCAxXSwgZGltUm91bmRpbmdNb2RlKSB7XG4gICAgbGV0IGR5NEQgPSBkeTtcbiAgICBsZXQgcmVzaGFwZWRUbzREID0gZmFsc2U7XG4gICAgaWYgKGR5LnJhbmsgPT09IDMpIHtcbiAgICAgICAgcmVzaGFwZWRUbzREID0gdHJ1ZTtcbiAgICAgICAgZHk0RCA9IHJlc2hhcGUoZHksIFsxLCBkeS5zaGFwZVswXSwgZHkuc2hhcGVbMV0sIGR5LnNoYXBlWzJdXSk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0cyA9IHsgZHk6IGR5NEQsIGZpbHRlciB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgZGlsYXRpb25zLCBpbnB1dFNoYXBlOiB4U2hhcGUgfTtcbiAgICBjb25zdCByZXMgPSBcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgRU5HSU5FLnJ1bktlcm5lbChEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0LCBpbnB1dHMsIGF0dHJzKTtcbiAgICBpZiAocmVzaGFwZWRUbzREKSB7XG4gICAgICAgIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydCBjb25zdCBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0ID0gb3AoeyBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0XyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRlcHRod2lzZV9jb252MmRfbmF0aXZlX2JhY2twcm9wX2lucHV0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBEaWFnIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV0dXJucyBhIGRpYWdvbmFsIHRlbnNvciB3aXRoIGEgZ2l2ZW4gZGlhZ29uYWwgdmFsdWVzLlxuICpcbiAqIEdpdmVuIGEgZGlhZ29uYWwsIHRoaXMgb3BlcmF0aW9uIHJldHVybnMgYSB0ZW5zb3Igd2l0aCB0aGUgZGlhZ29uYWwgYW5kXG4gKiBldmVyeXRoaW5nIGVsc2UgcGFkZGVkIHdpdGggemVyb3MuXG4gKlxuICogQXNzdW1lIHRoZSBpbnB1dCBoYXMgZGltZW5zaW9ucyBgW0QxLC4uLiwgRGtdYCwgdGhlbiB0aGUgb3V0cHV0IGlzIGEgdGVuc29yXG4gKiBvZiByYW5rIDJrIHdpdGggZGltZW5zaW9ucyBgW0QxLC4uLiwgRGssIEQxLC4uLiwgRGtdYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDMsIDRdKTtcbiAqXG4gKiB0Zi5kaWFnKHgpLnByaW50KClcbiAqIGBgYFxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgMywgNCwgNSwgNiwgNiwgOF0sIFs0LCAyXSlcbiAqXG4gKiB0Zi5kaWFnKHgpLnByaW50KClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmZ1bmN0aW9uIGRpYWdfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdkaWFnJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKERpYWcsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgZGlhZyA9IG9wKHsgZGlhZ18gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaWFnLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBEaWxhdGlvbjJEIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIGdyYXlzY2FsZSBkaWxhdGlvbiBvdmVyIHRoZSBpbnB1dCBgeGAuXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciwgcmFuayAzIG9yIHJhbmsgNCBvZiBzaGFwZVxuICogICAgIGBbYmF0Y2gsIGhlaWdodCwgd2lkdGgsIGluQ2hhbm5lbHNdYC4gSWYgcmFuayAzLCBiYXRjaCBvZiAxIGlzIGFzc3VtZWQuXG4gKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgdGVuc29yLCByYW5rIDMsIG9mIHNoYXBlXG4gKiAgICAgYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBkZXB0aF1gLlxuICogQHBhcmFtIHN0cmlkZXMgVGhlIHN0cmlkZXMgb2YgdGhlIHNsaWRpbmcgd2luZG93IGZvciBlYWNoIGRpbWVuc2lvbiBvZiB0aGVcbiAqICAgICBpbnB1dCB0ZW5zb3I6IGBbc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aF1gLlxuICogICAgIElmIGBzdHJpZGVzYCBpcyBhIHNpbmdsZSBudW1iZXIsXG4gKiAgICAgdGhlbiBgc3RyaWRlSGVpZ2h0ID09IHN0cmlkZVdpZHRoYC5cbiAqIEBwYXJhbSBwYWQgVGhlIHR5cGUgb2YgcGFkZGluZyBhbGdvcml0aG0uXG4gKiAgICAtIGBzYW1lYCBhbmQgc3RyaWRlIDE6IG91dHB1dCB3aWxsIGJlIG9mIHNhbWUgc2l6ZSBhcyBpbnB1dCxcbiAqICAgICAgIHJlZ2FyZGxlc3Mgb2YgZmlsdGVyIHNpemUuXG4gKiAgICAtIGB2YWxpZGA6IG91dHB1dCB3aWxsIGJlIHNtYWxsZXIgdGhhbiBpbnB1dCBpZiBmaWx0ZXIgaXMgbGFyZ2VyXG4gKiAgICAgICB0aGFuIDEqMXgxLlxuICogICAgLSBGb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uXShcbiAqICAgICAgICAgIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbilcbiAqIEBwYXJhbSBkYXRhRm9ybWF0IFNwZWNpZnkgdGhlIGRhdGEgZm9ybWF0IG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEuXG4gKiAgICAgIERlZmF1bHRzIHRvICdOSFdDJy4gT25seSAnTkhXQycgaXMgY3VycmVudGx5IHN1cHBvcnRlZC4gV2l0aCB0aGVcbiAqICAgICAgZGVmYXVsdCBmb3JtYXQgXCJOSFdDXCIsIHRoZSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgb3JkZXIgb2Y6IFtiYXRjaCxcbiAqICAgICAgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbHNdLlxuICogQHBhcmFtIGRpbGF0aW9ucyBUaGUgZGlsYXRpb24gcmF0ZXM6IGBbZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGhdYFxuICogICAgIGluIHdoaWNoIHdlIHNhbXBsZSBpbnB1dCB2YWx1ZXMgYWNyb3NzIHRoZSBoZWlnaHQgYW5kIHdpZHRoIGRpbWVuc2lvbnNcbiAqICAgICBmb3IgYXRyb3VzIG1vcnBob2xvZ2ljYWwgZGlsYXRpb24uIERlZmF1bHRzIHRvIGBbMSwgMV1gLiBJZiBgZGlsYXRpb25zYFxuICogICAgIGlzIGEgc2luZ2xlIG51bWJlciwgdGhlbiBgZGlsYXRpb25IZWlnaHQgPT0gZGlsYXRpb25XaWR0aGAuIElmIGl0IGlzXG4gKiAgICAgZ3JlYXRlciB0aGFuIDEsIHRoZW4gYWxsIHZhbHVlcyBvZiBgc3RyaWRlc2AgbXVzdCBiZSAxLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0NvbnZvbHV0aW9uJ31cbiAqL1xuZnVuY3Rpb24gZGlsYXRpb24yZF8oeCwgZmlsdGVyLCBzdHJpZGVzLCBwYWQsIGRpbGF0aW9ucyA9IFsxLCAxXSwgZGF0YUZvcm1hdCA9ICdOSFdDJykge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2RpbGF0aW9uMmQnKTtcbiAgICBjb25zdCAkZmlsdGVyID0gY29udmVydFRvVGVuc29yKGZpbHRlciwgJ2ZpbHRlcicsICdkaWxhdGlvbjJkJyk7XG4gICAgdXRpbC5hc3NlcnQoJHgucmFuayA9PT0gMyB8fCAkeC5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gZGlsYXRpb24yZDogaW5wdXQgbXVzdCBiZSByYW5rIDMgb3IgNCwgYnV0IGdvdCByYW5rIGAgK1xuICAgICAgICBgJHskeC5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydCgkZmlsdGVyLnJhbmsgPT09IDMsICgpID0+IGBFcnJvciBpbiBkaWxhdGlvbjJkOiBmaWx0ZXIgbXVzdCBiZSByYW5rIDMsIGJ1dCBnb3QgcmFuayBgICtcbiAgICAgICAgYCR7JGZpbHRlci5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydChkYXRhRm9ybWF0ID09PSAnTkhXQycsICgpID0+IGBFcnJvciBpbiBkaWxhdGlvbjJkOiBPbmx5IE5IV0MgaXMgY3VycmVudGx5IHN1cHBvcnRlZCwgYCArXG4gICAgICAgIGBidXQgZ290IGRhdGFGb3JtYXQgb2YgJHtkYXRhRm9ybWF0fWApO1xuICAgIGxldCB4NEQgPSAkeDtcbiAgICBsZXQgcmVzaGFwZWRUbzREID0gZmFsc2U7XG4gICAgaWYgKCR4LnJhbmsgPT09IDMpIHtcbiAgICAgICAgeDREID0gcmVzaGFwZSgkeCwgWzEsICR4LnNoYXBlWzBdLCAkeC5zaGFwZVsxXSwgJHguc2hhcGVbMl1dKTtcbiAgICAgICAgcmVzaGFwZWRUbzREID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiB4NEQsIGZpbHRlcjogJGZpbHRlciB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBzdHJpZGVzLCBwYWQsIGRpbGF0aW9ucyB9O1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICBjb25zdCByZXMgPSBFTkdJTkUucnVuS2VybmVsKERpbGF0aW9uMkQsIGlucHV0cywgYXR0cnMpO1xuICAgIGlmIChyZXNoYXBlZFRvNEQpIHtcbiAgICAgICAgcmV0dXJuIHJlc2hhcGUocmVzLCBbcmVzLnNoYXBlWzFdLCByZXMuc2hhcGVbMl0sIHJlcy5zaGFwZVszXV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IGRpbGF0aW9uMmQgPSBvcCh7IGRpbGF0aW9uMmRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGlsYXRpb24yZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgUmVhbERpdiB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBtYWtlVHlwZXNNYXRjaCB9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBmbG9vckRpdiB9IGZyb20gJy4vZmxvb3JEaXYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIERpdmlkZXMgdHdvIGB0Zi5UZW5zb3JgcyBlbGVtZW50LXdpc2UsIEEgLyBCLiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgNCwgOSwgMTZdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbMSwgMiwgMywgNF0pO1xuICpcbiAqIGEuZGl2KGIpLnByaW50KCk7ICAvLyBvciB0Zi5kaXYoYSwgYilcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBCcm9hZGNhc3QgZGl2IGEgd2l0aCBiLlxuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsyLCA0LCA2LCA4XSk7XG4gKiBjb25zdCBiID0gdGYuc2NhbGFyKDIpO1xuICpcbiAqIGEuZGl2KGIpLnByaW50KCk7ICAvLyBvciB0Zi5kaXYoYSwgYilcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCB0ZW5zb3IgYXMgdGhlIG51bWVyYXRvci5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgdGVuc29yIGFzIHRoZSBkZW5vbWluYXRvci4gTXVzdCBoYXZlIHRoZSBzYW1lIGR0eXBlIGFzXG4gKiBgYWAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQXJpdGhtZXRpYyd9XG4gKi9cbmZ1bmN0aW9uIGRpdl8oYSwgYikge1xuICAgIGxldCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdkaXYnKTtcbiAgICBsZXQgJGIgPSBjb252ZXJ0VG9UZW5zb3IoYiwgJ2InLCAnZGl2Jyk7XG4gICAgWyRhLCAkYl0gPSBtYWtlVHlwZXNNYXRjaCgkYSwgJGIpO1xuICAgIGlmICgkYS5kdHlwZSA9PT0gJ2ludDMyJyAmJiAkYi5kdHlwZSA9PT0gJ2ludDMyJykge1xuICAgICAgICByZXR1cm4gZmxvb3JEaXYoJGEsICRiKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyBhOiAkYSwgYjogJGIgfTtcbiAgICBjb25zdCBhdHRycyA9IHt9O1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChSZWFsRGl2LCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBkaXYgPSBvcCh7IGRpdl8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaXYuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgbWFrZVR5cGVzTWF0Y2ggfSBmcm9tICcuLi90ZW5zb3JfdXRpbCc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgZGl2IH0gZnJvbSAnLi9kaXYnO1xuaW1wb3J0IHsgZXF1YWwgfSBmcm9tICcuL2VxdWFsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgd2hlcmUgfSBmcm9tICcuL3doZXJlJztcbmltcG9ydCB7IHplcm9zTGlrZSB9IGZyb20gJy4vemVyb3NfbGlrZSc7XG4vKipcbiAqIERpdmlkZXMgdHdvIGB0Zi5UZW5zb3JgcyBlbGVtZW50LXdpc2UsIEEgLyBCLiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuIFJldHVybiAwXG4gKiBpZiBkZW5vbWluYXRvciBpcyAwLlxuICpcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCA0LCA5LCAxNl0pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzLCA0XSk7XG4gKiBjb25zdCBjID0gdGYudGVuc29yMWQoWzAsIDAsIDAsIDBdKTtcbiAqXG4gKiBhLmRpdk5vTmFuKGIpLnByaW50KCk7ICAvLyBvciB0Zi5kaXZOb05hbihhLCBiKVxuICogYS5kaXZOb05hbihjKS5wcmludCgpOyAgLy8gb3IgdGYuZGl2Tm9OYW4oYSwgYylcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBCcm9hZGNhc3QgZGl2IGEgd2l0aCBiLlxuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsyLCA0LCA2LCA4XSk7XG4gKiBjb25zdCBiID0gdGYuc2NhbGFyKDIpO1xuICogY29uc3QgYyA9IHRmLnNjYWxhcigwKTtcbiAqXG4gKiBhLmRpdk5vTmFuKGIpLnByaW50KCk7ICAvLyBvciB0Zi5kaXZOb05hbihhLCBiKVxuICogYS5kaXZOb05hbihjKS5wcmludCgpOyAgLy8gb3IgdGYuZGl2Tm9OYW4oYSwgYylcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCB0ZW5zb3IgYXMgdGhlIG51bWVyYXRvci5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgdGVuc29yIGFzIHRoZSBkZW5vbWluYXRvci4gTXVzdCBoYXZlIHRoZSBzYW1lIGR0eXBlIGFzXG4gKiBgYWAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQXJpdGhtZXRpYyd9XG4gKi9cbmZ1bmN0aW9uIGRpdk5vTmFuXyhhLCBiKSB7XG4gICAgLy8gVE9ETzogTWFrZSB0aGlzIGludG8gaXRzIG93biBrZXJuZWwuXG4gICAgbGV0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ2RpdicpO1xuICAgIGxldCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdkaXYnKTtcbiAgICBbJGEsICRiXSA9IG1ha2VUeXBlc01hdGNoKCRhLCAkYik7XG4gICAgY29uc3QgZGl2UmVzdWx0ID0gZGl2KCRhLCAkYik7XG4gICAgY29uc3QgemVyb3MgPSB6ZXJvc0xpa2UoZGl2UmVzdWx0KTtcbiAgICBjb25zdCBiRXF1YWxzWmVybyA9IGVxdWFsKCRiLCB6ZXJvcyk7XG4gICAgcmV0dXJuIHdoZXJlKGJFcXVhbHNaZXJvLCB6ZXJvcywgZGl2UmVzdWx0KTtcbn1cbmV4cG9ydCBjb25zdCBkaXZOb05hbiA9IG9wKHsgZGl2Tm9OYW5fIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGl2X25vX25hbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG1hdE11bCB9IGZyb20gJy4vbWF0X211bCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL3Jlc2hhcGUnO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIG1hdHJpY2VzIGFuZC9vciB2ZWN0b3JzLCBgdDFgIGFuZCBgdDJgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDJdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IyZChbWzEsIDJdLCBbMywgNF1dKTtcbiAqIGNvbnN0IGMgPSB0Zi50ZW5zb3IyZChbWzEsIDIsIDNdLCBbNCwgNSwgNl1dKTtcbiAqXG4gKiBhLmRvdChiKS5wcmludCgpOyAgLy8gb3IgdGYuZG90KGEsIGIpXG4gKiBiLmRvdChhKS5wcmludCgpO1xuICogYi5kb3QoYykucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIHQxIFRoZSBmaXJzdCB0ZW5zb3IgaW4gdGhlIGRvdCBvcGVyYXRpb24uXG4gKiBAcGFyYW0gdDIgVGhlIHNlY29uZCB0ZW5zb3IgaW4gdGhlIGRvdCBvcGVyYXRpb24uXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTWF0cmljZXMnfVxuICovXG5mdW5jdGlvbiBkb3RfKHQxLCB0Mikge1xuICAgIGNvbnN0ICR0MSA9IGNvbnZlcnRUb1RlbnNvcih0MSwgJ3QxJywgJ2RvdCcpO1xuICAgIGNvbnN0ICR0MiA9IGNvbnZlcnRUb1RlbnNvcih0MiwgJ3QyJywgJ2RvdCcpO1xuICAgIHV0aWwuYXNzZXJ0KCgkdDEucmFuayA9PT0gMSB8fCAkdDEucmFuayA9PT0gMikgJiYgKCR0Mi5yYW5rID09PSAxIHx8ICR0Mi5yYW5rID09PSAyKSwgKCkgPT4gYEVycm9yIGluIGRvdDogaW5wdXRzIG11c3QgYWxsIGJlIHJhbmsgMSBvciAyLCBidXQgZ290IHJhbmtzIGAgK1xuICAgICAgICBgJHskdDEucmFua30gYW5kICR7JHQyLnJhbmt9LmApO1xuICAgIGNvbnN0IHQxSW5uZXIgPSAoJHQxLnJhbmsgPT09IDEgPyAkdDEuc2l6ZSA6ICR0MS5zaGFwZVsxXSk7XG4gICAgY29uc3QgdDJJbm5lciA9ICgkdDIucmFuayA9PT0gMSA/ICR0Mi5zaXplIDogJHQyLnNoYXBlWzBdKTtcbiAgICB1dGlsLmFzc2VydCh0MUlubmVyID09PSB0MklubmVyLCAoKSA9PiBgRXJyb3IgaW4gZG90OiBpbm5lciBkaW1lbnNpb25zIG9mIGlucHV0cyBtdXN0IG1hdGNoLCBidXQgZ290IGAgK1xuICAgICAgICBgJHt0MUlubmVyfSBhbmQgJHt0MklubmVyfS5gKTtcbiAgICBpZiAoJHQxLnJhbmsgPT09IDEgJiYgJHQyLnJhbmsgPT09IDEpIHtcbiAgICAgICAgY29uc3QgdDEyRCA9IHJlc2hhcGUoJHQxLCBbMSwgLTFdKTtcbiAgICAgICAgY29uc3QgdDIyRCA9IHJlc2hhcGUoJHQyLCBbLTEsIDFdKTtcbiAgICAgICAgY29uc3QgdDF0MiA9IG1hdE11bCh0MTJELCB0MjJEKTtcbiAgICAgICAgcmV0dXJuIHJlc2hhcGUodDF0MiwgW10pO1xuICAgIH1cbiAgICBlbHNlIGlmICgkdDEucmFuayA9PT0gMSAmJiAkdDIucmFuayA9PT0gMikge1xuICAgICAgICBjb25zdCB0MTJEID0gcmVzaGFwZSgkdDEsIFsxLCAtMV0pO1xuICAgICAgICBjb25zdCB0MjJEID0gcmVzaGFwZSgkdDIsIFskdDIuc2hhcGVbMF0sICR0Mi5zaGFwZVsxXV0pO1xuICAgICAgICBjb25zdCB0MXQyID0gbWF0TXVsKHQxMkQsIHQyMkQpO1xuICAgICAgICByZXR1cm4gcmVzaGFwZSh0MXQyLCBbdDF0Mi5zaXplXSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKCR0MS5yYW5rID09PSAyICYmICR0Mi5yYW5rID09PSAxKSB7XG4gICAgICAgIGNvbnN0IHQyMkQgPSByZXNoYXBlKCR0MiwgWy0xLCAxXSk7XG4gICAgICAgIGNvbnN0IHQxdDIgPSBtYXRNdWwoJHQxLCB0MjJEKTtcbiAgICAgICAgcmV0dXJuIHJlc2hhcGUodDF0MiwgW3QxdDIuc2l6ZV0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgdDIyRCA9IHJlc2hhcGUoJHQyLCBbJHQyLnNoYXBlWzBdLCAkdDIuc2hhcGVbMV1dKTtcbiAgICAgICAgY29uc3QgdDF0MiA9IG1hdE11bCgkdDEsIHQyMkQpO1xuICAgICAgICByZXR1cm4gdDF0MjtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgZG90ID0gb3AoeyBkb3RfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZG90LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFRlbnNvciB9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IGFkZCB9IGZyb20gJy4vYWRkJztcbmltcG9ydCB7IGRpdiB9IGZyb20gJy4vZGl2JztcbmltcG9ydCB7IGdldE5vaXNlU2hhcGUgfSBmcm9tICcuL2Ryb3BvdXRfdXRpbCc7XG5pbXBvcnQgeyBmbG9vciB9IGZyb20gJy4vZmxvb3InO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi9tdWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByYW5kb21Vbmlmb3JtIH0gZnJvbSAnLi9yYW5kb21fdW5pZm9ybSc7XG4vKipcbiAqIENvbXB1dGVzIGRyb3BvdXQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgMiwgMV0pO1xuICogY29uc3QgcmF0ZSA9IDAuNzU7XG4gKiBjb25zdCBvdXRwdXQgPSB0Zi5kcm9wb3V0KHgsIHJhdGUpO1xuICogb3V0cHV0LnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBBIGZsb2F0aW5nIHBvaW50IFRlbnNvciBvciBUZW5zb3JMaWtlLlxuICogQHBhcmFtIHJhdGUgQSBmbG9hdCBpbiB0aGUgcmFuZ2UgWzAsIDEpLiBUaGUgcHJvYmFiaWxpdHkgdGhhdCBlYWNoIGVsZW1lbnRcbiAqICAgb2YgeCBpcyBkaXNjYXJkZWQuXG4gKiBAcGFyYW0gbm9pc2VTaGFwZSBBbiBhcnJheSBvZiBudW1iZXJzIG9mIHR5cGUgaW50MzIsIHJlcHJlc2VudGluZyB0aGVcbiAqIHNoYXBlIGZvciByYW5kb21seSBnZW5lcmF0ZWQga2VlcC9kcm9wIGZsYWdzLiBJZiB0aGUgbm9pc2VTaGFwZSBoYXMgbnVsbFxuICogdmFsdWUsIGl0IHdpbGwgYmUgYXV0b21hdGljYWxseSByZXBsYWNlZCB3aXRoIHRoZSB4J3MgcmVsYXRpdmUgZGltZW5zaW9uXG4gKiBzaXplLiBPcHRpb25hbC5cbiAqIEBwYXJhbSBzZWVkIFVzZWQgdG8gY3JlYXRlIHJhbmRvbSBzZWVkcy4gT3B0aW9uYWwuXG4gKiBAcmV0dXJucyBBIFRlbnNvciBvZiB0aGUgc2FtZSBzaGFwZSBvZiB4LlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Ryb3BvdXQnfVxuICovXG5mdW5jdGlvbiBkcm9wb3V0Xyh4LCByYXRlLCBub2lzZVNoYXBlLCBzZWVkKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnZHJvcG91dCcpO1xuICAgIHV0aWwuYXNzZXJ0KCR4LmR0eXBlID09PSAnZmxvYXQzMicsICgpID0+IGB4IGhhcyB0byBiZSBhIGZsb2F0aW5nIHBvaW50IHRlbnNvciBzaW5jZSBpdCdzIGdvaW5nIHRvIGJlIGAgK1xuICAgICAgICBgc2NhbGVkLCBidXQgZ290IGEgJHskeC5kdHlwZX0gdGVuc29yIGluc3RlYWQuYCk7XG4gICAgdXRpbC5hc3NlcnQocmF0ZSA+PSAwICYmIHJhdGUgPCAxLCAoKSA9PiBgcmF0ZSBtdXN0IGJlIGEgZmxvYXQgaW4gdGhlIHJhbmdlIFswLCAxKSwgYnV0IGdvdCAke3JhdGV9LmApO1xuICAgIGlmIChyYXRlID09PSAwKSB7XG4gICAgICAgIHJldHVybiB4IGluc3RhbmNlb2YgVGVuc29yID8gJHguY2xvbmUoKSA6ICR4O1xuICAgIH1cbiAgICBjb25zdCAkbm9pc2VTaGFwZSA9IGdldE5vaXNlU2hhcGUoJHgsIG5vaXNlU2hhcGUpO1xuICAgIGNvbnN0IGtlZXBQcm9iID0gMSAtIHJhdGU7XG4gICAgY29uc3QgbXVsdGlwbGllciA9IGRpdihmbG9vcihhZGQocmFuZG9tVW5pZm9ybSgkbm9pc2VTaGFwZSwgMCwgMSwgJ2Zsb2F0MzInLCBzZWVkKSwga2VlcFByb2IpKSwga2VlcFByb2IpO1xuICAgIHJldHVybiBtdWwoJHgsIG11bHRpcGxpZXIpO1xufVxuZXhwb3J0IGNvbnN0IGRyb3BvdXQgPSBvcCh7IGRyb3BvdXRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZHJvcG91dC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuLyoqXG4gKiBOb3JtYWxpemUgbm9pc2Ugc2hhcGUgYmFzZWQgb24gcHJvdmlkZWQgdGVuc29yIGFuZCBub2lzZSBzaGFwZS5cbiAqXG4gKiBAcGFyYW0geCBUZW5zb3IuXG4gKiBAcGFyYW0gbm9pc2VTaGFwZSBUaGUgc2hhcGUgZm9yIHRoZSByYW5kb21seSBnZW5lcmF0ZWQga2VlcC9kcm9wIGZsYWdzLCBhc1xuICogICBhbiBhcnJheSBvZiBudW1iZXJzLiBPcHRpb25hbC5cbiAqIEByZXR1cm5zIE5vcm1hbGl6ZWQgbm9pc2Ugc2hhcGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROb2lzZVNoYXBlKHgsIG5vaXNlU2hhcGUpIHtcbiAgICBpZiAobm9pc2VTaGFwZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB4LnNoYXBlLnNsaWNlKCk7XG4gICAgfVxuICAgIGlmICh1dGlsLmFycmF5c0VxdWFsKHguc2hhcGUsIG5vaXNlU2hhcGUpKSB7XG4gICAgICAgIHJldHVybiBub2lzZVNoYXBlO1xuICAgIH1cbiAgICBpZiAoeC5zaGFwZS5sZW5ndGggPT09IG5vaXNlU2hhcGUubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IG5ld0RpbWVuc2lvbiA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHguc2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChub2lzZVNoYXBlW2ldID09IG51bGwgJiYgeC5zaGFwZVtpXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbmV3RGltZW5zaW9uLnB1c2goeC5zaGFwZVtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXdEaW1lbnNpb24ucHVzaChub2lzZVNoYXBlW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3RGltZW5zaW9uO1xuICAgIH1cbiAgICByZXR1cm4gbm9pc2VTaGFwZTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRyb3BvdXRfdXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgRWluc3VtIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogVGVuc29yIGNvbnRyYWN0aW9uIG92ZXIgc3BlY2lmaWVkIGluZGljZXMgYW5kIG91dGVyIHByb2R1Y3QuXG4gKlxuICogYGVpbnN1bWAgYWxsb3dzIGRlZmluaW5nIFRlbnNvcnMgYnkgZGVmaW5pbmcgdGhlaXIgZWxlbWVudC13aXNlIGNvbXB1dGF0aW9uLlxuICogVGhpcyBjb21wdXRhdGlvbiBpcyBiYXNlZCBvblxuICogW0VpbnN0ZWluIHN1bW1hdGlvbl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRWluc3RlaW5fbm90YXRpb24pLlxuICpcbiAqIFNvbWUgc3BlY2lhbCBjYXNlcyBpbmNsdWRlOlxuICpcbiAqIE1hdHJpeCBtdWx0aXBsaWNhdGlvbjpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoW1sxLCAyLCAzXSwgWzQsIDUsIDZdXSk7XG4gKiBjb25zdCB5ID0gdGYudGVuc29yMmQoW1swLCAxXSwgWzIsIDNdLCBbNCwgNV1dKTtcbiAqIHgucHJpbnQoKTtcbiAqIHkucHJpbnQoKTtcbiAqIHRmLmVpbnN1bSgnaWosamstPmlrJywgeCwgeSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIERvdCBwcm9kdWN0OlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICogY29uc3QgeSA9IHRmLnRlbnNvcjFkKFswLCAxLCAyXSk7XG4gKiB4LnByaW50KCk7XG4gKiB5LnByaW50KCk7XG4gKiB0Zi5laW5zdW0oJ2ksaS0+JywgeCwgeSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEJhdGNoIGRvdCBwcm9kdWN0OlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IyZChbWzEsIDIsIDNdLCBbNCwgNSwgNl1dKTtcbiAqIGNvbnN0IHkgPSB0Zi50ZW5zb3IyZChbWzAsIDEsIDJdLCBbMywgNCwgNV1dKTtcbiAqIHgucHJpbnQoKTtcbiAqIHkucHJpbnQoKTtcbiAqIHRmLmVpbnN1bSgnYmksYmktPmInLCB4LCB5KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogT3V0ZXIgcHJvdWR1Y3Q6XG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAzLCA1XSk7XG4gKiBjb25zdCB5ID0gdGYudGVuc29yMWQoWzIsIDQsIDZdKTtcbiAqIHgucHJpbnQoKTtcbiAqIHkucHJpbnQoKTtcbiAqIHRmLmVpbnN1bSgnaSxqLT5paicsIHgsIHkpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBNYXRyaXggdHJhbnNwb3NlOlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IyZChbWzEsIDJdLCBbMywgNF1dKTtcbiAqIHgucHJpbnQoKTtcbiAqIHRmLmVpbnN1bSgnaWotPmppJywgeCkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEJhdGNoIG1hdHJpeCB0cmFuc3Bvc2U6XG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjNkKFtbWzEsIDJdLCBbMywgNF1dLCBbWy0xLCAtMl0sIFstMywgLTRdXV0pO1xuICogeC5wcmludCgpO1xuICogdGYuZWluc3VtKCdiaWotPmJqaScsIHgpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBMaW1pdGF0aW9uczpcbiAqXG4gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIGVpbnN1bSBoYXMgdGhlIGZvbGxvd2luZyBsaW1pdGF0aW9uczpcbiAqXG4gKiAtIERvZXMgbm90IHN1cHBvcnQgPjIgaW5wdXQgdGVuc29ycy5cbiAqIC0gRG9lcyBub3Qgc3VwcG9ydCBkdXBsaWNhdGUgYXhlcyBmb3IgYW55IGdpdmVuIGlucHV0IHRlbnNvci4gRS5nLiwgZXF1YXRpb25cbiAqICAgJ2lpLT4nIGlzIG5vdCBzdXBwb3RlZC5cbiAqIC0gVGhlIGAuLi5gIG5vdGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuXG4gKlxuICogQHBhcmFtIGVxdWF0aW9uIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGNvbnRyYWN0aW9uLCBpbiB0aGUgc2FtZSBmb3JtYXQgYXNcbiAqIFtudW1weS5laW5zdW1dKGh0dHBzOi8vbnVtcHkub3JnL2RvYy9zdGFibGUvcmVmZXJlbmNlL2dlbmVyYXRlZC9udW1weS5laW5zdW0uaHRtbCkuXG4gKiBAcGFyYW0gdGVuc29ycyB0aGUgaW5wdXQocykgdG8gY29udHJhY3QgKGVhY2ggb25lIGEgVGVuc29yKSwgd2hvc2Ugc2hhcGVzXG4gKiAgICAgc2hvdWxkIGJlIGNvbnNpc3RlbnQgd2l0aCBlcXVhdGlvbi5cbiAqIEByZXR1cm5zIFRoZSBvdXRwdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ01hdHJpY2VzJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVpbnN1bV8oZXF1YXRpb24sIC4uLnRlbnNvcnMpIHtcbiAgICBjb25zdCAkdGVuc29ycyA9IHRlbnNvcnMubWFwKCh0LCBpKSA9PiBjb252ZXJ0VG9UZW5zb3IodCwgYHRlbnNvcnMke2l9YCwgJ2VpbnN1bScpKTtcbiAgICBjb25zdCBhdHRycyA9IHsgZXF1YXRpb24gfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChFaW5zdW0sICR0ZW5zb3JzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgZWluc3VtID0gb3AoeyBlaW5zdW1fIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZWluc3VtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBFbHUgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBleHBvbmVudGlhbCBsaW5lYXIgZWxlbWVudC13aXNlOiBgeCA+IDAgPyBlIF4geCAtIDEgOiAwYC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFstMSwgMSwgLTMsIDJdKTtcbiAqXG4gKiB4LmVsdSgpLnByaW50KCk7ICAvLyBvciB0Zi5lbHUoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gZWx1Xyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnZWx1Jyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEVsdSwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBlbHUgPSBvcCh7IGVsdV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lbHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEVxdWFsIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IG1ha2VUeXBlc01hdGNoIH0gZnJvbSAnLi4vdGVuc29yX3V0aWwnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlIH0gZnJvbSAnLi9icm9hZGNhc3RfdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV0dXJucyB0aGUgdHJ1dGggdmFsdWUgb2YgKGEgPT0gYikgZWxlbWVudC13aXNlLiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFsyLCAyLCAyXSk7XG4gKlxuICogYS5lcXVhbChiKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGEgVGhlIGZpcnN0IGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgaW5wdXQgdGVuc29yLiBNdXN0IGhhdmUgdGhlIHNhbWUgZHR5cGUgYXMgYGFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0xvZ2ljYWwnfVxuICovXG5mdW5jdGlvbiBlcXVhbF8oYSwgYikge1xuICAgIGxldCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdlcXVhbCcsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICAgIGxldCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdlcXVhbCcsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICAgIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcbiAgICBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSgkYS5zaGFwZSwgJGIuc2hhcGUpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgYTogJGEsIGI6ICRiIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoRXF1YWwsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgZXF1YWwgPSBvcCh7IGVxdWFsXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVxdWFsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBFcmYgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBjYXN0IH0gZnJvbSAnLi9jYXN0JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBnYXVzZSBlcnJvciBmdW5jdGlvbiBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOlxuICogYGVyZih4KWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFswLCAuMSwgLS4xLCAuN10pO1xuICpcbiAqIHguZXJmKCkucHJpbnQoKTsgLy8gb3IgdGYuZXJmKHgpO1xuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBlcmZfKHgpIHtcbiAgICBsZXQgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnZXJmJyk7XG4gICAgdXRpbC5hc3NlcnQoJHguZHR5cGUgPT09ICdpbnQzMicgfHwgJHguZHR5cGUgPT09ICdmbG9hdDMyJywgKCkgPT4gJ0lucHV0IGR0eXBlIG11c3QgYmUgYGludDMyYCBvciBgZmxvYXQzMmAuJyk7XG4gICAgaWYgKCR4LmR0eXBlID09PSAnaW50MzInKSB7XG4gICAgICAgICR4ID0gY2FzdCgkeCwgJ2Zsb2F0MzInKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEVyZiwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBlcmYgPSBvcCh7IGVyZl8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lcmYuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuZXhwb3J0IGNvbnN0IEVSRl9QID0gMC4zMjc1OTExO1xuZXhwb3J0IGNvbnN0IEVSRl9BMSA9IDAuMjU0ODI5NTkyO1xuZXhwb3J0IGNvbnN0IEVSRl9BMiA9IC0wLjI4NDQ5NjczNjtcbmV4cG9ydCBjb25zdCBFUkZfQTMgPSAxLjQyMTQxMzc0MTtcbmV4cG9ydCBjb25zdCBFUkZfQTQgPSAtMS40NTMxNTIwMjc7XG5leHBvcnQgY29uc3QgRVJGX0E1ID0gMS4wNjE0MDU0Mjk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lcmZfdXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgRXhwIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgZXhwb25lbnRpYWwgb2YgdGhlIGlucHV0IGB0Zi5UZW5zb3JgIGVsZW1lbnQtd2lzZS4gYGUgXiB4YFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIC0zXSk7XG4gKlxuICogeC5leHAoKS5wcmludCgpOyAgLy8gb3IgdGYuZXhwKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGV4cF8oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2V4cCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChFeHAsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgZXhwID0gb3AoeyBleHBfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXhwLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBFeHBhbmREaW1zIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIFJldHVybnMgYSBgdGYuVGVuc29yYCB0aGF0IGhhcyBleHBhbmRlZCByYW5rLCBieSBpbnNlcnRpbmcgYSBkaW1lbnNpb25cbiAqIGludG8gdGhlIHRlbnNvcidzIHNoYXBlLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDMsIDRdKTtcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5leHBhbmREaW1zKGF4aXMpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yIHdob3NlIGRpbWVuc2lvbnMgdG8gYmUgZXhwYW5kZWQuXG4gKiBAcGFyYW0gYXhpcyBUaGUgZGltZW5zaW9uIGluZGV4IGF0IHdoaWNoIHRvIGluc2VydCBzaGFwZSBvZiBgMWAuIERlZmF1bHRzXG4gKiAgICAgdG8gMCAodGhlIGZpcnN0IGRpbWVuc2lvbikuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnVHJhbnNmb3JtYXRpb25zJ31cbiAqL1xuZnVuY3Rpb24gZXhwYW5kRGltc18oeCwgYXhpcyA9IDApIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdleHBhbmREaW1zJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG4gICAgdXRpbC5hc3NlcnQoYXhpcyA8PSAkeC5yYW5rLCAoKSA9PiAnQXhpcyBtdXN0IGJlIDw9IHJhbmsgb2YgdGhlIHRlbnNvcicpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgaW5wdXQ6ICR4IH07XG4gICAgY29uc3QgYXR0cnMgPSB7IGRpbTogYXhpcyB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEV4cGFuZERpbXMsIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IGV4cGFuZERpbXMgPSBvcCh7IGV4cGFuZERpbXNfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXhwYW5kX2RpbXMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEV4cG0xIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgZXhwb25lbnRpYWwgb2YgdGhlIGlucHV0IGB0Zi5UZW5zb3JgIG1pbnVzIG9uZSBlbGVtZW50LXdpc2UuXG4gKiBgZSBeIHggLSAxYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIC0zXSk7XG4gKlxuICogeC5leHBtMSgpLnByaW50KCk7ICAvLyBvciB0Zi5leHBtMSh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBleHBtMV8oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2V4cG0xJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEV4cG0xLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGV4cG0xID0gb3AoeyBleHBtMV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1leHBtMS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBidWZmZXIgfSBmcm9tICcuL2J1ZmZlcic7XG5pbXBvcnQgeyBleHBhbmREaW1zIH0gZnJvbSAnLi9leHBhbmRfZGltcyc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL3Jlc2hhcGUnO1xuaW1wb3J0IHsgdGlsZSB9IGZyb20gJy4vdGlsZSc7XG4vKipcbiAqIENyZWF0ZSBhbiBpZGVudGl0eSBtYXRyaXguXG4gKlxuICogQHBhcmFtIG51bVJvd3MgTnVtYmVyIG9mIHJvd3MuXG4gKiBAcGFyYW0gbnVtQ29sdW1ucyBOdW1iZXIgb2YgY29sdW1ucy4gRGVmYXVsdHMgdG8gYG51bVJvd3NgLlxuICogQHBhcmFtIGJhdGNoU2hhcGUgSWYgcHJvdmlkZWQsIHdpbGwgYWRkIHRoZSBiYXRjaCBzaGFwZSB0byB0aGUgYmVnaW5uaW5nXG4gKiAgIG9mIHRoZSBzaGFwZSBvZiB0aGUgcmV0dXJuZWQgYHRmLlRlbnNvcmAgYnkgcmVwZWF0aW5nIHRoZSBpZGVudGl0eVxuICogICBtYXRyaXguXG4gKiBAcGFyYW0gZHR5cGUgRGF0YSB0eXBlLlxuICogQHJldHVybnMgSWRlbnRpdHkgbWF0cml4IG9mIHRoZSBzcGVjaWZpZWQgc2l6ZSBhbmQgZGF0YSB0eXBlLCBwb3NzaWJseVxuICogICB3aXRoIGJhdGNoIHJlcGV0aXRpb24gaWYgYGJhdGNoU2hhcGVgIGlzIHNwZWNpZmllZC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmZ1bmN0aW9uIGV5ZV8obnVtUm93cywgbnVtQ29sdW1ucywgYmF0Y2hTaGFwZSwgZHR5cGUgPSAnZmxvYXQzMicpIHtcbiAgICBpZiAobnVtQ29sdW1ucyA9PSBudWxsKSB7XG4gICAgICAgIG51bUNvbHVtbnMgPSBudW1Sb3dzO1xuICAgIH1cbiAgICBjb25zdCBidWZmID0gYnVmZmVyKFtudW1Sb3dzLCBudW1Db2x1bW5zXSwgZHR5cGUpO1xuICAgIGNvbnN0IG4gPSBudW1Sb3dzIDw9IG51bUNvbHVtbnMgPyBudW1Sb3dzIDogbnVtQ29sdW1ucztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgICBidWZmLnNldCgxLCBpLCBpKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0ID0gcmVzaGFwZShidWZmLnRvVGVuc29yKCksIFtudW1Sb3dzLCBudW1Db2x1bW5zXSk7XG4gICAgaWYgKGJhdGNoU2hhcGUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKGJhdGNoU2hhcGUubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gdGlsZShleHBhbmREaW1zKG91dCwgMCksIFtiYXRjaFNoYXBlWzBdLCAxLCAxXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYmF0Y2hTaGFwZS5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgICAgICAgICAgcmV0dXJuIHRpbGUoZXhwYW5kRGltcyhleHBhbmREaW1zKG91dCwgMCksIDApLCBbYmF0Y2hTaGFwZVswXSwgYmF0Y2hTaGFwZVsxXSwgMSwgMV0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGJhdGNoU2hhcGUubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICAgICAgICAgIHJldHVybiB0aWxlKGV4cGFuZERpbXMoZXhwYW5kRGltcyhleHBhbmREaW1zKG91dCwgMCksIDApLCAwKSwgW1xuICAgICAgICAgICAgICAgIGJhdGNoU2hhcGVbMF0sIGJhdGNoU2hhcGVbMV0sIGJhdGNoU2hhcGVbMl0sIDEsIDFcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBleWUoKSBjdXJyZW50bHkgc3VwcG9ydHMgb25seSAxRCBhbmQgMkQgYCArXG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgICAgICAgICAgICAgIGBiYXRjaFNoYXBlcywgYnV0IHJlY2VpdmVkICR7YmF0Y2hTaGFwZS5sZW5ndGh9RC5gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydCBjb25zdCBleWUgPSBvcCh7IGV5ZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1leWUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEZpbGwgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuLyoqXG4gKiBDcmVhdGVzIGEgYHRmLlRlbnNvcmAgZmlsbGVkIHdpdGggYSBzY2FsYXIgdmFsdWUuXG4gKlxuICogYGBganNcbiAqIHRmLmZpbGwoWzIsIDJdLCA0KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHNoYXBlIEFuIGFycmF5IG9mIGludGVnZXJzIGRlZmluaW5nIHRoZSBvdXRwdXQgdGVuc29yIHNoYXBlLlxuICogQHBhcmFtIHZhbHVlIFRoZSBzY2FsYXIgdmFsdWUgdG8gZmlsbCB0aGUgdGVuc29yIHdpdGguXG4gKiBAcGFyYW0gZHR5cGUgVGhlIHR5cGUgb2YgYW4gZWxlbWVudCBpbiB0aGUgcmVzdWx0aW5nIHRlbnNvci4gRGVmYXVsdHMgdG9cbiAqICdmbG9hdCcuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5mdW5jdGlvbiBmaWxsKHNoYXBlLCB2YWx1ZSwgZHR5cGUpIHtcbiAgICBjb25zdCBhdHRycyA9IHsgc2hhcGUsIHZhbHVlLCBkdHlwZSB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEZpbGwsIHt9LCBhdHRycyk7XG59XG5leHBvcnQgeyBmaWxsIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1maWxsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBGbG9vciB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIGZsb29yIG9mIGlucHV0IGB0Zi5UZW5zb3JgIGVsZW1lbnQtd2lzZTogYGZsb29yKHgpYC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsuNiwgMS4xLCAtMy4zXSk7XG4gKlxuICogeC5mbG9vcigpLnByaW50KCk7ICAvLyBvciB0Zi5mbG9vcih4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBmbG9vcl8oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2Zsb29yJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEZsb29yLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGZsb29yID0gb3AoeyBmbG9vcl8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mbG9vci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgRmxvb3JEaXYgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgbWFrZVR5cGVzTWF0Y2ggfSBmcm9tICcuLi90ZW5zb3JfdXRpbCc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIERpdmlkZXMgdHdvIGB0Zi5UZW5zb3JgcyBlbGVtZW50LXdpc2UsIEEgLyBCLiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuXG4gKiBUaGUgcmVzdWx0IGlzIHJvdW5kZWQgd2l0aCBmbG9vciBmdW5jdGlvbi5cbiAqXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgNCwgOSwgMTZdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbMSwgMiwgMywgNF0pO1xuICpcbiAqIGEuZmxvb3JEaXYoYikucHJpbnQoKTsgIC8vIG9yIHRmLmRpdihhLCBiKVxuICogYGBgXG4gKlxuICogYGBganNcbiAqIC8vIEJyb2FkY2FzdCBkaXYgYSB3aXRoIGIuXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzIsIDQsIDYsIDhdKTtcbiAqIGNvbnN0IGIgPSB0Zi5zY2FsYXIoMik7XG4gKlxuICogYS5mbG9vckRpdihiKS5wcmludCgpOyAgLy8gb3IgdGYuZmxvb3JEaXYoYSwgYilcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCB0ZW5zb3IgYXMgdGhlIG51bWVyYXRvci5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgdGVuc29yIGFzIHRoZSBkZW5vbWluYXRvci4gTXVzdCBoYXZlIHRoZSBzYW1lIGR0eXBlIGFzXG4gKiBgYWAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQXJpdGhtZXRpYyd9XG4gKi9cbmZ1bmN0aW9uIGZsb29yRGl2XyhhLCBiKSB7XG4gICAgbGV0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ2Zsb29yRGl2Jyk7XG4gICAgbGV0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ2Zsb29yRGl2Jyk7XG4gICAgWyRhLCAkYl0gPSBtYWtlVHlwZXNNYXRjaCgkYSwgJGIpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgYTogJGEsIGI6ICRiIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoRmxvb3JEaXYsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgZmxvb3JEaXYgPSBvcCh7IGZsb29yRGl2XyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZsb29yRGl2LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBjdXN0b21HcmFkIH0gZnJvbSAnLi4vLi4vZ3JhZGllbnRzJztcbmltcG9ydCB7IEZ1c2VkQ29udjJEIH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IG1ha2VUeXBlc01hdGNoIH0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWwnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgeyBhZGQgfSBmcm9tICcuLi9hZGQnO1xuaW1wb3J0ICogYXMgYnJvYWRjYXN0X3V0aWwgZnJvbSAnLi4vYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0IHsgY29udjJkIGFzIHVuZnVzZWRDb252MmQgfSBmcm9tICcuLi9jb252MmQnO1xuaW1wb3J0IHsgY29udjJEQmFja3Byb3BGaWx0ZXIgfSBmcm9tICcuLi9jb252MmRfYmFja3Byb3BfZmlsdGVyJztcbmltcG9ydCB7IGNvbnYyREJhY2twcm9wSW5wdXQgfSBmcm9tICcuLi9jb252MmRfYmFja3Byb3BfaW5wdXQnO1xuaW1wb3J0ICogYXMgY29udl91dGlsIGZyb20gJy4uL2NvbnZfdXRpbCc7XG5pbXBvcnQgeyBhcHBseUFjdGl2YXRpb24sIGdldEZ1c2VkQmlhc0dyYWRpZW50LCBnZXRGdXNlZER5QWN0aXZhdGlvbiwgc2hvdWxkRnVzZSB9IGZyb20gJy4uL2Z1c2VkX3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4uL3Jlc2hhcGUnO1xuLyoqXG4gKiBDb21wdXRlcyBhIDJEIGNvbnZvbHV0aW9uIG92ZXIgdGhlIGlucHV0IHgsIG9wdGlvbmFsbHkgZnVzZWQgd2l0aCBhZGRpbmcgYVxuICogYmlhcyBhbmQgYXBwbHlpbmcgYW4gYWN0aXZhdGlvbi5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgaW5wdXREZXB0aCA9IDI7XG4gKiBjb25zdCBpblNoYXBlID0gWzIsIDIsIDIsIGlucHV0RGVwdGhdO1xuICogY29uc3Qgb3V0cHV0RGVwdGggPSAyO1xuICogY29uc3QgZlNpemUgPSAxO1xuICogY29uc3QgcGFkID0gMDtcbiAqIGNvbnN0IHN0cmlkZXMgPSAxO1xuICpcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3I0ZCggWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsXG4gKiAxNl0sIGluU2hhcGUpO1xuICogY29uc3QgdyA9IHRmLnRlbnNvcjRkKFstMSwgMSwgLTIsIDAuNV0sIFtmU2l6ZSwgZlNpemUsIGlucHV0RGVwdGgsXG4gKiBvdXRwdXREZXB0aF0pO1xuICpcbiAqIHRmLmZ1c2VkLmNvbnYyZCh7IHgsIGZpbHRlcjogdywgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0OiAnTkhXQycsXG4gKiBkaWxhdGlvbnM6IFsxLCAxXSwgYmlhczogdGYuc2NhbGFyKDUpLCBhY3RpdmF0aW9uOiAncmVsdScgfSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBvYmogQW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciwgb2YgcmFuayA0IG9yIHJhbmsgMywgb2Ygc2hhcGVcbiAqICAgICBgW2JhdGNoLCBoZWlnaHQsIHdpZHRoLCBpbkNoYW5uZWxzXWAuIElmIHJhbmsgMywgYmF0Y2ggb2YgMSBpc1xuICogYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciwgcmFuayA0LCBvZiBzaGFwZVxuICogICAgIGBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5EZXB0aCwgb3V0RGVwdGhdYC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBjb252b2x1dGlvbjogYFtzdHJpZGVIZWlnaHQsXG4gKiBzdHJpZGVXaWR0aF1gLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobS5cbiAqICAgLSBgc2FtZWAgYW5kIHN0cmlkZSAxOiBvdXRwdXQgd2lsbCBiZSBvZiBzYW1lIHNpemUgYXMgaW5wdXQsXG4gKiAgICAgICByZWdhcmRsZXNzIG9mIGZpbHRlciBzaXplLlxuICogICAtIGB2YWxpZGAgb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAtIEZvciBtb3JlIGluZm8sIHNlZSB0aGlzIGd1aWRlOlxuICogICAgIFtodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb25dKFxuICogICAgICAgICAgaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uKVxuICogQHBhcmFtIGRhdGFGb3JtYXQgQW4gb3B0aW9uYWwgc3RyaW5nIGZyb206IFwiTkhXQ1wiLCBcIk5DSFdcIi4gRGVmYXVsdHMgdG9cbiAqICAgICBcIk5IV0NcIi4gU3BlY2lmeSB0aGUgZGF0YSBmb3JtYXQgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YS4gV2l0aCB0aGVcbiAqICAgICBkZWZhdWx0IGZvcm1hdCBcIk5IV0NcIiwgdGhlIGRhdGEgaXMgc3RvcmVkIGluIHRoZSBvcmRlciBvZjogW2JhdGNoLFxuICogICAgIGhlaWdodCwgd2lkdGgsIGNoYW5uZWxzXS4gT25seSBcIk5IV0NcIiBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlxuICogQHBhcmFtIGRpbGF0aW9ucyBUaGUgZGlsYXRpb24gcmF0ZXM6IGBbZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGhdYFxuICogICAgIGluIHdoaWNoIHdlIHNhbXBsZSBpbnB1dCB2YWx1ZXMgYWNyb3NzIHRoZSBoZWlnaHQgYW5kIHdpZHRoIGRpbWVuc2lvbnNcbiAqICAgICBpbiBhdHJvdXMgY29udm9sdXRpb24uIERlZmF1bHRzIHRvIGBbMSwgMV1gLiBJZiBgZGlsYXRpb25zYCBpcyBhIHNpbmdsZVxuICogICAgIG51bWJlciwgdGhlbiBgZGlsYXRpb25IZWlnaHQgPT0gZGlsYXRpb25XaWR0aGAuIElmIGl0IGlzIGdyZWF0ZXIgdGhhblxuICogICAgIDEsIHRoZW4gYWxsIHZhbHVlcyBvZiBgc3RyaWRlc2AgbXVzdCBiZSAxLlxuICogQHBhcmFtIGRpbVJvdW5kaW5nTW9kZSBBIHN0cmluZyBmcm9tOiAnY2VpbCcsICdyb3VuZCcsICdmbG9vcicuIElmIG5vbmUgaXNcbiAqICAgICBwcm92aWRlZCwgaXQgd2lsbCBkZWZhdWx0IHRvIHRydW5jYXRlLlxuICogQHBhcmFtIGJpYXMgVGVuc29yIHRvIGJlIGFkZGVkIHRvIHRoZSByZXN1bHQuXG4gKiBAcGFyYW0gYWN0aXZhdGlvbiBOYW1lIG9mIGFjdGl2YXRpb24ga2VybmVsIChkZWZhdWx0cyB0byBgbGluZWFyYCkgdG8gYmVcbiAqICAgICBhcHBsaWVkXG4gKiAgICAgIGFmdGVyIGJpYXNBZGQuXG4gKiBAcGFyYW0gcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyBUZW5zb3Igb2YgcHJlbHUgd2VpZ2h0cyB0byBiZSBhcHBsaWVkIGFzIHBhcnRcbiAqICAgICBvZiBhIGBwcmVsdWAgYWN0aXZhdGlvbiwgdHlwaWNhbGx5IHRoZSBzYW1lIHNoYXBlIGFzIGB4YC5cbiAqIEBwYXJhbSBsZWFreXJlbHVBbHBoYSBPcHRpb25hbC4gQWxwaGEgdG8gYmUgYXBwbGllZCBhcyBwYXJ0IG9mIGEgYGxlYWt5cmVsdWBcbiAqICAgICBhY3RpdmF0aW9uLlxuICovXG5mdW5jdGlvbiBmdXNlZENvbnYyZF8oeyB4LCBmaWx0ZXIsIHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCA9ICdOSFdDJywgZGlsYXRpb25zID0gWzEsIDFdLCBkaW1Sb3VuZGluZ01vZGUsIGJpYXMsIGFjdGl2YXRpb24gPSAnbGluZWFyJywgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cywgbGVha3lyZWx1QWxwaGEgfSkge1xuICAgIGFjdGl2YXRpb24gPSBhY3RpdmF0aW9uIHx8ICdsaW5lYXInO1xuICAgIGlmIChzaG91bGRGdXNlKEVOR0lORS5zdGF0ZS5ncmFkaWVudERlcHRoLCBhY3RpdmF0aW9uKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHVuZnVzZWRDb252MmQoeCwgZmlsdGVyLCBzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQsIGRpbGF0aW9ucywgZGltUm91bmRpbmdNb2RlKTtcbiAgICAgICAgaWYgKGJpYXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gYWRkKHJlc3VsdCwgYmlhcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwcGx5QWN0aXZhdGlvbihyZXN1bHQsIGFjdGl2YXRpb24sIHByZWx1QWN0aXZhdGlvbldlaWdodHMsIGxlYWt5cmVsdUFscGhhKTtcbiAgICB9XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnY29udjJkJyk7XG4gICAgY29uc3QgJGZpbHRlciA9IGNvbnZlcnRUb1RlbnNvcihmaWx0ZXIsICdmaWx0ZXInLCAnY29udjJkJyk7XG4gICAgbGV0IHg0RCA9ICR4O1xuICAgIGxldCByZXNoYXBlZFRvNEQgPSBmYWxzZTtcbiAgICBpZiAoJHgucmFuayA9PT0gMykge1xuICAgICAgICByZXNoYXBlZFRvNEQgPSB0cnVlO1xuICAgICAgICB4NEQgPSByZXNoYXBlKCR4LCBbMSwgJHguc2hhcGVbMF0sICR4LnNoYXBlWzFdLCAkeC5zaGFwZVsyXV0pO1xuICAgIH1cbiAgICB1dGlsLmFzc2VydCh4NEQucmFuayA9PT0gNCwgKCkgPT4gYEVycm9yIGluIGZ1c2VkIGNvbnYyZDogaW5wdXQgbXVzdCBiZSByYW5rIDQsIGJ1dCBnb3QgcmFuayBgICtcbiAgICAgICAgYCR7eDRELnJhbmt9LmApO1xuICAgIHV0aWwuYXNzZXJ0KCRmaWx0ZXIucmFuayA9PT0gNCwgKCkgPT4gYEVycm9yIGluIGZ1c2VkIGNvbnYyZDogZmlsdGVyIG11c3QgYmUgcmFuayA0LCBidXQgZ290IHJhbmsgYCArXG4gICAgICAgIGAkeyRmaWx0ZXIucmFua30uYCk7XG4gICAgaWYgKGRpbVJvdW5kaW5nTW9kZSAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNJbnQocGFkKSwgKCkgPT4gYEVycm9yIGluIGZ1c2VkIGNvbnYyZDogcGFkIG11c3QgYmUgYW4gaW50ZWdlciB3aGVuIHVzaW5nLCBgICtcbiAgICAgICAgICAgIGBkaW1Sb3VuZGluZ01vZGUgJHtkaW1Sb3VuZGluZ01vZGV9IGJ1dCBnb3QgcGFkICR7cGFkfS5gKTtcbiAgICB9XG4gICAgdXRpbC5hc3NlcnQoeDRELnNoYXBlWzNdID09PSAkZmlsdGVyLnNoYXBlWzJdLCAoKSA9PiBgRXJyb3IgaW4gY29udjJkOiBkZXB0aCBvZiBpbnB1dCAoJHt4NEQuc2hhcGVbM119KSBtdXN0IG1hdGNoIGAgK1xuICAgICAgICBgaW5wdXQgZGVwdGggZm9yIGZpbHRlciAkeyRmaWx0ZXIuc2hhcGVbMl19LmApO1xuICAgIHV0aWwuYXNzZXJ0KGNvbnZfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgZGlsYXRpb25zKSwgKCkgPT4gJ0Vycm9yIGluIGNvbnYyRDogRWl0aGVyIHN0cmlkZXMgb3IgZGlsYXRpb25zIG11c3QgYmUgMS4gJyArXG4gICAgICAgIGBHb3Qgc3RyaWRlcyAke3N0cmlkZXN9IGFuZCBkaWxhdGlvbnMgJyR7ZGlsYXRpb25zfSdgKTtcbiAgICB1dGlsLmFzc2VydChkYXRhRm9ybWF0ID09PSAnTkhXQycsICgpID0+IGBFcnJvciBpbiBjb252MmQ6IGdvdCBkYXRhRm9ybWF0IG9mICR7ZGF0YUZvcm1hdH0gYnV0IG9ubHkgTkhXQyBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLmApO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gY29udl91dGlsLmNvbXB1dGVDb252MkRJbmZvKHg0RC5zaGFwZSwgJGZpbHRlci5zaGFwZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSk7XG4gICAgbGV0ICRiaWFzO1xuICAgIGlmIChiaWFzICE9IG51bGwpIHtcbiAgICAgICAgJGJpYXMgPSBjb252ZXJ0VG9UZW5zb3IoYmlhcywgJ2JpYXMnLCAnZnVzZWQgY29udjJkJyk7XG4gICAgICAgIFskYmlhc10gPSBtYWtlVHlwZXNNYXRjaCgkYmlhcywgJHgpO1xuICAgICAgICBicm9hZGNhc3RfdXRpbC5hc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZShjb252SW5mby5vdXRTaGFwZSwgJGJpYXMuc2hhcGUpO1xuICAgIH1cbiAgICBsZXQgJHByZWx1QWN0aXZhdGlvbldlaWdodHM7XG4gICAgaWYgKHByZWx1QWN0aXZhdGlvbldlaWdodHMgIT0gbnVsbCkge1xuICAgICAgICAkcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyA9IGNvbnZlcnRUb1RlbnNvcihwcmVsdUFjdGl2YXRpb25XZWlnaHRzLCAncHJlbHUgd2VpZ2h0cycsICdmdXNlZCBjb252MmQnKTtcbiAgICB9XG4gICAgY29uc3QgZ3JhZCA9IChkeSwgc2F2ZWQpID0+IHtcbiAgICAgICAgY29uc3QgWyRmaWx0ZXIsIHg0RCwgeSwgJGJpYXNdID0gc2F2ZWQ7XG4gICAgICAgIGNvbnN0IGR5QWN0aXZhdGlvbiA9IGdldEZ1c2VkRHlBY3RpdmF0aW9uKGR5LCB5LCBhY3RpdmF0aW9uKTtcbiAgICAgICAgdXRpbC5hc3NlcnQoY29udl91dGlsLnR1cGxlVmFsdWVzQXJlT25lKGRpbGF0aW9ucyksICgpID0+ICdFcnJvciBpbiBncmFkaWVudCBvZiBmdXNlZCBjb252MkQ6ICcgK1xuICAgICAgICAgICAgYGRpbGF0aW9uIHJhdGVzIGdyZWF0ZXIgdGhhbiAxIGAgK1xuICAgICAgICAgICAgYGFyZSBub3QgeWV0IHN1cHBvcnRlZCBpbiBncmFkaWVudHMuIEdvdCBkaWxhdGlvbnMgJyR7ZGlsYXRpb25zfSdgKTtcbiAgICAgICAgY29uc3QgeERlciA9IGNvbnYyREJhY2twcm9wSW5wdXQoeDRELnNoYXBlLCBkeUFjdGl2YXRpb24sICRmaWx0ZXIsIHN0cmlkZXMsIHBhZCk7XG4gICAgICAgIGNvbnN0IGZpbHRlckRlciA9IGNvbnYyREJhY2twcm9wRmlsdGVyKHg0RCwgZHlBY3RpdmF0aW9uLCAkZmlsdGVyLnNoYXBlLCBzdHJpZGVzLCBwYWQpO1xuICAgICAgICBjb25zdCBkZXIgPSBbeERlciwgZmlsdGVyRGVyXTtcbiAgICAgICAgaWYgKCRiaWFzICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGJpYXNEZXIgPSBnZXRGdXNlZEJpYXNHcmFkaWVudCgkYmlhcywgZHlBY3RpdmF0aW9uKTtcbiAgICAgICAgICAgIGRlci5wdXNoKGJpYXNEZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZXI7XG4gICAgfTtcbiAgICBjb25zdCBpbnB1dHMgPSB7XG4gICAgICAgIHg6IHg0RCxcbiAgICAgICAgZmlsdGVyOiAkZmlsdGVyLFxuICAgICAgICBiaWFzOiAkYmlhcyxcbiAgICAgICAgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0czogJHByZWx1QWN0aXZhdGlvbldlaWdodHNcbiAgICB9O1xuICAgIGNvbnN0IGF0dHJzID0ge1xuICAgICAgICBzdHJpZGVzLFxuICAgICAgICBwYWQsXG4gICAgICAgIGRhdGFGb3JtYXQsXG4gICAgICAgIGRpbGF0aW9ucyxcbiAgICAgICAgZGltUm91bmRpbmdNb2RlLFxuICAgICAgICBhY3RpdmF0aW9uLFxuICAgICAgICBsZWFreXJlbHVBbHBoYVxuICAgIH07XG4gICAgLy8gRGVwZW5kaW5nIG9uIHRoZSB0aGUgcGFyYW1zIHBhc3NlZCBpbiB3ZSB3aWxsIGhhdmUgZGlmZmVyZW50IG51bWJlciBvZlxuICAgIC8vIGlucHV0cyBhbmQgdGh1cyBhIGEgZGlmZmVyZW50IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgZ3JhZGllbnQuXG4gICAgaWYgKGJpYXMgPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBjdXN0b21PcCA9IGN1c3RvbUdyYWQoKHg0RCwgZmlsdGVyLCBzYXZlKSA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzID0gXG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgICAgICAgICBFTkdJTkUucnVuS2VybmVsKEZ1c2VkQ29udjJELCBpbnB1dHMsIGF0dHJzKTtcbiAgICAgICAgICAgIHNhdmUoW2ZpbHRlciwgeDRELCByZXNdKTtcbiAgICAgICAgICAgIGlmIChyZXNoYXBlZFRvNEQpIHtcbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgICAgICAgICAgICAgcmVzID0gcmVzaGFwZShyZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogcmVzLCBncmFkRnVuYzogZ3JhZCB9O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGN1c3RvbU9wKHg0RCwgJGZpbHRlcik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBjdXN0b21PcFdpdGhCaWFzID0gY3VzdG9tR3JhZCgoeDRELCBmaWx0ZXIsIGJpYXMsIHNhdmUpID0+IHtcbiAgICAgICAgICAgIGxldCByZXMgPSBFTkdJTkUucnVuS2VybmVsKEZ1c2VkQ29udjJELCBpbnB1dHMsIGF0dHJzKTtcbiAgICAgICAgICAgIHNhdmUoW2ZpbHRlciwgeDRELCByZXMsIGJpYXNdKTtcbiAgICAgICAgICAgIGlmIChyZXNoYXBlZFRvNEQpIHtcbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgICAgICAgICAgICAgcmVzID0gcmVzaGFwZShyZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogcmVzLCBncmFkRnVuYzogZ3JhZCB9O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGN1c3RvbU9wV2l0aEJpYXMoeDRELCAkZmlsdGVyLCAkYmlhcyk7XG4gICAgfVxufVxuZXhwb3J0IGNvbnN0IGNvbnYyZCA9IG9wKHsgZnVzZWRDb252MmRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29udjJkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBjdXN0b21HcmFkIH0gZnJvbSAnLi4vLi4vZ3JhZGllbnRzJztcbmltcG9ydCB7IEZ1c2VkRGVwdGh3aXNlQ29udjJEIH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IG1ha2VUeXBlc01hdGNoIH0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWwnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgeyBhZGQgfSBmcm9tICcuLi9hZGQnO1xuaW1wb3J0ICogYXMgYnJvYWRjYXN0X3V0aWwgZnJvbSAnLi4vYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0ICogYXMgY29udl91dGlsIGZyb20gJy4uL2NvbnZfdXRpbCc7XG5pbXBvcnQgeyBkZXB0aHdpc2VDb252MmQgYXMgdW5mdXNlZERlcHRod2lzZUNvbnYyZCB9IGZyb20gJy4uL2RlcHRod2lzZV9jb252MmQnO1xuaW1wb3J0IHsgZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIgfSBmcm9tICcuLi9kZXB0aHdpc2VfY29udjJkX25hdGl2ZV9iYWNrcHJvcF9maWx0ZXInO1xuaW1wb3J0IHsgZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCB9IGZyb20gJy4uL2RlcHRod2lzZV9jb252MmRfbmF0aXZlX2JhY2twcm9wX2lucHV0JztcbmltcG9ydCB7IGFwcGx5QWN0aXZhdGlvbiwgZ2V0RnVzZWRCaWFzR3JhZGllbnQsIGdldEZ1c2VkRHlBY3RpdmF0aW9uLCBzaG91bGRGdXNlIH0gZnJvbSAnLi4vZnVzZWRfdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4uL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi4vcmVzaGFwZSc7XG4vKipcbiAqIENvbXB1dGVzIGRlcHRod2lzZSAyRCBjb252b2x1dGlvbiwgb3B0aW9uYWxseSBmdXNlZCB3aXRoIGFkZGluZyBhXG4gKiBiaWFzIGFuZCBhcHBseWluZyBhbiBhY3RpdmF0aW9uLlxuICpcbiAqIEdpdmVuIGEgNEQgYGlucHV0YCBhcnJheSBhbmQgYSBgZmlsdGVyYCBhcnJheSBvZiBzaGFwZVxuICogYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBpbkNoYW5uZWxzLCBjaGFubmVsTXVsdGlwbGllcl1gIGNvbnRhaW5pbmdcbiAqIGBpbkNoYW5uZWxzYCBjb252b2x1dGlvbmFsIGZpbHRlcnMgb2YgZGVwdGggMSwgdGhpcyBvcCBhcHBsaWVzIGFcbiAqIGRpZmZlcmVudCBmaWx0ZXIgdG8gZWFjaCBpbnB1dCBjaGFubmVsIChleHBhbmRpbmcgZnJvbSAxIGNoYW5uZWwgdG9cbiAqIGBjaGFubmVsTXVsdGlwbGllcmAgY2hhbm5lbHMgZm9yIGVhY2gpLCB0aGVuIGNvbmNhdGVuYXRlcyB0aGUgcmVzdWx0c1xuICogdG9nZXRoZXIuIFRoZSBvdXRwdXQgaGFzIGBpbkNoYW5uZWxzICogY2hhbm5lbE11bHRpcGxpZXJgIGNoYW5uZWxzLlxuICpcbiAqIFNlZVxuICogW2h0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9kZXB0aHdpc2VfY29udjJkXShcbiAqICAgICBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vZGVwdGh3aXNlX2NvbnYyZClcbiAqIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogQHBhcmFtIG9iaiBBbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDQgb3IgcmFuayAzLCBvZiBzaGFwZVxuICogICAgIGBbYmF0Y2gsIGhlaWdodCwgd2lkdGgsIGluQ2hhbm5lbHNdYC4gSWYgcmFuayAzLCBiYXRjaCBvZiAxIGlzXG4gKiBhc3N1bWVkLlxuICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyIHRlbnNvciwgcmFuayA0LCBvZiBzaGFwZVxuICogICAgIGBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5DaGFubmVscywgY2hhbm5lbE11bHRpcGxpZXJdYC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBjb252b2x1dGlvbjogYFtzdHJpZGVIZWlnaHQsXG4gKiBzdHJpZGVXaWR0aF1gLiBJZiBzdHJpZGVzIGlzIGEgc2luZ2xlIG51bWJlciwgdGhlbiBgc3RyaWRlSGVpZ2h0ID09XG4gKiBzdHJpZGVXaWR0aGAuXG4gKiBAcGFyYW0gcGFkIFRoZSB0eXBlIG9mIHBhZGRpbmcgYWxnb3JpdGhtLlxuICogICAtIGBzYW1lYCBhbmQgc3RyaWRlIDE6IG91dHB1dCB3aWxsIGJlIG9mIHNhbWUgc2l6ZSBhcyBpbnB1dCxcbiAqICAgICAgIHJlZ2FyZGxlc3Mgb2YgZmlsdGVyIHNpemUuXG4gKiAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAtIEZvciBtb3JlIGluZm8sIHNlZSB0aGlzIGd1aWRlOlxuICogICAgIFtodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb25dKFxuICogICAgICAgICAgaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uKVxuICogQHBhcmFtIGRpbGF0aW9ucyBUaGUgZGlsYXRpb24gcmF0ZXM6IGBbZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGhdYFxuICogICAgIGluIHdoaWNoIHdlIHNhbXBsZSBpbnB1dCB2YWx1ZXMgYWNyb3NzIHRoZSBoZWlnaHQgYW5kIHdpZHRoIGRpbWVuc2lvbnNcbiAqICAgICBpbiBhdHJvdXMgY29udm9sdXRpb24uIERlZmF1bHRzIHRvIGBbMSwgMV1gLiBJZiBgcmF0ZWAgaXMgYSBzaW5nbGVcbiAqICAgICBudW1iZXIsIHRoZW4gYGRpbGF0aW9uSGVpZ2h0ID09IGRpbGF0aW9uV2lkdGhgLiBJZiBpdCBpcyBncmVhdGVyIHRoYW5cbiAqICAgICAxLCB0aGVuIGFsbCB2YWx1ZXMgb2YgYHN0cmlkZXNgIG11c3QgYmUgMS5cbiAqIEBwYXJhbSBkYXRhRm9ybWF0OiBBbiBvcHRpb25hbCBzdHJpbmcgZnJvbTogXCJOSFdDXCIsIFwiTkNIV1wiLiBEZWZhdWx0cyB0b1xuICogICAgIFwiTkhXQ1wiLiBTcGVjaWZ5IHRoZSBkYXRhIGZvcm1hdCBvZiB0aGUgaW5wdXQgYW5kIG91dHB1dCBkYXRhLiBXaXRoIHRoZVxuICogICAgIGRlZmF1bHQgZm9ybWF0IFwiTkhXQ1wiLCB0aGUgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIG9yZGVyIG9mOiBbYmF0Y2gsXG4gKiAgICAgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbHNdLiBPbmx5IFwiTkhXQ1wiIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQuXG4gKiBAcGFyYW0gZGltUm91bmRpbmdNb2RlIEEgc3RyaW5nIGZyb206ICdjZWlsJywgJ3JvdW5kJywgJ2Zsb29yJy4gSWYgbm9uZSBpc1xuICogICAgIHByb3ZpZGVkLCBpdCB3aWxsIGRlZmF1bHQgdG8gdHJ1bmNhdGUuXG4gKiBAcGFyYW0gYmlhcyBUZW5zb3IgdG8gYmUgYWRkZWQgdG8gdGhlIHJlc3VsdC5cbiAqIEBwYXJhbSBhY3RpdmF0aW9uIE5hbWUgb2YgYWN0aXZhdGlvbiBrZXJuZWwgKGRlZmF1bHRzIHRvIGBsaW5lYXJgKS5cbiAqIEBwYXJhbSBwcmVsdUFjdGl2YXRpb25XZWlnaHRzIFRlbnNvciBvZiBwcmVsdSB3ZWlnaHRzIHRvIGJlIGFwcGxpZWQgYXMgcGFydFxuICogICAgIG9mIGEgYHByZWx1YCBhY3RpdmF0aW9uLCB0eXBpY2FsbHkgdGhlIHNhbWUgc2hhcGUgYXMgYHhgLlxuICogQHBhcmFtIGxlYWt5cmVsdUFscGhhIE9wdGlvbmFsLiBBbHBoYSB0byBiZSBhcHBsaWVkIGFzIHBhcnQgb2YgYSBgbGVha3lyZWx1YFxuICogICAgIGFjdGl2YXRpb24uXG4gKi9cbmZ1bmN0aW9uIGZ1c2VkRGVwdGh3aXNlQ29udjJkXyh7IHgsIGZpbHRlciwgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0ID0gJ05IV0MnLCBkaWxhdGlvbnMgPSBbMSwgMV0sIGRpbVJvdW5kaW5nTW9kZSwgYmlhcywgYWN0aXZhdGlvbiA9ICdsaW5lYXInLCBwcmVsdUFjdGl2YXRpb25XZWlnaHRzLCBsZWFreXJlbHVBbHBoYSB9KSB7XG4gICAgaWYgKHNob3VsZEZ1c2UoRU5HSU5FLnN0YXRlLmdyYWRpZW50RGVwdGgsIGFjdGl2YXRpb24pID09PSBmYWxzZSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gdW5mdXNlZERlcHRod2lzZUNvbnYyZCh4LCBmaWx0ZXIsIHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGlsYXRpb25zLCBkaW1Sb3VuZGluZ01vZGUpO1xuICAgICAgICBpZiAoYmlhcyAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBhZGQocmVzdWx0LCBiaWFzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXBwbHlBY3RpdmF0aW9uKHJlc3VsdCwgYWN0aXZhdGlvbiwgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cywgbGVha3lyZWx1QWxwaGEpO1xuICAgIH1cbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdkZXB0aHdpc2VDb252MmQnKTtcbiAgICBjb25zdCAkZmlsdGVyID0gY29udmVydFRvVGVuc29yKGZpbHRlciwgJ2ZpbHRlcicsICdkZXB0aHdpc2VDb252MmQnKTtcbiAgICBsZXQgeDREID0gJHg7XG4gICAgbGV0IHJlc2hhcGVkVG80RCA9IGZhbHNlO1xuICAgIGlmICgkeC5yYW5rID09PSAzKSB7XG4gICAgICAgIHJlc2hhcGVkVG80RCA9IHRydWU7XG4gICAgICAgIHg0RCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV0sICR4LnNoYXBlWzJdXSk7XG4gICAgfVxuICAgIHV0aWwuYXNzZXJ0KHg0RC5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gZnVzZWQgZGVwdGh3aXNlQ29udjJkOiBpbnB1dCBtdXN0IGJlIHJhbmsgNCwgYnV0IGdvdCBgICtcbiAgICAgICAgYHJhbmsgJHt4NEQucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoJGZpbHRlci5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gZnVzZWQgZGVwdGh3aXNlQ29udjJkOiBmaWx0ZXIgbXVzdCBiZSByYW5rIDQsIGAgK1xuICAgICAgICBgYnV0IGdvdCByYW5rICR7JGZpbHRlci5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydCh4NEQuc2hhcGVbM10gPT09ICRmaWx0ZXIuc2hhcGVbMl0sICgpID0+IGBFcnJvciBpbiBmdXNlZCBkZXB0aHdpc2VDb252MmQ6IG51bWJlciBvZiBpbnB1dCBjaGFubmVscyBgICtcbiAgICAgICAgYCgke3g0RC5zaGFwZVszXX0pIG11c3QgbWF0Y2ggdGhlIGluQ2hhbm5lbHMgZGltZW5zaW9uIGluIGAgK1xuICAgICAgICBgZmlsdGVyICR7JGZpbHRlci5zaGFwZVsyXX0uYCk7XG4gICAgaWYgKGRpbGF0aW9ucyA9PSBudWxsKSB7XG4gICAgICAgIGRpbGF0aW9ucyA9IFsxLCAxXTtcbiAgICB9XG4gICAgdXRpbC5hc3NlcnQoY29udl91dGlsLmVpdGhlclN0cmlkZXNPckRpbGF0aW9uc0FyZU9uZShzdHJpZGVzLCBkaWxhdGlvbnMpLCAoKSA9PiAnRXJyb3IgaW4gZnVzZWQgZGVwdGh3aXNlQ29udjJkOiBFaXRoZXIgc3RyaWRlcyBvciBkaWxhdGlvbnMgbXVzdCAnICtcbiAgICAgICAgYGJlIDEuIEdvdCBzdHJpZGVzICR7c3RyaWRlc30gYW5kIGRpbGF0aW9ucyAnJHtkaWxhdGlvbnN9J2ApO1xuICAgIGlmIChkaW1Sb3VuZGluZ01vZGUgIT0gbnVsbCkge1xuICAgICAgICB1dGlsLmFzc2VydCh1dGlsLmlzSW50KHBhZCksICgpID0+IGBFcnJvciBpbiBmdXNlZCBkZXB0aHdpc2VDb252MmQ6IHBhZCBtdXN0IGJlIGFuIGludGVnZXIgd2hlbiBgICtcbiAgICAgICAgICAgIGB1c2luZyBkaW1Sb3VuZGluZ01vZGUgJHtkaW1Sb3VuZGluZ01vZGV9IGJ1dCBnb3QgcGFkICR7cGFkfS5gKTtcbiAgICB9XG4gICAgY29uc3QgY29udkluZm8gPSBjb252X3V0aWwuY29tcHV0ZUNvbnYyREluZm8oeDRELnNoYXBlLCAkZmlsdGVyLnNoYXBlLCBzdHJpZGVzLCBkaWxhdGlvbnMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCB0cnVlIC8qIGRlcHRod2lzZSAqLyk7XG4gICAgbGV0ICRiaWFzO1xuICAgIGlmIChiaWFzICE9IG51bGwpIHtcbiAgICAgICAgJGJpYXMgPSBjb252ZXJ0VG9UZW5zb3IoYmlhcywgJ2JpYXMnLCAnZnVzZWQgY29udjJkJyk7XG4gICAgICAgIFskYmlhc10gPSBtYWtlVHlwZXNNYXRjaCgkYmlhcywgJHgpO1xuICAgICAgICBicm9hZGNhc3RfdXRpbC5hc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZShjb252SW5mby5vdXRTaGFwZSwgJGJpYXMuc2hhcGUpO1xuICAgIH1cbiAgICBsZXQgJHByZWx1QWN0aXZhdGlvbldlaWdodHM7XG4gICAgaWYgKHByZWx1QWN0aXZhdGlvbldlaWdodHMgIT0gbnVsbCkge1xuICAgICAgICAkcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyA9IGNvbnZlcnRUb1RlbnNvcihwcmVsdUFjdGl2YXRpb25XZWlnaHRzLCAncHJlbHUgd2VpZ2h0cycsICdmdXNlZCBkZXB0aHdpc2VDb252MmQnKTtcbiAgICB9XG4gICAgY29uc3QgZ3JhZCA9IChkeSwgc2F2ZWQpID0+IHtcbiAgICAgICAgdXRpbC5hc3NlcnQoY29udl91dGlsLnR1cGxlVmFsdWVzQXJlT25lKGRpbGF0aW9ucyksICgpID0+ICdFcnJvciBpbiBncmFkaWVudCBvZiBmdXNlZCBkZXB0aHdpc2VDb252MmQ6IGRpbGF0aW9uIHJhdGVzICcgK1xuICAgICAgICAgICAgYGdyZWF0ZXIgdGhhbiAxIGFyZSBub3QgeWV0IHN1cHBvcnRlZC4gR290IGRpbGF0aW9ucyBgICtcbiAgICAgICAgICAgIGAnJHtkaWxhdGlvbnN9J2ApO1xuICAgICAgICBjb25zdCBbJGZpbHRlciwgeDRELCB5LCBiaWFzXSA9IHNhdmVkO1xuICAgICAgICBjb25zdCBkeUFjdGl2YXRpb24gPSBnZXRGdXNlZER5QWN0aXZhdGlvbihkeSwgeSwgYWN0aXZhdGlvbik7XG4gICAgICAgIGNvbnN0IHhEZXIgPSBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0KHg0RC5zaGFwZSwgZHlBY3RpdmF0aW9uLCAkZmlsdGVyLCBzdHJpZGVzLCBwYWQsIGRpbGF0aW9ucywgZGltUm91bmRpbmdNb2RlKTtcbiAgICAgICAgY29uc3QgZmlsdGVyRGVyID0gZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIoeDRELCBkeUFjdGl2YXRpb24sICRmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsIHBhZCwgZGlsYXRpb25zLCBkaW1Sb3VuZGluZ01vZGUpO1xuICAgICAgICBpZiAoYmlhcyAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBiaWFzRGVyID0gZ2V0RnVzZWRCaWFzR3JhZGllbnQoJGJpYXMsIGR5QWN0aXZhdGlvbik7XG4gICAgICAgICAgICByZXR1cm4gW3hEZXIsIGZpbHRlckRlciwgYmlhc0Rlcl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFt4RGVyLCBmaWx0ZXJEZXJdO1xuICAgIH07XG4gICAgY29uc3QgaW5wdXRzID0ge1xuICAgICAgICB4OiB4NEQsXG4gICAgICAgIGZpbHRlcjogJGZpbHRlcixcbiAgICAgICAgYmlhczogJGJpYXMsXG4gICAgICAgIHByZWx1QWN0aXZhdGlvbldlaWdodHM6ICRwcmVsdUFjdGl2YXRpb25XZWlnaHRzXG4gICAgfTtcbiAgICBjb25zdCBhdHRycyA9IHtcbiAgICAgICAgc3RyaWRlcyxcbiAgICAgICAgcGFkLFxuICAgICAgICBkYXRhRm9ybWF0LFxuICAgICAgICBkaWxhdGlvbnMsXG4gICAgICAgIGRpbVJvdW5kaW5nTW9kZSxcbiAgICAgICAgYWN0aXZhdGlvbixcbiAgICAgICAgbGVha3lyZWx1QWxwaGFcbiAgICB9O1xuICAgIC8vIERlcGVuZGluZyBvbiB0aGUgdGhlIHBhcmFtcyBwYXNzZWQgaW4gd2Ugd2lsbCBoYXZlIGRpZmZlcmVudCBudW1iZXIgb2ZcbiAgICAvLyBpbnB1dHMgYW5kIHRodXMgYSBhIGRpZmZlcmVudCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGdyYWRpZW50LlxuICAgIGlmIChiaWFzID09IG51bGwpIHtcbiAgICAgICAgY29uc3QgY3VzdG9tT3AgPSBjdXN0b21HcmFkKCh4NEQsIGZpbHRlciwgc2F2ZSkgPT4ge1xuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgICAgICAgICAgbGV0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoRnVzZWREZXB0aHdpc2VDb252MkQsIGlucHV0cywgYXR0cnMpO1xuICAgICAgICAgICAgc2F2ZShbZmlsdGVyLCB4NEQsIHJlc10pO1xuICAgICAgICAgICAgaWYgKHJlc2hhcGVkVG80RCkge1xuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICAgICAgICAgICAgICByZXMgPSByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiByZXMsIGdyYWRGdW5jOiBncmFkIH07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY3VzdG9tT3AoeDRELCAkZmlsdGVyKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGN1c3RvbU9wV2l0aEJpYXMgPSBjdXN0b21HcmFkKCh4NEQsIGZpbHRlciwgYmlhcywgc2F2ZSkgPT4ge1xuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgICAgICAgICAgbGV0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoRnVzZWREZXB0aHdpc2VDb252MkQsIGlucHV0cywgYXR0cnMpO1xuICAgICAgICAgICAgc2F2ZShbZmlsdGVyLCB4NEQsIHJlcywgYmlhc10pO1xuICAgICAgICAgICAgaWYgKHJlc2hhcGVkVG80RCkge1xuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICAgICAgICAgICAgICByZXMgPSByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiByZXMsIGdyYWRGdW5jOiBncmFkIH07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY3VzdG9tT3BXaXRoQmlhcyh4NEQsICRmaWx0ZXIsICRiaWFzKTtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgZGVwdGh3aXNlQ29udjJkID0gb3AoeyBmdXNlZERlcHRod2lzZUNvbnYyZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZXB0aHdpc2VfY29udjJkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBjdXN0b21HcmFkIH0gZnJvbSAnLi4vLi4vZ3JhZGllbnRzJztcbmltcG9ydCB7IF9GdXNlZE1hdE11bCB9IGZyb20gJy4uLy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBtYWtlVHlwZXNNYXRjaCB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHsgYWRkIH0gZnJvbSAnLi4vYWRkJztcbmltcG9ydCAqIGFzIGJyb2FkY2FzdF91dGlsIGZyb20gJy4uL2Jyb2FkY2FzdF91dGlsJztcbmltcG9ydCB7IGFwcGx5QWN0aXZhdGlvbiwgZ2V0RnVzZWRCaWFzR3JhZGllbnQsIGdldEZ1c2VkRHlBY3RpdmF0aW9uLCBzaG91bGRGdXNlIH0gZnJvbSAnLi4vZnVzZWRfdXRpbCc7XG5pbXBvcnQgeyBtYXRNdWwgYXMgdW5mdXNlZE1hdE11bCB9IGZyb20gJy4uL21hdF9tdWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4uL3Jlc2hhcGUnO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIG1hdHJpY2VzIHdpdGggb3B0aW9uYWwgYWN0aXZhdGlvbiBhbmQgYmlhcy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjJkKFstMSwgLTJdLCBbMSwgMl0pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjJkKFsxLCAyLCAzLCA0XSwgWzIsIDJdKTtcbiAqIGNvbnN0IGJpYXMgPSB0Zi50ZW5zb3IyZChbMSwgMl0sIFsxLCAyXSk7XG4gKlxuICogdGYuZnVzZWQubWF0TXVsKHthLCBiLCBiaWFzLCBhY3RpdmF0aW9uOiAncmVsdSd9KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIG9iaiBBbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAtIGBhYCBGaXJzdCBtYXRyaXggaW4gZG90IHByb2R1Y3Qgb3BlcmF0aW9uLlxuICogLSBgYmAgU2Vjb25kIG1hdHJpeCBpbiBkb3QgcHJvZHVjdCBvcGVyYXRpb24uXG4gKiAtIGB0cmFuc3Bvc2VBYCBJZiB0cnVlLCBgYWAgaXMgdHJhbnNwb3NlZCBiZWZvcmUgbXVsdGlwbGljYXRpb24uXG4gKiAtIGB0cmFuc3Bvc2VCYCBJZiB0cnVlLCBgYmAgaXMgdHJhbnNwb3NlZCBiZWZvcmUgbXVsdGlwbGljYXRpb24uXG4gKiAtIGBiaWFzYCBNYXRyaXggdG8gYmUgYWRkZWQgdG8gdGhlIHJlc3VsdC5cbiAqIC0gYGFjdGl2YXRpb25gIE5hbWUgb2YgYWN0aXZhdGlvbiBrZXJuZWwgKGRlZmF1bHRzIHRvIGBsaW5lYXJgKS5cbiAqIC0gYHByZWx1QWN0aXZhdGlvbldlaWdodHNgIFRlbnNvciBvZiBwcmVsdSB3ZWlnaHRzLlxuICogLSBgbGVha3lyZWx1QWxwaGFgIEFscGhhIG9mIGxlYWt5cmVsdS5cbiAqL1xuZnVuY3Rpb24gZnVzZWRNYXRNdWxfKHsgYSwgYiwgdHJhbnNwb3NlQSA9IGZhbHNlLCB0cmFuc3Bvc2VCID0gZmFsc2UsIGJpYXMsIGFjdGl2YXRpb24gPSAnbGluZWFyJywgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cywgbGVha3lyZWx1QWxwaGEsIH0pIHtcbiAgICBpZiAoc2hvdWxkRnVzZShFTkdJTkUuc3RhdGUuZ3JhZGllbnREZXB0aCwgYWN0aXZhdGlvbikgPT09IGZhbHNlKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB1bmZ1c2VkTWF0TXVsKGEsIGIsIHRyYW5zcG9zZUEsIHRyYW5zcG9zZUIpO1xuICAgICAgICBpZiAoYmlhcyAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBhZGQocmVzdWx0LCBiaWFzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXBwbHlBY3RpdmF0aW9uKHJlc3VsdCwgYWN0aXZhdGlvbiwgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cywgbGVha3lyZWx1QWxwaGEpO1xuICAgIH1cbiAgICBsZXQgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnZnVzZWQgbWF0TXVsJyk7XG4gICAgbGV0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ2Z1c2VkIG1hdE11bCcpO1xuICAgIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcbiAgICBjb25zdCBpbm5lclNoYXBlQSA9IHRyYW5zcG9zZUEgPyAkYS5zaGFwZVskYS5yYW5rIC0gMl0gOiAkYS5zaGFwZVskYS5yYW5rIC0gMV07XG4gICAgY29uc3QgaW5uZXJTaGFwZUIgPSB0cmFuc3Bvc2VCID8gJGIuc2hhcGVbJGIucmFuayAtIDFdIDogJGIuc2hhcGVbJGIucmFuayAtIDJdO1xuICAgIGNvbnN0IG91dGVyU2hhcGVBID0gdHJhbnNwb3NlQSA/ICRhLnNoYXBlWyRhLnJhbmsgLSAxXSA6ICRhLnNoYXBlWyRhLnJhbmsgLSAyXTtcbiAgICBjb25zdCBvdXRlclNoYXBlQiA9IHRyYW5zcG9zZUIgPyAkYi5zaGFwZVskYi5yYW5rIC0gMl0gOiAkYi5zaGFwZVskYi5yYW5rIC0gMV07XG4gICAgY29uc3Qgb3V0ZXJEaW1zQSA9ICRhLnNoYXBlLnNsaWNlKDAsIC0yKTtcbiAgICBjb25zdCBvdXRlckRpbXNCID0gJGIuc2hhcGUuc2xpY2UoMCwgLTIpO1xuICAgIGNvbnN0IGJhdGNoRGltQSA9IHV0aWwuc2l6ZUZyb21TaGFwZShvdXRlckRpbXNBKTtcbiAgICBjb25zdCBiYXRjaERpbUIgPSB1dGlsLnNpemVGcm9tU2hhcGUob3V0ZXJEaW1zQik7XG4gICAgdXRpbC5hc3NlcnQoJGEucmFuayA+PSAyICYmICRiLnJhbmsgPj0gMiAmJiAkYS5yYW5rID09PSAkYi5yYW5rLCAoKSA9PiBgRXJyb3IgaW4gZnVzZWQgbWF0TXVsOiBpbnB1dHMgbXVzdCBoYXZlIHRoZSBzYW1lIHJhbmsgb2YgYXQgYCArXG4gICAgICAgIGBsZWFzdCAyLCBnb3QgcmFua3MgJHskYS5yYW5rfSBhbmQgJHskYi5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydCh1dGlsLmFycmF5c0VxdWFsKG91dGVyRGltc0EsIG91dGVyRGltc0IpLCAoKSA9PiBgRXJyb3IgaW4gZnVzZWQgbWF0TXVsOiBvdXRlciBkaW1lbnNpb25zICgke291dGVyRGltc0F9KSBhbmQgKGAgK1xuICAgICAgICBgJHtvdXRlckRpbXNCfSkgb2YgVGVuc29ycyB3aXRoIHNoYXBlcyAkeyRhLnNoYXBlfSBhbmQgYCArXG4gICAgICAgIGAkeyRiLnNoYXBlfSBtdXN0IG1hdGNoLmApO1xuICAgIHV0aWwuYXNzZXJ0KGlubmVyU2hhcGVBID09PSBpbm5lclNoYXBlQiwgKCkgPT4gYEVycm9yIGluIGZ1c2VkIG1hdE11bDogaW5uZXIgc2hhcGVzICgke2lubmVyU2hhcGVBfSkgYW5kIChgICtcbiAgICAgICAgYCR7aW5uZXJTaGFwZUJ9KSBvZiBUZW5zb3JzIHdpdGggc2hhcGVzICR7JGEuc2hhcGV9IGFuZCBgICtcbiAgICAgICAgYCR7JGIuc2hhcGV9IGFuZCB0cmFuc3Bvc2VBPSR7dHJhbnNwb3NlQX1gICtcbiAgICAgICAgYCBhbmQgdHJhbnNwb3NlQj0ke3RyYW5zcG9zZUJ9IG11c3QgbWF0Y2guYCk7XG4gICAgY29uc3Qgb3V0U2hhcGUgPSAkYS5zaGFwZS5zbGljZSgwLCAtMikuY29uY2F0KFtvdXRlclNoYXBlQSwgb3V0ZXJTaGFwZUJdKTtcbiAgICBjb25zdCBhM0QgPSB0cmFuc3Bvc2VBID9cbiAgICAgICAgcmVzaGFwZSgkYSwgW2JhdGNoRGltQSwgaW5uZXJTaGFwZUEsIG91dGVyU2hhcGVBXSkgOlxuICAgICAgICByZXNoYXBlKCRhLCBbYmF0Y2hEaW1BLCBvdXRlclNoYXBlQSwgaW5uZXJTaGFwZUFdKTtcbiAgICBjb25zdCBiM0QgPSB0cmFuc3Bvc2VCID9cbiAgICAgICAgcmVzaGFwZSgkYiwgW2JhdGNoRGltQiwgb3V0ZXJTaGFwZUIsIGlubmVyU2hhcGVCXSkgOlxuICAgICAgICByZXNoYXBlKCRiLCBbYmF0Y2hEaW1CLCBpbm5lclNoYXBlQiwgb3V0ZXJTaGFwZUJdKTtcbiAgICBsZXQgJGJpYXM7XG4gICAgaWYgKGJpYXMgIT0gbnVsbCkge1xuICAgICAgICAkYmlhcyA9IGNvbnZlcnRUb1RlbnNvcihiaWFzLCAnYmlhcycsICdmdXNlZCBtYXRNdWwnKTtcbiAgICAgICAgWyRiaWFzXSA9IG1ha2VUeXBlc01hdGNoKCRiaWFzLCAkYSk7XG4gICAgICAgIGJyb2FkY2FzdF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKG91dFNoYXBlLCAkYmlhcy5zaGFwZSk7XG4gICAgfVxuICAgIGxldCAkcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cztcbiAgICBpZiAocHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyAhPSBudWxsKSB7XG4gICAgICAgICRwcmVsdUFjdGl2YXRpb25XZWlnaHRzID0gY29udmVydFRvVGVuc29yKHByZWx1QWN0aXZhdGlvbldlaWdodHMsICdwcmVsdSB3ZWlnaHRzJywgJ2Z1c2VkIG1hdE11bCcpO1xuICAgIH1cbiAgICBjb25zdCBncmFkID0gKGR5LCBzYXZlZCkgPT4ge1xuICAgICAgICBjb25zdCBbYTNELCBiM0QsIHksICRiaWFzXSA9IHNhdmVkO1xuICAgICAgICAvLyB3ZSByZXNoYXBlIGR5IGJlY2F1c2UgdGhlIHJlc3VsdCBvZiB0aGUgZm9yd2FyZCBpcyBub3RcbiAgICAgICAgLy8gbmVjZXNzYXJpbHkgZ29pbmcgdG8gYmUgYSAzZCB0ZW5zb3IgZHVlIHRvIGEgcmVzaGFwZSBkb25lIGF0IHRoZSBlbmQgb2ZcbiAgICAgICAgLy8gdGhlIGN1c3RvbU9wLlxuICAgICAgICBjb25zdCBkeUFjdGl2YXRpb24gPSBnZXRGdXNlZER5QWN0aXZhdGlvbihyZXNoYXBlKGR5LCB5LnNoYXBlKSwgeSwgYWN0aXZhdGlvbik7XG4gICAgICAgIGxldCBhRGVyO1xuICAgICAgICBsZXQgYkRlcjtcbiAgICAgICAgaWYgKCF0cmFuc3Bvc2VBICYmICF0cmFuc3Bvc2VCKSB7XG4gICAgICAgICAgICBhRGVyID0gdW5mdXNlZE1hdE11bChkeUFjdGl2YXRpb24sIGIzRCwgZmFsc2UsIHRydWUpO1xuICAgICAgICAgICAgYkRlciA9IHVuZnVzZWRNYXRNdWwoYTNELCBkeUFjdGl2YXRpb24sIHRydWUsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghdHJhbnNwb3NlQSAmJiB0cmFuc3Bvc2VCKSB7XG4gICAgICAgICAgICBhRGVyID0gdW5mdXNlZE1hdE11bChkeUFjdGl2YXRpb24sIGIzRCwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgICAgIGJEZXIgPSB1bmZ1c2VkTWF0TXVsKGR5QWN0aXZhdGlvbiwgYTNELCB0cnVlLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHJhbnNwb3NlQSAmJiAhdHJhbnNwb3NlQikge1xuICAgICAgICAgICAgYURlciA9IHVuZnVzZWRNYXRNdWwoYjNELCBkeUFjdGl2YXRpb24sIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgICAgIGJEZXIgPSB1bmZ1c2VkTWF0TXVsKGEzRCwgZHlBY3RpdmF0aW9uLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYURlciA9IHVuZnVzZWRNYXRNdWwoYjNELCBkeUFjdGl2YXRpb24sIHRydWUsIHRydWUpO1xuICAgICAgICAgICAgYkRlciA9IHVuZnVzZWRNYXRNdWwoZHlBY3RpdmF0aW9uLCBhM0QsIHRydWUsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiaWFzICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGJpYXNEZXIgPSBnZXRGdXNlZEJpYXNHcmFkaWVudCgkYmlhcywgZHlBY3RpdmF0aW9uKTtcbiAgICAgICAgICAgIHJldHVybiBbYURlciwgYkRlciwgYmlhc0Rlcl07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW2FEZXIsIGJEZXJdO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBpbnB1dHMgPSB7XG4gICAgICAgIGE6IGEzRCxcbiAgICAgICAgYjogYjNELFxuICAgICAgICBiaWFzOiAkYmlhcyxcbiAgICAgICAgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0czogJHByZWx1QWN0aXZhdGlvbldlaWdodHNcbiAgICB9O1xuICAgIGNvbnN0IGF0dHJzID0geyB0cmFuc3Bvc2VBLCB0cmFuc3Bvc2VCLCBhY3RpdmF0aW9uLCBsZWFreXJlbHVBbHBoYSB9O1xuICAgIC8vIERlcGVuZGluZyBvbiB0aGUgdGhlIHBhcmFtcyBwYXNzZWQgaW4gd2Ugd2lsbCBoYXZlIGRpZmZlcmVudCBudW1iZXIgb2ZcbiAgICAvLyBpbnB1dHMgYW5kIHRodXMgYSBhIGRpZmZlcmVudCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGdyYWRpZW50LlxuICAgIGlmIChiaWFzID09IG51bGwpIHtcbiAgICAgICAgY29uc3QgY3VzdG9tT3AgPSBjdXN0b21HcmFkKChhM0QsIGIzRCwgc2F2ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzID0gXG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgICAgICAgICBFTkdJTkUucnVuS2VybmVsKF9GdXNlZE1hdE11bCwgaW5wdXRzLCBhdHRycyk7XG4gICAgICAgICAgICBzYXZlKFthM0QsIGIzRCwgcmVzXSk7XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogcmVzaGFwZShyZXMsIG91dFNoYXBlKSwgZ3JhZEZ1bmM6IGdyYWQgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjdXN0b21PcChhM0QsIGIzRCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBjdXN0b21PcFdpdGhCaWFzID0gY3VzdG9tR3JhZCgoYTNELCBiM0QsICRiaWFzLCBzYXZlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXMgPSBcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICAgICAgICAgIEVOR0lORS5ydW5LZXJuZWwoX0Z1c2VkTWF0TXVsLCBpbnB1dHMsIGF0dHJzKTtcbiAgICAgICAgICAgIHNhdmUoW2EzRCwgYjNELCByZXMsICRiaWFzXSk7XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogcmVzaGFwZShyZXMsIG91dFNoYXBlKSwgZ3JhZEZ1bmM6IGdyYWQgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjdXN0b21PcFdpdGhCaWFzKGEzRCwgYjNELCAkYmlhcyk7XG4gICAgfVxufVxuZXhwb3J0IGNvbnN0IG1hdE11bCA9IG9wKHsgZnVzZWRNYXRNdWxfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWF0X211bC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjb252MmQgfSBmcm9tICcuL2Z1c2VkL2NvbnYyZCc7XG5pbXBvcnQgeyBkZXB0aHdpc2VDb252MmQgfSBmcm9tICcuL2Z1c2VkL2RlcHRod2lzZV9jb252MmQnO1xuaW1wb3J0IHsgbWF0TXVsIH0gZnJvbSAnLi9mdXNlZC9tYXRfbXVsJztcbmV4cG9ydCB7IGNvbnYyZCwgZGVwdGh3aXNlQ29udjJkLCBtYXRNdWwgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZ1c2VkX29wcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgKiBhcyBicm9hZGNhc3RfdXRpbCBmcm9tICcuL2Jyb2FkY2FzdF91dGlsJztcbmltcG9ydCB7IGVsdSB9IGZyb20gJy4vZWx1JztcbmltcG9ydCB7IGxlYWt5UmVsdSB9IGZyb20gJy4vbGVha3lfcmVsdSc7XG5pbXBvcnQgeyBtdWwgfSBmcm9tICcuL211bCc7XG5pbXBvcnQgeyBwcmVsdSB9IGZyb20gJy4vcHJlbHUnO1xuaW1wb3J0IHsgcmVsdSB9IGZyb20gJy4vcmVsdSc7XG5pbXBvcnQgeyByZWx1NiB9IGZyb20gJy4vcmVsdTYnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vcmVzaGFwZSc7XG5pbXBvcnQgeyBzaWdtb2lkIH0gZnJvbSAnLi9zaWdtb2lkJztcbmltcG9ydCB7IHN0ZXAgfSBmcm9tICcuL3N0ZXAnO1xuaW1wb3J0IHsgc3VtIH0gZnJvbSAnLi9zdW0nO1xuLy8gUmV0dXJucyBncmFkaWVudCBmb3IgZnVzZWQgYWN0aXZhdGlvbi5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGdXNlZER5QWN0aXZhdGlvbihkeSwgeSwgYWN0aXZhdGlvbikge1xuICAgIGlmIChhY3RpdmF0aW9uID09IG51bGwgfHwgYWN0aXZhdGlvbiA9PT0gJ2xpbmVhcicpIHtcbiAgICAgICAgcmV0dXJuIGR5O1xuICAgIH1cbiAgICBpZiAoYWN0aXZhdGlvbiA9PT0gJ3JlbHUnKSB7XG4gICAgICAgIHJldHVybiBtdWwoZHksIHN0ZXAoeSkpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb21wdXRlIGdyYWRpZW50IGZvciBmdXNlZCBhY3RpdmF0aW9uICR7YWN0aXZhdGlvbn0uYCk7XG59XG4vLyBSZXR1cm5zIGdyYWRpZW50IGZvciBmdXNlZCBiaWFzLlxuZXhwb3J0IGZ1bmN0aW9uIGdldEZ1c2VkQmlhc0dyYWRpZW50KGJpYXMsIGR5QWN0aXZhdGlvbikge1xuICAgIGxldCByZXMgPSBkeUFjdGl2YXRpb247XG4gICAgY29uc3QgcmVkdWNlQXhlcyA9IGJyb2FkY2FzdF91dGlsLmdldFJlZHVjdGlvbkF4ZXMoYmlhcy5zaGFwZSwgZHlBY3RpdmF0aW9uLnNoYXBlKTtcbiAgICBpZiAocmVkdWNlQXhlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlcyA9IHN1bShyZXMsIHJlZHVjZUF4ZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzaGFwZShyZXMsIGJpYXMuc2hhcGUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5QWN0aXZhdGlvbih4LCBhY3RpdmF0aW9uLCBwcmVsdUFjdGl2YXRpb25XZWlnaHRzLCBsZWFreXJlbHVBbHBoYSkge1xuICAgIGlmIChhY3RpdmF0aW9uID09PSAnbGluZWFyJykge1xuICAgICAgICByZXR1cm4geDtcbiAgICB9XG4gICAgZWxzZSBpZiAoYWN0aXZhdGlvbiA9PT0gJ3JlbHUnKSB7XG4gICAgICAgIHJldHVybiByZWx1KHgpO1xuICAgIH1cbiAgICBlbHNlIGlmIChhY3RpdmF0aW9uID09PSAnZWx1Jykge1xuICAgICAgICByZXR1cm4gZWx1KHgpO1xuICAgIH1cbiAgICBlbHNlIGlmIChhY3RpdmF0aW9uID09PSAncmVsdTYnKSB7XG4gICAgICAgIHJldHVybiByZWx1Nih4KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYWN0aXZhdGlvbiA9PT0gJ3ByZWx1Jykge1xuICAgICAgICByZXR1cm4gcHJlbHUoeCwgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdsZWFreXJlbHUnKSB7XG4gICAgICAgIHJldHVybiBsZWFreVJlbHUoeCwgbGVha3lyZWx1QWxwaGEpO1xuICAgIH1cbiAgICBlbHNlIGlmIChhY3RpdmF0aW9uID09PSAnc2lnbW9pZCcpIHtcbiAgICAgICAgcmV0dXJuIHNpZ21vaWQoeCk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBmdXNlZCBhY3RpdmF0aW9uICR7YWN0aXZhdGlvbn0uYCk7XG59XG4vLyBXaGV0aGVyIHdlIHNob3VsZCBjYWxsIGZ1c2VkIG9wcy5cbmV4cG9ydCBjb25zdCBzaG91bGRGdXNlID0gKGdyYWRpZW50RGVwdGgsIGFjdGl2YXRpb24pID0+IHtcbiAgICBjb25zdCBncmFkaWVudE1vZGUgPSBncmFkaWVudERlcHRoID4gMDtcbiAgICByZXR1cm4gIWdyYWRpZW50TW9kZSB8fCBhY3RpdmF0aW9uID09PSAnbGluZWFyJztcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mdXNlZF91dGlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBHYXRoZXJWMiB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIEdhdGhlciBzbGljZXMgZnJvbSB0ZW5zb3IgYHhgJ3MgYXhpcyBgYXhpc2AgYWNjb3JkaW5nIHRvIGBpbmRpY2VzYC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzLCA0XSk7XG4gKiBjb25zdCBpbmRpY2VzID0gdGYudGVuc29yMWQoWzEsIDMsIDNdLCAnaW50MzInKTtcbiAqXG4gKiB4LmdhdGhlcihpbmRpY2VzKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IyZChbMSwgMiwgMywgNF0sIFsyLCAyXSk7XG4gKiBjb25zdCBpbmRpY2VzID0gdGYudGVuc29yMWQoWzEsIDEsIDBdLCAnaW50MzInKTtcbiAqXG4gKiB4LmdhdGhlcihpbmRpY2VzKS5wcmludCgpO1xuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yIHdob3NlIHNsaWNlcyB0byBiZSBnYXRoZXJlZC5cbiAqIEBwYXJhbSBpbmRpY2VzIFRoZSBpbmRpY2VzIG9mIHRoZSB2YWx1ZXMgdG8gZXh0cmFjdC5cbiAqIEBwYXJhbSBheGlzIFRoZSBheGlzIG92ZXIgd2hpY2ggdG8gc2VsZWN0IHZhbHVlcy4gRGVmYXVsdHMgdG8gMC5cbiAqIEBwYXJhbSBiYXRjaERpbXMgT3B0aW9uYWwuIFRoZSBudW1iZXIgb2YgYmF0Y2ggZGltZW5zaW9ucy4gSXQgbXVzdCBiZSBsZXNzXG4gKiAgICAgdGhhbiBvciBlcXVhbCB0byByYW5rKGluZGljZXMpLiBEZWZhdWx0cyB0byAwLlxuICogICAgIFRoZSBvdXRwdXQgdGVuc29yIHdpbGwgaGF2ZSBzaGFwZSBvZlxuICogICAgIGB4LnNoYXBlWzpheGlzXSArIGluZGljZXMuc2hhcGVbYmF0Y2hEaW1zOl0gKyB4LnNoYXBlW2F4aXMgKyAxOl1gXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnU2xpY2luZyBhbmQgSm9pbmluZyd9XG4gKi9cbmZ1bmN0aW9uIGdhdGhlcl8oeCwgaW5kaWNlcywgYXhpcyA9IDAsIGJhdGNoRGltcyA9IDApIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdnYXRoZXInKTtcbiAgICBjb25zdCAkaW5kaWNlcyA9IGNvbnZlcnRUb1RlbnNvcihpbmRpY2VzLCAnaW5kaWNlcycsICdnYXRoZXInLCAnaW50MzInKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4LCBpbmRpY2VzOiAkaW5kaWNlcyB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBheGlzLCBiYXRjaERpbXMgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChHYXRoZXJWMiwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgZ2F0aGVyID0gb3AoeyBnYXRoZXJfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2F0aGVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBHYXRoZXJOZCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIEdhdGhlciBzbGljZXMgZnJvbSBpbnB1dCB0ZW5zb3IgaW50byBhIFRlbnNvciB3aXRoIHNoYXBlIHNwZWNpZmllZCBieVxuICogYGluZGljZXNgLlxuICpcbiAqIGBpbmRpY2VzYCBpcyBhbiBLLWRpbWVuc2lvbmFsIGludGVnZXIgdGVuc29yLCBiZXN0IHRob3VnaHQgb2YgYXMgYVxuICogKEstMSktZGltZW5zaW9uYWwgdGVuc29yIG9mIGluZGljZXMgaW50byBpbnB1dCwgd2hlcmUgZWFjaCBlbGVtZW50IGRlZmluZXMgYVxuICogc2xpY2Ugb2YgaW5wdXQ6XG4gKiBvdXRwdXRbXFxcXChpXzAsIC4uLiwgaV97Sy0yfVxcXFwpXSA9IGlucHV0W2luZGljZXNbXFxcXChpXzAsIC4uLiwgaV97Sy0yfVxcXFwpXV1cbiAqXG4gKiBXaGVyZWFzIGluIGB0Zi5nYXRoZXJgLCBgaW5kaWNlc2AgZGVmaW5lcyBzbGljZXMgaW50byB0aGUgZmlyc3QgZGltZW5zaW9uIG9mXG4gKiBpbnB1dCwgaW4gYHRmLmdhdGhlck5EYCwgYGluZGljZXNgIGRlZmluZXMgc2xpY2VzIGludG8gdGhlIGZpcnN0IE4gZGltZW5zaW9uc1xuICogb2YgaW5wdXQsIHdoZXJlIE4gPSBpbmRpY2VzLnNoYXBlWy0xXS5cbiAqXG4gKiBUaGUgbGFzdCBkaW1lbnNpb24gb2YgaW5kaWNlcyBjYW4gYmUgYXQgbW9zdCB0aGUgcmFuayBvZiBpbnB1dDpcbiAqIGluZGljZXMuc2hhcGVbLTFdIDw9IGlucHV0LnJhbmtcbiAqXG4gKiBUaGUgbGFzdCBkaW1lbnNpb24gb2YgYGluZGljZXNgIGNvcnJlc3BvbmRzIHRvIGVsZW1lbnRzXG4gKiAoaWYgaW5kaWNlcy5zaGFwZVstMV0gPT0gaW5wdXQucmFuaykgb3Igc2xpY2VzXG4gKiAoaWYgaW5kaWNlcy5zaGFwZVstMV0gPCBpbnB1dC5yYW5rKSBhbG9uZyBkaW1lbnNpb24gaW5kaWNlcy5zaGFwZVstMV0gb2ZcbiAqIGlucHV0LlxuICogVGhlIG91dHB1dCB0ZW5zb3IgaGFzIHNoYXBlXG4gKiBpbmRpY2VzLnNoYXBlWzotMV0gKyBpbnB1dC5zaGFwZVtpbmRpY2VzLnNoYXBlWy0xXTpdXG4gKlxuICogTm90ZSB0aGF0IG9uIENQVSwgaWYgYW4gb3V0IG9mIGJvdW5kIGluZGV4IGlzIGZvdW5kLCBhbiBlcnJvciBpcyByZXR1cm5lZC4gT25cbiAqIEdQVSwgaWYgYW4gb3V0IG9mIGJvdW5kIGluZGV4IGlzIGZvdW5kLCBhIDAgaXMgc3RvcmVkIGluIHRoZSBjb3JyZXNwb25kaW5nXG4gKiBvdXRwdXQgdmFsdWUuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGluZGljZXMgPSB0Zi50ZW5zb3IyZChbMCwgMSwgMSwgMF0sIFsyLDJdLCAnaW50MzInKTtcbiAqIGNvbnN0IGlucHV0ID0gdGYudGVuc29yMmQoWzksIDEwLCAxMSwgMTJdLCBbMiwgMl0pO1xuICogdGYuZ2F0aGVyTkQoaW5wdXQsIGluZGljZXMpLnByaW50KCkgLy8gWzEwLCAxMV1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSB0ZW5zb3IgZnJvbSB3aGljaCB0byBnYXRoZXIgdmFsdWVzLlxuICogQHBhcmFtIGluZGljZXMgSW5kZXggdGVuc29yLCBtdXN0IGJlIG9mIHR5cGUgaW50MzIuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU2xpY2luZyBhbmQgSm9pbmluZyd9XG4gKi9cbmZ1bmN0aW9uIGdhdGhlck5EXyh4LCBpbmRpY2VzKSB7XG4gICAgY29uc3QgJGluZGljZXMgPSBjb252ZXJ0VG9UZW5zb3IoaW5kaWNlcywgJ2luZGljZXMnLCAnZ2F0aGVyTkQnLCAnaW50MzInKTtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdnYXRoZXJORCcsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgcGFyYW1zOiAkeCwgaW5kaWNlczogJGluZGljZXMgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChHYXRoZXJOZCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBnYXRoZXJORCA9IG9wKHsgZ2F0aGVyTkRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2F0aGVyX25kLmpzLm1hcCIsImltcG9ydCB7IGNvbXB1dGVTdHJpZGVzLCBzaXplRnJvbVNoYXBlIH0gZnJvbSAnLi4vdXRpbCc7XG4vKipcbiAqIFZhbGlkYXRlIGdhdGhlciBuZCBpbnB1dHMuXG4gKlxuICogQHBhcmFtIHRlbnNvciBUaGUgdGVuc29yIGNvbnRhaW5zIHRoZSBzb3VyY2UgdmFsdWVzLlxuICogQHBhcmFtIGluZGljZXMgVGhlIHRlbnNvciBjb250YWlucyB0aGUgaW5kaWNlcyB0byBzbGljZSB0aGUgc291cmNlLlxuICpcbiAqIEByZXR1cm5zIFtyZXN1bHRTaGFwZSwgbnVtVXBkYXRlcywgc2xpY2VTaXplLCBzdHJpZGVzXVxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZUFuZFZhbGlkYXRlKHRlbnNvciwgaW5kaWNlcykge1xuICAgIGNvbnN0IHRlbnNvclJhbmsgPSB0ZW5zb3Iuc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IGluZGljZXNSYW5rID0gaW5kaWNlcy5zaGFwZS5sZW5ndGg7XG4gICAgaWYgKHRlbnNvclJhbmsgPCAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGYuZ2F0aGVyTkQoKSBleHBlY3RzIHRoZSBpbnB1dCB0byBiZSByYW5rIDEgb3IgaGlnaGVyLCcgK1xuICAgICAgICAgICAgYCBidXQgdGhlIHJhbmsgd2FzICR7dGVuc29yUmFua30uYCk7XG4gICAgfVxuICAgIGlmIChpbmRpY2VzUmFuayA8IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0Zi5nYXRoZXJORCgpIGV4cGVjdHMgdGhlIGluZGljZXMgdG8gYmUgcmFuayAxIG9yIGhpZ2hlciwnICtcbiAgICAgICAgICAgIGAgYnV0IHRoZSByYW5rIHdhcyAke2luZGljZXNSYW5rfS5gKTtcbiAgICB9XG4gICAgaWYgKGluZGljZXMuZHR5cGUgIT09ICdpbnQzMicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0Zi5nYXRoZXJORCgpIGV4cGVjdHMgdGhlIGluZGljZXMgdG8gYmUgaW50MzIgdHlwZSwnICtcbiAgICAgICAgICAgIGAgYnV0IHRoZSBkdHlwZSB3YXMgJHtpbmRpY2VzLmR0eXBlfS5gKTtcbiAgICB9XG4gICAgaWYgKGluZGljZXMuc2hhcGVbaW5kaWNlc1JhbmsgLSAxXSA+IHRlbnNvclJhbmspIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbmRleCBpbm5lcm1vc3QgZGltZW5zaW9uIGxlbmd0aCBtdXN0IGJlIDw9IHRlbnNvciByYW5rOyBzYXc6ICcgK1xuICAgICAgICAgICAgYCR7aW5kaWNlcy5zaGFwZVtpbmRpY2VzUmFuayAtIDFdfSB2cy4gJHt0ZW5zb3JSYW5rfWApO1xuICAgIH1cbiAgICBpZiAoc2l6ZUZyb21TaGFwZSh0ZW5zb3Iuc2hhcGUpID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWVzdGVkIG1vcmUgdGhhbiAwIGVudHJpZXMsIGJ1dCBpbnB1dCBpcyBlbXB0eS4nICtcbiAgICAgICAgICAgIGAgSW5wdXQgc2hhcGU6ICR7dGVuc29yLnNoYXBlfS5gKTtcbiAgICB9XG4gICAgY29uc3QgaW5kaWNlc1NoYXBlID0gaW5kaWNlcy5zaGFwZTtcbiAgICBjb25zdCBzbGljZVJhbmsgPSBpbmRpY2VzU2hhcGVbaW5kaWNlc1NoYXBlLmxlbmd0aCAtIDFdO1xuICAgIC8vIFRoZSByZXN1bHQgc2hhcGUgaXNcbiAgICAvLyAgIGluZGljZXMuc2hhcGVbOi0xXSArIHBhcmFtcy5zaGFwZVtpbmRpY2VzLnNoYXBlWy0xXTpdXG4gICAgbGV0IG5SZXN1bHQgPSAxO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kaWNlc1NoYXBlLmxlbmd0aCAtIDE7ICsraSkge1xuICAgICAgICBuUmVzdWx0ICo9IGluZGljZXNTaGFwZVtpXTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRTaGFwZSA9IHRlbnNvci5zaGFwZTtcbiAgICBjb25zdCByZXN1bHRTaGFwZSA9IGluZGljZXNTaGFwZS5zbGljZSgpO1xuICAgIHJlc3VsdFNoYXBlLnBvcCgpO1xuICAgIGxldCBzbGljZVNpemUgPSAxO1xuICAgIGZvciAobGV0IGkgPSBzbGljZVJhbms7IGkgPCB0ZW5zb3JSYW5rOyArK2kpIHtcbiAgICAgICAgc2xpY2VTaXplICo9IGlucHV0U2hhcGVbaV07XG4gICAgICAgIHJlc3VsdFNoYXBlLnB1c2goaW5wdXRTaGFwZVtpXSk7XG4gICAgfVxuICAgIGNvbnN0IHN0cmlkZXMgPSBbLi4uY29tcHV0ZVN0cmlkZXModGVuc29yLnNoYXBlKS5tYXAoc3RyaWRlID0+IHN0cmlkZSAvIHNsaWNlU2l6ZSksXG4gICAgICAgIDFdLnNsaWNlKDAsIHNsaWNlUmFuayk7XG4gICAgcmV0dXJuIFtyZXN1bHRTaGFwZSwgblJlc3VsdCwgc2xpY2VTaXplLCBzdHJpZGVzXTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdhdGhlcl9uZF91dGlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBHcmVhdGVyIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IG1ha2VUeXBlc01hdGNoIH0gZnJvbSAnLi4vdGVuc29yX3V0aWwnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlIH0gZnJvbSAnLi9icm9hZGNhc3RfdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV0dXJucyB0aGUgdHJ1dGggdmFsdWUgb2YgKGEgPiBiKSBlbGVtZW50LXdpc2UuIFN1cHBvcnRzIGJyb2FkY2FzdGluZy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzIsIDIsIDJdKTtcbiAqXG4gKiBhLmdyZWF0ZXIoYikucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBpbnB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIGlucHV0IHRlbnNvci4gTXVzdCBoYXZlIHRoZSBzYW1lIGR0eXBlIGFzIGBhYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdMb2dpY2FsJ31cbiAqL1xuZnVuY3Rpb24gZ3JlYXRlcl8oYSwgYikge1xuICAgIGxldCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdncmVhdGVyJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG4gICAgbGV0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ2dyZWF0ZXInLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgICBbJGEsICRiXSA9IG1ha2VUeXBlc01hdGNoKCRhLCAkYik7XG4gICAgYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoJGEuc2hhcGUsICRiLnNoYXBlKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGE6ICRhLCBiOiAkYiB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEdyZWF0ZXIsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgZ3JlYXRlciA9IG9wKHsgZ3JlYXRlcl8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ncmVhdGVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBHcmVhdGVyRXF1YWwgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgbWFrZVR5cGVzTWF0Y2ggfSBmcm9tICcuLi90ZW5zb3JfdXRpbCc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUgfSBmcm9tICcuL2Jyb2FkY2FzdF91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSB0cnV0aCB2YWx1ZSBvZiAoYSA+PSBiKSBlbGVtZW50LXdpc2UuIFN1cHBvcnRzIGJyb2FkY2FzdGluZy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzIsIDIsIDJdKTtcbiAqXG4gKiBhLmdyZWF0ZXJFcXVhbChiKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGEgVGhlIGZpcnN0IGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgaW5wdXQgdGVuc29yLiBNdXN0IGhhdmUgdGhlIHNhbWUgZHR5cGUgYXMgYGFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0xvZ2ljYWwnfVxuICovXG5mdW5jdGlvbiBncmVhdGVyRXF1YWxfKGEsIGIpIHtcbiAgICBsZXQgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnZ3JlYXRlckVxdWFsJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG4gICAgbGV0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ2dyZWF0ZXJFcXVhbCcsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICAgIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcbiAgICBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSgkYS5zaGFwZSwgJGIuc2hhcGUpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgYTogJGEsIGI6ICRiIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoR3JlYXRlckVxdWFsLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGdyZWF0ZXJFcXVhbCA9IG9wKHsgZ3JlYXRlckVxdWFsXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdyZWF0ZXJfZXF1YWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEltYWcgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbWFnaW5hcnkgcGFydCBvZiBhIGNvbXBsZXggKG9yIHJlYWwpIHRlbnNvci5cbiAqXG4gKiBHaXZlbiBhIHRlbnNvciBpbnB1dCwgdGhpcyBvcGVyYXRpb24gcmV0dXJucyBhIHRlbnNvciBvZiB0eXBlIGZsb2F0IHRoYXQgaXNcbiAqIHRoZSBpbWFnaW5hcnkgcGFydCBvZiBlYWNoIGVsZW1lbnQgaW4gaW5wdXQgY29uc2lkZXJlZCBhcyBhIGNvbXBsZXggbnVtYmVyLlxuICogSWYgaW5wdXQgaXMgcmVhbCwgYSB0ZW5zb3Igb2YgYWxsIHplcm9zIGlzIHJldHVybmVkLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYuY29tcGxleChbLTIuMjUsIDMuMjVdLCBbNC43NSwgNS43NV0pO1xuICogdGYuaW1hZyh4KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5mdW5jdGlvbiBpbWFnXyhpbnB1dCkge1xuICAgIGNvbnN0ICRpbnB1dCA9IGNvbnZlcnRUb1RlbnNvcihpbnB1dCwgJ2lucHV0JywgJ2ltYWcnKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGlucHV0OiAkaW5wdXQgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChJbWFnLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGltYWcgPSBvcCh7IGltYWdfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW1hZy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgQ3JvcEFuZFJlc2l6ZSB9IGZyb20gJy4uLy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbi8qKlxuICogRXh0cmFjdHMgY3JvcHMgZnJvbSB0aGUgaW5wdXQgaW1hZ2UgdGVuc29yIGFuZCByZXNpemVzIHRoZW0gdXNpbmcgYmlsaW5lYXJcbiAqIHNhbXBsaW5nIG9yIG5lYXJlc3QgbmVpZ2hib3Igc2FtcGxpbmcgKHBvc3NpYmx5IHdpdGggYXNwZWN0IHJhdGlvIGNoYW5nZSlcbiAqIHRvIGEgY29tbW9uIG91dHB1dCBzaXplIHNwZWNpZmllZCBieSBjcm9wU2l6ZS5cbiAqXG4gKiBAcGFyYW0gaW1hZ2UgNGQgdGVuc29yIG9mIHNoYXBlIGBbYmF0Y2gsaW1hZ2VIZWlnaHQsaW1hZ2VXaWR0aCwgZGVwdGhdYCxcbiAqICAgICB3aGVyZSBpbWFnZUhlaWdodCBhbmQgaW1hZ2VXaWR0aCBtdXN0IGJlIHBvc2l0aXZlLCBzcGVjaWZ5aW5nIHRoZVxuICogICAgIGJhdGNoIG9mIGltYWdlcyBmcm9tIHdoaWNoIHRvIHRha2UgY3JvcHNcbiAqIEBwYXJhbSBib3hlcyAyZCBmbG9hdDMyIHRlbnNvciBvZiBzaGFwZSBgW251bUJveGVzLCA0XWAuIEVhY2ggZW50cnkgaXNcbiAqICAgICBgW3kxLCB4MSwgeTIsIHgyXWAsIHdoZXJlIGAoeTEsIHgxKWAgYW5kIGAoeTIsIHgyKWAgYXJlIHRoZSBub3JtYWxpemVkXG4gKiAgICAgY29vcmRpbmF0ZXMgb2YgdGhlIGJveCBpbiB0aGUgYm94SW5kW2ldJ3RoIGltYWdlIGluIHRoZSBiYXRjaFxuICogQHBhcmFtIGJveEluZCAxZCBpbnQzMiB0ZW5zb3Igb2Ygc2hhcGUgYFtudW1Cb3hlc11gIHdpdGggdmFsdWVzIGluIHJhbmdlXG4gKiAgICAgYFswLCBiYXRjaClgIHRoYXQgc3BlY2lmaWVzIHRoZSBpbWFnZSB0aGF0IHRoZSBgaWAtdGggYm94IHJlZmVycyB0by5cbiAqIEBwYXJhbSBjcm9wU2l6ZSAxZCBpbnQzMiB0ZW5zb3Igb2YgMiBlbGVtZW50cyBgW2Nyb3BIZWlnaCwgY3JvcFdpZHRoXWBcbiAqICAgICBzcGVjaWZ5aW5nIHRoZSBzaXplIHRvIHdoaWNoIGFsbCBjcm9wcyBhcmUgcmVzaXplZCB0by5cbiAqIEBwYXJhbSBtZXRob2QgT3B0aW9uYWwgc3RyaW5nIGZyb20gYCdiaWxpbmVhcicgfCAnbmVhcmVzdCdgLFxuICogICAgIGRlZmF1bHRzIHRvIGJpbGluZWFyLCB3aGljaCBzcGVjaWZpZXMgdGhlIHNhbXBsaW5nIG1ldGhvZCBmb3IgcmVzaXppbmdcbiAqIEBwYXJhbSBleHRyYXBvbGF0aW9uVmFsdWUgQSB0aHJlc2hvbGQgZm9yIGRlY2lkaW5nIHdoZW4gdG8gcmVtb3ZlIGJveGVzIGJhc2VkXG4gKiAgICAgb24gc2NvcmUuIERlZmF1bHRzIHRvIDAuXG4gKiBAcmV0dXJuIEEgNEQgdGVuc29yIG9mIHRoZSBzaGFwZSBgW251bUJveGVzLGNyb3BIZWlnaHQsY3JvcFdpZHRoLGRlcHRoXWBcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdJbWFnZXMnLCBuYW1lc3BhY2U6ICdpbWFnZSd9XG4gKi9cbmZ1bmN0aW9uIGNyb3BBbmRSZXNpemVfKGltYWdlLCBib3hlcywgYm94SW5kLCBjcm9wU2l6ZSwgbWV0aG9kID0gJ2JpbGluZWFyJywgZXh0cmFwb2xhdGlvblZhbHVlID0gMCkge1xuICAgIGNvbnN0ICRpbWFnZSA9IGNvbnZlcnRUb1RlbnNvcihpbWFnZSwgJ2ltYWdlJywgJ2Nyb3BBbmRSZXNpemUnKTtcbiAgICBjb25zdCAkYm94ZXMgPSBjb252ZXJ0VG9UZW5zb3IoYm94ZXMsICdib3hlcycsICdjcm9wQW5kUmVzaXplJywgJ2Zsb2F0MzInKTtcbiAgICBjb25zdCAkYm94SW5kID0gY29udmVydFRvVGVuc29yKGJveEluZCwgJ2JveEluZCcsICdjcm9wQW5kUmVzaXplJywgJ2ludDMyJyk7XG4gICAgY29uc3QgbnVtQm94ZXMgPSAkYm94ZXMuc2hhcGVbMF07XG4gICAgdXRpbC5hc3NlcnQoJGltYWdlLnJhbmsgPT09IDQsICgpID0+ICdFcnJvciBpbiBjcm9wQW5kUmVzaXplOiBpbWFnZSBtdXN0IGJlIHJhbmsgNCwnICtcbiAgICAgICAgYGJ1dCBnb3QgcmFuayAkeyRpbWFnZS5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydCgkYm94ZXMucmFuayA9PT0gMiAmJiAkYm94ZXMuc2hhcGVbMV0gPT09IDQsICgpID0+IGBFcnJvciBpbiBjcm9wQW5kUmVzaXplOiBib3hlcyBtdXN0IGJlIGhhdmUgc2l6ZSBbJHtudW1Cb3hlc30sNF0gYCArXG4gICAgICAgIGBidXQgaGFkIHNoYXBlICR7JGJveGVzLnNoYXBlfS5gKTtcbiAgICB1dGlsLmFzc2VydCgkYm94SW5kLnJhbmsgPT09IDEgJiYgJGJveEluZC5zaGFwZVswXSA9PT0gbnVtQm94ZXMsICgpID0+IGBFcnJvciBpbiBjcm9wQW5kUmVzaXplOiBib3hJbmQgbXVzdCBiZSBoYXZlIHNpemUgWyR7bnVtQm94ZXN9XSBgICtcbiAgICAgICAgYGJ1dCBoYWQgc2hhcGUgJHskYm94ZXMuc2hhcGV9LmApO1xuICAgIHV0aWwuYXNzZXJ0KGNyb3BTaXplLmxlbmd0aCA9PT0gMiwgKCkgPT4gYEVycm9yIGluIGNyb3BBbmRSZXNpemU6IGNyb3BTaXplIG11c3QgYmUgb2YgbGVuZ3RoIDIsIGJ1dCBnb3QgYCArXG4gICAgICAgIGBsZW5ndGggJHtjcm9wU2l6ZS5sZW5ndGh9LmApO1xuICAgIHV0aWwuYXNzZXJ0KGNyb3BTaXplWzBdID49IDEgJiYgY3JvcFNpemVbMV0gPj0gMSwgKCkgPT4gYGNyb3BTaXplIG11c3QgYmUgYXRsZWFzdCBbMSwxXSwgYnV0IHdhcyAke2Nyb3BTaXplfWApO1xuICAgIHV0aWwuYXNzZXJ0KG1ldGhvZCA9PT0gJ2JpbGluZWFyJyB8fCBtZXRob2QgPT09ICduZWFyZXN0JywgKCkgPT4gYG1ldGhvZCBtdXN0IGJlIGJpbGluZWFyIG9yIG5lYXJlc3QsIGJ1dCB3YXMgJHttZXRob2R9YCk7XG4gICAgY29uc3QgaW5wdXRzID0geyBpbWFnZTogJGltYWdlLCBib3hlczogJGJveGVzLCBib3hJbmQ6ICRib3hJbmQgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgbWV0aG9kLCBleHRyYXBvbGF0aW9uVmFsdWUsIGNyb3BTaXplIH07XG4gICAgY29uc3QgcmVzID0gRU5HSU5FLnJ1bktlcm5lbChDcm9wQW5kUmVzaXplLCBpbnB1dHMsIGF0dHJzKTtcbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IGNyb3BBbmRSZXNpemUgPSBvcCh7IGNyb3BBbmRSZXNpemVfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y3JvcF9hbmRfcmVzaXplLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBGbGlwTGVmdFJpZ2h0IH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBGbGlwcyB0aGUgaW1hZ2UgbGVmdCB0byByaWdodC4gQ3VycmVudGx5IGF2YWlsYWJsZSBpbiB0aGUgQ1BVLCBXZWJHTCwgYW5kXG4gKiBXQVNNIGJhY2tlbmRzLlxuICpcbiAqIEBwYXJhbSBpbWFnZSA0ZCB0ZW5zb3Igb2Ygc2hhcGUgYFtiYXRjaCwgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIGRlcHRoXWAuXG4gKi9cbi8qKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdJbWFnZXMnLCBuYW1lc3BhY2U6ICdpbWFnZSd9ICovXG5mdW5jdGlvbiBmbGlwTGVmdFJpZ2h0XyhpbWFnZSkge1xuICAgIGNvbnN0ICRpbWFnZSA9IGNvbnZlcnRUb1RlbnNvcihpbWFnZSwgJ2ltYWdlJywgJ2ZsaXBMZWZ0UmlnaHQnLCAnZmxvYXQzMicpO1xuICAgIHV0aWwuYXNzZXJ0KCRpbWFnZS5yYW5rID09PSA0LCAoKSA9PiAnRXJyb3IgaW4gZmxpcExlZnRSaWdodDogaW1hZ2UgbXVzdCBiZSByYW5rIDQsJyArXG4gICAgICAgIGBidXQgZ290IHJhbmsgJHskaW1hZ2UucmFua30uYCk7XG4gICAgY29uc3QgaW5wdXRzID0geyBpbWFnZTogJGltYWdlIH07XG4gICAgY29uc3QgcmVzID0gRU5HSU5FLnJ1bktlcm5lbChGbGlwTGVmdFJpZ2h0LCBpbnB1dHMsIHt9KTtcbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IGZsaXBMZWZ0UmlnaHQgPSBvcCh7IGZsaXBMZWZ0UmlnaHRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmxpcF9sZWZ0X3JpZ2h0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBOb25NYXhTdXBwcmVzc2lvblYzIH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBub25NYXhTdXBwU2FuaXR5Q2hlY2sgfSBmcm9tICcuLi9ub25tYXhfdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4uL29wZXJhdGlvbic7XG4vKipcbiAqIFBlcmZvcm1zIG5vbiBtYXhpbXVtIHN1cHByZXNzaW9uIG9mIGJvdW5kaW5nIGJveGVzIGJhc2VkIG9uXG4gKiBpb3UgKGludGVyc2VjdGlvbiBvdmVyIHVuaW9uKS5cbiAqXG4gKiBAcGFyYW0gYm94ZXMgYSAyZCB0ZW5zb3Igb2Ygc2hhcGUgYFtudW1Cb3hlcywgNF1gLiBFYWNoIGVudHJ5IGlzXG4gKiAgICAgYFt5MSwgeDEsIHkyLCB4Ml1gLCB3aGVyZSBgKHkxLCB4MSlgIGFuZCBgKHkyLCB4MilgIGFyZSB0aGUgY29ybmVycyBvZlxuICogICAgIHRoZSBib3VuZGluZyBib3guXG4gKiBAcGFyYW0gc2NvcmVzIGEgMWQgdGVuc29yIHByb3ZpZGluZyB0aGUgYm94IHNjb3JlcyBvZiBzaGFwZSBgW251bUJveGVzXWAuXG4gKiBAcGFyYW0gbWF4T3V0cHV0U2l6ZSBUaGUgbWF4aW11bSBudW1iZXIgb2YgYm94ZXMgdG8gYmUgc2VsZWN0ZWQuXG4gKiBAcGFyYW0gaW91VGhyZXNob2xkIEEgZmxvYXQgcmVwcmVzZW50aW5nIHRoZSB0aHJlc2hvbGQgZm9yIGRlY2lkaW5nIHdoZXRoZXJcbiAqICAgICBib3hlcyBvdmVybGFwIHRvbyBtdWNoIHdpdGggcmVzcGVjdCB0byBJT1UuIE11c3QgYmUgYmV0d2VlbiBbMCwgMV0uXG4gKiAgICAgRGVmYXVsdHMgdG8gMC41ICg1MCUgYm94IG92ZXJsYXApLlxuICogQHBhcmFtIHNjb3JlVGhyZXNob2xkIEEgdGhyZXNob2xkIGZvciBkZWNpZGluZyB3aGVuIHRvIHJlbW92ZSBib3hlcyBiYXNlZFxuICogICAgIG9uIHNjb3JlLiBEZWZhdWx0cyB0byAtaW5mLCB3aGljaCBtZWFucyBhbnkgc2NvcmUgaXMgYWNjZXB0ZWQuXG4gKiBAcmV0dXJuIEEgMUQgdGVuc29yIHdpdGggdGhlIHNlbGVjdGVkIGJveCBpbmRpY2VzLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0ltYWdlcycsIG5hbWVzcGFjZTogJ2ltYWdlJ31cbiAqL1xuZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25fKGJveGVzLCBzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCA9IDAuNSwgc2NvcmVUaHJlc2hvbGQgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpIHtcbiAgICBjb25zdCAkYm94ZXMgPSBjb252ZXJ0VG9UZW5zb3IoYm94ZXMsICdib3hlcycsICdub25NYXhTdXBwcmVzc2lvbicpO1xuICAgIGNvbnN0ICRzY29yZXMgPSBjb252ZXJ0VG9UZW5zb3Ioc2NvcmVzLCAnc2NvcmVzJywgJ25vbk1heFN1cHByZXNzaW9uJyk7XG4gICAgY29uc3QgaW5wdXRzID0gbm9uTWF4U3VwcFNhbml0eUNoZWNrKCRib3hlcywgJHNjb3JlcywgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCk7XG4gICAgbWF4T3V0cHV0U2l6ZSA9IGlucHV0cy5tYXhPdXRwdXRTaXplO1xuICAgIGlvdVRocmVzaG9sZCA9IGlucHV0cy5pb3VUaHJlc2hvbGQ7XG4gICAgc2NvcmVUaHJlc2hvbGQgPSBpbnB1dHMuc2NvcmVUaHJlc2hvbGQ7XG4gICAgY29uc3QgYXR0cnMgPSB7IG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChOb25NYXhTdXBwcmVzc2lvblYzLCB7IGJveGVzOiAkYm94ZXMsIHNjb3JlczogJHNjb3JlcyB9LCBhdHRycyk7XG59XG5leHBvcnQgY29uc3Qgbm9uTWF4U3VwcHJlc3Npb24gPSBvcCh7IG5vbk1heFN1cHByZXNzaW9uXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW5vbl9tYXhfc3VwcHJlc3Npb24uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgbm9uTWF4U3VwcHJlc3Npb25WM0ltcGwgfSBmcm9tICcuLi8uLi9iYWNrZW5kcy9ub25fbWF4X3N1cHByZXNzaW9uX2ltcGwnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG5vbk1heFN1cHBTYW5pdHlDaGVjayB9IGZyb20gJy4uL25vbm1heF91dGlsJztcbmltcG9ydCB7IHRlbnNvcjFkIH0gZnJvbSAnLi4vdGVuc29yMWQnO1xuLyoqXG4gKiBQZXJmb3JtcyBub24gbWF4aW11bSBzdXBwcmVzc2lvbiBvZiBib3VuZGluZyBib3hlcyBiYXNlZCBvblxuICogaW91IChpbnRlcnNlY3Rpb24gb3ZlciB1bmlvbikuXG4gKlxuICogVGhpcyBpcyB0aGUgYXN5bmMgdmVyc2lvbiBvZiBgbm9uTWF4U3VwcHJlc3Npb25gXG4gKlxuICogQHBhcmFtIGJveGVzIGEgMmQgdGVuc29yIG9mIHNoYXBlIGBbbnVtQm94ZXMsIDRdYC4gRWFjaCBlbnRyeSBpc1xuICogICAgIGBbeTEsIHgxLCB5MiwgeDJdYCwgd2hlcmUgYCh5MSwgeDEpYCBhbmQgYCh5MiwgeDIpYCBhcmUgdGhlIGNvcm5lcnMgb2ZcbiAqICAgICB0aGUgYm91bmRpbmcgYm94LlxuICogQHBhcmFtIHNjb3JlcyBhIDFkIHRlbnNvciBwcm92aWRpbmcgdGhlIGJveCBzY29yZXMgb2Ygc2hhcGUgYFtudW1Cb3hlc11gLlxuICogQHBhcmFtIG1heE91dHB1dFNpemUgVGhlIG1heGltdW0gbnVtYmVyIG9mIGJveGVzIHRvIGJlIHNlbGVjdGVkLlxuICogQHBhcmFtIGlvdVRocmVzaG9sZCBBIGZsb2F0IHJlcHJlc2VudGluZyB0aGUgdGhyZXNob2xkIGZvciBkZWNpZGluZyB3aGV0aGVyXG4gKiAgICAgYm94ZXMgb3ZlcmxhcCB0b28gbXVjaCB3aXRoIHJlc3BlY3QgdG8gSU9VLiBNdXN0IGJlIGJldHdlZW4gWzAsIDFdLlxuICogICAgIERlZmF1bHRzIHRvIDAuNSAoNTAlIGJveCBvdmVybGFwKS5cbiAqIEBwYXJhbSBzY29yZVRocmVzaG9sZCBBIHRocmVzaG9sZCBmb3IgZGVjaWRpbmcgd2hlbiB0byByZW1vdmUgYm94ZXMgYmFzZWRcbiAqICAgICBvbiBzY29yZS4gRGVmYXVsdHMgdG8gLWluZiwgd2hpY2ggbWVhbnMgYW55IHNjb3JlIGlzIGFjY2VwdGVkLlxuICogQHJldHVybiBBIDFEIHRlbnNvciB3aXRoIHRoZSBzZWxlY3RlZCBib3ggaW5kaWNlcy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdJbWFnZXMnLCBuYW1lc3BhY2U6ICdpbWFnZSd9XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG5vbk1heFN1cHByZXNzaW9uQXN5bmNfKGJveGVzLCBzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCA9IDAuNSwgc2NvcmVUaHJlc2hvbGQgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpIHtcbiAgICBjb25zdCAkYm94ZXMgPSBjb252ZXJ0VG9UZW5zb3IoYm94ZXMsICdib3hlcycsICdub25NYXhTdXBwcmVzc2lvbkFzeW5jJyk7XG4gICAgY29uc3QgJHNjb3JlcyA9IGNvbnZlcnRUb1RlbnNvcihzY29yZXMsICdzY29yZXMnLCAnbm9uTWF4U3VwcHJlc3Npb25Bc3luYycpO1xuICAgIGNvbnN0IGlucHV0cyA9IG5vbk1heFN1cHBTYW5pdHlDaGVjaygkYm94ZXMsICRzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQpO1xuICAgIG1heE91dHB1dFNpemUgPSBpbnB1dHMubWF4T3V0cHV0U2l6ZTtcbiAgICBpb3VUaHJlc2hvbGQgPSBpbnB1dHMuaW91VGhyZXNob2xkO1xuICAgIHNjb3JlVGhyZXNob2xkID0gaW5wdXRzLnNjb3JlVGhyZXNob2xkO1xuICAgIGNvbnN0IGJveGVzQW5kU2NvcmVzID0gYXdhaXQgUHJvbWlzZS5hbGwoWyRib3hlcy5kYXRhKCksICRzY29yZXMuZGF0YSgpXSk7XG4gICAgY29uc3QgYm94ZXNWYWxzID0gYm94ZXNBbmRTY29yZXNbMF07XG4gICAgY29uc3Qgc2NvcmVzVmFscyA9IGJveGVzQW5kU2NvcmVzWzFdO1xuICAgIC8vIFdlIGNhbGwgYSBjcHUgYmFzZWQgaW1wbCBkaXJlY3RseSB3aXRoIHRoZSB0eXBlZGFycmF5IGRhdGEgIGhlcmUgcmF0aGVyXG4gICAgLy8gdGhhbiBhIGtlcm5lbCBiZWNhdXNlIGFsbCBrZXJuZWxzIGFyZSBzeW5jaHJvbm91cyAoYW5kIHRodXMgY2Fubm90IGF3YWl0XG4gICAgLy8gLmRhdGEoKSkuXG4gICAgY29uc3QgeyBzZWxlY3RlZEluZGljZXMgfSA9IG5vbk1heFN1cHByZXNzaW9uVjNJbXBsKGJveGVzVmFscywgc2NvcmVzVmFscywgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCk7XG4gICAgaWYgKCRib3hlcyAhPT0gYm94ZXMpIHtcbiAgICAgICAgJGJveGVzLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgaWYgKCRzY29yZXMgIT09IHNjb3Jlcykge1xuICAgICAgICAkc2NvcmVzLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRlbnNvcjFkKHNlbGVjdGVkSW5kaWNlcywgJ2ludDMyJyk7XG59XG5leHBvcnQgY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25Bc3luYyA9IG5vbk1heFN1cHByZXNzaW9uQXN5bmNfO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bm9uX21heF9zdXBwcmVzc2lvbl9hc3luYy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgTm9uTWF4U3VwcHJlc3Npb25WNCB9IGZyb20gJy4uLy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgbm9uTWF4U3VwcFNhbml0eUNoZWNrIH0gZnJvbSAnLi4vbm9ubWF4X3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBBc3luY2hyb25vdXNseSBwZXJmb3JtcyBub24gbWF4aW11bSBzdXBwcmVzc2lvbiBvZiBib3VuZGluZyBib3hlcyBiYXNlZCBvblxuICogaW91IChpbnRlcnNlY3Rpb24gb3ZlciB1bmlvbiksIHdpdGggYW4gb3B0aW9uIHRvIHBhZCByZXN1bHRzLlxuICpcbiAqIEBwYXJhbSBib3hlcyBhIDJkIHRlbnNvciBvZiBzaGFwZSBgW251bUJveGVzLCA0XWAuIEVhY2ggZW50cnkgaXNcbiAqICAgICBgW3kxLCB4MSwgeTIsIHgyXWAsIHdoZXJlIGAoeTEsIHgxKWAgYW5kIGAoeTIsIHgyKWAgYXJlIHRoZSBjb3JuZXJzIG9mXG4gKiAgICAgdGhlIGJvdW5kaW5nIGJveC5cbiAqIEBwYXJhbSBzY29yZXMgYSAxZCB0ZW5zb3IgcHJvdmlkaW5nIHRoZSBib3ggc2NvcmVzIG9mIHNoYXBlIGBbbnVtQm94ZXNdYC5cbiAqIEBwYXJhbSBtYXhPdXRwdXRTaXplIFRoZSBtYXhpbXVtIG51bWJlciBvZiBib3hlcyB0byBiZSBzZWxlY3RlZC5cbiAqIEBwYXJhbSBpb3VUaHJlc2hvbGQgQSBmbG9hdCByZXByZXNlbnRpbmcgdGhlIHRocmVzaG9sZCBmb3IgZGVjaWRpbmcgd2hldGhlclxuICogICAgIGJveGVzIG92ZXJsYXAgdG9vIG11Y2ggd2l0aCByZXNwZWN0IHRvIElPVS4gTXVzdCBiZSBiZXR3ZWVuIFswLCAxXS5cbiAqICAgICBEZWZhdWx0cyB0byAwLjUgKDUwJSBib3ggb3ZlcmxhcCkuXG4gKiBAcGFyYW0gc2NvcmVUaHJlc2hvbGQgQSB0aHJlc2hvbGQgZm9yIGRlY2lkaW5nIHdoZW4gdG8gcmVtb3ZlIGJveGVzIGJhc2VkXG4gKiAgICAgb24gc2NvcmUuIERlZmF1bHRzIHRvIC1pbmYsIHdoaWNoIG1lYW5zIGFueSBzY29yZSBpcyBhY2NlcHRlZC5cbiAqIEBwYXJhbSBwYWRUb01heE91dHB1dFNpemUgRGVmYWx0cyB0byBmYWxzZS4gSWYgdHJ1ZSwgc2l6ZSBvZiBvdXRwdXRcbiAqICAgICBgc2VsZWN0ZWRJbmRpY2VzYCBpcyBwYWRkZWQgdG8gbWF4T3V0cHV0U2l6ZS5cbiAqIEByZXR1cm4gQSBtYXAgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAgICAgLSBzZWxlY3RlZEluZGljZXM6IEEgMUQgdGVuc29yIHdpdGggdGhlIHNlbGVjdGVkIGJveCBpbmRpY2VzLlxuICogICAgIC0gdmFsaWRPdXRwdXRzOiBBIHNjYWxhciBkZW5vdGluZyBob3cgbWFueSBlbGVtZW50cyBpbiBgc2VsZWN0ZWRJbmRpY2VzYFxuICogICAgICAgYXJlIHZhbGlkLiBWYWxpZCBlbGVtZW50cyBvY2N1ciBmaXJzdCwgdGhlbiBwYWRkaW5nLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0ltYWdlcycsIG5hbWVzcGFjZTogJ2ltYWdlJ31cbiAqL1xuZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25QYWRkZWRfKGJveGVzLCBzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCA9IDAuNSwgc2NvcmVUaHJlc2hvbGQgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksIHBhZFRvTWF4T3V0cHV0U2l6ZSA9IGZhbHNlKSB7XG4gICAgY29uc3QgJGJveGVzID0gY29udmVydFRvVGVuc29yKGJveGVzLCAnYm94ZXMnLCAnbm9uTWF4U3VwcHJlc3Npb24nKTtcbiAgICBjb25zdCAkc2NvcmVzID0gY29udmVydFRvVGVuc29yKHNjb3JlcywgJ3Njb3JlcycsICdub25NYXhTdXBwcmVzc2lvbicpO1xuICAgIGNvbnN0IHBhcmFtcyA9IG5vbk1heFN1cHBTYW5pdHlDaGVjaygkYm94ZXMsICRzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsIG51bGwgLyogc29mdE5tc1NpZ21hICovKTtcbiAgICBjb25zdCAkbWF4T3V0cHV0U2l6ZSA9IHBhcmFtcy5tYXhPdXRwdXRTaXplO1xuICAgIGNvbnN0ICRpb3VUaHJlc2hvbGQgPSBwYXJhbXMuaW91VGhyZXNob2xkO1xuICAgIGNvbnN0ICRzY29yZVRocmVzaG9sZCA9IHBhcmFtcy5zY29yZVRocmVzaG9sZDtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGJveGVzOiAkYm94ZXMsIHNjb3JlczogJHNjb3JlcyB9O1xuICAgIGNvbnN0IGF0dHJzID0ge1xuICAgICAgICBtYXhPdXRwdXRTaXplOiAkbWF4T3V0cHV0U2l6ZSxcbiAgICAgICAgaW91VGhyZXNob2xkOiAkaW91VGhyZXNob2xkLFxuICAgICAgICBzY29yZVRocmVzaG9sZDogJHNjb3JlVGhyZXNob2xkLFxuICAgICAgICBwYWRUb01heE91dHB1dFNpemVcbiAgICB9O1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICBjb25zdCByZXN1bHQgPSBFTkdJTkUucnVuS2VybmVsKE5vbk1heFN1cHByZXNzaW9uVjQsIGlucHV0cywgYXR0cnMpO1xuICAgIHJldHVybiB7IHNlbGVjdGVkSW5kaWNlczogcmVzdWx0WzBdLCB2YWxpZE91dHB1dHM6IHJlc3VsdFsxXSB9O1xufVxuZXhwb3J0IGNvbnN0IG5vbk1heFN1cHByZXNzaW9uUGFkZGVkID0gb3AoeyBub25NYXhTdXBwcmVzc2lvblBhZGRlZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ub25fbWF4X3N1cHByZXNzaW9uX3BhZGRlZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBub25NYXhTdXBwcmVzc2lvblY0SW1wbCB9IGZyb20gJy4uLy4uL2JhY2tlbmRzL25vbl9tYXhfc3VwcHJlc3Npb25faW1wbCc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgbm9uTWF4U3VwcFNhbml0eUNoZWNrIH0gZnJvbSAnLi4vbm9ubWF4X3V0aWwnO1xuaW1wb3J0IHsgc2NhbGFyIH0gZnJvbSAnLi4vc2NhbGFyJztcbmltcG9ydCB7IHRlbnNvcjFkIH0gZnJvbSAnLi4vdGVuc29yMWQnO1xuLyoqXG4gKiBBc3luY2hyb25vdXNseSBwZXJmb3JtcyBub24gbWF4aW11bSBzdXBwcmVzc2lvbiBvZiBib3VuZGluZyBib3hlcyBiYXNlZCBvblxuICogaW91IChpbnRlcnNlY3Rpb24gb3ZlciB1bmlvbiksIHdpdGggYW4gb3B0aW9uIHRvIHBhZCByZXN1bHRzLlxuICpcbiAqIEBwYXJhbSBib3hlcyBhIDJkIHRlbnNvciBvZiBzaGFwZSBgW251bUJveGVzLCA0XWAuIEVhY2ggZW50cnkgaXNcbiAqICAgICBgW3kxLCB4MSwgeTIsIHgyXWAsIHdoZXJlIGAoeTEsIHgxKWAgYW5kIGAoeTIsIHgyKWAgYXJlIHRoZSBjb3JuZXJzIG9mXG4gKiAgICAgdGhlIGJvdW5kaW5nIGJveC5cbiAqIEBwYXJhbSBzY29yZXMgYSAxZCB0ZW5zb3IgcHJvdmlkaW5nIHRoZSBib3ggc2NvcmVzIG9mIHNoYXBlIGBbbnVtQm94ZXNdYC5cbiAqIEBwYXJhbSBtYXhPdXRwdXRTaXplIFRoZSBtYXhpbXVtIG51bWJlciBvZiBib3hlcyB0byBiZSBzZWxlY3RlZC5cbiAqIEBwYXJhbSBpb3VUaHJlc2hvbGQgQSBmbG9hdCByZXByZXNlbnRpbmcgdGhlIHRocmVzaG9sZCBmb3IgZGVjaWRpbmcgd2hldGhlclxuICogICAgIGJveGVzIG92ZXJsYXAgdG9vIG11Y2ggd2l0aCByZXNwZWN0IHRvIElPVS4gTXVzdCBiZSBiZXR3ZWVuIFswLCAxXS5cbiAqICAgICBEZWZhdWx0cyB0byAwLjUgKDUwJSBib3ggb3ZlcmxhcCkuXG4gKiBAcGFyYW0gc2NvcmVUaHJlc2hvbGQgQSB0aHJlc2hvbGQgZm9yIGRlY2lkaW5nIHdoZW4gdG8gcmVtb3ZlIGJveGVzIGJhc2VkXG4gKiAgICAgb24gc2NvcmUuIERlZmF1bHRzIHRvIC1pbmYsIHdoaWNoIG1lYW5zIGFueSBzY29yZSBpcyBhY2NlcHRlZC5cbiAqIEBwYXJhbSBwYWRUb01heE91dHB1dFNpemUgRGVmYWx0cyB0byBmYWxzZS4gSWYgdHJ1ZSwgc2l6ZSBvZiBvdXRwdXRcbiAqICAgICBgc2VsZWN0ZWRJbmRpY2VzYCBpcyBwYWRkZWQgdG8gbWF4T3V0cHV0U2l6ZS5cbiAqIEByZXR1cm4gQSBtYXAgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAgICAgLSBzZWxlY3RlZEluZGljZXM6IEEgMUQgdGVuc29yIHdpdGggdGhlIHNlbGVjdGVkIGJveCBpbmRpY2VzLlxuICogICAgIC0gdmFsaWRPdXRwdXRzOiBBIHNjYWxhciBkZW5vdGluZyBob3cgbWFueSBlbGVtZW50cyBpbiBgc2VsZWN0ZWRJbmRpY2VzYFxuICogICAgICAgYXJlIHZhbGlkLiBWYWxpZCBlbGVtZW50cyBvY2N1ciBmaXJzdCwgdGhlbiBwYWRkaW5nLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0ltYWdlcycsIG5hbWVzcGFjZTogJ2ltYWdlJ31cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25QYWRkZWRBc3luY18oYm94ZXMsIHNjb3JlcywgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkID0gMC41LCBzY29yZVRocmVzaG9sZCA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSwgcGFkVG9NYXhPdXRwdXRTaXplID0gZmFsc2UpIHtcbiAgICBjb25zdCAkYm94ZXMgPSBjb252ZXJ0VG9UZW5zb3IoYm94ZXMsICdib3hlcycsICdub25NYXhTdXBwcmVzc2lvbkFzeW5jJyk7XG4gICAgY29uc3QgJHNjb3JlcyA9IGNvbnZlcnRUb1RlbnNvcihzY29yZXMsICdzY29yZXMnLCAnbm9uTWF4U3VwcHJlc3Npb25Bc3luYycpO1xuICAgIGNvbnN0IHBhcmFtcyA9IG5vbk1heFN1cHBTYW5pdHlDaGVjaygkYm94ZXMsICRzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsIG51bGwgLyogc29mdE5tc1NpZ21hICovKTtcbiAgICBjb25zdCAkbWF4T3V0cHV0U2l6ZSA9IHBhcmFtcy5tYXhPdXRwdXRTaXplO1xuICAgIGNvbnN0ICRpb3VUaHJlc2hvbGQgPSBwYXJhbXMuaW91VGhyZXNob2xkO1xuICAgIGNvbnN0ICRzY29yZVRocmVzaG9sZCA9IHBhcmFtcy5zY29yZVRocmVzaG9sZDtcbiAgICBjb25zdCBbYm94ZXNWYWxzLCBzY29yZXNWYWxzXSA9IGF3YWl0IFByb21pc2UuYWxsKFskYm94ZXMuZGF0YSgpLCAkc2NvcmVzLmRhdGEoKV0pO1xuICAgIC8vIFdlIGNhbGwgYSBjcHUgYmFzZWQgaW1wbCBkaXJlY3RseSB3aXRoIHRoZSB0eXBlZGFycmF5IGRhdGEgaGVyZSByYXRoZXJcbiAgICAvLyB0aGFuIGEga2VybmVsIGJlY2F1c2UgYWxsIGtlcm5lbHMgYXJlIHN5bmNocm9ub3VzIChhbmQgdGh1cyBjYW5ub3QgYXdhaXRcbiAgICAvLyAuZGF0YSgpKS5cbiAgICBjb25zdCB7IHNlbGVjdGVkSW5kaWNlcywgdmFsaWRPdXRwdXRzIH0gPSBub25NYXhTdXBwcmVzc2lvblY0SW1wbChib3hlc1ZhbHMsIHNjb3Jlc1ZhbHMsICRtYXhPdXRwdXRTaXplLCAkaW91VGhyZXNob2xkLCAkc2NvcmVUaHJlc2hvbGQsIHBhZFRvTWF4T3V0cHV0U2l6ZSk7XG4gICAgaWYgKCRib3hlcyAhPT0gYm94ZXMpIHtcbiAgICAgICAgJGJveGVzLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgaWYgKCRzY29yZXMgIT09IHNjb3Jlcykge1xuICAgICAgICAkc2NvcmVzLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2VsZWN0ZWRJbmRpY2VzOiB0ZW5zb3IxZChzZWxlY3RlZEluZGljZXMsICdpbnQzMicpLFxuICAgICAgICB2YWxpZE91dHB1dHM6IHNjYWxhcih2YWxpZE91dHB1dHMsICdpbnQzMicpXG4gICAgfTtcbn1cbmV4cG9ydCBjb25zdCBub25NYXhTdXBwcmVzc2lvblBhZGRlZEFzeW5jID0gbm9uTWF4U3VwcHJlc3Npb25QYWRkZWRBc3luY187XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ub25fbWF4X3N1cHByZXNzaW9uX3BhZGRlZF9hc3luYy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgTm9uTWF4U3VwcHJlc3Npb25WNSB9IGZyb20gJy4uLy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgbm9uTWF4U3VwcFNhbml0eUNoZWNrIH0gZnJvbSAnLi4vbm9ubWF4X3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBQZXJmb3JtcyBub24gbWF4aW11bSBzdXBwcmVzc2lvbiBvZiBib3VuZGluZyBib3hlcyBiYXNlZCBvblxuICogaW91IChpbnRlcnNlY3Rpb24gb3ZlciB1bmlvbikuXG4gKlxuICogVGhpcyBvcCBhbHNvIHN1cHBvcnRzIGEgU29mdC1OTVMgbW9kZSAoYy5mLlxuICogQm9kbGEgZXQgYWwsIGh0dHBzOi8vYXJ4aXYub3JnL2Ficy8xNzA0LjA0NTAzKSB3aGVyZSBib3hlcyByZWR1Y2UgdGhlIHNjb3JlXG4gKiBvZiBvdGhlciBvdmVybGFwcGluZyBib3hlcywgdGhlcmVmb3JlIGZhdm9yaW5nIGRpZmZlcmVudCByZWdpb25zIG9mIHRoZSBpbWFnZVxuICogd2l0aCBoaWdoIHNjb3Jlcy4gVG8gZW5hYmxlIHRoaXMgU29mdC1OTVMgbW9kZSwgc2V0IHRoZSBgc29mdE5tc1NpZ21hYFxuICogcGFyYW1ldGVyIHRvIGJlIGxhcmdlciB0aGFuIDAuXG4gKlxuICogQHBhcmFtIGJveGVzIGEgMmQgdGVuc29yIG9mIHNoYXBlIGBbbnVtQm94ZXMsIDRdYC4gRWFjaCBlbnRyeSBpc1xuICogICAgIGBbeTEsIHgxLCB5MiwgeDJdYCwgd2hlcmUgYCh5MSwgeDEpYCBhbmQgYCh5MiwgeDIpYCBhcmUgdGhlIGNvcm5lcnMgb2ZcbiAqICAgICB0aGUgYm91bmRpbmcgYm94LlxuICogQHBhcmFtIHNjb3JlcyBhIDFkIHRlbnNvciBwcm92aWRpbmcgdGhlIGJveCBzY29yZXMgb2Ygc2hhcGUgYFtudW1Cb3hlc11gLlxuICogQHBhcmFtIG1heE91dHB1dFNpemUgVGhlIG1heGltdW0gbnVtYmVyIG9mIGJveGVzIHRvIGJlIHNlbGVjdGVkLlxuICogQHBhcmFtIGlvdVRocmVzaG9sZCBBIGZsb2F0IHJlcHJlc2VudGluZyB0aGUgdGhyZXNob2xkIGZvciBkZWNpZGluZyB3aGV0aGVyXG4gKiAgICAgYm94ZXMgb3ZlcmxhcCB0b28gbXVjaCB3aXRoIHJlc3BlY3QgdG8gSU9VLiBNdXN0IGJlIGJldHdlZW4gWzAsIDFdLlxuICogICAgIERlZmF1bHRzIHRvIDAuNSAoNTAlIGJveCBvdmVybGFwKS5cbiAqIEBwYXJhbSBzY29yZVRocmVzaG9sZCBBIHRocmVzaG9sZCBmb3IgZGVjaWRpbmcgd2hlbiB0byByZW1vdmUgYm94ZXMgYmFzZWRcbiAqICAgICBvbiBzY29yZS4gRGVmYXVsdHMgdG8gLWluZiwgd2hpY2ggbWVhbnMgYW55IHNjb3JlIGlzIGFjY2VwdGVkLlxuICogQHBhcmFtIHNvZnRObXNTaWdtYSBBIGZsb2F0IHJlcHJlc2VudGluZyB0aGUgc2lnbWEgcGFyYW1ldGVyIGZvciBTb2Z0IE5NUy5cbiAqICAgICBXaGVuIHNpZ21hIGlzIDAsIGl0IGZhbGxzIGJhY2sgdG8gbm9uTWF4U3VwcHJlc3Npb24uXG4gKiBAcmV0dXJuIEEgbWFwIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICogICAgIC0gc2VsZWN0ZWRJbmRpY2VzOiBBIDFEIHRlbnNvciB3aXRoIHRoZSBzZWxlY3RlZCBib3ggaW5kaWNlcy5cbiAqICAgICAtIHNlbGVjdGVkU2NvcmVzOiBBIDFEIHRlbnNvciB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHNjb3JlcyBmb3IgZWFjaFxuICogICAgICAgc2VsZWN0ZWQgYm94LlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0ltYWdlcycsIG5hbWVzcGFjZTogJ2ltYWdlJ31cbiAqL1xuZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25XaXRoU2NvcmVfKGJveGVzLCBzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCA9IDAuNSwgc2NvcmVUaHJlc2hvbGQgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksIHNvZnRObXNTaWdtYSA9IDAuMCkge1xuICAgIGNvbnN0ICRib3hlcyA9IGNvbnZlcnRUb1RlbnNvcihib3hlcywgJ2JveGVzJywgJ25vbk1heFN1cHByZXNzaW9uJyk7XG4gICAgY29uc3QgJHNjb3JlcyA9IGNvbnZlcnRUb1RlbnNvcihzY29yZXMsICdzY29yZXMnLCAnbm9uTWF4U3VwcHJlc3Npb24nKTtcbiAgICBjb25zdCBwYXJhbXMgPSBub25NYXhTdXBwU2FuaXR5Q2hlY2soJGJveGVzLCAkc2NvcmVzLCBtYXhPdXRwdXRTaXplLCBpb3VUaHJlc2hvbGQsIHNjb3JlVGhyZXNob2xkLCBzb2Z0Tm1zU2lnbWEpO1xuICAgIG1heE91dHB1dFNpemUgPSBwYXJhbXMubWF4T3V0cHV0U2l6ZTtcbiAgICBpb3VUaHJlc2hvbGQgPSBwYXJhbXMuaW91VGhyZXNob2xkO1xuICAgIHNjb3JlVGhyZXNob2xkID0gcGFyYW1zLnNjb3JlVGhyZXNob2xkO1xuICAgIHNvZnRObXNTaWdtYSA9IHBhcmFtcy5zb2Z0Tm1zU2lnbWE7XG4gICAgY29uc3QgaW5wdXRzID0geyBib3hlczogJGJveGVzLCBzY29yZXM6ICRzY29yZXMgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCwgc29mdE5tc1NpZ21hIH07XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgIGNvbnN0IHJlc3VsdCA9IEVOR0lORS5ydW5LZXJuZWwoTm9uTWF4U3VwcHJlc3Npb25WNSwgaW5wdXRzLCBhdHRycyk7XG4gICAgcmV0dXJuIHsgc2VsZWN0ZWRJbmRpY2VzOiByZXN1bHRbMF0sIHNlbGVjdGVkU2NvcmVzOiByZXN1bHRbMV0gfTtcbn1cbmV4cG9ydCBjb25zdCBub25NYXhTdXBwcmVzc2lvbldpdGhTY29yZSA9IG9wKHsgbm9uTWF4U3VwcHJlc3Npb25XaXRoU2NvcmVfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bm9uX21heF9zdXBwcmVzc2lvbl93aXRoX3Njb3JlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IG5vbk1heFN1cHByZXNzaW9uVjVJbXBsIH0gZnJvbSAnLi4vLi4vYmFja2VuZHMvbm9uX21heF9zdXBwcmVzc2lvbl9pbXBsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBub25NYXhTdXBwU2FuaXR5Q2hlY2sgfSBmcm9tICcuLi9ub25tYXhfdXRpbCc7XG5pbXBvcnQgeyB0ZW5zb3IxZCB9IGZyb20gJy4uL3RlbnNvcjFkJztcbi8qKlxuICogQXN5bmNocm9ub3VzbHkgcGVyZm9ybXMgbm9uIG1heGltdW0gc3VwcHJlc3Npb24gb2YgYm91bmRpbmcgYm94ZXMgYmFzZWQgb25cbiAqIGlvdSAoaW50ZXJzZWN0aW9uIG92ZXIgdW5pb24pLlxuICpcbiAqIFRoaXMgb3AgYWxzbyBzdXBwb3J0cyBhIFNvZnQtTk1TIG1vZGUgKGMuZi5cbiAqIEJvZGxhIGV0IGFsLCBodHRwczovL2FyeGl2Lm9yZy9hYnMvMTcwNC4wNDUwMykgd2hlcmUgYm94ZXMgcmVkdWNlIHRoZSBzY29yZVxuICogb2Ygb3RoZXIgb3ZlcmxhcHBpbmcgYm94ZXMsIHRoZXJlZm9yZSBmYXZvcmluZyBkaWZmZXJlbnQgcmVnaW9ucyBvZiB0aGUgaW1hZ2VcbiAqIHdpdGggaGlnaCBzY29yZXMuIFRvIGVuYWJsZSB0aGlzIFNvZnQtTk1TIG1vZGUsIHNldCB0aGUgYHNvZnRObXNTaWdtYWBcbiAqIHBhcmFtZXRlciB0byBiZSBsYXJnZXIgdGhhbiAwLlxuICpcbiAqIEBwYXJhbSBib3hlcyBhIDJkIHRlbnNvciBvZiBzaGFwZSBgW251bUJveGVzLCA0XWAuIEVhY2ggZW50cnkgaXNcbiAqICAgICBgW3kxLCB4MSwgeTIsIHgyXWAsIHdoZXJlIGAoeTEsIHgxKWAgYW5kIGAoeTIsIHgyKWAgYXJlIHRoZSBjb3JuZXJzIG9mXG4gKiAgICAgdGhlIGJvdW5kaW5nIGJveC5cbiAqIEBwYXJhbSBzY29yZXMgYSAxZCB0ZW5zb3IgcHJvdmlkaW5nIHRoZSBib3ggc2NvcmVzIG9mIHNoYXBlIGBbbnVtQm94ZXNdYC5cbiAqIEBwYXJhbSBtYXhPdXRwdXRTaXplIFRoZSBtYXhpbXVtIG51bWJlciBvZiBib3hlcyB0byBiZSBzZWxlY3RlZC5cbiAqIEBwYXJhbSBpb3VUaHJlc2hvbGQgQSBmbG9hdCByZXByZXNlbnRpbmcgdGhlIHRocmVzaG9sZCBmb3IgZGVjaWRpbmcgd2hldGhlclxuICogICAgIGJveGVzIG92ZXJsYXAgdG9vIG11Y2ggd2l0aCByZXNwZWN0IHRvIElPVS4gTXVzdCBiZSBiZXR3ZWVuIFswLCAxXS5cbiAqICAgICBEZWZhdWx0cyB0byAwLjUgKDUwJSBib3ggb3ZlcmxhcCkuXG4gKiBAcGFyYW0gc2NvcmVUaHJlc2hvbGQgQSB0aHJlc2hvbGQgZm9yIGRlY2lkaW5nIHdoZW4gdG8gcmVtb3ZlIGJveGVzIGJhc2VkXG4gKiAgICAgb24gc2NvcmUuIERlZmF1bHRzIHRvIC1pbmYsIHdoaWNoIG1lYW5zIGFueSBzY29yZSBpcyBhY2NlcHRlZC5cbiAqIEBwYXJhbSBzb2Z0Tm1zU2lnbWEgQSBmbG9hdCByZXByZXNlbnRpbmcgdGhlIHNpZ21hIHBhcmFtZXRlciBmb3IgU29mdCBOTVMuXG4gKiAgICAgV2hlbiBzaWdtYSBpcyAwLCBpdCBmYWxscyBiYWNrIHRvIG5vbk1heFN1cHByZXNzaW9uLlxuICogQHJldHVybiBBIG1hcCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqICAgICAtIHNlbGVjdGVkSW5kaWNlczogQSAxRCB0ZW5zb3Igd2l0aCB0aGUgc2VsZWN0ZWQgYm94IGluZGljZXMuXG4gKiAgICAgLSBzZWxlY3RlZFNjb3JlczogQSAxRCB0ZW5zb3Igd2l0aCB0aGUgY29ycmVzcG9uZGluZyBzY29yZXMgZm9yIGVhY2hcbiAqICAgICAgIHNlbGVjdGVkIGJveC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdJbWFnZXMnLCBuYW1lc3BhY2U6ICdpbWFnZSd9XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG5vbk1heFN1cHByZXNzaW9uV2l0aFNjb3JlQXN5bmNfKGJveGVzLCBzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCA9IDAuNSwgc2NvcmVUaHJlc2hvbGQgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksIHNvZnRObXNTaWdtYSA9IDAuMCkge1xuICAgIGNvbnN0ICRib3hlcyA9IGNvbnZlcnRUb1RlbnNvcihib3hlcywgJ2JveGVzJywgJ25vbk1heFN1cHByZXNzaW9uQXN5bmMnKTtcbiAgICBjb25zdCAkc2NvcmVzID0gY29udmVydFRvVGVuc29yKHNjb3JlcywgJ3Njb3JlcycsICdub25NYXhTdXBwcmVzc2lvbkFzeW5jJyk7XG4gICAgY29uc3QgcGFyYW1zID0gbm9uTWF4U3VwcFNhbml0eUNoZWNrKCRib3hlcywgJHNjb3JlcywgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCwgc29mdE5tc1NpZ21hKTtcbiAgICBtYXhPdXRwdXRTaXplID0gcGFyYW1zLm1heE91dHB1dFNpemU7XG4gICAgaW91VGhyZXNob2xkID0gcGFyYW1zLmlvdVRocmVzaG9sZDtcbiAgICBzY29yZVRocmVzaG9sZCA9IHBhcmFtcy5zY29yZVRocmVzaG9sZDtcbiAgICBzb2Z0Tm1zU2lnbWEgPSBwYXJhbXMuc29mdE5tc1NpZ21hO1xuICAgIGNvbnN0IGJveGVzQW5kU2NvcmVzID0gYXdhaXQgUHJvbWlzZS5hbGwoWyRib3hlcy5kYXRhKCksICRzY29yZXMuZGF0YSgpXSk7XG4gICAgY29uc3QgYm94ZXNWYWxzID0gYm94ZXNBbmRTY29yZXNbMF07XG4gICAgY29uc3Qgc2NvcmVzVmFscyA9IGJveGVzQW5kU2NvcmVzWzFdO1xuICAgIC8vIFdlIGNhbGwgYSBjcHUgYmFzZWQgaW1wbCBkaXJlY3RseSB3aXRoIHRoZSB0eXBlZGFycmF5IGRhdGEgIGhlcmUgcmF0aGVyXG4gICAgLy8gdGhhbiBhIGtlcm5lbCBiZWNhdXNlIGFsbCBrZXJuZWxzIGFyZSBzeW5jaHJvbm91cyAoYW5kIHRodXMgY2Fubm90IGF3YWl0XG4gICAgLy8gLmRhdGEoKSkuXG4gICAgY29uc3QgeyBzZWxlY3RlZEluZGljZXMsIHNlbGVjdGVkU2NvcmVzIH0gPSBub25NYXhTdXBwcmVzc2lvblY1SW1wbChib3hlc1ZhbHMsIHNjb3Jlc1ZhbHMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsIHNvZnRObXNTaWdtYSk7XG4gICAgaWYgKCRib3hlcyAhPT0gYm94ZXMpIHtcbiAgICAgICAgJGJveGVzLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgaWYgKCRzY29yZXMgIT09IHNjb3Jlcykge1xuICAgICAgICAkc2NvcmVzLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2VsZWN0ZWRJbmRpY2VzOiB0ZW5zb3IxZChzZWxlY3RlZEluZGljZXMsICdpbnQzMicpLFxuICAgICAgICBzZWxlY3RlZFNjb3JlczogdGVuc29yMWQoc2VsZWN0ZWRTY29yZXMpXG4gICAgfTtcbn1cbmV4cG9ydCBjb25zdCBub25NYXhTdXBwcmVzc2lvbldpdGhTY29yZUFzeW5jID0gbm9uTWF4U3VwcHJlc3Npb25XaXRoU2NvcmVBc3luY187XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ub25fbWF4X3N1cHByZXNzaW9uX3dpdGhfc2NvcmVfYXN5bmMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IFJlc2l6ZUJpbGluZWFyIH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4uL3Jlc2hhcGUnO1xuLyoqXG4gKiBCaWxpbmVhciByZXNpemUgYSBzaW5nbGUgM0QgaW1hZ2Ugb3IgYSBiYXRjaCBvZiAzRCBpbWFnZXMgdG8gYSBuZXcgc2hhcGUuXG4gKlxuICogQHBhcmFtIGltYWdlcyBUaGUgaW1hZ2VzLCBvZiByYW5rIDQgb3IgcmFuayAzLCBvZiBzaGFwZVxuICogICAgIGBbYmF0Y2gsIGhlaWdodCwgd2lkdGgsIGluQ2hhbm5lbHNdYC4gSWYgcmFuayAzLCBiYXRjaCBvZiAxIGlzIGFzc3VtZWQuXG4gKiBAcGFyYW0gc2l6ZSBUaGUgbmV3IHNoYXBlIGBbbmV3SGVpZ2h0LCBuZXdXaWR0aF1gIHRvIHJlc2l6ZSB0aGVcbiAqICAgICBpbWFnZXMgdG8uIEVhY2ggY2hhbm5lbCBpcyByZXNpemVkIGluZGl2aWR1YWxseS5cbiAqIEBwYXJhbSBhbGlnbkNvcm5lcnMgRGVmYXVsdHMgdG8gYGZhbHNlYC4gSWYgdHJ1ZSwgcmVzY2FsZVxuICogICAgIGlucHV0IGJ5IGAobmV3X2hlaWdodCAtIDEpIC8gKGhlaWdodCAtIDEpYCwgd2hpY2ggZXhhY3RseSBhbGlnbnMgdGhlIDRcbiAqICAgICBjb3JuZXJzIG9mIGltYWdlcyBhbmQgcmVzaXplZCBpbWFnZXMuIElmIGZhbHNlLCByZXNjYWxlIGJ5XG4gKiAgICAgYG5ld19oZWlnaHQgLyBoZWlnaHRgLiBUcmVhdCBzaW1pbGFybHkgdGhlIHdpZHRoIGRpbWVuc2lvbi5cbiAqIEBwYXJhbSBoYWxmUGl4ZWxDZW50ZXJzIERlZmF1bHRzIHRvIGBmYWxzZWAuIFdoZXRoZXIgdG8gYXNzdW1lIHBpeGVsIGNlbnRlcnNcbiAqICAgICBhcmUgYXQgMC41LCB3aGljaCB3b3VsZCBtYWtlIHRoZSBmbG9hdGluZyBwb2ludCBjb29yZGluYXRlcyBvZiB0aGUgdG9wXG4gKiAgICAgbGVmdCBwaXhlbCAwLjUsIDAuNS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdJbWFnZXMnLCBuYW1lc3BhY2U6ICdpbWFnZSd9XG4gKi9cbmZ1bmN0aW9uIHJlc2l6ZUJpbGluZWFyXyhpbWFnZXMsIHNpemUsIGFsaWduQ29ybmVycyA9IGZhbHNlLCBoYWxmUGl4ZWxDZW50ZXJzID0gZmFsc2UpIHtcbiAgICBjb25zdCAkaW1hZ2VzID0gY29udmVydFRvVGVuc29yKGltYWdlcywgJ2ltYWdlcycsICdyZXNpemVCaWxpbmVhcicpO1xuICAgIHV0aWwuYXNzZXJ0KCRpbWFnZXMucmFuayA9PT0gMyB8fCAkaW1hZ2VzLnJhbmsgPT09IDQsICgpID0+IGBFcnJvciBpbiByZXNpemVCaWxpbmVhcjogeCBtdXN0IGJlIHJhbmsgMyBvciA0LCBidXQgZ290IGAgK1xuICAgICAgICBgcmFuayAkeyRpbWFnZXMucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoc2l6ZS5sZW5ndGggPT09IDIsICgpID0+IGBFcnJvciBpbiByZXNpemVCaWxpbmVhcjogbmV3IHNoYXBlIG11c3QgMkQsIGJ1dCBnb3Qgc2hhcGUgYCArXG4gICAgICAgIGAke3NpemV9LmApO1xuICAgIHV0aWwuYXNzZXJ0KGhhbGZQaXhlbENlbnRlcnMgPT09IGZhbHNlIHx8IGFsaWduQ29ybmVycyA9PT0gZmFsc2UsICgpID0+IGBFcnJvciBpbiByZXNpemVCaWxpbmVhcjogSWYgaGFsZlBpeGVsQ2VudGVycyBpcyB0cnVlLCBgICtcbiAgICAgICAgYGFsaWduQ29ybmVycyBtdXN0IGJlIGZhbHNlLmApO1xuICAgIGxldCBiYXRjaEltYWdlcyA9ICRpbWFnZXM7XG4gICAgbGV0IHJlc2hhcGVkVG80RCA9IGZhbHNlO1xuICAgIGlmICgkaW1hZ2VzLnJhbmsgPT09IDMpIHtcbiAgICAgICAgcmVzaGFwZWRUbzREID0gdHJ1ZTtcbiAgICAgICAgYmF0Y2hJbWFnZXMgPSByZXNoYXBlKCRpbWFnZXMsIFsxLCAkaW1hZ2VzLnNoYXBlWzBdLCAkaW1hZ2VzLnNoYXBlWzFdLCAkaW1hZ2VzLnNoYXBlWzJdXSk7XG4gICAgfVxuICAgIGNvbnN0IFtdID0gc2l6ZTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGltYWdlczogYmF0Y2hJbWFnZXMgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgYWxpZ25Db3JuZXJzLCBoYWxmUGl4ZWxDZW50ZXJzLCBzaXplIH07XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgIGNvbnN0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoUmVzaXplQmlsaW5lYXIsIGlucHV0cywgYXR0cnMpO1xuICAgIGlmIChyZXNoYXBlZFRvNEQpIHtcbiAgICAgICAgcmV0dXJuIHJlc2hhcGUocmVzLCBbcmVzLnNoYXBlWzFdLCByZXMuc2hhcGVbMl0sIHJlcy5zaGFwZVszXV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IHJlc2l6ZUJpbGluZWFyID0gb3AoeyByZXNpemVCaWxpbmVhcl8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZXNpemVfYmlsaW5lYXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IFJlc2l6ZU5lYXJlc3ROZWlnaGJvciB9IGZyb20gJy4uLy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuLi9yZXNoYXBlJztcbi8qKlxuICogTmVhcmVzdE5laWdoYm9yIHJlc2l6ZSBhIGJhdGNoIG9mIDNEIGltYWdlcyB0byBhIG5ldyBzaGFwZS5cbiAqXG4gKiBAcGFyYW0gaW1hZ2VzIFRoZSBpbWFnZXMsIG9mIHJhbmsgNCBvciByYW5rIDMsIG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgaW5DaGFubmVsc11gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBzaXplIFRoZSBuZXcgc2hhcGUgYFtuZXdIZWlnaHQsIG5ld1dpZHRoXWAgdG8gcmVzaXplIHRoZVxuICogICAgIGltYWdlcyB0by4gRWFjaCBjaGFubmVsIGlzIHJlc2l6ZWQgaW5kaXZpZHVhbGx5LlxuICogQHBhcmFtIGFsaWduQ29ybmVycyBEZWZhdWx0cyB0byBGYWxzZS4gSWYgdHJ1ZSwgcmVzY2FsZVxuICogICAgIGlucHV0IGJ5IGAobmV3X2hlaWdodCAtIDEpIC8gKGhlaWdodCAtIDEpYCwgd2hpY2ggZXhhY3RseSBhbGlnbnMgdGhlIDRcbiAqICAgICBjb3JuZXJzIG9mIGltYWdlcyBhbmQgcmVzaXplZCBpbWFnZXMuIElmIGZhbHNlLCByZXNjYWxlIGJ5XG4gKiAgICAgYG5ld19oZWlnaHQgLyBoZWlnaHRgLiBUcmVhdCBzaW1pbGFybHkgdGhlIHdpZHRoIGRpbWVuc2lvbi5cbiAqIEBwYXJhbSBoYWxmUGl4ZWxDZW50ZXJzIERlZmF1bHRzIHRvIGBmYWxzZWAuIFdoZXRoZXIgdG8gYXNzdW1lcyBwaXhlbHMgYXJlIG9mXG4gKiAgICAgIGhhbGYgdGhlIGFjdHVhbCBkaW1lbnNpb25zLCBhbmQgeWllbGRzIG1vcmUgYWNjdXJhdGUgcmVzaXplcy4gVGhpcyBmbGFnXG4gKiAgICAgIHdvdWxkIGFsc28gbWFrZSB0aGUgZmxvYXRpbmcgcG9pbnQgY29vcmRpbmF0ZXMgb2YgdGhlIHRvcCBsZWZ0IHBpeGVsXG4gKiAgICAgIDAuNSwgMC41LlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0ltYWdlcycsIG5hbWVzcGFjZTogJ2ltYWdlJ31cbiAqL1xuZnVuY3Rpb24gcmVzaXplTmVhcmVzdE5laWdoYm9yXyhpbWFnZXMsIHNpemUsIGFsaWduQ29ybmVycyA9IGZhbHNlLCBoYWxmUGl4ZWxDZW50ZXJzID0gZmFsc2UpIHtcbiAgICBjb25zdCAkaW1hZ2VzID0gY29udmVydFRvVGVuc29yKGltYWdlcywgJ2ltYWdlcycsICdyZXNpemVOZWFyZXN0TmVpZ2hib3InKTtcbiAgICB1dGlsLmFzc2VydCgkaW1hZ2VzLnJhbmsgPT09IDMgfHwgJGltYWdlcy5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gcmVzaXplTmVhcmVzdE5laWdoYm9yOiB4IG11c3QgYmUgcmFuayAzIG9yIDQsIGJ1dCBnb3QgYCArXG4gICAgICAgIGByYW5rICR7JGltYWdlcy5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydChzaXplLmxlbmd0aCA9PT0gMiwgKCkgPT4gYEVycm9yIGluIHJlc2l6ZU5lYXJlc3ROZWlnaGJvcjogbmV3IHNoYXBlIG11c3QgMkQsIGJ1dCBnb3Qgc2hhcGUgYCArXG4gICAgICAgIGAke3NpemV9LmApO1xuICAgIHV0aWwuYXNzZXJ0KCRpbWFnZXMuZHR5cGUgPT09ICdmbG9hdDMyJyB8fCAkaW1hZ2VzLmR0eXBlID09PSAnaW50MzInLCAoKSA9PiAnYGltYWdlc2AgbXVzdCBoYXZlIGBpbnQzMmAgb3IgYGZsb2F0MzJgIGFzIGR0eXBlJyk7XG4gICAgdXRpbC5hc3NlcnQoaGFsZlBpeGVsQ2VudGVycyA9PT0gZmFsc2UgfHwgYWxpZ25Db3JuZXJzID09PSBmYWxzZSwgKCkgPT4gYEVycm9yIGluIHJlc2l6ZU5lYXJlc3ROZWlnaGJvcjogSWYgaGFsZlBpeGVsQ2VudGVycyBpcyB0cnVlLCBgICtcbiAgICAgICAgYGFsaWduQ29ybmVycyBtdXN0IGJlIGZhbHNlLmApO1xuICAgIGxldCBiYXRjaEltYWdlcyA9ICRpbWFnZXM7XG4gICAgbGV0IHJlc2hhcGVkVG80RCA9IGZhbHNlO1xuICAgIGlmICgkaW1hZ2VzLnJhbmsgPT09IDMpIHtcbiAgICAgICAgcmVzaGFwZWRUbzREID0gdHJ1ZTtcbiAgICAgICAgYmF0Y2hJbWFnZXMgPSByZXNoYXBlKCRpbWFnZXMsIFsxLCAkaW1hZ2VzLnNoYXBlWzBdLCAkaW1hZ2VzLnNoYXBlWzFdLCAkaW1hZ2VzLnNoYXBlWzJdXSk7XG4gICAgfVxuICAgIGNvbnN0IFtdID0gc2l6ZTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGltYWdlczogYmF0Y2hJbWFnZXMgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgYWxpZ25Db3JuZXJzLCBoYWxmUGl4ZWxDZW50ZXJzLCBzaXplIH07XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgIGNvbnN0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoUmVzaXplTmVhcmVzdE5laWdoYm9yLCBpbnB1dHMsIGF0dHJzKTtcbiAgICBpZiAocmVzaGFwZWRUbzREKSB7XG4gICAgICAgIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydCBjb25zdCByZXNpemVOZWFyZXN0TmVpZ2hib3IgPSBvcCh7IHJlc2l6ZU5lYXJlc3ROZWlnaGJvcl8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZXNpemVfbmVhcmVzdF9uZWlnaGJvci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgUm90YXRlV2l0aE9mZnNldCB9IGZyb20gJy4uLy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbi8qKlxuICogUm90YXRlcyB0aGUgaW5wdXQgaW1hZ2UgdGVuc29yIGNvdW50ZXItY2xvY2t3aXNlIHdpdGggYW4gb3B0aW9uYWwgb2Zmc2V0XG4gKiBjZW50ZXIgb2Ygcm90YXRpb24uIEN1cnJlbnRseSBhdmFpbGFibGUgaW4gdGhlIENQVSwgV2ViR0wsIGFuZCBXQVNNIGJhY2tlbmRzLlxuICpcbiAqIEBwYXJhbSBpbWFnZSA0ZCB0ZW5zb3Igb2Ygc2hhcGUgYFtiYXRjaCwgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIGRlcHRoXWAuXG4gKiBAcGFyYW0gcmFkaWFucyBUaGUgYW1vdW50IG9mIHJvdGF0aW9uLlxuICogQHBhcmFtIGZpbGxWYWx1ZSBUaGUgdmFsdWUgdG8gZmlsbCBpbiB0aGUgZW1wdHkgc3BhY2UgbGVmdG92ZXJcbiAqICAgICBhZnRlciByb3RhdGlvbi4gQ2FuIGJlIGVpdGhlciBhIHNpbmdsZSBncmF5c2NhbGUgdmFsdWUgKDAtMjU1KSwgb3IgYW5cbiAqICAgICBhcnJheSBvZiB0aHJlZSBudW1iZXJzIGBbcmVkLCBncmVlbiwgYmx1ZV1gIHNwZWNpZnlpbmcgdGhlIHJlZCwgZ3JlZW4sXG4gKiAgICAgYW5kIGJsdWUgY2hhbm5lbHMuIERlZmF1bHRzIHRvIGAwYCAoYmxhY2spLlxuICogQHBhcmFtIGNlbnRlciBUaGUgY2VudGVyIG9mIHJvdGF0aW9uLiBDYW4gYmUgZWl0aGVyIGEgc2luZ2xlIHZhbHVlICgwLTEpLCBvclxuICogICAgIGFuIGFycmF5IG9mIHR3byBudW1iZXJzIGBbY2VudGVyWCwgY2VudGVyWV1gLiBEZWZhdWx0cyB0byBgMC41YCAocm90YXRlc1xuICogICAgIHRoZSBpbWFnZSBhcm91bmQgaXRzIGNlbnRlcikuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnSW1hZ2VzJywgbmFtZXNwYWNlOiAnaW1hZ2UnfVxuICovXG5mdW5jdGlvbiByb3RhdGVXaXRoT2Zmc2V0XyhpbWFnZSwgcmFkaWFucywgZmlsbFZhbHVlID0gMCwgY2VudGVyID0gMC41KSB7XG4gICAgY29uc3QgJGltYWdlID0gY29udmVydFRvVGVuc29yKGltYWdlLCAnaW1hZ2UnLCAncm90YXRlV2l0aE9mZnNldCcsICdmbG9hdDMyJyk7XG4gICAgdXRpbC5hc3NlcnQoJGltYWdlLnJhbmsgPT09IDQsICgpID0+ICdFcnJvciBpbiByb3RhdGVXaXRoT2Zmc2V0OiBpbWFnZSBtdXN0IGJlIHJhbmsgNCwnICtcbiAgICAgICAgYGJ1dCBnb3QgcmFuayAkeyRpbWFnZS5yYW5rfS5gKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGltYWdlOiAkaW1hZ2UgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgcmFkaWFucywgZmlsbFZhbHVlLCBjZW50ZXIgfTtcbiAgICBjb25zdCByZXMgPSBFTkdJTkUucnVuS2VybmVsKFJvdGF0ZVdpdGhPZmZzZXQsIGlucHV0cywgYXR0cnMpO1xuICAgIHJldHVybiByZXM7XG59XG5leHBvcnQgY29uc3Qgcm90YXRlV2l0aE9mZnNldCA9IG9wKHsgcm90YXRlV2l0aE9mZnNldF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yb3RhdGVfd2l0aF9vZmZzZXQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IHRlbnNvcjFkIH0gZnJvbSAnLi4vdGVuc29yMWQnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgY2FzdCB9IGZyb20gJy4uL2Nhc3QnO1xuaW1wb3J0IHsgc3BsaXQgfSBmcm9tICcuLi9zcGxpdCc7XG5pbXBvcnQgeyBiaW5jb3VudCB9IGZyb20gJy4uL2JpbmNvdW50JztcbmltcG9ydCB7IGxlc3NFcXVhbCB9IGZyb20gJy4uL2xlc3NfZXF1YWwnO1xuaW1wb3J0IHsgZ3JlYXRlciB9IGZyb20gJy4uL2dyZWF0ZXInO1xuaW1wb3J0IHsgc3VtIH0gZnJvbSAnLi4vc3VtJztcbmltcG9ydCB7IGFkZCB9IGZyb20gJy4uL2FkZCc7XG5pbXBvcnQgeyBtdWwgfSBmcm9tICcuLi9tdWwnO1xuaW1wb3J0IHsgZGl2IH0gZnJvbSAnLi4vZGl2JztcbmltcG9ydCB7IHN1YiB9IGZyb20gJy4uL3N1Yic7XG5pbXBvcnQgeyByb3VuZCB9IGZyb20gJy4uL3JvdW5kJztcbmltcG9ydCB7IHdoZXJlIH0gZnJvbSAnLi4vd2hlcmUnO1xuaW1wb3J0IHsgZmlsbCB9IGZyb20gJy4uL2ZpbGwnO1xuaW1wb3J0IHsgc2xpY2UgfSBmcm9tICcuLi9zbGljZSc7XG5pbXBvcnQgeyByYW5nZSB9IGZyb20gJy4uL3JhbmdlJztcbmltcG9ydCB7IHRlbnNvciB9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52Jztcbi8qKlxuICogUGVyZm9ybXMgaW1hZ2UgYmluYXJpemF0aW9uIHdpdGggY29ycmVzcG9uZGluZyB0aHJlc2hvbGRcbiAqIChkZXBlbmRzIG9uIHRoZSBtZXRob2QpdmFsdWUsIHdoaWNoIGNyZWF0ZXMgYSBiaW5hcnkgaW1hZ2UgZnJvbSBhIGdyYXlzY2FsZS5cbiAqIEBwYXJhbSBpbWFnZSAzZCB0ZW5zb3Igb2Ygc2hhcGUgW2ltYWdlSGVpZ2h0LGltYWdlV2lkdGgsIGRlcHRoXSxcbiAqIHdoZXJlIGltYWdlSGVpZ2h0IGFuZCBpbWFnZVdpZHRoIG11c3QgYmUgcG9zaXRpdmUuVGhlIGltYWdlIGNvbG9yXG4gKiByYW5nZSBzaG91bGQgYmUgWzAsIDI1NV0uXG4gKiBAcGFyYW0gbWV0aG9kIE9wdGlvbmFsIHN0cmluZyBmcm9tIGAnYmluYXJ5JyB8ICdvdHN1J2BcbiAqIHdoaWNoIHNwZWNpZmllcyB0aGUgbWV0aG9kIGZvciB0aHJlc2hvbGRpbmcuIERlZmF1bHRzIHRvICdiaW5hcnknLlxuICogQHBhcmFtIGludmVydGVkIE9wdGlvbmFsIGJvb2xlYW4gd2hpY2hzcGVjaWZpZXNcbiAqIGlmIGNvbG91cnMgc2hvdWxkIGJlIGludmVydGVkLiBEZWZhdWx0cyB0byBmYWxzZS5cbiAqIEBwYXJhbSB0aHJlc2hWYWx1ZSBPcHRpb25hbCBudW1iZXIgd2hpY2ggZGVmaW5lcyB0aHJlc2hvbGQgdmFsdWUgZnJvbSAwIHRvIDEuXG4gKiBEZWZhdWx0cyB0byAwLjUuXG4gKiBAcmV0dXJuIEEgM2QgdGVuc29yIG9mIHNoYXBlIFtpbWFnZUhlaWdodCxpbWFnZVdpZHRoLCBkZXB0aF0sIHdoaWNoXG4gKiBjb250YWlucyBiaW5hcml6ZWQgaW1hZ2UuXG4gKi9cbmZ1bmN0aW9uIHRocmVzaG9sZF8oaW1hZ2UsIG1ldGhvZCA9ICdiaW5hcnknLCBpbnZlcnRlZCA9IGZhbHNlLCB0aHJlc2hWYWx1ZSA9IDAuNSkge1xuICAgIGNvbnN0ICRpbWFnZSA9IGNvbnZlcnRUb1RlbnNvcihpbWFnZSwgJ2ltYWdlJywgJ3RocmVzaG9sZCcpO1xuICAgIC8qIDAuMjk4OSwgMC41ODcwLCAwLjExNDAgYXJlIHJlcHJlc2VudCBsdW1hIGNvZWZmaWNpZW50cyBpbiBDQ0lSNjAxLlxuICAgIFJlZmVyZW5jZSBmb3IgY29udmVydGluZyBiZXR3ZWVuIFJHQiBhbmQgZ3JheXNjYWxlOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MdW1hXyUyOHZpZGVvJTI5ICAqL1xuICAgIGNvbnN0IFJFRF9JTlRFTkNJVFlfQ09FRiA9IDAuMjk4OTtcbiAgICBjb25zdCBHUkVFTl9JTlRFTkNJVFlfQ09FRiA9IDAuNTg3MDtcbiAgICBjb25zdCBCTFVFX0lOVEVOQ0lUWV9DT0VGID0gMC4xMTQwO1xuICAgIGNvbnN0IHRvdGFsUGl4ZWxzSW5JbWFnZSA9ICRpbWFnZS5zaGFwZVswXSAqICRpbWFnZS5zaGFwZVsxXTtcbiAgICBsZXQgJHRocmVzaG9sZCA9IG11bCh0ZW5zb3IxZChbdGhyZXNoVmFsdWVdKSwgMjU1KTtcbiAgICBsZXQgciwgZywgYiwgZ3JheXNjYWxlO1xuICAgIHV0aWwuYXNzZXJ0KCRpbWFnZS5yYW5rID09PSAzLCAoKSA9PiAnRXJyb3IgaW4gdGhyZXNob2xkOiBpbWFnZSBtdXN0IGJlIHJhbmsgMywnICtcbiAgICAgICAgYGJ1dCBnb3QgcmFuayAkeyRpbWFnZS5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydCgkaW1hZ2Uuc2hhcGVbMl0gPT09IDMgfHwgJGltYWdlLnNoYXBlWzJdID09PSAxLCAoKSA9PiAnRXJyb3IgaW4gdGhyZXNob2xkOiAnICtcbiAgICAgICAgJ2ltYWdlIGNvbG9yIGNoYW5uZWwgbXVzdCBiZSBlcXVhbCB0byAzIG9yIDEnICtcbiAgICAgICAgYGJ1dCBnb3QgJHskaW1hZ2Uuc2hhcGVbMl19LmApO1xuICAgIHV0aWwuYXNzZXJ0KCRpbWFnZS5kdHlwZSA9PT0gJ2ludDMyJyB8fCAkaW1hZ2UuZHR5cGUgPT09ICdmbG9hdDMyJywgKCkgPT4gJ0Vycm9yIGluIGR0eXBlOiBpbWFnZSBkdHlwZSBtdXN0IGJlIGludDMyIG9yIGZsb2F0MzIsJyArXG4gICAgICAgIGBidXQgZ290IGR0eXBlICR7JGltYWdlLmR0eXBlfS5gKTtcbiAgICB1dGlsLmFzc2VydChtZXRob2QgPT09ICdvdHN1JyB8fCBtZXRob2QgPT09ICdiaW5hcnknLCAoKSA9PiBgTWV0aG9kIG11c3QgYmUgYmluYXJ5IG9yIG90c3UsIGJ1dCB3YXMgJHttZXRob2R9YCk7XG4gICAgaWYgKCRpbWFnZS5zaGFwZVsyXSA9PT0gMykge1xuICAgICAgICBbciwgZywgYl0gPSBzcGxpdCgkaW1hZ2UsIFsxLCAxLCAxXSwgLTEpO1xuICAgICAgICBjb25zdCAkciA9IG11bChyLCBSRURfSU5URU5DSVRZX0NPRUYpO1xuICAgICAgICBjb25zdCAkZyA9IG11bChnLCBHUkVFTl9JTlRFTkNJVFlfQ09FRik7XG4gICAgICAgIGNvbnN0ICRiID0gbXVsKGIsIEJMVUVfSU5URU5DSVRZX0NPRUYpO1xuICAgICAgICBncmF5c2NhbGUgPSBhZGQoYWRkKCRyLCAkZyksICRiKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGdyYXlzY2FsZSA9IGltYWdlO1xuICAgIH1cbiAgICBpZiAobWV0aG9kID09PSAnb3RzdScpIHtcbiAgICAgICAgY29uc3QgJGhpc3RvZ3JhbSA9IGJpbmNvdW50KGNhc3Qocm91bmQoZ3JheXNjYWxlKSwgJ2ludDMyJyksIHRlbnNvcihbXSksIDI1Nik7XG4gICAgICAgICR0aHJlc2hvbGQgPSBvdHN1KCRoaXN0b2dyYW0sIHRvdGFsUGl4ZWxzSW5JbWFnZSk7XG4gICAgfVxuICAgIGNvbnN0IGludkNvbmRpdGlvbiA9IGludmVydGVkID9cbiAgICAgICAgbGVzc0VxdWFsKGdyYXlzY2FsZSwgJHRocmVzaG9sZCkgOiBncmVhdGVyKGdyYXlzY2FsZSwgJHRocmVzaG9sZCk7XG4gICAgY29uc3QgcmVzdWx0ID0gY2FzdChtdWwoaW52Q29uZGl0aW9uLCAyNTUpLCAnaW50MzInKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gb3RzdShoaXN0b2dyYW0sIHRvdGFsKSB7XG4gICAgbGV0IGJlc3RUaHJlc2ggPSB0ZW5zb3IxZChbLTFdKTtcbiAgICBsZXQgYmVzdEluQmV0VmFyID0gdGVuc29yMWQoWzBdKTtcbiAgICBsZXQgY0luQmV0VmFyID0gdGVuc29yMWQoWzBdKTtcbiAgICBsZXQgY2xhc3NGaXJzdCwgY2xhc3NTZWNvbmQsIG1lYW5GaXJzdCwgbWVhblNlYywgd2VpZ2h0Rm9yZWdyb3VuZCwgd2VpZ2h0QmFjaztcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgaGlzdG9ncmFtLnNpemUgLSAxOyBpbmRleCsrKSB7XG4gICAgICAgIGNsYXNzRmlyc3QgPSBzbGljZShoaXN0b2dyYW0sIDAsIGluZGV4ICsgMSk7XG4gICAgICAgIGNsYXNzU2Vjb25kID0gc2xpY2UoaGlzdG9ncmFtLCBpbmRleCArIDEpO1xuICAgICAgICB3ZWlnaHRGb3JlZ3JvdW5kID0gZGl2KHN1bShjbGFzc0ZpcnN0KSwgdG90YWwpO1xuICAgICAgICB3ZWlnaHRCYWNrID0gZGl2KHN1bShjbGFzc1NlY29uZCksIHRvdGFsKTtcbiAgICAgICAgY29uc3QgbWVhbkZpcnN0RGl2QSA9IHN1bShtdWwoY2xhc3NGaXJzdCwgcmFuZ2UoMCwgY2xhc3NGaXJzdC5zaXplKSkpO1xuICAgICAgICBtZWFuRmlyc3QgPSBkaXYobWVhbkZpcnN0RGl2QSwgc3VtKGNsYXNzRmlyc3QpKTtcbiAgICAgICAgY29uc3QgbWVhblNlY0ZpbGwgPSBmaWxsKGNsYXNzU2Vjb25kLnNoYXBlLCBjbGFzc0ZpcnN0LnNpemUpO1xuICAgICAgICBjb25zdCBtZWFuU2VjQWRkID0gYWRkKHJhbmdlKDAsIGNsYXNzU2Vjb25kLnNpemUpLCBtZWFuU2VjRmlsbCk7XG4gICAgICAgIGNvbnN0IG1lYW5TZWNNdWwgPSBtdWwoY2xhc3NTZWNvbmQsIChtZWFuU2VjQWRkKSk7XG4gICAgICAgIG1lYW5TZWMgPSBkaXYoc3VtKG1lYW5TZWNNdWwpLCBzdW0oY2xhc3NTZWNvbmQpKTtcbiAgICAgICAgY29uc3QgY0luQmV0VmFyU3ViQSA9IHN1YihtZWFuRmlyc3QsIG1lYW5TZWMpO1xuICAgICAgICBjb25zdCBjSW5CZXRWYXJTdWJCID0gc3ViKG1lYW5GaXJzdCwgbWVhblNlYyk7XG4gICAgICAgIGNvbnN0IGNJbkJldFZhck11bCA9IG11bCh3ZWlnaHRGb3JlZ3JvdW5kLCB3ZWlnaHRCYWNrKTtcbiAgICAgICAgY0luQmV0VmFyID0gbXVsKG11bChjSW5CZXRWYXJNdWwsIGNJbkJldFZhclN1YkEpLCBjSW5CZXRWYXJTdWJCKTtcbiAgICAgICAgY29uc3QgY29uZGl0aW9uID0gZ3JlYXRlcihjSW5CZXRWYXIsIGJlc3RJbkJldFZhcik7XG4gICAgICAgIGJlc3RJbkJldFZhciA9IHdoZXJlKGNvbmRpdGlvbiwgY0luQmV0VmFyLCBiZXN0SW5CZXRWYXIpO1xuICAgICAgICBiZXN0VGhyZXNoID0gd2hlcmUoY29uZGl0aW9uLCB0ZW5zb3IxZChbaW5kZXhdKSwgYmVzdFRocmVzaCk7XG4gICAgfVxuICAgIHJldHVybiBiZXN0VGhyZXNoO1xufVxuZXhwb3J0IGNvbnN0IHRocmVzaG9sZCA9IG9wKHsgdGhyZXNob2xkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRocmVzaG9sZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgVHJhbnNmb3JtIH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBBcHBsaWVzIHRoZSBnaXZlbiB0cmFuc2Zvcm0ocykgdG8gdGhlIGltYWdlKHMpLlxuICpcbiAqIEBwYXJhbSBpbWFnZSA0ZCB0ZW5zb3Igb2Ygc2hhcGUgYFtiYXRjaCwgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIGRlcHRoXWAuXG4gKiBAcGFyYW0gdHJhbnNmb3JtcyBQcm9qZWN0aXZlIHRyYW5zZm9ybSBtYXRyaXgvbWF0cmljZXMuIEEgdGVuc29yMWQgb2YgbGVuZ3RoXG4gKiAgICAgOCBvciB0ZW5zb3Igb2Ygc2l6ZSBOIHggOC4gSWYgb25lIHJvdyBvZiB0cmFuc2Zvcm1zIGlzIFthMCwgYTEsIGEyLCBiMFxuICogICAgIGIxLCBiMiwgYzAsIGMxXSwgdGhlbiBpdCBtYXBzIHRoZSBvdXRwdXQgcG9pbnQgKHgsIHkpIHRvIGEgdHJhbnNmb3JtZWRcbiAqICAgICBpbnB1dCBwb2ludCAoeCcsIHknKSA9ICgoYTAgeCArIGExIHkgKyBhMikgLyBrLCAoYjAgeCArIGIxIHkgKyBiMikgLyBrKSxcbiAqICAgICB3aGVyZSBrID0gYzAgeCArIGMxIHkgKyAxLiBUaGUgdHJhbnNmb3JtcyBhcmUgaW52ZXJ0ZWQgY29tcGFyZWQgdG8gdGhlXG4gKiAgICAgdHJhbnNmb3JtIG1hcHBpbmcgaW5wdXQgcG9pbnRzIHRvIG91dHB1dCBwb2ludHMuXG4gKiBAcGFyYW0gaW50ZXJwb2xhdGlvbiBJbnRlcnBvbGF0aW9uIG1vZGUuXG4gKiAgICAgU3VwcG9ydGVkIHZhbHVlczogJ25lYXJlc3QnLCAnYmlsaW5lYXInLiBEZWZhdWx0IHRvICduZWFyZXN0Jy5cbiAqIEBwYXJhbSBmaWxsTW9kZSBQb2ludHMgb3V0c2lkZSB0aGUgYm91bmRhcmllcyBvZiB0aGUgaW5wdXQgYXJlIGZpbGxlZFxuICogICAgIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gbW9kZSwgb25lIG9mICdjb25zdGFudCcsICdyZWZsZWN0JywgJ3dyYXAnLFxuICogICAgICduZWFyZXN0Jy4gRGVmYXVsdCB0byAnY29uc3RhbnQnLlxuICogICAgICdyZWZsZWN0JzogKGQgYyBiIGEgfCBhIGIgYyBkIHwgZCBjIGIgYSApIFRoZSBpbnB1dCBpcyBleHRlbmRlZCBieVxuICogICAgIHJlZmxlY3RpbmcgYWJvdXQgdGhlIGVkZ2Ugb2YgdGhlIGxhc3QgcGl4ZWwuXG4gKiAgICAgJ2NvbnN0YW50JzogKGsgayBrIGsgfCBhIGIgYyBkIHwgayBrIGsgaykgVGhlIGlucHV0IGlzIGV4dGVuZGVkIGJ5XG4gKiAgICAgZmlsbGluZyBhbGwgdmFsdWVzIGJleW9uZCB0aGUgZWRnZSB3aXRoIHRoZSBzYW1lIGNvbnN0YW50IHZhbHVlIGsuXG4gKiAgICAgJ3dyYXAnOiAoYSBiIGMgZCB8IGEgYiBjIGQgfCBhIGIgYyBkKSBUaGUgaW5wdXQgaXMgZXh0ZW5kZWQgYnlcbiAqICAgICB3cmFwcGluZyBhcm91bmQgdG8gdGhlIG9wcG9zaXRlIGVkZ2UuXG4gKiAgICAgJ25lYXJlc3QnOiAoYSBhIGEgYSB8IGEgYiBjIGQgfCBkIGQgZCBkKSBUaGUgaW5wdXQgaXMgZXh0ZW5kZWQgYnlcbiAqICAgICB0aGUgbmVhcmVzdCBwaXhlbC5cbiAqIEBwYXJhbSBmaWxsVmFsdWUgQSBmbG9hdCByZXByZXNlbnRzIHRoZSB2YWx1ZSB0byBiZSBmaWxsZWQgb3V0c2lkZSB0aGVcbiAqICAgICBib3VuZGFyaWVzIHdoZW4gZmlsbE1vZGUgaXMgJ2NvbnN0YW50Jy5cbiAqIEBwYXJhbSBPdXRwdXQgZGltZW5zaW9uIGFmdGVyIHRoZSB0cmFuc2Zvcm0sIFtoZWlnaHQsIHdpZHRoXS4gSWYgdW5kZWZpbmVkLFxuICogICAgIG91dHB1dCBpcyB0aGUgc2FtZSBzaXplIGFzIGlucHV0IGltYWdlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0ltYWdlcycsIG5hbWVzcGFjZTogJ2ltYWdlJ31cbiAqL1xuZnVuY3Rpb24gdHJhbnNmb3JtXyhpbWFnZSwgdHJhbnNmb3JtcywgaW50ZXJwb2xhdGlvbiA9ICduZWFyZXN0JywgZmlsbE1vZGUgPSAnY29uc3RhbnQnLCBmaWxsVmFsdWUgPSAwLCBvdXRwdXRTaGFwZSkge1xuICAgIGNvbnN0ICRpbWFnZSA9IGNvbnZlcnRUb1RlbnNvcihpbWFnZSwgJ2ltYWdlJywgJ3RyYW5zZm9ybScsICdmbG9hdDMyJyk7XG4gICAgY29uc3QgJHRyYW5zZm9ybXMgPSBjb252ZXJ0VG9UZW5zb3IodHJhbnNmb3JtcywgJ3RyYW5zZm9ybXMnLCAndHJhbnNmb3JtJywgJ2Zsb2F0MzInKTtcbiAgICB1dGlsLmFzc2VydCgkaW1hZ2UucmFuayA9PT0gNCwgKCkgPT4gJ0Vycm9yIGluIHRyYW5zZm9ybTogaW1hZ2UgbXVzdCBiZSByYW5rIDQsJyArXG4gICAgICAgIGBidXQgZ290IHJhbmsgJHskaW1hZ2UucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoJHRyYW5zZm9ybXMucmFuayA9PT0gMiAmJlxuICAgICAgICAoJHRyYW5zZm9ybXMuc2hhcGVbMF0gPT09ICRpbWFnZS5zaGFwZVswXSB8fFxuICAgICAgICAgICAgJHRyYW5zZm9ybXMuc2hhcGVbMF0gPT09IDEpICYmXG4gICAgICAgICR0cmFuc2Zvcm1zLnNoYXBlWzFdID09PSA4LCAoKSA9PiBgRXJyb3IgaW4gdHJhbnNmb3JtOiBJbnB1dCB0cmFuc2Zvcm0gc2hvdWxkIGJlIGJhdGNoIHggOCBvciAxIHggOGApO1xuICAgIHV0aWwuYXNzZXJ0KG91dHB1dFNoYXBlID09IG51bGwgfHwgb3V0cHV0U2hhcGUubGVuZ3RoID09PSAyLCAoKSA9PiAnRXJyb3IgaW4gdHJhbnNmb3JtOiBvdXRwdXRTaGFwZSBtdXN0IGJlIFtoZWlnaHQsIHdpZHRoXSBvciBudWxsLCAnICtcbiAgICAgICAgYGJ1dCBnb3QgJHtvdXRwdXRTaGFwZX0uYCk7XG4gICAgY29uc3QgaW5wdXRzID0geyBpbWFnZTogJGltYWdlLCB0cmFuc2Zvcm1zOiAkdHJhbnNmb3JtcyB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBpbnRlcnBvbGF0aW9uLCBmaWxsTW9kZSwgZmlsbFZhbHVlLCBvdXRwdXRTaGFwZSB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFRyYW5zZm9ybSwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgdHJhbnNmb3JtID0gb3AoeyB0cmFuc2Zvcm1fIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHJhbnNmb3JtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnQsIGFzc2VydFNoYXBlc01hdGNoLCBnZXRUeXBlZEFycmF5RnJvbURUeXBlIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyB0ZW5zb3IgfSBmcm9tICcuL3RlbnNvcic7XG4vKipcbiAqIFJldHVybnMgd2hldGhlciB0aGUgdGFyZ2V0cyBhcmUgaW4gdGhlIHRvcCBLIHByZWRpY3Rpb25zLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBwcmVkaWN0aW9ucyA9IHRmLnRlbnNvcjJkKFtbMjAsIDEwLCA0MCwgMzBdLCBbMzAsIDUwLCAtMjAsIDEwXV0pO1xuICogY29uc3QgdGFyZ2V0cyA9IHRmLnRlbnNvcjFkKFsyLCAwXSk7XG4gKiBjb25zdCBwcmVjaXNpb24gPSBhd2FpdCB0Zi5pblRvcEtBc3luYyhwcmVkaWN0aW9ucywgdGFyZ2V0cyk7XG4gKiBwcmVjaXNpb24ucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIHByZWRpY3Rpb25zIDItRCBvciBoaWdoZXIgYHRmLlRlbnNvcmAgd2l0aCBsYXN0IGRpbWVuc2lvbiBiZWluZ1xuICogICAgIGF0IGxlYXN0IGBrYC5cbiAqIEBwYXJhbSB0YXJnZXRzIDEtRCBvciBoaWdoZXIgYHRmLlRlbnNvcmAuXG4gKiBAcGFyYW0gayBPcHRpb25hbCBOdW1iZXIgb2YgdG9wIGVsZW1lbnRzIHRvIGxvb2sgYXQgZm9yIGNvbXB1dGluZyBwcmVjaXNpb24sXG4gKiAgICAgZGVmYXVsdCB0byAxLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0V2YWx1YXRpb24nfVxuICovXG5hc3luYyBmdW5jdGlvbiBpblRvcEtBc3luY18ocHJlZGljdGlvbnMsIHRhcmdldHMsIGsgPSAxKSB7XG4gICAgY29uc3QgJHByZWRpY3Rpb25zID0gY29udmVydFRvVGVuc29yKHByZWRpY3Rpb25zLCAncHJlZGljdGlvbnMnLCAnaW5Ub3BLJyk7XG4gICAgY29uc3QgJHRhcmdldHMgPSBjb252ZXJ0VG9UZW5zb3IodGFyZ2V0cywgJ3RhcmdldHMnLCAnaW5Ub3BLJyk7XG4gICAgYXNzZXJ0KCRwcmVkaWN0aW9ucy5yYW5rID4gMSwgKCkgPT4gJ2luVG9wSygpIGV4cGVjdHMgdGhlIHByZWRpY3Rpb25zIHRvIGJlIG9mIHJhbmsgMiBvciBoaWdoZXIsICcgK1xuICAgICAgICBgYnV0IGdvdCAkeyRwcmVkaWN0aW9ucy5yYW5rfWApO1xuICAgIGFzc2VydCgkcHJlZGljdGlvbnMucmFuayAtIDEgPT09ICR0YXJnZXRzLnJhbmssICgpID0+IGBwcmVkaWN0aW9ucyByYW5rIHNob3VsZCBiZSAxIGxhcmdlciB0aGFuIGAgK1xuICAgICAgICBgdGFyZ2V0cyByYW5rLCBidXQgZ290IHByZWRpY3Rpb25zIHJhbmsgYCArXG4gICAgICAgIGAkeyRwcmVkaWN0aW9ucy5yYW5rfSBhbmQgdGFyZ2V0cyByYW5rICR7JHRhcmdldHMucmFua31gKTtcbiAgICBhc3NlcnRTaGFwZXNNYXRjaCgkcHJlZGljdGlvbnMuc2hhcGUuc2xpY2UoMCwgJHByZWRpY3Rpb25zLnNoYXBlLmxlbmd0aCAtIDEpLCAkdGFyZ2V0cy5zaGFwZSwgYHByZWRpY3Rpb25zJ3Mgc2hhcGUgc2hvdWxkIGJlIGFsaWduIHdpdGggdGhlIHRhcmdldHMnIHNoYXBlLCBgICtcbiAgICAgICAgJ2V4Y2VwdCB0aGUgbGFzdCBkaW1lbnNpb24uJyk7XG4gICAgY29uc3QgbGFzdERpbSA9ICRwcmVkaWN0aW9ucy5zaGFwZVskcHJlZGljdGlvbnMuc2hhcGUubGVuZ3RoIC0gMV07XG4gICAgYXNzZXJ0KGsgPiAwICYmIGsgPD0gbGFzdERpbSwgKCkgPT4gYCdrJyBwYXNzZWQgdG8gaW5Ub3BLKCkgbXVzdCBiZSA+IDAgJiYgPD0gdGhlIHByZWRpY3Rpb25zIGxhc3QgYCArXG4gICAgICAgIGBkaW1lbnNpb24gKCR7bGFzdERpbX0pLCBidXQgZ290ICR7a31gKTtcbiAgICBjb25zdCBwcmVkaWN0aW9uc1ZhbHMgPSBhd2FpdCAkcHJlZGljdGlvbnMuZGF0YSgpO1xuICAgIGNvbnN0IHRhcmdldHNWYWxzID0gYXdhaXQgJHRhcmdldHMuZGF0YSgpO1xuICAgIC8vIFJlc2hhcGUgcHJlZGljdGlvbnNWYWxzIGludG8gYSAyZCB0ZW5zb3IgW2JhdGNoLCBsYXN0RGltXVxuICAgIC8vIGFuZCBsb29rIHVwIHRvcEsgYWxvbmcgbGFzdERpbS5cbiAgICBjb25zdCBbYmF0Y2gsIHNpemVdID0gW3ByZWRpY3Rpb25zVmFscy5sZW5ndGggLyBsYXN0RGltLCBsYXN0RGltXTtcbiAgICBjb25zdCBwcmVjaXNpb24gPSBnZXRUeXBlZEFycmF5RnJvbURUeXBlKCdib29sJywgYmF0Y2gpO1xuICAgIGZvciAobGV0IGIgPSAwOyBiIDwgYmF0Y2g7IGIrKykge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBiICogc2l6ZTtcbiAgICAgICAgY29uc3QgdmFscyA9IHByZWRpY3Rpb25zVmFscy5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIHNpemUpO1xuICAgICAgICBjb25zdCB2YWxBbmRJbmQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YWxBbmRJbmQucHVzaCh7IHZhbHVlOiB2YWxzW2ldLCBpbmRleDogaSB9KTtcbiAgICAgICAgfVxuICAgICAgICB2YWxBbmRJbmQuc29ydCgoYSwgYikgPT4gYi52YWx1ZSAtIGEudmFsdWUpO1xuICAgICAgICBwcmVjaXNpb25bYl0gPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGs7IGkrKykge1xuICAgICAgICAgICAgaWYgKHZhbEFuZEluZFtpXS5pbmRleCA9PT0gdGFyZ2V0c1ZhbHNbYl0pIHtcbiAgICAgICAgICAgICAgICBwcmVjaXNpb25bYl0gPSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChwcmVkaWN0aW9ucyAhPT0gJHByZWRpY3Rpb25zKSB7XG4gICAgICAgICRwcmVkaWN0aW9ucy5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGlmICh0YXJnZXRzICE9PSAkdGFyZ2V0cykge1xuICAgICAgICAkdGFyZ2V0cy5kaXNwb3NlKCk7XG4gICAgfVxuICAgIC8vIE91dHB1dCBwcmVjaXNpb24gaGFzIHRoZSBzYW1lIHNoYXBlIGFzIHRhcmdldHMuXG4gICAgcmV0dXJuIHRlbnNvcihwcmVjaXNpb24sICR0YXJnZXRzLnNoYXBlLCAnYm9vbCcpO1xufVxuZXhwb3J0IGNvbnN0IGluVG9wS0FzeW5jID0gaW5Ub3BLQXN5bmNfO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5fdG9wX2suanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IElzRmluaXRlIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV0dXJucyB3aGljaCBlbGVtZW50cyBvZiB4IGFyZSBmaW5pdGUuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbTmFOLCBJbmZpbml0eSwgLUluZmluaXR5LCAwLCAxXSk7XG4gKlxuICogeC5pc0Zpbml0ZSgpLnByaW50KCk7ICAvLyBvciB0Zi5pc05hTih4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgVGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBpc0Zpbml0ZV8oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2lzRmluaXRlJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKElzRmluaXRlLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGlzRmluaXRlID0gb3AoeyBpc0Zpbml0ZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pc19maW5pdGUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IElzSW5mIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV0dXJucyB3aGljaCBlbGVtZW50cyBvZiB4IGFyZSBJbmZpbml0eSBvciAtSW5maW5pdHkuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbTmFOLCBJbmZpbml0eSwgLUluZmluaXR5LCAwLCAxXSk7XG4gKlxuICogeC5pc0luZigpLnByaW50KCk7ICAvLyBvciB0Zi5pc05hTih4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgVGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBpc0luZl8oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2lzSW5mJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKElzSW5mLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGlzSW5mID0gb3AoeyBpc0luZl8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pc19pbmYuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IElzTmFuIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUlJldHVybnMgd2hpY2ggZWxlbWVudHMgb2YgeCBhcmUgTmFOLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoW05hTiwgSW5maW5pdHksIC1JbmZpbml0eSwgMCwgMV0pO1xuICpcbiAqIHguaXNOYU4oKS5wcmludCgpOyAgLy8gb3IgdGYuaXNOYU4oeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IFRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gaXNOYU5fKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdpc05hTicpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChJc05hbiwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBpc05hTiA9IG9wKHsgaXNOYU5fIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXNfbmFuLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBMZWFreVJlbHUgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBsZWFreSByZWN0aWZpZWQgbGluZWFyIGVsZW1lbnQtd2lzZS5cbiAqXG4gKiBTZWVcbiAqIFtodHRwOi8vd2ViLnN0YW5mb3JkLmVkdS9+YXduaS9wYXBlcnMvcmVsdV9oeWJyaWRfaWNtbDIwMTNfZmluYWwucGRmXShcbiAqICAgICBodHRwOi8vd2ViLnN0YW5mb3JkLmVkdS9+YXduaS9wYXBlcnMvcmVsdV9oeWJyaWRfaWNtbDIwMTNfZmluYWwucGRmKVxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWy0xLCAyLCAtMywgNF0pO1xuICpcbiAqIHgubGVha3lSZWx1KDAuMSkucHJpbnQoKTsgIC8vIG9yIHRmLmxlYWt5UmVsdSh4LCAwLjEpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gYWxwaGEgVGhlIHNjYWxpbmcgZmFjdG9yIGZvciBuZWdhdGl2ZSB2YWx1ZXMsIGRlZmF1bHRzIHRvIDAuMi5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gbGVha3lSZWx1Xyh4LCBhbHBoYSA9IDAuMikge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2xlYWt5UmVsdScpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICBjb25zdCBhdHRycyA9IHsgYWxwaGEgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChMZWFreVJlbHUsIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IGxlYWt5UmVsdSA9IG9wKHsgbGVha3lSZWx1XyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxlYWt5X3JlbHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IExlc3MgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgbWFrZVR5cGVzTWF0Y2ggfSBmcm9tICcuLi90ZW5zb3JfdXRpbCc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUgfSBmcm9tICcuL2Jyb2FkY2FzdF91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSB0cnV0aCB2YWx1ZSBvZiAoYSA8IGIpIGVsZW1lbnQtd2lzZS4gU3VwcG9ydHMgYnJvYWRjYXN0aW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbMiwgMiwgMl0pO1xuICpcbiAqIGEubGVzcyhiKS5wcmludCgpO1xuICogYGBgXG4gKiBAcGFyYW0gYSBUaGUgZmlyc3QgaW5wdXQgdGVuc29yLlxuICogQHBhcmFtIGIgVGhlIHNlY29uZCBpbnB1dCB0ZW5zb3IuIE11c3QgaGF2ZSB0aGUgc2FtZSBkdHlwZSBhcyBgYWAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTG9naWNhbCd9XG4gKi9cbmZ1bmN0aW9uIGxlc3NfKGEsIGIpIHtcbiAgICBsZXQgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnbGVzcycsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICAgIGxldCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdsZXNzJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG4gICAgWyRhLCAkYl0gPSBtYWtlVHlwZXNNYXRjaCgkYSwgJGIpO1xuICAgIGFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKCRhLnNoYXBlLCAkYi5zaGFwZSk7XG4gICAgY29uc3QgaW5wdXRzID0geyBhOiAkYSwgYjogJGIgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChMZXNzLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGxlc3MgPSBvcCh7IGxlc3NfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bGVzcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTGVzc0VxdWFsIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IG1ha2VUeXBlc01hdGNoIH0gZnJvbSAnLi4vdGVuc29yX3V0aWwnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlIH0gZnJvbSAnLi9icm9hZGNhc3RfdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV0dXJucyB0aGUgdHJ1dGggdmFsdWUgb2YgKGEgPD0gYikgZWxlbWVudC13aXNlLiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFsyLCAyLCAyXSk7XG4gKlxuICogYS5sZXNzRXF1YWwoYikucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBpbnB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIGlucHV0IHRlbnNvci4gTXVzdCBoYXZlIHRoZSBzYW1lIGR0eXBlIGFzIGBhYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdMb2dpY2FsJ31cbiAqL1xuZnVuY3Rpb24gbGVzc0VxdWFsXyhhLCBiKSB7XG4gICAgbGV0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ2xlc3NFcXVhbCcsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICAgIGxldCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdsZXNzRXF1YWwnLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgICBbJGEsICRiXSA9IG1ha2VUeXBlc01hdGNoKCRhLCAkYik7XG4gICAgYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoJGEuc2hhcGUsICRiLnNoYXBlKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGE6ICRhLCBiOiAkYiB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKExlc3NFcXVhbCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBsZXNzRXF1YWwgPSBvcCh7IGxlc3NFcXVhbF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sZXNzX2VxdWFsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IGdyZWF0ZXJFcXVhbCB9IGZyb20gJy4uL2dyZWF0ZXJfZXF1YWwnO1xuaW1wb3J0IHsgbGVzc0VxdWFsIH0gZnJvbSAnLi4vbGVzc19lcXVhbCc7XG5pbXBvcnQgeyBsb2dpY2FsQW5kIH0gZnJvbSAnLi4vbG9naWNhbF9hbmQnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmFuZ2UgfSBmcm9tICcuLi9yYW5nZSc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi4vcmVzaGFwZSc7XG5pbXBvcnQgeyBzY2FsYXIgfSBmcm9tICcuLi9zY2FsYXInO1xuaW1wb3J0IHsgc3RhY2sgfSBmcm9tICcuLi9zdGFjayc7XG5pbXBvcnQgeyBzdWIgfSBmcm9tICcuLi9zdWInO1xuaW1wb3J0IHsgdW5zdGFjayB9IGZyb20gJy4uL3Vuc3RhY2snO1xuaW1wb3J0IHsgd2hlcmUgfSBmcm9tICcuLi93aGVyZSc7XG5pbXBvcnQgeyB6ZXJvcyB9IGZyb20gJy4uL3plcm9zJztcbi8qKlxuICogQ29weSBhIHRlbnNvciBzZXR0aW5nIGV2ZXJ5dGhpbmcgb3V0c2lkZSBhIGNlbnRyYWwgYmFuZCBpbiBlYWNoIGlubmVybW9zdFxuICogbWF0cml4IHRvIHplcm8uXG4gKlxuICogVGhlIGJhbmQgcGFydCBpcyBjb21wdXRlZCBhcyBmb2xsb3dzOiBBc3N1bWUgaW5wdXQgaGFzIGBrYCBkaW1lbnNpb25zXG4gKiBgW0ksIEosIEssIC4uLiwgTSwgTl1gLCB0aGVuIHRoZSBvdXRwdXQgaXMgYSB0ZW5zb3Igd2l0aCB0aGUgc2FtZSBzaGFwZSB3aGVyZVxuICogYGJhbmRbaSwgaiwgaywgLi4uLCBtLCBuXSA9IGluX2JhbmQobSwgbikgKiBpbnB1dFtpLCBqLCBrLCAuLi4sIG0sIG5dYC5cbiAqIFRoZSBpbmRpY2F0b3IgZnVuY3Rpb25cbiAqIGBpbl9iYW5kKG0sIG4pID0gKG51bV9sb3dlciA8IDAgfHwgKG0tbikgPD0gbnVtX2xvd2VyKSlgXG4gKiBgJiYgKG51bV91cHBlciA8IDAgfHwgKG4tbSkgPD0gbnVtX3VwcGVyKWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjJkKFtbIDAsICAxLCAgMiwgM10sXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIFstMSwgIDAsICAxLCAyXSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgWy0yLCAtMSwgIDAsIDFdLFxuICogICAgICAgICAgICAgICAgICAgICAgICBbLTMsIC0yLCAtMSwgMF1dKTtcbiAqIGxldCB5ID0gdGYubGluYWxnLmJhbmRQYXJ0KHgsIDEsIC0xKTtcbiAqIHkucHJpbnQoKTsgLy8gW1sgMCwgIDEsICAyLCAzXSxcbiAqICAgICAgICAgICAgLy8gIFstMSwgIDAsICAxLCAyXSxcbiAqICAgICAgICAgICAgLy8gIFsgMCwgLTEsICAwLCAxXSxcbiAqICAgICAgICAgICAgLy8gIFsgMCwgMCAsIC0xLCAwXV1cbiAqIGxldCB6ID0gdGYubGluYWxnLmJhbmRQYXJ0KHgsIDIsIDEpO1xuICogei5wcmludCgpOyAvLyBbWyAwLCAgMSwgIDAsIDBdLFxuICogICAgICAgICAgICAvLyAgWy0xLCAgMCwgIDEsIDBdLFxuICogICAgICAgICAgICAvLyAgWy0yLCAtMSwgIDAsIDFdLFxuICogICAgICAgICAgICAvLyAgWyAwLCAtMiwgLTEsIDBdXVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggUmFuayBga2AgdGVuc29yXG4gKiBAcGFyYW0gbnVtTG93ZXIgTnVtYmVyIG9mIHN1YmRpYWdvbmFscyB0byBrZWVwLlxuICogICBJZiBuZWdhdGl2ZSwga2VlcCBlbnRpcmUgbG93ZXIgdHJpYW5nbGUuXG4gKiBAcGFyYW0gbnVtVXBwZXIgTnVtYmVyIG9mIHN1YmRpYWdvbmFscyB0byBrZWVwLlxuICogICBJZiBuZWdhdGl2ZSwga2VlcCBlbnRpcmUgdXBwZXIgdHJpYW5nbGUuXG4gKiBAcmV0dXJucyBSYW5rIGBrYCB0ZW5zb3Igb2YgdGhlIHNhbWUgc2hhcGUgYXMgaW5wdXQuXG4gKiAgIFRoZSBleHRyYWN0ZWQgYmFuZGVkIHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOidPcGVyYXRpb25zJywgc3ViaGVhZGluZzonTGluZWFyIEFsZ2VicmEnLCBuYW1lc3BhY2U6J2xpbmFsZyd9XG4gKi9cbmZ1bmN0aW9uIGJhbmRQYXJ0XyhhLCBudW1Mb3dlciwgbnVtVXBwZXIpIHtcbiAgICBhc3NlcnQobnVtTG93ZXIgJSAxID09PSAwLCAoKSA9PiBgYmFuZFBhcnQoKTogbnVtTG93ZXIgbXVzdCBiZSBhbiBpbnRlZ2VyLCBnb3QgJHtudW1Mb3dlcn0uYCk7XG4gICAgYXNzZXJ0KG51bVVwcGVyICUgMSA9PT0gMCwgKCkgPT4gYGJhbmRQYXJ0KCk6IG51bVVwcGVyIG11c3QgYmUgYW4gaW50ZWdlciwgZ290ICR7bnVtVXBwZXJ9LmApO1xuICAgIGNvbnN0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ2JhbmRQYXJ0Jyk7XG4gICAgYXNzZXJ0KCRhLnJhbmsgPj0gMiwgKCkgPT4gYGJhbmRQYXJ0KCk6IFJhbmsgbXVzdCBiZSBhdCBsZWFzdCAyLCBnb3QgJHskYS5yYW5rfS5gKTtcbiAgICBjb25zdCBzaGFwZSA9ICRhLnNoYXBlO1xuICAgIGNvbnN0IFtNLCBOXSA9ICRhLnNoYXBlLnNsaWNlKC0yKTtcbiAgICBpZiAoIShudW1Mb3dlciA8PSBNKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGJhbmRQYXJ0KCk6IG51bUxvd2VyICgke251bUxvd2VyfSlgICtcbiAgICAgICAgICAgIGAgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2Ygcm93cyAoJHtNfSkuYCk7XG4gICAgfVxuICAgIGlmICghKG51bVVwcGVyIDw9IE4pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgYmFuZFBhcnQoKTogbnVtVXBwZXIgKCR7bnVtVXBwZXJ9KWAgK1xuICAgICAgICAgICAgYCBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBjb2x1bW5zICgke059KS5gKTtcbiAgICB9XG4gICAgaWYgKG51bUxvd2VyIDwgMCkge1xuICAgICAgICBudW1Mb3dlciA9IE07XG4gICAgfVxuICAgIGlmIChudW1VcHBlciA8IDApIHtcbiAgICAgICAgbnVtVXBwZXIgPSBOO1xuICAgIH1cbiAgICBjb25zdCBpID0gcmVzaGFwZShyYW5nZSgwLCBNLCAxLCAnaW50MzInKSwgWy0xLCAxXSk7XG4gICAgY29uc3QgaiA9IHJhbmdlKDAsIE4sIDEsICdpbnQzMicpO1xuICAgIGNvbnN0IGlqID0gc3ViKGksIGopO1xuICAgIGNvbnN0IGluQmFuZCA9IGxvZ2ljYWxBbmQobGVzc0VxdWFsKGlqLCBzY2FsYXIoK251bUxvd2VyLCAnaW50MzInKSksIGdyZWF0ZXJFcXVhbChpaiwgc2NhbGFyKC1udW1VcHBlciwgJ2ludDMyJykpKTtcbiAgICBjb25zdCB6ZXJvID0gemVyb3MoW00sIE5dLCAkYS5kdHlwZSk7XG4gICAgcmV0dXJuIHJlc2hhcGUoc3RhY2sodW5zdGFjayhyZXNoYXBlKCRhLCBbLTEsIE0sIE5dKSlcbiAgICAgICAgLm1hcChtYXQgPT4gd2hlcmUoaW5CYW5kLCBtYXQsIHplcm8pKSksIHNoYXBlKTtcbn1cbmV4cG9ydCBjb25zdCBiYW5kUGFydCA9IG9wKHsgYmFuZFBhcnRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmFuZF9wYXJ0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IGRpdiB9IGZyb20gJy4uL2Rpdic7XG5pbXBvcnQgeyBtdWwgfSBmcm9tICcuLi9tdWwnO1xuaW1wb3J0IHsgbm9ybSB9IGZyb20gJy4uL25vcm0nO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgc3BsaXQgfSBmcm9tICcuLi9zcGxpdCc7XG5pbXBvcnQgeyBzcXVlZXplIH0gZnJvbSAnLi4vc3F1ZWV6ZSc7XG5pbXBvcnQgeyBzdGFjayB9IGZyb20gJy4uL3N0YWNrJztcbmltcG9ydCB7IHN1YiB9IGZyb20gJy4uL3N1Yic7XG5pbXBvcnQgeyBzdW0gfSBmcm9tICcuLi9zdW0nO1xuLyoqXG4gKiBHcmFtLVNjaG1pZHQgb3J0aG9nb25hbGl6YXRpb24uXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IyZChbWzEsIDJdLCBbMywgNF1dKTtcbiAqIGxldCB5ID0gdGYubGluYWxnLmdyYW1TY2htaWR0KHgpO1xuICogeS5wcmludCgpO1xuICogY29uc29sZS5sb2coJ090aG9nb25hbGl6ZWQ6Jyk7XG4gKiB5LmRvdCh5LnRyYW5zcG9zZSgpKS5wcmludCgpOyAgLy8gc2hvdWxkIGJlIG5lYXJseSB0aGUgaWRlbnRpdHkgbWF0cml4LlxuICogY29uc29sZS5sb2coJ0ZpcnN0IHJvdyBkaXJlY3Rpb24gbWFpbnRhaW5lZDonKTtcbiAqIGNvbnN0IGRhdGEgPSBhd2FpdCB5LmFycmF5KCk7XG4gKiBjb25zb2xlLmxvZyhkYXRhWzBdWzFdIC8gZGF0YVswXVswXSk7ICAvLyBzaG91bGQgYmUgbmVhcmx5IDIuXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geHMgVGhlIHZlY3RvcnMgdG8gYmUgb3J0aG9nb25hbGl6ZWQsIGluIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZ1xuICogICBmb3JtYXRzOlxuICogICAtIEFuIEFycmF5IG9mIGB0Zi5UZW5zb3IxRGAuXG4gKiAgIC0gQSBgdGYuVGVuc29yMkRgLCBpLmUuLCBhIG1hdHJpeCwgaW4gd2hpY2ggY2FzZSB0aGUgdmVjdG9ycyBhcmUgdGhlIHJvd3NcbiAqICAgICBvZiBgeHNgLlxuICogICBJbiBlYWNoIGNhc2UsIGFsbCB0aGUgdmVjdG9ycyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFuZCB0aGUgbGVuZ3RoXG4gKiAgIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgdmVjdG9ycy5cbiAqIEByZXR1cm5zIFRoZSBvcnRob2dvbmFsaXplZCBhbmQgbm9ybWFsaXplZCB2ZWN0b3JzIG9yIG1hdHJpeC5cbiAqICAgT3J0aG9nb25hbGl6YXRpb24gbWVhbnMgdGhhdCB0aGUgdmVjdG9ycyBvciB0aGUgcm93cyBvZiB0aGUgbWF0cml4XG4gKiAgIGFyZSBvcnRob2dvbmFsICh6ZXJvIGlubmVyIHByb2R1Y3RzKS4gTm9ybWFsaXphdGlvbiBtZWFucyB0aGF0IGVhY2hcbiAqICAgdmVjdG9yIG9yIGVhY2ggcm93IG9mIHRoZSBtYXRyaXggaGFzIGFuIEwyIG5vcm0gdGhhdCBlcXVhbHMgYDFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6J09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOidMaW5lYXIgQWxnZWJyYScsIG5hbWVzcGFjZTonbGluYWxnJ31cbiAqL1xuZnVuY3Rpb24gZ3JhbVNjaG1pZHRfKHhzKSB7XG4gICAgbGV0IGlucHV0SXNUZW5zb3IyRDtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh4cykpIHtcbiAgICAgICAgaW5wdXRJc1RlbnNvcjJEID0gZmFsc2U7XG4gICAgICAgIGFzc2VydCh4cyAhPSBudWxsICYmIHhzLmxlbmd0aCA+IDAsICgpID0+ICdHcmFtLVNjaG1pZHQgcHJvY2VzczogaW5wdXQgbXVzdCBub3QgYmUgbnVsbCwgdW5kZWZpbmVkLCBvciAnICtcbiAgICAgICAgICAgICdlbXB0eScpO1xuICAgICAgICBjb25zdCBkaW0gPSB4c1swXS5zaGFwZVswXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCB4cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgYXNzZXJ0KHhzW2ldLnNoYXBlWzBdID09PSBkaW0sICgpID0+ICdHcmFtLVNjaG1pZHQ6IE5vbi11bmlxdWUgbGVuZ3RocyBmb3VuZCBpbiB0aGUgaW5wdXQgdmVjdG9yczogJyArXG4gICAgICAgICAgICAgICAgYCgke3hzW2ldLnNoYXBlWzBdfSB2cy4gJHtkaW19KWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpbnB1dElzVGVuc29yMkQgPSB0cnVlO1xuICAgICAgICB4cyA9IHNwbGl0KHhzLCB4cy5zaGFwZVswXSwgMCkubWFwKHggPT4gc3F1ZWV6ZSh4LCBbMF0pKTtcbiAgICB9XG4gICAgYXNzZXJ0KHhzLmxlbmd0aCA8PSB4c1swXS5zaGFwZVswXSwgKCkgPT4gYEdyYW0tU2NobWlkdDogTnVtYmVyIG9mIHZlY3RvcnMgKCR7eHMubGVuZ3RofSkgZXhjZWVkcyBgICtcbiAgICAgICAgYG51bWJlciBvZiBkaW1lbnNpb25zICgke3hzWzBdLnNoYXBlWzBdfSkuYCk7XG4gICAgY29uc3QgeXMgPSBbXTtcbiAgICBjb25zdCB4czFkID0geHM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB4cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB5cy5wdXNoKEVOR0lORS50aWR5KCgpID0+IHtcbiAgICAgICAgICAgIGxldCB4ID0geHMxZFtpXTtcbiAgICAgICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaTsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb2ogPSBtdWwoc3VtKG11bCh5c1tqXSwgeCkpLCB5c1tqXSk7XG4gICAgICAgICAgICAgICAgICAgIHggPSBzdWIoeCwgcHJvaik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRpdih4LCBub3JtKHgsICdldWNsaWRlYW4nKSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgaWYgKGlucHV0SXNUZW5zb3IyRCkge1xuICAgICAgICByZXR1cm4gc3RhY2soeXMsIDApO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHlzO1xuICAgIH1cbn1cbmV4cG9ydCBjb25zdCBncmFtU2NobWlkdCA9IG9wKHsgZ3JhbVNjaG1pZHRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z3JhbV9zY2htaWR0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBkaXNwb3NlIH0gZnJvbSAnLi4vLi4vZ2xvYmFscyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IGNsb25lIH0gZnJvbSAnLi4vY2xvbmUnO1xuaW1wb3J0IHsgY29uY2F0IH0gZnJvbSAnLi4vY29uY2F0JztcbmltcG9ydCB7IGRpdiB9IGZyb20gJy4uL2Rpdic7XG5pbXBvcnQgeyBleWUgfSBmcm9tICcuLi9leWUnO1xuaW1wb3J0IHsgZ3JlYXRlciB9IGZyb20gJy4uL2dyZWF0ZXInO1xuaW1wb3J0IHsgbWF0TXVsIH0gZnJvbSAnLi4vbWF0X211bCc7XG5pbXBvcnQgeyBtdWwgfSBmcm9tICcuLi9tdWwnO1xuaW1wb3J0IHsgbmVnIH0gZnJvbSAnLi4vbmVnJztcbmltcG9ydCB7IG5vcm0gfSBmcm9tICcuLi9ub3JtJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuLi9yZXNoYXBlJztcbmltcG9ydCB7IHNsaWNlIH0gZnJvbSAnLi4vc2xpY2UnO1xuaW1wb3J0IHsgc3RhY2sgfSBmcm9tICcuLi9zdGFjayc7XG5pbXBvcnQgeyBzdWIgfSBmcm9tICcuLi9zdWInO1xuaW1wb3J0IHsgdGVuc29yMmQgfSBmcm9tICcuLi90ZW5zb3IyZCc7XG5pbXBvcnQgeyB0cmFuc3Bvc2UgfSBmcm9tICcuLi90cmFuc3Bvc2UnO1xuaW1wb3J0IHsgdW5zdGFjayB9IGZyb20gJy4uL3Vuc3RhY2snO1xuaW1wb3J0IHsgd2hlcmUgfSBmcm9tICcuLi93aGVyZSc7XG4vKipcbiAqIENvbXB1dGUgUVIgZGVjb21wb3NpdGlvbiBvZiBtLWJ5LW4gbWF0cml4IHVzaW5nIEhvdXNlaG9sZGVyIHRyYW5zZm9ybWF0aW9uLlxuICpcbiAqIEltcGxlbWVudGF0aW9uIGJhc2VkIG9uXG4gKiAgIFtodHRwOi8vd3d3LmNzLmNvcm5lbGwuZWR1L35iaW5kZWwvY2xhc3MvY3M2MjEwLWYwOS9sZWMxOC5wZGZdXG4gKiAoaHR0cDovL3d3dy5jcy5jb3JuZWxsLmVkdS9+YmluZGVsL2NsYXNzL2NzNjIxMC1mMDkvbGVjMTgucGRmKVxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMmQoW1sxLCAyXSwgWzMsIDRdXSk7XG4gKiBsZXQgW3EsIHJdID0gdGYubGluYWxnLnFyKGEpO1xuICogY29uc29sZS5sb2coJ1EnKTtcbiAqIHEucHJpbnQoKTtcbiAqIGNvbnNvbGUubG9nKCdSJyk7XG4gKiByLnByaW50KCk7XG4gKiBjb25zb2xlLmxvZygnT3J0aG9nb25hbGl6ZWQnKTtcbiAqIHEuZG90KHEudHJhbnNwb3NlKCkpLnByaW50KCkgIC8vIHNob3VsZCBiZSBuZWFybHkgdGhlIGlkZW50aXR5IG1hdHJpeC5cbiAqIGNvbnNvbGUubG9nKCdSZWNvbnN0cnVjdGVkJyk7XG4gKiBxLmRvdChyKS5wcmludCgpOyAvLyBzaG91bGQgYmUgbmVhcmx5IFtbMSwgMl0sIFszLCA0XV07XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgYHRmLlRlbnNvcmAgdG8gYmUgUVItZGVjb21wb3NlZC4gTXVzdCBoYXZlIHJhbmsgPj0gMi4gU3VwcG9zZVxuICogICBpdCBoYXMgdGhlIHNoYXBlIGBbLi4uLCBNLCBOXWAuXG4gKiBAcGFyYW0gZnVsbE1hdHJpY2VzIEFuIG9wdGlvbmFsIGJvb2xlYW4gcGFyYW1ldGVyLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICogICBJZiBgdHJ1ZWAsIGNvbXB1dGUgZnVsbC1zaXplZCBgUWAuIElmIGBmYWxzZWAgKHRoZSBkZWZhdWx0KSxcbiAqICAgY29tcHV0ZSBvbmx5IHRoZSBsZWFkaW5nIE4gY29sdW1ucyBvZiBgUWAgYW5kIGBSYC5cbiAqIEByZXR1cm5zIEFuIGBBcnJheWAgb2YgdHdvIGB0Zi5UZW5zb3JgczogYFtRLCBSXWAuIGBRYCBpcyBhIHVuaXRhcnkgbWF0cml4LFxuICogICBpLmUuLCBpdHMgY29sdW1ucyBhbGwgaGF2ZSB1bml0IG5vcm0gYW5kIGFyZSBtdXR1YWxseSBvcnRob2dvbmFsLlxuICogICBJZiBgTSA+PSBOYCxcbiAqICAgICBJZiBgZnVsbE1hdHJpY2VzYCBpcyBgZmFsc2VgIChkZWZhdWx0KSxcbiAqICAgICAgIC0gYFFgIGhhcyBhIHNoYXBlIG9mIGBbLi4uLCBNLCBOXWAsXG4gKiAgICAgICAtIGBSYCBoYXMgYSBzaGFwZSBvZiBgWy4uLiwgTiwgTl1gLlxuICogICAgIElmIGBmdWxsTWF0cmljZXNgIGlzIGB0cnVlYCAoZGVmYXVsdCksXG4gKiAgICAgICAtIGBRYCBoYXMgYSBzaGFwZSBvZiBgWy4uLiwgTSwgTV1gLFxuICogICAgICAgLSBgUmAgaGFzIGEgc2hhcGUgb2YgYFsuLi4sIE0sIE5dYC5cbiAqICAgSWYgYE0gPCBOYCxcbiAqICAgICAtIGBRYCBoYXMgYSBzaGFwZSBvZiBgWy4uLiwgTSwgTV1gLFxuICogICAgIC0gYFJgIGhhcyBhIHNoYXBlIG9mIGBbLi4uLCBNLCBOXWAuXG4gKiBAdGhyb3dzIElmIHRoZSByYW5rIG9mIGB4YCBpcyBsZXNzIHRoYW4gMi5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOidPcGVyYXRpb25zJyxcbiAqICAgICAgIHN1YmhlYWRpbmc6J0xpbmVhciBBbGdlYnJhJyxcbiAqICAgICAgIG5hbWVzcGFjZTonbGluYWxnJ31cbiAqL1xuZnVuY3Rpb24gcXJfKHgsIGZ1bGxNYXRyaWNlcyA9IGZhbHNlKSB7XG4gICAgYXNzZXJ0KHgucmFuayA+PSAyLCAoKSA9PiBgcXIoKSByZXF1aXJlcyBpbnB1dCB0ZW5zb3IgdG8gaGF2ZSBhIHJhbmsgPj0gMiwgYnV0IGdvdCByYW5rICR7eC5yYW5rfWApO1xuICAgIGlmICh4LnJhbmsgPT09IDIpIHtcbiAgICAgICAgcmV0dXJuIHFyMmQoeCwgZnVsbE1hdHJpY2VzKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIFJhbmsgPiAyLlxuICAgICAgICAvLyBUT0RPKGNhaXMpOiBCZWxvdyB3ZSBzcGxpdCB0aGUgaW5wdXQgaW50byBpbmRpdmlkdWFsIDJEIHRlbnNvcnMsXG4gICAgICAgIC8vICAgcGVyZm9ybSBRUiBkZWNvbXBvc2l0aW9uIG9uIHRoZW0gYW5kIHRoZW4gc3RhY2sgdGhlIHJlc3VsdHMgYmFja1xuICAgICAgICAvLyAgIHRvZ2V0aGVyLiBXZSBzaG91bGQgZXhwbG9yZSB3aGV0aGVyIHRoaXMgY2FuIGJlIHBhcmFsbGVsaXplZC5cbiAgICAgICAgY29uc3Qgb3V0ZXJEaW1zUHJvZCA9IHguc2hhcGUuc2xpY2UoMCwgeC5zaGFwZS5sZW5ndGggLSAyKVxuICAgICAgICAgICAgLnJlZHVjZSgodmFsdWUsIHByZXYpID0+IHZhbHVlICogcHJldik7XG4gICAgICAgIGNvbnN0IHgyZHMgPSB1bnN0YWNrKHJlc2hhcGUoeCwgW1xuICAgICAgICAgICAgb3V0ZXJEaW1zUHJvZCwgeC5zaGFwZVt4LnNoYXBlLmxlbmd0aCAtIDJdLFxuICAgICAgICAgICAgeC5zaGFwZVt4LnNoYXBlLmxlbmd0aCAtIDFdXG4gICAgICAgIF0pLCAwKTtcbiAgICAgICAgY29uc3QgcTJkcyA9IFtdO1xuICAgICAgICBjb25zdCByMmRzID0gW107XG4gICAgICAgIHgyZHMuZm9yRWFjaCh4MmQgPT4ge1xuICAgICAgICAgICAgY29uc3QgW3EyZCwgcjJkXSA9IHFyMmQoeDJkLCBmdWxsTWF0cmljZXMpO1xuICAgICAgICAgICAgcTJkcy5wdXNoKHEyZCk7XG4gICAgICAgICAgICByMmRzLnB1c2gocjJkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHEgPSByZXNoYXBlKHN0YWNrKHEyZHMsIDApLCB4LnNoYXBlKTtcbiAgICAgICAgY29uc3QgciA9IHJlc2hhcGUoc3RhY2socjJkcywgMCksIHguc2hhcGUpO1xuICAgICAgICByZXR1cm4gW3EsIHJdO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHFyMmQoeCwgZnVsbE1hdHJpY2VzID0gZmFsc2UpIHtcbiAgICByZXR1cm4gRU5HSU5FLnRpZHkoKCkgPT4ge1xuICAgICAgICBhc3NlcnQoeC5zaGFwZS5sZW5ndGggPT09IDIsICgpID0+IGBxcjJkKCkgcmVxdWlyZXMgYSAyRCBUZW5zb3IsIGJ1dCBnb3QgYSAke3guc2hhcGUubGVuZ3RofUQgVGVuc29yLmApO1xuICAgICAgICBjb25zdCBtID0geC5zaGFwZVswXTtcbiAgICAgICAgY29uc3QgbiA9IHguc2hhcGVbMV07XG4gICAgICAgIGxldCBxID0gZXllKG0pOyAvLyBPcnRob2dvbmFsIHRyYW5zZm9ybSBzbyBmYXIuXG4gICAgICAgIGxldCByID0gY2xvbmUoeCk7IC8vIFRyYW5zZm9ybWVkIG1hdHJpeCBzbyBmYXIuXG4gICAgICAgIGNvbnN0IG9uZTJEID0gdGVuc29yMmQoW1sxXV0sIFsxLCAxXSk7XG4gICAgICAgIGxldCB3ID0gY2xvbmUob25lMkQpO1xuICAgICAgICBjb25zdCBpdGVycyA9IG0gPj0gbiA/IG4gOiBtO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGl0ZXJzOyArK2opIHtcbiAgICAgICAgICAgIC8vIFRoaXMgdGlkeSB3aXRoaW4gdGhlIGZvci1sb29wIGVuc3VyZXMgd2UgY2xlYW4gdXAgdGVtcG9yYXJ5XG4gICAgICAgICAgICAvLyB0ZW5zb3JzIGFzIHNvb24gYXMgdGhleSBhcmUgbm8gbG9uZ2VyIG5lZWRlZC5cbiAgICAgICAgICAgIGNvbnN0IHJUZW1wID0gcjtcbiAgICAgICAgICAgIGNvbnN0IHdUZW1wID0gdztcbiAgICAgICAgICAgIGNvbnN0IHFUZW1wID0gcTtcbiAgICAgICAgICAgIFt3LCByLCBxXSA9IEVOR0lORS50aWR5KCgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBGaW5kIEggPSBJIC0gdGF1ICogdyAqIHcnLCB0byBwdXQgemVyb3MgYmVsb3cgUihqLCBqKS5cbiAgICAgICAgICAgICAgICBjb25zdCByakVuZDEgPSBzbGljZShyLCBbaiwgal0sIFttIC0gaiwgMV0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vcm1YID0gbm9ybShyakVuZDEpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJqaiA9IHNsaWNlKHIsIFtqLCBqXSwgWzEsIDFdKTtcbiAgICAgICAgICAgICAgICAvLyBUaGUgc2lnbigpIGZ1bmN0aW9uIHJldHVybnMgMCBvbiAwLCB3aGljaCBjYXVzZXMgZGl2aXNpb24gYnkgemVyby5cbiAgICAgICAgICAgICAgICBjb25zdCBzID0gd2hlcmUoZ3JlYXRlcihyamosIDApLCB0ZW5zb3IyZChbWy0xXV0pLCB0ZW5zb3IyZChbWzFdXSkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHUxID0gc3ViKHJqaiwgbXVsKHMsIG5vcm1YKSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgd1ByZSA9IGRpdihyakVuZDEsIHUxKTtcbiAgICAgICAgICAgICAgICBpZiAod1ByZS5zaGFwZVswXSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICB3ID0gY2xvbmUob25lMkQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdyA9IGNvbmNhdChbXG4gICAgICAgICAgICAgICAgICAgICAgICBvbmUyRCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlKHdQcmUsIFsxLCAwXSwgW3dQcmUuc2hhcGVbMF0gLSAxLCB3UHJlLnNoYXBlWzFdXSlcbiAgICAgICAgICAgICAgICAgICAgXSwgMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHRhdSA9IG5lZyhkaXYobWF0TXVsKHMsIHUxKSwgbm9ybVgpKTtcbiAgICAgICAgICAgICAgICAvLyAtLSBSIDo9IEhSLCBRIDo9IFFILlxuICAgICAgICAgICAgICAgIGNvbnN0IHJqRW5kQWxsID0gc2xpY2UociwgW2osIDBdLCBbbSAtIGosIG5dKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0YXVUaW1lc1cgPSBtdWwodGF1LCB3KTtcbiAgICAgICAgICAgICAgICBjb25zdCB3VCA9IHRyYW5zcG9zZSh3KTtcbiAgICAgICAgICAgICAgICBpZiAoaiA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByID0gc3ViKHJqRW5kQWxsLCBtYXRNdWwodGF1VGltZXNXLCBtYXRNdWwod1QsIHJqRW5kQWxsKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgclRpbWVzVGF1ID0gc3ViKHJqRW5kQWxsLCBtYXRNdWwodGF1VGltZXNXLCBtYXRNdWwod1QsIHJqRW5kQWxsKSkpO1xuICAgICAgICAgICAgICAgICAgICByID0gY29uY2F0KFtzbGljZShyLCBbMCwgMF0sIFtqLCBuXSksIHJUaW1lc1RhdV0sIDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB0YXdUaW1lc1dUID0gdHJhbnNwb3NlKHRhdVRpbWVzVyk7XG4gICAgICAgICAgICAgICAgY29uc3QgcUFsbEpFbmQgPSBzbGljZShxLCBbMCwgal0sIFttLCBxLnNoYXBlWzFdIC0gal0pO1xuICAgICAgICAgICAgICAgIGlmIChqID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHEgPSBzdWIocUFsbEpFbmQsIG1hdE11bChtYXRNdWwocUFsbEpFbmQsIHcpLCB0YXdUaW1lc1dUKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBxVGltZXNUYXUgPSBzdWIocUFsbEpFbmQsIG1hdE11bChtYXRNdWwocUFsbEpFbmQsIHcpLCB0YXdUaW1lc1dUKSk7XG4gICAgICAgICAgICAgICAgICAgIHEgPSBjb25jYXQoW3NsaWNlKHEsIFswLCAwXSwgW20sIGpdKSwgcVRpbWVzVGF1XSwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBbdywgciwgcV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRpc3Bvc2UoW3JUZW1wLCB3VGVtcCwgcVRlbXBdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZ1bGxNYXRyaWNlcyAmJiBtID4gbikge1xuICAgICAgICAgICAgcSA9IHNsaWNlKHEsIFswLCAwXSwgW20sIG5dKTtcbiAgICAgICAgICAgIHIgPSBzbGljZShyLCBbMCwgMF0sIFtuLCBuXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtxLCByXTtcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBxciA9IG9wKHsgcXJfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IExpblNwYWNlIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbi8qKlxuICogUmV0dXJuIGFuIGV2ZW5seSBzcGFjZWQgc2VxdWVuY2Ugb2YgbnVtYmVycyBvdmVyIHRoZSBnaXZlbiBpbnRlcnZhbC5cbiAqXG4gKiBgYGBqc1xuICogdGYubGluc3BhY2UoMCwgOSwgMTApLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSBzdGFydCBUaGUgc3RhcnQgdmFsdWUgb2YgdGhlIHNlcXVlbmNlLlxuICogQHBhcmFtIHN0b3AgVGhlIGVuZCB2YWx1ZSBvZiB0aGUgc2VxdWVuY2UuXG4gKiBAcGFyYW0gbnVtIFRoZSBudW1iZXIgb2YgdmFsdWVzIHRvIGdlbmVyYXRlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpbnNwYWNlKHN0YXJ0LCBzdG9wLCBudW0pIHtcbiAgICBpZiAobnVtIDw9IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgbnVtYmVyIG9mIHZhbHVlcyBzaG91bGQgYmUgcG9zaXRpdmUuJyk7XG4gICAgfVxuICAgIGNvbnN0IGF0dHJzID0geyBzdGFydCwgc3RvcCwgbnVtIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoTGluU3BhY2UsIHt9LCBhdHRycyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1saW5zcGFjZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTFJOIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbi8qKlxuICogTm9ybWFsaXplcyB0aGUgYWN0aXZhdGlvbiBvZiBhIGxvY2FsIG5laWdoYm9yaG9vZCBhY3Jvc3Mgb3Igd2l0aGluXG4gKiBjaGFubmVscy5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLiBUaGUgNC1EIGlucHV0IHRlbnNvciBpcyB0cmVhdGVkIGFzIGEgMy1EIGFycmF5XG4gKiAgICAgb2YgMUQgdmVjdG9ycyAoYWxvbmcgdGhlIGxhc3QgZGltZW5zaW9uKSwgYW5kIGVhY2ggdmVjdG9yIGlzXG4gKiAgICAgbm9ybWFsaXplZCBpbmRlcGVuZGVudGx5LlxuICogQHBhcmFtIGRlcHRoUmFkaXVzIFRoZSBudW1iZXIgb2YgYWRqYWNlbnQgY2hhbm5lbHMgaW4gdGhlIDFEIG5vcm1hbGl6YXRpb25cbiAqICAgICB3aW5kb3cuXG4gKiBAcGFyYW0gYmlhcyBBIGNvbnN0YW50IGJpYXMgdGVybSBmb3IgdGhlIGJhc2lzLlxuICogQHBhcmFtIGFscGhhIEEgc2NhbGUgZmFjdG9yLCB1c3VhbGx5IHBvc2l0aXZlLlxuICogQHBhcmFtIGJldGEgQW4gZXhwb25lbnQuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTm9ybWFsaXphdGlvbid9XG4gKi9cbmZ1bmN0aW9uIGxvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uXyh4LCBkZXB0aFJhZGl1cyA9IDUsIGJpYXMgPSAxLCBhbHBoYSA9IDEsIGJldGEgPSAwLjUpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdsb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbicpO1xuICAgIHV0aWwuYXNzZXJ0KCR4LnJhbmsgPT09IDQgfHwgJHgucmFuayA9PT0gMywgKCkgPT4gYEVycm9yIGluIGxvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uOiB4IG11c3QgYmUgcmFuayAzIG9yIDQgYnV0IGdvdFxuICAgICAgICAgICAgICAgcmFuayAkeyR4LnJhbmt9LmApO1xuICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNJbnQoZGVwdGhSYWRpdXMpLCAoKSA9PiBgRXJyb3IgaW4gbG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb246IGRlcHRoUmFkaXVzIG11c3QgYmUgYW4gYCArXG4gICAgICAgIGBpbnRlZ2VyIGJ1dCBnb3QgZGVwdGhSYWRpdXMgJHtkZXB0aFJhZGl1c30uYCk7XG4gICAgbGV0IHg0RCA9ICR4O1xuICAgIGxldCByZXNoYXBlZFRvNEQgPSBmYWxzZTtcbiAgICBpZiAoJHgucmFuayA9PT0gMykge1xuICAgICAgICByZXNoYXBlZFRvNEQgPSB0cnVlO1xuICAgICAgICB4NEQgPSByZXNoYXBlKCR4LCBbMSwgJHguc2hhcGVbMF0sICR4LnNoYXBlWzFdLCAkeC5zaGFwZVsyXV0pO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6IHg0RCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBkZXB0aFJhZGl1cywgYmlhcywgYWxwaGEsIGJldGEgfTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgY29uc3QgcmVzID0gRU5HSU5FLnJ1bktlcm5lbChMUk4sIGlucHV0cywgYXR0cnMpO1xuICAgIGlmIChyZXNoYXBlZFRvNEQpIHtcbiAgICAgICAgcmV0dXJuIHJlc2hhcGUocmVzLCBbcmVzLnNoYXBlWzFdLCByZXMuc2hhcGVbMl0sIHJlcy5zaGFwZVszXV0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG59XG5leHBvcnQgY29uc3QgbG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb24gPSBvcCh7IGxvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxvY2FsX3Jlc3BvbnNlX25vcm1hbGl6YXRpb24uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IExvZyB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIG5hdHVyYWwgbG9nYXJpdGhtIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6IGBsbih4KWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCBNYXRoLkVdKTtcbiAqXG4gKiB4LmxvZygpLnByaW50KCk7ICAvLyBvciB0Zi5sb2coeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gbG9nXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnbG9nJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKExvZywgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBsb2cgPSBvcCh7IGxvZ18gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sb2cuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IExvZzFwIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgbmF0dXJhbCBsb2dhcml0aG0gb2YgdGhlIGlucHV0IGB0Zi5UZW5zb3JgIHBsdXMgb25lXG4gKiBlbGVtZW50LXdpc2U6IGBsbigxICsgeClgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgTWF0aC5FIC0gMV0pO1xuICpcbiAqIHgubG9nMXAoKS5wcmludCgpOyAgLy8gb3IgdGYubG9nMXAoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gbG9nMXBfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdsb2cxcCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChMb2cxcCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBsb2cxcCA9IG9wKHsgbG9nMXBfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG9nMXAuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY3VzdG9tR3JhZCB9IGZyb20gJy4uL2dyYWRpZW50cyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi9tdWwnO1xuaW1wb3J0IHsgbmVnIH0gZnJvbSAnLi9uZWcnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyBzaWdtb2lkIH0gZnJvbSAnLi9zaWdtb2lkJztcbmltcG9ydCB7IHNvZnRwbHVzIH0gZnJvbSAnLi9zb2Z0cGx1cyc7XG4vKipcbiAqIENvbXB1dGVzIGxvZyBzaWdtb2lkIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6XG4gKiBgbG9nU2lnbW9pZCh4KWAuIEZvciBudW1lcmljYWwgc3RhYmlsaXR5LCB3ZSB1c2UgYC10Zi5zb2Z0cGx1cygteClgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzAsIDEsIC0xLCAuN10pO1xuICpcbiAqIHgubG9nU2lnbW9pZCgpLnByaW50KCk7ICAvLyBvciB0Zi5sb2dTaWdtb2lkKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGxvZ1NpZ21vaWRfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdsb2dTaWdtb2lkJyk7XG4gICAgLy8gVXNlIGEgY3VzdG9tIGdyYWRpZW50IHRvIG1haW50YWluIHByZXZpb3VzIGltcGxlbWVudGF0aW9uLlxuICAgIC8vIFRoZXJlIGlzIG5vIExvZ1NpZ21vaWQga2VybmVsIGluIFRGIHNvIHdlIGNhbid0IHVzZSBlbmdpbmUucnVuS2VybmVsXG4gICAgLy8gZGlyZWN0bHlcbiAgICBjb25zdCBjdXN0b21PcCA9IGN1c3RvbUdyYWQoKHgpID0+IHtcbiAgICAgICAgLy8gVE9ETyh5YXNzb2diYSkgd2UgY2FuIHJlbW92ZSB0aGUgY2hhaW5lZCBzb2Z0cGx1cyBjYWxsIGhlcmUgb25seVxuICAgICAgICAvLyBhZnRlciBiYWNrZW5kcyBoYXZlIG1vZHVhbHJpemVkIHNvZnRwbHVzIGF0IHdoaWNoIHBvaW50IHdlIGNhbiBjYWxsXG4gICAgICAgIC8vIGVuZ2luZSBydW5LZXJuZWwoLi4uLCBTb3RmcGx1cywgLi4uKSBkaXJlY3RseS5cbiAgICAgICAgY29uc3QgdmFsdWUgPSBuZWcoc29mdHBsdXMobmVnKHgpKSk7XG4gICAgICAgIGNvbnN0IGdyYWRGdW5jID0gKGR5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkZXJYID0gbXVsKGR5LCBzaWdtb2lkKG5lZyh4KSkpO1xuICAgICAgICAgICAgcmV0dXJuIGRlclg7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB7IHZhbHVlLCBncmFkRnVuYyB9O1xuICAgIH0pO1xuICAgIHJldHVybiBjdXN0b21PcCgkeCk7XG59XG5leHBvcnQgY29uc3QgbG9nU2lnbW9pZCA9IG9wKHsgbG9nU2lnbW9pZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sb2dfc2lnbW9pZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjdXN0b21HcmFkIH0gZnJvbSAnLi4vZ3JhZGllbnRzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBjYXN0IH0gZnJvbSAnLi9jYXN0JztcbmltcG9ydCB7IGV4cCB9IGZyb20gJy4vZXhwJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nJztcbmltcG9ydCB7IG1heCB9IGZyb20gJy4vbWF4JztcbmltcG9ydCB7IG11bCB9IGZyb20gJy4vbXVsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgc3ViIH0gZnJvbSAnLi9zdWInO1xuaW1wb3J0IHsgc3VtIH0gZnJvbSAnLi9zdW0nO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgbG9nIHNvZnRtYXguXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICpcbiAqIGEubG9nU29mdG1heCgpLnByaW50KCk7ICAvLyBvciB0Zi5sb2dTb2Z0bWF4KGEpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjJkKFsyLCA0LCA2LCAxLCAyLCAzXSwgWzIsIDNdKTtcbiAqXG4gKiBhLmxvZ1NvZnRtYXgoKS5wcmludCgpOyAgLy8gb3IgdGYubG9nU29mdG1heChhKVxuICogYGBgXG4gKlxuICogQHBhcmFtIGxvZ2l0cyBUaGUgbG9naXRzIGFycmF5LlxuICogQHBhcmFtIGF4aXMgVGhlIGRpbWVuc2lvbiBzb2Z0bWF4IHdvdWxkIGJlIHBlcmZvcm1lZCBvbi4gRGVmYXVsdHMgdG8gYC0xYFxuICogICAgIHdoaWNoIGluZGljYXRlcyB0aGUgbGFzdCBkaW1lbnNpb24uXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTm9ybWFsaXphdGlvbid9XG4gKi9cbmZ1bmN0aW9uIGxvZ1NvZnRtYXhfKGxvZ2l0cywgYXhpcyA9IC0xKSB7XG4gICAgY29uc3QgJGxvZ2l0cyA9IGNvbnZlcnRUb1RlbnNvcihsb2dpdHMsICdsb2dpdHMnLCAnbG9nU29mdG1heCcpO1xuICAgIGlmIChheGlzID09PSAtMSkge1xuICAgICAgICBheGlzID0gJGxvZ2l0cy5yYW5rIC0gMTtcbiAgICB9XG4gICAgaWYgKGF4aXMgIT09ICRsb2dpdHMucmFuayAtIDEpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJ0xvZyBTb2Z0bWF4IGFsb25nIGEgbm9uLWxhc3QgZGltZW5zaW9uIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiAnICtcbiAgICAgICAgICAgIGBMb2dpdHMgd2FzIHJhbmsgJHskbG9naXRzLnJhbmt9IGFuZCBheGlzIHdhcyAke2F4aXN9YCk7XG4gICAgfVxuICAgIC8vIGNvbnN0IGZvcndhcmQ6IEZvcndhcmRGdW5jPFRlbnNvcj4gPSAoYmFja2VuZCwgc2F2ZSkgPT4ge1xuICAgIC8vICAgY29uc3Qga2VlcERpbXMgPSB0cnVlO1xuICAgIC8vICAgY29uc3QgeE1heCA9IG1heChsb2dpdHMsIGF4aXMsIHRydWUpO1xuICAgIC8vICAgY29uc3Qgc2hpZnRlZCA9IHN1Yihsb2dpdHMsIHhNYXgpO1xuICAgIC8vICAgY29uc3QgdmFsdWUgPVxuICAgIC8vICAgICAgIHN1YihjYXN0KHNoaWZ0ZWQsICdmbG9hdDMyJyksIGxvZyhzdW0oZXhwKHNoaWZ0ZWQpLCBheGlzLFxuICAgIC8vICAgICAgIGtlZXBEaW1zKSkpO1xuICAgIC8vICAgc2F2ZShbdmFsdWVdKTtcbiAgICAvLyAgIHJldHVybiB2YWx1ZTtcbiAgICAvLyB9O1xuICAgIC8vIFVzZSBhIGN1c3RvbSBncmFkaWVudCBmb3IgbnVtZXJpY2FsIHN0YWJpbGl0eS5cbiAgICBjb25zdCBjdXN0b21PcCA9IGN1c3RvbUdyYWQoKGxvZ2l0cywgc2F2ZSkgPT4ge1xuICAgICAgICBjb25zdCBrZWVwRGltcyA9IHRydWU7XG4gICAgICAgIGNvbnN0IHhNYXggPSBtYXgobG9naXRzLCBheGlzLCB0cnVlKTtcbiAgICAgICAgY29uc3Qgc2hpZnRlZCA9IHN1Yihsb2dpdHMsIHhNYXgpO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHN1YihjYXN0KHNoaWZ0ZWQsICdmbG9hdDMyJyksIGxvZyhzdW0oZXhwKHNoaWZ0ZWQpLCBheGlzLCBrZWVwRGltcykpKTtcbiAgICAgICAgc2F2ZShbdmFsdWVdKTtcbiAgICAgICAgY29uc3QgZ3JhZEZ1bmMgPSAoZHksIHNhdmVkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBbdmFsdWVdID0gc2F2ZWQ7XG4gICAgICAgICAgICBjb25zdCBrZWVwRGltcyA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCBzb2Z0bWF4ID0gZXhwKHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiBzdWIoZHksIG11bChzdW0oZHksIGF4aXMsIGtlZXBEaW1zKSwgc29mdG1heCkpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4geyB2YWx1ZSwgZ3JhZEZ1bmMgfTtcbiAgICB9KTtcbiAgICByZXR1cm4gY3VzdG9tT3AoJGxvZ2l0cyk7XG4gICAgLy8gVE9ETyBVc2UgRW5naW5lLnJ1bktlcm5lbCB3aGVuIENQVS9XZWJHTC9XQVNNIGJhY2tlbmRzIGltcGxlbWVudCB0aGlzLlxuICAgIC8vIGNvbnN0IGlucHV0czogTG9nU29mdG1heElucHV0cyA9IHtsb2dpdHM6ICRsb2dpdHN9O1xuICAgIC8vIGNvbnN0IGF0dHJzOiBMb2dTb2Z0bWF4QXR0cnMgPSB7YXhpc307XG4gICAgLy8gcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgLy8gICAgICAgICAgICBMb2dTb2Z0bWF4LCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsXG4gICAgLy8gICAgICAgICAgICBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApO1xufVxuZXhwb3J0IGNvbnN0IGxvZ1NvZnRtYXggPSBvcCh7IGxvZ1NvZnRtYXhfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG9nX3NvZnRtYXguanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IHBhcnNlQXhpc1BhcmFtIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBhZGQgfSBmcm9tICcuL2FkZCc7XG5pbXBvcnQgeyBleHBhbmRTaGFwZVRvS2VlcERpbSB9IGZyb20gJy4vYXhpc191dGlsJztcbmltcG9ydCB7IGV4cCB9IGZyb20gJy4vZXhwJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nJztcbmltcG9ydCB7IG1heCB9IGZyb20gJy4vbWF4JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vcmVzaGFwZSc7XG5pbXBvcnQgeyBzdWIgfSBmcm9tICcuL3N1Yic7XG5pbXBvcnQgeyBzdW0gfSBmcm9tICcuL3N1bSc7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBsb2coc3VtKGV4cChlbGVtZW50cyBhY3Jvc3MgdGhlIHJlZHVjdGlvbiBkaW1lbnNpb25zKSkuXG4gKlxuICogUmVkdWNlcyB0aGUgaW5wdXQgYWxvbmcgdGhlIGRpbWVuc2lvbnMgZ2l2ZW4gaW4gYGF4aXNgLiBVbmxlc3MgYGtlZXBEaW1zYFxuICogaXMgdHJ1ZSwgdGhlIHJhbmsgb2YgdGhlIGFycmF5IGlzIHJlZHVjZWQgYnkgMSBmb3IgZWFjaCBlbnRyeSBpbiBgYXhpc2AuXG4gKiBJZiBga2VlcERpbXNgIGlzIHRydWUsIHRoZSByZWR1Y2VkIGRpbWVuc2lvbnMgYXJlIHJldGFpbmVkIHdpdGggbGVuZ3RoIDEuXG4gKiBJZiBgYXhpc2AgaGFzIG5vIGVudHJpZXMsIGFsbCBkaW1lbnNpb25zIGFyZSByZWR1Y2VkLCBhbmQgYW4gYXJyYXkgd2l0aCBhXG4gKiBzaW5nbGUgZWxlbWVudCBpcyByZXR1cm5lZC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKlxuICogeC5sb2dTdW1FeHAoKS5wcmludCgpOyAgLy8gb3IgdGYubG9nU3VtRXhwKHgpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjJkKFsxLCAyLCAzLCA0XSwgWzIsIDJdKTtcbiAqXG4gKiBjb25zdCBheGlzID0gMTtcbiAqIHgubG9nU3VtRXhwKGF4aXMpLnByaW50KCk7ICAvLyBvciB0Zi5sb2dTdW1FeHAoYSwgYXhpcylcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBheGlzIFRoZSBkaW1lbnNpb24ocykgdG8gcmVkdWNlLiBJZiBudWxsICh0aGUgZGVmYXVsdCksXG4gKiAgICAgcmVkdWNlcyBhbGwgZGltZW5zaW9ucy5cbiAqIEBwYXJhbSBrZWVwRGltcyBJZiB0cnVlLCByZXRhaW5zIHJlZHVjZWQgZGltZW5zaW9ucyB3aXRoIGxlbmd0aFxuICogICAgIG9mIDEuIERlZmF1bHRzIHRvIGZhbHNlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1JlZHVjdGlvbid9XG4gKi9cbmZ1bmN0aW9uIGxvZ1N1bUV4cF8oeCwgYXhpcyA9IG51bGwsIGtlZXBEaW1zID0gZmFsc2UpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdsb2dTdW1FeHAnKTtcbiAgICBjb25zdCBheGVzID0gcGFyc2VBeGlzUGFyYW0oYXhpcywgJHguc2hhcGUpO1xuICAgIGNvbnN0IHhNYXggPSBtYXgoJHgsIGF4ZXMsIHRydWUgLyoga2VlcERpbXMgKi8pO1xuICAgIGNvbnN0IGEgPSBzdWIoJHgsIHhNYXgpO1xuICAgIGNvbnN0IGIgPSBleHAoYSk7XG4gICAgY29uc3QgYyA9IHN1bShiLCBheGVzKTtcbiAgICBjb25zdCBkID0gbG9nKGMpO1xuICAgIGNvbnN0IHJlcyA9IGFkZChyZXNoYXBlKHhNYXgsIGQuc2hhcGUpLCBkKTtcbiAgICBpZiAoa2VlcERpbXMpIHtcbiAgICAgICAgY29uc3QgbmV3U2hhcGUgPSBleHBhbmRTaGFwZVRvS2VlcERpbShyZXMuc2hhcGUsIGF4ZXMpO1xuICAgICAgICByZXR1cm4gcmVzaGFwZShyZXMsIG5ld1NoYXBlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydCBjb25zdCBsb2dTdW1FeHAgPSBvcCh7IGxvZ1N1bUV4cF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sb2dfc3VtX2V4cC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTG9naWNhbEFuZCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUgfSBmcm9tICcuL2Jyb2FkY2FzdF91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSB0cnV0aCB2YWx1ZSBvZiBgYSBBTkQgYmAgZWxlbWVudC13aXNlLiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbZmFsc2UsIGZhbHNlLCB0cnVlLCB0cnVlXSwgJ2Jvb2wnKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbZmFsc2UsIHRydWUsIGZhbHNlLCB0cnVlXSwgJ2Jvb2wnKTtcbiAqXG4gKiBhLmxvZ2ljYWxBbmQoYikucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBpbnB1dCB0ZW5zb3IuIE11c3QgYmUgb2YgZHR5cGUgYm9vbC5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgaW5wdXQgdGVuc29yLiBNdXN0IGJlIG9mIGR0eXBlIGJvb2wuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTG9naWNhbCd9XG4gKi9cbmZ1bmN0aW9uIGxvZ2ljYWxBbmRfKGEsIGIpIHtcbiAgICBjb25zdCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdsb2dpY2FsQW5kJywgJ2Jvb2wnKTtcbiAgICBjb25zdCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdsb2dpY2FsQW5kJywgJ2Jvb2wnKTtcbiAgICBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSgkYS5zaGFwZSwgJGIuc2hhcGUpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgYTogJGEsIGI6ICRiIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoTG9naWNhbEFuZCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBsb2dpY2FsQW5kID0gb3AoeyBsb2dpY2FsQW5kXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxvZ2ljYWxfYW5kLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBMb2dpY2FsTm90IH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV0dXJucyB0aGUgdHJ1dGggdmFsdWUgb2YgYE5PVCB4YCBlbGVtZW50LXdpc2UuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbZmFsc2UsIHRydWVdLCAnYm9vbCcpO1xuICpcbiAqIGEubG9naWNhbE5vdCgpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLiBNdXN0IGJlIG9mIGR0eXBlICdib29sJy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdMb2dpY2FsJ31cbiAqL1xuZnVuY3Rpb24gbG9naWNhbE5vdF8oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2xvZ2ljYWxOb3QnLCAnYm9vbCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChMb2dpY2FsTm90LCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGxvZ2ljYWxOb3QgPSBvcCh7IGxvZ2ljYWxOb3RfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG9naWNhbF9ub3QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IExvZ2ljYWxPciB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUgfSBmcm9tICcuL2Jyb2FkY2FzdF91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSB0cnV0aCB2YWx1ZSBvZiBgYSBPUiBiYCBlbGVtZW50LXdpc2UuIFN1cHBvcnRzIGJyb2FkY2FzdGluZy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFtmYWxzZSwgZmFsc2UsIHRydWUsIHRydWVdLCAnYm9vbCcpO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFtmYWxzZSwgdHJ1ZSwgZmFsc2UsIHRydWVdLCAnYm9vbCcpO1xuICpcbiAqIGEubG9naWNhbE9yKGIpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBpbnB1dCB0ZW5zb3IuIE11c3QgYmUgb2YgZHR5cGUgYm9vbC5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgaW5wdXQgdGVuc29yLiBNdXN0IGJlIG9mIGR0eXBlIGJvb2wuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTG9naWNhbCd9XG4gKi9cbmZ1bmN0aW9uIGxvZ2ljYWxPcl8oYSwgYikge1xuICAgIGNvbnN0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ2xvZ2ljYWxPcicsICdib29sJyk7XG4gICAgY29uc3QgJGIgPSBjb252ZXJ0VG9UZW5zb3IoYiwgJ2InLCAnbG9naWNhbE9yJywgJ2Jvb2wnKTtcbiAgICBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSgkYS5zaGFwZSwgJGIuc2hhcGUpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgYTogJGEsIGI6ICRiIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoTG9naWNhbE9yLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGxvZ2ljYWxPciA9IG9wKHsgbG9naWNhbE9yXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxvZ2ljYWxfb3IuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlIH0gZnJvbSAnLi9icm9hZGNhc3RfdXRpbCc7XG5pbXBvcnQgeyBsb2dpY2FsQW5kIH0gZnJvbSAnLi9sb2dpY2FsX2FuZCc7XG5pbXBvcnQgeyBsb2dpY2FsTm90IH0gZnJvbSAnLi9sb2dpY2FsX25vdCc7XG5pbXBvcnQgeyBsb2dpY2FsT3IgfSBmcm9tICcuL2xvZ2ljYWxfb3InO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIFJldHVybnMgdGhlIHRydXRoIHZhbHVlIG9mIGBhIFhPUiBiYCBlbGVtZW50LXdpc2UuIFN1cHBvcnRzIGJyb2FkY2FzdGluZy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFtmYWxzZSwgZmFsc2UsIHRydWUsIHRydWVdLCAnYm9vbCcpO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFtmYWxzZSwgdHJ1ZSwgZmFsc2UsIHRydWVdLCAnYm9vbCcpO1xuICpcbiAqIGEubG9naWNhbFhvcihiKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGEgVGhlIGZpcnN0IGlucHV0IHRlbnNvci4gTXVzdCBiZSBvZiBkdHlwZSBib29sLlxuICogQHBhcmFtIGIgVGhlIHNlY29uZCBpbnB1dCB0ZW5zb3IuIE11c3QgYmUgb2YgZHR5cGUgYm9vbC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdMb2dpY2FsJ31cbiAqL1xuZnVuY3Rpb24gbG9naWNhbFhvcl8oYSwgYikge1xuICAgIGNvbnN0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ2xvZ2ljYWxYb3InLCAnYm9vbCcpO1xuICAgIGNvbnN0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ2xvZ2ljYWxYb3InLCAnYm9vbCcpO1xuICAgIGFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKCRhLnNoYXBlLCAkYi5zaGFwZSk7XG4gICAgLy8geCBeIHkgPSAoeCB8IHkpICYgfih4ICYgeSlcbiAgICByZXR1cm4gbG9naWNhbEFuZChsb2dpY2FsT3IoYSwgYiksIGxvZ2ljYWxOb3QobG9naWNhbEFuZChhLCBiKSkpO1xufVxuZXhwb3J0IGNvbnN0IGxvZ2ljYWxYb3IgPSBvcCh7IGxvZ2ljYWxYb3JfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG9naWNhbF94b3IuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuZXhwb3J0IHZhciBSZWR1Y3Rpb247XG4oZnVuY3Rpb24gKFJlZHVjdGlvbikge1xuICAgIFJlZHVjdGlvbltSZWR1Y3Rpb25bXCJOT05FXCJdID0gMF0gPSBcIk5PTkVcIjtcbiAgICBSZWR1Y3Rpb25bUmVkdWN0aW9uW1wiTUVBTlwiXSA9IDFdID0gXCJNRUFOXCI7XG4gICAgUmVkdWN0aW9uW1JlZHVjdGlvbltcIlNVTVwiXSA9IDJdID0gXCJTVU1cIjtcbiAgICBSZWR1Y3Rpb25bUmVkdWN0aW9uW1wiU1VNX0JZX05PTlpFUk9fV0VJR0hUU1wiXSA9IDNdID0gXCJTVU1fQllfTk9OWkVST19XRUlHSFRTXCI7XG59KShSZWR1Y3Rpb24gfHwgKFJlZHVjdGlvbiA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sb3NzX29wc191dGlscy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0U2hhcGVzTWF0Y2ggfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IGFicyB9IGZyb20gJy4uL2Ficyc7XG5pbXBvcnQgeyBSZWR1Y3Rpb24gfSBmcm9tICcuLi9sb3NzX29wc191dGlscyc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4uL29wZXJhdGlvbic7XG5pbXBvcnQgeyBzdWIgfSBmcm9tICcuLi9zdWInO1xuaW1wb3J0IHsgY29tcHV0ZVdlaWdodGVkTG9zcyB9IGZyb20gJy4vY29tcHV0ZV93ZWlnaHRlZF9sb3NzJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIGFic29sdXRlIGRpZmZlcmVuY2UgbG9zcyBiZXR3ZWVuIHR3byB0ZW5zb3JzLlxuICpcbiAqIEBwYXJhbSBsYWJlbHMgVGhlIGdyb3VuZCB0cnV0aCBvdXRwdXQgdGVuc29yLCBzYW1lIGRpbWVuc2lvbnMgYXNcbiAqICAgICdwcmVkaWN0aW9ucycuXG4gKiBAcGFyYW0gcHJlZGljdGlvbnMgVGhlIHByZWRpY3RlZCBvdXRwdXRzLlxuICogQHBhcmFtIHdlaWdodHMgVGVuc29yIHdob3NlIHJhbmsgaXMgZWl0aGVyIDAsIG9yIHRoZSBzYW1lIHJhbmsgYXNcbiAqICAgIGBsYWJlbHNgLCBhbmQgbXVzdCBiZSBicm9hZGNhc3RhYmxlIHRvIGBsYWJlbHNgIChpLmUuLCBhbGwgZGltZW5zaW9uc1xuICogICAgbXVzdCBiZSBlaXRoZXIgYDFgLCBvciB0aGUgc2FtZSBhcyB0aGUgY29ycmVzcG9uZGluZyBgbG9zc2VzYFxuICogICAgZGltZW5zaW9uKS5cbiAqIEBwYXJhbSByZWR1Y3Rpb24gVHlwZSBvZiByZWR1Y3Rpb24gdG8gYXBwbHkgdG8gbG9zcy4gU2hvdWxkIGJlIG9mIHR5cGVcbiAqICAgIGBSZWR1Y3Rpb25gXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0xvc3NlcycsIG5hbWVzcGFjZTogJ2xvc3Nlcyd9XG4gKi9cbmZ1bmN0aW9uIGFic29sdXRlRGlmZmVyZW5jZV8obGFiZWxzLCBwcmVkaWN0aW9ucywgd2VpZ2h0cywgcmVkdWN0aW9uID0gUmVkdWN0aW9uLlNVTV9CWV9OT05aRVJPX1dFSUdIVFMpIHtcbiAgICBjb25zdCAkbGFiZWxzID0gY29udmVydFRvVGVuc29yKGxhYmVscywgJ2xhYmVscycsICdhYnNvbHV0ZURpZmZlcmVuY2UnKTtcbiAgICBjb25zdCAkcHJlZGljdGlvbnMgPSBjb252ZXJ0VG9UZW5zb3IocHJlZGljdGlvbnMsICdwcmVkaWN0aW9ucycsICdhYnNvbHV0ZURpZmZlcmVuY2UnKTtcbiAgICBsZXQgJHdlaWdodHMgPSBudWxsO1xuICAgIGlmICh3ZWlnaHRzICE9IG51bGwpIHtcbiAgICAgICAgJHdlaWdodHMgPSBjb252ZXJ0VG9UZW5zb3Iod2VpZ2h0cywgJ3dlaWdodHMnLCAnYWJzb2x1dGVEaWZmZXJlbmNlJyk7XG4gICAgfVxuICAgIGFzc2VydFNoYXBlc01hdGNoKCRsYWJlbHMuc2hhcGUsICRwcmVkaWN0aW9ucy5zaGFwZSwgJ0Vycm9yIGluIGFic29sdXRlRGlmZmVyZW5jZTogJyk7XG4gICAgY29uc3QgbG9zc2VzID0gYWJzKHN1YigkbGFiZWxzLCAkcHJlZGljdGlvbnMpKTtcbiAgICByZXR1cm4gY29tcHV0ZVdlaWdodGVkTG9zcyhsb3NzZXMsICR3ZWlnaHRzLCByZWR1Y3Rpb24pO1xufVxuZXhwb3J0IGNvbnN0IGFic29sdXRlRGlmZmVyZW5jZSA9IG9wKHsgYWJzb2x1dGVEaWZmZXJlbmNlXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFic29sdXRlX2RpZmZlcmVuY2UuanMubWFwIiwiaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGNhc3QgfSBmcm9tICcuLi9jYXN0JztcbmltcG9ydCB7IGRpdiB9IGZyb20gJy4uL2Rpdic7XG5pbXBvcnQgeyBSZWR1Y3Rpb24gfSBmcm9tICcuLi9sb3NzX29wc191dGlscyc7XG5pbXBvcnQgeyBtZWFuIH0gZnJvbSAnLi4vbWVhbic7XG5pbXBvcnQgeyBtdWwgfSBmcm9tICcuLi9tdWwnO1xuaW1wb3J0IHsgbm90RXF1YWwgfSBmcm9tICcuLi9ub3RfZXF1YWwnO1xuaW1wb3J0IHsgb25lcyB9IGZyb20gJy4uL29uZXMnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgc2NhbGFyIH0gZnJvbSAnLi4vc2NhbGFyJztcbmltcG9ydCB7IHN1bSB9IGZyb20gJy4uL3N1bSc7XG4vKipcbiAqIENvbXB1dGVzIHRoZSB3ZWlnaHRlZCBsb3NzIGJldHdlZW4gdHdvIHRlbnNvcnMuXG4gKlxuICogQHBhcmFtIGxvc3NlcyBUZW5zb3Igb2Ygc2hhcGUgYFtiYXRjaF9zaXplLCBkMSwgLi4uIGROXWAuXG4gKiBAcGFyYW0gd2VpZ2h0cyBUZW5zb3Igd2hvc2UgcmFuayBpcyBlaXRoZXIgMCwgb3IgdGhlIHNhbWUgcmFuayBhc1xuICogICAgYGxvc3Nlc2AsIGFuZCBtdXN0IGJlIGJyb2FkY2FzdGFibGUgdG8gYGxvc3Nlc2AgKGkuZS4sIGFsbFxuICogICAgZGltZW5zaW9ucyBtdXN0IGJlIGVpdGhlciBgMWAsIG9yIHRoZSBzYW1lIGFzIHRoZSBjb3JyZXNwb25kaW5nXG4gKiAgICBgbG9zc2VzYCBkaW1lbnNpb24pLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdMb3NzZXMnLCBuYW1lc3BhY2U6ICdsb3NzZXMnfVxuICovXG5mdW5jdGlvbiBjb21wdXRlV2VpZ2h0ZWRMb3NzXyhsb3NzZXMsIHdlaWdodHMsIHJlZHVjdGlvbiA9IFJlZHVjdGlvbi5TVU1fQllfTk9OWkVST19XRUlHSFRTKSB7XG4gICAgY29uc3QgJGxvc3NlcyA9IGNvbnZlcnRUb1RlbnNvcihsb3NzZXMsICdsb3NzZXMnLCAnY29tcHV0ZVdlaWdodGVkTG9zcycpO1xuICAgIGxldCAkd2VpZ2h0cyA9IG51bGw7XG4gICAgaWYgKHdlaWdodHMgIT0gbnVsbCkge1xuICAgICAgICAkd2VpZ2h0cyA9IGNvbnZlcnRUb1RlbnNvcih3ZWlnaHRzLCAnd2VpZ2h0cycsICdjb21wdXRlV2VpZ2h0ZWRMb3NzJyk7XG4gICAgfVxuICAgIGNvbnN0IHdlaWdodGVkTG9zcyA9ICgkd2VpZ2h0cyA9PSBudWxsKSA/ICRsb3NzZXMgOiBtdWwoJGxvc3NlcywgJHdlaWdodHMpO1xuICAgIGlmIChyZWR1Y3Rpb24gPT09IFJlZHVjdGlvbi5OT05FKSB7XG4gICAgICAgIHJldHVybiB3ZWlnaHRlZExvc3M7XG4gICAgfVxuICAgIGlmIChyZWR1Y3Rpb24gPT09IFJlZHVjdGlvbi5TVU0pIHtcbiAgICAgICAgcmV0dXJuIHN1bSh3ZWlnaHRlZExvc3MpO1xuICAgIH1cbiAgICBpZiAocmVkdWN0aW9uID09PSBSZWR1Y3Rpb24uTUVBTikge1xuICAgICAgICBpZiAoJHdlaWdodHMgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG1lYW4od2VpZ2h0ZWRMb3NzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGJyb2FkY2FzdEZhY3RvciA9ICRsb3NzZXMuc2l6ZSAvICR3ZWlnaHRzLnNpemU7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBkaXYoc3VtKHdlaWdodGVkTG9zcyksIHN1bSgkd2VpZ2h0cykpO1xuICAgICAgICAgICAgcmV0dXJuIGJyb2FkY2FzdEZhY3RvciA+IDEgPyBkaXYocmVzdWx0LCBzY2FsYXIoYnJvYWRjYXN0RmFjdG9yKSkgOlxuICAgICAgICAgICAgICAgIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVkdWN0aW9uID09PSBSZWR1Y3Rpb24uU1VNX0JZX05PTlpFUk9fV0VJR0hUUykge1xuICAgICAgICBpZiAoJHdlaWdodHMgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGRpdihzdW0od2VpZ2h0ZWRMb3NzKSwgc2NhbGFyKCRsb3NzZXMuc2l6ZSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgYnJvYWRjYXN0ZWRXZWlnaHRzID0gbXVsKCR3ZWlnaHRzLCBvbmVzKCRsb3NzZXMuc2hhcGUpKTtcbiAgICAgICAgICAgIGNvbnN0IG51bU5vblplcm9zID0gY2FzdChzdW0obm90RXF1YWwoYnJvYWRjYXN0ZWRXZWlnaHRzLCBzY2FsYXIoMCkpKSwgJ2Zsb2F0MzInKTtcbiAgICAgICAgICAgIHJldHVybiBkaXYoc3VtKHdlaWdodGVkTG9zcyksIG51bU5vblplcm9zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBFcnJvcihgVW5rbm93biByZWR1Y3Rpb246ICR7cmVkdWN0aW9ufWApO1xufVxuZXhwb3J0IGNvbnN0IGNvbXB1dGVXZWlnaHRlZExvc3MgPSBvcCh7IGNvbXB1dGVXZWlnaHRlZExvc3NfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29tcHV0ZV93ZWlnaHRlZF9sb3NzLmpzLm1hcCIsImltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnRTaGFwZXNNYXRjaCB9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHsgUmVkdWN0aW9uIH0gZnJvbSAnLi4vbG9zc19vcHNfdXRpbHMnO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi4vbXVsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHNjYWxhciB9IGZyb20gJy4uL3NjYWxhcic7XG5pbXBvcnQgeyBzdWIgfSBmcm9tICcuLi9zdWInO1xuaW1wb3J0IHsgc3VtIH0gZnJvbSAnLi4vc3VtJztcbmltcG9ydCB7IGNvbXB1dGVXZWlnaHRlZExvc3MgfSBmcm9tICcuL2NvbXB1dGVfd2VpZ2h0ZWRfbG9zcyc7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBjb3NpbmUgZGlzdGFuY2UgbG9zcyBiZXR3ZWVuIHR3byB0ZW5zb3JzLlxuICpcbiAqIEBwYXJhbSBsYWJlbHMgVGhlIGdyb3VuZCB0cnV0aCBvdXRwdXQgdGVuc29yLCBzYW1lIGRpbWVuc2lvbnMgYXNcbiAqICAgICdwcmVkaWN0aW9ucycuXG4gKiBAcGFyYW0gcHJlZGljdGlvbnMgVGhlIHByZWRpY3RlZCBvdXRwdXRzLlxuICogQHBhcmFtIGF4aXMgVGhlIGRpbWVuc2lvbiBhbG9uZyB3aGljaCB0aGUgY29zaW5lIGRpc3RhbmNlIGlzIGNvbXB1dGVkLlxuICogQHBhcmFtIHdlaWdodHMgVGVuc29yIHdob3NlIHJhbmsgaXMgZWl0aGVyIDAsIG9yIHRoZSBzYW1lIHJhbmsgYXNcbiAqICAgIGBsYWJlbHNgLCBhbmQgbXVzdCBiZSBicm9hZGNhc3RhYmxlIHRvIGBsYWJlbHNgIChpLmUuLCBhbGwgZGltZW5zaW9uc1xuICogICAgbXVzdCBiZSBlaXRoZXIgYDFgLCBvciB0aGUgc2FtZSBhcyB0aGUgY29ycmVzcG9uZGluZyBgbG9zc2VzYFxuICogICAgZGltZW5zaW9uKS5cbiAqIEBwYXJhbSByZWR1Y3Rpb24gVHlwZSBvZiByZWR1Y3Rpb24gdG8gYXBwbHkgdG8gbG9zcy4gU2hvdWxkIGJlIG9mIHR5cGVcbiAqICAgIGBSZWR1Y3Rpb25gXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0xvc3NlcycsIG5hbWVzcGFjZTogJ2xvc3Nlcyd9XG4gKi9cbmZ1bmN0aW9uIGNvc2luZURpc3RhbmNlXyhsYWJlbHMsIHByZWRpY3Rpb25zLCBheGlzLCB3ZWlnaHRzLCByZWR1Y3Rpb24gPSBSZWR1Y3Rpb24uU1VNX0JZX05PTlpFUk9fV0VJR0hUUykge1xuICAgIGNvbnN0ICRsYWJlbHMgPSBjb252ZXJ0VG9UZW5zb3IobGFiZWxzLCAnbGFiZWxzJywgJ2Nvc2luZURpc3RhbmNlJyk7XG4gICAgY29uc3QgJHByZWRpY3Rpb25zID0gY29udmVydFRvVGVuc29yKHByZWRpY3Rpb25zLCAncHJlZGljdGlvbnMnLCAnY29zaW5lRGlzdGFuY2UnKTtcbiAgICBsZXQgJHdlaWdodHMgPSBudWxsO1xuICAgIGlmICh3ZWlnaHRzICE9IG51bGwpIHtcbiAgICAgICAgJHdlaWdodHMgPSBjb252ZXJ0VG9UZW5zb3Iod2VpZ2h0cywgJ3dlaWdodHMnLCAnY29zaW5lRGlzdGFuY2UnKTtcbiAgICB9XG4gICAgYXNzZXJ0U2hhcGVzTWF0Y2goJGxhYmVscy5zaGFwZSwgJHByZWRpY3Rpb25zLnNoYXBlLCAnRXJyb3IgaW4gY29zaW5lRGlzdGFuY2U6ICcpO1xuICAgIGNvbnN0IG9uZSA9IHNjYWxhcigxKTtcbiAgICBjb25zdCBsb3NzZXMgPSBzdWIob25lLCBzdW0obXVsKCRsYWJlbHMsICRwcmVkaWN0aW9ucyksIGF4aXMsIHRydWUpKTtcbiAgICByZXR1cm4gY29tcHV0ZVdlaWdodGVkTG9zcyhsb3NzZXMsICR3ZWlnaHRzLCByZWR1Y3Rpb24pO1xufVxuZXhwb3J0IGNvbnN0IGNvc2luZURpc3RhbmNlID0gb3AoeyBjb3NpbmVEaXN0YW5jZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb3NpbmVfZGlzdGFuY2UuanMubWFwIiwiaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGFzc2VydFNoYXBlc01hdGNoIH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgeyBSZWR1Y3Rpb24gfSBmcm9tICcuLi9sb3NzX29wc191dGlscyc7XG5pbXBvcnQgeyBtdWwgfSBmcm9tICcuLi9tdWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVsdSB9IGZyb20gJy4uL3JlbHUnO1xuaW1wb3J0IHsgc2NhbGFyIH0gZnJvbSAnLi4vc2NhbGFyJztcbmltcG9ydCB7IHN1YiB9IGZyb20gJy4uL3N1Yic7XG5pbXBvcnQgeyBjb21wdXRlV2VpZ2h0ZWRMb3NzIH0gZnJvbSAnLi9jb21wdXRlX3dlaWdodGVkX2xvc3MnO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgSGluZ2UgbG9zcyBiZXR3ZWVuIHR3byB0ZW5zb3JzLlxuICpcbiAqIEBwYXJhbSBsYWJlbHMgVGhlIGdyb3VuZCB0cnV0aCBvdXRwdXQgdGVuc29yLCBzYW1lIGRpbWVuc2lvbnMgYXNcbiAqICAgICdwcmVkaWN0aW9ucycuXG4gKiBAcGFyYW0gcHJlZGljdGlvbnMgVGhlIHByZWRpY3RlZCBvdXRwdXRzLlxuICogQHBhcmFtIHdlaWdodHMgVGVuc29yIHdob3NlIHJhbmsgaXMgZWl0aGVyIDAsIG9yIHRoZSBzYW1lIHJhbmsgYXNcbiAqICAgIGBsYWJlbHNgLCBhbmQgbXVzdCBiZSBicm9hZGNhc3RhYmxlIHRvIGBsYWJlbHNgIChpLmUuLCBhbGwgZGltZW5zaW9uc1xuICogICAgbXVzdCBiZSBlaXRoZXIgYDFgLCBvciB0aGUgc2FtZSBhcyB0aGUgY29ycmVzcG9uZGluZyBgbG9zc2VzYFxuICogICAgZGltZW5zaW9uKS5cbiAqIEBwYXJhbSByZWR1Y3Rpb24gVHlwZSBvZiByZWR1Y3Rpb24gdG8gYXBwbHkgdG8gbG9zcy4gU2hvdWxkIGJlIG9mIHR5cGVcbiAqICAgIGBSZWR1Y3Rpb25gXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0xvc3NlcycsIG5hbWVzcGFjZTogJ2xvc3Nlcyd9XG4gKi9cbmZ1bmN0aW9uIGhpbmdlTG9zc18obGFiZWxzLCBwcmVkaWN0aW9ucywgd2VpZ2h0cywgcmVkdWN0aW9uID0gUmVkdWN0aW9uLlNVTV9CWV9OT05aRVJPX1dFSUdIVFMpIHtcbiAgICBsZXQgJGxhYmVscyA9IGNvbnZlcnRUb1RlbnNvcihsYWJlbHMsICdsYWJlbHMnLCAnaGluZ2VMb3NzJyk7XG4gICAgY29uc3QgJHByZWRpY3Rpb25zID0gY29udmVydFRvVGVuc29yKHByZWRpY3Rpb25zLCAncHJlZGljdGlvbnMnLCAnaGluZ2VMb3NzJyk7XG4gICAgbGV0ICR3ZWlnaHRzID0gbnVsbDtcbiAgICBpZiAod2VpZ2h0cyAhPSBudWxsKSB7XG4gICAgICAgICR3ZWlnaHRzID0gY29udmVydFRvVGVuc29yKHdlaWdodHMsICd3ZWlnaHRzJywgJ2hpbmdlTG9zcycpO1xuICAgIH1cbiAgICBhc3NlcnRTaGFwZXNNYXRjaCgkbGFiZWxzLnNoYXBlLCAkcHJlZGljdGlvbnMuc2hhcGUsICdFcnJvciBpbiBoaW5nZUxvc3M6ICcpO1xuICAgIGNvbnN0IG9uZSA9IHNjYWxhcigxKTtcbiAgICAvLyBDb252ZXJ0IGJpbmFyeSBsYWJlbHMgdG8gKC0xLCAxKVxuICAgICRsYWJlbHMgPSBzdWIobXVsKHNjYWxhcigyKSwgJGxhYmVscyksIG9uZSk7XG4gICAgY29uc3QgbG9zc2VzID0gcmVsdShzdWIob25lLCBtdWwoJGxhYmVscywgJHByZWRpY3Rpb25zKSkpO1xuICAgIHJldHVybiBjb21wdXRlV2VpZ2h0ZWRMb3NzKGxvc3NlcywgJHdlaWdodHMsIHJlZHVjdGlvbik7XG59XG5leHBvcnQgY29uc3QgaGluZ2VMb3NzID0gb3AoeyBoaW5nZUxvc3NfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGluZ2VfbG9zcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0U2hhcGVzTWF0Y2ggfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IGFicyB9IGZyb20gJy4uL2Ficyc7XG5pbXBvcnQgeyBhZGQgfSBmcm9tICcuLi9hZGQnO1xuaW1wb3J0IHsgUmVkdWN0aW9uIH0gZnJvbSAnLi4vbG9zc19vcHNfdXRpbHMnO1xuaW1wb3J0IHsgbWluaW11bSB9IGZyb20gJy4uL21pbmltdW0nO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi4vbXVsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHNjYWxhciB9IGZyb20gJy4uL3NjYWxhcic7XG5pbXBvcnQgeyBzcXVhcmUgfSBmcm9tICcuLi9zcXVhcmUnO1xuaW1wb3J0IHsgc3ViIH0gZnJvbSAnLi4vc3ViJztcbmltcG9ydCB7IGNvbXB1dGVXZWlnaHRlZExvc3MgfSBmcm9tICcuL2NvbXB1dGVfd2VpZ2h0ZWRfbG9zcyc7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBodWJlciBsb3NzIGJldHdlZW4gdHdvIHRlbnNvcnMuXG4gKlxuICogQHBhcmFtIGxhYmVscyBUaGUgZ3JvdW5kIHRydXRoIG91dHB1dCB0ZW5zb3IsIHNhbWUgZGltZW5zaW9ucyBhc1xuICogICAgJ3ByZWRpY3Rpb25zJy5cbiAqIEBwYXJhbSBwcmVkaWN0aW9ucyBUaGUgcHJlZGljdGVkIG91dHB1dHMuXG4gKiBAcGFyYW0gd2VpZ2h0cyBUZW5zb3Igd2hvc2UgcmFuayBpcyBlaXRoZXIgMCwgb3IgdGhlIHNhbWUgcmFuayBhc1xuICogICAgYGxhYmVsc2AsIGFuZCBtdXN0IGJlIGJyb2FkY2FzdGFibGUgdG8gYGxhYmVsc2AgKGkuZS4sIGFsbCBkaW1lbnNpb25zXG4gKiAgICBtdXN0IGJlIGVpdGhlciBgMWAsIG9yIHRoZSBzYW1lIGFzIHRoZSBjb3JyZXNwb25kaW5nIGBsb3NzZXNgXG4gKiAgICBkaW1lbnNpb24pLlxuICogQHBhcmFtIGRlbHRhIFBvaW50IHdoZXJlIGh1YmVyIGxvc3MgY2hhbmdlcyBmcm9tIHF1YWRyYXRpYyB0byBsaW5lYXIuXG4gKiBAcGFyYW0gcmVkdWN0aW9uIFR5cGUgb2YgcmVkdWN0aW9uIHRvIGFwcGx5IHRvIGxvc3MuIFNob3VsZCBiZSBvZiB0eXBlXG4gKiAgICBgUmVkdWN0aW9uYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVHJhaW5pbmcnLCBzdWJoZWFkaW5nOiAnTG9zc2VzJywgbmFtZXNwYWNlOiAnbG9zc2VzJ31cbiAqL1xuZnVuY3Rpb24gaHViZXJMb3NzXyhsYWJlbHMsIHByZWRpY3Rpb25zLCB3ZWlnaHRzLCBkZWx0YSA9IDEuMCwgcmVkdWN0aW9uID0gUmVkdWN0aW9uLlNVTV9CWV9OT05aRVJPX1dFSUdIVFMpIHtcbiAgICBjb25zdCAkbGFiZWxzID0gY29udmVydFRvVGVuc29yKGxhYmVscywgJ2xhYmVscycsICdodWJlckxvc3MnKTtcbiAgICBjb25zdCAkcHJlZGljdGlvbnMgPSBjb252ZXJ0VG9UZW5zb3IocHJlZGljdGlvbnMsICdwcmVkaWN0aW9ucycsICdodWJlckxvc3MnKTtcbiAgICBsZXQgJHdlaWdodHMgPSBudWxsO1xuICAgIGlmICh3ZWlnaHRzICE9IG51bGwpIHtcbiAgICAgICAgJHdlaWdodHMgPSBjb252ZXJ0VG9UZW5zb3Iod2VpZ2h0cywgJ3dlaWdodHMnLCAnaHViZXJMb3NzJyk7XG4gICAgfVxuICAgIGFzc2VydFNoYXBlc01hdGNoKCRsYWJlbHMuc2hhcGUsICRwcmVkaWN0aW9ucy5zaGFwZSwgJ0Vycm9yIGluIGh1YmVyTG9zczogJyk7XG4gICAgY29uc3QgZGVsdGFTY2FsYXIgPSBzY2FsYXIoZGVsdGEpO1xuICAgIGNvbnN0IGVycm9yID0gYWJzKHN1YigkcHJlZGljdGlvbnMsICRsYWJlbHMpKTtcbiAgICBjb25zdCBxdWFkcmF0aWMgPSBtaW5pbXVtKGVycm9yLCBkZWx0YVNjYWxhcik7XG4gICAgY29uc3QgbGluZWFyID0gc3ViKGVycm9yLCBxdWFkcmF0aWMpO1xuICAgIGNvbnN0IGxvc3NlcyA9IGFkZChtdWwoc2NhbGFyKDAuNSksIHNxdWFyZShxdWFkcmF0aWMpKSwgbXVsKGRlbHRhU2NhbGFyLCBsaW5lYXIpKTtcbiAgICByZXR1cm4gY29tcHV0ZVdlaWdodGVkTG9zcyhsb3NzZXMsICR3ZWlnaHRzLCByZWR1Y3Rpb24pO1xufVxuZXhwb3J0IGNvbnN0IGh1YmVyTG9zcyA9IG9wKHsgaHViZXJMb3NzXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWh1YmVyX2xvc3MuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGFzc2VydFNoYXBlc01hdGNoIH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgeyBhZGQgfSBmcm9tICcuLi9hZGQnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi4vbG9nJztcbmltcG9ydCB7IFJlZHVjdGlvbiB9IGZyb20gJy4uL2xvc3Nfb3BzX3V0aWxzJztcbmltcG9ydCB7IG11bCB9IGZyb20gJy4uL211bCc7XG5pbXBvcnQgeyBuZWcgfSBmcm9tICcuLi9uZWcnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgc2NhbGFyIH0gZnJvbSAnLi4vc2NhbGFyJztcbmltcG9ydCB7IHN1YiB9IGZyb20gJy4uL3N1Yic7XG5pbXBvcnQgeyBjb21wdXRlV2VpZ2h0ZWRMb3NzIH0gZnJvbSAnLi9jb21wdXRlX3dlaWdodGVkX2xvc3MnO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgbG9nIGxvc3MgYmV0d2VlbiB0d28gdGVuc29ycy5cbiAqXG4gKiBAcGFyYW0gbGFiZWxzIFRoZSBncm91bmQgdHJ1dGggb3V0cHV0IHRlbnNvciwgc2FtZSBkaW1lbnNpb25zIGFzXG4gKiAgICAncHJlZGljdGlvbnMnLlxuICogQHBhcmFtIHByZWRpY3Rpb25zIFRoZSBwcmVkaWN0ZWQgb3V0cHV0cy5cbiAqIEBwYXJhbSB3ZWlnaHRzIFRlbnNvciB3aG9zZSByYW5rIGlzIGVpdGhlciAwLCBvciB0aGUgc2FtZSByYW5rIGFzXG4gKiAgICBgbGFiZWxzYCwgYW5kIG11c3QgYmUgYnJvYWRjYXN0YWJsZSB0byBgbGFiZWxzYCAoaS5lLiwgYWxsIGRpbWVuc2lvbnNcbiAqICAgIG11c3QgYmUgZWl0aGVyIGAxYCwgb3IgdGhlIHNhbWUgYXMgdGhlIGNvcnJlc3BvbmRpbmcgYGxvc3Nlc2BcbiAqICAgIGRpbWVuc2lvbikuXG4gKiBAcGFyYW0gZXBzaWxvbiBBIHNtYWxsIGluY3JlbWVudCB0byBhdm9pZCB0YWtpbmcgbG9nIG9mIHplcm9cbiAqIEBwYXJhbSByZWR1Y3Rpb24gVHlwZSBvZiByZWR1Y3Rpb24gdG8gYXBwbHkgdG8gbG9zcy4gU2hvdWxkIGJlIG9mIHR5cGVcbiAqICAgIGBSZWR1Y3Rpb25gXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0xvc3NlcycsIG5hbWVzcGFjZTogJ2xvc3Nlcyd9XG4gKi9cbmZ1bmN0aW9uIGxvZ0xvc3NfKGxhYmVscywgcHJlZGljdGlvbnMsIHdlaWdodHMsIGVwc2lsb24gPSAxZS03LCByZWR1Y3Rpb24gPSBSZWR1Y3Rpb24uU1VNX0JZX05PTlpFUk9fV0VJR0hUUykge1xuICAgIGNvbnN0ICRsYWJlbHMgPSBjb252ZXJ0VG9UZW5zb3IobGFiZWxzLCAnbGFiZWxzJywgJ2xvZ0xvc3MnKTtcbiAgICBjb25zdCAkcHJlZGljdGlvbnMgPSBjb252ZXJ0VG9UZW5zb3IocHJlZGljdGlvbnMsICdwcmVkaWN0aW9ucycsICdsb2dMb3NzJyk7XG4gICAgbGV0ICR3ZWlnaHRzID0gbnVsbDtcbiAgICBpZiAod2VpZ2h0cyAhPSBudWxsKSB7XG4gICAgICAgICR3ZWlnaHRzID0gY29udmVydFRvVGVuc29yKHdlaWdodHMsICd3ZWlnaHRzJywgJ2xvZ0xvc3MnKTtcbiAgICB9XG4gICAgYXNzZXJ0U2hhcGVzTWF0Y2goJGxhYmVscy5zaGFwZSwgJHByZWRpY3Rpb25zLnNoYXBlLCAnRXJyb3IgaW4gbG9nTG9zczogJyk7XG4gICAgY29uc3Qgb25lID0gc2NhbGFyKDEpO1xuICAgIGNvbnN0IGVwc2lsb25TY2FsYXIgPSBzY2FsYXIoZXBzaWxvbik7XG4gICAgY29uc3QgbDEgPSBuZWcobXVsKCRsYWJlbHMsIGxvZyhhZGQoJHByZWRpY3Rpb25zLCBlcHNpbG9uU2NhbGFyKSkpKTtcbiAgICBjb25zdCBsMiA9IG11bChzdWIob25lLCAkbGFiZWxzKSwgbG9nKGFkZChzdWIob25lLCAkcHJlZGljdGlvbnMpLCBlcHNpbG9uU2NhbGFyKSkpO1xuICAgIGNvbnN0IGxvc3NlcyA9IHN1YihsMSwgbDIpO1xuICAgIHJldHVybiBjb21wdXRlV2VpZ2h0ZWRMb3NzKGxvc3NlcywgJHdlaWdodHMsIHJlZHVjdGlvbik7XG59XG5leHBvcnQgY29uc3QgbG9nTG9zcyA9IG9wKHsgbG9nTG9zc18gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sb2dfbG9zcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0U2hhcGVzTWF0Y2ggfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IFJlZHVjdGlvbiB9IGZyb20gJy4uL2xvc3Nfb3BzX3V0aWxzJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHNxdWFyZWREaWZmZXJlbmNlIH0gZnJvbSAnLi4vc3F1YXJlZF9kaWZmZXJlbmNlJztcbmltcG9ydCB7IGNvbXB1dGVXZWlnaHRlZExvc3MgfSBmcm9tICcuL2NvbXB1dGVfd2VpZ2h0ZWRfbG9zcyc7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBtZWFuIHNxdWFyZWQgZXJyb3IgYmV0d2VlbiB0d28gdGVuc29ycy5cbiAqXG4gKiBAcGFyYW0gbGFiZWxzIFRoZSBncm91bmQgdHJ1dGggb3V0cHV0IHRlbnNvciwgc2FtZSBkaW1lbnNpb25zIGFzXG4gKiAgICAncHJlZGljdGlvbnMnLlxuICogQHBhcmFtIHByZWRpY3Rpb25zIFRoZSBwcmVkaWN0ZWQgb3V0cHV0cy5cbiAqIEBwYXJhbSB3ZWlnaHRzIFRlbnNvciB3aG9zZSByYW5rIGlzIGVpdGhlciAwLCBvciB0aGUgc2FtZSByYW5rIGFzXG4gKiAgICBgbGFiZWxzYCwgYW5kIG11c3QgYmUgYnJvYWRjYXN0YWJsZSB0byBgbGFiZWxzYCAoaS5lLiwgYWxsIGRpbWVuc2lvbnNcbiAqICAgIG11c3QgYmUgZWl0aGVyIGAxYCwgb3IgdGhlIHNhbWUgYXMgdGhlIGNvcnJlc3BvbmRpbmcgYGxvc3Nlc2BcbiAqICAgIGRpbWVuc2lvbikuXG4gKiBAcGFyYW0gcmVkdWN0aW9uIFR5cGUgb2YgcmVkdWN0aW9uIHRvIGFwcGx5IHRvIGxvc3MuIFNob3VsZCBiZSBvZiB0eXBlXG4gKiAgICBgUmVkdWN0aW9uYFxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdMb3NzZXMnLCBuYW1lc3BhY2U6ICdsb3NzZXMnfVxuICovXG5mdW5jdGlvbiBtZWFuU3F1YXJlZEVycm9yXyhsYWJlbHMsIHByZWRpY3Rpb25zLCB3ZWlnaHRzLCByZWR1Y3Rpb24gPSBSZWR1Y3Rpb24uU1VNX0JZX05PTlpFUk9fV0VJR0hUUykge1xuICAgIGNvbnN0ICRsYWJlbHMgPSBjb252ZXJ0VG9UZW5zb3IobGFiZWxzLCAnbGFiZWxzJywgJ21lYW5TcXVhcmVkRXJyb3InKTtcbiAgICBjb25zdCAkcHJlZGljdGlvbnMgPSBjb252ZXJ0VG9UZW5zb3IocHJlZGljdGlvbnMsICdwcmVkaWN0aW9ucycsICdtZWFuU3F1YXJlZEVycm9yJyk7XG4gICAgbGV0ICR3ZWlnaHRzID0gbnVsbDtcbiAgICBpZiAod2VpZ2h0cyAhPSBudWxsKSB7XG4gICAgICAgICR3ZWlnaHRzID0gY29udmVydFRvVGVuc29yKHdlaWdodHMsICd3ZWlnaHRzJywgJ21lYW5TcXVhcmVkRXJyb3InKTtcbiAgICB9XG4gICAgYXNzZXJ0U2hhcGVzTWF0Y2goJGxhYmVscy5zaGFwZSwgJHByZWRpY3Rpb25zLnNoYXBlLCAnRXJyb3IgaW4gbWVhblNxdWFyZWRFcnJvcjogJyk7XG4gICAgY29uc3QgbG9zc2VzID0gc3F1YXJlZERpZmZlcmVuY2UoJGxhYmVscywgJHByZWRpY3Rpb25zKTtcbiAgICByZXR1cm4gY29tcHV0ZVdlaWdodGVkTG9zcyhsb3NzZXMsICR3ZWlnaHRzLCByZWR1Y3Rpb24pO1xufVxuZXhwb3J0IGNvbnN0IG1lYW5TcXVhcmVkRXJyb3IgPSBvcCh7IG1lYW5TcXVhcmVkRXJyb3JfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVhbl9zcXVhcmVkX2Vycm9yLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnRTaGFwZXNNYXRjaCB9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHsgYWJzIH0gZnJvbSAnLi4vYWJzJztcbmltcG9ydCB7IGFkZCB9IGZyb20gJy4uL2FkZCc7XG5pbXBvcnQgeyBleHAgfSBmcm9tICcuLi9leHAnO1xuaW1wb3J0IHsgbG9nMXAgfSBmcm9tICcuLi9sb2cxcCc7XG5pbXBvcnQgeyBSZWR1Y3Rpb24gfSBmcm9tICcuLi9sb3NzX29wc191dGlscyc7XG5pbXBvcnQgeyBtdWwgfSBmcm9tICcuLi9tdWwnO1xuaW1wb3J0IHsgbmVnIH0gZnJvbSAnLi4vbmVnJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlbHUgfSBmcm9tICcuLi9yZWx1JztcbmltcG9ydCB7IHNjYWxhciB9IGZyb20gJy4uL3NjYWxhcic7XG5pbXBvcnQgeyBzdWIgfSBmcm9tICcuLi9zdWInO1xuaW1wb3J0IHsgY29tcHV0ZVdlaWdodGVkTG9zcyB9IGZyb20gJy4vY29tcHV0ZV93ZWlnaHRlZF9sb3NzJztcbmZ1bmN0aW9uIHNpZ21vaWRDcm9zc0VudHJvcHlXaXRoTG9naXRzXyhsYWJlbHMsIGxvZ2l0cykge1xuICAgIGNvbnN0ICRsYWJlbHMgPSBjb252ZXJ0VG9UZW5zb3IobGFiZWxzLCAnbGFiZWxzJywgJ3NpZ21vaWRDcm9zc0VudHJvcHlXaXRoTG9naXRzJyk7XG4gICAgY29uc3QgJGxvZ2l0cyA9IGNvbnZlcnRUb1RlbnNvcihsb2dpdHMsICdsb2dpdHMnLCAnc2lnbW9pZENyb3NzRW50cm9weVdpdGhMb2dpdHMnKTtcbiAgICBhc3NlcnRTaGFwZXNNYXRjaCgkbGFiZWxzLnNoYXBlLCAkbG9naXRzLnNoYXBlLCAnRXJyb3IgaW4gc2lnbW9pZENyb3NzRW50cm9weVdpdGhMb2dpdHM6ICcpO1xuICAgIC8qKlxuICAgICAqIEltcGxlbWVudGF0aW9uIERldGFpbHM6XG4gICAgICpcbiAgICAgKiBGb3IgYnJldml0eSwgbGV0IGB4ID0gbG9naXRzYCwgYHogPSBsYWJlbHNgLiAgVGhlIGxvZ2lzdGljIGxvc3MgaXNcbiAgICAgKiAgICAgeiAqIC1sb2coc2lnbW9pZCh4KSkgKyAoMSAtIHopICogLWxvZygxIC0gc2lnbW9pZCh4KSlcbiAgICAgKiAgID0geiAqIC1sb2coMSAvICgxICsgZXhwKC14KSkpICsgKDEgLSB6KSAqIC1sb2coZXhwKC14KSAvICgxICsgZXhwKC14KSkpXG4gICAgICogICA9IHogKiBsb2coMSArIGV4cCgteCkpICsgKDEgLSB6KSAqICgtbG9nKGV4cCgteCkpICsgbG9nKDEgKyBleHAoLXgpKSlcbiAgICAgKiAgID0geiAqIGxvZygxICsgZXhwKC14KSkgKyAoMSAtIHopICogKHggKyBsb2coMSArIGV4cCgteCkpXG4gICAgICogICA9ICgxIC0geikgKiB4ICsgbG9nKDEgKyBleHAoLXgpKVxuICAgICAqICAgPSB4IC0geCAqIHogKyBsb2coMSArIGV4cCgteCkpXG4gICAgICpcbiAgICAgKiAgIEZvciB4IDwgMCwgdG8gYXZvaWQgb3ZlcmZsb3cgaW4gZXhwKC14KSwgd2UgcmVmb3JtdWxhdGUgdGhlIGFib3ZlXG4gICAgICogICAgIHggLSB4ICogeiArIGxvZygxICsgZXhwKC14KSlcbiAgICAgKiAgID0gbG9nKGV4cCh4KSkgLSB4ICogeiArIGxvZygxICsgZXhwKC14KSlcbiAgICAgKiAgID0gLSB4ICogeiArIGxvZygxICsgZXhwKHgpKVxuICAgICAqXG4gICAgICogSGVuY2UsIHRvIGVuc3VyZSBzdGFiaWxpdHkgYW5kIGF2b2lkIG92ZXJmbG93LCB0aGUgaW1wbGVtZW50YXRpb24gdXNlc1xuICAgICAqIHRoaXMgZXF1aXZhbGVudCBmb3JtdWxhdGlvbjpcbiAgICAgKiAgICAgbWF4KHgsIDApIC0geCAqIHogKyBsb2coMSArIGV4cCgtYWJzKHgpKSlcbiAgICAgKi9cbiAgICBjb25zdCBtYXhPdXRwdXQgPSByZWx1KCRsb2dpdHMpO1xuICAgIGNvbnN0IG91dHB1dFhUYXJnZXQgPSBtdWwoJGxvZ2l0cywgJGxhYmVscyk7XG4gICAgY29uc3Qgc2lnbW9pZE91dHB1dCA9IGxvZzFwKGV4cChuZWcoYWJzKCRsb2dpdHMpKSkpO1xuICAgIHJldHVybiBhZGQoc3ViKG1heE91dHB1dCwgb3V0cHV0WFRhcmdldCksIHNpZ21vaWRPdXRwdXQpO1xufVxuLyoqXG4gKiBDb21wdXRlcyB0aGUgc2lnbW9pZCBjcm9zcyBlbnRyb3B5IGxvc3MgYmV0d2VlbiB0d28gdGVuc29ycy5cbiAqXG4gKiBJZiBsYWJlbFNtb290aGluZyBpcyBub256ZXJvLCBzbW9vdGggdGhlIGxhYmVscyB0b3dhcmRzIDEvMjpcbiAqXG4gKiAgIG5ld011bHRpY2xhc3NMYWJlbHMgPSBtdWx0aWNsYXNzTGFiZWxzICogKDEgLSBsYWJlbFNtb290aGluZylcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICsgMC41ICogbGFiZWxTbW9vdGhpbmdcbiAqXG4gKiBAcGFyYW0gbXVsdGlDbGFzc0xhYmVscyBUaGUgZ3JvdW5kIHRydXRoIG91dHB1dCB0ZW5zb3Igb2Ygc2hhcGVcbiAqIFtiYXRjaF9zaXplLCBudW1fY2xhc3Nlc10sIHNhbWUgZGltZW5zaW9ucyBhcyAncHJlZGljdGlvbnMnLlxuICogQHBhcmFtIGxvZ2l0cyBUaGUgcHJlZGljdGVkIG91dHB1dHMuXG4gKiBAcGFyYW0gd2VpZ2h0cyBUZW5zb3Igd2hvc2UgcmFuayBpcyBlaXRoZXIgMCwgb3IgdGhlIHNhbWUgcmFuayBhc1xuICogICAgYGxhYmVsc2AsIGFuZCBtdXN0IGJlIGJyb2FkY2FzdGFibGUgdG8gYGxhYmVsc2AgKGkuZS4sIGFsbCBkaW1lbnNpb25zXG4gKiAgICBtdXN0IGJlIGVpdGhlciBgMWAsIG9yIHRoZSBzYW1lIGFzIHRoZSBjb3JyZXNwb25kaW5nIGBsb3NzZXNgXG4gKiAgICBkaW1lbnNpb24pLlxuICogQHBhcmFtIGxhYmVsU21vb3RoaW5nIElmIGdyZWF0ZXIgdGhhbiAwLCB0aGVuIHNtb290aCB0aGUgbGFiZWxzLlxuICogQHBhcmFtIHJlZHVjdGlvbiBUeXBlIG9mIHJlZHVjdGlvbiB0byBhcHBseSB0byBsb3NzLiBTaG91bGQgYmUgb2YgdHlwZVxuICogICAgYFJlZHVjdGlvbmBcbiAqXG4gKiBAZG9jIHsgaGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0xvc3NlcycsIG5hbWVzcGFjZTogJ2xvc3NlcycgfVxuICovXG5mdW5jdGlvbiBzaWdtb2lkQ3Jvc3NFbnRyb3B5XyhtdWx0aUNsYXNzTGFiZWxzLCBsb2dpdHMsIHdlaWdodHMsIGxhYmVsU21vb3RoaW5nID0gMCwgcmVkdWN0aW9uID0gUmVkdWN0aW9uLlNVTV9CWV9OT05aRVJPX1dFSUdIVFMpIHtcbiAgICBsZXQgJG11bHRpQ2xhc3NMYWJlbHMgPSBjb252ZXJ0VG9UZW5zb3IobXVsdGlDbGFzc0xhYmVscywgJ211bHRpQ2xhc3NMYWJlbHMnLCAnc2lnbW9pZENyb3NzRW50cm9weScpO1xuICAgIGNvbnN0ICRsb2dpdHMgPSBjb252ZXJ0VG9UZW5zb3IobG9naXRzLCAnbG9naXRzJywgJ3NpZ21vaWRDcm9zc0VudHJvcHknKTtcbiAgICBsZXQgJHdlaWdodHMgPSBudWxsO1xuICAgIGlmICh3ZWlnaHRzICE9IG51bGwpIHtcbiAgICAgICAgJHdlaWdodHMgPSBjb252ZXJ0VG9UZW5zb3Iod2VpZ2h0cywgJ3dlaWdodHMnLCAnc2lnbW9pZENyb3NzRW50cm9weScpO1xuICAgIH1cbiAgICBhc3NlcnRTaGFwZXNNYXRjaCgkbXVsdGlDbGFzc0xhYmVscy5zaGFwZSwgJGxvZ2l0cy5zaGFwZSwgJ0Vycm9yIGluIHNpZ21vaWRDcm9zc0VudHJvcHk6ICcpO1xuICAgIGlmIChsYWJlbFNtb290aGluZyA+IDApIHtcbiAgICAgICAgY29uc3QgbGFiZWxTbW9vdGhpbmdTY2FsYXIgPSBzY2FsYXIobGFiZWxTbW9vdGhpbmcpO1xuICAgICAgICBjb25zdCBvbmUgPSBzY2FsYXIoMSk7XG4gICAgICAgIGNvbnN0IGhhbGYgPSBzY2FsYXIoMC41KTtcbiAgICAgICAgJG11bHRpQ2xhc3NMYWJlbHMgPVxuICAgICAgICAgICAgYWRkKG11bCgkbXVsdGlDbGFzc0xhYmVscywgc3ViKG9uZSwgbGFiZWxTbW9vdGhpbmdTY2FsYXIpKSwgbXVsKGhhbGYsIGxhYmVsU21vb3RoaW5nU2NhbGFyKSk7XG4gICAgfVxuICAgIGNvbnN0IGxvc3NlcyA9IHNpZ21vaWRDcm9zc0VudHJvcHlXaXRoTG9naXRzXygkbXVsdGlDbGFzc0xhYmVscywgJGxvZ2l0cyk7XG4gICAgcmV0dXJuIGNvbXB1dGVXZWlnaHRlZExvc3MobG9zc2VzLCAkd2VpZ2h0cywgcmVkdWN0aW9uKTtcbn1cbmV4cG9ydCBjb25zdCBzaWdtb2lkQ3Jvc3NFbnRyb3B5ID0gb3AoeyBzaWdtb2lkQ3Jvc3NFbnRyb3B5XyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNpZ21vaWRfY3Jvc3NfZW50cm9weS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjdXN0b21HcmFkIH0gZnJvbSAnLi4vLi4vZ3JhZGllbnRzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnRTaGFwZXNNYXRjaCB9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHsgYWRkIH0gZnJvbSAnLi4vYWRkJztcbmltcG9ydCB7IGV4cGFuZFNoYXBlVG9LZWVwRGltIH0gZnJvbSAnLi4vYXhpc191dGlsJztcbmltcG9ydCB7IGNhc3QgfSBmcm9tICcuLi9jYXN0JztcbmltcG9ydCB7IGRpdiB9IGZyb20gJy4uL2Rpdic7XG5pbXBvcnQgeyBleHAgfSBmcm9tICcuLi9leHAnO1xuaW1wb3J0IHsgbG9nU3VtRXhwIH0gZnJvbSAnLi4vbG9nX3N1bV9leHAnO1xuaW1wb3J0IHsgUmVkdWN0aW9uIH0gZnJvbSAnLi4vbG9zc19vcHNfdXRpbHMnO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi4vbXVsJztcbmltcG9ydCB7IG5lZyB9IGZyb20gJy4uL25lZyc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4uL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi4vcmVzaGFwZSc7XG5pbXBvcnQgeyBzY2FsYXIgfSBmcm9tICcuLi9zY2FsYXInO1xuaW1wb3J0IHsgc3ViIH0gZnJvbSAnLi4vc3ViJztcbmltcG9ydCB7IHN1bSB9IGZyb20gJy4uL3N1bSc7XG5pbXBvcnQgeyBjb21wdXRlV2VpZ2h0ZWRMb3NzIH0gZnJvbSAnLi9jb21wdXRlX3dlaWdodGVkX2xvc3MnO1xuLyoqXG4gKiBDb21wdXRlcyBzb2Z0bWF4IGNyb3NzIGVudHJvcHkgYmV0d2VlbiBsb2dpdHMgYW5kIGxhYmVscy5cbiAqXG4gKiBNZWFzdXJlcyB0aGUgcHJvYmFiaWxpdHkgZXJyb3IgaW4gZGlzY3JldGUgY2xhc3NpZmljYXRpb24gdGFza3MgaW4gd2hpY2hcbiAqIHRoZSBjbGFzc2VzIGFyZSBtdXR1YWxseSBleGNsdXNpdmUgKGVhY2ggZW50cnkgaXMgaW4gZXhhY3RseSBvbmUgY2xhc3MpLlxuICogRm9yIGV4YW1wbGUsIGVhY2ggQ0lGQVItMTAgaW1hZ2UgaXMgbGFiZWxlZCB3aXRoIG9uZSBhbmQgb25seSBvbmUgbGFiZWw6IGFuXG4gKiBpbWFnZSBjYW4gYmUgYSBkb2cgb3IgYSB0cnVjaywgYnV0IG5vdCBib3RoLlxuICpcbiAqIGBOT1RFYDogV2hpbGUgdGhlIGNsYXNzZXMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSwgdGhlaXIgcHJvYmFiaWxpdGllcyBuZWVkXG4gKiBub3QgYmUuIEFsbCB0aGF0IGlzIHJlcXVpcmVkIGlzIHRoYXQgZWFjaCByb3cgb2YgbGFiZWxzIGlzIGEgdmFsaWRcbiAqIHByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbi4gSWYgdGhleSBhcmUgbm90LCB0aGUgY29tcHV0YXRpb24gb2YgdGhlIGdyYWRpZW50XG4gKiB3aWxsIGJlIGluY29ycmVjdC5cbiAqXG4gKiBgV0FSTklOR2A6IFRoaXMgb3AgZXhwZWN0cyB1bnNjYWxlZCBsb2dpdHMsIHNpbmNlIGl0IHBlcmZvcm1zIGEgc29mdG1heCBvblxuICogbG9naXRzIGludGVybmFsbHkgZm9yIGVmZmljaWVuY3kuIERvIG5vdCBjYWxsIHRoaXMgb3Agd2l0aCB0aGUgb3V0cHV0IG9mXG4gKiBzb2Z0bWF4LCBhcyBpdCB3aWxsIHByb2R1Y2UgaW5jb3JyZWN0IHJlc3VsdHMuXG4gKlxuICogbG9naXRzIGFuZCBsYWJlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIHNoYXBlLCBlLmcuIFtiYXRjaF9zaXplLCBudW1fY2xhc3Nlc11cbiAqIGFuZCB0aGUgc2FtZSBkdHlwZS5cbiAqIEBwYXJhbSBsYWJlbHMgVGhlIGxhYmVscyBhcnJheS5cbiAqIEBwYXJhbSBsb2dpdHMgVGhlIGxvZ2l0cyBhcnJheS5cbiAqIEBwYXJhbSBkaW0gVGhlIGRpbWVuc2lvbiBzb2Z0bWF4IHdvdWxkIGJlIHBlcmZvcm1lZCBvbi4gRGVmYXVsdHMgdG8gYC0xYFxuICogICAgIHdoaWNoIGluZGljYXRlcyB0aGUgbGFzdCBkaW1lbnNpb24uXG4gKi9cbmZ1bmN0aW9uIHNvZnRtYXhDcm9zc0VudHJvcHlXaXRoTG9naXRzXyhsYWJlbHMsIGxvZ2l0cywgZGltID0gLTEpIHtcbiAgICBpZiAoZGltID09PSAtMSkge1xuICAgICAgICBkaW0gPSBsb2dpdHMucmFuayAtIDE7XG4gICAgfVxuICAgIGlmIChkaW0gIT09IGxvZ2l0cy5yYW5rIC0gMSkge1xuICAgICAgICB0aHJvdyBFcnJvcihgU29mdG1heCBjcm9zcyBlbnRyb3B5IGFsb25nIGEgbm9uLWxhc3QgZGltZW5zaW9uIGlzIG5vdCB5ZXQgYCArXG4gICAgICAgICAgICBgc3VwcG9ydGVkLiBMYWJlbHMgLyBsb2dpdHMgd2FzIHJhbmsgJHtsb2dpdHMucmFua30gYCArXG4gICAgICAgICAgICBgYW5kIGRpbSB3YXMgJHtkaW19YCk7XG4gICAgfVxuICAgIC8vIFVzZSBhIGN1c3RvbSBncmFkaWVudCBmb3IgbnVtZXJpY2FsIHN0YWJpbGl0eS5cbiAgICBjb25zdCBjdXN0b21PcCA9IGN1c3RvbUdyYWQoKGxhYmVscywgbG9naXRzLCBzYXZlKSA9PiB7XG4gICAgICAgIC8vIFJlZmVyZW5jZTpcbiAgICAgICAgLy8gICAxLiBodHRwOi8vY3MyMzFuLmdpdGh1Yi5pby9saW5lYXItY2xhc3NpZnkvI3NvZnRtYXhcbiAgICAgICAgLy8gICAyLiBodHRwczovL2Jsb2cuZmVlZGx5LmNvbS90cmlja3Mtb2YtdGhlLXRyYWRlLWxvZ3N1bWV4cC9cbiAgICAgICAgY29uc3Qga2VlcERpbXMgPSB0cnVlO1xuICAgICAgICBjb25zdCBsc2UgPSBsb2dTdW1FeHAobG9naXRzLCBbZGltXSwga2VlcERpbXMpO1xuICAgICAgICBjb25zdCBsb2dSZXN1bHQgPSBzdWIoY2FzdChsb2dpdHMsICdmbG9hdDMyJyksIGxzZSk7XG4gICAgICAgIHNhdmUoW2xhYmVscywgbG9nUmVzdWx0XSk7XG4gICAgICAgIGNvbnN0IGNvc3RWZWN0b3IgPSBuZWcobXVsKGxvZ1Jlc3VsdCwgbGFiZWxzKSk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gc3VtKGNvc3RWZWN0b3IsIFtkaW1dKTtcbiAgICAgICAgY29uc3QgZ3JhZEZ1bmMgPSAoZHksIHNhdmVkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBbbGFiZWxzLCBsb2dSZXN1bHRdID0gc2F2ZWQ7XG4gICAgICAgICAgICBjb25zdCBkeVNoYXBlID0gZXhwYW5kU2hhcGVUb0tlZXBEaW0oZHkuc2hhcGUsIFtkaW1dKTtcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgbXVsKHJlc2hhcGUoZHksIGR5U2hhcGUpLCBzdWIoY2FzdChsYWJlbHMsICdmbG9hdDMyJyksIGV4cChsb2dSZXN1bHQpKSksXG4gICAgICAgICAgICAgICAgbXVsKHJlc2hhcGUoZHksIGR5U2hhcGUpLCBzdWIoZXhwKGxvZ1Jlc3VsdCksIGNhc3QobGFiZWxzLCAnZmxvYXQzMicpKSksXG4gICAgICAgICAgICBdO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4geyB2YWx1ZSwgZ3JhZEZ1bmMgfTtcbiAgICB9KTtcbiAgICByZXR1cm4gY3VzdG9tT3AobGFiZWxzLCBsb2dpdHMpO1xufVxuLyoqXG4gKiBDb21wdXRlcyB0aGUgc29mdG1heCBjcm9zcyBlbnRyb3B5IGxvc3MgYmV0d2VlbiB0d28gdGVuc29ycy5cbiAqXG4gKiBJZiBsYWJlbFNtb290aGluZyBpcyBub256ZXJvLCBzbW9vdGggdGhlIGxhYmVscyB0b3dhcmRzIDEvMjpcbiAqXG4gKiAgIG5ld09uZWhvdExhYmVscyA9IG9uZWhvdExhYmVscyAqICgxIC0gbGFiZWxTbW9vdGhpbmcpXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICArIGxhYmVsU21vb3RoaW5nIC8gbnVtQ2xhc3Nlc1xuICpcbiAqIEBwYXJhbSBvbmVob3RMYWJlbHMgT25lIGhvdCBlbmNvZGVkIGxhYmVsc1xuICogICAgW2JhdGNoX3NpemUsIG51bV9jbGFzc2VzXSwgc2FtZSBkaW1lbnNpb25zIGFzICdwcmVkaWN0aW9ucycuXG4gKiBAcGFyYW0gbG9naXRzIFRoZSBwcmVkaWN0ZWQgb3V0cHV0cy5cbiAqIEBwYXJhbSB3ZWlnaHRzIFRlbnNvciB3aG9zZSByYW5rIGlzIGVpdGhlciAwLCBvciAxLCBhbmQgbXVzdCBiZVxuICogICAgYnJvYWRjYXN0YWJsZSB0byBgbG9zc2AgIG9mIHNoYXBlIFtiYXRjaF9zaXplXVxuICogQHBhcmFtIGxhYmVsU21vb3RoaW5nIElmIGdyZWF0ZXIgdGhhbiAwLCB0aGVuIHNtb290aCB0aGUgbGFiZWxzLlxuICogQHBhcmFtIHJlZHVjdGlvbiBUeXBlIG9mIHJlZHVjdGlvbiB0byBhcHBseSB0byBsb3NzLiBTaG91bGQgYmUgb2YgdHlwZVxuICogICAgYFJlZHVjdGlvbmBcbiAqXG4gKiBAZG9jIHsgaGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0xvc3NlcycsIG5hbWVzcGFjZTogJ2xvc3NlcycgfVxuICovXG5mdW5jdGlvbiBzb2Z0bWF4Q3Jvc3NFbnRyb3B5XyhvbmVob3RMYWJlbHMsIGxvZ2l0cywgd2VpZ2h0cywgbGFiZWxTbW9vdGhpbmcgPSAwLCByZWR1Y3Rpb24gPSBSZWR1Y3Rpb24uU1VNX0JZX05PTlpFUk9fV0VJR0hUUykge1xuICAgIGxldCAkb25laG90TGFiZWxzID0gY29udmVydFRvVGVuc29yKG9uZWhvdExhYmVscywgJ29uZWhvdExhYmVscycsICdzb2Z0bWF4Q3Jvc3NFbnRyb3B5Jyk7XG4gICAgY29uc3QgJGxvZ2l0cyA9IGNvbnZlcnRUb1RlbnNvcihsb2dpdHMsICdsb2dpdHMnLCAnc29mdG1heENyb3NzRW50cm9weScpO1xuICAgIGxldCAkd2VpZ2h0cyA9IG51bGw7XG4gICAgaWYgKHdlaWdodHMgIT0gbnVsbCkge1xuICAgICAgICAkd2VpZ2h0cyA9IGNvbnZlcnRUb1RlbnNvcih3ZWlnaHRzLCAnd2VpZ2h0cycsICdzb2Z0bWF4Q3Jvc3NFbnRyb3B5Jyk7XG4gICAgfVxuICAgIGFzc2VydFNoYXBlc01hdGNoKCRvbmVob3RMYWJlbHMuc2hhcGUsICRsb2dpdHMuc2hhcGUsICdFcnJvciBpbiBzb2Z0bWF4Q3Jvc3NFbnRyb3B5OiAnKTtcbiAgICBpZiAobGFiZWxTbW9vdGhpbmcgPiAwKSB7XG4gICAgICAgIGNvbnN0IGxhYmVsU21vb3RoaW5nU2NhbGFyID0gc2NhbGFyKGxhYmVsU21vb3RoaW5nKTtcbiAgICAgICAgY29uc3Qgb25lID0gc2NhbGFyKDEpO1xuICAgICAgICBjb25zdCBudW1DbGFzc2VzID0gc2NhbGFyKCRvbmVob3RMYWJlbHMuc2hhcGVbMV0pO1xuICAgICAgICAkb25laG90TGFiZWxzID1cbiAgICAgICAgICAgIGFkZChtdWwoJG9uZWhvdExhYmVscywgc3ViKG9uZSwgbGFiZWxTbW9vdGhpbmdTY2FsYXIpKSwgZGl2KGxhYmVsU21vb3RoaW5nU2NhbGFyLCBudW1DbGFzc2VzKSk7XG4gICAgfVxuICAgIGNvbnN0IGxvc3NlcyA9IHNvZnRtYXhDcm9zc0VudHJvcHlXaXRoTG9naXRzXygkb25laG90TGFiZWxzLCAkbG9naXRzKTtcbiAgICByZXR1cm4gY29tcHV0ZVdlaWdodGVkTG9zcyhsb3NzZXMsICR3ZWlnaHRzLCByZWR1Y3Rpb24pO1xufVxuZXhwb3J0IGNvbnN0IHNvZnRtYXhDcm9zc0VudHJvcHkgPSBvcCh7IHNvZnRtYXhDcm9zc0VudHJvcHlfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c29mdG1heF9jcm9zc19lbnRyb3B5LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBCYXRjaE1hdE11bCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBtYWtlVHlwZXNNYXRjaCB9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHR3byBtYXRyaWNlcywgQSAqIEIuIFRoZXNlIG11c3QgYmUgbWF0cmljZXMuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IyZChbMSwgMl0sIFsxLCAyXSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pO1xuICpcbiAqIGEubWF0TXVsKGIpLnByaW50KCk7ICAvLyBvciB0Zi5tYXRNdWwoYSwgYilcbiAqIGBgYFxuICogQHBhcmFtIGEgRmlyc3QgbWF0cml4IGluIGRvdCBwcm9kdWN0IG9wZXJhdGlvbi5cbiAqIEBwYXJhbSBiIFNlY29uZCBtYXRyaXggaW4gZG90IHByb2R1Y3Qgb3BlcmF0aW9uLlxuICogQHBhcmFtIHRyYW5zcG9zZUEgSWYgdHJ1ZSwgYGFgIGlzIHRyYW5zcG9zZWQgYmVmb3JlIG11bHRpcGxpY2F0aW9uLlxuICogQHBhcmFtIHRyYW5zcG9zZUIgSWYgdHJ1ZSwgYGJgIGlzIHRyYW5zcG9zZWQgYmVmb3JlIG11bHRpcGxpY2F0aW9uLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ01hdHJpY2VzJ31cbiAqL1xuZnVuY3Rpb24gbWF0TXVsXyhhLCBiLCB0cmFuc3Bvc2VBID0gZmFsc2UsIHRyYW5zcG9zZUIgPSBmYWxzZSkge1xuICAgIGxldCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdtYXRNdWwnKTtcbiAgICBsZXQgJGIgPSBjb252ZXJ0VG9UZW5zb3IoYiwgJ2InLCAnbWF0TXVsJyk7XG4gICAgWyRhLCAkYl0gPSBtYWtlVHlwZXNNYXRjaCgkYSwgJGIpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgYTogJGEsIGI6ICRiIH07XG4gICAgY29uc3QgYXR0cnMgPSB7IHRyYW5zcG9zZUEsIHRyYW5zcG9zZUIgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChCYXRjaE1hdE11bCwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgbWF0TXVsID0gb3AoeyBtYXRNdWxfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWF0X211bC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTWF4IH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIG1heGltdW0gb2YgZWxlbWVudHMgYWNyb3NzIGRpbWVuc2lvbnMgb2YgYSBgdGYuVGVuc29yYC5cbiAqXG4gKiBSZWR1Y2VzIHRoZSBpbnB1dCBhbG9uZyB0aGUgZGltZW5zaW9ucyBnaXZlbiBpbiBgYXhlc2AuIFVubGVzcyBga2VlcERpbXNgXG4gKiBpcyB0cnVlLCB0aGUgcmFuayBvZiB0aGUgYHRmLlRlbnNvcmAgaXMgcmVkdWNlZCBieSAxIGZvciBlYWNoIGVudHJ5IGluXG4gKiBgYXhlc2AuIElmIGBrZWVwRGltc2AgaXMgdHJ1ZSwgdGhlIHJlZHVjZWQgZGltZW5zaW9ucyBhcmUgcmV0YWluZWQgd2l0aFxuICogbGVuZ3RoIDEuIElmIGBheGVzYCBoYXMgbm8gZW50cmllcywgYWxsIGRpbWVuc2lvbnMgYXJlIHJlZHVjZWQsIGFuZCBhblxuICogYHRmLlRlbnNvcmAgd2l0aCBhIHNpbmdsZSBlbGVtZW50IGlzIHJldHVybmVkLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqXG4gKiB4Lm1heCgpLnByaW50KCk7ICAvLyBvciB0Zi5tYXgoeClcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pO1xuICpcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5tYXgoYXhpcykucHJpbnQoKTsgIC8vIG9yIHRmLm1heCh4LCBheGlzKVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBheGlzIFRoZSBkaW1lbnNpb24ocykgdG8gcmVkdWNlLiBCeSBkZWZhdWx0IGl0IHJlZHVjZXNcbiAqICAgICBhbGwgZGltZW5zaW9ucy5cbiAqIEBwYXJhbSBrZWVwRGltcyBJZiB0cnVlLCByZXRhaW5zIHJlZHVjZWQgZGltZW5zaW9ucyB3aXRoIHNpemUgMS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdSZWR1Y3Rpb24nfVxuICovXG5mdW5jdGlvbiBtYXhfKHgsIGF4aXMgPSBudWxsLCBrZWVwRGltcyA9IGZhbHNlKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnbWF4Jyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyByZWR1Y3Rpb25JbmRpY2VzOiBheGlzLCBrZWVwRGltcyB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKE1heCwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgbWF4ID0gb3AoeyBtYXhfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWF4LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBNYXhQb29sIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0ICogYXMgY29udl91dGlsIGZyb20gJy4vY29udl91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vcmVzaGFwZSc7XG4vKipcbiAqIENvbXB1dGVzIHRoZSAyRCBtYXggcG9vbGluZyBvZiBhbiBpbWFnZS5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDQgb3IgcmFuayAzIG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgaW5DaGFubmVsc11gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXJTaXplIFRoZSBmaWx0ZXIgc2l6ZTogYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoXWAuIElmXG4gKiAgICAgYGZpbHRlclNpemVgIGlzIGEgc2luZ2xlIG51bWJlciwgdGhlbiBgZmlsdGVySGVpZ2h0ID09IGZpbHRlcldpZHRoYC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBwb29saW5nOiBgW3N0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGhdYC4gSWZcbiAqICAgICBgc3RyaWRlc2AgaXMgYSBzaW5nbGUgbnVtYmVyLCB0aGVuIGBzdHJpZGVIZWlnaHQgPT0gc3RyaWRlV2lkdGhgLlxuICogQHBhcmFtIGRpbGF0aW9ucyBUaGUgZGlsYXRpb24gcmF0ZXM6IGBbZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGhdYFxuICogICAgIGluIHdoaWNoIHdlIHNhbXBsZSBpbnB1dCB2YWx1ZXMgYWNyb3NzIHRoZSBoZWlnaHQgYW5kIHdpZHRoIGRpbWVuc2lvbnNcbiAqICAgICBpbiBkaWxhdGVkIHBvb2xpbmcuIERlZmF1bHRzIHRvIGBbMSwgMV1gLiBJZiBgZGlsYXRpb25zYCBpcyBhIHNpbmdsZVxuICogICAgIG51bWJlciwgdGhlbiBgZGlsYXRpb25IZWlnaHQgPT0gZGlsYXRpb25XaWR0aGAuIElmIGl0IGlzIGdyZWF0ZXIgdGhhblxuICogICAgIDEsIHRoZW4gYWxsIHZhbHVlcyBvZiBgc3RyaWRlc2AgbXVzdCBiZSAxLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobS5cbiAqICAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAgLSBGb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uXShcbiAqICAgICAgICAgIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbilcbiAqIEBwYXJhbSBkaW1Sb3VuZGluZ01vZGUgQSBzdHJpbmcgZnJvbTogJ2NlaWwnLCAncm91bmQnLCAnZmxvb3InLiBJZiBub25lIGlzXG4gKiAgICAgcHJvdmlkZWQsIGl0IHdpbGwgZGVmYXVsdCB0byB0cnVuY2F0ZS5cbiAqL1xuZnVuY3Rpb24gbWF4UG9vbF8oeCwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdtYXhQb29sJyk7XG4gICAgY29uc3QgZGlsYXRpb25zID0gMTtcbiAgICBsZXQgeDREID0gJHg7XG4gICAgbGV0IHJlc2hhcGVkVG80RCA9IGZhbHNlO1xuICAgIGlmICgkeC5yYW5rID09PSAzKSB7XG4gICAgICAgIHJlc2hhcGVkVG80RCA9IHRydWU7XG4gICAgICAgIHg0RCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV0sICR4LnNoYXBlWzJdXSk7XG4gICAgfVxuICAgIHV0aWwuYXNzZXJ0KHg0RC5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gbWF4UG9vbDogaW5wdXQgbXVzdCBiZSByYW5rIDQgYnV0IGdvdCByYW5rICR7eDRELnJhbmt9LmApO1xuICAgIHV0aWwuYXNzZXJ0KGNvbnZfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgZGlsYXRpb25zKSwgKCkgPT4gJ0Vycm9yIGluIG1heFBvb2w6IEVpdGhlciBzdHJpZGVzIG9yIGRpbGF0aW9ucyBtdXN0IGJlIDEuICcgK1xuICAgICAgICBgR290IHN0cmlkZXMgJHtzdHJpZGVzfSBhbmQgZGlsYXRpb25zICcke2RpbGF0aW9uc30nYCk7XG4gICAgaWYgKGRpbVJvdW5kaW5nTW9kZSAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNJbnQocGFkKSwgKCkgPT4gYEVycm9yIGluIG1heFBvb2w6IHBhZCBtdXN0IGJlIGFuIGludGVnZXIgd2hlbiB1c2luZywgYCArXG4gICAgICAgICAgICBgZGltUm91bmRpbmdNb2RlICR7ZGltUm91bmRpbmdNb2RlfSBidXQgZ290IHBhZCAke3BhZH0uYCk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogeDREIH07XG4gICAgY29uc3QgYXR0cnMgPSB7IGZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlIH07XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgIGNvbnN0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoTWF4UG9vbCwgaW5wdXRzLCBhdHRycyk7XG4gICAgaWYgKHJlc2hhcGVkVG80RCkge1xuICAgICAgICByZXR1cm4gcmVzaGFwZShyZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdXSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5leHBvcnQgY29uc3QgbWF4UG9vbCA9IG9wKHsgbWF4UG9vbF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tYXhfcG9vbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTWF4UG9vbDNEIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIDNEIG1heCBwb29saW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yNWQoWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDhdLCBbMSwgMiwgMiwgMiwgMV0pO1xuICogY29uc3QgcmVzdWx0ID0gdGYubWF4UG9vbDNkKHgsIDIsIDEsICd2YWxpZCcpO1xuICogcmVzdWx0LnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDUgb3IgcmFuayA0IG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgZGVwdGgsIGhlaWdodCwgd2lkdGgsIGluQ2hhbm5lbHNdYC5cbiAqIEBwYXJhbSBmaWx0ZXJTaXplIFRoZSBmaWx0ZXIgc2l6ZTpcbiAqICAgICBgW2ZpbHRlckRlcHRoLCBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoXWAuXG4gKiAgICAgSWYgYGZpbHRlclNpemVgIGlzIGEgc2luZ2xlIG51bWJlcixcbiAqICAgICB0aGVuIGBmaWx0ZXJEZXB0aCA9PSBmaWx0ZXJIZWlnaHQgPT0gZmlsdGVyV2lkdGhgLlxuICogQHBhcmFtIHN0cmlkZXMgVGhlIHN0cmlkZXMgb2YgdGhlIHBvb2xpbmc6XG4gKiAgICAgYFtzdHJpZGVEZXB0aCwgc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aF1gLlxuICogICAgIElmIGBzdHJpZGVzYCBpcyBhIHNpbmdsZSBudW1iZXIsXG4gKiAgICAgdGhlbiBgc3RyaWRlRGVwdGggPT0gc3RyaWRlSGVpZ2h0ID09IHN0cmlkZVdpZHRoYC5cbiAqIEBwYXJhbSBwYWQgVGhlIHR5cGUgb2YgcGFkZGluZyBhbGdvcml0aG0uXG4gKiAgICAtIGBzYW1lYCBhbmQgc3RyaWRlIDE6IG91dHB1dCB3aWxsIGJlIG9mIHNhbWUgc2l6ZSBhcyBpbnB1dCxcbiAqICAgICAgIHJlZ2FyZGxlc3Mgb2YgZmlsdGVyIHNpemUuXG4gKiAgICAtIGB2YWxpZGA6IG91dHB1dCB3aWxsIGJlIHNtYWxsZXIgdGhhbiBpbnB1dCBpZiBmaWx0ZXIgaXMgbGFyZ2VyXG4gKiAgICAgICB0aGFuIDEqMXgxLlxuICogICAgLSBGb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uXShcbiAqICAgICAgICAgIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbilcbiAqIEBwYXJhbSBkaW1Sb3VuZGluZ01vZGUgQSBzdHJpbmcgZnJvbTogJ2NlaWwnLCAncm91bmQnLCAnZmxvb3InLiBJZiBub25lIGlzXG4gKiAgICAgcHJvdmlkZWQsIGl0IHdpbGwgZGVmYXVsdCB0byB0cnVuY2F0ZS5cbiAqIEBwYXJhbSBkYXRhRm9ybWF0IEFuIG9wdGlvbmFsIHN0cmluZyBmcm9tOiBcIk5ESFdDXCIsIFwiTkNESFdcIi4gRGVmYXVsdHMgdG9cbiAqICAgICBcIk5ESFdDXCIuIFNwZWNpZnkgdGhlIGRhdGEgZm9ybWF0IG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEuIFdpdGggdGhlXG4gKiAgICAgZGVmYXVsdCBmb3JtYXQgXCJOREhXQ1wiLCB0aGUgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIG9yZGVyIG9mOiBbYmF0Y2gsXG4gKiAgICAgZGVwdGgsIGhlaWdodCwgd2lkdGgsIGNoYW5uZWxzXS4gT25seSBcIk5ESFdDXCIgaXMgY3VycmVudGx5IHN1cHBvcnRlZC5cbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0NvbnZvbHV0aW9uJ31cbiAqL1xuZnVuY3Rpb24gbWF4UG9vbDNkXyh4LCBmaWx0ZXJTaXplID0gWzEsIDEsIDFdLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgZGF0YUZvcm1hdCA9ICdOREhXQycpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdtYXhQb29sM2QnKTtcbiAgICBsZXQgeDVEID0gJHg7XG4gICAgbGV0IHJlc2hhcGVkVG81RCA9IGZhbHNlO1xuICAgIGlmICgkeC5yYW5rID09PSA0KSB7XG4gICAgICAgIHJlc2hhcGVkVG81RCA9IHRydWU7XG4gICAgICAgIHg1RCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV0sICR4LnNoYXBlWzJdLCAkeC5zaGFwZVszXV0pO1xuICAgIH1cbiAgICB1dGlsLmFzc2VydCh4NUQucmFuayA9PT0gNSwgKCkgPT4gYEVycm9yIGluIG1heFBvb2wzZDogeCBtdXN0IGJlIHJhbmsgNSBidXQgZ290IHJhbmsgJHt4NUQucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoZGF0YUZvcm1hdCA9PT0gJ05ESFdDJywgKCkgPT4gYEVycm9yIGluIG1heFBvb2wzZDogT25seSBOREhXQyBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLCBgICtcbiAgICAgICAgYGJ1dCBnb3QgZGF0YUZvcm1hdCBvZiAke2RhdGFGb3JtYXR9YCk7XG4gICAgaWYgKGRpbVJvdW5kaW5nTW9kZSAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNJbnQocGFkKSwgKCkgPT4gYEVycm9yIGluIG1heFBvb2wzZDogcGFkIG11c3QgYmUgYW4gaW50ZWdlciB3aGVuIHVzaW5nLCBgICtcbiAgICAgICAgICAgIGBkaW1Sb3VuZGluZ01vZGUgJHtkaW1Sb3VuZGluZ01vZGV9IGJ1dCBnb3QgcGFkICR7cGFkfS5gKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiB4NUQgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGRhdGFGb3JtYXQgfTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgY29uc3QgcmVzID0gRU5HSU5FLnJ1bktlcm5lbChNYXhQb29sM0QsIGlucHV0cywgYXR0cnMpO1xuICAgIGlmIChyZXNoYXBlZFRvNUQpIHtcbiAgICAgICAgcmV0dXJuIHJlc2hhcGUocmVzLCBbcmVzLnNoYXBlWzFdLCByZXMuc2hhcGVbMl0sIHJlcy5zaGFwZVszXSwgcmVzLnNoYXBlWzRdXSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5leHBvcnQgY29uc3QgbWF4UG9vbDNkID0gb3AoeyBtYXhQb29sM2RfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWF4X3Bvb2xfM2QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IE1heFBvb2xXaXRoQXJnbWF4IH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIDJEIG1heCBwb29saW5nIG9mIGFuIGltYWdlIHdpdGggQXJnbWF4IGluZGV4LlxuICogVGhlIGluZGljZXMgaW4gYXJnbWF4IGFyZSBmbGF0dGVuZWQsIHNvIHRoYXQgYSBtYXhpbXVtIHZhbHVlIGF0IHBvc2l0aW9uIGBbYixcbiAqIHksIHgsIGNdYCBiZWNvbWVzIGZsYXR0ZW5lZCBpbmRleDogYCh5ICogd2lkdGggKyB4KSAqIGNoYW5uZWxzICsgY2AgaWZcbiAqIGluY2x1ZGVfYmF0Y2hfaW5faW5kZXggaXMgRmFsc2U7IGAoKGIgKiBoZWlnaHQgKyB5KSAqIHdpZHRoICsgeCkgKiBjaGFubmVsc1xuICogK2NgIGlmIGluY2x1ZGVfYmF0Y2hfaW5faW5kZXggaXMgVHJ1ZS5cbiAqXG4gKiBUaGUgaW5kaWNlcyByZXR1cm5lZCBhcmUgYWx3YXlzIGluIGBbMCwgaGVpZ2h0KSB4IFswLCB3aWR0aClgIGJlZm9yZVxuICogZmxhdHRlbmluZy5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDQgb3IgcmFuayAzIG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgaW5DaGFubmVsc11gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXJTaXplIFRoZSBmaWx0ZXIgc2l6ZTogYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoXWAuIElmXG4gKiAgICAgYGZpbHRlclNpemVgIGlzIGEgc2luZ2xlIG51bWJlciwgdGhlbiBgZmlsdGVySGVpZ2h0ID09IGZpbHRlcldpZHRoYC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBwb29saW5nOiBgW3N0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGhdYC4gSWZcbiAqICAgICBgc3RyaWRlc2AgaXMgYSBzaW5nbGUgbnVtYmVyLCB0aGVuIGBzdHJpZGVIZWlnaHQgPT0gc3RyaWRlV2lkdGhgLlxuICogQHBhcmFtIGRhdGFGb3JtYXQgQW4gb3B0aW9uYWwgc3RyaW5nIGZyb206IFwiTkRIV0NcIiwgXCJOQ0RIV1wiLiBEZWZhdWx0cyB0b1xuICogICAgIFwiTkRIV0NcIi4gU3BlY2lmeSB0aGUgZGF0YSBmb3JtYXQgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YS4gV2l0aCB0aGVcbiAqICAgICBkZWZhdWx0IGZvcm1hdCBcIk5ESFdDXCIsIHRoZSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgb3JkZXIgb2Y6IFtiYXRjaCxcbiAqICAgICBkZXB0aCwgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbHNdLiBPbmx5IFwiTkRIV0NcIiBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobS5cbiAqICAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAgLSBGb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uXShcbiAqICAgICAgICAgIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbilcbiAqIEBwYXJhbSBpbmNsdWRlQmF0Y2hJbmRleCBEZWZhdWx0cyB0byBGYWxzZS4gV2hldGhlciB0byBpbmNsdWRlIGJhdGNoXG4gKiAgICBkaW1lbnNpb24gaW4gZmxhdHRlbmVkIGluZGV4IG9mIGFyZ21heC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdDb252b2x1dGlvbid9XG4gKi9cbmZ1bmN0aW9uIG1heFBvb2xXaXRoQXJnbWF4Xyh4LCBmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGluY2x1ZGVCYXRjaEluSW5kZXggPSBmYWxzZSkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ21heFBvb2xXaXRoQXJnbWF4Jyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGluY2x1ZGVCYXRjaEluSW5kZXggfTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgY29uc3QgcmVzdWx0ID0gRU5HSU5FLnJ1bktlcm5lbChNYXhQb29sV2l0aEFyZ21heCwgaW5wdXRzLCBhdHRycyk7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiByZXN1bHRbMF0sIGluZGV4ZXM6IHJlc3VsdFsxXSB9O1xufVxuZXhwb3J0IGNvbnN0IG1heFBvb2xXaXRoQXJnbWF4ID0gb3AoeyBtYXhQb29sV2l0aEFyZ21heF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tYXhfcG9vbF93aXRoX2FyZ21heC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTWF4aW11bSB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBtYWtlVHlwZXNNYXRjaCB9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSB9IGZyb20gJy4vYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0IHsgY2FzdCB9IGZyb20gJy4vY2FzdCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV0dXJucyB0aGUgbWF4IG9mIGEgYW5kIGIgKGBhID4gYiA/IGEgOiBiYCkgZWxlbWVudC13aXNlLlxuICogU3VwcG9ydHMgYnJvYWRjYXN0aW5nLlxuICpcbiAqIFdlIGFsc28gZXhwb3NlIGB0Zi5tYXhpbXVtU3RyaWN0YCB3aGljaCBoYXMgdGhlIHNhbWUgc2lnbmF0dXJlIGFzIHRoaXMgb3AgYW5kXG4gKiBhc3NlcnRzIHRoYXQgYGFgIGFuZCBgYmAgYXJlIHRoZSBzYW1lIHNoYXBlIChkb2VzIG5vdCBicm9hZGNhc3QpLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDQsIDMsIDE2XSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzEsIDIsIDksIDRdKTtcbiAqXG4gKiBhLm1heGltdW0oYikucHJpbnQoKTsgIC8vIG9yIHRmLm1heGltdW0oYSwgYilcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBCcm9hZGNhc3QgbWF4aW11bSBhIHdpdGggYi5cbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMiwgNCwgNiwgOF0pO1xuICogY29uc3QgYiA9IHRmLnNjYWxhcig1KTtcbiAqXG4gKiBhLm1heGltdW0oYikucHJpbnQoKTsgIC8vIG9yIHRmLm1heGltdW0oYSwgYilcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCB0ZW5zb3IuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIHRlbnNvci4gTXVzdCBoYXZlIHRoZSBzYW1lIHR5cGUgYXMgYGFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0FyaXRobWV0aWMnfVxuICovXG5mdW5jdGlvbiBtYXhpbXVtXyhhLCBiKSB7XG4gICAgbGV0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ21heGltdW0nKTtcbiAgICBsZXQgJGIgPSBjb252ZXJ0VG9UZW5zb3IoYiwgJ2InLCAnbWF4aW11bScpO1xuICAgIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcbiAgICBpZiAoJGEuZHR5cGUgPT09ICdib29sJykge1xuICAgICAgICAkYSA9IGNhc3QoJGEsICdpbnQzMicpO1xuICAgICAgICAkYiA9IGNhc3QoJGIsICdpbnQzMicpO1xuICAgIH1cbiAgICBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSgkYS5zaGFwZSwgJGIuc2hhcGUpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgYTogJGEsIGI6ICRiIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoTWF4aW11bSwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBtYXhpbXVtID0gb3AoeyBtYXhpbXVtXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1heGltdW0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IE1lYW4gfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgbWVhbiBvZiBlbGVtZW50cyBhY3Jvc3MgZGltZW5zaW9ucyBvZiBhIGB0Zi5UZW5zb3JgLlxuICpcbiAqIFJlZHVjZXMgYHhgIGFsb25nIHRoZSBkaW1lbnNpb25zIGdpdmVuIGluIGBheGlzYC4gVW5sZXNzIGBrZWVwRGltc2AgaXNcbiAqIHRydWUsIHRoZSByYW5rIG9mIHRoZSBgdGYuVGVuc29yYCBpcyByZWR1Y2VkIGJ5IDEgZm9yIGVhY2ggZW50cnkgaW4gYGF4aXNgLlxuICogSWYgYGtlZXBEaW1zYCBpcyB0cnVlLCB0aGUgcmVkdWNlZCBkaW1lbnNpb25zIGFyZSByZXRhaW5lZCB3aXRoIGxlbmd0aCAxLlxuICogSWYgYGF4aXNgIGhhcyBubyBlbnRyaWVzLCBhbGwgZGltZW5zaW9ucyBhcmUgcmVkdWNlZCwgYW5kIGEgYHRmLlRlbnNvcmAgd2l0aFxuICogYSBzaW5nbGUgZWxlbWVudCBpcyByZXR1cm5lZC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKlxuICogeC5tZWFuKCkucHJpbnQoKTsgIC8vIG9yIHRmLm1lYW4oYSlcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pO1xuICpcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5tZWFuKGF4aXMpLnByaW50KCk7ICAvLyBvciB0Zi5tZWFuKHgsIGF4aXMpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICogQHBhcmFtIGF4aXMgVGhlIGRpbWVuc2lvbihzKSB0byByZWR1Y2UuIEJ5IGRlZmF1bHQgaXQgcmVkdWNlc1xuICogICAgIGFsbCBkaW1lbnNpb25zLlxuICogQHBhcmFtIGtlZXBEaW1zIElmIHRydWUsIHJldGFpbnMgcmVkdWNlZCBkaW1lbnNpb25zIHdpdGggc2l6ZSAxLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1JlZHVjdGlvbid9XG4gKi9cbmZ1bmN0aW9uIG1lYW5fKHgsIGF4aXMgPSBudWxsLCBrZWVwRGltcyA9IGZhbHNlKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnbWVhbicpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICBjb25zdCBhdHRycyA9IHsgYXhpcywga2VlcERpbXMgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChNZWFuLCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBtZWFuID0gb3AoeyBtZWFuXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1lYW4uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgbWF0TXVsIH0gZnJvbSAnLi9tYXRfbXVsJztcbmltcG9ydCB7IG9uZXMgfSBmcm9tICcuL29uZXMnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vcmVzaGFwZSc7XG5pbXBvcnQgeyBUZW5zb3IgfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IHNpemVGcm9tU2hhcGUgfSBmcm9tICcuLi91dGlsX2Jhc2UnO1xuLyoqXG4gKiBCcm9hZGNhc3RzIHBhcmFtZXRlcnMgZm9yIGV2YWx1YXRpb24gb24gYW4gTi1EIGdyaWQuXG4gKlxuICogR2l2ZW4gTiBvbmUtZGltZW5zaW9uYWwgY29vcmRpbmF0ZSBhcnJheXMgYCphcmdzYCwgcmV0dXJucyBhIGxpc3QgYG91dHB1dHNgXG4gKiBvZiBOLUQgY29vcmRpbmF0ZSBhcnJheXMgZm9yIGV2YWx1YXRpbmcgZXhwcmVzc2lvbnMgb24gYW4gTi1EIGdyaWQuXG4gKlxuICogTm90ZXM6XG4gKiBgbWVzaGdyaWRgIHN1cHBvcnRzIGNhcnRlc2lhbiAoJ3h5JykgYW5kIG1hdHJpeCAoJ2lqJykgaW5kZXhpbmcgY29udmVudGlvbnMuXG4gKiBXaGVuIHRoZSBgaW5kZXhpbmdgIGFyZ3VtZW50IGlzIHNldCB0byAneHknICh0aGUgZGVmYXVsdCksIHRoZSBicm9hZGNhc3RpbmdcbiAqIGluc3RydWN0aW9ucyBmb3IgdGhlIGZpcnN0IHR3byBkaW1lbnNpb25zIGFyZSBzd2FwcGVkLlxuICogRXhhbXBsZXM6XG4gKiBDYWxsaW5nIGBjb25zdCBbWCwgWV0gPSBtZXNoZ3JpZCh4LCB5KWAgd2l0aCB0aGUgdGVuc29yc1xuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGNvbnN0IHggPSBbMSwgMiwgM107XG4gKiBjb25zdCB5ID0gWzQsIDUsIDZdO1xuICogY29uc3QgW1gsIFldID0gdGYubWVzaGdyaWQoeCwgeSk7XG4gKiAvLyBYID0gW1sxLCAyLCAzXSxcbiAqIC8vICAgICAgWzEsIDIsIDNdLFxuICogLy8gICAgICBbMSwgMiwgM11dXG4gKiAvLyBZID0gW1s0LCA0LCA0XSxcbiAqIC8vICAgICAgWzUsIDUsIDVdLFxuICogLy8gICAgICBbNiwgNiwgNl1dXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUZW5zb3Igd2l0aCByYW5rIGdlcSAxLlxuICogQHBhcmFtIHkgVGVuc29yIHdpdGggcmFuayBnZXEgMS5cbiAqIEBwYXJhbSBpbmRleGluZ1xuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1NsaWNpbmcgYW5kIEpvaW5pbmcnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVzaGdyaWQoeCwgeSwgeyBpbmRleGluZyA9ICd4eScgfSA9IHt9KSB7XG4gICAgaWYgKGluZGV4aW5nICE9PSAneHknICYmIGluZGV4aW5nICE9PSAnaWonKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7aW5kZXhpbmd9IGlzIG5vdCBhIHZhbGlkIHRoaXJkIGFyZ3VtZW50IHRvIG1lc2hncmlkYCk7XG4gICAgfVxuICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBsZXQgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnbWVzaGdyaWQnLCB4IGluc3RhbmNlb2YgVGVuc29yID8geC5kdHlwZSA6ICdmbG9hdDMyJyk7XG4gICAgaWYgKHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gWyR4XTtcbiAgICB9XG4gICAgbGV0ICR5ID0gY29udmVydFRvVGVuc29yKHksICd5JywgJ21lc2hncmlkJywgeSBpbnN0YW5jZW9mIFRlbnNvciA/IHkuZHR5cGUgOiAnZmxvYXQzMicpO1xuICAgIGNvbnN0IHcgPSBzaXplRnJvbVNoYXBlKCR4LnNoYXBlKTtcbiAgICBjb25zdCBoID0gc2l6ZUZyb21TaGFwZSgkeS5zaGFwZSk7XG4gICAgaWYgKGluZGV4aW5nID09PSAneHknKSB7XG4gICAgICAgICR4ID0gcmVzaGFwZSgkeCwgWzEsIC0xXSk7XG4gICAgICAgICR5ID0gcmVzaGFwZSgkeSwgWy0xLCAxXSk7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBtYXRNdWwob25lcyhbaCwgMV0sICR4LmR0eXBlKSwgJHgpLFxuICAgICAgICAgICAgbWF0TXVsKCR5LCBvbmVzKFsxLCB3XSwgJHkuZHR5cGUpKSxcbiAgICAgICAgXTtcbiAgICB9XG4gICAgJHggPSByZXNoYXBlKCR4LCBbLTEsIDFdKTtcbiAgICAkeSA9IHJlc2hhcGUoJHksIFsxLCAtMV0pO1xuICAgIHJldHVybiBbXG4gICAgICAgIG1hdE11bCgkeCwgb25lcyhbMSwgaF0sICR4LmR0eXBlKSksXG4gICAgICAgIG1hdE11bChvbmVzKFt3LCAxXSwgJHkuZHR5cGUpLCAkeSksXG4gICAgXTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1lc2hncmlkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBNaW4gfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgbWluaW11bSB2YWx1ZSBmcm9tIHRoZSBpbnB1dC5cbiAqXG4gKiBSZWR1Y2VzIHRoZSBpbnB1dCBhbG9uZyB0aGUgZGltZW5zaW9ucyBnaXZlbiBpbiBgYXhlc2AuIFVubGVzcyBga2VlcERpbXNgXG4gKiBpcyB0cnVlLCB0aGUgcmFuayBvZiB0aGUgYXJyYXkgaXMgcmVkdWNlZCBieSAxIGZvciBlYWNoIGVudHJ5IGluIGBheGVzYC5cbiAqIElmIGBrZWVwRGltc2AgaXMgdHJ1ZSwgdGhlIHJlZHVjZWQgZGltZW5zaW9ucyBhcmUgcmV0YWluZWQgd2l0aCBsZW5ndGggMS5cbiAqIElmIGBheGVzYCBoYXMgbm8gZW50cmllcywgYWxsIGRpbWVuc2lvbnMgYXJlIHJlZHVjZWQsIGFuZCBhbiBhcnJheSB3aXRoIGFcbiAqIHNpbmdsZSBlbGVtZW50IGlzIHJldHVybmVkLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqXG4gKiB4Lm1pbigpLnByaW50KCk7ICAvLyBvciB0Zi5taW4oeClcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pO1xuICpcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5taW4oYXhpcykucHJpbnQoKTsgIC8vIG9yIHRmLm1pbih4LCBheGlzKVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IFRlbnNvci5cbiAqIEBwYXJhbSBheGlzIFRoZSBkaW1lbnNpb24ocykgdG8gcmVkdWNlLiBCeSBkZWZhdWx0IGl0IHJlZHVjZXNcbiAqICAgICBhbGwgZGltZW5zaW9ucy5cbiAqIEBwYXJhbSBrZWVwRGltcyBJZiB0cnVlLCByZXRhaW5zIHJlZHVjZWQgZGltZW5zaW9ucyB3aXRoIHNpemUgMS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdSZWR1Y3Rpb24nfVxuICovXG5mdW5jdGlvbiBtaW5fKHgsIGF4aXMgPSBudWxsLCBrZWVwRGltcyA9IGZhbHNlKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnbWluJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBheGlzLCBrZWVwRGltcyB9O1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChNaW4sIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IG1pbiA9IG9wKHsgbWluXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1pbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTWluaW11bSB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBtYWtlVHlwZXNNYXRjaCB9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSB9IGZyb20gJy4vYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0IHsgY2FzdCB9IGZyb20gJy4vY2FzdCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV0dXJucyB0aGUgbWluIG9mIGEgYW5kIGIgKGBhIDwgYiA/IGEgOiBiYCkgZWxlbWVudC13aXNlLlxuICogU3VwcG9ydHMgYnJvYWRjYXN0aW5nLlxuICpcbiAqIFdlIGFsc28gZXhwb3NlIGBtaW5pbXVtU3RyaWN0YCB3aGljaCBoYXMgdGhlIHNhbWUgc2lnbmF0dXJlIGFzIHRoaXMgb3AgYW5kXG4gKiBhc3NlcnRzIHRoYXQgYGFgIGFuZCBgYmAgYXJlIHRoZSBzYW1lIHNoYXBlIChkb2VzIG5vdCBicm9hZGNhc3QpLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDQsIDMsIDE2XSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzEsIDIsIDksIDRdKTtcbiAqXG4gKiBhLm1pbmltdW0oYikucHJpbnQoKTsgIC8vIG9yIHRmLm1pbmltdW0oYSwgYilcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBCcm9hZGNhc3QgbWluaW11bSBhIHdpdGggYi5cbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMiwgNCwgNiwgOF0pO1xuICogY29uc3QgYiA9IHRmLnNjYWxhcig1KTtcbiAqXG4gKiBhLm1pbmltdW0oYikucHJpbnQoKTsgIC8vIG9yIHRmLm1pbmltdW0oYSwgYilcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCB0ZW5zb3IuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIHRlbnNvci4gTXVzdCBoYXZlIHRoZSBzYW1lIHR5cGUgYXMgYGFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0FyaXRobWV0aWMnfVxuICovXG5mdW5jdGlvbiBtaW5pbXVtXyhhLCBiKSB7XG4gICAgbGV0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ21pbmltdW0nKTtcbiAgICBsZXQgJGIgPSBjb252ZXJ0VG9UZW5zb3IoYiwgJ2InLCAnbWluaW11bScpO1xuICAgIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcbiAgICBpZiAoJGEuZHR5cGUgPT09ICdib29sJykge1xuICAgICAgICAkYSA9IGNhc3QoJGEsICdpbnQzMicpO1xuICAgICAgICAkYiA9IGNhc3QoJGIsICdpbnQzMicpO1xuICAgIH1cbiAgICBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSgkYS5zaGFwZSwgJGIuc2hhcGUpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgYTogJGEsIGI6ICRiIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoTWluaW11bSwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBtaW5pbXVtID0gb3AoeyBtaW5pbXVtXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1pbmltdW0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IE1pcnJvclBhZCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBQYWRzIGEgYHRmLlRlbnNvcmAgdXNpbmcgbWlycm9yIHBhZGRpbmcuXG4gKlxuICogVGhpcyBvcGVyYXRpb24gaW1wbGVtZW50cyB0aGUgYFJFRkxFQ1RgIGFuZCBgU1lNTUVUUklDYCBtb2RlcyBvZiBwYWQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi5yYW5nZSgwLCA5KS5yZXNoYXBlKFsxLCAxLCAzLCAzXSk7XG4gKiB4Lm1pcnJvclBhZChbWzAsIDBdLCBbMCwgMF0sIFsyLCAyXSwgWzIsIDJdXSwgJ3JlZmxlY3QnKS5wcmludCgpO1xuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgdGVuc29yIHRvIHBhZC5cbiAqIEBwYXJhbSBwYWRkaW5ncyBBbiBhcnJheSBvZiBsZW5ndGggYFJgICh0aGUgcmFuayBvZiB0aGUgdGVuc29yKSwgd2hlcmVcbiAqIGVhY2ggZWxlbWVudCBpcyBhIGxlbmd0aC0yIHR1cGxlIG9mIGludHMgYFtwYWRCZWZvcmUsIHBhZEFmdGVyXWAsXG4gKiBzcGVjaWZ5aW5nIGhvdyBtdWNoIHRvIHBhZCBhbG9uZyBlYWNoIGRpbWVuc2lvbiBvZiB0aGUgdGVuc29yLlxuICogSW4gXCJyZWZsZWN0XCIgbW9kZSwgdGhlIHBhZGRlZCByZWdpb25zIGRvIG5vdCBpbmNsdWRlIHRoZSBib3JkZXJzLFxuICogd2hpbGUgaW4gXCJzeW1tZXRyaWNcIiBtb2RlIHRoZSBwYWRkZWQgcmVnaW9ucyBkbyBpbmNsdWRlIHRoZSBib3JkZXJzLlxuICogRm9yIGV4YW1wbGUsIGlmIHRoZSBpbnB1dCBpcyBgWzEsIDIsIDNdYCBhbmQgcGFkZGluZ3MgaXMgYFswLCAyXWAsXG4gKiB0aGVuIHRoZSBvdXRwdXQgaXMgYFsxLCAyLCAzLCAyLCAxXWAgaW4gXCJyZWZsZWN0XCIgbW9kZSwgYW5kXG4gKiBgWzEsIDIsIDMsIDMsIDJdYCBpbiBcInN5bW1ldHJpY1wiIG1vZGUuXG4gKiBJZiBgbW9kZWAgaXMgXCJyZWZsZWN0XCIgdGhlbiBib3RoIGBwYWRkaW5nc1tELCAwXWAgYW5kIGBwYWRkaW5nc1tELCAxXWBcbiAqIG11c3QgYmUgbm8gZ3JlYXRlciB0aGFuIGB4LnNoYXBlW0RdIC0gMWAuIElmIG1vZGUgaXMgXCJzeW1tZXRyaWNcIlxuICogdGhlbiBib3RoIGBwYWRkaW5nc1tELCAwXWAgYW5kIGBwYWRkaW5nc1tELCAxXWAgbXVzdCBiZSBubyBncmVhdGVyIHRoYW5cbiAqIGB4LnNoYXBlW0RdYFxuICogQHBhcmFtIG1vZGUgU3RyaW5nIHRvIHNwZWNpZnkgcGFkZGluZyBtb2RlLiBDYW4gYmUgYCdyZWZsZWN0JyB8ICdzeW1tZXRyaWMnYFxuICovXG4vKiogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnVHJhbnNmb3JtYXRpb25zJ30gKi9cbmZ1bmN0aW9uIG1pcnJvclBhZF8oeCwgcGFkZGluZ3MsIG1vZGUpIHtcbiAgICB1dGlsLmFzc2VydChtb2RlID09PSAncmVmbGVjdCcgfHwgbW9kZSA9PT0gJ3N5bW1ldHJpYycsICgpID0+IGBJbnZhbGlkIG1vZGUuIE1vZGUgbXVzdCBiZSBlaXRoZXIgcmVmbGVjdCBvciBzeW1tZXRyaWMuIGAgK1xuICAgICAgICBgR290ICR7bW9kZX0uYCk7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnbWlycm9yUGFkJyk7XG4gICAgaWYgKCR4LnJhbmsgPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXJyb3JQYWQoc2NhbGFyKSBpcyBub3QgZGVmaW5lZC4gJyArXG4gICAgICAgICAgICAnUGFzcyBub24tc2NhbGFyIHRvIG1pcnJvclBhZCcpO1xuICAgIH1cbiAgICB1dGlsLmFzc2VydChwYWRkaW5ncy5sZW5ndGggPT09ICR4LnJhbmssICgpID0+IGBQYWRkaW5nIGRvZXNuJ3QgbWF0Y2ggaW5wdXQuIE11c3QgYmUgJHskeC5yYW5rfS4gYCArXG4gICAgICAgIGBHb3QgJHtwYWRkaW5ncy5sZW5ndGh9LmApO1xuICAgIGNvbnN0IHNoYXBlT2Zmc2V0ID0gbW9kZSA9PT0gJ3JlZmxlY3QnID8gMSA6IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAkeC5yYW5rOyBpKyspIHtcbiAgICAgICAgdXRpbC5hc3NlcnQocGFkZGluZ3NbaV0ubGVuZ3RoID09PSAyLCAoKSA9PiBgSW52YWxpZCBudW1iZXIgb2YgcGFkZGluZ3MuIE11c3QgYmUgbGVuZ3RoIG9mIDIgZWFjaC5gKTtcbiAgICAgICAgdXRpbC5hc3NlcnQocGFkZGluZ3NbaV1bMF0gPj0gMCAmJiBwYWRkaW5nc1tpXVswXSA8PSAkeC5zaGFwZVtpXSAtIHNoYXBlT2Zmc2V0ICYmXG4gICAgICAgICAgICBwYWRkaW5nc1tpXVsxXSA+PSAwICYmIHBhZGRpbmdzW2ldWzFdIDw9ICR4LnNoYXBlW2ldIC0gc2hhcGVPZmZzZXQsICgpID0+IGBQYWRkaW5nIGluIGRpbWVuc2lvbiAke2l9IGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgYCArXG4gICAgICAgICAgICBgdG8gJHskeC5zaGFwZVtpXSAtIHNoYXBlT2Zmc2V0fSBvciBsZXNzIHRoYW4gMCBmb3IgaW5wdXQgb2YgYCArXG4gICAgICAgICAgICBgc2hhcGUgJHskeC5zaGFwZX1gKTtcbiAgICB9XG4gICAgY29uc3QgYXR0cnMgPSB7IHBhZGRpbmdzLCBtb2RlIH07XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKE1pcnJvclBhZCwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgbWlycm9yUGFkID0gb3AoeyBtaXJyb3JQYWRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWlycm9yX3BhZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTW9kIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IG1ha2VUeXBlc01hdGNoIH0gZnJvbSAnLi4vdGVuc29yX3V0aWwnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBtb2Qgb2YgYSBhbmQgYiBlbGVtZW50LXdpc2UuXG4gKiBgZmxvb3IoeCAvIHkpICogeSArIG1vZCh4LCB5KSA9IHhgXG4gKiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuXG4gKlxuICogV2UgYWxzbyBleHBvc2UgYHRmLm1vZFN0cmljdGAgd2hpY2ggaGFzIHRoZSBzYW1lIHNpZ25hdHVyZSBhcyB0aGlzIG9wIGFuZFxuICogYXNzZXJ0cyB0aGF0IGBhYCBhbmQgYGJgIGFyZSB0aGUgc2FtZSBzaGFwZSAoZG9lcyBub3QgYnJvYWRjYXN0KS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCA0LCAzLCAxNl0pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFsxLCAyLCA5LCA0XSk7XG4gKlxuICogYS5tb2QoYikucHJpbnQoKTsgIC8vIG9yIHRmLm1vZChhLCBiKVxuICogYGBgXG4gKlxuICogYGBganNcbiAqIC8vIEJyb2FkY2FzdCBhIG1vZCBiLlxuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsyLCA0LCA2LCA4XSk7XG4gKiBjb25zdCBiID0gdGYuc2NhbGFyKDUpO1xuICpcbiAqIGEubW9kKGIpLnByaW50KCk7ICAvLyBvciB0Zi5tb2QoYSwgYilcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCB0ZW5zb3IuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIHRlbnNvci4gTXVzdCBoYXZlIHRoZSBzYW1lIHR5cGUgYXMgYGFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0FyaXRobWV0aWMnfVxuICovXG5mdW5jdGlvbiBtb2RfKGEsIGIpIHtcbiAgICBsZXQgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnbW9kJyk7XG4gICAgbGV0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ21vZCcpO1xuICAgIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGE6ICRhLCBiOiAkYiB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKE1vZCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBtb2QgPSBvcCh7IG1vZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tb2QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IHBhcnNlQXhpc1BhcmFtIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBleHBhbmRTaGFwZVRvS2VlcERpbSB9IGZyb20gJy4vYXhpc191dGlsJztcbmltcG9ydCB7IGNhc3QgfSBmcm9tICcuL2Nhc3QnO1xuaW1wb3J0IHsgbWVhbiB9IGZyb20gJy4vbWVhbic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL3Jlc2hhcGUnO1xuaW1wb3J0IHsgc3F1YXJlIH0gZnJvbSAnLi9zcXVhcmUnO1xuaW1wb3J0IHsgc3ViIH0gZnJvbSAnLi9zdWInO1xuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBtZWFuIGFuZCB2YXJpYW5jZSBvZiBgeGAuIFRoZSBtZWFuIGFuZCB2YXJpYW5jZSBhcmVcbiAqIGNhbGN1bGF0ZWQgYnkgYWdncmVnYXRpbmcgdGhlIGNvbnRlbnRzIG9mIGB4YCBhY3Jvc3MgYGF4ZXNgLiBJZiBgeGAgaXNcbiAqIDEtRCBhbmQgYGF4ZXMgPSBbMF1gIHRoaXMgaXMganVzdCB0aGUgbWVhbiBhbmQgdmFyaWFuY2Ugb2YgYSB2ZWN0b3IuXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBheGlzIFRoZSBkaW1lbnNpb24ocykgYWxvbmcgd2l0aCB0byBjb21wdXRlIG1lYW4gYW5kXG4gKiAgICAgdmFyaWFuY2UuIEJ5IGRlZmF1bHQgaXQgcmVkdWNlcyBhbGwgZGltZW5zaW9ucy5cbiAqIEBwYXJhbSBrZWVwRGltcyBJZiB0cnVlLCB0aGUgbW9tZW50cyBoYXZlIHRoZSBzYW1lIGRpbWVuc2lvbmFsaXR5IGFzIHRoZVxuICogICAgIGlucHV0LlxuICogQHJldHVybiBBbiBvYmplY3Qgd2l0aCB0d28ga2V5czogYG1lYW5gIGFuZCBgdmFyaWFuY2VgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ05vcm1hbGl6YXRpb24nfVxuICovXG5mdW5jdGlvbiBtb21lbnRzXyh4LCBheGlzID0gbnVsbCwga2VlcERpbXMgPSBmYWxzZSkge1xuICAgIHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnbW9tZW50cycpO1xuICAgIGNvbnN0IGF4ZXMgPSBwYXJzZUF4aXNQYXJhbShheGlzLCB4LnNoYXBlKTtcbiAgICBjb25zdCB4TWVhbiA9IG1lYW4oeCwgYXhlcywga2VlcERpbXMpO1xuICAgIGxldCBrZWVwRGltc1NoYXBlID0geE1lYW4uc2hhcGU7XG4gICAgaWYgKCFrZWVwRGltcykge1xuICAgICAgICBrZWVwRGltc1NoYXBlID0gZXhwYW5kU2hhcGVUb0tlZXBEaW0oeE1lYW4uc2hhcGUsIGF4ZXMpO1xuICAgIH1cbiAgICBjb25zdCBkZXZTcXVhcmVkID0gc3F1YXJlKHN1YihjYXN0KHgsICdmbG9hdDMyJyksIHJlc2hhcGUoeE1lYW4sIGtlZXBEaW1zU2hhcGUpKSk7XG4gICAgY29uc3QgdmFyaWFuY2UgPSBtZWFuKGRldlNxdWFyZWQsIGF4ZXMsIGtlZXBEaW1zKTtcbiAgICByZXR1cm4geyBtZWFuOiB4TWVhbiwgdmFyaWFuY2UgfTtcbn1cbmV4cG9ydCBjb25zdCBtb21lbnRzID0gb3AoeyBtb21lbnRzXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1vbWVudHMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYXNzZXJ0VHlwZXNNYXRjaCB9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgYWRkIH0gZnJvbSAnLi9hZGQnO1xuaW1wb3J0IHsgZGl2IH0gZnJvbSAnLi9kaXYnO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi9tdWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyBwb3cgfSBmcm9tICcuL3Bvdyc7XG5pbXBvcnQgeyBzY2FsYXIgfSBmcm9tICcuL3NjYWxhcic7XG5pbXBvcnQgeyBzdWIgfSBmcm9tICcuL3N1Yic7XG4vKipcbiAqIENvbXB1dGUgdGhlIG1vdmluZyBhdmVyYWdlIG9mIGEgdmFyaWFibGUuXG4gKlxuICogV2l0aG91dCB6ZXJvRGViaWFzLCB0aGUgbW92aW5nIGF2ZXJhZ2Ugb3BlcmF0aW9uIGlzIGRlZmluZWQgYnk6XG4gKiAgIGB2ICs9IGRlbHRhYFxuICogd2hlcmVcbiAqICAgYGRlbHRhID0gKDEgLSBkZWNheSkgKiAoeCAtIHYpYFxuICpcbiAqIFdpdGggemVyb0RlYmlhcyAoZGVmYXVsdCksIHRoZSBgZGVsdGFgIHRlcm0gaXMgc2NhbGVkIHRvIGRlYmlhcyB0aGVcbiAqIGVmZmVjdCBvZiB0aGUgKGFzc3VtZWQpIHplcm8taW5pdGlhbGl6YXRpb24gb2YgYHZgLlxuICogICBgZGVsdGEgLz0gKDEgLSBkZWNheSBeIHN0ZXApYFxuICpcbiAqIEZvciBtb3JlIGRldGFpbHMgb24gdGhlIHplcm8tZGViaWFzaW5nIGFsZ29yaXRobSwgc2VlOlxuICogICBodHRwczovL2FyeGl2Lm9yZy9hYnMvMTQxMi42OTgwXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgY29tcGxldGVseSBzdGF0ZWxlc3MgYW5kIGRvZXMgbm90IGtlZXAgdHJhY2sgb2ZcbiAqIHN0ZXAgY291bnQuIFRoZSBzdGVwIGNvdW50IG5lZWRzIHRvIGJlIG1haW50YWluZWQgYnkgdGhlIGNhbGxlciBhbmQgcGFzc2VkXG4gKiBpbiBhcyBgc3RlcGAuXG4gKlxuICogQHBhcmFtIHYgVGhlIGN1cnJlbnQgbW92aW5nIGF2ZXJhZ2UgdmFsdWUuXG4gKiBAcGFyYW0geCBOZXcgaW5wdXQgdmFsdWUsIG11c3QgaGF2ZSB0aGUgc2FtZSBzaGFwZSBhbmQgZHR5cGUgYXMgYHZgLlxuICogQHBhcmFtIGRlY2F5IFRoZSBkZWNheSBmYWN0b3IuIFR5cGljYWwgdmFsdWVzIGFyZSAwLjk1IGFuZCAwLjk5LlxuICogQHBhcmFtIHN0ZXAgU3RlcCBjb3VudC5cbiAqIEBwYXJhbSB6ZXJvRGViaWFzOiBXaGV0aGVyIHplcm9EZWJpYXMgaXMgdG8gYmUgcGVyZm9ybWVkIChkZWZhdWx0OiBgdHJ1ZWApLlxuICogQHJldHVybnMgVGhlIG5ldyBtb3ZpbmcgYXZlcmFnZSB2YWx1ZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdNb3ZpbmcgQXZlcmFnZSd9XG4gKi9cbmZ1bmN0aW9uIG1vdmluZ0F2ZXJhZ2VfKHYsIHgsIGRlY2F5LCBzdGVwLCB6ZXJvRGViaWFzID0gdHJ1ZSkge1xuICAgIGNvbnN0ICR2ID0gY29udmVydFRvVGVuc29yKHYsICd2JywgJ21vdmluZ0F2ZXJhZ2UnKTtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdtb3ZpbmdBdmVyYWdlJyk7XG4gICAgY29uc3QgJGRlY2F5ID0gY29udmVydFRvVGVuc29yKGRlY2F5LCAnZGVjYXknLCAnbW92aW5nQXZlcmFnZScpO1xuICAgIGFzc2VydFR5cGVzTWF0Y2goJHYsICR4KTtcbiAgICB1dGlsLmFzc2VydCh1dGlsLmFycmF5c0VxdWFsKCR2LnNoYXBlLCAkeC5zaGFwZSksICgpID0+ICdTaGFwZSBtaXNtYXRjaCBpbiB2IGFuZCB4Jyk7XG4gICAgY29uc3Qgb25lID0gc2NhbGFyKDEpO1xuICAgIGNvbnN0IG9uZU1pbnVzRGVjYXkgPSBzdWIob25lLCAkZGVjYXkpO1xuICAgIGxldCB1cGRhdGUgPSBtdWwoc3ViKCR4LCAkdiksIG9uZU1pbnVzRGVjYXkpO1xuICAgIGlmICh6ZXJvRGViaWFzKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHN0ZXAgIT0gbnVsbCwgKCkgPT4gJ1doZW4gdXNpbmcgemVyb0RlYmlhczogdHJ1ZSwgc3RlcCBpcyByZXF1aXJlZC4nKTtcbiAgICAgICAgY29uc3QgJHN0ZXAgPSBjb252ZXJ0VG9UZW5zb3Ioc3RlcCwgJ3N0ZXAnLCAnbW92aW5nQXZlcmFnZScpO1xuICAgICAgICB1cGRhdGUgPSBkaXYodXBkYXRlLCBzdWIob25lLCBwb3coJGRlY2F5LCAkc3RlcCkpKTtcbiAgICB9XG4gICAgcmV0dXJuIGFkZCgkdiwgdXBkYXRlKTtcbn1cbmV4cG9ydCBjb25zdCBtb3ZpbmdBdmVyYWdlID0gb3AoeyBtb3ZpbmdBdmVyYWdlXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1vdmluZ19hdmVyYWdlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBNdWx0aXBseSB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBtYWtlVHlwZXNNYXRjaCB9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogTXVsdGlwbGllcyB0d28gYHRmLlRlbnNvcmBzIGVsZW1lbnQtd2lzZSwgQSAqIEIuIFN1cHBvcnRzIGJyb2FkY2FzdGluZy5cbiAqXG4gKiBXZSBhbHNvIGV4cG9zZSBgdGYubXVsU3RyaWN0YCB3aGljaCBoYXMgdGhlIHNhbWUgc2lnbmF0dXJlIGFzIHRoaXMgb3AgYW5kXG4gKiBhc3NlcnRzIHRoYXQgYGFgIGFuZCBgYmAgYXJlIHRoZSBzYW1lIHNoYXBlIChkb2VzIG5vdCBicm9hZGNhc3QpLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDIsIDMsIDRdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbMiwgMywgNCwgNV0pO1xuICpcbiAqIGEubXVsKGIpLnByaW50KCk7ICAvLyBvciB0Zi5tdWwoYSwgYilcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBCcm9hZGNhc3QgbXVsIGEgd2l0aCBiLlxuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzLCA0XSk7XG4gKiBjb25zdCBiID0gdGYuc2NhbGFyKDUpO1xuICpcbiAqIGEubXVsKGIpLnByaW50KCk7ICAvLyBvciB0Zi5tdWwoYSwgYilcbiAqIGBgYFxuICogQHBhcmFtIGEgVGhlIGZpcnN0IHRlbnNvciB0byBtdWx0aXBseS5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgdGVuc29yIHRvIG11bHRpcGx5LiBNdXN0IGhhdmUgdGhlIHNhbWUgZHR5cGUgYXMgYGFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0FyaXRobWV0aWMnfVxuICovXG5mdW5jdGlvbiBtdWxfKGEsIGIpIHtcbiAgICBsZXQgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnbXVsJyk7XG4gICAgbGV0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ211bCcpO1xuICAgIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGE6ICRhLCBiOiAkYiB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKE11bHRpcGx5LCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IG11bCA9IG9wKHsgbXVsXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW11bC5qcy5tYXAiLCJpbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IsIGNvbnZlcnRUb1RlbnNvckFycmF5IH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgbmV4dCBzdGF0ZXMgYW5kIG91dHB1dHMgb2YgYSBzdGFjayBvZiBMU1RNQ2VsbHMuXG4gKlxuICogRWFjaCBjZWxsIG91dHB1dCBpcyB1c2VkIGFzIGlucHV0IHRvIHRoZSBuZXh0IGNlbGwuXG4gKlxuICogUmV0dXJucyBgW2NlbGxTdGF0ZSwgY2VsbE91dHB1dF1gLlxuICpcbiAqIERlcml2ZWQgZnJvbSB0Zi5jb250cmliLnJuLk11bHRpUk5OQ2VsbC5cbiAqXG4gKiBAcGFyYW0gbHN0bUNlbGxzIEFycmF5IG9mIExTVE1DZWxsIGZ1bmN0aW9ucy5cbiAqIEBwYXJhbSBkYXRhIFRoZSBpbnB1dCB0byB0aGUgY2VsbC5cbiAqIEBwYXJhbSBjIEFycmF5IG9mIHByZXZpb3VzIGNlbGwgc3RhdGVzLlxuICogQHBhcmFtIGggQXJyYXkgb2YgcHJldmlvdXMgY2VsbCBvdXRwdXRzLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1JOTid9XG4gKi9cbmZ1bmN0aW9uIG11bHRpUk5OQ2VsbF8obHN0bUNlbGxzLCBkYXRhLCBjLCBoKSB7XG4gICAgY29uc3QgJGRhdGEgPSBjb252ZXJ0VG9UZW5zb3IoZGF0YSwgJ2RhdGEnLCAnbXVsdGlSTk5DZWxsJyk7XG4gICAgY29uc3QgJGMgPSBjb252ZXJ0VG9UZW5zb3JBcnJheShjLCAnYycsICdtdWx0aVJOTkNlbGwnKTtcbiAgICBjb25zdCAkaCA9IGNvbnZlcnRUb1RlbnNvckFycmF5KGgsICdoJywgJ211bHRpUk5OQ2VsbCcpO1xuICAgIGxldCBpbnB1dCA9ICRkYXRhO1xuICAgIGNvbnN0IG5ld1N0YXRlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbHN0bUNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IGxzdG1DZWxsc1tpXShpbnB1dCwgJGNbaV0sICRoW2ldKTtcbiAgICAgICAgbmV3U3RhdGVzLnB1c2gob3V0cHV0WzBdKTtcbiAgICAgICAgbmV3U3RhdGVzLnB1c2gob3V0cHV0WzFdKTtcbiAgICAgICAgaW5wdXQgPSBvdXRwdXRbMV07XG4gICAgfVxuICAgIGNvbnN0IG5ld0MgPSBbXTtcbiAgICBjb25zdCBuZXdIID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdTdGF0ZXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgbmV3Qy5wdXNoKG5ld1N0YXRlc1tpXSk7XG4gICAgICAgIG5ld0gucHVzaChuZXdTdGF0ZXNbaSArIDFdKTtcbiAgICB9XG4gICAgcmV0dXJuIFtuZXdDLCBuZXdIXTtcbn1cbmV4cG9ydCBjb25zdCBtdWx0aVJOTkNlbGwgPSBvcCh7IG11bHRpUk5OQ2VsbF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tdWx0aV9ybm5fY2VsbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTXVsdGlub21pYWwgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vcmVzaGFwZSc7XG4vKipcbiAqIENyZWF0ZXMgYSBgdGYuVGVuc29yYCB3aXRoIHZhbHVlcyBkcmF3biBmcm9tIGEgbXVsdGlub21pYWwgZGlzdHJpYnV0aW9uLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBwcm9icyA9IHRmLnRlbnNvcihbLjc1LCAuMjVdKTtcbiAqIHRmLm11bHRpbm9taWFsKHByb2JzLCAzKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGxvZ2l0cyAxRCBhcnJheSB3aXRoIHVubm9ybWFsaXplZCBsb2ctcHJvYmFiaWxpdGllcywgb3JcbiAqICAgICAyRCBhcnJheSBvZiBzaGFwZSBgW2JhdGNoU2l6ZSwgbnVtT3V0Y29tZXNdYC4gU2VlIHRoZSBgbm9ybWFsaXplZGBcbiAqICAgICBwYXJhbWV0ZXIuXG4gKiBAcGFyYW0gbnVtU2FtcGxlcyBOdW1iZXIgb2Ygc2FtcGxlcyB0byBkcmF3IGZvciBlYWNoIHJvdyBzbGljZS5cbiAqIEBwYXJhbSBzZWVkIFRoZSBzZWVkIG51bWJlci5cbiAqIEBwYXJhbSBub3JtYWxpemVkIFdoZXRoZXIgdGhlIHByb3ZpZGVkIGBsb2dpdHNgIGFyZSBub3JtYWxpemVkIHRydWVcbiAqICAgICBwcm9iYWJpbGl0aWVzIChzdW0gdG8gMSkuIERlZmF1bHRzIHRvIGZhbHNlLlxuICogQHJldHVybiAxRCBhcnJheSBvZiBzaGFwZSBgW251bVNhbXBsZXNdYCwgb3IgMkQgYXJyYXkgb2Ygc2hhcGVcbiAqICAgICBgW2JhdGNoU2l6ZSwgbnVtU2FtcGxlc11gLCBkZXBlbmRpbmcgb24gdGhlIHJhbmsgb2YgdGhlIGlucHV0LlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1JhbmRvbSd9XG4gKi9cbmZ1bmN0aW9uIG11bHRpbm9taWFsXyhsb2dpdHMsIG51bVNhbXBsZXMsIHNlZWQsIG5vcm1hbGl6ZWQgPSBmYWxzZSkge1xuICAgIGNvbnN0ICRsb2dpdHMgPSBjb252ZXJ0VG9UZW5zb3IobG9naXRzLCAnbG9naXRzJywgJ211bHRpbm9taWFsJyk7XG4gICAgY29uc3QgbnVtT3V0Y29tZXMgPSAkbG9naXRzLnNpemU7XG4gICAgY29uc3Qgb3JpZ1JhbmsgPSAkbG9naXRzLnJhbms7XG4gICAgaWYgKG51bU91dGNvbWVzIDwgMikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIG11bHRpbm9taWFsOiB5b3UgbmVlZCBhdCBsZWFzdCAyIG91dGNvbWVzLCBidXQgZ290IGAgK1xuICAgICAgICAgICAgYCR7bnVtT3V0Y29tZXN9LmApO1xuICAgIH1cbiAgICBpZiAob3JpZ1JhbmsgPiAyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUmFuayBvZiBwcm9iYWJpbGl0aWVzIG11c3QgYmUgMSBvciAyLCBidXQgaXMgJHtvcmlnUmFua31gKTtcbiAgICB9XG4gICAgLy8gVE9ETyhsaW5hMTI4KTogSW52ZXN0aWdhdGUgY29ycmVjdCBzZWVkIGJlaGF2aW9yLiBUaGUgY29kZSBzZWVtcyBub3QgYWxsb3dcbiAgICAvLyBzZXR0aW5nIHNlZSB0byAwLlxuICAgIHNlZWQgPSBzZWVkIHx8IE1hdGgucmFuZG9tKCk7XG4gICAgLy8gVGhlIGtlcm5lbCBvbmx5IGFjY2VwdHMgKGFuZCByZXR1cm5zKSByYW5rIDIgdGVuc29ycy5cbiAgICBjb25zdCBsb2dpdHMyRCA9IG9yaWdSYW5rID09PSAxID8gcmVzaGFwZSgkbG9naXRzLCBbMSwgLTFdKSA6ICRsb2dpdHM7XG4gICAgY29uc3QgaW5wdXRzID0geyBsb2dpdHM6IGxvZ2l0czJEIH07XG4gICAgY29uc3QgYXR0cnMgPSB7IG51bVNhbXBsZXMsIHNlZWQsIG5vcm1hbGl6ZWQgfTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgY29uc3QgcmVzID0gRU5HSU5FLnJ1bktlcm5lbChNdWx0aW5vbWlhbCwgaW5wdXRzLCBhdHRycyk7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgcmV0dXJuIG9yaWdSYW5rID09PSAxID8gcmVzaGFwZShyZXMsIFtyZXMuc2l6ZV0pIDogcmVzO1xufVxuZXhwb3J0IGNvbnN0IG11bHRpbm9taWFsID0gb3AoeyBtdWx0aW5vbWlhbF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tdWx0aW5vbWlhbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTmVnIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgYC0xICogeGAgZWxlbWVudC13aXNlLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIC0yLCAwXSwgWzIsIDJdKTtcbiAqXG4gKiB4Lm5lZygpLnByaW50KCk7ICAvLyBvciB0Zi5uZWcoeClcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIG5lZ18oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ25lZycpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChOZWcsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgbmVnID0gb3AoeyBuZWdfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bmVnLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5mdW5jdGlvbiBub25NYXhTdXBwU2FuaXR5Q2hlY2soYm94ZXMsIHNjb3JlcywgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCwgc29mdE5tc1NpZ21hKSB7XG4gICAgaWYgKGlvdVRocmVzaG9sZCA9PSBudWxsKSB7XG4gICAgICAgIGlvdVRocmVzaG9sZCA9IDAuNTtcbiAgICB9XG4gICAgaWYgKHNjb3JlVGhyZXNob2xkID09IG51bGwpIHtcbiAgICAgICAgc2NvcmVUaHJlc2hvbGQgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gICAgfVxuICAgIGlmIChzb2Z0Tm1zU2lnbWEgPT0gbnVsbCkge1xuICAgICAgICBzb2Z0Tm1zU2lnbWEgPSAwLjA7XG4gICAgfVxuICAgIGNvbnN0IG51bUJveGVzID0gYm94ZXMuc2hhcGVbMF07XG4gICAgbWF4T3V0cHV0U2l6ZSA9IE1hdGgubWluKG1heE91dHB1dFNpemUsIG51bUJveGVzKTtcbiAgICB1dGlsLmFzc2VydCgwIDw9IGlvdVRocmVzaG9sZCAmJiBpb3VUaHJlc2hvbGQgPD0gMSwgKCkgPT4gYGlvdVRocmVzaG9sZCBtdXN0IGJlIGluIFswLCAxXSwgYnV0IHdhcyAnJHtpb3VUaHJlc2hvbGR9J2ApO1xuICAgIHV0aWwuYXNzZXJ0KGJveGVzLnJhbmsgPT09IDIsICgpID0+IGBib3hlcyBtdXN0IGJlIGEgMkQgdGVuc29yLCBidXQgd2FzIG9mIHJhbmsgJyR7Ym94ZXMucmFua30nYCk7XG4gICAgdXRpbC5hc3NlcnQoYm94ZXMuc2hhcGVbMV0gPT09IDQsICgpID0+IGBib3hlcyBtdXN0IGhhdmUgNCBjb2x1bW5zLCBidXQgMm5kIGRpbWVuc2lvbiB3YXMgJHtib3hlcy5zaGFwZVsxXX1gKTtcbiAgICB1dGlsLmFzc2VydChzY29yZXMucmFuayA9PT0gMSwgKCkgPT4gJ3Njb3JlcyBtdXN0IGJlIGEgMUQgdGVuc29yJyk7XG4gICAgdXRpbC5hc3NlcnQoc2NvcmVzLnNoYXBlWzBdID09PSBudW1Cb3hlcywgKCkgPT4gYHNjb3JlcyBoYXMgaW5jb21wYXRpYmxlIHNoYXBlIHdpdGggYm94ZXMuIEV4cGVjdGVkICR7bnVtQm94ZXN9LCBgICtcbiAgICAgICAgYGJ1dCB3YXMgJHtzY29yZXMuc2hhcGVbMF19YCk7XG4gICAgdXRpbC5hc3NlcnQoMCA8PSBzb2Z0Tm1zU2lnbWEgJiYgc29mdE5tc1NpZ21hIDw9IDEsICgpID0+IGBzb2Z0Tm1zU2lnbWEgbXVzdCBiZSBpbiBbMCwgMV0sIGJ1dCB3YXMgJyR7c29mdE5tc1NpZ21hfSdgKTtcbiAgICByZXR1cm4geyBtYXhPdXRwdXRTaXplLCBpb3VUaHJlc2hvbGQsIHNjb3JlVGhyZXNob2xkLCBzb2Z0Tm1zU2lnbWEgfTtcbn1cbmV4cG9ydCB7IG5vbk1heFN1cHBTYW5pdHlDaGVjayB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bm9ubWF4X3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IHBhcnNlQXhpc1BhcmFtIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBhYnMgfSBmcm9tICcuL2Ficyc7XG5pbXBvcnQgKiBhcyBheGlzX3V0aWwgZnJvbSAnLi9heGlzX3V0aWwnO1xuaW1wb3J0IHsgbWF4IH0gZnJvbSAnLi9tYXgnO1xuaW1wb3J0IHsgbWluIH0gZnJvbSAnLi9taW4nO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyBwb3cgfSBmcm9tICcuL3Bvdyc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbmltcG9ydCB7IHNjYWxhciB9IGZyb20gJy4vc2NhbGFyJztcbmltcG9ydCB7IHNxcnQgfSBmcm9tICcuL3NxcnQnO1xuaW1wb3J0IHsgc3F1YXJlIH0gZnJvbSAnLi9zcXVhcmUnO1xuaW1wb3J0IHsgc3VtIH0gZnJvbSAnLi9zdW0nO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgbm9ybSBvZiBzY2FsYXIsIHZlY3RvcnMsIGFuZCBtYXRyaWNlcy5cbiAqIFRoaXMgZnVuY3Rpb24gY2FuIGNvbXB1dGUgc2V2ZXJhbCBkaWZmZXJlbnQgdmVjdG9yIG5vcm1zICh0aGUgMS1ub3JtLCB0aGVcbiAqIEV1Y2xpZGVhbiBvciAyLW5vcm0sIHRoZSBpbmYtbm9ybSwgYW5kIGluIGdlbmVyYWwgdGhlIHAtbm9ybSBmb3IgcCA+IDApXG4gKiBhbmQgbWF0cml4IG5vcm1zIChGcm9iZW5pdXMsIDEtbm9ybSwgYW5kIGluZi1ub3JtKS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzLCA0XSk7XG4gKlxuICogeC5ub3JtKCkucHJpbnQoKTsgIC8vIG9yIHRmLm5vcm0oeClcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBhcnJheS5cbiAqIEBwYXJhbSBvcmQgT3B0aW9uYWwuIE9yZGVyIG9mIHRoZSBub3JtLiBTdXBwb3J0ZWQgbm9ybSB0eXBlcyBhcmVcbiAqIGZvbGxvd2luZzpcbiAqXG4gKiAgfCBvcmQgICAgICAgIHwgbm9ybSBmb3IgbWF0cmljZXMgICAgICAgICB8IG5vcm0gZm9yIHZlY3RvcnNcbiAqICB8LS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICB8J2V1Y2xpZGVhbicgfEZyb2Jlbml1cyBub3JtICAgICAgICAgICAgIHwyLW5vcm1cbiAqICB8J2ZybycgICAgICAgfEZyb2Jlbml1cyBub3JtXHQgICAgICAgICAgIHxcbiAqICB8SW5maW5pdHkgICAgfG1heChzdW0oYWJzKHgpLCBheGlzPTEpKSAgIHxtYXgoYWJzKHgpKVxuICogIHwtSW5maW5pdHkgICB8bWluKHN1bShhYnMoeCksIGF4aXM9MSkpICAgfG1pbihhYnMoeCkpXG4gKiAgfDEgICAgICAgICAgIHxtYXgoc3VtKGFicyh4KSwgYXhpcz0wKSkgICB8c3VtKGFicyh4KSlcbiAqICB8MiAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxzdW0oYWJzKHgpXjIpXjEvMipcbiAqXG4gKiBAcGFyYW0gYXhpcyBPcHRpb25hbC4gSWYgYXhpcyBpcyBudWxsICh0aGUgZGVmYXVsdCksIHRoZSBpbnB1dCBpc1xuICogY29uc2lkZXJlZCBhIHZlY3RvciBhbmQgYSBzaW5nbGUgdmVjdG9yIG5vcm0gaXMgY29tcHV0ZWQgb3ZlciB0aGUgZW50aXJlXG4gKiBzZXQgb2YgdmFsdWVzIGluIHRoZSBUZW5zb3IsIGkuZS4gbm9ybSh4LCBvcmQpIGlzIGVxdWl2YWxlbnRcbiAqIHRvIG5vcm0oeC5yZXNoYXBlKFstMV0pLCBvcmQpLiBJZiBheGlzIGlzIGEgaW50ZWdlciwgdGhlIGlucHV0XG4gKiBpcyBjb25zaWRlcmVkIGEgYmF0Y2ggb2YgdmVjdG9ycywgYW5kIGF4aXMgZGV0ZXJtaW5lcyB0aGUgYXhpcyBpbiB4XG4gKiBvdmVyIHdoaWNoIHRvIGNvbXB1dGUgdmVjdG9yIG5vcm1zLiBJZiBheGlzIGlzIGEgMi10dXBsZSBvZiBpbnRlZ2VyIGl0IGlzXG4gKiBjb25zaWRlcmVkIGEgYmF0Y2ggb2YgbWF0cmljZXMgYW5kIGF4aXMgZGV0ZXJtaW5lcyB0aGUgYXhlcyBpbiBOREFycmF5XG4gKiBvdmVyIHdoaWNoIHRvIGNvbXB1dGUgYSBtYXRyaXggbm9ybS5cbiAqIEBwYXJhbSBrZWVwRGltcyBPcHRpb25hbC4gSWYgdHJ1ZSwgdGhlIG5vcm0gaGF2ZSB0aGUgc2FtZSBkaW1lbnNpb25hbGl0eVxuICogYXMgdGhlIGlucHV0LlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ01hdHJpY2VzJ31cbiAqL1xuZnVuY3Rpb24gbm9ybV8oeCwgb3JkID0gJ2V1Y2xpZGVhbicsIGF4aXMgPSBudWxsLCBrZWVwRGltcyA9IGZhbHNlKSB7XG4gICAgeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdub3JtJyk7XG4gICAgY29uc3Qgbm9ybSA9IG5vcm1JbXBsKHgsIG9yZCwgYXhpcyk7XG4gICAgbGV0IGtlZXBEaW1zU2hhcGUgPSBub3JtLnNoYXBlO1xuICAgIGlmIChrZWVwRGltcykge1xuICAgICAgICBjb25zdCBheGVzID0gcGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG4gICAgICAgIGtlZXBEaW1zU2hhcGUgPSBheGlzX3V0aWwuZXhwYW5kU2hhcGVUb0tlZXBEaW0obm9ybS5zaGFwZSwgYXhlcyk7XG4gICAgfVxuICAgIHJldHVybiByZXNoYXBlKG5vcm0sIGtlZXBEaW1zU2hhcGUpO1xufVxuZnVuY3Rpb24gbm9ybUltcGwoeCwgcCwgYXhpcyA9IG51bGwpIHtcbiAgICBpZiAoeC5yYW5rID09PSAwKSB7XG4gICAgICAgIHJldHVybiBhYnMoeCk7XG4gICAgfVxuICAgIC8vIGNvbnNpZGVyIHZlY3RvciB3aGVuIG5vIGF4aXMgaXMgc3BlY2lmaWVkXG4gICAgaWYgKHgucmFuayAhPT0gMSAmJiBheGlzID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBub3JtSW1wbChyZXNoYXBlKHgsIFstMV0pLCBwLCBheGlzKTtcbiAgICB9XG4gICAgLy8gdmVjdG9yXG4gICAgaWYgKHgucmFuayA9PT0gMSB8fCB0eXBlb2YgYXhpcyA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheShheGlzKSAmJiBheGlzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBpZiAocCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIHN1bShhYnMoeCksIGF4aXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwID09PSBJbmZpbml0eSkge1xuICAgICAgICAgICAgcmV0dXJuIG1heChhYnMoeCksIGF4aXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwID09PSAtSW5maW5pdHkpIHtcbiAgICAgICAgICAgIHJldHVybiBtaW4oYWJzKHgpLCBheGlzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocCA9PT0gJ2V1Y2xpZGVhbicgfHwgcCA9PT0gMikge1xuICAgICAgICAgICAgLy8gbm9ybSh4LCAyKSA9IHN1bShhYnMoeGkpIF4gMikgXiAxLzJcbiAgICAgICAgICAgIHJldHVybiBzcXJ0KHN1bShwb3coYWJzKHgpLCBzY2FsYXIoMiwgJ2ludDMyJykpLCBheGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBpbiBub3JtOiBpbnZhbGlkIG9yZCB2YWx1ZTogJHtwfWApO1xuICAgIH1cbiAgICAvLyBtYXRyaXggKGFzc3VtcHRpb24gYXhpc1swXSA8IGF4aXNbMV0pXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXhpcykgJiYgYXhpcy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgaWYgKHAgPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXgoc3VtKGFicyh4KSwgYXhpc1swXSksIGF4aXNbMV0gLSAxKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocCA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXgoc3VtKGFicyh4KSwgYXhpc1sxXSksIGF4aXNbMF0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwID09PSAtSW5maW5pdHkpIHtcbiAgICAgICAgICAgIHJldHVybiBtaW4oc3VtKGFicyh4KSwgYXhpc1sxXSksIGF4aXNbMF0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwID09PSAnZnJvJyB8fCBwID09PSAnZXVjbGlkZWFuJykge1xuICAgICAgICAgICAgLy8gbm9ybSh4KSA9IHNxcnQoc3VtKHBvdyh4LCAyKSkpXG4gICAgICAgICAgICByZXR1cm4gc3FydChzdW0oc3F1YXJlKHgpLCBheGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBpbiBub3JtOiBpbnZhbGlkIG9yZCB2YWx1ZTogJHtwfWApO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIG5vcm06IGludmFsaWQgYXhpczogJHtheGlzfWApO1xufVxuZXhwb3J0IGNvbnN0IG5vcm0gPSBvcCh7IG5vcm1fIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bm9ybS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTm90RXF1YWwgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgbWFrZVR5cGVzTWF0Y2ggfSBmcm9tICcuLi90ZW5zb3JfdXRpbCc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUgfSBmcm9tICcuL2Jyb2FkY2FzdF91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSB0cnV0aCB2YWx1ZSBvZiAoYSAhPSBiKSBlbGVtZW50LXdpc2UuIFN1cHBvcnRzIGJyb2FkY2FzdGluZy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzAsIDIsIDNdKTtcbiAqXG4gKiBhLm5vdEVxdWFsKGIpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBpbnB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIGlucHV0IHRlbnNvci4gTXVzdCBoYXZlIHRoZSBzYW1lIGR0eXBlIGFzIGBhYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdMb2dpY2FsJ31cbiAqL1xuZnVuY3Rpb24gbm90RXF1YWxfKGEsIGIpIHtcbiAgICBsZXQgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnbm90RXF1YWwnLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgICBsZXQgJGIgPSBjb252ZXJ0VG9UZW5zb3IoYiwgJ2InLCAnbm90RXF1YWwnLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgICBbJGEsICRiXSA9IG1ha2VUeXBlc01hdGNoKCRhLCAkYik7XG4gICAgYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoJGEuc2hhcGUsICRiLnNoYXBlKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGE6ICRhLCBiOiAkYiB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKE5vdEVxdWFsLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IG5vdEVxdWFsID0gb3AoeyBub3RFcXVhbF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ub3RfZXF1YWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IE9uZUhvdCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENyZWF0ZXMgYSBvbmUtaG90IGB0Zi5UZW5zb3JgLiBUaGUgbG9jYXRpb25zIHJlcHJlc2VudGVkIGJ5IGBpbmRpY2VzYCB0YWtlXG4gKiB2YWx1ZSBgb25WYWx1ZWAgKGRlZmF1bHRzIHRvIDEpLCB3aGlsZSBhbGwgb3RoZXIgbG9jYXRpb25zIHRha2UgdmFsdWVcbiAqIGBvZmZWYWx1ZWAgKGRlZmF1bHRzIHRvIDApLiBJZiBgaW5kaWNlc2AgaXMgcmFuayBgUmAsIHRoZSBvdXRwdXQgaGFzIHJhbmtcbiAqIGBSKzFgIHdpdGggdGhlIGxhc3QgYXhpcyBvZiBzaXplIGBkZXB0aGAuXG4gKlxuICogYGBganNcbiAqIHRmLm9uZUhvdCh0Zi50ZW5zb3IxZChbMCwgMV0sICdpbnQzMicpLCAzKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGluZGljZXMgYHRmLlRlbnNvcmAgb2YgaW5kaWNlcyB3aXRoIGR0eXBlIGBpbnQzMmAuXG4gKiBAcGFyYW0gZGVwdGggVGhlIGRlcHRoIG9mIHRoZSBvbmUgaG90IGRpbWVuc2lvbi5cbiAqIEBwYXJhbSBvblZhbHVlIEEgbnVtYmVyIHVzZWQgdG8gZmlsbCBpbiB0aGUgb3V0cHV0IHdoZW4gdGhlIGluZGV4IG1hdGNoZXNcbiAqIHRoZSBsb2NhdGlvbi5cbiAqIEBwYXJhbSBvZmZWYWx1ZSBBIG51bWJlciB1c2VkIHRvIGZpbGwgaW4gdGhlIG91dHB1dCB3aGVuIHRoZSBpbmRleCBkb2VzXG4gKiAgICAgbm90IG1hdGNoIHRoZSBsb2NhdGlvbi5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmZ1bmN0aW9uIG9uZUhvdF8oaW5kaWNlcywgZGVwdGgsIG9uVmFsdWUgPSAxLCBvZmZWYWx1ZSA9IDApIHtcbiAgICBpZiAoZGVwdGggPCAyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgaW4gb25lSG90OiBkZXB0aCBtdXN0IGJlID49MiwgYnV0IGl0IGlzICR7ZGVwdGh9YCk7XG4gICAgfVxuICAgIGNvbnN0ICRpbmRpY2VzID0gY29udmVydFRvVGVuc29yKGluZGljZXMsICdpbmRpY2VzJywgJ29uZUhvdCcsICdpbnQzMicpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgaW5kaWNlczogJGluZGljZXMgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgZGVwdGgsIG9uVmFsdWUsIG9mZlZhbHVlIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoT25lSG90LCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBvbmVIb3QgPSBvcCh7IG9uZUhvdF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1vbmVfaG90LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBtYWtlT25lc1R5cGVkQXJyYXksIHNpemVGcm9tU2hhcGUgfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IGNvbXBsZXggfSBmcm9tICcuL2NvbXBsZXgnO1xuaW1wb3J0IHsgemVyb3MgfSBmcm9tICcuL3plcm9zJztcbi8qKlxuICogQ3JlYXRlcyBhIGB0Zi5UZW5zb3JgIHdpdGggYWxsIGVsZW1lbnRzIHNldCB0byAxLlxuICpcbiAqIGBgYGpzXG4gKiB0Zi5vbmVzKFsyLCAyXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBzaGFwZSBBbiBhcnJheSBvZiBpbnRlZ2VycyBkZWZpbmluZyB0aGUgb3V0cHV0IHRlbnNvciBzaGFwZS5cbiAqIEBwYXJhbSBkdHlwZSBUaGUgdHlwZSBvZiBhbiBlbGVtZW50IGluIHRoZSByZXN1bHRpbmcgdGVuc29yLiBEZWZhdWx0cyB0b1xuICogICAgICdmbG9hdCcuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gb25lcyhzaGFwZSwgZHR5cGUgPSAnZmxvYXQzMicpIHtcbiAgICBpZiAoZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICAgIGNvbnN0IHJlYWwgPSBvbmVzKHNoYXBlLCAnZmxvYXQzMicpO1xuICAgICAgICBjb25zdCBpbWFnID0gemVyb3Moc2hhcGUsICdmbG9hdDMyJyk7XG4gICAgICAgIHJldHVybiBjb21wbGV4KHJlYWwsIGltYWcpO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZXMgPSBtYWtlT25lc1R5cGVkQXJyYXkoc2l6ZUZyb21TaGFwZShzaGFwZSksIGR0eXBlKTtcbiAgICByZXR1cm4gRU5HSU5FLm1ha2VUZW5zb3IodmFsdWVzLCBzaGFwZSwgZHR5cGUpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b25lcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgT25lc0xpa2UgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDcmVhdGVzIGEgYHRmLlRlbnNvcmAgd2l0aCBhbGwgZWxlbWVudHMgc2V0IHRvIDEgd2l0aCB0aGUgc2FtZSBzaGFwZSBhcyB0aGVcbiAqIGdpdmVuIHRlbnNvci5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcihbMSwgMl0pO1xuICogdGYub25lc0xpa2UoeCkucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIHggQSB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5mdW5jdGlvbiBvbmVzTGlrZV8oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ29uZXNMaWtlJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKE9uZXNMaWtlLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IG9uZXNMaWtlID0gb3AoeyBvbmVzTGlrZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1vbmVzX2xpa2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IGlzUHJvbWlzZSB9IGZyb20gJy4uL3V0aWwnO1xuZXhwb3J0IGNvbnN0IE9QX1NDT1BFX1NVRkZJWCA9ICdfX29wJztcbi8qKlxuICogVXNlZCBmb3Igd3JhcHBpbmcgZnVuY3Rpb25zIHRoYXQgcGVyZm9ybSBtYXRoIG9wZXJhdGlvbnMgb25cbiAqIFRlbnNvcnMuIFRoZSBmdW5jdGlvbiB3aWxsIGJlIHdyYXBwZWQgaW4gYSBuYW1lZCBzY29wZSB0aGF0IGNsZWFucyBhbGxcbiAqIG1lbW9yeSB1c2FnZSBhZnRlciB0aGUgZnVuY3Rpb24gaXMgZG9uZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wKGYpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZik7XG4gICAgaWYgKGtleXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUGxlYXNlIHByb3ZpZGUgYW4gb2JqZWN0IHdpdGggYSBzaW5nbGUga2V5IGAgK1xuICAgICAgICAgICAgYChvcGVyYXRpb24gbmFtZSkgbWFwcGluZyB0byBhIGZ1bmN0aW9uLiBHb3QgYW4gb2JqZWN0IHdpdGggYCArXG4gICAgICAgICAgICBgJHtrZXlzLmxlbmd0aH0ga2V5cy5gKTtcbiAgICB9XG4gICAgbGV0IG9wTmFtZSA9IGtleXNbMF07XG4gICAgY29uc3QgZm4gPSBmW29wTmFtZV07XG4gICAgLy8gU3RyaXAgdGhlIHVuZGVyc2NvcmUgZnJvbSB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbiBuYW1lLlxuICAgIGlmIChvcE5hbWUuZW5kc1dpdGgoJ18nKSkge1xuICAgICAgICBvcE5hbWUgPSBvcE5hbWUuc3Vic3RyaW5nKDAsIG9wTmFtZS5sZW5ndGggLSAxKTtcbiAgICB9XG4gICAgLy8gYWRkIGFuIF9fb3Agc3VmZml4IHRvIGRpc3Rpbmd1aXNoIG9wcyBmcm9tIGtlcm5lbHMgaW4gdGYucHJvZmlsZVxuICAgIG9wTmFtZSA9IG9wTmFtZSArIE9QX1NDT1BFX1NVRkZJWDtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgY29uc3QgZjIgPSAoLi4uYXJncykgPT4ge1xuICAgICAgICBFTkdJTkUuc3RhcnRTY29wZShvcE5hbWUpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZm4oLi4uYXJncyk7XG4gICAgICAgICAgICBpZiAoaXNQcm9taXNlKHJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdDYW5ub3QgcmV0dXJuIGEgUHJvbWlzZSBpbnNpZGUgb2YgdGlkeS4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEVOR0lORS5lbmRTY29wZShyZXN1bHQpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgIEVOR0lORS5lbmRTY29wZShudWxsKTtcbiAgICAgICAgICAgIHRocm93IGV4O1xuICAgICAgICB9XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZjIsICduYW1lJywgeyB2YWx1ZTogb3BOYW1lLCBjb25maWd1cmFibGU6IHRydWUgfSk7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgIHJldHVybiBmMjtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW9wZXJhdGlvbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vLyBNb2R1bGFyaXplZCBvcHMuXG5leHBvcnQgeyBhYnMgfSBmcm9tICcuL2Ficyc7XG5leHBvcnQgeyBhY29zIH0gZnJvbSAnLi9hY29zJztcbmV4cG9ydCB7IGFjb3NoIH0gZnJvbSAnLi9hY29zaCc7XG5leHBvcnQgeyBhZGQgfSBmcm9tICcuL2FkZCc7XG5leHBvcnQgeyBhZGROIH0gZnJvbSAnLi9hZGRfbic7XG5leHBvcnQgeyBhbGwgfSBmcm9tICcuL2FsbCc7XG5leHBvcnQgeyBhbnkgfSBmcm9tICcuL2FueSc7XG5leHBvcnQgeyBhcmdNYXggfSBmcm9tICcuL2FyZ19tYXgnO1xuZXhwb3J0IHsgYXJnTWluIH0gZnJvbSAnLi9hcmdfbWluJztcbmV4cG9ydCB7IGFzaW4gfSBmcm9tICcuL2FzaW4nO1xuZXhwb3J0IHsgYXNpbmggfSBmcm9tICcuL2FzaW5oJztcbmV4cG9ydCB7IGF0YW4gfSBmcm9tICcuL2F0YW4nO1xuZXhwb3J0IHsgYXRhbjIgfSBmcm9tICcuL2F0YW4yJztcbmV4cG9ydCB7IGF0YW5oIH0gZnJvbSAnLi9hdGFuaCc7XG5leHBvcnQgeyBhdmdQb29sIH0gZnJvbSAnLi9hdmdfcG9vbCc7XG5leHBvcnQgeyBhdmdQb29sM2QgfSBmcm9tICcuL2F2Z19wb29sXzNkJztcbmV4cG9ydCB7IGJhc2ljTFNUTUNlbGwgfSBmcm9tICcuL2Jhc2ljX2xzdG1fY2VsbCc7XG5leHBvcnQgeyBiYXRjaFRvU3BhY2VORCB9IGZyb20gJy4vYmF0Y2hfdG9fc3BhY2VfbmQnO1xuZXhwb3J0IHsgYmF0Y2hOb3JtIH0gZnJvbSAnLi9iYXRjaG5vcm0nO1xuZXhwb3J0IHsgYmF0Y2hOb3JtMmQgfSBmcm9tICcuL2JhdGNobm9ybTJkJztcbmV4cG9ydCB7IGJhdGNoTm9ybTNkIH0gZnJvbSAnLi9iYXRjaG5vcm0zZCc7XG5leHBvcnQgeyBiYXRjaE5vcm00ZCB9IGZyb20gJy4vYmF0Y2hub3JtNGQnO1xuZXhwb3J0IHsgYmluY291bnQgfSBmcm9tICcuL2JpbmNvdW50JztcbmV4cG9ydCB7IGJyb2FkY2FzdFRvIH0gZnJvbSAnLi9icm9hZGNhc3RfdG8nO1xuZXhwb3J0IHsgYnVmZmVyIH0gZnJvbSAnLi9idWZmZXInO1xuZXhwb3J0IHsgY2FzdCB9IGZyb20gJy4vY2FzdCc7XG5leHBvcnQgeyBjZWlsIH0gZnJvbSAnLi9jZWlsJztcbmV4cG9ydCB7IGNsaXBCeVZhbHVlIH0gZnJvbSAnLi9jbGlwX2J5X3ZhbHVlJztcbmV4cG9ydCB7IGNsb25lIH0gZnJvbSAnLi9jbG9uZSc7XG5leHBvcnQgeyBjb21wbGV4IH0gZnJvbSAnLi9jb21wbGV4JztcbmV4cG9ydCB7IGNvbmNhdCB9IGZyb20gJy4vY29uY2F0JztcbmV4cG9ydCB7IGNvbmNhdDFkIH0gZnJvbSAnLi9jb25jYXRfMWQnO1xuZXhwb3J0IHsgY29uY2F0MmQgfSBmcm9tICcuL2NvbmNhdF8yZCc7XG5leHBvcnQgeyBjb25jYXQzZCB9IGZyb20gJy4vY29uY2F0XzNkJztcbmV4cG9ydCB7IGNvbmNhdDRkIH0gZnJvbSAnLi9jb25jYXRfNGQnO1xuZXhwb3J0IHsgY29udjFkIH0gZnJvbSAnLi9jb252MWQnO1xuZXhwb3J0IHsgY29udjJkIH0gZnJvbSAnLi9jb252MmQnO1xuZXhwb3J0IHsgY29udjJkVHJhbnNwb3NlIH0gZnJvbSAnLi9jb252MmRfdHJhbnNwb3NlJztcbmV4cG9ydCB7IGNvbnYzZCB9IGZyb20gJy4vY29udjNkJztcbmV4cG9ydCB7IGNvbnYzZFRyYW5zcG9zZSB9IGZyb20gJy4vY29udjNkX3RyYW5zcG9zZSc7XG5leHBvcnQgeyBjb3MgfSBmcm9tICcuL2Nvcyc7XG5leHBvcnQgeyBjb3NoIH0gZnJvbSAnLi9jb3NoJztcbmV4cG9ydCB7IGN1bXN1bSB9IGZyb20gJy4vY3Vtc3VtJztcbmV4cG9ydCB7IGRlbnNlQmluY291bnQgfSBmcm9tICcuL2RlbnNlX2JpbmNvdW50JztcbmV4cG9ydCB7IGRlcHRoVG9TcGFjZSB9IGZyb20gJy4vZGVwdGhfdG9fc3BhY2UnO1xuZXhwb3J0IHsgZGVwdGh3aXNlQ29udjJkIH0gZnJvbSAnLi9kZXB0aHdpc2VfY29udjJkJztcbmV4cG9ydCB7IGRpYWcgfSBmcm9tICcuL2RpYWcnO1xuZXhwb3J0IHsgZGlsYXRpb24yZCB9IGZyb20gJy4vZGlsYXRpb24yZCc7XG5leHBvcnQgeyBkaXYgfSBmcm9tICcuL2Rpdic7XG5leHBvcnQgeyBkaXZOb05hbiB9IGZyb20gJy4vZGl2X25vX25hbic7XG5leHBvcnQgeyBkb3QgfSBmcm9tICcuL2RvdCc7XG5leHBvcnQgeyBlaW5zdW0gfSBmcm9tICcuL2VpbnN1bSc7XG5leHBvcnQgeyBlbHUgfSBmcm9tICcuL2VsdSc7XG5leHBvcnQgeyBlcXVhbCB9IGZyb20gJy4vZXF1YWwnO1xuZXhwb3J0IHsgZXJmIH0gZnJvbSAnLi9lcmYnO1xuZXhwb3J0IHsgZXhwIH0gZnJvbSAnLi9leHAnO1xuZXhwb3J0IHsgZXhwYW5kRGltcyB9IGZyb20gJy4vZXhwYW5kX2RpbXMnO1xuZXhwb3J0IHsgZXhwbTEgfSBmcm9tICcuL2V4cG0xJztcbmV4cG9ydCB7IGV5ZSB9IGZyb20gJy4vZXllJztcbmV4cG9ydCB7IGZpbGwgfSBmcm9tICcuL2ZpbGwnO1xuZXhwb3J0IHsgZmxvb3IgfSBmcm9tICcuL2Zsb29yJztcbmV4cG9ydCB7IGZsb29yRGl2IH0gZnJvbSAnLi9mbG9vckRpdic7XG5leHBvcnQgeyBnYXRoZXIgfSBmcm9tICcuL2dhdGhlcic7XG5leHBvcnQgeyBncmVhdGVyIH0gZnJvbSAnLi9ncmVhdGVyJztcbmV4cG9ydCB7IGdyZWF0ZXJFcXVhbCB9IGZyb20gJy4vZ3JlYXRlcl9lcXVhbCc7XG5leHBvcnQgeyBpbWFnIH0gZnJvbSAnLi9pbWFnJztcbmV4cG9ydCB7IGlzRmluaXRlIH0gZnJvbSAnLi9pc19maW5pdGUnO1xuZXhwb3J0IHsgaXNJbmYgfSBmcm9tICcuL2lzX2luZic7XG5leHBvcnQgeyBpc05hTiB9IGZyb20gJy4vaXNfbmFuJztcbmV4cG9ydCB7IGxlYWt5UmVsdSB9IGZyb20gJy4vbGVha3lfcmVsdSc7XG5leHBvcnQgeyBsZXNzIH0gZnJvbSAnLi9sZXNzJztcbmV4cG9ydCB7IGxlc3NFcXVhbCB9IGZyb20gJy4vbGVzc19lcXVhbCc7XG5leHBvcnQgeyBsaW5zcGFjZSB9IGZyb20gJy4vbGluc3BhY2UnO1xuZXhwb3J0IHsgbG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb24gfSBmcm9tICcuL2xvY2FsX3Jlc3BvbnNlX25vcm1hbGl6YXRpb24nO1xuZXhwb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cnO1xuZXhwb3J0IHsgbG9nMXAgfSBmcm9tICcuL2xvZzFwJztcbmV4cG9ydCB7IGxvZ1NpZ21vaWQgfSBmcm9tICcuL2xvZ19zaWdtb2lkJztcbmV4cG9ydCB7IGxvZ1NvZnRtYXggfSBmcm9tICcuL2xvZ19zb2Z0bWF4JztcbmV4cG9ydCB7IGxvZ1N1bUV4cCB9IGZyb20gJy4vbG9nX3N1bV9leHAnO1xuZXhwb3J0IHsgbG9naWNhbEFuZCB9IGZyb20gJy4vbG9naWNhbF9hbmQnO1xuZXhwb3J0IHsgbG9naWNhbE5vdCB9IGZyb20gJy4vbG9naWNhbF9ub3QnO1xuZXhwb3J0IHsgbG9naWNhbE9yIH0gZnJvbSAnLi9sb2dpY2FsX29yJztcbmV4cG9ydCB7IGxvZ2ljYWxYb3IgfSBmcm9tICcuL2xvZ2ljYWxfeG9yJztcbmV4cG9ydCB7IG1hdE11bCB9IGZyb20gJy4vbWF0X211bCc7XG5leHBvcnQgeyBtYXggfSBmcm9tICcuL21heCc7XG5leHBvcnQgeyBtYXhQb29sIH0gZnJvbSAnLi9tYXhfcG9vbCc7XG5leHBvcnQgeyBtYXhQb29sM2QgfSBmcm9tICcuL21heF9wb29sXzNkJztcbmV4cG9ydCB7IG1heFBvb2xXaXRoQXJnbWF4IH0gZnJvbSAnLi9tYXhfcG9vbF93aXRoX2FyZ21heCc7XG5leHBvcnQgeyBtYXhpbXVtIH0gZnJvbSAnLi9tYXhpbXVtJztcbmV4cG9ydCB7IG1lYW4gfSBmcm9tICcuL21lYW4nO1xuZXhwb3J0IHsgbWVzaGdyaWQgfSBmcm9tICcuL21lc2hncmlkJztcbmV4cG9ydCB7IG1pbiB9IGZyb20gJy4vbWluJztcbmV4cG9ydCB7IG1pbmltdW0gfSBmcm9tICcuL21pbmltdW0nO1xuZXhwb3J0IHsgbWlycm9yUGFkIH0gZnJvbSAnLi9taXJyb3JfcGFkJztcbmV4cG9ydCB7IG1vZCB9IGZyb20gJy4vbW9kJztcbmV4cG9ydCB7IG1vbWVudHMgfSBmcm9tICcuL21vbWVudHMnO1xuZXhwb3J0IHsgbXVsIH0gZnJvbSAnLi9tdWwnO1xuZXhwb3J0IHsgbXVsdGlSTk5DZWxsIH0gZnJvbSAnLi9tdWx0aV9ybm5fY2VsbCc7XG5leHBvcnQgeyBtdWx0aW5vbWlhbCB9IGZyb20gJy4vbXVsdGlub21pYWwnO1xuZXhwb3J0IHsgbmVnIH0gZnJvbSAnLi9uZWcnO1xuZXhwb3J0IHsgbm90RXF1YWwgfSBmcm9tICcuL25vdF9lcXVhbCc7XG5leHBvcnQgeyBvbmVIb3QgfSBmcm9tICcuL29uZV9ob3QnO1xuZXhwb3J0IHsgb25lcyB9IGZyb20gJy4vb25lcyc7XG5leHBvcnQgeyBvbmVzTGlrZSB9IGZyb20gJy4vb25lc19saWtlJztcbmV4cG9ydCB7IG91dGVyUHJvZHVjdCB9IGZyb20gJy4vb3V0ZXJfcHJvZHVjdCc7XG5leHBvcnQgeyBwYWQgfSBmcm9tICcuL3BhZCc7XG5leHBvcnQgeyBwYWQxZCB9IGZyb20gJy4vcGFkMWQnO1xuZXhwb3J0IHsgcGFkMmQgfSBmcm9tICcuL3BhZDJkJztcbmV4cG9ydCB7IHBhZDNkIH0gZnJvbSAnLi9wYWQzZCc7XG5leHBvcnQgeyBwYWQ0ZCB9IGZyb20gJy4vcGFkNGQnO1xuZXhwb3J0IHsgcG9vbCB9IGZyb20gJy4vcG9vbCc7XG5leHBvcnQgeyBwb3cgfSBmcm9tICcuL3Bvdyc7XG5leHBvcnQgeyBwcmVsdSB9IGZyb20gJy4vcHJlbHUnO1xuZXhwb3J0IHsgcHJpbnQgfSBmcm9tICcuL3ByaW50JztcbmV4cG9ydCB7IHByb2QgfSBmcm9tICcuL3Byb2QnO1xuZXhwb3J0IHsgcmFuZCB9IGZyb20gJy4vcmFuZCc7XG5leHBvcnQgeyByYW5kb21HYW1tYSB9IGZyb20gJy4vcmFuZG9tX2dhbW1hJztcbmV4cG9ydCB7IHJhbmRvbU5vcm1hbCB9IGZyb20gJy4vcmFuZG9tX25vcm1hbCc7XG5leHBvcnQgeyByYW5kb21Vbmlmb3JtIH0gZnJvbSAnLi9yYW5kb21fdW5pZm9ybSc7XG5leHBvcnQgeyByYW5nZSB9IGZyb20gJy4vcmFuZ2UnO1xuZXhwb3J0IHsgcmVhbCB9IGZyb20gJy4vcmVhbCc7XG5leHBvcnQgeyByZWNpcHJvY2FsIH0gZnJvbSAnLi9yZWNpcHJvY2FsJztcbmV4cG9ydCB7IHJlbHUgfSBmcm9tICcuL3JlbHUnO1xuZXhwb3J0IHsgcmVsdTYgfSBmcm9tICcuL3JlbHU2JztcbmV4cG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL3Jlc2hhcGUnO1xuZXhwb3J0IHsgcmV2ZXJzZSB9IGZyb20gJy4vcmV2ZXJzZSc7XG5leHBvcnQgeyByZXZlcnNlMWQgfSBmcm9tICcuL3JldmVyc2VfMWQnO1xuZXhwb3J0IHsgcmV2ZXJzZTJkIH0gZnJvbSAnLi9yZXZlcnNlXzJkJztcbmV4cG9ydCB7IHJldmVyc2UzZCB9IGZyb20gJy4vcmV2ZXJzZV8zZCc7XG5leHBvcnQgeyByZXZlcnNlNGQgfSBmcm9tICcuL3JldmVyc2VfNGQnO1xuZXhwb3J0IHsgcm91bmQgfSBmcm9tICcuL3JvdW5kJztcbmV4cG9ydCB7IHJzcXJ0IH0gZnJvbSAnLi9yc3FydCc7XG5leHBvcnQgeyBzY2FsYXIgfSBmcm9tICcuL3NjYWxhcic7XG5leHBvcnQgeyBzZWx1IH0gZnJvbSAnLi9zZWx1JztcbmV4cG9ydCB7IHNlcGFyYWJsZUNvbnYyZCB9IGZyb20gJy4vc2VwYXJhYmxlX2NvbnYyZCc7XG5leHBvcnQgeyBzZXRkaWZmMWRBc3luYyB9IGZyb20gJy4vc2V0ZGlmZjFkX2FzeW5jJztcbmV4cG9ydCB7IHNpZ21vaWQgfSBmcm9tICcuL3NpZ21vaWQnO1xuZXhwb3J0IHsgc2lnbiB9IGZyb20gJy4vc2lnbic7XG5leHBvcnQgeyBzaW4gfSBmcm9tICcuL3Npbic7XG5leHBvcnQgeyBzaW5oIH0gZnJvbSAnLi9zaW5oJztcbmV4cG9ydCB7IHNsaWNlIH0gZnJvbSAnLi9zbGljZSc7XG5leHBvcnQgeyBzbGljZTFkIH0gZnJvbSAnLi9zbGljZTFkJztcbmV4cG9ydCB7IHNsaWNlMmQgfSBmcm9tICcuL3NsaWNlMmQnO1xuZXhwb3J0IHsgc2xpY2UzZCB9IGZyb20gJy4vc2xpY2UzZCc7XG5leHBvcnQgeyBzbGljZTRkIH0gZnJvbSAnLi9zbGljZTRkJztcbmV4cG9ydCB7IHNvZnRtYXggfSBmcm9tICcuL3NvZnRtYXgnO1xuZXhwb3J0IHsgc29mdHBsdXMgfSBmcm9tICcuL3NvZnRwbHVzJztcbmV4cG9ydCB7IHNwYWNlVG9CYXRjaE5EIH0gZnJvbSAnLi9zcGFjZV90b19iYXRjaF9uZCc7XG5leHBvcnQgeyBmZnQgfSBmcm9tICcuL3NwZWN0cmFsL2ZmdCc7XG5leHBvcnQgeyBpZmZ0IH0gZnJvbSAnLi9zcGVjdHJhbC9pZmZ0JztcbmV4cG9ydCB7IGlyZmZ0IH0gZnJvbSAnLi9zcGVjdHJhbC9pcmZmdCc7XG5leHBvcnQgeyByZmZ0IH0gZnJvbSAnLi9zcGVjdHJhbC9yZmZ0JztcbmV4cG9ydCB7IHNwbGl0IH0gZnJvbSAnLi9zcGxpdCc7XG5leHBvcnQgeyBzcXJ0IH0gZnJvbSAnLi9zcXJ0JztcbmV4cG9ydCB7IHNxdWFyZSB9IGZyb20gJy4vc3F1YXJlJztcbmV4cG9ydCB7IHNxdWFyZWREaWZmZXJlbmNlIH0gZnJvbSAnLi9zcXVhcmVkX2RpZmZlcmVuY2UnO1xuZXhwb3J0IHsgc3F1ZWV6ZSB9IGZyb20gJy4vc3F1ZWV6ZSc7XG5leHBvcnQgeyBzdGFjayB9IGZyb20gJy4vc3RhY2snO1xuZXhwb3J0IHsgc3RlcCB9IGZyb20gJy4vc3RlcCc7XG5leHBvcnQgeyBzdHJpZGVkU2xpY2UgfSBmcm9tICcuL3N0cmlkZWRfc2xpY2UnO1xuZXhwb3J0IHsgc3ViIH0gZnJvbSAnLi9zdWInO1xuZXhwb3J0IHsgc3VtIH0gZnJvbSAnLi9zdW0nO1xuZXhwb3J0IHsgdGFuIH0gZnJvbSAnLi90YW4nO1xuZXhwb3J0IHsgdGFuaCB9IGZyb20gJy4vdGFuaCc7XG5leHBvcnQgeyB0ZW5zb3IgfSBmcm9tICcuL3RlbnNvcic7XG5leHBvcnQgeyB0ZW5zb3IxZCB9IGZyb20gJy4vdGVuc29yMWQnO1xuZXhwb3J0IHsgdGVuc29yMmQgfSBmcm9tICcuL3RlbnNvcjJkJztcbmV4cG9ydCB7IHRlbnNvcjNkIH0gZnJvbSAnLi90ZW5zb3IzZCc7XG5leHBvcnQgeyB0ZW5zb3I0ZCB9IGZyb20gJy4vdGVuc29yNGQnO1xuZXhwb3J0IHsgdGVuc29yNWQgfSBmcm9tICcuL3RlbnNvcjVkJztcbmV4cG9ydCB7IHRlbnNvcjZkIH0gZnJvbSAnLi90ZW5zb3I2ZCc7XG5leHBvcnQgeyB0aWxlIH0gZnJvbSAnLi90aWxlJztcbmV4cG9ydCB7IHRvcGsgfSBmcm9tICcuL3RvcGsnO1xuZXhwb3J0IHsgdHJ1bmNhdGVkTm9ybWFsIH0gZnJvbSAnLi90cnVuY2F0ZWRfbm9ybWFsJztcbmV4cG9ydCB7IHVuaXF1ZSB9IGZyb20gJy4vdW5pcXVlJztcbmV4cG9ydCB7IHVuc29ydGVkU2VnbWVudFN1bSB9IGZyb20gJy4vdW5zb3J0ZWRfc2VnbWVudF9zdW0nO1xuZXhwb3J0IHsgdW5zdGFjayB9IGZyb20gJy4vdW5zdGFjayc7XG5leHBvcnQgeyB2YXJpYWJsZSB9IGZyb20gJy4vdmFyaWFibGUnO1xuZXhwb3J0IHsgd2hlcmUgfSBmcm9tICcuL3doZXJlJztcbmV4cG9ydCB7IHdoZXJlQXN5bmMgfSBmcm9tICcuL3doZXJlX2FzeW5jJztcbmV4cG9ydCB7IHplcm9zIH0gZnJvbSAnLi96ZXJvcyc7XG5leHBvcnQgeyB6ZXJvc0xpa2UgfSBmcm9tICcuL3plcm9zX2xpa2UnO1xuZXhwb3J0ICogZnJvbSAnLi9ib29sZWFuX21hc2snO1xuZXhwb3J0ICogZnJvbSAnLi90cmFuc3Bvc2UnO1xuZXhwb3J0ICogZnJvbSAnLi9ub3JtJztcbmV4cG9ydCAqIGZyb20gJy4vbW92aW5nX2F2ZXJhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9zY2F0dGVyX25kJztcbmV4cG9ydCAqIGZyb20gJy4vc3BhcnNlX3RvX2RlbnNlJztcbmV4cG9ydCAqIGZyb20gJy4vZ2F0aGVyX25kJztcbmV4cG9ydCAqIGZyb20gJy4vZHJvcG91dCc7XG5leHBvcnQgKiBmcm9tICcuL3NpZ25hbF9vcHNfdXRpbCc7XG5leHBvcnQgKiBmcm9tICcuL2luX3RvcF9rJztcbmV4cG9ydCB7IG9wLCBPUF9TQ09QRV9TVUZGSVggfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZmZ0IH0gZnJvbSAnLi9zcGVjdHJhbC9yZmZ0JztcbmltcG9ydCB7IGZmdCB9IGZyb20gJy4vc3BlY3RyYWwvZmZ0JztcbmltcG9ydCB7IGlmZnQgfSBmcm9tICcuL3NwZWN0cmFsL2lmZnQnO1xuaW1wb3J0IHsgaXJmZnQgfSBmcm9tICcuL3NwZWN0cmFsL2lyZmZ0JztcbmNvbnN0IHNwZWN0cmFsID0ge1xuICAgIGZmdCxcbiAgICBpZmZ0LFxuICAgIHJmZnQsXG4gICAgaXJmZnRcbn07XG5pbXBvcnQgKiBhcyBmdXNlZCBmcm9tICcuL2Z1c2VkX29wcyc7XG5pbXBvcnQgeyBoYW1taW5nV2luZG93IH0gZnJvbSAnLi9zaWduYWwvaGFtbWluZ193aW5kb3cnO1xuaW1wb3J0IHsgaGFubldpbmRvdyB9IGZyb20gJy4vc2lnbmFsL2hhbm5fd2luZG93JztcbmltcG9ydCB7IGZyYW1lIH0gZnJvbSAnLi9zaWduYWwvZnJhbWUnO1xuaW1wb3J0IHsgc3RmdCB9IGZyb20gJy4vc2lnbmFsL3N0ZnQnO1xuY29uc3Qgc2lnbmFsID0ge1xuICAgIGhhbW1pbmdXaW5kb3csXG4gICAgaGFubldpbmRvdyxcbiAgICBmcmFtZSxcbiAgICBzdGZ0LFxufTtcbi8vIEltYWdlIE9wcyBuYW1lc3BhY2VcbmltcG9ydCB7IGNyb3BBbmRSZXNpemUgfSBmcm9tICcuL2ltYWdlL2Nyb3BfYW5kX3Jlc2l6ZSc7XG5pbXBvcnQgeyBmbGlwTGVmdFJpZ2h0IH0gZnJvbSAnLi9pbWFnZS9mbGlwX2xlZnRfcmlnaHQnO1xuaW1wb3J0IHsgcm90YXRlV2l0aE9mZnNldCB9IGZyb20gJy4vaW1hZ2Uvcm90YXRlX3dpdGhfb2Zmc2V0JztcbmltcG9ydCB7IG5vbk1heFN1cHByZXNzaW9uIH0gZnJvbSAnLi9pbWFnZS9ub25fbWF4X3N1cHByZXNzaW9uJztcbmltcG9ydCB7IG5vbk1heFN1cHByZXNzaW9uQXN5bmMgfSBmcm9tICcuL2ltYWdlL25vbl9tYXhfc3VwcHJlc3Npb25fYXN5bmMnO1xuaW1wb3J0IHsgbm9uTWF4U3VwcHJlc3Npb25XaXRoU2NvcmUgfSBmcm9tICcuL2ltYWdlL25vbl9tYXhfc3VwcHJlc3Npb25fd2l0aF9zY29yZSc7XG5pbXBvcnQgeyBub25NYXhTdXBwcmVzc2lvbldpdGhTY29yZUFzeW5jIH0gZnJvbSAnLi9pbWFnZS9ub25fbWF4X3N1cHByZXNzaW9uX3dpdGhfc2NvcmVfYXN5bmMnO1xuaW1wb3J0IHsgbm9uTWF4U3VwcHJlc3Npb25QYWRkZWQgfSBmcm9tICcuL2ltYWdlL25vbl9tYXhfc3VwcHJlc3Npb25fcGFkZGVkJztcbmltcG9ydCB7IG5vbk1heFN1cHByZXNzaW9uUGFkZGVkQXN5bmMgfSBmcm9tICcuL2ltYWdlL25vbl9tYXhfc3VwcHJlc3Npb25fcGFkZGVkX2FzeW5jJztcbmltcG9ydCB7IHJlc2l6ZUJpbGluZWFyIH0gZnJvbSAnLi9pbWFnZS9yZXNpemVfYmlsaW5lYXInO1xuaW1wb3J0IHsgcmVzaXplTmVhcmVzdE5laWdoYm9yIH0gZnJvbSAnLi9pbWFnZS9yZXNpemVfbmVhcmVzdF9uZWlnaGJvcic7XG5pbXBvcnQgeyB0aHJlc2hvbGQgfSBmcm9tICcuL2ltYWdlL3RocmVzaG9sZCc7XG5pbXBvcnQgeyB0cmFuc2Zvcm0gfSBmcm9tICcuL2ltYWdlL3RyYW5zZm9ybSc7XG5jb25zdCBpbWFnZSA9IHtcbiAgICBmbGlwTGVmdFJpZ2h0LFxuICAgIHJlc2l6ZU5lYXJlc3ROZWlnaGJvcixcbiAgICByZXNpemVCaWxpbmVhcixcbiAgICByb3RhdGVXaXRoT2Zmc2V0LFxuICAgIGNyb3BBbmRSZXNpemUsXG4gICAgbm9uTWF4U3VwcHJlc3Npb24sXG4gICAgbm9uTWF4U3VwcHJlc3Npb25Bc3luYyxcbiAgICBub25NYXhTdXBwcmVzc2lvbldpdGhTY29yZSxcbiAgICBub25NYXhTdXBwcmVzc2lvbldpdGhTY29yZUFzeW5jLFxuICAgIG5vbk1heFN1cHByZXNzaW9uUGFkZGVkLFxuICAgIG5vbk1heFN1cHByZXNzaW9uUGFkZGVkQXN5bmMsXG4gICAgdGhyZXNob2xkLFxuICAgIHRyYW5zZm9ybVxufTtcbi8vIGxpbmFsZyBuYW1lc3BhY2VcbmltcG9ydCB7IGJhbmRQYXJ0IH0gZnJvbSAnLi9saW5hbGcvYmFuZF9wYXJ0JztcbmltcG9ydCB7IGdyYW1TY2htaWR0IH0gZnJvbSAnLi9saW5hbGcvZ3JhbV9zY2htaWR0JztcbmltcG9ydCB7IHFyIH0gZnJvbSAnLi9saW5hbGcvcXInO1xuY29uc3QgbGluYWxnID0ge1xuICAgIGJhbmRQYXJ0LFxuICAgIGdyYW1TY2htaWR0LFxuICAgIHFyXG59O1xuLy8gbG9zc2VzIG5hbWVzcGFjZTtcbmltcG9ydCB7IGFic29sdXRlRGlmZmVyZW5jZSB9IGZyb20gJy4vbG9zc2VzL2Fic29sdXRlX2RpZmZlcmVuY2UnO1xuaW1wb3J0IHsgY29tcHV0ZVdlaWdodGVkTG9zcyB9IGZyb20gJy4vbG9zc2VzL2NvbXB1dGVfd2VpZ2h0ZWRfbG9zcyc7XG5pbXBvcnQgeyBjb3NpbmVEaXN0YW5jZSB9IGZyb20gJy4vbG9zc2VzL2Nvc2luZV9kaXN0YW5jZSc7XG5pbXBvcnQgeyBoaW5nZUxvc3MgfSBmcm9tICcuL2xvc3Nlcy9oaW5nZV9sb3NzJztcbmltcG9ydCB7IGh1YmVyTG9zcyB9IGZyb20gJy4vbG9zc2VzL2h1YmVyX2xvc3MnO1xuaW1wb3J0IHsgbG9nTG9zcyB9IGZyb20gJy4vbG9zc2VzL2xvZ19sb3NzJztcbmltcG9ydCB7IG1lYW5TcXVhcmVkRXJyb3IgfSBmcm9tICcuL2xvc3Nlcy9tZWFuX3NxdWFyZWRfZXJyb3InO1xuaW1wb3J0IHsgc2lnbW9pZENyb3NzRW50cm9weSB9IGZyb20gJy4vbG9zc2VzL3NpZ21vaWRfY3Jvc3NfZW50cm9weSc7XG5pbXBvcnQgeyBzb2Z0bWF4Q3Jvc3NFbnRyb3B5IH0gZnJvbSAnLi9sb3NzZXMvc29mdG1heF9jcm9zc19lbnRyb3B5JztcbmNvbnN0IGxvc3NlcyA9IHtcbiAgICBhYnNvbHV0ZURpZmZlcmVuY2UsXG4gICAgY29tcHV0ZVdlaWdodGVkTG9zcyxcbiAgICBjb3NpbmVEaXN0YW5jZSxcbiAgICBoaW5nZUxvc3MsXG4gICAgaHViZXJMb3NzLFxuICAgIGxvZ0xvc3MsXG4gICAgbWVhblNxdWFyZWRFcnJvcixcbiAgICBzaWdtb2lkQ3Jvc3NFbnRyb3B5LFxuICAgIHNvZnRtYXhDcm9zc0VudHJvcHlcbn07XG5pbXBvcnQgeyBzcGFyc2VGaWxsRW1wdHlSb3dzIH0gZnJvbSAnLi9zcGFyc2Uvc3BhcnNlX2ZpbGxfZW1wdHlfcm93cyc7XG5pbXBvcnQgeyBzcGFyc2VSZXNoYXBlIH0gZnJvbSAnLi9zcGFyc2Uvc3BhcnNlX3Jlc2hhcGUnO1xuaW1wb3J0IHsgc3BhcnNlU2VnbWVudE1lYW4gfSBmcm9tICcuL3NwYXJzZS9zcGFyc2Vfc2VnbWVudF9tZWFuJztcbmltcG9ydCB7IHNwYXJzZVNlZ21lbnRTdW0gfSBmcm9tICcuL3NwYXJzZS9zcGFyc2Vfc2VnbWVudF9zdW0nO1xuY29uc3Qgc3BhcnNlID0ge1xuICAgIHNwYXJzZUZpbGxFbXB0eVJvd3MsXG4gICAgc3BhcnNlUmVzaGFwZSxcbiAgICBzcGFyc2VTZWdtZW50TWVhbixcbiAgICBzcGFyc2VTZWdtZW50U3VtXG59O1xuaW1wb3J0IHsgc3RyaW5nTkdyYW1zIH0gZnJvbSAnLi9zdHJpbmcvc3RyaW5nX25fZ3JhbXMnO1xuaW1wb3J0IHsgc3RyaW5nU3BsaXQgfSBmcm9tICcuL3N0cmluZy9zdHJpbmdfc3BsaXQnO1xuaW1wb3J0IHsgc3RyaW5nVG9IYXNoQnVja2V0RmFzdCB9IGZyb20gJy4vc3RyaW5nL3N0cmluZ190b19oYXNoX2J1Y2tldF9mYXN0Jztcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXG5jb25zdCBzdHJpbmcgPSB7XG4gICAgc3RyaW5nTkdyYW1zLFxuICAgIHN0cmluZ1NwbGl0LFxuICAgIHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3Rcbn07XG4vLyBTZWNvbmQgbGV2ZWwgZXhwb3J0cy5cbmV4cG9ydCB7IGltYWdlLCBsaW5hbGcsIGxvc3Nlcywgc3BlY3RyYWwsIGZ1c2VkLCBzaWduYWwsIHNwYXJzZSwgc3RyaW5nIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1vcHMuanMubWFwIiwiaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBtYXRNdWwgfSBmcm9tICcuL21hdF9tdWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIG91dGVyIHByb2R1Y3Qgb2YgdHdvIHZlY3RvcnMsIGB2MWAgYW5kIGB2MmAuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFszLCA0LCA1XSk7XG4gKlxuICogdGYub3V0ZXJQcm9kdWN0KGEsIGIpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSB2MSBUaGUgZmlyc3QgdmVjdG9yIGluIHRoZSBvdXRlciBwcm9kdWN0IG9wZXJhdGlvbi5cbiAqIEBwYXJhbSB2MiBUaGUgc2Vjb25kIHZlY3RvciBpbiB0aGUgb3V0ZXIgcHJvZHVjdCBvcGVyYXRpb24uXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTWF0cmljZXMnfVxuICovXG5mdW5jdGlvbiBvdXRlclByb2R1Y3RfKHYxLCB2Mikge1xuICAgIGNvbnN0ICR2MSA9IGNvbnZlcnRUb1RlbnNvcih2MSwgJ3YxJywgJ291dGVyUHJvZHVjdCcpO1xuICAgIGNvbnN0ICR2MiA9IGNvbnZlcnRUb1RlbnNvcih2MiwgJ3YyJywgJ291dGVyUHJvZHVjdCcpO1xuICAgIHV0aWwuYXNzZXJ0KCR2MS5yYW5rID09PSAxICYmICR2Mi5yYW5rID09PSAxLCAoKSA9PiBgRXJyb3IgaW4gb3V0ZXJQcm9kdWN0OiBpbnB1dHMgbXVzdCBiZSByYW5rIDEsIGJ1dCBnb3QgcmFua3MgYCArXG4gICAgICAgIGAkeyR2MS5yYW5rfSBhbmQgJHskdjIucmFua30uYCk7XG4gICAgY29uc3QgdjEyRCA9IHJlc2hhcGUoJHYxLCBbLTEsIDFdKTtcbiAgICBjb25zdCB2MjJEID0gcmVzaGFwZSgkdjIsIFsxLCAtMV0pO1xuICAgIHJldHVybiBtYXRNdWwodjEyRCwgdjIyRCk7XG59XG5leHBvcnQgY29uc3Qgb3V0ZXJQcm9kdWN0ID0gb3AoeyBvdXRlclByb2R1Y3RfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b3V0ZXJfcHJvZHVjdC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgUGFkVjIgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBQYWRzIGEgYHRmLlRlbnNvcmAgd2l0aCBhIGdpdmVuIHZhbHVlIGFuZCBwYWRkaW5ncy5cbiAqXG4gKiBUaGlzIG9wZXJhdGlvbiBpbXBsZW1lbnRzIGBDT05TVEFOVGAgbW9kZS4gRm9yIGBSRUZMRUNUYCBhbmQgYFNZTU1FVFJJQ2AsXG4gKiByZWZlciB0byBgdGYubWlycm9yUGFkYFxuICpcbiAqIEFsc28gYXZhaWxhYmxlIGFyZSBzdHJpY3RlciByYW5rLXNwZWNpZmljIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmVcbiAqIGFzIHRoaXMgbWV0aG9kIHRoYXQgYXNzZXJ0IHRoYXQgYHBhZGRpbmdzYCBpcyBvZiBnaXZlbiBsZW5ndGguXG4gKiAgIC0gYHRmLnBhZDFkYFxuICogICAtIGB0Zi5wYWQyZGBcbiAqICAgLSBgdGYucGFkM2RgXG4gKiAgIC0gYHRmLnBhZDRkYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDMsIDRdKTtcbiAqIHgucGFkKFtbMSwgMl1dKS5wcmludCgpO1xuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgdGVuc29yIHRvIHBhZC5cbiAqIEBwYXJhbSBwYWRkaW5ncyBBbiBhcnJheSBvZiBsZW5ndGggYFJgICh0aGUgcmFuayBvZiB0aGUgdGVuc29yKSwgd2hlcmVcbiAqIGVhY2ggZWxlbWVudCBpcyBhIGxlbmd0aC0yIHR1cGxlIG9mIGludHMgYFtwYWRCZWZvcmUsIHBhZEFmdGVyXWAsXG4gKiBzcGVjaWZ5aW5nIGhvdyBtdWNoIHRvIHBhZCBhbG9uZyBlYWNoIGRpbWVuc2lvbiBvZiB0aGUgdGVuc29yLlxuICogQHBhcmFtIGNvbnN0YW50VmFsdWUgVGhlIHBhZCB2YWx1ZSB0byB1c2UuIERlZmF1bHRzIHRvIDAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnVHJhbnNmb3JtYXRpb25zJ31cbiAqL1xuZnVuY3Rpb24gcGFkXyh4LCBwYWRkaW5ncywgY29uc3RhbnRWYWx1ZSA9IDApIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdwYWQnKTtcbiAgICBpZiAoJHgucmFuayA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BhZChzY2FsYXIpIGlzIG5vdCBkZWZpbmVkLiBQYXNzIG5vbi1zY2FsYXIgdG8gcGFkJyk7XG4gICAgfVxuICAgIGNvbnN0IGF0dHJzID0geyBwYWRkaW5ncywgY29uc3RhbnRWYWx1ZSB9O1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChQYWRWMiwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgcGFkID0gb3AoeyBwYWRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGFkLmpzLm1hcCIsImltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyBwYWQgfSBmcm9tICcuL3BhZCc7XG4vKipcbiAqIFBhZHMgYSBgdGYuVGVuc29yMURgIHdpdGggYSBnaXZlbiB2YWx1ZSBhbmQgcGFkZGluZ3MuIFNlZSBgcGFkYCBmb3IgZGV0YWlscy5cbiAqL1xuZnVuY3Rpb24gcGFkMWRfKHgsIHBhZGRpbmdzLCBjb25zdGFudFZhbHVlID0gMCkge1xuICAgIGFzc2VydChwYWRkaW5ncy5sZW5ndGggPT09IDIsICgpID0+ICdJbnZhbGlkIG51bWJlciBvZiBwYWRkaW5ncy4gTXVzdCBiZSBsZW5ndGggb2YgMi4nKTtcbiAgICByZXR1cm4gcGFkKHgsIFtwYWRkaW5nc10sIGNvbnN0YW50VmFsdWUpO1xufVxuZXhwb3J0IGNvbnN0IHBhZDFkID0gb3AoeyBwYWQxZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYWQxZC5qcy5tYXAiLCJpbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcGFkIH0gZnJvbSAnLi9wYWQnO1xuLyoqXG4gKiBQYWRzIGEgYHRmLlRlbnNvcjJEYCB3aXRoIGEgZ2l2ZW4gdmFsdWUgYW5kIHBhZGRpbmdzLiBTZWUgYHBhZGAgZm9yIGRldGFpbHMuXG4gKi9cbmZ1bmN0aW9uIHBhZDJkXyh4LCBwYWRkaW5ncywgY29uc3RhbnRWYWx1ZSA9IDApIHtcbiAgICBhc3NlcnQocGFkZGluZ3MubGVuZ3RoID09PSAyICYmIHBhZGRpbmdzWzBdLmxlbmd0aCA9PT0gMiAmJlxuICAgICAgICBwYWRkaW5nc1sxXS5sZW5ndGggPT09IDIsICgpID0+ICdJbnZhbGlkIG51bWJlciBvZiBwYWRkaW5ncy4gTXVzdCBiZSBsZW5ndGggb2YgMiBlYWNoLicpO1xuICAgIHJldHVybiBwYWQoeCwgcGFkZGluZ3MsIGNvbnN0YW50VmFsdWUpO1xufVxuZXhwb3J0IGNvbnN0IHBhZDJkID0gb3AoeyBwYWQyZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYWQyZC5qcy5tYXAiLCJpbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcGFkIH0gZnJvbSAnLi9wYWQnO1xuLyoqXG4gKiBQYWRzIGEgYHRmLlRlbnNvcjNEYCB3aXRoIGEgZ2l2ZW4gdmFsdWUgYW5kIHBhZGRpbmdzLiBTZWUgYHBhZGAgZm9yIGRldGFpbHMuXG4gKi9cbmZ1bmN0aW9uIHBhZDNkXyh4LCBwYWRkaW5ncywgY29uc3RhbnRWYWx1ZSA9IDApIHtcbiAgICBhc3NlcnQocGFkZGluZ3MubGVuZ3RoID09PSAzICYmIHBhZGRpbmdzWzBdLmxlbmd0aCA9PT0gMiAmJlxuICAgICAgICBwYWRkaW5nc1sxXS5sZW5ndGggPT09IDIgJiYgcGFkZGluZ3NbMl0ubGVuZ3RoID09PSAyLCAoKSA9PiAnSW52YWxpZCBudW1iZXIgb2YgcGFkZGluZ3MuIE11c3QgYmUgbGVuZ3RoIG9mIDIgZWFjaC4nKTtcbiAgICByZXR1cm4gcGFkKHgsIHBhZGRpbmdzLCBjb25zdGFudFZhbHVlKTtcbn1cbmV4cG9ydCBjb25zdCBwYWQzZCA9IG9wKHsgcGFkM2RfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGFkM2QuanMubWFwIiwiaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHBhZCB9IGZyb20gJy4vcGFkJztcbi8qKlxuICogUGFkcyBhIGB0Zi5UZW5zb3I0RGAgd2l0aCBhIGdpdmVuIHZhbHVlIGFuZCBwYWRkaW5ncy4gU2VlIGBwYWRgIGZvciBkZXRhaWxzLlxuICovXG5mdW5jdGlvbiBwYWQ0ZF8oeCwgcGFkZGluZ3MsIGNvbnN0YW50VmFsdWUgPSAwKSB7XG4gICAgYXNzZXJ0KHBhZGRpbmdzLmxlbmd0aCA9PT0gNCAmJiBwYWRkaW5nc1swXS5sZW5ndGggPT09IDIgJiZcbiAgICAgICAgcGFkZGluZ3NbMV0ubGVuZ3RoID09PSAyICYmIHBhZGRpbmdzWzJdLmxlbmd0aCA9PT0gMiAmJlxuICAgICAgICBwYWRkaW5nc1szXS5sZW5ndGggPT09IDIsICgpID0+ICdJbnZhbGlkIG51bWJlciBvZiBwYWRkaW5ncy4gTXVzdCBiZSBsZW5ndGggb2YgMiBlYWNoLicpO1xuICAgIHJldHVybiBwYWQoeCwgcGFkZGluZ3MsIGNvbnN0YW50VmFsdWUpO1xufVxuZXhwb3J0IGNvbnN0IHBhZDRkID0gb3AoeyBwYWQ0ZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYWQ0ZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IGF2Z1Bvb2wgfSBmcm9tICcuL2F2Z19wb29sJztcbmltcG9ydCB7IGJhdGNoVG9TcGFjZU5EIH0gZnJvbSAnLi9iYXRjaF90b19zcGFjZV9uZCc7XG5pbXBvcnQgKiBhcyBjb252X3V0aWwgZnJvbSAnLi9jb252X3V0aWwnO1xuaW1wb3J0IHsgbWF4UG9vbCB9IGZyb20gJy4vbWF4X3Bvb2wnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbmltcG9ydCB7IHNwYWNlVG9CYXRjaE5EIH0gZnJvbSAnLi9zcGFjZV90b19iYXRjaF9uZCc7XG4vKipcbiAqIFBlcmZvcm1zIGFuIE4tRCBwb29saW5nIG9wZXJhdGlvblxuICpcbiAqIEBwYXJhbSBpbnB1dCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDQgb3IgcmFuayAzIG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgaW5DaGFubmVsc11gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSB3aW5kb3dTaGFwZSBUaGUgZmlsdGVyIHNpemU6IGBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aF1gLiBJZlxuICogICAgIGBmaWx0ZXJTaXplYCBpcyBhIHNpbmdsZSBudW1iZXIsIHRoZW4gYGZpbHRlckhlaWdodCA9PSBmaWx0ZXJXaWR0aGAuXG4gKiBAcGFyYW0gcG9vbGluZ1R5cGUgVGhlIHR5cGUgb2YgcG9vbGluZywgZWl0aGVyICdtYXgnIG9yICdhdmcnLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobTpcbiAqICAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAgLSBGb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2d1aWRlcy9weXRob24vbm4jQ29udm9sdXRpb25dKFxuICogICAgICAgICBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZ3VpZGVzL3B5dGhvbi9ubiNDb252b2x1dGlvbilcbiAqIEBwYXJhbSBkaWxhdGlvbnMgVGhlIGRpbGF0aW9uIHJhdGVzOiBgW2RpbGF0aW9uSGVpZ2h0LCBkaWxhdGlvbldpZHRoXWBcbiAqICAgICBpbiB3aGljaCB3ZSBzYW1wbGUgaW5wdXQgdmFsdWVzIGFjcm9zcyB0aGUgaGVpZ2h0IGFuZCB3aWR0aCBkaW1lbnNpb25zXG4gKiAgICAgaW4gZGlsYXRlZCBwb29saW5nLiBEZWZhdWx0cyB0byBgWzEsIDFdYC4gSWYgYGRpbGF0aW9uUmF0ZWAgaXMgYSBzaW5nbGVcbiAqICAgICBudW1iZXIsIHRoZW4gYGRpbGF0aW9uSGVpZ2h0ID09IGRpbGF0aW9uV2lkdGhgLiBJZiBpdCBpcyBncmVhdGVyIHRoYW5cbiAqICAgICAxLCB0aGVuIGFsbCB2YWx1ZXMgb2YgYHN0cmlkZXNgIG11c3QgYmUgMS5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBwb29saW5nOiBgW3N0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGhdYC4gSWZcbiAqICAgICBgc3RyaWRlc2AgaXMgYSBzaW5nbGUgbnVtYmVyLCB0aGVuIGBzdHJpZGVIZWlnaHQgPT0gc3RyaWRlV2lkdGhgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0NvbnZvbHV0aW9uJ31cbiAqL1xuZnVuY3Rpb24gcG9vbF8oaW5wdXQsIHdpbmRvd1NoYXBlLCBwb29saW5nVHlwZSwgcGFkLCBkaWxhdGlvbnMsIHN0cmlkZXMpIHtcbiAgICBpZiAoZGlsYXRpb25zID09IG51bGwpIHtcbiAgICAgICAgZGlsYXRpb25zID0gWzEsIDFdO1xuICAgIH1cbiAgICBpZiAoc3RyaWRlcyA9PSBudWxsKSB7XG4gICAgICAgIHN0cmlkZXMgPSAxO1xuICAgIH1cbiAgICBpZiAocGFkID09PSAwKSB7XG4gICAgICAgIHBhZCA9ICd2YWxpZCc7XG4gICAgfVxuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKGlucHV0LCAneCcsICdtYXhQb29sJyk7XG4gICAgbGV0IHg0RCA9ICR4O1xuICAgIGxldCByZXNoYXBlZFRvNEQgPSBmYWxzZTtcbiAgICBpZiAoJHgucmFuayA9PT0gMykge1xuICAgICAgICByZXNoYXBlZFRvNEQgPSB0cnVlO1xuICAgICAgICB4NEQgPSByZXNoYXBlKCR4LCBbMSwgJHguc2hhcGVbMF0sICR4LnNoYXBlWzFdLCAkeC5zaGFwZVsyXV0pO1xuICAgIH1cbiAgICB1dGlsLmFzc2VydChjb252X3V0aWwuZWl0aGVyU3RyaWRlc09yRGlsYXRpb25zQXJlT25lKHN0cmlkZXMsIGRpbGF0aW9ucyksICgpID0+ICdFcnJvciBpbiBwb29sOiBFaXRoZXIgc3RyaWRlcyBvciBkaWxhdGlvbnMgbXVzdCBiZSAxLiAnICtcbiAgICAgICAgYEdvdCBzdHJpZGVzICR7c3RyaWRlc30gYW5kIGRpbGF0aW9ucyAnJHtkaWxhdGlvbnN9J2ApO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gY29udl91dGlsLmNvbXB1dGVQb29sMkRJbmZvKHg0RC5zaGFwZSwgd2luZG93U2hhcGUsIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkKTtcbiAgICBjb25zdCBkaWxhdGlvbiA9IFtjb252SW5mby5kaWxhdGlvbkhlaWdodCwgY29udkluZm8uZGlsYXRpb25XaWR0aF07XG4gICAgLy8gVGhlIGZvbGxvd2luZyBpbXBsZW1lbnRhdGlvbiBkb2VzIGJhdGNoVG9TcGFjZShwb29sKHNwYWNlVG9CYXRjaCh4KSkpXG4gICAgLy8gd2hlbmV2ZXIgZGlsYXRpb24gPiAxIHNpbmNlIHRoZSBURiBrZXJuZWxzIGRvIG5vdCBzdXBwb3J0IGRpbGF0aW9uID4gMS5cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yZmxvdy9ibG9iLzUwZjZiYjY3ZGM5OGM5Yjc0NjMwYjYwNDdhYWU3YTRmOGE0MGZkMDIvdGVuc29yZmxvdy9weXRob24vb3BzL25uX29wcy5weSNMMTAzN1xuICAgIGxldCBiYXNlUGFkZGluZztcbiAgICBpZiAocGFkID09PSAnc2FtZScpIHtcbiAgICAgICAgYmFzZVBhZGRpbmcgPSB3aXRoU3BhY2VUb0JhdGNoQmFzZVBhZGRpbmdzKFtjb252SW5mby5maWx0ZXJIZWlnaHQsIGNvbnZJbmZvLmZpbHRlcldpZHRoXSwgZGlsYXRpb24pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgYmFzZVBhZGRpbmcgPSBbWzAsIDBdLCBbMCwgMF1dO1xuICAgIH1cbiAgICBjb25zdCBpc0RpbGF0aW9uT25lID0gZGlsYXRpb25bMF0gPT09IDEgJiYgZGlsYXRpb25bMV0gPT09IDE7XG4gICAgY29uc3QgW2FkanVzdGVkUGFkZGluZywgYWRqdXN0ZWRDcm9wc10gPSByZXF1aXJlZFNwYWNlVG9CYXRjaFBhZGRpbmdzKFtjb252SW5mby5pbkhlaWdodCwgY29udkluZm8uaW5XaWR0aF0sIGRpbGF0aW9uLCBiYXNlUGFkZGluZyk7XG4gICAgY29uc3QgY29udmVydGVkUGFkID0gaXNEaWxhdGlvbk9uZSA/IHBhZCA6ICd2YWxpZCc7XG4gICAgY29uc3QgY29udmVydGVkWCA9IGlzRGlsYXRpb25PbmUgPyB4NEQgOiBzcGFjZVRvQmF0Y2hORCh4NEQsIGRpbGF0aW9uLCBhZGp1c3RlZFBhZGRpbmcpO1xuICAgIGNvbnN0IGZvcndhcmRPcCA9IHBvb2xpbmdUeXBlID09PSAnYXZnJyA/XG4gICAgICAgICgpID0+IGF2Z1Bvb2woY29udmVydGVkWCwgd2luZG93U2hhcGUsIHN0cmlkZXMsIGNvbnZlcnRlZFBhZCkgOlxuICAgICAgICAoKSA9PiBtYXhQb29sKGNvbnZlcnRlZFgsIHdpbmRvd1NoYXBlLCBzdHJpZGVzLCBjb252ZXJ0ZWRQYWQpO1xuICAgIGNvbnN0IHkgPSBmb3J3YXJkT3AoKTtcbiAgICBjb25zdCByZXMgPSBpc0RpbGF0aW9uT25lID8geSA6IGJhdGNoVG9TcGFjZU5EKHksIGRpbGF0aW9uLCBhZGp1c3RlZENyb3BzKTtcbiAgICBpZiAocmVzaGFwZWRUbzREKSB7XG4gICAgICAgIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbi8vIEhlbHBlciBmdW5jdGlvbiB0byBjb21wdXRlIGNyb3BzIGFuZCBwYWRkaW5ncyBmb3IgcG9vbCB3aXRoIGRpbGF0aW9uID4gMS5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmZsb3cvYmxvYi81MGY2YmI2N2RjOThjOWI3NDYzMGI2MDQ3YWFlN2E0ZjhhNDBmZDAyL3RlbnNvcmZsb3cvcHl0aG9uL29wcy9hcnJheV9vcHMucHkjTDIxODRcbmZ1bmN0aW9uIHJlcXVpcmVkU3BhY2VUb0JhdGNoUGFkZGluZ3MoaW5wdXRTaGFwZSwgYmxvY2tTaGFwZSwgYmFzZVBhZGRpbmcpIHtcbiAgICBjb25zdCBwYWRTdGFydCA9IGJhc2VQYWRkaW5nLm1hcChiID0+IGJbMF0pO1xuICAgIGNvbnN0IG9yaWdQYWRFbmQgPSBiYXNlUGFkZGluZy5tYXAoYiA9PiBiWzFdKTtcbiAgICBjb25zdCBmdWxsSW5wdXRTaGFwZSA9IGlucHV0U2hhcGUuY29uY2F0KHBhZFN0YXJ0LCBvcmlnUGFkRW5kKTtcbiAgICBjb25zdCBwYWRFbmRFeHRyYSA9IGJsb2NrU2hhcGUubWFwKChiLCBpKSA9PiAoYiAtIGZ1bGxJbnB1dFNoYXBlW2ldICUgYikgJSBiKTtcbiAgICBjb25zdCBwYWRFbmQgPSBvcmlnUGFkRW5kLm1hcCgocywgaSkgPT4gcyArIHBhZEVuZEV4dHJhW2ldKTtcbiAgICBjb25zdCBwYWRkaW5ncyA9IGJsb2NrU2hhcGUubWFwKChfLCBpKSA9PiBbcGFkU3RhcnRbaV0sIHBhZEVuZFtpXV0pO1xuICAgIGNvbnN0IGNyb3BzID0gYmxvY2tTaGFwZS5tYXAoKF8sIGkpID0+IFswLCBwYWRFbmRFeHRyYVtpXV0pO1xuICAgIHJldHVybiBbcGFkZGluZ3MsIGNyb3BzXTtcbn1cbi8vIEhlbHBlciBmdW5jdGlvbiB0byBjb21wdXRlIGJhc2UgcGFkZGluZ3MgZm9yIHBvb2wgd2l0aCBkaWxhdGlvbiA+IDEuXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3JmbG93L2Jsb2IvNTBmNmJiNjdkYzk4YzliNzQ2MzBiNjA0N2FhZTdhNGY4YTQwZmQwMi90ZW5zb3JmbG93L3B5dGhvbi9vcHMvbm5fb3BzLnB5I0w1MjRcbmZ1bmN0aW9uIHdpdGhTcGFjZVRvQmF0Y2hCYXNlUGFkZGluZ3MoZmlsdGVyU2hhcGUsIGRpbGF0aW9uKSB7XG4gICAgLy8gU3BhdGlhbCBkaW1lbnNpb25zIG9mIHRoZSBmaWx0ZXJzIGFuZCB0aGUgdXBzYW1wbGVkIGZpbHRlcnMgaW4gd2hpY2ggd2VcbiAgICAvLyBpbnRyb2R1Y2UgKHJhdGUgLSAxKSB6ZXJvcyBiZXR3ZWVuIGNvbnNlY3V0aXZlIGZpbHRlciB2YWx1ZXMuXG4gICAgY29uc3QgZGlsYXRlZEZpbHRlclNoYXBlID0gZmlsdGVyU2hhcGUubWFwKChzLCBpKSA9PiB7XG4gICAgICAgIHJldHVybiBzICsgKHMgLSAxKSAqIChkaWxhdGlvbltpXSAtIDEpO1xuICAgIH0pO1xuICAgIGNvbnN0IHBhZEV4dHJhU2hhcGUgPSBkaWxhdGVkRmlsdGVyU2hhcGUubWFwKHMgPT4gcyAtIDEpO1xuICAgIC8vIFdoZW4gcGFkZGluZyBpcyBvZGQsIHdlIHBhZCBtb3JlIGF0IGVuZCwgZm9sbG93aW5nIHRoZSBzYW1lXG4gICAgLy8gY29udmVudGlvbiBhcyBjb252MmQuXG4gICAgY29uc3QgcGFkRXh0cmFTdGFydCA9IHBhZEV4dHJhU2hhcGUubWFwKHMgPT4gTWF0aC5mbG9vcihzIC8gMikpO1xuICAgIGNvbnN0IHBhZEV4dHJhRW5kID0gcGFkRXh0cmFTaGFwZS5tYXAoKHMsIGkpID0+IHMgLSBwYWRFeHRyYVN0YXJ0W2ldKTtcbiAgICByZXR1cm4gcGFkRXh0cmFTaGFwZS5tYXAoKF8sIGkpID0+IHtcbiAgICAgICAgcmV0dXJuIFtwYWRFeHRyYVN0YXJ0W2ldLCBwYWRFeHRyYUVuZFtpXV07XG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgcG9vbCA9IG9wKHsgcG9vbF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wb29sLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBQb3cgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgbWFrZVR5cGVzTWF0Y2ggfSBmcm9tICcuLi90ZW5zb3JfdXRpbCc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBwb3dlciBvZiBvbmUgYHRmLlRlbnNvcmAgdG8gYW5vdGhlci4gU3VwcG9ydHMgYnJvYWRjYXN0aW5nLlxuICpcbiAqIEdpdmVuIGEgYHRmLlRlbnNvcmAgeCBhbmQgYSBgdGYuVGVuc29yYCB5LCB0aGlzIG9wZXJhdGlvbiBjb21wdXRlcyB4XnkgZm9yXG4gKiBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIGluIHggYW5kIHkuIFRoZSByZXN1bHQncyBkdHlwZSB3aWxsIGJlIHRoZSB1cGNhc3RlZFxuICogdHlwZSBvZiB0aGUgYGJhc2VgIGFuZCBgZXhwYCBkdHlwZXMuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IoW1syLCAzXSwgWzQsIDVdXSlcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IoW1sxLCAyXSwgWzMsIDBdXSkudG9JbnQoKTtcbiAqXG4gKiBhLnBvdyhiKS5wcmludCgpOyAgLy8gb3IgdGYucG93KGEsIGIpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcihbWzEsIDJdLCBbMywgNF1dKVxuICogY29uc3QgYiA9IHRmLnRlbnNvcigyKS50b0ludCgpO1xuICpcbiAqIGEucG93KGIpLnByaW50KCk7ICAvLyBvciB0Zi5wb3coYSwgYilcbiAqIGBgYFxuICogV2UgYWxzbyBleHBvc2UgYHBvd1N0cmljdGAgd2hpY2ggaGFzIHRoZSBzYW1lIHNpZ25hdHVyZSBhcyB0aGlzIG9wIGFuZFxuICogYXNzZXJ0cyB0aGF0IGBiYXNlYCBhbmQgYGV4cGAgYXJlIHRoZSBzYW1lIHNoYXBlIChkb2VzIG5vdCBicm9hZGNhc3QpLlxuICpcbiAqIEBwYXJhbSBiYXNlIFRoZSBiYXNlIGB0Zi5UZW5zb3JgIHRvIHBvdyBlbGVtZW50LXdpc2UuXG4gKiBAcGFyYW0gZXhwIFRoZSBleHBvbmVudCBgdGYuVGVuc29yYCB0byBwb3cgZWxlbWVudC13aXNlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0FyaXRobWV0aWMnfVxuICovXG5mdW5jdGlvbiBwb3dfKGJhc2UsIGV4cCkge1xuICAgIGxldCAkYmFzZSA9IGNvbnZlcnRUb1RlbnNvcihiYXNlLCAnYmFzZScsICdwb3cnKTtcbiAgICBsZXQgJGV4cCA9IGNvbnZlcnRUb1RlbnNvcihleHAsICdleHAnLCAncG93Jyk7XG4gICAgWyRiYXNlLCAkZXhwXSA9IG1ha2VUeXBlc01hdGNoKCRiYXNlLCAkZXhwKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGE6ICRiYXNlLCBiOiAkZXhwIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoUG93LCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IHBvdyA9IG9wKHsgcG93XyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBvdy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgUHJlbHUgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBsZWFreSByZWN0aWZpZWQgbGluZWFyIGVsZW1lbnQtd2lzZSB3aXRoIHBhcmFtZXRyaWMgYWxwaGFzLlxuICpcbiAqIGB4IDwgMCA/IGFscGhhICogeCA6IGYoeCkgPSB4YFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWy0xLCAyLCAtMywgNF0pO1xuICogY29uc3QgYWxwaGEgPSB0Zi5zY2FsYXIoMC4xKTtcbiAqXG4gKiB4LnByZWx1KGFscGhhKS5wcmludCgpOyAgLy8gb3IgdGYucHJlbHUoeCwgYWxwaGEpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gYWxwaGEgU2NhbGluZyBmYWN0b3IgZm9yIG5lZ2F0aXZlIHZhbHVlcy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gcHJlbHVfKHgsIGFscGhhKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAncHJlbHUnKTtcbiAgICBjb25zdCAkYWxwaGEgPSBjb252ZXJ0VG9UZW5zb3IoYWxwaGEsICdhbHBoYScsICdwcmVsdScpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHgsIGFscGhhOiAkYWxwaGEgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChQcmVsdSwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBwcmVsdSA9IG9wKHsgcHJlbHVfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHJlbHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLyoqXG4gKiBQcmludHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGB0Zi5UZW5zb3JgIGluY2x1ZGluZyBpdHMgZGF0YS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgdmVyYm9zZSA9IHRydWU7XG4gKiB0Zi50ZW5zb3IyZChbMSwgMiwgMywgNF0sIFsyLCAyXSkucHJpbnQodmVyYm9zZSk7XG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSB0ZW5zb3IgdG8gYmUgcHJpbnRlZC5cbiAqIEBwYXJhbSB2ZXJib3NlIFdoZXRoZXIgdG8gcHJpbnQgdmVyYm9zZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYCBUZW5zb3JgLFxuICogaW5jbHVkaW5nIGR0eXBlIGFuZCBzaXplLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByaW50KHgsIHZlcmJvc2UgPSBmYWxzZSkge1xuICAgIGNvbnNvbGUubG9nKHgudG9TdHJpbmcodmVyYm9zZSkpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHJpbnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFByb2QgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGNhc3QgfSBmcm9tICcuL2Nhc3QnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBwcm9kdWN0IG9mIGVsZW1lbnRzIGFjcm9zcyBkaW1lbnNpb25zIG9mIGEgYHRmLlRlbnNvcmAuXG4gKlxuICogUmVkdWNlcyB0aGUgaW5wdXQgYWxvbmcgdGhlIGRpbWVuc2lvbnMgZ2l2ZW4gaW4gYGF4ZXNgLiBVbmxlc3MgYGtlZXBEaW1zYFxuICogaXMgdHJ1ZSwgdGhlIHJhbmsgb2YgdGhlIGB0Zi5UZW5zb3JgIGlzIHJlZHVjZWQgYnkgMSBmb3IgZWFjaCBlbnRyeSBpblxuICogYGF4ZXNgLiBJZiBga2VlcERpbXNgIGlzIHRydWUsIHRoZSByZWR1Y2VkIGRpbWVuc2lvbnMgYXJlIHJldGFpbmVkIHdpdGhcbiAqIGxlbmd0aCAxLiBJZiBgYXhlc2AgaGFzIG5vIGVudHJpZXMsIGFsbCBkaW1lbnNpb25zIGFyZSByZWR1Y2VkLCBhbmQgYVxuICogYHRmLlRlbnNvcmAgd2l0aCBhIHNpbmdsZSBlbGVtZW50IGlzIHJldHVybmVkLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqXG4gKiB4LnByb2QoKS5wcmludCgpOyAgLy8gb3IgdGYucHJvZCh4KVxuICogYGBgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IyZChbMSwgMiwgMywgNF0sIFsyLCAyXSk7XG4gKlxuICogY29uc3QgYXhpcyA9IDE7XG4gKiB4LnByb2QoYXhpcykucHJpbnQoKTsgIC8vIG9yIHRmLnByb2QoeCwgYXhpcylcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IgdG8gY29tcHV0ZSB0aGUgcHJvZHVjdCBvdmVyLiBJZiB0aGUgZHR5cGUgaXMgYGJvb2xgXG4gKiAgIGl0IHdpbGwgYmUgY29udmVydGVkIHRvIGBpbnQzMmAgYW5kIHRoZSBvdXRwdXQgZHR5cGUgd2lsbCBiZSBgaW50MzJgLlxuICogQHBhcmFtIGF4aXMgVGhlIGRpbWVuc2lvbihzKSB0byByZWR1Y2UuIEJ5IGRlZmF1bHQgaXQgcmVkdWNlc1xuICogICAgIGFsbCBkaW1lbnNpb25zLlxuICogQHBhcmFtIGtlZXBEaW1zIElmIHRydWUsIHJldGFpbnMgcmVkdWNlZCBkaW1lbnNpb25zIHdpdGggc2l6ZSAxLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1JlZHVjdGlvbid9XG4gKi9cbmZ1bmN0aW9uIHByb2RfKHgsIGF4aXMgPSBudWxsLCBrZWVwRGltcyA9IGZhbHNlKSB7XG4gICAgbGV0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3Byb2QnKTtcbiAgICBpZiAoJHguZHR5cGUgPT09ICdib29sJykge1xuICAgICAgICAvLyBib29sIGlzIG5vdCBhbiBhbGxvd2VkIHR5cGUgZm9yIHRoZSB1bmRlcmx5aW5nIGtlcm5lbC5cbiAgICAgICAgJHggPSBjYXN0KCR4LCAnaW50MzInKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBheGlzLCBrZWVwRGltcyB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFByb2QsIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IHByb2QgPSBvcCh7IHByb2RfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHJvZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgc2l6ZUZyb21TaGFwZSB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENyZWF0ZXMgYSBgdGYuVGVuc29yYCB3aXRoIHZhbHVlcyBzYW1wbGVkIGZyb20gYSByYW5kb20gbnVtYmVyIGdlbmVyYXRvclxuICogZnVuY3Rpb24gZGVmaW5lZCBieSB0aGUgdXNlci5cbiAqXG4gKiBAcGFyYW0gc2hhcGUgQW4gYXJyYXkgb2YgaW50ZWdlcnMgZGVmaW5pbmcgdGhlIG91dHB1dCB0ZW5zb3Igc2hhcGUuXG4gKiBAcGFyYW0gcmFuZEZ1bmN0aW9uIEEgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkXG4gKiBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSBvdXRwdXQgdGVuc29yLlxuICogQHBhcmFtIGR0eXBlIFRoZSBkYXRhIHR5cGUgb2YgdGhlIG91dHB1dCB0ZW5zb3IuIERlZmF1bHRzIHRvICdmbG9hdDMyJy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdSYW5kb20nfVxuICovXG5mdW5jdGlvbiByYW5kXyhzaGFwZSwgcmFuZEZ1bmN0aW9uLCBkdHlwZSkge1xuICAgIGNvbnN0IHNpemUgPSBzaXplRnJvbVNoYXBlKHNoYXBlKTtcbiAgICBsZXQgdmFsdWVzID0gbnVsbDtcbiAgICBpZiAoZHR5cGUgPT0gbnVsbCB8fCBkdHlwZSA9PT0gJ2Zsb2F0MzInKSB7XG4gICAgICAgIHZhbHVlcyA9IG5ldyBGbG9hdDMyQXJyYXkoc2l6ZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGR0eXBlID09PSAnaW50MzInKSB7XG4gICAgICAgIHZhbHVlcyA9IG5ldyBJbnQzMkFycmF5KHNpemUpO1xuICAgIH1cbiAgICBlbHNlIGlmIChkdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgICAgIHZhbHVlcyA9IG5ldyBVaW50OEFycmF5KHNpemUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGRhdGEgdHlwZSAke2R0eXBlfWApO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICB2YWx1ZXNbaV0gPSByYW5kRnVuY3Rpb24oKTtcbiAgICB9XG4gICAgcmV0dXJuIEVOR0lORS5tYWtlVGVuc29yKHZhbHVlcywgc2hhcGUsIGR0eXBlKTtcbn1cbmV4cG9ydCBjb25zdCByYW5kID0gb3AoeyByYW5kXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJhbmQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0ICogYXMgc2VlZHJhbmRvbSBmcm9tICdzZWVkcmFuZG9tJztcbmltcG9ydCB7IGV4cGVjdE51bWJlcnNDbG9zZSwgdGVzdEVwc2lsb24gfSBmcm9tICcuLi90ZXN0X3V0aWwnO1xuLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTWFyc2FnbGlhX3BvbGFyX21ldGhvZFxuZXhwb3J0IGNsYXNzIE1QUmFuZEdhdXNzIHtcbiAgICBjb25zdHJ1Y3RvcihtZWFuLCBzdGREZXZpYXRpb24sIGR0eXBlLCB0cnVuY2F0ZWQsIHNlZWQpIHtcbiAgICAgICAgdGhpcy5tZWFuID0gbWVhbjtcbiAgICAgICAgdGhpcy5zdGREZXYgPSBzdGREZXZpYXRpb247XG4gICAgICAgIHRoaXMuZHR5cGUgPSBkdHlwZTtcbiAgICAgICAgdGhpcy5uZXh0VmFsID0gTmFOO1xuICAgICAgICB0aGlzLnRydW5jYXRlZCA9IHRydW5jYXRlZDtcbiAgICAgICAgaWYgKHRoaXMudHJ1bmNhdGVkKSB7XG4gICAgICAgICAgICB0aGlzLnVwcGVyID0gdGhpcy5tZWFuICsgdGhpcy5zdGREZXYgKiAyO1xuICAgICAgICAgICAgdGhpcy5sb3dlciA9IHRoaXMubWVhbiAtIHRoaXMuc3RkRGV2ICogMjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZWVkVmFsdWUgPSBzZWVkID8gc2VlZCA6IE1hdGgucmFuZG9tKCk7XG4gICAgICAgIHRoaXMucmFuZG9tID0gc2VlZHJhbmRvbS5hbGVhKHNlZWRWYWx1ZS50b1N0cmluZygpKTtcbiAgICB9XG4gICAgLyoqIFJldHVybnMgbmV4dCBzYW1wbGUgZnJvbSBhIEdhdXNzaWFuIGRpc3RyaWJ1dGlvbi4gKi9cbiAgICBuZXh0VmFsdWUoKSB7XG4gICAgICAgIGlmICghaXNOYU4odGhpcy5uZXh0VmFsKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLm5leHRWYWw7XG4gICAgICAgICAgICB0aGlzLm5leHRWYWwgPSBOYU47XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlc3VsdFgsIHJlc3VsdFk7XG4gICAgICAgIGxldCBpc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgIHdoaWxlICghaXNWYWxpZCkge1xuICAgICAgICAgICAgbGV0IHYxLCB2MiwgcztcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICB2MSA9IDIgKiB0aGlzLnJhbmRvbSgpIC0gMTtcbiAgICAgICAgICAgICAgICB2MiA9IDIgKiB0aGlzLnJhbmRvbSgpIC0gMTtcbiAgICAgICAgICAgICAgICBzID0gdjEgKiB2MSArIHYyICogdjI7XG4gICAgICAgICAgICB9IHdoaWxlIChzID49IDEgfHwgcyA9PT0gMCk7XG4gICAgICAgICAgICBjb25zdCBtdWwgPSBNYXRoLnNxcnQoLTIuMCAqIE1hdGgubG9nKHMpIC8gcyk7XG4gICAgICAgICAgICByZXN1bHRYID0gdGhpcy5tZWFuICsgdGhpcy5zdGREZXYgKiB2MSAqIG11bDtcbiAgICAgICAgICAgIHJlc3VsdFkgPSB0aGlzLm1lYW4gKyB0aGlzLnN0ZERldiAqIHYyICogbXVsO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnRydW5jYXRlZCB8fCB0aGlzLmlzVmFsaWRUcnVuY2F0ZWQocmVzdWx0WCkpIHtcbiAgICAgICAgICAgICAgICBpc1ZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMudHJ1bmNhdGVkIHx8IHRoaXMuaXNWYWxpZFRydW5jYXRlZChyZXN1bHRZKSkge1xuICAgICAgICAgICAgdGhpcy5uZXh0VmFsID0gdGhpcy5jb252ZXJ0VmFsdWUocmVzdWx0WSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydFZhbHVlKHJlc3VsdFgpO1xuICAgIH1cbiAgICAvKiogSGFuZGxlcyBwcm9wZXIgcm91bmRpbmcgZm9yIG5vbi1mbG9hdGluZy1wb2ludCBudW1iZXJzLiAqL1xuICAgIGNvbnZlcnRWYWx1ZSh2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5kdHlwZSA9PSBudWxsIHx8IHRoaXMuZHR5cGUgPT09ICdmbG9hdDMyJykge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlKTtcbiAgICB9XG4gICAgLyoqIFJldHVybnMgdHJ1ZSBpZiBsZXNzIHRoYW4gMi1zdGFuZGFyZC1kZXZpYXRpb25zIGZyb20gdGhlIG1lYW4uICovXG4gICAgaXNWYWxpZFRydW5jYXRlZCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPD0gdGhpcy51cHBlciAmJiB2YWx1ZSA+PSB0aGlzLmxvd2VyO1xuICAgIH1cbn1cbi8vIE1hcnNhZ2xpYSwgR2VvcmdlLCBhbmQgV2FpIFdhbiBUc2FuZy4gMjAwMC4gXCJBIFNpbXBsZSBNZXRob2QgZm9yIEdlbmVyYXRpbmdcbi8vIEdhbW1hIFZhcmlhYmxlcy5cIlxuZXhwb3J0IGNsYXNzIFJhbmRHYW1tYSB7XG4gICAgY29uc3RydWN0b3IoYWxwaGEsIGJldGEsIGR0eXBlLCBzZWVkKSB7XG4gICAgICAgIHRoaXMuYWxwaGEgPSBhbHBoYTtcbiAgICAgICAgdGhpcy5iZXRhID0gMSAvIGJldGE7IC8vIGNvbnZlcnQgcmF0ZSB0byBzY2FsZSBwYXJhbWV0ZXJcbiAgICAgICAgdGhpcy5kdHlwZSA9IGR0eXBlO1xuICAgICAgICBjb25zdCBzZWVkVmFsdWUgPSBzZWVkID8gc2VlZCA6IE1hdGgucmFuZG9tKCk7XG4gICAgICAgIHRoaXMucmFuZHUgPSBzZWVkcmFuZG9tLmFsZWEoc2VlZFZhbHVlLnRvU3RyaW5nKCkpO1xuICAgICAgICB0aGlzLnJhbmRuID0gbmV3IE1QUmFuZEdhdXNzKDAsIDEsIGR0eXBlLCBmYWxzZSwgdGhpcy5yYW5kdSgpKTtcbiAgICAgICAgaWYgKGFscGhhIDwgMSkge1xuICAgICAgICAgICAgdGhpcy5kID0gYWxwaGEgKyAoMiAvIDMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kID0gYWxwaGEgLSAoMSAvIDMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYyA9IDEgLyBNYXRoLnNxcnQoOSAqIHRoaXMuZCk7XG4gICAgfVxuICAgIC8qKiBSZXR1cm5zIG5leHQgc2FtcGxlIGZyb20gYSBnYW1tYSBkaXN0cmlidXRpb24uICovXG4gICAgbmV4dFZhbHVlKCkge1xuICAgICAgICBsZXQgeDIsIHYwLCB2MSwgeCwgdSwgdjtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICB4ID0gdGhpcy5yYW5kbi5uZXh0VmFsdWUoKTtcbiAgICAgICAgICAgICAgICB2ID0gMSArICh0aGlzLmMgKiB4KTtcbiAgICAgICAgICAgIH0gd2hpbGUgKHYgPD0gMCk7XG4gICAgICAgICAgICB2ICo9IHYgKiB2O1xuICAgICAgICAgICAgeDIgPSB4ICogeDtcbiAgICAgICAgICAgIHYwID0gMSAtICgwLjMzMSAqIHgyICogeDIpO1xuICAgICAgICAgICAgdjEgPSAoMC41ICogeDIpICsgKHRoaXMuZCAqICgxIC0gdiArIE1hdGgubG9nKHYpKSk7XG4gICAgICAgICAgICB1ID0gdGhpcy5yYW5kdSgpO1xuICAgICAgICAgICAgaWYgKHUgPCB2MCB8fCBNYXRoLmxvZyh1KSA8IHYxKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdiA9ICgxIC8gdGhpcy5iZXRhKSAqIHRoaXMuZCAqIHY7XG4gICAgICAgIGlmICh0aGlzLmFscGhhIDwgMSkge1xuICAgICAgICAgICAgdiAqPSBNYXRoLnBvdyh0aGlzLnJhbmR1KCksIDEgLyB0aGlzLmFscGhhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0VmFsdWUodik7XG4gICAgfVxuICAgIC8qKiBIYW5kbGVzIHByb3BlciByb3VuZGluZyBmb3Igbm9uLWZsb2F0aW5nLXBvaW50IG51bWJlcnMuICovXG4gICAgY29udmVydFZhbHVlKHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLmR0eXBlID09PSAnZmxvYXQzMicpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCh2YWx1ZSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIFVuaWZvcm1SYW5kb20ge1xuICAgIGNvbnN0cnVjdG9yKG1pbiA9IDAsIG1heCA9IDEsIGR0eXBlLCBzZWVkKSB7XG4gICAgICAgIC8qKiBIYW5kbGVzIHByb3BlciByb3VuZGluZyBmb3Igbm9uIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuICovXG4gICAgICAgIHRoaXMuY2FuUmV0dXJuRmxvYXQgPSAoKSA9PiAodGhpcy5kdHlwZSA9PSBudWxsIHx8IHRoaXMuZHR5cGUgPT09ICdmbG9hdDMyJyk7XG4gICAgICAgIHRoaXMubWluID0gbWluO1xuICAgICAgICB0aGlzLnJhbmdlID0gbWF4IC0gbWluO1xuICAgICAgICB0aGlzLmR0eXBlID0gZHR5cGU7XG4gICAgICAgIGlmIChzZWVkID09IG51bGwpIHtcbiAgICAgICAgICAgIHNlZWQgPSBNYXRoLnJhbmRvbSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2VlZCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHNlZWQgPSBzZWVkLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmNhblJldHVybkZsb2F0KCkgJiYgdGhpcy5yYW5nZSA8PSAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gJHttaW59IC0gJHttYXh9IDw9IDEgYW5kIGR0eXBlIGlzIG5vdCBmbG9hdGApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmFuZG9tID0gc2VlZHJhbmRvbS5hbGVhKHNlZWQpO1xuICAgIH1cbiAgICBjb252ZXJ0VmFsdWUodmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuY2FuUmV0dXJuRmxvYXQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlKTtcbiAgICB9XG4gICAgbmV4dFZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0VmFsdWUodGhpcy5taW4gKyB0aGlzLnJhbmdlICogdGhpcy5yYW5kb20oKSk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGphcnF1ZUJlcmFOb3JtYWxpdHlUZXN0KHZhbHVlcykge1xuICAgIC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0phcnF1ZSVFMiU4MCU5M0JlcmFfdGVzdFxuICAgIGNvbnN0IG4gPSB2YWx1ZXMubGVuZ3RoO1xuICAgIGNvbnN0IHMgPSBza2V3bmVzcyh2YWx1ZXMpO1xuICAgIGNvbnN0IGsgPSBrdXJ0b3Npcyh2YWx1ZXMpO1xuICAgIGNvbnN0IGpiID0gbiAvIDYgKiAoTWF0aC5wb3cocywgMikgKyAwLjI1ICogTWF0aC5wb3coayAtIDMsIDIpKTtcbiAgICAvLyBKQiB0ZXN0IHJlcXVpcmVzIDItZGVncmVzcyBvZiBmcmVlZG9tIGZyb20gQ2hpLVNxdWFyZSBAIDAuOTU6XG4gICAgLy8gaHR0cDovL3d3dy5pdGwubmlzdC5nb3YvZGl2ODk4L2hhbmRib29rL2VkYS9zZWN0aW9uMy9lZGEzNjc0Lmh0bVxuICAgIGNvbnN0IENISV9TUVVBUkVfMkRFRyA9IDUuOTkxO1xuICAgIGlmIChqYiA+IENISV9TUVVBUkVfMkRFRykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcC12YWx1ZSBmb3IgSkI6ICR7amJ9YCk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGV4cGVjdEFycmF5SW5NZWFuU3RkUmFuZ2UoYWN0dWFsLCBleHBlY3RlZE1lYW4sIGV4cGVjdGVkU3RkRGV2LCBlcHNpbG9uKSB7XG4gICAgaWYgKGVwc2lsb24gPT0gbnVsbCkge1xuICAgICAgICBlcHNpbG9uID0gdGVzdEVwc2lsb24oKTtcbiAgICB9XG4gICAgY29uc3QgYWN0dWFsTWVhbiA9IG1lYW4oYWN0dWFsKTtcbiAgICBleHBlY3ROdW1iZXJzQ2xvc2UoYWN0dWFsTWVhbiwgZXhwZWN0ZWRNZWFuLCBlcHNpbG9uKTtcbiAgICBleHBlY3ROdW1iZXJzQ2xvc2Uoc3RhbmRhcmREZXZpYXRpb24oYWN0dWFsLCBhY3R1YWxNZWFuKSwgZXhwZWN0ZWRTdGREZXYsIGVwc2lsb24pO1xufVxuZnVuY3Rpb24gbWVhbih2YWx1ZXMpIHtcbiAgICBsZXQgc3VtID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBzdW0gKz0gdmFsdWVzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gc3VtIC8gdmFsdWVzLmxlbmd0aDtcbn1cbmZ1bmN0aW9uIHN0YW5kYXJkRGV2aWF0aW9uKHZhbHVlcywgbWVhbikge1xuICAgIGxldCBzcXVhcmVEaWZmU3VtID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBkaWZmID0gdmFsdWVzW2ldIC0gbWVhbjtcbiAgICAgICAgc3F1YXJlRGlmZlN1bSArPSBkaWZmICogZGlmZjtcbiAgICB9XG4gICAgcmV0dXJuIE1hdGguc3FydChzcXVhcmVEaWZmU3VtIC8gdmFsdWVzLmxlbmd0aCk7XG59XG5mdW5jdGlvbiBrdXJ0b3Npcyh2YWx1ZXMpIHtcbiAgICAvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9LdXJ0b3Npc1xuICAgIGNvbnN0IHZhbHVlc01lYW4gPSBtZWFuKHZhbHVlcyk7XG4gICAgY29uc3QgbiA9IHZhbHVlcy5sZW5ndGg7XG4gICAgbGV0IHN1bTIgPSAwO1xuICAgIGxldCBzdW00ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICBjb25zdCB2ID0gdmFsdWVzW2ldIC0gdmFsdWVzTWVhbjtcbiAgICAgICAgc3VtMiArPSBNYXRoLnBvdyh2LCAyKTtcbiAgICAgICAgc3VtNCArPSBNYXRoLnBvdyh2LCA0KTtcbiAgICB9XG4gICAgcmV0dXJuICgxIC8gbikgKiBzdW00IC8gTWF0aC5wb3coKDEgLyBuKSAqIHN1bTIsIDIpO1xufVxuZnVuY3Rpb24gc2tld25lc3ModmFsdWVzKSB7XG4gICAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU2tld25lc3NcbiAgICBjb25zdCB2YWx1ZXNNZWFuID0gbWVhbih2YWx1ZXMpO1xuICAgIGNvbnN0IG4gPSB2YWx1ZXMubGVuZ3RoO1xuICAgIGxldCBzdW0yID0gMDtcbiAgICBsZXQgc3VtMyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgY29uc3QgdiA9IHZhbHVlc1tpXSAtIHZhbHVlc01lYW47XG4gICAgICAgIHN1bTIgKz0gTWF0aC5wb3codiwgMik7XG4gICAgICAgIHN1bTMgKz0gTWF0aC5wb3codiwgMyk7XG4gICAgfVxuICAgIHJldHVybiAoMSAvIG4pICogc3VtMyAvIE1hdGgucG93KCgxIC8gKG4gLSAxKSkgKiBzdW0yLCAzIC8gMik7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yYW5kX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYnVmZmVyIH0gZnJvbSAnLi9idWZmZXInO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyBSYW5kR2FtbWEgfSBmcm9tICcuL3JhbmRfdXRpbCc7XG4vKipcbiAqIENyZWF0ZXMgYSBgdGYuVGVuc29yYCB3aXRoIHZhbHVlcyBzYW1wbGVkIGZyb20gYSBnYW1tYSBkaXN0cmlidXRpb24uXG4gKlxuICogYGBganNcbiAqIHRmLnJhbmRvbUdhbW1hKFsyLCAyXSwgMSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBzaGFwZSBBbiBhcnJheSBvZiBpbnRlZ2VycyBkZWZpbmluZyB0aGUgb3V0cHV0IHRlbnNvciBzaGFwZS5cbiAqIEBwYXJhbSBhbHBoYSBUaGUgc2hhcGUgcGFyYW1ldGVyIG9mIHRoZSBnYW1tYSBkaXN0cmlidXRpb24uXG4gKiBAcGFyYW0gYmV0YSBUaGUgaW52ZXJzZSBzY2FsZSBwYXJhbWV0ZXIgb2YgdGhlIGdhbW1hIGRpc3RyaWJ1dGlvbi4gRGVmYXVsdHNcbiAqICAgICB0byAxLlxuICogQHBhcmFtIGR0eXBlIFRoZSBkYXRhIHR5cGUgb2YgdGhlIG91dHB1dC4gRGVmYXVsdHMgdG8gZmxvYXQzMi5cbiAqIEBwYXJhbSBzZWVkIFRoZSBzZWVkIGZvciB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnUmFuZG9tJ31cbiAqL1xuZnVuY3Rpb24gcmFuZG9tR2FtbWFfKHNoYXBlLCBhbHBoYSwgYmV0YSA9IDEsIGR0eXBlID0gJ2Zsb2F0MzInLCBzZWVkKSB7XG4gICAgaWYgKGJldGEgPT0gbnVsbCkge1xuICAgICAgICBiZXRhID0gMTtcbiAgICB9XG4gICAgaWYgKGR0eXBlID09IG51bGwpIHtcbiAgICAgICAgZHR5cGUgPSAnZmxvYXQzMic7XG4gICAgfVxuICAgIGlmIChkdHlwZSAhPT0gJ2Zsb2F0MzInICYmIGR0eXBlICE9PSAnaW50MzInKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgZGF0YSB0eXBlICR7ZHR5cGV9YCk7XG4gICAgfVxuICAgIGNvbnN0IHJnYW1tYSA9IG5ldyBSYW5kR2FtbWEoYWxwaGEsIGJldGEsIGR0eXBlLCBzZWVkKTtcbiAgICBjb25zdCByZXMgPSBidWZmZXIoc2hhcGUsIGR0eXBlKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlcy52YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzLnZhbHVlc1tpXSA9IHJnYW1tYS5uZXh0VmFsdWUoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy50b1RlbnNvcigpO1xufVxuZXhwb3J0IGNvbnN0IHJhbmRvbUdhbW1hID0gb3AoeyByYW5kb21HYW1tYV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yYW5kb21fZ2FtbWEuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYnVmZmVyIH0gZnJvbSAnLi9idWZmZXInO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyBNUFJhbmRHYXVzcyB9IGZyb20gJy4vcmFuZF91dGlsJztcbi8qKlxuICogQ3JlYXRlcyBhIGB0Zi5UZW5zb3JgIHdpdGggdmFsdWVzIHNhbXBsZWQgZnJvbSBhIG5vcm1hbCBkaXN0cmlidXRpb24uXG4gKlxuICogYGBganNcbiAqIHRmLnJhbmRvbU5vcm1hbChbMiwgMl0pLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gc2hhcGUgQW4gYXJyYXkgb2YgaW50ZWdlcnMgZGVmaW5pbmcgdGhlIG91dHB1dCB0ZW5zb3Igc2hhcGUuXG4gKiBAcGFyYW0gbWVhbiBUaGUgbWVhbiBvZiB0aGUgbm9ybWFsIGRpc3RyaWJ1dGlvbi5cbiAqIEBwYXJhbSBzdGREZXYgVGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgbm9ybWFsIGRpc3RyaWJ1dGlvbi5cbiAqIEBwYXJhbSBkdHlwZSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBvdXRwdXQuXG4gKiBAcGFyYW0gc2VlZCBUaGUgc2VlZCBmb3IgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1JhbmRvbSd9XG4gKi9cbmZ1bmN0aW9uIHJhbmRvbU5vcm1hbF8oc2hhcGUsIG1lYW4gPSAwLCBzdGREZXYgPSAxLCBkdHlwZSwgc2VlZCkge1xuICAgIGlmIChkdHlwZSAhPSBudWxsICYmIGR0eXBlID09PSAnYm9vbCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBkYXRhIHR5cGUgJHtkdHlwZX1gKTtcbiAgICB9XG4gICAgY29uc3QgcmFuZEdhdXNzID0gbmV3IE1QUmFuZEdhdXNzKG1lYW4sIHN0ZERldiwgZHR5cGUsIGZhbHNlIC8qIHRydW5jYXRlZCAqLywgc2VlZCk7XG4gICAgY29uc3QgcmVzID0gYnVmZmVyKHNoYXBlLCBkdHlwZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXMudmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlcy52YWx1ZXNbaV0gPSByYW5kR2F1c3MubmV4dFZhbHVlKCk7XG4gICAgfVxuICAgIHJldHVybiByZXMudG9UZW5zb3IoKTtcbn1cbmV4cG9ydCBjb25zdCByYW5kb21Ob3JtYWwgPSBvcCh7IHJhbmRvbU5vcm1hbF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yYW5kb21fbm9ybWFsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJ1ZmZlciB9IGZyb20gJy4vYnVmZmVyJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgVW5pZm9ybVJhbmRvbSB9IGZyb20gJy4vcmFuZF91dGlsJztcbi8qKlxuICogQ3JlYXRlcyBhIGB0Zi5UZW5zb3JgIHdpdGggdmFsdWVzIHNhbXBsZWQgZnJvbSBhIHVuaWZvcm0gZGlzdHJpYnV0aW9uLlxuICpcbiAqIFRoZSBnZW5lcmF0ZWQgdmFsdWVzIGZvbGxvdyBhIHVuaWZvcm0gZGlzdHJpYnV0aW9uIGluIHRoZSByYW5nZSBbbWludmFsLFxuICogbWF4dmFsKS4gVGhlIGxvd2VyIGJvdW5kIG1pbnZhbCBpcyBpbmNsdWRlZCBpbiB0aGUgcmFuZ2UsIHdoaWxlIHRoZSB1cHBlclxuICogYm91bmQgbWF4dmFsIGlzIGV4Y2x1ZGVkLlxuICpcbiAqIGBgYGpzXG4gKiB0Zi5yYW5kb21Vbmlmb3JtKFsyLCAyXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBzaGFwZSBBbiBhcnJheSBvZiBpbnRlZ2VycyBkZWZpbmluZyB0aGUgb3V0cHV0IHRlbnNvciBzaGFwZS5cbiAqIEBwYXJhbSBtaW52YWwgVGhlIGxvd2VyIGJvdW5kIG9uIHRoZSByYW5nZSBvZiByYW5kb20gdmFsdWVzIHRvIGdlbmVyYXRlLlxuICogICBEZWZhdWx0cyB0byAwLlxuICogQHBhcmFtIG1heHZhbCBUaGUgdXBwZXIgYm91bmQgb24gdGhlIHJhbmdlIG9mIHJhbmRvbSB2YWx1ZXMgdG8gZ2VuZXJhdGUuXG4gKiAgIERlZmF1bHRzIHRvIDEuXG4gKiBAcGFyYW0gZHR5cGUgVGhlIGRhdGEgdHlwZSBvZiB0aGUgb3V0cHV0IHRlbnNvci4gRGVmYXVsdHMgdG8gJ2Zsb2F0MzInLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1JhbmRvbSd9XG4gKi9cbmZ1bmN0aW9uIHJhbmRvbVVuaWZvcm1fKHNoYXBlLCBtaW52YWwgPSAwLCBtYXh2YWwgPSAxLCBkdHlwZSA9ICdmbG9hdDMyJywgc2VlZCkge1xuICAgIGNvbnN0IHJlcyA9IGJ1ZmZlcihzaGFwZSwgZHR5cGUpO1xuICAgIGNvbnN0IHJhbmRvbSA9IG5ldyBVbmlmb3JtUmFuZG9tKG1pbnZhbCwgbWF4dmFsLCBudWxsLCBzZWVkKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlcy52YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzLnZhbHVlc1tpXSA9IHJhbmRvbS5uZXh0VmFsdWUoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy50b1RlbnNvcigpO1xufVxuZXhwb3J0IGNvbnN0IHJhbmRvbVVuaWZvcm0gPSBvcCh7IHJhbmRvbVVuaWZvcm1fIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmFuZG9tX3VuaWZvcm0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFJhbmdlIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBgdGYuVGVuc29yMURgIGZpbGxlZCB3aXRoIHRoZSBudW1iZXJzIGluIHRoZSByYW5nZSBwcm92aWRlZC5cbiAqXG4gKiBUaGUgdGVuc29yIGlzIGEgaXMgaGFsZi1vcGVuIGludGVydmFsIG1lYW5pbmcgaXQgaW5jbHVkZXMgc3RhcnQsIGJ1dFxuICogZXhjbHVkZXMgc3RvcC4gRGVjcmVtZW50aW5nIHJhbmdlcyBhbmQgbmVnYXRpdmUgc3RlcCB2YWx1ZXMgYXJlIGFsc29cbiAqIHN1cHBvcnRlZC5zdlxuICpcbiAqXG4gKiBgYGBqc1xuICogdGYucmFuZ2UoMCwgOSwgMikucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBzdGFydCBBbiBpbnRlZ2VyIHN0YXJ0IHZhbHVlXG4gKiBAcGFyYW0gc3RvcCBBbiBpbnRlZ2VyIHN0b3AgdmFsdWVcbiAqIEBwYXJhbSBzdGVwIEFuIGludGVnZXIgaW5jcmVtZW50ICh3aWxsIGRlZmF1bHQgdG8gMSBvciAtMSlcbiAqIEBwYXJhbSBkdHlwZSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBvdXRwdXQgdGVuc29yLiBEZWZhdWx0cyB0byAnZmxvYXQzMicuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmFuZ2Uoc3RhcnQsIHN0b3AsIHN0ZXAgPSAxLCBkdHlwZSA9ICdmbG9hdDMyJykge1xuICAgIGlmIChzdGVwID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGhhdmUgYSBzdGVwIG9mIHplcm8nKTtcbiAgICB9XG4gICAgY29uc3QgYXR0cnMgPSB7IHN0YXJ0LCBzdG9wLCBzdGVwLCBkdHlwZSB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFJhbmdlLCB7fSAvKiBpbnB1dHMgKi8sIGF0dHJzKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJhbmdlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBSZWFsIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV0dXJucyB0aGUgcmVhbCBwYXJ0IG9mIGEgY29tcGxleCAob3IgcmVhbCkgdGVuc29yLlxuICpcbiAqIEdpdmVuIGEgdGVuc29yIGlucHV0LCB0aGlzIG9wZXJhdGlvbiByZXR1cm5zIGEgdGVuc29yIG9mIHR5cGUgZmxvYXQgdGhhdCBpc1xuICogdGhlIHJlYWwgcGFydCBvZiBlYWNoIGVsZW1lbnQgaW4gaW5wdXQgY29uc2lkZXJlZCBhcyBhIGNvbXBsZXggbnVtYmVyLlxuICpcbiAqIElmIHRoZSBpbnB1dCBpcyByZWFsLCBpdCBzaW1wbHkgbWFrZXMgYSBjbG9uZS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLmNvbXBsZXgoWy0yLjI1LCAzLjI1XSwgWzQuNzUsIDUuNzVdKTtcbiAqIHRmLnJlYWwoeCkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZnVuY3Rpb24gcmVhbF8oaW5wdXQpIHtcbiAgICBjb25zdCAkaW5wdXQgPSBjb252ZXJ0VG9UZW5zb3IoaW5wdXQsICdpbnB1dCcsICdyZWFsJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyBpbnB1dDogJGlucHV0IH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoUmVhbCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCByZWFsID0gb3AoeyByZWFsXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlYWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFJlY2lwcm9jYWwgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyByZWNpcHJvY2FsIG9mIHggZWxlbWVudC13aXNlOiBgMSAvIHhgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMCwgMSwgMl0pO1xuICpcbiAqIHgucmVjaXByb2NhbCgpLnByaW50KCk7ICAvLyBvciB0Zi5yZWNpcHJvY2FsKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIHJlY2lwcm9jYWxfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdyZWNpcHJvY2FsJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFJlY2lwcm9jYWwsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgcmVjaXByb2NhbCA9IG9wKHsgcmVjaXByb2NhbF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWNpcHJvY2FsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qKlxuICogSW5wdXRzIG9mIHNpemUgYWJvdmUgdGhpcyB0aHJlc2hvbGQgd2lsbCBiZSBwYXJhbGxlbGl6ZWQgYnkgY2FsbGluZyBtdWx0aXBsZVxuICogc2hhZGVyIHByb2dyYW1zLlxuICovXG5pbXBvcnQgeyBuZWFyZXN0RGl2aXNvciB9IGZyb20gJy4uL3V0aWwnO1xuZXhwb3J0IGNvbnN0IFBBUkFMTEVMSVpFX1RIUkVTSE9MRCA9IDMwO1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVPcHRpbWFsV2luZG93U2l6ZShpblNpemUpIHtcbiAgICBpZiAoaW5TaXplIDw9IFBBUkFMTEVMSVpFX1RIUkVTSE9MRCkge1xuICAgICAgICByZXR1cm4gaW5TaXplO1xuICAgIH1cbiAgICByZXR1cm4gbmVhcmVzdERpdmlzb3IoaW5TaXplLCBNYXRoLmZsb29yKE1hdGguc3FydChpblNpemUpKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWR1Y2VfdXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgUmVsdSB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIHJlY3RpZmllZCBsaW5lYXIgZWxlbWVudC13aXNlOiBgbWF4KHgsIDApYC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFstMSwgMiwgLTMsIDRdKTtcbiAqXG4gKiB4LnJlbHUoKS5wcmludCgpOyAgLy8gb3IgdGYucmVsdSh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLiBJZiB0aGUgZHR5cGUgaXMgYGJvb2xgLCB0aGUgb3V0cHV0IGR0eXBlIHdpbGwgYmVcbiAqICAgICBgaW50MzInLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiByZWx1Xyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAncmVsdScpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChSZWx1LCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IHJlbHUgPSBvcCh7IHJlbHVfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVsdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgUmVsdTYgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyByZWN0aWZpZWQgbGluZWFyIDYgZWxlbWVudC13aXNlOiBgbWluKG1heCh4LCAwKSwgNilgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWy0xLCAyLCAtMywgOF0pO1xuICpcbiAqIHgucmVsdTYoKS5wcmludCgpOyAgLy8gb3IgdGYucmVsdTYoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci4gSWYgdGhlIGR0eXBlIGlzIGBib29sYCwgdGhlIG91dHB1dCBkdHlwZSB3aWxsIGJlXG4gKiAgICAgYGludDMyJy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gcmVsdTZfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdyZWx1NicpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChSZWx1NiwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCByZWx1NiA9IG9wKHsgcmVsdTZfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVsdTYuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFJlc2hhcGUgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBSZXNoYXBlcyBhIGB0Zi5UZW5zb3JgIHRvIGEgZ2l2ZW4gc2hhcGUuXG4gKlxuICogR2l2ZW4gYW4gaW5wdXQgdGVuc29yLCByZXR1cm5zIGEgbmV3IHRlbnNvciB3aXRoIHRoZSBzYW1lIHZhbHVlcyBhcyB0aGVcbiAqIGlucHV0IHRlbnNvciB3aXRoIHNoYXBlIGBzaGFwZWAuXG4gKlxuICogSWYgb25lIGNvbXBvbmVudCBvZiBzaGFwZSBpcyB0aGUgc3BlY2lhbCB2YWx1ZSAtMSwgdGhlIHNpemUgb2YgdGhhdFxuICogZGltZW5zaW9uIGlzIGNvbXB1dGVkIHNvIHRoYXQgdGhlIHRvdGFsIHNpemUgcmVtYWlucyBjb25zdGFudC4gSW5cbiAqIHBhcnRpY3VsYXIsIGEgc2hhcGUgb2YgWy0xXSBmbGF0dGVucyBpbnRvIDEtRC4gQXQgbW9zdCBvbmUgY29tcG9uZW50IG9mXG4gKiBzaGFwZSBjYW4gYmUgLTEuXG4gKlxuICogSWYgc2hhcGUgaXMgMS1EIG9yIGhpZ2hlciwgdGhlbiB0aGUgb3BlcmF0aW9uIHJldHVybnMgYSB0ZW5zb3Igd2l0aCBzaGFwZVxuICogc2hhcGUgZmlsbGVkIHdpdGggdGhlIHZhbHVlcyBvZiB0ZW5zb3IuIEluIHRoaXMgY2FzZSwgdGhlIG51bWJlciBvZlxuICogZWxlbWVudHMgaW1wbGllZCBieSBzaGFwZSBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW5cbiAqIHRlbnNvci5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzLCA0XSk7XG4gKiB4LnJlc2hhcGUoWzIsIDJdKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciB0byBiZSByZXNoYXBlZC5cbiAqIEBwYXJhbSBzaGFwZSBBbiBhcnJheSBvZiBpbnRlZ2VycyBkZWZpbmluZyB0aGUgb3V0cHV0IHRlbnNvciBzaGFwZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdUcmFuc2Zvcm1hdGlvbnMnfVxuICovXG5mdW5jdGlvbiByZXNoYXBlXyh4LCBzaGFwZSkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3Jlc2hhcGUnLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgY29uc3QgYXR0cnMgPSB7IHNoYXBlIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoUmVzaGFwZSwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgcmVzaGFwZSA9IG9wKHsgcmVzaGFwZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZXNoYXBlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBSZXZlcnNlIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV2ZXJzZXMgYSBgdGYuVGVuc29yYCBhbG9uZyBhIHNwZWNpZmllZCBheGlzLlxuICpcbiAqIEFsc28gYXZhaWxhYmxlIGFyZSBzdHJpY3RlciByYW5rLXNwZWNpZmljIG1ldGhvZHMgdGhhdCBhc3NlcnQgdGhhdCBgeGAgaXNcbiAqIG9mIHRoZSBnaXZlbiByYW5rOlxuICogICAtIGB0Zi5yZXZlcnNlMWRgXG4gKiAgIC0gYHRmLnJldmVyc2UyZGBcbiAqICAgLSBgdGYucmV2ZXJzZTNkYFxuICogICAtIGB0Zi5yZXZlcnNlNGRgXG4gKlxuICogRXhjZXB0IGB0Zi5yZXZlcnNlMWRgICh3aGljaCBkb2VzIG5vdCBoYXZlIGF4aXMgcGFyYW0pLCBhbGwgbWV0aG9kcyBoYXZlXG4gKiBzYW1lIHNpZ25hdHVyZSBhcyB0aGlzIG1ldGhvZC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzLCA0XSk7XG4gKlxuICogeC5yZXZlcnNlKCkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pO1xuICpcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5yZXZlcnNlKGF4aXMpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IgdG8gYmUgcmV2ZXJzZWQuXG4gKiBAcGFyYW0gYXhpcyBUaGUgc2V0IG9mIGRpbWVuc2lvbnMgdG8gcmV2ZXJzZS4gTXVzdCBiZSBpbiB0aGVcbiAqICAgICByYW5nZSBbLXJhbmsoeCksIHJhbmsoeCkpLiBEZWZhdWx0cyB0byBhbGwgYXhlcy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdTbGljaW5nIGFuZCBKb2luaW5nJ31cbiAqL1xuZnVuY3Rpb24gcmV2ZXJzZV8oeCwgYXhpcykge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3JldmVyc2UnKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgY29uc3QgYXR0cnMgPSB7IGRpbXM6IGF4aXMgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChSZXZlcnNlLCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCByZXZlcnNlID0gb3AoeyByZXZlcnNlXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJldmVyc2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJldmVyc2UgfSBmcm9tICcuL3JldmVyc2UnO1xuLyoqXG4gKiBSZXZlcnNlcyBhIGB0Zi5UZW5zb3IxRGAuXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqL1xuZnVuY3Rpb24gcmV2ZXJzZTFkXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAncmV2ZXJzZScpO1xuICAgIHV0aWwuYXNzZXJ0KCR4LnJhbmsgPT09IDEsICgpID0+IGBFcnJvciBpbiByZXZlcnNlMUQ6IHggbXVzdCBiZSByYW5rIDEgYnV0IGdvdCByYW5rICR7JHgucmFua30uYCk7XG4gICAgcmV0dXJuIHJldmVyc2UoJHgsIDApO1xufVxuZXhwb3J0IGNvbnN0IHJldmVyc2UxZCA9IG9wKHsgcmV2ZXJzZTFkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJldmVyc2VfMWQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJldmVyc2UgfSBmcm9tICcuL3JldmVyc2UnO1xuLyoqXG4gKiBSZXZlcnNlcyBhIGB0Zi5UZW5zb3IyRGAgYWxvbmcgYSBzcGVjaWZpZWQgYXhpcy5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICogQHBhcmFtIGF4aXMgVGhlIHNldCBvZiBkaW1lbnNpb25zIHRvIHJldmVyc2UuIE11c3QgYmUgaW4gdGhlXG4gKiAgICAgcmFuZ2UgWy1yYW5rKHgpLCByYW5rKHgpKS4gRGVmYXVsdHMgdG8gYWxsIGF4ZXMuXG4gKi9cbmZ1bmN0aW9uIHJldmVyc2UyZF8oeCwgYXhpcykge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3JldmVyc2UnKTtcbiAgICB1dGlsLmFzc2VydCgkeC5yYW5rID09PSAyLCAoKSA9PiBgRXJyb3IgaW4gcmV2ZXJzZTJEOiB4IG11c3QgYmUgcmFuayAyIGJ1dCBnb3QgcmFuayAkeyR4LnJhbmt9LmApO1xuICAgIHJldHVybiByZXZlcnNlKCR4LCBheGlzKTtcbn1cbmV4cG9ydCBjb25zdCByZXZlcnNlMmQgPSBvcCh7IHJldmVyc2UyZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZXZlcnNlXzJkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXZlcnNlIH0gZnJvbSAnLi9yZXZlcnNlJztcbi8qKlxuICogUmV2ZXJzZXMgYSBgdGYuVGVuc29yM0RgIGFsb25nIGEgc3BlY2lmaWVkIGF4aXMuXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBheGlzIFRoZSBzZXQgb2YgZGltZW5zaW9ucyB0byByZXZlcnNlLiBNdXN0IGJlIGluIHRoZVxuICogICAgIHJhbmdlIFstcmFuayh4KSwgcmFuayh4KSkuIERlZmF1bHRzIHRvIGFsbCBheGVzLlxuICovXG5mdW5jdGlvbiByZXZlcnNlM2RfKHgsIGF4aXMpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdyZXZlcnNlJyk7XG4gICAgdXRpbC5hc3NlcnQoJHgucmFuayA9PT0gMywgKCkgPT4gYEVycm9yIGluIHJldmVyc2UzRDogeCBtdXN0IGJlIHJhbmsgMyBidXQgZ290IHJhbmsgJHskeC5yYW5rfS5gKTtcbiAgICByZXR1cm4gcmV2ZXJzZSgkeCwgYXhpcyk7XG59XG5leHBvcnQgY29uc3QgcmV2ZXJzZTNkID0gb3AoeyByZXZlcnNlM2RfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmV2ZXJzZV8zZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmV2ZXJzZSB9IGZyb20gJy4vcmV2ZXJzZSc7XG4vKipcbiAqIFJldmVyc2VzIGEgYHRmLlRlbnNvcjREYCBhbG9uZyBhIHNwZWNpZmllZCBheGlzLlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gYXhpcyBUaGUgc2V0IG9mIGRpbWVuc2lvbnMgdG8gcmV2ZXJzZS4gTXVzdCBiZSBpbiB0aGVcbiAqICAgICByYW5nZSBbLXJhbmsoeCksIHJhbmsoeCkpLiBEZWZhdWx0cyB0byBhbGwgYXhlcy5cbiAqL1xuZnVuY3Rpb24gcmV2ZXJzZTRkXyh4LCBheGlzKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAncmV2ZXJzZScpO1xuICAgIHV0aWwuYXNzZXJ0KCR4LnJhbmsgPT09IDQsICgpID0+IGBFcnJvciBpbiByZXZlcnNlNEQ6IHggbXVzdCBiZSByYW5rIDQgYnV0IGdvdCByYW5rICR7JHgucmFua30uYCk7XG4gICAgcmV0dXJuIHJldmVyc2UoJHgsIGF4aXMpO1xufVxuZXhwb3J0IGNvbnN0IHJldmVyc2U0ZCA9IG9wKHsgcmV2ZXJzZTRkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJldmVyc2VfNGQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLy8gUmV0dXJucyB0aGUgaW1hZ2UgY2VudGVyIGluIHBpeGVscy5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbWFnZUNlbnRlcihjZW50ZXIsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoKSB7XG4gICAgY29uc3QgY2VudGVyWCA9IGltYWdlV2lkdGggKiAodHlwZW9mIGNlbnRlciA9PT0gJ251bWJlcicgPyBjZW50ZXIgOiBjZW50ZXJbMF0pO1xuICAgIGNvbnN0IGNlbnRlclkgPSBpbWFnZUhlaWdodCAqICh0eXBlb2YgY2VudGVyID09PSAnbnVtYmVyJyA/IGNlbnRlciA6IGNlbnRlclsxXSk7XG4gICAgcmV0dXJuIFtjZW50ZXJYLCBjZW50ZXJZXTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJvdGF0ZV91dGlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBSb3VuZCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIHJvdW5kIG9mIGlucHV0IGB0Zi5UZW5zb3JgIGVsZW1lbnQtd2lzZTogYHJvdW5kKHgpYC5cbiAqIEl0IGltcGxlbWVudHMgYmFua2VyJ3Mgcm91bmRpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbLjYsIDEuMSwgLTMuM10pO1xuICpcbiAqIHgucm91bmQoKS5wcmludCgpOyAgLy8gb3IgdGYucm91bmQoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gcm91bmRfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdyb3VuZCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChSb3VuZCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCByb3VuZCA9IG9wKHsgcm91bmRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cm91bmQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFJzcXJ0IH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgcmVjaXByb2NhbCBvZiBzcXVhcmUgcm9vdCBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOlxuICogYHkgPSAxIC8gc3FydCh4KWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCA0LCAtMV0pO1xuICpcbiAqIHgucnNxcnQoKS5wcmludCgpOyAgLy8gb3IgdGYucnNxcnQoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gcnNxcnRfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdyc3FydCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChSc3FydCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCByc3FydCA9IG9wKHsgcnNxcnRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cnNxcnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgaXNUeXBlZEFycmF5IH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBtYWtlVGVuc29yIH0gZnJvbSAnLi90ZW5zb3Jfb3BzX3V0aWwnO1xuLyoqXG4gKiBDcmVhdGVzIHJhbmstMCBgdGYuVGVuc29yYCAoc2NhbGFyKSB3aXRoIHRoZSBwcm92aWRlZCB2YWx1ZSBhbmQgZHR5cGUuXG4gKlxuICogVGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBjYW4gYmUgYWNoaWV2ZWQgd2l0aCBgdGYudGVuc29yYCwgYnV0IGluIGdlbmVyYWxcbiAqIHdlIHJlY29tbWVuZCB1c2luZyBgdGYuc2NhbGFyYCBhcyBpdCBtYWtlcyB0aGUgY29kZSBtb3JlIHJlYWRhYmxlLlxuICpcbiAqIGBgYGpzXG4gKiB0Zi5zY2FsYXIoMy4xNCkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIHNjYWxhci5cbiAqIEBwYXJhbSBkdHlwZSBUaGUgZGF0YSB0eXBlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjYWxhcih2YWx1ZSwgZHR5cGUpIHtcbiAgICBpZiAoKChpc1R5cGVkQXJyYXkodmFsdWUpICYmIGR0eXBlICE9PSAnc3RyaW5nJykgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpICYmXG4gICAgICAgIGR0eXBlICE9PSAnY29tcGxleDY0Jykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vycm9yIGNyZWF0aW5nIGEgbmV3IFNjYWxhcjogdmFsdWUgbXVzdCBiZSBhIHByaW1pdGl2ZSAnICtcbiAgICAgICAgICAgICcobnVtYmVyfGJvb2xlYW58c3RyaW5nKScpO1xuICAgIH1cbiAgICBpZiAoZHR5cGUgPT09ICdzdHJpbmcnICYmIGlzVHlwZWRBcnJheSh2YWx1ZSkgJiZcbiAgICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignV2hlbiBtYWtpbmcgYSBzY2FsYXIgZnJvbSBlbmNvZGVkIHN0cmluZywgJyArXG4gICAgICAgICAgICAndGhlIHZhbHVlIG11c3QgYmUgYFVpbnQ4QXJyYXlgLicpO1xuICAgIH1cbiAgICBjb25zdCBzaGFwZSA9IFtdO1xuICAgIGNvbnN0IGluZmVycmVkU2hhcGUgPSBbXTtcbiAgICByZXR1cm4gbWFrZVRlbnNvcih2YWx1ZSwgc2hhcGUsIGluZmVycmVkU2hhcGUsIGR0eXBlKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNjYWxhci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgU2NhdHRlck5kIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCAqIGFzIHNjYXR0ZXJfbmRfdXRpbCBmcm9tICcuL3NjYXR0ZXJfbmRfdXRpbCc7XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdGVuc29yIGJ5IGFwcGx5aW5nIHNwYXJzZSB1cGRhdGVzIHRvIGluZGl2aWR1YWxcbiAqIHZhbHVlcyBvciBzbGljZXMgd2l0aGluIGEgemVybyB0ZW5zb3Igb2YgdGhlIGdpdmVuIHNoYXBlIHRlbnNvciBhY2NvcmRpbmcgdG9cbiAqIGluZGljZXMuIFRoaXMgb3BlcmF0b3IgaXMgdGhlIGludmVyc2Ugb2YgdGhlIGB0Zi5nYXRoZXJORGAgb3BlcmF0b3Igd2hpY2hcbiAqIGV4dHJhY3RzIHZhbHVlcyBvciBzbGljZXMgZnJvbSBhIGdpdmVuIHRlbnNvci5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgaW5kaWNlcyA9IHRmLnRlbnNvcjJkKFs0LCAzLCAxLCA3XSwgWzQsIDFdLCAnaW50MzInKTtcbiAqIGNvbnN0IHVwZGF0ZXMgPSB0Zi50ZW5zb3IxZChbOSwgMTAsIDExLCAxMl0pO1xuICogY29uc3Qgc2hhcGUgPSBbOF07XG4gKiB0Zi5zY2F0dGVyTkQoaW5kaWNlcywgdXBkYXRlcywgc2hhcGUpLnByaW50KCkgLy9bMCwgMTEsIDAsIDEwLCA5LCAwLCAwLCAxMl1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBpbmRpY2VzIFRoZSB0ZW5zb3IgY29udGFpbnMgdGhlIGluZGljZXMgaW50byB0aGUgb3V0cHV0IHRlbnNvci5cbiAqIEBwYXJhbSB1cGRhdGVzIFRoZSB0ZW5zb3IgY29udGFpbnMgdGhlIHZhbHVlIGZvciB0aGUgaW5kaWNlcy5cbiAqIEBwYXJhbSBzaGFwZTogVGhlIHNoYXBlIG9mIHRoZSBvdXRwdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1NsaWNpbmcgYW5kIEpvaW5pbmcnfVxuICovXG5mdW5jdGlvbiBzY2F0dGVyTkRfKGluZGljZXMsIHVwZGF0ZXMsIHNoYXBlKSB7XG4gICAgY29uc3QgJGluZGljZXMgPSBjb252ZXJ0VG9UZW5zb3IoaW5kaWNlcywgJ2luZGljZXMnLCAnc2NhdHRlck5EJywgJ2ludDMyJyk7XG4gICAgY29uc3QgJHVwZGF0ZXMgPSBjb252ZXJ0VG9UZW5zb3IodXBkYXRlcywgJ3VwZGF0ZXMnLCAnc2NhdHRlck5EJyk7XG4gICAgc2NhdHRlcl9uZF91dGlsLnZhbGlkYXRlSW5wdXQoJHVwZGF0ZXMsICRpbmRpY2VzLCBzaGFwZSk7XG4gICAgY29uc3QgaW5wdXRzID0geyBpbmRpY2VzOiAkaW5kaWNlcywgdXBkYXRlczogJHVwZGF0ZXMgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgc2hhcGUgfTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoU2NhdHRlck5kLCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBzY2F0dGVyTkQgPSBvcCh7IHNjYXR0ZXJORF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zY2F0dGVyX25kLmpzLm1hcCIsImltcG9ydCB7IGNvbXB1dGVTdHJpZGVzLCBzaXplRnJvbVNoYXBlIH0gZnJvbSAnLi4vdXRpbCc7XG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdXBkYXRlcy5zaGFwZSA9IGluZGljZXMuc2hhcGVbOmJhdGNoRGltXSArXG4gKiBzaGFwZVtzbGljZURpbTpdXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlVXBkYXRlU2hhcGUoc2hhcGUsIGluZGljZXMsIHVwZGF0ZXMpIHtcbiAgICBjb25zdCBzbGljZURpbSA9IChpbmRpY2VzLnJhbmsgPiAxKSA/IGluZGljZXMuc2hhcGVbaW5kaWNlcy5yYW5rIC0gMV0gOiAxO1xuICAgIGNvbnN0IGJhdGNoRGltID0gKGluZGljZXMucmFuayA+IDEpID8gaW5kaWNlcy5yYW5rIC0gMSA6IDE7XG4gICAgY29uc3Qgc2hhcGVFcnJvciA9ICdNdXN0IGhhdmUgdXBkYXRlcy5zaGFwZSA9IGluZGljZXMuc2hhcGVbOmJhdGNoRGltXSArICcgK1xuICAgICAgICBgc2hhcGVbc2xpY2VEaW06XSwgZ290IHVwZGF0ZXMuc2hhcGU6ICR7dXBkYXRlcy5zaGFwZX1gICtcbiAgICAgICAgYCwgaW5kaWNlcy5zaGFwZTogJHtpbmRpY2VzLnNoYXBlfSwgc2hhcGU6ICR7c2hhcGV9YCArXG4gICAgICAgIGAsIHNsaWNlRGltOiAke3NsaWNlRGltfSwgYW5kIGJhdGNoRGltOiAke2JhdGNoRGltfS5gO1xuICAgIGlmICh1cGRhdGVzLnJhbmsgPCBiYXRjaERpbSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3Ioc2hhcGVFcnJvciArIGAgdXBkYXRlLnJhbmsgPCAke2JhdGNoRGltfS4gYCk7XG4gICAgfVxuICAgIGlmIChzaGFwZS5sZW5ndGggPCBzbGljZURpbSArICh1cGRhdGVzLnJhbmsgLSBiYXRjaERpbSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHNoYXBlRXJyb3IgK1xuICAgICAgICAgICAgYCBPdXRwdXQgc2hhcGUgbGVuZ3RoIDwgJHtzbGljZURpbSArICh1cGRhdGVzLnJhbmsgLSBiYXRjaERpbSl9YCk7XG4gICAgfVxuICAgIGlmICh1cGRhdGVzLnJhbmsgIT09IGJhdGNoRGltICsgc2hhcGUubGVuZ3RoIC0gc2xpY2VEaW0pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHNoYXBlRXJyb3IgKyBgIHVwZGF0ZS5yYW5rICE9ICR7YmF0Y2hEaW0gKyBzaGFwZS5sZW5ndGggLSBzbGljZURpbX1gKTtcbiAgICB9XG4gICAgZm9yIChsZXQgZCA9IDA7IGQgPCBiYXRjaERpbTsgKytkKSB7XG4gICAgICAgIGlmICh1cGRhdGVzLnNoYXBlW2RdICE9PSBpbmRpY2VzLnNoYXBlW2RdKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3Ioc2hhcGVFcnJvciArXG4gICAgICAgICAgICAgICAgYCB1cGRhdGVzLnNoYXBlWyR7ZH1dICgke3VwZGF0ZXMuc2hhcGVbZF19KSAhPSBpbmRpY2VzLnNoYXBlWyR7ZH1dICgke2luZGljZXMuc2hhcGVbZF19KS5gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCBkID0gMDsgZCA8IHVwZGF0ZXMucmFuayAtIGJhdGNoRGltOyArK2QpIHtcbiAgICAgICAgaWYgKHVwZGF0ZXMuc2hhcGVbZCArIGJhdGNoRGltXSAhPT0gc2hhcGVbZCArIHNsaWNlRGltXSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHNoYXBlRXJyb3IgK1xuICAgICAgICAgICAgICAgIGAgdXBkYXRlcy5zaGFwZVske2QgKyBiYXRjaERpbX1dICgke3VwZGF0ZXMuc2hhcGVbZCArIGJhdGNoRGltXX0pICE9IHNoYXBlWyR7ZCArIGJhdGNoRGltfV0gKCR7c2hhcGVbZCArIGJhdGNoRGltXX0pYCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIFZhbGlkYXRlIHNjYXR0ZXIgbmQgaW5wdXRzLlxuICpcbiAqIEBwYXJhbSB1cGRhdGUgVGhlIHRlbnNvciBjb250YWlucyB0aGUgdXBkYXRlIHZhbHVlcy5cbiAqIEBwYXJhbSBpbmRpY2VzIFRoZSB0ZW5zb3IgY29udGFpbnMgdGhlIGluZGljZXMgZm9yIHRoZSB1cGRhdGUgdmFsdWVzLlxuICogQHBhcmFtIHNoYXBlIFRoZSBzaGFwZSBvZiB0aGUgb3V0cHV0IHRlbnNvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlSW5wdXQodXBkYXRlcywgaW5kaWNlcywgc2hhcGUpIHtcbiAgICBpZiAoaW5kaWNlcy5yYW5rIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RmLnNjYXR0ZXJORCgpIGV4cGVjdHMgdGhlIGluZGljZXMgdG8gYmUgcmFuayAxIG9yIGhpZ2hlciwnICtcbiAgICAgICAgICAgIGAgYnV0IHRoZSByYW5rIHdhcyAke2luZGljZXMucmFua30uYCk7XG4gICAgfVxuICAgIGlmICh1cGRhdGVzLnJhbmsgPCAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGYuc2NhdHRlck5EKCkgZXhwZWN0cyB0aGUgdXBkYXRlcyB0byBiZSByYW5rIDEgb3IgaGlnaGVyLCcgK1xuICAgICAgICAgICAgYCBidXQgdGhlIHJhbmsgd2FzICR7dXBkYXRlcy5yYW5rfS5gKTtcbiAgICB9XG4gICAgaWYgKGluZGljZXMuZHR5cGUgIT09ICdpbnQzMicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgZHR5cGUgb2YgJ2luZGljZXMnIHNob3VsZCBiZSBpbnQzMiwgYnV0IGdvdCBkdHlwZTogJHtpbmRpY2VzLmR0eXBlfWApO1xuICAgIH1cbiAgICBpZiAoc2hhcGUubGVuZ3RoIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE91dHB1dCByYW5rIG11c3QgYmUgZ3JlYXRlciBvciBlcXVhbCB0byAxLCBidXQgZ290IHNoYXBlOiAke3NoYXBlfWApO1xuICAgIH1cbiAgICBpZiAoc2hhcGUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGlmIChpbmRpY2VzLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW5kaWNlcyBzcGVjaWZpZWQgZm9yIGVtcHR5IG91dHB1dC4gaW5kaWNlcyBzaGFwZTogJHtpbmRpY2VzLnNoYXBlfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVzLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVXBkYXRlcyBzcGVjaWZpZWQgZm9yIGVtcHR5IG91dHB1dC4gdXBkYXRlcyBzaGFwZTogJHt1cGRhdGVzLnNoYXBlfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhbGlkYXRlVXBkYXRlU2hhcGUoc2hhcGUsIGluZGljZXMsIHVwZGF0ZXMpO1xufVxuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIHNoYXBlIGluZm9ybWF0aW9uIGZvciB0aGUgb3V0cHV0LlxuICpcbiAqIEBwYXJhbSB1cGRhdGUgVGhlIHRlbnNvciBjb250YWlucyB0aGUgdXBkYXRlIHZhbHVlcy5cbiAqIEBwYXJhbSBpbmRpY2VzIFRoZSB0ZW5zb3IgY29udGFpbnMgdGhlIGluZGljZXMgZm9yIHRoZSB1cGRhdGUgdmFsdWVzLlxuICogQHBhcmFtIHNoYXBlIFRoZSBzaGFwZSBvZiB0aGUgb3V0cHV0IHRlbnNvci5cbiAqXG4gKiBAcmV0dXJucyBTY2F0dGVyU2hhcGVJbmZvXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVTaGFwZXModXBkYXRlcywgaW5kaWNlcywgc2hhcGUpIHtcbiAgICAvLyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIGluIGluZGljZXNcbiAgICBjb25zdCBpbmRpY2VzUmFuayA9IGluZGljZXMuc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IHNsaWNlUmFuayA9IChpbmRpY2VzUmFuayA+IDEpID8gaW5kaWNlcy5zaGFwZVtpbmRpY2VzUmFuayAtIDFdIDogMTtcbiAgICAvLyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBlbGVtZW50cyB0aGF0IG1ha2UgdXAgZWFjaCBzbGljZSBvZiBvdXIgdXBkYXRlZFxuICAgIC8vIHRlbnNvci4gVGhpcyBhbGxvd3MgdXMgdG8gd29yayB3aXRoIGZsYXR0ZW5lZCB0ZW5zb3JzIGFuZCBjb3B5IG92ZXIgd2hvbGVcbiAgICAvLyBzbGljZXMgYXQgYSB0aW1lLlxuICAgIGNvbnN0IHRvdGFsTmQgPSBzaGFwZS5sZW5ndGg7XG4gICAgbGV0IHNsaWNlU2l6ZSA9IDE7XG4gICAgZm9yIChsZXQgaSA9IHNsaWNlUmFuazsgaSA8IHRvdGFsTmQ7ICsraSkge1xuICAgICAgICBzbGljZVNpemUgKj0gc2hhcGVbaV07XG4gICAgfVxuICAgIGNvbnN0IHNhZmVTbGljZURpbSA9IChzbGljZVJhbmsgPCAxKSA/IDEgOiBzbGljZVJhbms7XG4gICAgY29uc3QgbnVtVXBkYXRlcyA9IHNpemVGcm9tU2hhcGUoaW5kaWNlcy5zaGFwZSkgLyBzYWZlU2xpY2VEaW07XG4gICAgY29uc3Qgc3RyaWRlcyA9IFsuLi5jb21wdXRlU3RyaWRlcyhzaGFwZS5zbGljZSgwLCBzbGljZVJhbmspKSwgMV07XG4gICAgY29uc3Qgb3V0cHV0U2l6ZSA9IHNpemVGcm9tU2hhcGUoc2hhcGUpO1xuICAgIHJldHVybiB7IHNsaWNlUmFuaywgbnVtVXBkYXRlcywgc2xpY2VTaXplLCBzdHJpZGVzLCBvdXRwdXRTaXplIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zY2F0dGVyX25kX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgbmVhcmVzdERpdmlzb3IgfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IFBBUkFMTEVMSVpFX1RIUkVTSE9MRCB9IGZyb20gJy4vcmVkdWNlX3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIHNlZ09wQ29tcHV0ZU9wdGltYWxXaW5kb3dTaXplKGluU2l6ZSwgbnVtU2VnbWVudHMpIHtcbiAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgIGxldCByZXM7XG4gICAgaWYgKGluU2l6ZSA8PSBQQVJBTExFTElaRV9USFJFU0hPTEQpIHtcbiAgICAgICAgcmVzID0gaW5TaXplO1xuICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlcyA9IG5lYXJlc3REaXZpc29yKGluU2l6ZSwgTWF0aC5mbG9vcihNYXRoLnNxcnQoaW5TaXplKSkpO1xuICAgIH1cbiAgICB3aGlsZSAoIWRvbmUpIHtcbiAgICAgICAgaWYgKHJlcyA+IG51bVNlZ21lbnRzIHx8IHJlcyA9PT0gaW5TaXplKSB7XG4gICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlcyA9IG5lYXJlc3REaXZpc29yKGluU2l6ZSwgcmVzICsgMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlT3V0U2hhcGUoYVNoYXBlLCBheGlzLCBudW1TZWdtZW50cykge1xuICAgIGNvbnN0IG91dFNoYXBlID0gW107XG4gICAgY29uc3QgcmFuayA9IGFTaGFwZS5sZW5ndGg7XG4gICAgZm9yIChsZXQgZGltID0gMDsgZGltIDwgcmFuazsgZGltKyspIHtcbiAgICAgICAgaWYgKGRpbSAhPT0gYXhpcykge1xuICAgICAgICAgICAgb3V0U2hhcGUucHVzaChhU2hhcGVbZGltXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvdXRTaGFwZS5wdXNoKG51bVNlZ21lbnRzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0U2hhcGU7XG59XG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdEdhdGhlck9wU2hhcGVJbmZvKHgsIGluZGljZXMsIGF4aXMsIGJhdGNoRGltcykge1xuICAgIGNvbnN0IGluZGljZXNSYW5rID0gaW5kaWNlcy5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcbiAgICBpZiAoYmF0Y2hEaW1zICE9PSAwKSB7XG4gICAgICAgIGlmIChiYXRjaERpbXMgPCAtaW5kaWNlc1JhbmsgfHwgYmF0Y2hEaW1zID4gaW5kaWNlc1JhbmspIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0IGJhdGNoRGltcyBpbiB0aGUgcmFuZ2Ugb2YgWy0ke2luZGljZXNSYW5rfSwgJHtpbmRpY2VzUmFua31dLCBidXQgZ290ICR7YmF0Y2hEaW1zfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChiYXRjaERpbXMgPCAwKSB7XG4gICAgICAgIGJhdGNoRGltcyArPSBpbmRpY2VzUmFuaztcbiAgICB9XG4gICAgaWYgKGJhdGNoRGltcyA+IHhSYW5rKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgYmF0Y2hEaW1zICgke2JhdGNoRGltc30pIG11c3QgYmUgbGVzcyB0aGFuIHJhbmsoeCkgKFxuICAgICR7eFJhbmt9KS5gKTtcbiAgICB9XG4gICAgaWYgKGF4aXMgPCBiYXRjaERpbXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBiYXRjaERpbXMgKCR7YmF0Y2hEaW1zfSkgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYXhpcyAoJHtheGlzfSkuYCk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmF0Y2hEaW1zOyArK2kpIHtcbiAgICAgICAgaWYgKHguc2hhcGVbaV0gIT09IGluZGljZXMuc2hhcGVbaV0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgeC5zaGFwZVske2l9XTogJHt4LnNoYXBlW2ldfSBzaG91bGQgYmUgZXF1YWwgdG8gaW5kaWNlcy5zaGFwZVske2l9XTogJHtpbmRpY2VzLnNoYXBlW2ldfS5gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBkaW1TaXplID0geC5zaGFwZVtheGlzXTtcbiAgICBjb25zdCBvdXRwdXRTaGFwZSA9IFtdO1xuICAgIGxldCBiYXRjaFNpemUgPSAxO1xuICAgIGxldCBvdXRlclNpemUgPSAxO1xuICAgIGxldCBzbGljZVNpemUgPSAxO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmF0Y2hEaW1zOyArK2kpIHtcbiAgICAgICAgb3V0cHV0U2hhcGUucHVzaCh4LnNoYXBlW2ldKTtcbiAgICAgICAgYmF0Y2hTaXplICo9IHguc2hhcGVbaV07XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSBiYXRjaERpbXM7IGkgPCBheGlzOyBpKyspIHtcbiAgICAgICAgb3V0cHV0U2hhcGUucHVzaCh4LnNoYXBlW2ldKTtcbiAgICAgICAgb3V0ZXJTaXplICo9IHguc2hhcGVbaV07XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSBiYXRjaERpbXM7IGkgPCBpbmRpY2VzUmFuazsgaSsrKSB7XG4gICAgICAgIG91dHB1dFNoYXBlLnB1c2goaW5kaWNlcy5zaGFwZVtpXSk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSBheGlzICsgMTsgaSA8IHhSYW5rOyBpKyspIHtcbiAgICAgICAgb3V0cHV0U2hhcGUucHVzaCh4LnNoYXBlW2ldKTtcbiAgICAgICAgc2xpY2VTaXplICo9IHguc2hhcGVbaV07XG4gICAgfVxuICAgIHJldHVybiB7IGJhdGNoU2l6ZSwgc2xpY2VTaXplLCBvdXRlclNpemUsIGRpbVNpemUsIG91dHB1dFNoYXBlIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zZWdtZW50X3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFNlbHUgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBzY2FsZWQgZXhwb25lbnRpYWwgbGluZWFyIGVsZW1lbnQtd2lzZS5cbiAqXG4gKiBgeCA8IDAgPyBzY2FsZSAqIGFscGhhICogKGV4cCh4KSAtIDEpIDogeGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFstMSwgMiwgLTMsIDRdKTtcbiAqXG4gKiB4LnNlbHUoKS5wcmludCgpOyAgLy8gb3IgdGYuc2VsdSh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBzZWx1Xyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc2VsdScpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChTZWx1LCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IHNlbHUgPSBvcCh7IHNlbHVfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2VsdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5leHBvcnQgY29uc3QgU0VMVV9TQ0FMRUFMUEhBID0gMS43NTgwOTkzNDA4NDczNzY4NTk5NDAyMTc1MjA4MTIzO1xuZXhwb3J0IGNvbnN0IFNFTFVfU0NBTEUgPSAxLjA1MDcwMDk4NzM1NTQ4MDQ5MzQxOTMzNDk4NTI5NDY7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zZWx1X3V0aWwuanMubWFwIiwiaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBjb252MmQgfSBmcm9tICcuL2NvbnYyZCc7XG5pbXBvcnQgeyBkZXB0aHdpc2VDb252MmQgfSBmcm9tICcuL2RlcHRod2lzZV9jb252MmQnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbi8qKlxuICogMi1EIGNvbnZvbHV0aW9uIHdpdGggc2VwYXJhYmxlIGZpbHRlcnMuXG4gKlxuICogUGVyZm9ybXMgYSBkZXB0aHdpc2UgY29udm9sdXRpb24gdGhhdCBhY3RzIHNlcGFyYXRlbHkgb24gY2hhbm5lbHMgZm9sbG93ZWRcbiAqIGJ5IGEgcG9pbnR3aXNlIGNvbnZvbHV0aW9uIHRoYXQgbWl4ZXMgY2hhbm5lbHMuIE5vdGUgdGhhdCB0aGlzIGlzXG4gKiBzZXBhcmFiaWxpdHkgYmV0d2VlbiBkaW1lbnNpb25zIFsxLCAyXSBhbmQgMywgbm90IHNwYXRpYWwgc2VwYXJhYmlsaXR5XG4gKiBiZXR3ZWVuIGRpbWVuc2lvbnMgMSBhbmQgMi5cbiAqXG4gKiBTZWVcbiAqIFtodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vc2VwYXJhYmxlX2NvbnYyZF0oXG4gKiAgICAgaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL3NlcGFyYWJsZV9jb252MmQpXG4gKiBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IsIG9mIHJhbmsgNCBvciByYW5rIDMsIG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgaW5DaGFubmVsc11gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXNcbiAqIGFzc3VtZWQuXG4gKiBAcGFyYW0gZGVwdGh3aXNlRmlsdGVyIFRoZSBkZXB0aHdpc2UgZmlsdGVyIHRlbnNvciwgcmFuayA0LCBvZiBzaGFwZVxuICogICAgIGBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5DaGFubmVscywgY2hhbm5lbE11bHRpcGxpZXJdYC4gVGhpcyBpc1xuICogICAgIHRoZSBmaWx0ZXIgdXNlZCBpbiB0aGUgZmlyc3Qgc3RlcC5cbiAqIEBwYXJhbSBwb2ludHdpc2VGaWx0ZXIgVGhlIHBvaW50d2lzZSBmaWx0ZXIgdGVuc29yLCByYW5rIDQsIG9mIHNoYXBlXG4gKiAgICAgYFsxLCAxLCBpbkNoYW5uZWxzICogY2hhbm5lbE11bHRpcGxpZXIsIG91dENoYW5uZWxzXWAuIFRoaXMgaXNcbiAqICAgICB0aGUgZmlsdGVyIHVzZWQgaW4gdGhlIHNlY29uZCBzdGVwLlxuICogQHBhcmFtIHN0cmlkZXMgVGhlIHN0cmlkZXMgb2YgdGhlIGNvbnZvbHV0aW9uOiBgW3N0cmlkZUhlaWdodCxcbiAqIHN0cmlkZVdpZHRoXWAuIElmIHN0cmlkZXMgaXMgYSBzaW5nbGUgbnVtYmVyLCB0aGVuIGBzdHJpZGVIZWlnaHQgPT1cbiAqIHN0cmlkZVdpZHRoYC5cbiAqIEBwYXJhbSBwYWQgVGhlIHR5cGUgb2YgcGFkZGluZyBhbGdvcml0aG0uXG4gKiAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgLSBgdmFsaWRgOiBvdXRwdXQgd2lsbCBiZSBzbWFsbGVyIHRoYW4gaW5wdXQgaWYgZmlsdGVyIGlzIGxhcmdlclxuICogICAgICAgdGhhbiAxeDEuXG4gKiAgIC0gRm9yIG1vcmUgaW5mbywgc2VlIHRoaXMgZ3VpZGU6XG4gKiAgICAgW2h0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbl0oXG4gKiAgICAgICAgICBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb24pXG4gKiBAcGFyYW0gZGlsYXRpb25zIFRoZSBkaWxhdGlvbiByYXRlczogYFtkaWxhdGlvbkhlaWdodCwgZGlsYXRpb25XaWR0aF1gXG4gKiAgICAgaW4gd2hpY2ggd2Ugc2FtcGxlIGlucHV0IHZhbHVlcyBhY3Jvc3MgdGhlIGhlaWdodCBhbmQgd2lkdGggZGltZW5zaW9uc1xuICogICAgIGluIGF0cm91cyBjb252b2x1dGlvbi4gRGVmYXVsdHMgdG8gYFsxLCAxXWAuIElmIGByYXRlYCBpcyBhIHNpbmdsZVxuICogICAgIG51bWJlciwgdGhlbiBgZGlsYXRpb25IZWlnaHQgPT0gZGlsYXRpb25XaWR0aGAuIElmIGl0IGlzIGdyZWF0ZXIgdGhhblxuICogICAgIDEsIHRoZW4gYWxsIHZhbHVlcyBvZiBgc3RyaWRlc2AgbXVzdCBiZSAxLlxuICogQHBhcmFtIGRhdGFGb3JtYXQ6IEFuIG9wdGlvbmFsIHN0cmluZyBmcm9tOiBcIk5IV0NcIiwgXCJOQ0hXXCIuIERlZmF1bHRzIHRvXG4gKiAgICAgXCJOSFdDXCIuIFNwZWNpZnkgdGhlIGRhdGEgZm9ybWF0IG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEuIFdpdGggdGhlXG4gKiAgICAgZGVmYXVsdCBmb3JtYXQgXCJOSFdDXCIsIHRoZSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgb3JkZXIgb2Y6IFtiYXRjaCxcbiAqICAgICBoZWlnaHQsIHdpZHRoLCBjaGFubmVsc10uIE9ubHkgXCJOSFdDXCIgaXMgY3VycmVudGx5IHN1cHBvcnRlZC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdDb252b2x1dGlvbid9XG4gKi9cbmZ1bmN0aW9uIHNlcGFyYWJsZUNvbnYyZF8oeCwgZGVwdGh3aXNlRmlsdGVyLCBwb2ludHdpc2VGaWx0ZXIsIHN0cmlkZXMsIHBhZCwgZGlsYXRpb24gPSBbMSwgMV0sIGRhdGFGb3JtYXQgPSAnTkhXQycpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzZXBhcmFibGVDb252MmQnKTtcbiAgICBjb25zdCAkZGVwdGh3aXNlRmlsdGVyID0gY29udmVydFRvVGVuc29yKGRlcHRod2lzZUZpbHRlciwgJ2RlcHRod2lzZUZpbHRlcicsICdzZXBhcmFibGVDb252MmQnKTtcbiAgICBjb25zdCAkcG9pbnR3aXNlRmlsdGVyID0gY29udmVydFRvVGVuc29yKHBvaW50d2lzZUZpbHRlciwgJ3BvaW50d2lzZUZpbHRlcicsICdzZXBhcmFibGVDb252MmQnKTtcbiAgICBsZXQgeDREID0gJHg7XG4gICAgbGV0IHJlc2hhcGVkVG80RCA9IGZhbHNlO1xuICAgIGlmICgkeC5yYW5rID09PSAzKSB7XG4gICAgICAgIHJlc2hhcGVkVG80RCA9IHRydWU7XG4gICAgICAgIHg0RCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV0sICR4LnNoYXBlWzJdXSk7XG4gICAgfVxuICAgIGlmIChkYXRhRm9ybWF0ID09PSAnTkNIVycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzZXBhcmFibGVDb252MmQgY3VycmVudGx5IGRvZXMgbm90IHN1cHBvcnQgZGF0YUZvcm1hdCBOQ0hXOyBvbmx5ICcgK1xuICAgICAgICAgICAgJ05IV0MgaXMgc3VwcG9ydGVkJyk7XG4gICAgfVxuICAgIHV0aWwuYXNzZXJ0KHg0RC5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gc2VwYXJhYmxlQ29udjJkOiBpbnB1dCBtdXN0IGJlIHJhbmsgNCwgYnV0IGdvdCBgICtcbiAgICAgICAgYHJhbmsgJHt4NEQucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoJGRlcHRod2lzZUZpbHRlci5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gc2VwYXJhYmxlQ29udjJkOiBkZXB0aHdpc2UgZmlsdGVyIG11c3QgYmUgcmFuayA0LCBidXQgYCArXG4gICAgICAgIGBnb3QgcmFuayAkeyRkZXB0aHdpc2VGaWx0ZXIucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoJHBvaW50d2lzZUZpbHRlci5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gc2VwYXJhYmxlQ29udjJkOiBwb2ludHdpc2UgZmlsdGVyIG11c3QgYmUgcmFuayA0LCBidXQgYCArXG4gICAgICAgIGBnb3QgcmFuayAkeyRkZXB0aHdpc2VGaWx0ZXIucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoJHBvaW50d2lzZUZpbHRlci5zaGFwZVswXSA9PT0gMSwgKCkgPT4gYEVycm9yIGluIHNlcGFyYWJsZUNvbnYyZDogdGhlIGZpcnN0IGRpbWVuc2lvbiBvZiBwb2ludHdpc2UgZmlsdGVyIGAgK1xuICAgICAgICBgIG11c3QgYmUgMSwgYnV0IGdvdCAkeyRwb2ludHdpc2VGaWx0ZXIuc2hhcGVbMF19LmApO1xuICAgIHV0aWwuYXNzZXJ0KCRwb2ludHdpc2VGaWx0ZXIuc2hhcGVbMV0gPT09IDEsICgpID0+IGBFcnJvciBpbiBzZXBhcmFibGVDb252MmQ6IHRoZSBzZWNvbmQgZGltZW5zaW9uIG9mIHBvaW50d2lzZSBgICtcbiAgICAgICAgYGZpbHRlciBtdXN0IGJlIDEsIGJ1dCBnb3QgJHskcG9pbnR3aXNlRmlsdGVyLnNoYXBlWzFdfS5gKTtcbiAgICBjb25zdCBpbkNoYW5uZWxzID0gJGRlcHRod2lzZUZpbHRlci5zaGFwZVsyXTtcbiAgICBjb25zdCBjaGFubmVsTXVsdGlwbGllciA9ICRkZXB0aHdpc2VGaWx0ZXIuc2hhcGVbM107XG4gICAgdXRpbC5hc3NlcnQoJHBvaW50d2lzZUZpbHRlci5zaGFwZVsyXSA9PT0gaW5DaGFubmVscyAqIGNoYW5uZWxNdWx0aXBsaWVyLCAoKSA9PiBgRXJyb3IgaW4gc2VwYXJhYmxlQ29udjJkOiB0aGUgdGhpcmQgZGltZW5zaW9uIG9mIHBvaW50d2lzZSBmaWx0ZXIgYCArXG4gICAgICAgIGBtdXN0IGJlICR7aW5DaGFubmVscyAqIGNoYW5uZWxNdWx0aXBsaWVyfSwgYCArXG4gICAgICAgIGBidXQgZ290ICR7JHBvaW50d2lzZUZpbHRlci5zaGFwZVsyXX0uYCk7XG4gICAgY29uc3QgZGVwdGh3aXNlID0gZGVwdGh3aXNlQ29udjJkKHg0RCwgJGRlcHRod2lzZUZpbHRlciwgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0LCBkaWxhdGlvbik7XG4gICAgY29uc3QgcG9pbnR3aXNlU3RyaWRlID0gMTtcbiAgICBjb25zdCByZXMgPSBjb252MmQoZGVwdGh3aXNlLCAkcG9pbnR3aXNlRmlsdGVyLCBwb2ludHdpc2VTdHJpZGUsICd2YWxpZCcsIGRhdGFGb3JtYXQpO1xuICAgIGlmIChyZXNoYXBlZFRvNEQpIHtcbiAgICAgICAgcmV0dXJuIHJlc2hhcGUocmVzLCBbcmVzLnNoYXBlWzFdLCByZXMuc2hhcGVbMl0sIHJlcy5zaGFwZVszXV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IHNlcGFyYWJsZUNvbnYyZCA9IG9wKHsgc2VwYXJhYmxlQ29udjJkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlcGFyYWJsZV9jb252MmQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgVGVuc29yQnVmZmVyIH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBsaXN0cyBvZiBudW1iZXJzLlxuICpcbiAqIEdpdmVuIGEgVGVuc29yIGB4YCBhbmQgYSBUZW5zb3IgYHlgLCB0aGlzIG9wZXJhdGlvbiByZXR1cm5zIGEgVGVuc29yIGBvdXRgXG4gKiB0aGF0IHJlcHJlc2VudHMgYWxsIHZhbHVlcyB0aGF0IGFyZSBpbiBgeGAgYnV0IG5vdCBpbiBgeWAuIFRoZSByZXR1cm5lZFxuICogVGVuc29yIGBvdXRgIGlzIHNvcnRlZCBpbiB0aGUgc2FtZSBvcmRlciB0aGF0IHRoZSBudW1iZXJzIGFwcGVhciBpbiBgeGBcbiAqIChkdXBsaWNhdGVzIGFyZSBwcmVzZXJ2ZWQpLiBUaGlzIG9wZXJhdGlvbiBhbHNvIHJldHVybnMgYSBUZW5zb3IgaW5kaWNlcyB0aGF0XG4gKiByZXByZXNlbnRzIHRoZSBwb3NpdGlvbiBvZiBlYWNoIG91dCBlbGVtZW50IGluIGB4YC4gSW4gb3RoZXIgd29yZHM6XG4gKlxuICogYG91dFtpXSA9IHhbaWR4W2ldXSBmb3IgaSBpbiBbMCwgMSwgLi4uLCBvdXQubGVuZ3RoIC0gMV1gXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSBbMSwgMiwgMywgNCwgNSwgNl07XG4gKiBjb25zdCB5ID0gWzEsIDMsIDVdO1xuICpcbiAqIGNvbnN0IFtvdXQsIGluZGljZXNdID0gYXdhaXQgdGYuc2V0ZGlmZjFkQXN5bmMoeCwgeSk7XG4gKiBvdXQucHJpbnQoKTsgLy8gWzIsIDQsIDZdXG4gKiBpbmRpY2VzLnByaW50KCk7IC8vIFsxLCAzLCA1XVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggMS1EIFRlbnNvci4gVmFsdWVzIHRvIGtlZXAuXG4gKiBAcGFyYW0geSAxLUQgVGVuc29yLiBNdXN0IGhhdmUgdGhlIHNhbWUgdHlwZSBhcyB4LiBWYWx1ZXMgdG8gZXhjbHVkZSBpbiB0aGVcbiAqICAgICBvdXRwdXQuXG4gKiBAcmV0dXJucyBQcm9taXNlIG9mIFRlbnNvciB0dXBsZSBbb3V0LCBpbmRpY2VzXS5cbiAqICBvdXQ6IFRlbnNvciB3aXRoIHRoZSBzYW1lIHR5cGUgYXMgeC5cbiAqICBpbmRpY2VzOiBBIFRlbnNvciBvZiB0eXBlIGludDMyLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1RyYW5zZm9ybWF0aW9ucyd9XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNldGRpZmYxZEFzeW5jXyh4LCB5KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc2V0ZGlmZjFkJyk7XG4gICAgY29uc3QgJHkgPSBjb252ZXJ0VG9UZW5zb3IoeSwgJ3knLCAnc2V0ZGlmZjFkJyk7XG4gICAgdXRpbC5hc3NlcnQoJHguZHR5cGUgPT09ICR5LmR0eXBlLCAoKSA9PiBgeCBhbmQgeSBzaG91bGQgaGF2ZSB0aGUgc2FtZSBkdHlwZSwgYnV0IGdvdCB4ICgkeyR4LmR0eXBlfSkgYW5kIHkgKCR7JHkuZHR5cGV9KS5gKTtcbiAgICB1dGlsLmFzc2VydCgkeC5yYW5rID09PSAxLCAoKSA9PiBgeCBzaG91bGQgYmUgMUQgdGVuc29yLCBidXQgZ290IHggKCR7JHguc2hhcGV9KS5gKTtcbiAgICB1dGlsLmFzc2VydCgkeS5yYW5rID09PSAxLCAoKSA9PiBgeSBzaG91bGQgYmUgMUQgdGVuc29yLCBidXQgZ290IHkgKCR7JHkuc2hhcGV9KS5gKTtcbiAgICBjb25zdCB4VmFscyA9IGF3YWl0ICR4LmRhdGEoKTtcbiAgICBjb25zdCB5VmFscyA9IGF3YWl0ICR5LmRhdGEoKTtcbiAgICBjb25zdCB5U2V0ID0gbmV3IFNldCh5VmFscyk7XG4gICAgbGV0IG91dHB1dFNpemUgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeFZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCF5U2V0Lmhhcyh4VmFsc1tpXSkpIHtcbiAgICAgICAgICAgIG91dHB1dFNpemUrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBidWZmZXIgPSBuZXcgVGVuc29yQnVmZmVyKFtvdXRwdXRTaXplXSwgJHguZHR5cGUpO1xuICAgIGNvbnN0IGluZGljZXMgPSBuZXcgVGVuc29yQnVmZmVyKFtvdXRwdXRTaXplXSwgJ2ludDMyJyk7XG4gICAgZm9yIChsZXQgaSA9IDAsIHAgPSAwOyBpIDwgeFZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCF5U2V0Lmhhcyh4VmFsc1tpXSkpIHtcbiAgICAgICAgICAgIGJ1ZmZlci52YWx1ZXNbcF0gPSB4VmFsc1tpXTtcbiAgICAgICAgICAgIGluZGljZXMudmFsdWVzW3BdID0gaTtcbiAgICAgICAgICAgIHArKztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW2J1ZmZlci50b1RlbnNvcigpLCBpbmRpY2VzLnRvVGVuc29yKCldO1xufVxuZXhwb3J0IGNvbnN0IHNldGRpZmYxZEFzeW5jID0gc2V0ZGlmZjFkQXN5bmNfO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2V0ZGlmZjFkX2FzeW5jLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBTaWdtb2lkIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgc2lnbW9pZCBlbGVtZW50LXdpc2UsIGAxIC8gKDEgKyBleHAoLXgpKWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFswLCAtMSwgMiwgLTNdKTtcbiAqXG4gKiB4LnNpZ21vaWQoKS5wcmludCgpOyAgLy8gb3IgdGYuc2lnbW9pZCh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBzaWdtb2lkXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc2lnbW9pZCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChTaWdtb2lkLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IHNpZ21vaWQgPSBvcCh7IHNpZ21vaWRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2lnbW9pZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgU2lnbiB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIFJldHVybnMgYW4gZWxlbWVudC13aXNlIGluZGljYXRpb24gb2YgdGhlIHNpZ24gb2YgYSBudW1iZXIuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbLjYsIDEuMSwgLTMuMywgTmFOLCAwXSk7XG4gKlxuICogeC5zaWduKCkucHJpbnQoKTsgIC8vIG9yIHRmLnNpZ24oeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IFRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gc2lnbl8oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3NpZ24nKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoU2lnbiwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBzaWduID0gb3AoeyBzaWduXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNpZ24uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29uY2F0IH0gZnJvbSAnLi4vY29uY2F0JztcbmltcG9ydCB7IGZpbGwgfSBmcm9tICcuLi9maWxsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuLi9yZXNoYXBlJztcbmltcG9ydCB7IHNsaWNlIH0gZnJvbSAnLi4vc2xpY2UnO1xuaW1wb3J0IHsgdGVuc29yMmQgfSBmcm9tICcuLi90ZW5zb3IyZCc7XG4vKipcbiAqIEV4cGFuZHMgaW5wdXQgaW50byBmcmFtZXMgb2YgZnJhbWVMZW5ndGguXG4gKiBTbGlkZXMgYSB3aW5kb3cgc2l6ZSB3aXRoIGZyYW1lU3RlcC5cbiAqXG4gKiBgYGBqc1xuICogdGYuc2lnbmFsLmZyYW1lKFsxLCAyLCAzXSwgMiwgMSkucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIHNpZ25hbCBUaGUgaW5wdXQgdGVuc29yIHRvIGJlIGV4cGFuZGVkXG4gKiBAcGFyYW0gZnJhbWVMZW5ndGggTGVuZ3RoIG9mIGVhY2ggZnJhbWVcbiAqIEBwYXJhbSBmcmFtZVN0ZXAgVGhlIGZyYW1lIGhvcCBzaXplIGluIHNhbXBsZXMuXG4gKiBAcGFyYW0gcGFkRW5kIFdoZXRoZXIgdG8gcGFkIHRoZSBlbmQgb2Ygc2lnbmFsIHdpdGggcGFkVmFsdWUuXG4gKiBAcGFyYW0gcGFkVmFsdWUgQW4gbnVtYmVyIHRvIHVzZSB3aGVyZSB0aGUgaW5wdXQgc2lnbmFsIGRvZXNcbiAqICAgICBub3QgZXhpc3Qgd2hlbiBwYWRFbmQgaXMgVHJ1ZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTaWduYWwnLCBuYW1lc3BhY2U6ICdzaWduYWwnfVxuICovXG5mdW5jdGlvbiBmcmFtZV8oc2lnbmFsLCBmcmFtZUxlbmd0aCwgZnJhbWVTdGVwLCBwYWRFbmQgPSBmYWxzZSwgcGFkVmFsdWUgPSAwKSB7XG4gICAgbGV0IHN0YXJ0ID0gMDtcbiAgICBjb25zdCBvdXRwdXQgPSBbXTtcbiAgICB3aGlsZSAoc3RhcnQgKyBmcmFtZUxlbmd0aCA8PSBzaWduYWwuc2l6ZSkge1xuICAgICAgICBvdXRwdXQucHVzaChzbGljZShzaWduYWwsIHN0YXJ0LCBmcmFtZUxlbmd0aCkpO1xuICAgICAgICBzdGFydCArPSBmcmFtZVN0ZXA7XG4gICAgfVxuICAgIGlmIChwYWRFbmQpIHtcbiAgICAgICAgd2hpbGUgKHN0YXJ0IDwgc2lnbmFsLnNpemUpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhZExlbiA9IChzdGFydCArIGZyYW1lTGVuZ3RoKSAtIHNpZ25hbC5zaXplO1xuICAgICAgICAgICAgY29uc3QgcGFkID0gY29uY2F0KFtcbiAgICAgICAgICAgICAgICBzbGljZShzaWduYWwsIHN0YXJ0LCBmcmFtZUxlbmd0aCAtIHBhZExlbiksIGZpbGwoW3BhZExlbl0sIHBhZFZhbHVlKVxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICBvdXRwdXQucHVzaChwYWQpO1xuICAgICAgICAgICAgc3RhcnQgKz0gZnJhbWVTdGVwO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChvdXRwdXQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0ZW5zb3IyZChbXSwgWzAsIGZyYW1lTGVuZ3RoXSk7XG4gICAgfVxuICAgIHJldHVybiByZXNoYXBlKGNvbmNhdChvdXRwdXQpLCBbb3V0cHV0Lmxlbmd0aCwgZnJhbWVMZW5ndGhdKTtcbn1cbmV4cG9ydCBjb25zdCBmcmFtZSA9IG9wKHsgZnJhbWVfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZnJhbWUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgY29zaW5lV2luZG93IH0gZnJvbSAnLi4vc2lnbmFsX29wc191dGlsJztcbi8qKlxuICogR2VuZXJhdGUgYSBoYW1taW5nIHdpbmRvdy5cbiAqXG4gKiBTZWU6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1dpbmRvd19mdW5jdGlvbiNIYW5uX2FuZF9IYW1taW5nX3dpbmRvd3NcbiAqXG4gKiBgYGBqc1xuICogdGYuc2lnbmFsLmhhbW1pbmdXaW5kb3coMTApLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSBUaGUgbGVuZ3RoIG9mIHdpbmRvd1xuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1NpZ25hbCcsIG5hbWVzcGFjZTogJ3NpZ25hbCd9XG4gKi9cbmZ1bmN0aW9uIGhhbW1pbmdXaW5kb3dfKHdpbmRvd0xlbmd0aCkge1xuICAgIHJldHVybiBjb3NpbmVXaW5kb3cod2luZG93TGVuZ3RoLCAwLjU0LCAwLjQ2KTtcbn1cbmV4cG9ydCBjb25zdCBoYW1taW5nV2luZG93ID0gb3AoeyBoYW1taW5nV2luZG93XyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhhbW1pbmdfd2luZG93LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7IGNvc2luZVdpbmRvdyB9IGZyb20gJy4uL3NpZ25hbF9vcHNfdXRpbCc7XG4vKipcbiAqIEdlbmVyYXRlIGEgSGFubiB3aW5kb3cuXG4gKlxuICogU2VlOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9XaW5kb3dfZnVuY3Rpb24jSGFubl9hbmRfSGFtbWluZ193aW5kb3dzXG4gKlxuICogYGBganNcbiAqIHRmLnNpZ25hbC5oYW5uV2luZG93KDEwKS5wcmludCgpO1xuICogYGBgXG4gKiBAcGFyYW0gVGhlIGxlbmd0aCBvZiB3aW5kb3dcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTaWduYWwnLCBuYW1lc3BhY2U6ICdzaWduYWwnfVxuICovXG5mdW5jdGlvbiBoYW5uV2luZG93Xyh3aW5kb3dMZW5ndGgpIHtcbiAgICByZXR1cm4gY29zaW5lV2luZG93KHdpbmRvd0xlbmd0aCwgMC41LCAwLjUpO1xufVxuZXhwb3J0IGNvbnN0IGhhbm5XaW5kb3cgPSBvcCh7IGhhbm5XaW5kb3dfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGFubl93aW5kb3cuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi4vbXVsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7IGVuY2xvc2luZ1Bvd2VyT2ZUd28gfSBmcm9tICcuLi9zaWduYWxfb3BzX3V0aWwnO1xuaW1wb3J0IHsgcmZmdCB9IGZyb20gJy4uL3NwZWN0cmFsL3JmZnQnO1xuaW1wb3J0IHsgZnJhbWUgfSBmcm9tICcuL2ZyYW1lJztcbmltcG9ydCB7IGhhbm5XaW5kb3cgfSBmcm9tICcuL2hhbm5fd2luZG93Jztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIFNob3J0LXRpbWUgRm91cmllciBUcmFuc2Zvcm0gb2Ygc2lnbmFsc1xuICogU2VlOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TaG9ydC10aW1lX0ZvdXJpZXJfdHJhbnNmb3JtXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGlucHV0ID0gdGYudGVuc29yMWQoWzEsIDEsIDEsIDEsIDFdKVxuICogdGYuc2lnbmFsLnN0ZnQoaW5wdXQsIDMsIDEpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSBzaWduYWwgMS1kaW1lbnNpb25hbCByZWFsIHZhbHVlIHRlbnNvci5cbiAqIEBwYXJhbSBmcmFtZUxlbmd0aCBUaGUgd2luZG93IGxlbmd0aCBvZiBzYW1wbGVzLlxuICogQHBhcmFtIGZyYW1lU3RlcCBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gc3RlcC5cbiAqIEBwYXJhbSBmZnRMZW5ndGggVGhlIHNpemUgb2YgdGhlIEZGVCB0byBhcHBseS5cbiAqIEBwYXJhbSB3aW5kb3dGbiBBIGNhbGxhYmxlIHRoYXQgdGFrZXMgYSB3aW5kb3cgbGVuZ3RoIGFuZCByZXR1cm5zIDEtZCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU2lnbmFsJywgbmFtZXNwYWNlOiAnc2lnbmFsJ31cbiAqL1xuZnVuY3Rpb24gc3RmdF8oc2lnbmFsLCBmcmFtZUxlbmd0aCwgZnJhbWVTdGVwLCBmZnRMZW5ndGgsIHdpbmRvd0ZuID0gaGFubldpbmRvdykge1xuICAgIGlmIChmZnRMZW5ndGggPT0gbnVsbCkge1xuICAgICAgICBmZnRMZW5ndGggPSBlbmNsb3NpbmdQb3dlck9mVHdvKGZyYW1lTGVuZ3RoKTtcbiAgICB9XG4gICAgY29uc3QgZnJhbWVkU2lnbmFsID0gZnJhbWUoc2lnbmFsLCBmcmFtZUxlbmd0aCwgZnJhbWVTdGVwKTtcbiAgICBjb25zdCB3aW5kb3dlZFNpZ25hbCA9IG11bChmcmFtZWRTaWduYWwsIHdpbmRvd0ZuKGZyYW1lTGVuZ3RoKSk7XG4gICAgcmV0dXJuIHJmZnQod2luZG93ZWRTaWduYWwsIGZmdExlbmd0aCk7XG59XG5leHBvcnQgY29uc3Qgc3RmdCA9IG9wKHsgc3RmdF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdGZ0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IHRlbnNvcjFkIH0gZnJvbSAnLi90ZW5zb3IxZCc7XG5leHBvcnQgZnVuY3Rpb24gZW5jbG9zaW5nUG93ZXJPZlR3byh2YWx1ZSkge1xuICAgIC8vIFJldHVybiAyKipOIGZvciBpbnRlZ2VyIE4gc3VjaCB0aGF0IDIqKk4gPj0gdmFsdWUuXG4gICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5wb3coMiwgTWF0aC5jZWlsKE1hdGgubG9nKHZhbHVlKSAvIE1hdGgubG9nKDIuMCkpKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gY29zaW5lV2luZG93KHdpbmRvd0xlbmd0aCwgYSwgYikge1xuICAgIGNvbnN0IGV2ZW4gPSAxIC0gd2luZG93TGVuZ3RoICUgMjtcbiAgICBjb25zdCBuZXdWYWx1ZXMgPSBuZXcgRmxvYXQzMkFycmF5KHdpbmRvd0xlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3aW5kb3dMZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBjb3NBcmcgPSAoMi4wICogTWF0aC5QSSAqIGkpIC8gKHdpbmRvd0xlbmd0aCArIGV2ZW4gLSAxKTtcbiAgICAgICAgbmV3VmFsdWVzW2ldID0gYSAtIGIgKiBNYXRoLmNvcyhjb3NBcmcpO1xuICAgIH1cbiAgICByZXR1cm4gdGVuc29yMWQobmV3VmFsdWVzLCAnZmxvYXQzMicpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2lnbmFsX29wc191dGlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBTaW4gfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBzaW4gb2YgdGhlIGlucHV0IFRlbnNvciBlbGVtZW50LXdpc2U6IGBzaW4oeClgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMCwgTWF0aC5QSSAvIDIsIE1hdGguUEkgKiAzIC8gNF0pO1xuICpcbiAqIHguc2luKCkucHJpbnQoKTsgIC8vIG9yIHRmLnNpbih4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBzaW5fKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzaW4nKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoU2luLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IHNpbiA9IG9wKHsgc2luXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNpbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgU2luaCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIGh5cGVyYm9saWMgc2luIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6IGBzaW5oKHgpYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzAsIDEsIC0xLCAuN10pO1xuICpcbiAqIHguc2luaCgpLnByaW50KCk7ICAvLyBvciB0Zi5zaW5oKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIHNpbmhfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzaW5oJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFNpbmgsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3Qgc2luaCA9IG9wKHsgc2luaF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zaW5oLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBTbGljZSB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIEV4dHJhY3RzIGEgc2xpY2UgZnJvbSBhIGB0Zi5UZW5zb3JgIHN0YXJ0aW5nIGF0IGNvb3JkaW5hdGVzIGBiZWdpbmBcbiAqIGFuZCBpcyBvZiBzaXplIGBzaXplYC5cbiAqXG4gKiBBbHNvIGF2YWlsYWJsZSBhcmUgc3RyaWN0ZXIgcmFuay1zcGVjaWZpYyBtZXRob2RzIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlXG4gKiBhcyB0aGlzIG1ldGhvZCB0aGF0IGFzc2VydCB0aGF0IGB4YCBpcyBvZiB0aGUgZ2l2ZW4gcmFuazpcbiAqICAgLSBgdGYuc2xpY2UxZGBcbiAqICAgLSBgdGYuc2xpY2UyZGBcbiAqICAgLSBgdGYuc2xpY2UzZGBcbiAqICAgLSBgdGYuc2xpY2U0ZGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzLCA0XSk7XG4gKlxuICogeC5zbGljZShbMV0sIFsyXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pO1xuICpcbiAqIHguc2xpY2UoWzEsIDBdLCBbMSwgMl0pLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBgdGYuVGVuc29yYCB0byBzbGljZSBmcm9tLlxuICogQHBhcmFtIGJlZ2luIFRoZSBjb29yZGluYXRlcyB0byBzdGFydCB0aGUgc2xpY2UgZnJvbS4gVGhlIGxlbmd0aCBjYW4gYmVcbiAqICAgICBsZXNzIHRoYW4gdGhlIHJhbmsgb2YgeCAtIHRoZSByZXN0IG9mIHRoZSBheGVzIHdpbGwgaGF2ZSBpbXBsaWNpdCAwIGFzXG4gKiAgICAgc3RhcnQuIENhbiBhbHNvIGJlIGEgc2luZ2xlIG51bWJlciwgaW4gd2hpY2ggY2FzZSBpdCBzcGVjaWZpZXMgdGhlXG4gKiAgICAgZmlyc3QgYXhpcy5cbiAqIEBwYXJhbSBzaXplIFRoZSBzaXplIG9mIHRoZSBzbGljZS4gVGhlIGxlbmd0aCBjYW4gYmUgbGVzcyB0aGFuIHRoZSByYW5rIG9mXG4gKiAgICAgeCAtIHRoZSByZXN0IG9mIHRoZSBheGVzIHdpbGwgaGF2ZSBpbXBsaWNpdCAtMS4gQSB2YWx1ZSBvZiAtMSByZXF1ZXN0c1xuICogICAgIHRoZSByZXN0IG9mIHRoZSBkaW1lbnNpb25zIGluIHRoZSBheGlzLiBDYW4gYWxzbyBiZSBhIHNpbmdsZSBudW1iZXIsXG4gKiAgICAgaW4gd2hpY2ggY2FzZSBpdCBzcGVjaWZpZXMgdGhlIHNpemUgb2YgdGhlIGZpcnN0IGF4aXMuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnU2xpY2luZyBhbmQgSm9pbmluZyd9XG4gKi9cbmZ1bmN0aW9uIHNsaWNlXyh4LCBiZWdpbiwgc2l6ZSkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3NsaWNlJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG4gICAgaWYgKCR4LnJhbmsgPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTbGljaW5nIHNjYWxhciBpcyBub3QgcG9zc2libGUnKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBiZWdpbiwgc2l6ZSB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFNsaWNlLCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBzbGljZSA9IG9wKHsgc2xpY2VfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2xpY2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHNsaWNlIH0gZnJvbSAnLi9zbGljZSc7XG4vKipcbiAqIEV4dHJhY3RzIGEgMUQgc2xpY2UgZnJvbSAxRCBhcnJheSBzdGFydGluZyBhdCBjb29yZGluYXRlcyBgYmVnaW5gIGFuZCBpc1xuICogb2YgbGVuZ3RoIGBzaXplYC4gU2VlIGBzbGljZWAgZm9yIGRldGFpbHMuXG4gKi9cbmZ1bmN0aW9uIHNsaWNlMWRfKHgsIGJlZ2luLCBzaXplKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc2xpY2UxZCcpO1xuICAgIHV0aWwuYXNzZXJ0KCR4LnJhbmsgPT09IDEsICgpID0+IGBzbGljZTFkIGV4cGVjdHMgYSByYW5rLTEgdGVuc29yLCBidXQgZ290IGEgcmFuay0keyR4LnJhbmt9IHRlbnNvcmApO1xuICAgIHJldHVybiBzbGljZSgkeCwgW2JlZ2luXSwgW3NpemVdKTtcbn1cbmV4cG9ydCBjb25zdCBzbGljZTFkID0gb3AoeyBzbGljZTFkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNsaWNlMWQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHNsaWNlIH0gZnJvbSAnLi9zbGljZSc7XG4vKipcbiAqIEV4dHJhY3RzIGEgMkQgc2xpY2UgZnJvbSBhIDJEIGFycmF5IHN0YXJ0aW5nIGF0IGNvb3JkaW5hdGVzIGBiZWdpbmAgYW5kXG4gKiBpcyBvZiBzaXplIGBzaXplYC4gU2VlIGBzbGljZWAgZm9yIGRldGFpbHMuXG4gKi9cbmZ1bmN0aW9uIHNsaWNlMmRfKHgsIGJlZ2luLCBzaXplKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc2xpY2UyZCcpO1xuICAgIHV0aWwuYXNzZXJ0KCR4LnJhbmsgPT09IDIsICgpID0+IGBzbGljZTJkIGV4cGVjdHMgYSByYW5rLTIgdGVuc29yLCBidXQgZ290IGEgcmFuay0keyR4LnJhbmt9IHRlbnNvcmApO1xuICAgIHJldHVybiBzbGljZSgkeCwgYmVnaW4sIHNpemUpO1xufVxuZXhwb3J0IGNvbnN0IHNsaWNlMmQgPSBvcCh7IHNsaWNlMmRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2xpY2UyZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgc2xpY2UgfSBmcm9tICcuL3NsaWNlJztcbi8qKlxuICogRXh0cmFjdHMgYSAzRCBzbGljZSBmcm9tIGEgM0QgYXJyYXkgc3RhcnRpbmcgYXQgY29vcmRpbmF0ZXMgYGJlZ2luYCBhbmRcbiAqIGlzIG9mIHNpemUgYHNpemVgLiBTZWUgYHNsaWNlYCBmb3IgZGV0YWlscy5cbiAqL1xuZnVuY3Rpb24gc2xpY2UzZF8oeCwgYmVnaW4sIHNpemUpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzbGljZTNkJyk7XG4gICAgdXRpbC5hc3NlcnQoJHgucmFuayA9PT0gMywgKCkgPT4gYHNsaWNlM2QgZXhwZWN0cyBhIHJhbmstMyB0ZW5zb3IsIGJ1dCBnb3QgYSByYW5rLSR7JHgucmFua30gdGVuc29yYCk7XG4gICAgcmV0dXJuIHNsaWNlKCR4LCBiZWdpbiwgc2l6ZSk7XG59XG5leHBvcnQgY29uc3Qgc2xpY2UzZCA9IG9wKHsgc2xpY2UzZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zbGljZTNkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyBzbGljZSB9IGZyb20gJy4vc2xpY2UnO1xuLyoqXG4gKiBFeHRyYWN0cyBhIDREIHNsaWNlIGZyb20gYSA0RCBhcnJheSBzdGFydGluZyBhdCBjb29yZGluYXRlcyBgYmVnaW5gIGFuZFxuICogaXMgb2Ygc2l6ZSBgc2l6ZWAuIFNlZSBgc2xpY2VgIGZvciBkZXRhaWxzLlxuICovXG5mdW5jdGlvbiBzbGljZTRkXyh4LCBiZWdpbiwgc2l6ZSkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3NsaWNlNGQnKTtcbiAgICB1dGlsLmFzc2VydCgkeC5yYW5rID09PSA0LCAoKSA9PiBgc2xpY2U0ZCBleHBlY3RzIGEgcmFuay00IHRlbnNvciwgYnV0IGdvdCBhIHJhbmstJHskeC5yYW5rfSB0ZW5zb3JgKTtcbiAgICByZXR1cm4gc2xpY2UoJHgsIGJlZ2luLCBzaXplKTtcbn1cbmV4cG9ydCBjb25zdCBzbGljZTRkID0gb3AoeyBzbGljZTRkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNsaWNlNGQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRQYXJhbXNWYWxpZChpbnB1dCwgYmVnaW4sIHNpemUpIHtcbiAgICBjb25zdCBpbnB1dFJhbmsgPSBpbnB1dC5zaGFwZS5sZW5ndGg7XG4gICAgdXRpbC5hc3NlcnQoaW5wdXRSYW5rID09PSBiZWdpbi5sZW5ndGgsICgpID0+IGBFcnJvciBpbiBzbGljZSR7aW5wdXRSYW5rfUQ6IExlbmd0aCBvZiBiZWdpbiAke2JlZ2lufSBtdXN0IGAgK1xuICAgICAgICBgbWF0Y2ggdGhlIHJhbmsgb2YgdGhlIGFycmF5ICgke2lucHV0UmFua30pLmApO1xuICAgIHV0aWwuYXNzZXJ0KGlucHV0UmFuayA9PT0gc2l6ZS5sZW5ndGgsICgpID0+IGBFcnJvciBpbiBzbGljZSR7aW5wdXRSYW5rfUQ6IExlbmd0aCBvZiBzaXplICR7c2l6ZX0gbXVzdCBgICtcbiAgICAgICAgYG1hdGNoIHRoZSByYW5rIG9mIHRoZSBhcnJheSAoJHtpbnB1dFJhbmt9KS5gKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0UmFuazsgKytpKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KGJlZ2luW2ldICsgc2l6ZVtpXSA8PSBpbnB1dC5zaGFwZVtpXSwgKCkgPT4gYEVycm9yIGluIHNsaWNlJHtpbnB1dFJhbmt9RDogYmVnaW5bJHtpfV0gKyBzaXplWyR7aX1dIGAgK1xuICAgICAgICAgICAgYCgke2JlZ2luW2ldICsgc2l6ZVtpXX0pIHdvdWxkIG92ZXJmbG93IGlucHV0LnNoYXBlWyR7aX1dICgke2lucHV0LnNoYXBlW2ldfSlgKTtcbiAgICB9XG59XG4vKiogQ29udmVydHMgYSBiaW5hcnkgbWFzayB0byBhbiBhcnJheSBvZiBheGVzLiBVc2VkIGluIHN0cmlkZWRTbGljZSgpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hc2tUb0F4ZXMobWFzaykge1xuICAgIGNvbnN0IGF4ZXMgPSBbXTtcbiAgICBsZXQgYXhpcyA9IDA7XG4gICAgd2hpbGUgKG1hc2sgPiAwKSB7XG4gICAgICAgIGlmIChtYXNrICYgMSkge1xuICAgICAgICAgICAgYXhlcy5wdXNoKGF4aXMpO1xuICAgICAgICB9XG4gICAgICAgIG1hc2sgLz0gMjtcbiAgICAgICAgYXhpcysrO1xuICAgIH1cbiAgICByZXR1cm4gYXhlcztcbn1cbi8qKiBDb21wdXRlcyB0aGUgb3V0cHV0IHNoYXBlIGdpdmVuIHRoZSBzdHJpZGVkIHNsaWNlIHBhcmFtcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlT3V0U2hhcGUoYmVnaW4sIGVuZCwgc3RyaWRlcykge1xuICAgIGNvbnN0IHNpemUgPSBbXTtcbiAgICBmb3IgKGxldCBheGlzID0gMDsgYXhpcyA8IGJlZ2luLmxlbmd0aDsgYXhpcysrKSB7XG4gICAgICAgIHNpemVbYXhpc10gPSBNYXRoLmNlaWwoKGVuZFtheGlzXSAtIGJlZ2luW2F4aXNdKSAvIHN0cmlkZXNbYXhpc10pO1xuICAgIH1cbiAgICByZXR1cm4gc2l6ZTtcbn1cbi8vIENyZWF0ZXMgZnVsbCBzZWxlY3Rpb24gYXQgdGhlIGVsaWRlZCBkaW1lbnNpb25zLiBJZiB0aGUgZGltZW5zaW9uIG1hdGNoZXNcbi8vIHRoZSBlbGxpcHNpcyBtYXNrLCBvdmVycmlkZSB0aGUgY3VycmVudCBzdHJpZGUgdmFsdWUuIE90aGVyd2lzZSwgaW5zZXJ0LlxuZXhwb3J0IGZ1bmN0aW9uIHN0cmlkZXNXaXRoRWxpZGVkRGltcyhzdHJpZGVzLCBlbGxpcHNpc0luc2VydGlvbkluZGV4LCBudW1FbGlkZWRBeGVzLCBpbnB1dFNoYXBlKSB7XG4gICAgY29uc3QgbmV3U3RyaWRlcyA9IFsuLi5zdHJpZGVzXTtcbiAgICBmb3IgKGxldCBpID0gbmV3U3RyaWRlcy5sZW5ndGg7IGkgPCBpbnB1dFNoYXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG5ld1N0cmlkZXMucHVzaCgxKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1FbGlkZWRBeGVzOyBpKyspIHtcbiAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAgIG5ld1N0cmlkZXNbZWxsaXBzaXNJbnNlcnRpb25JbmRleF0gPSAxO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbmV3U3RyaWRlcy5zcGxpY2UoZWxsaXBzaXNJbnNlcnRpb25JbmRleCwgMCAvKiBudW0gZWxlbWVudHMgdG8gZGVsZXRlICovLCAxIC8qIGVsZW1lbnQgdG8gYWRkICovKTtcbiAgICAgICAgICAgIG5ld1N0cmlkZXMucG9wKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ld1N0cmlkZXM7XG59XG5mdW5jdGlvbiB1bm5vcm1hbGl6ZUF4aXMoZWxsaXBzaXNJbnNlcnRpb25JbmRleCwgbnVtRWxpZGVkQXhlcywgbm9ybWFsaXplZEF4aXMpIHtcbiAgICBpZiAobm9ybWFsaXplZEF4aXMgPD0gZWxsaXBzaXNJbnNlcnRpb25JbmRleCkge1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplZEF4aXM7XG4gICAgfVxuICAgIHJldHVybiBub3JtYWxpemVkQXhpcyAtIChudW1FbGlkZWRBeGVzIC0gMSk7XG59XG5mdW5jdGlvbiBnZXRFbGlkZWRBeGVzKG51bUVsaWRlZEF4ZXMsIGVsbGlwc2lzSW5zZXJ0aW9uSW5kZXgpIHtcbiAgICBjb25zdCBlbGlkZWRBeGVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1FbGlkZWRBeGVzOyBpKyspIHtcbiAgICAgICAgZWxpZGVkQXhlcy5wdXNoKGVsbGlwc2lzSW5zZXJ0aW9uSW5kZXggKyBpKTtcbiAgICB9XG4gICAgcmV0dXJuIGVsaWRlZEF4ZXM7XG59XG4vLyBOb3JtYWxpemUgdGhlIHN0YXJ0LCBlbmQgYW5kIHN0cmlkZXMuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Tm9ybWFsaXplZEF4ZXMoaW5wdXRTaGFwZSwgZWxsaXBzaXNBeGVzLCBudW1JbnRlcnBvbGF0ZWRBeGVzLCBiZWdpbiwgZW5kLCBzdHJpZGVzLCBiZWdpbk1hc2ssIGVuZE1hc2ssIGVsbGlwc2lzTWFzaykge1xuICAgIGNvbnN0IGlucHV0UmFuayA9IGlucHV0U2hhcGUubGVuZ3RoO1xuICAgIGxldCBub3JtYWxpemVkQmVnaW4gPSBuZXcgQXJyYXkoaW5wdXRSYW5rKSwgbm9ybWFsaXplZEVuZCA9IG5ldyBBcnJheShpbnB1dFJhbmspLCBub3JtYWxpemVkU3RyaWRlcyA9IG5ldyBBcnJheShpbnB1dFJhbmspO1xuICAgIGlmIChlbGxpcHNpc0F4ZXMubGVuZ3RoICYmIG51bUludGVycG9sYXRlZEF4ZXMgPiAwKSB7XG4gICAgICAgIGNvbnN0IGZ1bGxJbmRleCA9IGVsbGlwc2lzQXhlc1swXTtcbiAgICAgICAgLy8gVGhlIGVsbGlwc2lzIGFwcGxpZXMgdG8gdGhlIG1hc2tlZCBpbmRleCBhcyB3ZWxsIGFzIGFueSBkaW1lbnNpb25zXG4gICAgICAgIC8vIHRoYXQgYXJlIGludGVycG9sYXRlZC5cbiAgICAgICAgY29uc3QgbnVtRWxpZGVkQXhlcyA9IG51bUludGVycG9sYXRlZEF4ZXMgKyAxO1xuICAgICAgICBub3JtYWxpemVkQmVnaW4gPSBzdGFydEluZGljZXNXaXRoRWxpZGVkRGltcyhiZWdpbk1hc2ssIGZ1bGxJbmRleCwgbnVtRWxpZGVkQXhlcywgYmVnaW4sIGlucHV0U2hhcGUpO1xuICAgICAgICBub3JtYWxpemVkRW5kID0gc3RvcEluZGljZXNXaXRoRWxpZGVkRGltcyhlbmRNYXNrLCBmdWxsSW5kZXgsIG51bUVsaWRlZEF4ZXMsIGVuZCwgaW5wdXRTaGFwZSk7XG4gICAgICAgIG5vcm1hbGl6ZWRTdHJpZGVzID1cbiAgICAgICAgICAgIHN0cmlkZXNXaXRoRWxpZGVkRGltcyhzdHJpZGVzLCBmdWxsSW5kZXgsIG51bUVsaWRlZEF4ZXMsIGlucHV0U2hhcGUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZm9yIChsZXQgYXhpcyA9IDA7IGF4aXMgPCBpbnB1dFJhbms7IGF4aXMrKykge1xuICAgICAgICAgICAgbm9ybWFsaXplZEJlZ2luW2F4aXNdID0gc3RhcnRGb3JBeGlzKGJlZ2luTWFzaywgYmVnaW4sIHN0cmlkZXMsIGlucHV0U2hhcGUsIGF4aXMsIGVsbGlwc2lzTWFzayk7XG4gICAgICAgICAgICBub3JtYWxpemVkRW5kW2F4aXNdID1cbiAgICAgICAgICAgICAgICBzdG9wRm9yQXhpcyhlbmRNYXNrLCBlbmQsIHN0cmlkZXMsIGlucHV0U2hhcGUsIGF4aXMsIGVsbGlwc2lzTWFzayk7XG4gICAgICAgICAgICBub3JtYWxpemVkU3RyaWRlc1theGlzXSA9IHN0cmlkZXNGb3JBeGlzKHN0cmlkZXMsIGF4aXMsIGVsbGlwc2lzTWFzayk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYmVnaW46IG5vcm1hbGl6ZWRCZWdpbixcbiAgICAgICAgZW5kOiBub3JtYWxpemVkRW5kLFxuICAgICAgICBzdHJpZGVzOiBub3JtYWxpemVkU3RyaWRlc1xuICAgIH07XG59XG4vLyBDcmVhdGVzIGZ1bGwgc2VsZWN0aW9uIGF0IHRoZSBlbGlkZWQgZGltZW5zaW9ucy4gSWYgdGhlIGRpbWVuc2lvbiBtYXRjaGVzXG4vLyB0aGUgZWxsaXBzaXMgbWFzaywgb3ZlcnJpZGUgdGhlIGN1cnJlbnQgc3RhcnQgdmFsdWUuIE90aGVyd2lzZSwgaW5zZXJ0LlxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0SW5kaWNlc1dpdGhFbGlkZWREaW1zKGJlZ2luTWFzaywgZWxsaXBzaXNJbnNlcnRpb25JbmRleCwgbnVtRWxpZGVkQXhlcywgb3JpZ2luYWxCZWdpbiwgaW5wdXRTaGFwZSkge1xuICAgIGNvbnN0IG5ld0luZGljZXMgPSBbLi4uaW5wdXRTaGFwZV07XG4gICAgY29uc3QgZWxpZGVkQXhlcyA9IGdldEVsaWRlZEF4ZXMobnVtRWxpZGVkQXhlcywgZWxsaXBzaXNJbnNlcnRpb25JbmRleCk7XG4gICAgZm9yIChsZXQgYXhpcyA9IDA7IGF4aXMgPCBuZXdJbmRpY2VzLmxlbmd0aDsgYXhpcysrKSB7XG4gICAgICAgIGlmIChlbGlkZWRBeGVzLmluZGV4T2YoYXhpcykgPiAtMSkge1xuICAgICAgICAgICAgbmV3SW5kaWNlc1theGlzXSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbEF4aXMgPSB1bm5vcm1hbGl6ZUF4aXMoZWxsaXBzaXNJbnNlcnRpb25JbmRleCwgbnVtRWxpZGVkQXhlcywgYXhpcyk7XG4gICAgICAgICAgICBsZXQgb3JpZ2luYWxWYWx1ZSA9IG9yaWdpbmFsQmVnaW5bb3JpZ2luYWxBeGlzXTtcbiAgICAgICAgICAgIGlmIChiZWdpbk1hc2sgJiAxIDw8IG9yaWdpbmFsQXhpcykge1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsVmFsdWUgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV3SW5kaWNlc1theGlzXSA9IG9yaWdpbmFsVmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ld0luZGljZXM7XG59XG4vLyBDcmVhdGVzIGZ1bGwgc2VsZWN0aW9uIGF0IHRoZSBlbGlkZWQgZGltZW5zaW9ucy4gSWYgdGhlIGRpbWVuc2lvbiBtYXRjaGVzXG4vLyB0aGUgZWxsaXBzaXMgbWFzaywgb3ZlcnJpZGUgdGhlIGN1cnJlbnQgc3RvcCB2YWx1ZS4gT3RoZXJ3aXNlLCBpbnNlcnQuXG5leHBvcnQgZnVuY3Rpb24gc3RvcEluZGljZXNXaXRoRWxpZGVkRGltcyhlbmRNYXNrLCBlbGxpcHNpc0luc2VydGlvbkluZGV4LCBudW1FbGlkZWRBeGVzLCBvcmlnaW5hbEVuZCwgaW5wdXRTaGFwZSkge1xuICAgIGNvbnN0IG5ld0luZGljZXMgPSBbLi4uaW5wdXRTaGFwZV07XG4gICAgY29uc3QgZWxpZGVkQXhlcyA9IGdldEVsaWRlZEF4ZXMobnVtRWxpZGVkQXhlcywgZWxsaXBzaXNJbnNlcnRpb25JbmRleCk7XG4gICAgZm9yIChsZXQgYXhpcyA9IDA7IGF4aXMgPCBuZXdJbmRpY2VzLmxlbmd0aDsgYXhpcysrKSB7XG4gICAgICAgIGlmIChlbGlkZWRBeGVzLmluZGV4T2YoYXhpcykgPiAtMSkge1xuICAgICAgICAgICAgbmV3SW5kaWNlc1theGlzXSA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxBeGlzID0gdW5ub3JtYWxpemVBeGlzKGVsbGlwc2lzSW5zZXJ0aW9uSW5kZXgsIG51bUVsaWRlZEF4ZXMsIGF4aXMpO1xuICAgICAgICAgICAgbGV0IG9yaWdpbmFsVmFsdWUgPSBvcmlnaW5hbEVuZFtvcmlnaW5hbEF4aXNdO1xuICAgICAgICAgICAgaWYgKGVuZE1hc2sgJiAxIDw8IG9yaWdpbmFsQXhpcykge1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsVmFsdWUgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5ld0luZGljZXNbYXhpc10gPSBvcmlnaW5hbFZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3SW5kaWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyBIYW5kbGUgbmVnYXRpdmUgaW5kaWNlc1xuICAgICAgICBjb25zdCBheGlzU2l6ZSA9IGlucHV0U2hhcGVbaV07XG4gICAgICAgIGlmIChuZXdJbmRpY2VzW2ldIDwgMCkge1xuICAgICAgICAgICAgbmV3SW5kaWNlc1tpXSArPSBheGlzU2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBuZXdJbmRpY2VzW2ldID0gdXRpbC5jbGFtcCgwLCBuZXdJbmRpY2VzW2ldLCBpbnB1dFNoYXBlW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld0luZGljZXM7XG59XG5leHBvcnQgZnVuY3Rpb24gc3RyaWRlc0ZvckF4aXMoc3RyaWRlcywgYXhpcywgZWxsaXBzaXNNYXNrKSB7XG4gICAgbGV0IHN0cmlkZSA9IHN0cmlkZXNbYXhpc107XG4gICAgaWYgKGVsbGlwc2lzTWFzayAmICgxIDw8IGF4aXMpIHx8IHN0cmlkZSA9PSBudWxsKSB7XG4gICAgICAgIHN0cmlkZSA9IDE7XG4gICAgfVxuICAgIHJldHVybiBzdHJpZGU7XG59XG5leHBvcnQgZnVuY3Rpb24gc3RhcnRGb3JBeGlzKGJlZ2luTWFzaywgc3RhcnRJbmRpY2VzLCBzdHJpZGVzLCBpbnB1dFNoYXBlLCBheGlzLCBlbGxpcHNpc01hc2spIHtcbiAgICAvLyBCZWdpbiB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXhcbiAgICBsZXQgc3RhcnQgPSBzdGFydEluZGljZXNbYXhpc107XG4gICAgY29uc3Qgc3RyaWRlID0gc3RyaWRlc1theGlzXSB8fCAxO1xuICAgIC8vIENoZWNrIHRoZSBheGlzIGJpdCBmcm9tIHJpZ2h0IG9mIG1hc2tlZCBheGVzLCBvciB0aGUgYmVnaW4gaW5kZXggaXMgbm90IHNldFxuICAgIC8vIGZvciB0aGUgYXhpcy5cbiAgICBpZiAoYmVnaW5NYXNrICYgMSA8PCBheGlzIHx8IGVsbGlwc2lzTWFzayAmIDEgPDwgYXhpcyB8fCBzdGFydCA9PSBudWxsKSB7XG4gICAgICAgIGlmIChzdHJpZGUgPiAwKSB7XG4gICAgICAgICAgICAvLyBGb3J3YXJkIGl0ZXJhdGlvbiAtIHVzZSB0aGUgZmlyc3QgZWxlbWVudC4gVGhlc2UgdmFsdWVzIHdpbGwgZ2V0XG4gICAgICAgICAgICAvLyBjbGFtcGVkIGJlbG93IChOb3RlOiBXZSBjb3VsZCBoYXZlIHNldCB0aGVtIHRvIDAgYW5kIGF4aXNfc2l6ZS0xLCBidXRcbiAgICAgICAgICAgIC8vIHVzZSBsb3dlc3QoKSBhbmQgbWF4KCkgdG8gbWFpbnRhaW4gc3ltbWV0cnkgd2l0aCBTdG9wRm9yQXhpcygpKVxuICAgICAgICAgICAgc3RhcnQgPSBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIEJhY2t3YXJkIGl0ZXJhdGlvbiAtIHVzZSB0aGUgbGFzdCBlbGVtZW50LlxuICAgICAgICAgICAgc3RhcnQgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBIYW5kbGUgbmVnYXRpdmUgaW5kaWNlc1xuICAgIGNvbnN0IGF4aXNTaXplID0gaW5wdXRTaGFwZVtheGlzXTtcbiAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgIHN0YXJ0ICs9IGF4aXNTaXplO1xuICAgIH1cbiAgICAvLyBDbGFtcGluZ1xuICAgIHN0YXJ0ID0gdXRpbC5jbGFtcCgwLCBzdGFydCwgYXhpc1NpemUgLSAxKTtcbiAgICByZXR1cm4gc3RhcnQ7XG59XG5leHBvcnQgZnVuY3Rpb24gc3RvcEZvckF4aXMoZW5kTWFzaywgc3RvcEluZGljZXMsIHN0cmlkZXMsIGlucHV0U2hhcGUsIGF4aXMsIGVsbGlwc2lzTWFzaykge1xuICAgIC8vIEJlZ2luIHdpdGggdGhlIHNwZWNpZmllZCBpbmRleFxuICAgIGxldCBzdG9wID0gc3RvcEluZGljZXNbYXhpc107XG4gICAgY29uc3Qgc3RyaWRlID0gc3RyaWRlc1theGlzXSB8fCAxO1xuICAgIC8vIENoZWNrIHRoZSBheGlzIGJpdCBmcm9tIHJpZ2h0IG9mIG1hc2tlZCBheGVzLCBvciBpZiB0aGUgc3RvcCBpbmRleCBpcyBub3RcbiAgICAvLyBzZXQgZm9yIHRoaXMgYXhpcy5cbiAgICBpZiAoZW5kTWFzayAmICgxIDw8IGF4aXMpIHx8IGVsbGlwc2lzTWFzayAmICgxIDw8IGF4aXMpIHx8IHN0b3AgPT0gbnVsbCkge1xuICAgICAgICBpZiAoc3RyaWRlID4gMCkge1xuICAgICAgICAgICAgLy8gRm9yd2FyZCBpdGVyYXRpb24gLSB1c2UgdGhlIGxhc3QgZWxlbWVudC4gVGhlc2UgdmFsdWVzIHdpbGwgZ2V0XG4gICAgICAgICAgICAvLyBjbGFtcGVkIGJlbG93XG4gICAgICAgICAgICBzdG9wID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBCYWNrd2FyZCBpdGVyYXRpb24gLSB1c2UgdGhlIGZpcnN0IGVsZW1lbnQuXG4gICAgICAgICAgICBzdG9wID0gTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gSGFuZGxlIG5lZ2F0aXZlIGluZGljZXNcbiAgICBjb25zdCBheGlzU2l6ZSA9IGlucHV0U2hhcGVbYXhpc107XG4gICAgaWYgKHN0b3AgPCAwKSB7XG4gICAgICAgIHN0b3AgKz0gYXhpc1NpemU7XG4gICAgfVxuICAgIC8vIENsYW1waW5nXG4gICAgLy8gQmVjYXVzZSB0aGUgZW5kIGluZGV4IHBvaW50cyBvbmUgcGFzdCB0aGUgbGFzdCBlbGVtZW50LCB3ZSBuZWVkIHNsaWdodGx5XG4gICAgLy8gZGlmZmVyZW50IGNsYW1waW5nIHJhbmdlcyBkZXBlbmRpbmcgb24gdGhlIGRpcmVjdGlvbi5cbiAgICBpZiAoc3RyaWRlID4gMCkge1xuICAgICAgICAvLyBGb3J3YXJkIGl0ZXJhdGlvblxuICAgICAgICBzdG9wID0gdXRpbC5jbGFtcCgwLCBzdG9wLCBheGlzU2l6ZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBCYWNrd2FyZCBpdGVyYXRpb25cbiAgICAgICAgc3RvcCA9IHV0aWwuY2xhbXAoLTEsIHN0b3AsIGF4aXNTaXplIC0gMSk7XG4gICAgfVxuICAgIHJldHVybiBzdG9wO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNsaWNlIG9jY3VwaWVzIGEgY29udGlub3VzIHNldCBvZiBlbGVtZW50cyBpbiB0aGVcbiAqICdmbGF0JyBzcGFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2xpY2VDb250aW5vdXMoc2hhcGUsIGJlZ2luLCBzaXplKSB7XG4gICAgLy8gSW5kZXggb2YgdGhlIGZpcnN0IGF4aXMgdGhhdCBoYXMgc2l6ZSA+IDEuXG4gICAgbGV0IGZpcnN0Tm9uT25lQXhpcyA9IHNpemUubGVuZ3RoO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoc2l6ZVtpXSA+IDEpIHtcbiAgICAgICAgICAgIGZpcnN0Tm9uT25lQXhpcyA9IGk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCBpID0gZmlyc3ROb25PbmVBeGlzICsgMTsgaSA8IHNpemUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGJlZ2luW2ldID4gMCB8fCBzaXplW2ldICE9PSBzaGFwZVtpXSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVGbGF0T2Zmc2V0KGJlZ2luLCBzdHJpZGVzKSB7XG4gICAgbGV0IGZsYXRPZmZzZXQgPSBiZWdpbi5sZW5ndGggPiAwID8gYmVnaW5bYmVnaW4ubGVuZ3RoIC0gMV0gOiAxO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmVnaW4ubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIGZsYXRPZmZzZXQgKz0gYmVnaW5baV0gKiBzdHJpZGVzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gZmxhdE9mZnNldDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNsaWNlUGFyYW1zKHgsIGJlZ2luLCBzaXplKSB7XG4gICAgLy8gVGhlIGZvbGxvd2luZyBsb2dpYyBhbGxvd3MgZm9yIG1vcmUgZXJnb25vbWljIGNhbGxzLlxuICAgIGxldCBiZWdpbl87XG4gICAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcbiAgICBpZiAodHlwZW9mIGJlZ2luID09PSAnbnVtYmVyJykge1xuICAgICAgICBiZWdpbl8gPSBbYmVnaW4sIC4uLm5ldyBBcnJheSh4UmFuayAtIDEpLmZpbGwoMCldO1xuICAgIH1cbiAgICBlbHNlIGlmIChiZWdpbi5sZW5ndGggPCB4UmFuaykge1xuICAgICAgICBiZWdpbl8gPSBiZWdpbi5jb25jYXQobmV3IEFycmF5KHhSYW5rIC0gYmVnaW4ubGVuZ3RoKS5maWxsKDApKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGJlZ2luXyA9IGJlZ2luLnNsaWNlKCk7XG4gICAgfVxuICAgIGJlZ2luXy5mb3JFYWNoKGQgPT4ge1xuICAgICAgICB1dGlsLmFzc2VydChkICE9PSAtMSwgKCkgPT4gJ3NsaWNlKCkgZG9lcyBub3Qgc3VwcG9ydCBuZWdhdGl2ZSBiZWdpbiBpbmRleGluZy4nKTtcbiAgICB9KTtcbiAgICBsZXQgc2l6ZV87XG4gICAgaWYgKHNpemUgPT0gbnVsbCkge1xuICAgICAgICBzaXplXyA9IG5ldyBBcnJheSh4UmFuaykuZmlsbCgtMSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBzaXplID09PSAnbnVtYmVyJykge1xuICAgICAgICBzaXplXyA9IFtzaXplLCAuLi5uZXcgQXJyYXkoeFJhbmsgLSAxKS5maWxsKC0xKV07XG4gICAgfVxuICAgIGVsc2UgaWYgKHNpemUubGVuZ3RoIDwgeFJhbmspIHtcbiAgICAgICAgc2l6ZV8gPSBzaXplLmNvbmNhdChuZXcgQXJyYXkoeFJhbmsgLSBzaXplLmxlbmd0aCkuZmlsbCgtMSkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgc2l6ZV8gPSBzaXplO1xuICAgIH1cbiAgICBzaXplXyA9IHNpemVfLm1hcCgoZCwgaSkgPT4ge1xuICAgICAgICBpZiAoZCA+PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHV0aWwuYXNzZXJ0KGQgPT09IC0xLCAoKSA9PiBgTmVnYXRpdmUgc2l6ZSB2YWx1ZXMgc2hvdWxkIGJlIGV4YWN0bHkgLTEgYnV0IGdvdCBgICtcbiAgICAgICAgICAgICAgICBgJHtkfSBmb3IgdGhlIHNsaWNlKCkgc2l6ZSBhdCBpbmRleCAke2l9LmApO1xuICAgICAgICAgICAgcmV0dXJuIHguc2hhcGVbaV0gLSBiZWdpbl9baV07XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gW2JlZ2luXywgc2l6ZV9dO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNsaWNlSW5mbyh4U2hhcGUsIGJlZ2luLCBlbmQsIHN0cmlkZXMsIGJlZ2luTWFzaywgZW5kTWFzaywgZWxsaXBzaXNNYXNrLCBuZXdBeGlzTWFzaywgc2hyaW5rQXhpc01hc2spIHtcbiAgICAvLyBtYWtlIGEgY29weSBiZWNhdXNlIGl0IG1heSBiZSBtb2RpZmllZCBmdXJ0aGVyIGRvd24uXG4gICAgbGV0ICRiZWdpbiA9IGJlZ2luLnNsaWNlKCk7XG4gICAgbGV0ICRlbmQgPSBlbmQuc2xpY2UoKTtcbiAgICBsZXQgJHN0cmlkZXMgPSBzdHJpZGVzO1xuICAgIGlmIChzdHJpZGVzID09IG51bGwpIHtcbiAgICAgICAgJHN0cmlkZXMgPSBuZXcgQXJyYXkoJGJlZ2luLmxlbmd0aCk7XG4gICAgfVxuICAgIGNvbnN0IGVsbGlwc2lzQXhlcyA9IG1hc2tUb0F4ZXMoZWxsaXBzaXNNYXNrKTtcbiAgICBpZiAoZWxsaXBzaXNBeGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNdWx0aXBsZSBlbGxpcHNlcyBpbiBzbGljZSBpcyBub3QgYWxsb3dlZC4nKTtcbiAgICB9XG4gICAgaWYgKGVsbGlwc2lzTWFzayAhPT0gMCAmJiBuZXdBeGlzTWFzayAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzaW5nIGJvdGggZWxsaXBzaXNNYXNrIGFuZCBuZXdBeGlzTWFzayBpcyBub3QgeWV0IHN1cHBvcnRlZC4nKTtcbiAgICB9XG4gICAgaWYgKGVsbGlwc2lzTWFzayAhPT0gMCAmJiBzaHJpbmtBeGlzTWFzayAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzaW5nIGJvdGggZWxsaXBzaXNNYXNrIGFuZCBzaHJpbmtBeGlzTWFzayBpcyBub3QgeWV0IHN1cHBvcnRlZC4nKTtcbiAgICB9XG4gICAgY29uc3QgbnVtSW50ZXJwb2xhdGVkQXhlcyA9IHhTaGFwZS5sZW5ndGggLSAkYmVnaW4ubGVuZ3RoO1xuICAgIC8vIEV4cGFuZCB0aGUgZGltcyBvZiB4IGJhc2VkIG9uIHRoZSBuZXdBeGlzTWFzay5cbiAgICBjb25zdCBleHBhbmRBeGVzID0gbWFza1RvQXhlcyhuZXdBeGlzTWFzayk7XG4gICAgY29uc3QgbmV3U2hhcGUgPSB4U2hhcGUuc2xpY2UoKTtcbiAgICBleHBhbmRBeGVzLmZvckVhY2goYXhpcyA9PiB7XG4gICAgICAgICRiZWdpbltheGlzXSA9IDA7XG4gICAgICAgICRlbmRbYXhpc10gPSAxO1xuICAgICAgICBuZXdTaGFwZS5zcGxpY2UoYXhpcywgMCwgMSk7XG4gICAgfSk7XG4gICAgY29uc3QgeyBiZWdpbjogbm9ybWFsaXplZEJlZ2luLCBlbmQ6IG5vcm1hbGl6ZWRFbmQsIHN0cmlkZXM6IG5vcm1hbGl6ZWRTdHJpZGVzIH0gPSBnZXROb3JtYWxpemVkQXhlcyhuZXdTaGFwZSwgZWxsaXBzaXNBeGVzLCBudW1JbnRlcnBvbGF0ZWRBeGVzLCAkYmVnaW4sICRlbmQsICRzdHJpZGVzLCBiZWdpbk1hc2ssIGVuZE1hc2ssIGVsbGlwc2lzTWFzayk7XG4gICAgJGJlZ2luID0gbm9ybWFsaXplZEJlZ2luO1xuICAgICRlbmQgPSBub3JtYWxpemVkRW5kO1xuICAgICRzdHJpZGVzID0gbm9ybWFsaXplZFN0cmlkZXM7XG4gICAgY29uc3Qgc2hyaW5rQXhlcyA9IG1hc2tUb0F4ZXMoc2hyaW5rQXhpc01hc2spO1xuICAgIC8vIEFkanVzdCB0aGUgZW5kcyBiYXNlZCBvbiB0aGUgc2hyaW5rIG1hc2suXG4gICAgc2hyaW5rQXhlcy5mb3JFYWNoKGF4aXMgPT4ge1xuICAgICAgICAkZW5kW2F4aXNdID0gJGJlZ2luW2F4aXNdICsgMTtcbiAgICAgICAgJHN0cmlkZXNbYXhpc10gPSAxO1xuICAgIH0pO1xuICAgIC8vIEZpZ3VyZSBvdXQgdGhlIG91dHB1dCBzaGFwZS5cbiAgICBjb25zdCBzaXplID0gY29tcHV0ZU91dFNoYXBlKCRiZWdpbiwgJGVuZCwgJHN0cmlkZXMpO1xuICAgIC8vIFJlbW92ZSB0aGUgYXhlcyBiYXNlZCBvbiBzaHJpbmtNYXNrLlxuICAgIGNvbnN0IG91dFNoYXBlID0gc2l6ZS5maWx0ZXIoKF8sIGF4aXMpID0+IHNocmlua0F4ZXMuaW5kZXhPZihheGlzKSA9PT0gLTEpO1xuICAgIGNvbnN0IG5vblN0cmlkZWQgPSAkc3RyaWRlcy5ldmVyeSh2ID0+IHYgPT09IDEpO1xuICAgIHJldHVybiB7IG5vblN0cmlkZWQsICRiZWdpbiwgJGVuZCwgJHN0cmlkZXMsIHNpemUsIG5ld1NoYXBlLCBvdXRTaGFwZSB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2xpY2VfdXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgU29mdG1heCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBzb2Z0bWF4IG5vcm1hbGl6ZWQgdmVjdG9yIGdpdmVuIHRoZSBsb2dpdHMuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICpcbiAqIGEuc29mdG1heCgpLnByaW50KCk7ICAvLyBvciB0Zi5zb2Z0bWF4KGEpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjJkKFsyLCA0LCA2LCAxLCAyLCAzXSwgWzIsIDNdKTtcbiAqXG4gKiBhLnNvZnRtYXgoKS5wcmludCgpOyAgLy8gb3IgdGYuc29mdG1heChhKVxuICogYGBgXG4gKlxuICogQHBhcmFtIGxvZ2l0cyBUaGUgbG9naXRzIGFycmF5LlxuICogQHBhcmFtIGRpbSBUaGUgZGltZW5zaW9uIHNvZnRtYXggd291bGQgYmUgcGVyZm9ybWVkIG9uLiBEZWZhdWx0cyB0byBgLTFgXG4gKiAgICAgd2hpY2ggaW5kaWNhdGVzIHRoZSBsYXN0IGRpbWVuc2lvbi5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdOb3JtYWxpemF0aW9uJ31cbiAqL1xuZnVuY3Rpb24gc29mdG1heF8obG9naXRzLCBkaW0gPSAtMSkge1xuICAgIGNvbnN0ICRsb2dpdHMgPSBjb252ZXJ0VG9UZW5zb3IobG9naXRzLCAnbG9naXRzJywgJ3NvZnRtYXgnLCAnZmxvYXQzMicpO1xuICAgIGlmIChkaW0gPT09IC0xKSB7XG4gICAgICAgIGRpbSA9ICRsb2dpdHMucmFuayAtIDE7XG4gICAgfVxuICAgIGlmIChkaW0gIT09ICRsb2dpdHMucmFuayAtIDEpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJ1NvZnRtYXggYWxvbmcgYSBub24tbGFzdCBkaW1lbnNpb24gaXMgbm90IHlldCBzdXBwb3J0ZWQuICcgK1xuICAgICAgICAgICAgYExvZ2l0cyB3YXMgcmFuayAkeyRsb2dpdHMucmFua30gYW5kIGRpbSB3YXMgJHtkaW19YCk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0cyA9IHsgbG9naXRzOiAkbG9naXRzIH07XG4gICAgY29uc3QgYXR0cnMgPSB7IGRpbSB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFNvZnRtYXgsIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IHNvZnRtYXggPSBvcCh7IHNvZnRtYXhfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c29mdG1heC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgU29mdHBsdXMgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBzb2Z0cGx1cyBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOiBgbG9nKGV4cCh4KSArIDEpYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzAsIDEsIC0xLCAuN10pO1xuICpcbiAqIHguc29mdHBsdXMoKS5wcmludCgpOyAgLy8gb3IgdGYuc29mdHBsdXMoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gc29mdHBsdXNfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzb2Z0cGx1cycpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChTb2Z0cGx1cywgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBzb2Z0cGx1cyA9IG9wKHsgc29mdHBsdXNfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c29mdHBsdXMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFNwYWNlVG9CYXRjaE5EIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIFRoaXMgb3BlcmF0aW9uIGRpdmlkZXMgXCJzcGF0aWFsXCIgZGltZW5zaW9ucyBgWzEsIC4uLiwgTV1gIG9mIHRoZSBpbnB1dCBpbnRvXG4gKiBhIGdyaWQgb2YgYmxvY2tzIG9mIHNoYXBlIGBibG9ja1NoYXBlYCwgYW5kIGludGVybGVhdmVzIHRoZXNlIGJsb2NrcyB3aXRoXG4gKiB0aGUgXCJiYXRjaFwiIGRpbWVuc2lvbiAoMCkgc3VjaCB0aGF0IGluIHRoZSBvdXRwdXQsIHRoZSBzcGF0aWFsXG4gKiBkaW1lbnNpb25zIGBbMSwgLi4uLCBNXWAgY29ycmVzcG9uZCB0byB0aGUgcG9zaXRpb24gd2l0aGluIHRoZSBncmlkLFxuICogYW5kIHRoZSBiYXRjaCBkaW1lbnNpb24gY29tYmluZXMgYm90aCB0aGUgcG9zaXRpb24gd2l0aGluIGEgc3BhdGlhbCBibG9ja1xuICogYW5kIHRoZSBvcmlnaW5hbCBiYXRjaCBwb3NpdGlvbi4gUHJpb3IgdG8gZGl2aXNpb24gaW50byBibG9ja3MsXG4gKiB0aGUgc3BhdGlhbCBkaW1lbnNpb25zIG9mIHRoZSBpbnB1dCBhcmUgb3B0aW9uYWxseSB6ZXJvIHBhZGRlZFxuICogYWNjb3JkaW5nIHRvIGBwYWRkaW5nc2AuIFNlZSBiZWxvdyBmb3IgYSBwcmVjaXNlIGRlc2NyaXB0aW9uLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yNGQoWzEsIDIsIDMsIDRdLCBbMSwgMiwgMiwgMV0pO1xuICogY29uc3QgYmxvY2tTaGFwZSA9IFsyLCAyXTtcbiAqIGNvbnN0IHBhZGRpbmdzID0gW1swLCAwXSwgWzAsIDBdXTtcbiAqXG4gKiB4LnNwYWNlVG9CYXRjaE5EKGJsb2NrU2hhcGUsIHBhZGRpbmdzKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHggQSBgdGYuVGVuc29yYC4gTi1EIHdpdGggYHguc2hhcGVgID0gYFtiYXRjaF0gKyBzcGF0aWFsU2hhcGUgK1xuICogcmVtYWluaW5nU2hhcGVgLCB3aGVyZSBzcGF0aWFsU2hhcGUgaGFzIGBNYCBkaW1lbnNpb25zLlxuICogQHBhcmFtIGJsb2NrU2hhcGUgQSAxLUQgYXJyYXkuIE11c3QgaGF2ZSBzaGFwZSBgW01dYCwgYWxsIHZhbHVlcyBtdXN0XG4gKiBiZSA+PSAxLlxuICogQHBhcmFtIHBhZGRpbmdzIEEgMi1EIGFycmF5LiBNdXN0IGhhdmUgc2hhcGUgYFtNLCAyXWAsIGFsbCB2YWx1ZXMgbXVzdCBiZSA+PVxuICogICAgIDAuIGBwYWRkaW5nc1tpXSA9IFtwYWRTdGFydCwgcGFkRW5kXWAgc3BlY2lmaWVzIHRoZSBhbW91bnQgdG8gemVyby1wYWRcbiAqIGZyb20gaW5wdXQgZGltZW5zaW9uIGBpICsgMWAsIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHNwYXRpYWwgZGltZW5zaW9uIGBpYC4gSXRcbiAqIGlzIHJlcXVpcmVkIHRoYXRcbiAqIGAoaW5wdXRTaGFwZVtpICsgMV0gKyBwYWRTdGFydCArIHBhZEVuZCkgJSBibG9ja1NoYXBlW2ldID09PSAwYFxuICpcbiAqIFRoaXMgb3BlcmF0aW9uIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZyBzdGVwczpcbiAqXG4gKiAxLiBaZXJvLXBhZCB0aGUgc3RhcnQgYW5kIGVuZCBvZiBkaW1lbnNpb25zIGBbMSwgLi4uLCBNXWAgb2YgdGhlIGlucHV0XG4gKiBhY2NvcmRpbmcgdG8gYHBhZGRpbmdzYCB0byBwcm9kdWNlIGBwYWRkZWRgIG9mIHNoYXBlIHBhZGRlZFNoYXBlLlxuICpcbiAqIDIuIFJlc2hhcGUgYHBhZGRlZGAgdG8gYHJlc2hhcGVkUGFkZGVkYCBvZiBzaGFwZTpcbiAqIGBbYmF0Y2hdICsgW3BhZGRlZFNoYXBlWzFdIC8gYmxvY2tTaGFwZVswXSwgYmxvY2tTaGFwZVswXSwgLi4uLFxuICogcGFkZGVkU2hhcGVbTV0gLyBibG9ja1NoYXBlW00tMV0sIGJsb2NrU2hhcGVbTS0xXV0gKyByZW1haW5pbmdTaGFwZWBcbiAqXG4gKiAzLiBQZXJtdXRlIGRpbWVuc2lvbnMgb2YgYHJlc2hhcGVkUGFkZGVkYCB0byBwcm9kdWNlIGBwZXJtdXRlZFJlc2hhcGVkUGFkZGVkYFxuICogb2Ygc2hhcGU6IGBibG9ja1NoYXBlICsgW2JhdGNoXSArIFtwYWRkZWRTaGFwZVsxXSAvIGJsb2NrU2hhcGVbMF0sIC4uLixcbiAqIHBhZGRlZFNoYXBlW01dIC8gYmxvY2tTaGFwZVtNLTFdXSArIHJlbWFpbmluZ1NoYXBlYFxuICpcbiAqIDQuIFJlc2hhcGUgYHBlcm11dGVkUmVzaGFwZWRQYWRkZWRgIHRvIGZsYXR0ZW4gYGJsb2NrU2hhcGVgIGludG8gdGhlXG4gKiBiYXRjaCBkaW1lbnNpb24sIHByb2R1Y2luZyBhbiBvdXRwdXQgdGVuc29yIG9mIHNoYXBlOlxuICogYFtiYXRjaCAqIHByb2QoYmxvY2tTaGFwZSldICsgW3BhZGRlZFNoYXBlWzFdIC8gYmxvY2tTaGFwZVswXSwgLi4uLFxuICogcGFkZGVkU2hhcGVbTV0gLyBibG9ja1NoYXBlW00tMV1dICsgcmVtYWluaW5nU2hhcGVgXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnVHJhbnNmb3JtYXRpb25zJ31cbiAqL1xuZnVuY3Rpb24gc3BhY2VUb0JhdGNoTkRfKHgsIGJsb2NrU2hhcGUsIHBhZGRpbmdzKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc3BhY2VUb0JhdGNoTkQnKTtcbiAgICB1dGlsLmFzc2VydCgkeC5yYW5rID49IDEgKyBibG9ja1NoYXBlLmxlbmd0aCwgKCkgPT4gYGlucHV0IHJhbmsgJHskeC5yYW5rfSBzaG91bGQgYmUgPiB0aGFuIFtibG9ja1NoYXBlXSAke2Jsb2NrU2hhcGUubGVuZ3RofWApO1xuICAgIHV0aWwuYXNzZXJ0KHBhZGRpbmdzLmxlbmd0aCA9PT0gYmxvY2tTaGFwZS5sZW5ndGgsICgpID0+IGBwYWRkaW5ncy5zaGFwZVswXSAke3BhZGRpbmdzLmxlbmd0aH0gbXVzdCBiZSBlcXVhbCB0byBbYmxvY2tTaGFwZV0gJHtibG9ja1NoYXBlLmxlbmd0aH1gKTtcbiAgICB1dGlsLmFzc2VydCgkeC5zaGFwZS5yZWR1Y2UoKGEsIGIsIGkpID0+IHtcbiAgICAgICAgaWYgKGkgPiAwICYmIGkgPD0gYmxvY2tTaGFwZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBhICYmXG4gICAgICAgICAgICAgICAgKChiICsgcGFkZGluZ3NbaSAtIDFdWzBdICsgcGFkZGluZ3NbaSAtIDFdWzFdKSAlXG4gICAgICAgICAgICAgICAgICAgIGJsb2NrU2hhcGVbaSAtIDFdID09PVxuICAgICAgICAgICAgICAgICAgICAwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYTtcbiAgICB9LCB0cnVlKSwgKCkgPT4gYGlucHV0IHNwYXRpYWwgZGltZW5zaW9ucyAkeyR4LnNoYXBlLnNsaWNlKDEpfSB3aXRoIHBhZGRpbmdzICR7cGFkZGluZ3MudG9TdHJpbmcoKX0gbXVzdCBiZSBkaXZpc2libGUgYnkgYmxvY2tTaGFwZXMgJHtibG9ja1NoYXBlLnRvU3RyaW5nKCl9YCk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBibG9ja1NoYXBlLCBwYWRkaW5ncyB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFNwYWNlVG9CYXRjaE5ELCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBzcGFjZVRvQmF0Y2hORCA9IG9wKHsgc3BhY2VUb0JhdGNoTkRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3BhY2VfdG9fYmF0Y2hfbmQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IFNwYXJzZUZpbGxFbXB0eVJvd3MgfSBmcm9tICcuLi8uLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbi8qKlxuICogVGhlIGlucHV0IFNwYXJzZVRlbnNvciBpcyByZXByZXNlbnRlZCB2aWEgdGhlIG1hcCBvZiBpbnB1dHMge2BpbmRpY2VzYCxcbiAqIGB2YWx1ZXNgLCBgZGVuc2VTaGFwZWB9LiBUaGUgb3V0cHV0IFNwYXJzZVRlbnNvciBoYXMgdGhlIHNhbWUgYGRlbnNlU2hhcGVgXG4gKiBidXQgd2l0aCBpbmRpY2VzIGBvdXRwdXRJbmRpY2VzYCBhbmQgdmFsdWVzIGBvdXRwdXRWYWx1ZXNgLiBUaGlzIG9wIGluc2VydHMgYVxuICogc2luZ2xlIGVudHJ5IGZvciBldmVyeSByb3cgdGhhdCBkb2Vzbid0IGhhdmUgYW55IHZhbHVlcy4gVGhlIGluZGV4IGlzIGNyZWF0ZWRcbiAqIGFzIGBbcm93LCAwLCAuLi4sIDBdYCBhbmQgdGhlIGluc2VydGVkIHZhbHVlIGlzIGBkZWZhdWx0VmFsdWVgLlxuICpcbiAqIEZvciBleGFtcGxlLCBzdXBwb3NlIGBzcElucHV0YCBoYXMgc2hhcGUgWzUsIDZdIGFuZCBub24tZW1wdHkgdmFsdWVzOlxuICogWzAsIDFdOiBhXG4gKiBbMCwgM106IGJcbiAqIFsyLCAwXTogY1xuICogWzMsIDFdOiBkXG4gKlxuICogUm93cyAxIGFuZCA0IGFyZSBlbXB0eSwgc28gdGhlIG91dHB1dCB3aWxsIGJlIG9mIHNoYXBlIFs1LCA2XSB3aXRoIHZhbHVlczpcbiAqIFswLCAxXTogYVxuICogWzAsIDNdOiBiXG4gKiBbMSwgMF06IGBkZWZhdWx0VmFsdWVgXG4gKiBbMiwgMF06IGNcbiAqIFszLCAxXTogZFxuICogWzQsIDBdOiBgZGVmYXVsdFZhbHVlYFxuICpcbiAqIFRoZSBvdXRwdXQgU3BhcnNlVGVuc29yIHdpbGwgYmUgaW4gcm93LW1ham9yIG9yZGVyIGFuZCB3aWxsIGhhdmUgdGhlIHNhbWVcbiAqIHNoYXBlIGFzIHRoZSBpbnB1dC5cbiAqXG4gKiBUaGlzIG9wIGFsc28gcmV0dXJucyBhbiBpbmRpY2F0b3IgdmVjdG9yIHNoYXBlZCBbZGVuc2Vfc2hhcGVbMF1dIHN1Y2ggdGhhdFxuICogZW1wdHlSb3dJbmRpY2F0b3JbaV0gPSBUcnVlIGlmZiByb3cgaSB3YXMgYW4gZW1wdHkgcm93LlxuICpcbiAqIEFuZCBhIHJldmVyc2UgaW5kZXggbWFwIHZlY3RvciBzaGFwZWQgW2luZGljZXMuc2hhcGVbMF1dIHRoYXQgaXMgdXNlZCBkdXJpbmdcbiAqIGJhY2twcm9wYWdhdGlvbiwgcmV2ZXJzZUluZGV4TWFwW2ldID0gb3V0aSBzLnQuIGluZGljZXNbaSwgal0gPT1cbiAqIG91dHB1dEluZGljZXNbb3V0aSwgal0gZm9yIGFsbCBqXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHJlc3VsdCA9IHRmLnNwYXJzZS5zcGFyc2VGaWxsRW1wdHlSb3dzKFxuICogICBbWzAsIDBdLCBbMSwgMF0sIFsxLCAzXSwgWzEsIDRdLCBbMywgMl0sIFszLCAzXV0sXG4gKiAgIFswLCAxMCwgMTMsIDE0LCAzMiwgMzNdLCBbNSwgNl0sIC0xKTtcbiAqIGNvbnNvbGUubG9nKHJlc3VsdCk7XG4gKiByZXN1bHRbJ291dHB1dEluZGljZXMnXS5wcmludCgpOyAvLyBbWzAsIDBdLCBbMSwgMF0sIFsxLCAzXSwgWzEsIDRdLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIFsyLCAwXSwgWzMsIDJdLCBbMywgM10sIFs0LCAwXV1cbiAqIHJlc3VsdFsnb3V0cHV0VmFsdWVzJ10ucHJpbnQoKTsgLy8gWzAsIDEwLCAxMywgMTQsLTEsIDMyLCAzMywgLTFdXG4gKiByZXN1bHRbJ2VtcHR5Um93SW5kaWNhdG9yJ10ucHJpbnQoKTsgLy8gW2ZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIHRydWVdXG4gKiByZXN1bHRbJ3JldmVyc2VJbmRleE1hcCddLnByaW50KCk7IC8vIFswLCAxLCAyLCAzLCA1LCA2XVxuICogYGBgXG4gKiBAcGFyYW0gaW5kaWNlczogMi1ELiB0aGUgaW5kaWNlcyBvZiB0aGUgc3BhcnNlIHRlbnNvci5cbiAqIEBwYXJhbSB2YWx1ZXM6IDEtRC4gdGhlIHZhbHVlcyBvZiB0aGUgc3BhcnNlIHRlbnNvci5cbiAqIEBwYXJhbSBkZW5zZVNoYXBlOiAxLUQuIHRoZSBzaGFwZSBvZiB0aGUgc3BhcnNlIHRlbnNvci5cbiAqIEBwYXJhbSBkZWZhdWx0VmFsdWU6IDAtRC4gZGVmYXVsdCB2YWx1ZSB0byBpbnNlcnQgaW50byBsb2NhdGlvbiBbcm93LCAwLCAuLi4sXG4gKiAgICAgMF0gZm9yIHJvd3MgbWlzc2luZyBmcm9tIHRoZSBpbnB1dCBzcGFyc2UgdGVuc29yLlxuICogQHJldHVybiBBIG1hcCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqICAgICAtIG91dHB1dEluZGljZXNcbiAqICAgICAtIG91dHB1dFZhbHVlczogMS1ELiB0aGUgdmFsdWVzIG9mIHRoZSBmaWxsZWQgc3BhcnNlIHRlbnNvci5cbiAqICAgICAtIGVtcHR5Um93SW5kaWNhdG9yOiAxLUQuIHdoZXRoZXIgdGhlIGRlbnNlIHJvdyB3YXMgbWlzc2luZyBpbiB0aGUgaW5wdXRcbiAqIHNwYXJzZSB0ZW5zb3IuXG4gKiAgICAgLSByZXZlcnNlSW5kZXhNYXA6IDEtRC4gYSBtYXAgZnJvbSB0aGUgaW5wdXQgaW5kaWNlcyB0byB0aGUgb3V0cHV0XG4gKiBpbmRpY2VzLlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU3BhcnNlJ31cbiAqL1xuZnVuY3Rpb24gc3BhcnNlRmlsbEVtcHR5Um93c18oaW5kaWNlcywgdmFsdWVzLCBkZW5zZVNoYXBlLCBkZWZhdWx0VmFsdWUpIHtcbiAgICBjb25zdCAkaW5kaWNlcyA9IGNvbnZlcnRUb1RlbnNvcihpbmRpY2VzLCAnaW5kaWNlcycsICdzcGFyc2VGaWxsRW1wdHlSb3dzJyk7XG4gICAgY29uc3QgJHZhbHVlcyA9IGNvbnZlcnRUb1RlbnNvcih2YWx1ZXMsICd2YWx1ZXMnLCAnc3BhcnNlRmlsbEVtcHR5Um93cycpO1xuICAgIGNvbnN0ICRkZW5zZVNoYXBlID0gY29udmVydFRvVGVuc29yKGRlbnNlU2hhcGUsICdkZW5zZVNoYXBlJywgJ3NwYXJzZUZpbGxFbXB0eVJvd3MnKTtcbiAgICBjb25zdCAkZGVmYXVsdFZhbHVlID0gY29udmVydFRvVGVuc29yKGRlZmF1bHRWYWx1ZSwgJ2RlZmF1bHRWYWx1ZScsICdzcGFyc2VGaWxsRW1wdHlSb3dzJywgJHZhbHVlcy5kdHlwZSk7XG4gICAgaWYgKCRpbmRpY2VzLnJhbmsgIT09IDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbmRpY2VzIHNob3VsZCBiZSBUZW5zb3IyRCBidXQgcmVjZWl2ZWQgc2hhcGVcbiAgICAgICAgJHskaW5kaWNlcy5zaGFwZX1gKTtcbiAgICB9XG4gICAgaWYgKCR2YWx1ZXMucmFuayAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFZhbHVlcyBzaG91bGQgYmUgVGVuc29yMUQgYnV0IHJlY2VpdmVkIHNoYXBlICR7JHZhbHVlcy5zaGFwZX1gKTtcbiAgICB9XG4gICAgaWYgKCRkZW5zZVNoYXBlLnJhbmsgIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEZW5zZSBzaGFwZSBzaG91bGQgYmUgVGVuc29yMUQgYnV0IHJlY2VpdmVkIHNoYXBlICR7JGRlbnNlU2hhcGUuc2hhcGV9YCk7XG4gICAgfVxuICAgIGlmICgkZGVmYXVsdFZhbHVlLnJhbmsgIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEZWZhdWx0IHZhbHVlIHNob3VsZCBiZSBhIHNjYWxhciBidXQgcmVjZWl2ZWQgc2hhcGUgJHskZGVmYXVsdFZhbHVlLnNoYXBlfWApO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dHMgPSB7XG4gICAgICAgIGluZGljZXM6ICRpbmRpY2VzLFxuICAgICAgICB2YWx1ZXM6ICR2YWx1ZXMsXG4gICAgICAgIGRlbnNlU2hhcGU6ICRkZW5zZVNoYXBlLFxuICAgICAgICBkZWZhdWx0VmFsdWU6ICRkZWZhdWx0VmFsdWVcbiAgICB9O1xuICAgIGNvbnN0IHJlc3VsdCA9IEVOR0lORS5ydW5LZXJuZWwoU3BhcnNlRmlsbEVtcHR5Um93cywgaW5wdXRzKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBvdXRwdXRJbmRpY2VzOiByZXN1bHRbMF0sXG4gICAgICAgIG91dHB1dFZhbHVlczogcmVzdWx0WzFdLFxuICAgICAgICBlbXB0eVJvd0luZGljYXRvcjogcmVzdWx0WzJdLFxuICAgICAgICByZXZlcnNlSW5kZXhNYXA6IHJlc3VsdFszXVxuICAgIH07XG59XG5leHBvcnQgY29uc3Qgc3BhcnNlRmlsbEVtcHR5Um93cyA9IG9wKHsgc3BhcnNlRmlsbEVtcHR5Um93c18gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zcGFyc2VfZmlsbF9lbXB0eV9yb3dzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBTcGFyc2VSZXNoYXBlIH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4uL29wZXJhdGlvbic7XG4vKipcbiAqIFRoaXMgb3BlcmF0aW9uIGhhcyB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgcmVzaGFwZSBvbiB0aGUgcmVwcmVzZW50ZWQgZGVuc2VcbiAqIHRlbnNvci4gVGhlIGBpbnB1dEluZGljZXNgIGFyZSByZWNvbXB1dGVkIGJhc2VkIG9uIHRoZSByZXF1ZXN0ZWQgYG5ld1NoYXBlYC5cbiAqIElmIG9uZSBjb21wb25lbnQgb2YgYG5ld1NoYXBlYCBpcyB0aGUgc3BlY2lhbCB2YWx1ZSAtMSwgdGhlIHNpemUgb2YgdGhhdFxuICogZGltZW5zaW9uIGlzIGNvbXB1dGVkIHNvIHRoYXQgdGhlIHRvdGFsIGRlbnNlIHNpemUgcmVtYWlucyBjb25zdGFudC4gQXQgbW9zdFxuICogb25lIGNvbXBvbmVudCBvZiBgbmV3U2hhcGVgIGNhbiBiZSAtMS4gVGhlIG51bWJlciBvZiBkZW5zZSBlbGVtZW50cyBpbXBsaWVkXG4gKiBieSBgbmV3U2hhcGVgIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBkZW5zZSBlbGVtZW50cyBvcmlnaW5hbGx5XG4gKiBpbXBsaWVkIGJ5IGBpbnB1dFNoYXBlYC4gUmVzaGFwaW5nIGRvZXMgbm90IGFmZmVjdCB0aGUgb3JkZXIgb2YgdmFsdWVzIGluIHRoZVxuICogU3BhcnNlVGVuc29yLiBJZiB0aGUgaW5wdXQgdGVuc29yIGhhcyByYW5rIFJfaW4gYW5kIE4gbm9uLWVtcHR5IHZhbHVlcywgYW5kXG4gKiBgbmV3U2hhcGVgIGhhcyBsZW5ndGggUl9vdXQsIHRoZW4gYGlucHV0SW5kaWNlc2AgaGFzIHNoYXBlIFtOLCBSX2luXSxcbiAqIGBpbnB1dFNoYXBlYCBoYXMgbGVuZ3RoIFJfaW4sIGBvdXRwdXRJbmRpY2VzYCBoYXMgc2hhcGUgW04sIFJfb3V0XSwgYW5kXG4gKiBgb3V0cHV0U2hhcGVgIGhhcyBsZW5ndGggUl9vdXQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHJlc3VsdCA9IHRmLnNwYXJzZS5zcGFyc2VSZXNoYXBlKFxuICogICBbWzAsIDAsIDBdLCBbMCwgMCwgMV0sIFswLCAxLCAwXSwgWzEsIDAsIDBdLCBbMSwgMiwgM11dLFxuICogICBbMiwgMywgNl0sIFs5LCAtMV0pO1xuICogY29uc29sZS5sb2cocmVzdWx0KTtcbiAqIHJlc3VsdFsnb3V0cHV0SW5kaWNlcyddLnByaW50KCk7IC8vW1swLCAwXSwgWzAsIDFdLCBbMSwgMl0sIFs0LCAyXSwgWzgsIDFdXVxuICogcmVzdWx0WydvdXRwdXRTaGFwZSddLnByaW50KCk7IC8vIFs5LCA0XVxuICogYGBgXG4gKiBAcGFyYW0gaW5wdXRJbmRpY2VzOiAyLUQuIE4geCBSX2luIG1hdHJpeCB3aXRoIHRoZSBpbmRpY2VzIG9mIG5vbi1lbXB0eVxuICogdmFsdWVzIGluIGEgU3BhcnNlVGVuc29yLlxuICogQHBhcmFtIGlucHV0U2hhcGU6IDEtRC4gUl9pbiBUZW5zb3IxRCB3aXRoIHRoZSBpbnB1dCBTcGFyc2VUZW5zb3IncyBkZW5zZVxuICogc2hhcGUuXG4gKiBAcGFyYW0gbmV3U2hhcGU6IDEtRC4gUl9vdXQgVGVuc29yMUQgd2l0aCB0aGUgcmVxdWVzdGVkIG5ldyBkZW5zZSBzaGFwZS5cbiAqIEByZXR1cm4gQSBtYXAgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAgICAgLSBvdXRwdXRJbmRpY2VzOiAyLUQuIE4geCBSX291dCBtYXRyaXggd2l0aCB0aGUgdXBkYXRlZCBpbmRpY2VzIG9mXG4gKiAgICAgICBub24tZW1wdHkgdmFsdWVzIGluIHRoZSBvdXRwdXQgU3BhcnNlVGVuc29yLlxuICogICAgIC0gb3V0cHV0U2hhcGU6IDEtRC4gUl9vdXQgdmVjdG9yIHdpdGggdGhlIGZ1bGwgZGVuc2Ugc2hhcGUgb2YgdGhlIG91dHB1dFxuICogICAgICAgU3BhcnNlVGVuc29yLiBUaGlzIGlzIHRoZSBzYW1lIGFzIG5ld1NoYXBlIGJ1dCB3aXRoIGFueSAtMSBkaW1lbnNpb25zXG4gKiAgICAgICAgZmlsbGVkIGluLlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU3BhcnNlJ31cbiAqL1xuZnVuY3Rpb24gc3BhcnNlUmVzaGFwZV8oaW5wdXRJbmRpY2VzLCBpbnB1dFNoYXBlLCBuZXdTaGFwZSkge1xuICAgIGNvbnN0ICRpbnB1dEluZGljZXMgPSBjb252ZXJ0VG9UZW5zb3IoaW5wdXRJbmRpY2VzLCAnaW5wdXRJbmRpY2VzJywgJ3NwYXJzZVJlc2hhcGUnKTtcbiAgICBjb25zdCAkaW5wdXRTaGFwZSA9IGNvbnZlcnRUb1RlbnNvcihpbnB1dFNoYXBlLCAnaW5wdXRTaGFwZScsICdzcGFyc2VSZXNoYXBlJyk7XG4gICAgY29uc3QgJG5ld1NoYXBlID0gY29udmVydFRvVGVuc29yKG5ld1NoYXBlLCAnbmV3U2hhcGUnLCAnc3BhcnNlUmVzaGFwZScpO1xuICAgIGlmICgkaW5wdXRJbmRpY2VzLnJhbmsgIT09IDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnB1dCBpbmRpY2VzIHNob3VsZCBiZSBUZW5zb3IyRCBidXQgcmVjZWl2ZWQgc2hhcGVcbiAgICAgICAgJHskaW5wdXRJbmRpY2VzLnNoYXBlfWApO1xuICAgIH1cbiAgICBpZiAoJGlucHV0U2hhcGUucmFuayAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYElucHV0IHNoYXBlIHNob3VsZCBiZSBUZW5zb3IxRCBidXQgcmVjZWl2ZWQgc2hhcGUgJHskaW5wdXRTaGFwZS5zaGFwZX1gKTtcbiAgICB9XG4gICAgaWYgKCRuZXdTaGFwZS5yYW5rICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTmV3IHNoYXBlIHNob3VsZCBiZSBUZW5zb3IxRCBidXQgcmVjZWl2ZWQgc2hhcGUgJHskbmV3U2hhcGUuc2hhcGV9YCk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0cyA9IHtcbiAgICAgICAgaW5wdXRJbmRpY2VzOiAkaW5wdXRJbmRpY2VzLFxuICAgICAgICBpbnB1dFNoYXBlOiAkaW5wdXRTaGFwZSxcbiAgICAgICAgbmV3U2hhcGU6ICRuZXdTaGFwZVxuICAgIH07XG4gICAgY29uc3QgcmVzdWx0ID0gRU5HSU5FLnJ1bktlcm5lbChTcGFyc2VSZXNoYXBlLCBpbnB1dHMpO1xuICAgIHJldHVybiB7IG91dHB1dEluZGljZXM6IHJlc3VsdFswXSwgb3V0cHV0U2hhcGU6IHJlc3VsdFsxXSB9O1xufVxuZXhwb3J0IGNvbnN0IHNwYXJzZVJlc2hhcGUgPSBvcCh7IHNwYXJzZVJlc2hhcGVfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3BhcnNlX3Jlc2hhcGUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IFNwYXJzZVNlZ21lbnRNZWFuIH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4uL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBtZWFuIGFsb25nIHNwYXJzZSBzZWdtZW50cyBvZiBhIHRlbnNvci5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYyA9IHRmLnRlbnNvcjJkKFtbMSwyLDMsNF0sIFstMSwtMiwtMywtNF0sIFs2LDcsOCw5XV0pO1xuICogLy8gU2VsZWN0IHR3byByb3dzLCBvbmUgc2VnbWVudC5cbiAqIGNvbnN0IHJlc3VsdDEgPSB0Zi5zcGFyc2Uuc3BhcnNlU2VnbWVudE1lYW4oYyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmLnRlbnNvcjFkKFswLCAxXSwgJ2ludDMyJyksXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Zi50ZW5zb3IxZChbMCwgMF0sICdpbnQzMicpKTtcbiAqIHJlc3VsdDEucHJpbnQoKTsgLy8gW1swLCAwLCAwLCAwXV1cbiAqXG4gKiAvLyBTZWxlY3QgdHdvIHJvd3MsIHR3byBzZWdtZW50cy5cbiAqIGNvbnN0IHJlc3VsdDIgPSB0Zi5zcGFyc2Uuc3BhcnNlU2VnbWVudE1lYW4oYyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGYudGVuc29yMWQoWzAsIDFdLCAnaW50MzInKSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGYudGVuc29yMWQoWzAsIDFdLCAnaW50MzInKSk7XG4gKiByZXN1bHQyLnByaW50KCk7IC8vIFtbMSwgMiwgMywgNF0sIFstMSwgLTIsIC0zLCAtNF1dXG4gKlxuICogLy8gU2VsZWN0IGFsbCByb3dzLCB0d28gc2VnbWVudHMuXG4gKiBjb25zdCByZXN1bHQzID0gdGYuc3BhcnNlLnNwYXJzZVNlZ21lbnRNZWFuKGMsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmLnRlbnNvcjFkKFswLCAxLCAyXSwgJ2ludDMyJyksXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmLnRlbnNvcjFkKFswLCAxLCAxXSwgJ2ludDMyJykpO1xuICogcmVzdWx0My5wcmludCgpOyAvLyBbWzEuMCwgMi4wLCAzLjAsIDQuMF0sIFsyLjUsIDIuNSwgMi41LCAyLjVdXVxuICogYGBgXG4gKiBAcGFyYW0gZGF0YTogQSBUZW5zb3Igb2YgYXQgbGVhc3Qgb25lIGRpbWVuc2lvbiB3aXRoIGRhdGEgdGhhdCB3aWxsIGJlXG4gKiAgICAgYXNzZW1ibGVkIGluIHRoZSBvdXRwdXQuXG4gKiBAcGFyYW0gaW5kaWNlczogQSAxLUQgVGVuc29yIHdpdGggaW5kaWNlcyBpbnRvIGRhdGEuIEhhcyBzYW1lIHJhbmsgYXNcbiAqICAgICBzZWdtZW50SWRzLlxuICogQHBhcmFtIHNlZ21lbnRJZHM6IEEgMS1EIFRlbnNvciB3aXRoIGluZGljZXMgaW50byB0aGUgb3V0cHV0IFRlbnNvci4gVmFsdWVzXG4gKiAgICAgc2hvdWxkIGJlIHNvcnRlZCBhbmQgY2FuIGJlIHJlcGVhdGVkLlxuICogQHJldHVybiBIYXMgc2FtZSBzaGFwZSBhcyBkYXRhLCBleGNlcHQgZm9yIGRpbWVuc2lvbiAwIHdoaWNoIGhhcyBlcXVhbCB0b1xuICogICAgICAgICB0aGUgbnVtYmVyIG9mIHNlZ21lbnRzLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1NwYXJzZSd9XG4gKi9cbmZ1bmN0aW9uIHNwYXJzZVNlZ21lbnRNZWFuXyhkYXRhLCBpbmRpY2VzLCBzZWdtZW50SWRzKSB7XG4gICAgY29uc3QgJGRhdGEgPSBjb252ZXJ0VG9UZW5zb3IoZGF0YSwgJ2RhdGEnLCAnc3BhcnNlU2VnbWVudE1lYW4nKTtcbiAgICBjb25zdCAkaW5kaWNlcyA9IGNvbnZlcnRUb1RlbnNvcihpbmRpY2VzLCAnaW5kaWNlcycsICdzcGFyc2VTZWdtZW50TWVhbicpO1xuICAgIGNvbnN0ICRzZWdtZW50SWRzID0gY29udmVydFRvVGVuc29yKHNlZ21lbnRJZHMsICdzZWdtZW50SWRzJywgJ3NwYXJzZVNlZ21lbnRNZWFuJyk7XG4gICAgaWYgKCRkYXRhLnJhbmsgPCAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRGF0YSBzaG91bGQgYmUgYXQgbGVhc3QgMSBkaW1lbnNpb25hbCBidXQgcmVjZWl2ZWQgc2NhbGFyYCk7XG4gICAgfVxuICAgIGlmICgkaW5kaWNlcy5yYW5rICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW5kaWNlcyBzaG91bGQgYmUgVGVuc29yMUQgYnV0IHJlY2VpdmVkIHNoYXBlXG4gICAgICAgICAgJHskaW5kaWNlcy5zaGFwZX1gKTtcbiAgICB9XG4gICAgaWYgKCRzZWdtZW50SWRzLnJhbmsgIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZWdtZW50IGlkcyBzaG91bGQgYmUgVGVuc29yMUQgYnV0IHJlY2VpdmVkIHNoYXBlXG4gICAgICAgICAgJHskc2VnbWVudElkcy5zaGFwZX1gKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0ge1xuICAgICAgICBkYXRhOiAkZGF0YSxcbiAgICAgICAgaW5kaWNlczogJGluZGljZXMsXG4gICAgICAgIHNlZ21lbnRJZHM6ICRzZWdtZW50SWRzXG4gICAgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChTcGFyc2VTZWdtZW50TWVhbiwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBzcGFyc2VTZWdtZW50TWVhbiA9IG9wKHsgc3BhcnNlU2VnbWVudE1lYW5fIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3BhcnNlX3NlZ21lbnRfbWVhbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgU3BhcnNlU2VnbWVudFN1bSB9IGZyb20gJy4uLy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgc3VtIGFsb25nIHNwYXJzZSBzZWdtZW50cyBvZiBhIHRlbnNvci5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYyA9IHRmLnRlbnNvcjJkKFtbMSwyLDMsNF0sIFstMSwtMiwtMywtNF0sIFs1LDYsNyw4XV0pO1xuICogLy8gU2VsZWN0IHR3byByb3dzLCBvbmUgc2VnbWVudC5cbiAqIGNvbnN0IHJlc3VsdDEgPSB0Zi5zcGFyc2Uuc3BhcnNlU2VnbWVudFN1bShjLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGYudGVuc29yMWQoWzAsIDFdLCAnaW50MzInKSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmLnRlbnNvcjFkKFswLCAwXSwgJ2ludDMyJykpO1xuICogcmVzdWx0MS5wcmludCgpOyAvLyBbWzAsIDAsIDAsIDBdXVxuICpcbiAqIC8vIFNlbGVjdCB0d28gcm93cywgdHdvIHNlZ21lbnQuXG4gKiBjb25zdCByZXN1bHQyID0gdGYuc3BhcnNlLnNwYXJzZVNlZ21lbnRTdW0oYyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmLnRlbnNvcjFkKFswLCAxXSwgJ2ludDMyJyksXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Zi50ZW5zb3IxZChbMCwgMV0sICdpbnQzMicpKTtcbiAqIHJlc3VsdDIucHJpbnQoKTsgLy8gW1sxLCAyLCAzLCA0XSwgWy0xLCAtMiwgLTMsIC00XV1cbiAqXG4gKiAvLyBTZWxlY3QgYWxsIHJvd3MsIHR3byBzZWdtZW50cy5cbiAqIGNvbnN0IHJlc3VsdDMgPSB0Zi5zcGFyc2Uuc3BhcnNlU2VnbWVudFN1bShjLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGYudGVuc29yMWQoWzAsIDEsIDJdLCAnaW50MzInKSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmLnRlbnNvcjFkKFswLCAwLCAxXSwgJ2ludDMyJykpO1xuICogcmVzdWx0My5wcmludCgpOyAvLyBbWzAsIDAsIDAsIDBdLCBbNSwgNiwgNywgOF1dXG4gKiBgYGBcbiAqIEBwYXJhbSBkYXRhOiBBIFRlbnNvciBvZiBhdCBsZWFzdCBvbmUgZGltZW5zaW9uIHdpdGggZGF0YSB0aGF0IHdpbGwgYmVcbiAqICAgICBhc3NlbWJsZWQgaW4gdGhlIG91dHB1dC5cbiAqIEBwYXJhbSBpbmRpY2VzOiBBIDEtRCBUZW5zb3Igd2l0aCBpbmRpY2VzIGludG8gZGF0YS4gSGFzIHNhbWUgcmFuayBhc1xuICogICAgIHNlZ21lbnRJZHMuXG4gKiBAcGFyYW0gc2VnbWVudElkczogQSAxLUQgVGVuc29yIHdpdGggaW5kaWNlcyBpbnRvIHRoZSBvdXRwdXQgVGVuc29yLiBWYWx1ZXNcbiAqICAgICBzaG91bGQgYmUgc29ydGVkIGFuZCBjYW4gYmUgcmVwZWF0ZWQuXG4gKiBAcmV0dXJuIEhhcyBzYW1lIHNoYXBlIGFzIGRhdGEsIGV4Y2VwdCBmb3IgZGltZW5zaW9uIDAgd2hpY2ggaGFzIGVxdWFsIHRvXG4gKiAgICAgICAgIHRoZSBudW1iZXIgb2Ygc2VnbWVudHMuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU3BhcnNlJ31cbiAqL1xuZnVuY3Rpb24gc3BhcnNlU2VnbWVudFN1bV8oZGF0YSwgaW5kaWNlcywgc2VnbWVudElkcykge1xuICAgIGNvbnN0ICRkYXRhID0gY29udmVydFRvVGVuc29yKGRhdGEsICdkYXRhJywgJ3NwYXJzZVNlZ21lbnRTdW0nKTtcbiAgICBjb25zdCAkaW5kaWNlcyA9IGNvbnZlcnRUb1RlbnNvcihpbmRpY2VzLCAnaW5kaWNlcycsICdzcGFyc2VTZWdtZW50U3VtJyk7XG4gICAgY29uc3QgJHNlZ21lbnRJZHMgPSBjb252ZXJ0VG9UZW5zb3Ioc2VnbWVudElkcywgJ3NlZ21lbnRJZHMnLCAnc3BhcnNlU2VnbWVudFN1bScpO1xuICAgIGlmICgkZGF0YS5yYW5rIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERhdGEgc2hvdWxkIGJlIGF0IGxlYXN0IDEgZGltZW5zaW9uYWwgYnV0IHJlY2VpdmVkIHNjYWxhcmApO1xuICAgIH1cbiAgICBpZiAoJGluZGljZXMucmFuayAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluZGljZXMgc2hvdWxkIGJlIFRlbnNvcjFEIGJ1dCByZWNlaXZlZCBzaGFwZVxuICAgICAgICAgJHskaW5kaWNlcy5zaGFwZX1gKTtcbiAgICB9XG4gICAgaWYgKCRzZWdtZW50SWRzLnJhbmsgIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZWdtZW50IGlkcyBzaG91bGQgYmUgVGVuc29yMUQgYnV0IHJlY2VpdmVkIHNoYXBlXG4gICAgICAgICAkeyRzZWdtZW50SWRzLnNoYXBlfWApO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dHMgPSB7XG4gICAgICAgIGRhdGE6ICRkYXRhLFxuICAgICAgICBpbmRpY2VzOiAkaW5kaWNlcyxcbiAgICAgICAgc2VnbWVudElkczogJHNlZ21lbnRJZHNcbiAgICB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFNwYXJzZVNlZ21lbnRTdW0sIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3Qgc3BhcnNlU2VnbWVudFN1bSA9IG9wKHsgc3BhcnNlU2VnbWVudFN1bV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zcGFyc2Vfc2VnbWVudF9zdW0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFNwYXJzZVRvRGVuc2UgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0ICogYXMgc3BhcnNlX3RvX2RlbnNlIGZyb20gJy4uL29wcy9zcGFyc2VfdG9fZGVuc2VfdXRpbCc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbnZlcnRzIGEgc3BhcnNlIHJlcHJlc2VudGF0aW9uIGludG8gYSBkZW5zZSB0ZW5zb3IuXG4gKlxuICogQnVpbGRzIGFuIGFycmF5IGRlbnNlIHdpdGggc2hhcGUgb3V0cHV0U2hhcGUgc3VjaCB0aGF0OlxuICpcbiAqIC8vIElmIHNwYXJzZUluZGljZXMgaXMgc2NhbGFyXG4gKiBkZW5zZVtpXSA9IChpID09IHNwYXJzZUluZGljZXMgPyBzcGFyc2VWYWx1ZXMgOiBkZWZhdWx0VmFsdWUpXG4gKlxuICogLy8gSWYgc3BhcnNlSW5kaWNlcyBpcyBhIHZlY3RvciwgdGhlbiBmb3IgZWFjaCBpXG4gKiBkZW5zZVtzcGFyc2VJbmRpY2VzW2ldXSA9IHNwYXJzZVZhbHVlc1tpXVxuICpcbiAqIC8vIElmIHNwYXJzZUluZGljZXMgaXMgYW4gbiBieSBkIG1hdHJpeCwgdGhlbiBmb3IgZWFjaCBpIGluIFswLCBuKVxuICogZGVuc2Vbc3BhcnNlSW5kaWNlc1tpXVswXSwgLi4uLCBzcGFyc2VJbmRpY2VzW2ldW2QtMV1dID0gc3BhcnNlVmFsdWVzW2ldXG4gKiBBbGwgb3RoZXIgdmFsdWVzIGluIGRlbnNlIGFyZSBzZXQgdG8gZGVmYXVsdFZhbHVlLiBJZiBzcGFyc2VWYWx1ZXMgaXMgYVxuICogc2NhbGFyLCBhbGwgc3BhcnNlIGluZGljZXMgYXJlIHNldCB0byB0aGlzIHNpbmdsZSB2YWx1ZS5cbiAqXG4gKiBJZiBpbmRpY2VzIGFyZSByZXBlYXRlZCB0aGUgZmluYWwgdmFsdWUgaXMgc3VtbWVkIG92ZXIgYWxsIHZhbHVlcyBmb3IgdGhvc2VcbiAqIGluZGljZXMuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGluZGljZXMgPSB0Zi50ZW5zb3IxZChbNCwgNSwgNiwgMSwgMiwgM10sICdpbnQzMicpO1xuICogY29uc3QgdmFsdWVzID0gdGYudGVuc29yMWQoWzEwLCAxMSwgMTIsIDEzLCAxNCwgMTVdLCAnZmxvYXQzMicpO1xuICogY29uc3Qgc2hhcGUgPSBbOF07XG4gKiB0Zi5zcGFyc2VUb0RlbnNlKGluZGljZXMsIHZhbHVlcywgc2hhcGUpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gc3BhcnNlSW5kaWNlcyBBIDAtRCwgMS1ELCBvciAyLUQgVGVuc29yIG9mIHR5cGUgaW50MzIuXG4gKiBzcGFyc2VJbmRpY2VzW2ldIGNvbnRhaW5zIHRoZSBjb21wbGV0ZSBpbmRleCB3aGVyZSBzcGFyc2VWYWx1ZXNbaV0gd2lsbCBiZVxuICogcGxhY2VkLlxuICogQHBhcmFtIHNwYXJzZVZhbHVlcyBBIDAtRCBvciAxLUQgVGVuc29yLiBWYWx1ZXNcbiAqIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCByb3cgb2Ygc3BhcnNlSW5kaWNlcywgb3IgYSBzY2FsYXIgdmFsdWUgdG8gYmUgdXNlZCBmb3JcbiAqIGFsbCBzcGFyc2UgaW5kaWNlcy5cbiAqIEBwYXJhbSBvdXRwdXRTaGFwZSBTaGFwZSBvZiB0aGUgZGVuc2Ugb3V0cHV0IHRlbnNvci4gdGhlIHR5cGUgaXMgaW5mZXJyZWQuXG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFNjYWxhci4gVmFsdWUgdG8gc2V0IGZvciBpbmRpY2VzIG5vdCBzcGVjaWZpZWQgaW5cbiAqIHNwYXJzZUluZGljZXMuIERlZmF1bHRzIHRvIHplcm8uXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTm9ybWFsaXphdGlvbid9XG4gKi9cbmZ1bmN0aW9uIHNwYXJzZVRvRGVuc2VfKHNwYXJzZUluZGljZXMsIHNwYXJzZVZhbHVlcywgb3V0cHV0U2hhcGUsIGRlZmF1bHRWYWx1ZSA9IDApIHtcbiAgICBjb25zdCAkc3BhcnNlSW5kaWNlcyA9IGNvbnZlcnRUb1RlbnNvcihzcGFyc2VJbmRpY2VzLCAnc3BhcnNlSW5kaWNlcycsICdzcGFyc2VUb0RlbnNlJywgJ2ludDMyJyk7XG4gICAgY29uc3QgJHNwYXJzZVZhbHVlcyA9IGNvbnZlcnRUb1RlbnNvcihzcGFyc2VWYWx1ZXMsICdzcGFyc2VWYWx1ZXMnLCAnc3BhcnNlVG9EZW5zZScpO1xuICAgIGNvbnN0ICRkZWZhdWx0VmFsdWUgPSBjb252ZXJ0VG9UZW5zb3IoZGVmYXVsdFZhbHVlLCAnZGVmYXVsdFZhbHVlJywgJ3NwYXJzZVRvRGVuc2UnLCAkc3BhcnNlVmFsdWVzLmR0eXBlKTtcbiAgICBzcGFyc2VfdG9fZGVuc2UudmFsaWRhdGVJbnB1dCgkc3BhcnNlSW5kaWNlcywgJHNwYXJzZVZhbHVlcywgb3V0cHV0U2hhcGUsICRkZWZhdWx0VmFsdWUpO1xuICAgIGNvbnN0IGlucHV0cyA9IHtcbiAgICAgICAgc3BhcnNlSW5kaWNlczogJHNwYXJzZUluZGljZXMsXG4gICAgICAgIHNwYXJzZVZhbHVlczogJHNwYXJzZVZhbHVlcyxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiAkZGVmYXVsdFZhbHVlXG4gICAgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgb3V0cHV0U2hhcGUgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChTcGFyc2VUb0RlbnNlLCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBzcGFyc2VUb0RlbnNlID0gb3AoeyBzcGFyc2VUb0RlbnNlXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNwYXJzZV90b19kZW5zZS5qcy5tYXAiLCIvKipcbiAqIFZhbGlkYXRlIHNwYXJzZVRvRGVuc2UgaW5wdXRzLlxuICpcbiAqIEBwYXJhbSBzcGFyc2VJbmRpY2VzIEEgMC1ELCAxLUQsIG9yIDItRCBUZW5zb3Igb2YgdHlwZSBpbnQzMi5cbiAqIHNwYXJzZUluZGljZXNbaV0gY29udGFpbnMgdGhlIGNvbXBsZXRlIGluZGV4IHdoZXJlIHNwYXJzZVZhbHVlc1tpXSB3aWxsIGJlXG4gKiBwbGFjZWQuXG4gKiBAcGFyYW0gc3BhcnNlVmFsdWVzIEEgMC1EIG9yIDEtRCBUZW5zb3IuIFZhbHVlc1xuICogY29ycmVzcG9uZGluZyB0byBlYWNoIHJvdyBvZiBzcGFyc2VJbmRpY2VzLCBvciBhIHNjYWxhciB2YWx1ZSB0byBiZSB1c2VkIGZvclxuICogYWxsIHNwYXJzZSBpbmRpY2VzLlxuICogQHBhcmFtIG91dHB1dFNoYXBlIG51bWJlcltdLiBTaGFwZSBvZiB0aGUgZGVuc2Ugb3V0cHV0IHRlbnNvci5cbiAqIEBwYXJhbSB2YWxpZGF0ZUluZGljZXMgYm9vbGVhbi4gaW5kaWNlIHZhbGlkYXRpb24gaXMgbm90IHN1cHBvcnRlZCwgZXJyb3JcbiAqIHdpbGwgYmUgdGhyb3duIGlmIGl0IGlzIHNldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlSW5wdXQoc3BhcnNlSW5kaWNlcywgc3BhcnNlVmFsdWVzLCBvdXRwdXRTaGFwZSwgZGVmYXVsdFZhbHVlcykge1xuICAgIGlmIChzcGFyc2VJbmRpY2VzLmR0eXBlICE9PSAnaW50MzInKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGYuc3BhcnNlVG9EZW5zZSgpIGV4cGVjdHMgdGhlIGluZGljZXMgdG8gYmUgaW50MzIgdHlwZSwnICtcbiAgICAgICAgICAgIGAgYnV0IHRoZSBkdHlwZSB3YXMgJHtzcGFyc2VJbmRpY2VzLmR0eXBlfS5gKTtcbiAgICB9XG4gICAgaWYgKHNwYXJzZUluZGljZXMucmFuayA+IDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzcGFyc2VJbmRpY2VzIHNob3VsZCBiZSBhIHNjYWxhciwgdmVjdG9yLCBvciBtYXRyaXgsJyArXG4gICAgICAgICAgICBgIGJ1dCBnb3Qgc2hhcGUgJHtzcGFyc2VJbmRpY2VzLnNoYXBlfS5gKTtcbiAgICB9XG4gICAgY29uc3QgbnVtRWxlbXMgPSBzcGFyc2VJbmRpY2VzLnJhbmsgPiAwID8gc3BhcnNlSW5kaWNlcy5zaGFwZVswXSA6IDE7XG4gICAgY29uc3QgbnVtRGltcyA9IHNwYXJzZUluZGljZXMucmFuayA+IDEgPyBzcGFyc2VJbmRpY2VzLnNoYXBlWzFdIDogMTtcbiAgICBpZiAob3V0cHV0U2hhcGUubGVuZ3RoICE9PSBudW1EaW1zKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignb3V0cHV0U2hhcGUgaGFzIGluY29ycmVjdCBudW1iZXIgb2YgZWxlbWVudHM6LCcgK1xuICAgICAgICAgICAgYCAke291dHB1dFNoYXBlLmxlbmd0aH0sIHNob3VsZCBiZTogJHtudW1EaW1zfS5gKTtcbiAgICB9XG4gICAgY29uc3QgbnVtVmFsdWVzID0gc3BhcnNlVmFsdWVzLnNpemU7XG4gICAgaWYgKCEoc3BhcnNlVmFsdWVzLnJhbmsgPT09IDAgfHxcbiAgICAgICAgc3BhcnNlVmFsdWVzLnJhbmsgPT09IDEgJiYgbnVtVmFsdWVzID09PSBudW1FbGVtcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzcGFyc2VWYWx1ZXMgaGFzIGluY29ycmVjdCBzaGFwZSAnICtcbiAgICAgICAgICAgIGAke3NwYXJzZVZhbHVlcy5zaGFwZX0sIHNob3VsZCBiZSBbXSBvciBbJHtudW1FbGVtc31dYCk7XG4gICAgfVxuICAgIGlmIChzcGFyc2VWYWx1ZXMuZHR5cGUgIT09IGRlZmF1bHRWYWx1ZXMuZHR5cGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzcGFyc2VWYWx1ZXMuZHR5cGUgbXVzdCBtYXRjaCBkZWZhdWx0VmFsdWVzLmR0eXBlJyk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3BhcnNlX3RvX2RlbnNlX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IEZGVCB9IGZyb20gJy4uLy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbi8qKlxuICogRmFzdCBGb3VyaWVyIHRyYW5zZm9ybS5cbiAqXG4gKiBDb21wdXRlcyB0aGUgMS1kaW1lbnNpb25hbCBkaXNjcmV0ZSBGb3VyaWVyIHRyYW5zZm9ybSBvdmVyIHRoZSBpbm5lci1tb3N0XG4gKiBkaW1lbnNpb24gb2YgaW5wdXQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHJlYWwgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICogY29uc3QgaW1hZyA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKiBjb25zdCB4ID0gdGYuY29tcGxleChyZWFsLCBpbWFnKTtcbiAqXG4gKiB4LmZmdCgpLnByaW50KCk7ICAvLyB0Zi5zcGVjdHJhbC5mZnQoeCkucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIGlucHV0IFRoZSBjb21wbGV4IGlucHV0IHRvIGNvbXB1dGUgYW4gZmZ0IG92ZXIuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU3BlY3RyYWwnLCBuYW1lc3BhY2U6ICdzcGVjdHJhbCd9XG4gKi9cbmZ1bmN0aW9uIGZmdF8oaW5wdXQpIHtcbiAgICBhc3NlcnQoaW5wdXQuZHR5cGUgPT09ICdjb21wbGV4NjQnLCAoKSA9PiBgVGhlIGR0eXBlIGZvciB0Zi5zcGVjdHJhbC5mZnQoKSBtdXN0IGJlIGNvbXBsZXg2NCBgICtcbiAgICAgICAgYGJ1dCBnb3QgJHtpbnB1dC5kdHlwZX0uYCk7XG4gICAgY29uc3QgaW5wdXRzID0geyBpbnB1dCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEZGVCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBmZnQgPSBvcCh7IGZmdF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mZnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IElGRlQgfSBmcm9tICcuLi8uLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4uL29wZXJhdGlvbic7XG4vKipcbiAqIEludmVyc2UgZmFzdCBGb3VyaWVyIHRyYW5zZm9ybS5cbiAqXG4gKiBDb21wdXRlcyB0aGUgaW52ZXJzZSAxLWRpbWVuc2lvbmFsIGRpc2NyZXRlIEZvdXJpZXIgdHJhbnNmb3JtIG92ZXIgdGhlXG4gKiBpbm5lci1tb3N0IGRpbWVuc2lvbiBvZiBpbnB1dC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgcmVhbCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKiBjb25zdCBpbWFnID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqIGNvbnN0IHggPSB0Zi5jb21wbGV4KHJlYWwsIGltYWcpO1xuICpcbiAqIHguaWZmdCgpLnByaW50KCk7ICAvLyB0Zi5zcGVjdHJhbC5pZmZ0KHgpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSBpbnB1dCBUaGUgY29tcGxleCBpbnB1dCB0byBjb21wdXRlIGFuIGlmZnQgb3Zlci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTcGVjdHJhbCcsIG5hbWVzcGFjZTogJ3NwZWN0cmFsJ31cbiAqL1xuZnVuY3Rpb24gaWZmdF8oaW5wdXQpIHtcbiAgICBhc3NlcnQoaW5wdXQuZHR5cGUgPT09ICdjb21wbGV4NjQnLCAoKSA9PiBgVGhlIGR0eXBlIGZvciB0Zi5zcGVjdHJhbC5pZmZ0KCkgbXVzdCBiZSBjb21wbGV4NjQgYCArXG4gICAgICAgIGBidXQgZ290ICR7aW5wdXQuZHR5cGV9LmApO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgaW5wdXQgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChJRkZULCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGlmZnQgPSBvcCh7IGlmZnRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aWZmdC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjb21wbGV4IH0gZnJvbSAnLi4vY29tcGxleCc7XG5pbXBvcnQgeyBjb25jYXQgfSBmcm9tICcuLi9jb25jYXQnO1xuaW1wb3J0IHsgaW1hZyB9IGZyb20gJy4uL2ltYWcnO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi4vbXVsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlYWwgfSBmcm9tICcuLi9yZWFsJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuLi9yZXNoYXBlJztcbmltcG9ydCB7IHJldmVyc2UgfSBmcm9tICcuLi9yZXZlcnNlJztcbmltcG9ydCB7IHNjYWxhciB9IGZyb20gJy4uL3NjYWxhcic7XG5pbXBvcnQgeyBzbGljZSB9IGZyb20gJy4uL3NsaWNlJztcbmltcG9ydCB7IGlmZnQgfSBmcm9tICcuL2lmZnQnO1xuLyoqXG4gKiBJbnZlcnNlZCByZWFsIHZhbHVlIGlucHV0IGZhc3QgRm91cmllciB0cmFuc2Zvcm0uXG4gKlxuICogQ29tcHV0ZXMgdGhlIDEtZGltZW5zaW9uYWwgaW52ZXJzZWQgZGlzY3JldGUgRm91cmllciB0cmFuc2Zvcm0gb3ZlciB0aGVcbiAqIGlubmVyLW1vc3QgZGltZW5zaW9uIG9mIHRoZSByZWFsIGlucHV0LlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCByZWFsID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqIGNvbnN0IGltYWcgPSB0Zi50ZW5zb3IxZChbMCwgMCwgMF0pO1xuICogY29uc3QgeCA9IHRmLmNvbXBsZXgocmVhbCwgaW1hZyk7XG4gKlxuICogeC5pcmZmdCgpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSBpbnB1dCBUaGUgcmVhbCB2YWx1ZSBpbnB1dCB0byBjb21wdXRlIGFuIGlyZmZ0IG92ZXIuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU3BlY3RyYWwnLCBuYW1lc3BhY2U6ICdzcGVjdHJhbCd9XG4gKi9cbmZ1bmN0aW9uIGlyZmZ0XyhpbnB1dCkge1xuICAgIGNvbnN0IGlubmVyRGltZW5zaW9uU2l6ZSA9IGlucHV0LnNoYXBlW2lucHV0LnNoYXBlLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IGJhdGNoID0gaW5wdXQuc2l6ZSAvIGlubmVyRGltZW5zaW9uU2l6ZTtcbiAgICBsZXQgcmV0O1xuICAgIGlmIChpbm5lckRpbWVuc2lvblNpemUgPD0gMikge1xuICAgICAgICBjb25zdCBjb21wbGV4SW5wdXQgPSByZXNoYXBlKGlucHV0LCBbYmF0Y2gsIGlubmVyRGltZW5zaW9uU2l6ZV0pO1xuICAgICAgICByZXQgPSBpZmZ0KGNvbXBsZXhJbnB1dCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBUaGUgbGVuZ3RoIG9mIHVuaXF1ZSBjb21wb25lbnRzIG9mIHRoZSBERlQgb2YgYSByZWFsLXZhbHVlZCBzaWduYWxcbiAgICAgICAgLy8gaXMgMiAqIChpbnB1dF9sZW4gLSAxKVxuICAgICAgICBjb25zdCBvdXRwdXRTaGFwZSA9IFtiYXRjaCwgMiAqIChpbm5lckRpbWVuc2lvblNpemUgLSAxKV07XG4gICAgICAgIGNvbnN0IHJlYWxJbnB1dCA9IHJlc2hhcGUocmVhbChpbnB1dCksIFtiYXRjaCwgaW5uZXJEaW1lbnNpb25TaXplXSk7XG4gICAgICAgIGNvbnN0IGltYWdJbnB1dCA9IHJlc2hhcGUoaW1hZyhpbnB1dCksIFtiYXRjaCwgaW5uZXJEaW1lbnNpb25TaXplXSk7XG4gICAgICAgIGNvbnN0IHJlYWxDb25qdWdhdGUgPSByZXZlcnNlKHNsaWNlKHJlYWxJbnB1dCwgWzAsIDFdLCBbYmF0Y2gsIGlubmVyRGltZW5zaW9uU2l6ZSAtIDJdKSwgMSk7XG4gICAgICAgIGNvbnN0IGltYWdDb25qdWdhdGUgPSBtdWwocmV2ZXJzZShzbGljZShpbWFnSW5wdXQsIFswLCAxXSwgW2JhdGNoLCBpbm5lckRpbWVuc2lvblNpemUgLSAyXSksIDEpLCBzY2FsYXIoLTEpKTtcbiAgICAgICAgY29uc3QgciA9IGNvbmNhdChbcmVhbElucHV0LCByZWFsQ29uanVnYXRlXSwgMSk7XG4gICAgICAgIGNvbnN0IGkgPSBjb25jYXQoW2ltYWdJbnB1dCwgaW1hZ0Nvbmp1Z2F0ZV0sIDEpO1xuICAgICAgICBjb25zdCBjb21wbGV4SW5wdXQgPSByZXNoYXBlKGNvbXBsZXgociwgaSksIFtvdXRwdXRTaGFwZVswXSwgb3V0cHV0U2hhcGVbMV1dKTtcbiAgICAgICAgcmV0ID0gaWZmdChjb21wbGV4SW5wdXQpO1xuICAgIH1cbiAgICByZXQgPSByZWFsKHJldCk7XG4gICAgLy8gcmVzaGFwZSB0aGUgcmVzdWx0IGlmIHRoZSBpbnB1dCBpcyAzRCB0ZW5zb3IuXG4gICAgaWYgKGlucHV0LnJhbmsgPT09IDMgJiYgaW5wdXQuc2hhcGVbMF0gIT09IDApIHtcbiAgICAgICAgY29uc3QgdGVtcCA9IHJldDtcbiAgICAgICAgY29uc3QgYmF0Y2ggPSBpbnB1dC5zaGFwZVswXTtcbiAgICAgICAgcmV0ID0gcmVzaGFwZShyZXQsIFtiYXRjaCwgcmV0LnNoYXBlWzBdIC8gYmF0Y2gsIHJldC5zaGFwZVsxXV0pO1xuICAgICAgICB0ZW1wLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn1cbmV4cG9ydCBjb25zdCBpcmZmdCA9IG9wKHsgaXJmZnRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXJmZnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgeyBjb21wbGV4IH0gZnJvbSAnLi4vY29tcGxleCc7XG5pbXBvcnQgeyBjb25jYXQgfSBmcm9tICcuLi9jb25jYXQnO1xuaW1wb3J0IHsgaW1hZyB9IGZyb20gJy4uL2ltYWcnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVhbCB9IGZyb20gJy4uL3JlYWwnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4uL3Jlc2hhcGUnO1xuaW1wb3J0IHsgc2xpY2UgfSBmcm9tICcuLi9zbGljZSc7XG5pbXBvcnQgeyBzcGxpdCB9IGZyb20gJy4uL3NwbGl0JztcbmltcG9ydCB7IHplcm9zIH0gZnJvbSAnLi4vemVyb3MnO1xuaW1wb3J0IHsgemVyb3NMaWtlIH0gZnJvbSAnLi4vemVyb3NfbGlrZSc7XG5pbXBvcnQgeyBmZnQgfSBmcm9tICcuL2ZmdCc7XG4vKipcbiAqIFJlYWwgdmFsdWUgaW5wdXQgZmFzdCBGb3VyaWVyIHRyYW5zZm9ybS5cbiAqXG4gKiBDb21wdXRlcyB0aGUgMS1kaW1lbnNpb25hbCBkaXNjcmV0ZSBGb3VyaWVyIHRyYW5zZm9ybSBvdmVyIHRoZVxuICogaW5uZXItbW9zdCBkaW1lbnNpb24gb2YgdGhlIHJlYWwgaW5wdXQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHJlYWwgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICpcbiAqIHJlYWwucmZmdCgpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSBpbnB1dCBUaGUgcmVhbCB2YWx1ZSBpbnB1dCB0byBjb21wdXRlIGFuIHJmZnQgb3Zlci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTcGVjdHJhbCcsIG5hbWVzcGFjZTogJ3NwZWN0cmFsJ31cbiAqL1xuZnVuY3Rpb24gcmZmdF8oaW5wdXQsIGZmdExlbmd0aCkge1xuICAgIGFzc2VydChpbnB1dC5kdHlwZSA9PT0gJ2Zsb2F0MzInLCAoKSA9PiBgVGhlIGR0eXBlIGZvciByZmZ0KCkgbXVzdCBiZSByZWFsIHZhbHVlIGJ1dCBnb3QgJHtpbnB1dC5kdHlwZX1gKTtcbiAgICBsZXQgaW5uZXJEaW1lbnNpb25TaXplID0gaW5wdXQuc2hhcGVbaW5wdXQuc2hhcGUubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgYmF0Y2ggPSBpbnB1dC5zaXplIC8gaW5uZXJEaW1lbnNpb25TaXplO1xuICAgIGxldCBhZGp1c3RlZElucHV0O1xuICAgIGlmIChmZnRMZW5ndGggIT0gbnVsbCAmJiBmZnRMZW5ndGggPCBpbm5lckRpbWVuc2lvblNpemUpIHtcbiAgICAgICAgLy8gTmVlZCB0byBjcm9wXG4gICAgICAgIGNvbnN0IGJlZ2luID0gaW5wdXQuc2hhcGUubWFwKHYgPT4gMCk7XG4gICAgICAgIGNvbnN0IHNpemUgPSBpbnB1dC5zaGFwZS5tYXAodiA9PiB2KTtcbiAgICAgICAgc2l6ZVtpbnB1dC5zaGFwZS5sZW5ndGggLSAxXSA9IGZmdExlbmd0aDtcbiAgICAgICAgYWRqdXN0ZWRJbnB1dCA9IHNsaWNlKGlucHV0LCBiZWdpbiwgc2l6ZSk7XG4gICAgICAgIGlubmVyRGltZW5zaW9uU2l6ZSA9IGZmdExlbmd0aDtcbiAgICB9XG4gICAgZWxzZSBpZiAoZmZ0TGVuZ3RoICE9IG51bGwgJiYgZmZ0TGVuZ3RoID4gaW5uZXJEaW1lbnNpb25TaXplKSB7XG4gICAgICAgIC8vIE5lZWQgdG8gcGFkIHdpdGggemVyb3NcbiAgICAgICAgY29uc3QgemVyb3NTaGFwZSA9IGlucHV0LnNoYXBlLm1hcCh2ID0+IHYpO1xuICAgICAgICB6ZXJvc1NoYXBlW2lucHV0LnNoYXBlLmxlbmd0aCAtIDFdID0gZmZ0TGVuZ3RoIC0gaW5uZXJEaW1lbnNpb25TaXplO1xuICAgICAgICBhZGp1c3RlZElucHV0ID0gY29uY2F0KFtpbnB1dCwgemVyb3MoemVyb3NTaGFwZSldLCBpbnB1dC5zaGFwZS5sZW5ndGggLSAxKTtcbiAgICAgICAgaW5uZXJEaW1lbnNpb25TaXplID0gZmZ0TGVuZ3RoO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgYWRqdXN0ZWRJbnB1dCA9IGlucHV0O1xuICAgIH1cbiAgICAvLyBDb21wbGVtZW50IHRoZSBpbnB1dCB3aXRoIHplcm8gaW1hZ2luYXJ5IG51bWJlcnMuXG4gICAgY29uc3QgemVyb3NJbnB1dCA9IHplcm9zTGlrZShhZGp1c3RlZElucHV0KTtcbiAgICBjb25zdCBjb21wbGV4SW5wdXQgPSByZXNoYXBlKGNvbXBsZXgoYWRqdXN0ZWRJbnB1dCwgemVyb3NJbnB1dCksIFtiYXRjaCwgaW5uZXJEaW1lbnNpb25TaXplXSk7XG4gICAgY29uc3QgcmV0ID0gZmZ0KGNvbXBsZXhJbnB1dCk7XG4gICAgLy8gRXhjbHVkZSBjb21wbGV4IGNvbmp1Z2F0aW9ucy4gVGhlc2UgY29uanVnYXRpb25zIGFyZSBwdXQgc3ltbWV0cmljYWxseS5cbiAgICBjb25zdCBoYWxmID0gTWF0aC5mbG9vcihpbm5lckRpbWVuc2lvblNpemUgLyAyKSArIDE7XG4gICAgY29uc3QgcmVhbFZhbHVlcyA9IHJlYWwocmV0KTtcbiAgICBjb25zdCBpbWFnVmFsdWVzID0gaW1hZyhyZXQpO1xuICAgIGNvbnN0IHJlYWxDb21wbGV4Q29uanVnYXRlID0gc3BsaXQocmVhbFZhbHVlcywgW2hhbGYsIGlubmVyRGltZW5zaW9uU2l6ZSAtIGhhbGZdLCByZWFsVmFsdWVzLnNoYXBlLmxlbmd0aCAtIDEpO1xuICAgIGNvbnN0IGltYWdDb21wbGV4Q29uanVnYXRlID0gc3BsaXQoaW1hZ1ZhbHVlcywgW2hhbGYsIGlubmVyRGltZW5zaW9uU2l6ZSAtIGhhbGZdLCBpbWFnVmFsdWVzLnNoYXBlLmxlbmd0aCAtIDEpO1xuICAgIGNvbnN0IG91dHB1dFNoYXBlID0gYWRqdXN0ZWRJbnB1dC5zaGFwZS5zbGljZSgpO1xuICAgIG91dHB1dFNoYXBlW2FkanVzdGVkSW5wdXQuc2hhcGUubGVuZ3RoIC0gMV0gPSBoYWxmO1xuICAgIHJldHVybiByZXNoYXBlKGNvbXBsZXgocmVhbENvbXBsZXhDb25qdWdhdGVbMF0sIGltYWdDb21wbGV4Q29uanVnYXRlWzBdKSwgb3V0cHV0U2hhcGUpO1xufVxuZXhwb3J0IGNvbnN0IHJmZnQgPSBvcCh7IHJmZnRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmZmdC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgU3BsaXRWIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogU3BsaXRzIGEgYHRmLlRlbnNvcmAgaW50byBzdWIgdGVuc29ycy5cbiAqXG4gKiBJZiBgbnVtT3JTaXplU3BsaXRzYCBpcyBhIG51bWJlciwgc3BsaXRzIGB4YCBhbG9uZyBkaW1lbnNpb24gYGF4aXNgXG4gKiBpbnRvIGBudW1PclNpemVTcGxpdHNgIHNtYWxsZXIgdGVuc29ycy5cbiAqIFJlcXVpcmVzIHRoYXQgYG51bU9yU2l6ZVNwbGl0c2AgZXZlbmx5IGRpdmlkZXMgYHguc2hhcGVbYXhpc11gLlxuICpcbiAqIElmIGBudW1PclNpemVTcGxpdHNgIGlzIGEgbnVtYmVyIGFycmF5LCBzcGxpdHMgYHhgIGludG9cbiAqIGBudW1PclNpemVTcGxpdHMubGVuZ3RoYCBwaWVjZXMuIFRoZSBzaGFwZSBvZiB0aGUgYGlgLXRoIHBpZWNlIGhhcyB0aGVcbiAqIHNhbWUgc2l6ZSBhcyBgeGAgZXhjZXB0IGFsb25nIGRpbWVuc2lvbiBgYXhpc2Agd2hlcmUgdGhlIHNpemUgaXNcbiAqIGBudW1PclNpemVTcGxpdHNbaV1gLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDhdLCBbMiwgNF0pO1xuICogY29uc3QgW2EsIGJdID0gdGYuc3BsaXQoeCwgMiwgMSk7XG4gKiBhLnByaW50KCk7XG4gKiBiLnByaW50KCk7XG4gKlxuICogY29uc3QgW2MsIGQsIGVdID0gdGYuc3BsaXQoeCwgWzEsIDIsIDFdLCAxKTtcbiAqIGMucHJpbnQoKTtcbiAqIGQucHJpbnQoKTtcbiAqIGUucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IgdG8gc3BsaXQuXG4gKiBAcGFyYW0gbnVtT3JTaXplU3BsaXRzIEVpdGhlciBhbiBpbnRlZ2VyIGluZGljYXRpbmcgdGhlIG51bWJlciBvZlxuICogc3BsaXRzIGFsb25nIHRoZSBheGlzIG9yIGFuIGFycmF5IG9mIGludGVnZXJzIGNvbnRhaW5pbmcgdGhlIHNpemVzIG9mXG4gKiBlYWNoIG91dHB1dCB0ZW5zb3IgYWxvbmcgdGhlIGF4aXMuIElmIGEgbnVtYmVyIHRoZW4gaXQgbXVzdCBldmVubHkgZGl2aWRlXG4gKiBgeC5zaGFwZVtheGlzXWA7IG90aGVyd2lzZSB0aGUgc3VtIG9mIHNpemVzIG11c3QgbWF0Y2ggYHguc2hhcGVbYXhpc11gLlxuICogQ2FuIGNvbnRhaW4gb25lIC0xIGluZGljYXRpbmcgdGhhdCBkaW1lbnNpb24gaXMgdG8gYmUgaW5mZXJyZWQuXG4gKiBAcGFyYW0gYXhpcyBUaGUgZGltZW5zaW9uIGFsb25nIHdoaWNoIHRvIHNwbGl0LiBEZWZhdWx0cyB0byAwICh0aGUgZmlyc3RcbiAqIGRpbSkuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnU2xpY2luZyBhbmQgSm9pbmluZyd9XG4gKi9cbmZ1bmN0aW9uIHNwbGl0Xyh4LCBudW1PclNpemVTcGxpdHMsIGF4aXMgPSAwKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc3BsaXQnKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgY29uc3QgYXR0ciA9IHsgbnVtT3JTaXplU3BsaXRzLCBheGlzIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoU3BsaXRWLCBpbnB1dHMsIGF0dHIpO1xufVxuZXhwb3J0IGNvbnN0IHNwbGl0ID0gb3AoeyBzcGxpdF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zcGxpdC5qcy5tYXAiLCJpbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsJztcbi8qKlxuICogUHJlcGFyZSB0aGUgc3BsaXQgc2l6ZSBhcnJheS4gV2hlbiB0aGUgaW5wdXQgaXMgYSBudW1iZXIsIHRoZSBheGlzIGlzIGV2ZW5seVxuICogZGl2aWRlZCBhbW9uZyB0aGUgc3BsaXQgc2l6ZS4gV2hlbiB0aGUgaW5wdXQgY29udGFpbnMgdGhlIG5lZ2F0aXZlIHZhbHVlLCB0aGVcbiAqIHJlc3Qgb2YgdGhlIGF4aXMgaXMgYWxsb2NhdGVkIHRvd2FyZCB0aGF0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZVNwbGl0U2l6ZSh4LCBudW1PclNpemVTcGxpdHMsIGF4aXMgPSAwKSB7XG4gICAgbGV0IHNwbGl0U2l6ZXMgPSBbXTtcbiAgICBpZiAodHlwZW9mIChudW1PclNpemVTcGxpdHMpID09PSAnbnVtYmVyJykge1xuICAgICAgICBhc3NlcnQoeC5zaGFwZVtheGlzXSAlIG51bU9yU2l6ZVNwbGl0cyA9PT0gMCwgKCkgPT4gJ051bWJlciBvZiBzcGxpdHMgbXVzdCBldmVubHkgZGl2aWRlIHRoZSBheGlzLicpO1xuICAgICAgICBzcGxpdFNpemVzID1cbiAgICAgICAgICAgIG5ldyBBcnJheShudW1PclNpemVTcGxpdHMpLmZpbGwoeC5zaGFwZVtheGlzXSAvIG51bU9yU2l6ZVNwbGl0cyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBudW1PZk5lZ3MgPSBudW1PclNpemVTcGxpdHMucmVkdWNlKChjb3VudCwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjb3VudCArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvdW50O1xuICAgICAgICB9LCAwKTtcbiAgICAgICAgYXNzZXJ0KG51bU9mTmVncyA8PSAxLCAoKSA9PiAnVGhlcmUgc2hvdWxkIGJlIG9ubHkgb25lIG5lZ2F0aXZlIHZhbHVlIGluIHNwbGl0IGFycmF5LicpO1xuICAgICAgICBjb25zdCBuZWdJbmRleCA9IG51bU9yU2l6ZVNwbGl0cy5pbmRleE9mKC0xKTtcbiAgICAgICAgLy8gQWxsb3cgdGhlIG51bWJlciBvZiBzcGxpdCBhcnJheSB0byBiZSAtMSwgd2hpY2ggaW5kaWNhdGVzIHRoZSByZXN0XG4gICAgICAgIC8vIG9mIGRpbWVuc2lvbiBpcyBhbGxvY2F0ZWQgdG8gdGhhdCBzcGxpdC5cbiAgICAgICAgaWYgKG5lZ0luZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgY29uc3QgdG90YWwgPSBudW1PclNpemVTcGxpdHMucmVkdWNlKChhLCBiKSA9PiBiID4gMCA/IGEgKyBiIDogYSk7XG4gICAgICAgICAgICBudW1PclNpemVTcGxpdHNbbmVnSW5kZXhdID0geC5zaGFwZVtheGlzXSAtIHRvdGFsO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydCh4LnNoYXBlW2F4aXNdID09PSBudW1PclNpemVTcGxpdHMucmVkdWNlKChhLCBiKSA9PiBhICsgYiksICgpID0+ICdUaGUgc3VtIG9mIHNpemVzIG11c3QgbWF0Y2ggdGhlIHNpemUgb2YgdGhlIGF4aXMgZGltZW5zaW9uLicpO1xuICAgICAgICBzcGxpdFNpemVzID0gbnVtT3JTaXplU3BsaXRzO1xuICAgIH1cbiAgICByZXR1cm4gc3BsaXRTaXplcztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNwbGl0X3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFNxcnQgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBzcXVhcmUgcm9vdCBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOiBgeSA9IHNxcnQoeClgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgNCwgLTFdKTtcbiAqXG4gKiB4LnNxcnQoKS5wcmludCgpOyAgLy8gb3IgdGYuc3FydCh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBzcXJ0Xyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc3FydCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChTcXJ0LCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IHNxcnQgPSBvcCh7IHNxcnRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3FydC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBzcXVhcmUgb2YgYHhgIGVsZW1lbnQtd2lzZTogYHggXiAyYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIE1hdGguc3FydCgyKSwgLTFdKTtcbiAqXG4gKiB4LnNxdWFyZSgpLnByaW50KCk7ICAvLyBvciB0Zi5zcXVhcmUoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IFRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gc3F1YXJlXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc3F1YXJlJyk7XG4gICAgY29uc3QgYXR0cnMgPSB7fTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbCgnU3F1YXJlJywgeyB4OiAkeCB9LCBhdHRycyk7XG59XG5leHBvcnQgY29uc3Qgc3F1YXJlID0gb3AoeyBzcXVhcmVfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3F1YXJlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBTcXVhcmVkRGlmZmVyZW5jZSB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBtYWtlVHlwZXNNYXRjaCB9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSB9IGZyb20gJy4vYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIFJldHVybnMgKGEgLSBiKSAqIChhIC0gYikgZWxlbWVudC13aXNlLlxuICogU3VwcG9ydHMgYnJvYWRjYXN0aW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDQsIDMsIDE2XSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzEsIDIsIDksIDRdKTtcbiAqXG4gKiBhLnNxdWFyZWREaWZmZXJlbmNlKGIpLnByaW50KCk7ICAvLyBvciB0Zi5zcXVhcmVkRGlmZmVyZW5jZShhLCBiKVxuICogYGBgXG4gKlxuICogYGBganNcbiAqIC8vIEJyb2FkY2FzdCBzcXVhcmVkIGRpZmZlcmVuY2UgIGEgd2l0aCBiLlxuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsyLCA0LCA2LCA4XSk7XG4gKiBjb25zdCBiID0gdGYuc2NhbGFyKDUpO1xuICpcbiAqIGEuc3F1YXJlZERpZmZlcmVuY2UoYikucHJpbnQoKTsgIC8vIG9yIHRmLnNxdWFyZWREaWZmZXJlbmNlKGEsIGIpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYSBUaGUgZmlyc3QgdGVuc29yLlxuICogQHBhcmFtIGIgVGhlIHNlY29uZCB0ZW5zb3IuIE11c3QgaGF2ZSB0aGUgc2FtZSB0eXBlIGFzIGBhYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdBcml0aG1ldGljJ31cbiAqL1xuZnVuY3Rpb24gc3F1YXJlZERpZmZlcmVuY2VfKGEsIGIpIHtcbiAgICBsZXQgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnc3F1YXJlZERpZmZlcmVuY2UnKTtcbiAgICBsZXQgJGIgPSBjb252ZXJ0VG9UZW5zb3IoYiwgJ2InLCAnc3F1YXJlZERpZmZlcmVuY2UnKTtcbiAgICBbJGEsICRiXSA9IG1ha2VUeXBlc01hdGNoKCRhLCAkYik7XG4gICAgYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoJGEuc2hhcGUsICRiLnNoYXBlKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGE6ICRhLCBiOiAkYiB9O1xuICAgIGNvbnN0IGF0dHJzID0ge307XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoU3F1YXJlZERpZmZlcmVuY2UsIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IHNxdWFyZWREaWZmZXJlbmNlID0gb3AoeyBzcXVhcmVkRGlmZmVyZW5jZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zcXVhcmVkX2RpZmZlcmVuY2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IHNxdWVlemVTaGFwZSB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbi8qKlxuICogUmVtb3ZlcyBkaW1lbnNpb25zIG9mIHNpemUgMSBmcm9tIHRoZSBzaGFwZSBvZiBhIGB0Zi5UZW5zb3JgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yKFsxLCAyLCAzLCA0XSwgWzEsIDEsIDRdKTtcbiAqIHguc3F1ZWV6ZSgpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yIHRvIGJlIHNxdWVlemVkLlxuICogQHBhcmFtIGF4aXMgQW4gb3B0aW9uYWwgbGlzdCBvZiBudW1iZXJzLiBJZiBzcGVjaWZpZWQsIG9ubHlcbiAqICAgICBzcXVlZXplcyB0aGUgZGltZW5zaW9ucyBsaXN0ZWQuIFRoZSBkaW1lbnNpb24gaW5kZXggc3RhcnRzIGF0IDAuIEl0XG4gKiBpcyBhbiBlcnJvciB0byBzcXVlZXplIGEgZGltZW5zaW9uIHRoYXQgaXMgbm90IDEuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnVHJhbnNmb3JtYXRpb25zJ31cbiAqL1xuZnVuY3Rpb24gc3F1ZWV6ZV8oeCwgYXhpcykge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3NxdWVlemUnKTtcbiAgICByZXR1cm4gcmVzaGFwZSgkeCwgc3F1ZWV6ZVNoYXBlKCR4LnNoYXBlLCBheGlzKS5uZXdTaGFwZSk7XG59XG5leHBvcnQgY29uc3Qgc3F1ZWV6ZSA9IG9wKHsgc3F1ZWV6ZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zcXVlZXplLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBQYWNrIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvckFycmF5IH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogU3RhY2tzIGEgbGlzdCBvZiByYW5rLWBSYCBgdGYuVGVuc29yYHMgaW50byBvbmUgcmFuay1gKFIrMSlgIGB0Zi5UZW5zb3JgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDJdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbMywgNF0pO1xuICogY29uc3QgYyA9IHRmLnRlbnNvcjFkKFs1LCA2XSk7XG4gKiB0Zi5zdGFjayhbYSwgYiwgY10pLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdGVuc29ycyBBIGxpc3Qgb2YgdGVuc29yIG9iamVjdHMgd2l0aCB0aGUgc2FtZSBzaGFwZSBhbmQgZHR5cGUuXG4gKiBAcGFyYW0gYXhpcyBUaGUgYXhpcyB0byBzdGFjayBhbG9uZy4gRGVmYXVsdHMgdG8gMCAodGhlIGZpcnN0IGRpbSkuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnU2xpY2luZyBhbmQgSm9pbmluZyd9XG4gKi9cbmZ1bmN0aW9uIHN0YWNrXyh0ZW5zb3JzLCBheGlzID0gMCkge1xuICAgIGNvbnN0ICR0ZW5zb3JzID0gY29udmVydFRvVGVuc29yQXJyYXkodGVuc29ycywgJ3RlbnNvcnMnLCAnc3RhY2snLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgICB1dGlsLmFzc2VydCgkdGVuc29ycy5sZW5ndGggPj0gMSwgKCkgPT4gJ1Bhc3MgYXQgbGVhc3Qgb25lIHRlbnNvciB0byB0Zi5zdGFjaycpO1xuICAgIGlmICgkdGVuc29ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KGF4aXMgPD0gJHRlbnNvcnNbMF0ucmFuaywgKCkgPT4gJ0F4aXMgbXVzdCBiZSA8PSByYW5rIG9mIHRoZSB0ZW5zb3InKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0gJHRlbnNvcnM7XG4gICAgY29uc3QgYXR0cnMgPSB7IGF4aXMgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChQYWNrLCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBzdGFjayA9IG9wKHsgc3RhY2tfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RhY2suanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFN0ZXAgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBzdGVwIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6IGB4ID4gMCA/IDEgOiBhbHBoYSAqIHhgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMCwgMiwgLTEsIC0zXSk7XG4gKlxuICogeC5zdGVwKC41KS5wcmludCgpOyAgLy8gb3IgdGYuc3RlcCh4LCAuNSlcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBhbHBoYSBUaGUgZ3JhZGllbnQgd2hlbiBpbnB1dCBpcyBuZWdhdGl2ZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gc3RlcF8oeCwgYWxwaGEgPSAwLjApIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzdGVwJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBhbHBoYSB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFN0ZXAsIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IHN0ZXAgPSBvcCh7IHN0ZXBfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RlcC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgU3RyaWRlZFNsaWNlIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogRXh0cmFjdHMgYSBzdHJpZGVkIHNsaWNlIG9mIGEgdGVuc29yLlxuICpcbiAqIFJvdWdobHkgc3BlYWtpbmcsIHRoaXMgb3AgZXh0cmFjdHMgYSBzbGljZSBvZiBzaXplIChlbmQtYmVnaW4pL3N0cmlkZSBmcm9tXG4gKiB0aGUgZ2l2ZW4gaW5wdXQgdGVuc29yICh4KS4gU3RhcnRpbmcgYXQgdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBieSBiZWdpbiB0aGVcbiAqIHNsaWNlIGNvbnRpbnVlcyBieSBhZGRpbmcgc3RyaWRlIHRvIHRoZSBpbmRleCB1bnRpbCBhbGwgZGltZW5zaW9ucyBhcmUgbm90XG4gKiBsZXNzIHRoYW4gZW5kLiBOb3RlIHRoYXQgYSBzdHJpZGUgY2FuIGJlIG5lZ2F0aXZlLCB3aGljaCBjYXVzZXMgYSByZXZlcnNlXG4gKiBzbGljZS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgdCA9IHRmLnRlbnNvcjNkKFsxLCAxLCAxICwyLCAyLCAyLCAzLCAzLCAzLCA0LCA0LCA0LCA1LCA1LCA1LCA2LCA2LCA2XSxcbiAqICAgIFszLCAyLCAzXSk7XG4gKiB0LnN0cmlkZWRTbGljZShbMSwgMCwgMF0sIFsyLCAxLCAzXSwgWzEsIDEsIDFdKS5wcmludCgpICAvLyBbW1szLCAzLCAzXV1dXG4gKiB0LnN0cmlkZWRTbGljZShbMSwgMCwgMF0sIFsyLCAyLCAzXSwgWzEsIDEsIDFdKS5wcmludCgpICAvLyBbW1szLCAzLCAzXSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBbNCwgNCwgNF1dXVxuICogdC5zdHJpZGVkU2xpY2UoWzEsIC0xLCAwXSwgWzIsIC0zLCAzXSwgWzEsIC0xLCAxXSkucHJpbnQoKSAvLyBbW1s0LCA0LCA0XSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBbMywgMywgM11dXVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIHRlbnNvciB0byBzdHJpZGUgc2xpY2UuXG4gKiBAcGFyYW0gYmVnaW4gVGhlIGNvb3JkaW5hdGVzIHRvIHN0YXJ0IHRoZSBzbGljZSBmcm9tLlxuICogQHBhcmFtIGVuZDogVGhlIGNvb3JkaW5hdGVzIHRvIGVuZCB0aGUgc2xpY2UgYXQuXG4gKiBAcGFyYW0gc3RyaWRlczogVGhlIHNpemUgb2YgdGhlIHNsaWNlLlxuICogQHBhcmFtIGJlZ2luTWFzazogSWYgdGhlIGl0aCBiaXQgb2YgYmVnaW5NYXNrIGlzIHNldCwgYmVnaW5baV0gaXMgaWdub3JlZFxuICogICAgICBhbmQgdGhlIGZ1bGxlc3QgcG9zc2libGUgcmFuZ2UgaW4gdGhhdCBkaW1lbnNpb24gaXMgdXNlZCBpbnN0ZWFkLlxuICogQHBhcmFtIGVuZE1hc2s6IElmIHRoZSBpdGggYml0IG9mIGVuZE1hc2sgaXMgc2V0LCBlbmRbaV0gaXMgaWdub3JlZFxuICogICAgICBhbmQgdGhlIGZ1bGxlc3QgcG9zc2libGUgcmFuZ2UgaW4gdGhhdCBkaW1lbnNpb24gaXMgdXNlZCBpbnN0ZWFkLlxuICogQHBhcmFtIHNocmlua0F4aXNNYXNrOiBhIGJpdG1hc2sgd2hlcmUgYml0IGkgaW1wbGllcyB0aGF0XG4gKiB0aGUgaXRoIHNwZWNpZmljYXRpb24gc2hvdWxkIHNocmluayB0aGUgZGltZW5zaW9uYWxpdHkuIGJlZ2luIGFuZCBlbmQgbXVzdFxuICogaW1wbHkgYSBzbGljZSBvZiBzaXplIDEgaW4gdGhlIGRpbWVuc2lvbi5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTbGljaW5nIGFuZCBKb2luaW5nJ31cbiAqL1xuZnVuY3Rpb24gc3RyaWRlZFNsaWNlXyh4LCBiZWdpbiwgZW5kLCBzdHJpZGVzLCBiZWdpbk1hc2sgPSAwLCBlbmRNYXNrID0gMCwgZWxsaXBzaXNNYXNrID0gMCwgbmV3QXhpc01hc2sgPSAwLCBzaHJpbmtBeGlzTWFzayA9IDApIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzdHJpZGVkU2xpY2UnLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgY29uc3QgYXR0cnMgPSB7XG4gICAgICAgIGJlZ2luLFxuICAgICAgICBlbmQsXG4gICAgICAgIHN0cmlkZXMsXG4gICAgICAgIGJlZ2luTWFzayxcbiAgICAgICAgZW5kTWFzayxcbiAgICAgICAgZWxsaXBzaXNNYXNrLFxuICAgICAgICBuZXdBeGlzTWFzayxcbiAgICAgICAgc2hyaW5rQXhpc01hc2tcbiAgICB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFN0cmlkZWRTbGljZSwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3Qgc3RyaWRlZFNsaWNlID0gb3AoeyBzdHJpZGVkU2xpY2VfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RyaWRlZF9zbGljZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgU3RyaW5nTkdyYW1zIH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4uL29wZXJhdGlvbic7XG4vKipcbiAqIENyZWF0ZXMgbmdyYW1zIGZyb20gcmFnZ2VkIHN0cmluZyBkYXRhLlxuICpcbiAqIFRoaXMgb3AgYWNjZXB0cyBhIHJhZ2dlZCB0ZW5zb3Igd2l0aCAxIHJhZ2dlZCBkaW1lbnNpb24gY29udGFpbmluZyBvbmx5XG4gKiBzdHJpbmdzIGFuZCBvdXRwdXRzIGEgcmFnZ2VkIHRlbnNvciB3aXRoIDEgcmFnZ2VkIGRpbWVuc2lvbiBjb250YWluaW5nIG5ncmFtc1xuICogb2YgdGhhdCBzdHJpbmcsIGpvaW5lZCBhbG9uZyB0aGUgaW5uZXJtb3N0IGF4aXMuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHJlc3VsdCA9IHRmLnN0cmluZy5zdHJpbmdOR3JhbXMoXG4gKiAgIFsnYScsICdiJywgJ2MnLCAnZCddLCB0Zi50ZW5zb3IxZChbMCwgMiwgNF0sICdpbnQzMicpLFxuICogICAnfCcsIFsxLCAyXSwgJ0xQJywgJ1JQJywgLTEsIGZhbHNlKTtcbiAqIHJlc3VsdFsnbkdyYW1zJ10ucHJpbnQoKTsgLy8gWydhJywgJ2InLCAnTFB8YScsICdhfGInLCAnYnxSUCcsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAnYycsICdkJywgJ0xQfGMnLCAnY3xkJywgJ2R8UlAnXVxuICogcmVzdWx0WyduR3JhbXNTcGxpdHMnXS5wcmludCgpOyAvLyBbMCwgNSwgMTBdXG4gKiBgYGBcbiAqIEBwYXJhbSBkYXRhOiBUaGUgdmFsdWVzIHRlbnNvciBvZiB0aGUgcmFnZ2VkIHN0cmluZyB0ZW5zb3IgdG8gbWFrZSBuZ3JhbXMgb3V0XG4gKiAgICAgb2YuIE11c3QgYmUgYSAxRCBzdHJpbmcgdGVuc29yLlxuICogQHBhcmFtIGRhdGFTcGxpdHM6IFRoZSBzcGxpdHMgdGVuc29yIG9mIHRoZSByYWdnZWQgc3RyaW5nIHRlbnNvciB0byBtYWtlXG4gKiAgICAgbmdyYW1zIG91dCBvZi5cbiAqIEBwYXJhbSBzZXBhcmF0b3I6IFRoZSBzdHJpbmcgdG8gYXBwZW5kIGJldHdlZW4gZWxlbWVudHMgb2YgdGhlIHRva2VuLiBVc2UgXCJcIlxuICogICAgIGZvciBubyBzZXBhcmF0b3IuXG4gKiBAcGFyYW0gbkdyYW1XaWR0aHM6IFRoZSBzaXplcyBvZiB0aGUgbmdyYW1zIHRvIGNyZWF0ZS5cbiAqIEBwYXJhbSBsZWZ0UGFkOiBUaGUgc3RyaW5nIHRvIHVzZSB0byBwYWQgdGhlIGxlZnQgc2lkZSBvZiB0aGUgbmdyYW0gc2VxdWVuY2UuXG4gKiAgICAgT25seSB1c2VkIGlmIHBhZF93aWR0aCAhPT0gMC5cbiAqIEBwYXJhbSByaWdodFBhZDogVGhlIHN0cmluZyB0byB1c2UgdG8gcGFkIHRoZSByaWdodCBzaWRlIG9mIHRoZSBuZ3JhbVxuICogICAgIHNlcXVlbmNlLiBPbmx5IHVzZWQgaWYgcGFkX3dpZHRoICE9PSAwLlxuICogQHBhcmFtIHBhZFdpZHRoOiBUaGUgbnVtYmVyIG9mIHBhZGRpbmcgZWxlbWVudHMgdG8gYWRkIHRvIGVhY2ggc2lkZSBvZiBlYWNoXG4gKiAgICAgc2VxdWVuY2UuIE5vdGUgdGhhdCBwYWRkaW5nIHdpbGwgbmV2ZXIgYmUgZ3JlYXRlciB0aGFuIGBuR3JhbVdpZHRoc2AtMVxuICogICAgIHJlZ2FyZGxlc3Mgb2YgdGhpcyB2YWx1ZS4gSWYgYHBhZFdpZHRoYD0tMSAsIHRoZW4gYWRkIG1heChgbkdyYW1XaWR0aHMpLTFcbiAqICAgICBlbGVtZW50cy5cbiAqIEBwYXJhbSBwcmVzZXJ2ZVNob3J0U2VxdWVuY2VzOiBJZiB0cnVlLCB0aGVuIGVuc3VyZSB0aGF0IGF0IGxlYXN0IG9uZSBuZ3JhbVxuICogICAgIGlzIGdlbmVyYXRlZCBmb3IgZWFjaCBpbnB1dCBzZXF1ZW5jZS4gSW4gcGFydGljdWxhciwgaWYgYW4gaW5wdXQgc2VxdWVuY2VcbiAqICAgICBpcyBzaG9ydGVyIHRoYW4gbWluKG5ncmFtV2lkdGgpICsgMipwYWRXaWR0aCwgdGhlbiBnZW5lcmF0ZSBhIHNpbmdsZVxuICogICAgIG5ncmFtIGNvbnRhaW5pbmcgdGhlIGVudGlyZSBzZXF1ZW5jZS4gSWYgZmFsc2UsIHRoZW4gbm8gbmdyYW1zIGFyZVxuICogICAgIGdlbmVyYXRlZCBmb3IgdGhlc2Ugc2hvcnQgaW5wdXQgc2VxdWVuY2VzLlxuICogQHJldHVybiBBIG1hcCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqICAgICAtIG5HcmFtczogVGhlIHZhbHVlcyB0ZW5zb3Igb2YgdGhlIG91dHB1dCBuZ3JhbXMgcmFnZ2VkIHRlbnNvci5cbiAqICAgICAtIG5HcmFtc1NwbGl0czogVGhlIHNwbGl0cyB0ZW5zb3Igb2YgdGhlIG91dHB1dCBuZ3JhbXMgcmFnZ2VkIHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTdHJpbmcnfVxuICovXG5mdW5jdGlvbiBzdHJpbmdOR3JhbXNfKGRhdGEsIGRhdGFTcGxpdHMsIHNlcGFyYXRvciwgbkdyYW1XaWR0aHMsIGxlZnRQYWQsIHJpZ2h0UGFkLCBwYWRXaWR0aCwgcHJlc2VydmVTaG9ydFNlcXVlbmNlcykge1xuICAgIGNvbnN0ICRkYXRhID0gY29udmVydFRvVGVuc29yKGRhdGEsICdkYXRhJywgJ3N0cmluZ05HcmFtcycsICdzdHJpbmcnKTtcbiAgICBpZiAoJGRhdGEuZHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRGF0YSBtdXN0IGJlIG9mIGRhdGF0eXBlIHN0cmluZycpO1xuICAgIH1cbiAgICBpZiAoJGRhdGEuc2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRGF0YSBtdXN0IGJlIGEgdmVjdG9yLCBzYXc6ICR7JGRhdGEuc2hhcGV9YCk7XG4gICAgfVxuICAgIGNvbnN0ICRkYXRhU3BsaXRzID0gY29udmVydFRvVGVuc29yKGRhdGFTcGxpdHMsICdkYXRhU3BsaXRzJywgJ3N0cmluZ05HcmFtcycpO1xuICAgIGlmICgkZGF0YVNwbGl0cy5kdHlwZSAhPT0gJ2ludDMyJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RhdGEgc3BsaXRzIG11c3QgYmUgb2YgZGF0YXR5cGUgaW50MzInKTtcbiAgICB9XG4gICAgY29uc3QgYXR0cnMgPSB7XG4gICAgICAgIHNlcGFyYXRvcixcbiAgICAgICAgbkdyYW1XaWR0aHMsXG4gICAgICAgIGxlZnRQYWQsXG4gICAgICAgIHJpZ2h0UGFkLFxuICAgICAgICBwYWRXaWR0aCxcbiAgICAgICAgcHJlc2VydmVTaG9ydFNlcXVlbmNlc1xuICAgIH07XG4gICAgY29uc3QgaW5wdXRzID0geyBkYXRhOiAkZGF0YSwgZGF0YVNwbGl0czogJGRhdGFTcGxpdHMgfTtcbiAgICBjb25zdCByZXN1bHQgPSBFTkdJTkUucnVuS2VybmVsKFN0cmluZ05HcmFtcywgaW5wdXRzLCBhdHRycyk7XG4gICAgcmV0dXJuIHsgbkdyYW1zOiByZXN1bHRbMF0sIG5HcmFtc1NwbGl0czogcmVzdWx0WzFdIH07XG59XG5leHBvcnQgY29uc3Qgc3RyaW5nTkdyYW1zID0gb3AoeyBzdHJpbmdOR3JhbXNfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RyaW5nX25fZ3JhbXMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IFN0cmluZ1NwbGl0IH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4uL29wZXJhdGlvbic7XG4vKipcbiAqIFNwbGl0IGVsZW1lbnRzIG9mIGBpbnB1dGAgYmFzZWQgb24gYGRlbGltaXRlcmAgaW50byBhIFNwYXJzZVRlbnNvciAuXG4gKlxuICogTGV0IE4gYmUgdGhlIHNpemUgb2Ygc291cmNlICh0eXBpY2FsbHkgTiB3aWxsIGJlIHRoZSBiYXRjaCBzaXplKS4gU3BsaXQgZWFjaFxuICogZWxlbWVudCBvZiBgaW5wdXRgIGJhc2VkIG9uIGBkZWxpbWl0ZXJgIGFuZCByZXR1cm4gYSBTcGFyc2VUZW5zb3IgY29udGFpbmluZ1xuICogdGhlIHNwbGl0dGVkIHRva2Vucy4gRW1wdHkgdG9rZW5zIGFyZSBpZ25vcmVkIGlmIGBza2lwRW1wdHlgIGlzIHNldCB0byBUcnVlLlxuICpcbiAqIGBkZWxpbWl0ZXJgIGNhbiBiZSBlbXB0eSwgb3IgYSBzdHJpbmcgb2Ygc3BsaXQgY2hhcmFjdGVycy4gSWYgYGRlbGltaXRlcmAgaXNcbiAqIGFuIGVtcHR5IHN0cmluZywgZWFjaCBlbGVtZW50IG9mIGBpbnB1dGAgaXMgc3BsaXQgaW50byBpbmRpdmlkdWFsXG4gKiBjaGFyYWN0ZXIgc3RyaW5ncy4gT3RoZXJ3aXNlIGV2ZXJ5IGNoYXJhY3RlciBvZiBgZGVsaW1pdGVyYCBpcyBhIHBvdGVudGlhbFxuICogc3BsaXQgcG9pbnQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHJlc3VsdCA9IHRmLnN0cmluZy5zdHJpbmdTcGxpdChbJ2hlbGxvIHdvcmxkJywgICdhIGIgYyddLCAnICcpO1xuICogcmVzdWx0WydpbmRpY2VzJ10ucHJpbnQoKTsgLy8gW1swLCAwXSwgWzAsIDFdLCBbMSwgMF0sIFsxLCAxXSwgWzEsIDJdXVxuICogcmVzdWx0Wyd2YWx1ZXMnXS5wcmludCgpOyAvLyBbJ2hlbGxvJywgJ3dvcmxkJywgJ2EnLCAnYicsICdjJ11cbiAqIHJlc3VsdFsnc2hhcGUnXS5wcmludCgpOyAvLyBbMiwgM11cbiAqIGBgYFxuICogQHBhcmFtIGlucHV0OiAxLUQuIFN0cmluZ3MgdG8gc3BsaXQuXG4gKiBAcGFyYW0gZGVsaW1pdGVyOiAwLUQuIERlbGltaXRlciBjaGFyYWN0ZXJzLCBvciBlbXB0eSBzdHJpbmcuXG4gKiBAcGFyYW0gc2tpcEVtcHR5OiBPcHRpb25hbC4gSWYgdHJ1ZSwgc2tpcCB0aGUgZW1wdHkgc3RyaW5ncyBmcm9tIHRoZSByZXN1bHQuXG4gKiAgICAgRGVmYXVsdHMgdG8gdHJ1ZS5cbiAqIEByZXR1cm4gQSBtYXAgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAgICAgLSBpbmRpY2VzOiBBIGRlbnNlIG1hdHJpeCBvZiBpbnQzMiByZXByZXNlbnRpbmcgdGhlIGluZGljZXMgb2YgdGhlIHNwYXJzZVxuICogICAgICAgdGVuc29yLlxuICogICAgIC0gdmFsdWVzOiBBIHZlY3RvciBvZiBzdHJpbmdzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwbGl0ZWQgdmFsdWVzLlxuICogICAgIC0gc2hhcGU6IGEgbGVuZ3RoLTIgdmVjdG9yIG9mIGludDMyIHJlcHJlc2VudGluZyB0aGUgc2hhcGUgb2YgdGhlIHNwYXJzZVxuICogdGVuc29yLCB3aGVyZSB0aGUgZmlyc3QgdmFsdWUgaXMgTiBhbmQgdGhlIHNlY29uZCB2YWx1ZSBpcyB0aGUgbWF4aW11bSBudW1iZXJcbiAqIG9mIHRva2VucyBpbiBhIHNpbmdsZSBpbnB1dCBlbnRyeS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTdHJpbmcnfVxuICovXG5mdW5jdGlvbiBzdHJpbmdTcGxpdF8oaW5wdXQsIGRlbGltaXRlciwgc2tpcEVtcHR5ID0gdHJ1ZSkge1xuICAgIGNvbnN0ICRpbnB1dCA9IGNvbnZlcnRUb1RlbnNvcihpbnB1dCwgJ2lucHV0JywgJ3N0cmluZ1NwbGl0JywgJ3N0cmluZycpO1xuICAgIGNvbnN0ICRkZWxpbWl0ZXIgPSBjb252ZXJ0VG9UZW5zb3IoZGVsaW1pdGVyLCAnZGVsaW1pdGVyJywgJ3N0cmluZ1NwbGl0JywgJ3N0cmluZycpO1xuICAgIGlmICgkaW5wdXQucmFuayAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYElucHV0IHNob3VsZCBiZSBUZW5zb3IxRCBidXQgcmVjZWl2ZWQgc2hhcGUgJHskaW5wdXQuc2hhcGV9YCk7XG4gICAgfVxuICAgIGlmICgkZGVsaW1pdGVyLnJhbmsgIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEZWxpbWl0ZXIgc2hvdWxkIGJlIGEgc2NhbGFyIGJ1dCByZWNlaXZlZCBzaGFwZSAkeyRkZWxpbWl0ZXIuc2hhcGV9YCk7XG4gICAgfVxuICAgIGNvbnN0IGF0dHJzID0geyBza2lwRW1wdHkgfTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGlucHV0OiAkaW5wdXQsIGRlbGltaXRlcjogJGRlbGltaXRlciB9O1xuICAgIGNvbnN0IHJlc3VsdCA9IEVOR0lORS5ydW5LZXJuZWwoU3RyaW5nU3BsaXQsIGlucHV0cywgYXR0cnMpO1xuICAgIHJldHVybiB7IGluZGljZXM6IHJlc3VsdFswXSwgdmFsdWVzOiByZXN1bHRbMV0sIHNoYXBlOiByZXN1bHRbMl0gfTtcbn1cbmV4cG9ydCBjb25zdCBzdHJpbmdTcGxpdCA9IG9wKHsgc3RyaW5nU3BsaXRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RyaW5nX3NwbGl0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBTdHJpbmdUb0hhc2hCdWNrZXRGYXN0IH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4uL29wZXJhdGlvbic7XG4vKipcbiAqIENvbnZlcnRzIGVhY2ggc3RyaW5nIGluIHRoZSBpbnB1dCBUZW5zb3IgdG8gaXRzIGhhc2ggbW9kIGJ5IGEgbnVtYmVyIG9mXG4gKiBidWNrZXRzLlxuICpcbiAqIFRoZSBoYXNoIGZ1bmN0aW9uIGlzIGRldGVybWluaXN0aWMgb24gdGhlIGNvbnRlbnQgb2YgdGhlIHN0cmluZyB3aXRoaW4gdGhlXG4gKiBwcm9jZXNzIGFuZCB3aWxsIG5ldmVyIGNoYW5nZS4gSG93ZXZlciwgaXQgaXMgbm90IHN1aXRhYmxlIGZvciBjcnlwdG9ncmFwaHkuXG4gKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSB1c2VkIHdoZW4gQ1BVIHRpbWUgaXMgc2NhcmNlIGFuZCBpbnB1dHMgYXJlIHRydXN0ZWQgb3JcbiAqIHVuaW1wb3J0YW50LiBUaGVyZSBpcyBhIHJpc2sgb2YgYWR2ZXJzYXJpZXMgY29uc3RydWN0aW5nIGlucHV0cyB0aGF0IGFsbCBoYXNoXG4gKiB0byB0aGUgc2FtZSBidWNrZXQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHJlc3VsdCA9IHRmLnN0cmluZy5zdHJpbmdUb0hhc2hCdWNrZXRGYXN0KFxuICogICBbJ0hlbGxvJywgJ1RlbnNvckZsb3cnLCAnMi54J10sIDMpO1xuICogcmVzdWx0LnByaW50KCk7IC8vIFswLCAyLCAyXVxuICogYGBgXG4gKiBAcGFyYW0gaW5wdXQ6IFRoZSBzdHJpbmdzIHRvIGFzc2lnbiBhIGhhc2ggYnVja2V0LlxuICogQHBhcmFtIG51bUJ1Y2tldHM6IFRoZSBudW1iZXIgb2YgYnVja2V0cy5cbiAqIEByZXR1cm4gQSBUZW5zb3Igb2YgdGhlIHNhbWUgc2hhcGUgYXMgdGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTdHJpbmcnfVxuICovXG5mdW5jdGlvbiBzdHJpbmdUb0hhc2hCdWNrZXRGYXN0XyhpbnB1dCwgbnVtQnVja2V0cykge1xuICAgIGNvbnN0ICRpbnB1dCA9IGNvbnZlcnRUb1RlbnNvcihpbnB1dCwgJ2lucHV0JywgJ3N0cmluZ1RvSGFzaEJ1Y2tldEZhc3QnLCAnc3RyaW5nJyk7XG4gICAgY29uc3QgYXR0cnMgPSB7IG51bUJ1Y2tldHMgfTtcbiAgICBpZiAobnVtQnVja2V0cyA8PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTnVtYmVyIG9mIGJ1Y2tldHMgbXVzdCBiZSBhdCBsZWFzdCAxYCk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0cyA9IHsgaW5wdXQ6ICRpbnB1dCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFN0cmluZ1RvSGFzaEJ1Y2tldEZhc3QsIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3QgPSBvcCh7IHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RyaW5nX3RvX2hhc2hfYnVja2V0X2Zhc3QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFN1YiB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBtYWtlVHlwZXNNYXRjaCB9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogU3VidHJhY3RzIHR3byBgdGYuVGVuc29yYHMgZWxlbWVudC13aXNlLCBBIC0gQi4gU3VwcG9ydHMgYnJvYWRjYXN0aW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEwLCAyMCwgMzAsIDQwXSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzEsIDIsIDMsIDRdKTtcbiAqXG4gKiBhLnN1YihiKS5wcmludCgpOyAgLy8gb3IgdGYuc3ViKGEsIGIpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogLy8gQnJvYWRjYXN0IHN1YnRyYWN0IGEgd2l0aCBiLlxuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxMCwgMjAsIDMwLCA0MF0pO1xuICogY29uc3QgYiA9IHRmLnNjYWxhcig1KTtcbiAqXG4gKiBhLnN1YihiKS5wcmludCgpOyAgLy8gb3IgdGYuc3ViKGEsIGIpXG4gKiBgYGBcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBgdGYuVGVuc29yYCB0byBzdWJ0cmFjdCBmcm9tLlxuICogQHBhcmFtIGIgVGhlIHNlY29uZCBgdGYuVGVuc29yYCB0byBiZSBzdWJ0cmFjdGVkLiBNdXN0IGhhdmUgdGhlIHNhbWUgZHR5cGUgYXNcbiAqIGBhYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdBcml0aG1ldGljJ31cbiAqL1xuZnVuY3Rpb24gc3ViXyhhLCBiKSB7XG4gICAgbGV0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ3N1YicpO1xuICAgIGxldCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdzdWInKTtcbiAgICBbJGEsICRiXSA9IG1ha2VUeXBlc01hdGNoKCRhLCAkYik7XG4gICAgY29uc3QgaW5wdXRzID0geyBhOiAkYSwgYjogJGIgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChTdWIsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3Qgc3ViID0gb3AoeyBzdWJfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3ViLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBTdW0gfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGNhc3QgfSBmcm9tICcuL2Nhc3QnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBzdW0gb2YgZWxlbWVudHMgYWNyb3NzIGRpbWVuc2lvbnMgb2YgYSBgdGYuVGVuc29yYC5cbiAqXG4gKiBSZWR1Y2VzIHRoZSBpbnB1dCBhbG9uZyB0aGUgZGltZW5zaW9ucyBnaXZlbiBpbiBgYXhlc2AuIFVubGVzcyBga2VlcERpbXNgXG4gKiBpcyB0cnVlLCB0aGUgcmFuayBvZiB0aGUgYHRmLlRlbnNvcmAgaXMgcmVkdWNlZCBieSAxIGZvciBlYWNoIGVudHJ5IGluXG4gKiBgYXhlc2AuIElmIGBrZWVwRGltc2AgaXMgdHJ1ZSwgdGhlIHJlZHVjZWQgZGltZW5zaW9ucyBhcmUgcmV0YWluZWQgd2l0aFxuICogbGVuZ3RoIDEuIElmIGF4ZXMgaGFzIG5vIGVudHJpZXMsIGFsbCBkaW1lbnNpb25zIGFyZSByZWR1Y2VkLCBhbmQgYVxuICogYHRmLlRlbnNvcmAgd2l0aCBhIHNpbmdsZSBlbGVtZW50IGlzIHJldHVybmVkLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqXG4gKiB4LnN1bSgpLnByaW50KCk7ICAvLyBvciB0Zi5zdW0oeClcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pO1xuICpcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5zdW0oYXhpcykucHJpbnQoKTsgIC8vIG9yIHRmLnN1bSh4LCBheGlzKVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciB0byBjb21wdXRlIHRoZSBzdW0gb3Zlci4gSWYgdGhlIGR0eXBlIGlzIGBib29sYFxuICogICBpdCB3aWxsIGJlIGNvbnZlcnRlZCB0byBgaW50MzJgIGFuZCB0aGUgb3V0cHV0IGR0eXBlIHdpbGwgYmUgYGludDMyYC5cbiAqIEBwYXJhbSBheGlzIFRoZSBkaW1lbnNpb24ocykgdG8gcmVkdWNlLiBCeSBkZWZhdWx0IGl0IHJlZHVjZXNcbiAqICAgICBhbGwgZGltZW5zaW9ucy5cbiAqIEBwYXJhbSBrZWVwRGltcyBJZiB0cnVlLCByZXRhaW5zIHJlZHVjZWQgZGltZW5zaW9ucyB3aXRoIHNpemUgMS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdSZWR1Y3Rpb24nfVxuICovXG5mdW5jdGlvbiBzdW1fKHgsIGF4aXMgPSBudWxsLCBrZWVwRGltcyA9IGZhbHNlKSB7XG4gICAgbGV0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3N1bScpO1xuICAgIGlmICgkeC5kdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgICAgICR4ID0gY2FzdCgkeCwgJ2ludDMyJyk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICBjb25zdCBhdHRycyA9IHsgYXhpcywga2VlcERpbXMgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChTdW0sIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IHN1bSA9IG9wKHsgc3VtXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN1bS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgVGFuIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgdGFuIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2UsIGB0YW4oeClgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMCwgTWF0aC5QSSAvIDIsIE1hdGguUEkgKiAzIC8gNF0pO1xuICpcbiAqIHgudGFuKCkucHJpbnQoKTsgIC8vIG9yIHRmLnRhbih4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiB0YW5fKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICd0YW4nKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoVGFuLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IHRhbiA9IG9wKHsgdGFuXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRhbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgVGFuaCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIGh5cGVyYm9saWMgdGFuZ2VudCBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOiBgdGFuaCh4KWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFswLCAxLCAtMSwgNzBdKTtcbiAqXG4gKiB4LnRhbmgoKS5wcmludCgpOyAgLy8gb3IgdGYudGFuaCh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiB0YW5oXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAndGFuaCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChUYW5oLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IHRhbmggPSBvcCh7IHRhbmhfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGFuaC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBpbmZlclNoYXBlIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG1ha2VUZW5zb3IgfSBmcm9tICcuL3RlbnNvcl9vcHNfdXRpbCc7XG4vKipcbiAqIENyZWF0ZXMgYSBgdGYuVGVuc29yYCB3aXRoIHRoZSBwcm92aWRlZCB2YWx1ZXMsIHNoYXBlIGFuZCBkdHlwZS5cbiAqXG4gKiBgYGBqc1xuICogLy8gUGFzcyBhbiBhcnJheSBvZiB2YWx1ZXMgdG8gY3JlYXRlIGEgdmVjdG9yLlxuICogdGYudGVuc29yKFsxLCAyLCAzLCA0XSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBQYXNzIGEgbmVzdGVkIGFycmF5IG9mIHZhbHVlcyB0byBtYWtlIGEgbWF0cml4IG9yIGEgaGlnaGVyXG4gKiAvLyBkaW1lbnNpb25hbCB0ZW5zb3IuXG4gKiB0Zi50ZW5zb3IoW1sxLCAyXSwgWzMsIDRdXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBQYXNzIGEgZmxhdCBhcnJheSBhbmQgc3BlY2lmeSBhIHNoYXBlIHlvdXJzZWxmLlxuICogdGYudGVuc29yKFsxLCAyLCAzLCA0XSwgWzIsIDJdKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHZhbHVlcyBUaGUgdmFsdWVzIG9mIHRoZSB0ZW5zb3IuIENhbiBiZSBuZXN0ZWQgYXJyYXkgb2YgbnVtYmVycyxcbiAqICAgICBvciBhIGZsYXQgYXJyYXksIG9yIGEgYFR5cGVkQXJyYXlgLiBJZiB0aGUgdmFsdWVzIGFyZSBzdHJpbmdzLFxuICogICAgIHRoZXkgd2lsbCBiZSBlbmNvZGVkIGFzIHV0Zi04IGFuZCBrZXB0IGFzIGBVaW50OEFycmF5W11gLlxuICogQHBhcmFtIHNoYXBlIFRoZSBzaGFwZSBvZiB0aGUgdGVuc29yLiBPcHRpb25hbC4gSWYgbm90IHByb3ZpZGVkLFxuICogICBpdCBpcyBpbmZlcnJlZCBmcm9tIGB2YWx1ZXNgLlxuICogQHBhcmFtIGR0eXBlIFRoZSBkYXRhIHR5cGUuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdGVuc29yKHZhbHVlcywgc2hhcGUsIGR0eXBlKSB7XG4gICAgY29uc3QgaW5mZXJyZWRTaGFwZSA9IGluZmVyU2hhcGUodmFsdWVzLCBkdHlwZSk7XG4gICAgcmV0dXJuIG1ha2VUZW5zb3IodmFsdWVzLCBzaGFwZSwgaW5mZXJyZWRTaGFwZSwgZHR5cGUpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGVuc29yLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGluZmVyU2hhcGUgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0Tm9uTnVsbCB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgbWFrZVRlbnNvciB9IGZyb20gJy4vdGVuc29yX29wc191dGlsJztcbi8qKlxuICogQ3JlYXRlcyByYW5rLTEgYHRmLlRlbnNvcmAgd2l0aCB0aGUgcHJvdmlkZWQgdmFsdWVzLCBzaGFwZSBhbmQgZHR5cGUuXG4gKlxuICogVGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBjYW4gYmUgYWNoaWV2ZWQgd2l0aCBgdGYudGVuc29yYCwgYnV0IGluIGdlbmVyYWxcbiAqIHdlIHJlY29tbWVuZCB1c2luZyBgdGYudGVuc29yMWRgIGFzIGl0IG1ha2VzIHRoZSBjb2RlIG1vcmUgcmVhZGFibGUuXG4gKlxuICogYGBganNcbiAqIHRmLnRlbnNvcjFkKFsxLCAyLCAzXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB2YWx1ZXMgVGhlIHZhbHVlcyBvZiB0aGUgdGVuc29yLiBDYW4gYmUgYXJyYXkgb2YgbnVtYmVycyxcbiAqICAgICBvciBhIGBUeXBlZEFycmF5YC5cbiAqIEBwYXJhbSBkdHlwZSBUaGUgZGF0YSB0eXBlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlbnNvcjFkKHZhbHVlcywgZHR5cGUpIHtcbiAgICBhc3NlcnROb25OdWxsKHZhbHVlcyk7XG4gICAgY29uc3QgaW5mZXJyZWRTaGFwZSA9IGluZmVyU2hhcGUodmFsdWVzLCBkdHlwZSk7XG4gICAgaWYgKGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGVuc29yMWQoKSByZXF1aXJlcyB2YWx1ZXMgdG8gYmUgYSBmbGF0L1R5cGVkQXJyYXknKTtcbiAgICB9XG4gICAgY29uc3Qgc2hhcGUgPSBudWxsO1xuICAgIHJldHVybiBtYWtlVGVuc29yKHZhbHVlcywgc2hhcGUsIGluZmVycmVkU2hhcGUsIGR0eXBlKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRlbnNvcjFkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGluZmVyU2hhcGUgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0Tm9uTnVsbCB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgbWFrZVRlbnNvciB9IGZyb20gJy4vdGVuc29yX29wc191dGlsJztcbi8qKlxuICogQ3JlYXRlcyByYW5rLTIgYHRmLlRlbnNvcmAgd2l0aCB0aGUgcHJvdmlkZWQgdmFsdWVzLCBzaGFwZSBhbmQgZHR5cGUuXG4gKlxuICogVGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBjYW4gYmUgYWNoaWV2ZWQgd2l0aCBgdGYudGVuc29yYCwgYnV0IGluIGdlbmVyYWxcbiAqIHdlIHJlY29tbWVuZCB1c2luZyBgdGYudGVuc29yMmRgIGFzIGl0IG1ha2VzIHRoZSBjb2RlIG1vcmUgcmVhZGFibGUuXG4gKlxuICogIGBgYGpzXG4gKiAvLyBQYXNzIGEgbmVzdGVkIGFycmF5LlxuICogdGYudGVuc29yMmQoW1sxLCAyXSwgWzMsIDRdXSkucHJpbnQoKTtcbiAqIGBgYFxuICogYGBganNcbiAqIC8vIFBhc3MgYSBmbGF0IGFycmF5IGFuZCBzcGVjaWZ5IGEgc2hhcGUuXG4gKiB0Zi50ZW5zb3IyZChbMSwgMiwgMywgNF0sIFsyLCAyXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB2YWx1ZXMgVGhlIHZhbHVlcyBvZiB0aGUgdGVuc29yLiBDYW4gYmUgbmVzdGVkIGFycmF5IG9mIG51bWJlcnMsXG4gKiAgICAgb3IgYSBmbGF0IGFycmF5LCBvciBhIGBUeXBlZEFycmF5YC5cbiAqIEBwYXJhbSBzaGFwZSBUaGUgc2hhcGUgb2YgdGhlIHRlbnNvci4gSWYgbm90IHByb3ZpZGVkLCBpdCBpcyBpbmZlcnJlZCBmcm9tXG4gKiAgICAgYHZhbHVlc2AuXG4gKiBAcGFyYW0gZHR5cGUgVGhlIGRhdGEgdHlwZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZW5zb3IyZCh2YWx1ZXMsIHNoYXBlLCBkdHlwZSkge1xuICAgIGFzc2VydE5vbk51bGwodmFsdWVzKTtcbiAgICBpZiAoc2hhcGUgIT0gbnVsbCAmJiBzaGFwZS5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0ZW5zb3IyZCgpIHJlcXVpcmVzIHNoYXBlIHRvIGhhdmUgdHdvIG51bWJlcnMnKTtcbiAgICB9XG4gICAgY29uc3QgaW5mZXJyZWRTaGFwZSA9IGluZmVyU2hhcGUodmFsdWVzLCBkdHlwZSk7XG4gICAgaWYgKGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSAyICYmIGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGVuc29yMmQoKSByZXF1aXJlcyB2YWx1ZXMgdG8gYmUgbnVtYmVyW11bXSBvciBmbGF0L1R5cGVkQXJyYXknKTtcbiAgICB9XG4gICAgaWYgKGluZmVycmVkU2hhcGUubGVuZ3RoID09PSAxICYmIHNoYXBlID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0ZW5zb3IyZCgpIHJlcXVpcmVzIHNoYXBlIHRvIGJlIHByb3ZpZGVkIHdoZW4gYHZhbHVlc2AgJyArXG4gICAgICAgICAgICAnYXJlIGEgZmxhdC9UeXBlZEFycmF5Jyk7XG4gICAgfVxuICAgIHJldHVybiBtYWtlVGVuc29yKHZhbHVlcywgc2hhcGUsIGluZmVycmVkU2hhcGUsIGR0eXBlKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRlbnNvcjJkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGluZmVyU2hhcGUgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0Tm9uTnVsbCB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgbWFrZVRlbnNvciB9IGZyb20gJy4vdGVuc29yX29wc191dGlsJztcbi8qKlxuICogQ3JlYXRlcyByYW5rLTMgYHRmLlRlbnNvcmAgd2l0aCB0aGUgcHJvdmlkZWQgdmFsdWVzLCBzaGFwZSBhbmQgZHR5cGUuXG4gKlxuICogVGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBjYW4gYmUgYWNoaWV2ZWQgd2l0aCBgdGYudGVuc29yYCwgYnV0IGluIGdlbmVyYWxcbiAqIHdlIHJlY29tbWVuZCB1c2luZyBgdGYudGVuc29yM2RgIGFzIGl0IG1ha2VzIHRoZSBjb2RlIG1vcmUgcmVhZGFibGUuXG4gKlxuICogIGBgYGpzXG4gKiAvLyBQYXNzIGEgbmVzdGVkIGFycmF5LlxuICogdGYudGVuc29yM2QoW1tbMV0sIFsyXV0sIFtbM10sIFs0XV1dKS5wcmludCgpO1xuICogYGBgXG4gKiBgYGBqc1xuICogLy8gUGFzcyBhIGZsYXQgYXJyYXkgYW5kIHNwZWNpZnkgYSBzaGFwZS5cbiAqIHRmLnRlbnNvcjNkKFsxLCAyLCAzLCA0XSwgWzIsIDIsIDFdKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHZhbHVlcyBUaGUgdmFsdWVzIG9mIHRoZSB0ZW5zb3IuIENhbiBiZSBuZXN0ZWQgYXJyYXkgb2YgbnVtYmVycyxcbiAqICAgICBvciBhIGZsYXQgYXJyYXksIG9yIGEgYFR5cGVkQXJyYXlgLlxuICogQHBhcmFtIHNoYXBlIFRoZSBzaGFwZSBvZiB0aGUgdGVuc29yLiBJZiBub3QgcHJvdmlkZWQsICBpdCBpcyBpbmZlcnJlZCBmcm9tXG4gKiAgICAgYHZhbHVlc2AuXG4gKiBAcGFyYW0gZHR5cGUgVGhlIGRhdGEgdHlwZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZW5zb3IzZCh2YWx1ZXMsIHNoYXBlLCBkdHlwZSkge1xuICAgIGFzc2VydE5vbk51bGwodmFsdWVzKTtcbiAgICBpZiAoc2hhcGUgIT0gbnVsbCAmJiBzaGFwZS5sZW5ndGggIT09IDMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0ZW5zb3IzZCgpIHJlcXVpcmVzIHNoYXBlIHRvIGhhdmUgdGhyZWUgbnVtYmVycycpO1xuICAgIH1cbiAgICBjb25zdCBpbmZlcnJlZFNoYXBlID0gaW5mZXJTaGFwZSh2YWx1ZXMsIGR0eXBlKTtcbiAgICBpZiAoaW5mZXJyZWRTaGFwZS5sZW5ndGggIT09IDMgJiYgaW5mZXJyZWRTaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0ZW5zb3IzZCgpIHJlcXVpcmVzIHZhbHVlcyB0byBiZSBudW1iZXJbXVtdW10gb3IgZmxhdC9UeXBlZEFycmF5Jyk7XG4gICAgfVxuICAgIGlmIChpbmZlcnJlZFNoYXBlLmxlbmd0aCA9PT0gMSAmJiBzaGFwZSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGVuc29yM2QoKSByZXF1aXJlcyBzaGFwZSB0byBiZSBwcm92aWRlZCB3aGVuIGB2YWx1ZXNgICcgK1xuICAgICAgICAgICAgJ2FyZSBhIGZsYXQgYXJyYXknKTtcbiAgICB9XG4gICAgcmV0dXJuIG1ha2VUZW5zb3IodmFsdWVzLCBzaGFwZSwgaW5mZXJyZWRTaGFwZSwgZHR5cGUpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGVuc29yM2QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgaW5mZXJTaGFwZSB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnROb25OdWxsIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBtYWtlVGVuc29yIH0gZnJvbSAnLi90ZW5zb3Jfb3BzX3V0aWwnO1xuLyoqXG4gKiBDcmVhdGVzIHJhbmstNCBgdGYuVGVuc29yYCB3aXRoIHRoZSBwcm92aWRlZCB2YWx1ZXMsIHNoYXBlIGFuZCBkdHlwZS5cbiAqXG4gKiBUaGUgc2FtZSBmdW5jdGlvbmFsaXR5IGNhbiBiZSBhY2hpZXZlZCB3aXRoIGB0Zi50ZW5zb3JgLCBidXQgaW4gZ2VuZXJhbFxuICogd2UgcmVjb21tZW5kIHVzaW5nIGB0Zi50ZW5zb3I0ZGAgYXMgaXQgbWFrZXMgdGhlIGNvZGUgbW9yZSByZWFkYWJsZS5cbiAqXG4gKiAgYGBganNcbiAqIC8vIFBhc3MgYSBuZXN0ZWQgYXJyYXkuXG4gKiB0Zi50ZW5zb3I0ZChbW1tbMV0sIFsyXV0sIFtbM10sIFs0XV1dXSkucHJpbnQoKTtcbiAqIGBgYFxuICogYGBganNcbiAqIC8vIFBhc3MgYSBmbGF0IGFycmF5IGFuZCBzcGVjaWZ5IGEgc2hhcGUuXG4gKiB0Zi50ZW5zb3I0ZChbMSwgMiwgMywgNF0sIFsxLCAyLCAyLCAxXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB2YWx1ZXMgVGhlIHZhbHVlcyBvZiB0aGUgdGVuc29yLiBDYW4gYmUgbmVzdGVkIGFycmF5IG9mIG51bWJlcnMsXG4gKiAgICAgb3IgYSBmbGF0IGFycmF5LCBvciBhIGBUeXBlZEFycmF5YC5cbiAqIEBwYXJhbSBzaGFwZSBUaGUgc2hhcGUgb2YgdGhlIHRlbnNvci4gT3B0aW9uYWwuIElmIG5vdCBwcm92aWRlZCxcbiAqICAgaXQgaXMgaW5mZXJyZWQgZnJvbSBgdmFsdWVzYC5cbiAqIEBwYXJhbSBkdHlwZSBUaGUgZGF0YSB0eXBlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlbnNvcjRkKHZhbHVlcywgc2hhcGUsIGR0eXBlKSB7XG4gICAgYXNzZXJ0Tm9uTnVsbCh2YWx1ZXMpO1xuICAgIGlmIChzaGFwZSAhPSBudWxsICYmIHNoYXBlLmxlbmd0aCAhPT0gNCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RlbnNvcjRkKCkgcmVxdWlyZXMgc2hhcGUgdG8gaGF2ZSBmb3VyIG51bWJlcnMnKTtcbiAgICB9XG4gICAgY29uc3QgaW5mZXJyZWRTaGFwZSA9IGluZmVyU2hhcGUodmFsdWVzLCBkdHlwZSk7XG4gICAgaWYgKGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSA0ICYmIGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGVuc29yNGQoKSByZXF1aXJlcyB2YWx1ZXMgdG8gYmUgbnVtYmVyW11bXVtdW10gb3IgZmxhdC9UeXBlZEFycmF5Jyk7XG4gICAgfVxuICAgIGlmIChpbmZlcnJlZFNoYXBlLmxlbmd0aCA9PT0gMSAmJiBzaGFwZSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGVuc29yNGQoKSByZXF1aXJlcyBzaGFwZSB0byBiZSBwcm92aWRlZCB3aGVuIGB2YWx1ZXNgICcgK1xuICAgICAgICAgICAgJ2FyZSBhIGZsYXQgYXJyYXknKTtcbiAgICB9XG4gICAgcmV0dXJuIG1ha2VUZW5zb3IodmFsdWVzLCBzaGFwZSwgaW5mZXJyZWRTaGFwZSwgZHR5cGUpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGVuc29yNGQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgaW5mZXJTaGFwZSB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnROb25OdWxsIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBtYWtlVGVuc29yIH0gZnJvbSAnLi90ZW5zb3Jfb3BzX3V0aWwnO1xuLyoqXG4gKiBDcmVhdGVzIHJhbmstNSBgdGYuVGVuc29yYCB3aXRoIHRoZSBwcm92aWRlZCB2YWx1ZXMsIHNoYXBlIGFuZCBkdHlwZS5cbiAqXG4gKiBUaGUgc2FtZSBmdW5jdGlvbmFsaXR5IGNhbiBiZSBhY2hpZXZlZCB3aXRoIGB0Zi50ZW5zb3JgLCBidXQgaW4gZ2VuZXJhbFxuICogd2UgcmVjb21tZW5kIHVzaW5nIGB0Zi50ZW5zb3I1ZGAgYXMgaXQgbWFrZXMgdGhlIGNvZGUgbW9yZSByZWFkYWJsZS5cbiAqXG4gKiAgYGBganNcbiAqIC8vIFBhc3MgYSBuZXN0ZWQgYXJyYXkuXG4gKiB0Zi50ZW5zb3I1ZChbW1tbWzFdLFsyXV0sW1szXSxbNF1dXSxbW1s1XSxbNl1dLFtbN10sWzhdXV1dXSkucHJpbnQoKTtcbiAqIGBgYFxuICogYGBganNcbiAqIC8vIFBhc3MgYSBmbGF0IGFycmF5IGFuZCBzcGVjaWZ5IGEgc2hhcGUuXG4gKiB0Zi50ZW5zb3I1ZChbMSwgMiwgMywgNCwgNSwgNiwgNywgOF0sIFsxLCAyLCAyLCAyLCAxXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB2YWx1ZXMgVGhlIHZhbHVlcyBvZiB0aGUgdGVuc29yLiBDYW4gYmUgbmVzdGVkIGFycmF5IG9mIG51bWJlcnMsXG4gKiAgICAgb3IgYSBmbGF0IGFycmF5LCBvciBhIGBUeXBlZEFycmF5YC5cbiAqIEBwYXJhbSBzaGFwZSBUaGUgc2hhcGUgb2YgdGhlIHRlbnNvci4gT3B0aW9uYWwuIElmIG5vdCBwcm92aWRlZCxcbiAqICAgaXQgaXMgaW5mZXJyZWQgZnJvbSBgdmFsdWVzYC5cbiAqIEBwYXJhbSBkdHlwZSBUaGUgZGF0YSB0eXBlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlbnNvcjVkKHZhbHVlcywgc2hhcGUsIGR0eXBlKSB7XG4gICAgYXNzZXJ0Tm9uTnVsbCh2YWx1ZXMpO1xuICAgIGlmIChzaGFwZSAhPSBudWxsICYmIHNoYXBlLmxlbmd0aCAhPT0gNSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RlbnNvcjVkKCkgcmVxdWlyZXMgc2hhcGUgdG8gaGF2ZSBmaXZlIG51bWJlcnMnKTtcbiAgICB9XG4gICAgY29uc3QgaW5mZXJyZWRTaGFwZSA9IGluZmVyU2hhcGUodmFsdWVzLCBkdHlwZSk7XG4gICAgaWYgKGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSA1ICYmIGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGVuc29yNWQoKSByZXF1aXJlcyB2YWx1ZXMgdG8gYmUgJyArXG4gICAgICAgICAgICAnbnVtYmVyW11bXVtdW11bXSBvciBmbGF0L1R5cGVkQXJyYXknKTtcbiAgICB9XG4gICAgaWYgKGluZmVycmVkU2hhcGUubGVuZ3RoID09PSAxICYmIHNoYXBlID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0ZW5zb3I1ZCgpIHJlcXVpcmVzIHNoYXBlIHRvIGJlIHByb3ZpZGVkIHdoZW4gYHZhbHVlc2AgJyArXG4gICAgICAgICAgICAnYXJlIGEgZmxhdCBhcnJheScpO1xuICAgIH1cbiAgICByZXR1cm4gbWFrZVRlbnNvcih2YWx1ZXMsIHNoYXBlLCBpbmZlcnJlZFNoYXBlLCBkdHlwZSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD10ZW5zb3I1ZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBpbmZlclNoYXBlIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGFzc2VydE5vbk51bGwgfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG1ha2VUZW5zb3IgfSBmcm9tICcuL3RlbnNvcl9vcHNfdXRpbCc7XG4vKipcbiAqIENyZWF0ZXMgcmFuay02IGB0Zi5UZW5zb3JgIHdpdGggdGhlIHByb3ZpZGVkIHZhbHVlcywgc2hhcGUgYW5kIGR0eXBlLlxuICpcbiAqIFRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgY2FuIGJlIGFjaGlldmVkIHdpdGggYHRmLnRlbnNvcmAsIGJ1dCBpbiBnZW5lcmFsXG4gKiB3ZSByZWNvbW1lbmQgdXNpbmcgYHRmLnRlbnNvcjZkYCBhcyBpdCBtYWtlcyB0aGUgY29kZSBtb3JlIHJlYWRhYmxlLlxuICpcbiAqICBgYGBqc1xuICogLy8gUGFzcyBhIG5lc3RlZCBhcnJheS5cbiAqIHRmLnRlbnNvcjZkKFtbW1tbWzFdLFsyXV0sW1szXSxbNF1dXSxbW1s1XSxbNl1dLFtbN10sWzhdXV1dXV0pLnByaW50KCk7XG4gKiBgYGBcbiAqIGBgYGpzXG4gKiAvLyBQYXNzIGEgZmxhdCBhcnJheSBhbmQgc3BlY2lmeSBhIHNoYXBlLlxuICogdGYudGVuc29yNmQoWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDhdLCBbMSwgMSwgMiwgMiwgMiwgMV0pLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdmFsdWVzIFRoZSB2YWx1ZXMgb2YgdGhlIHRlbnNvci4gQ2FuIGJlIG5lc3RlZCBhcnJheSBvZiBudW1iZXJzLFxuICogICAgIG9yIGEgZmxhdCBhcnJheSwgb3IgYSBgVHlwZWRBcnJheWAuXG4gKiBAcGFyYW0gc2hhcGUgVGhlIHNoYXBlIG9mIHRoZSB0ZW5zb3IuIE9wdGlvbmFsLiBJZiBub3QgcHJvdmlkZWQsXG4gKiAgIGl0IGlzIGluZmVycmVkIGZyb20gYHZhbHVlc2AuXG4gKiBAcGFyYW0gZHR5cGUgVGhlIGRhdGEgdHlwZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZW5zb3I2ZCh2YWx1ZXMsIHNoYXBlLCBkdHlwZSkge1xuICAgIGFzc2VydE5vbk51bGwodmFsdWVzKTtcbiAgICBpZiAoc2hhcGUgIT0gbnVsbCAmJiBzaGFwZS5sZW5ndGggIT09IDYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0ZW5zb3I2ZCgpIHJlcXVpcmVzIHNoYXBlIHRvIGhhdmUgc2l4IG51bWJlcnMnKTtcbiAgICB9XG4gICAgY29uc3QgaW5mZXJyZWRTaGFwZSA9IGluZmVyU2hhcGUodmFsdWVzLCBkdHlwZSk7XG4gICAgaWYgKGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSA2ICYmIGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGVuc29yNmQoKSByZXF1aXJlcyB2YWx1ZXMgdG8gYmUgbnVtYmVyW11bXVtdW11bXVtdIG9yICcgK1xuICAgICAgICAgICAgJ2ZsYXQvVHlwZWRBcnJheScpO1xuICAgIH1cbiAgICBpZiAoaW5mZXJyZWRTaGFwZS5sZW5ndGggPT09IDEgJiYgc2hhcGUgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RlbnNvcjZkKCkgcmVxdWlyZXMgc2hhcGUgdG8gYmUgcHJvdmlkZWQgd2hlbiBgdmFsdWVzYCAnICtcbiAgICAgICAgICAgICdhcmUgYSBmbGF0IGFycmF5Jyk7XG4gICAgfVxuICAgIHNoYXBlID0gc2hhcGUgfHxcbiAgICAgICAgaW5mZXJyZWRTaGFwZTtcbiAgICByZXR1cm4gbWFrZVRlbnNvcih2YWx1ZXMsIHNoYXBlLCBpbmZlcnJlZFNoYXBlLCBkdHlwZSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD10ZW5zb3I2ZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgYXNzZXJ0LCBhc3NlcnROb25OZWdhdGl2ZUludGVnZXJEaW1lbnNpb25zLCBmbGF0dGVuLCBpbmZlckR0eXBlLCBpc1R5cGVkQXJyYXksIHNpemVGcm9tU2hhcGUsIHRvVHlwZWRBcnJheSB9IGZyb20gJy4uL3V0aWwnO1xuLyoqIFRoaXMgaXMgc2hhcmVkIGNvZGUgYWNyb3NzIGFsbCB0ZW5zb3IgY3JlYXRpb24gbWV0aG9kcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlVGVuc29yKHZhbHVlcywgc2hhcGUsIGluZmVycmVkU2hhcGUsIGR0eXBlKSB7XG4gICAgaWYgKGR0eXBlID09IG51bGwpIHtcbiAgICAgICAgZHR5cGUgPSBpbmZlckR0eXBlKHZhbHVlcyk7XG4gICAgfVxuICAgIGlmIChkdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29uc3RydWN0IGEgY29tcGxleDY0IHRlbnNvciBkaXJlY3RseS4gYCArXG4gICAgICAgICAgICBgUGxlYXNlIHVzZSB0Zi5jb21wbGV4KHJlYWwsIGltYWcpLmApO1xuICAgIH1cbiAgICBpZiAoIWlzVHlwZWRBcnJheSh2YWx1ZXMpICYmICFBcnJheS5pc0FycmF5KHZhbHVlcykgJiZcbiAgICAgICAgdHlwZW9mIHZhbHVlcyAhPT0gJ251bWJlcicgJiYgdHlwZW9mIHZhbHVlcyAhPT0gJ2Jvb2xlYW4nICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZXMgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndmFsdWVzIHBhc3NlZCB0byB0ZW5zb3IodmFsdWVzKSBtdXN0IGJlIGEgbnVtYmVyL2Jvb2xlYW4vc3RyaW5nIG9yICcgK1xuICAgICAgICAgICAgJ2FuIGFycmF5IG9mIG51bWJlcnMvYm9vbGVhbnMvc3RyaW5ncywgb3IgYSBUeXBlZEFycmF5Jyk7XG4gICAgfVxuICAgIGlmIChzaGFwZSAhPSBudWxsKSB7XG4gICAgICAgIGFzc2VydE5vbk5lZ2F0aXZlSW50ZWdlckRpbWVuc2lvbnMoc2hhcGUpO1xuICAgICAgICBjb25zdCBwcm92aWRlZFNpemUgPSBzaXplRnJvbVNoYXBlKHNoYXBlKTtcbiAgICAgICAgY29uc3QgaW5mZXJyZWRTaXplID0gc2l6ZUZyb21TaGFwZShpbmZlcnJlZFNoYXBlKTtcbiAgICAgICAgYXNzZXJ0KHByb3ZpZGVkU2l6ZSA9PT0gaW5mZXJyZWRTaXplLCAoKSA9PiBgQmFzZWQgb24gdGhlIHByb3ZpZGVkIHNoYXBlLCBbJHtzaGFwZX1dLCB0aGUgdGVuc29yIHNob3VsZCBoYXZlIGAgK1xuICAgICAgICAgICAgYCR7cHJvdmlkZWRTaXplfSB2YWx1ZXMgYnV0IGhhcyAke2luZmVycmVkU2l6ZX1gKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmZlcnJlZFNoYXBlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBjb25zdCBpbmZlcnJlZCA9IGluZmVycmVkU2hhcGVbaV07XG4gICAgICAgICAgICBjb25zdCBmbGF0RGltc0RvbnRNYXRjaCA9IGkgPT09IGluZmVycmVkU2hhcGUubGVuZ3RoIC0gMSA/XG4gICAgICAgICAgICAgICAgaW5mZXJyZWQgIT09IHNpemVGcm9tU2hhcGUoc2hhcGUuc2xpY2UoaSkpIDpcbiAgICAgICAgICAgICAgICB0cnVlO1xuICAgICAgICAgICAgYXNzZXJ0KGluZmVycmVkU2hhcGVbaV0gPT09IHNoYXBlW2ldIHx8ICFmbGF0RGltc0RvbnRNYXRjaCwgKCkgPT4gYEVycm9yIGNyZWF0aW5nIGEgbmV3IFRlbnNvci4gSW5mZXJyZWQgc2hhcGUgYCArXG4gICAgICAgICAgICAgICAgYCgke2luZmVycmVkU2hhcGV9KSBkb2VzIG5vdCBtYXRjaCB0aGUgcHJvdmlkZWQgYCArXG4gICAgICAgICAgICAgICAgYHNoYXBlICgke3NoYXBlfSkuIGApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghaXNUeXBlZEFycmF5KHZhbHVlcykgJiYgIUFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgICAgICB2YWx1ZXMgPSBbdmFsdWVzXTtcbiAgICB9XG4gICAgc2hhcGUgPSBzaGFwZSB8fCBpbmZlcnJlZFNoYXBlO1xuICAgIHZhbHVlcyA9IGR0eXBlICE9PSAnc3RyaW5nJyA/XG4gICAgICAgIHRvVHlwZWRBcnJheSh2YWx1ZXMsIGR0eXBlKSA6XG4gICAgICAgIGZsYXR0ZW4odmFsdWVzLCBbXSwgdHJ1ZSk7XG4gICAgcmV0dXJuIEVOR0lORS5tYWtlVGVuc29yKHZhbHVlcywgc2hhcGUsIGR0eXBlKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRlbnNvcl9vcHNfdXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgVGlsZSB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb25zdHJ1Y3QgYSB0ZW5zb3IgYnkgcmVwZWF0aW5nIGl0IHRoZSBudW1iZXIgb2YgdGltZXMgZ2l2ZW4gYnkgcmVwcy5cbiAqXG4gKiBUaGlzIG9wZXJhdGlvbiBjcmVhdGVzIGEgbmV3IHRlbnNvciBieSByZXBsaWNhdGluZyBgaW5wdXRgIGByZXBzYFxuICogdGltZXMuIFRoZSBvdXRwdXQgdGVuc29yJ3MgaSd0aCBkaW1lbnNpb24gaGFzIGBpbnB1dC5zaGFwZVtpXSAqXG4gKiByZXBzW2ldYCBlbGVtZW50cywgYW5kIHRoZSB2YWx1ZXMgb2YgYGlucHV0YCBhcmUgcmVwbGljYXRlZFxuICogYHJlcHNbaV1gIHRpbWVzIGFsb25nIHRoZSBpJ3RoIGRpbWVuc2lvbi4gRm9yIGV4YW1wbGUsIHRpbGluZ1xuICogYFthLCBiLCBjLCBkXWAgYnkgYFsyXWAgcHJvZHVjZXMgYFthLCBiLCBjLCBkLCBhLCBiLCBjLCBkXWAuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMl0pO1xuICpcbiAqIGEudGlsZShbMl0pLnByaW50KCk7ICAgIC8vIG9yIGEudGlsZShbMl0pXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjJkKFsxLCAyLCAzLCA0XSwgWzIsIDJdKTtcbiAqXG4gKiBhLnRpbGUoWzEsIDJdKS5wcmludCgpOyAgLy8gb3IgYS50aWxlKFsxLCAyXSlcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIHRlbnNvciB0byB0aWxlLlxuICogQHBhcmFtIHJlcHMgRGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIHJlcGxpY2F0aW9ucyBwZXIgZGltZW5zaW9uLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1NsaWNpbmcgYW5kIEpvaW5pbmcnfVxuICovXG5mdW5jdGlvbiB0aWxlXyh4LCByZXBzKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAndGlsZScsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICAgIHV0aWwuYXNzZXJ0KCR4LnJhbmsgPT09IHJlcHMubGVuZ3RoLCAoKSA9PiBgRXJyb3IgaW4gdHJhbnNwb3NlOiByYW5rIG9mIGlucHV0ICR7JHgucmFua30gYCArXG4gICAgICAgIGBtdXN0IG1hdGNoIGxlbmd0aCBvZiByZXBzICR7cmVwc30uYCk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyByZXBzIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoVGlsZSwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgdGlsZSA9IG9wKHsgdGlsZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10aWxlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBUb3BLIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogRmluZHMgdGhlIHZhbHVlcyBhbmQgaW5kaWNlcyBvZiB0aGUgYGtgIGxhcmdlc3QgZW50cmllcyBhbG9uZyB0aGUgbGFzdFxuICogZGltZW5zaW9uLlxuICpcbiAqIElmIHRoZSBpbnB1dCBpcyBhIHZlY3RvciAocmFuaz0xKSwgZmluZHMgdGhlIGsgbGFyZ2VzdCBlbnRyaWVzIGluIHRoZSB2ZWN0b3JcbiAqIGFuZCBvdXRwdXRzIHRoZWlyIHZhbHVlcyBhbmQgaW5kaWNlcyBhcyB2ZWN0b3JzLiBUaHVzIHZhbHVlc1tqXSBpcyB0aGUgai10aFxuICogbGFyZ2VzdCBlbnRyeSBpbiBpbnB1dCwgYW5kIGl0cyBpbmRleCBpcyBpbmRpY2VzW2pdLlxuICogRm9yIGhpZ2hlciByYW5rIGlucHV0cywgY29tcHV0ZXMgdGhlIHRvcCBrIGVudHJpZXMgYWxvbmcgdGhlIGxhc3QgZGltZW5zaW9uLlxuICpcbiAqIElmIHR3byBlbGVtZW50cyBhcmUgZXF1YWwsIHRoZSBsb3dlci1pbmRleCBlbGVtZW50IGFwcGVhcnMgZmlyc3QuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IyZChbWzEsIDVdLCBbNCwgM11dKTtcbiAqIGNvbnN0IHt2YWx1ZXMsIGluZGljZXN9ID0gdGYudG9wayhhKTtcbiAqIHZhbHVlcy5wcmludCgpO1xuICogaW5kaWNlcy5wcmludCgpO1xuICogYGBgXG4gKiBAcGFyYW0geCAxLUQgb3IgaGlnaGVyIGB0Zi5UZW5zb3JgIHdpdGggbGFzdCBkaW1lbnNpb24gYmVpbmcgYXQgbGVhc3QgYGtgLlxuICogQHBhcmFtIGsgTnVtYmVyIG9mIHRvcCBlbGVtZW50cyB0byBsb29rIGZvciBhbG9uZyB0aGUgbGFzdCBkaW1lbnNpb24uXG4gKiBAcGFyYW0gc29ydGVkIElmIHRydWUsIHRoZSByZXN1bHRpbmcgYGtgIGVsZW1lbnRzIHdpbGwgYmUgc29ydGVkIGJ5IHRoZVxuICogICAgIHZhbHVlcyBpbiBkZXNjZW5kaW5nIG9yZGVyLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0V2YWx1YXRpb24nfVxuICovXG5mdW5jdGlvbiB0b3BrXyh4LCBrID0gMSwgc29ydGVkID0gdHJ1ZSkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3RvcGsnKTtcbiAgICBpZiAoJHgucmFuayA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RvcGsoKSBleHBlY3RzIHRoZSBpbnB1dCB0byBiZSBvZiByYW5rIDEgb3IgaGlnaGVyJyk7XG4gICAgfVxuICAgIGNvbnN0IGxhc3REaW0gPSAkeC5zaGFwZVskeC5zaGFwZS5sZW5ndGggLSAxXTtcbiAgICBpZiAoayA8IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAnaycgcGFzc2VkIHRvIHRvcGsoKSBtdXN0IGJlID49IDAgYnV0IGdvdCAke2t9YCk7XG4gICAgfVxuICAgIGlmIChrID4gbGFzdERpbSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCdrJyBwYXNzZWQgdG8gdG9waygpIG11c3QgYmUgPD0gdGhlIGxhc3QgZGltZW5zaW9uICgke2xhc3REaW19KSBgICtcbiAgICAgICAgICAgIGBidXQgZ290ICR7a31gKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBrLCBzb3J0ZWQgfTtcbiAgICBjb25zdCBbdmFsdWVzLCBpbmRpY2VzXSA9IEVOR0lORS5ydW5LZXJuZWwoVG9wSywgaW5wdXRzLCBhdHRycyk7XG4gICAgcmV0dXJuIHsgdmFsdWVzLCBpbmRpY2VzIH07XG59XG5leHBvcnQgY29uc3QgdG9wayA9IG9wKHsgdG9wa18gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10b3BrLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBUcmFuc3Bvc2UgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogVHJhbnNwb3NlcyB0aGUgYHRmLlRlbnNvcmAuIFBlcm11dGVzIHRoZSBkaW1lbnNpb25zIGFjY29yZGluZyB0byBgcGVybWAuXG4gKlxuICogVGhlIHJldHVybmVkIGB0Zi5UZW5zb3JgJ3MgZGltZW5zaW9uIGBpYCB3aWxsIGNvcnJlc3BvbmQgdG8gdGhlIGlucHV0XG4gKiBkaW1lbnNpb24gYHBlcm1baV1gLiBJZiBgcGVybWAgaXMgbm90IGdpdmVuLCBpdCBpcyBzZXQgdG8gYFtuLTEuLi4wXWAsXG4gKiB3aGVyZSBgbmAgaXMgdGhlIHJhbmsgb2YgdGhlIGlucHV0IGB0Zi5UZW5zb3JgLiBIZW5jZSBieSBkZWZhdWx0LCB0aGlzXG4gKiBvcGVyYXRpb24gcGVyZm9ybXMgYSByZWd1bGFyIG1hdHJpeCB0cmFuc3Bvc2Ugb24gMi1EIGlucHV0IGB0Zi5UZW5zb3Jgcy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjJkKFsxLCAyLCAzLCA0LCA1LCA2XSwgWzIsIDNdKTtcbiAqXG4gKiBhLnRyYW5zcG9zZSgpLnByaW50KCk7ICAvLyBvciB0Zi50cmFuc3Bvc2UoYSlcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSB0ZW5zb3IgdG8gdHJhbnNwb3NlLlxuICogQHBhcmFtIHBlcm0gVGhlIHBlcm11dGF0aW9uIG9mIHRoZSBkaW1lbnNpb25zIG9mIGEuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTWF0cmljZXMnfVxuICovXG5mdW5jdGlvbiB0cmFuc3Bvc2VfKHgsIHBlcm0pIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICd0cmFuc3Bvc2UnKTtcbiAgICBpZiAocGVybSA9PSBudWxsKSB7XG4gICAgICAgIHBlcm0gPSAkeC5zaGFwZS5tYXAoKHMsIGkpID0+IGkpLnJldmVyc2UoKTtcbiAgICB9XG4gICAgdXRpbC5hc3NlcnQoJHgucmFuayA9PT0gcGVybS5sZW5ndGgsICgpID0+IGBFcnJvciBpbiB0cmFuc3Bvc2U6IHJhbmsgb2YgaW5wdXQgJHskeC5yYW5rfSBgICtcbiAgICAgICAgYG11c3QgbWF0Y2ggbGVuZ3RoIG9mIHBlcm0gJHtwZXJtfS5gKTtcbiAgICBwZXJtLmZvckVhY2goYXhpcyA9PiB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KGF4aXMgPj0gMCAmJiBheGlzIDwgJHgucmFuaywgKCkgPT4gYEFsbCBlbnRyaWVzIGluICdwZXJtJyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgJHskeC5yYW5rIC0gMX1gICtcbiAgICAgICAgICAgIGAgYnV0IGdvdCAke3Blcm19YCk7XG4gICAgfSk7XG4gICAgaWYgKCR4LnJhbmsgPD0gMSkge1xuICAgICAgICByZXR1cm4gJHguY2xvbmUoKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBwZXJtIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoVHJhbnNwb3NlLCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCB0cmFuc3Bvc2UgPSBvcCh7IHRyYW5zcG9zZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10cmFuc3Bvc2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYnVmZmVyIH0gZnJvbSAnLi9idWZmZXInO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyBNUFJhbmRHYXVzcyB9IGZyb20gJy4vcmFuZF91dGlsJztcbi8qKlxuICogQ3JlYXRlcyBhIGB0Zi5UZW5zb3JgIHdpdGggdmFsdWVzIHNhbXBsZWQgZnJvbSBhIHRydW5jYXRlZCBub3JtYWxcbiAqIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiBgYGBqc1xuICogdGYudHJ1bmNhdGVkTm9ybWFsKFsyLCAyXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIFRoZSBnZW5lcmF0ZWQgdmFsdWVzIGZvbGxvdyBhIG5vcm1hbCBkaXN0cmlidXRpb24gd2l0aCBzcGVjaWZpZWQgbWVhbiBhbmRcbiAqIHN0YW5kYXJkIGRldmlhdGlvbiwgZXhjZXB0IHRoYXQgdmFsdWVzIHdob3NlIG1hZ25pdHVkZSBpcyBtb3JlIHRoYW4gMlxuICogc3RhbmRhcmQgZGV2aWF0aW9ucyBmcm9tIHRoZSBtZWFuIGFyZSBkcm9wcGVkIGFuZCByZS1waWNrZWQuXG4gKlxuICogQHBhcmFtIHNoYXBlIEFuIGFycmF5IG9mIGludGVnZXJzIGRlZmluaW5nIHRoZSBvdXRwdXQgdGVuc29yIHNoYXBlLlxuICogQHBhcmFtIG1lYW4gVGhlIG1lYW4gb2YgdGhlIG5vcm1hbCBkaXN0cmlidXRpb24uXG4gKiBAcGFyYW0gc3RkRGV2IFRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIG5vcm1hbCBkaXN0cmlidXRpb24uXG4gKiBAcGFyYW0gZHR5cGUgVGhlIGRhdGEgdHlwZSBvZiB0aGUgb3V0cHV0IHRlbnNvci5cbiAqIEBwYXJhbSBzZWVkIFRoZSBzZWVkIGZvciB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5mdW5jdGlvbiB0cnVuY2F0ZWROb3JtYWxfKHNoYXBlLCBtZWFuID0gMCwgc3RkRGV2ID0gMSwgZHR5cGUsIHNlZWQpIHtcbiAgICBpZiAoZHR5cGUgIT0gbnVsbCAmJiBkdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgZGF0YSB0eXBlICQgeyBkdHlwZSB9YCk7XG4gICAgfVxuICAgIGNvbnN0IHJhbmRHYXVzcyA9IG5ldyBNUFJhbmRHYXVzcyhtZWFuLCBzdGREZXYsIGR0eXBlLCB0cnVlIC8qIHRydW5jYXRlZCAqLywgc2VlZCk7XG4gICAgY29uc3QgcmVzID0gYnVmZmVyKHNoYXBlLCBkdHlwZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXMudmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlcy52YWx1ZXNbaV0gPSByYW5kR2F1c3MubmV4dFZhbHVlKCk7XG4gICAgfVxuICAgIHJldHVybiByZXMudG9UZW5zb3IoKTtcbn1cbmV4cG9ydCBjb25zdCB0cnVuY2F0ZWROb3JtYWwgPSBvcCh7IHRydW5jYXRlZE5vcm1hbF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10cnVuY2F0ZWRfbm9ybWFsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBVbmlxdWUgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIEZpbmRzIHVuaXF1ZSBlbGVtZW50cyBhbG9uZyBhbiBheGlzIG9mIGEgdGVuc29yLlxuICpcbiAqIEl0IHJldHVybnMgYSB0ZW5zb3IgYHZhbHVlc2AgY29udGFpbmluZyBhbGwgb2YgdGhlIHVuaXF1ZSBlbGVtZW50cyBhbG9uZyB0aGVcbiAqIGBheGlzYCBvZiB0aGUgZ2l2ZW4gdGVuc29yIGB4YCBpbiB0aGUgc2FtZSBvcmRlciB0aGF0IHRoZXkgb2NjdXIgYWxvbmcgdGhlXG4gKiBgYXhpc2AgaW4gYHhgOyBgeGAgZG9lcyBub3QgbmVlZCB0byBiZSBzb3J0ZWQuIEl0IGFsc28gcmV0dXJucyBhIHRlbnNvclxuICogYGluZGljZXNgIHRoZSBzYW1lIHNpemUgYXMgdGhlIG51bWJlciBvZiB0aGUgZWxlbWVudHMgaW4gYHhgIGFsb25nIHRoZSBgYXhpc2BcbiAqIGRpbWVuc2lvbi4gSXQgY29udGFpbnMgdGhlIGluZGV4IGluIHRoZSB1bmlxdWUgb3V0cHV0IGB2YWx1ZXNgLlxuICpcbiAqIGBgYGpzXG4gKiAvLyBBIDEtRCB0ZW5zb3JcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMSwgMiwgNCwgNCwgNCwgNywgOCwgOF0pO1xuICogY29uc3Qge3ZhbHVlcywgaW5kaWNlc30gPSB0Zi51bmlxdWUoYSk7XG4gKiB2YWx1ZXMucHJpbnQoKTsgICAvLyBbMSwgMiwgNCwgNywgOCxdXG4gKiBpbmRpY2VzLnByaW50KCk7ICAvLyBbMCwgMCwgMSwgMiwgMiwgMiwgMywgNCwgNF1cbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBBIDItRCB0ZW5zb3Igd2l0aCBheGlzPTBcbiAqIC8vXG4gKiAvLyAnYScgaXM6IFtbMSwgMCwgMF0sXG4gKiAvLyAgICAgICAgICBbMSwgMCwgMF0sXG4gKiAvLyAgICAgICAgICBbMiwgMCwgMF1dXG4gKiBjb25zdCBhID0gdGYudGVuc29yMmQoW1sxLCAwLCAwXSwgWzEsIDAsIDBdLCBbMiwgMCwgMF1dKTtcbiAqIGNvbnN0IHt2YWx1ZXMsIGluZGljZXN9ID0gdGYudW5pcXVlKGEsIDApXG4gKiB2YWx1ZXMucHJpbnQoKTsgICAvLyBbWzEsIDAsIDBdLFxuICogICAgICAgICAgICAgICAgICAgLy8gIFsyLCAwLCAwXV1cbiAqIGluZGljZXMucHJpbnQoKTsgIC8vIFswLCAwLCAxXVxuICogYGBgXG4gKlxuICogYGBganNcbiAqIC8vIEEgMi1EIHRlbnNvciB3aXRoIGF4aXM9MVxuICogLy9cbiAqIC8vICdhJyBpczogW1sxLCAwLCAwXSxcbiAqIC8vICAgICAgICAgIFsxLCAwLCAwXSxcbiAqIC8vICAgICAgICAgIFsyLCAwLCAwXV1cbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IyZChbWzEsIDAsIDBdLCBbMSwgMCwgMF0sIFsyLCAwLCAwXV0pO1xuICogY29uc3Qge3ZhbHVlcywgaW5kaWNlc30gPSB0Zi51bmlxdWUoYSwgMSlcbiAqIHZhbHVlcy5wcmludCgpOyAgIC8vIFtbMSwgMF0sXG4gKiAgICAgICAgICAgICAgICAgICAvLyAgWzEsIDBdLFxuICogICAgICAgICAgICAgICAgICAgLy8gIFsyLCAwXV1cbiAqIGluZGljZXMucHJpbnQoKTsgIC8vIFswLCAxLCAxXVxuICogYGBgXG4gKiBAcGFyYW0geCBBIHRlbnNvciAoaW50MzIsIHN0cmluZywgYm9vbCkuXG4gKiBAcGFyYW0gYXhpcyBUaGUgYXhpcyBvZiB0aGUgdGVuc29yIHRvIGZpbmQgdGhlIHVuaXF1ZSBlbGVtZW50cy5cbiAqIEByZXR1cm5zIFt1bmlxdWVFbGVtZW50cywgaW5kaWNlc10gKHNlZSBhYm92ZSBmb3IgZGV0YWlscylcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdFdmFsdWF0aW9uJ31cbiAqL1xuZnVuY3Rpb24gdW5pcXVlXyh4LCBheGlzID0gMCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3VuaXF1ZScsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICAgIGFzc2VydCgkeC5yYW5rID4gMCwgKCkgPT4gJ1RoZSBpbnB1dCB0ZW5zb3IgbXVzdCBiZSBhdCBsZWFzdCAxRCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICBjb25zdCBhdHRycyA9IHsgYXhpcyB9O1xuICAgIGNvbnN0IFt2YWx1ZXMsIGluZGljZXNdID0gRU5HSU5FLnJ1bktlcm5lbChVbmlxdWUsIGlucHV0cywgYXR0cnMpO1xuICAgIHJldHVybiB7IHZhbHVlcywgaW5kaWNlcyB9O1xufVxuZXhwb3J0IGNvbnN0IHVuaXF1ZSA9IG9wKHsgdW5pcXVlXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVuaXF1ZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgVW5zb3J0ZWRTZWdtZW50U3VtIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnQsIGlzSW50IH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIHN1bSBhbG9uZyBzZWdtZW50cyBvZiBhIGB0Zi5UZW5zb3JgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDMsIDRdKTtcbiAqIGNvbnN0IHNlZ21lbnRJZHMgPSB0Zi50ZW5zb3IxZChbMSwgMiwgMCwgMV0sICdpbnQzMicpO1xuICogY29uc3QgbnVtU2VnbWVudHMgPSAzO1xuICpcbiAqIHgudW5zb3J0ZWRTZWdtZW50U3VtKHNlZ21lbnRJZHMsIG51bVNlZ21lbnRzKS5wcmludCgpXG4gKiAvL29yIHRmLnVuc29ydGVkU2VnbWVudFN1bSh4LCBzZWdtZW50SWRzLCBudW1TZWdtZW50cylcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGB0Zi5UZW5zb3JgIHRoYXQgd2lsbCBiZSBzdW1tZWQgYWxvbmcgaXRzIHNlZ21lbnRzLlxuICogQHBhcmFtIHNlZ21lbnRJZHMgQSBgdGYuVGVuc29yMURgIHdob3NlIHJhbmsgaXMgZXF1YWwgdG8gdGhlIHJhbmsgb2YgYHhgJ3NcbiAqIGRpbWVuc2lvbiBhbG9uZyB0aGUgYGF4aXNgLiAgTWFwcyBlYWNoIGVsZW1lbnQgb2YgYHhgIHRvIGEgc2VnbWVudC5cbiAqIEBwYXJhbSBudW1TZWdtZW50cyBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IGBzZWdtZW50SWRzYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTZWdtZW50J31cbiAqL1xuZnVuY3Rpb24gdW5zb3J0ZWRTZWdtZW50U3VtXyh4LCBzZWdtZW50SWRzLCBudW1TZWdtZW50cykge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3Vuc29ydGVkU2VnbWVudFN1bScpO1xuICAgIGNvbnN0ICRzZWdtZW50SWRzID0gY29udmVydFRvVGVuc29yKHNlZ21lbnRJZHMsICdzZWdtZW50SWRzJywgJ3Vuc29ydGVkU2VnbWVudFN1bScsICdpbnQzMicpO1xuICAgIGFzc2VydChpc0ludChudW1TZWdtZW50cyksICgpID0+ICdudW1TZWdtZW50cyBtdXN0IGJlIG9mIGR0eXBlIGludCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHgsIHNlZ21lbnRJZHM6ICRzZWdtZW50SWRzIH07XG4gICAgY29uc3QgYXR0cnMgPSB7IG51bVNlZ21lbnRzIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoVW5zb3J0ZWRTZWdtZW50U3VtLCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCB1bnNvcnRlZFNlZ21lbnRTdW0gPSBvcCh7IHVuc29ydGVkU2VnbWVudFN1bV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD11bnNvcnRlZF9zZWdtZW50X3N1bS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgVW5wYWNrIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIFVuc3RhY2tzIGEgYHRmLlRlbnNvcmAgb2YgcmFuay1gUmAgaW50byBhIGxpc3Qgb2YgcmFuay1gKFItMSlgIGB0Zi5UZW5zb3Jgcy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjJkKFsxLCAyLCAzLCA0XSwgWzIsIDJdKTtcbiAqXG4gKiB0Zi51bnN0YWNrKGEpLmZvckVhY2godGVuc29yID0+IHRlbnNvci5wcmludCgpKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IEEgdGVuc29yIG9iamVjdC5cbiAqIEBwYXJhbSBheGlzIFRoZSBheGlzIHRvIHVuc3RhY2sgYWxvbmcuIERlZmF1bHRzIHRvIDAgKHRoZSBmaXJzdCBkaW0pLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1NsaWNpbmcgYW5kIEpvaW5pbmcnfVxuICovXG5mdW5jdGlvbiB1bnN0YWNrXyh4LCBheGlzID0gMCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3Vuc3RhY2snLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgICB1dGlsLmFzc2VydChheGlzID49IC0keC5zaGFwZS5sZW5ndGggJiYgYXhpcyA8ICR4LnNoYXBlLmxlbmd0aCwgKCkgPT4gYEF4aXMgPSAke2F4aXN9IGlzIG5vdCBpbiBbLSR7JHguc2hhcGUubGVuZ3RofSwgJHskeC5zaGFwZS5sZW5ndGh9KWApO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgdmFsdWU6ICR4IH07XG4gICAgY29uc3QgYXR0cnMgPSB7IGF4aXMgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChVbnBhY2ssIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IHVuc3RhY2sgPSBvcCh7IHVuc3RhY2tfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dW5zdGFjay5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHZhcmlhYmxlIHdpdGggdGhlIHByb3ZpZGVkIGluaXRpYWwgdmFsdWUuXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnZhcmlhYmxlKHRmLnRlbnNvcihbMSwgMiwgM10pKTtcbiAqIHguYXNzaWduKHRmLnRlbnNvcihbNCwgNSwgNl0pKTtcbiAqXG4gKiB4LnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gaW5pdGlhbFZhbHVlIEluaXRpYWwgdmFsdWUgZm9yIHRoZSB0ZW5zb3IuXG4gKiBAcGFyYW0gdHJhaW5hYmxlIElmIHRydWUsIG9wdGltaXplcnMgYXJlIGFsbG93ZWQgdG8gdXBkYXRlIGl0LlxuICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdmFyaWFibGUuIERlZmF1bHRzIHRvIGEgdW5pcXVlIGlkLlxuICogQHBhcmFtIGR0eXBlIElmIHNldCwgaW5pdGlhbFZhbHVlIHdpbGwgYmUgY29udmVydGVkIHRvIHRoZSBnaXZlbiB0eXBlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhcmlhYmxlKGluaXRpYWxWYWx1ZSwgdHJhaW5hYmxlID0gdHJ1ZSwgbmFtZSwgZHR5cGUpIHtcbiAgICByZXR1cm4gRU5HSU5FLm1ha2VWYXJpYWJsZShpbml0aWFsVmFsdWUsIHRyYWluYWJsZSwgbmFtZSwgZHR5cGUpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dmFyaWFibGUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFNlbGVjdCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYnJvYWRjYXN0VG8gfSBmcm9tICcuL2Jyb2FkY2FzdF90byc7XG5pbXBvcnQgeyBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSB9IGZyb20gJy4vYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIFJldHVybnMgdGhlIGVsZW1lbnRzLCBlaXRoZXIgYGFgIG9yIGBiYCBkZXBlbmRpbmcgb24gdGhlIGBjb25kaXRpb25gLlxuICpcbiAqIElmIHRoZSBjb25kaXRpb24gaXMgdHJ1ZSwgc2VsZWN0IGZyb20gYGFgLCBvdGhlcndpc2Ugc2VsZWN0IGZyb20gYGJgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBjb25kID0gdGYudGVuc29yMWQoW2ZhbHNlLCBmYWxzZSwgdHJ1ZV0sICdib29sJyk7XG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEgLCAyLCAzXSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWy0xLCAtMiwgLTNdKTtcbiAqXG4gKiBhLndoZXJlKGNvbmQsIGIpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gY29uZGl0aW9uIFRoZSBpbnB1dCBjb25kaXRpb24uIE11c3QgYmUgb2YgZHR5cGUgYm9vbC5cbiAqIEBwYXJhbSBhIElmIGBjb25kaXRpb25gIGlzIHJhbmsgMSwgYGFgIG1heSBoYXZlIGEgaGlnaGVyIHJhbmsgYnV0XG4gKiAgICAgaXRzIGZpcnN0IGRpbWVuc2lvbiBtdXN0IG1hdGNoIHRoZSBzaXplIG9mIGBjb25kaXRpb25gLlxuICogQHBhcmFtIGIgQSB0ZW5zb3Igd2l0aCB0aGUgc2FtZSBkdHlwZSBhcyBgYWAgYW5kIHdpdGggc2hhcGUgdGhhdCBpc1xuICogICAgIGNvbXBhdGlibGUgd2l0aCBgYWAuXG4gKiBAcmV0dXJuIEEgdGVuc29yIHdpdGggc2FtZSBkdHlwZSBhcyBgYWAgYW5kIGBiYCwgYW5kIHNoYXBlIHRoYXQgaXNcbiAqICAgICBicm9hZGNhc3RhYmxlIGZyb20gYGFgIGFuZCBgYmAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTG9naWNhbCd9XG4gKi9cbmZ1bmN0aW9uIHdoZXJlXyhjb25kaXRpb24sIGEsIGIpIHtcbiAgICBjb25zdCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICd3aGVyZScpO1xuICAgIGNvbnN0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ3doZXJlJyk7XG4gICAgY29uc3QgJGNvbmRpdGlvbiA9IGNvbnZlcnRUb1RlbnNvcihjb25kaXRpb24sICdjb25kaXRpb24nLCAnd2hlcmUnLCAnYm9vbCcpO1xuICAgIC8vIFRPRE86IG1vdmUgdGhpcyBsb2dpYyB0byBmb3J3YXJkIGZ1bmN0aW9uIHdoZW4gdGhlIGJyb2FkY2FzdFRvIG9wIGlzXG4gICAgLy8gaW1wbGVtZW50ZWQgaW4gV0FTTS5cbiAgICAvLyBGaW5kIHRoZSBicm9hZGNhc3RhYmxlIHNoYXBlIGZvciAkY29uZGl0aW9uLCAkYSwgYW5kICRiLlxuICAgIGNvbnN0IGJyb2FkY2FzdFNoYXBlID0gYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoJGNvbmRpdGlvbi5zaGFwZSwgJGEuc2hhcGUpLCAkYi5zaGFwZSk7XG4gICAgY29uc3QgJGJyb2FkY2FzdGVkQ29uZGl0aW9uID0gYnJvYWRjYXN0VG8oJGNvbmRpdGlvbiwgYnJvYWRjYXN0U2hhcGUpO1xuICAgIGNvbnN0ICRicm9hZGNhc3RlZEEgPSBicm9hZGNhc3RUbygkYSwgYnJvYWRjYXN0U2hhcGUpO1xuICAgIGNvbnN0ICRicm9hZGNhc3RlZEIgPSBicm9hZGNhc3RUbygkYiwgYnJvYWRjYXN0U2hhcGUpO1xuICAgIGNvbnN0IGlucHV0cyA9IHtcbiAgICAgICAgY29uZGl0aW9uOiAkYnJvYWRjYXN0ZWRDb25kaXRpb24sXG4gICAgICAgIHQ6ICRicm9hZGNhc3RlZEEsXG4gICAgICAgIGU6ICRicm9hZGNhc3RlZEJcbiAgICB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFNlbGVjdCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCB3aGVyZSA9IG9wKHsgd2hlcmVfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d2hlcmUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgd2hlcmVJbXBsIH0gZnJvbSAnLi4vYmFja2VuZHMvd2hlcmVfaW1wbCc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBjb29yZGluYXRlcyBvZiB0cnVlIGVsZW1lbnRzIG9mIGNvbmRpdGlvbi5cbiAqXG4gKiBUaGUgY29vcmRpbmF0ZXMgYXJlIHJldHVybmVkIGluIGEgMi1EIHRlbnNvciB3aGVyZSB0aGUgZmlyc3QgZGltZW5zaW9uIChyb3dzKVxuICogcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIHRydWUgZWxlbWVudHMsIGFuZCB0aGUgc2Vjb25kIGRpbWVuc2lvbiAoY29sdW1ucylcbiAqIHJlcHJlc2VudHMgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSB0cnVlIGVsZW1lbnRzLiBLZWVwIGluIG1pbmQsIHRoZSBzaGFwZSBvZlxuICogdGhlIG91dHB1dCB0ZW5zb3IgY2FuIHZhcnkgZGVwZW5kaW5nIG9uIGhvdyBtYW55IHRydWUgdmFsdWVzIHRoZXJlIGFyZSBpblxuICogaW5wdXQuIEluZGljZXMgYXJlIG91dHB1dCBpbiByb3ctbWFqb3Igb3JkZXIuIFRoZSByZXN1bHRpbmcgdGVuc29yIGhhcyB0aGVcbiAqIHNoYXBlIGBbbnVtVHJ1ZUVsZW1zLCBjb25kaXRpb24ucmFua11gLlxuICpcbiAqIFRoaXMgaXMgYW5hbG9nb3VzIHRvIGNhbGxpbmcgdGhlIHB5dGhvbiBgdGYud2hlcmUoY29uZClgIHdpdGhvdXQgYW4geCBvciB5LlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBjb25kID0gdGYudGVuc29yMWQoW2ZhbHNlLCBmYWxzZSwgdHJ1ZV0sICdib29sJyk7XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCB0Zi53aGVyZUFzeW5jKGNvbmQpO1xuICogcmVzdWx0LnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdMb2dpY2FsJ31cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd2hlcmVBc3luY18oY29uZGl0aW9uKSB7XG4gICAgY29uc3QgJGNvbmRpdGlvbiA9IGNvbnZlcnRUb1RlbnNvcihjb25kaXRpb24sICdjb25kaXRpb24nLCAnd2hlcmVBc3luYycsICdib29sJyk7XG4gICAgY29uc3QgdmFscyA9IGF3YWl0ICRjb25kaXRpb24uZGF0YSgpO1xuICAgIGNvbnN0IHJlcyA9IHdoZXJlSW1wbCgkY29uZGl0aW9uLnNoYXBlLCB2YWxzKTtcbiAgICBpZiAoY29uZGl0aW9uICE9PSAkY29uZGl0aW9uKSB7XG4gICAgICAgICRjb25kaXRpb24uZGlzcG9zZSgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IHdoZXJlQXN5bmMgPSB3aGVyZUFzeW5jXztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXdoZXJlX2FzeW5jLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBtYWtlWmVyb3NUeXBlZEFycmF5LCBzaXplRnJvbVNoYXBlIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBjb21wbGV4IH0gZnJvbSAnLi9jb21wbGV4Jztcbi8qKlxuICogQ3JlYXRlcyBhIGB0Zi5UZW5zb3JgIHdpdGggYWxsIGVsZW1lbnRzIHNldCB0byAwLlxuICpcbiAqIGBgYGpzXG4gKiB0Zi56ZXJvcyhbMiwgMl0pLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gc2hhcGUgQW4gYXJyYXkgb2YgaW50ZWdlcnMgZGVmaW5pbmcgdGhlIG91dHB1dCB0ZW5zb3Igc2hhcGUuXG4gKiBAcGFyYW0gZHR5cGUgVGhlIHR5cGUgb2YgYW4gZWxlbWVudCBpbiB0aGUgcmVzdWx0aW5nIHRlbnNvci4gQ2FuXG4gKiAgICAgYmUgJ2Zsb2F0MzInLCAnaW50MzInIG9yICdib29sJy4gRGVmYXVsdHMgdG8gJ2Zsb2F0Jy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB6ZXJvcyhzaGFwZSwgZHR5cGUgPSAnZmxvYXQzMicpIHtcbiAgICBpZiAoZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICAgIGNvbnN0IHJlYWwgPSB6ZXJvcyhzaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICAgICAgY29uc3QgaW1hZyA9IHplcm9zKHNoYXBlLCAnZmxvYXQzMicpO1xuICAgICAgICByZXR1cm4gY29tcGxleChyZWFsLCBpbWFnKTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWVzID0gbWFrZVplcm9zVHlwZWRBcnJheShzaXplRnJvbVNoYXBlKHNoYXBlKSwgZHR5cGUpO1xuICAgIHJldHVybiBFTkdJTkUubWFrZVRlbnNvcih2YWx1ZXMsIHNoYXBlLCBkdHlwZSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD16ZXJvcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgWmVyb3NMaWtlIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ3JlYXRlcyBhIGB0Zi5UZW5zb3JgIHdpdGggYWxsIGVsZW1lbnRzIHNldCB0byAwIHdpdGggdGhlIHNhbWUgc2hhcGUgYXMgdGhlXG4gKiBnaXZlbiB0ZW5zb3IuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IoWzEsIDJdKTtcbiAqIHRmLnplcm9zTGlrZSh4KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIHRlbnNvciBvZiByZXF1aXJlZCBzaGFwZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmZ1bmN0aW9uIHplcm9zTGlrZV8oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3plcm9zTGlrZScpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChaZXJvc0xpa2UsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgemVyb3NMaWtlID0gb3AoeyB6ZXJvc0xpa2VfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9emVyb3NfbGlrZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgZGlzcG9zZSwgdGlkeSB9IGZyb20gJy4uL2dsb2JhbHMnO1xuaW1wb3J0IHsgYWRkIH0gZnJvbSAnLi4vb3BzL2FkZCc7XG5pbXBvcnQgeyBkaXYgfSBmcm9tICcuLi9vcHMvZGl2JztcbmltcG9ydCB7IG11bCB9IGZyb20gJy4uL29wcy9tdWwnO1xuaW1wb3J0IHsgc3FydCB9IGZyb20gJy4uL29wcy9vcHMnO1xuaW1wb3J0IHsgc3F1YXJlIH0gZnJvbSAnLi4vb3BzL3NxdWFyZSc7XG5pbXBvcnQgeyB6ZXJvc0xpa2UgfSBmcm9tICcuLi9vcHMvemVyb3NfbGlrZSc7XG5pbXBvcnQgeyByZWdpc3RlckNsYXNzIH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbic7XG5pbXBvcnQgeyBPcHRpbWl6ZXIgfSBmcm9tICcuL29wdGltaXplcic7XG4vKiogQGRvY2xpbmsgT3B0aW1pemVyICovXG5leHBvcnQgY2xhc3MgQWRhZGVsdGFPcHRpbWl6ZXIgZXh0ZW5kcyBPcHRpbWl6ZXIge1xuICAgIGNvbnN0cnVjdG9yKGxlYXJuaW5nUmF0ZSwgcmhvLCBlcHNpbG9uID0gbnVsbCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmxlYXJuaW5nUmF0ZSA9IGxlYXJuaW5nUmF0ZTtcbiAgICAgICAgdGhpcy5yaG8gPSByaG87XG4gICAgICAgIHRoaXMuZXBzaWxvbiA9IGVwc2lsb247XG4gICAgICAgIHRoaXMuYWNjdW11bGF0ZWRHcmFkcyA9IFtdO1xuICAgICAgICB0aGlzLmFjY3VtdWxhdGVkVXBkYXRlcyA9IFtdO1xuICAgICAgICBpZiAoZXBzaWxvbiA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmVwc2lsb24gPSBFTkdJTkUuYmFja2VuZC5lcHNpbG9uKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXBwbHlHcmFkaWVudHModmFyaWFibGVHcmFkaWVudHMpIHtcbiAgICAgICAgY29uc3QgdmFyaWFibGVOYW1lcyA9IEFycmF5LmlzQXJyYXkodmFyaWFibGVHcmFkaWVudHMpID9cbiAgICAgICAgICAgIHZhcmlhYmxlR3JhZGllbnRzLm1hcChpdGVtID0+IGl0ZW0ubmFtZSkgOlxuICAgICAgICAgICAgT2JqZWN0LmtleXModmFyaWFibGVHcmFkaWVudHMpO1xuICAgICAgICB2YXJpYWJsZU5hbWVzLmZvckVhY2goKG5hbWUsIGkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gRU5HSU5FLnJlZ2lzdGVyZWRWYXJpYWJsZXNbbmFtZV07XG4gICAgICAgICAgICBjb25zdCB0cmFpbmFibGUgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkR3JhZHNbaV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWNjdW11bGF0ZWRHcmFkc1tpXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lOiBgJHtuYW1lfS9hY2N1bV9ncmFkYCxcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGU6IHRpZHkoKCkgPT4gemVyb3NMaWtlKHZhbHVlKS52YXJpYWJsZSh0cmFpbmFibGUpKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5hY2N1bXVsYXRlZFVwZGF0ZXNbaV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWNjdW11bGF0ZWRVcGRhdGVzW2ldID0ge1xuICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbE5hbWU6IGAke25hbWV9L2FjY3VtX3ZhcmAsXG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlOiB0aWR5KCgpID0+IHplcm9zTGlrZSh2YWx1ZSkudmFyaWFibGUodHJhaW5hYmxlKSlcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZ3JhZGllbnQgPSBBcnJheS5pc0FycmF5KHZhcmlhYmxlR3JhZGllbnRzKSA/XG4gICAgICAgICAgICAgICAgdmFyaWFibGVHcmFkaWVudHNbaV0udGVuc29yIDpcbiAgICAgICAgICAgICAgICB2YXJpYWJsZUdyYWRpZW50c1tuYW1lXTtcbiAgICAgICAgICAgIGlmIChncmFkaWVudCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYWNjdW11bGF0ZWRHcmFkID0gdGhpcy5hY2N1bXVsYXRlZEdyYWRzW2ldLnZhcmlhYmxlO1xuICAgICAgICAgICAgY29uc3QgYWNjdW11bGF0ZWRVcGRhdGUgPSB0aGlzLmFjY3VtdWxhdGVkVXBkYXRlc1tpXS52YXJpYWJsZTtcbiAgICAgICAgICAgIHRpZHkoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0FjY3VtdWxhdGVkR3JhZCA9IGFkZChtdWwoYWNjdW11bGF0ZWRHcmFkLCB0aGlzLnJobyksIG11bChzcXVhcmUoZ3JhZGllbnQpLCAxIC0gdGhpcy5yaG8pKTtcbiAgICAgICAgICAgICAgICBjb25zdCB1cGRhdGVzID0gbXVsKGRpdihzcXJ0KGFkZChhY2N1bXVsYXRlZFVwZGF0ZSwgdGhpcy5lcHNpbG9uKSksIHNxcnQoYWRkKGFjY3VtdWxhdGVkR3JhZCwgdGhpcy5lcHNpbG9uKSkpLCBncmFkaWVudCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3QWNjdW11bGF0ZWRVcGRhdGUgPSBhZGQobXVsKGFjY3VtdWxhdGVkVXBkYXRlLCB0aGlzLnJobyksIG11bChzcXVhcmUodXBkYXRlcyksIDEgLSB0aGlzLnJobykpO1xuICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkR3JhZC5hc3NpZ24obmV3QWNjdW11bGF0ZWRHcmFkKTtcbiAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZFVwZGF0ZS5hc3NpZ24obmV3QWNjdW11bGF0ZWRVcGRhdGUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gYWRkKG11bCh1cGRhdGVzLCAtdGhpcy5sZWFybmluZ1JhdGUpLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgdmFsdWUuYXNzaWduKG5ld1ZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5pbmNyZW1lbnRJdGVyYXRpb25zKCk7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkVXBkYXRlcyAhPSBudWxsKSB7XG4gICAgICAgICAgICBkaXNwb3NlKHRoaXMuYWNjdW11bGF0ZWRHcmFkcy5tYXAodiA9PiB2LnZhcmlhYmxlKSk7XG4gICAgICAgICAgICBkaXNwb3NlKHRoaXMuYWNjdW11bGF0ZWRVcGRhdGVzLm1hcCh2ID0+IHYudmFyaWFibGUpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBnZXRXZWlnaHRzKCkge1xuICAgICAgICAvLyBPcmRlciBtYXR0ZXJzIGZvciBQeXRob24gY29tcGF0aWJpbGl0eS5cbiAgICAgICAgY29uc3QgdmFyaWFibGVzID0gWy4uLnRoaXMuYWNjdW11bGF0ZWRHcmFkcywgLi4udGhpcy5hY2N1bXVsYXRlZFVwZGF0ZXNdO1xuICAgICAgICByZXR1cm4gW2F3YWl0IHRoaXMuc2F2ZUl0ZXJhdGlvbnMoKV0uY29uY2F0KHZhcmlhYmxlcy5tYXAodiA9PiAoeyBuYW1lOiB2Lm9yaWdpbmFsTmFtZSwgdGVuc29yOiB2LnZhcmlhYmxlIH0pKSk7XG4gICAgfVxuICAgIGFzeW5jIHNldFdlaWdodHMod2VpZ2h0VmFsdWVzKSB7XG4gICAgICAgIHdlaWdodFZhbHVlcyA9IGF3YWl0IHRoaXMuZXh0cmFjdEl0ZXJhdGlvbnMod2VpZ2h0VmFsdWVzKTtcbiAgICAgICAgY29uc3QgdmFyaWFibGVDb3VudCA9IHdlaWdodFZhbHVlcy5sZW5ndGggLyAyO1xuICAgICAgICBjb25zdCB0cmFpbmFibGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hY2N1bXVsYXRlZEdyYWRzID1cbiAgICAgICAgICAgIHdlaWdodFZhbHVlcy5zbGljZSgwLCB2YXJpYWJsZUNvdW50KS5tYXAodiA9PiAoe1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogdi5uYW1lLFxuICAgICAgICAgICAgICAgIHZhcmlhYmxlOiB2LnRlbnNvci52YXJpYWJsZSh0cmFpbmFibGUpXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIHRoaXMuYWNjdW11bGF0ZWRVcGRhdGVzID1cbiAgICAgICAgICAgIHdlaWdodFZhbHVlcy5zbGljZSh2YXJpYWJsZUNvdW50LCB2YXJpYWJsZUNvdW50ICogMilcbiAgICAgICAgICAgICAgICAubWFwKHYgPT4gKHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbE5hbWU6IHYubmFtZSxcbiAgICAgICAgICAgICAgICB2YXJpYWJsZTogdi50ZW5zb3IudmFyaWFibGUodHJhaW5hYmxlKVxuICAgICAgICAgICAgfSkpO1xuICAgIH1cbiAgICBnZXRDb25maWcoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnbGVhcm5pbmdSYXRlJzogdGhpcy5sZWFybmluZ1JhdGUsXG4gICAgICAgICAgICAncmhvJzogdGhpcy5yaG8sXG4gICAgICAgICAgICAnZXBzaWxvbic6IHRoaXMuZXBzaWxvblxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBzdGF0aWMgZnJvbUNvbmZpZyhjbHMsIGNvbmZpZykge1xuICAgICAgICByZXR1cm4gbmV3IGNscyhjb25maWdbJ2xlYXJuaW5nUmF0ZSddLCBjb25maWdbJ3JobyddLCBjb25maWdbJ2Vwc2lsb24nXSk7XG4gICAgfVxufVxuLyoqIEBub2NvbGxhcHNlICovXG5BZGFkZWx0YU9wdGltaXplci5jbGFzc05hbWUgPSAnQWRhZGVsdGEnOyAvLyBOYW1lIG1hdHRlcnMgZm9yIFB5dGhvbiBjb21wYXRpYmlsaXR5LlxucmVnaXN0ZXJDbGFzcyhBZGFkZWx0YU9wdGltaXplcik7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hZGFkZWx0YV9vcHRpbWl6ZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IGRpc3Bvc2UsIHRpZHkgfSBmcm9tICcuLi9nbG9iYWxzJztcbmltcG9ydCB7IGFkZCB9IGZyb20gJy4uL29wcy9hZGQnO1xuaW1wb3J0IHsgZGl2IH0gZnJvbSAnLi4vb3BzL2Rpdic7XG5pbXBvcnQgeyBmaWxsIH0gZnJvbSAnLi4vb3BzL2ZpbGwnO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQgeyBzcXJ0IH0gZnJvbSAnLi4vb3BzL3NxcnQnO1xuaW1wb3J0IHsgc3F1YXJlIH0gZnJvbSAnLi4vb3BzL3NxdWFyZSc7XG5pbXBvcnQgeyByZWdpc3RlckNsYXNzIH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbic7XG5pbXBvcnQgeyBPcHRpbWl6ZXIgfSBmcm9tICcuL29wdGltaXplcic7XG4vKiogQGRvY2xpbmsgT3B0aW1pemVyICovXG5leHBvcnQgY2xhc3MgQWRhZ3JhZE9wdGltaXplciBleHRlbmRzIE9wdGltaXplciB7XG4gICAgY29uc3RydWN0b3IobGVhcm5pbmdSYXRlLCBpbml0aWFsQWNjdW11bGF0b3JWYWx1ZSA9IDAuMSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmxlYXJuaW5nUmF0ZSA9IGxlYXJuaW5nUmF0ZTtcbiAgICAgICAgdGhpcy5pbml0aWFsQWNjdW11bGF0b3JWYWx1ZSA9IGluaXRpYWxBY2N1bXVsYXRvclZhbHVlO1xuICAgICAgICB0aGlzLmFjY3VtdWxhdGVkR3JhZHMgPSBbXTtcbiAgICB9XG4gICAgYXBwbHlHcmFkaWVudHModmFyaWFibGVHcmFkaWVudHMpIHtcbiAgICAgICAgY29uc3QgdmFyaWFibGVOYW1lcyA9IEFycmF5LmlzQXJyYXkodmFyaWFibGVHcmFkaWVudHMpID9cbiAgICAgICAgICAgIHZhcmlhYmxlR3JhZGllbnRzLm1hcChpdGVtID0+IGl0ZW0ubmFtZSkgOlxuICAgICAgICAgICAgT2JqZWN0LmtleXModmFyaWFibGVHcmFkaWVudHMpO1xuICAgICAgICB2YXJpYWJsZU5hbWVzLmZvckVhY2goKG5hbWUsIGkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gRU5HSU5FLnJlZ2lzdGVyZWRWYXJpYWJsZXNbbmFtZV07XG4gICAgICAgICAgICBpZiAodGhpcy5hY2N1bXVsYXRlZEdyYWRzW2ldID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0cmFpbmFibGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmFjY3VtdWxhdGVkR3JhZHNbaV0gPSB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogYCR7bmFtZX0vYWNjdW11bGF0b3JgLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogdGlkeSgoKSA9PiBmaWxsKHZhbHVlLnNoYXBlLCB0aGlzLmluaXRpYWxBY2N1bXVsYXRvclZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnZhcmlhYmxlKHRyYWluYWJsZSkpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGdyYWRpZW50ID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JhZGllbnRzW2ldLnRlbnNvciA6XG4gICAgICAgICAgICAgICAgdmFyaWFibGVHcmFkaWVudHNbbmFtZV07XG4gICAgICAgICAgICBpZiAoZ3JhZGllbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFjY3VtdWxhdGVkR3JhZCA9IHRoaXMuYWNjdW11bGF0ZWRHcmFkc1tpXS52YXJpYWJsZTtcbiAgICAgICAgICAgIHRpZHkoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0FjY3VtdWxhdGVkR3JhZCA9IGFkZChhY2N1bXVsYXRlZEdyYWQsIHNxdWFyZShncmFkaWVudCkpO1xuICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkR3JhZC5hc3NpZ24obmV3QWNjdW11bGF0ZWRHcmFkKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IGFkZChtdWwoZGl2KGdyYWRpZW50LCBzcXJ0KGFkZChuZXdBY2N1bXVsYXRlZEdyYWQsIEVOR0lORS5iYWNrZW5kLmVwc2lsb24oKSkpKSwgLXRoaXMubGVhcm5pbmdSYXRlKSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIHZhbHVlLmFzc2lnbihuZXdWYWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaW5jcmVtZW50SXRlcmF0aW9ucygpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICBpZiAodGhpcy5hY2N1bXVsYXRlZEdyYWRzICE9IG51bGwpIHtcbiAgICAgICAgICAgIGRpc3Bvc2UodGhpcy5hY2N1bXVsYXRlZEdyYWRzLm1hcCh2ID0+IHYudmFyaWFibGUpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBnZXRXZWlnaHRzKCkge1xuICAgICAgICAvLyBPcmRlciBtYXR0ZXJzIGZvciBQeXRob24gY29tcGF0aWJpbGl0eS5cbiAgICAgICAgcmV0dXJuIFthd2FpdCB0aGlzLnNhdmVJdGVyYXRpb25zKCldLmNvbmNhdCh0aGlzLmFjY3VtdWxhdGVkR3JhZHMubWFwKHYgPT4gKHsgbmFtZTogdi5vcmlnaW5hbE5hbWUsIHRlbnNvcjogdi52YXJpYWJsZSB9KSkpO1xuICAgIH1cbiAgICBhc3luYyBzZXRXZWlnaHRzKHdlaWdodFZhbHVlcykge1xuICAgICAgICB3ZWlnaHRWYWx1ZXMgPSBhd2FpdCB0aGlzLmV4dHJhY3RJdGVyYXRpb25zKHdlaWdodFZhbHVlcyk7XG4gICAgICAgIGNvbnN0IHRyYWluYWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFjY3VtdWxhdGVkR3JhZHMgPSB3ZWlnaHRWYWx1ZXMubWFwKHYgPT4gKHsgb3JpZ2luYWxOYW1lOiB2Lm5hbWUsIHZhcmlhYmxlOiB2LnRlbnNvci52YXJpYWJsZSh0cmFpbmFibGUpIH0pKTtcbiAgICB9XG4gICAgZ2V0Q29uZmlnKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ2xlYXJuaW5nUmF0ZSc6IHRoaXMubGVhcm5pbmdSYXRlLFxuICAgICAgICAgICAgJ2luaXRpYWxBY2N1bXVsYXRvclZhbHVlJzogdGhpcy5pbml0aWFsQWNjdW11bGF0b3JWYWx1ZSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgc3RhdGljIGZyb21Db25maWcoY2xzLCBjb25maWcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBjbHMoY29uZmlnWydsZWFybmluZ1JhdGUnXSwgY29uZmlnWydpbml0aWFsQWNjdW11bGF0b3JWYWx1ZSddKTtcbiAgICB9XG59XG4vKiogQG5vY29sbGFwc2UgKi9cbkFkYWdyYWRPcHRpbWl6ZXIuY2xhc3NOYW1lID0gJ0FkYWdyYWQnOyAvLyBOb3RlOiBOYW1lIG1hdHRlcnMgZm9yIFB5dGhvbiBjb21wYXRpYmlsaXR5LlxucmVnaXN0ZXJDbGFzcyhBZGFncmFkT3B0aW1pemVyKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFkYWdyYWRfb3B0aW1pemVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBkaXNwb3NlLCB0aWR5IH0gZnJvbSAnLi4vZ2xvYmFscyc7XG5pbXBvcnQgeyBhZGQgfSBmcm9tICcuLi9vcHMvYWRkJztcbmltcG9ydCB7IGRpdiB9IGZyb20gJy4uL29wcy9kaXYnO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQgeyBwb3cgfSBmcm9tICcuLi9vcHMvcG93JztcbmltcG9ydCB7IHNjYWxhciB9IGZyb20gJy4uL29wcy9zY2FsYXInO1xuaW1wb3J0IHsgc3FydCB9IGZyb20gJy4uL29wcy9zcXJ0JztcbmltcG9ydCB7IHNxdWFyZSB9IGZyb20gJy4uL29wcy9zcXVhcmUnO1xuaW1wb3J0IHsgc3ViIH0gZnJvbSAnLi4vb3BzL3N1Yic7XG5pbXBvcnQgeyB6ZXJvc0xpa2UgfSBmcm9tICcuLi9vcHMvemVyb3NfbGlrZSc7XG5pbXBvcnQgeyByZWdpc3RlckNsYXNzIH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbic7XG5pbXBvcnQgeyBPcHRpbWl6ZXIgfSBmcm9tICcuL29wdGltaXplcic7XG5leHBvcnQgY2xhc3MgQWRhbU9wdGltaXplciBleHRlbmRzIE9wdGltaXplciB7XG4gICAgY29uc3RydWN0b3IobGVhcm5pbmdSYXRlLCBiZXRhMSwgYmV0YTIsIGVwc2lsb24gPSBudWxsKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMubGVhcm5pbmdSYXRlID0gbGVhcm5pbmdSYXRlO1xuICAgICAgICB0aGlzLmJldGExID0gYmV0YTE7XG4gICAgICAgIHRoaXMuYmV0YTIgPSBiZXRhMjtcbiAgICAgICAgdGhpcy5lcHNpbG9uID0gZXBzaWxvbjtcbiAgICAgICAgdGhpcy5hY2N1bXVsYXRlZEZpcnN0TW9tZW50ID0gW107XG4gICAgICAgIHRoaXMuYWNjdW11bGF0ZWRTZWNvbmRNb21lbnQgPSBbXTtcbiAgICAgICAgdGlkeSgoKSA9PiB7XG4gICAgICAgICAgICAvLyBhY2NCKiB3aWxsIGJlIHVwZGF0ZWQgYnkgYmF0Y2guXG4gICAgICAgICAgICB0aGlzLmFjY0JldGExID0gc2NhbGFyKGJldGExKS52YXJpYWJsZSgpO1xuICAgICAgICAgICAgdGhpcy5hY2NCZXRhMiA9IHNjYWxhcihiZXRhMikudmFyaWFibGUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChlcHNpbG9uID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZXBzaWxvbiA9IEVOR0lORS5iYWNrZW5kLmVwc2lsb24oKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhcHBseUdyYWRpZW50cyh2YXJpYWJsZUdyYWRpZW50cykge1xuICAgICAgICBjb25zdCB2YXJOYW1lcyA9IEFycmF5LmlzQXJyYXkodmFyaWFibGVHcmFkaWVudHMpID9cbiAgICAgICAgICAgIHZhcmlhYmxlR3JhZGllbnRzLm1hcCh2ID0+IHYubmFtZSkgOlxuICAgICAgICAgICAgT2JqZWN0LmtleXModmFyaWFibGVHcmFkaWVudHMpO1xuICAgICAgICB0aWR5KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9uZU1pbnVzQWNjQmV0YTEgPSBzdWIoMSwgdGhpcy5hY2NCZXRhMSk7XG4gICAgICAgICAgICBjb25zdCBvbmVNaW51c0FjY0JldGEyID0gc3ViKDEsIHRoaXMuYWNjQmV0YTIpO1xuICAgICAgICAgICAgdmFyTmFtZXMuZm9yRWFjaCgobmFtZSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gRU5HSU5FLnJlZ2lzdGVyZWRWYXJpYWJsZXNbbmFtZV07XG4gICAgICAgICAgICAgICAgY29uc3QgdHJhaW5hYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWNjdW11bGF0ZWRGaXJzdE1vbWVudFtpXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWNjdW11bGF0ZWRGaXJzdE1vbWVudFtpXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogYCR7bmFtZX0vbWAsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogdGlkeSgoKSA9PiB6ZXJvc0xpa2UodmFsdWUpLnZhcmlhYmxlKHRyYWluYWJsZSkpXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkU2Vjb25kTW9tZW50W2ldID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY2N1bXVsYXRlZFNlY29uZE1vbWVudFtpXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogYCR7bmFtZX0vdmAsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogdGlkeSgoKSA9PiB6ZXJvc0xpa2UodmFsdWUpLnZhcmlhYmxlKHRyYWluYWJsZSkpXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGdyYWRpZW50ID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyYWRpZW50c1tpXS50ZW5zb3IgOlxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyYWRpZW50c1tuYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAoZ3JhZGllbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0TW9tZW50ID0gdGhpcy5hY2N1bXVsYXRlZEZpcnN0TW9tZW50W2ldLnZhcmlhYmxlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlY29uZE1vbWVudCA9IHRoaXMuYWNjdW11bGF0ZWRTZWNvbmRNb21lbnRbaV0udmFyaWFibGU7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Rmlyc3RNb21lbnQgPSBhZGQobXVsKGZpcnN0TW9tZW50LCB0aGlzLmJldGExKSwgbXVsKGdyYWRpZW50LCAxIC0gdGhpcy5iZXRhMSkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1NlY29uZE1vbWVudCA9IGFkZChtdWwoc2Vjb25kTW9tZW50LCB0aGlzLmJldGEyKSwgbXVsKHNxdWFyZShncmFkaWVudCksIDEgLSB0aGlzLmJldGEyKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgYmlhc0NvcnJlY3RlZEZpcnN0TW9tZW50ID0gZGl2KG5ld0ZpcnN0TW9tZW50LCBvbmVNaW51c0FjY0JldGExKTtcbiAgICAgICAgICAgICAgICBjb25zdCBiaWFzQ29ycmVjdGVkU2Vjb25kTW9tZW50ID0gZGl2KG5ld1NlY29uZE1vbWVudCwgb25lTWludXNBY2NCZXRhMik7XG4gICAgICAgICAgICAgICAgZmlyc3RNb21lbnQuYXNzaWduKG5ld0ZpcnN0TW9tZW50KTtcbiAgICAgICAgICAgICAgICBzZWNvbmRNb21lbnQuYXNzaWduKG5ld1NlY29uZE1vbWVudCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBhZGQobXVsKGRpdihiaWFzQ29ycmVjdGVkRmlyc3RNb21lbnQsIGFkZChzcXJ0KGJpYXNDb3JyZWN0ZWRTZWNvbmRNb21lbnQpLCB0aGlzLmVwc2lsb24pKSwgLXRoaXMubGVhcm5pbmdSYXRlKSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIHZhbHVlLmFzc2lnbihuZXdWYWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuYWNjQmV0YTEuYXNzaWduKG11bCh0aGlzLmFjY0JldGExLCB0aGlzLmJldGExKSk7XG4gICAgICAgICAgICB0aGlzLmFjY0JldGEyLmFzc2lnbihtdWwodGhpcy5hY2NCZXRhMiwgdGhpcy5iZXRhMikpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5pbmNyZW1lbnRJdGVyYXRpb25zKCk7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIHRoaXMuYWNjQmV0YTEuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmFjY0JldGEyLmRpc3Bvc2UoKTtcbiAgICAgICAgaWYgKHRoaXMuYWNjdW11bGF0ZWRGaXJzdE1vbWVudCAhPSBudWxsKSB7XG4gICAgICAgICAgICBkaXNwb3NlKHRoaXMuYWNjdW11bGF0ZWRGaXJzdE1vbWVudC5tYXAodiA9PiB2LnZhcmlhYmxlKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYWNjdW11bGF0ZWRTZWNvbmRNb21lbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgZGlzcG9zZSh0aGlzLmFjY3VtdWxhdGVkU2Vjb25kTW9tZW50Lm1hcCh2ID0+IHYudmFyaWFibGUpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBnZXRXZWlnaHRzKCkge1xuICAgICAgICAvLyBPcmRlciBtYXR0ZXJzIGZvciBQeXRob24gY29tcGF0aWJpbGl0eS5cbiAgICAgICAgY29uc3QgdmFyaWFibGVzID0gWy4uLnRoaXMuYWNjdW11bGF0ZWRGaXJzdE1vbWVudCwgLi4udGhpcy5hY2N1bXVsYXRlZFNlY29uZE1vbWVudF07XG4gICAgICAgIHJldHVybiBbYXdhaXQgdGhpcy5zYXZlSXRlcmF0aW9ucygpXS5jb25jYXQodmFyaWFibGVzLm1hcCh2ID0+ICh7IG5hbWU6IHYub3JpZ2luYWxOYW1lLCB0ZW5zb3I6IHYudmFyaWFibGUgfSkpKTtcbiAgICB9XG4gICAgYXN5bmMgc2V0V2VpZ2h0cyh3ZWlnaHRWYWx1ZXMpIHtcbiAgICAgICAgd2VpZ2h0VmFsdWVzID0gYXdhaXQgdGhpcy5leHRyYWN0SXRlcmF0aW9ucyh3ZWlnaHRWYWx1ZXMpO1xuICAgICAgICB0aWR5KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWNjQmV0YTEuYXNzaWduKHBvdyh0aGlzLmJldGExLCB0aGlzLml0ZXJhdGlvbnNfICsgMSkpO1xuICAgICAgICAgICAgdGhpcy5hY2NCZXRhMi5hc3NpZ24ocG93KHRoaXMuYmV0YTIsIHRoaXMuaXRlcmF0aW9uc18gKyAxKSk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB2YXJpYWJsZUNvdW50ID0gd2VpZ2h0VmFsdWVzLmxlbmd0aCAvIDI7XG4gICAgICAgIGNvbnN0IHRyYWluYWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFjY3VtdWxhdGVkRmlyc3RNb21lbnQgPVxuICAgICAgICAgICAgd2VpZ2h0VmFsdWVzLnNsaWNlKDAsIHZhcmlhYmxlQ291bnQpLm1hcCh2ID0+ICh7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lOiB2Lm5hbWUsXG4gICAgICAgICAgICAgICAgdmFyaWFibGU6IHYudGVuc29yLnZhcmlhYmxlKHRyYWluYWJsZSlcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgdGhpcy5hY2N1bXVsYXRlZFNlY29uZE1vbWVudCA9XG4gICAgICAgICAgICB3ZWlnaHRWYWx1ZXMuc2xpY2UodmFyaWFibGVDb3VudCwgdmFyaWFibGVDb3VudCAqIDIpXG4gICAgICAgICAgICAgICAgLm1hcCh2ID0+ICh7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lOiB2Lm5hbWUsXG4gICAgICAgICAgICAgICAgdmFyaWFibGU6IHYudGVuc29yLnZhcmlhYmxlKHRyYWluYWJsZSlcbiAgICAgICAgICAgIH0pKTtcbiAgICB9XG4gICAgZ2V0Q29uZmlnKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ2xlYXJuaW5nUmF0ZSc6IHRoaXMubGVhcm5pbmdSYXRlLFxuICAgICAgICAgICAgJ2JldGExJzogdGhpcy5iZXRhMSxcbiAgICAgICAgICAgICdiZXRhMic6IHRoaXMuYmV0YTIsXG4gICAgICAgICAgICAnZXBzaWxvbic6IHRoaXMuZXBzaWxvbixcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgc3RhdGljIGZyb21Db25maWcoY2xzLCBjb25maWcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBjbHMoY29uZmlnWydsZWFybmluZ1JhdGUnXSwgY29uZmlnWydiZXRhMSddLCBjb25maWdbJ2JldGEyJ10sIGNvbmZpZ1snZXBzaWxvbiddKTtcbiAgICB9XG59XG4vKiogQG5vY29sbGFwc2UgKi9cbkFkYW1PcHRpbWl6ZXIuY2xhc3NOYW1lID0gJ0FkYW0nOyAvLyBOb3RlOiBOYW1lIG1hdHRlcnMgZm9yIFB5dGhvbiBjb21wYXRpYmlsaXR5LlxucmVnaXN0ZXJDbGFzcyhBZGFtT3B0aW1pemVyKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFkYW1fb3B0aW1pemVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBkaXNwb3NlLCB0aWR5IH0gZnJvbSAnLi4vZ2xvYmFscyc7XG5pbXBvcnQgeyBhYnMgfSBmcm9tICcuLi9vcHMvYWJzJztcbmltcG9ydCB7IGFkZCB9IGZyb20gJy4uL29wcy9hZGQnO1xuaW1wb3J0IHsgZGl2IH0gZnJvbSAnLi4vb3BzL2Rpdic7XG5pbXBvcnQgeyBtYXhpbXVtIH0gZnJvbSAnLi4vb3BzL21heGltdW0nO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQgeyBzY2FsYXIgfSBmcm9tICcuLi9vcHMvc2NhbGFyJztcbmltcG9ydCB7IHN1YiB9IGZyb20gJy4uL29wcy9zdWInO1xuaW1wb3J0IHsgemVyb3NMaWtlIH0gZnJvbSAnLi4vb3BzL3plcm9zX2xpa2UnO1xuaW1wb3J0IHsgcmVnaXN0ZXJDbGFzcyB9IGZyb20gJy4uL3NlcmlhbGl6YXRpb24nO1xuaW1wb3J0IHsgT3B0aW1pemVyIH0gZnJvbSAnLi9vcHRpbWl6ZXInO1xuZXhwb3J0IGNsYXNzIEFkYW1heE9wdGltaXplciBleHRlbmRzIE9wdGltaXplciB7XG4gICAgY29uc3RydWN0b3IobGVhcm5pbmdSYXRlLCBiZXRhMSwgYmV0YTIsIGVwc2lsb24gPSBudWxsLCBkZWNheSA9IDAuMCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmxlYXJuaW5nUmF0ZSA9IGxlYXJuaW5nUmF0ZTtcbiAgICAgICAgdGhpcy5iZXRhMSA9IGJldGExO1xuICAgICAgICB0aGlzLmJldGEyID0gYmV0YTI7XG4gICAgICAgIHRoaXMuZXBzaWxvbiA9IGVwc2lsb247XG4gICAgICAgIHRoaXMuZGVjYXkgPSBkZWNheTtcbiAgICAgICAgdGhpcy5hY2N1bXVsYXRlZEZpcnN0TW9tZW50ID0gW107XG4gICAgICAgIHRoaXMuYWNjdW11bGF0ZWRXZWlnaHRlZEluZk5vcm0gPSBbXTtcbiAgICAgICAgdGlkeSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLml0ZXJhdGlvbiA9IHNjYWxhcigwKS52YXJpYWJsZSgpO1xuICAgICAgICAgICAgdGhpcy5hY2NCZXRhMSA9IHNjYWxhcihiZXRhMSkudmFyaWFibGUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChlcHNpbG9uID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZXBzaWxvbiA9IEVOR0lORS5iYWNrZW5kLmVwc2lsb24oKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhcHBseUdyYWRpZW50cyh2YXJpYWJsZUdyYWRpZW50cykge1xuICAgICAgICBjb25zdCB2YXJpYWJsZU5hbWVzID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICAgICAgdmFyaWFibGVHcmFkaWVudHMubWFwKGl0ZW0gPT4gaXRlbS5uYW1lKSA6XG4gICAgICAgICAgICBPYmplY3Qua2V5cyh2YXJpYWJsZUdyYWRpZW50cyk7XG4gICAgICAgIHRpZHkoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb25lTWludXNBY2NCZXRhMSA9IHN1YigxLCB0aGlzLmFjY0JldGExKTtcbiAgICAgICAgICAgIGNvbnN0IGxyID0gZGl2KC10aGlzLmxlYXJuaW5nUmF0ZSwgYWRkKG11bCh0aGlzLml0ZXJhdGlvbiwgdGhpcy5kZWNheSksIDEpKTtcbiAgICAgICAgICAgIHZhcmlhYmxlTmFtZXMuZm9yRWFjaCgobmFtZSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gRU5HSU5FLnJlZ2lzdGVyZWRWYXJpYWJsZXNbbmFtZV07XG4gICAgICAgICAgICAgICAgY29uc3QgdHJhaW5hYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWNjdW11bGF0ZWRGaXJzdE1vbWVudFtpXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWNjdW11bGF0ZWRGaXJzdE1vbWVudFtpXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogYCR7bmFtZX0vbWAsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogemVyb3NMaWtlKHZhbHVlKS52YXJpYWJsZSh0cmFpbmFibGUpXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkV2VpZ2h0ZWRJbmZOb3JtW2ldID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY2N1bXVsYXRlZFdlaWdodGVkSW5mTm9ybVtpXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogYCR7bmFtZX0vdmAsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogemVyb3NMaWtlKHZhbHVlKS52YXJpYWJsZSh0cmFpbmFibGUpXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGdyYWRpZW50ID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyYWRpZW50c1tpXS50ZW5zb3IgOlxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyYWRpZW50c1tuYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAoZ3JhZGllbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0TW9tZW50ID0gdGhpcy5hY2N1bXVsYXRlZEZpcnN0TW9tZW50W2ldLnZhcmlhYmxlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHdlaWdodGVkSW5mTm9ybSA9IHRoaXMuYWNjdW11bGF0ZWRXZWlnaHRlZEluZk5vcm1baV0udmFyaWFibGU7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Rmlyc3RNb21lbnQgPSBhZGQobXVsKGZpcnN0TW9tZW50LCB0aGlzLmJldGExKSwgbXVsKGdyYWRpZW50LCAxIC0gdGhpcy5iZXRhMSkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHV0MCA9IG11bCh3ZWlnaHRlZEluZk5vcm0sIHRoaXMuYmV0YTIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHV0MSA9IGFicyhncmFkaWVudCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3V2VpZ2h0ZWRJbmZOb3JtID0gbWF4aW11bSh1dDAsIHV0MSk7XG4gICAgICAgICAgICAgICAgZmlyc3RNb21lbnQuYXNzaWduKG5ld0ZpcnN0TW9tZW50KTtcbiAgICAgICAgICAgICAgICB3ZWlnaHRlZEluZk5vcm0uYXNzaWduKG5ld1dlaWdodGVkSW5mTm9ybSk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBhZGQobXVsKGRpdihsciwgb25lTWludXNBY2NCZXRhMSksIGRpdihuZXdGaXJzdE1vbWVudCwgYWRkKG5ld1dlaWdodGVkSW5mTm9ybSwgdGhpcy5lcHNpbG9uKSkpLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgdmFsdWUuYXNzaWduKG5ld1ZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5pdGVyYXRpb24uYXNzaWduKGFkZCh0aGlzLml0ZXJhdGlvbiwgMSkpO1xuICAgICAgICAgICAgdGhpcy5hY2NCZXRhMS5hc3NpZ24obXVsKHRoaXMuYWNjQmV0YTEsIHRoaXMuYmV0YTEpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaW5jcmVtZW50SXRlcmF0aW9ucygpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLmFjY0JldGExLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5pdGVyYXRpb24uZGlzcG9zZSgpO1xuICAgICAgICBpZiAodGhpcy5hY2N1bXVsYXRlZEZpcnN0TW9tZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGRpc3Bvc2UodGhpcy5hY2N1bXVsYXRlZEZpcnN0TW9tZW50Lm1hcCh2ID0+IHYudmFyaWFibGUpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hY2N1bXVsYXRlZFdlaWdodGVkSW5mTm9ybSAhPSBudWxsKSB7XG4gICAgICAgICAgICBkaXNwb3NlKHRoaXMuYWNjdW11bGF0ZWRXZWlnaHRlZEluZk5vcm0ubWFwKHYgPT4gdi52YXJpYWJsZSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGdldFdlaWdodHMoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZ2V0V2VpZ2h0cygpIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgQWRhbWF4IHlldC4nKTtcbiAgICB9XG4gICAgYXN5bmMgc2V0V2VpZ2h0cyh3ZWlnaHRWYWx1ZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzZXRXZWlnaHRzKCkgaXMgbm90IGltcGxlbWVudGVkIGZvciBBZGFtYXggeWV0LicpO1xuICAgIH1cbiAgICBnZXRDb25maWcoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnbGVhcm5pbmdSYXRlJzogdGhpcy5sZWFybmluZ1JhdGUsXG4gICAgICAgICAgICAnYmV0YTEnOiB0aGlzLmJldGExLFxuICAgICAgICAgICAgJ2JldGEyJzogdGhpcy5iZXRhMixcbiAgICAgICAgICAgICdlcHNpbG9uJzogdGhpcy5lcHNpbG9uLFxuICAgICAgICAgICAgJ2RlY2F5JzogdGhpcy5kZWNheVxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBzdGF0aWMgZnJvbUNvbmZpZyhjbHMsIGNvbmZpZykge1xuICAgICAgICByZXR1cm4gbmV3IGNscyhjb25maWdbJ2xlYXJuaW5nUmF0ZSddLCBjb25maWdbJ2JldGExJ10sIGNvbmZpZ1snYmV0YTInXSwgY29uZmlnWydlcHNpbG9uJ10sIGNvbmZpZ1snZGVjYXknXSk7XG4gICAgfVxufVxuLyoqIEBub2NvbGxhcHNlICovXG5BZGFtYXhPcHRpbWl6ZXIuY2xhc3NOYW1lID0gJ0FkYW1heCc7IC8vIE5vdGU6IE5hbWUgbWF0dGVycyBmb3IgUHl0aG9uIGNvbXBhdGJpbGl0eS5cbnJlZ2lzdGVyQ2xhc3MoQWRhbWF4T3B0aW1pemVyKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFkYW1heF9vcHRpbWl6ZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IGRpc3Bvc2UsIHRpZHkgfSBmcm9tICcuLi9nbG9iYWxzJztcbmltcG9ydCB7IGFkZCB9IGZyb20gJy4uL29wcy9hZGQnO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQgeyBzY2FsYXIgfSBmcm9tICcuLi9vcHMvc2NhbGFyJztcbmltcG9ydCB7IHplcm9zTGlrZSB9IGZyb20gJy4uL29wcy96ZXJvc19saWtlJztcbmltcG9ydCB7IHJlZ2lzdGVyQ2xhc3MgfSBmcm9tICcuLi9zZXJpYWxpemF0aW9uJztcbmltcG9ydCB7IFNHRE9wdGltaXplciB9IGZyb20gJy4vc2dkX29wdGltaXplcic7XG4vKiogQGRvY2xpbmsgT3B0aW1pemVyICovXG5leHBvcnQgY2xhc3MgTW9tZW50dW1PcHRpbWl6ZXIgZXh0ZW5kcyBTR0RPcHRpbWl6ZXIge1xuICAgIGNvbnN0cnVjdG9yKGxlYXJuaW5nUmF0ZSwgbW9tZW50dW0sIHVzZU5lc3Rlcm92ID0gZmFsc2UpIHtcbiAgICAgICAgc3VwZXIobGVhcm5pbmdSYXRlKTtcbiAgICAgICAgdGhpcy5sZWFybmluZ1JhdGUgPSBsZWFybmluZ1JhdGU7XG4gICAgICAgIHRoaXMubW9tZW50dW0gPSBtb21lbnR1bTtcbiAgICAgICAgdGhpcy51c2VOZXN0ZXJvdiA9IHVzZU5lc3Rlcm92O1xuICAgICAgICB0aGlzLmFjY3VtdWxhdGlvbnMgPSBbXTtcbiAgICAgICAgdGhpcy5tID0gc2NhbGFyKHRoaXMubW9tZW50dW0pO1xuICAgIH1cbiAgICBhcHBseUdyYWRpZW50cyh2YXJpYWJsZUdyYWRpZW50cykge1xuICAgICAgICBjb25zdCB2YXJpYWJsZU5hbWVzID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICAgICAgdmFyaWFibGVHcmFkaWVudHMubWFwKGl0ZW0gPT4gaXRlbS5uYW1lKSA6XG4gICAgICAgICAgICBPYmplY3Qua2V5cyh2YXJpYWJsZUdyYWRpZW50cyk7XG4gICAgICAgIHZhcmlhYmxlTmFtZXMuZm9yRWFjaCgobmFtZSwgaSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBFTkdJTkUucmVnaXN0ZXJlZFZhcmlhYmxlc1tuYW1lXTtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGlvbnNbaV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRyYWluYWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuYWNjdW11bGF0aW9uc1tpXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lOiBgJHtuYW1lfS9tb21lbnR1bWAsXG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlOiB0aWR5KCgpID0+IHplcm9zTGlrZSh2YWx1ZSkudmFyaWFibGUodHJhaW5hYmxlKSlcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYWNjdW11bGF0aW9uID0gdGhpcy5hY2N1bXVsYXRpb25zW2ldLnZhcmlhYmxlO1xuICAgICAgICAgICAgY29uc3QgZ3JhZGllbnQgPSBBcnJheS5pc0FycmF5KHZhcmlhYmxlR3JhZGllbnRzKSA/XG4gICAgICAgICAgICAgICAgdmFyaWFibGVHcmFkaWVudHNbaV0udGVuc29yIDpcbiAgICAgICAgICAgICAgICB2YXJpYWJsZUdyYWRpZW50c1tuYW1lXTtcbiAgICAgICAgICAgIGlmIChncmFkaWVudCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGlkeSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IG5ld1ZhbHVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0FjY3VtdWxhdGlvbiA9IGFkZChtdWwodGhpcy5tLCBhY2N1bXVsYXRpb24pLCBncmFkaWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudXNlTmVzdGVyb3YpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWUgPSBhZGQobXVsKHRoaXMuYywgYWRkKGdyYWRpZW50LCBtdWwobmV3QWNjdW11bGF0aW9uLCB0aGlzLm0pKSksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gYWRkKG11bCh0aGlzLmMsIG5ld0FjY3VtdWxhdGlvbiksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYWNjdW11bGF0aW9uLmFzc2lnbihuZXdBY2N1bXVsYXRpb24pO1xuICAgICAgICAgICAgICAgIHZhbHVlLmFzc2lnbihuZXdWYWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaW5jcmVtZW50SXRlcmF0aW9ucygpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLm0uZGlzcG9zZSgpO1xuICAgICAgICBpZiAodGhpcy5hY2N1bXVsYXRpb25zICE9IG51bGwpIHtcbiAgICAgICAgICAgIGRpc3Bvc2UodGhpcy5hY2N1bXVsYXRpb25zLm1hcCh2ID0+IHYudmFyaWFibGUpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBtb21lbnR1bSBvZiB0aGUgb3B0aW1pemVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIG1vbWVudHVtXG4gICAgICovXG4gICAgc2V0TW9tZW50dW0obW9tZW50dW0pIHtcbiAgICAgICAgdGhpcy5tb21lbnR1bSA9IG1vbWVudHVtO1xuICAgIH1cbiAgICBhc3luYyBnZXRXZWlnaHRzKCkge1xuICAgICAgICAvLyBPcmRlciBtYXR0ZXJzIGZvciBQeXRob24gY29tcGF0aWJpbGl0eS5cbiAgICAgICAgcmV0dXJuIFthd2FpdCB0aGlzLnNhdmVJdGVyYXRpb25zKCldLmNvbmNhdCh0aGlzLmFjY3VtdWxhdGlvbnMubWFwKHYgPT4gKHsgbmFtZTogdi5vcmlnaW5hbE5hbWUsIHRlbnNvcjogdi52YXJpYWJsZSB9KSkpO1xuICAgIH1cbiAgICBhc3luYyBzZXRXZWlnaHRzKHdlaWdodFZhbHVlcykge1xuICAgICAgICB3ZWlnaHRWYWx1ZXMgPSBhd2FpdCB0aGlzLmV4dHJhY3RJdGVyYXRpb25zKHdlaWdodFZhbHVlcyk7XG4gICAgICAgIGNvbnN0IHRyYWluYWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFjY3VtdWxhdGlvbnMgPSB3ZWlnaHRWYWx1ZXMubWFwKHYgPT4gKHsgb3JpZ2luYWxOYW1lOiB2Lm5hbWUsIHZhcmlhYmxlOiB2LnRlbnNvci52YXJpYWJsZSh0cmFpbmFibGUpIH0pKTtcbiAgICB9XG4gICAgZ2V0Q29uZmlnKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ2xlYXJuaW5nUmF0ZSc6IHRoaXMubGVhcm5pbmdSYXRlLFxuICAgICAgICAgICAgJ21vbWVudHVtJzogdGhpcy5tb21lbnR1bSxcbiAgICAgICAgICAgICd1c2VOZXN0ZXJvdic6IHRoaXMudXNlTmVzdGVyb3ZcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgc3RhdGljIGZyb21Db25maWcoY2xzLCBjb25maWcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBjbHMoY29uZmlnWydsZWFybmluZ1JhdGUnXSwgY29uZmlnWydtb21lbnR1bSddLCBjb25maWdbJ3VzZU5lc3Rlcm92J10pO1xuICAgIH1cbn1cbi8qKiBAbm9jb2xsYXBzZSAqL1xuTW9tZW50dW1PcHRpbWl6ZXIuY2xhc3NOYW1lID0gJ01vbWVudHVtJzsgLy8gTmFtZSBtYXR0ZXJzIGZvciBQeXRob24gY29tcGF0aWJpbGl0eS5cbnJlZ2lzdGVyQ2xhc3MoTW9tZW50dW1PcHRpbWl6ZXIpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bW9tZW50dW1fb3B0aW1pemVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGRpc3Bvc2UgfSBmcm9tICcuLi9nbG9iYWxzJztcbmltcG9ydCB7IHZhcmlhYmxlR3JhZHMgfSBmcm9tICcuLi9ncmFkaWVudHMnO1xuaW1wb3J0IHsgc2NhbGFyIH0gZnJvbSAnLi4vb3BzL29wcyc7XG5pbXBvcnQgeyBTZXJpYWxpemFibGUgfSBmcm9tICcuLi9zZXJpYWxpemF0aW9uJztcbi8qKiBAZG9jIHtoZWFkaW5nOiAnVHJhaW5pbmcnLCBzdWJoZWFkaW5nOiAnQ2xhc3NlcycsIG5hbWVzcGFjZTogJ3RyYWluJ30gKi9cbmV4cG9ydCBjbGFzcyBPcHRpbWl6ZXIgZXh0ZW5kcyBTZXJpYWxpemFibGUge1xuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIGBmKClgIGFuZCBtaW5pbWl6ZXMgdGhlIHNjYWxhciBvdXRwdXQgb2YgYGYoKWAgYnkgY29tcHV0aW5nXG4gICAgICogZ3JhZGllbnRzIG9mIHkgd2l0aCByZXNwZWN0IHRvIHRoZSBsaXN0IG9mIHRyYWluYWJsZSB2YXJpYWJsZXMgcHJvdmlkZWQgYnlcbiAgICAgKiBgdmFyTGlzdGAuIElmIG5vIGxpc3QgaXMgcHJvdmlkZWQsIGl0IGRlZmF1bHRzIHRvIGFsbCB0cmFpbmFibGUgdmFyaWFibGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGYgVGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgYW5kIHdob3NlIG91dHB1dCB0byBtaW5pbWl6ZS5cbiAgICAgKiBAcGFyYW0gcmV0dXJuQ29zdCBXaGV0aGVyIHRvIHJldHVybiB0aGUgc2NhbGFyIGNvc3QgdmFsdWUgcHJvZHVjZWQgYnlcbiAgICAgKiBleGVjdXRpbmcgYGYoKWAuXG4gICAgICogQHBhcmFtIHZhckxpc3QgQW4gb3B0aW9uYWwgbGlzdCBvZiB2YXJpYWJsZXMgdG8gdXBkYXRlLiBJZiBzcGVjaWZpZWQsIG9ubHlcbiAgICAgKiB0aGUgdHJhaW5hYmxlIHZhcmlhYmxlcyBpbiB2YXJMaXN0IHdpbGwgYmUgdXBkYXRlZCBieSBtaW5pbWl6ZS4gRGVmYXVsdHMgdG9cbiAgICAgKiBhbGwgdHJhaW5hYmxlIHZhcmlhYmxlcy5cbiAgICAgKlxuICAgICAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdPcHRpbWl6ZXJzJ31cbiAgICAgKi9cbiAgICBtaW5pbWl6ZShmLCByZXR1cm5Db3N0ID0gZmFsc2UsIHZhckxpc3QpIHtcbiAgICAgICAgY29uc3QgeyB2YWx1ZSwgZ3JhZHMgfSA9IHRoaXMuY29tcHV0ZUdyYWRpZW50cyhmLCB2YXJMaXN0KTtcbiAgICAgICAgaWYgKHZhckxpc3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgZ3JhZEFycmF5ID0gdmFyTGlzdC5tYXAodiA9PiAoeyBuYW1lOiB2Lm5hbWUsIHRlbnNvcjogZ3JhZHNbdi5uYW1lXSB9KSk7XG4gICAgICAgICAgICB0aGlzLmFwcGx5R3JhZGllbnRzKGdyYWRBcnJheSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFwcGx5R3JhZGllbnRzKGdyYWRzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBEaXNwb3NlIGdyYWRpZW50cy5cbiAgICAgICAgZGlzcG9zZShncmFkcyk7XG4gICAgICAgIGlmIChyZXR1cm5Db3N0KSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZS5kaXNwb3NlKCk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgdGhhdCB0aGlzIG9wdGltaXplciBpbnN0YW5jZSBoYXMgYmVlbiBpbnZva2VkIGZvci5cbiAgICAgKi9cbiAgICBnZXQgaXRlcmF0aW9ucygpIHtcbiAgICAgICAgaWYgKHRoaXMuaXRlcmF0aW9uc18gPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5pdGVyYXRpb25zXyA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlcmF0aW9uc187XG4gICAgfVxuICAgIGluY3JlbWVudEl0ZXJhdGlvbnMoKSB7XG4gICAgICAgIHRoaXMuaXRlcmF0aW9uc18gPSB0aGlzLml0ZXJhdGlvbnMgKyAxO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyBmKCkgYW5kIGNvbXB1dGVzIHRoZSBncmFkaWVudCBvZiB0aGUgc2NhbGFyIG91dHB1dCBvZiBmKCkgd2l0aFxuICAgICAqIHJlc3BlY3QgdG8gdGhlIGxpc3Qgb2YgdHJhaW5hYmxlIHZhcmlhYmxlcyBwcm92aWRlZCBieSBgdmFyTGlzdGAuIElmIG5vXG4gICAgICogbGlzdCBpcyBwcm92aWRlZCwgaXQgZGVmYXVsdHMgdG8gYWxsIHRyYWluYWJsZSB2YXJpYWJsZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZiBUaGUgZnVuY3Rpb24gdG8gZXhlY3V0ZSBhbmQgd2hvc2Ugb3V0cHV0IHRvIHVzZSBmb3IgY29tcHV0aW5nXG4gICAgICogZ3JhZGllbnRzIHdpdGggcmVzcGVjdCB0byB2YXJpYWJsZXMuXG4gICAgICogQHBhcmFtIHZhckxpc3QgQW4gb3B0aW9uYWwgbGlzdCBvZiB2YXJpYWJsZXMgdG8gY29tcHV0ZSBncmFkaWVudHMgd2l0aFxuICAgICAqIHJlc3BlY3QgdG8uIElmIHNwZWNpZmllZCwgb25seSB0aGUgdHJhaW5hYmxlIHZhcmlhYmxlcyBpbiB2YXJMaXN0IHdpbGwgaGF2ZVxuICAgICAqIGdyYWRpZW50cyBjb21wdXRlZCB3aXRoIHJlc3BlY3QgdG8uIERlZmF1bHRzIHRvIGFsbCB0cmFpbmFibGUgdmFyaWFibGVzLlxuICAgICAqXG4gICAgICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ09wdGltaXplcnMnfVxuICAgICAqL1xuICAgIGNvbXB1dGVHcmFkaWVudHMoZiwgdmFyTGlzdCkge1xuICAgICAgICByZXR1cm4gdmFyaWFibGVHcmFkcyhmLCB2YXJMaXN0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGlzcG9zZSB0aGUgdmFyaWFibGVzIChpZiBhbnkpIG93bmVkIGJ5IHRoaXMgb3B0aW1pemVyIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLml0ZXJhdGlvbnNfICE9IG51bGwpIHtcbiAgICAgICAgICAgIGRpc3Bvc2UodGhpcy5pdGVyYXRpb25zXyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgc2F2ZUl0ZXJhdGlvbnMoKSB7XG4gICAgICAgIGlmICh0aGlzLml0ZXJhdGlvbnNfID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuaXRlcmF0aW9uc18gPSAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnaXRlcicsXG4gICAgICAgICAgICAvLyBUT0RPKGNhaXMpOiBVc2UgJ2ludDY0JyB0eXBlIHdoZW4gYXZhaWxhYmxlLlxuICAgICAgICAgICAgdGVuc29yOiBzY2FsYXIodGhpcy5pdGVyYXRpb25zXywgJ2ludDMyJylcbiAgICAgICAgfTtcbiAgICB9XG4gICAgYXN5bmMgZ2V0V2VpZ2h0cygpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdnZXRXZWlnaHRzKCkgaXMgbm90IGltcGxlbWVudGVkIGZvciB0aGlzIG9wdGltaXplciB5ZXQuJyk7XG4gICAgfVxuICAgIGFzeW5jIHNldFdlaWdodHMod2VpZ2h0VmFsdWVzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgc2V0V2VpZ2h0cygpIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgdGhpcyBvcHRpbWl6ZXIgY2xhc3MgYCArXG4gICAgICAgICAgICBgJHt0aGlzLmdldENsYXNzTmFtZSgpfWApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0IHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSB3ZWlnaHQgdmFsdWVzIGFuZCBzZXQgaXRcbiAgICAgKiBhcyB0aGUgaXRlcmF0aW9ucyBjb3VudGVyIHZhcmlhYmxlIG9mIHRoaXMgaW5zdGFuY2Ugb2Ygb3B0aW1pemVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHdlaWdodFZhbHVlc1xuICAgICAqIEByZXR1cm5zIFdlaWdodCB2YWx1ZXMgd2l0aCB0aGUgZmlyc3QgZWxlbWVudCBjb25zdW1lZCBhbmQgZXhjbHVkZWQuXG4gICAgICovXG4gICAgYXN5bmMgZXh0cmFjdEl0ZXJhdGlvbnMod2VpZ2h0VmFsdWVzKSB7XG4gICAgICAgIHRoaXMuaXRlcmF0aW9uc18gPSAoYXdhaXQgd2VpZ2h0VmFsdWVzWzBdLnRlbnNvci5kYXRhKCkpWzBdO1xuICAgICAgICByZXR1cm4gd2VpZ2h0VmFsdWVzLnNsaWNlKDEpO1xuICAgIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShPcHRpbWl6ZXIsIFN5bWJvbC5oYXNJbnN0YW5jZSwge1xuICAgIHZhbHVlOiAoaW5zdGFuY2UpID0+IHtcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlLm1pbmltaXplICE9IG51bGwgJiYgaW5zdGFuY2UuY29tcHV0ZUdyYWRpZW50cyAhPSBudWxsICYmXG4gICAgICAgICAgICBpbnN0YW5jZS5hcHBseUdyYWRpZW50cyAhPSBudWxsO1xuICAgIH1cbn0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b3B0aW1pemVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEFkYWRlbHRhT3B0aW1pemVyIH0gZnJvbSAnLi9hZGFkZWx0YV9vcHRpbWl6ZXInO1xuaW1wb3J0IHsgQWRhZ3JhZE9wdGltaXplciB9IGZyb20gJy4vYWRhZ3JhZF9vcHRpbWl6ZXInO1xuaW1wb3J0IHsgQWRhbU9wdGltaXplciB9IGZyb20gJy4vYWRhbV9vcHRpbWl6ZXInO1xuaW1wb3J0IHsgQWRhbWF4T3B0aW1pemVyIH0gZnJvbSAnLi9hZGFtYXhfb3B0aW1pemVyJztcbmltcG9ydCB7IE1vbWVudHVtT3B0aW1pemVyIH0gZnJvbSAnLi9tb21lbnR1bV9vcHRpbWl6ZXInO1xuaW1wb3J0IHsgUk1TUHJvcE9wdGltaXplciB9IGZyb20gJy4vcm1zcHJvcF9vcHRpbWl6ZXInO1xuaW1wb3J0IHsgU0dET3B0aW1pemVyIH0gZnJvbSAnLi9zZ2Rfb3B0aW1pemVyJztcbmV4cG9ydCBjbGFzcyBPcHRpbWl6ZXJDb25zdHJ1Y3RvcnMge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBgdGYuU0dET3B0aW1pemVyYCB0aGF0IHVzZXMgc3RvY2hhc3RpYyBncmFkaWVudCBkZXNjZW50LlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiAvLyBGaXQgYSBxdWFkcmF0aWMgZnVuY3Rpb24gYnkgbGVhcm5pbmcgdGhlIGNvZWZmaWNpZW50cyBhLCBiLCBjLlxuICAgICAqIGNvbnN0IHhzID0gdGYudGVuc29yMWQoWzAsIDEsIDIsIDNdKTtcbiAgICAgKiBjb25zdCB5cyA9IHRmLnRlbnNvcjFkKFsxLjEsIDUuOSwgMTYuOCwgMzMuOV0pO1xuICAgICAqXG4gICAgICogY29uc3QgYSA9IHRmLnNjYWxhcihNYXRoLnJhbmRvbSgpKS52YXJpYWJsZSgpO1xuICAgICAqIGNvbnN0IGIgPSB0Zi5zY2FsYXIoTWF0aC5yYW5kb20oKSkudmFyaWFibGUoKTtcbiAgICAgKiBjb25zdCBjID0gdGYuc2NhbGFyKE1hdGgucmFuZG9tKCkpLnZhcmlhYmxlKCk7XG4gICAgICpcbiAgICAgKiAvLyB5ID0gYSAqIHheMiArIGIgKiB4ICsgYy5cbiAgICAgKiBjb25zdCBmID0geCA9PiBhLm11bCh4LnNxdWFyZSgpKS5hZGQoYi5tdWwoeCkpLmFkZChjKTtcbiAgICAgKiBjb25zdCBsb3NzID0gKHByZWQsIGxhYmVsKSA9PiBwcmVkLnN1YihsYWJlbCkuc3F1YXJlKCkubWVhbigpO1xuICAgICAqXG4gICAgICogY29uc3QgbGVhcm5pbmdSYXRlID0gMC4wMTtcbiAgICAgKiBjb25zdCBvcHRpbWl6ZXIgPSB0Zi50cmFpbi5zZ2QobGVhcm5pbmdSYXRlKTtcbiAgICAgKlxuICAgICAqIC8vIFRyYWluIHRoZSBtb2RlbC5cbiAgICAgKiBmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHtcbiAgICAgKiAgIG9wdGltaXplci5taW5pbWl6ZSgoKSA9PiBsb3NzKGYoeHMpLCB5cykpO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIC8vIE1ha2UgcHJlZGljdGlvbnMuXG4gICAgICogY29uc29sZS5sb2coXG4gICAgICogICAgIGBhOiAke2EuZGF0YVN5bmMoKX0sIGI6ICR7Yi5kYXRhU3luYygpfSwgYzogJHtjLmRhdGFTeW5jKCl9YCk7XG4gICAgICogY29uc3QgcHJlZHMgPSBmKHhzKS5kYXRhU3luYygpO1xuICAgICAqIHByZWRzLmZvckVhY2goKHByZWQsIGkpID0+IHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGB4OiAke2l9LCBwcmVkOiAke3ByZWR9YCk7XG4gICAgICogfSk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGVhcm5pbmdSYXRlIFRoZSBsZWFybmluZyByYXRlIHRvIHVzZSBmb3IgdGhlIFNHRCBhbGdvcml0aG0uXG4gICAgICpcbiAgICAgKiBAZG9jIHtoZWFkaW5nOiAnVHJhaW5pbmcnLCBzdWJoZWFkaW5nOiAnT3B0aW1pemVycycsIG5hbWVzcGFjZTogJ3RyYWluJ31cbiAgICAgKi9cbiAgICBzdGF0aWMgc2dkKGxlYXJuaW5nUmF0ZSkge1xuICAgICAgICByZXR1cm4gbmV3IFNHRE9wdGltaXplcihsZWFybmluZ1JhdGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgYHRmLk1vbWVudHVtT3B0aW1pemVyYCB0aGF0IHVzZXMgbW9tZW50dW0gZ3JhZGllbnRcbiAgICAgKiBkZXNjZW50LlxuICAgICAqXG4gICAgICogU2VlXG4gICAgICogW2h0dHA6Ly9wcm9jZWVkaW5ncy5tbHIucHJlc3MvdjI4L3N1dHNrZXZlcjEzLnBkZl0oXG4gICAgICogaHR0cDovL3Byb2NlZWRpbmdzLm1sci5wcmVzcy92Mjgvc3V0c2tldmVyMTMucGRmKVxuICAgICAqXG4gICAgICogQHBhcmFtIGxlYXJuaW5nUmF0ZSBUaGUgbGVhcm5pbmcgcmF0ZSB0byB1c2UgZm9yIHRoZSBNb21lbnR1bSBncmFkaWVudFxuICAgICAqIGRlc2NlbnQgYWxnb3JpdGhtLlxuICAgICAqIEBwYXJhbSBtb21lbnR1bSBUaGUgbW9tZW50dW0gdG8gdXNlIGZvciB0aGUgbW9tZW50dW0gZ3JhZGllbnQgZGVzY2VudFxuICAgICAqIGFsZ29yaXRobS5cbiAgICAgKlxuICAgICAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdPcHRpbWl6ZXJzJywgbmFtZXNwYWNlOiAndHJhaW4nfVxuICAgICAqL1xuICAgIHN0YXRpYyBtb21lbnR1bShsZWFybmluZ1JhdGUsIG1vbWVudHVtLCB1c2VOZXN0ZXJvdiA9IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBuZXcgTW9tZW50dW1PcHRpbWl6ZXIobGVhcm5pbmdSYXRlLCBtb21lbnR1bSwgdXNlTmVzdGVyb3YpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgYHRmLlJNU1Byb3BPcHRpbWl6ZXJgIHRoYXQgdXNlcyBSTVNQcm9wIGdyYWRpZW50XG4gICAgICogZGVzY2VudC4gVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIHBsYWluIG1vbWVudHVtIGFuZCBpcyBub3QgY2VudGVyZWRcbiAgICAgKiB2ZXJzaW9uIG9mIFJNU1Byb3AuXG4gICAgICpcbiAgICAgKiBTZWVcbiAgICAgKiBbaHR0cDovL3d3dy5jcy50b3JvbnRvLmVkdS9+dGlqbWVuL2NzYzMyMS9zbGlkZXMvbGVjdHVyZV9zbGlkZXNfbGVjNi5wZGZdKFxuICAgICAqIGh0dHA6Ly93d3cuY3MudG9yb250by5lZHUvfnRpam1lbi9jc2MzMjEvc2xpZGVzL2xlY3R1cmVfc2xpZGVzX2xlYzYucGRmKVxuICAgICAqXG4gICAgICogQHBhcmFtIGxlYXJuaW5nUmF0ZSBUaGUgbGVhcm5pbmcgcmF0ZSB0byB1c2UgZm9yIHRoZSBSTVNQcm9wIGdyYWRpZW50XG4gICAgICogZGVzY2VudCBhbGdvcml0aG0uXG4gICAgICogQHBhcmFtIGRlY2F5IFRoZSBkaXNjb3VudGluZyBmYWN0b3IgZm9yIHRoZSBoaXN0b3J5L2NvbWluZyBncmFkaWVudC5cbiAgICAgKiBAcGFyYW0gbW9tZW50dW0gVGhlIG1vbWVudHVtIHRvIHVzZSBmb3IgdGhlIFJNU1Byb3AgZ3JhZGllbnQgZGVzY2VudFxuICAgICAqIGFsZ29yaXRobS5cbiAgICAgKiBAcGFyYW0gZXBzaWxvbiBTbWFsbCB2YWx1ZSB0byBhdm9pZCB6ZXJvIGRlbm9taW5hdG9yLlxuICAgICAqIEBwYXJhbSBjZW50ZXJlZCBJZiB0cnVlLCBncmFkaWVudHMgYXJlIG5vcm1hbGl6ZWQgYnkgdGhlIGVzdGltYXRlZFxuICAgICAqIHZhcmlhbmNlIG9mIHRoZSBncmFkaWVudC5cbiAgICAgKlxuICAgICAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdPcHRpbWl6ZXJzJywgbmFtZXNwYWNlOiAndHJhaW4nfVxuICAgICAqL1xuICAgIHN0YXRpYyBybXNwcm9wKGxlYXJuaW5nUmF0ZSwgZGVjYXkgPSAuOSwgbW9tZW50dW0gPSAwLjAsIGVwc2lsb24gPSBudWxsLCBjZW50ZXJlZCA9IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBuZXcgUk1TUHJvcE9wdGltaXplcihsZWFybmluZ1JhdGUsIGRlY2F5LCBtb21lbnR1bSwgZXBzaWxvbiwgY2VudGVyZWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgYHRmLkFkYW1PcHRpbWl6ZXJgIHRoYXQgdXNlcyB0aGUgQWRhbSBhbGdvcml0aG0uXG4gICAgICogU2VlIFtodHRwczovL2FyeGl2Lm9yZy9hYnMvMTQxMi42OTgwXShodHRwczovL2FyeGl2Lm9yZy9hYnMvMTQxMi42OTgwKVxuICAgICAqXG4gICAgICogQHBhcmFtIGxlYXJuaW5nUmF0ZSBUaGUgbGVhcm5pbmcgcmF0ZSB0byB1c2UgZm9yIHRoZSBBZGFtIGdyYWRpZW50XG4gICAgICogZGVzY2VudCBhbGdvcml0aG0uXG4gICAgICogQHBhcmFtIGJldGExIFRoZSBleHBvbmVudGlhbCBkZWNheSByYXRlIGZvciB0aGUgMXN0IG1vbWVudCBlc3RpbWF0ZXMuXG4gICAgICogQHBhcmFtIGJldGEyIFRoZSBleHBvbmVudGlhbCBkZWNheSByYXRlIGZvciB0aGUgMm5kIG1vbWVudCBlc3RpbWF0ZXMuXG4gICAgICogQHBhcmFtIGVwc2lsb24gQSBzbWFsbCBjb25zdGFudCBmb3IgbnVtZXJpY2FsIHN0YWJpbGl0eS5cbiAgICAgKlxuICAgICAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdPcHRpbWl6ZXJzJywgbmFtZXNwYWNlOiAndHJhaW4nfVxuICAgICAqL1xuICAgIHN0YXRpYyBhZGFtKGxlYXJuaW5nUmF0ZSA9IDAuMDAxLCBiZXRhMSA9IDAuOSwgYmV0YTIgPSAwLjk5OSwgZXBzaWxvbiA9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBZGFtT3B0aW1pemVyKGxlYXJuaW5nUmF0ZSwgYmV0YTEsIGJldGEyLCBlcHNpbG9uKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIGB0Zi5BZGFkZWx0YU9wdGltaXplcmAgdGhhdCB1c2VzIHRoZSBBZGFkZWx0YSBhbGdvcml0aG0uXG4gICAgICogU2VlIFtodHRwczovL2FyeGl2Lm9yZy9hYnMvMTIxMi41NzAxXShodHRwczovL2FyeGl2Lm9yZy9hYnMvMTIxMi41NzAxKVxuICAgICAqXG4gICAgICogQHBhcmFtIGxlYXJuaW5nUmF0ZSBUaGUgbGVhcm5pbmcgcmF0ZSB0byB1c2UgZm9yIHRoZSBBZGFkZWx0YSBncmFkaWVudFxuICAgICAqIGRlc2NlbnQgYWxnb3JpdGhtLlxuICAgICAqIEBwYXJhbSByaG8gVGhlIGxlYXJuaW5nIHJhdGUgZGVjYXkgb3ZlciBlYWNoIHVwZGF0ZS5cbiAgICAgKiBAcGFyYW0gZXBzaWxvbiBBIGNvbnN0YW50IGVwc2lsb24gdXNlZCB0byBiZXR0ZXIgY29uZGl0aW9uIHRoZSBncmFkXG4gICAgICogdXBkYXRlLlxuICAgICAqXG4gICAgICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ09wdGltaXplcnMnLCBuYW1lc3BhY2U6ICd0cmFpbid9XG4gICAgICovXG4gICAgc3RhdGljIGFkYWRlbHRhKGxlYXJuaW5nUmF0ZSA9IC4wMDEsIHJobyA9IC45NSwgZXBzaWxvbiA9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBZGFkZWx0YU9wdGltaXplcihsZWFybmluZ1JhdGUsIHJobywgZXBzaWxvbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBgdGYuQWRhbWF4T3B0aW1pemVyYCB0aGF0IHVzZXMgdGhlIEFkYW1heCBhbGdvcml0aG0uXG4gICAgICogU2VlIFtodHRwczovL2FyeGl2Lm9yZy9hYnMvMTQxMi42OTgwXShodHRwczovL2FyeGl2Lm9yZy9hYnMvMTQxMi42OTgwKVxuICAgICAqXG4gICAgICogQHBhcmFtIGxlYXJuaW5nUmF0ZSBUaGUgbGVhcm5pbmcgcmF0ZSB0byB1c2UgZm9yIHRoZSBBZGFtYXggZ3JhZGllbnRcbiAgICAgKiBkZXNjZW50IGFsZ29yaXRobS5cbiAgICAgKiBAcGFyYW0gYmV0YTEgVGhlIGV4cG9uZW50aWFsIGRlY2F5IHJhdGUgZm9yIHRoZSAxc3QgbW9tZW50IGVzdGltYXRlcy5cbiAgICAgKiBAcGFyYW0gYmV0YTIgVGhlIGV4cG9uZW50aWFsIGRlY2F5IHJhdGUgZm9yIHRoZSAybmQgbW9tZW50IGVzdGltYXRlcy5cbiAgICAgKiBAcGFyYW0gZXBzaWxvbiBBIHNtYWxsIGNvbnN0YW50IGZvciBudW1lcmljYWwgc3RhYmlsaXR5LlxuICAgICAqIEBwYXJhbSBkZWNheSBUaGUgbGVhcm5pbmcgcmF0ZSBkZWNheSBvdmVyIGVhY2ggdXBkYXRlLlxuICAgICAqXG4gICAgICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ09wdGltaXplcnMnLCBuYW1lc3BhY2U6ICd0cmFpbid9XG4gICAgICovXG4gICAgc3RhdGljIGFkYW1heChsZWFybmluZ1JhdGUgPSAwLjAwMiwgYmV0YTEgPSAwLjksIGJldGEyID0gMC45OTksIGVwc2lsb24gPSBudWxsLCBkZWNheSA9IDAuMCkge1xuICAgICAgICByZXR1cm4gbmV3IEFkYW1heE9wdGltaXplcihsZWFybmluZ1JhdGUsIGJldGExLCBiZXRhMiwgZXBzaWxvbiwgZGVjYXkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgYHRmLkFkYWdyYWRPcHRpbWl6ZXJgIHRoYXQgdXNlcyB0aGUgQWRhZ3JhZCBhbGdvcml0aG0uXG4gICAgICogU2VlXG4gICAgICogW2h0dHA6Ly93d3cuam1sci5vcmcvcGFwZXJzL3ZvbHVtZTEyL2R1Y2hpMTFhL2R1Y2hpMTFhLnBkZl0oXG4gICAgICogaHR0cDovL3d3dy5qbWxyLm9yZy9wYXBlcnMvdm9sdW1lMTIvZHVjaGkxMWEvZHVjaGkxMWEucGRmKVxuICAgICAqIG9yXG4gICAgICogW2h0dHA6Ly9ydWRlci5pby9vcHRpbWl6aW5nLWdyYWRpZW50LWRlc2NlbnQvaW5kZXguaHRtbCNhZGFncmFkXShcbiAgICAgKiBodHRwOi8vcnVkZXIuaW8vb3B0aW1pemluZy1ncmFkaWVudC1kZXNjZW50L2luZGV4Lmh0bWwjYWRhZ3JhZClcbiAgICAgKlxuICAgICAqIEBwYXJhbSBsZWFybmluZ1JhdGUgVGhlIGxlYXJuaW5nIHJhdGUgdG8gdXNlIGZvciB0aGUgQWRhZ3JhZCBncmFkaWVudFxuICAgICAqIGRlc2NlbnQgYWxnb3JpdGhtLlxuICAgICAqIEBwYXJhbSBpbml0aWFsQWNjdW11bGF0b3JWYWx1ZSBTdGFydGluZyB2YWx1ZSBmb3IgdGhlIGFjY3VtdWxhdG9ycywgbXVzdCBiZVxuICAgICAqIHBvc2l0aXZlLlxuICAgICAqXG4gICAgICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ09wdGltaXplcnMnLCBuYW1lc3BhY2U6ICd0cmFpbid9XG4gICAgICovXG4gICAgc3RhdGljIGFkYWdyYWQobGVhcm5pbmdSYXRlLCBpbml0aWFsQWNjdW11bGF0b3JWYWx1ZSA9IDAuMSkge1xuICAgICAgICByZXR1cm4gbmV3IEFkYWdyYWRPcHRpbWl6ZXIobGVhcm5pbmdSYXRlLCBpbml0aWFsQWNjdW11bGF0b3JWYWx1ZSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b3B0aW1pemVyX2NvbnN0cnVjdG9ycy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgZGlzcG9zZSwgdGlkeSB9IGZyb20gJy4uL2dsb2JhbHMnO1xuaW1wb3J0IHsgYWRkIH0gZnJvbSAnLi4vb3BzL2FkZCc7XG5pbXBvcnQgeyBkaXYgfSBmcm9tICcuLi9vcHMvZGl2JztcbmltcG9ydCB7IG11bCB9IGZyb20gJy4uL29wcy9tdWwnO1xuaW1wb3J0IHsgc3FydCB9IGZyb20gJy4uL29wcy9zcXJ0JztcbmltcG9ydCB7IHNxdWFyZSB9IGZyb20gJy4uL29wcy9zcXVhcmUnO1xuaW1wb3J0IHsgc3ViIH0gZnJvbSAnLi4vb3BzL3N1Yic7XG5pbXBvcnQgeyB6ZXJvc0xpa2UgfSBmcm9tICcuLi9vcHMvemVyb3NfbGlrZSc7XG5pbXBvcnQgeyByZWdpc3RlckNsYXNzIH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbic7XG5pbXBvcnQgeyBPcHRpbWl6ZXIgfSBmcm9tICcuL29wdGltaXplcic7XG4vKiogQGRvY2xpbmsgT3B0aW1pemVyICovXG5leHBvcnQgY2xhc3MgUk1TUHJvcE9wdGltaXplciBleHRlbmRzIE9wdGltaXplciB7XG4gICAgY29uc3RydWN0b3IobGVhcm5pbmdSYXRlLCBkZWNheSA9IDAuOSwgbW9tZW50dW0gPSAwLjAsIGVwc2lsb24gPSBudWxsLCBjZW50ZXJlZCA9IGZhbHNlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMubGVhcm5pbmdSYXRlID0gbGVhcm5pbmdSYXRlO1xuICAgICAgICB0aGlzLmRlY2F5ID0gZGVjYXk7XG4gICAgICAgIHRoaXMubW9tZW50dW0gPSBtb21lbnR1bTtcbiAgICAgICAgdGhpcy5lcHNpbG9uID0gZXBzaWxvbjtcbiAgICAgICAgdGhpcy5hY2N1bXVsYXRlZE1lYW5TcXVhcmVzID0gW107XG4gICAgICAgIHRoaXMuYWNjdW11bGF0ZWRNb21lbnRzID0gW107XG4gICAgICAgIHRoaXMuYWNjdW11bGF0ZWRNZWFuR3JhZHMgPSBbXTtcbiAgICAgICAgdGhpcy5jZW50ZXJlZCA9IGNlbnRlcmVkO1xuICAgICAgICBpZiAoZXBzaWxvbiA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmVwc2lsb24gPSBFTkdJTkUuYmFja2VuZC5lcHNpbG9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxlYXJuaW5nUmF0ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGxlYXJuaW5nUmF0ZSBmb3IgUk1TUHJvcE9wdGltaXplciBtdXN0IGJlIGRlZmluZWQuYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXBwbHlHcmFkaWVudHModmFyaWFibGVHcmFkaWVudHMpIHtcbiAgICAgICAgY29uc3QgdmFyaWFibGVOYW1lcyA9IEFycmF5LmlzQXJyYXkodmFyaWFibGVHcmFkaWVudHMpID9cbiAgICAgICAgICAgIHZhcmlhYmxlR3JhZGllbnRzLm1hcChpdGVtID0+IGl0ZW0ubmFtZSkgOlxuICAgICAgICAgICAgT2JqZWN0LmtleXModmFyaWFibGVHcmFkaWVudHMpO1xuICAgICAgICB2YXJpYWJsZU5hbWVzLmZvckVhY2goKG5hbWUsIGkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gRU5HSU5FLnJlZ2lzdGVyZWRWYXJpYWJsZXNbbmFtZV07XG4gICAgICAgICAgICBjb25zdCB0cmFpbmFibGUgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkTWVhblNxdWFyZXNbaV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWNjdW11bGF0ZWRNZWFuU3F1YXJlc1tpXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lOiBgJHtuYW1lfS9ybXNgLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogdGlkeSgoKSA9PiB6ZXJvc0xpa2UodmFsdWUpLnZhcmlhYmxlKHRyYWluYWJsZSkpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkTW9tZW50c1tpXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hY2N1bXVsYXRlZE1vbWVudHNbaV0gPSB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogYCR7bmFtZX0vbW9tZW50dW1gLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogdGlkeSgoKSA9PiB6ZXJvc0xpa2UodmFsdWUpLnZhcmlhYmxlKHRyYWluYWJsZSkpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkTWVhbkdyYWRzW2ldID09IG51bGwgJiYgdGhpcy5jZW50ZXJlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWNjdW11bGF0ZWRNZWFuR3JhZHNbaV0gPSB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogYCR7bmFtZX0vbWdgLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogdGlkeSgoKSA9PiB6ZXJvc0xpa2UodmFsdWUpLnZhcmlhYmxlKHRyYWluYWJsZSkpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGdyYWRpZW50ID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JhZGllbnRzW2ldLnRlbnNvciA6XG4gICAgICAgICAgICAgICAgdmFyaWFibGVHcmFkaWVudHNbbmFtZV07XG4gICAgICAgICAgICBpZiAoZ3JhZGllbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFjY3VtdWxhdGVkTWVhblNxdWFyZSA9IHRoaXMuYWNjdW11bGF0ZWRNZWFuU3F1YXJlc1tpXS52YXJpYWJsZTtcbiAgICAgICAgICAgIGNvbnN0IGFjY3VtdWxhdGVkTW9tZW50cyA9IHRoaXMuYWNjdW11bGF0ZWRNb21lbnRzW2ldLnZhcmlhYmxlO1xuICAgICAgICAgICAgdGlkeSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3QWNjdW11bGF0ZWRNZWFuU3F1YXJlID0gYWRkKG11bChhY2N1bXVsYXRlZE1lYW5TcXVhcmUsIHRoaXMuZGVjYXkpLCBtdWwoc3F1YXJlKGdyYWRpZW50KSwgMSAtIHRoaXMuZGVjYXkpKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jZW50ZXJlZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhY2N1bXVsYXRlZE1lYW5HcmFkID0gdGhpcy5hY2N1bXVsYXRlZE1lYW5HcmFkc1tpXS52YXJpYWJsZTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2VudGVyZWQgZ3JhZGllbnRcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3QWNjdW11bGF0ZWRNZWFuR3JhZCA9IGFkZChtdWwoYWNjdW11bGF0ZWRNZWFuR3JhZCwgdGhpcy5kZWNheSksIG11bChncmFkaWVudCwgMSAtIHRoaXMuZGVjYXkpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JhZENvbnRyaWJ1dGlvbiA9IGRpdihtdWwoZ3JhZGllbnQsIHRoaXMubGVhcm5pbmdSYXRlKSwgc3FydChzdWIobmV3QWNjdW11bGF0ZWRNZWFuU3F1YXJlLCBhZGQoc3F1YXJlKG5ld0FjY3VtdWxhdGVkTWVhbkdyYWQpLCB0aGlzLmVwc2lsb24pKSkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdBY2N1bXVsYXRlZE1vbWVudHMgPSBhZGQobXVsKGFjY3VtdWxhdGVkTW9tZW50cywgdGhpcy5tb21lbnR1bSksIGdyYWRDb250cmlidXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZE1lYW5TcXVhcmUuYXNzaWduKG5ld0FjY3VtdWxhdGVkTWVhblNxdWFyZSk7XG4gICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkTWVhbkdyYWQuYXNzaWduKG5ld0FjY3VtdWxhdGVkTWVhbkdyYWQpO1xuICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZE1vbWVudHMuYXNzaWduKG5ld0FjY3VtdWxhdGVkTW9tZW50cyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gc3ViKHZhbHVlLCBuZXdBY2N1bXVsYXRlZE1vbWVudHMpO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZS5hc3NpZ24obmV3VmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUGxhaW4gZ3JhZGllbnRcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3QWNjdW11bGF0ZWRNZWFuU3F1YXJlID0gYWRkKG11bChhY2N1bXVsYXRlZE1lYW5TcXVhcmUsIHRoaXMuZGVjYXkpLCBtdWwoc3F1YXJlKGdyYWRpZW50KSwgMSAtIHRoaXMuZGVjYXkpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3QWNjdW11bGF0ZWRNb21lbnRzID0gYWRkKG11bChhY2N1bXVsYXRlZE1vbWVudHMsIHRoaXMubW9tZW50dW0pLCBkaXYobXVsKGdyYWRpZW50LCB0aGlzLmxlYXJuaW5nUmF0ZSksIHNxcnQoYWRkKG5ld0FjY3VtdWxhdGVkTWVhblNxdWFyZSwgdGhpcy5lcHNpbG9uKSkpKTtcbiAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0ZWRNZWFuU3F1YXJlLmFzc2lnbihuZXdBY2N1bXVsYXRlZE1lYW5TcXVhcmUpO1xuICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZE1vbWVudHMuYXNzaWduKG5ld0FjY3VtdWxhdGVkTW9tZW50cyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gc3ViKHZhbHVlLCBuZXdBY2N1bXVsYXRlZE1vbWVudHMpO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZS5hc3NpZ24obmV3VmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5pbmNyZW1lbnRJdGVyYXRpb25zKCk7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkTWVhblNxdWFyZXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgZGlzcG9zZSh0aGlzLmFjY3VtdWxhdGVkTWVhblNxdWFyZXMubWFwKHYgPT4gdi52YXJpYWJsZSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkTWVhbkdyYWRzICE9IG51bGwgJiYgdGhpcy5jZW50ZXJlZCkge1xuICAgICAgICAgICAgZGlzcG9zZSh0aGlzLmFjY3VtdWxhdGVkTWVhbkdyYWRzLm1hcCh2ID0+IHYudmFyaWFibGUpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hY2N1bXVsYXRlZE1vbWVudHMgIT0gbnVsbCkge1xuICAgICAgICAgICAgZGlzcG9zZSh0aGlzLmFjY3VtdWxhdGVkTW9tZW50cy5tYXAodiA9PiB2LnZhcmlhYmxlKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgZ2V0V2VpZ2h0cygpIHtcbiAgICAgICAgLy8gT3JkZXIgbWF0dGVycyBmb3IgUHl0aG9uIGNvbXBhdGliaWxpdHkuXG4gICAgICAgIGNvbnN0IHZhcmlhYmxlcyA9IFsuLi50aGlzLmFjY3VtdWxhdGVkTWVhblNxdWFyZXMsIC4uLnRoaXMuYWNjdW11bGF0ZWRNb21lbnRzXTtcbiAgICAgICAgaWYgKHRoaXMuY2VudGVyZWQpIHtcbiAgICAgICAgICAgIHZhcmlhYmxlcy5wdXNoKC4uLnRoaXMuYWNjdW11bGF0ZWRNZWFuR3JhZHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbYXdhaXQgdGhpcy5zYXZlSXRlcmF0aW9ucygpXS5jb25jYXQodmFyaWFibGVzLm1hcCh2ID0+ICh7IG5hbWU6IHYub3JpZ2luYWxOYW1lLCB0ZW5zb3I6IHYudmFyaWFibGUgfSkpKTtcbiAgICB9XG4gICAgYXN5bmMgc2V0V2VpZ2h0cyh3ZWlnaHRWYWx1ZXMpIHtcbiAgICAgICAgd2VpZ2h0VmFsdWVzID0gYXdhaXQgdGhpcy5leHRyYWN0SXRlcmF0aW9ucyh3ZWlnaHRWYWx1ZXMpO1xuICAgICAgICBjb25zdCB2YXJpYWJsZUNvdW50ID0gdGhpcy5jZW50ZXJlZCA/IHdlaWdodFZhbHVlcy5sZW5ndGggLyAzIDogd2VpZ2h0VmFsdWVzLmxlbmd0aCAvIDI7XG4gICAgICAgIGNvbnN0IHRyYWluYWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFjY3VtdWxhdGVkTWVhblNxdWFyZXMgPVxuICAgICAgICAgICAgd2VpZ2h0VmFsdWVzLnNsaWNlKDAsIHZhcmlhYmxlQ291bnQpLm1hcCh2ID0+ICh7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lOiB2Lm5hbWUsXG4gICAgICAgICAgICAgICAgdmFyaWFibGU6IHYudGVuc29yLnZhcmlhYmxlKHRyYWluYWJsZSlcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgdGhpcy5hY2N1bXVsYXRlZE1vbWVudHMgPVxuICAgICAgICAgICAgd2VpZ2h0VmFsdWVzLnNsaWNlKHZhcmlhYmxlQ291bnQsIHZhcmlhYmxlQ291bnQgKiAyKVxuICAgICAgICAgICAgICAgIC5tYXAodiA9PiAoe1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogdi5uYW1lLFxuICAgICAgICAgICAgICAgIHZhcmlhYmxlOiB2LnRlbnNvci52YXJpYWJsZSh0cmFpbmFibGUpXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIGlmICh0aGlzLmNlbnRlcmVkKSB7XG4gICAgICAgICAgICB0aGlzLmFjY3VtdWxhdGVkTWVhbkdyYWRzID1cbiAgICAgICAgICAgICAgICB3ZWlnaHRWYWx1ZXMuc2xpY2UodmFyaWFibGVDb3VudCAqIDIsIHZhcmlhYmxlQ291bnQgKiAzKVxuICAgICAgICAgICAgICAgICAgICAubWFwKHYgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lOiB2Lm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlOiB2LnRlbnNvci52YXJpYWJsZSh0cmFpbmFibGUpXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldENvbmZpZygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICdsZWFybmluZ1JhdGUnOiB0aGlzLmxlYXJuaW5nUmF0ZSxcbiAgICAgICAgICAgICdkZWNheSc6IHRoaXMuZGVjYXksXG4gICAgICAgICAgICAnbW9tZW50dW0nOiB0aGlzLm1vbWVudHVtLFxuICAgICAgICAgICAgJ2Vwc2lsb24nOiB0aGlzLmVwc2lsb24sXG4gICAgICAgICAgICAnY2VudGVyZWQnOiB0aGlzLmNlbnRlcmVkXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgIHN0YXRpYyBmcm9tQ29uZmlnKGNscywgY29uZmlnKSB7XG4gICAgICAgIHJldHVybiBuZXcgY2xzKGNvbmZpZ1snbGVhcm5pbmdSYXRlJ10sIGNvbmZpZ1snZGVjYXknXSwgY29uZmlnWydtb21lbnR1bSddLCBjb25maWdbJ2Vwc2lsb24nXSwgY29uZmlnWydjZW50ZXJlZCddKTtcbiAgICB9XG59XG4vKiogQG5vY29sbGFwc2UgKi9cblJNU1Byb3BPcHRpbWl6ZXIuY2xhc3NOYW1lID0gJ1JNU1Byb3AnOyAvLyBOb3RlOiBOYW1lIG1hdHRlcnMgZm9yIFB5dGhvbiBjb21wYXRpYmlsaXR5LlxucmVnaXN0ZXJDbGFzcyhSTVNQcm9wT3B0aW1pemVyKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJtc3Byb3Bfb3B0aW1pemVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBrZWVwLCB0aWR5IH0gZnJvbSAnLi4vZ2xvYmFscyc7XG5pbXBvcnQgeyBhZGQgfSBmcm9tICcuLi9vcHMvYWRkJztcbmltcG9ydCB7IG11bCB9IGZyb20gJy4uL29wcy9tdWwnO1xuaW1wb3J0IHsgc2NhbGFyIH0gZnJvbSAnLi4vb3BzL3NjYWxhcic7XG5pbXBvcnQgeyByZWdpc3RlckNsYXNzIH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbic7XG5pbXBvcnQgeyBPcHRpbWl6ZXIgfSBmcm9tICcuL29wdGltaXplcic7XG4vKiogQGRvY2xpbmsgT3B0aW1pemVyICovXG5leHBvcnQgY2xhc3MgU0dET3B0aW1pemVyIGV4dGVuZHMgT3B0aW1pemVyIHtcbiAgICBjb25zdHJ1Y3RvcihsZWFybmluZ1JhdGUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5sZWFybmluZ1JhdGUgPSBsZWFybmluZ1JhdGU7XG4gICAgICAgIHRoaXMuc2V0TGVhcm5pbmdSYXRlKGxlYXJuaW5nUmF0ZSk7XG4gICAgfVxuICAgIGFwcGx5R3JhZGllbnRzKHZhcmlhYmxlR3JhZGllbnRzKSB7XG4gICAgICAgIGNvbnN0IHZhck5hbWVzID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICAgICAgdmFyaWFibGVHcmFkaWVudHMubWFwKHYgPT4gdi5uYW1lKSA6XG4gICAgICAgICAgICBPYmplY3Qua2V5cyh2YXJpYWJsZUdyYWRpZW50cyk7XG4gICAgICAgIHZhck5hbWVzLmZvckVhY2goKG5hbWUsIGkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGdyYWRpZW50ID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JhZGllbnRzW2ldLnRlbnNvciA6XG4gICAgICAgICAgICAgICAgdmFyaWFibGVHcmFkaWVudHNbbmFtZV07XG4gICAgICAgICAgICBpZiAoZ3JhZGllbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gRU5HSU5FLnJlZ2lzdGVyZWRWYXJpYWJsZXNbbmFtZV07XG4gICAgICAgICAgICB0aWR5KCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IGFkZChtdWwodGhpcy5jLCBncmFkaWVudCksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB2YWx1ZS5hc3NpZ24obmV3VmFsdWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmluY3JlbWVudEl0ZXJhdGlvbnMoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbGVhcm5pbmcgcmF0ZSBvZiB0aGUgb3B0aW1pemVyLlxuICAgICAqL1xuICAgIHNldExlYXJuaW5nUmF0ZShsZWFybmluZ1JhdGUpIHtcbiAgICAgICAgdGhpcy5sZWFybmluZ1JhdGUgPSBsZWFybmluZ1JhdGU7XG4gICAgICAgIGlmICh0aGlzLmMgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5jLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmMgPSBrZWVwKHNjYWxhcigtbGVhcm5pbmdSYXRlKSk7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIHRoaXMuYy5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGFzeW5jIGdldFdlaWdodHMoKSB7XG4gICAgICAgIHJldHVybiBbYXdhaXQgdGhpcy5zYXZlSXRlcmF0aW9ucygpXTtcbiAgICB9XG4gICAgYXN5bmMgc2V0V2VpZ2h0cyh3ZWlnaHRWYWx1ZXMpIHtcbiAgICAgICAgd2VpZ2h0VmFsdWVzID0gYXdhaXQgdGhpcy5leHRyYWN0SXRlcmF0aW9ucyh3ZWlnaHRWYWx1ZXMpO1xuICAgICAgICBpZiAod2VpZ2h0VmFsdWVzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTR0Qgb3B0aW1pemVyIGRvZXMgbm90IGhhdmUgc2V0dGFibGUgd2VpZ2h0cy4nKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRDb25maWcoKSB7XG4gICAgICAgIHJldHVybiB7ICdsZWFybmluZ1JhdGUnOiB0aGlzLmxlYXJuaW5nUmF0ZSB9O1xuICAgIH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBzdGF0aWMgZnJvbUNvbmZpZyhjbHMsIGNvbmZpZykge1xuICAgICAgICByZXR1cm4gbmV3IGNscyhjb25maWdbJ2xlYXJuaW5nUmF0ZSddKTtcbiAgICB9XG59XG4vKiogQG5vY29sbGFwc2UgKi9cblNHRE9wdGltaXplci5jbGFzc05hbWUgPSAnU0dEJzsgLy8gTm90ZTogTmFtZSBtYXR0ZXJzIGZvciBQeXRob24gY29tcGF0aWJpbGl0eS5cbnJlZ2lzdGVyQ2xhc3MoU0dET3B0aW1pemVyKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNnZF9vcHRpbWl6ZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0ICcuLi9mbGFncyc7XG5pbXBvcnQgeyBlbnYgfSBmcm9tICcuLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBCcm93c2VySW5kZXhlZERCLCBCcm93c2VySW5kZXhlZERCTWFuYWdlciB9IGZyb20gJy4uL2lvL2luZGV4ZWRfZGInO1xuaW1wb3J0IHsgQnJvd3NlckxvY2FsU3RvcmFnZSwgQnJvd3NlckxvY2FsU3RvcmFnZU1hbmFnZXIgfSBmcm9tICcuLi9pby9sb2NhbF9zdG9yYWdlJztcbmltcG9ydCB7IE1vZGVsU3RvcmVNYW5hZ2VyUmVnaXN0cnkgfSBmcm9tICcuLi9pby9tb2RlbF9tYW5hZ2VtZW50JztcbmV4cG9ydCBjbGFzcyBQbGF0Zm9ybUJyb3dzZXIge1xuICAgIGZldGNoKHBhdGgsIGluaXQpIHtcbiAgICAgICAgcmV0dXJuIGZldGNoKHBhdGgsIGluaXQpO1xuICAgIH1cbiAgICBub3coKSB7XG4gICAgICAgIHJldHVybiBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICB9XG4gICAgZW5jb2RlKHRleHQsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmIChlbmNvZGluZyAhPT0gJ3V0Zi04JyAmJiBlbmNvZGluZyAhPT0gJ3V0ZjgnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJyb3dzZXIncyBlbmNvZGVyIG9ubHkgc3VwcG9ydHMgdXRmLTgsIGJ1dCBnb3QgJHtlbmNvZGluZ31gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy50ZXh0RW5jb2RlciA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnRleHRFbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dEVuY29kZXIuZW5jb2RlKHRleHQpO1xuICAgIH1cbiAgICBkZWNvZGUoYnl0ZXMsIGVuY29kaW5nKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGV4dERlY29kZXIoZW5jb2RpbmcpLmRlY29kZShieXRlcyk7XG4gICAgfVxufVxuaWYgKGVudigpLmdldCgnSVNfQlJPV1NFUicpKSB7XG4gICAgZW52KCkuc2V0UGxhdGZvcm0oJ2Jyb3dzZXInLCBuZXcgUGxhdGZvcm1Ccm93c2VyKCkpO1xuICAgIC8vIFJlZ2lzdGVyIExvY2FsU3RvcmFnZSBJT0hhbmRsZXJcbiAgICB0cnkge1xuICAgICAgICBNb2RlbFN0b3JlTWFuYWdlclJlZ2lzdHJ5LnJlZ2lzdGVyTWFuYWdlcihCcm93c2VyTG9jYWxTdG9yYWdlLlVSTF9TQ0hFTUUsIG5ldyBCcm93c2VyTG9jYWxTdG9yYWdlTWFuYWdlcigpKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgIH1cbiAgICAvLyBSZWdpc3RlciBJbmRleGVkREIgSU9IYW5kbGVyXG4gICAgdHJ5IHtcbiAgICAgICAgTW9kZWxTdG9yZU1hbmFnZXJSZWdpc3RyeS5yZWdpc3Rlck1hbmFnZXIoQnJvd3NlckluZGV4ZWREQi5VUkxfU0NIRU1FLCBuZXcgQnJvd3NlckluZGV4ZWREQk1hbmFnZXIoKSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wbGF0Zm9ybV9icm93c2VyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGVudiB9IGZyb20gJy4uL2Vudmlyb25tZW50Jztcbi8vIFdlIGFyZSB3cmFwcGluZyB0aGlzIHdpdGhpbiBhbiBvYmplY3Qgc28gaXQgY2FuIGJlIHN0dWJiZWQgYnkgSmFzbWluZS5cbmV4cG9ydCBjb25zdCBnZXROb2RlRmV0Y2ggPSB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXJlcXVpcmUtaW1wb3J0c1xuICAgIGltcG9ydEZldGNoOiAoKSA9PiByZXF1aXJlKCdub2RlLWZldGNoJylcbn07XG5sZXQgc3lzdGVtRmV0Y2g7XG4vLyBUaGVzZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzIGFyZSBmb3IgdGVzdGluZyBzbyB3ZSBkb24ndCBleHBvcnQgYSBtdXRhYmxlXG4vLyB2YXJpYWJsZS5cbmV4cG9ydCBmdW5jdGlvbiByZXNldFN5c3RlbUZldGNoKCkge1xuICAgIHN5c3RlbUZldGNoID0gbnVsbDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzZXRTeXN0ZW1GZXRjaChmZXRjaEZuKSB7XG4gICAgc3lzdGVtRmV0Y2ggPSBmZXRjaEZuO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFN5c3RlbUZldGNoKCkge1xuICAgIHJldHVybiBzeXN0ZW1GZXRjaDtcbn1cbmV4cG9ydCBjbGFzcyBQbGF0Zm9ybU5vZGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tcmVxdWlyZS1pbXBvcnRzXG4gICAgICAgIHRoaXMudXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbiAgICAgICAgLy8gQWNjb3JkaW5nIHRvIHRoZSBzcGVjLCB0aGUgYnVpbHQtaW4gZW5jb2RlciBjYW4gZG8gb25seSBVVEYtOCBlbmNvZGluZy5cbiAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1RleHRFbmNvZGVyL1RleHRFbmNvZGVyXG4gICAgICAgIHRoaXMudGV4dEVuY29kZXIgPSBuZXcgdGhpcy51dGlsLlRleHRFbmNvZGVyKCk7XG4gICAgfVxuICAgIGZldGNoKHBhdGgsIHJlcXVlc3RJbml0cykge1xuICAgICAgICBpZiAoZW52KCkuZ2xvYmFsLmZldGNoICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBlbnYoKS5nbG9iYWwuZmV0Y2gocGF0aCwgcmVxdWVzdEluaXRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3lzdGVtRmV0Y2ggPT0gbnVsbCkge1xuICAgICAgICAgICAgc3lzdGVtRmV0Y2ggPSBnZXROb2RlRmV0Y2guaW1wb3J0RmV0Y2goKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3lzdGVtRmV0Y2gocGF0aCwgcmVxdWVzdEluaXRzKTtcbiAgICB9XG4gICAgbm93KCkge1xuICAgICAgICBjb25zdCB0aW1lID0gcHJvY2Vzcy5ocnRpbWUoKTtcbiAgICAgICAgcmV0dXJuIHRpbWVbMF0gKiAxMDAwICsgdGltZVsxXSAvIDEwMDAwMDA7XG4gICAgfVxuICAgIGVuY29kZSh0ZXh0LCBlbmNvZGluZykge1xuICAgICAgICBpZiAoZW5jb2RpbmcgIT09ICd1dGYtOCcgJiYgZW5jb2RpbmcgIT09ICd1dGY4Jykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb2RlIGJ1aWx0LWluIGVuY29kZXIgb25seSBzdXBwb3J0cyB1dGYtOCwgYnV0IGdvdCAke2VuY29kaW5nfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnRleHRFbmNvZGVyLmVuY29kZSh0ZXh0KTtcbiAgICB9XG4gICAgZGVjb2RlKGJ5dGVzLCBlbmNvZGluZykge1xuICAgICAgICBpZiAoYnl0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyB0aGlzLnV0aWwuVGV4dERlY29kZXIoZW5jb2RpbmcpLmRlY29kZShieXRlcyk7XG4gICAgfVxufVxuaWYgKGVudigpLmdldCgnSVNfTk9ERScpKSB7XG4gICAgZW52KCkuc2V0UGxhdGZvcm0oJ25vZGUnLCBuZXcgUGxhdGZvcm1Ob2RlKCkpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGxhdGZvcm1fbm9kZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBlbnYgfSBmcm9tICcuL2Vudmlyb25tZW50JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi91dGlsJztcbmV4cG9ydCBjbGFzcyBQcm9maWxlciB7XG4gICAgY29uc3RydWN0b3IoYmFja2VuZFRpbWVyLCBsb2dnZXIpIHtcbiAgICAgICAgdGhpcy5iYWNrZW5kVGltZXIgPSBiYWNrZW5kVGltZXI7XG4gICAgICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyO1xuICAgICAgICBpZiAobG9nZ2VyID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyID0gbmV3IExvZ2dlcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByb2ZpbGVLZXJuZWwoa2VybmVsTmFtZSwgaW5wdXRzLCBmKSB7XG4gICAgICAgIGxldCBvdXRwdXRzO1xuICAgICAgICBjb25zdCBob2xkUmVzdWx0V3JhcHBlckZuID0gKCkgPT4ge1xuICAgICAgICAgICAgb3V0cHV0cyA9IGYoKTtcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHRpbWVyO1xuICAgICAgICBjb25zdCBzdGFydCA9IHV0aWwubm93KCk7XG4gICAgICAgIGlmICh0aGlzLmJhY2tlbmRUaW1lci50aW1lckF2YWlsYWJsZSgpKSB7XG4gICAgICAgICAgICB0aW1lciA9IHRoaXMuYmFja2VuZFRpbWVyLnRpbWUoaG9sZFJlc3VsdFdyYXBwZXJGbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBob2xkUmVzdWx0V3JhcHBlckZuKCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG91dHB1dCBvZiBvdXRwdXRzKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0LmRhdGFTeW5jKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aW1lciA9IFByb21pc2UucmVzb2x2ZSh7IGtlcm5lbE1zOiB1dGlsLm5vdygpIC0gc3RhcnQgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVudigpLmdldEJvb2woJ0NIRUNLX0NPTVBVVEFUSU9OX0ZPUl9FUlJPUlMnKSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRwdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0ID0gb3V0cHV0c1tpXTtcbiAgICAgICAgICAgICAgICAvLyBEYW5nbGluZyBwcm9taXNlIGhlcmUgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIHByb3BhZ2F0ZSB1cFxuICAgICAgICAgICAgICAgIC8vIGFzeW5jaHJvbmljaXR5LlxuICAgICAgICAgICAgICAgIG91dHB1dC5kYXRhKCkudGhlbih0ZW5zb3JWYWxzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tDb21wdXRhdGlvbkZvckVycm9ycyh0ZW5zb3JWYWxzLCBvdXRwdXQuZHR5cGUsIGtlcm5lbE5hbWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGtlcm5lbFByb2ZpbGUgPSB7XG4gICAgICAgICAgICBrZXJuZWxOYW1lLFxuICAgICAgICAgICAgb3V0cHV0cyxcbiAgICAgICAgICAgIGlucHV0cyxcbiAgICAgICAgICAgIHRpbWVNczogdGltZXIudGhlbih0aW1pbmcgPT4gdGltaW5nLmtlcm5lbE1zKSxcbiAgICAgICAgICAgIGV4dHJhSW5mbzogdGltZXIudGhlbih0aW1pbmcgPT4gdGltaW5nLmdldEV4dHJhUHJvZmlsZUluZm8gIT0gbnVsbCA/XG4gICAgICAgICAgICAgICAgdGltaW5nLmdldEV4dHJhUHJvZmlsZUluZm8oKSA6XG4gICAgICAgICAgICAgICAgJycpXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBrZXJuZWxQcm9maWxlO1xuICAgIH1cbiAgICBsb2dLZXJuZWxQcm9maWxlKGtlcm5lbFByb2ZpbGUpIHtcbiAgICAgICAgY29uc3QgeyBrZXJuZWxOYW1lLCBvdXRwdXRzLCB0aW1lTXMsIGlucHV0cywgZXh0cmFJbmZvIH0gPSBrZXJuZWxQcm9maWxlO1xuICAgICAgICBvdXRwdXRzLmZvckVhY2gocmVzdWx0ID0+IHtcbiAgICAgICAgICAgIFByb21pc2UuYWxsKFtyZXN1bHQuZGF0YSgpLCB0aW1lTXMsIGV4dHJhSW5mb10pLnRoZW4odmFsdWVDb250YWluZXIgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZ0tlcm5lbFByb2ZpbGUoa2VybmVsTmFtZSwgcmVzdWx0LCB2YWx1ZUNvbnRhaW5lclswXSwgdmFsdWVDb250YWluZXJbMV0sIGlucHV0cywgdmFsdWVDb250YWluZXJbMl0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0NvbXB1dGF0aW9uRm9yRXJyb3JzKHZhbHMsIGR0eXBlLCBrZXJuZWxOYW1lKSB7XG4gICAgaWYgKGR0eXBlICE9PSAnZmxvYXQzMicpIHtcbiAgICAgICAgLy8gT25seSBmbG9hdGluZyBwb2ludCBjb21wdXRhdGlvbnMgd2lsbCBnZW5lcmF0ZSBOYU4gdmFsdWVzXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IG51bSA9IHZhbHNbaV07XG4gICAgICAgIGlmIChpc05hTihudW0pIHx8ICFpc0Zpbml0ZShudW0pKSB7XG4gICAgICAgICAgICAvLyBUaHJvd2luZyBjdXN0b20gZXhjZXB0aW9uIHNvIGJlaGF2aW9yIGlzIHRlc3RhYmxlLlxuICAgICAgICAgICAgY29uc29sZS53YXJuKGBGb3VuZCAke251bX0gaW4gdGhlIHJlc3VsdCBvZiAnJHtrZXJuZWxOYW1lfSdgKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmV4cG9ydCBjbGFzcyBMb2dnZXIge1xuICAgIGxvZ0tlcm5lbFByb2ZpbGUobmFtZSwgcmVzdWx0LCB2YWxzLCB0aW1lTXMsIGlucHV0cywgZXh0cmFJbmZvKSB7XG4gICAgICAgIGNvbnN0IHRpbWUgPSB0eXBlb2YgdGltZU1zID09PSAnbnVtYmVyJyA/IHV0aWwucmlnaHRQYWQoYCR7dGltZU1zfW1zYCwgOSkgOlxuICAgICAgICAgICAgdGltZU1zWydlcnJvciddO1xuICAgICAgICBjb25zdCBwYWRkZWROYW1lID0gdXRpbC5yaWdodFBhZChuYW1lLCAyNSk7XG4gICAgICAgIGNvbnN0IHJhbmsgPSByZXN1bHQucmFuaztcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHJlc3VsdC5zaXplO1xuICAgICAgICBjb25zdCBzaGFwZSA9IHV0aWwucmlnaHRQYWQocmVzdWx0LnNoYXBlLnRvU3RyaW5nKCksIDE0KTtcbiAgICAgICAgbGV0IGlucHV0U2hhcGVzRGVzY3JpcHRpb24gPSAnJztcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIGluIGlucHV0cykge1xuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBpbnB1dHNbbmFtZV07XG4gICAgICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBpbnB1dCBtaWdodCBiZSBhIG5vbi10ZW5zb3IgKGUuZyBIVE1MSW1hZ2VFbGVtZW50KSwgaW4gd2hpY2ggY2FzZVxuICAgICAgICAgICAgICAgIC8vIHdlIGNsYWltIHRoZSBvdXRwdXQgc2hhcGUgYXMgaW5wdXQgc2hhcGUuXG4gICAgICAgICAgICAgICAgY29uc3QgaW5wdXRTaGFwZSA9IGlucHV0LnNoYXBlIHx8IHJlc3VsdC5zaGFwZTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnB1dFJhbmsgPSBpbnB1dFNoYXBlLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpbnB1dFNoYXBlc0Rlc2NyaXB0aW9uICs9XG4gICAgICAgICAgICAgICAgICAgIGAke25hbWV9OiAke2lucHV0UmFua31EICR7aW5wdXRSYW5rID4gMCA/IGlucHV0U2hhcGUgOiAnJ30gYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgJWMke3BhZGRlZE5hbWV9XFx0JWMke3RpbWV9XFx0JWMke3Jhbmt9RCAke3NoYXBlfVxcdCVjJHtzaXplfVxcdCVjJHtpbnB1dFNoYXBlc0Rlc2NyaXB0aW9ufVxcdCVjJHtleHRyYUluZm99YCwgJ2ZvbnQtd2VpZ2h0OmJvbGQnLCAnY29sb3I6cmVkJywgJ2NvbG9yOmJsdWUnLCAnY29sb3I6IG9yYW5nZScsICdjb2xvcjogZ3JlZW4nLCAnY29sb3I6IHN0ZWVsYmx1ZScpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXByb2ZpbGVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4vdXRpbCc7XG4vKipcbiAqIFNlcmlhbGl6YWJsZSBkZWZpbmVzIHRoZSBzZXJpYWxpemF0aW9uIGNvbnRyYWN0LlxuICpcbiAqIFRGSlMgcmVxdWlyZXMgc2VyaWFsaXphYmxlIGNsYXNzZXMgdG8gcmV0dXJuIHRoZWlyIGNsYXNzTmFtZSB3aGVuIGFza2VkXG4gKiB0byBhdm9pZCBpc3N1ZXMgd2l0aCBtaW5pZmljYXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXJpYWxpemFibGUge1xuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgY2xhc3MgbmFtZSBmb3IgdGhpcyBjbGFzcyB0byB1c2UgaW4gc2VyaWFsaXphdGlvbiBjb250ZXh0cy5cbiAgICAgKlxuICAgICAqIEdlbmVyYWxseSBzcGVha2luZyB0aGlzIHdpbGwgYmUgdGhlIHNhbWUgdGhpbmcgdGhhdCBjb25zdHJ1Y3Rvci5uYW1lXG4gICAgICogd291bGQgaGF2ZSByZXR1cm5lZC4gIEhvd2V2ZXIsIHRoZSBjbGFzcyBuYW1lIG5lZWRzIHRvIGJlIHJvYnVzdFxuICAgICAqIGFnYWluc3QgbWluaWZpY2F0aW9uIGZvciBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiB0byB3b3JrIHByb3Blcmx5LlxuICAgICAqXG4gICAgICogVGhlcmUncyBhbHNvIHBsYWNlcyBzdWNoIGFzIGluaXRpYWxpemVycy5WYXJpYW5jZVNjYWxpbmcsIHdoZXJlXG4gICAgICogaW1wbGVtZW50YXRpb24gZGV0YWlscyBiZXR3ZWVuIGRpZmZlcmVudCBsYW5ndWFnZXMgbGVkIHRvIGRpZmZlcmVudFxuICAgICAqIGNsYXNzIGhpZXJhcmNoaWVzIGFuZCBhIG5vbi1sZWFmIG5vZGUgaXMgdXNlZCBmb3Igc2VyaWFsaXphdGlvbiBwdXJwb3Nlcy5cbiAgICAgKi9cbiAgICBnZXRDbGFzc05hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yXG4gICAgICAgICAgICAuY2xhc3NOYW1lO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFQgZnJvbSBhIENvbmZpZ0RpY3QuXG4gICAgICpcbiAgICAgKiBUaGlzIHdvcmtzIGZvciBtb3N0IGRlc2NlbmRhbnRzIG9mIHNlcmlhbGl6YWJsZS4gIEEgZmV3IG5lZWQgdG9cbiAgICAgKiBwcm92aWRlIHNwZWNpYWwgaGFuZGxpbmcuXG4gICAgICogQHBhcmFtIGNscyBBIENvbnN0cnVjdG9yIGZvciB0aGUgY2xhc3MgdG8gaW5zdGFudGlhdGUuXG4gICAgICogQHBhcmFtIGNvbmZpZyBUaGUgQ29uZmlndXJhdGlvbiBmb3IgdGhlIG9iamVjdC5cbiAgICAgKi9cbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBzdGF0aWMgZnJvbUNvbmZpZyhjbHMsIGNvbmZpZykge1xuICAgICAgICByZXR1cm4gbmV3IGNscyhjb25maWcpO1xuICAgIH1cbn1cbi8qKlxuICogTWFwcyBzdHJpbmcga2V5cyB0byBjbGFzcyBjb25zdHJ1Y3RvcnMuXG4gKlxuICogVXNlZCBkdXJpbmcgKGRlKXNlcmlhbGl6YXRpb24gZnJvbSB0aGUgY3Jvc3MtbGFuZ3VhZ2UgSlNPTiBmb3JtYXQsIHdoaWNoXG4gKiByZXF1aXJlcyB0aGUgY2xhc3MgbmFtZSBpbiB0aGUgc2VyaWFsaXphdGlvbiBmb3JtYXQgbWF0Y2hlcyB0aGUgY2xhc3NcbiAqIG5hbWVzIGFzIHVzZWQgaW4gUHl0aG9uLCBzaG91bGQgaXQgZXhpc3QuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXJpYWxpemF0aW9uTWFwIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5jbGFzc05hbWVNYXAgPSB7fTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBtYXAuXG4gICAgICovXG4gICAgc3RhdGljIGdldE1hcCgpIHtcbiAgICAgICAgaWYgKFNlcmlhbGl6YXRpb25NYXAuaW5zdGFuY2UgPT0gbnVsbCkge1xuICAgICAgICAgICAgU2VyaWFsaXphdGlvbk1hcC5pbnN0YW5jZSA9IG5ldyBTZXJpYWxpemF0aW9uTWFwKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFNlcmlhbGl6YXRpb25NYXAuaW5zdGFuY2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVycyB0aGUgY2xhc3MgYXMgc2VyaWFsaXphYmxlLlxuICAgICAqL1xuICAgIHN0YXRpYyByZWdpc3RlcihjbHMpIHtcbiAgICAgICAgU2VyaWFsaXphdGlvbk1hcC5nZXRNYXAoKS5jbGFzc05hbWVNYXBbY2xzLmNsYXNzTmFtZV0gPVxuICAgICAgICAgICAgW2NscywgY2xzLmZyb21Db25maWddO1xuICAgIH1cbn1cbi8qKlxuICogUmVnaXN0ZXIgYSBjbGFzcyB3aXRoIHRoZSBzZXJpYWxpemF0aW9uIG1hcCBvZiBUZW5zb3JGbG93LmpzLlxuICpcbiAqIFRoaXMgaXMgb2Z0ZW4gdXNlZCBmb3IgcmVnaXN0ZXJpbmcgY3VzdG9tIExheWVycywgc28gdGhleSBjYW4gYmVcbiAqIHNlcmlhbGl6ZWQgYW5kIGRlc2VyaWFsaXplZC5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYGpzXG4gKiBjbGFzcyBNeUN1c3RvbUxheWVyIGV4dGVuZHMgdGYubGF5ZXJzLkxheWVyIHtcbiAqICAgc3RhdGljIGNsYXNzTmFtZSA9ICdNeUN1c3RvbUxheWVyJztcbiAqXG4gKiAgIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICogICAgIHN1cGVyKGNvbmZpZyk7XG4gKiAgIH1cbiAqIH1cbiAqIHRmLnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhNeUN1c3RvbUxheWVyKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBjbHMgVGhlIGNsYXNzIHRvIGJlIHJlZ2lzdGVyZWQuIEl0IG11c3QgaGF2ZSBhIHB1YmxpYyBzdGF0aWMgbWVtYmVyXG4gKiAgIGNhbGxlZCBgY2xhc3NOYW1lYCBkZWZpbmVkIGFuZCB0aGUgdmFsdWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ01vZGVscycsIHN1YmhlYWRpbmc6ICdTZXJpYWxpemF0aW9uJywgaWdub3JlQ0k6IHRydWV9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckNsYXNzKGNscykge1xuICAgIGFzc2VydChjbHMuY2xhc3NOYW1lICE9IG51bGwsICgpID0+IGBDbGFzcyBiZWluZyByZWdpc3RlcmVkIGRvZXMgbm90IGhhdmUgdGhlIHN0YXRpYyBjbGFzc05hbWUgYCArXG4gICAgICAgIGBwcm9wZXJ0eSBkZWZpbmVkLmApO1xuICAgIGFzc2VydCh0eXBlb2YgY2xzLmNsYXNzTmFtZSA9PT0gJ3N0cmluZycsICgpID0+IGBjbGFzc05hbWUgaXMgcmVxdWlyZWQgdG8gYmUgYSBzdHJpbmcsIGJ1dCBnb3QgdHlwZSBgICtcbiAgICAgICAgdHlwZW9mIGNscy5jbGFzc05hbWUpO1xuICAgIGFzc2VydChjbHMuY2xhc3NOYW1lLmxlbmd0aCA+IDAsICgpID0+IGBDbGFzcyBiZWluZyByZWdpc3RlcmVkIGhhcyBhbiBlbXB0eS1zdHJpbmcgYXMgaXRzIGNsYXNzTmFtZSwgYCArXG4gICAgICAgIGB3aGljaCBpcyBkaXNhbGxvd2VkLmApO1xuICAgIFNlcmlhbGl6YXRpb25NYXAucmVnaXN0ZXIoY2xzKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlcmlhbGl6YXRpb24uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuL3V0aWwnO1xuLyoqXG4gKiBDb21wdXRlcyBhIGxpc3Qgb2YgVGFwZU5vZGVzIHRoYXQgY29ubmVjdCB4IHRvIHksIGZpbHRlcmluZyBldmVyeXRoaW5nIGVsc2VcbiAqIG91dCBhbmQgcHJlc2VydmluZyB0aGUgb3JkZXIgb2YgdGhlIG9yaWdpbmFsIHRhcGUgZWxlbWVudHMuXG4gKlxuICogQHBhcmFtIHRhcGUgVGhlIHRhcGUgZWxlbWVudHMgdG8gZmlsdGVyLlxuICogQHBhcmFtIHhzIFRoZSBpbnB1dCBUZW5zb3JzLlxuICogQHBhcmFtIHkgVGhlIG91dHB1dCBUZW5zb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWx0ZXJlZE5vZGVzWFRvWSh0YXBlLCB4cywgeSkge1xuICAgIC8vIEZvcndhcmQgcGFzcyB0byBjb21wdXRlIGFsbCB0aGUgbm9kZXMgYW5kIFRlbnNvcnMgdGhhdCBhcmUgdHJhbnNpdGl2ZWx5IGFcbiAgICAvLyBmdW5jdGlvbiBvZiB4LlxuICAgIGNvbnN0IHRlbnNvcnNGcm9tWCA9IHt9O1xuICAgIGNvbnN0IG5vZGVzRnJvbVggPSB7fTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRlbnNvcnNGcm9tWFt4c1tpXS5pZF0gPSB0cnVlO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRhcGVbaV07XG4gICAgICAgIGNvbnN0IG5vZGVJbnB1dHMgPSBub2RlLmlucHV0cztcbiAgICAgICAgZm9yIChjb25zdCBpbnB1dE5hbWUgaW4gbm9kZUlucHV0cykge1xuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBub2RlSW5wdXRzW2lucHV0TmFtZV07XG4gICAgICAgICAgICBsZXQgYW55SW5wdXRGcm9tWCA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB4cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGlmICh0ZW5zb3JzRnJvbVhbaW5wdXQuaWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUub3V0cHV0cy5mb3JFYWNoKG91dHB1dCA9PiB0ZW5zb3JzRnJvbVhbb3V0cHV0LmlkXSA9IHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBhbnlJbnB1dEZyb21YID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbm9kZXNGcm9tWFtub2RlLmlkXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhbnlJbnB1dEZyb21YKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQmFja3dhcmQgcGFzcyB0byBmaW5kIGFsbCBvZiB0aGUgbm9kZXMgYW5kIFRlbnNvcnMgdGhhdCBsZWFkIHRvIHkuXG4gICAgY29uc3QgdGVuc29yc0xlYWRUb1kgPSB7fTtcbiAgICB0ZW5zb3JzTGVhZFRvWVt5LmlkXSA9IHRydWU7XG4gICAgY29uc3Qgbm9kZXNUb1kgPSB7fTtcbiAgICBmb3IgKGxldCBpID0gdGFwZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBjb25zdCBub2RlID0gdGFwZVtpXTtcbiAgICAgICAgY29uc3Qgbm9kZUlucHV0cyA9IG5vZGUuaW5wdXRzO1xuICAgICAgICAvLyBJZiBhbnkgb2YgdGhlIG91dHB1dHMgbGVhZCB0byB5LCBtYXJrIGFsbCBvZiB0aGUgaW5wdXRzIGFzIGxlYWRpbmcgdG8geS5cbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBub2RlLm91dHB1dHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmICh0ZW5zb3JzTGVhZFRvWVtub2RlLm91dHB1dHNbal0uaWRdKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpbnB1dE5hbWUgaW4gbm9kZUlucHV0cykge1xuICAgICAgICAgICAgICAgICAgICB0ZW5zb3JzTGVhZFRvWVtub2RlSW5wdXRzW2lucHV0TmFtZV0uaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbm9kZXNUb1lbbm9kZS5pZF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBSZXR1cm4gdGhlIHBhdGhzIHRoYXQgY29tZSBmcm9tIHggYW5kIGxlYWQgdG8geS5cbiAgICBjb25zdCBmaWx0ZXJlZFRhcGUgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRhcGVbaV07XG4gICAgICAgIGlmIChub2Rlc0Zyb21YW25vZGUuaWRdICYmIG5vZGVzVG9ZW25vZGUuaWRdKSB7XG4gICAgICAgICAgICAvLyBQcnVuZSB0aGUgaW5wdXRzIGZyb20gdGhlIG5vZGUgdGhhdCBhcmVuJ3QgYSBmdW5jdGlvbiBvZiB4LlxuICAgICAgICAgICAgY29uc3QgcHJ1bmVkSW5wdXRzID0ge307XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlucHV0TmFtZSBpbiBub2RlLmlucHV0cykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVJbnB1dCA9IG5vZGUuaW5wdXRzW2lucHV0TmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKHRlbnNvcnNGcm9tWFtub2RlSW5wdXQuaWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIHBydW5lZElucHV0c1tpbnB1dE5hbWVdID0gbm9kZUlucHV0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENvcHkgdGhlIG5vZGUgYW5kIG92ZXJ3cml0ZSBpbnB1dHNBbmRBcmdzIHRvIHRoZSBwcnVuZWQgdmVyc2lvbi5cbiAgICAgICAgICAgIGNvbnN0IHBydW5lZE5vZGUgPSBPYmplY3QuYXNzaWduKHt9LCBub2RlKTtcbiAgICAgICAgICAgIHBydW5lZE5vZGUuaW5wdXRzID0gcHJ1bmVkSW5wdXRzO1xuICAgICAgICAgICAgcHJ1bmVkTm9kZS5vdXRwdXRzID0gbm9kZS5vdXRwdXRzO1xuICAgICAgICAgICAgZmlsdGVyZWRUYXBlLnB1c2gocHJ1bmVkTm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZpbHRlcmVkVGFwZTtcbn1cbi8qKlxuICogQmFja3Byb3BhZ2F0ZSBncmFkaWVudHMgdGhyb3VnaCB0aGUgZmlsdGVyZWQgVGFwZU5vZGVzLlxuICpcbiAqIEBwYXJhbSB0ZW5zb3JBY2N1bXVsYXRlZEdyYWRpZW50TWFwIEEgbWFwIG9mIFRlbnNvciB0byBpdHMgZ3JhZGllbnQuIFRoaXMgbWFwXG4gKiBpcyBtdXRhdGVkIGJ5IHRoaXMgbWV0aG9kLlxuICogQHBhcmFtIGZpbHRlcmVkVGFwZSBUaGUgZmlsdGVyZWQgVGFwZU5vZGVzIHRvIGJhY2twcm9wIHRocm91Z2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiYWNrcHJvcGFnYXRlR3JhZGllbnRzKHRlbnNvckFjY3VtdWxhdGVkR3JhZGllbnRNYXAsIGZpbHRlcmVkVGFwZSwgdGlkeSwgYWRkKSB7XG4gICAgLy8gV2FsayB0aGUgdGFwZSBiYWNrd2FyZCBhbmQga2VlcCBhIG1hcCBvZiBUZW5zb3IgdG8gaXRzIGdyYWRpZW50LlxuICAgIGZvciAobGV0IGkgPSBmaWx0ZXJlZFRhcGUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IGZpbHRlcmVkVGFwZVtpXTtcbiAgICAgICAgY29uc3QgZHlzID0gW107XG4gICAgICAgIG5vZGUub3V0cHV0cy5mb3JFYWNoKG8gPT4ge1xuICAgICAgICAgICAgY29uc3QgZ3JhZFRlbnNvciA9IHRlbnNvckFjY3VtdWxhdGVkR3JhZGllbnRNYXBbby5pZF07XG4gICAgICAgICAgICBpZiAoZ3JhZFRlbnNvciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZHlzLnB1c2goZ3JhZFRlbnNvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIHBhcnRpY3VsYXIgb3V0cHV0IGlzIG5vdCBpbiB0aGUgYmFjay1wcm9wYWdhdGlvbiBzdWJncmFwaCwgc28gaXRcbiAgICAgICAgICAgICAgICAvLyBkb2VzIG5vdCBhZmZlY3QgdGhlIGZpbmFsIG91dHB1dCwgdGh1cyB3ZSBwdXQgbnVsbCBmb3IgaXRzIGR5LlxuICAgICAgICAgICAgICAgIGR5cy5wdXNoKG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKG5vZGUuZ3JhZGllbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29tcHV0ZSBncmFkaWVudDogZ3JhZGllbnQgZnVuY3Rpb24gbm90IGZvdW5kIGAgK1xuICAgICAgICAgICAgICAgIGBmb3IgJHtub2RlLmtlcm5lbE5hbWV9LmApO1xuICAgICAgICB9XG4gICAgICAgIC8vIEJhY2twcm9wIGR5IHRocm91Z2ggdGhpcyBub2RlIGFuZCBhY2N1bXVsYXRlIGdyYWRpZW50cyBvdmVyIHRoZSBpbnB1dHMuXG4gICAgICAgIGNvbnN0IGlucHV0R3JhZGllbnRzID0gbm9kZS5ncmFkaWVudChkeXMpO1xuICAgICAgICBmb3IgKGNvbnN0IGlucHV0TmFtZSBpbiBub2RlLmlucHV0cykge1xuICAgICAgICAgICAgaWYgKCEoaW5wdXROYW1lIGluIGlucHV0R3JhZGllbnRzKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGJhY2twcm9wIHRocm91Z2ggaW5wdXQgJHtpbnB1dE5hbWV9LiBgICtcbiAgICAgICAgICAgICAgICAgICAgYEF2YWlsYWJsZSBncmFkaWVudHMgZm91bmQ6ICR7T2JqZWN0LmtleXMoaW5wdXRHcmFkaWVudHMpfS5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENhbGwgdGhlIGdyYWRpZW50IGZ1bmN0aW9uLlxuICAgICAgICAgICAgY29uc3QgZHggPSB0aWR5KCgpID0+IGlucHV0R3JhZGllbnRzW2lucHV0TmFtZV0oKSk7XG4gICAgICAgICAgICBpZiAoZHguZHR5cGUgIT09ICdmbG9hdDMyJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgaW4gZ3JhZGllbnQgZm9yIG9wICR7bm9kZS5rZXJuZWxOYW1lfS4gVGhlIGdyYWRpZW50IG9mIGlucHV0IGAgK1xuICAgICAgICAgICAgICAgICAgICBgJHtpbnB1dE5hbWV9IG11c3QgaGF2ZSAnZmxvYXQzMicgZHR5cGUsIGJ1dCBoYXMgJyR7ZHguZHR5cGV9J2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeCA9IG5vZGUuaW5wdXRzW2lucHV0TmFtZV07XG4gICAgICAgICAgICBpZiAoIXV0aWwuYXJyYXlzRXF1YWwoZHguc2hhcGUsIHguc2hhcGUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBpbiBncmFkaWVudCBmb3Igb3AgJHtub2RlLmtlcm5lbE5hbWV9LiBUaGUgZ3JhZGllbnQgb2YgaW5wdXQgYCArXG4gICAgICAgICAgICAgICAgICAgIGAnJHtpbnB1dE5hbWV9JyBoYXMgc2hhcGUgJyR7ZHguc2hhcGV9Jywgd2hpY2ggZG9lcyBub3QgbWF0Y2ggYCArXG4gICAgICAgICAgICAgICAgICAgIGB0aGUgc2hhcGUgb2YgdGhlIGlucHV0ICcke3guc2hhcGV9J2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRlbnNvckFjY3VtdWxhdGVkR3JhZGllbnRNYXBbeC5pZF0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRlbnNvckFjY3VtdWxhdGVkR3JhZGllbnRNYXBbeC5pZF0gPSBkeDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1ckdyYWRpZW50ID0gdGVuc29yQWNjdW11bGF0ZWRHcmFkaWVudE1hcFt4LmlkXTtcbiAgICAgICAgICAgICAgICB0ZW5zb3JBY2N1bXVsYXRlZEdyYWRpZW50TWFwW3guaWRdID0gYWRkKGN1ckdyYWRpZW50LCBkeCk7XG4gICAgICAgICAgICAgICAgY3VyR3JhZGllbnQuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGFwZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBnZXRHbG9iYWwgfSBmcm9tICcuL2dsb2JhbF91dGlsJztcbmltcG9ydCB7IHRlbnNvclRvU3RyaW5nIH0gZnJvbSAnLi90ZW5zb3JfZm9ybWF0JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi91dGlsJztcbmltcG9ydCB7IGNvbXB1dGVTdHJpZGVzLCB0b05lc3RlZEFycmF5IH0gZnJvbSAnLi91dGlsJztcbi8qKlxuICogQSBtdXRhYmxlIG9iamVjdCwgc2ltaWxhciB0byBgdGYuVGVuc29yYCwgdGhhdCBhbGxvd3MgdXNlcnMgdG8gc2V0IHZhbHVlc1xuICogYXQgbG9jYXRpb25zIGJlZm9yZSBjb252ZXJ0aW5nIHRvIGFuIGltbXV0YWJsZSBgdGYuVGVuc29yYC5cbiAqXG4gKiBTZWUgYHRmLmJ1ZmZlcmAgZm9yIGNyZWF0aW5nIGEgdGVuc29yIGJ1ZmZlci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAqL1xuZXhwb3J0IGNsYXNzIFRlbnNvckJ1ZmZlciB7XG4gICAgY29uc3RydWN0b3Ioc2hhcGUsIGR0eXBlLCB2YWx1ZXMpIHtcbiAgICAgICAgdGhpcy5kdHlwZSA9IGR0eXBlO1xuICAgICAgICB0aGlzLnNoYXBlID0gc2hhcGUuc2xpY2UoKTtcbiAgICAgICAgdGhpcy5zaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHNoYXBlKTtcbiAgICAgICAgaWYgKHZhbHVlcyAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gdmFsdWVzLmxlbmd0aDtcbiAgICAgICAgICAgIHV0aWwuYXNzZXJ0KG4gPT09IHRoaXMuc2l6ZSwgKCkgPT4gYExlbmd0aCBvZiB2YWx1ZXMgJyR7bn0nIGRvZXMgbm90IG1hdGNoIHRoZSBzaXplIGAgK1xuICAgICAgICAgICAgICAgIGBpbmZlcnJlZCBieSB0aGUgc2hhcGUgJyR7dGhpcy5zaXplfScuYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBjb21wbGV4NjQgZHR5cGUgVGVuc29yQnVmZmVycyBhcmUgbm90IHN1cHBvcnRlZC4gUGxlYXNlIGNyZWF0ZSBgICtcbiAgICAgICAgICAgICAgICBgYSBUZW5zb3JCdWZmZXIgZm9yIHRoZSByZWFsIGFuZCBpbWFnaW5hcnkgcGFydHMgc2VwYXJhdGVseSBhbmQgYCArXG4gICAgICAgICAgICAgICAgYGNhbGwgdGYuY29tcGxleChyZWFsLCBpbWFnKS5gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbHVlcyA9IHZhbHVlcyB8fCB1dGlsLmdldEFycmF5RnJvbURUeXBlKGR0eXBlLCB0aGlzLnNpemUpO1xuICAgICAgICB0aGlzLnN0cmlkZXMgPSBjb21wdXRlU3RyaWRlcyhzaGFwZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgYSB2YWx1ZSBpbiB0aGUgYnVmZmVyIGF0IGEgZ2l2ZW4gbG9jYXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcGFyYW0gbG9jcyAgVGhlIGxvY2F0aW9uIGluZGljZXMuXG4gICAgICpcbiAgICAgKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gICAgICovXG4gICAgc2V0KHZhbHVlLCAuLi5sb2NzKSB7XG4gICAgICAgIGlmIChsb2NzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgbG9jcyA9IFswXTtcbiAgICAgICAgfVxuICAgICAgICB1dGlsLmFzc2VydChsb2NzLmxlbmd0aCA9PT0gdGhpcy5yYW5rLCAoKSA9PiBgVGhlIG51bWJlciBvZiBwcm92aWRlZCBjb29yZGluYXRlcyAoJHtsb2NzLmxlbmd0aH0pIG11c3QgYCArXG4gICAgICAgICAgICBgbWF0Y2ggdGhlIHJhbmsgKCR7dGhpcy5yYW5rfSlgKTtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmxvY1RvSW5kZXgobG9jcyk7XG4gICAgICAgIHRoaXMudmFsdWVzW2luZGV4XSA9IHZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBpbiB0aGUgYnVmZmVyIGF0IHRoZSBwcm92aWRlZCBsb2NhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsb2NzIFRoZSBsb2NhdGlvbiBpbmRpY2VzLlxuICAgICAqXG4gICAgICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICAgICAqL1xuICAgIGdldCguLi5sb2NzKSB7XG4gICAgICAgIGlmIChsb2NzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgbG9jcyA9IFswXTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgbG9jIG9mIGxvY3MpIHtcbiAgICAgICAgICAgIGlmIChsb2MgPCAwIHx8IGxvYyA+PSB0aGlzLnNoYXBlW2ldKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXNnID0gYFJlcXVlc3RlZCBvdXQgb2YgcmFuZ2UgZWxlbWVudCBhdCAke2xvY3N9LiBgICtcbiAgICAgICAgICAgICAgICAgICAgYCAgQnVmZmVyIHNoYXBlPSR7dGhpcy5zaGFwZX1gO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIGxldCBpbmRleCA9IGxvY3NbbG9jcy5sZW5ndGggLSAxXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NzLmxlbmd0aCAtIDE7ICsraSkge1xuICAgICAgICAgICAgaW5kZXggKz0gdGhpcy5zdHJpZGVzW2ldICogbG9jc1tpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZXNbaW5kZXhdO1xuICAgIH1cbiAgICBsb2NUb0luZGV4KGxvY3MpIHtcbiAgICAgICAgaWYgKHRoaXMucmFuayA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5yYW5rID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jc1swXTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaW5kZXggPSBsb2NzW2xvY3MubGVuZ3RoIC0gMV07XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9jcy5sZW5ndGggLSAxOyArK2kpIHtcbiAgICAgICAgICAgIGluZGV4ICs9IHRoaXMuc3RyaWRlc1tpXSAqIGxvY3NbaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgICBpbmRleFRvTG9jKGluZGV4KSB7XG4gICAgICAgIGlmICh0aGlzLnJhbmsgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnJhbmsgPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBbaW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxvY3MgPSBuZXcgQXJyYXkodGhpcy5zaGFwZS5sZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvY3MubGVuZ3RoIC0gMTsgKytpKSB7XG4gICAgICAgICAgICBsb2NzW2ldID0gTWF0aC5mbG9vcihpbmRleCAvIHRoaXMuc3RyaWRlc1tpXSk7XG4gICAgICAgICAgICBpbmRleCAtPSBsb2NzW2ldICogdGhpcy5zdHJpZGVzW2ldO1xuICAgICAgICB9XG4gICAgICAgIGxvY3NbbG9jcy5sZW5ndGggLSAxXSA9IGluZGV4O1xuICAgICAgICByZXR1cm4gbG9jcztcbiAgICB9XG4gICAgZ2V0IHJhbmsoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNoYXBlLmxlbmd0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbW11dGFibGUgYHRmLlRlbnNvcmAgb2JqZWN0IGZyb20gdGhlIGJ1ZmZlci5cbiAgICAgKlxuICAgICAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAgICAgKi9cbiAgICB0b1RlbnNvcigpIHtcbiAgICAgICAgcmV0dXJuIHRyYWNrZXJGbigpLm1ha2VUZW5zb3IodGhpcy52YWx1ZXMsIHRoaXMuc2hhcGUsIHRoaXMuZHR5cGUpO1xuICAgIH1cbn1cbi8vIEZvciB0cmFja2luZyB0ZW5zb3IgY3JlYXRpb24gYW5kIGRpc3Bvc2FsLlxubGV0IHRyYWNrZXJGbiA9IG51bGw7XG4vLyBVc2VkIGJ5IGNoYWluaW5nIG1ldGhvZHMgdG8gY2FsbCBpbnRvIG9wcy5cbmxldCBvcEhhbmRsZXIgPSBudWxsO1xuLy8gVXNlZCB0byB3YXJuIGFib3V0IGRlcHJlY2F0ZWQgbWV0aG9kcy5cbmxldCBkZXByZWNhdGlvbldhcm5pbmdGbiA9IG51bGw7XG4vLyBUaGlzIGhlcmUgc28gdGhhdCB3ZSBjYW4gdXNlIHRoaXMgbWV0aG9kIG9uIGRldiBicmFuY2hlcyBhbmQga2VlcCB0aGVcbi8vIGZ1bmN0aW9uYWxpdHkgYXQgbWFzdGVyLlxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVudXNlZC1leHByZXNzaW9uXG5bZGVwcmVjYXRpb25XYXJuaW5nRm5dO1xuLyoqXG4gKiBBbiBleHRlcm5hbCBjb25zdW1lciBjYW4gcmVnaXN0ZXIgaXRzZWxmIGFzIHRoZSB0ZW5zb3IgdHJhY2tlci4gVGhpcyB3YXlcbiAqIHRoZSBUZW5zb3IgY2xhc3MgY2FuIG5vdGlmeSB0aGUgdHJhY2tlciBmb3IgZXZlcnkgdGVuc29yIGNyZWF0ZWQgYW5kXG4gKiBkaXNwb3NlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFRlbnNvclRyYWNrZXIoZm4pIHtcbiAgICB0cmFja2VyRm4gPSBmbjtcbn1cbi8qKlxuICogQW4gZXh0ZXJuYWwgY29uc3VtZXIgY2FuIHJlZ2lzdGVyIGl0c2VsZiBhcyB0aGUgb3AgaGFuZGxlci4gVGhpcyB3YXkgdGhlXG4gKiBUZW5zb3IgY2xhc3MgY2FuIGhhdmUgY2hhaW5pbmcgbWV0aG9kcyB0aGF0IGNhbGwgaW50byBvcHMgdmlhIHRoZSBvcFxuICogaGFuZGxlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldE9wSGFuZGxlcihoYW5kbGVyKSB7XG4gICAgb3BIYW5kbGVyID0gaGFuZGxlcjtcbn1cbi8qKlxuICogU2V0cyB0aGUgZGVwcmVjYXRpb24gd2FybmluZyBmdW5jdGlvbiB0byBiZSB1c2VkIGJ5IHRoaXMgZmlsZS4gVGhpcyB3YXkgdGhlXG4gKiBUZW5zb3IgY2xhc3MgY2FuIGJlIGEgbGVhZiBidXQgc3RpbGwgdXNlIHRoZSBlbnZpcm9ubWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldERlcHJlY2F0aW9uV2FybmluZ0ZuKGZuKSB7XG4gICAgZGVwcmVjYXRpb25XYXJuaW5nRm4gPSBmbjtcbn1cbi8qKlxuICogQSBgdGYuVGVuc29yYCBvYmplY3QgcmVwcmVzZW50cyBhbiBpbW11dGFibGUsIG11bHRpZGltZW5zaW9uYWwgYXJyYXkgb2ZcbiAqIG51bWJlcnMgdGhhdCBoYXMgYSBzaGFwZSBhbmQgYSBkYXRhIHR5cGUuXG4gKlxuICogRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIGZ1bmN0aW9ucyB0aGF0IGNyZWF0ZSB0ZW5zb3JzIGRvIG5vdCBuZWNlc3NhcmlseVxuICogcGVyZm9ybSBhIGNvcHkgb2YgdGhlIGRhdGEgcGFzc2VkIHRvIHRoZW0gKGUuZy4gaWYgdGhlIGRhdGEgaXMgcGFzc2VkIGFzIGFcbiAqIGBGbG9hdDMyQXJyYXlgKSwgYW5kIGNoYW5nZXMgdG8gdGhlIGRhdGEgd2lsbCBjaGFuZ2UgdGhlIHRlbnNvci4gVGhpcyBpcyBub3RcbiAqIGEgZmVhdHVyZSBhbmQgaXMgbm90IHN1cHBvcnRlZC4gVG8gYXZvaWQgdGhpcyBiZWhhdmlvciwgdXNlIHRoZSB0ZW5zb3IgYmVmb3JlXG4gKiBjaGFuZ2luZyB0aGUgaW5wdXQgZGF0YSBvciBjcmVhdGUgYSBjb3B5IHdpdGggYGNvcHkgPSB0Zi5hZGQoeW91clRlbnNvciwgMClgLlxuICpcbiAqIFNlZSBgdGYudGVuc29yYCBmb3IgZGV0YWlscyBvbiBob3cgdG8gY3JlYXRlIGEgYHRmLlRlbnNvcmAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gKi9cbmV4cG9ydCBjbGFzcyBUZW5zb3Ige1xuICAgIGNvbnN0cnVjdG9yKHNoYXBlLCBkdHlwZSwgZGF0YUlkLCBpZCkge1xuICAgICAgICAvKiogV2hldGhlciB0aGlzIHRlbnNvciBoYXMgYmVlbiBnbG9iYWxseSBrZXB0LiAqL1xuICAgICAgICB0aGlzLmtlcHQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc0Rpc3Bvc2VkSW50ZXJuYWwgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zaGFwZSA9IHNoYXBlLnNsaWNlKCk7XG4gICAgICAgIHRoaXMuZHR5cGUgPSBkdHlwZSB8fCAnZmxvYXQzMic7XG4gICAgICAgIHRoaXMuc2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShzaGFwZSk7XG4gICAgICAgIHRoaXMuc3RyaWRlcyA9IGNvbXB1dGVTdHJpZGVzKHNoYXBlKTtcbiAgICAgICAgdGhpcy5kYXRhSWQgPSBkYXRhSWQ7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5yYW5rVHlwZSA9ICh0aGlzLnJhbmsgPCA1ID8gdGhpcy5yYW5rLnRvU3RyaW5nKCkgOiAnaGlnaGVyJyk7XG4gICAgfVxuICAgIGdldCByYW5rKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zaGFwZS5sZW5ndGg7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBwcm9taXNlIG9mIGB0Zi5UZW5zb3JCdWZmZXJgIHRoYXQgaG9sZHMgdGhlIHVuZGVybHlpbmcgZGF0YS5cbiAgICAgKlxuICAgICAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NsYXNzZXMnfVxuICAgICAqL1xuICAgIGFzeW5jIGJ1ZmZlcigpIHtcbiAgICAgICAgY29uc3QgdmFscyA9IGF3YWl0IHRoaXMuZGF0YSgpO1xuICAgICAgICByZXR1cm4gb3BIYW5kbGVyLmJ1ZmZlcih0aGlzLnNoYXBlLCB0aGlzLmR0eXBlLCB2YWxzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGB0Zi5UZW5zb3JCdWZmZXJgIHRoYXQgaG9sZHMgdGhlIHVuZGVybHlpbmcgZGF0YS5cbiAgICAgKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICAgKi9cbiAgICBidWZmZXJTeW5jKCkge1xuICAgICAgICByZXR1cm4gb3BIYW5kbGVyLmJ1ZmZlcih0aGlzLnNoYXBlLCB0aGlzLmR0eXBlLCB0aGlzLmRhdGFTeW5jKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB0ZW5zb3IgZGF0YSBhcyBhIG5lc3RlZCBhcnJheS4gVGhlIHRyYW5zZmVyIG9mIGRhdGEgaXMgZG9uZVxuICAgICAqIGFzeW5jaHJvbm91c2x5LlxuICAgICAqXG4gICAgICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAgICovXG4gICAgYXN5bmMgYXJyYXkoKSB7XG4gICAgICAgIGNvbnN0IHZhbHMgPSBhd2FpdCB0aGlzLmRhdGEoKTtcbiAgICAgICAgcmV0dXJuIHRvTmVzdGVkQXJyYXkodGhpcy5zaGFwZSwgdmFscywgdGhpcy5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB0ZW5zb3IgZGF0YSBhcyBhIG5lc3RlZCBhcnJheS4gVGhlIHRyYW5zZmVyIG9mIGRhdGEgaXMgZG9uZVxuICAgICAqIHN5bmNocm9ub3VzbHkuXG4gICAgICpcbiAgICAgKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICAgKi9cbiAgICBhcnJheVN5bmMoKSB7XG4gICAgICAgIHJldHVybiB0b05lc3RlZEFycmF5KHRoaXMuc2hhcGUsIHRoaXMuZGF0YVN5bmMoKSwgdGhpcy5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBc3luY2hyb25vdXNseSBkb3dubG9hZHMgdGhlIHZhbHVlcyBmcm9tIHRoZSBgdGYuVGVuc29yYC4gUmV0dXJucyBhXG4gICAgICogcHJvbWlzZSBvZiBgVHlwZWRBcnJheWAgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjb21wdXRhdGlvbiBoYXMgZmluaXNoZWQuXG4gICAgICpcbiAgICAgKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICAgKi9cbiAgICBhc3luYyBkYXRhKCkge1xuICAgICAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgICAgICBjb25zdCBkYXRhID0gdHJhY2tlckZuKCkucmVhZCh0aGlzLmRhdGFJZCk7XG4gICAgICAgIGlmICh0aGlzLmR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSBhd2FpdCBkYXRhO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYnl0ZXMubWFwKGIgPT4gdXRpbC5kZWNvZGVTdHJpbmcoYikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZGVjb2RlIHRoZSBzdHJpbmcgYnl0ZXMgaW50byB1dGYtOC4gJyArXG4gICAgICAgICAgICAgICAgICAgICdUbyBnZXQgdGhlIG9yaWdpbmFsIGJ5dGVzLCBjYWxsIHRlbnNvci5ieXRlcygpLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTeW5jaHJvbm91c2x5IGRvd25sb2FkcyB0aGUgdmFsdWVzIGZyb20gdGhlIGB0Zi5UZW5zb3JgLiBUaGlzIGJsb2NrcyB0aGVcbiAgICAgKiBVSSB0aHJlYWQgdW50aWwgdGhlIHZhbHVlcyBhcmUgcmVhZHksIHdoaWNoIGNhbiBjYXVzZSBwZXJmb3JtYW5jZSBpc3N1ZXMuXG4gICAgICpcbiAgICAgKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICAgKi9cbiAgICBkYXRhU3luYygpIHtcbiAgICAgICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRyYWNrZXJGbigpLnJlYWRTeW5jKHRoaXMuZGF0YUlkKTtcbiAgICAgICAgaWYgKHRoaXMuZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhLm1hcChiID0+IHV0aWwuZGVjb2RlU3RyaW5nKGIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChfYSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGRlY29kZSB0aGUgc3RyaW5nIGJ5dGVzIGludG8gdXRmLTguICcgK1xuICAgICAgICAgICAgICAgICAgICAnVG8gZ2V0IHRoZSBvcmlnaW5hbCBieXRlcywgY2FsbCB0ZW5zb3IuYnl0ZXMoKS4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgLyoqIFJldHVybnMgdGhlIHVuZGVybHlpbmcgYnl0ZXMgb2YgdGhlIHRlbnNvcidzIGRhdGEuICovXG4gICAgYXN5bmMgYnl0ZXMoKSB7XG4gICAgICAgIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0cmFja2VyRm4oKS5yZWFkKHRoaXMuZGF0YUlkKTtcbiAgICAgICAgaWYgKHRoaXMuZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShkYXRhLmJ1ZmZlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRGlzcG9zZXMgYHRmLlRlbnNvcmAgZnJvbSBtZW1vcnkuXG4gICAgICpcbiAgICAgKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICAgKi9cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICBpZiAodGhpcy5pc0Rpc3Bvc2VkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdHJhY2tlckZuKCkuZGlzcG9zZVRlbnNvcih0aGlzKTtcbiAgICAgICAgdGhpcy5pc0Rpc3Bvc2VkSW50ZXJuYWwgPSB0cnVlO1xuICAgIH1cbiAgICBnZXQgaXNEaXNwb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNEaXNwb3NlZEludGVybmFsO1xuICAgIH1cbiAgICB0aHJvd0lmRGlzcG9zZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGVuc29yIGlzIGRpc3Bvc2VkLmApO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByaW50cyB0aGUgYHRmLlRlbnNvcmAuIFNlZSBgdGYucHJpbnRgIGZvciBkZXRhaWxzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZlcmJvc2UgV2hldGhlciB0byBwcmludCB2ZXJib3NlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0ZW5zb3IsXG4gICAgICogICAgaW5jbHVkaW5nIGR0eXBlIGFuZCBzaXplLlxuICAgICAqXG4gICAgICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAgICovXG4gICAgcHJpbnQodmVyYm9zZSA9IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBvcEhhbmRsZXIucHJpbnQodGhpcywgdmVyYm9zZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBjb3B5IG9mIHRoZSB0ZW5zb3IuIFNlZSBgdGYuY2xvbmVgIGZvciBkZXRhaWxzLlxuICAgICAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NsYXNzZXMnfVxuICAgICAqL1xuICAgIGNsb25lKCkge1xuICAgICAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgICAgICByZXR1cm4gb3BIYW5kbGVyLmNsb25lKHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIHRlbnNvci4gVXNlZnVsIGZvciBsb2dnaW5nLlxuICAgICAqXG4gICAgICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAgICovXG4gICAgdG9TdHJpbmcodmVyYm9zZSA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IHZhbHMgPSB0aGlzLmRhdGFTeW5jKCk7XG4gICAgICAgIHJldHVybiB0ZW5zb3JUb1N0cmluZyh2YWxzLCB0aGlzLnNoYXBlLCB0aGlzLmR0eXBlLCB2ZXJib3NlKTtcbiAgICB9XG4gICAgY2FzdChkdHlwZSkge1xuICAgICAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgICAgICByZXR1cm4gb3BIYW5kbGVyLmNhc3QodGhpcywgZHR5cGUpO1xuICAgIH1cbiAgICB2YXJpYWJsZSh0cmFpbmFibGUgPSB0cnVlLCBuYW1lLCBkdHlwZSkge1xuICAgICAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgICAgICByZXR1cm4gdHJhY2tlckZuKCkubWFrZVZhcmlhYmxlKHRoaXMsIHRyYWluYWJsZSwgbmFtZSwgZHR5cGUpO1xuICAgIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShUZW5zb3IsIFN5bWJvbC5oYXNJbnN0YW5jZSwge1xuICAgIHZhbHVlOiAoaW5zdGFuY2UpID0+IHtcbiAgICAgICAgLy8gSW1wbGVtZW50YXRpb24gbm90ZTogd2Ugc2hvdWxkIHVzZSBwcm9wZXJ0aWVzIG9mIHRoZSBvYmplY3QgdGhhdCB3aWxsIGJlXG4gICAgICAgIC8vIGRlZmluZWQgYmVmb3JlIHRoZSBjb25zdHJ1Y3RvciBib2R5IGhhcyBmaW5pc2hlZCBleGVjdXRpbmcgKG1ldGhvZHMpLlxuICAgICAgICAvLyBUaGlzIGlzIGJlY2F1c2Ugd2hlbiB0aGlzIGNvZGUgaXMgdHJhbnNwaWxlZCBieSBiYWJlbCwgYmFiZWwgd2lsbCBjYWxsXG4gICAgICAgIC8vIGNsYXNzQ2FsbENoZWNrIGJlZm9yZSB0aGUgY29uc3RydWN0b3IgYm9keSBpcyBydW4uXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZmpzL2lzc3Vlcy8zMzg0IGZvciBiYWNrc3RvcnkuXG4gICAgICAgIHJldHVybiAhIWluc3RhbmNlICYmIGluc3RhbmNlLmRhdGEgIT0gbnVsbCAmJiBpbnN0YW5jZS5kYXRhU3luYyAhPSBudWxsICYmXG4gICAgICAgICAgICBpbnN0YW5jZS50aHJvd0lmRGlzcG9zZWQgIT0gbnVsbDtcbiAgICB9XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBnZXRHbG9iYWxUZW5zb3JDbGFzcygpIHtcbiAgICAvLyBVc2UgZ2V0R2xvYmFsIHNvIHRoYXQgd2UgY2FuIGF1Z21lbnQgdGhlIFRlbnNvciBjbGFzcyBhY3Jvc3MgcGFja2FnZVxuICAgIC8vIGJvdW5kYXJpZXMgYmVjYXNlIHRoZSBub2RlIHJlc29sdXRpb24gYWxnIG1heSByZXN1bHQgaW4gZGlmZmVyZW50IG1vZHVsZXNcbiAgICAvLyBiZWluZyByZXR1cm5lZCBmb3IgdGhpcyBmaWxlIGRlcGVuZGluZyBvbiB0aGUgcGF0aCB0aGV5IGFyZSBsb2FkZWQgZnJvbS5cbiAgICByZXR1cm4gZ2V0R2xvYmFsKCdUZW5zb3InLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiBUZW5zb3I7XG4gICAgfSk7XG59XG4vLyBHbG9iYWwgc2lkZSBlZmZlY3QuIENhY2hlIGdsb2JhbCByZWZlcmVuY2UgdG8gVGVuc29yIGNsYXNzXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpO1xuLyoqXG4gKiBBIG11dGFibGUgYHRmLlRlbnNvcmAsIHVzZWZ1bCBmb3IgcGVyc2lzdGluZyBzdGF0ZSwgZS5nLiBmb3IgdHJhaW5pbmcuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gKi9cbmV4cG9ydCBjbGFzcyBWYXJpYWJsZSBleHRlbmRzIFRlbnNvciB7XG4gICAgY29uc3RydWN0b3IoaW5pdGlhbFZhbHVlLCB0cmFpbmFibGUsIG5hbWUsIHRlbnNvcklkKSB7XG4gICAgICAgIHN1cGVyKGluaXRpYWxWYWx1ZS5zaGFwZSwgaW5pdGlhbFZhbHVlLmR0eXBlLCBpbml0aWFsVmFsdWUuZGF0YUlkLCB0ZW5zb3JJZCk7XG4gICAgICAgIHRoaXMudHJhaW5hYmxlID0gdHJhaW5hYmxlO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBc3NpZ24gYSBuZXcgYHRmLlRlbnNvcmAgdG8gdGhpcyB2YXJpYWJsZS4gVGhlIG5ldyBgdGYuVGVuc29yYCBtdXN0IGhhdmVcbiAgICAgKiB0aGUgc2FtZSBzaGFwZSBhbmQgZHR5cGUgYXMgdGhlIG9sZCBgdGYuVGVuc29yYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuZXdWYWx1ZSBOZXcgdGVuc29yIHRvIGJlIGFzc2lnbmVkIHRvIHRoaXMgdmFyaWFibGUuXG4gICAgICpcbiAgICAgKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICAgKi9cbiAgICBhc3NpZ24obmV3VmFsdWUpIHtcbiAgICAgICAgaWYgKG5ld1ZhbHVlLmR0eXBlICE9PSB0aGlzLmR0eXBlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGR0eXBlIG9mIHRoZSBuZXcgdmFsdWUgKCR7bmV3VmFsdWUuZHR5cGV9KSBhbmQgYCArXG4gICAgICAgICAgICAgICAgYHByZXZpb3VzIHZhbHVlICgke3RoaXMuZHR5cGV9KSBtdXN0IG1hdGNoYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF1dGlsLmFycmF5c0VxdWFsKG5ld1ZhbHVlLnNoYXBlLCB0aGlzLnNoYXBlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzaGFwZSBvZiB0aGUgbmV3IHZhbHVlICgke25ld1ZhbHVlLnNoYXBlfSkgYW5kIGAgK1xuICAgICAgICAgICAgICAgIGBwcmV2aW91cyB2YWx1ZSAoJHt0aGlzLnNoYXBlfSkgbXVzdCBtYXRjaGApO1xuICAgICAgICB9XG4gICAgICAgIHRyYWNrZXJGbigpLmRpc3Bvc2VUZW5zb3IodGhpcyk7XG4gICAgICAgIHRoaXMuZGF0YUlkID0gbmV3VmFsdWUuZGF0YUlkO1xuICAgICAgICB0cmFja2VyRm4oKS5pbmNSZWYodGhpcywgbnVsbCAvKiBiYWNrZW5kICovKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdHJhY2tlckZuKCkuZGlzcG9zZVZhcmlhYmxlKHRoaXMpO1xuICAgICAgICB0aGlzLmlzRGlzcG9zZWRJbnRlcm5hbCA9IHRydWU7XG4gICAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZhcmlhYmxlLCBTeW1ib2wuaGFzSW5zdGFuY2UsIHtcbiAgICB2YWx1ZTogKGluc3RhbmNlKSA9PiB7XG4gICAgICAgIHJldHVybiBpbnN0YW5jZSBpbnN0YW5jZW9mIFRlbnNvciAmJiBpbnN0YW5jZS5hc3NpZ24gIT0gbnVsbCAmJlxuICAgICAgICAgICAgaW5zdGFuY2UuYXNzaWduIGluc3RhbmNlb2YgRnVuY3Rpb247XG4gICAgfVxufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10ZW5zb3IuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29tcHV0ZVN0cmlkZXMsIGlzU3RyaW5nLCByaWdodFBhZCwgc2l6ZUZyb21TaGFwZSB9IGZyb20gJy4vdXRpbCc7XG4vLyBNYXhpbXVtIG51bWJlciBvZiB2YWx1ZXMgYmVmb3JlIHdlIGRlY2lkZSB0byBzaG93IGVsbGlwc2lzLlxuY29uc3QgRk9STUFUX0xJTUlUX05VTV9WQUxTID0gMjA7XG4vLyBOdW1iZXIgb2YgZmlyc3QgYW5kIGxhc3QgdmFsdWVzIHRvIHNob3cgd2hlbiBkaXNwbGF5aW5nIGEsIGIsLi4uLHksIHouXG5jb25zdCBGT1JNQVRfTlVNX0ZJUlNUX0xBU1RfVkFMUyA9IDM7XG4vLyBOdW1iZXIgb2Ygc2lnbmlmaWNhbnQgZGlnaXRzIHRvIHNob3cuXG5jb25zdCBGT1JNQVRfTlVNX1NJR19ESUdJVFMgPSA3O1xuZXhwb3J0IGZ1bmN0aW9uIHRlbnNvclRvU3RyaW5nKHZhbHMsIHNoYXBlLCBkdHlwZSwgdmVyYm9zZSkge1xuICAgIGNvbnN0IHN0cmlkZXMgPSBjb21wdXRlU3RyaWRlcyhzaGFwZSk7XG4gICAgY29uc3QgcGFkUGVyQ29sID0gY29tcHV0ZU1heFNpemVQZXJDb2x1bW4odmFscywgc2hhcGUsIGR0eXBlLCBzdHJpZGVzKTtcbiAgICBjb25zdCByYW5rID0gc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IHZhbHNMaW5lcyA9IHN1YlRlbnNvclRvU3RyaW5nKHZhbHMsIHNoYXBlLCBkdHlwZSwgc3RyaWRlcywgcGFkUGVyQ29sKTtcbiAgICBjb25zdCBsaW5lcyA9IFsnVGVuc29yJ107XG4gICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgbGluZXMucHVzaChgICBkdHlwZTogJHtkdHlwZX1gKTtcbiAgICAgICAgbGluZXMucHVzaChgICByYW5rOiAke3Jhbmt9YCk7XG4gICAgICAgIGxpbmVzLnB1c2goYCAgc2hhcGU6IFske3NoYXBlfV1gKTtcbiAgICAgICAgbGluZXMucHVzaChgICB2YWx1ZXM6YCk7XG4gICAgfVxuICAgIGxpbmVzLnB1c2godmFsc0xpbmVzLm1hcChsID0+ICcgICAgJyArIGwpLmpvaW4oJ1xcbicpKTtcbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG59XG5mdW5jdGlvbiBjb21wdXRlTWF4U2l6ZVBlckNvbHVtbih2YWxzLCBzaGFwZSwgZHR5cGUsIHN0cmlkZXMpIHtcbiAgICBjb25zdCBuID0gc2l6ZUZyb21TaGFwZShzaGFwZSk7XG4gICAgY29uc3QgbnVtQ29scyA9IHN0cmlkZXNbc3RyaWRlcy5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBwYWRQZXJDb2wgPSBuZXcgQXJyYXkobnVtQ29scykuZmlsbCgwKTtcbiAgICBjb25zdCByYW5rID0gc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IHZhbHVlc09yVHVwbGVzID0gZHR5cGUgPT09ICdjb21wbGV4NjQnID8gY3JlYXRlQ29tcGxleFR1cGxlcyh2YWxzKSA6IHZhbHM7XG4gICAgaWYgKHJhbmsgPiAxKSB7XG4gICAgICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IG4gLyBudW1Db2xzOyByb3crKykge1xuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gcm93ICogbnVtQ29scztcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbnVtQ29sczsgaisrKSB7XG4gICAgICAgICAgICAgICAgcGFkUGVyQ29sW2pdID0gTWF0aC5tYXgocGFkUGVyQ29sW2pdLCB2YWxUb1N0cmluZyh2YWx1ZXNPclR1cGxlc1tvZmZzZXQgKyBqXSwgMCwgZHR5cGUpLmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhZFBlckNvbDtcbn1cbmZ1bmN0aW9uIHZhbFRvU3RyaW5nKHZhbCwgcGFkLCBkdHlwZSkge1xuICAgIGxldCB2YWxTdHI7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICB2YWxTdHIgPSBgJHtwYXJzZUZsb2F0KHZhbFswXS50b0ZpeGVkKEZPUk1BVF9OVU1fU0lHX0RJR0lUUykpfSArIGAgK1xuICAgICAgICAgICAgYCR7cGFyc2VGbG9hdCh2YWxbMV0udG9GaXhlZChGT1JNQVRfTlVNX1NJR19ESUdJVFMpKX1qYDtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNTdHJpbmcodmFsKSkge1xuICAgICAgICB2YWxTdHIgPSBgJyR7dmFsfSdgO1xuICAgIH1cbiAgICBlbHNlIGlmIChkdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgICAgIHZhbFN0ciA9IGJvb2xOdW1Ub1N0cmluZyh2YWwpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdmFsU3RyID0gcGFyc2VGbG9hdCh2YWwudG9GaXhlZChGT1JNQVRfTlVNX1NJR19ESUdJVFMpKS50b1N0cmluZygpO1xuICAgIH1cbiAgICByZXR1cm4gcmlnaHRQYWQodmFsU3RyLCBwYWQpO1xufVxuZnVuY3Rpb24gYm9vbE51bVRvU3RyaW5nKHYpIHtcbiAgICByZXR1cm4gdiA9PT0gMCA/ICdmYWxzZScgOiAndHJ1ZSc7XG59XG5mdW5jdGlvbiBzdWJUZW5zb3JUb1N0cmluZyh2YWxzLCBzaGFwZSwgZHR5cGUsIHN0cmlkZXMsIHBhZFBlckNvbCwgaXNMYXN0ID0gdHJ1ZSkge1xuICAgIGNvbnN0IHN0b3JhZ2VQZXJFbGVtZW50ID0gZHR5cGUgPT09ICdjb21wbGV4NjQnID8gMiA6IDE7XG4gICAgY29uc3Qgc2l6ZSA9IHNoYXBlWzBdO1xuICAgIGNvbnN0IHJhbmsgPSBzaGFwZS5sZW5ndGg7XG4gICAgaWYgKHJhbmsgPT09IDApIHtcbiAgICAgICAgaWYgKGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICAgICAgY29uc3QgY29tcGxleFR1cGxlID0gY3JlYXRlQ29tcGxleFR1cGxlcyh2YWxzKTtcbiAgICAgICAgICAgIHJldHVybiBbdmFsVG9TdHJpbmcoY29tcGxleFR1cGxlWzBdLCAwLCBkdHlwZSldO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgICAgICAgICByZXR1cm4gW2Jvb2xOdW1Ub1N0cmluZyh2YWxzWzBdKV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFt2YWxzWzBdLnRvU3RyaW5nKCldO1xuICAgIH1cbiAgICBpZiAocmFuayA9PT0gMSkge1xuICAgICAgICBpZiAoc2l6ZSA+IEZPUk1BVF9MSU1JVF9OVU1fVkFMUykge1xuICAgICAgICAgICAgY29uc3QgZmlyc3RWYWxzU2l6ZSA9IEZPUk1BVF9OVU1fRklSU1RfTEFTVF9WQUxTICogc3RvcmFnZVBlckVsZW1lbnQ7XG4gICAgICAgICAgICBsZXQgZmlyc3RWYWxzID0gQXJyYXkuZnJvbSh2YWxzLnNsaWNlKDAsIGZpcnN0VmFsc1NpemUpKTtcbiAgICAgICAgICAgIGxldCBsYXN0VmFscyA9IEFycmF5LmZyb20odmFscy5zbGljZSgoc2l6ZSAtIEZPUk1BVF9OVU1fRklSU1RfTEFTVF9WQUxTKSAqIHN0b3JhZ2VQZXJFbGVtZW50LCBzaXplICogc3RvcmFnZVBlckVsZW1lbnQpKTtcbiAgICAgICAgICAgIGlmIChkdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgICAgICAgICBmaXJzdFZhbHMgPSBjcmVhdGVDb21wbGV4VHVwbGVzKGZpcnN0VmFscyk7XG4gICAgICAgICAgICAgICAgbGFzdFZhbHMgPSBjcmVhdGVDb21wbGV4VHVwbGVzKGxhc3RWYWxzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgJ1snICtcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RWYWxzLm1hcCgoeCwgaSkgPT4gdmFsVG9TdHJpbmcoeCwgcGFkUGVyQ29sW2ldLCBkdHlwZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAuam9pbignLCAnKSArXG4gICAgICAgICAgICAgICAgICAgICcsIC4uLiwgJyArXG4gICAgICAgICAgICAgICAgICAgIGxhc3RWYWxzXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKCh4LCBpKSA9PiB2YWxUb1N0cmluZyh4LCBwYWRQZXJDb2xbc2l6ZSAtIEZPUk1BVF9OVU1fRklSU1RfTEFTVF9WQUxTICsgaV0sIGR0eXBlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKCcsICcpICtcbiAgICAgICAgICAgICAgICAgICAgJ10nXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRpc3BsYXlWYWxzID0gZHR5cGUgPT09ICdjb21wbGV4NjQnID8gY3JlYXRlQ29tcGxleFR1cGxlcyh2YWxzKSA6XG4gICAgICAgICAgICBBcnJheS5mcm9tKHZhbHMpO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ1snICtcbiAgICAgICAgICAgICAgICBkaXNwbGF5VmFscy5tYXAoKHgsIGkpID0+IHZhbFRvU3RyaW5nKHgsIHBhZFBlckNvbFtpXSwgZHR5cGUpKVxuICAgICAgICAgICAgICAgICAgICAuam9pbignLCAnKSArXG4gICAgICAgICAgICAgICAgJ10nXG4gICAgICAgIF07XG4gICAgfVxuICAgIC8vIFRoZSBhcnJheSBpcyByYW5rIDIgb3IgbW9yZS5cbiAgICBjb25zdCBzdWJzaGFwZSA9IHNoYXBlLnNsaWNlKDEpO1xuICAgIGNvbnN0IHN1YnN0cmlkZXMgPSBzdHJpZGVzLnNsaWNlKDEpO1xuICAgIGNvbnN0IHN0cmlkZSA9IHN0cmlkZXNbMF0gKiBzdG9yYWdlUGVyRWxlbWVudDtcbiAgICBjb25zdCBsaW5lcyA9IFtdO1xuICAgIGlmIChzaXplID4gRk9STUFUX0xJTUlUX05VTV9WQUxTKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgRk9STUFUX05VTV9GSVJTVF9MQVNUX1ZBTFM7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBpICogc3RyaWRlO1xuICAgICAgICAgICAgY29uc3QgZW5kID0gc3RhcnQgKyBzdHJpZGU7XG4gICAgICAgICAgICBsaW5lcy5wdXNoKC4uLnN1YlRlbnNvclRvU3RyaW5nKHZhbHMuc2xpY2Uoc3RhcnQsIGVuZCksIHN1YnNoYXBlLCBkdHlwZSwgc3Vic3RyaWRlcywgcGFkUGVyQ29sLCBmYWxzZSAvKiBpc0xhc3QgKi8pKTtcbiAgICAgICAgfVxuICAgICAgICBsaW5lcy5wdXNoKCcuLi4nKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHNpemUgLSBGT1JNQVRfTlVNX0ZJUlNUX0xBU1RfVkFMUzsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBpICogc3RyaWRlO1xuICAgICAgICAgICAgY29uc3QgZW5kID0gc3RhcnQgKyBzdHJpZGU7XG4gICAgICAgICAgICBsaW5lcy5wdXNoKC4uLnN1YlRlbnNvclRvU3RyaW5nKHZhbHMuc2xpY2Uoc3RhcnQsIGVuZCksIHN1YnNoYXBlLCBkdHlwZSwgc3Vic3RyaWRlcywgcGFkUGVyQ29sLCBpID09PSBzaXplIC0gMSAvKiBpc0xhc3QgKi8pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gaSAqIHN0cmlkZTtcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgc3RyaWRlO1xuICAgICAgICAgICAgbGluZXMucHVzaCguLi5zdWJUZW5zb3JUb1N0cmluZyh2YWxzLnNsaWNlKHN0YXJ0LCBlbmQpLCBzdWJzaGFwZSwgZHR5cGUsIHN1YnN0cmlkZXMsIHBhZFBlckNvbCwgaSA9PT0gc2l6ZSAtIDEgLyogaXNMYXN0ICovKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgc2VwID0gcmFuayA9PT0gMiA/ICcsJyA6ICcnO1xuICAgIGxpbmVzWzBdID0gJ1snICsgbGluZXNbMF0gKyBzZXA7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBsaW5lcy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgbGluZXNbaV0gPSAnICcgKyBsaW5lc1tpXSArIHNlcDtcbiAgICB9XG4gICAgbGV0IG5ld0xpbmVTZXAgPSAnLFxcbic7XG4gICAgZm9yIChsZXQgaSA9IDI7IGkgPCByYW5rOyBpKyspIHtcbiAgICAgICAgbmV3TGluZVNlcCArPSAnXFxuJztcbiAgICB9XG4gICAgbGluZXNbbGluZXMubGVuZ3RoIC0gMV0gPVxuICAgICAgICAnICcgKyBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSArICddJyArIChpc0xhc3QgPyAnJyA6IG5ld0xpbmVTZXApO1xuICAgIHJldHVybiBsaW5lcztcbn1cbmZ1bmN0aW9uIGNyZWF0ZUNvbXBsZXhUdXBsZXModmFscykge1xuICAgIGNvbnN0IGNvbXBsZXhUdXBsZXMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgY29tcGxleFR1cGxlcy5wdXNoKFt2YWxzW2ldLCB2YWxzW2kgKyAxXV0pO1xuICAgIH1cbiAgICByZXR1cm4gY29tcGxleFR1cGxlcztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRlbnNvcl9mb3JtYXQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgVGVuc29yIH0gZnJvbSAnLi90ZW5zb3InO1xuaW1wb3J0IHsgdXBjYXN0VHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBtYWtlVHlwZXNNYXRjaChhLCBiKSB7XG4gICAgaWYgKGEuZHR5cGUgPT09IGIuZHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIFthLCBiXTtcbiAgICB9XG4gICAgY29uc3QgZHR5cGUgPSB1cGNhc3RUeXBlKGEuZHR5cGUsIGIuZHR5cGUpO1xuICAgIHJldHVybiBbYS5jYXN0KGR0eXBlKSwgYi5jYXN0KGR0eXBlKV07XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VHlwZXNNYXRjaChhLCBiKSB7XG4gICAgYXNzZXJ0KGEuZHR5cGUgPT09IGIuZHR5cGUsICgpID0+IGBUaGUgZHR5cGVzIG9mIHRoZSBmaXJzdCgke2EuZHR5cGV9KSBhbmRgICtcbiAgICAgICAgYCBzZWNvbmQoJHtiLmR0eXBlfSkgaW5wdXQgbXVzdCBtYXRjaGApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVGVuc29ySW5MaXN0KHRlbnNvciwgdGVuc29yTGlzdCkge1xuICAgIHJldHVybiB0ZW5zb3JMaXN0LnNvbWUoeCA9PiB4LmlkID09PSB0ZW5zb3IuaWQpO1xufVxuLyoqXG4gKiBFeHRyYWN0cyBhbnkgYFRlbnNvcmBzIGZvdW5kIHdpdGhpbiB0aGUgcHJvdmlkZWQgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBjb250YWluZXIgYW4gb2JqZWN0IHRoYXQgbWF5IGJlIGEgYFRlbnNvcmAgb3IgbWF5IGRpcmVjdGx5IGNvbnRhaW5cbiAqICAgYFRlbnNvcmBzLCBzdWNoIGFzIGEgYFRlbnNvcltdYCBvciBge2tleTogVGVuc29yLCAuLi59YC4gSW4gZ2VuZXJhbCBpdFxuICogICBpcyBzYWZlIHRvIHBhc3MgYW55IG9iamVjdCBoZXJlLCBleGNlcHQgdGhhdCBgUHJvbWlzZWBzIGFyZSBub3RcbiAqICAgc3VwcG9ydGVkLlxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgYFRlbnNvcnNgIGZvdW5kIHdpdGhpbiB0aGUgcGFzc2VkIG9iamVjdC4gSWYgdGhlXG4gKiAgIGFyZ3VtZW50IGlzIHNpbXBseSBhIGBUZW5zb3InLCBhIGxpc3QgY29udGFpbmluZyB0aGF0IGBUZW5zb3JgIGlzXG4gKiAgIHJldHVybmVkLiBJZiB0aGUgb2JqZWN0IGlzIG5vdCBhIGBUZW5zb3JgIG9yIGRvZXMgbm90XG4gKiAgIGNvbnRhaW4gYFRlbnNvcnNgLCBhbiBlbXB0eSBsaXN0IGlzIHJldHVybmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGVuc29yc0luQ29udGFpbmVyKHJlc3VsdCkge1xuICAgIGNvbnN0IGxpc3QgPSBbXTtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldCgpO1xuICAgIHdhbGtUZW5zb3JDb250YWluZXIocmVzdWx0LCBsaXN0LCBzZWVuKTtcbiAgICByZXR1cm4gbGlzdDtcbn1cbmZ1bmN0aW9uIHdhbGtUZW5zb3JDb250YWluZXIoY29udGFpbmVyLCBsaXN0LCBzZWVuKSB7XG4gICAgaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFRlbnNvcikge1xuICAgICAgICBsaXN0LnB1c2goY29udGFpbmVyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWlzSXRlcmFibGUoY29udGFpbmVyKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEl0ZXJhdGlvbiBvdmVyIGtleXMgd29ya3MgYWxzbyBmb3IgYXJyYXlzLlxuICAgIGNvbnN0IGl0ZXJhYmxlID0gY29udGFpbmVyO1xuICAgIGZvciAoY29uc3QgayBpbiBpdGVyYWJsZSkge1xuICAgICAgICBjb25zdCB2YWwgPSBpdGVyYWJsZVtrXTtcbiAgICAgICAgaWYgKCFzZWVuLmhhcyh2YWwpKSB7XG4gICAgICAgICAgICBzZWVuLmFkZCh2YWwpO1xuICAgICAgICAgICAgd2Fsa1RlbnNvckNvbnRhaW5lcih2YWwsIGxpc3QsIHNlZW4pO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuZnVuY3Rpb24gaXNJdGVyYWJsZShvYmopIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShvYmopIHx8IHR5cGVvZiBvYmogPT09ICdvYmplY3QnO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGVuc29yX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi9lbmdpbmUnO1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBUZW5zb3IgfSBmcm9tICcuL3RlbnNvcic7XG5pbXBvcnQgeyBhc3NlcnQsIGZsYXR0ZW4sIGluZmVyRHR5cGUsIGlzVHlwZWRBcnJheSwgdG9UeXBlZEFycmF5IH0gZnJvbSAnLi91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBpbmZlclNoYXBlKHZhbCwgZHR5cGUpIHtcbiAgICBsZXQgZmlyc3RFbGVtID0gdmFsO1xuICAgIGlmIChpc1R5cGVkQXJyYXkodmFsKSkge1xuICAgICAgICByZXR1cm4gZHR5cGUgPT09ICdzdHJpbmcnID8gW10gOiBbdmFsLmxlbmd0aF07XG4gICAgfVxuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgIHJldHVybiBbXTsgLy8gU2NhbGFyLlxuICAgIH1cbiAgICBjb25zdCBzaGFwZSA9IFtdO1xuICAgIHdoaWxlIChBcnJheS5pc0FycmF5KGZpcnN0RWxlbSkgfHxcbiAgICAgICAgaXNUeXBlZEFycmF5KGZpcnN0RWxlbSkgJiYgZHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHNoYXBlLnB1c2goZmlyc3RFbGVtLmxlbmd0aCk7XG4gICAgICAgIGZpcnN0RWxlbSA9IGZpcnN0RWxlbVswXTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSAmJlxuICAgICAgICBlbnYoKS5nZXRCb29sKCdURU5TT1JMSUtFX0NIRUNLX1NIQVBFX0NPTlNJU1RFTkNZJykpIHtcbiAgICAgICAgZGVlcEFzc2VydFNoYXBlQ29uc2lzdGVuY3kodmFsLCBzaGFwZSwgW10pO1xuICAgIH1cbiAgICByZXR1cm4gc2hhcGU7XG59XG5mdW5jdGlvbiBkZWVwQXNzZXJ0U2hhcGVDb25zaXN0ZW5jeSh2YWwsIHNoYXBlLCBpbmRpY2VzKSB7XG4gICAgaW5kaWNlcyA9IGluZGljZXMgfHwgW107XG4gICAgaWYgKCEoQXJyYXkuaXNBcnJheSh2YWwpKSAmJiAhaXNUeXBlZEFycmF5KHZhbCkpIHtcbiAgICAgICAgYXNzZXJ0KHNoYXBlLmxlbmd0aCA9PT0gMCwgKCkgPT4gYEVsZW1lbnQgYXJyWyR7aW5kaWNlcy5qb2luKCddWycpfV0gaXMgYSBwcmltaXRpdmUsIGAgK1xuICAgICAgICAgICAgYGJ1dCBzaG91bGQgYmUgYW4gYXJyYXkvVHlwZWRBcnJheSBvZiAke3NoYXBlWzBdfSBlbGVtZW50c2ApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGFzc2VydChzaGFwZS5sZW5ndGggPiAwLCAoKSA9PiBgRWxlbWVudCBhcnJbJHtpbmRpY2VzLmpvaW4oJ11bJyl9XSBzaG91bGQgYmUgYSBwcmltaXRpdmUsIGAgK1xuICAgICAgICBgYnV0IGlzIGFuIGFycmF5IG9mICR7dmFsLmxlbmd0aH0gZWxlbWVudHNgKTtcbiAgICBhc3NlcnQodmFsLmxlbmd0aCA9PT0gc2hhcGVbMF0sICgpID0+IGBFbGVtZW50IGFyclske2luZGljZXMuam9pbignXVsnKX1dIHNob3VsZCBoYXZlICR7c2hhcGVbMF19IGAgK1xuICAgICAgICBgZWxlbWVudHMsIGJ1dCBoYXMgJHt2YWwubGVuZ3RofSBlbGVtZW50c2ApO1xuICAgIGNvbnN0IHN1YlNoYXBlID0gc2hhcGUuc2xpY2UoMSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgZGVlcEFzc2VydFNoYXBlQ29uc2lzdGVuY3kodmFsW2ldLCBzdWJTaGFwZSwgaW5kaWNlcy5jb25jYXQoaSkpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFzc2VydER0eXBlKGV4cGVjdGVkRHR5cGUsIGFjdHVhbERUeXBlLCBhcmdOYW1lLCBmdW5jdGlvbk5hbWUpIHtcbiAgICBpZiAoZXhwZWN0ZWREdHlwZSA9PT0gJ3N0cmluZ19vcl9udW1lcmljJykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChleHBlY3RlZER0eXBlID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBkdHlwZSBjYW5ub3QgYmUgbnVsbC5gKTtcbiAgICB9XG4gICAgaWYgKGV4cGVjdGVkRHR5cGUgIT09ICdudW1lcmljJyAmJiBleHBlY3RlZER0eXBlICE9PSBhY3R1YWxEVHlwZSB8fFxuICAgICAgICBleHBlY3RlZER0eXBlID09PSAnbnVtZXJpYycgJiYgYWN0dWFsRFR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQXJndW1lbnQgJyR7YXJnTmFtZX0nIHBhc3NlZCB0byAnJHtmdW5jdGlvbk5hbWV9JyBtdXN0IGAgK1xuICAgICAgICAgICAgYGJlICR7ZXhwZWN0ZWREdHlwZX0gdGVuc29yLCBidXQgZ290ICR7YWN0dWFsRFR5cGV9IHRlbnNvcmApO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0VG9UZW5zb3IoeCwgYXJnTmFtZSwgZnVuY3Rpb25OYW1lLCBwYXJzZUFzRHR5cGUgPSAnbnVtZXJpYycpIHtcbiAgICBpZiAoeCBpbnN0YW5jZW9mIFRlbnNvcikge1xuICAgICAgICBhc3NlcnREdHlwZShwYXJzZUFzRHR5cGUsIHguZHR5cGUsIGFyZ05hbWUsIGZ1bmN0aW9uTmFtZSk7XG4gICAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgICBsZXQgaW5mZXJyZWREdHlwZSA9IGluZmVyRHR5cGUoeCk7XG4gICAgLy8gSWYgdGhlIHVzZXIgZXhwZWN0cyBhIGJvb2wvaW50L2Zsb2F0LCB1c2UgdGhhdCBpbmZvIHRvIHVwZGF0ZSB0aGVcbiAgICAvLyBpbmZlcnJlZER0eXBlIHdoZW4gaXQgaXMgbm90IGEgc3RyaW5nLlxuICAgIGlmIChpbmZlcnJlZER0eXBlICE9PSAnc3RyaW5nJyAmJlxuICAgICAgICBbJ2Jvb2wnLCAnaW50MzInLCAnZmxvYXQzMiddLmluZGV4T2YocGFyc2VBc0R0eXBlKSA+PSAwKSB7XG4gICAgICAgIGluZmVycmVkRHR5cGUgPSBwYXJzZUFzRHR5cGU7XG4gICAgfVxuICAgIGFzc2VydER0eXBlKHBhcnNlQXNEdHlwZSwgaW5mZXJyZWREdHlwZSwgYXJnTmFtZSwgZnVuY3Rpb25OYW1lKTtcbiAgICBpZiAoKHggPT0gbnVsbCkgfHxcbiAgICAgICAgKCFpc1R5cGVkQXJyYXkoeCkgJiYgIUFycmF5LmlzQXJyYXkoeCkgJiYgdHlwZW9mIHggIT09ICdudW1iZXInICYmXG4gICAgICAgICAgICB0eXBlb2YgeCAhPT0gJ2Jvb2xlYW4nICYmIHR5cGVvZiB4ICE9PSAnc3RyaW5nJykpIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IHggPT0gbnVsbCA/ICdudWxsJyA6IHguY29uc3RydWN0b3IubmFtZTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBcmd1bWVudCAnJHthcmdOYW1lfScgcGFzc2VkIHRvICcke2Z1bmN0aW9uTmFtZX0nIG11c3QgYmUgYSBgICtcbiAgICAgICAgICAgIGBUZW5zb3Igb3IgVGVuc29yTGlrZSwgYnV0IGdvdCAnJHt0eXBlfSdgKTtcbiAgICB9XG4gICAgY29uc3QgaW5mZXJyZWRTaGFwZSA9IGluZmVyU2hhcGUoeCwgaW5mZXJyZWREdHlwZSk7XG4gICAgaWYgKCFpc1R5cGVkQXJyYXkoeCkgJiYgIUFycmF5LmlzQXJyYXkoeCkpIHtcbiAgICAgICAgeCA9IFt4XTtcbiAgICB9XG4gICAgY29uc3Qgc2tpcFR5cGVkQXJyYXkgPSB0cnVlO1xuICAgIGNvbnN0IHZhbHVlcyA9IGluZmVycmVkRHR5cGUgIT09ICdzdHJpbmcnID9cbiAgICAgICAgdG9UeXBlZEFycmF5KHgsIGluZmVycmVkRHR5cGUpIDpcbiAgICAgICAgZmxhdHRlbih4LCBbXSwgc2tpcFR5cGVkQXJyYXkpO1xuICAgIHJldHVybiBFTkdJTkUubWFrZVRlbnNvcih2YWx1ZXMsIGluZmVycmVkU2hhcGUsIGluZmVycmVkRHR5cGUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUb1RlbnNvckFycmF5KGFyZywgYXJnTmFtZSwgZnVuY3Rpb25OYW1lLCBwYXJzZUFzRHR5cGUgPSAnbnVtZXJpYycpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJnKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFyZ3VtZW50ICR7YXJnTmFtZX0gcGFzc2VkIHRvICR7ZnVuY3Rpb25OYW1lfSBtdXN0IGJlIGEgYCArXG4gICAgICAgICAgICAnYFRlbnNvcltdYCBvciBgVGVuc29yTGlrZVtdYCcpO1xuICAgIH1cbiAgICBjb25zdCB0ZW5zb3JzID0gYXJnO1xuICAgIHJldHVybiB0ZW5zb3JzLm1hcCgodCwgaSkgPT4gY29udmVydFRvVGVuc29yKHQsIGAke2FyZ05hbWV9WyR7aX1dYCwgZnVuY3Rpb25OYW1lLCBwYXJzZUFzRHR5cGUpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRlbnNvcl91dGlsX2Vudi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuL2VuZ2luZSc7XG5pbXBvcnQgeyBpbmZlclNoYXBlIH0gZnJvbSAnLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXJyYXlzRXF1YWwsIGVuY29kZVN0cmluZywgZmxhdHRlbiwgaXNTdHJpbmcsIGlzVHlwZWRBcnJheSB9IGZyb20gJy4vdXRpbCc7XG5jb25zdCBURVNUX0VQU0lMT05fRkxPQVQzMiA9IDFlLTM7XG5leHBvcnQgY29uc3QgVEVTVF9FUFNJTE9OX0ZMT0FUMTYgPSAxZS0xO1xuZXhwb3J0IGZ1bmN0aW9uIGV4cGVjdEFycmF5c0Nsb3NlKGFjdHVhbCwgZXhwZWN0ZWQsIGVwc2lsb24pIHtcbiAgICBpZiAoZXBzaWxvbiA9PSBudWxsKSB7XG4gICAgICAgIGVwc2lsb24gPSB0ZXN0RXBzaWxvbigpO1xuICAgIH1cbiAgICByZXR1cm4gZXhwZWN0QXJyYXlzUHJlZGljYXRlKGFjdHVhbCwgZXhwZWN0ZWQsIChhLCBiKSA9PiBhcmVDbG9zZShhLCBiLCBlcHNpbG9uKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gdGVzdEVwc2lsb24oKSB7XG4gICAgcmV0dXJuIEVOR0lORS5iYWNrZW5kLmZsb2F0UHJlY2lzaW9uKCkgPT09IDMyID8gVEVTVF9FUFNJTE9OX0ZMT0FUMzIgOlxuICAgICAgICBURVNUX0VQU0lMT05fRkxPQVQxNjtcbn1cbmZ1bmN0aW9uIGV4cGVjdEFycmF5c1ByZWRpY2F0ZShhY3R1YWwsIGV4cGVjdGVkLCBwcmVkaWNhdGUpIHtcbiAgICBsZXQgY2hlY2tDbGFzc1R5cGUgPSB0cnVlO1xuICAgIGlmIChpc1R5cGVkQXJyYXkoYWN0dWFsKSB8fCBpc1R5cGVkQXJyYXkoZXhwZWN0ZWQpKSB7XG4gICAgICAgIGNoZWNrQ2xhc3NUeXBlID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChpc1R5cGVkQXJyYXkoYWN0dWFsKSAmJiBpc1R5cGVkQXJyYXkoZXhwZWN0ZWQpKSB7XG4gICAgICAgIGNoZWNrQ2xhc3NUeXBlID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGNoZWNrQ2xhc3NUeXBlKSB7XG4gICAgICAgIGNvbnN0IGFUeXBlID0gYWN0dWFsLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgICAgIGNvbnN0IGJUeXBlID0gZXhwZWN0ZWQuY29uc3RydWN0b3IubmFtZTtcbiAgICAgICAgaWYgKGFUeXBlICE9PSBiVHlwZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBcnJheXMgYXJlIG9mIGRpZmZlcmVudCB0eXBlLiBBY3R1YWw6ICR7YVR5cGV9LiBgICtcbiAgICAgICAgICAgICAgICBgRXhwZWN0ZWQ6ICR7YlR5cGV9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYWN0dWFsKSAmJiBBcnJheS5pc0FycmF5KGV4cGVjdGVkKSkge1xuICAgICAgICBjb25zdCBhY3R1YWxTaGFwZSA9IGluZmVyU2hhcGUoYWN0dWFsKTtcbiAgICAgICAgY29uc3QgZXhwZWN0ZWRTaGFwZSA9IGluZmVyU2hhcGUoZXhwZWN0ZWQpO1xuICAgICAgICBpZiAoIWFycmF5c0VxdWFsKGFjdHVhbFNoYXBlLCBleHBlY3RlZFNoYXBlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBcnJheXMgaGF2ZSBkaWZmZXJlbnQgc2hhcGVzLiBgICtcbiAgICAgICAgICAgICAgICBgQWN0dWFsOiBbJHthY3R1YWxTaGFwZX1dLiBFeHBlY3RlZDogWyR7ZXhwZWN0ZWRTaGFwZX1dYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgYWN0dWFsRmxhdCA9IGlzVHlwZWRBcnJheShhY3R1YWwpID8gYWN0dWFsIDogZmxhdHRlbihhY3R1YWwpO1xuICAgIGNvbnN0IGV4cGVjdGVkRmxhdCA9IGlzVHlwZWRBcnJheShleHBlY3RlZCkgP1xuICAgICAgICBleHBlY3RlZCA6XG4gICAgICAgIGZsYXR0ZW4oZXhwZWN0ZWQpO1xuICAgIGlmIChhY3R1YWxGbGF0Lmxlbmd0aCAhPT0gZXhwZWN0ZWRGbGF0Lmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFycmF5cyBoYXZlIGRpZmZlcmVudCBsZW5ndGhzIGFjdHVhbDogJHthY3R1YWxGbGF0Lmxlbmd0aH0gdnMgYCArXG4gICAgICAgICAgICBgZXhwZWN0ZWQ6ICR7ZXhwZWN0ZWRGbGF0Lmxlbmd0aH0uXFxuYCArXG4gICAgICAgICAgICBgQWN0dWFsOiAgICR7YWN0dWFsRmxhdH0uXFxuYCArXG4gICAgICAgICAgICBgRXhwZWN0ZWQ6ICR7ZXhwZWN0ZWRGbGF0fS5gKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHBlY3RlZEZsYXQubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3QgYSA9IGFjdHVhbEZsYXRbaV07XG4gICAgICAgIGNvbnN0IGUgPSBleHBlY3RlZEZsYXRbaV07XG4gICAgICAgIGlmICghcHJlZGljYXRlKGEsIGUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFycmF5cyBkaWZmZXI6IGFjdHVhbFske2l9XSA9ICR7YX0sIGV4cGVjdGVkWyR7aX1dID0gJHtlfS5cXG5gICtcbiAgICAgICAgICAgICAgICBgQWN0dWFsOiAgICR7YWN0dWFsRmxhdH0uXFxuYCArXG4gICAgICAgICAgICAgICAgYEV4cGVjdGVkOiAke2V4cGVjdGVkRmxhdH0uYCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gZXhwZWN0UHJvbWlzZVRvRmFpbChmbiwgZG9uZSkge1xuICAgIGZuKCkudGhlbigoKSA9PiBkb25lLmZhaWwoKSwgKCkgPT4gZG9uZSgpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3RBcnJheXNFcXVhbChhY3R1YWwsIGV4cGVjdGVkKSB7XG4gICAgY29uc3QgZXhwID0gdHlwZW9mIGV4cGVjdGVkID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgZXhwZWN0ZWQgPT09ICdudW1iZXInIHx8XG4gICAgICAgIHR5cGVvZiBleHBlY3RlZCA9PT0gJ2Jvb2xlYW4nID9cbiAgICAgICAgW2V4cGVjdGVkXSA6XG4gICAgICAgIGV4cGVjdGVkO1xuICAgIGlmIChpc1N0cmluZyhhY3R1YWwpIHx8IGlzU3RyaW5nKGFjdHVhbFswXSkgfHxcbiAgICAgICAgaXNTdHJpbmcoZXhwZWN0ZWQpIHx8IGlzU3RyaW5nKGV4cGVjdGVkWzBdKSkge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHRyaXBsZS1lcXVhbHNcbiAgICAgICAgcmV0dXJuIGV4cGVjdEFycmF5c1ByZWRpY2F0ZShhY3R1YWwsIGV4cCwgKGEsIGIpID0+IGEgPT0gYik7XG4gICAgfVxuICAgIHJldHVybiBleHBlY3RBcnJheXNQcmVkaWNhdGUoYWN0dWFsLCBleHBlY3RlZCwgKGEsIGIpID0+IGFyZUNsb3NlKGEsIGIsIDApKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3ROdW1iZXJzQ2xvc2UoYSwgZSwgZXBzaWxvbikge1xuICAgIGlmIChlcHNpbG9uID09IG51bGwpIHtcbiAgICAgICAgZXBzaWxvbiA9IHRlc3RFcHNpbG9uKCk7XG4gICAgfVxuICAgIGlmICghYXJlQ2xvc2UoYSwgZSwgZXBzaWxvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOdW1iZXJzIGRpZmZlcjogYWN0dWFsID09PSAke2F9LCBleHBlY3RlZCA9PT0gJHtlfWApO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFyZUNsb3NlKGEsIGUsIGVwc2lsb24pIHtcbiAgICBpZiAoIWlzRmluaXRlKGEpICYmICFpc0Zpbml0ZShlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGlzTmFOKGEpIHx8IGlzTmFOKGUpIHx8IE1hdGguYWJzKGEgLSBlKSA+IGVwc2lsb24pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3RWYWx1ZXNJblJhbmdlKGFjdHVhbCwgbG93LCBoaWdoKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhY3R1YWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGFjdHVhbFtpXSA8IGxvdyB8fCBhY3R1YWxbaV0gPiBoaWdoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFZhbHVlIG91dCBvZiByYW5nZToke2FjdHVhbFtpXX0gbG93OiAke2xvd30sIGhpZ2g6ICR7aGlnaH1gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3RBcnJheUJ1ZmZlcnNFcXVhbChhY3R1YWwsIGV4cGVjdGVkKSB7XG4gICAgLy8gU2FmYXJpICYgSmFzbWluZSBkb24ndCBsaWtlIGNvbXBhcmluZyBBcnJheUJ1ZmZlcnMgZGlyZWN0bHkuIFdyYXBwaW5nIGluXG4gICAgLy8gYSBGbG9hdDMyQXJyYXkgc29sdmVzIHRoaXMgaXNzdWUuXG4gICAgZXhwZWN0KG5ldyBGbG9hdDMyQXJyYXkoYWN0dWFsKSkudG9FcXVhbChuZXcgRmxvYXQzMkFycmF5KGV4cGVjdGVkKSk7XG59XG4vKiogRW5jb2RlcyBzdHJpbmdzIGludG8gdXRmLTggYnl0ZXMuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlU3RyaW5ncyhhKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHZhbCA9IGFbaV07XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgICAgIGVuY29kZVN0cmluZ3ModmFsKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGFbaV0gPSBlbmNvZGVTdHJpbmcodmFsKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRlc3RfdXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vLyBTbyB0eXBpbmdzIGNhbiBwcm9wYWdhdGUuXG5pbXBvcnQgeyBBZGFkZWx0YU9wdGltaXplciB9IGZyb20gJy4vb3B0aW1pemVycy9hZGFkZWx0YV9vcHRpbWl6ZXInO1xuaW1wb3J0IHsgQWRhZ3JhZE9wdGltaXplciB9IGZyb20gJy4vb3B0aW1pemVycy9hZGFncmFkX29wdGltaXplcic7XG5pbXBvcnQgeyBBZGFtT3B0aW1pemVyIH0gZnJvbSAnLi9vcHRpbWl6ZXJzL2FkYW1fb3B0aW1pemVyJztcbmltcG9ydCB7IEFkYW1heE9wdGltaXplciB9IGZyb20gJy4vb3B0aW1pemVycy9hZGFtYXhfb3B0aW1pemVyJztcbmltcG9ydCB7IE1vbWVudHVtT3B0aW1pemVyIH0gZnJvbSAnLi9vcHRpbWl6ZXJzL21vbWVudHVtX29wdGltaXplcic7XG5pbXBvcnQgeyBPcHRpbWl6ZXJDb25zdHJ1Y3RvcnMgfSBmcm9tICcuL29wdGltaXplcnMvb3B0aW1pemVyX2NvbnN0cnVjdG9ycyc7XG5pbXBvcnQgeyBSTVNQcm9wT3B0aW1pemVyIH0gZnJvbSAnLi9vcHRpbWl6ZXJzL3Jtc3Byb3Bfb3B0aW1pemVyJztcbmltcG9ydCB7IFNHRE9wdGltaXplciB9IGZyb20gJy4vb3B0aW1pemVycy9zZ2Rfb3B0aW1pemVyJztcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bnVzZWQtZXhwcmVzc2lvblxuW01vbWVudHVtT3B0aW1pemVyLCBTR0RPcHRpbWl6ZXIsIEFkYWRlbHRhT3B0aW1pemVyLCBBZGFncmFkT3B0aW1pemVyLFxuICAgIFJNU1Byb3BPcHRpbWl6ZXIsIEFkYW1heE9wdGltaXplciwgQWRhbU9wdGltaXplcl07XG5leHBvcnQgY29uc3QgdHJhaW4gPSB7XG4gICAgc2dkOiBPcHRpbWl6ZXJDb25zdHJ1Y3RvcnMuc2dkLFxuICAgIG1vbWVudHVtOiBPcHRpbWl6ZXJDb25zdHJ1Y3RvcnMubW9tZW50dW0sXG4gICAgYWRhZGVsdGE6IE9wdGltaXplckNvbnN0cnVjdG9ycy5hZGFkZWx0YSxcbiAgICBhZGFncmFkOiBPcHRpbWl6ZXJDb25zdHJ1Y3RvcnMuYWRhZ3JhZCxcbiAgICBybXNwcm9wOiBPcHRpbWl6ZXJDb25zdHJ1Y3RvcnMucm1zcHJvcCxcbiAgICBhZGFtYXg6IE9wdGltaXplckNvbnN0cnVjdG9ycy5hZGFtYXgsXG4gICAgYWRhbTogT3B0aW1pemVyQ29uc3RydWN0b3JzLmFkYW1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD10cmFpbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5leHBvcnQgdmFyIFJhbms7XG4oZnVuY3Rpb24gKFJhbmspIHtcbiAgICBSYW5rW1wiUjBcIl0gPSBcIlIwXCI7XG4gICAgUmFua1tcIlIxXCJdID0gXCJSMVwiO1xuICAgIFJhbmtbXCJSMlwiXSA9IFwiUjJcIjtcbiAgICBSYW5rW1wiUjNcIl0gPSBcIlIzXCI7XG4gICAgUmFua1tcIlI0XCJdID0gXCJSNFwiO1xuICAgIFJhbmtbXCJSNVwiXSA9IFwiUjVcIjtcbiAgICBSYW5rW1wiUjZcIl0gPSBcIlI2XCI7XG59KShSYW5rIHx8IChSYW5rID0ge30pKTtcbi8vIExvb2tzIGZvciB1cGNhc3RpbmcgdHlwZXMuIFVzZWQsIGZvciBleGFtcGxlLCBpbiBvcGVyYXRpb25zIHdpdGggbWl4ZWQgZHR5cGVcbi8vIGlucHV0cy5cbnZhciBVcGNhc3RJbnQzMkFuZE1hcDtcbihmdW5jdGlvbiAoVXBjYXN0SW50MzJBbmRNYXApIHtcbiAgICBVcGNhc3RJbnQzMkFuZE1hcFtcImZsb2F0MzJcIl0gPSBcImZsb2F0MzJcIjtcbiAgICBVcGNhc3RJbnQzMkFuZE1hcFtcImludDMyXCJdID0gXCJpbnQzMlwiO1xuICAgIFVwY2FzdEludDMyQW5kTWFwW1wiYm9vbFwiXSA9IFwiaW50MzJcIjtcbiAgICBVcGNhc3RJbnQzMkFuZE1hcFtcImNvbXBsZXg2NFwiXSA9IFwiY29tcGxleDY0XCI7XG59KShVcGNhc3RJbnQzMkFuZE1hcCB8fCAoVXBjYXN0SW50MzJBbmRNYXAgPSB7fSkpO1xudmFyIFVwY2FzdEJvb2xBbmRNYXA7XG4oZnVuY3Rpb24gKFVwY2FzdEJvb2xBbmRNYXApIHtcbiAgICBVcGNhc3RCb29sQW5kTWFwW1wiZmxvYXQzMlwiXSA9IFwiZmxvYXQzMlwiO1xuICAgIFVwY2FzdEJvb2xBbmRNYXBbXCJpbnQzMlwiXSA9IFwiaW50MzJcIjtcbiAgICBVcGNhc3RCb29sQW5kTWFwW1wiYm9vbFwiXSA9IFwiYm9vbFwiO1xuICAgIFVwY2FzdEJvb2xBbmRNYXBbXCJjb21wbGV4NjRcIl0gPSBcImNvbXBsZXg2NFwiO1xufSkoVXBjYXN0Qm9vbEFuZE1hcCB8fCAoVXBjYXN0Qm9vbEFuZE1hcCA9IHt9KSk7XG52YXIgVXBjYXN0RmxvYXQzMkFuZE1hcDtcbihmdW5jdGlvbiAoVXBjYXN0RmxvYXQzMkFuZE1hcCkge1xuICAgIFVwY2FzdEZsb2F0MzJBbmRNYXBbXCJmbG9hdDMyXCJdID0gXCJmbG9hdDMyXCI7XG4gICAgVXBjYXN0RmxvYXQzMkFuZE1hcFtcImludDMyXCJdID0gXCJmbG9hdDMyXCI7XG4gICAgVXBjYXN0RmxvYXQzMkFuZE1hcFtcImJvb2xcIl0gPSBcImZsb2F0MzJcIjtcbiAgICBVcGNhc3RGbG9hdDMyQW5kTWFwW1wiY29tcGxleDY0XCJdID0gXCJjb21wbGV4NjRcIjtcbn0pKFVwY2FzdEZsb2F0MzJBbmRNYXAgfHwgKFVwY2FzdEZsb2F0MzJBbmRNYXAgPSB7fSkpO1xudmFyIFVwY2FzdENvbXBsZXg2NEFuZE1hcDtcbihmdW5jdGlvbiAoVXBjYXN0Q29tcGxleDY0QW5kTWFwKSB7XG4gICAgVXBjYXN0Q29tcGxleDY0QW5kTWFwW1wiZmxvYXQzMlwiXSA9IFwiY29tcGxleDY0XCI7XG4gICAgVXBjYXN0Q29tcGxleDY0QW5kTWFwW1wiaW50MzJcIl0gPSBcImNvbXBsZXg2NFwiO1xuICAgIFVwY2FzdENvbXBsZXg2NEFuZE1hcFtcImJvb2xcIl0gPSBcImNvbXBsZXg2NFwiO1xuICAgIFVwY2FzdENvbXBsZXg2NEFuZE1hcFtcImNvbXBsZXg2NFwiXSA9IFwiY29tcGxleDY0XCI7XG59KShVcGNhc3RDb21wbGV4NjRBbmRNYXAgfHwgKFVwY2FzdENvbXBsZXg2NEFuZE1hcCA9IHt9KSk7XG5jb25zdCB1cGNhc3RUeXBlTWFwID0ge1xuICAgICdmbG9hdDMyJzogVXBjYXN0RmxvYXQzMkFuZE1hcCxcbiAgICAnaW50MzInOiBVcGNhc3RJbnQzMkFuZE1hcCxcbiAgICAnYm9vbCc6IFVwY2FzdEJvb2xBbmRNYXAsXG4gICAgJ2NvbXBsZXg2NCc6IFVwY2FzdENvbXBsZXg2NEFuZE1hcFxufTtcbmV4cG9ydCBmdW5jdGlvbiB1cGNhc3RUeXBlKHR5cGVBLCB0eXBlQikge1xuICAgIGlmICh0eXBlQSA9PT0gJ3N0cmluZycgfHwgdHlwZUIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmICh0eXBlQSA9PT0gJ3N0cmluZycgJiYgdHlwZUIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3N0cmluZyc7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4gbm90IHVwY2FzdCAke3R5cGVBfSB3aXRoICR7dHlwZUJ9YCk7XG4gICAgfVxuICAgIHJldHVybiB1cGNhc3RUeXBlTWFwW3R5cGVBXVt0eXBlQl07XG59XG4vKiogUmV0dXJucyB0aGUgb3V0cHV0IHR5cGUgYWZ0ZXIgc3VtbWF0aW9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1bU91dFR5cGUodHlwZSkge1xuICAgIHJldHVybiB1cGNhc3RUeXBlKHR5cGUsICdpbnQzMicpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHlwZXMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgKiBhcyBiYXNlIGZyb20gJy4vdXRpbF9iYXNlJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbF9iYXNlJztcbmV4cG9ydCAqIGZyb20gJy4vaGFzaF91dGlsJztcbi8qKlxuICogQ3JlYXRlIHR5cGVkIGFycmF5IGZvciBzY2FsYXIgdmFsdWUuIFVzZWQgZm9yIHN0b3JpbmcgaW4gYERhdGFTdG9yYWdlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNjYWxhclZhbHVlKHZhbHVlLCBkdHlwZSkge1xuICAgIGlmIChkdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGVuY29kZVN0cmluZyh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB0b1R5cGVkQXJyYXkoW3ZhbHVlXSwgZHR5cGUpO1xufVxuZnVuY3Rpb24gbm9Db252ZXJzaW9uTmVlZGVkKGEsIGR0eXBlKSB7XG4gICAgcmV0dXJuIChhIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5ICYmIGR0eXBlID09PSAnZmxvYXQzMicpIHx8XG4gICAgICAgIChhIGluc3RhbmNlb2YgSW50MzJBcnJheSAmJiBkdHlwZSA9PT0gJ2ludDMyJykgfHxcbiAgICAgICAgKGEgaW5zdGFuY2VvZiBVaW50OEFycmF5ICYmIGR0eXBlID09PSAnYm9vbCcpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRvVHlwZWRBcnJheShhLCBkdHlwZSkge1xuICAgIGlmIChkdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29udmVydCBhIHN0cmluZ1tdIHRvIGEgVHlwZWRBcnJheScpO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgICBhID0gYmFzZS5mbGF0dGVuKGEpO1xuICAgIH1cbiAgICBpZiAoZW52KCkuZ2V0Qm9vbCgnREVCVUcnKSkge1xuICAgICAgICBiYXNlLmNoZWNrQ29udmVyc2lvbkZvckVycm9ycyhhLCBkdHlwZSk7XG4gICAgfVxuICAgIGlmIChub0NvbnZlcnNpb25OZWVkZWQoYSwgZHR5cGUpKSB7XG4gICAgICAgIHJldHVybiBhO1xuICAgIH1cbiAgICBpZiAoZHR5cGUgPT0gbnVsbCB8fCBkdHlwZSA9PT0gJ2Zsb2F0MzInIHx8IGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheShhKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZHR5cGUgPT09ICdpbnQzMicpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnQzMkFycmF5KGEpO1xuICAgIH1cbiAgICBlbHNlIGlmIChkdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgICAgIGNvbnN0IGJvb2wgPSBuZXcgVWludDhBcnJheShhLmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYm9vbC5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKE1hdGgucm91bmQoYVtpXSkgIT09IDApIHtcbiAgICAgICAgICAgICAgICBib29sW2ldID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYm9vbDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBkYXRhIHR5cGUgJHtkdHlwZX1gKTtcbiAgICB9XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGN1cnJlbnQgaGlnaC1yZXNvbHV0aW9uIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHJlbGF0aXZlIHRvIGFuXG4gKiBhcmJpdHJhcnkgdGltZSBpbiB0aGUgcGFzdC4gSXQgd29ya3MgYWNyb3NzIGRpZmZlcmVudCBwbGF0Zm9ybXMgKG5vZGUuanMsXG4gKiBicm93c2VycykuXG4gKlxuICogYGBganNcbiAqIGNvbnNvbGUubG9nKHRmLnV0aWwubm93KCkpO1xuICogYGBgXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1V0aWwnLCBuYW1lc3BhY2U6ICd1dGlsJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vdygpIHtcbiAgICByZXR1cm4gZW52KCkucGxhdGZvcm0ubm93KCk7XG59XG4vKipcbiAqIFJldHVybnMgYSBwbGF0Zm9ybS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZlxuICogW2BmZXRjaGBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GZXRjaF9BUEkpLlxuICpcbiAqIElmIGBmZXRjaGAgaXMgZGVmaW5lZCBvbiB0aGUgZ2xvYmFsIG9iamVjdCAoYHdpbmRvd2AsIGBwcm9jZXNzYCwgZXRjLiksXG4gKiBgdGYudXRpbC5mZXRjaGAgcmV0dXJucyB0aGF0IGZ1bmN0aW9uLlxuICpcbiAqIElmIG5vdCwgYHRmLnV0aWwuZmV0Y2hgIHJldHVybnMgYSBwbGF0Zm9ybS1zcGVjaWZpYyBzb2x1dGlvbi5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgcmVzb3VyY2UgPSBhd2FpdCB0Zi51dGlsLmZldGNoKCdodHRwczovL3VucGtnLmNvbS9AdGVuc29yZmxvdy90ZmpzJyk7XG4gKiAvLyBoYW5kbGUgcmVzcG9uc2VcbiAqIGBgYFxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdVdGlsJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZldGNoKHBhdGgsIHJlcXVlc3RJbml0cykge1xuICAgIHJldHVybiBlbnYoKS5wbGF0Zm9ybS5mZXRjaChwYXRoLCByZXF1ZXN0SW5pdHMpO1xufVxuLyoqXG4gKiBFbmNvZGVzIHRoZSBwcm92aWRlZCBzdHJpbmcgaW50byBieXRlcyB1c2luZyB0aGUgcHJvdmlkZWQgZW5jb2Rpbmcgc2NoZW1lLlxuICpcbiAqIEBwYXJhbSBzIFRoZSBzdHJpbmcgdG8gZW5jb2RlLlxuICogQHBhcmFtIGVuY29kaW5nIFRoZSBlbmNvZGluZyBzY2hlbWUuIERlZmF1bHRzIHRvIHV0Zi04LlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdVdGlsJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVN0cmluZyhzLCBlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICBlbmNvZGluZyA9IGVuY29kaW5nIHx8ICd1dGYtOCc7XG4gICAgcmV0dXJuIGVudigpLnBsYXRmb3JtLmVuY29kZShzLCBlbmNvZGluZyk7XG59XG4vKipcbiAqIERlY29kZXMgdGhlIHByb3ZpZGVkIGJ5dGVzIGludG8gYSBzdHJpbmcgdXNpbmcgdGhlIHByb3ZpZGVkIGVuY29kaW5nIHNjaGVtZS5cbiAqIEBwYXJhbSBieXRlcyBUaGUgYnl0ZXMgdG8gZGVjb2RlLlxuICpcbiAqIEBwYXJhbSBlbmNvZGluZyBUaGUgZW5jb2Rpbmcgc2NoZW1lLiBEZWZhdWx0cyB0byB1dGYtOC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVXRpbCd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVTdHJpbmcoYnl0ZXMsIGVuY29kaW5nID0gJ3V0Zi04Jykge1xuICAgIGVuY29kaW5nID0gZW5jb2RpbmcgfHwgJ3V0Zi04JztcbiAgICByZXR1cm4gZW52KCkucGxhdGZvcm0uZGVjb2RlKGJ5dGVzLCBlbmNvZGluZyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qKlxuICogU2h1ZmZsZXMgdGhlIGFycmF5IGluLXBsYWNlIHVzaW5nIEZpc2hlci1ZYXRlcyBhbGdvcml0aG0uXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSBbMSwgMiwgMywgNCwgNV07XG4gKiB0Zi51dGlsLnNodWZmbGUoYSk7XG4gKiBjb25zb2xlLmxvZyhhKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhcnJheSBUaGUgYXJyYXkgdG8gc2h1ZmZsZSBpbi1wbGFjZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVXRpbCcsIG5hbWVzcGFjZTogJ3V0aWwnfVxuICovXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG5leHBvcnQgZnVuY3Rpb24gc2h1ZmZsZShhcnJheSkge1xuICAgIGxldCBjb3VudGVyID0gYXJyYXkubGVuZ3RoO1xuICAgIGxldCBpbmRleCA9IDA7XG4gICAgLy8gV2hpbGUgdGhlcmUgYXJlIGVsZW1lbnRzIGluIHRoZSBhcnJheVxuICAgIHdoaWxlIChjb3VudGVyID4gMCkge1xuICAgICAgICAvLyBQaWNrIGEgcmFuZG9tIGluZGV4XG4gICAgICAgIGluZGV4ID0gKE1hdGgucmFuZG9tKCkgKiBjb3VudGVyKSB8IDA7XG4gICAgICAgIC8vIERlY3JlYXNlIGNvdW50ZXIgYnkgMVxuICAgICAgICBjb3VudGVyLS07XG4gICAgICAgIC8vIEFuZCBzd2FwIHRoZSBsYXN0IGVsZW1lbnQgd2l0aCBpdFxuICAgICAgICBzd2FwKGFycmF5LCBjb3VudGVyLCBpbmRleCk7XG4gICAgfVxufVxuLyoqXG4gKiBTaHVmZmxlcyB0d28gYXJyYXlzIGluLXBsYWNlIHRoZSBzYW1lIHdheSB1c2luZyBGaXNoZXItWWF0ZXMgYWxnb3JpdGhtLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gWzEsMiwzLDQsNV07XG4gKiBjb25zdCBiID0gWzExLDIyLDMzLDQ0LDU1XTtcbiAqIHRmLnV0aWwuc2h1ZmZsZUNvbWJvKGEsIGIpO1xuICogY29uc29sZS5sb2coYSwgYik7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYXJyYXkgVGhlIGZpcnN0IGFycmF5IHRvIHNodWZmbGUgaW4tcGxhY2UuXG4gKiBAcGFyYW0gYXJyYXkyIFRoZSBzZWNvbmQgYXJyYXkgdG8gc2h1ZmZsZSBpbi1wbGFjZSB3aXRoIHRoZSBzYW1lIHBlcm11dGF0aW9uXG4gKiAgICAgYXMgdGhlIGZpcnN0IGFycmF5LlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdVdGlsJywgbmFtZXNwYWNlOiAndXRpbCd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaHVmZmxlQ29tYm8oXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG5hcnJheSwgXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG5hcnJheTIpIHtcbiAgICBpZiAoYXJyYXkubGVuZ3RoICE9PSBhcnJheTIubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQXJyYXkgc2l6ZXMgbXVzdCBtYXRjaCB0byBiZSBzaHVmZmxlZCB0b2dldGhlciBgICtcbiAgICAgICAgICAgIGBGaXJzdCBhcnJheSBsZW5ndGggd2FzICR7YXJyYXkubGVuZ3RofWAgK1xuICAgICAgICAgICAgYFNlY29uZCBhcnJheSBsZW5ndGggd2FzICR7YXJyYXkyLmxlbmd0aH1gKTtcbiAgICB9XG4gICAgbGV0IGNvdW50ZXIgPSBhcnJheS5sZW5ndGg7XG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICAvLyBXaGlsZSB0aGVyZSBhcmUgZWxlbWVudHMgaW4gdGhlIGFycmF5XG4gICAgd2hpbGUgKGNvdW50ZXIgPiAwKSB7XG4gICAgICAgIC8vIFBpY2sgYSByYW5kb20gaW5kZXhcbiAgICAgICAgaW5kZXggPSAoTWF0aC5yYW5kb20oKSAqIGNvdW50ZXIpIHwgMDtcbiAgICAgICAgLy8gRGVjcmVhc2UgY291bnRlciBieSAxXG4gICAgICAgIGNvdW50ZXItLTtcbiAgICAgICAgLy8gQW5kIHN3YXAgdGhlIGxhc3QgZWxlbWVudCBvZiBlYWNoIGFycmF5IHdpdGggaXRcbiAgICAgICAgc3dhcChhcnJheSwgY291bnRlciwgaW5kZXgpO1xuICAgICAgICBzd2FwKGFycmF5MiwgY291bnRlciwgaW5kZXgpO1xuICAgIH1cbn1cbi8qKiBDbGFtcHMgYSB2YWx1ZSB0byBhIHNwZWNpZmllZCByYW5nZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFtcChtaW4sIHgsIG1heCkge1xuICAgIHJldHVybiBNYXRoLm1heChtaW4sIE1hdGgubWluKHgsIG1heCkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG5lYXJlc3RMYXJnZXJFdmVuKHZhbCkge1xuICAgIHJldHVybiB2YWwgJSAyID09PSAwID8gdmFsIDogdmFsICsgMTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzd2FwKG9iamVjdCwgbGVmdCwgcmlnaHQpIHtcbiAgICBjb25zdCB0ZW1wID0gb2JqZWN0W2xlZnRdO1xuICAgIG9iamVjdFtsZWZ0XSA9IG9iamVjdFtyaWdodF07XG4gICAgb2JqZWN0W3JpZ2h0XSA9IHRlbXA7XG59XG5leHBvcnQgZnVuY3Rpb24gc3VtKGFycikge1xuICAgIGxldCBzdW0gPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHN1bSArPSBhcnJbaV07XG4gICAgfVxuICAgIHJldHVybiBzdW07XG59XG4vKipcbiAqIFJldHVybnMgYSBzYW1wbGUgZnJvbSBhIHVuaWZvcm0gW2EsIGIpIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiBAcGFyYW0gYSBUaGUgbWluaW11bSBzdXBwb3J0IChpbmNsdXNpdmUpLlxuICogQHBhcmFtIGIgVGhlIG1heGltdW0gc3VwcG9ydCAoZXhjbHVzaXZlKS5cbiAqIEByZXR1cm4gQSBwc2V1ZG9yYW5kb20gbnVtYmVyIG9uIHRoZSBoYWxmLW9wZW4gaW50ZXJ2YWwgW2EsYikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYW5kVW5pZm9ybShhLCBiKSB7XG4gICAgY29uc3QgciA9IE1hdGgucmFuZG9tKCk7XG4gICAgcmV0dXJuIChiICogcikgKyAoMSAtIHIpICogYTtcbn1cbi8qKiBSZXR1cm5zIHRoZSBzcXVhcmVkIEV1Y2xpZGVhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWN0b3JzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc3RTcXVhcmVkKGEsIGIpIHtcbiAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgZGlmZiA9IE51bWJlcihhW2ldKSAtIE51bWJlcihiW2ldKTtcbiAgICAgICAgcmVzdWx0ICs9IGRpZmYgKiBkaWZmO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgdGhlIGV4cHJlc3Npb24gaXMgdHJ1ZS4gT3RoZXJ3aXNlIHRocm93cyBhbiBlcnJvciB3aXRoIHRoZVxuICogcHJvdmlkZWQgbWVzc2FnZS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IDI7XG4gKiB0Zi51dGlsLmFzc2VydCh4ID09PSAyLCAneCBpcyBub3QgMicpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGV4cHIgVGhlIGV4cHJlc3Npb24gdG8gYXNzZXJ0IChhcyBhIGJvb2xlYW4pLlxuICogQHBhcmFtIG1zZyBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbWVzc2FnZSB0byByZXBvcnQgd2hlbiB0aHJvd2luZyBhblxuICogICAgIGVycm9yLiBXZSB1c2UgYSBmdW5jdGlvbiBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVXRpbCcsIG5hbWVzcGFjZTogJ3V0aWwnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0KGV4cHIsIG1zZykge1xuICAgIGlmICghZXhwcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IodHlwZW9mIG1zZyA9PT0gJ3N0cmluZycgPyBtc2cgOiBtc2coKSk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFNoYXBlc01hdGNoKHNoYXBlQSwgc2hhcGVCLCBlcnJvck1lc3NhZ2VQcmVmaXggPSAnJykge1xuICAgIGFzc2VydChhcnJheXNFcXVhbChzaGFwZUEsIHNoYXBlQiksICgpID0+IGVycm9yTWVzc2FnZVByZWZpeCArIGAgU2hhcGVzICR7c2hhcGVBfSBhbmQgJHtzaGFwZUJ9IG11c3QgbWF0Y2hgKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnROb25OdWxsKGEpIHtcbiAgICBhc3NlcnQoYSAhPSBudWxsLCAoKSA9PiBgVGhlIGlucHV0IHRvIHRoZSB0ZW5zb3IgY29uc3RydWN0b3IgbXVzdCBiZSBhIG5vbi1udWxsIHZhbHVlLmApO1xufVxuLy8gTk9URTogV2UgZXhwbGljaXRseSB0eXBlIG91dCB3aGF0IFQgZXh0ZW5kcyBpbnN0ZWFkIG9mIGFueSBzbyB0aGF0XG4vLyB1dGlsLmZsYXR0ZW4gb24gYSBuZXN0ZWQgYXJyYXkgb2YgbnVtYmVyIGRvZXNuJ3QgdHJ5IHRvIGluZmVyIFQgYXMgYVxuLy8gbnVtYmVyW11bXSwgY2F1c2luZyB1cyB0byBleHBsaWNpdGx5IHR5cGUgdXRpbC5mbGF0dGVuPG51bWJlcj4oKS5cbi8qKlxuICogIEZsYXR0ZW5zIGFuIGFyYml0cmFyaWx5IG5lc3RlZCBhcnJheS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IFtbMSwgMl0sIFszLCA0XSwgWzUsIFs2LCBbN11dXV07XG4gKiBjb25zdCBmbGF0ID0gdGYudXRpbC5mbGF0dGVuKGEpO1xuICogY29uc29sZS5sb2coZmxhdCk7XG4gKiBgYGBcbiAqXG4gKiAgQHBhcmFtIGFyciBUaGUgbmVzdGVkIGFycmF5IHRvIGZsYXR0ZW4uXG4gKiAgQHBhcmFtIHJlc3VsdCBUaGUgZGVzdGluYXRpb24gYXJyYXkgd2hpY2ggaG9sZHMgdGhlIGVsZW1lbnRzLlxuICogIEBwYXJhbSBza2lwVHlwZWRBcnJheSBJZiB0cnVlLCBhdm9pZHMgZmxhdHRlbmluZyB0aGUgdHlwZWQgYXJyYXlzLiBEZWZhdWx0c1xuICogICAgICB0byBmYWxzZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVXRpbCcsIG5hbWVzcGFjZTogJ3V0aWwnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZmxhdHRlbihhcnIsIHJlc3VsdCA9IFtdLCBza2lwVHlwZWRBcnJheSA9IGZhbHNlKSB7XG4gICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7XG4gICAgICAgIHJlc3VsdCA9IFtdO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcnIpIHx8IGlzVHlwZWRBcnJheShhcnIpICYmICFza2lwVHlwZWRBcnJheSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgZmxhdHRlbihhcnJbaV0sIHJlc3VsdCwgc2tpcFR5cGVkQXJyYXkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXN1bHQucHVzaChhcnIpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzaXplIChudW1iZXIgb2YgZWxlbWVudHMpIG9mIHRoZSB0ZW5zb3IgZ2l2ZW4gaXRzIHNoYXBlLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBzaGFwZSA9IFszLCA0LCAyXTtcbiAqIGNvbnN0IHNpemUgPSB0Zi51dGlsLnNpemVGcm9tU2hhcGUoc2hhcGUpO1xuICogY29uc29sZS5sb2coc2l6ZSk7XG4gKiBgYGBcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVXRpbCcsIG5hbWVzcGFjZTogJ3V0aWwnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2l6ZUZyb21TaGFwZShzaGFwZSkge1xuICAgIGlmIChzaGFwZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gU2NhbGFyLlxuICAgICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgbGV0IHNpemUgPSBzaGFwZVswXTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHNoYXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHNpemUgKj0gc2hhcGVbaV07XG4gICAgfVxuICAgIHJldHVybiBzaXplO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzU2NhbGFyU2hhcGUoc2hhcGUpIHtcbiAgICByZXR1cm4gc2hhcGUubGVuZ3RoID09PSAwO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFycmF5c0VxdWFsKG4xLCBuMikge1xuICAgIGlmIChuMSA9PT0gbjIpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChuMSA9PSBudWxsIHx8IG4yID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobjEubGVuZ3RoICE9PSBuMi5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG4xLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChuMVtpXSAhPT0gbjJbaV0pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0ludChhKSB7XG4gICAgcmV0dXJuIGEgJSAxID09PSAwO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRhbmgoeCkge1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICBpZiAoTWF0aC50YW5oICE9IG51bGwpIHtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgICAgICByZXR1cm4gTWF0aC50YW5oKHgpO1xuICAgIH1cbiAgICBpZiAoeCA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIGVsc2UgaWYgKHggPT09IC1JbmZpbml0eSkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBlMnggPSBNYXRoLmV4cCgyICogeCk7XG4gICAgICAgIHJldHVybiAoZTJ4IC0gMSkgLyAoZTJ4ICsgMSk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHNpemVUb1NxdWFyaXNoU2hhcGUoc2l6ZSkge1xuICAgIGNvbnN0IHdpZHRoID0gTWF0aC5jZWlsKE1hdGguc3FydChzaXplKSk7XG4gICAgcmV0dXJuIFt3aWR0aCwgTWF0aC5jZWlsKHNpemUgLyB3aWR0aCldO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGFycmF5IHdpdGggcmFuZG9taXplZCBpbmRpY2llcyB0byBhIGdpdmVuIHF1YW50aXR5LlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCByYW5kb21UZW4gPSB0Zi51dGlsLmNyZWF0ZVNodWZmbGVkSW5kaWNlcygxMCk7XG4gKiBjb25zb2xlLmxvZyhyYW5kb21UZW4pO1xuICogYGBgXG4gKlxuICogQHBhcmFtIG51bWJlciBRdWFudGl0eSBvZiBob3cgbWFueSBzaHVmZmxlZCBpbmRpY2llcyB0byBjcmVhdGUuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1V0aWwnLCBuYW1lc3BhY2U6ICd1dGlsJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNodWZmbGVkSW5kaWNlcyhuKSB7XG4gICAgY29uc3Qgc2h1ZmZsZWRJbmRpY2VzID0gbmV3IFVpbnQzMkFycmF5KG4pO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIHNodWZmbGVkSW5kaWNlc1tpXSA9IGk7XG4gICAgfVxuICAgIHNodWZmbGUoc2h1ZmZsZWRJbmRpY2VzKTtcbiAgICByZXR1cm4gc2h1ZmZsZWRJbmRpY2VzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJpZ2h0UGFkKGEsIHNpemUpIHtcbiAgICBpZiAoc2l6ZSA8PSBhLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gYTtcbiAgICB9XG4gICAgcmV0dXJuIGEgKyAnICcucmVwZWF0KHNpemUgLSBhLmxlbmd0aCk7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVwZWF0ZWRUcnkoY2hlY2tGbiwgZGVsYXlGbiA9IChjb3VudGVyKSA9PiAwLCBtYXhDb3VudGVyKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgbGV0IHRyeUNvdW50ID0gMDtcbiAgICAgICAgY29uc3QgdHJ5Rm4gPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoY2hlY2tGbigpKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeUNvdW50Kys7XG4gICAgICAgICAgICBjb25zdCBuZXh0QmFja29mZiA9IGRlbGF5Rm4odHJ5Q291bnQpO1xuICAgICAgICAgICAgaWYgKG1heENvdW50ZXIgIT0gbnVsbCAmJiB0cnlDb3VudCA+PSBtYXhDb3VudGVyKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0VGltZW91dCh0cnlGbiwgbmV4dEJhY2tvZmYpO1xuICAgICAgICB9O1xuICAgICAgICB0cnlGbigpO1xuICAgIH0pO1xufVxuLyoqXG4gKiBHaXZlbiB0aGUgZnVsbCBzaXplIG9mIHRoZSBhcnJheSBhbmQgYSBzaGFwZSB0aGF0IG1heSBjb250YWluIC0xIGFzIHRoZVxuICogaW1wbGljaXQgZGltZW5zaW9uLCByZXR1cm5zIHRoZSBpbmZlcnJlZCBzaGFwZSB3aGVyZSAtMSBpcyByZXBsYWNlZC5cbiAqIEUuZy4gRm9yIHNoYXBlPVsyLCAtMSwgM10gYW5kIHNpemU9MjQsIGl0IHdpbGwgcmV0dXJuIFsyLCA0LCAzXS5cbiAqXG4gKiBAcGFyYW0gc2hhcGUgVGhlIHNoYXBlLCB3aGljaCBtYXkgY29udGFpbiAtMSBpbiBzb21lIGRpbWVuc2lvbi5cbiAqIEBwYXJhbSBzaXplIFRoZSBmdWxsIHNpemUgKG51bWJlciBvZiBlbGVtZW50cykgb2YgdGhlIGFycmF5LlxuICogQHJldHVybiBUaGUgaW5mZXJyZWQgc2hhcGUgd2hlcmUgLTEgaXMgcmVwbGFjZWQgd2l0aCB0aGUgaW5mZXJyZWQgc2l6ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluZmVyRnJvbUltcGxpY2l0U2hhcGUoc2hhcGUsIHNpemUpIHtcbiAgICBsZXQgc2hhcGVQcm9kID0gMTtcbiAgICBsZXQgaW1wbGljaXRJZHggPSAtMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNoYXBlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmIChzaGFwZVtpXSA+PSAwKSB7XG4gICAgICAgICAgICBzaGFwZVByb2QgKj0gc2hhcGVbaV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc2hhcGVbaV0gPT09IC0xKSB7XG4gICAgICAgICAgICBpZiAoaW1wbGljaXRJZHggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoYFNoYXBlcyBjYW4gb25seSBoYXZlIDEgaW1wbGljaXQgc2l6ZS4gYCArXG4gICAgICAgICAgICAgICAgICAgIGBGb3VuZCAtMSBhdCBkaW0gJHtpbXBsaWNpdElkeH0gYW5kIGRpbSAke2l9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbXBsaWNpdElkeCA9IGk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc2hhcGVbaV0gPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcihgU2hhcGVzIGNhbiBub3QgYmUgPCAwLiBGb3VuZCAke3NoYXBlW2ldfSBhdCBkaW0gJHtpfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpbXBsaWNpdElkeCA9PT0gLTEpIHtcbiAgICAgICAgaWYgKHNpemUgPiAwICYmIHNpemUgIT09IHNoYXBlUHJvZCkge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoYFNpemUoJHtzaXplfSkgbXVzdCBtYXRjaCB0aGUgcHJvZHVjdCBvZiBzaGFwZSAke3NoYXBlfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaGFwZTtcbiAgICB9XG4gICAgaWYgKHNoYXBlUHJvZCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBFcnJvcihgQ2Fubm90IGluZmVyIHRoZSBtaXNzaW5nIHNpemUgaW4gWyR7c2hhcGV9XSB3aGVuIGAgK1xuICAgICAgICAgICAgYHRoZXJlIGFyZSAwIGVsZW1lbnRzYCk7XG4gICAgfVxuICAgIGlmIChzaXplICUgc2hhcGVQcm9kICE9PSAwKSB7XG4gICAgICAgIHRocm93IEVycm9yKGBUaGUgaW1wbGljaXQgc2hhcGUgY2FuJ3QgYmUgYSBmcmFjdGlvbmFsIG51bWJlci4gYCArXG4gICAgICAgICAgICBgR290ICR7c2l6ZX0gLyAke3NoYXBlUHJvZH1gKTtcbiAgICB9XG4gICAgY29uc3QgbmV3U2hhcGUgPSBzaGFwZS5zbGljZSgpO1xuICAgIG5ld1NoYXBlW2ltcGxpY2l0SWR4XSA9IHNpemUgLyBzaGFwZVByb2Q7XG4gICAgcmV0dXJuIG5ld1NoYXBlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQXhpc1BhcmFtKGF4aXMsIHNoYXBlKSB7XG4gICAgY29uc3QgcmFuayA9IHNoYXBlLmxlbmd0aDtcbiAgICAvLyBOb3JtYWxpemUgaW5wdXRcbiAgICBheGlzID0gYXhpcyA9PSBudWxsID8gc2hhcGUubWFwKChzLCBpKSA9PiBpKSA6IFtdLmNvbmNhdChheGlzKTtcbiAgICAvLyBDaGVjayBmb3IgdmFsaWQgcmFuZ2VcbiAgICBhc3NlcnQoYXhpcy5ldmVyeShheCA9PiBheCA+PSAtcmFuayAmJiBheCA8IHJhbmspLCAoKSA9PiBgQWxsIHZhbHVlcyBpbiBheGlzIHBhcmFtIG11c3QgYmUgaW4gcmFuZ2UgWy0ke3Jhbmt9LCAke3Jhbmt9KSBidXQgYCArXG4gICAgICAgIGBnb3QgYXhpcyAke2F4aXN9YCk7XG4gICAgLy8gQ2hlY2sgZm9yIG9ubHkgaW50ZWdlcnNcbiAgICBhc3NlcnQoYXhpcy5ldmVyeShheCA9PiBpc0ludChheCkpLCAoKSA9PiBgQWxsIHZhbHVlcyBpbiBheGlzIHBhcmFtIG11c3QgYmUgaW50ZWdlcnMgYnV0IGAgK1xuICAgICAgICBgZ290IGF4aXMgJHtheGlzfWApO1xuICAgIC8vIEhhbmRsZSBuZWdhdGl2ZSBheGlzLlxuICAgIHJldHVybiBheGlzLm1hcChhID0+IGEgPCAwID8gcmFuayArIGEgOiBhKTtcbn1cbi8qKiBSZWR1Y2VzIHRoZSBzaGFwZSBieSByZW1vdmluZyBhbGwgZGltZW5zaW9ucyBvZiBzaGFwZSAxLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNxdWVlemVTaGFwZShzaGFwZSwgYXhpcykge1xuICAgIGNvbnN0IG5ld1NoYXBlID0gW107XG4gICAgY29uc3Qga2VwdERpbXMgPSBbXTtcbiAgICBjb25zdCBpc0VtcHR5QXJyYXkgPSBheGlzICE9IG51bGwgJiYgQXJyYXkuaXNBcnJheShheGlzKSAmJiBheGlzLmxlbmd0aCA9PT0gMDtcbiAgICBjb25zdCBheGVzID0gKGF4aXMgPT0gbnVsbCB8fCBpc0VtcHR5QXJyYXkpID9cbiAgICAgICAgbnVsbCA6XG4gICAgICAgIHBhcnNlQXhpc1BhcmFtKGF4aXMsIHNoYXBlKS5zb3J0KCk7XG4gICAgbGV0IGogPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2hhcGUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgaWYgKGF4ZXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGF4ZXNbal0gPT09IGkgJiYgc2hhcGVbaV0gIT09IDEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IHNxdWVlemUgYXhpcyAke2l9IHNpbmNlIGl0cyBkaW0gJyR7c2hhcGVbaV19JyBpcyBub3QgMWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChheGVzW2pdID09IG51bGwgfHwgYXhlc1tqXSA+IGkpICYmIHNoYXBlW2ldID09PSAxKSB7XG4gICAgICAgICAgICAgICAgbmV3U2hhcGUucHVzaChzaGFwZVtpXSk7XG4gICAgICAgICAgICAgICAga2VwdERpbXMucHVzaChpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChheGVzW2pdIDw9IGkpIHtcbiAgICAgICAgICAgICAgICBqKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNoYXBlW2ldICE9PSAxKSB7XG4gICAgICAgICAgICBuZXdTaGFwZS5wdXNoKHNoYXBlW2ldKTtcbiAgICAgICAgICAgIGtlcHREaW1zLnB1c2goaSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgbmV3U2hhcGUsIGtlcHREaW1zIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0VHlwZWRBcnJheUZyb21EVHlwZShkdHlwZSwgc2l6ZSkge1xuICAgIGxldCB2YWx1ZXMgPSBudWxsO1xuICAgIGlmIChkdHlwZSA9PSBudWxsIHx8IGR0eXBlID09PSAnZmxvYXQzMicpIHtcbiAgICAgICAgdmFsdWVzID0gbmV3IEZsb2F0MzJBcnJheShzaXplKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZHR5cGUgPT09ICdpbnQzMicpIHtcbiAgICAgICAgdmFsdWVzID0gbmV3IEludDMyQXJyYXkoc2l6ZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGR0eXBlID09PSAnYm9vbCcpIHtcbiAgICAgICAgdmFsdWVzID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZGF0YSB0eXBlICR7ZHR5cGV9YCk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZXM7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0QXJyYXlGcm9tRFR5cGUoZHR5cGUsIHNpemUpIHtcbiAgICBsZXQgdmFsdWVzID0gbnVsbDtcbiAgICBpZiAoZHR5cGUgPT0gbnVsbCB8fCBkdHlwZSA9PT0gJ2Zsb2F0MzInKSB7XG4gICAgICAgIHZhbHVlcyA9IG5ldyBGbG9hdDMyQXJyYXkoc2l6ZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGR0eXBlID09PSAnaW50MzInKSB7XG4gICAgICAgIHZhbHVlcyA9IG5ldyBJbnQzMkFycmF5KHNpemUpO1xuICAgIH1cbiAgICBlbHNlIGlmIChkdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgICAgIHZhbHVlcyA9IG5ldyBVaW50OEFycmF5KHNpemUpO1xuICAgIH1cbiAgICBlbHNlIGlmIChkdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFsdWVzID0gbmV3IEFycmF5KHNpemUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGRhdGEgdHlwZSAke2R0eXBlfWApO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrQ29udmVyc2lvbkZvckVycm9ycyh2YWxzLCBkdHlwZSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBudW0gPSB2YWxzW2ldO1xuICAgICAgICBpZiAoaXNOYU4obnVtKSB8fCAhaXNGaW5pdGUobnVtKSkge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoYEEgdGVuc29yIG9mIHR5cGUgJHtkdHlwZX0gYmVpbmcgdXBsb2FkZWQgY29udGFpbnMgJHtudW19LmApO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZHR5cGUgaXMgdmFsaWQuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZER0eXBlKGR0eXBlKSB7XG4gICAgcmV0dXJuIGR0eXBlID09PSAnYm9vbCcgfHwgZHR5cGUgPT09ICdjb21wbGV4NjQnIHx8IGR0eXBlID09PSAnZmxvYXQzMicgfHxcbiAgICAgICAgZHR5cGUgPT09ICdpbnQzMicgfHwgZHR5cGUgPT09ICdzdHJpbmcnO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIG5ldyB0eXBlIGNhbid0IGVuY29kZSB0aGUgb2xkIHR5cGUgd2l0aG91dCBsb3NzIG9mXG4gKiBwcmVjaXNpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNFbmNvZGluZ0xvc3Mob2xkVHlwZSwgbmV3VHlwZSkge1xuICAgIGlmIChuZXdUeXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChuZXdUeXBlID09PSAnZmxvYXQzMicgJiYgb2xkVHlwZSAhPT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobmV3VHlwZSA9PT0gJ2ludDMyJyAmJiBvbGRUeXBlICE9PSAnZmxvYXQzMicgJiYgb2xkVHlwZSAhPT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobmV3VHlwZSA9PT0gJ2Jvb2wnICYmIG9sZFR5cGUgPT09ICdib29sJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVHlwZWRBcnJheShhKSB7XG4gICAgcmV0dXJuIGEgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkgfHwgYSBpbnN0YW5jZW9mIEludDMyQXJyYXkgfHxcbiAgICAgICAgYSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXk7XG59XG5leHBvcnQgZnVuY3Rpb24gYnl0ZXNQZXJFbGVtZW50KGR0eXBlKSB7XG4gICAgaWYgKGR0eXBlID09PSAnZmxvYXQzMicgfHwgZHR5cGUgPT09ICdpbnQzMicpIHtcbiAgICAgICAgcmV0dXJuIDQ7XG4gICAgfVxuICAgIGVsc2UgaWYgKGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICByZXR1cm4gODtcbiAgICB9XG4gICAgZWxzZSBpZiAoZHR5cGUgPT09ICdib29sJykge1xuICAgICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBkdHlwZSAke2R0eXBlfWApO1xuICAgIH1cbn1cbi8qKlxuICogUmV0dXJucyB0aGUgYXBwcm94aW1hdGUgbnVtYmVyIG9mIGJ5dGVzIGFsbG9jYXRlZCBpbiB0aGUgc3RyaW5nIGFycmF5IC0gMlxuICogYnl0ZXMgcGVyIGNoYXJhY3Rlci4gQ29tcHV0aW5nIHRoZSBleGFjdCBieXRlcyBmb3IgYSBuYXRpdmUgc3RyaW5nIGluIEpTIGlzXG4gKiBub3QgcG9zc2libGUgc2luY2UgaXQgZGVwZW5kcyBvbiB0aGUgZW5jb2Rpbmcgb2YgdGhlIGh0bWwgcGFnZSB0aGF0IHNlcnZlc1xuICogdGhlIHdlYnNpdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBieXRlc0Zyb21TdHJpbmdBcnJheShhcnIpIHtcbiAgICBpZiAoYXJyID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGxldCBieXRlcyA9IDA7XG4gICAgYXJyLmZvckVhY2goeCA9PiBieXRlcyArPSB4Lmxlbmd0aCk7XG4gICAgcmV0dXJuIGJ5dGVzO1xufVxuLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSBzdHJpbmcuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZztcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0Jvb2xlYW4odmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbic7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXIodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJztcbn1cbmV4cG9ydCBmdW5jdGlvbiBpbmZlckR0eXBlKHZhbHVlcykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICAgICAgcmV0dXJuIGluZmVyRHR5cGUodmFsdWVzWzBdKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlcyBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSkge1xuICAgICAgICByZXR1cm4gJ2Zsb2F0MzInO1xuICAgIH1cbiAgICBlbHNlIGlmICh2YWx1ZXMgaW5zdGFuY2VvZiBJbnQzMkFycmF5IHx8IHZhbHVlcyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgcmV0dXJuICdpbnQzMic7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzTnVtYmVyKHZhbHVlcykpIHtcbiAgICAgICAgcmV0dXJuICdmbG9hdDMyJztcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNTdHJpbmcodmFsdWVzKSkge1xuICAgICAgICByZXR1cm4gJ3N0cmluZyc7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzQm9vbGVhbih2YWx1ZXMpKSB7XG4gICAgICAgIHJldHVybiAnYm9vbCc7XG4gICAgfVxuICAgIHJldHVybiAnZmxvYXQzMic7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNGdW5jdGlvbihmKSB7XG4gICAgcmV0dXJuICEhKGYgJiYgZi5jb25zdHJ1Y3RvciAmJiBmLmNhbGwgJiYgZi5hcHBseSk7XG59XG5leHBvcnQgZnVuY3Rpb24gbmVhcmVzdERpdmlzb3Ioc2l6ZSwgc3RhcnQpIHtcbiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzaXplOyArK2kpIHtcbiAgICAgICAgaWYgKHNpemUgJSBpID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2l6ZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlU3RyaWRlcyhzaGFwZSkge1xuICAgIGNvbnN0IHJhbmsgPSBzaGFwZS5sZW5ndGg7XG4gICAgaWYgKHJhbmsgPCAyKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgLy8gTGFzdCBkaW1lbnNpb24gaGFzIGltcGxpY2l0IHN0cmlkZSBvZiAxLCB0aHVzIGhhdmluZyBELTEgKGluc3RlYWQgb2YgRClcbiAgICAvLyBzdHJpZGVzLlxuICAgIGNvbnN0IHN0cmlkZXMgPSBuZXcgQXJyYXkocmFuayAtIDEpO1xuICAgIHN0cmlkZXNbcmFuayAtIDJdID0gc2hhcGVbcmFuayAtIDFdO1xuICAgIGZvciAobGV0IGkgPSByYW5rIC0gMzsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgc3RyaWRlc1tpXSA9IHN0cmlkZXNbaSArIDFdICogc2hhcGVbaSArIDFdO1xuICAgIH1cbiAgICByZXR1cm4gc3RyaWRlcztcbn1cbmZ1bmN0aW9uIGNyZWF0ZU5lc3RlZEFycmF5KG9mZnNldCwgc2hhcGUsIGEsIGlzQ29tcGxleCA9IGZhbHNlKSB7XG4gICAgY29uc3QgcmV0ID0gbmV3IEFycmF5KCk7XG4gICAgaWYgKHNoYXBlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCBkID0gc2hhcGVbMF0gKiAoaXNDb21wbGV4ID8gMiA6IDEpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGQ7IGkrKykge1xuICAgICAgICAgICAgcmV0W2ldID0gYVtvZmZzZXQgKyBpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgZCA9IHNoYXBlWzBdO1xuICAgICAgICBjb25zdCByZXN0ID0gc2hhcGUuc2xpY2UoMSk7XG4gICAgICAgIGNvbnN0IGxlbiA9IHJlc3QucmVkdWNlKChhY2MsIGMpID0+IGFjYyAqIGMpICogKGlzQ29tcGxleCA/IDIgOiAxKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkOyBpKyspIHtcbiAgICAgICAgICAgIHJldFtpXSA9IGNyZWF0ZU5lc3RlZEFycmF5KG9mZnNldCArIGkgKiBsZW4sIHJlc3QsIGEsIGlzQ29tcGxleCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn1cbi8vIFByb3ZpZGUgYSBuZXN0ZWQgYXJyYXkgb2YgVHlwZWRBcnJheSBpbiBnaXZlbiBzaGFwZS5cbmV4cG9ydCBmdW5jdGlvbiB0b05lc3RlZEFycmF5KHNoYXBlLCBhLCBpc0NvbXBsZXggPSBmYWxzZSkge1xuICAgIGlmIChzaGFwZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gU2NhbGFyIHR5cGUgc2hvdWxkIHJldHVybiBhIHNpbmdsZSBudW1iZXIuXG4gICAgICAgIHJldHVybiBhWzBdO1xuICAgIH1cbiAgICBjb25zdCBzaXplID0gc2hhcGUucmVkdWNlKChhY2MsIGMpID0+IGFjYyAqIGMpICogKGlzQ29tcGxleCA/IDIgOiAxKTtcbiAgICBpZiAoc2l6ZSA9PT0gMCkge1xuICAgICAgICAvLyBBIHRlbnNvciB3aXRoIHNoYXBlIHplcm8gc2hvdWxkIGJlIHR1cm5lZCBpbnRvIGVtcHR5IGxpc3QuXG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgaWYgKHNpemUgIT09IGEubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWyR7c2hhcGV9XSBkb2VzIG5vdCBtYXRjaCB0aGUgaW5wdXQgc2l6ZSAke2EubGVuZ3RofSR7aXNDb21wbGV4ID8gJyBmb3IgYSBjb21wbGV4IHRlbnNvcicgOiAnJ30uYCk7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVOZXN0ZWRBcnJheSgwLCBzaGFwZSwgYSwgaXNDb21wbGV4KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBtYWtlT25lc1R5cGVkQXJyYXkoc2l6ZSwgZHR5cGUpIHtcbiAgICBjb25zdCBhcnJheSA9IG1ha2VaZXJvc1R5cGVkQXJyYXkoc2l6ZSwgZHR5cGUpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYXJyYXlbaV0gPSAxO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG59XG5leHBvcnQgZnVuY3Rpb24gbWFrZVplcm9zVHlwZWRBcnJheShzaXplLCBkdHlwZSkge1xuICAgIGlmIChkdHlwZSA9PSBudWxsIHx8IGR0eXBlID09PSAnZmxvYXQzMicgfHwgZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KHNpemUpO1xuICAgIH1cbiAgICBlbHNlIGlmIChkdHlwZSA9PT0gJ2ludDMyJykge1xuICAgICAgICByZXR1cm4gbmV3IEludDMyQXJyYXkoc2l6ZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGR0eXBlID09PSAnYm9vbCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHNpemUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGRhdGEgdHlwZSAke2R0eXBlfWApO1xuICAgIH1cbn1cbi8qKlxuICogTWFrZSBuZXN0ZWQgYFR5cGVkQXJyYXlgIGZpbGxlZCB3aXRoIHplcm9zLlxuICogQHBhcmFtIHNoYXBlIFRoZSBzaGFwZSBpbmZvcm1hdGlvbiBmb3IgdGhlIG5lc3RlZCBhcnJheS5cbiAqIEBwYXJhbSBkdHlwZSBkdHlwZSBvZiB0aGUgYXJyYXkgZWxlbWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VaZXJvc05lc3RlZFR5cGVkQXJyYXkoc2hhcGUsIGR0eXBlKSB7XG4gICAgY29uc3Qgc2l6ZSA9IHNoYXBlLnJlZHVjZSgocHJldiwgY3VycikgPT4gcHJldiAqIGN1cnIsIDEpO1xuICAgIGlmIChkdHlwZSA9PSBudWxsIHx8IGR0eXBlID09PSAnZmxvYXQzMicpIHtcbiAgICAgICAgcmV0dXJuIHRvTmVzdGVkQXJyYXkoc2hhcGUsIG5ldyBGbG9hdDMyQXJyYXkoc2l6ZSkpO1xuICAgIH1cbiAgICBlbHNlIGlmIChkdHlwZSA9PT0gJ2ludDMyJykge1xuICAgICAgICByZXR1cm4gdG9OZXN0ZWRBcnJheShzaGFwZSwgbmV3IEludDMyQXJyYXkoc2l6ZSkpO1xuICAgIH1cbiAgICBlbHNlIGlmIChkdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgICAgIHJldHVybiB0b05lc3RlZEFycmF5KHNoYXBlLCBuZXcgVWludDhBcnJheShzaXplKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZGF0YSB0eXBlICR7ZHR5cGV9YCk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE5vbk5lZ2F0aXZlSW50ZWdlckRpbWVuc2lvbnMoc2hhcGUpIHtcbiAgICBzaGFwZS5mb3JFYWNoKGRpbVNpemUgPT4ge1xuICAgICAgICBhc3NlcnQoTnVtYmVyLmlzSW50ZWdlcihkaW1TaXplKSAmJiBkaW1TaXplID49IDAsICgpID0+IGBUZW5zb3IgbXVzdCBoYXZlIGEgc2hhcGUgY29tcHJpc2VkIG9mIHBvc2l0aXZlIGludGVnZXJzIGJ1dCBnb3QgYCArXG4gICAgICAgICAgICBgc2hhcGUgWyR7c2hhcGV9XS5gKTtcbiAgICB9KTtcbn1cbi8qKlxuICogQ29tcHV0ZXMgZmxhdCBpbmRleCBmb3IgYSBnaXZlbiBsb2NhdGlvbiAobXVsdGlkaW1lbnRpb25zYWwgaW5kZXgpIGluIGFcbiAqIFRlbnNvci9tdWx0aWRpbWVuc2lvbmFsIGFycmF5LlxuICpcbiAqIEBwYXJhbSBsb2NzIExvY2F0aW9uIGluIHRoZSB0ZW5zb3IuXG4gKiBAcGFyYW0gcmFuayBSYW5rIG9mIHRoZSB0ZW5zb3IuXG4gKiBAcGFyYW0gc3RyaWRlcyBUZW5zb3Igc3RyaWRlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvY1RvSW5kZXgobG9jcywgcmFuaywgc3RyaWRlcykge1xuICAgIGlmIChyYW5rID09PSAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBlbHNlIGlmIChyYW5rID09PSAxKSB7XG4gICAgICAgIHJldHVybiBsb2NzWzBdO1xuICAgIH1cbiAgICBsZXQgaW5kZXggPSBsb2NzW2xvY3MubGVuZ3RoIC0gMV07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NzLmxlbmd0aCAtIDE7ICsraSkge1xuICAgICAgICBpbmRleCArPSBzdHJpZGVzW2ldICogbG9jc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIGluZGV4O1xufVxuLyoqXG4gKiBDb21wdXRlcyB0aGUgbG9jYXRpb24gKG11bHRpZGltZW5zaW9uYWwgaW5kZXgpIGluIGEgdGVuc29yL211bHRpZGltZW50aW9uYWxcbiAqIGFycmF5IGZvciBhIGdpdmVuIGZsYXQgaW5kZXguXG4gKlxuICogQHBhcmFtIGluZGV4IEluZGV4IGluIGZsYXQgYXJyYXkuXG4gKiBAcGFyYW0gcmFuayBSYW5rIG9mIHRlbnNvci5cbiAqIEBwYXJhbSBzdHJpZGVzIFN0cmlkZXMgb2YgdGVuc29yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5kZXhUb0xvYyhpbmRleCwgcmFuaywgc3RyaWRlcykge1xuICAgIGlmIChyYW5rID09PSAwKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgZWxzZSBpZiAocmFuayA9PT0gMSkge1xuICAgICAgICByZXR1cm4gW2luZGV4XTtcbiAgICB9XG4gICAgY29uc3QgbG9jcyA9IG5ldyBBcnJheShyYW5rKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvY3MubGVuZ3RoIC0gMTsgKytpKSB7XG4gICAgICAgIGxvY3NbaV0gPSBNYXRoLmZsb29yKGluZGV4IC8gc3RyaWRlc1tpXSk7XG4gICAgICAgIGluZGV4IC09IGxvY3NbaV0gKiBzdHJpZGVzW2ldO1xuICAgIH1cbiAgICBsb2NzW2xvY3MubGVuZ3RoIC0gMV0gPSBpbmRleDtcbiAgICByZXR1cm4gbG9jcztcbn1cbi8qKlxuICogVGhpcyBtZXRob2QgYXNzZXJ0cyB3aGV0aGVyIGFuIG9iamVjdCBpcyBhIFByb21pc2UgaW5zdGFuY2UuXG4gKiBAcGFyYW0gb2JqZWN0XG4gKi9cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tYW55XG5leHBvcnQgZnVuY3Rpb24gaXNQcm9taXNlKG9iamVjdCkge1xuICAgIC8vICBXZSBjaG9zZSB0byBub3QgdXNlICdvYmogaW5zdGFuY2VPZiBQcm9taXNlJyBmb3IgdHdvIHJlYXNvbnM6XG4gICAgLy8gIDEuIEl0IG9ubHkgcmVsaWFibHkgd29ya3MgZm9yIGVzNiBQcm9taXNlLCBub3Qgb3RoZXIgUHJvbWlzZVxuICAgIC8vICBpbXBsZW1lbnRhdGlvbnMuXG4gICAgLy8gIDIuIEl0IGRvZXNuJ3Qgd29yayB3aXRoIGZyYW1ld29yayB0aGF0IHVzZXMgem9uZS5qcy4gem9uZS5qcyBtb25rZXkgcGF0Y2hcbiAgICAvLyAgdGhlIGFzeW5jIGNhbGxzLCBzbyBpdCBpcyBwb3NzaWJsZSB0aGUgb2JqIChwYXRjaGVkKSBpcyBjb21wYXJpbmcgdG8gYVxuICAgIC8vICBwcmUtcGF0Y2hlZCBQcm9taXNlLlxuICAgIHJldHVybiBvYmplY3QgJiYgb2JqZWN0LnRoZW4gJiYgdHlwZW9mIG9iamVjdC50aGVuID09PSAnZnVuY3Rpb24nO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbF9iYXNlLmpzLm1hcCIsIi8qKiBAbGljZW5zZSBTZWUgdGhlIExJQ0VOU0UgZmlsZS4gKi9cbi8vIFRoaXMgY29kZSBpcyBhdXRvLWdlbmVyYXRlZCwgZG8gbm90IG1vZGlmeSB0aGlzIGZpbGUhXG5jb25zdCB2ZXJzaW9uID0gJzMuOC4wJztcbmV4cG9ydCB7IHZlcnNpb24gfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZlcnNpb24uanMubWFwIiwiJ3VzZSBzdHJpY3QnXG5cbmV4cG9ydHMuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhcbmV4cG9ydHMudG9CeXRlQXJyYXkgPSB0b0J5dGVBcnJheVxuZXhwb3J0cy5mcm9tQnl0ZUFycmF5ID0gZnJvbUJ5dGVBcnJheVxuXG52YXIgbG9va3VwID0gW11cbnZhciByZXZMb29rdXAgPSBbXVxudmFyIEFyciA9IHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJyA/IFVpbnQ4QXJyYXkgOiBBcnJheVxuXG52YXIgY29kZSA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJ1xuZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNvZGUubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgbG9va3VwW2ldID0gY29kZVtpXVxuICByZXZMb29rdXBbY29kZS5jaGFyQ29kZUF0KGkpXSA9IGlcbn1cblxuLy8gU3VwcG9ydCBkZWNvZGluZyBVUkwtc2FmZSBiYXNlNjQgc3RyaW5ncywgYXMgTm9kZS5qcyBkb2VzLlxuLy8gU2VlOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CYXNlNjQjVVJMX2FwcGxpY2F0aW9uc1xucmV2TG9va3VwWyctJy5jaGFyQ29kZUF0KDApXSA9IDYyXG5yZXZMb29rdXBbJ18nLmNoYXJDb2RlQXQoMCldID0gNjNcblxuZnVuY3Rpb24gZ2V0TGVucyAoYjY0KSB7XG4gIHZhciBsZW4gPSBiNjQubGVuZ3RoXG5cbiAgaWYgKGxlbiAlIDQgPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0JylcbiAgfVxuXG4gIC8vIFRyaW0gb2ZmIGV4dHJhIGJ5dGVzIGFmdGVyIHBsYWNlaG9sZGVyIGJ5dGVzIGFyZSBmb3VuZFxuICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9iZWF0Z2FtbWl0L2Jhc2U2NC1qcy9pc3N1ZXMvNDJcbiAgdmFyIHZhbGlkTGVuID0gYjY0LmluZGV4T2YoJz0nKVxuICBpZiAodmFsaWRMZW4gPT09IC0xKSB2YWxpZExlbiA9IGxlblxuXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSB2YWxpZExlbiA9PT0gbGVuXG4gICAgPyAwXG4gICAgOiA0IC0gKHZhbGlkTGVuICUgNClcblxuICByZXR1cm4gW3ZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW5dXG59XG5cbi8vIGJhc2U2NCBpcyA0LzMgKyB1cCB0byB0d28gY2hhcmFjdGVycyBvZiB0aGUgb3JpZ2luYWwgZGF0YVxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoYjY0KSB7XG4gIHZhciBsZW5zID0gZ2V0TGVucyhiNjQpXG4gIHZhciB2YWxpZExlbiA9IGxlbnNbMF1cbiAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IGxlbnNbMV1cbiAgcmV0dXJuICgodmFsaWRMZW4gKyBwbGFjZUhvbGRlcnNMZW4pICogMyAvIDQpIC0gcGxhY2VIb2xkZXJzTGVuXG59XG5cbmZ1bmN0aW9uIF9ieXRlTGVuZ3RoIChiNjQsIHZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW4pIHtcbiAgcmV0dXJuICgodmFsaWRMZW4gKyBwbGFjZUhvbGRlcnNMZW4pICogMyAvIDQpIC0gcGxhY2VIb2xkZXJzTGVuXG59XG5cbmZ1bmN0aW9uIHRvQnl0ZUFycmF5IChiNjQpIHtcbiAgdmFyIHRtcFxuICB2YXIgbGVucyA9IGdldExlbnMoYjY0KVxuICB2YXIgdmFsaWRMZW4gPSBsZW5zWzBdXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSBsZW5zWzFdXG5cbiAgdmFyIGFyciA9IG5ldyBBcnIoX2J5dGVMZW5ndGgoYjY0LCB2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuKSlcblxuICB2YXIgY3VyQnl0ZSA9IDBcblxuICAvLyBpZiB0aGVyZSBhcmUgcGxhY2Vob2xkZXJzLCBvbmx5IGdldCB1cCB0byB0aGUgbGFzdCBjb21wbGV0ZSA0IGNoYXJzXG4gIHZhciBsZW4gPSBwbGFjZUhvbGRlcnNMZW4gPiAwXG4gICAgPyB2YWxpZExlbiAtIDRcbiAgICA6IHZhbGlkTGVuXG5cbiAgdmFyIGlcbiAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7XG4gICAgdG1wID1cbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDE4KSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgMTIpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA8PCA2KSB8XG4gICAgICByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDMpXVxuICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA+PiAxNikgJiAweEZGXG4gICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgaWYgKHBsYWNlSG9sZGVyc0xlbiA9PT0gMikge1xuICAgIHRtcCA9XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAyKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPj4gNClcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIGlmIChwbGFjZUhvbGRlcnNMZW4gPT09IDEpIHtcbiAgICB0bXAgPVxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTApIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCA0KSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPj4gMilcbiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gOCkgJiAweEZGXG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICByZXR1cm4gYXJyXG59XG5cbmZ1bmN0aW9uIHRyaXBsZXRUb0Jhc2U2NCAobnVtKSB7XG4gIHJldHVybiBsb29rdXBbbnVtID4+IDE4ICYgMHgzRl0gK1xuICAgIGxvb2t1cFtudW0gPj4gMTIgJiAweDNGXSArXG4gICAgbG9va3VwW251bSA+PiA2ICYgMHgzRl0gK1xuICAgIGxvb2t1cFtudW0gJiAweDNGXVxufVxuXG5mdW5jdGlvbiBlbmNvZGVDaHVuayAodWludDgsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHRtcFxuICB2YXIgb3V0cHV0ID0gW11cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IDMpIHtcbiAgICB0bXAgPVxuICAgICAgKCh1aW50OFtpXSA8PCAxNikgJiAweEZGMDAwMCkgK1xuICAgICAgKCh1aW50OFtpICsgMV0gPDwgOCkgJiAweEZGMDApICtcbiAgICAgICh1aW50OFtpICsgMl0gJiAweEZGKVxuICAgIG91dHB1dC5wdXNoKHRyaXBsZXRUb0Jhc2U2NCh0bXApKVxuICB9XG4gIHJldHVybiBvdXRwdXQuam9pbignJylcbn1cblxuZnVuY3Rpb24gZnJvbUJ5dGVBcnJheSAodWludDgpIHtcbiAgdmFyIHRtcFxuICB2YXIgbGVuID0gdWludDgubGVuZ3RoXG4gIHZhciBleHRyYUJ5dGVzID0gbGVuICUgMyAvLyBpZiB3ZSBoYXZlIDEgYnl0ZSBsZWZ0LCBwYWQgMiBieXRlc1xuICB2YXIgcGFydHMgPSBbXVxuICB2YXIgbWF4Q2h1bmtMZW5ndGggPSAxNjM4MyAvLyBtdXN0IGJlIG11bHRpcGxlIG9mIDNcblxuICAvLyBnbyB0aHJvdWdoIHRoZSBhcnJheSBldmVyeSB0aHJlZSBieXRlcywgd2UnbGwgZGVhbCB3aXRoIHRyYWlsaW5nIHN0dWZmIGxhdGVyXG4gIGZvciAodmFyIGkgPSAwLCBsZW4yID0gbGVuIC0gZXh0cmFCeXRlczsgaSA8IGxlbjI7IGkgKz0gbWF4Q2h1bmtMZW5ndGgpIHtcbiAgICBwYXJ0cy5wdXNoKGVuY29kZUNodW5rKHVpbnQ4LCBpLCAoaSArIG1heENodW5rTGVuZ3RoKSA+IGxlbjIgPyBsZW4yIDogKGkgKyBtYXhDaHVua0xlbmd0aCkpKVxuICB9XG5cbiAgLy8gcGFkIHRoZSBlbmQgd2l0aCB6ZXJvcywgYnV0IG1ha2Ugc3VyZSB0byBub3QgZm9yZ2V0IHRoZSBleHRyYSBieXRlc1xuICBpZiAoZXh0cmFCeXRlcyA9PT0gMSkge1xuICAgIHRtcCA9IHVpbnQ4W2xlbiAtIDFdXG4gICAgcGFydHMucHVzaChcbiAgICAgIGxvb2t1cFt0bXAgPj4gMl0gK1xuICAgICAgbG9va3VwWyh0bXAgPDwgNCkgJiAweDNGXSArXG4gICAgICAnPT0nXG4gICAgKVxuICB9IGVsc2UgaWYgKGV4dHJhQnl0ZXMgPT09IDIpIHtcbiAgICB0bXAgPSAodWludDhbbGVuIC0gMl0gPDwgOCkgKyB1aW50OFtsZW4gLSAxXVxuICAgIHBhcnRzLnB1c2goXG4gICAgICBsb29rdXBbdG1wID4+IDEwXSArXG4gICAgICBsb29rdXBbKHRtcCA+PiA0KSAmIDB4M0ZdICtcbiAgICAgIGxvb2t1cFsodG1wIDw8IDIpICYgMHgzRl0gK1xuICAgICAgJz0nXG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIHBhcnRzLmpvaW4oJycpXG59XG4iLCIvKiFcbiAqIFRoZSBidWZmZXIgbW9kdWxlIGZyb20gbm9kZS5qcywgZm9yIHRoZSBicm93c2VyLlxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbnZhciBiYXNlNjQgPSByZXF1aXJlKCdiYXNlNjQtanMnKVxudmFyIGllZWU3NTQgPSByZXF1aXJlKCdpZWVlNzU0JylcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnaXNhcnJheScpXG5cbmV4cG9ydHMuQnVmZmVyID0gQnVmZmVyXG5leHBvcnRzLlNsb3dCdWZmZXIgPSBTbG93QnVmZmVyXG5leHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTID0gNTBcblxuLyoqXG4gKiBJZiBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgOlxuICogICA9PT0gdHJ1ZSAgICBVc2UgVWludDhBcnJheSBpbXBsZW1lbnRhdGlvbiAoZmFzdGVzdClcbiAqICAgPT09IGZhbHNlICAgVXNlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiAobW9zdCBjb21wYXRpYmxlLCBldmVuIElFNilcbiAqXG4gKiBCcm93c2VycyB0aGF0IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGFyZSBJRSAxMCssIEZpcmVmb3ggNCssIENocm9tZSA3KywgU2FmYXJpIDUuMSssXG4gKiBPcGVyYSAxMS42KywgaU9TIDQuMisuXG4gKlxuICogRHVlIHRvIHZhcmlvdXMgYnJvd3NlciBidWdzLCBzb21ldGltZXMgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIHVzZWQgZXZlblxuICogd2hlbiB0aGUgYnJvd3NlciBzdXBwb3J0cyB0eXBlZCBhcnJheXMuXG4gKlxuICogTm90ZTpcbiAqXG4gKiAgIC0gRmlyZWZveCA0LTI5IGxhY2tzIHN1cHBvcnQgZm9yIGFkZGluZyBuZXcgcHJvcGVydGllcyB0byBgVWludDhBcnJheWAgaW5zdGFuY2VzLFxuICogICAgIFNlZTogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk1NDM4LlxuICpcbiAqICAgLSBDaHJvbWUgOS0xMCBpcyBtaXNzaW5nIHRoZSBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uLlxuICpcbiAqICAgLSBJRTEwIGhhcyBhIGJyb2tlbiBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYXJyYXlzIG9mXG4gKiAgICAgaW5jb3JyZWN0IGxlbmd0aCBpbiBzb21lIHNpdHVhdGlvbnMuXG5cbiAqIFdlIGRldGVjdCB0aGVzZSBidWdneSBicm93c2VycyBhbmQgc2V0IGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGAgdG8gYGZhbHNlYCBzbyB0aGV5XG4gKiBnZXQgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaXMgc2xvd2VyIGJ1dCBiZWhhdmVzIGNvcnJlY3RseS5cbiAqL1xuQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgPSBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVCAhPT0gdW5kZWZpbmVkXG4gID8gZ2xvYmFsLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgOiB0eXBlZEFycmF5U3VwcG9ydCgpXG5cbi8qXG4gKiBFeHBvcnQga01heExlbmd0aCBhZnRlciB0eXBlZCBhcnJheSBzdXBwb3J0IGlzIGRldGVybWluZWQuXG4gKi9cbmV4cG9ydHMua01heExlbmd0aCA9IGtNYXhMZW5ndGgoKVxuXG5mdW5jdGlvbiB0eXBlZEFycmF5U3VwcG9ydCAoKSB7XG4gIHRyeSB7XG4gICAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KDEpXG4gICAgYXJyLl9fcHJvdG9fXyA9IHtfX3Byb3RvX186IFVpbnQ4QXJyYXkucHJvdG90eXBlLCBmb286IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDQyIH19XG4gICAgcmV0dXJuIGFyci5mb28oKSA9PT0gNDIgJiYgLy8gdHlwZWQgYXJyYXkgaW5zdGFuY2VzIGNhbiBiZSBhdWdtZW50ZWRcbiAgICAgICAgdHlwZW9mIGFyci5zdWJhcnJheSA9PT0gJ2Z1bmN0aW9uJyAmJiAvLyBjaHJvbWUgOS0xMCBsYWNrIGBzdWJhcnJheWBcbiAgICAgICAgYXJyLnN1YmFycmF5KDEsIDEpLmJ5dGVMZW5ndGggPT09IDAgLy8gaWUxMCBoYXMgYnJva2VuIGBzdWJhcnJheWBcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmZ1bmN0aW9uIGtNYXhMZW5ndGggKCkge1xuICByZXR1cm4gQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgICA/IDB4N2ZmZmZmZmZcbiAgICA6IDB4M2ZmZmZmZmZcbn1cblxuZnVuY3Rpb24gY3JlYXRlQnVmZmVyICh0aGF0LCBsZW5ndGgpIHtcbiAgaWYgKGtNYXhMZW5ndGgoKSA8IGxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHR5cGVkIGFycmF5IGxlbmd0aCcpXG4gIH1cbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aClcbiAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICAvLyBGYWxsYmFjazogUmV0dXJuIGFuIG9iamVjdCBpbnN0YW5jZSBvZiB0aGUgQnVmZmVyIGNsYXNzXG4gICAgaWYgKHRoYXQgPT09IG51bGwpIHtcbiAgICAgIHRoYXQgPSBuZXcgQnVmZmVyKGxlbmd0aClcbiAgICB9XG4gICAgdGhhdC5sZW5ndGggPSBsZW5ndGhcbiAgfVxuXG4gIHJldHVybiB0aGF0XG59XG5cbi8qKlxuICogVGhlIEJ1ZmZlciBjb25zdHJ1Y3RvciByZXR1cm5zIGluc3RhbmNlcyBvZiBgVWludDhBcnJheWAgdGhhdCBoYXZlIHRoZWlyXG4gKiBwcm90b3R5cGUgY2hhbmdlZCB0byBgQnVmZmVyLnByb3RvdHlwZWAuIEZ1cnRoZXJtb3JlLCBgQnVmZmVyYCBpcyBhIHN1YmNsYXNzIG9mXG4gKiBgVWludDhBcnJheWAsIHNvIHRoZSByZXR1cm5lZCBpbnN0YW5jZXMgd2lsbCBoYXZlIGFsbCB0aGUgbm9kZSBgQnVmZmVyYCBtZXRob2RzXG4gKiBhbmQgdGhlIGBVaW50OEFycmF5YCBtZXRob2RzLiBTcXVhcmUgYnJhY2tldCBub3RhdGlvbiB3b3JrcyBhcyBleHBlY3RlZCAtLSBpdFxuICogcmV0dXJucyBhIHNpbmdsZSBvY3RldC5cbiAqXG4gKiBUaGUgYFVpbnQ4QXJyYXlgIHByb3RvdHlwZSByZW1haW5zIHVubW9kaWZpZWQuXG4gKi9cblxuZnVuY3Rpb24gQnVmZmVyIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmICEodGhpcyBpbnN0YW5jZW9mIEJ1ZmZlcikpIHtcbiAgICByZXR1cm4gbmV3IEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIC8vIENvbW1vbiBjYXNlLlxuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nT3JPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZydcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIGFsbG9jVW5zYWZlKHRoaXMsIGFyZylcbiAgfVxuICByZXR1cm4gZnJvbSh0aGlzLCBhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnBvb2xTaXplID0gODE5MiAvLyBub3QgdXNlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uXG5cbi8vIFRPRE86IExlZ2FjeSwgbm90IG5lZWRlZCBhbnltb3JlLiBSZW1vdmUgaW4gbmV4dCBtYWpvciB2ZXJzaW9uLlxuQnVmZmVyLl9hdWdtZW50ID0gZnVuY3Rpb24gKGFycikge1xuICBhcnIuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICByZXR1cm4gYXJyXG59XG5cbmZ1bmN0aW9uIGZyb20gKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZyb21TdHJpbmcodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQpXG4gIH1cblxuICByZXR1cm4gZnJvbU9iamVjdCh0aGF0LCB2YWx1ZSlcbn1cblxuLyoqXG4gKiBGdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBCdWZmZXIoYXJnLCBlbmNvZGluZykgYnV0IHRocm93cyBhIFR5cGVFcnJvclxuICogaWYgdmFsdWUgaXMgYSBudW1iZXIuXG4gKiBCdWZmZXIuZnJvbShzdHJbLCBlbmNvZGluZ10pXG4gKiBCdWZmZXIuZnJvbShhcnJheSlcbiAqIEJ1ZmZlci5mcm9tKGJ1ZmZlcilcbiAqIEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyWywgYnl0ZU9mZnNldFssIGxlbmd0aF1dKVxuICoqL1xuQnVmZmVyLmZyb20gPSBmdW5jdGlvbiAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gZnJvbShudWxsLCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5pZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgQnVmZmVyLnByb3RvdHlwZS5fX3Byb3RvX18gPSBVaW50OEFycmF5LnByb3RvdHlwZVxuICBCdWZmZXIuX19wcm90b19fID0gVWludDhBcnJheVxuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnNwZWNpZXMgJiZcbiAgICAgIEJ1ZmZlcltTeW1ib2wuc3BlY2llc10gPT09IEJ1ZmZlcikge1xuICAgIC8vIEZpeCBzdWJhcnJheSgpIGluIEVTMjAxNi4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9wdWxsLzk3XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlciwgU3ltYm9sLnNwZWNpZXMsIHtcbiAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSlcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRTaXplIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfSBlbHNlIGlmIChzaXplIDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWxsb2MgKHRoYXQsIHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgaWYgKHNpemUgPD0gMCkge1xuICAgIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSlcbiAgfVxuICBpZiAoZmlsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT25seSBwYXkgYXR0ZW50aW9uIHRvIGVuY29kaW5nIGlmIGl0J3MgYSBzdHJpbmcuIFRoaXNcbiAgICAvLyBwcmV2ZW50cyBhY2NpZGVudGFsbHkgc2VuZGluZyBpbiBhIG51bWJlciB0aGF0IHdvdWxkXG4gICAgLy8gYmUgaW50ZXJwcmV0dGVkIGFzIGEgc3RhcnQgb2Zmc2V0LlxuICAgIHJldHVybiB0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnXG4gICAgICA/IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKS5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgICAgOiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSkuZmlsbChmaWxsKVxuICB9XG4gIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSlcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiBhbGxvYyhzaXplWywgZmlsbFssIGVuY29kaW5nXV0pXG4gKiovXG5CdWZmZXIuYWxsb2MgPSBmdW5jdGlvbiAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGFsbG9jKG51bGwsIHNpemUsIGZpbGwsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBhbGxvY1Vuc2FmZSAodGhhdCwgc2l6ZSkge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSA8IDAgPyAwIDogY2hlY2tlZChzaXplKSB8IDApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7ICsraSkge1xuICAgICAgdGhhdFtpXSA9IDBcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIEJ1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufVxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIFNsb3dCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufVxuXG5mdW5jdGlvbiBmcm9tU3RyaW5nICh0aGF0LCBzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnIHx8IGVuY29kaW5nID09PSAnJykge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gIH1cblxuICBpZiAoIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiZW5jb2RpbmdcIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVuY29kaW5nJylcbiAgfVxuXG4gIHZhciBsZW5ndGggPSBieXRlTGVuZ3RoKHN0cmluZywgZW5jb2RpbmcpIHwgMFxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbmd0aClcblxuICB2YXIgYWN0dWFsID0gdGhhdC53cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuXG4gIGlmIChhY3R1YWwgIT09IGxlbmd0aCkge1xuICAgIC8vIFdyaXRpbmcgYSBoZXggc3RyaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMgd2lsbFxuICAgIC8vIGNhdXNlIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGZpcnN0IGludmFsaWQgY2hhcmFjdGVyIHRvIGJlIGlnbm9yZWQuIChlLmcuXG4gICAgLy8gJ2FieHhjZCcgd2lsbCBiZSB0cmVhdGVkIGFzICdhYicpXG4gICAgdGhhdCA9IHRoYXQuc2xpY2UoMCwgYWN0dWFsKVxuICB9XG5cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5TGlrZSAodGhhdCwgYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCA8IDAgPyAwIDogY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMFxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbmd0aClcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIHRoYXRbaV0gPSBhcnJheVtpXSAmIDI1NVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUJ1ZmZlciAodGhhdCwgYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICBhcnJheS5ieXRlTGVuZ3RoIC8vIHRoaXMgdGhyb3dzIGlmIGBhcnJheWAgaXMgbm90IGEgdmFsaWQgQXJyYXlCdWZmZXJcblxuICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXFwnb2Zmc2V0XFwnIGlzIG91dCBvZiBib3VuZHMnKVxuICB9XG5cbiAgaWYgKGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0ICsgKGxlbmd0aCB8fCAwKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcXCdsZW5ndGhcXCcgaXMgb3V0IG9mIGJvdW5kcycpXG4gIH1cblxuICBpZiAoYnl0ZU9mZnNldCA9PT0gdW5kZWZpbmVkICYmIGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSlcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQpXG4gIH0gZWxzZSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IGFycmF5XG4gICAgdGhhdC5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIHRoYXQgPSBmcm9tQXJyYXlMaWtlKHRoYXQsIGFycmF5KVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21PYmplY3QgKHRoYXQsIG9iaikge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKG9iaikpIHtcbiAgICB2YXIgbGVuID0gY2hlY2tlZChvYmoubGVuZ3RoKSB8IDBcbiAgICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbilcblxuICAgIGlmICh0aGF0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoYXRcbiAgICB9XG5cbiAgICBvYmouY29weSh0aGF0LCAwLCAwLCBsZW4pXG4gICAgcmV0dXJuIHRoYXRcbiAgfVxuXG4gIGlmIChvYmopIHtcbiAgICBpZiAoKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgb2JqLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB8fCAnbGVuZ3RoJyBpbiBvYmopIHtcbiAgICAgIGlmICh0eXBlb2Ygb2JqLmxlbmd0aCAhPT0gJ251bWJlcicgfHwgaXNuYW4ob2JqLmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCAwKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2UodGhhdCwgb2JqKVxuICAgIH1cblxuICAgIGlmIChvYmoudHlwZSA9PT0gJ0J1ZmZlcicgJiYgaXNBcnJheShvYmouZGF0YSkpIHtcbiAgICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKHRoYXQsIG9iai5kYXRhKVxuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBhcnJheS1saWtlIG9iamVjdC4nKVxufVxuXG5mdW5jdGlvbiBjaGVja2VkIChsZW5ndGgpIHtcbiAgLy8gTm90ZTogY2Fubm90IHVzZSBgbGVuZ3RoIDwga01heExlbmd0aCgpYCBoZXJlIGJlY2F1c2UgdGhhdCBmYWlscyB3aGVuXG4gIC8vIGxlbmd0aCBpcyBOYU4gKHdoaWNoIGlzIG90aGVyd2lzZSBjb2VyY2VkIHRvIHplcm8uKVxuICBpZiAobGVuZ3RoID49IGtNYXhMZW5ndGgoKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICdzaXplOiAweCcgKyBrTWF4TGVuZ3RoKCkudG9TdHJpbmcoMTYpICsgJyBieXRlcycpXG4gIH1cbiAgcmV0dXJuIGxlbmd0aCB8IDBcbn1cblxuZnVuY3Rpb24gU2xvd0J1ZmZlciAobGVuZ3RoKSB7XG4gIGlmICgrbGVuZ3RoICE9IGxlbmd0aCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcVxuICAgIGxlbmd0aCA9IDBcbiAgfVxuICByZXR1cm4gQnVmZmVyLmFsbG9jKCtsZW5ndGgpXG59XG5cbkJ1ZmZlci5pc0J1ZmZlciA9IGZ1bmN0aW9uIGlzQnVmZmVyIChiKSB7XG4gIHJldHVybiAhIShiICE9IG51bGwgJiYgYi5faXNCdWZmZXIpXG59XG5cbkJ1ZmZlci5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAoYSwgYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihhKSB8fCAhQnVmZmVyLmlzQnVmZmVyKGIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIG11c3QgYmUgQnVmZmVycycpXG4gIH1cblxuICBpZiAoYSA9PT0gYikgcmV0dXJuIDBcblxuICB2YXIgeCA9IGEubGVuZ3RoXG4gIHZhciB5ID0gYi5sZW5ndGhcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gTWF0aC5taW4oeCwgeSk7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICB4ID0gYVtpXVxuICAgICAgeSA9IGJbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG5CdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIGlzRW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gIHN3aXRjaCAoU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgY2FzZSAnYXNjaWknOlxuICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgY2FzZSAnYmluYXJ5JzpcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5CdWZmZXIuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0IChsaXN0LCBsZW5ndGgpIHtcbiAgaWYgKCFpc0FycmF5KGxpc3QpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBCdWZmZXIuYWxsb2MoMClcbiAgfVxuXG4gIHZhciBpXG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGxlbmd0aCA9IDBcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgbGVuZ3RoICs9IGxpc3RbaV0ubGVuZ3RoXG4gICAgfVxuICB9XG5cbiAgdmFyIGJ1ZmZlciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShsZW5ndGgpXG4gIHZhciBwb3MgPSAwXG4gIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGJ1ZiA9IGxpc3RbaV1cbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICAgIH1cbiAgICBidWYuY29weShidWZmZXIsIHBvcylcbiAgICBwb3MgKz0gYnVmLmxlbmd0aFxuICB9XG4gIHJldHVybiBidWZmZXJcbn1cblxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHN0cmluZykpIHtcbiAgICByZXR1cm4gc3RyaW5nLmxlbmd0aFxuICB9XG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgIChBcnJheUJ1ZmZlci5pc1ZpZXcoc3RyaW5nKSB8fCBzdHJpbmcgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpIHtcbiAgICByZXR1cm4gc3RyaW5nLmJ5dGVMZW5ndGhcbiAgfVxuICBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICBzdHJpbmcgPSAnJyArIHN0cmluZ1xuICB9XG5cbiAgdmFyIGxlbiA9IHN0cmluZy5sZW5ndGhcbiAgaWYgKGxlbiA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBVc2UgYSBmb3IgbG9vcCB0byBhdm9pZCByZWN1cnNpb25cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGVuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiBsZW4gKiAyXG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gbGVuID4+PiAxXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGggLy8gYXNzdW1lIHV0ZjhcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cbkJ1ZmZlci5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuXG5mdW5jdGlvbiBzbG93VG9TdHJpbmcgKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG5cbiAgLy8gTm8gbmVlZCB0byB2ZXJpZnkgdGhhdCBcInRoaXMubGVuZ3RoIDw9IE1BWF9VSU5UMzJcIiBzaW5jZSBpdCdzIGEgcmVhZC1vbmx5XG4gIC8vIHByb3BlcnR5IG9mIGEgdHlwZWQgYXJyYXkuXG5cbiAgLy8gVGhpcyBiZWhhdmVzIG5laXRoZXIgbGlrZSBTdHJpbmcgbm9yIFVpbnQ4QXJyYXkgaW4gdGhhdCB3ZSBzZXQgc3RhcnQvZW5kXG4gIC8vIHRvIHRoZWlyIHVwcGVyL2xvd2VyIGJvdW5kcyBpZiB0aGUgdmFsdWUgcGFzc2VkIGlzIG91dCBvZiByYW5nZS5cbiAgLy8gdW5kZWZpbmVkIGlzIGhhbmRsZWQgc3BlY2lhbGx5IGFzIHBlciBFQ01BLTI2MiA2dGggRWRpdGlvbixcbiAgLy8gU2VjdGlvbiAxMy4zLjMuNyBSdW50aW1lIFNlbWFudGljczogS2V5ZWRCaW5kaW5nSW5pdGlhbGl6YXRpb24uXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkIHx8IHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIC8vIFJldHVybiBlYXJseSBpZiBzdGFydCA+IHRoaXMubGVuZ3RoLiBEb25lIGhlcmUgdG8gcHJldmVudCBwb3RlbnRpYWwgdWludDMyXG4gIC8vIGNvZXJjaW9uIGZhaWwgYmVsb3cuXG4gIGlmIChzdGFydCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKGVuZCA8PSAwKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICAvLyBGb3JjZSBjb2Vyc2lvbiB0byB1aW50MzIuIFRoaXMgd2lsbCBhbHNvIGNvZXJjZSBmYWxzZXkvTmFOIHZhbHVlcyB0byAwLlxuICBlbmQgPj4+PSAwXG4gIHN0YXJ0ID4+Pj0gMFxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9IChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG4vLyBUaGUgcHJvcGVydHkgaXMgdXNlZCBieSBgQnVmZmVyLmlzQnVmZmVyYCBhbmQgYGlzLWJ1ZmZlcmAgKGluIFNhZmFyaSA1LTcpIHRvIGRldGVjdFxuLy8gQnVmZmVyIGluc3RhbmNlcy5cbkJ1ZmZlci5wcm90b3R5cGUuX2lzQnVmZmVyID0gdHJ1ZVxuXG5mdW5jdGlvbiBzd2FwIChiLCBuLCBtKSB7XG4gIHZhciBpID0gYltuXVxuICBiW25dID0gYlttXVxuICBiW21dID0gaVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAxNiA9IGZ1bmN0aW9uIHN3YXAxNiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgMiAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gMikge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDEpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMzIgPSBmdW5jdGlvbiBzd2FwMzIgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDQgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAzKVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyAyKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDY0ID0gZnVuY3Rpb24gc3dhcDY0ICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSA4ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA4KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgNylcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgNilcbiAgICBzd2FwKHRoaXMsIGkgKyAyLCBpICsgNSlcbiAgICBzd2FwKHRoaXMsIGkgKyAzLCBpICsgNClcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGggfCAwXG4gIGlmIChsZW5ndGggPT09IDApIHJldHVybiAnJ1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCAwLCBsZW5ndGgpXG4gIHJldHVybiBzbG93VG9TdHJpbmcuYXBwbHkodGhpcywgYXJndW1lbnRzKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyAoYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIGlmICh0aGlzID09PSBiKSByZXR1cm4gdHJ1ZVxuICByZXR1cm4gQnVmZmVyLmNvbXBhcmUodGhpcywgYikgPT09IDBcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCAoKSB7XG4gIHZhciBzdHIgPSAnJ1xuICB2YXIgbWF4ID0gZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFU1xuICBpZiAodGhpcy5sZW5ndGggPiAwKSB7XG4gICAgc3RyID0gdGhpcy50b1N0cmluZygnaGV4JywgMCwgbWF4KS5tYXRjaCgvLnsyfS9nKS5qb2luKCcgJylcbiAgICBpZiAodGhpcy5sZW5ndGggPiBtYXgpIHN0ciArPSAnIC4uLiAnXG4gIH1cbiAgcmV0dXJuICc8QnVmZmVyICcgKyBzdHIgKyAnPidcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAodGFyZ2V0LCBzdGFydCwgZW5kLCB0aGlzU3RhcnQsIHRoaXNFbmQpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGFyZ2V0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICB9XG5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmQgPSB0YXJnZXQgPyB0YXJnZXQubGVuZ3RoIDogMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNTdGFydCA9IDBcbiAgfVxuICBpZiAodGhpc0VuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc0VuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoc3RhcnQgPCAwIHx8IGVuZCA+IHRhcmdldC5sZW5ndGggfHwgdGhpc1N0YXJ0IDwgMCB8fCB0aGlzRW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCAmJiBzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCkge1xuICAgIHJldHVybiAtMVxuICB9XG4gIGlmIChzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMVxuICB9XG5cbiAgc3RhcnQgPj4+PSAwXG4gIGVuZCA+Pj49IDBcbiAgdGhpc1N0YXJ0ID4+Pj0gMFxuICB0aGlzRW5kID4+Pj0gMFxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQpIHJldHVybiAwXG5cbiAgdmFyIHggPSB0aGlzRW5kIC0gdGhpc1N0YXJ0XG4gIHZhciB5ID0gZW5kIC0gc3RhcnRcbiAgdmFyIGxlbiA9IE1hdGgubWluKHgsIHkpXG5cbiAgdmFyIHRoaXNDb3B5ID0gdGhpcy5zbGljZSh0aGlzU3RhcnQsIHRoaXNFbmQpXG4gIHZhciB0YXJnZXRDb3B5ID0gdGFyZ2V0LnNsaWNlKHN0YXJ0LCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgIGlmICh0aGlzQ29weVtpXSAhPT0gdGFyZ2V0Q29weVtpXSkge1xuICAgICAgeCA9IHRoaXNDb3B5W2ldXG4gICAgICB5ID0gdGFyZ2V0Q29weVtpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbi8vIEZpbmRzIGVpdGhlciB0aGUgZmlyc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0ID49IGBieXRlT2Zmc2V0YCxcbi8vIE9SIHRoZSBsYXN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA8PSBgYnl0ZU9mZnNldGAuXG4vL1xuLy8gQXJndW1lbnRzOlxuLy8gLSBidWZmZXIgLSBhIEJ1ZmZlciB0byBzZWFyY2hcbi8vIC0gdmFsIC0gYSBzdHJpbmcsIEJ1ZmZlciwgb3IgbnVtYmVyXG4vLyAtIGJ5dGVPZmZzZXQgLSBhbiBpbmRleCBpbnRvIGBidWZmZXJgOyB3aWxsIGJlIGNsYW1wZWQgdG8gYW4gaW50MzJcbi8vIC0gZW5jb2RpbmcgLSBhbiBvcHRpb25hbCBlbmNvZGluZywgcmVsZXZhbnQgaXMgdmFsIGlzIGEgc3RyaW5nXG4vLyAtIGRpciAtIHRydWUgZm9yIGluZGV4T2YsIGZhbHNlIGZvciBsYXN0SW5kZXhPZlxuZnVuY3Rpb24gYmlkaXJlY3Rpb25hbEluZGV4T2YgKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIC8vIEVtcHR5IGJ1ZmZlciBtZWFucyBubyBtYXRjaFxuICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIC0xXG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXRcbiAgaWYgKHR5cGVvZiBieXRlT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gYnl0ZU9mZnNldFxuICAgIGJ5dGVPZmZzZXQgPSAwXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA+IDB4N2ZmZmZmZmYpIHtcbiAgICBieXRlT2Zmc2V0ID0gMHg3ZmZmZmZmZlxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAtMHg4MDAwMDAwMCkge1xuICAgIGJ5dGVPZmZzZXQgPSAtMHg4MDAwMDAwMFxuICB9XG4gIGJ5dGVPZmZzZXQgPSArYnl0ZU9mZnNldCAgLy8gQ29lcmNlIHRvIE51bWJlci5cbiAgaWYgKGlzTmFOKGJ5dGVPZmZzZXQpKSB7XG4gICAgLy8gYnl0ZU9mZnNldDogaXQgaXQncyB1bmRlZmluZWQsIG51bGwsIE5hTiwgXCJmb29cIiwgZXRjLCBzZWFyY2ggd2hvbGUgYnVmZmVyXG4gICAgYnl0ZU9mZnNldCA9IGRpciA/IDAgOiAoYnVmZmVyLmxlbmd0aCAtIDEpXG4gIH1cblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldDogbmVnYXRpdmUgb2Zmc2V0cyBzdGFydCBmcm9tIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlclxuICBpZiAoYnl0ZU9mZnNldCA8IDApIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoICsgYnl0ZU9mZnNldFxuICBpZiAoYnl0ZU9mZnNldCA+PSBidWZmZXIubGVuZ3RoKSB7XG4gICAgaWYgKGRpcikgcmV0dXJuIC0xXG4gICAgZWxzZSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCAtIDFcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgMCkge1xuICAgIGlmIChkaXIpIGJ5dGVPZmZzZXQgPSAwXG4gICAgZWxzZSByZXR1cm4gLTFcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSB2YWxcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFsID0gQnVmZmVyLmZyb20odmFsLCBlbmNvZGluZylcbiAgfVxuXG4gIC8vIEZpbmFsbHksIHNlYXJjaCBlaXRoZXIgaW5kZXhPZiAoaWYgZGlyIGlzIHRydWUpIG9yIGxhc3RJbmRleE9mXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsKSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogbG9va2luZyBmb3IgZW1wdHkgc3RyaW5nL2J1ZmZlciBhbHdheXMgZmFpbHNcbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAweEZGIC8vIFNlYXJjaCBmb3IgYSBieXRlIHZhbHVlIFswLTI1NV1cbiAgICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiZcbiAgICAgICAgdHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmIChkaXIpIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgWyB2YWwgXSwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlcicpXG59XG5cbmZ1bmN0aW9uIGFycmF5SW5kZXhPZiAoYXJyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgdmFyIGluZGV4U2l6ZSA9IDFcbiAgdmFyIGFyckxlbmd0aCA9IGFyci5sZW5ndGhcbiAgdmFyIHZhbExlbmd0aCA9IHZhbC5sZW5ndGhcblxuICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgaWYgKGVuY29kaW5nID09PSAndWNzMicgfHwgZW5jb2RpbmcgPT09ICd1Y3MtMicgfHxcbiAgICAgICAgZW5jb2RpbmcgPT09ICd1dGYxNmxlJyB8fCBlbmNvZGluZyA9PT0gJ3V0Zi0xNmxlJykge1xuICAgICAgaWYgKGFyci5sZW5ndGggPCAyIHx8IHZhbC5sZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiAtMVxuICAgICAgfVxuICAgICAgaW5kZXhTaXplID0gMlxuICAgICAgYXJyTGVuZ3RoIC89IDJcbiAgICAgIHZhbExlbmd0aCAvPSAyXG4gICAgICBieXRlT2Zmc2V0IC89IDJcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWFkIChidWYsIGkpIHtcbiAgICBpZiAoaW5kZXhTaXplID09PSAxKSB7XG4gICAgICByZXR1cm4gYnVmW2ldXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBidWYucmVhZFVJbnQxNkJFKGkgKiBpbmRleFNpemUpXG4gICAgfVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGRpcikge1xuICAgIHZhciBmb3VuZEluZGV4ID0gLTFcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpIDwgYXJyTGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChyZWFkKGFyciwgaSkgPT09IHJlYWQodmFsLCBmb3VuZEluZGV4ID09PSAtMSA/IDAgOiBpIC0gZm91bmRJbmRleCkpIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggPT09IC0xKSBmb3VuZEluZGV4ID0gaVxuICAgICAgICBpZiAoaSAtIGZvdW5kSW5kZXggKyAxID09PSB2YWxMZW5ndGgpIHJldHVybiBmb3VuZEluZGV4ICogaW5kZXhTaXplXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZm91bmRJbmRleCAhPT0gLTEpIGkgLT0gaSAtIGZvdW5kSW5kZXhcbiAgICAgICAgZm91bmRJbmRleCA9IC0xXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChieXRlT2Zmc2V0ICsgdmFsTGVuZ3RoID4gYXJyTGVuZ3RoKSBieXRlT2Zmc2V0ID0gYXJyTGVuZ3RoIC0gdmFsTGVuZ3RoXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBmb3VuZCA9IHRydWVcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdmFsTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKHJlYWQoYXJyLCBpICsgaikgIT09IHJlYWQodmFsLCBqKSkge1xuICAgICAgICAgIGZvdW5kID0gZmFsc2VcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZm91bmQpIHJldHVybiBpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gdGhpcy5pbmRleE9mKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpICE9PSAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCB0cnVlKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmxhc3RJbmRleE9mID0gZnVuY3Rpb24gbGFzdEluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGZhbHNlKVxufVxuXG5mdW5jdGlvbiBoZXhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIG9mZnNldCA9IE51bWJlcihvZmZzZXQpIHx8IDBcbiAgdmFyIHJlbWFpbmluZyA9IGJ1Zi5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKVxuICAgIGlmIChsZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICAgIH1cbiAgfVxuXG4gIC8vIG11c3QgYmUgYW4gZXZlbiBudW1iZXIgb2YgZGlnaXRzXG4gIHZhciBzdHJMZW4gPSBzdHJpbmcubGVuZ3RoXG4gIGlmIChzdHJMZW4gJSAyICE9PSAwKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGhleCBzdHJpbmcnKVxuXG4gIGlmIChsZW5ndGggPiBzdHJMZW4gLyAyKSB7XG4gICAgbGVuZ3RoID0gc3RyTGVuIC8gMlxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgcGFyc2VkID0gcGFyc2VJbnQoc3RyaW5nLnN1YnN0cihpICogMiwgMiksIDE2KVxuICAgIGlmIChpc05hTihwYXJzZWQpKSByZXR1cm4gaVxuICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHBhcnNlZFxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIHV0ZjhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjhUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGFzY2lpV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihhc2NpaVRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gbGF0aW4xV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYXNjaWlXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGJhc2U2NFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYmFzZTY0VG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiB1Y3MyV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGYxNmxlVG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gd3JpdGUgKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKSB7XG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcpXG4gIGlmIChvZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBvZmZzZXRcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgb2Zmc2V0WywgbGVuZ3RoXVssIGVuY29kaW5nXSlcbiAgfSBlbHNlIGlmIChpc0Zpbml0ZShvZmZzZXQpKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICAgIGlmIChpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICBsZW5ndGggPSBsZW5ndGggfCAwXG4gICAgICBpZiAoZW5jb2RpbmcgPT09IHVuZGVmaW5lZCkgZW5jb2RpbmcgPSAndXRmOCdcbiAgICB9IGVsc2Uge1xuICAgICAgZW5jb2RpbmcgPSBsZW5ndGhcbiAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZFxuICAgIH1cbiAgLy8gbGVnYWN5IHdyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldCwgbGVuZ3RoKSAtIHJlbW92ZSBpbiB2MC4xM1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCdcbiAgICApXG4gIH1cblxuICB2YXIgcmVtYWluaW5nID0gdGhpcy5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IGxlbmd0aCA+IHJlbWFpbmluZykgbGVuZ3RoID0gcmVtYWluaW5nXG5cbiAgaWYgKChzdHJpbmcubGVuZ3RoID4gMCAmJiAobGVuZ3RoIDwgMCB8fCBvZmZzZXQgPCAwKSkgfHwgb2Zmc2V0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsYXRpbjFXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICAvLyBXYXJuaW5nOiBtYXhMZW5ndGggbm90IHRha2VuIGludG8gYWNjb3VudCBpbiBiYXNlNjRXcml0ZVxuICAgICAgICByZXR1cm4gYmFzZTY0V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHVjczJXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04gKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdCdWZmZXInLFxuICAgIGRhdGE6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2FyciB8fCB0aGlzLCAwKVxuICB9XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKHN0YXJ0ID09PSAwICYmIGVuZCA9PT0gYnVmLmxlbmd0aCkge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1Zi5zbGljZShzdGFydCwgZW5kKSlcbiAgfVxufVxuXG5mdW5jdGlvbiB1dGY4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG4gIHZhciByZXMgPSBbXVxuXG4gIHZhciBpID0gc3RhcnRcbiAgd2hpbGUgKGkgPCBlbmQpIHtcbiAgICB2YXIgZmlyc3RCeXRlID0gYnVmW2ldXG4gICAgdmFyIGNvZGVQb2ludCA9IG51bGxcbiAgICB2YXIgYnl0ZXNQZXJTZXF1ZW5jZSA9IChmaXJzdEJ5dGUgPiAweEVGKSA/IDRcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4REYpID8gM1xuICAgICAgOiAoZmlyc3RCeXRlID4gMHhCRikgPyAyXG4gICAgICA6IDFcblxuICAgIGlmIChpICsgYnl0ZXNQZXJTZXF1ZW5jZSA8PSBlbmQpIHtcbiAgICAgIHZhciBzZWNvbmRCeXRlLCB0aGlyZEJ5dGUsIGZvdXJ0aEJ5dGUsIHRlbXBDb2RlUG9pbnRcblxuICAgICAgc3dpdGNoIChieXRlc1BlclNlcXVlbmNlKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBpZiAoZmlyc3RCeXRlIDwgMHg4MCkge1xuICAgICAgICAgICAgY29kZVBvaW50ID0gZmlyc3RCeXRlXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4MUYpIDw8IDB4NiB8IChzZWNvbmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3Rikge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweEMgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4NiB8ICh0aGlyZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGRiAmJiAodGVtcENvZGVQb2ludCA8IDB4RDgwMCB8fCB0ZW1wQ29kZVBvaW50ID4gMHhERkZGKSkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBmb3VydGhCeXRlID0gYnVmW2kgKyAzXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAoZm91cnRoQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHgxMiB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHhDIHwgKHRoaXJkQnl0ZSAmIDB4M0YpIDw8IDB4NiB8IChmb3VydGhCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHhGRkZGICYmIHRlbXBDb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb2RlUG9pbnQgPT09IG51bGwpIHtcbiAgICAgIC8vIHdlIGRpZCBub3QgZ2VuZXJhdGUgYSB2YWxpZCBjb2RlUG9pbnQgc28gaW5zZXJ0IGFcbiAgICAgIC8vIHJlcGxhY2VtZW50IGNoYXIgKFUrRkZGRCkgYW5kIGFkdmFuY2Ugb25seSAxIGJ5dGVcbiAgICAgIGNvZGVQb2ludCA9IDB4RkZGRFxuICAgICAgYnl0ZXNQZXJTZXF1ZW5jZSA9IDFcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA+IDB4RkZGRikge1xuICAgICAgLy8gZW5jb2RlIHRvIHV0ZjE2IChzdXJyb2dhdGUgcGFpciBkYW5jZSlcbiAgICAgIGNvZGVQb2ludCAtPSAweDEwMDAwXG4gICAgICByZXMucHVzaChjb2RlUG9pbnQgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApXG4gICAgICBjb2RlUG9pbnQgPSAweERDMDAgfCBjb2RlUG9pbnQgJiAweDNGRlxuICAgIH1cblxuICAgIHJlcy5wdXNoKGNvZGVQb2ludClcbiAgICBpICs9IGJ5dGVzUGVyU2VxdWVuY2VcbiAgfVxuXG4gIHJldHVybiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkocmVzKVxufVxuXG4vLyBCYXNlZCBvbiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMjc0NzI3Mi82ODA3NDIsIHRoZSBicm93c2VyIHdpdGhcbi8vIHRoZSBsb3dlc3QgbGltaXQgaXMgQ2hyb21lLCB3aXRoIDB4MTAwMDAgYXJncy5cbi8vIFdlIGdvIDEgbWFnbml0dWRlIGxlc3MsIGZvciBzYWZldHlcbnZhciBNQVhfQVJHVU1FTlRTX0xFTkdUSCA9IDB4MTAwMFxuXG5mdW5jdGlvbiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkgKGNvZGVQb2ludHMpIHtcbiAgdmFyIGxlbiA9IGNvZGVQb2ludHMubGVuZ3RoXG4gIGlmIChsZW4gPD0gTUFYX0FSR1VNRU5UU19MRU5HVEgpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGNvZGVQb2ludHMpIC8vIGF2b2lkIGV4dHJhIHNsaWNlKClcbiAgfVxuXG4gIC8vIERlY29kZSBpbiBjaHVua3MgdG8gYXZvaWQgXCJjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIi5cbiAgdmFyIHJlcyA9ICcnXG4gIHZhciBpID0gMFxuICB3aGlsZSAoaSA8IGxlbikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFxuICAgICAgU3RyaW5nLFxuICAgICAgY29kZVBvaW50cy5zbGljZShpLCBpICs9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKVxuICAgIClcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldICYgMHg3RilcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGxhdGluMVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGhleFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGhcblxuICBpZiAoIXN0YXJ0IHx8IHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIGlmICghZW5kIHx8IGVuZCA8IDAgfHwgZW5kID4gbGVuKSBlbmQgPSBsZW5cblxuICB2YXIgb3V0ID0gJydcbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICBvdXQgKz0gdG9IZXgoYnVmW2ldKVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGJ5dGVzID0gYnVmLnNsaWNlKHN0YXJ0LCBlbmQpXG4gIHZhciByZXMgPSAnJ1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0gKyBieXRlc1tpICsgMV0gKiAyNTYpXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIHN0YXJ0ID0gfn5zdGFydFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IH5+ZW5kXG5cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ICs9IGxlblxuICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMFxuICB9IGVsc2UgaWYgKHN0YXJ0ID4gbGVuKSB7XG4gICAgc3RhcnQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCAwKSB7XG4gICAgZW5kICs9IGxlblxuICAgIGlmIChlbmQgPCAwKSBlbmQgPSAwXG4gIH0gZWxzZSBpZiAoZW5kID4gbGVuKSB7XG4gICAgZW5kID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgdmFyIG5ld0J1ZlxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBuZXdCdWYgPSB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpXG4gICAgbmV3QnVmLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICB2YXIgc2xpY2VMZW4gPSBlbmQgLSBzdGFydFxuICAgIG5ld0J1ZiA9IG5ldyBCdWZmZXIoc2xpY2VMZW4sIHVuZGVmaW5lZClcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWNlTGVuOyArK2kpIHtcbiAgICAgIG5ld0J1ZltpXSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdCdWZcbn1cblxuLypcbiAqIE5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYnVmZmVyIGlzbid0IHRyeWluZyB0byB3cml0ZSBvdXQgb2YgYm91bmRzLlxuICovXG5mdW5jdGlvbiBjaGVja09mZnNldCAob2Zmc2V0LCBleHQsIGxlbmd0aCkge1xuICBpZiAoKG9mZnNldCAlIDEpICE9PSAwIHx8IG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdvZmZzZXQgaXMgbm90IHVpbnQnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gbGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRMRSA9IGZ1bmN0aW9uIHJlYWRVSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRCRSA9IGZ1bmN0aW9uIHJlYWRVSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG4gIH1cblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdXG4gIHZhciBtdWwgPSAxXG4gIHdoaWxlIChieXRlTGVuZ3RoID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDggPSBmdW5jdGlvbiByZWFkVUludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2QkUgPSBmdW5jdGlvbiByZWFkVUludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgOCkgfCB0aGlzW29mZnNldCArIDFdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkxFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICgodGhpc1tvZmZzZXRdKSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikpICtcbiAgICAgICh0aGlzW29mZnNldCArIDNdICogMHgxMDAwMDAwKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdICogMHgxMDAwMDAwKSArXG4gICAgKCh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgIHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludExFID0gZnVuY3Rpb24gcmVhZEludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludEJFID0gZnVuY3Rpb24gcmVhZEludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoXG4gIHZhciBtdWwgPSAxXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0taV1cbiAgd2hpbGUgKGkgPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1pXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDggPSBmdW5jdGlvbiByZWFkSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICBpZiAoISh0aGlzW29mZnNldF0gJiAweDgwKSkgcmV0dXJuICh0aGlzW29mZnNldF0pXG4gIHJldHVybiAoKDB4ZmYgLSB0aGlzW29mZnNldF0gKyAxKSAqIC0xKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkxFID0gZnVuY3Rpb24gcmVhZEludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIDFdIHwgKHRoaXNbb2Zmc2V0XSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyTEUgPSBmdW5jdGlvbiByZWFkSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdKSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10gPDwgMjQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyQkUgPSBmdW5jdGlvbiByZWFkSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDI0KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0TEUgPSBmdW5jdGlvbiByZWFkRmxvYXRMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0QkUgPSBmdW5jdGlvbiByZWFkRmxvYXRCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVMRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgNTIsIDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUJFID0gZnVuY3Rpb24gcmVhZERvdWJsZUJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgNTIsIDgpXG59XG5cbmZ1bmN0aW9uIGNoZWNrSW50IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJidWZmZXJcIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJylcbiAgaWYgKHZhbHVlID4gbWF4IHx8IHZhbHVlIDwgbWluKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50OCA9IGZ1bmN0aW9uIHdyaXRlVUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHhmZiwgMClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQxNiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmYgKyB2YWx1ZSArIDFcbiAgZm9yICh2YXIgaSA9IDAsIGogPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gb2Zmc2V0LCAyKTsgaSA8IGo7ICsraSkge1xuICAgIGJ1ZltvZmZzZXQgKyBpXSA9ICh2YWx1ZSAmICgweGZmIDw8ICg4ICogKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkpKSkgPj4+XG4gICAgICAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSAqIDhcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQzMiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgNCk7IGkgPCBqOyArK2kpIHtcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSAodmFsdWUgPj4+IChsaXR0bGVFbmRpYW4gPyBpIDogMyAtIGkpICogOCkgJiAweGZmXG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50TEUgPSBmdW5jdGlvbiB3cml0ZUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gMFxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgLSAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50QkUgPSBmdW5jdGlvbiB3cml0ZUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IDBcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgKyAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50OCA9IGZ1bmN0aW9uIHdyaXRlSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweDdmLCAtMHg4MClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmYgKyB2YWx1ZSArIDFcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuZnVuY3Rpb24gY2hlY2tJRUVFNzU0IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxuICBpZiAob2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRmxvYXQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgNCwgMy40MDI4MjM0NjYzODUyODg2ZSszOCwgLTMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgMjMsIDQpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdExFID0gZnVuY3Rpb24gd3JpdGVGbG9hdExFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0QkUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuZnVuY3Rpb24gd3JpdGVEb3VibGUgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgOCwgMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgsIC0xLjc5NzY5MzEzNDg2MjMxNTdFKzMwOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCA1MiwgOClcbiAgcmV0dXJuIG9mZnNldCArIDhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUxFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlQkUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG4vLyBjb3B5KHRhcmdldEJ1ZmZlciwgdGFyZ2V0U3RhcnQ9MCwgc291cmNlU3RhcnQ9MCwgc291cmNlRW5kPWJ1ZmZlci5sZW5ndGgpXG5CdWZmZXIucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5ICh0YXJnZXQsIHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKSB7XG4gIGlmICghc3RhcnQpIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCAmJiBlbmQgIT09IDApIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXRTdGFydCA+PSB0YXJnZXQubGVuZ3RoKSB0YXJnZXRTdGFydCA9IHRhcmdldC5sZW5ndGhcbiAgaWYgKCF0YXJnZXRTdGFydCkgdGFyZ2V0U3RhcnQgPSAwXG4gIGlmIChlbmQgPiAwICYmIGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIC8vIENvcHkgMCBieXRlczsgd2UncmUgZG9uZVxuICBpZiAoZW5kID09PSBzdGFydCkgcmV0dXJuIDBcbiAgaWYgKHRhcmdldC5sZW5ndGggPT09IDAgfHwgdGhpcy5sZW5ndGggPT09IDApIHJldHVybiAwXG5cbiAgLy8gRmF0YWwgZXJyb3IgY29uZGl0aW9uc1xuICBpZiAodGFyZ2V0U3RhcnQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3RhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICB9XG4gIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgaWYgKGVuZCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcycpXG5cbiAgLy8gQXJlIHdlIG9vYj9cbiAgaWYgKGVuZCA+IHRoaXMubGVuZ3RoKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0IDwgZW5kIC0gc3RhcnQpIHtcbiAgICBlbmQgPSB0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgKyBzdGFydFxuICB9XG5cbiAgdmFyIGxlbiA9IGVuZCAtIHN0YXJ0XG4gIHZhciBpXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCAmJiBzdGFydCA8IHRhcmdldFN0YXJ0ICYmIHRhcmdldFN0YXJ0IDwgZW5kKSB7XG4gICAgLy8gZGVzY2VuZGluZyBjb3B5IGZyb20gZW5kXG4gICAgZm9yIChpID0gbGVuIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2UgaWYgKGxlbiA8IDEwMDAgfHwgIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gYXNjZW5kaW5nIGNvcHkgZnJvbSBzdGFydFxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoXG4gICAgICB0YXJnZXQsXG4gICAgICB0aGlzLnN1YmFycmF5KHN0YXJ0LCBzdGFydCArIGxlbiksXG4gICAgICB0YXJnZXRTdGFydFxuICAgIClcbiAgfVxuXG4gIHJldHVybiBsZW5cbn1cblxuLy8gVXNhZ2U6XG4vLyAgICBidWZmZXIuZmlsbChudW1iZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKGJ1ZmZlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoc3RyaW5nWywgb2Zmc2V0WywgZW5kXV1bLCBlbmNvZGluZ10pXG5CdWZmZXIucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbiBmaWxsICh2YWwsIHN0YXJ0LCBlbmQsIGVuY29kaW5nKSB7XG4gIC8vIEhhbmRsZSBzdHJpbmcgY2FzZXM6XG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIGlmICh0eXBlb2Ygc3RhcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IHN0YXJ0XG4gICAgICBzdGFydCA9IDBcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZW5kID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBlbmRcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfVxuICAgIGlmICh2YWwubGVuZ3RoID09PSAxKSB7XG4gICAgICB2YXIgY29kZSA9IHZhbC5jaGFyQ29kZUF0KDApXG4gICAgICBpZiAoY29kZSA8IDI1Nikge1xuICAgICAgICB2YWwgPSBjb2RlXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2VuY29kaW5nIG11c3QgYmUgYSBzdHJpbmcnKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJyAmJiAhQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMjU1XG4gIH1cblxuICAvLyBJbnZhbGlkIHJhbmdlcyBhcmUgbm90IHNldCB0byBhIGRlZmF1bHQsIHNvIGNhbiByYW5nZSBjaGVjayBlYXJseS5cbiAgaWYgKHN0YXJ0IDwgMCB8fCB0aGlzLmxlbmd0aCA8IHN0YXJ0IHx8IHRoaXMubGVuZ3RoIDwgZW5kKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ091dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHN0YXJ0ID0gc3RhcnQgPj4+IDBcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyB0aGlzLmxlbmd0aCA6IGVuZCA+Pj4gMFxuXG4gIGlmICghdmFsKSB2YWwgPSAwXG5cbiAgdmFyIGlcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgdGhpc1tpXSA9IHZhbFxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgYnl0ZXMgPSBCdWZmZXIuaXNCdWZmZXIodmFsKVxuICAgICAgPyB2YWxcbiAgICAgIDogdXRmOFRvQnl0ZXMobmV3IEJ1ZmZlcih2YWwsIGVuY29kaW5nKS50b1N0cmluZygpKVxuICAgIHZhciBsZW4gPSBieXRlcy5sZW5ndGhcbiAgICBmb3IgKGkgPSAwOyBpIDwgZW5kIC0gc3RhcnQ7ICsraSkge1xuICAgICAgdGhpc1tpICsgc3RhcnRdID0gYnl0ZXNbaSAlIGxlbl1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpc1xufVxuXG4vLyBIRUxQRVIgRlVOQ1RJT05TXG4vLyA9PT09PT09PT09PT09PT09XG5cbnZhciBJTlZBTElEX0JBU0U2NF9SRSA9IC9bXitcXC8wLTlBLVphLXotX10vZ1xuXG5mdW5jdGlvbiBiYXNlNjRjbGVhbiAoc3RyKSB7XG4gIC8vIE5vZGUgc3RyaXBzIG91dCBpbnZhbGlkIGNoYXJhY3RlcnMgbGlrZSBcXG4gYW5kIFxcdCBmcm9tIHRoZSBzdHJpbmcsIGJhc2U2NC1qcyBkb2VzIG5vdFxuICBzdHIgPSBzdHJpbmd0cmltKHN0cikucmVwbGFjZShJTlZBTElEX0JBU0U2NF9SRSwgJycpXG4gIC8vIE5vZGUgY29udmVydHMgc3RyaW5ncyB3aXRoIGxlbmd0aCA8IDIgdG8gJydcbiAgaWYgKHN0ci5sZW5ndGggPCAyKSByZXR1cm4gJydcbiAgLy8gTm9kZSBhbGxvd3MgZm9yIG5vbi1wYWRkZWQgYmFzZTY0IHN0cmluZ3MgKG1pc3NpbmcgdHJhaWxpbmcgPT09KSwgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHdoaWxlIChzdHIubGVuZ3RoICUgNCAhPT0gMCkge1xuICAgIHN0ciA9IHN0ciArICc9J1xuICB9XG4gIHJldHVybiBzdHJcbn1cblxuZnVuY3Rpb24gc3RyaW5ndHJpbSAoc3RyKSB7XG4gIGlmIChzdHIudHJpbSkgcmV0dXJuIHN0ci50cmltKClcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJylcbn1cblxuZnVuY3Rpb24gdG9IZXggKG4pIHtcbiAgaWYgKG4gPCAxNikgcmV0dXJuICcwJyArIG4udG9TdHJpbmcoMTYpXG4gIHJldHVybiBuLnRvU3RyaW5nKDE2KVxufVxuXG5mdW5jdGlvbiB1dGY4VG9CeXRlcyAoc3RyaW5nLCB1bml0cykge1xuICB1bml0cyA9IHVuaXRzIHx8IEluZmluaXR5XG4gIHZhciBjb2RlUG9pbnRcbiAgdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGhcbiAgdmFyIGxlYWRTdXJyb2dhdGUgPSBudWxsXG4gIHZhciBieXRlcyA9IFtdXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGNvZGVQb2ludCA9IHN0cmluZy5jaGFyQ29kZUF0KGkpXG5cbiAgICAvLyBpcyBzdXJyb2dhdGUgY29tcG9uZW50XG4gICAgaWYgKGNvZGVQb2ludCA+IDB4RDdGRiAmJiBjb2RlUG9pbnQgPCAweEUwMDApIHtcbiAgICAgIC8vIGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoIWxlYWRTdXJyb2dhdGUpIHtcbiAgICAgICAgLy8gbm8gbGVhZCB5ZXRcbiAgICAgICAgaWYgKGNvZGVQb2ludCA+IDB4REJGRikge1xuICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgdHJhaWxcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9IGVsc2UgaWYgKGkgKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICAvLyB1bnBhaXJlZCBsZWFkXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHZhbGlkIGxlYWRcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIDIgbGVhZHMgaW4gYSByb3dcbiAgICAgIGlmIChjb2RlUG9pbnQgPCAweERDMDApIHtcbiAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gdmFsaWQgc3Vycm9nYXRlIHBhaXJcbiAgICAgIGNvZGVQb2ludCA9IChsZWFkU3Vycm9nYXRlIC0gMHhEODAwIDw8IDEwIHwgY29kZVBvaW50IC0gMHhEQzAwKSArIDB4MTAwMDBcbiAgICB9IGVsc2UgaWYgKGxlYWRTdXJyb2dhdGUpIHtcbiAgICAgIC8vIHZhbGlkIGJtcCBjaGFyLCBidXQgbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgIH1cblxuICAgIGxlYWRTdXJyb2dhdGUgPSBudWxsXG5cbiAgICAvLyBlbmNvZGUgdXRmOFxuICAgIGlmIChjb2RlUG9pbnQgPCAweDgwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDEpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goY29kZVBvaW50KVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHg4MDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiB8IDB4QzAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDMpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgfCAweEUwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSA0KSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHgxMiB8IDB4RjAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29kZSBwb2ludCcpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpVG9CeXRlcyAoc3RyKSB7XG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIC8vIE5vZGUncyBjb2RlIHNlZW1zIHRvIGJlIGRvaW5nIHRoaXMgYW5kIG5vdCAmIDB4N0YuLlxuICAgIGJ5dGVBcnJheS5wdXNoKHN0ci5jaGFyQ29kZUF0KGkpICYgMHhGRilcbiAgfVxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVUb0J5dGVzIChzdHIsIHVuaXRzKSB7XG4gIHZhciBjLCBoaSwgbG9cbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG5cbiAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSlcbiAgICBoaSA9IGMgPj4gOFxuICAgIGxvID0gYyAlIDI1NlxuICAgIGJ5dGVBcnJheS5wdXNoKGxvKVxuICAgIGJ5dGVBcnJheS5wdXNoKGhpKVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiBiYXNlNjRUb0J5dGVzIChzdHIpIHtcbiAgcmV0dXJuIGJhc2U2NC50b0J5dGVBcnJheShiYXNlNjRjbGVhbihzdHIpKVxufVxuXG5mdW5jdGlvbiBibGl0QnVmZmVyIChzcmMsIGRzdCwgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGlmICgoaSArIG9mZnNldCA+PSBkc3QubGVuZ3RoKSB8fCAoaSA+PSBzcmMubGVuZ3RoKSkgYnJlYWtcbiAgICBkc3RbaSArIG9mZnNldF0gPSBzcmNbaV1cbiAgfVxuICByZXR1cm4gaVxufVxuXG5mdW5jdGlvbiBpc25hbiAodmFsKSB7XG4gIHJldHVybiB2YWwgIT09IHZhbCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxufVxuIiwiLyohIGllZWU3NTQuIEJTRC0zLUNsYXVzZSBMaWNlbnNlLiBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmcvb3BlbnNvdXJjZT4gKi9cbmV4cG9ydHMucmVhZCA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtXG4gIHZhciBlTGVuID0gKG5CeXRlcyAqIDgpIC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBuQml0cyA9IC03XG4gIHZhciBpID0gaXNMRSA/IChuQnl0ZXMgLSAxKSA6IDBcbiAgdmFyIGQgPSBpc0xFID8gLTEgOiAxXG4gIHZhciBzID0gYnVmZmVyW29mZnNldCArIGldXG5cbiAgaSArPSBkXG5cbiAgZSA9IHMgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgcyA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gZUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBlID0gKGUgKiAyNTYpICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgbSA9IGUgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgZSA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gbUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gKG0gKiAyNTYpICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgaWYgKGUgPT09IDApIHtcbiAgICBlID0gMSAtIGVCaWFzXG4gIH0gZWxzZSBpZiAoZSA9PT0gZU1heCkge1xuICAgIHJldHVybiBtID8gTmFOIDogKChzID8gLTEgOiAxKSAqIEluZmluaXR5KVxuICB9IGVsc2Uge1xuICAgIG0gPSBtICsgTWF0aC5wb3coMiwgbUxlbilcbiAgICBlID0gZSAtIGVCaWFzXG4gIH1cbiAgcmV0dXJuIChzID8gLTEgOiAxKSAqIG0gKiBNYXRoLnBvdygyLCBlIC0gbUxlbilcbn1cblxuZXhwb3J0cy53cml0ZSA9IGZ1bmN0aW9uIChidWZmZXIsIHZhbHVlLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbSwgY1xuICB2YXIgZUxlbiA9IChuQnl0ZXMgKiA4KSAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgcnQgPSAobUxlbiA9PT0gMjMgPyBNYXRoLnBvdygyLCAtMjQpIC0gTWF0aC5wb3coMiwgLTc3KSA6IDApXG4gIHZhciBpID0gaXNMRSA/IDAgOiAobkJ5dGVzIC0gMSlcbiAgdmFyIGQgPSBpc0xFID8gMSA6IC0xXG4gIHZhciBzID0gdmFsdWUgPCAwIHx8ICh2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPCAwKSA/IDEgOiAwXG5cbiAgdmFsdWUgPSBNYXRoLmFicyh2YWx1ZSlcblxuICBpZiAoaXNOYU4odmFsdWUpIHx8IHZhbHVlID09PSBJbmZpbml0eSkge1xuICAgIG0gPSBpc05hTih2YWx1ZSkgPyAxIDogMFxuICAgIGUgPSBlTWF4XG4gIH0gZWxzZSB7XG4gICAgZSA9IE1hdGguZmxvb3IoTWF0aC5sb2codmFsdWUpIC8gTWF0aC5MTjIpXG4gICAgaWYgKHZhbHVlICogKGMgPSBNYXRoLnBvdygyLCAtZSkpIDwgMSkge1xuICAgICAgZS0tXG4gICAgICBjICo9IDJcbiAgICB9XG4gICAgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICB2YWx1ZSArPSBydCAvIGNcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgKz0gcnQgKiBNYXRoLnBvdygyLCAxIC0gZUJpYXMpXG4gICAgfVxuICAgIGlmICh2YWx1ZSAqIGMgPj0gMikge1xuICAgICAgZSsrXG4gICAgICBjIC89IDJcbiAgICB9XG5cbiAgICBpZiAoZSArIGVCaWFzID49IGVNYXgpIHtcbiAgICAgIG0gPSAwXG4gICAgICBlID0gZU1heFxuICAgIH0gZWxzZSBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIG0gPSAoKHZhbHVlICogYykgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gZSArIGVCaWFzXG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIE1hdGgucG93KDIsIGVCaWFzIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IDBcbiAgICB9XG4gIH1cblxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBtICYgMHhmZiwgaSArPSBkLCBtIC89IDI1NiwgbUxlbiAtPSA4KSB7fVxuXG4gIGUgPSAoZSA8PCBtTGVuKSB8IG1cbiAgZUxlbiArPSBtTGVuXG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjhcbn1cbiIsInZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKGFycikge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChhcnIpID09ICdbb2JqZWN0IEFycmF5XSc7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBMb25nO1xyXG5cclxuLyoqXHJcbiAqIHdhc20gb3B0aW1pemF0aW9ucywgdG8gZG8gbmF0aXZlIGk2NCBtdWx0aXBsaWNhdGlvbiBhbmQgZGl2aWRlXHJcbiAqL1xyXG52YXIgd2FzbSA9IG51bGw7XHJcblxyXG50cnkge1xyXG4gIHdhc20gPSBuZXcgV2ViQXNzZW1ibHkuSW5zdGFuY2UobmV3IFdlYkFzc2VtYmx5Lk1vZHVsZShuZXcgVWludDhBcnJheShbXHJcbiAgICAwLCA5NywgMTE1LCAxMDksIDEsIDAsIDAsIDAsIDEsIDEzLCAyLCA5NiwgMCwgMSwgMTI3LCA5NiwgNCwgMTI3LCAxMjcsIDEyNywgMTI3LCAxLCAxMjcsIDMsIDcsIDYsIDAsIDEsIDEsIDEsIDEsIDEsIDYsIDYsIDEsIDEyNywgMSwgNjUsIDAsIDExLCA3LCA1MCwgNiwgMywgMTA5LCAxMTcsIDEwOCwgMCwgMSwgNSwgMTAwLCAxMDUsIDExOCwgOTUsIDExNSwgMCwgMiwgNSwgMTAwLCAxMDUsIDExOCwgOTUsIDExNywgMCwgMywgNSwgMTE0LCAxMDEsIDEwOSwgOTUsIDExNSwgMCwgNCwgNSwgMTE0LCAxMDEsIDEwOSwgOTUsIDExNywgMCwgNSwgOCwgMTAzLCAxMDEsIDExNiwgOTUsIDEwNCwgMTA1LCAxMDMsIDEwNCwgMCwgMCwgMTAsIDE5MSwgMSwgNiwgNCwgMCwgMzUsIDAsIDExLCAzNiwgMSwgMSwgMTI2LCAzMiwgMCwgMTczLCAzMiwgMSwgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAzMiwgMiwgMTczLCAzMiwgMywgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAxMjYsIDM0LCA0LCA2NiwgMzIsIDEzNSwgMTY3LCAzNiwgMCwgMzIsIDQsIDE2NywgMTEsIDM2LCAxLCAxLCAxMjYsIDMyLCAwLCAxNzMsIDMyLCAxLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDMyLCAyLCAxNzMsIDMyLCAzLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDEyNywgMzQsIDQsIDY2LCAzMiwgMTM1LCAxNjcsIDM2LCAwLCAzMiwgNCwgMTY3LCAxMSwgMzYsIDEsIDEsIDEyNiwgMzIsIDAsIDE3MywgMzIsIDEsIDE3MywgNjYsIDMyLCAxMzQsIDEzMiwgMzIsIDIsIDE3MywgMzIsIDMsIDE3MywgNjYsIDMyLCAxMzQsIDEzMiwgMTI4LCAzNCwgNCwgNjYsIDMyLCAxMzUsIDE2NywgMzYsIDAsIDMyLCA0LCAxNjcsIDExLCAzNiwgMSwgMSwgMTI2LCAzMiwgMCwgMTczLCAzMiwgMSwgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAzMiwgMiwgMTczLCAzMiwgMywgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAxMjksIDM0LCA0LCA2NiwgMzIsIDEzNSwgMTY3LCAzNiwgMCwgMzIsIDQsIDE2NywgMTEsIDM2LCAxLCAxLCAxMjYsIDMyLCAwLCAxNzMsIDMyLCAxLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDMyLCAyLCAxNzMsIDMyLCAzLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDEzMCwgMzQsIDQsIDY2LCAzMiwgMTM1LCAxNjcsIDM2LCAwLCAzMiwgNCwgMTY3LCAxMVxyXG4gIF0pKSwge30pLmV4cG9ydHM7XHJcbn0gY2F0Y2ggKGUpIHtcclxuICAvLyBubyB3YXNtIHN1cHBvcnQgOihcclxufVxyXG5cclxuLyoqXHJcbiAqIENvbnN0cnVjdHMgYSA2NCBiaXQgdHdvJ3MtY29tcGxlbWVudCBpbnRlZ2VyLCBnaXZlbiBpdHMgbG93IGFuZCBoaWdoIDMyIGJpdCB2YWx1ZXMgYXMgKnNpZ25lZCogaW50ZWdlcnMuXHJcbiAqICBTZWUgdGhlIGZyb20qIGZ1bmN0aW9ucyBiZWxvdyBmb3IgbW9yZSBjb252ZW5pZW50IHdheXMgb2YgY29uc3RydWN0aW5nIExvbmdzLlxyXG4gKiBAZXhwb3J0cyBMb25nXHJcbiAqIEBjbGFzcyBBIExvbmcgY2xhc3MgZm9yIHJlcHJlc2VudGluZyBhIDY0IGJpdCB0d28ncy1jb21wbGVtZW50IGludGVnZXIgdmFsdWUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBsb3cgVGhlIGxvdyAoc2lnbmVkKSAzMiBiaXRzIG9mIHRoZSBsb25nXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBoaWdoIFRoZSBoaWdoIChzaWduZWQpIDMyIGJpdHMgb2YgdGhlIGxvbmdcclxuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxyXG4gKiBAY29uc3RydWN0b3JcclxuICovXHJcbmZ1bmN0aW9uIExvbmcobG93LCBoaWdoLCB1bnNpZ25lZCkge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGxvdyAzMiBiaXRzIGFzIGEgc2lnbmVkIHZhbHVlLlxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xyXG4gICAgdGhpcy5sb3cgPSBsb3cgfCAwO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGhpZ2ggMzIgYml0cyBhcyBhIHNpZ25lZCB2YWx1ZS5cclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cclxuICAgIHRoaXMuaGlnaCA9IGhpZ2ggfCAwO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hldGhlciB1bnNpZ25lZCBvciBub3QuXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgdGhpcy51bnNpZ25lZCA9ICEhdW5zaWduZWQ7XHJcbn1cclxuXHJcbi8vIFRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBhIGxvbmcgaXMgdGhlIHR3byBnaXZlbiBzaWduZWQsIDMyLWJpdCB2YWx1ZXMuXHJcbi8vIFdlIHVzZSAzMi1iaXQgcGllY2VzIGJlY2F1c2UgdGhlc2UgYXJlIHRoZSBzaXplIG9mIGludGVnZXJzIG9uIHdoaWNoXHJcbi8vIEphdmFzY3JpcHQgcGVyZm9ybXMgYml0LW9wZXJhdGlvbnMuICBGb3Igb3BlcmF0aW9ucyBsaWtlIGFkZGl0aW9uIGFuZFxyXG4vLyBtdWx0aXBsaWNhdGlvbiwgd2Ugc3BsaXQgZWFjaCBudW1iZXIgaW50byAxNiBiaXQgcGllY2VzLCB3aGljaCBjYW4gZWFzaWx5IGJlXHJcbi8vIG11bHRpcGxpZWQgd2l0aGluIEphdmFzY3JpcHQncyBmbG9hdGluZy1wb2ludCByZXByZXNlbnRhdGlvbiB3aXRob3V0IG92ZXJmbG93XHJcbi8vIG9yIGNoYW5nZSBpbiBzaWduLlxyXG4vL1xyXG4vLyBJbiB0aGUgYWxnb3JpdGhtcyBiZWxvdywgd2UgZnJlcXVlbnRseSByZWR1Y2UgdGhlIG5lZ2F0aXZlIGNhc2UgdG8gdGhlXHJcbi8vIHBvc2l0aXZlIGNhc2UgYnkgbmVnYXRpbmcgdGhlIGlucHV0KHMpIGFuZCB0aGVuIHBvc3QtcHJvY2Vzc2luZyB0aGUgcmVzdWx0LlxyXG4vLyBOb3RlIHRoYXQgd2UgbXVzdCBBTFdBWVMgY2hlY2sgc3BlY2lhbGx5IHdoZXRoZXIgdGhvc2UgdmFsdWVzIGFyZSBNSU5fVkFMVUVcclxuLy8gKC0yXjYzKSBiZWNhdXNlIC1NSU5fVkFMVUUgPT0gTUlOX1ZBTFVFIChzaW5jZSAyXjYzIGNhbm5vdCBiZSByZXByZXNlbnRlZCBhc1xyXG4vLyBhIHBvc2l0aXZlIG51bWJlciwgaXQgb3ZlcmZsb3dzIGJhY2sgaW50byBhIG5lZ2F0aXZlKS4gIE5vdCBoYW5kbGluZyB0aGlzXHJcbi8vIGNhc2Ugd291bGQgb2Z0ZW4gcmVzdWx0IGluIGluZmluaXRlIHJlY3Vyc2lvbi5cclxuLy9cclxuLy8gQ29tbW9uIGNvbnN0YW50IHZhbHVlcyBaRVJPLCBPTkUsIE5FR19PTkUsIGV0Yy4gYXJlIGRlZmluZWQgYmVsb3cgdGhlIGZyb20qXHJcbi8vIG1ldGhvZHMgb24gd2hpY2ggdGhleSBkZXBlbmQuXHJcblxyXG4vKipcclxuICogQW4gaW5kaWNhdG9yIHVzZWQgdG8gcmVsaWFibHkgZGV0ZXJtaW5lIGlmIGFuIG9iamVjdCBpcyBhIExvbmcgb3Igbm90LlxyXG4gKiBAdHlwZSB7Ym9vbGVhbn1cclxuICogQGNvbnN0XHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5Mb25nLnByb3RvdHlwZS5fX2lzTG9uZ19fO1xyXG5cclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KExvbmcucHJvdG90eXBlLCBcIl9faXNMb25nX19cIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxuXHJcbi8qKlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHsqfSBvYmogT2JqZWN0XHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKiBAaW5uZXJcclxuICovXHJcbmZ1bmN0aW9uIGlzTG9uZyhvYmopIHtcclxuICAgIHJldHVybiAob2JqICYmIG9ialtcIl9faXNMb25nX19cIl0pID09PSB0cnVlO1xyXG59XHJcblxyXG4vKipcclxuICogVGVzdHMgaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgYSBMb25nLlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHsqfSBvYmogT2JqZWN0XHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxuTG9uZy5pc0xvbmcgPSBpc0xvbmc7XHJcblxyXG4vKipcclxuICogQSBjYWNoZSBvZiB0aGUgTG9uZyByZXByZXNlbnRhdGlvbnMgb2Ygc21hbGwgaW50ZWdlciB2YWx1ZXMuXHJcbiAqIEB0eXBlIHshT2JqZWN0fVxyXG4gKiBAaW5uZXJcclxuICovXHJcbnZhciBJTlRfQ0FDSEUgPSB7fTtcclxuXHJcbi8qKlxyXG4gKiBBIGNhY2hlIG9mIHRoZSBMb25nIHJlcHJlc2VudGF0aW9ucyBvZiBzbWFsbCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlcy5cclxuICogQHR5cGUgeyFPYmplY3R9XHJcbiAqIEBpbm5lclxyXG4gKi9cclxudmFyIFVJTlRfQ0FDSEUgPSB7fTtcclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcclxuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWRcclxuICogQHJldHVybnMgeyFMb25nfVxyXG4gKiBAaW5uZXJcclxuICovXHJcbmZ1bmN0aW9uIGZyb21JbnQodmFsdWUsIHVuc2lnbmVkKSB7XHJcbiAgICB2YXIgb2JqLCBjYWNoZWRPYmosIGNhY2hlO1xyXG4gICAgaWYgKHVuc2lnbmVkKSB7XHJcbiAgICAgICAgdmFsdWUgPj4+PSAwO1xyXG4gICAgICAgIGlmIChjYWNoZSA9ICgwIDw9IHZhbHVlICYmIHZhbHVlIDwgMjU2KSkge1xyXG4gICAgICAgICAgICBjYWNoZWRPYmogPSBVSU5UX0NBQ0hFW3ZhbHVlXTtcclxuICAgICAgICAgICAgaWYgKGNhY2hlZE9iailcclxuICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZWRPYmo7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9iaiA9IGZyb21CaXRzKHZhbHVlLCAodmFsdWUgfCAwKSA8IDAgPyAtMSA6IDAsIHRydWUpO1xyXG4gICAgICAgIGlmIChjYWNoZSlcclxuICAgICAgICAgICAgVUlOVF9DQUNIRVt2YWx1ZV0gPSBvYmo7XHJcbiAgICAgICAgcmV0dXJuIG9iajtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdmFsdWUgfD0gMDtcclxuICAgICAgICBpZiAoY2FjaGUgPSAoLTEyOCA8PSB2YWx1ZSAmJiB2YWx1ZSA8IDEyOCkpIHtcclxuICAgICAgICAgICAgY2FjaGVkT2JqID0gSU5UX0NBQ0hFW3ZhbHVlXTtcclxuICAgICAgICAgICAgaWYgKGNhY2hlZE9iailcclxuICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZWRPYmo7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9iaiA9IGZyb21CaXRzKHZhbHVlLCB2YWx1ZSA8IDAgPyAtMSA6IDAsIGZhbHNlKTtcclxuICAgICAgICBpZiAoY2FjaGUpXHJcbiAgICAgICAgICAgIElOVF9DQUNIRVt2YWx1ZV0gPSBvYmo7XHJcbiAgICAgICAgcmV0dXJuIG9iajtcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSBMb25nIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gMzIgYml0IGludGVnZXIgdmFsdWUuXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVGhlIDMyIGJpdCBpbnRlZ2VyIGluIHF1ZXN0aW9uXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcclxuICogQHJldHVybnMgeyFMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXHJcbiAqL1xyXG5Mb25nLmZyb21JbnQgPSBmcm9tSW50O1xyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxyXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZFxyXG4gKiBAcmV0dXJucyB7IUxvbmd9XHJcbiAqIEBpbm5lclxyXG4gKi9cclxuZnVuY3Rpb24gZnJvbU51bWJlcih2YWx1ZSwgdW5zaWduZWQpIHtcclxuICAgIGlmIChpc05hTih2YWx1ZSkpXHJcbiAgICAgICAgcmV0dXJuIHVuc2lnbmVkID8gVVpFUk8gOiBaRVJPO1xyXG4gICAgaWYgKHVuc2lnbmVkKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlIDwgMClcclxuICAgICAgICAgICAgcmV0dXJuIFVaRVJPO1xyXG4gICAgICAgIGlmICh2YWx1ZSA+PSBUV09fUFdSXzY0X0RCTClcclxuICAgICAgICAgICAgcmV0dXJuIE1BWF9VTlNJR05FRF9WQUxVRTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKHZhbHVlIDw9IC1UV09fUFdSXzYzX0RCTClcclxuICAgICAgICAgICAgcmV0dXJuIE1JTl9WQUxVRTtcclxuICAgICAgICBpZiAodmFsdWUgKyAxID49IFRXT19QV1JfNjNfREJMKVxyXG4gICAgICAgICAgICByZXR1cm4gTUFYX1ZBTFVFO1xyXG4gICAgfVxyXG4gICAgaWYgKHZhbHVlIDwgMClcclxuICAgICAgICByZXR1cm4gZnJvbU51bWJlcigtdmFsdWUsIHVuc2lnbmVkKS5uZWcoKTtcclxuICAgIHJldHVybiBmcm9tQml0cygodmFsdWUgJSBUV09fUFdSXzMyX0RCTCkgfCAwLCAodmFsdWUgLyBUV09fUFdSXzMyX0RCTCkgfCAwLCB1bnNpZ25lZCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgTG9uZyByZXByZXNlbnRpbmcgdGhlIGdpdmVuIHZhbHVlLCBwcm92aWRlZCB0aGF0IGl0IGlzIGEgZmluaXRlIG51bWJlci4gT3RoZXJ3aXNlLCB6ZXJvIGlzIHJldHVybmVkLlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFRoZSBudW1iZXIgaW4gcXVlc3Rpb25cclxuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxyXG4gKiBAcmV0dXJucyB7IUxvbmd9IFRoZSBjb3JyZXNwb25kaW5nIExvbmcgdmFsdWVcclxuICovXHJcbkxvbmcuZnJvbU51bWJlciA9IGZyb21OdW1iZXI7XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtudW1iZXJ9IGxvd0JpdHNcclxuICogQHBhcmFtIHtudW1iZXJ9IGhpZ2hCaXRzXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkXHJcbiAqIEByZXR1cm5zIHshTG9uZ31cclxuICogQGlubmVyXHJcbiAqL1xyXG5mdW5jdGlvbiBmcm9tQml0cyhsb3dCaXRzLCBoaWdoQml0cywgdW5zaWduZWQpIHtcclxuICAgIHJldHVybiBuZXcgTG9uZyhsb3dCaXRzLCBoaWdoQml0cywgdW5zaWduZWQpO1xyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIExvbmcgcmVwcmVzZW50aW5nIHRoZSA2NCBiaXQgaW50ZWdlciB0aGF0IGNvbWVzIGJ5IGNvbmNhdGVuYXRpbmcgdGhlIGdpdmVuIGxvdyBhbmQgaGlnaCBiaXRzLiBFYWNoIGlzXHJcbiAqICBhc3N1bWVkIHRvIHVzZSAzMiBiaXRzLlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtudW1iZXJ9IGxvd0JpdHMgVGhlIGxvdyAzMiBiaXRzXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBoaWdoQml0cyBUaGUgaGlnaCAzMiBiaXRzXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcclxuICogQHJldHVybnMgeyFMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXHJcbiAqL1xyXG5Mb25nLmZyb21CaXRzID0gZnJvbUJpdHM7XHJcblxyXG4vKipcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBiYXNlXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBleHBvbmVudFxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gKiBAaW5uZXJcclxuICovXHJcbnZhciBwb3dfZGJsID0gTWF0aC5wb3c7IC8vIFVzZWQgNCB0aW1lcyAoNCo4IHRvIDE1KzQpXHJcblxyXG4vKipcclxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxyXG4gKiBAcGFyYW0geyhib29sZWFufG51bWJlcik9fSB1bnNpZ25lZFxyXG4gKiBAcGFyYW0ge251bWJlcj19IHJhZGl4XHJcbiAqIEByZXR1cm5zIHshTG9uZ31cclxuICogQGlubmVyXHJcbiAqL1xyXG5mdW5jdGlvbiBmcm9tU3RyaW5nKHN0ciwgdW5zaWduZWQsIHJhZGl4KSB7XHJcbiAgICBpZiAoc3RyLmxlbmd0aCA9PT0gMClcclxuICAgICAgICB0aHJvdyBFcnJvcignZW1wdHkgc3RyaW5nJyk7XHJcbiAgICBpZiAoc3RyID09PSBcIk5hTlwiIHx8IHN0ciA9PT0gXCJJbmZpbml0eVwiIHx8IHN0ciA9PT0gXCIrSW5maW5pdHlcIiB8fCBzdHIgPT09IFwiLUluZmluaXR5XCIpXHJcbiAgICAgICAgcmV0dXJuIFpFUk87XHJcbiAgICBpZiAodHlwZW9mIHVuc2lnbmVkID09PSAnbnVtYmVyJykge1xyXG4gICAgICAgIC8vIEZvciBnb29nLm1hdGgubG9uZyBjb21wYXRpYmlsaXR5XHJcbiAgICAgICAgcmFkaXggPSB1bnNpZ25lZCxcclxuICAgICAgICB1bnNpZ25lZCA9IGZhbHNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICB1bnNpZ25lZCA9ICEhIHVuc2lnbmVkO1xyXG4gICAgfVxyXG4gICAgcmFkaXggPSByYWRpeCB8fCAxMDtcclxuICAgIGlmIChyYWRpeCA8IDIgfHwgMzYgPCByYWRpeClcclxuICAgICAgICB0aHJvdyBSYW5nZUVycm9yKCdyYWRpeCcpO1xyXG5cclxuICAgIHZhciBwO1xyXG4gICAgaWYgKChwID0gc3RyLmluZGV4T2YoJy0nKSkgPiAwKVxyXG4gICAgICAgIHRocm93IEVycm9yKCdpbnRlcmlvciBoeXBoZW4nKTtcclxuICAgIGVsc2UgaWYgKHAgPT09IDApIHtcclxuICAgICAgICByZXR1cm4gZnJvbVN0cmluZyhzdHIuc3Vic3RyaW5nKDEpLCB1bnNpZ25lZCwgcmFkaXgpLm5lZygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIERvIHNldmVyYWwgKDgpIGRpZ2l0cyBlYWNoIHRpbWUgdGhyb3VnaCB0aGUgbG9vcCwgc28gYXMgdG9cclxuICAgIC8vIG1pbmltaXplIHRoZSBjYWxscyB0byB0aGUgdmVyeSBleHBlbnNpdmUgZW11bGF0ZWQgZGl2LlxyXG4gICAgdmFyIHJhZGl4VG9Qb3dlciA9IGZyb21OdW1iZXIocG93X2RibChyYWRpeCwgOCkpO1xyXG5cclxuICAgIHZhciByZXN1bHQgPSBaRVJPO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpICs9IDgpIHtcclxuICAgICAgICB2YXIgc2l6ZSA9IE1hdGgubWluKDgsIHN0ci5sZW5ndGggLSBpKSxcclxuICAgICAgICAgICAgdmFsdWUgPSBwYXJzZUludChzdHIuc3Vic3RyaW5nKGksIGkgKyBzaXplKSwgcmFkaXgpO1xyXG4gICAgICAgIGlmIChzaXplIDwgOCkge1xyXG4gICAgICAgICAgICB2YXIgcG93ZXIgPSBmcm9tTnVtYmVyKHBvd19kYmwocmFkaXgsIHNpemUpKTtcclxuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0Lm11bChwb3dlcikuYWRkKGZyb21OdW1iZXIodmFsdWUpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQubXVsKHJhZGl4VG9Qb3dlcik7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5hZGQoZnJvbU51bWJlcih2YWx1ZSkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJlc3VsdC51bnNpZ25lZCA9IHVuc2lnbmVkO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSBMb25nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBzdHJpbmcsIHdyaXR0ZW4gdXNpbmcgdGhlIHNwZWNpZmllZCByYWRpeC5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgVGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIExvbmdcclxuICogQHBhcmFtIHsoYm9vbGVhbnxudW1iZXIpPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxyXG4gKiBAcGFyYW0ge251bWJlcj19IHJhZGl4IFRoZSByYWRpeCBpbiB3aGljaCB0aGUgdGV4dCBpcyB3cml0dGVuICgyLTM2KSwgZGVmYXVsdHMgdG8gMTBcclxuICogQHJldHVybnMgeyFMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXHJcbiAqL1xyXG5Mb25nLmZyb21TdHJpbmcgPSBmcm9tU3RyaW5nO1xyXG5cclxuLyoqXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd8IXtsb3c6IG51bWJlciwgaGlnaDogbnVtYmVyLCB1bnNpZ25lZDogYm9vbGVhbn19IHZhbFxyXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZFxyXG4gKiBAcmV0dXJucyB7IUxvbmd9XHJcbiAqIEBpbm5lclxyXG4gKi9cclxuZnVuY3Rpb24gZnJvbVZhbHVlKHZhbCwgdW5zaWduZWQpIHtcclxuICAgIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJylcclxuICAgICAgICByZXR1cm4gZnJvbU51bWJlcih2YWwsIHVuc2lnbmVkKTtcclxuICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJylcclxuICAgICAgICByZXR1cm4gZnJvbVN0cmluZyh2YWwsIHVuc2lnbmVkKTtcclxuICAgIC8vIFRocm93cyBmb3Igbm9uLW9iamVjdHMsIGNvbnZlcnRzIG5vbi1pbnN0YW5jZW9mIExvbmc6XHJcbiAgICByZXR1cm4gZnJvbUJpdHModmFsLmxvdywgdmFsLmhpZ2gsIHR5cGVvZiB1bnNpZ25lZCA9PT0gJ2Jvb2xlYW4nID8gdW5zaWduZWQgOiB2YWwudW5zaWduZWQpO1xyXG59XHJcblxyXG4vKipcclxuICogQ29udmVydHMgdGhlIHNwZWNpZmllZCB2YWx1ZSB0byBhIExvbmcgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIGZyb20qIGZ1bmN0aW9uIGZvciBpdHMgdHlwZS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ3whe2xvdzogbnVtYmVyLCBoaWdoOiBudW1iZXIsIHVuc2lnbmVkOiBib29sZWFufX0gdmFsIFZhbHVlXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcclxuICogQHJldHVybnMgeyFMb25nfVxyXG4gKi9cclxuTG9uZy5mcm9tVmFsdWUgPSBmcm9tVmFsdWU7XHJcblxyXG4vLyBOT1RFOiB0aGUgY29tcGlsZXIgc2hvdWxkIGlubGluZSB0aGVzZSBjb25zdGFudCB2YWx1ZXMgYmVsb3cgYW5kIHRoZW4gcmVtb3ZlIHRoZXNlIHZhcmlhYmxlcywgc28gdGhlcmUgc2hvdWxkIGJlXHJcbi8vIG5vIHJ1bnRpbWUgcGVuYWx0eSBmb3IgdGhlc2UuXHJcblxyXG4vKipcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0XHJcbiAqIEBpbm5lclxyXG4gKi9cclxudmFyIFRXT19QV1JfMTZfREJMID0gMSA8PCAxNjtcclxuXHJcbi8qKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RcclxuICogQGlubmVyXHJcbiAqL1xyXG52YXIgVFdPX1BXUl8yNF9EQkwgPSAxIDw8IDI0O1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdFxyXG4gKiBAaW5uZXJcclxuICovXHJcbnZhciBUV09fUFdSXzMyX0RCTCA9IFRXT19QV1JfMTZfREJMICogVFdPX1BXUl8xNl9EQkw7XHJcblxyXG4vKipcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0XHJcbiAqIEBpbm5lclxyXG4gKi9cclxudmFyIFRXT19QV1JfNjRfREJMID0gVFdPX1BXUl8zMl9EQkwgKiBUV09fUFdSXzMyX0RCTDtcclxuXHJcbi8qKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RcclxuICogQGlubmVyXHJcbiAqL1xyXG52YXIgVFdPX1BXUl82M19EQkwgPSBUV09fUFdSXzY0X0RCTCAvIDI7XHJcblxyXG4vKipcclxuICogQHR5cGUgeyFMb25nfVxyXG4gKiBAY29uc3RcclxuICogQGlubmVyXHJcbiAqL1xyXG52YXIgVFdPX1BXUl8yNCA9IGZyb21JbnQoVFdPX1BXUl8yNF9EQkwpO1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlIHshTG9uZ31cclxuICogQGlubmVyXHJcbiAqL1xyXG52YXIgWkVSTyA9IGZyb21JbnQoMCk7XHJcblxyXG4vKipcclxuICogU2lnbmVkIHplcm8uXHJcbiAqIEB0eXBlIHshTG9uZ31cclxuICovXHJcbkxvbmcuWkVSTyA9IFpFUk87XHJcblxyXG4vKipcclxuICogQHR5cGUgeyFMb25nfVxyXG4gKiBAaW5uZXJcclxuICovXHJcbnZhciBVWkVSTyA9IGZyb21JbnQoMCwgdHJ1ZSk7XHJcblxyXG4vKipcclxuICogVW5zaWduZWQgemVyby5cclxuICogQHR5cGUgeyFMb25nfVxyXG4gKi9cclxuTG9uZy5VWkVSTyA9IFVaRVJPO1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlIHshTG9uZ31cclxuICogQGlubmVyXHJcbiAqL1xyXG52YXIgT05FID0gZnJvbUludCgxKTtcclxuXHJcbi8qKlxyXG4gKiBTaWduZWQgb25lLlxyXG4gKiBAdHlwZSB7IUxvbmd9XHJcbiAqL1xyXG5Mb25nLk9ORSA9IE9ORTtcclxuXHJcbi8qKlxyXG4gKiBAdHlwZSB7IUxvbmd9XHJcbiAqIEBpbm5lclxyXG4gKi9cclxudmFyIFVPTkUgPSBmcm9tSW50KDEsIHRydWUpO1xyXG5cclxuLyoqXHJcbiAqIFVuc2lnbmVkIG9uZS5cclxuICogQHR5cGUgeyFMb25nfVxyXG4gKi9cclxuTG9uZy5VT05FID0gVU9ORTtcclxuXHJcbi8qKlxyXG4gKiBAdHlwZSB7IUxvbmd9XHJcbiAqIEBpbm5lclxyXG4gKi9cclxudmFyIE5FR19PTkUgPSBmcm9tSW50KC0xKTtcclxuXHJcbi8qKlxyXG4gKiBTaWduZWQgbmVnYXRpdmUgb25lLlxyXG4gKiBAdHlwZSB7IUxvbmd9XHJcbiAqL1xyXG5Mb25nLk5FR19PTkUgPSBORUdfT05FO1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlIHshTG9uZ31cclxuICogQGlubmVyXHJcbiAqL1xyXG52YXIgTUFYX1ZBTFVFID0gZnJvbUJpdHMoMHhGRkZGRkZGRnwwLCAweDdGRkZGRkZGfDAsIGZhbHNlKTtcclxuXHJcbi8qKlxyXG4gKiBNYXhpbXVtIHNpZ25lZCB2YWx1ZS5cclxuICogQHR5cGUgeyFMb25nfVxyXG4gKi9cclxuTG9uZy5NQVhfVkFMVUUgPSBNQVhfVkFMVUU7XHJcblxyXG4vKipcclxuICogQHR5cGUgeyFMb25nfVxyXG4gKiBAaW5uZXJcclxuICovXHJcbnZhciBNQVhfVU5TSUdORURfVkFMVUUgPSBmcm9tQml0cygweEZGRkZGRkZGfDAsIDB4RkZGRkZGRkZ8MCwgdHJ1ZSk7XHJcblxyXG4vKipcclxuICogTWF4aW11bSB1bnNpZ25lZCB2YWx1ZS5cclxuICogQHR5cGUgeyFMb25nfVxyXG4gKi9cclxuTG9uZy5NQVhfVU5TSUdORURfVkFMVUUgPSBNQVhfVU5TSUdORURfVkFMVUU7XHJcblxyXG4vKipcclxuICogQHR5cGUgeyFMb25nfVxyXG4gKiBAaW5uZXJcclxuICovXHJcbnZhciBNSU5fVkFMVUUgPSBmcm9tQml0cygwLCAweDgwMDAwMDAwfDAsIGZhbHNlKTtcclxuXHJcbi8qKlxyXG4gKiBNaW5pbXVtIHNpZ25lZCB2YWx1ZS5cclxuICogQHR5cGUgeyFMb25nfVxyXG4gKi9cclxuTG9uZy5NSU5fVkFMVUUgPSBNSU5fVkFMVUU7XHJcblxyXG4vKipcclxuICogQGFsaWFzIExvbmcucHJvdG90eXBlXHJcbiAqIEBpbm5lclxyXG4gKi9cclxudmFyIExvbmdQcm90b3R5cGUgPSBMb25nLnByb3RvdHlwZTtcclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyB0aGUgTG9uZyB0byBhIDMyIGJpdCBpbnRlZ2VyLCBhc3N1bWluZyBpdCBpcyBhIDMyIGJpdCBpbnRlZ2VyLlxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS50b0ludCA9IGZ1bmN0aW9uIHRvSW50KCkge1xyXG4gICAgcmV0dXJuIHRoaXMudW5zaWduZWQgPyB0aGlzLmxvdyA+Pj4gMCA6IHRoaXMubG93O1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIHRoZSBMb25nIHRvIGEgdGhlIG5lYXJlc3QgZmxvYXRpbmctcG9pbnQgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB2YWx1ZSAoZG91YmxlLCA1MyBiaXQgbWFudGlzc2EpLlxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS50b051bWJlciA9IGZ1bmN0aW9uIHRvTnVtYmVyKCkge1xyXG4gICAgaWYgKHRoaXMudW5zaWduZWQpXHJcbiAgICAgICAgcmV0dXJuICgodGhpcy5oaWdoID4+PiAwKSAqIFRXT19QV1JfMzJfREJMKSArICh0aGlzLmxvdyA+Pj4gMCk7XHJcbiAgICByZXR1cm4gdGhpcy5oaWdoICogVFdPX1BXUl8zMl9EQkwgKyAodGhpcy5sb3cgPj4+IDApO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIHRoZSBMb25nIHRvIGEgc3RyaW5nIHdyaXR0ZW4gaW4gdGhlIHNwZWNpZmllZCByYWRpeC5cclxuICogQHBhcmFtIHtudW1iZXI9fSByYWRpeCBSYWRpeCAoMi0zNiksIGRlZmF1bHRzIHRvIDEwXHJcbiAqIEByZXR1cm5zIHtzdHJpbmd9XHJcbiAqIEBvdmVycmlkZVxyXG4gKiBAdGhyb3dzIHtSYW5nZUVycm9yfSBJZiBgcmFkaXhgIGlzIG91dCBvZiByYW5nZVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKHJhZGl4KSB7XHJcbiAgICByYWRpeCA9IHJhZGl4IHx8IDEwO1xyXG4gICAgaWYgKHJhZGl4IDwgMiB8fCAzNiA8IHJhZGl4KVxyXG4gICAgICAgIHRocm93IFJhbmdlRXJyb3IoJ3JhZGl4Jyk7XHJcbiAgICBpZiAodGhpcy5pc1plcm8oKSlcclxuICAgICAgICByZXR1cm4gJzAnO1xyXG4gICAgaWYgKHRoaXMuaXNOZWdhdGl2ZSgpKSB7IC8vIFVuc2lnbmVkIExvbmdzIGFyZSBuZXZlciBuZWdhdGl2ZVxyXG4gICAgICAgIGlmICh0aGlzLmVxKE1JTl9WQUxVRSkpIHtcclxuICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBjaGFuZ2UgdGhlIExvbmcgdmFsdWUgYmVmb3JlIGl0IGNhbiBiZSBuZWdhdGVkLCBzbyB3ZSByZW1vdmVcclxuICAgICAgICAgICAgLy8gdGhlIGJvdHRvbS1tb3N0IGRpZ2l0IGluIHRoaXMgYmFzZSBhbmQgdGhlbiByZWN1cnNlIHRvIGRvIHRoZSByZXN0LlxyXG4gICAgICAgICAgICB2YXIgcmFkaXhMb25nID0gZnJvbU51bWJlcihyYWRpeCksXHJcbiAgICAgICAgICAgICAgICBkaXYgPSB0aGlzLmRpdihyYWRpeExvbmcpLFxyXG4gICAgICAgICAgICAgICAgcmVtMSA9IGRpdi5tdWwocmFkaXhMb25nKS5zdWIodGhpcyk7XHJcbiAgICAgICAgICAgIHJldHVybiBkaXYudG9TdHJpbmcocmFkaXgpICsgcmVtMS50b0ludCgpLnRvU3RyaW5nKHJhZGl4KTtcclxuICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgcmV0dXJuICctJyArIHRoaXMubmVnKCkudG9TdHJpbmcocmFkaXgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIERvIHNldmVyYWwgKDYpIGRpZ2l0cyBlYWNoIHRpbWUgdGhyb3VnaCB0aGUgbG9vcCwgc28gYXMgdG9cclxuICAgIC8vIG1pbmltaXplIHRoZSBjYWxscyB0byB0aGUgdmVyeSBleHBlbnNpdmUgZW11bGF0ZWQgZGl2LlxyXG4gICAgdmFyIHJhZGl4VG9Qb3dlciA9IGZyb21OdW1iZXIocG93X2RibChyYWRpeCwgNiksIHRoaXMudW5zaWduZWQpLFxyXG4gICAgICAgIHJlbSA9IHRoaXM7XHJcbiAgICB2YXIgcmVzdWx0ID0gJyc7XHJcbiAgICB3aGlsZSAodHJ1ZSkge1xyXG4gICAgICAgIHZhciByZW1EaXYgPSByZW0uZGl2KHJhZGl4VG9Qb3dlciksXHJcbiAgICAgICAgICAgIGludHZhbCA9IHJlbS5zdWIocmVtRGl2Lm11bChyYWRpeFRvUG93ZXIpKS50b0ludCgpID4+PiAwLFxyXG4gICAgICAgICAgICBkaWdpdHMgPSBpbnR2YWwudG9TdHJpbmcocmFkaXgpO1xyXG4gICAgICAgIHJlbSA9IHJlbURpdjtcclxuICAgICAgICBpZiAocmVtLmlzWmVybygpKVxyXG4gICAgICAgICAgICByZXR1cm4gZGlnaXRzICsgcmVzdWx0O1xyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB3aGlsZSAoZGlnaXRzLmxlbmd0aCA8IDYpXHJcbiAgICAgICAgICAgICAgICBkaWdpdHMgPSAnMCcgKyBkaWdpdHM7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9ICcnICsgZGlnaXRzICsgcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufTtcclxuXHJcbi8qKlxyXG4gKiBHZXRzIHRoZSBoaWdoIDMyIGJpdHMgYXMgYSBzaWduZWQgaW50ZWdlci5cclxuICogQHJldHVybnMge251bWJlcn0gU2lnbmVkIGhpZ2ggYml0c1xyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5nZXRIaWdoQml0cyA9IGZ1bmN0aW9uIGdldEhpZ2hCaXRzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaGlnaDtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBHZXRzIHRoZSBoaWdoIDMyIGJpdHMgYXMgYW4gdW5zaWduZWQgaW50ZWdlci5cclxuICogQHJldHVybnMge251bWJlcn0gVW5zaWduZWQgaGlnaCBiaXRzXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmdldEhpZ2hCaXRzVW5zaWduZWQgPSBmdW5jdGlvbiBnZXRIaWdoQml0c1Vuc2lnbmVkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaGlnaCA+Pj4gMDtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBHZXRzIHRoZSBsb3cgMzIgYml0cyBhcyBhIHNpZ25lZCBpbnRlZ2VyLlxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBTaWduZWQgbG93IGJpdHNcclxuICovXHJcbkxvbmdQcm90b3R5cGUuZ2V0TG93Qml0cyA9IGZ1bmN0aW9uIGdldExvd0JpdHMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5sb3c7XHJcbn07XHJcblxyXG4vKipcclxuICogR2V0cyB0aGUgbG93IDMyIGJpdHMgYXMgYW4gdW5zaWduZWQgaW50ZWdlci5cclxuICogQHJldHVybnMge251bWJlcn0gVW5zaWduZWQgbG93IGJpdHNcclxuICovXHJcbkxvbmdQcm90b3R5cGUuZ2V0TG93Qml0c1Vuc2lnbmVkID0gZnVuY3Rpb24gZ2V0TG93Qml0c1Vuc2lnbmVkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubG93ID4+PiAwO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEdldHMgdGhlIG51bWJlciBvZiBiaXRzIG5lZWRlZCB0byByZXByZXNlbnQgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoaXMgTG9uZy5cclxuICogQHJldHVybnMge251bWJlcn1cclxuICovXHJcbkxvbmdQcm90b3R5cGUuZ2V0TnVtQml0c0FicyA9IGZ1bmN0aW9uIGdldE51bUJpdHNBYnMoKSB7XHJcbiAgICBpZiAodGhpcy5pc05lZ2F0aXZlKCkpIC8vIFVuc2lnbmVkIExvbmdzIGFyZSBuZXZlciBuZWdhdGl2ZVxyXG4gICAgICAgIHJldHVybiB0aGlzLmVxKE1JTl9WQUxVRSkgPyA2NCA6IHRoaXMubmVnKCkuZ2V0TnVtQml0c0FicygpO1xyXG4gICAgdmFyIHZhbCA9IHRoaXMuaGlnaCAhPSAwID8gdGhpcy5oaWdoIDogdGhpcy5sb3c7XHJcbiAgICBmb3IgKHZhciBiaXQgPSAzMTsgYml0ID4gMDsgYml0LS0pXHJcbiAgICAgICAgaWYgKCh2YWwgJiAoMSA8PCBiaXQpKSAhPSAwKVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgIHJldHVybiB0aGlzLmhpZ2ggIT0gMCA/IGJpdCArIDMzIDogYml0ICsgMTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBlcXVhbHMgemVyby5cclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmlzWmVybyA9IGZ1bmN0aW9uIGlzWmVybygpIHtcclxuICAgIHJldHVybiB0aGlzLmhpZ2ggPT09IDAgJiYgdGhpcy5sb3cgPT09IDA7XHJcbn07XHJcblxyXG4vKipcclxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgZXF1YWxzIHplcm8uIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjaXNaZXJvfS5cclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmVxeiA9IExvbmdQcm90b3R5cGUuaXNaZXJvO1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIG5lZ2F0aXZlLlxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbkxvbmdQcm90b3R5cGUuaXNOZWdhdGl2ZSA9IGZ1bmN0aW9uIGlzTmVnYXRpdmUoKSB7XHJcbiAgICByZXR1cm4gIXRoaXMudW5zaWduZWQgJiYgdGhpcy5oaWdoIDwgMDtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBwb3NpdGl2ZS5cclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmlzUG9zaXRpdmUgPSBmdW5jdGlvbiBpc1Bvc2l0aXZlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudW5zaWduZWQgfHwgdGhpcy5oaWdoID49IDA7XHJcbn07XHJcblxyXG4vKipcclxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgb2RkLlxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbkxvbmdQcm90b3R5cGUuaXNPZGQgPSBmdW5jdGlvbiBpc09kZCgpIHtcclxuICAgIHJldHVybiAodGhpcy5sb3cgJiAxKSA9PT0gMTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBldmVuLlxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbkxvbmdQcm90b3R5cGUuaXNFdmVuID0gZnVuY3Rpb24gaXNFdmVuKCkge1xyXG4gICAgcmV0dXJuICh0aGlzLmxvdyAmIDEpID09PSAwO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGVxdWFscyB0aGUgc3BlY2lmaWVkJ3MuXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyhvdGhlcikge1xyXG4gICAgaWYgKCFpc0xvbmcob3RoZXIpKVxyXG4gICAgICAgIG90aGVyID0gZnJvbVZhbHVlKG90aGVyKTtcclxuICAgIGlmICh0aGlzLnVuc2lnbmVkICE9PSBvdGhlci51bnNpZ25lZCAmJiAodGhpcy5oaWdoID4+PiAzMSkgPT09IDEgJiYgKG90aGVyLmhpZ2ggPj4+IDMxKSA9PT0gMSlcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICByZXR1cm4gdGhpcy5oaWdoID09PSBvdGhlci5oaWdoICYmIHRoaXMubG93ID09PSBvdGhlci5sb3c7XHJcbn07XHJcblxyXG4vKipcclxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgZXF1YWxzIHRoZSBzcGVjaWZpZWQncy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNlcXVhbHN9LlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbkxvbmdQcm90b3R5cGUuZXEgPSBMb25nUHJvdG90eXBlLmVxdWFscztcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIHNwZWNpZmllZCdzLlxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5ub3RFcXVhbHMgPSBmdW5jdGlvbiBub3RFcXVhbHMob3RoZXIpIHtcclxuICAgIHJldHVybiAhdGhpcy5lcSgvKiB2YWxpZGF0ZXMgKi8gb3RoZXIpO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbm90RXF1YWxzfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLm5lcSA9IExvbmdQcm90b3R5cGUubm90RXF1YWxzO1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbm90RXF1YWxzfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLm5lID0gTG9uZ1Byb3RvdHlwZS5ub3RFcXVhbHM7XHJcblxyXG4vKipcclxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQncy5cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbkxvbmdQcm90b3R5cGUubGVzc1RoYW4gPSBmdW5jdGlvbiBsZXNzVGhhbihvdGhlcikge1xyXG4gICAgcmV0dXJuIHRoaXMuY29tcCgvKiB2YWxpZGF0ZXMgKi8gb3RoZXIpIDwgMDtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2xlc3NUaGFufS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmx0ID0gTG9uZ1Byb3RvdHlwZS5sZXNzVGhhbjtcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdGhlIHNwZWNpZmllZCdzLlxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5sZXNzVGhhbk9yRXF1YWwgPSBmdW5jdGlvbiBsZXNzVGhhbk9yRXF1YWwob3RoZXIpIHtcclxuICAgIHJldHVybiB0aGlzLmNvbXAoLyogdmFsaWRhdGVzICovIG90aGVyKSA8PSAwO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbGVzc1RoYW5PckVxdWFsfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmx0ZSA9IExvbmdQcm90b3R5cGUubGVzc1RoYW5PckVxdWFsO1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbGVzc1RoYW5PckVxdWFsfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmxlID0gTG9uZ1Byb3RvdHlwZS5sZXNzVGhhbk9yRXF1YWw7XHJcblxyXG4vKipcclxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBzcGVjaWZpZWQncy5cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbkxvbmdQcm90b3R5cGUuZ3JlYXRlclRoYW4gPSBmdW5jdGlvbiBncmVhdGVyVGhhbihvdGhlcikge1xyXG4gICAgcmV0dXJuIHRoaXMuY29tcCgvKiB2YWxpZGF0ZXMgKi8gb3RoZXIpID4gMDtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2dyZWF0ZXJUaGFufS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmd0ID0gTG9uZ1Byb3RvdHlwZS5ncmVhdGVyVGhhbjtcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdGhlIHNwZWNpZmllZCdzLlxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5ncmVhdGVyVGhhbk9yRXF1YWwgPSBmdW5jdGlvbiBncmVhdGVyVGhhbk9yRXF1YWwob3RoZXIpIHtcclxuICAgIHJldHVybiB0aGlzLmNvbXAoLyogdmFsaWRhdGVzICovIG90aGVyKSA+PSAwO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjZ3JlYXRlclRoYW5PckVxdWFsfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmd0ZSA9IExvbmdQcm90b3R5cGUuZ3JlYXRlclRoYW5PckVxdWFsO1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjZ3JlYXRlclRoYW5PckVxdWFsfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmdlID0gTG9uZ1Byb3RvdHlwZS5ncmVhdGVyVGhhbk9yRXF1YWw7XHJcblxyXG4vKipcclxuICogQ29tcGFyZXMgdGhpcyBMb25nJ3MgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkJ3MuXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge251bWJlcn0gMCBpZiB0aGV5IGFyZSB0aGUgc2FtZSwgMSBpZiB0aGUgdGhpcyBpcyBncmVhdGVyIGFuZCAtMVxyXG4gKiAgaWYgdGhlIGdpdmVuIG9uZSBpcyBncmVhdGVyXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlKG90aGVyKSB7XHJcbiAgICBpZiAoIWlzTG9uZyhvdGhlcikpXHJcbiAgICAgICAgb3RoZXIgPSBmcm9tVmFsdWUob3RoZXIpO1xyXG4gICAgaWYgKHRoaXMuZXEob3RoZXIpKVxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgdmFyIHRoaXNOZWcgPSB0aGlzLmlzTmVnYXRpdmUoKSxcclxuICAgICAgICBvdGhlck5lZyA9IG90aGVyLmlzTmVnYXRpdmUoKTtcclxuICAgIGlmICh0aGlzTmVnICYmICFvdGhlck5lZylcclxuICAgICAgICByZXR1cm4gLTE7XHJcbiAgICBpZiAoIXRoaXNOZWcgJiYgb3RoZXJOZWcpXHJcbiAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAvLyBBdCB0aGlzIHBvaW50IHRoZSBzaWduIGJpdHMgYXJlIHRoZSBzYW1lXHJcbiAgICBpZiAoIXRoaXMudW5zaWduZWQpXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ViKG90aGVyKS5pc05lZ2F0aXZlKCkgPyAtMSA6IDE7XHJcbiAgICAvLyBCb3RoIGFyZSBwb3NpdGl2ZSBpZiBhdCBsZWFzdCBvbmUgaXMgdW5zaWduZWRcclxuICAgIHJldHVybiAob3RoZXIuaGlnaCA+Pj4gMCkgPiAodGhpcy5oaWdoID4+PiAwKSB8fCAob3RoZXIuaGlnaCA9PT0gdGhpcy5oaWdoICYmIChvdGhlci5sb3cgPj4+IDApID4gKHRoaXMubG93ID4+PiAwKSkgPyAtMSA6IDE7XHJcbn07XHJcblxyXG4vKipcclxuICogQ29tcGFyZXMgdGhpcyBMb25nJ3MgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjY29tcGFyZX0uXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXHJcbiAqIEByZXR1cm5zIHtudW1iZXJ9IDAgaWYgdGhleSBhcmUgdGhlIHNhbWUsIDEgaWYgdGhlIHRoaXMgaXMgZ3JlYXRlciBhbmQgLTFcclxuICogIGlmIHRoZSBnaXZlbiBvbmUgaXMgZ3JlYXRlclxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5jb21wID0gTG9uZ1Byb3RvdHlwZS5jb21wYXJlO1xyXG5cclxuLyoqXHJcbiAqIE5lZ2F0ZXMgdGhpcyBMb25nJ3MgdmFsdWUuXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gTmVnYXRlZCBMb25nXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLm5lZ2F0ZSA9IGZ1bmN0aW9uIG5lZ2F0ZSgpIHtcclxuICAgIGlmICghdGhpcy51bnNpZ25lZCAmJiB0aGlzLmVxKE1JTl9WQUxVRSkpXHJcbiAgICAgICAgcmV0dXJuIE1JTl9WQUxVRTtcclxuICAgIHJldHVybiB0aGlzLm5vdCgpLmFkZChPTkUpO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIE5lZ2F0ZXMgdGhpcyBMb25nJ3MgdmFsdWUuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbmVnYXRlfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gTmVnYXRlZCBMb25nXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLm5lZyA9IExvbmdQcm90b3R5cGUubmVnYXRlO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIHN1bSBvZiB0aGlzIGFuZCB0aGUgc3BlY2lmaWVkIExvbmcuXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gYWRkZW5kIEFkZGVuZFxyXG4gKiBAcmV0dXJucyB7IUxvbmd9IFN1bVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBhZGQoYWRkZW5kKSB7XHJcbiAgICBpZiAoIWlzTG9uZyhhZGRlbmQpKVxyXG4gICAgICAgIGFkZGVuZCA9IGZyb21WYWx1ZShhZGRlbmQpO1xyXG5cclxuICAgIC8vIERpdmlkZSBlYWNoIG51bWJlciBpbnRvIDQgY2h1bmtzIG9mIDE2IGJpdHMsIGFuZCB0aGVuIHN1bSB0aGUgY2h1bmtzLlxyXG5cclxuICAgIHZhciBhNDggPSB0aGlzLmhpZ2ggPj4+IDE2O1xyXG4gICAgdmFyIGEzMiA9IHRoaXMuaGlnaCAmIDB4RkZGRjtcclxuICAgIHZhciBhMTYgPSB0aGlzLmxvdyA+Pj4gMTY7XHJcbiAgICB2YXIgYTAwID0gdGhpcy5sb3cgJiAweEZGRkY7XHJcblxyXG4gICAgdmFyIGI0OCA9IGFkZGVuZC5oaWdoID4+PiAxNjtcclxuICAgIHZhciBiMzIgPSBhZGRlbmQuaGlnaCAmIDB4RkZGRjtcclxuICAgIHZhciBiMTYgPSBhZGRlbmQubG93ID4+PiAxNjtcclxuICAgIHZhciBiMDAgPSBhZGRlbmQubG93ICYgMHhGRkZGO1xyXG5cclxuICAgIHZhciBjNDggPSAwLCBjMzIgPSAwLCBjMTYgPSAwLCBjMDAgPSAwO1xyXG4gICAgYzAwICs9IGEwMCArIGIwMDtcclxuICAgIGMxNiArPSBjMDAgPj4+IDE2O1xyXG4gICAgYzAwICY9IDB4RkZGRjtcclxuICAgIGMxNiArPSBhMTYgKyBiMTY7XHJcbiAgICBjMzIgKz0gYzE2ID4+PiAxNjtcclxuICAgIGMxNiAmPSAweEZGRkY7XHJcbiAgICBjMzIgKz0gYTMyICsgYjMyO1xyXG4gICAgYzQ4ICs9IGMzMiA+Pj4gMTY7XHJcbiAgICBjMzIgJj0gMHhGRkZGO1xyXG4gICAgYzQ4ICs9IGE0OCArIGI0ODtcclxuICAgIGM0OCAmPSAweEZGRkY7XHJcbiAgICByZXR1cm4gZnJvbUJpdHMoKGMxNiA8PCAxNikgfCBjMDAsIChjNDggPDwgMTYpIHwgYzMyLCB0aGlzLnVuc2lnbmVkKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBkaWZmZXJlbmNlIG9mIHRoaXMgYW5kIHRoZSBzcGVjaWZpZWQgTG9uZy5cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBzdWJ0cmFoZW5kIFN1YnRyYWhlbmRcclxuICogQHJldHVybnMgeyFMb25nfSBEaWZmZXJlbmNlXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLnN1YnRyYWN0ID0gZnVuY3Rpb24gc3VidHJhY3Qoc3VidHJhaGVuZCkge1xyXG4gICAgaWYgKCFpc0xvbmcoc3VidHJhaGVuZCkpXHJcbiAgICAgICAgc3VidHJhaGVuZCA9IGZyb21WYWx1ZShzdWJ0cmFoZW5kKTtcclxuICAgIHJldHVybiB0aGlzLmFkZChzdWJ0cmFoZW5kLm5lZygpKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBkaWZmZXJlbmNlIG9mIHRoaXMgYW5kIHRoZSBzcGVjaWZpZWQgTG9uZy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNzdWJ0cmFjdH0uXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IHN1YnRyYWhlbmQgU3VidHJhaGVuZFxyXG4gKiBAcmV0dXJucyB7IUxvbmd9IERpZmZlcmVuY2VcclxuICovXHJcbkxvbmdQcm90b3R5cGUuc3ViID0gTG9uZ1Byb3RvdHlwZS5zdWJ0cmFjdDtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBwcm9kdWN0IG9mIHRoaXMgYW5kIHRoZSBzcGVjaWZpZWQgTG9uZy5cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBtdWx0aXBsaWVyIE11bHRpcGxpZXJcclxuICogQHJldHVybnMgeyFMb25nfSBQcm9kdWN0XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLm11bHRpcGx5ID0gZnVuY3Rpb24gbXVsdGlwbHkobXVsdGlwbGllcikge1xyXG4gICAgaWYgKHRoaXMuaXNaZXJvKCkpXHJcbiAgICAgICAgcmV0dXJuIFpFUk87XHJcbiAgICBpZiAoIWlzTG9uZyhtdWx0aXBsaWVyKSlcclxuICAgICAgICBtdWx0aXBsaWVyID0gZnJvbVZhbHVlKG11bHRpcGxpZXIpO1xyXG5cclxuICAgIC8vIHVzZSB3YXNtIHN1cHBvcnQgaWYgcHJlc2VudFxyXG4gICAgaWYgKHdhc20pIHtcclxuICAgICAgICB2YXIgbG93ID0gd2FzbS5tdWwodGhpcy5sb3csXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGlnaCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGllci5sb3csXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxpZXIuaGlnaCk7XHJcbiAgICAgICAgcmV0dXJuIGZyb21CaXRzKGxvdywgd2FzbS5nZXRfaGlnaCgpLCB0aGlzLnVuc2lnbmVkKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobXVsdGlwbGllci5pc1plcm8oKSlcclxuICAgICAgICByZXR1cm4gWkVSTztcclxuICAgIGlmICh0aGlzLmVxKE1JTl9WQUxVRSkpXHJcbiAgICAgICAgcmV0dXJuIG11bHRpcGxpZXIuaXNPZGQoKSA/IE1JTl9WQUxVRSA6IFpFUk87XHJcbiAgICBpZiAobXVsdGlwbGllci5lcShNSU5fVkFMVUUpKVxyXG4gICAgICAgIHJldHVybiB0aGlzLmlzT2RkKCkgPyBNSU5fVkFMVUUgOiBaRVJPO1xyXG5cclxuICAgIGlmICh0aGlzLmlzTmVnYXRpdmUoKSkge1xyXG4gICAgICAgIGlmIChtdWx0aXBsaWVyLmlzTmVnYXRpdmUoKSlcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubmVnKCkubXVsKG11bHRpcGxpZXIubmVnKCkpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubmVnKCkubXVsKG11bHRpcGxpZXIpLm5lZygpO1xyXG4gICAgfSBlbHNlIGlmIChtdWx0aXBsaWVyLmlzTmVnYXRpdmUoKSlcclxuICAgICAgICByZXR1cm4gdGhpcy5tdWwobXVsdGlwbGllci5uZWcoKSkubmVnKCk7XHJcblxyXG4gICAgLy8gSWYgYm90aCBsb25ncyBhcmUgc21hbGwsIHVzZSBmbG9hdCBtdWx0aXBsaWNhdGlvblxyXG4gICAgaWYgKHRoaXMubHQoVFdPX1BXUl8yNCkgJiYgbXVsdGlwbGllci5sdChUV09fUFdSXzI0KSlcclxuICAgICAgICByZXR1cm4gZnJvbU51bWJlcih0aGlzLnRvTnVtYmVyKCkgKiBtdWx0aXBsaWVyLnRvTnVtYmVyKCksIHRoaXMudW5zaWduZWQpO1xyXG5cclxuICAgIC8vIERpdmlkZSBlYWNoIGxvbmcgaW50byA0IGNodW5rcyBvZiAxNiBiaXRzLCBhbmQgdGhlbiBhZGQgdXAgNHg0IHByb2R1Y3RzLlxyXG4gICAgLy8gV2UgY2FuIHNraXAgcHJvZHVjdHMgdGhhdCB3b3VsZCBvdmVyZmxvdy5cclxuXHJcbiAgICB2YXIgYTQ4ID0gdGhpcy5oaWdoID4+PiAxNjtcclxuICAgIHZhciBhMzIgPSB0aGlzLmhpZ2ggJiAweEZGRkY7XHJcbiAgICB2YXIgYTE2ID0gdGhpcy5sb3cgPj4+IDE2O1xyXG4gICAgdmFyIGEwMCA9IHRoaXMubG93ICYgMHhGRkZGO1xyXG5cclxuICAgIHZhciBiNDggPSBtdWx0aXBsaWVyLmhpZ2ggPj4+IDE2O1xyXG4gICAgdmFyIGIzMiA9IG11bHRpcGxpZXIuaGlnaCAmIDB4RkZGRjtcclxuICAgIHZhciBiMTYgPSBtdWx0aXBsaWVyLmxvdyA+Pj4gMTY7XHJcbiAgICB2YXIgYjAwID0gbXVsdGlwbGllci5sb3cgJiAweEZGRkY7XHJcblxyXG4gICAgdmFyIGM0OCA9IDAsIGMzMiA9IDAsIGMxNiA9IDAsIGMwMCA9IDA7XHJcbiAgICBjMDAgKz0gYTAwICogYjAwO1xyXG4gICAgYzE2ICs9IGMwMCA+Pj4gMTY7XHJcbiAgICBjMDAgJj0gMHhGRkZGO1xyXG4gICAgYzE2ICs9IGExNiAqIGIwMDtcclxuICAgIGMzMiArPSBjMTYgPj4+IDE2O1xyXG4gICAgYzE2ICY9IDB4RkZGRjtcclxuICAgIGMxNiArPSBhMDAgKiBiMTY7XHJcbiAgICBjMzIgKz0gYzE2ID4+PiAxNjtcclxuICAgIGMxNiAmPSAweEZGRkY7XHJcbiAgICBjMzIgKz0gYTMyICogYjAwO1xyXG4gICAgYzQ4ICs9IGMzMiA+Pj4gMTY7XHJcbiAgICBjMzIgJj0gMHhGRkZGO1xyXG4gICAgYzMyICs9IGExNiAqIGIxNjtcclxuICAgIGM0OCArPSBjMzIgPj4+IDE2O1xyXG4gICAgYzMyICY9IDB4RkZGRjtcclxuICAgIGMzMiArPSBhMDAgKiBiMzI7XHJcbiAgICBjNDggKz0gYzMyID4+PiAxNjtcclxuICAgIGMzMiAmPSAweEZGRkY7XHJcbiAgICBjNDggKz0gYTQ4ICogYjAwICsgYTMyICogYjE2ICsgYTE2ICogYjMyICsgYTAwICogYjQ4O1xyXG4gICAgYzQ4ICY9IDB4RkZGRjtcclxuICAgIHJldHVybiBmcm9tQml0cygoYzE2IDw8IDE2KSB8IGMwMCwgKGM0OCA8PCAxNikgfCBjMzIsIHRoaXMudW5zaWduZWQpO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIHByb2R1Y3Qgb2YgdGhpcyBhbmQgdGhlIHNwZWNpZmllZCBMb25nLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI211bHRpcGx5fS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gbXVsdGlwbGllciBNdWx0aXBsaWVyXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gUHJvZHVjdFxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5tdWwgPSBMb25nUHJvdG90eXBlLm11bHRpcGx5O1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhpcyBMb25nIGRpdmlkZWQgYnkgdGhlIHNwZWNpZmllZC4gVGhlIHJlc3VsdCBpcyBzaWduZWQgaWYgdGhpcyBMb25nIGlzIHNpZ25lZCBvclxyXG4gKiAgdW5zaWduZWQgaWYgdGhpcyBMb25nIGlzIHVuc2lnbmVkLlxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IGRpdmlzb3IgRGl2aXNvclxyXG4gKiBAcmV0dXJucyB7IUxvbmd9IFF1b3RpZW50XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmRpdmlkZSA9IGZ1bmN0aW9uIGRpdmlkZShkaXZpc29yKSB7XHJcbiAgICBpZiAoIWlzTG9uZyhkaXZpc29yKSlcclxuICAgICAgICBkaXZpc29yID0gZnJvbVZhbHVlKGRpdmlzb3IpO1xyXG4gICAgaWYgKGRpdmlzb3IuaXNaZXJvKCkpXHJcbiAgICAgICAgdGhyb3cgRXJyb3IoJ2RpdmlzaW9uIGJ5IHplcm8nKTtcclxuXHJcbiAgICAvLyB1c2Ugd2FzbSBzdXBwb3J0IGlmIHByZXNlbnRcclxuICAgIGlmICh3YXNtKSB7XHJcbiAgICAgICAgLy8gZ3VhcmQgYWdhaW5zdCBzaWduZWQgZGl2aXNpb24gb3ZlcmZsb3c6IHRoZSBsYXJnZXN0XHJcbiAgICAgICAgLy8gbmVnYXRpdmUgbnVtYmVyIC8gLTEgd291bGQgYmUgMSBsYXJnZXIgdGhhbiB0aGUgbGFyZ2VzdFxyXG4gICAgICAgIC8vIHBvc2l0aXZlIG51bWJlciwgZHVlIHRvIHR3bydzIGNvbXBsZW1lbnQuXHJcbiAgICAgICAgaWYgKCF0aGlzLnVuc2lnbmVkICYmXHJcbiAgICAgICAgICAgIHRoaXMuaGlnaCA9PT0gLTB4ODAwMDAwMDAgJiZcclxuICAgICAgICAgICAgZGl2aXNvci5sb3cgPT09IC0xICYmIGRpdmlzb3IuaGlnaCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgLy8gYmUgY29uc2lzdGVudCB3aXRoIG5vbi13YXNtIGNvZGUgcGF0aFxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGxvdyA9ICh0aGlzLnVuc2lnbmVkID8gd2FzbS5kaXZfdSA6IHdhc20uZGl2X3MpKFxyXG4gICAgICAgICAgICB0aGlzLmxvdyxcclxuICAgICAgICAgICAgdGhpcy5oaWdoLFxyXG4gICAgICAgICAgICBkaXZpc29yLmxvdyxcclxuICAgICAgICAgICAgZGl2aXNvci5oaWdoXHJcbiAgICAgICAgKTtcclxuICAgICAgICByZXR1cm4gZnJvbUJpdHMobG93LCB3YXNtLmdldF9oaWdoKCksIHRoaXMudW5zaWduZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmlzWmVybygpKVxyXG4gICAgICAgIHJldHVybiB0aGlzLnVuc2lnbmVkID8gVVpFUk8gOiBaRVJPO1xyXG4gICAgdmFyIGFwcHJveCwgcmVtLCByZXM7XHJcbiAgICBpZiAoIXRoaXMudW5zaWduZWQpIHtcclxuICAgICAgICAvLyBUaGlzIHNlY3Rpb24gaXMgb25seSByZWxldmFudCBmb3Igc2lnbmVkIGxvbmdzIGFuZCBpcyBkZXJpdmVkIGZyb20gdGhlXHJcbiAgICAgICAgLy8gY2xvc3VyZSBsaWJyYXJ5IGFzIGEgd2hvbGUuXHJcbiAgICAgICAgaWYgKHRoaXMuZXEoTUlOX1ZBTFVFKSkge1xyXG4gICAgICAgICAgICBpZiAoZGl2aXNvci5lcShPTkUpIHx8IGRpdmlzb3IuZXEoTkVHX09ORSkpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gTUlOX1ZBTFVFOyAgLy8gcmVjYWxsIHRoYXQgLU1JTl9WQUxVRSA9PSBNSU5fVkFMVUVcclxuICAgICAgICAgICAgZWxzZSBpZiAoZGl2aXNvci5lcShNSU5fVkFMVUUpKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIE9ORTtcclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlIHxvdGhlcnwgPj0gMiwgc28gfHRoaXMvb3RoZXJ8IDwgfE1JTl9WQUxVRXwuXHJcbiAgICAgICAgICAgICAgICB2YXIgaGFsZlRoaXMgPSB0aGlzLnNocigxKTtcclxuICAgICAgICAgICAgICAgIGFwcHJveCA9IGhhbGZUaGlzLmRpdihkaXZpc29yKS5zaGwoMSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYXBwcm94LmVxKFpFUk8pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRpdmlzb3IuaXNOZWdhdGl2ZSgpID8gT05FIDogTkVHX09ORTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVtID0gdGhpcy5zdWIoZGl2aXNvci5tdWwoYXBwcm94KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzID0gYXBwcm94LmFkZChyZW0uZGl2KGRpdmlzb3IpKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChkaXZpc29yLmVxKE1JTl9WQUxVRSkpXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnVuc2lnbmVkID8gVVpFUk8gOiBaRVJPO1xyXG4gICAgICAgIGlmICh0aGlzLmlzTmVnYXRpdmUoKSkge1xyXG4gICAgICAgICAgICBpZiAoZGl2aXNvci5pc05lZ2F0aXZlKCkpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5uZWcoKS5kaXYoZGl2aXNvci5uZWcoKSk7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm5lZygpLmRpdihkaXZpc29yKS5uZWcoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGRpdmlzb3IuaXNOZWdhdGl2ZSgpKVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kaXYoZGl2aXNvci5uZWcoKSkubmVnKCk7XHJcbiAgICAgICAgcmVzID0gWkVSTztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gVGhlIGFsZ29yaXRobSBiZWxvdyBoYXMgbm90IGJlZW4gbWFkZSBmb3IgdW5zaWduZWQgbG9uZ3MuIEl0J3MgdGhlcmVmb3JlXHJcbiAgICAgICAgLy8gcmVxdWlyZWQgdG8gdGFrZSBzcGVjaWFsIGNhcmUgb2YgdGhlIE1TQiBwcmlvciB0byBydW5uaW5nIGl0LlxyXG4gICAgICAgIGlmICghZGl2aXNvci51bnNpZ25lZClcclxuICAgICAgICAgICAgZGl2aXNvciA9IGRpdmlzb3IudG9VbnNpZ25lZCgpO1xyXG4gICAgICAgIGlmIChkaXZpc29yLmd0KHRoaXMpKVxyXG4gICAgICAgICAgICByZXR1cm4gVVpFUk87XHJcbiAgICAgICAgaWYgKGRpdmlzb3IuZ3QodGhpcy5zaHJ1KDEpKSkgLy8gMTUgPj4+IDEgPSA3IDsgd2l0aCBkaXZpc29yID0gOCA7IHRydWVcclxuICAgICAgICAgICAgcmV0dXJuIFVPTkU7XHJcbiAgICAgICAgcmVzID0gVVpFUk87XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVwZWF0IHRoZSBmb2xsb3dpbmcgdW50aWwgdGhlIHJlbWFpbmRlciBpcyBsZXNzIHRoYW4gb3RoZXI6ICBmaW5kIGFcclxuICAgIC8vIGZsb2F0aW5nLXBvaW50IHRoYXQgYXBwcm94aW1hdGVzIHJlbWFpbmRlciAvIG90aGVyICpmcm9tIGJlbG93KiwgYWRkIHRoaXNcclxuICAgIC8vIGludG8gdGhlIHJlc3VsdCwgYW5kIHN1YnRyYWN0IGl0IGZyb20gdGhlIHJlbWFpbmRlci4gIEl0IGlzIGNyaXRpY2FsIHRoYXRcclxuICAgIC8vIHRoZSBhcHByb3hpbWF0ZSB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHJlYWwgdmFsdWUgc28gdGhhdCB0aGVcclxuICAgIC8vIHJlbWFpbmRlciBuZXZlciBiZWNvbWVzIG5lZ2F0aXZlLlxyXG4gICAgcmVtID0gdGhpcztcclxuICAgIHdoaWxlIChyZW0uZ3RlKGRpdmlzb3IpKSB7XHJcbiAgICAgICAgLy8gQXBwcm94aW1hdGUgdGhlIHJlc3VsdCBvZiBkaXZpc2lvbi4gVGhpcyBtYXkgYmUgYSBsaXR0bGUgZ3JlYXRlciBvclxyXG4gICAgICAgIC8vIHNtYWxsZXIgdGhhbiB0aGUgYWN0dWFsIHZhbHVlLlxyXG4gICAgICAgIGFwcHJveCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3IocmVtLnRvTnVtYmVyKCkgLyBkaXZpc29yLnRvTnVtYmVyKCkpKTtcclxuXHJcbiAgICAgICAgLy8gV2Ugd2lsbCB0d2VhayB0aGUgYXBwcm94aW1hdGUgcmVzdWx0IGJ5IGNoYW5naW5nIGl0IGluIHRoZSA0OC10aCBkaWdpdCBvclxyXG4gICAgICAgIC8vIHRoZSBzbWFsbGVzdCBub24tZnJhY3Rpb25hbCBkaWdpdCwgd2hpY2hldmVyIGlzIGxhcmdlci5cclxuICAgICAgICB2YXIgbG9nMiA9IE1hdGguY2VpbChNYXRoLmxvZyhhcHByb3gpIC8gTWF0aC5MTjIpLFxyXG4gICAgICAgICAgICBkZWx0YSA9IChsb2cyIDw9IDQ4KSA/IDEgOiBwb3dfZGJsKDIsIGxvZzIgLSA0OCksXHJcblxyXG4gICAgICAgIC8vIERlY3JlYXNlIHRoZSBhcHByb3hpbWF0aW9uIHVudGlsIGl0IGlzIHNtYWxsZXIgdGhhbiB0aGUgcmVtYWluZGVyLiAgTm90ZVxyXG4gICAgICAgIC8vIHRoYXQgaWYgaXQgaXMgdG9vIGxhcmdlLCB0aGUgcHJvZHVjdCBvdmVyZmxvd3MgYW5kIGlzIG5lZ2F0aXZlLlxyXG4gICAgICAgICAgICBhcHByb3hSZXMgPSBmcm9tTnVtYmVyKGFwcHJveCksXHJcbiAgICAgICAgICAgIGFwcHJveFJlbSA9IGFwcHJveFJlcy5tdWwoZGl2aXNvcik7XHJcbiAgICAgICAgd2hpbGUgKGFwcHJveFJlbS5pc05lZ2F0aXZlKCkgfHwgYXBwcm94UmVtLmd0KHJlbSkpIHtcclxuICAgICAgICAgICAgYXBwcm94IC09IGRlbHRhO1xyXG4gICAgICAgICAgICBhcHByb3hSZXMgPSBmcm9tTnVtYmVyKGFwcHJveCwgdGhpcy51bnNpZ25lZCk7XHJcbiAgICAgICAgICAgIGFwcHJveFJlbSA9IGFwcHJveFJlcy5tdWwoZGl2aXNvcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBXZSBrbm93IHRoZSBhbnN3ZXIgY2FuJ3QgYmUgemVyby4uLiBhbmQgYWN0dWFsbHksIHplcm8gd291bGQgY2F1c2VcclxuICAgICAgICAvLyBpbmZpbml0ZSByZWN1cnNpb24gc2luY2Ugd2Ugd291bGQgbWFrZSBubyBwcm9ncmVzcy5cclxuICAgICAgICBpZiAoYXBwcm94UmVzLmlzWmVybygpKVxyXG4gICAgICAgICAgICBhcHByb3hSZXMgPSBPTkU7XHJcblxyXG4gICAgICAgIHJlcyA9IHJlcy5hZGQoYXBwcm94UmVzKTtcclxuICAgICAgICByZW0gPSByZW0uc3ViKGFwcHJveFJlbSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhpcyBMb25nIGRpdmlkZWQgYnkgdGhlIHNwZWNpZmllZC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNkaXZpZGV9LlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBkaXZpc29yIERpdmlzb3JcclxuICogQHJldHVybnMgeyFMb25nfSBRdW90aWVudFxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5kaXYgPSBMb25nUHJvdG90eXBlLmRpdmlkZTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyBtb2R1bG8gdGhlIHNwZWNpZmllZC5cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBkaXZpc29yIERpdmlzb3JcclxuICogQHJldHVybnMgeyFMb25nfSBSZW1haW5kZXJcclxuICovXHJcbkxvbmdQcm90b3R5cGUubW9kdWxvID0gZnVuY3Rpb24gbW9kdWxvKGRpdmlzb3IpIHtcclxuICAgIGlmICghaXNMb25nKGRpdmlzb3IpKVxyXG4gICAgICAgIGRpdmlzb3IgPSBmcm9tVmFsdWUoZGl2aXNvcik7XHJcblxyXG4gICAgLy8gdXNlIHdhc20gc3VwcG9ydCBpZiBwcmVzZW50XHJcbiAgICBpZiAod2FzbSkge1xyXG4gICAgICAgIHZhciBsb3cgPSAodGhpcy51bnNpZ25lZCA/IHdhc20ucmVtX3UgOiB3YXNtLnJlbV9zKShcclxuICAgICAgICAgICAgdGhpcy5sb3csXHJcbiAgICAgICAgICAgIHRoaXMuaGlnaCxcclxuICAgICAgICAgICAgZGl2aXNvci5sb3csXHJcbiAgICAgICAgICAgIGRpdmlzb3IuaGlnaFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgcmV0dXJuIGZyb21CaXRzKGxvdywgd2FzbS5nZXRfaGlnaCgpLCB0aGlzLnVuc2lnbmVkKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5zdWIodGhpcy5kaXYoZGl2aXNvcikubXVsKGRpdmlzb3IpKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyBtb2R1bG8gdGhlIHNwZWNpZmllZC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNtb2R1bG99LlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBkaXZpc29yIERpdmlzb3JcclxuICogQHJldHVybnMgeyFMb25nfSBSZW1haW5kZXJcclxuICovXHJcbkxvbmdQcm90b3R5cGUubW9kID0gTG9uZ1Byb3RvdHlwZS5tb2R1bG87XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGlzIExvbmcgbW9kdWxvIHRoZSBzcGVjaWZpZWQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbW9kdWxvfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gZGl2aXNvciBEaXZpc29yXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gUmVtYWluZGVyXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLnJlbSA9IExvbmdQcm90b3R5cGUubW9kdWxvO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGJpdHdpc2UgTk9UIG9mIHRoaXMgTG9uZy5cclxuICogQHJldHVybnMgeyFMb25nfVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5ub3QgPSBmdW5jdGlvbiBub3QoKSB7XHJcbiAgICByZXR1cm4gZnJvbUJpdHMofnRoaXMubG93LCB+dGhpcy5oaWdoLCB0aGlzLnVuc2lnbmVkKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBiaXR3aXNlIEFORCBvZiB0aGlzIExvbmcgYW5kIHRoZSBzcGVjaWZpZWQuXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgTG9uZ1xyXG4gKiBAcmV0dXJucyB7IUxvbmd9XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmFuZCA9IGZ1bmN0aW9uIGFuZChvdGhlcikge1xyXG4gICAgaWYgKCFpc0xvbmcob3RoZXIpKVxyXG4gICAgICAgIG90aGVyID0gZnJvbVZhbHVlKG90aGVyKTtcclxuICAgIHJldHVybiBmcm9tQml0cyh0aGlzLmxvdyAmIG90aGVyLmxvdywgdGhpcy5oaWdoICYgb3RoZXIuaGlnaCwgdGhpcy51bnNpZ25lZCk7XHJcbn07XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgYml0d2lzZSBPUiBvZiB0aGlzIExvbmcgYW5kIHRoZSBzcGVjaWZpZWQuXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgTG9uZ1xyXG4gKiBAcmV0dXJucyB7IUxvbmd9XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLm9yID0gZnVuY3Rpb24gb3Iob3RoZXIpIHtcclxuICAgIGlmICghaXNMb25nKG90aGVyKSlcclxuICAgICAgICBvdGhlciA9IGZyb21WYWx1ZShvdGhlcik7XHJcbiAgICByZXR1cm4gZnJvbUJpdHModGhpcy5sb3cgfCBvdGhlci5sb3csIHRoaXMuaGlnaCB8IG90aGVyLmhpZ2gsIHRoaXMudW5zaWduZWQpO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGJpdHdpc2UgWE9SIG9mIHRoaXMgTG9uZyBhbmQgdGhlIGdpdmVuIG9uZS5cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBvdGhlciBPdGhlciBMb25nXHJcbiAqIEByZXR1cm5zIHshTG9uZ31cclxuICovXHJcbkxvbmdQcm90b3R5cGUueG9yID0gZnVuY3Rpb24geG9yKG90aGVyKSB7XHJcbiAgICBpZiAoIWlzTG9uZyhvdGhlcikpXHJcbiAgICAgICAgb3RoZXIgPSBmcm9tVmFsdWUob3RoZXIpO1xyXG4gICAgcmV0dXJuIGZyb21CaXRzKHRoaXMubG93IF4gb3RoZXIubG93LCB0aGlzLmhpZ2ggXiBvdGhlci5oaWdoLCB0aGlzLnVuc2lnbmVkKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgc2hpZnRlZCB0byB0aGUgbGVmdCBieSB0aGUgZ2l2ZW4gYW1vdW50LlxyXG4gKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xyXG4gKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5zaGlmdExlZnQgPSBmdW5jdGlvbiBzaGlmdExlZnQobnVtQml0cykge1xyXG4gICAgaWYgKGlzTG9uZyhudW1CaXRzKSlcclxuICAgICAgICBudW1CaXRzID0gbnVtQml0cy50b0ludCgpO1xyXG4gICAgaWYgKChudW1CaXRzICY9IDYzKSA9PT0gMClcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIGVsc2UgaWYgKG51bUJpdHMgPCAzMilcclxuICAgICAgICByZXR1cm4gZnJvbUJpdHModGhpcy5sb3cgPDwgbnVtQml0cywgKHRoaXMuaGlnaCA8PCBudW1CaXRzKSB8ICh0aGlzLmxvdyA+Pj4gKDMyIC0gbnVtQml0cykpLCB0aGlzLnVuc2lnbmVkKTtcclxuICAgIGVsc2VcclxuICAgICAgICByZXR1cm4gZnJvbUJpdHMoMCwgdGhpcy5sb3cgPDwgKG51bUJpdHMgLSAzMiksIHRoaXMudW5zaWduZWQpO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyBzaGlmdGVkIHRvIHRoZSBsZWZ0IGJ5IHRoZSBnaXZlbiBhbW91bnQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjc2hpZnRMZWZ0fS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gU2hpZnRlZCBMb25nXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLnNobCA9IExvbmdQcm90b3R5cGUuc2hpZnRMZWZ0O1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyBhcml0aG1ldGljYWxseSBzaGlmdGVkIHRvIHRoZSByaWdodCBieSB0aGUgZ2l2ZW4gYW1vdW50LlxyXG4gKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xyXG4gKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5zaGlmdFJpZ2h0ID0gZnVuY3Rpb24gc2hpZnRSaWdodChudW1CaXRzKSB7XHJcbiAgICBpZiAoaXNMb25nKG51bUJpdHMpKVxyXG4gICAgICAgIG51bUJpdHMgPSBudW1CaXRzLnRvSW50KCk7XHJcbiAgICBpZiAoKG51bUJpdHMgJj0gNjMpID09PSAwKVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgZWxzZSBpZiAobnVtQml0cyA8IDMyKVxyXG4gICAgICAgIHJldHVybiBmcm9tQml0cygodGhpcy5sb3cgPj4+IG51bUJpdHMpIHwgKHRoaXMuaGlnaCA8PCAoMzIgLSBudW1CaXRzKSksIHRoaXMuaGlnaCA+PiBudW1CaXRzLCB0aGlzLnVuc2lnbmVkKTtcclxuICAgIGVsc2VcclxuICAgICAgICByZXR1cm4gZnJvbUJpdHModGhpcy5oaWdoID4+IChudW1CaXRzIC0gMzIpLCB0aGlzLmhpZ2ggPj0gMCA/IDAgOiAtMSwgdGhpcy51bnNpZ25lZCk7XHJcbn07XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIGFyaXRobWV0aWNhbGx5IHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0IGJ5IHRoZSBnaXZlbiBhbW91bnQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjc2hpZnRSaWdodH0uXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xyXG4gKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5zaHIgPSBMb25nUHJvdG90eXBlLnNoaWZ0UmlnaHQ7XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIGxvZ2ljYWxseSBzaGlmdGVkIHRvIHRoZSByaWdodCBieSB0aGUgZ2l2ZW4gYW1vdW50LlxyXG4gKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xyXG4gKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5zaGlmdFJpZ2h0VW5zaWduZWQgPSBmdW5jdGlvbiBzaGlmdFJpZ2h0VW5zaWduZWQobnVtQml0cykge1xyXG4gICAgaWYgKGlzTG9uZyhudW1CaXRzKSlcclxuICAgICAgICBudW1CaXRzID0gbnVtQml0cy50b0ludCgpO1xyXG4gICAgbnVtQml0cyAmPSA2MztcclxuICAgIGlmIChudW1CaXRzID09PSAwKVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgdmFyIGhpZ2ggPSB0aGlzLmhpZ2g7XHJcbiAgICAgICAgaWYgKG51bUJpdHMgPCAzMikge1xyXG4gICAgICAgICAgICB2YXIgbG93ID0gdGhpcy5sb3c7XHJcbiAgICAgICAgICAgIHJldHVybiBmcm9tQml0cygobG93ID4+PiBudW1CaXRzKSB8IChoaWdoIDw8ICgzMiAtIG51bUJpdHMpKSwgaGlnaCA+Pj4gbnVtQml0cywgdGhpcy51bnNpZ25lZCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChudW1CaXRzID09PSAzMilcclxuICAgICAgICAgICAgcmV0dXJuIGZyb21CaXRzKGhpZ2gsIDAsIHRoaXMudW5zaWduZWQpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgcmV0dXJuIGZyb21CaXRzKGhpZ2ggPj4+IChudW1CaXRzIC0gMzIpLCAwLCB0aGlzLnVuc2lnbmVkKTtcclxuICAgIH1cclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgbG9naWNhbGx5IHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0IGJ5IHRoZSBnaXZlbiBhbW91bnQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjc2hpZnRSaWdodFVuc2lnbmVkfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gU2hpZnRlZCBMb25nXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLnNocnUgPSBMb25nUHJvdG90eXBlLnNoaWZ0UmlnaHRVbnNpZ25lZDtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgbG9naWNhbGx5IHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0IGJ5IHRoZSBnaXZlbiBhbW91bnQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjc2hpZnRSaWdodFVuc2lnbmVkfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gU2hpZnRlZCBMb25nXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLnNocl91ID0gTG9uZ1Byb3RvdHlwZS5zaGlmdFJpZ2h0VW5zaWduZWQ7XHJcblxyXG4vKipcclxuICogQ29udmVydHMgdGhpcyBMb25nIHRvIHNpZ25lZC5cclxuICogQHJldHVybnMgeyFMb25nfSBTaWduZWQgbG9uZ1xyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS50b1NpZ25lZCA9IGZ1bmN0aW9uIHRvU2lnbmVkKCkge1xyXG4gICAgaWYgKCF0aGlzLnVuc2lnbmVkKVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgcmV0dXJuIGZyb21CaXRzKHRoaXMubG93LCB0aGlzLmhpZ2gsIGZhbHNlKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyB0aGlzIExvbmcgdG8gdW5zaWduZWQuXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gVW5zaWduZWQgbG9uZ1xyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS50b1Vuc2lnbmVkID0gZnVuY3Rpb24gdG9VbnNpZ25lZCgpIHtcclxuICAgIGlmICh0aGlzLnVuc2lnbmVkKVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgcmV0dXJuIGZyb21CaXRzKHRoaXMubG93LCB0aGlzLmhpZ2gsIHRydWUpO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIHRoaXMgTG9uZyB0byBpdHMgYnl0ZSByZXByZXNlbnRhdGlvbi5cclxuICogQHBhcmFtIHtib29sZWFuPX0gbGUgV2hldGhlciBsaXR0bGUgb3IgYmlnIGVuZGlhbiwgZGVmYXVsdHMgdG8gYmlnIGVuZGlhblxyXG4gKiBAcmV0dXJucyB7IUFycmF5LjxudW1iZXI+fSBCeXRlIHJlcHJlc2VudGF0aW9uXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLnRvQnl0ZXMgPSBmdW5jdGlvbiB0b0J5dGVzKGxlKSB7XHJcbiAgICByZXR1cm4gbGUgPyB0aGlzLnRvQnl0ZXNMRSgpIDogdGhpcy50b0J5dGVzQkUoKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyB0aGlzIExvbmcgdG8gaXRzIGxpdHRsZSBlbmRpYW4gYnl0ZSByZXByZXNlbnRhdGlvbi5cclxuICogQHJldHVybnMgeyFBcnJheS48bnVtYmVyPn0gTGl0dGxlIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLnRvQnl0ZXNMRSA9IGZ1bmN0aW9uIHRvQnl0ZXNMRSgpIHtcclxuICAgIHZhciBoaSA9IHRoaXMuaGlnaCxcclxuICAgICAgICBsbyA9IHRoaXMubG93O1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgICBsbyAgICAgICAgJiAweGZmLFxyXG4gICAgICAgIGxvID4+PiAgOCAmIDB4ZmYsXHJcbiAgICAgICAgbG8gPj4+IDE2ICYgMHhmZixcclxuICAgICAgICBsbyA+Pj4gMjQgICAgICAgLFxyXG4gICAgICAgIGhpICAgICAgICAmIDB4ZmYsXHJcbiAgICAgICAgaGkgPj4+ICA4ICYgMHhmZixcclxuICAgICAgICBoaSA+Pj4gMTYgJiAweGZmLFxyXG4gICAgICAgIGhpID4+PiAyNFxyXG4gICAgXTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyB0aGlzIExvbmcgdG8gaXRzIGJpZyBlbmRpYW4gYnl0ZSByZXByZXNlbnRhdGlvbi5cclxuICogQHJldHVybnMgeyFBcnJheS48bnVtYmVyPn0gQmlnIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLnRvQnl0ZXNCRSA9IGZ1bmN0aW9uIHRvQnl0ZXNCRSgpIHtcclxuICAgIHZhciBoaSA9IHRoaXMuaGlnaCxcclxuICAgICAgICBsbyA9IHRoaXMubG93O1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgICBoaSA+Pj4gMjQgICAgICAgLFxyXG4gICAgICAgIGhpID4+PiAxNiAmIDB4ZmYsXHJcbiAgICAgICAgaGkgPj4+ICA4ICYgMHhmZixcclxuICAgICAgICBoaSAgICAgICAgJiAweGZmLFxyXG4gICAgICAgIGxvID4+PiAyNCAgICAgICAsXHJcbiAgICAgICAgbG8gPj4+IDE2ICYgMHhmZixcclxuICAgICAgICBsbyA+Pj4gIDggJiAweGZmLFxyXG4gICAgICAgIGxvICAgICAgICAmIDB4ZmZcclxuICAgIF07XHJcbn07XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIExvbmcgZnJvbSBpdHMgYnl0ZSByZXByZXNlbnRhdGlvbi5cclxuICogQHBhcmFtIHshQXJyYXkuPG51bWJlcj59IGJ5dGVzIEJ5dGUgcmVwcmVzZW50YXRpb25cclxuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxyXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBsZSBXaGV0aGVyIGxpdHRsZSBvciBiaWcgZW5kaWFuLCBkZWZhdWx0cyB0byBiaWcgZW5kaWFuXHJcbiAqIEByZXR1cm5zIHtMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXHJcbiAqL1xyXG5Mb25nLmZyb21CeXRlcyA9IGZ1bmN0aW9uIGZyb21CeXRlcyhieXRlcywgdW5zaWduZWQsIGxlKSB7XHJcbiAgICByZXR1cm4gbGUgPyBMb25nLmZyb21CeXRlc0xFKGJ5dGVzLCB1bnNpZ25lZCkgOiBMb25nLmZyb21CeXRlc0JFKGJ5dGVzLCB1bnNpZ25lZCk7XHJcbn07XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIExvbmcgZnJvbSBpdHMgbGl0dGxlIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uLlxyXG4gKiBAcGFyYW0geyFBcnJheS48bnVtYmVyPn0gYnl0ZXMgTGl0dGxlIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcclxuICogQHJldHVybnMge0xvbmd9IFRoZSBjb3JyZXNwb25kaW5nIExvbmcgdmFsdWVcclxuICovXHJcbkxvbmcuZnJvbUJ5dGVzTEUgPSBmdW5jdGlvbiBmcm9tQnl0ZXNMRShieXRlcywgdW5zaWduZWQpIHtcclxuICAgIHJldHVybiBuZXcgTG9uZyhcclxuICAgICAgICBieXRlc1swXSAgICAgICB8XHJcbiAgICAgICAgYnl0ZXNbMV0gPDwgIDggfFxyXG4gICAgICAgIGJ5dGVzWzJdIDw8IDE2IHxcclxuICAgICAgICBieXRlc1szXSA8PCAyNCxcclxuICAgICAgICBieXRlc1s0XSAgICAgICB8XHJcbiAgICAgICAgYnl0ZXNbNV0gPDwgIDggfFxyXG4gICAgICAgIGJ5dGVzWzZdIDw8IDE2IHxcclxuICAgICAgICBieXRlc1s3XSA8PCAyNCxcclxuICAgICAgICB1bnNpZ25lZFxyXG4gICAgKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgTG9uZyBmcm9tIGl0cyBiaWcgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb24uXHJcbiAqIEBwYXJhbSB7IUFycmF5LjxudW1iZXI+fSBieXRlcyBCaWcgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb25cclxuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxyXG4gKiBAcmV0dXJucyB7TG9uZ30gVGhlIGNvcnJlc3BvbmRpbmcgTG9uZyB2YWx1ZVxyXG4gKi9cclxuTG9uZy5mcm9tQnl0ZXNCRSA9IGZ1bmN0aW9uIGZyb21CeXRlc0JFKGJ5dGVzLCB1bnNpZ25lZCkge1xyXG4gICAgcmV0dXJuIG5ldyBMb25nKFxyXG4gICAgICAgIGJ5dGVzWzRdIDw8IDI0IHxcclxuICAgICAgICBieXRlc1s1XSA8PCAxNiB8XHJcbiAgICAgICAgYnl0ZXNbNl0gPDwgIDggfFxyXG4gICAgICAgIGJ5dGVzWzddLFxyXG4gICAgICAgIGJ5dGVzWzBdIDw8IDI0IHxcclxuICAgICAgICBieXRlc1sxXSA8PCAxNiB8XHJcbiAgICAgICAgYnl0ZXNbMl0gPDwgIDggfFxyXG4gICAgICAgIGJ5dGVzWzNdLFxyXG4gICAgICAgIHVuc2lnbmVkXHJcbiAgICApO1xyXG59O1xyXG4iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwiLy8gQSBsaWJyYXJ5IG9mIHNlZWRhYmxlIFJOR3MgaW1wbGVtZW50ZWQgaW4gSmF2YXNjcmlwdC5cbi8vXG4vLyBVc2FnZTpcbi8vXG4vLyB2YXIgc2VlZHJhbmRvbSA9IHJlcXVpcmUoJ3NlZWRyYW5kb20nKTtcbi8vIHZhciByYW5kb20gPSBzZWVkcmFuZG9tKDEpOyAvLyBvciBhbnkgc2VlZC5cbi8vIHZhciB4ID0gcmFuZG9tKCk7ICAgICAgIC8vIDAgPD0geCA8IDEuICBFdmVyeSBiaXQgaXMgcmFuZG9tLlxuLy8gdmFyIHggPSByYW5kb20ucXVpY2soKTsgLy8gMCA8PSB4IDwgMS4gIDMyIGJpdHMgb2YgcmFuZG9tbmVzcy5cblxuLy8gYWxlYSwgYSA1My1iaXQgbXVsdGlwbHktd2l0aC1jYXJyeSBnZW5lcmF0b3IgYnkgSm9oYW5uZXMgQmFhZ8O4ZS5cbi8vIFBlcmlvZDogfjJeMTE2XG4vLyBSZXBvcnRlZCB0byBwYXNzIGFsbCBCaWdDcnVzaCB0ZXN0cy5cbnZhciBhbGVhID0gcmVxdWlyZSgnLi9saWIvYWxlYScpO1xuXG4vLyB4b3IxMjgsIGEgcHVyZSB4b3Itc2hpZnQgZ2VuZXJhdG9yIGJ5IEdlb3JnZSBNYXJzYWdsaWEuXG4vLyBQZXJpb2Q6IDJeMTI4LTEuXG4vLyBSZXBvcnRlZCB0byBmYWlsOiBNYXRyaXhSYW5rIGFuZCBMaW5lYXJDb21wLlxudmFyIHhvcjEyOCA9IHJlcXVpcmUoJy4vbGliL3hvcjEyOCcpO1xuXG4vLyB4b3J3b3csIEdlb3JnZSBNYXJzYWdsaWEncyAxNjAtYml0IHhvci1zaGlmdCBjb21iaW5lZCBwbHVzIHdleWwuXG4vLyBQZXJpb2Q6IDJeMTkyLTJeMzJcbi8vIFJlcG9ydGVkIHRvIGZhaWw6IENvbGxpc2lvbk92ZXIsIFNpbXBQb2tlciwgYW5kIExpbmVhckNvbXAuXG52YXIgeG9yd293ID0gcmVxdWlyZSgnLi9saWIveG9yd293Jyk7XG5cbi8vIHhvcnNoaWZ0NywgYnkgRnJhbsOnb2lzIFBhbm5ldG9uIGFuZCBQaWVycmUgTCdlY3V5ZXIsIHRha2VzXG4vLyBhIGRpZmZlcmVudCBhcHByb2FjaDogaXQgYWRkcyByb2J1c3RuZXNzIGJ5IGFsbG93aW5nIG1vcmUgc2hpZnRzXG4vLyB0aGFuIE1hcnNhZ2xpYSdzIG9yaWdpbmFsIHRocmVlLiAgSXQgaXMgYSA3LXNoaWZ0IGdlbmVyYXRvclxuLy8gd2l0aCAyNTYgYml0cywgdGhhdCBwYXNzZXMgQmlnQ3J1c2ggd2l0aCBubyBzeXN0bWF0aWMgZmFpbHVyZXMuXG4vLyBQZXJpb2QgMl4yNTYtMS5cbi8vIE5vIHN5c3RlbWF0aWMgQmlnQ3J1c2ggZmFpbHVyZXMgcmVwb3J0ZWQuXG52YXIgeG9yc2hpZnQ3ID0gcmVxdWlyZSgnLi9saWIveG9yc2hpZnQ3Jyk7XG5cbi8vIHhvcjQwOTYsIGJ5IFJpY2hhcmQgQnJlbnQsIGlzIGEgNDA5Ni1iaXQgeG9yLXNoaWZ0IHdpdGggYVxuLy8gdmVyeSBsb25nIHBlcmlvZCB0aGF0IGFsc28gYWRkcyBhIFdleWwgZ2VuZXJhdG9yLiBJdCBhbHNvIHBhc3Nlc1xuLy8gQmlnQ3J1c2ggd2l0aCBubyBzeXN0ZW1hdGljIGZhaWx1cmVzLiAgSXRzIGxvbmcgcGVyaW9kIG1heVxuLy8gYmUgdXNlZnVsIGlmIHlvdSBoYXZlIG1hbnkgZ2VuZXJhdG9ycyBhbmQgbmVlZCB0byBhdm9pZFxuLy8gY29sbGlzaW9ucy5cbi8vIFBlcmlvZDogMl40MTI4LTJeMzIuXG4vLyBObyBzeXN0ZW1hdGljIEJpZ0NydXNoIGZhaWx1cmVzIHJlcG9ydGVkLlxudmFyIHhvcjQwOTYgPSByZXF1aXJlKCcuL2xpYi94b3I0MDk2Jyk7XG5cbi8vIFR5Y2hlLWksIGJ5IFNhbXVlbCBOZXZlcyBhbmQgRmlsaXBlIEFyYXVqbywgaXMgYSBiaXQtc2hpZnRpbmcgcmFuZG9tXG4vLyBudW1iZXIgZ2VuZXJhdG9yIGRlcml2ZWQgZnJvbSBDaGFDaGEsIGEgbW9kZXJuIHN0cmVhbSBjaXBoZXIuXG4vLyBodHRwczovL2VkZW4uZGVpLnVjLnB0L35zbmV2ZXMvcHVicy8yMDExLXNuZmEyLnBkZlxuLy8gUGVyaW9kOiB+Ml4xMjdcbi8vIE5vIHN5c3RlbWF0aWMgQmlnQ3J1c2ggZmFpbHVyZXMgcmVwb3J0ZWQuXG52YXIgdHljaGVpID0gcmVxdWlyZSgnLi9saWIvdHljaGVpJyk7XG5cbi8vIFRoZSBvcmlnaW5hbCBBUkM0LWJhc2VkIHBybmcgaW5jbHVkZWQgaW4gdGhpcyBsaWJyYXJ5LlxuLy8gUGVyaW9kOiB+Ml4xNjAwXG52YXIgc3IgPSByZXF1aXJlKCcuL3NlZWRyYW5kb20nKTtcblxuc3IuYWxlYSA9IGFsZWE7XG5zci54b3IxMjggPSB4b3IxMjg7XG5zci54b3J3b3cgPSB4b3J3b3c7XG5zci54b3JzaGlmdDcgPSB4b3JzaGlmdDc7XG5zci54b3I0MDk2ID0geG9yNDA5NjtcbnNyLnR5Y2hlaSA9IHR5Y2hlaTtcblxubW9kdWxlLmV4cG9ydHMgPSBzcjtcbiIsIi8vIEEgcG9ydCBvZiBhbiBhbGdvcml0aG0gYnkgSm9oYW5uZXMgQmFhZ8O4ZSA8YmFhZ29lQGJhYWdvZS5jb20+LCAyMDEwXG4vLyBodHRwOi8vYmFhZ29lLmNvbS9lbi9SYW5kb21NdXNpbmdzL2phdmFzY3JpcHQvXG4vLyBodHRwczovL2dpdGh1Yi5jb20vbnF1aW5sYW4vYmV0dGVyLXJhbmRvbS1udW1iZXJzLWZvci1qYXZhc2NyaXB0LW1pcnJvclxuLy8gT3JpZ2luYWwgd29yayBpcyB1bmRlciBNSVQgbGljZW5zZSAtXG5cbi8vIENvcHlyaWdodCAoQykgMjAxMCBieSBKb2hhbm5lcyBCYWFnw7hlIDxiYWFnb2VAYmFhZ29lLm9yZz5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vLyBcbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vIFxuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cblxuXG4oZnVuY3Rpb24oZ2xvYmFsLCBtb2R1bGUsIGRlZmluZSkge1xuXG5mdW5jdGlvbiBBbGVhKHNlZWQpIHtcbiAgdmFyIG1lID0gdGhpcywgbWFzaCA9IE1hc2goKTtcblxuICBtZS5uZXh0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHQgPSAyMDkxNjM5ICogbWUuczAgKyBtZS5jICogMi4zMjgzMDY0MzY1Mzg2OTYzZS0xMDsgLy8gMl4tMzJcbiAgICBtZS5zMCA9IG1lLnMxO1xuICAgIG1lLnMxID0gbWUuczI7XG4gICAgcmV0dXJuIG1lLnMyID0gdCAtIChtZS5jID0gdCB8IDApO1xuICB9O1xuXG4gIC8vIEFwcGx5IHRoZSBzZWVkaW5nIGFsZ29yaXRobSBmcm9tIEJhYWdvZS5cbiAgbWUuYyA9IDE7XG4gIG1lLnMwID0gbWFzaCgnICcpO1xuICBtZS5zMSA9IG1hc2goJyAnKTtcbiAgbWUuczIgPSBtYXNoKCcgJyk7XG4gIG1lLnMwIC09IG1hc2goc2VlZCk7XG4gIGlmIChtZS5zMCA8IDApIHsgbWUuczAgKz0gMTsgfVxuICBtZS5zMSAtPSBtYXNoKHNlZWQpO1xuICBpZiAobWUuczEgPCAwKSB7IG1lLnMxICs9IDE7IH1cbiAgbWUuczIgLT0gbWFzaChzZWVkKTtcbiAgaWYgKG1lLnMyIDwgMCkgeyBtZS5zMiArPSAxOyB9XG4gIG1hc2ggPSBudWxsO1xufVxuXG5mdW5jdGlvbiBjb3B5KGYsIHQpIHtcbiAgdC5jID0gZi5jO1xuICB0LnMwID0gZi5zMDtcbiAgdC5zMSA9IGYuczE7XG4gIHQuczIgPSBmLnMyO1xuICByZXR1cm4gdDtcbn1cblxuZnVuY3Rpb24gaW1wbChzZWVkLCBvcHRzKSB7XG4gIHZhciB4ZyA9IG5ldyBBbGVhKHNlZWQpLFxuICAgICAgc3RhdGUgPSBvcHRzICYmIG9wdHMuc3RhdGUsXG4gICAgICBwcm5nID0geGcubmV4dDtcbiAgcHJuZy5pbnQzMiA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gKHhnLm5leHQoKSAqIDB4MTAwMDAwMDAwKSB8IDA7IH1cbiAgcHJuZy5kb3VibGUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gcHJuZygpICsgKHBybmcoKSAqIDB4MjAwMDAwIHwgMCkgKiAxLjExMDIyMzAyNDYyNTE1NjVlLTE2OyAvLyAyXi01M1xuICB9O1xuICBwcm5nLnF1aWNrID0gcHJuZztcbiAgaWYgKHN0YXRlKSB7XG4gICAgaWYgKHR5cGVvZihzdGF0ZSkgPT0gJ29iamVjdCcpIGNvcHkoc3RhdGUsIHhnKTtcbiAgICBwcm5nLnN0YXRlID0gZnVuY3Rpb24oKSB7IHJldHVybiBjb3B5KHhnLCB7fSk7IH1cbiAgfVxuICByZXR1cm4gcHJuZztcbn1cblxuZnVuY3Rpb24gTWFzaCgpIHtcbiAgdmFyIG4gPSAweGVmYzgyNDlkO1xuXG4gIHZhciBtYXNoID0gZnVuY3Rpb24oZGF0YSkge1xuICAgIGRhdGEgPSBkYXRhLnRvU3RyaW5nKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBuICs9IGRhdGEuY2hhckNvZGVBdChpKTtcbiAgICAgIHZhciBoID0gMC4wMjUxOTYwMzI4MjQxNjkzOCAqIG47XG4gICAgICBuID0gaCA+Pj4gMDtcbiAgICAgIGggLT0gbjtcbiAgICAgIGggKj0gbjtcbiAgICAgIG4gPSBoID4+PiAwO1xuICAgICAgaCAtPSBuO1xuICAgICAgbiArPSBoICogMHgxMDAwMDAwMDA7IC8vIDJeMzJcbiAgICB9XG4gICAgcmV0dXJuIChuID4+PiAwKSAqIDIuMzI4MzA2NDM2NTM4Njk2M2UtMTA7IC8vIDJeLTMyXG4gIH07XG5cbiAgcmV0dXJuIG1hc2g7XG59XG5cblxuaWYgKG1vZHVsZSAmJiBtb2R1bGUuZXhwb3J0cykge1xuICBtb2R1bGUuZXhwb3J0cyA9IGltcGw7XG59IGVsc2UgaWYgKGRlZmluZSAmJiBkZWZpbmUuYW1kKSB7XG4gIGRlZmluZShmdW5jdGlvbigpIHsgcmV0dXJuIGltcGw7IH0pO1xufSBlbHNlIHtcbiAgdGhpcy5hbGVhID0gaW1wbDtcbn1cblxufSkoXG4gIHRoaXMsXG4gICh0eXBlb2YgbW9kdWxlKSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUsICAgIC8vIHByZXNlbnQgaW4gbm9kZS5qc1xuICAodHlwZW9mIGRlZmluZSkgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUgICAvLyBwcmVzZW50IHdpdGggYW4gQU1EIGxvYWRlclxuKTtcblxuXG4iLCIvLyBBIEphdmFzY3JpcHQgaW1wbGVtZW50YWlvbiBvZiB0aGUgXCJUeWNoZS1pXCIgcHJuZyBhbGdvcml0aG0gYnlcbi8vIFNhbXVlbCBOZXZlcyBhbmQgRmlsaXBlIEFyYXVqby5cbi8vIFNlZSBodHRwczovL2VkZW4uZGVpLnVjLnB0L35zbmV2ZXMvcHVicy8yMDExLXNuZmEyLnBkZlxuXG4oZnVuY3Rpb24oZ2xvYmFsLCBtb2R1bGUsIGRlZmluZSkge1xuXG5mdW5jdGlvbiBYb3JHZW4oc2VlZCkge1xuICB2YXIgbWUgPSB0aGlzLCBzdHJzZWVkID0gJyc7XG5cbiAgLy8gU2V0IHVwIGdlbmVyYXRvciBmdW5jdGlvbi5cbiAgbWUubmV4dCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBiID0gbWUuYiwgYyA9IG1lLmMsIGQgPSBtZS5kLCBhID0gbWUuYTtcbiAgICBiID0gKGIgPDwgMjUpIF4gKGIgPj4+IDcpIF4gYztcbiAgICBjID0gKGMgLSBkKSB8IDA7XG4gICAgZCA9IChkIDw8IDI0KSBeIChkID4+PiA4KSBeIGE7XG4gICAgYSA9IChhIC0gYikgfCAwO1xuICAgIG1lLmIgPSBiID0gKGIgPDwgMjApIF4gKGIgPj4+IDEyKSBeIGM7XG4gICAgbWUuYyA9IGMgPSAoYyAtIGQpIHwgMDtcbiAgICBtZS5kID0gKGQgPDwgMTYpIF4gKGMgPj4+IDE2KSBeIGE7XG4gICAgcmV0dXJuIG1lLmEgPSAoYSAtIGIpIHwgMDtcbiAgfTtcblxuICAvKiBUaGUgZm9sbG93aW5nIGlzIG5vbi1pbnZlcnRlZCB0eWNoZSwgd2hpY2ggaGFzIGJldHRlciBpbnRlcm5hbFxuICAgKiBiaXQgZGlmZnVzaW9uLCBidXQgd2hpY2ggaXMgYWJvdXQgMjUlIHNsb3dlciB0aGFuIHR5Y2hlLWkgaW4gSlMuXG4gIG1lLm5leHQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgYSA9IG1lLmEsIGIgPSBtZS5iLCBjID0gbWUuYywgZCA9IG1lLmQ7XG4gICAgYSA9IChtZS5hICsgbWUuYiB8IDApID4+PiAwO1xuICAgIGQgPSBtZS5kIF4gYTsgZCA9IGQgPDwgMTYgXiBkID4+PiAxNjtcbiAgICBjID0gbWUuYyArIGQgfCAwO1xuICAgIGIgPSBtZS5iIF4gYzsgYiA9IGIgPDwgMTIgXiBkID4+PiAyMDtcbiAgICBtZS5hID0gYSA9IGEgKyBiIHwgMDtcbiAgICBkID0gZCBeIGE7IG1lLmQgPSBkID0gZCA8PCA4IF4gZCA+Pj4gMjQ7XG4gICAgbWUuYyA9IGMgPSBjICsgZCB8IDA7XG4gICAgYiA9IGIgXiBjO1xuICAgIHJldHVybiBtZS5iID0gKGIgPDwgNyBeIGIgPj4+IDI1KTtcbiAgfVxuICAqL1xuXG4gIG1lLmEgPSAwO1xuICBtZS5iID0gMDtcbiAgbWUuYyA9IDI2NTQ0MzU3NjkgfCAwO1xuICBtZS5kID0gMTM2NzEzMDU1MTtcblxuICBpZiAoc2VlZCA9PT0gTWF0aC5mbG9vcihzZWVkKSkge1xuICAgIC8vIEludGVnZXIgc2VlZC5cbiAgICBtZS5hID0gKHNlZWQgLyAweDEwMDAwMDAwMCkgfCAwO1xuICAgIG1lLmIgPSBzZWVkIHwgMDtcbiAgfSBlbHNlIHtcbiAgICAvLyBTdHJpbmcgc2VlZC5cbiAgICBzdHJzZWVkICs9IHNlZWQ7XG4gIH1cblxuICAvLyBNaXggaW4gc3RyaW5nIHNlZWQsIHRoZW4gZGlzY2FyZCBhbiBpbml0aWFsIGJhdGNoIG9mIDY0IHZhbHVlcy5cbiAgZm9yICh2YXIgayA9IDA7IGsgPCBzdHJzZWVkLmxlbmd0aCArIDIwOyBrKyspIHtcbiAgICBtZS5iIF49IHN0cnNlZWQuY2hhckNvZGVBdChrKSB8IDA7XG4gICAgbWUubmV4dCgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvcHkoZiwgdCkge1xuICB0LmEgPSBmLmE7XG4gIHQuYiA9IGYuYjtcbiAgdC5jID0gZi5jO1xuICB0LmQgPSBmLmQ7XG4gIHJldHVybiB0O1xufTtcblxuZnVuY3Rpb24gaW1wbChzZWVkLCBvcHRzKSB7XG4gIHZhciB4ZyA9IG5ldyBYb3JHZW4oc2VlZCksXG4gICAgICBzdGF0ZSA9IG9wdHMgJiYgb3B0cy5zdGF0ZSxcbiAgICAgIHBybmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuICh4Zy5uZXh0KCkgPj4+IDApIC8gMHgxMDAwMDAwMDA7IH07XG4gIHBybmcuZG91YmxlID0gZnVuY3Rpb24oKSB7XG4gICAgZG8ge1xuICAgICAgdmFyIHRvcCA9IHhnLm5leHQoKSA+Pj4gMTEsXG4gICAgICAgICAgYm90ID0gKHhnLm5leHQoKSA+Pj4gMCkgLyAweDEwMDAwMDAwMCxcbiAgICAgICAgICByZXN1bHQgPSAodG9wICsgYm90KSAvICgxIDw8IDIxKTtcbiAgICB9IHdoaWxlIChyZXN1bHQgPT09IDApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIHBybmcuaW50MzIgPSB4Zy5uZXh0O1xuICBwcm5nLnF1aWNrID0gcHJuZztcbiAgaWYgKHN0YXRlKSB7XG4gICAgaWYgKHR5cGVvZihzdGF0ZSkgPT0gJ29iamVjdCcpIGNvcHkoc3RhdGUsIHhnKTtcbiAgICBwcm5nLnN0YXRlID0gZnVuY3Rpb24oKSB7IHJldHVybiBjb3B5KHhnLCB7fSk7IH1cbiAgfVxuICByZXR1cm4gcHJuZztcbn1cblxuaWYgKG1vZHVsZSAmJiBtb2R1bGUuZXhwb3J0cykge1xuICBtb2R1bGUuZXhwb3J0cyA9IGltcGw7XG59IGVsc2UgaWYgKGRlZmluZSAmJiBkZWZpbmUuYW1kKSB7XG4gIGRlZmluZShmdW5jdGlvbigpIHsgcmV0dXJuIGltcGw7IH0pO1xufSBlbHNlIHtcbiAgdGhpcy50eWNoZWkgPSBpbXBsO1xufVxuXG59KShcbiAgdGhpcyxcbiAgKHR5cGVvZiBtb2R1bGUpID09ICdvYmplY3QnICYmIG1vZHVsZSwgICAgLy8gcHJlc2VudCBpbiBub2RlLmpzXG4gICh0eXBlb2YgZGVmaW5lKSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZSAgIC8vIHByZXNlbnQgd2l0aCBhbiBBTUQgbG9hZGVyXG4pO1xuXG5cbiIsIi8vIEEgSmF2YXNjcmlwdCBpbXBsZW1lbnRhaW9uIG9mIHRoZSBcInhvcjEyOFwiIHBybmcgYWxnb3JpdGhtIGJ5XG4vLyBHZW9yZ2UgTWFyc2FnbGlhLiAgU2VlIGh0dHA6Ly93d3cuanN0YXRzb2Z0Lm9yZy92MDgvaTE0L3BhcGVyXG5cbihmdW5jdGlvbihnbG9iYWwsIG1vZHVsZSwgZGVmaW5lKSB7XG5cbmZ1bmN0aW9uIFhvckdlbihzZWVkKSB7XG4gIHZhciBtZSA9IHRoaXMsIHN0cnNlZWQgPSAnJztcblxuICBtZS54ID0gMDtcbiAgbWUueSA9IDA7XG4gIG1lLnogPSAwO1xuICBtZS53ID0gMDtcblxuICAvLyBTZXQgdXAgZ2VuZXJhdG9yIGZ1bmN0aW9uLlxuICBtZS5uZXh0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHQgPSBtZS54IF4gKG1lLnggPDwgMTEpO1xuICAgIG1lLnggPSBtZS55O1xuICAgIG1lLnkgPSBtZS56O1xuICAgIG1lLnogPSBtZS53O1xuICAgIHJldHVybiBtZS53IF49IChtZS53ID4+PiAxOSkgXiB0IF4gKHQgPj4+IDgpO1xuICB9O1xuXG4gIGlmIChzZWVkID09PSAoc2VlZCB8IDApKSB7XG4gICAgLy8gSW50ZWdlciBzZWVkLlxuICAgIG1lLnggPSBzZWVkO1xuICB9IGVsc2Uge1xuICAgIC8vIFN0cmluZyBzZWVkLlxuICAgIHN0cnNlZWQgKz0gc2VlZDtcbiAgfVxuXG4gIC8vIE1peCBpbiBzdHJpbmcgc2VlZCwgdGhlbiBkaXNjYXJkIGFuIGluaXRpYWwgYmF0Y2ggb2YgNjQgdmFsdWVzLlxuICBmb3IgKHZhciBrID0gMDsgayA8IHN0cnNlZWQubGVuZ3RoICsgNjQ7IGsrKykge1xuICAgIG1lLnggXj0gc3Ryc2VlZC5jaGFyQ29kZUF0KGspIHwgMDtcbiAgICBtZS5uZXh0KCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29weShmLCB0KSB7XG4gIHQueCA9IGYueDtcbiAgdC55ID0gZi55O1xuICB0LnogPSBmLno7XG4gIHQudyA9IGYudztcbiAgcmV0dXJuIHQ7XG59XG5cbmZ1bmN0aW9uIGltcGwoc2VlZCwgb3B0cykge1xuICB2YXIgeGcgPSBuZXcgWG9yR2VuKHNlZWQpLFxuICAgICAgc3RhdGUgPSBvcHRzICYmIG9wdHMuc3RhdGUsXG4gICAgICBwcm5nID0gZnVuY3Rpb24oKSB7IHJldHVybiAoeGcubmV4dCgpID4+PiAwKSAvIDB4MTAwMDAwMDAwOyB9O1xuICBwcm5nLmRvdWJsZSA9IGZ1bmN0aW9uKCkge1xuICAgIGRvIHtcbiAgICAgIHZhciB0b3AgPSB4Zy5uZXh0KCkgPj4+IDExLFxuICAgICAgICAgIGJvdCA9ICh4Zy5uZXh0KCkgPj4+IDApIC8gMHgxMDAwMDAwMDAsXG4gICAgICAgICAgcmVzdWx0ID0gKHRvcCArIGJvdCkgLyAoMSA8PCAyMSk7XG4gICAgfSB3aGlsZSAocmVzdWx0ID09PSAwKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICBwcm5nLmludDMyID0geGcubmV4dDtcbiAgcHJuZy5xdWljayA9IHBybmc7XG4gIGlmIChzdGF0ZSkge1xuICAgIGlmICh0eXBlb2Yoc3RhdGUpID09ICdvYmplY3QnKSBjb3B5KHN0YXRlLCB4Zyk7XG4gICAgcHJuZy5zdGF0ZSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gY29weSh4Zywge30pOyB9XG4gIH1cbiAgcmV0dXJuIHBybmc7XG59XG5cbmlmIChtb2R1bGUgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBpbXBsO1xufSBlbHNlIGlmIChkZWZpbmUgJiYgZGVmaW5lLmFtZCkge1xuICBkZWZpbmUoZnVuY3Rpb24oKSB7IHJldHVybiBpbXBsOyB9KTtcbn0gZWxzZSB7XG4gIHRoaXMueG9yMTI4ID0gaW1wbDtcbn1cblxufSkoXG4gIHRoaXMsXG4gICh0eXBlb2YgbW9kdWxlKSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUsICAgIC8vIHByZXNlbnQgaW4gbm9kZS5qc1xuICAodHlwZW9mIGRlZmluZSkgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUgICAvLyBwcmVzZW50IHdpdGggYW4gQU1EIGxvYWRlclxuKTtcblxuXG4iLCIvLyBBIEphdmFzY3JpcHQgaW1wbGVtZW50YWlvbiBvZiBSaWNoYXJkIEJyZW50J3MgWG9yZ2VucyB4b3I0MDk2IGFsZ29yaXRobS5cbi8vXG4vLyBUaGlzIGZhc3Qgbm9uLWNyeXB0b2dyYXBoaWMgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgaXMgZGVzaWduZWQgZm9yXG4vLyB1c2UgaW4gTW9udGUtQ2FybG8gYWxnb3JpdGhtcy4gSXQgY29tYmluZXMgYSBsb25nLXBlcmlvZCB4b3JzaGlmdFxuLy8gZ2VuZXJhdG9yIHdpdGggYSBXZXlsIGdlbmVyYXRvciwgYW5kIGl0IHBhc3NlcyBhbGwgY29tbW9uIGJhdHRlcmllc1xuLy8gb2Ygc3Rhc3RpY2lhbCB0ZXN0cyBmb3IgcmFuZG9tbmVzcyB3aGlsZSBjb25zdW1pbmcgb25seSBhIGZldyBuYW5vc2Vjb25kc1xuLy8gZm9yIGVhY2ggcHJuZyBnZW5lcmF0ZWQuICBGb3IgYmFja2dyb3VuZCBvbiB0aGUgZ2VuZXJhdG9yLCBzZWUgQnJlbnQnc1xuLy8gcGFwZXI6IFwiU29tZSBsb25nLXBlcmlvZCByYW5kb20gbnVtYmVyIGdlbmVyYXRvcnMgdXNpbmcgc2hpZnRzIGFuZCB4b3JzLlwiXG4vLyBodHRwOi8vYXJ4aXYub3JnL3BkZi8xMDA0LjMxMTV2MS5wZGZcbi8vXG4vLyBVc2FnZTpcbi8vXG4vLyB2YXIgeG9yNDA5NiA9IHJlcXVpcmUoJ3hvcjQwOTYnKTtcbi8vIHJhbmRvbSA9IHhvcjQwOTYoMSk7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VlZCB3aXRoIGludDMyIG9yIHN0cmluZy5cbi8vIGFzc2VydC5lcXVhbChyYW5kb20oKSwgMC4xNTIwNDM2NDUwNTM4NTQ3KTsgLy8gKDAsIDEpIHJhbmdlLCA1MyBiaXRzLlxuLy8gYXNzZXJ0LmVxdWFsKHJhbmRvbS5pbnQzMigpLCAxODA2NTM0ODk3KTsgICAvLyBzaWduZWQgaW50MzIsIDMyIGJpdHMuXG4vL1xuLy8gRm9yIG5vbnplcm8gbnVtZXJpYyBrZXlzLCB0aGlzIGltcGVsZW1lbnRhdGlvbiBwcm92aWRlcyBhIHNlcXVlbmNlXG4vLyBpZGVudGljYWwgdG8gdGhhdCBieSBCcmVudCdzIHhvcmdlbnMgMyBpbXBsZW1lbnRhaW9uIGluIEMuICBUaGlzXG4vLyBpbXBsZW1lbnRhdGlvbiBhbHNvIHByb3ZpZGVzIGZvciBpbml0YWxpemluZyB0aGUgZ2VuZXJhdG9yIHdpdGhcbi8vIHN0cmluZyBzZWVkcywgb3IgZm9yIHNhdmluZyBhbmQgcmVzdG9yaW5nIHRoZSBzdGF0ZSBvZiB0aGUgZ2VuZXJhdG9yLlxuLy9cbi8vIE9uIENocm9tZSwgdGhpcyBwcm5nIGJlbmNobWFya3MgYWJvdXQgMi4xIHRpbWVzIHNsb3dlciB0aGFuXG4vLyBKYXZhc2NyaXB0J3MgYnVpbHQtaW4gTWF0aC5yYW5kb20oKS5cblxuKGZ1bmN0aW9uKGdsb2JhbCwgbW9kdWxlLCBkZWZpbmUpIHtcblxuZnVuY3Rpb24gWG9yR2VuKHNlZWQpIHtcbiAgdmFyIG1lID0gdGhpcztcblxuICAvLyBTZXQgdXAgZ2VuZXJhdG9yIGZ1bmN0aW9uLlxuICBtZS5uZXh0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHcgPSBtZS53LFxuICAgICAgICBYID0gbWUuWCwgaSA9IG1lLmksIHQsIHY7XG4gICAgLy8gVXBkYXRlIFdleWwgZ2VuZXJhdG9yLlxuICAgIG1lLncgPSB3ID0gKHcgKyAweDYxYzg4NjQ3KSB8IDA7XG4gICAgLy8gVXBkYXRlIHhvciBnZW5lcmF0b3IuXG4gICAgdiA9IFhbKGkgKyAzNCkgJiAxMjddO1xuICAgIHQgPSBYW2kgPSAoKGkgKyAxKSAmIDEyNyldO1xuICAgIHYgXj0gdiA8PCAxMztcbiAgICB0IF49IHQgPDwgMTc7XG4gICAgdiBePSB2ID4+PiAxNTtcbiAgICB0IF49IHQgPj4+IDEyO1xuICAgIC8vIFVwZGF0ZSBYb3IgZ2VuZXJhdG9yIGFycmF5IHN0YXRlLlxuICAgIHYgPSBYW2ldID0gdiBeIHQ7XG4gICAgbWUuaSA9IGk7XG4gICAgLy8gUmVzdWx0IGlzIHRoZSBjb21iaW5hdGlvbi5cbiAgICByZXR1cm4gKHYgKyAodyBeICh3ID4+PiAxNikpKSB8IDA7XG4gIH07XG5cbiAgZnVuY3Rpb24gaW5pdChtZSwgc2VlZCkge1xuICAgIHZhciB0LCB2LCBpLCBqLCB3LCBYID0gW10sIGxpbWl0ID0gMTI4O1xuICAgIGlmIChzZWVkID09PSAoc2VlZCB8IDApKSB7XG4gICAgICAvLyBOdW1lcmljIHNlZWRzIGluaXRpYWxpemUgdiwgd2hpY2ggaXMgdXNlZCB0byBnZW5lcmF0ZXMgWC5cbiAgICAgIHYgPSBzZWVkO1xuICAgICAgc2VlZCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFN0cmluZyBzZWVkcyBhcmUgbWl4ZWQgaW50byB2IGFuZCBYIG9uZSBjaGFyYWN0ZXIgYXQgYSB0aW1lLlxuICAgICAgc2VlZCA9IHNlZWQgKyAnXFwwJztcbiAgICAgIHYgPSAwO1xuICAgICAgbGltaXQgPSBNYXRoLm1heChsaW1pdCwgc2VlZC5sZW5ndGgpO1xuICAgIH1cbiAgICAvLyBJbml0aWFsaXplIGNpcmN1bGFyIGFycmF5IGFuZCB3ZXlsIHZhbHVlLlxuICAgIGZvciAoaSA9IDAsIGogPSAtMzI7IGogPCBsaW1pdDsgKytqKSB7XG4gICAgICAvLyBQdXQgdGhlIHVuaWNvZGUgY2hhcmFjdGVycyBpbnRvIHRoZSBhcnJheSwgYW5kIHNodWZmbGUgdGhlbS5cbiAgICAgIGlmIChzZWVkKSB2IF49IHNlZWQuY2hhckNvZGVBdCgoaiArIDMyKSAlIHNlZWQubGVuZ3RoKTtcbiAgICAgIC8vIEFmdGVyIDMyIHNodWZmbGVzLCB0YWtlIHYgYXMgdGhlIHN0YXJ0aW5nIHcgdmFsdWUuXG4gICAgICBpZiAoaiA9PT0gMCkgdyA9IHY7XG4gICAgICB2IF49IHYgPDwgMTA7XG4gICAgICB2IF49IHYgPj4+IDE1O1xuICAgICAgdiBePSB2IDw8IDQ7XG4gICAgICB2IF49IHYgPj4+IDEzO1xuICAgICAgaWYgKGogPj0gMCkge1xuICAgICAgICB3ID0gKHcgKyAweDYxYzg4NjQ3KSB8IDA7ICAgICAvLyBXZXlsLlxuICAgICAgICB0ID0gKFhbaiAmIDEyN10gXj0gKHYgKyB3KSk7ICAvLyBDb21iaW5lIHhvciBhbmQgd2V5bCB0byBpbml0IGFycmF5LlxuICAgICAgICBpID0gKDAgPT0gdCkgPyBpICsgMSA6IDA7ICAgICAvLyBDb3VudCB6ZXJvZXMuXG4gICAgICB9XG4gICAgfVxuICAgIC8vIFdlIGhhdmUgZGV0ZWN0ZWQgYWxsIHplcm9lczsgbWFrZSB0aGUga2V5IG5vbnplcm8uXG4gICAgaWYgKGkgPj0gMTI4KSB7XG4gICAgICBYWyhzZWVkICYmIHNlZWQubGVuZ3RoIHx8IDApICYgMTI3XSA9IC0xO1xuICAgIH1cbiAgICAvLyBSdW4gdGhlIGdlbmVyYXRvciA1MTIgdGltZXMgdG8gZnVydGhlciBtaXggdGhlIHN0YXRlIGJlZm9yZSB1c2luZyBpdC5cbiAgICAvLyBGYWN0b3JpbmcgdGhpcyBhcyBhIGZ1bmN0aW9uIHNsb3dzIHRoZSBtYWluIGdlbmVyYXRvciwgc28gaXQgaXMganVzdFxuICAgIC8vIHVucm9sbGVkIGhlcmUuICBUaGUgd2V5bCBnZW5lcmF0b3IgaXMgbm90IGFkdmFuY2VkIHdoaWxlIHdhcm1pbmcgdXAuXG4gICAgaSA9IDEyNztcbiAgICBmb3IgKGogPSA0ICogMTI4OyBqID4gMDsgLS1qKSB7XG4gICAgICB2ID0gWFsoaSArIDM0KSAmIDEyN107XG4gICAgICB0ID0gWFtpID0gKChpICsgMSkgJiAxMjcpXTtcbiAgICAgIHYgXj0gdiA8PCAxMztcbiAgICAgIHQgXj0gdCA8PCAxNztcbiAgICAgIHYgXj0gdiA+Pj4gMTU7XG4gICAgICB0IF49IHQgPj4+IDEyO1xuICAgICAgWFtpXSA9IHYgXiB0O1xuICAgIH1cbiAgICAvLyBTdG9yaW5nIHN0YXRlIGFzIG9iamVjdCBtZW1iZXJzIGlzIGZhc3RlciB0aGFuIHVzaW5nIGNsb3N1cmUgdmFyaWFibGVzLlxuICAgIG1lLncgPSB3O1xuICAgIG1lLlggPSBYO1xuICAgIG1lLmkgPSBpO1xuICB9XG5cbiAgaW5pdChtZSwgc2VlZCk7XG59XG5cbmZ1bmN0aW9uIGNvcHkoZiwgdCkge1xuICB0LmkgPSBmLmk7XG4gIHQudyA9IGYudztcbiAgdC5YID0gZi5YLnNsaWNlKCk7XG4gIHJldHVybiB0O1xufTtcblxuZnVuY3Rpb24gaW1wbChzZWVkLCBvcHRzKSB7XG4gIGlmIChzZWVkID09IG51bGwpIHNlZWQgPSArKG5ldyBEYXRlKTtcbiAgdmFyIHhnID0gbmV3IFhvckdlbihzZWVkKSxcbiAgICAgIHN0YXRlID0gb3B0cyAmJiBvcHRzLnN0YXRlLFxuICAgICAgcHJuZyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gKHhnLm5leHQoKSA+Pj4gMCkgLyAweDEwMDAwMDAwMDsgfTtcbiAgcHJuZy5kb3VibGUgPSBmdW5jdGlvbigpIHtcbiAgICBkbyB7XG4gICAgICB2YXIgdG9wID0geGcubmV4dCgpID4+PiAxMSxcbiAgICAgICAgICBib3QgPSAoeGcubmV4dCgpID4+PiAwKSAvIDB4MTAwMDAwMDAwLFxuICAgICAgICAgIHJlc3VsdCA9ICh0b3AgKyBib3QpIC8gKDEgPDwgMjEpO1xuICAgIH0gd2hpbGUgKHJlc3VsdCA9PT0gMCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgcHJuZy5pbnQzMiA9IHhnLm5leHQ7XG4gIHBybmcucXVpY2sgPSBwcm5nO1xuICBpZiAoc3RhdGUpIHtcbiAgICBpZiAoc3RhdGUuWCkgY29weShzdGF0ZSwgeGcpO1xuICAgIHBybmcuc3RhdGUgPSBmdW5jdGlvbigpIHsgcmV0dXJuIGNvcHkoeGcsIHt9KTsgfVxuICB9XG4gIHJldHVybiBwcm5nO1xufVxuXG5pZiAobW9kdWxlICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gaW1wbDtcbn0gZWxzZSBpZiAoZGVmaW5lICYmIGRlZmluZS5hbWQpIHtcbiAgZGVmaW5lKGZ1bmN0aW9uKCkgeyByZXR1cm4gaW1wbDsgfSk7XG59IGVsc2Uge1xuICB0aGlzLnhvcjQwOTYgPSBpbXBsO1xufVxuXG59KShcbiAgdGhpcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2luZG93IG9iamVjdCBvciBnbG9iYWxcbiAgKHR5cGVvZiBtb2R1bGUpID09ICdvYmplY3QnICYmIG1vZHVsZSwgICAgLy8gcHJlc2VudCBpbiBub2RlLmpzXG4gICh0eXBlb2YgZGVmaW5lKSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZSAgIC8vIHByZXNlbnQgd2l0aCBhbiBBTUQgbG9hZGVyXG4pO1xuIiwiLy8gQSBKYXZhc2NyaXB0IGltcGxlbWVudGFpb24gb2YgdGhlIFwieG9yc2hpZnQ3XCIgYWxnb3JpdGhtIGJ5XG4vLyBGcmFuw6dvaXMgUGFubmV0b24gYW5kIFBpZXJyZSBMJ2VjdXllcjpcbi8vIFwiT24gdGhlIFhvcmdzaGlmdCBSYW5kb20gTnVtYmVyIEdlbmVyYXRvcnNcIlxuLy8gaHR0cDovL3NhbHVjLmVuZ3IudWNvbm4uZWR1L3JlZnMvY3J5cHRvL3JuZy9wYW5uZXRvbjA1b250aGV4b3JzaGlmdC5wZGZcblxuKGZ1bmN0aW9uKGdsb2JhbCwgbW9kdWxlLCBkZWZpbmUpIHtcblxuZnVuY3Rpb24gWG9yR2VuKHNlZWQpIHtcbiAgdmFyIG1lID0gdGhpcztcblxuICAvLyBTZXQgdXAgZ2VuZXJhdG9yIGZ1bmN0aW9uLlxuICBtZS5uZXh0ID0gZnVuY3Rpb24oKSB7XG4gICAgLy8gVXBkYXRlIHhvciBnZW5lcmF0b3IuXG4gICAgdmFyIFggPSBtZS54LCBpID0gbWUuaSwgdCwgdiwgdztcbiAgICB0ID0gWFtpXTsgdCBePSAodCA+Pj4gNyk7IHYgPSB0IF4gKHQgPDwgMjQpO1xuICAgIHQgPSBYWyhpICsgMSkgJiA3XTsgdiBePSB0IF4gKHQgPj4+IDEwKTtcbiAgICB0ID0gWFsoaSArIDMpICYgN107IHYgXj0gdCBeICh0ID4+PiAzKTtcbiAgICB0ID0gWFsoaSArIDQpICYgN107IHYgXj0gdCBeICh0IDw8IDcpO1xuICAgIHQgPSBYWyhpICsgNykgJiA3XTsgdCA9IHQgXiAodCA8PCAxMyk7IHYgXj0gdCBeICh0IDw8IDkpO1xuICAgIFhbaV0gPSB2O1xuICAgIG1lLmkgPSAoaSArIDEpICYgNztcbiAgICByZXR1cm4gdjtcbiAgfTtcblxuICBmdW5jdGlvbiBpbml0KG1lLCBzZWVkKSB7XG4gICAgdmFyIGosIHcsIFggPSBbXTtcblxuICAgIGlmIChzZWVkID09PSAoc2VlZCB8IDApKSB7XG4gICAgICAvLyBTZWVkIHN0YXRlIGFycmF5IHVzaW5nIGEgMzItYml0IGludGVnZXIuXG4gICAgICB3ID0gWFswXSA9IHNlZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNlZWQgc3RhdGUgdXNpbmcgYSBzdHJpbmcuXG4gICAgICBzZWVkID0gJycgKyBzZWVkO1xuICAgICAgZm9yIChqID0gMDsgaiA8IHNlZWQubGVuZ3RoOyArK2opIHtcbiAgICAgICAgWFtqICYgN10gPSAoWFtqICYgN10gPDwgMTUpIF5cbiAgICAgICAgICAgIChzZWVkLmNoYXJDb2RlQXQoaikgKyBYWyhqICsgMSkgJiA3XSA8PCAxMyk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEVuZm9yY2UgYW4gYXJyYXkgbGVuZ3RoIG9mIDgsIG5vdCBhbGwgemVyb2VzLlxuICAgIHdoaWxlIChYLmxlbmd0aCA8IDgpIFgucHVzaCgwKTtcbiAgICBmb3IgKGogPSAwOyBqIDwgOCAmJiBYW2pdID09PSAwOyArK2opO1xuICAgIGlmIChqID09IDgpIHcgPSBYWzddID0gLTE7IGVsc2UgdyA9IFhbal07XG5cbiAgICBtZS54ID0gWDtcbiAgICBtZS5pID0gMDtcblxuICAgIC8vIERpc2NhcmQgYW4gaW5pdGlhbCAyNTYgdmFsdWVzLlxuICAgIGZvciAoaiA9IDI1NjsgaiA+IDA7IC0taikge1xuICAgICAgbWUubmV4dCgpO1xuICAgIH1cbiAgfVxuXG4gIGluaXQobWUsIHNlZWQpO1xufVxuXG5mdW5jdGlvbiBjb3B5KGYsIHQpIHtcbiAgdC54ID0gZi54LnNsaWNlKCk7XG4gIHQuaSA9IGYuaTtcbiAgcmV0dXJuIHQ7XG59XG5cbmZ1bmN0aW9uIGltcGwoc2VlZCwgb3B0cykge1xuICBpZiAoc2VlZCA9PSBudWxsKSBzZWVkID0gKyhuZXcgRGF0ZSk7XG4gIHZhciB4ZyA9IG5ldyBYb3JHZW4oc2VlZCksXG4gICAgICBzdGF0ZSA9IG9wdHMgJiYgb3B0cy5zdGF0ZSxcbiAgICAgIHBybmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuICh4Zy5uZXh0KCkgPj4+IDApIC8gMHgxMDAwMDAwMDA7IH07XG4gIHBybmcuZG91YmxlID0gZnVuY3Rpb24oKSB7XG4gICAgZG8ge1xuICAgICAgdmFyIHRvcCA9IHhnLm5leHQoKSA+Pj4gMTEsXG4gICAgICAgICAgYm90ID0gKHhnLm5leHQoKSA+Pj4gMCkgLyAweDEwMDAwMDAwMCxcbiAgICAgICAgICByZXN1bHQgPSAodG9wICsgYm90KSAvICgxIDw8IDIxKTtcbiAgICB9IHdoaWxlIChyZXN1bHQgPT09IDApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIHBybmcuaW50MzIgPSB4Zy5uZXh0O1xuICBwcm5nLnF1aWNrID0gcHJuZztcbiAgaWYgKHN0YXRlKSB7XG4gICAgaWYgKHN0YXRlLngpIGNvcHkoc3RhdGUsIHhnKTtcbiAgICBwcm5nLnN0YXRlID0gZnVuY3Rpb24oKSB7IHJldHVybiBjb3B5KHhnLCB7fSk7IH1cbiAgfVxuICByZXR1cm4gcHJuZztcbn1cblxuaWYgKG1vZHVsZSAmJiBtb2R1bGUuZXhwb3J0cykge1xuICBtb2R1bGUuZXhwb3J0cyA9IGltcGw7XG59IGVsc2UgaWYgKGRlZmluZSAmJiBkZWZpbmUuYW1kKSB7XG4gIGRlZmluZShmdW5jdGlvbigpIHsgcmV0dXJuIGltcGw7IH0pO1xufSBlbHNlIHtcbiAgdGhpcy54b3JzaGlmdDcgPSBpbXBsO1xufVxuXG59KShcbiAgdGhpcyxcbiAgKHR5cGVvZiBtb2R1bGUpID09ICdvYmplY3QnICYmIG1vZHVsZSwgICAgLy8gcHJlc2VudCBpbiBub2RlLmpzXG4gICh0eXBlb2YgZGVmaW5lKSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZSAgIC8vIHByZXNlbnQgd2l0aCBhbiBBTUQgbG9hZGVyXG4pO1xuXG4iLCIvLyBBIEphdmFzY3JpcHQgaW1wbGVtZW50YWlvbiBvZiB0aGUgXCJ4b3J3b3dcIiBwcm5nIGFsZ29yaXRobSBieVxuLy8gR2VvcmdlIE1hcnNhZ2xpYS4gIFNlZSBodHRwOi8vd3d3LmpzdGF0c29mdC5vcmcvdjA4L2kxNC9wYXBlclxuXG4oZnVuY3Rpb24oZ2xvYmFsLCBtb2R1bGUsIGRlZmluZSkge1xuXG5mdW5jdGlvbiBYb3JHZW4oc2VlZCkge1xuICB2YXIgbWUgPSB0aGlzLCBzdHJzZWVkID0gJyc7XG5cbiAgLy8gU2V0IHVwIGdlbmVyYXRvciBmdW5jdGlvbi5cbiAgbWUubmV4dCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0ID0gKG1lLnggXiAobWUueCA+Pj4gMikpO1xuICAgIG1lLnggPSBtZS55OyBtZS55ID0gbWUuejsgbWUueiA9IG1lLnc7IG1lLncgPSBtZS52O1xuICAgIHJldHVybiAobWUuZCA9IChtZS5kICsgMzYyNDM3IHwgMCkpICtcbiAgICAgICAobWUudiA9IChtZS52IF4gKG1lLnYgPDwgNCkpIF4gKHQgXiAodCA8PCAxKSkpIHwgMDtcbiAgfTtcblxuICBtZS54ID0gMDtcbiAgbWUueSA9IDA7XG4gIG1lLnogPSAwO1xuICBtZS53ID0gMDtcbiAgbWUudiA9IDA7XG5cbiAgaWYgKHNlZWQgPT09IChzZWVkIHwgMCkpIHtcbiAgICAvLyBJbnRlZ2VyIHNlZWQuXG4gICAgbWUueCA9IHNlZWQ7XG4gIH0gZWxzZSB7XG4gICAgLy8gU3RyaW5nIHNlZWQuXG4gICAgc3Ryc2VlZCArPSBzZWVkO1xuICB9XG5cbiAgLy8gTWl4IGluIHN0cmluZyBzZWVkLCB0aGVuIGRpc2NhcmQgYW4gaW5pdGlhbCBiYXRjaCBvZiA2NCB2YWx1ZXMuXG4gIGZvciAodmFyIGsgPSAwOyBrIDwgc3Ryc2VlZC5sZW5ndGggKyA2NDsgaysrKSB7XG4gICAgbWUueCBePSBzdHJzZWVkLmNoYXJDb2RlQXQoaykgfCAwO1xuICAgIGlmIChrID09IHN0cnNlZWQubGVuZ3RoKSB7XG4gICAgICBtZS5kID0gbWUueCA8PCAxMCBeIG1lLnggPj4+IDQ7XG4gICAgfVxuICAgIG1lLm5leHQoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb3B5KGYsIHQpIHtcbiAgdC54ID0gZi54O1xuICB0LnkgPSBmLnk7XG4gIHQueiA9IGYuejtcbiAgdC53ID0gZi53O1xuICB0LnYgPSBmLnY7XG4gIHQuZCA9IGYuZDtcbiAgcmV0dXJuIHQ7XG59XG5cbmZ1bmN0aW9uIGltcGwoc2VlZCwgb3B0cykge1xuICB2YXIgeGcgPSBuZXcgWG9yR2VuKHNlZWQpLFxuICAgICAgc3RhdGUgPSBvcHRzICYmIG9wdHMuc3RhdGUsXG4gICAgICBwcm5nID0gZnVuY3Rpb24oKSB7IHJldHVybiAoeGcubmV4dCgpID4+PiAwKSAvIDB4MTAwMDAwMDAwOyB9O1xuICBwcm5nLmRvdWJsZSA9IGZ1bmN0aW9uKCkge1xuICAgIGRvIHtcbiAgICAgIHZhciB0b3AgPSB4Zy5uZXh0KCkgPj4+IDExLFxuICAgICAgICAgIGJvdCA9ICh4Zy5uZXh0KCkgPj4+IDApIC8gMHgxMDAwMDAwMDAsXG4gICAgICAgICAgcmVzdWx0ID0gKHRvcCArIGJvdCkgLyAoMSA8PCAyMSk7XG4gICAgfSB3aGlsZSAocmVzdWx0ID09PSAwKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICBwcm5nLmludDMyID0geGcubmV4dDtcbiAgcHJuZy5xdWljayA9IHBybmc7XG4gIGlmIChzdGF0ZSkge1xuICAgIGlmICh0eXBlb2Yoc3RhdGUpID09ICdvYmplY3QnKSBjb3B5KHN0YXRlLCB4Zyk7XG4gICAgcHJuZy5zdGF0ZSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gY29weSh4Zywge30pOyB9XG4gIH1cbiAgcmV0dXJuIHBybmc7XG59XG5cbmlmIChtb2R1bGUgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBpbXBsO1xufSBlbHNlIGlmIChkZWZpbmUgJiYgZGVmaW5lLmFtZCkge1xuICBkZWZpbmUoZnVuY3Rpb24oKSB7IHJldHVybiBpbXBsOyB9KTtcbn0gZWxzZSB7XG4gIHRoaXMueG9yd293ID0gaW1wbDtcbn1cblxufSkoXG4gIHRoaXMsXG4gICh0eXBlb2YgbW9kdWxlKSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUsICAgIC8vIHByZXNlbnQgaW4gbm9kZS5qc1xuICAodHlwZW9mIGRlZmluZSkgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUgICAvLyBwcmVzZW50IHdpdGggYW4gQU1EIGxvYWRlclxuKTtcblxuXG4iLCIvKlxuQ29weXJpZ2h0IDIwMTQgRGF2aWQgQmF1LlxuXG5QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmdcbmEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG53aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG5kaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG9cbnBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0b1xudGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG5UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZVxuaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsXG5FWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbk1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC5cbklOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZXG5DTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULFxuVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEVcblNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4qL1xuXG4oZnVuY3Rpb24gKHBvb2wsIG1hdGgpIHtcbi8vXG4vLyBUaGUgZm9sbG93aW5nIGNvbnN0YW50cyBhcmUgcmVsYXRlZCB0byBJRUVFIDc1NCBsaW1pdHMuXG4vL1xudmFyIGdsb2JhbCA9IHRoaXMsXG4gICAgd2lkdGggPSAyNTYsICAgICAgICAvLyBlYWNoIFJDNCBvdXRwdXQgaXMgMCA8PSB4IDwgMjU2XG4gICAgY2h1bmtzID0gNiwgICAgICAgICAvLyBhdCBsZWFzdCBzaXggUkM0IG91dHB1dHMgZm9yIGVhY2ggZG91YmxlXG4gICAgZGlnaXRzID0gNTIsICAgICAgICAvLyB0aGVyZSBhcmUgNTIgc2lnbmlmaWNhbnQgZGlnaXRzIGluIGEgZG91YmxlXG4gICAgcm5nbmFtZSA9ICdyYW5kb20nLCAvLyBybmduYW1lOiBuYW1lIGZvciBNYXRoLnJhbmRvbSBhbmQgTWF0aC5zZWVkcmFuZG9tXG4gICAgc3RhcnRkZW5vbSA9IG1hdGgucG93KHdpZHRoLCBjaHVua3MpLFxuICAgIHNpZ25pZmljYW5jZSA9IG1hdGgucG93KDIsIGRpZ2l0cyksXG4gICAgb3ZlcmZsb3cgPSBzaWduaWZpY2FuY2UgKiAyLFxuICAgIG1hc2sgPSB3aWR0aCAtIDEsXG4gICAgbm9kZWNyeXB0bzsgICAgICAgICAvLyBub2RlLmpzIGNyeXB0byBtb2R1bGUsIGluaXRpYWxpemVkIGF0IHRoZSBib3R0b20uXG5cbi8vXG4vLyBzZWVkcmFuZG9tKClcbi8vIFRoaXMgaXMgdGhlIHNlZWRyYW5kb20gZnVuY3Rpb24gZGVzY3JpYmVkIGFib3ZlLlxuLy9cbmZ1bmN0aW9uIHNlZWRyYW5kb20oc2VlZCwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgdmFyIGtleSA9IFtdO1xuICBvcHRpb25zID0gKG9wdGlvbnMgPT0gdHJ1ZSkgPyB7IGVudHJvcHk6IHRydWUgfSA6IChvcHRpb25zIHx8IHt9KTtcblxuICAvLyBGbGF0dGVuIHRoZSBzZWVkIHN0cmluZyBvciBidWlsZCBvbmUgZnJvbSBsb2NhbCBlbnRyb3B5IGlmIG5lZWRlZC5cbiAgdmFyIHNob3J0c2VlZCA9IG1peGtleShmbGF0dGVuKFxuICAgIG9wdGlvbnMuZW50cm9weSA/IFtzZWVkLCB0b3N0cmluZyhwb29sKV0gOlxuICAgIChzZWVkID09IG51bGwpID8gYXV0b3NlZWQoKSA6IHNlZWQsIDMpLCBrZXkpO1xuXG4gIC8vIFVzZSB0aGUgc2VlZCB0byBpbml0aWFsaXplIGFuIEFSQzQgZ2VuZXJhdG9yLlxuICB2YXIgYXJjNCA9IG5ldyBBUkM0KGtleSk7XG5cbiAgLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcmFuZG9tIGRvdWJsZSBpbiBbMCwgMSkgdGhhdCBjb250YWluc1xuICAvLyByYW5kb21uZXNzIGluIGV2ZXJ5IGJpdCBvZiB0aGUgbWFudGlzc2Egb2YgdGhlIElFRUUgNzU0IHZhbHVlLlxuICB2YXIgcHJuZyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBuID0gYXJjNC5nKGNodW5rcyksICAgICAgICAgICAgIC8vIFN0YXJ0IHdpdGggYSBudW1lcmF0b3IgbiA8IDIgXiA0OFxuICAgICAgICBkID0gc3RhcnRkZW5vbSwgICAgICAgICAgICAgICAgIC8vICAgYW5kIGRlbm9taW5hdG9yIGQgPSAyIF4gNDguXG4gICAgICAgIHggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBhbmQgbm8gJ2V4dHJhIGxhc3QgYnl0ZScuXG4gICAgd2hpbGUgKG4gPCBzaWduaWZpY2FuY2UpIHsgICAgICAgICAgLy8gRmlsbCB1cCBhbGwgc2lnbmlmaWNhbnQgZGlnaXRzIGJ5XG4gICAgICBuID0gKG4gKyB4KSAqIHdpZHRoOyAgICAgICAgICAgICAgLy8gICBzaGlmdGluZyBudW1lcmF0b3IgYW5kXG4gICAgICBkICo9IHdpZHRoOyAgICAgICAgICAgICAgICAgICAgICAgLy8gICBkZW5vbWluYXRvciBhbmQgZ2VuZXJhdGluZyBhXG4gICAgICB4ID0gYXJjNC5nKDEpOyAgICAgICAgICAgICAgICAgICAgLy8gICBuZXcgbGVhc3Qtc2lnbmlmaWNhbnQtYnl0ZS5cbiAgICB9XG4gICAgd2hpbGUgKG4gPj0gb3ZlcmZsb3cpIHsgICAgICAgICAgICAgLy8gVG8gYXZvaWQgcm91bmRpbmcgdXAsIGJlZm9yZSBhZGRpbmdcbiAgICAgIG4gLz0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGxhc3QgYnl0ZSwgc2hpZnQgZXZlcnl0aGluZ1xuICAgICAgZCAvPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgcmlnaHQgdXNpbmcgaW50ZWdlciBtYXRoIHVudGlsXG4gICAgICB4ID4+Pj0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICB3ZSBoYXZlIGV4YWN0bHkgdGhlIGRlc2lyZWQgYml0cy5cbiAgICB9XG4gICAgcmV0dXJuIChuICsgeCkgLyBkOyAgICAgICAgICAgICAgICAgLy8gRm9ybSB0aGUgbnVtYmVyIHdpdGhpbiBbMCwgMSkuXG4gIH07XG5cbiAgcHJuZy5pbnQzMiA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJjNC5nKDQpIHwgMDsgfVxuICBwcm5nLnF1aWNrID0gZnVuY3Rpb24oKSB7IHJldHVybiBhcmM0LmcoNCkgLyAweDEwMDAwMDAwMDsgfVxuICBwcm5nLmRvdWJsZSA9IHBybmc7XG5cbiAgLy8gTWl4IHRoZSByYW5kb21uZXNzIGludG8gYWNjdW11bGF0ZWQgZW50cm9weS5cbiAgbWl4a2V5KHRvc3RyaW5nKGFyYzQuUyksIHBvb2wpO1xuXG4gIC8vIENhbGxpbmcgY29udmVudGlvbjogd2hhdCB0byByZXR1cm4gYXMgYSBmdW5jdGlvbiBvZiBwcm5nLCBzZWVkLCBpc19tYXRoLlxuICByZXR1cm4gKG9wdGlvbnMucGFzcyB8fCBjYWxsYmFjayB8fFxuICAgICAgZnVuY3Rpb24ocHJuZywgc2VlZCwgaXNfbWF0aF9jYWxsLCBzdGF0ZSkge1xuICAgICAgICBpZiAoc3RhdGUpIHtcbiAgICAgICAgICAvLyBMb2FkIHRoZSBhcmM0IHN0YXRlIGZyb20gdGhlIGdpdmVuIHN0YXRlIGlmIGl0IGhhcyBhbiBTIGFycmF5LlxuICAgICAgICAgIGlmIChzdGF0ZS5TKSB7IGNvcHkoc3RhdGUsIGFyYzQpOyB9XG4gICAgICAgICAgLy8gT25seSBwcm92aWRlIHRoZSAuc3RhdGUgbWV0aG9kIGlmIHJlcXVlc3RlZCB2aWEgb3B0aW9ucy5zdGF0ZS5cbiAgICAgICAgICBwcm5nLnN0YXRlID0gZnVuY3Rpb24oKSB7IHJldHVybiBjb3B5KGFyYzQsIHt9KTsgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgY2FsbGVkIGFzIGEgbWV0aG9kIG9mIE1hdGggKE1hdGguc2VlZHJhbmRvbSgpKSwgbXV0YXRlXG4gICAgICAgIC8vIE1hdGgucmFuZG9tIGJlY2F1c2UgdGhhdCBpcyBob3cgc2VlZHJhbmRvbS5qcyBoYXMgd29ya2VkIHNpbmNlIHYxLjAuXG4gICAgICAgIGlmIChpc19tYXRoX2NhbGwpIHsgbWF0aFtybmduYW1lXSA9IHBybmc7IHJldHVybiBzZWVkOyB9XG5cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCBpdCBpcyBhIG5ld2VyIGNhbGxpbmcgY29udmVudGlvbiwgc28gcmV0dXJuIHRoZVxuICAgICAgICAvLyBwcm5nIGRpcmVjdGx5LlxuICAgICAgICBlbHNlIHJldHVybiBwcm5nO1xuICAgICAgfSkoXG4gIHBybmcsXG4gIHNob3J0c2VlZCxcbiAgJ2dsb2JhbCcgaW4gb3B0aW9ucyA/IG9wdGlvbnMuZ2xvYmFsIDogKHRoaXMgPT0gbWF0aCksXG4gIG9wdGlvbnMuc3RhdGUpO1xufVxubWF0aFsnc2VlZCcgKyBybmduYW1lXSA9IHNlZWRyYW5kb207XG5cbi8vXG4vLyBBUkM0XG4vL1xuLy8gQW4gQVJDNCBpbXBsZW1lbnRhdGlvbi4gIFRoZSBjb25zdHJ1Y3RvciB0YWtlcyBhIGtleSBpbiB0aGUgZm9ybSBvZlxuLy8gYW4gYXJyYXkgb2YgYXQgbW9zdCAod2lkdGgpIGludGVnZXJzIHRoYXQgc2hvdWxkIGJlIDAgPD0geCA8ICh3aWR0aCkuXG4vL1xuLy8gVGhlIGcoY291bnQpIG1ldGhvZCByZXR1cm5zIGEgcHNldWRvcmFuZG9tIGludGVnZXIgdGhhdCBjb25jYXRlbmF0ZXNcbi8vIHRoZSBuZXh0IChjb3VudCkgb3V0cHV0cyBmcm9tIEFSQzQuICBJdHMgcmV0dXJuIHZhbHVlIGlzIGEgbnVtYmVyIHhcbi8vIHRoYXQgaXMgaW4gdGhlIHJhbmdlIDAgPD0geCA8ICh3aWR0aCBeIGNvdW50KS5cbi8vXG5mdW5jdGlvbiBBUkM0KGtleSkge1xuICB2YXIgdCwga2V5bGVuID0ga2V5Lmxlbmd0aCxcbiAgICAgIG1lID0gdGhpcywgaSA9IDAsIGogPSBtZS5pID0gbWUuaiA9IDAsIHMgPSBtZS5TID0gW107XG5cbiAgLy8gVGhlIGVtcHR5IGtleSBbXSBpcyB0cmVhdGVkIGFzIFswXS5cbiAgaWYgKCFrZXlsZW4pIHsga2V5ID0gW2tleWxlbisrXTsgfVxuXG4gIC8vIFNldCB1cCBTIHVzaW5nIHRoZSBzdGFuZGFyZCBrZXkgc2NoZWR1bGluZyBhbGdvcml0aG0uXG4gIHdoaWxlIChpIDwgd2lkdGgpIHtcbiAgICBzW2ldID0gaSsrO1xuICB9XG4gIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7XG4gICAgc1tpXSA9IHNbaiA9IG1hc2sgJiAoaiArIGtleVtpICUga2V5bGVuXSArICh0ID0gc1tpXSkpXTtcbiAgICBzW2pdID0gdDtcbiAgfVxuXG4gIC8vIFRoZSBcImdcIiBtZXRob2QgcmV0dXJucyB0aGUgbmV4dCAoY291bnQpIG91dHB1dHMgYXMgb25lIG51bWJlci5cbiAgKG1lLmcgPSBmdW5jdGlvbihjb3VudCkge1xuICAgIC8vIFVzaW5nIGluc3RhbmNlIG1lbWJlcnMgaW5zdGVhZCBvZiBjbG9zdXJlIHN0YXRlIG5lYXJseSBkb3VibGVzIHNwZWVkLlxuICAgIHZhciB0LCByID0gMCxcbiAgICAgICAgaSA9IG1lLmksIGogPSBtZS5qLCBzID0gbWUuUztcbiAgICB3aGlsZSAoY291bnQtLSkge1xuICAgICAgdCA9IHNbaSA9IG1hc2sgJiAoaSArIDEpXTtcbiAgICAgIHIgPSByICogd2lkdGggKyBzW21hc2sgJiAoKHNbaV0gPSBzW2ogPSBtYXNrICYgKGogKyB0KV0pICsgKHNbal0gPSB0KSldO1xuICAgIH1cbiAgICBtZS5pID0gaTsgbWUuaiA9IGo7XG4gICAgcmV0dXJuIHI7XG4gICAgLy8gRm9yIHJvYnVzdCB1bnByZWRpY3RhYmlsaXR5LCB0aGUgZnVuY3Rpb24gY2FsbCBiZWxvdyBhdXRvbWF0aWNhbGx5XG4gICAgLy8gZGlzY2FyZHMgYW4gaW5pdGlhbCBiYXRjaCBvZiB2YWx1ZXMuICBUaGlzIGlzIGNhbGxlZCBSQzQtZHJvcFsyNTZdLlxuICAgIC8vIFNlZSBodHRwOi8vZ29vZ2xlLmNvbS9zZWFyY2g/cT1yc2ErZmx1aHJlcityZXNwb25zZSZidG5JXG4gIH0pKHdpZHRoKTtcbn1cblxuLy9cbi8vIGNvcHkoKVxuLy8gQ29waWVzIGludGVybmFsIHN0YXRlIG9mIEFSQzQgdG8gb3IgZnJvbSBhIHBsYWluIG9iamVjdC5cbi8vXG5mdW5jdGlvbiBjb3B5KGYsIHQpIHtcbiAgdC5pID0gZi5pO1xuICB0LmogPSBmLmo7XG4gIHQuUyA9IGYuUy5zbGljZSgpO1xuICByZXR1cm4gdDtcbn07XG5cbi8vXG4vLyBmbGF0dGVuKClcbi8vIENvbnZlcnRzIGFuIG9iamVjdCB0cmVlIHRvIG5lc3RlZCBhcnJheXMgb2Ygc3RyaW5ncy5cbi8vXG5mdW5jdGlvbiBmbGF0dGVuKG9iaiwgZGVwdGgpIHtcbiAgdmFyIHJlc3VsdCA9IFtdLCB0eXAgPSAodHlwZW9mIG9iaiksIHByb3A7XG4gIGlmIChkZXB0aCAmJiB0eXAgPT0gJ29iamVjdCcpIHtcbiAgICBmb3IgKHByb3AgaW4gb2JqKSB7XG4gICAgICB0cnkgeyByZXN1bHQucHVzaChmbGF0dGVuKG9ialtwcm9wXSwgZGVwdGggLSAxKSk7IH0gY2F0Y2ggKGUpIHt9XG4gICAgfVxuICB9XG4gIHJldHVybiAocmVzdWx0Lmxlbmd0aCA/IHJlc3VsdCA6IHR5cCA9PSAnc3RyaW5nJyA/IG9iaiA6IG9iaiArICdcXDAnKTtcbn1cblxuLy9cbi8vIG1peGtleSgpXG4vLyBNaXhlcyBhIHN0cmluZyBzZWVkIGludG8gYSBrZXkgdGhhdCBpcyBhbiBhcnJheSBvZiBpbnRlZ2VycywgYW5kXG4vLyByZXR1cm5zIGEgc2hvcnRlbmVkIHN0cmluZyBzZWVkIHRoYXQgaXMgZXF1aXZhbGVudCB0byB0aGUgcmVzdWx0IGtleS5cbi8vXG5mdW5jdGlvbiBtaXhrZXkoc2VlZCwga2V5KSB7XG4gIHZhciBzdHJpbmdzZWVkID0gc2VlZCArICcnLCBzbWVhciwgaiA9IDA7XG4gIHdoaWxlIChqIDwgc3RyaW5nc2VlZC5sZW5ndGgpIHtcbiAgICBrZXlbbWFzayAmIGpdID1cbiAgICAgIG1hc2sgJiAoKHNtZWFyIF49IGtleVttYXNrICYgal0gKiAxOSkgKyBzdHJpbmdzZWVkLmNoYXJDb2RlQXQoaisrKSk7XG4gIH1cbiAgcmV0dXJuIHRvc3RyaW5nKGtleSk7XG59XG5cbi8vXG4vLyBhdXRvc2VlZCgpXG4vLyBSZXR1cm5zIGFuIG9iamVjdCBmb3IgYXV0b3NlZWRpbmcsIHVzaW5nIHdpbmRvdy5jcnlwdG8gYW5kIE5vZGUgY3J5cHRvXG4vLyBtb2R1bGUgaWYgYXZhaWxhYmxlLlxuLy9cbmZ1bmN0aW9uIGF1dG9zZWVkKCkge1xuICB0cnkge1xuICAgIHZhciBvdXQ7XG4gICAgaWYgKG5vZGVjcnlwdG8gJiYgKG91dCA9IG5vZGVjcnlwdG8ucmFuZG9tQnl0ZXMpKSB7XG4gICAgICAvLyBUaGUgdXNlIG9mICdvdXQnIHRvIHJlbWVtYmVyIHJhbmRvbUJ5dGVzIG1ha2VzIHRpZ2h0IG1pbmlmaWVkIGNvZGUuXG4gICAgICBvdXQgPSBvdXQod2lkdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgPSBuZXcgVWludDhBcnJheSh3aWR0aCk7XG4gICAgICAoZ2xvYmFsLmNyeXB0byB8fCBnbG9iYWwubXNDcnlwdG8pLmdldFJhbmRvbVZhbHVlcyhvdXQpO1xuICAgIH1cbiAgICByZXR1cm4gdG9zdHJpbmcob3V0KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHZhciBicm93c2VyID0gZ2xvYmFsLm5hdmlnYXRvcixcbiAgICAgICAgcGx1Z2lucyA9IGJyb3dzZXIgJiYgYnJvd3Nlci5wbHVnaW5zO1xuICAgIHJldHVybiBbK25ldyBEYXRlLCBnbG9iYWwsIHBsdWdpbnMsIGdsb2JhbC5zY3JlZW4sIHRvc3RyaW5nKHBvb2wpXTtcbiAgfVxufVxuXG4vL1xuLy8gdG9zdHJpbmcoKVxuLy8gQ29udmVydHMgYW4gYXJyYXkgb2YgY2hhcmNvZGVzIHRvIGEgc3RyaW5nXG4vL1xuZnVuY3Rpb24gdG9zdHJpbmcoYSkge1xuICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseSgwLCBhKTtcbn1cblxuLy9cbi8vIFdoZW4gc2VlZHJhbmRvbS5qcyBpcyBsb2FkZWQsIHdlIGltbWVkaWF0ZWx5IG1peCBhIGZldyBiaXRzXG4vLyBmcm9tIHRoZSBidWlsdC1pbiBSTkcgaW50byB0aGUgZW50cm9weSBwb29sLiAgQmVjYXVzZSB3ZSBkb1xuLy8gbm90IHdhbnQgdG8gaW50ZXJmZXJlIHdpdGggZGV0ZXJtaW5pc3RpYyBQUk5HIHN0YXRlIGxhdGVyLFxuLy8gc2VlZHJhbmRvbSB3aWxsIG5vdCBjYWxsIG1hdGgucmFuZG9tIG9uIGl0cyBvd24gYWdhaW4gYWZ0ZXJcbi8vIGluaXRpYWxpemF0aW9uLlxuLy9cbm1peGtleShtYXRoLnJhbmRvbSgpLCBwb29sKTtcblxuLy9cbi8vIE5vZGVqcyBhbmQgQU1EIHN1cHBvcnQ6IGV4cG9ydCB0aGUgaW1wbGVtZW50YXRpb24gYXMgYSBtb2R1bGUgdXNpbmdcbi8vIGVpdGhlciBjb252ZW50aW9uLlxuLy9cbmlmICgodHlwZW9mIG1vZHVsZSkgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBzZWVkcmFuZG9tO1xuICAvLyBXaGVuIGluIG5vZGUuanMsIHRyeSB1c2luZyBjcnlwdG8gcGFja2FnZSBmb3IgYXV0b3NlZWRpbmcuXG4gIHRyeSB7XG4gICAgbm9kZWNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuICB9IGNhdGNoIChleCkge31cbn0gZWxzZSBpZiAoKHR5cGVvZiBkZWZpbmUpID09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICBkZWZpbmUoZnVuY3Rpb24oKSB7IHJldHVybiBzZWVkcmFuZG9tOyB9KTtcbn1cblxuLy8gRW5kIGFub255bW91cyBzY29wZSwgYW5kIHBhc3MgaW5pdGlhbCB2YWx1ZXMuXG59KShcbiAgW10sICAgICAvLyBwb29sOiBlbnRyb3B5IHBvb2wgc3RhcnRzIGVtcHR5XG4gIE1hdGggICAgLy8gbWF0aDogcGFja2FnZSBjb250YWluaW5nIHJhbmRvbSwgcG93LCBhbmQgc2VlZHJhbmRvbVxuKTtcbiIsIihmdW5jdGlvbiAoZ2xvYmFsLCB1bmRlZmluZWQpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIGlmIChnbG9iYWwuc2V0SW1tZWRpYXRlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgbmV4dEhhbmRsZSA9IDE7IC8vIFNwZWMgc2F5cyBncmVhdGVyIHRoYW4gemVyb1xuICAgIHZhciB0YXNrc0J5SGFuZGxlID0ge307XG4gICAgdmFyIGN1cnJlbnRseVJ1bm5pbmdBVGFzayA9IGZhbHNlO1xuICAgIHZhciBkb2MgPSBnbG9iYWwuZG9jdW1lbnQ7XG4gICAgdmFyIHJlZ2lzdGVySW1tZWRpYXRlO1xuXG4gICAgZnVuY3Rpb24gc2V0SW1tZWRpYXRlKGNhbGxiYWNrKSB7XG4gICAgICAvLyBDYWxsYmFjayBjYW4gZWl0aGVyIGJlIGEgZnVuY3Rpb24gb3IgYSBzdHJpbmdcbiAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBjYWxsYmFjayA9IG5ldyBGdW5jdGlvbihcIlwiICsgY2FsbGJhY2spO1xuICAgICAgfVxuICAgICAgLy8gQ29weSBmdW5jdGlvbiBhcmd1bWVudHNcbiAgICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGFyZ3NbaV0gPSBhcmd1bWVudHNbaSArIDFdO1xuICAgICAgfVxuICAgICAgLy8gU3RvcmUgYW5kIHJlZ2lzdGVyIHRoZSB0YXNrXG4gICAgICB2YXIgdGFzayA9IHsgY2FsbGJhY2s6IGNhbGxiYWNrLCBhcmdzOiBhcmdzIH07XG4gICAgICB0YXNrc0J5SGFuZGxlW25leHRIYW5kbGVdID0gdGFzaztcbiAgICAgIHJlZ2lzdGVySW1tZWRpYXRlKG5leHRIYW5kbGUpO1xuICAgICAgcmV0dXJuIG5leHRIYW5kbGUrKztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbGVhckltbWVkaWF0ZShoYW5kbGUpIHtcbiAgICAgICAgZGVsZXRlIHRhc2tzQnlIYW5kbGVbaGFuZGxlXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBydW4odGFzaykge1xuICAgICAgICB2YXIgY2FsbGJhY2sgPSB0YXNrLmNhbGxiYWNrO1xuICAgICAgICB2YXIgYXJncyA9IHRhc2suYXJncztcbiAgICAgICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIGNhbGxiYWNrKGFyZ3NbMF0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIGNhbGxiYWNrKGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIGNhbGxiYWNrKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBjYWxsYmFjay5hcHBseSh1bmRlZmluZWQsIGFyZ3MpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBydW5JZlByZXNlbnQoaGFuZGxlKSB7XG4gICAgICAgIC8vIEZyb20gdGhlIHNwZWM6IFwiV2FpdCB1bnRpbCBhbnkgaW52b2NhdGlvbnMgb2YgdGhpcyBhbGdvcml0aG0gc3RhcnRlZCBiZWZvcmUgdGhpcyBvbmUgaGF2ZSBjb21wbGV0ZWQuXCJcbiAgICAgICAgLy8gU28gaWYgd2UncmUgY3VycmVudGx5IHJ1bm5pbmcgYSB0YXNrLCB3ZSdsbCBuZWVkIHRvIGRlbGF5IHRoaXMgaW52b2NhdGlvbi5cbiAgICAgICAgaWYgKGN1cnJlbnRseVJ1bm5pbmdBVGFzaykge1xuICAgICAgICAgICAgLy8gRGVsYXkgYnkgZG9pbmcgYSBzZXRUaW1lb3V0LiBzZXRJbW1lZGlhdGUgd2FzIHRyaWVkIGluc3RlYWQsIGJ1dCBpbiBGaXJlZm94IDcgaXQgZ2VuZXJhdGVkIGFcbiAgICAgICAgICAgIC8vIFwidG9vIG11Y2ggcmVjdXJzaW9uXCIgZXJyb3IuXG4gICAgICAgICAgICBzZXRUaW1lb3V0KHJ1bklmUHJlc2VudCwgMCwgaGFuZGxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciB0YXNrID0gdGFza3NCeUhhbmRsZVtoYW5kbGVdO1xuICAgICAgICAgICAgaWYgKHRhc2spIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50bHlSdW5uaW5nQVRhc2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJ1bih0YXNrKTtcbiAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICBjbGVhckltbWVkaWF0ZShoYW5kbGUpO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50bHlSdW5uaW5nQVRhc2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsTmV4dFRpY2tJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkgeyBydW5JZlByZXNlbnQoaGFuZGxlKTsgfSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2FuVXNlUG9zdE1lc3NhZ2UoKSB7XG4gICAgICAgIC8vIFRoZSB0ZXN0IGFnYWluc3QgYGltcG9ydFNjcmlwdHNgIHByZXZlbnRzIHRoaXMgaW1wbGVtZW50YXRpb24gZnJvbSBiZWluZyBpbnN0YWxsZWQgaW5zaWRlIGEgd2ViIHdvcmtlcixcbiAgICAgICAgLy8gd2hlcmUgYGdsb2JhbC5wb3N0TWVzc2FnZWAgbWVhbnMgc29tZXRoaW5nIGNvbXBsZXRlbHkgZGlmZmVyZW50IGFuZCBjYW4ndCBiZSB1c2VkIGZvciB0aGlzIHB1cnBvc2UuXG4gICAgICAgIGlmIChnbG9iYWwucG9zdE1lc3NhZ2UgJiYgIWdsb2JhbC5pbXBvcnRTY3JpcHRzKSB7XG4gICAgICAgICAgICB2YXIgcG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cyA9IHRydWU7XG4gICAgICAgICAgICB2YXIgb2xkT25NZXNzYWdlID0gZ2xvYmFsLm9ubWVzc2FnZTtcbiAgICAgICAgICAgIGdsb2JhbC5vbm1lc3NhZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZUlzQXN5bmNocm9ub3VzID0gZmFsc2U7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKFwiXCIsIFwiKlwiKTtcbiAgICAgICAgICAgIGdsb2JhbC5vbm1lc3NhZ2UgPSBvbGRPbk1lc3NhZ2U7XG4gICAgICAgICAgICByZXR1cm4gcG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxQb3N0TWVzc2FnZUltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICAvLyBJbnN0YWxscyBhbiBldmVudCBoYW5kbGVyIG9uIGBnbG9iYWxgIGZvciB0aGUgYG1lc3NhZ2VgIGV2ZW50OiBzZWVcbiAgICAgICAgLy8gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9ET00vd2luZG93LnBvc3RNZXNzYWdlXG4gICAgICAgIC8vICogaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay9tdWx0aXBhZ2UvY29tbXMuaHRtbCNjcm9zc0RvY3VtZW50TWVzc2FnZXNcblxuICAgICAgICB2YXIgbWVzc2FnZVByZWZpeCA9IFwic2V0SW1tZWRpYXRlJFwiICsgTWF0aC5yYW5kb20oKSArIFwiJFwiO1xuICAgICAgICB2YXIgb25HbG9iYWxNZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChldmVudC5zb3VyY2UgPT09IGdsb2JhbCAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBldmVudC5kYXRhID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICAgICAgZXZlbnQuZGF0YS5pbmRleE9mKG1lc3NhZ2VQcmVmaXgpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcnVuSWZQcmVzZW50KCtldmVudC5kYXRhLnNsaWNlKG1lc3NhZ2VQcmVmaXgubGVuZ3RoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgICAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgb25HbG9iYWxNZXNzYWdlLCBmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnbG9iYWwuYXR0YWNoRXZlbnQoXCJvbm1lc3NhZ2VcIiwgb25HbG9iYWxNZXNzYWdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBnbG9iYWwucG9zdE1lc3NhZ2UobWVzc2FnZVByZWZpeCArIGhhbmRsZSwgXCIqXCIpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxNZXNzYWdlQ2hhbm5lbEltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgICAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gZXZlbnQuZGF0YTtcbiAgICAgICAgICAgIHJ1bklmUHJlc2VudChoYW5kbGUpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBjaGFubmVsLnBvcnQyLnBvc3RNZXNzYWdlKGhhbmRsZSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbFJlYWR5U3RhdGVDaGFuZ2VJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgdmFyIGh0bWwgPSBkb2MuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgLy8gQ3JlYXRlIGEgPHNjcmlwdD4gZWxlbWVudDsgaXRzIHJlYWR5c3RhdGVjaGFuZ2UgZXZlbnQgd2lsbCBiZSBmaXJlZCBhc3luY2hyb25vdXNseSBvbmNlIGl0IGlzIGluc2VydGVkXG4gICAgICAgICAgICAvLyBpbnRvIHRoZSBkb2N1bWVudC4gRG8gc28sIHRodXMgcXVldWluZyB1cCB0aGUgdGFzay4gUmVtZW1iZXIgdG8gY2xlYW4gdXAgb25jZSBpdCdzIGJlZW4gY2FsbGVkLlxuICAgICAgICAgICAgdmFyIHNjcmlwdCA9IGRvYy5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO1xuICAgICAgICAgICAgc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBydW5JZlByZXNlbnQoaGFuZGxlKTtcbiAgICAgICAgICAgICAgICBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBodG1sLnJlbW92ZUNoaWxkKHNjcmlwdCk7XG4gICAgICAgICAgICAgICAgc2NyaXB0ID0gbnVsbDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBodG1sLmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbFNldFRpbWVvdXRJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQocnVuSWZQcmVzZW50LCAwLCBoYW5kbGUpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIElmIHN1cHBvcnRlZCwgd2Ugc2hvdWxkIGF0dGFjaCB0byB0aGUgcHJvdG90eXBlIG9mIGdsb2JhbCwgc2luY2UgdGhhdCBpcyB3aGVyZSBzZXRUaW1lb3V0IGV0IGFsLiBsaXZlLlxuICAgIHZhciBhdHRhY2hUbyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZ2xvYmFsKTtcbiAgICBhdHRhY2hUbyA9IGF0dGFjaFRvICYmIGF0dGFjaFRvLnNldFRpbWVvdXQgPyBhdHRhY2hUbyA6IGdsb2JhbDtcblxuICAgIC8vIERvbid0IGdldCBmb29sZWQgYnkgZS5nLiBicm93c2VyaWZ5IGVudmlyb25tZW50cy5cbiAgICBpZiAoe30udG9TdHJpbmcuY2FsbChnbG9iYWwucHJvY2VzcykgPT09IFwiW29iamVjdCBwcm9jZXNzXVwiKSB7XG4gICAgICAgIC8vIEZvciBOb2RlLmpzIGJlZm9yZSAwLjlcbiAgICAgICAgaW5zdGFsbE5leHRUaWNrSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSBpZiAoY2FuVXNlUG9zdE1lc3NhZ2UoKSkge1xuICAgICAgICAvLyBGb3Igbm9uLUlFMTAgbW9kZXJuIGJyb3dzZXJzXG4gICAgICAgIGluc3RhbGxQb3N0TWVzc2FnZUltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2UgaWYgKGdsb2JhbC5NZXNzYWdlQ2hhbm5lbCkge1xuICAgICAgICAvLyBGb3Igd2ViIHdvcmtlcnMsIHdoZXJlIHN1cHBvcnRlZFxuICAgICAgICBpbnN0YWxsTWVzc2FnZUNoYW5uZWxJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIGlmIChkb2MgJiYgXCJvbnJlYWR5c3RhdGVjaGFuZ2VcIiBpbiBkb2MuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKSkge1xuICAgICAgICAvLyBGb3IgSUUgNuKAkzhcbiAgICAgICAgaW5zdGFsbFJlYWR5U3RhdGVDaGFuZ2VJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRm9yIG9sZGVyIGJyb3dzZXJzXG4gICAgICAgIGluc3RhbGxTZXRUaW1lb3V0SW1wbGVtZW50YXRpb24oKTtcbiAgICB9XG5cbiAgICBhdHRhY2hUby5zZXRJbW1lZGlhdGUgPSBzZXRJbW1lZGlhdGU7XG4gICAgYXR0YWNoVG8uY2xlYXJJbW1lZGlhdGUgPSBjbGVhckltbWVkaWF0ZTtcbn0odHlwZW9mIHNlbGYgPT09IFwidW5kZWZpbmVkXCIgPyB0eXBlb2YgZ2xvYmFsID09PSBcInVuZGVmaW5lZFwiID8gdGhpcyA6IGdsb2JhbCA6IHNlbGYpKTtcbiIsInZhciBzY29wZSA9ICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiICYmIGdsb2JhbCkgfHxcbiAgICAgICAgICAgICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzZWxmKSB8fFxuICAgICAgICAgICAgd2luZG93O1xudmFyIGFwcGx5ID0gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5O1xuXG4vLyBET00gQVBJcywgZm9yIGNvbXBsZXRlbmVzc1xuXG5leHBvcnRzLnNldFRpbWVvdXQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBUaW1lb3V0KGFwcGx5LmNhbGwoc2V0VGltZW91dCwgc2NvcGUsIGFyZ3VtZW50cyksIGNsZWFyVGltZW91dCk7XG59O1xuZXhwb3J0cy5zZXRJbnRlcnZhbCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFRpbWVvdXQoYXBwbHkuY2FsbChzZXRJbnRlcnZhbCwgc2NvcGUsIGFyZ3VtZW50cyksIGNsZWFySW50ZXJ2YWwpO1xufTtcbmV4cG9ydHMuY2xlYXJUaW1lb3V0ID1cbmV4cG9ydHMuY2xlYXJJbnRlcnZhbCA9IGZ1bmN0aW9uKHRpbWVvdXQpIHtcbiAgaWYgKHRpbWVvdXQpIHtcbiAgICB0aW1lb3V0LmNsb3NlKCk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIFRpbWVvdXQoaWQsIGNsZWFyRm4pIHtcbiAgdGhpcy5faWQgPSBpZDtcbiAgdGhpcy5fY2xlYXJGbiA9IGNsZWFyRm47XG59XG5UaW1lb3V0LnByb3RvdHlwZS51bnJlZiA9IFRpbWVvdXQucHJvdG90eXBlLnJlZiA9IGZ1bmN0aW9uKCkge307XG5UaW1lb3V0LnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9jbGVhckZuLmNhbGwoc2NvcGUsIHRoaXMuX2lkKTtcbn07XG5cbi8vIERvZXMgbm90IHN0YXJ0IHRoZSB0aW1lLCBqdXN0IHNldHMgdXAgdGhlIG1lbWJlcnMgbmVlZGVkLlxuZXhwb3J0cy5lbnJvbGwgPSBmdW5jdGlvbihpdGVtLCBtc2Vjcykge1xuICBjbGVhclRpbWVvdXQoaXRlbS5faWRsZVRpbWVvdXRJZCk7XG4gIGl0ZW0uX2lkbGVUaW1lb3V0ID0gbXNlY3M7XG59O1xuXG5leHBvcnRzLnVuZW5yb2xsID0gZnVuY3Rpb24oaXRlbSkge1xuICBjbGVhclRpbWVvdXQoaXRlbS5faWRsZVRpbWVvdXRJZCk7XG4gIGl0ZW0uX2lkbGVUaW1lb3V0ID0gLTE7XG59O1xuXG5leHBvcnRzLl91bnJlZkFjdGl2ZSA9IGV4cG9ydHMuYWN0aXZlID0gZnVuY3Rpb24oaXRlbSkge1xuICBjbGVhclRpbWVvdXQoaXRlbS5faWRsZVRpbWVvdXRJZCk7XG5cbiAgdmFyIG1zZWNzID0gaXRlbS5faWRsZVRpbWVvdXQ7XG4gIGlmIChtc2VjcyA+PSAwKSB7XG4gICAgaXRlbS5faWRsZVRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gb25UaW1lb3V0KCkge1xuICAgICAgaWYgKGl0ZW0uX29uVGltZW91dClcbiAgICAgICAgaXRlbS5fb25UaW1lb3V0KCk7XG4gICAgfSwgbXNlY3MpO1xuICB9XG59O1xuXG4vLyBzZXRpbW1lZGlhdGUgYXR0YWNoZXMgaXRzZWxmIHRvIHRoZSBnbG9iYWwgb2JqZWN0XG5yZXF1aXJlKFwic2V0aW1tZWRpYXRlXCIpO1xuLy8gT24gc29tZSBleG90aWMgZW52aXJvbm1lbnRzLCBpdCdzIG5vdCBjbGVhciB3aGljaCBvYmplY3QgYHNldGltbWVkaWF0ZWAgd2FzXG4vLyBhYmxlIHRvIGluc3RhbGwgb250by4gIFNlYXJjaCBlYWNoIHBvc3NpYmlsaXR5IGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZVxuLy8gYHNldGltbWVkaWF0ZWAgbGlicmFyeS5cbmV4cG9ydHMuc2V0SW1tZWRpYXRlID0gKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiICYmIHNlbGYuc2V0SW1tZWRpYXRlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBnbG9iYWwuc2V0SW1tZWRpYXRlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAodGhpcyAmJiB0aGlzLnNldEltbWVkaWF0ZSk7XG5leHBvcnRzLmNsZWFySW1tZWRpYXRlID0gKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiICYmIHNlbGYuY2xlYXJJbW1lZGlhdGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgJiYgZ2xvYmFsLmNsZWFySW1tZWRpYXRlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzICYmIHRoaXMuY2xlYXJJbW1lZGlhdGUpO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcblx0dGhyb3cgbmV3IEVycm9yKFwiZGVmaW5lIGNhbm5vdCBiZSB1c2VkIGluZGlyZWN0XCIpO1xufTtcbiIsIi8qIGdsb2JhbHMgX193ZWJwYWNrX2FtZF9vcHRpb25zX18gKi9cbm1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX2FtZF9vcHRpb25zX187XG4iLCJ2YXIgZztcblxuLy8gVGhpcyB3b3JrcyBpbiBub24tc3RyaWN0IG1vZGVcbmcgPSAoZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzO1xufSkoKTtcblxudHJ5IHtcblx0Ly8gVGhpcyB3b3JrcyBpZiBldmFsIGlzIGFsbG93ZWQgKHNlZSBDU1ApXG5cdGcgPSBnIHx8IG5ldyBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCk7XG59IGNhdGNoIChlKSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlXG5cdGlmICh0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKSBnID0gd2luZG93O1xufVxuXG4vLyBnIGNhbiBzdGlsbCBiZSB1bmRlZmluZWQsIGJ1dCBub3RoaW5nIHRvIGRvIGFib3V0IGl0Li4uXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xuLy8gZWFzaWVyIHRvIGhhbmRsZSB0aGlzIGNhc2UuIGlmKCFnbG9iYWwpIHsgLi4ufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGc7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuXHRpZiAoIW1vZHVsZS53ZWJwYWNrUG9seWZpbGwpIHtcblx0XHRtb2R1bGUuZGVwcmVjYXRlID0gZnVuY3Rpb24oKSB7fTtcblx0XHRtb2R1bGUucGF0aHMgPSBbXTtcblx0XHQvLyBtb2R1bGUucGFyZW50ID0gdW5kZWZpbmVkIGJ5IGRlZmF1bHRcblx0XHRpZiAoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgXCJsb2FkZWRcIiwge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBtb2R1bGUubDtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImlkXCIsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gbW9kdWxlLmk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0bW9kdWxlLndlYnBhY2tQb2x5ZmlsbCA9IDE7XG5cdH1cblx0cmV0dXJuIG1vZHVsZTtcbn07XG4iLCJpbXBvcnQge01MfSBmcm9tICcuL21sJztcbmltcG9ydCB7TUxDb250ZXh0fSBmcm9tICcuL25uL2NvbnRleHQnO1xuaW1wb3J0IHtNTEdyYXBofSBmcm9tICcuL25uL2dyYXBoJztcbmltcG9ydCB7TUxHcmFwaEJ1aWxkZXJ9IGZyb20gJy4vbm4vZ3JhcGhfYnVpbGRlcic7XG5pbXBvcnQge01MT3BlcmFuZH0gZnJvbSAnLi9ubi9vcGVyYW5kJztcblxuaWYgKG5hdmlnYXRvci5tbCA9PSBudWxsKSB7XG4gIG5hdmlnYXRvci5tbCA9IG5ldyBNTCgpO1xufVxuXG5pZiAoZ2xvYmFsLk1MID09IG51bGwpIHtcbiAgZ2xvYmFsLk1MID0gTUw7XG59XG5cbmlmIChnbG9iYWwuTUxDb250ZXh0ID09IG51bGwpIHtcbiAgZ2xvYmFsLk1MQ29udGV4dCA9IE1MQ29udGV4dDtcbn1cblxuaWYgKGdsb2JhbC5NTEdyYXBoQnVpbGRlciA9PSBudWxsKSB7XG4gIGdsb2JhbC5NTEdyYXBoQnVpbGRlciA9IE1MR3JhcGhCdWlsZGVyO1xufVxuXG5pZiAoZ2xvYmFsLk1MR3JhcGggPT0gbnVsbCkge1xuICBnbG9iYWwuTUxHcmFwaCA9IE1MR3JhcGg7XG59XG5cbmlmIChnbG9iYWwuTUxPcGVyYW5kID09IG51bGwpIHtcbiAgZ2xvYmFsLk1MT3BlcmFuZCA9IE1MT3BlcmFuZDtcbn1cbiIsImltcG9ydCB7TUxDb250ZXh0LCBNTENvbnRleHRPcHRpb25zfSBmcm9tICcuL25uL2NvbnRleHQnO1xuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI21sKVxuICovXG5leHBvcnQgY2xhc3MgTUwge1xuICAvKiogQGlnbm9yZSAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBjcmVhdGVDb250ZXh0KG9wdGlvbnM6IE1MQ29udGV4dE9wdGlvbnMgPSB7fSk6IE1MQ29udGV4dCB7XG4gICAgcmV0dXJuIG5ldyBNTENvbnRleHQob3B0aW9ucyk7XG4gIH1cbn1cbiIsImltcG9ydCAnQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsJztcbmltcG9ydCAnQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdSc7XG5pbXBvcnQgKiBhcyB3YXNtIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtJztcblxuaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZW51bWRlZi1tbHBvd2VycHJlZmVyZW5jZSlcbiAqL1xuZXhwb3J0IGVudW0gTUxQb3dlclByZWZlcmVuY2Uge1xuICAnZGVmYXVsdCcgPSAnZGVmYXVsdCcsXG4gICdoaWdoLXBlcmZvcm1hbmNlJyA9ICdoaWdoLXBlcmZvcm1hbmNlJyxcbiAgJ2xvdy1wb3dlcicgPSAnbG93LXBvd2VyJ1xufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2VudW1kZWYtbWxkZXZpY2VwcmVmZXJlbmNlKVxuICovXG5leHBvcnQgZW51bSBNTERldmljZVByZWZlcmVuY2Uge1xuICAnZGVmYXVsdCcgPSAnZGVmYXVsdCcsXG4gICdncHUnID0gJ2dwdScsXG4gICdjcHUnID0gJ2NwdSdcbn1cblxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RpY3RkZWYtbWxjb250ZXh0b3B0aW9ucylcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNTENvbnRleHRPcHRpb25zIHtcbiAgLyoqICovXG4gIHBvd2VyUHJlZmVyZW5jZT86IE1MUG93ZXJQcmVmZXJlbmNlO1xuICAvKiogKi9cbiAgZGV2aWNlUHJlZmVyZW5jZT86IE1MRGV2aWNlUHJlZmVyZW5jZTtcbn1cblxuLyoqXG4gKiBbQVBJIHNwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jbWxjb250ZXh0KVxuICovXG5leHBvcnQgY2xhc3MgTUxDb250ZXh0IHtcbiAgcHJpdmF0ZSBvcHRpb25zXzogTUxDb250ZXh0T3B0aW9ucztcblxuICAvKiogQGludGVybmFsICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgY29uc3RydWN0b3Iob3B0aW9uczogTUxDb250ZXh0T3B0aW9ucyA9IHt9KSB7XG4gICAgdXRpbHMuYXNzZXJ0KG9wdGlvbnMgaW5zdGFuY2VvZiBPYmplY3QsICdJbnZhbGlkIG9wdGlvbnMuJyk7XG4gICAgaWYgKG9wdGlvbnMucG93ZXJQcmVmZXJlbmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgICBvcHRpb25zLnBvd2VyUHJlZmVyZW5jZSBpbiBNTFBvd2VyUHJlZmVyZW5jZSxcbiAgICAgICAgICAnSW52YWxpZCBwb3dlciBwcmVmZXJlbmNlLicpO1xuICAgIH1cbiAgICB0aGlzLm9wdGlvbnNfID0gb3B0aW9ucztcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0IG9wdGlvbnMoKTogTUxDb250ZXh0T3B0aW9ucyB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9uc187XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIC8vIEV4cG9zZSB0Zi5qcyBmb3IgYmFja2VuZCBkZWJ1Z2dpbmcuXG4gIGdldCB0ZigpOiB1bmtub3duIHtcbiAgICAvLyBTZXQgZGlyZWN0b3J5IG9mIHdhc20gYmluYXJpZXMgZm9yICd3YXNtJyBiYWNrZW5kXG4gICAgd2FzbS5zZXRXYXNtUGF0aHMoYGh0dHBzOi8vdW5wa2cuY29tL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtQCR7XG4gICAgICAgIHRmLnZlcnNpb25fY29yZX0vZGlzdC9gKTtcbiAgICByZXR1cm4gdGY7XG4gIH1cbn1cbiIsImltcG9ydCAnQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsJztcbmltcG9ydCAnQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdSc7XG5pbXBvcnQgJ0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtJztcblxuaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNTEJ1ZmZlclZpZXcsIE1MTmFtZWRPcGVyYW5kc30gZnJvbSAnLi9ncmFwaF9idWlsZGVyJztcbmltcG9ydCB7Q29uc3RhbnRPcGVyYW5kLCBJbnB1dE9wZXJhbmQsIE1MT3BlcmFuZCwgTUxPcGVyYW5kRGVzY3JpcHRvciwgT3V0cHV0T3BlcmFuZH0gZnJvbSAnLi9vcGVyYW5kJztcbmltcG9ydCB7T3BlcmF0aW9ufSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge0FycmF5QnVmZmVyVmlld30gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IHR5cGUgTUxSZXNvdXJjY2UgPSBNTEJ1ZmZlclZpZXd8V2ViR0xUZXh0dXJlO1xuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RpY3RkZWYtbWxpbnB1dClcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNTElucHV0IHtcbiAgcmVzb3VyY2U6IE1MUmVzb3VyY2NlO1xuICBkaW1lbnNpb25zOiBudW1iZXJbXTtcbn1cblxuLyoqXG4gKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyN0eXBlZGVmZGVmLW1sbmFtZWRpbnB1dHMpXG4gKi9cbmV4cG9ydCB0eXBlIE1MTmFtZWRJbnB1dHMgPSBSZWNvcmQ8c3RyaW5nLCBNTElucHV0fE1MUmVzb3VyY2NlPjtcblxuLyoqXG4gKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyN0eXBlZGVmZGVmLW1sbmFtZWRvdXRwdXRzKVxuICovXG5leHBvcnQgdHlwZSBNTE5hbWVkT3V0cHV0cyA9IFJlY29yZDxzdHJpbmcsIE1MUmVzb3VyY2NlPjtcblxuLyoqIEBpbnRlcm5hbCAqL1xuY2xhc3MgT3BlcmFuZFRlbnNvciB7XG4gIHJlZjogbnVtYmVyO1xuICB0ZW5zb3I6IHRmLlRlbnNvcjtcbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGNsYXNzIEV4ZWN1dGlvbkNvbnRleHQge1xuICBwcml2YXRlIGNvbnN0YW50VGVub3Nyc186IE1hcDxDb25zdGFudE9wZXJhbmQsIHRmLlRlbnNvcj47XG4gIHByaXZhdGUgaW5wdXRUZW5zb3JzXzogTWFwPElucHV0T3BlcmFuZCwgT3BlcmFuZFRlbnNvcj47XG4gIHByaXZhdGUgb3V0cHV0VGVuc29yc186IE1hcDxPdXRwdXRPcGVyYW5kLCBPcGVyYW5kVGVuc29yPjtcbiAgcHJpdmF0ZSBvcGVyYW5kUmVmc186IE1hcDxNTE9wZXJhbmQsIG51bWJlcj47XG4gIHByaXZhdGUgb3V0cHV0T3BlcmFuZHNfOiBTZXQ8T3V0cHV0T3BlcmFuZD47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBjb25zdGFudFRlbnNvcnM6IE1hcDxDb25zdGFudE9wZXJhbmQsIHRmLlRlbnNvcj4sXG4gICAgICBpbnB1dE9wZXJhbmRzOiBNYXA8c3RyaW5nLCBJbnB1dE9wZXJhbmQ+LFxuICAgICAgaW5wdXRzOiBNTE5hbWVkSW5wdXRzLFxuICAgICAgb3BlcmFuZFJlZnM6IE1hcDxNTE9wZXJhbmQsIG51bWJlcj4sXG4gICkge1xuICAgIHRoaXMuY29uc3RhbnRUZW5vc3JzXyA9IGNvbnN0YW50VGVuc29ycztcbiAgICB0aGlzLm9wZXJhbmRSZWZzXyA9IG9wZXJhbmRSZWZzO1xuICAgIHRoaXMuYWxsb2NhdGVJbnB1dFRlbnNvcnMoaW5wdXRPcGVyYW5kcywgaW5wdXRzKTtcbiAgICB0aGlzLm91dHB1dFRlbnNvcnNfID0gbmV3IE1hcCgpO1xuICAgIHRoaXMub3V0cHV0T3BlcmFuZHNfID0gbmV3IFNldCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhbGxvY2F0ZUlucHV0VGVuc29ycyhcbiAgICAgIGlucHV0T3BlcmFuZHM6IE1hcDxzdHJpbmcsIElucHV0T3BlcmFuZD4sIGlucHV0czogTUxOYW1lZElucHV0cykge1xuICAgIHRoaXMuaW5wdXRUZW5zb3JzXyA9IG5ldyBNYXAoKTtcbiAgICBmb3IgKGNvbnN0IGlucHV0TmFtZSBpbiBpbnB1dHMpIHtcbiAgICAgIGNvbnN0IGlucHV0ID0gaW5wdXRzW2lucHV0TmFtZV07XG4gICAgICBjb25zdCBpbnB1dE9wZXJhbmQgPSBpbnB1dE9wZXJhbmRzLmdldChpbnB1dE5hbWUpO1xuICAgICAgbGV0IGRlc2M6IE1MT3BlcmFuZERlc2NyaXB0b3I7XG4gICAgICBsZXQgcmVzb3VyY2U7XG4gICAgICBpZiAoKGlucHV0IGFzIE1MSW5wdXQpLmRpbWVuc2lvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZXNjID0ge1xuICAgICAgICAgIHR5cGU6IGlucHV0T3BlcmFuZC5kZXNjLnR5cGUsXG4gICAgICAgICAgZGltZW5zaW9uczogKGlucHV0IGFzIE1MSW5wdXQpLmRpbWVuc2lvbnNcbiAgICAgICAgfSBhcyBNTE9wZXJhbmREZXNjcmlwdG9yO1xuICAgICAgICByZXNvdXJjZSA9IChpbnB1dCBhcyBNTElucHV0KS5yZXNvdXJjZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlc2MgPSBpbnB1dE9wZXJhbmQuZGVzYztcbiAgICAgICAgcmVzb3VyY2UgPSBpbnB1dDtcbiAgICAgIH1cbiAgICAgIHRoaXMuaW5wdXRUZW5zb3JzXy5zZXQoaW5wdXRPcGVyYW5kLCB7XG4gICAgICAgIHJlZjogdGhpcy5vcGVyYW5kUmVmc18uZ2V0KGlucHV0T3BlcmFuZCksXG4gICAgICAgIHRlbnNvcjogdXRpbHMuY3JlYXRlVGVuc29yKGRlc2MsIHJlc291cmNlIGFzIEFycmF5QnVmZmVyVmlldylcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGNvbXB1dGUob3V0cHV0czogTWFwPHN0cmluZywgT3V0cHV0T3BlcmFuZD4pOiB0Zi5UZW5zb3JDb250YWluZXJPYmplY3Qge1xuICAgIGZvciAoY29uc3Qgb3V0cHV0IG9mIG91dHB1dHMudmFsdWVzKCkpIHtcbiAgICAgIHRoaXMub3V0cHV0T3BlcmFuZHNfLmFkZChvdXRwdXQpO1xuICAgIH1cbiAgICBjb25zdCBvdXRwdXRUZW5zb3JzOiB0Zi5UZW5zb3JDb250YWluZXJPYmplY3QgPSB7fTtcbiAgICBmb3IgKGNvbnN0IG91dHB1dE5hbWUgb2Ygb3V0cHV0cy5rZXlzKCkpIHtcbiAgICAgIG91dHB1dFRlbnNvcnNbb3V0cHV0TmFtZV0gPSB0aGlzLmdldFRlbnNvcihvdXRwdXRzLmdldChvdXRwdXROYW1lKSk7XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXRUZW5zb3JzO1xuICB9XG5cbiAgc2V0T3V0cHV0VGVuc29yKG91dHB1dDogT3V0cHV0T3BlcmFuZCwgdGVuc29yOiB0Zi5UZW5zb3IpOiB2b2lkIHtcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgICF0aGlzLm91dHB1dFRlbnNvcnNfLmhhcyhvdXRwdXQpLCAnTUxPdXRwdXQgYWxyZWFkeSBoYXMgdGVuc29yLicpO1xuICAgIHRoaXMub3V0cHV0VGVuc29yc18uc2V0KFxuICAgICAgICBvdXRwdXQsIHtyZWY6IHRoaXMub3BlcmFuZFJlZnNfLmdldChvdXRwdXQpLCB0ZW5zb3J9KTtcbiAgfVxuXG4gIHJlbGVhc2VUZW5zb3Iob3BlcmFuZDogTUxPcGVyYW5kKTogdm9pZCB7XG4gICAgbGV0IG9wZXJhbmRUZW5zb3JNYXA6IE1hcDxNTE9wZXJhbmQsIE9wZXJhbmRUZW5zb3I+O1xuICAgIGlmIChvcGVyYW5kIGluc3RhbmNlb2YgSW5wdXRPcGVyYW5kKSB7XG4gICAgICBvcGVyYW5kVGVuc29yTWFwID0gdGhpcy5pbnB1dFRlbnNvcnNfO1xuICAgIH0gZWxzZSBpZiAob3BlcmFuZCBpbnN0YW5jZW9mIE91dHB1dE9wZXJhbmQpIHtcbiAgICAgIGlmICh0aGlzLm91dHB1dE9wZXJhbmRzXy5oYXMob3BlcmFuZCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgb3BlcmFuZFRlbnNvck1hcCA9IHRoaXMub3V0cHV0VGVuc29yc187XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb3BlcmFuZFRlbnNvcjogT3BlcmFuZFRlbnNvciA9IG9wZXJhbmRUZW5zb3JNYXAuZ2V0KG9wZXJhbmQpO1xuICAgIHV0aWxzLmFzc2VydChvcGVyYW5kVGVuc29yICE9PSB1bmRlZmluZWQsICdObyB0ZW5zb3IgZm91bmQgZm9yIG9wZXJhbmQuJyk7XG4gICAgb3BlcmFuZFRlbnNvci5yZWYtLTtcbiAgICBpZiAob3BlcmFuZFRlbnNvci5yZWYgPT09IDApIHtcbiAgICAgIHRmLmRpc3Bvc2Uob3BlcmFuZFRlbnNvci50ZW5zb3IpO1xuICAgICAgb3BlcmFuZFRlbnNvck1hcC5kZWxldGUob3BlcmFuZCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0VGVuc29yKG9wZXJhbmQ6IE1MT3BlcmFuZCk6IHRmLlRlbnNvciB7XG4gICAgaWYgKG9wZXJhbmQgaW5zdGFuY2VvZiBDb25zdGFudE9wZXJhbmQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnN0YW50VGVub3Nyc18uZ2V0KG9wZXJhbmQpO1xuICAgIH0gZWxzZSBpZiAob3BlcmFuZCBpbnN0YW5jZW9mIElucHV0T3BlcmFuZCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5wdXRUZW5zb3JzXy5nZXQob3BlcmFuZCkudGVuc29yO1xuICAgIH0gZWxzZSBpZiAob3BlcmFuZCBpbnN0YW5jZW9mIE91dHB1dE9wZXJhbmQpIHtcbiAgICAgIGlmICh0aGlzLm91dHB1dFRlbnNvcnNfLmhhcyhvcGVyYW5kKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5vdXRwdXRUZW5zb3JzXy5nZXQob3BlcmFuZCkudGVuc29yO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3BlcmFuZC5vcGVyYXRpb24uY29tcHV0ZSh0aGlzKTtcbiAgICAgICAgdXRpbHMuYXNzZXJ0KHRoaXMub3V0cHV0VGVuc29yc18uaGFzKG9wZXJhbmQpLCAnTm8gb3V0cHV0IGlzIHNldC4nKTtcbiAgICAgICAgcmV0dXJuIHRoaXMub3V0cHV0VGVuc29yc18uZ2V0KG9wZXJhbmQpLnRlbnNvcjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgb3BlcmFuZCBpcyBpbnZhbGlkLicpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2FwaS1tbGdyYXBoKVxuICovXG5leHBvcnQgY2xhc3MgTUxHcmFwaCB7XG4gIHByaXZhdGUgaW5wdXRzXzogTWFwPHN0cmluZywgSW5wdXRPcGVyYW5kPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBvdXRwdXRzXzogTWFwPHN0cmluZywgT3V0cHV0T3BlcmFuZD4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgY29uc3RhbnRzXzogU2V0PENvbnN0YW50T3BlcmFuZD4gPSBuZXcgU2V0KCk7XG4gIHByaXZhdGUgb3BlcmFuZFJlZnNfOiBNYXA8TUxPcGVyYW5kLCBudW1iZXI+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIGNvbnN0YW50VGVuc29yc186IE1hcDxDb25zdGFudE9wZXJhbmQsIHRmLlRlbnNvcj4gPSBuZXcgTWFwKCk7XG5cbiAgY29tcHV0ZShpbnB1dHM6IE1MTmFtZWRJbnB1dHMsIG91dHB1dHM6IE1MTmFtZWRPdXRwdXRzKTogdm9pZCB7XG4gICAgdGhpcy52YWxpZGF0ZUlucHV0cyhpbnB1dHMpO1xuXG4gICAgLy8gVmFsaWRhdGUgYW5kIGZpbHRlciB0aGUgcmVxdWlyZWQgb3V0cHV0IG9wZXJhbmRzLlxuICAgIHV0aWxzLmFzc2VydChPYmplY3Qua2V5cyhvdXRwdXRzKS5sZW5ndGggIT09IDAsICdUaGUgb3V0cHV0cyBpcyBpbnZhbGlkLicpO1xuICAgIGNvbnN0IG91dHB1dE9wZXJhbmRzOiBNYXA8c3RyaW5nLCBPdXRwdXRPcGVyYW5kPiA9IG5ldyBNYXAoKTtcbiAgICBmb3IgKGNvbnN0IG91dHB1dE5hbWUgaW4gb3V0cHV0cykge1xuICAgICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgIHR5cGVvZiBvdXRwdXROYW1lID09PSAnc3RyaW5nJyAmJiB0aGlzLm91dHB1dHNfLmhhcyhvdXRwdXROYW1lKSxcbiAgICAgICAgICAnVGhlIG5hbWUgb2YgdGhlIG91dHB1dCBpcyBpbnZhbGlkLicpO1xuICAgICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgIHV0aWxzLmlzVHlwZWRBcnJheShvdXRwdXRzW291dHB1dE5hbWVdKSxcbiAgICAgICAgICAnT25seSBvdXRwdXQgb2YgQXJyYXlCdWZmZXJWaWV3IHR5cGUgaXMgc3VwcG9ydGVkLicpO1xuICAgICAgb3V0cHV0T3BlcmFuZHMuc2V0KG91dHB1dE5hbWUsIHRoaXMub3V0cHV0c18uZ2V0KG91dHB1dE5hbWUpKTtcbiAgICB9XG5cbiAgICAvLyBDb21wdXRlIHRoZSBvdXRwdXQgdGVuc29ycy5cbiAgICBjb25zdCBvdXRwdXRUZW5zb3JzOiB0Zi5UZW5zb3JDb250YWluZXJPYmplY3QgPSB0Zi50aWR5KCgpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBuZXcgRXhlY3V0aW9uQ29udGV4dChcbiAgICAgICAgICB0aGlzLmNvbnN0YW50VGVuc29yc18sIHRoaXMuaW5wdXRzXywgaW5wdXRzLCB0aGlzLm9wZXJhbmRSZWZzXyk7XG4gICAgICAvLyBUaGUgaW5wdXQgYW5kIGltbWVkaWF0ZSB0ZW5zb3JzIHdpbGwgYmUgY2xlYW5lZCB1cC5cbiAgICAgIHJldHVybiBjb250ZXh0LmNvbXB1dGUob3V0cHV0T3BlcmFuZHMpO1xuICAgIH0pO1xuXG4gICAgLy8gU2V0dXAgdGhlIG91dHB1dHMuXG4gICAgZm9yIChjb25zdCBvdXRwdXROYW1lIG9mIE9iamVjdC5rZXlzKG91dHB1dFRlbnNvcnMpKSB7XG4gICAgICBjb25zdCB0ZW5zb3IgPSBvdXRwdXRUZW5zb3JzW291dHB1dE5hbWVdIGFzIHRmLlRlbnNvcjtcbiAgICAgIGNvbnN0IGRlc2MgPSB1dGlscy5jcmVhdGVPcGVyYW5kRGVzY3JpcHRvckZyb21UZW5zb3IodGVuc29yKTtcbiAgICAgIGNvbnN0IHJlc291cmNlID0gb3V0cHV0c1tvdXRwdXROYW1lXSBhcyBBcnJheUJ1ZmZlclZpZXc7XG4gICAgICB1dGlscy52YWxpZGF0ZVR5cGVkQXJyYXkocmVzb3VyY2UsIGRlc2MudHlwZSwgZGVzYy5kaW1lbnNpb25zKTtcbiAgICAgIHJlc291cmNlLnNldCh0ZW5zb3IuZGF0YVN5bmMoKSk7XG4gICAgICB0Zi5kaXNwb3NlKHRlbnNvcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZUlucHV0cyhpbnB1dHM6IE1MTmFtZWRJbnB1dHMpIHtcbiAgICBmb3IgKGNvbnN0IG5hbWUgaW4gaW5wdXRzKSB7XG4gICAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgICAgdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnICYmIHRoaXMuaW5wdXRzXy5oYXMobmFtZSksXG4gICAgICAgICAgJ1RoZSBuYW1lIG9mIHRoZSBpbnB1dCBpcyBpbnZhbGlkLicpO1xuICAgICAgY29uc3QgaW5wdXRPcGVyYW5kID0gdGhpcy5pbnB1dHNfLmdldChuYW1lKTtcbiAgICAgIGxldCByZXNvdXJjZTtcbiAgICAgIGxldCBkaW1lbnNpb25zO1xuICAgICAgaWYgKChpbnB1dHNbbmFtZV0gYXMgTUxJbnB1dCkuZGltZW5zaW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gaW5wdXRzW25hbWVdIGFzIE1MSW5wdXQ7XG4gICAgICAgIHJlc291cmNlID0gaW5wdXQucmVzb3VyY2U7XG4gICAgICAgIGRpbWVuc2lvbnMgPSBpbnB1dC5kaW1lbnNpb25zO1xuICAgICAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgICAgICByZXNvdXJjZSAhPT0gdW5kZWZpbmVkLCAnVGhlIHJlc291cmNlIG9mIGlucHV0IGlzIHVuZGVmaW5lZC4nKTtcbiAgICAgICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgICAgdXRpbHMuaXNJbnRlZ2VyQXJyYXkoZGltZW5zaW9ucykgPT09IHRydWUsXG4gICAgICAgICAgICAnVGhlIHR5cGUgb2YgdGhlIGlucHV0IGRpbWVuc2lvbnMgaXMgaW52YWxpZC4nKTtcbiAgICAgICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgICAgZGltZW5zaW9ucy5sZW5ndGggPT09IGlucHV0T3BlcmFuZC5kZXNjLmRpbWVuc2lvbnMubGVuZ3RoLFxuICAgICAgICAgICAgJ1RoZSByYW5rIG9mIHRoZSBpbnB1dCBkaW1lbnNpb25zIGlzIGludmFsaWQuJyk7XG4gICAgICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgICAgICF1dGlscy5pc0R5YW5taWNTaGFwZShkaW1lbnNpb25zKSxcbiAgICAgICAgICAgICdUaGUgdmFsdWUgb2YgaW5wdXQgZGltZW5zaW9ucyBpcyBuZWdhdGl2ZS4nKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dE9wZXJhbmQuZGVzYy5kaW1lbnNpb25zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgY29uc3QgZCA9IGlucHV0T3BlcmFuZC5kZXNjLmRpbWVuc2lvbnNbaV07XG4gICAgICAgICAgaWYgKGQgPiAwKSB7XG4gICAgICAgICAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgICAgICAgICAgZCA9PT0gZGltZW5zaW9uc1tpXSxcbiAgICAgICAgICAgICAgICAnVGhlIHZhbHVlIG9mIHRoZSBpbnB1dCBkaW1lbnNpb25zIGlzIGludmFsaWQuJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvdXJjZSA9IGlucHV0c1tuYW1lXSBhcyBNTFJlc291cmNjZTtcbiAgICAgICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgICAgIXV0aWxzLmlzRHlhbm1pY1NoYXBlKGlucHV0T3BlcmFuZC5kZXNjLmRpbWVuc2lvbnMpLFxuICAgICAgICAgICAgJ1RoZSBpbnB1dCBkaW1lbnNpb25zIGlzIG5vdCBzcGVjaWZpZWQuJyk7XG4gICAgICAgIGRpbWVuc2lvbnMgPSBpbnB1dE9wZXJhbmQuZGVzYy5kaW1lbnNpb25zO1xuICAgICAgfVxuICAgICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgIHV0aWxzLmlzVHlwZWRBcnJheShyZXNvdXJjZSksXG4gICAgICAgICAgJ09ubHkgcmVzb3VyY2Ugb2YgQXJyYXlCdWZmZXJWaWV3IHR5cGUgaXMgc3VwcG9ydGVkLicpO1xuICAgICAgdXRpbHMudmFsaWRhdGVUeXBlZEFycmF5KFxuICAgICAgICAgIHJlc291cmNlIGFzIEFycmF5QnVmZmVyVmlldywgaW5wdXRPcGVyYW5kLmRlc2MudHlwZSwgZGltZW5zaW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgY29uc3RydWN0b3Iob3V0cHV0cz86IE1MTmFtZWRPcGVyYW5kcykge1xuICAgIHV0aWxzLmFzc2VydChvdXRwdXRzICE9PSB1bmRlZmluZWQsICdJbnZhbGlkIGFyZ3VtZW50Jyk7XG4gICAgZm9yIChjb25zdCBuYW1lIGluIG91dHB1dHMpIHtcbiAgICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgICB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycgJiYgb3V0cHV0c1tuYW1lXSBpbnN0YW5jZW9mIE91dHB1dE9wZXJhbmQsXG4gICAgICAgICAgJ1RoZSBvdXRwdXRzIHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgICAgdGhpcy5vdXRwdXRzXy5zZXQobmFtZSwgb3V0cHV0c1tuYW1lXSBhcyBPdXRwdXRPcGVyYW5kKTtcbiAgICB9XG4gICAgdXRpbHMuYXNzZXJ0KHRoaXMub3V0cHV0c18uc2l6ZSAhPT0gMCwgJ1RoZSBvdXRwdXRzIGlzIGVtcHR5Jyk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHN0YXRpYyBidWlsZEFuZENvbXBpbGUob3V0cHV0cz86IE1MTmFtZWRPcGVyYW5kcyk6IE1MR3JhcGgge1xuICAgIGNvbnN0IGdyYXBoID0gbmV3IE1MR3JhcGgob3V0cHV0cyk7XG4gICAgZ3JhcGguYnVpbGQoKTtcbiAgICBncmFwaC5jb21waWxlKCk7XG4gICAgcmV0dXJuIGdyYXBoO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZCgpOiB2b2lkIHtcbiAgICBjb25zdCB2aXNpdGVkT3BzOiBTZXQ8T3BlcmF0aW9uPiA9IG5ldyBTZXQoKTtcbiAgICBmb3IgKGNvbnN0IG91dHB1dCBvZiB0aGlzLm91dHB1dHNfLnZhbHVlcygpKSB7XG4gICAgICB0aGlzLmJ1aWxkT3BlcmF0aW9uKG91dHB1dC5vcGVyYXRpb24sIHZpc2l0ZWRPcHMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRPcGVyYXRpb24ob3BlcmF0aW9uOiBPcGVyYXRpb24sIHZpc2l0ZWRPcHM6IFNldDxPcGVyYXRpb24+KTpcbiAgICAgIHZvaWQge1xuICAgIGlmICh2aXNpdGVkT3BzLmhhcyhvcGVyYXRpb24pKSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIHZpc2l0ZWRPcHMuYWRkKG9wZXJhdGlvbik7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgb3BlcmFuZCBvZiBvcGVyYXRpb24uaW5wdXRzKCkpIHtcbiAgICAgIGlmICghdGhpcy5vcGVyYW5kUmVmc18uaGFzKG9wZXJhbmQpKSB7XG4gICAgICAgIHRoaXMub3BlcmFuZFJlZnNfLnNldChvcGVyYW5kLCAxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCByZWYgPSB0aGlzLm9wZXJhbmRSZWZzXy5nZXQob3BlcmFuZCk7XG4gICAgICAgIHJlZisrO1xuICAgICAgICB0aGlzLm9wZXJhbmRSZWZzXy5zZXQob3BlcmFuZCwgcmVmKTtcbiAgICAgIH1cbiAgICAgIGlmIChvcGVyYW5kIGluc3RhbmNlb2YgSW5wdXRPcGVyYW5kKSB7XG4gICAgICAgIGlmICh0aGlzLmlucHV0c18uaGFzKG9wZXJhbmQubmFtZSkpIHtcbiAgICAgICAgICBpZiAodGhpcy5pbnB1dHNfLmdldChvcGVyYW5kLm5hbWUpICE9PSBvcGVyYW5kKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBuYW1lIG9mIHRoaXMgaW5wdXQgaXMgZXhpc3RlZC4nKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5wdXRzXy5zZXQob3BlcmFuZC5uYW1lLCBvcGVyYW5kKTtcbiAgICAgIH0gZWxzZSBpZiAob3BlcmFuZCBpbnN0YW5jZW9mIENvbnN0YW50T3BlcmFuZCkge1xuICAgICAgICBpZiAoIXRoaXMuY29uc3RhbnRzXy5oYXMob3BlcmFuZCkpIHtcbiAgICAgICAgICB0aGlzLmNvbnN0YW50c18uYWRkKG9wZXJhbmQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG9wZXJhbmQgaW5zdGFuY2VvZiBPdXRwdXRPcGVyYW5kKSB7XG4gICAgICAgIHRoaXMuYnVpbGRPcGVyYXRpb24ob3BlcmFuZC5vcGVyYXRpb24sIHZpc2l0ZWRPcHMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY29tcGlsZSgpOiB2b2lkIHtcbiAgICB0aGlzLmFsbG9jYXRlQ29uc3RhbnRzKCk7XG4gICAgdGhpcy5jb21wdXRlT25jZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhbGxvY2F0ZUNvbnN0YW50cygpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGNvbnN0YW50IG9mIHRoaXMuY29uc3RhbnRzXykge1xuICAgICAgdGhpcy5jb25zdGFudFRlbnNvcnNfLnNldChcbiAgICAgICAgICBjb25zdGFudCwgdXRpbHMuY3JlYXRlVGVuc29yKGNvbnN0YW50LmRlc2MsIGNvbnN0YW50LnZhbHVlKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb21wdXRlT25jZSgpOiB2b2lkIHtcbiAgICBjb25zdCBpbnB1dHM6IE1MTmFtZWRJbnB1dHMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGlucHV0TmFtZSBvZiB0aGlzLmlucHV0c18ua2V5cygpKSB7XG4gICAgICBjb25zdCBpbnB1dE9wZXJhbmQgPSB0aGlzLmlucHV0c18uZ2V0KGlucHV0TmFtZSk7XG4gICAgICAvLyBhc3N1bWUgMSBmb3IgbmVnYXRpdmUgZGltIHZhbHVlLlxuICAgICAgY29uc3Qgc2hhcGUgPSBpbnB1dE9wZXJhbmQuZGVzYy5kaW1lbnNpb25zLm1hcCh4ID0+IHggPCAwID8gMSA6IHgpO1xuICAgICAgY29uc3QgdHlwZWRBcnJheUNvbnN0cnVjdG9yID0gdXRpbHMuZ2V0VHlwZWRBcnJheShpbnB1dE9wZXJhbmQuZGVzYy50eXBlKTtcbiAgICAgIGNvbnN0IGlucHV0QnVmZmVyID0gbmV3IHR5cGVkQXJyYXlDb25zdHJ1Y3RvcihcbiAgICAgICAgICB1dGlscy5zaXplRnJvbURpbWVuc2lvbnMoaW5wdXRPcGVyYW5kLmRlc2MuZGltZW5zaW9ucykpO1xuICAgICAgaW5wdXRzW2lucHV0TmFtZV0gPSB7cmVzb3VyY2U6IGlucHV0QnVmZmVyLCBkaW1lbnNpb25zOiBzaGFwZX0gYXMgTUxJbnB1dDtcbiAgICB9XG4gICAgY29uc3Qgb3V0cHV0VGVuc29yczogdGYuVGVuc29yQ29udGFpbmVyT2JqZWN0ID0gdGYudGlkeSgoKSA9PiB7XG4gICAgICBjb25zdCBjb250ZXh0ID0gbmV3IEV4ZWN1dGlvbkNvbnRleHQoXG4gICAgICAgICAgdGhpcy5jb25zdGFudFRlbnNvcnNfLCB0aGlzLmlucHV0c18sIGlucHV0cywgdGhpcy5vcGVyYW5kUmVmc18pO1xuICAgICAgLy8gVGhlIGlucHV0IGFuZCBpbW1lZGlhdGUgdGVuc29ycyB3aWxsIGJlIGNsZWFuZWQgdXAuXG4gICAgICByZXR1cm4gY29udGV4dC5jb21wdXRlKHRoaXMub3V0cHV0c18pO1xuICAgIH0pO1xuICAgIGZvciAoY29uc3Qgb3V0cHV0TmFtZSBvZiBPYmplY3Qua2V5cyhvdXRwdXRUZW5zb3JzKSkge1xuICAgICAgY29uc3QgdGVuc29yID0gb3V0cHV0VGVuc29yc1tvdXRwdXROYW1lXSBhcyB0Zi5UZW5zb3I7XG4gICAgICB0ZW5zb3IuZGF0YVN5bmMoKTtcbiAgICAgIHRmLmRpc3Bvc2UodGVuc29yKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICAvLyBGb3IgbWVtb3J5IGxlYWsgdGVzdGluZy5cbiAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHRlbnNvciBvZiB0aGlzLmNvbnN0YW50VGVuc29yc18udmFsdWVzKCkpIHtcbiAgICAgIHRmLmRpc3Bvc2UodGVuc29yKTtcbiAgICB9XG4gICAgY29uc3QgdmlzaXRlZE9wczogU2V0PE9wZXJhdGlvbj4gPSBuZXcgU2V0KCk7XG4gICAgZm9yIChjb25zdCBvdXRwdXQgb2YgdGhpcy5vdXRwdXRzXy52YWx1ZXMoKSkge1xuICAgICAgdGhpcy5kaXNwb3NlT3BlcmF0aW9uKG91dHB1dC5vcGVyYXRpb24sIHZpc2l0ZWRPcHMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZGlzcG9zZU9wZXJhdGlvbihvcGVyYXRpb246IE9wZXJhdGlvbiwgdmlzaXRlZE9wczogU2V0PE9wZXJhdGlvbj4pOlxuICAgICAgdm9pZCB7XG4gICAgaWYgKHZpc2l0ZWRPcHMuaGFzKG9wZXJhdGlvbikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgb3BlcmF0aW9uLmRpc3Bvc2UoKTtcbiAgICAgIHZpc2l0ZWRPcHMuYWRkKG9wZXJhdGlvbik7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgb3BlcmFuZCBvZiBvcGVyYXRpb24uaW5wdXRzKCkpIHtcbiAgICAgIGlmIChvcGVyYW5kIGluc3RhbmNlb2YgT3V0cHV0T3BlcmFuZCkge1xuICAgICAgICB0aGlzLmRpc3Bvc2VPcGVyYXRpb24ob3BlcmFuZC5vcGVyYXRpb24sIHZpc2l0ZWRPcHMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHtNTENvbnRleHR9IGZyb20gJy4vY29udGV4dCc7XG5pbXBvcnQge01MR3JhcGh9IGZyb20gJy4vZ3JhcGgnO1xuaW1wb3J0IHtDb25zdGFudE9wZXJhbmQsIElucHV0T3BlcmFuZCwgTUxPcGVyYW5kLCBNTE9wZXJhbmREZXNjcmlwdG9yLCBNTE9wZXJhbmRUeXBlfSBmcm9tICcuL29wZXJhbmQnO1xuaW1wb3J0IHtNTE9wZXJhdG9yfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge0JhdGNoTm9ybWFsaXphdGlvbn0gZnJvbSAnLi9vcHMvYmF0Y2hfbm9ybSc7XG5pbXBvcnQge0FkZCwgRGl2LCBNYXRNdWwsIE1heCwgTWluLCBNdWwsIFBvdywgU3VifSBmcm9tICcuL29wcy9iaW5hcnknO1xuaW1wb3J0IHtDbGFtcH0gZnJvbSAnLi9vcHMvY2xhbXAnO1xuaW1wb3J0IHtDb25jYXR9IGZyb20gJy4vb3BzL2NvbmNhdCc7XG5pbXBvcnQge0NvbnYyZH0gZnJvbSAnLi9vcHMvY29udjJkJztcbmltcG9ydCB7R2VtbX0gZnJvbSAnLi9vcHMvZ2VtbSc7XG5pbXBvcnQge0dydSwgR3J1Q2VsbH0gZnJvbSAnLi9vcHMvZ3J1JztcbmltcG9ydCB7SW5zdGFuY2VOb3JtYWxpemF0aW9ufSBmcm9tICcuL29wcy9pbnN0YW5jZV9ub3JtJztcbmltcG9ydCB7TGVha3lSZWx1fSBmcm9tICcuL29wcy9sZWFreV9yZWx1JztcbmltcG9ydCB7UGFkfSBmcm9tICcuL29wcy9wYWQnO1xuaW1wb3J0IHtBdmVyYWdlUG9vbDJkLCBMMlBvb2wyZCwgTWF4UG9vbDJkfSBmcm9tICcuL29wcy9wb29sMmQnO1xuaW1wb3J0IHtSZWR1Y2VMMSwgUmVkdWNlTDIsIFJlZHVjZUxvZ1N1bUV4cCwgUmVkdWNlTWF4LCBSZWR1Y2VNZWFuLCBSZWR1Y2VNaW4sIFJlZHVjZVByb2R1Y3QsIFJlZHVjZVN1bX0gZnJvbSAnLi9vcHMvcmVkdWNlJztcbmltcG9ydCB7UmVzYW1wbGV9IGZyb20gJy4vb3BzL3Jlc2FtcGxlJztcbmltcG9ydCB7UmVzaGFwZX0gZnJvbSAnLi9vcHMvcmVzaGFwZSc7XG5pbXBvcnQge1NsaWNlfSBmcm9tICcuL29wcy9zbGljZSc7XG5pbXBvcnQge1NvZnRtYXh9IGZyb20gJy4vb3BzL3NvZnRtYXgnO1xuaW1wb3J0IHtTcGxpdH0gZnJvbSAnLi9vcHMvc3BsaXQnO1xuaW1wb3J0IHtTcXVlZXplfSBmcm9tICcuL29wcy9zcXVlZXplJztcbmltcG9ydCB7VHJhbnNwb3NlfSBmcm9tICcuL29wcy90cmFuc3Bvc2UnO1xuaW1wb3J0IHtFeHAsIEhhcmRTd2lzaCwgUmVsdSwgU2lnbW9pZCwgVGFuaH0gZnJvbSAnLi9vcHMvdW5hcnknO1xuaW1wb3J0IHtBcnJheUJ1ZmZlclZpZXd9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZW51bWRlZi1tbGlucHV0b3BlcmFuZGxheW91dClcbiAqL1xuZXhwb3J0IGVudW0gTUxJbnB1dE9wZXJhbmRMYXlvdXQge1xuICAnbmNodycgPSAnbmNodycsXG4gICduaHdjJyA9ICduaHdjJ1xufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RpY3RkZWYtbWxiYXRjaG5vcm1hbGl6YXRpb25vcHRpb25zKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1MQmF0Y2hOb3JtYWxpemF0aW9uT3B0aW9ucyB7XG4gIHNjYWxlPzogTUxPcGVyYW5kO1xuICBiaWFzPzogTUxPcGVyYW5kO1xuICBheGlzPzogbnVtYmVyO1xuICBlcHNpbG9uPzogbnVtYmVyO1xuICBhY3RpdmF0aW9uPzogTUxPcGVyYXRvcjtcbn1cblxuLyoqXG4gKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkaWN0ZGVmLW1sY2xhbXBvcHRpb25zKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1MQ2xhbXBPcHRpb25zIHtcbiAgbWluVmFsdWU/OiBNTE9wZXJhbmQ7XG4gIG1heFZhbHVlPzogTUxPcGVyYW5kO1xufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2VudW1kZWYtbWxmaWx0ZXJvcGVyYW5kbGF5b3V0KVxuICovXG5leHBvcnQgZW51bSBNTEZpbHRlck9wZXJhbmRMYXlvdXQge1xuICAnb2lodycgPSAnb2lodycsXG4gICdod2lvJyA9ICdod2lvJyxcbiAgJ29od2knID0gJ29od2knLFxuICAnaWh3bycgPSAnaWh3bycsXG59XG5cbi8qKlxuICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZW51bWRlZi1tbGF1dG9wYWQpXG4gKi9cbmV4cG9ydCBlbnVtIE1MQXV0b1BhZCB7XG4gICdleHBsaWNpdCcgPSAnZXhwbGljaXQnLFxuICAnc2FtZS11cHBlcicgPSAnc2FtZS11cHBlcicsXG4gICdzYW1lLWxvd2VyJyA9ICdzYW1lLWxvd2VyJyxcbn1cblxuLyoqXG4gKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkaWN0ZGVmLW1sY29udjJkb3B0aW9ucylcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNTENvbnYyZE9wdGlvbnMge1xuICBwYWRkaW5nPzogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG4gIHN0cmlkZXM/OiBbbnVtYmVyLCBudW1iZXJdO1xuICBkaWxhdGlvbnM/OiBbbnVtYmVyLCBudW1iZXJdO1xuICBvdXRwdXRQYWRkaW5nPzogW251bWJlciwgbnVtYmVyXTtcbiAgb3V0cHV0U2l6ZXM/OiBbbnVtYmVyLCBudW1iZXJdO1xuICBhdXRvUGFkPzogTUxBdXRvUGFkO1xuICB0cmFuc3Bvc2U/OiBib29sZWFuO1xuICBncm91cHM/OiBudW1iZXI7XG4gIGlucHV0TGF5b3V0PzogTUxJbnB1dE9wZXJhbmRMYXlvdXQ7XG4gIGZpbHRlckxheW91dD86IE1MRmlsdGVyT3BlcmFuZExheW91dDtcbiAgYmlhcz86IE1MT3BlcmFuZDtcbiAgYWN0aXZhdGlvbj86IE1MT3BlcmF0b3I7XG59XG5cbi8qKlxuICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZGljdGRlZi1tbGdlbW1vcHRpb25zKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1MR2VtbU9wdGlvbnMge1xuICBjPzogTUxPcGVyYW5kO1xuICBhbHBoYT86IG51bWJlcjtcbiAgYmV0YT86IG51bWJlcjtcbiAgYVRyYW5zcG9zZT86IGJvb2xlYW47XG4gIGJUcmFuc3Bvc2U/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2VudW1kZWYtbWxyZWN1cnJlbnRuZXR3b3Jrd2VpZ2h0bGF5b3V0KVxuICovXG5leHBvcnQgZW51bSBNTFJlY3VycmVudE5ldHdvcmtXZWlnaHRMYXlvdXQge1xuICAnenJuJyA9ICd6cm4nLFxuICAncnpuJyA9ICdyem4nLFxufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2VudW1kZWYtbWxyZWN1cnJlbnRuZXR3b3JrZGlyZWN0aW9uKVxuICovXG5leHBvcnQgZW51bSBNTFJlY3VycmVudE5ldHdvcmtEaXJlY3Rpb24ge1xuICAnZm9yd2FyZCcgPSAnZm9yd2FyZCcsXG4gICdiYWNrd2FyZCcgPSAnYmFja3dhcmQnLFxuICAnYm90aCcgPSAnYm90aCcsXG59XG5cbi8qKlxuICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZGljdGRlZi1tbGdydW9wdGlvbnMpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTUxHcnVPcHRpb25zIHtcbiAgYmlhcz86IE1MT3BlcmFuZDtcbiAgcmVjdXJyZW50Qmlhcz86IE1MT3BlcmFuZDtcbiAgaW5pdGlhbEhpZGRlblN0YXRlPzogTUxPcGVyYW5kO1xuICByZXNldEFmdGVyPzogYm9vbGVhbjtcbiAgcmV0dXJuU2VxdWVuY2U/OiBib29sZWFuO1xuICBkaXJlY3Rpb24/OiBNTFJlY3VycmVudE5ldHdvcmtEaXJlY3Rpb247XG4gIGxheW91dD86IE1MUmVjdXJyZW50TmV0d29ya1dlaWdodExheW91dDtcbiAgYWN0aXZhdGlvbnM/OiBNTE9wZXJhdG9yW107XG59XG5cbi8qKlxuICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZGljdGRlZi1tbGdydWNlbGxvcHRpb25zKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1MR3J1Q2VsbE9wdGlvbnMge1xuICBiaWFzPzogTUxPcGVyYW5kO1xuICByZWN1cnJlbnRCaWFzPzogTUxPcGVyYW5kO1xuICByZXNldEFmdGVyPzogYm9vbGVhbjtcbiAgbGF5b3V0PzogTUxSZWN1cnJlbnROZXR3b3JrV2VpZ2h0TGF5b3V0O1xuICBhY3RpdmF0aW9ucz86IE1MT3BlcmF0b3JbXTtcbn1cblxuLyoqXG4gKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkaWN0ZGVmLW1saW5zdGFuY2Vub3JtYWxpemF0aW9ub3B0aW9ucylcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNTEluc3RhbmNlTm9ybWFsaXphdGlvbk9wdGlvbnMge1xuICBzY2FsZT86IE1MT3BlcmFuZDtcbiAgYmlhcz86IE1MT3BlcmFuZDtcbiAgZXBzaWxvbj86IG51bWJlcjtcbiAgbGF5b3V0PzogTUxJbnB1dE9wZXJhbmRMYXlvdXQ7XG59XG5cbi8qKlxuICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZGljdGRlZi1tbGxlYWt5cmVsdW9wdGlvbnMpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTUxMZWFreVJlbHVPcHRpb25zIHtcbiAgYWxwaGE/OiBudW1iZXI7XG59XG5cbi8qKlxuICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZW51bWRlZi1tbHBhZGRpbmdtb2RlKVxuICovXG5leHBvcnQgZW51bSBNTFBhZGRpbmdNb2RlIHtcbiAgJ2NvbnN0YW50JyA9ICdjb25zdGFudCcsXG4gICdlZGdlJyA9ICdlZGdlJyxcbiAgJ3JlZmxlY3Rpb24nID0gJ3JlZmxlY3Rpb24nLFxuICAnc3ltbWV0cmljJyA9ICdzeW1tZXRyaWMnXG59XG5cbi8qKlxuICogW3NwZWNdKGhodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RpY3RkZWYtbWxwYWRvcHRpb25zKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1MUGFkT3B0aW9ucyB7XG4gIG1vZGU/OiBNTFBhZGRpbmdNb2RlO1xuICB2YWx1ZT86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkaWN0ZGVmLW1scG9vbDJkb3B0aW9ucylcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNTFBvb2xpbmcyZE9wdGlvbnMge1xuICB3aW5kb3dEaW1lbnNpb25zPzogW251bWJlciwgbnVtYmVyXTtcbiAgcGFkZGluZz86IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICBzdHJpZGVzPzogW251bWJlciwgbnVtYmVyXTtcbiAgZGlsYXRpb25zPzogW251bWJlciwgbnVtYmVyXTtcbiAgYXV0b1BhZD86IE1MQXV0b1BhZDtcbiAgbGF5b3V0PzogTUxJbnB1dE9wZXJhbmRMYXlvdXQ7XG59XG5cbi8qKlxuICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZGljdGRlZi1tbHJlZHVjZW9wdGlvbnMpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTUxSZWR1Y2VPcHRpb25zIHtcbiAgYXhlcz86IG51bWJlcltdO1xuICBrZWVwRGltZW5zaW9ucz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZW51bWRlZi1tbGludGVycG9sYXRpb25tb2RlKVxuICovXG5leHBvcnQgZW51bSBNTEludGVycG9sYXRpb25Nb2RlIHtcbiAgJ25lYXJlc3QtbmVpZ2hib3InID0gJ25lYXJlc3QtbmVpZ2hib3InLFxuICAnbGluZWFyJyA9ICdsaW5lYXInXG59XG5cbi8qKlxuICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZGljdGRlZi1tbHJlc2FtcGxlb3B0aW9ucylcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNTFJlc2FtcGxlT3B0aW9ucyB7XG4gIG1vZGU/OiBNTEludGVycG9sYXRpb25Nb2RlO1xuICBzY2FsZXM/OiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgc2l6ZXM/OiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbn1cblxuLyoqXG4gKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkaWN0ZGVmLW1sc2xpY2VvcHRpb25zKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1MU2xpY2VPcHRpb25zIHtcbiAgYXhlcz86IG51bWJlcltdO1xufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RpY3RkZWYtbWxzcGxpdG9wdGlvbnMpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTUxTcGxpdE9wdGlvbnMge1xuICBheGlzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RpY3RkZWYtbWxzcXVlZXplb3B0aW9ucylcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNTFNxdWVlemVPcHRpb25zIHtcbiAgYXhlcz86IG51bWJlcltdO1xufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RpY3RkZWYtbWx0cmFuc3Bvc2VvcHRpb25zKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1MVHJhbnNwb3NlT3B0aW9ucyB7XG4gIHBlcm11dGF0aW9uPzogbnVtYmVyW107XG59XG5cbi8qKlxuICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jdHlwZWRlZmRlZi1tbG5hbWVkb3BlcmFuZHMpXG4gKi9cbmV4cG9ydCB0eXBlIE1MTmFtZWRPcGVyYW5kcyA9IFJlY29yZDxzdHJpbmcsIE1MT3BlcmFuZD47XG5cbi8qKlxuICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZGljdGRlZi1tbGJ1ZmZlcnJlc291cmNldmlldylcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNTEJ1ZmZlclJlc291cmNlVmlldyB7XG4gIHJlc291cmNlOiBXZWJHTEJ1ZmZlcjtcbiAgb2Zmc2V0PzogbnVtYmVyO1xuICBzaXplPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI3R5cGVkZWZkZWYtbWxidWZmZXJ2aWV3KVxuICovXG5leHBvcnQgdHlwZSBNTEJ1ZmZlclZpZXcgPSBBcnJheUJ1ZmZlclZpZXd8TUxCdWZmZXJSZXNvdXJjZVZpZXc7XG5cbi8qKlxuICogW3NwZWNdKGhodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2FwaS1tbGdyYXBoYnVpbGRlcilcbiAqL1xuZXhwb3J0IGNsYXNzIE1MR3JhcGhCdWlsZGVyIHtcbiAgcHJpdmF0ZSBjb250ZXh0XzogTUxDb250ZXh0O1xuXG4gIGNvbnN0cnVjdG9yKGNvbnRleHQ6IE1MQ29udGV4dCkge1xuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgY29udGV4dCBpbnN0YW5jZW9mIE1MQ29udGV4dCwgJ1RoZSBjb250ZXh0IHBhcmFtdGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5jb250ZXh0XyA9IGNvbnRleHQ7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldCBjb250ZXh0KCk6IE1MQ29udGV4dCB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dF87XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLWJ1aWxkKVxuICAgKi9cbiAgYnVpbGQob3V0cHV0czogTUxOYW1lZE9wZXJhbmRzKTogTUxHcmFwaCB7XG4gICAgcmV0dXJuIE1MR3JhcGguYnVpbGRBbmRDb21waWxlKG91dHB1dHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1pbnB1dClcbiAgICovXG4gIGlucHV0KG5hbWU6IHN0cmluZywgZGVzYzogTUxPcGVyYW5kRGVzY3JpcHRvcik6IE1MT3BlcmFuZCB7XG4gICAgcmV0dXJuIG5ldyBJbnB1dE9wZXJhbmQobmFtZSwgZGVzYywgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLWNvbnN0YW50KVxuICAgKi9cbiAgY29uc3RhbnQoZGVzYzogTUxPcGVyYW5kRGVzY3JpcHRvciwgYnVmZmVyVmlldzogTUxCdWZmZXJWaWV3KTogTUxPcGVyYW5kO1xuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLWNvbnN0YW50LXZhbHVlLXR5cGUpXG4gICAqL1xuICBjb25zdGFudCh2YWx1ZTogbnVtYmVyLCB0eXBlPzogTUxPcGVyYW5kVHlwZSk6IE1MT3BlcmFuZDtcbiAgY29uc3RhbnQoXG4gICAgICBkZXNjT3JWYWx1ZTogTUxPcGVyYW5kRGVzY3JpcHRvcnxudW1iZXIsXG4gICAgICB2YWx1ZU9yVHlwZTogTUxCdWZmZXJWaWV3fE1MT3BlcmFuZFR5cGUpOiBDb25zdGFudE9wZXJhbmQge1xuICAgIGlmICh0eXBlb2YgZGVzY09yVmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICBpZiAodmFsdWVPclR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWx1ZU9yVHlwZSA9IE1MT3BlcmFuZFR5cGUuZmxvYXQzMjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBDb25zdGFudE9wZXJhbmQuY3JlYXRlU2NhbGFyKFxuICAgICAgICAgIGRlc2NPclZhbHVlLCB2YWx1ZU9yVHlwZSBhcyBNTE9wZXJhbmRUeXBlLCB0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIENvbnN0YW50T3BlcmFuZC5jcmVhdGVUZW5zb3IoXG4gICAgICAgICAgZGVzY09yVmFsdWUsIHZhbHVlT3JUeXBlIGFzIE1MQnVmZmVyVmlldywgdGhpcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1iYXRjaG5vcm1hbGl6YXRpb24pXG4gICAqL1xuICBiYXRjaE5vcm1hbGl6YXRpb24oXG4gICAgICBpbnB1dDogTUxPcGVyYW5kLCBtZWFuOiBNTE9wZXJhbmQsIHZhcmlhbmNlOiBNTE9wZXJhbmQsXG4gICAgICBvcHRpb25zOiBNTEJhdGNoTm9ybWFsaXphdGlvbk9wdGlvbnMgPSB7fSk6IE1MT3BlcmFuZCB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFxuICAgICAgICBbaW5wdXQsIG1lYW4sIHZhcmlhbmNlLCBvcHRpb25zLnNjYWxlLCBvcHRpb25zLmJpYXNdKTtcbiAgICByZXR1cm4gKG5ldyBCYXRjaE5vcm1hbGl6YXRpb24oaW5wdXQsIG1lYW4sIHZhcmlhbmNlLCBvcHRpb25zKSlcbiAgICAgICAgLmdldEZ1c2VkT3V0cHV0cygpWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1jbGFtcClcbiAgICovXG4gIGNsYW1wKHg6IE1MT3BlcmFuZCwgb3B0aW9uczogTUxDbGFtcE9wdGlvbnMpOiBNTE9wZXJhbmQ7XG4gIGNsYW1wKG9wdGlvbnM6IE1MQ2xhbXBPcHRpb25zKTogTUxPcGVyYXRvcjtcbiAgY2xhbXAoXG4gICAgICBvcGVyYW5kT3JPcHRpb25zOiBNTE9wZXJhbmR8TUxDbGFtcE9wdGlvbnMgPSB7fSxcbiAgICAgIG9wdGlvbnM6IE1MQ2xhbXBPcHRpb25zID0ge30pOiBNTE9wZXJhbmR8TUxPcGVyYXRvciB7XG4gICAgaWYgKG9wZXJhbmRPck9wdGlvbnMgaW5zdGFuY2VvZiBNTE9wZXJhbmQpIHtcbiAgICAgIGNvbnN0IHggPSBvcGVyYW5kT3JPcHRpb25zO1xuICAgICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFt4LCBvcHRpb25zLm1pblZhbHVlLCBvcHRpb25zLm1heFZhbHVlXSk7XG4gICAgICByZXR1cm4gKG5ldyBDbGFtcCh4LCBvcHRpb25zKSkub3V0cHV0O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBvcHRpb25zID0gb3BlcmFuZE9yT3B0aW9ucztcbiAgICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihbb3B0aW9ucy5taW5WYWx1ZSwgb3B0aW9ucy5tYXhWYWx1ZV0pO1xuICAgICAgcmV0dXJuIChuZXcgQ2xhbXAodW5kZWZpbmVkLCBvcHRpb25zKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1jb25jYXQpXG4gICAqL1xuICBjb25jYXQoaW5wdXRzOiBNTE9wZXJhbmRbXSwgYXhpczogbnVtYmVyKTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoaW5wdXRzKTtcbiAgICByZXR1cm4gKG5ldyBDb25jYXQoaW5wdXRzLCBheGlzKSkub3V0cHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1jb252MmQpXG4gICAqL1xuICBjb252MmQoaW5wdXQ6IE1MT3BlcmFuZCwgZmlsdGVyOiBNTE9wZXJhbmQsIG9wdGlvbnM6IE1MQ29udjJkT3B0aW9ucyA9IHt9KTpcbiAgICAgIE1MT3BlcmFuZCB7XG4gICAgY29uc3QgaW5wdXRzID0gW2lucHV0LCBmaWx0ZXJdO1xuICAgIGlmIChvcHRpb25zLmJpYXMpIHtcbiAgICAgIGlucHV0cy5wdXNoKG9wdGlvbnMuYmlhcyk7XG4gICAgfVxuICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihpbnB1dHMpO1xuICAgIHJldHVybiAobmV3IENvbnYyZChpbnB1dCwgZmlsdGVyLCBvcHRpb25zKSkuZ2V0RnVzZWRPdXRwdXRzKClbMF07XG4gIH1cblxuICAvLyBzdGFydCBvZiBlbGVtZW50LXdpc2UgYmluYXJ5IG9wZXJhdGlvbnNcbiAgLy8gaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNhcGktbWxncmFwaGJ1aWxkZXItYmluYXJ5XG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItYWRkKVxuICAgKi9cbiAgYWRkKGE6IE1MT3BlcmFuZCwgYjogTUxPcGVyYW5kKTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW2EsIGJdKTtcbiAgICByZXR1cm4gKG5ldyBBZGQoYSwgYikpLm91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItc3ViKVxuICAgKi9cbiAgc3ViKGE6IE1MT3BlcmFuZCwgYjogTUxPcGVyYW5kKTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW2EsIGJdKTtcbiAgICByZXR1cm4gKG5ldyBTdWIoYSwgYikpLm91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItbXVsKVxuICAgKi9cbiAgbXVsKGE6IE1MT3BlcmFuZCwgYjogTUxPcGVyYW5kKTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW2EsIGJdKTtcbiAgICByZXR1cm4gKG5ldyBNdWwoYSwgYikpLm91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItZGl2KVxuICAgKi9cbiAgZGl2KGE6IE1MT3BlcmFuZCwgYjogTUxPcGVyYW5kKTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW2EsIGJdKTtcbiAgICByZXR1cm4gKG5ldyBEaXYoYSwgYikpLm91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItbWF4KVxuICAgKi9cbiAgbWF4KGE6IE1MT3BlcmFuZCwgYjogTUxPcGVyYW5kKTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW2EsIGJdKTtcbiAgICByZXR1cm4gKG5ldyBNYXgoYSwgYikpLm91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItbWluKVxuICAgKi9cbiAgbWluKGE6IE1MT3BlcmFuZCwgYjogTUxPcGVyYW5kKTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW2EsIGJdKTtcbiAgICByZXR1cm4gKG5ldyBNaW4oYSwgYikpLm91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItcG93KVxuICAgKlxuICAgKi9cbiAgcG93KGE6IE1MT3BlcmFuZCwgYjogTUxPcGVyYW5kKTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW2EsIGJdKTtcbiAgICByZXR1cm4gKG5ldyBQb3coYSwgYikpLm91dHB1dDtcbiAgfVxuICAvLyBlbmQgb2YgZWxlbWVudC13aXNlIGJpbmFyeSBvcGVyYXRpb25zXG5cbiAgLy8gc3RhcnQgb2YgZWxlbWVudC13aXNlIHVuYXJ5IG9wZXJhdGlvbnNcbiAgLy8gaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItdW5hcnlcbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1leHApXG4gICAqL1xuICBleHAoeDogTUxPcGVyYW5kKTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW3hdKTtcbiAgICByZXR1cm4gKG5ldyBFeHAoeCkpLm91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItaGFyZC1zd2lzaClcbiAgICovXG4gIGhhcmRTd2lzaChpbnB1dDogTUxPcGVyYW5kKTogTUxPcGVyYW5kO1xuICBoYXJkU3dpc2goKTogTUxPcGVyYXRvcjtcbiAgaGFyZFN3aXNoKGlucHV0OiBNTE9wZXJhbmQgPSB1bmRlZmluZWQpOiBNTE9wZXJhbmR8TUxPcGVyYXRvciB7XG4gICAgaWYgKGlucHV0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBuZXcgSGFyZFN3aXNoKHVuZGVmaW5lZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihbaW5wdXRdKTtcbiAgICAgIHJldHVybiAobmV3IEhhcmRTd2lzaChpbnB1dCkpLm91dHB1dDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLXJlbHUpXG4gICAqL1xuICByZWx1KGlucHV0OiBNTE9wZXJhbmQpOiBNTE9wZXJhbmQ7XG4gIHJlbHUoKTogTUxPcGVyYXRvcjtcbiAgcmVsdShpbnB1dDogTUxPcGVyYW5kID0gdW5kZWZpbmVkKTogTUxPcGVyYW5kfE1MT3BlcmF0b3Ige1xuICAgIGlmIChpbnB1dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbmV3IFJlbHUodW5kZWZpbmVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFtpbnB1dF0pO1xuICAgICAgcmV0dXJuIChuZXcgUmVsdShpbnB1dCkpLm91dHB1dDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLXNpZ21vaWQpXG4gICAqL1xuICBzaWdtb2lkKGlucHV0OiBNTE9wZXJhbmQpOiBNTE9wZXJhbmQ7XG4gIHNpZ21vaWQoKTogTUxPcGVyYXRvcjtcbiAgc2lnbW9pZChpbnB1dDogTUxPcGVyYW5kID0gdW5kZWZpbmVkKTogTUxPcGVyYW5kfE1MT3BlcmF0b3Ige1xuICAgIGlmIChpbnB1dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbmV3IFNpZ21vaWQodW5kZWZpbmVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFtpbnB1dF0pO1xuICAgICAgcmV0dXJuIChuZXcgU2lnbW9pZChpbnB1dCkpLm91dHB1dDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLXRhbmgpXG4gICAqL1xuICB0YW5oKGlucHV0OiBNTE9wZXJhbmQpOiBNTE9wZXJhbmQ7XG4gIHRhbmgoKTogTUxPcGVyYXRvcjtcbiAgdGFuaChpbnB1dDogTUxPcGVyYW5kID0gdW5kZWZpbmVkKTogTUxPcGVyYW5kfE1MT3BlcmF0b3Ige1xuICAgIGlmIChpbnB1dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbmV3IFRhbmgodW5kZWZpbmVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFtpbnB1dF0pO1xuICAgICAgcmV0dXJuIChuZXcgVGFuaChpbnB1dCkpLm91dHB1dDtcbiAgICB9XG4gIH1cbiAgLy8gZW5kIG9mIGVsZW1lbnQtd2lzZSB1bmFyeSBvcGVyYXRpb25zXG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1nZW1tKVxuICAgKi9cbiAgZ2VtbShhOiBNTE9wZXJhbmQsIGI6IE1MT3BlcmFuZCwgb3B0aW9uczogTUxHZW1tT3B0aW9ucyA9IHt9KTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW2EsIGIsIG9wdGlvbnMuY10pO1xuICAgIHJldHVybiBHZW1tLmJ1aWxkKHRoaXMsIGEsIGIsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1ncnUpXG4gICAqL1xuICBncnUoaW5wdXQ6IE1MT3BlcmFuZCwgd2VpZ2h0OiBNTE9wZXJhbmQsIHJlY3VycmVudFdlaWdodDogTUxPcGVyYW5kLFxuICAgICAgc3RlcHM6IG51bWJlciwgaGlkZGVuU2l6ZTogbnVtYmVyLFxuICAgICAgb3B0aW9uczogTUxHcnVPcHRpb25zID0ge30pOiBNTE9wZXJhbmRbXSB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFtcbiAgICAgIGlucHV0LCB3ZWlnaHQsIHJlY3VycmVudFdlaWdodCwgb3B0aW9ucy5iaWFzLCBvcHRpb25zLnJlY3VycmVudEJpYXMsXG4gICAgICBvcHRpb25zLmluaXRpYWxIaWRkZW5TdGF0ZVxuICAgIF0pO1xuICAgIHJldHVybiAobmV3IEdydShpbnB1dCwgd2VpZ2h0LCByZWN1cnJlbnRXZWlnaHQsIHN0ZXBzLCBoaWRkZW5TaXplLCBvcHRpb25zKSlcbiAgICAgICAgLm91dHB1dHM7XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLWdydWNlbGwpXG4gICAqL1xuICBncnVDZWxsKFxuICAgICAgaW5wdXQ6IE1MT3BlcmFuZCwgd2VpZ2h0OiBNTE9wZXJhbmQsIHJlY3VycmVudFdlaWdodDogTUxPcGVyYW5kLFxuICAgICAgaGlkZGVuU3RhdGU6IE1MT3BlcmFuZCwgaGlkZGVuU2l6ZTogbnVtYmVyLFxuICAgICAgb3B0aW9uczogTUxHcnVDZWxsT3B0aW9ucyA9IHt9KTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW1xuICAgICAgaW5wdXQsIHdlaWdodCwgcmVjdXJyZW50V2VpZ2h0LCBoaWRkZW5TdGF0ZSwgb3B0aW9ucy5iaWFzLFxuICAgICAgb3B0aW9ucy5yZWN1cnJlbnRCaWFzXG4gICAgXSk7XG4gICAgcmV0dXJuIChuZXcgR3J1Q2VsbChcbiAgICAgICAgICAgICAgICBpbnB1dCwgd2VpZ2h0LCByZWN1cnJlbnRXZWlnaHQsIGhpZGRlblN0YXRlLCBoaWRkZW5TaXplLFxuICAgICAgICAgICAgICAgIG9wdGlvbnMpKVxuICAgICAgICAub3V0cHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2FwaS1tbGdyYXBoYnVpbGRlci1pbnN0YW5jZW5vcm0pXG4gICAqL1xuICBpbnN0YW5jZU5vcm1hbGl6YXRpb24oXG4gICAgICBpbnB1dDogTUxPcGVyYW5kLFxuICAgICAgb3B0aW9uczogTUxJbnN0YW5jZU5vcm1hbGl6YXRpb25PcHRpb25zID0ge30pOiBNTE9wZXJhbmQge1xuICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihbaW5wdXQsIG9wdGlvbnMuYmlhcywgb3B0aW9ucy5zY2FsZV0pO1xuICAgIHJldHVybiAobmV3IEluc3RhbmNlTm9ybWFsaXphdGlvbihpbnB1dCwgb3B0aW9ucykpLm91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItbGVha3lyZWx1KVxuICAgKi9cbiAgbGVha3lSZWx1KHg6IE1MT3BlcmFuZCwgb3B0aW9uczogTUxMZWFreVJlbHVPcHRpb25zKTogTUxPcGVyYW5kO1xuICBsZWFreVJlbHUob3B0aW9uczogTUxMZWFreVJlbHVPcHRpb25zKTogTUxPcGVyYXRvcjtcbiAgbGVha3lSZWx1KFxuICAgICAgb3BlcmFuZE9yT3B0aW9uczogTUxPcGVyYW5kfE1MTGVha3lSZWx1T3B0aW9ucyA9IHt9LFxuICAgICAgb3B0aW9uczogTUxMZWFreVJlbHVPcHRpb25zID0ge30pOiBNTE9wZXJhbmR8TUxPcGVyYXRvciB7XG4gICAgaWYgKG9wZXJhbmRPck9wdGlvbnMgaW5zdGFuY2VvZiBNTE9wZXJhbmQpIHtcbiAgICAgIGNvbnN0IHggPSBvcGVyYW5kT3JPcHRpb25zO1xuICAgICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFt4XSk7XG4gICAgICByZXR1cm4gKG5ldyBMZWFreVJlbHUoeCwgb3B0aW9ucy5hbHBoYSkpLm91dHB1dDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IG9wZXJhbmRPck9wdGlvbnM7XG4gICAgICByZXR1cm4gKG5ldyBMZWFreVJlbHUodW5kZWZpbmVkLCBvcHRpb25zLmFscGhhKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1tYXRtdWwpXG4gICAqL1xuICBtYXRtdWwoYTogTUxPcGVyYW5kLCBiOiBNTE9wZXJhbmQpOiBNTE9wZXJhbmQge1xuICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihbYSwgYl0pO1xuICAgIHJldHVybiAobmV3IE1hdE11bChhLCBiKSkub3V0cHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2FwaS1tbGdyYXBoYnVpbGRlci1wYWQpXG4gICAqL1xuICBwYWQoaW5wdXQ6IE1MT3BlcmFuZCwgcGFkZGluZzogTUxPcGVyYW5kLFxuICAgICAgb3B0aW9uczogTUxQYWRPcHRpb25zID0ge30pOiBNTE9wZXJhbmQge1xuICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihbaW5wdXQsIHBhZGRpbmddKTtcbiAgICByZXR1cm4gKG5ldyBQYWQoaW5wdXQsIHBhZGRpbmcsIG9wdGlvbnMpKS5vdXRwdXQ7XG4gIH1cblxuICAvLyBzdGFydCBvZiBwb29saW5nIG9wZXJhdGlvbnNcbiAgLy8gaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItcG9vbDJkXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItYXZlcmFnZXBvb2wyZClcbiAgICovXG4gIGF2ZXJhZ2VQb29sMmQoaW5wdXQ6IE1MT3BlcmFuZCwgb3B0aW9uczogTUxQb29saW5nMmRPcHRpb25zID0ge30pOiBNTE9wZXJhbmQge1xuICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihbaW5wdXRdKTtcbiAgICByZXR1cm4gKG5ldyBBdmVyYWdlUG9vbDJkKGlucHV0LCBvcHRpb25zKSkub3V0cHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1sMnBvb2wyZClcbiAgICovXG4gIGwyUG9vbDJkKGlucHV0OiBNTE9wZXJhbmQsIG9wdGlvbnM6IE1MUG9vbGluZzJkT3B0aW9ucyA9IHt9KTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW2lucHV0XSk7XG4gICAgcmV0dXJuIChuZXcgTDJQb29sMmQoaW5wdXQsIG9wdGlvbnMpKS5vdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLW1heHBvb2wyZClcbiAgICovXG4gIG1heFBvb2wyZChpbnB1dDogTUxPcGVyYW5kLCBvcHRpb25zOiBNTFBvb2xpbmcyZE9wdGlvbnMgPSB7fSk6IE1MT3BlcmFuZCB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFtpbnB1dF0pO1xuICAgIHJldHVybiAobmV3IE1heFBvb2wyZChpbnB1dCwgb3B0aW9ucykpLm91dHB1dDtcbiAgfVxuICAvLyBlbmQgb2YgcG9vbGluZyBvcGVyYXRpb25zXG5cbiAgLy8gc3RhcnQgb2YgcmVkdWN0aW9uIG9wZXJhdGlvbnNcbiAgLy8gaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNhcGktbWxncmFwaGJ1aWxkZXItcmVkdWNlXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItcmVkdWNlbDEpXG4gICAqL1xuICByZWR1Y2VMMShpbnB1dDogTUxPcGVyYW5kLCBvcHRpb25zOiBNTFJlZHVjZU9wdGlvbnMgPSB7fSk6IE1MT3BlcmFuZCB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFtpbnB1dF0pO1xuICAgIHJldHVybiAobmV3IFJlZHVjZUwxKGlucHV0LCBvcHRpb25zKSkub3V0cHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1yZWR1Y2VsMilcbiAgICovXG4gIHJlZHVjZUwyKGlucHV0OiBNTE9wZXJhbmQsIG9wdGlvbnM6IE1MUmVkdWNlT3B0aW9ucyA9IHt9KTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW2lucHV0XSk7XG4gICAgcmV0dXJuIChuZXcgUmVkdWNlTDIoaW5wdXQsIG9wdGlvbnMpKS5vdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLXJlZHVjZWxvZ3N1bWV4cClcbiAgICovXG4gIHJlZHVjZUxvZ1N1bUV4cChpbnB1dDogTUxPcGVyYW5kLCBvcHRpb25zOiBNTFJlZHVjZU9wdGlvbnMgPSB7fSk6IE1MT3BlcmFuZCB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFtpbnB1dF0pO1xuICAgIHJldHVybiAobmV3IFJlZHVjZUxvZ1N1bUV4cChpbnB1dCwgb3B0aW9ucykpLm91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItcmVkdWNlbWF4KVxuICAgKi9cbiAgcmVkdWNlTWF4KGlucHV0OiBNTE9wZXJhbmQsIG9wdGlvbnM6IE1MUmVkdWNlT3B0aW9ucyA9IHt9KTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW2lucHV0XSk7XG4gICAgcmV0dXJuIChuZXcgUmVkdWNlTWF4KGlucHV0LCBvcHRpb25zKSkub3V0cHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1yZWR1Y2VtZWFuKVxuICAgKi9cbiAgcmVkdWNlTWVhbihpbnB1dDogTUxPcGVyYW5kLCBvcHRpb25zOiBNTFJlZHVjZU9wdGlvbnMgPSB7fSk6IE1MT3BlcmFuZCB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFtpbnB1dF0pO1xuICAgIHJldHVybiAobmV3IFJlZHVjZU1lYW4oaW5wdXQsIG9wdGlvbnMpKS5vdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLXJlZHVjZW1pbilcbiAgICovXG4gIHJlZHVjZU1pbihpbnB1dDogTUxPcGVyYW5kLCBvcHRpb25zOiBNTFJlZHVjZU9wdGlvbnMgPSB7fSk6IE1MT3BlcmFuZCB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFtpbnB1dF0pO1xuICAgIHJldHVybiAobmV3IFJlZHVjZU1pbihpbnB1dCwgb3B0aW9ucykpLm91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItcmVkdWNlcHJvZHVjdClcbiAgICovXG4gIHJlZHVjZVByb2R1Y3QoaW5wdXQ6IE1MT3BlcmFuZCwgb3B0aW9uczogTUxSZWR1Y2VPcHRpb25zID0ge30pOiBNTE9wZXJhbmQge1xuICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihbaW5wdXRdKTtcbiAgICByZXR1cm4gKG5ldyBSZWR1Y2VQcm9kdWN0KGlucHV0LCBvcHRpb25zKSkub3V0cHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1yZWR1Y2VzdW0pXG4gICAqL1xuICByZWR1Y2VTdW0oaW5wdXQ6IE1MT3BlcmFuZCwgb3B0aW9uczogTUxSZWR1Y2VPcHRpb25zID0ge30pOiBNTE9wZXJhbmQge1xuICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihbaW5wdXRdKTtcbiAgICByZXR1cm4gKG5ldyBSZWR1Y2VTdW0oaW5wdXQsIG9wdGlvbnMpKS5vdXRwdXQ7XG4gIH1cbiAgLy8gZW5kIG9mIHJlZHVjdGlvbiBvcGVyYXRpb25zXG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2FwaS1tbGdyYXBoYnVpbGRlci1yZXNhbXBsZSlcbiAgICovXG4gIHJlc2FtcGxlKGlucHV0OiBNTE9wZXJhbmQsIG9wdGlvbnM6IE1MUmVzYW1wbGVPcHRpb25zID0ge30pOiBNTE9wZXJhbmQge1xuICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihbaW5wdXRdKTtcbiAgICByZXR1cm4gKG5ldyBSZXNhbXBsZShpbnB1dCwgb3B0aW9ucykpLm91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItcmVzaGFwZSlcbiAgICovXG4gIHJlc2hhcGUoaW5wdXQ6IE1MT3BlcmFuZCwgbmV3U2hhcGU6IG51bWJlcltdKTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW2lucHV0XSk7XG4gICAgcmV0dXJuIChuZXcgUmVzaGFwZShpbnB1dCwgbmV3U2hhcGUpKS5vdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLXNsaWNlKVxuICAgKi9cbiAgc2xpY2UoXG4gICAgICBpbnB1dDogTUxPcGVyYW5kLCBzdGFydHM6IG51bWJlcltdLCBzaXplczogbnVtYmVyW10sXG4gICAgICBvcHRpb25zOiBNTFNsaWNlT3B0aW9ucyA9IHt9KTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW2lucHV0XSk7XG4gICAgcmV0dXJuIChuZXcgU2xpY2UoaW5wdXQsIHN0YXJ0cywgc2l6ZXMsIG9wdGlvbnMuYXhlcykpLm91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItc29mdG1heClcbiAgICovXG4gIHNvZnRtYXgoeDogTUxPcGVyYW5kKTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW3hdKTtcbiAgICByZXR1cm4gKG5ldyBTb2Z0bWF4KHgpKS5vdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLXNwbGl0KVxuICAgKi9cbiAgc3BsaXQoXG4gICAgICBpbnB1dDogTUxPcGVyYW5kLCBzcGxpdHM6IG51bWJlcnxudW1iZXJbXSxcbiAgICAgIG9wdGlvbnM6IE1MU3BsaXRPcHRpb25zID0ge30pOiBNTE9wZXJhbmRbXSB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFtpbnB1dF0pO1xuICAgIHJldHVybiAobmV3IFNwbGl0KGlucHV0LCBzcGxpdHMsIG9wdGlvbnMpKS5vdXRwdXRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1zcXVlZXplKVxuICAgKi9cbiAgc3F1ZWV6ZShpbnB1dDogTUxPcGVyYW5kLCBvcHRpb25zOiBNTFNxdWVlemVPcHRpb25zID0ge30pOiBNTE9wZXJhbmQge1xuICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihbaW5wdXRdKTtcbiAgICByZXR1cm4gKG5ldyBTcXVlZXplKGlucHV0LCBvcHRpb25zLmF4ZXMpKS5vdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLXRyYW5zcG9zZSlcbiAgICovXG4gIHRyYW5zcG9zZShpbnB1dDogTUxPcGVyYW5kLCBvcHRpb25zOiBNTFRyYW5zcG9zZU9wdGlvbnMgPSB7fSk6IE1MT3BlcmFuZCB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFtpbnB1dF0pO1xuICAgIHJldHVybiAobmV3IFRyYW5zcG9zZShpbnB1dCwgb3B0aW9ucy5wZXJtdXRhdGlvbikpLm91dHB1dDtcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVPcGVyYW5kQnVpbGRlcihvcGVyYW5kczogTUxPcGVyYW5kW10pIHtcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIG9wZXJhbmRzLmV2ZXJ5KFxuICAgICAgICAgICAgb3BlcmFuZCA9PiBvcGVyYW5kID9cbiAgICAgICAgICAgICAgICAob3BlcmFuZCBpbnN0YW5jZW9mIE1MT3BlcmFuZCAmJiBvcGVyYW5kLmJ1aWxkZXIgPT09IHRoaXMpIDpcbiAgICAgICAgICAgICAgICB0cnVlKSxcbiAgICAgICAgJ1RoZSBvcGVyYW5kIGlzIG5vdCBidWlsdCBieSB0aGlzIGJ1aWxkZXIuJyk7XG4gIH1cbn1cbiIsImltcG9ydCB7TUxCdWZmZXJWaWV3LCBNTEdyYXBoQnVpbGRlcn0gZnJvbSAnLi9ncmFwaF9idWlsZGVyJztcbmltcG9ydCB7T3BlcmF0aW9ufSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge0FycmF5QnVmZmVyVmlld30gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNlbnVtZGVmLW1sb3BlcmFuZHR5cGUpXG4gKi9cbmV4cG9ydCBlbnVtIE1MT3BlcmFuZFR5cGUge1xuICAnZmxvYXQzMicgPSAnZmxvYXQzMicsXG4gICdmbG9hdDE2JyA9ICdmbG9hdDE2JyxcbiAgJ2ludDMyJyA9ICdpbnQzMicsXG4gICd1aW50MzInID0gJ3VpbnQzMicsXG4gICdpbnQ4JyA9ICdpbnQ4JyxcbiAgJ3VpbnQ4JyA9ICd1aW50OCdcbn1cblxuLyoqXG4gKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkaWN0ZGVmLW1sb3BlcmFuZGRlc2NyaXB0b3IpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTUxPcGVyYW5kRGVzY3JpcHRvciB7XG4gIHR5cGU6IE1MT3BlcmFuZFR5cGU7XG4gIGRpbWVuc2lvbnM6IG51bWJlcltdO1xufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2FwaS1tbG9wZXJhbmQpXG4gKi9cbmV4cG9ydCBjbGFzcyBNTE9wZXJhbmQge1xuICBwcml2YXRlIHJlYWRvbmx5IGJ1aWxkZXJfOiBNTEdyYXBoQnVpbGRlcjtcblxuICAvKiogQGludGVybmFsICovXG4gIGdldCBidWlsZGVyKCk6IE1MR3JhcGhCdWlsZGVyIHtcbiAgICByZXR1cm4gdGhpcy5idWlsZGVyXztcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgY29uc3RydWN0b3IoYnVpbGRlcjogTUxHcmFwaEJ1aWxkZXIpIHtcbiAgICB0aGlzLmJ1aWxkZXJfID0gYnVpbGRlcjtcbiAgfVxufVxuXG4vKiogQGludGVybmFsICovXG5leHBvcnQgY2xhc3MgSW5wdXRPcGVyYW5kIGV4dGVuZHMgTUxPcGVyYW5kIHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBkZXNjOiBNTE9wZXJhbmREZXNjcmlwdG9yO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgbmFtZTogc3RyaW5nLCBkZXNjOiBNTE9wZXJhbmREZXNjcmlwdG9yLCBidWlsZGVyOiBNTEdyYXBoQnVpbGRlcikge1xuICAgIHN1cGVyKGJ1aWxkZXIpO1xuICAgIHV0aWxzLmFzc2VydCh0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycsICdUaGUgbmFtZSBwYXJhbWV0ZXIgaXMgaW52YWxpZCcpO1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kRGVzY3JpcHRvcihkZXNjKTtcbiAgICB0aGlzLmRlc2MgPSBkZXNjO1xuICB9XG59XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBjbGFzcyBDb25zdGFudE9wZXJhbmQgZXh0ZW5kcyBNTE9wZXJhbmQge1xuICByZWFkb25seSBkZXNjOiBNTE9wZXJhbmREZXNjcmlwdG9yO1xuICByZWFkb25seSB2YWx1ZTogbnVtYmVyfEFycmF5QnVmZmVyVmlldztcblxuICBzdGF0aWMgY3JlYXRlU2NhbGFyKFxuICAgICAgdmFsdWU6IG51bWJlciwgdHlwZTogTUxPcGVyYW5kVHlwZSA9IE1MT3BlcmFuZFR5cGUuZmxvYXQzMixcbiAgICAgIGJ1aWxkZXI6IE1MR3JhcGhCdWlsZGVyKTogQ29uc3RhbnRPcGVyYW5kIHtcbiAgICB1dGlscy5hc3NlcnQodHlwZSBpbiBNTE9wZXJhbmRUeXBlLCAnVGhlIG9wZXJhbmQgdHlwZSBpcyBpbnZhbGlkLicpO1xuICAgIHV0aWxzLnZhbGlkYXRlVmFsdWVUeXBlKHZhbHVlLCB0eXBlKTtcbiAgICByZXR1cm4gbmV3IENvbnN0YW50T3BlcmFuZCh7dHlwZX0gYXMgTUxPcGVyYW5kRGVzY3JpcHRvciwgdmFsdWUsIGJ1aWxkZXIpO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVRlbnNvcihcbiAgICAgIGRlc2M6IE1MT3BlcmFuZERlc2NyaXB0b3IsIHZhbHVlOiBNTEJ1ZmZlclZpZXcsXG4gICAgICBidWlsZGVyOiBNTEdyYXBoQnVpbGRlcik6IENvbnN0YW50T3BlcmFuZCB7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICB1dGlscy5pc1R5cGVkQXJyYXkodmFsdWUpLFxuICAgICAgICAnT25seSBBcnJheUJ1ZmZlclZpZXcgdmFsdWUgdHlwZSBpcyBzdXBwb3J0ZWQuJyk7XG4gICAgY29uc3QgYXJyYXkgPSB2YWx1ZSBhcyBBcnJheUJ1ZmZlclZpZXc7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kRGVzY3JpcHRvcihkZXNjKTtcbiAgICB1dGlscy52YWxpZGF0ZVR5cGVkQXJyYXkoYXJyYXksIGRlc2MudHlwZSwgZGVzYy5kaW1lbnNpb25zKTtcbiAgICByZXR1cm4gbmV3IENvbnN0YW50T3BlcmFuZChkZXNjLCBhcnJheSwgYnVpbGRlcik7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgICAgZGVzYzogTUxPcGVyYW5kRGVzY3JpcHRvciwgdmFsdWU6IG51bWJlcnxBcnJheUJ1ZmZlclZpZXcsXG4gICAgICBidWlsZGVyOiBNTEdyYXBoQnVpbGRlcikge1xuICAgIHN1cGVyKGJ1aWxkZXIpO1xuICAgIHRoaXMuZGVzYyA9IGRlc2M7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9XG59XG5cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgT3V0cHV0T3BlcmFuZCBleHRlbmRzIE1MT3BlcmFuZCB7XG4gIHJlYWRvbmx5IG9wZXJhdGlvbjogT3BlcmF0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKG9wZXJhdGlvbjogT3BlcmF0aW9uKSB7XG4gICAgc3VwZXIob3BlcmF0aW9uLmJ1aWxkZXIpO1xuICAgIHRoaXMub3BlcmF0aW9uID0gb3BlcmF0aW9uO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyB0ZiBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge0V4ZWN1dGlvbkNvbnRleHR9IGZyb20gJy4vZ3JhcGgnO1xuaW1wb3J0IHtNTEdyYXBoQnVpbGRlcn0gZnJvbSAnLi9ncmFwaF9idWlsZGVyJztcbmltcG9ydCB7TUxPcGVyYW5kLCBPdXRwdXRPcGVyYW5kfSBmcm9tICcuL29wZXJhbmQnO1xuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2FwaS1tbG9wZXJhdG9yKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1MT3BlcmF0b3Ige1xuICAvKiogQGludGVybmFsICovXG4gIGFwcGx5KGlucHV0OiBNTE9wZXJhbmQpOiBPdXRwdXRPcGVyYW5kO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcnVuT3AoeDogdGYuVGVuc29yKTogdGYuVGVuc29yO1xufVxuXG4vKiogQGludGVybmFsICovXG5leHBvcnQgaW50ZXJmYWNlIEZ1c2VkT3BlcmF0aW9uIHtcbiAgZ2V0RnVzZWRPdXRwdXRzKCk6IE91dHB1dE9wZXJhbmRbXTtcbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE9wZXJhdGlvbiB7XG4gIHByb3RlY3RlZCBidWlsZGVyXzogTUxHcmFwaEJ1aWxkZXI7XG4gIHByb3RlY3RlZCBvdXRwdXRzXzogT3V0cHV0T3BlcmFuZFtdID0gW107XG5cbiAgZ2V0IGJ1aWxkZXIoKTogTUxHcmFwaEJ1aWxkZXIge1xuICAgIHJldHVybiB0aGlzLmJ1aWxkZXJfO1xuICB9XG5cbiAgZ2V0IG91dHB1dHMoKTogT3V0cHV0T3BlcmFuZFtdIHtcbiAgICByZXR1cm4gdGhpcy5vdXRwdXRzXztcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGJ1aWxkZXI6IE1MR3JhcGhCdWlsZGVyKSB7XG4gICAgdGhpcy5idWlsZGVyXyA9IGJ1aWxkZXI7XG4gIH1cblxuICBhYnN0cmFjdCBpbnB1dHMoKTogTUxPcGVyYW5kW107XG5cbiAgY29tcHV0ZShjb250ZXh0OiBFeGVjdXRpb25Db250ZXh0KTogdm9pZCB7XG4gICAgY29uc3QgaW5wdXRUZW5zb3JzOiBNYXA8TUxPcGVyYW5kLCB0Zi5UZW5zb3I+ID0gbmV3IE1hcCgpO1xuICAgIGZvciAoY29uc3QgaW5wdXRPcGVyYW5kIG9mIHRoaXMuaW5wdXRzKCkpIHtcbiAgICAgIGlucHV0VGVuc29ycy5zZXQoaW5wdXRPcGVyYW5kLCBjb250ZXh0LmdldFRlbnNvcihpbnB1dE9wZXJhbmQpKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0cHV0VGVuc29ycyA9IHRmLnRpZHkoKCkgPT4gdGhpcy5jb21wdXRlSW1wbChpbnB1dFRlbnNvcnMpKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3V0cHV0c18ubGVuZ3RoOyArK2kpIHtcbiAgICAgIGNvbnRleHQuc2V0T3V0cHV0VGVuc29yKHRoaXMub3V0cHV0c19baV0sIG91dHB1dFRlbnNvcnNbaV0pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGlucHV0T3BlcmFuZCBvZiB0aGlzLmlucHV0cygpKSB7XG4gICAgICBjb250ZXh0LnJlbGVhc2VUZW5zb3IoaW5wdXRPcGVyYW5kKTtcbiAgICB9XG4gIH1cblxuICBhYnN0cmFjdCBjb21wdXRlSW1wbChpbnB1dFRlbnNvcnM6IE1hcDxNTE9wZXJhbmQsIHRmLlRlbnNvcj4pOiB0Zi5UZW5zb3JbXTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIGRpc3Bvc2UoKTogdm9pZCB7fVxufVxuXG4vKiogQGludGVybmFsICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgU2luZ2xlT3V0cHV0T3BlcmF0aW9uIGV4dGVuZHMgT3BlcmF0aW9uIHtcbiAgY29uc3RydWN0b3IoYnVpbGRlcjogTUxHcmFwaEJ1aWxkZXIpIHtcbiAgICBzdXBlcihidWlsZGVyKTtcbiAgICBpZiAoYnVpbGRlcikge1xuICAgICAgdGhpcy5jcmVhdGVPdXRwdXQoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlT3V0cHV0KCk6IHZvaWQge1xuICAgIC8vIE9wZXJhdGlvbiBwcm9kdWNlcyAxIG91dHB1dCBvcGVyYW5kIGJ5IGRlZmF1bHQuXG4gICAgdGhpcy5vdXRwdXRzXy5wdXNoKG5ldyBPdXRwdXRPcGVyYW5kKHRoaXMpKTtcbiAgfVxuXG4gIGdldCBvdXRwdXQoKTogT3V0cHV0T3BlcmFuZCB7XG4gICAgcmV0dXJuIHRoaXMub3V0cHV0c19bMF07XG4gIH1cblxuICBjb21wdXRlSW1wbChpbnB1dFRlbnNvcnM6IE1hcDxNTE9wZXJhbmQsIHRmLlRlbnNvcj4pOiB0Zi5UZW5zb3JbXSB7XG4gICAgcmV0dXJuIFt0aGlzLnJ1bihpbnB1dFRlbnNvcnMpXTtcbiAgfVxuXG4gIGFic3RyYWN0IHJ1bihpbnB1dFRlbnNvcnM6IE1hcDxNTE9wZXJhbmQsIHRmLlRlbnNvcj4pOiB0Zi5UZW5zb3I7XG59IiwiaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNTEJhdGNoTm9ybWFsaXphdGlvbk9wdGlvbnN9IGZyb20gJy4uL2dyYXBoX2J1aWxkZXInO1xuaW1wb3J0IHtNTE9wZXJhbmQsIE91dHB1dE9wZXJhbmR9IGZyb20gJy4uL29wZXJhbmQnO1xuaW1wb3J0IHtGdXNlZE9wZXJhdGlvbiwgTUxPcGVyYXRvciwgU2luZ2xlT3V0cHV0T3BlcmF0aW9ufSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgQmF0Y2hOb3JtYWxpemF0aW9uIGV4dGVuZHMgU2luZ2xlT3V0cHV0T3BlcmF0aW9uIGltcGxlbWVudHNcbiAgICBGdXNlZE9wZXJhdGlvbiB7XG4gIHByaXZhdGUgaW5wdXRfOiBNTE9wZXJhbmQ7XG4gIHByaXZhdGUgbWVhbl86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSB2YXJpYW5jZV86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSBzY2FsZV8/OiBNTE9wZXJhbmQ7XG4gIHByaXZhdGUgYmlhc18/OiBNTE9wZXJhbmQ7XG4gIHByaXZhdGUgYXhpc18/OiBudW1iZXI7XG4gIHByaXZhdGUgZXBzaWxvbl8/OiBudW1iZXI7XG4gIHByaXZhdGUgYWN0aXZhdGlvbl8/OiBNTE9wZXJhdG9yO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgaW5wdXQ6IE1MT3BlcmFuZCwgbWVhbjogTUxPcGVyYW5kLCB2YXJpYW5jZTogTUxPcGVyYW5kLFxuICAgICAgb3B0aW9uczogTUxCYXRjaE5vcm1hbGl6YXRpb25PcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihpbnB1dC5idWlsZGVyKTtcbiAgICB1dGlscy52YWxpZGF0ZU9wZXJhbmQoaW5wdXQpO1xuICAgIHRoaXMuaW5wdXRfID0gaW5wdXQ7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKG1lYW4pO1xuICAgIHRoaXMubWVhbl8gPSBtZWFuO1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZCh2YXJpYW5jZSk7XG4gICAgdGhpcy52YXJpYW5jZV8gPSB2YXJpYW5jZTtcbiAgICB1dGlscy52YWxpZGF0ZU9wdGlvbmFsT3BlcmFuZChvcHRpb25zLnNjYWxlKTtcbiAgICB0aGlzLnNjYWxlXyA9IG9wdGlvbnMuc2NhbGU7XG4gICAgdXRpbHMudmFsaWRhdGVPcHRpb25hbE9wZXJhbmQob3B0aW9ucy5iaWFzKTtcbiAgICB0aGlzLmJpYXNfID0gb3B0aW9ucy5iaWFzO1xuICAgIGlmIChvcHRpb25zLmF4aXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgYXhpcyA9IG9wdGlvbnMuYXhpcztcbiAgICAgIHV0aWxzLmFzc2VydCh1dGlscy5pc0ludGVnZXIoYXhpcyksICdUaGUgYXhpcyBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICAgIHRoaXMuYXhpc18gPSBheGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmF4aXNfID0gMTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuZXBzaWxvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBlcHNpbG9uID0gb3B0aW9ucy5lcHNpbG9uO1xuICAgICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgIHR5cGVvZiBlcHNpbG9uID09PSAnbnVtYmVyJywgJ1RoZSBlcHNpbG9uIHBhcmFtZXRlciBpcyBpbnZhbGlkJyk7XG4gICAgICB0aGlzLmVwc2lsb25fID0gZXBzaWxvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lcHNpbG9uXyA9IDFlLTU7XG4gICAgfVxuICAgIHRoaXMuYWN0aXZhdGlvbl8gPSBvcHRpb25zLmFjdGl2YXRpb247XG4gIH1cblxuICBpbnB1dHMoKTogTUxPcGVyYW5kW10ge1xuICAgIGNvbnN0IGlucHV0czogTUxPcGVyYW5kW10gPSBbdGhpcy5pbnB1dF8sIHRoaXMubWVhbl8sIHRoaXMudmFyaWFuY2VfXTtcbiAgICBpZiAodGhpcy5zY2FsZV8pIHtcbiAgICAgIGlucHV0cy5wdXNoKHRoaXMuc2NhbGVfKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYmlhc18pIHtcbiAgICAgIGlucHV0cy5wdXNoKHRoaXMuYmlhc18pO1xuICAgIH1cbiAgICByZXR1cm4gaW5wdXRzO1xuICB9XG5cbiAgZ2V0RnVzZWRPdXRwdXRzKCk6IE91dHB1dE9wZXJhbmRbXSB7XG4gICAgaWYgKHRoaXMuYWN0aXZhdGlvbl8pIHtcbiAgICAgIHJldHVybiBbdGhpcy5hY3RpdmF0aW9uXy5hcHBseSh0aGlzLm91dHB1dCldO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW3RoaXMub3V0cHV0XTtcbiAgICB9XG4gIH1cblxuICBydW4oaW5wdXRUZW5zb3JzOiBNYXA8TUxPcGVyYW5kLCB0Zi5UZW5zb3I+KTogdGYuVGVuc29yIHtcbiAgICBjb25zdCBpbnB1dDogdGYuVGVuc29yID0gaW5wdXRUZW5zb3JzLmdldCh0aGlzLmlucHV0Xyk7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICB0aGlzLmF4aXNfIDwgaW5wdXQucmFuayAmJiB0aGlzLmF4aXNfID49IC1pbnB1dC5yYW5rLFxuICAgICAgICAnVGhlIGF4aXMgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgY29uc3QgYXhpcyA9IHRoaXMuYXhpc18gPj0gMCA/IHRoaXMuYXhpc18gOiBpbnB1dC5yYW5rICsgdGhpcy5heGlzXztcbiAgICBjb25zdCBtZWFuOiB0Zi5UZW5zb3IgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMubWVhbl8pO1xuICAgIHV0aWxzLmFzc2VydChtZWFuLnJhbmsgPT09IDEsICdUaGUgbWVhbiBvcGVyYW5kIGlzIG5vdCAxLUQuJyk7XG4gICAgY29uc3QgdmFyaWFuY2U6IHRmLlRlbnNvciA9IGlucHV0VGVuc29ycy5nZXQodGhpcy52YXJpYW5jZV8pO1xuICAgIHV0aWxzLmFzc2VydCh2YXJpYW5jZS5yYW5rID09PSAxLCAnVGhlIG1lYW4gb3BlcmFuZCBpcyBub3QgMS1ELicpO1xuICAgIGxldCBzY2FsZTogdGYuVGVuc29yO1xuICAgIGlmICh0aGlzLnNjYWxlXykge1xuICAgICAgc2NhbGUgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuc2NhbGVfKTtcbiAgICAgIHV0aWxzLmFzc2VydChzY2FsZS5yYW5rID09PSAxLCAnVGhlIHNjYWxlIG9wZXJhbmQgaXMgbm90IDEtRC4nKTtcbiAgICB9XG4gICAgbGV0IGJpYXM6IHRmLlRlbnNvcjtcbiAgICBpZiAodGhpcy5iaWFzXykge1xuICAgICAgYmlhcyA9IGlucHV0VGVuc29ycy5nZXQodGhpcy5iaWFzXyk7XG4gICAgICB1dGlscy5hc3NlcnQoYmlhcy5yYW5rID09PSAxLCAnVGhlIGJpYXMgb3BlcmFuZCBpcyBub3QgMS1ELicpO1xuICAgIH1cbiAgICAvLyB0Zi5iYXRjaE5vcm0gb25seSBjb21wdXRlcyBmb3IgdGhlIGxhc3QgZGltZW5zaW9uLlxuICAgIGNvbnN0IHBlcm11dGF0aW9uID0gQXJyYXkuZnJvbShBcnJheShpbnB1dC5yYW5rKS5rZXlzKCkpO1xuICAgIHBlcm11dGF0aW9uW2F4aXNdID0gaW5wdXQucmFuayAtIDE7XG4gICAgcGVybXV0YXRpb25baW5wdXQucmFuayAtIDFdID0gYXhpcztcbiAgICByZXR1cm4gdGYudHJhbnNwb3NlKFxuICAgICAgICB0Zi5iYXRjaE5vcm0oXG4gICAgICAgICAgICB0Zi50cmFuc3Bvc2UoaW5wdXQsIHBlcm11dGF0aW9uKSwgbWVhbiwgdmFyaWFuY2UsIGJpYXMsIHNjYWxlLFxuICAgICAgICAgICAgdGhpcy5lcHNpbG9uXyksXG4gICAgICAgIHBlcm11dGF0aW9uKTtcbiAgfVxufSIsImltcG9ydCAqIGFzIHRmIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TUxPcGVyYW5kfSBmcm9tICcuLi9vcGVyYW5kJztcbmltcG9ydCB7U2luZ2xlT3V0cHV0T3BlcmF0aW9ufSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmluYXJ5IGV4dGVuZHMgU2luZ2xlT3V0cHV0T3BlcmF0aW9uIHtcbiAgcHJpdmF0ZSBhXzogTUxPcGVyYW5kO1xuICBwcml2YXRlIGJfOiBNTE9wZXJhbmQ7XG5cbiAgY29uc3RydWN0b3IoYTogTUxPcGVyYW5kLCBiOiBNTE9wZXJhbmQpIHtcbiAgICBzdXBlcihhLmJ1aWxkZXIpO1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZChhKTtcbiAgICB0aGlzLmFfID0gYTtcbiAgICB1dGlscy52YWxpZGF0ZU9wZXJhbmQoYik7XG4gICAgdGhpcy5iXyA9IGI7XG4gIH1cblxuICBpbnB1dHMoKTogTUxPcGVyYW5kW10ge1xuICAgIHJldHVybiBbdGhpcy5hXywgdGhpcy5iX107XG4gIH1cblxuICBydW4oaW5wdXRUZW5zb3JzOiBNYXA8TUxPcGVyYW5kLCB0Zi5UZW5zb3I+KTogdGYuVGVuc29yIHtcbiAgICBjb25zdCBhOiB0Zi5UZW5zb3IgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuYV8pO1xuICAgIGNvbnN0IGI6IHRmLlRlbnNvciA9IGlucHV0VGVuc29ycy5nZXQodGhpcy5iXyk7XG4gICAgcmV0dXJuIHRoaXMucnVuT3AoYSwgYik7XG4gIH1cblxuICBhYnN0cmFjdCBydW5PcChhOiB0Zi5UZW5zb3IsIGI6IHRmLlRlbnNvcik6IHRmLlRlbnNvcjtcbn1cblxuZXhwb3J0IGNsYXNzIEFkZCBleHRlbmRzIEJpbmFyeSB7XG4gIHJ1bk9wKGE6IHRmLlRlbnNvciwgYjogdGYuVGVuc29yKTogdGYuVGVuc29yIHtcbiAgICByZXR1cm4gdGYuYWRkKGEsIGIpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdWIgZXh0ZW5kcyBCaW5hcnkge1xuICBydW5PcChhOiB0Zi5UZW5zb3IsIGI6IHRmLlRlbnNvcik6IHRmLlRlbnNvciB7XG4gICAgcmV0dXJuIHRmLnN1YihhLCBiKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTXVsIGV4dGVuZHMgQmluYXJ5IHtcbiAgcnVuT3AoYTogdGYuVGVuc29yLCBiOiB0Zi5UZW5zb3IpOiB0Zi5UZW5zb3Ige1xuICAgIHJldHVybiB0Zi5tdWwoYSwgYik7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERpdiBleHRlbmRzIEJpbmFyeSB7XG4gIHJ1bk9wKGE6IHRmLlRlbnNvciwgYjogdGYuVGVuc29yKTogdGYuVGVuc29yIHtcbiAgICByZXR1cm4gdGYuZGl2KGEsIGIpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNYXggZXh0ZW5kcyBCaW5hcnkge1xuICBydW5PcChhOiB0Zi5UZW5zb3IsIGI6IHRmLlRlbnNvcik6IHRmLlRlbnNvciB7XG4gICAgcmV0dXJuIHRmLm1heGltdW0oYSwgYik7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1pbiBleHRlbmRzIEJpbmFyeSB7XG4gIHJ1bk9wKGE6IHRmLlRlbnNvciwgYjogdGYuVGVuc29yKTogdGYuVGVuc29yIHtcbiAgICByZXR1cm4gdGYubWluaW11bShhLCBiKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUG93IGV4dGVuZHMgQmluYXJ5IHtcbiAgcnVuT3AoYTogdGYuVGVuc29yLCBiOiB0Zi5UZW5zb3IpOiB0Zi5UZW5zb3Ige1xuICAgIHJldHVybiB0Zi5wb3coYSwgYik7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1hdE11bCBleHRlbmRzIEJpbmFyeSB7XG4gIHJ1bk9wKGE6IHRmLlRlbnNvciwgYjogdGYuVGVuc29yKTogdGYuVGVuc29yIHtcbiAgICBpZiAoYS5yYW5rID09PSAxKSB7XG4gICAgICBpZiAoYi5yYW5rID09PSAxKSB7XG4gICAgICAgIHJldHVybiB0Zi5kb3QoYSwgYik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhIGlzIDEtRCwgY29udmVydCB0byBhIDItRCB0ZW5zb3IgYnkgcHJlcGVuZGluZyBhIDEgdG8gaXRzIGRpbWVzaW9uc1xuICAgICAgICByZXR1cm4gdGYubWF0TXVsKHRmLnJlc2hhcGUoYSwgWzEsIC0xXSksIGIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoYi5yYW5rID09PSAxKSB7XG4gICAgICAgIC8vIGIgaXMgMS1ELCBjb252ZXJ0IHRvIGEgMi1EIHRlbnNvciBieSBhcHBlbmRpbmcgYSAxIHRvIGl0cyBkaW1lc2lvbnNcbiAgICAgICAgcmV0dXJuIHRmLm1hdE11bChhLCB0Zi5yZXNoYXBlKGIsIFstMSwgMV0pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJhbmsgPSBhLnJhbmsgPiBiLnJhbmsgPyBhLnJhbmsgOiBiLnJhbms7XG4gICAgICAgIGxldCBjID0gdGYubWF0TXVsKGEsIGIpO1xuICAgICAgICAvLyB3b3JrYXJvdW5kIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RmanMvaXNzdWVzLzQxOTJcbiAgICAgICAgaWYgKGMucmFuayAhPT0gcmFuaykge1xuICAgICAgICAgIGMgPSB0Zi5yZXNoYXBlKGMsIFsxXS5jb25jYXQoYy5zaGFwZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjO1xuICAgICAgfVxuICAgIH1cbiAgfVxufSIsImltcG9ydCAqIGFzIHRmIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TUxDbGFtcE9wdGlvbnN9IGZyb20gJy4uL2dyYXBoX2J1aWxkZXInO1xuaW1wb3J0IHtDb25zdGFudE9wZXJhbmQsIE1MT3BlcmFuZCwgT3V0cHV0T3BlcmFuZH0gZnJvbSAnLi4vb3BlcmFuZCc7XG5pbXBvcnQge1NpbmdsZU91dHB1dE9wZXJhdGlvbn0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIENsYW1wIGV4dGVuZHMgU2luZ2xlT3V0cHV0T3BlcmF0aW9uIHtcbiAgcHJpdmF0ZSB4XzogTUxPcGVyYW5kO1xuICBwcml2YXRlIG1pbk9wZXJhbmRfPzogTUxPcGVyYW5kO1xuICBwcml2YXRlIG1heE9wZXJhbmRfPzogTUxPcGVyYW5kO1xuICBwcml2YXRlIG1pblNjYWxhclZhbHVlXz86IG51bWJlcjtcbiAgcHJpdmF0ZSBtYXhTY2FsYXJWYWx1ZV8/OiBudW1iZXI7XG5cbiAgZ2V0IG1pblNjYWxhclZhbHVlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubWluU2NhbGFyVmFsdWVfO1xuICB9XG4gIGdldCBtYXhTY2FsYXJWYWx1ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm1heFNjYWxhclZhbHVlXztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2NhbGFyVmFsdWUob3BlcmFuZDogTUxPcGVyYW5kLCBtaW51cyA9IGZhbHNlKTogbnVtYmVyIHtcbiAgICBpZiAob3BlcmFuZCBpbnN0YW5jZW9mIENvbnN0YW50T3BlcmFuZCkge1xuICAgICAgY29uc3QgbWluQ29uc3RhbnQgPSBvcGVyYW5kO1xuICAgICAgaWYgKHR5cGVvZiBtaW5Db25zdGFudC52YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIG1pbkNvbnN0YW50LnZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAob3BlcmFuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbWludXMgPyAtSW5maW5pdHkgOiArSW5maW5pdHk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcih4OiBNTE9wZXJhbmQsIG9wdGlvbnM6IE1MQ2xhbXBPcHRpb25zID0ge30pIHtcbiAgICBpZiAoeCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzdXBlcih4LmJ1aWxkZXIpO1xuICAgICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKHgpO1xuICAgICAgdGhpcy54XyA9IHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1cGVyKHVuZGVmaW5lZCk7XG4gICAgICB0aGlzLnhfID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB1dGlscy52YWxpZGF0ZU9wdGlvbmFsT3BlcmFuZChvcHRpb25zLm1pblZhbHVlKTtcbiAgICB0aGlzLm1pbk9wZXJhbmRfID0gb3B0aW9ucy5taW5WYWx1ZTtcbiAgICB0aGlzLm1pblNjYWxhclZhbHVlXyA9IHRoaXMuZ2V0U2NhbGFyVmFsdWUodGhpcy5taW5PcGVyYW5kXywgdHJ1ZSk7XG4gICAgdXRpbHMudmFsaWRhdGVPcHRpb25hbE9wZXJhbmQob3B0aW9ucy5tYXhWYWx1ZSk7XG4gICAgdGhpcy5tYXhPcGVyYW5kXyA9IG9wdGlvbnMubWF4VmFsdWU7XG4gICAgdGhpcy5tYXhTY2FsYXJWYWx1ZV8gPSB0aGlzLmdldFNjYWxhclZhbHVlKHRoaXMubWF4T3BlcmFuZF8pO1xuICB9XG5cbiAgaW5wdXRzKCk6IE1MT3BlcmFuZFtdIHtcbiAgICBjb25zdCBpbnB1dHMgPSBbdGhpcy54X107XG4gICAgaWYgKHRoaXMubWluT3BlcmFuZF8pIHtcbiAgICAgIGlucHV0cy5wdXNoKHRoaXMubWluT3BlcmFuZF8pO1xuICAgIH1cbiAgICBpZiAodGhpcy5tYXhPcGVyYW5kXykge1xuICAgICAgaW5wdXRzLnB1c2godGhpcy5tYXhPcGVyYW5kXyk7XG4gICAgfVxuICAgIHJldHVybiBpbnB1dHM7XG4gIH1cblxuICBydW4oaW5wdXRUZW5zb3JzOiBNYXA8TUxPcGVyYW5kLCB0Zi5UZW5zb3I+KTogdGYuVGVuc29yIHtcbiAgICBjb25zdCB4OiB0Zi5UZW5zb3IgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMueF8pO1xuICAgIGlmICh0aGlzLm1pbk9wZXJhbmRfKSB7XG4gICAgICBpZiAodGhpcy5tYXhPcGVyYW5kXykge1xuICAgICAgICByZXR1cm4gdGYubWluaW11bShcbiAgICAgICAgICAgIHRmLm1heGltdW0oeCwgaW5wdXRUZW5zb3JzLmdldCh0aGlzLm1pbk9wZXJhbmRfKSksXG4gICAgICAgICAgICBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMubWF4T3BlcmFuZF8pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0Zi5tYXhpbXVtKHgsIGlucHV0VGVuc29ycy5nZXQodGhpcy5taW5PcGVyYW5kXykpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5tYXhPcGVyYW5kXykge1xuICAgICAgICByZXR1cm4gdGYubWluaW11bSh4LCBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMubWF4T3BlcmFuZF8pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0Zi5jbG9uZSh4KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhcHBseSh4OiBNTE9wZXJhbmQpOiBPdXRwdXRPcGVyYW5kIHtcbiAgICB0aGlzLmJ1aWxkZXJfID0geC5idWlsZGVyO1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZCh4KTtcbiAgICB0aGlzLnhfID0geDtcbiAgICB0aGlzLmNyZWF0ZU91dHB1dCgpO1xuICAgIHJldHVybiB0aGlzLm91dHB1dDtcbiAgfVxuXG4gIHJ1bk9wKHg6IHRmLlRlbnNvcik6IHRmLlRlbnNvciB7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICB0aGlzLm1pblNjYWxhclZhbHVlXyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICB0aGlzLm1heFNjYWxhclZhbHVlXyAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAndGYuanMgb25seSBzdXBwb3J0cyBjbGlwQnlWYWx1ZS4nKTtcbiAgICByZXR1cm4gdGYuY2xpcEJ5VmFsdWUoeCwgdGhpcy5taW5TY2FsYXJWYWx1ZV8sIHRoaXMubWF4U2NhbGFyVmFsdWVfKTtcbiAgfVxufSIsImltcG9ydCAqIGFzIHRmIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TUxPcGVyYW5kfSBmcm9tICcuLi9vcGVyYW5kJztcbmltcG9ydCB7U2luZ2xlT3V0cHV0T3BlcmF0aW9ufSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgQ29uY2F0IGV4dGVuZHMgU2luZ2xlT3V0cHV0T3BlcmF0aW9uIHtcbiAgcHJpdmF0ZSBpbnB1dHNfOiBNTE9wZXJhbmRbXTtcbiAgcHJpdmF0ZSBheGlzXzogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGlucHV0czogTUxPcGVyYW5kW10sIGF4aXM6IG51bWJlcikge1xuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgaW5wdXRzLmV2ZXJ5KGlucHV0ID0+IGlucHV0IGluc3RhbmNlb2YgTUxPcGVyYW5kKSxcbiAgICAgICAgJ1RoZSBwYXJhbWV0ZXIgaXMgbm90IGFuIG9wZXJhbmQuJyk7XG4gICAgc3VwZXIoaW5wdXRzWzBdLmJ1aWxkZXIpO1xuICAgIHRoaXMuaW5wdXRzXyA9IGlucHV0cztcbiAgICB1dGlscy5hc3NlcnQodXRpbHMuaXNJbnRlZ2VyKGF4aXMpLCAnVGhlIGF4aXMgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5heGlzXyA9IGF4aXM7XG4gIH1cblxuICBpbnB1dHMoKTogTUxPcGVyYW5kW10ge1xuICAgIHJldHVybiB0aGlzLmlucHV0c187XG4gIH1cblxuICBydW4oaW5wdXRUZW5zb3JzOiBNYXA8TUxPcGVyYW5kLCB0Zi5UZW5zb3I+KTogdGYuVGVuc29yIHtcbiAgICBjb25zdCBpbnB1dHM6IHRmLlRlbnNvcltdID0gW107XG4gICAgZm9yIChjb25zdCBpbnB1dCBvZiB0aGlzLmlucHV0cygpKSB7XG4gICAgICBpbnB1dHMucHVzaChpbnB1dFRlbnNvcnMuZ2V0KGlucHV0KSk7XG4gICAgfVxuICAgIHJldHVybiB0Zi5jb25jYXQoaW5wdXRzLCB0aGlzLmF4aXNfKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7RXhwbGljaXRQYWRkaW5nfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvY29udl91dGlsJztcblxuaW1wb3J0IHtNTEF1dG9QYWQsIE1MQ29udjJkT3B0aW9ucywgTUxGaWx0ZXJPcGVyYW5kTGF5b3V0LCBNTElucHV0T3BlcmFuZExheW91dH0gZnJvbSAnLi4vZ3JhcGhfYnVpbGRlcic7XG5pbXBvcnQge0NvbnN0YW50T3BlcmFuZCwgTUxPcGVyYW5kLCBPdXRwdXRPcGVyYW5kfSBmcm9tICcuLi9vcGVyYW5kJztcbmltcG9ydCB7RnVzZWRPcGVyYXRpb24sIE1MT3BlcmF0b3IsIFNpbmdsZU91dHB1dE9wZXJhdGlvbn0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4uL3V0aWxzJztcblxuaW1wb3J0IHtDbGFtcH0gZnJvbSAnLi9jbGFtcCc7XG5pbXBvcnQge0xlYWt5UmVsdX0gZnJvbSAnLi9sZWFreV9yZWx1JztcbmltcG9ydCB7UmVsdSwgU2lnbW9pZH0gZnJvbSAnLi91bmFyeSc7XG5cbmV4cG9ydCBjbGFzcyBDb252MmQgZXh0ZW5kcyBTaW5nbGVPdXRwdXRPcGVyYXRpb24gaW1wbGVtZW50cyBGdXNlZE9wZXJhdGlvbiB7XG4gIHByaXZhdGUgaW5wdXRfOiBNTE9wZXJhbmQ7XG4gIHByaXZhdGUgZmlsdGVyXzogTUxPcGVyYW5kO1xuICBwcml2YXRlIGJpYXNfOiBNTE9wZXJhbmQ7XG4gIHByaXZhdGUgcGFkZGluZ18/OiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgcHJpdmF0ZSBzdHJpZGVzXz86IFtudW1iZXIsIG51bWJlcl07XG4gIHByaXZhdGUgZGlsYXRpb25zXz86IFtudW1iZXIsIG51bWJlcl07XG4gIHByaXZhdGUgZ3JvdXBzXz86IG51bWJlcjtcbiAgcHJpdmF0ZSBpbnB1dExheW91dF8/OiBNTElucHV0T3BlcmFuZExheW91dDtcbiAgcHJpdmF0ZSBmaWx0ZXJMYXlvdXRfPzogTUxGaWx0ZXJPcGVyYW5kTGF5b3V0O1xuICBwcml2YXRlIGF1dG9QYWRfPzogTUxBdXRvUGFkO1xuICBwcml2YXRlIG91dHB1dFBhZGRpbmdfPzogW251bWJlciwgbnVtYmVyXTtcbiAgcHJpdmF0ZSBvdXRwdXRTaXplc18/OiBbbnVtYmVyLCBudW1iZXJdO1xuICBwcml2YXRlIHRyYW5zcG9zZV8/OiBib29sZWFuO1xuICBwcml2YXRlIGFjdGl2YXRpb25fPzogTUxPcGVyYXRvcjtcbiAgcHJpdmF0ZSBmdXNlZEFjdGl2YXRpb25fPzogdGYuZnVzZWQuQWN0aXZhdGlvbjtcbiAgcHJpdmF0ZSBsZWFreXJlbHVBbHBoYV8/OiBudW1iZXI7XG4gIHByaXZhdGUgZmlsdGVyVGVuc29yXz86IHRmLlRlbnNvcjREO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgaW5wdXQ6IE1MT3BlcmFuZCwgZmlsdGVyOiBNTE9wZXJhbmQsIG9wdGlvbnM6IE1MQ29udjJkT3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIoaW5wdXQuYnVpbGRlcik7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKGlucHV0KTtcbiAgICB0aGlzLmlucHV0XyA9IGlucHV0O1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZChmaWx0ZXIpO1xuICAgIHRoaXMuZmlsdGVyXyA9IGZpbHRlcjtcblxuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgIShvcHRpb25zLmF1dG9QYWQgPT09IE1MQXV0b1BhZC5leHBsaWNpdCAmJlxuICAgICAgICAgIG9wdGlvbnMucGFkZGluZyA9PT0gdW5kZWZpbmVkKSxcbiAgICAgICAgJ1RoZSBwYWRkaW5nIHBhcmFtZXRlciBzaG91bGQgYmUgYXNzaWduZWQgd2hlbiBhdXRvUGFkIGlzIGV4cGxpY2l0LicpO1xuXG4gICAgdGhpcy5pbml0T3B0aW9ucyhcbiAgICAgICAgb3B0aW9ucy5wYWRkaW5nLCBvcHRpb25zLnN0cmlkZXMsIG9wdGlvbnMuZGlsYXRpb25zLCBvcHRpb25zLmdyb3VwcyxcbiAgICAgICAgb3B0aW9ucy5pbnB1dExheW91dCwgb3B0aW9ucy5maWx0ZXJMYXlvdXQsIG9wdGlvbnMuYXV0b1BhZCxcbiAgICAgICAgb3B0aW9ucy50cmFuc3Bvc2UsIG9wdGlvbnMub3V0cHV0UGFkZGluZywgb3B0aW9ucy5vdXRwdXRTaXplcyxcbiAgICAgICAgb3B0aW9ucy5iaWFzLCBvcHRpb25zLmFjdGl2YXRpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0T3B0aW9ucyhcbiAgICAgIHBhZGRpbmc6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0gWzAsIDAsIDAsIDBdLFxuICAgICAgc3RyaWRlczogW251bWJlciwgbnVtYmVyXSA9IFsxLCAxXSwgZGlsYXRpb25zOiBbbnVtYmVyLCBudW1iZXJdID0gWzEsIDFdLFxuICAgICAgZ3JvdXBzID0gMSwgaW5wdXRMYXlvdXQ6IE1MSW5wdXRPcGVyYW5kTGF5b3V0ID0gTUxJbnB1dE9wZXJhbmRMYXlvdXQubmNodyxcbiAgICAgIGZpbHRlckxheW91dDogTUxGaWx0ZXJPcGVyYW5kTGF5b3V0ID0gTUxGaWx0ZXJPcGVyYW5kTGF5b3V0Lm9paHcsXG4gICAgICBhdXRvUGFkOiBNTEF1dG9QYWQgPSBNTEF1dG9QYWQuZXhwbGljaXQsIHRyYW5zcG9zZSA9IGZhbHNlLFxuICAgICAgb3V0cHV0UGFkZGluZzogW251bWJlciwgbnVtYmVyXSA9IFswLCAwXSxcbiAgICAgIG91dHB1dFNpemVzOiBbbnVtYmVyLCBudW1iZXJdID0gdW5kZWZpbmVkLCBiaWFzOiBNTE9wZXJhbmQgPSB1bmRlZmluZWQsXG4gICAgICBhY3RpdmF0aW9uOiBNTE9wZXJhdG9yID0gdW5kZWZpbmVkKSB7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICB1dGlscy5pc0ludGVnZXJBcnJheShwYWRkaW5nKSAmJiBwYWRkaW5nLmxlbmd0aCA9PT0gNCxcbiAgICAgICAgJ1RoZSBwYWRkaW5nIHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgIHRoaXMucGFkZGluZ18gPSBwYWRkaW5nO1xuXG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICB1dGlscy5pc0ludGVnZXJBcnJheShzdHJpZGVzKSAmJiBzdHJpZGVzLmxlbmd0aCA9PT0gMixcbiAgICAgICAgJ1RoZSBzdHJpZGVzIHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgIHRoaXMuc3RyaWRlc18gPSBzdHJpZGVzO1xuXG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICB1dGlscy5pc0ludGVnZXJBcnJheShkaWxhdGlvbnMpICYmIGRpbGF0aW9ucy5sZW5ndGggPT09IDIsXG4gICAgICAgICdUaGUgZGlsYXRpb25zIHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgIHRoaXMuZGlsYXRpb25zXyA9IGRpbGF0aW9ucztcblxuICAgIHV0aWxzLmFzc2VydCh1dGlscy5pc0ludGVnZXIoZ3JvdXBzKSwgJ1RoZSBnb3VycHMgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5ncm91cHNfID0gZ3JvdXBzO1xuXG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICBpbnB1dExheW91dCBpbiBNTElucHV0T3BlcmFuZExheW91dCxcbiAgICAgICAgJ1RoZSBpbnB1dCBsYXlvdXQgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5pbnB1dExheW91dF8gPSBpbnB1dExheW91dDtcblxuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgZmlsdGVyTGF5b3V0IGluIE1MRmlsdGVyT3BlcmFuZExheW91dCxcbiAgICAgICAgJ1RoZSBmaWx0ZXIgbGF5b3V0IHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgIHRoaXMuZmlsdGVyTGF5b3V0XyA9IGZpbHRlckxheW91dDtcblxuICAgIHV0aWxzLmFzc2VydChhdXRvUGFkIGluIE1MQXV0b1BhZCwgJ1RoZSBhdXRvUGFkIHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgIHRoaXMuYXV0b1BhZF8gPSBhdXRvUGFkO1xuXG4gICAgdGhpcy50cmFuc3Bvc2VfID0gdHJhbnNwb3NlO1xuXG4gICAgaWYgKHRoaXMudHJhbnNwb3NlXykge1xuICAgICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgIHV0aWxzLmlzSW50ZWdlckFycmF5KG91dHB1dFBhZGRpbmcpICYmIG91dHB1dFBhZGRpbmcubGVuZ3RoID09PSAyLFxuICAgICAgICAgICdUaGUgb3V0cHV0UGFkZGluZyBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICAgIHRoaXMub3V0cHV0UGFkZGluZ18gPSBvdXRwdXRQYWRkaW5nO1xuXG4gICAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgICAgb3V0cHV0U2l6ZXMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICAodXRpbHMuaXNJbnRlZ2VyQXJyYXkob3V0cHV0U2l6ZXMpICYmIG91dHB1dFNpemVzLmxlbmd0aCA9PT0gMiksXG4gICAgICAgICAgJ1RoZSBvdXRwdXRTaXplcyBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICAgIHRoaXMub3V0cHV0U2l6ZXNfID0gb3V0cHV0U2l6ZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub3V0cHV0UGFkZGluZ18gPSBbMCwgMF07XG4gICAgICB0aGlzLm91dHB1dFNpemVzXyA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICB0aGlzLmJpYXNfID0gYmlhcztcbiAgICBpZiAodGhpcy5iaWFzXykge1xuICAgICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKHRoaXMuYmlhc18pO1xuICAgIH1cblxuICAgIGlmIChhY3RpdmF0aW9uIGluc3RhbmNlb2YgUmVsdSkge1xuICAgICAgdGhpcy5mdXNlZEFjdGl2YXRpb25fID0gJ3JlbHUnO1xuICAgICAgdGhpcy5hY3RpdmF0aW9uXyA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNSZWx1NihhY3RpdmF0aW9uKSkge1xuICAgICAgdGhpcy5mdXNlZEFjdGl2YXRpb25fID0gJ3JlbHU2JztcbiAgICAgIHRoaXMuYWN0aXZhdGlvbl8gPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIGlmIChhY3RpdmF0aW9uIGluc3RhbmNlb2YgTGVha3lSZWx1KSB7XG4gICAgICB0aGlzLmZ1c2VkQWN0aXZhdGlvbl8gPSAnbGVha3lyZWx1JztcbiAgICAgIHRoaXMubGVha3lyZWx1QWxwaGFfID0gKGFjdGl2YXRpb24pLmFscGhhO1xuICAgICAgdGhpcy5hY3RpdmF0aW9uXyA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKGFjdGl2YXRpb24gaW5zdGFuY2VvZiBTaWdtb2lkKSB7XG4gICAgICB0aGlzLmZ1c2VkQWN0aXZhdGlvbl8gPSAnc2lnbW9pZCc7XG4gICAgICB0aGlzLmFjdGl2YXRpb25fID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZ1c2VkQWN0aXZhdGlvbl8gPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmFjdGl2YXRpb25fID0gYWN0aXZhdGlvbjtcbiAgICB9XG4gIH1cblxuICBpc1JlbHU2KGFjdGl2YXRpb246IE1MT3BlcmF0b3IpOiBib29sZWFuIHtcbiAgICBpZiAoYWN0aXZhdGlvbiBpbnN0YW5jZW9mIENsYW1wKSB7XG4gICAgICBjb25zdCBjbGFtcCA9IGFjdGl2YXRpb247XG4gICAgICBpZiAoTWF0aC5hYnMoY2xhbXAubWluU2NhbGFyVmFsdWUgLSAwLjApIDwgMWUtNSAmJlxuICAgICAgICAgIE1hdGguYWJzKGNsYW1wLm1heFNjYWxhclZhbHVlIC0gNi4wKSA8IDFlLTUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdldEZ1c2VkT3V0cHV0cygpOiBPdXRwdXRPcGVyYW5kW10ge1xuICAgIGlmICh0aGlzLmFjdGl2YXRpb25fKSB7XG4gICAgICByZXR1cm4gW3RoaXMuYWN0aXZhdGlvbl8uYXBwbHkodGhpcy5vdXRwdXQpXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFt0aGlzLm91dHB1dF07XG4gICAgfVxuICB9XG5cbiAgaW5wdXRzKCk6IE1MT3BlcmFuZFtdIHtcbiAgICBjb25zdCBpbnB1dHMgPSBbdGhpcy5pbnB1dF8sIHRoaXMuZmlsdGVyX107XG4gICAgaWYgKHRoaXMuYmlhc18pIHtcbiAgICAgIGlucHV0cy5wdXNoKHRoaXMuYmlhc18pO1xuICAgIH1cbiAgICByZXR1cm4gaW5wdXRzO1xuICB9XG5cbiAgcnVuKGlucHV0VGVuc29yczogTWFwPE1MT3BlcmFuZCwgdGYuVGVuc29yPik6IHRmLlRlbnNvciB7XG4gICAgbGV0IGlucHV0OiB0Zi5UZW5zb3I0RCA9IGlucHV0VGVuc29ycy5nZXQodGhpcy5pbnB1dF8pIGFzIHRmLlRlbnNvcjREO1xuICAgIGxldCBmaWx0ZXI6IHRmLlRlbnNvcjREO1xuICAgIGxldCBiaWFzOiB0Zi5UZW5zb3IxRDtcbiAgICBsZXQgZnVzZWQgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5iaWFzXykge1xuICAgICAgYmlhcyA9IGlucHV0VGVuc29ycy5nZXQodGhpcy5iaWFzXykgYXMgdGYuVGVuc29yMUQ7XG4gICAgfVxuXG4gICAgLy8gdGYuY29udjJkIGlucHV0IGxheW91dCAobmh3Yyk6IFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgaW5EZXB0aF1cbiAgICBpZiAodGhpcy5pbnB1dExheW91dF8gPT09IE1MSW5wdXRPcGVyYW5kTGF5b3V0Lm5jaHcpIHtcbiAgICAgIC8vIG5jaHcgLT4gbmh3Y1xuICAgICAgaW5wdXQgPSB0Zi50cmFuc3Bvc2UoaW5wdXQsIFswLCAyLCAzLCAxXSk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0Q2hhbm5lbHMgPSBpbnB1dC5zaGFwZVszXTtcbiAgICBpZiAodGhpcy5maWx0ZXJUZW5zb3JfID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGZpbHRlciA9IGlucHV0VGVuc29ycy5nZXQodGhpcy5maWx0ZXJfKSBhcyB0Zi5UZW5zb3I0RDtcbiAgICAgIGlmICh0aGlzLnRyYW5zcG9zZV8gPT09IGZhbHNlKSB7XG4gICAgICAgIC8vIHRmLmNvbnYyZCBmaWx0ZXIgbGF5b3V0IChod2lvKTogW2ZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGluRGVwdGgsXG4gICAgICAgIC8vIG91dERlcHRoXVxuICAgICAgICBpZiAodGhpcy5maWx0ZXJMYXlvdXRfID09PSBNTEZpbHRlck9wZXJhbmRMYXlvdXQub2lodykge1xuICAgICAgICAgIGZpbHRlciA9IHRmLnRyYW5zcG9zZShmaWx0ZXIsIFsyLCAzLCAxLCAwXSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5maWx0ZXJMYXlvdXRfID09PSBNTEZpbHRlck9wZXJhbmRMYXlvdXQub2h3aSkge1xuICAgICAgICAgIGZpbHRlciA9IHRmLnRyYW5zcG9zZShmaWx0ZXIsIFsxLCAyLCAzLCAwXSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5maWx0ZXJMYXlvdXRfID09PSBNTEZpbHRlck9wZXJhbmRMYXlvdXQuaWh3bykge1xuICAgICAgICAgIGZpbHRlciA9IHRmLnRyYW5zcG9zZShmaWx0ZXIsIFsxLCAyLCAwLCAzXSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHRmLmNvbnYyZFRyYW5zcG9zZSBmaWx0ZXIgbGF5b3V0IChod29pKTogW2ZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsXG4gICAgICAgIC8vIG91dERlcHRoLCBpbkRlcHRoXVxuICAgICAgICBpZiAodGhpcy5maWx0ZXJMYXlvdXRfID09PSBNTEZpbHRlck9wZXJhbmRMYXlvdXQub2lodykge1xuICAgICAgICAgIGZpbHRlciA9IHRmLnRyYW5zcG9zZShmaWx0ZXIsIFsyLCAzLCAwLCAxXSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5maWx0ZXJMYXlvdXRfID09PSBNTEZpbHRlck9wZXJhbmRMYXlvdXQuaHdpbykge1xuICAgICAgICAgIGZpbHRlciA9IHRmLnRyYW5zcG9zZShmaWx0ZXIsIFswLCAxLCAzLCAyXSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5maWx0ZXJMYXlvdXRfID09PSBNTEZpbHRlck9wZXJhbmRMYXlvdXQub2h3aSkge1xuICAgICAgICAgIGZpbHRlciA9IHRmLnRyYW5zcG9zZShmaWx0ZXIsIFsxLCAyLCAwLCAzXSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5maWx0ZXJMYXlvdXRfID09PSBNTEZpbHRlck9wZXJhbmRMYXlvdXQuaWh3bykge1xuICAgICAgICAgIGZpbHRlciA9IHRmLnRyYW5zcG9zZShmaWx0ZXIsIFsxLCAyLCAzLCAwXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmdyb3Vwc18gIT09IDEpIHtcbiAgICAgICAgLy8gZmlsdGVyIGxheW91dCBod2lvXG4gICAgICAgIC8vIHRmLmRlcHRod2lzZUNvbnYyZCBmaWx0ZXIgbGF5b3V0OiBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCxcbiAgICAgICAgLy8gaW5DaGFubmVscywgY2hhbm5lbE11bHRpcGxpZXJdXG4gICAgICAgIGZpbHRlciA9IHRmLnRyYW5zcG9zZShmaWx0ZXIsIFswLCAxLCAzLCAyXSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5maWx0ZXJfIGluc3RhbmNlb2YgQ29uc3RhbnRPcGVyYW5kKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyVGVuc29yXyA9IGZpbHRlcjtcbiAgICAgICAgdGYua2VlcCh0aGlzLmZpbHRlclRlbnNvcl8pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmaWx0ZXIgPSB0aGlzLmZpbHRlclRlbnNvcl87XG4gICAgfVxuICAgIGNvbnN0IHBhZGRpbmc6ICd2YWxpZCd8J3NhbWUnfEV4cGxpY2l0UGFkZGluZyA9IHV0aWxzLmdldFBhZGRpbmdzKFxuICAgICAgICBpbnB1dCwgZmlsdGVyLCB0aGlzLnBhZGRpbmdfLCB0aGlzLnN0cmlkZXNfLCB0aGlzLm91dHB1dFBhZGRpbmdfLFxuICAgICAgICB0aGlzLmRpbGF0aW9uc18sIHRoaXMuYXV0b1BhZF8pO1xuICAgIGxldCBvdXRwdXQ7XG4gICAgaWYgKHRoaXMudHJhbnNwb3NlXyA9PT0gZmFsc2UpIHtcbiAgICAgIGlmICh0aGlzLmdyb3Vwc18gPT09IDEpIHtcbiAgICAgICAgb3V0cHV0ID0gdGYuZnVzZWQuY29udjJkKHtcbiAgICAgICAgICB4OiBpbnB1dCxcbiAgICAgICAgICBmaWx0ZXIsXG4gICAgICAgICAgc3RyaWRlczogdGhpcy5zdHJpZGVzXyxcbiAgICAgICAgICBwYWQ6IHBhZGRpbmcsXG4gICAgICAgICAgZGF0YUZvcm1hdDogJ05IV0MnLFxuICAgICAgICAgIGRpbGF0aW9uczogdGhpcy5kaWxhdGlvbnNfLFxuICAgICAgICAgIGJpYXMsXG4gICAgICAgICAgYWN0aXZhdGlvbjogdGhpcy5mdXNlZEFjdGl2YXRpb25fLFxuICAgICAgICAgIGxlYWt5cmVsdUFscGhhOiB0aGlzLmxlYWt5cmVsdUFscGhhX1xuICAgICAgICB9KTtcbiAgICAgICAgZnVzZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICB0aGlzLmdyb3Vwc18gPT09IGlucHV0Q2hhbm5lbHMgJiYgdGhpcy5ncm91cHNfID09PSBmaWx0ZXIuc2hhcGVbMl0pIHtcbiAgICAgICAgaWYgKHBhZGRpbmcgPT09ICd2YWxpZCcgfHwgcGFkZGluZyA9PT0gJ3NhbWUnIHx8XG4gICAgICAgICAgICAocGFkZGluZyBpbnN0YW5jZW9mIEFycmF5ICYmIHBhZGRpbmdbMV1bMF0gPT09IHBhZGRpbmdbMV1bMV0gJiZcbiAgICAgICAgICAgICBwYWRkaW5nWzFdWzBdID09PSBwYWRkaW5nWzJdWzBdICYmXG4gICAgICAgICAgICAgcGFkZGluZ1sxXVswXSA9PT0gcGFkZGluZ1syXVsxXSkpIHtcbiAgICAgICAgICBsZXQgZnVzZWREZXB0aHdpc2VQYWQ6ICd2YWxpZCd8J3NhbWUnfG51bWJlcjtcbiAgICAgICAgICBpZiAocGFkZGluZyA9PT0gJ3ZhbGlkJyB8fCBwYWRkaW5nID09PSAnc2FtZScpIHtcbiAgICAgICAgICAgIGZ1c2VkRGVwdGh3aXNlUGFkID0gcGFkZGluZztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZnVzZWREZXB0aHdpc2VQYWQgPSBwYWRkaW5nWzFdWzBdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvdXRwdXQgPSB0Zi5mdXNlZC5kZXB0aHdpc2VDb252MmQoe1xuICAgICAgICAgICAgeDogaW5wdXQsXG4gICAgICAgICAgICBmaWx0ZXIsXG4gICAgICAgICAgICBzdHJpZGVzOiB0aGlzLnN0cmlkZXNfLFxuICAgICAgICAgICAgcGFkOiBmdXNlZERlcHRod2lzZVBhZCxcbiAgICAgICAgICAgIGRhdGFGb3JtYXQ6ICdOSFdDJyxcbiAgICAgICAgICAgIGRpbGF0aW9uczogdGhpcy5kaWxhdGlvbnNfLFxuICAgICAgICAgICAgYmlhcyxcbiAgICAgICAgICAgIGFjdGl2YXRpb246IHRoaXMuZnVzZWRBY3RpdmF0aW9uXyxcbiAgICAgICAgICAgIGxlYWt5cmVsdUFscGhhOiB0aGlzLmxlYWt5cmVsdUFscGhhX1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGZ1c2VkID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXRwdXQgPSB0Zi5kZXB0aHdpc2VDb252MmQoXG4gICAgICAgICAgICAgIGlucHV0LCBmaWx0ZXIsIHRoaXMuc3RyaWRlc18sIHBhZGRpbmcsICdOSFdDJywgdGhpcy5kaWxhdGlvbnNfKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ1RoZSB0Zi5qcyBjb252b2x1dGlvbiBkb2VzblxcJ3Qgc3VwcG9ydCBncm91cHMgcGFyYW1ldGVyJyArXG4gICAgICAgICAgICBgICR7dGhpcy5ncm91cHNffWApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0cmFuc3Bvc2UgPT0gdHJ1ZVxuICAgICAgaWYgKHRoaXMuYXV0b1BhZF8gIT09IE1MQXV0b1BhZC5leHBsaWNpdCkge1xuICAgICAgICB0aGlzLm91dHB1dFNpemVzXyA9IFtcbiAgICAgICAgICBpbnB1dC5zaGFwZVsxXSAqIHRoaXMuc3RyaWRlc19bMF0sXG4gICAgICAgICAgaW5wdXQuc2hhcGVbMl0gKiB0aGlzLnN0cmlkZXNfWzFdLFxuICAgICAgICBdO1xuICAgICAgfVxuICAgICAgLy8gdGYuY29udjJkVHJhbnNwb3NlIG91dHB1dFNoYXBlOiBbYmF0Y2gsIGhlaWdodCwgd2lkdGgsIG91dERlcHRoXVxuICAgICAgY29uc3Qgb3V0cHV0U2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID1cbiAgICAgICAgICBbaW5wdXQuc2hhcGVbMF0sIDAsIDAsIGZpbHRlci5zaGFwZVsyXV07XG4gICAgICBpZiAodGhpcy5vdXRwdXRTaXplc18gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI7ICsraSkge1xuICAgICAgICAgIG91dHB1dFNoYXBlW2kgKyAxXSA9IHRoaXMuc3RyaWRlc19baV0gKiAoaW5wdXQuc2hhcGVbaSArIDFdIC0gMSkgK1xuICAgICAgICAgICAgICB0aGlzLm91dHB1dFBhZGRpbmdfW2ldICtcbiAgICAgICAgICAgICAgKChmaWx0ZXIuc2hhcGVbaV0gLSAxKSAqIHRoaXMuZGlsYXRpb25zX1tpXSArIDEpIC1cbiAgICAgICAgICAgICAgdGhpcy5wYWRkaW5nX1tpICogMl0gLSB0aGlzLnBhZGRpbmdfW2kgKiAyICsgMV07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dHB1dFNoYXBlWzFdID0gdGhpcy5vdXRwdXRTaXplc19bMF07XG4gICAgICAgIG91dHB1dFNoYXBlWzJdID0gdGhpcy5vdXRwdXRTaXplc19bMV07XG4gICAgICB9XG4gICAgICBvdXRwdXQgPSB0Zi5jb252MmRUcmFuc3Bvc2UoXG4gICAgICAgICAgaW5wdXQsIGZpbHRlciwgb3V0cHV0U2hhcGUsIHRoaXMuc3RyaWRlc18sIHBhZGRpbmcpO1xuICAgIH1cbiAgICBpZiAoIWZ1c2VkKSB7XG4gICAgICBpZiAoYmlhcykge1xuICAgICAgICAvLyBvdXRwdXQgaXMgc3RpbGwgbmh3Y1xuICAgICAgICBvdXRwdXQgPSB0Zi5hZGQob3V0cHV0LCBiaWFzKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmZ1c2VkQWN0aXZhdGlvbl8gPT09ICdyZWx1Jykge1xuICAgICAgICBvdXRwdXQgPSB0Zi5yZWx1KG91dHB1dCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZnVzZWRBY3RpdmF0aW9uXyA9PT0gJ3JlbHU2Jykge1xuICAgICAgICBvdXRwdXQgPSB0Zi5jbGlwQnlWYWx1ZShvdXRwdXQsIDAsIDYpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmZ1c2VkQWN0aXZhdGlvbl8gPT09ICdsZWFreXJlbHUnKSB7XG4gICAgICAgIG91dHB1dCA9IHRmLmxlYWt5UmVsdShvdXRwdXQsIHRoaXMubGVha3lyZWx1QWxwaGFfKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5mdXNlZEFjdGl2YXRpb25fID09PSAnc2lnbW9pZCcpIHtcbiAgICAgICAgb3V0cHV0ID0gdGYuc2lnbW9pZChvdXRwdXQpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmZ1c2VkQWN0aXZhdGlvbl8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB1dGlscy5hc3NlcnQoZmFsc2UsIGBUaGUgJHt0aGlzLmZ1c2VkQWN0aXZhdGlvbl99IGlzIHVuIHN1cHBvcnRlZC5gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuaW5wdXRMYXlvdXRfID09PSBNTElucHV0T3BlcmFuZExheW91dC5uY2h3KSB7XG4gICAgICAvLyBuaHdjIC0+IG5jaHdcbiAgICAgIG91dHB1dCA9IHRmLnRyYW5zcG9zZShvdXRwdXQsIFswLCAzLCAxLCAyXSk7XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cblxuICBkaXNwb3NlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZpbHRlclRlbnNvcl8pIHtcbiAgICAgIHRmLmRpc3Bvc2UodGhpcy5maWx0ZXJUZW5zb3JfKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7TUxHZW1tT3B0aW9ucywgTUxHcmFwaEJ1aWxkZXJ9IGZyb20gJy4uL2dyYXBoX2J1aWxkZXInO1xuaW1wb3J0IHtNTE9wZXJhbmR9IGZyb20gJy4uL29wZXJhbmQnO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgR2VtbSB7XG4gIHN0YXRpYyBidWlsZChcbiAgICAgIGJ1aWxkZXI6IE1MR3JhcGhCdWlsZGVyLCBhOiBNTE9wZXJhbmQsIGI6IE1MT3BlcmFuZCxcbiAgICAgIG9wdGlvbnM6IE1MR2VtbU9wdGlvbnMgPSB7fSk6IE1MT3BlcmFuZCB7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKGEpO1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZChiKTtcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIG9wdGlvbnMuYyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zLmMgPT09ICdudW1iZXInIHx8XG4gICAgICAgICAgICBvcHRpb25zLmMgaW5zdGFuY2VvZiBNTE9wZXJhbmQsXG4gICAgICAgICdUaGUgb3B0aW9ucy5jIGlzIGludmFsaWQuJyk7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICBvcHRpb25zLmFUcmFuc3Bvc2UgPT09IHVuZGVmaW5lZCB8fCB1dGlscy5pc0Jvb2xlYW4ob3B0aW9ucy5hVHJhbnNwb3NlKSxcbiAgICAgICAgJ1RoZSBvcHRpb25zLmFUcmFuc3Bvc2UgaXMgaW52YWxpZC4nKTtcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIG9wdGlvbnMuYlRyYW5zcG9zZSA9PT0gdW5kZWZpbmVkIHx8IHV0aWxzLmlzQm9vbGVhbihvcHRpb25zLmJUcmFuc3Bvc2UpLFxuICAgICAgICAnVGhlIG9wdGlvbnMuYlRyYW5zcG9zZSBpcyBpbnZhbGlkLicpO1xuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgb3B0aW9ucy5hbHBoYSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zLmFscGhhID09PSAnbnVtYmVyJyxcbiAgICAgICAgJ1RoZSBvcHRpb25zLmFscGhhIGlzIGludmFsaWQuJyk7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICBvcHRpb25zLmJldGEgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2Ygb3B0aW9ucy5iZXRhID09PSAnbnVtYmVyJyxcbiAgICAgICAgJ1RoZSBvcHRpb25zLmJldGEgaXMgaW52YWxpZC4nKTtcblxuICAgIC8vIGJ1aWxkIGdyYXBoXG4gICAgaWYgKG9wdGlvbnMuYVRyYW5zcG9zZSkge1xuICAgICAgYSA9IGJ1aWxkZXIudHJhbnNwb3NlKGEpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmJUcmFuc3Bvc2UpIHtcbiAgICAgIGIgPSBidWlsZGVyLnRyYW5zcG9zZShiKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbHBoYSA9XG4gICAgICAgIGJ1aWxkZXIuY29uc3RhbnQob3B0aW9ucy5hbHBoYSA9PT0gdW5kZWZpbmVkID8gMS4wIDogb3B0aW9ucy5hbHBoYSk7XG4gICAgY29uc3QgYmV0YSA9XG4gICAgICAgIGJ1aWxkZXIuY29uc3RhbnQob3B0aW9ucy5iZXRhID09PSB1bmRlZmluZWQgPyAxLjAgOiBvcHRpb25zLmJldGEpO1xuXG4gICAgY29uc3QgYWIgPSBidWlsZGVyLm1hdG11bChidWlsZGVyLm11bChhbHBoYSwgYSksIGIpO1xuICAgIHJldHVybiAob3B0aW9ucy5jID8gYnVpbGRlci5hZGQoYWIsIGJ1aWxkZXIubXVsKGJldGEsIG9wdGlvbnMuYykpIDogYWIpO1xuICB9XG59IiwiaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNTEdydUNlbGxPcHRpb25zLCBNTEdydU9wdGlvbnMsIE1MUmVjdXJyZW50TmV0d29ya0RpcmVjdGlvbiwgTUxSZWN1cnJlbnROZXR3b3JrV2VpZ2h0TGF5b3V0fSBmcm9tICcuLi9ncmFwaF9idWlsZGVyJztcbmltcG9ydCB7TUxPcGVyYW5kLCBPdXRwdXRPcGVyYW5kfSBmcm9tICcuLi9vcGVyYW5kJztcbmltcG9ydCB7TUxPcGVyYXRvciwgT3BlcmF0aW9uLCBTaW5nbGVPdXRwdXRPcGVyYXRpb259IGZyb20gJy4uL29wZXJhdGlvbic7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQge1VuYXJ5TUxPcGVyYXRvcn0gZnJvbSAnLi91bmFyeSc7XG5cbmV4cG9ydCBjbGFzcyBHcnUgZXh0ZW5kcyBPcGVyYXRpb24ge1xuICBwcml2YXRlIGlucHV0XzogTUxPcGVyYW5kO1xuICBwcml2YXRlIHdlaWdodF86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSByZWN1cnJlbnRXZWlnaHRfOiBNTE9wZXJhbmQ7XG4gIHByaXZhdGUgc3RlcHNfOiBudW1iZXI7XG4gIHByaXZhdGUgaGlkZGVuU2l6ZV86IG51bWJlcjtcbiAgcHJpdmF0ZSBiaWFzXz86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSByZWN1cnJlbnRCaWFzXz86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSBpbml0aWFsSGlkZGVuU3RhdGVfPzogTUxPcGVyYW5kO1xuICBwcml2YXRlIHJlc2V0QWZ0ZXJfOiBib29sZWFuO1xuICBwcml2YXRlIHJldHVyblNlcXVlbmNlXzogYm9vbGVhbjtcbiAgcHJpdmF0ZSBkaXJlY3Rpb25fOiBNTFJlY3VycmVudE5ldHdvcmtEaXJlY3Rpb247XG4gIHByaXZhdGUgbGF5b3V0XzogTUxSZWN1cnJlbnROZXR3b3JrV2VpZ2h0TGF5b3V0O1xuICBwcml2YXRlIGFjdGl2YXRpb25zXzogTUxPcGVyYXRvcltdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgaW5wdXQ6IE1MT3BlcmFuZCwgd2VpZ2h0OiBNTE9wZXJhbmQsIHJlY3VycmVudFdlaWdodDogTUxPcGVyYW5kLFxuICAgICAgc3RlcHM6IG51bWJlciwgaGlkZGVuU2l6ZTogbnVtYmVyLCBvcHRpb25zOiBNTEdydU9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKGlucHV0LmJ1aWxkZXIpO1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZChpbnB1dCk7XG4gICAgdGhpcy5pbnB1dF8gPSBpbnB1dDtcbiAgICB1dGlscy52YWxpZGF0ZU9wZXJhbmQod2VpZ2h0KTtcbiAgICB0aGlzLndlaWdodF8gPSB3ZWlnaHQ7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKHJlY3VycmVudFdlaWdodCk7XG4gICAgdGhpcy5yZWN1cnJlbnRXZWlnaHRfID0gcmVjdXJyZW50V2VpZ2h0O1xuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgdXRpbHMuaXNJbnRlZ2VyKHN0ZXBzKSAmJiBzdGVwcyA+IDAsICdUaGUgc3RlcHMgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5zdGVwc18gPSBzdGVwcztcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIHV0aWxzLmlzSW50ZWdlcihoaWRkZW5TaXplKSAmJiBoaWRkZW5TaXplID4gMCxcbiAgICAgICAgJ1RoZSBoaWRkZW5TaXplIHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgIHRoaXMuaGlkZGVuU2l6ZV8gPSBoaWRkZW5TaXplO1xuICAgIHRoaXMuaW5pdE9wdGlvbnMoXG4gICAgICAgIG9wdGlvbnMuYmlhcywgb3B0aW9ucy5yZWN1cnJlbnRCaWFzLCBvcHRpb25zLmluaXRpYWxIaWRkZW5TdGF0ZSxcbiAgICAgICAgb3B0aW9ucy5yZXNldEFmdGVyLCBvcHRpb25zLnJldHVyblNlcXVlbmNlLCBvcHRpb25zLmRpcmVjdGlvbixcbiAgICAgICAgb3B0aW9ucy5sYXlvdXQsIG9wdGlvbnMuYWN0aXZhdGlvbnMpO1xuXG4gICAgdGhpcy5vdXRwdXRzLnB1c2gobmV3IE91dHB1dE9wZXJhbmQodGhpcykpO1xuICAgIGlmICh0aGlzLnJldHVyblNlcXVlbmNlXykge1xuICAgICAgdGhpcy5vdXRwdXRzXy5wdXNoKG5ldyBPdXRwdXRPcGVyYW5kKHRoaXMpKTtcbiAgICB9XG4gIH1cblxuICBpbml0T3B0aW9ucyhcbiAgICAgIGJpYXM/OiBNTE9wZXJhbmQsIHJlY3VycmVudEJpYXM/OiBNTE9wZXJhbmQsXG4gICAgICBpbml0aWFsSGlkZGVuU3RhdGU/OiBNTE9wZXJhbmQsIHJlc2V0QWZ0ZXIgPSB0cnVlLCByZXR1cm5TZXF1ZW5jZSA9IGZhbHNlLFxuICAgICAgZGlyZWN0aW9uOlxuICAgICAgICAgIE1MUmVjdXJyZW50TmV0d29ya0RpcmVjdGlvbiA9IE1MUmVjdXJyZW50TmV0d29ya0RpcmVjdGlvbi5mb3J3YXJkLFxuICAgICAgbGF5b3V0OlxuICAgICAgICAgIE1MUmVjdXJyZW50TmV0d29ya1dlaWdodExheW91dCA9IE1MUmVjdXJyZW50TmV0d29ya1dlaWdodExheW91dC56cm4sXG4gICAgICBhY3RpdmF0aW9uczpcbiAgICAgICAgICBNTE9wZXJhdG9yW10gPSBbdGhpcy5idWlsZGVyLnNpZ21vaWQoKSwgdGhpcy5idWlsZGVyLnRhbmgoKV0pOiB2b2lkIHtcbiAgICB1dGlscy52YWxpZGF0ZU9wdGlvbmFsT3BlcmFuZChiaWFzKTtcbiAgICB0aGlzLmJpYXNfID0gYmlhcztcbiAgICB1dGlscy52YWxpZGF0ZU9wdGlvbmFsT3BlcmFuZChyZWN1cnJlbnRCaWFzKTtcbiAgICB0aGlzLnJlY3VycmVudEJpYXNfID0gcmVjdXJyZW50QmlhcztcbiAgICB1dGlscy52YWxpZGF0ZU9wdGlvbmFsT3BlcmFuZChpbml0aWFsSGlkZGVuU3RhdGUpO1xuICAgIHRoaXMuaW5pdGlhbEhpZGRlblN0YXRlXyA9IGluaXRpYWxIaWRkZW5TdGF0ZTtcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIHV0aWxzLmlzQm9vbGVhbihyZXNldEFmdGVyKSxcbiAgICAgICAgJ1RoZSByZXNldEFmdGVyIHBhcmFtZXRlciBpcyBub3QgYSBib29sZWFuLicpO1xuICAgIHRoaXMucmVzZXRBZnRlcl8gPSByZXNldEFmdGVyO1xuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgdXRpbHMuaXNCb29sZWFuKHJldHVyblNlcXVlbmNlKSxcbiAgICAgICAgJ1RoZSByZXNldEFmdGVyIHBhcmFtZXRlciBpcyBub3QgYSBib29sZWFuLicpO1xuICAgIHRoaXMucmV0dXJuU2VxdWVuY2VfID0gcmV0dXJuU2VxdWVuY2U7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICBkaXJlY3Rpb24gaW4gTUxSZWN1cnJlbnROZXR3b3JrRGlyZWN0aW9uLFxuICAgICAgICAnVGhlIGRpcmVjdGlvbiBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICB0aGlzLmRpcmVjdGlvbl8gPSBkaXJlY3Rpb247XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICBsYXlvdXQgaW4gTUxSZWN1cnJlbnROZXR3b3JrV2VpZ2h0TGF5b3V0LFxuICAgICAgICAnVGhlIGxheW91dCBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICB0aGlzLmxheW91dF8gPSBsYXlvdXQ7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICBhY3RpdmF0aW9ucyBpbnN0YW5jZW9mIEFycmF5ICYmIGFjdGl2YXRpb25zLmxlbmd0aCA9PT0gMiAmJlxuICAgICAgICAgICAgYWN0aXZhdGlvbnMuZXZlcnkoYSA9PiBhIGluc3RhbmNlb2YgVW5hcnlNTE9wZXJhdG9yKSxcbiAgICAgICAgJ1RoZSBhY3RpdmF0aW9ucyBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICB0aGlzLmFjdGl2YXRpb25zXyA9IGFjdGl2YXRpb25zO1xuICB9XG5cbiAgaW5wdXRzKCk6IE1MT3BlcmFuZFtdIHtcbiAgICBjb25zdCBpbnB1dHM6IE1MT3BlcmFuZFtdID1cbiAgICAgICAgW3RoaXMuaW5wdXRfLCB0aGlzLndlaWdodF8sIHRoaXMucmVjdXJyZW50V2VpZ2h0X107XG4gICAgaWYgKHRoaXMuYmlhc18pIHtcbiAgICAgIGlucHV0cy5wdXNoKHRoaXMuYmlhc18pO1xuICAgIH1cbiAgICBpZiAodGhpcy5yZWN1cnJlbnRCaWFzXykge1xuICAgICAgaW5wdXRzLnB1c2godGhpcy5yZWN1cnJlbnRCaWFzXyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmluaXRpYWxIaWRkZW5TdGF0ZV8pIHtcbiAgICAgIGlucHV0cy5wdXNoKHRoaXMuaW5pdGlhbEhpZGRlblN0YXRlXyk7XG4gICAgfVxuICAgIHJldHVybiBpbnB1dHM7XG4gIH1cblxuICBjb21wdXRlSW1wbChpbnB1dFRlbnNvcnM6IE1hcDxNTE9wZXJhbmQsIHRmLlRlbnNvcj4pOiB0Zi5UZW5zb3JbXSB7XG4gICAgY29uc3QgaW5wdXQgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuaW5wdXRfKTtcbiAgICBjb25zdCB3ZWlnaHQgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMud2VpZ2h0Xyk7XG4gICAgY29uc3QgcmVjdXJyZW50V2VpZ2h0ID0gaW5wdXRUZW5zb3JzLmdldCh0aGlzLnJlY3VycmVudFdlaWdodF8pO1xuICAgIGNvbnN0IGJpYXMgPSB0aGlzLmJpYXNfID8gaW5wdXRUZW5zb3JzLmdldCh0aGlzLmJpYXNfKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCByZWN1cnJlbnRCaWFzID0gdGhpcy5yZWN1cnJlbnRXZWlnaHRfID9cbiAgICAgICAgaW5wdXRUZW5zb3JzLmdldCh0aGlzLnJlY3VycmVudEJpYXNfKSA6XG4gICAgICAgIHVuZGVmaW5lZDtcbiAgICBjb25zdCBpbml0aWFsSGlkZGVuU3RhdGUgPSB0aGlzLmluaXRpYWxIaWRkZW5TdGF0ZV8gP1xuICAgICAgICBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuaW5pdGlhbEhpZGRlblN0YXRlXykgOlxuICAgICAgICB1bmRlZmluZWQ7XG4gICAgY29uc3Qgc3RlcHMgPSB0aGlzLnN0ZXBzXztcbiAgICBjb25zdCBoaWRkZW5TaXplID0gdGhpcy5oaWRkZW5TaXplXztcbiAgICBjb25zdCByZXNldEFmdGVyID0gdGhpcy5yZXNldEFmdGVyXztcbiAgICBjb25zdCByZXR1cm5TZXF1ZW5jZSA9IHRoaXMucmV0dXJuU2VxdWVuY2VfO1xuICAgIGNvbnN0IGxheW91dCA9IHRoaXMubGF5b3V0XztcbiAgICBjb25zdCBhY3RpdmF0aW9ucyA9IHRoaXMuYWN0aXZhdGlvbnNfO1xuICAgIGNvbnN0IGRpcmVjdGlvbiA9IHRoaXMuZGlyZWN0aW9uXztcblxuICAgIGNvbnN0IG51bURpcmVjdGlvbnMgPVxuICAgICAgICAoZGlyZWN0aW9uID09PSBNTFJlY3VycmVudE5ldHdvcmtEaXJlY3Rpb24uYm90aCA/IDIgOiAxKTtcbiAgICBsZXQgaGlkZGVuU3RhdGUgPSBpbml0aWFsSGlkZGVuU3RhdGU7XG5cbiAgICBpZiAoaGlkZGVuU3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaGlkZGVuU3RhdGUgPSB0Zi56ZXJvcyhbbnVtRGlyZWN0aW9ucywgMSwgaGlkZGVuU2l6ZV0pO1xuICAgIH1cblxuICAgIGxldCBzZXF1ZW5jZTogdGYuVGVuc29yO1xuICAgIGNvbnN0IGNlbGxXZWlnaHQ6IHRmLlRlbnNvcltdID0gW107XG4gICAgY29uc3QgY2VsbFJlY3VycmVudFdlaWdodDogdGYuVGVuc29yW10gPSBbXTtcbiAgICBjb25zdCBjZWxsQmlhczogdGYuVGVuc29yW10gPSBbXTtcbiAgICBjb25zdCBjZWxsUmVjdXJyZW50QmlhczogdGYuVGVuc29yW10gPSBbXTtcblxuICAgIGZvciAobGV0IHNsb3QgPSAwOyBzbG90IDwgbnVtRGlyZWN0aW9uczsgKytzbG90KSB7XG4gICAgICBjZWxsV2VpZ2h0LnB1c2goXG4gICAgICAgICAgdGYuc3F1ZWV6ZSh0Zi5zbGljZSh3ZWlnaHQsIFtzbG90LCAwLCAwXSwgWzEsIC0xLCAtMV0pLCBbMF0pKTtcbiAgICAgIGNlbGxSZWN1cnJlbnRXZWlnaHQucHVzaCh0Zi5zcXVlZXplKFxuICAgICAgICAgIHRmLnNsaWNlKHJlY3VycmVudFdlaWdodCwgW3Nsb3QsIDAsIDBdLCBbMSwgLTEsIC0xXSksIFswXSkpO1xuICAgICAgY2VsbEJpYXMucHVzaChcbiAgICAgICAgICBiaWFzID8gKHRmLnNxdWVlemUodGYuc2xpY2UoYmlhcywgW3Nsb3QsIDBdLCBbMSwgLTFdKSwgWzBdKSkgOlxuICAgICAgICAgICAgICAgICB1bmRlZmluZWQpO1xuICAgICAgY2VsbFJlY3VycmVudEJpYXMucHVzaChcbiAgICAgICAgICByZWN1cnJlbnRCaWFzID9cbiAgICAgICAgICAgICAgKHRmLnNxdWVlemUodGYuc2xpY2UocmVjdXJyZW50QmlhcywgW3Nsb3QsIDBdLCBbMSwgLTFdKSwgWzBdKSkgOlxuICAgICAgICAgICAgICB1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIGZvciAobGV0IHN0ZXAgPSAwOyBzdGVwIDwgc3RlcHM7ICsrc3RlcCkge1xuICAgICAgY29uc3QgY2VsbEhpZGRlbjogdGYuVGVuc29yW10gPSBbXTtcbiAgICAgIGxldCBjZWxsT3V0cHV0OiB0Zi5UZW5zb3I7XG5cbiAgICAgIGZvciAobGV0IHNsb3QgPSAwOyBzbG90IDwgbnVtRGlyZWN0aW9uczsgKytzbG90KSB7XG4gICAgICAgIGNlbGxIaWRkZW4ucHVzaChcbiAgICAgICAgICAgIHRmLnNxdWVlemUodGYuc2xpY2UoaGlkZGVuU3RhdGUsIFtzbG90LCAwLCAwXSwgWzEsIC0xLCAtMV0pLCBbMF0pKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgc2xvdCA9IDA7IHNsb3QgPCBudW1EaXJlY3Rpb25zOyArK3Nsb3QpIHtcbiAgICAgICAgY29uc3Qgc2xpY2UgPVxuICAgICAgICAgICAgKHNsb3QgPT09IDEgfHwgZGlyZWN0aW9uID09PSBNTFJlY3VycmVudE5ldHdvcmtEaXJlY3Rpb24uYmFja3dhcmQgP1xuICAgICAgICAgICAgICAgICBzdGVwcyAtIHN0ZXAgLSAxIDpcbiAgICAgICAgICAgICAgICAgc3RlcCk7XG4gICAgICAgIGNvbnN0IGNlbGxJbnB1dCA9XG4gICAgICAgICAgICB0Zi5zcXVlZXplKHRmLnNsaWNlKGlucHV0LCBbc2xpY2UsIDAsIDBdLCBbMSwgLTEsIC0xXSksIFswXSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGYucmVzaGFwZShcbiAgICAgICAgICAgIEdydUNlbGwuY29tcHV0ZShcbiAgICAgICAgICAgICAgICBjZWxsSW5wdXQsIGNlbGxXZWlnaHRbc2xvdF0sIGNlbGxSZWN1cnJlbnRXZWlnaHRbc2xvdF0sXG4gICAgICAgICAgICAgICAgY2VsbEhpZGRlbltzbG90XSwgaGlkZGVuU2l6ZSwgYWN0aXZhdGlvbnMsIGNlbGxCaWFzW3Nsb3RdLFxuICAgICAgICAgICAgICAgIGNlbGxSZWN1cnJlbnRCaWFzW3Nsb3RdLCByZXNldEFmdGVyLCBsYXlvdXQpLFxuICAgICAgICAgICAgWzEsIC0xLCBoaWRkZW5TaXplXSk7XG5cbiAgICAgICAgY2VsbE91dHB1dCA9IChjZWxsT3V0cHV0ID8gdGYuY29uY2F0KFtjZWxsT3V0cHV0LCByZXN1bHRdLCAwKSA6IHJlc3VsdCk7XG4gICAgICB9XG5cbiAgICAgIGhpZGRlblN0YXRlID0gY2VsbE91dHB1dDtcblxuICAgICAgaWYgKHJldHVyblNlcXVlbmNlKSB7XG4gICAgICAgIGNlbGxPdXRwdXQgPSB0Zi5yZXNoYXBlKGNlbGxPdXRwdXQsIFsxLCBudW1EaXJlY3Rpb25zLCAtMSwgaGlkZGVuU2l6ZV0pO1xuICAgICAgICBzZXF1ZW5jZSA9XG4gICAgICAgICAgICAoc2VxdWVuY2UgPyB0Zi5jb25jYXQoW3NlcXVlbmNlLCBjZWxsT3V0cHV0XSwgMCkgOiBjZWxsT3V0cHV0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gW2hpZGRlblN0YXRlLCBzZXF1ZW5jZV07XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdydUNlbGwgZXh0ZW5kcyBTaW5nbGVPdXRwdXRPcGVyYXRpb24ge1xuICBwcml2YXRlIGlucHV0XzogTUxPcGVyYW5kO1xuICBwcml2YXRlIHdlaWdodF86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSByZWN1cnJlbnRXZWlnaHRfOiBNTE9wZXJhbmQ7XG4gIHByaXZhdGUgaGlkZGVuU3RhdGVfOiBNTE9wZXJhbmQ7XG4gIHByaXZhdGUgaGlkZGVuU2l6ZV86IG51bWJlcjtcbiAgcHJpdmF0ZSBiaWFzXz86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSByZWN1cnJlbnRCaWFzXz86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSByZXNldEFmdGVyXzogYm9vbGVhbjtcbiAgcHJpdmF0ZSBsYXlvdXRfOiBNTFJlY3VycmVudE5ldHdvcmtXZWlnaHRMYXlvdXQ7XG4gIHByaXZhdGUgYWN0aXZhdGlvbnNfOiBNTE9wZXJhdG9yW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBpbnB1dDogTUxPcGVyYW5kLCB3ZWlnaHQ6IE1MT3BlcmFuZCwgcmVjdXJyZW50V2VpZ2h0OiBNTE9wZXJhbmQsXG4gICAgICBoaWRkZW5TdGF0ZTogTUxPcGVyYW5kLCBoaWRkZW5TaXplOiBudW1iZXIsXG4gICAgICBvcHRpb25zOiBNTEdydUNlbGxPcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihpbnB1dC5idWlsZGVyKTtcbiAgICB1dGlscy52YWxpZGF0ZU9wZXJhbmQoaW5wdXQpO1xuICAgIHRoaXMuaW5wdXRfID0gaW5wdXQ7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKHdlaWdodCk7XG4gICAgdGhpcy53ZWlnaHRfID0gd2VpZ2h0O1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZChyZWN1cnJlbnRXZWlnaHQpO1xuICAgIHRoaXMucmVjdXJyZW50V2VpZ2h0XyA9IHJlY3VycmVudFdlaWdodDtcbiAgICB1dGlscy52YWxpZGF0ZU9wZXJhbmQoaGlkZGVuU3RhdGUpO1xuICAgIHRoaXMuaGlkZGVuU3RhdGVfID0gaGlkZGVuU3RhdGU7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICB1dGlscy5pc0ludGVnZXIoaGlkZGVuU2l6ZSkgJiYgaGlkZGVuU2l6ZSA+IDAsXG4gICAgICAgICdUaGUgaGlkZGVuU2l6ZSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICB0aGlzLmhpZGRlblNpemVfID0gaGlkZGVuU2l6ZTtcbiAgICB0aGlzLmluaXRPcHRpb25zKFxuICAgICAgICBvcHRpb25zLmJpYXMsIG9wdGlvbnMucmVjdXJyZW50Qmlhcywgb3B0aW9ucy5yZXNldEFmdGVyLCBvcHRpb25zLmxheW91dCxcbiAgICAgICAgb3B0aW9ucy5hY3RpdmF0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIGluaXRPcHRpb25zKFxuICAgICAgYmlhcz86IE1MT3BlcmFuZCwgcmVjdXJyZW50Qmlhcz86IE1MT3BlcmFuZCwgcmVzZXRBZnRlciA9IHRydWUsXG4gICAgICBsYXlvdXQ6XG4gICAgICAgICAgTUxSZWN1cnJlbnROZXR3b3JrV2VpZ2h0TGF5b3V0ID0gTUxSZWN1cnJlbnROZXR3b3JrV2VpZ2h0TGF5b3V0LnpybixcbiAgICAgIGFjdGl2YXRpb25zOlxuICAgICAgICAgIE1MT3BlcmF0b3JbXSA9IFt0aGlzLmJ1aWxkZXIuc2lnbW9pZCgpLCB0aGlzLmJ1aWxkZXIudGFuaCgpXSkge1xuICAgIHV0aWxzLnZhbGlkYXRlT3B0aW9uYWxPcGVyYW5kKGJpYXMpO1xuICAgIHRoaXMuYmlhc18gPSBiaWFzO1xuICAgIHV0aWxzLnZhbGlkYXRlT3B0aW9uYWxPcGVyYW5kKHJlY3VycmVudEJpYXMpO1xuICAgIHRoaXMucmVjdXJyZW50Qmlhc18gPSByZWN1cnJlbnRCaWFzO1xuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgdXRpbHMuaXNCb29sZWFuKHJlc2V0QWZ0ZXIpLFxuICAgICAgICAnVGhlIHJlc2V0QWZ0ZXIgcGFyYW1ldGVyIGlzIG5vdCBhIGJvb2xlYW4uJyk7XG4gICAgdGhpcy5yZXNldEFmdGVyXyA9IHJlc2V0QWZ0ZXI7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICBsYXlvdXQgaW4gTUxSZWN1cnJlbnROZXR3b3JrV2VpZ2h0TGF5b3V0LFxuICAgICAgICAnVGhlIGxheW91dCBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICB0aGlzLmxheW91dF8gPSBsYXlvdXQ7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICBhY3RpdmF0aW9ucyBpbnN0YW5jZW9mIEFycmF5ICYmIGFjdGl2YXRpb25zLmxlbmd0aCA9PT0gMiAmJlxuICAgICAgICAgICAgYWN0aXZhdGlvbnMuZXZlcnkoYSA9PiBhIGluc3RhbmNlb2YgVW5hcnlNTE9wZXJhdG9yKSxcbiAgICAgICAgJ1RoZSBhY3RpdmF0aW9ucyBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICB0aGlzLmFjdGl2YXRpb25zXyA9IGFjdGl2YXRpb25zO1xuICB9XG5cbiAgaW5wdXRzKCk6IE1MT3BlcmFuZFtdIHtcbiAgICBjb25zdCBpbnB1dHM6IE1MT3BlcmFuZFtdID1cbiAgICAgICAgW3RoaXMuaW5wdXRfLCB0aGlzLndlaWdodF8sIHRoaXMucmVjdXJyZW50V2VpZ2h0XywgdGhpcy5oaWRkZW5TdGF0ZV9dO1xuICAgIGlmICh0aGlzLmJpYXNfKSB7XG4gICAgICBpbnB1dHMucHVzaCh0aGlzLmJpYXNfKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucmVjdXJyZW50Qmlhc18pIHtcbiAgICAgIGlucHV0cy5wdXNoKHRoaXMucmVjdXJyZW50Qmlhc18pO1xuICAgIH1cbiAgICByZXR1cm4gaW5wdXRzO1xuICB9XG5cbiAgc3RhdGljIGNvbXB1dGUoXG4gICAgICBpbnB1dDogdGYuVGVuc29yLCB3ZWlnaHQ6IHRmLlRlbnNvciwgcmVjdXJyZW50V2VpZ2h0OiB0Zi5UZW5zb3IsXG4gICAgICBoaWRkZW5TdGF0ZTogdGYuVGVuc29yLCBoaWRkZW5TaXplOiBudW1iZXIsIGFjdGl2YXRpb25zOiBNTE9wZXJhdG9yW10sXG4gICAgICBiaWFzPzogdGYuVGVuc29yLCByZWN1cnJlbnRCaWFzPzogdGYuVGVuc29yLCByZXNldEFmdGVyID0gdHJ1ZSxcbiAgICAgIGxheW91dDpcbiAgICAgICAgICBNTFJlY3VycmVudE5ldHdvcmtXZWlnaHRMYXlvdXQgPSBNTFJlY3VycmVudE5ldHdvcmtXZWlnaHRMYXlvdXQuenJuKTpcbiAgICAgIHRmLlRlbnNvciB7XG4gICAgY29uc3Qgb25lID0gdGYuc2NhbGFyKDEpO1xuICAgIGNvbnN0IHplcm8gPSB0Zi5zY2FsYXIoMCk7XG4gICAgY29uc3Qgc3RhcnRzID0gbGF5b3V0ID09PSBNTFJlY3VycmVudE5ldHdvcmtXZWlnaHRMYXlvdXQuenJuID9cbiAgICAgICAge3o6IDAsIHI6IGhpZGRlblNpemUsIG46IDIgKiBoaWRkZW5TaXplfSA6XG4gICAgICAgIC8qcnpuKi8ge3I6IDAsIHo6IGhpZGRlblNpemUsIG46IDIgKiBoaWRkZW5TaXplfTtcbiAgICBjb25zdCBhY3RpdmF0aW9uMDogVW5hcnlNTE9wZXJhdG9yID0gYWN0aXZhdGlvbnNbMF0gYXMgVW5hcnlNTE9wZXJhdG9yO1xuICAgIGNvbnN0IGFjdGl2YXRpb24xOiBVbmFyeU1MT3BlcmF0b3IgPSBhY3RpdmF0aW9uc1sxXSBhcyBVbmFyeU1MT3BlcmF0b3I7XG4gICAgLy8gdXBkYXRlIGdhdGVcbiAgICBjb25zdCB6ID0gYWN0aXZhdGlvbjAucnVuT3AodGYuYWRkKFxuICAgICAgICB0Zi5hZGQoXG4gICAgICAgICAgICAoYmlhcyA/IHRmLnNsaWNlKGJpYXMsIFtzdGFydHMuel0sIFtoaWRkZW5TaXplXSkgOiB6ZXJvKSxcbiAgICAgICAgICAgIChyZWN1cnJlbnRCaWFzID8gdGYuc2xpY2UocmVjdXJyZW50QmlhcywgW3N0YXJ0cy56XSwgW2hpZGRlblNpemVdKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHplcm8pKSxcbiAgICAgICAgdGYuYWRkKFxuICAgICAgICAgICAgdGYubWF0TXVsKFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIHRmLnRyYW5zcG9zZShcbiAgICAgICAgICAgICAgICAgICAgdGYuc2xpY2Uod2VpZ2h0LCBbc3RhcnRzLnosIDBdLCBbaGlkZGVuU2l6ZSwgLTFdKSkpLFxuICAgICAgICAgICAgdGYubWF0TXVsKFxuICAgICAgICAgICAgICAgIGhpZGRlblN0YXRlLFxuICAgICAgICAgICAgICAgIHRmLnRyYW5zcG9zZSh0Zi5zbGljZShcbiAgICAgICAgICAgICAgICAgICAgcmVjdXJyZW50V2VpZ2h0LCBbc3RhcnRzLnosIDBdLCBbaGlkZGVuU2l6ZSwgLTFdKSkpKSkpO1xuICAgIC8vIHJlc2V0IGdhdGVcbiAgICBjb25zdCByID0gYWN0aXZhdGlvbjAucnVuT3AodGYuYWRkKFxuICAgICAgICB0Zi5hZGQoXG4gICAgICAgICAgICAoYmlhcyA/IHRmLnNsaWNlKGJpYXMsIFtzdGFydHMucl0sIFtoaWRkZW5TaXplXSkgOiB6ZXJvKSxcbiAgICAgICAgICAgIChyZWN1cnJlbnRCaWFzID8gdGYuc2xpY2UocmVjdXJyZW50QmlhcywgW3N0YXJ0cy5yXSwgW2hpZGRlblNpemVdKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHplcm8pKSxcbiAgICAgICAgdGYuYWRkKFxuICAgICAgICAgICAgdGYubWF0TXVsKFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIHRmLnRyYW5zcG9zZShcbiAgICAgICAgICAgICAgICAgICAgdGYuc2xpY2Uod2VpZ2h0LCBbc3RhcnRzLnIsIDBdLCBbaGlkZGVuU2l6ZSwgLTFdKSkpLFxuICAgICAgICAgICAgdGYubWF0TXVsKFxuICAgICAgICAgICAgICAgIGhpZGRlblN0YXRlLFxuICAgICAgICAgICAgICAgIHRmLnRyYW5zcG9zZSh0Zi5zbGljZShcbiAgICAgICAgICAgICAgICAgICAgcmVjdXJyZW50V2VpZ2h0LCBbc3RhcnRzLnIsIDBdLCBbaGlkZGVuU2l6ZSwgLTFdKSkpKSkpO1xuICAgIC8vIG5ldyBnYXRlXG4gICAgbGV0IG47XG4gICAgaWYgKHJlc2V0QWZ0ZXIpIHtcbiAgICAgIG4gPSBhY3RpdmF0aW9uMS5ydW5PcCh0Zi5hZGQoXG4gICAgICAgICAgKGJpYXMgPyB0Zi5zbGljZShiaWFzLCBbc3RhcnRzLm5dLCBbaGlkZGVuU2l6ZV0pIDogemVybyksXG4gICAgICAgICAgdGYuYWRkKFxuICAgICAgICAgICAgICB0Zi5tYXRNdWwoXG4gICAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICAgIHRmLnRyYW5zcG9zZShcbiAgICAgICAgICAgICAgICAgICAgICB0Zi5zbGljZSh3ZWlnaHQsIFtzdGFydHMubiwgMF0sIFtoaWRkZW5TaXplLCAtMV0pKSksXG4gICAgICAgICAgICAgIHRmLm11bChcbiAgICAgICAgICAgICAgICAgIHIsXG4gICAgICAgICAgICAgICAgICB0Zi5hZGQoXG4gICAgICAgICAgICAgICAgICAgICAgKHJlY3VycmVudEJpYXMgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgdGYuc2xpY2UocmVjdXJyZW50QmlhcywgW3N0YXJ0cy5uXSwgW2hpZGRlblNpemVdKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICB6ZXJvKSxcbiAgICAgICAgICAgICAgICAgICAgICB0Zi5tYXRNdWwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlblN0YXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0Zi50cmFuc3Bvc2UodGYuc2xpY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN1cnJlbnRXZWlnaHQsIFtzdGFydHMubiwgMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZGVuU2l6ZSwgLTFdKSkpKSkpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG4gPSBhY3RpdmF0aW9uMS5ydW5PcCh0Zi5hZGQoXG4gICAgICAgICAgdGYuYWRkKFxuICAgICAgICAgICAgICAoYmlhcyA/IHRmLnNsaWNlKGJpYXMsIFtzdGFydHMubl0sIFtoaWRkZW5TaXplXSkgOiB6ZXJvKSxcbiAgICAgICAgICAgICAgKHJlY3VycmVudEJpYXMgP1xuICAgICAgICAgICAgICAgICAgIHRmLnNsaWNlKHJlY3VycmVudEJpYXMsIFtzdGFydHMubl0sIFtoaWRkZW5TaXplXSkgOlxuICAgICAgICAgICAgICAgICAgIHplcm8pKSxcbiAgICAgICAgICB0Zi5hZGQoXG4gICAgICAgICAgICAgIHRmLm1hdE11bChcbiAgICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgICAgdGYudHJhbnNwb3NlKFxuICAgICAgICAgICAgICAgICAgICAgIHRmLnNsaWNlKHdlaWdodCwgW3N0YXJ0cy5uLCAwXSwgW2hpZGRlblNpemUsIC0xXSkpKSxcbiAgICAgICAgICAgICAgdGYubWF0TXVsKFxuICAgICAgICAgICAgICAgICAgdGYubXVsKHIsIGhpZGRlblN0YXRlKSxcbiAgICAgICAgICAgICAgICAgIHRmLnRyYW5zcG9zZSh0Zi5zbGljZShcbiAgICAgICAgICAgICAgICAgICAgICByZWN1cnJlbnRXZWlnaHQsIFtzdGFydHMubiwgMF0sIFtoaWRkZW5TaXplLCAtMV0pKSkpKSk7XG4gICAgfVxuICAgIC8vIGNvbXB1dGUgdGhlIG5ldyBoaWRkZW4gc3RhdGVcbiAgICByZXR1cm4gdGYuYWRkKHRmLm11bCh6LCBoaWRkZW5TdGF0ZSksIHRmLm11bChuLCB0Zi5zdWIob25lLCB6KSkpO1xuICB9XG5cbiAgcnVuKGlucHV0VGVuc29yczogTWFwPE1MT3BlcmFuZCwgdGYuVGVuc29yPik6IHRmLlRlbnNvciB7XG4gICAgcmV0dXJuIEdydUNlbGwuY29tcHV0ZShcbiAgICAgICAgaW5wdXRUZW5zb3JzLmdldCh0aGlzLmlucHV0XyksIGlucHV0VGVuc29ycy5nZXQodGhpcy53ZWlnaHRfKSxcbiAgICAgICAgaW5wdXRUZW5zb3JzLmdldCh0aGlzLnJlY3VycmVudFdlaWdodF8pLFxuICAgICAgICBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuaGlkZGVuU3RhdGVfKSwgdGhpcy5oaWRkZW5TaXplXyxcbiAgICAgICAgdGhpcy5hY3RpdmF0aW9uc18sXG4gICAgICAgIHRoaXMuYmlhc18gPyBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuYmlhc18pIDogdW5kZWZpbmVkLFxuICAgICAgICB0aGlzLnJlY3VycmVudEJpYXNfID8gaW5wdXRUZW5zb3JzLmdldCh0aGlzLnJlY3VycmVudEJpYXNfKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgdGhpcy5yZXNldEFmdGVyXywgdGhpcy5sYXlvdXRfKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNTElucHV0T3BlcmFuZExheW91dCwgTUxJbnN0YW5jZU5vcm1hbGl6YXRpb25PcHRpb25zfSBmcm9tICcuLi9ncmFwaF9idWlsZGVyJztcbmltcG9ydCB7TUxPcGVyYW5kfSBmcm9tICcuLi9vcGVyYW5kJztcbmltcG9ydCB7U2luZ2xlT3V0cHV0T3BlcmF0aW9ufSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgSW5zdGFuY2VOb3JtYWxpemF0aW9uIGV4dGVuZHMgU2luZ2xlT3V0cHV0T3BlcmF0aW9uIHtcbiAgcHJpdmF0ZSBpbnB1dF86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSBzY2FsZV8/OiBNTE9wZXJhbmQ7XG4gIHByaXZhdGUgYmlhc18/OiBNTE9wZXJhbmQ7XG4gIHByaXZhdGUgZXBzaWxvbl8/OiBudW1iZXI7XG4gIHByaXZhdGUgbGF5b3V0XzogTUxJbnB1dE9wZXJhbmRMYXlvdXQ7XG5cbiAgY29uc3RydWN0b3IoaW5wdXQ6IE1MT3BlcmFuZCwgb3B0aW9uczogTUxJbnN0YW5jZU5vcm1hbGl6YXRpb25PcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihpbnB1dC5idWlsZGVyKTtcbiAgICB1dGlscy52YWxpZGF0ZU9wZXJhbmQoaW5wdXQpO1xuICAgIHRoaXMuaW5wdXRfID0gaW5wdXQ7XG4gICAgdXRpbHMudmFsaWRhdGVPcHRpb25hbE9wZXJhbmQob3B0aW9ucy5zY2FsZSk7XG4gICAgdGhpcy5zY2FsZV8gPSBvcHRpb25zLnNjYWxlO1xuICAgIHV0aWxzLnZhbGlkYXRlT3B0aW9uYWxPcGVyYW5kKG9wdGlvbnMuYmlhcyk7XG4gICAgdGhpcy5iaWFzXyA9IG9wdGlvbnMuYmlhcztcbiAgICBpZiAob3B0aW9ucy5lcHNpbG9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGVwc2lsb24gPSBvcHRpb25zLmVwc2lsb247XG4gICAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgICAgdHlwZW9mIGVwc2lsb24gPT09ICdudW1iZXInLCAnVGhlIGVwc2lsb24gcGFyYW1ldGVyIGlzIGludmFsaWQnKTtcbiAgICAgIHRoaXMuZXBzaWxvbl8gPSBlcHNpbG9uO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVwc2lsb25fID0gMWUtNTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMubGF5b3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgICBvcHRpb25zLmxheW91dCBpbiBNTElucHV0T3BlcmFuZExheW91dCxcbiAgICAgICAgICAnVGhlIGxheW91dCBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICAgIHRoaXMubGF5b3V0XyA9IG9wdGlvbnMubGF5b3V0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxheW91dF8gPSBNTElucHV0T3BlcmFuZExheW91dC5uY2h3O1xuICAgIH1cbiAgfVxuXG4gIGlucHV0cygpOiBNTE9wZXJhbmRbXSB7XG4gICAgY29uc3QgaW5wdXRzOiBNTE9wZXJhbmRbXSA9IFt0aGlzLmlucHV0X107XG4gICAgaWYgKHRoaXMuc2NhbGVfKSB7XG4gICAgICBpbnB1dHMucHVzaCh0aGlzLnNjYWxlXyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmJpYXNfKSB7XG4gICAgICBpbnB1dHMucHVzaCh0aGlzLmJpYXNfKTtcbiAgICB9XG4gICAgcmV0dXJuIGlucHV0cztcbiAgfVxuXG4gIHJ1bihpbnB1dFRlbnNvcnM6IE1hcDxNTE9wZXJhbmQsIHRmLlRlbnNvcj4pOiB0Zi5UZW5zb3Ige1xuICAgIGNvbnN0IGlucHV0OiB0Zi5UZW5zb3IgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuaW5wdXRfKTtcbiAgICB1dGlscy5hc3NlcnQoaW5wdXQucmFuayA9PT0gNCwgJ1RoZSBpbnB1dCBvcGVyYW5kIGlzIG5vdCA0LUQuJyk7XG4gICAgbGV0IGF4ZXMgPSBbMiwgM107XG4gICAgbGV0IHNoYXBlID0gWzEsIC0xLCAxLCAxXTtcbiAgICBsZXQgaW5wdXRDaGFubmVscyA9IGlucHV0LnNoYXBlWzFdO1xuICAgIGlmICh0aGlzLmxheW91dF8gPT09IE1MSW5wdXRPcGVyYW5kTGF5b3V0Lm5od2MpIHtcbiAgICAgIGF4ZXMgPSBbMSwgMl07XG4gICAgICBzaGFwZSA9IFsxLCAxLCAxLCAtMV07XG4gICAgICBpbnB1dENoYW5uZWxzID0gaW5wdXQuc2hhcGVbM107XG4gICAgfVxuICAgIGxldCBzY2FsZTogdGYuVGVuc29yO1xuICAgIGlmICh0aGlzLnNjYWxlXykge1xuICAgICAgc2NhbGUgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuc2NhbGVfKTtcbiAgICAgIHV0aWxzLmFzc2VydChzY2FsZS5yYW5rID09PSAxLCAnVGhlIHNjYWxlIG9wZXJhbmQgaXMgbm90IDEtRC4nKTtcbiAgICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgICBzY2FsZS5zaGFwZVswXSA9PT0gaW5wdXRDaGFubmVscyxcbiAgICAgICAgICAnVGhlIGxlbmd0aCBvZiBzY2FsZSBpcyBub3QgZXF1YWwgdG8gdGhlIHNpemUgb2YgdGhlIGZlYXR1cmUgJyArXG4gICAgICAgICAgICAgICdkaW1lbnNpb24gb2YgdGhlIGlucHV0LicpO1xuICAgIH0gZWxzZSB7XG4gICAgfVxuICAgIGxldCBiaWFzOiB0Zi5UZW5zb3I7XG4gICAgaWYgKHRoaXMuYmlhc18pIHtcbiAgICAgIGJpYXMgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuYmlhc18pO1xuICAgICAgdXRpbHMuYXNzZXJ0KGJpYXMucmFuayA9PT0gMSwgJ1RoZSBiaWFzIG9wZXJhbmQgaXMgbm90IDEtRC4nKTtcbiAgICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgICBiaWFzLnNoYXBlWzBdID09PSBpbnB1dENoYW5uZWxzLFxuICAgICAgICAgICdUaGUgbGVuZ3RoIG9mIGJpYXMgaXMgbm90IGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoZSBmZWF0dXJlICcgK1xuICAgICAgICAgICAgICAnZGltZW5zaW9uIG9mIHRoZSBpbnB1dC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBtZWFuID0gdGYubWVhbihpbnB1dCwgYXhlcywgdHJ1ZSk7XG4gICAgY29uc3QgdmFyaWFuY2UgPSB0Zi5tZWFuKHRmLnBvdyh0Zi5zdWIoaW5wdXQsIG1lYW4pLCAyKSwgYXhlcywgdHJ1ZSk7XG4gICAgY29uc3Qgbm9ybSA9IHRmLmRpdihcbiAgICAgICAgdGYuc3ViKGlucHV0LCBtZWFuKSwgdGYuc3FydCh0Zi5hZGQodmFyaWFuY2UsIHRoaXMuZXBzaWxvbl8pKSk7XG4gICAgY29uc3Qgc2NhbGVkID0gc2NhbGUgPyB0Zi5tdWwodGYucmVzaGFwZShzY2FsZSwgc2hhcGUpLCBub3JtKSA6IG5vcm07XG4gICAgcmV0dXJuIGJpYXMgPyB0Zi5hZGQodGYucmVzaGFwZShiaWFzLCBzaGFwZSksIHNjYWxlZCkgOiBzY2FsZWQ7XG4gIH1cbn0iLCJpbXBvcnQgKiBhcyB0ZiBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01MT3BlcmFuZH0gZnJvbSAnLi4vb3BlcmFuZCc7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuLi91dGlscyc7XG5cbmltcG9ydCB7VW5hcnlNTE9wZXJhdG9yfSBmcm9tICcuL3VuYXJ5JztcblxuZXhwb3J0IGNsYXNzIExlYWt5UmVsdSBleHRlbmRzIFVuYXJ5TUxPcGVyYXRvciB7XG4gIHByaXZhdGUgYWxwaGFfPzogbnVtYmVyO1xuXG4gIGdldCBhbHBoYSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmFscGhhXztcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHg6IE1MT3BlcmFuZCwgYWxwaGEgPSAwLjAxKSB7XG4gICAgc3VwZXIoeCk7XG4gICAgdXRpbHMuYXNzZXJ0KHR5cGVvZiBhbHBoYSA9PT0gJ251bWJlcicsICdUaGUgYWxwaGEgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5hbHBoYV8gPSBhbHBoYTtcbiAgfVxuXG4gIHJ1bk9wKHg6IHRmLlRlbnNvcik6IHRmLlRlbnNvciB7XG4gICAgcmV0dXJuIHRmLmxlYWt5UmVsdSh4LCB0aGlzLmFscGhhXyk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIHRmIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TUxQYWRkaW5nTW9kZSwgTUxQYWRPcHRpb25zfSBmcm9tICcuLi9ncmFwaF9idWlsZGVyJztcbmltcG9ydCB7TUxPcGVyYW5kfSBmcm9tICcuLi9vcGVyYW5kJztcbmltcG9ydCB7U2luZ2xlT3V0cHV0T3BlcmF0aW9ufSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgUGFkIGV4dGVuZHMgU2luZ2xlT3V0cHV0T3BlcmF0aW9uIHtcbiAgcHJpdmF0ZSBpbnB1dF86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSBwYWRkaW5nXzogTUxPcGVyYW5kO1xuICBwcml2YXRlIG1vZGVfOiBNTFBhZGRpbmdNb2RlID0gTUxQYWRkaW5nTW9kZS5jb25zdGFudDtcbiAgcHJpdmF0ZSB2YWx1ZV8gPSAwO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgaW5wdXQ6IE1MT3BlcmFuZCwgcGFkZGluZzogTUxPcGVyYW5kLCBvcHRpb25zOiBNTFBhZE9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKGlucHV0LmJ1aWxkZXIpO1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZChpbnB1dCk7XG4gICAgdGhpcy5pbnB1dF8gPSBpbnB1dDtcbiAgICB1dGlscy52YWxpZGF0ZU9wZXJhbmQocGFkZGluZyk7XG4gICAgdGhpcy5wYWRkaW5nXyA9IHBhZGRpbmc7XG4gICAgaWYgKG9wdGlvbnMubW9kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgICAgb3B0aW9ucy5tb2RlIGluIE1MUGFkZGluZ01vZGUsICdUaGUgbW9kZSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICAgIHRoaXMubW9kZV8gPSBvcHRpb25zLm1vZGU7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMudmFsdWVfID0gb3B0aW9ucy52YWx1ZTtcbiAgICB9XG4gIH1cblxuICBpbnB1dHMoKTogTUxPcGVyYW5kW10ge1xuICAgIHJldHVybiBbdGhpcy5pbnB1dF8sIHRoaXMucGFkZGluZ19dO1xuICB9XG5cbiAgcnVuKGlucHV0VGVuc29yczogTWFwPE1MT3BlcmFuZCwgdGYuVGVuc29yPik6IHRmLlRlbnNvciB7XG4gICAgY29uc3QgaW5wdXQ6IHRmLlRlbnNvciA9IGlucHV0VGVuc29ycy5nZXQodGhpcy5pbnB1dF8pO1xuICAgIGNvbnN0IHBhZGRpbmc6IHRmLlRlbnNvciA9IGlucHV0VGVuc29ycy5nZXQodGhpcy5wYWRkaW5nXyk7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICBwYWRkaW5nLnJhbmsgPT09IDIgJiYgcGFkZGluZy5kdHlwZSA9PT0gJ2ludDMyJyAmJlxuICAgICAgICAgICAgcGFkZGluZy5zaGFwZVswXSA9PT0gaW5wdXQucmFuayxcbiAgICAgICAgJ1RoZSBwYWRkaW5nIG9wZXJhbmQgaXMgaW52YWxpZC4nKTtcbiAgICBjb25zdCBwYWRkaW5nQXJyYXkgPSBwYWRkaW5nLmFycmF5U3luYygpIGFzIEFycmF5PFtudW1iZXIsIG51bWJlcl0+O1xuICAgIGlmICh0aGlzLm1vZGVfID09PSBNTFBhZGRpbmdNb2RlLmNvbnN0YW50KSB7XG4gICAgICByZXR1cm4gdGYucGFkKGlucHV0LCBwYWRkaW5nQXJyYXksIHRoaXMudmFsdWVfKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMubW9kZV8gPT09IE1MUGFkZGluZ01vZGUuZWRnZSkge1xuICAgICAgICBjb25zdCBlZGdlUGFkZGluZ3M6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+ID1cbiAgICAgICAgICAgIG5ldyBBcnJheShwYWRkaW5nQXJyYXkubGVuZ3RoKTtcbiAgICAgICAgbGV0IHBhZGRlZDogdGYuVGVuc29yID0gaW5wdXQ7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhZGRpbmdBcnJheS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgZWRnZVBhZGRpbmdzW2ldID0gWzAsIDBdO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCAyOyArK2opIHtcbiAgICAgICAgICAgICAgaWYgKHBhZGRpbmdBcnJheVtpXVtqXSA+IDApIHtcbiAgICAgICAgICAgICAgICBlZGdlUGFkZGluZ3NbaV1bal0gPSAxO1xuICAgICAgICAgICAgICAgIHBhZGRpbmdBcnJheVtpXVtqXSAtPSAxO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGVkZ2VQYWRkaW5nc1tpXVtqXSA9IDA7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGVkZ2VQYWRkaW5ncy5ldmVyeSh2YWx1ZSA9PiB2YWx1ZVswXSA9PT0gMCAmJiB2YWx1ZVsxXSA9PT0gMCkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYWRkZWQgPSB0Zi5taXJyb3JQYWQocGFkZGVkLCBlZGdlUGFkZGluZ3MsICdzeW1tZXRyaWMnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFkZGVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IG1vZGU6ICdyZWZsZWN0J3wnc3ltbWV0cmljJztcbiAgICAgICAgaWYgKHRoaXMubW9kZV8gPT09IE1MUGFkZGluZ01vZGUucmVmbGVjdGlvbikge1xuICAgICAgICAgIG1vZGUgPSAncmVmbGVjdCc7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5tb2RlXyA9PT0gTUxQYWRkaW5nTW9kZS5zeW1tZXRyaWMpIHtcbiAgICAgICAgICBtb2RlID0gJ3N5bW1ldHJpYyc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRmLm1pcnJvclBhZChpbnB1dCwgcGFkZGluZ0FycmF5LCBtb2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0iLCJpbXBvcnQgKiBhcyB0ZiBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtFeHBsaWNpdFBhZGRpbmd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9jb252X3V0aWwnO1xuXG5pbXBvcnQge01MQXV0b1BhZCwgTUxJbnB1dE9wZXJhbmRMYXlvdXQsIE1MUG9vbGluZzJkT3B0aW9uc30gZnJvbSAnLi4vZ3JhcGhfYnVpbGRlcic7XG5pbXBvcnQge01MT3BlcmFuZH0gZnJvbSAnLi4vb3BlcmFuZCc7XG5pbXBvcnQge1NpbmdsZU91dHB1dE9wZXJhdGlvbn0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4uL3V0aWxzJztcblxudHlwZSBQb29saW5nVHlwZSA9ICdhdmcnfCdsMid8J21heCc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBQb29sIGV4dGVuZHMgU2luZ2xlT3V0cHV0T3BlcmF0aW9uIHtcbiAgcHJvdGVjdGVkIGlucHV0XzogTUxPcGVyYW5kO1xuICBwcm90ZWN0ZWQgd2luZG93RGltZW5zaW9uc18/OiBbbnVtYmVyLCBudW1iZXJdO1xuICBwcm90ZWN0ZWQgcGFkZGluZ18/OiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgcHJvdGVjdGVkIHN0cmlkZXNfPzogW251bWJlciwgbnVtYmVyXTtcbiAgcHJvdGVjdGVkIGRpbGF0aW9uc18/OiBbbnVtYmVyLCBudW1iZXJdO1xuICBwcm90ZWN0ZWQgZ3JvdXBzXz86IG51bWJlcjtcbiAgcHJvdGVjdGVkIGxheW91dF8/OiBNTElucHV0T3BlcmFuZExheW91dDtcbiAgcHJpdmF0ZSBhdXRvUGFkXz86IE1MQXV0b1BhZDtcblxuICBjb25zdHJ1Y3RvcihpbnB1dDogTUxPcGVyYW5kLCBvcHRpb25zOiBNTFBvb2xpbmcyZE9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKGlucHV0LmJ1aWxkZXIpO1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZChpbnB1dCk7XG4gICAgdGhpcy5pbnB1dF8gPSBpbnB1dDtcbiAgICB0aGlzLmluaXRPcHRpb25zKFxuICAgICAgICBvcHRpb25zLndpbmRvd0RpbWVuc2lvbnMsIG9wdGlvbnMucGFkZGluZywgb3B0aW9ucy5zdHJpZGVzLFxuICAgICAgICBvcHRpb25zLmRpbGF0aW9ucywgb3B0aW9ucy5sYXlvdXQsIG9wdGlvbnMuYXV0b1BhZCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRPcHRpb25zKFxuICAgICAgd2luZG93RGltZW5zaW9uczogW251bWJlciwgbnVtYmVyXSA9IFstMSwgLTFdLFxuICAgICAgcGFkZGluZzogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPSBbMCwgMCwgMCwgMF0sXG4gICAgICBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdID0gWzEsIDFdLCBkaWxhdGlvbnM6IFtudW1iZXIsIG51bWJlcl0gPSBbMSwgMV0sXG4gICAgICBsYXlvdXQ6IE1MSW5wdXRPcGVyYW5kTGF5b3V0ID0gTUxJbnB1dE9wZXJhbmRMYXlvdXQubmNodyxcbiAgICAgIGF1dG9QYWQ6IE1MQXV0b1BhZCA9IE1MQXV0b1BhZC5leHBsaWNpdCkge1xuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgdXRpbHMuaXNJbnRlZ2VyQXJyYXkod2luZG93RGltZW5zaW9ucykgJiYgd2luZG93RGltZW5zaW9ucy5sZW5ndGggPT09IDIsXG4gICAgICAgICdUaGUgcGFkZGluZyBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICB0aGlzLndpbmRvd0RpbWVuc2lvbnNfID0gd2luZG93RGltZW5zaW9ucztcblxuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgdXRpbHMuaXNJbnRlZ2VyQXJyYXkocGFkZGluZykgJiYgcGFkZGluZy5sZW5ndGggPT09IDQsXG4gICAgICAgICdUaGUgcGFkZGluZyBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICB0aGlzLnBhZGRpbmdfID0gcGFkZGluZztcblxuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgdXRpbHMuaXNJbnRlZ2VyQXJyYXkoc3RyaWRlcykgJiYgc3RyaWRlcy5sZW5ndGggPT09IDIsXG4gICAgICAgICdUaGUgc3RyaWRlcyBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICB0aGlzLnN0cmlkZXNfID0gc3RyaWRlcztcblxuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgdXRpbHMuaXNJbnRlZ2VyQXJyYXkoZGlsYXRpb25zKSAmJiBkaWxhdGlvbnMubGVuZ3RoID09PSAyLFxuICAgICAgICAnVGhlIGRpbGF0aW9ucyBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICB0aGlzLmRpbGF0aW9uc18gPSBkaWxhdGlvbnM7XG5cbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIGxheW91dCBpbiBNTElucHV0T3BlcmFuZExheW91dCwgJ1RoZSBsYXlvdXQgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5sYXlvdXRfID0gbGF5b3V0O1xuXG4gICAgdXRpbHMuYXNzZXJ0KGF1dG9QYWQgaW4gTUxBdXRvUGFkLCAnVGhlIGF1dG9QYWQgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5hdXRvUGFkXyA9IGF1dG9QYWQ7XG4gIH1cblxuICBpbnB1dHMoKTogTUxPcGVyYW5kW10ge1xuICAgIHJldHVybiBbdGhpcy5pbnB1dF9dO1xuICB9XG5cbiAgcnVuKGlucHV0VGVuc29yczogTWFwPE1MT3BlcmFuZCwgdGYuVGVuc29yPik6IHRmLlRlbnNvciB7XG4gICAgbGV0IGlucHV0OiB0Zi5UZW5zb3I0RCA9IGlucHV0VGVuc29ycy5nZXQodGhpcy5pbnB1dF8pIGFzIHRmLlRlbnNvcjREO1xuICAgIGNvbnN0IHBvb2xpbmdUeXBlID0gdGhpcy5nZXRQb29saW5nVHlwZSgpO1xuICAgIGlmICh0aGlzLmxheW91dF8gPT09IE1MSW5wdXRPcGVyYW5kTGF5b3V0Lm5jaHcpIHtcbiAgICAgIC8vIG5jaHcgLT4gbmh3Y1xuICAgICAgaW5wdXQgPSB0Zi50cmFuc3Bvc2UoaW5wdXQsIFswLCAyLCAzLCAxXSk7XG4gICAgfVxuICAgIGNvbnN0IHdpbmRvd0RpbWVuc2lvbnMgPSB0aGlzLndpbmRvd0RpbWVuc2lvbnNfO1xuICAgIGlmICh3aW5kb3dEaW1lbnNpb25zWzBdID09PSAtMSAmJiB3aW5kb3dEaW1lbnNpb25zWzFdID09PSAtMSkge1xuICAgICAgd2luZG93RGltZW5zaW9uc1swXSA9IGlucHV0LnNoYXBlWzFdO1xuICAgICAgd2luZG93RGltZW5zaW9uc1sxXSA9IGlucHV0LnNoYXBlWzJdO1xuICAgIH1cbiAgICBsZXQgcGFkZGluZzogJ3ZhbGlkJ3wnc2FtZSd8RXhwbGljaXRQYWRkaW5nO1xuICAgIGlmICh0aGlzLmF1dG9QYWRfID09PSBNTEF1dG9QYWQuZXhwbGljaXQpIHtcbiAgICAgIGlmICh0aGlzLnBhZGRpbmdfLmV2ZXJ5KHYgPT4gdiA9PT0gMCkpIHtcbiAgICAgICAgcGFkZGluZyA9ICd2YWxpZCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYWRkaW5nID0gW1xuICAgICAgICAgIFswLCAwXSwgW3RoaXMucGFkZGluZ19bMF0sIHRoaXMucGFkZGluZ19bMV1dLFxuICAgICAgICAgIFt0aGlzLnBhZGRpbmdfWzJdLCB0aGlzLnBhZGRpbmdfWzNdXSwgWzAsIDBdXG4gICAgICAgIF0gYXMgRXhwbGljaXRQYWRkaW5nO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5hdXRvUGFkXyA9PT0gTUxBdXRvUGFkWydzYW1lLXVwcGVyJ10pIHtcbiAgICAgICAgcGFkZGluZyA9ICdzYW1lJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgZXhwbGljaXQgcGFkZGluZ3MgZm9yICdzYW1lLWxvd2VyJ1xuICAgICAgICBwYWRkaW5nID0gW1swLCAwXSwgWzAsIDBdLCBbMCwgMF0sIFswLCAwXV07XG4gICAgICAgIGNvbnN0IG91dHB1dFNpemVzID0gWzAsIDBdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI7ICsraSkge1xuICAgICAgICAgIG91dHB1dFNpemVzW2ldID0gTWF0aC5jZWlsKGlucHV0LnNoYXBlWzEgKyBpXSAvIHRoaXMuc3RyaWRlc19baV0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRvdGFsUGFkZGluZzogW251bWJlciwgbnVtYmVyXSA9IFswLCAwXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyOyArK2kpIHtcbiAgICAgICAgICB0b3RhbFBhZGRpbmdbaV0gPSB0aGlzLnN0cmlkZXNfW2ldICogKG91dHB1dFNpemVzW2ldIC0gMSkgK1xuICAgICAgICAgICAgICAoKHdpbmRvd0RpbWVuc2lvbnNbaV0gLSAxKSAqIHRoaXMuZGlsYXRpb25zX1tpXSArIDEpIC1cbiAgICAgICAgICAgICAgaW5wdXQuc2hhcGVbMSArIGldO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjsgKytpKSB7XG4gICAgICAgICAgcGFkZGluZ1tpICsgMV1bMF0gPSB0b3RhbFBhZGRpbmdbaV0gLSBNYXRoLmZsb29yKHRvdGFsUGFkZGluZ1tpXSAvIDIpO1xuICAgICAgICAgIHBhZGRpbmdbaSArIDFdWzFdID0gTWF0aC5mbG9vcih0b3RhbFBhZGRpbmdbaV0gLyAyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBvdXRwdXQ7XG4gICAgaWYgKHBvb2xpbmdUeXBlID09PSAnbDInKSB7XG4gICAgICBpbnB1dCA9IHRmLnBvdyhpbnB1dCwgMik7XG4gICAgICBvdXRwdXQgPSB0Zi5zcXJ0KFxuICAgICAgICB0Zi5wb29sKGlucHV0LCB0aGlzLndpbmRvd0RpbWVuc2lvbnNfLCAnYXZnJywgcGFkZGluZywgdGhpcy5kaWxhdGlvbnNfLFxuICAgICAgICB0aGlzLnN0cmlkZXNfKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dCA9IHRmLnBvb2woXG4gICAgICAgIGlucHV0LCB0aGlzLndpbmRvd0RpbWVuc2lvbnNfLCBwb29saW5nVHlwZSwgcGFkZGluZywgdGhpcy5kaWxhdGlvbnNfLFxuICAgICAgICB0aGlzLnN0cmlkZXNfKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5sYXlvdXRfID09PSBNTElucHV0T3BlcmFuZExheW91dC5uY2h3KSB7XG4gICAgICAvLyBuaHdjIC0+IG5jaHdcbiAgICAgIG91dHB1dCA9IHRmLnRyYW5zcG9zZShvdXRwdXQsIFswLCAzLCAxLCAyXSk7XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cblxuICBhYnN0cmFjdCBnZXRQb29saW5nVHlwZSgpOiBQb29saW5nVHlwZTtcbn1cblxuZXhwb3J0IGNsYXNzIEF2ZXJhZ2VQb29sMmQgZXh0ZW5kcyBQb29sIHtcbiAgZ2V0UG9vbGluZ1R5cGUoKTogUG9vbGluZ1R5cGUge1xuICAgIHJldHVybiAnYXZnJztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWF4UG9vbDJkIGV4dGVuZHMgUG9vbCB7XG4gIGdldFBvb2xpbmdUeXBlKCk6IFBvb2xpbmdUeXBlIHtcbiAgICByZXR1cm4gJ21heCc7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEwyUG9vbDJkIGV4dGVuZHMgUG9vbCB7XG4gIGdldFBvb2xpbmdUeXBlKCk6IFBvb2xpbmdUeXBlIHtcbiAgICByZXR1cm4gJ2wyJztcbiAgfVxufSIsImltcG9ydCAqIGFzIHRmIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TUxSZWR1Y2VPcHRpb25zfSBmcm9tICcuLi9ncmFwaF9idWlsZGVyJztcbmltcG9ydCB7TUxPcGVyYW5kfSBmcm9tICcuLi9vcGVyYW5kJztcbmltcG9ydCB7U2luZ2xlT3V0cHV0T3BlcmF0aW9ufSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi4vdXRpbHMnO1xuXG5hYnN0cmFjdCBjbGFzcyBSZWR1Y2UgZXh0ZW5kcyBTaW5nbGVPdXRwdXRPcGVyYXRpb24ge1xuICBwcml2YXRlIGlucHV0XzogTUxPcGVyYW5kO1xuICBwcml2YXRlIGF4ZXNfPzogbnVtYmVyW107XG4gIHByaXZhdGUga2VlcERpbWVuc2lvbnNfPzogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihpbnB1dDogTUxPcGVyYW5kLCBvcHRpb25zOiBNTFJlZHVjZU9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKGlucHV0LmJ1aWxkZXIpO1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZChpbnB1dCk7XG4gICAgdGhpcy5pbnB1dF8gPSBpbnB1dDtcbiAgICBpZiAob3B0aW9ucy5heGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgICB1dGlscy5pc0ludGVnZXJBcnJheShvcHRpb25zLmF4ZXMpLCAnVGhlIGF4ZXMgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgICB0aGlzLmF4ZXNfID0gb3B0aW9ucy5heGVzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmF4ZXNfID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5rZWVwRGltZW5zaW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgICAgdXRpbHMuaXNCb29sZWFuKG9wdGlvbnMua2VlcERpbWVuc2lvbnMpLFxuICAgICAgICAgICdUaGUga2VlcERpbWVuc2lvbnMgcGFyYW1ldGVyIGlzIG5vdCBhIGJvb2xlYW4uJyk7XG4gICAgICB0aGlzLmtlZXBEaW1lbnNpb25zXyA9IG9wdGlvbnMua2VlcERpbWVuc2lvbnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMua2VlcERpbWVuc2lvbnNfID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgaW5wdXRzKCk6IE1MT3BlcmFuZFtdIHtcbiAgICByZXR1cm4gW3RoaXMuaW5wdXRfXTtcbiAgfVxuXG4gIHJ1bihpbnB1dFRlbnNvcnM6IE1hcDxNTE9wZXJhbmQsIHRmLlRlbnNvcj4pOiB0Zi5UZW5zb3Ige1xuICAgIGNvbnN0IGlucHV0OiB0Zi5UZW5zb3IgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuaW5wdXRfKTtcbiAgICAvLyBhY2NlcHRzIGF4aXMgcmFuZ2UgWy1yLCByKVxuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgdXRpbHMudmFsaWRhdGVBeGVzKHRoaXMuYXhlc18sIGlucHV0LnJhbmspLFxuICAgICAgICBgVGhlIGF4ZXMgbXVzdCBiZSBpbiByYW5nZSBbLSR7aW5wdXQucmFua30sICR7aW5wdXQucmFua30pYCk7XG4gICAgcmV0dXJuIHRoaXMucnVuT3AoaW5wdXQsIHRoaXMuYXhlc18sIHRoaXMua2VlcERpbWVuc2lvbnNfKTtcbiAgfVxuXG4gIGFic3RyYWN0IHJ1bk9wKGlucHV0OiB0Zi5UZW5zb3IsIGF4ZXM6IG51bWJlcltdLCBrZWVwRGltZW5zaW9uczogYm9vbGVhbik6XG4gICAgICB0Zi5UZW5zb3I7XG59XG5cbmV4cG9ydCBjbGFzcyBSZWR1Y2VMb2dTdW1FeHAgZXh0ZW5kcyBSZWR1Y2Uge1xuICBydW5PcChpbnB1dDogdGYuVGVuc29yLCBheGVzOiBudW1iZXJbXSwga2VlcERpbWVuc2lvbnM6IGJvb2xlYW4pOiB0Zi5UZW5zb3Ige1xuICAgIHJldHVybiB0Zi5sb2dTdW1FeHAoaW5wdXQsIGF4ZXMsIGtlZXBEaW1lbnNpb25zKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVkdWNlTWF4IGV4dGVuZHMgUmVkdWNlIHtcbiAgcnVuT3AoaW5wdXQ6IHRmLlRlbnNvciwgYXhlczogbnVtYmVyW10sIGtlZXBEaW1lbnNpb25zOiBib29sZWFuKTogdGYuVGVuc29yIHtcbiAgICByZXR1cm4gdGYubWF4KGlucHV0LCBheGVzLCBrZWVwRGltZW5zaW9ucyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlZHVjZU1lYW4gZXh0ZW5kcyBSZWR1Y2Uge1xuICBydW5PcChpbnB1dDogdGYuVGVuc29yLCBheGVzOiBudW1iZXJbXSwga2VlcERpbWVuc2lvbnM6IGJvb2xlYW4pOiB0Zi5UZW5zb3Ige1xuICAgIHJldHVybiB0Zi5tZWFuKGlucHV0LCBheGVzLCBrZWVwRGltZW5zaW9ucyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlZHVjZU1pbiBleHRlbmRzIFJlZHVjZSB7XG4gIHJ1bk9wKGlucHV0OiB0Zi5UZW5zb3IsIGF4ZXM6IG51bWJlcltdLCBrZWVwRGltZW5zaW9uczogYm9vbGVhbik6IHRmLlRlbnNvciB7XG4gICAgcmV0dXJuIHRmLm1pbihpbnB1dCwgYXhlcywga2VlcERpbWVuc2lvbnMpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWR1Y2VQcm9kdWN0IGV4dGVuZHMgUmVkdWNlIHtcbiAgcnVuT3AoaW5wdXQ6IHRmLlRlbnNvciwgYXhlczogbnVtYmVyW10sIGtlZXBEaW1lbnNpb25zOiBib29sZWFuKTogdGYuVGVuc29yIHtcbiAgICByZXR1cm4gdGYucHJvZChpbnB1dCwgYXhlcywga2VlcERpbWVuc2lvbnMpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWR1Y2VTdW0gZXh0ZW5kcyBSZWR1Y2Uge1xuICBydW5PcChpbnB1dDogdGYuVGVuc29yLCBheGVzOiBudW1iZXJbXSwga2VlcERpbWVuc2lvbnM6IGJvb2xlYW4pOiB0Zi5UZW5zb3Ige1xuICAgIHJldHVybiB0Zi5zdW0oaW5wdXQsIGF4ZXMsIGtlZXBEaW1lbnNpb25zKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVkdWNlTDEgZXh0ZW5kcyBSZWR1Y2Uge1xuICBydW5PcChpbnB1dDogdGYuVGVuc29yLCBheGVzOiBudW1iZXJbXSwga2VlcERpbWVuc2lvbnM6IGJvb2xlYW4pOiB0Zi5UZW5zb3Ige1xuICAgIHJldHVybiB0Zi5zdW0odGYuYWJzKGlucHV0KSwgYXhlcywga2VlcERpbWVuc2lvbnMpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWR1Y2VMMiBleHRlbmRzIFJlZHVjZSB7XG4gIHJ1bk9wKGlucHV0OiB0Zi5UZW5zb3IsIGF4ZXM6IG51bWJlcltdLCBrZWVwRGltZW5zaW9uczogYm9vbGVhbik6IHRmLlRlbnNvciB7XG4gICAgcmV0dXJuIHRmLnNxcnQodGYuc3VtKHRmLnBvdyhpbnB1dCwgMiksIGF4ZXMsIGtlZXBEaW1lbnNpb25zKSk7XG4gIH1cbn0iLCJpbXBvcnQgKiBhcyB0ZiBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01MSW50ZXJwb2xhdGlvbk1vZGUsIE1MUmVzYW1wbGVPcHRpb25zfSBmcm9tICcuLi9ncmFwaF9idWlsZGVyJztcbmltcG9ydCB7TUxPcGVyYW5kfSBmcm9tICcuLi9vcGVyYW5kJztcbmltcG9ydCB7U2luZ2xlT3V0cHV0T3BlcmF0aW9ufSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgUmVzYW1wbGUgZXh0ZW5kcyBTaW5nbGVPdXRwdXRPcGVyYXRpb24ge1xuICBwcml2YXRlIGlucHV0XzogTUxPcGVyYW5kO1xuICBwcml2YXRlIG1vZGVfOiBNTEludGVycG9sYXRpb25Nb2RlID0gTUxJbnRlcnBvbGF0aW9uTW9kZVsnbmVhcmVzdC1uZWlnaGJvciddO1xuICBwcml2YXRlIHNjYWxlc186IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICBwcml2YXRlIHNpemVzXzogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG5cbiAgY29uc3RydWN0b3IoaW5wdXQ6IE1MT3BlcmFuZCwgb3B0aW9uczogTUxSZXNhbXBsZU9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKGlucHV0LmJ1aWxkZXIpO1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZChpbnB1dCk7XG4gICAgdGhpcy5pbnB1dF8gPSBpbnB1dDtcbiAgICBpZiAob3B0aW9ucy5zY2FsZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgYXJyYXkgPSBvcHRpb25zLnNjYWxlcztcbiAgICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgICBhcnJheSBpbnN0YW5jZW9mIEFycmF5ICYmIGFycmF5LmV2ZXJ5KHYgPT4gdHlwZW9mIHYgPT09ICdudW1iZXInKSAmJlxuICAgICAgICAgICAgICBhcnJheS5sZW5ndGggPT09IDQsXG4gICAgICAgICAgJ1RoZSBzY2FsZXMgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgICB0aGlzLnNjYWxlc18gPSBvcHRpb25zLnNjYWxlcztcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuc2l6ZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgIHV0aWxzLmlzSW50ZWdlckFycmF5KG9wdGlvbnMuc2l6ZXMpICYmIG9wdGlvbnMuc2l6ZXMubGVuZ3RoID09PSA0LFxuICAgICAgICAgICdUaGUgc2l6ZXMgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgICB0aGlzLnNpemVzXyA9IG9wdGlvbnMuc2l6ZXM7XG4gICAgICB0aGlzLnNjYWxlc18gPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgdGhpcy5zY2FsZXNfICE9PSB1bmRlZmluZWQgfHwgdGhpcy5zaXplc18gIT09IHVuZGVmaW5lZCxcbiAgICAgICAgJ1RoZSBzY2FsZXMgb3Igc2l6ZXMgcGFyYW1ldGVyIGlzIG5vdCBwcm92aWVkLicpO1xuICAgIGlmIChvcHRpb25zLm1vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgIG9wdGlvbnMubW9kZSBpbiBNTEludGVycG9sYXRpb25Nb2RlLFxuICAgICAgICAgICdUaGUgbW9kZSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICAgIHRoaXMubW9kZV8gPSBvcHRpb25zLm1vZGU7XG4gICAgfVxuICB9XG5cbiAgaW5wdXRzKCk6IE1MT3BlcmFuZFtdIHtcbiAgICByZXR1cm4gW3RoaXMuaW5wdXRfXTtcbiAgfVxuXG4gIHJ1bihpbnB1dFRlbnNvcnM6IE1hcDxNTE9wZXJhbmQsIHRmLlRlbnNvcj4pOiB0Zi5UZW5zb3Ige1xuICAgIGxldCBpbnB1dDogdGYuVGVuc29yNEQgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuaW5wdXRfKSBhcyB0Zi5UZW5zb3I0RDtcbiAgICB1dGlscy5hc3NlcnQoaW5wdXQucmFuayA9PT0gNCwgJ1RoZSBpbnB1dCB0ZW5zb3IgaXMgbm90IDQtRC4nKTtcbiAgICBjb25zdCBzaXplczogW251bWJlciwgbnVtYmVyXSA9IFswLCAwXTtcbiAgICBsZXQgdHJhbnNwb3NlZCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLnNpemVzXyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodGhpcy5zaXplc19bMF0gPT09IGlucHV0LnNoYXBlWzBdICYmXG4gICAgICAgICAgdGhpcy5zaXplc19bMV0gPT09IGlucHV0LnNoYXBlWzFdKSB7XG4gICAgICAgIHNpemVzWzBdID0gdGhpcy5zaXplc19bMl07XG4gICAgICAgIHNpemVzWzFdID0gdGhpcy5zaXplc19bM107XG4gICAgICAgIC8vIGFzc3VtZSBuY2h3IC0+IG5od2NcbiAgICAgICAgaW5wdXQgPSB0Zi50cmFuc3Bvc2UoaW5wdXQsIFswLCAyLCAzLCAxXSk7XG4gICAgICAgIHRyYW5zcG9zZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICB0aGlzLnNpemVzX1swXSA9PT0gaW5wdXQuc2hhcGVbMF0gJiZcbiAgICAgICAgICB0aGlzLnNpemVzX1szXSA9PT0gaW5wdXQuc2hhcGVbM10pIHtcbiAgICAgICAgLy8gYXNzdW1lIG5od2NcbiAgICAgICAgc2l6ZXNbMF0gPSB0aGlzLnNpemVzX1sxXTtcbiAgICAgICAgc2l6ZXNbMV0gPSB0aGlzLnNpemVzX1syXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICd0Zi5pbWFnZS5yZXNpemUgZG9lc25cXCd0IHN1cHBvcnQgdGhlIHNpemVzIHBhcmFtZXRlci4nKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuc2NhbGVzXyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodGhpcy5zY2FsZXNfWzBdID09PSAxLjAgJiYgdGhpcy5zY2FsZXNfWzFdID09PSAxLjApIHtcbiAgICAgICAgc2l6ZXNbMF0gPSBNYXRoLmZsb29yKGlucHV0LnNoYXBlWzJdICogdGhpcy5zY2FsZXNfWzJdKTtcbiAgICAgICAgc2l6ZXNbMV0gPSBNYXRoLmZsb29yKGlucHV0LnNoYXBlWzNdICogdGhpcy5zY2FsZXNfWzNdKTtcbiAgICAgICAgLy8gYXNzdW1lIG5jaHcgLT4gbmh3Y1xuICAgICAgICBpbnB1dCA9IHRmLnRyYW5zcG9zZShpbnB1dCwgWzAsIDIsIDMsIDFdKTtcbiAgICAgICAgdHJhbnNwb3NlZCA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc2NhbGVzX1swXSA9PT0gMS4wICYmIHRoaXMuc2NhbGVzX1szXSA9PT0gMS4wKSB7XG4gICAgICAgIC8vIGFzc3VtZSBuaHdjXG4gICAgICAgIHNpemVzWzBdID0gTWF0aC5mbG9vcihpbnB1dC5zaGFwZVsxXSAqIHRoaXMuc2NhbGVzX1sxXSk7XG4gICAgICAgIHNpemVzWzFdID0gTWF0aC5mbG9vcihpbnB1dC5zaGFwZVsyXSAqIHRoaXMuc2NhbGVzX1syXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAndGYuaW1hZ2UucmVzaXplIGRvZXNuXFwndCBzdXBwb3J0IHRoZSBzY2FsZXMgcGFyYW1ldGVyLicpO1xuICAgICAgfVxuICAgIH1cbiAgICBsZXQgb3V0cHV0OiB0Zi5UZW5zb3I7XG4gICAgaWYgKHRoaXMubW9kZV8gPT09IE1MSW50ZXJwb2xhdGlvbk1vZGVbJ25lYXJlc3QtbmVpZ2hib3InXSkge1xuICAgICAgb3V0cHV0ID0gdGYuaW1hZ2UucmVzaXplTmVhcmVzdE5laWdoYm9yKGlucHV0LCBzaXplcywgZmFsc2UsIHRydWUpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5tb2RlXyA9PT0gTUxJbnRlcnBvbGF0aW9uTW9kZS5saW5lYXIpIHtcbiAgICAgIG91dHB1dCA9IHRmLmltYWdlLnJlc2l6ZUJpbGluZWFyKGlucHV0LCBzaXplcywgZmFsc2UsIHRydWUpO1xuICAgIH1cbiAgICBpZiAodHJhbnNwb3NlZCkge1xuICAgICAgLy8gbmh3YyAtPiBuY2h3XG4gICAgICBvdXRwdXQgPSB0Zi50cmFuc3Bvc2Uob3V0cHV0LCBbMCwgMywgMSwgMl0pO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xuICB9XG59IiwiaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNTE9wZXJhbmR9IGZyb20gJy4uL29wZXJhbmQnO1xuaW1wb3J0IHtTaW5nbGVPdXRwdXRPcGVyYXRpb259IGZyb20gJy4uL29wZXJhdGlvbic7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuLi91dGlscyc7XG5cbmV4cG9ydCBjbGFzcyBSZXNoYXBlIGV4dGVuZHMgU2luZ2xlT3V0cHV0T3BlcmF0aW9uIHtcbiAgcHJpdmF0ZSBpbnB1dF86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSBuZXdTaGFwZV86IG51bWJlcltdO1xuXG4gIGNvbnN0cnVjdG9yKGlucHV0OiBNTE9wZXJhbmQsIG5ld1NoYXBlOiBudW1iZXJbXSkge1xuICAgIHN1cGVyKGlucHV0LmJ1aWxkZXIpO1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZChpbnB1dCk7XG4gICAgdGhpcy5pbnB1dF8gPSBpbnB1dDtcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIHV0aWxzLmlzSW50ZWdlckFycmF5KG5ld1NoYXBlKSAmJiBuZXdTaGFwZS5sZW5ndGggIT09IDAsXG4gICAgICAgICdUaGUgbmV3U2hhcGUgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5uZXdTaGFwZV8gPSBuZXdTaGFwZTtcbiAgfVxuXG4gIGlucHV0cygpOiBNTE9wZXJhbmRbXSB7XG4gICAgcmV0dXJuIFt0aGlzLmlucHV0X107XG4gIH1cblxuICBydW4oaW5wdXRUZW5zb3JzOiBNYXA8TUxPcGVyYW5kLCB0Zi5UZW5zb3I+KTogdGYuVGVuc29yIHtcbiAgICBjb25zdCBpbnB1dDogdGYuVGVuc29yID0gaW5wdXRUZW5zb3JzLmdldCh0aGlzLmlucHV0Xyk7XG4gICAgcmV0dXJuIHRmLnJlc2hhcGUoaW5wdXQsIHRoaXMubmV3U2hhcGVfKTtcbiAgfVxufSIsImltcG9ydCAqIGFzIHRmIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TUxPcGVyYW5kfSBmcm9tICcuLi9vcGVyYW5kJztcbmltcG9ydCB7U2luZ2xlT3V0cHV0T3BlcmF0aW9ufSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgU2xpY2UgZXh0ZW5kcyBTaW5nbGVPdXRwdXRPcGVyYXRpb24ge1xuICBwcml2YXRlIGlucHV0XzogTUxPcGVyYW5kO1xuICBwcml2YXRlIHN0YXJ0c186IG51bWJlcltdO1xuICBwcml2YXRlIHNpemVzXzogbnVtYmVyW107XG4gIHByaXZhdGUgYXhlc18/OiBudW1iZXJbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIGlucHV0OiBNTE9wZXJhbmQsIHN0YXJ0czogbnVtYmVyW10sIHNpemVzOiBudW1iZXJbXSwgYXhlcz86IG51bWJlcltdKSB7XG4gICAgc3VwZXIoaW5wdXQuYnVpbGRlcik7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKGlucHV0KTtcbiAgICB0aGlzLmlucHV0XyA9IGlucHV0O1xuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgdXRpbHMuaXNJbnRlZ2VyQXJyYXkoc3RhcnRzKSwgJ1RoZSBzdGFydHMgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5zdGFydHNfID0gc3RhcnRzO1xuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgdXRpbHMuaXNJbnRlZ2VyQXJyYXkoc2l6ZXMpICYmIHNpemVzLmV2ZXJ5KHYgPT4gdiA+IDAgfHwgdiA9PT0gLTEpLFxuICAgICAgICAnVGhlIHNpemVzIHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgIHRoaXMuc2l6ZXNfID0gc2l6ZXM7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICBzaXplcy5sZW5ndGggPT09IHNpemVzLmxlbmd0aCxcbiAgICAgICAgJ1RoZSBsZW5ndGggb2Ygc2l6ZXMgaXMgbm90IGVxdWFsIHRvIHRoZSBsZW5ndGggb2Ygc2l6ZXMuKSknKTtcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIGF4ZXMgPT09IHVuZGVmaW5lZCB8fCB1dGlscy5pc0ludGVnZXJBcnJheShheGVzKSxcbiAgICAgICAgJ1RoZSBheGVzIHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgIGlmIChheGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgICBzaXplcy5sZW5ndGggPT09IGF4ZXMubGVuZ3RoLCAnVGhlIGxlbmd0aCBvZiBheGVzIGlzIGludmFsaWQuKSknKTtcbiAgICB9XG4gICAgdGhpcy5heGVzXyA9IGF4ZXM7XG4gIH1cblxuICBpbnB1dHMoKTogTUxPcGVyYW5kW10ge1xuICAgIHJldHVybiBbdGhpcy5pbnB1dF9dO1xuICB9XG5cbiAgcnVuKGlucHV0VGVuc29yczogTWFwPE1MT3BlcmFuZCwgdGYuVGVuc29yPik6IHRmLlRlbnNvciB7XG4gICAgY29uc3QgaW5wdXQ6IHRmLlRlbnNvcjREID0gaW5wdXRUZW5zb3JzLmdldCh0aGlzLmlucHV0XykgYXMgdGYuVGVuc29yNEQ7XG4gICAgY29uc3QgcmFuayA9IGlucHV0LnNoYXBlLmxlbmd0aDtcbiAgICBpZiAodGhpcy5heGVzXyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBhc3N1bWUgYXhlcyBpcyBbMCwgMSwuLi5yLTFdIGlmIGl0IGlzIG5vdCBkZWZpbmVkLlxuICAgICAgdGhpcy5heGVzXyA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5rOyArK2kpIHtcbiAgICAgICAgdGhpcy5heGVzXy5wdXNoKGkpO1xuICAgICAgfVxuICAgIH1cbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIHRoaXMuYXhlc18uZXZlcnkoYXhpcyA9PiBheGlzIDwgcmFuayAmJiBheGlzID49IC1yYW5rKSxcbiAgICAgICAgJ1RoZSB2YWx1ZSBvZiBheGVzIGlzIGludmFsaWQuJyk7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICB0aGlzLnN0YXJ0c18ubGVuZ3RoID09PSB0aGlzLmF4ZXNfLmxlbmd0aCxcbiAgICAgICAgJ1RoZSBsZW5ndGggb2Ygc3RhcnRzIGlzIGludmFsaWQuJyk7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICB0aGlzLnNpemVzXy5sZW5ndGggPT09IHRoaXMuYXhlc18ubGVuZ3RoLFxuICAgICAgICAnVGhlIGxlbmd0aCBvZiBzaXplcyBpcyBpbnZhbGlkLicpO1xuXG4gICAgY29uc3QgYmVnaW46IG51bWJlcltdID0gbmV3IEFycmF5KHRoaXMuYXhlc18ubGVuZ3RoKS5maWxsKDApO1xuICAgIGNvbnN0IHNpemU6IG51bWJlcltdID0gbmV3IEFycmF5KHRoaXMuYXhlc18ubGVuZ3RoKS5maWxsKC0xKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYXhlc18ubGVuZ3RoOyArK2kpIHtcbiAgICAgIGxldCBheGlzID0gdGhpcy5heGVzX1tpXTtcbiAgICAgIGlmIChheGlzIDwgMCkge1xuICAgICAgICBheGlzID0gcmFuayArIGF4aXM7XG4gICAgICB9XG4gICAgICBiZWdpbltheGlzXSA9IHRoaXMuc3RhcnRzX1tpXTtcbiAgICAgIHNpemVbYXhpc10gPSB0aGlzLnNpemVzX1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIHRmLnNsaWNlKGlucHV0LCBiZWdpbiwgc2l6ZSk7XG4gIH1cbn0iLCJpbXBvcnQgKiBhcyB0ZiBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01MT3BlcmFuZH0gZnJvbSAnLi4vb3BlcmFuZCc7XG5pbXBvcnQge1NpbmdsZU91dHB1dE9wZXJhdGlvbn0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIFNvZnRtYXggZXh0ZW5kcyBTaW5nbGVPdXRwdXRPcGVyYXRpb24ge1xuICBwcml2YXRlIHhfOiBNTE9wZXJhbmQ7XG5cbiAgY29uc3RydWN0b3IoeDogTUxPcGVyYW5kKSB7XG4gICAgc3VwZXIoeC5idWlsZGVyKTtcbiAgICB1dGlscy52YWxpZGF0ZU9wZXJhbmQoeCk7XG4gICAgdGhpcy54XyA9IHg7XG4gIH1cblxuICBpbnB1dHMoKTogTUxPcGVyYW5kW10ge1xuICAgIHJldHVybiBbdGhpcy54X107XG4gIH1cblxuICBydW4oaW5wdXRUZW5zb3JzOiBNYXA8TUxPcGVyYW5kLCB0Zi5UZW5zb3I+KTogdGYuVGVuc29yIHtcbiAgICBjb25zdCB4OiB0Zi5UZW5zb3IgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMueF8pO1xuICAgIGlmICh4LnJhbmsgIT09IDIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHJhbmsgb2YgeCBwYXJhbWV0ZXIgc2hvdWxkIGJlIDIuJyk7XG4gICAgfVxuICAgIHJldHVybiB0Zi5zb2Z0bWF4KHgpO1xuICB9XG59IiwiaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNTFNwbGl0T3B0aW9uc30gZnJvbSAnLi4vZ3JhcGhfYnVpbGRlcic7XG5pbXBvcnQge01MT3BlcmFuZCwgT3V0cHV0T3BlcmFuZH0gZnJvbSAnLi4vb3BlcmFuZCc7XG5pbXBvcnQge09wZXJhdGlvbn0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIFNwbGl0IGV4dGVuZHMgT3BlcmF0aW9uIHtcbiAgcHJpdmF0ZSBpbnB1dF86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSBzcGxpdHNfOiBudW1iZXJ8bnVtYmVyW107XG4gIHByaXZhdGUgYXhpc18/OiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBpbnB1dDogTUxPcGVyYW5kLCBzcGxpdHM6IG51bWJlcnxudW1iZXJbXSwgb3B0aW9uczogTUxTcGxpdE9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKGlucHV0LmJ1aWxkZXIpO1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZChpbnB1dCk7XG4gICAgdGhpcy5pbnB1dF8gPSBpbnB1dDtcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIHV0aWxzLmlzSW50ZWdlcihzcGxpdHMpIHx8IHV0aWxzLmlzSW50ZWdlckFycmF5KHNwbGl0cyBhcyBudW1iZXJbXSksXG4gICAgICAgICdUaGUgc3BsaXRzIHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgIHRoaXMuc3BsaXRzXyA9IHNwbGl0cztcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIG9wdGlvbnMuYXhpcyA9PT0gdW5kZWZpbmVkIHx8IHV0aWxzLmlzSW50ZWdlcihvcHRpb25zLmF4aXMpLFxuICAgICAgICAnVGhlIG9wdGlvbnMuYXhpcyBpcyBpbnZhbGlkLicpO1xuICAgIHRoaXMuYXhpc18gPSBvcHRpb25zLmF4aXM7XG5cbiAgICAvLyBQcmVwYXJlIG91dHB1dHMuXG4gICAgY29uc3QgbnVtT3V0cHV0cyA9XG4gICAgICAgIHV0aWxzLmlzSW50ZWdlcihzcGxpdHMpID8gc3BsaXRzIDogKHNwbGl0cyBhcyBudW1iZXJbXSkubGVuZ3RoO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtT3V0cHV0czsgKytpKSB7XG4gICAgICB0aGlzLm91dHB1dHMucHVzaChuZXcgT3V0cHV0T3BlcmFuZCh0aGlzKSk7XG4gICAgfVxuICB9XG5cbiAgaW5wdXRzKCk6IE1MT3BlcmFuZFtdIHtcbiAgICByZXR1cm4gW3RoaXMuaW5wdXRfXTtcbiAgfVxuXG4gIGNvbXB1dGVJbXBsKGlucHV0VGVuc29yczogTWFwPE1MT3BlcmFuZCwgdGYuVGVuc29yPik6IHRmLlRlbnNvcltdIHtcbiAgICBjb25zdCBpbnB1dDogdGYuVGVuc29yID0gaW5wdXRUZW5zb3JzLmdldCh0aGlzLmlucHV0Xyk7XG4gICAgcmV0dXJuIHRmLnNwbGl0KGlucHV0LCB0aGlzLnNwbGl0c18sIHRoaXMuYXhpc18pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyB0ZiBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01MT3BlcmFuZH0gZnJvbSAnLi4vb3BlcmFuZCc7XG5pbXBvcnQge1NpbmdsZU91dHB1dE9wZXJhdGlvbn0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIFNxdWVlemUgZXh0ZW5kcyBTaW5nbGVPdXRwdXRPcGVyYXRpb24ge1xuICBwcml2YXRlIGlucHV0XzogTUxPcGVyYW5kO1xuICBwcml2YXRlIGF4ZXNfPzogbnVtYmVyW107XG5cbiAgY29uc3RydWN0b3IoaW5wdXQ6IE1MT3BlcmFuZCwgYXhlcz86IG51bWJlcltdKSB7XG4gICAgc3VwZXIoaW5wdXQuYnVpbGRlcik7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKGlucHV0KTtcbiAgICB0aGlzLmlucHV0XyA9IGlucHV0O1xuICAgIGlmIChheGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgICB1dGlscy5pc0ludGVnZXJBcnJheShheGVzKSAmJiBheGVzLmxlbmd0aCAhPT0gMCxcbiAgICAgICAgICAnVGhlIGF4ZXMgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgfVxuICAgIHRoaXMuYXhlc18gPSBheGVzO1xuICB9XG5cbiAgaW5wdXRzKCk6IE1MT3BlcmFuZFtdIHtcbiAgICByZXR1cm4gW3RoaXMuaW5wdXRfXTtcbiAgfVxuXG4gIHJ1bihpbnB1dFRlbnNvcnM6IE1hcDxNTE9wZXJhbmQsIHRmLlRlbnNvcj4pOiB0Zi5UZW5zb3Ige1xuICAgIGNvbnN0IGlucHV0OiB0Zi5UZW5zb3IgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuaW5wdXRfKTtcbiAgICByZXR1cm4gdGYuc3F1ZWV6ZShpbnB1dCwgdGhpcy5heGVzXyk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIHRmIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TUxPcGVyYW5kfSBmcm9tICcuLi9vcGVyYW5kJztcbmltcG9ydCB7U2luZ2xlT3V0cHV0T3BlcmF0aW9ufSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNwb3NlIGV4dGVuZHMgU2luZ2xlT3V0cHV0T3BlcmF0aW9uIHtcbiAgcHJpdmF0ZSBpbnB1dF86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSBwZXJtdXRhdGlvbl8/OiBudW1iZXJbXTtcblxuICBjb25zdHJ1Y3RvcihpbnB1dDogTUxPcGVyYW5kLCBwZXJtdXRhdGlvbj86IG51bWJlcltdKSB7XG4gICAgc3VwZXIoaW5wdXQuYnVpbGRlcik7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKGlucHV0KTtcbiAgICB0aGlzLmlucHV0XyA9IGlucHV0O1xuICAgIGlmIChwZXJtdXRhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgICAgdXRpbHMuaXNJbnRlZ2VyQXJyYXkocGVybXV0YXRpb24pICYmIHBlcm11dGF0aW9uLmxlbmd0aCAhPT0gMCxcbiAgICAgICAgICAnVGhlIHBlcm11dGF0aW9uIHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgIH1cbiAgICB0aGlzLnBlcm11dGF0aW9uXyA9IHBlcm11dGF0aW9uO1xuICB9XG5cbiAgaW5wdXRzKCk6IE1MT3BlcmFuZFtdIHtcbiAgICByZXR1cm4gW3RoaXMuaW5wdXRfXTtcbiAgfVxuXG4gIHJ1bihpbnB1dFRlbnNvcnM6IE1hcDxNTE9wZXJhbmQsIHRmLlRlbnNvcj4pOiB0Zi5UZW5zb3Ige1xuICAgIGNvbnN0IGlucHV0OiB0Zi5UZW5zb3IgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuaW5wdXRfKTtcbiAgICByZXR1cm4gdGYudHJhbnNwb3NlKGlucHV0LCB0aGlzLnBlcm11dGF0aW9uXyk7XG4gIH1cbn0iLCJpbXBvcnQgKiBhcyB0ZiBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01MT3BlcmFuZCwgT3V0cHV0T3BlcmFuZH0gZnJvbSAnLi4vb3BlcmFuZCc7XG5pbXBvcnQge01MT3BlcmF0b3IsIFNpbmdsZU91dHB1dE9wZXJhdGlvbn0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFVuYXJ5IGV4dGVuZHMgU2luZ2xlT3V0cHV0T3BlcmF0aW9uIHtcbiAgcHJvdGVjdGVkIHhfOiBNTE9wZXJhbmQ7XG5cbiAgY29uc3RydWN0b3IoeDogTUxPcGVyYW5kKSB7XG4gICAgaWYgKHggIT09IHVuZGVmaW5lZCkge1xuICAgICAgc3VwZXIoeC5idWlsZGVyKTtcbiAgICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZCh4KTtcbiAgICAgIHRoaXMueF8gPSB4O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdXBlcih1bmRlZmluZWQpO1xuICAgICAgdGhpcy54XyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBpbnB1dHMoKTogTUxPcGVyYW5kW10ge1xuICAgIHJldHVybiBbdGhpcy54X107XG4gIH1cblxuICBydW4oaW5wdXRUZW5zb3JzOiBNYXA8TUxPcGVyYW5kLCB0Zi5UZW5zb3I+KTogdGYuVGVuc29yIHtcbiAgICBjb25zdCB4OiB0Zi5UZW5zb3IgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMueF8pO1xuICAgIHJldHVybiB0aGlzLnJ1bk9wKHgpO1xuICB9XG5cbiAgYWJzdHJhY3QgcnVuT3AoeDogdGYuVGVuc29yKTogdGYuVGVuc29yO1xufVxuXG5leHBvcnQgY2xhc3MgRXhwIGV4dGVuZHMgVW5hcnkge1xuICBydW5PcCh4OiB0Zi5UZW5zb3IpOiB0Zi5UZW5zb3Ige1xuICAgIHJldHVybiB0Zi5leHAoeCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNxcnQgZXh0ZW5kcyBVbmFyeSB7XG4gIHJ1bk9wKHg6IHRmLlRlbnNvcik6IHRmLlRlbnNvciB7XG4gICAgcmV0dXJuIHRmLnNxcnQoeCk7XG4gIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFVuYXJ5TUxPcGVyYXRvciBleHRlbmRzIFVuYXJ5IGltcGxlbWVudHMgTUxPcGVyYXRvciB7XG4gIGFwcGx5KHg6IE1MT3BlcmFuZCk6IE91dHB1dE9wZXJhbmQge1xuICAgIHRoaXMuYnVpbGRlcl8gPSB4LmJ1aWxkZXI7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKHgpO1xuICAgIHRoaXMueF8gPSB4O1xuICAgIHRoaXMuY3JlYXRlT3V0cHV0KCk7XG4gICAgcmV0dXJuIHRoaXMub3V0cHV0O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTaWdtb2lkIGV4dGVuZHMgVW5hcnlNTE9wZXJhdG9yIHtcbiAgcnVuT3AoeDogdGYuVGVuc29yKTogdGYuVGVuc29yIHtcbiAgICByZXR1cm4gdGYuc2lnbW9pZCh4KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGFuaCBleHRlbmRzIFVuYXJ5TUxPcGVyYXRvciB7XG4gIHJ1bk9wKHg6IHRmLlRlbnNvcik6IHRmLlRlbnNvciB7XG4gICAgcmV0dXJuIHRmLnRhbmgoeCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlbHUgZXh0ZW5kcyBVbmFyeU1MT3BlcmF0b3Ige1xuICBydW5PcCh4OiB0Zi5UZW5zb3IpOiB0Zi5UZW5zb3Ige1xuICAgIHJldHVybiB0Zi5yZWx1KHgpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBIYXJkU3dpc2ggZXh0ZW5kcyBVbmFyeU1MT3BlcmF0b3Ige1xuICBydW5PcCh4OiB0Zi5UZW5zb3IpOiB0Zi5UZW5zb3Ige1xuICAgIHJldHVybiB0Zi5kaXYoXG4gICAgICB0Zi5tdWwoXG4gICAgICAgICAgeCxcbiAgICAgICAgICB0Zi5tYXhpbXVtKFxuICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICB0Zi5taW5pbXVtKFxuICAgICAgICAgICAgICAgICAgNixcbiAgICAgICAgICAgICAgICAgIHRmLmFkZCh4LCAzKSkpKSxcbiAgICAgIDYpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyB0ZiBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtFeHBsaWNpdFBhZGRpbmd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9jb252X3V0aWwnO1xuXG5pbXBvcnQge01MQXV0b1BhZCwgTUxCdWZmZXJWaWV3fSBmcm9tICcuL2dyYXBoX2J1aWxkZXInO1xuaW1wb3J0IHtNTE9wZXJhbmQsIE1MT3BlcmFuZERlc2NyaXB0b3IsIE1MT3BlcmFuZFR5cGV9IGZyb20gJy4vb3BlcmFuZCc7XG5pbXBvcnQge0FycmF5QnVmZmVyVmlldyBhcyBUeXBlZEFycmF5fSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydChleHByOiBib29sZWFuLCBtc2c6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoIWV4cHIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNCb29sZWFuKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSW50ZWdlcih2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSW50ZWdlckFycmF5KGFycmF5OiBudW1iZXJbXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gYXJyYXkgaW5zdGFuY2VvZiBBcnJheSAmJiBhcnJheS5ldmVyeSh2ID0+IGlzSW50ZWdlcih2KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1R5cGVkQXJyYXkoYXJyYXk6IE1MQnVmZmVyVmlld3xXZWJHTFRleHR1cmUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGFycmF5IGluc3RhbmNlb2YgRmxvYXQzMkFycmF5IHx8IGFycmF5IGluc3RhbmNlb2YgSW50MzJBcnJheSB8fFxuICAgICAgYXJyYXkgaW5zdGFuY2VvZiBVaW50MzJBcnJheSB8fCBhcnJheSBpbnN0YW5jZW9mIEludDE2QXJyYXkgfHxcbiAgICAgIGFycmF5IGluc3RhbmNlb2YgVWludDE2QXJyYXkgfHwgYXJyYXkgaW5zdGFuY2VvZiBJbnQ4QXJyYXkgfHxcbiAgICAgIGFycmF5IGluc3RhbmNlb2YgVWludDhBcnJheTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFR5cGVkQXJyYXkodHlwZTogTUxPcGVyYW5kVHlwZSk6IEZsb2F0MzJBcnJheUNvbnN0cnVjdG9yfFxuICAgIEludDMyQXJyYXlDb25zdHJ1Y3RvcnxVaW50MzJBcnJheUNvbnN0cnVjdG9yfFVpbnQxNkFycmF5Q29uc3RydWN0b3J8XG4gICAgSW50OEFycmF5Q29uc3RydWN0b3J8VWludDhBcnJheUNvbnN0cnVjdG9yIHtcbiAgaWYgKHR5cGUgPT09ICdmbG9hdDMyJykge1xuICAgIHJldHVybiBGbG9hdDMyQXJyYXk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2ludDMyJykge1xuICAgIHJldHVybiBJbnQzMkFycmF5O1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICd1aW50MzInKSB7XG4gICAgcmV0dXJuIFVpbnQzMkFycmF5O1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdmbG9hdDE2Jykge1xuICAgIHJldHVybiBVaW50MTZBcnJheTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnaW50OCcpIHtcbiAgICByZXR1cm4gSW50OEFycmF5O1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICd1aW50OCcpIHtcbiAgICByZXR1cm4gVWludDhBcnJheTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1R5cGUgaXMgbm90IHN1cHBvcnRlZC4nKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xvbmVUeXBlZEFycmF5KHZhbHVlOiBUeXBlZEFycmF5KTogVHlwZWRBcnJheSB7XG4gIGxldCBhcnJheTtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5KSB7XG4gICAgYXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KHZhbHVlLmxlbmd0aCk7XG4gIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnQzMkFycmF5KSB7XG4gICAgYXJyYXkgPSBuZXcgSW50MzJBcnJheSh2YWx1ZS5sZW5ndGgpO1xuICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgVWludDMyQXJyYXkpIHtcbiAgICBhcnJheSA9IG5ldyBVaW50MzJBcnJheSh2YWx1ZS5sZW5ndGgpO1xuICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgVWludDE2QXJyYXkpIHtcbiAgICBhcnJheSA9IG5ldyBVaW50MTZBcnJheSh2YWx1ZS5sZW5ndGgpO1xuICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgSW50OEFycmF5KSB7XG4gICAgYXJyYXkgPSBuZXcgSW50OEFycmF5KHZhbHVlLmxlbmd0aCk7XG4gIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheSh2YWx1ZS5sZW5ndGgpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignVHlwZSBpcyBub3Qgc3VwcG9ydGVkLicpO1xuICB9XG4gIGFycmF5LnNldCh2YWx1ZSk7XG4gIHJldHVybiBhcnJheTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERhdGFUeXBlKHR5cGU6IE1MT3BlcmFuZFR5cGUpOiB0Zi5EYXRhVHlwZSB7XG4gIGlmICh0eXBlID09PSAnZmxvYXQzMicpIHtcbiAgICByZXR1cm4gJ2Zsb2F0MzInO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdpbnQzMicpIHtcbiAgICByZXR1cm4gJ2ludDMyJztcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBvcGVyYW5kIHR5cGUgaXMgbm90IHN1cHBvcnRlZCBieSBURi5qcy4nKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlT3BlcmFuZERlc2NyaXB0b3JGcm9tVGVuc29yKHRlbnNvcjogdGYuVGVuc29yKTpcbiAgICBNTE9wZXJhbmREZXNjcmlwdG9yIHtcbiAgbGV0IHR5cGU6IE1MT3BlcmFuZFR5cGU7XG4gIGlmICh0ZW5zb3IuZHR5cGUgPT09ICdmbG9hdDMyJykge1xuICAgIHR5cGUgPSBNTE9wZXJhbmRUeXBlLmZsb2F0MzI7XG4gIH0gZWxzZSBpZiAodGVuc29yLmR0eXBlID09PSAnaW50MzInKSB7XG4gICAgdHlwZSA9IE1MT3BlcmFuZFR5cGUuaW50MzI7XG4gIH1cbiAgcmV0dXJuIHt0eXBlLCBkaW1lbnNpb25zOiB0ZW5zb3Iuc2hhcGV9IGFzIE1MT3BlcmFuZERlc2NyaXB0b3I7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZU9wZXJhbmREZXNjcmlwdG9yKGRlc2M6IE1MT3BlcmFuZERlc2NyaXB0b3IpOiB2b2lkIHtcbiAgYXNzZXJ0KGRlc2MudHlwZSBpbiBNTE9wZXJhbmRUeXBlLCAnVGhlIG9wZXJhbmQgdHlwZSBpcyBpbnZhbGlkLicpO1xuICBpZiAoZGVzYy5kaW1lbnNpb25zKSB7XG4gICAgYXNzZXJ0KGlzSW50ZWdlckFycmF5KGRlc2MuZGltZW5zaW9ucyksICdUaGUgZGltZW5zaW9ucyBpcyBpbnZhbGlkLicpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0R5YW5taWNTaGFwZShkaW1lbnNpb25zOiBudW1iZXJbXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gIWRpbWVuc2lvbnMuZXZlcnkoeCA9PiB4ID4gMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVR5cGVkQXJyYXkoXG4gICAgdmFsdWU6IFR5cGVkQXJyYXksIHR5cGU6IE1MT3BlcmFuZFR5cGUsIGRpbWVuc2lvbnM6IG51bWJlcltdKTogdm9pZCB7XG4gIGFzc2VydChpc1R5cGVkQXJyYXkodmFsdWUpLCAnVGhlIHZhbHVlIGlzIG5vdCBhIHR5cGVkIGFycmF5LicpO1xuICBhc3NlcnQodmFsdWUgaW5zdGFuY2VvZiBnZXRUeXBlZEFycmF5KHR5cGUpLCAnVGhlIHR5cGUgb2YgdmFsdWUgaXMgaW52YWxpZC4nKTtcbiAgYXNzZXJ0KFxuICAgICAgdmFsdWUubGVuZ3RoID09PSBzaXplRnJvbURpbWVuc2lvbnMoZGltZW5zaW9ucyksXG4gICAgICBgdGhlIHZhbHVlIGxlbmd0aCAke3ZhbHVlLmxlbmd0aH0gaXMgaW52YWxpZCwgc2l6ZSBvZiBgICtcbiAgICAgICAgICBgWyR7ZGltZW5zaW9uc31dICR7c2l6ZUZyb21EaW1lbnNpb25zKGRpbWVuc2lvbnMpfSBgICtcbiAgICAgICAgICAnaXMgZXhwZWN0ZWQuJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVZhbHVlVHlwZSh2YWx1ZTogbnVtYmVyLCB0eXBlOiBNTE9wZXJhbmRUeXBlKTogdm9pZCB7XG4gIGlmICh0eXBlID09PSBNTE9wZXJhbmRUeXBlLmludDMyKSB7XG4gICAgYXNzZXJ0KE51bWJlci5pc0ludGVnZXIodmFsdWUpLCAndGhlIHZhbHVlIGlzIG5vdCBhbiBpbnQzMi4nKTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNTE9wZXJhbmRUeXBlLnVpbnQzMikge1xuICAgIGFzc2VydChcbiAgICAgICAgTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkgJiYgdmFsdWUgPj0gMCwgJ3RoZSB2YWx1ZSBpcyBub3QgYW4gdWludDMyLicpO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1MT3BlcmFuZFR5cGUuaW50OCkge1xuICAgIGFzc2VydChcbiAgICAgICAgTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkgJiYgdmFsdWUgPj0gLTEyOCAmJiB2YWx1ZSA8PSAxMjcsXG4gICAgICAgICd0aGUgdmFsdWUgaXMgbm90IGFuIGludDguJyk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTUxPcGVyYW5kVHlwZS51aW50OCkge1xuICAgIGFzc2VydChcbiAgICAgICAgTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkgJiYgdmFsdWUgPj0gMCAmJiB2YWx1ZSA8PSAyNTUsXG4gICAgICAgICd0aGUgdmFsdWUgaXMgbm90IGFuIHVpbnQ4LicpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUZW5zb3IoXG4gICAgZGVzYzogTUxPcGVyYW5kRGVzY3JpcHRvcixcbiAgICB2YWx1ZTogTUxCdWZmZXJWaWV3fFdlYkdMVGV4dHVyZXxudW1iZXIpOiB0Zi5UZW5zb3Ige1xuICBjb25zdCBkdHlwZTogdGYuRGF0YVR5cGUgPSBnZXREYXRhVHlwZShkZXNjLnR5cGUpO1xuICBpZiAoZGVzYy5kaW1lbnNpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnQoXG4gICAgICAgIGlzVHlwZWRBcnJheSh2YWx1ZSBhcyBNTEJ1ZmZlclZpZXcgfCBXZWJHTFRleHR1cmUpLFxuICAgICAgICAnT25seSBBcnJheUJ1ZmZlclZpZXcgdmFsdWUgaXMgc3VwcG9ydGVkLicpO1xuICAgIGNvbnN0IGFycmF5ID0gdmFsdWUgYXMgVHlwZWRBcnJheTtcbiAgICB2YWxpZGF0ZVR5cGVkQXJyYXkoYXJyYXksIGRlc2MudHlwZSwgZGVzYy5kaW1lbnNpb25zKTtcbiAgICBjb25zdCBjbG9uZWRBcnJheSA9IGNsb25lVHlwZWRBcnJheShhcnJheSk7XG4gICAgcmV0dXJuIHRmLnRlbnNvcihjbG9uZWRBcnJheSwgZGVzYy5kaW1lbnNpb25zLCBkdHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHZhbGlkYXRlVmFsdWVUeXBlKHZhbHVlLCBkZXNjLnR5cGUpO1xuICAgICAgcmV0dXJuIHRmLnNjYWxhcih2YWx1ZSwgZHR5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWxpZGF0ZVR5cGVkQXJyYXkodmFsdWUgYXMgVHlwZWRBcnJheSwgZGVzYy50eXBlLCBkZXNjLmRpbWVuc2lvbnMpO1xuICAgICAgcmV0dXJuIHRmLnNjYWxhcigodmFsdWUgYXMgVHlwZWRBcnJheSlbMF0sIGR0eXBlKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNpemVGcm9tRGltZW5zaW9ucyhkaW06IG51bWJlcltdKTogbnVtYmVyIHtcbiAgaWYgKGRpbSA9PT0gdW5kZWZpbmVkIHx8IChpc0ludGVnZXJBcnJheShkaW0pICYmIGRpbS5sZW5ndGggPT09IDApKSB7XG4gICAgLy8gc2NhbGFyXG4gICAgcmV0dXJuIDE7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGRpbS5yZWR1Y2UoXG4gICAgICAgIChhY2N1bXVsYXRvciwgY3VycmVudFZhbHVlKSA9PlxuICAgICAgICAgICAgY3VycmVudFZhbHVlID4gMCA/IGFjY3VtdWxhdG9yICogY3VycmVudFZhbHVlIDogYWNjdW11bGF0b3IsXG4gICAgICAgIDEpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZU9wZXJhbmQoaW5wdXQ6IE1MT3BlcmFuZCwgbmFtZSA9ICcnKTogdm9pZCB7XG4gIGFzc2VydChcbiAgICAgIGlucHV0IGluc3RhbmNlb2YgTUxPcGVyYW5kLCBgVGhlIHBhcmFtZXRlciAke25hbWV9IGlzIG5vdCBhbiBvcGVyYW5kLmApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVPcHRpb25hbE9wZXJhbmQoaW5wdXQ6IE1MT3BlcmFuZCwgbmFtZSA9ICcnKTogdm9pZCB7XG4gIGFzc2VydChcbiAgICAgIGlucHV0ID09PSB1bmRlZmluZWQgfHwgaW5wdXQgaW5zdGFuY2VvZiBNTE9wZXJhbmQsXG4gICAgICBgVGhlIHBhcmFtZXRlciAke25hbWV9IGlzIG5vdCBhbiBvcHRpb25hbCBvcGVyYW5kLmApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVBeGVzKGF4ZXM6IG51bWJlcltdLCByYW5rOiBudW1iZXIpOiBib29sZWFuIHtcbiAgaWYgKHR5cGVvZiBheGVzICE9PSAndW5kZWZpbmVkJyAmJiBheGVzLmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF4ZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIGlmIChheGVzW2ldID49IHJhbmsgfHwgYXhlc1tpXSA8IC1yYW5rKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYWRkaW5ncyhcbiAgICBpbnB1dDogdGYuVGVuc29yNEQsIGZpbHRlcjogdGYuVGVuc29yNEQsXG4gICAgcGFkZGluZzogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgb3V0cHV0UGFkZGluZzogW251bWJlciwgbnVtYmVyXSwgZGlsYXRpb25zOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgIGF1dG9QYWQ6IE1MQXV0b1BhZCk6ICd2YWxpZCd8J3NhbWUnfEV4cGxpY2l0UGFkZGluZyB7XG4gIC8vIFdlYk5OIHBhZGRpbmc6XG4gIC8vICAgW2JlZ2lubmluZ19oZWlnaHQsIGVuZGluZ19oZWlnaHQsIGJlZ2lubmluZ193aWR0aCwgZW5kaW5nX3dpZHRoXVxuICAvLyB0Zi5jb252MmQgTkhXQyBzaG91bGQgYmUgaW4gdGhlIGZvbGxvd2luZyBmb3JtOlxuICAvLyAgIFtbMCwgMF0sIFtwYWRfdG9wLHBhZF9ib3R0b21dLCBbcGFkX2xlZnQsIHBhZF9yaWdodF0sIFswLCAwXV1cbiAgbGV0IHJlc3VsdFBhZGRpbmc6ICd2YWxpZCd8J3NhbWUnfEV4cGxpY2l0UGFkZGluZztcbiAgaWYgKGF1dG9QYWQgPT09IE1MQXV0b1BhZC5leHBsaWNpdCkge1xuICAgIGlmIChwYWRkaW5nLmV2ZXJ5KHYgPT4gdiA9PT0gMCkpIHtcbiAgICAgIHJlc3VsdFBhZGRpbmcgPSAndmFsaWQnO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRQYWRkaW5nID0gW1xuICAgICAgICBbMCwgMF0sIFtwYWRkaW5nWzBdLCBwYWRkaW5nWzFdXSwgW3BhZGRpbmdbMl0sIHBhZGRpbmdbM11dLCBbMCwgMF1cbiAgICAgIF0gYXMgRXhwbGljaXRQYWRkaW5nO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoYXV0b1BhZCA9PT0gTUxBdXRvUGFkWydzYW1lLXVwcGVyJ10pIHtcbiAgICAgIHJlc3VsdFBhZGRpbmcgPSAnc2FtZSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENhbGN1bGF0ZSB0aGUgZXhwbGljaXQgcGFkZGluZ3MgZm9yICdzYW1lLWxvd2VyJ1xuICAgICAgcmVzdWx0UGFkZGluZyA9IFtbMCwgMF0sIFswLCAwXSwgWzAsIDBdLCBbMCwgMF1dO1xuICAgICAgY29uc3Qgb3V0cHV0U2l6ZXMgPSBbMCwgMF07XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI7ICsraSkge1xuICAgICAgICBvdXRwdXRTaXplc1tpXSA9IE1hdGguY2VpbChpbnB1dC5zaGFwZVsxICsgaV0gLyBzdHJpZGVzW2ldKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRvdGFsUGFkZGluZzogW251bWJlciwgbnVtYmVyXSA9IFswLCAwXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjsgKytpKSB7XG4gICAgICAgIHRvdGFsUGFkZGluZ1tpXSA9IHN0cmlkZXNbaV0gKiAob3V0cHV0U2l6ZXNbaV0gLSAxKSArIG91dHB1dFBhZGRpbmdbaV0gK1xuICAgICAgICAgICAgKChmaWx0ZXIuc2hhcGVbaV0gLSAxKSAqIGRpbGF0aW9uc1tpXSArIDEpIC0gaW5wdXQuc2hhcGVbMSArIGldO1xuICAgICAgfVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyOyArK2kpIHtcbiAgICAgICAgcmVzdWx0UGFkZGluZ1tpICsgMV1bMF0gPVxuICAgICAgICAgICAgdG90YWxQYWRkaW5nW2ldIC0gTWF0aC5mbG9vcih0b3RhbFBhZGRpbmdbaV0gLyAyKTtcbiAgICAgICAgcmVzdWx0UGFkZGluZ1tpICsgMV1bMV0gPSBNYXRoLmZsb29yKHRvdGFsUGFkZGluZ1tpXSAvIDIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0UGFkZGluZztcbn0iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9hZGRuX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL2FkZG5fcGFja2VkX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL2FyZ21pbm1heF9ncHUudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9hcmdtaW5tYXhfcGFja2VkX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL2F2Z19wb29sX2JhY2twcm9wX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL2JhY2tlbmRfd2ViZ2wudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9iYXNlLnRzIiwid2VicGFjazovLy8uLi9zcmMvYmF0Y2hub3JtX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL2JhdGNobm9ybV9wYWNrZWRfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvYmluYXJ5b3BfY29tcGxleF9ncHUudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9iaW5hcnlvcF9ncHUudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9iaW5hcnlvcF9wYWNrZWRfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvY2FudmFzX3V0aWwudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9jbGlwX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL2NsaXBfcGFja2VkX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL2NvbXBsZXhfYWJzX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL2NvbmNhdF9ncHUudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9jb25jYXRfcGFja2VkX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL2NvbnZfYmFja3Byb3BfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvY29udl9iYWNrcHJvcF9ncHVfZGVwdGh3aXNlLnRzIiwid2VicGFjazovLy8uLi9zcmMvY29udl9ncHUudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9jb252X2dwdV9kZXB0aHdpc2UudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9jb252X3BhY2tlZF9ncHVfZGVwdGh3aXNlLnRzIiwid2VicGFjazovLy8uLi9zcmMvY3JvcF9hbmRfcmVzaXplX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL2N1bXN1bV9ncHUudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9kZWNvZGVfbWF0cml4X2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL2RlY29kZV9tYXRyaXhfcGFja2VkX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL2RlcHRoX3RvX3NwYWNlX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL2RpYWdfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvZGlsYXRpb25fZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvZW5jb2RlX2Zsb2F0X2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL2VuY29kZV9mbG9hdF9wYWNrZWRfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvZW5jb2RlX21hdHJpeF9ncHUudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9lbmNvZGVfbWF0cml4X3BhY2tlZF9ncHUudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9mZnRfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvZmlsbF9ncHUudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9mbGFnc193ZWJnbC50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL2ZsaXBfbGVmdF9yaWdodF9ncHUudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9nYXRoZXJfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvZ2F0aGVyX25kX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL2dsc2xfdmVyc2lvbi50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL2dwZ3B1X2NvbnRleHQudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9ncGdwdV9tYXRoLnRzIiwid2VicGFjazovLy8uLi9zcmMvZ3BncHVfdXRpbC50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL2ltMmNvbF9wYWNrZWRfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxfdXRpbHMvYXJnX21pbl9tYXgudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxfdXRpbHMvaW50LnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscy50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbF91dGlscy9yZWR1Y2UudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxfdXRpbHMvcmVzaGFwZS50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbF91dGlscy9zaGFyZWQudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0Ficy50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvQWNvcy50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvQWNvc2gudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0FkZC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvQWRkTi50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvQWxsLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9BbnkudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0FyZ01heC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvQXJnTWluLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9Bc2luLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9Bc2luaC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvQXRhbi50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvQXRhbjIudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0F0YW5oLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9BdmdQb29sLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9BdmdQb29sM0QudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0F2Z1Bvb2wzREdyYWQudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0F2Z1Bvb2xHcmFkLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9CYXRjaE1hdE11bC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvQmF0Y2hNYXRNdWxfaW1wbC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvQmF0Y2hOb3JtLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9CYXRjaFRvU3BhY2VORC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvQmluY291bnQudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0Nhc3QudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0NlaWwudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0NsaXBCeVZhbHVlLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9Db21wbGV4LnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9Db21wbGV4QWJzLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9Db25jYXQudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0NvbmNhdF9pbXBsLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9Db252MkQudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0NvbnYyREJhY2twcm9wRmlsdGVyLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9Db252MkRCYWNrcHJvcElucHV0LnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9Db252MkRfaW1wbC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvQ29udjNELnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9Db252M0RCYWNrcHJvcEZpbHRlclYyLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9Db252M0RCYWNrcHJvcElucHV0VjIudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0Nvcy50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvQ29zaC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvQ3JvcEFuZFJlc2l6ZS50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvQ3Vtc3VtLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9EZW5zZUJpbmNvdW50LnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9EZXB0aFRvU3BhY2UudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0RlcHRod2lzZUNvbnYyZE5hdGl2ZS50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0RlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXQudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0RpYWcudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0RpbGF0aW9uMkQudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0VpbnN1bS50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvRWx1LnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9FbHVHcmFkLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9FcXVhbC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvRXJmLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9FeHAudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0V4cGFuZERpbXMudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0V4cG0xLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9GRlQudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0ZGVF9pbXBsLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9GaWxsLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9GbGlwTGVmdFJpZ2h0LnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9GbG9vci50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvRmxvb3JEaXYudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0Zyb21QaXhlbHMudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uLy4uL3NyYy9rZXJuZWxzL0Zyb21QaXhlbHNfdXRpbHMvZnJvbV9waXhlbHNfZ3B1LnRzIiwid2VicGFjazovLy8uLi8uLi8uLi9zcmMva2VybmVscy9Gcm9tUGl4ZWxzX3V0aWxzL2Zyb21fcGl4ZWxzX3BhY2tlZF9ncHUudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0Z1c2VkQ29udjJELnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9GdXNlZERlcHRod2lzZUNvbnYyRC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvR2F0aGVyTmQudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0dhdGhlclYyLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9HcmVhdGVyLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9HcmVhdGVyRXF1YWwudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0lGRlQudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0lkZW50aXR5LnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9JbWFnLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9Jc0Zpbml0ZS50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvSXNJbmYudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0lzTmFOLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9MUk4udHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0xSTkdyYWQudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0xlYWt5UmVsdS50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvTGVzcy50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvTGVzc0VxdWFsLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9MaW5TcGFjZS50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvTG9nLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9Mb2cxcC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvTG9naWNhbEFuZC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvTG9naWNhbE5vdC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvTG9naWNhbE9yLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9NYXgudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL01heFBvb2wudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL01heFBvb2wzRC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvTWF4UG9vbDNER3JhZC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvTWF4UG9vbEdyYWQudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL01heFBvb2xXaXRoQXJnbWF4LnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9NYXhQb29sV2l0aEFyZ21heF9pbXBsLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9NYXhfaW1wbC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvTWF4aW11bS50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvTWVhbi50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvTWVhbl9pbXBsLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9NaW4udHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL01pbmltdW0udHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL01pcnJvclBhZC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvTW9kLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9NdWx0aW5vbWlhbC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvTXVsdGlwbHkudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL05lZy50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvTm9uTWF4U3VwcHJlc3Npb25WMy50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvTm9uTWF4U3VwcHJlc3Npb25WNC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvTm9uTWF4U3VwcHJlc3Npb25WNS50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvTm90RXF1YWwudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL09uZUhvdC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvT25lc0xpa2UudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL1BhY2sudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL1BhZFYyLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9Qb3cudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL1ByZWx1LnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9Qcm9kLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9SYW5nZS50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvUmVhbC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvUmVhbERpdi50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvUmVjaXByb2NhbC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvUmVsdS50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvUmVsdTYudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL1Jlc2hhcGUudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL1Jlc2l6ZUJpbGluZWFyLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9SZXNpemVCaWxpbmVhckdyYWQudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL1Jlc2l6ZU5lYXJlc3ROZWlnaGJvci50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvUmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvUmV2ZXJzZS50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvUm90YXRlV2l0aE9mZnNldC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvUm91bmQudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL1JzcXJ0LnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9TY2F0dGVyTmQudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL1NlbGVjdC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvU2VsdS50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvU2lnbW9pZC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvU2lnbi50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvU2luLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9TaW5oLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9TbGljZS50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvU29mdG1heC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvU29mdHBsdXMudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL1NwYWNlVG9CYXRjaE5ELnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9TcGFyc2VGaWxsRW1wdHlSb3dzLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9TcGFyc2VSZXNoYXBlLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9TcGFyc2VTZWdtZW50TWVhbi50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvU3BhcnNlU2VnbWVudFN1bS50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvU3BhcnNlVG9EZW5zZS50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvU3BsaXRWLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9TcXJ0LnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9TcXVhcmUudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL1NxdWFyZWREaWZmZXJlbmNlLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9TdGVwLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9TdHJpZGVkU2xpY2UudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL1N0cmluZ05HcmFtcy50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvU3RyaW5nU3BsaXQudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL1N0cmluZ1RvSGFzaEJ1Y2tldEZhc3QudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL1N1Yi50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvU3VtLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9TdW1faW1wbC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvVGFuLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9UYW5oLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9UaWxlLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9Ub3BLLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9UcmFuc2Zvcm0udHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL1RyYW5zcG9zZS50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvVHJhbnNwb3NlX2ltcGwudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL1VuaXF1ZS50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvVW5wYWNrLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9VbnNvcnRlZFNlZ21lbnRTdW0udHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL1plcm9zTGlrZS50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvX0Z1c2VkTWF0TXVsLnRzIiwid2VicGFjazovLy8uLi9zcmMvbHJuX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL2xybl9ncmFkX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL2xybl9wYWNrZWRfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvbWF4X3Bvb2xfYmFja3Byb3BfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvbWVhbl9ncHUudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9taXJyb3JfcGFkX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL21pcnJvcl9wYWRfcGFja2VkX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL211bG1hdF9wYWNrZWRfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvbXVsdGlub21pYWxfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvb25laG90X2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL3BhY2tfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvcGFja2luZ191dGlsLnRzIiwid2VicGFjazovLy8uLi9zcmMvcGFkX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL3BhZF9wYWNrZWRfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvcG9vbF9ncHUudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9yZWR1Y2VfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvcmVnaXN0ZXJfYWxsX2tlcm5lbHMudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9yZXNoYXBlX3BhY2tlZF9ncHUudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9yZXNpemVfYmlsaW5lYXJfYmFja3Byb3BfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvcmVzaXplX2JpbGluZWFyX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL3Jlc2l6ZV9iaWxpbmVhcl9wYWNrZWRfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvcmVzaXplX25lYXJlc3RfbmVpZ2hib3JfYmFja3Byb3BfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvcmVzaXplX25lYXJlc3RfbmVpZ2hib3JfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvcmVzaXplX25lYXJlc3RfbmVpZ2hib3JfcGFja2VkX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL3JldmVyc2VfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvcmV2ZXJzZV9wYWNrZWRfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvcm90YXRlX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL3NjYXR0ZXJfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvc2VnbWVudF9ncHUudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9zZWxlY3RfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvc2hhZGVyX2NvbXBpbGVyLnRzIiwid2VicGFjazovLy8uLi9zcmMvc2hhZGVyX2NvbXBpbGVyX3V0aWwudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9zbGljZV9ncHUudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9zbGljZV9wYWNrZWRfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvc3RyaWRlZF9zbGljZV9ncHUudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy90ZXhfdXRpbC50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL3RleHR1cmVfbWFuYWdlci50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL3RpbGVfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvdG9wX2tfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvdHJhbnNmb3JtX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL3RyYW5zcG9zZV9ncHUudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy90cmFuc3Bvc2VfcGFja2VkX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL3VuYXJ5b3BfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvdW5hcnlvcF9wYWNrZWRfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvdW5wYWNrX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL3ZlcnNpb24udHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy93ZWJnbC50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL3dlYmdsX3V0aWwudHMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9iYWNrZW5kX2NwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2Jhc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9jcHVfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9BYnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0Fjb3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0Fjb3NoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9BZGQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0FkZE4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0FsbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvQW55LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9BcmdNYXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0FyZ01pbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvQXNpbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvQXNpbmguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0F0YW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0F0YW4yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9BdGFuaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvQXZnUG9vbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvQXZnUG9vbDNELmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9BdmdQb29sM0RHcmFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9BdmdQb29sR3JhZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvQmF0Y2hNYXRNdWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0JhdGNoTm9ybS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvQmF0Y2hUb1NwYWNlTkQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0JpbmNvdW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9CaW5jb3VudF9pbXBsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9DYXN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9DZWlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9DbGlwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Db21wbGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Db21wbGV4QWJzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Db25jYXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0NvbmNhdF9pbXBsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Db252MkQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0NvbnYyREJhY2twcm9wRmlsdGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Db252MkRCYWNrcHJvcElucHV0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Db252M0QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0NvbnYzREJhY2twcm9wRmlsdGVyVjIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0NvbnYzREJhY2twcm9wSW5wdXRWMi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvQ29zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Db3NoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Dcm9wQW5kUmVzaXplLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9DdW1zdW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0RlbnNlQmluY291bnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0RlcHRoVG9TcGFjZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRGVwdGh3aXNlQ29udjJkTmF0aXZlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9EZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRGlhZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRGlsYXRpb24yRC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRGlsYXRpb24yREJhY2twcm9wRmlsdGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9EaWxhdGlvbjJEQmFja3Byb3BJbnB1dC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRWluc3VtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9FbHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0VsdUdyYWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0VxdWFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9FcmYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0V4cC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRXhwYW5kRGltcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRXhwbTEuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0ZGVC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRmlsbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRmxpcExlZnRSaWdodC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRmxvb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0Zsb29yRGl2LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9GdXNlZENvbnYyRC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRnVzZWREZXB0aHdpc2VDb252MkQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0dhdGhlck5kLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9HYXRoZXJOZF9JbXBsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9HYXRoZXJWMi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvR2F0aGVyVjJfaW1wbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvR3JlYXRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvR3JlYXRlckVxdWFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9JRkZULmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9JZGVudGl0eS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvSW1hZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvSXNGaW5pdGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0lzSW5mLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Jc05hTi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvTFJOLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9MUk5HcmFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9MZWFreVJlbHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0xlc3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0xlc3NFcXVhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvTGluU3BhY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0xpblNwYWNlX2ltcGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0xvZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvTG9nMXAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0xvZ2ljYWxBbmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0xvZ2ljYWxOb3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0xvZ2ljYWxPci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvTWF4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9NYXhQb29sLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9NYXhQb29sM0QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL01heFBvb2wzREdyYWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL01heFBvb2xHcmFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9NYXhQb29sV2l0aEFyZ21heC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvTWF4UG9vbFdpdGhBcmdtYXhfaW1wbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvTWF4X2ltcGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL01heGltdW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL01lYW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL01pbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvTWluaW11bS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvTWlycm9yUGFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Nb2QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL011bHRpbm9taWFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9NdWx0aXBseS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvTmVnLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Ob25NYXhTdXBwcmVzc2lvblYzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Ob25NYXhTdXBwcmVzc2lvblY0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Ob25NYXhTdXBwcmVzc2lvblY1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Ob3RFcXVhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvT25lSG90LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9PbmVzTGlrZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvUGFjay5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvUGFkVjIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1Bvdy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvUHJlbHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1Byb2QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1JhbmdlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9SYW5nZV9pbXBsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9SZWFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9SZWFsRGl2LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9SZWNpcHJvY2FsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9SZWx1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9SZWx1Ni5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvUmVzaGFwZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvUmVzaXplQmlsaW5lYXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1Jlc2l6ZUJpbGluZWFyR3JhZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvUmVzaXplTmVhcmVzdE5laWdoYm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9SZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9SZXZlcnNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Sb3RhdGVXaXRoT2Zmc2V0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Sb3VuZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvUnNxcnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1NjYXR0ZXJOZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU2NhdHRlcl9pbXBsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9TZWxlY3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1NlbHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1NpZ21vaWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1NpZ24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1Npbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU2luaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU2xpY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1NvZnRtYXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1NvZnRwbHVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9TcGFjZVRvQmF0Y2hORC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU3BhcnNlRmlsbEVtcHR5Um93cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU3BhcnNlRmlsbEVtcHR5Um93c19pbXBsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9TcGFyc2VSZXNoYXBlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9TcGFyc2VSZXNoYXBlX2ltcGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1NwYXJzZVNlZ21lbnRNZWFuLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9TcGFyc2VTZWdtZW50UmVkdWN0aW9uX2ltcGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1NwYXJzZVNlZ21lbnRTdW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1NwYXJzZVRvRGVuc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1NwbGl0Vi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU3FydC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU3F1YXJlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9TcXVhcmVkRGlmZmVyZW5jZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU3RlcC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU3RyaWRlZFNsaWNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9TdHJpZGVkU2xpY2VfaW1wbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU3RyaW5nTkdyYW1zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9TdHJpbmdOR3JhbXNfaW1wbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU3RyaW5nU3BsaXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1N0cmluZ1NwbGl0X2ltcGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1N0cmluZ1RvSGFzaEJ1Y2tldEZhc3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1N0cmluZ1RvSGFzaEJ1Y2tldEZhc3RfaW1wbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU3ViLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9TdW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1Rhbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvVGFuaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvVGlsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvVGlsZV9pbXBsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Ub3BLLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Ub3BLX2ltcGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1RyYW5zZm9ybS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvVHJhbnNwb3NlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9UcmFuc3Bvc2VfaW1wbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvVW5pcXVlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9VbmlxdWVfaW1wbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvVW5wYWNrLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9VbnNvcnRlZFNlZ21lbnRTdW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1plcm9zTGlrZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvX0Z1c2VkTWF0TXVsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3QvcmVnaXN0ZXJfYWxsX2tlcm5lbHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9zaGFyZWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC91dGlscy9iaW5hcnlfaW1wbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L3V0aWxzL2JpbmFyeV91dGlscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L3V0aWxzL2ZmdF91dGlscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L3V0aWxzL2Z1c2VkX3V0aWxzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3QvdXRpbHMvcG9vbF91dGlscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L3V0aWxzL3VuYXJ5X2ltcGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC91dGlscy91bmFyeV91dGlscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L3V0aWxzL3plcm9zX2ltcGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC92ZXJzaW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2JhY2tlbmRfd2FzbS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9iYXNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2ZsYWdzX3dhc20uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVsX3V0aWxzL3NoYXJlZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0Ficy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0FkZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0FkZE4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9BbGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9BbnkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9BcmdNYXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9BdmdQb29sLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvQmF0Y2hNYXRNdWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9CYXRjaFRvU3BhY2VORC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0Nhc3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9DZWlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvQ2xpcEJ5VmFsdWUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9Db25jYXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9Db252MkQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9Db252MkRCYWNrcHJvcElucHV0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvQ29zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvQ29zaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0Nyb3BBbmRSZXNpemUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9DdW1zdW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9EZXB0aFRvU3BhY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9EZXB0aHdpc2VDb252MmROYXRpdmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9FcXVhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0V4cC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0V4cGFuZERpbXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9GaWxsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvRmxpcExlZnRSaWdodC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0Zsb29yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvRmxvb3JEaXYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9GdXNlZEJhdGNoTm9ybS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0Z1c2VkQ29udjJELmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvRnVzZWREZXB0aHdpc2VDb252MkQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9HYXRoZXJOZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0dhdGhlclYyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvR3JlYXRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0dyZWF0ZXJFcXVhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0lkZW50aXR5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvTGVha3lSZWx1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvTGVzcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0xlc3NFcXVhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0xvZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0xvZ2ljYWxBbmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9NYXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9NYXhQb29sLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvTWF4aW11bS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL01lYW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9NaW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9NaW5pbXVtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvTWlycm9yUGFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvTXVsdGlwbHkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9OZWcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9Ob25NYXhTdXBwcmVzc2lvblYzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvTm9uTWF4U3VwcHJlc3Npb25WNC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL05vbk1heFN1cHByZXNzaW9uVjUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9Ob25NYXhTdXBwcmVzc2lvbl91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvTm90RXF1YWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9PbmVIb3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9PbmVzTGlrZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1BhY2suanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9QYWRWMi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1Bvdy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1ByZWx1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvUHJvZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1JhbmdlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvUmVhbERpdi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1JlbHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9SZWx1Ni5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1Jlc2hhcGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9SZXNpemVCaWxpbmVhci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1JldmVyc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9Sb3RhdGVXaXRoT2Zmc2V0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvUm91bmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9Sc3FydC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1NjYXR0ZXJOZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1NlbGVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1NpZ21vaWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9TaW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9TbGljZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1NvZnRtYXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9TcGFjZVRvQmF0Y2hORC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1NwbGl0Vi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1NxcnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9TcXVhcmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9TcXVhcmVkRGlmZmVyZW5jZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1N0ZXAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9TdHJpZGVkU2xpY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9TdWIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9TdW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9UYW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9UYW5oLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvVGlsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1RvcEsuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9UcmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9UcmFuc3Bvc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9VbnBhY2suanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9aZXJvc0xpa2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9fRnVzZWRNYXRNdWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9iaW5hcnlfa2VybmVsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMva2VybmVsX3V0aWxzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvdHlwZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy91bmFyeV9rZXJuZWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3QvcmVnaXN0ZXJfYWxsX2tlcm5lbHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3QvdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vd2FzbS1vdXQvdGZqcy1iYWNrZW5kLXdhc20tdGhyZWFkZWQtc2ltZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vd2FzbS1vdXQvdGZqcy1iYWNrZW5kLXdhc20tdGhyZWFkZWQtc2ltZC53b3JrZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL3dhc20tb3V0L3RmanMtYmFja2VuZC13YXNtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9iYWNrZW5kcy9iYWNrZW5kLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9iYWNrZW5kcy9iYWNrZW5kX3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2JhY2tlbmRzL2NvbXBsZXhfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvYmFja2VuZHMvZWluc3VtX3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2JhY2tlbmRzL2tlcm5lbF9pbXBscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvYmFja2VuZHMvbm9uX21heF9zdXBwcmVzc2lvbl9pbXBsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9iYWNrZW5kcy9ub25fbWF4X3N1cHByZXNzaW9uX3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2JhY2tlbmRzL3doZXJlX2ltcGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2Jhc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2Jhc2Vfc2lkZV9lZmZlY3RzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9icm93c2VyX3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2RldmljZV91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9lbmdpbmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2Vudmlyb25tZW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9mbGFncy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvZ2xvYmFsX3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2dsb2JhbHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2dyYWRpZW50cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvaGFzaF91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvaW8vYnJvd3Nlcl9maWxlcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvaW8vaHR0cC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvaW8vaW5kZXhlZF9kYi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvaW8vaW8uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2lvL2lvX3V0aWxzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9pby9sb2NhbF9zdG9yYWdlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9pby9tb2RlbF9tYW5hZ2VtZW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9pby9wYXNzdGhyb3VnaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvaW8vcHJvZ3Jlc3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2lvL3JvdXRlcl9yZWdpc3RyeS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvaW8vdHlwZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2lvL3dlaWdodHNfbG9hZGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9rZXJuZWxfbmFtZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2tlcm5lbF9yZWdpc3RyeS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvbG9nLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9tYXRoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYWJzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYWNvcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2Fjb3NoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYWRkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYWRkX24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9hbGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9hbnkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9hcmdfbWF4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYXJnX21pbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2FycmF5X29wc191dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYXNpbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2FzaW5oLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYXRhbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2F0YW4yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYXRhbmguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9hdmdfcG9vbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2F2Z19wb29sXzNkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYXhpc191dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYmFzaWNfbHN0bV9jZWxsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYmF0Y2hfdG9fc3BhY2VfbmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9iYXRjaG5vcm0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9iYXRjaG5vcm0yZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2JhdGNobm9ybTNkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYmF0Y2hub3JtNGQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9iYXRjaG5vcm1fdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2JpbmNvdW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYm9vbGVhbl9tYXNrLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYnJvYWRjYXN0X3RvLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYnJvYWRjYXN0X3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9icm93c2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYnVmZmVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvY2FzdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2NlaWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9jbGlwX2J5X3ZhbHVlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvY2xvbmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9jb21wbGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvY29uY2F0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvY29uY2F0XzFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvY29uY2F0XzJkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvY29uY2F0XzNkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvY29uY2F0XzRkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvY29uY2F0X3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9jb25mdXNpb25fbWF0cml4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvY29udjFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvY29udjJkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvY29udjJkX2JhY2twcm9wX2ZpbHRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2NvbnYyZF9iYWNrcHJvcF9pbnB1dC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2NvbnYyZF90cmFuc3Bvc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9jb252M2QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9jb252M2RfYmFja3Byb3BfaW5wdXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9jb252M2RfdHJhbnNwb3NlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvY29udl91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvY29zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvY29zaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2N1bXN1bS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2RlbnNlX2JpbmNvdW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZGVwdGhfdG9fc3BhY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9kZXB0aHdpc2VfY29udjJkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZGVwdGh3aXNlX2NvbnYyZF9uYXRpdmVfYmFja3Byb3BfZmlsdGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZGVwdGh3aXNlX2NvbnYyZF9uYXRpdmVfYmFja3Byb3BfaW5wdXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9kaWFnLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZGlsYXRpb24yZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2Rpdi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2Rpdl9ub19uYW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9kb3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9kcm9wb3V0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZHJvcG91dF91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZWluc3VtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZWx1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZXF1YWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9lcmYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9lcmZfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2V4cC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2V4cGFuZF9kaW1zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZXhwbTEuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9leWUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9maWxsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZmxvb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9mbG9vckRpdi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2Z1c2VkL2NvbnYyZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2Z1c2VkL2RlcHRod2lzZV9jb252MmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9mdXNlZC9tYXRfbXVsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZnVzZWRfb3BzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZnVzZWRfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2dhdGhlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2dhdGhlcl9uZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2dhdGhlcl9uZF91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZ3JlYXRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2dyZWF0ZXJfZXF1YWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9pbWFnLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvaW1hZ2UvY3JvcF9hbmRfcmVzaXplLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvaW1hZ2UvZmxpcF9sZWZ0X3JpZ2h0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvaW1hZ2Uvbm9uX21heF9zdXBwcmVzc2lvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2ltYWdlL25vbl9tYXhfc3VwcHJlc3Npb25fYXN5bmMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9pbWFnZS9ub25fbWF4X3N1cHByZXNzaW9uX3BhZGRlZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2ltYWdlL25vbl9tYXhfc3VwcHJlc3Npb25fcGFkZGVkX2FzeW5jLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvaW1hZ2Uvbm9uX21heF9zdXBwcmVzc2lvbl93aXRoX3Njb3JlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvaW1hZ2Uvbm9uX21heF9zdXBwcmVzc2lvbl93aXRoX3Njb3JlX2FzeW5jLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvaW1hZ2UvcmVzaXplX2JpbGluZWFyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvaW1hZ2UvcmVzaXplX25lYXJlc3RfbmVpZ2hib3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9pbWFnZS9yb3RhdGVfd2l0aF9vZmZzZXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9pbWFnZS90aHJlc2hvbGQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9pbWFnZS90cmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9pbl90b3Bfay5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2lzX2Zpbml0ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2lzX2luZi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2lzX25hbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2xlYWt5X3JlbHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9sZXNzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbGVzc19lcXVhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2xpbmFsZy9iYW5kX3BhcnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9saW5hbGcvZ3JhbV9zY2htaWR0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbGluYWxnL3FyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbGluc3BhY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9sb2NhbF9yZXNwb25zZV9ub3JtYWxpemF0aW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbG9nLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbG9nMXAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9sb2dfc2lnbW9pZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2xvZ19zb2Z0bWF4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbG9nX3N1bV9leHAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9sb2dpY2FsX2FuZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2xvZ2ljYWxfbm90LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbG9naWNhbF9vci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2xvZ2ljYWxfeG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbG9zc19vcHNfdXRpbHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9sb3NzZXMvYWJzb2x1dGVfZGlmZmVyZW5jZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2xvc3Nlcy9jb21wdXRlX3dlaWdodGVkX2xvc3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9sb3NzZXMvY29zaW5lX2Rpc3RhbmNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbG9zc2VzL2hpbmdlX2xvc3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9sb3NzZXMvaHViZXJfbG9zcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2xvc3Nlcy9sb2dfbG9zcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2xvc3Nlcy9tZWFuX3NxdWFyZWRfZXJyb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9sb3NzZXMvc2lnbW9pZF9jcm9zc19lbnRyb3B5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbG9zc2VzL3NvZnRtYXhfY3Jvc3NfZW50cm9weS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL21hdF9tdWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9tYXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9tYXhfcG9vbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL21heF9wb29sXzNkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbWF4X3Bvb2xfd2l0aF9hcmdtYXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9tYXhpbXVtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbWVhbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL21lc2hncmlkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbWluLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbWluaW11bS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL21pcnJvcl9wYWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9tb2QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9tb21lbnRzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbW92aW5nX2F2ZXJhZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9tdWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9tdWx0aV9ybm5fY2VsbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL211bHRpbm9taWFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbmVnLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbm9ubWF4X3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9ub3JtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbm90X2VxdWFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvb25lX2hvdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL29uZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9vbmVzX2xpa2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9vcGVyYXRpb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9vcHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9vdXRlcl9wcm9kdWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcGFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcGFkMWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9wYWQyZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3BhZDNkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcGFkNGQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9wb29sLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcG93LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcHJlbHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9wcmludC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3Byb2QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9yYW5kLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcmFuZF91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcmFuZG9tX2dhbW1hLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcmFuZG9tX25vcm1hbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3JhbmRvbV91bmlmb3JtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcmFuZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9yZWFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcmVjaXByb2NhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3JlZHVjZV91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcmVsdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3JlbHU2LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcmVzaGFwZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3JldmVyc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9yZXZlcnNlXzFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcmV2ZXJzZV8yZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3JldmVyc2VfM2QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9yZXZlcnNlXzRkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcm90YXRlX3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9yb3VuZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3JzcXJ0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc2NhbGFyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc2NhdHRlcl9uZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NjYXR0ZXJfbmRfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NlZ21lbnRfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NlbHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zZWx1X3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zZXBhcmFibGVfY29udjJkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc2V0ZGlmZjFkX2FzeW5jLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc2lnbW9pZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NpZ24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zaWduYWwvZnJhbWUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zaWduYWwvaGFtbWluZ193aW5kb3cuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zaWduYWwvaGFubl93aW5kb3cuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zaWduYWwvc3RmdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NpZ25hbF9vcHNfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3Npbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NpbmguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zbGljZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NsaWNlMWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zbGljZTJkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc2xpY2UzZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NsaWNlNGQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zbGljZV91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc29mdG1heC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NvZnRwbHVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc3BhY2VfdG9fYmF0Y2hfbmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zcGFyc2Uvc3BhcnNlX2ZpbGxfZW1wdHlfcm93cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NwYXJzZS9zcGFyc2VfcmVzaGFwZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NwYXJzZS9zcGFyc2Vfc2VnbWVudF9tZWFuLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc3BhcnNlL3NwYXJzZV9zZWdtZW50X3N1bS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NwYXJzZV90b19kZW5zZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NwYXJzZV90b19kZW5zZV91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc3BlY3RyYWwvZmZ0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc3BlY3RyYWwvaWZmdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NwZWN0cmFsL2lyZmZ0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc3BlY3RyYWwvcmZmdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NwbGl0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc3BsaXRfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NxcnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zcXVhcmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zcXVhcmVkX2RpZmZlcmVuY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zcXVlZXplLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc3RhY2suanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zdGVwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc3RyaWRlZF9zbGljZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3N0cmluZy9zdHJpbmdfbl9ncmFtcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3N0cmluZy9zdHJpbmdfc3BsaXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zdHJpbmcvc3RyaW5nX3RvX2hhc2hfYnVja2V0X2Zhc3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zdWIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zdW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy90YW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy90YW5oLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvdGVuc29yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvdGVuc29yMWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy90ZW5zb3IyZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3RlbnNvcjNkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvdGVuc29yNGQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy90ZW5zb3I1ZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3RlbnNvcjZkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvdGVuc29yX29wc191dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvdGlsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3RvcGsuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy90cmFuc3Bvc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy90cnVuY2F0ZWRfbm9ybWFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvdW5pcXVlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvdW5zb3J0ZWRfc2VnbWVudF9zdW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy91bnN0YWNrLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvdmFyaWFibGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy93aGVyZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3doZXJlX2FzeW5jLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvemVyb3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy96ZXJvc19saWtlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHRpbWl6ZXJzL2FkYWRlbHRhX29wdGltaXplci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3B0aW1pemVycy9hZGFncmFkX29wdGltaXplci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3B0aW1pemVycy9hZGFtX29wdGltaXplci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3B0aW1pemVycy9hZGFtYXhfb3B0aW1pemVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHRpbWl6ZXJzL21vbWVudHVtX29wdGltaXplci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3B0aW1pemVycy9vcHRpbWl6ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wdGltaXplcnMvb3B0aW1pemVyX2NvbnN0cnVjdG9ycy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3B0aW1pemVycy9ybXNwcm9wX29wdGltaXplci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3B0aW1pemVycy9zZ2Rfb3B0aW1pemVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9wbGF0Zm9ybXMvcGxhdGZvcm1fYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvcGxhdGZvcm1zL3BsYXRmb3JtX25vZGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L3Byb2ZpbGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9zZXJpYWxpemF0aW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC90YXBlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC90ZW5zb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L3RlbnNvcl9mb3JtYXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L3RlbnNvcl91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC90ZW5zb3JfdXRpbF9lbnYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L3Rlc3RfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvdHJhaW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L3R5cGVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC91dGlsX2Jhc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L3ZlcnNpb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2Jhc2U2NC1qcy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYnVmZmVyL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9pZWVlNzU0L2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9pc2FycmF5L2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb25nL3NyYy9sb25nLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NlZWRyYW5kb20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NlZWRyYW5kb20vbGliL2FsZWEuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NlZWRyYW5kb20vbGliL3R5Y2hlaS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2VlZHJhbmRvbS9saWIveG9yMTI4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zZWVkcmFuZG9tL2xpYi94b3I0MDk2LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zZWVkcmFuZG9tL2xpYi94b3JzaGlmdDcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NlZWRyYW5kb20vbGliL3hvcndvdy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2VlZHJhbmRvbS9zZWVkcmFuZG9tLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zZXRpbW1lZGlhdGUvc2V0SW1tZWRpYXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90aW1lcnMtYnJvd3NlcmlmeS9tYWluLmpzIiwid2VicGFjazovLy8od2VicGFjaykvYnVpbGRpbi9hbWQtZGVmaW5lLmpzIiwid2VicGFjazovLy8od2VicGFjaykvYnVpbGRpbi9hbWQtb3B0aW9ucy5qcyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzIiwid2VicGFjazovLy8od2VicGFjaykvYnVpbGRpbi9tb2R1bGUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL21haW4uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL21sLnRzIiwid2VicGFjazovLy8uL3NyYy9ubi9jb250ZXh0LnRzIiwid2VicGFjazovLy8uL3NyYy9ubi9ncmFwaC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbm4vZ3JhcGhfYnVpbGRlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbm4vb3BlcmFuZC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbm4vb3BlcmF0aW9uLnRzIiwid2VicGFjazovLy8uL3NyYy9ubi9vcHMvYmF0Y2hfbm9ybS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbm4vb3BzL2JpbmFyeS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbm4vb3BzL2NsYW1wLnRzIiwid2VicGFjazovLy8uL3NyYy9ubi9vcHMvY29uY2F0LnRzIiwid2VicGFjazovLy8uL3NyYy9ubi9vcHMvY29udjJkLnRzIiwid2VicGFjazovLy8uL3NyYy9ubi9vcHMvZ2VtbS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbm4vb3BzL2dydS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbm4vb3BzL2luc3RhbmNlX25vcm0udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL25uL29wcy9sZWFreV9yZWx1LnRzIiwid2VicGFjazovLy8uL3NyYy9ubi9vcHMvcGFkLnRzIiwid2VicGFjazovLy8uL3NyYy9ubi9vcHMvcG9vbDJkLnRzIiwid2VicGFjazovLy8uL3NyYy9ubi9vcHMvcmVkdWNlLnRzIiwid2VicGFjazovLy8uL3NyYy9ubi9vcHMvcmVzYW1wbGUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL25uL29wcy9yZXNoYXBlLnRzIiwid2VicGFjazovLy8uL3NyYy9ubi9vcHMvc2xpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL25uL29wcy9zb2Z0bWF4LnRzIiwid2VicGFjazovLy8uL3NyYy9ubi9vcHMvc3BsaXQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL25uL29wcy9zcXVlZXplLnRzIiwid2VicGFjazovLy8uL3NyYy9ubi9vcHMvdHJhbnNwb3NlLnRzIiwid2VicGFjazovLy8uL3NyYy9ubi9vcHMvdW5hcnkudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL25uL3V0aWxzLnRzIl0sIm5hbWVzIjpbImluc3RhbGxlZE1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJleHBvcnRzIiwibW9kdWxlIiwiaSIsImwiLCJtb2R1bGVzIiwiY2FsbCIsIm0iLCJjIiwiZCIsIm5hbWUiLCJnZXR0ZXIiLCJvIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwiZ2V0IiwiciIsIlN5bWJvbCIsInRvU3RyaW5nVGFnIiwidmFsdWUiLCJ0IiwibW9kZSIsIl9fZXNNb2R1bGUiLCJucyIsImNyZWF0ZSIsImtleSIsImJpbmQiLCJuIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwiQWRkTlByb2dyYW0iLCJjb25zdHJ1Y3RvciIsIm91dHB1dFNoYXBlIiwic2hhcGVzIiwidGhpcyIsInZhcmlhYmxlTmFtZXMiLCJtYXAiLCJfIiwic25pcHBldHMiLCJmb3JFYWNoIiwidmFyaWFibGUiLCJwdXNoIiwib3BlcmF0aW9uIiwiam9pbiIsInVzZXJDb2RlIiwiQWRkTlBhY2tlZFByb2dyYW0iLCJwYWNrZWRJbnB1dHMiLCJwYWNrZWRPdXRwdXQiLCJBcmdNaW5NYXhQcm9ncmFtIiwicmVkdWNlSW5mbyIsIm9wIiwiZmlyc3RQYXNzIiwid2luZG93U2l6ZSIsImJhdGNoU2l6ZSIsIm91dFNpemUiLCJjb21wT3AiLCJpbmRleFNuaXBwZXQiLCJBcmdNaW5NYXhQYWNrZWRQcm9ncmFtIiwic2hhcGUiLCJhc3NlcnQiLCJsZW5ndGgiLCJjaGFyQXQiLCJ0b1VwcGVyQ2FzZSIsInNsaWNlIiwiaW5TaXplIiwiTWF0aCIsImNlaWwiLCJvdXRTaGFwZSIsInJhbmsiLCJkdHlwZSIsImNvb3JkcyIsInNvdXJjZUxvY1NldHVwIiwic291cmNlUmFuayIsInNvdXJjZUxvY0RUeXBlIiwiY2hhbm5lbHMiLCJpbkNoYW5uZWwiLCJpbnRDaGFubmVscyIsIngiLCJzcmNSQ29vcmRzIiwiY29uY2F0Iiwic3JjR0Nvb3JkcyIsInNyY0JDb29yZHMiLCJzcmNBQ29vcmRzIiwiZmV0Y2hDYW5kaWRhdGVJZHgiLCJmZXRjaFZhbHVlIiwiZ2V0QmVzdEluZGljZXNBQ2hhbm5lbFNuaXBwZXQiLCJBdmdQb29sMkRCYWNrcHJvcFByb2dyYW0iLCJjb252SW5mbyIsImluU2hhcGUiLCJmaWx0ZXJIZWlnaHQiLCJmaWx0ZXJXaWR0aCIsInN0cmlkZUhlaWdodCIsInN0cmlkZVdpZHRoIiwiZGlsYXRpb25IZWlnaHQiLCJkaWxhdGlvbldpZHRoIiwiZWZmZWN0aXZlRmlsdGVySGVpZ2h0IiwiZWZmZWN0aXZlRmlsdGVyV2lkdGgiLCJwYWRUb3AiLCJwYWRJbmZvIiwidG9wIiwicGFkTGVmdCIsImxlZnQiLCJhdmdNdWx0aXBsaWVyIiwib3V0SGVpZ2h0Iiwib3V0V2lkdGgiLCJBdmdQb29sM0RCYWNrcHJvcFByb2dyYW0iLCJmaWx0ZXJEZXB0aCIsInN0cmlkZURlcHRoIiwiZGlsYXRpb25EZXB0aCIsImVmZmVjdGl2ZUZpbHRlckRlcHRoIiwicGFkRnJvbnQiLCJmcm9udCIsIm91dERlcHRoIiwid2hlcmVJbXBsIiwiRVBTSUxPTl9GTE9BVDMyIiwiRVBTSUxPTl9GTE9BVDE2IiwiYmluYXJ5Q2FjaGVzIiwiZ2V0QmluYXJ5Q2FjaGUiLCJ3ZWJHTFZlcnNpb24iLCJDUFVfSEFORE9GRl9TSVpFX1RIUkVTSE9MRCIsImdldE51bWJlciIsIk1hdGhCYWNrZW5kV2ViR0wiLCJncGdwdSIsInN1cGVyIiwicGVuZGluZ1JlYWQiLCJXZWFrTWFwIiwicGVuZGluZ0Rpc3Bvc2FsIiwiV2Vha1NldCIsImRhdGFSZWZDb3VudCIsIm51bUJ5dGVzSW5HUFUiLCJ1cGxvYWRXYWl0TXMiLCJkb3dubG9hZFdhaXRNcyIsImxhc3RHbEZsdXNoVGltZSIsIndhcm5lZEFib3V0TWVtb3J5IiwicGVuZGluZ0RlbGV0ZXMiLCJkaXNwb3NlZCIsImdldEJvb2wiLCJFcnJvciIsImdsIiwiYmluYXJ5Q2FjaGUiLCJjYW52YXMiLCJncGdwdUNyZWF0ZWRMb2NhbGx5IiwidGV4dHVyZU1hbmFnZXIiLCJudW1NQkJlZm9yZVdhcm5pbmciLCJnbG9iYWwiLCJzY3JlZW4iLCJoZWlnaHQiLCJ3aWR0aCIsIndpbmRvdyIsImRldmljZVBpeGVsUmF0aW8iLCJ0ZXhEYXRhIiwibmV4dERhdGFJZCIsIm51bURhdGFJZHMiLCJ3cml0ZSIsInZhbHVlcyIsImNoZWNrTnVtZXJpY2FsUHJvYmxlbXMiLCJkYXRhSWQiLCJpZCIsInNldCIsInVzYWdlIiwiVVBMT0FEIiwicmVmQ291bnQiLCJoYXMiLCJpbmNSZWYiLCJkZWNSZWYiLCJtb3ZlIiwiZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8iLCJ0ZW5zb3JJbmZvIiwiZGlzcG9zZURhdGEiLCJyZWFkU3luYyIsImNvbXBsZXhUZW5zb3JJbmZvcyIsImlzUGFja2VkIiwicHJvZ3JhbSIsInJlcyIsInJ1bldlYkdMUHJvZ3JhbSIsImRhdGEiLCJjb252ZXJ0QW5kQ2FjaGVPbkNQVSIsInNob3VsZFRpbWVQcm9ncmFtIiwiYWN0aXZlVGltZXJzIiwic3RhcnQiLCJyZXN1bHQiLCJub3ciLCJyZWFsVmFsdWVzIiwicmVhbCIsImltYWdWYWx1ZXMiLCJpbWFnIiwibWVyZ2VSZWFsQW5kSW1hZ0FycmF5cyIsImdldFZhbHVlc0Zyb21UZXh0dXJlIiwic3Vic2NyaWJlcnMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlYWQiLCJ0bXBEb3dubG9hZFRhcmdldCIsInZhbHMiLCJidWZmZXIiLCJkZWNvZGUiLCJ0bXBEYXRhIiwiY3JlYXRlQnVmZmVyRnJvbVRleHR1cmUiLCJ0ZXh0dXJlIiwiY3JlYXRlQW5kV2FpdEZvckZlbmNlIiwicHMiLCJhbGwiLCJzaXplIiwic2l6ZUZyb21TaGFwZSIsImRvd25sb2FkRmxvYXQzMk1hdHJpeEZyb21CdWZmZXIiLCJkZWxldGVCdWZmZXIiLCJkVHlwZVZhbHMiLCJkZWxldGUiLCJyZW1vdmVEYXRhSWQiLCJidWZmZXJTeW5jIiwiZGVjb2RlZERhdGEiLCJkZWNvZGVTdHJpbmciLCJudW0iLCJ0bXBUYXJnZXQiLCJkb3dubG9hZE1hdHJpeEZyb21QYWNrZWRUZXh0dXJlIiwic3ViYXJyYXkiLCJzaG91bGRVc2VQYWNrZWRQcm9ncmFtIiwib3V0cHV0IiwiZG93bmxvYWRCeXRlRW5jb2RlZEZsb2F0TWF0cml4RnJvbU91dHB1dFRleHR1cmUiLCJ0ZXhTaGFwZSIsInRpbWVyQXZhaWxhYmxlIiwiZiIsIm9sZEFjdGl2ZVRpbWVycyIsIm5ld0FjdGl2ZVRpbWVycyIsIm91dGVyTW9zdFRpbWUiLCJwcm9ncmFtVGltZXJzU3RhY2siLCJmbGF0dGVuZWRBY3RpdmVUaW1lclF1ZXJpZXMiLCJmbGF0dGVuIiwicXVlcnkiLCJmaWx0ZXIiLCJmbGF0dGVuZWRBY3RpdmVUaW1lck5hbWVzIiwia2VybmVsTXMiLCJ3YWxsTXMiLCJzdW0iLCJtcyIsImVycm9yIiwibWVtb3J5IiwidW5yZWxpYWJsZSIsIm51bUJ5dGVzSW5HUFVBbGxvY2F0ZWQiLCJudW1CeXRlc0FsbG9jYXRlZCIsIm51bUJ5dGVzSW5HUFVGcmVlIiwibnVtQnl0ZXNGcmVlIiwic3RhcnRUaW1lciIsImJlZ2luUXVlcnkiLCJzdGFydE1zIiwiZW5kTXMiLCJlbmRUaW1lciIsImVuZFF1ZXJ5Iiwid2FpdEZvclF1ZXJ5QW5kR2V0VGltZSIsInRpbWVyUXVlcnkiLCJmb3JjZSIsImFkZCIsInJlbGVhc2VHUFVEYXRhIiwib3JpZ0RhdGFJZCIsImNvbXB1dGVCeXRlcyIsInJlbGVhc2VUZXh0dXJlIiwiZ2V0VGV4dHVyZSIsInVwbG9hZFRvR1BVIiwiZ2V0RGF0YUluZm8iLCJzaG91bGRFeGVjdXRlT25DUFUiLCJpbnB1dHMiLCJzaXplVGhyZXNob2xkIiwiZXZlcnkiLCJpbnB1dCIsImdldEdQR1BVQ29udGV4dCIsIndoZXJlIiwiY29uZGl0aW9uIiwid2FybiIsImNvbmRWYWxzIiwiZGF0YVN5bmMiLCJwYWNrZWRVbmFyeU9wIiwib3V0SW5mbyIsImNvbXBpbGVBbmRSdW4iLCJtYWtlVGVuc29yRnJvbURhdGFJZCIsImFicyIsIm91dFZhbHVlcyIsIm1ha2VPdXRwdXQiLCJtYWtlVGVuc29ySW5mbyIsImlzU3RyaW5nIiwiZW5jb2RlZFZhbHVlcyIsImVuY29kZVN0cmluZyIsInVucGFja1RlbnNvciIsInBhY2tUZW5zb3IiLCJwYWNrZWRSZXNoYXBlIiwiYWZ0ZXJTaGFwZSIsImlucHV0M0RTaGFwZSIsImlucHV0M0QiLCJhZnRlclNoYXBlQXMzRCIsImN1c3RvbVZhbHVlcyIsInNoYXBlQXMzRCIsImRlbnNlVGV4U2hhcGUiLCJvdXRwdXREdHlwZSIsImN1c3RvbVVuaWZvcm1WYWx1ZXMiLCJwcmV2ZW50RWFnZXJVbnBhY2tpbmdPZk91dHB1dCIsIm91dERhdGEiLCJvdXRQYWNraW5nU2NoZW1lIiwiREVOU0UiLCJ0ZXhlbFNoYXBlIiwib3V0VGV4VXNhZ2UiLCJnZXRUeXBlZEFycmF5RnJvbURUeXBlIiwiZGF0YVRvRGlzcG9zZSIsImlucHV0c0RhdGEiLCJpc1VuaWZvcm0iLCJ1bmlmb3JtVmFsdWVzIiwic2F2ZWRJbnB1dCIsInRhcmdldFNoYXBlIiwib3V0cHV0RGF0YSIsImJpbmFyeSIsImdldEFuZFNhdmVCaW5hcnkiLCJpbmZvIiwiZ2V0UXVlcnlUaW1lIiwiZ2xGbHVzaFRocmVzaG9sZCIsInRpbWUiLCJmbHVzaCIsInVucGFja2VkIiwiZ2V0QmluYXJ5IiwiZ2V0VGV4dHVyZU1hbmFnZXIiLCJkaXNwb3NlIiwia2V5cyIsImRlbGV0ZVByb2dyYW0iLCJ3ZWJHTFByb2dyYW0iLCJIVE1MQ2FudmFzRWxlbWVudCIsInJlbW92ZSIsImZsb2F0UHJlY2lzaW9uIiwiZmxvYXRQcmVjaXNpb25WYWx1ZSIsImRlYnVnRmxhZyIsInVuZGVyZmxvd0NoZWNrVmFsdWUiLCJlcHNpbG9uIiwiaXNCeXRlQXJyYXkiLCJVaW50OEFycmF5IiwidGVtcERlbnNlSW5wdXRIYW5kbGUiLCJQSVhFTFMiLCJ1cGxvYWREZW5zZU1hdHJpeFRvVGV4dHVyZSIsInByZXZlbnRFYWdlclVucGFja2luZyIsImVuY29kZWRPdXRwdXRUYXJnZXQiLCJvdXRwdXRUZXhEYXRhIiwibmV3VGV4dHVyZSIsImFjcXVpcmVUZXh0dXJlIiwiZmxvYXQzMlZhbHVlcyIsImEiLCJJbnQzMkFycmF5Iiwicm91bmQiLCJmbG9hdDMyVG9UeXBlZEFycmF5IiwidGV4VHlwZSIsIm1iIiwidG9GaXhlZCIsImNvbnNvbGUiLCJieXRlc1BlckVsZW1lbnQiLCJpc0Jyb3dzZXIiLCJ3ZWJnbCIsImZvcmNlSGFsZkZsb2F0IiwiQmF0Y2hOb3JtUHJvZ3JhbSIsInhTaGFwZSIsIm1lYW5TaGFwZSIsInZhcmlhbmNlU2hhcGUiLCJvZmZzZXRTaGFwZSIsInNjYWxlU2hhcGUiLCJ2YXJpYW5jZUVwc2lsb24iLCJhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSIsIm9mZnNldFNuaXBwZXQiLCJzY2FsZVNuaXBwZXQiLCJCYXRjaE5vcm1QYWNrZWRQcm9ncmFtIiwiQ09NUExFWF9NVUxUSVBMWSIsIlJFQUwiLCJJTUFHIiwiQmluYXJ5T3BDb21wbGV4UHJvZ3JhbSIsImFTaGFwZSIsImJTaGFwZSIsIkNIRUNLX05BTl9TTklQUEVUIiwiU1FVQVJFRF9ESUZGRVJFTkNFIiwiQmluYXJ5T3BQcm9ncmFtIiwiZW5hYmxlU2hhcGVVbmlmb3JtcyIsIkVMVV9ERVIiLCJOT1RfRVFVQUwiLCJCaW5hcnlPcFBhY2tlZFByb2dyYW0iLCJjaGVja091dE9mQm91bmRzIiwic3VwcG9ydHNCcm9hZGNhc3RpbmciLCJjaGVja091dE9mQm91bmRzU3RyaW5nIiwiY29udGV4dHMiLCJXRUJHTF9BVFRSSUJVVEVTIiwiYWxwaGEiLCJhbnRpYWxpYXMiLCJwcmVtdWx0aXBsaWVkQWxwaGEiLCJwcmVzZXJ2ZURyYXdpbmdCdWZmZXIiLCJkZXB0aCIsInN0ZW5jaWwiLCJmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0IiwiY2xlYXJXZWJHTENvbnRleHQiLCJzZXRXZWJHTENvbnRleHQiLCJnZXRXZWJHTENvbnRleHQiLCJuZXdDdHgiLCJPZmZzY3JlZW5DYW52YXMiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJjcmVhdGVDYW52YXMiLCJhZGRFdmVudExpc3RlbmVyIiwiZXYiLCJwcmV2ZW50RGVmYXVsdCIsImdldENvbnRleHQiLCJnZXRXZWJHTFJlbmRlcmluZ0NvbnRleHQiLCJsb2ciLCJpc0NvbnRleHRMb3N0IiwiZGlzYWJsZSIsIkRFUFRIX1RFU1QiLCJTVEVOQ0lMX1RFU1QiLCJCTEVORCIsIkRJVEhFUiIsIlBPTFlHT05fT0ZGU0VUX0ZJTEwiLCJTQU1QTEVfQ09WRVJBR0UiLCJlbmFibGUiLCJTQ0lTU09SX1RFU1QiLCJDVUxMX0ZBQ0UiLCJjdWxsRmFjZSIsIkJBQ0siLCJDbGlwUHJvZ3JhbSIsImN1c3RvbVVuaWZvcm1zIiwidHlwZSIsIkNsaXBQYWNrZWRQcm9ncmFtIiwiQ29tcGxleEFic1Byb2dyYW0iLCJDb25jYXRQcm9ncmFtIiwiY29tcHV0ZU91dFNoYXBlIiwib2Zmc2V0cyIsIkFycmF5Iiwic2hpZnQiLCJsYXN0SW5kZXgiLCJsYXN0U2hpZnQiLCJDb25jYXRQYWNrZWRQcm9ncmFtIiwiYXhpcyIsImNoYW5uZWwiLCJsYXN0Q2hhbm5lbHMiLCJhbGxDaGFubmVscyIsImdldFZhbHVlU25pcHBldCIsInNoaWZ0ZWRDaGFubmVscyIsImNoYW5uZWxJZHgiLCJpbmRleE9mIiwiaWR4IiwiQ29udjJERGVyRmlsdGVyUHJvZ3JhbSIsImZpbHRlclNoYXBlIiwiaXNDaGFubmVsc0xhc3QiLCJkYXRhRm9ybWF0IiwiaW5IZWlnaHQiLCJpbldpZHRoIiwiQ29udjJERGVySW5wdXRQcm9ncmFtIiwicm93RGltIiwiY29sRGltIiwiY2hhbm5lbERpbSIsIm91dENoYW5uZWxzIiwiQ29udjNERGVyRmlsdGVyUHJvZ3JhbSIsImluRGVwdGgiLCJDb252M0REZXJJbnB1dFByb2dyYW0iLCJEZXB0aHdpc2VDb252MkREZXJGaWx0ZXJQcm9ncmFtIiwiY2hhbm5lbE11bCIsImluQ2hhbm5lbHMiLCJEZXB0aHdpc2VDb252MkREZXJJbnB1dFByb2dyYW0iLCJDb252MkRQcm9ncmFtIiwiYWRkQmlhcyIsImFjdGl2YXRpb24iLCJoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzIiwiaGFzTGVha3lyZWx1QWxwaGEiLCJpbnB1dERlcHRoTmVhcmVzdFZlYzQiLCJmbG9vciIsImlucHV0RGVwdGhWZWM0UmVtYWluZGVyIiwiYWN0aXZhdGlvblNuaXBwZXQiLCJhcHBseUFjdGl2YXRpb25TbmlwcGV0IiwiYWRkQmlhc1NuaXBwZXQiLCJDb252M0RQcm9ncmFtIiwiRGVwdGh3aXNlQ29udjJEUHJvZ3JhbSIsImhhc1ByZWx1QWN0aXZhdGlvbiIsImhhc0xlYWt5UmVsdUFscGhhIiwiRGVwdGh3aXNlQ29udlBhY2tlZDJEUHJvZ3JhbSIsInRleGVsc0Fjcm9zcyIsIm1haW5Mb29wIiwidGV4ZWxDIiwiY29sSW5kZXgiLCJuZXh0VGV4ZWxPZmZzZXQiLCJuZWFyZXN0TGFyZ2VyRXZlbiIsIkNyb3BBbmRSZXNpemVQcm9ncmFtIiwiaW1hZ2VTaGFwZSIsImJveFNoYXBlIiwiY3JvcFNpemUiLCJtZXRob2QiLCJleHRyYXBvbGF0aW9uVmFsdWUiLCJiYXRjaCIsImltYWdlSGVpZ2h0IiwiaW1hZ2VXaWR0aCIsIm51bUJveGVzIiwiY3JvcEhlaWdodCIsImNyb3BXaWR0aCIsIm1ldGhvZElkIiwiaW5wdXRIZWlnaHRGbG9hdCIsImlucHV0V2lkdGhGbG9hdCIsImhlaWdodFJhdGlvIiwiaGVpZ2h0U2NhbGUiLCJpblkiLCJ3aWR0aFJhdGlvIiwid2lkdGhTY2FsZSIsImluWCIsIkN1bVN1bVByb2dyYW0iLCJleGNsdXNpdmUiLCJyZXZlcnNlIiwidmFsIiwiZ2V0Q29vcmRzIiwiaWR4U3RyaW5nIiwiZ2V0RmluYWxDb29yZCIsIkRlY29kZU1hdHJpeFByb2dyYW0iLCJnbHNsIiwiRGVjb2RlTWF0cml4UGFja2VkUHJvZ3JhbSIsIkRlcHRoVG9TcGFjZVByb2dyYW0iLCJibG9ja1NpemUiLCJnZXRIZWlnaHRDb29yZFN0cmluZyIsImdldFdpZHRoQ29vcmRTdHJpbmciLCJnZXREZXB0aENvb3JkU3RyaW5nIiwiZ2V0T3V0cHV0RGVwdGhTaXplIiwiZ2V0SW5wdXRTYW1wbGluZ1N0cmluZyIsIkRpYWdQcm9ncmFtIiwiRGlsYXRpb24yRFByb2dyYW0iLCJFbmNvZGVGbG9hdFByb2dyYW0iLCJET1dOTE9BRCIsIkVuY29kZUZsb2F0UGFja2VkUHJvZ3JhbSIsIkVuY29kZU1hdHJpeFByb2dyYW0iLCJpbnB1dElzVW5zaWduZWRCeXRlIiwidGV4dHVyZTJEIiwiRW5jb2RlTWF0cml4UGFja2VkUHJvZ3JhbSIsInJvdyIsImNvbCIsIkZGVFByb2dyYW0iLCJjb21wb25lbnQiLCJpbnB1dFNoYXBlIiwiaW52ZXJzZSIsImlubmVyRGltIiwiZXhwb25lbnRNdWx0aXBsaWVyU25pcHBldCIsIlBJIiwicmVzdWx0RGVub21pbmF0b3IiLCJvcFN0cmluZyIsIkZpbGxQcm9ncmFtIiwiRU5WIiwicmVnaXN0ZXJGbGFnIiwiaXNNb2JpbGUiLCJ0aHJlc2hvbGQiLCJGbGlwTGVmdFJpZ2h0UHJvZ3JhbSIsIkdhdGhlclByb2dyYW0iLCJzb3VyY2VDb29yZHMiLCJjdXJyZW50Q29vcmRzIiwiZ2V0U291cmNlQ29vcmRzIiwiR2F0aGVyTkRQcm9ncmFtIiwic2xpY2VEaW0iLCJzdHJpZGVzIiwic3RyaWRlc1R5cGUiLCJzdHJpZGVTdHJpbmciLCJnZXRHbHNsRGlmZmVyZW5jZXMiLCJ2ZXJzaW9uIiwiYXR0cmlidXRlIiwidmFyeWluZ1ZzIiwidmFyeWluZ0ZzIiwiZGVmaW5lT3V0cHV0IiwiZGVmaW5lU3BlY2lhbE5hTiIsImRlZmluZVNwZWNpYWxJbmYiLCJkZWZpbmVSb3VuZCIsIkdQR1BVQ29udGV4dCIsIm91dHB1dFRleHR1cmUiLCJ2ZXJ0ZXhBdHRyc0FyZUJvdW5kIiwiaXRlbXNUb1BvbGwiLCJnbFZlcnNpb24iLCJDT0xPUl9CVUZGRVJfRkxPQVQiLCJDT0xPUl9CVUZGRVJfSEFMRl9GTE9BVCIsIlRFWFRVUkVfRkxPQVQiLCJURVhUVVJFX0hBTEZfRkxPQVQiLCJ0ZXh0dXJlRmxvYXRFeHRlbnNpb24iLCJ0ZXh0dXJlSGFsZkZsb2F0RXh0ZW5zaW9uIiwiY29sb3JCdWZmZXJGbG9hdEV4dGVuc2lvbiIsImdldEV4dGVuc2lvbiIsImNvbG9yQnVmZmVySGFsZkZsb2F0RXh0ZW5zaW9uIiwidmVydGV4QnVmZmVyIiwiaW5kZXhCdWZmZXIiLCJmcmFtZWJ1ZmZlciIsInRleHR1cmVDb25maWciLCJmaW5pc2giLCJiaW5kRnJhbWVidWZmZXIiLCJGUkFNRUJVRkZFUiIsImRlbGV0ZUZyYW1lYnVmZmVyIiwiYmluZEJ1ZmZlciIsIkFSUkFZX0JVRkZFUiIsIkVMRU1FTlRfQVJSQVlfQlVGRkVSIiwiY3JlYXRlRmxvYXQzMk1hdHJpeFRleHR1cmUiLCJyb3dzIiwiY29sdW1ucyIsInRocm93SWZEaXNwb3NlZCIsImNyZWF0ZUZsb2F0MTZNYXRyaXhUZXh0dXJlIiwiY3JlYXRlVW5zaWduZWRCeXRlc01hdHJpeFRleHR1cmUiLCJ1cGxvYWRQaXhlbERhdGFUb1RleHR1cmUiLCJwaXhlbHMiLCJjcmVhdGVGbG9hdDE2UGFja2VkTWF0cml4VGV4dHVyZSIsImNyZWF0ZVBhY2tlZE1hdHJpeFRleHR1cmUiLCJkZWxldGVNYXRyaXhUZXh0dXJlIiwiZGVsZXRlVGV4dHVyZSIsImRvd25sb2FkTWF0cml4RHJpdmVyIiwiZG93bmxvYWRQYWNrZWRNYXRyaXhGcm9tQnVmZmVyIiwicGh5c2ljYWxSb3dzIiwicGh5c2ljYWxDb2xzIiwiYmluZFRleHR1cmVUb0ZyYW1lQnVmZmVyIiwidW5iaW5kVGV4dHVyZVRvRnJhbWVCdWZmZXIiLCJmZW5jZUNvbnRleHQiLCJjcmVhdGVGZW5jZSIsInBvbGxGZW5jZSIsImlzRmVuY2VQYXNzZWQiLCJnbDIiLCJzeW5jIiwiZmVuY2VTeW5jIiwiU1lOQ19HUFVfQ09NTUFORFNfQ09NUExFVEUiLCJzdGF0dXMiLCJjbGllbnRXYWl0U3luYyIsIkFMUkVBRFlfU0lHTkFMRUQiLCJDT05ESVRJT05fU0FUSVNGSUVEIiwiaXNRdWVyeUF2YWlsYWJsZSIsImNyZWF0ZVByb2dyYW0iLCJmcmFnbWVudFNoYWRlclNvdXJjZSIsImZyYWdtZW50U2hhZGVyIiwidmVydGV4U2hhZGVyIiwiYXR0YWNoU2hhZGVyIiwiZGVidWciLCJzZXRQcm9ncmFtIiwidXNlUHJvZ3JhbSIsImdldFVuaWZvcm1Mb2NhdGlvbiIsInVuaWZvcm1OYW1lIiwic2hvdWxkVGhyb3ciLCJnZXRBdHRyaWJ1dGVMb2NhdGlvbiIsImdldEF0dHJpYkxvY2F0aW9uIiwiZ2V0VW5pZm9ybUxvY2F0aW9uTm9UaHJvdyIsInNldElucHV0TWF0cml4VGV4dHVyZSIsImlucHV0TWF0cml4VGV4dHVyZSIsInVuaWZvcm1Mb2NhdGlvbiIsInRleHR1cmVVbml0IiwidGhyb3dJZk5vUHJvZ3JhbSIsInNldE91dHB1dE1hdHJpeFRleHR1cmUiLCJvdXRwdXRNYXRyaXhUZXh0dXJlIiwic2V0T3V0cHV0TWF0cml4VGV4dHVyZURyaXZlciIsInNldE91dHB1dFBhY2tlZE1hdHJpeFRleHR1cmUiLCJvdXRwdXRQYWNrZWRNYXRyaXhUZXh0dXJlIiwic2V0T3V0cHV0TWF0cml4V3JpdGVSZWdpb24iLCJzdGFydFJvdyIsIm51bVJvd3MiLCJzdGFydENvbHVtbiIsIm51bUNvbHVtbnMiLCJzZXRPdXRwdXRNYXRyaXhXcml0ZVJlZ2lvbkRyaXZlciIsInNldE91dHB1dFBhY2tlZE1hdHJpeFdyaXRlUmVnaW9uIiwiZGVidWdWYWxpZGF0ZSIsImV4ZWN1dGVQcm9ncmFtIiwiZHJhd0VsZW1lbnRzIiwiVFJJQU5HTEVTIiwiVU5TSUdORURfU0hPUlQiLCJibG9ja1VudGlsQWxsUHJvZ3JhbXNDb21wbGV0ZWQiLCJnZXRRdWVyeVRpbWVyRXh0ZW5zaW9uIiwiZGlzam9pbnRRdWVyeVRpbWVyRXh0ZW5zaW9uIiwiZ2V0UXVlcnlUaW1lckV4dGVuc2lvbldlYkdMMiIsImdldFF1ZXJ5VGltZXJFeHRlbnNpb25XZWJHTDEiLCJleHQiLCJjcmVhdGVRdWVyeSIsIlRJTUVfRUxBUFNFRF9FWFQiLCJjcmVhdGVRdWVyeUVYVCIsImJlZ2luUXVlcnlFWFQiLCJlbmRRdWVyeUVYVCIsInJlcGVhdGVkVHJ5IiwicXVlcnlUaW1lclZlcnNpb24iLCJnZXRRdWVyeVBhcmFtZXRlciIsIlFVRVJZX1JFU1VMVCIsImdldFF1ZXJ5T2JqZWN0RVhUIiwiUVVFUllfUkVTVUxUX0VYVCIsImF2YWlsYWJsZSIsIlFVRVJZX1JFU1VMVF9BVkFJTEFCTEUiLCJkaXNqb2ludCIsImdldFBhcmFtZXRlciIsIkdQVV9ESVNKT0lOVF9FWFQiLCJRVUVSWV9SRVNVTFRfQVZBSUxBQkxFX0VYVCIsImFkZEl0ZW1Ub1BvbGwiLCJwb2xsSXRlbXMiLCJpbmRleCIsImxpbmVhclNlYXJjaExhc3RUcnVlIiwiaXNEb25lRm4iLCJyZXNvbHZlRm4iLCJkb3dubG9hZEFuZERlY29kZSIsIm91dHB1dE1hdHJpeFRleHR1cmVNYXliZVBhY2tlZCIsInZpZXdwb3J0Iiwic2Npc3NvciIsInkiLCJhcnIiLCJjb21waWxlUHJvZ3JhbSIsImlucHV0SW5mb3MiLCJzaGFwZUluZm8iLCJsb2dpY2FsU2hhcGUiLCJmbGF0T2Zmc2V0IiwiaW5TaGFwZUluZm9zIiwib3V0U2hhcGVJbmZvIiwic291cmNlIiwiaW5mTG9jIiwibmFuTG9jIiwidW5pZm9ybUxvY2F0aW9ucyIsImluU2hhcGVzTG9jYXRpb25zIiwiaW5UZXhTaGFwZXNMb2NhdGlvbnMiLCJ2YXJOYW1lIiwib3V0U2hhcGVMb2NhdGlvbiIsIm91dFRleFNoYXBlTG9jYXRpb24iLCJvdXRTaGFwZVN0cmlkZXNMb2NhdGlvbiIsImN1c3RvbVVuaWZvcm1Mb2NhdGlvbnMiLCJ2YWxpZGF0ZUJpbmFyeUFuZFByb2dyYW0iLCJzaGFwZUluZm9zIiwic2hhcGVBIiwic2hhcGVCIiwiYXJyYXlzRXF1YWwiLCJ0ZXhTaGFwZUEiLCJ0ZXhTaGFwZUIiLCJydW5Qcm9ncmFtIiwib3V0VGV4Iiwib3V0VGV4U2hhcGUiLCJ1bmlmb3JtMWYiLCJJbmZpbml0eSIsIk5hTiIsInZhckxvYyIsInZhck9mZnNldExvYyIsInZhclNoYXBlTG9jIiwidmFyVGV4U2hhcGVMb2MiLCJ1bmlmb3JtU2hhcGUiLCJ1bmlmb3JtMWl2IiwidW5pZm9ybTJpdiIsInVuaWZvcm0zaXYiLCJ1bmlmb3JtNGl2IiwidW5pZm9ybTJpIiwiRmxvYXQzMkFycmF5IiwidW5pZm9ybTFmdiIsInVuaWZvcm0xaSIsIm91dFNoYXBlTG9jIiwiY29tcHV0ZVN0cmlkZXMiLCJjdXN0b21Mb2MiLCJjdXN0b21WYWx1ZSIsInVuaWZvcm0yZnYiLCJ1bmlmb3JtM2Z2IiwidW5pZm9ybTRmdiIsIm1ha2VTaGFkZXJLZXkiLCJrZXlJbnB1dHMiLCJoYXNPZmZzZXQiLCJ4VGV4U2hhcGUiLCJ1c2VTcXVlZXplU2hhcGUiLCJrZXB0RGltcyIsInJhbmsxIiwicmFuazIiLCJyYW5rMzQiLCJwYWNrZWRUZXhTaGFwZSIsInhSYW5rIiwiaXNMb2dpY2FsU2hhcFRleFNoYXBlRXF1YWwiLCJpc1NjYWxhciIsImJyb2FkY2FzdERpbXMiLCJnZXRCcm9hZGNhc3REaW1zIiwiaXNJbk91dFRleFNoYXBlRXF1YWwiLCJpc1RleFNoYXBlR3JlYXRlclRoYW5PbmUiLCJrZXlVc2VyQ29kZSIsInVzZVNoYXBlVW5pZm9ybXMiLCJjcmVhdGVWZXJ0ZXhTaGFkZXIiLCJ2ZXJ0ZXhTaGFkZXJTb3VyY2UiLCJjcmVhdGVWZXJ0ZXhCdWZmZXIiLCJ2ZXJ0ZXhBcnJheSIsImNyZWF0ZUluZGV4QnVmZmVyIiwidHJpYW5nbGVWZXJ0ZXhJbmRpY2VzIiwiVWludDE2QXJyYXkiLCJjcmVhdGVBbmRDb25maWd1cmVUZXh0dXJlIiwiaW50ZXJuYWxGb3JtYXQiLCJ0ZXh0dXJlRm9ybWF0IiwidGV4dHVyZVR5cGUiLCJ0ZXgyZCIsIlRFWFRVUkVfMkQiLCJiaW5kVGV4dHVyZSIsInRleFBhcmFtZXRlcmkiLCJURVhUVVJFX1dSQVBfUyIsIkNMQU1QX1RPX0VER0UiLCJURVhUVVJFX1dSQVBfVCIsIlRFWFRVUkVfTUlOX0ZJTFRFUiIsIk5FQVJFU1QiLCJURVhUVVJFX01BR19GSUxURVIiLCJ0ZXhJbWFnZTJEIiwiZ2V0SW50ZXJuYWxGb3JtYXRGb3JGbG9hdDMyTWF0cml4VGV4dHVyZSIsImludGVybmFsRm9ybWF0RmxvYXQiLCJ0ZXh0dXJlRm9ybWF0RmxvYXQiLCJGTE9BVCIsImdldEludGVybmFsRm9ybWF0Rm9yRmxvYXQxNk1hdHJpeFRleHR1cmUiLCJpbnRlcm5hbEZvcm1hdEhhbGZGbG9hdCIsInRleHR1cmVUeXBlSGFsZkZsb2F0IiwiZ2V0SW50ZXJuYWxGb3JtYXRGb3JVbnNpZ25lZEJ5dGVzTWF0cml4VGV4dHVyZSIsImRvd25sb2FkVGV4dHVyZUZvcm1hdCIsIlJHQkEiLCJVTlNJR05FRF9CWVRFIiwiZ2V0SW50ZXJuYWxGb3JtYXRGb3JQYWNrZWRNYXRyaXhUZXh0dXJlIiwiaW50ZXJuYWxGb3JtYXRQYWNrZWRGbG9hdCIsImdldEludGVybmFsRm9ybWF0Rm9yRmxvYXQxNlBhY2tlZE1hdHJpeFRleHR1cmUiLCJpbnRlcm5hbEZvcm1hdFBhY2tlZEhhbGZGbG9hdCIsImJpbmRWZXJ0ZXhQcm9ncmFtQXR0cmlidXRlU3RyZWFtcyIsImRhdGFGb3JVcGxvYWQiLCJ0ZXhlbERhdGFUeXBlIiwiY3JlYXRlQnVmZmVyRnJvbU91dHB1dFRleHR1cmUiLCJjcmVhdGVCdWZmZXIiLCJQSVhFTF9QQUNLX0JVRkZFUiIsImJ1ZmZlclNpemVCeXRlcyIsImJ5dGVzUGVyRmxvYXQiLCJidWZmZXJEYXRhIiwiU1RSRUFNX1JFQUQiLCJyZWFkUGl4ZWxzIiwiZG93bmxvYWRUYXJnZXQiLCJnZXRCdWZmZXJTdWJEYXRhIiwidyIsImgiLCJjb2xzIiwiZG93bmxvYWRNYXRyaXhGcm9tUGFja2VkT3V0cHV0VGV4dHVyZSIsInBhY2tlZFJHQkEiLCJJbTJDb2xQYWNrZWRQcm9ncmFtIiwiYm91bmRzQ2hlY2tpbmdTbmlwcGV0IiwidW5yb2xsZWQiLCJhcmdSZWR1Y2UiLCJiYWNrZW5kIiwicmVkdWNlVHlwZSIsImJlc3RJbmRpY2VzQSIsImNvbXB1dGVPcHRpbWFsV2luZG93U2l6ZSIsImFyZ1JlZHVjZVBhY2tlZCIsImFyZ01pbk1heFJlZHVjZSIsImF4ZXMiLCJhc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcyIsImludGVybWVkaWF0ZVRlbnNvckluZm9zIiwieHRleERhdGEiLCJ4VW5QYWNrZWQiLCJyZWR1Y2VTaGFwZSIsImNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMiLCJhMkQiLCJhdHRycyIsInJlZHVjZWQiLCJyZXNoYXBlZCIsImludCIsIkNIRUNLX05BTl9TTklQUEVUX1VOQVJZIiwiQ0hFQ0tfTkFOX1NOSVBQRVRfQklOQVJZIiwiQ0hFQ0tfTkFOX1NOSVBQRVRfQklOQVJZX1BBQ0tFRCIsInVuYXJ5S2VybmVsRnVuYyIsIm9wU25pcHBldCIsInBhY2tlZE9wU25pcHBldCIsImNwdUtlcm5lbEltcGwiLCJ3ZWJnbEJhY2tlbmQiLCIkZHR5cGUiLCJ4RGF0YSIsImJpbmFyeUtlcm5lbEZ1bmMiLCJzdXBwb3J0c0NvbXBsZXgiLCJiIiwiYURhdGEiLCJiRGF0YSIsImNvbXBsZXhQYXJ0cyIsImFQYXJ0IiwiYlBhcnQiLCJhSGFuZGxlIiwiYkhhbmRsZSIsImNvbXBsZXhPdXRwdXQiLCJhVmFscyIsImJWYWxzIiwiZGVjb2RlZEFWYWxzIiwiZnJvbVVpbnQ4VG9TdHJpbmdBcnJheSIsImRlY29kZWRCVmFscyIsIm91dCIsIm1hcEFjdGl2YXRpb25Ub1NoYWRlclByb2dyYW0iLCJwYWNrZWQiLCJyZWR1Y2UiLCJyZWR1Y3Rpb25UeXBlIiwicmVkdWN0aW9uU3RhZ2VzIiwic3RhZ2VzIiwiZ2V0UmVkdWN0aW9uU3RhZ2VzIiwicHJldmlvdXNSZXN1bHQiLCJhZGRJbXBsIiwiYWRkSW1wbENQVSIsImJpbmNvdW50SW1wbCIsImJpbmNvdW50SW1wbENQVSIsImJpbmNvdW50UmVkdWNlSW1wbCIsImJpbmNvdW50UmVkdWNlSW1wbENQVSIsImNlaWxJbXBsIiwiY2VpbEltcGxDUFUiLCJjb25jYXRJbXBsIiwiY29uY2F0SW1wbENQVSIsImVxdWFsSW1wbCIsImVxdWFsSW1wbENQVSIsImV4cEltcGwiLCJleHBJbXBsQ1BVIiwiZXhwbTFJbXBsIiwiZXhwbTFJbXBsQ1BVIiwiZmxvb3JJbXBsIiwiZmxvb3JJbXBsQ1BVIiwiZ2F0aGVyTmRJbXBsIiwiZ2F0aGVyTmRJbXBsQ1BVIiwiZ2F0aGVyVjJJbXBsIiwiZ2F0aGVyVjJJbXBsQ1BVIiwiZ3JlYXRlckltcGwiLCJncmVhdGVySW1wbENQVSIsImdyZWF0ZXJFcXVhbEltcGwiLCJncmVhdGVyRXF1YWxJbXBsQ1BVIiwibGVzc0ltcGwiLCJsZXNzSW1wbENQVSIsImxlc3NFcXVhbEltcGwiLCJsZXNzRXF1YWxJbXBsQ1BVIiwibGluU3BhY2VJbXBsIiwibGluU3BhY2VJbXBsQ1BVIiwibG9nSW1wbCIsImxvZ0ltcGxDUFUiLCJtYXhJbXBsIiwibWF4SW1wbENQVSIsIm1heGltdW1JbXBsIiwibWF4aW11bUltcGxDUFUiLCJtaW5pbXVtSW1wbCIsIm1pbmltdW1JbXBsQ1BVIiwibXVsdGlwbHlJbXBsIiwibXVsdGlwbHlJbXBsQ1BVIiwibmVnSW1wbCIsIm5lZ0ltcGxDUFUiLCJub3RFcXVhbEltcGwiLCJub3RFcXVhbEltcGxDUFUiLCJwcm9kSW1wbCIsInByb2RJbXBsQ1BVIiwicmFuZ2VJbXBsIiwicmFuZ2VJbXBsQ1BVIiwicnNxcnRJbXBsIiwicnNxcnRJbXBsQ1BVIiwic2lnbW9pZEltcGwiLCJzaWdtb2lkSW1wbENQVSIsInNpbXBsZUFic0ltcGwiLCJzaW1wbGVBYnNJbXBsQ1BVIiwic2xpY2VJbXBsIiwic2xpY2VJbXBsQ1BVIiwic3BhcnNlRmlsbEVtcHR5Um93c0ltcGwiLCJzcGFyc2VGaWxsRW1wdHlSb3dzSW1wbENQVSIsInNwYXJzZVJlc2hhcGVJbXBsIiwic3BhcnNlUmVzaGFwZUltcGxDUFUiLCJzcGFyc2VTZWdtZW50UmVkdWN0aW9uSW1wbCIsInNwYXJzZVNlZ21lbnRSZWR1Y3Rpb25JbXBsQ1BVIiwic3FydEltcGwiLCJzcXJ0SW1wbENQVSIsInN0cmlkZWRTbGljZUltcGwiLCJzdHJpZGVkU2xpY2VJbXBsQ1BVIiwic3RyaW5nTkdyYW1zSW1wbCIsInN0cmluZ05HcmFtc0ltcGxDUFUiLCJzdHJpbmdTcGxpdEltcGwiLCJzdHJpbmdTcGxpdEltcGxDUFUiLCJzdHJpbmdUb0hhc2hCdWNrZXRGYXN0SW1wbCIsInN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RJbXBsQ1BVIiwic3ViSW1wbCIsInN1YkltcGxDUFUiLCJ0aWxlSW1wbCIsInRpbGVJbXBsQ1BVIiwidG9wS0ltcGwiLCJ0b3BLSW1wbENQVSIsInRyYW5zcG9zZUltcGwiLCJ0cmFuc3Bvc2VJbXBsQ1BVIiwidW5pcXVlSW1wbCIsInVuaXF1ZUltcGxDUFUiLCJBQlMiLCJhcmdzIiwiYWJzQ29uZmlnIiwia2VybmVsTmFtZSIsImJhY2tlbmROYW1lIiwia2VybmVsRnVuYyIsIkFDT1MiLCJhY29zIiwiYWNvc0NvbmZpZyIsIkFDT1NIIiwiYWNvc2giLCJhY29zaENvbmZpZyIsIkFERCIsImFkZEtlcm5lbEZ1bmMiLCJhZGRDb25maWciLCJhZGROIiwidGVuc29ycyIsIm1pZEluZGV4IiwibGVmdFNpZGUiLCJyaWdodFNpZGUiLCJkMSIsImQyIiwiYWRkTkNvbmZpZyIsImtlZXBEaW1zIiwib3JpZ0F4ZXMiLCJwYXJzZUF4aXNQYXJhbSIsInBlcm11dGVkQXhlcyIsImdldEF4ZXNQZXJtdXRhdGlvbiIsInBlcm11dGVkWCIsInBlcm0iLCJnZXRJbm5lck1vc3RBeGVzIiwibmV3U2hhcGUiLCJleHBhbmRTaGFwZVRvS2VlcERpbSIsImFsbENvbmZpZyIsImFueSIsImFueUNvbmZpZyIsImFyZ01heCIsIiR4IiwiYXJnTWF4Q29uZmlnIiwiYXJnTWluIiwiYXJnTWluQ29uZmlnIiwiQVNJTiIsImFzaW4iLCJhc2luQ29uZmlnIiwiQVNJTkgiLCJhc2luaCIsImFzaW5oQ29uZmlnIiwiQVRBTiIsImF0YW4iLCJhdGFuQ29uZmlnIiwiQVRBTjIiLCJBVEFOMl9QQUNLRUQiLCJhdGFuMiIsImF0YW4yQ29uZmlnIiwiQVRBTkgiLCJhdGFuaCIsImF0YW5oQ29uZmlnIiwiYXZnUG9vbCIsImZpbHRlclNpemUiLCJwYWQiLCJkaW1Sb3VuZGluZ01vZGUiLCJlaXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUiLCJjb21wdXRlUG9vbDJESW5mbyIsImF2Z1Bvb2xQcm9ncmFtIiwiYXZnUG9vbENvbmZpZyIsImF2Z1Bvb2wzRCIsImNvbXB1dGVQb29sM0RJbmZvIiwiYXZnUG9vbDNEQ29uZmlnIiwiYXZnUG9vbDNER3JhZCIsImR5IiwiYXZnUG9vbEJhY2twcm9wUHJvZ3JhbSIsImF2Z1Bvb2xHcmFkM0RDb25maWciLCJhdmdQb29sR3JhZCIsImF2Z1Bvb2xHcmFkQ29uZmlnIiwiYmF0Y2hNYXRNdWwiLCJ0cmFuc3Bvc2VBIiwidHJhbnNwb3NlQiIsImJhdGNoTWF0TXVsQ29uZmlnIiwiTUFUTVVMX1NIQVJFRF9ESU1fVEhSRVNIT0xEIiwiYmF0Y2hNYXRNdWxJbXBsIiwiYmlhcyIsInByZWx1QWN0aXZhdGlvbldlaWdodHMiLCJsZWFreXJlbHVBbHBoYSIsImFSYW5rIiwiYlJhbmsiLCJpbm5lclNoYXBlQSIsImlubmVyU2hhcGVCIiwib3V0ZXJTaGFwZUEiLCJvdXRlclNoYXBlQiIsIm91dGVyRGltc0EiLCJvdXRlckRpbXNCIiwiYmF0Y2hEaW1BIiwiYmF0Y2hEaW1CIiwiYmF0Y2hEaW1zQ29tcGF0aWJsZSIsImEzZFNoYXBlIiwiYjNkU2hhcGUiLCJhM2QiLCJiM2QiLCJpbnRlcm1lZGlhdGVzIiwiYmF0Y2hEaW0iLCJtYXgiLCJzaGFyZWREaW0iLCJoYXNCaWFzIiwiZnVzZWRBY3RpdmF0aW9uIiwiYVZlYyIsImJWZWMiLCJzaG91bGRSZXNoYXBlQiIsImFWZWMzZCIsImJWZWMzZCIsInByb2R1Y3QiLCIkbGVha3lyZWx1QWxwaGEiLCJjcmVhdGVTY2FsYXJWYWx1ZSIsIm91dFJlc2hhcGVkIiwiYmF0Y2hOb3JtIiwibWVhbiIsInZhcmlhbmNlIiwib2Zmc2V0Iiwic2NhbGUiLCJmaW5hbElucHV0cyIsImJhdGNoTm9ybUNvbmZpZyIsImJhdGNoVG9TcGFjZU5EIiwiYmxvY2tTaGFwZSIsImNyb3BzIiwicHJvZCIsImdldFJlc2hhcGVkIiwicGVybXV0ZWQiLCJnZXRQZXJtdXRlZCIsInJlc2hhcGVkUGVybXV0ZWQiLCJnZXRSZXNoYXBlZFBlcm11dGVkIiwic2xpY2VCZWdpbkNvb3JkcyIsImdldFNsaWNlQmVnaW5Db29yZHMiLCJzbGljZVNpemUiLCJnZXRTbGljZVNpemUiLCJ0b0Rpc3Bvc2UiLCJyZXNoYXBlZEludGVybWVkaWF0ZSIsInRyYW5zcG9zZWRJbnRlcm1lZGlhdGUiLCJyZXNoYXBlZEludGVybWVkaWF0ZTIiLCJzbGljZWQiLCJiZWdpbiIsImJhdGNoVG9TcGFjZU5EQ29uZmlnIiwiYmluY291bnQiLCJ3ZWlnaHRzIiwieFZhbHMiLCJ3ZWlnaHRzVmFscyIsIm91dFZhbHMiLCJiaW5jb3VudENvbmZpZyIsImNhc3QiLCJ6ZXJvc1RlbnNvciIsImZsb2F0WCIsInJlYWxQYXJ0IiwiaGFzRW5jb2RpbmdMb3NzIiwiemVyb3NUZW5zb3JJbmZvIiwiYmluYXJ5SW5wdXRzIiwiY2FzdENvbmZpZyIsIkNFSUwiLCJjZWlsQ29uZmlnIiwiY2xpcEJ5VmFsdWUiLCJjbGlwVmFsdWVNaW4iLCJjbGlwVmFsdWVNYXgiLCJjbGlwQnlWYWx1ZUNvbmZpZyIsImNvbXBsZXgiLCJjb21wbGV4SW5mbyIsInJlYWxUZW5zb3JJbmZvIiwiaW1hZ1RlbnNvckluZm8iLCJjb21wbGV4Q29uZmlnIiwibWFrZUNvbXBsZXhDb21wb25lbnRUZW5zb3JJbmZvIiwiY29tcGxleFRlbnNvciIsImNvbXBsZXhQYXJ0IiwiY29tcGxleEFicyIsInByb2dyYW1JbnB1dHMiLCJjb21wbGV4QWJzQ29uZmlnIiwiJGF4aXMiLCIkaW5wdXRzIiwiYXNzZXJ0UGFyYW1zQ29uc2lzdGVudCIsImNvbmNhdENvbmZpZyIsInJlYWxzIiwiaW1hZ3MiLCJyZWFsQ29uY2F0ZWQiLCJpbWFnQ29uY2F0ZWQiLCJydW5PbkNwdSIsInRlbnNvcnMyRCIsImlucHV0c1ZhbFNoYXBlcyIsInNpbXBseUNvbmNhdCIsImZpbmFsT3V0U2hhcGUiLCJjb21wdXRlVGVuc29yczJEIiwicmVzaGFwZWRSZXN1bHQiLCJjb252MmQiLCJkaWxhdGlvbnMiLCIkZGF0YUZvcm1hdCIsImNvbnZlcnRDb252MkREYXRhRm9ybWF0IiwiY29tcHV0ZUNvbnYyREluZm8iLCJjb252MkRDb25maWciLCJjb252MkRCYWNrcHJvcEZpbHRlciIsImNvbnYyREJhY2twcm9wRmlsdGVyQ29uZmlnIiwiY29udjJEQmFja3Byb3BJbnB1dCIsImNvbnYyREJhY2twcm9wSW5wdXRDb25maWciLCJjb252MmRCeU1hdE11bCIsInhUZXhEYXRhIiwic2hhcmVkTWF0TXVsRGltIiwib3V0ZXJTaGFwZVgiLCJvdXRlclNoYXBlRmlsdGVyIiwieFJlc2hhcGVkIiwib3JpZ2luYWxYVGV4RGF0YVNoYXBlIiwiZmlsdGVyUmVzaGFwZWQiLCJwb2ludHdpc2VDb252IiwicG9pbnR3aXNlQ29udlRleERhdGEiLCJjb252MmRXaXRoSW0yUm93IiwibnVtQ29scyIsIngyQ29sU2hhcGUiLCJ4U3F1ZWV6ZWQiLCJ3MlJvdyIsImltMkNvbFByb2dyYW0iLCJpbTJDb2wiLCJpbTJDb2xSZXNoYXBlZCIsIm1hdG11bFByb2dyYW0iLCJjb252M0QiLCJjb21wdXRlQ29udjNESW5mbyIsImNvbnYzRENvbmZpZyIsImNvbnYzREJhY2twcm9wRmlsdGVyVjIiLCJjb252M0RCYWNrcHJvcEZpbHRlclYyQ29uZmlnIiwiY29udjNEQmFja3Byb3BJbnB1dCIsImNvbnYzREJhY2twcm9wSW5wdXRDb25maWciLCJDT1MiLCJjb3MiLCJjb3NDb25maWciLCJjb3NoIiwiY29zaENvbmZpZyIsImNyb3BBbmRSZXNpemUiLCJpbWFnZSIsImJveGVzIiwiYm94SW5kIiwiY3JvcEFuZFJlc2l6ZUNvbmZpZyIsImN1bXN1bSIsInBlcm11dGF0aW9uIiwicGVybXV0ZWRBeGlzIiwibG9nMiIsInByZXZSZXN1bHQiLCJyZXZlcnNlUGVybXV0YXRpb24iLCJnZXRVbmRvQXhlc1Blcm11dGF0aW9uIiwicmV2ZXJzZVRyYW5zcG9zZWRSZXN1bHQiLCJjdW1zdW1Db25maWciLCJkZW5zZUJpbmNvdW50IiwiYmluYXJ5T3V0cHV0IiwieEJ1ZiIsIndlaWdodHNCdWYiLCJvdXRCdWYiLCJkZW5zZUJpbmNvdW50Q29uZmlnIiwiZGVwdGhUb1NwYWNlIiwiaW5wdXRIZWlnaHQiLCJpbnB1dFdpZHRoIiwiaW5wdXREZXB0aCIsIm91dHB1dEhlaWdodCIsIm91dHB1dFdpZHRoIiwib3V0cHV0RGVwdGgiLCJkZXB0aFRvU3BhY2VDb25maWciLCJkZXB0aHdpc2VDb252MmROYXRpdmUiLCIkZGlsYXRpb25zIiwiZGVwdGh3aXNlQ29udjJkTmF0aXZlQ29uZmlnIiwiZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIiLCJkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlckNvbmZpZyIsImRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXQiLCJkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0Q29uZmlnIiwiZGlhZyIsInhTaXplIiwiZmxhdCIsImRpYWdDb25maWciLCJkaWxhdGlvbjJEIiwiY29tcHV0ZURpbGF0aW9uMkRJbmZvIiwiZGlsYXRpb24yRENvbmZpZyIsImVpbnN1bSIsImVxdWF0aW9uIiwiYWxsRGltcyIsInN1bW1lZERpbXMiLCJpZERpbXMiLCJkZWNvZGVFaW5zdW1FcXVhdGlvbiIsImNoZWNrRWluc3VtRGltU2l6ZXMiLCJwYXRoIiwic3RlcHMiLCJnZXRFaW5zdW1Db21wdXRlUGF0aCIsIm5TdGVwcyIsIm51bURpbXNSZW1haW5pbmciLCJ0ZW5zb3JzVG9EaXNwb3NlIiwiaWRUZXJtIiwicGVybXV0YXRpb25JbmRpY2VzIiwiZXhwYW5kRGltcyIsImRpbXNUb0V4cGFuZCIsImdldEVpbnN1bVBlcm11dGF0aW9uIiwiaXNJZGVudGl0eVBlcm11dGF0aW9uIiwiayIsInNwbGljZSIsImVpbnN1bUNvbmZpZyIsImVsdSIsImVsdUNvbmZpZyIsImVsdUdyYWQiLCJlbHVHcmFkQ29uZmlnIiwiZXF1YWwiLCJlcXVhbENvbmZpZyIsIkVSRiIsIkVSRl9QIiwiRVJGX0ExIiwiRVJGX0EyIiwiRVJGX0EzIiwiRVJGX0E0IiwiRVJGX0E1IiwiZXJmIiwiZXJmQ29uZmlnIiwiRVhQIiwiZXhwIiwiZXhwQ29uZmlnIiwiZGltIiwiaW5wdXRSYW5rIiwiJGRpbSIsImV4cGFuZERpbXNDb25maWciLCJFWFBNMSIsImV4cG0xIiwiZXhwbTFDb25maWciLCJmZnQiLCJmZnRDb25maWciLCJmZnRJbXBsIiwiaW5wdXRTaXplIiwiaW5uZXJEaW1lbnNpb25TaXplIiwiaW5wdXQyRCIsInJlYWxQcm9ncmFtIiwiaW1hZ1Byb2dyYW0iLCJpbWFnUGFydCIsImNvbXBsZXhPdXRwdXRSZXNoYXBlZCIsImZpbGwiLCJpbmZlckR0eXBlIiwiZ2V0QXJyYXlGcm9tRFR5cGUiLCJmaWxsQ29uZmlnIiwiZmxpcExlZnRSaWdodENvbmZpZyIsIkZMT09SIiwiZmxvb3JDb25maWciLCJmbG9vckRpdiIsImZsb29yRGl2Q29uZmlnIiwiZnJvbVBpeGVsc0NvbmZpZyIsIm51bUNoYW5uZWxzIiwiaXNWaWRlbyIsIkhUTUxWaWRlb0VsZW1lbnQiLCJpc0ltYWdlIiwiSFRNTEltYWdlRWxlbWVudCIsInZpZGVvV2lkdGgiLCJ2aWRlb0hlaWdodCIsImZyb21QaXhlbHMyRENvbnRleHQiLCJkcmF3SW1hZ2UiLCJ0ZW1wUGl4ZWxIYW5kbGUiLCJGcm9tUGl4ZWxzUHJvZ3JhbSIsIkZyb21QaXhlbHNQYWNrZWRQcm9ncmFtIiwiZnVzZWRDb252MmQiLCJmdXNlZENvbnYyRENvbmZpZyIsImZ1c2VkRGVwdGh3aXNlQ29udjJEIiwic2hvdWxkUGFja0RlcHRod2lzZUNvbnYiLCJmdXNlZERlcHRod2lzZUNvbnYyRENvbmZpZyIsImdhdGhlck5kIiwicGFyYW1zIiwiaW5kaWNlcyIsImluZGljZXNTaGFwZSIsInNsaWNlUmFuayIsInBhcmFtc1NpemUiLCJyZXN1bHRTaGFwZSIsIm51bVNsaWNlcyIsInByZXBhcmVBbmRWYWxpZGF0ZSIsImZsYXR0ZW5JbmRpY2VzIiwiZmxhdHRlblgiLCJpbmRpY2VzRGF0YSIsInBhcmFtc0J1ZiIsIm91dFZhbHVlIiwiZ2F0aGVyTmRDb25maWciLCJnYXRoZXJWMiIsImJhdGNoRGltcyIsInBhcnNlZEF4aXMiLCJzZWdtZW50X3V0aWwiLCJjb2xsZWN0R2F0aGVyT3BTaGFwZUluZm8iLCJpbmRpY2VzU2l6ZSIsIm91dGVyU2l6ZSIsImRpbVNpemUiLCJmbGF0dGVuSW5kZXgiLCJmbGF0dGVuT3V0cHV0U2hhcGUiLCJpbmRpY2VzQnVmIiwiZ2F0aGVyVjJDb25maWciLCJncmVhdGVyIiwiZ3JlYXRlckNvbmZpZyIsImdyZWF0ZXJFcXVhbCIsImdyZWF0ZXJFcXVhbENvbmZpZyIsImlmZnQiLCJpZmZ0Q29uZmlnIiwiaWRlbnRpdHkiLCJpZGVudGl0eUNvbmZpZyIsImlucHV0RGF0YSIsImltYWdDb25maWciLCJpc0Zpbml0ZSIsImlzRmluaXRlQ29uZmlnIiwiaXNJbmYiLCJpc0luZkNvbmZpZyIsImlzTmFOIiwiaXNOYU5Db25maWciLCJscm4iLCJkZXB0aFJhZGl1cyIsImJldGEiLCJMUk5Db25maWciLCJscm5HcmFkIiwiTFJOR3JhZENvbmZpZyIsIkxFQUtZUkVMVSIsIkxFQUtZUkVMVV9QQUNLRUQiLCJsZWFreVJlbHUiLCIkYWxwaGEiLCJsZWFreVJlbHVDb25maWciLCJsZXNzIiwibGVzc0NvbmZpZyIsIkxFU1NfRVFVQUwiLCJMRVNTX0VRVUFMX1BBQ0tFRCIsImxlc3NFcXVhbCIsImxlc3NFcXVhbENvbmZpZyIsImxpblNwYWNlIiwic3RvcCIsImxpblNwYWNlQ29uZmlnIiwibG9nQ29uZmlnIiwibG9nMXAiLCJsb2cxcENvbmZpZyIsImxvZ2ljYWxBbmQiLCJsb2dpY2FsQW5kQ29uZmlnIiwibG9naWNhbE5vdCIsImxvZ2ljYWxOb3RDb25maWciLCJsb2dpY2FsT3IiLCJsb2dpY2FsT3JDb25maWciLCJyZWR1Y3Rpb25JbmRpY2VzIiwibWF4SW5wdXRJc1RyYW5zcG9zZWQiLCJtYXhJbnB1dCIsIm1heElucHV0VmFsdWVzIiwibWF4T3V0U2hhcGUiLCJtYXhDb25maWciLCJtYXhQb29sIiwibWF4UG9vbFByb2dyYW0iLCJtYXhQb29sQ29uZmlnIiwibWF4UG9vbDNkIiwibWF4UG9vbDNEQ29uZmlnIiwibWF4UG9vbDNER3JhZCIsIm1heFBvb2wzZFBvc2l0aW9uc1Byb2dyYW0iLCJtYXhQb29sM2RQb3NpdGlvbnMiLCJtYXhQb29sQmFja3Byb3BQcm9ncmFtIiwibWF4UG9vbEdyYWQzRENvbmZpZyIsIm1heFBvb2xHcmFkIiwibWF4UG9vbFBvc2l0aW9uc1Byb2dyYW0iLCJtYXhQb29sUG9zaXRpb25zIiwibWF4UG9vbEJhY2tQcm9wUHJvZ3JhbSIsIm1heFBvb2xHcmFkQ29uZmlnIiwibWF4UG9vbFdpdGhBcmdtYXhDb25maWciLCJpbmNsdWRlQmF0Y2hJbkluZGV4IiwiaW5kZXhlcyIsIm1heFBvb2xXaXRoQXJnbWF4SW1wbCIsInBvb2xPdXRwdXQiLCJyZXNoYXBlZElucHV0IiwicmVzaGFwZWRPdXRwdXQiLCJNQVhJTVVNIiwiTUFYSU1VTV9QQUNLRUQiLCJtYXhpbXVtIiwibWF4aW11bUNvbmZpZyIsIm1lYW5Db25maWciLCJtZWFuSW5wdXRJc1RyYW5zcG9zZWQiLCJtZWFuSW5wdXQiLCJtZWFuSW5wdXRWYWx1ZXMiLCJtZWFuT3V0U2hhcGUiLCJtZWFuSW1wbCIsIm1pbiIsIm1pbkNvbmZpZyIsIk1JTklNVU0iLCJNSU5JTVVNX1BBQ0tFRCIsIm1pbmltdW0iLCJtaW5pbXVtQ29uZmlnIiwibWlycm9yUGFkS2VybmVsRnVuYyIsInBhZGRpbmdzIiwibWlycm9yUGFkQ29uZmlnIiwiTU9EX1BBQ0tFRCIsIm1vZCIsIm1vZENvbmZpZyIsIm11bHRpbm9taWFsIiwibG9naXRzIiwibnVtU2FtcGxlcyIsInNlZWQiLCJub3JtYWxpemVkIiwicHJvYnMiLCJudW1PdXRjb21lcyIsIm11bHRpbm9taWFsQ29uZmlnIiwiTVVMIiwibXVsdGlwbHkiLCJ1cGNhc3RUeXBlIiwibXVsdGlwbHlDb25maWciLCJORUciLCJuZWciLCJuZWdDb25maWciLCJub25NYXhTdXBwcmVzc2lvblYzSW1wbCIsIm5vbk1heFN1cHByZXNzaW9uVjMiLCJzY29yZXMiLCJtYXhPdXRwdXRTaXplIiwiaW91VGhyZXNob2xkIiwic2NvcmVUaHJlc2hvbGQiLCJib3hlc1ZhbHMiLCJzY29yZXNWYWxzIiwic2VsZWN0ZWRJbmRpY2VzIiwibm9uTWF4U3VwcHJlc3Npb25WM0NvbmZpZyIsIm5vbk1heFN1cHByZXNzaW9uVjRJbXBsIiwibm9uTWF4U3VwcHJlc3Npb25WNCIsInBhZFRvTWF4T3V0cHV0U2l6ZSIsInZhbGlkT3V0cHV0cyIsIm5vbk1heFN1cHByZXNzaW9uVjRDb25maWciLCJub25NYXhTdXBwcmVzc2lvblY1SW1wbCIsIm5vbk1heFN1cHByZXNzaW9uVjUiLCJzb2Z0Tm1zU2lnbWEiLCJtYXhPdXRwdXRTaXplVmFsIiwiaW91VGhyZXNob2xkVmFsIiwic2NvcmVUaHJlc2hvbGRWYWwiLCJzb2Z0Tm1zU2lnbWFWYWwiLCJzZWxlY3RlZFNjb3JlcyIsIm5vbk1heFN1cHByZXNzaW9uVjVDb25maWciLCJub3RFcXVhbCIsIm5vdEVxdWFsQ29uZmlnIiwib25lSG90Iiwib25WYWx1ZSIsIm9mZlZhbHVlIiwib25lSG90Q29uZmlnIiwib25lc0xpa2UiLCJvbmVzTGlrZUNvbmZpZyIsInBhY2siLCJhc3NlcnRTaGFwZXNNYXRjaCIsImV4cGFuZGVkVGVuc29ycyIsImV4cGFuZGVkVCIsInBhY2tDb25maWciLCJwYWRWMiIsImNvbnN0YW50VmFsdWUiLCJwYWRWMkNvbmZpZyIsIlBPV19QQUNLRUQiLCJwb3ciLCJwb3dDb25maWciLCJQUkVMVSIsIlBSRUxVX1BBQ0tFRCIsInByZWx1IiwicHJlbHVDb25maWciLCJvdXREdHlwZSIsIm91dHB1dERUeXBlIiwicHJvZENvbmZpZyIsInJhbmdlIiwic3RlcCIsInJhbmdlQ29uZmlnIiwicmVhbENvbmZpZyIsInJlYWxEaXYiLCJyZWFsRGl2Q29uZmlnIiwicmVjaXByb2NhbCIsInJlY2lwcm9jYWxDb25maWciLCJSRUxVIiwicmVsdSIsInJlbHVDb25maWciLCJSRUxVNiIsInJlbHU2IiwicmVsdTZDb25maWciLCJyZXNoYXBlIiwiJHNoYXBlIiwiaW5mZXJGcm9tSW1wbGljaXRTaGFwZSIsIiR4U2l6ZSIsInJlc2hhcGVDb25maWciLCJyZXNpemVCaWxpbmVhciIsImltYWdlcyIsImFsaWduQ29ybmVycyIsImhhbGZQaXhlbENlbnRlcnMiLCJuZXdIZWlnaHQiLCJuZXdXaWR0aCIsInJlc2l6ZUJpbGluZWFyQ29uZmlnIiwicmVzaXplQmlsaW5lYXJHcmFkIiwicmVzaXplQmlsaW5lYXJHcmFkQ29uZmlnIiwicmVzaXplTmVhcmVzdE5laWdoYm9yIiwicmVzaXplTmVhcmVzdE5laWdoYm9yQ29uZmlnIiwicmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZCIsInJlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWRDb25maWciLCJkaW1zIiwiJGRpbXMiLCJyZXZlcnNlQ29uZmlnIiwicm90YXRlV2l0aE9mZnNldENvbmZpZyIsInJhZGlhbnMiLCJmaWxsVmFsdWUiLCJjZW50ZXIiLCJjZW50ZXJYIiwiY2VudGVyWSIsImdldEltYWdlQ2VudGVyIiwic2luIiwicm91bmRDb25maWciLCJyc3FydCIsInJzcXJ0Q29uZmlnIiwic2NhdHRlck5kIiwidXBkYXRlcyIsIm51bVVwZGF0ZXMiLCJvdXRwdXRTaXplIiwiY2FsY3VsYXRlU2hhcGVzIiwiZmxhdHRlblNoYXBlIiwiZGVmYXVsdFZhbHVlIiwic2NhdHRlck5kQ29uZmlnIiwic2VsZWN0IiwiZSIsInNlbGVjdENvbmZpZyIsIlNFTFUiLCJTRUxVX1NDQUxFQUxQSEEiLCJTRUxVX1NDQUxFIiwic2VsdSIsInNlbHVDb25maWciLCJTSUdNT0lEIiwic2lnbW9pZCIsInNpZ21vaWRDb25maWciLCJzaWduIiwic2lnbkNvbmZpZyIsIlNJTiIsInNpbkNvbmZpZyIsInNpbmgiLCJzaW5oQ29uZmlnIiwiJGJlZ2luIiwiJHNpemUiLCJwYXJzZVNsaWNlUGFyYW1zIiwiYXNzZXJ0UGFyYW1zVmFsaWQiLCJpc0NvbnRpbm91cyIsImlzU2xpY2VDb250aW5vdXMiLCJuZXdUZXhEYXRhIiwiYXNzaWduIiwiY29tcHV0ZUZsYXRPZmZzZXQiLCJzaGFsbG93U2xpY2UiLCJzbGljZUNvbmZpZyIsInNvZnRtYXgiLCJtYXhMb2dpdCIsImV4cGFuZGVkU2hhcGUiLCJtYXhMb2dpdHNSZXNoYXBlZCIsInN1bUV4cCIsInN1bUV4cFJlc2hhcGVkIiwic29mdG1heENvbmZpZyIsInNvZnRwbHVzIiwic29mdHBsdXNDb25maWciLCJzcGFjZVRvQmF0Y2hORCIsImNvbXBsZXRlUGFkZGluZ3MiLCJwYWRkZWRYIiwicmVzaGFwZWRQYWRkZWRTaGFwZSIsInBlcm11dGVkUmVzaGFwZWRQYWRkZWRQZXJtdXRhdGlvbiIsInJlc2hhcGVkUGFkZGVkWCIsInBhZGRlZFhUIiwic3BhY2VUb0JhdGNoTkRDb25maWciLCJzcGFyc2VGaWxsRW1wdHlSb3dzIiwiZGVuc2VTaGFwZSIsIiRpbmRpY2VzIiwiJHZhbHVlcyIsIiRkZW5zZVNoYXBlIiwiJGRlZmF1bHRWYWx1ZSIsIm91dHB1dEluZGljZXMiLCJvdXRwdXRJbmRpY2VzU2hhcGUiLCJvdXRwdXRWYWx1ZXMiLCJlbXB0eVJvd0luZGljYXRvciIsInJldmVyc2VJbmRleE1hcCIsIk51bWJlciIsInNwYXJzZUZpbGxFbXB0eVJvd3NDb25maWciLCJzcGFyc2VSZXNoYXBlIiwiaW5wdXRJbmRpY2VzIiwiJGlucHV0U2hhcGUiLCJmcm9tIiwiJGlucHV0SW5kaWNlcyIsIm5ld0luZGljZXMiLCJzcGFyc2VSZXNoYXBlQ29uZmlnIiwic3BhcnNlU2VnbWVudE1lYW4iLCJzZWdtZW50SWRzIiwiJGRhdGEiLCIkc2VnbWVudElkcyIsIm91dHB1dERhdGFTaGFwZSIsInNwYXJzZVNlZ21lbnRNZWFuQ29uZmlnIiwic3BhcnNlU2VnbWVudFN1bSIsInNwYXJzZVNlZ21lbnRTdW1Db25maWciLCJzcGFyc2VUb0RlbnNlIiwic3BhcnNlSW5kaWNlcyIsInNwYXJzZVZhbHVlcyIsInNwYXJzZVRvRGVuc2VDb25maWciLCJzcGxpdFYiLCJudW1PclNpemVTcGxpdHMiLCJzcGxpdFNpemVzIiwicHJlcGFyZVNwbGl0U2l6ZSIsInNsaWNlVCIsInNwbGl0VkNvbmZpZyIsIlNRUlQiLCJzcXJ0Iiwic3FydENvbmZpZyIsInNxdWFyZSIsInNxdWFyZUNvbmZpZyIsInNxdWFyZWREaWZmZXJlbmNlIiwic3F1YXJlZERpZmZlcmVuY2VDb25maWciLCJzdGVwQ29uZmlnIiwic3RyaWRlZFNsaWNlIiwiZW5kIiwiYmVnaW5NYXNrIiwiZW5kTWFzayIsImVsbGlwc2lzTWFzayIsIm5ld0F4aXNNYXNrIiwic2hyaW5rQXhpc01hc2siLCJub25TdHJpZGVkIiwiJHN0cmlkZXMiLCJzbGljZUluZm8iLCJzb21lIiwicmVzdWx0VmFsdWVzIiwicmVzdWx0UmVzaGFwZWQiLCJzdHJpZGVkU2xpY2VDb25maWciLCJzdHJpbmdOR3JhbXMiLCJzZXBhcmF0b3IiLCJuR3JhbVdpZHRocyIsImxlZnRQYWQiLCJyaWdodFBhZCIsInBhZFdpZHRoIiwicHJlc2VydmVTaG9ydFNlcXVlbmNlcyIsImRhdGFTcGxpdHMiLCIkZGF0YVNwbGl0cyIsIm5HcmFtcyIsIm5HcmFtc1NwbGl0cyIsInN0cmluZ05HcmFtc0NvbmZpZyIsInN0cmluZ1NwbGl0Iiwic2tpcEVtcHR5IiwiZGVsaW1pdGVyIiwiJGlucHV0IiwiJGRlbGltaXRlciIsInN0cmluZ1NwbGl0Q29uZmlnIiwic3RyaW5nVG9IYXNoQnVja2V0RmFzdCIsIm51bUJ1Y2tldHMiLCJzdHJpbmdUb0hhc2hCdWNrZXRGYXN0Q29uZmlnIiwiU1VCIiwic3ViIiwic3ViQ29uZmlnIiwic3VtQ29uZmlnIiwic3VtSW1wbCIsInN1bUlucHV0SXNUcmFuc3Bvc2VkIiwic3VtSW5wdXQiLCJzdW1PdXRTaGFwZSIsIm91dFR5cGUiLCJ0YW4iLCJ0YW5Db25maWciLCJ0YW5oIiwidGFuaENvbmZpZyIsInRpbGUiLCJyZXBzIiwiYnVmIiwidGlsZUNvbmZpZyIsImRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvT3JOdWxsIiwicm91bmRVcFRvUG93MiIsInBvdzIiLCJ0b3BLIiwic29ydGVkIiwiVE9QS19MQVNUX0RJTV9DUFVfSEFORE9GRl9TSVpFX1RIUkVTSE9MRCIsIlRPUEtfS19DUFVfSEFORE9GRl9USFJFU0hPTEQiLCJsYXN0RGltIiwiYWxsVG9wS1ZhbHMiLCJhbGxUb3BLSW5kaWNlcyIsInhJc1BhY2tlZCIsIngyRCIsImtQb3cyIiwibGFzdERpbVBvdzIiLCJnZXRJbnB1dHMiLCJydW5Td2FwIiwiZGlyIiwiaW5jIiwiTkVHQVRJVkVfSU5GSU5JVFkiLCJwcmV2SW5kaWNlcyIsImxlbiIsIm1lcmdlUHJvZ3JhbSIsInByZXZWYWx1ZXMiLCJ0b3BLQ29uZmlnIiwidHJhbnNmb3JtIiwidHJhbnNmb3JtcyIsImludGVycG9sYXRpb24iLCJmaWxsTW9kZSIsInRyYW5zZm9ybUNvbmZpZyIsInRyYW5zcG9zZSIsInRyYW5zcG9zZUNvbmZpZyIsInVuaXF1ZSIsInVuaXF1ZUNvbmZpZyIsInVucGFjayIsIm91dEluZGV4IiwidW5wYWNrQ29uZmlnIiwidW5zb3J0ZWRTZWdtZW50U3VtIiwibnVtU2VnbWVudHMiLCJzZWdPcENvbXB1dGUiLCJzZWdPcFR5cGUiLCJzZWdPcENvbXB1dGVPcHRpbWFsV2luZG93U2l6ZSIsInNlZ09wSW5mbyIsInJhbmdlSW5mbyIsInRpbGVJbmZvIiwic2VnT3BSZXN1bHQiLCJ1bnNvcnRlZFNlZ21lbnRTdW1Db25maWciLCJ6ZXJvc0xpa2UiLCJ6ZXJvc0xpa2VDb25maWciLCJfZnVzZWRNYXRNdWwiLCJfZnVzZWRNYXRNdWxDb25maWciLCJMUk5Qcm9ncmFtIiwicmFkaXVzIiwicmFkIiwibWF4RCIsInBvd09wZXJhdG9yIiwiYmFzaXMiLCJMUk5HcmFkUHJvZ3JhbSIsIkxSTlBhY2tlZFByb2dyYW0iLCJNYXhQb29sMkRCYWNrcHJvcFByb2dyYW0iLCJNYXhQb29sM0RCYWNrcHJvcFByb2dyYW0iLCJNZWFuUHJvZ3JhbSIsImRpdmlzb3IiLCJ3aW5kb3dTaXplTmVhcmVzdFZlYzQiLCJ3aW5kb3dTaXplVmVjNFJlbWFpbmRlciIsInVwZGF0ZVNuaXBwZXQiLCJkZW5vbWluYXRvciIsImlzSW50IiwidG9QcmVjaXNpb24iLCJNaXJyb3JQYWRQcm9ncmFtIiwidW5wYWNrZWRDb29yZHMiLCJNaXJyb3JQYWRQYWNrZWRQcm9ncmFtIiwiY0xpbWl0IiwiaW5uZXJEaW1zIiwicGFkU2V0dXAiLCJNYXRNdWxQYWNrZWRQcm9ncmFtIiwiaGFzTGVha3lyZWx1QWN0aXZhdGlvbiIsInNoYXJlZERpbWVuc2lvblBhY2tlZCIsImFTYW1wbGUiLCJiU2FtcGxlIiwiYVN3aXp6bGUiLCJiU3dpenpsZSIsImJhdGNoQVNuaXBwZXQiLCJiYXRjaEJTbmlwcGV0IiwiTXVsdGlub21pYWxQcm9ncmFtIiwiT25lSG90UHJvZ3JhbSIsIm51bUluZGljZXMiLCJQYWNrUHJvZ3JhbSIsIm91dE9mQm91bmRzQ29uZGl0aW9uIiwiY29uZCIsImdldE91dE9mQm91bmRzQ29uZGl0aW9uIiwic2V0dXAiLCJnZXRTZXR1cCIsImNvb3JkIiwiZ2V0U291cmNlQ29vcmRzQXJyIiwiZ2V0T3V0cHV0IiwiZ2V0VmVjQ2hhbm5lbHMiLCJnZXRDaGFubmVscyIsIlBhZFByb2dyYW0iLCJQYWRQYWNrZWRQcm9ncmFtIiwiY29tcG9uZW50U2V0dXAiLCJwYWRkaW5nQXJlYSIsImoiLCJQb29sMkRQcm9ncmFtIiwicG9vbFR5cGUiLCJjb21wdXRlUG9zaXRpb25zIiwiZmxhdHRlblBvc2l0aW9ucyIsImlzQXZnUG9vbCIsImJhdGNoRmxhdHRlblBvc2l0aW9uU3RyIiwiZmxhdHRlblBvc2l0aW9uU3RyIiwiaW5pdGlhbGl6YXRpb25WYWx1ZSIsImNvbXBhcmVPcCIsInJldHVyblZhbHVlIiwiZmlsdGVyV2lkdGhOZWFyZXN0VmVjNCIsImZpbHRlcldpZHRoVmVjNFJlbWFpbmRlciIsIlBvb2wzRFByb2dyYW0iLCJSZWR1Y2VQcm9ncmFtIiwidmVjVHlwZSIsImtlcm5lbENvbmZpZ3MiLCJrZXJuZWxDb25maWciLCJSZXNoYXBlUGFja2VkUHJvZ3JhbSIsInRoaXNSQyIsIlJlc2l6ZUJpbGluZWFyQmFja3Byb3BQcm9ncmFtIiwiZHlTaGFwZSIsInhIZWlnaHQiLCJ4V2lkdGgiLCJ5SGVpZ2h0IiwieVdpZHRoIiwiZWZmZWN0aXZlWFNpemUiLCJlZmZlY3RpdmVZU2l6ZSIsImludkhlaWdodFNjYWxlIiwiaW52V2lkdGhTY2FsZSIsIndpbkhlaWdodCIsIndpbldpZHRoIiwiUmVzaXplQmlsaW5lYXJQcm9ncmFtIiwib2xkSGVpZ2h0Iiwib2xkV2lkdGgiLCJlZmZlY3RpdmVJblNpemUiLCJlZmZlY3RpdmVPdXRTaXplIiwic291cmNlRnJhY0luZGV4UkMiLCJSZXNpemVCaWxpbmVhclBhY2tlZFByb2dyYW0iLCJSZXNpemVOZWFyZXN0TmVpZ2JvckJhY2twcm9wUHJvZ3JhbSIsIlJlc2l6ZU5lYXJlc3ROZWlnaGJvclByb2dyYW0iLCJyb3VuZEJhc2UiLCJSZXNpemVOZWFyZXN0TmVpZ2hib3JQYWNrZWRQcm9ncmFtIiwiUmV2ZXJzZVByb2dyYW0iLCJpbkNvb3JkcyIsImdldEluQ29vcmQiLCJSZXZlcnNlUGFja2VkUHJvZ3JhbSIsIm5leHRDb2x1bW4iLCJuZXh0Um93IiwiZ2V0Q2hhbm5lbCIsImluQ29vcmRzQXJyYXkiLCJjaGFubmVsczEiLCJnZXRSIiwiZ2V0RyIsImdldEIiLCJnZXRBIiwiUm90YXRlUHJvZ3JhbSIsImZpbGxTbmlwcGV0IiwiU2NhdHRlclByb2dyYW0iLCJ1cGRhdGVTaXplIiwiaW5kaWNlc1JhbmsiLCJ1cGRhdGVzUmFuayIsInN1bW1pbmdEdXBlSW5kZXgiLCJpbmRpY2VzU3RyaW5nIiwiaW5kaWNlc1NuaXBwZXQiLCJ1cGRhdGVzU3RyaW5nIiwidXBkYXRlc1NuaXBwZXQiLCJTZWdtZW50T3BQcm9ncmFtIiwiY2hlY2tWYWx1ZU91dE9mQm91bmRzIiwiY2hlY2tTZWdtZW50SWRPdXRPZkJvdW5kcyIsIlNlbGVjdFByb2dyYW0iLCJjUmFuayIsImNDb29yZHMiLCJhYkNvb3JkcyIsImNDb29yZFZhcnMiLCJhYkNvb3JkVmFycyIsIm1ha2VTaGFkZXIiLCJpbnB1dHNJbmZvIiwicHJlZml4U25pcHBldHMiLCJnZXRVbmlmb3JtSW5mb0Zyb21TaGFwZSIsImFycmF5SW5kZXgiLCJpbnB1dFByZWZpeFNuaXBwZXQiLCJpbnB1dFNhbXBsaW5nU25pcHBldCIsImluSW5mbyIsInVzZXNQYWNrZWRUZXh0dXJlcyIsImdldFBhY2tlZFNhbXBsZXJGcm9tSW5JbmZvIiwiZ2V0U2FtcGxlckZyb21JbkluZm8iLCJpbnB1dEluZm8iLCJ0ZXhOYW1lIiwidGV4RnVuY1NuaXBwZXQiLCJmdW5jTmFtZSIsImluUmFuayIsIm91dFJhbmsiLCJnZXRDb29yZHNEYXRhVHlwZSIsInJhbmtEaWZmIiwiY29vcmRzU25pcHBldCIsImZpZWxkcyIsInVucGFja2VkQ29vcmRzU25pcHBldCIsImlzSW5wdXRTY2FsYXIiLCJpc091dHB1dFNjYWxhciIsImdldFBhY2tlZFNhbXBsZXJBdE91dHB1dENvb3JkcyIsImluVGV4U2hhcGUiLCJnZXRTYW1wbGVyQXRPdXRwdXRDb29yZHMiLCJnZXRJbnB1dFNhbXBsaW5nU25pcHBldCIsImZsb2F0VGV4dHVyZVNhbXBsZVNuaXBwZXQiLCJnZXRGbG9hdFRleHR1cmVTYW1wbGVTbmlwcGV0Iiwib3V0cHV0U2FtcGxpbmdTbmlwcGV0IiwiZmxvYXRUZXh0dXJlU2V0T3V0cHV0U25pcHBldCIsInNoYWRlclByZWZpeCIsIlNBTVBMRV8xRF9TTklQUEVUIiwiU0FNUExFXzJEX1NOSVBQRVQiLCJTQU1QTEVfM0RfU05JUFBFVCIsImdldFNoYWRlclByZWZpeCIsImdldE91dHB1dFNjYWxhckNvb3JkcyIsImdldE91dHB1dFBhY2tlZDFEQ29vcmRzIiwidGV4ZWxzSW5Mb2dpY2FsUm93IiwiZ2V0T3V0cHV0UGFja2VkMkRDb29yZHMiLCJ0ZXhlbHNJbkJhdGNoIiwiZ2V0T3V0cHV0UGFja2VkM0RDb29yZHMiLCJ0ZXhlbHNJbkJhdGNoTiIsImJhdGNoZXMiLCJnZXRPdXRwdXRQYWNrZWRORENvb3JkcyIsImdldFBhY2tlZE91dHB1dFNhbXBsaW5nU25pcHBldCIsImdldEZsb2F0VGV4dHVyZVNldFJHQkFTbmlwcGV0IiwiZ2V0T3V0cHV0MURDb29yZHMiLCJnZXRPdXRwdXQyRENvb3JkcyIsImNvb3Jkc0Zyb21JbmRleFNuaXBwZXQiLCJnZXRPdXRwdXQzRENvb3JkcyIsImdldE91dHB1dDREQ29vcmRzIiwiZ2V0T3V0cHV0NURDb29yZHMiLCJnZXRPdXRwdXQ2RENvb3JkcyIsImdldE91dHB1dFNhbXBsaW5nU25pcHBldCIsImdldEZsb2F0VGV4dHVyZVNldFJTbmlwcGV0IiwiU0hBREVSX1BBQ0tFRF9QUkVGSVgiLCJ0ZXhOdW1SIiwidGV4TnVtQyIsImdldEZsYXRPZmZzZXRVbmlmb3JtTmFtZSIsInROdW1SIiwidE51bUMiLCJnZXRTYW1wbGVyU2NhbGFyIiwiZ2V0VW5pZm9ybVNhbXBsZXIiLCJnZXRTYW1wbGVyMUQiLCJzcXVlZXplU2hhcGUiLCJzcXVlZXplZFNoYXBlIiwic3F1ZWV6ZUlucHV0SW5mbyIsImdldFNxdWVlemVkUGFyYW1zIiwiZ2V0U2FtcGxlcjJEIiwic3RyaWRlMCIsInN0cmlkZTEiLCJnZXRTYW1wbGVyM0QiLCJzdHJpZGUyIiwic3RyaWRlMlN0ciIsInN0cmlkZTFTdHIiLCJzdHJpZGUwU3RyIiwiZ2V0U2FtcGxlcjREIiwic3RyaWRlMyIsImdldFNhbXBsZXI1RCIsInN0cmlkZTQiLCJnZXRTYW1wbGVyNkQiLCJnZXRQYWNrZWRTYW1wbGVyU2NhbGFyIiwiZ2V0UGFja2VkU2FtcGxlcjFEIiwidmFsdWVzUGVyUm93IiwiZ2V0UGFja2VkU2FtcGxlcjJEIiwiZ2V0UGFja2VkU2FtcGxlcjNEIiwiZ2V0UGFja2VkU2FtcGxlck5EIiwidXNlU3F1ZWV6ZVBhY2tlZFNoYXBlIiwibmV3SW5wdXRJbmZvIiwiSlNPTiIsInBhcnNlIiwic3RyaW5naWZ5IiwiZ2V0TG9naWNhbENvb3JkaW5hdGVzRnJvbUZsYXRJbmRleCIsInN0cmlkZSIsImdldE91dHB1dExvZ2ljYWxDb29yZGluYXRlc0Zyb21GbGF0SW5kZXhCeVVuaWZvcm0iLCJnZXRMb2dpY2FsQ29vcmRpbmF0ZXNGcm9tRmxhdEluZGV4QnlVbmlmb3JtIiwidmFyaWFibGVOYW1lIiwiaW5kaWNlc0FyciIsIm51bUNvb3JkcyIsInN5bWJvbGljYWxseUNvbXB1dGVTdHJpZGVzIiwiYnVpbGRWZWMiLCJkb3RpZnkiLCJzbGljZXMiLCJuZWFyZXN0VmVjNCIsIm5lYXJlc3RWZWM0UmVtYWluZGVyIiwieFNsaWNlIiwieVNsaWNlIiwiZ2V0RmxhdEluZGV4RnJvbTNEIiwidG9TdHJpbmciLCJnZXRGbGF0SW5kZXhGcm9tM0RPdXRwdXQiLCJFTkNPREVfRkxPQVRfU05JUFBFVCIsIlNsaWNlUHJvZ3JhbSIsImRlc3RTaXplIiwiYm9keSIsIlNsaWNlUGFja2VkUHJvZ3JhbSIsInNvdXJjZUxvYyIsInVwcGVyUm93IiwibG93ZXJSb3ciLCJTdHJpZGVkU2xpY2VQcm9ncmFtIiwiaW5wdXREdHlwZSIsIm5ld0Nvb3JkcyIsIm91dHB1dEF4aXMiLCJQYWNraW5nU2NoZW1lIiwiVGV4dHVyZVVzYWdlIiwiUGh5c2ljYWxUZXh0dXJlVHlwZSIsImdldFVucGFja2VkTWF0cml4VGV4dHVyZVNoYXBlV2lkdGhIZWlnaHQiLCJnZXRVbnBhY2tlZEFycmF5U2l6ZUZyb21NYXRyaXhTaXplIiwibWF0cml4U2l6ZSIsImNoYW5uZWxzUGVyVGV4dHVyZSIsImdldENvbG9yTWF0cml4VGV4dHVyZVNoYXBlV2lkdGhIZWlnaHQiLCJnZXREZW5zZVRleFNoYXBlIiwidGV4ZWxzTmVlZGVkIiwic2l6ZVRvU3F1YXJpc2hTaGFwZSIsImdldE1hdHJpeFNpemVGcm9tVW5wYWNrZWRBcnJheVNpemUiLCJ1bnBhY2tlZFNpemUiLCJkZWNvZGVNYXRyaXhGcm9tVW5wYWNrZWRDb2xvclJHQkFBcnJheSIsInVucGFja2VkQXJyYXkiLCJtYXRyaXgiLCJyZXF1aXJlZFNpemUiLCJkc3QiLCJzcmMiLCJnZXRQYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodCIsImdldFBhY2tlZFJHQkFBcnJheVNpemVGcm9tTWF0cml4U2hhcGUiLCJnZXRUZXh0dXJlQ29uZmlnIiwiZ2xhbnkiLCJkb3dubG9hZFVucGFja051bUNoYW5uZWxzIiwiZGVmYXVsdE51bUNoYW5uZWxzIiwidGV4dHVyZVR5cGVGbG9hdCIsIlIzMkYiLCJSMTZGIiwiUkdCQTE2RiIsIlJHQkEzMkYiLCJSRUQiLCJIQUxGX0ZMT0FUIiwiSEFMRl9GTE9BVF9PRVMiLCJUZXh0dXJlTWFuYWdlciIsIm51bVVzZWRUZXh0dXJlcyIsIm51bUZyZWVUZXh0dXJlcyIsIl9udW1CeXRlc0FsbG9jYXRlZCIsIl9udW1CeXRlc0ZyZWUiLCJmcmVlVGV4dHVyZXMiLCJsb2dFbmFibGVkIiwidXNlZFRleHR1cmVzIiwic2hhcGVSQyIsInBoeXNpY2FsVGV4VHlwZSIsImdldFBoeXNpY2FsRnJvbUxvZ2ljYWxUZXh0dXJlVHlwZSIsInNoYXBlS2V5IiwiZ2V0S2V5RnJvbVRleHR1cmVTaGFwZSIsInRleEJ5dGVzIiwiUEFDS0VEXzJYMl9GTE9BVDMyIiwiUEFDS0VEXzJYMl9GTE9BVDE2IiwiVU5QQUNLRURfRkxPQVQzMiIsIlVOUEFDS0VEX0ZMT0FUMTYiLCJQQUNLRURfNFgxX1VOU0lHTkVEX0JZVEUiLCJsb2dpY2FsVGV4VHlwZSIsImRlbGV0ZVRleFRocmVzaG9sZCIsInRleExpc3QiLCJ0ZXhJbmRleCIsInRvdGFsIiwiZnJlZVJhdGlvIiwiZ2V0TnVtVXNlZFRleHR1cmVzIiwiZ2V0TnVtRnJlZVRleHR1cmVzIiwidGV4IiwiaW50ZXJuYWxGb3JtYXRGb3JQaHlzaWNhbFRleFR5cGUiLCJudW1FbGVtZW50cyIsInBhY2tlZFdpZHRoIiwicGFja2VkSGVpZ2h0IiwibnVtQnl0ZXNGb3JJbnRlcm5hbEZvcm1hdCIsIlJFTkRFUiIsImdldFBoeXNpY2FsVGV4dHVyZUZvclJlbmRlcmluZyIsInNoYXBlUm93c0NvbCIsIlRpbGVQcm9ncmFtIiwiU3dhcFByb2dyYW0iLCJNZXJnZVByb2dyYW0iLCJUcmFuc2Zvcm1Qcm9ncmFtIiwiaW50ZXJwb2xhdGlvbk1vZGVJZCIsImZpbGxNb2RlSWQiLCJUcmFuc3Bvc2VQcm9ncmFtIiwibmV3RGltIiwic3dpdGNoZWQiLCJvcmlnaW5hbE9yZGVyIiwic3dpdGNoZWRDb29yZHMiLCJnZXRTd2l0Y2hlZENvb3JkcyIsIlRyYW5zcG9zZVBhY2tlZFByb2dyYW0iLCJvdXRwdXRPcmRlciIsInN3aXRjaGVkT3JkZXIiLCJnZXRjIiwiVW5hcnlPcFByb2dyYW0iLCJMSU5FQVIiLCJTVEVQIiwiRUxVIiwiQ0xPTkUiLCJVbmFyeU9wUGFja2VkUHJvZ3JhbSIsIlVucGFja1Byb2dyYW0iLCJjYWxsQW5kQ2hlY2siLCJmdW5jIiwiZ2V0RXJyb3IiLCJOT19FUlJPUiIsImdldFdlYkdMRXJyb3JNZXNzYWdlIiwiY2hlY2tXZWJHTEVycm9yIiwiY2FuQmVSZXByZXNlbnRlZCIsIklOVkFMSURfRU5VTSIsIklOVkFMSURfVkFMVUUiLCJJTlZBTElEX09QRVJBVElPTiIsIklOVkFMSURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OIiwiT1VUX09GX01FTU9SWSIsIkNPTlRFWFRfTE9TVF9XRUJHTCIsImdldEV4dGVuc2lvbk9yVGhyb3ciLCJleHRlbnNpb25OYW1lIiwidGhyb3dJZk51bGwiLCJjcmVhdGVTaGFkZXIiLCJWRVJURVhfU0hBREVSIiwic2hhZGVyU291cmNlIiwiY29tcGlsZVNoYWRlciIsImdldFNoYWRlclBhcmFtZXRlciIsIkNPTVBJTEVfU1RBVFVTIiwiZ2V0U2hhZGVySW5mb0xvZyIsImNyZWF0ZUZyYWdtZW50U2hhZGVyIiwiRlJBR01FTlRfU0hBREVSIiwic2hhZGVySW5mb0xvZyIsImxpbmVOdW1iZXJSZWdleFJlc3VsdCIsImxpbmVOdW1iZXJSZWdleCIsImV4ZWMiLCJsaW5lTnVtYmVyIiwic2hhZGVyTGluZXMiLCJzcGxpdCIsImxpbmVzV2l0aExpbmVOdW1iZXJzIiwibGluZSIsIm1heExpbmVMZW5ndGgiLCJiZWZvcmVFcnJvckxpbmVzIiwiZXJyb3JMaW5lIiwiYWZ0ZXJFcnJvckxpbmVzIiwibG9nU2hhZGVyU291cmNlQW5kSW5mb0xvZyIsImxpbmtQcm9ncmFtIiwiZ2V0UHJvZ3JhbVBhcmFtZXRlciIsIkxJTktfU1RBVFVTIiwiZ2V0UHJvZ3JhbUluZm9Mb2ciLCJ2YWxpZGF0ZVByb2dyYW0iLCJWQUxJREFURV9TVEFUVVMiLCJjcmVhdGVTdGF0aWNWZXJ0ZXhCdWZmZXIiLCJTVEFUSUNfRFJBVyIsImNyZWF0ZVN0YXRpY0luZGV4QnVmZmVyIiwiZ2V0TnVtQ2hhbm5lbHMiLCJjcmVhdGVUZXh0dXJlIiwidmFsaWRhdGVUZXh0dXJlU2l6ZSIsIm1heFRleHR1cmVTaXplIiwiY3JlYXRlRnJhbWVidWZmZXIiLCJiaW5kVmVydGV4QnVmZmVyVG9Qcm9ncmFtQXR0cmlidXRlIiwiYXJyYXlFbnRyaWVzUGVySXRlbSIsIml0ZW1TdHJpZGVJbkJ5dGVzIiwiaXRlbU9mZnNldEluQnl0ZXMiLCJsb2MiLCJ2ZXJ0ZXhBdHRyaWJQb2ludGVyIiwiZW5hYmxlVmVydGV4QXR0cmliQXJyYXkiLCJiaW5kVGV4dHVyZVVuaXQiLCJ2YWxpZGF0ZVRleHR1cmVVbml0IiwiYWN0aXZlVGV4dHVyZSIsIlRFWFRVUkUwIiwidW5iaW5kVGV4dHVyZVVuaXQiLCJnZXRQcm9ncmFtVW5pZm9ybUxvY2F0aW9uT3JUaHJvdyIsImdldFByb2dyYW1Vbmlmb3JtTG9jYXRpb24iLCJiaW5kVGV4dHVyZVRvUHJvZ3JhbVVuaWZvcm1TYW1wbGVyIiwidW5pZm9ybVNhbXBsZXJMb2NhdGlvbiIsImJpbmRDYW52YXNUb0ZyYW1lYnVmZmVyIiwiYmluZENvbG9yVGV4dHVyZVRvRnJhbWVidWZmZXIiLCJmcmFtZWJ1ZmZlclRleHR1cmUyRCIsIkNPTE9SX0FUVEFDSE1FTlQwIiwidW5iaW5kQ29sb3JUZXh0dXJlRnJvbUZyYW1lYnVmZmVyIiwidmFsaWRhdGVGcmFtZWJ1ZmZlciIsImNoZWNrRnJhbWVidWZmZXJTdGF0dXMiLCJGUkFNRUJVRkZFUl9DT01QTEVURSIsImdldEZyYW1lYnVmZmVyRXJyb3JNZXNzYWdlIiwiRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5UIiwiRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NSVNTSU5HX0FUVEFDSE1FTlQiLCJGUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJTUVOU0lPTlMiLCJGUkFNRUJVRkZFUl9VTlNVUFBPUlRFRCIsInJldHVyblRPck51bGwiLCJmYWlsdXJlTWVzc2FnZSIsInRPck51bGwiLCJtYXhUZXh0dXJlVW5pdCIsIk1BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTIiwiZ2xUZXh0dXJlVW5pdCIsImdldEJhdGNoRGltIiwiZGltc1RvU2tpcCIsImdldFJvd3NDb2xzIiwiZ2V0U2hhcGVBczNEIiwiZ2V0VGV4dHVyZVNoYXBlRnJvbUxvZ2ljYWxTaGFwZSIsImxvZ1NoYXBlIiwibWF4VGV4U2l6ZSIsInNxdWVlemVSZXN1bHQiLCJpc0V2ZW4iLCJpc1Jlc2hhcGVGcmVlIiwic2hhcGUxIiwic2hhcGUyIiwic2hhcGUxQ29scyIsInNoYXBlMkNvbHMiLCJNQVhfVEVYVFVSRV9TSVpFIiwiTUFYX1RFWFRVUkVTX0lOX1NIQURFUiIsImdldFdlYkdMTWF4VGV4dHVyZVNpemUiLCJyZXNldE1heFRleHR1cmVTaXplIiwicmVzZXRNYXhUZXh0dXJlc0luU2hhZGVyIiwiZ2V0TWF4VGV4dHVyZXNJblNoYWRlciIsIk1BWF9URVhUVVJFX0lNQUdFX1VOSVRTIiwiZ2V0V2ViR0xEaXNqb2ludFF1ZXJ5VGltZXJWZXJzaW9uIiwiaGFzRXh0ZW5zaW9uIiwiaXNXZWJHTFZlcnNpb25FbmFibGVkIiwiaXNDYXBhYmxlT2ZSZW5kZXJpbmdUb0Zsb2F0VGV4dHVyZSIsImNyZWF0ZUZsb2F0VGV4dHVyZUFuZEJpbmRUb0ZyYW1lYnVmZmVyIiwiaXNEb3dubG9hZEZsb2F0VGV4dHVyZUVuYWJsZWQiLCJ0ZXhDb25maWciLCJmcmFtZUJ1ZmZlciIsImlzRnJhbWVCdWZmZXJDb21wbGV0ZSIsImNyZWF0ZUhhbGZGbG9hdFRleHR1cmVBbmRCaW5kVG9GcmFtZWJ1ZmZlciIsImlzV2ViR0xGZW5jZUVuYWJsZWQiLCJhc3NlcnROb3RDb21wbGV4IiwidGVuc29yIiwib3BOYW1lIiwiaXNBcnJheSIsIk1hdGhCYWNrZW5kQ1BVIiwiZmlyc3RVc2UiLCJvdXRJZCIsIl9hIiwicmVhc29ucyIsImNwdUJhY2tlbmQiLCJ4aSIsImFkZENvbXBsZXhJbXBsIiwiYVJlYWwiLCJhSW1hZyIsImJSZWFsIiwiYkltYWciLCJjdXJyVmFscyIsInJlZHVjZVNpemUiLCJtYWtlWmVyb3NUeXBlZEFycmF5IiwiYW55VmFsIiwibWF4SW5kZXgiLCJtaW5JbmRleCIsImF0YW4ySW1wbCIsImFWYWx1ZSIsImJWYWx1ZSIsInhWYWx1ZXMiLCJkeCIsImR5QnVmIiwiZHhEZXB0aCIsImR4Um93IiwiZHhDb2wiLCJkeURlcHRoQ29ybmVyIiwiZHlSb3dDb3JuZXIiLCJkeUNvbENvcm5lciIsImRvdFByb2QiLCJ3RGVwdGgiLCJkeURlcHRoIiwid1JvdyIsImR5Um93Iiwid0NvbCIsImR5Q29sIiwiYXZnUG9vbDNER3JhZENvbmZpZyIsImR5RGF0YSIsImR4UiIsImR4QyIsImR5UkNvcm5lciIsImR5Q0Nvcm5lciIsIndSIiwiZHlSIiwid0MiLCJkeUMiLCJsZWZ0RGltIiwicmlnaHREaW0iLCJhM2RWYWx1ZXMiLCJiM2RWYWx1ZXMiLCJhM2RTdHJpZGVzIiwiYjNkU3RyaWRlcyIsImFCYXRjaCIsImFPdXRlclN0ZXAiLCJhSW5uZXJTdGVwIiwiYklubmVyU3RlcCIsImJPdXRlclN0ZXAiLCJiQmF0Y2giLCJyZXNWYWxzIiwiYmkiLCJpMCIsImowIiwiazAiLCJpQmxvY2siLCJqQmxvY2siLCJrQmxvY2siLCJiYXRjaE9mZnNldEEiLCJiYXRjaE9mZnNldEIiLCJtVmFscyIsInZhclZhbHMiLCJzVmFscyIsIm9mZlZhbHMiLCJvZmZWYWxzTGVuZ3RoIiwic1ZhbHNMZW5ndGgiLCJ2YXJWYWxzTGVuZ3RoIiwibVZhbHNMZW5ndGgiLCJvZmZpIiwibWkiLCJzaSIsInZpIiwieFRyYW5zcG9zZWQiLCJ4VHJhbnNwb3NlZFJlc2hhcGVkIiwid2VpZ2h0c0R0eXBlIiwid2VpZ2h0c1NoYXBlIiwid2VpZ2h0c1NpemUiLCJ6ZXJvIiwidG9UeXBlZEFycmF5IiwicmVzdWx0RGF0YSIsImNsaXAiLCJjbGlwQXR0cnMiLCJjbGlwQ29uZmlnIiwicmVhbFZhbHMiLCJpbWFnVmFscyIsImNvbXBsZXhWYWxzIiwiaHlwb3QiLCJpbnB1dHMyRCIsImNvbE9mZnNldCIsInRJZHgiLCJyZXNJZHgiLCJjb252MkQiLCJ4U3RyaWRlcyIsImZpbHRlclN0cmlkZXMiLCJ4QmF0Y2hTdHJpZGUiLCJ4Um93U3RyaWRlIiwieENvbFN0cmlkZSIsInhDaGFubmVsU3RyaWRlIiwieUJhdGNoU3RyaWRlIiwieVJvd1N0cmlkZSIsInlDb2xTdHJpZGUiLCJ5Q2hhbm5lbFN0cmlkZSIsIndWYWxzIiwieVZhbHMiLCJ4T2Zmc2V0MSIsInlPZmZzZXQxIiwieVIiLCJ5T2Zmc2V0MiIsInhSQ29ybmVyIiwieFIiLCJ3T2Zmc2V0MSIsInhPZmZzZXQyIiwieUMiLCJ5T2Zmc2V0MyIsInhDQ29ybmVyIiwieEMiLCJ4T2Zmc2V0MyIsIndPZmZzZXQzIiwieFZhbCIsImRXIiwidG9wUGFkIiwiZHlWYWxzIiwieVJNaW4iLCJ5Uk1heCIsInlDTWluIiwieUNNYXgiLCJkeVN0cmlkZXMiLCJkeFZhbHVlcyIsImR5VmFsdWVzIiwiZmx0VmFsdWVzIiwiZmx0UzAiLCJmbHRTMSIsImZsdFMyIiwieFJNaW4iLCJ4Q01pbiIsImR5T2Zmc2V0IiwiZmx0T2Zmc2V0IiwieUYiLCJ4RkNvcm5lciIsIndGIiwieEYiLCJ3T2Zmc2V0MiIsInlPZmZzZXQ0IiwieE9mZnNldDQiLCJ3T2Zmc2V0NCIsImR3IiwiZHdWYWx1ZXMiLCJkd1MwIiwiZHdTMSIsImR3UzIiLCJkd1MzIiwiZHlTMCIsImR5UzEiLCJkeVMyIiwiZHlTMyIsInhTMCIsInhTMSIsInhTMiIsInhTMyIsImZyb250UGFkIiwieUZNaW4iLCJ5Rk1heCIsImNvbnYzREJhY2twcm9wSW5wdXRWMiIsImR4UzAiLCJkeFMxIiwiZHhTMiIsImR4UzMiLCJmbHRTMyIsInhGTWluIiwiY29udjNEQmFja3Byb3BJbnB1dFYyQ29uZmlnIiwiYm94VmFscyIsImJveEluZFZhbHMiLCJpbWFnZVZhbHMiLCJpblN0cmlkZSIsIm91dFN0cmlkZSIsInN0YXJ0SW5kIiwieTEiLCJ4MSIsInkyIiwieDIiLCJiSW5kIiwieUluZCIsImluZCIsInRvcEluZCIsImJvdHRvbUluZCIsInlMZXJwIiwieEluZCIsImxlZnRJbmQiLCJyaWdodEluZCIsInhMZXJwIiwidG9wTGVmdCIsInRvcFJpZ2h0IiwiYm90dG9tTGVmdCIsImJvdHRvbSIsImNsb3Nlc3RYIiwiY2xvc2VzdFkiLCJpbkluZCIsIm91dEluZCIsInJlc3VsdER0eXBlIiwiZmluYWxEaW0iLCJpbmRleEFkanVzdGVyIiwicHJldklkeCIsIm91dHB1dElkeCIsImluSCIsIm9mZnNldEgiLCJpblciLCJvZmZzZXREIiwiaW5wdXRJZHgiLCJjaE11bCIsInEiLCJ0cnVuYyIsImRtIiwiZGlsYXRpb24yZENvbmZpZyIsImZpbHRlclZhbHMiLCJmaWx0ZXJSYW5rIiwib3V0cHV0VmFscyIsImhPdXQiLCJoQmVnIiwid091dCIsIndCZWciLCJjdXJWYWwiLCJNSU5fU0FGRV9JTlRFR0VSIiwiaEluIiwid0luIiwieEluZGV4IiwibG9jVG9JbmRleCIsImZpbHRlckluZGV4IiwiZGlsYXRpb24yZEJhY2twcm9wRmlsdGVyQ29uZmlnIiwidG9OZXN0ZWRBcnJheSIsIiRmaWx0ZXIiLCIkZHkiLCJncmFkaWVudHMiLCJtYWtlWmVyb3NOZXN0ZWRUeXBlZEFycmF5IiwiaE1heCIsIndNYXgiLCJkaWxhdGlvbjJkQmFja3Byb3BJbnB1dENvbmZpZyIsImhJbk1heCIsIndJbk1heCIsInYiLCJhMSIsImEyIiwiYTMiLCJhNCIsImE1IiwiZmlsbFZhbHVlcyIsImJhdGNoSWR4IiwiYmF0Y2hPZmZzZXQiLCJyb3dPZmZzZXQiLCJjb29yZFgiLCJvdXRJZHgiLCJvdXRwdXRWYWx1ZSIsImZsb29yRGl2SW1wbCIsImZ1c2VkQ29udjJEIiwicmVzdWx0T2xkIiwib2xkUmVzdWx0IiwicGFyYW1zU2hhcGUiLCJpbmRleFRvTG9jIiwiJGJhdGNoRGltcyIsIm9yaWdpbmFsTG9jIiwiaW5kaWNlc0lkeCIsImluZGljZXNJbmRleCIsIm9yaWdpbmFsSW5kZXgiLCJpbWFnVmFsIiwibFJOIiwic3VtQWNyb3NzQ2hhbm5lbHMiLCJjdXJyZW50Q2hhbm5lbCIsImJlZ2luU3VtT2Zmc2V0IiwiZW5kU3VtT2Zmc2V0IiwieiIsImxSTkNvbmZpZyIsImxSTkdyYWQiLCJkeVNpemUiLCJ5VmFsdWVzIiwiZGVwdGhCZWdpbiIsImRlcHRoRW5kIiwibm9ybSIsImR5aSIsImxSTkdyYWRDb25maWciLCJsb2dpY2FsQW5kSW1wbCIsImxvZ2ljYWxPckltcGwiLCJtYXhQb29sM0QiLCJpbnB1dEJ1ZiIsIm1heFBvc0J1ZiIsIm1hc2siLCJtYXhQb29sM0RHcmFkQ29uZmlnIiwicG9vbGVkIiwicG9vbGVkRGF0YUlkIiwiaW5kZXhlc0RhdGFJZCIsIm1heFBvb2xzIiwibWF4UG9zaXRpb25zIiwicmVkdWNlU2l6ZVNjYWxhciIsIm1pcnJvclBhZCIsInJlc3VsdFNpemUiLCJyZXN1bHRSYW5rIiwicmVzdWx0U3RyaWRlcyIsImluSW5kZXgiLCJtb2RJbXBsIiwicmVtIiwicHJvYmFiaWxpdGllcyIsIm51bUV2ZW50cyIsInByb2JWYWxzIiwicmVzU2hhcGUiLCJjZGYiLCJldmVudCIsInJhbmRvbSIsIm91dE9mZnNldCIsInNhbXBsZUlkIiwibXVsdGlwbHlDb21wbGV4SW1wbCIsInhEdHlwZSIsIm1pbnVzT25lIiwiaW5kaWNlc1ZhbCIsIm91dENvb3JkcyIsInBvd0ltcGwiLCJwcmVsdUltcGwiLCJ4VmFsdWUiLCJyZWR1Y3Rpb25BeGVzIiwicmVhbFZhbCIsInJlYWxEaXZJbXBsIiwiZGl2IiwiaW1hZ2VzU3RyaWRlcyIsImVmZmVjdGl2ZUlucHV0U2l6ZSIsImVmZmVjdGl2ZU91dHB1dFNpemUiLCJlZmZlY3RpdmVSb3dTaXplUmF0aW8iLCJlZmZlY3RpdmVDb2xTaXplUmF0aW8iLCJzb3VyY2VGcmFjUm93Iiwic291cmNlUm93Rmxvb3IiLCJyb3dGcmFjIiwic291cmNlUm93Q2VpbCIsInRvcFJvd09mZnNldCIsImJvdFJvd09mZnNldCIsInNvdXJjZUZyYWNDb2wiLCJzb3VyY2VDb2xGbG9vciIsImNvbEZyYWMiLCJzb3VyY2VDb2xDZWlsIiwidG9wTGVmdE9mZmVzdCIsImJvdExlZnRPZmZzZXQiLCJ0b3BSaWdodE9mZnNldCIsImJvdFJpZ2h0T2ZmZXN0IiwibmV3VmFsdWUiLCJiT2Zmc2V0IiwidG9wRHhSSW5kZXgiLCJib3R0b21EeFJJbmRleCIsInRvcER4Uk9mZnNldCIsImJvdHRvbUR4Uk9mZnNldCIsImR4UkxlcnAiLCJpbnZlcnNlRHhSTGVycCIsImxlZnREeENJbmRleCIsInJpZ2h0RHhDSW5kZXgiLCJkeENMZXJwIiwiaW52ZXJzZUR4Q0xlcnAiLCJ0b3BMZWZ0UkNPZmZzZXQiLCJ0b3BSaWdodFJDT2Zmc2V0IiwiYm90dG9tTGVmdFJDT2Zmc2V0IiwiYm90dG9tUmlnaHRSQ09mZnNldCIsImludmVyc2VEeFJMZXJwVGltZXNJbnZlcnNlRHhDTGVycCIsImludmVyc2VEeFJMZXJwVGltZXNEeENMZXJwIiwiZHhSTGVycFRpbWVzSW52ZXJzZUR4Q0xlcnAiLCJkeFJMZXJwVGltZXNEeENMZXJwIiwiZHlWYWwiLCJvdXRwdXRPZmZzZXQiLCJzb3VyY2VOZWFyZXN0Um93Iiwic291cmNlTmVhcmVzdENvbCIsIm5ld1ZhbCIsInN0YXJ0UkxlcnAiLCJzdGFydER5UiIsInN0YXJ0Q0xlcnAiLCJzdGFydER5QyIsImFjY3VtIiwiZHlSSW5kZXgiLCJkeVJPZmZzZXQiLCJkeUNJbmRleCIsImR5Q09mZnNldCIsIm91dExvYyIsImluTG9jIiwic2luRmFjdG9yIiwiY29zRmFjdG9yIiwiY29vcmRZIiwiYmFzZSIsInVwZGF0ZXNCdWYiLCJzY2F0dGVySW1wbCIsInN1bUR1cGVJbmRpY2VzIiwidXBkYXRlc0RhdGEiLCJjb25kaXRpb25SYW5rIiwidFZhbHVlcyIsImVWYWx1ZXMiLCJuZXdWYWx1ZXMiLCJzY2FsZUFscGhhIiwiaW5CdWYiLCJmcm9tU3RyaW5nQXJyYXlUb1VpbnQ4IiwibG9naXRzUmFuayIsIm1heExvZ2l0UmVzaGFwZWQiLCJzdW1SZXNoYXBlZCIsInRvb0xhcmdlIiwidG9vU21hbGwiLCJleHBYIiwicmVzaGFwZUlucHV0cyIsInJlc2hhcGVBdHRycyIsInBhZGRlZFhSZXNoYXBlZCIsInRyYW5zcG9zZUlucHV0cyIsInRyYW5zcG9zZUF0dHJzIiwicmVzdWx0UmVzaGFwZUlucHV0cyIsInJlc3VsdFJlc2hhcGVBdHRycyIsImluZGljZXNEVHlwZSIsInZhbHVlc0RUeXBlIiwiaW5kaWNlc0NvdW50IiwiZGVuc2VSb3dzIiwicm93c0FyZU9yZGVyZWQiLCJsYXN0SW5kaWNlc1JvdyIsImNzck9mZnNldCIsImFsbFJvd3NGdWxsIiwicm93RW1wdHkiLCJmdWxsSW5kaWNlc0NvdW50IiwiZmlsbGVkQ291bnQiLCJvdXRwdXRJIiwic3RhcnRpbmdJbmRleCIsImlucHV0SW5kaWNlc1NoYXBlIiwiaW5wdXREVHlwZSIsImRlbnNlU2l6ZSIsIm5ueiIsIm91dHB1dFJhbmsiLCJ1bmtub3duSW5kZXgiLCJtaXNzaW5nIiwiaW5wdXRTdHJpZGVzIiwib3V0cHV0U3RyaWRlcyIsImlzTWVhbiIsImlucHV0RmxhdCIsIm51bUNvbCIsIm91dHB1dFJvd3MiLCJvdXRwdXRMZW5ndGgiLCJ1bmluaXRpYWxpemVkSW5kZXgiLCJuZXh0SW5kZXgiLCJzcXVhcmVkRGlmZmVyZW5jZUltcGwiLCJkaWZmIiwic3RlcEF0dHJzIiwibmV3TG9jIiwiU3RyaW5nTkdyYW1zT3AiLCJwcmVzZXJ2ZVNob3J0IiwiZ2V0UGFkV2lkdGgiLCJuR3JhbVdpZHRoIiwiZ2V0TnVtTkdyYW1zIiwiY3JlYXRlTkdyYW1zIiwic3BsaXRJbmRleCIsIm91dHB1dFN0YXJ0SW5kZXgiLCJudW1OR3JhbXMiLCJuR3JhbUluZGV4IiwibGVmdFBhZGRpbmciLCJyaWdodFBhZGRpbmciLCJudW1Ub2tlbnMiLCJkYXRhU3RhcnRJbmRleCIsIm5HcmFtU2l6ZSIsIm5HcmFtIiwibmV4dE5HcmFtSW5kZXgiLCJhcHBlbmRUb05HcmFtIiwic3RyIiwiY29tcHV0ZSIsInNwbGl0cyIsImlucHV0RGF0YVNpemUiLCJzcGxpdHNTaXplIiwicHJldlNwbGl0IiwidmFsaWRTcGxpdHMiLCJudW1CYXRjaEl0ZW1zIiwiZW1wdHkiLCJvdXRwdXRTdGFydElkeCIsImRhdGFMZW5ndGgiLCJkZWxpbWl0ZXJzIiwidG9rZW4iLCJ0b2tlblN0YXJ0IiwidG9rZW5zIiwibWF4TnVtRW50cmllcyIsInBhcnRzIiwibkVudHJpZXMiLCJmaW5nZXJQcmludDY0IiwibW9kdWxvIiwiZ2V0TG93Qml0c1Vuc2lnbmVkIiwic3ViQ29tcGxleEltcGwiLCJjb21wYXJlUGFpciIsInZhbHVlRGlmZiIsImFycmF5IiwicmlnaHQiLCJzZCIsInN3YXAiLCJ2YWxBbmRJbmQiLCJzb3J0IiwidG9wS1ZhbHMiLCJ0b3BLSW5kaWNlcyIsImJhdGNoU3RyaWRlIiwicm93U3RyaWRlIiwiY29sU3RyaWRlIiwidHJhbnNmb3JtVmFscyIsIm91dFkiLCJvdXRYIiwicHJvamVjdGlvbiIsIm1hcENvb3JkIiwibmVhcmVzdEludGVycG9sYXRpb24iLCJiaWxpbmVhckludGVycG9sYXRpb24iLCJvdXRDb29yZCIsImluQ29vcmQiLCJzejIiLCJjbGFtcCIsIm1hcENvb3JkUmVmbGVjdCIsInN6IiwibWFwQ29vcmRXcmFwIiwibWFwQ29vcmROZWFyZXN0IiwibWFwQ29vcmRDb25zdGFudCIsInJlYWRXaXRoRmlsbFZhbHVlIiwieUZsb29yIiwieEZsb29yIiwieUNlaWwiLCJ4Q2VpbCIsIm5ld1N0cmlkZXMiLCJ1bmlxdWVFbGVtZW50cyIsImlucHV0QnVmZmVyIiwidW5pcXVlSW5kaWNlcyIsImlzMURUZW5zb3IiLCJlbGVtZW50IiwiYXhpc1ZhbHVlcyIsInVuZGVmaW5lZCIsInVuaXF1ZUluZGV4Iiwib3V0cHV0VG1wU2hhcGUiLCJvdXRwdXRCdWZmZXIiLCJ1bmlxdWVFbGVtZW50SW5kZXgiLCJ2YWx1ZVJhbmsiLCJ0ZW1wUmVzIiwibnVtSXRlcnMiLCJleHBhbmRlZCIsInNjYWxhclZhbHVlIiwic2VnbWVudElkIiwibWFza0Nhc3RlZCIsIm11bCIsInN1bVRlbnNvckluZm8iLCJjdXJyZW50IiwiYWRkUmVzIiwiYWN0aXZhdGlvblJlcyIsImNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwiLCJhU3RyaWRlcyIsImJTdHJpZGVzIiwiYUJyb2FkY2FzdERpbXMiLCJiQnJvYWRjYXN0RGltcyIsImFMb2MiLCJhSW5kZXgiLCJiTG9jIiwiYkluZGV4Iiwic2ltcGxlSW1wbCIsImNvbXBsZXhJbXBsIiwiJGFDb21wbGV4IiwiJGFDb21wbGV4VmFscyIsImFSZWFsVmFscyIsImFJbWFnVmFscyIsIiRiQ29tcGxleCIsIiRiQ29tcGxleFZhbHMiLCJiUmVhbFZhbHMiLCJiSW1hZ1ZhbHMiLCJyZXN1bHRSZWFsRGF0YSIsInJlc3VsdEltYWdEYXRhIiwicmVzdWx0UmVhbCIsInJlc3VsdEltYWciLCJjcmVhdGVDb21wbGV4QmluYXJ5S2VybmVsSW1wbCIsInJlc3VsdFJlYWxWYWxzIiwicmVzdWx0SW1hZ1ZhbHMiLCJhSWR4IiwiYklkeCIsIm9wUmVzdWx0IiwiZmZ0QmF0Y2giLCJpbnB1dFZhbHMiLCJyZWFsMkQiLCJpbWFnMkQiLCJnZXRDb21wbGV4V2l0aEluZGV4IiwiJHJlYWxJbmZvIiwiJGltYWdJbmZvIiwiZmZ0UmFkaXgyIiwicmVhbEluZm8iLCJpbWFnSW5mbyIsInNpemVJbmZvIiwic2l6ZUluZm9Db3B5IiwiZGl2UmVhbEluZm8iLCJkaXZJbWFnSW5mbyIsImRpdlJlYWxWYWxzIiwiZGl2SW1hZ1ZhbHMiLCJyYXdPdXRwdXQiLCJyZXQiLCJleHBvbmVudCIsInRlcm0iLCJhc3NpZ25Ub1R5cGVkQXJyYXkiLCJmb3VyaWVyVHJhbnNmb3JtQnlNYXRtdWwiLCJzcGxpdFJlYWxBbmRJbWFnQXJyYXlzIiwiaGFsZiIsImV2ZW5Db21wbGV4IiwiY29tcGxleFdpdGhFdmVuSW5kZXgiLCJldmVuUmVhbFZhbHMiLCJldmVuSW1hZ1ZhbHMiLCJldmVuU2hhcGUiLCJldmVuUmVhbEluZm8iLCJldmVuSW1hZ0luZm8iLCJldmVuVGVuc29ySW5mbyIsIm9kZENvbXBsZXgiLCJjb21wbGV4V2l0aE9kZEluZGV4Iiwib2RkUmVhbFZhbHMiLCJvZGRJbWFnVmFscyIsIm9kZFNoYXBlIiwib2RkUmVhbEluZm8iLCJvZGRJbWFnSW5mbyIsIm9kZFRlbnNvckluZm8iLCIkZXZlbkNvbXBsZXgiLCIkZXZlblJlYWxWYWxzIiwiJGV2ZW5JbWFnVmFscyIsIiRldmVuU2hhcGUiLCIkZXZlblJlYWxJbmZvIiwiJGV2ZW5JbWFnSW5mbyIsIiRldmVuVGVuc29ySW5mbyIsIiRvZGRDb21wbGV4IiwiJG9kZFJlYWxWYWxzIiwiJG9kZEltYWdWYWxzIiwiJG9kZFNoYXBlIiwiJG9kZFJlYWxJbmZvIiwiJG9kZEltYWdJbmZvIiwiJG9kZFRlbnNvckluZm8iLCJleHBvbmVudHMiLCJlU2hhcGUiLCJlUmVhbEluZm8iLCJlSW1hZ0luZm8iLCJleHBvbmVudEluZm8iLCJhZGRQYXJ0Iiwic3ViUGFydCIsImFkZFBhcnRSZWFsIiwic3ViUGFydFJlYWwiLCJhZGRQYXJ0SW1hZyIsInN1YlBhcnRJbWFnIiwiJHJlYWwiLCIkaW1hZyIsIiRyZWFsVmFscyIsIiRpbWFnVmFscyIsImFwcGx5QWN0aXZhdGlvbiIsInBvb2wiLCJpbml0aWFsVmFsdWUiLCJQT1NJVElWRV9JTkZJTklUWSIsIm91dHB1dEJhdGNoU3RyaWRlcyIsIm91dHB1dFJvd1N0cmlkZXMiLCJvdXRwdXRDb2xTdHJpZGVzIiwib3V0cHV0QmF0Y2hPZmZzZXQiLCJpbnB1dEJhdGNoT2Zmc2V0IiwieFJNYXgiLCJvdXRwdXRSb3dPZmZzZXQiLCJ4Q01heCIsIm1pbk1heFZhbHVlIiwiYXZnVmFsdWUiLCJjb3VudCIsInhST2Zmc2V0IiwicGl4ZWwiLCJtYXhWYWx1ZSIsIm1heFBvc2l0aW9uIiwicG9vbDNkIiwib3V0cHV0RGVwdGhTdHJpZGVzIiwieURlcHRoIiwieERlcHRoQ29ybmVyIiwieERlcHRoTWluIiwieERlcHRoTWF4Iiwib3V0cHV0RGVwdGhPZmZzZXQiLCJ5Um93IiwieFJvd0Nvcm5lciIsInhSb3dNaW4iLCJ4Um93TWF4IiwieUNvbCIsInhDb2xDb3JuZXIiLCJ4Q29sTWluIiwieENvbE1heCIsIm91dHB1dENvbE9mZnNldCIsInhEZXB0aCIsInhEZXB0aE9mZnNldCIsInhSb3ciLCJ4Um93T2Zmc2V0IiwieENvbCIsImNyZWF0ZVNpbXBsZVVuYXJ5SW1wbCIsInVuYXJ5S2VybmVsRnVuY0Zyb21JbXBsIiwidW5hcnlJbXBsIiwiemVyb3MiLCJCYWNrZW5kV2FzbSIsIndhc20iLCJkYXRhSWROZXh0TnVtYmVyIiwidGZqcyIsImluaXQiLCJkYXRhSWRNYXAiLCJzdHJpbmdCeXRlcyIsIm1lbW9yeU9mZnNldCIsIm51bUJ5dGVzIiwiX21hbGxvYyIsInJlZ2lzdGVyVGVuc29yIiwiSEVBUFU4IiwiYnl0ZU9mZnNldCIsInR5cGVkQXJyYXlGcm9tQnVmZmVyIiwiX2ZyZWUiLCJnZXRNZW1vcnlPZmZzZXQiLCJQVGhyZWFkIiwidGVybWluYXRlQWxsVGhyZWFkcyIsInR5cGVkQXJyYXlGcm9tSGVhcCIsImdldFBhdGhUb1dhc21CaW5hcnkiLCJzaW1kU3VwcG9ydGVkIiwidGhyZWFkc1N1cHBvcnRlZCIsIndhc21Nb2R1bGVGb2xkZXIiLCJ3YXNtUGF0aCIsIndhc21GaWxlTWFwIiwiYXN5bmMiLCJnZXRBc3luYyIsInJlamVjdCIsImZhY3RvcnlDb25maWciLCJsb2NhdGVGaWxlIiwicHJlZml4IiwiZW5kc1dpdGgiLCJyZXNwb25zZSIsImJsb2IiLCJCbG9iIiwiVVJMIiwiY3JlYXRlT2JqZWN0VVJMIiwid2FzbVBhdGhQcmVmaXgiLCJjdXN0b21GZXRjaCIsImluc3RhbnRpYXRlV2FzbSIsImltcG9ydHMiLCJjYWxsYmFjayIsImZldGNoIiwiY3JlZGVudGlhbHMiLCJ0aGVuIiwiZW52IiwiYXJyYXlCdWZmZXIiLCJXZWJBc3NlbWJseSIsImluc3RhbnRpYXRlIiwiaW5zdGFuY2UiLCJpbml0aWFsaXplZCIsIm9uQWJvcnQiLCJpbml0QWJvcnRlZCIsIm1lc3NhZ2UiLCJtYWluU2NyaXB0VXJsT3JCbG9iIiwiY3dyYXAiLCJ3YXNtQmluYXJ5TmFtZXMiLCJzZXRXYXNtUGF0aCIsInVzZVBsYXRmb3JtRmV0Y2giLCJzZXRXYXNtUGF0aHMiLCJwcmVmaXhPckZpbGVNYXAiLCJtaXNzaW5nUGF0aHMiLCJyZXNldFdhc21QYXRoIiwidmFsaWRhdGUiLCJNZXNzYWdlQ2hhbm5lbCIsInBvcnQxIiwicG9zdE1lc3NhZ2UiLCJTaGFyZWRBcnJheUJ1ZmZlciIsIndhc21GdW5jIiwic2V0dXBGdW5jIiwiaW5wdXRJZHMiLCJpbnB1dElkc0J5dGVzIiwid2FzbUFsbCIsImlucHV0SWQiLCJ0cmFuc3Bvc2VkIiwib3JpZ2luYWxBeGVzIiwiaW5wdXRXYXNUcmFuc3Bvc2VkIiwid2FzbUFueSIsInhJZCIsInRyYW5zcG9zZWRJZCIsImlubmVyU2l6ZSIsIndhc21BdmdQb29sIiwicGFkUmlnaHQiLCJwYWRCb3R0b20iLCJ3YXNtQmF0Y2hNYXRNdWwiLCJhM2RJZCIsImIzZElkIiwiYVNoYXBlQnl0ZXMiLCJiU2hhcGVCeXRlcyIsImluVmFscyIsIndhc21DbGlwIiwic3VtSW5uZXJEaW1zIiwiaW5PZmZzZXQiLCJ3YXNtQ29udjJkIiwiZmlsdGVySWQiLCJpbnB1dENoYW5uZWxzIiwib3V0cHV0Q2hhbm5lbHMiLCJpc1NhbWVQYWQiLCJ3YXNtQ29udjJEQmFja3Byb3BJbnB1dCIsImR4U3RyaWRlcyIsImR5SWQiLCJJbnRlcnBvbGF0aW9uTWV0aG9kIiwid2FzbUNyb3BBbmRSZXNpemUiLCJjYXN0ZWREYXRhIiwiaW1hZ2VzRGF0YSIsImltYWdlc0lkIiwiYm94ZXNJZCIsImJveEluZElkIiwiaW1hZ2VzU2hhcGVCeXRlcyIsIndhc21DdW1zdW0iLCJwZXJtdXRlZE91dCIsInBlcm11dGVkWElkIiwicGVybXV0ZWRPdXRJZCIsInVuZG9QZXJtdXRhdGlvbiIsIndhc21EZXB0aFRvU3BhY2UiLCJ4U3RyaWRlc0J5dGVzIiwib3V0cHV0U2hhcGVCeXRlcyIsIm91dFN0cmlkZXNCeXRlcyIsIndhc21EZXB0aHdpc2VDb252MmQiLCJ3YXNtRmxpcExlZnRSaWdodCIsImZsaXBMZWZ0UmlnaHQiLCJpbWFnZUlkIiwid2FzbUJhdGNoTm9ybSIsImZ1c2VkQmF0Y2hOb3JtQ29uZmlnIiwibWVhbklkIiwidmFyaWFuY2VJZCIsIm9mZnNldElkIiwic2NhbGVJZCIsIndhc21GdXNlZENvbnYyZCIsImJpYXNJZCIsImJpYXNEYXRhIiwicHJlbHVBY3RpdmF0aW9uV2VpZ2h0c0lkIiwid2FzbUZ1c2VkRGVwdGh3aXNlQ29udjJkIiwid2FzbUdhdGhlck5kIiwiaW5kaWNlc0lkIiwic3RyaWRlc0J5dGVzIiwid2FzbUdhdGhlciIsInN0cmlkZXNTaXplIiwid2FzbU1heCIsIndhc21NYXhQb29sIiwid2FzbU1lYW4iLCJjYXN0ZWRJbnB1dCIsIndhc21NaW4iLCJNaXJyb3JQYWRkaW5nTW9kZSIsIndhc21NaXJyb3JQYWQiLCJ4U2hhcGVCeXRlcyIsInByZVBhZGRpbmdzRmxhdCIsInBhZFR1cGxlIiwicG9zdFBhZGRpbmdzRmxhdCIsInByZVBhZGRpbmdzQnl0ZXMiLCJwb3N0UGFkZGluZ3NCeXRlcyIsInNjb3Jlc0lkIiwicmVzT2Zmc2V0IiwicFNlbGVjdGVkSW5kaWNlcyIsInNlbGVjdGVkU2l6ZSIsInBTZWxlY3RlZFNjb3JlcyIsInBWYWxpZE91dHB1dHMiLCJwYXJzZVJlc3VsdFN0cnVjdCIsIndhc21PbmVIb3QiLCJ3YXNtUGFkVjIiLCJ3YXNtUHJlbHUiLCJ3ZWlnaHRzSWQiLCJ3YXNtUHJvZCIsIndhc21SZXNpemVCaWxpbmVhciIsIndhc21SZXZlcnNlIiwiYXhlc0J5dGVzIiwib3V0U2hhcGVCeXRlcyIsIndhc21Sb3RhdGUiLCJyb3RhdGVXaXRoT2Zmc2V0IiwiZmlsbEJ5dGVzIiwid2FzbVNjYXR0ZXJOZCIsInVwZGF0ZXNJZCIsIndhc21TZWxlY3QiLCJjb25kaXRpb25JZCIsInRJZCIsImVJZCIsInRSYW5rIiwiYmVnaW5fIiwic2l6ZV8iLCJ4U3RyaWRlIiwiYmVnaW5JIiwiYmVnaW5KIiwiZW5kSSIsInhPZmZzZXQiLCJzbGljZTJkIiwieFN0cmlkZTEiLCJ4U3RyaWRlMiIsImJlZ2luSyIsImVuZEoiLCJzbGljZTNkIiwieFN0cmlkZTMiLCJlbmRLIiwiYmVnaW5MIiwic2xpY2U0ZCIsInhTbGljZVNpemUiLCJ3YXNtU3RlcCIsIndhc21TdHJpZGVkU2xpY2UiLCJlbGxpcHNpc0F4ZXMiLCJzbGljZV91dGlsIiwibWFza1RvQXhlcyIsIm51bUludGVycG9sYXRlZEF4ZXMiLCJleHBhbmRBeGVzIiwibm9ybWFsaXplZEJlZ2luIiwibm9ybWFsaXplZEVuZCIsIm5vcm1hbGl6ZWRTdHJpZGVzIiwiZ2V0Tm9ybWFsaXplZEF4ZXMiLCJzaHJpbmtBeGVzIiwieFNsaWNlZCIsImJlZ2luQnl0ZXMiLCJlbmRCeXRlcyIsIndhc21TdW0iLCJ3YXNtVGlsZSIsIm5ld1NoYXBlQnl0ZXMiLCJ3YXNtVG9wSyIsInRvcGsiLCJvdXRWYWx1ZXNJZCIsIm91dEluZGljZXMiLCJvdXRJbmRpY2VzSWQiLCJ3YXNtVHJhbnNmb3JtIiwidHJhbnNmb3Jtc0lkIiwid2FzbVRyYW5zcG9zZSIsInJlZHVjZWRTaGFwZSIsIm5ld1Blcm0iLCJtaW5WYWxJZHgiLCJyZW1vdmVPbmVTaXplRGltcyIsInBlcm1Jc05vT3AiLCJjbG9uZWQiLCJwZXJtQnl0ZXMiLCJudW1PdXRwdXRzIiwib3V0cyIsIndhc21GdXNlZE1hdE11bCIsImZ1c2VkTWF0TXVsQ29uZmlnIiwiYUlkIiwiYklkIiwiY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnIiwic3VwcG9ydHNGdWxsQnJvYWRjYXN0Iiwib3V0cHV0VHlwZSIsImxvb3BzT3ZlckFsbE9mQSIsImxvb3BzT3ZlckFsbE9mQiIsInBlcm11dGVBeGVzQW5kVHJhbnNwb3NlIiwiQ3BwRFR5cGUiLCJGdXNhYmxlQWN0aXZhdGlvbiIsImNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnIiwiX3NjcmlwdERpciIsIldhc21CYWNrZW5kTW9kdWxlVGhyZWFkZWRTaW1kIiwiY3VycmVudFNjcmlwdCIsIl9fZmlsZW5hbWUiLCJHUk9XQUJMRV9IRUFQX0k4Iiwid2FzbU1lbW9yeSIsInVwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzIiwiSEVBUDgiLCJHUk9XQUJMRV9IRUFQX1U4IiwiR1JPV0FCTEVfSEVBUF9JMzIiLCJIRUFQMzIiLCJHUk9XQUJMRV9IRUFQX1UzMiIsIkhFQVBVMzIiLCJHUk9XQUJMRV9IRUFQX0Y2NCIsIkhFQVBGNjQiLCJyZWFkeVByb21pc2VSZXNvbHZlIiwicmVhZHlQcm9taXNlUmVqZWN0IiwiTW9kdWxlIiwibW9kdWxlT3ZlcnJpZGVzIiwiYXJndW1lbnRzXyIsInF1aXRfIiwidG9UaHJvdyIsIkVOVklST05NRU5UX0lTX1dFQiIsIkVOVklST05NRU5UX0lTX1dPUktFUiIsIkVOVklST05NRU5UX0lTX05PREUiLCJFTlZJUk9OTUVOVF9JU19TSEVMTCIsImltcG9ydFNjcmlwdHMiLCJwcm9jZXNzIiwidmVyc2lvbnMiLCJub2RlIiwiRU5WSVJPTk1FTlRfSVNfUFRIUkVBRCIsInJlYWRfIiwicmVhZEFzeW5jIiwicmVhZEJpbmFyeSIsIm5vZGVGUyIsIm5vZGVQYXRoIiwic2NyaXB0RGlyZWN0b3J5Iiwibm9kZVdvcmtlclRocmVhZHMiLCJkaXJuYW1lIiwiX19kaXJuYW1lIiwiZmlsZW5hbWUiLCJyZXBsYWNlIiwiZXgiLCJFeGl0U3RhdHVzIiwiYWJvcnQiLCJXb3JrZXIiLCJyZWFkYnVmZmVyIiwic2NyaXB0QXJncyIsImFyZ3VtZW50cyIsInF1aXQiLCJwcmludCIsInByaW50RXJyIiwic2VsZiIsImxvY2F0aW9uIiwiaHJlZiIsInN1YnN0ciIsImxhc3RJbmRleE9mIiwidXJsIiwieGhyIiwiWE1MSHR0cFJlcXVlc3QiLCJvcGVuIiwic2VuZCIsInJlc3BvbnNlVGV4dCIsInJlc3BvbnNlVHlwZSIsIm9ubG9hZCIsIm9uZXJyb3IiLCJwZXJmb3JtYW5jZSIsIndhc21CaW5hcnkiLCJlcnIiLCJBdG9taWNzIiwibG9hZCIsInN0b3JlIiwiY29tcGFyZUV4Y2hhbmdlIiwid2FzbU1vZHVsZSIsIm5vRXhpdFJ1bnRpbWUiLCJBQk9SVCIsInRleHQiLCJnZXRDRnVuYyIsImlkZW50IiwiY2NhbGwiLCJyZXR1cm5UeXBlIiwiYXJnVHlwZXMiLCJvcHRzIiwidG9DIiwic3RyaW5nVG9VVEY4Iiwic3RhY2tBbGxvYyIsIndyaXRlQXJyYXlUb01lbW9yeSIsImNBcmdzIiwic3RhY2siLCJjb252ZXJ0ZXIiLCJzdGFja1NhdmUiLCJhcHBseSIsIlVURjhUb1N0cmluZyIsIkJvb2xlYW4iLCJjb252ZXJ0UmV0dXJuVmFsdWUiLCJzdGFja1Jlc3RvcmUiLCJudW1lcmljQXJncyIsIlVURjhBcnJheVRvU3RyaW5nIiwiaGVhcCIsIm1heEJ5dGVzVG9SZWFkIiwiZW5kSWR4IiwidTAiLCJ1MSIsInUyIiwiU3RyaW5nIiwiZnJvbUNoYXJDb2RlIiwiY2giLCJwdHIiLCJzdHJpbmdUb1VURjhBcnJheSIsIm1heEJ5dGVzVG9Xcml0ZSIsInN0YXJ0SWR4IiwidSIsImNoYXJDb2RlQXQiLCJvdXRQdHIiLCJsZW5ndGhCeXRlc1VURjgiLCJhbGlnblVwIiwibXVsdGlwbGUiLCJJbnQ4QXJyYXkiLCJJbnQxNkFycmF5IiwiVWludDMyQXJyYXkiLCJGbG9hdDY0QXJyYXkiLCJ3YXNtVGFibGUiLCJJTklUSUFMX01FTU9SWSIsIk1lbW9yeSIsImJ5dGVMZW5ndGgiLCJfX0FUUFJFUlVOX18iLCJfX0FUSU5JVF9fIiwiX19BVE1BSU5fXyIsIl9fQVRFWElUX18iLCJfX0FUUE9TVFJVTl9fIiwicHJlUnVuIiwiYWRkT25QcmVSdW4iLCJjYWxsUnVudGltZUNhbGxiYWNrcyIsImluaXRSdW50aW1lIiwicHJlTWFpbiIsImV4aXRSdW50aW1lIiwicG9zdFJ1biIsImFkZE9uUG9zdFJ1biIsImNiIiwidW5zaGlmdCIsIl9fX3dhc21fY2FsbF9jdG9ycyIsInJ1bkRlcGVuZGVuY2llcyIsInJ1bkRlcGVuZGVuY3lXYXRjaGVyIiwiZGVwZW5kZW5jaWVzRnVsZmlsbGVkIiwiYWRkUnVuRGVwZW5kZW5jeSIsInJlbW92ZVJ1bkRlcGVuZGVuY3kiLCJjbGVhckludGVydmFsIiwid2hhdCIsIlJ1bnRpbWVFcnJvciIsImhhc1ByZWZpeCIsInN0YXJ0c1dpdGgiLCJkYXRhVVJJUHJlZml4IiwiaXNEYXRhVVJJIiwiZmlsZVVSSVByZWZpeCIsImlzRmlsZVVSSSIsIndhc21CaW5hcnlGaWxlIiwiZmlsZSIsImdldEJpbmFyeVByb21pc2UiLCJjYXRjaCIsImNyZWF0ZVdhc20iLCJhc21MaWJyYXJ5QXJnIiwicmVjZWl2ZUluc3RhbmNlIiwibnVtV29ya2Vyc1RvTG9hZCIsInVudXNlZFdvcmtlcnMiLCJsb2FkV2FzbU1vZHVsZVRvV29ya2VyIiwicmVjZWl2ZUluc3RhbnRpYXRlZFNvdXJjZSIsImluc3RhbnRpYXRlQXJyYXlCdWZmZXIiLCJyZWNlaXZlciIsInJlYXNvbiIsImluc3RhbnRpYXRlU3RyZWFtaW5nIiwiQVNNX0NPTlNUUyIsIiQwIiwiJDEiLCJzZXRUaW1lb3V0IiwiX19lbXNjcmlwdGVuX2RvX2Rpc3BhdGNoX3RvX3RocmVhZCIsImluaXRQdGhyZWFkc0pTIiwiY2FsbGJhY2tzIiwiYXJnIiwiX2Vtc2NyaXB0ZW5fZnV0ZXhfd2FrZSIsImFkZHIiLCJtYWluVGhyZWFkV2FpdEFkZHJlc3MiLCJfX2Vtc2NyaXB0ZW5fbWFpbl90aHJlYWRfZnV0ZXgiLCJtYWluVGhyZWFkV29rZW4iLCJub3RpZnkiLCJraWxsVGhyZWFkIiwicHRocmVhZF9wdHIiLCJwdGhyZWFkIiwicHRocmVhZHMiLCJ3b3JrZXIiLCJ0ZXJtaW5hdGUiLCJmcmVlVGhyZWFkRGF0YSIsInJ1bm5pbmdXb3JrZXJzIiwiY2FuY2VsVGhyZWFkIiwiY2xlYW51cFRocmVhZCIsInJldHVybldvcmtlclRvUG9vbCIsIl9lbXNjcmlwdGVuX2dldF9ub3ciLCJpbml0TWFpblRocmVhZEJsb2NrIiwicHRocmVhZFBvb2xTaXplIiwibmF2aWdhdG9yIiwiaGFyZHdhcmVDb25jdXJyZW5jeSIsImFsbG9jYXRlVW51c2VkV29ya2VyIiwidGIiLCJoZWFkUHRyIiwidGxzTWVtb3J5IiwiX19lbXNjcmlwdGVuX3RocmVhZF9pbml0IiwiX2Vtc2NyaXB0ZW5fcmVnaXN0ZXJfbWFpbl9icm93c2VyX3RocmVhZF9pZCIsImluaXRXb3JrZXIiLCJ0aHJlYWRFeGl0SGFuZGxlcnMiLCJzZXRUaHJlYWRTdGF0dXMiLCJydW5FeGl0SGFuZGxlcnMiLCJwb3AiLCJfcHRocmVhZF9zZWxmIiwiX19fcHRocmVhZF90c2RfcnVuX2R0b3JzIiwicnVuRXhpdEhhbmRsZXJzQW5kRGVpbml0VGhyZWFkIiwiZXhpdENvZGUiLCJ0aHJlYWRFeGl0IiwidGhyZWFkQ2FuY2VsIiwidGhyZWFkSW5mb1N0cnVjdCIsImFsbG9jYXRlZE93blN0YWNrIiwic3RhY2tCYXNlIiwicnVuV2l0aG91dE1haW5UaHJlYWRRdWV1ZWRDYWxscyIsIl9fZW1zY3JpcHRlbl9hbGxvd19tYWluX3J1bnRpbWVfcXVldWVkX2NhbGxzIiwicmVjZWl2ZU9iamVjdFRyYW5zZmVyIiwib25GaW5pc2hlZExvYWRpbmciLCJvbm1lc3NhZ2UiLCJjbWQiLCJjdXJyZW50UHJveGllZE9wZXJhdGlvbkNhbGxlclRocmVhZCIsInRocmVhZCIsInRhcmdldFRocmVhZCIsIl9lbXNjcmlwdGVuX21haW5fdGhyZWFkX3Byb2Nlc3NfcXVldWVkX2NhbGxzIiwic3Bhd25UaHJlYWQiLCJsb2FkZWQiLCJydW5QdGhyZWFkIiwiYWxlcnQiLCJleGl0IiwidGFyZ2V0IiwibGluZW5vIiwib24iLCJwdGhyZWFkTWFpbkpzIiwiZ2V0TmV3V29ya2VyIiwiYnVzeVNwaW5XYWl0IiwibXNlY3MiLCJlc3RhYmxpc2hTdGFja1NwYWNlIiwic3RhY2tUb3AiLCJzdGFja01heCIsIl9lbXNjcmlwdGVuX3N0YWNrX3NldF9saW1pdHMiLCJnZXROb0V4aXRSdW50aW1lIiwiaW52b2tlRW50cnlQb2ludCIsIl9fX2Fzc2VydF9mYWlsIiwiX19fY2FsbF9tYWluIiwiYXJnYyIsImFyZ3YiLCJfbWFpbiIsInNldEVyck5vIiwiX19fZXJybm9fbG9jYXRpb24iLCJfYXRleGl0IiwiX2Vtc2NyaXB0ZW5fcHJveHlfdG9fbWFpbl90aHJlYWRfanMiLCJfX2Vtc2NyaXB0ZW5fbm90aWZ5X3RocmVhZF9xdWV1ZSIsInRhcmdldFRocmVhZElkIiwibWFpblRocmVhZElkIiwiX2Fib3J0IiwiX2Vtc2NyaXB0ZW5fYXNtX2NvbnN0X2ludCIsImNvZGUiLCJzaWdQdHIiLCJhcmdidWYiLCJyZWFkQXNtQ29uc3RBcmdzIiwiX2Vtc2NyaXB0ZW5fY29uZGl0aW9uYWxfc2V0X2N1cnJlbnRfdGhyZWFkX3N0YXR1cyIsImV4cGVjdGVkU3RhdHVzIiwibmV3U3RhdHVzIiwiX2Vtc2NyaXB0ZW5fZnV0ZXhfd2FpdCIsInRpbWVvdXQiLCJ0Tm93IiwidEVuZCIsImV4Y2hhbmdlIiwid2FpdCIsIl9lbXNjcmlwdGVuX21lbWNweV9iaWciLCJkZXN0IiwiY29weVdpdGhpbiIsIl9lbXNjcmlwdGVuX251bV9sb2dpY2FsX2NvcmVzIiwiY3B1cyIsIm51bUNhbGxBcmdzIiwic2VyaWFsaXplZE51bUNhbGxBcmdzIiwiX2Vtc2NyaXB0ZW5fcnVuX2luX21haW5fcnVudGltZV90aHJlYWRfanMiLCJkYXRlTm93IiwiX2Vtc2NyaXB0ZW5fcmVjZWl2ZV9vbl9tYWluX3RocmVhZF9qc19jYWxsQXJncyIsInJlYWRBc21Db25zdEFyZ3NBcnJheSIsImRvdWJsZSIsIl9lbXNjcmlwdGVuX3JlY2VpdmVfb25fbWFpbl90aHJlYWRfanMiLCJwcm94aWVkRnVuY3Rpb25UYWJsZSIsIl9lbXNjcmlwdGVuX2dldF9oZWFwX3NpemUiLCJlbXNjcmlwdGVuX3JlYWxsb2NfYnVmZmVyIiwiZ3JvdyIsIl9lbXNjcmlwdGVuX3Jlc2l6ZV9oZWFwIiwicmVxdWVzdGVkU2l6ZSIsIm9sZFNpemUiLCJtYXhIZWFwU2l6ZSIsImN1dERvd24iLCJvdmVyR3Jvd25IZWFwU2l6ZSIsIkpTRXZlbnRzIiwiaW5FdmVudEhhbmRsZXIiLCJyZW1vdmVBbGxFdmVudExpc3RlbmVycyIsImV2ZW50SGFuZGxlcnMiLCJfcmVtb3ZlSGFuZGxlciIsImRlZmVycmVkQ2FsbHMiLCJyZWdpc3RlclJlbW92ZUV2ZW50TGlzdGVuZXJzIiwicmVtb3ZlRXZlbnRMaXN0ZW5lcnNSZWdpc3RlcmVkIiwiZGVmZXJDYWxsIiwidGFyZ2V0RnVuY3Rpb24iLCJwcmVjZWRlbmNlIiwiYXJnc0xpc3QiLCJhcnJheXNIYXZlRXF1YWxDb250ZW50IiwiYXJyQSIsImFyckIiLCJyZW1vdmVEZWZlcnJlZENhbGxzIiwiY2FuUGVyZm9ybUV2ZW50SGFuZGxlclJlcXVlc3RzIiwiY3VycmVudEV2ZW50SGFuZGxlciIsImFsbG93c0RlZmVycmVkQ2FsbHMiLCJydW5EZWZlcnJlZENhbGxzIiwicmVtb3ZlQWxsSGFuZGxlcnNPblRhcmdldCIsImV2ZW50VHlwZVN0cmluZyIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJldmVudExpc3RlbmVyRnVuYyIsInVzZUNhcHR1cmUiLCJyZWdpc3Rlck9yUmVtb3ZlSGFuZGxlciIsImV2ZW50SGFuZGxlciIsImpzRXZlbnRIYW5kbGVyIiwiaGFuZGxlckZ1bmMiLCJjYWxsYmFja2Z1bmMiLCJxdWV1ZUV2ZW50SGFuZGxlck9uVGhyZWFkX2lpaWkiLCJldmVudEhhbmRsZXJGdW5jIiwiZXZlbnRUeXBlSWQiLCJldmVudERhdGEiLCJ1c2VyRGF0YSIsInZhcmFyZ3MiLCJfX2Vtc2NyaXB0ZW5fY2FsbF9vbl90aHJlYWQiLCJnZXRUYXJnZXRUaHJlYWRGb3JFdmVudENhbGxiYWNrIiwiZ2V0Tm9kZU5hbWVGb3JUYXJnZXQiLCJub2RlTmFtZSIsImZ1bGxzY3JlZW5FbmFibGVkIiwid2Via2l0RnVsbHNjcmVlbkVuYWJsZWQiLCJzdHJpbmdUb05ld1VURjgiLCJqc1N0cmluZyIsImNTdHJpbmciLCJfZW1zY3JpcHRlbl9zZXRfb2Zmc2NyZWVuY2FudmFzX3NpemVfb25fdGFyZ2V0X3RocmVhZF9qcyIsInRhcmdldENhbnZhcyIsInRhcmdldENhbnZhc1B0ciIsIl9lbXNjcmlwdGVuX3NldF9vZmZzY3JlZW5jYW52YXNfc2l6ZV9vbl90YXJnZXRfdGhyZWFkIiwibWF5YmVDU3RyaW5nVG9Kc1N0cmluZyIsInNwZWNpYWxIVE1MVGFyZ2V0cyIsImZpbmRFdmVudFRhcmdldCIsInF1ZXJ5U2VsZWN0b3IiLCJmaW5kQ2FudmFzRXZlbnRUYXJnZXQiLCJfZW1zY3JpcHRlbl9zZXRfY2FudmFzX2VsZW1lbnRfc2l6ZV9jYWxsaW5nX3RocmVhZCIsImNhbnZhc1NoYXJlZFB0ciIsIm9mZnNjcmVlbkNhbnZhcyIsImNvbnRyb2xUcmFuc2ZlcnJlZE9mZnNjcmVlbiIsImF1dG9SZXNpemVWaWV3cG9ydCIsIkdMY3R4T2JqZWN0IiwiR0xjdHgiLCJwcmV2Vmlld3BvcnQiLCJfZW1zY3JpcHRlbl9zZXRfY2FudmFzX2VsZW1lbnRfc2l6ZV9tYWluX3RocmVhZCIsIl9lbXNjcmlwdGVuX3NldF9jYW52YXNfZWxlbWVudF9zaXplIiwiX2Vtc2NyaXB0ZW5fc2V0X2N1cnJlbnRfdGhyZWFkX3N0YXR1cyIsIl9lbXNjcmlwdGVuX3NldF90aHJlYWRfbmFtZSIsInRocmVhZElkIiwiX193ZWJnbF9lbmFibGVfQU5HTEVfaW5zdGFuY2VkX2FycmF5cyIsImN0eCIsImZpcnN0IiwicHJpbWNvdW50IiwiX193ZWJnbF9lbmFibGVfT0VTX3ZlcnRleF9hcnJheV9vYmplY3QiLCJ2YW8iLCJfX3dlYmdsX2VuYWJsZV9XRUJHTF9kcmF3X2J1ZmZlcnMiLCJidWZzIiwiX193ZWJnbF9lbmFibGVfV0VCR0xfbXVsdGlfZHJhdyIsIm11bHRpRHJhd1dlYmdsIiwiR0wiLCJjb3VudGVyIiwiYnVmZmVycyIsInByb2dyYW1zIiwiZnJhbWVidWZmZXJzIiwicmVuZGVyYnVmZmVycyIsInRleHR1cmVzIiwidW5pZm9ybXMiLCJzaGFkZXJzIiwidmFvcyIsIm9mZnNjcmVlbkNhbnZhc2VzIiwidGltZXJRdWVyaWVzRVhUIiwicHJvZ3JhbUluZm9zIiwic3RyaW5nQ2FjaGUiLCJ1bnBhY2tBbGlnbm1lbnQiLCJyZWNvcmRFcnJvciIsImVycm9yQ29kZSIsImxhc3RFcnJvciIsImdldE5ld0lkIiwidGFibGUiLCJnZXRTb3VyY2UiLCJzaGFkZXIiLCJzdHJpbmciLCJjcmVhdGVDb250ZXh0Iiwid2ViR0xDb250ZXh0QXR0cmlidXRlcyIsInJlZ2lzdGVyQ29udGV4dCIsImhhbmRsZSIsImNvbnRleHQiLCJhdHRyaWJ1dGVzIiwibWFqb3JWZXJzaW9uIiwiZW5hYmxlRXh0ZW5zaW9uc0J5RGVmYXVsdCIsImluaXRFeHRlbnNpb25zIiwibWFrZUNvbnRleHRDdXJyZW50IiwiY29udGV4dEhhbmRsZSIsImN1cnJlbnRDb250ZXh0IiwiZGVsZXRlQ29udGV4dCIsImluaXRFeHRlbnNpb25zRG9uZSIsImRpc2pvaW50VGltZXJRdWVyeUV4dCIsImdldFN1cHBvcnRlZEV4dGVuc2lvbnMiLCJwb3B1bGF0ZVVuaWZvcm1UYWJsZSIsInB0YWJsZSIsIm1heFVuaWZvcm1MZW5ndGgiLCJtYXhBdHRyaWJ1dGVMZW5ndGgiLCJtYXhVbmlmb3JtQmxvY2tOYW1lTGVuZ3RoIiwidXRhYmxlIiwibnVtVW5pZm9ybXMiLCJnZXRBY3RpdmVVbmlmb3JtIiwiX19lbXNjcmlwdGVuX3dlYmdsX3Bvd2VyX3ByZWZlcmVuY2VzIiwiX2Vtc2NyaXB0ZW5fd2ViZ2xfZG9fY3JlYXRlX2NvbnRleHQiLCJwb3dlclByZWZlcmVuY2UiLCJjb250ZXh0QXR0cmlidXRlcyIsIm1pbm9yVmVyc2lvbiIsImV4cGxpY2l0U3dhcENvbnRyb2wiLCJwcm94eUNvbnRleHRUb01haW5UaHJlYWQiLCJyZW5kZXJWaWFPZmZzY3JlZW5CYWNrQnVmZmVyIiwiX2Vtc2NyaXB0ZW5fd2ViZ2xfY3JlYXRlX2NvbnRleHQiLCJhMCIsIlNZU0NBTExTIiwibWFwcGluZ3MiLCJwcmludENoYXIiLCJzdHJlYW0iLCJjdXJyIiwiZ2V0U3RyIiwiZ2V0NjQiLCJsb3ciLCJoaWdoIiwiX2ZkX2Nsb3NlIiwiZmQiLCJfZmRfc2VlayIsIm9mZnNldF9sb3ciLCJvZmZzZXRfaGlnaCIsIndoZW5jZSIsIm5ld09mZnNldCIsIl9mZF93cml0ZSIsImlvdiIsImlvdmNudCIsInBudW0iLCJfcHRocmVhZF9jbGVhbnVwX3BvcCIsImV4ZWN1dGUiLCJyb3V0aW5lIiwiX3B0aHJlYWRfY2xlYW51cF9wdXNoIiwidGhyZWFkUGFyYW1zIiwic3RhY2tIaWdoIiwic3RhY2tTaXplIiwidGlzIiwiZGV0YWNoZWQiLCJnbG9iYWxfbG9jYWxlIiwiX2Vtc2NyaXB0ZW5fZ2V0X2dsb2JhbF9saWJjIiwibXNnIiwic3RhcnRSb3V0aW5lIiwidHJhbnNmZXJMaXN0IiwiX3B0aHJlYWRfY3JlYXRlIiwiYXR0ciIsInN0YXJ0X3JvdXRpbmUiLCJfZW1zY3JpcHRlbl9zeW5jX3J1bl9pbl9tYWluX3RocmVhZF80IiwiX21lbWFsaWduIiwiX3N5c2NvbmYiLCJjYWxsZWRSdW4iLCJydW4iLCJkb1J1biIsImltcGxpY2l0IiwicnVuQ2FsbGVyIiwicmVhZHkiLCJ3YXNtV29ya2VyQ29udGVudHMiLCJXYXNtQmFja2VuZE1vZHVsZSIsIlVURjhEZWNvZGVyIiwiVGV4dERlY29kZXIiLCJlbmRQdHIiLCJEYXRhU3RvcmFnZSIsImRhdGFNb3ZlciIsImRhdGFJZHNDb3VudCIsIm1vdmVEYXRhIiwiS2VybmVsQmFja2VuZCIsIm5vdFlldEltcGxlbWVudGVkIiwic3RyaW5ncyIsIkFSUk9XIiwiQVJST1dfUkVHRVgiLCJudW1UZW5zb3JzIiwibnVtQXJyb3dzIiwiaW5wdXRTdHJpbmciLCJvdXRwdXRTdHJpbmciLCJpbnB1dFRlcm1zIiwibnVtSW5wdXRzIiwiZGltTmFtZSIsImlucHV0VGVybSIsIlNldCIsIm51bURpbXMiLCJuRGltcyIsImRpbVNpemVzIiwiY29tcHV0ZWRUZXJtSW5kaWNlcyIsInRlcm1JbmRpY2VzIiwiZmluZFRlcm1zV2l0aERpbSIsInRlcm1JbmRleCIsIm5vbk1heFN1cHByZXNzaW9uSW1wbF8iLCJyZXR1cm5TY29yZXNUZW5zb3IiLCJyZXR1cm5WYWxpZE91dHB1dHMiLCJjYW5kaWRhdGVzIiwic2NvcmUiLCJib3hJbmRleCIsInN1cHByZXNzQmVnaW5JbmRleCIsImFzY2VuZGluZ0NvbXBhcmF0b3IiLCJjYW5kaWRhdGUiLCJvcmlnaW5hbFNjb3JlIiwiaWdub3JlQ2FuZGlkYXRlIiwiaW91IiwiaW50ZXJzZWN0aW9uT3ZlclVuaW9uIiwic3VwcHJlc3NXZWlnaHQiLCJlbGVtc1RvUGFkIiwiaUNvb3JkIiwiakNvb3JkIiwieW1pbkkiLCJ4bWluSSIsInltYXhJIiwieG1heEkiLCJ5bWluSiIsInhtaW5KIiwieW1heEoiLCJ4bWF4SiIsImFyZWFJIiwiYXJlYUoiLCJpbnRlcnNlY3Rpb25ZbWluIiwiaW50ZXJzZWN0aW9uWG1pbiIsImludGVyc2VjdGlvblltYXgiLCJpbnRlcnNlY3Rpb25YbWF4IiwiaW50ZXJzZWN0aW9uQXJlYSIsIndlaWdodCIsImMxIiwiYzIiLCJiaW5hcnlJbnNlcnQiLCJjb21wYXJhdG9yIiwiYmluYXJ5U2VhcmNoIiwiaW5zZXJ0aW9uUG9pbnQiLCJtaWRkbGUiLCJmb3VuZCIsImNvbXBhcmVSZXN1bHQiLCJiaW5hcnlTZWFyY2hfIiwiZGVmYXVsdENvbXBhcmF0b3IiLCJjb25kU2hhcGUiLCJpbkJ1ZmZlciIsInRvVGVuc29yIiwib3BIYW5kbGVyIiwiY2xvbmUiLCJkZWxheUNhbGxiYWNrIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwic2V0SW1tZWRpYXRlIiwibmV4dEZyYW1lIiwibmF2IiwidXNlckFnZW50IiwidmVuZG9yIiwib3BlcmEiLCJ0ZXN0IiwiV29ya2VyR2xvYmFsU2NvcGUiLCJpc1JlZ2lzdGVyZWRLZXJuZWxJbnZvY2F0aW9uIiwia2VybmVsSW52b2NhdGlvbiIsIkVuZ2luZVN0YXRlIiwicmVnaXN0ZXJlZFZhcmlhYmxlcyIsIm5leHRUYXBlTm9kZUlkIiwibnVtU3RyaW5nVGVuc29ycyIsIm51bURhdGFCdWZmZXJzIiwiZ3JhZGllbnREZXB0aCIsImtlcm5lbERlcHRoIiwic2NvcGVTdGFjayIsIm51bURhdGFNb3Zlc1N0YWNrIiwibmV4dFNjb3BlSWQiLCJwcm9maWxpbmciLCJhY3RpdmVQcm9maWxlIiwibmV3Qnl0ZXMiLCJuZXdUZW5zb3JzIiwicGVha0J5dGVzIiwia2VybmVscyIsIkVuZ2luZSIsInJlZ2lzdHJ5IiwicmVnaXN0cnlGYWN0b3J5IiwicGVuZGluZ0JhY2tlbmRJbml0SWQiLCJzdGF0ZSIsInBlbmRpbmdCYWNrZW5kSW5pdCIsImJhY2tlbmRJbnN0YW5jZSIsInNvcnRlZEJhY2tlbmRzIiwiZ2V0U29ydGVkQmFja2VuZHMiLCJpbml0aWFsaXplQmFja2VuZCIsInN1Y2Nlc3MiLCJzZXRCYWNrZW5kIiwiYXN5bmNJbml0IiwiaW5pdGlhbGl6ZUJhY2tlbmRzQW5kUmV0dXJuQmVzdCIsImJhY2tlbmROYW1lcyIsImZpbmRCYWNrZW5kIiwiZmluZEJhY2tlbmRGYWN0b3J5IiwiZmFjdG9yeSIsInJlZ2lzdGVyQmFja2VuZCIsInByaW9yaXR5Iiwic2V0dXBSZWdpc3RlcmVkS2VybmVscyIsInByb2ZpbGVyIiwia2VybmVsIiwiZGlzcG9zZVJlZ2lzdGVyZWRLZXJuZWxzIiwiZGlzcG9zZUZ1bmMiLCJyZWdpc3RyeUZhY3RvcnlFbnRyeSIsInByb21pc2VJZCIsInJlbW92ZUJhY2tlbmQiLCJzcmNCYWNrZW5kIiwic2hvdWxkQ2hlY2tGb3JNZW1MZWFrcyIsInRpZHkiLCJuYW1lT3JGbiIsImZuIiwic2NvcGVkUnVuIiwic3RhcnRTY29wZSIsImVuZFNjb3BlIiwibmV4dFRlbnNvcklkIiwibmV4dFZhcmlhYmxlSWQiLCJFTkdJTkUiLCJydW5LZXJuZWwiLCJhZGRUYXBlTm9kZSIsImFjdGl2ZVNjb3BlIiwiZ3JhZElucHV0cyIsInJ1bktlcm5lbEZ1bmMiLCJjaGVja0tlcm5lbEZvck1lbUxlYWsiLCJudW1EYXRhSWRzQmVmb3JlIiwib3V0SW5mb3MiLCJudW1EYXRhSWRzQWZ0ZXIiLCJudW1PdXRwdXREYXRhSWRzIiwibnVtTW92ZXMiLCJkYXRhSWRzTGVha2VkIiwia2VybmVsUGFyYW1zIiwib3V0cHV0cyIsInNhdmVkIiwiaXNUYXBlT24iLCJzdGFydGluZ0J5dGVjb3VudCIsInN0YXJ0aW5nTnVtVGVuc29ycyIsImtlcm5lbE9yU2NvcGVOYW1lIiwib3V0VGVuc29ycyIsInRlbnNvcnNUb1NhdmUiLCJnZXRUZW5zb3JzRm9yR3JhZGllbnQiLCJzYXZlVGVuc29yc0ZvckJhY2t3YXJkTW9kZSIsImZvcndhcmRGdW5jIiwic2F2ZUZ1bmMiLCJrZWVwIiwiYmFja3dhcmRzRnVuYyIsImtlcm5lbFByb2ZpbGUiLCJwcm9maWxlS2VybmVsIiwibG9nS2VybmVsUHJvZmlsZSIsImJ5dGVzQWRkZWQiLCJ0b3RhbEJ5dGVzU25hcHNob3QiLCJ0ZW5zb3JzQWRkZWQiLCJ0b3RhbFRlbnNvcnNTbmFwc2hvdCIsImlucHV0U2hhcGVzIiwib3V0cHV0U2hhcGVzIiwiaXRlbSIsImtlcm5lbFRpbWVNcyIsInRpbWVNcyIsImV4dHJhSW5mbyIsImdyYWRDb25maWciLCJpbnB1dHNUb1NhdmUiLCJvdXRwdXRzVG9TYXZlIiwiaW5wdXRUZW5zb3JzVG9TYXZlIiwic2F2ZUFsbElucHV0cyIsImlucHV0TmFtZSIsIm91dHB1dFRlbnNvcnNUb1NhdmUiLCJtYWtlVGVuc29yIiwiYmFja2VuZFZhbHMiLCJ0cmFja1RlbnNvciIsImJ5dGVzIiwibWFrZVZhcmlhYmxlIiwidHJhaW5hYmxlIiwidHJhY2siLCJkaXNwb3NlVGVuc29yIiwiZGlzcG9zZVZhcmlhYmxlcyIsImRpc3Bvc2VWYXJpYWJsZSIsInN0YXJ0Qnl0ZXMiLCJzdGFydE51bVRlbnNvcnMiLCJncmFkaWVudHNGdW5jIiwidGFwZU5vZGUiLCJncmFkRnVuYyIsImdyYWRpZW50IiwiZHlzIiwiYWN0aXZlVGFwZSIsImtlcHQiLCJzdGFydFRhcGUiLCJlbmRUYXBlIiwic2NvcGVJbmZvIiwidGVuc29yc1RvVHJhY2tJblBhcmVudCIsInRlbnNvcnNUb1RyYWNrSW5QYXJlbnRTZXQiLCJvbGRTY29wZSIsInNjb3BlSWQiLCJ4cyIsImFsbG93Tm9HcmFkaWVudHMiLCJmaWx0ZXJlZFRhcGUiLCJhY2N1bXVsYXRlZEdyYWRpZW50TWFwIiwib25lcyIsImdyYWRzIiwiY3VzdG9tR3JhZCIsImlucHV0TWFwIiwic2F2ZSIsImdyYWRSZXMiLCJncmFkTWFwIiwiZ3JhZCIsInRpbWluZ0luZm8iLCJyZXNldCIsImdldE9yTWFrZUVuZ2luZSIsIl90ZmVuZ2luZSIsImVudmlyb25tZW50IiwiVEVOU09SRkxPV0pTX0ZMQUdTX1BSRUZJWCIsIkVudmlyb25tZW50IiwiZmxhZ3MiLCJmbGFnUmVnaXN0cnkiLCJ1cmxGbGFncyIsImdldFF1ZXJ5UGFyYW1zIiwicG9wdWxhdGVVUkxGbGFncyIsInNldFBsYXRmb3JtIiwicGxhdGZvcm1OYW1lIiwicGxhdGZvcm0iLCJmbGFnTmFtZSIsImV2YWx1YXRpb25GbiIsInNldEhvb2siLCJmbGFnVmFsdWUiLCJldmFsdWF0ZUZsYWciLCJnZXRGbGFncyIsInNldEZsYWdzIiwic2VhcmNoIiwidXJsUGFyYW1zIiwia2V5VmFsdWUiLCJ0b0xvd2VyQ2FzZSIsInBhcnNlVmFsdWUiLCJxdWVyeVN0cmluZyIsImRlY29kZVVSSUNvbXBvbmVudCIsImRlY29kZVBhcmFtIiwic2V0RW52aXJvbm1lbnRHbG9iYWwiLCJkZWJ1Z1ZhbHVlIiwiZ2xvYmFsTmFtZVNwYWNlIiwiZ2V0R2xvYmFsTmFtZXNwYWNlIiwiZ2V0R2xvYmFsIiwiZ2xvYmFsTWFwIiwiX3RmR2xvYmFscyIsIk1hcCIsImdldEdsb2JhbE1hcCIsInNpbmdsZXRvbiIsImVuYWJsZVByb2RNb2RlIiwiZW5hYmxlRGVidWdNb2RlIiwiZGlzYWJsZURlcHJlY2F0aW9uV2FybmluZ3MiLCJkZXByZWNhdGlvbldhcm4iLCJlbmdpbmUiLCJwcm9maWxlIiwiY29udGFpbmVyIiwiZ2V0QmFja2VuZCIsImNoZWNrR3JhZHMiLCIkYXJncyIsInZhbHVlQW5kR3JhZCIsInZhbHVlQW5kR3JhZHMiLCJ2YXJpYWJsZUdyYWRzIiwidmFyTGlzdCIsInNwZWNpZmllZFZhckxpc3QiLCJzcGVjaWZpZWROb25UcmFpbmFibGUiLCJvcmlnaW5hbFZhckNvdW50IiwiZyIsIm5hbWVkR3JhZHMiLCJMb25nIiwiaGV4VG9Mb25nIiwiaGV4IiwiZnJvbVN0cmluZyIsImsxIiwiazIiLCJzaGlmdE1peCIsInhvciIsInNocnUiLCJmcm9tQnl0ZXMiLCJmZXRjaDY0IiwiZmV0Y2gzMiIsInJvdGF0ZTY0Iiwib3IiLCJzaGwiLCJoYXNoTGVuMTYiLCJ3ZWFrSGFzaExlbjMyV2l0aFNlZWRzU3RyIiwid2Vha0hhc2hMZW4zMldpdGhTZWVkcyIsImZyb21OdW1iZXIiLCJoYXNoTGVuMHRvMTYiLCJoYXNoTGVuMTd0bzMyIiwiaGFzaExlbjMzdG82NCIsIlVaRVJPIiwibGFzdDY0IiwiYW5kIiwiZGVmZXIiLCJCcm93c2VyRG93bmxvYWRzIiwiZmlsZU5hbWVQcmVmaXgiLCJVUkxfU0NIRU1FIiwibW9kZWxKc29uRmlsZU5hbWUiLCJ3ZWlnaHREYXRhRmlsZU5hbWUiLCJtb2RlbEFydGlmYWN0cyIsIndlaWdodHNVUkwiLCJ3ZWlnaHREYXRhIiwibW9kZWxUb3BvbG9neSIsIkFycmF5QnVmZmVyIiwid2VpZ2h0c01hbmlmZXN0IiwicGF0aHMiLCJ3ZWlnaHRTcGVjcyIsIm1vZGVsSlNPTiIsIm1vZGVsSnNvblVSTCIsImpzb25BbmNob3IiLCJtb2RlbEpzb25BbmNob3IiLCJkb3dubG9hZCIsImRpc3BhdGNoRXZlbnQiLCJNb3VzZUV2ZW50Iiwid2VpZ2h0RGF0YUFuY2hvciIsIm1vZGVsQXJ0aWZhY3RzSW5mbyIsIkJyb3dzZXJGaWxlcyIsImZpbGVzIiwianNvbkZpbGUiLCJ3ZWlnaHRzRmlsZXMiLCJqc29uUmVhZGVyIiwiRmlsZVJlYWRlciIsIm1vZGVsQXJ0aWZhY3RzUHJvbWlzZSIsImxvYWRXZWlnaHRzIiwicmVhZEFzVGV4dCIsImVudHJ5IiwicGF0aFRvRmlsZSIsImNoZWNrTWFuaWZlc3RBbmRXZWlnaHRGaWxlcyIsInByb21pc2VzIiwibG9hZFdlaWdodHNGaWxlIiwid2VpZ2h0RmlsZVJlYWRlciIsInJlYWRBc0FycmF5QnVmZmVyIiwibWFuaWZlc3QiLCJiYXNlbmFtZXMiLCJmaWxlTmFtZXMiLCJncm91cCIsInBhdGhCYXNlbmFtZSIsImJyb3dzZXJEb3dubG9hZHNSb3V0ZXIiLCJicm93c2VyRG93bmxvYWRzIiwiYnJvd3NlckZpbGVzIiwicmVnaXN0ZXJTYXZlUm91dGVyIiwiSFRUUFJlcXVlc3QiLCJsb2FkT3B0aW9ucyIsIkRFRkFVTFRfTUVUSE9EIiwid2VpZ2h0UGF0aFByZWZpeCIsIm9uUHJvZ3Jlc3MiLCJ3ZWlnaHRVcmxDb252ZXJ0ZXIiLCJmZXRjaEZ1bmMiLCJyZXF1ZXN0SW5pdCIsIkZvcm1EYXRhIiwibW9kZWxUb3BvbG9neUFuZFdlaWdodE1hbmlmZXN0IiwiYXBwZW5kIiwib2siLCJyZXNwb25zZXMiLCJtb2RlbENvbmZpZ1JlcXVlc3QiLCJqc29uIiwid2VpZ2h0UGF0aCIsInN1ZmZpeCIsInBhcnNlVXJsIiwicGF0aFByZWZpeCIsImZldGNoVVJMcyIsInVybFByb21pc2VzIiwid2VpZ2h0c0dyb3VwIiwibGFzdFNsYXNoIiwibGFzdFNlYXJjaFBhcmFtIiwic3Vic3RyaW5nIiwiaXNIVFRQU2NoZW1lIiwibWF0Y2giLCJVUkxfU0NIRU1FX1JFR0VYIiwiaHR0cFJvdXRlciIsImlzSFRUUCIsInVybEl0ZW0iLCJodHRwIiwiYnJvd3NlckhUVFBSZXF1ZXN0IiwicmVnaXN0ZXJMb2FkUm91dGVyIiwiREFUQUJBU0VfTkFNRSIsIk1PREVMX1NUT1JFX05BTUUiLCJJTkZPX1NUT1JFX05BTUUiLCJkZWxldGVEYXRhYmFzZSIsImlkYkZhY3RvcnkiLCJnZXRJbmRleGVkREJGYWN0b3J5IiwiZGVsZXRlUmVxdWVzdCIsIm9uc3VjY2VzcyIsInRoZVdpbmRvdyIsImluZGV4ZWREQiIsIm1vekluZGV4ZWREQiIsIndlYmtpdEluZGV4ZWREQiIsIm1zSW5kZXhlZERCIiwic2hpbUluZGV4ZWREQiIsInNldFVwRGF0YWJhc2UiLCJvcGVuUmVxdWVzdCIsImRiIiwiY3JlYXRlT2JqZWN0U3RvcmUiLCJrZXlQYXRoIiwiQnJvd3NlckluZGV4ZWREQiIsIm1vZGVsUGF0aCIsImRhdGFiYXNlQWN0aW9uIiwib251cGdyYWRlbmVlZGVkIiwibW9kZWxUeCIsInRyYW5zYWN0aW9uIiwiZ2V0UmVxdWVzdCIsIm9iamVjdFN0b3JlIiwiY2xvc2UiLCJvbmNvbXBsZXRlIiwiaW5mb1R4IiwiaW5mb1N0b3JlIiwicHV0SW5mb1JlcXVlc3QiLCJwdXQiLCJwdXRNb2RlbFJlcXVlc3QiLCJkZWxldGVJbmZvUmVxdWVzdCIsImluZGV4ZWREQlJvdXRlciIsImJyb3dzZXJJbmRleGVkREIiLCJCcm93c2VySW5kZXhlZERCTWFuYWdlciIsInR4IiwiZ2V0QWxsSW5mb1JlcXVlc3QiLCJnZXRBbGwiLCJnZXRJbmZvUmVxdWVzdCIsImRlbGV0ZU1vZGVsRGF0YSIsImRlbGV0ZU1vZGVsUmVxdWVzdCIsImVuY29kZVdlaWdodHMiLCJzcGVjcyIsImRhdGFQcm9taXNlcyIsIm5hbWVzIiwic3BlYyIsInV0ZjhieXRlcyIsInRvdGFsTnVtQnl0ZXMiLCJieXRlc09mTGVuZ3RoIiwiY29uY2F0ZW5hdGVUeXBlZEFycmF5cyIsImRlY29kZVdlaWdodHMiLCJmbG9hdDE2RGVjb2RlIiwicXVhbnRpemF0aW9uIiwicXVhbnRpemF0aW9uU2l6ZUZhY3RvciIsImJ5dGVCdWZmZXIiLCJxdWFudGl6ZWRBcnJheSIsImdldEZsb2F0MTZEZWNvZGVyIiwiZHR5cGVGYWN0b3IiLCJyZWFsVGVuc29yIiwiaW1hZ2VUZW5zb3IiLCJ0b3RhbEJ5dGVMZW5ndGgiLCJub3JtYWxpemVkWHMiLCJ1c2VOb2RlQnVmZmVyIiwiQnVmZmVyIiwiYXRvYiIsImJ0b2EiLCJzdHJpbmdCeXRlTGVuZ3RoIiwiYXJyYXlCdWZmZXJUb0Jhc2U2NFN0cmluZyIsImJhc2U2NFN0cmluZ1RvQXJyYXlCdWZmZXIiLCJjb25jYXRlbmF0ZUFycmF5QnVmZmVycyIsInRlbXAiLCJiYXNlbmFtZSIsInRyaW0iLCJpdGVtcyIsImdldE1vZGVsSlNPTkZvck1vZGVsQXJ0aWZhY3RzIiwiYXJ0aWZhY3RzIiwiZm9ybWF0IiwiZ2VuZXJhdGVkQnkiLCJjb252ZXJ0ZWRCeSIsInNpZ25hdHVyZSIsInVzZXJEZWZpbmVkTWV0YWRhdGEiLCJtb2RlbEluaXRpYWxpemVyIiwidHJhaW5pbmdDb25maWciLCJnZXRNb2RlbEFydGlmYWN0c0ZvckpTT04iLCJnZXRNb2RlbEFydGlmYWN0c0luZm9Gb3JKU09OIiwiZGF0ZVNhdmVkIiwiRGF0ZSIsIm1vZGVsVG9wb2xvZ3lUeXBlIiwibW9kZWxUb3BvbG9neUJ5dGVzIiwid2VpZ2h0U3BlY3NCeXRlcyIsIndlaWdodERhdGFCeXRlcyIsIm1hbnRpc2FUYWJsZSIsImNvbnZlcnRNYW50aXNzYSIsImNvbXB1dGVGbG9hdDE2TWFudGlzYVRhYmxlIiwiZXhwb25lbnRUYWJsZSIsImNvbXB1dGVGbG9hdDE2RXhwb25lbnRUYWJsZSIsIm9mZnNldFRhYmxlIiwiY29tcHV0ZUZsb2F0MTZPZmZzZXRUYWJsZSIsImJ1ZmZlclVpbnQzMlZpZXciLCJmbG9hdDE2Qml0cyIsImZsb2F0MzJCaXRzIiwiUEFUSF9TRVBBUkFUT1IiLCJQQVRIX1BSRUZJWCIsIklORk9fU1VGRklYIiwiTU9ERUxfVE9QT0xPR1lfU1VGRklYIiwiV0VJR0hUX1NQRUNTX1NVRkZJWCIsIldFSUdIVF9EQVRBX1NVRkZJWCIsIk1PREVMX01FVEFEQVRBX1NVRkZJWCIsInB1cmdlTG9jYWxTdG9yYWdlQXJ0aWZhY3RzIiwibG9jYWxTdG9yYWdlIiwiTFMiLCJwdXJnZWRNb2RlbFBhdGhzIiwicmVtb3ZlSXRlbSIsIm1vZGVsTmFtZSIsImdldE1vZGVsUGF0aEZyb21LZXkiLCJnZXRNb2RlbEtleXMiLCJ0b3BvbG9neSIsIm1vZGVsTWV0YWRhdGEiLCJyZW1vdmVJdGVtcyIsIkJyb3dzZXJMb2NhbFN0b3JhZ2UiLCJzZXRJdGVtIiwibWV0YWRhdGEiLCJnZXRJdGVtIiwibWV0YWRhdGFTdHJpbmciLCJ3ZWlnaHREYXRhQmFzZTY0IiwibG9jYWxTdG9yYWdlUm91dGVyIiwiYnJvd3NlckxvY2FsU3RvcmFnZSIsIkJyb3dzZXJMb2NhbFN0b3JhZ2VNYW5hZ2VyIiwiVVJMX1NDSEVNRV9TVUZGSVgiLCJNb2RlbFN0b3JlTWFuYWdlclJlZ2lzdHJ5IiwibWFuYWdlcnMiLCJzY2hlbWUiLCJtYW5hZ2VyIiwiZ2V0SW5zdGFuY2UiLCJwYXJzZVVSTCIsImdldFNjaGVtZXMiLCJjbG9uZU1vZGVsSW50ZXJuYWwiLCJzb3VyY2VVUkwiLCJkZXN0VVJMIiwiZGVsZXRlU291cmNlIiwibG9hZEhhbmRsZXJzIiwiZ2V0TG9hZEhhbmRsZXJzIiwibG9hZEhhbmRsZXIiLCJzYXZlSGFuZGxlcnMiLCJnZXRTYXZlSGFuZGxlcnMiLCJzYXZlSGFuZGxlciIsInNvdXJjZVNjaGVtZSIsInNvdXJjZVBhdGgiLCJzYW1lTWVkaXVtIiwiZ2V0TWFuYWdlciIsInJlbW92ZU1vZGVsIiwic2F2ZVJlc3VsdCIsImxpc3RNb2RlbHMiLCJzY2hlbWVzIiwic2NoZW1lT3V0Iiwic2NoZW1lQW5kUGF0aCIsImNvcHlNb2RlbCIsIm1vdmVNb2RlbCIsIlBhc3N0aHJvdWdoTG9hZGVyIiwiUGFzc3Rocm91Z2hTYXZlciIsImZyb21NZW1vcnkiLCJ3aXRoU2F2ZUhhbmRsZXIiLCJtb25pdG9yUHJvbWlzZXNQcm9ncmVzcyIsInN0YXJ0RnJhY3Rpb24iLCJlbmRGcmFjdGlvbiIsImNoZWNrUHJvbWlzZXMiLCJjaGVja0ZyYWN0aW9uIiwicmVzb2x2ZWRQcm9taXNlIiwicHJvbWlzZSIsImZyYWN0aW9uIiwiSU9Sb3V0ZXJSZWdpc3RyeSIsInNhdmVSb3V0ZXJzIiwibG9hZFJvdXRlcnMiLCJzYXZlUm91dGVyIiwibG9hZFJvdXRlciIsImdldEhhbmRsZXJzIiwiaGFuZGxlclR5cGUiLCJ2YWxpZEhhbmRsZXJzIiwicm91dGVyIiwiaGFuZGxlciIsImxvdWRSb3V0ZXIiLCJEVFlQRV9WQUxVRV9TSVpFX01BUCIsImxvYWRXZWlnaHRzQXNBcnJheUJ1ZmZlciIsInJlcXVlc3RzIiwiZmV0Y2hVUkwiLCJpc0JpbmFyeSIsImJ1ZmZlclByb21pc2VzIiwiZmlsZVBhdGhQcmVmaXgiLCJ3ZWlnaHROYW1lcyIsIndlaWdodHNMb2FkZXJGYWN0b3J5IiwiZmV0Y2hVcmxzIiwiZmV0Y2hXZWlnaHRzRnVuY3Rpb24iLCJncm91cEluZGljZXNUb0ZldGNoTWFwIiwiZ3JvdXBXZWlnaHRzVG9GZXRjaCIsIndlaWdodHNGb3VuZCIsImFsbE1hbmlmZXN0V2VpZ2h0TmFtZXMiLCJtYW5pZmVzdEdyb3VwQ29uZmlnIiwiZ3JvdXBJbmRleCIsImdyb3VwT2Zmc2V0Iiwid2VpZ2h0c0VudHJ5IiwicmF3RHR5cGUiLCJ3ZWlnaHRzQnl0ZXMiLCJlbnF1ZXVlV2VpZ2h0c0ZvckZldGNoaW5nRm4iLCJtYW5pZmVzdEVudHJ5Iiwic2l6ZUJ5dGVzIiwid2VpZ2h0TmFtZSIsIndlaWdodEluZGV4Iiwid2VpZ2h0c05vdEZvdW5kIiwiZ3JvdXBJbmRpY2VzVG9GZXRjaCIsImFjY3VtdWxhdG9yIiwic2hvdWxkRmV0Y2giLCJmaWxlcGF0aCIsImZldGNoVXJsIiwid2VpZ2h0c1RlbnNvck1hcCIsImJ1ZmZlckluZGV4T2Zmc2V0IiwibnVtQnVmZmVycyIsImdyb3VwQnl0ZXMiLCJncm91cEJ1ZmZlciIsImdyb3VwQnl0ZUJ1ZmZlciIsImdyb3VwQnVmZmVyT2Zmc2V0IiwibmFtZVRvVGVuc29yTWFwIiwiQWJzIiwiQWNvcyIsIkFjb3NoIiwiQWRkIiwiQWRkTiIsIkFsbCIsIkFueSIsIkFyZ01heCIsIkFyZ01pbiIsIkFzaW4iLCJBc2luaCIsIkF0YW4iLCJBdGFuaCIsIkF0YW4yIiwiQXZnUG9vbCIsIkF2Z1Bvb2xHcmFkIiwiQXZnUG9vbDNEIiwiQXZnUG9vbDNER3JhZCIsIkJhdGNoTWF0TXVsIiwiQmF0Y2hUb1NwYWNlTkQiLCJCaW5jb3VudCIsIkJyb2FkY2FzdFRvIiwiQ2FzdCIsIkNlaWwiLCJDbGlwQnlWYWx1ZSIsIkNvbXBsZXgiLCJDb21wbGV4QWJzIiwiQ29uY2F0IiwiQ29udjJEIiwiQ29udjJEQmFja3Byb3BGaWx0ZXIiLCJDb252MkRCYWNrcHJvcElucHV0IiwiQ29udjNEIiwiQ29udjNEQmFja3Byb3BGaWx0ZXJWMiIsIkNvbnYzREJhY2twcm9wSW5wdXRWMiIsIkNvcyIsIkNvc2giLCJDdW1zdW0iLCJDcm9wQW5kUmVzaXplIiwiRGVuc2VCaW5jb3VudCIsIkRlcHRoVG9TcGFjZSIsIkRlcHRod2lzZUNvbnYyZE5hdGl2ZSIsIkRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyIiwiRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCIsIkRpYWciLCJEaWxhdGlvbjJEIiwiRGlsYXRpb24yREJhY2twcm9wSW5wdXQiLCJEaWxhdGlvbjJEQmFja3Byb3BGaWx0ZXIiLCJSZWFsRGl2IiwiRWluc3VtIiwiRWx1IiwiRWx1R3JhZCIsIkVyZiIsIkVxdWFsIiwiRXhwIiwiRXhwYW5kRGltcyIsIkV4cG0xIiwiRkZUIiwiRmlsbCIsIkZsaXBMZWZ0UmlnaHQiLCJGbG9vciIsIkZsb29yRGl2IiwiRnVzZWRCYXRjaE5vcm0iLCJHYXRoZXJWMiIsIkdhdGhlck5kIiwiR3JlYXRlciIsIkdyZWF0ZXJFcXVhbCIsIklkZW50aXR5IiwiSUZGVCIsIkltYWciLCJJc0Zpbml0ZSIsIklzSW5mIiwiSXNOYW4iLCJMZWFreVJlbHUiLCJMZXNzIiwiTGVzc0VxdWFsIiwiTGluU3BhY2UiLCJMb2ciLCJMb2cxcCIsIkxvZ2ljYWxBbmQiLCJMb2dpY2FsTm90IiwiTG9naWNhbE9yIiwiTG9nU29mdG1heCIsIkxSTiIsIkxSTkdyYWQiLCJNYXgiLCJNYXhpbXVtIiwiTWF4UG9vbCIsIk1heFBvb2xHcmFkIiwiTWF4UG9vbDNEIiwiTWF4UG9vbDNER3JhZCIsIk1heFBvb2xXaXRoQXJnbWF4IiwiTWVhbiIsIk1pbiIsIk1pbmltdW0iLCJNaXJyb3JQYWQiLCJNb2QiLCJNdWx0aW5vbWlhbCIsIk11bHRpcGx5IiwiTmVnIiwiTm90RXF1YWwiLCJOb25NYXhTdXBwcmVzc2lvblYzIiwiTm9uTWF4U3VwcHJlc3Npb25WNCIsIk5vbk1heFN1cHByZXNzaW9uVjUiLCJPbmVzTGlrZSIsIk9uZUhvdCIsIlBhY2siLCJQYWRWMiIsIlBvb2wiLCJQb3ciLCJQcmVsdSIsIlByb2QiLCJSYW5nZSIsIlJlYWwiLCJSZWNpcHJvY2FsIiwiUmVsdSIsIlJlc2hhcGUiLCJSZXNpemVOZWFyZXN0TmVpZ2hib3IiLCJSZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkIiwiUmVzaXplQmlsaW5lYXIiLCJSZXNpemVCaWxpbmVhckdyYWQiLCJSZWx1NiIsIlJldmVyc2UiLCJSb3VuZCIsIlJzcXJ0IiwiU2NhdHRlck5kIiwiU2VsZWN0IiwiU2VsdSIsIlNsaWNlIiwiU2luIiwiU2luaCIsIlNpZ24iLCJTaWdtb2lkIiwiU29mdHBsdXMiLCJTcXJ0IiwiU3VtIiwiU3BhY2VUb0JhdGNoTkQiLCJTcGxpdFYiLCJTb2Z0bWF4IiwiU3BhcnNlRmlsbEVtcHR5Um93cyIsIlNwYXJzZVJlc2hhcGUiLCJTcGFyc2VTZWdtZW50TWVhbiIsIlNwYXJzZVNlZ21lbnRTdW0iLCJTcGFyc2VUb0RlbnNlIiwiU3F1YXJlZERpZmZlcmVuY2UiLCJTcXVhcmUiLCJTdHJpZGVkU2xpY2UiLCJTdHJpbmdOR3JhbXMiLCJTdHJpbmdTcGxpdCIsIlN0cmluZ1RvSGFzaEJ1Y2tldEZhc3QiLCJTdWIiLCJUYW4iLCJUYW5oIiwiVGlsZSIsIlRvcEsiLCJUcmFuc2Zvcm0iLCJUcmFuc3Bvc2UiLCJVbmlxdWUiLCJVbnBhY2siLCJVbnNvcnRlZFNlZ21lbnRTdW0iLCJaZXJvc0xpa2UiLCJTdGVwIiwiRnJvbVBpeGVscyIsIlJvdGF0ZVdpdGhPZmZzZXQiLCJfRnVzZWRNYXRNdWwiLCJGdXNlZENvbnYyRCIsIkZ1c2VkRGVwdGh3aXNlQ29udjJEIiwia2VybmVsUmVnaXN0cnkiLCJncmFkUmVnaXN0cnkiLCJnZXRLZXJuZWwiLCJtYWtlS2V5IiwiZ2V0R3JhZGllbnQiLCJnZXRLZXJuZWxzRm9yQmFja2VuZCIsIml0IiwiZW50cmllcyIsImRvbmUiLCJuZXh0IiwiY29uZmlnIiwicmVnaXN0ZXJLZXJuZWwiLCJyZWdpc3RlckdyYWRpZW50IiwidW5yZWdpc3Rlcktlcm5lbCIsInVucmVnaXN0ZXJHcmFkaWVudCIsImNvcHlSZWdpc3RlcmVkS2VybmVscyIsInJlZ2lzdGVyZWRCYWNrZW5kTmFtZSIsIm5ld0JhY2tlbmROYW1lIiwiYWJzXyIsImFjb3NfIiwiYWNvc2hfIiwiYWRkXyIsIiRhIiwiJGIiLCJhZGROXyIsIiR0ZW5zb3JzIiwiZmlyc3RUZW5zb3IiLCJhbGxfIiwiYW55XyIsImFyZ01heF8iLCJhcmdNaW5fIiwiYmF0Y2hUb1NwYWNlIiwic3BhdGlhbExlbmd0aCIsInJlc2hhcGVkUmFuayIsImJsb2NrU2hhcGVSYW5rIiwicGVybXV0ZWRCZWZvcmVCYXRjaCIsInBlcm11dGVkQWZ0ZXJCYXRjaCIsInVuY3JvcHBlZFNoYXBlIiwiYXNpbl8iLCJhc2luaF8iLCJhdGFuXyIsImF0YW4yXyIsImF0YW5oXyIsImF2Z1Bvb2xfIiwieDREIiwicmVzaGFwZWRUbzREIiwiYXZnUG9vbDNkIiwiYXZnUG9vbDNkXyIsIng1RCIsInJlc2hhcGVkVG81RCIsImF4ZXNBcmVJbm5lck1vc3REaW1zIiwiY29tYmluZUxvY2F0aW9ucyIsIm91dHB1dExvYyIsInJlZHVjZUxvYyIsInJlZHVjZUlkeCIsIm51bUF4ZXMiLCJiYXNpY0xTVE1DZWxsIiwiYmFzaWNMU1RNQ2VsbF8iLCJmb3JnZXRCaWFzIiwibHN0bUtlcm5lbCIsImxzdG1CaWFzIiwiJGZvcmdldEJpYXMiLCIkbHN0bUtlcm5lbCIsIiRsc3RtQmlhcyIsIiRjIiwiJGgiLCJjb21iaW5lZCIsIndlaWdodGVkIiwic2xpY2VDb2xzIiwibmV3QyIsImJhdGNoVG9TcGFjZU5EXyIsImJhdGNoTm9ybV8iLCIkbWVhbiIsIiR2YXJpYW5jZSIsIiRzY2FsZSIsIiRvZmZzZXQiLCJiYXRjaE5vcm0yZCIsImJhdGNoTm9ybTJkXyIsImJhdGNoTm9ybTNkIiwiYmF0Y2hOb3JtM2RfIiwiYmF0Y2hOb3JtNGQiLCJiYXRjaE5vcm00ZF8iLCJ4QXM0RCIsImJpbmNvdW50XyIsIiR3ZWlnaHRzIiwiYm9vbGVhbk1hc2tBc3luYyIsIiR0ZW5zb3IiLCIkbWFzayIsImF4aXNGcm9tIiwibWFza0RpbSIsInRlbnNvclNoYXBlIiwibGVhZGluZ1NpemUiLCJ0YXJnZXRUZW5zb3JTaGFwZSIsInJlc2hhcGVkVGVuc29yIiwicmVzaGFwZWRNYXNrIiwicG9zaXRpdmVQb3NpdGlvbnMiLCJicm9hZGNhc3RUbyIsImJyb2FkY2FzdFRvXyIsImdldFJlZHVjdGlvbkF4ZXMiLCJpbkRpbSIsIm91dEF4aXMiLCJvdXREaW0iLCJmcm9tUGl4ZWxzXyIsImlzUGl4ZWxEYXRhIiwiaXNJbWFnZURhdGEiLCJpc0NhbnZhc0xpa2UiLCJpc0ltYWdlQml0bWFwIiwiSW1hZ2VEYXRhIiwiSW1hZ2VCaXRtYXAiLCJIQVZFX0NVUlJFTlRfREFUQV9SRUFEWV9TVEFURSIsInJlYWR5U3RhdGUiLCJnZXRJbWFnZURhdGEiLCJudW1QaXhlbHMiLCJjYW5XcmFwUGl4ZWxzVG9JbWFnZUJpdG1hcCIsImlzTm9uRW1wdHlQaXhlbHMiLCJmcm9tUGl4ZWxzQXN5bmMiLCJpbWFnZUJpdG1hcCIsImNyZWF0ZUltYWdlQml0bWFwIiwicHJlbXVsdGlwbHlBbHBoYSIsInRvUGl4ZWxzIiwiaW1nIiwiJGltZyIsIm9yaWdpbmFsSW1nVGVuc29yIiwibXVsdGlwbGllciIsIlVpbnQ4Q2xhbXBlZEFycmF5IiwicmdiYSIsImltYWdlRGF0YSIsInB1dEltYWdlRGF0YSIsImZyb21QaXhlbHMiLCJjYXN0XyIsImNlaWxfIiwiY2xpcEJ5VmFsdWVfIiwiY2xvbmVfIiwiY29tcGxleF8iLCJjb25jYXRfIiwiY29uY2F0MWQiLCJjb25jYXQxZF8iLCJjb25jYXQyZCIsImNvbmNhdDJkXyIsImNvbmNhdDNkIiwiY29uY2F0M2RfIiwiY29uY2F0NGQiLCJjb25jYXQ0ZF8iLCJmaXJzdFNoYXBlIiwiY29uZnVzaW9uTWF0cml4XyIsImxhYmVscyIsInByZWRpY3Rpb25zIiwibnVtQ2xhc3NlcyIsIiRsYWJlbHMiLCIkcHJlZGljdGlvbnMiLCJpc0ludGVnZXIiLCJvbmVIb3RMYWJlbHMiLCJvbmVIb3RQcmVkaWN0aW9ucyIsIm9uZUhvdExhYmVsc1QiLCJjb25mdXNpb25NYXRyaXgiLCJjb252MWQiLCJjb252MWRfIiwiZGlsYXRpb24iLCJ4M0QiLCJyZXNoYXBlZFRvM0QiLCJmaWx0ZXI0RCIsImlucHV0NEQiLCJjb252MmRfIiwiY29udjJEQmFja3Byb3BGaWx0ZXJfIiwiZHk0RCIsImNvbnYyREJhY2twcm9wSW5wdXRfIiwieFNoYXBlNEQiLCJjb252MmRUcmFuc3Bvc2UiLCJjb252MmRUcmFuc3Bvc2VfIiwiY29udjNkIiwiY29udjNkXyIsImNvbnYzREJhY2twcm9wSW5wdXRfIiwieFNoYXBlNUQiLCJkeTVEIiwiY29udjNkVHJhbnNwb3NlIiwiY29udjNkVHJhbnNwb3NlXyIsInJvdW5kaW5nTW9kZSIsInBhcnNlVHVwbGVQYXJhbSIsInBhcnNlM1R1cGxlUGFyYW0iLCJkZXB0aHdpc2UiLCJmaWx0ZXJDaGFubmVscyIsImdldEVmZmVjdGl2ZUZpbHRlclNpemUiLCJmaWVsZFNpemUiLCJ6ZXJvUGFkIiwiY29tcHV0ZURlZmF1bHRQYWQiLCJpbnB1dFJvd3MiLCJpbnB1dENvbHMiLCJvdXRwdXRDb2xzIiwiY29tcHV0ZU91dHB1dFNoYXBlMkQiLCJwYWRBbG9uZ0hlaWdodCIsInBhZEFsb25nV2lkdGgiLCJnZXRQYWRBbmRPdXRJbmZvIiwiYmFjayIsIm91dHB1dERlcHRocyIsImNvbXB1dGVPdXRwdXRTaGFwZTREIiwicGFkQWxvbmdEZXB0aCIsImdldDNEUGFkQW5kT3V0SW5mbyIsImVmZmVjdGl2ZUZpZWxkU2l6ZSIsInBhcmFtIiwidHVwbGVWYWx1ZXNBcmVPbmUiLCJkaW1BIiwiZGltQiIsImRpbUMiLCJjb3NfIiwiY29zaF8iLCJjdW1zdW1fIiwiZGVuc2VCaW5jb3VudF8iLCJkZXB0aFRvU3BhY2VfIiwiZGVwdGh3aXNlQ29udjJkIiwiZGVwdGh3aXNlQ29udjJkXyIsImRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyXyIsImRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXRfIiwiZGlhZ18iLCJkaWxhdGlvbjJkIiwiZGlsYXRpb24yZF8iLCJkaXZfIiwiZGl2Tm9OYW4iLCJkaXZOb05hbl8iLCJkaXZSZXN1bHQiLCJiRXF1YWxzWmVybyIsImRvdCIsImRvdF8iLCJ0MSIsInQyIiwiJHQxIiwiJHQyIiwidDFJbm5lciIsInQySW5uZXIiLCJ0MTJEIiwidDIyRCIsInQxdDIiLCJkcm9wb3V0IiwiZHJvcG91dF8iLCJyYXRlIiwibm9pc2VTaGFwZSIsIiRub2lzZVNoYXBlIiwia2VlcFByb2IiLCJnZXROb2lzZVNoYXBlIiwibmV3RGltZW5zaW9uIiwiZWluc3VtXyIsImVsdV8iLCJlcXVhbF8iLCJlcmZfIiwiZXhwXyIsImV4cGFuZERpbXNfIiwiZXhwbTFfIiwiZXllIiwiZXllXyIsImJhdGNoU2hhcGUiLCJidWZmIiwiZmxvb3JfIiwiZmxvb3JEaXZfIiwiZnVzZWRDb252MmRfIiwiJGJpYXMiLCIkcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyIsImR5QWN0aXZhdGlvbiIsImRlciIsImJpYXNEZXIiLCJjdXN0b21PcCIsImN1c3RvbU9wV2l0aEJpYXMiLCJmdXNlZERlcHRod2lzZUNvbnYyZF8iLCJ4RGVyIiwiZmlsdGVyRGVyIiwibWF0TXVsIiwiZnVzZWRNYXRNdWxfIiwiYTNEIiwiYjNEIiwiYURlciIsImJEZXIiLCJnZXRGdXNlZER5QWN0aXZhdGlvbiIsImdldEZ1c2VkQmlhc0dyYWRpZW50IiwicmVkdWNlQXhlcyIsInNob3VsZEZ1c2UiLCJnYXRoZXIiLCJnYXRoZXJfIiwiZ2F0aGVyTkQiLCJnYXRoZXJORF8iLCJ0ZW5zb3JSYW5rIiwiblJlc3VsdCIsImdyZWF0ZXJfIiwiZ3JlYXRlckVxdWFsXyIsImltYWdfIiwiY3JvcEFuZFJlc2l6ZV8iLCIkaW1hZ2UiLCIkYm94ZXMiLCIkYm94SW5kIiwiZmxpcExlZnRSaWdodF8iLCJub25NYXhTdXBwcmVzc2lvbiIsIm5vbk1heFN1cHByZXNzaW9uXyIsIiRzY29yZXMiLCJub25NYXhTdXBwcmVzc2lvbkFzeW5jIiwiYm94ZXNBbmRTY29yZXMiLCJub25NYXhTdXBwcmVzc2lvblBhZGRlZCIsIm5vbk1heFN1cHByZXNzaW9uUGFkZGVkXyIsIm5vbk1heFN1cHByZXNzaW9uUGFkZGVkQXN5bmMiLCIkbWF4T3V0cHV0U2l6ZSIsIiRpb3VUaHJlc2hvbGQiLCIkc2NvcmVUaHJlc2hvbGQiLCJub25NYXhTdXBwcmVzc2lvbldpdGhTY29yZSIsIm5vbk1heFN1cHByZXNzaW9uV2l0aFNjb3JlXyIsIm5vbk1heFN1cHByZXNzaW9uV2l0aFNjb3JlQXN5bmMiLCJyZXNpemVCaWxpbmVhcl8iLCIkaW1hZ2VzIiwiYmF0Y2hJbWFnZXMiLCJyZXNpemVOZWFyZXN0TmVpZ2hib3JfIiwicm90YXRlV2l0aE9mZnNldF8iLCJ0aHJlc2hvbGRfIiwiaW52ZXJ0ZWQiLCJ0aHJlc2hWYWx1ZSIsInRvdGFsUGl4ZWxzSW5JbWFnZSIsImdyYXlzY2FsZSIsIiR0aHJlc2hvbGQiLCIkciIsIiRnIiwiaGlzdG9ncmFtIiwiY2xhc3NGaXJzdCIsImNsYXNzU2Vjb25kIiwibWVhbkZpcnN0IiwibWVhblNlYyIsIndlaWdodEZvcmVncm91bmQiLCJ3ZWlnaHRCYWNrIiwiYmVzdFRocmVzaCIsImJlc3RJbkJldFZhciIsImNJbkJldFZhciIsIm1lYW5GaXJzdERpdkEiLCJtZWFuU2VjRmlsbCIsIm1lYW5TZWNBZGQiLCJtZWFuU2VjTXVsIiwiY0luQmV0VmFyU3ViQSIsImNJbkJldFZhclN1YkIiLCJjSW5CZXRWYXJNdWwiLCJvdHN1IiwiaW52Q29uZGl0aW9uIiwidHJhbnNmb3JtXyIsIiR0cmFuc2Zvcm1zIiwiaW5Ub3BLQXN5bmMiLCJ0YXJnZXRzIiwiJHRhcmdldHMiLCJwcmVkaWN0aW9uc1ZhbHMiLCJ0YXJnZXRzVmFscyIsInByZWNpc2lvbiIsImlzRmluaXRlXyIsImlzSW5mXyIsImlzTmFOXyIsImxlYWt5UmVsdV8iLCJsZXNzXyIsImxlc3NFcXVhbF8iLCJiYW5kUGFydCIsImJhbmRQYXJ0XyIsIm51bUxvd2VyIiwibnVtVXBwZXIiLCJNIiwiTiIsImlqIiwiaW5CYW5kIiwibWF0IiwiZ3JhbVNjaG1pZHQiLCJncmFtU2NobWlkdF8iLCJpbnB1dElzVGVuc29yMkQiLCJ5cyIsInhzMWQiLCJwcm9qIiwicXIyZCIsImZ1bGxNYXRyaWNlcyIsIm9uZTJEIiwiaXRlcnMiLCJyVGVtcCIsIndUZW1wIiwicVRlbXAiLCJyakVuZDEiLCJub3JtWCIsInJqaiIsIndQcmUiLCJ0YXUiLCJyakVuZEFsbCIsInRhdVRpbWVzVyIsIndUIiwiclRpbWVzVGF1IiwidGF3VGltZXNXVCIsInFBbGxKRW5kIiwicVRpbWVzVGF1IiwicXIiLCJxcl8iLCJvdXRlckRpbXNQcm9kIiwicHJldiIsIngyZHMiLCJxMmRzIiwicjJkcyIsIngyZCIsInEyZCIsInIyZCIsImxpbnNwYWNlIiwibG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb24iLCJsb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbl8iLCJsb2dfIiwibG9nMXBfIiwibG9nU2lnbW9pZCIsImxvZ1NpZ21vaWRfIiwibG9nU29mdG1heCIsImxvZ1NvZnRtYXhfIiwiJGxvZ2l0cyIsInhNYXgiLCJzaGlmdGVkIiwibG9nU3VtRXhwIiwibG9nU3VtRXhwXyIsImxvZ2ljYWxBbmRfIiwibG9naWNhbE5vdF8iLCJsb2dpY2FsT3JfIiwibG9naWNhbFhvciIsImxvZ2ljYWxYb3JfIiwiUmVkdWN0aW9uIiwiYWJzb2x1dGVEaWZmZXJlbmNlIiwiYWJzb2x1dGVEaWZmZXJlbmNlXyIsInJlZHVjdGlvbiIsIlNVTV9CWV9OT05aRVJPX1dFSUdIVFMiLCJsb3NzZXMiLCJjb21wdXRlV2VpZ2h0ZWRMb3NzIiwiY29tcHV0ZVdlaWdodGVkTG9zc18iLCIkbG9zc2VzIiwid2VpZ2h0ZWRMb3NzIiwiTk9ORSIsIlNVTSIsIk1FQU4iLCJicm9hZGNhc3RGYWN0b3IiLCJicm9hZGNhc3RlZFdlaWdodHMiLCJudW1Ob25aZXJvcyIsImNvc2luZURpc3RhbmNlIiwiY29zaW5lRGlzdGFuY2VfIiwib25lIiwiaGluZ2VMb3NzIiwiaGluZ2VMb3NzXyIsImh1YmVyTG9zcyIsImh1YmVyTG9zc18iLCJkZWx0YSIsImRlbHRhU2NhbGFyIiwicXVhZHJhdGljIiwibGluZWFyIiwibG9nTG9zcyIsImxvZ0xvc3NfIiwiZXBzaWxvblNjYWxhciIsImwxIiwibDIiLCJtZWFuU3F1YXJlZEVycm9yIiwibWVhblNxdWFyZWRFcnJvcl8iLCJzaWdtb2lkQ3Jvc3NFbnRyb3B5Iiwic2lnbW9pZENyb3NzRW50cm9weV8iLCJtdWx0aUNsYXNzTGFiZWxzIiwibGFiZWxTbW9vdGhpbmciLCIkbXVsdGlDbGFzc0xhYmVscyIsImxhYmVsU21vb3RoaW5nU2NhbGFyIiwibWF4T3V0cHV0Iiwib3V0cHV0WFRhcmdldCIsInNpZ21vaWRPdXRwdXQiLCJzaWdtb2lkQ3Jvc3NFbnRyb3B5V2l0aExvZ2l0c18iLCJzb2Z0bWF4Q3Jvc3NFbnRyb3B5Iiwic29mdG1heENyb3NzRW50cm9weV8iLCJvbmVob3RMYWJlbHMiLCIkb25laG90TGFiZWxzIiwibHNlIiwibG9nUmVzdWx0IiwiY29zdFZlY3RvciIsInNvZnRtYXhDcm9zc0VudHJvcHlXaXRoTG9naXRzXyIsIm1hdE11bF8iLCJtYXhfIiwibWF4UG9vbF8iLCJtYXhQb29sM2RfIiwibWF4UG9vbFdpdGhBcmdtYXgiLCJtYXhQb29sV2l0aEFyZ21heF8iLCJtYXhpbXVtXyIsIm1lYW5fIiwibWVzaGdyaWQiLCJpbmRleGluZyIsIlR5cGVFcnJvciIsIiR5IiwibWluXyIsIm1pbmltdW1fIiwibWlycm9yUGFkXyIsInNoYXBlT2Zmc2V0IiwibW9kXyIsIm1vbWVudHMiLCJtb21lbnRzXyIsInhNZWFuIiwia2VlcERpbXNTaGFwZSIsImRldlNxdWFyZWQiLCJtb3ZpbmdBdmVyYWdlIiwibW92aW5nQXZlcmFnZV8iLCJkZWNheSIsInplcm9EZWJpYXMiLCIkdiIsIiRkZWNheSIsIm9uZU1pbnVzRGVjYXkiLCJ1cGRhdGUiLCIkc3RlcCIsIm11bF8iLCJtdWx0aVJOTkNlbGwiLCJtdWx0aVJOTkNlbGxfIiwibHN0bUNlbGxzIiwibmV3U3RhdGVzIiwibmV3SCIsIm11bHRpbm9taWFsXyIsIm9yaWdSYW5rIiwibmVnXyIsIm5vbk1heFN1cHBTYW5pdHlDaGVjayIsIm5vcm1JbXBsIiwibm9ybV8iLCJvcmQiLCJub3RFcXVhbF8iLCJvbmVIb3RfIiwib25lc0xpa2VfIiwiT1BfU0NPUEVfU1VGRklYIiwiZjIiLCJjb25maWd1cmFibGUiLCJzcGVjdHJhbCIsInJmZnQiLCJpcmZmdCIsInNpZ25hbCIsImhhbW1pbmdXaW5kb3ciLCJoYW5uV2luZG93IiwiZnJhbWUiLCJzdGZ0IiwibGluYWxnIiwic3BhcnNlIiwib3V0ZXJQcm9kdWN0Iiwib3V0ZXJQcm9kdWN0XyIsInYxIiwidjIiLCIkdjEiLCIkdjIiLCJ2MTJEIiwidjIyRCIsInBhZF8iLCJwYWQxZCIsInBhZDFkXyIsInBhZDJkIiwicGFkMmRfIiwicGFkM2QiLCJwYWQzZF8iLCJwYWQ0ZCIsInBhZDRkXyIsInBvb2xfIiwid2luZG93U2hhcGUiLCJwb29saW5nVHlwZSIsImJhc2VQYWRkaW5nIiwicGFkRXh0cmFTaGFwZSIsInBhZEV4dHJhU3RhcnQiLCJwYWRFeHRyYUVuZCIsIndpdGhTcGFjZVRvQmF0Y2hCYXNlUGFkZGluZ3MiLCJpc0RpbGF0aW9uT25lIiwiYWRqdXN0ZWRQYWRkaW5nIiwiYWRqdXN0ZWRDcm9wcyIsInBhZFN0YXJ0Iiwib3JpZ1BhZEVuZCIsImZ1bGxJbnB1dFNoYXBlIiwicGFkRW5kRXh0cmEiLCJwYWRFbmQiLCJyZXF1aXJlZFNwYWNlVG9CYXRjaFBhZGRpbmdzIiwiY29udmVydGVkUGFkIiwiY29udmVydGVkWCIsInBvd18iLCIkYmFzZSIsIiRleHAiLCJwcmVsdV8iLCJ2ZXJib3NlIiwicHJvZF8iLCJyYW5kIiwicmFuZF8iLCJyYW5kRnVuY3Rpb24iLCJNUFJhbmRHYXVzcyIsInN0ZERldmlhdGlvbiIsInRydW5jYXRlZCIsInN0ZERldiIsIm5leHRWYWwiLCJ1cHBlciIsImxvd2VyIiwic2VlZFZhbHVlIiwibmV4dFZhbHVlIiwicmVzdWx0WCIsInJlc3VsdFkiLCJpc1ZhbGlkIiwiaXNWYWxpZFRydW5jYXRlZCIsImNvbnZlcnRWYWx1ZSIsIlJhbmRHYW1tYSIsInJhbmR1IiwicmFuZG4iLCJ2MCIsIlVuaWZvcm1SYW5kb20iLCJjYW5SZXR1cm5GbG9hdCIsImphcnF1ZUJlcmFOb3JtYWxpdHlUZXN0IiwidmFsdWVzTWVhbiIsInN1bTIiLCJzdW0zIiwic2tld25lc3MiLCJzdW00Iiwia3VydG9zaXMiLCJqYiIsImV4cGVjdEFycmF5SW5NZWFuU3RkUmFuZ2UiLCJhY3R1YWwiLCJleHBlY3RlZE1lYW4iLCJleHBlY3RlZFN0ZERldiIsImFjdHVhbE1lYW4iLCJzcXVhcmVEaWZmU3VtIiwic3RhbmRhcmREZXZpYXRpb24iLCJyYW5kb21HYW1tYSIsInJhbmRvbUdhbW1hXyIsInJnYW1tYSIsInJhbmRvbU5vcm1hbCIsInJhbmRvbU5vcm1hbF8iLCJyYW5kR2F1c3MiLCJyYW5kb21Vbmlmb3JtIiwicmFuZG9tVW5pZm9ybV8iLCJtaW52YWwiLCJtYXh2YWwiLCJyZWFsXyIsInJlY2lwcm9jYWxfIiwiUEFSQUxMRUxJWkVfVEhSRVNIT0xEIiwicmVsdV8iLCJyZWx1Nl8iLCJyZXNoYXBlXyIsInJldmVyc2VfIiwicmV2ZXJzZTFkIiwicmV2ZXJzZTFkXyIsInJldmVyc2UyZCIsInJldmVyc2UyZF8iLCJyZXZlcnNlM2QiLCJyZXZlcnNlM2RfIiwicmV2ZXJzZTRkIiwicmV2ZXJzZTRkXyIsInJvdW5kXyIsInJzcXJ0XyIsInNjYWxhciIsInNjYXR0ZXJORCIsInNjYXR0ZXJORF8iLCIkdXBkYXRlcyIsInZhbGlkYXRlVXBkYXRlU2hhcGUiLCJzaGFwZUVycm9yIiwidmFsaWRhdGVJbnB1dCIsInRvdGFsTmQiLCJzYWZlU2xpY2VEaW0iLCJzZWx1XyIsInNlcGFyYWJsZUNvbnYyZCIsInNlcGFyYWJsZUNvbnYyZF8iLCJkZXB0aHdpc2VGaWx0ZXIiLCJwb2ludHdpc2VGaWx0ZXIiLCIkZGVwdGh3aXNlRmlsdGVyIiwiJHBvaW50d2lzZUZpbHRlciIsImNoYW5uZWxNdWx0aXBsaWVyIiwic2V0ZGlmZjFkQXN5bmMiLCJ5U2V0Iiwic2lnbW9pZF8iLCJzaWduXyIsImZyYW1lXyIsImZyYW1lTGVuZ3RoIiwiZnJhbWVTdGVwIiwicGFkVmFsdWUiLCJwYWRMZW4iLCJoYW1taW5nV2luZG93XyIsIndpbmRvd0xlbmd0aCIsImhhbm5XaW5kb3dfIiwic3RmdF8iLCJmZnRMZW5ndGgiLCJ3aW5kb3dGbiIsImZyYW1lZFNpZ25hbCIsIndpbmRvd2VkU2lnbmFsIiwiZW5jbG9zaW5nUG93ZXJPZlR3byIsImNvc2luZVdpbmRvdyIsImV2ZW4iLCJjb3NBcmciLCJzaW5fIiwic2luaF8iLCJzbGljZV8iLCJzbGljZTFkIiwic2xpY2UxZF8iLCJzbGljZTJkXyIsInNsaWNlM2RfIiwic2xpY2U0ZF8iLCJzdHJpZGVzV2l0aEVsaWRlZERpbXMiLCJlbGxpcHNpc0luc2VydGlvbkluZGV4IiwibnVtRWxpZGVkQXhlcyIsInVubm9ybWFsaXplQXhpcyIsIm5vcm1hbGl6ZWRBeGlzIiwiZ2V0RWxpZGVkQXhlcyIsImVsaWRlZEF4ZXMiLCJmdWxsSW5kZXgiLCJzdGFydEluZGljZXNXaXRoRWxpZGVkRGltcyIsInN0b3BJbmRpY2VzV2l0aEVsaWRlZERpbXMiLCJzdGFydEZvckF4aXMiLCJzdG9wRm9yQXhpcyIsInN0cmlkZXNGb3JBeGlzIiwib3JpZ2luYWxCZWdpbiIsIm9yaWdpbmFsQXhpcyIsIm9yaWdpbmFsVmFsdWUiLCJvcmlnaW5hbEVuZCIsIk1BWF9TQUZFX0lOVEVHRVIiLCJheGlzU2l6ZSIsInN0YXJ0SW5kaWNlcyIsInN0b3BJbmRpY2VzIiwiZmlyc3ROb25PbmVBeGlzIiwiJGVuZCIsInNvZnRtYXhfIiwic29mdHBsdXNfIiwic3BhY2VUb0JhdGNoTkRfIiwic3BhcnNlRmlsbEVtcHR5Um93c18iLCJzcGFyc2VSZXNoYXBlXyIsIiRuZXdTaGFwZSIsInNwYXJzZVNlZ21lbnRNZWFuXyIsInNwYXJzZVNlZ21lbnRTdW1fIiwic3BhcnNlVG9EZW5zZV8iLCIkc3BhcnNlSW5kaWNlcyIsIiRzcGFyc2VWYWx1ZXMiLCJkZWZhdWx0VmFsdWVzIiwibnVtRWxlbXMiLCJudW1WYWx1ZXMiLCJmZnRfIiwiaWZmdF8iLCJpcmZmdF8iLCJjb21wbGV4SW5wdXQiLCJyZWFsSW5wdXQiLCJpbWFnSW5wdXQiLCJyZWFsQ29uanVnYXRlIiwiaW1hZ0Nvbmp1Z2F0ZSIsInJmZnRfIiwiYWRqdXN0ZWRJbnB1dCIsInplcm9zU2hhcGUiLCJ6ZXJvc0lucHV0IiwicmVhbENvbXBsZXhDb25qdWdhdGUiLCJpbWFnQ29tcGxleENvbmp1Z2F0ZSIsInNwbGl0XyIsIm51bU9mTmVncyIsIm5lZ0luZGV4Iiwic3FydF8iLCJzcXVhcmVfIiwic3F1YXJlZERpZmZlcmVuY2VfIiwic3F1ZWV6ZSIsInNxdWVlemVfIiwic3RhY2tfIiwic3RlcF8iLCJzdHJpZGVkU2xpY2VfIiwic3RyaW5nTkdyYW1zXyIsInN0cmluZ1NwbGl0XyIsInN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RfIiwic3ViXyIsInN1bV8iLCJ0YW5fIiwidGFuaF8iLCJpbmZlcnJlZFNoYXBlIiwidGVuc29yMWQiLCJ0ZW5zb3IyZCIsInRlbnNvcjNkIiwidGVuc29yNGQiLCJ0ZW5zb3I1ZCIsInRlbnNvcjZkIiwicHJvdmlkZWRTaXplIiwiaW5mZXJyZWRTaXplIiwiaW5mZXJyZWQiLCJmbGF0RGltc0RvbnRNYXRjaCIsInRpbGVfIiwidG9wa18iLCJ0cmFuc3Bvc2VfIiwidHJ1bmNhdGVkTm9ybWFsIiwidHJ1bmNhdGVkTm9ybWFsXyIsInVuaXF1ZV8iLCJ1bnNvcnRlZFNlZ21lbnRTdW1fIiwidW5zdGFjayIsInVuc3RhY2tfIiwid2hlcmVfIiwiJGNvbmRpdGlvbiIsImJyb2FkY2FzdFNoYXBlIiwid2hlcmVBc3luYyIsInplcm9zTGlrZV8iLCJBZGFkZWx0YU9wdGltaXplciIsImxlYXJuaW5nUmF0ZSIsInJobyIsImFjY3VtdWxhdGVkR3JhZHMiLCJhY2N1bXVsYXRlZFVwZGF0ZXMiLCJhcHBseUdyYWRpZW50cyIsInZhcmlhYmxlR3JhZGllbnRzIiwib3JpZ2luYWxOYW1lIiwiYWNjdW11bGF0ZWRHcmFkIiwiYWNjdW11bGF0ZWRVcGRhdGUiLCJuZXdBY2N1bXVsYXRlZEdyYWQiLCJuZXdBY2N1bXVsYXRlZFVwZGF0ZSIsImluY3JlbWVudEl0ZXJhdGlvbnMiLCJ2YXJpYWJsZXMiLCJzYXZlSXRlcmF0aW9ucyIsIndlaWdodFZhbHVlcyIsInZhcmlhYmxlQ291bnQiLCJleHRyYWN0SXRlcmF0aW9ucyIsImdldENvbmZpZyIsImNscyIsImNsYXNzTmFtZSIsIkFkYWdyYWRPcHRpbWl6ZXIiLCJpbml0aWFsQWNjdW11bGF0b3JWYWx1ZSIsIkFkYW1PcHRpbWl6ZXIiLCJiZXRhMSIsImJldGEyIiwiYWNjdW11bGF0ZWRGaXJzdE1vbWVudCIsImFjY3VtdWxhdGVkU2Vjb25kTW9tZW50IiwiYWNjQmV0YTEiLCJhY2NCZXRhMiIsInZhck5hbWVzIiwib25lTWludXNBY2NCZXRhMSIsIm9uZU1pbnVzQWNjQmV0YTIiLCJmaXJzdE1vbWVudCIsInNlY29uZE1vbWVudCIsIm5ld0ZpcnN0TW9tZW50IiwibmV3U2Vjb25kTW9tZW50IiwiYmlhc0NvcnJlY3RlZEZpcnN0TW9tZW50IiwiYmlhc0NvcnJlY3RlZFNlY29uZE1vbWVudCIsIml0ZXJhdGlvbnNfIiwiQWRhbWF4T3B0aW1pemVyIiwiYWNjdW11bGF0ZWRXZWlnaHRlZEluZk5vcm0iLCJpdGVyYXRpb24iLCJsciIsIndlaWdodGVkSW5mTm9ybSIsInV0MCIsInV0MSIsIm5ld1dlaWdodGVkSW5mTm9ybSIsIk1vbWVudHVtT3B0aW1pemVyIiwibW9tZW50dW0iLCJ1c2VOZXN0ZXJvdiIsImFjY3VtdWxhdGlvbnMiLCJhY2N1bXVsYXRpb24iLCJuZXdBY2N1bXVsYXRpb24iLCJzZXRNb21lbnR1bSIsIk9wdGltaXplciIsIm1pbmltaXplIiwicmV0dXJuQ29zdCIsImNvbXB1dGVHcmFkaWVudHMiLCJncmFkQXJyYXkiLCJpdGVyYXRpb25zIiwiZ2V0Q2xhc3NOYW1lIiwiaGFzSW5zdGFuY2UiLCJPcHRpbWl6ZXJDb25zdHJ1Y3RvcnMiLCJjZW50ZXJlZCIsIlJNU1Byb3BPcHRpbWl6ZXIiLCJhY2N1bXVsYXRlZE1lYW5TcXVhcmVzIiwiYWNjdW11bGF0ZWRNb21lbnRzIiwiYWNjdW11bGF0ZWRNZWFuR3JhZHMiLCJhY2N1bXVsYXRlZE1lYW5TcXVhcmUiLCJuZXdBY2N1bXVsYXRlZE1lYW5TcXVhcmUiLCJhY2N1bXVsYXRlZE1lYW5HcmFkIiwibmV3QWNjdW11bGF0ZWRNZWFuR3JhZCIsImdyYWRDb250cmlidXRpb24iLCJuZXdBY2N1bXVsYXRlZE1vbWVudHMiLCJTR0RPcHRpbWl6ZXIiLCJzZXRMZWFybmluZ1JhdGUiLCJQbGF0Zm9ybUJyb3dzZXIiLCJlbmNvZGUiLCJlbmNvZGluZyIsInRleHRFbmNvZGVyIiwiVGV4dEVuY29kZXIiLCJyZWdpc3Rlck1hbmFnZXIiLCJnZXROb2RlRmV0Y2giLCJpbXBvcnRGZXRjaCIsInN5c3RlbUZldGNoIiwicmVzZXRTeXN0ZW1GZXRjaCIsInNldFN5c3RlbUZldGNoIiwiZmV0Y2hGbiIsImdldFN5c3RlbUZldGNoIiwiUGxhdGZvcm1Ob2RlIiwidXRpbCIsInJlcXVlc3RJbml0cyIsImhydGltZSIsIlByb2ZpbGVyIiwiYmFja2VuZFRpbWVyIiwibG9nZ2VyIiwiTG9nZ2VyIiwiaG9sZFJlc3VsdFdyYXBwZXJGbiIsInRpbWVyIiwidGVuc29yVmFscyIsImNoZWNrQ29tcHV0YXRpb25Gb3JFcnJvcnMiLCJ0aW1pbmciLCJnZXRFeHRyYVByb2ZpbGVJbmZvIiwidmFsdWVDb250YWluZXIiLCJwYWRkZWROYW1lIiwiaW5wdXRTaGFwZXNEZXNjcmlwdGlvbiIsIlNlcmlhbGl6YWJsZSIsIlNlcmlhbGl6YXRpb25NYXAiLCJjbGFzc05hbWVNYXAiLCJnZXRNYXAiLCJmcm9tQ29uZmlnIiwicmVnaXN0ZXJDbGFzcyIsInJlZ2lzdGVyIiwiZ2V0RmlsdGVyZWROb2Rlc1hUb1kiLCJ0YXBlIiwidGVuc29yc0Zyb21YIiwibm9kZXNGcm9tWCIsIm5vZGVJbnB1dHMiLCJhbnlJbnB1dEZyb21YIiwidGVuc29yc0xlYWRUb1kiLCJub2Rlc1RvWSIsInBydW5lZElucHV0cyIsIm5vZGVJbnB1dCIsInBydW5lZE5vZGUiLCJiYWNrcHJvcGFnYXRlR3JhZGllbnRzIiwidGVuc29yQWNjdW11bGF0ZWRHcmFkaWVudE1hcCIsImdyYWRUZW5zb3IiLCJpbnB1dEdyYWRpZW50cyIsImN1ckdyYWRpZW50IiwiVGVuc29yQnVmZmVyIiwibG9jcyIsInRyYWNrZXJGbiIsImRlcHJlY2F0aW9uV2FybmluZ0ZuIiwic2V0VGVuc29yVHJhY2tlciIsInNldE9wSGFuZGxlciIsInNldERlcHJlY2F0aW9uV2FybmluZ0ZuIiwiVGVuc29yIiwiaXNEaXNwb3NlZEludGVybmFsIiwicmFua1R5cGUiLCJhcnJheVN5bmMiLCJpc0Rpc3Bvc2VkIiwiZ2V0R2xvYmFsVGVuc29yQ2xhc3MiLCJWYXJpYWJsZSIsInRlbnNvcklkIiwiRnVuY3Rpb24iLCJ0ZW5zb3JUb1N0cmluZyIsInBhZFBlckNvbCIsInZhbHVlc09yVHVwbGVzIiwiY3JlYXRlQ29tcGxleFR1cGxlcyIsInZhbFRvU3RyaW5nIiwiY29tcHV0ZU1heFNpemVQZXJDb2x1bW4iLCJ2YWxzTGluZXMiLCJzdWJUZW5zb3JUb1N0cmluZyIsImxpbmVzIiwidmFsU3RyIiwicGFyc2VGbG9hdCIsImJvb2xOdW1Ub1N0cmluZyIsImlzTGFzdCIsInN0b3JhZ2VQZXJFbGVtZW50IiwiZmlyc3RWYWxzU2l6ZSIsImZpcnN0VmFscyIsImxhc3RWYWxzIiwic3Vic2hhcGUiLCJzdWJzdHJpZGVzIiwic2VwIiwibmV3TGluZVNlcCIsImNvbXBsZXhUdXBsZXMiLCJtYWtlVHlwZXNNYXRjaCIsImFzc2VydFR5cGVzTWF0Y2giLCJpc1RlbnNvckluTGlzdCIsInRlbnNvckxpc3QiLCJnZXRUZW5zb3JzSW5Db250YWluZXIiLCJsaXN0Iiwid2Fsa1RlbnNvckNvbnRhaW5lciIsInNlZW4iLCJvYmoiLCJpdGVyYWJsZSIsImluZmVyU2hhcGUiLCJmaXJzdEVsZW0iLCJkZWVwQXNzZXJ0U2hhcGVDb25zaXN0ZW5jeSIsInN1YlNoYXBlIiwiYXNzZXJ0RHR5cGUiLCJleHBlY3RlZER0eXBlIiwiYWN0dWFsRFR5cGUiLCJhcmdOYW1lIiwiZnVuY3Rpb25OYW1lIiwiY29udmVydFRvVGVuc29yIiwicGFyc2VBc0R0eXBlIiwiaW5mZXJyZWREdHlwZSIsImNvbnZlcnRUb1RlbnNvckFycmF5IiwiVEVTVF9FUFNJTE9OX0ZMT0FUMTYiLCJleHBlY3RBcnJheXNDbG9zZSIsImV4cGVjdGVkIiwidGVzdEVwc2lsb24iLCJleHBlY3RBcnJheXNQcmVkaWNhdGUiLCJhcmVDbG9zZSIsInByZWRpY2F0ZSIsImNoZWNrQ2xhc3NUeXBlIiwiYVR5cGUiLCJiVHlwZSIsImFjdHVhbFNoYXBlIiwiZXhwZWN0ZWRTaGFwZSIsImFjdHVhbEZsYXQiLCJleHBlY3RlZEZsYXQiLCJleHBlY3RQcm9taXNlVG9GYWlsIiwiZmFpbCIsImV4cGVjdEFycmF5c0VxdWFsIiwiZXhwZWN0TnVtYmVyc0Nsb3NlIiwiZXhwZWN0VmFsdWVzSW5SYW5nZSIsImV4cGVjdEFycmF5QnVmZmVyc0VxdWFsIiwiZXhwZWN0IiwidG9FcXVhbCIsImVuY29kZVN0cmluZ3MiLCJ0cmFpbiIsInNnZCIsImFkYWRlbHRhIiwiYWRhZ3JhZCIsInJtc3Byb3AiLCJhZGFtYXgiLCJhZGFtIiwiUmFuayIsIlVwY2FzdEludDMyQW5kTWFwIiwiVXBjYXN0Qm9vbEFuZE1hcCIsIlVwY2FzdEZsb2F0MzJBbmRNYXAiLCJVcGNhc3RDb21wbGV4NjRBbmRNYXAiLCJ1cGNhc3RUeXBlTWFwIiwidHlwZUEiLCJ0eXBlQiIsInN1bU91dFR5cGUiLCJub0NvbnZlcnNpb25OZWVkZWQiLCJib29sIiwic2h1ZmZsZSIsInNodWZmbGVDb21ibyIsImFycmF5MiIsInJhbmRVbmlmb3JtIiwiZGlzdFNxdWFyZWQiLCJleHByIiwiZXJyb3JNZXNzYWdlUHJlZml4IiwiYXNzZXJ0Tm9uTnVsbCIsInNraXBUeXBlZEFycmF5IiwiaXNUeXBlZEFycmF5IiwiaXNTY2FsYXJTaGFwZSIsIm4xIiwibjIiLCJlMngiLCJjcmVhdGVTaHVmZmxlZEluZGljZXMiLCJzaHVmZmxlZEluZGljZXMiLCJyZXBlYXQiLCJjaGVja0ZuIiwiZGVsYXlGbiIsIm1heENvdW50ZXIiLCJ0cnlDb3VudCIsInRyeUZuIiwibmV4dEJhY2tvZmYiLCJzaGFwZVByb2QiLCJpbXBsaWNpdElkeCIsImF4IiwiaXNFbXB0eUFycmF5IiwiY2hlY2tDb252ZXJzaW9uRm9yRXJyb3JzIiwiaXNWYWxpZER0eXBlIiwib2xkVHlwZSIsIm5ld1R5cGUiLCJieXRlc0Zyb21TdHJpbmdBcnJheSIsImlzQm9vbGVhbiIsImlzTnVtYmVyIiwiaXNGdW5jdGlvbiIsIm5lYXJlc3REaXZpc29yIiwiY3JlYXRlTmVzdGVkQXJyYXkiLCJpc0NvbXBsZXgiLCJyZXN0IiwiYWNjIiwibWFrZU9uZXNUeXBlZEFycmF5IiwiYXNzZXJ0Tm9uTmVnYXRpdmVJbnRlZ2VyRGltZW5zaW9ucyIsImlzUHJvbWlzZSIsImI2NCIsImxlbnMiLCJnZXRMZW5zIiwidmFsaWRMZW4iLCJwbGFjZUhvbGRlcnNMZW4iLCJ0b0J5dGVBcnJheSIsInRtcCIsIkFyciIsIl9ieXRlTGVuZ3RoIiwiY3VyQnl0ZSIsInJldkxvb2t1cCIsImZyb21CeXRlQXJyYXkiLCJ1aW50OCIsImV4dHJhQnl0ZXMiLCJtYXhDaHVua0xlbmd0aCIsImxlbjIiLCJlbmNvZGVDaHVuayIsImxvb2t1cCIsImJhc2U2NCIsImllZWU3NTQiLCJrTWF4TGVuZ3RoIiwiVFlQRURfQVJSQVlfU1VQUE9SVCIsInRoYXQiLCJSYW5nZUVycm9yIiwiX19wcm90b19fIiwiZW5jb2RpbmdPck9mZnNldCIsImFsbG9jVW5zYWZlIiwiZnJvbUFycmF5TGlrZSIsImZyb21BcnJheUJ1ZmZlciIsImlzRW5jb2RpbmciLCJpc0J1ZmZlciIsImNoZWNrZWQiLCJjb3B5IiwiZnJvbU9iamVjdCIsImFzc2VydFNpemUiLCJpc1ZpZXciLCJsb3dlcmVkQ2FzZSIsInV0ZjhUb0J5dGVzIiwiYmFzZTY0VG9CeXRlcyIsInNsb3dUb1N0cmluZyIsImhleFNsaWNlIiwidXRmOFNsaWNlIiwiYXNjaWlTbGljZSIsImxhdGluMVNsaWNlIiwiYmFzZTY0U2xpY2UiLCJ1dGYxNmxlU2xpY2UiLCJiaWRpcmVjdGlvbmFsSW5kZXhPZiIsImFycmF5SW5kZXhPZiIsImluZGV4U2l6ZSIsImFyckxlbmd0aCIsInZhbExlbmd0aCIsInJlYWRVSW50MTZCRSIsImZvdW5kSW5kZXgiLCJoZXhXcml0ZSIsInJlbWFpbmluZyIsInN0ckxlbiIsInBhcnNlZCIsInBhcnNlSW50IiwidXRmOFdyaXRlIiwiYmxpdEJ1ZmZlciIsImFzY2lpV3JpdGUiLCJieXRlQXJyYXkiLCJhc2NpaVRvQnl0ZXMiLCJsYXRpbjFXcml0ZSIsImJhc2U2NFdyaXRlIiwidWNzMldyaXRlIiwidW5pdHMiLCJoaSIsImxvIiwidXRmMTZsZVRvQnl0ZXMiLCJzZWNvbmRCeXRlIiwidGhpcmRCeXRlIiwiZm91cnRoQnl0ZSIsInRlbXBDb2RlUG9pbnQiLCJmaXJzdEJ5dGUiLCJjb2RlUG9pbnQiLCJieXRlc1BlclNlcXVlbmNlIiwiY29kZVBvaW50cyIsIk1BWF9BUkdVTUVOVFNfTEVOR1RIIiwiZGVjb2RlQ29kZVBvaW50c0FycmF5IiwiU2xvd0J1ZmZlciIsImFsbG9jIiwiSU5TUEVDVF9NQVhfQllURVMiLCJmb28iLCJ0eXBlZEFycmF5U3VwcG9ydCIsInBvb2xTaXplIiwiX2F1Z21lbnQiLCJzcGVjaWVzIiwiYWxsb2NVbnNhZmVTbG93IiwiX2lzQnVmZmVyIiwiY29tcGFyZSIsInBvcyIsInN3YXAxNiIsInN3YXAzMiIsInN3YXA2NCIsImVxdWFscyIsImluc3BlY3QiLCJ0aGlzU3RhcnQiLCJ0aGlzRW5kIiwidGhpc0NvcHkiLCJ0YXJnZXRDb3B5IiwiaW5jbHVkZXMiLCJ0b0pTT04iLCJfYXJyIiwidG9IZXgiLCJjaGVja09mZnNldCIsImNoZWNrSW50Iiwib2JqZWN0V3JpdGVVSW50MTYiLCJsaXR0bGVFbmRpYW4iLCJvYmplY3RXcml0ZVVJbnQzMiIsImNoZWNrSUVFRTc1NCIsIndyaXRlRmxvYXQiLCJub0Fzc2VydCIsIndyaXRlRG91YmxlIiwibmV3QnVmIiwic2xpY2VMZW4iLCJyZWFkVUludExFIiwicmVhZFVJbnRCRSIsInJlYWRVSW50OCIsInJlYWRVSW50MTZMRSIsInJlYWRVSW50MzJMRSIsInJlYWRVSW50MzJCRSIsInJlYWRJbnRMRSIsInJlYWRJbnRCRSIsInJlYWRJbnQ4IiwicmVhZEludDE2TEUiLCJyZWFkSW50MTZCRSIsInJlYWRJbnQzMkxFIiwicmVhZEludDMyQkUiLCJyZWFkRmxvYXRMRSIsInJlYWRGbG9hdEJFIiwicmVhZERvdWJsZUxFIiwicmVhZERvdWJsZUJFIiwid3JpdGVVSW50TEUiLCJ3cml0ZVVJbnRCRSIsIndyaXRlVUludDgiLCJ3cml0ZVVJbnQxNkxFIiwid3JpdGVVSW50MTZCRSIsIndyaXRlVUludDMyTEUiLCJ3cml0ZVVJbnQzMkJFIiwid3JpdGVJbnRMRSIsImxpbWl0Iiwid3JpdGVJbnRCRSIsIndyaXRlSW50OCIsIndyaXRlSW50MTZMRSIsIndyaXRlSW50MTZCRSIsIndyaXRlSW50MzJMRSIsIndyaXRlSW50MzJCRSIsIndyaXRlRmxvYXRMRSIsIndyaXRlRmxvYXRCRSIsIndyaXRlRG91YmxlTEUiLCJ3cml0ZURvdWJsZUJFIiwidGFyZ2V0U3RhcnQiLCJJTlZBTElEX0JBU0U2NF9SRSIsImxlYWRTdXJyb2dhdGUiLCJzdHJpbmd0cmltIiwiYmFzZTY0Y2xlYW4iLCJpc0xFIiwibUxlbiIsIm5CeXRlcyIsImVMZW4iLCJlTWF4IiwiZUJpYXMiLCJuQml0cyIsInJ0IiwiTE4yIiwiSW5zdGFuY2UiLCJ1bnNpZ25lZCIsImlzTG9uZyIsIl9faXNMb25nX18iLCJJTlRfQ0FDSEUiLCJVSU5UX0NBQ0hFIiwiZnJvbUludCIsImNhY2hlZE9iaiIsImNhY2hlIiwiZnJvbUJpdHMiLCJaRVJPIiwiVFdPX1BXUl82NF9EQkwiLCJNQVhfVU5TSUdORURfVkFMVUUiLCJUV09fUFdSXzYzX0RCTCIsIk1JTl9WQUxVRSIsIk1BWF9WQUxVRSIsIlRXT19QV1JfMzJfREJMIiwibG93Qml0cyIsImhpZ2hCaXRzIiwicG93X2RibCIsInJhZGl4IiwicmFkaXhUb1Bvd2VyIiwicG93ZXIiLCJmcm9tVmFsdWUiLCJUV09fUFdSXzE2X0RCTCIsIlRXT19QV1JfMjQiLCJPTkUiLCJVT05FIiwiTkVHX09ORSIsIkxvbmdQcm90b3R5cGUiLCJ0b0ludCIsInRvTnVtYmVyIiwiaXNaZXJvIiwiaXNOZWdhdGl2ZSIsImVxIiwicmFkaXhMb25nIiwicmVtMSIsInJlbURpdiIsImRpZ2l0cyIsImdldEhpZ2hCaXRzIiwiZ2V0SGlnaEJpdHNVbnNpZ25lZCIsImdldExvd0JpdHMiLCJnZXROdW1CaXRzQWJzIiwiYml0IiwiZXF6IiwiaXNQb3NpdGl2ZSIsImlzT2RkIiwib3RoZXIiLCJub3RFcXVhbHMiLCJuZXEiLCJuZSIsImxlc3NUaGFuIiwiY29tcCIsImx0IiwibGVzc1RoYW5PckVxdWFsIiwibHRlIiwibGUiLCJncmVhdGVyVGhhbiIsImd0IiwiZ3JlYXRlclRoYW5PckVxdWFsIiwiZ3RlIiwiZ2UiLCJ0aGlzTmVnIiwib3RoZXJOZWciLCJuZWdhdGUiLCJub3QiLCJhZGRlbmQiLCJhNDgiLCJhMzIiLCJhMTYiLCJhMDAiLCJiNDgiLCJiMzIiLCJiMTYiLCJjNDgiLCJjMzIiLCJjMTYiLCJjMDAiLCJzdWJ0cmFjdCIsInN1YnRyYWhlbmQiLCJnZXRfaGlnaCIsImIwMCIsImRpdmlkZSIsImFwcHJveCIsImRpdl91IiwiZGl2X3MiLCJ0b1Vuc2lnbmVkIiwic2hyIiwiYXBwcm94UmVzIiwiYXBwcm94UmVtIiwicmVtX3UiLCJyZW1fcyIsInNoaWZ0TGVmdCIsIm51bUJpdHMiLCJzaGlmdFJpZ2h0Iiwic2hpZnRSaWdodFVuc2lnbmVkIiwic2hyX3UiLCJ0b1NpZ25lZCIsInRvQnl0ZXMiLCJ0b0J5dGVzTEUiLCJ0b0J5dGVzQkUiLCJmcm9tQnl0ZXNMRSIsImZyb21CeXRlc0JFIiwiY2FjaGVkU2V0VGltZW91dCIsImNhY2hlZENsZWFyVGltZW91dCIsImRlZmF1bHRTZXRUaW1vdXQiLCJkZWZhdWx0Q2xlYXJUaW1lb3V0IiwicnVuVGltZW91dCIsImZ1biIsImNsZWFyVGltZW91dCIsImN1cnJlbnRRdWV1ZSIsInF1ZXVlIiwiZHJhaW5pbmciLCJxdWV1ZUluZGV4IiwiY2xlYW5VcE5leHRUaWNrIiwiZHJhaW5RdWV1ZSIsIm1hcmtlciIsInJ1bkNsZWFyVGltZW91dCIsIkl0ZW0iLCJub29wIiwibmV4dFRpY2siLCJ0aXRsZSIsImJyb3dzZXIiLCJhZGRMaXN0ZW5lciIsIm9uY2UiLCJvZmYiLCJyZW1vdmVMaXN0ZW5lciIsInJlbW92ZUFsbExpc3RlbmVycyIsImVtaXQiLCJwcmVwZW5kTGlzdGVuZXIiLCJwcmVwZW5kT25jZUxpc3RlbmVyIiwibGlzdGVuZXJzIiwiYmluZGluZyIsImN3ZCIsImNoZGlyIiwidW1hc2siLCJhbGVhIiwieG9yMTI4IiwieG9yd293IiwieG9yc2hpZnQ3IiwieG9yNDA5NiIsInR5Y2hlaSIsInNyIiwiZGVmaW5lIiwiQWxlYSIsIm1lIiwibWFzaCIsInMwIiwiczEiLCJzMiIsImltcGwiLCJ4ZyIsInBybmciLCJpbnQzMiIsInF1aWNrIiwiWG9yR2VuIiwic3Ryc2VlZCIsIlgiLCJtYXRoIiwibm9kZWNyeXB0byIsInN0YXJ0ZGVub20iLCJzaWduaWZpY2FuY2UiLCJvdmVyZmxvdyIsInNlZWRyYW5kb20iLCJvcHRpb25zIiwic2hvcnRzZWVkIiwibWl4a2V5IiwiZW50cm9weSIsInRvc3RyaW5nIiwicmFuZG9tQnl0ZXMiLCJjcnlwdG8iLCJtc0NyeXB0byIsImdldFJhbmRvbVZhbHVlcyIsInBsdWdpbnMiLCJhdXRvc2VlZCIsImFyYzQiLCJBUkM0IiwiUyIsInBhc3MiLCJpc19tYXRoX2NhbGwiLCJrZXlsZW4iLCJwcm9wIiwidHlwIiwic21lYXIiLCJzdHJpbmdzZWVkIiwicmVnaXN0ZXJJbW1lZGlhdGUiLCJodG1sIiwibWVzc2FnZVByZWZpeCIsIm9uR2xvYmFsTWVzc2FnZSIsIm5leHRIYW5kbGUiLCJ0YXNrc0J5SGFuZGxlIiwiY3VycmVudGx5UnVubmluZ0FUYXNrIiwiZG9jIiwiYXR0YWNoVG8iLCJnZXRQcm90b3R5cGVPZiIsInJ1bklmUHJlc2VudCIsInBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXMiLCJvbGRPbk1lc3NhZ2UiLCJjYW5Vc2VQb3N0TWVzc2FnZSIsInBvcnQyIiwiZG9jdW1lbnRFbGVtZW50Iiwic2NyaXB0Iiwib25yZWFkeXN0YXRlY2hhbmdlIiwicmVtb3ZlQ2hpbGQiLCJhcHBlbmRDaGlsZCIsImF0dGFjaEV2ZW50IiwidGFzayIsImNsZWFySW1tZWRpYXRlIiwiVGltZW91dCIsImNsZWFyRm4iLCJfaWQiLCJfY2xlYXJGbiIsInNjb3BlIiwic2V0SW50ZXJ2YWwiLCJ1bnJlZiIsInJlZiIsImVucm9sbCIsIl9pZGxlVGltZW91dElkIiwiX2lkbGVUaW1lb3V0IiwidW5lbnJvbGwiLCJfdW5yZWZBY3RpdmUiLCJhY3RpdmUiLCJfb25UaW1lb3V0IiwiX193ZWJwYWNrX2FtZF9vcHRpb25zX18iLCJ3ZWJwYWNrUG9seWZpbGwiLCJkZXByZWNhdGUiLCJjaGlsZHJlbiIsIm1sIiwiTUwiLCJNTENvbnRleHQiLCJNTEdyYXBoQnVpbGRlciIsIk1MR3JhcGgiLCJNTE9wZXJhbmQiLCJNTFBvd2VyUHJlZmVyZW5jZSIsIk1MRGV2aWNlUHJlZmVyZW5jZSIsIm9wdGlvbnNfIiwiRXhlY3V0aW9uQ29udGV4dCIsImNvbnN0YW50VGVuc29ycyIsImlucHV0T3BlcmFuZHMiLCJvcGVyYW5kUmVmcyIsImNvbnN0YW50VGVub3Nyc18iLCJvcGVyYW5kUmVmc18iLCJhbGxvY2F0ZUlucHV0VGVuc29ycyIsIm91dHB1dFRlbnNvcnNfIiwib3V0cHV0T3BlcmFuZHNfIiwiaW5wdXRUZW5zb3JzXyIsImlucHV0T3BlcmFuZCIsImRlc2MiLCJyZXNvdXJjZSIsImRpbWVuc2lvbnMiLCJvdXRwdXRUZW5zb3JzIiwib3V0cHV0TmFtZSIsImdldFRlbnNvciIsInNldE91dHB1dFRlbnNvciIsInJlbGVhc2VUZW5zb3IiLCJvcGVyYW5kIiwib3BlcmFuZFRlbnNvck1hcCIsIm9wZXJhbmRUZW5zb3IiLCJpbnB1dHNfIiwib3V0cHV0c18iLCJjb25zdGFudHNfIiwiY29uc3RhbnRUZW5zb3JzXyIsInZhbGlkYXRlSW5wdXRzIiwib3V0cHV0T3BlcmFuZHMiLCJncmFwaCIsImJ1aWxkIiwiY29tcGlsZSIsInZpc2l0ZWRPcHMiLCJidWlsZE9wZXJhdGlvbiIsImFsbG9jYXRlQ29uc3RhbnRzIiwiY29tcHV0ZU9uY2UiLCJjb25zdGFudCIsImRpc3Bvc2VPcGVyYXRpb24iLCJNTElucHV0T3BlcmFuZExheW91dCIsIk1MRmlsdGVyT3BlcmFuZExheW91dCIsIk1MQXV0b1BhZCIsIk1MUmVjdXJyZW50TmV0d29ya1dlaWdodExheW91dCIsIk1MUmVjdXJyZW50TmV0d29ya0RpcmVjdGlvbiIsIk1MUGFkZGluZ01vZGUiLCJNTEludGVycG9sYXRpb25Nb2RlIiwiY29udGV4dF8iLCJidWlsZEFuZENvbXBpbGUiLCJkZXNjT3JWYWx1ZSIsInZhbHVlT3JUeXBlIiwiZmxvYXQzMiIsImNyZWF0ZVNjYWxhciIsImNyZWF0ZVRlbnNvciIsImJhdGNoTm9ybWFsaXphdGlvbiIsInZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIiLCJnZXRGdXNlZE91dHB1dHMiLCJvcGVyYW5kT3JPcHRpb25zIiwibWluVmFsdWUiLCJnZW1tIiwiZ3J1IiwicmVjdXJyZW50V2VpZ2h0IiwiaGlkZGVuU2l6ZSIsInJlY3VycmVudEJpYXMiLCJpbml0aWFsSGlkZGVuU3RhdGUiLCJncnVDZWxsIiwiaGlkZGVuU3RhdGUiLCJpbnN0YW5jZU5vcm1hbGl6YXRpb24iLCJtYXRtdWwiLCJwYWRkaW5nIiwiYXZlcmFnZVBvb2wyZCIsIm1heFBvb2wyZCIsInJlZHVjZUxvZ1N1bUV4cCIsInJlZHVjZU1heCIsInJlZHVjZU1lYW4iLCJyZWR1Y2VNaW4iLCJyZWR1Y2VQcm9kdWN0IiwicmVkdWNlU3VtIiwicmVzYW1wbGUiLCJzdGFydHMiLCJzaXplcyIsIm9wZXJhbmRzIiwiYnVpbGRlciIsIk1MT3BlcmFuZFR5cGUiLCJidWlsZGVyXyIsIklucHV0T3BlcmFuZCIsIkNvbnN0YW50T3BlcmFuZCIsIk91dHB1dE9wZXJhbmQiLCJPcGVyYXRpb24iLCJpbnB1dFRlbnNvcnMiLCJjb21wdXRlSW1wbCIsIlNpbmdsZU91dHB1dE9wZXJhdGlvbiIsImNyZWF0ZU91dHB1dCIsIkJhdGNoTm9ybWFsaXphdGlvbiIsImlucHV0XyIsInZhcmlhbmNlXyIsInNjYWxlXyIsImJpYXNfIiwiYXhpc18iLCJlcHNpbG9uXyIsImFjdGl2YXRpb25fIiwiQmluYXJ5IiwiYV8iLCJiXyIsInJ1bk9wIiwiTXVsIiwiRGl2IiwiTWF0TXVsIiwiQ2xhbXAiLCJ4XyIsIm1pbk9wZXJhbmRfIiwibWluU2NhbGFyVmFsdWVfIiwiZ2V0U2NhbGFyVmFsdWUiLCJtYXhPcGVyYW5kXyIsIm1heFNjYWxhclZhbHVlXyIsIm1pbnVzIiwibWluQ29uc3RhbnQiLCJDb252MmQiLCJmaWx0ZXJfIiwiYXV0b1BhZCIsImV4cGxpY2l0IiwiaW5pdE9wdGlvbnMiLCJncm91cHMiLCJpbnB1dExheW91dCIsImZpbHRlckxheW91dCIsIm91dHB1dFBhZGRpbmciLCJvdXRwdXRTaXplcyIsIm5jaHciLCJvaWh3IiwicGFkZGluZ18iLCJzdHJpZGVzXyIsImRpbGF0aW9uc18iLCJncm91cHNfIiwiaW5wdXRMYXlvdXRfIiwiZmlsdGVyTGF5b3V0XyIsImF1dG9QYWRfIiwib3V0cHV0UGFkZGluZ18iLCJvdXRwdXRTaXplc18iLCJmdXNlZEFjdGl2YXRpb25fIiwiaXNSZWx1NiIsImxlYWt5cmVsdUFscGhhXyIsIm1pblNjYWxhclZhbHVlIiwibWF4U2NhbGFyVmFsdWUiLCJmdXNlZCIsImZpbHRlclRlbnNvcl8iLCJvaHdpIiwiaWh3byIsImZ1c2VkRGVwdGh3aXNlUGFkIiwiR2VtbSIsImFUcmFuc3Bvc2UiLCJiVHJhbnNwb3NlIiwiYWIiLCJHcnUiLCJ3ZWlnaHRfIiwicmVjdXJyZW50V2VpZ2h0XyIsInN0ZXBzXyIsImhpZGRlblNpemVfIiwicmVzZXRBZnRlciIsInJldHVyblNlcXVlbmNlIiwiZGlyZWN0aW9uIiwibGF5b3V0IiwiYWN0aXZhdGlvbnMiLCJyZXR1cm5TZXF1ZW5jZV8iLCJmb3J3YXJkIiwienJuIiwicmVjdXJyZW50Qmlhc18iLCJpbml0aWFsSGlkZGVuU3RhdGVfIiwicmVzZXRBZnRlcl8iLCJkaXJlY3Rpb25fIiwibGF5b3V0XyIsImFjdGl2YXRpb25zXyIsIm51bURpcmVjdGlvbnMiLCJib3RoIiwic2VxdWVuY2UiLCJjZWxsV2VpZ2h0IiwiY2VsbFJlY3VycmVudFdlaWdodCIsImNlbGxCaWFzIiwiY2VsbFJlY3VycmVudEJpYXMiLCJzbG90IiwiY2VsbEhpZGRlbiIsImNlbGxPdXRwdXQiLCJiYWNrd2FyZCIsImNlbGxJbnB1dCIsIkdydUNlbGwiLCJoaWRkZW5TdGF0ZV8iLCJhY3RpdmF0aW9uMCIsImFjdGl2YXRpb24xIiwiSW5zdGFuY2VOb3JtYWxpemF0aW9uIiwibmh3YyIsInNjYWxlZCIsImFscGhhXyIsIlBhZCIsIm1vZGVfIiwidmFsdWVfIiwicGFkZGluZ0FycmF5IiwiZWRnZSIsImVkZ2VQYWRkaW5ncyIsInBhZGRlZCIsInJlZmxlY3Rpb24iLCJzeW1tZXRyaWMiLCJ3aW5kb3dEaW1lbnNpb25zIiwid2luZG93RGltZW5zaW9uc18iLCJnZXRQb29saW5nVHlwZSIsInRvdGFsUGFkZGluZyIsIkF2ZXJhZ2VQb29sMmQiLCJNYXhQb29sMmQiLCJSZWR1Y2UiLCJheGVzXyIsImtlZXBEaW1lbnNpb25zIiwia2VlcERpbWVuc2lvbnNfIiwiUmVkdWNlTG9nU3VtRXhwIiwiUmVkdWNlTWF4IiwiUmVkdWNlTWVhbiIsIlJlZHVjZU1pbiIsIlJlZHVjZVByb2R1Y3QiLCJSZWR1Y2VTdW0iLCJSZXNhbXBsZSIsInNjYWxlcyIsInNjYWxlc18iLCJzaXplc18iLCJuZXdTaGFwZV8iLCJzdGFydHNfIiwiU3BsaXQiLCJzcGxpdHNfIiwiU3F1ZWV6ZSIsInBlcm11dGF0aW9uXyIsIlVuYXJ5IiwiVW5hcnlNTE9wZXJhdG9yIiwiaXNJbnRlZ2VyQXJyYXkiLCJnZXRUeXBlZEFycmF5IiwiY2xvbmVUeXBlZEFycmF5IiwiZ2V0RGF0YVR5cGUiLCJjcmVhdGVPcGVyYW5kRGVzY3JpcHRvckZyb21UZW5zb3IiLCJ2YWxpZGF0ZU9wZXJhbmREZXNjcmlwdG9yIiwiaXNEeWFubWljU2hhcGUiLCJ2YWxpZGF0ZVR5cGVkQXJyYXkiLCJzaXplRnJvbURpbWVuc2lvbnMiLCJ2YWxpZGF0ZVZhbHVlVHlwZSIsInVpbnQzMiIsImludDgiLCJjbG9uZWRBcnJheSIsImN1cnJlbnRWYWx1ZSIsInZhbGlkYXRlT3BlcmFuZCIsInZhbGlkYXRlT3B0aW9uYWxPcGVyYW5kIiwidmFsaWRhdGVBeGVzIiwiZ2V0UGFkZGluZ3MiLCJyZXN1bHRQYWRkaW5nIl0sIm1hcHBpbmdzIjoiYUFDRSxJQUFJQSxFQUFtQixHQUd2QixTQUFTQyxFQUFvQkMsR0FHNUIsR0FBR0YsRUFBaUJFLEdBQ25CLE9BQU9GLEVBQWlCRSxHQUFVQyxRQUduQyxJQUFJQyxFQUFTSixFQUFpQkUsR0FBWSxDQUN6Q0csRUFBR0gsRUFDSEksR0FBRyxFQUNISCxRQUFTLElBVVYsT0FOQUksRUFBUUwsR0FBVU0sS0FBS0osRUFBT0QsUUFBU0MsRUFBUUEsRUFBT0QsUUFBU0YsR0FHL0RHLEVBQU9FLEdBQUksRUFHSkYsRUFBT0QsUUFLZkYsRUFBb0JRLEVBQUlGLEVBR3hCTixFQUFvQlMsRUFBSVYsRUFHeEJDLEVBQW9CVSxFQUFJLFNBQVNSLEVBQVNTLEVBQU1DLEdBQzNDWixFQUFvQmEsRUFBRVgsRUFBU1MsSUFDbENHLE9BQU9DLGVBQWVi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SzNDLFlBQXlCL0IsRUFBaUIsU0FBRSxXQUFXLE9BQWdCQSxFQUFpQixTQUFFQSxFQUFZLElBQU0sSUFBRzBFLE1BQU0sS0FBSzNDLFlBQThCL0IsRUFBc0IsY0FBRSxXQUFXLE9BQXFCQSxFQUFzQixjQUFFQSxFQUFZLElBQU0sSUFBRzBFLE1BQU0sS0FBSzNDLFlBQTJCL0IsRUFBbUIsV0FBRSxXQUFXLE9BQWtCQSxFQUFtQixXQUFFQSxFQUFZLElBQU0sSUFBRzBFLE1BQU0sS0FBSzNDLFlBQXNCL0IsRUFBYyxNQUFFLFdBQVcsT0FBYUEsRUFBYyxNQUFFQSxFQUFZLElBQU0sSUFBRzBFLE1BQU0sS0FBSzNDLFlBQTJCL0IsRUFBbUIsV0FBRSxXQUFXLE9BQWtCQSxFQUFtQixXQUFFQSxFQUFZLElBQU0sSUFBRzBFLE1BQU0sS0FBSzNDLFlBQXFCL0IsRUFBYSxLQUFFLFdBQVcsT0FBWUEsRUFBYSxLQUFFQSxFQUFZLElBQU0sSUFBRzBFLE1BQU0sS0FBSzNDLFlBQTRCL0IsRUFBb0IsWUFBRSxXQUFXLE9BQW1CQSxFQUFvQixZQUFFQSxFQUFZLElBQU0sSUFBRzBFLE1BQU0sS0FBSzNDLFlBQXFCL0IsRUFBYSxLQUFFLFdBQVcsT0FBWUEsRUFBYSxLQUFFQSxFQUFZLElBQU0sSUFBRzBFLE1BQU0sS0FBSzNDLFlBQXlCL0IsRUFBaUIsU0FBRSxXQUFXLE9BQWdCQSxFQUFpQixTQUFFQSxFQUFZLElBQU0sSUFBRzBFLE1BQU0sS0FBSzNDLFlBQXlCL0IsRUFBaUIsU0FBRSxXQUFXLE9BQWdCQSxFQUFpQixTQUFFQSxFQUFZLElBQU0sSUFBRzBFLE1BQU0sS0FBSzNDLFlBQXNCL0IsRUFBYyxNQUFFLFdBQVcsT0FBYUEsRUFBYyxNQUFFQSxFQUFZLElBQU0sSUFBRzBFLE1BQU0sS0FBSzNDLFlBQXFCL0IsRUFBYSxLQUFFLFdBQVcsT0FBWUEsRUFBYSxLQUFFQSxFQUFZLElBQU0sSUFBRzBFLE1BQU0sS0FBSzNDLFlBQXlCL0IsRUFBaUIsU0FBRSxXQUFXLE9BQWdCQSxFQUFpQixTQUFFQSxFQUFZ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QUFHM3lHLEVBQWFBLEVBQU0sU0FBU29nSCxHQUFTOWdILEdBQU0sT0FBT0EsR0FBTSxLQUFLLEdBQUcsT0FBTyxNQUFNLEtBQUssR0FBOEIsT0FBTzgxRyxPQUFrQixLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssR0FBRyxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssR0FBRyxLQUFLLElBQUksS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLElBQUksS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssRUFBRSxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxJQUFJLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssSUFBSSxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLE9BQU8sT0FBTyxLQUFLLEdBQUcsS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLElBQUksS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLE9BQU8sRUFBRSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssRUFBRSxLQUFLLElBQUksS0FBSyxFQUFFLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxHQUFHLEtBQUssR0FBRyxPQUFPLEVBQUUsS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssRUFBRSxPQUFPLEtBQUssS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsT0FBTyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLE9BQU8sV0FBVyxLQUFLLEdBQUcsS0FBSyxFQUFFLE9BQU8sTUFBTSxLQUFLLEdBQUcsS0FBSyxHQUFHLE9BQU8sR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLE9BQU8sS0FBSyxLQUFLLEVBQUUsT0FBTyxRQUFRLEtBQUssRUFBRSxPQUFPLE1BQU0sS0FBSyxHQUFHLE9BQU8sTUFBTSxLQUFLLEdBQUcsT0FBTyxNQUFNLEtBQUssR0FBRyxPQUFPLE1BQU0sS0FBSyxHQUFHLE9BQU8sSUFBSSxLQUFLLEdBQUcsT0FBTyxJQUFJLEtBQUssR0FBRyxPQUFPLElBQUksS0FBSyxHQUFHLE9BQU8sSUFBSSxLQUFLLEVBQUUsT0FBTyxJQUFJLEtBQUssSUFBSSxPQUFPLEdBQUcsS0FBSyxHQUFHLE9BQU8sR0FBRyxLQUFLLEVBQUUsT0FBTyxHQUFHLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxHQUFHLE9BQU8sRUFBRSxLQUFLLEdBQUksTUFBc0IsaUJBQVpqRyxXQUE0QkEsVUFBK0IscUJBQVksRUFBZ0IsT0FBYnVELEdBQVMsS0FBVyxFQUFFLElBQWkyVzJOLEdBQTcxV3hULEdBQWMsQ0FBQyxFQUFJb0csR0FBTyxFQUFJZSxHQUF1QixFQUFJaUIsR0FBd0IsRUFBSXFKLEdBQVUsRUFBSUUsR0FBUyxFQUFJSyxHQUFVLEVBQUlrQixHQUFnQixFQUFJSyxJQUFtQzNVLElBQWpCbUIsS0FBb0M5SSxFQUEyQixtQkFBRSxXQUFXLE9BQU8ySCxHQUFtQjNILEVBQTJCLG1CQUFFQSxFQUFZLElBQUssR0FBRzBFLE1BQU0sS0FBSzNDLGFBQXk5VThNLElBQW44VTdPLEVBQWMsTUFBRSxXQUFXLE9BQWFBLEVBQWMsTUFBRUEsRUFBWSxJQUFLLEdBQUcwRSxNQUFNLEtBQUszQyxZQUFpQy9CLEVBQXlCLGlCQUFFLFdBQVcsT0FBd0JBLEVBQXlCLGlCQUFFQSxFQUFZLElBQUssR0FBRzBFLE1BQU0sS0FBSzNDLFlBQThCL0IsRUFBc0IsY0FBRSxXQUFXLE9BQXFCQSxFQUFzQixjQUFFQSxFQUFZLElBQUssR0FBRzBFLE1BQU0sS0FBSzNDLFlBQXlCL0IsRUFBaUIsU0FBRSxXQUFXLE9BQWdCQSxFQUFpQixTQUFFQSxFQUFZLElBQUssR0FBRzBFLE1BQU0sS0FBSzNDLFlBQXFCL0IsRUFBYSxLQUFFLFdBQVcsT0FBWUEsRUFBYSxLQUFFQSxFQUFZLElBQUssR0FBRzBFLE1BQU0sS0FBSzNDLFlBQXFCL0IsRUFBYSxLQUFFLFdBQVcsT0FBWUEsRUFBYSxLQUFFQSxFQUFZLElBQUssR0FBRzBFLE1BQU0sS0FBSzNDLFlBQXNCL0IsRUFBYyxNQUFFLFdBQVcsT0FBYUEsRUFBYyxNQUFFQSxFQUFZLElBQUssR0FBRzBFLE1BQU0sS0FBSzNDLFlBQXFCL0IsRUFBYSxLQUFFLFdBQVcsT0FBWUEsRUFBYSxLQUFFQSxFQUFZLElBQUssR0FBRzBFLE1BQU0sS0FBSzNDLFlBQXFCL0IsRUFBYSxLQUFFLFdBQVcsT0FBWUEsRUFBYSxLQUFFQSxFQUFZLElBQUssR0FBRzBFLE1BQU0sS0FBSzNDLFlBQXdCL0IsRUFBZ0IsUUFBRSxXQUFXLE9BQWVBLEVBQWdCLFFBQUVBLEVBQVksSUFBSyxHQUFHMEUsTUFBTSxLQUFLM0MsWUFBeUIvQixFQUFpQixTQUFFLFdBQVcsT0FBZ0JBLEVBQWlCLFNBQUVBLEVBQVksSUFBSyxHQUFHMEUsTUFBTSxLQUFLM0MsWUFBNkIvQixFQUFxQixhQUFFLFdBQVcsT0FBb0JBLEVBQXFCLGFBQUVBLEVBQVksSUFBSyxHQUFHMEUsTUFBTSxLQUFLM0MsWUFBc0IvQixFQUFjLE1BQUUsV0FBVyxPQUFhQSxFQUFjLE1BQUVBLEVBQVksSUFBSyxHQUFHMEUsTUFBTSxLQUFLM0MsWUFBNkIvQixFQUFxQixhQUFFLFdBQVcsT0FBb0JBLEVBQXFCLGFBQUVBLEVBQVksSUFBSyxHQUFHMEUsTUFBTSxLQUFLM0MsWUFBd0IvQixFQUFnQixRQUFFLFdBQVcsT0FBZUEsRUFBZ0IsUUFBRUEsRUFBWSxJQUFLLEdBQUcwRSxNQUFNLEtBQUszQyxZQUFxQy9CLEVBQTZCLHFCQUFFLFdBQVcsT0FBNEJBLEVBQTZCLHFCQUFFQSxFQUFZLElBQUssR0FBRzBFLE1BQU0sS0FBSzNDLFlBQXFCL0IsRUFBYSxLQUFFLFdBQVcsT0FBWUEsRUFBYSxLQUFFQSxFQUFZLElBQUssR0FBRzBFLE1BQU0sS0FBSzNDLFlBQXNCL0IsRUFBYyxNQUFFLFdBQVcsT0FBYUEsRUFBYyxNQUFFQSxFQUFZLElBQUssR0FBRzBFLE1BQU0sS0FBSzNDLFlBQStCL0IsRUFBdUIsZUFBRSxXQUFXLE9BQXNCQSxFQUF1QixlQUFFQSxFQUFZLElBQUssR0FBRzBFLE1BQU0sS0FBSzNDLFlBQXdCL0IsRUFBZ0IsUUFBRSxXQUFXLE9BQWVBLEVBQWdCLFFBQUVBLEVBQVksSUFBSyxHQUFHMEUsTUFBTSxLQUFLM0MsWUFBOEIvQixFQUFzQixjQUFFLFdBQVcsT0FBcUJBLEVBQXNCLGNBQUVBLEVBQVksSUFBSyxHQUFHMEUsTUFBTSxLQUFLM0MsWUFBdUMvQixFQUErQix1QkFBRSxXQUFXLE9BQThCQSxFQUErQix1QkFBRUEsRUFBWSxJQUFLLEdBQUcwRSxNQUFNLEtBQUszQyxZQUF1Qi9CLEVBQWUsT0FBRSxXQUFXLE9BQWNBLEVBQWUsT0FBRUEsRUFBWSxJQUFLLEdBQUcwRSxNQUFNLEtBQUszQyxZQUFxQi9CLEVBQWEsS0FBRSxXQUFXLE9BQVlBLEVBQWEsS0FBRUEsRUFBWSxJQUFLLEdBQUcwRSxNQUFNLEtBQUszQyxZQUErQi9CLEVBQXVCLGVBQUUsV0FBVyxPQUFzQkEsRUFBdUIsZUFBRUEsRUFBWSxJQUFLLEdBQUcwRSxNQUFNLEtBQUszQyxZQUF1Qi9CLEVBQWUsT0FBRSxXQUFXLE9BQWNBLEVBQWUsT0FBRUEsRUFBWSxJQUFLLEdBQUcwRSxNQUFNLEtBQUszQyxZQUEwQi9CLEVBQWtCLFVBQUUsV0FBVyxPQUFpQkEsRUFBa0IsVUFBRUEsRUFBWSxJQUFLLEdBQUcwRSxNQUFNLEtBQUszQyxZQUFnQy9CLEVBQXdCLGdCQUFFLFdBQVcsT0FBdUJBLEVBQXdCLGdCQUFFQSxFQUFZLElBQUssR0FBRzBFLE1BQU0sS0FBSzNDLFlBQTZCL0IsRUFBcUIsYUFBRSxXQUFXLE9BQW9CQSxFQUFxQixhQUFFQSxFQUFZLElBQUssR0FBRzBFLE1BQU0sS0FBSzNDLFlBQXNDL0IsRUFBOEIsc0JBQUUsV0FBVyxPQUE2QkEsRUFBOEIsc0JBQUVBLEVBQVksSUFBSyxHQUFHMEUsTUFBTSxLQUFLM0MsWUFBd0IvQixFQUFnQixRQUFFLFdBQVcsT0FBZUEsRUFBZ0IsUUFBRUEsRUFBWSxJQUFLLEdBQUcwRSxNQUFNLEtBQUszQyxZQUEwQi9CLEVBQWtCLFVBQUUsV0FBVyxPQUFpQkEsRUFBa0IsVUFBRUEsRUFBWSxJQUFLLEdBQUcwRSxNQUFNLEtBQUszQyxZQUF5Qi9CLEVBQWlCLFNBQUUsV0FBVyxPQUFnQkEsRUFBaUIsU0FBRUEsRUFBWSxJQUFLLEdBQUcwRSxNQUFNLEtBQUszQyxZQUE4Qi9CLEVBQXNCLGNBQUUsV0FBVyxPQUFxQkEsRUFBc0IsY0FBRUEsRUFBWSxJQUFLLEdBQUcwRSxNQUFNLEtBQUszQyxZQUEyQi9CLEVBQW1CLFdBQUUsV0FBVyxPQUFrQkEsRUFBbUIsV0FBRUEsRUFBWSxJQUFLLEdBQUcwRSxNQUFNLEtBQUszQyxZQUFzQi9CLEVBQWMsTUFBRSxXQUFXLE9BQWFBLEVBQWMsTUFBRUEsRUFBWSxJQUFLLEdBQUcwRSxNQUFNLEtBQUszQyxZQUEyQi9CLEVBQW1CLFdBQUUsV0FBVyxPQUFrQkEsRUFBbUIsV0FBRUEsRUFBWSxJQUFLLEdBQUcwRSxNQUFNLEtBQUszQyxZQUFxQi9CLEVBQWEsS0FBRSxXQUFXLE9BQVlBLEVBQWEsS0FBRUEsRUFBWSxJQUFLLEdBQUcwRSxNQUFNLEtBQUszQyxZQUE0Qi9CLEVBQW9CLFlBQUUsV0FBVyxPQUFtQkEsRUFBb0IsWUFBRUEsRUFBWSxJQUFLLEdBQUcwRSxNQUFNLEtBQUszQyxZQUFxQi9CLEVBQWEsS0FBRSxXQUFXLE9BQVlBLEVBQWEsS0FBRUEsRUFBWSxJQUFLLEdBQUcwRSxNQUFNLEtBQUszQyxZQUF5Qi9CLEVBQWlCLFNBQUUsV0FBVyxPQUFnQkEsRUFBaUIsU0FBRUEsRUFBWSxJQUFLLEdBQUcwRSxNQUFNLEtBQUszQyxZQUF5Qi9CLEVBQWlCLFNBQUUsV0FBVyxPQUFnQkEsRUFBaUIsU0FBRUEsRUFBWSxJQUFLLEdBQUcwRSxNQUFNLEtBQUszQyxZQUFzQi9CLEVBQWMsTUFBRSxXQUFXLE9BQWFBLEVBQWMsTUFBRUEsRUFBWSxJQUFLLEdBQUcwRSxNQUFNLEtBQUszQyxZQUFxQi9CLEVBQWEsS0FBRSxXQUFXLE9BQVlBLEVBQWEsS0FBRUEsRUFBWSxJQUFNLElBQUcwRSxNQUFNLEtBQUszQyxZQUF5Qi9CLEVBQWlCLFNBQUUsV0FBVyxPQUFnQkEsRUFBaUIsU0FBRUEsRUFBWSxJQUFNLElBQUcwRSxNQUFNLEtBQUszQyxZQUEyQi9CLEVBQW1CLFdBQUUsV0FBVyxPQUFrQkEsRUFBbUIsV0FBRUEsRUFBWSxJQUFNLElBQUcwRSxNQUFNLEtBQUszQyxZQUEwQi9CLEVBQWtCLFVBQUUsV0FBVyxPQUFpQkEsRUFBa0IsVUFBRUEsRUFBWSxJQUFNLElBQUcwRSxNQUFNLEtBQUszQyxZQUFxQi9CLEVBQWEsS0FBRSxXQUFXLE9BQVlBLEVBQWEsS0FBRUEsRUFBWSxJQUFNLElBQUcwRSxNQUFNLEtBQUszQyxZQUFxQy9CLEVBQTZCLHFCQUFFLFdBQVcsT0FBNEJBLEVBQTZCLHFCQUFFQSxFQUFZLElBQU0sSUFBRzBFLE1BQU0sS0FBSzNDLFlBQXFDL0IsRUFBNkIscUJBQUUsV0FBVyxPQUE0QkEsRUFBNkIscUJBQUVBLEVBQVksSUFBTSxJQUFHMEUsTUFBTSxLQUFLM0MsWUFBcUMvQixFQUE2QixxQkFBRSxXQUFXLE9BQTRCQSxFQUE2QixxQkFBRUEsRUFBWSxJQUFNLElBQUcwRSxNQUFNLEtBQUszQyxZQUEwQi9CLEVBQWtCLFVBQUUsV0FBVyxPQUFpQkEsRUFBa0IsVUFBRUEsRUFBWSxJQUFNLElBQUcwRSxNQUFNLEtBQUszQyxZQUF3Qi9CLEVBQWdCLFFBQUUsV0FBVyxPQUFlQSxFQUFnQixRQUFFQSxFQUFZLElBQU0sSUFBRzBFLE1BQU0sS0FBSzNDLFlBQXVCL0IsRUFBZSxPQUFFLFdBQVcsT0FBY0EsRUFBZSxPQUFFQSxFQUFZLElBQU0sSUFBRzBFLE1BQU0sS0FBSzNDLFlBQXFCL0IsRUFBYSxLQUFFLFdBQVcsT0FBWUEsRUFBYSxLQUFFQSxFQUFZLElBQU0sSUFBRzBFLE1BQU0sS0FBSzNDLFlBQXVCL0IsRUFBZSxPQUFFLFdBQVcsT0FBY0EsRUFBZSxPQUFFQSxFQUFZLElBQU0sSUFBRzBFLE1BQU0sS0FBSzNDLFlBQXNCL0IsRUFBYyxNQUFFLFdBQVcsT0FBYUEsRUFBYyxNQUFFQSxFQUFZLElBQU0sSUFBRzBFLE1BQU0sS0FBSzNDLFlBQXlCL0IsRUFBaUIsU0FBRSxXQUFXLE9BQWdCQSxFQUFpQixTQUFFQSxFQUFZLElBQU0sSUFBRzBFLE1BQU0sS0FBSzNDLFlBQXNCL0IsRUFBYyxNQUFFLFdBQVcsT0FBYUEsRUFBYyxNQUFFQSxFQUFZLElBQU0sSUFBRzBFLE1BQU0sS0FBSzNDLFlBQXVCL0IsRUFBZSxPQUFFLFdBQVcsT0FBY0EsRUFBZSxPQUFFQSxFQUFZLElBQU0sSUFBRzBFLE1BQU0sS0FBSzNDLFlBQWdDL0IsRUFBd0IsZ0JBQUUsV0FBVyxPQUF1QkEsRUFBd0IsZ0JBQUVBLEVBQVksSUFBTSxJQUFHMEUsTUFBTSxLQUFLM0MsWUFBeUIvQixFQUFpQixTQUFFLFdBQVcsT0FBZ0JBLEVBQWlCLFNBQUVBLEVBQVksSUFBTSxJQUFHMEUsTUFBTSxLQUFLM0MsWUFBa0MvQixFQUEwQixrQkFBRSxXQUFXLE9BQXlCQSxFQUEwQixrQkFBRUEsRUFBWSxJQUFNLElBQUcwRSxNQUFNLEtBQUszQyxZQUF1Qi9CLEVBQWUsT0FBRSxXQUFXLE9BQWNBLEVBQWUsT0FBRUEsRUFBWSxJQUFNLElBQUcwRSxNQUFNLEtBQUszQyxZQUF1Qi9CLEVBQWUsT0FBRSxXQUFXLE9BQWNBLEVBQWUsT0FBRUEsRUFBWSxJQUFNLElBQUcwRSxNQUFNLEtBQUszQyxZQUEyQi9CLEVBQW1CLFdBQUUsV0FBVyxPQUFrQkEsRUFBbUIsV0FBRUEsRUFBWSxJQUFNLElBQUcwRSxNQUFNLEtBQUszQyxZQUEwQi9CLEVBQWtCLFVBQUUsV0FBVyxPQUFpQkEsRUFBa0IsVUFBRUEsRUFBWSxJQUFNLElBQUcwRSxNQUFNLEtBQUszQyxZQUF5Qi9CLEVBQWlCLFNBQUUsV0FBVyxPQUFnQkEsRUFBaUIsU0FBRUEsRUFBWSxJQUFNLElBQUcwRSxNQUFNLEtBQUszQyxZQUFxQi9CLEVBQWEsS0FBRSxXQUFXLE9BQVlBLEVBQWEsS0FBRUEsRUFBWSxJQUFNLElBQUcwRSxNQUFNLEtBQUszQyxZQUF5Qi9CLEVBQWlCLFNBQUUsV0FBVyxPQUFnQkEsRUFBaUIsU0FBRUEsRUFBWSxJQUFNLElBQUcwRSxNQUFNLEtBQUszQyxZQUFzQi9CLEVBQWMsTUFBRSxXQUFXLE9BQWFBLEVBQWMsTUFBRUEsRUFBWSxJQUFNLElBQUcwRSxNQUFNLEtBQUszQyxZQUF3Qi9CLEVBQWdCLFFBQUUsV0FBVyxPQUFlQSxFQUFnQixRQUFFQSxFQUFZLElBQU0sSUFBRzBFLE1BQU0sS0FBSzNDLFlBQW1DL0IsRUFBMkIsbUJBQUUsV0FBVyxPQUEwQkEsRUFBMkIsbUJBQUVBLEVBQVksSUFBTSxJQUFHMEUsTUFBTSxLQUFLM0MsWUFBc0IvQixFQUFjLE1BQUUsV0FBVyxPQUFhQSxFQUFjLE1BQUVBLEVBQVksSUFBTSxJQUFHMEUsTUFBTSxLQUFLM0MsWUFBOEIvQixFQUFzQixjQUFFLFdBQVcsT0FBcUJBLEVBQXNCLGNBQUVBLEVBQVksSUFBTSxJQUFHMEUsTUFBTSxLQUFLM0MsWUFBcUIvQixFQUFhLEtBQUUsV0FBVyxPQUFZQSxFQUFhLEtBQUVBLEVBQVksSUFBTSxJQUFHMEUsTUFBTSxLQUFLM0MsWUFBcUIvQixFQUFhLEtBQUUsV0FBVyxPQUFZQSxFQUFhLEtBQUVBLEVBQVksSUFBTSxJQUFHMEUsTUFBTSxLQUFLM0MsWUFBcUIvQixFQUFhLEtBQUUsV0FBVyxPQUFZQSxFQUFhLEtBQUVBLEVBQVksSUFBTSxJQUFHMEUsTUFBTSxLQUFLM0MsWUFBc0IvQixFQUFjLE1BQUUsV0FBVyxPQUFhQSxFQUFjLE1BQUVBLEVBQVksSUFBTSxJQUFHMEUsTUFBTSxLQUFLM0MsWUFBc0IvQixFQUFjLE1BQUUsV0FBVyxPQUFhQSxFQUFjLE1BQUVBLEVBQVksSUFBTSxJQUFHMEUsTUFBTSxLQUFLM0MsWUFBc0IvQixFQUFjLE1BQUUsV0FBVyxPQUFhQSxFQUFjLE1BQUVBLEVBQVksSUFBTSxJQUFHMEUsTUFBTSxLQUFLM0MsWUFBMkIvQixFQUFtQixXQUFFLFdBQVcsT0FBa0JBLEVBQW1CLFdBQUVBLEVBQVksSUFBTSxJQUFHMEUsTUFBTSxLQUFLM0MsWUFBMkIvQixFQUFtQixXQUFFLFdBQVcsT0FBa0JBLEVBQW1CLFdBQUVBLEVBQVksSUFBTSxJQUFHMEUsTUFBTSxLQUFLM0MsWUFBOEIvQixFQUFzQixjQUFFLFdBQVcsT0FBcUJBLEVBQXNCLGNBQUVBLEVBQVksSUFBTSxJQUFHMEUsTUFBTSxLQUFLM0MsWUFBd0IvQixFQUFnQixRQUFFLFdBQVcsT0FBZUEsRUFBZ0IsUUFBRUEsRUFBWSxJQUFNLElBQUcwRSxNQUFNLEtBQUszQyxZQUFzQi9CLEVBQWMsTUFBRSxXQUFXLE9BQWFBLEVBQWMsTUFBRUEsRUFBWSxJQUFNLElBQUcwRSxNQUFNLEtBQUszQyxZQUFrQy9CLEVBQTBCLGtCQUFFLFdBQVcsT0FBTzZPLEdBQWtCN08sRUFBMEIsa0JBQUVBLEVBQVksSUFBTSxJQUFHMEUsTUFBTSxLQUFLM0MsYUFBZ0IwQyxHQUFVekUsRUFBa0IsVUFBRSxXQUFXLE9BQU95RSxHQUFVekUsRUFBa0IsVUFBRUEsRUFBWSxJQUFNLElBQUcwRSxNQUFNLEtBQUszQyxZQUFnQitDLEdBQWE5RSxFQUFxQixhQUFFLFdBQVcsT0FBTzhFLEdBQWE5RSxFQUFxQixhQUFFQSxFQUFZLElBQU0sSUFBRzBFLE1BQU0sS0FBSzNDLFlBQWdCcUMsR0FBV3BFLEVBQW1CLFdBQUUsV0FBVyxPQUFPb0UsR0FBV3BFLEVBQW1CLFdBQUVBLEVBQVksSUFBTSxJQUFHMEUsTUFBTSxLQUFLM0MsWUFBZ0QsU0FBU0wsR0FBV3RnRixHQUFRL2pCLEtBQUs3QixLQUFLLGFBQWE2QixLQUFLNDFGLFFBQVEsZ0NBQWdDN3hFLEVBQU8sSUFBSS9qQixLQUFLK2pCLE9BQU9BLEVBQXFILFNBQVNvN0YsR0FBSTdsRixHQUErRixTQUFTOGxGLElBQVdGLEtBQWlCQSxJQUFVLEVBQUt2YyxFQUFrQixXQUFFLEVBQVEwRCxJQUFhMEQsSUFBY0MsSUFBVXZILEVBQW9CRSxHQUFXQSxFQUE2QixzQkFBRUEsRUFBNkIsdUJBQUl1SCxNQUE3UzV3RSxFQUFLQSxHQUFNdXBFLEVBQWMwSCxHQUFnQixJQUFVWCxJQUFZVyxHQUFnQixJQUEyTzVILEVBQWtCLFdBQUdBLEVBQWtCLFVBQUUsY0FBYzRKLFlBQVcsV0FBV0EsWUFBVyxXQUFXNUosRUFBa0IsVUFBRSxNQUFLLEdBQUd5YyxNQUFTLElBQVFBLE1BQTJCLEdBQXh3QnpjLEVBQWMsTUFBRTdNLEVBQWtKMlUsR0FBc0IsU0FBUzZVLElBQWdCSixJQUFVQyxLQUFVRCxLQUFVelUsR0FBc0I2VSxJQUFpZjNjLEVBQVksSUFBRXdjLEdBQU94YyxFQUFnQixRQUFpRixJQUFqRCxtQkFBbkJBLEVBQWdCLFVBQWNBLEVBQWdCLFFBQUUsQ0FBQ0EsRUFBZ0IsVUFBU0EsRUFBZ0IsUUFBRWpoRyxPQUFPLEdBQUdpaEcsRUFBZ0IsUUFBRWlNLEtBQWxCak0sR0FHNTEzQixPQUh1MzNCd2MsS0FHaDMzQk0sRUFBa0JGLFFBS3pCNWhILEVBQU9ELFFBQVUraEgsSTs7OztrSENoQm5COzs7Ozs7Ozs7Ozs7Ozs7OztBQWdCTyxNQUFNejZHLEVBQWtCLEtBQ2xCQyxFQUFrQixLQUV4QixNQUFNNDZHLEVBQ1RoZ0gsWUFBWSt3QixFQUFTa3ZGLEdBQ2pCOS9HLEtBQUs0d0IsUUFBVUEsRUFDZjV3QixLQUFLOC9HLFVBQVlBLEVBQ2pCOS9HLEtBQUs2SSxLQUFPLElBQUlsRCxRQUNoQjNGLEtBQUsrL0csYUFBZSxFQUV4QnRoSCxJQUFJaUosR0FJQSxPQUhLMUgsS0FBSzZJLEtBQUtiLElBQUlOLElBQ2YxSCxLQUFLOC9HLFVBQVVFLFNBQVNoZ0gsS0FBSzR3QixRQUFTbHBCLEdBRW5DMUgsS0FBSzZJLEtBQUtwSyxJQUFJaUosR0FFekJFLElBQUlGLEVBQVE3SSxHQUNSbUIsS0FBSysvRyxlQUNMLy9HLEtBQUs2SSxLQUFLakIsSUFBSUYsRUFBUTdJLEdBRTFCbUosSUFBSU4sR0FDQSxPQUFPMUgsS0FBSzZJLEtBQUtiLElBQUlOLEdBRXpCbUQsT0FBT25ELEdBRUgsT0FEQTFILEtBQUsrL0csZUFDRS8vRyxLQUFLNkksS0FBS2dDLE9BQU9uRCxHQUU1QkosYUFDSSxPQUFPdEgsS0FBSysvRyxjQVNiLE1BQU1FLEVBQ1RsNEcsU0FBU0wsR0FDTCxPQUFPdzRHLEVBQWtCLFlBRTdCajRHLE9BQU9QLEdBQ0gsT0FBT3c0RyxFQUFrQixVQUU3QngwRyxpQkFDSSxPQUFPLEVBRVg0RixLQUFLM0YsR0FDRCxPQUFPdTBHLEVBQWtCLFFBRTdCcjJHLEtBQUtuQyxHQUNELE9BQU93NEcsRUFBa0IsUUFFN0IzM0csU0FBU2IsR0FDTCxPQUFPdzRHLEVBQWtCLFlBRTdCNTRHLGFBQ0ksT0FBTzQ0RyxFQUFrQixjQUU3QjUzRyxZQUFZWixFQUFROEYsR0FDaEIsT0FBTzB5RyxFQUFrQixlQUU3QjM0RyxNQUFNQyxFQUFRaEcsRUFBT1csR0FDakIsT0FBTys5RyxFQUFrQixTQUU3Qi8zRyxLQUFLVCxFQUFRRixFQUFRaEcsRUFBT1csRUFBTzRGLEdBQy9CLE9BQU9tNEcsRUFBa0IsUUFFN0J4ekcsU0FDSSxPQUFPd3pHLEVBQWtCLFVBRzdCanVHLGlCQUNJLE9BQU9pdUcsRUFBa0Isa0JBRzdCN3RHLFVBQ0ksT0FBaUMsS0FBMUJyUyxLQUFLaVMsaUJBQTBCak4sRUFBa0JDLEVBRTVEME0sVUFDSSxPQUFPdXVHLEVBQWtCLFlBR2pDLFNBQVNBLEVBQWtCMW1GLEdBQ3ZCLE1BQU0sSUFBSWp6QixNQUFNLElBQUlpekIsK0g7Ozs7NnZDQ3BHeEI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBd0NPLFNBQVNsRyxFQUF1QnZwQixHQUNuQyxJQUVJLE9BQU9BLEVBQUs3SixLQUFJZ2QsR0FBTyx1QkFBYUEsS0FFeEMsTUFBTzRvRixHQUNILE1BQU0sSUFBSXYvRixNQUFNLDREQUE0RHUvRixNQUc3RSxTQUFTdGxCLEVBQXVCMi9CLEdBQ25DLE9BQU9BLEVBQVFqZ0gsS0FBSVAsR0FBSyx1QkFBYUEsS0FsRHpDLDhDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM4Qk8sU0FBUzZKLEVBQXVCSCxFQUFNRSxHQUN6QyxHQUFJRixFQUFLM0gsU0FBVzZILEVBQUs3SCxPQUNyQixNQUFNLElBQUk2RSxNQUNOLGdFQUFHOEMsRUFBSzNILGlCQUFpQjZILEVBQUs3SCxXQUV0QyxNQUFNd0gsRUFBUyxJQUFJa2lCLGFBQTJCLEVBQWQvaEIsRUFBSzNILFFBQ3JDLElBQUssSUFBSTlELEVBQUksRUFBR0EsRUFBSXNMLEVBQU94SCxPQUFROUQsR0FBSyxFQUNwQ3NMLEVBQU90TCxHQUFLeUwsRUFBS3pMLEVBQUksR0FDckJzTCxFQUFPdEwsRUFBSSxHQUFLMkwsRUFBSzNMLEVBQUksR0FFN0IsT0FBT3NMLEVBZ0JKLFNBQVMwakYsRUFBdUJ2cEQsR0FDbkMsTUFBTWg2QixFQUFPLElBQUkraEIsYUFBYWlZLEVBQVEzaEMsT0FBUyxHQUN6QzZILEVBQU8sSUFBSTZoQixhQUFhaVksRUFBUTNoQyxPQUFTLEdBQy9DLElBQUssSUFBSTlELEVBQUksRUFBR0EsRUFBSXlsQyxFQUFRM2hDLE9BQVE5RCxHQUFLLEVBQ3JDeUwsRUFBS3pMLEVBQUksR0FBS3lsQyxFQUFRemxDLEdBQ3RCMkwsRUFBSzNMLEVBQUksR0FBS3lsQyxFQUFRemxDLEVBQUksR0FFOUIsTUFBTyxDQUFFeUwsT0FBTUUsUUFNWixTQUFTd2pGLEVBQXFCMXBELEdBQ2pDLE1BQU1xbEIsRUFBTTNtRCxLQUFLQyxLQUFLcWhDLEVBQVEzaEMsT0FBUyxHQUNqQzJILEVBQU8sSUFBSStoQixhQUFhczlCLEdBQ3hCbi9DLEVBQU8sSUFBSTZoQixhQUFhczlCLEdBQzlCLElBQUssSUFBSTlxRCxFQUFJLEVBQUdBLEVBQUl5bEMsRUFBUTNoQyxPQUFROUQsR0FBSyxFQUNyQ3lMLEVBQUt0SCxLQUFLMlksTUFBTTljLEVBQUksSUFBTXlsQyxFQUFRemxDLEdBQ2xDMkwsRUFBS3hILEtBQUsyWSxNQUFNOWMsRUFBSSxJQUFNeWxDLEVBQVF6bEMsRUFBSSxHQUUxQyxNQUFPLENBQUV5TCxPQUFNRSxRQU1aLFNBQVNna0YsRUFBb0JscUQsR0FDaEMsTUFBTXFsQixFQUFNM21ELEtBQUsyWSxNQUFNMm9CLEVBQVEzaEMsT0FBUyxHQUNsQzJILEVBQU8sSUFBSStoQixhQUFhczlCLEdBQ3hCbi9DLEVBQU8sSUFBSTZoQixhQUFhczlCLEdBQzlCLElBQUssSUFBSTlxRCxFQUFJLEVBQUdBLEVBQUl5bEMsRUFBUTNoQyxPQUFROUQsR0FBSyxFQUNyQ3lMLEVBQUt0SCxLQUFLMlksTUFBTTljLEVBQUksSUFBTXlsQyxFQUFRemxDLEdBQ2xDMkwsRUFBS3hILEtBQUsyWSxNQUFNOWMsRUFBSSxJQUFNeWxDLEVBQVF6bEMsRUFBSSxHQUUxQyxNQUFPLENBQUV5TCxPQUFNRSxRQU9aLFNBQVNtaUYsRUFBb0Jyb0QsRUFBU3BiLEdBR3pDLE1BQU8sQ0FBRTVlLEtBRklnNkIsRUFBZ0IsRUFBUnBiLEdBRU4xZSxLQURGODVCLEVBQWdCLEVBQVJwYixFQUFZLElBUzlCLFNBQVN5a0UsRUFBbUI3akYsRUFBTVEsRUFBTUUsRUFBTTBlLEdBQ2pEcGYsRUFBYSxFQUFSb2YsR0FBYTVlLEVBQ2xCUixFQUFhLEVBQVJvZixFQUFZLEdBQUsxZSxFQUtuQixTQUFTcWxGLEVBQVV2dkYsRUFBR3lmLEdBQ3pCLE1BQU16VixFQUFPLElBQUkraEIsYUFBYS9yQixFQUFJLEdBQzVCa0ssRUFBTyxJQUFJNmhCLGFBQWEvckIsRUFBSSxHQUNsQyxJQUFLLElBQUl6QixFQUFJLEVBQUdBLEVBQUltRSxLQUFLQyxLQUFLM0MsRUFBSSxHQUFJekIsSUFBSyxDQUN2QyxNQUFNK0UsR0FBS21jLEVBQVUsR0FBSyxHQUFLL2MsS0FBS2tkLElBQU1yaEIsRUFBSXlCLEdBQzlDZ0ssRUFBS3pMLEdBQUttRSxLQUFLcWxDLElBQUl6a0MsR0FDbkI0RyxFQUFLM0wsR0FBS21FLEtBQUs0N0MsSUFBSWg3QyxHQUV2QixNQUFPLENBQUUwRyxPQUFNRSxRQUtaLFNBQVNpakYsRUFBU25oRCxFQUFHaHNDLEVBQUd5ZixHQUMzQixNQUFNbmMsR0FBS21jLEVBQVUsR0FBSyxHQUFLL2MsS0FBS2tkLElBQU1vc0IsRUFBSWhzQyxHQUc5QyxNQUFPLENBQUVnSyxLQUZJdEgsS0FBS3FsQyxJQUFJemtDLEdBRVA0RyxLQURGeEgsS0FBSzQ3QyxJQUFJaDdDLElBcEkxQix5Wjs7OztrS0NBQTs7Ozs7Ozs7Ozs7Ozs7OztHQWlCQSxNQUFNeTlHLEVBQVEsS0FDUkMsRUFBYyxNQWdCYixTQUFTOTFFLEVBQXFCSixFQUFVbTJFLEdBRTNDLE1BQU1DLElBRE5wMkUsRUFBV0EsRUFBU2c2RCxRQUFRLE1BQU8sS0FDUHppRyxPQUFTeW9DLEVBQVNnNkQsUUFBUWtjLEVBQWEsSUFBSTMrRyxRQUNuRTArRyxFQUFNMStHLE9BQ1YsR0FBSTYrRyxFQUFZLEVBQ1osTUFBTSxJQUFJaDZHLE1BQU0saURBRWYsR0FBSWc2RyxFQUFZLEVBQ2pCLE1BQU0sSUFBSWg2RyxNQUFNLG1EQUVwQixNQUFPaTZHLEVBQWFDLEdBQWdCdDJFLEVBQVMyM0IsTUFBTXMrQyxHQUNuRCxrQkFBMEMsSUFBbkNJLEVBQVl4bkcsUUF6Qk4sUUF5QmdDLElBQU0sd0RBQ25ELE1BQU0wbkcsRUFBYUYsRUFBWTErQyxNQTNCckIsS0E0Qko2K0MsRUFBWUQsRUFBV2gvRyxPQUM3QixHQUFJNCtHLElBQWVLLEVBQ2YsTUFBTSxJQUFJcDZHLE1BQU0sWUFBWW82Ryw2QkFBcUNMLEtBRXJFLEdBQUlLLEVBQVksRUFDWixNQUFNLElBQUlwNkcsTUFBTSxpRUFFcEIsTUFBTTZqQyxFQUFVLEdBQ2hCLElBQUssSUFBSXhzQyxFQUFJLEVBQUdBLEVBQUk2aUgsRUFBYS8rRyxTQUFVOUQsRUFBRyxDQUMxQyxNQUFNZ2pILEVBQVVILEVBQWE3aUgsR0FDN0IsSUFBSzhpSCxFQUFXOTdELE1BQUtpOEQsSUFBNkMsSUFBaENBLEVBQVU3bkcsUUFBUTRuRyxLQUNoRCxNQUFNLElBQUlyNkcsTUFBTSx1Q0FBdUNxNkcsMkNBR3pCLElBQTlCeDJFLEVBQVFweEIsUUFBUTRuRyxJQUNoQngyRSxFQUFRN3BDLEtBQUtxZ0gsR0FHckIsSUFBSyxJQUFJaGpILEVBQUksRUFBR0EsRUFBSTRpSCxFQUFZOStHLFNBQVU5RCxFQUFHLENBQ3pDLE1BQU1nakgsRUFBVUosRUFBWTVpSCxJQUNNLElBQTlCd3NDLEVBQVFweEIsUUFBUTRuRyxJQWhEZCxNQWdEaUNBLEdBQ25DeDJFLEVBQVE3cEMsS0FBS3FnSCxHQUdyQixNQUFNdDJFLEVBQVMsSUFBSWx5QixNQUFNc29HLEVBQVdoL0csUUFDcEMsSUFBSyxJQUFJOUQsRUFBSSxFQUFHQSxFQUFJK2lILElBQWEvaUgsRUFBRyxDQUNoQyxHQUFJLElBQUlrakgsSUFBSUosRUFBVzlpSCxHQUFHa2tFLE1BQU0sS0FBS3QzRCxPQUFTazJHLEVBQVc5aUgsR0FBRzhELE9BQ3hELE1BQU0sSUFBSTZFLE1BQU0sMkNBQTJDbTZHLEVBQVc5aUgsbUVBRzFFMHNDLEVBQU8xc0MsR0FBSyxHQUNaLElBQUssSUFBSSt2RCxFQUFJLEVBQUdBLEVBQUkreUQsRUFBVzlpSCxHQUFHOEQsU0FBVWlzRCxFQUN4Q3JqQixFQUFPMXNDLEdBQUcyQyxLQUFLNnBDLEVBQVFweEIsUUFBUTBuRyxFQUFXOWlILEdBQUcrdkQsS0FHckQsTUFBTW96RCxFQUFVMzJFLEVBQVExb0MsT0FFbEIyb0MsRUFBYSxHQUNuQixJQUFLLElBQUl6c0MsRUFGVTZpSCxFQUFhLytHLE9BRVA5RCxFQUFJbWpILElBQVduakgsRUFDcEN5c0MsRUFBVzlwQyxLQUFLM0MsR0FFcEIsTUFBTyxDQUFFd3NDLFVBQVNDLGFBQVlDLFVBYTNCLFNBQVNhLEVBQXFCNjFFLEVBQU8xMkUsR0FDeEMsSUFBSVUsRUFBcUIsSUFBSTV5QixNQUFNNG9HLEdBQ25DaDJFLEVBQW1CMkMsTUFBTSxHQUN6QixJQUFLLElBQUkvdkMsRUFBSSxFQUFHQSxFQUFJMHNDLEVBQU81b0MsU0FBVTlELEVBQ2pDb3RDLEVBQW1CVixFQUFPMXNDLElBQU1BLEVBRXBDLE1BQU1xdEMsRUFBYSxHQUNuQixJQUFLLElBQUlydEMsRUFBSSxFQUFHQSxFQUFJb2pILElBQVNwakgsR0FDTSxJQUEzQm90QyxFQUFtQnB0QyxJQUNuQnF0QyxFQUFXMXFDLEtBQUszQyxHQUl4QixPQURBb3RDLEVBQXFCQSxFQUFtQjcrQixRQUFPak8sSUFBWSxJQUFQQSxJQUM3QyxDQUFFOHNDLHFCQUFvQkMsY0FNMUIsU0FBU1QsRUFBb0J3MkUsRUFBTzEyRSxFQUFRalEsR0FDL0MsTUFBTTRtRixFQUFXLElBQUk3b0csTUFBTTRvRyxHQUMzQixJQUFLLElBQUlwakgsRUFBSSxFQUFHQSxFQUFJeThCLEVBQVEzNEIsU0FBVTlELEVBQUcsQ0FDckMsTUFBTTRELEVBQVE2NEIsRUFBUXo4QixHQUFHNEQsTUFDekIsSUFBSyxJQUFJbXNELEVBQUksRUFBR0EsRUFBSXJqQixFQUFPMXNDLEdBQUc4RCxTQUFVaXNELE9BQ0w2NkIsSUFBM0J5NEIsRUFBUzMyRSxFQUFPMXNDLEdBQUcrdkQsSUFDbkJzekQsRUFBUzMyRSxFQUFPMXNDLEdBQUcrdkQsSUFBTW5zRCxFQUFNbXNELEdBRy9CLGlCQUFPc3pELEVBQVMzMkUsRUFBTzFzQyxHQUFHK3ZELE1BQVFuc0QsRUFBTW1zRCxJQUFJLElBQU0sc0JBQXNCc3pELEVBQVMzMkUsRUFBTzFzQyxHQUFHK3ZELGVBQWVBLHFCQUNuRnVLLEtBQUtFLFVBQVU1MkQseUJBQ2JBLEVBQU1tc0QsUUFvQnhDLFNBQVNoakIsRUFBcUJOLEVBQVlDLEdBQzdDLE1BQU1HLEVBQU9KLEVBQ1BLLEVBQVEsR0FDZCxJQUFJRSxFQUFTLEVBQ2EsSUFBdEJQLEVBQVczb0MsUUFFWCtvQyxFQUFLbHFDLE1BQU0sR0FFZnFxQyxFQUFTUCxFQUFXM29DLE9BQVMsRUFDN0IsSUFBSyxJQUFJOUQsRUFBSSxFQUFHQSxFQUFJZ3RDLElBQVVodEMsRUFDMUI4c0MsRUFBTW5xQyxLQUFLLElBRWYsTUFBTTJnSCxFQUFzQixHQUM1QixJQUFLLElBQUl0akgsRUFBSSxFQUFHQSxFQUFJNnNDLEVBQUsvb0MsU0FBVTlELEVBQUcsQ0FDbEMsTUFDTXVqSCxFQUFjQyxFQUFpQjkyRSxFQURuQkcsRUFBSzdzQyxJQUV2QixJQUFLLE1BQU15akgsS0FBYUYsR0FDNEIsSUFBNUNELEVBQW9CbG9HLFFBQVFxb0csS0FDNUIzMkUsRUFBTTlzQyxHQUFHMkMsS0FBSzhnSCxHQUNkSCxFQUFvQjNnSCxLQUFLOGdILElBSXJDLE1BQU8sQ0FBRTUyRSxPQUFNQyxTQUdaLFNBQVNVLEVBQXNCbFEsR0FDbEMsT0FBT0EsRUFBSzlzQixPQUFNLENBQUNzK0IsRUFBS3prQixJQUFVeWtCLElBQVF6a0IsSUFFOUMsU0FBU201RixFQUFpQjkyRSxFQUFRb0MsR0FDOUIsTUFBTXkwRSxFQUFjLEdBQ3BCLElBQUssSUFBSXZqSCxFQUFJLEVBQUdBLEVBQUkwc0MsRUFBTzVvQyxTQUFVOUQsRUFDUixJQUFyQjBzQyxFQUFPMXNDLEdBQUc4RCxTQUE0QyxJQUE1QjRvQyxFQUFPMXNDLEdBQUdvYixRQUFRMHpCLEtBQXdCLElBQVRBLEdBQzNEeTBFLEVBQVk1Z0gsS0FBSzNDLEdBR3pCLE9BQU91akgsSTs7OzswSUMzTFgsc2dCOzs7OytIQ0FBOzs7Ozs7Ozs7Ozs7Ozs7O0dBaUJPLFNBQVNwcEUsRUFBd0JyUSxFQUFPdVEsRUFBUUMsRUFBZUMsRUFBY0MsR0FDaEYsT0FBT2twRSxFQUF1QjU1RSxFQUFPdVEsRUFBUUMsRUFBZUMsRUFBY0MsRUFBZ0IsR0FFdkYsU0FBU0ssRUFBd0IvUSxFQUFPdVEsRUFBUUMsRUFBZUMsRUFBY0MsRUFBZ0JPLEdBQ2hHLE9BQU8yb0UsRUFBdUI1NUUsRUFBT3VRLEVBQVFDLEVBQWVDLEVBQWNDLEVBQWdCLEdBQXNCLEVBQWdDTyxHQUE2QyxHQUcxTCxTQUFTRyxFQUF3QnBSLEVBQU91USxFQUFRQyxFQUFlQyxFQUFjQyxFQUFnQlksR0FDaEcsT0FBT3NvRSxFQUF1QjU1RSxFQUFPdVEsRUFBUUMsRUFBZUMsRUFBY0MsRUFBZ0JZLEdBQWMsR0FFNUcsU0FBU3NvRSxFQUF1QjU1RSxFQUFPdVEsRUFBUUMsRUFBZUMsRUFBY0MsRUFBZ0JZLEVBQWN1b0UsR0FBcUIsRUFBTzVvRSxHQUFxQixFQUFPNm9FLEdBQXFCLEdBR25MLE1BQU1DLEVBQWEsR0FDbkIsSUFBSyxJQUFJN2pILEVBQUksRUFBR0EsRUFBSXE2QyxFQUFPdjJDLE9BQVE5RCxJQUMzQnE2QyxFQUFPcjZDLEdBQUt3NkMsR0FDWnFwRSxFQUFXbGhILEtBQUssQ0FBRW1oSCxNQUFPenBFLEVBQU9yNkMsR0FBSStqSCxTQUFVL2pILEVBQUdna0gsbUJBQW9CLElBRzdFSCxFQUFXbjdCLEtBQUt1N0IsR0FHaEIsTUFBTW5oRixFQUFRc1ksRUFBZSxHQUFNLEdBQU1BLEVBQWdCLEVBQ25EVCxFQUFrQixHQUNsQmMsRUFBaUIsR0FDdkIsS0FBT2QsRUFBZ0I3MkMsT0FBU3cyQyxHQUFpQnVwRSxFQUFXLy9HLE9BQVMsR0FBRyxDQUNwRSxNQUFNb2dILEVBQVlMLEVBQVc3UyxPQUNyQjhTLE1BQU9LLEVBQWEsU0FBRUosRUFBUSxtQkFBRUMsR0FBdUJFLEVBQy9ELEdBQUlDLEVBQWdCM3BFLEVBQ2hCLE1BUUosSUFBSTRwRSxHQUFrQixFQUN0QixJQUFLLElBQUlyMEQsRUFBSXBWLEVBQWdCNzJDLE9BQVMsRUFBR2lzRCxHQUFLaTBELElBQXNCajBELEVBQUcsQ0FDbkUsTUFBTXMwRCxFQUFNQyxFQUFzQng2RSxFQUFPaTZFLEVBQVVwcEUsRUFBZ0JvVixJQUNuRSxHQUFJczBELEdBQU85cEUsRUFBYyxDQUNyQjZwRSxHQUFrQixFQUNsQixNQUlKLEdBRkFGLEVBQVVKLE1BQ05JLEVBQVVKLE1BQVFTLEVBQWVocUUsRUFBY3pYLEVBQU91aEYsR0FDdERILEVBQVVKLE9BQVN0cEUsRUFDbkIsTUFVUjBwRSxFQUFVRixtQkFBcUJycEUsRUFBZ0I3MkMsT0FDMUNzZ0gsSUFHR0YsRUFBVUosUUFBVUssR0FDcEJ4cEUsRUFBZ0JoNEMsS0FBS29oSCxHQUNyQnRvRSxFQUFlOTRDLEtBQUt1aEgsRUFBVUosUUFFekJJLEVBQVVKLE1BQVF0cEUsR0FHdkIsdUJBQWFxcEUsRUFBWUssRUFBV0QsSUFLaEQsTUFBTWpwRSxFQUFlTCxFQUFnQjcyQyxPQUMvQjBnSCxFQUFhbHFFLEVBQWdCVSxFQUMvQkQsR0FBc0J5cEUsRUFBYSxJQUNuQzdwRSxFQUFnQmg0QyxRQUFRLElBQUk2WCxNQUFNZ3FHLEdBQVl6MEUsS0FBSyxJQUNuRDBMLEVBQWU5NEMsUUFBUSxJQUFJNlgsTUFBTWdxRyxHQUFZejBFLEtBQUssS0FFdEQsTUFBTXprQyxFQUFTLENBQUVxdkMsbUJBT2pCLE9BTklncEUsSUFDQXI0RyxFQUF1QixlQUFJbXdDLEdBRTNCbW9FLElBQ0F0NEcsRUFBcUIsYUFBSTB2QyxHQUV0QjF2QyxFQUVYLFNBQVNnNUcsRUFBc0J4NkUsRUFBTzlwQyxFQUFHK3ZELEdBQ3JDLE1BQU0wMEQsRUFBUzM2RSxFQUFNcjhCLFNBQWEsRUFBSnpOLEVBQVcsRUFBSkEsRUFBUSxHQUN2QzBrSCxFQUFTNTZFLEVBQU1yOEIsU0FBYSxFQUFKc2lELEVBQVcsRUFBSkEsRUFBUSxHQUN2QzQwRCxFQUFReGdILEtBQUtxMEMsSUFBSWlzRSxFQUFPLEdBQUlBLEVBQU8sSUFDbkNHLEVBQVF6Z0gsS0FBS3EwQyxJQUFJaXNFLEVBQU8sR0FBSUEsRUFBTyxJQUNuQ0ksRUFBUTFnSCxLQUFLMDlCLElBQUk0aUYsRUFBTyxHQUFJQSxFQUFPLElBQ25DSyxFQUFRM2dILEtBQUswOUIsSUFBSTRpRixFQUFPLEdBQUlBLEVBQU8sSUFDbkNNLEVBQVE1Z0gsS0FBS3EwQyxJQUFJa3NFLEVBQU8sR0FBSUEsRUFBTyxJQUNuQ00sRUFBUTdnSCxLQUFLcTBDLElBQUlrc0UsRUFBTyxHQUFJQSxFQUFPLElBQ25DTyxFQUFROWdILEtBQUswOUIsSUFBSTZpRixFQUFPLEdBQUlBLEVBQU8sSUFDbkNRLEVBQVEvZ0gsS0FBSzA5QixJQUFJNmlGLEVBQU8sR0FBSUEsRUFBTyxJQUNuQ1MsR0FBU04sRUFBUUYsSUFBVUcsRUFBUUYsR0FDbkNRLEdBQVNILEVBQVFGLElBQVVHLEVBQVFGLEdBQ3pDLEdBQUlHLEdBQVMsR0FBS0MsR0FBUyxFQUN2QixPQUFPLEVBRVgsTUFBTUMsRUFBbUJsaEgsS0FBSzA5QixJQUFJOGlGLEVBQU9JLEdBQ25DTyxFQUFtQm5oSCxLQUFLMDlCLElBQUkraUYsRUFBT0ksR0FDbkNPLEVBQW1CcGhILEtBQUtxMEMsSUFBSXFzRSxFQUFPSSxHQUNuQ08sRUFBbUJyaEgsS0FBS3EwQyxJQUFJc3NFLEVBQU9JLEdBQ25DTyxFQUFtQnRoSCxLQUFLMDlCLElBQUkwakYsRUFBbUJGLEVBQWtCLEdBQ25FbGhILEtBQUswOUIsSUFBSTJqRixFQUFtQkYsRUFBa0IsR0FDbEQsT0FBT0csR0FBb0JOLEVBQVFDLEVBQVFLLEdBTS9DLFNBQVNsQixFQUFlaHFFLEVBQWN6WCxFQUFPdWhGLEdBQ3pDLE1BQU1xQixFQUFTdmhILEtBQUt5cUMsSUFBSTlMLEVBQVF1aEYsRUFBTUEsR0FDdEMsT0FBT0EsR0FBTzlwRSxFQUFlbXJFLEVBQVMsRUFFMUMsU0FBU3pCLEVBQW9CMEIsRUFBSUMsR0FLN0IsT0FBUUQsRUFBRzdCLE1BQVE4QixFQUFHOUIsT0FDaEI2QixFQUFHN0IsUUFBVThCLEVBQUc5QixPQUFXOEIsRUFBRzdCLFNBQVc0QixFQUFHNUIsVzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbEgvQyxTQUFTOEIsRUFBYS82RixFQUFLNC9ELEVBQVNvN0IsR0FDdkMsTUFBTXo3RixFQUFRMDdGLEVBQWFqN0YsRUFBSzQvRCxFQUFTbzdCLEdBQ25DRSxFQUFpQjM3RixFQUFRLElBQU1BLEVBQVEsR0FBS0EsRUFDbERTLEVBQUk0aUIsT0FBT3M0RSxFQUFnQixFQUFHdDdCLEdBaUIzQixTQUFTcTdCLEVBQWFqN0YsRUFBSzJuRixFQUFRcVQsR0FDdEMsT0FZSixTQUF1Qmg3RixFQUFLMm5GLEVBQVFxVCxHQUNoQyxJQUFJdi9HLEVBQU8sRUFDUCtoRixFQUFReDlELEVBQUlobkIsT0FDWm1pSCxFQUFTLEVBQ1RDLEdBQVEsRUFDWixLQUFPMy9HLEVBQU8raEYsR0FBTyxDQUNqQjI5QixFQUFTMS9HLEdBQVMraEYsRUFBUS9oRixJQUFVLEdBQ3BDLE1BQU00L0csRUFBZ0JMLEVBQVdyVCxFQUFRM25GLEVBQUltN0YsSUFDekNFLEVBQWdCLEVBQ2hCNS9HLEVBQU8wL0csRUFBUyxHQUdoQjM5QixFQUFRMjlCLEVBR1JDLEdBQVNDLEdBR2pCLE9BQU9ELEVBQVEzL0csR0FBUUEsRUFBTyxFQTlCdkI2L0csQ0FBY3Q3RixFQUFLMm5GLEVBQVFxVCxHQUFjTyxHQVNwRCxTQUFTQSxFQUFrQmh4RyxFQUFHeWYsR0FDMUIsT0FBT3pmLEVBQUl5ZixFQUFJLEVBQUl6ZixFQUFJeWYsR0FBSyxFQUFJLEVBNURwQyxrRzs7OzsrRENBQTs7Ozs7Ozs7Ozs7Ozs7OztHQWtCTyxTQUFTM3RCLEVBQVVtL0csRUFBV3gxRyxHQUNqQyxNQUFNOGdDLEVBQVUsR0FDaEIsSUFBSyxJQUFJNXhDLEVBQUksRUFBR0EsRUFBSThRLEVBQVNoTixPQUFROUQsSUFDN0I4USxFQUFTOVEsSUFDVDR4QyxFQUFRanZDLEtBQUszQyxHQUdyQixNQUFNdW1ILEVBQVcsaUJBQU9ELEVBQVcsU0FDN0Ixd0YsRUFBTSxpQkFBTyxDQUFDZ2MsRUFBUTl0QyxPQUFRd2lILEVBQVV4aUgsUUFBUyxTQUN2RCxJQUFLLElBQUk5RCxFQUFJLEVBQUdBLEVBQUk0eEMsRUFBUTl0QyxPQUFROUQsSUFBSyxDQUNyQyxNQUFNNGxFLEVBQU0yZ0QsRUFBUy9yQyxXQUFXNW9DLEVBQVE1eEMsSUFDbEM2aUMsRUFBUzdpQyxFQUFJc21ILEVBQVV4aUgsT0FDN0I4eEIsRUFBSWhzQixPQUFPSSxJQUFJNDdELEVBQUsvaUMsR0FFeEIsT0FBT2pOLEVBQUk0d0YsYTs7OztnaUpDaENmLHM1eEI7Ozs7dURDQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbUJBLDRCQVlBLE1BQU1DLEVBQVksQ0FDZHI2RyxPQUFBLFNBQ0F1NEIsS0FBQSxPQUNBK2hGLE1BQUEsUUFDQTFmLE1BQUEsU0FFSix1QkFBYXlmLEk7Ozs7K0RDckNiOzs7Ozs7Ozs7Ozs7Ozs7OztBQWdCQSxNQUFNRSxFQUNtQyxvQkFBMUJDLHNCQUNBQSxzQkFFc0Isb0JBQWpCQyxFQUNMQSxFQUVIOTRHLEdBQU1BLElBWWxCLFNBQVMrNEcsSUFDTCxPQUFPLElBQUkvNkcsU0FBUUMsR0FBVzI2RyxHQUFjLElBQU0zNkcsVTs7Ozt5RUNoQi9DLFNBQVMyVixFQUFTb2xHLEdBQ3JCLEdBQUlBLEdBSHdCLG9CQUFkM1csV0FBMEMsTUFBYkEsVUFHVCxDQUk5QixHQUhLMlcsSUFDREEsRUFBTTNXLFdBRVUsZ0JBQWhCMlcsRUFBSXprRixRQUNKLE9BQU8sRUFHWCxNQUFNanRCLEVBQUkweEcsRUFBSUMsV0FBYUQsRUFBSUUsUUFBVTM5RyxPQUFPNDlHLE1BRWhELE1BQU8sMlRBQ0ZDLEtBQUs5eEcsSUFFTiwwa0RBQ0s4eEcsS0FBSzl4RyxFQUFFZ3lGLE9BQU8sRUFBRyxJQUU5QixPQUFPLEVBRUosU0FBU3Z4RixJQUNaLE1BQTBCLG9CQUFYeE0sUUFBNkMsTUFBbkJBLE9BQU9vUCxVQUVkLG9CQUF0QjB1RyxrQkExQ2hCLDJGOzs7OzBGQ0FBOzs7Ozs7Ozs7Ozs7Ozs7OztBQTJCQSxTQUFTQyxFQUE2QkMsR0FDbEMsT0FBc0MsTUFBL0JBLEVBQWlCMXJGLFdBRTVCLE1BQU0yckYsRUFDRnRsSCxjQUVJRyxLQUFLb2xILG9CQUFzQixHQUMzQnBsSCxLQUFLcWxILGVBQWlCLEVBQ3RCcmxILEtBQUsreUYsU0FBVyxFQUNoQi95RixLQUFLc2dILFdBQWEsRUFDbEJ0Z0gsS0FBS3NsSCxpQkFBbUIsRUFDeEJ0bEgsS0FBS3VsSCxlQUFpQixFQUl0QnZsSCxLQUFLd2xILGNBQWdCLEVBR3JCeGxILEtBQUt5bEgsWUFBYyxFQUNuQnpsSCxLQUFLMGxILFdBQWEsR0FLbEIxbEgsS0FBSzJsSCxrQkFBb0IsR0FDekIzbEgsS0FBSzRsSCxZQUFjLEVBQ25CNWxILEtBQUtxSSxXQUFhLElBQUkxQyxRQUN0QjNGLEtBQUs2bEgsV0FBWSxFQUNqQjdsSCxLQUFLOGxILGNBQWdCLENBQ2pCQyxTQUFVLEVBQ1ZDLFdBQVksRUFDWkMsVUFBVyxFQUNYQyxRQUFTLEdBQ1RoOUcsT0FBUSxLQUNSLGtCQUNJLE9BQU9rUCxNQUFNZ3FDLEtBQUssSUFBSTArRCxJQUFJOWdILEtBQUtrbUgsUUFBUWhtSCxLQUFJbXJDLEdBQUtBLEVBQUVsdEMsV0FJOUR3VCxVQUNJLElBQUssTUFBTThtRCxLQUFnQno0RCxLQUFLb2xILG9CQUM1QnBsSCxLQUFLb2xILG9CQUFvQjNzRCxHQUFjOW1ELFdBSTVDLE1BQU13MEcsRUFDVHRtSCxZQUFZd2YsR0FDUnJmLEtBQUtxZixJQUFNQSxFQUNYcmYsS0FBS29tSCxTQUFXLEdBQ2hCcG1ILEtBQUtxbUgsZ0JBQWtCLEdBQ3ZCcm1ILEtBQUtzbUgscUJBQXVCLEVBQzVCdG1ILEtBQUt1bUgsTUFBUSxJQUFJcEIsRUFFckIsY0FDSSxHQUErQixNQUEzQm5sSCxLQUFLd21ILG1CQUNMLE9BQU94bUgsS0FBS3dtSCxtQkFBbUJyeEIsTUFBSyxTQUV4QyxHQUE0QixNQUF4Qm4xRixLQUFLeW1ILGdCQUNMLE9BRUosTUFBTUMsRUFBaUIxbUgsS0FBSzJtSCxvQkFDNUIsSUFBSyxJQUFJL29ILEVBQUksRUFBR0EsRUFBSThvSCxFQUFlaGxILE9BQVE5RCxJQUFLLENBQzVDLE1BQU02N0IsRUFBY2l0RixFQUFlOW9ILEdBRW5DLFNBRHNCb0MsS0FBSzRtSCxrQkFBa0JudEYsR0FBYW90RixRQUd0RCxrQkFETTdtSCxLQUFLOG1ILFdBQVdydEYsR0FJOUIsTUFBTSxJQUFJbHpCLE1BQU0sMEVBR3BCLGNBQ0ksR0FBK0IsTUFBM0J2RyxLQUFLd21ILG1CQUNMLE1BQU0sSUFBSWpnSCxNQUFNLFlBQVl2RyxLQUFLeTVCLGtJQUlyQyxHQUE0QixNQUF4Qno1QixLQUFLeW1ILGdCQUF5QixDQUM5QixNQUFNLEtBQUV0b0gsRUFBSSxVQUFFNG9ILEdBQWMvbUgsS0FBS2duSCxrQ0FDakMsR0FBSUQsRUFDQSxNQUFNLElBQUl4Z0gsTUFBTSxpQ0FBaUNwSSx3SEFJckQ2QixLQUFLOG1ILFdBQVczb0gsR0FFcEIsT0FBTzZCLEtBQUt5bUgsZ0JBRWhCUSxlQUNJLE9BQU8zb0gsT0FBT3NULEtBQUs1UixLQUFLcW1ILGlCQUU1QmEsWUFBWXp0RixHQUNSLEtBQU1BLEtBQWV6NUIsS0FBS29tSCxVQUFXLENBR2pDLEtBQUkzc0YsS0FBZXo1QixLQUFLcW1ILGlCQVFwQixPQUFPLEtBUjhCLENBQ3JDLE1BQU0sVUFBRVUsR0FBYy9tSCxLQUFLNG1ILGtCQUFrQm50RixHQUM3QyxHQUFJc3RGLEVBRUEsT0FBTyxNQU9uQixPQUFPL21ILEtBQUtvbUgsU0FBUzNzRixHQUV6QjB0RixtQkFBbUIxdEYsR0FDZixPQUFNQSxLQUFlejVCLEtBQUtxbUgsZ0JBR25Ccm1ILEtBQUtxbUgsZ0JBQWdCNXNGLEdBQWEydEYsUUFGOUIsS0FJZkMsZ0JBQWdCNXRGLEVBQWEydEYsRUFBU0UsRUFBVyxHQUM3QyxPQUFJN3RGLEtBQWV6NUIsS0FBS3FtSCxpQkFDcEI3eUcsUUFBUS9FLEtBQUssR0FBR2dyQix3RUFFVCxJQUVYejVCLEtBQUtxbUgsZ0JBQWdCNXNGLEdBQWUsQ0FBRTJ0RixVQUFTRSxhQUN4QyxHQUVYLGlCQUFpQjd0RixHQUNiLEdBQXlDLE1BQXJDejVCLEtBQUtxbUgsZ0JBQWdCNXNGLEdBQ3JCLE1BQU0sSUFBSWx6QixNQUFNLGlCQUFpQmt6Qiw0QkFHckMsR0FEQXo1QixLQUFLeTVCLFlBQWNBLEVBQ2UsTUFBOUJ6NUIsS0FBS29tSCxTQUFTM3NGLEdBQXNCLENBQ3BDejVCLEtBQUt5bUgsZ0JBQWtCLEtBQ3ZCLE1BQU0sUUFBRUksRUFBTyxVQUFFRSxHQUFjL21ILEtBQUs0bUgsa0JBQWtCbnRGLEdBRXRELEtBRGVzdEYsUUFBa0JGLEVBQVVBLEdBRXZDLE9BQU8sRUFPZixPQUpBN21ILEtBQUt5bUgsZ0JBQWtCem1ILEtBQUtvbUgsU0FBUzNzRixHQUNyQ3o1QixLQUFLdW5ILHlCQUVMdm5ILEtBQUt3bkgsU0FBVyxJQUFJLFdBQVN4bkgsS0FBS3ltSCxrQkFDM0IsRUFFWGMseUJBQ29CLCtCQUFxQnZuSCxLQUFLeTVCLGFBQ2xDcDVCLFNBQVFvbkgsSUFDWSxNQUFwQkEsRUFBTzd3QixXQUNQNndCLEVBQU83d0IsVUFBVTUyRixLQUFLeW1ILG9CQUlsQ2lCLHlCQUF5Qmp1RixHQUNMLCtCQUFxQkEsR0FDN0JwNUIsU0FBUW9uSCxJQUNjLE1BQXRCQSxFQUFPRSxhQUNQRixFQUFPRSxZQUFZM25ILEtBQUtvbUgsU0FBUzNzRixPQVU3Q210RixrQkFBa0JudEYsR0FDZCxNQUFNbXVGLEVBQXVCNW5ILEtBQUtxbUgsZ0JBQWdCNXNGLEdBQ2xELEdBQTRCLE1BQXhCbXVGLEVBQ0EsTUFBTSxJQUFJcmhILE1BQU0sNkJBQTZCa3pCLDZCQUVqRCxJQUNJLE1BQU03SSxFQUFVZzNGLEVBQXFCUixVQU1yQyxJQUFJeDJGLEdBQWFBLGFBQW1CLGlCQUNSLG1CQUFqQkEsRUFBUXVrRSxLQTJCZixPQURBbjFGLEtBQUtvbUgsU0FBUzNzRixHQUFlN0ksRUFDdEIsQ0FBRWkyRixTQUFTLEVBQU1FLFdBQVcsR0EzQkMsQ0FDcEMsTUFBTWMsSUFBYzduSCxLQUFLc21ILHFCQUNuQk8sRUFBVWoyRixFQUNYdWtFLE1BQUtzeEIsS0FFRm9CLEVBQVk3bkgsS0FBS3NtSCx3QkFHckJ0bUgsS0FBS29tSCxTQUFTM3NGLEdBQWVndEYsRUFDN0J6bUgsS0FBS3dtSCxtQkFBcUIsTUFDbkIsS0FFTmhiLE9BQU0xRixJQUVIK2hCLEVBQVk3bkgsS0FBS3NtSCx1QkFHckJ0bUgsS0FBS3dtSCxtQkFBcUIsS0FDMUJoekcsUUFBUS9FLEtBQUssNkJBQTZCZ3JCLFlBQzFDam1CLFFBQVEvRSxLQUFLcTNGLEVBQUlvQixPQUFTcEIsRUFBSWxRLFdBSm5CLEtBUWYsT0FEQTUxRixLQUFLd21ILG1CQUFxQkssRUFDbkIsQ0FBRUEsVUFBU0UsV0FBVyxJQU9yQyxNQUFPamhCLEdBR0gsT0FGQXR5RixRQUFRL0UsS0FBSyw2QkFBNkJnckIsWUFDMUNqbUIsUUFBUS9FLEtBQUtxM0YsRUFBSW9CLE9BQVNwQixFQUFJbFEsU0FDdkIsQ0FBRWl4QixTQUFTLEVBQU9FLFdBQVcsSUFHNUNlLGNBQWNydUYsR0FDVixLQUFNQSxLQUFlejVCLEtBQUtxbUgsaUJBQ3RCLE1BQU0sSUFBSTkvRyxNQUFNLEdBQUdrekIsbUNBRW5CejVCLEtBQUt5NUIsY0FBZ0JBLEdBQTBDLE1BQTNCejVCLEtBQUt3bUgsb0JBR3pDeG1ILEtBQUtzbUgsdUJBRUw3c0YsS0FBZXo1QixLQUFLb21ILFdBQ3BCcG1ILEtBQUswbkgseUJBQXlCanVGLEdBQzlCejVCLEtBQUtvbUgsU0FBUzNzRixHQUFhOW5CLGlCQUNwQjNSLEtBQUtvbUgsU0FBUzNzRixXQUVsQno1QixLQUFLcW1ILGdCQUFnQjVzRixHQUV4Qno1QixLQUFLeTVCLGNBQWdCQSxJQUNyQno1QixLQUFLd21ILG1CQUFxQixLQUMxQnhtSCxLQUFLeTVCLFlBQWMsS0FDbkJ6NUIsS0FBS3ltSCxnQkFBa0IsTUFHL0JFLG9CQUNJLEdBQWlELElBQTdDcm9ILE9BQU9zVCxLQUFLNVIsS0FBS3FtSCxpQkFBaUIza0gsT0FDbEMsTUFBTSxJQUFJNkUsTUFBTSxpQ0FFcEIsT0FBT2pJLE9BQU9zVCxLQUFLNVIsS0FBS3FtSCxpQkFBaUIvL0IsTUFBSyxDQUFDcnpFLEVBQUd5ZixJQUV2QzF5QixLQUFLcW1ILGdCQUFnQjN6RixHQUFHNDBGLFNBQzNCdG5ILEtBQUtxbUgsZ0JBQWdCcHpHLEdBQUdxMEcsV0FHcENOLGtDQUNJLE1BQU1OLEVBQWlCMW1ILEtBQUsybUgsb0JBQzVCLElBQUssSUFBSS9vSCxFQUFJLEVBQUdBLEVBQUk4b0gsRUFBZWhsSCxPQUFROUQsSUFBSyxDQUM1QyxNQUFNNjdCLEVBQWNpdEYsRUFBZTlvSCxJQUM3QixRQUFFaXBILEVBQU8sVUFBRUUsR0FBYy9tSCxLQUFLNG1ILGtCQUFrQm50RixHQUN0RCxHQUFJc3RGLEdBQWFGLEVBQ2IsTUFBTyxDQUFFMW9ILEtBQU1zN0IsRUFBYXN0RixhQUdwQyxNQUFNLElBQUl4Z0gsTUFBTSwwRUFHcEJ5NUcsU0FBU3B2RixFQUFTbHBCLEdBQ2QsTUFBTXlKLEVBQU9uUixLQUFLdW1ILE1BQU1sK0csV0FBVzVKLElBQUlpSixHQUNqQ3FnSCxFQUFhNTJHLEVBQUt5ZixRQUNsQnBwQixFQUFTeEgsS0FBS3VJLFNBQVNiLEdBQ3ZCSyxFQUFXZ2dILEVBQVdoZ0gsU0FBU0wsR0FHckNxZ0gsRUFBV3ovRyxZQUFZWixHQUFRLEdBQy9CeUosRUFBS3lmLFFBQVVBLEVBQ2ZBLEVBQVF6b0IsS0FBS1QsRUFBUUYsRUFBUTJKLEVBQUszUCxNQUFPMlAsRUFBS2hQLE1BQU80RixHQUNqRC9ILEtBQUtnb0gsMEJBR0xob0gsS0FBS3VtSCxNQUFNWixrQkFBa0IzbEgsS0FBS3VtSCxNQUFNWixrQkFBa0Jqa0gsT0FBUyxLQUczRXVtSCxLQUFLQyxFQUFVQyxHQUNYLElBc0JJai9HLEVBdEJBL0ssRUFBTyxLQUNYLEdBQVUsTUFBTmdxSCxFQUFZLENBRVosR0FBd0IsbUJBQWJELEVBQ1AsTUFBTSxJQUFJM2hILE1BQU0sdUNBRXBCNGhILEVBQUtELE1BRUosQ0FFRCxHQUF3QixpQkFBYkEsS0FBMkJBLGFBQW9CaGdCLFFBQ3RELE1BQU0sSUFBSTNoRyxNQUFNLGtGQUdwQixHQUFrQixtQkFBUDRoSCxFQUNQLE1BQU0sSUFBSTVoSCxNQUFNLGtGQUdwQnBJLEVBQU8rcEgsRUFLWCxPQUFPbG9ILEtBQUtvb0gsV0FBVSxJQUFNcG9ILEtBQUtxb0gsV0FBV2xxSCxLQUFPLElBQU02QixLQUFLc29ILFNBQVNwL0csS0FBUyxLQUM1RUEsRUFBU2kvRyxJQUNMai9HLGFBQWtCUyxTQUNsQjZKLFFBQVEvRyxNQUFNLDJDQUVYdkQsS0FHZmsvRyxVQUFVbi9HLEVBQU9rN0MsRUFBS3g0QyxHQUNsQjFDLElBQ0EsSUFDSSxNQUFNTixFQUFNZ0QsSUFFWixPQURBdzRDLElBQ094N0MsRUFFWCxNQUFPeTdGLEdBRUgsTUFEQWpnRCxJQUNNaWdELEdBR2Rta0IsZUFDSSxPQUFPcEMsRUFBT29DLGVBRWxCQyxpQkFDSSxPQUFPckMsRUFBT3FDLGlCQVFsQmxFLE1BQU0zaEgsR0FDRixNQUFNOGxCLEVBQUlnZ0csRUFBT0MsVUFBVSxXQUFVLENBQUUvbEgsTUFDakN1TCxFQUFTLENBQUV2TCxLQWFqQixPQURBM0MsS0FBSzJvSCxZQUFZM29ILEtBQUt1bUgsTUFBTXFDLFlBQVl6cUgsS0FBTStQLEVBQVEsQ0FBQ3VhLElBWHpDaVYsSUFBTyxDQUNqQi82QixFQUFHLEtBQ0MsTUFDTWttSCxFQUFhLENBQUVsbUgsRUFBRys2QixHQUNsQmhNLEVBQVEsQ0FBRXZ2QixNQUZGLFdBR2QsT0FBT3NtSCxFQUFPQyxVQUFVLE9BQU1HLEVBRTlCbjNGLE9BR00sR0FDMEQsSUFDakVqSixFQWVYaWdHLFVBQVVsdkYsRUFBWXRyQixFQUFRd2pCLEdBQ0YsTUFBcEIxeEIsS0FBS3k1QixhQU1MejVCLEtBQUs0d0IsUUFHVCxLQUQ2RCxNQUEzQyxvQkFBVTRJLEVBQVl4NUIsS0FBS3k1QixjQUV6QyxNQUFNLElBQUlsekIsTUFBTSxXQUFXaXpCLGtDQUEyQ3g1QixLQUFLeTVCLGdCQUUvRSxPQUFPejVCLEtBQUs4b0gsY0FBYyxDQUFFdHZGLGFBQVl0ckIsU0FBUXdqQixVQUVwRHMyRix5QkFDSSxPQUFPaG9ILEtBQUtxZixJQUFJL1ksUUFBUSxXQUU1QnlpSCxzQkFBc0J2dkYsRUFBWXd2RixFQUFrQkMsR0FDaEQsTUFBTUMsRUFBa0JscEgsS0FBSzR3QixRQUFRdHBCLGFBRXJDLElBQUk2aEgsRUFBbUIsRUFDdkJGLEVBQVM1b0gsU0FBUThRLElBR2JnNEcsR0FBb0MsY0FBZmg0RyxFQUFLaFAsTUFBd0IsRUFBSSxLQU8xRCxNQUFNaW5ILEVBQVdwcEgsS0FBS3VtSCxNQUFNWixrQkFBa0IzbEgsS0FBS3VtSCxNQUFNWixrQkFBa0Jqa0gsT0FBUyxHQUM5RTJuSCxFQUFnQkgsRUFBa0JGLEVBQW1CRyxFQUFtQkMsRUFDOUUsR0FBSUMsRUFBZ0IsRUFDaEIsTUFBTSxJQUFJOWlILE1BQU0sWUFBWXZHLEtBQUt5NUIsNkNBQ3pCNHZGLDhCQUEwQzd2RixNQVExRHN2RixjQUFjUSxHQUNWLElBQUlDLEVBQ0FDLEVBQVEsR0FDWixNQUFNQyxFQUFXenBILEtBQUt5cEgsV0FDaEJDLEVBQW9CMXBILEtBQUt1bUgsTUFBTXh6QixTQUMvQjQyQixFQUFxQjNwSCxLQUFLdW1ILE1BQU1qRyxXQUl0QyxJQUFJNW1GLEVBU0FsRyxFQVpBeHpCLEtBQUtnb0gsMEJBQ0xob0gsS0FBS3VtSCxNQUFNWixrQkFBa0JwbEgsS0FBSyxHQUdkLE1BQXBCUCxLQUFLeTVCLGFBTUx6NUIsS0FBSzR3QixRQUdULE1BQU1nNUYsRUFBb0IzRSxFQUE2QnFFLEdBQ25EQSxFQUFhOXZGLFdBQ2EsTUFBMUJ4NUIsS0FBS3VtSCxNQUFNcUMsWUFBc0I1b0gsS0FBS3VtSCxNQUFNcUMsWUFBWXpxSCxLQUFPLEdBSW5FLEdBQUk4bUgsRUFBNkJxRSxHQUFlLENBQzVDLE1BQU0sV0FBRTl2RixFQUFVLE9BQUV0ckIsRUFBTSxNQUFFd2pCLEdBQVU0M0YsRUFDZCxNQUFwQnRwSCxLQUFLeTVCLGFBTUx6NUIsS0FBSzR3QixRQUVULE1BQU02MkYsRUFBUyxvQkFBVWp1RixFQUFZeDVCLEtBQUt5NUIsYUFDMUMsU0FBc0IsTUFBVmd1RixHQUFnQixJQUFNLGtDQUFrQ2p1RixtQkFBNEJ4NUIsS0FBS3k1QixpQkFDckdDLEVBQWEsS0FDVCxNQUFNc3ZGLEVBQW1CaHBILEtBQUs0d0IsUUFBUXRwQixhQUN0Q2tzQixFQUFNaTBGLEVBQU8vdEYsV0FBVyxDQUFFeHJCLFNBQVF3akIsUUFBT2QsUUFBUzV3QixLQUFLNHdCLFVBQ3ZELE1BQU1xNEYsRUFBVzd3RyxNQUFNc3ZELFFBQVFsMEMsR0FBT0EsRUFBTSxDQUFDQSxHQUN6Q3h6QixLQUFLZ29ILDBCQUNMaG9ILEtBQUsrb0gsc0JBQXNCdnZGLEVBQVl3dkYsRUFBa0JDLEdBRTdELE1BQU1ZLEVBQWFaLEVBQVMvb0gsS0FBSzJPLElBSTdCLEdBQW9CLE1BQWhCQSxFQUFRM00sS0FDUixPQUFPMk0sRUFFWCxNQUFNLE9BQUVuSCxFQUFNLE1BQUVsRyxFQUFLLE1BQUVXLEdBQVUwTSxFQUNqQyxPQUFPN08sS0FBSytPLHFCQUFxQnJILEVBQVFsRyxFQUFPVyxNQU1wRCxHQUFJc25ILEVBQVUsQ0FDVixNQUFNSyxFQUFnQjlwSCxLQUFLK3BILHNCQUFzQnZ3RixFQUFZdHJCLEVBQVEyN0csR0FDckVMLEVBQVF4cEgsS0FBS2dxSCwyQkFBMkJGLEdBRTVDLE9BQU9ELE9BR1YsQ0FDRCxNQUFNLFlBQUVJLEdBQWdCWCxFQUVsQlksRUFBWTd2RixJQUlUb3ZGLElBR0xELEVBQVFudkYsRUFBUW42QixLQUFJc25FLEdBQVV4bkUsS0FBS21xSCxLQUFLbnFILEtBQUtza0gsTUFBTTk4QyxRQUV2RDl0QyxFQUFhLEtBQ1QsTUFBTXN2RixFQUFtQmhwSCxLQUFLNHdCLFFBQVF0cEIsYUFDdENrc0IsRUFBTXh6QixLQUFLaW9ILE1BQUssSUFBTWdDLEVBQVlqcUgsS0FBSzR3QixRQUFTczVGLEtBQ2hELE1BQU10cEIsRUFBUXhvRixNQUFNc3ZELFFBQVFsMEMsR0FBT0EsRUFBTSxDQUFDQSxHQUsxQyxPQUpJeHpCLEtBQUtnb0gsMEJBRUxob0gsS0FBSytvSCxzQkFBc0JhLEVBQW1CWixFQUFrQnBvQixHQUU3REEsR0FNZixNQUFNLE9BQUUxeUYsRUFBTSxNQUFFd2pCLEdBQVU0M0YsRUFDcEJjLEVBQWdCbkYsRUFBNkJxRSxHQUMvQyxLQUNBQSxFQUFhYyxjQUNqQixJQUFJQyxFQStCSixPQTlCQXJxSCxLQUFLb29ILFdBRUwsSUFBTXBvSCxLQUFLdW1ILE1BQU1kLGdCQUFlLElBQU16bEgsS0FBS3VtSCxNQUFNZCxnQkFBZSxLQUN2RHpsSCxLQUFLcWYsSUFBSS9ZLFFBQVEsVUFBYXRHLEtBQUt1bUgsTUFBTVYsV0FJMUN3RSxFQUFnQnJxSCxLQUFLd25ILFNBQVM4QyxjQUFjVixFQUFtQjE3RyxHQUFRLElBQU13ckIsTUFDekUxNUIsS0FBS3FmLElBQUkvWSxRQUFRLFVBQ2pCdEcsS0FBS3duSCxTQUFTK0MsaUJBQWlCRixHQUVuQ2QsRUFBVWMsRUFBY2QsU0FQeEJBLEVBQVU3dkYsT0FVZCt2RixHQUNBenBILEtBQUsyb0gsWUFBWWlCLEVBQW1CMTdHLEVBQVFxN0csRUFBU2EsRUFBZVosRUFBTzkzRixHQUUzRTF4QixLQUFLdW1ILE1BQU1WLFdBQ1g3bEgsS0FBS3VtSCxNQUFNVCxjQUFjSSxRQUFRM2xILEtBQUssQ0FDbENwQyxLQUFNeXJILEVBQ05ZLFdBQVl4cUgsS0FBS3VtSCxNQUFNeHpCLFNBQVcyMkIsRUFDbENlLG1CQUFvQnpxSCxLQUFLdW1ILE1BQU14ekIsU0FDL0IyM0IsYUFBYzFxSCxLQUFLdW1ILE1BQU1qRyxXQUFhcUosRUFDdENnQixxQkFBc0IzcUgsS0FBS3VtSCxNQUFNakcsV0FDakNzSyxZQUFhdHNILE9BQU9zVCxLQUFLMUQsR0FBUWhPLEtBQUlmLEdBQXNCLE1BQWYrTyxFQUFPL08sR0FBZStPLEVBQU8vTyxHQUFLcUMsTUFBUSxPQUN0RnFwSCxhQUFjdEIsRUFBUXJwSCxLQUFJNHFILEdBQVFBLEVBQUt0cEgsUUFDdkN1cEgsYUFBY1YsRUFBY1csT0FDNUJDLFVBQVdaLEVBQWNZLFlBR3pCN3lHLE1BQU1zdkQsUUFBUWwwQyxHQUFPKzFGLEVBQVVBLEVBQVEsR0FPbkRTLDJCQUEyQjN2RixHQUV2QixPQURjQSxFQUFRbjZCLEtBQUlzbkUsR0FBVXhuRSxLQUFLbXFILEtBQUtucUgsS0FBS3NrSCxNQUFNOThDLE1BVTdEdWlELHNCQUFzQnZ3RixFQUFZdHJCLEVBQVFxN0csR0FDdEMsTUFBTTJCLEVBQWEsc0JBQVkxeEYsR0FDL0IsR0FBa0IsTUFBZDB4RixFQUFvQixDQUNwQixNQUFNQyxFQUFlRCxFQUFXQyxjQUFnQixHQUMxQ0MsRUFBZ0JGLEVBQVdFLGVBQWlCLEdBR2xELElBQUlDLEVBQ0FILEVBQVdJLGVBQ1gsU0FBWWx6RyxNQUFNc3ZELFFBQVF4NUQsSUFBUyxJQUFNLDJEQUN6Q205RyxFQUFxQi9zSCxPQUFPc1QsS0FBSzFELEdBQVFoTyxLQUFLZixHQUFRK08sRUFBTy9PLE1BRzdEa3NILEVBQXFCRixFQUFhanJILEtBQUtxckgsR0FBY3I5RyxFQUFPcTlHLEtBRWhFLE1BQU1DLEVBQXNCakMsRUFBUXA5RyxRQUFPLENBQUNoTSxFQUFHdkMsSUFBTXd0SCxFQUFjeHRILEtBQ25FLE9BQU95dEgsRUFBbUJ4b0gsT0FBTzJvSCxHQVFyQyxNQUFPLEdBT1hDLFdBQVdqa0gsRUFBUWhHLEVBQU9XLEVBQU95dUIsR0FDN0IsR0FBYyxNQUFWcHBCLEVBQ0EsTUFBTSxJQUFJakIsTUFBTSxpREFFcEJwRSxFQUFRQSxHQUFTLFVBQ2pCeXVCLEVBQVVBLEdBQVc1d0IsS0FBSzR3QixRQUMxQixJQUFJODZGLEVBQWNsa0gsRUFDSixXQUFWckYsR0FBc0IsV0FBY3FGLEVBQU8sTUFDM0Nra0gsRUFBY2xrSCxFQUFPdEgsS0FBSWhDLEdBQUssZUFBa0JBLE1BRXBELE1BQU13SixFQUFTa3BCLEVBQVFycEIsTUFBTW1rSCxFQUFhbHFILEVBQU9XLEdBQzNDckQsRUFBSSxJQUFJLFNBQU8wQyxFQUFPVyxFQUFPdUYsRUFBUTFILEtBQUt1b0gsZ0JBR2hELEdBRkF2b0gsS0FBSzJySCxZQUFZN3NILEVBQUc4eEIsR0FFTixXQUFWenVCLEVBQW9CLENBQ3BCLE1BQU1nUCxFQUFPblIsS0FBS3VtSCxNQUFNbCtHLFdBQVc1SixJQUFJaUosR0FDakNxK0csRUFBVywrQkFBcUIyRixHQUN0QzFySCxLQUFLdW1ILE1BQU14ekIsVUFBWWd6QixFQUFXNTBHLEVBQUt5NkcsTUFDdkN6NkcsRUFBS3k2RyxNQUFRN0YsRUFFakIsT0FBT2puSCxFQU9YaVEscUJBQXFCckgsRUFBUWxHLEVBQU9XLEVBQU95dUIsR0FDdkN6dUIsRUFBUUEsR0FBUyxVQUNqQixNQUFNckQsRUFBSSxJQUFJLFNBQU8wQyxFQUFPVyxFQUFPdUYsRUFBUTFILEtBQUt1b0gsZ0JBRWhELE9BREF2b0gsS0FBSzJySCxZQUFZN3NILEVBQUc4eEIsR0FDYjl4QixFQUVYK3NILGFBQWFoOEIsRUFBY2k4QixHQUFZLEVBQU0zdEgsRUFBTWdFLEdBQy9DaEUsRUFBT0EsR0FBUTZCLEtBQUt3b0gsaUJBQWlCbnZELFdBQ3hCLE1BQVRsM0QsR0FBaUJBLElBQVUwdEYsRUFBYTF0RixRQUN4QzB0RixFQUFlQSxFQUFhdHRELEtBQUtwZ0MsSUFFckMsTUFBTSswRSxFQUFJLElBQUksV0FBUzJZLEVBQWNpOEIsRUFBVzN0SCxFQUFNNkIsS0FBS3VvSCxnQkFDM0QsR0FBOEMsTUFBMUN2b0gsS0FBS3VtSCxNQUFNbkIsb0JBQW9CbHVDLEVBQUUvNEUsTUFDakMsTUFBTSxJQUFJb0ksTUFBTSxzQkFBc0Iyd0UsRUFBRS80RSwrQkFJNUMsT0FGQTZCLEtBQUt1bUgsTUFBTW5CLG9CQUFvQmx1QyxFQUFFLzRFLE1BQVErNEUsRUFDekNsM0UsS0FBS2lJLE9BQU9pdkUsRUFBR2wzRSxLQUFLNHdCLFNBQ2JzbUQsRUFFWHkwQyxZQUFZMTRHLEVBQUcyZCxHQUNYNXdCLEtBQUt1bUgsTUFBTWpHLGFBQ0ssV0FBWnJ0RyxFQUFFOVEsT0FDRm5DLEtBQUt1bUgsTUFBTWpCLG1CQUlmLElBQUlzRyxFQUFRLEVBQ0ksY0FBWjM0RyxFQUFFOVEsT0FBcUMsV0FBWjhRLEVBQUU5USxRQUM3QnlwSCxFQUFRMzRHLEVBQUV6SSxLQUFPLGtCQUFxQnlJLEVBQUU5USxRQUU1Q25DLEtBQUt1bUgsTUFBTXh6QixVQUFZNjRCLEVBQ2xCNXJILEtBQUt1bUgsTUFBTWwrRyxXQUFXTCxJQUFJaUwsRUFBRXZMLFVBQzdCMUgsS0FBS3VtSCxNQUFNaEIsaUJBQ1h2bEgsS0FBS3VtSCxNQUFNbCtHLFdBQVdULElBQUlxTCxFQUFFdkwsT0FBUSxDQUNoQ2twQixRQUFTQSxHQUFXNXdCLEtBQUs0d0IsUUFDekJ6dUIsTUFBTzhRLEVBQUU5USxNQUNUWCxNQUFPeVIsRUFBRXpSLE1BQ1RvcUgsV0FHRjM0RyxhQUFhLFlBQ2ZqVCxLQUFLK3JILE1BQU05NEcsR0FRbkJoTCxPQUFPZ0wsRUFBRzJkLEdBQ041d0IsS0FBSzJySCxZQUFZMTRHLEVBQUcyZCxHQUNwQjV3QixLQUFLNHdCLFFBQVEzb0IsT0FBT2dMLEVBQUV2TCxRQUUxQm9ELGFBQWFwRCxFQUFRa3BCLEdBQ2I1d0IsS0FBS3VtSCxNQUFNbCtHLFdBQVdMLElBQUlOLElBQzFCMUgsS0FBS3VtSCxNQUFNbCtHLFdBQVc1SixJQUFJaUosR0FBUWtwQixVQUFZQSxJQUM5QzV3QixLQUFLdW1ILE1BQU1sK0csV0FBV3dDLE9BQU9uRCxHQUM3QjFILEtBQUt1bUgsTUFBTWhCLGtCQUduQnlHLGNBQWMvNEcsR0FDVixJQUFLalQsS0FBS3VtSCxNQUFNbCtHLFdBQVdMLElBQUlpTCxFQUFFdkwsUUFDN0IsT0FFSixNQUFNeUosRUFBT25SLEtBQUt1bUgsTUFBTWwrRyxXQUFXNUosSUFBSXdVLEVBQUV2TCxRQVF6QyxHQVBBMUgsS0FBS3VtSCxNQUFNakcsYUFDSyxXQUFacnRHLEVBQUU5USxRQUNGbkMsS0FBS3VtSCxNQUFNakIsbUJBQ1h0bEgsS0FBS3VtSCxNQUFNeHpCLFVBQVk1aEYsRUFBS3k2RyxPQUloQixjQUFaMzRHLEVBQUU5USxPQUFxQyxXQUFaOFEsRUFBRTlRLE1BQW9CLENBQ2pELE1BQU15cEgsRUFBUTM0RyxFQUFFekksS0FBTyxrQkFBcUJ5SSxFQUFFOVEsT0FDOUNuQyxLQUFLdW1ILE1BQU14ekIsVUFBWTY0QixFQUd2Qno2RyxFQUFLeWYsUUFBUXRvQixZQUFZMkssRUFBRXZMLFNBQzNCMUgsS0FBSzhLLGFBQWFtSSxFQUFFdkwsT0FBUXlKLEVBQUt5ZixTQU16Q3E3RixtQkFDSSxJQUFLLE1BQU16aUcsS0FBV3hwQixLQUFLdW1ILE1BQU1uQixvQkFBcUIsQ0FDbEQsTUFBTWx1QyxFQUFJbDNFLEtBQUt1bUgsTUFBTW5CLG9CQUFvQjU3RixHQUN6Q3hwQixLQUFLa3NILGdCQUFnQmgxQyxJQUc3QmcxQyxnQkFBZ0JoMUMsR0FDWmwzRSxLQUFLZ3NILGNBQWM5MEMsR0FDMkIsTUFBMUNsM0UsS0FBS3VtSCxNQUFNbkIsb0JBQW9CbHVDLEVBQUUvNEUsY0FDMUI2QixLQUFLdW1ILE1BQU1uQixvQkFBb0JsdUMsRUFBRS80RSxNQUdoRHVPLFNBQ0ksTUFBTXlFLEVBQU9uUixLQUFLNHdCLFFBQVFsa0IsU0FZMUIsT0FYQXlFLEVBQUttdkcsV0FBYXRnSCxLQUFLdW1ILE1BQU1qRyxXQUM3Qm52RyxFQUFLbzBHLGVBQWlCdmxILEtBQUt1bUgsTUFBTWhCLGVBQ2pDcDBHLEVBQUs0aEYsU0FBVy95RixLQUFLdW1ILE1BQU14ekIsU0FDdkIveUYsS0FBS3VtSCxNQUFNakIsaUJBQW1CLElBQzlCbjBHLEVBQUt4RSxZQUFhLEVBQ0UsTUFBaEJ3RSxFQUFLNDJELFVBQ0w1MkQsRUFBSzQyRCxRQUFVLElBRW5CNTJELEVBQUs0MkQsUUFBUXhuRSxLQUFLLDBFQUdmNFEsRUFFWCxjQUFjakYsR0FDVmxNLEtBQUt1bUgsTUFBTVYsV0FBWSxFQUN2QixNQUFNc0csRUFBYW5zSCxLQUFLdW1ILE1BQU14ekIsU0FDeEJxNUIsRUFBa0Jwc0gsS0FBS3VtSCxNQUFNakcsV0FDbkN0Z0gsS0FBS3VtSCxNQUFNVCxjQUFjSSxRQUFVLEdBQ25DbG1ILEtBQUt1bUgsTUFBTVQsY0FBYzU4RyxhQUFlZ0QsSUFDeENsTSxLQUFLdW1ILE1BQU1WLFdBQVksRUFDdkI3bEgsS0FBS3VtSCxNQUFNVCxjQUFjRyxVQUFZbGtILEtBQUswOUIsT0FBT3ovQixLQUFLdW1ILE1BQU1ULGNBQWNJLFFBQVFobUgsS0FBSWhDLEdBQUtBLEVBQUV1c0gsc0JBQzdGenFILEtBQUt1bUgsTUFBTVQsY0FBY0MsU0FBVy9sSCxLQUFLdW1ILE1BQU14ekIsU0FBV281QixFQUMxRG5zSCxLQUFLdW1ILE1BQU1ULGNBQWNFLFdBQ3JCaG1ILEtBQUt1bUgsTUFBTWpHLFdBQWE4TCxFQUM1QixJQUFLLE1BQU0zRSxLQUFVem5ILEtBQUt1bUgsTUFBTVQsY0FBY0ksUUFDMUN1QixFQUFPc0QsbUJBQXFCdEQsRUFBT3NELGFBQ25DdEQsRUFBT3dELGdCQUFrQnhELEVBQU93RCxVQUVwQyxPQUFPanJILEtBQUt1bUgsTUFBTVQsY0FFdEIyRCxXQUNJLE9BQU96cEgsS0FBS3VtSCxNQUFNZixjQUFnQixHQUFnQyxJQUEzQnhsSCxLQUFLdW1ILE1BQU1kLFlBRXREa0QsWUFBWW52RixFQUFZdHJCLEVBQVFxN0csRUFBUzhDLEVBQWU3QyxFQUFPOTNGLEdBQzNELE1BQU00NkYsRUFBVyxDQUFFM2tILEdBQUkzSCxLQUFLdW1ILE1BQU1sQixpQkFBa0I3ckYsYUFBWXRyQixTQUFRcTdHLFVBQVNDLFNBQzNFMEIsRUFBYSxzQkFBWTF4RixHQUNiLE1BQWQweEYsSUFDQW1CLEVBQWdCbkIsRUFBV3FCLFVBRVYsTUFBakJGLElBQ0FDLEVBQVNFLFNBQVlDLElBR2pCQSxFQUFNQSxFQUFJdnNILEtBQUksQ0FBQ3c5QixFQUFJOS9CLEtBQ2YsR0FBVSxNQUFOOC9CLEVBQVksQ0FDWixNQUFNbnlCLEVBQVNnK0csRUFBUTNySCxHQUNqQm1NLEVBQU8sc0JBQXlCd0IsRUFBT2YsS0FBTWUsRUFBT3BKLE9BQzFELE9BQU9uQyxLQUFLeXJILFdBQVcxaEgsRUFBTXdCLEVBQU8vSixNQUFPK0osRUFBT3BKLE9BRXRELE9BQU91N0IsS0FJSjJ1RixFQUFjSSxFQUFJL3FILE9BQVMsRUFBSStxSCxFQUFNQSxFQUFJLEdBQUlqRCxFQUFPOTNGLEtBR25FMXhCLEtBQUt1bUgsTUFBTW1HLFdBQVduc0gsS0FBSytySCxHQUUvQm5DLEtBQUtqaEgsR0FFRCxPQURBQSxFQUFPeWpILE1BQU8sRUFDUHpqSCxFQUVYMGpILFlBQ3FDLElBQTdCNXNILEtBQUt1bUgsTUFBTWYsZ0JBQ1h4bEgsS0FBS3VtSCxNQUFNbUcsV0FBYSxJQUU1QjFzSCxLQUFLdW1ILE1BQU1mLGdCQUVmcUgsVUFDSTdzSCxLQUFLdW1ILE1BQU1mLGdCQU1mNkMsV0FBV2xxSCxHQUNQLE1BQU0ydUgsRUFBWSxDQUNkZixNQUFPLEdBQ1A1dEgsS0FBTSxnQkFDTndKLEdBQUkzSCxLQUFLdW1ILE1BQU1YLGVBRWZ6bkgsSUFDQTJ1SCxFQUFVM3VILEtBQU9BLEdBRXJCNkIsS0FBS3VtSCxNQUFNYixXQUFXbmxILEtBQUt1c0gsR0FDM0I5c0gsS0FBS3VtSCxNQUFNcUMsWUFBY2tFLEVBTTdCeEUsU0FBU3AvRyxHQUNMLE1BQU02akgsRUFBeUIsZ0NBQXNCN2pILEdBQy9DOGpILEVBQTRCLElBQUlsTSxJQUFJaU0sRUFBdUI3c0gsS0FBSXBCLEdBQUtBLEVBQUU2SSxNQUU1RSxJQUFLLElBQUkvSixFQUFJLEVBQUdBLEVBQUlvQyxLQUFLdW1ILE1BQU1xQyxZQUFZbUQsTUFBTXJxSCxPQUFROUQsSUFBSyxDQUMxRCxNQUFNNHBFLEVBQVN4bkUsS0FBS3VtSCxNQUFNcUMsWUFBWW1ELE1BQU1udUgsR0FDdkM0cEUsRUFBT21sRCxNQUFTSyxFQUEwQmhsSCxJQUFJdy9ELEVBQU83L0QsS0FDdEQ2L0QsRUFBTzcxRCxVQUdmLE1BQU1zN0csRUFBV2p0SCxLQUFLdW1ILE1BQU1iLFdBQVc5VyxNQUN2QzV1RyxLQUFLdW1ILE1BQU1xQyxZQUErQyxJQUFqQzVvSCxLQUFLdW1ILE1BQU1iLFdBQVdoa0gsT0FDM0MsS0FDQTFCLEtBQUt1bUgsTUFBTWIsV0FBVzFsSCxLQUFLdW1ILE1BQU1iLFdBQVdoa0gsT0FBUyxHQUV6RHFySCxFQUF1QjFzSCxTQUFRbW5FLElBR3RCQSxFQUFPbWxELE1BQVFubEQsRUFBTzBsRCxVQUFZRCxFQUFTdGxILElBQzVDM0gsS0FBSytySCxNQUFNdmtELE1BVXZCbVAsVUFBVWhyRSxFQUFHd2hILEVBQUl6dkYsRUFBSTB2RixHQUFtQixHQUVwQyxHQURBLFNBQVlELEVBQUd6ckgsT0FBUyxHQUFHLElBQU0sOENBQ3ZCLE1BQU5nOEIsR0FBMkIsWUFBYkEsRUFBR3Y3QixNQUNqQixNQUFNLElBQUlvRSxNQUFNLDBDQUEwQ20zQixFQUFHdjdCLFVBRWpFLE1BQU1zbUIsRUFBSXpvQixLQUFLb29ILFdBQVUsSUFBTXBvSCxLQUFLNHNILGNBQWEsSUFBTTVzSCxLQUFLNnNILFlBQVcsSUFBTTdzSCxLQUFLaW9ILEtBQUssVUFBV3Q4RyxLQUNsRyxTQUFZOGMsYUFBYSxVQUFRLElBQU0sbURBRXZDLE1BQU00a0csRUFBZSwrQkFBcUJydEgsS0FBS3VtSCxNQUFNbUcsV0FBWVMsRUFBSTFrRyxHQUNyRSxJQUFLMmtHLEdBQTRDLElBQXhCQyxFQUFhM3JILFFBQWdCeXJILEVBQUd6ckgsT0FBUyxFQUM5RCxNQUFNLElBQUk2RSxNQUFNLHVJQUlwQixPQUFPdkcsS0FBS2lvSCxLQUFLLFlBQVksS0FDekIsTUFBTXFGLEVBQXlCLEdBQy9CQSxFQUF1QjdrRyxFQUFFOWdCLElBQWEsTUFBTisxQixFQW1INUMsU0FBY2w4QixHQUNWLE1BQU1nRyxFQUFTLDZCQUFtQix3QkFBY2hHLEdBQVEsV0FDeEQsT0FBT2luSCxFQUFPZ0QsV0FBV2prSCxFQUFRaEcsRUFBTyxXQXJIYytySCxDQUFLOWtHLEVBQUVqbkIsT0FBU2s4QixFQUU5RCxpQ0FBdUI0dkYsRUFBd0JELEdBRS9DMWhILEdBQUszTCxLQUFLaW9ILEtBQUt0OEcsSUFFZjhCLEdBQ0EsTUFBTSsvRyxFQUFRTCxFQUFHanRILEtBQUl5QyxHQUFLMnFILEVBQXVCM3FILEVBQUVnRixNQVduRCxPQVZpQyxJQUE3QjNILEtBQUt1bUgsTUFBTWYsZ0JBR1h4bEgsS0FBS3VtSCxNQUFNbUcsV0FBV3JzSCxTQUFRa2pHLElBQzFCLElBQUssTUFBTS83QixLQUFVKzdCLEVBQUtpbUIsTUFDdEJoaUQsRUFBTzcxRCxhQUdmM1IsS0FBS3VtSCxNQUFNbUcsV0FBYSxNQUVyQixDQUFFN3RILE1BQU80cEIsRUFBRytrRyxZQUczQkMsV0FBVzloSCxHQUVQLE9BREEsU0FBWSxhQUFnQkEsSUFBSSxJQUFNLHNEQUMvQixJQUFJdUMsS0FHUCxJQUFJdkYsRUFGSixTQUFZdUYsRUFBT0UsT0FBTXRQLEdBQUtBLGFBQWEsWUFBUyxJQUFNLHFFQUcxRCxNQUFNNHVILEVBQVcsR0FDakJ4L0csRUFBTzdOLFNBQVEsQ0FBQ2dPLEVBQU96USxLQUNuQjh2SCxFQUFTOXZILEdBQUt5USxLQXlCbEIsT0FBT3JPLEtBQUs4b0gsY0FBYyxDQUN0Qm1CLFlBeEJnQixDQUFDOXBILEVBQUd3dEgsS0FDcEJobEgsRUFBTWdELEtBQVN1QyxFQUFReS9HLEdBQ3ZCLFNBQVlobEgsRUFBSTlKLGlCQUFpQixVQUFRLElBQU0sK0ZBRS9DLFNBQVksYUFBZ0I4SixFQUFJNGpILFdBQVcsSUFBTSxxR0FFMUM1akgsRUFBSTlKLE9BbUJYdXJILGNBakJrQixDQUFDMXNGLEVBQUk4ckYsS0FDdkIsTUFBTW9FLEVBQVVqbEgsRUFBSTRqSCxTQUFTN3VGLEVBQUk4ckYsR0FDM0JnRSxFQUFRcDFHLE1BQU1zdkQsUUFBUWttRCxHQUFXQSxFQUFVLENBQUNBLEdBQ2xELFNBQVlKLEVBQU05ckgsU0FBV3dNLEVBQU94TSxRQUFRLElBQU0sd0tBR2xELFNBQVk4ckgsRUFBTXAvRyxPQUFNdFAsR0FBS0EsYUFBYSxZQUFTLElBQU0seUlBR3pELE1BQU0rdUgsRUFBVSxHQUloQixPQUhBTCxFQUFNbnRILFNBQVEsQ0FBQ3l0SCxFQUFNbHdILEtBQ2pCaXdILEVBQVFqd0gsR0FBSyxJQUFNa3dILEtBRWhCRCxHQUtQMy9HLE9BQVF3L0csS0FJcEJubEgsU0FBU2IsR0FHTCxPQURhMUgsS0FBS3VtSCxNQUFNbCtHLFdBQVc1SixJQUFJaUosR0FDM0JrcEIsUUFBUXJvQixTQUFTYixHQUVqQ21DLEtBQUtuQyxHQUdELE9BRGExSCxLQUFLdW1ILE1BQU1sK0csV0FBVzVKLElBQUlpSixHQUMzQmtwQixRQUFRL21CLEtBQUtuQyxHQUU3QixXQUFXd0UsR0FDUCxNQUFNakQsRUFBUSxnQkFDUjhrSCxRQUFtQi90SCxLQUFLNHdCLFFBQVF0ZixLQUFLcEYsR0FFM0MsT0FEQTZoSCxFQUFXemhILE9BQVMsZ0JBQVFyRCxFQUNyQjhrSCxFQVFYaEMsTUFBTTdpSCxHQUtGLE9BSjhCLE1BQTFCbEosS0FBS3VtSCxNQUFNcUMsY0FDWDEvRyxFQUFPZ2tILFFBQVVsdEgsS0FBS3VtSCxNQUFNcUMsWUFBWWpoSCxHQUN4QzNILEtBQUt1bUgsTUFBTXFDLFlBQVltRCxNQUFNeHJILEtBQUsySSxJQUUvQkEsRUFFWCwwQkFDSSxPQUFPbEosS0FBS3VtSCxNQUFNbkIsb0JBTXRCNEksUUFFSWh1SCxLQUFLc21ILHVCQUNMdG1ILEtBQUt1bUgsTUFBTTUwRyxVQUNYM1IsS0FBS3FmLElBQUkydUcsUUFDVGh1SCxLQUFLdW1ILE1BQVEsSUFBSXBCLEVBQ2pCLElBQUssTUFBTTFyRixLQUFlejVCLEtBQUtvbUgsU0FDM0JwbUgsS0FBSzBuSCx5QkFBeUJqdUYsR0FDOUJ6NUIsS0FBS29tSCxTQUFTM3NGLEdBQWE5bkIsaUJBQ3BCM1IsS0FBS29tSCxTQUFTM3NGLEdBRXpCejVCLEtBQUt5NUIsWUFBYyxLQUNuQno1QixLQUFLeW1ILGdCQUFrQixLQUN2QnptSCxLQUFLd21ILG1CQUFxQixNQVMzQixTQUFTeUgsSUFDWixNQUFNaHZILEVBQUssK0JBQ1gsR0FBb0IsTUFBaEJBLEVBQUdpdkgsVUFBbUIsQ0FDdEIsTUFBTUMsRUFBYyxJQUFJLGNBQVlsdkgsR0FDcENBLEVBQUdpdkgsVUFBWSxJQUFJL0gsRUFBT2dJLEdBTTlCLE9BSkEsK0JBQXFCbHZILEVBQUdpdkgsVUFBVTd1RyxLQUdsQyw0QkFBaUIsSUFBTXBnQixFQUFHaXZILFlBQ25CanZILEVBQUdpdkgsVUFoQmQvSCxFQUFPb0MsYUFBZSxFQUN0QnBDLEVBQU9xQyxlQUFpQixFQWlCakIsTUFBTUMsRUFBU3dGLElBT2YsU0FBU3hnSCxFQUFJd0YsRUFBR3lmLEdBRW5CLE1BQU14a0IsRUFBUyxDQUFFK0UsSUFBR3lmLEtBQ3BCLE9BQU8rMUYsRUFBT0MsVUFBVSxNQUFLeDZHLEs7Ozs7aUhDaC9CakM7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkEsTUFBTWtnSCxFQUE0QixZQVEzQixNQUFNQyxFQUVUeHVILFlBQVlpSCxHQUNSOUcsS0FBSzhHLE9BQVNBLEVBQ2Q5RyxLQUFLc3VILE1BQVEsR0FDYnR1SCxLQUFLdXVILGFBQWUsR0FDcEJ2dUgsS0FBS3d1SCxTQUFXLEdBRWhCeHVILEtBQUt5dUgsZUFBaUJBLEVBQ3RCenVILEtBQUswdUgsbUJBRVRDLFlBQVlDLEVBQWNDLEdBQ0QsTUFBakI3dUgsS0FBSzZ1SCxVQUNMcjdHLFFBQVEvRSxLQUFLLFlBQVl6TyxLQUFLNHVILG9FQUNPQyxNQUV6Qzd1SCxLQUFLNHVILGFBQWVBLEVBQ3BCNXVILEtBQUs2dUgsU0FBV0EsRUFFcEJ2dkcsYUFBYXd2RyxFQUFVQyxFQUFjQyxHQUlqQyxHQUhBaHZILEtBQUt1dUgsYUFBYU8sR0FBWSxDQUFFQyxlQUFjQyxXQUdmLE1BQTNCaHZILEtBQUt3dUgsU0FBU00sR0FBbUIsQ0FDakMsTUFBTUcsRUFBWWp2SCxLQUFLd3VILFNBQVNNLEdBQ2hDdDdHLFFBQVEvRSxLQUFLLHFDQUFxQ3FnSCxNQUFhRyxNQUMvRGp2SCxLQUFLNEgsSUFBSWtuSCxFQUFVRyxJQUczQixlQUFlSCxHQUNYLE9BQUlBLEtBQVk5dUgsS0FBS3N1SCxRQUdyQnR1SCxLQUFLc3VILE1BQU1RLFNBQWtCOXVILEtBQUtrdkgsYUFBYUosSUFGcEM5dUgsS0FBS3N1SCxNQUFNUSxHQUsxQnJ3SCxJQUFJcXdILEdBQ0EsR0FBSUEsS0FBWTl1SCxLQUFLc3VILE1BQ2pCLE9BQU90dUgsS0FBS3N1SCxNQUFNUSxHQUV0QixNQUFNRyxFQUFZanZILEtBQUtrdkgsYUFBYUosR0FDcEMsR0FBSSxvQkFBVUcsR0FDVixNQUFNLElBQUkxb0gsTUFBTSxRQUFRdW9ILHVFQUk1QixPQURBOXVILEtBQUtzdUgsTUFBTVEsR0FBWUcsRUFDaEJqdkgsS0FBS3N1SCxNQUFNUSxHQUV0QnhwSCxVQUFVd3BILEdBQ04sT0FBTzl1SCxLQUFLdkIsSUFBSXF3SCxHQUVwQnhvSCxRQUFRd29ILEdBQ0osT0FBTzl1SCxLQUFLdkIsSUFBSXF3SCxHQUVwQkssV0FDSSxPQUFPbnZILEtBQUtzdUgsTUFHaEIsZUFDSSxPQUFPdHVILEtBQUtzdUgsTUFFaEIxbUgsSUFBSWtuSCxFQUFVandILEdBQ1YsR0FBbUMsTUFBL0JtQixLQUFLdXVILGFBQWFPLEdBQ2xCLE1BQU0sSUFBSXZvSCxNQUFNLG1CQUFtQnVvSCxvQ0FFdkM5dUgsS0FBS3N1SCxNQUFNUSxHQUFZandILEVBQ29CLE1BQXZDbUIsS0FBS3V1SCxhQUFhTyxHQUFVRSxTQUM1Qmh2SCxLQUFLdXVILGFBQWFPLEdBQVVFLFFBQVFud0gsR0FHNUNxd0gsYUFBYUosR0FDVCxHQUFtQyxNQUEvQjl1SCxLQUFLdXVILGFBQWFPLEdBQ2xCLE1BQU0sSUFBSXZvSCxNQUFNLHlCQUF5QnVvSCxxQ0FFN0MsT0FBTzl1SCxLQUFLdXVILGFBQWFPLEdBQVVDLGVBRXZDSyxTQUFTZCxHQUNMdHVILEtBQUtzdUgsTUFBUWh3SCxPQUFPeWhELE9BQU8sR0FBSXV1RSxHQUVuQ04sUUFDSWh1SCxLQUFLc3VILE1BQVEsR0FDYnR1SCxLQUFLd3VILFNBQVcsR0FDaEJ4dUgsS0FBSzB1SCxtQkFFVEEsbUJBQ0ksR0FBMkIsb0JBQWhCMXVILEtBQUs4RyxRQUNvQixvQkFBekI5RyxLQUFLOEcsT0FBT2krRixVQUNvQixvQkFBaEMva0csS0FBSzhHLE9BQU9pK0YsU0FBU3NxQixPQUM1QixPQUVKLE1BQU1DLEVBQVl0dkgsS0FBS3l1SCxlQUFlenVILEtBQUs4RyxPQUFPaStGLFNBQVNzcUIsUUFDM0QsR0FBSWpCLEtBQTZCa0IsRUFBVyxDQUN0QkEsRUFBbUMsVUFBRXh0RCxNQUFNLEtBQ25EemhFLFNBQVFrdkgsSUFDZCxNQUFPcHdILEVBQUtOLEdBQVMwd0gsRUFBU3p0RCxNQUFNLEtBQ3BDOWhFLEtBQUt3dUgsU0FBU3J2SCxHQWdCOUIsU0FBb0IydkgsRUFBVWp3SCxHQUUxQixHQUFjLFVBRGRBLEVBQVFBLEVBQU0yd0gsZ0JBQ29CLFVBQVYzd0gsRUFDcEIsTUFBaUIsU0FBVkEsRUFFTixHQUFJLEtBQUlBLElBQVlBLEVBQ3JCLE9BQVFBLEVBRVosTUFBTSxJQUFJMEgsTUFBTSxvQ0FBb0MxSCxjQUFrQml3SCxNQXhCckNXLENBQVd0d0gsRUFBS04sUUFLOUMsU0FBUzR2SCxFQUFlaUIsR0FDM0IsTUFBTW5nRixFQUFTLEdBS2YsT0FKQW1nRixFQUFZdnJCLFFBQVEsK0JBQStCLENBQUN4a0csS0FBTWIsS0FNOUQsU0FBcUJ5d0MsRUFBUXB4QyxFQUFNVSxHQUMvQjB3QyxFQUFPb2dGLG1CQUFtQnh4SCxJQUFTd3hILG1CQUFtQjl3SCxHQUFTLElBTjNEK3dILENBQVlyZ0YsRUFBUXp3QyxFQUFFLEdBQUlBLEVBQUUsSUFDckJBLEVBQUUyQixLQUFLLFFBRVg4dUMsRUF1QkosU0FBUzZsRCxJQUNaLE9BQU8vMUUsRUFFSixJQUFJQSxFQUFNLEtBQ1YsU0FBU3d3RyxFQUFxQjFCLEdBQ2pDOXVHLEVBQU04dUcsSTs7Ozt1RENoS1Y7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbUJBLE1BQU05dUcsRUFBTSxnQkFLWkEsRUFBSUMsYUFBYSxTQUFTLEtBQU0sSUFBT3d3RyxJQUMvQkEsR0FDQXQ4RyxRQUFRL0UsS0FBSyxrSkFNckI0USxFQUFJQyxhQUFhLGNBQWMsSUFBTSxnQkFFckNELEVBQUlDLGFBQWEsV0FBVyxJQUEwQixvQkFBWitqRixHQUNULG9CQUFyQkEsRUFBUUMsVUFDa0Isb0JBQTFCRCxFQUFRQyxTQUFTQyxPQUU3QmxrRixFQUFJQyxhQUFhLGFBQWEsSUFBMkIsb0JBQWQwdUYsV0FBMEMsTUFBYkEsV0FDN0MsTUFBdkJBLFVBQVU0VyxXQUFxQixTQUFTRyxLQUFLL1csVUFBVTRXLFlBQ3ZELGFBQWFHLEtBQUsvVyxVQUFVNlcsVUFLaEN4bEcsRUFBSUMsYUFBYSxRQUFRLEtBQU0sSUFLL0JELEVBQUlDLGFBQWEsc0NBQXNDLElBQU1ELEVBQUkvWSxRQUFRLFdBRXpFK1ksRUFBSUMsYUFBYSxnQ0FBZ0MsS0FBTSxJQUV2REQsRUFBSUMsYUFBYSxXQUFXLEtBQU0sSUFFbENELEVBQUlDLGFBQWEsZ0NBQWdDLEtBQU0sSUFFdkRELEVBQUlDLGFBQWEsdUJBQXVCLEtBQU0sSzs7OzttRkMxRDlDOzs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQSxJQUFJeXdHLEVBRUcsU0FBU0MsSUFDWixHQUF1QixNQUFuQkQsRUFBeUIsQ0FFekIsSUFBSTl3SCxFQUNKLEdBQXdCLG9CQUFiLE9BQ1BBLEVBQUtpSSxZQUVKLEdBQXdCLG9CQUFiLEVBQ1pqSSxFQUFLNkgsT0FFSixHQUF5QixvQkFBZCxFQUNaN0gsRUFBS29rRyxNQUVKLElBQXNCLG9CQUFYLEtBSVosTUFBTSxJQUFJOThGLE1BQU0sa0NBSGhCdEgsRUFBSzZsRyxLQUtUaXJCLEVBQWtCOXdILEVBRXRCLE9BQU84d0gsRUFpQkosU0FBU0UsRUFBVTl3SCxFQUFLd3pGLEdBQzNCLE1BQU11OUIsRUFmVixXQUNJLE1BQU1qeEgsRUFBSyt3SCxJQUlYLE9BSHFCLE1BQWpCL3dILEVBQUdreEgsYUFDSGx4SCxFQUFHa3hILFdBQWEsSUFBSUMsS0FFakJueEgsRUFBR2t4SCxXQVVRRSxHQUNsQixHQUFJSCxFQUFVbG9ILElBQUk3SSxHQUNkLE9BQU8rd0gsRUFBVXp4SCxJQUFJVSxHQUVwQixDQUNELE1BQU1teEgsRUFBWTM5QixJQUVsQixPQURBdTlCLEVBQVV0b0gsSUFBSXpJLEVBQUtteEgsR0FDWkosRUFBVXp4SCxJQUFJVSxJQXBFN0IsOEY7Ozs7OFRDQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMEJPLFNBQVNveEgsSUFDWixnQkFBTTNvSCxJQUFJLFFBQVEsR0FnQmYsU0FBUzRvSCxJQUNaLGdCQUFNNW9ILElBQUksU0FBUyxHQUdoQixTQUFTNm9ILElBQ1osZ0JBQU03b0gsSUFBSSxnQ0FBZ0MsR0FDMUM0TCxRQUFRL0UsS0FBSywwREFHVixTQUFTaWlILEVBQWdCalMsR0FDeEIsZ0JBQU1uNEcsUUFBUSxpQ0FDZGtOLFFBQVEvRSxLQUFLZ3dHLGlGQVVkLFNBQVN3TixJQUNaLFNBQU9BLG1CQU9KLFNBQVMwRSxJQUNaLE9BQU8sU0F1QkosU0FBU2prSCxJQUNaLE9BQU8sU0FBT0EsU0FpQ1gsU0FBU2trSCxFQUFRamxILEdBQ3BCLE9BQU8sU0FBT2lsSCxRQUFRamxILEdBMENuQixTQUFTczhHLEVBQUtDLEVBQVVDLEdBQzNCLE9BQU8sU0FBT0YsS0FBS0MsRUFBVUMsR0FhMUIsU0FBU3gyRyxFQUFRay9HLEdBQ0osZ0NBQXNCQSxHQUM5Qnh3SCxTQUFRbW5FLEdBQVVBLEVBQU83MUQsWUFrQzlCLFNBQVN3NEcsRUFBS2poSCxHQUNqQixPQUFPLFNBQU9paEgsS0FBS2poSCxHQTJCaEIsU0FBU29JLEVBQUszRixHQUNqQixPQUFPLFNBQU8yRixLQUFLM0YsR0FpQmhCLFNBQVNtN0csRUFBV3J0RixHQUN2QixPQUFPLFNBQU9xdEYsV0FBV3J0RixHQVN0QixTQUFTOGxGLElBQ1osT0FBTyxTQUFPQSxRQVFYLFNBQVN1UixJQUNaLE9BQU8sU0FBT3IzRixZQU9YLFNBQVNxdUYsRUFBYzNwSCxHQUMxQixTQUFPMnBILGNBQWMzcEgsR0FNbEIsU0FBUytvSCxFQUFZL29ILEdBQ3hCLE9BQU8sU0FBTytvSCxZQUFZL29ILEdBT3ZCLFNBQVNncEgsRUFBbUJocEgsR0FDL0IsT0FBTyxTQUFPZ3BILG1CQUFtQmhwSCxHQWlCOUIsU0FBU2twSCxFQUFnQmxwSCxFQUFNaXBILEVBQVNFLEVBQVcsR0FDdEQsT0FBTyxTQUFPRCxnQkFBZ0JscEgsRUFBTWlwSCxFQUFTRSxHQVUxQyxTQUFTMTJGLElBQ1osT0FBTyxTQUFPQSxRQVFYLFNBQVMrOUYsRUFBWUMsRUFBY0MsR0FDdEMsZ0JBQU1GLFlBQVlDLEVBQWNDLEdBcFNwQyxrQ0FBd0I2QixJOzs7O3lIQzFEeEI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBc0RBLFNBQVM1QyxFQUFLbmlILEdBRVYsT0FEQSxTQUFZLGFBQWdCQSxJQUFJLElBQU0sK0NBQy9CLENBQUNoSixFQUFHKzZCLEtBRVAsTUFBTWhDLEVBQUssMEJBQWdCLzRCLEVBQUcsSUFBSyxVQUFXLHFCQUN4Qyt6RSxFQUFhLE1BQU5oNUMsRUFBYywwQkFBZ0JBLEVBQUksS0FBTSxXQUFhLEtBQ2xFLE9BQU8sU0FBT3VxRixNQUFLLEtBQ2YsTUFBTSxNQUFFcHBILEVBQUssTUFBRTJ1SCxHQUFVLFNBQU83MkMsV0FBVSxJQUFNaHJFLEVBQUUrdkIsSUFBSyxDQUFDQSxHQUFLZzdDLEdBTTdELE9BTFcsTUFBUEEsR0FDQSxvQkFBdUI3M0UsRUFBTTJDLE1BQU9rMUUsRUFBSWwxRSxNQUFPLGtGQUduRHV2SCxFQUFXdkQsR0FDSkEsRUFBTSxPQWlDekIsU0FBU0EsRUFBTTdoSCxHQUVYLE9BREEsU0FBWSxhQUFnQkEsSUFBSSxJQUFNLGdEQUMvQixDQUFDMnRCLEVBQU1vRSxLQUNWLFNBQVl0bEIsTUFBTXN2RCxRQUFRcHVDLElBQU8sSUFBTSxxRkFHdkMsTUFBTTAzRixFQUFRLCtCQUFxQjEzRixFQUFNLE9BQVEsV0FBWSxxQkFDdkRvOUMsRUFBYSxNQUFOaDVDLEVBQWMsMEJBQWdCQSxFQUFJLEtBQU0sWUFBYyxLQUNuRSxPQUFPLFNBQU91cUYsTUFBSyxLQUNmLE1BQU0sTUFBRXBwSCxFQUFLLE1BQUUydUgsR0FBVSxTQUFPNzJDLFdBQVUsSUFBTWhyRSxLQUFLcWxILElBQVFBLEVBQU90NkMsR0FNcEUsT0FMVyxNQUFQQSxHQUNBLG9CQUF1QjczRSxFQUFNMkMsTUFBT2sxRSxFQUFJbDFFLE1BQU8saUdBR25EdXZILEVBQVd2RCxHQUNKQSxNQTZCbkIsU0FBU3lELEVBQWF0bEgsR0FFbEIsT0FEQSxTQUFZLGFBQWdCQSxJQUFJLElBQU0sdURBQy9CLENBQUNoSixFQUFHKzZCLEtBQ1AsU0FBWS82QixhQUFhLFVBQVEsSUFBTSx3REFDdkMsU0FBa0IsTUFBTis2QixHQUFjQSxhQUFjLFVBQVEsSUFBTSw2REFDdEQsTUFBTSxNQUFFOHZGLEVBQUssTUFBRTN1SCxHQUFVLFNBQU84M0UsV0FBVSxJQUFNaHJFLEVBQUVoSixJQUFJLENBQUNBLEdBQUkrNkIsR0FFM0QsT0FEQXF6RixFQUFXdkQsR0FDSixDQUFFTSxLQUFNTixFQUFNLEdBQUkzdUgsVUFrQ2pDLFNBQVNxeUgsRUFBY3ZsSCxHQUVuQixPQURBLFNBQVksYUFBZ0JBLElBQUksSUFBTSx3REFDL0IsQ0FBQzJ0QixFQUFNb0UsS0FDVixTQUFZdGxCLE1BQU1zdkQsUUFBUXB1QyxJQUFTQSxFQUFLbHJCLE9BQU11K0YsR0FBT0EsYUFBZSxZQUFTLElBQU0sdUVBRW5GLFNBQWtCLE1BQU5qdkUsR0FBY0EsYUFBYyxVQUFRLElBQU0saUVBQ3RELE1BQU0vMEIsRUFBTSxTQUFPZ3VFLFdBQVUsSUFBTWhyRSxLQUFLMnRCLElBQU9BLEVBQU1vRSxHQU1yRCxPQUxVLE1BQU5BLEdBQ0Esb0JBQXVCLzBCLEVBQUk5SixNQUFNMkMsTUFBT2s4QixFQUFHbDhCLE1BQU8seUdBR3REdXZILEVBQVdwb0gsRUFBSTZrSCxPQUNSN2tILEdBaUNmLFNBQVN3b0gsRUFBY3hsSCxFQUFHeWxILEdBQ3RCLFNBQVksYUFBZ0J6bEgsSUFBSSxJQUFNLHdEQUN0QyxTQUF1QixNQUFYeWxILEdBQ1JoNUcsTUFBTXN2RCxRQUFRMHBELElBQVlBLEVBQVFoakgsT0FBTThvRSxHQUFLQSxhQUFhLGNBQVcsSUFBTSxrRkFFL0UsTUFBTW02QyxFQUE4QixNQUFYRCxFQUN6QixJQUFLQyxFQUFrQixDQUVuQkQsRUFBVSxHQUNWLElBQUssTUFBTTVuRyxLQUFXLFNBQU80N0Ysb0JBQ3pCZ00sRUFBUTd3SCxLQUFLLFNBQU82a0gsb0JBQW9CNTdGLElBR2hELE1BQU04bkcsRUFBd0JELEVBQW1CRCxFQUFRamxILFFBQU83TCxJQUFhQSxFQUFTd3JILFlBQWEsS0FFN0Z5RixFQUFtQkgsRUFBUTF2SCxPQUNqQzB2SCxFQUFVQSxFQUFRamxILFFBQU83TCxHQUFZQSxFQUFTd3JILFlBQzlDLFNBQVlzRixFQUFRMXZILE9BQVMsR0FBRyxJQUM1QixnR0FBaUM2dkgsOEJBRXJDLE1BQ00sTUFBRTF5SCxFQUFLLE1BQUUydUgsR0FBVSxTQUFPNzJDLFVBQVVockUsRUFBR3lsSCxFQUFTLE1BRDdCLEdBRXpCLFNBQVk1RCxFQUFNNW9FLE1BQUs0c0UsR0FBVSxNQUFMQSxLQUFZLElBQU0saU1BRzlDLFNBQTJCLElBQWYzeUgsRUFBTXFELE1BQVksSUFDMUIsaUZBQW1CckQsRUFBTXFELGdCQUM3QixNQUFNdXZILEVBQWEsR0FXbkIsT0FWQUwsRUFBUS93SCxTQUFRLENBQUM2MkUsRUFBR3Q1RSxLQUNBLE1BQVo0dkgsRUFBTTV2SCxLQUNONnpILEVBQVd2NkMsRUFBRS80RSxNQUFRcXZILEVBQU01dkgsT0FHTixNQUF6QjB6SCxHQUdBQSxFQUFzQmp4SCxTQUFRNjJFLEdBQUt1NkMsRUFBV3Y2QyxFQUFFLzRFLE1BQVEsT0FFckQsQ0FBRVUsUUFBTzJ1SCxNQUFPaUUsR0EwQzNCLFNBQVNoRSxFQUFXOWhILEdBQ2hCLE9BQU8sU0FBTzhoSCxXQUFXOWhILEdBRTdCLFNBQVNvbEgsRUFBV3ZELEdBRWhCLEdBRHlCQSxFQUFNcmhILFFBQU9xbEgsR0FBVSxNQUFMQSxJQUFXOXZILE9BQy9CLEVBQ25CLE1BQU0sSUFBSTZFLE1BQU0sOEk7Ozs7OEVDNVR4Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkEsTUFBTW1ySCxFQXBCTixPQXNCQSxHQUF1QixFQUNoQixTQUFTQyxFQUFVQyxHQUN0QixPQUFPRixFQUFLRyxXQUFXRCxHQUFLLEVBQU0sSUFJdEMsTUFBTWxtRCxFQUFLaW1ELEVBQVUsb0JBRWZHLEVBQUtILEVBQVUsb0JBRWZJLEVBQUtKLEVBQVUsb0JBQ3JCLFNBQVNLLEVBQVM5MEcsR0FDZCxPQUFPQSxFQUFJKzBHLElBQUkvMEcsRUFBSWcxRyxLQUFLLEtBRTVCLFNBQVNqOUIsRUFBTXQxRixFQUFHOGdDLEVBQVFzeUQsR0FDdEIsTUFBTTY0QixFQUFRanNILEVBQUVrQyxNQUFNNCtCLEVBQVFBLEVBQVNzeUQsR0FDdkMsT0FBTzIrQixFQUFLUyxVQUFVLzVHLE1BQU1ncUMsS0FBS3dwRSxJQUFRLEdBQU0sR0FFbkQsU0FBU3dHLEVBQVF6eUgsRUFBRzhnQyxHQUNoQixPQUFPdzBELEVBQU10MUYsRUFBRzhnQyxFQUFRLEdBRTVCLFNBQVM0eEYsRUFBUTF5SCxFQUFHOGdDLEdBQ2hCLE9BQU93MEQsRUFBTXQxRixFQUFHOGdDLEVBQVEsR0FFNUIsU0FBUzZ4RixFQUFTcDFHLEVBQUs3RSxHQUVuQixPQUFpQixJQUFWQSxFQUFjNkUsRUFBTUEsRUFBSWcxRyxLQUFLNzVHLEdBQU9rNkcsR0FBR3IxRyxFQUFJczFHLElBQUksR0FBS242RyxJQUUvRCxTQUFTbzZHLEVBQVVocUIsRUFBR3Z4QixFQUFHa1MsRUFBTXVvQyxFQUFVLHFCQUVyQyxJQUFJMStHLEVBQUl3MUYsRUFBRXdwQixJQUFJLzZDLEdBQUdrUyxJQUFJQSxHQUNyQm4yRSxFQUFJQSxFQUFFZy9HLElBQUloL0csRUFBRWkvRyxLQUFLLEtBQ2pCLElBQUl4L0YsRUFBSXdrRCxFQUFFKzZDLElBQUloL0csR0FBR20yRSxJQUFJQSxHQUdyQixPQUZBMTJELEVBQUlBLEVBQUV1L0YsSUFBSXYvRixFQUFFdy9GLEtBQUssS0FDakJ4L0YsRUFBSUEsRUFBRTAyRCxJQUFJQSxHQUNIMTJELEVBYVgsU0FBU2dnRyxFQUEwQi95SCxFQUFHOGdDLEVBQVF4dEIsRUFBR3lmLEdBQzdDLE9BVkosU0FBZ0N2QyxFQUFHeHRCLEVBQUc4bEIsRUFBR3V3RCxFQUFHL2xFLEVBQUd5ZixHQUMzQ3pmLEVBQUlBLEVBQUV4RixJQUFJMGlCLEdBQ1Z1QyxFQUFJNC9GLEVBQVM1L0YsRUFBRWpsQixJQUFJd0YsR0FBR3hGLElBQUl1ckUsR0FBSSxJQUM5QixNQUFNLzZFLEVBQUlnVixFQUlWLE9BRkFBLEdBREFBLEVBQUlBLEVBQUV4RixJQUFJOUssSUFDSjhLLElBQUlnYixHQUNWaUssRUFBSUEsRUFBRWpsQixJQUFJNmtILEVBQVNyL0csRUFBRyxLQUNmLENBQUNBLEVBQUV4RixJQUFJdXJFLEdBQUl0bUQsRUFBRWpsQixJQUFJeFAsSUFHakIwMEgsQ0FBdUJQLEVBQVF6eUgsRUFBRzhnQyxHQUFTMnhGLEVBQVF6eUgsRUFBRzhnQyxFQUFTLEdBQUkyeEYsRUFBUXp5SCxFQUFHOGdDLEVBQVMsSUFBSzJ4RixFQUFRenlILEVBQUc4Z0MsRUFBUyxJQUFLeHRCLEVBQUd5ZixHQWdENUgsU0FBU2l6RCxFQUFjaG1GLEVBQUcrb0QsRUFBTS9vRCxFQUFFK0IsUUFDckMsTUFBTXkxQyxFQUFPdTZFLEVBQUtrQixXQUFXLElBQUksR0FDakMsR0FBSWxxRSxHQUFPLEdBQ1AsT0FBSUEsR0FBTyxHQWpEbkIsU0FBc0Ivb0QsRUFBRytvRCxFQUFNL29ELEVBQUUrQixRQUM3QixHQUFJZ25ELEdBQU8sRUFBRyxDQUNWLE1BQU0wZ0MsRUFBTTJvQyxFQUFHdGtILElBQVUsRUFBTmk3QyxHQUNiejFDLEVBQUltL0csRUFBUXp5SCxFQUFHLEdBQUc4TixJQUFJc2tILEdBQ3RCci9GLEVBQUkwL0YsRUFBUXp5SCxFQUFHK29ELEVBQU0sR0FHM0IsT0FBTytwRSxFQUZHSCxFQUFTNS9GLEVBQUcsSUFBSTAyRCxJQUFJQSxHQUFLMzdFLElBQUl3RixHQUM3QnEvRyxFQUFTci9HLEVBQUcsSUFBSXhGLElBQUlpbEIsR0FBRzAyRCxJQUFJQSxHQUNkQSxHQUUzQixHQUFJMWdDLEdBQU8sRUFBRyxDQUNWLE1BQU0wZ0MsRUFBTTJvQyxFQUFHdGtILElBQVUsRUFBTmk3QyxHQUVuQixPQUFPK3BFLEVBREdKLEVBQVExeUgsRUFBRyxHQUNGNnlILElBQUksR0FBRy9rSCxJQUFJaTdDLEdBQU0ycEUsRUFBUTF5SCxFQUFHK29ELEVBQU0sR0FBSTBnQyxHQUU3RCxHQUFJMWdDLEVBQU0sRUFBRyxDQUNULE1BR01qZ0MsRUFISTlvQixFQUFFLElBQ0ZBLEVBQUUrb0QsR0FBTyxJQUVDLEdBQ2Rzd0IsRUFBSXR3QixHQUZBL29ELEVBQUUrb0QsRUFBTSxJQUVJLEdBQ3RCLE9BQU9zcEUsRUFBU0QsRUFBRzNvQyxJQUFJM2dFLEdBQUd3cEcsSUFBSXZtRCxFQUFHMGQsSUFBSXBRLEtBQUtvUSxJQUFJMm9DLEdBRWxELE9BQU9BLEVBNEJRYyxDQUFhbHpILEVBQUcrb0QsR0ExQm5DLFNBQXVCL29ELEVBQUcrb0QsRUFBTS9vRCxFQUFFK0IsUUFDOUIsTUFBTTBuRixFQUFNMm9DLEVBQUd0a0gsSUFBVSxFQUFOaTdDLEdBQ2J6MUMsRUFBSW0vRyxFQUFRenlILEVBQUcsR0FBR3lwRixJQUFJMG9DLEdBQ3RCcC9GLEVBQUkwL0YsRUFBUXp5SCxFQUFHLEdBQ2YxQixFQUFJbTBILEVBQVF6eUgsRUFBRytvRCxFQUFNLEdBQUcwZ0MsSUFBSUEsR0FDNUJsckYsRUFBSWswSCxFQUFRenlILEVBQUcrb0QsRUFBTSxJQUFJMGdDLElBQUkyb0MsR0FDbkMsT0FBT1UsRUFBVUgsRUFBU3IvRyxFQUFFeEYsSUFBSWlsQixHQUFJLElBQUlqbEIsSUFBSTZrSCxFQUFTcjBILEVBQUcsS0FBS3dQLElBQUl2UCxHQUFJK1UsRUFBRXhGLElBQUk2a0gsRUFBUzUvRixFQUFFamxCLElBQUlza0gsR0FBSyxLQUFLdGtILElBQUl4UCxHQUFJbXJGLEdBdUI3RjBwQyxDQUFjbnpILEVBQUcrb0QsR0FHM0IsR0FBSUEsR0FBTyxHQUNaLE9BekJSLFNBQXVCL29ELEVBQUcrb0QsRUFBTS9vRCxFQUFFK0IsUUFDOUIsTUFBTTBuRixFQUFNMm9DLEVBQUd0a0gsSUFBVSxFQUFOaTdDLEdBQ2J6MUMsRUFBSW0vRyxFQUFRenlILEVBQUcsR0FBR3lwRixJQUFJMm9DLEdBQ3RCci9GLEVBQUkwL0YsRUFBUXp5SCxFQUFHLEdBQ2YxQixFQUFJbTBILEVBQVF6eUgsRUFBRytvRCxFQUFNLEdBQUcwZ0MsSUFBSUEsR0FDNUJsckYsRUFBSWswSCxFQUFRenlILEVBQUcrb0QsRUFBTSxJQUFJMGdDLElBQUkyb0MsR0FDN0J0cEcsRUFBSTZwRyxFQUFTci9HLEVBQUV4RixJQUFJaWxCLEdBQUksSUFBSWpsQixJQUFJNmtILEVBQVNyMEgsRUFBRyxLQUFLd1AsSUFBSXZQLEdBQ3BEODZFLEVBQUl5NUMsRUFBVWhxRyxFQUFHeFYsRUFBRXhGLElBQUk2a0gsRUFBUzUvRixFQUFFamxCLElBQUlza0gsR0FBSyxLQUFLdGtILElBQUl4UCxHQUFJbXJGLEdBQ3hENXFDLEVBQUk0ekUsRUFBUXp5SCxFQUFHLElBQUl5cEYsSUFBSUEsR0FDdkJ6OUUsRUFBSXltSCxFQUFRenlILEVBQUcsSUFDZjZ4SCxFQUFJL29HLEVBQUVoYixJQUFJMmtILEVBQVF6eUgsRUFBRytvRCxFQUFNLEtBQUswZ0MsSUFBSUEsR0FDcENoNUQsRUFBSTRvRCxFQUFFdnJFLElBQUkya0gsRUFBUXp5SCxFQUFHK29ELEVBQU0sS0FBSzBnQyxJQUFJQSxHQUMxQyxPQUFPcXBDLEVBQVVILEVBQVM5ekUsRUFBRS93QyxJQUFJOUIsR0FBSSxJQUFJOEIsSUFBSTZrSCxFQUFTZCxFQUFHLEtBQUsvakgsSUFBSTJpQixHQUFJb3VCLEVBQUUvd0MsSUFBSTZrSCxFQUFTM21ILEVBQUU4QixJQUFJd0YsR0FBSSxLQUFLeEYsSUFBSStqSCxHQUFJcG9DLEdBYWhHMnBDLENBQWNwekgsRUFBRytvRCxHQUk1QixJQUFJL2xELEVBQUl3MEMsRUFDSjF1QixFQUFJMHVCLEVBQUtpeUMsSUFBSTBvQyxHQUFJcmtILElBQUksS0FDckJ1ckUsRUFBSWc1QyxFQUFTdnBHLEVBQUUyZ0UsSUFBSTJvQyxHQUFJdGtILElBQUksTUFBTTI3RSxJQUFJMm9DLEdBQ3JDNzZDLEVBQUksQ0FBQ3c2QyxFQUFLc0IsTUFBT3RCLEVBQUtzQixPQUN0QjdpRyxFQUFJLENBQUN1aEcsRUFBS3NCLE1BQU90QixFQUFLc0IsT0FDMUJyd0gsRUFBSUEsRUFBRXltRixJQUFJMm9DLEdBQUl0a0gsSUFBSTJrSCxFQUFRenlILEVBQUcsSUFDN0IsSUFBSThnQyxFQUFTLEVBRWIsTUFBTTBqQixFQUF5QixJQUFqQnVFLEVBQU0sR0FBTSxHQUNwQnVxRSxFQUFTOXVFLEdBQVF1RSxFQUFNLEVBQUssSUFBTSxHQUN4QyxHQUNJL2xELEVBQUkydkgsRUFBUzN2SCxFQUFFOEssSUFBSWdiLEdBQUdoYixJQUFJeXBFLEVBQUUsSUFBSXpwRSxJQUFJMmtILEVBQVF6eUgsRUFBRzhnQyxFQUFTLElBQUssSUFBSTJvRCxJQUFJMG9DLEdBQ3JFcnBHLEVBQUk2cEcsRUFBUzdwRyxFQUFFaGIsSUFBSXlwRSxFQUFFLElBQUl6cEUsSUFBSTJrSCxFQUFRenlILEVBQUc4Z0MsRUFBUyxLQUFNLElBQUkyb0QsSUFBSTBvQyxHQUMvRG52SCxFQUFJQSxFQUFFc3ZILElBQUk5aEcsRUFBRSxJQUNaMUgsRUFBSUEsRUFBRWhiLElBQUl5cEUsRUFBRSxJQUFJenBFLElBQUkya0gsRUFBUXp5SCxFQUFHOGdDLEVBQVMsS0FDeEN1NEMsRUFBSXM1QyxFQUFTdDVDLEVBQUV2ckUsSUFBSTBpQixFQUFFLElBQUssSUFBSWk1RCxJQUFJMG9DLEdBQ2xDNTZDLEVBQUl3N0MsRUFBMEIveUgsRUFBRzhnQyxFQUFReTJDLEVBQUUsR0FBR2tTLElBQUkwb0MsR0FBS252SCxFQUFFOEssSUFBSTBpQixFQUFFLEtBQy9EQSxFQUFJdWlHLEVBQTBCL3lILEVBQUc4Z0MsRUFBUyxHQUFJdTRDLEVBQUV2ckUsSUFBSTBpQixFQUFFLElBQUsxSCxFQUFFaGIsSUFBSTJrSCxFQUFRenlILEVBQUc4Z0MsRUFBUyxPQUNwRnU0QyxFQUFHcjJFLEdBQUssQ0FBQ0EsRUFBR3EyRSxHQUNidjRDLEdBQVUsU0FDTEEsSUFBVzBqQixHQUNwQixNQUFNaWxDLEVBQU0wb0MsRUFBR3JrSCxJQUFJdXJFLEVBQUVrNkMsSUFBSSxLQUFNVixJQUFJLElBY25DLE9BWkEveEYsRUFBU3d5RixFQUNUOWlHLEVBQUUsR0FBS0EsRUFBRSxHQUFHMWlCLElBQUtpN0MsRUFBTSxFQUFLLElBQzVCd3VCLEVBQUUsR0FBS0EsRUFBRSxHQUFHenBFLElBQUkwaUIsRUFBRSxJQUNsQkEsRUFBRSxHQUFLQSxFQUFFLEdBQUcxaUIsSUFBSXlwRSxFQUFFLElBQ2xCdjBFLEVBQUkydkgsRUFBUzN2SCxFQUFFOEssSUFBSWdiLEdBQUdoYixJQUFJeXBFLEVBQUUsSUFBSXpwRSxJQUFJMmtILEVBQVF6eUgsRUFBRzhnQyxFQUFTLElBQUssSUFBSTJvRCxJQUFJQSxHQUNyRTNnRSxFQUFJNnBHLEVBQVM3cEcsRUFBRWhiLElBQUl5cEUsRUFBRSxJQUFJenBFLElBQUkya0gsRUFBUXp5SCxFQUFHOGdDLEVBQVMsS0FBTSxJQUFJMm9ELElBQUlBLEdBQy9Eem1GLEVBQUlBLEVBQUVzdkgsSUFBSTloRyxFQUFFLEdBQUdpNUQsSUFBSSxJQUNuQjNnRSxFQUFJQSxFQUFFaGIsSUFBSXlwRSxFQUFFLEdBQUdrUyxJQUFJLEdBQUczN0UsSUFBSTJrSCxFQUFRenlILEVBQUc4Z0MsRUFBUyxNQUM5Q3U0QyxFQUFJczVDLEVBQVN0NUMsRUFBRXZyRSxJQUFJMGlCLEVBQUUsSUFBSyxJQUFJaTVELElBQUlBLEdBQ2xDbFMsRUFBSXc3QyxFQUEwQi95SCxFQUFHOGdDLEVBQVF5MkMsRUFBRSxHQUFHa1MsSUFBSUEsR0FBTXptRixFQUFFOEssSUFBSTBpQixFQUFFLEtBQ2hFQSxFQUFJdWlHLEVBQTBCL3lILEVBQUc4Z0MsRUFBUyxHQUFJdTRDLEVBQUV2ckUsSUFBSTBpQixFQUFFLElBQUsxSCxFQUFFaGIsSUFBSTJrSCxFQUFRenlILEVBQUc4Z0MsRUFBUyxPQUNwRnU0QyxFQUFHcjJFLEdBQUssQ0FBQ0EsRUFBR3EyRSxHQUNOeTVDLEVBQVVBLEVBQVV2N0MsRUFBRSxHQUFJL21ELEVBQUUsR0FBSWk1RCxHQUFLMzdFLElBQUl1a0gsRUFBU3ZwRyxHQUFHMmdFLElBQUkxZCxJQUFLaitELElBQUl1ckUsR0FBSXk1QyxFQUFVdjdDLEVBQUUsR0FBSS9tRCxFQUFFLEdBQUlpNUQsR0FBSzM3RSxJQUFJOUssR0FBSXltRixLOzs7O2dpSkN6S3BILHdoc0I7Ozs7OEhDQUEsNmhCQTJCQSxTQUFTK3BDLEVBQU14bkgsR0FDWCxPQUFPLElBQUloQyxTQUFRQyxHQUFXMmlHLFdBQVczaUcsS0FBVXVyRixLQUFLeHBGLEdBRXJELE1BQU15bkgsRUFDVHZ6SCxZQUFZd3pILEdBQ1IsSUFBSyxnQkFBTS9zSCxRQUFRLGNBR2YsTUFBTSxJQUFJQyxNQUFNLHVGQUdoQjhzSCxFQUFlcm9CLFdBQVdvb0IsRUFBaUJFLGNBQzNDRCxFQUFpQkEsRUFBZXh4SCxNQUFNdXhILEVBQWlCRSxXQUFXNXhILFNBRWhELE1BQWxCMnhILEdBQW9ELElBQTFCQSxFQUFlM3hILFNBQ3pDMnhILEVBbEJxQixTQW9CekJyekgsS0FBS3V6SCxrQkFBb0JGLEVBbkJHLFFBb0I1QnJ6SCxLQUFLd3pILG1CQUNESCxFQXBCK0IsZUFzQnZDLFdBQVdJLEdBQ1AsR0FBMEIsb0JBQWYsU0FDUCxNQUFNLElBQUlsdEgsTUFBTSwyRkFHcEIsTUFBTW10SCxFQUFheHNILE9BQU93dEYsSUFBSUMsZ0JBQWdCLElBQUlGLEtBQUssQ0FBQ2cvQixFQUFlRSxZQUFhLENBQUU3N0csS0FBTSw4QkFDNUYsR0FBSTI3RyxFQUFlRyx5QkFBeUJDLFlBQ3hDLE1BQU0sSUFBSXR0SCxNQUFNLHlGQUdmLENBQ0QsTUFBTXV0SCxFQUFrQixDQUFDLENBQ2pCQyxNQUFPLENBQUMsS0FBTy96SCxLQUFLd3pILG9CQUNwQnR4RixRQUFTdXhGLEVBQWVPLGNBRTFCQyxFQUFZLHdDQUE4QlIsRUFBZ0JLLEdBQzFESSxFQUFlaHRILE9BQU93dEYsSUFBSUMsZ0JBQWdCLElBQUlGLEtBQUssQ0FBQ3Y4QixLQUFLRSxVQUFVNjdELElBQWEsQ0FBRW44RyxLQUFNLHNCQUd4RnE4RyxFQUFxQyxNQUF4Qm4wSCxLQUFLbzBILGdCQUNwQjk5RyxTQUFTQyxjQUFjLEtBQ3ZCdlcsS0FBS28wSCxnQkFPVCxHQU5BRCxFQUFXRSxTQUFXcjBILEtBQUt1ekgsa0JBQzNCWSxFQUFXbnZCLEtBQU9rdkIsUUFJWmYsR0FBTSxJQUFNZ0IsRUFBV0csY0FBYyxJQUFJQyxXQUFXLFlBQ3pCLE1BQTdCZCxFQUFlRSxXQUFvQixDQUNuQyxNQUFNYSxFQUE0QyxNQUF6QngwSCxLQUFLdzBILGlCQUMxQmwrRyxTQUFTQyxjQUFjLEtBQ3ZCdlcsS0FBS3cwSCxpQkFDVEEsRUFBaUJILFNBQVdyMEgsS0FBS3d6SCxtQkFDakNnQixFQUFpQnh2QixLQUFPMHVCLFFBQ2xCUCxHQUFNLElBQU1xQixFQUFpQkYsY0FBYyxJQUFJQyxXQUFXLFlBRXBFLE1BQU8sQ0FBRUUsbUJBQW9CLHVDQUE2QmhCLE1BSXRFTCxFQUFpQkUsV0FBYSxlQUM5QixNQUFNb0IsRUFDRjcwSCxZQUFZODBILEdBQ1IsR0FBYSxNQUFUQSxHQUFpQkEsRUFBTWp6SCxPQUFTLEVBQ2hDLE1BQU0sSUFBSTZFLE1BQ04sd0VBQWdCb3VILEtBRXhCMzBILEtBQUs0MEgsU0FBV0QsRUFBTSxHQUN0QjMwSCxLQUFLNjBILGFBQWVGLEVBQU05eUgsTUFBTSxHQUVwQyxhQUNJLE9BQU8sSUFBSThILFNBQVEsQ0FBQ0MsRUFBU3NxRixLQUN6QixNQUFNNGdDLEVBQWEsSUFBSUMsV0FDdkJELEVBQVdwdkIsT0FBVXZxQixJQUVqQixNQUFNODRDLEVBQVkvN0QsS0FBS0MsTUFBTWdqQixFQUFNazFCLE9BQU9ubkcsUUFDcEMwcUgsRUFBZ0JLLEVBQVVMLGNBQ2hDLEdBQXFCLE1BQWpCQSxFQUVBLFlBREExL0IsRUFBTyxJQUFJM3RGLE1BQU0sNENBQTRDdkcsS0FBSzQwSCxTQUFTejJILFNBSS9FLEdBQXVCLE1BREM4MUgsRUFBVUgsZ0JBRzlCLFlBREE1L0IsRUFBTyxJQUFJM3RGLE1BQU0sNkNBQTZDdkcsS0FBSzQwSCxTQUFTejJILFNBR2hGLEdBQWlDLElBQTdCNkIsS0FBSzYwSCxhQUFhbnpILE9BRWxCLFlBREFrSSxFQUFRLENBQUVncUgsa0JBR2QsTUFBTW9CLEVBQXdCLG1DQUF5QmYsR0FBWUgsR0FBb0I5ekgsS0FBS2kxSCxZQUFZbkIsS0FDeEdscUgsRUFBUW9ySCxJQUVaRixFQUFXbnZCLFFBQVVsNUYsR0FBU3luRixFQUMxQixzRUFBY2wwRixLQUFLNDBILFNBQVN6MkgsNkVBRWhDMjJILEVBQVdJLFdBQVdsMUgsS0FBSzQwSCxhQUduQ0ssWUFBWW5CLEdBQ1IsTUFBTUUsRUFBYyxHQUNkRCxFQUFRLEdBQ2QsSUFBSyxNQUFNb0IsS0FBU3JCLEVBQ2hCRSxFQUFZenpILFFBQVE0MEgsRUFBTWp6RixTQUMxQjZ4RixFQUFNeHpILFFBQVE0MEgsRUFBTXBCLE9BRXhCLE1BQU1xQixFQUFhcDFILEtBQUtxMUgsNEJBQTRCdkIsR0FDOUN3QixFQUFXdkIsRUFBTTd6SCxLQUFJdXFDLEdBQVF6cUMsS0FBS3UxSCxnQkFBZ0I5cUYsRUFBTTJxRixFQUFXM3FGLE1BQ3pFLE9BQU85Z0MsUUFBUVksSUFBSStxSCxHQUFVbmdDLE1BQUtna0IsR0FBVyxDQUFDNmEsRUFBYSxrQ0FBd0I3YSxNQUV2Rm9jLGdCQUFnQjlxRixFQUFNNmdFLEdBQ2xCLE9BQU8sSUFBSTNoRyxTQUFRLENBQUNDLEVBQVNzcUYsS0FDekIsTUFBTXNoQyxFQUFtQixJQUFJVCxXQUM3QlMsRUFBaUI5dkIsT0FBVXZxQixJQUV2QixNQUFNdzRDLEVBQWF4NEMsRUFBTWsxQixPQUFPbm5HLE9BQ2hDVSxFQUFRK3BILElBRVo2QixFQUFpQjd2QixRQUFVbDVGLEdBQVN5bkYsRUFBTyw2Q0FBNkN6cEQsT0FDeEYrcUYsRUFBaUJDLGtCQUFrQm5xQixNQU0zQytwQiw0QkFBNEJLLEdBQ3hCLE1BQU1DLEVBQVksR0FDWkMsRUFBWTUxSCxLQUFLNjBILGFBQWEzMEgsS0FBSW9yRyxHQUFRLG1CQUFTQSxFQUFLbnRHLFFBQ3hEaTNILEVBQWEsR0FDbkIsSUFBSyxNQUFNUyxLQUFTSCxFQUNoQkcsRUFBTTlCLE1BQU0xekgsU0FBUW9xQyxJQUNoQixNQUFNcXJGLEVBQWUsbUJBQVNyckYsR0FDOUIsSUFBeUMsSUFBckNrckYsRUFBVTM4RyxRQUFRODhHLEdBQ2xCLE1BQU0sSUFBSXZ2SCxNQUNOLHVEQUFJdXZILE1BR1osR0FEQUgsRUFBVXAxSCxLQUFLdTFILElBQzBCLElBQXJDRixFQUFVNThHLFFBQVE4OEcsR0FDbEIsTUFBTSxJQUFJdnZILE1BQU0sOEJBQThCdXZILHVCQUc5Q1YsRUFBVzNxRixHQUFRenFDLEtBQUs2MEgsYUFBYWUsRUFBVTU4RyxRQUFRODhHLE9BSW5FLEdBQUlILEVBQVVqMEgsU0FBVzFCLEtBQUs2MEgsYUFBYW56SCxPQUN2QyxNQUFNLElBQUk2RSxNQUNOLHdEQUFJb3ZILEVBQVVqMEgsb0RBQ1YxQixLQUFLNjBILGFBQWFuekgsWUFFOUIsT0FBTzB6SCxHQUdSLE1BQU1XLEVBQTBCNXdCLEdBQzlCLGdCQUFNNytGLFFBQVEsZ0JBSVY4UixNQUFNc3ZELFFBQVF5OUIsSUFBUUEsRUFBSTZGLFdBQVdvb0IsRUFBaUJFLFlBQ2hEMEMsRUFBaUI3d0IsRUFBSXRqRyxNQUFNdXhILEVBQWlCRSxXQUFXNXhILFNBSjNELEtBbURSLFNBQVNzMEgsRUFBaUIzQyxFQUFpQixTQUM5QyxPQUFPLElBQUlELEVBQWlCQyxHQTBDekIsU0FBUzRDLEVBQWF0QixHQUN6QixPQUFPLElBQUlELEVBQWFDLEdBcEY1QixtQkFBaUJ1QixtQkFBbUJILEk7Ozs7K0hDbE1wQyx5ckJBNEJPLE1BQU1JLEVBQ1R0MkgsWUFBWTRxQyxFQUFNMnJGLEdBd0JkLEdBdkJBcDJILEtBQUtxMkgsZUFBaUIsT0FDSCxNQUFmRCxJQUNBQSxFQUFjLElBRWxCcDJILEtBQUtzMkgsaUJBQW1CRixFQUFZRSxpQkFDcEN0MkgsS0FBS3UySCxXQUFhSCxFQUFZRyxXQUM5QnYySCxLQUFLdzJILG1CQUFxQkosRUFBWUksbUJBQ1QsTUFBekJKLEVBQVlLLFdBQ1osaUJBQXdDLG1CQUExQkwsRUFBWUssV0FBMEIsSUFBTSxnSUFHMUR6MkgsS0FBS2kxRixNQUFRbWhDLEVBQVlLLFdBR3pCejJILEtBQUtpMUYsTUFBUSxnQkFBTTQ1QixTQUFTNTVCLE1BRWhDLGlCQUFlLE1BQVJ4cUQsR0FBZ0JBLEVBQUsvb0MsT0FBUyxHQUFHLElBQU0sNERBRTFDMFcsTUFBTXN2RCxRQUFRajlCLElBQ2QsaUJBQXVCLElBQWhCQSxFQUFLL29DLFFBQWMsSUFDdEIsaUVBQXFCK29DLEVBQUsvb0MsYUFFbEMxQixLQUFLeXFDLEtBQU9BLEVBQ21CLE1BQTNCMnJGLEVBQVlNLGFBQ29CLE1BQWhDTixFQUFZTSxZQUFZaDlELEtBQ3hCLE1BQU0sSUFBSW56RCxNQUFNLHNFQUVwQnZHLEtBQUswMkgsWUFBY04sRUFBWU0sYUFBZSxHQUVsRCxXQUFXakQsR0FDUCxHQUFJQSxFQUFlRyx5QkFBeUJDLFlBQ3hDLE1BQU0sSUFBSXR0SCxNQUFNLDJGQUdwQixNQUFNb3NGLEVBQU9yMEYsT0FBT3loRCxPQUFPLENBQUVqa0MsT0FBUTliLEtBQUtxMkgsZ0JBQWtCcjJILEtBQUswMkgsYUFDakUvakMsRUFBS2o1QixLQUFPLElBQUlpOUQsU0FDaEIsTUFBTTdDLEVBQWtCLENBQUMsQ0FDakJDLE1BQU8sQ0FBQyx1QkFDUjd4RixRQUFTdXhGLEVBQWVPLGNBRTFCNEMsRUFBaUMsd0NBQThCbkQsRUFBZ0JLLEdBQ3JGbmhDLEVBQUtqNUIsS0FBS205RCxPQUFPLGFBQWMsSUFBSXBpQyxLQUFLLENBQUN2OEIsS0FBS0UsVUFBVXcrRCxJQUFrQyxDQUFFOStHLEtBNUNsRixxQkE0Q3NHLGNBQy9FLE1BQTdCMjdHLEVBQWVFLFlBQ2ZoaEMsRUFBS2o1QixLQUFLbTlELE9BQU8sb0JBQXFCLElBQUlwaUMsS0FBSyxDQUFDZy9CLEVBQWVFLFlBQWEsQ0FBRTc3RyxLQS9DM0QsNkJBK0M0RixxQkFFbkgsTUFBTXk4RSxRQUFpQnYwRixLQUFLaTFGLE1BQU1qMUYsS0FBS3lxQyxLQUFNa29ELEdBQzdDLEdBQUk0QixFQUFTdWlDLEdBQ1QsTUFBTyxDQUNIckMsbUJBQW9CLHVDQUE2QmhCLEdBQ2pEc0QsVUFBVyxDQUFDeGlDLElBSWhCLE1BQU0sSUFBSWh1RixNQUNOLGdFQUFHZ3VGLEVBQVN4d0UsV0FXeEIsYUFDSSxNQUFNaXpHLFFBQTJCaDNILEtBQUtpMUYsTUFBTWoxRixLQUFLeXFDLEtBQU16cUMsS0FBSzAySCxhQUM1RCxJQUFLTSxFQUFtQkYsR0FDcEIsTUFBTSxJQUFJdndILE1BQU0sY0FBY3ZHLEtBQUt5cUMsZ0NBQzVCdXNGLEVBQW1CanpHLGlGQUc5QixJQUFJa3dHLEVBQ0osSUFDSUEsUUFBa0IrQyxFQUFtQkMsT0FFekMsTUFBT3o0RSxHQUNILElBQUlvM0MsRUFBVSwrQ0FBK0M1MUYsS0FBS3lxQyxRQWVsRSxNQVpJenFDLEtBQUt5cUMsS0FBSzZwRCxTQUFTLE9BQ25Cc0IsR0FBVywrVUFRWEEsR0FBVyx1RUFHVCxJQUFJcnZGLE1BQU1xdkYsR0FHcEIsTUFBTWcrQixFQUFnQkssRUFBVUwsY0FDMUJFLEVBQWtCRyxFQUFVSCxnQkFDbEMsR0FBcUIsTUFBakJGLEdBQTRDLE1BQW5CRSxFQUN6QixNQUFNLElBQUl2dEgsTUFBTSwyQkFBMkJ2RyxLQUFLeXFDLGlFQUdwRCxPQUFPLG1DQUF5QndwRixHQUFZSCxHQUFvQjl6SCxLQUFLaTFILFlBQVluQixLQUVyRixrQkFBa0JBLEdBQ2QsTUFBTW9ELEVBQWE5K0csTUFBTXN2RCxRQUFRMW5FLEtBQUt5cUMsTUFBUXpxQyxLQUFLeXFDLEtBQUssR0FBS3pxQyxLQUFLeXFDLE1BQzNENHBELEVBQVE4aUMsR0FBVUMsRUFBU0YsR0FDNUJHLEVBQWFyM0gsS0FBS3MySCxrQkFBb0JqaUMsRUFDdEMyL0IsRUFBYyxHQUNwQixJQUFLLE1BQU1tQixLQUFTckIsRUFDaEJFLEVBQVl6ekgsUUFBUTQwSCxFQUFNanpGLFNBRTlCLE1BQU1vMUYsRUFBWSxHQUNaQyxFQUFjLEdBQ3BCLElBQUssTUFBTUMsS0FBZ0IxRCxFQUN2QixJQUFLLE1BQU1ycEYsS0FBUStzRixFQUFhekQsTUFDRyxNQUEzQi96SCxLQUFLdzJILG1CQUNMZSxFQUFZaDNILEtBQUtQLEtBQUt3MkgsbUJBQW1CL3JGLElBR3pDNnNGLEVBQVUvMkgsS0FBSzgySCxFQUFhNXNGLEVBQU8wc0YsR0FJM0NuM0gsS0FBS3cySCxvQkFDTGMsRUFBVS8ySCxjQUFjb0osUUFBUVksSUFBSWd0SCxJQUV4QyxNQUFNcGUsUUFBZ0IsbUNBQXlCbWUsRUFBVyxDQUN0RFosWUFBYTEySCxLQUFLMDJILFlBQ2xCRCxVQUFXejJILEtBQUtpMUYsTUFDaEJzaEMsV0FBWXYySCxLQUFLdTJILGFBRXJCLE1BQU8sQ0FBQ3ZDLEVBQWEsa0NBQXdCN2EsS0FlOUMsU0FBU2llLEVBQVNqeUIsR0FDckIsTUFBTXN5QixFQUFZdHlCLEVBQUlELFlBQVksS0FDNUJ3eUIsRUFBa0J2eUIsRUFBSUQsWUFBWSxLQUd4QyxNQUFPLENBRlFDLEVBQUl3eUIsVUFBVSxFQUFHRixHQUVmLElBREZDLEVBQWtCRCxFQUFZdHlCLEVBQUl3eUIsVUFBVUQsR0FBbUIsSUFHM0UsU0FBU0UsRUFBYXp5QixHQUN6QixPQUFrRCxNQUEzQ0EsRUFBSTB5QixNQUFNMUIsRUFBWTJCLGtCQXBCakMzQixFQUFZMkIsaUJBQW1CLGVBc0J4QixNQUFNQyxFQUFhLENBQUM1eUIsRUFBS2l4QixLQUM1QixHQUFxQixvQkFBVm5oQyxRQUNTLE1BQWZtaEMsR0FBZ0QsTUFBekJBLEVBQVlLLFdBSXBDLE9BQU8sS0FFTixDQUNELElBQUl1QixHQUFTLEVBT2IsR0FMSUEsRUFEQTUvRyxNQUFNc3ZELFFBQVF5OUIsR0FDTEEsRUFBSS8yRixPQUFNNnBILEdBQVdMLEVBQWFLLEtBR2xDTCxFQUFhenlCLEdBRXRCNnlCLEVBQ0EsT0FBT0UsRUFBSy95QixFQUFLaXhCLEdBR3pCLE9BQU8sTUEwRUosU0FBUzhCLEVBQUt6dEYsRUFBTTJyRixHQUN2QixPQUFPLElBQUlELEVBQVkxckYsRUFBTTJyRixHQU8xQixTQUFTK0IsRUFBbUIxdEYsRUFBTTJyRixHQUNyQyxPQUFPOEIsRUFBS3p0RixFQUFNMnJGLEdBakZ0QixtQkFBaUJGLG1CQUFtQjZCLEdBQ3BDLG1CQUFpQkssbUJBQW1CTCxJOzs7O2tKQ2pOcEM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBLE1BQU1NLEVBQWdCLGVBS2hCQyxFQUFtQixlQUluQkMsRUFBa0IsbUJBSWpCdmtDLGVBQWV3a0MsSUFDbEIsTUFBTUMsRUFBYUMsSUFDbkIsT0FBTyxJQUFJL3VILFNBQVEsQ0FBQ0MsRUFBU3NxRixLQUN6QixNQUFNeWtDLEVBQWdCRixFQUFXRCxlQUFlSCxHQUNoRE0sRUFBY0MsVUFBWSxJQUFNaHZILElBQ2hDK3VILEVBQWNoekIsUUFBVWw1RixHQUFTeW5GLEVBQU96bkYsTUFHaEQsU0FBU2lzSCxJQUNMLElBQUssZ0JBQU1weUgsUUFBUSxjQUlmLE1BQU0sSUFBSUMsTUFBTSwyRkFJcEIsTUFBTXN5SCxFQUE4QixvQkFBWDN4SCxPQUF5QjQ5RixLQUFPNTlGLE9BQ25Ea2dILEVBQVV5UixFQUFVQyxXQUFhRCxFQUFVRSxjQUM3Q0YsRUFBVUcsaUJBQW1CSCxFQUFVSSxhQUN2Q0osRUFBVUssY0FDZCxHQUFlLE1BQVg5UixFQUNBLE1BQU0sSUFBSTdnSCxNQUFNLDZEQUVwQixPQUFPNmdILEVBRVgsU0FBUytSLEVBQWNDLEdBQ25CLE1BQU1DLEVBQUtELEVBQVlsd0gsT0FDdkJtd0gsRUFBR0Msa0JBQWtCaEIsRUFBa0IsQ0FBRWlCLFFBQVMsY0FDbERGLEVBQUdDLGtCQUFrQmYsRUFBaUIsQ0FBRWdCLFFBQVMsY0FPOUMsTUFBTUMsRUFDVDM1SCxZQUFZNDVILEdBRVIsR0FEQXo1SCxLQUFLODRILFVBQVlKLElBQ0EsTUFBYmUsSUFBc0JBLEVBQ3RCLE1BQU0sSUFBSWx6SCxNQUFNLGtFQUVwQnZHLEtBQUt5NUgsVUFBWUEsRUFFckIsV0FBV2hHLEdBRVAsR0FBSUEsRUFBZUcseUJBQXlCQyxZQUN4QyxNQUFNLElBQUl0dEgsTUFBTSw0RkFHcEIsT0FBT3ZHLEtBQUswNUgsZUFBZTE1SCxLQUFLeTVILFVBQVdoRyxHQUUvQyxhQUNJLE9BQU96ekgsS0FBSzA1SCxlQUFlMTVILEtBQUt5NUgsV0FnQnBDQyxlQUFlRCxFQUFXaEcsR0FDdEIsT0FBTyxJQUFJOXBILFNBQVEsQ0FBQ0MsRUFBU3NxRixLQUN6QixNQUFNa2xDLEVBQWNwNUgsS0FBSzg0SCxVQUFVeHpCLEtBQUsreUIsRUFuRjNCLEdBb0ZiZSxFQUFZTyxnQkFBa0IsSUFBTVIsRUFBY0MsR0FDbERBLEVBQVlSLFVBQVksS0FDcEIsTUFBTVMsRUFBS0QsRUFBWWx3SCxPQUN2QixHQUFzQixNQUFsQnVxSCxFQUF3QixDQUV4QixNQUFNbUcsRUFBVVAsRUFBR1EsWUFBWXZCLEVBQWtCLFlBRTNDd0IsRUFEYUYsRUFBUUcsWUFBWXpCLEdBQ1Q3NUgsSUFBSXVCLEtBQUt5NUgsV0FDdkNLLEVBQVdsQixVQUFZLEtBQ25CLEdBQXlCLE1BQXJCa0IsRUFBVzV3SCxPQUVYLE9BREFtd0gsRUFBR1csUUFDSTlsQyxFQUFPLElBQUkzdEYsTUFBTSxnQ0FBZ0N2RyxLQUFLeTVILDZCQUk3RDd2SCxFQUFRa3dILEVBQVc1d0gsT0FBT3VxSCxpQkFHbENxRyxFQUFXbjBCLFFBQVVsNUYsSUFDakI0c0gsRUFBR1csUUFDSTlsQyxFQUFPNGxDLEVBQVdydEgsUUFFN0JtdEgsRUFBUUssV0FBYSxJQUFNWixFQUFHVyxZQUU3QixDQUVELE1BQU12RixFQUFxQix1Q0FBNkJoQixHQUVsRHlHLEVBQVNiLEVBQUdRLFlBQVl0QixFQUFpQixhQUMvQyxJQUFJNEIsRUFBWUQsRUFBT0gsWUFBWXhCLEdBQ25DLE1BQU02QixFQUFpQkQsRUFBVUUsSUFBSSxDQUFFWixVQUFXejVILEtBQUt5NUgsVUFBV2hGLHVCQUNsRSxJQUFJbUYsRUFDSlEsRUFBZXhCLFVBQVksS0FFdkJnQixFQUFVUCxFQUFHUSxZQUFZdkIsRUFBa0IsYUFDM0MsTUFDTWdDLEVBRGFWLEVBQVFHLFlBQVl6QixHQUNKK0IsSUFBSSxDQUNuQ1osVUFBV3o1SCxLQUFLeTVILFVBQ2hCaEcsaUJBQ0FnQix1QkFFSjZGLEVBQWdCMUIsVUFBWSxJQUFNaHZILEVBQVEsQ0FBRTZxSCx1QkFDNUM2RixFQUFnQjMwQixRQUFVbDVGLElBR3RCMHRILEVBQVlELEVBQU9ILFlBQVl4QixHQUMvQixNQUFNZ0MsRUFBb0JKLEVBQVV0dkgsT0FBTzdLLEtBQUt5NUgsV0FDaERjLEVBQWtCM0IsVUFBWSxLQUMxQlMsRUFBR1csUUFDSTlsQyxFQUFPb21DLEVBQWdCN3RILFFBRWxDOHRILEVBQWtCNTBCLFFBQVVsNUYsSUFDeEI0c0gsRUFBR1csUUFDSTlsQyxFQUFPb21DLEVBQWdCN3RILFVBSTFDMnRILEVBQWV6MEIsUUFBVWw1RixJQUNyQjRzSCxFQUFHVyxRQUNJOWxDLEVBQU9rbUMsRUFBZTN0SCxRQUVqQ3l0SCxFQUFPRCxXQUFhLEtBQ0QsTUFBWEwsRUFDQVAsRUFBR1csUUFHSEosRUFBUUssV0FBYSxJQUFNWixFQUFHVyxXQUs5Q1osRUFBWXp6QixRQUFVbDVGLEdBQVN5bkYsRUFBT2tsQyxFQUFZM3NILFdBSTlEK3NILEVBQWlCbEcsV0FBYSxlQUN2QixNQUFNa0gsRUFBbUJyMUIsR0FDdkIsZ0JBQU03K0YsUUFBUSxnQkFJVjhSLE1BQU1zdkQsUUFBUXk5QixJQUFRQSxFQUFJNkYsV0FBV3d1QixFQUFpQmxHLFlBQ2hEbUgsRUFBaUJ0MUIsRUFBSXRqRyxNQUFNMjNILEVBQWlCbEcsV0FBVzV4SCxTQUozRCxLQThCUixTQUFTKzRILEVBQWlCaEIsR0FDN0IsT0FBTyxJQUFJRCxFQUFpQkMsR0FwQmhDLG1CQUFpQnZELG1CQUFtQnNFLEdBQ3BDLG1CQUFpQnBDLG1CQUFtQm9DLEdBMEI3QixNQUFNRSxFQUNUNzZILGNBQ0lHLEtBQUs4NEgsVUFBWUosSUFFckIsbUJBQ0ksT0FBTyxJQUFJL3VILFNBQVEsQ0FBQ0MsRUFBU3NxRixLQUN6QixNQUFNa2xDLEVBQWNwNUgsS0FBSzg0SCxVQUFVeHpCLEtBQUsreUIsRUE5TTNCLEdBK01iZSxFQUFZTyxnQkFBa0IsSUFBTVIsRUFBY0MsR0FDbERBLEVBQVlSLFVBQVksS0FDcEIsTUFBTVMsRUFBS0QsRUFBWWx3SCxPQUNqQnl4SCxFQUFLdEIsRUFBR1EsWUFBWXRCLEVBQWlCLFlBVXJDcUMsRUFUUUQsRUFBR1osWUFBWXhCLEdBU0dzQyxTQUNoQ0QsRUFBa0JoQyxVQUFZLEtBQzFCLE1BQU1wbEcsRUFBTSxHQUNaLElBQUssTUFBTXMzRixLQUFROFAsRUFBa0IxeEgsT0FDakNzcUIsRUFBSXMzRixFQUFLMk8sV0FBYTNPLEVBQUsySixtQkFFL0I3cUgsRUFBUTRwQixJQUVab25HLEVBQWtCajFCLFFBQVVsNUYsSUFDeEI0c0gsRUFBR1csUUFDSTlsQyxFQUFPMG1DLEVBQWtCbnVILFFBRXBDa3VILEVBQUdWLFdBQWEsSUFBTVosRUFBR1csU0FFN0JaLEVBQVl6ekIsUUFBVWw1RixHQUFTeW5GLEVBQU9rbEMsRUFBWTNzSCxVQUcxRCxrQkFBa0JnK0IsR0ExQ3RCLElBQTBCdHJDLEVBNENsQixPQURBc3JDLEdBM0NrQnRyQyxFQTJDTXNyQyxHQTFDakJ1Z0UsV0FBV3d1QixFQUFpQmxHLFlBQ25DbjBILEVBQUkwQyxNQUFNMjNILEVBQWlCbEcsV0FBVzV4SCxRQUN0Q3ZDLEVBeUNPLElBQUl3SyxTQUFRLENBQUNDLEVBQVNzcUYsS0FDekIsTUFBTWtsQyxFQUFjcDVILEtBQUs4NEgsVUFBVXh6QixLQUFLK3lCLEVBaFAzQixHQWlQYmUsRUFBWU8sZ0JBQWtCLElBQU1SLEVBQWNDLEdBQ2xEQSxFQUFZUixVQUFZLEtBQ3BCLE1BQU1TLEVBQUtELEVBQVlsd0gsT0FDakJneEgsRUFBU2IsRUFBR1EsWUFBWXRCLEVBQWlCLGFBQ3pDNEIsRUFBWUQsRUFBT0gsWUFBWXhCLEdBQy9CdUMsRUFBaUJYLEVBQVUxN0gsSUFBSWdzQyxHQUNyQyxJQUFJbXZGLEVBQ0prQixFQUFlbEMsVUFBWSxLQUN2QixHQUE2QixNQUF6QmtDLEVBQWU1eEgsT0FFZixPQURBbXdILEVBQUdXLFFBQ0k5bEMsRUFBTyxJQUFJM3RGLE1BQU0sZ0NBQWdDa2tDLHFCQUd2RCxDQUVELE1BQU04dkYsRUFBb0JKLEVBQVV0dkgsT0FBTzQvQixHQUNyQ3N3RixFQUFrQixLQUVwQm5CLEVBQVVQLEVBQUdRLFlBQVl2QixFQUFrQixhQUMzQyxNQUNNMEMsRUFEYXBCLEVBQVFHLFlBQVl6QixHQUNEenRILE9BQU80L0IsR0FDN0N1d0YsRUFBbUJwQyxVQUFZLElBQU1odkgsRUFBUWt4SCxFQUFlNXhILE9BQU91ckgsb0JBQ25FdUcsRUFBbUJyMUIsUUFBVWw1RixHQUFTeW5GLEVBQU80bUMsRUFBZXJ1SCxRQUloRTh0SCxFQUFrQjNCLFVBQVltQyxFQUM5QlIsRUFBa0I1MEIsUUFBVWw1RixJQUN4QnN1SCxJQUNBMUIsRUFBR1csUUFDSTlsQyxFQUFPNG1DLEVBQWVydUgsVUFJekNxdUgsRUFBZW4xQixRQUFVbDVGLElBQ3JCNHNILEVBQUdXLFFBQ0k5bEMsRUFBTzRtQyxFQUFlcnVILFFBRWpDeXRILEVBQU9ELFdBQWEsS0FDRCxNQUFYTCxFQUNBUCxFQUFHVyxRQUdISixFQUFRSyxXQUFhLElBQU1aLEVBQUdXLFVBSTFDWixFQUFZenpCLFFBQVVsNUYsR0FBU3luRixFQUFPa2xDLEVBQVkzc0gsYTs7OztrWkNyVDlELDJtRTs7OzsrVENBQSxnOUJBdUNPdW5GLGVBQWVpbkMsRUFBYzVnRyxFQUFTdzdGLEdBRXpDLE1BQU1xRixFQUFRLEdBQ1JDLEVBQWUsR0FDZkMsRUFBUWhqSCxNQUFNc3ZELFFBQVFydEMsR0FDeEJBLEVBQVFuNkIsS0FBSXNuRSxHQUFVQSxFQUFPcnBFLE9BQzdCRyxPQUFPc1QsS0FBS3lvQixHQUNoQixJQUFLLElBQUl6OEIsRUFBSSxFQUFHQSxFQUFJdzlILEVBQU0xNUgsU0FBVTlELEVBQUcsQ0FDbkMsTUFBTU8sRUFBT2k5SCxFQUFNeDlILEdBQ2JrQixFQUFJc1osTUFBTXN2RCxRQUFRcnRDLEdBQVdBLEVBQVF6OEIsR0FBRzRwRSxPQUFTbnRDLEVBQVFsOEIsR0FDL0QsR0FBZ0IsWUFBWlcsRUFBRXFELE9BQW1DLFVBQVpyRCxFQUFFcUQsT0FBaUMsU0FBWnJELEVBQUVxRCxPQUN0QyxXQUFackQsRUFBRXFELE9BQWtDLGNBQVpyRCxFQUFFcUQsTUFDMUIsTUFBTSxJQUFJb0UsTUFBTSxnQ0FBZ0NwSSxPQUFVVyxFQUFFcUQsU0FFaEUsTUFBTWs1SCxFQUFPLENBQUVsOUgsT0FBTXFELE1BQU8xQyxFQUFFMEMsTUFBT1csTUFBT3JELEVBQUVxRCxPQUM5QyxHQUFnQixXQUFackQsRUFBRXFELE1BQW9CLENBQ3RCLE1BQU1tNUgsRUFBWSxJQUFJM3hILFNBQVFxcUYsTUFBT3BxRixJQUNqQyxNQUFNRyxRQUFhakwsRUFBRThzSCxRQUNmMlAsRUFBZ0J4eEgsRUFBSzRwQixRQUFPLENBQUNqMEIsRUFBR3pCLElBQU15QixFQUFJekIsRUFBRXlELFFBQVEsR0FwQzFDLEVBcUNjcUksRUFBS3JJLE9BQzdCa3FILEVBQVEsSUFBSXI1RyxXQUFXZ3BILEdBQzdCLElBQUk5NkYsRUFBUyxFQUNiLElBQUssSUFBSTdpQyxFQUFJLEVBQUdBLEVBQUltTSxFQUFLckksT0FBUTlELElBQUssQ0FDbEMsTUFBTXNmLEVBQU1uVCxFQUFLbk0sR0FDWDQ5SCxFQUFnQixJQUFJanBILFdBQVcsSUFBSTAyRixZQUFZLENBQUMvckYsRUFBSXhiLFNBQVNzSSxRQUNuRTRoSCxFQUFNaGtILElBQUk0ekgsRUFBZS82RixHQUN6QkEsR0E1Q1ksRUE2Q1ptckYsRUFBTWhrSCxJQUFJc1YsRUFBS3VqQixHQUNmQSxHQUFVdmpCLEVBQUl4YixPQUVsQmtJLEVBQVFnaUgsTUFFWnVQLEVBQWE1NkgsS0FBSys2SCxRQUdsQkgsRUFBYTU2SCxLQUFLekIsRUFBRStKLFFBRVgsTUFBVGd0SCxJQUNBd0YsRUFBS3hGLE1BQVFBLEdBRWpCcUYsRUFBTTM2SCxLQUFLODZILEdBR2YsTUFBTyxDQUFFeHlILEtBQU00eUgsUUFEWTl4SCxRQUFRWSxJQUFJNHdILElBQ2NELFNBaUJsRCxTQUFTUSxFQUFjMXhILEVBQVFreEgsR0FFbEMsTUFBTTFuRyxFQUFNLEdBQ1osSUFBSW1vRyxFQUNBbDdGLEVBQVMsRUFDYixJQUFLLE1BQU00NkYsS0FBUUgsRUFBTyxDQUN0QixNQUFNLzhILEVBQU9rOUgsRUFBS2w5SCxLQUNaZ0UsRUFBUWs1SCxFQUFLbDVILE1BQ2JYLEVBQVE2NUgsRUFBSzc1SCxNQUNiZ0osRUFBTyx3QkFBY2hKLEdBQzNCLElBQUlnRyxFQUNKLEdBQUksaUJBQWtCNnpILEVBQU0sQ0FDeEIsTUFBTU8sRUFBZVAsRUFBS08sYUFDMUIsR0FBMkIsVUFBdkJBLEVBQWF6NUgsT0FBNEMsV0FBdkJ5NUgsRUFBYXo1SCxPQUMvQyxLQUFNLFFBQVN5NUgsTUFBZ0IsVUFBV0EsR0FDdEMsTUFBTSxJQUFJcjFILE1BQU0sVUFBVTgwSCxFQUFLbDlILDBCQUEwQnk5SCxFQUFhejVILGdFQUl6RSxJQUEyQixZQUF2Qnk1SCxFQUFhejVILE1BT2xCLE1BQU0sSUFBSW9FLE1BQU0sVUFBVTgwSCxFQUFLbDlILHVDQUNMeTlILEVBQWF6NUgsK0VBUHZDLEdBQWMsWUFBVkEsRUFDQSxNQUFNLElBQUlvRSxNQUFNLFVBQVU4MEgsRUFBS2w5SCwwQkFBMEJ5OUgsRUFBYXo1SCx5REFDZkEsTUFTL0QsTUFBTTA1SCxFQUF5Qix1QkFBcUJELEVBQWF6NUgsT0FDM0QyNUgsRUFBYTl4SCxFQUFPbkksTUFBTTQrQixFQUFRQSxFQUFTajJCLEVBQU9xeEgsR0FDbERFLEVBQXlDLFVBQXZCSCxFQUFhejVILE1BQ2pDLElBQUlvUSxXQUFXdXBILEdBQ2YsSUFBSXZ1RyxZQUFZdXVHLEdBQ3BCLEdBQWMsWUFBVjM1SCxFQUNBLEdBQTJCLFVBQXZCeTVILEVBQWF6NUgsT0FBNEMsV0FBdkJ5NUgsRUFBYXo1SCxNQUFvQixDQUNuRXFGLEVBQVMsSUFBSTRqQixhQUFhMndHLEVBQWVyNkgsUUFDekMsSUFBSyxJQUFJOUQsRUFBSSxFQUFHQSxFQUFJbStILEVBQWVyNkgsT0FBUTlELElBQUssQ0FDNUMsTUFBTXM1RSxFQUFJNmtELEVBQWVuK0gsR0FDekI0SixFQUFPNUosR0FBS3M1RSxFQUFJMGtELEVBQWFsN0YsTUFBUWs3RixFQUFheGxGLFNBR3JELElBQTJCLFlBQXZCd2xGLEVBQWF6NUgsTUFPbEIsTUFBTSxJQUFJb0UsTUFBTSxpQ0FBaUNxMUgsRUFBYXo1SCx1Q0FOeENxbUYsSUFBbEJtekMsSUFDQUEsRUFBZ0JLLEtBRXBCeDBILEVBQVNtMEgsRUFBY0ksT0FPMUIsSUFBYyxVQUFWNTVILEVBWUwsTUFBTSxJQUFJb0UsTUFBTSxnQ0FBZ0NwSSxPQUFVZ0UsS0FYMUQsR0FBMkIsVUFBdkJ5NUgsRUFBYXo1SCxPQUE0QyxXQUF2Qnk1SCxFQUFhejVILE1BQy9DLE1BQU0sSUFBSW9FLE1BQU0saUNBQWlDcTFILEVBQWF6NUgsZ0NBR2xFcUYsRUFBUyxJQUFJMEwsV0FBVzZvSCxFQUFlcjZILFFBQ3ZDLElBQUssSUFBSTlELEVBQUksRUFBR0EsRUFBSW0rSCxFQUFlcjZILE9BQVE5RCxJQUFLLENBQzVDLE1BQU1zNUUsRUFBSTZrRCxFQUFlbitILEdBQ3pCNEosRUFBTzVKLEdBQUttRSxLQUFLb1IsTUFBTStqRSxFQUFJMGtELEVBQWFsN0YsTUFBUWs3RixFQUFheGxGLE1BTXJFM1YsR0FBVWoyQixFQUFPcXhILE9BRWhCLEdBQWMsV0FBVjE1SCxFQUFvQixDQUN6QixNQUFNcUksRUFBTyx3QkFBYzZ3SCxFQUFLNzVILE9BQ2hDZ0csRUFBUyxHQUNULElBQUssSUFBSTVKLEVBQUksRUFBR0EsRUFBSTRNLEVBQU01TSxJQUFLLENBQzNCLE1BQU0wckcsRUFBYSxJQUFJTCxZQUFZai9GLEVBQU9uSSxNQUFNNCtCLEVBQVFBLEVBekp4QyxJQXlKMkUsR0FDM0ZBLEdBMUpnQixFQTJKaEIsTUFBTW1yRixFQUFRLElBQUlyNUcsV0FBV3ZJLEVBQU9uSSxNQUFNNCtCLEVBQVFBLEVBQVM2b0UsSUFDM0Q5aEcsRUFBT2pILEtBQUtxckgsR0FDWm5yRixHQUFVNm9FLE9BR2IsQ0FDRCxNQUFNMnlCLEVBQWMsdUJBQXFCOTVILEdBQ25DMjVILEVBQWE5eEgsRUFBT25JLE1BQU00K0IsRUFBUUEsRUFBU2oyQixFQUFPeXhILEdBQ3hELEdBQWMsWUFBVjk1SCxFQUNBcUYsRUFBUyxJQUFJNGpCLGFBQWEwd0csUUFFekIsR0FBYyxVQUFWMzVILEVBQ0xxRixFQUFTLElBQUkwTCxXQUFXNG9ILFFBRXZCLEdBQWMsU0FBVjM1SCxFQUNMcUYsRUFBUyxJQUFJK0ssV0FBV3VwSCxPQUV2QixJQUFjLGNBQVYzNUgsRUFlTCxNQUFNLElBQUlvRSxNQUFNLGdDQUFnQ3BJLE9BQVVnRSxLQWY5QixDQUM1QnFGLEVBQVMsSUFBSTRqQixhQUFhMHdHLEdBQzFCLE1BQU16eUgsRUFBTyxJQUFJK2hCLGFBQWE1akIsRUFBTzlGLE9BQVMsR0FDeEMrbEMsRUFBUSxJQUFJcmMsYUFBYTVqQixFQUFPOUYsT0FBUyxHQUMvQyxJQUFLLElBQUk5RCxFQUFJLEVBQUdBLEVBQUl5TCxFQUFLM0gsT0FBUTlELElBQzdCeUwsRUFBS3pMLEdBQUs0SixFQUFXLEVBQUo1SixHQUNqQjZwQyxFQUFNN3BDLEdBQUs0SixFQUFXLEVBQUo1SixFQUFRLEdBRTlCLE1BQU1zK0gsRUFBYSxpQkFBTzd5SCxFQUFNN0gsRUFBTyxXQUNqQzI2SCxFQUFjLGlCQUFPMTBGLEVBQU9qbUMsRUFBTyxXQUN6Q2d5QixFQUFJcjFCLEdBQVEsa0JBQVErOUgsRUFBWUMsR0FDaENELEVBQVd2cUgsVUFDWHdxSCxFQUFZeHFILFdBS2hCOHVCLEdBQVVqMkIsRUFBT3l4SCxFQUVQLGNBQVY5NUgsSUFDQXF4QixFQUFJcjFCLEdBQVEsaUJBQU9xSixFQUFRaEcsRUFBT1csSUFHMUMsT0FBT3F4QixFQUtKLFNBQVNpb0csRUFBdUJ0TyxHQUVuQyxHQUFXLE9BQVBBLEVBQ0EsTUFBTSxJQUFJNW1ILE1BQU0sd0JBQXdCMnhELEtBQUtFLFVBQVUrMEQsTUFFM0QsSUFBSWlQLEVBQWtCLEVBUXRCLE1BQU1DLEVBQWUsR0FDckJsUCxFQUFHOXNILFNBQVNzQyxJQUtSLEdBSkF5NUgsR0FBbUJ6NUgsRUFBRTJtRyxXQUVyQit5QixFQUFhOTdILEtBQUtvQyxFQUFFMm1HLGFBQWUzbUcsRUFBRXFILE9BQU9zL0YsV0FBYTNtRyxFQUNyRCxJQUFJQSxFQUFFOUMsWUFBWThDLE1BQ2hCQSxhQUFheW9CLGNBQWdCem9CLGFBQWF1USxZQUM1Q3ZRLGFBQWE0UCxZQUNiLE1BQU0sSUFBSWhNLE1BQU0sbUNBQW1DNUQsRUFBRTlDLFlBQVkxQixXQUl6RSxNQUFNc3FCLEVBQUksSUFBSWxXLFdBQVc2cEgsR0FDekIsSUFBSTM3RixFQUFTLEVBS2IsT0FKQTQ3RixFQUFhaDhILFNBQVNzQyxJQUNsQjhsQixFQUFFN2dCLElBQUksSUFBSTJLLFdBQVc1UCxFQUFFcUgsUUFBU3kyQixHQUNoQ0EsR0FBVTk5QixFQUFFMm1HLGNBRVQ3Z0YsRUFBRXplLE9BR2IsTUFBTXN5SCxFQUFrQyxvQkFBWEMsSUFDUixvQkFBVDluQyxNQUF3QyxvQkFBVCtuQyxNQUNuQixvQkFBVEMsTUFVUixTQUFTQyxFQUFpQmo0QyxHQUM3QixPQUFJNjNDLEVBQ09DLEVBQU9qekIsV0FBVzdrQixHQUV0QixJQUFJZ1EsS0FBSyxDQUFDaFEsSUFBTWo2RSxLQVFwQixTQUFTbXlILEVBQTBCM3lILEdBQ3RDLEdBQUlzeUgsRUFDQSxPQUFPQyxFQUFPbjZFLEtBQUtwNEMsR0FBUXF2RCxTQUFTLFVBRXhDLE1BQU1qUyxFQUFNLElBQUk3MEMsV0FBV3ZJLEdBQzNCLElBQUlySyxFQUFJLEdBQ1IsSUFBSyxJQUFJL0IsRUFBSSxFQUFHQyxFQUFJdXBELEVBQUkxbEQsT0FBUTlELEVBQUlDLEVBQUdELElBQ25DK0IsR0FBS3VvRyxPQUFPQyxhQUFhL2dELEVBQUl4cEQsSUFFakMsT0FBTzYrSCxLQUFLOThILEdBUVQsU0FBU2k5SCxFQUEwQm40QyxHQUN0QyxHQUFJNjNDLEVBQWUsQ0FDZixNQUFNbDFFLEVBQU1tMUUsRUFBT242RSxLQUFLcWlDLEVBQUssVUFDN0IsT0FBT3I5QixFQUFJcDlDLE9BQU9uSSxNQUFNdWxELEVBQUkrckMsV0FBWS9yQyxFQUFJK3JDLFdBQWEvckMsRUFBSWtpRCxZQUVqRSxNQUFNM3BHLEVBQUk2OEgsS0FBSy8zQyxHQUNUejZFLEVBQVMsSUFBSXVJLFdBQVc1UyxFQUFFK0IsUUFDaEMsSUFBSyxJQUFJOUQsRUFBSSxFQUFHQSxFQUFJK0IsRUFBRStCLFNBQVU5RCxFQUM1Qm9NLEVBQU9wQyxJQUFJLENBQUNqSSxFQUFFK29HLFdBQVc5cUcsSUFBS0EsR0FFbEMsT0FBT29NLEVBQU9BLE9BUVgsU0FBUzZ5SCxFQUF3QjFqQixHQUNwQyxHQUF1QixJQUFuQkEsRUFBUXozRyxPQUNSLE9BQU95M0csRUFBUSxHQUVuQixJQUFJaWpCLEVBQWtCLEVBQ3RCampCLEVBQVE5NEcsU0FBUzJKLElBQ2JveUgsR0FBbUJweUgsRUFBT3MvRixjQUU5QixNQUFNd3pCLEVBQU8sSUFBSXZxSCxXQUFXNnBILEdBQzVCLElBQUkzN0YsRUFBUyxFQUtiLE9BSkEwNEUsRUFBUTk0RyxTQUFTMkosSUFDYjh5SCxFQUFLbDFILElBQUksSUFBSTJLLFdBQVd2SSxHQUFTeTJCLEdBQ2pDQSxHQUFVejJCLEVBQU9zL0YsY0FFZHd6QixFQUFLOXlILE9BU1QsU0FBUyt5SCxFQUFTdHlGLEdBR3JCLElBREFBLEVBQU9BLEVBQUt1eUYsT0FDTHZ5RixFQUFLNnBELFNBRk0sTUFHZDdwRCxFQUFPQSxFQUFLNW9DLE1BQU0sRUFBRzRvQyxFQUFLL29DLE9BQVMsR0FFdkMsTUFBTXU3SCxFQUFReHlGLEVBQUtxM0IsTUFMRCxLQU1sQixPQUFPbTdELEVBQU1BLEVBQU12N0gsT0FBUyxHQVd6QixTQUFTdzdILEVBQThCQyxFQUFXekgsR0FDckQsTUFBTXhzSCxFQUFTLENBQ1gwcUgsY0FBZXVKLEVBQVV2SixjQUN6QndKLE9BQVFELEVBQVVDLE9BQ2xCQyxZQUFhRixFQUFVRSxZQUN2QkMsWUFBYUgsRUFBVUcsWUFDdkJ4SixnQkFBaUI0QixHQWNyQixPQVoyQixNQUF2QnlILEVBQVVJLFlBQ1ZyMEgsRUFBT3EwSCxVQUFZSixFQUFVSSxXQUVJLE1BQWpDSixFQUFVSyxzQkFDVnQwSCxFQUFPczBILG9CQUFzQkwsRUFBVUsscUJBRVQsTUFBOUJMLEVBQVVNLG1CQUNWdjBILEVBQU91MEgsaUJBQW1CTixFQUFVTSxrQkFFUixNQUE1Qk4sRUFBVU8saUJBQ1Z4MEgsRUFBT3cwSCxlQUFpQlAsRUFBVU8sZ0JBRS9CeDBILEVBV0o4cUYsZUFBZTJwQyxFQUF5QjFKLEVBQVdnQixHQUN0RCxNQUFNeEIsRUFBaUIsQ0FDbkJHLGNBQWVLLEVBQVVMLGNBQ3pCd0osT0FBUW5KLEVBQVVtSixPQUNsQkMsWUFBYXBKLEVBQVVvSixZQUN2QkMsWUFBYXJKLEVBQVVxSixhQUszQixHQUhnQyxNQUE1QnJKLEVBQVV5SixpQkFDVmpLLEVBQWVpSyxlQUFpQnpKLEVBQVV5SixnQkFFYixNQUE3QnpKLEVBQVVILGdCQUF5QixDQUNuQyxNQUFPRSxFQUFhTCxTQUFvQnNCLEVBQVloQixFQUFVSCxpQkFDOURMLEVBQWVPLFlBQWNBLEVBQzdCUCxFQUFlRSxXQUFhQSxFQVdoQyxPQVQyQixNQUF2Qk0sRUFBVXNKLFlBQ1Y5SixFQUFlOEosVUFBWXRKLEVBQVVzSixXQUVKLE1BQWpDdEosRUFBVXVKLHNCQUNWL0osRUFBZStKLG9CQUFzQnZKLEVBQVV1SixxQkFFakIsTUFBOUJ2SixFQUFVd0osbUJBQ1ZoSyxFQUFlZ0ssaUJBQW1CeEosRUFBVXdKLGtCQUV6Q2hLLEVBT0osU0FBU21LLEVBQTZCbkssR0FDekMsR0FBSUEsRUFBZUcseUJBQXlCQyxZQUN4QyxNQUFNLElBQUl0dEgsTUFBTSx1REFFcEIsTUFBTyxDQUNIczNILFVBQVcsSUFBSUMsS0FDZkMsa0JBQW1CLE9BQ25CQyxtQkFBb0QsTUFBaEN2SyxFQUFlRyxjQUMvQixFQUNBOEksRUFBaUJ4a0UsS0FBS0UsVUFBVXE3RCxFQUFlRyxnQkFDbkRxSyxpQkFBZ0QsTUFBOUJ4SyxFQUFlTyxZQUM3QixFQUNBMEksRUFBaUJ4a0UsS0FBS0UsVUFBVXE3RCxFQUFlTyxjQUNuRGtLLGdCQUE4QyxNQUE3QnpLLEVBQWVFLFdBQzVCLEVBQ0FGLEVBQWVFLFdBQVdycUIsWUF3RS9CLFNBQVMweUIsSUFJWixNQUFNbUMsRUFuRVYsV0FDSSxNQUFNQyxFQUFtQnhnSSxJQUNyQixJQUFJSSxFQUFJSixHQUFLLEdBQ1Q0Z0QsRUFBSSxFQUNSLEtBQTRCLElBQWhCLFFBQUp4Z0QsSUFDSndnRCxHQUFLLFFBQ0x4Z0QsSUFBTSxFQUlWLE9BRkFBLElBQUssUUFDTHdnRCxHQUFLLFVBQ0V4Z0QsRUFBSXdnRCxHQUVUMi9FLEVBQWUsSUFBSWwxQixZQUFZLE1BQ3JDazFCLEVBQWEsR0FBSyxFQUNsQixJQUFLLElBQUl2Z0ksRUFBSSxFQUFHQSxFQUFJLEtBQU1BLElBQ3RCdWdJLEVBQWF2Z0ksR0FBS3dnSSxFQUFnQnhnSSxHQUV0QyxJQUFLLElBQUlBLEVBQUksS0FBTUEsRUFBSSxLQUFNQSxJQUN6QnVnSSxFQUFhdmdJLEdBQUssV0FBZUEsRUFBSSxNQUFTLElBRWxELE9BQU91Z0ksRUErQ2NFLEdBQ2ZDLEVBeENWLFdBQ0ksTUFBTUEsRUFBZ0IsSUFBSXIxQixZQUFZLElBQ3RDcTFCLEVBQWMsR0FBSyxFQUNuQkEsRUFBYyxJQUFNLFdBQ3BCQSxFQUFjLElBQU0sV0FDcEJBLEVBQWMsSUFBTSxXQUNwQixJQUFLLElBQUkxZ0ksRUFBSSxFQUFHQSxFQUFJLEdBQUlBLElBQ3BCMGdJLEVBQWMxZ0ksR0FBS0EsR0FBSyxHQUU1QixJQUFLLElBQUlBLEVBQUksR0FBSUEsRUFBSSxHQUFJQSxJQUNyQjBnSSxFQUFjMWdJLEdBQUssWUFBZUEsRUFBSSxJQUFPLElBRWpELE9BQU8wZ0ksRUE0QmVDLEdBQ2hCQyxFQXJCVixXQUNJLE1BQU1BLEVBQWMsSUFBSXYxQixZQUFZLElBQ3BDLElBQUssSUFBSXJyRyxFQUFJLEVBQUdBLEVBQUksR0FBSUEsSUFDcEI0Z0ksRUFBWTVnSSxHQUFLLEtBR3JCLE9BREE0Z0ksRUFBWSxHQUFLQSxFQUFZLElBQU0sRUFDNUJBLEVBZWFDLEdBQ3BCLE9BQVExQyxJQUNKLE1BQU0veEgsRUFBUyxJQUFJNnBILFlBQVksRUFBSWtJLEVBQWVyNkgsUUFDNUNnOUgsRUFBbUIsSUFBSXoxQixZQUFZai9GLEdBQ3pDLElBQUssSUFBSWllLEVBQVEsRUFBR0EsRUFBUTh6RyxFQUFlcjZILE9BQVF1bUIsSUFBUyxDQUN4RCxNQUFNMDJHLEVBQWM1QyxFQUFlOXpHLEdBQzdCMjJHLEVBQWNULEVBQWFLLEVBQVlHLEdBQWUsS0FBcUIsS0FBZEEsSUFDL0RMLEVBQWNLLEdBQWUsSUFDakNELEVBQWlCejJHLEdBQVMyMkcsRUFFOUIsT0FBTyxJQUFJeHpHLGFBQWFwaEIsTTs7OzswS0N4Z0JoQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFxQkEsTUFBTTYwSCxFQUFpQixJQUNqQkMsRUFBYyxzQkFDZEMsRUFBYyxPQUNkQyxFQUF3QixpQkFDeEJDLEVBQXNCLGVBQ3RCQyxFQUFxQixjQUNyQkMsRUFBd0IsaUJBTXZCLFNBQVNDLElBQ1osSUFBSyxnQkFBTTk0SCxRQUFRLGVBQW1DLG9CQUFYWSxRQUNSLG9CQUF4QkEsT0FBT200SCxhQUNkLE1BQU0sSUFBSTk0SCxNQUFNLDZHQUdwQixNQUFNKzRILEVBQUtwNEgsT0FBT200SCxhQUNaRSxFQUFtQixHQUN6QixJQUFLLElBQUkzaEksRUFBSSxFQUFHQSxFQUFJMGhJLEVBQUc1OUgsU0FBVTlELEVBQUcsQ0FDaEMsTUFBTXVCLEVBQU1tZ0ksRUFBR25nSSxJQUFJdkIsR0FDYnkyRixFQUFTeXFDLEVBQWNELEVBQzdCLEdBQUkxL0gsRUFBSTZyRyxXQUFXM1csSUFBV2wxRixFQUFJdUMsT0FBUzJ5RixFQUFPM3lGLE9BQVEsQ0FDdEQ0OUgsRUFBR0UsV0FBV3JnSSxHQUNkLE1BQU1zZ0ksRUFBWUMsRUFBb0J2Z0ksSUFDTyxJQUF6Q29nSSxFQUFpQnZtSCxRQUFReW1ILElBQ3pCRixFQUFpQmgvSCxLQUFLay9ILElBSWxDLE9BQU9GLEVBRVgsU0FBU0ksRUFBYWwxRixHQUNsQixNQUFPLENBQ0h0NUIsS0FBTSxDQUFDMnRILEVBQWFyMEYsRUFBTXMwRixHQUFhdCtILEtBQUtvK0gsR0FDNUNlLFNBQVUsQ0FBQ2QsRUFBYXIwRixFQUFNdTBGLEdBQXVCditILEtBQUtvK0gsR0FDMUQ3SyxZQUFhLENBQUM4SyxFQUFhcjBGLEVBQU13MEYsR0FBcUJ4K0gsS0FBS28rSCxHQUMzRGxMLFdBQVksQ0FBQ21MLEVBQWFyMEYsRUFBTXkwRixHQUFvQnorSCxLQUFLbytILEdBQ3pEZ0IsY0FBZSxDQUFDZixFQUFhcjBGLEVBQU0wMEYsR0FBdUIxK0gsS0FBS28rSCxJQUd2RSxTQUFTaUIsRUFBWWx1SCxHQUNqQixJQUFLLE1BQU16UyxLQUFPYixPQUFPa0osT0FBT29LLEdBQzVCMUssT0FBT200SCxhQUFhRyxXQUFXcmdJLEdBVXZDLFNBQVN1Z0ksRUFBb0J2Z0ksR0FDekIsTUFBTTg5SCxFQUFROTlILEVBQUkyaUUsTUFBTSs4RCxHQUN4QixHQUFJNUIsRUFBTXY3SCxPQUFTLEVBQ2YsTUFBTSxJQUFJNkUsTUFBTSx1QkFBdUJwSCxLQUUzQyxPQUFPODlILEVBQU1wN0gsTUFBTSxFQUFHbzdILEVBQU12N0gsT0FBUyxHQUFHakIsS0FBS28rSCxHQVkxQyxNQUFNa0IsRUFDVGxnSSxZQUFZNDVILEdBQ1IsSUFBSyxnQkFBTW56SCxRQUFRLGVBQW1DLG9CQUFYWSxRQUNSLG9CQUF4QkEsT0FBT200SCxhQUtkLE1BQU0sSUFBSTk0SCxNQUFNLDJEQUdwQixHQURBdkcsS0FBS3MvSCxHQUFLcDRILE9BQU9tNEgsYUFDQSxNQUFiNUYsSUFBc0JBLEVBQ3RCLE1BQU0sSUFBSWx6SCxNQUFNLHNFQUVwQnZHLEtBQUt5NUgsVUFBWUEsRUFDakJ6NUgsS0FBSzRSLEtBQU8rdEgsRUFBYTMvSCxLQUFLeTVILFdBV2xDLFdBQVdoRyxHQUNQLEdBQUlBLEVBQWVHLHlCQUF5QkMsWUFDeEMsTUFBTSxJQUFJdHRILE1BQU0sNEZBR2YsQ0FDRCxNQUFNcTVILEVBQVcxbkUsS0FBS0UsVUFBVXE3RCxFQUFlRyxlQUN6Q0ksRUFBYzk3RCxLQUFLRSxVQUFVcTdELEVBQWVPLGFBQzVDUyxFQUFxQix1Q0FBNkJoQixHQUN4RCxJQUNJenpILEtBQUtzL0gsR0FBR1UsUUFBUWhnSSxLQUFLNFIsS0FBS1QsS0FBTSttRCxLQUFLRSxVQUFVcThELElBQy9DejBILEtBQUtzL0gsR0FBR1UsUUFBUWhnSSxLQUFLNFIsS0FBS2d1SCxTQUFVQSxHQUNwQzUvSCxLQUFLcy9ILEdBQUdVLFFBQVFoZ0ksS0FBSzRSLEtBQUtvaUgsWUFBYUEsR0FDdkNoMEgsS0FBS3MvSCxHQUFHVSxRQUFRaGdJLEtBQUs0UixLQUFLK2hILFdBQVksb0NBQTBCRixFQUFlRSxhQUkvRSxNQUFNc00sRUFBVyxDQUNiN0MsT0FBUTNKLEVBQWUySixPQUN2QkMsWUFBYTVKLEVBQWU0SixZQUM1QkMsWUFBYTdKLEVBQWU2SixZQUM1QkMsVUFBdUMsTUFBNUI5SixFQUFlOEosVUFDdEI5SixFQUFlOEosZUFDZi8wQyxFQUNKZzFDLG9CQUEyRCxNQUF0Qy9KLEVBQWUrSixvQkFDaEMvSixFQUFlK0oseUJBQ2ZoMUMsRUFDSmkxQyxpQkFBcUQsTUFBbkNoSyxFQUFlZ0ssaUJBQzdCaEssRUFBZWdLLHNCQUNmajFDLEVBQ0prMUMsZUFBaUQsTUFBakNqSyxFQUFlaUssZUFDM0JqSyxFQUFlaUssb0JBQ2ZsMUMsR0FHUixPQURBeG9GLEtBQUtzL0gsR0FBR1UsUUFBUWhnSSxLQUFLNFIsS0FBS2l1SCxjQUFlM25FLEtBQUtFLFVBQVU2bkUsSUFDakQsQ0FBRXhMLHNCQUViLE1BQU8zdUIsR0FHSCxNQURBZzZCLEVBQVk5L0gsS0FBSzRSLE1BQ1gsSUFBSXJMLE1BQU0seUJBQXlCdkcsS0FBS3k1SCxrSEFFcEJoRixFQUFtQnVKLHdDQUNyQnZKLEVBQW1Cd0oscUNBQ3BCeEosRUFBbUJ5SixzQkFZdEQsYUFDSSxNQUFNL3NILEVBQU8rbUQsS0FBS0MsTUFBTW40RCxLQUFLcy9ILEdBQUdZLFFBQVFsZ0ksS0FBSzRSLEtBQUtULE9BQ2xELEdBQVksTUFBUkEsRUFDQSxNQUFNLElBQUk1SyxNQUFNLGtEQUFrRHZHLEtBQUt5NUgsY0FFM0UsR0FBK0IsU0FBM0J0b0gsRUFBSzRzSCxrQkFDTCxNQUFNLElBQUl4M0gsTUFBTSw2RUFHcEIsTUFBTWl0QixFQUFNLEdBRU5vc0csRUFBVzFuRSxLQUFLQyxNQUFNbjRELEtBQUtzL0gsR0FBR1ksUUFBUWxnSSxLQUFLNFIsS0FBS2d1SCxXQUN0RCxHQUFnQixNQUFaQSxFQUNBLE1BQU0sSUFBSXI1SCxNQUFNLDRDQUE0Q3ZHLEtBQUt5NUgsMEJBR3JFam1HLEVBQUlvZ0csY0FBZ0JnTSxFQUVwQixNQUFNNUwsRUFBYzk3RCxLQUFLQyxNQUFNbjRELEtBQUtzL0gsR0FBR1ksUUFBUWxnSSxLQUFLNFIsS0FBS29pSCxjQUN6RCxHQUFtQixNQUFmQSxFQUNBLE1BQU0sSUFBSXp0SCxNQUFNLGdEQUFnRHZHLEtBQUt5NUgsMkJBR3pFam1HLEVBQUl3Z0csWUFBY0EsRUFFbEIsTUFBTW1NLEVBQWlCbmdJLEtBQUtzL0gsR0FBR1ksUUFBUWxnSSxLQUFLNFIsS0FBS2l1SCxlQUNqRCxHQUFzQixNQUFsQk0sRUFBd0IsQ0FDeEIsTUFBTUYsRUFBVy9uRSxLQUFLQyxNQUFNZ29FLEdBQzVCM3NHLEVBQUk0cEcsT0FBUzZDLEVBQVM3QyxPQUN0QjVwRyxFQUFJNnBHLFlBQWM0QyxFQUFTNUMsWUFDM0I3cEcsRUFBSThwRyxZQUFjMkMsRUFBUzNDLFlBQ0QsTUFBdEIyQyxFQUFTMUMsWUFDVC9wRyxFQUFJK3BHLFVBQVkwQyxFQUFTMUMsV0FFTyxNQUFoQzBDLEVBQVN6QyxzQkFDVGhxRyxFQUFJZ3FHLG9CQUFzQnlDLEVBQVN6QyxxQkFFTixNQUE3QnlDLEVBQVN4QyxtQkFDVGpxRyxFQUFJaXFHLGlCQUFtQndDLEVBQVN4QyxrQkFFTCxNQUEzQndDLEVBQVN2QyxpQkFDVGxxRyxFQUFJa3FHLGVBQWlCdUMsRUFBU3ZDLGdCQUl0QyxNQUFNMEMsRUFBbUJwZ0ksS0FBS3MvSCxHQUFHWSxRQUFRbGdJLEtBQUs0UixLQUFLK2hILFlBQ25ELEdBQXdCLE1BQXBCeU0sRUFDQSxNQUFNLElBQUk3NUgsTUFDTix3REFBSXZHLEtBQUt5NUgsMkJBR2pCLE9BREFqbUcsRUFBSW1nRyxXQUFhLG9DQUEwQnlNLEdBQ3BDNXNHLEdBR2Z1c0csRUFBb0J6TSxXQUFhLGtCQUMxQixNQUFNK00sRUFBc0JsN0IsR0FDMUIsZ0JBQU03K0YsUUFBUSxnQkFJVjhSLE1BQU1zdkQsUUFBUXk5QixJQUFRQSxFQUFJNkYsV0FBVyswQixFQUFvQnpNLFlBQ25EZ04sRUFBb0JuN0IsRUFBSXRqRyxNQUFNaytILEVBQW9Cek0sV0FBVzV4SCxTQUpqRSxLQXFDUixTQUFTNCtILEVBQW9CN0csR0FDaEMsT0FBTyxJQUFJc0csRUFBb0J0RyxHQTNCbkMsbUJBQWlCdkQsbUJBQW1CbUssR0FDcEMsbUJBQWlCakksbUJBQW1CaUksR0E0QjdCLE1BQU1FLEVBQ1QxZ0ksY0FDSSxpQkFBTyxnQkFBTXlHLFFBQVEsZUFBZSxJQUFNLDZDQUMxQyxpQkFBeUIsb0JBQVhZLFFBQ3FCLG9CQUF4QkEsT0FBT200SCxjQUE4QixJQUFNLDREQUN0RHIvSCxLQUFLcy9ILEdBQUtwNEgsT0FBT200SCxhQUVyQixtQkFDSSxNQUFNN3JHLEVBQU0sR0FDTjZnRSxFQUFTeXFDLEVBQWNELEVBQ3ZCMUgsRUFBUzBILEVBQWlCRSxFQUNoQyxJQUFLLElBQUluaEksRUFBSSxFQUFHQSxFQUFJb0MsS0FBS3MvSCxHQUFHNTlILFNBQVU5RCxFQUFHLENBQ3JDLE1BQU11QixFQUFNYSxLQUFLcy9ILEdBQUduZ0ksSUFBSXZCLEdBQ3hCLEdBQUl1QixFQUFJNnJHLFdBQVczVyxJQUFXbDFGLEVBQUltMUYsU0FBUzZpQyxHQUFTLENBRWhEM2pHLEVBRGtCa3NHLEVBQW9CdmdJLElBQ3JCKzRELEtBQUtDLE1BQU1uNEQsS0FBS3MvSCxHQUFHWSxRQUFRL2dJLEtBR3BELE9BQU9xMEIsRUFFWCxrQkFBa0JpWCxHQWpOdEIsSUFBMEJ0ckMsRUFtTmxCLE1BQU15UyxFQUFPK3RILEVBRGJsMUYsR0FsTmtCdHJDLEVBa05Nc3JDLEdBak5qQnVnRSxXQUFXKzBCLEVBQW9Cek0sWUFDdENuMEgsRUFBSTBDLE1BQU1rK0gsRUFBb0J6TSxXQUFXNXhILFFBQ3pDdkMsR0FpTkEsR0FBa0MsTUFBOUJhLEtBQUtzL0gsR0FBR1ksUUFBUXR1SCxFQUFLVCxNQUNyQixNQUFNLElBQUk1SyxNQUFNLDhCQUE4QmtrQyxNQUVsRCxNQUFNdDVCLEVBQU8rbUQsS0FBS0MsTUFBTW40RCxLQUFLcy9ILEdBQUdZLFFBQVF0dUgsRUFBS1QsT0FFN0MsT0FEQTJ1SCxFQUFZbHVILEdBQ0xULEs7Ozs7OEhDM1NmOzs7Ozs7Ozs7Ozs7Ozs7OztBQTRCQSxNQUFNcXZILEVBQW9CLE1BQ25CLE1BQU1DLEVBQ1Q1Z0ksY0FDSUcsS0FBSzBnSSxTQUFXLEdBRXBCLHFCQUlJLE9BSDBDLE1BQXRDRCxFQUEwQmpyQyxXQUMxQmlyQyxFQUEwQmpyQyxTQUFXLElBQUlpckMsR0FFdENBLEVBQTBCanJDLFNBUXJDLHVCQUF1Qm1yQyxFQUFRQyxHQUMzQixpQkFBaUIsTUFBVkQsR0FBZ0IsSUFBTSwwQ0FDekJBLEVBQU9yc0MsU0FBU2tzQyxLQUNoQkcsRUFBU0EsRUFBTzkrSCxNQUFNLEVBQUc4K0gsRUFBTzNuSCxRQUFRd25ILEtBRTVDLGlCQUFPRyxFQUFPai9ILE9BQVMsR0FBRyxJQUFNLHdDQUNoQyxNQUFNMGtILEVBQVdxYSxFQUEwQkksY0FDM0MsaUJBQW9DLE1BQTdCemEsRUFBU3NhLFNBQVNDLElBQWlCLElBQU0sMkRBQTJEQSxRQUMzR3ZhLEVBQVNzYSxTQUFTQyxHQUFVQyxFQUVoQyxrQkFBa0JELEdBQ2QsTUFBTUMsRUFBVTVnSSxLQUFLNmdJLGNBQWNILFNBQVNDLEdBQzVDLEdBQWUsTUFBWEMsRUFDQSxNQUFNLElBQUlyNkgsTUFBTSx5Q0FBeUNvNkgsTUFFN0QsT0FBT0MsRUFFWCxvQkFDSSxPQUFPdGlJLE9BQU9zVCxLQUFLNVIsS0FBSzZnSSxjQUFjSCxXQVc5QyxTQUFTSSxFQUFTMzdCLEdBQ2QsSUFBd0MsSUFBcENBLEVBQUluc0YsUUFBUXduSCxHQUNaLE1BQU0sSUFBSWo2SCxNQUVOLDZFQUFHazZILEVBQTBCTSxhQUFhdGdJLEtBQUssUUFFdkQsTUFBTyxDQUNIa2dJLE9BQVF4N0IsRUFBSXJqQyxNQUFNMCtELEdBQW1CLEdBQ3JDLzFGLEtBQU0wNkQsRUFBSXJqQyxNQUFNMCtELEdBQW1CLElBRzNDeHNDLGVBQWVndEMsRUFBbUJDLEVBQVdDLEVBQVNDLEdBQWUsR0FDakUsaUJBQU9GLElBQWNDLEdBQVMsSUFBTSx3Q0FBd0NELE9BQzVFLE1BQU1HLEVBQWUsbUJBQWlCQyxnQkFBZ0JKLEdBQ3RELGlCQUFPRyxFQUFhMS9ILE9BQVMsR0FBRyxJQUFNLGtFQUFrRXUvSCxPQUN4RyxpQkFBT0csRUFBYTEvSCxPQUFTLEdBQUcsSUFBTSx5Q0FBeUMwL0gsRUFBYTEvSCx3Q0FDeER1L0gsT0FDcEMsTUFBTUssRUFBY0YsRUFBYSxHQUMzQkcsRUFBZSxtQkFBaUJDLGdCQUFnQk4sR0FDdEQsaUJBQU9LLEVBQWE3L0gsT0FBUyxHQUFHLElBQzVCLHVFQUFPdy9ILE9BQ1gsaUJBQU9LLEVBQWE3L0gsT0FBUyxHQUFHLElBQU0seUNBQXlDMC9ILEVBQWExL0gsNkNBQ25Edy9ILE9BQ3pDLE1BQU1PLEVBQWNGLEVBQWEsR0FDM0JHLEVBQWVaLEVBQVNHLEdBQVdOLE9BQ25DZ0IsRUFBYWIsRUFBU0csR0FBV3gyRixLQUNqQ20zRixFQUFhRixJQUFpQlosRUFBU0csR0FBV04sT0FDbERsTixRQUF1QjZOLEVBQVl0N0IsT0FJckNtN0IsR0FBZ0JTLFNBQ1ZuQixFQUEwQm9CLFdBQVdILEdBQ3RDSSxZQUFZSCxHQUVyQixNQUFNSSxRQUFtQk4sRUFBWTlULEtBQUs4RixHQVExQyxPQUpJME4sSUFBaUJTLFNBQ1huQixFQUEwQm9CLFdBQVdILEdBQ3RDSSxZQUFZSCxHQUVkSSxFQUFXdE4sbUJBcUN0QnpnQyxlQUFlZ3VDLElBQ1gsTUFBTUMsRUFBVXhCLEVBQTBCTSxhQUNwQ3Z0RyxFQUFNLEdBQ1osSUFBSyxNQUFNbXRHLEtBQVVzQixFQUFTLENBQzFCLE1BQU1DLFFBQWtCekIsRUFBMEJvQixXQUFXbEIsR0FBUXFCLGFBQ3JFLElBQUssTUFBTXYzRixLQUFReTNGLEVBQVcsQ0FFMUIxdUcsRUFEWW10RyxFQUFTSCxFQUFvQi8xRixHQUM5QnkzRixFQUFVejNGLElBRzdCLE9BQU9qWCxFQW1DWHdnRSxlQUFlOHRDLEVBQVkzOEIsR0FDdkIsTUFBTWc5QixFQUFnQnJCLEVBQVMzN0IsR0FFL0IsT0FEZ0JzN0IsRUFBMEJvQixXQUFXTSxFQUFjeEIsUUFDcERtQixZQUFZSyxFQUFjMTNGLE1BaUQ3Q3VwRCxlQUFlb3VDLEVBQVVuQixFQUFXQyxHQUVoQyxPQUFPRixFQUFtQkMsRUFBV0MsR0FEaEIsR0FpRHpCbHRDLGVBQWVxdUMsRUFBVXBCLEVBQVdDLEdBRWhDLE9BQU9GLEVBQW1CQyxFQUFXQyxHQURoQixLOzs7O2lGQzlTekI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0JBLE1BQU1vQixFQUNGemlJLFlBQVk0ekgsR0FDUnp6SCxLQUFLeXpILGVBQWlCQSxFQUUxQixhQUNJLE9BQU96ekgsS0FBS3l6SCxnQkFHcEIsTUFBTThPLEVBQ0YxaUksWUFBWTRoSSxHQUNSemhJLEtBQUt5aEksWUFBY0EsRUFFdkIsV0FBV2hPLEdBQ1AsT0FBT3p6SCxLQUFLeWhJLFlBQVloTyxJQXdCekIsU0FBUytPLEVBQVcvTyxFQUFnQk8sRUFBYUwsRUFBWStKLEdBQ2hFLEdBQXlCLElBQXJCaDVCLFVBQVVoakcsT0FBYyxDQUd4QixPQUZ5RCxNQUFoQyt4SCxFQUFlRyxlQUNOLE1BQTlCSCxFQUFlTyxZQUVSLElBQUlzTyxFQUFrQjdPLElBSzdCamdILFFBQVEvRSxLQUFLLHlOQUlOLElBQUk2ekgsRUFBa0IsQ0FBRTFPLGNBQWVILEtBVWxELE9BSkFqZ0gsUUFBUS9FLEtBQUsseU5BSU4sSUFBSTZ6SCxFQUFrQixDQUN6QjFPLGNBQWVILEVBQ2ZPLGNBQ0FMLGFBQ0ErSixtQkFtQkwsU0FBUytFLEVBQWdCaEIsR0FDNUIsT0FBTyxJQUFJYyxFQUFpQmQsSzs7Ozs2RUNyR2hDOzs7Ozs7Ozs7Ozs7Ozs7O0dBeUJPLFNBQVNpQixFQUF3QnBOLEVBQVVpQixFQUFZb00sRUFBZUMsSUFnQnpFLFNBQXVCdE4sR0FDbkIsaUJBQW1CLE1BQVpBLEdBQW9CbDlHLE1BQU1zdkQsUUFBUTR0RCxJQUFhQSxFQUFTNXpILE9BQVMsR0FBRyxJQUFNLHdDQWhCckZtaEksQ0FBY3ZOLEdBa0JkLFNBQXVCcU4sRUFBZUMsR0FDbEMsaUJBQU9ELEdBQWlCLEdBQUtBLEdBQWlCLEdBQUcsSUFDN0Msb0VBQXFCQSxNQUN6QixpQkFBT0MsR0FBZSxHQUFLQSxHQUFlLEdBQUcsSUFDekMsa0VBQW1CQSxNQUN2QixpQkFBT0EsR0FBZUQsR0FBZSxJQUNqQyx5RUFBcUJBLHFCQUNsQkMsTUF0QlhFLENBRkFILEVBQWlDLE1BQWpCQSxFQUF3QixFQUFJQSxFQUM1Q0MsRUFBNkIsTUFBZkEsRUFBc0IsRUFBSUEsR0FFeEMsSUFBSUcsRUFBa0IsRUF1QnRCLE9BQU9wNUgsUUFBUVksSUFBSStxSCxFQUFTcDFILEtBdEJIOGlJLElBQ3JCQSxFQUFRN3RDLE1BQUt0MkYsSUFDVCxNQUFNb2tJLEVBQVdOLEtBQ1hJLEVBQWtCek4sRUFBUzV6SCxRQUFVa2hJLEVBQWNELEdBR3pELE9BREFwTSxFQUFXME0sR0FDSnBrSSxLQUVKbWtJLFE7Ozs7Z0pDdkNmOzs7Ozs7Ozs7Ozs7Ozs7OztBQWdCTyxNQUFNRSxFQUNUcmpJLGNBQ0lHLEtBQUttakksWUFBYyxHQUNuQm5qSSxLQUFLb2pJLFlBQWMsR0FFdkIscUJBSUksT0FIaUMsTUFBN0JGLEVBQWlCMXRDLFdBQ2pCMHRDLEVBQWlCMXRDLFNBQVcsSUFBSTB0QyxHQUU3QkEsRUFBaUIxdEMsU0FRNUIsMEJBQTBCNnRDLEdBQ3RCSCxFQUFpQnJDLGNBQWNzQyxZQUFZNWlJLEtBQUs4aUksR0FRcEQsMEJBQTBCQyxHQUN0QkosRUFBaUJyQyxjQUFjdUMsWUFBWTdpSSxLQUFLK2lJLEdBVXBELHVCQUF1Qm4rQixHQUNuQixPQUFPKzlCLEVBQWlCSyxZQUFZcCtCLEVBQUssUUFVN0MsdUJBQXVCQSxFQUFLaXhCLEdBQ3hCLE9BQU84TSxFQUFpQkssWUFBWXArQixFQUFLLE9BQVFpeEIsR0FFckQsbUJBQW1CanhCLEVBQUtxK0IsRUFBYXBOLEdBQ2pDLE1BQU1xTixFQUFnQixHQVV0QixPQVRnQyxTQUFoQkQsRUFDWk4sRUFBaUJyQyxjQUFjdUMsWUFDL0JGLEVBQWlCckMsY0FBY3NDLGFBQzNCOWlJLFNBQVFxakksSUFDWixNQUFNQyxFQUFVRCxFQUFPditCLEVBQUtpeEIsR0FDWixPQUFadU4sR0FDQUYsRUFBY2xqSSxLQUFLb2pJLE1BR3BCRixHQUdSLE1BQU12TixFQUFzQjBOLEdBQWVWLEVBQWlCaE4sbUJBQW1CME4sR0FDekV4TCxFQUFzQndMLEdBQWVWLEVBQWlCOUssbUJBQW1Cd0wsR0FDekVwQyxFQUFtQnI4QixHQUFRKzlCLEVBQWlCMUIsZ0JBQWdCcjhCLEdBQzVEazhCLEVBQWtCLENBQUNsOEIsRUFBS2l4QixJQUFnQjhNLEVBQWlCN0IsZ0JBQWdCbDhCLEVBQUtpeEIsSTs7OzswRUNwRjNGOzs7Ozs7Ozs7Ozs7Ozs7OztBQW9CTyxNQUFNeU4sRUFBdUIsQ0FDaEMsUUFBVyxFQUNYLFFBQVcsRUFDWCxNQUFTLEVBQ1QsT0FBVSxFQUNWLE1BQVMsRUFDVCxLQUFRLEVBQ1IsVUFBYSxJOzs7O2lIQzNCakI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0NPN3ZDLGVBQWU4dkMsRUFBeUJ4TSxFQUFXbEIsR0FDbkMsTUFBZkEsSUFDQUEsRUFBYyxJQUVsQixNQUFNSyxFQUFxQyxNQUF6QkwsRUFBWUssVUFBb0IsZ0JBQU01SCxTQUFTNTVCLE1BQzdEbWhDLEVBQVlLLFVBRVZzTixFQUFXek0sRUFBVXAzSCxLQUFJOGpJLEdBQVl2TixFQUFVdU4sRUFBVTVOLEVBQVlNLFlBQWEsQ0FBRXVOLFVBQVUsTUFNOUZDLEdBSHNDLE1BQTFCOU4sRUFBWUcsaUJBQ3BCNXNILFFBQVFZLElBQUl3NUgsU0FDWixrQ0FBd0JBLEVBQVUzTixFQUFZRyxXQUo3QixFQUNGLEtBSVFyMkgsS0FBSXEwRixHQUFZQSxFQUFTYyxnQkFNMUQsT0FIMEMsTUFBMUIrZ0MsRUFBWUcsaUJBQ2xCNXNILFFBQVFZLElBQUkyNUgsU0FDWixrQ0FBd0JBLEVBQWdCOU4sRUFBWUcsV0FKbEMsR0FDRixHQWV2QnZpQyxlQUFlaWhDLEVBQVlTLEVBQVV5TyxFQUFpQixHQUFJQyxFQUFhMU4sR0FRMUUsT0FEb0IyTixHQURFQyxHQUFjUixFQUF5QlEsRUFBVyxDQUFFNU4saUJBRW5FekIsQ0FBWVMsRUFBVXlPLEVBQWdCQyxHQTBCMUMsU0FBU0MsRUFBcUJFLEdBQ2pDLE9BQU92d0MsTUFBTzBoQyxFQUFVeU8sRUFBaUIsR0FBSUMsS0FHekMsTUFBTUksRUFBeUI5TyxFQUFTeDFILEtBQUksS0FBTSxJQUM1Q3VrSSxFQUFzQixHQUN0QkMsRUFBOEIsTUFBZk4sRUFBc0JBLEVBQVlsa0ksS0FBSSxLQUFNLElBQVMsR0FDcEV5a0ksRUFBeUIsR0FtQy9CLEdBbENBalAsRUFBU3IxSCxTQUFRLENBQUN1a0ksRUFBcUJDLEtBQ25DLElBQUlDLEVBQWMsRUFDbEJGLEVBQW9CMWlHLFFBQVE3aEMsU0FBUTBrSSxJQUNoQyxNQUFNQyxFQUFZLGlCQUFrQkQsRUFDaENBLEVBQWFuSixhQUFhejVILE1BQzFCNGlJLEVBQWE1aUksTUFDWDhpSSxFQUFlLHVCQUFxQkQsR0FDdEMsZ0JBQW1CRCxFQUFhdmpJLE9BQzlCMGpJLEVBQThCLEtBQ2hDVixFQUF1QkssSUFBYyxFQUNFLE1BQW5DSixFQUFvQkksS0FDcEJKLEVBQW9CSSxHQUFjLElBRXRDSixFQUFvQkksR0FBWXRrSSxLQUFLLENBQ2pDNGtJLGNBQWVKLEVBQ2ZELGNBQ0FNLFVBQVdILEtBR0EsTUFBZmIsRUFDQUEsRUFBWS9qSSxTQUFRLENBQUNnbEksRUFBWUMsS0FDekJELElBQWVOLEVBQWE1bUksT0FDNUIrbUksSUFDQVIsRUFBYVksSUFBZSxNQUtwQ0osSUFFSlAsRUFBdUJwa0ksS0FBS3drSSxFQUFhNW1JLE1BQ3pDMm1JLEdBQWVHLFNBR2xCUCxFQUFhdDJILE9BQU0wMUcsR0FBU0EsSUFBUSxDQUNyQyxNQUFNeWhCLEVBQWtCbkIsRUFBWWo0SCxRQUFPLENBQUNoTSxFQUFHdkMsS0FBTzhtSSxFQUFhOW1JLEtBQ25FLE1BQU0sSUFBSTJJLE1BQ04sa0RBQUdnL0gsRUFBZ0I5a0ksS0FBSyxrREFFckJra0ksRUFBdUJsa0ksS0FBSyxVQUl2QyxNQUFNK2tJLEVBQXNCaEIsRUFBdUI3d0csUUFBTyxDQUFDOHhHLEVBQWFDLEVBQWE5bkksS0FDN0U4bkksR0FDQUQsRUFBWWxsSSxLQUFLM0MsR0FFZDZuSSxJQUNSLElBQ0duQixFQUFZLEdBQ2xCa0IsRUFBb0JubEksU0FBUXpDLElBQ3hCODNILEVBQVM5M0gsR0FBR20ySCxNQUFNMXpILFNBQVFzbEksSUFDdEIsTUFBTUMsRUFBV3pCLEdBQ1hBLEVBQWU3dkMsU0FBUyxLQUFhLEdBQU4sS0FBWXF4QyxFQUNqRHJCLEVBQVUvakksS0FBS3FsSSxTQUd2QixNQUFNenNCLFFBQWdCb3JCLEVBQXFCRCxHQUNyQ3VCLEVBQW1CLEdBQ3pCLElBQUlDLEVBQW9CLEVBMEJ4QixPQXpCQU4sRUFBb0JubEksU0FBUXpDLElBQ3hCLE1BQU1tb0ksRUFBYXJRLEVBQVM5M0gsR0FBR20ySCxNQUFNcnlILE9BQ3JDLElBQUlza0ksRUFBYSxFQUNqQixJQUFLLElBQUlwb0ksRUFBSSxFQUFHQSxFQUFJbW9JLEVBQVlub0ksSUFDNUJvb0ksR0FBYzdzQixFQUFRMnNCLEVBQW9CbG9JLEdBQUcwckcsV0FHakQsTUFBTTI4QixFQUFjLElBQUlwUyxZQUFZbVMsR0FDOUJFLEVBQWtCLElBQUkzekgsV0FBVzB6SCxHQUN2QyxJQUFJRSxFQUFvQixFQUN4QixJQUFLLElBQUl2b0ksRUFBSSxFQUFHQSxFQUFJbW9JLEVBQVlub0ksSUFBSyxDQUNqQyxNQUFNb00sRUFBUyxJQUFJdUksV0FBVzRtRyxFQUFRMnNCLEVBQW9CbG9JLElBQzFEc29JLEVBQWdCdCtILElBQUlvQyxFQUFRbThILEdBQzVCQSxHQUFxQm44SCxFQUFPcy9GLFdBRVRtN0IsRUFBb0I3bUksR0FDNUJ5QyxTQUFRMGtJLElBQ25CLE1BQU1qSixFQUFhbUssRUFBWXBrSSxNQUFNa2pJLEVBQWFELFlBQWFDLEVBQWFELFlBQWNDLEVBQWFLLFdBQ2pHZ0IsRUFBa0Isd0JBQWN0SyxFQUFZLENBQUNpSixFQUFhSSxnQkFDaEUsSUFBSyxNQUFNaG5JLEtBQVFpb0ksRUFDZlAsRUFBaUIxbkksR0FBUWlvSSxFQUFnQmpvSSxNQUdqRDJuSSxHQUFxQkMsS0FFbEJGLEs7Ozs7aTBEQzdMZixpNk5BQU8sTUFBTVEsRUFBTSxNQUNOQyxFQUFPLE9BQ1BDLEVBQVEsUUFDUkMsRUFBTSxNQUNOQyxFQUFPLE9BQ1BDLEVBQU0sTUFDTkMsRUFBTSxNQUNOQyxFQUFTLFNBQ1RDLEVBQVMsU0FDVEMsRUFBTyxPQUNQQyxFQUFRLFFBQ1JDLEVBQU8sT0FDUEMsRUFBUSxRQUNSQyxFQUFRLFFBQ1JDLEVBQVUsVUFDVkMsRUFBYyxjQUNkQyxFQUFZLFlBQ1pDLEVBQWdCLGdCQUNoQkMsRUFBYyxjQUNkQyxFQUFpQixpQkFDakJDLEVBQVcsV0FDWEMsRUFBYyxjQUNkQyxFQUFPLE9BQ1BDLEVBQU8sT0FDUEMsRUFBYyxjQUNkQyxFQUFVLFVBQ1ZDLEVBQWEsYUFDYkMsRUFBUyxTQUNUQyxFQUFTLFNBQ1RDLEVBQXVCLHVCQUN2QkMsRUFBc0Isc0JBQ3RCQyxFQUFTLFNBQ1RDLEVBQXlCLHlCQUN6QkMsRUFBd0Isd0JBQ3hCQyxFQUFNLE1BQ05DLEVBQU8sT0FDUEMsRUFBUyxTQUNUQyxFQUFnQixnQkFDaEJDLEVBQWdCLGdCQUNoQkMsRUFBZSxlQUNmQyxFQUF3Qix3QkFDeEJDLEVBQXNDLHNDQUN0Q0MsRUFBcUMscUNBQ3JDQyxFQUFPLE9BQ1BDLEVBQWEsYUFDYkMsRUFBMEIsMEJBQzFCQyxFQUEyQiwyQkFDM0JDLEVBQVUsVUFDVkMsRUFBUyxTQUNUQyxFQUFNLE1BQ05DLEVBQVUsVUFDVkMsR0FBTSxNQUNOQyxHQUFRLFFBQ1JDLEdBQU0sTUFDTkMsR0FBYSxhQUNiQyxHQUFRLFFBQ1JDLEdBQU0sTUFDTkMsR0FBTyxPQUNQQyxHQUFnQixnQkFDaEJDLEdBQVEsUUFDUkMsR0FBVyxXQUNYQyxHQUFpQixpQkFDakJDLEdBQVcsV0FDWEMsR0FBVyxXQUNYQyxHQUFVLFVBQ1ZDLEdBQWUsZUFDZkMsR0FBVyxXQUNYQyxHQUFPLE9BQ1BDLEdBQU8sT0FDUEMsR0FBVyxXQUNYQyxHQUFRLFFBQ1JDLEdBQVEsUUFDUkMsR0FBWSxZQUNaQyxHQUFPLE9BQ1BDLEdBQVksWUFDWkMsR0FBVyxXQUNYQyxHQUFNLE1BQ05DLEdBQVEsUUFDUkMsR0FBYSxhQUNiQyxHQUFhLGFBQ2JDLEdBQVksWUFDWkMsR0FBYSxhQUNiQyxHQUFNLE1BQ05DLEdBQVUsVUFDVkMsR0FBTSxNQUNOQyxHQUFVLFVBQ1ZDLEdBQVUsVUFDVkMsR0FBYyxjQUNkQyxHQUFZLFlBQ1pDLEdBQWdCLGdCQUNoQkMsR0FBb0Isb0JBQ3BCQyxHQUFPLE9BQ1BDLEdBQU0sTUFDTkMsR0FBVSxVQUNWQyxHQUFZLFlBQ1pDLEdBQU0sTUFDTkMsR0FBYyxjQUNkQyxHQUFXLFdBQ1hDLEdBQU0sTUFDTkMsR0FBVyxXQUNYQyxHQUFzQixzQkFDdEJDLEdBQXNCLHNCQUN0QkMsR0FBc0Isc0JBQ3RCQyxHQUFXLFdBQ1hDLEdBQVMsU0FDVEMsR0FBTyxPQUNQQyxHQUFRLFFBQ1JDLEdBQU8sT0FDUEMsR0FBTSxNQUNOQyxHQUFRLFFBQ1JDLEdBQU8sT0FDUEMsR0FBUSxRQUNSQyxHQUFPLE9BQ1BDLEdBQWEsYUFDYkMsR0FBTyxPQUNQQyxHQUFVLFVBQ1ZDLEdBQXdCLHdCQUN4QkMsR0FBNEIsNEJBQzVCQyxHQUFpQixpQkFDakJDLEdBQXFCLHFCQUNyQkMsR0FBUSxRQUNSQyxHQUFVLFVBQ1ZDLEdBQVEsUUFDUkMsR0FBUSxRQUNSQyxHQUFZLFlBQ1pDLEdBQVMsU0FDVEMsR0FBTyxPQUNQQyxHQUFRLFFBQ1JDLEdBQU0sTUFDTkMsR0FBTyxPQUNQQyxHQUFPLE9BQ1BDLEdBQVUsVUFDVkMsR0FBVyxXQUNYQyxHQUFPLE9BQ1BDLEdBQU0sTUFDTkMsR0FBaUIsaUJBQ2pCQyxHQUFTLFNBQ1RDLEdBQVUsVUFDVkMsR0FBc0Isc0JBQ3RCQyxHQUFnQixnQkFDaEJDLEdBQW9CLG9CQUNwQkMsR0FBbUIsbUJBQ25CQyxHQUFnQixnQkFDaEJDLEdBQW9CLG9CQUNwQkMsR0FBUyxTQUNUQyxHQUFlLGVBQ2ZDLEdBQWUsZUFDZkMsR0FBYyxjQUNkQyxHQUF5Qix5QkFDekJDLEdBQU0sTUFDTkMsR0FBTSxNQUNOQyxHQUFPLE9BQ1BDLEdBQU8sT0FDUEMsR0FBTyxPQUNQQyxHQUFZLFlBQ1pDLEdBQVksWUFDWkMsR0FBUyxTQUNUQyxHQUFTLFNBQ1RDLEdBQXFCLHFCQUNyQkMsR0FBWSxZQUlaQyxHQUFPLE9BQ1BDLEdBQWEsYUFDYkMsR0FBbUIsbUJBQ25CQyxHQUFlLGVBQ2ZDLEdBQWMsY0FDZEMsR0FBdUIsd0I7Ozs7aU1DeEtwQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQkEsTUFBTUMsRUFBaUIsb0JBQVUsa0JBQWtCLElBQU0sSUFBSXZnQixNQUN2RHdnQixFQUFlLG9CQUFVLGdCQUFnQixJQUFNLElBQUl4Z0IsTUFPbEQsU0FBU3lnQixFQUFVcjNHLEVBQVlDLEdBQ2xDLE1BQU10NkIsRUFBTTJ4SSxFQUFRdDNHLEVBQVlDLEdBQ2hDLE9BQU9rM0csRUFBZWx5SSxJQUFJVSxHQU12QixTQUFTNHhJLEVBQVl2M0csR0FDeEIsT0FBT28zRyxFQUFhbnlJLElBQUkrNkIsR0FFckIsU0FBU3czRyxFQUFxQnYzRyxHQUNqQyxNQUFNdzNHLEVBQUtOLEVBQWVPLFVBQ3BCaG9JLEVBQVMsR0FDZixPQUFhLENBQ1QsTUFBTSxLQUFFaW9JLEVBQUksTUFBRXR5SSxHQUFVb3lJLEVBQUdHLE9BQzNCLEdBQUlELEVBQ0EsTUFFSixNQUFPaHlJLEVBQUtreUksR0FBVXh5SSxHQUNmK3hCLEdBQVl6eEIsRUFBSTJpRSxNQUFNLEtBQ3pCbHhDLElBQVk2SSxHQUNadndCLEVBQU8zSSxLQUFLOHdJLEdBR3BCLE9BQU9ub0ksRUFhSixTQUFTb29JLEVBQWVELEdBQzNCLE1BQU0sV0FBRTczRyxFQUFVLFlBQUVDLEdBQWdCNDNHLEVBQzlCbHlJLEVBQU0yeEksRUFBUXQzRyxFQUFZQyxHQUM1QmszRyxFQUFlM29JLElBQUk3SSxJQUNuQnFVLFFBQVEvRSxLQUFLLGVBQWUrcUIsbUJBQ3BCQyw0QkFFWmszRyxFQUFlL29JLElBQUl6SSxFQUFLa3lJLEdBVXJCLFNBQVNFLEVBQWlCRixHQUM3QixNQUFNLFdBQUU3M0csR0FBZTYzRyxFQUNuQlQsRUFBYTVvSSxJQUFJd3hCLElBR2IsZ0JBQU1sekIsUUFBUSxVQUNka04sUUFBUS9FLEtBQUssZ0NBQWdDK3FCLE1BR3JEbzNHLEVBQWFocEksSUFBSTR4QixFQUFZNjNHLEdBUzFCLFNBQVNHLEVBQWlCaDRHLEVBQVlDLEdBQ3pDLE1BQU10NkIsRUFBTTJ4SSxFQUFRdDNHLEVBQVlDLEdBQ2hDLElBQUtrM0csRUFBZTNvSSxJQUFJN0ksR0FDcEIsTUFBTSxJQUFJb0gsTUFBTSxlQUFlaXpCLG1CQUN2QkMsd0JBRVprM0csRUFBZTlsSSxPQUFPMUwsR0FHbkIsU0FBU3N5SSxFQUFtQmo0RyxHQUMvQixJQUFLbzNHLEVBQWE1b0ksSUFBSXd4QixHQUNsQixNQUFNLElBQUlqekIsTUFBTSxpQkFBaUJpekIsb0NBRXJDbzNHLEVBQWEvbEksT0FBTzJ1QixHQVFqQixTQUFTazRHLEVBQXNCQyxFQUF1QkMsR0FDekNaLEVBQXFCVyxHQUM3QnR4SSxTQUFRdXVELElBRVowaUYsRUFEd0JoekksT0FBT3loRCxPQUFPLEdBQUk2TyxFQUFjLENBQUVuMUIsWUFBYW00RyxRQUkvRSxTQUFTZCxFQUFRdDNHLEVBQVlDLEdBQ3pCLE1BQU8sR0FBR0EsS0FBZUQsTTs7OzsrRENoSTdCOzs7Ozs7Ozs7Ozs7Ozs7O0dBaUJPLFNBQVMvcUIsS0FBUWd3RyxHQUNmLGdCQUFNbjRHLFFBQVEsWUFDZmtOLFFBQVEvRSxRQUFRZ3dHLEdBR2pCLFNBQVMzbkcsS0FBTzJuRyxHQUNkLGdCQUFNbjRHLFFBQVEsWUFDZmtOLFFBQVFzRCxPQUFPMm5HLEs7Ozs7cUVDeEJ2QixrTDs7Ozt5RENBQSxrWUEyQ08sTUFBTXp2RyxFQUFNLGFBQUcsQ0FBRTZpSTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFYeEIsU0FBY2x2SSxHQUNWLE1BQU0rNEIsRUFBSywwQkFBZ0IvNEIsRUFBRyxJQUFLLE9BQ25DLEdBQWlCLGNBQWIrNEIsRUFBR3Y1QixNQUF1QixDQUMxQixNQUFNK0wsRUFBUyxDQUFFdkwsRUFBRys0QixHQUNwQixPQUFPLFNBQU9ndEYsVUFBVSxhQUFZeDZHLEdBRW5DLENBQ0QsTUFBTUEsRUFBUyxDQUFFdkwsRUFBRys0QixHQUNwQixPQUFPLFNBQU9ndEYsVUFBVSxNQUFLeDZHLFE7Ozs7MERDeENyQyxtWUFvQ08sTUFBTTByQixFQUFPLGFBQUcsQ0FBRWs0Rzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFMekIsU0FBZW52SSxHQUNYLE1BQ011TCxFQUFTLENBQUV2TCxFQUROLDBCQUFnQkEsRUFBRyxJQUFLLFNBRW5DLE9BQU8sU0FBTytsSCxVQUFVLE9BQU14NkcsTzs7OzsyRENsQ2xDLG9ZQXNDTyxNQUFNNnJCLEVBQVEsYUFBRyxDQUFFZzRHOzs7Ozs7Ozs7Ozs7Ozs7OztBQUwxQixTQUFnQnB2SSxHQUNaLE1BQ011TCxFQUFTLENBQUV2TCxFQUROLDBCQUFnQkEsRUFBRyxJQUFLLFVBRW5DLE9BQU8sU0FBTytsSCxVQUFVLFFBQU94NkcsTzs7Ozt5RENwQ25DLHVkQW1ETyxNQUFNVCxFQUFNLGFBQUcsQ0FBRXVrSTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFQeEIsU0FBYy8rSCxFQUFHeWYsR0FDYixJQUFJdS9HLEVBQUssMEJBQWdCaC9ILEVBQUcsSUFBSyxPQUM3QmkvSCxFQUFLLDBCQUFnQngvRyxFQUFHLElBQUssUUFDaEN1L0csRUFBSUMsR0FBTSx5QkFBZUQsRUFBSUMsR0FDOUIsTUFBTWhrSSxFQUFTLENBQUUrRSxFQUFHZy9ILEVBQUl2L0csRUFBR3cvRyxHQUMzQixPQUFPLFNBQU94cEIsVUFBVSxNQUFLeDZHLE87Ozs7MERDakRqQywwY0FxRE8sTUFBTWtzQixFQUFPLGFBQUcsQ0FBRSszRzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFuQnpCLFNBQWU5M0csR0FDWCxTQUFZamlCLE1BQU1zdkQsUUFBUXJ0QyxJQUFVLElBQU0sK0RBQzFDLFNBQVlBLEVBQVEzNEIsUUFBVSxHQUFHLElBQzdCLHVEQUFHMjRCLEVBQVEzNEIsV0FDZixNQUFNMHdJLEVBQVcvM0csRUFBUW42QixLQUFJLENBQUNwQixFQUFHbEIsSUFBTSwwQkFBZ0JrQixFQUFHLFVBQVVsQixJQUFLLFVBQ25FeTBJLEVBQWNELEVBQVMsR0FDN0JBLEVBQVMveEksU0FBUXZCLElBQ2IsR0FBSUEsRUFBRXFELFFBQVVrd0ksRUFBWWx3SSxNQUN4QixNQUFNLElBQUlvRSxNQUFNLCtEQUd4QjZySSxFQUFTL3hJLFNBQVF2QixJQUNiLElBQUssY0FBaUJBLEVBQUUwQyxNQUFPNndJLEVBQVk3d0ksT0FDdkMsTUFBTSxJQUFJK0UsTUFBTSwrREFHeEIsTUFBTTJILEVBQVNra0ksRUFDZixPQUFPLFNBQU8xcEIsVUFBVSxPQUFNeDZHLE87Ozs7eURDbkRsQyxrWUF1RE8sTUFBTTNELEVBQU0sYUFBRyxDQUFFK25JOzs7Ozs7Ozs7Ozs7Ozs7OztBQU54QixTQUFjM3ZJLEVBQUc4VixFQUFPLEtBQU1taUIsR0FBVyxHQUNyQyxNQUNNMXNCLEVBQVMsQ0FBRXZMLEVBRE4sMEJBQWdCQSxFQUFHLElBQUssTUFBTyxTQUVwQyt1QixFQUFRLENBQUVqWixPQUFNbWlCLFlBQ3RCLE9BQU8sU0FBTzh0RixVQUFVLE1BQUt4NkcsRUFBUXdqQixPOzs7O3lEQ3JEekMsa1lBd0RPLE1BQU02SixFQUFNLGFBQUcsQ0FBRWczRzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFQeEIsU0FBYzV2SSxFQUFHOFYsRUFBTyxLQUFNbWlCLEdBQVcsR0FDckMsTUFDTTFzQixFQUFTLENBQUV2TCxFQUROLDBCQUFnQkEsRUFBRyxJQUFLLE1BQU8sU0FFcEMrdUIsRUFBUSxDQUFFalosT0FBTW1pQixZQUN0QixPQUFPLFNBQU84dEYsVUFBVSxNQUFLeDZHLEVBQVF3akIsTzs7Ozs0RENyRHpDLHFZQWtETyxNQUFNK0osRUFBUyxhQUFHLENBQUUrMkc7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTjNCLFNBQWlCN3ZJLEVBQUc4VixFQUFPLEdBQ3ZCLE1BQ012SyxFQUFTLENBQUV2TCxFQUROLDBCQUFnQkEsRUFBRyxJQUFLLFdBRTdCK3VCLEVBQVEsQ0FBRWpaLFFBQ2hCLE9BQU8sU0FBT2l3RyxVQUFVLFNBQVF4NkcsRUFBUXdqQixPOzs7OzREQ2hENUMscVlBa0RPLE1BQU1rSyxFQUFTLGFBQUcsQ0FBRTYyRzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFOM0IsU0FBaUI5dkksRUFBRzhWLEVBQU8sR0FDdkIsTUFDTXZLLEVBQVMsQ0FBRXZMLEVBRE4sMEJBQWdCQSxFQUFHLElBQUssV0FFN0IrdUIsRUFBUSxDQUFFalosUUFDaEIsT0FBTyxTQUFPaXdHLFVBQVUsU0FBUXg2RyxFQUFRd2pCLE87Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3hCckMsU0FBU3VQLEVBQVlwaUIsRUFBWWlpQixFQUFZRSxFQUFNMHhHLEdBQWUsR0FDckUsSUFBSTlnSCxFQUFXLEdBQ2YsR0FBSThnSCxFQUNBOWdILEVBQVdBLEVBQVMvdUIsT0FBT2krQixFQUFXai9CLE1BQU0sSUFDNUMrdkIsRUFBU3J4QixLQUFLc2UsRUFBVyxHQUFLbWlCLEdBQzlCcFAsRUFBV0EsRUFBUy91QixPQUFPZ2MsRUFBV2hkLE1BQU0sUUFFM0MsQ0FDRCt2QixFQUFXQSxFQUFTL3VCLE9BQU9nYyxFQUFXLElBQ3RDLE1BQU04ekgsRUFBZ0I3eEcsRUFBV3AvQixPQUNqQyxJQUFLLElBQUk5RCxFQUFJLEVBQUdBLEVBQUkrMEksSUFBaUIvMEksRUFDakNnMEIsRUFDSUEsRUFBUy91QixPQUFPLENBQUNnYyxFQUFXamhCLEVBQUksR0FBS2tqQyxFQUFXbGpDLEdBQUlrakMsRUFBV2xqQyxLQUV2RWcwQixFQUFXQSxFQUFTL3VCLE9BQU9nYyxFQUFXaGQsTUFBTTh3SSxFQUFnQixJQUVoRSxPQUFPL2dILEVBV0osU0FBU3VQLEVBQVl5eEcsRUFBY0MsRUFBZ0JILEdBQWUsR0FDckUsTUFBTXh4RyxFQUFXLEdBQ2pCLEdBQUl3eEcsRUFBYyxDQUNkeHhHLEVBQVMzZ0MsS0FBS3N5SSxHQUNkLElBQUssSUFBSWoxSSxFQUFJaTFJLEVBQWlCLEVBQUdqMUksRUFBSWcxSSxJQUFnQmgxSSxFQUM3Q0EsR0FBSyxFQUFJaTFJLEdBQ1QzeEcsRUFBUzNnQyxLQUFLM0MsR0FDZHNqQyxFQUFTM2dDLEtBQUszQyxHQUFLaTFJLEVBQWlCLEtBR3BDM3hHLEVBQVMzZ0MsS0FBSzNDLE9BSXJCLENBQ0QsTUFBTWsxSSxFQUFzQixHQUN0QkMsRUFBcUIsR0FDM0IsSUFBSyxJQUFJbjFJLEVBQUksRUFBR0EsRUFBSWcxSSxJQUFnQmgxSSxFQUM1QkEsR0FBc0IsRUFBakJpMUksRUFBcUIsR0FBS2oxSSxFQUFJLEdBQU0sRUFDekNtMUksRUFBbUJ4eUksS0FBSzNDLEdBR3hCazFJLEVBQW9CdnlJLEtBQUszQyxHQUdqQ3NqQyxFQUFTM2dDLFFBQVF1eUksR0FDakI1eEcsRUFBUzNnQyxLQUFLLEdBQ2QyZ0MsRUFBUzNnQyxRQUFRd3lJLEdBRXJCLE9BQU83eEcsRUFXSixTQUFTRyxFQUFvQnhpQixFQUFZaWlCLEVBQVlFLEVBQU0weEcsR0FBZSxHQUM3RSxNQUFNdHhHLEVBQW1CLEdBQ3JCc3hHLEVBQ0F0eEcsRUFBaUI3Z0MsS0FBS3NlLEVBQVcsR0FBS21pQixHQUd0Q0ksRUFBaUI3Z0MsS0FBS3NlLEVBQVcsR0FBS21pQixHQUUxQyxJQUFLLElBQUlwakMsRUFBSSxFQUFHQSxFQUFJaWhCLEVBQVduZCxTQUFVOUQsRUFDakNBLEdBQUtrakMsRUFBV3AvQixPQUNaZ3hJLEVBQ0F0eEcsRUFBaUI3Z0MsS0FBS3VnQyxFQUFXbGpDLEVBQUksR0FBS2loQixFQUFXamhCLElBR3JEd2pDLEVBQWlCN2dDLEtBQUtzZSxFQUFXamhCLEdBQUtrakMsRUFBV2xqQyxFQUFJLElBSXpEd2pDLEVBQWlCN2dDLEtBQUtzZSxFQUFXamhCLElBR3pDLE9BQU93akMsRUFNSixTQUFTRyxFQUFvQlIsRUFBT0QsR0FDdkMsTUFBTVEsRUFBbUIsQ0FBQyxHQUMxQixJQUFLLElBQUkxakMsRUFBSSxFQUFHQSxFQUFJa2pDLElBQWNsakMsRUFDOUIwakMsRUFBaUIvZ0MsS0FBS3dnQyxFQUFNbmpDLEdBQUcsSUFFbkMsT0FBTzBqQyxFQWFKLFNBQVNHLEVBQWF1eEcsRUFBZ0JqeUcsRUFBT0QsR0FDaEQsTUFBTVUsRUFBWXd4RyxFQUFlbnhJLE1BQU0sRUFBRyxHQUMxQyxJQUFLLElBQUlqRSxFQUFJLEVBQUdBLEVBQUlrakMsSUFBY2xqQyxFQUM5QjRqQyxFQUFVamhDLEtBQUt5eUksRUFBZXAxSSxFQUFJLEdBQUttakMsRUFBTW5qQyxHQUFHLEdBQUttakMsRUFBTW5qQyxHQUFHLElBRWxFLE9BQU80akMsRUE3SVgscVA7Ozs7MERDQUEsbVlBb0NPLE1BQU16RixFQUFPLGFBQUcsQ0FBRWszRzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFMekIsU0FBZXR3SSxHQUNYLE1BQ011TCxFQUFTLENBQUV2TCxFQUROLDBCQUFnQkEsRUFBRyxJQUFLLFNBRW5DLE9BQU8sU0FBTytsSCxVQUFVLE9BQU14NkcsTzs7OzsyRENsQ2xDLG9ZQXNDTyxNQUFNZ3VCLEVBQVEsYUFBRyxDQUFFZzNHOzs7Ozs7Ozs7Ozs7Ozs7OztBQUwxQixTQUFnQnZ3SSxHQUNaLE1BQ011TCxFQUFTLENBQUV2TCxFQUROLDBCQUFnQkEsRUFBRyxJQUFLLFVBRW5DLE9BQU8sU0FBTytsSCxVQUFVLFFBQU94NkcsTzs7OzswRENwQ25DLG1ZQXFDTyxNQUFNbXVCLEVBQU8sYUFBRyxDQUFFODJHOzs7Ozs7Ozs7Ozs7Ozs7OztBQUx6QixTQUFleHdJLEdBQ1gsTUFDTXVMLEVBQVMsQ0FBRXZMLEVBRE4sMEJBQWdCQSxFQUFHLElBQUssU0FFbkMsT0FBTyxTQUFPK2xILFVBQVUsT0FBTXg2RyxPOzs7OzJEQ25DbEMseWRBNENPLE1BQU11dUIsRUFBUSxhQUFHLENBQUUyMkc7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUDFCLFNBQWdCbmdJLEVBQUd5ZixHQUNmLElBQUl1L0csRUFBSywwQkFBZ0JoL0gsRUFBRyxJQUFLLFNBQzdCaS9ILEVBQUssMEJBQWdCeC9HLEVBQUcsSUFBSyxVQUNoQ3UvRyxFQUFJQyxHQUFNLHlCQUFlRCxFQUFJQyxHQUM5QixNQUFNaGtJLEVBQVMsQ0FBRStFLEVBQUdnL0gsRUFBSXYvRyxFQUFHdy9HLEdBQzNCLE9BQU8sU0FBT3hwQixVQUFVLFFBQU94NkcsTzs7OzsyREMxQ25DLG9ZQXNDTyxNQUFNMHVCLEVBQVEsYUFBRyxDQUFFeTJHOzs7Ozs7Ozs7Ozs7Ozs7OztBQUwxQixTQUFnQjF3SSxHQUNaLE1BQ011TCxFQUFTLENBQUV2TCxFQUROLDBCQUFnQkEsRUFBRyxJQUFLLFVBRW5DLE9BQU8sU0FBTytsSCxVQUFVLFFBQU94NkcsTzs7Ozs2RENwQ25DLDJyQkFzRU8sTUFBTTR1QixFQUFVLGFBQUcsQ0FBRXcyRzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUExQjVCLFNBQWtCM3dJLEVBQUdvNkIsRUFBWS9jLEVBQVNnZCxFQUFLQyxHQUMzQyxNQUFNdkIsRUFBSywwQkFBZ0IvNEIsRUFBRyxJQUFLLFVBQVcsV0FFOUMsU0FBWSxpQ0FBeUNxZCxFQURuQyxJQUN3RCxJQUN0RSx3RUFBZUEsd0JBQ25CLElBQUl1ekgsRUFBTTczRyxFQUNOODNHLEdBQWUsRUFDSCxJQUFaOTNHLEVBQUd4NUIsT0FDSHN4SSxHQUFlLEVBQ2ZELEVBQU0sa0JBQVE3M0csRUFBSSxDQUFDLEVBQUdBLEVBQUdsNkIsTUFBTSxHQUFJazZCLEVBQUdsNkIsTUFBTSxHQUFJazZCLEVBQUdsNkIsTUFBTSxNQUU3RCxTQUF5QixJQUFiK3hJLEVBQUlyeEksTUFBWSxJQUFNLG1EQUFtRHF4SSxFQUFJcnhJLFVBQ2xFLE1BQW5CKzZCLEdBQ0EsU0FBWSxRQUFXRCxJQUFNLElBQ3pCLHdFQUFtQkMsaUJBQStCRCxPQUUxRCxNQUFNOXVCLEVBQVMsQ0FBRXZMLEVBQUc0d0ksR0FDZDdoSCxFQUFRLENBQUVxTCxhQUFZL2MsVUFBU2dkLE1BQUtDLG1CQUUxQyxJQUFJdDBCLEVBQU0sU0FBTysvRyxVQUFVLFVBQVN4NkcsRUFBUXdqQixHQUU1QyxPQURBL29CLEVBQU0sZUFBS0EsRUFBSyt5QixFQUFHdjVCLE9BQ2ZxeEksRUFDTyxrQkFBUTdxSSxFQUFLLENBQUNBLEVBQUluSCxNQUFNLEdBQUltSCxFQUFJbkgsTUFBTSxHQUFJbUgsRUFBSW5ILE1BQU0sS0FFeERtSCxNOzs7OytEQ3BFWCx5bUJBb0ZPLE1BQU04cUksRUFBWSxhQUFHLENBQUVDOzs7Ozs7Ozs7Ozs7Ozs7OztBQXpCOUIsU0FBb0Ivd0ksRUFBR282QixFQUFZL2MsRUFBU2dkLEVBQUtDLEVBQWlCNWpCLEVBQWEsU0FDM0UsTUFBTXFpQixFQUFLLDBCQUFnQi80QixFQUFHLElBQUssWUFBYSxXQUNoRCxJQUFJZ3hJLEVBQU1qNEcsRUFDTms0RyxHQUFlLEVBQ0gsSUFBWmw0RyxFQUFHeDVCLE9BQ0gweEksR0FBZSxFQUNmRCxFQUFNLGtCQUFRajRHLEVBQUksQ0FBQyxFQUFHQSxFQUFHbDZCLE1BQU0sR0FBSWs2QixFQUFHbDZCLE1BQU0sR0FBSWs2QixFQUFHbDZCLE1BQU0sR0FBSWs2QixFQUFHbDZCLE1BQU0sTUFFMUUsU0FBeUIsSUFBYm15SSxFQUFJenhJLE1BQVksSUFBTSxxREFBcUR5eEksRUFBSXp4SSxVQUMzRixTQUEyQixVQUFmbVgsR0FBd0IsSUFDaEMsZ0ZBQXlCQSxNQUNOLE1BQW5CNGpCLEdBQ0EsU0FBWSxRQUFXRCxJQUFNLElBQ3pCLDBFQUFtQkMsaUJBQStCRCxPQUUxRCxNQUFNOXVCLEVBQVMsQ0FBRXZMLEVBQUdneEksR0FDZGppSCxFQUFRLENBQUVxTCxhQUFZL2MsVUFBU2dkLE1BQUtDLGtCQUFpQjVqQixjQUUzRCxJQUFJMVEsRUFBTSxTQUFPKy9HLFVBQVUsWUFBV3g2RyxFQUFRd2pCLEdBRTlDLE9BREEvb0IsRUFBTSxlQUFLQSxFQUFLZ3JJLEVBQUl4eEksT0FDaEJ5eEksRUFDTyxrQkFBUWpySSxFQUFLLENBQUNBLEVBQUluSCxNQUFNLEdBQUltSCxFQUFJbkgsTUFBTSxHQUFJbUgsRUFBSW5ILE1BQU0sR0FBSW1ILEVBQUluSCxNQUFNLEtBRXRFbUgsTTs7Ozt1T0NsRlg7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQk8sU0FBU2tySSxFQUFxQjNpSCxFQUFNaHZCLEdBQ3ZDLElBQUssSUFBSXRFLEVBQUksRUFBR0EsRUFBSXN6QixFQUFLeHZCLFNBQVU5RCxFQUMvQixHQUFJc3pCLEVBQUtBLEVBQUt4dkIsT0FBUzlELEVBQUksS0FBT3NFLEVBQU8sRUFBSXRFLEVBQ3pDLE9BQU8sRUFHZixPQUFPLEVBRUosU0FBU2sySSxFQUFpQkMsRUFBV0MsRUFBVzlpSCxHQUNuRCxNQUFNaHZCLEVBQU82eEksRUFBVXJ5SSxPQUFTc3lJLEVBQVV0eUksT0FDcEM4aEUsRUFBTSxHQUNaLElBQUlxVSxFQUFTLEVBQ1RvOEQsRUFBWSxFQUNoQixJQUFLLElBQUl2bkcsRUFBTSxFQUFHQSxFQUFNeHFDLEVBQU13cUMsS0FDQyxJQUF2QnhiLEVBQUtsWSxRQUFRMHpCLEdBQ2I4MkIsRUFBSWpqRSxLQUFLd3pJLEVBQVVsOEQsTUFHbkJyVSxFQUFJampFLEtBQUt5ekksRUFBVUMsTUFHM0IsT0FBT3p3RSxFQUVKLFNBQVNoeUMsRUFBMEI1YyxFQUFRc2MsR0FDOUMsTUFBTWp2QixFQUFXLEdBQ1hDLEVBQU8wUyxFQUFPbFQsT0FDcEIsSUFBSyxJQUFJZ3JDLEVBQU0sRUFBR0EsRUFBTXhxQyxFQUFNd3FDLEtBQ0MsSUFBdkJ4YixFQUFLbFksUUFBUTB6QixJQUNienFDLEVBQVMxQixLQUFLcVUsRUFBTzgzQixJQUk3QixNQUFPLENBQUN6cUMsRUFEWWl2QixFQUFLaHhCLEtBQUl3c0MsR0FBTzkzQixFQUFPODNCLE1BR3hDLFNBQVNyUixFQUFxQjc1QixFQUFPMHZCLEdBRXhDLE9BQU80aUgsRUFBaUJ0eUksRUFERDB2QixFQUFLaHhCLEtBQUl5QyxHQUFLLElBQ1V1dUIsR0FFNUMsU0FBU0MsRUFBMkJzdEYsRUFBS3Z0RixFQUFNaHZCLEdBQ2xELFNBQVkyeEksRUFBcUIzaUgsRUFBTWh2QixJQUFPLElBQU0sR0FBR3U4RyxxREFDdkN2dEYsY0FBaUJodkIsYUFPOUIsU0FBUzg0QixFQUFtQjlKLEVBQU1odkIsR0FDckMsR0FBSTJ4SSxFQUFxQjNpSCxFQUFNaHZCLEdBQzNCLE9BQU8sS0FFWCxNQUFNZ0gsRUFBUyxHQUNmLElBQUssSUFBSXRMLEVBQUksRUFBR0EsRUFBSXNFLElBQVF0RSxHQUNDLElBQXJCc3pCLEVBQUtsWSxRQUFRcGIsSUFDYnNMLEVBQU8zSSxLQUFLM0MsR0FJcEIsT0FEQXN6QixFQUFLN3dCLFNBQVFvWSxHQUFRdlAsRUFBTzNJLEtBQUtrWSxLQUMxQnZQLEVBR0osU0FBU2kvQixFQUF1QmpYLEdBQ25DLE9BQU9BLEVBQUtoeEIsS0FBSSxDQUFDdVksRUFBTTdhLElBQU0sQ0FBQ0EsRUFBRzZhLEtBQzVCNnRFLE1BQUssQ0FBQ3J6RSxFQUFHeWYsSUFBTXpmLEVBQUUsR0FBS3lmLEVBQUUsS0FDeEJ4eUIsS0FBSXlDLEdBQUtBLEVBQUUsS0FFYixTQUFTdzRCLEVBQWlCKzRHLEVBQVNoeUksR0FDdEMsTUFBTXlHLEVBQU0sR0FDWixJQUFLLElBQUkvSyxFQUFJc0UsRUFBT2d5SSxFQUFTdDJJLEVBQUlzRSxJQUFRdEUsRUFDckMrSyxFQUFJcEksS0FBSzNDLEdBRWIsT0FBTytLLEk7Ozs7bUVDNUZYLDh2QkErRE8sTUFBTXdySSxFQUFnQixhQUFHLENBQUVDOzs7Ozs7Ozs7Ozs7Ozs7OztBQXRCbEMsU0FBd0JDLEVBQVlDLEVBQVlDLEVBQVUxckksRUFBTTVLLEVBQUdteUIsR0FDL0QsTUFBTW9rSCxFQUFjLDBCQUFnQkgsRUFBWSxhQUFjLGlCQUN4REksRUFBYywwQkFBZ0JILEVBQVksYUFBYyxpQkFDeERJLEVBQVksMEJBQWdCSCxFQUFVLFdBQVksaUJBQ2xEN3hGLEVBQVEsMEJBQWdCNzVDLEVBQU0sT0FBUSxpQkFDdEM4ckksRUFBSywwQkFBZ0IxMkksRUFBRyxJQUFLLGlCQUM3QjIySSxFQUFLLDBCQUFnQnhrSCxFQUFHLElBQUssaUJBQzdCeWtILEVBQVcsaUJBQU8sQ0FBQ255RixFQUFPa3lGLEdBQUssR0FDL0JFLEVBQVcsaUJBQU9ELEVBQVVKLEdBQzVCOXJJLEVBQU0sY0FBSW1zSSxFQUFVSixHQUVwQnZ6SSxFQUFZd0gsRUFBSW5ILE1BQU0sR0FDdEJ1ekksRUFBWXBzSSxFQUFJbkgsTUFBTSxHQUFLLEVBQzNCZ2dDLEVBQVksQ0FBQ3JnQyxFQUFXNHpJLEdBQ3hCbjNJLEVBQUksZ0JBQU0rSyxFQUFLLENBQUMsRUFBRyxHQUFJNjRCLEdBQ3ZCbXNCLEVBQUksZ0JBQU1obEQsRUFBSyxDQUFDLEVBQUdvc0ksR0FBWXZ6RyxHQUMvQjcxQixFQUFJLGdCQUFNaEQsRUFBSyxDQUFDLEVBQWUsRUFBWm9zSSxHQUFnQnZ6RyxHQUNuQ25qQyxFQUFJLGdCQUFNc0ssRUFBSyxDQUFDLEVBQWUsRUFBWm9zSSxHQUFnQnZ6RyxHQUNuQ3d6RyxFQUFPLGNBQUksY0FBSSxrQkFBUXAzSSxHQUFJLGVBQUsrdkQsSUFBSyxjQUFJZ25GLEVBQUksa0JBQVEsY0FBSUgsRUFBYTdvSSxNQUU1RSxNQUFPLENBQUNxcEksRUFESyxjQUFJLGVBQUtBLEdBQU8sa0JBQVEzMkksUzs7OztvRUM1RHpDLG9kQWdGTyxNQUFNd2lDLEVBQWlCLGFBQUcsQ0FBRW8wRzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFYbkMsU0FBeUJ0eUksRUFBR20rQixFQUFZQyxHQUNwQyxNQUFNckYsRUFBSywwQkFBZ0IvNEIsRUFBRyxJQUFLLGtCQUM3QnErQixFQUFPRixFQUFXbk4sUUFBTyxDQUFDMWdCLEVBQUd5ZixJQUFNemYsRUFBSXlmLElBQzdDLFNBQVlnSixFQUFHeDVCLE1BQVEsRUFBSTQrQixFQUFXcC9CLFFBQVEsSUFBTSxpQkFBaUJnNkIsRUFBR3g1QiwrQ0FBK0M0K0IsRUFBV3AvQixXQUNsSSxTQUFZcS9CLEVBQU1yL0IsU0FBV28vQixFQUFXcC9CLFFBQVEsSUFBTSxtQkFBbUJxL0IsRUFBTXIvQixvREFBb0RvL0IsRUFBV3AvQixXQUM5SSxTQUFZZzZCLEVBQUdsNkIsTUFBTSxHQUFLdy9CLEdBQVMsR0FBRyxJQUFNLHlCQUF5QnRGLEVBQUdsNkIsTUFBTSx3RUFDNUNzL0IsRUFBV3JnQyxLQUFLLGNBQWN1Z0MsTUFDaEUsTUFBTTl5QixFQUFTLENBQUV2TCxFQUFHKzRCLEdBQ2RoSyxFQUFRLENBQUVvUCxhQUFZQyxTQUM1QixPQUFPLFNBQU8ybkYsVUFBVSxpQkFBZ0J4NkcsRUFBUXdqQixPOzs7OytEQzlFcEQsNm5CQW1GTyxNQUFNNE8sRUFBWSxhQUFHLENBQUU0MEc7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbEM5QixTQUFvQnZ5SSxFQUFHNDlCLEVBQU1DLEVBQVVDLEVBQVFDLEVBQU92c0IsR0FDM0IsTUFBbkJBLElBQ0FBLEVBQWtCLE1BRXRCLE1BQU11bkIsRUFBSywwQkFBZ0IvNEIsRUFBRyxJQUFLLGFBQzdCd3lJLEVBQVEsMEJBQWdCNTBHLEVBQU0sT0FBUSxhQUN0QzYwRyxFQUFZLDBCQUFnQjUwRyxFQUFVLFdBQVksYUFDeEQsSUFBSTYwRyxFQUlBQyxFQUhTLE1BQVQ1MEcsSUFDQTIwRyxFQUFTLDBCQUFnQjMwRyxFQUFPLFFBQVMsY0FHL0IsTUFBVkQsSUFDQTYwRyxFQUFVLDBCQUFnQjcwRyxFQUFRLFNBQVUsY0FFaEQsU0FBWTAwRyxFQUFNanpJLE9BQVNrekksRUFBVWx6SSxNQUFNLElBQU0saUZBRWpELFNBQXVCLE1BQVhvekksR0FBbUJILEVBQU1qekksT0FBU296SSxFQUFRcHpJLE1BQU0sSUFBTSwrRUFFbEUsU0FBc0IsTUFBVm16SSxHQUFrQkYsRUFBTWp6SSxPQUFTbXpJLEVBQU9uekksTUFBTSxJQUFNLDhFQUVoRSxNQUNNZ00sRUFBUyxDQUNYdkwsRUFGUSxnQkFBTSs0QixHQUdkZ0YsTUFBTzIwRyxFQUNQNTBHLE9BQVE2MEcsRUFDUi8wRyxLQUFNNDBHLEVBQ04zMEcsU0FBVTQwRyxHQUVSMWpILEVBQVEsQ0FBRXZkLG1CQUVWeEwsRUFBTSxTQUFPKy9HLFVBQVUsaUJBQWdCeDZHLEVBQVF3akIsR0FDckQsT0FBTyxrQkFBUS9vQixFQUFLK3lCLEVBQUdsNkIsVzs7OztpRUNqRjNCLG1ZQTJDTyxNQUFNK3pJLEVBQWMsYUFBRyxDQUFFQyxhQTVCaEMsU0FBc0I3eUksRUFBRzQ5QixFQUFNQyxFQUFVQyxFQUFRQyxFQUFPdnNCLEdBQ3BELE1BQU11bkIsRUFBSywwQkFBZ0IvNEIsRUFBRyxJQUFLLGFBQzdCd3lJLEVBQVEsMEJBQWdCNTBHLEVBQU0sT0FBUSxhQUN0QzYwRyxFQUFZLDBCQUFnQjUwRyxFQUFVLFdBQVksYUFDeEQsSUFBSTYwRyxFQUlBQyxFQWtCSixPQXJCYSxNQUFUNTBHLElBQ0EyMEcsRUFBUywwQkFBZ0IzMEcsRUFBTyxRQUFTLGNBRy9CLE1BQVZELElBQ0E2MEcsRUFBVSwwQkFBZ0I3MEcsRUFBUSxTQUFVLGNBRWhELFNBQXdCLElBQVovRSxFQUFHeDVCLE1BQVksSUFDdkIsdURBQUd3NUIsRUFBR3g1QixVQUNWLFNBQTJCLElBQWZpekksRUFBTWp6SSxNQUE2QixJQUFmaXpJLEVBQU1qekksTUFBWSxJQUM5QyxvRUFBWWl6SSxFQUFNanpJLFVBQ3RCLFNBQStCLElBQW5Ca3pJLEVBQVVsekksTUFBaUMsSUFBbkJrekksRUFBVWx6SSxNQUFZLElBQ3RELHdFQUFnQmt6SSxFQUFVbHpJLFVBQ2hCLE1BQVZtekksR0FDQSxTQUE0QixJQUFoQkEsRUFBT256SSxNQUE4QixJQUFoQm16SSxFQUFPbnpJLE1BQVksSUFDaEQscUVBQWdCbXpJLEVBQU9uekksVUFFaEIsTUFBWG96SSxHQUNBLFNBQTZCLElBQWpCQSxFQUFRcHpJLE1BQStCLElBQWpCb3pJLEVBQVFwekksTUFBWSxJQUNsRCxzRUFBZ0JvekksRUFBUXB6SSxVQUV6QixvQkFBVXc1QixFQUFJeTVHLEVBQU9DLEVBQVdFLEVBQVNELEVBQVFsaEksTzs7OztpRUN6QzVELG1ZQTJDTyxNQUFNc2hJLEVBQWMsYUFBRyxDQUFFQyxhQTVCaEMsU0FBc0IveUksRUFBRzQ5QixFQUFNQyxFQUFVQyxFQUFRQyxFQUFPdnNCLEdBQ3BELE1BQU11bkIsRUFBSywwQkFBZ0IvNEIsRUFBRyxJQUFLLGFBQzdCd3lJLEVBQVEsMEJBQWdCNTBHLEVBQU0sT0FBUSxhQUN0QzYwRyxFQUFZLDBCQUFnQjUwRyxFQUFVLFdBQVksYUFDeEQsSUFBSTYwRyxFQUlBQyxFQWtCSixPQXJCYSxNQUFUNTBHLElBQ0EyMEcsRUFBUywwQkFBZ0IzMEcsRUFBTyxRQUFTLGNBRy9CLE1BQVZELElBQ0E2MEcsRUFBVSwwQkFBZ0I3MEcsRUFBUSxTQUFVLGNBRWhELFNBQXdCLElBQVovRSxFQUFHeDVCLE1BQVksSUFDdkIsdURBQUd3NUIsRUFBR3g1QixVQUNWLFNBQTJCLElBQWZpekksRUFBTWp6SSxNQUE2QixJQUFmaXpJLEVBQU1qekksTUFBWSxJQUM5QyxvRUFBWWl6SSxFQUFNanpJLFVBQ3RCLFNBQStCLElBQW5Ca3pJLEVBQVVsekksTUFBaUMsSUFBbkJrekksRUFBVWx6SSxNQUFZLElBQ3RELHdFQUFnQmt6SSxFQUFVbHpJLFVBQ2hCLE1BQVZtekksR0FDQSxTQUE0QixJQUFoQkEsRUFBT256SSxNQUE4QixJQUFoQm16SSxFQUFPbnpJLE1BQVksSUFDaEQscUVBQWdCbXpJLEVBQU9uekksVUFFaEIsTUFBWG96SSxHQUNBLFNBQTZCLElBQWpCQSxFQUFRcHpJLE1BQStCLElBQWpCb3pJLEVBQVFwekksTUFBWSxJQUNsRCxzRUFBZ0JvekksRUFBUXB6SSxVQUV6QixvQkFBVXc1QixFQUFJeTVHLEVBQU9DLEVBQVdFLEVBQVNELEVBQVFsaEksTzs7OztpRUN6QzVELG1ZQTJDTyxNQUFNd2hJLEVBQWMsYUFBRyxDQUFFQyxhQTVCaEMsU0FBc0JqekksRUFBRzQ5QixFQUFNQyxFQUFVQyxFQUFRQyxFQUFPdnNCLEdBQ3BELE1BQU11bkIsRUFBSywwQkFBZ0IvNEIsRUFBRyxJQUFLLGFBQzdCd3lJLEVBQVEsMEJBQWdCNTBHLEVBQU0sT0FBUSxhQUN0QzYwRyxFQUFZLDBCQUFnQjUwRyxFQUFVLFdBQVksYUFDeEQsSUFBSTYwRyxFQUlBQyxFQWtCSixPQXJCYSxNQUFUNTBHLElBQ0EyMEcsRUFBUywwQkFBZ0IzMEcsRUFBTyxRQUFTLGNBRy9CLE1BQVZELElBQ0E2MEcsRUFBVSwwQkFBZ0I3MEcsRUFBUSxTQUFVLGNBRWhELFNBQXdCLElBQVovRSxFQUFHeDVCLE1BQVksSUFDdkIsdURBQUd3NUIsRUFBR3g1QixVQUNWLFNBQTJCLElBQWZpekksRUFBTWp6SSxNQUE2QixJQUFmaXpJLEVBQU1qekksTUFBWSxJQUM5QyxvRUFBWWl6SSxFQUFNanpJLFVBQ3RCLFNBQStCLElBQW5Ca3pJLEVBQVVsekksTUFBaUMsSUFBbkJrekksRUFBVWx6SSxNQUFZLElBQ3RELHdFQUFnQmt6SSxFQUFVbHpJLFVBQ2hCLE1BQVZtekksR0FDQSxTQUE0QixJQUFoQkEsRUFBT256SSxNQUE4QixJQUFoQm16SSxFQUFPbnpJLE1BQVksSUFDaEQscUVBQWdCbXpJLEVBQU9uekksVUFFaEIsTUFBWG96SSxHQUNBLFNBQTZCLElBQWpCQSxFQUFRcHpJLE1BQStCLElBQWpCb3pJLEVBQVFwekksTUFBWSxJQUNsRCxzRUFBZ0JvekksRUFBUXB6SSxVQUV6QixvQkFBVXc1QixFQUFJeTVHLEVBQU9DLEVBQVdFLEVBQVNELEVBQVFsaEksTzs7OzsyREN6QzVELGlJQUNPLFNBQVMwaEksRUFBTWx6SSxHQUNsQixJQUFJNHdJLEVBYUosT0FYSUEsRUFEVyxJQUFYNXdJLEVBQUVULE1BQXlCLElBQVhTLEVBQUVULEtBQ1osa0JBQVFTLEVBQUcsQ0FBQyxFQUFHLEVBQUcsRUFBR0EsRUFBRTZILE9BRWIsSUFBWDdILEVBQUVULEtBQ0Qsa0JBQVFTLEVBQUcsQ0FBQyxFQUFHLEVBQUdBLEVBQUVuQixNQUFNLEdBQUltQixFQUFFbkIsTUFBTSxLQUU1QixJQUFYbUIsRUFBRVQsS0FDRCxrQkFBUVMsRUFBRyxDQUFDLEVBQUdBLEVBQUVuQixNQUFNLEdBQUltQixFQUFFbkIsTUFBTSxHQUFJbUIsRUFBRW5CLE1BQU0sS0FHL0NtQixFQUVINHdJLEk7Ozs7OERDZlgsOGNBbURPLE1BQU10eEcsRUFBVyxhQUFHLENBQUU2ekc7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBYjdCLFNBQW1CbnpJLEVBQUd1L0IsRUFBUzEzQixHQUMzQixNQUFNa3hCLEVBQUssMEJBQWdCLzRCLEVBQUcsSUFBSyxZQUM3Qm96SSxFQUFXLDBCQUFnQjd6RyxFQUFTLFVBQVcsWUFDckQsU0FBeUIsVUFBYnhHLEVBQUd2NUIsT0FBbUIsSUFDOUIseURBQWdDdTVCLEVBQUd2NUIsVUFDdkMsU0FBWXFJLEdBQVEsR0FBRyxJQUFNLHNDQUFzQ0EsT0FDbkUsU0FBWXVySSxFQUFTdnJJLE9BQVNreEIsRUFBR2x4QixNQUEwQixJQUFsQnVySSxFQUFTdnJJLE1BQVksSUFDMUQsZ0dBQWtDa3hCLEVBQUdsNkIseUJBQ2xDdTBJLEVBQVN2MEksV0FDaEIsTUFBTTBNLEVBQVMsQ0FBRXZMLEVBQUcrNEIsRUFBSXdHLFFBQVM2ekcsR0FDM0Jya0gsRUFBUSxDQUFFbG5CLFFBQ2hCLE9BQU8sU0FBT2srRyxVQUFVLFdBQVV4NkcsRUFBUXdqQixPOzs7O3NFQ2pEOUMsc2lCQXdFTyxNQUFNc2tIOzs7Ozs7Ozs7Ozs7Ozs7OztBQWhDYmhpRCxlQUFpQ3hzQixFQUFRdVMsRUFBTXRoRSxHQUMzQyxNQUFNdzlILEVBQVUsMEJBQWdCenVFLEVBQVEsU0FBVSxZQUM1QzB1RSxFQUFRLDBCQUFnQm44RCxFQUFNLE9BQVEsV0FBWSxRQUNsRG84RCxFQUFtQixNQUFSMTlILEVBQWUsRUFBSUEsRUFDOUIyOUgsRUFBVUYsRUFBTWgwSSxLQUNoQm0wSSxFQUFjSixFQUFRejBJLE1BQzVCLFNBQVk0MEksRUFBVSxHQUFHLElBQU0sMEJBQy9CLG9CQUF1QkMsRUFBWXgwSSxNQUFNczBJLEVBQVVBLEVBQVdDLEdBQVVGLEVBQU0xMEksTUFBTyxxRUFDckYsSUFBSTgwSSxFQUFjLEVBQ2xCLElBQUssSUFBSTE0SSxFQUFJdTRJLEVBQVV2NEksRUFBSXU0SSxFQUFXQyxFQUFTeDRJLElBQzNDMDRJLEdBQWVELEVBQVl6NEksR0FFL0IsTUFBTTI0SSxFQUFvQkYsRUFBWXgwSSxNQUFNLEVBQUdzMEksR0FDMUN0ekksT0FBTyxDQUFDeXpJLEdBQWNELEVBQVl4MEksTUFBTXMwSSxFQUFXQyxJQUNsREksRUFBaUIsa0JBQVFQLEVBQVNNLEdBQ2xDRSxFQUFlLGtCQUFRUCxFQUFPLEVBQUUsSUFDaENRLFFBQTBCLHFCQUFXRCxHQUNyQ2puRyxFQUFVLGtCQUFRa25HLEVBQW1CLENBQUMsSUFDdEMvdEksRUFBTSxpQkFBTzZ0SSxFQUFnQmhuRyxFQUFTMm1HLEdBWTVDLE9BVkkzdUUsSUFBV3l1RSxHQUNYQSxFQUFRdGtJLFVBRVJvb0UsSUFBU204RCxHQUNUQSxFQUFNdmtJLFVBRVY2OUIsRUFBUTc5QixVQUNSNmtJLEVBQWU3a0ksVUFDZjhrSSxFQUFhOWtJLFVBQ2Ira0ksRUFBa0Iva0ksVUFDWGhKLEk7Ozs7aUVDdEVYLHNpQkF1RU8sTUFBTWd1SSxFQUFjLGFBQUcsQ0FBRUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbkNoQyxTQUFzQmowSSxFQUFHbkIsR0FDckIsSUFBSTZNLEVBQVEsMEJBQWdCMUwsRUFBRyxjQUFlLEtBQzlDLE1BQU1tUixFQUFTekYsRUFBTTdNLE1BQ3JCLEdBQUlBLEVBQU1vakQsTUFBSzFtRCxLQUFPQSxFQUFJLElBQU1BLEVBQUksR0FBTSxJQUN0QyxNQUFNLElBQUlxSSxNQUFNLDJDQUEyQy9FLE9BRS9ELEdBQUlBLEVBQU1FLE9BQVMyTSxFQUFNbk0sS0FDckIsTUFBTSxJQUFJcUUsTUFBTSwrQkFBK0IvRSxFQUFNRSx1QkFBdUIyTSxFQUFNbk0sU0FFdEYsR0FBSVYsRUFBTUUsT0FBUzJNLEVBQU1uTSxLQUFNLENBQzNCLE1BQU1rNUIsRUFBVy9zQixFQUFNN00sTUFBTUssUUFDN0IsS0FBT3U1QixFQUFTMTVCLE9BQVNGLEVBQU1FLFFBQzNCMDVCLEVBQVNpdkUsUUFBUSxHQUVyQmg4RixFQUFRLGtCQUFRQSxFQUFPK3NCLEdBRTNCLE1BQU12YyxFQUFheFEsRUFBTTdNLE1BQ25CMmxELEVBQU8vdUMsTUFBTWdxQyxLQUFLNWdELEdBQ3hCLElBQUssSUFBSTVELEVBQUk0RCxFQUFNRSxPQUFTLEVBQUc5RCxHQUFLLEVBQUdBLElBQ25DLEdBQUlpaEIsRUFBV2poQixLQUFPNEQsRUFBTTVELEdBQ3hCdXBELEVBQUt2cEQsR0FBSyxPQUVULEdBQXVCLElBQW5CeVEsRUFBTTdNLE1BQU01RCxHQUNqQixNQUFNLElBQUkySSxNQUFNLG1CQUFtQnVOLDhCQUFtQ3RTLE9BSTlFLEdBQW9CLElBRFAybEQsRUFBS2puRCxLQUFJLENBQUNiLEVBQUd6QixJQUFNeUIsRUFBSSxFQUFJekIsR0FBSyxJQUFHdU8sUUFBT3ZPLEdBQUtBLEdBQUssSUFDeEQ4RCxPQUNMLE9BQU8sZ0JBQU0yTSxHQUdqQixNQUFNSCxFQUFTLENBQUV2TCxFQUFHMEwsR0FDZHFqQixFQUFRLENBQUV5MUIsUUFDaEIsT0FBTyxTQUFPdWhFLFVBQVUsT0FBTXg2RyxFQUFRd2pCLE87Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzVDbkMsU0FBUzlFLEVBQWlCdHBCLEVBQVNyQixHQUN0QyxNQUFNcXhELEVBQVNod0QsRUFBUTVCLE9BQ2pCdTdDLEVBQU8sR0FDYixJQUFLLElBQUlyL0MsRUFBSSxFQUFHQSxFQUFJMDFELEVBQVExMUQsSUFBSyxDQUM3QixNQUFNOHVDLEVBQU00bUIsRUFBUyxFQUFJMTFELEVBQ25CcVYsRUFBSTNQLEVBQVFvcEMsSUFBUSxHQUNoQnpxQyxFQUFTQSxFQUFTUCxPQUFTLEVBQUk5RCxJQUFNLEdBQ3ZDLEdBQVcsSUFBTnFWLEdBQ1RncUMsRUFBS290RCxRQUFRMzlELEdBR3JCLE9BQU91USxFQU1KLFNBQVM0NUYsRUFBaUJ2ekksRUFBU3JCLEdBQ3RDLE1BQU1pSCxFQUFTLEdBQ2YsSUFBSyxJQUFJdEwsRUFBSSxFQUFHQSxFQUFJcUUsRUFBU1AsT0FBUTlELElBQUssQ0FDdEMsTUFBTWs1SSxFQUFReHpJLEVBQVFBLEVBQVE1QixPQUFTOUQsRUFBSSxHQUNyQ201SSxFQUFVOTBJLEVBQVNQLE9BQVM5RCxFQUFJLEVBQ2hDbzVJLEVBQVMvMEksRUFBUzgwSSxJQUNYLE1BQVRELEdBQTRCLElBQVZBLEdBQWVFLEVBQVMsSUFDMUM5dEksRUFBT21oRyxRQUFRMHNDLEdBR3ZCLE9BQU83dEksRUFFSixTQUFTa0wsRUFBMkIyVixFQUFRQyxHQUMvQyxNQUFNOWdCLEVBQVMsR0FDVHJMLEVBQUlrRSxLQUFLMDlCLElBQUkxVixFQUFPcm9CLE9BQVFzb0IsRUFBT3RvQixRQUN6QyxJQUFLLElBQUk5RCxFQUFJLEVBQUdBLEVBQUlDLEVBQUdELElBQUssQ0FDeEIsSUFBSXFWLEVBQUk4VyxFQUFPQSxFQUFPcm9CLE9BQVM5RCxFQUFJLEdBQzFCLE1BQUxxVixJQUNBQSxFQUFJLEdBRVIsSUFBSXlmLEVBQUkxSSxFQUFPQSxFQUFPdG9CLE9BQVM5RCxFQUFJLEdBSW5DLEdBSFMsTUFBTDgwQixJQUNBQSxFQUFJLEdBRUUsSUFBTnpmLEVBQ0EvSixFQUFPbWhHLFFBQVEzM0UsUUFFZCxHQUFVLElBQU5BLEVBQ0x4cEIsRUFBT21oRyxRQUFRcDNGLE9BRWQsSUFBSUEsSUFBTXlmLEVBQUcsQ0FHZCxNQUFNbnNCLE1BREYsd0RBQUd3akIsU0FBY0MsTUFJckI5Z0IsRUFBT21oRyxRQUFRcDNGLElBR3ZCLE9BQU8vSixFQWpGWCxxSzs7OzsyRkNBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF5QkEsSUFBSTBsQyxFQTBCSixTQUFTcW9HLEVBQVlyMEgsRUFBUXlyQixFQUFjLEdBRXZDLEdBQUlBLEVBQWMsRUFDZCxNQUFNLElBQUk5bkMsTUFBTSxrRUFFcEIsR0FBYyxNQUFWcWMsRUFDQSxNQUFNLElBQUlyYyxNQUFNLDREQUVwQixJQUFJMndJLEdBQWMsRUFDZEMsR0FBYyxFQUNkN29HLEdBQVUsRUFDVkUsR0FBVSxFQUNWNG9HLEdBQWUsRUFDZkMsR0FBZ0IsRUFDcEIsR0FBSXowSCxFQUFPL1osZ0JBQWdCMEosV0FDdkIya0ksR0FBYyxPQUViLEdBQTJCLG9CQUFoQixXQUErQnQwSCxhQUFrQjAwSCxVQUM3REgsR0FBYyxPQUViLEdBQWtDLG9CQUF2QixrQkFDWnYwSCxhQUFrQjJyQixpQkFDbEJELEdBQVUsT0FFVCxHQUFrQyxvQkFBdkIsa0JBQ1oxckIsYUFBa0I2ckIsaUJBQ2xCRCxHQUFVLE9BR1QsR0FBeUIsTUFBckI1ckIsRUFBT2hNLFdBQ1p3Z0ksR0FBZSxNQUVkLE1BQTZCLG9CQUFsQixhQUFpQ3gwSCxhQUFrQjIwSCxhQUkvRCxNQUFNLElBQUloeEksTUFJTixxUEFBV3FjLEVBQU8vaUIsWUFBWTFCLFFBUGxDazVJLEdBQWdCLEVBU3BCLEdBQUkvb0csRUFBUyxDQUNULE1BQU1rcEcsRUFBZ0MsRUFDdEMsR0FBSWxwRyxHQUNBMXJCLEVBQU82MEgsV0FDSEQsRUFDSixNQUFNLElBQUlqeEksTUFBTSx5R0FPeEIsR0FBYyxNQURDLG9CQUFVLGFBQVksU0FBT2t6QixhQUN4QixDQUNoQixNQUFNdnJCLEVBQVMsQ0FBRTBVLFVBQ1g4TyxFQUFRLENBQUUyYyxlQUNoQixPQUFPLFNBQU9xNkUsVUFBVSxhQUFZeDZHLEVBQVF3akIsR0FFaEQsTUFBT3pxQixFQUFPRCxHQUFVc25DLEVBQ3BCLENBQ0kxckIsRUFBTzhyQixXQUNQOXJCLEVBQU8rckIsYUFFWCxDQUFDL3JCLEVBQU8zYixNQUFPMmIsRUFBTzViLFFBQzFCLElBQUkrQyxFQWtCQXZDLEVBQ0osR0FsQkk0dkksRUFDQXJ0SSxFQUVJNlksRUFBT2hNLFdBQVcsTUFBTThnSSxhQUFhLEVBQUcsRUFBR3p3SSxFQUFPRCxHQUFRNkIsS0FFekRzdUksR0FBZUQsRUFDcEJudEksRUFBTzZZLEVBQU8vWixNQUVUMmxDLEdBQVdGLEdBQVcrb0csS0FDQSxNQUF2QnpvRyxJQUNBQSxFQUFzQnQ0QixTQUFTQyxjQUFjLFVBQVVLLFdBQVcsT0FFdEVnNEIsRUFBb0Jsb0MsT0FBT08sTUFBUUEsRUFDbkMybkMsRUFBb0Jsb0MsT0FBT00sT0FBU0EsRUFDcEM0bkMsRUFBb0JDLFVBQVVqc0IsRUFBUSxFQUFHLEVBQUczYixFQUFPRCxHQUNuRCtDLEVBQU82a0MsRUFBb0I4b0csYUFBYSxFQUFHLEVBQUd6d0ksRUFBT0QsR0FBUTZCLE1BRzdDLElBQWhCd2xDLEVBQ0E3bUMsRUFBUyxJQUFJMEwsV0FBV25KLE9BRXZCLENBQ0QsTUFBTTR0SSxFQUFZMXdJLEVBQVFELEVBQzFCUSxFQUFTLElBQUkwTCxXQUFXeWtJLEVBQVl0cEcsR0FDcEMsSUFBSyxJQUFJendDLEVBQUksRUFBR0EsRUFBSSs1SSxFQUFXLzVJLElBQzNCLElBQUssSUFBSThhLEVBQVUsRUFBR0EsRUFBVTIxQixJQUFlMzFCLEVBQzNDbFIsRUFBTzVKLEVBQUl5d0MsRUFBYzMxQixHQUFXM08sRUFBUyxFQUFKbk0sRUFBUThhLEdBSTdELE1BQU16VyxFQUFXLENBQUMrRSxFQUFRQyxFQUFPb25DLEdBQ2pDLE9BQU8sbUJBQVM3bUMsRUFBUXZGLEVBQVUsU0FldEMsU0FBUzIxSSxFQUEyQmgxSCxHQUNoQyxNQVJ5QixvQkFBWDFiLFFBQ2Usb0JBQWxCLGFBQ1BBLE9BQU96SCxlQUFlLHdCQU1nQm1qQixhQUFrQjIwSCxjQUpoRSxTQUEwQjMwSCxHQUN0QixPQUFpQixNQUFWQSxHQUFtQyxJQUFqQkEsRUFBTzNiLE9BQWlDLElBQWxCMmIsRUFBTzViLE9BSWxENndJLENBQWlCajFILEtBYnpCLFNBQXFCQSxHQUNqQixPQUFrQixNQUFWQSxHQUFvQkEsRUFBTy9aLGdCQUFnQjBKLFdBWWxCMmtJLENBQVl0MEgsR0E0QjFDb3hFLGVBQWU4akQsRUFBZ0JsMUgsRUFBUXlyQixFQUFjLEdBQ3hELElBQUluZ0MsRUFBUyxLQUdiLEdBQUksZ0JBQU01SCxRQUFRLHdCQUNkc3hJLEVBQTJCaDFILEdBQVMsQ0FHcEMsSUFBSW0xSCxFQUNKLElBS0lBLFFBQW9CQyxrQkFBa0JwMUgsRUFBUSxDQUFFcTFILGlCQUFrQixTQUV0RSxNQUFPejVGLEdBQ0h1NUYsRUFBYyxLQVVkN3BJLEVBRmUsTUFBZjZwSSxHQUF1QkEsRUFBWTl3SSxRQUFVMmIsRUFBTzNiLE9BQ3BEOHdJLEVBQVkvd0ksU0FBVzRiLEVBQU81YixPQUNyQit3SSxFQUdBbjFILE9BSWIxVSxFQUFTMFUsRUFFYixPQUFPcTBILEVBQVkvb0ksRUFBUW1nQyxHQXNCeEIybEQsZUFBZWtrRCxFQUFTQyxFQUFLenhJLEdBQ2hDLElBQUkweEksRUFBTywwQkFBZ0JELEVBQUssTUFBTyxZQUN2QyxLQUFNQSxhQUFlLFVBQVMsQ0FFMUIsTUFBTUUsRUFBb0JELEVBQzFCQSxFQUFPLGVBQUtDLEVBQW1CLFNBQy9CQSxFQUFrQjFtSSxVQUV0QixHQUFrQixJQUFkeW1JLEVBQUtsMkksTUFBNEIsSUFBZGsySSxFQUFLbDJJLEtBQ3hCLE1BQU0sSUFBSXFFLE1BQU0sd0RBQXdENnhJLEVBQUtsMkksU0FFakYsTUFBTzhFLEVBQVFDLEdBQVNteEksRUFBSzUySSxNQUFNSyxNQUFNLEVBQUcsR0FDdENpVSxFQUFzQixJQUFkc2lJLEVBQUtsMkksS0FBYSxFQUFJazJJLEVBQUs1MkksTUFBTSxHQUMvQyxHQUFJc1UsRUFBUSxHQUFlLElBQVZBLEVBQ2IsTUFBTSxJQUFJdlAsTUFDTiwwREFBcUJ1UCxLQUU3QixHQUFtQixZQUFmc2lJLEVBQUtqMkksT0FBc0MsVUFBZmkySSxFQUFLajJJLE1BQ2pDLE1BQU0sSUFBSW9FLE1BQU0sa0NBQWtDNnhJLEVBQUtqMkksK0NBRzNELE1BQU0wRyxRQUFhdXZJLEVBQUt2dkksT0FDbEJ5dkksRUFBNEIsWUFBZkYsRUFBS2oySSxNQUFzQixJQUFNLEVBQzlDeXBILEVBQVEsSUFBSTJzQixrQkFBa0J0eEksRUFBUUQsRUFBUyxHQUNyRCxJQUFLLElBQUlwSixFQUFJLEVBQUdBLEVBQUlvSixFQUFTQyxJQUFTckosRUFBRyxDQUNyQyxNQUFNNDZJLEVBQU8sQ0FBQyxFQUFHLEVBQUcsRUFBRyxLQUN2QixJQUFLLElBQUl0NkksRUFBSSxFQUFHQSxFQUFJNFgsRUFBTzVYLElBQUssQ0FDNUIsTUFBTVcsRUFBUWdLLEVBQUtqTCxFQUFJa1ksRUFBUTVYLEdBQy9CLEdBQW1CLFlBQWZrNkksRUFBS2oySSxPQUNMLEdBQUl0RCxFQUFRLEdBQUtBLEVBQVEsRUFDckIsTUFBTSxJQUFJMEgsTUFDTixtRkFBaUMxSCxXQUd4QyxHQUFtQixVQUFmdTVJLEVBQUtqMkksUUFDTnRELEVBQVEsR0FBS0EsRUFBUSxLQUNyQixNQUFNLElBQUkwSCxNQUNOLG1GQUFtQzFILE1BR2pDLElBQVZpWCxHQUNBMGlJLEVBQUssR0FBSzM1SSxFQUFReTVJLEVBQ2xCRSxFQUFLLEdBQUszNUksRUFBUXk1SSxFQUNsQkUsRUFBSyxHQUFLMzVJLEVBQVF5NUksR0FHbEJFLEVBQUt0NkksR0FBS1csRUFBUXk1SSxFQUcxQixNQUFNM3FGLEVBQVEsRUFBSi92RCxFQUNWZ3VILEVBQU1qK0QsRUFBSSxHQUFLNXJELEtBQUtvUixNQUFNcWxJLEVBQUssSUFDL0I1c0IsRUFBTWorRCxFQUFJLEdBQUs1ckQsS0FBS29SLE1BQU1xbEksRUFBSyxJQUMvQjVzQixFQUFNaitELEVBQUksR0FBSzVyRCxLQUFLb1IsTUFBTXFsSSxFQUFLLElBQy9CNXNCLEVBQU1qK0QsRUFBSSxHQUFLNXJELEtBQUtvUixNQUFNcWxJLEVBQUssSUFFbkMsR0FBYyxNQUFWOXhJLEVBQWdCLENBQ2hCQSxFQUFPTyxNQUFRQSxFQUNmUCxFQUFPTSxPQUFTQSxFQUNoQixNQUFNd3hHLEVBQU05eEcsRUFBT2tRLFdBQVcsTUFDeEI2aEksRUFBWSxJQUFJbkIsVUFBVTFyQixFQUFPM2tILEVBQU9ELEdBQzlDd3hHLEVBQUlrZ0MsYUFBYUQsRUFBVyxFQUFHLEdBS25DLE9BSElMLElBQVNELEdBQ1RDLEVBQUt6bUksVUFFRmk2RyxFQUVKLE1BQU0rc0IsRUFBYSxhQUFHLENBQUUxQixpQjs7Ozs0REM5VC9COzs7Ozs7Ozs7Ozs7Ozs7OztBQTRDTyxTQUFTanRJLEVBQU94SSxFQUFPVyxFQUFRLFVBQVdxRixHQUc3QyxPQUZBckYsRUFBUUEsR0FBUyxVQUNqQixxQ0FBd0NYLEdBQ2pDLElBQUksZUFBYUEsRUFBT1csRUFBT3FGLEs7Ozs7MERDL0MxQywwY0ErQ08sTUFBTSs2QixFQUFPLGFBQUcsQ0FBRXEyRzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFkekIsU0FBZWoySSxFQUFHUixHQUNkLE1BQU11NUIsRUFBSywwQkFBZ0IvNEIsRUFBRyxJQUFLLFFBRW5DLElBQUssZUFBa0JSLEdBQ25CLE1BQU0sSUFBSW9FLE1BQU0sbUNBQW1DcEUsS0FFdkQsR0FBYyxXQUFWQSxHQUFtQyxXQUFidTVCLEVBQUd2NUIsT0FDZixXQUFWQSxHQUFtQyxXQUFidTVCLEVBQUd2NUIsTUFDekIsTUFBTSxJQUFJb0UsTUFBTSx5Q0FFcEIsTUFBTTJILEVBQVMsQ0FBRXZMLEVBQUcrNEIsR0FDZGhLLEVBQVEsQ0FBRXZ2QixTQUNoQixPQUFPLFNBQU91bUgsVUFBVSxPQUFNeDZHLEVBQVF3akIsTzs7OzswREM3QzFDLG1ZQXFDTyxNQUFNMXZCLEVBQU8sYUFBRyxDQUFFNjJJOzs7Ozs7Ozs7Ozs7Ozs7OztBQUx6QixTQUFlbDJJLEdBQ1gsTUFDTXVMLEVBQVMsQ0FBRXZMLEVBRE4sMEJBQWdCQSxFQUFHLElBQUssU0FFbkMsT0FBTyxTQUFPK2xILFVBQVUsT0FBTXg2RyxPOzs7O2lFQ25DbEMsaWRBMkNPLE1BQU0rMEIsRUFBYyxhQUFHLENBQUU2MUc7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUmhDLFNBQXNCbjJJLEVBQUd1Z0MsRUFBY0MsR0FDbkMsTUFBTXpILEVBQUssMEJBQWdCLzRCLEVBQUcsSUFBSyxlQUNuQyxTQUFhdWdDLEdBQWdCQyxHQUFlLElBQU0sdUJBQXVCRCx5Q0FDdkNDLFFBQ2xDLE1BQU1qMUIsRUFBUyxDQUFFdkwsRUFBRys0QixHQUNkaEssRUFBUSxDQUFFd1IsZUFBY0MsZ0JBQzlCLE9BQU8sU0FBT3VsRixVQUFVLGNBQWF4NkcsRUFBUXdqQixPOzs7OzJEQ3pDakQsb1lBeUNPLE1BQU00eUYsRUFBUSxhQUFHLENBQUV5MEI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUDFCLFNBQWdCcDJJLEdBQ1osTUFDTXVMLEVBQVMsQ0FBRXZMLEVBRE4sMEJBQWdCQSxFQUFHLElBQUssUUFBUyxzQkFJNUMsT0FBTyxTQUFPK2xILFVBQVUsV0FBVXg2RyxPOzs7OzZEQ3ZDdEMsNmNBaURPLE1BQU1tMUIsRUFBVSxhQUFHLENBQUUyMUc7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUjVCLFNBQWtCM3ZJLEVBQU1FLEdBQ3BCLE1BQU1nbUYsRUFBUSwwQkFBZ0JsbUYsRUFBTSxPQUFRLFdBQ3RDbW1GLEVBQVEsMEJBQWdCam1GLEVBQU0sT0FBUSxXQUM1QyxvQkFBdUJnbUYsRUFBTS90RixNQUFPZ3VGLEVBQU1odUYsTUFBTyx5QkFBeUIrdEYsRUFBTS90RixhQUFhZ3VGLEVBQU1odUYsOENBRW5HLE1BQU0wTSxFQUFTLENBQUU3RSxLQUFNa21GLEVBQU9obUYsS0FBTWltRixHQUNwQyxPQUFPLFNBQU9rNUIsVUFBVSxVQUFTeDZHLE87Ozs7NERDL0NyQyx3aEJBZ0ZPLE1BQU1yTCxFQUFTLGFBQUcsQ0FBRW8ySTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFsQjNCLFNBQWlCNStHLEVBQVM1aEIsRUFBTyxHQUM3QixpQkFBTzRoQixFQUFRMzRCLFFBQVUsR0FBRyxJQUFNLHVDQUNsQyxNQUFNMHdJLEVBQVcsK0JBQXFCLzNHLEVBQVMsVUFBVyxTQUFVLHFCQVNwRSxHQVIwQixjQUF0QiszRyxFQUFTLEdBQUdqd0ksT0FDWml3SSxFQUFTL3hJLFNBQVFtbkUsSUFDYixHQUFxQixjQUFqQkEsRUFBT3JsRSxNQUNQLE1BQU0sSUFBSW9FLE1BQU0sNEVBQ1RpaEUsRUFBT3JsRSxjQUlGLElBQXBCaXdJLEVBQVMxd0ksT0FDVCxPQUFPLGdCQUFNMHdJLEVBQVMsSUFFMUIsTUFBTWxrSSxFQUFTa2tJLEVBQ1R2ekIsRUFBTyxDQUFFcG1HLFFBQ2YsT0FBTyxTQUFPaXdHLFVBQVUsU0FBUXg2RyxFQUFRMndHLE87Ozs7OERDOUU1QyxzTkFnQk8sTUFBTXE2QixFQUFXLGFBQUcsQ0FBRUMsVUFIN0IsU0FBbUI5K0csR0FDZixPQUFPLGlCQUFPQSxFQUFTLE87Ozs7OERDZDNCLHNOQWdDTyxNQUFNKytHLEVBQVcsYUFBRyxDQUFFQyxVQUg3QixTQUFtQmgvRyxFQUFTNWhCLEdBQ3hCLE9BQU8saUJBQU80aEIsRUFBUzVoQixPOzs7OzhEQzlCM0Isc05Bb0NPLE1BQU02Z0ksRUFBVyxhQUFHLENBQUVDLFVBSDdCLFNBQW1CbC9HLEVBQVM1aEIsR0FDeEIsT0FBTyxpQkFBTzRoQixFQUFTNWhCLE87Ozs7OERDbEMzQixzTkFhTyxNQUFNK2dJLEVBQVcsYUFBRyxDQUFFQyxVQUg3QixTQUFtQnAvRyxFQUFTNWhCLEdBQ3hCLE9BQU8saUJBQU80aEIsRUFBUzVoQixPOzs7OzZGQ1gzQjs7Ozs7Ozs7Ozs7Ozs7OztHQWlCTyxTQUFTeXJCLEVBQXVCbmtDLEVBQVEwWSxHQUMzQyxNQUFNdlcsRUFBT25DLEVBQU8sR0FBRzJCLE9BQ3ZCM0IsRUFBT00sU0FBUSxDQUFDbUIsRUFBTzVELEtBQ25CLFNBQVk0RCxFQUFNRSxTQUFXUSxHQUFNLElBQU0sa0JBQWtCQSx1QkFBMEJ0RSxnREFDckRzRSxVQUVwQyxTQUFZdVcsR0FBUSxHQUFLQSxFQUFPdlcsR0FBTSxJQUFNLGtCQUFrQkEsa0NBQXFDQSxFQUFPLE9BQzFHLE1BQU13M0ksRUFBYTM1SSxFQUFPLEdBQzFCQSxFQUFPTSxTQUFRLENBQUNtQixFQUFPNUQsS0FDbkIsSUFBSyxJQUFJYyxFQUFJLEVBQUdBLEVBQUl3RCxFQUFNeEQsSUFDdEIsU0FBYUEsSUFBTStaLEdBQVVqWCxFQUFNOUMsS0FBT2c3SSxFQUFXaDdJLElBQUssSUFBTSxrQkFBa0J3RCx3QkFBMkJ0RSxPQUFPNEQsNENBQ3ZFazRJLHNDQUNOOTdJLFVBSTVDLFNBQVNzYSxFQUFnQm5ZLEVBQVEwWSxHQUNwQyxNQUFNM1ksRUFBY0MsRUFBTyxHQUFHOEIsUUFDOUIsSUFBSyxJQUFJakUsRUFBSSxFQUFHQSxFQUFJbUMsRUFBTzJCLE9BQVE5RCxJQUMvQmtDLEVBQVkyWSxJQUFTMVksRUFBT25DLEdBQUc2YSxHQUVuQyxPQUFPM1ksSTs7Ozt1RkN0Q1g7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0RPLFNBQVM2NUksRUFBaUJDLEVBQVFDLEVBQWFDLEdBQ2xELE1BQU1DLEVBQVUsMEJBQWdCSCxFQUFRLFNBQVUsbUJBQzVDSSxFQUFlLDBCQUFnQkgsRUFBYSxjQUFlLG1CQUNqRSxTQUEwQixNQUFkQyxHQUFzQkEsRUFBYSxHQUFLLzNGLE9BQU9rNEYsVUFBVUgsSUFBYSxJQUM5RSwrREFBV0EsTUFDZixTQUE2QixJQUFqQkMsRUFBUTczSSxNQUFZLElBQU0sZ0RBQWdENjNJLEVBQVE3M0ksU0FDOUYsU0FBa0MsSUFBdEI4M0ksRUFBYTkzSSxNQUFZLElBQ2pDLHFEQUFXODNJLEVBQWE5M0ksU0FDNUIsU0FBWTYzSSxFQUFRdjRJLE1BQU0sS0FBT3c0SSxFQUFheDRJLE1BQU0sSUFBSSxJQUNwRCx1Q0FBR3U0SSxFQUFRdjRJLE1BQU0sVUFBVXc0SSxFQUFheDRJLE1BQU0sd0VBRWxELFNBQVlzNEksRUFBYSxHQUFLLzNGLE9BQU9rNEYsVUFBVUgsSUFBYSxJQUN4RCw0REFBR0EsTUFHUCxNQUFNSSxFQUFlLGlCQUFPLGVBQUtILEVBQVMsU0FBVUQsR0FDOUNLLEVBQW9CLGlCQUFPLGVBQUtILEVBQWMsU0FBVUYsR0FDeERNLEVBQWdCLG9CQUFVRixHQUMxQmg2RyxFQUFVLGlCQUFPazZHLEVBQWVELEdBQ3RDLE9BQU8sZUFBS2o2RyxFQUFTLFNBRWxCLE1BQU1tNkcsRUFBa0IsYUFBRyxDQUFFVixzQjs7Ozs0REN6RXBDLDRoQkFrRU8sTUFBTVcsRUFBUyxhQUFHLENBQUVDLFFBaEMzQixTQUFpQjUzSSxFQUFHd0osRUFBUW1zRCxFQUFRdDdCLEVBQUszakIsRUFBYSxNQUFPbWhJLEVBQVcsRUFBR3Y5RyxHQUN2RSxNQUFNdkIsRUFBSywwQkFBZ0IvNEIsRUFBRyxJQUFLLFVBQzdCOHpFLEVBQVUsMEJBQWdCdHFFLEVBQVEsU0FBVSxVQUNsRCxJQUFJc3VJLEVBQU0vK0csRUFDTmcvRyxHQUFlLEVBQ0gsSUFBWmgvRyxFQUFHeDVCLE9BQ0h3NEksR0FBZSxFQUNmRCxFQUFNLGtCQUFRLytHLEVBQUksQ0FBQyxFQUFHQSxFQUFHbDZCLE1BQU0sR0FBSWs2QixFQUFHbDZCLE1BQU0sTUFFaEQsU0FBeUIsSUFBYmk1SSxFQUFJdjRJLE1BQVksSUFBTSx1REFBdUR1NEksRUFBSXY0SSxVQUM3RixTQUE2QixJQUFqQnUwRSxFQUFRdjBFLE1BQVksSUFDNUIsd0RBQUd1MEUsRUFBUXYwRSxVQUNRLE1BQW5CKzZCLEdBQ0EsU0FBWSxRQUFXRCxJQUFNLElBQ3pCLHVFQUFtQkMsaUJBQStCRCxPQUUxRCxTQUFZeTlHLEVBQUlqNUksTUFBTSxLQUFPaTFFLEVBQVFqMUUsTUFBTSxJQUFJLElBQU0sb0NBQW9DaTVJLEVBQUlqNUksTUFBTSx5Q0FDckVpMUUsRUFBUWoxRSxNQUFNLFFBQzVDLFNBQVksaUNBQXlDODJELEVBQVFraUYsSUFBVyxJQUNwRSxvRUFBY2xpRixtQkFBd0JraUYsT0FDMUMsU0FBMkIsUUFBZm5oSSxHQUFzQixJQUFNLHNDQUFzQ0EsMkNBQzlFLE1BQU1zaEksRUFBVyxrQkFBUWxrRSxFQUFTLENBQUMsRUFBR0EsRUFBUWoxRSxNQUFNLEdBQUlpMUUsRUFBUWoxRSxNQUFNLEdBQUlpMUUsRUFBUWoxRSxNQUFNLEtBQ2xGbzVJLEVBQVUsa0JBQVFILEVBQUssQ0FBQ0EsRUFBSWo1SSxNQUFNLEdBQUksRUFBR2k1SSxFQUFJajVJLE1BQU0sR0FBSWk1SSxFQUFJajVJLE1BQU0sS0FDakV3ZSxFQUFVLENBQUMsRUFBR3M0QyxHQUNkdHpCLEVBQVksQ0FBQyxFQUFHdzFHLEdBRWhCN3hJLEVBQU0saUJBQU9peUksRUFBU0QsRUFBVTM2SCxFQUFTZ2QsRUFEdEIsT0FDNkNnSSxFQUFXL0gsR0FDakYsT0FBSXk5RyxFQUNPLGtCQUFRL3hJLEVBQUssQ0FBQ0EsRUFBSW5ILE1BQU0sR0FBSW1ILEVBQUluSCxNQUFNLEtBRTFDLGtCQUFRbUgsRUFBSyxDQUFDQSxFQUFJbkgsTUFBTSxHQUFJbUgsRUFBSW5ILE1BQU0sR0FBSW1ILEVBQUluSCxNQUFNLFM7Ozs7NERDaEUvRCxnbkJBcUZPLE1BQU11akMsRUFBUyxhQUFHLENBQUU4MUc7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBOUIzQixTQUFpQmw0SSxFQUFHd0osRUFBUTZULEVBQVNnZCxFQUFLM2pCLEVBQWEsT0FBUTJyQixFQUFZLENBQUMsRUFBRyxHQUFJL0gsR0FDL0UsTUFBTXZCLEVBQUssMEJBQWdCLzRCLEVBQUcsSUFBSyxVQUM3Qjh6RSxFQUFVLDBCQUFnQnRxRSxFQUFRLFNBQVUsVUFDbEQsSUFBSW9uSSxFQUFNNzNHLEVBQ044M0csR0FBZSxFQUNILElBQVo5M0csRUFBR3g1QixPQUNIc3hJLEdBQWUsRUFDZkQsRUFBTSxrQkFBUTczRyxFQUFJLENBQUMsRUFBR0EsRUFBR2w2QixNQUFNLEdBQUlrNkIsRUFBR2w2QixNQUFNLEdBQUlrNkIsRUFBR2w2QixNQUFNLE1BRTdELFNBQXlCLElBQWIreEksRUFBSXJ4SSxNQUFZLElBQU0sdURBQXVEcXhJLEVBQUlyeEksVUFDN0YsU0FBNkIsSUFBakJ1MEUsRUFBUXYwRSxNQUFZLElBQzVCLHdEQUFHdTBFLEVBQVF2MEUsVUFDUSxNQUFuQis2QixHQUNBLFNBQVksUUFBV0QsSUFBTSxJQUN6Qix1RUFBbUJDLGlCQUErQkQsT0FFMUQsTUFBTWxqQixFQUF5QixTQUFmVCxFQUF3Qms2SCxFQUFJL3hJLE1BQU0sR0FBSyt4SSxFQUFJL3hJLE1BQU0sR0FDakUsU0FBWXNZLElBQVkyOEQsRUFBUWoxRSxNQUFNLElBQUksSUFBTSxvQ0FBb0NzWSx3Q0FDdEQyOEQsRUFBUWoxRSxNQUFNLFFBQzVDLFNBQVksaUNBQXlDd2UsRUFBU2dsQixJQUFZLElBQ3RFLHVFQUFlaGxCLG9CQUEwQmdsQixPQUM3QyxNQUFNOTJCLEVBQVMsQ0FBRXZMLEVBQUc0d0ksRUFBS3BuSSxPQUFRc3FFLEdBQzNCL2tELEVBQVEsQ0FBRTFSLFVBQVNnZCxNQUFLM2pCLGFBQVkyckIsWUFBVy9ILG1CQUUvQ3QwQixFQUFNLFNBQU8rL0csVUFBVSxTQUFReDZHLEVBQVF3akIsR0FDN0MsT0FBSThoSCxFQUNPLGtCQUFRN3FJLEVBQUssQ0FBQ0EsRUFBSW5ILE1BQU0sR0FBSW1ILEVBQUluSCxNQUFNLEdBQUltSCxFQUFJbkgsTUFBTSxLQUV4RG1ILE07Ozs7MEVDbkZYLDZjQXVFTyxNQUFNMDhCLEVBQXVCLGFBQUcsQ0FBRXkxRzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE5QnpDLFNBQStCbjRJLEVBQUcrNkIsRUFBSXZrQixFQUFhNkcsRUFBU2dkLEVBQUszakIsRUFBYSxPQUFRNGpCLEdBQ2xGLElBQUlzMkcsRUFBTTV3SSxFQUNLLElBQVhBLEVBQUVULE9BQ0ZxeEksRUFBTSxrQkFBUTV3SSxFQUFHLENBQUMsRUFBR0EsRUFBRW5CLE1BQU0sR0FBSW1CLEVBQUVuQixNQUFNLEdBQUltQixFQUFFbkIsTUFBTSxNQUV6RCxJQUFJdTVJLEVBQU9yOUcsRUFDTyxJQUFkcTlHLEVBQUs3NEksT0FDTDY0SSxFQUFPLGtCQUFRcjlHLEVBQUksQ0FBQyxFQUFHQSxFQUFHbDhCLE1BQU0sR0FBSWs4QixFQUFHbDhCLE1BQU0sR0FBSWs4QixFQUFHbDhCLE1BQU0sTUFFOUQsU0FBeUIsSUFBYit4SSxFQUFJcnhJLE1BQVksSUFDeEIsaUVBQUdxeEksRUFBSS94SSxXQUNYLFNBQTBCLElBQWR1NUksRUFBSzc0SSxNQUFZLElBQ3pCLDhEQUFHNjRJLEVBQUt2NUksV0FDWixTQUFtQyxJQUF2QjJYLEVBQVl6WCxRQUFjLElBQ2xDLG1FQUFHeVgsT0FDUCxNQUFNVyxFQUF5QixTQUFmVCxFQUF3Qms2SCxFQUFJL3hJLE1BQU0sR0FBSyt4SSxFQUFJL3hJLE1BQU0sR0FDM0RzRCxFQUEwQixTQUFmdVUsRUFBd0IwaEksRUFBS3Y1SSxNQUFNLEdBQUt1NUksRUFBS3Y1SSxNQUFNLEdBQ3BFLFNBQVlzWSxJQUFZWCxFQUFZLElBQUksSUFBTSw0Q0FBNENXLHdDQUN0RFgsRUFBWSxRQUNoRCxTQUFZclUsSUFBYXFVLEVBQVksSUFBSSxJQUFNLDBDQUEwQ3JVLDBDQUNuRHFVLEVBQVksU0FDM0IsTUFBbkI4akIsR0FDQSxTQUFZLFFBQVdELElBQU0sSUFDekIsZ0ZBQW1CQyxpQkFBK0JELE9BRTFELE1BQU05dUIsRUFBUyxDQUFFdkwsRUFBRzR3SSxFQUFLNzFHLEdBQUlxOUcsR0FDdkJycEgsRUFBUSxDQUFFMVIsVUFBU2dkLE1BQUszakIsYUFBWTRqQixrQkFBaUI5akIsZUFFM0QsT0FBTyxTQUFPdXZHLFVBQVUsdUJBQXNCeDZHLEVBQVF3akIsTzs7Ozt5RUNyRTFELDRjQWlGTyxNQUFNNlQsRUFBc0IsYUFBRyxDQUFFeTFHOzs7Ozs7Ozs7Ozs7Ozs7OztBQXBDeEMsU0FBOEJsbkksRUFBUTRwQixFQUFJdnhCLEVBQVE2VCxFQUFTZ2QsRUFBSzNqQixFQUFhLE9BQVE0akIsR0FDakYsU0FBWW5wQixFQUFPcFMsU0FBV2c4QixFQUFHeDdCLE1BQU0sSUFDbkMsc0JBQUk0UixFQUFPcFMsMkJBQTJCZzhCLEVBQUd4N0IscUJBQzdDLElBQUkrNEksRUFBV25uSSxFQUNYaW5JLEVBQU9yOUcsRUFDUDgxRyxHQUFlLEVBQ0gsSUFBWjkxRyxFQUFHeDdCLE9BQ0hzeEksR0FBZSxFQUNmdUgsRUFBTyxrQkFBUXI5RyxFQUFJLENBQUMsRUFBR0EsRUFBR2w4QixNQUFNLEdBQUlrOEIsRUFBR2w4QixNQUFNLEdBQUlrOEIsRUFBR2w4QixNQUFNLEtBQzFEeTVJLEVBQVcsQ0FBQyxFQUFHbm5JLEVBQU8sR0FBSUEsRUFBTyxHQUFJQSxFQUFPLEtBRWhELFNBQWdDLElBQXBCbW5JLEVBQVN2NUksUUFBYyxJQUMvQixxRUFBR3U1SSxFQUFTdjVJLFlBQ2hCLFNBQTBCLElBQWRxNUksRUFBSzc0SSxNQUFZLElBQ3pCLDREQUFRNjRJLEVBQUs3NEksU0FDakIsU0FBNEIsSUFBaEJpSyxFQUFPakssTUFBWSxJQUMzQixnRUFBUWlLLEVBQU9qSyxTQUNuQixNQUFNNFgsRUFBeUIsU0FBZlQsRUFBd0I0aEksRUFBUyxHQUFLQSxFQUFTLEdBQ3pEbjJJLEVBQTBCLFNBQWZ1VSxFQUF3QjBoSSxFQUFLdjVJLE1BQU0sR0FBS3U1SSxFQUFLdjVJLE1BQU0sR0FDcEUsU0FBWXNZLElBQVkzTixFQUFPM0ssTUFBTSxJQUFJLElBQU0sNENBQTRDc1ksd0NBQ3ZEM04sRUFBTzNLLE1BQU0sUUFDakQsU0FBWXNELElBQWFxSCxFQUFPM0ssTUFBTSxJQUFJLElBQU0sNkNBQTZDc0QseUNBQ3hEcUgsRUFBTzNLLE1BQU0sUUFDM0IsTUFBbkJ5N0IsR0FDQSxTQUFZLFFBQVdELElBQU0sSUFDekIsK0VBQW1CQyxpQkFBK0JELE9BRTFELE1BQU05dUIsRUFBUyxDQUFFd3ZCLEdBQUlxOUcsRUFBTTV1SSxVQUNyQnVsQixFQUFRLENBQUUxUixVQUFTZ2QsTUFBSzNqQixhQUFZNGpCLGtCQUFpQnBlLFdBQVlvOEgsR0FFakV0eUksRUFBTSxTQUFPKy9HLFVBQVUsc0JBQXFCeDZHLEVBQVF3akIsR0FDMUQsT0FBSThoSCxFQUNPLGtCQUFRN3FJLEVBQUssQ0FBQ0EsRUFBSW5ILE1BQU0sR0FBSW1ILEVBQUluSCxNQUFNLEdBQUltSCxFQUFJbkgsTUFBTSxLQUV4RG1ILE07Ozs7cUVDL0VYLHdWQTRCTyxNQUFNdXlJLEVBQWtCLGFBQUcsQ0FBRUMsaUJBTHBDLFNBQTBCeDRJLEVBQUd3SixFQUFRck0sRUFBYWtnQixFQUFTZ2QsRUFBS0MsR0FDNUQsTUFBTXZCLEVBQUssMEJBQWdCLzRCLEVBQUcsSUFBSyxtQkFDN0I4ekUsRUFBVSwwQkFBZ0J0cUUsRUFBUSxTQUFVLG1CQUNsRCxPQUFPLDhCQUFvQnJNLEVBQWE0N0IsRUFBSSs2QyxFQUFTejJELEVBQVNnZCxFQUFLLE9BQVFDLE87Ozs7NERDMUIvRSxnbkJBaUZPLE1BQU1tK0csRUFBUyxhQUFHLENBQUVDOzs7Ozs7Ozs7Ozs7Ozs7OztBQTFCM0IsU0FBaUIxNEksRUFBR3dKLEVBQVE2VCxFQUFTZ2QsRUFBSzNqQixFQUFhLFFBQVMyckIsRUFBWSxDQUFDLEVBQUcsRUFBRyxJQUMvRSxNQUFNdEosRUFBSywwQkFBZ0IvNEIsRUFBRyxJQUFLLFVBQzdCOHpFLEVBQVUsMEJBQWdCdHFFLEVBQVEsU0FBVSxVQUNsRCxJQUFJd25JLEVBQU1qNEcsRUFDTms0RyxHQUFlLEVBQ0gsSUFBWmw0RyxFQUFHeDVCLE9BQ0gweEksR0FBZSxFQUNmRCxFQUFNLGtCQUFRajRHLEVBQUksQ0FBQyxFQUFHQSxFQUFHbDZCLE1BQU0sR0FBSWs2QixFQUFHbDZCLE1BQU0sR0FBSWs2QixFQUFHbDZCLE1BQU0sR0FBSWs2QixFQUFHbDZCLE1BQU0sTUFFMUUsU0FBeUIsSUFBYm15SSxFQUFJenhJLE1BQVksSUFBTSx1REFBdUR5eEksRUFBSXp4SSxVQUM3RixTQUE2QixJQUFqQnUwRSxFQUFRdjBFLE1BQVksSUFDNUIsd0RBQUd1MEUsRUFBUXYwRSxVQUNmLFNBQVl5eEksRUFBSW55SSxNQUFNLEtBQU9pMUUsRUFBUWoxRSxNQUFNLElBQUksSUFBTSxvQ0FBb0NteUksRUFBSW55SSxNQUFNLHlDQUNyRWkxRSxFQUFRajFFLE1BQU0sUUFDNUMsU0FBWSx5Q0FBK0J3ZSxFQUFTZ2xCLElBQVksSUFDNUQsdUVBQWVobEIsb0JBQTBCZ2xCLE9BQzdDLFNBQTJCLFVBQWYzckIsR0FBd0IsSUFBTSxzQ0FBc0NBLDZDQUNoRixNQUFNbkwsRUFBUyxDQUFFdkwsRUFBR2d4SSxFQUFLeG5JLE9BQVFzcUUsR0FDM0Iva0QsRUFBUSxDQUFFMVIsVUFBU2dkLE1BQUszakIsYUFBWTJyQixhQUVwQ3I4QixFQUFNLFNBQU8rL0csVUFBVSxTQUFReDZHLEVBQVF3akIsR0FDN0MsT0FBSWtpSCxFQUNPLGtCQUFRanJJLEVBQUssQ0FBQ0EsRUFBSW5ILE1BQU0sR0FBSW1ILEVBQUluSCxNQUFNLEdBQUltSCxFQUFJbkgsTUFBTSxHQUFJbUgsRUFBSW5ILE1BQU0sS0FFdEVtSCxNOzs7O3lFQy9FWCw0Y0F1RU8sTUFBTXMrQixFQUFzQixhQUFHLENBQUVxMEc7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaEN4QyxTQUE4QnhuSSxFQUFRNHBCLEVBQUl2eEIsRUFBUTZULEVBQVNnZCxHQUN2RCxTQUFZbHBCLEVBQU9wUyxTQUFXZzhCLEVBQUd4N0IsTUFBTSxJQUNuQyxzQkFBSTRSLEVBQU9wUywyQkFBMkJnOEIsRUFBR3g3QixxQkFDN0MsSUFBSXE1SSxFQUFXem5JLEVBQ1gwbkksRUFBTzk5RyxFQUNQazJHLEdBQWUsRUFDSCxJQUFabDJHLEVBQUd4N0IsT0FDSDB4SSxHQUFlLEVBQ2Y0SCxFQUFPLGtCQUFROTlHLEVBQUksQ0FBQyxFQUFHQSxFQUFHbDhCLE1BQU0sR0FBSWs4QixFQUFHbDhCLE1BQU0sR0FBSWs4QixFQUFHbDhCLE1BQU0sR0FBSWs4QixFQUFHbDhCLE1BQU0sS0FDdkUrNUksRUFBVyxDQUFDLEVBQUd6bkksRUFBTyxHQUFJQSxFQUFPLEdBQUlBLEVBQU8sR0FBSUEsRUFBTyxLQUUzRCxNQUFNZ0csRUFBVXloSSxFQUFTLEdBQ25CejJJLEVBQVcwMkksRUFBS2g2SSxNQUFNLEdBQzVCLFNBQWdDLElBQXBCKzVJLEVBQVM3NUksUUFBYyxJQUMvQixxRUFBRzY1SSxFQUFTNzVJLFlBQ2hCLFNBQTBCLElBQWQ4NUksRUFBS3Q1SSxNQUFZLElBQ3pCLDREQUFRczVJLEVBQUt0NUksU0FDakIsU0FBNEIsSUFBaEJpSyxFQUFPakssTUFBWSxJQUMzQixnRUFBUWlLLEVBQU9qSyxTQUNuQixTQUFZNFgsSUFBWTNOLEVBQU8zSyxNQUFNLElBQUksSUFBTSw0Q0FBNENzWSx3Q0FDdkQzTixFQUFPM0ssTUFBTSxRQUNqRCxTQUFZc0QsSUFBYXFILEVBQU8zSyxNQUFNLElBQUksSUFBTSw2Q0FBNkNzRCx5Q0FDeERxSCxFQUFPM0ssTUFBTSxRQUNsRCxNQUFNME0sRUFBUyxDQUFFd3ZCLEdBQUk4OUcsRUFBTXJ2SSxVQUNyQnVsQixFQUFRLENBQUVzTCxNQUFLaGQsVUFBU25CLFdBQVkwOEgsR0FFcEM1eUksRUFBTSxTQUFPKy9HLFVBQVUsd0JBQXVCeDZHLEVBQVF3akIsR0FDNUQsT0FBSWtpSCxFQUNPLGtCQUFRanJJLEVBQUssQ0FBQ0EsRUFBSW5ILE1BQU0sR0FBSW1ILEVBQUluSCxNQUFNLEdBQUltSCxFQUFJbkgsTUFBTSxHQUFJbUgsRUFBSW5ILE1BQU0sS0FFdEVtSCxNOzs7O3FFQ3JFWCx3VkEyQk8sTUFBTTh5SSxFQUFrQixhQUFHLENBQUVDLGlCQUxwQyxTQUEwQi80SSxFQUFHd0osRUFBUXJNLEVBQWFrZ0IsRUFBU2dkLEdBQ3ZELE1BQU10QixFQUFLLDBCQUFnQi80QixFQUFHLElBQUssbUJBQzdCOHpFLEVBQVUsMEJBQWdCdHFFLEVBQVEsU0FBVSxtQkFDbEQsT0FBTyw4QkFBb0JyTSxFQUFhNDdCLEVBQUkrNkMsRUFBU3oyRCxFQUFTZ2QsTzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDZTNELFNBQVNnTixFQUFzQm5yQixFQUFZMUYsRUFBYTZHLEVBQVNnZCxFQUFLM2pCLEVBQWEsT0FBUTJyQixHQVE5RixPQUFPRyxFQUFrQnRtQixFQUZKLElBQUkxRixFQURIMEYsRUFBVyxJQUdrQm1CLEVBQVNnbEIsRUFBV2hJLEVBQUssS0FBeUIsS0FEakZrSSxFQUF3QjdyQixJQUd6QyxTQUFTOGpCLEVBQWtCNzVCLEVBQVN5NUIsRUFBWS9jLEVBQVNnbEIsRUFBV2hJLEVBQUsyK0csRUFBY3RpSSxFQUFhLGdCQUN2RyxNQUFPOVYsRUFBY0MsR0FBZW80SSxFQUFnQjcrRyxHQUNwRCxJQUFJNWpCLEVBQ0osR0FBbUIsaUJBQWZFLEVBQ0FGLEVBQWMsQ0FBQzVWLEVBQWNDLEVBQWFGLEVBQVEsR0FBSUEsRUFBUSxRQUU3RCxJQUFtQixrQkFBZitWLEVBSUwsTUFBTSxJQUFJOVMsTUFBTSxzQkFBc0I4UyxLQUh0Q0YsRUFBYyxDQUFDNVYsRUFBY0MsRUFBYUYsRUFBUSxHQUFJQSxFQUFRLElBS2xFLE9BQU82aEMsRUFBa0I3aEMsRUFBUzZWLEVBQWE2RyxFQUFTZ2xCLEVBQVdoSSxFQUFLMitHLEdBQWMsRUFBT3RpSSxHQUsxRixTQUFTa2tCLEVBQWtCajZCLEVBQVN5NUIsRUFBWS9jLEVBQVNnbEIsRUFBV2hJLEVBQUsyK0csRUFBY3RpSSxFQUFhLFNBQ3ZHLE1BQU83VSxFQUFhakIsRUFBY0MsR0FBZXE0SSxFQUFpQjkrRyxHQUNsRSxJQUFJNWpCLEVBQ0E4ckIsRUFDSixHQUFtQixVQUFmNXJCLEVBQ0E0ckIsRUFBYyxlQUNkOXJCLEVBQ0ksQ0FBQzNVLEVBQWFqQixFQUFjQyxFQUFhRixFQUFRLEdBQUlBLEVBQVEsUUFFaEUsSUFBbUIsVUFBZitWLEVBTUwsTUFBTSxJQUFJOVMsTUFBTSxzQkFBc0I4UyxLQUx0QzRyQixFQUFjLGdCQUNkOXJCLEVBQ0ksQ0FBQzNVLEVBQWFqQixFQUFjQyxFQUFhRixFQUFRLEdBQUlBLEVBQVEsSUFLckUsT0FBT3VqQyxFQUFrQnZqQyxFQUFTNlYsRUFBYTZHLEVBQVNnbEIsRUFBV2hJLEdBQUssRUFBT2lJLEVBQWEwMkcsR0FNekYsU0FBU3gyRyxFQUFrQjdoQyxFQUFTNlYsRUFBYTZHLEVBQVNnbEIsRUFBV2hJLEVBQUsyK0csRUFBY0csR0FBWSxFQUFPemlJLEVBQWEsZ0JBQzNILElBQUtsWSxFQUFXbVksRUFBVUMsRUFBU1csR0FBYyxFQUFFLEdBQUksR0FBSSxHQUFJLEdBQy9ELEdBQW1CLGlCQUFmYixHQUNDbFksRUFBV21ZLEVBQVVDLEVBQVNXLEdBQWM1VyxNQUU1QyxJQUFtQixrQkFBZitWLEVBSUwsTUFBTSxJQUFJOVMsTUFBTSxzQkFBc0I4UyxNQUhyQ2xZLEVBQVcrWSxFQUFZWixFQUFVQyxHQUFXalcsRUFLakQsTUFBT0MsRUFBY0MsRUFBYSxDQUFFdTRJLEdBQWtCNWlJLEdBQy9DMVYsRUFBY0MsR0FBZWs0SSxFQUFnQjU3SCxJQUM3Q3JjLEVBQWdCQyxHQUFpQmc0SSxFQUFnQjUyRyxHQUNsRG5oQyxFQUF3Qm00SSxFQUF1Qno0SSxFQUFjSSxHQUM3REcsRUFBdUJrNEksRUFBdUJ4NEksRUFBYUksSUFDM0QsUUFBRUksRUFBTyxVQUFFSyxFQUFTLFNBQUVDLEdBa0poQyxTQUEwQjA0QixFQUFLMWpCLEVBQVVDLEVBQVM5VixFQUFjQyxFQUFhSCxFQUFjQyxFQUFhbTRJLEVBQWN0aUksR0FDbEgsSUFBSXJWLEVBQ0FLLEVBQ0FDLEVBQ0osR0FBbUIsaUJBQVIwNEIsRUFBa0IsQ0FFekJoNUIsRUFBVSxDQUFFQyxJQUFLKzRCLEVBQUtxM0MsT0FBUXIzQyxFQUFLNzRCLEtBQU02NEIsRUFBS2twRCxNQUFPbHBELEVBQUtsbEIsS0FEakMsSUFBUmtsQixFQUFhLFFBQVUsVUFFeEMsTUFBTS82QixFQTlEZCxTQUE4QnFCLEVBQVMyNEksRUFBVzNqRixFQUFRNGpGLEVBQVNQLEdBQ2hELE1BQVhPLElBQ0FBLEVBQVVDLEVBQWtCNzRJLEVBQVMyNEksRUFBVzNqRixJQUVwRCxNQUFNOGpGLEVBQVk5NEksRUFBUSxHQUNwQis0SSxFQUFZLzRJLEVBQVEsR0FDcEJ5L0UsRUFBYTV2RSxHQUFPaXBJLEVBQVlILEVBQVksRUFBSUMsR0FBVzVqRixFQUFTLEVBQUdxakYsR0FDdkVXLEVBQWFucEksR0FBT2twSSxFQUFZSixFQUFZLEVBQUlDLEdBQVc1akYsRUFBUyxFQUFHcWpGLEdBQzdFLE1BQU8sQ0FBQzU0RCxFQUFZdTVELEdBc0RDQyxDQUFxQixDQUFDampJLEVBQVVDLEdBQVVoVyxFQUFjRSxFQUFjdTVCLEVBQUsyK0csR0FDNUZ0M0ksRUFBWXBDLEVBQVMsR0FDckJxQyxFQUFXckMsRUFBUyxRQUVuQixHQUFZLFNBQVIrNkIsRUFBZ0IsQ0FDckIzNEIsRUFBWXRDLEtBQUtDLEtBQUtzWCxFQUFXN1YsR0FDakNhLEVBQVd2QyxLQUFLQyxLQUFLdVgsRUFBVTdWLEdBQy9CLE1BQU04NEksRUFBaUJ6NkksS0FBSzA5QixJQUFJLEdBQUlwN0IsRUFBWSxHQUFLWixFQUFlRixFQUFlK1YsR0FDN0VtakksRUFBZ0IxNkksS0FBSzA5QixJQUFJLEdBQUluN0IsRUFBVyxHQUFLWixFQUFjRixFQUFjK1YsR0FDekV0VixFQUFNbEMsS0FBSzJZLE1BQU04aEksRUFBaUIsR0FDbENub0UsRUFBU21vRSxFQUFpQnY0SSxFQUMxQkUsRUFBT3BDLEtBQUsyWSxNQUFNK2hJLEVBQWdCLEdBRXhDejRJLEVBQVUsQ0FBRUMsTUFBS293RSxTQUFRbHdFLE9BQU0raEYsTUFEakJ1MkQsRUFBZ0J0NEksRUFDUTJULEtBQU0sYUFFM0MsR0FBWSxVQUFSa2xCLEVBQ0xoNUIsRUFBVSxDQUFFQyxJQUFLLEVBQUdvd0UsT0FBUSxFQUFHbHdFLEtBQU0sRUFBRytoRixNQUFPLEVBQUdwdUUsS0FBTSxTQUN4RHpULEVBQVl0QyxLQUFLQyxNQUFNc1gsRUFBVy9WLEVBQWUsR0FBS0UsR0FDdERhLEVBQVd2QyxLQUFLQyxNQUFNdVgsRUFBVS9WLEVBQWMsR0FBS0UsT0FFbEQsSUFBbUIsaUJBQVJzNUIsRUFhWixNQUFNejJCLE1BQU0sOEJBQThCeTJCLEtBYlosQ0FDOUIsTUFBTS80QixFQUFxQixpQkFBZm9WLEVBQWdDMmpCLEVBQUksR0FBRyxHQUFLQSxFQUFJLEdBQUcsR0FDekRxM0MsRUFBd0IsaUJBQWZoN0QsRUFBZ0MyakIsRUFBSSxHQUFHLEdBQUtBLEVBQUksR0FBRyxHQUM1RDc0QixFQUFzQixpQkFBZmtWLEVBQWdDMmpCLEVBQUksR0FBRyxHQUFLQSxFQUFJLEdBQUcsR0FDMURrcEQsRUFBdUIsaUJBQWY3c0UsRUFBZ0MyakIsRUFBSSxHQUFHLEdBQUtBLEVBQUksR0FBRyxHQUlqRWg1QixFQUFVLENBQUVDLE1BQUtvd0UsU0FBUWx3RSxPQUFNK2hGLFFBQU9wdUUsS0FIYixJQUFSN1QsR0FBd0IsSUFBWG93RSxHQUF5QixJQUFUbHdFLEdBQXdCLElBQVYraEYsRUFDeEQsUUFDQSxZQUVKN2hGLEVBQVk4TyxHQUFPbUcsRUFBVy9WLEVBQWVVLEVBQU1vd0UsR0FBVTV3RSxFQUFlLEVBQUdrNEksR0FDL0VyM0ksRUFBVzZPLEdBQU9vRyxFQUFVL1YsRUFBY1csRUFBTytoRixHQUFTeGlGLEVBQWMsRUFBR2k0SSxJQUsvRSxNQUFPLENBQUUzM0ksVUFBU0ssWUFBV0MsWUE1TFlvNEksQ0FBaUIxL0csRUFBSzFqQixFQUFVQyxFQUFTOVYsRUFBY0MsRUFBYUcsRUFBdUJDLEVBQXNCNjNJLEVBQWN0aUksR0FDbEtPLEVBQWNraUksRUFBWUMsRUFBaUI3aEksRUFBYTZoSSxFQUM5RCxJQUFJOTVJLEVBT0osTUFObUIsa0JBQWZvWCxFQUNBcFgsRUFBVyxDQUFDZCxFQUFXeVksRUFBYXZWLEVBQVdDLEdBRTNCLGlCQUFmK1UsSUFDTHBYLEVBQVcsQ0FBQ2QsRUFBV2tELEVBQVdDLEVBQVVzVixJQUV6QyxDQUNIelksWUFDQWtZLGFBQ0FDLFdBQ0FDLFVBQ0FXLGFBQ0E3VixZQUNBQyxXQUNBc1YsY0FDQTVWLFVBQ0FQLGVBQ0FDLGNBQ0FILGVBQ0FDLGNBQ0FLLHdCQUNBQyx1QkFDQUgsaUJBQ0FDLGdCQUNBTixVQUNBckIsV0FDQWtYLGVBT0QsU0FBUzB0QixFQUFrQnZqQyxFQUFTNlYsRUFBYTZHLEVBQVNnbEIsRUFBV2hJLEVBQUs4K0csR0FBWSxFQUFPemlJLEVBQWEsZUFBZ0JzaUksR0FDN0gsSUFBS3g2SSxFQUFXMlksRUFBU1IsRUFBVUMsRUFBU1csR0FBYyxFQUFFLEdBQUksR0FBSSxHQUFJLEdBQUksR0FDNUUsR0FBbUIsaUJBQWZiLEdBQ0NsWSxFQUFXMlksRUFBU1IsRUFBVUMsRUFBU1csR0FBYzVXLE1BRXJELElBQW1CLGtCQUFmK1YsRUFJTCxNQUFNLElBQUk5UyxNQUFNLHNCQUFzQjhTLE1BSHJDbFksRUFBVytZLEVBQVlKLEVBQVNSLEVBQVVDLEdBQVdqVyxFQUsxRCxNQUFPa0IsRUFBYWpCLEVBQWNDLEVBQWEsQ0FBRXU0SSxHQUFrQjVpSSxHQUM1RDFVLEVBQWFoQixFQUFjQyxHQUFlbTRJLEVBQWlCNzdILElBQzNEdGIsRUFBZWYsRUFBZ0JDLEdBQWlCaTRJLEVBQWlCNzJHLEdBQ2xFcmdDLEVBQXVCcTNJLEVBQXVCeDNJLEVBQWFFLEdBQzNEYixFQUF3Qm00SSxFQUF1Qno0SSxFQUFjSSxHQUM3REcsRUFBdUJrNEksRUFBdUJ4NEksRUFBYUksSUFDM0QsUUFBRUksRUFBTyxTQUFFYyxFQUFRLFVBQUVULEVBQVMsU0FBRUMsR0F5STFDLFNBQTRCMDRCLEVBQUtsakIsRUFBU1IsRUFBVUMsRUFBUzlVLEVBQWFoQixFQUFjQyxFQUFhYyxFQUFhakIsRUFBY0MsRUFBYW00SSxHQUN6SSxJQUFJMzNJLEVBQ0FjLEVBQ0FULEVBQ0FDLEVBQ0osR0FBbUIsaUJBQVIwNEIsRUFBa0IsQ0FFekJoNUIsRUFBVSxDQUNOQyxJQUFLKzRCLEVBQ0xxM0MsT0FBUXIzQyxFQUNSNzRCLEtBQU02NEIsRUFDTmtwRCxNQUFPbHBELEVBQ1BuNEIsTUFBT200QixFQUNQMi9HLEtBQU0zL0csRUFDTmxsQixLQVJxQixJQUFSa2xCLEVBQWEsUUFBVSxVQVV4QyxNQUFNLzZCLEVBekdkLFNBQThCcUIsRUFBUzI0SSxFQUFXcmlJLEVBQWEwK0MsRUFBUTRqRixFQUFTUCxHQUM3RCxNQUFYTyxJQUNBQSxFQUFVQyxFQUFrQjc0SSxFQUFTMjRJLEVBQVczakYsSUFFcEQsTUFBTXZ2QixFQUFhemxDLEVBQVEsR0FDckI4NEksRUFBWTk0SSxFQUFRLEdBQ3BCKzRJLEVBQVkvNEksRUFBUSxHQUNwQnM1SSxFQUFlenBJLEdBQU80MUIsRUFBYWt6RyxFQUFZLEVBQUlDLEdBQVc1akYsRUFBUyxFQUFHcWpGLEdBQzFFNTRELEVBQWE1dkUsR0FBT2lwSSxFQUFZSCxFQUFZLEVBQUlDLEdBQVc1akYsRUFBUyxFQUFHcWpGLEdBQ3ZFVyxFQUFhbnBJLEdBQU9rcEksRUFBWUosRUFBWSxFQUFJQyxHQUFXNWpGLEVBQVMsRUFBR3FqRixHQUM3RSxNQUFPLENBQUNpQixFQUFjNzVELEVBQVl1NUQsRUFBWTFpSSxHQStGekJpakksQ0FBcUIsQ0FBQy9pSSxFQUFTUixFQUFVQyxFQUFTLEdBQUkvVSxFQUFhLEVBQUdDLEVBQWF1NEIsRUFBSzIrRyxHQUN6RzcySSxFQUFXN0MsRUFBUyxHQUNwQm9DLEVBQVlwQyxFQUFTLEdBQ3JCcUMsRUFBV3JDLEVBQVMsUUFFbkIsR0FBWSxTQUFSKzZCLEVBQWdCLENBQ3JCbDRCLEVBQVcvQyxLQUFLQyxLQUFLOFgsRUFBVXJWLEdBQy9CSixFQUFZdEMsS0FBS0MsS0FBS3NYLEVBQVc3VixHQUNqQ2EsRUFBV3ZDLEtBQUtDLEtBQUt1WCxFQUFVN1YsR0FDL0IsTUFBTW81SSxHQUFpQmg0SSxFQUFXLEdBQUtMLEVBQWNELEVBQWNzVixFQUM3RDBpSSxHQUFrQm40SSxFQUFZLEdBQUtaLEVBQWVGLEVBQWUrVixFQUNqRW1qSSxHQUFpQm40SSxFQUFXLEdBQUtaLEVBQWNGLEVBQWMrVixFQUM3RDFVLEVBQVE5QyxLQUFLMlksTUFBTW9pSSxFQUFnQixHQUNuQ0gsRUFBT0csRUFBZ0JqNEksRUFDdkJaLEVBQU1sQyxLQUFLMlksTUFBTThoSSxFQUFpQixHQUNsQ25vRSxFQUFTbW9FLEVBQWlCdjRJLEVBQzFCRSxFQUFPcEMsS0FBSzJZLE1BQU0raEksRUFBZ0IsR0FFeEN6NEksRUFBVSxDQUFFQyxNQUFLb3dFLFNBQVFsd0UsT0FBTStoRixNQURqQnUyRCxFQUFnQnQ0SSxFQUNRVSxRQUFPODNJLE9BQU03a0ksS0FBTSxZQUV4RCxJQUFZLFVBQVJrbEIsRUFlTCxNQUFNejJCLE1BQU0sOEJBQThCeTJCLEtBZDFDaDVCLEVBQVUsQ0FDTkMsSUFBSyxFQUNMb3dFLE9BQVEsRUFDUmx3RSxLQUFNLEVBQ04raEYsTUFBTyxFQUNQcmhGLE1BQU8sRUFDUDgzSSxLQUFNLEVBQ043a0ksS0FBTSxTQUVWaFQsRUFBVy9DLEtBQUtDLE1BQU04WCxFQUFVdFYsRUFBYyxHQUFLQyxHQUNuREosRUFBWXRDLEtBQUtDLE1BQU1zWCxFQUFXL1YsRUFBZSxHQUFLRSxHQUN0RGEsRUFBV3ZDLEtBQUtDLE1BQU11WCxFQUFVL1YsRUFBYyxHQUFLRSxHQUt2RCxNQUFPLENBQUVNLFVBQVNjLFdBQVVULFlBQVdDLFlBOUxZeTRJLENBQW1CLy9HLEVBQUtsakIsRUFBU1IsRUFBVUMsRUFBUzlVLEVBQWFoQixFQUFjQyxFQUFhaUIsRUFBc0JkLEVBQXVCQyxFQUFzQjYzSSxHQUM1TS9oSSxFQUFja2lJLEVBQVlDLEVBQWlCN2hJLEVBQWE2aEksRUFDOUQsSUFBSTk1SSxFQU9KLE1BTm1CLGtCQUFmb1gsRUFDQXBYLEVBQVcsQ0FBQ2QsRUFBV3lZLEVBQWE5VSxFQUFVVCxFQUFXQyxHQUVyQyxpQkFBZitVLElBQ0xwWCxFQUFXLENBQUNkLEVBQVcyRCxFQUFVVCxFQUFXQyxFQUFVc1YsSUFFbkQsQ0FDSHpZLFlBQ0FrWSxhQUNBUyxVQUNBUixXQUNBQyxVQUNBVyxhQUNBcFYsV0FDQVQsWUFDQUMsV0FDQXNWLGNBQ0E1VixVQUNBUyxjQUNBaEIsZUFDQUMsY0FDQWMsY0FDQWpCLGVBQ0FDLGNBQ0FtQix1QkFDQWQsd0JBQ0FDLHVCQUNBWSxnQkFDQWYsaUJBQ0FDLGdCQUNBTixVQUNBckIsV0FDQWtYLGVBeUJELFNBQVNnakksRUFBa0J0OUgsRUFBWW85SCxFQUFXM2pGLEVBQVFraUYsRUFBVyxHQUN4RSxNQUFNd0MsRUFBcUJoQixFQUF1QkMsRUFBV3pCLEdBQzdELE9BQU96NEksS0FBSzJZLE9BQU9tRSxFQUFXLElBQU15NUMsRUFBUyxHQUFLQSxFQUFTMGtGLEdBQXNCLEdBRXJGLFNBQVNwQixFQUFnQnFCLEdBQ3JCLE1BQXFCLGlCQUFWQSxFQUNBLENBQUNBLEVBQU9BLEVBQU9BLEdBRUwsSUFBakJBLEVBQU12N0ksT0FDQyxDQUFDdTdJLEVBQU0sR0FBSUEsRUFBTSxHQUFJLEdBRXpCQSxFQUVYLFNBQVNwQixFQUFpQm9CLEdBQ3RCLE1BQXdCLGlCQUFWQSxFQUFxQixDQUFDQSxFQUFPQSxFQUFPQSxHQUFTQSxFQWEvRCxTQUFTakIsRUFBdUJqL0csRUFBWXk5RyxHQUN4QyxPQUFJQSxHQUFZLEVBQ0x6OUcsRUFFSkEsR0FBY0EsRUFBYSxJQUFNeTlHLEVBQVcsR0EyR3ZELFNBQVNybkksRUFBTXRVLEVBQU84OEksR0FDbEIsSUFBS0EsRUFDRCxPQUFPNTVJLEtBQUt1ekUsTUFBTXoyRSxHQUV0QixPQUFRODhJLEdBQ0osSUFBSyxRQUVELE9BQU81NUksS0FBS29SLE1BQU10VSxHQUN0QixJQUFLLE9BRUQsT0FBT2tELEtBQUtDLEtBQUtuRCxHQUNyQixJQUFLLFFBQ0QsT0FBT2tELEtBQUsyWSxNQUFNN2IsR0FDdEIsUUFDSSxNQUFNLElBQUkwSCxNQUFNLHdCQUF3Qm8xSSxNQUc3QyxTQUFTdUIsRUFBa0JELEdBQzlCLE1BQU9FLEVBQU1DLEVBQU1DLEdBQVF6QixFQUFnQnFCLEdBQzNDLE9BQWdCLElBQVRFLEdBQXVCLElBQVRDLEdBQXVCLElBQVRDLEVBRWhDLFNBQVNuZ0gsRUFBK0JsZCxFQUFTZ2xCLEdBQ3BELE9BQU9rNEcsRUFBa0JsOUgsSUFBWWs5SCxFQUFrQmw0RyxHQVNwRCxTQUFTRSxFQUF3QjdyQixHQUNwQyxHQUFtQixTQUFmQSxFQUNBLE1BQU8sZUFFTixHQUFtQixTQUFmQSxFQUNMLE1BQU8sZ0JBR1AsTUFBTSxJQUFJOVMsTUFBTSxzQkFBc0I4UyxLQTVZOUMsaWU7Ozs7eURDQUEsa1lBcUNPLE1BQU0rdEIsRUFBTSxhQUFHLENBQUVrMkc7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTHhCLFNBQWMzNkksR0FDVixNQUNNdUwsRUFBUyxDQUFFdkwsRUFETiwwQkFBZ0JBLEVBQUcsSUFBSyxRQUVuQyxPQUFPLFNBQU8rbEgsVUFBVSxNQUFLeDZHLE87Ozs7MERDbkNqQyxtWUFxQ08sTUFBTW81QixFQUFPLGFBQUcsQ0FBRWkyRzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFMekIsU0FBZTU2SSxHQUNYLE1BQ011TCxFQUFTLENBQUV2TCxFQUROLDBCQUFnQkEsRUFBRyxJQUFLLFNBRW5DLE9BQU8sU0FBTytsSCxVQUFVLE9BQU14NkcsTzs7Ozs0RENuQ2xDLHFZQWlETyxNQUFNMjVCLEVBQVMsYUFBRyxDQUFFMjFHOzs7Ozs7Ozs7Ozs7Ozs7OztBQU4zQixTQUFpQjc2SSxFQUFHOFYsRUFBTyxFQUFHdUUsR0FBWSxFQUFPQyxHQUFVLEdBQ3ZELE1BQ00vTyxFQUFTLENBQUV2TCxFQUROLDBCQUFnQkEsRUFBRyxJQUFLLFdBRTdCK3VCLEVBQVEsQ0FBRWpaLE9BQU11RSxZQUFXQyxXQUNqQyxPQUFPLFNBQU95ckcsVUFBVSxTQUFReDZHLEVBQVF3akIsTzs7OzttRUMvQzVDLG1kQXVETyxNQUFNNFcsRUFBZ0IsYUFBRyxDQUFFbTFHOzs7Ozs7Ozs7Ozs7Ozs7OztBQWZsQyxTQUF3Qjk2SSxFQUFHdS9CLEVBQVMxM0IsRUFBTSs5QixHQUFlLEdBQ3JELE1BQU03TSxFQUFLLDBCQUFnQi80QixFQUFHLElBQUssaUJBQzdCb3pJLEVBQVcsMEJBQWdCN3pHLEVBQVMsVUFBVyxpQkFDckQsU0FBeUIsVUFBYnhHLEVBQUd2NUIsT0FBbUIsSUFDOUIsOERBQWdDdTVCLEVBQUd2NUIsVUFDdkMsU0FBWXU1QixFQUFHeDVCLE1BQVEsR0FBRyxJQUN0QixzRUFBUXc1QixFQUFHeDVCLFVBQ2YsU0FBWXNJLEdBQVEsR0FBRyxJQUFNLHNDQUFzQ0EsT0FDbkUsU0FBWXVySSxFQUFTdnJJLE9BQVNreEIsRUFBR2x4QixNQUEwQixJQUFsQnVySSxFQUFTdnJJLE1BQVksSUFDMUQsK0ZBQThCa3hCLEVBQUdsNkIseUJBQzlCdTBJLEVBQVN2MEksV0FDaEIsTUFBTTBNLEVBQVMsQ0FBRXZMLEVBQUcrNEIsRUFBSXdHLFFBQVM2ekcsR0FDM0Jya0gsRUFBUSxDQUFFbG5CLE9BQU0rOUIsZ0JBQ3RCLE9BQU8sU0FBT21nRixVQUFVLGdCQUFleDZHLEVBQVF3akIsTzs7OztrRUNyRG5ELGtkQTBFTyxNQUFNa1gsRUFBZSxhQUFHLENBQUU4MEc7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaEJqQyxTQUF1Qi82SSxFQUFHK2EsRUFBV3JFLEVBQWEsUUFDOUMsTUFBTXFpQixFQUFLLDBCQUFnQi80QixFQUFHLElBQUssZ0JBQzdCa21DLEVBQThCLFNBQWZ4dkIsRUFBeUJxaUIsRUFBR2w2QixNQUFNLEdBQUtrNkIsRUFBR2w2QixNQUFNLEdBQy9Ec25DLEVBQTZCLFNBQWZ6dkIsRUFBeUJxaUIsRUFBR2w2QixNQUFNLEdBQUtrNkIsRUFBR2w2QixNQUFNLEdBQzlEdW5DLEVBQTZCLFNBQWYxdkIsRUFBeUJxaUIsRUFBR2w2QixNQUFNLEdBQUtrNkIsRUFBR2w2QixNQUFNLEdBQ3BFLFNBQVlxbkMsRUFBY25yQixHQUFhLEdBQUcsSUFBTSxvRUFDOUNtckIsU0FBbUJuckIsNkNBQ25CZ2UsRUFBR2w2QixVQUNMLFNBQVlzbkMsRUFBYXByQixHQUFhLEdBQUcsSUFBTSxvRUFDN0NvckIsU0FBa0JwckIsZ0RBQ2RnZSxFQUFHbDZCLFVBQ1QsU0FBYXVuQyxHQUFjcnJCLEVBQVlBLElBQWUsR0FBSSxJQUFNLDhDQUE4Q0EsRUFBWUEsWUFBb0JxckIsdUNBQWdEck4sRUFBR2w2QixVQUNqTSxNQUFNME0sRUFBUyxDQUFFdkwsRUFBRys0QixHQUNkaEssRUFBUSxDQUFFaFUsWUFBV3JFLGNBQzNCLE9BQU8sU0FBT3F2RyxVQUFVLGVBQWN4NkcsRUFBUXdqQixPOzs7O3FFQ3hFbEQscWlCQWdHTyxNQUFNaXNILEVBQWtCLGFBQUcsQ0FBRUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBN0JwQyxTQUEwQmo3SSxFQUFHd0osRUFBUTZULEVBQVNnZCxFQUFLM2pCLEVBQWEsT0FBUTJyQixFQUFZLENBQUMsRUFBRyxHQUFJL0gsR0FDeEYsTUFBTXZCLEVBQUssMEJBQWdCLzRCLEVBQUcsSUFBSyxtQkFDN0I4ekUsRUFBVSwwQkFBZ0J0cUUsRUFBUSxTQUFVLG1CQUNsRCxJQUFJb25JLEVBQU03M0csRUFDTjgzRyxHQUFlLEVBQ0gsSUFBWjkzRyxFQUFHeDVCLE9BQ0hzeEksR0FBZSxFQUNmRCxFQUFNLGtCQUFRNzNHLEVBQUksQ0FBQyxFQUFHQSxFQUFHbDZCLE1BQU0sR0FBSWs2QixFQUFHbDZCLE1BQU0sR0FBSWs2QixFQUFHbDZCLE1BQU0sTUFFN0QsU0FBeUIsSUFBYit4SSxFQUFJcnhJLE1BQVksSUFDeEIsZ0VBQVFxeEksRUFBSXJ4SSxVQUNoQixTQUE2QixJQUFqQnUwRSxFQUFRdjBFLE1BQVksSUFDNUIsaUVBQUd1MEUsRUFBUXYwRSxVQUNmLFNBQVlxeEksRUFBSS94SSxNQUFNLEtBQU9pMUUsRUFBUWoxRSxNQUFNLElBQUksSUFDM0MsdURBQUkreEksRUFBSS94SSxNQUFNLHFEQUNKaTFFLEVBQVFqMUUsTUFBTSxRQUNMLE1BQW5CeTdCLEdBQ0EsU0FBWSxRQUFXRCxJQUFNLElBQ3pCLGdGQUFtQkMsaUJBQStCRCxPQUUxRCxNQUFNOXVCLEVBQVMsQ0FBRXZMLEVBQUc0d0ksRUFBS3BuSSxPQUFRc3FFLEdBQzNCL2tELEVBQVEsQ0FBRTFSLFVBQVNnZCxNQUFLM2pCLGFBQVkyckIsWUFBVy9ILG1CQUUvQ3QwQixFQUFNLFNBQU8rL0csVUFBVSx3QkFBdUJ4NkcsRUFBUXdqQixHQUM1RCxPQUFJOGhILEVBQ08sa0JBQVE3cUksRUFBSyxDQUFDQSxFQUFJbkgsTUFBTSxHQUFJbUgsRUFBSW5ILE1BQU0sR0FBSW1ILEVBQUluSCxNQUFNLEtBRXhEbUgsTTs7Ozt5RkM5RlgscVpBa0NPLE1BQU00Z0MsRUFBc0MsYUFBRyxDQUFFczBHOzs7Ozs7Ozs7Ozs7Ozs7OztBQWR4RCxTQUE4Q2w3SSxFQUFHKzZCLEVBQUl2a0IsRUFBYTZHLEVBQVNnZCxFQUFLZ0ksRUFBWSxDQUFDLEVBQUcsR0FBSS9ILEdBQ2hHLElBQUlzMkcsRUFBTTV3SSxFQUNLLElBQVhBLEVBQUVULE9BQ0ZxeEksRUFBTSxrQkFBUTV3SSxFQUFHLENBQUMsRUFBR0EsRUFBRW5CLE1BQU0sR0FBSW1CLEVBQUVuQixNQUFNLEdBQUltQixFQUFFbkIsTUFBTSxNQUV6RCxJQUFJdTVJLEVBQU9yOUcsRUFDTyxJQUFkcTlHLEVBQUs3NEksT0FDTDY0SSxFQUFPLGtCQUFRcjlHLEVBQUksQ0FBQyxFQUFHQSxFQUFHbDhCLE1BQU0sR0FBSWs4QixFQUFHbDhCLE1BQU0sR0FBSWs4QixFQUFHbDhCLE1BQU0sTUFFOUQsTUFBTTBNLEVBQVMsQ0FBRXZMLEVBQUc0d0ksRUFBSzcxRyxHQUFJcTlHLEdBQ3ZCcnBILEVBQVEsQ0FBRTFSLFVBQVNnZCxNQUFLQyxrQkFBaUIrSCxZQUFXN3JCLGVBRTFELE9BQU8sU0FBT3V2RyxVQUFVLHNDQUFxQ3g2RyxFQUFRd2pCLE87Ozs7d0ZDaEN6RSxvWkFxQ08sTUFBTStYLEVBQXFDLGFBQUcsQ0FBRXEwRzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFqQnZELFNBQTZDaHFJLEVBQVE0cEIsRUFBSXZ4QixFQUFRNlQsRUFBU2dkLEVBQUtnSSxFQUFZLENBQUMsRUFBRyxHQUFJL0gsR0FDL0YsSUFBSTg5RyxFQUFPcjlHLEVBQ1A4MUcsR0FBZSxFQUNILElBQVo5MUcsRUFBR3g3QixPQUNIc3hJLEdBQWUsRUFDZnVILEVBQU8sa0JBQVFyOUcsRUFBSSxDQUFDLEVBQUdBLEVBQUdsOEIsTUFBTSxHQUFJazhCLEVBQUdsOEIsTUFBTSxHQUFJazhCLEVBQUdsOEIsTUFBTSxNQUU5RCxNQUFNME0sRUFBUyxDQUFFd3ZCLEdBQUlxOUcsRUFBTTV1SSxVQUNyQnVsQixFQUFRLENBQUUxUixVQUFTZ2QsTUFBS0Msa0JBQWlCK0gsWUFBV25tQixXQUFZL0ssR0FDaEVuTCxFQUVOLFNBQU8rL0csVUFBVSxxQ0FBb0N4NkcsRUFBUXdqQixHQUM3RCxPQUFJOGhILEVBQ08sa0JBQVE3cUksRUFBSyxDQUFDQSxFQUFJbkgsTUFBTSxHQUFJbUgsRUFBSW5ILE1BQU0sR0FBSW1ILEVBQUluSCxNQUFNLEtBRXhEbUgsTTs7OzswRENuQ1gsbVlBZ0RPLE1BQU1naEMsRUFBTyxhQUFHLENBQUVvMEc7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTHpCLFNBQWVwN0ksR0FDWCxNQUNNdUwsRUFBUyxDQUFFdkwsRUFETiwwQkFBZ0JBLEVBQUcsSUFBSyxTQUVuQyxPQUFPLFNBQU8rbEgsVUFBVSxPQUFNeDZHLE87Ozs7Z0VDOUNsQyxnaUJBNkVPLE1BQU04dkksRUFBYSxhQUFHLENBQUVDOzs7Ozs7Ozs7Ozs7Ozs7OztBQXhCL0IsU0FBcUJ0N0ksRUFBR3dKLEVBQVE2VCxFQUFTZ2QsRUFBS2dJLEVBQVksQ0FBQyxFQUFHLEdBQUkzckIsRUFBYSxRQUMzRSxNQUFNcWlCLEVBQUssMEJBQWdCLzRCLEVBQUcsSUFBSyxjQUM3Qjh6RSxFQUFVLDBCQUFnQnRxRSxFQUFRLFNBQVUsY0FDbEQsU0FBd0IsSUFBWnV2QixFQUFHeDVCLE1BQTBCLElBQVp3NUIsRUFBR3g1QixNQUFZLElBQ3hDLGdFQUFHdzVCLEVBQUd4NUIsVUFDVixTQUE2QixJQUFqQnUwRSxFQUFRdjBFLE1BQVksSUFDNUIsNERBQUd1MEUsRUFBUXYwRSxVQUNmLFNBQTJCLFNBQWZtWCxHQUF1QixJQUMvQixnRkFBeUJBLE1BQzdCLElBQUlrNkgsRUFBTTczRyxFQUNOODNHLEdBQWUsRUFDSCxJQUFaOTNHLEVBQUd4NUIsT0FDSHF4SSxFQUFNLGtCQUFRNzNHLEVBQUksQ0FBQyxFQUFHQSxFQUFHbDZCLE1BQU0sR0FBSWs2QixFQUFHbDZCLE1BQU0sR0FBSWs2QixFQUFHbDZCLE1BQU0sS0FDekRneUksR0FBZSxHQUVuQixNQUFNdGxJLEVBQVMsQ0FBRXZMLEVBQUc0d0ksRUFBS3BuSSxPQUFRc3FFLEdBQzNCL2tELEVBQVEsQ0FBRTFSLFVBQVNnZCxNQUFLZ0ksYUFFeEJyOEIsRUFBTSxTQUFPKy9HLFVBQVUsYUFBWXg2RyxFQUFRd2pCLEdBQ2pELE9BQUk4aEgsRUFDTyxrQkFBUTdxSSxFQUFLLENBQUNBLEVBQUluSCxNQUFNLEdBQUltSCxFQUFJbkgsTUFBTSxHQUFJbUgsRUFBSW5ILE1BQU0sS0FFeERtSCxNOzs7O3lEQzNFWCx5aUJBMERPLE1BQU11ekUsRUFBTSxhQUFHLENBQUVnaUU7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBWnhCLFNBQWNqckksRUFBR3lmLEdBQ2IsSUFBSXUvRyxFQUFLLDBCQUFnQmgvSCxFQUFHLElBQUssT0FDN0JpL0gsRUFBSywwQkFBZ0J4L0csRUFBRyxJQUFLLE9BRWpDLElBREN1L0csRUFBSUMsR0FBTSx5QkFBZUQsRUFBSUMsR0FDYixVQUFiRCxFQUFHOXZJLE9BQWtDLFVBQWIrdkksRUFBRy92SSxNQUMzQixPQUFPLG1CQUFTOHZJLEVBQUlDLEdBRXhCLE1BQU1oa0ksRUFBUyxDQUFFK0UsRUFBR2cvSCxFQUFJdi9HLEVBQUd3L0csR0FHM0IsT0FBTyxTQUFPeHBCLFVBQVUsVUFBU3g2RyxFQUZuQixROzs7OzhEQ3REbEIsZ25CQStETyxNQUFNaXdJLEVBQVcsYUFBRyxDQUFFQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFWN0IsU0FBbUJuckksRUFBR3lmLEdBRWxCLElBQUl1L0csRUFBSywwQkFBZ0JoL0gsRUFBRyxJQUFLLE9BQzdCaS9ILEVBQUssMEJBQWdCeC9HLEVBQUcsSUFBSyxRQUNoQ3UvRyxFQUFJQyxHQUFNLHlCQUFlRCxFQUFJQyxHQUM5QixNQUFNbU0sRUFBWSxjQUFJcE0sRUFBSUMsR0FDcEI1L0MsRUFBUSxvQkFBVStyRCxHQUNsQkMsRUFBYyxnQkFBTXBNLEVBQUk1L0MsR0FDOUIsT0FBTyxnQkFBTWdzRCxFQUFhaHNELEVBQU8rckQsTzs7Ozt5REM3RHJDLHVjQXNFTyxNQUFNRSxFQUFNLGFBQUcsQ0FBRUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaEN4QixTQUFjQyxFQUFJQyxHQUNkLE1BQU1DLEVBQU0sMEJBQWdCRixFQUFJLEtBQU0sT0FDaENHLEVBQU0sMEJBQWdCRixFQUFJLEtBQU0sT0FDdEMsV0FBMEIsSUFBYkMsRUFBSXo4SSxNQUEyQixJQUFieThJLEVBQUl6OEksTUFBNkIsSUFBYjA4SSxFQUFJMThJLE1BQTJCLElBQWIwOEksRUFBSTE4SSxPQUFhLElBQ2xGLCtEQUFHeThJLEVBQUl6OEksWUFBWTA4SSxFQUFJMThJLFVBQzNCLE1BQU0yOEksRUFBd0IsSUFBYkYsRUFBSXo4SSxLQUFheThJLEVBQUluMEksS0FBT20wSSxFQUFJbjlJLE1BQU0sR0FDakRzOUksRUFBd0IsSUFBYkYsRUFBSTE4SSxLQUFhMDhJLEVBQUlwMEksS0FBT28wSSxFQUFJcDlJLE1BQU0sR0FHdkQsR0FGQSxTQUFZcTlJLElBQVlDLEdBQVMsSUFDN0IsZ0VBQUdELFNBQWVDLE9BQ0wsSUFBYkgsRUFBSXo4SSxNQUEyQixJQUFiMDhJLEVBQUkxOEksS0FBWSxDQUNsQyxNQUFNNjhJLEVBQU8sa0JBQVFKLEVBQUssQ0FBQyxHQUFJLElBQ3pCSyxFQUFPLGtCQUFRSixFQUFLLEVBQUUsRUFBRyxJQUN6QkssRUFBTyxpQkFBT0YsRUFBTUMsR0FDMUIsT0FBTyxrQkFBUUMsRUFBTSxJQUVwQixHQUFpQixJQUFiTixFQUFJejhJLE1BQTJCLElBQWIwOEksRUFBSTE4SSxLQUFZLENBQ3ZDLE1BQU02OEksRUFBTyxrQkFBUUosRUFBSyxDQUFDLEdBQUksSUFDekJLLEVBQU8sa0JBQVFKLEVBQUssQ0FBQ0EsRUFBSXA5SSxNQUFNLEdBQUlvOUksRUFBSXA5SSxNQUFNLEtBQzdDeTlJLEVBQU8saUJBQU9GLEVBQU1DLEdBQzFCLE9BQU8sa0JBQVFDLEVBQU0sQ0FBQ0EsRUFBS3owSSxPQUUxQixHQUFpQixJQUFibTBJLEVBQUl6OEksTUFBMkIsSUFBYjA4SSxFQUFJMThJLEtBQVksQ0FDdkMsTUFBTTg4SSxFQUFPLGtCQUFRSixFQUFLLEVBQUUsRUFBRyxJQUN6QkssRUFBTyxpQkFBT04sRUFBS0ssR0FDekIsT0FBTyxrQkFBUUMsRUFBTSxDQUFDQSxFQUFLejBJLE9BRTFCLENBQ0QsTUFBTXcwSSxFQUFPLGtCQUFRSixFQUFLLENBQUNBLEVBQUlwOUksTUFBTSxHQUFJbzlJLEVBQUlwOUksTUFBTSxLQUVuRCxPQURhLGlCQUFPbTlJLEVBQUtLLFE7Ozs7NkRDbEVqQyxrMUJBNkRPLE1BQU1FLEVBQVUsYUFBRyxDQUFFQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFiNUIsU0FBa0J4OEksRUFBR3k4SSxFQUFNQyxFQUFZbG9HLEdBQ25DLE1BQU16YixFQUFLLDBCQUFnQi80QixFQUFHLElBQUssV0FJbkMsR0FIQSxTQUF5QixZQUFiKzRCLEVBQUd2NUIsT0FBcUIsSUFDaEMsZ0ZBQXFCdTVCLEVBQUd2NUIsMEJBQzVCLFNBQVlpOUksR0FBUSxHQUFLQSxFQUFPLEdBQUcsSUFBTSxxREFBcURBLE9BQ2pGLElBQVRBLEVBQ0EsT0FBT3o4SSxhQUFhLFNBQVMrNEIsRUFBRzRvRixRQUFVNW9GLEVBRTlDLE1BQU00akgsRUFBYyx3QkFBYzVqSCxFQUFJMmpILEdBQ2hDRSxFQUFXLEVBQUlILEVBQ2Y5RyxFQUFhLGNBQUksZ0JBQU0sY0FBSSx3QkFBY2dILEVBQWEsRUFBRyxFQUFHLFVBQVdub0csR0FBT29vRyxJQUFZQSxHQUNoRyxPQUFPLGNBQUk3akgsRUFBSTQ4RyxPOzs7O21FQzNEbkI7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5Qk8sU0FBU2tILEVBQWM3OEksRUFBRzA4SSxHQUM3QixHQUFrQixNQUFkQSxFQUNBLE9BQU8xOEksRUFBRW5CLE1BQU1LLFFBRW5CLEdBQUksY0FBaUJjLEVBQUVuQixNQUFPNjlJLEdBQzFCLE9BQU9BLEVBRVgsR0FBSTE4SSxFQUFFbkIsTUFBTUUsU0FBVzI5SSxFQUFXMzlJLE9BQVEsQ0FDdEMsTUFBTSs5SSxFQUFlLEdBQ3JCLElBQUssSUFBSTdoSixFQUFJLEVBQUdBLEVBQUkrRSxFQUFFbkIsTUFBTUUsT0FBUTlELElBQ1gsTUFBakJ5aEosRUFBV3poSixJQUE0QixNQUFkK0UsRUFBRW5CLE1BQU01RCxHQUNqQzZoSixFQUFhbC9JLEtBQUtvQyxFQUFFbkIsTUFBTTVELElBRzFCNmhKLEVBQWFsL0ksS0FBSzgrSSxFQUFXemhKLElBR3JDLE9BQU82aEosRUFFWCxPQUFPSixJOzs7O3FFQzVDWDs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnR08sU0FBU0ssRUFBUXYxRyxLQUFhOVAsR0FDakMsTUFBTSszRyxFQUFXLzNHLEVBQVFuNkIsS0FBSSxDQUFDcEIsRUFBR2xCLElBQU0sMEJBQWdCa0IsRUFBRyxVQUFVbEIsSUFBSyxZQUNuRTh6QixFQUFRLENBQUV5WSxZQUNoQixPQUFPLFNBQU91K0UsVUFBVSxTQUFRMHBCLEVBQVUxZ0gsR0FFdkMsTUFBTXdZLEVBQVMsYUFBRyxDQUFFdzFHLGE7Ozs7eURDckczQixrWUFxQ08sTUFBTWwwRyxFQUFNLGFBQUcsQ0FBRW0wRzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFMeEIsU0FBY2g5SSxHQUNWLE1BQ011TCxFQUFTLENBQUV2TCxFQUROLDBCQUFnQkEsRUFBRyxJQUFLLFFBRW5DLE9BQU8sU0FBTytsSCxVQUFVLE1BQUt4NkcsTzs7OzsyRENuQ2pDLHVqQkE2Q08sTUFBTTA5QixFQUFRLGFBQUcsQ0FBRWcwRzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFSMUIsU0FBZ0Izc0ksRUFBR3lmLEdBQ2YsSUFBSXUvRyxFQUFLLDBCQUFnQmgvSCxFQUFHLElBQUssUUFBUyxxQkFDdENpL0gsRUFBSywwQkFBZ0J4L0csRUFBRyxJQUFLLFFBQVMsc0JBQ3pDdS9HLEVBQUlDLEdBQU0seUJBQWVELEVBQUlDLEdBQzlCLHFDQUEyQkQsRUFBR3p3SSxNQUFPMHdJLEVBQUcxd0ksT0FDeEMsTUFBTTBNLEVBQVMsQ0FBRStFLEVBQUdnL0gsRUFBSXYvRyxFQUFHdy9HLEdBQzNCLE9BQU8sU0FBT3hwQixVQUFVLFFBQU94NkcsTzs7Ozt5REMzQ25DLG1oQkE0Q08sTUFBTW0rQixFQUFNLGFBQUcsQ0FBRXd6Rzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFUeEIsU0FBY2w5SSxHQUNWLElBQUkrNEIsRUFBSywwQkFBZ0IvNEIsRUFBRyxJQUFLLE9BQ2pDLFNBQXlCLFVBQWIrNEIsRUFBR3Y1QixPQUFrQyxZQUFidTVCLEVBQUd2NUIsT0FBcUIsSUFBTSw4Q0FDakQsVUFBYnU1QixFQUFHdjVCLFFBQ0h1NUIsRUFBSyxlQUFLQSxFQUFJLFlBRWxCLE1BQU14dEIsRUFBUyxDQUFFdkwsRUFBRys0QixHQUNwQixPQUFPLFNBQU9ndEYsVUFBVSxNQUFLeDZHLE87Ozs7bUdDMUNqQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnQk8sTUFBTTY5QixFQUFRLFNBQ1JDLEVBQVMsV0FDVEMsR0FBVSxXQUNWQyxFQUFTLFlBQ1RDLEdBQVUsWUFDVkMsRUFBUyxhOzs7O3lEQ3JCdEIsa1lBcUNPLE1BQU1JLEVBQU0sYUFBRyxDQUFFc3pHOzs7Ozs7Ozs7Ozs7Ozs7OztBQUx4QixTQUFjbjlJLEdBQ1YsTUFDTXVMLEVBQVMsQ0FBRXZMLEVBRE4sMEJBQWdCQSxFQUFHLElBQUssUUFFbkMsT0FBTyxTQUFPK2xILFVBQVUsTUFBS3g2RyxPOzs7O2dFQ25DakMsZ2RBNENPLE1BQU0rOEIsRUFBYSxhQUFHLENBQUU4MEc7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUC9CLFNBQXFCcDlJLEVBQUc4VixFQUFPLEdBQzNCLE1BQU1pakIsRUFBSywwQkFBZ0IvNEIsRUFBRyxJQUFLLGFBQWMscUJBQ2pELFNBQVk4VixHQUFRaWpCLEVBQUd4NUIsTUFBTSxJQUFNLHVDQUNuQyxNQUFNZ00sRUFBUyxDQUFFRyxNQUFPcXRCLEdBQ2xCaEssRUFBUSxDQUFFZ2IsSUFBS2owQixHQUNyQixPQUFPLFNBQU9pd0csVUFBVSxhQUFZeDZHLEVBQVF3akIsTzs7OzsyREMxQ2hELG9ZQXNDTyxNQUFNcWIsRUFBUSxhQUFHLENBQUVpekc7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTDFCLFNBQWdCcjlJLEdBQ1osTUFDTXVMLEVBQVMsQ0FBRXZMLEVBRE4sMEJBQWdCQSxFQUFHLElBQUssVUFFbkMsT0FBTyxTQUFPK2xILFVBQVUsUUFBT3g2RyxPOzs7O3lEQ3BDbkMsbWNBcUVPLE1BQU0reEksRUFBTSxhQUFHLENBQUVDOzs7Ozs7Ozs7Ozs7Ozs7OztBQWxDeEIsU0FBY3A2SCxFQUFTRSxFQUFZbTZILEVBQVloK0ksRUFBUSxXQUNqQyxNQUFkNmpCLElBQ0FBLEVBQWFGLEdBRWpCLE1BQU1zNkgsRUFBTyxpQkFBTyxDQUFDdDZILEVBQVNFLEdBQWE3akIsR0FDckM5QyxFQUFJeW1CLEdBQVdFLEVBQWFGLEVBQVVFLEVBQzVDLElBQUssSUFBSXBvQixFQUFJLEVBQUdBLEVBQUl5QixJQUFLekIsRUFDckJ3aUosRUFBS3g0SSxJQUFJLEVBQUdoSyxFQUFHQSxHQUVuQixNQUFNNDFCLEVBQU0sa0JBQVE0c0gsRUFBS2g4QixXQUFZLENBQUN0K0YsRUFBU0UsSUFDL0MsR0FBa0IsTUFBZG02SCxFQUNBLE9BQU8zc0gsRUFHUCxHQUEwQixJQUF0QjJzSCxFQUFXeitJLE9BQ1gsT0FBTyxlQUFLLHFCQUFXOHhCLEVBQUssR0FBSSxDQUFDMnNILEVBQVcsR0FBSSxFQUFHLElBRWxELEdBQTBCLElBQXRCQSxFQUFXeitJLE9BRWhCLE9BQU8sZUFBSyxxQkFBVyxxQkFBVzh4QixFQUFLLEdBQUksR0FBSSxDQUFDMnNILEVBQVcsR0FBSUEsRUFBVyxHQUFJLEVBQUcsSUFFaEYsR0FBMEIsSUFBdEJBLEVBQVd6K0ksT0FFaEIsT0FBTyxlQUFLLHFCQUFXLHFCQUFXLHFCQUFXOHhCLEVBQUssR0FBSSxHQUFJLEdBQUksQ0FDMUQyc0gsRUFBVyxHQUFJQSxFQUFXLEdBQUlBLEVBQVcsR0FBSSxFQUFHLElBSXBELE1BQU0sSUFBSTU1SSxNQUVOLHFFQUE2QjQ1SSxFQUFXeitJLGdCOzs7OzBEQ2pFeEQ7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0NBLFNBQVNpc0MsRUFBS25zQyxFQUFPM0MsRUFBT3NELEdBQ3hCLE1BQU11dkIsRUFBUSxDQUFFbHdCLFFBQU8zQyxRQUFPc0QsU0FDOUIsT0FBTyxTQUFPdW1ILFVBQVUsT0FBTSxHQUFJaDNGLEs7Ozs7MkRDbEN0QyxvWUFxQ08sTUFBTWhYLEVBQVEsYUFBRyxDQUFFMmxJOzs7Ozs7Ozs7Ozs7Ozs7OztBQUwxQixTQUFnQjE5SSxHQUNaLE1BQ011TCxFQUFTLENBQUV2TCxFQUROLDBCQUFnQkEsRUFBRyxJQUFLLFVBRW5DLE9BQU8sU0FBTytsSCxVQUFVLFFBQU94NkcsTzs7Ozs4RENuQ25DLDRkQXNETyxNQUFNZ2dDLEVBQVcsYUFBRyxDQUFFb3lHOzs7Ozs7Ozs7Ozs7Ozs7OztBQVA3QixTQUFtQnJ0SSxFQUFHeWYsR0FDbEIsSUFBSXUvRyxFQUFLLDBCQUFnQmgvSCxFQUFHLElBQUssWUFDN0JpL0gsRUFBSywwQkFBZ0J4L0csRUFBRyxJQUFLLGFBQ2hDdS9HLEVBQUlDLEdBQU0seUJBQWVELEVBQUlDLEdBQzlCLE1BQU1oa0ksRUFBUyxDQUFFK0UsRUFBR2cvSCxFQUFJdi9HLEVBQUd3L0csR0FDM0IsT0FBTyxTQUFPeHBCLFVBQVUsV0FBVXg2RyxPOzs7OzREQ3BEdEMscTFDQTRMTyxNQUFNNjJCLEVBQVMsYUFBRyxDQUFFdzdHOzs7Ozs7Ozs7Ozs7Ozs7OztBQXBHM0IsVUFBc0IsRUFBRTU5SSxFQUFDLE9BQUV3SixFQUFNLFFBQUU2VCxFQUFPLElBQUVnZCxFQUFHLFdBQUUzakIsRUFBYSxPQUFNLFVBQUUyckIsRUFBWSxDQUFDLEVBQUcsR0FBRSxnQkFBRS9ILEVBQWUsS0FBRW9CLEVBQUksV0FBRS9qQixFQUFhLFNBQVEsdUJBQUVna0IsRUFBc0IsZUFBRUMsSUFFNUosR0FEQWprQixFQUFhQSxHQUFjLFVBQ2dDLElBQXZELHFCQUFXLFNBQU9pc0csTUFBTWYsY0FBZWxyRyxHQUF1QixDQUM5RCxJQUFJcFIsRUFBUyxpQkFBY3ZHLEVBQUd3SixFQUFRNlQsRUFBU2dkLEVBQUszakIsRUFBWTJyQixFQUFXL0gsR0FJM0UsT0FIWSxNQUFSb0IsSUFDQW4xQixFQUFTLGNBQUlBLEVBQVFtMUIsSUFFbEIsMEJBQWdCbjFCLEVBQVFvUixFQUFZZ2tCLEVBQXdCQyxHQUV2RSxNQUFNN0MsRUFBSywwQkFBZ0IvNEIsRUFBRyxJQUFLLFVBQzdCOHpFLEVBQVUsMEJBQWdCdHFFLEVBQVEsU0FBVSxVQUNsRCxJQUFJb25JLEVBQU03M0csRUFDTjgzRyxHQUFlLEVBQ0gsSUFBWjkzRyxFQUFHeDVCLE9BQ0hzeEksR0FBZSxFQUNmRCxFQUFNLGtCQUFRNzNHLEVBQUksQ0FBQyxFQUFHQSxFQUFHbDZCLE1BQU0sR0FBSWs2QixFQUFHbDZCLE1BQU0sR0FBSWs2QixFQUFHbDZCLE1BQU0sTUFFN0QsU0FBeUIsSUFBYit4SSxFQUFJcnhJLE1BQVksSUFDeEIsNkRBQUdxeEksRUFBSXJ4SSxVQUNYLFNBQTZCLElBQWpCdTBFLEVBQVF2MEUsTUFBWSxJQUM1Qiw4REFBR3UwRSxFQUFRdjBFLFVBQ1EsTUFBbkIrNkIsR0FDQSxTQUFZLFFBQVdELElBQU0sSUFDekIsNkVBQW1CQyxpQkFBK0JELE9BRTFELFNBQVl1MkcsRUFBSS94SSxNQUFNLEtBQU9pMUUsRUFBUWoxRSxNQUFNLElBQUksSUFBTSxvQ0FBb0MreEksRUFBSS94SSxNQUFNLHlDQUNyRWkxRSxFQUFRajFFLE1BQU0sUUFDNUMsU0FBWSxpQ0FBeUN3ZSxFQUFTZ2xCLElBQVksSUFDdEUsdUVBQWVobEIsb0JBQTBCZ2xCLE9BQzdDLFNBQTJCLFNBQWYzckIsR0FBdUIsSUFBTSxzQ0FBc0NBLDRDQUMvRSxNQUFNaFcsRUFBVyxvQkFBNEJrd0ksRUFBSS94SSxNQUFPaTFFLEVBQVFqMUUsTUFBT3dlLEVBQVNnbEIsRUFBV2hJLEVBQUtDLEdBQ2hHLElBQUl1akgsRUFNQUMsRUFMUSxNQUFScGlILElBQ0FtaUgsRUFBUSwwQkFBZ0JuaUgsRUFBTSxPQUFRLGlCQUNyQ21pSCxHQUFTLHlCQUFlQSxFQUFPOWtILEdBQ2hDLDZCQUEwQ3I0QixFQUFTcEIsU0FBVXUrSSxFQUFNaC9JLFFBR3pDLE1BQTFCODhCLElBQ0FtaUgsRUFBMEIsMEJBQWdCbmlILEVBQXdCLGdCQUFpQixpQkFFdkYsTUFBTXd2RixFQUFPLENBQUNwd0YsRUFBSThyRixLQUNkLE1BQU8veUMsRUFBUzg4RCxFQUFLOXFILEVBQUcrM0gsR0FBU2gzQixFQUMzQmszQixFQUFlLCtCQUFxQmhqSCxFQUFJalYsRUFBR25PLEdBQ2pELFNBQVksb0JBQTRCMHFCLElBQVksSUFFaEQsdUhBQXNEQSxPQUMxRCxNQUVNMjdHLEVBQU0sQ0FGQyw4QkFBb0JwTixFQUFJL3hJLE1BQU9rL0ksRUFBY2pxRSxFQUFTejJELEVBQVNnZCxHQUMxRCwrQkFBcUJ1MkcsRUFBS21OLEVBQWNqcUUsRUFBUWoxRSxNQUFPd2UsRUFBU2dkLElBRWxGLEdBQWEsTUFBVHdqSCxFQUFlLENBQ2YsTUFBTUksRUFBVSwrQkFBcUJKLEVBQU9FLEdBQzVDQyxFQUFJcGdKLEtBQUtxZ0osR0FFYixPQUFPRCxHQUVMenlJLEVBQVMsQ0FDWHZMLEVBQUc0d0ksRUFDSHBuSSxPQUFRc3FFLEVBQ1JwNEMsS0FBTW1pSCxFQUNObGlILHVCQUF3Qm1pSCxHQUV0Qi91SCxFQUFRLENBQ1YxUixVQUNBZ2QsTUFDQTNqQixhQUNBMnJCLFlBQ0EvSCxrQkFDQTNpQixhQUNBaWtCLGtCQUlKLEdBQVksTUFBUkYsRUFBYyxDQVlkLE9BWGlCLHNCQUFXLENBQUNrMUcsRUFBS3BuSSxFQUFRd2hILEtBQ3RDLElBQUlobEgsRUFFSixTQUFPKy9HLFVBQVUsY0FBYXg2RyxFQUFRd2pCLEdBTXRDLE9BTEFpOEYsRUFBSyxDQUFDeGhILEVBQVFvbkksRUFBSzVxSSxJQUNmNnFJLElBRUE3cUksRUFBTSxrQkFBUUEsRUFBSyxDQUFDQSxFQUFJbkgsTUFBTSxHQUFJbUgsRUFBSW5ILE1BQU0sR0FBSW1ILEVBQUluSCxNQUFNLE1BRXZELENBQUUzQyxNQUFPOEosRUFBSzRqSCxTQUFVdUIsS0FFNUIreUIsQ0FBU3ROLEVBQUs5OEQsR0FZckIsT0FUeUIsc0JBQVcsQ0FBQzg4RCxFQUFLcG5JLEVBQVFreUIsRUFBTXN2RixLQUNwRCxJQUFJaGxILEVBQU0sU0FBTysvRyxVQUFVLGNBQWF4NkcsRUFBUXdqQixHQU1oRCxPQUxBaThGLEVBQUssQ0FBQ3hoSCxFQUFRb25JLEVBQUs1cUksRUFBSzAxQixJQUNwQm0xRyxJQUVBN3FJLEVBQU0sa0JBQVFBLEVBQUssQ0FBQ0EsRUFBSW5ILE1BQU0sR0FBSW1ILEVBQUluSCxNQUFNLEdBQUltSCxFQUFJbkgsTUFBTSxNQUV2RCxDQUFFM0MsTUFBTzhKLEVBQUs0akgsU0FBVXVCLEtBRTVCZ3pCLENBQWlCdk4sRUFBSzk4RCxFQUFTK3BFLE87Ozs7cUVDekw5QyxzN0NBdUxPLE1BQU03QyxFQUFrQixhQUFHLENBQUVvRDs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFyR3BDLFVBQStCLEVBQUVwK0ksRUFBQyxPQUFFd0osRUFBTSxRQUFFNlQsRUFBTyxJQUFFZ2QsRUFBRyxXQUFFM2pCLEVBQWEsT0FBTSxVQUFFMnJCLEVBQVksQ0FBQyxFQUFHLEdBQUUsZ0JBQUUvSCxFQUFlLEtBQUVvQixFQUFJLFdBQUUvakIsRUFBYSxTQUFRLHVCQUFFZ2tCLEVBQXNCLGVBQUVDLElBQ3JLLElBQTJELElBQXZELHFCQUFXLFNBQU9nb0YsTUFBTWYsY0FBZWxyRyxHQUF1QixDQUM5RCxJQUFJcFIsRUFBUywwQkFBdUJ2RyxFQUFHd0osRUFBUTZULEVBQVNnZCxFQUFLM2pCLEVBQVkyckIsRUFBVy9ILEdBSXBGLE9BSFksTUFBUm9CLElBQ0FuMUIsRUFBUyxjQUFJQSxFQUFRbTFCLElBRWxCLDBCQUFnQm4xQixFQUFRb1IsRUFBWWdrQixFQUF3QkMsR0FFdkUsTUFBTTdDLEVBQUssMEJBQWdCLzRCLEVBQUcsSUFBSyxtQkFDN0I4ekUsRUFBVSwwQkFBZ0J0cUUsRUFBUSxTQUFVLG1CQUNsRCxJQUFJb25JLEVBQU03M0csRUFDTjgzRyxHQUFlLEVBQ0gsSUFBWjkzRyxFQUFHeDVCLE9BQ0hzeEksR0FBZSxFQUNmRCxFQUFNLGtCQUFRNzNHLEVBQUksQ0FBQyxFQUFHQSxFQUFHbDZCLE1BQU0sR0FBSWs2QixFQUFHbDZCLE1BQU0sR0FBSWs2QixFQUFHbDZCLE1BQU0sTUFFN0QsU0FBeUIsSUFBYit4SSxFQUFJcnhJLE1BQVksSUFDeEIsc0VBQVFxeEksRUFBSXJ4SSxVQUNoQixTQUE2QixJQUFqQnUwRSxFQUFRdjBFLE1BQVksSUFDNUIsdUVBQWdCdTBFLEVBQVF2MEUsVUFDNUIsU0FBWXF4SSxFQUFJL3hJLE1BQU0sS0FBT2kxRSxFQUFRajFFLE1BQU0sSUFBSSxJQUMzQyw2REFBSSt4SSxFQUFJL3hJLE1BQU0scURBQ0ppMUUsRUFBUWoxRSxNQUFNLFFBQ1gsTUFBYndqQyxJQUNBQSxFQUFZLENBQUMsRUFBRyxJQUVwQixTQUFZLGlDQUF5Q2hsQixFQUFTZ2xCLElBQVksSUFDdEUsc0ZBQXFCaGxCLG9CQUEwQmdsQixPQUM1QixNQUFuQi9ILEdBQ0EsU0FBWSxRQUFXRCxJQUFNLElBQ3pCLHFGQUF5QkMsaUJBQStCRCxPQUVoRSxNQUFNMzVCLEVBQVcsb0JBQTRCa3dJLEVBQUkveEksTUFBT2kxRSxFQUFRajFFLE1BQU93ZSxFQUFTZ2xCLEVBQVdoSSxFQUFLQyxHQUFpQixHQUNqSCxJQUFJdWpILEVBTUFDLEVBTFEsTUFBUnBpSCxJQUNBbWlILEVBQVEsMEJBQWdCbmlILEVBQU0sT0FBUSxpQkFDckNtaUgsR0FBUyx5QkFBZUEsRUFBTzlrSCxHQUNoQyw2QkFBMENyNEIsRUFBU3BCLFNBQVV1K0ksRUFBTWgvSSxRQUd6QyxNQUExQjg4QixJQUNBbWlILEVBQTBCLDBCQUFnQm5pSCxFQUF3QixnQkFBaUIsMEJBRXZGLE1BQU13dkYsRUFBTyxDQUFDcHdGLEVBQUk4ckYsS0FDZCxTQUFZLG9CQUE0QnhrRixJQUFZLElBRWhELG1IQUFJQSxPQUNSLE1BQU95eEMsRUFBUzg4RCxFQUFLOXFILEVBQUc0VixHQUFRbXJGLEVBQzFCazNCLEVBQWUsK0JBQXFCaGpILEVBQUlqVixFQUFHbk8sR0FDM0MwbUksRUFBTyw2Q0FBbUN6TixFQUFJL3hJLE1BQU9rL0ksRUFBY2pxRSxFQUFTejJELEVBQVNnZCxFQUFLZ0ksRUFBVy9ILEdBQ3JHZ2tILEVBQVksOENBQW9DMU4sRUFBS21OLEVBQWNqcUUsRUFBUWoxRSxNQUFPd2UsRUFBU2dkLEVBQUtnSSxFQUFXL0gsR0FDakgsR0FBWSxNQUFSb0IsRUFBYyxDQUVkLE1BQU8sQ0FBQzJpSCxFQUFNQyxFQURFLCtCQUFxQlQsRUFBT0UsSUFHaEQsTUFBTyxDQUFDTSxFQUFNQyxJQUVaL3lJLEVBQVMsQ0FDWHZMLEVBQUc0d0ksRUFDSHBuSSxPQUFRc3FFLEVBQ1JwNEMsS0FBTW1pSCxFQUNObGlILHVCQUF3Qm1pSCxHQUV0Qi91SCxFQUFRLENBQ1YxUixVQUNBZ2QsTUFDQTNqQixhQUNBMnJCLFlBQ0EvSCxrQkFDQTNpQixhQUNBaWtCLGtCQUlKLEdBQVksTUFBUkYsRUFBYyxDQVdkLE9BVmlCLHNCQUFXLENBQUNrMUcsRUFBS3BuSSxFQUFRd2hILEtBRXRDLElBQUlobEgsRUFBTSxTQUFPKy9HLFVBQVUsdUJBQXNCeDZHLEVBQVF3akIsR0FNekQsT0FMQWk4RixFQUFLLENBQUN4aEgsRUFBUW9uSSxFQUFLNXFJLElBQ2Y2cUksSUFFQTdxSSxFQUFNLGtCQUFRQSxFQUFLLENBQUNBLEVBQUluSCxNQUFNLEdBQUltSCxFQUFJbkgsTUFBTSxHQUFJbUgsRUFBSW5ILE1BQU0sTUFFdkQsQ0FBRTNDLE1BQU84SixFQUFLNGpILFNBQVV1QixLQUU1Qit5QixDQUFTdE4sRUFBSzk4RCxHQWFyQixPQVZ5QixzQkFBVyxDQUFDODhELEVBQUtwbkksRUFBUWt5QixFQUFNc3ZGLEtBRXBELElBQUlobEgsRUFBTSxTQUFPKy9HLFVBQVUsdUJBQXNCeDZHLEVBQVF3akIsR0FNekQsT0FMQWk4RixFQUFLLENBQUN4aEgsRUFBUW9uSSxFQUFLNXFJLEVBQUswMUIsSUFDcEJtMUcsSUFFQTdxSSxFQUFNLGtCQUFRQSxFQUFLLENBQUNBLEVBQUluSCxNQUFNLEdBQUltSCxFQUFJbkgsTUFBTSxHQUFJbUgsRUFBSW5ILE1BQU0sTUFFdkQsQ0FBRTNDLE1BQU84SixFQUFLNGpILFNBQVV1QixLQUU1Qmd6QixDQUFpQnZOLEVBQUs5OEQsRUFBUytwRSxPOzs7OzREQ3BMOUMsc2lDQTRKTyxNQUFNVSxFQUFTLGFBQUcsQ0FBRUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBM0czQixVQUFzQixFQUFFbHVJLEVBQUMsRUFBRXlmLEVBQUMsV0FBRXNMLEdBQWEsRUFBSyxXQUFFQyxHQUFhLEVBQUssS0FBRUksRUFBSSxXQUFFL2pCLEVBQWEsU0FBUSx1QkFBRWdrQixFQUFzQixlQUFFQyxJQUN2SCxJQUEyRCxJQUF2RCxxQkFBVyxTQUFPZ29GLE1BQU1mLGNBQWVsckcsR0FBdUIsQ0FDOUQsSUFBSXBSLEVBQVMsaUJBQWMrSixFQUFHeWYsRUFBR3NMLEVBQVlDLEdBSTdDLE9BSFksTUFBUkksSUFDQW4xQixFQUFTLGNBQUlBLEVBQVFtMUIsSUFFbEIsMEJBQWdCbjFCLEVBQVFvUixFQUFZZ2tCLEVBQXdCQyxHQUV2RSxJQUFJMHpHLEVBQUssMEJBQWdCaC9ILEVBQUcsSUFBSyxnQkFDN0JpL0gsRUFBSywwQkFBZ0J4L0csRUFBRyxJQUFLLGlCQUNoQ3UvRyxFQUFJQyxHQUFNLHlCQUFlRCxFQUFJQyxHQUM5QixNQUFNeHpHLEVBQWNWLEVBQWFpMEcsRUFBR3p3SSxNQUFNeXdJLEVBQUcvdkksS0FBTyxHQUFLK3ZJLEVBQUd6d0ksTUFBTXl3SSxFQUFHL3ZJLEtBQU8sR0FDdEV5OEIsRUFBY1YsRUFBYWkwRyxFQUFHMXdJLE1BQU0wd0ksRUFBR2h3SSxLQUFPLEdBQUtnd0ksRUFBRzF3SSxNQUFNMHdJLEVBQUdod0ksS0FBTyxHQUN0RTA4QixFQUFjWixFQUFhaTBHLEVBQUd6d0ksTUFBTXl3SSxFQUFHL3ZJLEtBQU8sR0FBSyt2SSxFQUFHendJLE1BQU15d0ksRUFBRy92SSxLQUFPLEdBQ3RFMjhCLEVBQWNaLEVBQWFpMEcsRUFBRzF3SSxNQUFNMHdJLEVBQUdod0ksS0FBTyxHQUFLZ3dJLEVBQUcxd0ksTUFBTTB3SSxFQUFHaHdJLEtBQU8sR0FDdEU0OEIsRUFBYW16RyxFQUFHendJLE1BQU1LLE1BQU0sR0FBSSxHQUNoQ2s5QixFQUFhbXpHLEVBQUcxd0ksTUFBTUssTUFBTSxHQUFJLEdBQ2hDbTlCLEVBQVksZ0JBQW1CRixHQUMvQkcsRUFBWSxnQkFBbUJGLEdBQ3JDLFNBQVlrekcsRUFBRy92SSxNQUFRLEdBQUtnd0ksRUFBR2h3SSxNQUFRLEdBQUsrdkksRUFBRy92SSxPQUFTZ3dJLEVBQUdod0ksTUFBTSxJQUM3RCxrRkFBc0IrdkksRUFBRy92SSxZQUFZZ3dJLEVBQUdod0ksVUFDNUMsU0FBWSxjQUFpQjQ4QixFQUFZQyxJQUFhLElBQU0sNENBQTRDRCxXQUNqR0MsNkJBQXNDa3pHLEVBQUd6d0ksYUFDekMwd0ksRUFBRzF3SSxzQkFDVixTQUFZazlCLElBQWdCQyxHQUFhLElBQU0sd0NBQXdDRCxXQUNoRkMsNkJBQXVDc3pHLEVBQUd6d0ksYUFDMUMwd0ksRUFBRzF3SSx3QkFBd0J3OEIsb0JBQ1hDLGtCQUN2QixNQUFNaDhCLEVBQVdnd0ksRUFBR3p3SSxNQUFNSyxNQUFNLEdBQUksR0FBR2dCLE9BQU8sQ0FBQys3QixFQUFhQyxJQUN0RHVpSCxFQUFNcGpILEVBQ1Isa0JBQVFpMEcsRUFBSSxDQUFDanpHLEVBQVdOLEVBQWFFLElBQ3JDLGtCQUFRcXpHLEVBQUksQ0FBQ2p6RyxFQUFXSixFQUFhRixJQUNuQzJpSCxFQUFNcGpILEVBQ1Isa0JBQVFpMEcsRUFBSSxDQUFDanpHLEVBQVdKLEVBQWFGLElBQ3JDLGtCQUFRdXpHLEVBQUksQ0FBQ2p6RyxFQUFXTixFQUFhRSxJQUN6QyxJQUFJMmhILEVBTUFDLEVBTFEsTUFBUnBpSCxJQUNBbWlILEVBQVEsMEJBQWdCbmlILEVBQU0sT0FBUSxpQkFDckNtaUgsR0FBUyx5QkFBZUEsRUFBT3ZPLEdBQ2hDLDZCQUEwQ2h3SSxFQUFVdStJLEVBQU1oL0ksUUFHaEMsTUFBMUI4OEIsSUFDQW1pSCxFQUEwQiwwQkFBZ0JuaUgsRUFBd0IsZ0JBQWlCLGlCQUV2RixNQUFNd3ZGLEVBQU8sQ0FBQ3B3RixFQUFJOHJGLEtBQ2QsTUFBTzQzQixFQUFLQyxFQUFLNTRILEVBQUcrM0gsR0FBU2gzQixFQUl2QmszQixFQUFlLCtCQUFxQixrQkFBUWhqSCxFQUFJalYsRUFBRWpuQixPQUFRaW5CLEVBQUduTyxHQUNuRSxJQUFJZ25JLEVBQ0FDLEVBaUJKLEdBaEJLdmpILEdBQWVDLEdBSVZELEdBQWNDLEdBQ3BCcWpILEVBQU8saUJBQWNaLEVBQWNXLEdBQUssR0FBTyxHQUMvQ0UsRUFBTyxpQkFBY2IsRUFBY1UsR0FBSyxHQUFNLElBRXpDcGpILElBQWVDLEdBQ3BCcWpILEVBQU8saUJBQWNELEVBQUtYLEdBQWMsR0FBTyxHQUMvQ2EsRUFBTyxpQkFBY0gsRUFBS1YsR0FBYyxHQUFPLEtBRy9DWSxFQUFPLGlCQUFjRCxFQUFLWCxHQUFjLEdBQU0sR0FDOUNhLEVBQU8saUJBQWNiLEVBQWNVLEdBQUssR0FBTSxLQWI5Q0UsRUFBTyxpQkFBY1osRUFBY1csR0FBSyxHQUFPLEdBQy9DRSxFQUFPLGlCQUFjSCxFQUFLVixHQUFjLEdBQU0sSUFjdEMsTUFBUnJpSCxFQUFjLENBRWQsTUFBTyxDQUFDaWpILEVBQU1DLEVBREUsK0JBQXFCZixFQUFPRSxJQUk1QyxNQUFPLENBQUNZLEVBQU1DLElBR2hCcnpJLEVBQVMsQ0FDWCtFLEVBQUdtdUksRUFDSDF1SCxFQUFHMnVILEVBQ0hoakgsS0FBTW1pSCxFQUNObGlILHVCQUF3Qm1pSCxHQUV0Qi91SCxFQUFRLENBQUVzTSxhQUFZQyxhQUFZM2pCLGFBQVlpa0Isa0JBR3BELEdBQVksTUFBUkYsRUFBYyxDQVFkLE9BUGlCLHNCQUFXLENBQUMraUgsRUFBS0MsRUFBSzF6QixLQUNuQyxNQUFNaGxILEVBRU4sU0FBTysvRyxVQUFVLGVBQWN4NkcsRUFBUXdqQixHQUV2QyxPQURBaThGLEVBQUssQ0FBQ3l6QixFQUFLQyxFQUFLMTRJLElBQ1QsQ0FBRTlKLE1BQU8sa0JBQVE4SixFQUFLMUcsR0FBV3NxSCxTQUFVdUIsS0FFL0MreUIsQ0FBU08sRUFBS0MsR0FVckIsT0FQeUIsc0JBQVcsQ0FBQ0QsRUFBS0MsRUFBS2IsRUFBTzd5QixLQUNsRCxNQUFNaGxILEVBRU4sU0FBTysvRyxVQUFVLGVBQWN4NkcsRUFBUXdqQixHQUV2QyxPQURBaThGLEVBQUssQ0FBQ3l6QixFQUFLQyxFQUFLMTRJLEVBQUs2M0ksSUFDZCxDQUFFM2hKLE1BQU8sa0JBQVE4SixFQUFLMUcsR0FBV3NxSCxTQUFVdUIsS0FFL0NnekIsQ0FBaUJNLEVBQUtDLEVBQUtiLE87Ozs7cUZDekoxQyxvZDs7Ozs2SENBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE0Qk8sU0FBU2dCLEVBQXFCOWpILEVBQUlqVixFQUFHbk8sR0FDeEMsR0FBa0IsTUFBZEEsR0FBcUMsV0FBZkEsRUFDdEIsT0FBT29qQixFQUVYLEdBQW1CLFNBQWZwakIsRUFDQSxPQUFPLGNBQUlvakIsRUFBSSxlQUFLalYsSUFFeEIsTUFBTSxJQUFJbGlCLE1BQU0sZ0RBQWdEK1QsTUFHN0QsU0FBU21uSSxFQUFxQnBqSCxFQUFNcWlILEdBQ3ZDLElBQUkvM0ksRUFBTSszSSxFQUNWLE1BQU1nQixFQUFhLG1CQUFnQ3JqSCxFQUFLNzhCLE1BQU9rL0ksRUFBYWwvSSxPQUk1RSxPQUhJa2dKLEVBQVdoZ0osT0FBUyxJQUNwQmlILEVBQU0sY0FBSUEsRUFBSys0SSxJQUVaLGtCQUFRLzRJLEVBQUswMUIsRUFBSzc4QixPQUV0QixTQUFTbXVGLEVBQWdCaHRGLEVBQUcyWCxFQUFZZ2tCLEVBQXdCQyxHQUNuRSxHQUFtQixXQUFmamtCLEVBQ0EsT0FBTzNYLEVBRU4sR0FBbUIsU0FBZjJYLEVBQ0wsT0FBTyxlQUFLM1gsR0FFWCxHQUFtQixRQUFmMlgsRUFDTCxPQUFPLGNBQUkzWCxHQUVWLEdBQW1CLFVBQWYyWCxFQUNMLE9BQU8sZ0JBQU0zWCxHQUVaLEdBQW1CLFVBQWYyWCxFQUNMLE9BQU8sZ0JBQU0zWCxFQUFHMjdCLEdBRWYsR0FBbUIsY0FBZmhrQixFQUNMLE9BQU8sb0JBQVUzWCxFQUFHNDdCLEdBRW5CLEdBQW1CLFlBQWZqa0IsRUFDTCxPQUFPLGtCQUFRM1gsR0FFbkIsTUFBTSxJQUFJNEQsTUFBTSw0QkFBNEIrVCxNQUd6QyxNQUFNcW5JLEVBQWEsQ0FBQ244QixFQUFlbHJHLE1BQ2pCa3JHLEVBQWdCLElBQ0UsV0FBZmxyRyxHOzs7OzREQ3pFNUIscVlBcURPLE1BQU1zbkksRUFBUyxhQUFHLENBQUVDOzs7Ozs7Ozs7Ozs7Ozs7OztBQVAzQixTQUFpQmwvSSxFQUFHNnNDLEVBQVMvMkIsRUFBTyxFQUFHNjNCLEVBQVksR0FDL0MsTUFFTXBpQyxFQUFTLENBQUV2TCxFQUZOLDBCQUFnQkEsRUFBRyxJQUFLLFVBRVg2c0MsUUFEUCwwQkFBZ0JBLEVBQVMsVUFBVyxTQUFVLFVBRXpEOWQsRUFBUSxDQUFFalosT0FBTTYzQixhQUN0QixPQUFPLFNBQU9vNEUsVUFBVSxXQUFVeDZHLEVBQVF3akIsTzs7Ozs4RENuRDlDLHVZQWdFTyxNQUFNb3dILEVBQVcsYUFBRyxDQUFFQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFON0IsU0FBbUJwL0ksRUFBRzZzQyxHQUNsQixNQUFNOFIsRUFBVywwQkFBZ0I5UixFQUFTLFVBQVcsV0FBWSxTQUUzRHRoQyxFQUFTLENBQUVxaEMsT0FETiwwQkFBZ0I1c0MsRUFBRyxJQUFLLFdBQVkscUJBQ2xCNnNDLFFBQVM4UixHQUN0QyxPQUFPLFNBQU9vbkUsVUFBVSxXQUFVeDZHLE87Ozs7d0VDOUR0QyxxSUFTTyxTQUFTNGhDLEVBQW1CMDNCLEVBQVFoNEIsR0FDdkMsTUFBTXd5RyxFQUFheDZFLEVBQU9obUUsTUFBTUUsT0FDMUI2dkQsRUFBYy9oQixFQUFRaHVDLE1BQU1FLE9BQ2xDLEdBQUlzZ0osRUFBYSxFQUNiLE1BQU0sSUFBSXo3SSxNQUNOLDRFQUFxQnk3SSxNQUU3QixHQUFJendGLEVBQWMsRUFDZCxNQUFNLElBQUlockQsTUFDTiw4RUFBcUJnckQsTUFFN0IsR0FBc0IsVUFBbEIvaEIsRUFBUXJ0QyxNQUNSLE1BQU0sSUFBSW9FLE1BQ04seUVBQXNCaXBDLEVBQVFydEMsVUFFdEMsR0FBSXF0QyxFQUFRaHVDLE1BQU0rdkQsRUFBYyxHQUFLeXdGLEVBQ2pDLE1BQU0sSUFBSXo3SSxNQUNOLGlFQUFHaXBDLEVBQVFodUMsTUFBTSt2RCxFQUFjLFVBQVV5d0YsS0FFakQsR0FBb0MsSUFBaEMsd0JBQWN4NkUsRUFBT2htRSxPQUNyQixNQUFNLElBQUkrRSxNQUNOLG1FQUFpQmloRSxFQUFPaG1FLFVBRWhDLE1BQU1pdUMsRUFBZUQsRUFBUWh1QyxNQUN2Qmt1QyxFQUFZRCxFQUFhQSxFQUFhL3RDLE9BQVMsR0FHckQsSUFBSXVnSixFQUFVLEVBQ2QsSUFBSyxJQUFJcmtKLEVBQUksRUFBR0EsRUFBSTZ4QyxFQUFhL3RDLE9BQVMsSUFBSzlELEVBQzNDcWtKLEdBQVd4eUcsRUFBYTd4QyxHQUU1QixNQUFNaWhCLEVBQWEyb0QsRUFBT2htRSxNQUNwQm91QyxFQUFjSCxFQUFhNXRDLFFBQ2pDK3RDLEVBQVlnL0QsTUFDWixJQUFJcHRFLEVBQVksRUFDaEIsSUFBSyxJQUFJNWpDLEVBQUk4eEMsRUFBVzl4QyxFQUFJb2tKLElBQWNwa0osRUFDdEM0akMsR0FBYTNpQixFQUFXamhCLEdBQ3hCZ3lDLEVBQVlydkMsS0FBS3NlLEVBQVdqaEIsSUFFaEMsTUFBTW9pQixFQUFVLElBQUkseUJBQWV3bkQsRUFBT2htRSxPQUFPdEIsS0FBSW80RCxHQUFVQSxFQUFTOTJCLElBQ3BFLEdBQUczL0IsTUFBTSxFQUFHNnRDLEdBQ2hCLE1BQU8sQ0FBQ0UsRUFBYXF5RyxFQUFTemdILEVBQVd4aEIsSzs7Ozs2RENsRDdDLHlqQkE2Q08sTUFBTWl4QixFQUFVLGFBQUcsQ0FBRWl4Rzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFSNUIsU0FBa0JqdkksRUFBR3lmLEdBQ2pCLElBQUl1L0csRUFBSywwQkFBZ0JoL0gsRUFBRyxJQUFLLFVBQVcscUJBQ3hDaS9ILEVBQUssMEJBQWdCeC9HLEVBQUcsSUFBSyxVQUFXLHNCQUMzQ3UvRyxFQUFJQyxHQUFNLHlCQUFlRCxFQUFJQyxHQUM5QixxQ0FBMkJELEVBQUd6d0ksTUFBTzB3SSxFQUFHMXdJLE9BQ3hDLE1BQU0wTSxFQUFTLENBQUUrRSxFQUFHZy9ILEVBQUl2L0csRUFBR3cvRyxHQUMzQixPQUFPLFNBQU94cEIsVUFBVSxVQUFTeDZHLE87Ozs7a0VDM0NyQyw4akJBNkNPLE1BQU1pakMsRUFBZSxhQUFHLENBQUVneEc7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUmpDLFNBQXVCbHZJLEVBQUd5ZixHQUN0QixJQUFJdS9HLEVBQUssMEJBQWdCaC9ILEVBQUcsSUFBSyxlQUFnQixxQkFDN0NpL0gsRUFBSywwQkFBZ0J4L0csRUFBRyxJQUFLLGVBQWdCLHNCQUNoRHUvRyxFQUFJQyxHQUFNLHlCQUFlRCxFQUFJQyxHQUM5QixxQ0FBMkJELEVBQUd6d0ksTUFBTzB3SSxFQUFHMXdJLE9BQ3hDLE1BQU0wTSxFQUFTLENBQUUrRSxFQUFHZy9ILEVBQUl2L0csRUFBR3cvRyxHQUMzQixPQUFPLFNBQU94cEIsVUFBVSxlQUFjeDZHLE87Ozs7MERDM0MxQyxtWUF1Q08sTUFBTTNFLEVBQU8sYUFBRyxDQUFFNjRJOzs7Ozs7Ozs7Ozs7Ozs7OztBQUx6QixTQUFlL3pJLEdBQ1gsTUFDTUgsRUFBUyxDQUFFRyxNQURGLDBCQUFnQkEsRUFBTyxRQUFTLFNBRS9DLE9BQU8sU0FBT3E2RyxVQUFVLE9BQU14NkcsTzs7OzttRUNyQ2xDLGdlQWdFTyxNQUFNczVCLEVBQWdCLGFBQUcsQ0FBRTY2Rzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFwQmxDLFNBQXdCNTZHLEVBQU9DLEVBQU9DLEVBQVE5ckIsRUFBVUMsRUFBUyxXQUFZQyxFQUFxQixHQUM5RixNQUFNdW1JLEVBQVMsMEJBQWdCNzZHLEVBQU8sUUFBUyxpQkFDekM4NkcsRUFBUywwQkFBZ0I3NkcsRUFBTyxRQUFTLGdCQUFpQixXQUMxRDg2RyxFQUFVLDBCQUFnQjc2RyxFQUFRLFNBQVUsZ0JBQWlCLFNBQzdEeHJCLEVBQVdvbUksRUFBTy9nSixNQUFNLEdBQzlCLFNBQTRCLElBQWhCOGdKLEVBQU9wZ0osTUFBWSxJQUMzQiw2REFBZ0JvZ0osRUFBT3BnSixVQUMzQixTQUE0QixJQUFoQnFnSixFQUFPcmdKLE1BQWtDLElBQXBCcWdKLEVBQU8vZ0osTUFBTSxJQUFVLElBQU0sb0RBQW9EMmEsc0JBQzdGb21JLEVBQU8vZ0osV0FDNUIsU0FBNkIsSUFBakJnaEosRUFBUXRnSixNQUFjc2dKLEVBQVFoaEosTUFBTSxLQUFPMmEsR0FBVSxJQUFNLHFEQUFxREEsb0JBQ3ZHb21JLEVBQU8vZ0osV0FDNUIsU0FBZ0MsSUFBcEJxYSxFQUFTbmEsUUFBYyxJQUMvQix3RUFBVW1hLEVBQVNuYSxZQUN2QixTQUFZbWEsRUFBUyxJQUFNLEdBQUtBLEVBQVMsSUFBTSxHQUFHLElBQU0sMkNBQTJDQSxNQUNuRyxTQUF1QixhQUFYQyxHQUFvQyxZQUFYQSxHQUFzQixJQUFNLCtDQUErQ0EsTUFDaEgsTUFBTTVOLEVBQVMsQ0FBRXU1QixNQUFPNjZHLEVBQVE1NkcsTUFBTzY2RyxFQUFRNTZHLE9BQVE2NkcsR0FDakQ5d0gsRUFBUSxDQUFFNVYsU0FBUUMscUJBQW9CRixZQUU1QyxPQURZLFNBQU82c0csVUFBVSxnQkFBZXg2RyxFQUFRd2pCLE87Ozs7bUVDN0R4RCxnZUFvQ08sTUFBTXFvRSxFQUFnQixhQUFHLENBQUUwb0Q7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUmxDLFNBQXdCaDdHLEdBQ3BCLE1BQU02NkcsRUFBUywwQkFBZ0I3NkcsRUFBTyxRQUFTLGdCQUFpQixXQUNoRSxTQUE0QixJQUFoQjY2RyxFQUFPcGdKLE1BQVksSUFDM0IsNkRBQWdCb2dKLEVBQU9wZ0osVUFDM0IsTUFBTWdNLEVBQVMsQ0FBRXU1QixNQUFPNjZHLEdBRXhCLE9BRFksU0FBTzU1QixVQUFVLGdCQUFleDZHLEVBQVEsUTs7Ozt1RUNqQ3hELG1mQWlETyxNQUFNdzBJLEVBQW9CLGFBQUcsQ0FBRUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBVnRDLFNBQTRCajdHLEVBQU91USxFQUFRQyxFQUFlQyxFQUFlLEdBQUtDLEVBQWlCMkosT0FBT3lHLG1CQUNsRyxNQUFNKzVGLEVBQVMsMEJBQWdCNzZHLEVBQU8sUUFBUyxxQkFDekNrN0csRUFBVSwwQkFBZ0IzcUcsRUFBUSxTQUFVLHFCQUM1Qy9wQyxFQUFTLGdDQUFzQnEwSSxFQUFRSyxFQUFTMXFHLEVBQWVDLEVBQWNDLEdBSTdFMW1CLEVBQVEsQ0FBRXdtQixjQUhoQkEsRUFBZ0JocUMsRUFBT2dxQyxjQUdRQyxhQUYvQkEsRUFBZWpxQyxFQUFPaXFDLGFBRXVCQyxlQUQ3Q0EsRUFBaUJscUMsRUFBT2txQyxnQkFFeEIsT0FBTyxTQUFPc3dFLFVBQVUsc0JBQXFCLENBQUVoaEYsTUFBTzY2RyxFQUFRdHFHLE9BQVEycUcsR0FBV2x4SCxPOzs7OzRFQy9DckYsa2RBOERPLE1BQU1teEg7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdEJiN3VELGVBQXVDdHNELEVBQU91USxFQUFRQyxFQUFlQyxFQUFlLEdBQUtDLEVBQWlCMkosT0FBT3lHLG1CQUM3RyxNQUFNKzVGLEVBQVMsMEJBQWdCNzZHLEVBQU8sUUFBUywwQkFDekNrN0csRUFBVSwwQkFBZ0IzcUcsRUFBUSxTQUFVLDBCQUM1Qy9wQyxFQUFTLGdDQUFzQnEwSSxFQUFRSyxFQUFTMXFHLEVBQWVDLEVBQWNDLEdBQ25GRixFQUFnQmhxQyxFQUFPZ3FDLGNBQ3ZCQyxFQUFlanFDLEVBQU9pcUMsYUFDdEJDLEVBQWlCbHFDLEVBQU9rcUMsZUFDeEIsTUFBTTBxRyxRQUF1Qm41SSxRQUFRWSxJQUFJLENBQUNnNEksRUFBTzE1SSxPQUFRKzVJLEVBQVEvNUksU0FDM0R3dkMsRUFBWXlxRyxFQUFlLEdBQzNCeHFHLEVBQWF3cUcsRUFBZSxJQUk1QixnQkFBRXZxRyxHQUFvQixrQ0FBd0JGLEVBQVdDLEVBQVlKLEVBQWVDLEVBQWNDLEdBT3hHLE9BTkltcUcsSUFBVzc2RyxHQUNYNjZHLEVBQU81d0ksVUFFUGl4SSxJQUFZM3FHLEdBQ1oycUcsRUFBUWp4SSxVQUVMLG1CQUFTNG1DLEVBQWlCLFc7Ozs7NkVDNURyQyx5ZkE4RE8sTUFBTXdxRyxFQUEwQixhQUFHLENBQUVDOzs7Ozs7Ozs7Ozs7Ozs7OztBQWxCNUMsU0FBa0N0N0csRUFBT3VRLEVBQVFDLEVBQWVDLEVBQWUsR0FBS0MsRUFBaUIySixPQUFPeUcsa0JBQW1CN1AsR0FBcUIsR0FDaEosTUFBTTRwRyxFQUFTLDBCQUFnQjc2RyxFQUFPLFFBQVMscUJBQ3pDazdHLEVBQVUsMEJBQWdCM3FHLEVBQVEsU0FBVSxxQkFDNUMxSSxFQUFTLGdDQUFzQmd6RyxFQUFRSyxFQUFTMXFHLEVBQWVDLEVBQWNDLEVBQWdCLE1BSTdGbHFDLEVBQVMsQ0FBRXc1QixNQUFPNjZHLEVBQVF0cUcsT0FBUTJxRyxHQUNsQ2x4SCxFQUFRLENBQ1Z3bUIsY0FMbUIzSSxFQUFPMkksY0FNMUJDLGFBTGtCNUksRUFBTzRJLGFBTXpCQyxlQUxvQjdJLEVBQU82SSxlQU0zQk8sc0JBR0V6dkMsRUFBUyxTQUFPdy9HLFVBQVUsc0JBQXFCeDZHLEVBQVF3akIsR0FDN0QsTUFBTyxDQUFFNm1CLGdCQUFpQnJ2QyxFQUFPLEdBQUkwdkMsYUFBYzF2QyxFQUFPLFE7Ozs7a0ZDNUQ5RCx1aUJBbUVPLE1BQU0rNUk7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdkJianZELGVBQTZDdHNELEVBQU91USxFQUFRQyxFQUFlQyxFQUFlLEdBQUtDLEVBQWlCMkosT0FBT3lHLGtCQUFtQjdQLEdBQXFCLEdBQzNKLE1BQU00cEcsRUFBUywwQkFBZ0I3NkcsRUFBTyxRQUFTLDBCQUN6Q2s3RyxFQUFVLDBCQUFnQjNxRyxFQUFRLFNBQVUsMEJBQzVDMUksRUFBUyxnQ0FBc0JnekcsRUFBUUssRUFBUzFxRyxFQUFlQyxFQUFjQyxFQUFnQixNQUM3RjhxRyxFQUFpQjN6RyxFQUFPMkksY0FDeEJpckcsRUFBZ0I1ekcsRUFBTzRJLGFBQ3ZCaXJHLEVBQWtCN3pHLEVBQU82SSxnQkFDeEJDLEVBQVdDLFNBQW9CM3VDLFFBQVFZLElBQUksQ0FBQ2c0SSxFQUFPMTVJLE9BQVErNUksRUFBUS81SSxVQUlwRSxnQkFBRTB2QyxFQUFlLGFBQUVLLEdBQWlCLGtDQUF3QlAsRUFBV0MsRUFBWTRxRyxFQUFnQkMsRUFBZUMsRUFBaUJ6cUcsR0FPekksT0FOSTRwRyxJQUFXNzZHLEdBQ1g2NkcsRUFBTzV3SSxVQUVQaXhJLElBQVkzcUcsR0FDWjJxRyxFQUFRanhJLFVBRUwsQ0FDSDRtQyxnQkFBaUIsbUJBQVNBLEVBQWlCLFNBQzNDSyxhQUFjLGlCQUFPQSxFQUFjLFk7Ozs7Z0ZDaEUzQyw0ZkFnRU8sTUFBTXlxRyxFQUE2QixhQUFHLENBQUVDOzs7Ozs7Ozs7Ozs7Ozs7OztBQWQvQyxTQUFxQzU3RyxFQUFPdVEsRUFBUUMsRUFBZUMsRUFBZSxHQUFLQyxFQUFpQjJKLE9BQU95RyxrQkFBbUJ4UCxFQUFlLEdBQzdJLE1BQU11cEcsRUFBUywwQkFBZ0I3NkcsRUFBTyxRQUFTLHFCQUN6Q2s3RyxFQUFVLDBCQUFnQjNxRyxFQUFRLFNBQVUscUJBQzVDMUksRUFBUyxnQ0FBc0JnekcsRUFBUUssRUFBUzFxRyxFQUFlQyxFQUFjQyxFQUFnQlksR0FLN0Y5cUMsRUFBUyxDQUFFdzVCLE1BQU82NkcsRUFBUXRxRyxPQUFRMnFHLEdBQ2xDbHhILEVBQVEsQ0FBRXdtQixjQUxoQkEsRUFBZ0IzSSxFQUFPMkksY0FLUUMsYUFKL0JBLEVBQWU1SSxFQUFPNEksYUFJdUJDLGVBSDdDQSxFQUFpQjdJLEVBQU82SSxlQUdxQ1ksYUFGN0RBLEVBQWV6SixFQUFPeUosY0FJaEI5dkMsRUFBUyxTQUFPdy9HLFVBQVUsc0JBQXFCeDZHLEVBQVF3akIsR0FDN0QsTUFBTyxDQUFFNm1CLGdCQUFpQnJ2QyxFQUFPLEdBQUltd0MsZUFBZ0Jud0MsRUFBTyxROzs7O3FGQzlEaEUsMmRBMkVPLE1BQU1xNkk7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMUJidnZELGVBQWdEdHNELEVBQU91USxFQUFRQyxFQUFlQyxFQUFlLEdBQUtDLEVBQWlCMkosT0FBT3lHLGtCQUFtQnhQLEVBQWUsR0FDeEosTUFBTXVwRyxFQUFTLDBCQUFnQjc2RyxFQUFPLFFBQVMsMEJBQ3pDazdHLEVBQVUsMEJBQWdCM3FHLEVBQVEsU0FBVSwwQkFDNUMxSSxFQUFTLGdDQUFzQmd6RyxFQUFRSyxFQUFTMXFHLEVBQWVDLEVBQWNDLEVBQWdCWSxHQUNuR2QsRUFBZ0IzSSxFQUFPMkksY0FDdkJDLEVBQWU1SSxFQUFPNEksYUFDdEJDLEVBQWlCN0ksRUFBTzZJLGVBQ3hCWSxFQUFlekosRUFBT3lKLGFBQ3RCLE1BQU04cEcsUUFBdUJuNUksUUFBUVksSUFBSSxDQUFDZzRJLEVBQU8xNUksT0FBUSs1SSxFQUFRLzVJLFNBQzNEd3ZDLEVBQVl5cUcsRUFBZSxHQUMzQnhxRyxFQUFhd3FHLEVBQWUsSUFJNUIsZ0JBQUV2cUcsRUFBZSxlQUFFYyxHQUFtQixrQ0FBd0JoQixFQUFXQyxFQUFZSixFQUFlQyxFQUFjQyxFQUFnQlksR0FPeEksT0FOSXVwRyxJQUFXNzZHLEdBQ1g2NkcsRUFBTzV3SSxVQUVQaXhJLElBQVkzcUcsR0FDWjJxRyxFQUFRanhJLFVBRUwsQ0FDSDRtQyxnQkFBaUIsbUJBQVNBLEVBQWlCLFNBQzNDYyxlQUFnQixtQkFBU0EsTTs7OztvRUN4RWpDLGtqQkErRE8sTUFBTStDLEVBQWlCLGFBQUcsQ0FBRW9uRzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF4Qm5DLFNBQXlCbm5HLEVBQVE3eEMsRUFBTTh4QyxHQUFlLEVBQU9DLEdBQW1CLEdBQzVFLE1BQU1rbkcsRUFBVSwwQkFBZ0JwbkcsRUFBUSxTQUFVLGtCQUNsRCxTQUE2QixJQUFqQm9uRyxFQUFRdmhKLE1BQStCLElBQWpCdWhKLEVBQVF2aEosTUFBWSxJQUNsRCxnRUFBUXVoSixFQUFRdmhKLFVBQ3BCLFNBQTRCLElBQWhCc0ksRUFBSzlJLFFBQWMsSUFDM0IsNkRBQUc4SSxPQUNQLFVBQWlDLElBQXJCK3hDLElBQStDLElBQWpCRCxHQUF3QixJQUFNLHNGQUV4RSxJQUFJb25HLEVBQWNELEVBQ2RqUSxHQUFlLEVBQ0UsSUFBakJpUSxFQUFRdmhKLE9BQ1JzeEksR0FBZSxFQUNma1EsRUFBYyxrQkFBUUQsRUFBUyxDQUFDLEVBQUdBLEVBQVFqaUosTUFBTSxHQUFJaWlKLEVBQVFqaUosTUFBTSxHQUFJaWlKLEVBQVFqaUosTUFBTSxNQUV6RixRQUFXZ0osRUFDTDBELEVBQVMsQ0FBRW11QyxPQUFRcW5HLEdBQ25CaHlILEVBQVEsQ0FBRTRxQixlQUFjQyxtQkFBa0IveEMsUUFFMUM3QixFQUFNLFNBQU8rL0csVUFBVSxpQkFBZ0J4NkcsRUFBUXdqQixHQUNyRCxPQUFJOGhILEVBQ08sa0JBQVE3cUksRUFBSyxDQUFDQSxFQUFJbkgsTUFBTSxHQUFJbUgsRUFBSW5ILE1BQU0sR0FBSW1ILEVBQUluSCxNQUFNLEtBRXhEbUgsTTs7OzsyRUM3RFgseWpCQWlFTyxNQUFNazBDLEVBQXdCLGFBQUcsQ0FBRThtRzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF6QjFDLFNBQWdDdG5HLEVBQVE3eEMsRUFBTTh4QyxHQUFlLEVBQU9DLEdBQW1CLEdBQ25GLE1BQU1rbkcsRUFBVSwwQkFBZ0JwbkcsRUFBUSxTQUFVLHlCQUNsRCxTQUE2QixJQUFqQm9uRyxFQUFRdmhKLE1BQStCLElBQWpCdWhKLEVBQVF2aEosTUFBWSxJQUNsRCx1RUFBUXVoSixFQUFRdmhKLFVBQ3BCLFNBQTRCLElBQWhCc0ksRUFBSzlJLFFBQWMsSUFDM0Isb0VBQUc4SSxPQUNQLFNBQThCLFlBQWxCaTVJLEVBQVF0aEosT0FBeUMsVUFBbEJzaEosRUFBUXRoSixPQUFtQixJQUFNLHFEQUM1RSxVQUFpQyxJQUFyQm82QyxJQUErQyxJQUFqQkQsR0FBd0IsSUFBTSw2RkFFeEUsSUFBSW9uRyxFQUFjRCxFQUNkalEsR0FBZSxFQUNFLElBQWpCaVEsRUFBUXZoSixPQUNSc3hJLEdBQWUsRUFDZmtRLEVBQWMsa0JBQVFELEVBQVMsQ0FBQyxFQUFHQSxFQUFRamlKLE1BQU0sR0FBSWlpSixFQUFRamlKLE1BQU0sR0FBSWlpSixFQUFRamlKLE1BQU0sTUFFekYsUUFBV2dKLEVBQ0wwRCxFQUFTLENBQUVtdUMsT0FBUXFuRyxHQUNuQmh5SCxFQUFRLENBQUU0cUIsZUFBY0MsbUJBQWtCL3hDLFFBRTFDN0IsRUFBTSxTQUFPKy9HLFVBQVUsd0JBQXVCeDZHLEVBQVF3akIsR0FDNUQsT0FBSThoSCxFQUNPLGtCQUFRN3FJLEVBQUssQ0FBQ0EsRUFBSW5ILE1BQU0sR0FBSW1ILEVBQUluSCxNQUFNLEdBQUltSCxFQUFJbkgsTUFBTSxLQUV4RG1ILE07Ozs7c0VDL0RYLG1lQThDTyxNQUFNbzBGLEVBQW1CLGFBQUcsQ0FBRTZtRDs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFUckMsU0FBMkJuOEcsRUFBTzRWLEVBQVNDLEVBQVksRUFBR0MsRUFBUyxJQUMvRCxNQUFNK2tHLEVBQVMsMEJBQWdCNzZHLEVBQU8sUUFBUyxtQkFBb0IsV0FDbkUsU0FBNEIsSUFBaEI2NkcsRUFBT3BnSixNQUFZLElBQzNCLGdFQUFnQm9nSixFQUFPcGdKLFVBQzNCLE1BQU1nTSxFQUFTLENBQUV1NUIsTUFBTzY2RyxHQUNsQjV3SCxFQUFRLENBQUUyckIsVUFBU0MsWUFBV0MsVUFFcEMsT0FEWSxTQUFPbXJFLFVBQVUsbUJBQWtCeDZHLEVBQVF3akIsTzs7OzsrREMzQzNELHFsREFrSE8sTUFBTWxTLEVBQVksYUFBRyxDQUFFcWtJOzs7Ozs7Ozs7Ozs7Ozs7OztBQS9EOUIsU0FBb0JwOEcsRUFBTzNyQixFQUFTLFNBQVVnb0ksR0FBVyxFQUFPQyxFQUFjLElBQzFFLE1BQU16QixFQUFTLDBCQUFnQjc2RyxFQUFPLFFBQVMsYUFNekN1OEcsRUFBcUIxQixFQUFPOWdKLE1BQU0sR0FBSzhnSixFQUFPOWdKLE1BQU0sR0FDMUQsSUFDSTlDLEVBQUc4eUgsRUFBRzkrRixFQUFHdXhILEVBRFRDLEVBQWEsY0FBSSxtQkFBUyxDQUFDSCxJQUFlLEtBVTlDLEdBUkEsU0FBNEIsSUFBaEJ6QixFQUFPcGdKLE1BQVksSUFDM0IseURBQWdCb2dKLEVBQU9wZ0osVUFDM0IsU0FBZ0MsSUFBcEJvZ0osRUFBTzlnSixNQUFNLElBQWdDLElBQXBCOGdKLEVBQU85Z0osTUFBTSxJQUFVLElBRXhELDBFQUFXOGdKLEVBQU85Z0osTUFBTSxRQUM1QixTQUE2QixVQUFqQjhnSixFQUFPbmdKLE9BQXNDLFlBQWpCbWdKLEVBQU9uZ0osT0FBcUIsSUFDaEUsc0VBQWlCbWdKLEVBQU9uZ0osV0FDNUIsU0FBdUIsU0FBWDJaLEdBQWdDLFdBQVhBLEdBQXFCLElBQU0sMENBQTBDQSxNQUM5RSxJQUFwQndtSSxFQUFPOWdKLE1BQU0sR0FBVSxFQUN0QjlDLEVBQUc4eUgsRUFBRzkrRixHQUFLLGdCQUFNNHZILEVBQVEsQ0FBQyxFQUFHLEVBQUcsSUFBSyxHQUN0QyxNQUFNNkIsRUFBSyxjQUFJemxKLEVBaEJRLE9BaUJqQjBsSixFQUFLLGNBQUk1eUIsRUFoQlUsTUFpQm5CMGdCLEVBQUssY0FBSXgvRyxFQWhCUyxNQWlCeEJ1eEgsRUFBWSxjQUFJLGNBQUlFLEVBQUlDLEdBQUtsUyxRQUc3QitSLEVBQVl4OEcsRUFFaEIsR0FBZSxTQUFYM3JCLEVBQW1CLENBRW5Cb29JLEVBT1IsU0FBY0csRUFBVzFtRixHQUNyQixJQUdJMm1GLEVBQVlDLEVBQWFDLEVBQVdDLEVBQVNDLEVBQWtCQyxFQUgvREMsRUFBYSxtQkFBUyxFQUFFLElBQ3hCQyxFQUFlLG1CQUFTLENBQUMsSUFDekJDLEVBQVksbUJBQVMsQ0FBQyxJQUUxQixJQUFLLElBQUk3OEgsRUFBUSxFQUFHQSxFQUFRbzhILEVBQVU3NUksS0FBTyxFQUFHeWQsSUFBUyxDQUNyRHE4SCxFQUFhLGdCQUFNRCxFQUFXLEVBQUdwOEgsRUFBUSxHQUN6Q3M4SCxFQUFjLGdCQUFNRixFQUFXcDhILEVBQVEsR0FDdkN5OEgsRUFBbUIsY0FBSSxjQUFJSixHQUFhM21GLEdBQ3hDZ25GLEVBQWEsY0FBSSxjQUFJSixHQUFjNW1GLEdBQ25DLE1BQU1vbkYsRUFBZ0IsY0FBSSxjQUFJVCxFQUFZLGdCQUFNLEVBQUdBLEVBQVc5NUksUUFDOURnNkksRUFBWSxjQUFJTyxFQUFlLGNBQUlULElBQ25DLE1BQU1VLEVBQWMsZUFBS1QsRUFBWS9pSixNQUFPOGlKLEVBQVc5NUksTUFDakR5NkksRUFBYSxjQUFJLGdCQUFNLEVBQUdWLEVBQVkvNUksTUFBT3c2SSxHQUM3Q0UsRUFBYSxjQUFJWCxFQUFhLEdBQ3BDRSxFQUFVLGNBQUksY0FBSVMsR0FBYSxjQUFJWCxJQUNuQyxNQUFNWSxFQUFnQixjQUFJWCxFQUFXQyxHQUMvQlcsRUFBZ0IsY0FBSVosRUFBV0MsR0FDL0JZLEVBQWUsY0FBSVgsRUFBa0JDLEdBQzNDRyxFQUFZLGNBQUksY0FBSU8sRUFBY0YsR0FBZ0JDLEdBQ2xELE1BQU01MkksRUFBWSxrQkFBUXMySSxFQUFXRCxHQUNyQ0EsRUFBZSxnQkFBTXIySSxFQUFXczJJLEVBQVdELEdBQzNDRCxFQUFhLGdCQUFNcDJJLEVBQVcsbUJBQVMsQ0FBQ3laLElBQVMyOEgsR0FFckQsT0FBT0EsRUEvQlVVLENBRE0sbUJBQVMsZUFBSyxnQkFBTXJCLEdBQVksU0FBVSxpQkFBTyxJQUFLLEtBQzNDRCxHQUVsQyxNQUFNdUIsRUFBZXpCLEVBQ2pCLG9CQUFVRyxFQUFXQyxHQUFjLGtCQUFRRCxFQUFXQyxHQUUxRCxPQURlLGVBQUssY0FBSXFCLEVBQWMsS0FBTSxhOzs7OytEQ3JGaEQsNGRBa0VPLE1BQU16OEYsRUFBWSxhQUFHLENBQUUwOEY7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZjlCLFNBQW9CLzlHLEVBQU9zaEIsRUFBWUMsRUFBZ0IsVUFBV0MsRUFBVyxXQUFZM0wsRUFBWSxFQUFHeDlDLEdBQ3BHLE1BQU13aUosRUFBUywwQkFBZ0I3NkcsRUFBTyxRQUFTLFlBQWEsV0FDdERnK0csRUFBYywwQkFBZ0IxOEYsRUFBWSxhQUFjLFlBQWEsV0FDM0UsU0FBNEIsSUFBaEJ1NUYsRUFBT3BnSixNQUFZLElBQzNCLHlEQUFnQm9nSixFQUFPcGdKLFVBQzNCLFNBQWlDLElBQXJCdWpKLEVBQVl2akosT0FDbkJ1akosRUFBWWprSixNQUFNLEtBQU84Z0osRUFBTzlnSixNQUFNLElBQ1YsSUFBekJpa0osRUFBWWprSixNQUFNLEtBQ0csSUFBekJpa0osRUFBWWprSixNQUFNLElBQVUsSUFBTSxxRUFDdEMsU0FBMkIsTUFBZjFCLEdBQThDLElBQXZCQSxFQUFZNEIsUUFBYyxJQUN6RCw0RUFBVzVCLE9BQ2YsTUFBTW9PLEVBQVMsQ0FBRXU1QixNQUFPNjZHLEVBQVF2NUYsV0FBWTA4RixHQUN0Qy96SCxFQUFRLENBQUVzM0IsZ0JBQWVDLFdBQVUzTCxZQUFXeDlDLGVBQ3BELE9BQU8sU0FBTzRvSCxVQUFVLFlBQVd4NkcsRUFBUXdqQixPOzs7O2lFQ2hFL0MseVNBZ0ZPLE1BQU1nMEg7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNUNiMXhELGVBQTRCNmxELEVBQWE4TCxFQUFTdDZHLEVBQUksR0FDbEQsTUFBTTJ1RyxFQUFlLDBCQUFnQkgsRUFBYSxjQUFlLFVBQzNEK0wsRUFBVywwQkFBZ0JELEVBQVMsVUFBVyxVQUNyRCxpQkFBTzNMLEVBQWE5M0ksS0FBTyxHQUFHLElBQzFCLHVFQUFXODNJLEVBQWE5M0ksU0FDNUIsaUJBQU84M0ksRUFBYTkzSSxLQUFPLElBQU0wakosRUFBUzFqSixNQUFNLElBRTVDLG1GQUFHODNJLEVBQWE5M0kseUJBQXlCMGpKLEVBQVMxakosU0FDdEQsNEJBQWtCODNJLEVBQWF4NEksTUFBTUssTUFBTSxFQUFHbTRJLEVBQWF4NEksTUFBTUUsT0FBUyxHQUFJa2tKLEVBQVNwa0osTUFBTywyRkFFOUYsTUFBTXFtRCxFQUFVbXlGLEVBQWF4NEksTUFBTXc0SSxFQUFheDRJLE1BQU1FLE9BQVMsR0FDL0QsaUJBQU8ycEMsRUFBSSxHQUFLQSxHQUFLd2MsR0FBUyxJQUMxQiw0RUFBY0EsZUFBcUJ4YyxNQUN2QyxNQUFNdzZHLFFBQXdCN0wsRUFBYW54SSxPQUNyQ2k5SSxRQUFvQkYsRUFBUy84SSxRQUc1Qm1ULEVBQU94UixHQUFRLENBQUNxN0ksRUFBZ0Jua0osT0FBU21tRCxFQUFTQSxHQUNuRGsrRixFQUFZLGlDQUF1QixPQUFRL3BJLEdBQ2pELElBQUssSUFBSTBXLEVBQUksRUFBR0EsRUFBSTFXLEVBQU8wVyxJQUFLLENBQzVCLE1BQU0rTixFQUFTL04sRUFBSWxvQixFQUNiVCxFQUFPODdJLEVBQWdCeDZJLFNBQVNvMUIsRUFBUUEsRUFBU2oyQixHQUNqRDY3RSxFQUFZLEdBQ2xCLElBQUssSUFBSXpvRixFQUFJLEVBQUdBLEVBQUltTSxFQUFLckksT0FBUTlELElBQzdCeW9GLEVBQVU5bEYsS0FBSyxDQUFFMUIsTUFBT2tMLEVBQUtuTSxHQUFJcXFCLE1BQU9ycUIsSUFFNUN5b0YsRUFBVUMsTUFBSyxDQUFDcnpFLEVBQUd5ZixJQUFNQSxFQUFFN3pCLE1BQVFvVSxFQUFFcFUsUUFDckNrbkosRUFBVXJ6SCxHQUFLLEVBQ2YsSUFBSyxJQUFJOTBCLEVBQUksRUFBR0EsRUFBSXl0QyxFQUFHenRDLElBQ25CLEdBQUl5b0YsRUFBVXpvRixHQUFHcXFCLFFBQVU2OUgsRUFBWXB6SCxHQUFJLENBQ3ZDcXpILEVBQVVyekgsR0FBSyxFQUNmLE9BV1osT0FQSW1uSCxJQUFnQkcsR0FDaEJBLEVBQWFyb0ksVUFFYmcwSSxJQUFZQyxHQUNaQSxFQUFTajBJLFVBR04saUJBQU9vMEksRUFBV0gsRUFBU3BrSixNQUFPLFU7Ozs7OERDOUU3Qyx1WUFxQ08sTUFBTW13QyxFQUFXLGFBQUcsQ0FBRXEwRzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFMN0IsU0FBbUJyakosR0FDZixNQUNNdUwsRUFBUyxDQUFFdkwsRUFETiwwQkFBZ0JBLEVBQUcsSUFBSyxhQUVuQyxPQUFPLFNBQU8rbEgsVUFBVSxXQUFVeDZHLE87Ozs7MkRDbkN0QyxvWUFxQ08sTUFBTTJqQyxFQUFRLGFBQUcsQ0FBRW8wRzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFMMUIsU0FBZ0J0akosR0FDWixNQUNNdUwsRUFBUyxDQUFFdkwsRUFETiwwQkFBZ0JBLEVBQUcsSUFBSyxVQUVuQyxPQUFPLFNBQU8rbEgsVUFBVSxRQUFPeDZHLE87Ozs7MkRDbkNuQyxvWUFxQ08sTUFBTTZqQyxFQUFRLGFBQUcsQ0FBRW0wRzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFMMUIsU0FBZ0J2akosR0FDWixNQUNNdUwsRUFBUyxDQUFFdkwsRUFETiwwQkFBZ0JBLEVBQUcsSUFBSyxVQUVuQyxPQUFPLFNBQU8rbEgsVUFBVSxRQUFPeDZHLE87Ozs7K0RDbkNuQyx3WUEyQ08sTUFBTXVrQyxFQUFZLGFBQUcsQ0FBRTB6Rzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFOOUIsU0FBb0J4akosRUFBRytTLEVBQVEsSUFDM0IsTUFDTXhILEVBQVMsQ0FBRXZMLEVBRE4sMEJBQWdCQSxFQUFHLElBQUssY0FFN0IrdUIsRUFBUSxDQUFFaGMsU0FDaEIsT0FBTyxTQUFPZ3pHLFVBQVUsWUFBV3g2RyxFQUFRd2pCLE87Ozs7MERDekMvQyxzakJBNENPLE1BQU1raEIsRUFBTyxhQUFHLENBQUV3ekc7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUnpCLFNBQWVuekksRUFBR3lmLEdBQ2QsSUFBSXUvRyxFQUFLLDBCQUFnQmgvSCxFQUFHLElBQUssT0FBUSxxQkFDckNpL0gsRUFBSywwQkFBZ0J4L0csRUFBRyxJQUFLLE9BQVEsc0JBQ3hDdS9HLEVBQUlDLEdBQU0seUJBQWVELEVBQUlDLEdBQzlCLHFDQUEyQkQsRUFBR3p3SSxNQUFPMHdJLEVBQUcxd0ksT0FDeEMsTUFBTTBNLEVBQVMsQ0FBRStFLEVBQUdnL0gsRUFBSXYvRyxFQUFHdy9HLEdBQzNCLE9BQU8sU0FBT3hwQixVQUFVLE9BQU14NkcsTzs7OzsrREMxQ2xDLDJqQkE2Q08sTUFBTThrQyxFQUFZLGFBQUcsQ0FBRXF6Rzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFSOUIsU0FBb0JwekksRUFBR3lmLEdBQ25CLElBQUl1L0csRUFBSywwQkFBZ0JoL0gsRUFBRyxJQUFLLFlBQWEscUJBQzFDaS9ILEVBQUssMEJBQWdCeC9HLEVBQUcsSUFBSyxZQUFhLHNCQUM3Q3UvRyxFQUFJQyxHQUFNLHlCQUFlRCxFQUFJQyxHQUM5QixxQ0FBMkJELEVBQUd6d0ksTUFBTzB3SSxFQUFHMXdJLE9BQ3hDLE1BQU0wTSxFQUFTLENBQUUrRSxFQUFHZy9ILEVBQUl2L0csRUFBR3cvRyxHQUMzQixPQUFPLFNBQU94cEIsVUFBVSxZQUFXeDZHLE87Ozs7OERDM0N2Qyw4cUNBaUdPLE1BQU1vNEksRUFBVyxhQUFHLENBQUVDOzs7Ozs7Ozs7Ozs7Ozs7OztBQTdCN0IsU0FBbUJ0ekksRUFBR3V6SSxFQUFVQyxHQUM1QixpQkFBT0QsRUFBVyxHQUFNLEdBQUcsSUFBTSxnREFBZ0RBLE9BQ2pGLGlCQUFPQyxFQUFXLEdBQU0sR0FBRyxJQUFNLGdEQUFnREEsT0FDakYsTUFBTXhVLEVBQUssMEJBQWdCaC9ILEVBQUcsSUFBSyxZQUNuQyxpQkFBT2cvSCxFQUFHL3ZJLE1BQVEsR0FBRyxJQUFNLDRDQUE0Qyt2SSxFQUFHL3ZJLFVBQzFFLE1BQU1WLEVBQVF5d0ksRUFBR3p3SSxPQUNWa2xKLEVBQUdDLEdBQUsxVSxFQUFHendJLE1BQU1LLE9BQU8sR0FDL0IsS0FBTTJrSixHQUFZRSxHQUNkLE1BQU0sSUFBSW5nSixNQUFNLHlCQUF5QmlnSixtREFDWUUsT0FFekQsS0FBTUQsR0FBWUUsR0FDZCxNQUFNLElBQUlwZ0osTUFBTSx5QkFBeUJrZ0osc0RBQ2VFLE9BRXhESCxFQUFXLElBQ1hBLEVBQVdFLEdBRVhELEVBQVcsSUFDWEEsRUFBV0UsR0FFZixNQUFNL29KLEVBQUksa0JBQVEsZ0JBQU0sRUFBRzhvSixFQUFHLEVBQUcsU0FBVSxFQUFFLEVBQUcsSUFDMUMvNEYsRUFBSSxnQkFBTSxFQUFHZzVGLEVBQUcsRUFBRyxTQUNuQkMsRUFBSyxjQUFJaHBKLEVBQUcrdkQsR0FDWms1RixFQUFTLHFCQUFXLG9CQUFVRCxFQUFJLGtCQUFRSixFQUFVLFVBQVcsdUJBQWFJLEVBQUksa0JBQVFILEVBQVUsV0FDbEd4NUUsRUFBTyxnQkFBTSxDQUFDeTVFLEVBQUdDLEdBQUkxVSxFQUFHOXZJLE9BQzlCLE9BQU8sa0JBQVEsZ0JBQU0sa0JBQVEsa0JBQVE4dkksRUFBSSxFQUFFLEVBQUd5VSxFQUFHQyxLQUM1Q3ptSixLQUFJNG1KLEdBQU8sZ0JBQU1ELEVBQVFDLEVBQUs3NUUsTUFBU3pyRSxPOzs7O2lFQy9GaEQsODNCQThGTyxNQUFNdWxKLEVBQWMsYUFBRyxDQUFFQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF2Q2hDLFNBQXNCNzVCLEdBQ2xCLElBQUk4NUIsRUFDSixHQUFJN3VJLE1BQU1zdkQsUUFBUXlsRCxHQUFLLENBQ25CODVCLEdBQWtCLEVBQ2xCLGlCQUFhLE1BQU45NUIsR0FBY0EsRUFBR3pySCxPQUFTLEdBQUcsSUFBTSxzRUFFMUMsTUFBTWdyQyxFQUFNeWdGLEVBQUcsR0FBRzNySCxNQUFNLEdBQ3hCLElBQUssSUFBSTVELEVBQUksRUFBR0EsRUFBSXV2SCxFQUFHenJILFNBQVU5RCxFQUM3QixpQkFBT3V2SCxFQUFHdnZILEdBQUc0RCxNQUFNLEtBQU9rckMsR0FBSyxJQUMzQixpRUFBSXlnRixFQUFHdnZILEdBQUc0RCxNQUFNLFVBQVVrckMsWUFJbEN1NkcsR0FBa0IsRUFDbEI5NUIsRUFBSyxnQkFBTUEsRUFBSUEsRUFBRzNySCxNQUFNLEdBQUksR0FBR3RCLEtBQUl5QyxHQUFLLGtCQUFRQSxFQUFHLENBQUMsTUFFeEQsaUJBQU93cUgsRUFBR3pySCxRQUFVeXJILEVBQUcsR0FBRzNySCxNQUFNLElBQUksSUFBTSxvQ0FBb0MyckgsRUFBR3pySCx5Q0FDcER5ckgsRUFBRyxHQUFHM3JILE1BQU0sU0FDekMsTUFBTTBsSixFQUFLLEdBQ0xDLEVBQU9oNkIsRUFDYixJQUFLLElBQUl2dkgsRUFBSSxFQUFHQSxFQUFJdXZILEVBQUd6ckgsU0FBVTlELEVBQzdCc3BKLEVBQUczbUosS0FBSyxTQUFPMG5ILE1BQUssS0FDaEIsSUFBSXRsSCxFQUFJd2tKLEVBQUt2cEosR0FDYixHQUFJQSxFQUFJLEVBQ0osSUFBSyxJQUFJK3ZELEVBQUksRUFBR0EsRUFBSS92RCxJQUFLK3ZELEVBQUcsQ0FDeEIsTUFBTXk1RixFQUFPLGNBQUksY0FBSSxjQUFJRixFQUFHdjVGLEdBQUlockQsSUFBS3VrSixFQUFHdjVGLElBQ3hDaHJELEVBQUksY0FBSUEsRUFBR3lrSixHQUduQixPQUFPLGNBQUl6a0osRUFBRyxlQUFLQSxFQUFHLGtCQUc5QixPQUFJc2tKLEVBQ08sZ0JBQU1DLEVBQUksR0FHVkEsTTs7Ozt3REMzRmYsa3BEQTRHQSxTQUFTRyxFQUFLMWtKLEVBQUcya0osR0FBZSxHQUM1QixPQUFPLFNBQU9yL0IsTUFBSyxLQUNmLGlCQUEwQixJQUFuQnRsSCxFQUFFbkIsTUFBTUUsUUFBYyxJQUFNLDBDQUEwQ2lCLEVBQUVuQixNQUFNRSxvQkFDckYsTUFBTTFELEVBQUkyRSxFQUFFbkIsTUFBTSxHQUNabkMsRUFBSXNELEVBQUVuQixNQUFNLEdBQ2xCLElBQUk2ekUsRUFBSSxjQUFJcjNFLEdBQ1JVLEVBQUksZ0JBQU1pRSxHQUNkLE1BQU00a0osRUFBUSxtQkFBUyxDQUFDLENBQUMsSUFBSyxDQUFDLEVBQUcsSUFDbEMsSUFBSXAzSCxFQUFJLGdCQUFNbzNILEdBQ2QsTUFBTUMsRUFBUXhwSixHQUFLcUIsRUFBSUEsRUFBSXJCLEVBQzNCLElBQUssSUFBSTJ2RCxFQUFJLEVBQUdBLEVBQUk2NUYsSUFBUzc1RixFQUFHLENBRzVCLE1BQU04NUYsRUFBUS9vSixFQUNSZ3BKLEVBQVF2M0gsRUFDUnczSCxFQUFRdHlFLEdBQ2JsbEQsRUFBR3p4QixFQUFHMjJFLEdBQUssU0FBTzR5QyxNQUFLLEtBRXBCLE1BQU0yL0IsRUFBUyxnQkFBTWxwSixFQUFHLENBQUNpdkQsRUFBR0EsR0FBSSxDQUFDM3ZELEVBQUkydkQsRUFBRyxJQUNsQ2s2RixFQUFRLGVBQUtELEdBQ2JFLEVBQU0sZ0JBQU1wcEosRUFBRyxDQUFDaXZELEVBQUdBLEdBQUksQ0FBQyxFQUFHLElBRTNCaHVELEVBQUksZ0JBQU0sa0JBQVFtb0osRUFBSyxHQUFJLG1CQUFTLENBQUMsRUFBRSxLQUFNLG1CQUFTLENBQUMsQ0FBQyxNQUN4RDkvQyxFQUFLLGNBQUk4L0MsRUFBSyxjQUFJbm9KLEVBQUdrb0osSUFDckJFLEVBQU8sY0FBSUgsRUFBUTUvQyxHQUVyQjczRSxFQURrQixJQUFsQjQzSCxFQUFLdm1KLE1BQU0sR0FDUCxnQkFBTStsSixHQUdOLGlCQUFPLENBQ1BBLEVBQ0EsZ0JBQU1RLEVBQU0sQ0FBQyxFQUFHLEdBQUksQ0FBQ0EsRUFBS3ZtSixNQUFNLEdBQUssRUFBR3VtSixFQUFLdm1KLE1BQU0sTUFDcEQsR0FFUCxNQUFNd21KLEVBQU0sY0FBSSxjQUFJLGlCQUFPcm9KLEVBQUdxb0csR0FBSzYvQyxJQUU3QkksRUFBVyxnQkFBTXZwSixFQUFHLENBQUNpdkQsRUFBRyxHQUFJLENBQUMzdkQsRUFBSTJ2RCxFQUFHdHVELElBQ3BDNm9KLEVBQVksY0FBSUYsRUFBSzczSCxHQUNyQmc0SCxFQUFLLG9CQUFVaDRILEdBQ3JCLEdBQVUsSUFBTnc5QixFQUNBanZELEVBQUksY0FBSXVwSixFQUFVLGlCQUFPQyxFQUFXLGlCQUFPQyxFQUFJRixTQUU5QyxDQUNELE1BQU1HLEVBQVksY0FBSUgsRUFBVSxpQkFBT0MsRUFBVyxpQkFBT0MsRUFBSUYsS0FDN0R2cEosRUFBSSxpQkFBTyxDQUFDLGdCQUFNQSxFQUFHLENBQUMsRUFBRyxHQUFJLENBQUNpdkQsRUFBR3R1RCxJQUFLK29KLEdBQVksR0FFdEQsTUFBTUMsRUFBYSxvQkFBVUgsR0FDdkJJLEVBQVcsZ0JBQU1qekUsRUFBRyxDQUFDLEVBQUcxbkIsR0FBSSxDQUFDM3ZELEVBQUdxM0UsRUFBRTd6RSxNQUFNLEdBQUttc0QsSUFDbkQsR0FBVSxJQUFOQSxFQUNBMG5CLEVBQUksY0FBSWl6RSxFQUFVLGlCQUFPLGlCQUFPQSxFQUFVbjRILEdBQUlrNEgsUUFFN0MsQ0FDRCxNQUFNRSxFQUFZLGNBQUlELEVBQVUsaUJBQU8saUJBQU9BLEVBQVVuNEgsR0FBSWs0SCxJQUM1RGh6RSxFQUFJLGlCQUFPLENBQUMsZ0JBQU1BLEVBQUcsQ0FBQyxFQUFHLEdBQUksQ0FBQ3IzRSxFQUFHMnZELElBQUs0NkYsR0FBWSxHQUV0RCxNQUFPLENBQUNwNEgsRUFBR3p4QixFQUFHMjJFLE1BRWxCLGtCQUFRLENBQUNveUUsRUFBT0MsRUFBT0MsSUFNM0IsT0FKS0wsR0FBZ0J0cEosRUFBSXFCLElBQ3JCZzJFLEVBQUksZ0JBQU1BLEVBQUcsQ0FBQyxFQUFHLEdBQUksQ0FBQ3IzRSxFQUFHcUIsSUFDekJYLEVBQUksZ0JBQU1BLEVBQUcsQ0FBQyxFQUFHLEdBQUksQ0FBQ1csRUFBR0EsS0FFdEIsQ0FBQ2cyRSxFQUFHMzJFLE1BR1osTUFBTThwSixFQUFLLGFBQUcsQ0FBRUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBOUZ2QixTQUFhOWxKLEVBQUcya0osR0FBZSxHQUUzQixHQURBLGlCQUFPM2tKLEVBQUVULE1BQVEsR0FBRyxJQUFNLGdFQUFnRVMsRUFBRVQsU0FDN0UsSUFBWFMsRUFBRVQsS0FDRixPQUFPbWxKLEVBQUsxa0osRUFBRzJrSixHQUVkLENBS0QsTUFBTW9CLEVBQWdCL2xKLEVBQUVuQixNQUFNSyxNQUFNLEVBQUdjLEVBQUVuQixNQUFNRSxPQUFTLEdBQ25EaXlCLFFBQU8sQ0FBQzkwQixFQUFPOHBKLElBQVM5cEosRUFBUThwSixJQUMvQkMsRUFBTyxrQkFBUSxrQkFBUWptSixFQUFHLENBQzVCK2xKLEVBQWUvbEosRUFBRW5CLE1BQU1tQixFQUFFbkIsTUFBTUUsT0FBUyxHQUN4Q2lCLEVBQUVuQixNQUFNbUIsRUFBRW5CLE1BQU1FLE9BQVMsS0FDekIsR0FDRW1uSixFQUFPLEdBQ1BDLEVBQU8sR0FDYkYsRUFBS3ZvSixTQUFRMG9KLElBQ1QsTUFBT0MsRUFBS0MsR0FBTzVCLEVBQUswQixFQUFLekIsR0FDN0J1QixFQUFLdG9KLEtBQUt5b0osR0FDVkYsRUFBS3ZvSixLQUFLMG9KLE1BSWQsTUFBTyxDQUZHLGtCQUFRLGdCQUFNSixFQUFNLEdBQUlsbUosRUFBRW5CLE9BQzFCLGtCQUFRLGdCQUFNc25KLEVBQU0sR0FBSW5tSixFQUFFbkIsYTs7Ozs4REN4RzVDOzs7Ozs7Ozs7Ozs7Ozs7OztBQThCTyxTQUFTMG5KLEVBQVNqZ0osRUFBT2txQyxFQUFNam9DLEdBQ2xDLEdBQUlBLEdBQU8sRUFDUCxNQUFNLElBQUkzRSxNQUFNLDRDQUVwQixNQUFNbXJCLEVBQVEsQ0FBRXpvQixRQUFPa3FDLE9BQU1qb0MsT0FDN0IsT0FBTyxTQUFPdzlHLFVBQVUsV0FBVSxHQUFJaDNGLEs7Ozs7Z0ZDbkMxQyxnakJBNERPLE1BQU15M0gsRUFBNkIsYUFBRyxDQUFFQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF2Qi9DLFNBQXFDem1KLEVBQUd1dkMsRUFBYyxFQUFHN1QsRUFBTyxFQUFHM29CLEVBQVEsRUFBR3k4QixFQUFPLElBQ2pGLE1BQU16VyxFQUFLLDBCQUFnQi80QixFQUFHLElBQUssOEJBQ25DLFNBQXdCLElBQVorNEIsRUFBR3g1QixNQUEwQixJQUFadzVCLEVBQUd4NUIsTUFBWSxJQUFNLDJGQUNoQ3c1QixFQUFHeDVCLFVBQ3JCLFNBQVksUUFBV2d3QyxJQUFjLElBQ2pDLDJGQUErQkEsT0FDbkMsSUFBSXFoRyxFQUFNNzNHLEVBQ044M0csR0FBZSxFQUNILElBQVo5M0csRUFBR3g1QixPQUNIc3hJLEdBQWUsRUFDZkQsRUFBTSxrQkFBUTczRyxFQUFJLENBQUMsRUFBR0EsRUFBR2w2QixNQUFNLEdBQUlrNkIsRUFBR2w2QixNQUFNLEdBQUlrNkIsRUFBR2w2QixNQUFNLE1BRTdELE1BQU0wTSxFQUFTLENBQUV2TCxFQUFHNHdJLEdBQ2Q3aEgsRUFBUSxDQUFFd2dCLGNBQWE3VCxPQUFNM29CLFFBQU95OEIsUUFFcEN4cEMsRUFBTSxTQUFPKy9HLFVBQVUsTUFBS3g2RyxFQUFRd2pCLEdBQzFDLE9BQUk4aEgsRUFDTyxrQkFBUTdxSSxFQUFLLENBQUNBLEVBQUluSCxNQUFNLEdBQUltSCxFQUFJbkgsTUFBTSxHQUFJbUgsRUFBSW5ILE1BQU0sS0FHcERtSCxNOzs7O3lEQ3pEZixrWUFxQ08sTUFBTW1PLEVBQU0sYUFBRyxDQUFFdXlJOzs7Ozs7Ozs7Ozs7Ozs7OztBQUx4QixTQUFjMW1KLEdBQ1YsTUFDTXVMLEVBQVMsQ0FBRXZMLEVBRE4sMEJBQWdCQSxFQUFHLElBQUssUUFFbkMsT0FBTyxTQUFPK2xILFVBQVUsTUFBS3g2RyxPOzs7OzJEQ25DakMsb1lBc0NPLE1BQU1vbEMsRUFBUSxhQUFHLENBQUVnMkc7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTDFCLFNBQWdCM21KLEdBQ1osTUFDTXVMLEVBQVMsQ0FBRXZMLEVBRE4sMEJBQWdCQSxFQUFHLElBQUssVUFFbkMsT0FBTyxTQUFPK2xILFVBQVUsUUFBT3g2RyxPOzs7O2dFQ3BDbkMsMG1CQXNETyxNQUFNcTdJLEVBQWEsYUFBRyxDQUFFQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFsQi9CLFNBQXFCN21KLEdBQ2pCLE1BQU0rNEIsRUFBSywwQkFBZ0IvNEIsRUFBRyxJQUFLLGNBZW5DLE9BWGlCLHNCQUFZQSxJQVNsQixDQUFFOUQsTUFMSyxjQUFJLG1CQUFTLGNBQUk4RCxLQUtmNHBILFNBSkU3dUYsR0FDRCxjQUFJQSxFQUFJLGtCQUFRLGNBQUkvNkIsUUFLbENrK0ksQ0FBU25sSCxPOzs7O2dFQ3BEcEIsa3pCQXlGTyxNQUFNK3RILEVBQWEsYUFBRyxDQUFFQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUExQy9CLFNBQXFCenlHLEVBQVF4K0IsR0FBTyxHQUNoQyxNQUFNa3hJLEVBQVUsMEJBQWdCMXlHLEVBQVEsU0FBVSxjQUlsRCxJQUhjLElBQVZ4K0IsSUFDQUEsRUFBT2t4SSxFQUFRem5KLEtBQU8sR0FFdEJ1VyxJQUFTa3hJLEVBQVF6bkosS0FBTyxFQUN4QixNQUFNcUUsTUFDRixnRkFBbUJvakosRUFBUXpuSixxQkFBcUJ1VyxLQTJCeEQsT0FkaUIsc0JBQVcsQ0FBQ3crQixFQUFRMDJFLEtBQ2pDLE1BQ01pOEIsRUFBTyxjQUFJM3lHLEVBQVF4K0IsR0FBTSxHQUN6Qm94SSxFQUFVLGNBQUk1eUcsRUFBUTJ5RyxHQUN0Qi9xSixFQUFRLGNBQUksZUFBS2dySixFQUFTLFdBQVksY0FBSSxjQUFJLGNBQUlBLEdBQVVweEksR0FIakQsS0FJakJrMUcsRUFBSyxDQUFDOXVILElBT04sTUFBTyxDQUFFQSxRQUFPMHRILFNBTkMsQ0FBQzd1RixFQUFJOHJGLEtBQ2xCLE1BQU8zcUgsR0FBUzJxSCxFQUVWcnBFLEVBQVUsY0FBSXRoRCxHQUNwQixPQUFPLGNBQUk2K0IsRUFBSSxjQUFJLGNBQUlBLEVBQUlqbEIsR0FGVixHQUUyQjBuQyxRQUk3QzBnRyxDQUFTOEksTzs7OzsrRENqRnBCLGk0QkF1RU8sTUFBTUcsRUFBWSxhQUFHLENBQUVDOzs7Ozs7Ozs7Ozs7Ozs7OztBQWY5QixTQUFvQnBuSixFQUFHOFYsRUFBTyxLQUFNbWlCLEdBQVcsR0FDM0MsTUFBTWMsRUFBSywwQkFBZ0IvNEIsRUFBRyxJQUFLLGFBQzdCdXVCLEVBQU8seUJBQWV6WSxFQUFNaWpCLEVBQUdsNkIsT0FDL0Jvb0osRUFBTyxjQUFJbHVILEVBQUl4SyxHQUFNLEdBQ3JCamUsRUFBSSxjQUFJeW9CLEVBQUlrdUgsR0FDWmwzSCxFQUFJLGNBQUl6ZixHQUNSaFYsRUFBSSxjQUFJeTBCLEVBQUd4QixHQUNYaHpCLEVBQUksY0FBSUQsR0FDUjBLLEVBQU0sY0FBSSxrQkFBUWloSixFQUFNMXJKLEVBQUVzRCxPQUFRdEQsR0FDeEMsR0FBSTA4QixFQUFVLENBQ1YsTUFBTVEsRUFBVywrQkFBcUJ6eUIsRUFBSW5ILE1BQU8wdkIsR0FDakQsT0FBTyxrQkFBUXZvQixFQUFLeXlCLEdBRXhCLE9BQU96eUIsTTs7OztnRUNyRVgsdWVBMkNPLE1BQU02cUMsRUFBYSxhQUFHLENBQUV3Mkc7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUC9CLFNBQXFCLzJJLEVBQUd5ZixHQUNwQixNQUFNdS9HLEVBQUssMEJBQWdCaC9ILEVBQUcsSUFBSyxhQUFjLFFBQzNDaS9ILEVBQUssMEJBQWdCeC9HLEVBQUcsSUFBSyxhQUFjLFFBQ2pELHFDQUEyQnUvRyxFQUFHendJLE1BQU8wd0ksRUFBRzF3SSxPQUN4QyxNQUFNME0sRUFBUyxDQUFFK0UsRUFBR2cvSCxFQUFJdi9HLEVBQUd3L0csR0FDM0IsT0FBTyxTQUFPeHBCLFVBQVUsYUFBWXg2RyxPOzs7O2dFQ3pDeEMseVlBc0NPLE1BQU13bEMsRUFBYSxhQUFHLENBQUV1Mkc7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTC9CLFNBQXFCdG5KLEdBQ2pCLE1BQ011TCxFQUFTLENBQUV2TCxFQUROLDBCQUFnQkEsRUFBRyxJQUFLLGFBQWMsU0FFakQsT0FBTyxTQUFPK2xILFVBQVUsYUFBWXg2RyxPOzs7OytEQ3BDeEMsc2VBMENPLE1BQU0wbEMsRUFBWSxhQUFHLENBQUVzMkc7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUDlCLFNBQW9CajNJLEVBQUd5ZixHQUNuQixNQUFNdS9HLEVBQUssMEJBQWdCaC9ILEVBQUcsSUFBSyxZQUFhLFFBQzFDaS9ILEVBQUssMEJBQWdCeC9HLEVBQUcsSUFBSyxZQUFhLFFBQ2hELHFDQUEyQnUvRyxFQUFHendJLE1BQU8wd0ksRUFBRzF3SSxPQUN4QyxNQUFNME0sRUFBUyxDQUFFK0UsRUFBR2cvSCxFQUFJdi9HLEVBQUd3L0csR0FDM0IsT0FBTyxTQUFPeHBCLFVBQVUsWUFBV3g2RyxPOzs7O2dFQ3hDdkMsMmtCQTRDTyxNQUFNaThJLEVBQWEsYUFBRyxDQUFFQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFQL0IsU0FBcUJuM0ksRUFBR3lmLEdBQ3BCLE1BQU11L0csRUFBSywwQkFBZ0JoL0gsRUFBRyxJQUFLLGFBQWMsUUFDM0NpL0gsRUFBSywwQkFBZ0J4L0csRUFBRyxJQUFLLGFBQWMsUUFHakQsT0FGQSxxQ0FBMkJ1L0csRUFBR3p3SSxNQUFPMHdJLEVBQUcxd0ksT0FFakMscUJBQVcsb0JBQVV5UixFQUFHeWYsR0FBSSxxQkFBVyxxQkFBV3pmLEVBQUd5ZixTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMxQnpELElBQUkyM0gsRUFoQlgsaURBaUJBLFNBQVdBLEdBQ1BBLEVBQVVBLEVBQWdCLEtBQUksR0FBSyxPQUNuQ0EsRUFBVUEsRUFBZ0IsS0FBSSxHQUFLLE9BQ25DQSxFQUFVQSxFQUFlLElBQUksR0FBSyxNQUNsQ0EsRUFBVUEsRUFBa0MsdUJBQUksR0FBSyx5QkFKekQsQ0FLR0EsSUFBY0EsRUFBWSxNOzs7O3dFQ3RCN0IsaXFCQWlETyxNQUFNQyxFQUFxQixhQUFHLENBQUVDOzs7Ozs7Ozs7Ozs7Ozs7OztBQVh2QyxTQUE2QjNRLEVBQVFDLEVBQWEzM0csRUFBU3NvSCxFQUFZLFlBQVVDLHdCQUM3RSxNQUFNMVEsRUFBVSwwQkFBZ0JILEVBQVEsU0FBVSxzQkFDNUNJLEVBQWUsMEJBQWdCSCxFQUFhLGNBQWUsc0JBQ2pFLElBQUk5RCxFQUFXLEtBQ0EsTUFBWDd6RyxJQUNBNnpHLEVBQVcsMEJBQWdCN3pHLEVBQVMsVUFBVyx1QkFFbkQsNEJBQWtCNjNHLEVBQVF2NEksTUFBT3c0SSxFQUFheDRJLE1BQU8saUNBQ3JELE1BQU1rcEosRUFBUyxjQUFJLGNBQUkzUSxFQUFTQyxJQUNoQyxPQUFPLDhCQUFvQjBRLEVBQVEzVSxFQUFVeVUsTzs7Ozt5RUMvQ2pELG03QkEwRE8sTUFBTUcsRUFBc0IsYUFBRyxDQUFFQyxxQkFwQ3hDLFNBQThCRixFQUFReG9ILEVBQVNzb0gsRUFBWSxZQUFVQyx3QkFDakUsTUFBTUksRUFBVSwwQkFBZ0JILEVBQVEsU0FBVSx1QkFDbEQsSUFBSTNVLEVBQVcsS0FDQSxNQUFYN3pHLElBQ0E2ekcsRUFBVywwQkFBZ0I3ekcsRUFBUyxVQUFXLHdCQUVuRCxNQUFNNG9ILEVBQTRCLE1BQVovVSxFQUFvQjhVLEVBQVUsY0FBSUEsRUFBUzlVLEdBQ2pFLEdBQUl5VSxJQUFjLFlBQVVPLEtBQ3hCLE9BQU9ELEVBRVgsR0FBSU4sSUFBYyxZQUFVUSxJQUN4QixPQUFPLGNBQUlGLEdBRWYsR0FBSU4sSUFBYyxZQUFVUyxLQUFNLENBQzlCLEdBQWdCLE1BQVpsVixFQUNBLE9BQU8sZUFBSytVLEdBRVgsQ0FDRCxNQUFNSSxFQUFrQkwsRUFBUXJnSixLQUFPdXJJLEVBQVN2ckksS0FDMUN0QixFQUFTLGNBQUksY0FBSTRoSixHQUFlLGNBQUkvVSxJQUMxQyxPQUFPbVYsRUFBa0IsRUFBSSxjQUFJaGlKLEVBQVEsaUJBQU9naUosSUFDNUNoaUosR0FHWixHQUFJc2hKLElBQWMsWUFBVUMsdUJBQXdCLENBQ2hELEdBQWdCLE1BQVoxVSxFQUNBLE9BQU8sY0FBSSxjQUFJK1UsR0FBZSxpQkFBT0QsRUFBUXJnSixPQUU1QyxDQUNELE1BQU0yZ0osRUFBcUIsY0FBSXBWLEVBQVUsZUFBSzhVLEVBQVFycEosUUFDaEQ0cEosRUFBYyxlQUFLLGNBQUksbUJBQVNELEVBQW9CLGlCQUFPLEtBQU0sV0FDdkUsT0FBTyxjQUFJLGNBQUlMLEdBQWVNLElBR3RDLE1BQU03a0osTUFBTSxzQkFBc0Jpa0osUzs7OztvRUN4RHRDLHF6QkFxQ08sTUFBTWEsRUFBaUIsYUFBRyxDQUFFQyxnQkFabkMsU0FBeUIxUixFQUFRQyxFQUFhcGhJLEVBQU15cEIsRUFBU3NvSCxFQUFZLFlBQVVDLHdCQUMvRSxNQUFNMVEsRUFBVSwwQkFBZ0JILEVBQVEsU0FBVSxrQkFDNUNJLEVBQWUsMEJBQWdCSCxFQUFhLGNBQWUsa0JBQ2pFLElBQUk5RCxFQUFXLEtBQ0EsTUFBWDd6RyxJQUNBNnpHLEVBQVcsMEJBQWdCN3pHLEVBQVMsVUFBVyxtQkFFbkQsNEJBQWtCNjNHLEVBQVF2NEksTUFBT3c0SSxFQUFheDRJLE1BQU8sNkJBQ3JELE1BQU0rcEosRUFBTSxpQkFBTyxHQUNiYixFQUFTLGNBQUlhLEVBQUssY0FBSSxjQUFJeFIsRUFBU0MsR0FBZXZoSSxHQUFNLElBQzlELE9BQU8sOEJBQW9CaXlJLEVBQVEzVSxFQUFVeVUsTzs7OzsrRENuQ2pELGt6QkFzQ08sTUFBTWdCLEVBQVksYUFBRyxDQUFFQyxXQWQ5QixTQUFvQjdSLEVBQVFDLEVBQWEzM0csRUFBU3NvSCxFQUFZLFlBQVVDLHdCQUNwRSxJQUFJMVEsRUFBVSwwQkFBZ0JILEVBQVEsU0FBVSxhQUNoRCxNQUFNSSxFQUFlLDBCQUFnQkgsRUFBYSxjQUFlLGFBQ2pFLElBQUk5RCxFQUFXLEtBQ0EsTUFBWDd6RyxJQUNBNnpHLEVBQVcsMEJBQWdCN3pHLEVBQVMsVUFBVyxjQUVuRCw0QkFBa0I2M0csRUFBUXY0SSxNQUFPdzRJLEVBQWF4NEksTUFBTyx3QkFDckQsTUFBTStwSixFQUFNLGlCQUFPLEdBRW5CeFIsRUFBVSxjQUFJLGNBQUksaUJBQU8sR0FBSUEsR0FBVXdSLEdBQ3ZDLE1BQU1iLEVBQVMsZUFBSyxjQUFJYSxFQUFLLGNBQUl4UixFQUFTQyxLQUMxQyxPQUFPLDhCQUFvQjBRLEVBQVEzVSxFQUFVeVUsTzs7OzsrRENwQ2pELHloQ0EyRE8sTUFBTWtCLEVBQVksYUFBRyxDQUFFQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFmOUIsU0FBb0IvUixFQUFRQyxFQUFhMzNHLEVBQVMwcEgsRUFBUSxFQUFLcEIsRUFBWSxZQUFVQyx3QkFDakYsTUFBTTFRLEVBQVUsMEJBQWdCSCxFQUFRLFNBQVUsYUFDNUNJLEVBQWUsMEJBQWdCSCxFQUFhLGNBQWUsYUFDakUsSUFBSTlELEVBQVcsS0FDQSxNQUFYN3pHLElBQ0E2ekcsRUFBVywwQkFBZ0I3ekcsRUFBUyxVQUFXLGNBRW5ELDRCQUFrQjYzRyxFQUFRdjRJLE1BQU93NEksRUFBYXg0SSxNQUFPLHdCQUNyRCxNQUFNcXFKLEVBQWMsaUJBQU9ELEdBQ3JCbi9JLEVBQVEsY0FBSSxjQUFJdXRJLEVBQWNELElBQzlCK1IsRUFBWSxrQkFBUXIvSSxFQUFPby9JLEdBQzNCRSxFQUFTLGNBQUl0L0ksRUFBT3EvSSxHQUNwQnBCLEVBQVMsY0FBSSxjQUFJLGlCQUFPLElBQU0saUJBQU9vQixJQUFhLGNBQUlELEVBQWFFLElBQ3pFLE9BQU8sOEJBQW9CckIsRUFBUTNVLEVBQVV5VSxPOzs7OzZEQ3pEakQsZzhCQTBETyxNQUFNd0IsRUFBVSxhQUFHLENBQUVDOzs7Ozs7Ozs7Ozs7Ozs7OztBQWY1QixTQUFrQnJTLEVBQVFDLEVBQWEzM0csRUFBUzd2QixFQUFVLEtBQU1tNEksRUFBWSxZQUFVQyx3QkFDbEYsTUFBTTFRLEVBQVUsMEJBQWdCSCxFQUFRLFNBQVUsV0FDNUNJLEVBQWUsMEJBQWdCSCxFQUFhLGNBQWUsV0FDakUsSUFBSTlELEVBQVcsS0FDQSxNQUFYN3pHLElBQ0E2ekcsRUFBVywwQkFBZ0I3ekcsRUFBUyxVQUFXLFlBRW5ELDRCQUFrQjYzRyxFQUFRdjRJLE1BQU93NEksRUFBYXg0SSxNQUFPLHNCQUNyRCxNQUFNK3BKLEVBQU0saUJBQU8sR0FDYlcsRUFBZ0IsaUJBQU83NUksR0FDdkI4NUksRUFBSyxjQUFJLGNBQUlwUyxFQUFTLGNBQUksY0FBSUMsRUFBY2tTLE1BQzVDRSxFQUFLLGNBQUksY0FBSWIsRUFBS3hSLEdBQVUsY0FBSSxjQUFJLGNBQUl3UixFQUFLdlIsR0FBZWtTLEtBQzVEeEIsRUFBUyxjQUFJeUIsRUFBSUMsR0FDdkIsT0FBTyw4QkFBb0IxQixFQUFRM1UsRUFBVXlVLE87Ozs7c0VDeERqRCxvbkJBZ0RPLE1BQU02QixFQUFtQixhQUFHLENBQUVDOzs7Ozs7Ozs7Ozs7Ozs7OztBQVhyQyxTQUEyQjFTLEVBQVFDLEVBQWEzM0csRUFBU3NvSCxFQUFZLFlBQVVDLHdCQUMzRSxNQUFNMVEsRUFBVSwwQkFBZ0JILEVBQVEsU0FBVSxvQkFDNUNJLEVBQWUsMEJBQWdCSCxFQUFhLGNBQWUsb0JBQ2pFLElBQUk5RCxFQUFXLEtBQ0EsTUFBWDd6RyxJQUNBNnpHLEVBQVcsMEJBQWdCN3pHLEVBQVMsVUFBVyxxQkFFbkQsNEJBQWtCNjNHLEVBQVF2NEksTUFBT3c0SSxFQUFheDRJLE1BQU8sK0JBQ3JELE1BQU1rcEosRUFBUyw0QkFBa0IzUSxFQUFTQyxHQUMxQyxPQUFPLDhCQUFvQjBRLEVBQVEzVSxFQUFVeVUsTzs7Ozt5RUM5Q2pELDZxQ0FrR08sTUFBTStCLEVBQXNCLGFBQUcsQ0FBRUMscUJBbEJ4QyxTQUE4QkMsRUFBa0J4MUcsRUFBUS9VLEVBQVN3cUgsRUFBaUIsRUFBR2xDLEVBQVksWUFBVUMsd0JBQ3ZHLElBQUlrQyxFQUFvQiwwQkFBZ0JGLEVBQWtCLG1CQUFvQix1QkFDOUUsTUFBTTlDLEVBQVUsMEJBQWdCMXlHLEVBQVEsU0FBVSx1QkFDbEQsSUFBSTgrRixFQUFXLEtBS2YsR0FKZSxNQUFYN3pHLElBQ0E2ekcsRUFBVywwQkFBZ0I3ekcsRUFBUyxVQUFXLHdCQUVuRCw0QkFBa0J5cUgsRUFBa0JuckosTUFBT21vSixFQUFRbm9KLE1BQU8sa0NBQ3REa3JKLEVBQWlCLEVBQUcsQ0FDcEIsTUFBTUUsRUFBdUIsaUJBQU9GLEdBQzlCbkIsRUFBTSxpQkFBTyxHQUNiMStELEVBQU8saUJBQU8sSUFDcEI4L0QsRUFDSSxjQUFJLGNBQUlBLEVBQW1CLGNBQUlwQixFQUFLcUIsSUFBd0IsY0FBSS8vRCxFQUFNKy9ELElBRTlFLE1BQU1sQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFqRVYsU0FBd0M5USxFQUFRM2lHLEdBQzVDLE1BQU04aUcsRUFBVSwwQkFBZ0JILEVBQVEsU0FBVSxpQ0FDNUMrUCxFQUFVLDBCQUFnQjF5RyxFQUFRLFNBQVUsaUNBQ2xELDRCQUFrQjhpRyxFQUFRdjRJLE1BQU9tb0osRUFBUW5vSixNQUFPLDRDQXFCaEQsTUFBTXFySixFQUFZLGVBQUtsRCxHQUNqQm1ELEVBQWdCLGNBQUluRCxFQUFTNVAsR0FDN0JnVCxFQUFnQixnQkFBTSxjQUFJLGNBQUksY0FBSXBELE1BQ3hDLE9BQU8sY0FBSSxjQUFJa0QsRUFBV0MsR0FBZ0JDLEdBc0MzQkMsQ0FBK0JMLEVBQW1CaEQsR0FDakUsT0FBTyw4QkFBb0JlLEVBQVEzVSxFQUFVeVUsTzs7Ozt5RUNoR2pELDQvQ0ErSE8sTUFBTXlDLEVBQXNCLGFBQUcsQ0FBRUMscUJBbEJ4QyxTQUE4QkMsRUFBY2wyRyxFQUFRL1UsRUFBU3dxSCxFQUFpQixFQUFHbEMsRUFBWSxZQUFVQyx3QkFDbkcsSUFBSTJDLEVBQWdCLDBCQUFnQkQsRUFBYyxlQUFnQix1QkFDbEUsTUFBTXhELEVBQVUsMEJBQWdCMXlHLEVBQVEsU0FBVSx1QkFDbEQsSUFBSTgrRixFQUFXLEtBS2YsR0FKZSxNQUFYN3pHLElBQ0E2ekcsRUFBVywwQkFBZ0I3ekcsRUFBUyxVQUFXLHdCQUVuRCw0QkFBa0JrckgsRUFBYzVySixNQUFPbW9KLEVBQVFub0osTUFBTyxrQ0FDbERrckosRUFBaUIsRUFBRyxDQUNwQixNQUFNRSxFQUF1QixpQkFBT0YsR0FDOUJuQixFQUFNLGlCQUFPLEdBQ2J6UixFQUFhLGlCQUFPc1QsRUFBYzVySixNQUFNLElBQzlDNHJKLEVBQ0ksY0FBSSxjQUFJQSxFQUFlLGNBQUk3QixFQUFLcUIsSUFBd0IsY0FBSUEsRUFBc0I5UyxJQUUxRixNQUFNNFE7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbEVWLFNBQXdDOVEsRUFBUTNpRyxFQUFRdkssR0FBTSxHQUkxRCxJQUhhLElBQVRBLElBQ0FBLEVBQU11SyxFQUFPLzBDLEtBQU8sR0FFcEJ3cUMsSUFBUXVLLEVBQU8vMEMsS0FBTyxFQUN0QixNQUFNcUUsTUFDRixtR0FBdUMwd0MsRUFBTy8wQyxvQkFDL0J3cUMsS0F1QnZCLE9BcEJpQixzQkFBVyxDQUFDa3RHLEVBQVEzaUcsRUFBUTAyRSxLQUl6QyxNQUNNMC9CLEVBQU0sb0JBQVVwMkcsRUFBUSxDQUFDdkssSUFEZCxHQUVYNGdILEVBQVksY0FBSSxlQUFLcjJHLEVBQVEsV0FBWW8yRyxHQUMvQzEvQixFQUFLLENBQUNpc0IsRUFBUTBULElBQ2QsTUFBTUMsRUFBYSxjQUFJLGNBQUlELEVBQVcxVCxJQVV0QyxNQUFPLENBQUUvNkksTUFUSyxjQUFJMHVKLEVBQVksQ0FBQzdnSCxJQVNmNi9FLFNBUkMsQ0FBQzd1RixFQUFJOHJGLEtBQ2xCLE1BQU9vd0IsRUFBUTBULEdBQWE5akMsRUFDdEJ4NkQsRUFBVSwrQkFBcUJ0eEIsRUFBR2w4QixNQUFPLENBQUNrckMsSUFDaEQsTUFBTyxDQUNILGNBQUksa0JBQVFoUCxFQUFJc3hCLEdBQVUsY0FBSSxlQUFLNHFGLEVBQVEsV0FBWSxjQUFJMFQsS0FDM0QsY0FBSSxrQkFBUTV2SCxFQUFJc3hCLEdBQVUsY0FBSSxjQUFJcytGLEdBQVksZUFBSzFULEVBQVEsa0JBS2hFaUgsQ0FBU2pILEVBQVEzaUcsR0FvQ1R1MkcsQ0FBK0JKLEVBQWV6RCxHQUM3RCxPQUFPLDhCQUFvQmUsRUFBUTNVLEVBQVV5VSxPOzs7OzREQzdIakQsMGRBNkNPLE1BQU10SixFQUFTLGFBQUcsQ0FBRXVNOzs7Ozs7Ozs7Ozs7Ozs7OztBQVIzQixTQUFpQng2SSxFQUFHeWYsRUFBR3NMLEdBQWEsRUFBT0MsR0FBYSxHQUNwRCxJQUFJZzBHLEVBQUssMEJBQWdCaC9ILEVBQUcsSUFBSyxVQUM3QmkvSCxFQUFLLDBCQUFnQngvRyxFQUFHLElBQUssV0FDaEN1L0csRUFBSUMsR0FBTSx5QkFBZUQsRUFBSUMsR0FDOUIsTUFBTWhrSSxFQUFTLENBQUUrRSxFQUFHZy9ILEVBQUl2L0csRUFBR3cvRyxHQUNyQnhnSCxFQUFRLENBQUVzTSxhQUFZQyxjQUM1QixPQUFPLFNBQU95cUYsVUFBVSxjQUFheDZHLEVBQVF3akIsTzs7Ozt5REMzQ2pELGtZQXVETyxNQUFNK04sRUFBTSxhQUFHLENBQUVpdUg7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTnhCLFNBQWMvcUosRUFBRzhWLEVBQU8sS0FBTW1pQixHQUFXLEdBQ3JDLE1BQ00xc0IsRUFBUyxDQUFFdkwsRUFETiwwQkFBZ0JBLEVBQUcsSUFBSyxRQUU3Qit1QixFQUFRLENBQUVvaUIsaUJBQWtCcjdCLEVBQU1taUIsWUFDeEMsT0FBTyxTQUFPOHRGLFVBQVUsTUFBS3g2RyxFQUFRd2pCLE87Ozs7NkRDckR6QyxpbkJBeUVPLE1BQU0waUIsRUFBVSxhQUFHLENBQUV1NUc7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBekI1QixTQUFrQmhySixFQUFHbzZCLEVBQVkvYyxFQUFTZ2QsRUFBS0MsR0FDM0MsTUFBTXZCLEVBQUssMEJBQWdCLzRCLEVBQUcsSUFBSyxXQUVuQyxJQUFJNHdJLEVBQU03M0csRUFDTjgzRyxHQUFlLEVBQ0gsSUFBWjkzRyxFQUFHeDVCLE9BQ0hzeEksR0FBZSxFQUNmRCxFQUFNLGtCQUFRNzNHLEVBQUksQ0FBQyxFQUFHQSxFQUFHbDZCLE1BQU0sR0FBSWs2QixFQUFHbDZCLE1BQU0sR0FBSWs2QixFQUFHbDZCLE1BQU0sTUFFN0QsU0FBeUIsSUFBYit4SSxFQUFJcnhJLE1BQVksSUFBTSx1REFBdURxeEksRUFBSXJ4SSxVQUM3RixTQUFZLGlDQUF5QzhkLEVBUm5DLElBUXdELElBQ3RFLHdFQUFlQSx3QkFDSSxNQUFuQmlkLEdBQ0EsU0FBWSxRQUFXRCxJQUFNLElBQ3pCLHdFQUFtQkMsaUJBQStCRCxPQUUxRCxNQUFNOXVCLEVBQVMsQ0FBRXZMLEVBQUc0d0ksR0FDZDdoSCxFQUFRLENBQUVxTCxhQUFZL2MsVUFBU2dkLE1BQUtDLG1CQUVwQ3QwQixFQUFNLFNBQU8rL0csVUFBVSxVQUFTeDZHLEVBQVF3akIsR0FDOUMsT0FBSThoSCxFQUNPLGtCQUFRN3FJLEVBQUssQ0FBQ0EsRUFBSW5ILE1BQU0sR0FBSW1ILEVBQUluSCxNQUFNLEdBQUltSCxFQUFJbkgsTUFBTSxLQUV4RG1ILE07Ozs7K0RDdkVYLCtoQkFpRk8sTUFBTTRyQyxFQUFZLGFBQUcsQ0FBRXE1Rzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF4QjlCLFNBQW9CanJKLEVBQUdvNkIsRUFBYSxDQUFDLEVBQUcsRUFBRyxHQUFJL2MsRUFBU2dkLEVBQUtDLEVBQWlCNWpCLEVBQWEsU0FDdkYsTUFBTXFpQixFQUFLLDBCQUFnQi80QixFQUFHLElBQUssYUFDbkMsSUFBSWd4SSxFQUFNajRHLEVBQ05rNEcsR0FBZSxFQUNILElBQVpsNEcsRUFBR3g1QixPQUNIMHhJLEdBQWUsRUFDZkQsRUFBTSxrQkFBUWo0RyxFQUFJLENBQUMsRUFBR0EsRUFBR2w2QixNQUFNLEdBQUlrNkIsRUFBR2w2QixNQUFNLEdBQUlrNkIsRUFBR2w2QixNQUFNLEdBQUlrNkIsRUFBR2w2QixNQUFNLE1BRTFFLFNBQXlCLElBQWJteUksRUFBSXp4SSxNQUFZLElBQU0scURBQXFEeXhJLEVBQUl6eEksVUFDM0YsU0FBMkIsVUFBZm1YLEdBQXdCLElBQ2hDLGdGQUF5QkEsTUFDTixNQUFuQjRqQixHQUNBLFNBQVksUUFBV0QsSUFBTSxJQUN6QiwwRUFBbUJDLGlCQUErQkQsT0FFMUQsTUFBTTl1QixFQUFTLENBQUV2TCxFQUFHZ3hJLEdBQ2RqaUgsRUFBUSxDQUFFcUwsYUFBWS9jLFVBQVNnZCxNQUFLQyxrQkFBaUI1akIsY0FFckQxUSxFQUFNLFNBQU8rL0csVUFBVSxZQUFXeDZHLEVBQVF3akIsR0FDaEQsT0FBSWtpSCxFQUNPLGtCQUFRanJJLEVBQUssQ0FBQ0EsRUFBSW5ILE1BQU0sR0FBSW1ILEVBQUluSCxNQUFNLEdBQUltSCxFQUFJbkgsTUFBTSxHQUFJbUgsRUFBSW5ILE1BQU0sS0FFdEVtSCxNOzs7O3VFQy9FWCxnWkE2RE8sTUFBTWtsSixFQUFvQixhQUFHLENBQUVDOzs7Ozs7Ozs7Ozs7Ozs7OztBQVJ0QyxTQUE0Qm5ySixFQUFHbzZCLEVBQVkvYyxFQUFTZ2QsRUFBS29ZLEdBQXNCLEdBQzNFLE1BQ01sbkMsRUFBUyxDQUFFdkwsRUFETiwwQkFBZ0JBLEVBQUcsSUFBSyxzQkFFN0IrdUIsRUFBUSxDQUFFcUwsYUFBWS9jLFVBQVNnZCxNQUFLb1ksdUJBRXBDbHNDLEVBQVMsU0FBT3cvRyxVQUFVLG9CQUFtQng2RyxFQUFRd2pCLEdBQzNELE1BQU8sQ0FBRXhvQixPQUFRQSxFQUFPLEdBQUltc0MsUUFBU25zQyxFQUFPLFE7Ozs7NkRDM0RoRCxtb0JBOERPLE1BQU0wc0MsRUFBVSxhQUFHLENBQUVtNEc7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBWjVCLFNBQWtCOTZJLEVBQUd5ZixHQUNqQixJQUFJdS9HLEVBQUssMEJBQWdCaC9ILEVBQUcsSUFBSyxXQUM3QmkvSCxFQUFLLDBCQUFnQngvRyxFQUFHLElBQUssWUFDaEN1L0csRUFBSUMsR0FBTSx5QkFBZUQsRUFBSUMsR0FDYixTQUFiRCxFQUFHOXZJLFFBQ0g4dkksRUFBSyxlQUFLQSxFQUFJLFNBQ2RDLEVBQUssZUFBS0EsRUFBSSxVQUVsQixxQ0FBMkJELEVBQUd6d0ksTUFBTzB3SSxFQUFHMXdJLE9BQ3hDLE1BQU0wTSxFQUFTLENBQUUrRSxFQUFHZy9ILEVBQUl2L0csRUFBR3cvRyxHQUMzQixPQUFPLFNBQU94cEIsVUFBVSxVQUFTeDZHLE87Ozs7MERDNURyQyxtWUF1RE8sTUFBTXF5QixFQUFPLGFBQUcsQ0FBRXl0SDs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFOekIsU0FBZXJySixFQUFHOFYsRUFBTyxLQUFNbWlCLEdBQVcsR0FDdEMsTUFDTTFzQixFQUFTLENBQUV2TCxFQUROLDBCQUFnQkEsRUFBRyxJQUFLLFNBRTdCK3VCLEVBQVEsQ0FBRWpaLE9BQU1taUIsWUFDdEIsT0FBTyxTQUFPOHRGLFVBQVUsT0FBTXg2RyxFQUFRd2pCLE87Ozs7OERDckQxQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFxRE8sU0FBU3U4SCxFQUFTdHJKLEVBQUc4bEIsR0FBRyxTQUFFeWxJLEVBQVcsTUFBUyxJQUNqRCxHQUFpQixPQUFiQSxHQUFrQyxPQUFiQSxFQUNyQixNQUFNLElBQUlDLFVBQVUsR0FBR0QsK0NBRTNCLFFBQVUxbEUsSUFBTjdsRixFQUNBLE1BQU8sR0FFWCxJQUFJKzRCLEVBQUssMEJBQWdCLzRCLEVBQUcsSUFBSyxXQUFZQSxhQUFhLFNBQVNBLEVBQUVSLE1BQVEsV0FDN0UsUUFBVXFtRixJQUFOLy9ELEVBQ0EsTUFBTyxDQUFDaVQsR0FFWixJQUFJMHlILEVBQUssMEJBQWdCM2xJLEVBQUcsSUFBSyxXQUFZQSxhQUFhLFNBQVNBLEVBQUV0bUIsTUFBUSxXQUM3RSxNQUFNZ3VCLEVBQUksd0JBQWN1TCxFQUFHbDZCLE9BQ3JCNHVCLEVBQUksd0JBQWNnK0gsRUFBRzVzSixPQUMzQixNQUFpQixPQUFiMHNKLEdBQ0F4eUgsRUFBSyxrQkFBUUEsRUFBSSxDQUFDLEdBQUksSUFDdEIweUgsRUFBSyxrQkFBUUEsRUFBSSxFQUFFLEVBQUcsSUFDZixDQUNILGlCQUFPLGVBQUssQ0FBQ2grSCxFQUFHLEdBQUlzTCxFQUFHdjVCLE9BQVF1NUIsR0FDL0IsaUJBQU8weUgsRUFBSSxlQUFLLENBQUMsRUFBR2orSCxHQUFJaStILEVBQUdqc0osV0FHbkN1NUIsRUFBSyxrQkFBUUEsRUFBSSxFQUFFLEVBQUcsSUFDdEIweUgsRUFBSyxrQkFBUUEsRUFBSSxDQUFDLEdBQUksSUFDZixDQUNILGlCQUFPMXlILEVBQUksZUFBSyxDQUFDLEVBQUd0TCxHQUFJc0wsRUFBR3Y1QixRQUMzQixpQkFBTyxlQUFLLENBQUNndUIsRUFBRyxHQUFJaStILEVBQUdqc0osT0FBUWlzSixPOzs7O3lEQy9FdkMsa1lBd0RPLE1BQU1oNEcsRUFBTSxhQUFHLENBQUVpNEc7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUHhCLFNBQWMxckosRUFBRzhWLEVBQU8sS0FBTW1pQixHQUFXLEdBQ3JDLE1BQ00xc0IsRUFBUyxDQUFFdkwsRUFETiwwQkFBZ0JBLEVBQUcsSUFBSyxRQUU3Qit1QixFQUFRLENBQUVqWixPQUFNbWlCLFlBRXRCLE9BQU8sU0FBTzh0RixVQUFVLE1BQUt4NkcsRUFBUXdqQixPOzs7OzZEQ3REekMsbW9CQThETyxNQUFNOGtCLEVBQVUsYUFBRyxDQUFFODNHOzs7Ozs7Ozs7Ozs7Ozs7OztBQVo1QixTQUFrQnI3SSxFQUFHeWYsR0FDakIsSUFBSXUvRyxFQUFLLDBCQUFnQmgvSCxFQUFHLElBQUssV0FDN0JpL0gsRUFBSywwQkFBZ0J4L0csRUFBRyxJQUFLLFlBQ2hDdS9HLEVBQUlDLEdBQU0seUJBQWVELEVBQUlDLEdBQ2IsU0FBYkQsRUFBRzl2SSxRQUNIOHZJLEVBQUssZUFBS0EsRUFBSSxTQUNkQyxFQUFLLGVBQUtBLEVBQUksVUFFbEIscUNBQTJCRCxFQUFHendJLE1BQU8wd0ksRUFBRzF3SSxPQUN4QyxNQUFNME0sRUFBUyxDQUFFK0UsRUFBR2cvSCxFQUFJdi9HLEVBQUd3L0csR0FDM0IsT0FBTyxTQUFPeHBCLFVBQVUsVUFBU3g2RyxPOzs7OytEQzVEckMsK2NBb0VPLE1BQU1xc0UsRUFBWSxhQUFHLENBQUVnMEU7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdEI5QixTQUFvQjVySixFQUFHZzBDLEVBQVU1M0MsR0FDN0IsU0FBcUIsWUFBVEEsR0FBK0IsY0FBVEEsR0FBc0IsSUFDcEQsK0RBQU9BLE9BQ1gsTUFBTTI4QixFQUFLLDBCQUFnQi80QixFQUFHLElBQUssYUFDbkMsR0FBZ0IsSUFBWis0QixFQUFHeDVCLEtBQ0gsTUFBTSxJQUFJcUUsTUFBTSxrRUFHcEIsU0FBWW93QyxFQUFTajFDLFNBQVdnNkIsRUFBR3g1QixNQUFNLElBQU0sd0NBQXdDdzVCLEVBQUd4NUIsYUFDL0V5MEMsRUFBU2oxQyxZQUNwQixNQUFNOHNKLEVBQXVCLFlBQVR6dkosRUFBcUIsRUFBSSxFQUM3QyxJQUFLLElBQUluQixFQUFJLEVBQUdBLEVBQUk4OUIsRUFBR3g1QixLQUFNdEUsSUFDekIsU0FBbUMsSUFBdkIrNEMsRUFBUy80QyxHQUFHOEQsUUFBYyxJQUFNLDBEQUM1QyxTQUFZaTFDLEVBQVMvNEMsR0FBRyxJQUFNLEdBQUsrNEMsRUFBUy80QyxHQUFHLElBQU04OUIsRUFBR2w2QixNQUFNNUQsR0FBSzR3SixHQUMvRDczRyxFQUFTLzRDLEdBQUcsSUFBTSxHQUFLKzRDLEVBQVMvNEMsR0FBRyxJQUFNODlCLEVBQUdsNkIsTUFBTTVELEdBQUs0d0osR0FBYSxJQUFNLHdCQUF3QjV3Six3Q0FDNUY4OUIsRUFBR2w2QixNQUFNNUQsR0FBSzR3Six1Q0FDWDl5SCxFQUFHbDZCLFVBRXBCLE1BQU1rd0IsRUFBUSxDQUFFaWxCLFdBQVU1M0MsUUFDcEJtUCxFQUFTLENBQUV2TCxFQUFHKzRCLEdBQ3BCLE9BQU8sU0FBT2d0RixVQUFVLFlBQVd4NkcsRUFBUXdqQixPOzs7O3lEQ2xFL0MsdWRBd0RPLE1BQU1vbEIsRUFBTSxhQUFHLENBQUUyM0c7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUHhCLFNBQWN4N0ksRUFBR3lmLEdBQ2IsSUFBSXUvRyxFQUFLLDBCQUFnQmgvSCxFQUFHLElBQUssT0FDN0JpL0gsRUFBSywwQkFBZ0J4L0csRUFBRyxJQUFLLFFBQ2hDdS9HLEVBQUlDLEdBQU0seUJBQWVELEVBQUlDLEdBQzlCLE1BQU1oa0ksRUFBUyxDQUFFK0UsRUFBR2cvSCxFQUFJdi9HLEVBQUd3L0csR0FDM0IsT0FBTyxTQUFPeHBCLFVBQVUsTUFBS3g2RyxPOzs7OzZEQ3REakMseXZCQW1ETyxNQUFNd2dKLEVBQVUsYUFBRyxDQUFFQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFaNUIsU0FBa0Joc0osRUFBRzhWLEVBQU8sS0FBTW1pQixHQUFXLEdBQ3pDajRCLEVBQUksMEJBQWdCQSxFQUFHLElBQUssV0FDNUIsTUFBTXV1QixFQUFPLHlCQUFlelksRUFBTTlWLEVBQUVuQixPQUM5Qm90SixFQUFRLGVBQUtqc0osRUFBR3V1QixFQUFNMEosR0FDNUIsSUFBSWkwSCxFQUFnQkQsRUFBTXB0SixNQUNyQm81QixJQUNEaTBILEVBQWdCLCtCQUFxQkQsRUFBTXB0SixNQUFPMHZCLElBRXRELE1BQU00OUgsRUFBYSxpQkFBTyxjQUFJLGVBQUtuc0osRUFBRyxXQUFZLGtCQUFRaXNKLEVBQU9DLEtBRWpFLE1BQU8sQ0FBRXR1SCxLQUFNcXVILEVBQU9wdUgsU0FETCxlQUFLc3VILEVBQVk1OUgsRUFBTTBKLFE7Ozs7bUVDaEQ1Qyw0ekJBc0VPLE1BQU1tMEgsRUFBZ0IsYUFBRyxDQUFFQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFoQmxDLFNBQXdCOTNFLEVBQUd2MEUsRUFBR3NzSixFQUFPL3pHLEVBQU1nMEcsR0FBYSxHQUNwRCxNQUFNQyxFQUFLLDBCQUFnQmo0RSxFQUFHLElBQUssaUJBQzdCeDdDLEVBQUssMEJBQWdCLzRCLEVBQUcsSUFBSyxpQkFDN0J5c0osRUFBUywwQkFBZ0JILEVBQU8sUUFBUyxpQkFDL0MsMkJBQWlCRSxFQUFJenpILEdBQ3JCLFNBQVksY0FBaUJ5ekgsRUFBRzN0SixNQUFPazZCLEVBQUdsNkIsUUFBUSxJQUFNLDhCQUN4RCxNQUFNK3BKLEVBQU0saUJBQU8sR0FDYjhELEVBQWdCLGNBQUk5RCxFQUFLNkQsR0FDL0IsSUFBSUUsRUFBUyxjQUFJLGNBQUk1ekgsRUFBSXl6SCxHQUFLRSxHQUM5QixHQUFJSCxFQUFZLENBQ1osU0FBb0IsTUFBUmgwRyxHQUFjLElBQU0sbURBQ2hDLE1BQU1xMEcsRUFBUSwwQkFBZ0JyMEcsRUFBTSxPQUFRLGlCQUM1Q28wRyxFQUFTLGNBQUlBLEVBQVEsY0FBSS9ELEVBQUssY0FBSTZELEVBQVFHLEtBRTlDLE9BQU8sY0FBSUosRUFBSUcsTzs7Ozt5RENwRW5CLHVkQXFETyxNQUFNbG1FLEVBQU0sYUFBRyxDQUFFb21FOzs7Ozs7Ozs7Ozs7Ozs7OztBQVB4QixTQUFjdjhJLEVBQUd5ZixHQUNiLElBQUl1L0csRUFBSywwQkFBZ0JoL0gsRUFBRyxJQUFLLE9BQzdCaS9ILEVBQUssMEJBQWdCeC9HLEVBQUcsSUFBSyxRQUNoQ3UvRyxFQUFJQyxHQUFNLHlCQUFlRCxFQUFJQyxHQUM5QixNQUFNaGtJLEVBQVMsQ0FBRStFLEVBQUdnL0gsRUFBSXYvRyxFQUFHdy9HLEdBQzNCLE9BQU8sU0FBT3hwQixVQUFVLFdBQVV4NkcsTzs7OztrRUNuRHRDLHlPQXNDTyxNQUFNdWhKLEVBQWUsYUFBRyxDQUFFQyxjQXBCakMsU0FBdUJDLEVBQVc5bUosRUFBTTVLLEVBQUdteUIsR0FDdkMsTUFBTXN5QixFQUFRLDBCQUFnQjc1QyxFQUFNLE9BQVEsZ0JBQ3RDOHJJLEVBQUssK0JBQXFCMTJJLEVBQUcsSUFBSyxnQkFDbEMyMkksRUFBSywrQkFBcUJ4a0gsRUFBRyxJQUFLLGdCQUN4QyxJQUFJL2hCLEVBQVFxMEMsRUFDWixNQUFNa3RHLEVBQVksR0FDbEIsSUFBSyxJQUFJaHlKLEVBQUksRUFBR0EsRUFBSSt4SixFQUFVanVKLE9BQVE5RCxJQUFLLENBQ3ZDLE1BQU0yTixFQUFTb2tKLEVBQVUveEosR0FBR3lRLEVBQU9zbUksRUFBRy8ySSxHQUFJZzNJLEVBQUdoM0ksSUFDN0NneUosRUFBVXJ2SixLQUFLZ0wsRUFBTyxJQUN0QnFrSixFQUFVcnZKLEtBQUtnTCxFQUFPLElBQ3RCOEMsRUFBUTlDLEVBQU8sR0FFbkIsTUFBTXlwSSxFQUFPLEdBQ1A2YSxFQUFPLEdBQ2IsSUFBSyxJQUFJanlKLEVBQUksRUFBR0EsRUFBSWd5SixFQUFVbHVKLE9BQVE5RCxHQUFLLEVBQ3ZDbzNJLEVBQUt6MEksS0FBS3F2SixFQUFVaHlKLElBQ3BCaXlKLEVBQUt0dkosS0FBS3F2SixFQUFVaHlKLEVBQUksSUFFNUIsTUFBTyxDQUFDbzNJLEVBQU02YSxPOzs7O2lFQ3BDbEIsMGRBZ0VPLE1BQU03NEcsRUFBYyxhQUFHLENBQUU4NEc7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdkJoQyxTQUFzQjc0RyxFQUFRQyxFQUFZQyxFQUFNQyxHQUFhLEdBQ3pELE1BQU11eUcsRUFBVSwwQkFBZ0IxeUcsRUFBUSxTQUFVLGVBQzVDSyxFQUFjcXlHLEVBQVFuL0ksS0FDdEJ1bEosRUFBV3BHLEVBQVF6bkosS0FDekIsR0FBSW8xQyxFQUFjLEVBQ2QsTUFBTSxJQUFJL3dDLE1BQ04sK0RBQUcrd0MsTUFFWCxHQUFJeTRHLEVBQVcsRUFDWCxNQUFNLElBQUl4cEosTUFBTSxnREFBZ0R3cEosS0FJcEU1NEcsRUFBT0EsR0FBUXAxQyxLQUFLcTVFLFNBRXBCLE1BQ01sdEUsRUFBUyxDQUFFK29DLE9BRGEsSUFBYjg0RyxFQUFpQixrQkFBUXBHLEVBQVMsQ0FBQyxHQUFJLElBQU1BLEdBRXhEajRILEVBQVEsQ0FBRXdsQixhQUFZQyxPQUFNQyxjQUU1Qnp1QyxFQUFNLFNBQU8rL0csVUFBVSxjQUFheDZHLEVBQVF3akIsR0FFbEQsT0FBb0IsSUFBYnErSCxFQUFpQixrQkFBUXBuSixFQUFLLENBQUNBLEVBQUk2QixPQUFTN0IsTTs7Ozt5REM5RHZELGtZQXNDTyxNQUFNa3ZDLEVBQU0sYUFBRyxDQUFFbTRHOzs7Ozs7Ozs7Ozs7Ozs7OztBQUx4QixTQUFjcnRKLEdBQ1YsTUFDTXVMLEVBQVMsQ0FBRXZMLEVBRE4sMEJBQWdCQSxFQUFHLElBQUssUUFFbkMsT0FBTyxTQUFPK2xILFVBQVUsTUFBS3g2RyxPOzs7OzJFQ3BDakM7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkEsU0FBUytoSixFQUFzQnZvSCxFQUFPdVEsRUFBUUMsRUFBZUMsRUFBY0MsRUFBZ0JZLEdBQ25FLE1BQWhCYixJQUNBQSxFQUFlLElBRUcsTUFBbEJDLElBQ0FBLEVBQWlCMkosT0FBT3lHLG1CQUVSLE1BQWhCeFAsSUFDQUEsRUFBZSxHQUVuQixNQUFNNzhCLEVBQVd1ckIsRUFBTWxtQyxNQUFNLEdBUzdCLE9BUkEwMkMsRUFBZ0JuMkMsS0FBS3EwQyxJQUFJOEIsRUFBZS83QixHQUN4QyxTQUFZLEdBQUtnOEIsR0FBZ0JBLEdBQWdCLEdBQUcsSUFBTSw0Q0FBNENBLE9BQ3RHLFNBQTJCLElBQWZ6USxFQUFNeGxDLE1BQVksSUFBTSwrQ0FBK0N3bEMsRUFBTXhsQyxVQUN6RixTQUErQixJQUFuQndsQyxFQUFNbG1DLE1BQU0sSUFBVSxJQUFNLG9EQUFvRGttQyxFQUFNbG1DLE1BQU0sT0FDeEcsU0FBNEIsSUFBaEJ5MkMsRUFBTy8xQyxNQUFZLElBQU0sK0JBQ3JDLFNBQVkrMUMsRUFBT3oyQyxNQUFNLEtBQU8yYSxHQUFVLElBQU0sc0RBQXNEQSxjQUN2Rjg3QixFQUFPejJDLE1BQU0sT0FDNUIsU0FBWSxHQUFLdzNDLEdBQWdCQSxHQUFnQixHQUFHLElBQU0sNENBQTRDQSxPQUMvRixDQUFFZCxnQkFBZUMsZUFBY0MsaUJBQWdCWSxrQjs7OzswRENwQzFELDBoQ0E2RUEsU0FBU2szRyxFQUFTdnRKLEVBQUdqRCxFQUFHK1ksRUFBTyxNQUMzQixHQUFlLElBQVg5VixFQUFFVCxLQUNGLE9BQU8sY0FBSVMsR0FHZixHQUFlLElBQVhBLEVBQUVULE1BQXVCLE9BQVR1VyxFQUNoQixPQUFPeTNJLEVBQVMsa0JBQVF2dEosRUFBRyxFQUFFLElBQUtqRCxFQUFHK1ksR0FHekMsR0FBZSxJQUFYOVYsRUFBRVQsTUFBOEIsaUJBQVR1VyxHQUN2QkwsTUFBTXN2RCxRQUFRanZELElBQXlCLElBQWhCQSxFQUFLL1csT0FBYyxDQUMxQyxHQUFVLElBQU5oQyxFQUNBLE9BQU8sY0FBSSxjQUFJaUQsR0FBSThWLEdBRXZCLEdBQUkvWSxJQUFNOHFCLElBQ04sT0FBTyxjQUFJLGNBQUk3bkIsR0FBSThWLEdBRXZCLEdBQUkvWSxLQUFPOHFCLElBQ1AsT0FBTyxjQUFJLGNBQUk3bkIsR0FBSThWLEdBRXZCLEdBQVUsY0FBTi9ZLEdBQTJCLElBQU5BLEVBRXJCLE9BQU8sZUFBSyxjQUFJLGNBQUksY0FBSWlELEdBQUksaUJBQU8sRUFBRyxVQUFXOFYsSUFFckQsTUFBTSxJQUFJbFMsTUFBTSxxQ0FBcUM3RyxLQUd6RCxHQUFJMFksTUFBTXN2RCxRQUFRanZELElBQXlCLElBQWhCQSxFQUFLL1csT0FBYyxDQUMxQyxHQUFVLElBQU5oQyxFQUNBLE9BQU8sY0FBSSxjQUFJLGNBQUlpRCxHQUFJOFYsRUFBSyxJQUFLQSxFQUFLLEdBQUssR0FFL0MsR0FBSS9ZLElBQU04cUIsSUFDTixPQUFPLGNBQUksY0FBSSxjQUFJN25CLEdBQUk4VixFQUFLLElBQUtBLEVBQUssSUFFMUMsR0FBSS9ZLEtBQU84cUIsSUFDUCxPQUFPLGNBQUksY0FBSSxjQUFJN25CLEdBQUk4VixFQUFLLElBQUtBLEVBQUssSUFFMUMsR0FBVSxRQUFOL1ksR0FBcUIsY0FBTkEsRUFFZixPQUFPLGVBQUssY0FBSSxpQkFBT2lELEdBQUk4VixJQUUvQixNQUFNLElBQUlsUyxNQUFNLHFDQUFxQzdHLEtBRXpELE1BQU0sSUFBSTZHLE1BQU0sZ0NBQWdDa1MsS0FFN0MsTUFBTThnRSxFQUFPLGFBQUcsQ0FBRTQyRTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF2RHpCLFNBQWV4dEosRUFBR3l0SixFQUFNLFlBQWEzM0ksRUFBTyxLQUFNbWlCLEdBQVcsR0FFekQsTUFBTTIrQyxFQUFPMjJFLEVBRGJ2dEosRUFBSSwwQkFBZ0JBLEVBQUcsSUFBSyxRQUNIeXRKLEVBQUszM0ksR0FDOUIsSUFBSW8ySSxFQUFnQnQxRSxFQUFLLzNFLE1BQ3pCLEdBQUlvNUIsRUFBVSxDQUNWLE1BQU0xSixFQUFPLHlCQUFlelksRUFBTTlWLEVBQUVuQixPQUNwQ3F0SixFQUFnQix1QkFBK0J0MUUsRUFBSy8zRSxNQUFPMHZCLEdBRS9ELE9BQU8sa0JBQVFxb0QsRUFBTXMxRSxPOzs7OzhEQzNFekIsMGpCQTRDTyxNQUFNdDFHLEVBQVcsYUFBRyxDQUFFODJHOzs7Ozs7Ozs7Ozs7Ozs7OztBQVI3QixTQUFtQnA5SSxFQUFHeWYsR0FDbEIsSUFBSXUvRyxFQUFLLDBCQUFnQmgvSCxFQUFHLElBQUssV0FBWSxxQkFDekNpL0gsRUFBSywwQkFBZ0J4L0csRUFBRyxJQUFLLFdBQVksc0JBQzVDdS9HLEVBQUlDLEdBQU0seUJBQWVELEVBQUlDLEdBQzlCLHFDQUEyQkQsRUFBR3p3SSxNQUFPMHdJLEVBQUcxd0ksT0FDeEMsTUFBTTBNLEVBQVMsQ0FBRStFLEVBQUdnL0gsRUFBSXYvRyxFQUFHdy9HLEdBQzNCLE9BQU8sU0FBT3hwQixVQUFVLFdBQVV4NkcsTzs7Ozs0REMxQ3RDLHFZQWdETyxNQUFNdXJDLEVBQVMsYUFBRyxDQUFFNjJHOzs7Ozs7Ozs7Ozs7Ozs7OztBQVQzQixTQUFpQjlnSCxFQUFTMTVCLEVBQU80akMsRUFBVSxFQUFHQyxFQUFXLEdBQ3JELEdBQUk3akMsRUFBUSxFQUNSLE1BQU0sSUFBSXZQLE1BQU0saURBQWlEdVAsS0FFckUsTUFDTTVILEVBQVMsQ0FBRXNoQyxRQURBLDBCQUFnQkEsRUFBUyxVQUFXLFNBQVUsVUFFekQ5ZCxFQUFRLENBQUU1YixRQUFPNGpDLFVBQVNDLFlBQ2hDLE9BQU8sU0FBTyt1RSxVQUFVLFNBQVF4NkcsRUFBUXdqQixPOzs7OzBEQzlDNUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaUNPLFNBQVM2N0YsRUFBSy9ySCxFQUFPVyxFQUFRLFdBQ2hDLEdBQWMsY0FBVkEsRUFBdUIsQ0FDdkIsTUFBTWtILEVBQU9ra0gsRUFBSy9ySCxFQUFPLFdBQ25CK0gsRUFBTyxnQkFBTS9ILEVBQU8sV0FDMUIsT0FBTyxrQkFBUTZILEVBQU1FLEdBRXpCLE1BQU0vQixFQUFTLDZCQUFtQix3QkFBY2hHLEdBQVFXLEdBQ3hELE9BQU8sU0FBT3NwSCxXQUFXamtILEVBQVFoRyxFQUFPVyxLOzs7OzhEQ3hDNUMsdVlBcUNPLE1BQU0wM0MsRUFBVyxhQUFHLENBQUUwMkc7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTDdCLFNBQW1CNXRKLEdBQ2YsTUFDTXVMLEVBQVMsQ0FBRXZMLEVBRE4sMEJBQWdCQSxFQUFHLElBQUssYUFFbkMsT0FBTyxTQUFPK2xILFVBQVUsV0FBVXg2RyxPOzs7O3lFQ25DdEM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0JPLE1BQU1zaUosRUFBa0IsT0FNeEIsU0FBU3h2SixFQUFHMkssR0FDZixNQUFNaUcsRUFBT3RULE9BQU9zVCxLQUFLakcsR0FDekIsR0FBb0IsSUFBaEJpRyxFQUFLbFEsT0FDTCxNQUFNLElBQUk2RSxNQUVOLHlHQUFHcUwsRUFBS2xRLGdCQUVoQixJQUFJK2xFLEVBQVM3MUQsRUFBSyxHQUNsQixNQUFNdTJHLEVBQUt4OEcsRUFBRTg3RCxHQUVUQSxFQUFPNnNCLFNBQVMsT0FDaEI3c0IsRUFBU0EsRUFBT2t3RCxVQUFVLEVBQUdsd0QsRUFBTy9sRSxPQUFTLElBR2pEK2xFLEdBQWtCK29GLEVBRWxCLE1BQU1DLEVBQUssSUFBSW4zSCxLQUNYLFNBQU8rdUYsV0FBVzVnRCxHQUNsQixJQUNJLE1BQU12K0QsRUFBU2kvRyxLQUFNN3VGLEdBS3JCLE9BSkksb0JBQVVwd0IsSUFDVnNLLFFBQVEvRyxNQUFNLDJDQUVsQixTQUFPNjdHLFNBQVNwL0csR0FDVEEsRUFFWCxNQUFPazdGLEdBRUgsTUFEQSxTQUFPa2tCLFNBQVMsTUFDVmxrQixJQUtkLE9BRkE5bEcsT0FBT0MsZUFBZWt5SixFQUFJLE9BQVEsQ0FBRTV4SixNQUFPNG9FLEVBQVFpcEYsY0FBYyxJQUUxREQsSTs7Ozt3NERDekRYOzs7Ozs7Ozs7Ozs7Ozs7OztBQXNOQSxNQUFNRSxHQUFXLENBQ2IxakgsSUFBQSxPQUNBb0UsS0FBQSxRQUNBdS9HLEtBQUEsUUFDQUMsTUFBQSxVQU9FQyxHQUFTLENBQ1hDLGNBQUEsaUJBQ0FDLFdBQUEsY0FDQUMsTUFBQSxTQUNBQyxLQUFBLFNBZ0JFenBILEdBQVEsQ0FDVnN5RCxjQUFBLGlCQUNBbDlDLHNCQUFBLHlCQUNBVCxlQUFBLGtCQUNBMmdELGlCQUFBLG9CQUNBdjFELGNBQUEsaUJBQ0FrN0csa0JBQUEscUJBQ0FHLHVCQUFBLDBCQUNBUSwyQkFBQSw4QkFDQUUsZ0NBQUEsbUNBQ0FSLHdCQUFBLDJCQUNBRSw2QkFBQSxnQ0FDQXpqSSxVQUFBLGFBQ0FzcEMsVUFBQSxjQU1FcW9HLEdBQVMsQ0FDWDdLLFNBQUEsWUFDQVMsWUFBQSxlQUNBeUIsR0FBQSxPQVlFa0MsR0FBUyxDQUNYSixtQkFBQSxzQkFDQUssb0JBQUEsdUJBQ0FVLGVBQUEsa0JBQ0FHLFVBQUEsYUFDQUUsVUFBQSxhQUNBTSxRQUFBLFdBQ0FLLGlCQUFBLG9CQUNBRSxvQkFBQSx1QkFDQVUsb0JBQUEsd0JBTUVtRSxHQUFTLENBQ1hod0csb0JBQUEsdUJBQ0FhLGNBQUEsaUJBQ0FPLGtCQUFBLHFCQUNBTSxpQkFBQSxxQkFNRXkzRCxHQUFTLENBQ1h2MUQsYUFBQSxnQkFDQVksWUFBQSxlQUNBTSx1QkFBQSw0Qjs7OztrRUNuVEosZ2RBNEJPLE1BQU1tckcsRUFBZSxhQUFHLENBQUVDLGNBVGpDLFNBQXVCQyxFQUFJQyxHQUN2QixNQUFNQyxFQUFNLDBCQUFnQkYsRUFBSSxLQUFNLGdCQUNoQ0csRUFBTSwwQkFBZ0JGLEVBQUksS0FBTSxnQkFDdEMsU0FBeUIsSUFBYkMsRUFBSXZ2SixNQUEyQixJQUFid3ZKLEVBQUl4dkosTUFBWSxJQUMxQywrREFBR3V2SixFQUFJdnZKLFlBQVl3dkosRUFBSXh2SixVQUMzQixNQUFNeXZKLEVBQU8sa0JBQVFGLEVBQUssRUFBRSxFQUFHLElBQ3pCRyxFQUFPLGtCQUFRRixFQUFLLENBQUMsR0FBSSxJQUMvQixPQUFPLGlCQUFPQyxFQUFNQyxPOzs7O3lEQzFCeEIsa1lBc0RPLE1BQU01MEgsRUFBTSxhQUFHLENBQUU2MEg7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBVHhCLFNBQWNsdkosRUFBR2cwQyxFQUFVMEQsRUFBZ0IsR0FDdkMsTUFBTTNlLEVBQUssMEJBQWdCLzRCLEVBQUcsSUFBSyxPQUNuQyxHQUFnQixJQUFaKzRCLEVBQUd4NUIsS0FDSCxNQUFNLElBQUlxRSxNQUFNLHNEQUVwQixNQUFNbXJCLEVBQVEsQ0FBRWlsQixXQUFVMEQsaUJBQ3BCbnNDLEVBQVMsQ0FBRXZMLEVBQUcrNEIsR0FDcEIsT0FBTyxTQUFPZ3RGLFVBQVUsUUFBT3g2RyxFQUFRd2pCLE87Ozs7MkRDcEQzQyxvUkFVTyxNQUFNb2dJLEVBQVEsYUFBRyxDQUFFQyxPQUoxQixTQUFnQnB2SixFQUFHZzBDLEVBQVUwRCxFQUFnQixHQUV6QyxPQURBLGlCQUEyQixJQUFwQjFELEVBQVNqMUMsUUFBYyxJQUFNLHFEQUM3QixjQUFJaUIsRUFBRyxDQUFDZzBDLEdBQVcwRCxPOzs7OzJEQ1I5QixvUkFXTyxNQUFNMjNHLEVBQVEsYUFBRyxDQUFFQyxPQUwxQixTQUFnQnR2SixFQUFHZzBDLEVBQVUwRCxFQUFnQixHQUd6QyxPQUZBLGlCQUEyQixJQUFwQjFELEVBQVNqMUMsUUFBdUMsSUFBdkJpMUMsRUFBUyxHQUFHajFDLFFBQ2pCLElBQXZCaTFDLEVBQVMsR0FBR2oxQyxRQUFjLElBQU0sMERBQzdCLGNBQUlpQixFQUFHZzBDLEVBQVUwRCxPOzs7OzJEQ1Q1QixvUkFXTyxNQUFNNjNHLEVBQVEsYUFBRyxDQUFFQyxPQUwxQixTQUFnQnh2SixFQUFHZzBDLEVBQVUwRCxFQUFnQixHQUd6QyxPQUZBLGlCQUEyQixJQUFwQjFELEVBQVNqMUMsUUFBdUMsSUFBdkJpMUMsRUFBUyxHQUFHajFDLFFBQ2pCLElBQXZCaTFDLEVBQVMsR0FBR2oxQyxRQUF1QyxJQUF2QmkxQyxFQUFTLEdBQUdqMUMsUUFBYyxJQUFNLDBEQUN6RCxjQUFJaUIsRUFBR2cwQyxFQUFVMEQsTzs7OzsyRENUNUIsb1JBWU8sTUFBTSszRyxFQUFRLGFBQUcsQ0FBRUMsT0FOMUIsU0FBZ0IxdkosRUFBR2cwQyxFQUFVMEQsRUFBZ0IsR0FJekMsT0FIQSxpQkFBMkIsSUFBcEIxRCxFQUFTajFDLFFBQXVDLElBQXZCaTFDLEVBQVMsR0FBR2oxQyxRQUNqQixJQUF2QmkxQyxFQUFTLEdBQUdqMUMsUUFBdUMsSUFBdkJpMUMsRUFBUyxHQUFHajFDLFFBQ2pCLElBQXZCaTFDLEVBQVMsR0FBR2oxQyxRQUFjLElBQU0sMERBQzdCLGNBQUlpQixFQUFHZzBDLEVBQVUwRCxPOzs7OzBEQ1Y1Qix3ekJBZ0lPLE1BQU11MUMsRUFBTyxhQUFHLENBQUUwaUU7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBN0V6QixTQUFlamtKLEVBQU9ra0osRUFBYUMsRUFBYXgxSCxFQUFLZ0ksRUFBV2hsQixHQUMzQyxNQUFiZ2xCLElBQ0FBLEVBQVksQ0FBQyxFQUFHLElBRUwsTUFBWGhsQixJQUNBQSxFQUFVLEdBRUYsSUFBUmdkLElBQ0FBLEVBQU0sU0FFVixNQUFNdEIsRUFBSywwQkFBZ0JydEIsRUFBTyxJQUFLLFdBQ3ZDLElBQUlrbEksRUFBTTczRyxFQUNOODNHLEdBQWUsRUFDSCxJQUFaOTNHLEVBQUd4NUIsT0FDSHN4SSxHQUFlLEVBQ2ZELEVBQU0sa0JBQVE3M0csRUFBSSxDQUFDLEVBQUdBLEVBQUdsNkIsTUFBTSxHQUFJazZCLEVBQUdsNkIsTUFBTSxHQUFJazZCLEVBQUdsNkIsTUFBTSxNQUU3RCxTQUFZLGlDQUF5Q3dlLEVBQVNnbEIsSUFBWSxJQUN0RSxxRUFBZWhsQixvQkFBMEJnbEIsT0FDN0MsTUFBTTNoQyxFQUFXLG9CQUE0Qmt3SSxFQUFJL3hJLE1BQU8rd0osRUFBYXZ5SSxFQUFTZ2xCLEVBQVdoSSxHQUNuRnc5RyxFQUFXLENBQUNuM0ksRUFBU00sZUFBZ0JOLEVBQVNPLGVBS3BELElBQUk2dUosRUFFQUEsRUFEUSxTQUFSejFILEVBb0NSLFNBQXNDN2pCLEVBQWFxaEksR0FHL0MsTUFHTWtZLEVBSHFCdjVJLEVBQVlqWixLQUFJLENBQUNQLEVBQUcvQixJQUNwQytCLEdBQUtBLEVBQUksSUFBTTY2SSxFQUFTNThJLEdBQUssS0FFQ3NDLEtBQUlQLEdBQUtBLEVBQUksSUFHaERnekosRUFBZ0JELEVBQWN4eUosS0FBSVAsR0FBS29DLEtBQUsyWSxNQUFNL2EsRUFBSSxLQUN0RGl6SixFQUFjRixFQUFjeHlKLEtBQUksQ0FBQ1AsRUFBRy9CLElBQU0rQixFQUFJZ3pKLEVBQWMvMEosS0FDbEUsT0FBTzgwSixFQUFjeHlKLEtBQUksQ0FBQ0MsRUFBR3ZDLElBQ2xCLENBQUMrMEosRUFBYy8wSixHQUFJZzFKLEVBQVloMUosTUEvQ3hCaTFKLENBQTZCLENBQUN4dkosRUFBU0UsYUFBY0YsRUFBU0csYUFBY2czSSxHQUc1RSxDQUFDLENBQUMsRUFBRyxHQUFJLENBQUMsRUFBRyxJQUUvQixNQUFNc1ksRUFBZ0MsSUFBaEJ0WSxFQUFTLElBQTRCLElBQWhCQSxFQUFTLElBQzdDdVksRUFBaUJDLEdBZ0I1QixTQUFzQ24wSSxFQUFZaWlCLEVBQVkyeEgsR0FDMUQsTUFBTVEsRUFBV1IsRUFBWXZ5SixLQUFJd3lCLEdBQUtBLEVBQUUsS0FDbEN3Z0ksRUFBYVQsRUFBWXZ5SixLQUFJd3lCLEdBQUtBLEVBQUUsS0FDcEN5Z0ksRUFBaUJ0MEksRUFBV2hjLE9BQU9vd0osRUFBVUMsR0FDN0NFLEVBQWN0eUgsRUFBVzVnQyxLQUFJLENBQUN3eUIsRUFBRzkwQixLQUFPODBCLEVBQUl5Z0ksRUFBZXYxSixHQUFLODBCLEdBQUtBLElBQ3JFMmdJLEVBQVNILEVBQVdoekosS0FBSSxDQUFDUCxFQUFHL0IsSUFBTStCLEVBQUl5ekosRUFBWXgxSixLQUNsRCs0QyxFQUFXN1YsRUFBVzVnQyxLQUFJLENBQUNDLEVBQUd2QyxJQUFNLENBQUNxMUosRUFBU3IxSixHQUFJeTFKLEVBQU96MUosTUFDekRtakMsRUFBUUQsRUFBVzVnQyxLQUFJLENBQUNDLEVBQUd2QyxJQUFNLENBQUMsRUFBR3cxSixFQUFZeDFKLE1BQ3ZELE1BQU8sQ0FBQys0QyxFQUFVNVYsR0F4QnVCdXlILENBQTZCLENBQUNqd0osRUFBU2lXLFNBQVVqVyxFQUFTa1csU0FBVWloSSxFQUFVaVksR0FDakhjLEVBQWVULEVBQWdCOTFILEVBQU0sUUFDckN3MkgsRUFBYVYsRUFBZ0J2ZixFQUFNLHlCQUFlQSxFQUFLaUgsRUFBVXVZLEdBSWpFdHFJLEdBSDRCLFFBQWhCK3BJLEVBQ2QsSUFBTSxrQkFBUWdCLEVBQVlqQixFQUFhdnlJLEVBQVN1ekksR0FDaEQsSUFBTSxrQkFBUUMsRUFBWWpCLEVBQWF2eUksRUFBU3V6SSxNQUU5QzVxSixFQUFNbXFKLEVBQWdCcnFJLEVBQUkseUJBQWVBLEVBQUcreEgsRUFBVXdZLEdBQzVELE9BQUl4ZixFQUNPLGtCQUFRN3FJLEVBQUssQ0FBQ0EsRUFBSW5ILE1BQU0sR0FBSW1ILEVBQUluSCxNQUFNLEdBQUltSCxFQUFJbkgsTUFBTSxLQUV4RG1ILE07Ozs7eURDL0ZYLHVkQXdETyxNQUFNNnhDLEVBQU0sYUFBRyxDQUFFaTVHOzs7Ozs7Ozs7Ozs7Ozs7OztBQVB4QixTQUFjNXpFLEVBQU1yekMsR0FDaEIsSUFBSWtuSCxFQUFRLDBCQUFnQjd6RSxFQUFNLE9BQVEsT0FDdEM4ekUsRUFBTywwQkFBZ0JubkgsRUFBSyxNQUFPLFFBQ3RDa25ILEVBQU9DLEdBQVEseUJBQWVELEVBQU9DLEdBQ3RDLE1BQU16bEosRUFBUyxDQUFFK0UsRUFBR3lnSixFQUFPaGhJLEVBQUdpaEksR0FDOUIsT0FBTyxTQUFPanJDLFVBQVUsTUFBS3g2RyxPOzs7OzJEQ3REakMsb1lBMENPLE1BQU0wc0MsRUFBUSxhQUFHLENBQUVnNUc7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTjFCLFNBQWdCanhKLEVBQUcrUyxHQUNmLE1BRU14SCxFQUFTLENBQUV2TCxFQUZOLDBCQUFnQkEsRUFBRyxJQUFLLFNBRVgrUyxNQURULDBCQUFnQkEsRUFBTyxRQUFTLFVBRS9DLE9BQU8sU0FBT2d6RyxVQUFVLFFBQU94NkcsTzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDWDVCLFNBQVMwMkYsRUFBTWppRyxFQUFHa3hKLEdBQVUsR0FDL0JyZ0osUUFBUXNELElBQUluVSxFQUFFMDJELFNBQVN3NkYsSUE5QjNCLDhDOzs7OzBEQ0FBLDZjQTZETyxNQUFNN3lILEVBQU8sYUFBRyxDQUFFOHlIOzs7Ozs7Ozs7Ozs7Ozs7OztBQVZ6QixTQUFlbnhKLEVBQUc4VixFQUFPLEtBQU1taUIsR0FBVyxHQUN0QyxJQUFJYyxFQUFLLDBCQUFnQi80QixFQUFHLElBQUssUUFDaEIsU0FBYis0QixFQUFHdjVCLFFBRUh1NUIsRUFBSyxlQUFLQSxFQUFJLFVBRWxCLE1BQU14dEIsRUFBUyxDQUFFdkwsRUFBRys0QixHQUNkaEssRUFBUSxDQUFFalosT0FBTW1pQixZQUN0QixPQUFPLFNBQU84dEYsVUFBVSxPQUFNeDZHLEVBQVF3akIsTzs7OzswREMzRDFDLHNSQWtETyxNQUFNcWlJLEVBQU8sYUFBRyxDQUFFQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFwQnpCLFNBQWV4eUosRUFBT3l5SixFQUFjOXhKLEdBQ2hDLE1BQU1xSSxFQUFPLHdCQUFjaEosR0FDM0IsSUFBSWdHLEVBQVMsS0FDYixHQUFhLE1BQVRyRixHQUEyQixZQUFWQSxFQUNqQnFGLEVBQVMsSUFBSTRqQixhQUFhNWdCLFFBRXpCLEdBQWMsVUFBVnJJLEVBQ0xxRixFQUFTLElBQUkwTCxXQUFXMUksT0FFdkIsSUFBYyxTQUFWckksRUFJTCxNQUFNLElBQUlvRSxNQUFNLHFCQUFxQnBFLEtBSHJDcUYsRUFBUyxJQUFJK0ssV0FBVy9ILEdBSzVCLElBQUssSUFBSTVNLEVBQUksRUFBR0EsRUFBSTRNLEVBQU01TSxJQUN0QjRKLEVBQU81SixHQUFLcTJKLElBRWhCLE9BQU8sU0FBT3hvQyxXQUFXamtILEVBQVFoRyxFQUFPVyxPOzs7OytJQ2hENUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbUJPLE1BQU0reEosRUFDVHIwSixZQUFZMGdDLEVBQU00ekgsRUFBY2h5SixFQUFPaXlKLEVBQVdqOUcsR0FDOUNuM0MsS0FBS3VnQyxLQUFPQSxFQUNadmdDLEtBQUtxMEosT0FBU0YsRUFDZG4wSixLQUFLbUMsTUFBUUEsRUFDYm5DLEtBQUtzMEosUUFBVTdwSSxJQUNmenFCLEtBQUtvMEosVUFBWUEsRUFDYnAwSixLQUFLbzBKLFlBQ0xwMEosS0FBS3UwSixNQUFRdjBKLEtBQUt1Z0MsS0FBcUIsRUFBZHZnQyxLQUFLcTBKLE9BQzlCcjBKLEtBQUt3MEosTUFBUXgwSixLQUFLdWdDLEtBQXFCLEVBQWR2Z0MsS0FBS3EwSixRQUVsQyxNQUFNSSxFQUFZdDlHLEdBQWNwMUMsS0FBS3E1RSxTQUNyQ3A3RSxLQUFLbzdFLE9BQVMsT0FBZ0JxNUUsRUFBVXA3RixZQUc1Q3E3RixZQUNJLElBQUszaUgsTUFBTS94QyxLQUFLczBKLFNBQVUsQ0FDdEIsTUFBTXoxSixFQUFRbUIsS0FBS3MwSixRQUVuQixPQURBdDBKLEtBQUtzMEosUUFBVTdwSSxJQUNSNXJCLEVBRVgsSUFBSTgxSixFQUFTQyxFQUNUQyxHQUFVLEVBQ2QsTUFBUUEsR0FBUyxDQUNiLElBQUl0RCxFQUFJQyxFQUFJN3hKLEVBQ1osR0FDSTR4SixFQUFLLEVBQUl2eEosS0FBS283RSxTQUFXLEVBQ3pCbzJFLEVBQUssRUFBSXh4SixLQUFLbzdFLFNBQVcsRUFDekJ6N0UsRUFBSTR4SixFQUFLQSxFQUFLQyxFQUFLQSxRQUNkN3hKLEdBQUssR0FBVyxJQUFOQSxHQUNuQixNQUFNeXBGLEVBQU1ybkYsS0FBSzRoRCxNQUFNLEVBQU01aEQsS0FBSytVLElBQUluWCxHQUFLQSxHQUMzQ2cxSixFQUFVMzBKLEtBQUt1Z0MsS0FBT3ZnQyxLQUFLcTBKLE9BQVM5QyxFQUFLbm9FLEVBQ3pDd3JFLEVBQVU1MEosS0FBS3VnQyxLQUFPdmdDLEtBQUtxMEosT0FBUzdDLEVBQUtwb0UsRUFDcENwcEYsS0FBS28wSixZQUFhcDBKLEtBQUs4MEosaUJBQWlCSCxLQUN6Q0UsR0FBVSxHQU1sQixPQUhLNzBKLEtBQUtvMEosWUFBYXAwSixLQUFLODBKLGlCQUFpQkYsS0FDekM1MEosS0FBS3MwSixRQUFVdDBKLEtBQUsrMEosYUFBYUgsSUFFOUI1MEosS0FBSyswSixhQUFhSixHQUc3QkksYUFBYWwySixHQUNULE9BQWtCLE1BQWRtQixLQUFLbUMsT0FBZ0MsWUFBZm5DLEtBQUttQyxNQUNwQnRELEVBRUprRCxLQUFLb1IsTUFBTXRVLEdBR3RCaTJKLGlCQUFpQmoySixHQUNiLE9BQU9BLEdBQVNtQixLQUFLdTBKLE9BQVMxMUosR0FBU21CLEtBQUt3MEosT0FLN0MsTUFBTVEsRUFDVG4xSixZQUFZNlYsRUFBT3k4QixFQUFNaHdDLEVBQU9nMUMsR0FDNUJuM0MsS0FBSzBWLE1BQVFBLEVBQ2IxVixLQUFLbXlDLEtBQU8sRUFBSUEsRUFDaEJueUMsS0FBS21DLE1BQVFBLEVBQ2IsTUFBTXN5SixFQUFZdDlHLEdBQWNwMUMsS0FBS3E1RSxTQUNyQ3A3RSxLQUFLaTFKLE1BQVEsT0FBZ0JSLEVBQVVwN0YsWUFDdkNyNUQsS0FBS2sxSixNQUFRLElBQUloQixFQUFZLEVBQUcsRUFBRy94SixHQUFPLEVBQU9uQyxLQUFLaTFKLFNBRWxEajFKLEtBQUs5QixFQURMd1gsRUFBUSxFQUNDQSxFQUFTLEVBQUksRUFHYkEsRUFBUyxFQUFJLEVBRTFCMVYsS0FBSy9CLEVBQUksRUFBSThELEtBQUs0aEQsS0FBSyxFQUFJM2pELEtBQUs5QixHQUdwQ3cySixZQUNJLElBQUluaEYsRUFBSTRoRixFQUFJNUQsRUFBSTV1SixFQUFHOGxHLEVBQUd2eEIsRUFDdEIsT0FBYSxDQUNULEdBQ0l2MEUsRUFBSTNDLEtBQUtrMUosTUFBTVIsWUFDZng5RSxFQUFJLEVBQUtsM0UsS0FBSy9CLEVBQUkwRSxRQUNidTBFLEdBQUssR0FNZCxHQUxBQSxHQUFLQSxFQUFJQSxFQUNUM0QsRUFBSzV3RSxFQUFJQSxFQUNUd3lKLEVBQUssRUFBSyxLQUFRNWhGLEVBQUtBLEVBQ3ZCZytFLEVBQU0sR0FBTWgrRSxFQUFPdnpFLEtBQUs5QixHQUFLLEVBQUlnNUUsRUFBSW4xRSxLQUFLK1UsSUFBSW9nRSxJQUM5Q3V4QixFQUFJem9HLEtBQUtpMUosUUFDTHhzRCxFQUFJMHNELEdBQU1wekosS0FBSytVLElBQUkyeEYsR0FBSzhvRCxFQUN4QixNQU9SLE9BSkFyNkUsRUFBSyxFQUFJbDNFLEtBQUtteUMsS0FBUW55QyxLQUFLOUIsRUFBSWc1RSxFQUMzQmwzRSxLQUFLMFYsTUFBUSxJQUNid2hFLEdBQUtuMUUsS0FBS3k0QyxJQUFJeDZDLEtBQUtpMUosUUFBUyxFQUFJajFKLEtBQUswVixRQUVsQzFWLEtBQUsrMEosYUFBYTc5RSxHQUc3QjY5RSxhQUFhbDJKLEdBQ1QsTUFBbUIsWUFBZm1CLEtBQUttQyxNQUNFdEQsRUFFSmtELEtBQUtvUixNQUFNdFUsSUFHbkIsTUFBTXUySixFQUNUdjFKLFlBQVl1MkMsRUFBTSxFQUFHM1csRUFBTSxFQUFHdDlCLEVBQU9nMUMsR0FZakMsR0FWQW4zQyxLQUFLcTFKLGVBQWlCLElBQXFCLE1BQWRyMUosS0FBS21DLE9BQWdDLFlBQWZuQyxLQUFLbUMsTUFDeERuQyxLQUFLbzJDLElBQU1BLEVBQ1hwMkMsS0FBS2k3QyxNQUFReGIsRUFBTTJXLEVBQ25CcDJDLEtBQUttQyxNQUFRQSxFQUNELE1BQVJnMUMsSUFDQUEsRUFBT3AxQyxLQUFLcTVFLFVBRUksaUJBQVRqa0MsSUFDUEEsRUFBT0EsRUFBS2tpQixhQUVYcjVELEtBQUtxMUosa0JBQW9CcjFKLEtBQUtpN0MsT0FBUyxFQUN4QyxNQUFNLElBQUkxMEMsTUFBTSwwQkFBMEI2dkMsT0FBUzNXLGlDQUV2RHovQixLQUFLbzdFLE9BQVMsT0FBZ0Jqa0MsR0FFbEM0OUcsYUFBYWwySixHQUNULE9BQUltQixLQUFLcTFKLGlCQUNFeDJKLEVBRUprRCxLQUFLb1IsTUFBTXRVLEdBRXRCNjFKLFlBQ0ksT0FBTzEwSixLQUFLKzBKLGFBQWEvMEosS0FBS28yQyxJQUFNcDJDLEtBQUtpN0MsTUFBUWo3QyxLQUFLbzdFLFdBR3ZELFNBQVNrNkUsRUFBd0I5dEosR0FFcEMsTUFBTW5JLEVBQUltSSxFQUFPOUYsT0FDWC9CLEVBOENWLFNBQWtCNkgsR0FFZCxNQUFNK3RKLEVBQWFoMUgsRUFBSy80QixHQUNsQm5JLEVBQUltSSxFQUFPOUYsT0FDakIsSUFBSTh6SixFQUFPLEVBQ1BDLEVBQU8sRUFDWCxJQUFLLElBQUk3M0osRUFBSSxFQUFHQSxFQUFJeUIsRUFBR3pCLElBQUssQ0FDeEIsTUFBTXM1RSxFQUFJMXZFLEVBQU81SixHQUFLMjNKLEVBQ3RCQyxHQUFRenpKLEtBQUt5NEMsSUFBSTA4QixFQUFHLEdBQ3BCdStFLEdBQVExekosS0FBS3k0QyxJQUFJMDhCLEVBQUcsR0FFeEIsT0FBUSxFQUFJNzNFLEVBQUtvMkosRUFBTzF6SixLQUFLeTRDLElBQUssR0FBS243QyxFQUFJLEdBQU1tMkosRUFBTSxLQXpEN0NFLENBQVNsdUosR0FDYjZqQyxFQWdDVixTQUFrQjdqQyxHQUVkLE1BQU0rdEosRUFBYWgxSCxFQUFLLzRCLEdBQ2xCbkksRUFBSW1JLEVBQU85RixPQUNqQixJQUFJOHpKLEVBQU8sRUFDUEcsRUFBTyxFQUNYLElBQUssSUFBSS8zSixFQUFJLEVBQUdBLEVBQUl5QixFQUFHekIsSUFBSyxDQUN4QixNQUFNczVFLEVBQUkxdkUsRUFBTzVKLEdBQUsyM0osRUFDdEJDLEdBQVF6ekosS0FBS3k0QyxJQUFJMDhCLEVBQUcsR0FDcEJ5K0UsR0FBUTV6SixLQUFLeTRDLElBQUkwOEIsRUFBRyxHQUV4QixPQUFRLEVBQUk3M0UsRUFBS3MySixFQUFPNXpKLEtBQUt5NEMsSUFBSyxFQUFJbjdDLEVBQUttMkosRUFBTSxHQTNDdkNJLENBQVNwdUosR0FDYnF1SixFQUFLeDJKLEVBQUksR0FBSzBDLEtBQUt5NEMsSUFBSTc2QyxFQUFHLEdBQUssSUFBT29DLEtBQUt5NEMsSUFBSW5QLEVBQUksRUFBRyxJQUk1RCxHQUFJd3FILEVBRG9CLE1BRXBCLE1BQU0sSUFBSXR2SixNQUFNLDJCQUEyQnN2SixLQUc1QyxTQUFTQyxFQUEwQkMsRUFBUUMsRUFBY0MsRUFBZ0I1akosR0FDN0QsTUFBWEEsSUFDQUEsRUFBVSx5QkFFZCxNQUFNNmpKLEVBQWEzMUgsRUFBS3cxSCxHQUN4Qiw2QkFBbUJHLEVBQVlGLEVBQWMzakosR0FDN0MsNkJBU0osU0FBMkI3SyxFQUFRKzRCLEdBQy9CLElBQUk0MUgsRUFBZ0IsRUFDcEIsSUFBSyxJQUFJdjRKLEVBQUksRUFBR0EsRUFBSTRKLEVBQU85RixPQUFROUQsSUFBSyxDQUNwQyxNQUFNd2xGLEVBQU81N0UsRUFBTzVKLEdBQUsyaUMsRUFDekI0MUgsR0FBaUIveUUsRUFBT0EsRUFFNUIsT0FBT3JoRixLQUFLNGhELEtBQUt3eUcsRUFBZ0IzdUosRUFBTzlGLFFBZnJCMDBKLENBQWtCTCxFQUFRRyxHQUFhRCxFQUFnQjVqSixHQUU5RSxTQUFTa3VCLEVBQUsvNEIsR0FDVixJQUFJK0UsRUFBTSxFQUNWLElBQUssSUFBSTNPLEVBQUksRUFBR0EsRUFBSTRKLEVBQU85RixPQUFROUQsSUFDL0IyTyxHQUFPL0UsRUFBTzVKLEdBRWxCLE9BQU8yTyxFQUFNL0UsRUFBTzlGLFM7Ozs7aUVDaEx4Qiw2U0FvRE8sTUFBTTIwSixFQUFjLGFBQUcsQ0FBRUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBakJoQyxTQUFzQjkwSixFQUFPa1UsRUFBT3k4QixFQUFPLEVBQUdod0MsRUFBUSxVQUFXZzFDLEdBTzdELEdBTlksTUFBUmhGLElBQ0FBLEVBQU8sR0FFRSxNQUFUaHdDLElBQ0FBLEVBQVEsV0FFRSxZQUFWQSxHQUFpQyxVQUFWQSxFQUN2QixNQUFNLElBQUlvRSxNQUFNLHlCQUF5QnBFLEtBRTdDLE1BQU1vMEosRUFBUyxJQUFJLFlBQVU3Z0osRUFBT3k4QixFQUFNaHdDLEVBQU9nMUMsR0FDM0N4dUMsRUFBTSxpQkFBT25ILEVBQU9XLEdBQzFCLElBQUssSUFBSXZFLEVBQUksRUFBR0EsRUFBSStLLEVBQUluQixPQUFPOUYsT0FBUTlELElBQ25DK0ssRUFBSW5CLE9BQU81SixHQUFLMjRKLEVBQU83QixZQUUzQixPQUFPL3JKLEVBQUl5N0csZTs7OztrRUNsRGYsOFNBNkNPLE1BQU1veUMsRUFBZSxhQUFHLENBQUVDOzs7Ozs7Ozs7Ozs7Ozs7OztBQVhqQyxTQUF1QmoxSixFQUFPKytCLEVBQU8sRUFBRzh6SCxFQUFTLEVBQUdseUosRUFBT2cxQyxHQUN2RCxHQUFhLE1BQVRoMUMsR0FBMkIsU0FBVkEsRUFDakIsTUFBTSxJQUFJb0UsTUFBTSx5QkFBeUJwRSxLQUU3QyxNQUFNdTBKLEVBQVksSUFBSSxjQUFZbjJILEVBQU04ekgsRUFBUWx5SixHQUFPLEVBQXVCZzFDLEdBQ3hFeHVDLEVBQU0saUJBQU9uSCxFQUFPVyxHQUMxQixJQUFLLElBQUl2RSxFQUFJLEVBQUdBLEVBQUkrSyxFQUFJbkIsT0FBTzlGLE9BQVE5RCxJQUNuQytLLEVBQUluQixPQUFPNUosR0FBSzg0SixFQUFVaEMsWUFFOUIsT0FBTy9ySixFQUFJeTdHLGU7Ozs7bUVDM0NmLCtTQStDTyxNQUFNdXlDLEVBQWdCLGFBQUcsQ0FBRUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUmxDLFNBQXdCcDFKLEVBQU9xMUosRUFBUyxFQUFHQyxFQUFTLEVBQUczMEosRUFBUSxVQUFXZzFDLEdBQ3RFLE1BQU14dUMsRUFBTSxpQkFBT25ILEVBQU9XLEdBQ3BCaTVFLEVBQVMsSUFBSSxnQkFBY3k3RSxFQUFRQyxFQUFRLEtBQU0zL0csR0FDdkQsSUFBSyxJQUFJdjVDLEVBQUksRUFBR0EsRUFBSStLLEVBQUluQixPQUFPOUYsT0FBUTlELElBQ25DK0ssRUFBSW5CLE9BQU81SixHQUFLdzlFLEVBQU9zNUUsWUFFM0IsT0FBTy9ySixFQUFJeTdHLGU7Ozs7MkRDN0NmOzs7Ozs7Ozs7Ozs7Ozs7OztBQXFDTyxTQUFTbnBFLEVBQU1oeUMsRUFBT2txQyxFQUFNK0gsRUFBTyxFQUFHLzRDLEVBQVEsV0FDakQsR0FBYSxJQUFUKzRDLEVBQ0EsTUFBTSxJQUFJMzBDLE1BQU0sOEJBRXBCLE1BQU1tckIsRUFBUSxDQUFFem9CLFFBQU9rcUMsT0FBTStILE9BQU0vNEMsU0FDbkMsT0FBTyxTQUFPdW1ILFVBQVUsUUFBTyxHQUFpQmgzRixLOzs7OzBEQzFDcEQsbVlBd0NPLE1BQU1yb0IsRUFBTyxhQUFHLENBQUUwdEo7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTHpCLFNBQWUxb0osR0FDWCxNQUNNSCxFQUFTLENBQUVHLE1BREYsMEJBQWdCQSxFQUFPLFFBQVMsU0FFL0MsT0FBTyxTQUFPcTZHLFVBQVUsT0FBTXg2RyxPOzs7O2dFQ3RDbEMseVlBcUNPLE1BQU1xdEMsRUFBYSxhQUFHLENBQUV5N0c7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTC9CLFNBQXFCcjBKLEdBQ2pCLE1BQ011TCxFQUFTLENBQUV2TCxFQUROLDBCQUFnQkEsRUFBRyxJQUFLLGVBRW5DLE9BQU8sU0FBTytsSCxVQUFVLGFBQVl4NkcsTzs7OztxR0NuQ3hDOzs7Ozs7Ozs7Ozs7Ozs7O0dBcUJPLE1BQU0rb0osRUFBd0IsR0FDOUIsU0FBU2xtSSxFQUF5Qmp2QixHQUNyQyxPQUFJQSxHQUFVbTFKLEVBQ0huMUosRUFFSix5QkFBZUEsRUFBUUMsS0FBSzJZLE1BQU0zWSxLQUFLNGhELEtBQUs3aEQsTzs7OzswREMxQnZELG1ZQXNDTyxNQUFNNDVDLEVBQU8sYUFBRyxDQUFFdzdHOzs7Ozs7Ozs7Ozs7Ozs7OztBQUx6QixTQUFldjBKLEdBQ1gsTUFDTXVMLEVBQVMsQ0FBRXZMLEVBRE4sMEJBQWdCQSxFQUFHLElBQUssU0FFbkMsT0FBTyxTQUFPK2xILFVBQVUsT0FBTXg2RyxPOzs7OzJEQ3BDbEMsb1lBc0NPLE1BQU0ydEMsRUFBUSxhQUFHLENBQUVzN0c7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTDFCLFNBQWdCeDBKLEdBQ1osTUFDTXVMLEVBQVMsQ0FBRXZMLEVBRE4sMEJBQWdCQSxFQUFHLElBQUssVUFFbkMsT0FBTyxTQUFPK2xILFVBQVUsUUFBT3g2RyxPOzs7OzZEQ3BDbkMsc1lBb0RPLE1BQU02dEMsRUFBVSxhQUFHLENBQUVxN0c7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTjVCLFNBQWtCejBKLEVBQUduQixHQUNqQixNQUNNME0sRUFBUyxDQUFFdkwsRUFETiwwQkFBZ0JBLEVBQUcsSUFBSyxVQUFXLHNCQUV4Qyt1QixFQUFRLENBQUVsd0IsU0FDaEIsT0FBTyxTQUFPa25ILFVBQVUsVUFBU3g2RyxFQUFRd2pCLE87Ozs7NkRDbEQ3QyxzWUF5RE8sTUFBTXpVLEVBQVUsYUFBRyxDQUFFbzZJOzs7Ozs7Ozs7Ozs7Ozs7OztBQU41QixTQUFrQjEwSixFQUFHOFYsR0FDakIsTUFDTXZLLEVBQVMsQ0FBRXZMLEVBRE4sMEJBQWdCQSxFQUFHLElBQUssWUFFN0IrdUIsRUFBUSxDQUFFdXJCLEtBQU14a0MsR0FDdEIsT0FBTyxTQUFPaXdHLFVBQVUsVUFBU3g2RyxFQUFRd2pCLE87Ozs7K0RDdkQ3Qyw2WEE4Qk8sTUFBTTRsSSxFQUFZLGFBQUcsQ0FBRUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTDlCLFNBQW9CNTBKLEdBQ2hCLE1BQU0rNEIsRUFBSywwQkFBZ0IvNEIsRUFBRyxJQUFLLFdBRW5DLE9BREEsU0FBd0IsSUFBWis0QixFQUFHeDVCLE1BQVksSUFBTSxxREFBcUR3NUIsRUFBR3g1QixVQUNsRixrQkFBUXc1QixFQUFJLE87Ozs7K0RDNUJ2Qiw2WEFnQ08sTUFBTTg3SCxFQUFZLGFBQUcsQ0FBRUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTDlCLFNBQW9COTBKLEVBQUc4VixHQUNuQixNQUFNaWpCLEVBQUssMEJBQWdCLzRCLEVBQUcsSUFBSyxXQUVuQyxPQURBLFNBQXdCLElBQVorNEIsRUFBR3g1QixNQUFZLElBQU0scURBQXFEdzVCLEVBQUd4NUIsVUFDbEYsa0JBQVF3NUIsRUFBSWpqQixPOzs7OytEQzlCdkIsNlhBZ0NPLE1BQU1pL0ksRUFBWSxhQUFHLENBQUVDOzs7Ozs7Ozs7Ozs7Ozs7OztBQUw5QixTQUFvQmgxSixFQUFHOFYsR0FDbkIsTUFBTWlqQixFQUFLLDBCQUFnQi80QixFQUFHLElBQUssV0FFbkMsT0FEQSxTQUF3QixJQUFaKzRCLEVBQUd4NUIsTUFBWSxJQUFNLHFEQUFxRHc1QixFQUFHeDVCLFVBQ2xGLGtCQUFRdzVCLEVBQUlqakIsTzs7OzsrREM5QnZCLDZYQWdDTyxNQUFNbS9JLEVBQVksYUFBRyxDQUFFQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFMOUIsU0FBb0JsMUosRUFBRzhWLEdBQ25CLE1BQU1pakIsRUFBSywwQkFBZ0IvNEIsRUFBRyxJQUFLLFdBRW5DLE9BREEsU0FBd0IsSUFBWis0QixFQUFHeDVCLE1BQVksSUFBTSxxREFBcUR3NUIsRUFBR3g1QixVQUNsRixrQkFBUXc1QixFQUFJampCLE87Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2JoQixTQUFTaWxDLEVBQWVILEVBQVF0aEMsRUFBYUMsR0FHaEQsTUFBTyxDQUZTQSxHQUFnQyxpQkFBWHFoQyxFQUFzQkEsRUFBU0EsRUFBTyxJQUMzRHRoQyxHQUFpQyxpQkFBWHNoQyxFQUFzQkEsRUFBU0EsRUFBTyxLQW5CaEYsdUQ7Ozs7MkRDQUEsb1lBc0NPLE1BQU1wcUMsRUFBUSxhQUFHLENBQUUya0o7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTDFCLFNBQWdCbjFKLEdBQ1osTUFDTXVMLEVBQVMsQ0FBRXZMLEVBRE4sMEJBQWdCQSxFQUFHLElBQUssVUFFbkMsT0FBTyxTQUFPK2xILFVBQVUsUUFBT3g2RyxPOzs7OzJEQ3BDbkMsb1lBc0NPLE1BQU0ydkMsRUFBUSxhQUFHLENBQUVrNkc7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTDFCLFNBQWdCcDFKLEdBQ1osTUFDTXVMLEVBQVMsQ0FBRXZMLEVBRE4sMEJBQWdCQSxFQUFHLElBQUssVUFFbkMsT0FBTyxTQUFPK2xILFVBQVUsUUFBT3g2RyxPOzs7OzREQ3BDbkM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaUNPLFNBQVM4cEosRUFBT241SixFQUFPc0QsR0FDMUIsSUFBTSx1QkFBYXRELElBQW9CLFdBQVZzRCxHQUF1QmlXLE1BQU1zdkQsUUFBUTdvRSxLQUNwRCxjQUFWc0QsRUFDQSxNQUFNLElBQUlvRSxNQUFNLGtGQUdwQixHQUFjLFdBQVZwRSxHQUFzQix1QkFBYXRELE1BQ2pDQSxhQUFpQjBULFlBQ25CLE1BQU0sSUFBSWhNLE1BQU0sNkVBS3BCLE9BQU8scUJBQVcxSCxFQUZKLEdBQ1EsR0FDeUJzRCxLOzs7OytEQzlDbkQsd2VBaURPLE1BQU04MUosRUFBWSxhQUFHLENBQUVDOzs7Ozs7Ozs7Ozs7Ozs7OztBQVQ5QixTQUFvQjFvSCxFQUFTd08sRUFBU3g4QyxHQUNsQyxNQUFNOC9DLEVBQVcsMEJBQWdCOVIsRUFBUyxVQUFXLFlBQWEsU0FDNUQyb0gsRUFBVywwQkFBZ0JuNkcsRUFBUyxVQUFXLGFBQ3JELGdCQUE4Qm02RyxFQUFVNzJHLEVBQVU5L0MsR0FDbEQsTUFBTTBNLEVBQVMsQ0FBRXNoQyxRQUFTOFIsRUFBVXRELFFBQVNtNkcsR0FDdkN6bUksRUFBUSxDQUFFbHdCLFNBRWhCLE9BQU8sU0FBT2tuSCxVQUFVLFlBQVd4NkcsRUFBUXdqQixPOzs7O3lHQy9DL0Msb09BT08sU0FBUzBtSSxFQUFvQjUySixFQUFPZ3VDLEVBQVN3TyxHQUNoRCxNQUFNaitCLEVBQVl5dkIsRUFBUXR0QyxLQUFPLEVBQUtzdEMsRUFBUWh1QyxNQUFNZ3VDLEVBQVF0dEMsS0FBTyxHQUFLLEVBQ2xFczlCLEVBQVlnUSxFQUFRdHRDLEtBQU8sRUFBS3N0QyxFQUFRdHRDLEtBQU8sRUFBSSxFQUNuRG0ySixFQUNGLDZGQUF3Q3I2RyxFQUFReDhDLHlCQUM1Qmd1QyxFQUFRaHVDLGlCQUFpQkEsZ0JBQzlCdWUsb0JBQTJCeWYsS0FDOUMsR0FBSXdlLEVBQVE5N0MsS0FBT3M5QixFQUNmLE1BQU0sSUFBSWo1QixNQUFNOHhKLEVBQWEsa0JBQWtCNzRILE9BRW5ELEdBQUloK0IsRUFBTUUsT0FBU3FlLEdBQVlpK0IsRUFBUTk3QyxLQUFPczlCLEdBQzFDLE1BQU0sSUFBSWo1QixNQUFNOHhKLEVBQ1osMEJBQTBCdDRJLEdBQVlpK0IsRUFBUTk3QyxLQUFPczlCLE1BRTdELEdBQUl3ZSxFQUFROTdDLE9BQVNzOUIsRUFBV2grQixFQUFNRSxPQUFTcWUsRUFDM0MsTUFBTSxJQUFJeFosTUFBTTh4SixFQUFhLG9CQUFtQjc0SCxFQUFXaCtCLEVBQU1FLE9BQVNxZSxJQUU5RSxJQUFLLElBQUk3aEIsRUFBSSxFQUFHQSxFQUFJc2hDLElBQVl0aEMsRUFDNUIsR0FBSTgvQyxFQUFReDhDLE1BQU10RCxLQUFPc3hDLEVBQVFodUMsTUFBTXRELEdBQ25DLE1BQU0sSUFBSXFJLE1BQU04eEosRUFDWixrQkFBa0JuNkosT0FBTzgvQyxFQUFReDhDLE1BQU10RCx3QkFBd0JBLE9BQU9zeEMsRUFBUWh1QyxNQUFNdEQsUUFHaEcsSUFBSyxJQUFJQSxFQUFJLEVBQUdBLEVBQUk4L0MsRUFBUTk3QyxLQUFPczlCLElBQVl0aEMsRUFDM0MsR0FBSTgvQyxFQUFReDhDLE1BQU10RCxFQUFJc2hDLEtBQWNoK0IsRUFBTXRELEVBQUk2aEIsR0FDMUMsTUFBTSxJQUFJeFosTUFBTTh4SixFQUNaLGtCQUFrQm42SixFQUFJc2hDLE9BQWN3ZSxFQUFReDhDLE1BQU10RCxFQUFJc2hDLGdCQUF1QnRoQyxFQUFJc2hDLE9BQWNoK0IsRUFBTXRELEVBQUlzaEMsT0FXbEgsU0FBUzg0SCxFQUFjdDZHLEVBQVN4TyxFQUFTaHVDLEdBQzVDLEdBQUlndUMsRUFBUXR0QyxLQUFPLEVBQ2YsTUFBTSxJQUFJcUUsTUFDTiwrRUFBcUJpcEMsRUFBUXR0QyxTQUVyQyxHQUFJODdDLEVBQVE5N0MsS0FBTyxFQUNmLE1BQU0sSUFBSXFFLE1BQ04sK0VBQXFCeTNDLEVBQVE5N0MsU0FFckMsR0FBc0IsVUFBbEJzdEMsRUFBUXJ0QyxNQUNSLE1BQU0sSUFBSW9FLE1BQU0sMERBQTBEaXBDLEVBQVFydEMsU0FFdEYsR0FBSVgsRUFBTUUsT0FBUyxFQUNmLE1BQU0sSUFBSTZFLE1BQU0sNkRBQTZEL0UsS0FFakYsR0FBcUIsSUFBakJBLEVBQU1FLE9BQWMsQ0FDcEIsR0FBcUIsSUFBakI4dEMsRUFBUWhsQyxLQUNSLE1BQU0sSUFBSWpFLE1BQU0sc0RBQXNEaXBDLEVBQVFodUMsU0FFbEYsR0FBcUIsSUFBakJ3OEMsRUFBUXh6QyxLQUNSLE1BQU0sSUFBSWpFLE1BQU0sc0RBQXNEeTNDLEVBQVF4OEMsU0FHdEY0MkosRUFBb0I1MkosRUFBT2d1QyxFQUFTd08sR0FXakMsU0FBU0csRUFBZ0JILEVBQVN4TyxFQUFTaHVDLEdBRTlDLE1BQU0rdkQsRUFBYy9oQixFQUFRaHVDLE1BQU1FLE9BQzVCZ3VDLEVBQWE2aEIsRUFBYyxFQUFLL2hCLEVBQVFodUMsTUFBTSt2RCxFQUFjLEdBQUssRUFJakVnbkcsRUFBVS8ySixFQUFNRSxPQUN0QixJQUFJOC9CLEVBQVksRUFDaEIsSUFBSyxJQUFJNWpDLEVBQUk4eEMsRUFBVzl4QyxFQUFJMjZKLElBQVczNkosRUFDbkM0akMsR0FBYWhnQyxFQUFNNUQsR0FFdkIsTUFBTTQ2SixFQUFnQjlvSCxFQUFZLEVBQUssRUFBSUEsRUFJM0MsTUFBTyxDQUFFQSxZQUFXdU8sV0FIRCx3QkFBY3pPLEVBQVFodUMsT0FBU2czSixFQUdsQmgzSCxZQUFXeGhCLFFBRjNCLElBQUkseUJBQWV4ZSxFQUFNSyxNQUFNLEVBQUc2dEMsSUFBYSxHQUVYd08sV0FEakMsd0JBQWMxOEMsTTs7Ozs4SEM3RnJDOzs7Ozs7Ozs7Ozs7Ozs7OztBQWtCTyxTQUFTc29ELEVBQThCaG9ELEVBQVE2bkQsR0FDbEQsSUFDSWhoRCxFQURBd29JLEdBQU8sRUFTWCxJQVBJcnZJLEdBQVUseUJBQ1Y2RyxFQUFNN0csRUFDTnF2SSxHQUFPLEdBR1B4b0ksRUFBTSx5QkFBZTdHLEVBQVFDLEtBQUsyWSxNQUFNM1ksS0FBSzRoRCxLQUFLN2hELE1BRTlDcXZJLEdBQ0F4b0ksRUFBTWdoRCxHQUFlaGhELElBQVE3RyxFQUM3QnF2SSxHQUFPLEVBR1B4b0ksRUFBTSx5QkFBZTdHLEVBQVE2RyxFQUFNLEdBRzNDLE9BQU9BLEVBRUosU0FBU3VQLEVBQWdCdEQsRUFBUTZELEVBQU1reEMsR0FDMUMsTUFBTTFuRCxFQUFXLEdBQ1hDLEVBQU8wUyxFQUFPbFQsT0FDcEIsSUFBSyxJQUFJZ3JDLEVBQU0sRUFBR0EsRUFBTXhxQyxFQUFNd3FDLElBQ3RCQSxJQUFRajBCLEVBQ1J4VyxFQUFTMUIsS0FBS3FVLEVBQU84M0IsSUFHckJ6cUMsRUFBUzFCLEtBQUtvcEQsR0FHdEIsT0FBTzFuRCxFQUVKLFNBQVN3dUMsRUFBeUI5dEMsRUFBRzZzQyxFQUFTLzJCLEVBQU02M0IsR0FDdkQsTUFBTWloQixFQUFjL2hCLEVBQVFodUMsTUFBTUUsT0FDNUI4cUIsRUFBUTdwQixFQUFFbkIsTUFBTUUsT0FDdEIsR0FBa0IsSUFBZDR1QyxJQUNJQSxHQUFhaWhCLEdBQWVqaEIsRUFBWWloQixHQUN4QyxNQUFNLElBQUlockQsTUFBTSxzQ0FBc0NnckQsTUFBZ0JBLGVBQXlCamhCLEtBTXZHLEdBSElBLEVBQVksSUFDWkEsR0FBYWloQixHQUViamhCLEVBQVk5akIsRUFDWixNQUFNLElBQUlqbUIsTUFBTSxjQUFjK3BDLHVDQUNoQzlqQixPQUVGLEdBQUkvVCxFQUFPNjNCLEVBQ1AsTUFBTSxJQUFJL3BDLE1BQU0sY0FBYytwQywwQ0FBa0Q3M0IsT0FFcEYsSUFBSyxJQUFJN2EsRUFBSSxFQUFHQSxFQUFJMHlDLElBQWExeUMsRUFDN0IsR0FBSStFLEVBQUVuQixNQUFNNUQsS0FBTzR4QyxFQUFRaHVDLE1BQU01RCxHQUM3QixNQUFNLElBQUkySSxNQUFNLFdBQVczSSxPQUFPK0UsRUFBRW5CLE1BQU01RCx1Q0FBdUNBLE9BQU80eEMsRUFBUWh1QyxNQUFNNUQsT0FHOUcsTUFBTWd6QyxFQUFVanVDLEVBQUVuQixNQUFNaVgsR0FDbEIzWSxFQUFjLEdBQ3BCLElBQUlxQixFQUFZLEVBQ1p3dkMsRUFBWSxFQUNablAsRUFBWSxFQUNoQixJQUFLLElBQUk1akMsRUFBSSxFQUFHQSxFQUFJMHlDLElBQWExeUMsRUFDN0JrQyxFQUFZUyxLQUFLb0MsRUFBRW5CLE1BQU01RCxJQUN6QnVELEdBQWF3QixFQUFFbkIsTUFBTTVELEdBRXpCLElBQUssSUFBSUEsRUFBSTB5QyxFQUFXMXlDLEVBQUk2YSxFQUFNN2EsSUFDOUJrQyxFQUFZUyxLQUFLb0MsRUFBRW5CLE1BQU01RCxJQUN6Qit5QyxHQUFhaHVDLEVBQUVuQixNQUFNNUQsR0FFekIsSUFBSyxJQUFJQSxFQUFJMHlDLEVBQVcxeUMsRUFBSTJ6RCxFQUFhM3pELElBQ3JDa0MsRUFBWVMsS0FBS2l2QyxFQUFRaHVDLE1BQU01RCxJQUVuQyxJQUFLLElBQUlBLEVBQUk2YSxFQUFPLEVBQUc3YSxFQUFJNHVCLEVBQU81dUIsSUFDOUJrQyxFQUFZUyxLQUFLb0MsRUFBRW5CLE1BQU01RCxJQUN6QjRqQyxHQUFhNytCLEVBQUVuQixNQUFNNUQsR0FFekIsTUFBTyxDQUFFdUQsWUFBV3FnQyxZQUFXbVAsWUFBV0MsVUFBUzl3QyxpQjs7OzswREM5RnZELG1ZQXVDTyxNQUFNKytDLEVBQU8sYUFBRyxDQUFFNDVHOzs7Ozs7Ozs7Ozs7Ozs7OztBQUx6QixTQUFlOTFKLEdBQ1gsTUFDTXVMLEVBQVMsQ0FBRXZMLEVBRE4sMEJBQWdCQSxFQUFHLElBQUssU0FFbkMsT0FBTyxTQUFPK2xILFVBQVUsT0FBTXg2RyxPOzs7O2lGQ3JDbEM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0JPLE1BQU15d0MsRUFBa0IsbUJBQ2xCQyxFQUFhLG9COzs7O3FFQ2pCMUIsbWpCQXdGTyxNQUFNODVHLEVBQWtCLGFBQUcsQ0FBRUMsaUJBckNwQyxTQUEwQmgySixFQUFHaTJKLEVBQWlCQyxFQUFpQjc0SSxFQUFTZ2QsRUFBS3c5RyxFQUFXLENBQUMsRUFBRyxHQUFJbmhJLEVBQWEsUUFDekcsTUFBTXFpQixFQUFLLDBCQUFnQi80QixFQUFHLElBQUssbUJBQzdCbTJKLEVBQW1CLDBCQUFnQkYsRUFBaUIsa0JBQW1CLG1CQUN2RUcsRUFBbUIsMEJBQWdCRixFQUFpQixrQkFBbUIsbUJBQzdFLElBQUl0bEIsRUFBTTczRyxFQUNOODNHLEdBQWUsRUFLbkIsR0FKZ0IsSUFBWjkzRyxFQUFHeDVCLE9BQ0hzeEksR0FBZSxFQUNmRCxFQUFNLGtCQUFRNzNHLEVBQUksQ0FBQyxFQUFHQSxFQUFHbDZCLE1BQU0sR0FBSWs2QixFQUFHbDZCLE1BQU0sR0FBSWs2QixFQUFHbDZCLE1BQU0sTUFFMUMsU0FBZjZYLEVBQ0EsTUFBTSxJQUFJOVMsTUFBTSxzRkFHcEIsU0FBeUIsSUFBYmd0SSxFQUFJcnhJLE1BQVksSUFDeEIsZ0VBQVFxeEksRUFBSXJ4SSxVQUNoQixTQUFzQyxJQUExQjQySixFQUFpQjUySixNQUFZLElBQ3JDLDJFQUFZNDJKLEVBQWlCNTJKLFVBQ2pDLFNBQXNDLElBQTFCNjJKLEVBQWlCNzJKLE1BQVksSUFDckMsMkVBQVk0MkosRUFBaUI1MkosVUFDakMsU0FBMEMsSUFBOUI2MkosRUFBaUJ2M0osTUFBTSxJQUFVLElBQ3pDLHlGQUF1QnUzSixFQUFpQnYzSixNQUFNLFFBQ2xELFNBQTBDLElBQTlCdTNKLEVBQWlCdjNKLE1BQU0sSUFBVSxJQUN6Qyx5RkFBNkJ1M0osRUFBaUJ2M0osTUFBTSxRQUN4RCxNQUFNMFksRUFBYTQrSSxFQUFpQnQzSixNQUFNLEdBQ3BDdzNKLEVBQW9CRixFQUFpQnQzSixNQUFNLEdBQ2pELFNBQVl1M0osRUFBaUJ2M0osTUFBTSxLQUFPMFksRUFBYTgrSSxHQUFtQixJQUN0RSw2RUFBVzkrSSxFQUFhOCtJLGNBQ2JELEVBQWlCdjNKLE1BQU0sUUFDdEMsTUFBTXM2SSxFQUFZLDBCQUFnQnZJLEVBQUt1bEIsRUFBa0I5NEksRUFBU2dkLEVBQUszakIsRUFBWW1oSSxHQUU3RTd4SSxFQUFNLGlCQUFPbXpJLEVBQVdpZCxFQUROLEVBQ3lDLFFBQVMxL0ksR0FDMUUsT0FBSW02SCxFQUNPLGtCQUFRN3FJLEVBQUssQ0FBQ0EsRUFBSW5ILE1BQU0sR0FBSW1ILEVBQUluSCxNQUFNLEdBQUltSCxFQUFJbkgsTUFBTSxLQUV4RG1ILE07Ozs7b0VDdEZYLHlTQTBFTyxNQUFNc3dKOzs7Ozs7Ozs7Ozs7Ozs7OztBQTFCYmpsRSxlQUErQnJ4RixFQUFHOGxCLEdBQzlCLE1BQU1pVCxFQUFLLDBCQUFnQi80QixFQUFHLElBQUssYUFDN0J5ckosRUFBSywwQkFBZ0IzbEksRUFBRyxJQUFLLGFBQ25DLFNBQVlpVCxFQUFHdjVCLFFBQVVpc0osRUFBR2pzSixPQUFPLElBQU0sa0RBQWtEdTVCLEVBQUd2NUIsaUJBQWlCaXNKLEVBQUdqc0osWUFDbEgsU0FBd0IsSUFBWnU1QixFQUFHeDVCLE1BQVksSUFBTSxxQ0FBcUN3NUIsRUFBR2w2QixZQUN6RSxTQUF3QixJQUFaNHNKLEVBQUdsc0osTUFBWSxJQUFNLHFDQUFxQ2tzSixFQUFHNXNKLFlBQ3pFLE1BQU0yZ0MsUUFBY3pHLEVBQUc3eUIsT0FDakI4bEUsUUFBY3kvRSxFQUFHdmxKLE9BQ2pCcXdKLEVBQU8sSUFBSXA0QyxJQUFJbnlDLEdBQ3JCLElBQUl6d0IsRUFBYSxFQUNqQixJQUFLLElBQUl0Z0QsRUFBSSxFQUFHQSxFQUFJdWtDLEVBQU16Z0MsT0FBUTlELElBQ3pCczdKLEVBQUtseEosSUFBSW02QixFQUFNdmtDLEtBQ2hCc2dELElBR1IsTUFBTWwwQyxFQUFTLElBQUksZUFBYSxDQUFDazBDLEdBQWF4aUIsRUFBR3Y1QixPQUMzQ3F0QyxFQUFVLElBQUksZUFBYSxDQUFDME8sR0FBYSxTQUMvQyxJQUFLLElBQUl0Z0QsRUFBSSxFQUFHOEIsRUFBSSxFQUFHOUIsRUFBSXVrQyxFQUFNemdDLE9BQVE5RCxJQUNoQ3M3SixFQUFLbHhKLElBQUltNkIsRUFBTXZrQyxNQUNoQm9NLEVBQU94QyxPQUFPOUgsR0FBS3lpQyxFQUFNdmtDLEdBQ3pCNHhDLEVBQVFob0MsT0FBTzlILEdBQUs5QixFQUNwQjhCLEtBR1IsTUFBTyxDQUFDc0ssRUFBT282RyxXQUFZNTBFLEVBQVE0MEUsYzs7Ozs2REN4RXZDLHNZQXFDTyxNQUFNcGxFLEVBQVUsYUFBRyxDQUFFbTZHOzs7Ozs7Ozs7Ozs7Ozs7OztBQUw1QixTQUFrQngySixHQUNkLE1BQ011TCxFQUFTLENBQUV2TCxFQUROLDBCQUFnQkEsRUFBRyxJQUFLLFlBRW5DLE9BQU8sU0FBTytsSCxVQUFVLFVBQVN4NkcsTzs7OzswRENuQ3JDLG1ZQXFDTyxNQUFNZ3hDLEVBQU8sYUFBRyxDQUFFazZHOzs7Ozs7Ozs7Ozs7Ozs7OztBQUx6QixTQUFlejJKLEdBQ1gsTUFDTXVMLEVBQVMsQ0FBRXZMLEVBRE4sMEJBQWdCQSxFQUFHLElBQUssU0FFbkMsT0FBTyxTQUFPK2xILFVBQVUsT0FBTXg2RyxPOzs7OzJEQ25DbEMsaWhCQTRETyxNQUFNK2lKLEVBQVEsYUFBRyxDQUFFb0k7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdEIxQixTQUFnQnZJLEVBQVF3SSxFQUFhQyxFQUFXbEcsR0FBUyxFQUFPbUcsRUFBVyxHQUN2RSxJQUFJdndKLEVBQVEsRUFDWixNQUFNc0MsRUFBUyxHQUNmLEtBQU90QyxFQUFRcXdKLEdBQWV4SSxFQUFPdG1KLE1BQ2pDZSxFQUFPaEwsS0FBSyxnQkFBTXV3SixFQUFRN25KLEVBQU9xd0osSUFDakNyd0osR0FBU3N3SixFQUViLEdBQUlsRyxFQUNBLEtBQU9wcUosRUFBUTZuSixFQUFPdG1KLE1BQU0sQ0FDeEIsTUFBTWl2SixFQUFVeHdKLEVBQVFxd0osRUFBZXhJLEVBQU90bUosS0FDeEN3eUIsRUFBTSxpQkFBTyxDQUNmLGdCQUFNOHpILEVBQVE3bkosRUFBT3F3SixFQUFjRyxHQUFTLGVBQUssQ0FBQ0EsR0FBU0QsS0FFL0RqdUosRUFBT2hMLEtBQUt5OEIsR0FDWi96QixHQUFTc3dKLEVBR2pCLE9BQXNCLElBQWxCaHVKLEVBQU83SixPQUNBLG1CQUFTLEdBQUksQ0FBQyxFQUFHNDNKLElBRXJCLGtCQUFRLGlCQUFPL3RKLEdBQVMsQ0FBQ0EsRUFBTzdKLE9BQVE0M0osUTs7OzttRUMxRG5ELCtPQWlDTyxNQUFNdkksRUFBZ0IsYUFBRyxDQUFFMkk7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBSGxDLFNBQXdCQyxHQUNwQixPQUFPLHVCQUFhQSxFQUFjLElBQU0sUzs7OztnRUMvQjVDLDRPQWlDTyxNQUFNM0ksRUFBYSxhQUFHLENBQUU0STs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFIL0IsU0FBcUJELEdBQ2pCLE9BQU8sdUJBQWFBLEVBQWMsR0FBSyxROzs7OzBEQy9CM0MsOGpCQThDTyxNQUFNekksRUFBTyxhQUFHLENBQUUySTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFSekIsU0FBZS9JLEVBQVF3SSxFQUFhQyxFQUFXTyxFQUFXQyxFQUFXLGNBQ2hELE1BQWJELElBQ0FBLEVBQVksOEJBQW9CUixJQUVwQyxNQUFNVSxFQUFlLGdCQUFNbEosRUFBUXdJLEVBQWFDLEdBQzFDVSxFQUFpQixjQUFJRCxFQUFjRCxFQUFTVCxJQUNsRCxPQUFPLGVBQUtXLEVBQWdCSCxPOzs7O3VGQzVDaEM7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQk8sU0FBU0ksRUFBb0JyN0osR0FFaEMsT0FBT2tELEtBQUsyWSxNQUFNM1ksS0FBS3k0QyxJQUFJLEVBQUd6NEMsS0FBS0MsS0FBS0QsS0FBSytVLElBQUlqWSxHQUFTa0QsS0FBSytVLElBQUksTUFFaEUsU0FBU3FqSixFQUFhUixFQUFjMW1KLEVBQUd5ZixHQUMxQyxNQUFNMG5JLEVBQU8sRUFBSVQsRUFBZSxFQUMxQnQ1RSxFQUFZLElBQUlqMUQsYUFBYXV1SSxHQUNuQyxJQUFLLElBQUkvN0osRUFBSSxFQUFHQSxFQUFJKzdKLElBQWdCLzdKLEVBQUcsQ0FDbkMsTUFBTXk4SixFQUFVLEVBQU10NEosS0FBS2tkLEdBQUtyaEIsR0FBTSs3SixFQUFlUyxFQUFPLEdBQzVELzVFLEVBQVV6aUYsR0FBS3FWLEVBQUl5ZixFQUFJM3dCLEtBQUtxbEMsSUFBSWl6SCxHQUVwQyxPQUFPLG1CQUFTaDZFLEVBQVcsYTs7Ozt5REM1Qi9CLGtZQXFDTyxNQUFNMWlDLEVBQU0sYUFBRyxDQUFFMjhHOzs7Ozs7Ozs7Ozs7Ozs7OztBQUx4QixTQUFjMzNKLEdBQ1YsTUFDTXVMLEVBQVMsQ0FBRXZMLEVBRE4sMEJBQWdCQSxFQUFHLElBQUssUUFFbkMsT0FBTyxTQUFPK2xILFVBQVUsTUFBS3g2RyxPOzs7OzBEQ25DakMsbVlBcUNPLE1BQU1veEMsRUFBTyxhQUFHLENBQUVpN0c7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTHpCLFNBQWU1M0osR0FDWCxNQUNNdUwsRUFBUyxDQUFFdkwsRUFETiwwQkFBZ0JBLEVBQUcsSUFBSyxTQUVuQyxPQUFPLFNBQU8rbEgsVUFBVSxPQUFNeDZHLE87Ozs7MkRDbkNsQyxvWUErRE8sTUFBTXJNLEVBQVEsYUFBRyxDQUFFMjRKOzs7Ozs7Ozs7Ozs7Ozs7OztBQVQxQixTQUFnQjczSixFQUFHby9CLEVBQU92M0IsR0FDdEIsTUFBTWt4QixFQUFLLDBCQUFnQi80QixFQUFHLElBQUssUUFBUyxxQkFDNUMsR0FBZ0IsSUFBWis0QixFQUFHeDVCLEtBQ0gsTUFBTSxJQUFJcUUsTUFBTSxrQ0FFcEIsTUFBTTJILEVBQVMsQ0FBRXZMLEVBQUcrNEIsR0FDZGhLLEVBQVEsQ0FBRXFRLFFBQU92M0IsUUFDdkIsT0FBTyxTQUFPaytHLFVBQVUsUUFBT3g2RyxFQUFRd2pCLE87Ozs7NkRDN0QzQyx1WEE2Qk8sTUFBTStvSSxFQUFVLGFBQUcsQ0FBRUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTDVCLFNBQWtCLzNKLEVBQUdvL0IsRUFBT3YzQixHQUN4QixNQUFNa3hCLEVBQUssMEJBQWdCLzRCLEVBQUcsSUFBSyxXQUVuQyxPQURBLFNBQXdCLElBQVorNEIsRUFBR3g1QixNQUFZLElBQU0sbURBQW1EdzVCLEVBQUd4NUIsZ0JBQ2hGLGdCQUFNdzVCLEVBQUksQ0FBQ3FHLEdBQVEsQ0FBQ3YzQixROzs7OzZEQzNCL0IsdVhBNkJPLE1BQU11ekYsRUFBVSxhQUFHLENBQUU0OEQ7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTDVCLFNBQWtCaDRKLEVBQUdvL0IsRUFBT3YzQixHQUN4QixNQUFNa3hCLEVBQUssMEJBQWdCLzRCLEVBQUcsSUFBSyxXQUVuQyxPQURBLFNBQXdCLElBQVorNEIsRUFBR3g1QixNQUFZLElBQU0sbURBQW1EdzVCLEVBQUd4NUIsZ0JBQ2hGLGdCQUFNdzVCLEVBQUlxRyxFQUFPdjNCLE87Ozs7NkRDM0I1Qix1WEE2Qk8sTUFBTTR6RixFQUFVLGFBQUcsQ0FBRXc4RDs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFMNUIsU0FBa0JqNEosRUFBR28vQixFQUFPdjNCLEdBQ3hCLE1BQU1reEIsRUFBSywwQkFBZ0IvNEIsRUFBRyxJQUFLLFdBRW5DLE9BREEsU0FBd0IsSUFBWis0QixFQUFHeDVCLE1BQVksSUFBTSxtREFBbUR3NUIsRUFBR3g1QixnQkFDaEYsZ0JBQU13NUIsRUFBSXFHLEVBQU92M0IsTzs7Ozs2REMzQjVCLHVYQTZCTyxNQUFNZzBGLEVBQVUsYUFBRyxDQUFFcThEOzs7Ozs7Ozs7Ozs7Ozs7OztBQUw1QixTQUFrQmw0SixFQUFHby9CLEVBQU92M0IsR0FDeEIsTUFBTWt4QixFQUFLLDBCQUFnQi80QixFQUFHLElBQUssV0FFbkMsT0FEQSxTQUF3QixJQUFaKzRCLEVBQUd4NUIsTUFBWSxJQUFNLG1EQUFtRHc1QixFQUFHeDVCLGdCQUNoRixnQkFBTXc1QixFQUFJcUcsRUFBT3YzQixPOzs7O2tUQzNCNUI7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQk8sU0FBU20xQyxFQUFrQnR4QyxFQUFPMHpCLEVBQU92M0IsR0FDNUMsTUFBTW1pQyxFQUFZdCtCLEVBQU03TSxNQUFNRSxPQUM5QixTQUFZaXJDLElBQWM1SyxFQUFNcmdDLFFBQVEsSUFBTSxpQkFBaUJpckMsdUJBQStCNUssdUNBQzFENEssUUFDcEMsU0FBWUEsSUFBY25pQyxFQUFLOUksUUFBUSxJQUFNLGlCQUFpQmlyQyxzQkFBOEJuaUMsdUNBQ3hEbWlDLFFBQ3BDLElBQUssSUFBSS91QyxFQUFJLEVBQUdBLEVBQUkrdUMsSUFBYS91QyxFQUM3QixTQUFZbWtDLEVBQU1ua0MsR0FBSzRNLEVBQUs1TSxJQUFNeVEsRUFBTTdNLE1BQU01RCxJQUFJLElBQU0saUJBQWlCK3VDLGFBQXFCL3VDLGFBQWFBLE9BQ25HbWtDLEVBQU1ua0MsR0FBSzRNLEVBQUs1TSxrQ0FBa0NBLE9BQU95USxFQUFNN00sTUFBTTVELFFBSTlFLFNBQVNraEcsRUFBVy9rQixHQUN2QixNQUFNN29ELEVBQU8sR0FDYixJQUFJelksRUFBTyxFQUNYLEtBQU9zaEUsRUFBTyxHQUNDLEVBQVBBLEdBQ0E3b0QsRUFBSzN3QixLQUFLa1ksR0FFZHNoRSxHQUFRLEVBQ1J0aEUsSUFFSixPQUFPeVksRUFHSixTQUFTaFosRUFBZ0I2cEIsRUFBT29pQixFQUFLbmtDLEdBQ3hDLE1BQU14VixFQUFPLEdBQ2IsSUFBSyxJQUFJaU8sRUFBTyxFQUFHQSxFQUFPc3BCLEVBQU1yZ0MsT0FBUStXLElBQ3BDak8sRUFBS2lPLEdBQVExVyxLQUFLQyxNQUFNbWlELEVBQUkxckMsR0FBUXNwQixFQUFNdHBCLElBQVN1SCxFQUFRdkgsSUFFL0QsT0FBT2pPLEVBSUosU0FBU3N3SixFQUFzQjk2SSxFQUFTKzZJLEVBQXdCQyxFQUFlbjhJLEdBQ2xGLE1BQU1vcEUsRUFBYSxJQUFJam9FLEdBQ3ZCLElBQUssSUFBSXBpQixFQUFJcXFGLEVBQVd2bUYsT0FBUTlELEVBQUlpaEIsRUFBV25kLE9BQVE5RCxJQUNuRHFxRixFQUFXMW5GLEtBQUssR0FFcEIsSUFBSyxJQUFJM0MsRUFBSSxFQUFHQSxFQUFJbzlKLEVBQWVwOUosSUFDckIsSUFBTkEsRUFDQXFxRixFQUFXOHlFLEdBQTBCLEdBR3JDOXlFLEVBQVczOEMsT0FBT3l2SCxFQUF3QixFQUFnQyxHQUMxRTl5RSxFQUFXMm1CLE9BR25CLE9BQU8zbUIsRUFFWCxTQUFTZ3pFLEVBQWdCRixFQUF3QkMsRUFBZUUsR0FDNUQsT0FBSUEsR0FBa0JILEVBQ1hHLEVBRUpBLEdBQWtCRixFQUFnQixHQUU3QyxTQUFTRyxFQUFjSCxFQUFlRCxHQUNsQyxNQUFNSyxFQUFhLEdBQ25CLElBQUssSUFBSXg5SixFQUFJLEVBQUdBLEVBQUlvOUosRUFBZXA5SixJQUMvQnc5SixFQUFXNzZKLEtBQUt3NkosRUFBeUJuOUosR0FFN0MsT0FBT3c5SixFQUdKLFNBQVNoOEQsRUFBa0J2Z0YsRUFBWSsvRSxFQUFjRyxFQUFxQmg5RCxFQUFPb2lCLEVBQUtua0MsRUFBU29rQyxFQUFXQyxFQUFTQyxHQUN0SCxNQUFNM1gsRUFBWTl0QixFQUFXbmQsT0FDN0IsSUFBSXU5RixFQUFrQixJQUFJN21GLE1BQU11MEIsR0FBWXV5RCxFQUFnQixJQUFJOW1GLE1BQU11MEIsR0FBWXd5RCxFQUFvQixJQUFJL21GLE1BQU11MEIsR0FDaEgsR0FBSWl5RCxFQUFhbDlGLFFBQVVxOUYsRUFBc0IsRUFBRyxDQUNoRCxNQUFNczhELEVBQVl6OEQsRUFBYSxHQUd6Qm84RCxFQUFnQmo4RCxFQUFzQixFQUM1Q0UsRUFBa0JxOEQsRUFBMkJsM0csRUFBV2kzRyxFQUFXTCxFQUFlajVILEVBQU9sakIsR0FDekZxZ0YsRUFBZ0JxOEQsRUFBMEJsM0csRUFBU2czRyxFQUFXTCxFQUFlNzJHLEVBQUt0bEMsR0FDbEZzZ0YsRUFDSTI3RCxFQUFzQjk2SSxFQUFTcTdJLEVBQVdMLEVBQWVuOEksUUFHN0QsSUFBSyxJQUFJcEcsRUFBTyxFQUFHQSxFQUFPazBCLEVBQVdsMEIsSUFDakN3bUYsRUFBZ0J4bUYsR0FBUStpSixFQUFhcDNHLEVBQVdyaUIsRUFBTy9oQixFQUFTbkIsRUFBWXBHLEVBQU02ckMsR0FDbEY0NkMsRUFBY3ptRixHQUNWZ2pKLEVBQVlwM0csRUFBU0YsRUFBS25rQyxFQUFTbkIsRUFBWXBHLEVBQU02ckMsR0FDekQ2NkMsRUFBa0IxbUYsR0FBUWlqSixFQUFlMTdJLEVBQVN2SCxFQUFNNnJDLEdBR2hFLE1BQU8sQ0FDSHZpQixNQUFPazlELEVBQ1A5NkMsSUFBSys2QyxFQUNMbC9FLFFBQVNtL0UsR0FLVixTQUFTbThELEVBQTJCbDNHLEVBQVcyMkcsRUFBd0JDLEVBQWVXLEVBQWU5OEksR0FDeEcsTUFBTXlqQyxFQUFhLElBQUl6akMsR0FDakJ1OEksRUFBYUQsRUFBY0gsRUFBZUQsR0FDaEQsSUFBSyxJQUFJdGlKLEVBQU8sRUFBR0EsRUFBTzZwQyxFQUFXNWdELE9BQVErVyxJQUN6QyxHQUFJMmlKLEVBQVdwaUosUUFBUVAsSUFBUyxFQUM1QjZwQyxFQUFXN3BDLEdBQVEsTUFFbEIsQ0FDRCxNQUFNbWpKLEVBQWVYLEVBQWdCRixFQUF3QkMsRUFBZXZpSixHQUM1RSxJQUFJb2pKLEVBQWdCRixFQUFjQyxHQUM5QngzRyxFQUFZLEdBQUt3M0csSUFDakJDLEVBQWdCLEdBRXBCdjVHLEVBQVc3cEMsR0FBUW9qSixFQUczQixPQUFPdjVHLEVBSUosU0FBU2k1RyxFQUEwQmwzRyxFQUFTMDJHLEVBQXdCQyxFQUFlYyxFQUFhajlJLEdBQ25HLE1BQU15akMsRUFBYSxJQUFJempDLEdBQ2pCdThJLEVBQWFELEVBQWNILEVBQWVELEdBQ2hELElBQUssSUFBSXRpSixFQUFPLEVBQUdBLEVBQU82cEMsRUFBVzVnRCxPQUFRK1csSUFDekMsR0FBSTJpSixFQUFXcGlKLFFBQVFQLElBQVMsRUFDNUI2cEMsRUFBVzdwQyxHQUFRc3BDLE9BQU9nNkcscUJBRXpCLENBQ0QsTUFBTUgsRUFBZVgsRUFBZ0JGLEVBQXdCQyxFQUFldmlKLEdBQzVFLElBQUlvakosRUFBZ0JDLEVBQVlGLEdBQzVCdjNHLEVBQVUsR0FBS3UzRyxJQUNmQyxFQUFnQjk1RyxPQUFPZzZHLGtCQUUzQno1RyxFQUFXN3BDLEdBQVFvakosRUFHM0IsSUFBSyxJQUFJaitKLEVBQUksRUFBR0EsRUFBSTBrRCxFQUFXNWdELE9BQVE5RCxJQUFLLENBRXhDLE1BQU1vK0osRUFBV245SSxFQUFXamhCLEdBQ3hCMGtELEVBQVcxa0QsR0FBSyxJQUNoQjBrRCxFQUFXMWtELElBQU1vK0osR0FFckIxNUcsRUFBVzFrRCxHQUFLLFFBQVcsRUFBRzBrRCxFQUFXMWtELEdBQUlpaEIsRUFBV2poQixJQUU1RCxPQUFPMGtELEVBRUosU0FBU281RyxFQUFlMTdJLEVBQVN2SCxFQUFNNnJDLEdBQzFDLElBQUlnVSxFQUFTdDRDLEVBQVF2SCxHQUlyQixPQUhJNnJDLEVBQWdCLEdBQUs3ckMsR0FBbUIsTUFBVjYvQyxLQUM5QkEsRUFBUyxHQUVOQSxFQUVKLFNBQVNrakcsRUFBYXAzRyxFQUFXNjNHLEVBQWNqOEksRUFBU25CLEVBQVlwRyxFQUFNNnJDLEdBRTdFLElBQUlyN0MsRUFBUWd6SixFQUFheGpKLEdBQ3pCLE1BQU02L0MsRUFBU3Q0QyxFQUFRdkgsSUFBUyxHQUc1QjJyQyxFQUFZLEdBQUszckMsR0FBUTZyQyxFQUFlLEdBQUs3ckMsR0FBaUIsTUFBVHhQLEtBS2pEQSxFQUpBcXZELEVBQVMsRUFJRHZXLE9BQU9rMEIsaUJBSVBsMEIsT0FBT2c2RyxrQkFJdkIsTUFBTUMsRUFBV245SSxFQUFXcEcsR0FNNUIsT0FMSXhQLEVBQVEsSUFDUkEsR0FBUyt5SixHQUdiL3lKLEVBQVEsUUFBVyxFQUFHQSxFQUFPK3lKLEVBQVcsR0FDakMveUosRUFFSixTQUFTd3lKLEVBQVlwM0csRUFBUzYzRyxFQUFhbDhJLEVBQVNuQixFQUFZcEcsRUFBTTZyQyxHQUV6RSxJQUFJblIsRUFBTytvSCxFQUFZempKLEdBQ3ZCLE1BQU02L0MsRUFBU3Q0QyxFQUFRdkgsSUFBUyxHQUc1QjRyQyxFQUFXLEdBQUs1ckMsR0FBUzZyQyxFQUFnQixHQUFLN3JDLEdBQWlCLE1BQVIwNkIsS0FJbkRBLEVBSEFtbEIsRUFBUyxFQUdGdlcsT0FBT2c2RyxpQkFJUGg2RyxPQUFPazBCLGtCQUl0QixNQUFNK2xGLEVBQVduOUksRUFBV3BHLEdBZTVCLE9BZEkwNkIsRUFBTyxJQUNQQSxHQUFRNm9ILEdBT1I3b0gsRUFGQW1sQixFQUFTLEVBRUYsUUFBVyxFQUFHbmxCLEVBQU02b0gsR0FJcEIsU0FBWSxFQUFHN29ILEVBQU02b0gsRUFBVyxHQUVwQzdvSCxFQU1KLFNBQVMwTSxFQUFpQnIrQyxFQUFPdWdDLEVBQU92M0IsR0FFM0MsSUFBSTJ4SixFQUFrQjN4SixFQUFLOUksT0FDM0IsSUFBSyxJQUFJOUQsRUFBSSxFQUFHQSxFQUFJNE0sRUFBSzlJLE9BQVE5RCxJQUM3QixHQUFJNE0sRUFBSzVNLEdBQUssRUFBRyxDQUNidStKLEVBQWtCditKLEVBQ2xCLE1BR1IsSUFBSyxJQUFJQSxFQUFJdStKLEVBQWtCLEVBQUd2K0osRUFBSTRNLEVBQUs5SSxPQUFROUQsSUFDL0MsR0FBSW1rQyxFQUFNbmtDLEdBQUssR0FBSzRNLEVBQUs1TSxLQUFPNEQsRUFBTTVELEdBQ2xDLE9BQU8sRUFHZixPQUFPLEVBRUosU0FBU29pRCxFQUFrQmplLEVBQU8vaEIsR0FDckMsSUFBSStJLEVBQWFnWixFQUFNcmdDLE9BQVMsRUFBSXFnQyxFQUFNQSxFQUFNcmdDLE9BQVMsR0FBSyxFQUM5RCxJQUFLLElBQUk5RCxFQUFJLEVBQUdBLEVBQUlta0MsRUFBTXJnQyxPQUFTLEVBQUc5RCxJQUNsQ21yQixHQUFjZ1osRUFBTW5rQyxHQUFLb2lCLEVBQVFwaUIsR0FFckMsT0FBT21yQixFQUVKLFNBQVMyMkIsRUFBaUIvOEMsRUFBR28vQixFQUFPdjNCLEdBRXZDLElBQUlnekYsRUFDSixNQUFNaHhFLEVBQVE3cEIsRUFBRW5CLE1BQU1FLE9BYXRCLElBQUkrN0YsRUF1QkosT0FsQ0lELEVBRGlCLGlCQUFWejdELEVBQ0UsQ0FBQ0EsS0FBVSxJQUFJM3BCLE1BQU1vVSxFQUFRLEdBQUdtaEIsS0FBSyxJQUV6QzVMLEVBQU1yZ0MsT0FBUzhxQixFQUNYdVYsRUFBTWwvQixPQUFPLElBQUl1VixNQUFNb1UsRUFBUXVWLEVBQU1yZ0MsUUFBUWlzQyxLQUFLLElBR2xENUwsRUFBTWxnQyxRQUVuQjI3RixFQUFPbjlGLFNBQVFuQyxJQUNYLFVBQW1CLElBQVBBLEdBQVUsSUFBTSx5REFJNUJ1L0YsRUFEUSxNQUFSanpGLEVBQ1EsSUFBSTROLE1BQU1vVSxHQUFPbWhCLE1BQU0sR0FFVixpQkFBVG5qQyxFQUNKLENBQUNBLEtBQVMsSUFBSTROLE1BQU1vVSxFQUFRLEdBQUdtaEIsTUFBTSxJQUV4Q25qQyxFQUFLOUksT0FBUzhxQixFQUNYaGlCLEVBQUszSCxPQUFPLElBQUl1VixNQUFNb1UsRUFBUWhpQixFQUFLOUksUUFBUWlzQyxNQUFNLElBR2pEbmpDLEVBRVppekYsRUFBUUEsRUFBTXY5RixLQUFJLENBQUNoQyxFQUFHTixJQUNkTSxHQUFLLEVBQ0VBLEdBR1AsVUFBbUIsSUFBUEEsR0FBVSxJQUNsQixxREFBR0EsbUNBQW1DTixPQUNuQytFLEVBQUVuQixNQUFNNUQsR0FBSzQvRixFQUFPNS9GLE1BRzVCLENBQUM0L0YsRUFBUUMsR0FFYixTQUFTOTRDLEVBQVU3d0MsRUFBUWl1QixFQUFPb2lCLEVBQUtua0MsRUFBU29rQyxFQUFXQyxFQUFTQyxFQUFjQyxFQUFhQyxHQUVsRyxJQUFJaEYsRUFBU3pkLEVBQU1sZ0MsUUFDZnU2SixFQUFPajRHLEVBQUl0aUQsUUFDWDZpRCxFQUFXMWtDLEVBQ0EsTUFBWEEsSUFDQTBrQyxFQUFXLElBQUl0c0MsTUFBTW9uQyxFQUFPOTlDLFNBRWhDLE1BQU1rOUYsRUFBZUUsRUFBV3g2QyxHQUNoQyxHQUFJczZDLEVBQWFsOUYsT0FBUyxFQUN0QixNQUFNLElBQUk2RSxNQUFNLDhDQUVwQixHQUFxQixJQUFqQis5QyxHQUFzQyxJQUFoQkMsRUFDdEIsTUFBTSxJQUFJaCtDLE1BQU0saUVBRXBCLEdBQXFCLElBQWpCKzlDLEdBQXlDLElBQW5CRSxFQUN0QixNQUFNLElBQUlqK0MsTUFBTSxvRUFFcEIsTUFBTXc0RixFQUFzQmpyRixFQUFPcFMsT0FBUzg5QyxFQUFPOTlDLE9BRTdDczlGLEVBQWFGLEVBQVd2NkMsR0FDeEJucEIsRUFBV3RuQixFQUFPalMsUUFDeEJtOUYsRUFBVzMrRixTQUFRb1ksSUFDZittQyxFQUFPL21DLEdBQVEsRUFDZjJqSixFQUFLM2pKLEdBQVEsRUFDYjJpQixFQUFTa1EsT0FBTzd5QixFQUFNLEVBQUcsTUFFN0IsTUFBUXNwQixNQUFPazlELEVBQWlCOTZDLElBQUsrNkMsRUFBZWwvRSxRQUFTbS9FLEdBQXNCQyxFQUFrQmhrRSxFQUFVd2pFLEVBQWNHLEVBQXFCdi9DLEVBQVE0OEcsRUFBTTEzRyxFQUFVTixFQUFXQyxFQUFTQyxHQUM5TDlFLEVBQVN5L0MsRUFDVG05RCxFQUFPbDlELEVBQ1B4NkMsRUFBV3k2QyxFQUNYLE1BQU1FLEVBQWFQLEVBQVd0NkMsR0FFOUI2NkMsRUFBV2gvRixTQUFRb1ksSUFDZjJqSixFQUFLM2pKLEdBQVErbUMsRUFBTy9tQyxHQUFRLEVBQzVCaXNDLEVBQVNqc0MsR0FBUSxLQUdyQixNQUFNak8sRUFBTzBOLEVBQWdCc25DLEVBQVE0OEcsRUFBTTEzRyxHQUVyQ3ppRCxFQUFXdUksRUFBSzJCLFFBQU8sQ0FBQ2hNLEVBQUdzWSxLQUF1QyxJQUE5QjRtRixFQUFXcm1GLFFBQVFQLEtBRTdELE1BQU8sQ0FBRWdzQyxXQURVQyxFQUFTdDJDLE9BQU04b0UsR0FBVyxJQUFOQSxJQUNsQjEzQixTQUFRNDhHLE9BQU0xM0csV0FBVWw2QyxPQUFNNHdCLFdBQVVuNUIsYzs7Ozs2REMvVWpFLHNZQXNETyxNQUFNaytDLEVBQVUsYUFBRyxDQUFFazhHOzs7Ozs7Ozs7Ozs7Ozs7OztBQWI1QixTQUFrQnBsSCxFQUFRdkssR0FBTSxHQUM1QixNQUFNaTlHLEVBQVUsMEJBQWdCMXlHLEVBQVEsU0FBVSxVQUFXLFdBSTdELElBSGEsSUFBVHZLLElBQ0FBLEVBQU1pOUcsRUFBUXpuSixLQUFPLEdBRXJCd3FDLElBQVFpOUcsRUFBUXpuSixLQUFPLEVBQ3ZCLE1BQU1xRSxNQUNGLDRFQUFtQm9qSixFQUFRem5KLG9CQUFvQndxQyxLQUV2RCxNQUFNeCtCLEVBQVMsQ0FBRStvQyxPQUFRMHlHLEdBQ25CajRILEVBQVEsQ0FBRWdiLE9BQ2hCLE9BQU8sU0FBT2c4RSxVQUFVLFVBQVN4NkcsRUFBUXdqQixPOzs7OzhEQ3BEN0MsdVlBcUNPLE1BQU1ndkIsRUFBVyxhQUFHLENBQUU0N0c7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTDdCLFNBQW1CMzVKLEdBQ2YsTUFDTXVMLEVBQVMsQ0FBRXZMLEVBRE4sMEJBQWdCQSxFQUFHLElBQUssYUFFbkMsT0FBTyxTQUFPK2xILFVBQVUsV0FBVXg2RyxPOzs7O29FQ25DdEMsb2RBc0ZPLE1BQU0weUMsRUFBaUIsYUFBRyxDQUFFMjdHOzs7Ozs7Ozs7Ozs7Ozs7OztBQWpCbkMsU0FBeUI1NUosRUFBR20rQixFQUFZNlYsR0FDcEMsTUFBTWpiLEVBQUssMEJBQWdCLzRCLEVBQUcsSUFBSyxrQkFDbkMsU0FBWSs0QixFQUFHeDVCLE1BQVEsRUFBSTQrQixFQUFXcC9CLFFBQVEsSUFBTSxjQUFjZzZCLEVBQUd4NUIsc0NBQXNDNCtCLEVBQVdwL0IsV0FDdEgsU0FBWWkxQyxFQUFTajFDLFNBQVdvL0IsRUFBV3AvQixRQUFRLElBQU0scUJBQXFCaTFDLEVBQVNqMUMsd0NBQXdDby9CLEVBQVdwL0IsV0FDMUksU0FBWWc2QixFQUFHbDZCLE1BQU1teUIsUUFBTyxDQUFDMWdCLEVBQUd5ZixFQUFHOTBCLElBQzNCQSxFQUFJLEdBQUtBLEdBQUtrakMsRUFBV3AvQixPQUNsQnVSLElBQ0R5ZixFQUFJaWtCLEVBQVMvNEMsRUFBSSxHQUFHLEdBQUsrNEMsRUFBUy80QyxFQUFJLEdBQUcsSUFDdkNrakMsRUFBV2xqQyxFQUFJLElBQ2YsRUFFTHFWLElBQ1IsSUFBTyxJQUFNLDRCQUE0QnlvQixFQUFHbDZCLE1BQU1LLE1BQU0sb0JBQW9CODBDLEVBQVMwaUIsK0NBQStDdjRCLEVBQVd1NEIsZUFDbEosTUFBTW5yRCxFQUFTLENBQUV2TCxFQUFHKzRCLEdBQ2RoSyxFQUFRLENBQUVvUCxhQUFZNlYsWUFDNUIsT0FBTyxTQUFPK3hFLFVBQVUsaUJBQWdCeDZHLEVBQVF3akIsTzs7Ozt5RUNwRnBELDRaQTRHTyxNQUFNMHZCLEVBQXNCLGFBQUcsQ0FBRW83Rzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFoQ3hDLFNBQThCaHRILEVBQVNob0MsRUFBUTY1QyxFQUFZaEQsR0FDdkQsTUFBTWlELEVBQVcsMEJBQWdCOVIsRUFBUyxVQUFXLHVCQUMvQytSLEVBQVUsMEJBQWdCLzVDLEVBQVEsU0FBVSx1QkFDNUNnNkMsRUFBYywwQkFBZ0JILEVBQVksYUFBYyx1QkFDeERJLEVBQWdCLDBCQUFnQnBELEVBQWMsZUFBZ0Isc0JBQXVCa0QsRUFBUXAvQyxPQUNuRyxHQUFzQixJQUFsQm0vQyxFQUFTcC9DLEtBQ1QsTUFBTSxJQUFJcUUsTUFBTSwwREFDZCs2QyxFQUFTOS9DLFNBRWYsR0FBcUIsSUFBakIrL0MsRUFBUXIvQyxLQUNSLE1BQU0sSUFBSXFFLE1BQU0sZ0RBQWdEZzdDLEVBQVEvL0MsU0FFNUUsR0FBeUIsSUFBckJnZ0QsRUFBWXQvQyxLQUNaLE1BQU0sSUFBSXFFLE1BQU0scURBQXFEaTdDLEVBQVloZ0QsU0FFckYsR0FBMkIsSUFBdkJpZ0QsRUFBY3YvQyxLQUNkLE1BQU0sSUFBSXFFLE1BQU0sdURBQXVEazdDLEVBQWNqZ0QsU0FFekYsTUFBTTBNLEVBQVMsQ0FDWHNoQyxRQUFTOFIsRUFDVDk1QyxPQUFRKzVDLEVBQ1JGLFdBQVlHLEVBQ1puRCxhQUFjb0QsR0FFWnY0QyxFQUFTLFNBQU93L0csVUFBVSxzQkFBcUJ4NkcsR0FDckQsTUFBTyxDQUNId3pDLGNBQWV4NEMsRUFBTyxHQUN0QjA0QyxhQUFjMTRDLEVBQU8sR0FDckIyNEMsa0JBQW1CMzRDLEVBQU8sR0FDMUI0NEMsZ0JBQWlCNTRDLEVBQU8sUTs7OzttRUN6R2hDLHNaQTRFTyxNQUFNKzRDLEVBQWdCLGFBQUcsQ0FBRXc2Rzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF0QmxDLFNBQXdCdjZHLEVBQWNyakMsRUFBWXVjLEdBQzlDLE1BQU1pbkIsRUFBZ0IsMEJBQWdCSCxFQUFjLGVBQWdCLGlCQUM5REMsRUFBYywwQkFBZ0J0akMsRUFBWSxhQUFjLGlCQUN4RDY5SSxFQUFZLDBCQUFnQnRoSSxFQUFVLFdBQVksaUJBQ3hELEdBQTJCLElBQXZCaW5CLEVBQWNuZ0QsS0FDZCxNQUFNLElBQUlxRSxNQUFNLGdFQUNkODdDLEVBQWM3Z0QsU0FFcEIsR0FBeUIsSUFBckIyZ0QsRUFBWWpnRCxLQUNaLE1BQU0sSUFBSXFFLE1BQU0scURBQXFENDdDLEVBQVkzZ0QsU0FFckYsR0FBdUIsSUFBbkJrN0osRUFBVXg2SixLQUNWLE1BQU0sSUFBSXFFLE1BQU0sbURBQW1EbTJKLEVBQVVsN0osU0FFakYsTUFBTTBNLEVBQVMsQ0FDWGcwQyxhQUFjRyxFQUNkeGpDLFdBQVlzakMsRUFDWi9tQixTQUFVc2hJLEdBRVJ4ekosRUFBUyxTQUFPdy9HLFVBQVUsZ0JBQWV4NkcsR0FDL0MsTUFBTyxDQUFFd3pDLGNBQWV4NEMsRUFBTyxHQUFJcEosWUFBYW9KLEVBQU8sUTs7Ozt1RUMxRTNELDBaQTRFTyxNQUFNczVDLEVBQW9CLGFBQUcsQ0FBRW02Rzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF0QnRDLFNBQTRCOXpKLEVBQU0ybUMsRUFBU2lULEdBQ3ZDLE1BQU1DLEVBQVEsMEJBQWdCNzVDLEVBQU0sT0FBUSxxQkFDdEN5NEMsRUFBVywwQkFBZ0I5UixFQUFTLFVBQVcscUJBQy9DbVQsRUFBYywwQkFBZ0JGLEVBQVksYUFBYyxxQkFDOUQsR0FBSUMsRUFBTXhnRCxLQUFPLEVBQ2IsTUFBTSxJQUFJcUUsTUFBTSw2REFFcEIsR0FBc0IsSUFBbEIrNkMsRUFBU3AvQyxLQUNULE1BQU0sSUFBSXFFLE1BQU0sNERBQ1orNkMsRUFBUzkvQyxTQUVqQixHQUF5QixJQUFyQm1oRCxFQUFZemdELEtBQ1osTUFBTSxJQUFJcUUsTUFBTSxnRUFDWm84QyxFQUFZbmhELFNBRXBCLE1BQU0wTSxFQUFTLENBQ1hyRixLQUFNNjVDLEVBQ05sVCxRQUFTOFIsRUFDVG1CLFdBQVlFLEdBRWhCLE9BQU8sU0FBTytsRSxVQUFVLG9CQUFtQng2RyxPOzs7O3NFQzFFL0MseVpBNEVPLE1BQU00MEMsRUFBbUIsYUFBRyxDQUFFODVHOzs7Ozs7Ozs7Ozs7Ozs7OztBQXRCckMsU0FBMkIvekosRUFBTTJtQyxFQUFTaVQsR0FDdEMsTUFBTUMsRUFBUSwwQkFBZ0I3NUMsRUFBTSxPQUFRLG9CQUN0Q3k0QyxFQUFXLDBCQUFnQjlSLEVBQVMsVUFBVyxvQkFDL0NtVCxFQUFjLDBCQUFnQkYsRUFBWSxhQUFjLG9CQUM5RCxHQUFJQyxFQUFNeGdELEtBQU8sRUFDYixNQUFNLElBQUlxRSxNQUFNLDZEQUVwQixHQUFzQixJQUFsQis2QyxFQUFTcC9DLEtBQ1QsTUFBTSxJQUFJcUUsTUFBTSwyREFDYis2QyxFQUFTOS9DLFNBRWhCLEdBQXlCLElBQXJCbWhELEVBQVl6Z0QsS0FDWixNQUFNLElBQUlxRSxNQUFNLCtEQUNibzhDLEVBQVluaEQsU0FFbkIsTUFBTTBNLEVBQVMsQ0FDWHJGLEtBQU02NUMsRUFDTmxULFFBQVM4UixFQUNUbUIsV0FBWUUsR0FFaEIsT0FBTyxTQUFPK2xFLFVBQVUsbUJBQWtCeDZHLE87Ozs7bUVDMUU5QywyZkF3RU8sTUFBTTgwQyxFQUFnQixhQUFHLENBQUU2NUc7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBYmxDLFNBQXdCNTVHLEVBQWVDLEVBQWNwakQsRUFBYXUrQyxFQUFlLEdBQzdFLE1BQU15K0csRUFBaUIsMEJBQWdCNzVHLEVBQWUsZ0JBQWlCLGdCQUFpQixTQUNsRjg1RyxFQUFnQiwwQkFBZ0I3NUcsRUFBYyxlQUFnQixpQkFDOUR6QixFQUFnQiwwQkFBZ0JwRCxFQUFjLGVBQWdCLGdCQUFpQjArRyxFQUFjNTZKLE9BQ25HLGdCQUE4QjI2SixFQUFnQkMsRUFBZWo5SixFQUFhMmhELEdBQzFFLE1BQU12ekMsRUFBUyxDQUNYKzBDLGNBQWU2NUcsRUFDZjU1RyxhQUFjNjVHLEVBQ2QxK0csYUFBY29ELEdBRVovdkIsRUFBUSxDQUFFNXhCLGVBQ2hCLE9BQU8sU0FBTzRvSCxVQUFVLGdCQUFleDZHLEVBQVF3akIsTzs7OzttRUN6RDVDLFNBQVM0bUksRUFBY3IxRyxFQUFlQyxFQUFjcGpELEVBQWFrOUosR0FDcEUsR0FBNEIsVUFBeEIvNUcsRUFBYzlnRCxNQUNkLE1BQU0sSUFBSW9FLE1BQ04sOEVBQXNCMDhDLEVBQWM5Z0QsVUFFNUMsR0FBSThnRCxFQUFjL2dELEtBQU8sRUFDckIsTUFBTSxJQUFJcUUsTUFDTixzRUFBa0IwOEMsRUFBY3poRCxVQUV4QyxNQUFNeTdKLEVBQVdoNkcsRUFBYy9nRCxLQUFPLEVBQUkrZ0QsRUFBY3poRCxNQUFNLEdBQUssRUFDN0R1L0csRUFBVTk5RCxFQUFjL2dELEtBQU8sRUFBSStnRCxFQUFjemhELE1BQU0sR0FBSyxFQUNsRSxHQUFJMUIsRUFBWTRCLFNBQVdxL0csRUFDdkIsTUFBTSxJQUFJeDZHLE1BQ04sa0RBQUl6RyxFQUFZNEIsc0JBQXNCcS9HLE1BRTlDLE1BQU1tOEMsRUFBWWg2RyxFQUFhMTRDLEtBQy9CLEdBQTRCLElBQXRCMDRDLEVBQWFoaEQsT0FDTyxJQUF0QmdoRCxFQUFhaGhELE1BQWNnN0osSUFBY0QsR0FDekMsTUFBTSxJQUFJMTJKLE1BQ04sb0NBQUcyOEMsRUFBYTFoRCwyQkFBMkJ5N0osTUFFbkQsR0FBSS81RyxFQUFhL2dELFFBQVU2NkosRUFBYzc2SixNQUNyQyxNQUFNLElBQUlvRSxNQUFNLHFEQW5DeEIsc0Q7Ozs7eURDQUEsc1hBMkNPLE1BQU0wbUMsRUFBTSxhQUFHLENBQUVrd0g7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTnhCLFNBQWM5dUosR0FDVixpQkFBdUIsY0FBaEJBLEVBQU1sTSxPQUF1QixJQUNoQyw2REFBV2tNLEVBQU1sTSxXQUNyQixNQUFNK0wsRUFBUyxDQUFFRyxTQUNqQixPQUFPLFNBQU9xNkcsVUFBVSxNQUFLeDZHLE87Ozs7MERDekNqQyx1WEEyQ08sTUFBTW1qQyxFQUFPLGFBQUcsQ0FBRStySDs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFOekIsU0FBZS91SixHQUNYLGlCQUF1QixjQUFoQkEsRUFBTWxNLE9BQXVCLElBQ2hDLDhEQUFXa00sRUFBTWxNLFdBQ3JCLE1BQU0rTCxFQUFTLENBQUVHLFNBQ2pCLE9BQU8sU0FBT3E2RyxVQUFVLE9BQU14NkcsTzs7OzsyREN6Q2xDLHM1QkEyRU8sTUFBTTJpSixFQUFRLGFBQUcsQ0FBRXdNOzs7Ozs7Ozs7Ozs7Ozs7OztBQS9CMUIsU0FBZ0JodkosR0FDWixNQUFNZy9CLEVBQXFCaC9CLEVBQU03TSxNQUFNNk0sRUFBTTdNLE1BQU1FLE9BQVMsR0FDdERzYSxFQUFRM04sRUFBTTdELEtBQU82aUMsRUFDM0IsSUFBSWsvQyxFQUNKLEdBQUlsL0MsR0FBc0IsRUFBRyxDQUN6QixNQUFNaXdILEVBQWUsa0JBQVFqdkosRUFBTyxDQUFDMk4sRUFBT3F4QixJQUM1Q2svQyxFQUFNLGVBQUsrd0UsT0FFVixDQUdELE1BQU14OUosRUFBYyxDQUFDa2MsRUFBTyxHQUFLcXhCLEVBQXFCLElBQ2hEa3dILEVBQVksa0JBQVEsZUFBS2x2SixHQUFRLENBQUMyTixFQUFPcXhCLElBQ3pDbXdILEVBQVksa0JBQVEsZUFBS252SixHQUFRLENBQUMyTixFQUFPcXhCLElBQ3pDb3dILEVBQWdCLGtCQUFRLGdCQUFNRixFQUFXLENBQUMsRUFBRyxHQUFJLENBQUN2aEosRUFBT3F4QixFQUFxQixJQUFLLEdBQ25GcXdILEVBQWdCLGNBQUksa0JBQVEsZ0JBQU1GLEVBQVcsQ0FBQyxFQUFHLEdBQUksQ0FBQ3hoSixFQUFPcXhCLEVBQXFCLElBQUssR0FBSSxrQkFBUSxJQUNuRzN1QyxFQUFJLGlCQUFPLENBQUM2K0osRUFBV0UsR0FBZ0IsR0FDdkM3L0osRUFBSSxpQkFBTyxDQUFDNC9KLEVBQVdFLEdBQWdCLEdBQ3ZDSixFQUFlLGtCQUFRLGtCQUFRNStKLEVBQUdkLEdBQUksQ0FBQ2tDLEVBQVksR0FBSUEsRUFBWSxLQUN6RXlzRixFQUFNLGVBQUsrd0UsR0FJZixHQUZBL3dFLEVBQU0sZUFBS0EsR0FFUSxJQUFmbCtFLEVBQU1uTSxNQUFpQyxJQUFuQm1NLEVBQU03TSxNQUFNLEdBQVUsQ0FDMUMsTUFBTXM3SCxFQUFPdndDLEVBQ1B2d0UsRUFBUTNOLEVBQU03TSxNQUFNLEdBQzFCK3FGLEVBQU0sa0JBQVFBLEVBQUssQ0FBQ3Z3RSxFQUFPdXdFLEVBQUkvcUYsTUFBTSxHQUFLd2EsRUFBT3V3RSxFQUFJL3FGLE1BQU0sS0FDM0RzN0gsRUFBS25ySCxVQUVULE9BQU80NkUsTTs7OzswREN6RVgscStCQWdGTyxNQUFNcWtFLEVBQU8sYUFBRyxDQUFFK007Ozs7Ozs7Ozs7Ozs7Ozs7O0FBckN6QixTQUFldHZKLEVBQU95ckosR0FDbEIsaUJBQXVCLFlBQWhCenJKLEVBQU1sTSxPQUFxQixJQUFNLG1EQUFtRGtNLEVBQU1sTSxVQUNqRyxJQUFJa3JDLEVBQXFCaC9CLEVBQU03TSxNQUFNNk0sRUFBTTdNLE1BQU1FLE9BQVMsR0FDMUQsTUFBTXNhLEVBQVEzTixFQUFNN0QsS0FBTzZpQyxFQUMzQixJQUFJdXdILEVBQ0osR0FBaUIsTUFBYjlELEdBQXFCQSxFQUFZenNILEVBQW9CLENBRXJELE1BQU10TCxFQUFRMXpCLEVBQU03TSxNQUFNdEIsS0FBSWczRSxHQUFLLElBQzdCMXNFLEVBQU82RCxFQUFNN00sTUFBTXRCLEtBQUlnM0UsR0FBS0EsSUFDbEMxc0UsRUFBSzZELEVBQU03TSxNQUFNRSxPQUFTLEdBQUtvNEosRUFDL0I4RCxFQUFnQixnQkFBTXZ2SixFQUFPMHpCLEVBQU92M0IsR0FDcEM2aUMsRUFBcUJ5c0gsT0FFcEIsR0FBaUIsTUFBYkEsR0FBcUJBLEVBQVl6c0gsRUFBb0IsQ0FFMUQsTUFBTXd3SCxFQUFheHZKLEVBQU03TSxNQUFNdEIsS0FBSWczRSxHQUFLQSxJQUN4QzJtRixFQUFXeHZKLEVBQU03TSxNQUFNRSxPQUFTLEdBQUtvNEosRUFBWXpzSCxFQUNqRHV3SCxFQUFnQixpQkFBTyxDQUFDdnZKLEVBQU8sZ0JBQU13dkosSUFBY3h2SixFQUFNN00sTUFBTUUsT0FBUyxHQUN4RTJyQyxFQUFxQnlzSCxPQUdyQjhELEVBQWdCdnZKLEVBR3BCLE1BQU15dkosRUFBYSxvQkFBVUYsR0FDdkJOLEVBQWUsa0JBQVEsa0JBQVFNLEVBQWVFLEdBQWEsQ0FBQzloSixFQUFPcXhCLElBQ25Fay9DLEVBQU0sY0FBSSt3RSxHQUVWendFLEVBQU85cUYsS0FBSzJZLE1BQU0yeUIsRUFBcUIsR0FBSyxFQUM1Q2prQyxFQUFhLGVBQUttakYsR0FDbEJqakYsRUFBYSxlQUFLaWpGLEdBQ2xCd3hFLEVBQXVCLGdCQUFNMzBKLEVBQVksQ0FBQ3lqRixFQUFNeC9DLEVBQXFCdy9DLEdBQU96akYsRUFBVzVILE1BQU1FLE9BQVMsR0FDdEdzOEosRUFBdUIsZ0JBQU0xMEosRUFBWSxDQUFDdWpGLEVBQU14L0MsRUFBcUJ3L0MsR0FBT3ZqRixFQUFXOUgsTUFBTUUsT0FBUyxHQUN0RzVCLEVBQWM4OUosRUFBY3A4SixNQUFNSyxRQUV4QyxPQURBL0IsRUFBWTg5SixFQUFjcDhKLE1BQU1FLE9BQVMsR0FBS21yRixFQUN2QyxrQkFBUSxrQkFBUWt4RSxFQUFxQixHQUFJQyxFQUFxQixJQUFLbCtKLE87Ozs7MkRDOUU5RSxvWUE2RE8sTUFBTWdpRSxFQUFRLGFBQUcsQ0FBRW04Rjs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFOMUIsU0FBZ0J0N0osRUFBRzBnRCxFQUFpQjVxQyxFQUFPLEdBQ3ZDLE1BQ012SyxFQUFTLENBQUV2TCxFQUROLDBCQUFnQkEsRUFBRyxJQUFLLFVBRTdCazhHLEVBQU8sQ0FBRXg3RCxrQkFBaUI1cUMsUUFDaEMsT0FBTyxTQUFPaXdHLFVBQVUsU0FBUXg2RyxFQUFRMndHLE87Ozs7c0VDM0Q1QyxtSUFNTyxTQUFTdDdELEVBQWlCNWdELEVBQUcwZ0QsRUFBaUI1cUMsRUFBTyxHQUN4RCxJQUFJNnFDLEVBQWEsR0FDakIsR0FBaUMsaUJBQXRCLEVBQ1AsaUJBQU8zZ0QsRUFBRW5CLE1BQU1pWCxHQUFRNHFDLEdBQW9CLEdBQUcsSUFBTSxrREFDcERDLEVBQ0ksSUFBSWxyQyxNQUFNaXJDLEdBQWlCMVYsS0FBS2hyQyxFQUFFbkIsTUFBTWlYLEdBQVE0cUMsT0FFbkQsQ0FDRCxNQUFNNjZHLEVBQVk3NkcsRUFBZ0IxdkIsUUFBTyxDQUFDODhELEVBQU81eEYsTUFDOUIsSUFBWEEsSUFDQTR4RixHQUFTLEdBRU5BLElBQ1IsR0FDSCxpQkFBT3l0RSxHQUFhLEdBQUcsSUFBTSw0REFDN0IsTUFBTUMsRUFBVzk2RyxFQUFnQnJxQyxTQUFTLEdBRzFDLElBQWtCLElBQWRtbEosRUFBaUIsQ0FDakIsTUFBTXhnRyxFQUFRdGEsRUFBZ0IxdkIsUUFBTyxDQUFDMWdCLEVBQUd5ZixJQUFNQSxFQUFJLEVBQUl6ZixFQUFJeWYsRUFBSXpmLElBQy9Eb3dDLEVBQWdCODZHLEdBQVl4N0osRUFBRW5CLE1BQU1pWCxHQUFRa2xELEVBRWhELGlCQUFPaDdELEVBQUVuQixNQUFNaVgsS0FBVTRxQyxFQUFnQjF2QixRQUFPLENBQUMxZ0IsRUFBR3lmLElBQU16ZixFQUFJeWYsS0FBSSxJQUFNLGdFQUN4RTR3QixFQUFhRCxFQUVqQixPQUFPQyxJOzs7OzBEQy9CWCxtWUFxQ08sTUFBTUssRUFBTyxhQUFHLENBQUV5Nkc7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTHpCLFNBQWV6N0osR0FDWCxNQUNNdUwsRUFBUyxDQUFFdkwsRUFETiwwQkFBZ0JBLEVBQUcsSUFBSyxTQUVuQyxPQUFPLFNBQU8rbEgsVUFBVSxPQUFNeDZHLE87Ozs7NERDbkNsQyw4U0FvQ08sTUFBTTIxQyxFQUFTLGFBQUcsQ0FBRXc2Rzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFMM0IsU0FBaUIxN0osR0FDYixNQUFNKzRCLEVBQUssMEJBQWdCLzRCLEVBQUcsSUFBSyxVQUVuQyxPQUFPLFNBQU8rbEgsVUFBVSxTQUFVLENBQUUvbEgsRUFBRys0QixHQUR6QixROzs7O3VFQ2pDbEIsbWtCQXVETyxNQUFNcW9CLEVBQW9CLGFBQUcsQ0FBRXU2Rzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFUdEMsU0FBNEJyckosRUFBR3lmLEdBQzNCLElBQUl1L0csRUFBSywwQkFBZ0JoL0gsRUFBRyxJQUFLLHFCQUM3QmkvSCxFQUFLLDBCQUFnQngvRyxFQUFHLElBQUssc0JBQ2hDdS9HLEVBQUlDLEdBQU0seUJBQWVELEVBQUlDLEdBQzlCLHFDQUEyQkQsRUFBR3p3SSxNQUFPMHdJLEVBQUcxd0ksT0FDeEMsTUFBTTBNLEVBQVMsQ0FBRStFLEVBQUdnL0gsRUFBSXYvRyxFQUFHdy9HLEdBRTNCLE9BQU8sU0FBT3hwQixVQUFVLG9CQUFtQng2RyxFQUQ3QixROzs7OzZEQ3BEbEIsMlhBdUNPLE1BQU1xd0osRUFBVSxhQUFHLENBQUVDOzs7Ozs7Ozs7Ozs7Ozs7OztBQUo1QixTQUFrQjc3SixFQUFHOFYsR0FDakIsTUFBTWlqQixFQUFLLDBCQUFnQi80QixFQUFHLElBQUssV0FDbkMsT0FBTyxrQkFBUSs0QixFQUFJLHVCQUFhQSxFQUFHbDZCLE1BQU9pWCxHQUFNMmlCLGM7Ozs7MkRDckNwRCwyY0E4Q08sTUFBTThyRSxFQUFRLGFBQUcsQ0FBRXUzRDs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFWMUIsU0FBZ0Jwa0ksRUFBUzVoQixFQUFPLEdBQzVCLE1BQU0yNUgsRUFBVywrQkFBcUIvM0csRUFBUyxVQUFXLFFBQVMscUJBQ25FLFNBQVkrM0csRUFBUzF3SSxRQUFVLEdBQUcsSUFBTSx5Q0FDcEMwd0ksRUFBUzF3SSxPQUFTLEdBQ2xCLFNBQVkrVyxHQUFRMjVILEVBQVMsR0FBR2x3SSxNQUFNLElBQU0sdUNBRWhELE1BQU1nTSxFQUFTa2tJLEVBQ1QxZ0gsRUFBUSxDQUFFalosUUFDaEIsT0FBTyxTQUFPaXdHLFVBQVUsT0FBTXg2RyxFQUFRd2pCLE87Ozs7MERDNUMxQyxtWUF1Q08sTUFBTXdwQixFQUFPLGFBQUcsQ0FBRXdqSDs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFOekIsU0FBZS83SixFQUFHK1MsRUFBUSxHQUN0QixNQUNNeEgsRUFBUyxDQUFFdkwsRUFETiwwQkFBZ0JBLEVBQUcsSUFBSyxTQUU3Qit1QixFQUFRLENBQUVoYyxTQUNoQixPQUFPLFNBQU9nekcsVUFBVSxPQUFNeDZHLEVBQVF3akIsTzs7OztrRUNyQzFDLDJZQW9FTyxNQUFNd3lCLEVBQWUsYUFBRyxDQUFFeTZHOzs7Ozs7Ozs7Ozs7Ozs7OztBQWZqQyxTQUF1Qmg4SixFQUFHby9CLEVBQU9vaUIsRUFBS25rQyxFQUFTb2tDLEVBQVksRUFBR0MsRUFBVSxFQUFHQyxFQUFlLEVBQUdDLEVBQWMsRUFBR0MsRUFBaUIsR0FDM0gsTUFDTXQyQyxFQUFTLENBQUV2TCxFQUROLDBCQUFnQkEsRUFBRyxJQUFLLGVBQWdCLHNCQUU3Qyt1QixFQUFRLENBQ1ZxUSxRQUNBb2lCLE1BQ0Fua0MsVUFDQW9rQyxZQUNBQyxVQUNBQyxlQUNBQyxjQUNBQyxrQkFFSixPQUFPLFNBQU9ra0UsVUFBVSxlQUFjeDZHLEVBQVF3akIsTzs7OztrRUNsRWxELHFaQXFGTyxNQUFNc3pCLEVBQWUsYUFBRyxDQUFFNDVHOzs7Ozs7Ozs7Ozs7Ozs7OztBQXhCakMsU0FBdUIvMUosRUFBTTA4QyxFQUFZTixFQUFXQyxFQUFhQyxFQUFTQyxFQUFVQyxFQUFVQyxHQUMxRixNQUFNNUMsRUFBUSwwQkFBZ0I3NUMsRUFBTSxPQUFRLGVBQWdCLFVBQzVELEdBQW9CLFdBQWhCNjVDLEVBQU12Z0QsTUFDTixNQUFNLElBQUlvRSxNQUFNLG1DQUVwQixHQUEyQixJQUF2Qm04QyxFQUFNbGhELE1BQU1FLE9BQ1osTUFBTSxJQUFJNkUsTUFBTSwrQkFBK0JtOEMsRUFBTWxoRCxTQUV6RCxNQUFNZ2tELEVBQWMsMEJBQWdCRCxFQUFZLGFBQWMsZ0JBQzlELEdBQTBCLFVBQXRCQyxFQUFZcmpELE1BQ1osTUFBTSxJQUFJb0UsTUFBTSx5Q0FFcEIsTUFBTW1yQixFQUFRLENBQ1Z1ekIsWUFDQUMsY0FDQUMsVUFDQUMsV0FDQUMsV0FDQUMsMEJBRUVwM0MsRUFBUyxDQUFFckYsS0FBTTY1QyxFQUFPNkMsV0FBWUMsR0FDcEN0OEMsRUFBUyxTQUFPdy9HLFVBQVUsZUFBY3g2RyxFQUFRd2pCLEdBQ3RELE1BQU8sQ0FBRSt6QixPQUFRdjhDLEVBQU8sR0FBSXc4QyxhQUFjeDhDLEVBQU8sUTs7OztpRUNuRnJELG9aQWtFTyxNQUFNMDhDLEVBQWMsYUFBRyxDQUFFaTVHOzs7Ozs7Ozs7Ozs7Ozs7OztBQWRoQyxTQUFzQnh3SixFQUFPeTNDLEVBQVdELEdBQVksR0FDaEQsTUFBTUUsRUFBUywwQkFBZ0IxM0MsRUFBTyxRQUFTLGNBQWUsVUFDeEQyM0MsRUFBYSwwQkFBZ0JGLEVBQVcsWUFBYSxjQUFlLFVBQzFFLEdBQW9CLElBQWhCQyxFQUFPN2pELEtBQ1AsTUFBTSxJQUFJcUUsTUFBTSwrQ0FBK0N3L0MsRUFBT3ZrRCxTQUUxRSxHQUF3QixJQUFwQndrRCxFQUFXOWpELEtBQ1gsTUFBTSxJQUFJcUUsTUFBTSxtREFBbUR5L0MsRUFBV3hrRCxTQUVsRixNQUFNa3dCLEVBQVEsQ0FBRW0wQixhQUNWMzNDLEVBQVMsQ0FBRUcsTUFBTzAzQyxFQUFRRCxVQUFXRSxHQUNyQzk4QyxFQUFTLFNBQU93L0csVUFBVSxjQUFheDZHLEVBQVF3akIsR0FDckQsTUFBTyxDQUFFOGQsUUFBU3RtQyxFQUFPLEdBQUkxQixPQUFRMEIsRUFBTyxHQUFJMUgsTUFBTzBILEVBQU8sUTs7Ozs0RUNoRWxFLCtaQWtETyxNQUFNZzlDLEVBQXlCLGFBQUcsQ0FBRTQ0Rzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFUM0MsU0FBaUN6d0osRUFBTzgzQyxHQUNwQyxNQUFNSixFQUFTLDBCQUFnQjEzQyxFQUFPLFFBQVMseUJBQTBCLFVBQ25FcWpCLEVBQVEsQ0FBRXkwQixjQUNoQixHQUFJQSxHQUFjLEVBQ2QsTUFBTSxJQUFJNS9DLE1BQU0sd0NBRXBCLE1BQU0ySCxFQUFTLENBQUVHLE1BQU8wM0MsR0FDeEIsT0FBTyxTQUFPMmlFLFVBQVUseUJBQXdCeDZHLEVBQVF3akIsTzs7Ozt5RENoRDVELHVkQW1ETyxNQUFNNDBCLEVBQU0sYUFBRyxDQUFFeTRHOzs7Ozs7Ozs7Ozs7Ozs7OztBQVB4QixTQUFjOXJKLEVBQUd5ZixHQUNiLElBQUl1L0csRUFBSywwQkFBZ0JoL0gsRUFBRyxJQUFLLE9BQzdCaS9ILEVBQUssMEJBQWdCeC9HLEVBQUcsSUFBSyxRQUNoQ3UvRyxFQUFJQyxHQUFNLHlCQUFlRCxFQUFJQyxHQUM5QixNQUFNaGtJLEVBQVMsQ0FBRStFLEVBQUdnL0gsRUFBSXYvRyxFQUFHdy9HLEdBQzNCLE9BQU8sU0FBT3hwQixVQUFVLE1BQUt4NkcsTzs7Ozt5RENqRGpDLDRjQTRETyxNQUFNM0IsRUFBTSxhQUFHLENBQUV5eUo7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBVHhCLFNBQWNyOEosRUFBRzhWLEVBQU8sS0FBTW1pQixHQUFXLEdBQ3JDLElBQUljLEVBQUssMEJBQWdCLzRCLEVBQUcsSUFBSyxPQUNoQixTQUFiKzRCLEVBQUd2NUIsUUFDSHU1QixFQUFLLGVBQUtBLEVBQUksVUFFbEIsTUFBTXh0QixFQUFTLENBQUV2TCxFQUFHKzRCLEdBQ2RoSyxFQUFRLENBQUVqWixPQUFNbWlCLFlBQ3RCLE9BQU8sU0FBTzh0RixVQUFVLE1BQUt4NkcsRUFBUXdqQixPOzs7O3lEQzFEekMsa1lBcUNPLE1BQU1vMUIsRUFBTSxhQUFHLENBQUVtNEc7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTHhCLFNBQWN0OEosR0FDVixNQUNNdUwsRUFBUyxDQUFFdkwsRUFETiwwQkFBZ0JBLEVBQUcsSUFBSyxRQUVuQyxPQUFPLFNBQU8rbEgsVUFBVSxNQUFLeDZHLE87Ozs7MERDbkNqQyxtWUFxQ08sTUFBTTg0QyxFQUFPLGFBQUcsQ0FBRWs0Rzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFMekIsU0FBZXY4SixHQUNYLE1BQ011TCxFQUFTLENBQUV2TCxFQUROLDBCQUFnQkEsRUFBRyxJQUFLLFNBRW5DLE9BQU8sU0FBTytsSCxVQUFVLE9BQU14NkcsTzs7Ozs0RENuQ2xDOzs7Ozs7Ozs7Ozs7Ozs7OztBQThDTyxTQUFTczVELEVBQU9oZ0UsRUFBUWhHLEVBQU9XLEdBQ2xDLE1BQU1nOUosRUFBZ0IscUJBQVczM0osRUFBUXJGLEdBQ3pDLE9BQU8scUJBQVdxRixFQUFRaEcsRUFBTzI5SixFQUFlaDlKLEs7Ozs7OERDaERwRDs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFtQ08sU0FBU2k5SixFQUFTNTNKLEVBQVFyRixHQUM3Qix3QkFBY3FGLEdBQ2QsTUFBTTIzSixFQUFnQixxQkFBVzMzSixFQUFRckYsR0FDekMsR0FBNkIsSUFBekJnOUosRUFBY3o5SixPQUNkLE1BQU0sSUFBSTZFLE1BQU0sc0RBR3BCLE9BQU8scUJBQVdpQixFQURKLEtBQ21CMjNKLEVBQWVoOUosSzs7Ozs4REMxQ3BEOzs7Ozs7Ozs7Ozs7Ozs7OztBQTBDTyxTQUFTazlKLEVBQVM3M0osRUFBUWhHLEVBQU9XLEdBRXBDLEdBREEsd0JBQWNxRixHQUNELE1BQVRoRyxHQUFrQyxJQUFqQkEsRUFBTUUsT0FDdkIsTUFBTSxJQUFJNkUsTUFBTSxpREFFcEIsTUFBTTQ0SixFQUFnQixxQkFBVzMzSixFQUFRckYsR0FDekMsR0FBNkIsSUFBekJnOUosRUFBY3o5SixRQUF5QyxJQUF6Qnk5SixFQUFjejlKLE9BQzVDLE1BQU0sSUFBSTZFLE1BQU0sa0VBRXBCLEdBQTZCLElBQXpCNDRKLEVBQWN6OUosUUFBeUIsTUFBVEYsRUFDOUIsTUFBTSxJQUFJK0UsTUFBTSxnRkFHcEIsT0FBTyxxQkFBV2lCLEVBQVFoRyxFQUFPMjlKLEVBQWVoOUosSzs7Ozs4REN2RHBEOzs7Ozs7Ozs7Ozs7Ozs7OztBQTBDTyxTQUFTbTlKLEVBQVM5M0osRUFBUWhHLEVBQU9XLEdBRXBDLEdBREEsd0JBQWNxRixHQUNELE1BQVRoRyxHQUFrQyxJQUFqQkEsRUFBTUUsT0FDdkIsTUFBTSxJQUFJNkUsTUFBTSxtREFFcEIsTUFBTTQ0SixFQUFnQixxQkFBVzMzSixFQUFRckYsR0FDekMsR0FBNkIsSUFBekJnOUosRUFBY3o5SixRQUF5QyxJQUF6Qnk5SixFQUFjejlKLE9BQzVDLE1BQU0sSUFBSTZFLE1BQU0sb0VBRXBCLEdBQTZCLElBQXpCNDRKLEVBQWN6OUosUUFBeUIsTUFBVEYsRUFDOUIsTUFBTSxJQUFJK0UsTUFBTSwyRUFHcEIsT0FBTyxxQkFBV2lCLEVBQVFoRyxFQUFPMjlKLEVBQWVoOUosSzs7Ozs4REN2RHBEOzs7Ozs7Ozs7Ozs7Ozs7OztBQTBDTyxTQUFTbzlKLEVBQVMvM0osRUFBUWhHLEVBQU9XLEdBRXBDLEdBREEsd0JBQWNxRixHQUNELE1BQVRoRyxHQUFrQyxJQUFqQkEsRUFBTUUsT0FDdkIsTUFBTSxJQUFJNkUsTUFBTSxrREFFcEIsTUFBTTQ0SixFQUFnQixxQkFBVzMzSixFQUFRckYsR0FDekMsR0FBNkIsSUFBekJnOUosRUFBY3o5SixRQUF5QyxJQUF6Qnk5SixFQUFjejlKLE9BQzVDLE1BQU0sSUFBSTZFLE1BQU0sc0VBRXBCLEdBQTZCLElBQXpCNDRKLEVBQWN6OUosUUFBeUIsTUFBVEYsRUFDOUIsTUFBTSxJQUFJK0UsTUFBTSwyRUFHcEIsT0FBTyxxQkFBV2lCLEVBQVFoRyxFQUFPMjlKLEVBQWVoOUosSzs7Ozs4REN2RHBEOzs7Ozs7Ozs7Ozs7Ozs7OztBQTBDTyxTQUFTcTlKLEVBQVNoNEosRUFBUWhHLEVBQU9XLEdBRXBDLEdBREEsd0JBQWNxRixHQUNELE1BQVRoRyxHQUFrQyxJQUFqQkEsRUFBTUUsT0FDdkIsTUFBTSxJQUFJNkUsTUFBTSxrREFFcEIsTUFBTTQ0SixFQUFnQixxQkFBVzMzSixFQUFRckYsR0FDekMsR0FBNkIsSUFBekJnOUosRUFBY3o5SixRQUF5QyxJQUF6Qnk5SixFQUFjejlKLE9BQzVDLE1BQU0sSUFBSTZFLE1BQU0sd0VBR3BCLEdBQTZCLElBQXpCNDRKLEVBQWN6OUosUUFBeUIsTUFBVEYsRUFDOUIsTUFBTSxJQUFJK0UsTUFBTSwyRUFHcEIsT0FBTyxxQkFBV2lCLEVBQVFoRyxFQUFPMjlKLEVBQWVoOUosSzs7Ozs4REN4RHBEOzs7Ozs7Ozs7Ozs7Ozs7OztBQTBDTyxTQUFTczlKLEVBQVNqNEosRUFBUWhHLEVBQU9XLEdBRXBDLEdBREEsd0JBQWNxRixHQUNELE1BQVRoRyxHQUFrQyxJQUFqQkEsRUFBTUUsT0FDdkIsTUFBTSxJQUFJNkUsTUFBTSxpREFFcEIsTUFBTTQ0SixFQUFnQixxQkFBVzMzSixFQUFRckYsR0FDekMsR0FBNkIsSUFBekJnOUosRUFBY3o5SixRQUF5QyxJQUF6Qnk5SixFQUFjejlKLE9BQzVDLE1BQU0sSUFBSTZFLE1BQU0sMEVBR3BCLEdBQTZCLElBQXpCNDRKLEVBQWN6OUosUUFBeUIsTUFBVEYsRUFDOUIsTUFBTSxJQUFJK0UsTUFBTSwyRUFLcEIsT0FGQS9FLEVBQVFBLEdBQ0oyOUosRUFDRyxxQkFBVzMzSixFQUFRaEcsRUFBTzI5SixFQUFlaDlKLEs7Ozs7Z0VDMURwRDs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFtQk8sU0FBU3NwSCxFQUFXamtILEVBQVFoRyxFQUFPMjlKLEVBQWVoOUosR0FJckQsR0FIYSxNQUFUQSxJQUNBQSxFQUFRLHFCQUFXcUYsSUFFVCxjQUFWckYsRUFDQSxNQUFNLElBQUlvRSxNQUFNLG9GQUdwQixJQUFLLHVCQUFhaUIsS0FBWTRRLE1BQU1zdkQsUUFBUWxnRSxJQUN0QixpQkFBWEEsR0FBeUMsa0JBQVhBLEdBQ25CLGlCQUFYQSxFQUNQLE1BQU0sSUFBSWpCLE1BQU0sNEhBR3BCLEdBQWEsTUFBVC9FLEVBQWUsQ0FDZiw2Q0FBbUNBLEdBQ25DLE1BQU1rK0osRUFBZSx3QkFBY2wrSixHQUM3Qm0rSixFQUFlLHdCQUFjUixHQUNuQyxpQkFBT08sSUFBaUJDLEdBQWMsSUFBTSxpQ0FBaUNuK0osOEJBQ3RFaytKLG9CQUErQkMsTUFDdEMsSUFBSyxJQUFJL2hLLEVBQUksRUFBR0EsRUFBSXVoSyxFQUFjejlKLFNBQVU5RCxFQUFHLENBQzNDLE1BQU1naUssRUFBV1QsRUFBY3ZoSyxHQUN6QmlpSyxFQUFvQmppSyxJQUFNdWhLLEVBQWN6OUosT0FBUyxHQUNuRGsrSixJQUFhLHdCQUFjcCtKLEVBQU1LLE1BQU1qRSxJQUUzQyxpQkFBT3VoSyxFQUFjdmhLLEtBQU80RCxFQUFNNUQsS0FBT2lpSyxHQUFtQixJQUN4RCxnREFBSVYseUNBQ00zOUosVUFVdEIsT0FQSyx1QkFBYWdHLElBQVk0USxNQUFNc3ZELFFBQVFsZ0UsS0FDeENBLEVBQVMsQ0FBQ0EsSUFFZGhHLEVBQVFBLEdBQVMyOUosRUFDakIzM0osRUFBbUIsV0FBVnJGLEVBQ0wsdUJBQWFxRixFQUFRckYsR0FDckIsa0JBQVFxRixFQUFRLElBQUksR0FDakIsU0FBT2lrSCxXQUFXamtILEVBQVFoRyxFQUFPVyxLOzs7OzBEQ3hENUMsMGNBc0RPLE1BQU0ra0QsRUFBTyxhQUFHLENBQUU0NEc7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUnpCLFNBQWVuOUosRUFBR3drRCxHQUNkLE1BQU16ckIsRUFBSywwQkFBZ0IvNEIsRUFBRyxJQUFLLE9BQVEscUJBQzNDLFNBQVkrNEIsRUFBR3g1QixPQUFTaWxELEVBQUt6bEQsUUFBUSxJQUFNLHFDQUFxQ2c2QixFQUFHeDVCLGtDQUNsRGlsRCxPQUNqQyxNQUFNajVDLEVBQVMsQ0FBRXZMLEVBQUcrNEIsR0FDZGhLLEVBQVEsQ0FBRXkxQixRQUNoQixPQUFPLFNBQU91aEUsVUFBVSxPQUFNeDZHLEVBQVF3akIsTzs7OzswRENwRDFDLG1ZQThETyxNQUFNbXVFLEVBQU8sYUFBRyxDQUFFa2dFOzs7Ozs7Ozs7Ozs7Ozs7OztBQWxCekIsU0FBZXA5SixFQUFHMG9DLEVBQUksRUFBR3FjLEdBQVMsR0FDOUIsTUFBTWhzQixFQUFLLDBCQUFnQi80QixFQUFHLElBQUssUUFDbkMsR0FBZ0IsSUFBWis0QixFQUFHeDVCLEtBQ0gsTUFBTSxJQUFJcUUsTUFBTSxzREFFcEIsTUFBTXNoRCxFQUFVbnNCLEVBQUdsNkIsTUFBTWs2QixFQUFHbDZCLE1BQU1FLE9BQVMsR0FDM0MsR0FBSTJwQyxFQUFJLEVBQ0osTUFBTSxJQUFJOWtDLE1BQU0sNkNBQTZDOGtDLEtBRWpFLEdBQUlBLEVBQUl3YyxFQUNKLE1BQU0sSUFBSXRoRCxNQUFNLHVEQUF1RHNoRCxjQUN4RHhjLEtBRW5CLE1BQU1uOUIsRUFBUyxDQUFFdkwsRUFBRys0QixHQUNkaEssRUFBUSxDQUFFMlosSUFBR3FjLFdBQ1psZ0QsRUFBUWdvQyxHQUFXLFNBQU9rNUUsVUFBVSxPQUFNeDZHLEVBQVF3akIsR0FDekQsTUFBTyxDQUFFbHFCLFNBQVFnb0MsZTs7OzsrREM1RHJCLCtjQTBETyxNQUFNMlosRUFBWSxhQUFHLENBQUU2Mkc7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbEI5QixTQUFvQnI5SixFQUFHdTRCLEdBQ25CLE1BQU1RLEVBQUssMEJBQWdCLzRCLEVBQUcsSUFBSyxhQVVuQyxHQVRZLE1BQVJ1NEIsSUFDQUEsRUFBT1EsRUFBR2w2QixNQUFNdEIsS0FBSSxDQUFDUCxFQUFHL0IsSUFBTUEsSUFBR3FmLFdBRXJDLFNBQVl5ZSxFQUFHeDVCLE9BQVNnNUIsRUFBS3g1QixRQUFRLElBQU0scUNBQXFDZzZCLEVBQUd4NUIsa0NBQ2xEZzVCLE9BQ2pDQSxFQUFLNzZCLFNBQVFvWSxJQUNULFNBQVlBLEdBQVEsR0FBS0EsRUFBT2lqQixFQUFHeDVCLE1BQU0sSUFBTSxnREFBK0N3NUIsRUFBR3g1QixLQUFPLEdBQ3BHLFlBQVlnNUIsU0FFaEJRLEVBQUd4NUIsTUFBUSxFQUNYLE9BQU93NUIsRUFBRzRvRixRQUVkLE1BQU1wMkcsRUFBUyxDQUFFdkwsRUFBRys0QixHQUNkaEssRUFBUSxDQUFFd0osUUFDaEIsT0FBTyxTQUFPd3RGLFVBQVUsWUFBV3g2RyxFQUFRd2pCLE87Ozs7cUVDeEQvQyxpVEFrRE8sTUFBTXV1SSxFQUFrQixhQUFHLENBQUVDOzs7Ozs7Ozs7Ozs7Ozs7OztBQVhwQyxTQUEwQjErSixFQUFPKytCLEVBQU8sRUFBRzh6SCxFQUFTLEVBQUdseUosRUFBT2cxQyxHQUMxRCxHQUFhLE1BQVRoMUMsR0FBMkIsU0FBVkEsRUFDakIsTUFBTSxJQUFJb0UsTUFBTSxxQ0FFcEIsTUFBTW13SixFQUFZLElBQUksY0FBWW4ySCxFQUFNOHpILEVBQVFseUosR0FBTyxFQUFzQmcxQyxHQUN2RXh1QyxFQUFNLGlCQUFPbkgsRUFBT1csR0FDMUIsSUFBSyxJQUFJdkUsRUFBSSxFQUFHQSxFQUFJK0ssRUFBSW5CLE9BQU85RixPQUFROUQsSUFDbkMrSyxFQUFJbkIsT0FBTzVKLEdBQUs4NEosRUFBVWhDLFlBRTlCLE9BQU8vckosRUFBSXk3RyxlOzs7OzREQ2hEZiw0Y0E4RU8sTUFBTS82RCxFQUFTLGFBQUcsQ0FBRTgyRzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFSM0IsU0FBaUJ4OUosRUFBRzhWLEVBQU8sR0FDdkIsTUFBTWlqQixFQUFLLDBCQUFnQi80QixFQUFHLElBQUssU0FBVSxxQkFDN0MsaUJBQU8rNEIsRUFBR3g1QixLQUFPLEdBQUcsSUFBTSx5Q0FDMUIsTUFBTWdNLEVBQVMsQ0FBRXZMLEVBQUcrNEIsR0FDZGhLLEVBQVEsQ0FBRWpaLFNBQ1RqUixFQUFRZ29DLEdBQVcsU0FBT2s1RSxVQUFVLFNBQVF4NkcsRUFBUXdqQixHQUMzRCxNQUFPLENBQUVscUIsU0FBUWdvQyxlOzs7O3dFQzVFckIsd2RBK0NPLE1BQU1rYSxFQUFxQixhQUFHLENBQUUwMkc7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUnZDLFNBQTZCejlKLEVBQUc4L0MsRUFBWWtILEdBQ3hDLE1BQU1qdUIsRUFBSywwQkFBZ0IvNEIsRUFBRyxJQUFLLHNCQUM3QmdnRCxFQUFjLDBCQUFnQkYsRUFBWSxhQUFjLHFCQUFzQixTQUNwRixpQkFBTyxnQkFBTWtILElBQWMsSUFBTSxxQ0FDakMsTUFBTXo3QyxFQUFTLENBQUV2TCxFQUFHKzRCLEVBQUkrbUIsV0FBWUUsR0FDOUJqeEIsRUFBUSxDQUFFaTRCLGVBQ2hCLE9BQU8sU0FBTysrRCxVQUFVLHFCQUFvQng2RyxFQUFRd2pCLE87Ozs7NkRDN0N4RCw2Y0EwQ08sTUFBTTJ1SSxFQUFVLGFBQUcsQ0FBRUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUDVCLFNBQWtCMzlKLEVBQUc4VixFQUFPLEdBQ3hCLE1BQU1pakIsRUFBSywwQkFBZ0IvNEIsRUFBRyxJQUFLLFVBQVcscUJBQzlDLFNBQVk4VixJQUFTaWpCLEVBQUdsNkIsTUFBTUUsUUFBVStXLEVBQU9pakIsRUFBR2w2QixNQUFNRSxRQUFRLElBQU0sVUFBVStXLGlCQUFvQmlqQixFQUFHbDZCLE1BQU1FLFdBQVdnNkIsRUFBR2w2QixNQUFNRSxZQUNqSSxNQUFNd00sRUFBUyxDQUFFclAsTUFBTzY4QixHQUNsQmhLLEVBQVEsQ0FBRWpaLFFBQ2hCLE9BQU8sU0FBT2l3RyxVQUFVLFNBQVF4NkcsRUFBUXdqQixPOzs7OzhEQ3hDNUM7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQ08sU0FBU3B4QixFQUFTdXZGLEVBQWNpOEIsR0FBWSxFQUFNM3RILEVBQU1nRSxHQUMzRCxPQUFPLFNBQU8wcEgsYUFBYWg4QixFQUFjaThCLEVBQVczdEgsRUFBTWdFLEs7Ozs7MkRDbEM5RCw0akJBK0RPLE1BQU1vTSxFQUFRLGFBQUcsQ0FBRWd5Sjs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFsQjFCLFNBQWdCL3hKLEVBQVd5RSxFQUFHeWYsR0FDMUIsTUFBTXUvRyxFQUFLLDBCQUFnQmgvSCxFQUFHLElBQUssU0FDN0JpL0gsRUFBSywwQkFBZ0J4L0csRUFBRyxJQUFLLFNBQzdCOHRJLEVBQWEsMEJBQWdCaHlKLEVBQVcsWUFBYSxRQUFTLFFBSTlEaXlKLEVBQWlCLHFDQUEyQixxQ0FBMkJELEVBQVdoL0osTUFBT3l3SSxFQUFHendJLE9BQVEwd0ksRUFBRzF3SSxPQUl2RzBNLEVBQVMsQ0FDWE0sVUFKMEIsc0JBQVlneUosRUFBWUMsR0FLbEQzaEssRUFKa0Isc0JBQVltekksRUFBSXd1QixHQUtsQ2ppSCxFQUprQixzQkFBWTB6RixFQUFJdXVCLElBTXRDLE9BQU8sU0FBTy8zQyxVQUFVLFNBQVF4NkcsTzs7OztnRUM3RHBDLHdQQStDTyxNQUFNd3lKOzs7Ozs7Ozs7Ozs7Ozs7OztBQVRiMXNFLGVBQTJCeGxGLEdBQ3ZCLE1BQU1neUosRUFBYSwwQkFBZ0JoeUosRUFBVyxZQUFhLGFBQWMsUUFDbkV6RSxRQUFheTJKLEVBQVczM0osT0FDeEJGLEVBQU0sb0JBQVU2M0osRUFBV2gvSixNQUFPdUksR0FJeEMsT0FISXlFLElBQWNneUosR0FDZEEsRUFBVzd1SixVQUVSaEosSTs7OzsyREM3Q1g7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0NPLFNBQVMycEYsRUFBTTl3RixFQUFPVyxFQUFRLFdBQ2pDLEdBQWMsY0FBVkEsRUFBdUIsQ0FDdkIsTUFBTWtILEVBQU9pcEYsRUFBTTl3RixFQUFPLFdBQ3BCK0gsRUFBTytvRixFQUFNOXdGLEVBQU8sV0FDMUIsT0FBTyxrQkFBUTZILEVBQU1FLEdBRXpCLE1BQU0vQixFQUFTLDhCQUFvQix3QkFBY2hHLEdBQVFXLEdBQ3pELE9BQU8sU0FBT3NwSCxXQUFXamtILEVBQVFoRyxFQUFPVyxLOzs7OytEQ3ZDNUMsd1lBc0NPLE1BQU1pb0QsRUFBWSxhQUFHLENBQUV1Mkc7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTDlCLFNBQW9CaCtKLEdBQ2hCLE1BQ011TCxFQUFTLENBQUV2TCxFQUROLDBCQUFnQkEsRUFBRyxJQUFLLGNBRW5DLE9BQU8sU0FBTytsSCxVQUFVLFlBQVd4NkcsTzs7Ozt1RUNwQ3ZDOzs7Ozs7Ozs7Ozs7Ozs7OztBQTJCTyxNQUFNMHlKLFVBQTBCLFlBQ25DL2dLLFlBQVlnaEssRUFBY0MsRUFBS3p1SixFQUFVLE1BQ3JDNU0sUUFDQXpGLEtBQUs2Z0ssYUFBZUEsRUFDcEI3Z0ssS0FBSzhnSyxJQUFNQSxFQUNYOWdLLEtBQUtxUyxRQUFVQSxFQUNmclMsS0FBSytnSyxpQkFBbUIsR0FDeEIvZ0ssS0FBS2doSyxtQkFBcUIsR0FDWCxNQUFYM3VKLElBQ0FyUyxLQUFLcVMsUUFBVSxTQUFPdWUsUUFBUXZlLFdBR3RDNHVKLGVBQWVDLElBQ1c5b0osTUFBTXN2RCxRQUFRdzVGLEdBQ2hDQSxFQUFrQmhoSyxLQUFJNHFILEdBQVFBLEVBQUszc0gsT0FDbkNHLE9BQU9zVCxLQUFLc3ZKLElBQ0Y3Z0ssU0FBUSxDQUFDbEMsRUFBTVAsS0FDekIsTUFBTWlCLEVBQVEsU0FBT3VtSCxvQkFBb0JqbkgsR0FFVCxNQUE1QjZCLEtBQUsrZ0ssaUJBQWlCbmpLLEtBQ3RCb0MsS0FBSytnSyxpQkFBaUJuakssR0FBSyxDQUN2QnVqSyxhQUFjLEdBQUdoakssZUFDakJtQyxTQUFVLGdCQUFLLElBQU0sb0JBQVV6QixHQUFPeUIsU0FKNUIsV0FPZ0IsTUFBOUJOLEtBQUtnaEssbUJBQW1CcGpLLEtBQ3hCb0MsS0FBS2doSyxtQkFBbUJwakssR0FBSyxDQUN6QnVqSyxhQUFjLEdBQUdoakssY0FDakJtQyxTQUFVLGdCQUFLLElBQU0sb0JBQVV6QixHQUFPeUIsU0FWNUIsV0FhbEIsTUFBTWtzSCxFQUFXcDBHLE1BQU1zdkQsUUFBUXc1RixHQUMzQkEsRUFBa0J0akssR0FBRzRwRSxPQUNyQjA1RixFQUFrQi9pSyxHQUN0QixHQUFnQixNQUFacXVILEVBQ0EsT0FFSixNQUFNNDBDLEVBQWtCcGhLLEtBQUsrZ0ssaUJBQWlCbmpLLEdBQUcwQyxTQUMzQytnSyxFQUFvQnJoSyxLQUFLZ2hLLG1CQUFtQnBqSyxHQUFHMEMsU0FDckQsZ0JBQUssS0FDRCxNQUFNZ2hLLEVBQXFCLGNBQUksY0FBSUYsRUFBaUJwaEssS0FBSzhnSyxLQUFNLGNBQUksaUJBQU90MEMsR0FBVyxFQUFJeHNILEtBQUs4Z0ssTUFDeEY5aUgsRUFBVSxjQUFJLGNBQUksZUFBSyxjQUFJcWpILEVBQW1CcmhLLEtBQUtxUyxVQUFXLGVBQUssY0FBSSt1SixFQUFpQnBoSyxLQUFLcVMsV0FBWW02RyxHQUN6RyswQyxFQUF1QixjQUFJLGNBQUlGLEVBQW1CcmhLLEtBQUs4Z0ssS0FBTSxjQUFJLGlCQUFPOWlILEdBQVUsRUFBSWgrQyxLQUFLOGdLLE1BQ2pHTSxFQUFnQnJoSCxPQUFPdWhILEdBQ3ZCRCxFQUFrQnRoSCxPQUFPd2hILEdBQ3pCLE1BQU1qa0YsRUFBVyxjQUFJLGNBQUl0L0IsR0FBVWgrQyxLQUFLNmdLLGNBQWVoaUssR0FDdkRBLEVBQU1raEQsT0FBT3U5QixTQUdyQnQ5RSxLQUFLd2hLLHNCQUVUN3ZKLFVBQ21DLE1BQTNCM1IsS0FBS2doSyxxQkFDTCxrQkFBUWhoSyxLQUFLK2dLLGlCQUFpQjdnSyxLQUFJZzNFLEdBQUtBLEVBQUU1MkUsWUFDekMsa0JBQVFOLEtBQUtnaEssbUJBQW1COWdLLEtBQUlnM0UsR0FBS0EsRUFBRTUyRSxhQUduRCxtQkFFSSxNQUFNbWhLLEVBQVksSUFBSXpoSyxLQUFLK2dLLG9CQUFxQi9nSyxLQUFLZ2hLLG9CQUNyRCxNQUFPLE9BQU9oaEssS0FBSzBoSyxrQkFBa0I3K0osT0FBTzQrSixFQUFVdmhLLEtBQUlnM0UsSUFBSyxDQUFHLzRFLEtBQU0rNEUsRUFBRWlxRixhQUFjMzVGLE9BQVEwUCxFQUFFNTJFLGNBRXRHLGlCQUFpQnFoSyxHQUViLE1BQU1DLEdBRE5ELFFBQXFCM2hLLEtBQUs2aEssa0JBQWtCRixJQUNUamdLLE9BQVMsRUFFNUMxQixLQUFLK2dLLGlCQUNEWSxFQUFhOS9KLE1BQU0sRUFBRysvSixHQUFlMWhLLEtBQUlnM0UsSUFBSyxDQUMxQ2lxRixhQUFjanFGLEVBQUUvNEUsS0FDaEJtQyxTQUFVNDJFLEVBQUUxUCxPQUFPbG5FLFNBSlQsV0FNbEJOLEtBQUtnaEssbUJBQ0RXLEVBQWE5L0osTUFBTSsvSixFQUErQixFQUFoQkEsR0FDN0IxaEssS0FBSWczRSxJQUFLLENBQ1ZpcUYsYUFBY2pxRixFQUFFLzRFLEtBQ2hCbUMsU0FBVTQyRSxFQUFFMVAsT0FBT2xuRSxTQVZULFdBYXRCd2hLLFlBQ0ksTUFBTyxDQUNILGFBQWdCOWhLLEtBQUs2Z0ssYUFDckIsSUFBTzdnSyxLQUFLOGdLLElBQ1osUUFBVzlnSyxLQUFLcVMsU0FJeEIsa0JBQWtCMHZKLEVBQUsxd0IsR0FDbkIsT0FBTyxJQUFJMHdCLEVBQUkxd0IsRUFBcUIsYUFBR0EsRUFBWSxJQUFHQSxFQUFnQixVQUk5RXV2QixFQUFrQm9CLFVBQVksV0FDOUIsd0JBQWNwQixJOzs7O3NFQ3ZIZDs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEyQk8sTUFBTXFCLFVBQXlCLFlBQ2xDcGlLLFlBQVlnaEssRUFBY3FCLEVBQTBCLElBQ2hEejhKLFFBQ0F6RixLQUFLNmdLLGFBQWVBLEVBQ3BCN2dLLEtBQUtraUssd0JBQTBCQSxFQUMvQmxpSyxLQUFLK2dLLGlCQUFtQixHQUU1QkUsZUFBZUMsSUFDVzlvSixNQUFNc3ZELFFBQVF3NUYsR0FDaENBLEVBQWtCaGhLLEtBQUk0cUgsR0FBUUEsRUFBSzNzSCxPQUNuQ0csT0FBT3NULEtBQUtzdkosSUFDRjdnSyxTQUFRLENBQUNsQyxFQUFNUCxLQUN6QixNQUFNaUIsRUFBUSxTQUFPdW1ILG9CQUFvQmpuSCxHQUN6QyxHQUFnQyxNQUE1QjZCLEtBQUsrZ0ssaUJBQWlCbmpLLEdBQVksQ0FDbEMsTUFBTWt1SCxHQUFZLEVBQ2xCOXJILEtBQUsrZ0ssaUJBQWlCbmpLLEdBQUssQ0FDdkJ1akssYUFBYyxHQUFHaGpLLGdCQUNqQm1DLFNBQVUsZ0JBQUssSUFBTSxlQUFLekIsRUFBTTJDLE1BQU94QixLQUFLa2lLLHlCQUN2QzVoSyxTQUFTd3JILE1BR3RCLE1BQU1VLEVBQVdwMEcsTUFBTXN2RCxRQUFRdzVGLEdBQzNCQSxFQUFrQnRqSyxHQUFHNHBFLE9BQ3JCMDVGLEVBQWtCL2lLLEdBQ3RCLEdBQWdCLE1BQVpxdUgsRUFDQSxPQUVKLE1BQU00MEMsRUFBa0JwaEssS0FBSytnSyxpQkFBaUJuakssR0FBRzBDLFNBQ2pELGdCQUFLLEtBQ0QsTUFBTWdoSyxFQUFxQixjQUFJRixFQUFpQixpQkFBTzUwQyxJQUN2RDQwQyxFQUFnQnJoSCxPQUFPdWhILEdBQ3ZCLE1BQU1oa0YsRUFBVyxjQUFJLGNBQUksY0FBSWt2QyxFQUFVLGVBQUssY0FBSTgwQyxFQUFvQixTQUFPMXdJLFFBQVF2ZSxjQUFlclMsS0FBSzZnSyxjQUFlaGlLLEdBQ3RIQSxFQUFNa2hELE9BQU91OUIsU0FHckJ0OUUsS0FBS3doSyxzQkFFVDd2SixVQUNpQyxNQUF6QjNSLEtBQUsrZ0ssa0JBQ0wsa0JBQVEvZ0ssS0FBSytnSyxpQkFBaUI3Z0ssS0FBSWczRSxHQUFLQSxFQUFFNTJFLFlBR2pELG1CQUVJLE1BQU8sT0FBT04sS0FBSzBoSyxrQkFBa0I3K0osT0FBTzdDLEtBQUsrZ0ssaUJBQWlCN2dLLEtBQUlnM0UsSUFBSyxDQUFHLzRFLEtBQU0rNEUsRUFBRWlxRixhQUFjMzVGLE9BQVEwUCxFQUFFNTJFLGNBRWxILGlCQUFpQnFoSyxHQUNiQSxRQUFxQjNoSyxLQUFLNmhLLGtCQUFrQkYsR0FFNUMzaEssS0FBSytnSyxpQkFBbUJZLEVBQWF6aEssS0FBSWczRSxJQUFLLENBQUdpcUYsYUFBY2pxRixFQUFFLzRFLEtBQU1tQyxTQUFVNDJFLEVBQUUxUCxPQUFPbG5FLFNBRHhFLFdBR3RCd2hLLFlBQ0ksTUFBTyxDQUNILGFBQWdCOWhLLEtBQUs2Z0ssYUFDckIsd0JBQTJCN2dLLEtBQUtraUsseUJBSXhDLGtCQUFrQkgsRUFBSzF3QixHQUNuQixPQUFPLElBQUkwd0IsRUFBSTF3QixFQUFxQixhQUFHQSxFQUFnQywwQkFJL0U0d0IsRUFBaUJELFVBQVksVUFDN0Isd0JBQWNDLEk7Ozs7bUVDM0ZkOzs7Ozs7Ozs7Ozs7Ozs7OztBQTZCTyxNQUFNRSxVQUFzQixZQUMvQnRpSyxZQUFZZ2hLLEVBQWN1QixFQUFPQyxFQUFPaHdKLEVBQVUsTUFDOUM1TSxRQUNBekYsS0FBSzZnSyxhQUFlQSxFQUNwQjdnSyxLQUFLb2lLLE1BQVFBLEVBQ2JwaUssS0FBS3FpSyxNQUFRQSxFQUNicmlLLEtBQUtxUyxRQUFVQSxFQUNmclMsS0FBS3NpSyx1QkFBeUIsR0FDOUJ0aUssS0FBS3VpSyx3QkFBMEIsR0FDL0IsZ0JBQUssS0FFRHZpSyxLQUFLd2lLLFNBQVcsaUJBQU9KLEdBQU85aEssV0FDOUJOLEtBQUt5aUssU0FBVyxpQkFBT0osR0FBTy9oSyxjQUVuQixNQUFYK1IsSUFDQXJTLEtBQUtxUyxRQUFVLFNBQU91ZSxRQUFRdmUsV0FHdEM0dUosZUFBZUMsR0FDWCxNQUFNd0IsRUFBV3RxSixNQUFNc3ZELFFBQVF3NUYsR0FDM0JBLEVBQWtCaGhLLEtBQUlnM0UsR0FBS0EsRUFBRS80RSxPQUM3QkcsT0FBT3NULEtBQUtzdkosR0FDaEIsZ0JBQUssS0FDRCxNQUFNeUIsRUFBbUIsY0FBSSxFQUFHM2lLLEtBQUt3aUssVUFDL0JJLEVBQW1CLGNBQUksRUFBRzVpSyxLQUFLeWlLLFVBQ3JDQyxFQUFTcmlLLFNBQVEsQ0FBQ2xDLEVBQU1QLEtBQ3BCLE1BQU1pQixFQUFRLFNBQU91bUgsb0JBQW9Cam5ILEdBRUgsTUFBbEM2QixLQUFLc2lLLHVCQUF1QjFrSyxLQUM1Qm9DLEtBQUtzaUssdUJBQXVCMWtLLEdBQUssQ0FDN0J1akssYUFBYyxHQUFHaGpLLE1BQ2pCbUMsU0FBVSxnQkFBSyxJQUFNLG9CQUFVekIsR0FBT3lCLFNBSjVCLFdBT3FCLE1BQW5DTixLQUFLdWlLLHdCQUF3QjNrSyxLQUM3Qm9DLEtBQUt1aUssd0JBQXdCM2tLLEdBQUssQ0FDOUJ1akssYUFBYyxHQUFHaGpLLE1BQ2pCbUMsU0FBVSxnQkFBSyxJQUFNLG9CQUFVekIsR0FBT3lCLFNBVjVCLFdBYWxCLE1BQU1rc0gsRUFBV3AwRyxNQUFNc3ZELFFBQVF3NUYsR0FDM0JBLEVBQWtCdGpLLEdBQUc0cEUsT0FDckIwNUYsRUFBa0IvaUssR0FDdEIsR0FBZ0IsTUFBWnF1SCxFQUNBLE9BRUosTUFBTXEyQyxFQUFjN2lLLEtBQUtzaUssdUJBQXVCMWtLLEdBQUcwQyxTQUM3Q3dpSyxFQUFlOWlLLEtBQUt1aUssd0JBQXdCM2tLLEdBQUcwQyxTQUMvQ3lpSyxFQUFpQixjQUFJLGNBQUlGLEVBQWE3aUssS0FBS29pSyxPQUFRLGNBQUk1MUMsRUFBVSxFQUFJeHNILEtBQUtvaUssUUFDMUVZLEVBQWtCLGNBQUksY0FBSUYsRUFBYzlpSyxLQUFLcWlLLE9BQVEsY0FBSSxpQkFBTzcxQyxHQUFXLEVBQUl4c0gsS0FBS3FpSyxRQUNwRlksRUFBMkIsY0FBSUYsRUFBZ0JKLEdBQy9DTyxFQUE0QixjQUFJRixFQUFpQkosR0FDdkRDLEVBQVk5aUgsT0FBT2dqSCxHQUNuQkQsRUFBYS9pSCxPQUFPaWpILEdBQ3BCLE1BQU0xbEYsRUFBVyxjQUFJLGNBQUksY0FBSTJsRixFQUEwQixjQUFJLGVBQUtDLEdBQTRCbGpLLEtBQUtxUyxXQUFZclMsS0FBSzZnSyxjQUFlaGlLLEdBQ2pJQSxFQUFNa2hELE9BQU91OUIsTUFFakJ0OUUsS0FBS3dpSyxTQUFTemlILE9BQU8sY0FBSS8vQyxLQUFLd2lLLFNBQVV4aUssS0FBS29pSyxRQUM3Q3BpSyxLQUFLeWlLLFNBQVMxaUgsT0FBTyxjQUFJLy9DLEtBQUt5aUssU0FBVXppSyxLQUFLcWlLLFdBRWpEcmlLLEtBQUt3aEssc0JBRVQ3dkosVUFDSTNSLEtBQUt3aUssU0FBUzd3SixVQUNkM1IsS0FBS3lpSyxTQUFTOXdKLFVBQ3FCLE1BQS9CM1IsS0FBS3NpSyx3QkFDTCxrQkFBUXRpSyxLQUFLc2lLLHVCQUF1QnBpSyxLQUFJZzNFLEdBQUtBLEVBQUU1MkUsWUFFZixNQUFoQ04sS0FBS3VpSyx5QkFDTCxrQkFBUXZpSyxLQUFLdWlLLHdCQUF3QnJpSyxLQUFJZzNFLEdBQUtBLEVBQUU1MkUsWUFHeEQsbUJBRUksTUFBTW1oSyxFQUFZLElBQUl6aEssS0FBS3NpSywwQkFBMkJ0aUssS0FBS3VpSyx5QkFDM0QsTUFBTyxPQUFPdmlLLEtBQUswaEssa0JBQWtCNytKLE9BQU80K0osRUFBVXZoSyxLQUFJZzNFLElBQUssQ0FBRy80RSxLQUFNKzRFLEVBQUVpcUYsYUFBYzM1RixPQUFRMFAsRUFBRTUyRSxjQUV0RyxpQkFBaUJxaEssR0FDYkEsUUFBcUIzaEssS0FBSzZoSyxrQkFBa0JGLEdBQzVDLGdCQUFLLEtBQ0QzaEssS0FBS3dpSyxTQUFTemlILE9BQU8sY0FBSS8vQyxLQUFLb2lLLE1BQU9waUssS0FBS21qSyxZQUFjLElBQ3hEbmpLLEtBQUt5aUssU0FBUzFpSCxPQUFPLGNBQUkvL0MsS0FBS3FpSyxNQUFPcmlLLEtBQUttakssWUFBYyxPQUU1RCxNQUFNdkIsRUFBZ0JELEVBQWFqZ0ssT0FBUyxFQUU1QzFCLEtBQUtzaUssdUJBQ0RYLEVBQWE5L0osTUFBTSxFQUFHKy9KLEdBQWUxaEssS0FBSWczRSxJQUFLLENBQzFDaXFGLGFBQWNqcUYsRUFBRS80RSxLQUNoQm1DLFNBQVU0MkUsRUFBRTFQLE9BQU9sbkUsU0FKVCxXQU1sQk4sS0FBS3VpSyx3QkFDRFosRUFBYTkvSixNQUFNKy9KLEVBQStCLEVBQWhCQSxHQUM3QjFoSyxLQUFJZzNFLElBQUssQ0FDVmlxRixhQUFjanFGLEVBQUUvNEUsS0FDaEJtQyxTQUFVNDJFLEVBQUUxUCxPQUFPbG5FLFNBVlQsV0FhdEJ3aEssWUFDSSxNQUFPLENBQ0gsYUFBZ0I5aEssS0FBSzZnSyxhQUNyQixNQUFTN2dLLEtBQUtvaUssTUFDZCxNQUFTcGlLLEtBQUtxaUssTUFDZCxRQUFXcmlLLEtBQUtxUyxTQUl4QixrQkFBa0IwdkosRUFBSzF3QixHQUNuQixPQUFPLElBQUkwd0IsRUFBSTF3QixFQUFxQixhQUFHQSxFQUFjLE1BQUdBLEVBQWMsTUFBR0EsRUFBZ0IsVUFJakc4d0IsRUFBY0gsVUFBWSxPQUMxQix3QkFBY0csSTs7OztxRUM3SWQ7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNEJPLE1BQU1pQixVQUF3QixZQUNqQ3ZqSyxZQUFZZ2hLLEVBQWN1QixFQUFPQyxFQUFPaHdKLEVBQVUsS0FBTTQ4SSxFQUFRLEdBQzVEeHBKLFFBQ0F6RixLQUFLNmdLLGFBQWVBLEVBQ3BCN2dLLEtBQUtvaUssTUFBUUEsRUFDYnBpSyxLQUFLcWlLLE1BQVFBLEVBQ2JyaUssS0FBS3FTLFFBQVVBLEVBQ2ZyUyxLQUFLaXZKLE1BQVFBLEVBQ2JqdkosS0FBS3NpSyx1QkFBeUIsR0FDOUJ0aUssS0FBS3FqSywyQkFBNkIsR0FDbEMsZ0JBQUssS0FDRHJqSyxLQUFLc2pLLFVBQVksaUJBQU8sR0FBR2hqSyxXQUMzQk4sS0FBS3dpSyxTQUFXLGlCQUFPSixHQUFPOWhLLGNBRW5CLE1BQVgrUixJQUNBclMsS0FBS3FTLFFBQVUsU0FBT3VlLFFBQVF2ZSxXQUd0QzR1SixlQUFlQyxHQUNYLE1BQU1qaEssRUFBZ0JtWSxNQUFNc3ZELFFBQVF3NUYsR0FDaENBLEVBQWtCaGhLLEtBQUk0cUgsR0FBUUEsRUFBSzNzSCxPQUNuQ0csT0FBT3NULEtBQUtzdkosR0FDaEIsZ0JBQUssS0FDRCxNQUFNeUIsRUFBbUIsY0FBSSxFQUFHM2lLLEtBQUt3aUssVUFDL0JlLEVBQUssZUFBS3ZqSyxLQUFLNmdLLGFBQWMsY0FBSSxjQUFJN2dLLEtBQUtzakssVUFBV3RqSyxLQUFLaXZKLE9BQVEsSUFDeEVodkosRUFBY0ksU0FBUSxDQUFDbEMsRUFBTVAsS0FDekIsTUFBTWlCLEVBQVEsU0FBT3VtSCxvQkFBb0JqbkgsR0FFSCxNQUFsQzZCLEtBQUtzaUssdUJBQXVCMWtLLEtBQzVCb0MsS0FBS3NpSyx1QkFBdUIxa0ssR0FBSyxDQUM3QnVqSyxhQUFjLEdBQUdoakssTUFDakJtQyxTQUFVLG9CQUFVekIsR0FBT3lCLFNBSmpCLFNBT3dCLE1BQXRDTixLQUFLcWpLLDJCQUEyQnpsSyxLQUNoQ29DLEtBQUtxakssMkJBQTJCemxLLEdBQUssQ0FDakN1akssYUFBYyxHQUFHaGpLLE1BQ2pCbUMsU0FBVSxvQkFBVXpCLEdBQU95QixTQVZqQixTQWFsQixNQUFNa3NILEVBQVdwMEcsTUFBTXN2RCxRQUFRdzVGLEdBQzNCQSxFQUFrQnRqSyxHQUFHNHBFLE9BQ3JCMDVGLEVBQWtCL2lLLEdBQ3RCLEdBQWdCLE1BQVpxdUgsRUFDQSxPQUVKLE1BQU1xMkMsRUFBYzdpSyxLQUFLc2lLLHVCQUF1QjFrSyxHQUFHMEMsU0FDN0NrakssRUFBa0J4akssS0FBS3FqSywyQkFBMkJ6bEssR0FBRzBDLFNBQ3JEeWlLLEVBQWlCLGNBQUksY0FBSUYsRUFBYTdpSyxLQUFLb2lLLE9BQVEsY0FBSTUxQyxFQUFVLEVBQUl4c0gsS0FBS29pSyxRQUMxRXFCLEVBQU0sY0FBSUQsRUFBaUJ4akssS0FBS3FpSyxPQUNoQ3FCLEVBQU0sY0FBSWwzQyxHQUNWbTNDLEVBQXFCLGtCQUFRRixFQUFLQyxHQUN4Q2IsRUFBWTlpSCxPQUFPZ2pILEdBQ25CUyxFQUFnQnpqSCxPQUFPNGpILEdBQ3ZCLE1BQU1ybUYsRUFBVyxjQUFJLGNBQUksY0FBSWltRixFQUFJWixHQUFtQixjQUFJSSxFQUFnQixjQUFJWSxFQUFvQjNqSyxLQUFLcVMsV0FBWXhULEdBQ2pIQSxFQUFNa2hELE9BQU91OUIsTUFFakJ0OUUsS0FBS3NqSyxVQUFVdmpILE9BQU8sY0FBSS8vQyxLQUFLc2pLLFVBQVcsSUFDMUN0akssS0FBS3dpSyxTQUFTemlILE9BQU8sY0FBSS8vQyxLQUFLd2lLLFNBQVV4aUssS0FBS29pSyxXQUVqRHBpSyxLQUFLd2hLLHNCQUVUN3ZKLFVBQ0kzUixLQUFLd2lLLFNBQVM3d0osVUFDZDNSLEtBQUtzakssVUFBVTN4SixVQUNvQixNQUEvQjNSLEtBQUtzaUssd0JBQ0wsa0JBQVF0aUssS0FBS3NpSyx1QkFBdUJwaUssS0FBSWczRSxHQUFLQSxFQUFFNTJFLFlBRVosTUFBbkNOLEtBQUtxakssNEJBQ0wsa0JBQVFyakssS0FBS3FqSywyQkFBMkJuakssS0FBSWczRSxHQUFLQSxFQUFFNTJFLFlBRzNELG1CQUNJLE1BQU0sSUFBSWlHLE1BQU0sbURBRXBCLGlCQUFpQm83SixHQUNiLE1BQU0sSUFBSXA3SixNQUFNLG1EQUVwQnU3SixZQUNJLE1BQU8sQ0FDSCxhQUFnQjloSyxLQUFLNmdLLGFBQ3JCLE1BQVM3Z0ssS0FBS29pSyxNQUNkLE1BQVNwaUssS0FBS3FpSyxNQUNkLFFBQVdyaUssS0FBS3FTLFFBQ2hCLE1BQVNyUyxLQUFLaXZKLE9BSXRCLGtCQUFrQjhTLEVBQUsxd0IsR0FDbkIsT0FBTyxJQUFJMHdCLEVBQUkxd0IsRUFBcUIsYUFBR0EsRUFBYyxNQUFHQSxFQUFjLE1BQUdBLEVBQWdCLFFBQUdBLEVBQWMsUUFJbEgreEIsRUFBZ0JwQixVQUFZLFNBQzVCLHdCQUFjb0IsSTs7Ozt1RUMxSGQ7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBeUJPLE1BQU1RLFVBQTBCLGVBQ25DL2pLLFlBQVlnaEssRUFBY2dELEVBQVVDLEdBQWMsR0FDOUNyK0osTUFBTW83SixHQUNON2dLLEtBQUs2Z0ssYUFBZUEsRUFDcEI3Z0ssS0FBSzZqSyxTQUFXQSxFQUNoQjdqSyxLQUFLOGpLLFlBQWNBLEVBQ25COWpLLEtBQUsrakssY0FBZ0IsR0FDckIvakssS0FBS2hDLEVBQUksaUJBQU9nQyxLQUFLNmpLLFVBRXpCNUMsZUFBZUMsSUFDVzlvSixNQUFNc3ZELFFBQVF3NUYsR0FDaENBLEVBQWtCaGhLLEtBQUk0cUgsR0FBUUEsRUFBSzNzSCxPQUNuQ0csT0FBT3NULEtBQUtzdkosSUFDRjdnSyxTQUFRLENBQUNsQyxFQUFNUCxLQUN6QixNQUFNaUIsRUFBUSxTQUFPdW1ILG9CQUFvQmpuSCxHQUN6QyxHQUE2QixNQUF6QjZCLEtBQUsrakssY0FBY25tSyxHQUFZLENBQy9CLE1BQU1rdUgsR0FBWSxFQUNsQjlySCxLQUFLK2pLLGNBQWNubUssR0FBSyxDQUNwQnVqSyxhQUFjLEdBQUdoakssYUFDakJtQyxTQUFVLGdCQUFLLElBQU0sb0JBQVV6QixHQUFPeUIsU0FBU3dySCxNQUd2RCxNQUFNazRDLEVBQWVoa0ssS0FBSytqSyxjQUFjbm1LLEdBQUcwQyxTQUNyQ2tzSCxFQUFXcDBHLE1BQU1zdkQsUUFBUXc1RixHQUMzQkEsRUFBa0J0akssR0FBRzRwRSxPQUNyQjA1RixFQUFrQi9pSyxHQUNOLE1BQVpxdUgsR0FHSixnQkFBSyxLQUNELElBQUlsdkMsRUFDSixNQUFNMm1GLEVBQWtCLGNBQUksY0FBSWprSyxLQUFLaEMsRUFBR2dtSyxHQUFleDNDLEdBRW5EbHZDLEVBREF0OUUsS0FBSzhqSyxZQUNNLGNBQUksY0FBSTlqSyxLQUFLL0IsRUFBRyxjQUFJdXVILEVBQVUsY0FBSXkzQyxFQUFpQmprSyxLQUFLaEMsS0FBTWEsR0FHOUQsY0FBSSxjQUFJbUIsS0FBSy9CLEVBQUdnbUssR0FBa0JwbEssR0FFakRtbEssRUFBYWprSCxPQUFPa2tILEdBQ3BCcGxLLEVBQU1raEQsT0FBT3U5QixTQUdyQnQ5RSxLQUFLd2hLLHNCQUVUN3ZKLFVBQ0kzUixLQUFLaEMsRUFBRTJULFVBQ21CLE1BQXRCM1IsS0FBSytqSyxlQUNMLGtCQUFRL2pLLEtBQUsrakssY0FBYzdqSyxLQUFJZzNFLEdBQUtBLEVBQUU1MkUsWUFROUM0akssWUFBWUwsR0FDUjdqSyxLQUFLNmpLLFNBQVdBLEVBRXBCLG1CQUVJLE1BQU8sT0FBTzdqSyxLQUFLMGhLLGtCQUFrQjcrSixPQUFPN0MsS0FBSytqSyxjQUFjN2pLLEtBQUlnM0UsSUFBSyxDQUFHLzRFLEtBQU0rNEUsRUFBRWlxRixhQUFjMzVGLE9BQVEwUCxFQUFFNTJFLGNBRS9HLGlCQUFpQnFoSyxHQUNiQSxRQUFxQjNoSyxLQUFLNmhLLGtCQUFrQkYsR0FFNUMzaEssS0FBSytqSyxjQUFnQnBDLEVBQWF6aEssS0FBSWczRSxJQUFLLENBQUdpcUYsYUFBY2pxRixFQUFFLzRFLEtBQU1tQyxTQUFVNDJFLEVBQUUxUCxPQUFPbG5FLFNBRHJFLFdBR3RCd2hLLFlBQ0ksTUFBTyxDQUNILGFBQWdCOWhLLEtBQUs2Z0ssYUFDckIsU0FBWTdnSyxLQUFLNmpLLFNBQ2pCLFlBQWU3akssS0FBSzhqSyxhQUk1QixrQkFBa0IvQixFQUFLMXdCLEdBQ25CLE9BQU8sSUFBSTB3QixFQUFJMXdCLEVBQXFCLGFBQUdBLEVBQWlCLFNBQUdBLEVBQW9CLGNBSXZGdXlCLEVBQWtCNUIsVUFBWSxXQUM5Qix3QkFBYzRCLEk7Ozs7K0RDMUdkOzs7Ozs7Ozs7Ozs7Ozs7OztBQXFCTyxNQUFNTyxVQUFrQixlQWUzQkMsU0FBU3o0SixFQUFHMDRKLEdBQWEsRUFBT2p6QyxHQUM1QixNQUFNLE1BQUV2eUgsRUFBSyxNQUFFMnVILEdBQVV4dEgsS0FBS3NrSyxpQkFBaUIzNEosRUFBR3lsSCxHQUNsRCxHQUFlLE1BQVhBLEVBQWlCLENBQ2pCLE1BQU1tekMsRUFBWW56QyxFQUFRbHhILEtBQUlnM0UsSUFBSyxDQUFHLzRFLEtBQU0rNEUsRUFBRS80RSxLQUFNcXBFLE9BQVFnbUQsRUFBTXQyQyxFQUFFLzRFLFVBQ3BFNkIsS0FBS2loSyxlQUFlc0QsUUFHcEJ2a0ssS0FBS2loSyxlQUFlenpDLEdBSXhCLE9BREEsa0JBQVFBLEdBQ0o2MkMsRUFDT3hsSyxHQUdQQSxFQUFNOFMsVUFDQyxNQU1mLGlCQUlJLE9BSHdCLE1BQXBCM1IsS0FBS21qSyxjQUNMbmpLLEtBQUttakssWUFBYyxHQUVoQm5qSyxLQUFLbWpLLFlBRWhCM0Isc0JBQ0l4aEssS0FBS21qSyxZQUFjbmpLLEtBQUt3a0ssV0FBYSxFQWV6Q0YsaUJBQWlCMzRKLEVBQUd5bEgsR0FDaEIsT0FBTyx3QkFBY3psSCxFQUFHeWxILEdBSzVCei9HLFVBQzRCLE1BQXBCM1IsS0FBS21qSyxhQUNMLGtCQUFRbmpLLEtBQUttakssYUFHckIsdUJBSUksT0FId0IsTUFBcEJuakssS0FBS21qSyxjQUNMbmpLLEtBQUttakssWUFBYyxHQUVoQixDQUNIaGxLLEtBQU0sT0FFTnFwRSxPQUFRLGlCQUFPeG5FLEtBQUttakssWUFBYSxVQUd6QyxtQkFDSSxNQUFNLElBQUk1OEosTUFBTSwyREFFcEIsaUJBQWlCbzdKLEdBQ2IsTUFBTSxJQUFJcDdKLE1BQ04sNERBQUd2RyxLQUFLeWtLLGtCQVNoQix3QkFBd0I5QyxHQUVwQixPQURBM2hLLEtBQUttakssbUJBQXFCeEIsRUFBYSxHQUFHbjZGLE9BQU8zK0QsUUFBUSxHQUNsRDg0SixFQUFhOS9KLE1BQU0sSUFHbEN2RCxPQUFPQyxlQUFlNGxLLEVBQVd4bEssT0FBTytsSyxZQUFhLENBQ2pEN2xLLE1BQVEyMkYsR0FDd0IsTUFBckJBLEVBQVM0dUUsVUFBaUQsTUFBN0I1dUUsRUFBUzh1RSxrQkFDZCxNQUEzQjl1RSxFQUFTeXJFLGtCOzs7OzJFQzNIckI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJPLE1BQU0wRCxFQXNDVCxXQUFXOUQsR0FDUCxPQUFPLElBQUksZUFBYUEsR0FpQjVCLGdCQUFnQkEsRUFBY2dELEVBQVVDLEdBQWMsR0FDbEQsT0FBTyxJQUFJLG9CQUFrQmpELEVBQWNnRCxFQUFVQyxHQXNCekQsZUFBZWpELEVBQWM1UixFQUFRLEdBQUk0VSxFQUFXLEVBQUt4eEosRUFBVSxLQUFNdXlKLEdBQVcsR0FDaEYsT0FBTyxJQUFJLG1CQUFpQi9ELEVBQWM1UixFQUFPNFUsRUFBVXh4SixFQUFTdXlKLEdBY3hFLFlBQVkvRCxFQUFlLEtBQU91QixFQUFRLEdBQUtDLEVBQVEsS0FBT2h3SixFQUFVLE1BQ3BFLE9BQU8sSUFBSSxnQkFBY3d1SixFQUFjdUIsRUFBT0MsRUFBT2h3SixHQWN6RCxnQkFBZ0J3dUosRUFBZSxLQUFNQyxFQUFNLElBQUt6dUosRUFBVSxNQUN0RCxPQUFPLElBQUksb0JBQWtCd3VKLEVBQWNDLEVBQUt6dUosR0FlcEQsY0FBY3d1SixFQUFlLEtBQU91QixFQUFRLEdBQUtDLEVBQVEsS0FBT2h3SixFQUFVLEtBQU00OEksRUFBUSxHQUNwRixPQUFPLElBQUksa0JBQWdCNFIsRUFBY3VCLEVBQU9DLEVBQU9od0osRUFBUzQ4SSxHQWtCcEUsZUFBZTRSLEVBQWNxQixFQUEwQixJQUNuRCxPQUFPLElBQUksbUJBQWlCckIsRUFBY3FCLE07Ozs7c0VDeEtsRDs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE0Qk8sTUFBTTJDLFVBQXlCLFlBQ2xDaGxLLFlBQVlnaEssRUFBYzVSLEVBQVEsR0FBSzRVLEVBQVcsRUFBS3h4SixFQUFVLEtBQU11eUosR0FBVyxHQWE5RSxHQVpBbi9KLFFBQ0F6RixLQUFLNmdLLGFBQWVBLEVBQ3BCN2dLLEtBQUtpdkosTUFBUUEsRUFDYmp2SixLQUFLNmpLLFNBQVdBLEVBQ2hCN2pLLEtBQUtxUyxRQUFVQSxFQUNmclMsS0FBSzhrSyx1QkFBeUIsR0FDOUI5a0ssS0FBSytrSyxtQkFBcUIsR0FDMUIva0ssS0FBS2dsSyxxQkFBdUIsR0FDNUJobEssS0FBSzRrSyxTQUFXQSxFQUNELE1BQVh2eUosSUFDQXJTLEtBQUtxUyxRQUFVLFNBQU91ZSxRQUFRdmUsV0FFZCxNQUFoQnd1SixFQUNBLE1BQU0sSUFBSXQ2SixNQUFNLHNEQUd4QjA2SixlQUFlQyxJQUNXOW9KLE1BQU1zdkQsUUFBUXc1RixHQUNoQ0EsRUFBa0JoaEssS0FBSTRxSCxHQUFRQSxFQUFLM3NILE9BQ25DRyxPQUFPc1QsS0FBS3N2SixJQUNGN2dLLFNBQVEsQ0FBQ2xDLEVBQU1QLEtBQ3pCLE1BQU1pQixFQUFRLFNBQU91bUgsb0JBQW9Cam5ILEdBQ25DMnRILEdBQVksRUFDb0IsTUFBbEM5ckgsS0FBSzhrSyx1QkFBdUJsbkssS0FDNUJvQyxLQUFLOGtLLHVCQUF1QmxuSyxHQUFLLENBQzdCdWpLLGFBQWMsR0FBR2hqSyxRQUNqQm1DLFNBQVUsZ0JBQUssSUFBTSxvQkFBVXpCLEdBQU95QixTQUFTd3JILE9BR3JCLE1BQTlCOXJILEtBQUsra0ssbUJBQW1Cbm5LLEtBQ3hCb0MsS0FBSytrSyxtQkFBbUJubkssR0FBSyxDQUN6QnVqSyxhQUFjLEdBQUdoakssYUFDakJtQyxTQUFVLGdCQUFLLElBQU0sb0JBQVV6QixHQUFPeUIsU0FBU3dySCxPQUduQixNQUFoQzlySCxLQUFLZ2xLLHFCQUFxQnBuSyxJQUFjb0MsS0FBSzRrSyxXQUM3QzVrSyxLQUFLZ2xLLHFCQUFxQnBuSyxHQUFLLENBQzNCdWpLLGFBQWMsR0FBR2hqSyxPQUNqQm1DLFNBQVUsZ0JBQUssSUFBTSxvQkFBVXpCLEdBQU95QixTQUFTd3JILE9BR3ZELE1BQU1VLEVBQVdwMEcsTUFBTXN2RCxRQUFRdzVGLEdBQzNCQSxFQUFrQnRqSyxHQUFHNHBFLE9BQ3JCMDVGLEVBQWtCL2lLLEdBQ3RCLEdBQWdCLE1BQVpxdUgsRUFDQSxPQUVKLE1BQU15NEMsRUFBd0JqbEssS0FBSzhrSyx1QkFBdUJsbkssR0FBRzBDLFNBQ3ZEeWtLLEVBQXFCL2tLLEtBQUsra0ssbUJBQW1Cbm5LLEdBQUcwQyxTQUN0RCxnQkFBSyxLQUNELE1BQU00a0ssRUFBMkIsY0FBSSxjQUFJRCxFQUF1QmpsSyxLQUFLaXZKLE9BQVEsY0FBSSxpQkFBT3ppQyxHQUFXLEVBQUl4c0gsS0FBS2l2SixRQUM1RyxHQUFJanZKLEtBQUs0a0ssU0FBVSxDQUNmLE1BQU1PLEVBQXNCbmxLLEtBQUtnbEsscUJBQXFCcG5LLEdBQUcwQyxTQUVuRDhrSyxFQUF5QixjQUFJLGNBQUlELEVBQXFCbmxLLEtBQUtpdkosT0FBUSxjQUFJemlDLEVBQVUsRUFBSXhzSCxLQUFLaXZKLFFBQzFGb1csRUFBbUIsY0FBSSxjQUFJNzRDLEVBQVV4c0gsS0FBSzZnSyxjQUFlLGVBQUssY0FBSXFFLEVBQTBCLGNBQUksaUJBQU9FLEdBQXlCcGxLLEtBQUtxUyxZQUNySWl6SixFQUF3QixjQUFJLGNBQUlQLEVBQW9CL2tLLEtBQUs2akssVUFBV3dCLEdBQzFFSixFQUFzQmxsSCxPQUFPbWxILEdBQzdCQyxFQUFvQnBsSCxPQUFPcWxILEdBQzNCTCxFQUFtQmhsSCxPQUFPdWxILEdBQzFCLE1BQU1ob0YsRUFBVyxjQUFJeitFLEVBQU95bUssR0FDNUJ6bUssRUFBTWtoRCxPQUFPdTlCLE9BRVosQ0FFRCxNQUFNNG5GLEVBQTJCLGNBQUksY0FBSUQsRUFBdUJqbEssS0FBS2l2SixPQUFRLGNBQUksaUJBQU96aUMsR0FBVyxFQUFJeHNILEtBQUtpdkosUUFDdEdxVyxFQUF3QixjQUFJLGNBQUlQLEVBQW9CL2tLLEtBQUs2akssVUFBVyxjQUFJLGNBQUlyM0MsRUFBVXhzSCxLQUFLNmdLLGNBQWUsZUFBSyxjQUFJcUUsRUFBMEJsbEssS0FBS3FTLFlBQ3hKNHlKLEVBQXNCbGxILE9BQU9tbEgsR0FDN0JILEVBQW1CaGxILE9BQU91bEgsR0FDMUIsTUFBTWhvRixFQUFXLGNBQUl6K0UsRUFBT3ltSyxHQUM1QnptSyxFQUFNa2hELE9BQU91OUIsVUFJekJ0OUUsS0FBS3doSyxzQkFFVDd2SixVQUN1QyxNQUEvQjNSLEtBQUs4a0ssd0JBQ0wsa0JBQVE5a0ssS0FBSzhrSyx1QkFBdUI1a0ssS0FBSWczRSxHQUFLQSxFQUFFNTJFLFlBRWxCLE1BQTdCTixLQUFLZ2xLLHNCQUFnQ2hsSyxLQUFLNGtLLFVBQzFDLGtCQUFRNWtLLEtBQUtnbEsscUJBQXFCOWtLLEtBQUlnM0UsR0FBS0EsRUFBRTUyRSxZQUVsQixNQUEzQk4sS0FBSytrSyxvQkFDTCxrQkFBUS9rSyxLQUFLK2tLLG1CQUFtQjdrSyxLQUFJZzNFLEdBQUtBLEVBQUU1MkUsWUFHbkQsbUJBRUksTUFBTW1oSyxFQUFZLElBQUl6aEssS0FBSzhrSywwQkFBMkI5a0ssS0FBSytrSyxvQkFJM0QsT0FISS9rSyxLQUFLNGtLLFVBQ0xuRCxFQUFVbGhLLFFBQVFQLEtBQUtnbEssc0JBRXBCLE9BQU9obEssS0FBSzBoSyxrQkFBa0I3K0osT0FBTzQrSixFQUFVdmhLLEtBQUlnM0UsSUFBSyxDQUFHLzRFLEtBQU0rNEUsRUFBRWlxRixhQUFjMzVGLE9BQVEwUCxFQUFFNTJFLGNBRXRHLGlCQUFpQnFoSyxHQUNiQSxRQUFxQjNoSyxLQUFLNmhLLGtCQUFrQkYsR0FDNUMsTUFBTUMsRUFBZ0I1aEssS0FBSzRrSyxTQUFXakQsRUFBYWpnSyxPQUFTLEVBQUlpZ0ssRUFBYWpnSyxPQUFTLEVBQ2hGb3FILEdBQVksRUFDbEI5ckgsS0FBSzhrSyx1QkFDRG5ELEVBQWE5L0osTUFBTSxFQUFHKy9KLEdBQWUxaEssS0FBSWczRSxJQUFLLENBQzFDaXFGLGFBQWNqcUYsRUFBRS80RSxLQUNoQm1DLFNBQVU0MkUsRUFBRTFQLE9BQU9sbkUsU0FBU3dySCxPQUVwQzlySCxLQUFLK2tLLG1CQUNEcEQsRUFBYTkvSixNQUFNKy9KLEVBQStCLEVBQWhCQSxHQUM3QjFoSyxLQUFJZzNFLElBQUssQ0FDVmlxRixhQUFjanFGLEVBQUUvNEUsS0FDaEJtQyxTQUFVNDJFLEVBQUUxUCxPQUFPbG5FLFNBQVN3ckgsT0FFaEM5ckgsS0FBSzRrSyxXQUNMNWtLLEtBQUtnbEsscUJBQ0RyRCxFQUFhOS9KLE1BQXNCLEVBQWhCKy9KLEVBQW1DLEVBQWhCQSxHQUNqQzFoSyxLQUFJZzNFLElBQUssQ0FDVmlxRixhQUFjanFGLEVBQUUvNEUsS0FDaEJtQyxTQUFVNDJFLEVBQUUxUCxPQUFPbG5FLFNBQVN3ckgsUUFJNUNnMkMsWUFDSSxNQUFPLENBQ0gsYUFBZ0I5aEssS0FBSzZnSyxhQUNyQixNQUFTN2dLLEtBQUtpdkosTUFDZCxTQUFZanZKLEtBQUs2akssU0FDakIsUUFBVzdqSyxLQUFLcVMsUUFDaEIsU0FBWXJTLEtBQUs0a0ssVUFJekIsa0JBQWtCN0MsRUFBSzF3QixHQUNuQixPQUFPLElBQUkwd0IsRUFBSTF3QixFQUFxQixhQUFHQSxFQUFjLE1BQUdBLEVBQWlCLFNBQUdBLEVBQWdCLFFBQUdBLEVBQWlCLFdBSXhId3pCLEVBQWlCN0MsVUFBWSxVQUM3Qix3QkFBYzZDLEk7Ozs7a0VDcktkOzs7Ozs7Ozs7Ozs7Ozs7OztBQXdCTyxNQUFNVSxVQUFxQixZQUM5QjFsSyxZQUFZZ2hLLEdBQ1JwN0osUUFDQXpGLEtBQUs2Z0ssYUFBZUEsRUFDcEI3Z0ssS0FBS3dsSyxnQkFBZ0IzRSxHQUV6QkksZUFBZUMsSUFDTTlvSixNQUFNc3ZELFFBQVF3NUYsR0FDM0JBLEVBQWtCaGhLLEtBQUlnM0UsR0FBS0EsRUFBRS80RSxPQUM3QkcsT0FBT3NULEtBQUtzdkosSUFDUDdnSyxTQUFRLENBQUNsQyxFQUFNUCxLQUNwQixNQUFNNHVILEVBQVdwMEcsTUFBTXN2RCxRQUFRdzVGLEdBQzNCQSxFQUFrQnRqSyxHQUFHNHBFLE9BQ3JCMDVGLEVBQWtCL2lLLEdBQ3RCLEdBQWdCLE1BQVpxdUgsRUFDQSxPQUVKLE1BQU0zdEgsRUFBUSxTQUFPdW1ILG9CQUFvQmpuSCxHQUN6QyxnQkFBSyxLQUNELE1BQU1tL0UsRUFBVyxjQUFJLGNBQUl0OUUsS0FBSy9CLEVBQUd1dUgsR0FBVzN0SCxHQUM1Q0EsRUFBTWtoRCxPQUFPdTlCLFNBR3JCdDlFLEtBQUt3aEssc0JBS1RnRSxnQkFBZ0IzRSxHQUNaN2dLLEtBQUs2Z0ssYUFBZUEsRUFDTixNQUFWN2dLLEtBQUsvQixHQUNMK0IsS0FBSy9CLEVBQUUwVCxVQUVYM1IsS0FBSy9CLEVBQUksZUFBSyxrQkFBUTRpSyxJQUUxQmx2SixVQUNJM1IsS0FBSy9CLEVBQUUwVCxVQUVYLG1CQUNJLE1BQU8sT0FBTzNSLEtBQUswaEssa0JBRXZCLGlCQUFpQkMsR0FFYixHQUE0QixLQUQ1QkEsUUFBcUIzaEssS0FBSzZoSyxrQkFBa0JGLElBQzNCamdLLE9BQ2IsTUFBTSxJQUFJNkUsTUFBTSxpREFHeEJ1N0osWUFDSSxNQUFPLENBQUUsYUFBZ0I5aEssS0FBSzZnSyxjQUdsQyxrQkFBa0JrQixFQUFLMXdCLEdBQ25CLE9BQU8sSUFBSTB3QixFQUFJMXdCLEVBQXFCLGVBSTVDazBCLEVBQWF2RCxVQUFZLE1BQ3pCLHdCQUFjdUQsSTs7OztxRUNqRmQ7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUJPLE1BQU1FLEVBQ1R4d0UsTUFBTXhxRCxFQUFNa29ELEdBQ1IsT0FBT3NDLE1BQU14cUQsRUFBTWtvRCxHQUV2QnhwRixNQUNJLE9BQU95OEYsWUFBWXo4RixNQUV2QnU4SixPQUFPcC9ELEVBQU1xL0QsR0FDVCxHQUFpQixVQUFiQSxHQUFxQyxTQUFiQSxFQUN4QixNQUFNLElBQUlwL0osTUFBTSxrREFBa0RvL0osS0FLdEUsT0FId0IsTUFBcEIzbEssS0FBSzRsSyxjQUNMNWxLLEtBQUs0bEssWUFBYyxJQUFJQyxhQUVwQjdsSyxLQUFLNGxLLFlBQVlGLE9BQU9wL0QsR0FFbkNyOEYsT0FBTzJoSCxFQUFPKzVDLEdBQ1YsT0FBTyxJQUFJaG1ELFlBQVlnbUQsR0FBVTE3SixPQUFPMmhILElBR2hELEdBQUksZ0JBQU1udEgsSUFBSSxjQUFlLENBQ3pCLGdCQUFNa3dILFlBQVksVUFBVyxJQUFJODJDLEdBRWpDLElBQ0ksNEJBQTBCSyxnQkFBZ0Isc0JBQW9CeHlDLFdBQVksSUFBSSw4QkFFbEYsTUFBT3h0QixJQUdQLElBQ0ksNEJBQTBCZ2dFLGdCQUFnQixtQkFBaUJ4eUMsV0FBWSxJQUFJLDJCQUUvRSxNQUFPeHRCLE87Ozs7a0lDckRYOzs7Ozs7Ozs7Ozs7Ozs7O0dBa0JPLE1BQU1pZ0UsRUFBZSxDQUV4QkMsWUFBYSxJQUFNLG1CQUFRLElBRS9CLElBQUlDLEVBR0csU0FBU0MsSUFDWkQsRUFBYyxLQUVYLFNBQVNFLEVBQWVDLEdBQzNCSCxFQUFjRyxFQUVYLFNBQVNDLElBQ1osT0FBT0osRUFFSixNQUFNSyxFQUNUem1LLGNBRUlHLEtBQUt1bUssS0FBTyxhQUFRLEdBR3BCdm1LLEtBQUs0bEssWUFBYyxJQUFJNWxLLEtBQUt1bUssS0FBS1YsWUFFckM1d0UsTUFBTXhxRCxFQUFNKzdILEdBQ1IsT0FBMEIsTUFBdEIsZ0JBQU0xL0osT0FBT211RixNQUNOLGdCQUFNbnVGLE9BQU9tdUYsTUFBTXhxRCxFQUFNKzdILElBRWpCLE1BQWZQLElBQ0FBLEVBQWNGLEVBQWFDLGVBRXhCQyxFQUFZeDdILEVBQU0rN0gsSUFFN0JyOUosTUFDSSxNQUFNbUksRUFBTyt4RixFQUFRb2pFLFNBQ3JCLE9BQWlCLElBQVZuMUosRUFBSyxHQUFZQSxFQUFLLEdBQUssSUFFdENvMEosT0FBT3AvRCxFQUFNcS9ELEdBQ1QsR0FBaUIsVUFBYkEsR0FBcUMsU0FBYkEsRUFDeEIsTUFBTSxJQUFJcC9KLE1BQU0sc0RBQXNEby9KLEtBRTFFLE9BQU8zbEssS0FBSzRsSyxZQUFZRixPQUFPcC9ELEdBRW5DcjhGLE9BQU8yaEgsRUFBTys1QyxHQUNWLE9BQXFCLElBQWpCLzVDLEVBQU1scUgsT0FDQyxHQUVKLElBQUkxQixLQUFLdW1LLEtBQUs1bUQsWUFBWWdtRCxHQUFVMTdKLE9BQU8yaEgsSUFHdEQsZ0JBQU1udEgsSUFBSSxZQUNWLGdCQUFNa3dILFlBQVksT0FBUSxJQUFJMjNDLEk7Ozs7aUdDckVsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQk8sTUFBTUksRUFDVDdtSyxZQUFZOG1LLEVBQWNDLEdBQ3RCNW1LLEtBQUsybUssYUFBZUEsRUFDcEIzbUssS0FBSzRtSyxPQUFTQSxFQUNBLE1BQVZBLElBQ0E1bUssS0FBSzRtSyxPQUFTLElBQUlDLEdBRzFCdjhDLGNBQWM5d0YsRUFBWXRyQixFQUFRdkMsR0FDOUIsSUFBSTQ5RyxFQUNKLE1BQU11OUMsRUFBc0IsS0FDeEJ2OUMsRUFBVTU5RyxLQUVkLElBQUlvN0osRUFDSixNQUFNOTlKLEVBQVEsUUFDZCxHQUFJakosS0FBSzJtSyxhQUFhajdKLGlCQUNsQnE3SixFQUFRL21LLEtBQUsybUssYUFBYXIxSixLQUFLdzFKLE9BRTlCLENBQ0RBLElBQ0EsSUFBSyxNQUFNdjdKLEtBQVVnK0csRUFDakJoK0csRUFBT29ELFdBRVhvNEosRUFBUXA5SixRQUFRQyxRQUFRLENBQUV5QyxTQUFVLFFBQWFwRCxJQUVyRCxHQUFJLGdCQUFNM0MsUUFBUSxnQ0FDZCxJQUFLLElBQUkxSSxFQUFJLEVBQUdBLEVBQUkyckgsRUFBUTduSCxPQUFROUQsSUFBSyxDQUNyQyxNQUFNMk4sRUFBU2crRyxFQUFRM3JILEdBR3ZCMk4sRUFBTzFDLE9BQU9zc0YsTUFBSzZ4RSxJQUNmQyxFQUEwQkQsRUFBWXo3SixFQUFPcEosTUFBT3EzQixNQWFoRSxNQVRzQixDQUNsQkEsYUFDQSt2RixVQUNBcjdHLFNBQ0E4OEcsT0FBUSs3QyxFQUFNNXhFLE1BQUsreEUsR0FBVUEsRUFBTzc2SixXQUNwQzQrRyxVQUFXODdDLEVBQU01eEUsTUFBSyt4RSxHQUF3QyxNQUE5QkEsRUFBT0Msb0JBQ25DRCxFQUFPQyxzQkFDUCxNQUlaNThDLGlCQUFpQkYsR0FDYixNQUFNLFdBQUU3d0YsRUFBVSxRQUFFK3ZGLEVBQU8sT0FBRXlCLEVBQU0sT0FBRTk4RyxFQUFNLFVBQUUrOEcsR0FBY1osRUFDM0RkLEVBQVFscEgsU0FBUTZJLElBQ1pTLFFBQVFZLElBQUksQ0FBQ3JCLEVBQU9MLE9BQVFtaUgsRUFBUUMsSUFBWTkxQixNQUFLaXlFLElBQ2pEcG5LLEtBQUs0bUssT0FBT3I4QyxpQkFBaUIvd0YsRUFBWXR3QixFQUFRaytKLEVBQWUsR0FBSUEsRUFBZSxHQUFJbDVKLEVBQVFrNUosRUFBZSxXQUt2SCxTQUFTSCxFQUEwQmw5SixFQUFNNUgsRUFBT3EzQixHQUNuRCxHQUFjLFlBQVZyM0IsRUFFQSxPQUFPLEVBRVgsSUFBSyxJQUFJdkUsRUFBSSxFQUFHQSxFQUFJbU0sRUFBS3JJLE9BQVE5RCxJQUFLLENBQ2xDLE1BQU1zTixFQUFNbkIsRUFBS25NLEdBQ2pCLEdBQUltMEMsTUFBTTdtQyxLQUFTeW1DLFNBQVN6bUMsR0FHeEIsT0FEQXNJLFFBQVEvRSxLQUFLLFNBQVN2RCx1QkFBeUJzdUIsT0FDeEMsRUFHZixPQUFPLEVBRUosTUFBTXF0SSxFQUNUdDhDLGlCQUFpQnBzSCxFQUFNK0ssRUFBUWEsRUFBTWloSCxFQUFROThHLEVBQVErOEcsR0FDakQsTUFBTTM1RyxFQUF5QixpQkFBWDA1RyxFQUFzQixXQUFjLEdBQUdBLE1BQVksR0FDbkVBLEVBQWMsTUFDWnE4QyxFQUFhLFdBQWNscEssRUFBTSxJQUNqQytELEVBQU9nSCxFQUFPaEgsS0FDZHNJLEVBQU90QixFQUFPc0IsS0FDZGhKLEVBQVEsV0FBYzBILEVBQU8xSCxNQUFNNjNELFdBQVksSUFDckQsSUFBSWl1RyxFQUF5QixHQUM3QixJQUFLLE1BQU1ucEssS0FBUStQLEVBQVEsQ0FDdkIsTUFBTUcsRUFBUUgsRUFBTy9QLEdBQ3JCLEdBQWEsTUFBVGtRLEVBQWUsQ0FHZixNQUFNd1EsRUFBYXhRLEVBQU03TSxPQUFTMEgsRUFBTzFILE1BQ25DbXJDLEVBQVk5dEIsRUFBV25kLE9BQzdCNGxLLEdBQ0ksR0FBR25wSyxNQUFTd3VDLE1BQWNBLEVBQVksRUFBSTl0QixFQUFhLE9BR25FckwsUUFBUXNELElBQUksS0FBS3V3SixRQUFpQi8xSixRQUFXcFAsTUFBU1YsUUFBWWdKLFFBQVc4OEosUUFBNkJyOEMsSUFBYSxtQkFBb0IsWUFBYSxhQUFjLGdCQUFpQixlQUFnQix1Qjs7OzttR0M1Ry9NOzs7Ozs7Ozs7Ozs7Ozs7O0dBdUJPLE1BQU1zOEMsRUFZVDlDLGVBQ0ksT0FBT3prSyxLQUFLSCxZQUNQbWlLLFVBV1Qsa0JBQWtCRCxFQUFLMXdCLEdBQ25CLE9BQU8sSUFBSTB3QixFQUFJMXdCLElBVWhCLE1BQU1tMkIsRUFDVDNuSyxjQUNJRyxLQUFLeW5LLGFBQWUsR0FLeEIsZ0JBSUksT0FIaUMsTUFBN0JELEVBQWlCaHlFLFdBQ2pCZ3lFLEVBQWlCaHlFLFNBQVcsSUFBSWd5RSxHQUU3QkEsRUFBaUJoeUUsU0FLNUIsZ0JBQWdCdXNFLEdBQ1p5RixFQUFpQkUsU0FBU0QsYUFBYTFGLEVBQUlDLFdBQ3ZDLENBQUNELEVBQUtBLEVBQUk0RixhQTJCZixTQUFTQyxFQUFjN0YsR0FDMUIsaUJBQXdCLE1BQWpCQSxFQUFJQyxXQUFtQixJQUFNLGdGQUVwQyxpQkFBZ0MsaUJBQWxCRCxFQUFJQyxXQUF3QixJQUFNLDZEQUNyQ0QsRUFBSUMsWUFDZixpQkFBT0QsRUFBSUMsVUFBVXRnSyxPQUFTLEdBQUcsSUFBTSxzRkFFdkM4bEssRUFBaUJLLFNBQVM5RixLOzs7O2tHQy9HOUI7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5Qk8sU0FBUytGLEVBQXFCQyxFQUFNNTZDLEVBQUkxa0csR0FHM0MsTUFBTXUvSSxFQUFlLEdBQ2ZDLEVBQWEsR0FDbkIsSUFBSyxJQUFJcnFLLEVBQUksRUFBR0EsRUFBSXV2SCxFQUFHenJILE9BQVE5RCxJQUMzQm9xSyxFQUFhNzZDLEVBQUd2dkgsR0FBRytKLEtBQU0sRUFFN0IsSUFBSyxJQUFJL0osRUFBSSxFQUFHQSxFQUFJbXFLLEVBQUtybUssT0FBUTlELElBQUssQ0FDbEMsTUFBTTJsRyxFQUFPd2tFLEVBQUtucUssR0FDWnNxSyxFQUFhM2tFLEVBQUtyMUYsT0FDeEIsSUFBSyxNQUFNcTlHLEtBQWEyOEMsRUFBWSxDQUNoQyxNQUFNNzVKLEVBQVE2NUosRUFBVzM4QyxHQUN6QixJQUFJNDhDLEdBQWdCLEVBQ3BCLElBQUssSUFBSXg2RyxFQUFJLEVBQUdBLEVBQUl3L0QsRUFBR3pySCxPQUFRaXNELElBQzNCLEdBQUlxNkcsRUFBYTM1SixFQUFNMUcsSUFBSyxDQUN4QjQ3RixFQUFLZ21CLFFBQVFscEgsU0FBUWtMLEdBQVV5OEosRUFBYXo4SixFQUFPNUQsS0FBTSxJQUN6RHdnSyxHQUFnQixFQUNoQkYsRUFBVzFrRSxFQUFLNTdGLEtBQU0sRUFDdEIsTUFHUixHQUFJd2dLLEVBQ0EsT0FLWixNQUFNQyxFQUFpQixHQUN2QkEsRUFBZTMvSSxFQUFFOWdCLEtBQU0sRUFDdkIsTUFBTTBnSyxFQUFXLEdBQ2pCLElBQUssSUFBSXpxSyxFQUFJbXFLLEVBQUtybUssT0FBUyxFQUFHOUQsR0FBSyxFQUFHQSxJQUFLLENBQ3ZDLE1BQU0ybEcsRUFBT3drRSxFQUFLbnFLLEdBQ1pzcUssRUFBYTNrRSxFQUFLcjFGLE9BRXhCLElBQUssSUFBSXkvQyxFQUFJLEVBQUdBLEVBQUk0MUMsRUFBS2dtQixRQUFRN25ILE9BQVFpc0QsSUFDckMsR0FBSXk2RyxFQUFlN2tFLEVBQUtnbUIsUUFBUTU3RCxHQUFHaG1ELElBQUssQ0FDcEMsSUFBSyxNQUFNNGpILEtBQWEyOEMsRUFDcEJFLEVBQWVGLEVBQVczOEMsR0FBVzVqSCxLQUFNLEVBQzNDMGdLLEVBQVM5a0UsRUFBSzU3RixLQUFNLEVBRXhCLE9BS1osTUFBTTBsSCxFQUFlLEdBQ3JCLElBQUssSUFBSXp2SCxFQUFJLEVBQUdBLEVBQUltcUssRUFBS3JtSyxPQUFROUQsSUFBSyxDQUNsQyxNQUFNMmxHLEVBQU93a0UsRUFBS25xSyxHQUNsQixHQUFJcXFLLEVBQVcxa0UsRUFBSzU3RixLQUFPMGdLLEVBQVM5a0UsRUFBSzU3RixJQUFLLENBRTFDLE1BQU0yZ0ssRUFBZSxHQUNyQixJQUFLLE1BQU0vOEMsS0FBYWhvQixFQUFLcjFGLE9BQVEsQ0FDakMsTUFBTXE2SixFQUFZaGxFLEVBQUtyMUYsT0FBT3E5RyxHQUMxQnk4QyxFQUFhTyxFQUFVNWdLLE1BQ3ZCMmdLLEVBQWEvOEMsR0FBYWc5QyxHQUlsQyxNQUFNQyxFQUFhbHFLLE9BQU95aEQsT0FBTyxHQUFJd2pELEdBQ3JDaWxFLEVBQVd0NkosT0FBU282SixFQUNwQkUsRUFBV2ovQyxRQUFVaG1CLEVBQUtnbUIsUUFDMUI4RCxFQUFhOXNILEtBQUtpb0ssSUFHMUIsT0FBT243QyxFQVNKLFNBQVNvN0MsRUFBdUJDLEVBQThCcjdDLEVBQWNwRixFQUFNeDZHLEdBRXJGLElBQUssSUFBSTdQLEVBQUl5dkgsRUFBYTNySCxPQUFTLEVBQUc5RCxHQUFLLEVBQUdBLElBQUssQ0FDL0MsTUFBTTJsRyxFQUFPOHBCLEVBQWF6dkgsR0FDcEI2dUgsRUFBTSxHQVlaLEdBWEFscEIsRUFBS2dtQixRQUFRbHBILFNBQVFoQyxJQUNqQixNQUFNc3FLLEVBQWFELEVBQTZCcnFLLEVBQUVzSixJQUNoQyxNQUFkZ2hLLEVBQ0FsOEMsRUFBSWxzSCxLQUFLb29LLEdBS1RsOEMsRUFBSWxzSCxLQUFLLFNBR0ksTUFBakJnakcsRUFBS2lwQixTQUNMLE1BQU0sSUFBSWptSCxNQUNOLDREQUFPZzlGLEVBQUsvcEUsZUFHcEIsTUFBTW92SSxFQUFpQnJsRSxFQUFLaXBCLFNBQVNDLEdBQ3JDLElBQUssTUFBTWxCLEtBQWFob0IsRUFBS3IxRixPQUFRLENBQ2pDLEtBQU1xOUcsS0FBYXE5QyxHQUNmLE1BQU0sSUFBSXJpSyxNQUFNLGlDQUFpQ2dsSCxpQ0FDZmp0SCxPQUFPc1QsS0FBS2czSixPQUdsRCxNQUFNMy9GLEVBQUtnL0MsR0FBSyxJQUFNMmdELEVBQWVyOUMsT0FDckMsR0FBaUIsWUFBYnRpRCxFQUFHOW1FLE1BQ0gsTUFBTSxJQUFJb0UsTUFBTSw0QkFBNEJnOUYsRUFBSy9wRSxxQ0FDMUMreEYseUNBQWlEdGlELEVBQUc5bUUsVUFFL0QsTUFBTVEsRUFBSTRnRyxFQUFLcjFGLE9BQU9xOUcsR0FDdEIsSUFBSyxjQUFpQnRpRCxFQUFHem5FLE1BQU9tQixFQUFFbkIsT0FDOUIsTUFBTSxJQUFJK0UsTUFBTSw0QkFBNEJnOUYsRUFBSy9wRSxzQ0FDekMreEYsaUJBQXlCdGlELEVBQUd6bkUsd0RBQ0xtQixFQUFFbkIsVUFFckMsR0FBMEMsTUFBdENrbkssRUFBNkIvbEssRUFBRWdGLElBQy9CK2dLLEVBQTZCL2xLLEVBQUVnRixJQUFNc2hFLE1BRXBDLENBQ0QsTUFBTTQvRixFQUFjSCxFQUE2Qi9sSyxFQUFFZ0YsSUFDbkQrZ0ssRUFBNkIvbEssRUFBRWdGLElBQU04RixFQUFJbzdKLEVBQWE1L0YsR0FDdEQ0L0YsRUFBWWwzSixlOzs7O21LQ2hKNUI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNEJPLE1BQU1tM0osRUFDVGpwSyxZQUFZMkIsRUFBT1csRUFBT3FGLEdBSXRCLEdBSEF4SCxLQUFLbUMsTUFBUUEsRUFDYm5DLEtBQUt3QixNQUFRQSxFQUFNSyxRQUNuQjdCLEtBQUt3SyxLQUFPLGdCQUFtQmhKLEdBQ2pCLE1BQVZnRyxFQUFnQixDQUNoQixNQUFNbkksRUFBSW1JLEVBQU85RixPQUNqQixTQUFZckMsSUFBTVcsS0FBS3dLLE1BQU0sSUFBTSxxQkFBcUJuTCxxREFDMUJXLEtBQUt3SyxXQUV2QyxHQUFjLGNBQVZySSxFQUNBLE1BQU0sSUFBSW9FLE1BQU0sOEpBSXBCdkcsS0FBS3dILE9BQVNBLEdBQVUsb0JBQXVCckYsRUFBT25DLEtBQUt3SyxNQUMzRHhLLEtBQUtnZ0IsUUFBVSx5QkFBZXhlLEdBVWxDb0csSUFBSS9JLEtBQVVrcUssR0FDVSxJQUFoQkEsRUFBS3JuSyxTQUNMcW5LLEVBQU8sQ0FBQyxJQUVaLFNBQVlBLEVBQUtybkssU0FBVzFCLEtBQUtrQyxNQUFNLElBQU0sdUNBQXVDNm1LLEVBQUtybkssZ0NBQ2xFMUIsS0FBS2tDLFVBQzVCLE1BQU0rbEIsRUFBUWpvQixLQUFLcTJFLFdBQVcweUYsR0FDOUIvb0ssS0FBS3dILE9BQU95Z0IsR0FBU3BwQixFQVN6QkosT0FBT3NxSyxHQUNpQixJQUFoQkEsRUFBS3JuSyxTQUNMcW5LLEVBQU8sQ0FBQyxJQUVaLElBQUluckssRUFBSSxFQUNSLElBQUssTUFBTTRsRSxLQUFPdWxHLEVBQU0sQ0FDcEIsR0FBSXZsRyxFQUFNLEdBQUtBLEdBQU94akUsS0FBS3dCLE1BQU01RCxHQUFJLENBQ2pDLE1BQU02Z0gsRUFBTSxxQ0FBcUNzcUQscUJBQzNCL29LLEtBQUt3QixRQUMzQixNQUFNLElBQUkrRSxNQUFNazRHLEdBRXBCN2dILElBRUosSUFBSXFxQixFQUFROGdKLEVBQUtBLEVBQUtybkssT0FBUyxHQUMvQixJQUFLLElBQUk5RCxFQUFJLEVBQUdBLEVBQUltckssRUFBS3JuSyxPQUFTLElBQUs5RCxFQUNuQ3FxQixHQUFTam9CLEtBQUtnZ0IsUUFBUXBpQixHQUFLbXJLLEVBQUtuckssR0FFcEMsT0FBT29DLEtBQUt3SCxPQUFPeWdCLEdBRXZCb3VELFdBQVcweUYsR0FDUCxHQUFrQixJQUFkL29LLEtBQUtrQyxLQUNMLE9BQU8sRUFFTixHQUFrQixJQUFkbEMsS0FBS2tDLEtBQ1YsT0FBTzZtSyxFQUFLLEdBRWhCLElBQUk5Z0osRUFBUThnSixFQUFLQSxFQUFLcm5LLE9BQVMsR0FDL0IsSUFBSyxJQUFJOUQsRUFBSSxFQUFHQSxFQUFJbXJLLEVBQUtybkssT0FBUyxJQUFLOUQsRUFDbkNxcUIsR0FBU2pvQixLQUFLZ2dCLFFBQVFwaUIsR0FBS21ySyxFQUFLbnJLLEdBRXBDLE9BQU9xcUIsRUFFWG13RCxXQUFXbndELEdBQ1AsR0FBa0IsSUFBZGpvQixLQUFLa0MsS0FDTCxNQUFPLEdBRU4sR0FBa0IsSUFBZGxDLEtBQUtrQyxLQUNWLE1BQU8sQ0FBQytsQixHQUVaLE1BQU04Z0osRUFBTyxJQUFJM3dKLE1BQU1wWSxLQUFLd0IsTUFBTUUsUUFDbEMsSUFBSyxJQUFJOUQsRUFBSSxFQUFHQSxFQUFJbXJLLEVBQUtybkssT0FBUyxJQUFLOUQsRUFDbkNtckssRUFBS25ySyxHQUFLbUUsS0FBSzJZLE1BQU11TixFQUFRam9CLEtBQUtnZ0IsUUFBUXBpQixJQUMxQ3FxQixHQUFTOGdKLEVBQUtuckssR0FBS29DLEtBQUtnZ0IsUUFBUXBpQixHQUdwQyxPQURBbXJLLEVBQUtBLEVBQUtybkssT0FBUyxHQUFLdW1CLEVBQ2pCOGdKLEVBRVgsV0FDSSxPQUFPL29LLEtBQUt3QixNQUFNRSxPQU90QjBpSCxXQUNJLE9BQU80a0QsSUFBWXY5QyxXQUFXenJILEtBQUt3SCxPQUFReEgsS0FBS3dCLE1BQU94QixLQUFLbUMsUUFJcEUsSUFBSTZtSyxFQUFZLEtBRVoza0QsRUFBWSxLQUVaNGtELEVBQXVCLEtBVXBCLFNBQVNDLEVBQWlCL2dELEdBQzdCNmdELEVBQVk3Z0QsRUFPVCxTQUFTZ2hELEVBQWF4bEMsR0FDekJ0ZixFQUFZc2YsRUFNVCxTQUFTeWxDLEVBQXdCamhELEdBQ3BDOGdELEVBQXVCOWdELEVBZ0JwQixNQUFNa2hELEVBQ1R4cEssWUFBWTJCLEVBQU9XLEVBQU91RixFQUFRQyxHQUU5QjNILEtBQUsyc0gsTUFBTyxFQUNaM3NILEtBQUtzcEssb0JBQXFCLEVBQzFCdHBLLEtBQUt3QixNQUFRQSxFQUFNSyxRQUNuQjdCLEtBQUttQyxNQUFRQSxHQUFTLFVBQ3RCbkMsS0FBS3dLLEtBQU8sZ0JBQW1CaEosR0FDL0J4QixLQUFLZ2dCLFFBQVUseUJBQWV4ZSxHQUM5QnhCLEtBQUswSCxPQUFTQSxFQUNkMUgsS0FBSzJILEdBQUtBLEVBQ1YzSCxLQUFLdXBLLFNBQVl2cEssS0FBS2tDLEtBQU8sRUFBSWxDLEtBQUtrQyxLQUFLbTNELFdBQWEsU0FFNUQsV0FDSSxPQUFPcjVELEtBQUt3QixNQUFNRSxPQU90QixlQUNJLE1BQU1xSSxRQUFhL0osS0FBSzZJLE9BQ3hCLE9BQU93N0csRUFBVXI2RyxPQUFPaEssS0FBS3dCLE1BQU94QixLQUFLbUMsTUFBTzRILEdBTXBEZ0IsYUFDSSxPQUFPczVHLEVBQVVyNkcsT0FBT2hLLEtBQUt3QixNQUFPeEIsS0FBS21DLE1BQU9uQyxLQUFLMk8sWUFRekQsY0FDSSxNQUFNNUUsUUFBYS9KLEtBQUs2SSxPQUN4QixPQUFPLHdCQUFjN0ksS0FBS3dCLE1BQU91SSxFQUFxQixjQUFmL0osS0FBS21DLE9BUWhEcW5LLFlBQ0ksT0FBTyx3QkFBY3hwSyxLQUFLd0IsTUFBT3hCLEtBQUsyTyxXQUEyQixjQUFmM08sS0FBS21DLE9BUTNELGFBQ0luQyxLQUFLd2lCLGtCQUNMLE1BQU0zWixFQUFPbWdLLElBQVluL0osS0FBSzdKLEtBQUswSCxRQUNuQyxHQUFtQixXQUFmMUgsS0FBS21DLE1BQW9CLENBQ3pCLE1BQU15cEgsUUFBYy9pSCxFQUNwQixJQUNJLE9BQU8raUgsRUFBTTFySCxLQUFJd3lCLEdBQUssZUFBa0JBLEtBRTVDLE1BQU9vMUMsR0FDSCxNQUFNLElBQUl2aEUsTUFBTSxrR0FJeEIsT0FBT3NDLEVBUVg4RixXQUNJM08sS0FBS3dpQixrQkFDTCxNQUFNM1osRUFBT21nSyxJQUFZemdLLFNBQVN2SSxLQUFLMEgsUUFDdkMsR0FBbUIsV0FBZjFILEtBQUttQyxNQUNMLElBQ0ksT0FBTzBHLEVBQUszSSxLQUFJd3lCLEdBQUssZUFBa0JBLEtBRTNDLE1BQU9vMUMsR0FDSCxNQUFNLElBQUl2aEUsTUFBTSxpR0FJeEIsT0FBT3NDLEVBR1gsY0FDSTdJLEtBQUt3aUIsa0JBQ0wsTUFBTTNaLFFBQWFtZ0ssSUFBWW4vSixLQUFLN0osS0FBSzBILFFBQ3pDLE1BQW1CLFdBQWYxSCxLQUFLbUMsTUFDRTBHLEVBR0EsSUFBSTBKLFdBQVcxSixFQUFLbUIsUUFRbkMySCxVQUNRM1IsS0FBS3lwSyxhQUdUVCxJQUFZaDlDLGNBQWNoc0gsTUFDMUJBLEtBQUtzcEssb0JBQXFCLEdBRTlCLGlCQUNJLE9BQU90cEssS0FBS3NwSyxtQkFFaEI5bUosa0JBQ0ksR0FBSXhpQixLQUFLeXBLLFdBQ0wsTUFBTSxJQUFJbGpLLE1BQU0sdUJBV3hCcStGLE1BQU1pdkQsR0FBVSxHQUNaLE9BQU94dkMsRUFBVXpmLE1BQU01a0csS0FBTTZ6SixHQU1qQ3Z2QyxRQUVJLE9BREF0a0gsS0FBS3dpQixrQkFDRTZoRyxFQUFVQyxNQUFNdGtILE1BTzNCcTVELFNBQVN3NkYsR0FBVSxHQUNmLE1BQU05cEosRUFBTy9KLEtBQUsyTyxXQUNsQixPQUFPLHlCQUFlNUUsRUFBTS9KLEtBQUt3QixNQUFPeEIsS0FBS21DLE1BQU8weEosR0FFeER0eEgsS0FBS3BnQyxHQUVELE9BREFuQyxLQUFLd2lCLGtCQUNFNmhHLEVBQVU5aEYsS0FBS3ZpQyxLQUFNbUMsR0FFaEM3QixTQUFTd3JILEdBQVksRUFBTTN0SCxFQUFNZ0UsR0FFN0IsT0FEQW5DLEtBQUt3aUIsa0JBQ0V3bUosSUFBWW45QyxhQUFhN3JILEtBQU04ckgsRUFBVzN0SCxFQUFNZ0UsSUFjeEQsU0FBU3VuSyxJQUlaLE9BQU8sb0JBQVUsVUFBVSxJQUNoQkwsSUFoQmYvcUssT0FBT0MsZUFBZThxSyxFQUFRMXFLLE9BQU8rbEssWUFBYSxDQUM5QzdsSyxNQUFRMjJGLEtBTUtBLEdBQTZCLE1BQWpCQSxFQUFTM3NGLE1BQXFDLE1BQXJCMnNGLEVBQVM3bUYsVUFDdkIsTUFBNUI2bUYsRUFBU2h6RSxrQkFZckJrbkosSUFNTyxNQUFNQyxVQUFpQk4sRUFDMUJ4cEssWUFBWWd3RixFQUFjaThCLEVBQVczdEgsRUFBTXlySyxHQUN2Q25rSyxNQUFNb3FGLEVBQWFydUYsTUFBT3F1RixFQUFhMXRGLE1BQU8wdEYsRUFBYW5vRixPQUFRa2lLLEdBQ25FNXBLLEtBQUs4ckgsVUFBWUEsRUFDakI5ckgsS0FBSzdCLEtBQU9BLEVBVWhCNGhELE9BQU91OUIsR0FDSCxHQUFJQSxFQUFTbjdFLFFBQVVuQyxLQUFLbUMsTUFDeEIsTUFBTSxJQUFJb0UsTUFBTSwyQkFBMkIrMkUsRUFBU243RSw4QkFDN0JuQyxLQUFLbUMscUJBRWhDLElBQUssY0FBaUJtN0UsRUFBUzk3RSxNQUFPeEIsS0FBS3dCLE9BQ3ZDLE1BQU0sSUFBSStFLE1BQU0sMkJBQTJCKzJFLEVBQVM5N0UsOEJBQzdCeEIsS0FBS3dCLHFCQUVoQ3duSyxJQUFZaDlDLGNBQWNoc0gsTUFDMUJBLEtBQUswSCxPQUFTNDFFLEVBQVM1MUUsT0FDdkJzaEssSUFBWS9nSyxPQUFPakksS0FBTSxNQUU3QjJSLFVBQ0lxM0osSUFBWTk4QyxnQkFBZ0Jsc0gsTUFDNUJBLEtBQUtzcEssb0JBQXFCLEdBR2xDaHJLLE9BQU9DLGVBQWVvckssRUFBVWhySyxPQUFPK2xLLFlBQWEsQ0FDaEQ3bEssTUFBUTIyRixHQUNHQSxhQUFvQjZ6RSxHQUE2QixNQUFuQjd6RSxFQUFTejFDLFFBQzFDeTFDLEVBQVN6MUMsa0JBQWtCOHBILFk7Ozs7b0VDN1l2Qzs7Ozs7Ozs7Ozs7Ozs7OztHQXVCTyxTQUFTQyxFQUFlLy9KLEVBQU12SSxFQUFPVyxFQUFPMHhKLEdBQy9DLE1BQU03ekksRUFBVSx5QkFBZXhlLEdBQ3pCdW9LLEVBYVYsU0FBaUNoZ0ssRUFBTXZJLEVBQU9XLEVBQU82ZCxHQUNqRCxNQUFNM2dCLEVBQUksd0JBQWNtQyxHQUNsQjRrQyxFQUFVcG1CLEVBQVFBLEVBQVF0ZSxPQUFTLEdBQ25DcW9LLEVBQVksSUFBSTN4SixNQUFNZ3VCLEdBQVN1SCxLQUFLLEdBQ3BDenJDLEVBQU9WLEVBQU1FLE9BQ2Jzb0ssRUFBMkIsY0FBVjduSyxFQUF3QjhuSyxFQUFvQmxnSyxHQUFRQSxFQUMzRSxHQUFJN0gsRUFBTyxFQUNQLElBQUssSUFBSXVjLEVBQU0sRUFBR0EsRUFBTXBmLEVBQUkrbUMsRUFBUzNuQixJQUFPLENBQ3hDLE1BQU1naUIsRUFBU2hpQixFQUFNMm5CLEVBQ3JCLElBQUssSUFBSXVuQixFQUFJLEVBQUdBLEVBQUl2bkIsRUFBU3VuQixJQUN6Qm84RyxFQUFVcDhHLEdBQUs1ckQsS0FBSzA5QixJQUFJc3FJLEVBQVVwOEcsR0FBSXU4RyxFQUFZRixFQUFldnBJLEVBQVNrdEIsR0FBSSxFQUFHeHJELEdBQU9ULFFBSXBHLE9BQU9xb0ssRUEzQldJLENBQXdCcGdLLEVBQU12SSxFQUFPVyxFQUFPNmQsR0FDeEQ5ZCxFQUFPVixFQUFNRSxPQUNiMG9LLEVBQVlDLEVBQWtCdGdLLEVBQU12SSxFQUFPVyxFQUFPNmQsRUFBUytwSixHQUMzRE8sRUFBUSxDQUFDLFVBUWYsT0FQSXpXLElBQ0F5VyxFQUFNL3BLLEtBQUssWUFBWTRCLEtBQ3ZCbW9LLEVBQU0vcEssS0FBSyxXQUFXMkIsS0FDdEJvb0ssRUFBTS9wSyxLQUFLLGFBQWFpQixNQUN4QjhvSyxFQUFNL3BLLEtBQUssY0FFZitwSyxFQUFNL3BLLEtBQUs2cEssRUFBVWxxSyxLQUFJckMsR0FBSyxPQUFTQSxJQUFHNEMsS0FBSyxPQUN4QzZwSyxFQUFNN3BLLEtBQUssTUFrQnRCLFNBQVN5cEssRUFBWWh0SixFQUFLOGYsRUFBSzc2QixHQUMzQixJQUFJb29LLEVBY0osT0FaSUEsRUFEQW55SixNQUFNc3ZELFFBQVF4cUQsR0FDTCxHQUFHc3RKLFdBQVd0dEosRUFBSSxHQUFHM0osUUFuQ1IsU0FvQ2ZpM0osV0FBV3R0SixFQUFJLEdBQUczSixRQXBDSCxPQXNDakIsbUJBQVMySixHQUNMLElBQUlBLEtBRUUsU0FBVi9hLEVBQ0lzb0ssRUFBZ0J2dEosR0FHaEJzdEosV0FBV3R0SixFQUFJM0osUUE3Q0YsSUE2Q2tDOGxELFdBRXJELG1CQUFTa3hHLEVBQVF2dEksR0FFNUIsU0FBU3l0SSxFQUFnQnZ6RixHQUNyQixPQUFhLElBQU5BLEVBQVUsUUFBVSxPQUUvQixTQUFTbXpGLEVBQWtCdGdLLEVBQU12SSxFQUFPVyxFQUFPNmQsRUFBUytwSixFQUFXVyxHQUFTLEdBQ3hFLE1BQU1DLEVBQThCLGNBQVZ4b0ssRUFBd0IsRUFBSSxFQUNoRHFJLEVBQU9oSixFQUFNLEdBQ2JVLEVBQU9WLEVBQU1FLE9BQ25CLEdBQWEsSUFBVFEsRUFBWSxDQUNaLEdBQWMsY0FBVkMsRUFBdUIsQ0FFdkIsTUFBTyxDQUFDK25LLEVBRGFELEVBQW9CbGdLLEdBQ1IsR0FBSSxFQUFHNUgsSUFFNUMsTUFBYyxTQUFWQSxFQUNPLENBQUNzb0ssRUFBZ0IxZ0ssRUFBSyxLQUUxQixDQUFDQSxFQUFLLEdBQUdzdkQsWUFFcEIsR0FBYSxJQUFUbjNELEVBQVksQ0FDWixHQUFJc0ksRUF2RWtCLEdBdUVZLENBQzlCLE1BQU1vZ0ssRUF0RWlCLEVBc0U0QkQsRUFDbkQsSUFBSUUsRUFBWXp5SixNQUFNZ3FDLEtBQUtyNEMsRUFBS2xJLE1BQU0sRUFBRytvSyxJQUNyQ0UsRUFBVzF5SixNQUFNZ3FDLEtBQUtyNEMsRUFBS2xJLE9BQU8ySSxFQXhFZixHQXdFb0RtZ0ssRUFBbUJuZ0ssRUFBT21nSyxJQUtyRyxNQUpjLGNBQVZ4b0ssSUFDQTBvSyxFQUFZWixFQUFvQlksR0FDaENDLEVBQVdiLEVBQW9CYSxJQUU1QixDQUNILElBQ0lELEVBQVUzcUssS0FBSSxDQUFDeUMsRUFBRy9FLElBQU1zc0ssRUFBWXZuSyxFQUFHb25LLEVBQVVuc0ssR0FBSXVFLEtBQ2hEMUIsS0FBSyxNQUNWLFVBQ0FxcUssRUFDSzVxSyxLQUFJLENBQUN5QyxFQUFHL0UsSUFBTXNzSyxFQUFZdm5LLEVBQUdvbkssRUFBVXYvSixFQW5GN0IsRUFtRmlFNU0sR0FBSXVFLEtBQy9FMUIsS0FBSyxNQUNWLEtBS1osTUFBTyxDQUNILEtBSDBCLGNBQVYwQixFQUF3QjhuSyxFQUFvQmxnSyxHQUM1RHFPLE1BQU1ncUMsS0FBS3I0QyxJQUdLN0osS0FBSSxDQUFDeUMsRUFBRy9FLElBQU1zc0ssRUFBWXZuSyxFQUFHb25LLEVBQVVuc0ssR0FBSXVFLEtBQ2xEMUIsS0FBSyxNQUNWLEtBSVosTUFBTXNxSyxFQUFXdnBLLEVBQU1LLE1BQU0sR0FDdkJtcEssRUFBYWhySixFQUFRbmUsTUFBTSxHQUMzQnkyRCxFQUFTdDRDLEVBQVEsR0FBSzJxSixFQUN0QkwsRUFBUSxHQUNkLEdBQUk5L0osRUF4R3NCLEdBd0dRLENBQzlCLElBQUssSUFBSTVNLEVBQUksRUFBR0EsRUF2R1csRUF1R3FCQSxJQUFLLENBQ2pELE1BQU1xTCxFQUFRckwsRUFBSTA2RCxFQUNablUsRUFBTWw3QyxFQUFRcXZELEVBQ3BCZ3lHLEVBQU0vcEssUUFBUThwSyxFQUFrQnRnSyxFQUFLbEksTUFBTW9ILEVBQU9rN0MsR0FBTTRtSCxFQUFVNW9LLEVBQU82b0ssRUFBWWpCLEdBQVcsSUFFcEdPLEVBQU0vcEssS0FBSyxPQUNYLElBQUssSUFBSTNDLEVBQUk0TSxFQTdHYyxFQTZHcUI1TSxFQUFJNE0sRUFBTTVNLElBQUssQ0FDM0QsTUFBTXFMLEVBQVFyTCxFQUFJMDZELEVBQ1puVSxFQUFNbDdDLEVBQVFxdkQsRUFDcEJneUcsRUFBTS9wSyxRQUFROHBLLEVBQWtCdGdLLEVBQUtsSSxNQUFNb0gsRUFBT2s3QyxHQUFNNG1ILEVBQVU1b0ssRUFBTzZvSyxFQUFZakIsRUFBV25zSyxJQUFNNE0sRUFBTyxVQUlqSCxJQUFLLElBQUk1TSxFQUFJLEVBQUdBLEVBQUk0TSxFQUFNNU0sSUFBSyxDQUMzQixNQUFNcUwsRUFBUXJMLEVBQUkwNkQsRUFDWm5VLEVBQU1sN0MsRUFBUXF2RCxFQUNwQmd5RyxFQUFNL3BLLFFBQVE4cEssRUFBa0J0Z0ssRUFBS2xJLE1BQU1vSCxFQUFPazdDLEdBQU00bUgsRUFBVTVvSyxFQUFPNm9LLEVBQVlqQixFQUFXbnNLLElBQU00TSxFQUFPLElBR3JILE1BQU15Z0ssRUFBZSxJQUFUL29LLEVBQWEsSUFBTSxHQUMvQm9vSyxFQUFNLEdBQUssSUFBTUEsRUFBTSxHQUFLVyxFQUM1QixJQUFLLElBQUlydEssRUFBSSxFQUFHQSxFQUFJMHNLLEVBQU01b0ssT0FBUyxFQUFHOUQsSUFDbEMwc0ssRUFBTTFzSyxHQUFLLElBQU0wc0ssRUFBTTFzSyxHQUFLcXRLLEVBRWhDLElBQUlDLEVBQWEsTUFDakIsSUFBSyxJQUFJdHRLLEVBQUksRUFBR0EsRUFBSXNFLEVBQU10RSxJQUN0QnN0SyxHQUFjLEtBSWxCLE9BRkFaLEVBQU1BLEVBQU01b0ssT0FBUyxHQUNqQixJQUFNNG9LLEVBQU1BLEVBQU01b0ssT0FBUyxHQUFLLEtBQU9ncEssRUFBUyxHQUFLUSxHQUNsRFosRUFFWCxTQUFTTCxFQUFvQmxnSyxHQUN6QixNQUFNb2hLLEVBQWdCLEdBQ3RCLElBQUssSUFBSXZ0SyxFQUFJLEVBQUdBLEVBQUltTSxFQUFLckksT0FBUTlELEdBQUssRUFDbEN1dEssRUFBYzVxSyxLQUFLLENBQUN3SixFQUFLbk0sR0FBSW1NLEVBQUtuTSxFQUFJLEtBRTFDLE9BQU91dEssSTs7Ozs2SENoS1g7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbUJPLFNBQVNDLEVBQWVuNEosRUFBR3lmLEdBQzlCLEdBQUl6ZixFQUFFOVEsUUFBVXV3QixFQUFFdndCLE1BQ2QsTUFBTyxDQUFDOFEsRUFBR3lmLEdBRWYsTUFBTXZ3QixFQUFRLHFCQUFXOFEsRUFBRTlRLE1BQU91d0IsRUFBRXZ3QixPQUNwQyxNQUFPLENBQUM4USxFQUFFc3ZCLEtBQUtwZ0MsR0FBUXV3QixFQUFFNlAsS0FBS3BnQyxJQUUzQixTQUFTa3BLLEVBQWlCcDRKLEVBQUd5ZixHQUNoQyxpQkFBT3pmLEVBQUU5USxRQUFVdXdCLEVBQUV2d0IsT0FBTyxJQUFNLDJCQUEyQjhRLEVBQUU5USxxQkFDaER1d0IsRUFBRXZ3Qiw0QkFFZCxTQUFTbXBLLEVBQWU5akcsRUFBUStqRyxHQUNuQyxPQUFPQSxFQUFXM21ILE1BQUtqaUQsR0FBS0EsRUFBRWdGLEtBQU82L0QsRUFBTzcvRCxLQWN6QyxTQUFTNmpLLEVBQXNCdGlLLEdBQ2xDLE1BQU11aUssRUFBTyxHQUdiLE9BREFDLEVBQW9CeGlLLEVBQVF1aUssRUFEZixJQUFJM3FELEtBRVYycUQsRUFFWCxTQUFTQyxFQUFvQjc2QyxFQUFXNDZDLEVBQU1FLEdBQzFDLEdBQWlCLE1BQWI5NkMsRUFDQSxPQUVKLEdBQUlBLGFBQXFCLFNBRXJCLFlBREE0NkMsRUFBS2xySyxLQUFLc3dILEdBR2QsR0FjZ0IrNkMsRUFkQS82QyxHQWVUejRHLE1BQU1zdkQsUUFBUWtrRyxJQUF1QixpQkFBUkEsRUFkaEMsT0FhUixJQUFvQkEsRUFWaEIsTUFBTUMsRUFBV2g3QyxFQUNqQixJQUFLLE1BQU14bEYsS0FBS3dnSSxFQUFVLENBQ3RCLE1BQU0zdUosRUFBTTJ1SixFQUFTeGdJLEdBQ2hCc2dJLEVBQUszakssSUFBSWtWLEtBQ1Z5dUosRUFBS2wrSixJQUFJeVAsR0FDVHd1SixFQUFvQnh1SixFQUFLdXVKLEVBQU1FLE87Ozs7dUdDcEUzQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQk8sU0FBU0csRUFBVzV1SixFQUFLL2EsR0FDNUIsSUFBSTRwSyxFQUFZN3VKLEVBQ2hCLEdBQUksdUJBQWFBLEdBQ2IsTUFBaUIsV0FBVi9hLEVBQXFCLEdBQUssQ0FBQythLEVBQUl4YixRQUUxQyxJQUFLMFcsTUFBTXN2RCxRQUFReHFELEdBQ2YsTUFBTyxHQUVYLE1BQU0xYixFQUFRLEdBQ2QsS0FBTzRXLE1BQU1zdkQsUUFBUXFrRyxJQUNqQix1QkFBYUEsSUFBd0IsV0FBVjVwSyxHQUMzQlgsRUFBTWpCLEtBQUt3ckssRUFBVXJxSyxRQUNyQnFxSyxFQUFZQSxFQUFVLEdBTTFCLE9BSkkzekosTUFBTXN2RCxRQUFReHFELElBQ2QsZ0JBQU01VyxRQUFRLHVDQUNkMGxLLEVBQTJCOXVKLEVBQUsxYixFQUFPLElBRXBDQSxFQUVYLFNBQVN3cUssRUFBMkI5dUosRUFBSzFiLEVBQU9ndUMsR0FFNUMsR0FEQUEsRUFBVUEsR0FBVyxJQUNmcDNCLE1BQU1zdkQsUUFBUXhxRCxLQUFVLHVCQUFhQSxHQUd2QyxZQUZBLGlCQUF3QixJQUFqQjFiLEVBQU1FLFFBQWMsSUFBTSxlQUFlOHRDLEVBQVEvdUMsS0FBSywrREFDakJlLEVBQU0sZ0JBR3RELGlCQUFPQSxFQUFNRSxPQUFTLEdBQUcsSUFBTSxlQUFlOHRDLEVBQVEvdUMsS0FBSyxvREFDakN5YyxFQUFJeGIsb0JBQzlCLGlCQUFPd2IsRUFBSXhiLFNBQVdGLEVBQU0sSUFBSSxJQUFNLGVBQWVndUMsRUFBUS91QyxLQUFLLHNCQUFzQmUsRUFBTSx3QkFDckUwYixFQUFJeGIsb0JBQzdCLE1BQU11cUssRUFBV3pxSyxFQUFNSyxNQUFNLEdBQzdCLElBQUssSUFBSWpFLEVBQUksRUFBR0EsRUFBSXNmLEVBQUl4YixTQUFVOUQsRUFDOUJvdUssRUFBMkI5dUosRUFBSXRmLEdBQUlxdUssRUFBVXo4SCxFQUFRM3NDLE9BQU9qRixJQUdwRSxTQUFTc3VLLEVBQVlDLEVBQWVDLEVBQWFDLEVBQVNDLEdBQ3RELEdBQXNCLHNCQUFsQkgsRUFBSixDQUdBLEdBQXFCLE1BQWpCQSxFQUNBLE1BQU0sSUFBSTVsSyxNQUFNLGtDQUVwQixHQUFzQixZQUFsQjRsSyxHQUErQkEsSUFBa0JDLEdBQy9CLFlBQWxCRCxHQUErQyxXQUFoQkMsRUFDL0IsTUFBTSxJQUFJN2xLLE1BQU0sYUFBYThsSyxpQkFBdUJDLGNBQzFDSCxxQkFBaUNDLGFBRzVDLFNBQVNHLEVBQWdCNXBLLEVBQUcwcEssRUFBU0MsRUFBY0UsRUFBZSxXQUNyRSxHQUFJN3BLLGFBQWEsU0FFYixPQURBdXBLLEVBQVlNLEVBQWM3cEssRUFBRVIsTUFBT2txSyxFQUFTQyxHQUNyQzNwSyxFQUVYLElBQUk4cEssRUFBZ0IscUJBQVc5cEssR0FRL0IsR0FMc0IsV0FBbEI4cEssR0FDQSxDQUFDLE9BQVEsUUFBUyxXQUFXenpKLFFBQVF3ekosSUFBaUIsSUFDdERDLEVBQWdCRCxHQUVwQk4sRUFBWU0sRUFBY0MsRUFBZUosRUFBU0MsR0FDeEMsTUFBTDNwSyxJQUNDLHVCQUFhQSxLQUFPeVYsTUFBTXN2RCxRQUFRL2tFLElBQW1CLGlCQUFOQSxHQUNoQyxrQkFBTkEsR0FBZ0MsaUJBQU5BLEVBQWlCLENBQ3RELE1BQU1tVixFQUFZLE1BQUxuVixFQUFZLE9BQVNBLEVBQUU5QyxZQUFZMUIsS0FDaEQsTUFBTSxJQUFJb0ksTUFBTSxhQUFhOGxLLGlCQUF1QkMsK0NBQ2R4MEosTUFFMUMsTUFBTXFuSixFQUFnQjJNLEVBQVducEssRUFBRzhwSyxHQUMvQix1QkFBYTlwSyxJQUFPeVYsTUFBTXN2RCxRQUFRL2tFLEtBQ25DQSxFQUFJLENBQUNBLElBRVQsTUFDTTZFLEVBQTJCLFdBQWxCaWxLLEVBQ1gsdUJBQWE5cEssRUFBRzhwSyxHQUNoQixrQkFBUTlwSyxFQUFHLElBSFEsR0FJdkIsT0FBTyxTQUFPOG9ILFdBQVdqa0gsRUFBUTIzSixFQUFlc04sR0FFN0MsU0FBU0MsRUFBcUIvL0QsRUFBSzAvRCxFQUFTQyxFQUFjRSxFQUFlLFdBQzVFLElBQUtwMEosTUFBTXN2RCxRQUFRaWxDLEdBQ2YsTUFBTSxJQUFJcG1HLE1BQU0sWUFBWThsSyxlQUFxQkMsZ0RBSXJELE9BRGdCMy9ELEVBQ0R6c0csS0FBSSxDQUFDcEIsRUFBR2xCLElBQU0ydUssRUFBZ0J6dEssRUFBRyxHQUFHdXRLLEtBQVd6dUssS0FBTTB1SyxFQUFjRSxPOzs7O21PQ3pHdEY7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbUJBLE1BQ2FHLEVBQXVCLEdBQzdCLFNBQVNDLEVBQWtCN1csRUFBUThXLEVBQVV4NkosR0FJaEQsT0FIZSxNQUFYQSxJQUNBQSxFQUFVeTZKLEtBRVBDLEVBQXNCaFgsRUFBUThXLEdBQVUsQ0FBQzU1SixFQUFHeWYsSUFBTXM2SSxFQUFTLzVKLEVBQUd5ZixFQUFHcmdCLEtBRXJFLFNBQVN5NkosSUFDWixPQUEyQyxLQUFwQyxTQUFPbDhJLFFBQVEzZSxpQkFURyxLQVVyQjA2SixFQUVSLFNBQVNJLEVBQXNCaFgsRUFBUThXLEVBQVVJLEdBQzdDLElBQUlDLEdBQWlCLEVBT3JCLElBTkksdUJBQWFuWCxJQUFXLHVCQUFhOFcsTUFDckNLLEdBQWlCLEdBRWpCLHVCQUFhblgsSUFBVyx1QkFBYThXLEtBQ3JDSyxHQUFpQixHQUVqQkEsRUFBZ0IsQ0FDaEIsTUFBTUMsRUFBUXBYLEVBQU9sMkosWUFBWTFCLEtBQzNCaXZLLEVBQVFQLEVBQVNodEssWUFBWTFCLEtBQ25DLEdBQUlndkssSUFBVUMsRUFDVixNQUFNLElBQUk3bUssTUFBTSx5Q0FBeUM0bUssZ0JBQ3hDQyxLQUd6QixHQUFJaDFKLE1BQU1zdkQsUUFBUXF1RixJQUFXMzlJLE1BQU1zdkQsUUFBUW1sRyxHQUFXLENBQ2xELE1BQU1RLEVBQWMscUJBQVd0WCxHQUN6QnVYLEVBQWdCLHFCQUFXVCxHQUNqQyxJQUFLLHNCQUFZUSxFQUFhQyxHQUMxQixNQUFNLElBQUkvbUssTUFDTiwwQ0FBWThtSyxrQkFBNEJDLE1BR3BELE1BQU1DLEVBQWEsdUJBQWF4WCxHQUFVQSxFQUFTLGtCQUFRQSxHQUNyRHlYLEVBQWUsdUJBQWFYLEdBQzlCQSxFQUNBLGtCQUFRQSxHQUNaLEdBQUlVLEVBQVc3ckssU0FBVzhySyxFQUFhOXJLLE9BQ25DLE1BQU0sSUFBSTZFLE1BQU0seUNBQXlDZ25LLEVBQVc3ckssdUJBQ25EOHJLLEVBQWE5ckssc0JBQ2I2ckssaUJBQ0FDLE1BRXJCLElBQUssSUFBSTV2SyxFQUFJLEVBQUdBLEVBQUk0dkssRUFBYTlySyxTQUFVOUQsRUFBRyxDQUMxQyxNQUFNcVYsRUFBSXM2SixFQUFXM3ZLLEdBQ2Y0Z0QsRUFBSWd2SCxFQUFhNXZLLEdBQ3ZCLElBQUtxdkssRUFBVWg2SixFQUFHdXJDLEdBQ2QsTUFBTSxJQUFJajRDLE1BQU0seUJBQXlCM0ksUUFBUXFWLGVBQWVyVixRQUFRNGdELGlCQUN2RCt1SCxpQkFDQUMsT0FJdEIsU0FBU0MsRUFBb0J0bEQsRUFBSWdwQixHQUNwQ2hwQixJQUFLaHpCLE1BQUssSUFBTWc4QyxFQUFLdThCLFNBQVEsSUFBTXY4QixNQUVoQyxTQUFTdzhCLEVBQWtCNVgsRUFBUThXLEdBQ3RDLE1BQU1yZ0ksRUFBMEIsaUJBQWJxZ0ksR0FBNkMsaUJBQWJBLEdBQzNCLGtCQUFiQSxFQUNQLENBQUNBLEdBQ0RBLEVBQ0osT0FBSSxtQkFBUzlXLElBQVcsbUJBQVNBLEVBQU8sS0FDcEMsbUJBQVM4VyxJQUFhLG1CQUFTQSxFQUFTLElBRWpDRSxFQUFzQmhYLEVBQVF2cEgsR0FBSyxDQUFDdjVCLEVBQUd5ZixJQUFNemYsR0FBS3lmLElBRXREcTZJLEVBQXNCaFgsRUFBUThXLEdBQVUsQ0FBQzU1SixFQUFHeWYsSUFBTXM2SSxFQUFTLzVKLEVBQUd5ZixFQUFHLEtBRXJFLFNBQVNrN0ksRUFBbUIzNkosRUFBR3VyQyxFQUFHbnNDLEdBSXJDLEdBSGUsTUFBWEEsSUFDQUEsRUFBVXk2SixNQUVURSxFQUFTLzVKLEVBQUd1ckMsRUFBR25zQyxHQUNoQixNQUFNLElBQUk5TCxNQUFNLDhCQUE4QjBNLG1CQUFtQnVyQyxLQUd6RSxTQUFTd3VILEVBQVMvNUosRUFBR3VyQyxFQUFHbnNDLEdBQ3BCLE9BQUtzL0IsU0FBUzErQixLQUFPMCtCLFNBQVM2TSxNQUcxQnpNLE1BQU05K0IsSUFBTTgrQixNQUFNeU0sSUFBTXo4QyxLQUFLaU4sSUFBSWlFLEVBQUl1ckMsR0FBS25zQyxHQUszQyxTQUFTdzdKLEVBQW9COVgsRUFBUTk0QyxFQUFLQyxHQUM3QyxJQUFLLElBQUl0L0csRUFBSSxFQUFHQSxFQUFJbTRKLEVBQU9yMEosT0FBUTlELElBQy9CLEdBQUltNEosRUFBT240SixHQUFLcS9HLEdBQU84NEMsRUFBT240SixHQUFLcy9HLEVBQy9CLE1BQU0sSUFBSTMyRyxNQUFNLHNCQUFzQnd2SixFQUFPbjRKLFdBQVdxL0csWUFBY0MsS0FJM0UsU0FBUzR3RCxFQUF3Qi9YLEVBQVE4VyxHQUc1Q2tCLE9BQU8sSUFBSTNpSixhQUFhMnFJLElBQVNpWSxRQUFRLElBQUk1aUosYUFBYXloSixJQUd2RCxTQUFTb0IsRUFBY2g3SixHQUMxQixJQUFLLElBQUlyVixFQUFJLEVBQUdBLEVBQUlxVixFQUFFdlIsT0FBUTlELElBQUssQ0FDL0IsTUFBTXNmLEVBQU1qSyxFQUFFclYsR0FDVndhLE1BQU1zdkQsUUFBUXhxRCxHQUNkK3dKLEVBQWMvd0osR0FHZGpLLEVBQUVyVixHQUFLLHVCQUFhc2YsR0FHNUIsT0FBT2pLLEk7Ozs7MkRDbElYLCs5QkEwQkMsb0JBQW1CLGVBQWMsb0JBQW1CLG1CQUNqRCxtQkFBa0Isa0JBQWlCLGdCQUNoQyxNQUFNaTdKLEVBQVEsQ0FDakJDLElBQUssd0JBQXNCQSxJQUMzQnRLLFNBQVUsd0JBQXNCQSxTQUNoQ3VLLFNBQVUsd0JBQXNCQSxTQUNoQ0MsUUFBUyx3QkFBc0JBLFFBQy9CQyxRQUFTLHdCQUFzQkEsUUFDL0JDLE9BQVEsd0JBQXNCQSxPQUM5QkMsS0FBTSx3QkFBc0JBLE87Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ25CekIsSUFBSUMsRUFZUEMsRUFPQUMsRUFPQUMsRUFPQUMsRUFqREosa0lBaUJBLFNBQVdKLEdBQ1BBLEVBQVMsR0FBSSxLQUNiQSxFQUFTLEdBQUksS0FDYkEsRUFBUyxHQUFJLEtBQ2JBLEVBQVMsR0FBSSxLQUNiQSxFQUFTLEdBQUksS0FDYkEsRUFBUyxHQUFJLEtBQ2JBLEVBQVMsR0FBSSxLQVBqQixDQVFHQSxJQUFTQSxFQUFPLEtBSW5CLFNBQVdDLEdBQ1BBLEVBQTJCLFFBQUksVUFDL0JBLEVBQXlCLE1BQUksUUFDN0JBLEVBQXdCLEtBQUksUUFDNUJBLEVBQTZCLFVBQUksWUFKckMsQ0FLR0EsSUFBc0JBLEVBQW9CLEtBRTdDLFNBQVdDLEdBQ1BBLEVBQTBCLFFBQUksVUFDOUJBLEVBQXdCLE1BQUksUUFDNUJBLEVBQXVCLEtBQUksT0FDM0JBLEVBQTRCLFVBQUksWUFKcEMsQ0FLR0EsSUFBcUJBLEVBQW1CLEtBRTNDLFNBQVdDLEdBQ1BBLEVBQTZCLFFBQUksVUFDakNBLEVBQTJCLE1BQUksVUFDL0JBLEVBQTBCLEtBQUksVUFDOUJBLEVBQStCLFVBQUksWUFKdkMsQ0FLR0EsSUFBd0JBLEVBQXNCLEtBRWpELFNBQVdDLEdBQ1BBLEVBQStCLFFBQUksWUFDbkNBLEVBQTZCLE1BQUksWUFDakNBLEVBQTRCLEtBQUksWUFDaENBLEVBQWlDLFVBQUksWUFKekMsQ0FLR0EsSUFBMEJBLEVBQXdCLEtBQ3JELE1BQU1DLEVBQWdCLENBQ2xCLFFBQVdGLEVBQ1gsTUFBU0YsRUFDVCxLQUFRQyxFQUNSLFVBQWFFLEdBRVYsU0FBU24zSCxFQUFXcTNILEVBQU9DLEdBQzlCLEdBQWMsV0FBVkQsR0FBZ0MsV0FBVkMsRUFBb0IsQ0FDMUMsR0FBYyxXQUFWRCxHQUFnQyxXQUFWQyxFQUN0QixNQUFPLFNBRVgsTUFBTSxJQUFJem9LLE1BQU0sa0JBQWtCd29LLFVBQWNDLEtBRXBELE9BQU9GLEVBQWNDLEdBQU9DLEdBR3pCLFNBQVNDLEVBQVduM0osR0FDdkIsT0FBTzQvQixFQUFXNS9CLEVBQU0sVzs7OzsyMUJDekU1Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1Qk8sU0FBU3NvQixFQUFrQnZoQyxFQUFPc0QsR0FDckMsTUFBYyxXQUFWQSxFQUNPbU4sRUFBYXpRLEdBRWpCcXVFLEVBQWEsQ0FBQ3J1RSxHQUFRc0QsR0FPMUIsU0FBUytxRSxFQUFhajZELEVBQUc5USxHQUM1QixHQUFjLFdBQVZBLEVBQ0EsTUFBTSxJQUFJb0UsTUFBTSw2Q0FRcEIsR0FOSTZSLE1BQU1zdkQsUUFBUXowRCxLQUNkQSxFQUFJLFVBQWFBLElBRWpCLGdCQUFNM00sUUFBUSxVQUNkLDJCQUE4QjJNLEVBQUc5USxHQWJ6QyxTQUE0QjhRLEVBQUc5USxHQUMzQixPQUFROFEsYUFBYW1ZLGNBQTBCLFlBQVZqcEIsR0FDaEM4USxhQUFhQyxZQUF3QixVQUFWL1EsR0FDM0I4USxhQUFhVixZQUF3QixTQUFWcFEsRUFZNUIrc0ssQ0FBbUJqOEosRUFBRzlRLEdBQ3RCLE9BQU84USxFQUVYLEdBQWEsTUFBVDlRLEdBQTJCLFlBQVZBLEdBQWlDLGNBQVZBLEVBQ3hDLE9BQU8sSUFBSWlwQixhQUFhblksR0FFdkIsR0FBYyxVQUFWOVEsRUFDTCxPQUFPLElBQUkrUSxXQUFXRCxHQUVyQixHQUFjLFNBQVY5USxFQUFrQixDQUN2QixNQUFNZ3RLLEVBQU8sSUFBSTU4SixXQUFXVSxFQUFFdlIsUUFDOUIsSUFBSyxJQUFJOUQsRUFBSSxFQUFHQSxFQUFJdXhLLEVBQUt6dEssU0FBVTlELEVBQ04sSUFBckJtRSxLQUFLb1IsTUFBTUYsRUFBRXJWLE1BQ2J1eEssRUFBS3Z4SyxHQUFLLEdBR2xCLE9BQU91eEssRUFHUCxNQUFNLElBQUk1b0ssTUFBTSxxQkFBcUJwRSxLQWN0QyxTQUFTZ0gsSUFDWixPQUFPLGdCQUFNMGxILFNBQVMxbEgsTUFrQm5CLFNBQVM4ckYsRUFBTXhxRCxFQUFNKzdILEdBQ3hCLE9BQU8sZ0JBQU0zM0MsU0FBUzU1QixNQUFNeHFELEVBQU0rN0gsR0FVL0IsU0FBU2wzSixFQUFhM1AsRUFBR2dtSyxFQUFXLFNBRXZDLE9BREFBLEVBQVdBLEdBQVksUUFDaEIsZ0JBQU05MkMsU0FBUzYyQyxPQUFPL2xLLEVBQUdnbUssR0FVN0IsU0FBUzE2SixFQUFhMmdILEVBQU8rNUMsRUFBVyxTQUUzQyxPQURBQSxFQUFXQSxHQUFZLFFBQ2hCLGdCQUFNOTJDLFNBQVM1a0gsT0FBTzJoSCxFQUFPKzVDLEdBekh4QyxpSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDOEJPLFNBQVN5SixFQUFRbnBGLEdBQ3BCLElBQUlpekIsRUFBVWp6QixFQUFNdmtGLE9BQ2hCdW1CLEVBQVEsRUFFWixLQUFPaXhGLEVBQVUsR0FFYmp4RixFQUFTbG1CLEtBQUtxNUUsU0FBVzg5QixFQUFXLEVBRXBDQSxJQUVBOXlCLEVBQUtILEVBQU9pekIsRUFBU2p4RixHQW1CdEIsU0FBU29uSixFQUVoQnBwRixFQUVBcXBGLEdBQ0ksR0FBSXJwRixFQUFNdmtGLFNBQVc0dEssRUFBTzV0SyxPQUN4QixNQUFNLElBQUk2RSxNQUNOLHlFQUEwQjAvRSxFQUFNdmtGLGlDQUNMNHRLLEVBQU81dEssVUFFMUMsSUFBSXczRyxFQUFVanpCLEVBQU12a0YsT0FDaEJ1bUIsRUFBUSxFQUVaLEtBQU9peEYsRUFBVSxHQUVianhGLEVBQVNsbUIsS0FBS3E1RSxTQUFXODlCLEVBQVcsRUFFcENBLElBRUE5eUIsRUFBS0gsRUFBT2l6QixFQUFTanhGLEdBQ3JCbStELEVBQUtrcEYsRUFBUXAyRCxFQUFTanhGLEdBSXZCLFNBQVNxL0QsRUFBTWx4QyxFQUFLenpDLEVBQUc4OEIsR0FDMUIsT0FBTzE5QixLQUFLMDlCLElBQUkyVyxFQUFLcjBDLEtBQUtxMEMsSUFBSXp6QyxFQUFHODhCLElBRTlCLFNBQVNoa0IsRUFBa0J5QixHQUM5QixPQUFPQSxFQUFNLEdBQU0sRUFBSUEsRUFBTUEsRUFBTSxFQUVoQyxTQUFTa3BFLEVBQUs5bUYsRUFBUTZFLEVBQU0raEYsR0FDL0IsTUFBTTQyQyxFQUFPeDlILEVBQU82RSxHQUNwQjdFLEVBQU82RSxHQUFRN0UsRUFBTzRtRixHQUN0QjVtRixFQUFPNG1GLEdBQVM0MkMsRUFFYixTQUFTdndILEVBQUltYyxHQUNoQixJQUFJbmMsRUFBTSxFQUNWLElBQUssSUFBSTNPLEVBQUksRUFBR0EsRUFBSThxQixFQUFJaG5CLE9BQVE5RCxJQUM1QjJPLEdBQU9tYyxFQUFJOXFCLEdBRWYsT0FBTzJPLEVBU0osU0FBU2dqSyxFQUFZdDhKLEVBQUd5ZixHQUMzQixNQUFNaDBCLEVBQUlxRCxLQUFLcTVFLFNBQ2YsT0FBUTFvRCxFQUFJaDBCLEdBQU0sRUFBSUEsR0FBS3VVLEVBR3hCLFNBQVN1OEosRUFBWXY4SixFQUFHeWYsR0FDM0IsSUFBSXhwQixFQUFTLEVBQ2IsSUFBSyxJQUFJdEwsRUFBSSxFQUFHQSxFQUFJcVYsRUFBRXZSLE9BQVE5RCxJQUFLLENBQy9CLE1BQU13bEYsRUFBT3JoQyxPQUFPOXVDLEVBQUVyVixJQUFNbWtELE9BQU9ydkIsRUFBRTkwQixJQUNyQ3NMLEdBQVVrNkUsRUFBT0EsRUFFckIsT0FBT2w2RSxFQWlCSixTQUFTekgsRUFBT2d1SyxFQUFNaHhELEdBQ3pCLElBQUtneEQsRUFDRCxNQUFNLElBQUlscEssTUFBcUIsaUJBQVJrNEcsRUFBbUJBLEVBQU1BLEtBR2pELFNBQVN6a0UsRUFBa0Jqd0IsRUFBUUMsRUFBUTBsSixFQUFxQixJQUNuRWp1SyxFQUFPd29CLEVBQVlGLEVBQVFDLElBQVMsSUFBTTBsSixFQUFxQixXQUFXM2xKLFNBQWNDLGlCQUVyRixTQUFTMmxKLEVBQWMxOEosR0FDMUJ4UixFQUFZLE1BQUx3UixHQUFXLElBQU0sa0VBcUJyQixTQUFTaEgsRUFBUXljLEVBQUt4ZixFQUFTLEdBQUkwbUssR0FBaUIsR0FJdkQsR0FIYyxNQUFWMW1LLElBQ0FBLEVBQVMsSUFFVGtQLE1BQU1zdkQsUUFBUWgvQyxJQUFRbW5KLEVBQWFubkosS0FBU2tuSixFQUM1QyxJQUFLLElBQUloeUssRUFBSSxFQUFHQSxFQUFJOHFCLEVBQUlobkIsU0FBVTlELEVBQzlCcU8sRUFBUXljLEVBQUk5cUIsR0FBSXNMLEVBQVEwbUssUUFJNUIxbUssRUFBTzNJLEtBQUttb0IsR0FFaEIsT0FBT3hmLEVBYUosU0FBU3VCLEVBQWNqSixHQUMxQixHQUFxQixJQUFqQkEsRUFBTUUsT0FFTixPQUFPLEVBRVgsSUFBSThJLEVBQU9oSixFQUFNLEdBQ2pCLElBQUssSUFBSTVELEVBQUksRUFBR0EsRUFBSTRELEVBQU1FLE9BQVE5RCxJQUM5QjRNLEdBQVFoSixFQUFNNUQsR0FFbEIsT0FBTzRNLEVBRUosU0FBU3NsSyxFQUFjdHVLLEdBQzFCLE9BQXdCLElBQWpCQSxFQUFNRSxPQUVWLFNBQVN1b0IsRUFBWThsSixFQUFJQyxHQUM1QixHQUFJRCxJQUFPQyxFQUNQLE9BQU8sRUFFWCxHQUFVLE1BQU5ELEdBQW9CLE1BQU5DLEVBQ2QsT0FBTyxFQUVYLEdBQUlELEVBQUdydUssU0FBV3N1SyxFQUFHdHVLLE9BQ2pCLE9BQU8sRUFFWCxJQUFLLElBQUk5RCxFQUFJLEVBQUdBLEVBQUlteUssRUFBR3J1SyxPQUFROUQsSUFDM0IsR0FBSW15SyxFQUFHbnlLLEtBQU9veUssRUFBR3B5SyxHQUNiLE9BQU8sRUFHZixPQUFPLEVBRUosU0FBUzR0RCxFQUFNdjRDLEdBQ2xCLE9BQU9BLEVBQUksR0FBTSxFQUVkLFNBQVMrekMsRUFBS3JrRCxHQUVqQixHQUFpQixNQUFiWixLQUFLaWxELEtBRUwsT0FBT2psRCxLQUFLaWxELEtBQUtya0QsR0FFckIsR0FBSUEsSUFBTTZuQixJQUNOLE9BQU8sRUFFTixHQUFJN25CLEtBQU82bkIsSUFDWixPQUFRLEVBRVAsQ0FDRCxNQUFNeWxKLEVBQU1sdUssS0FBS3lxQyxJQUFJLEVBQUk3cEMsR0FDekIsT0FBUXN0SyxFQUFNLElBQU1BLEVBQU0sSUFHM0IsU0FBU3AxRyxFQUFvQnJ3RCxHQUNoQyxNQUFNdkQsRUFBUWxGLEtBQUtDLEtBQUtELEtBQUs0aEQsS0FBS241QyxJQUNsQyxNQUFPLENBQUN2RCxFQUFPbEYsS0FBS0MsS0FBS3dJLEVBQU92RCxJQWM3QixTQUFTaXBLLEVBQXNCN3dLLEdBQ2xDLE1BQU04d0ssRUFBa0IsSUFBSWxuRSxZQUFZNXBHLEdBQ3hDLElBQUssSUFBSXpCLEVBQUksRUFBR0EsRUFBSXlCLElBQUt6QixFQUNyQnV5SyxFQUFnQnZ5SyxHQUFLQSxFQUd6QixPQURBd3hLLEVBQVFlLEdBQ0RBLEVBRUosU0FBUy9xSCxFQUFTbnlDLEVBQUd6SSxHQUN4QixPQUFJQSxHQUFReUksRUFBRXZSLE9BQ0h1UixFQUVKQSxFQUFJLElBQUltOUosT0FBTzVsSyxFQUFPeUksRUFBRXZSLFFBRTVCLFNBQVN5bEIsRUFBWWtwSixFQUFTQyxFQUFVLENBQUNwM0QsR0FBWSxHQUFHcTNELEdBQzNELE9BQU8sSUFBSTVtSyxTQUFRLENBQUNDLEVBQVNzcUYsS0FDekIsSUFBSXM4RSxFQUFXLEVBQ2YsTUFBTUMsRUFBUSxLQUNWLEdBQUlKLElBRUEsWUFEQXptSyxJQUdKNG1LLElBQ0EsTUFBTUUsRUFBY0osRUFBUUUsR0FDVixNQUFkRCxHQUFzQkMsR0FBWUQsRUFDbENyOEUsSUFHSnFZLFdBQVdra0UsRUFBT0MsSUFFdEJELE9BWUQsU0FBU3gwSCxFQUF1Qno2QyxFQUFPZ0osR0FDMUMsSUFBSW1tSyxFQUFZLEVBQ1pDLEdBQWUsRUFDbkIsSUFBSyxJQUFJaHpLLEVBQUksRUFBR0EsRUFBSTRELEVBQU1FLFNBQVU5RCxFQUNoQyxHQUFJNEQsRUFBTTVELElBQU0sRUFDWit5SyxHQUFhbnZLLEVBQU01RCxRQUVsQixJQUFrQixJQUFkNEQsRUFBTTVELEdBQVcsQ0FDdEIsSUFBcUIsSUFBakJnekssRUFDQSxNQUFNcnFLLE1BQ0YseURBQW1CcXFLLGFBQXVCaHpLLEtBRWxEZ3pLLEVBQWNoekssT0FFYixHQUFJNEQsRUFBTTVELEdBQUssRUFDaEIsTUFBTTJJLE1BQU0sZ0NBQWdDL0UsRUFBTTVELGFBQWFBLEtBR3ZFLElBQXFCLElBQWpCZ3pLLEVBQW9CLENBQ3BCLEdBQUlwbUssRUFBTyxHQUFLQSxJQUFTbW1LLEVBQ3JCLE1BQU1wcUssTUFBTSxRQUFRaUUsc0NBQXlDaEosS0FFakUsT0FBT0EsRUFFWCxHQUFrQixJQUFkbXZLLEVBQ0EsTUFBTXBxSyxNQUFNLHFDQUFxQy9FLGdDQUdyRCxHQUFJZ0osRUFBT21tSyxHQUFjLEVBQ3JCLE1BQU1wcUssTUFDRix3REFBT2lFLE9BQVVtbUssS0FFekIsTUFBTXYxSSxFQUFXNTVCLEVBQU1LLFFBRXZCLE9BREF1NUIsRUFBU3cxSSxHQUFlcG1LLEVBQU9tbUssRUFDeEJ2MUksRUFFSixTQUFTTixFQUFlcmlCLEVBQU1qWCxHQUNqQyxNQUFNVSxFQUFPVixFQUFNRSxPQVVuQixPQU5BRCxHQUZBZ1gsRUFBZSxNQUFSQSxFQUFlalgsRUFBTXRCLEtBQUksQ0FBQ1AsRUFBRy9CLElBQU1BLElBQUssR0FBR2lGLE9BQU80VixJQUU3Q3JLLE9BQU15aUssR0FBTUEsSUFBTzN1SyxHQUFRMnVLLEVBQUszdUssS0FBTyxJQUFNLCtDQUErQ0EsTUFBU0EsbUJBQ2pHdVcsTUFFaEJoWCxFQUFPZ1gsRUFBS3JLLE9BQU15aUssR0FBTXJsSCxFQUFNcWxILE1BQU0sSUFDaEMsMERBQVlwNEosTUFFVEEsRUFBS3ZZLEtBQUkrUyxHQUFLQSxFQUFJLEVBQUkvUSxFQUFPK1EsRUFBSUEsSUFHckMsU0FBU3dqRCxFQUFhajFELEVBQU9pWCxHQUNoQyxNQUFNMmlCLEVBQVcsR0FDWGpQLEVBQVcsR0FDWDJrSixFQUF1QixNQUFScjRKLEdBQWdCTCxNQUFNc3ZELFFBQVFqdkQsSUFBeUIsSUFBaEJBLEVBQUsvVyxPQUMzRHd2QixFQUFnQixNQUFSelksR0FBZ0JxNEosRUFDMUIsS0FDQWgySSxFQUFlcmlCLEVBQU1qWCxHQUFPOGtGLE9BQ2hDLElBQUkzNEIsRUFBSSxFQUNSLElBQUssSUFBSS92RCxFQUFJLEVBQUdBLEVBQUk0RCxFQUFNRSxTQUFVOUQsRUFBRyxDQUNuQyxHQUFZLE1BQVJzekIsRUFBYyxDQUNkLEdBQUlBLEVBQUt5OEIsS0FBTy92RCxHQUFrQixJQUFiNEQsRUFBTTVELEdBQ3ZCLE1BQU0sSUFBSTJJLE1BQU0sc0JBQXNCM0ksb0JBQW9CNEQsRUFBTTVELGlCQUVwRCxNQUFYc3pCLEVBQUt5OEIsSUFBY3o4QixFQUFLeThCLEdBQUsvdkQsSUFBbUIsSUFBYjRELEVBQU01RCxLQUMxQ3c5QixFQUFTNzZCLEtBQUtpQixFQUFNNUQsSUFDcEJ1dUIsRUFBUzVyQixLQUFLM0MsSUFFZHN6QixFQUFLeThCLElBQU0vdkQsR0FDWCt2RCxJQUdTLElBQWJuc0QsRUFBTTVELEtBQ053OUIsRUFBUzc2QixLQUFLaUIsRUFBTTVELElBQ3BCdXVCLEVBQVM1ckIsS0FBSzNDLElBR3RCLE1BQU8sQ0FBRXc5QixXQUFValAsWUFFaEIsU0FBUzFiLEVBQXVCdE8sRUFBT3FJLEdBQzFDLElBQUloRCxFQUFTLEtBQ2IsR0FBYSxNQUFUckYsR0FBMkIsWUFBVkEsRUFDakJxRixFQUFTLElBQUk0akIsYUFBYTVnQixRQUV6QixHQUFjLFVBQVZySSxFQUNMcUYsRUFBUyxJQUFJMEwsV0FBVzFJLE9BRXZCLElBQWMsU0FBVnJJLEVBSUwsTUFBTSxJQUFJb0UsTUFBTSxxQkFBcUJwRSxLQUhyQ3FGLEVBQVMsSUFBSStLLFdBQVcvSCxHQUs1QixPQUFPaEQsRUFFSixTQUFTcW1DLEVBQWtCMXJDLEVBQU9xSSxHQUNyQyxJQUFJaEQsRUFBUyxLQUNiLEdBQWEsTUFBVHJGLEdBQTJCLFlBQVZBLEVBQ2pCcUYsRUFBUyxJQUFJNGpCLGFBQWE1Z0IsUUFFekIsR0FBYyxVQUFWckksRUFDTHFGLEVBQVMsSUFBSTBMLFdBQVcxSSxRQUV2QixHQUFjLFNBQVZySSxFQUNMcUYsRUFBUyxJQUFJK0ssV0FBVy9ILE9BRXZCLElBQWMsV0FBVnJJLEVBSUwsTUFBTSxJQUFJb0UsTUFBTSxxQkFBcUJwRSxLQUhyQ3FGLEVBQVMsSUFBSTRRLE1BQU01TixHQUt2QixPQUFPaEQsRUFFSixTQUFTdXBLLEVBQXlCaG5LLEVBQU01SCxHQUMzQyxJQUFLLElBQUl2RSxFQUFJLEVBQUdBLEVBQUltTSxFQUFLckksT0FBUTlELElBQUssQ0FDbEMsTUFBTXNOLEVBQU1uQixFQUFLbk0sR0FDakIsR0FBSW0wQyxNQUFNN21DLEtBQVN5bUMsU0FBU3ptQyxHQUN4QixNQUFNM0UsTUFBTSxvQkFBb0JwRSw2QkFBaUMrSSxPQUt0RSxTQUFTOGxLLEVBQWE3dUssR0FDekIsTUFBaUIsU0FBVkEsR0FBOEIsY0FBVkEsR0FBbUMsWUFBVkEsR0FDdEMsVUFBVkEsR0FBK0IsV0FBVkEsRUFNdEIsU0FBU3dnQyxFQUFnQnN1SSxFQUFTQyxHQUNyQyxNQUFnQixjQUFaQSxLQUdZLFlBQVpBLEdBQXFDLGNBQVpELE1BR2IsVUFBWkMsR0FBbUMsWUFBWkQsR0FBcUMsY0FBWkEsS0FHcEMsU0FBWkMsR0FBa0MsU0FBWkQsS0FLdkIsU0FBU3BCLEVBQWE1OEosR0FDekIsT0FBT0EsYUFBYW1ZLGNBQWdCblksYUFBYUMsWUFDN0NELGFBQWFWLFdBRWQsU0FBU2tCLEVBQWdCdFIsR0FDNUIsR0FBYyxZQUFWQSxHQUFpQyxVQUFWQSxFQUN2QixPQUFPLEVBRU4sR0FBYyxjQUFWQSxFQUNMLE9BQU8sRUFFTixHQUFjLFNBQVZBLEVBQ0wsT0FBTyxFQUdQLE1BQU0sSUFBSW9FLE1BQU0saUJBQWlCcEUsS0FTbEMsU0FBU2d2SyxFQUFxQnpvSixHQUNqQyxHQUFXLE1BQVBBLEVBQ0EsT0FBTyxFQUVYLElBQUlrakcsRUFBUSxFQUVaLE9BREFsakcsRUFBSXJvQixTQUFRc0MsR0FBS2lwSCxHQUFTanBILEVBQUVqQixTQUNyQmtxSCxFQUdKLFNBQVN4OEcsRUFBU3ZRLEdBQ3JCLE1BQXdCLGlCQUFWQSxHQUFzQkEsYUFBaUJxcEcsT0FFbEQsU0FBU2twRSxFQUFVdnlLLEdBQ3RCLE1BQXdCLGtCQUFWQSxFQUVYLFNBQVN3eUssRUFBU3h5SyxHQUNyQixNQUF3QixpQkFBVkEsRUFFWCxTQUFTK3VDLEVBQVdwbUMsR0FDdkIsT0FBSTRRLE1BQU1zdkQsUUFBUWxnRSxHQUNQb21DLEVBQVdwbUMsRUFBTyxJQUV6QkEsYUFBa0I0akIsYUFDWCxVQUVGNWpCLGFBQWtCMEwsWUFBYzFMLGFBQWtCK0ssV0FDaEQsUUFFRjgrSixFQUFTN3BLLEdBQ1AsVUFFRjRILEVBQVM1SCxHQUNQLFNBRUY0cEssRUFBVTVwSyxHQUNSLE9BRUosVUFFSixTQUFTOHBLLEVBQVczbEssR0FDdkIsU0FBVUEsR0FBS0EsRUFBRTlMLGFBQWU4TCxFQUFFNU4sTUFBUTROLEVBQUUwN0YsT0FFekMsU0FBU2txRSxFQUFlL21LLEVBQU12QixHQUNqQyxJQUFLLElBQUlyTCxFQUFJcUwsRUFBT3JMLEVBQUk0TSxJQUFRNU0sRUFDNUIsR0FBSTRNLEVBQU81TSxHQUFNLEVBQ2IsT0FBT0EsRUFHZixPQUFPNE0sRUFFSixTQUFTZ2hCLEVBQWVocUIsR0FDM0IsTUFBTVUsRUFBT1YsRUFBTUUsT0FDbkIsR0FBSVEsRUFBTyxFQUNQLE1BQU8sR0FJWCxNQUFNOGQsRUFBVSxJQUFJNUgsTUFBTWxXLEVBQU8sR0FDakM4ZCxFQUFROWQsRUFBTyxHQUFLVixFQUFNVSxFQUFPLEdBQ2pDLElBQUssSUFBSXRFLEVBQUlzRSxFQUFPLEVBQUd0RSxHQUFLLElBQUtBLEVBQzdCb2lCLEVBQVFwaUIsR0FBS29pQixFQUFRcGlCLEVBQUksR0FBSzRELEVBQU01RCxFQUFJLEdBRTVDLE9BQU9vaUIsRUFFWCxTQUFTd3hKLEVBQWtCL3dJLEVBQVFqL0IsRUFBT3lSLEVBQUd3K0osR0FBWSxHQUNyRCxNQUFNbGxGLEVBQU0sSUFBSW4wRSxNQUNoQixHQUFxQixJQUFqQjVXLEVBQU1FLE9BQWMsQ0FDcEIsTUFBTXhELEVBQUlzRCxFQUFNLElBQU1pd0ssRUFBWSxFQUFJLEdBQ3RDLElBQUssSUFBSTd6SyxFQUFJLEVBQUdBLEVBQUlNLEVBQUdOLElBQ25CMnVGLEVBQUkzdUYsR0FBS3FWLEVBQUV3dEIsRUFBUzdpQyxPQUd2QixDQUNELE1BQU1NLEVBQUlzRCxFQUFNLEdBQ1Zrd0ssRUFBT2x3SyxFQUFNSyxNQUFNLEdBQ25CNm1ELEVBQU1ncEgsRUFBSy85SSxRQUFPLENBQUNnK0ksRUFBSzF6SyxJQUFNMHpLLEVBQU0xekssS0FBTXd6SyxFQUFZLEVBQUksR0FDaEUsSUFBSyxJQUFJN3pLLEVBQUksRUFBR0EsRUFBSU0sRUFBR04sSUFDbkIydUYsRUFBSTN1RixHQUFLNHpLLEVBQWtCL3dJLEVBQVM3aUMsRUFBSThxRCxFQUFLZ3BILEVBQU16K0osRUFBR3crSixHQUc5RCxPQUFPbGxGLEVBR0osU0FBUy9WLEVBQWNoMUUsRUFBT3lSLEVBQUd3K0osR0FBWSxHQUNoRCxHQUFxQixJQUFqQmp3SyxFQUFNRSxPQUVOLE9BQU91UixFQUFFLEdBRWIsTUFBTXpJLEVBQU9oSixFQUFNbXlCLFFBQU8sQ0FBQ2crSSxFQUFLMXpLLElBQU0wekssRUFBTTF6SyxLQUFNd3pLLEVBQVksRUFBSSxHQUNsRSxHQUFhLElBQVRqbkssRUFFQSxNQUFPLEdBRVgsR0FBSUEsSUFBU3lJLEVBQUV2UixPQUNYLE1BQU0sSUFBSTZFLE1BQU0sSUFBSS9FLG9DQUF3Q3lSLEVBQUV2UixTQUFTK3ZLLEVBQVksd0JBQTBCLE9BRWpILE9BQU9ELEVBQWtCLEVBQUdod0ssRUFBT3lSLEVBQUd3K0osR0FFbkMsU0FBU0csRUFBbUJwbkssRUFBTXJJLEdBQ3JDLE1BQU04akYsRUFBUXhkLEVBQW9CaitELEVBQU1ySSxHQUN4QyxJQUFLLElBQUl2RSxFQUFJLEVBQUdBLEVBQUlxb0YsRUFBTXZrRixPQUFROUQsSUFDOUJxb0YsRUFBTXJvRixHQUFLLEVBRWYsT0FBT3FvRixFQUVKLFNBQVN4ZCxFQUFvQmorRCxFQUFNckksR0FDdEMsR0FBYSxNQUFUQSxHQUEyQixZQUFWQSxHQUFpQyxjQUFWQSxFQUN4QyxPQUFPLElBQUlpcEIsYUFBYTVnQixHQUV2QixHQUFjLFVBQVZySSxFQUNMLE9BQU8sSUFBSStRLFdBQVcxSSxHQUVyQixHQUFjLFNBQVZySSxFQUNMLE9BQU8sSUFBSW9RLFdBQVcvSCxHQUd0QixNQUFNLElBQUlqRSxNQUFNLHFCQUFxQnBFLEtBUXRDLFNBQVN5MEUsRUFBMEJwMUUsRUFBT1csR0FDN0MsTUFBTXFJLEVBQU9oSixFQUFNbXlCLFFBQU8sQ0FBQ2cxSCxFQUFNN3JDLElBQVM2ckMsRUFBTzdyQyxHQUFNLEdBQ3ZELEdBQWEsTUFBVDM2RyxHQUEyQixZQUFWQSxFQUNqQixPQUFPcTBFLEVBQWNoMUUsRUFBTyxJQUFJNHBCLGFBQWE1Z0IsSUFFNUMsR0FBYyxVQUFWckksRUFDTCxPQUFPcTBFLEVBQWNoMUUsRUFBTyxJQUFJMFIsV0FBVzFJLElBRTFDLEdBQWMsU0FBVnJJLEVBQ0wsT0FBT3EwRSxFQUFjaDFFLEVBQU8sSUFBSStRLFdBQVcvSCxJQUczQyxNQUFNLElBQUlqRSxNQUFNLHFCQUFxQnBFLEtBR3RDLFNBQVMwdkssRUFBbUNyd0ssR0FDL0NBLEVBQU1uQixTQUFRdXdDLElBQ1ZudkMsRUFBT3NnRCxPQUFPazRGLFVBQVVycEcsSUFBWUEsR0FBVyxHQUFHLElBQzlDLDBFQUFVcHZDLFdBV2YsU0FBUzYwRSxFQUFXMHlGLEVBQU03bUssRUFBTThkLEdBQ25DLEdBQWEsSUFBVDlkLEVBQ0EsT0FBTyxFQUVOLEdBQWEsSUFBVEEsRUFDTCxPQUFPNm1LLEVBQUssR0FFaEIsSUFBSTlnSixFQUFROGdKLEVBQUtBLEVBQUtybkssT0FBUyxHQUMvQixJQUFLLElBQUk5RCxFQUFJLEVBQUdBLEVBQUltckssRUFBS3JuSyxPQUFTLElBQUs5RCxFQUNuQ3FxQixHQUFTakksRUFBUXBpQixHQUFLbXJLLEVBQUtuckssR0FFL0IsT0FBT3FxQixFQVVKLFNBQVNtd0QsRUFBV253RCxFQUFPL2xCLEVBQU04ZCxHQUNwQyxHQUFhLElBQVQ5ZCxFQUNBLE1BQU8sR0FFTixHQUFhLElBQVRBLEVBQ0wsTUFBTyxDQUFDK2xCLEdBRVosTUFBTThnSixFQUFPLElBQUkzd0osTUFBTWxXLEdBQ3ZCLElBQUssSUFBSXRFLEVBQUksRUFBR0EsRUFBSW1ySyxFQUFLcm5LLE9BQVMsSUFBSzlELEVBQ25DbXJLLEVBQUtuckssR0FBS21FLEtBQUsyWSxNQUFNdU4sRUFBUWpJLEVBQVFwaUIsSUFDckNxcUIsR0FBUzhnSixFQUFLbnJLLEdBQUtvaUIsRUFBUXBpQixHQUcvQixPQURBbXJLLEVBQUtBLEVBQUtybkssT0FBUyxHQUFLdW1CLEVBQ2pCOGdKLEVBT0osU0FBUytJLEVBQVV4eUssR0FPdEIsT0FBT0EsR0FBVUEsRUFBTzYxRixNQUErQixtQkFBaEI3MUYsRUFBTzYxRixLQTlwQmxELDZuRTs7Ozs2RENBQTs7QUFFQSxNQUFNLzBFLEVBQVUsUzs7OzsyRENBaEIxaUIsRUFBUTRyRyxXQXVDUixTQUFxQnlvRSxHQUNuQixJQUFJQyxFQUFPQyxFQUFRRixHQUNmRyxFQUFXRixFQUFLLEdBQ2hCRyxFQUFrQkgsRUFBSyxHQUMzQixPQUF1QyxHQUE5QkUsRUFBV0MsR0FBdUIsRUFBS0EsR0ExQ2xEejBLLEVBQVEwMEssWUFpRFIsU0FBc0JMLEdBQ3BCLElBQUlNLEVBY0F6MEssRUFiQW8wSyxFQUFPQyxFQUFRRixHQUNmRyxFQUFXRixFQUFLLEdBQ2hCRyxFQUFrQkgsRUFBSyxHQUV2QnRwSixFQUFNLElBQUk0cEosRUFWaEIsU0FBc0JQLEVBQUtHLEVBQVVDLEdBQ25DLE9BQXVDLEdBQTlCRCxFQUFXQyxHQUF1QixFQUFLQSxFQVM5QkksQ0FBWVIsRUFBS0csRUFBVUMsSUFFekNLLEVBQVUsRUFHVjlwSCxFQUFNeXBILEVBQWtCLEVBQ3hCRCxFQUFXLEVBQ1hBLEVBR0osSUFBS3QwSyxFQUFJLEVBQUdBLEVBQUk4cUQsRUFBSzlxRCxHQUFLLEVBQ3hCeTBLLEVBQ0dJLEVBQVVWLEVBQUlycEUsV0FBVzlxRyxLQUFPLEdBQ2hDNjBLLEVBQVVWLEVBQUlycEUsV0FBVzlxRyxFQUFJLEtBQU8sR0FDcEM2MEssRUFBVVYsRUFBSXJwRSxXQUFXOXFHLEVBQUksS0FBTyxFQUNyQzYwSyxFQUFVVixFQUFJcnBFLFdBQVc5cUcsRUFBSSxJQUMvQjhxQixFQUFJOHBKLEtBQWNILEdBQU8sR0FBTSxJQUMvQjNwSixFQUFJOHBKLEtBQWNILEdBQU8sRUFBSyxJQUM5QjNwSixFQUFJOHBKLEtBQW1CLElBQU5ILEVBR0ssSUFBcEJGLElBQ0ZFLEVBQ0dJLEVBQVVWLEVBQUlycEUsV0FBVzlxRyxLQUFPLEVBQ2hDNjBLLEVBQVVWLEVBQUlycEUsV0FBVzlxRyxFQUFJLEtBQU8sRUFDdkM4cUIsRUFBSThwSixLQUFtQixJQUFOSCxHQUdLLElBQXBCRixJQUNGRSxFQUNHSSxFQUFVVixFQUFJcnBFLFdBQVc5cUcsS0FBTyxHQUNoQzYwSyxFQUFVVixFQUFJcnBFLFdBQVc5cUcsRUFBSSxLQUFPLEVBQ3BDNjBLLEVBQVVWLEVBQUlycEUsV0FBVzlxRyxFQUFJLEtBQU8sRUFDdkM4cUIsRUFBSThwSixLQUFjSCxHQUFPLEVBQUssSUFDOUIzcEosRUFBSThwSixLQUFtQixJQUFOSCxHQUduQixPQUFPM3BKLEdBM0ZUaHJCLEVBQVFnMUssY0FrSFIsU0FBd0JDLEdBUXRCLElBUEEsSUFBSU4sRUFDQTNwSCxFQUFNaXFILEVBQU1qeEssT0FDWmt4SyxFQUFhbHFILEVBQU0sRUFDbkIrOEIsRUFBUSxHQUNSb3RGLEVBQWlCLE1BR1pqMUssRUFBSSxFQUFHazFLLEVBQU9wcUgsRUFBTWtxSCxFQUFZaDFLLEVBQUlrMUssRUFBTWwxSyxHQUFLaTFLLEVBQ3REcHRGLEVBQU1sbEYsS0FBS3d5SyxFQUFZSixFQUFPLzBLLEVBQUlBLEVBQUlpMUssRUFBa0JDLEVBQU9BLEVBQVFsMUssRUFBSWkxSyxJQUkxRCxJQUFmRCxHQUNGUCxFQUFNTSxFQUFNanFILEVBQU0sR0FDbEIrOEIsRUFBTWxsRixLQUNKeXlLLEVBQU9YLEdBQU8sR0FDZFcsRUFBUVgsR0FBTyxFQUFLLElBQ3BCLE9BRXNCLElBQWZPLElBQ1RQLEdBQU9NLEVBQU1qcUgsRUFBTSxJQUFNLEdBQUtpcUgsRUFBTWpxSCxFQUFNLEdBQzFDKzhCLEVBQU1sbEYsS0FDSnl5SyxFQUFPWCxHQUFPLElBQ2RXLEVBQVFYLEdBQU8sRUFBSyxJQUNwQlcsRUFBUVgsR0FBTyxFQUFLLElBQ3BCLE1BSUosT0FBTzVzRixFQUFNaGxGLEtBQUssS0F6SXBCLElBTEEsSUFBSXV5SyxFQUFTLEdBQ1RQLEVBQVksR0FDWkgsRUFBNEIsb0JBQWYvL0osV0FBNkJBLFdBQWE2RixNQUV2RDQ1RixFQUFPLG1FQUNGcDBHLEVBQUksRUFBRzhxRCxFQUFNc3BELEVBQUt0d0csT0FBUTlELEVBQUk4cUQsSUFBTzlxRCxFQUM1Q28xSyxFQUFPcDFLLEdBQUtvMEcsRUFBS3AwRyxHQUNqQjYwSyxFQUFVemdFLEVBQUt0SixXQUFXOXFHLElBQU1BLEVBUWxDLFNBQVNxMEssRUFBU0YsR0FDaEIsSUFBSXJwSCxFQUFNcXBILEVBQUlyd0ssT0FFZCxHQUFJZ25ELEVBQU0sRUFBSSxFQUNaLE1BQU0sSUFBSW5pRCxNQUFNLGtEQUtsQixJQUFJMnJLLEVBQVdILEVBQUkvNEosUUFBUSxLQU8zQixPQU5rQixJQUFkazVKLElBQWlCQSxFQUFXeHBILEdBTXpCLENBQUN3cEgsRUFKY0EsSUFBYXhwSCxFQUMvQixFQUNBLEVBQUt3cEgsRUFBVyxHQXNFdEIsU0FBU2EsRUFBYUosRUFBTzFwSyxFQUFPazdDLEdBR2xDLElBRkEsSUFBSWt1SCxFQVJvQm5uSyxFQVNwQkssRUFBUyxHQUNKM04sRUFBSXFMLEVBQU9yTCxFQUFJdW1ELEVBQUt2bUQsR0FBSyxFQUNoQ3kwSyxHQUNJTSxFQUFNLzBLLElBQU0sR0FBTSxXQUNsQiswSyxFQUFNLzBLLEVBQUksSUFBTSxFQUFLLFFBQ1AsSUFBZiswSyxFQUFNLzBLLEVBQUksSUFDYjJOLEVBQU9oTCxLQWRGeXlLLEdBRGlCOW5LLEVBZU1tbkssSUFkVCxHQUFLLElBQ3hCVyxFQUFPOW5LLEdBQU8sR0FBSyxJQUNuQjhuSyxFQUFPOW5LLEdBQU8sRUFBSSxJQUNsQjhuSyxFQUFhLEdBQU45bkssSUFhVCxPQUFPSyxFQUFPOUssS0FBSyxJQWpHckJneUssRUFBVSxJQUFJL3BFLFdBQVcsSUFBTSxHQUMvQitwRSxFQUFVLElBQUkvcEUsV0FBVyxJQUFNLEk7Ozs7NERDbkIvQjs7Ozs7OztBQVVBLElBQUl1cUUsRUFBUyxrQkFBUSxxQ0FDakJDLEVBQVUsZ0JBQVEsbUNBQ2xCeHJHLEVBQVUsZ0JBQVEsbUNBbUR0QixTQUFTeXJHLElBQ1AsT0FBTzUyQyxFQUFPNjJDLG9CQUNWLFdBQ0EsV0FHTixTQUFTMWpKLEVBQWMyakosRUFBTTN4SyxHQUMzQixHQUFJeXhLLElBQWV6eEssRUFDakIsTUFBTSxJQUFJNHhLLFdBQVcsOEJBY3ZCLE9BWkkvMkMsRUFBTzYyQyxxQkFFVEMsRUFBTyxJQUFJOWdLLFdBQVc3USxJQUNqQjZ4SyxVQUFZaDNDLEVBQU8vOEgsV0FHWCxPQUFUNnpLLElBQ0ZBLEVBQU8sSUFBSTkyQyxFQUFPNzZILElBRXBCMnhLLEVBQUszeEssT0FBU0EsR0FHVDJ4SyxFQWFULFNBQVM5MkMsRUFBUTV2QixFQUFLNm1FLEVBQWtCOXhLLEdBQ3RDLEtBQUs2NkgsRUFBTzYyQyxxQkFBeUJwekssZ0JBQWdCdThILEdBQ25ELE9BQU8sSUFBSUEsRUFBTzV2QixFQUFLNm1FLEVBQWtCOXhLLEdBSTNDLEdBQW1CLGlCQUFSaXJHLEVBQWtCLENBQzNCLEdBQWdDLGlCQUFyQjZtRSxFQUNULE1BQU0sSUFBSWp0SyxNQUNSLHFFQUdKLE9BQU9rdEssRUFBWXp6SyxLQUFNMnNHLEdBRTNCLE9BQU92cUQsRUFBS3BpRCxLQUFNMnNHLEVBQUs2bUUsRUFBa0I5eEssR0FXM0MsU0FBUzBnRCxFQUFNaXhILEVBQU14MEssRUFBTzIwSyxFQUFrQjl4SyxHQUM1QyxHQUFxQixpQkFBVjdDLEVBQ1QsTUFBTSxJQUFJc3ZKLFVBQVUseUNBR3RCLE1BQTJCLG9CQUFoQnQ2QixhQUErQmgxSCxhQUFpQmcxSCxZQTZIN0QsU0FBMEJ3L0MsRUFBTXB0RixFQUFPa04sRUFBWXp4RixHQUdqRCxHQUZBdWtGLEVBQU1xakIsV0FFRm5XLEVBQWEsR0FBS2xOLEVBQU1xakIsV0FBYW5XLEVBQ3ZDLE1BQU0sSUFBSW1nRixXQUFXLDZCQUd2QixHQUFJcnRGLEVBQU1xakIsV0FBYW5XLEdBQWN6eEYsR0FBVSxHQUM3QyxNQUFNLElBQUk0eEssV0FBVyw2QkFJckJydEYsT0FEaUJ1QyxJQUFmMkssUUFBdUMzSyxJQUFYOW1GLEVBQ3RCLElBQUk2USxXQUFXMHpFLFFBQ0h1QyxJQUFYOW1GLEVBQ0QsSUFBSTZRLFdBQVcwekUsRUFBT2tOLEdBRXRCLElBQUk1Z0YsV0FBVzB6RSxFQUFPa04sRUFBWXp4RixHQUd4QzY2SCxFQUFPNjJDLHFCQUVUQyxFQUFPcHRGLEdBQ0ZzdEYsVUFBWWgzQyxFQUFPLzhILFVBR3hCNnpLLEVBQU9LLEVBQWNMLEVBQU1wdEYsR0FFN0IsT0FBT290RixFQXZKRU0sQ0FBZ0JOLEVBQU14MEssRUFBTzIwSyxFQUFrQjl4SyxHQUduQyxpQkFBVjdDLEVBd0ZiLFNBQXFCdzBLLEVBQU05NEQsRUFBUW9yRCxHQUNULGlCQUFiQSxHQUFzQyxLQUFiQSxJQUNsQ0EsRUFBVyxRQUdiLElBQUtwcEMsRUFBT3EzQyxXQUFXak8sR0FDckIsTUFBTSxJQUFJeFgsVUFBVSw4Q0FHdEIsSUFBSXpzSixFQUF3QyxFQUEvQjRuRyxFQUFXaVIsRUFBUW9yRCxHQUc1QjVQLEdBRkpzZCxFQUFPM2pKLEVBQWEyakosRUFBTTN4SyxJQUVSNkYsTUFBTWd6RyxFQUFRb3JELEdBRTVCNVAsSUFBV3IwSixJQUliMnhLLEVBQU9BLEVBQUt4eEssTUFBTSxFQUFHazBKLElBR3ZCLE9BQU9zZCxFQTVHRXhoRCxDQUFXd2hELEVBQU14MEssRUFBTzIwSyxHQXNKbkMsU0FBcUJILEVBQU16SCxHQUN6QixHQUFJcnZDLEVBQU9zM0MsU0FBU2pJLEdBQU0sQ0FDeEIsSUFBSWxqSCxFQUE0QixFQUF0Qm9ySCxFQUFRbEksRUFBSWxxSyxRQUd0QixPQUFvQixLQUZwQjJ4SyxFQUFPM2pKLEVBQWEyakosRUFBTTNxSCxJQUVqQmhuRCxRQUlUa3FLLEVBQUltSSxLQUFLVixFQUFNLEVBQUcsRUFBRzNxSCxHQUhaMnFILEVBT1gsR0FBSXpILEVBQUssQ0FDUCxHQUE0QixvQkFBaEIvM0MsYUFDUiszQyxFQUFJNWhLLGtCQUFrQjZwSCxhQUFnQixXQUFZKzNDLEVBQ3BELE1BQTBCLGlCQUFmQSxFQUFJbHFLLFNBKzhDTHdiLEVBLzhDa0MwdUosRUFBSWxxSyxTQWc5Q3JDd2IsRUEvOENGd1MsRUFBYTJqSixFQUFNLEdBRXJCSyxFQUFjTCxFQUFNekgsR0FHN0IsR0FBaUIsV0FBYkEsRUFBSTl6SixNQUFxQjR2RCxFQUFRa2tHLEVBQUkvaUssTUFDdkMsT0FBTzZxSyxFQUFjTCxFQUFNekgsRUFBSS9pSyxNQXc4Q3JDLElBQWdCcVUsRUFwOENkLE1BQU0sSUFBSWl4SSxVQUFVLHNGQTlLYjZsQixDQUFXWCxFQUFNeDBLLEdBNEIxQixTQUFTbzFLLEVBQVl6cEssR0FDbkIsR0FBb0IsaUJBQVRBLEVBQ1QsTUFBTSxJQUFJMmpKLFVBQVUsb0NBQ2YsR0FBSTNqSixFQUFPLEVBQ2hCLE1BQU0sSUFBSThvSyxXQUFXLHdDQTRCekIsU0FBU0csRUFBYUosRUFBTTdvSyxHQUcxQixHQUZBeXBLLEVBQVd6cEssR0FDWDZvSyxFQUFPM2pKLEVBQWEyakosRUFBTTdvSyxFQUFPLEVBQUksRUFBb0IsRUFBaEJzcEssRUFBUXRwSyxLQUM1Qyt4SCxFQUFPNjJDLG9CQUNWLElBQUssSUFBSXgxSyxFQUFJLEVBQUdBLEVBQUk0TSxJQUFRNU0sRUFDMUJ5MUssRUFBS3oxSyxHQUFLLEVBR2QsT0FBT3kxSyxFQXdDVCxTQUFTSyxFQUFlTCxFQUFNcHRGLEdBQzVCLElBQUl2a0YsRUFBU3VrRixFQUFNdmtGLE9BQVMsRUFBSSxFQUE0QixFQUF4Qm95SyxFQUFRN3RGLEVBQU12a0YsUUFDbEQyeEssRUFBTzNqSixFQUFhMmpKLEVBQU0zeEssR0FDMUIsSUFBSyxJQUFJOUQsRUFBSSxFQUFHQSxFQUFJOEQsRUFBUTlELEdBQUssRUFDL0J5MUssRUFBS3oxSyxHQUFnQixJQUFYcW9GLEVBQU1yb0YsR0FFbEIsT0FBT3kxSyxFQStEVCxTQUFTUyxFQUFTcHlLLEdBR2hCLEdBQUlBLEdBQVV5eEssSUFDWixNQUFNLElBQUlHLFdBQVcsMERBQ2FILElBQWE5NUcsU0FBUyxJQUFNLFVBRWhFLE9BQWdCLEVBQVQzM0QsRUFzRlQsU0FBUzRuRyxFQUFZaVIsRUFBUW9yRCxHQUMzQixHQUFJcHBDLEVBQU9zM0MsU0FBU3Q1RCxHQUNsQixPQUFPQSxFQUFPNzRHLE9BRWhCLEdBQTJCLG9CQUFoQm15SCxhQUE2RCxtQkFBdkJBLFlBQVlxZ0QsU0FDeERyZ0QsWUFBWXFnRCxPQUFPMzVELElBQVdBLGFBQWtCc1osYUFDbkQsT0FBT3RaLEVBQU9qUixXQUVNLGlCQUFYaVIsSUFDVEEsRUFBUyxHQUFLQSxHQUdoQixJQUFJN3hELEVBQU02eEQsRUFBTzc0RyxPQUNqQixHQUFZLElBQVJnbkQsRUFBVyxPQUFPLEVBSXRCLElBREEsSUFBSXlySCxHQUFjLElBRWhCLE9BQVF4TyxHQUNOLElBQUssUUFDTCxJQUFLLFNBQ0wsSUFBSyxTQUNILE9BQU9qOUcsRUFDVCxJQUFLLE9BQ0wsSUFBSyxRQUNMLFVBQUs4L0IsRUFDSCxPQUFPNHJGLEVBQVk3NUQsR0FBUTc0RyxPQUM3QixJQUFLLE9BQ0wsSUFBSyxRQUNMLElBQUssVUFDTCxJQUFLLFdBQ0gsT0FBYSxFQUFOZ25ELEVBQ1QsSUFBSyxNQUNILE9BQU9BLElBQVEsRUFDakIsSUFBSyxTQUNILE9BQU8yckgsRUFBYzk1RCxHQUFRNzRHLE9BQy9CLFFBQ0UsR0FBSXl5SyxFQUFhLE9BQU9DLEVBQVk3NUQsR0FBUTc0RyxPQUM1Q2lrSyxHQUFZLEdBQUtBLEdBQVVuMkMsY0FDM0Iya0QsR0FBYyxHQU10QixTQUFTRyxFQUFjM08sRUFBVTE4SixFQUFPazdDLEdBQ3RDLElBQUlnd0gsR0FBYyxFQWNsQixTQUxjM3JGLElBQVZ2L0UsR0FBdUJBLEVBQVEsS0FDakNBLEVBQVEsR0FJTkEsRUFBUWpKLEtBQUswQixPQUNmLE1BQU8sR0FPVCxTQUpZOG1GLElBQVJya0MsR0FBcUJBLEVBQU1ua0QsS0FBSzBCLFVBQ2xDeWlELEVBQU1ua0QsS0FBSzBCLFFBR1R5aUQsR0FBTyxFQUNULE1BQU8sR0FPVCxJQUhBQSxLQUFTLEtBQ1RsN0MsS0FBVyxHQUdULE1BQU8sR0FLVCxJQUZLMDhKLElBQVVBLEVBQVcsVUFHeEIsT0FBUUEsR0FDTixJQUFLLE1BQ0gsT0FBTzRPLEVBQVN2MEssS0FBTWlKLEVBQU9rN0MsR0FFL0IsSUFBSyxPQUNMLElBQUssUUFDSCxPQUFPcXdILEVBQVV4MEssS0FBTWlKLEVBQU9rN0MsR0FFaEMsSUFBSyxRQUNILE9BQU9zd0gsRUFBV3owSyxLQUFNaUosRUFBT2s3QyxHQUVqQyxJQUFLLFNBQ0wsSUFBSyxTQUNILE9BQU91d0gsRUFBWTEwSyxLQUFNaUosRUFBT2s3QyxHQUVsQyxJQUFLLFNBQ0gsT0FBT3d3SCxFQUFZMzBLLEtBQU1pSixFQUFPazdDLEdBRWxDLElBQUssT0FDTCxJQUFLLFFBQ0wsSUFBSyxVQUNMLElBQUssV0FDSCxPQUFPeXdILEVBQWE1MEssS0FBTWlKLEVBQU9rN0MsR0FFbkMsUUFDRSxHQUFJZ3dILEVBQWEsTUFBTSxJQUFJaG1CLFVBQVUscUJBQXVCd1gsR0FDNURBLEdBQVlBLEVBQVcsSUFBSW4yQyxjQUMzQjJrRCxHQUFjLEdBU3RCLFNBQVMvdEYsRUFBTTF6RCxFQUFHcnpCLEVBQUdyQixHQUNuQixJQUFJSixFQUFJODBCLEVBQUVyekIsR0FDVnF6QixFQUFFcnpCLEdBQUtxekIsRUFBRTEwQixHQUNUMDBCLEVBQUUxMEIsR0FBS0osRUFtSVQsU0FBU2kzSyxFQUFzQjdxSyxFQUFRa1QsRUFBS2kyRSxFQUFZd3lFLEVBQVVyOUcsR0FFaEUsR0FBc0IsSUFBbEJ0K0MsRUFBT3RJLE9BQWMsT0FBUSxFQW1CakMsR0FoQjBCLGlCQUFmeXhGLEdBQ1R3eUUsRUFBV3h5RSxFQUNYQSxFQUFhLEdBQ0pBLEVBQWEsV0FDdEJBLEVBQWEsV0FDSkEsR0FBYyxhQUN2QkEsR0FBYyxZQUVoQkEsR0FBY0EsRUFDVnBoRCxNQUFNb2hELEtBRVJBLEVBQWE3cUMsRUFBTSxFQUFLdCtDLEVBQU90SSxPQUFTLEdBSXRDeXhGLEVBQWEsSUFBR0EsRUFBYW5wRixFQUFPdEksT0FBU3l4RixHQUM3Q0EsR0FBY25wRixFQUFPdEksT0FBUSxDQUMvQixHQUFJNG1ELEVBQUssT0FBUSxFQUNaNnFDLEVBQWFucEYsRUFBT3RJLE9BQVMsT0FDN0IsR0FBSXl4RixFQUFhLEVBQUcsQ0FDekIsSUFBSTdxQyxFQUNDLE9BQVEsRUFESjZxQyxFQUFhLEVBVXhCLEdBTG1CLGlCQUFSajJFLElBQ1RBLEVBQU1xL0csRUFBT242RSxLQUFLbGxDLEVBQUt5b0osSUFJckJwcEMsRUFBT3MzQyxTQUFTMzJKLEdBRWxCLE9BQW1CLElBQWZBLEVBQUl4YixRQUNFLEVBRUhvekssRUFBYTlxSyxFQUFRa1QsRUFBS2kyRSxFQUFZd3lFLEVBQVVyOUcsR0FDbEQsR0FBbUIsaUJBQVJwckMsRUFFaEIsT0FEQUEsR0FBWSxJQUNScS9HLEVBQU82MkMscUJBQ2lDLG1CQUFqQzdnSyxXQUFXL1MsVUFBVXdaLFFBQzFCc3ZDLEVBQ0svMUMsV0FBVy9TLFVBQVV3WixRQUFRamIsS0FBS2lNLEVBQVFrVCxFQUFLaTJFLEdBRS9DNWdGLFdBQVcvUyxVQUFVMGxHLFlBQVlubkcsS0FBS2lNLEVBQVFrVCxFQUFLaTJFLEdBR3ZEMmhGLEVBQWE5cUssRUFBUSxDQUFFa1QsR0FBT2kyRSxFQUFZd3lFLEVBQVVyOUcsR0FHN0QsTUFBTSxJQUFJNmxHLFVBQVUsd0NBR3RCLFNBQVMybUIsRUFBY3BzSixFQUFLeEwsRUFBS2kyRSxFQUFZd3lFLEVBQVVyOUcsR0FDckQsSUEwQkkxcUQsRUExQkFtM0ssRUFBWSxFQUNaQyxFQUFZdHNKLEVBQUlobkIsT0FDaEJ1ekssRUFBWS8zSixFQUFJeGIsT0FFcEIsUUFBaUI4bUYsSUFBYm05RSxJQUVlLFVBRGpCQSxFQUFXejlELE9BQU95OUQsR0FBVW4yQyxnQkFDWSxVQUFibTJDLEdBQ1YsWUFBYkEsR0FBdUMsYUFBYkEsR0FBeUIsQ0FDckQsR0FBSWo5SSxFQUFJaG5CLE9BQVMsR0FBS3diLEVBQUl4YixPQUFTLEVBQ2pDLE9BQVEsRUFFVnF6SyxFQUFZLEVBQ1pDLEdBQWEsRUFDYkMsR0FBYSxFQUNiOWhGLEdBQWMsRUFJbEIsU0FBU3RwRixFQUFNdTlDLEVBQUt4cEQsR0FDbEIsT0FBa0IsSUFBZG0zSyxFQUNLM3RILEVBQUl4cEQsR0FFSndwRCxFQUFJOHRILGFBQWF0M0ssRUFBSW0zSyxHQUtoQyxHQUFJenNILEVBQUssQ0FDUCxJQUFJNnNILEdBQWMsRUFDbEIsSUFBS3YzSyxFQUFJdTFGLEVBQVl2MUYsRUFBSW8zSyxFQUFXcDNLLElBQ2xDLEdBQUlpTSxFQUFLNmUsRUFBSzlxQixLQUFPaU0sRUFBS3FULEdBQXFCLElBQWhCaTRKLEVBQW9CLEVBQUl2M0ssRUFBSXUzSyxJQUV6RCxJQURvQixJQUFoQkEsSUFBbUJBLEVBQWF2M0ssR0FDaENBLEVBQUl1M0ssRUFBYSxJQUFNRixFQUFXLE9BQU9FLEVBQWFKLE9BRXRDLElBQWhCSSxJQUFtQnYzSyxHQUFLQSxFQUFJdTNLLEdBQ2hDQSxHQUFjLE9BS2xCLElBREloaUYsRUFBYThoRixFQUFZRCxJQUFXN2hGLEVBQWE2aEYsRUFBWUMsR0FDNURyM0ssRUFBSXUxRixFQUFZdjFGLEdBQUssRUFBR0EsSUFBSyxDQUVoQyxJQURBLElBQUlrbUgsR0FBUSxFQUNIbjJELEVBQUksRUFBR0EsRUFBSXNuSCxFQUFXdG5ILElBQzdCLEdBQUk5akQsRUFBSzZlLEVBQUs5cUIsRUFBSSt2RCxLQUFPOWpELEVBQUtxVCxFQUFLeXdDLEdBQUksQ0FDckNtMkQsR0FBUSxFQUNSLE1BR0osR0FBSUEsRUFBTyxPQUFPbG1ILEVBSXRCLE9BQVEsRUFlVixTQUFTdzNLLEVBQVVodUgsRUFBS216RCxFQUFROTVFLEVBQVEvK0IsR0FDdEMrK0IsRUFBU3NoQixPQUFPdGhCLElBQVcsRUFDM0IsSUFBSTQwSSxFQUFZanVILEVBQUkxbEQsT0FBUysrQixFQUN4Qi8rQixHQUdIQSxFQUFTcWdELE9BQU9yZ0QsSUFDSDJ6SyxJQUNYM3pLLEVBQVMyekssR0FKWDN6SyxFQUFTMnpLLEVBU1gsSUFBSUMsRUFBUy82RCxFQUFPNzRHLE9BQ3BCLEdBQUk0ekssRUFBUyxHQUFNLEVBQUcsTUFBTSxJQUFJbm5CLFVBQVUsc0JBRXRDenNKLEVBQVM0ekssRUFBUyxJQUNwQjV6SyxFQUFTNHpLLEVBQVMsR0FFcEIsSUFBSyxJQUFJMTNLLEVBQUksRUFBR0EsRUFBSThELElBQVU5RCxFQUFHLENBQy9CLElBQUkyM0ssRUFBU0MsU0FBU2o3RCxFQUFPdFYsT0FBVyxFQUFKcm5HLEVBQU8sR0FBSSxJQUMvQyxHQUFJbTBDLE1BQU13akksR0FBUyxPQUFPMzNLLEVBQzFCd3BELEVBQUkzbUIsRUFBUzdpQyxHQUFLMjNLLEVBRXBCLE9BQU8zM0ssRUFHVCxTQUFTNjNLLEVBQVdydUgsRUFBS216RCxFQUFROTVFLEVBQVEvK0IsR0FDdkMsT0FBT2cwSyxFQUFXdEIsRUFBWTc1RCxFQUFRbnpELEVBQUkxbEQsT0FBUysrQixHQUFTMm1CLEVBQUszbUIsRUFBUS8rQixHQUczRSxTQUFTaTBLLEVBQVl2dUgsRUFBS216RCxFQUFROTVFLEVBQVEvK0IsR0FDeEMsT0FBT2cwSyxFQXE2QlQsU0FBdUJqeEYsR0FFckIsSUFEQSxJQUFJbXhGLEVBQVksR0FDUGg0SyxFQUFJLEVBQUdBLEVBQUk2bUYsRUFBSS9pRixTQUFVOUQsRUFFaENnNEssRUFBVXIxSyxLQUF5QixJQUFwQmtrRixFQUFJaWtCLFdBQVc5cUcsSUFFaEMsT0FBT2c0SyxFQTM2QldDLENBQWF0N0QsR0FBU256RCxFQUFLM21CLEVBQVEvK0IsR0FHdkQsU0FBU28wSyxFQUFhMXVILEVBQUttekQsRUFBUTk1RSxFQUFRLytCLEdBQ3pDLE9BQU9pMEssRUFBV3Z1SCxFQUFLbXpELEVBQVE5NUUsRUFBUS8rQixHQUd6QyxTQUFTcTBLLEVBQWEzdUgsRUFBS216RCxFQUFROTVFLEVBQVEvK0IsR0FDekMsT0FBT2cwSyxFQUFXckIsRUFBYzk1RCxHQUFTbnpELEVBQUszbUIsRUFBUS8rQixHQUd4RCxTQUFTczBLLEVBQVc1dUgsRUFBS216RCxFQUFROTVFLEVBQVEvK0IsR0FDdkMsT0FBT2cwSyxFQWs2QlQsU0FBeUJqeEYsRUFBS3d4RixHQUc1QixJQUZBLElBQUloNEssRUFBR2k0SyxFQUFJQyxFQUNQUCxFQUFZLEdBQ1BoNEssRUFBSSxFQUFHQSxFQUFJNm1GLEVBQUkvaUYsV0FDakJ1MEssR0FBUyxHQUFLLEtBRGFyNEssRUFJaENzNEssR0FEQWo0SyxFQUFJd21GLEVBQUlpa0IsV0FBVzlxRyxLQUNULEVBQ1Z1NEssRUFBS2w0SyxFQUFJLElBQ1QyM0ssRUFBVXIxSyxLQUFLNDFLLEdBQ2ZQLEVBQVVyMUssS0FBSzIxSyxHQUdqQixPQUFPTixFQS82QldRLENBQWU3N0QsRUFBUW56RCxFQUFJMWxELE9BQVMrK0IsR0FBUzJtQixFQUFLM21CLEVBQVEvK0IsR0FrRjlFLFNBQVNpekssRUFBYXZ0SCxFQUFLbitDLEVBQU9rN0MsR0FDaEMsT0FBYyxJQUFWbDdDLEdBQWVrN0MsSUFBUWlELEVBQUkxbEQsT0FDdEJ1eEssRUFBT1AsY0FBY3RySCxHQUVyQjZySCxFQUFPUCxjQUFjdHJILEVBQUl2bEQsTUFBTW9ILEVBQU9rN0MsSUFJakQsU0FBU3F3SCxFQUFXcHRILEVBQUtuK0MsRUFBT2s3QyxHQUM5QkEsRUFBTXBpRCxLQUFLcTBDLElBQUlnUixFQUFJMWxELE9BQVF5aUQsR0FJM0IsSUFIQSxJQUFJeDdDLEVBQU0sR0FFTi9LLEVBQUlxTCxFQUNEckwsRUFBSXVtRCxHQUFLLENBQ2QsSUFRTWt5SCxFQUFZQyxFQUFXQyxFQUFZQyxFQVJyQ0MsRUFBWXJ2SCxFQUFJeHBELEdBQ2hCODRLLEVBQVksS0FDWkMsRUFBb0JGLEVBQVksSUFBUSxFQUN2Q0EsRUFBWSxJQUFRLEVBQ3BCQSxFQUFZLElBQVEsRUFDckIsRUFFSixHQUFJNzRLLEVBQUkrNEssR0FBb0J4eUgsRUFHMUIsT0FBUXd5SCxHQUNOLEtBQUssRUFDQ0YsRUFBWSxNQUNkQyxFQUFZRCxHQUVkLE1BQ0YsS0FBSyxFQUV5QixNQUFWLEtBRGxCSixFQUFhanZILEVBQUl4cEQsRUFBSSxPQUVuQjQ0SyxHQUE2QixHQUFaQyxJQUFxQixFQUFvQixHQUFiSixHQUN6QixNQUNsQkssRUFBWUYsR0FHaEIsTUFDRixLQUFLLEVBQ0hILEVBQWFqdkgsRUFBSXhwRCxFQUFJLEdBQ3JCMDRLLEVBQVlsdkgsRUFBSXhwRCxFQUFJLEdBQ1EsTUFBVixJQUFieTRLLElBQXNELE1BQVYsSUFBWkMsS0FDbkNFLEdBQTZCLEdBQVpDLElBQW9CLElBQW9CLEdBQWJKLElBQXNCLEVBQW1CLEdBQVpDLEdBQ3JELE9BQVVFLEVBQWdCLE9BQVVBLEVBQWdCLFNBQ3RFRSxFQUFZRixHQUdoQixNQUNGLEtBQUssRUFDSEgsRUFBYWp2SCxFQUFJeHBELEVBQUksR0FDckIwNEssRUFBWWx2SCxFQUFJeHBELEVBQUksR0FDcEIyNEssRUFBYW52SCxFQUFJeHBELEVBQUksR0FDTyxNQUFWLElBQWJ5NEssSUFBc0QsTUFBVixJQUFaQyxJQUFzRCxNQUFWLElBQWJDLEtBQ2xFQyxHQUE2QixHQUFaQyxJQUFvQixJQUFxQixHQUFiSixJQUFzQixJQUFtQixHQUFaQyxJQUFxQixFQUFvQixHQUFiQyxHQUNsRixPQUFVQyxFQUFnQixVQUM1Q0UsRUFBWUYsR0FNSixPQUFkRSxHQUdGQSxFQUFZLE1BQ1pDLEVBQW1CLEdBQ1ZELEVBQVksUUFFckJBLEdBQWEsTUFDYi90SyxFQUFJcEksS0FBS20ySyxJQUFjLEdBQUssS0FBUSxPQUNwQ0EsRUFBWSxNQUFxQixLQUFaQSxHQUd2Qi90SyxFQUFJcEksS0FBS20ySyxHQUNUOTRLLEdBQUsrNEssRUFHUCxPQVFGLFNBQWdDQyxHQUM5QixJQUFJbHVILEVBQU1rdUgsRUFBV2wxSyxPQUNyQixHQUFJZ25ELEdBQU9tdUgsRUFDVCxPQUFPM3VFLE9BQU9DLGFBQWFkLE1BQU1hLE9BQVEwdUUsR0FJM0MsSUFBSWp1SyxFQUFNLEdBQ04vSyxFQUFJLEVBQ1IsS0FBT0EsRUFBSThxRCxHQUNULy9DLEdBQU91L0YsT0FBT0MsYUFBYWQsTUFDekJhLE9BQ0EwdUUsRUFBVy8wSyxNQUFNakUsRUFBR0EsR0FBS2k1SyxJQUc3QixPQUFPbHVLLEVBdkJBbXVLLENBQXNCbnVLLEdBOThCL0JqTCxFQUFRNitILE9BQVNBLEVBQ2pCNytILEVBQVFxNUssV0FvVFIsU0FBcUJyMUssSUFDZEEsR0FBVUEsSUFDYkEsRUFBUyxHQUVYLE9BQU82NkgsRUFBT3k2QyxPQUFPdDFLLElBdlR2QmhFLEVBQVF1NUssa0JBQW9CLEdBMEI1QjE2QyxFQUFPNjJDLHlCQUFxRDVxRixJQUEvQjFoRixFQUFPc3NLLG9CQUNoQ3RzSyxFQUFPc3NLLG9CQVFYLFdBQ0UsSUFDRSxJQUFJMXFKLEVBQU0sSUFBSW5XLFdBQVcsR0FFekIsT0FEQW1XLEVBQUk2cUosVUFBWSxDQUFDQSxVQUFXaGhLLFdBQVcvUyxVQUFXMDNLLElBQUssV0FBYyxPQUFPLEtBQ3ZELEtBQWR4dUosRUFBSXd1SixPQUNpQixtQkFBakJ4dUosRUFBSXJkLFVBQ3VCLElBQWxDcWQsRUFBSXJkLFNBQVMsRUFBRyxHQUFHaStGLFdBQ3ZCLE1BQU85cUQsR0FDUCxPQUFPLEdBZlAyNEgsR0FLSno1SyxFQUFReTFLLFdBQWFBLElBa0VyQjUyQyxFQUFPNjZDLFNBQVcsS0FHbEI3NkMsRUFBTzg2QyxTQUFXLFNBQVUzdUosR0FFMUIsT0FEQUEsRUFBSTZxSixVQUFZaDNDLEVBQU8vOEgsVUFDaEJrcEIsR0EyQlQ2ekcsRUFBT242RSxLQUFPLFNBQVV2akQsRUFBTzIwSyxFQUFrQjl4SyxHQUMvQyxPQUFPMGdELEVBQUssS0FBTXZqRCxFQUFPMjBLLEVBQWtCOXhLLElBR3pDNjZILEVBQU82MkMsc0JBQ1Q3MkMsRUFBTy84SCxVQUFVK3pLLFVBQVloaEssV0FBVy9TLFVBQ3hDKzhILEVBQU9nM0MsVUFBWWhoSyxXQUNHLG9CQUFYNVQsUUFBMEJBLE9BQU8yNEssU0FDeEMvNkMsRUFBTzU5SCxPQUFPMjRLLFdBQWEvNkMsR0FFN0JqK0gsT0FBT0MsZUFBZWcrSCxFQUFRNTlILE9BQU8yNEssUUFBUyxDQUM1Q3o0SyxNQUFPLEtBQ1A2eEosY0FBYyxLQWlDcEJuMEIsRUFBT3k2QyxNQUFRLFNBQVV4c0ssRUFBTW1qQyxFQUFNZzRILEdBQ25DLE9BckJGLFNBQWdCME4sRUFBTTdvSyxFQUFNbWpDLEVBQU1nNEgsR0FFaEMsT0FEQXNPLEVBQVd6cEssR0FDUEEsR0FBUSxFQUNIa2xCLEVBQWEyakosRUFBTTdvSyxRQUVmZytFLElBQVQ3NkMsRUFJeUIsaUJBQWJnNEgsRUFDVmoySSxFQUFhMmpKLEVBQU03b0ssR0FBTW1qQyxLQUFLQSxFQUFNZzRILEdBQ3BDajJJLEVBQWEyakosRUFBTTdvSyxHQUFNbWpDLEtBQUtBLEdBRTdCamUsRUFBYTJqSixFQUFNN29LLEdBUW5Cd3NLLENBQU0sS0FBTXhzSyxFQUFNbWpDLEVBQU1nNEgsSUFpQmpDcHBDLEVBQU9rM0MsWUFBYyxTQUFVanBLLEdBQzdCLE9BQU9pcEssRUFBWSxLQUFNanBLLElBSzNCK3hILEVBQU9nN0MsZ0JBQWtCLFNBQVUvc0ssR0FDakMsT0FBT2lwSyxFQUFZLEtBQU1qcEssSUFpSDNCK3hILEVBQU9zM0MsU0FBVyxTQUFtQm5oSixHQUNuQyxRQUFlLE1BQUxBLElBQWFBLEVBQUU4a0osWUFHM0JqN0MsRUFBT2s3QyxRQUFVLFNBQWtCeGtLLEVBQUd5ZixHQUNwQyxJQUFLNnBHLEVBQU9zM0MsU0FBUzVnSyxLQUFPc3BILEVBQU9zM0MsU0FBU25oSixHQUMxQyxNQUFNLElBQUl5N0gsVUFBVSw2QkFHdEIsR0FBSWw3SSxJQUFNeWYsRUFBRyxPQUFPLEVBS3BCLElBSEEsSUFBSS92QixFQUFJc1EsRUFBRXZSLE9BQ04rbUIsRUFBSWlLLEVBQUVoeEIsT0FFRDlELEVBQUksRUFBRzhxRCxFQUFNM21ELEtBQUtxMEMsSUFBSXp6QyxFQUFHOGxCLEdBQUk3cUIsRUFBSThxRCxJQUFPOXFELEVBQy9DLEdBQUlxVixFQUFFclYsS0FBTzgwQixFQUFFOTBCLEdBQUksQ0FDakIrRSxFQUFJc1EsRUFBRXJWLEdBQ042cUIsRUFBSWlLLEVBQUU5MEIsR0FDTixNQUlKLE9BQUkrRSxFQUFJOGxCLEdBQVcsRUFDZkEsRUFBSTlsQixFQUFVLEVBQ1gsR0FHVDQ1SCxFQUFPcTNDLFdBQWEsU0FBcUJqTyxHQUN2QyxPQUFRejlELE9BQU95OUQsR0FBVW4yQyxlQUN2QixJQUFLLE1BQ0wsSUFBSyxPQUNMLElBQUssUUFDTCxJQUFLLFFBQ0wsSUFBSyxTQUNMLElBQUssU0FDTCxJQUFLLFNBQ0wsSUFBSyxPQUNMLElBQUssUUFDTCxJQUFLLFVBQ0wsSUFBSyxXQUNILE9BQU8sRUFDVCxRQUNFLE9BQU8sSUFJYitNLEVBQU8xNUgsT0FBUyxTQUFpQjRvSyxFQUFNL3BLLEdBQ3JDLElBQUtnbUUsRUFBUStqRyxHQUNYLE1BQU0sSUFBSXRkLFVBQVUsK0NBR3RCLEdBQW9CLElBQWhCc2QsRUFBSy9wSyxPQUNQLE9BQU82NkgsRUFBT3k2QyxNQUFNLEdBR3RCLElBQUlwNUssRUFDSixRQUFlNHFGLElBQVg5bUYsRUFFRixJQURBQSxFQUFTLEVBQ0o5RCxFQUFJLEVBQUdBLEVBQUk2dEssRUFBSy9wSyxTQUFVOUQsRUFDN0I4RCxHQUFVK3BLLEVBQUs3dEssR0FBRzhELE9BSXRCLElBQUlzSSxFQUFTdXlILEVBQU9rM0MsWUFBWS94SyxHQUM1QmcySyxFQUFNLEVBQ1YsSUFBSzk1SyxFQUFJLEVBQUdBLEVBQUk2dEssRUFBSy9wSyxTQUFVOUQsRUFBRyxDQUNoQyxJQUFJd3BELEVBQU1xa0gsRUFBSzd0SyxHQUNmLElBQUsyK0gsRUFBT3MzQyxTQUFTenNILEdBQ25CLE1BQU0sSUFBSSttRyxVQUFVLCtDQUV0Qi9tRyxFQUFJMnNILEtBQUsvcEssRUFBUTB0SyxHQUNqQkEsR0FBT3R3SCxFQUFJMWxELE9BRWIsT0FBT3NJLEdBOENUdXlILEVBQU9qekIsV0FBYUEsRUEwRXBCaXpCLEVBQU8vOEgsVUFBVWc0SyxXQUFZLEVBUTdCajdDLEVBQU8vOEgsVUFBVW00SyxPQUFTLFdBQ3hCLElBQUlqdkgsRUFBTTFvRCxLQUFLMEIsT0FDZixHQUFJZ25ELEVBQU0sR0FBTSxFQUNkLE1BQU0sSUFBSTRxSCxXQUFXLDZDQUV2QixJQUFLLElBQUkxMUssRUFBSSxFQUFHQSxFQUFJOHFELEVBQUs5cUQsR0FBSyxFQUM1QndvRixFQUFLcG1GLEtBQU1wQyxFQUFHQSxFQUFJLEdBRXBCLE9BQU9vQyxNQUdUdThILEVBQU8vOEgsVUFBVW80SyxPQUFTLFdBQ3hCLElBQUlsdkgsRUFBTTFvRCxLQUFLMEIsT0FDZixHQUFJZ25ELEVBQU0sR0FBTSxFQUNkLE1BQU0sSUFBSTRxSCxXQUFXLDZDQUV2QixJQUFLLElBQUkxMUssRUFBSSxFQUFHQSxFQUFJOHFELEVBQUs5cUQsR0FBSyxFQUM1QndvRixFQUFLcG1GLEtBQU1wQyxFQUFHQSxFQUFJLEdBQ2xCd29GLEVBQUtwbUYsS0FBTXBDLEVBQUksRUFBR0EsRUFBSSxHQUV4QixPQUFPb0MsTUFHVHU4SCxFQUFPLzhILFVBQVVxNEssT0FBUyxXQUN4QixJQUFJbnZILEVBQU0xb0QsS0FBSzBCLE9BQ2YsR0FBSWduRCxFQUFNLEdBQU0sRUFDZCxNQUFNLElBQUk0cUgsV0FBVyw2Q0FFdkIsSUFBSyxJQUFJMTFLLEVBQUksRUFBR0EsRUFBSThxRCxFQUFLOXFELEdBQUssRUFDNUJ3b0YsRUFBS3BtRixLQUFNcEMsRUFBR0EsRUFBSSxHQUNsQndvRixFQUFLcG1GLEtBQU1wQyxFQUFJLEVBQUdBLEVBQUksR0FDdEJ3b0YsRUFBS3BtRixLQUFNcEMsRUFBSSxFQUFHQSxFQUFJLEdBQ3RCd29GLEVBQUtwbUYsS0FBTXBDLEVBQUksRUFBR0EsRUFBSSxHQUV4QixPQUFPb0MsTUFHVHU4SCxFQUFPLzhILFVBQVU2NUQsU0FBVyxXQUMxQixJQUFJMzNELEVBQXVCLEVBQWQxQixLQUFLMEIsT0FDbEIsT0FBZSxJQUFYQSxFQUFxQixHQUNBLElBQXJCZ2pHLFVBQVVoakcsT0FBcUI4eUssRUFBVXgwSyxLQUFNLEVBQUcwQixHQUMvQzR5SyxFQUFhanRFLE1BQU1ybkcsS0FBTTBrRyxZQUdsQzYzQixFQUFPLzhILFVBQVVzNEssT0FBUyxTQUFpQnBsSixHQUN6QyxJQUFLNnBHLEVBQU9zM0MsU0FBU25oSixHQUFJLE1BQU0sSUFBSXk3SCxVQUFVLDZCQUM3QyxPQUFJbnVKLE9BQVMweUIsR0FDc0IsSUFBNUI2cEcsRUFBT2s3QyxRQUFRejNLLEtBQU0weUIsSUFHOUI2cEcsRUFBTy84SCxVQUFVdTRLLFFBQVUsV0FDekIsSUFBSXR6RixFQUFNLEdBQ05obEQsRUFBTS9oQyxFQUFRdTVLLGtCQUtsQixPQUpJajNLLEtBQUswQixPQUFTLElBQ2hCK2lGLEVBQU16a0YsS0FBS3E1RCxTQUFTLE1BQU8sRUFBRzU1QixHQUFLbzRGLE1BQU0sU0FBU3AzSCxLQUFLLEtBQ25EVCxLQUFLMEIsT0FBUys5QixJQUFLZ2xELEdBQU8sVUFFekIsV0FBYUEsRUFBTSxLQUc1QjgzQyxFQUFPLzhILFVBQVVpNEssUUFBVSxTQUFrQnBuRSxFQUFRcG5HLEVBQU9rN0MsRUFBSzZ6SCxFQUFXQyxHQUMxRSxJQUFLMTdDLEVBQU9zM0MsU0FBU3hqRSxHQUNuQixNQUFNLElBQUk4OUMsVUFBVSw2QkFnQnRCLFFBYmMzbEUsSUFBVnYvRSxJQUNGQSxFQUFRLFFBRUV1L0UsSUFBUnJrQyxJQUNGQSxFQUFNa3NELEVBQVNBLEVBQU8zdUcsT0FBUyxRQUVmOG1GLElBQWR3dkYsSUFDRkEsRUFBWSxRQUVFeHZGLElBQVp5dkYsSUFDRkEsRUFBVWo0SyxLQUFLMEIsUUFHYnVILEVBQVEsR0FBS2s3QyxFQUFNa3NELEVBQU8zdUcsUUFBVXMySyxFQUFZLEdBQUtDLEVBQVVqNEssS0FBSzBCLE9BQ3RFLE1BQU0sSUFBSTR4SyxXQUFXLHNCQUd2QixHQUFJMEUsR0FBYUMsR0FBV2h2SyxHQUFTazdDLEVBQ25DLE9BQU8sRUFFVCxHQUFJNnpILEdBQWFDLEVBQ2YsT0FBUSxFQUVWLEdBQUlodkssR0FBU2s3QyxFQUNYLE9BQU8sRUFRVCxHQUFJbmtELE9BQVNxd0csRUFBUSxPQUFPLEVBUzVCLElBUEEsSUFBSTF0RyxHQUpKczFLLEtBQWEsSUFEYkQsS0FBZSxHQU1YdnZKLEdBUEowN0IsS0FBUyxJQURUbDdDLEtBQVcsR0FTUHkvQyxFQUFNM21ELEtBQUtxMEMsSUFBSXp6QyxFQUFHOGxCLEdBRWxCeXZKLEVBQVdsNEssS0FBSzZCLE1BQU1tMkssRUFBV0MsR0FDakNFLEVBQWE5bkUsRUFBT3h1RyxNQUFNb0gsRUFBT2s3QyxHQUU1QnZtRCxFQUFJLEVBQUdBLEVBQUk4cUQsSUFBTzlxRCxFQUN6QixHQUFJczZLLEVBQVN0NkssS0FBT3U2SyxFQUFXdjZLLEdBQUksQ0FDakMrRSxFQUFJdTFLLEVBQVN0NkssR0FDYjZxQixFQUFJMHZKLEVBQVd2NkssR0FDZixNQUlKLE9BQUkrRSxFQUFJOGxCLEdBQVcsRUFDZkEsRUFBSTlsQixFQUFVLEVBQ1gsR0E2SFQ0NUgsRUFBTy84SCxVQUFVNDRLLFNBQVcsU0FBbUJsN0osRUFBS2kyRSxFQUFZd3lFLEdBQzlELE9BQW9ELElBQTdDM2xLLEtBQUtnWixRQUFRa0UsRUFBS2kyRSxFQUFZd3lFLElBR3ZDcHBDLEVBQU8vOEgsVUFBVXdaLFFBQVUsU0FBa0JrRSxFQUFLaTJFLEVBQVl3eUUsR0FDNUQsT0FBT2tQLEVBQXFCNzBLLEtBQU1rZCxFQUFLaTJFLEVBQVl3eUUsR0FBVSxJQUcvRHBwQyxFQUFPLzhILFVBQVUwbEcsWUFBYyxTQUFzQmhvRixFQUFLaTJFLEVBQVl3eUUsR0FDcEUsT0FBT2tQLEVBQXFCNzBLLEtBQU1rZCxFQUFLaTJFLEVBQVl3eUUsR0FBVSxJQWtEL0RwcEMsRUFBTy84SCxVQUFVK0gsTUFBUSxTQUFnQmd6RyxFQUFROTVFLEVBQVEvK0IsRUFBUWlrSyxHQUUvRCxRQUFlbjlFLElBQVgvbkQsRUFDRmtsSSxFQUFXLE9BQ1hqa0ssRUFBUzFCLEtBQUswQixPQUNkKytCLEVBQVMsT0FFSixRQUFlK25ELElBQVg5bUYsR0FBMEMsaUJBQVgrK0IsRUFDeENrbEksRUFBV2xsSSxFQUNYLytCLEVBQVMxQixLQUFLMEIsT0FDZCsrQixFQUFTLE1BRUosS0FBSWtSLFNBQVNsUixHQVdsQixNQUFNLElBQUlsNkIsTUFDUiwyRUFYRms2QixHQUFrQixFQUNka1IsU0FBU2p3QyxJQUNYQSxHQUFrQixPQUNEOG1GLElBQWJtOUUsSUFBd0JBLEVBQVcsVUFFdkNBLEVBQVdqa0ssRUFDWEEsT0FBUzhtRixHQVNiLElBQUk2c0YsRUFBWXIxSyxLQUFLMEIsT0FBUysrQixFQUc5QixTQUZlK25ELElBQVg5bUYsR0FBd0JBLEVBQVMyekssS0FBVzN6SyxFQUFTMnpLLEdBRXBEOTZELEVBQU83NEcsT0FBUyxJQUFNQSxFQUFTLEdBQUsrK0IsRUFBUyxJQUFPQSxFQUFTemdDLEtBQUswQixPQUNyRSxNQUFNLElBQUk0eEssV0FBVywwQ0FHbEIzTixJQUFVQSxFQUFXLFFBRzFCLElBREEsSUFBSXdPLEdBQWMsSUFFaEIsT0FBUXhPLEdBQ04sSUFBSyxNQUNILE9BQU95UCxFQUFTcDFLLEtBQU11NkcsRUFBUTk1RSxFQUFRLytCLEdBRXhDLElBQUssT0FDTCxJQUFLLFFBQ0gsT0FBTyt6SyxFQUFVejFLLEtBQU11NkcsRUFBUTk1RSxFQUFRLytCLEdBRXpDLElBQUssUUFDSCxPQUFPaTBLLEVBQVczMUssS0FBTXU2RyxFQUFROTVFLEVBQVEvK0IsR0FFMUMsSUFBSyxTQUNMLElBQUssU0FDSCxPQUFPbzBLLEVBQVk5MUssS0FBTXU2RyxFQUFROTVFLEVBQVEvK0IsR0FFM0MsSUFBSyxTQUVILE9BQU9xMEssRUFBWS8xSyxLQUFNdTZHLEVBQVE5NUUsRUFBUS8rQixHQUUzQyxJQUFLLE9BQ0wsSUFBSyxRQUNMLElBQUssVUFDTCxJQUFLLFdBQ0gsT0FBT3MwSyxFQUFVaDJLLEtBQU11NkcsRUFBUTk1RSxFQUFRLytCLEdBRXpDLFFBQ0UsR0FBSXl5SyxFQUFhLE1BQU0sSUFBSWhtQixVQUFVLHFCQUF1QndYLEdBQzVEQSxHQUFZLEdBQUtBLEdBQVVuMkMsY0FDM0Iya0QsR0FBYyxJQUt0QjUzQyxFQUFPLzhILFVBQVU2NEssT0FBUyxXQUN4QixNQUFPLENBQ0x2Z0ssS0FBTSxTQUNOalAsS0FBTXVQLE1BQU01WSxVQUFVcUMsTUFBTTlELEtBQUtpQyxLQUFLczRLLE1BQVF0NEssS0FBTSxLQXdGeEQsSUFBSTYySyxFQUF1QixLQW9CM0IsU0FBU3BDLEVBQVlydEgsRUFBS24rQyxFQUFPazdDLEdBQy9CLElBQUlvb0MsRUFBTSxHQUNWcG9DLEVBQU1waUQsS0FBS3EwQyxJQUFJZ1IsRUFBSTFsRCxPQUFReWlELEdBRTNCLElBQUssSUFBSXZtRCxFQUFJcUwsRUFBT3JMLEVBQUl1bUQsSUFBT3ZtRCxFQUM3QjJ1RixHQUFPMmIsT0FBT0MsYUFBc0IsSUFBVC9nRCxFQUFJeHBELElBRWpDLE9BQU8ydUYsRUFHVCxTQUFTbW9GLEVBQWF0dEgsRUFBS24rQyxFQUFPazdDLEdBQ2hDLElBQUlvb0MsRUFBTSxHQUNWcG9DLEVBQU1waUQsS0FBS3EwQyxJQUFJZ1IsRUFBSTFsRCxPQUFReWlELEdBRTNCLElBQUssSUFBSXZtRCxFQUFJcUwsRUFBT3JMLEVBQUl1bUQsSUFBT3ZtRCxFQUM3QjJ1RixHQUFPMmIsT0FBT0MsYUFBYS9nRCxFQUFJeHBELElBRWpDLE9BQU8ydUYsRUFHVCxTQUFTZ29GLEVBQVVudEgsRUFBS24rQyxFQUFPazdDLEdBQzdCLElBQUl1RSxFQUFNdEIsRUFBSTFsRCxTQUVUdUgsR0FBU0EsRUFBUSxLQUFHQSxFQUFRLEtBQzVCazdDLEdBQU9BLEVBQU0sR0FBS0EsRUFBTXVFLEtBQUt2RSxFQUFNdUUsR0FHeEMsSUFEQSxJQUFJbDFCLEVBQU0sR0FDRDUxQixFQUFJcUwsRUFBT3JMLEVBQUl1bUQsSUFBT3ZtRCxFQUM3QjQxQixHQUFPK2tKLEVBQU1ueEgsRUFBSXhwRCxJQUVuQixPQUFPNDFCLEVBR1QsU0FBU29oSixFQUFjeHRILEVBQUtuK0MsRUFBT2s3QyxHQUdqQyxJQUZBLElBQUl5bkUsRUFBUXhrRSxFQUFJdmxELE1BQU1vSCxFQUFPazdDLEdBQ3pCeDdDLEVBQU0sR0FDRC9LLEVBQUksRUFBR0EsRUFBSWd1SCxFQUFNbHFILE9BQVE5RCxHQUFLLEVBQ3JDK0ssR0FBT3UvRixPQUFPQyxhQUFheWpCLEVBQU1odUgsR0FBb0IsSUFBZmd1SCxFQUFNaHVILEVBQUksSUFFbEQsT0FBTytLLEVBMENULFNBQVM2dkssRUFBYS8zSSxFQUFRNVosRUFBS25sQixHQUNqQyxHQUFLKytCLEVBQVMsR0FBTyxHQUFLQSxFQUFTLEVBQUcsTUFBTSxJQUFJNnlJLFdBQVcsc0JBQzNELEdBQUk3eUksRUFBUzVaLEVBQU1ubEIsRUFBUSxNQUFNLElBQUk0eEssV0FBVyx5Q0ErSmxELFNBQVNtRixFQUFVcnhILEVBQUt2b0QsRUFBTzRoQyxFQUFRNVosRUFBSzRZLEVBQUsyVyxHQUMvQyxJQUFLbW1GLEVBQU9zM0MsU0FBU3pzSCxHQUFNLE1BQU0sSUFBSSttRyxVQUFVLCtDQUMvQyxHQUFJdHZKLEVBQVE0Z0MsR0FBTzVnQyxFQUFRdTNDLEVBQUssTUFBTSxJQUFJazlILFdBQVcscUNBQ3JELEdBQUk3eUksRUFBUzVaLEVBQU11Z0MsRUFBSTFsRCxPQUFRLE1BQU0sSUFBSTR4SyxXQUFXLHNCQWtEdEQsU0FBU29GLEVBQW1CdHhILEVBQUt2b0QsRUFBTzRoQyxFQUFRazRJLEdBQzFDOTVLLEVBQVEsSUFBR0EsRUFBUSxNQUFTQSxFQUFRLEdBQ3hDLElBQUssSUFBSWpCLEVBQUksRUFBRyt2RCxFQUFJNXJELEtBQUtxMEMsSUFBSWdSLEVBQUkxbEQsT0FBUysrQixFQUFRLEdBQUk3aUMsRUFBSSt2RCxJQUFLL3ZELEVBQzdEd3BELEVBQUkzbUIsRUFBUzdpQyxJQUFNaUIsRUFBUyxLQUFTLEdBQUs4NUssRUFBZS82SyxFQUFJLEVBQUlBLE1BQ2xDLEdBQTVCKzZLLEVBQWUvNkssRUFBSSxFQUFJQSxHQThCOUIsU0FBU2c3SyxFQUFtQnh4SCxFQUFLdm9ELEVBQU80aEMsRUFBUWs0SSxHQUMxQzk1SyxFQUFRLElBQUdBLEVBQVEsV0FBYUEsRUFBUSxHQUM1QyxJQUFLLElBQUlqQixFQUFJLEVBQUcrdkQsRUFBSTVyRCxLQUFLcTBDLElBQUlnUixFQUFJMWxELE9BQVMrK0IsRUFBUSxHQUFJN2lDLEVBQUkrdkQsSUFBSy92RCxFQUM3RHdwRCxFQUFJM21CLEVBQVM3aUMsR0FBTWlCLElBQXVDLEdBQTVCODVLLEVBQWUvNkssRUFBSSxFQUFJQSxHQUFVLElBbUpuRSxTQUFTaTdLLEVBQWN6eEgsRUFBS3ZvRCxFQUFPNGhDLEVBQVE1WixFQUFLNFksRUFBSzJXLEdBQ25ELEdBQUkzVixFQUFTNVosRUFBTXVnQyxFQUFJMWxELE9BQVEsTUFBTSxJQUFJNHhLLFdBQVcsc0JBQ3BELEdBQUk3eUksRUFBUyxFQUFHLE1BQU0sSUFBSTZ5SSxXQUFXLHNCQUd2QyxTQUFTd0YsRUFBWTF4SCxFQUFLdm9ELEVBQU80aEMsRUFBUWs0SSxFQUFjSSxHQUtyRCxPQUpLQSxHQUNIRixFQUFhenhILEVBQUt2b0QsRUFBTzRoQyxFQUFRLEdBRW5DeXlJLEVBQVEzckssTUFBTTYvQyxFQUFLdm9ELEVBQU80aEMsRUFBUWs0SSxFQUFjLEdBQUksR0FDN0NsNEksRUFBUyxFQVdsQixTQUFTdTRJLEVBQWE1eEgsRUFBS3ZvRCxFQUFPNGhDLEVBQVFrNEksRUFBY0ksR0FLdEQsT0FKS0EsR0FDSEYsRUFBYXp4SCxFQUFLdm9ELEVBQU80aEMsRUFBUSxHQUVuQ3l5SSxFQUFRM3JLLE1BQU02L0MsRUFBS3ZvRCxFQUFPNGhDLEVBQVFrNEksRUFBYyxHQUFJLEdBQzdDbDRJLEVBQVMsRUEvY2xCODdGLEVBQU8vOEgsVUFBVXFDLE1BQVEsU0FBZ0JvSCxFQUFPazdDLEdBQzlDLElBb0JJODBILEVBcEJBdndILEVBQU0xb0QsS0FBSzBCLE9BcUJmLElBcEJBdUgsSUFBVUEsR0FHRSxHQUNWQSxHQUFTeS9DLEdBQ0csSUFBR3ovQyxFQUFRLEdBQ2RBLEVBQVF5L0MsSUFDakJ6L0MsRUFBUXkvQyxJQU5WdkUsT0FBY3FrQyxJQUFScmtDLEVBQW9CdUUsSUFBUXZFLEdBU3hCLEdBQ1JBLEdBQU91RSxHQUNHLElBQUd2RSxFQUFNLEdBQ1ZBLEVBQU11RSxJQUNmdkUsRUFBTXVFLEdBR0p2RSxFQUFNbDdDLElBQU9rN0MsRUFBTWw3QyxHQUduQnN6SCxFQUFPNjJDLHFCQUNUNkYsRUFBU2o1SyxLQUFLcUwsU0FBU3BDLEVBQU9rN0MsSUFDdkJvdkgsVUFBWWgzQyxFQUFPLzhILGNBQ3JCLENBQ0wsSUFBSTA1SyxFQUFXLzBILEVBQU1sN0MsRUFDckJnd0ssRUFBUyxJQUFJMThDLEVBQU8yOEMsT0FBVTF3RixHQUM5QixJQUFLLElBQUk1cUYsRUFBSSxFQUFHQSxFQUFJczdLLElBQVl0N0ssRUFDOUJxN0ssRUFBT3I3SyxHQUFLb0MsS0FBS3BDLEVBQUlxTCxHQUl6QixPQUFPZ3dLLEdBV1QxOEMsRUFBTy84SCxVQUFVMjVLLFdBQWEsU0FBcUIxNEksRUFBUTZvRSxFQUFZeXZFLEdBQ3JFdDRJLEdBQWtCLEVBQ2xCNm9FLEdBQTBCLEVBQ3JCeXZFLEdBQVVQLEVBQVkvM0ksRUFBUTZvRSxFQUFZdHBHLEtBQUswQixRQUtwRCxJQUhBLElBQUl3YixFQUFNbGQsS0FBS3lnQyxHQUNYMm9ELEVBQU0sRUFDTnhyRixFQUFJLElBQ0NBLEVBQUkwckcsSUFBZWxnQixHQUFPLE1BQ2pDbHNFLEdBQU9sZCxLQUFLeWdDLEVBQVM3aUMsR0FBS3dyRixFQUc1QixPQUFPbHNFLEdBR1RxL0csRUFBTy84SCxVQUFVNDVLLFdBQWEsU0FBcUIzNEksRUFBUTZvRSxFQUFZeXZFLEdBQ3JFdDRJLEdBQWtCLEVBQ2xCNm9FLEdBQTBCLEVBQ3JCeXZFLEdBQ0hQLEVBQVkvM0ksRUFBUTZvRSxFQUFZdHBHLEtBQUswQixRQUt2QyxJQUZBLElBQUl3YixFQUFNbGQsS0FBS3lnQyxJQUFXNm9FLEdBQ3RCbGdCLEVBQU0sRUFDSGtnQixFQUFhLElBQU1sZ0IsR0FBTyxNQUMvQmxzRSxHQUFPbGQsS0FBS3lnQyxJQUFXNm9FLEdBQWNsZ0IsRUFHdkMsT0FBT2xzRSxHQUdUcS9HLEVBQU8vOEgsVUFBVTY1SyxVQUFZLFNBQW9CNTRJLEVBQVFzNEksR0FFdkQsT0FES0EsR0FBVVAsRUFBWS8zSSxFQUFRLEVBQUd6Z0MsS0FBSzBCLFFBQ3BDMUIsS0FBS3lnQyxJQUdkODdGLEVBQU8vOEgsVUFBVTg1SyxhQUFlLFNBQXVCNzRJLEVBQVFzNEksR0FFN0QsT0FES0EsR0FBVVAsRUFBWS8zSSxFQUFRLEVBQUd6Z0MsS0FBSzBCLFFBQ3BDMUIsS0FBS3lnQyxHQUFXemdDLEtBQUt5Z0MsRUFBUyxJQUFNLEdBRzdDODdGLEVBQU8vOEgsVUFBVTAxSyxhQUFlLFNBQXVCejBJLEVBQVFzNEksR0FFN0QsT0FES0EsR0FBVVAsRUFBWS8zSSxFQUFRLEVBQUd6Z0MsS0FBSzBCLFFBQ25DMUIsS0FBS3lnQyxJQUFXLEVBQUt6Z0MsS0FBS3lnQyxFQUFTLElBRzdDODdGLEVBQU8vOEgsVUFBVSs1SyxhQUFlLFNBQXVCOTRJLEVBQVFzNEksR0FHN0QsT0FGS0EsR0FBVVAsRUFBWS8zSSxFQUFRLEVBQUd6Z0MsS0FBSzBCLFNBRWxDMUIsS0FBS3lnQyxHQUNUemdDLEtBQUt5Z0MsRUFBUyxJQUFNLEVBQ3BCemdDLEtBQUt5Z0MsRUFBUyxJQUFNLElBQ0QsU0FBbkJ6Z0MsS0FBS3lnQyxFQUFTLElBR3JCODdGLEVBQU8vOEgsVUFBVWc2SyxhQUFlLFNBQXVCLzRJLEVBQVFzNEksR0FHN0QsT0FGS0EsR0FBVVAsRUFBWS8zSSxFQUFRLEVBQUd6Z0MsS0FBSzBCLFFBRXBCLFNBQWYxQixLQUFLeWdDLElBQ1R6Z0MsS0FBS3lnQyxFQUFTLElBQU0sR0FDckJ6Z0MsS0FBS3lnQyxFQUFTLElBQU0sRUFDckJ6Z0MsS0FBS3lnQyxFQUFTLEtBR2xCODdGLEVBQU8vOEgsVUFBVWk2SyxVQUFZLFNBQW9CaDVJLEVBQVE2b0UsRUFBWXl2RSxHQUNuRXQ0SSxHQUFrQixFQUNsQjZvRSxHQUEwQixFQUNyQnl2RSxHQUFVUCxFQUFZLzNJLEVBQVE2b0UsRUFBWXRwRyxLQUFLMEIsUUFLcEQsSUFIQSxJQUFJd2IsRUFBTWxkLEtBQUt5Z0MsR0FDWDJvRCxFQUFNLEVBQ054ckYsRUFBSSxJQUNDQSxFQUFJMHJHLElBQWVsZ0IsR0FBTyxNQUNqQ2xzRSxHQUFPbGQsS0FBS3lnQyxFQUFTN2lDLEdBQUt3ckYsRUFNNUIsT0FGSWxzRSxJQUZKa3NFLEdBQU8sT0FFU2xzRSxHQUFPbmIsS0FBS3k0QyxJQUFJLEVBQUcsRUFBSTh1RCxJQUVoQ3BzRixHQUdUcS9HLEVBQU8vOEgsVUFBVWs2SyxVQUFZLFNBQW9CajVJLEVBQVE2b0UsRUFBWXl2RSxHQUNuRXQ0SSxHQUFrQixFQUNsQjZvRSxHQUEwQixFQUNyQnl2RSxHQUFVUCxFQUFZLzNJLEVBQVE2b0UsRUFBWXRwRyxLQUFLMEIsUUFLcEQsSUFIQSxJQUFJOUQsRUFBSTByRyxFQUNKbGdCLEVBQU0sRUFDTmxzRSxFQUFNbGQsS0FBS3lnQyxJQUFXN2lDLEdBQ25CQSxFQUFJLElBQU13ckYsR0FBTyxNQUN0QmxzRSxHQUFPbGQsS0FBS3lnQyxJQUFXN2lDLEdBQUt3ckYsRUFNOUIsT0FGSWxzRSxJQUZKa3NFLEdBQU8sT0FFU2xzRSxHQUFPbmIsS0FBS3k0QyxJQUFJLEVBQUcsRUFBSTh1RCxJQUVoQ3BzRixHQUdUcS9HLEVBQU8vOEgsVUFBVW02SyxTQUFXLFNBQW1CbDVJLEVBQVFzNEksR0FFckQsT0FES0EsR0FBVVAsRUFBWS8zSSxFQUFRLEVBQUd6Z0MsS0FBSzBCLFFBQ3RCLElBQWYxQixLQUFLeWdDLElBQzBCLEdBQTVCLElBQU96Z0MsS0FBS3lnQyxHQUFVLEdBREt6Z0MsS0FBS3lnQyxJQUkzQzg3RixFQUFPLzhILFVBQVVvNkssWUFBYyxTQUFzQm41SSxFQUFRczRJLEdBQ3REQSxHQUFVUCxFQUFZLzNJLEVBQVEsRUFBR3pnQyxLQUFLMEIsUUFDM0MsSUFBSXdiLEVBQU1sZCxLQUFLeWdDLEdBQVd6Z0MsS0FBS3lnQyxFQUFTLElBQU0sRUFDOUMsT0FBYyxNQUFOdmpCLEVBQXNCLFdBQU5BLEVBQW1CQSxHQUc3Q3EvRyxFQUFPLzhILFVBQVVxNkssWUFBYyxTQUFzQnA1SSxFQUFRczRJLEdBQ3REQSxHQUFVUCxFQUFZLzNJLEVBQVEsRUFBR3pnQyxLQUFLMEIsUUFDM0MsSUFBSXdiLEVBQU1sZCxLQUFLeWdDLEVBQVMsR0FBTXpnQyxLQUFLeWdDLElBQVcsRUFDOUMsT0FBYyxNQUFOdmpCLEVBQXNCLFdBQU5BLEVBQW1CQSxHQUc3Q3EvRyxFQUFPLzhILFVBQVVzNkssWUFBYyxTQUFzQnI1SSxFQUFRczRJLEdBRzNELE9BRktBLEdBQVVQLEVBQVkvM0ksRUFBUSxFQUFHemdDLEtBQUswQixRQUVuQzFCLEtBQUt5Z0MsR0FDVnpnQyxLQUFLeWdDLEVBQVMsSUFBTSxFQUNwQnpnQyxLQUFLeWdDLEVBQVMsSUFBTSxHQUNwQnpnQyxLQUFLeWdDLEVBQVMsSUFBTSxJQUd6Qjg3RixFQUFPLzhILFVBQVV1NkssWUFBYyxTQUFzQnQ1SSxFQUFRczRJLEdBRzNELE9BRktBLEdBQVVQLEVBQVkvM0ksRUFBUSxFQUFHemdDLEtBQUswQixRQUVuQzFCLEtBQUt5Z0MsSUFBVyxHQUNyQnpnQyxLQUFLeWdDLEVBQVMsSUFBTSxHQUNwQnpnQyxLQUFLeWdDLEVBQVMsSUFBTSxFQUNwQnpnQyxLQUFLeWdDLEVBQVMsSUFHbkI4N0YsRUFBTy84SCxVQUFVdzZLLFlBQWMsU0FBc0J2NUksRUFBUXM0SSxHQUUzRCxPQURLQSxHQUFVUCxFQUFZLzNJLEVBQVEsRUFBR3pnQyxLQUFLMEIsUUFDcEN3eEssRUFBUXJwSyxLQUFLN0osS0FBTXlnQyxHQUFRLEVBQU0sR0FBSSxJQUc5Qzg3RixFQUFPLzhILFVBQVV5NkssWUFBYyxTQUFzQng1SSxFQUFRczRJLEdBRTNELE9BREtBLEdBQVVQLEVBQVkvM0ksRUFBUSxFQUFHemdDLEtBQUswQixRQUNwQ3d4SyxFQUFRcnBLLEtBQUs3SixLQUFNeWdDLEdBQVEsRUFBTyxHQUFJLElBRy9DODdGLEVBQU8vOEgsVUFBVTA2SyxhQUFlLFNBQXVCejVJLEVBQVFzNEksR0FFN0QsT0FES0EsR0FBVVAsRUFBWS8zSSxFQUFRLEVBQUd6Z0MsS0FBSzBCLFFBQ3BDd3hLLEVBQVFycEssS0FBSzdKLEtBQU15Z0MsR0FBUSxFQUFNLEdBQUksSUFHOUM4N0YsRUFBTy84SCxVQUFVMjZLLGFBQWUsU0FBdUIxNUksRUFBUXM0SSxHQUU3RCxPQURLQSxHQUFVUCxFQUFZLzNJLEVBQVEsRUFBR3pnQyxLQUFLMEIsUUFDcEN3eEssRUFBUXJwSyxLQUFLN0osS0FBTXlnQyxHQUFRLEVBQU8sR0FBSSxJQVMvQzg3RixFQUFPLzhILFVBQVU0NkssWUFBYyxTQUFzQnY3SyxFQUFPNGhDLEVBQVE2b0UsRUFBWXl2RSxJQUM5RWw2SyxHQUFTQSxFQUNUNGhDLEdBQWtCLEVBQ2xCNm9FLEdBQTBCLEVBQ3JCeXZFLElBRUhOLEVBQVN6NEssS0FBTW5CLEVBQU80aEMsRUFBUTZvRSxFQURmdm5HLEtBQUt5NEMsSUFBSSxFQUFHLEVBQUk4dUQsR0FBYyxFQUNPLEdBR3RELElBQUlsZ0IsRUFBTSxFQUNOeHJGLEVBQUksRUFFUixJQURBb0MsS0FBS3lnQyxHQUFrQixJQUFSNWhDLElBQ05qQixFQUFJMHJHLElBQWVsZ0IsR0FBTyxNQUNqQ3BwRixLQUFLeWdDLEVBQVM3aUMsR0FBTWlCLEVBQVF1cUYsRUFBTyxJQUdyQyxPQUFPM29ELEVBQVM2b0UsR0FHbEJpekIsRUFBTy84SCxVQUFVNjZLLFlBQWMsU0FBc0J4N0ssRUFBTzRoQyxFQUFRNm9FLEVBQVl5dkUsSUFDOUVsNkssR0FBU0EsRUFDVDRoQyxHQUFrQixFQUNsQjZvRSxHQUEwQixFQUNyQnl2RSxJQUVITixFQUFTejRLLEtBQU1uQixFQUFPNGhDLEVBQVE2b0UsRUFEZnZuRyxLQUFLeTRDLElBQUksRUFBRyxFQUFJOHVELEdBQWMsRUFDTyxHQUd0RCxJQUFJMXJHLEVBQUkwckcsRUFBYSxFQUNqQmxnQixFQUFNLEVBRVYsSUFEQXBwRixLQUFLeWdDLEVBQVM3aUMsR0FBYSxJQUFSaUIsSUFDVmpCLEdBQUssSUFBTXdyRixHQUFPLE1BQ3pCcHBGLEtBQUt5Z0MsRUFBUzdpQyxHQUFNaUIsRUFBUXVxRixFQUFPLElBR3JDLE9BQU8zb0QsRUFBUzZvRSxHQUdsQml6QixFQUFPLzhILFVBQVU4NkssV0FBYSxTQUFxQno3SyxFQUFPNGhDLEVBQVFzNEksR0FNaEUsT0FMQWw2SyxHQUFTQSxFQUNUNGhDLEdBQWtCLEVBQ2JzNEksR0FBVU4sRUFBU3o0SyxLQUFNbkIsRUFBTzRoQyxFQUFRLEVBQUcsSUFBTSxHQUNqRDg3RixFQUFPNjJDLHNCQUFxQnYwSyxFQUFRa0QsS0FBSzJZLE1BQU03YixJQUNwRG1CLEtBQUt5Z0MsR0FBbUIsSUFBUjVoQyxFQUNUNGhDLEVBQVMsR0FXbEI4N0YsRUFBTy84SCxVQUFVKzZLLGNBQWdCLFNBQXdCMTdLLEVBQU80aEMsRUFBUXM0SSxHQVV0RSxPQVRBbDZLLEdBQVNBLEVBQ1Q0aEMsR0FBa0IsRUFDYnM0SSxHQUFVTixFQUFTejRLLEtBQU1uQixFQUFPNGhDLEVBQVEsRUFBRyxNQUFRLEdBQ3BEODdGLEVBQU82MkMscUJBQ1RwekssS0FBS3lnQyxHQUFtQixJQUFSNWhDLEVBQ2hCbUIsS0FBS3lnQyxFQUFTLEdBQU01aEMsSUFBVSxHQUU5QjY1SyxFQUFrQjE0SyxLQUFNbkIsRUFBTzRoQyxHQUFRLEdBRWxDQSxFQUFTLEdBR2xCODdGLEVBQU8vOEgsVUFBVWc3SyxjQUFnQixTQUF3QjM3SyxFQUFPNGhDLEVBQVFzNEksR0FVdEUsT0FUQWw2SyxHQUFTQSxFQUNUNGhDLEdBQWtCLEVBQ2JzNEksR0FBVU4sRUFBU3o0SyxLQUFNbkIsRUFBTzRoQyxFQUFRLEVBQUcsTUFBUSxHQUNwRDg3RixFQUFPNjJDLHFCQUNUcHpLLEtBQUt5Z0MsR0FBVzVoQyxJQUFVLEVBQzFCbUIsS0FBS3lnQyxFQUFTLEdBQWMsSUFBUjVoQyxHQUVwQjY1SyxFQUFrQjE0SyxLQUFNbkIsRUFBTzRoQyxHQUFRLEdBRWxDQSxFQUFTLEdBVWxCODdGLEVBQU8vOEgsVUFBVWk3SyxjQUFnQixTQUF3QjU3SyxFQUFPNGhDLEVBQVFzNEksR0FZdEUsT0FYQWw2SyxHQUFTQSxFQUNUNGhDLEdBQWtCLEVBQ2JzNEksR0FBVU4sRUFBU3o0SyxLQUFNbkIsRUFBTzRoQyxFQUFRLEVBQUcsV0FBWSxHQUN4RDg3RixFQUFPNjJDLHFCQUNUcHpLLEtBQUt5Z0MsRUFBUyxHQUFNNWhDLElBQVUsR0FDOUJtQixLQUFLeWdDLEVBQVMsR0FBTTVoQyxJQUFVLEdBQzlCbUIsS0FBS3lnQyxFQUFTLEdBQU01aEMsSUFBVSxFQUM5Qm1CLEtBQUt5Z0MsR0FBbUIsSUFBUjVoQyxHQUVoQis1SyxFQUFrQjU0SyxLQUFNbkIsRUFBTzRoQyxHQUFRLEdBRWxDQSxFQUFTLEdBR2xCODdGLEVBQU8vOEgsVUFBVWs3SyxjQUFnQixTQUF3Qjc3SyxFQUFPNGhDLEVBQVFzNEksR0FZdEUsT0FYQWw2SyxHQUFTQSxFQUNUNGhDLEdBQWtCLEVBQ2JzNEksR0FBVU4sRUFBU3o0SyxLQUFNbkIsRUFBTzRoQyxFQUFRLEVBQUcsV0FBWSxHQUN4RDg3RixFQUFPNjJDLHFCQUNUcHpLLEtBQUt5Z0MsR0FBVzVoQyxJQUFVLEdBQzFCbUIsS0FBS3lnQyxFQUFTLEdBQU01aEMsSUFBVSxHQUM5Qm1CLEtBQUt5Z0MsRUFBUyxHQUFNNWhDLElBQVUsRUFDOUJtQixLQUFLeWdDLEVBQVMsR0FBYyxJQUFSNWhDLEdBRXBCKzVLLEVBQWtCNTRLLEtBQU1uQixFQUFPNGhDLEdBQVEsR0FFbENBLEVBQVMsR0FHbEI4N0YsRUFBTy84SCxVQUFVbTdLLFdBQWEsU0FBcUI5N0ssRUFBTzRoQyxFQUFRNm9FLEVBQVl5dkUsR0FHNUUsR0FGQWw2SyxHQUFTQSxFQUNUNGhDLEdBQWtCLEdBQ2JzNEksRUFBVSxDQUNiLElBQUk2QixFQUFRNzRLLEtBQUt5NEMsSUFBSSxFQUFHLEVBQUk4dUQsRUFBYSxHQUV6Q212RSxFQUFTejRLLEtBQU1uQixFQUFPNGhDLEVBQVE2b0UsRUFBWXN4RSxFQUFRLEdBQUlBLEdBR3hELElBQUloOUssRUFBSSxFQUNKd3JGLEVBQU0sRUFDTjlpQyxFQUFNLEVBRVYsSUFEQXRtRCxLQUFLeWdDLEdBQWtCLElBQVI1aEMsSUFDTmpCLEVBQUkwckcsSUFBZWxnQixHQUFPLE1BQzdCdnFGLEVBQVEsR0FBYSxJQUFSeW5ELEdBQXNDLElBQXpCdG1ELEtBQUt5Z0MsRUFBUzdpQyxFQUFJLEtBQzlDMG9ELEVBQU0sR0FFUnRtRCxLQUFLeWdDLEVBQVM3aUMsSUFBT2lCLEVBQVF1cUYsR0FBUSxHQUFLOWlDLEVBQU0sSUFHbEQsT0FBTzdsQixFQUFTNm9FLEdBR2xCaXpCLEVBQU8vOEgsVUFBVXE3SyxXQUFhLFNBQXFCaDhLLEVBQU80aEMsRUFBUTZvRSxFQUFZeXZFLEdBRzVFLEdBRkFsNkssR0FBU0EsRUFDVDRoQyxHQUFrQixHQUNiczRJLEVBQVUsQ0FDYixJQUFJNkIsRUFBUTc0SyxLQUFLeTRDLElBQUksRUFBRyxFQUFJOHVELEVBQWEsR0FFekNtdkUsRUFBU3o0SyxLQUFNbkIsRUFBTzRoQyxFQUFRNm9FLEVBQVlzeEUsRUFBUSxHQUFJQSxHQUd4RCxJQUFJaDlLLEVBQUkwckcsRUFBYSxFQUNqQmxnQixFQUFNLEVBQ045aUMsRUFBTSxFQUVWLElBREF0bUQsS0FBS3lnQyxFQUFTN2lDLEdBQWEsSUFBUmlCLElBQ1ZqQixHQUFLLElBQU13ckYsR0FBTyxNQUNyQnZxRixFQUFRLEdBQWEsSUFBUnluRCxHQUFzQyxJQUF6QnRtRCxLQUFLeWdDLEVBQVM3aUMsRUFBSSxLQUM5QzBvRCxFQUFNLEdBRVJ0bUQsS0FBS3lnQyxFQUFTN2lDLElBQU9pQixFQUFRdXFGLEdBQVEsR0FBSzlpQyxFQUFNLElBR2xELE9BQU83bEIsRUFBUzZvRSxHQUdsQml6QixFQUFPLzhILFVBQVVzN0ssVUFBWSxTQUFvQmo4SyxFQUFPNGhDLEVBQVFzNEksR0FPOUQsT0FOQWw2SyxHQUFTQSxFQUNUNGhDLEdBQWtCLEVBQ2JzNEksR0FBVU4sRUFBU3o0SyxLQUFNbkIsRUFBTzRoQyxFQUFRLEVBQUcsS0FBTyxLQUNsRDg3RixFQUFPNjJDLHNCQUFxQnYwSyxFQUFRa0QsS0FBSzJZLE1BQU03YixJQUNoREEsRUFBUSxJQUFHQSxFQUFRLElBQU9BLEVBQVEsR0FDdENtQixLQUFLeWdDLEdBQW1CLElBQVI1aEMsRUFDVDRoQyxFQUFTLEdBR2xCODdGLEVBQU8vOEgsVUFBVXU3SyxhQUFlLFNBQXVCbDhLLEVBQU80aEMsRUFBUXM0SSxHQVVwRSxPQVRBbDZLLEdBQVNBLEVBQ1Q0aEMsR0FBa0IsRUFDYnM0SSxHQUFVTixFQUFTejRLLEtBQU1uQixFQUFPNGhDLEVBQVEsRUFBRyxPQUFTLE9BQ3JEODdGLEVBQU82MkMscUJBQ1RwekssS0FBS3lnQyxHQUFtQixJQUFSNWhDLEVBQ2hCbUIsS0FBS3lnQyxFQUFTLEdBQU01aEMsSUFBVSxHQUU5QjY1SyxFQUFrQjE0SyxLQUFNbkIsRUFBTzRoQyxHQUFRLEdBRWxDQSxFQUFTLEdBR2xCODdGLEVBQU8vOEgsVUFBVXc3SyxhQUFlLFNBQXVCbjhLLEVBQU80aEMsRUFBUXM0SSxHQVVwRSxPQVRBbDZLLEdBQVNBLEVBQ1Q0aEMsR0FBa0IsRUFDYnM0SSxHQUFVTixFQUFTejRLLEtBQU1uQixFQUFPNGhDLEVBQVEsRUFBRyxPQUFTLE9BQ3JEODdGLEVBQU82MkMscUJBQ1RwekssS0FBS3lnQyxHQUFXNWhDLElBQVUsRUFDMUJtQixLQUFLeWdDLEVBQVMsR0FBYyxJQUFSNWhDLEdBRXBCNjVLLEVBQWtCMTRLLEtBQU1uQixFQUFPNGhDLEdBQVEsR0FFbENBLEVBQVMsR0FHbEI4N0YsRUFBTy84SCxVQUFVeTdLLGFBQWUsU0FBdUJwOEssRUFBTzRoQyxFQUFRczRJLEdBWXBFLE9BWEFsNkssR0FBU0EsRUFDVDRoQyxHQUFrQixFQUNiczRJLEdBQVVOLEVBQVN6NEssS0FBTW5CLEVBQU80aEMsRUFBUSxFQUFHLFlBQWEsWUFDekQ4N0YsRUFBTzYyQyxxQkFDVHB6SyxLQUFLeWdDLEdBQW1CLElBQVI1aEMsRUFDaEJtQixLQUFLeWdDLEVBQVMsR0FBTTVoQyxJQUFVLEVBQzlCbUIsS0FBS3lnQyxFQUFTLEdBQU01aEMsSUFBVSxHQUM5Qm1CLEtBQUt5Z0MsRUFBUyxHQUFNNWhDLElBQVUsSUFFOUIrNUssRUFBa0I1NEssS0FBTW5CLEVBQU80aEMsR0FBUSxHQUVsQ0EsRUFBUyxHQUdsQjg3RixFQUFPLzhILFVBQVUwN0ssYUFBZSxTQUF1QnI4SyxFQUFPNGhDLEVBQVFzNEksR0FhcEUsT0FaQWw2SyxHQUFTQSxFQUNUNGhDLEdBQWtCLEVBQ2JzNEksR0FBVU4sRUFBU3o0SyxLQUFNbkIsRUFBTzRoQyxFQUFRLEVBQUcsWUFBYSxZQUN6RDVoQyxFQUFRLElBQUdBLEVBQVEsV0FBYUEsRUFBUSxHQUN4QzA5SCxFQUFPNjJDLHFCQUNUcHpLLEtBQUt5Z0MsR0FBVzVoQyxJQUFVLEdBQzFCbUIsS0FBS3lnQyxFQUFTLEdBQU01aEMsSUFBVSxHQUM5Qm1CLEtBQUt5Z0MsRUFBUyxHQUFNNWhDLElBQVUsRUFDOUJtQixLQUFLeWdDLEVBQVMsR0FBYyxJQUFSNWhDLEdBRXBCKzVLLEVBQWtCNTRLLEtBQU1uQixFQUFPNGhDLEdBQVEsR0FFbENBLEVBQVMsR0FnQmxCODdGLEVBQU8vOEgsVUFBVTI3SyxhQUFlLFNBQXVCdDhLLEVBQU80aEMsRUFBUXM0SSxHQUNwRSxPQUFPRCxFQUFXOTRLLEtBQU1uQixFQUFPNGhDLEdBQVEsRUFBTXM0SSxJQUcvQ3g4QyxFQUFPLzhILFVBQVU0N0ssYUFBZSxTQUF1QnY4SyxFQUFPNGhDLEVBQVFzNEksR0FDcEUsT0FBT0QsRUFBVzk0SyxLQUFNbkIsRUFBTzRoQyxHQUFRLEVBQU9zNEksSUFXaER4OEMsRUFBTy84SCxVQUFVNjdLLGNBQWdCLFNBQXdCeDhLLEVBQU80aEMsRUFBUXM0SSxHQUN0RSxPQUFPQyxFQUFZaDVLLEtBQU1uQixFQUFPNGhDLEdBQVEsRUFBTXM0SSxJQUdoRHg4QyxFQUFPLzhILFVBQVU4N0ssY0FBZ0IsU0FBd0J6OEssRUFBTzRoQyxFQUFRczRJLEdBQ3RFLE9BQU9DLEVBQVloNUssS0FBTW5CLEVBQU80aEMsR0FBUSxFQUFPczRJLElBSWpEeDhDLEVBQU8vOEgsVUFBVXUwSyxLQUFPLFNBQWUxakUsRUFBUWtyRSxFQUFhdHlLLEVBQU9rN0MsR0FRakUsR0FQS2w3QyxJQUFPQSxFQUFRLEdBQ2ZrN0MsR0FBZSxJQUFSQSxJQUFXQSxFQUFNbmtELEtBQUswQixRQUM5QjY1SyxHQUFlbHJFLEVBQU8zdUcsU0FBUTY1SyxFQUFjbHJFLEVBQU8zdUcsUUFDbEQ2NUssSUFBYUEsRUFBYyxHQUM1QnAzSCxFQUFNLEdBQUtBLEVBQU1sN0MsSUFBT2s3QyxFQUFNbDdDLEdBRzlCazdDLElBQVFsN0MsRUFBTyxPQUFPLEVBQzFCLEdBQXNCLElBQWxCb25HLEVBQU8zdUcsUUFBZ0MsSUFBaEIxQixLQUFLMEIsT0FBYyxPQUFPLEVBR3JELEdBQUk2NUssRUFBYyxFQUNoQixNQUFNLElBQUlqSSxXQUFXLDZCQUV2QixHQUFJcnFLLEVBQVEsR0FBS0EsR0FBU2pKLEtBQUswQixPQUFRLE1BQU0sSUFBSTR4SyxXQUFXLDZCQUM1RCxHQUFJbnZILEVBQU0sRUFBRyxNQUFNLElBQUltdkgsV0FBVywyQkFHOUJudkgsRUFBTW5rRCxLQUFLMEIsU0FBUXlpRCxFQUFNbmtELEtBQUswQixRQUM5QjJ1RyxFQUFPM3VHLE9BQVM2NUssRUFBY3AzSCxFQUFNbDdDLElBQ3RDazdDLEVBQU1rc0QsRUFBTzN1RyxPQUFTNjVLLEVBQWN0eUssR0FHdEMsSUFDSXJMLEVBREE4cUQsRUFBTXZFLEVBQU1sN0MsRUFHaEIsR0FBSWpKLE9BQVNxd0csR0FBVXBuRyxFQUFRc3lLLEdBQWVBLEVBQWNwM0gsRUFFMUQsSUFBS3ZtRCxFQUFJOHFELEVBQU0sRUFBRzlxRCxHQUFLLElBQUtBLEVBQzFCeXlHLEVBQU96eUcsRUFBSTI5SyxHQUFldjdLLEtBQUtwQyxFQUFJcUwsUUFFaEMsR0FBSXkvQyxFQUFNLE1BQVM2ekUsRUFBTzYyQyxvQkFFL0IsSUFBS3gxSyxFQUFJLEVBQUdBLEVBQUk4cUQsSUFBTzlxRCxFQUNyQnl5RyxFQUFPenlHLEVBQUkyOUssR0FBZXY3SyxLQUFLcEMsRUFBSXFMLFFBR3JDc0osV0FBVy9TLFVBQVVvSSxJQUFJN0osS0FDdkJzeUcsRUFDQXJ3RyxLQUFLcUwsU0FBU3BDLEVBQU9BLEVBQVF5L0MsR0FDN0I2eUgsR0FJSixPQUFPN3lILEdBT1Q2ekUsRUFBTy84SCxVQUFVbXVDLEtBQU8sU0FBZXp3QixFQUFLalUsRUFBT2s3QyxFQUFLd2hILEdBRXRELEdBQW1CLGlCQUFSem9KLEVBQWtCLENBUzNCLEdBUnFCLGlCQUFWalUsR0FDVDA4SixFQUFXMThKLEVBQ1hBLEVBQVEsRUFDUms3QyxFQUFNbmtELEtBQUswQixRQUNhLGlCQUFSeWlELElBQ2hCd2hILEVBQVd4aEgsRUFDWEEsRUFBTW5rRCxLQUFLMEIsUUFFTSxJQUFmd2IsRUFBSXhiLE9BQWMsQ0FDcEIsSUFBSXN3RyxFQUFPOTBGLEVBQUl3ckYsV0FBVyxHQUN0QnNKLEVBQU8sTUFDVDkwRixFQUFNODBGLEdBR1YsUUFBaUJ4cEIsSUFBYm05RSxHQUE4QyxpQkFBYkEsRUFDbkMsTUFBTSxJQUFJeFgsVUFBVSw2QkFFdEIsR0FBd0IsaUJBQWJ3WCxJQUEwQnBwQyxFQUFPcTNDLFdBQVdqTyxHQUNyRCxNQUFNLElBQUl4WCxVQUFVLHFCQUF1QndYLE9BRXJCLGlCQUFSem9KLElBQ2hCQSxHQUFZLEtBSWQsR0FBSWpVLEVBQVEsR0FBS2pKLEtBQUswQixPQUFTdUgsR0FBU2pKLEtBQUswQixPQUFTeWlELEVBQ3BELE1BQU0sSUFBSW12SCxXQUFXLHNCQUd2QixHQUFJbnZILEdBQU9sN0MsRUFDVCxPQUFPakosS0FRVCxJQUFJcEMsRUFDSixHQU5BcUwsS0FBa0IsRUFDbEJrN0MsT0FBY3FrQyxJQUFScmtDLEVBQW9CbmtELEtBQUswQixPQUFTeWlELElBQVEsRUFFM0NqbkMsSUFBS0EsRUFBTSxHQUdHLGlCQUFSQSxFQUNULElBQUt0ZixFQUFJcUwsRUFBT3JMLEVBQUl1bUQsSUFBT3ZtRCxFQUN6Qm9DLEtBQUtwQyxHQUFLc2YsTUFFUCxDQUNMLElBQUkwdUcsRUFBUTJRLEVBQU9zM0MsU0FBUzMySixHQUN4QkEsRUFDQWszSixFQUFZLElBQUk3M0MsRUFBT3IvRyxFQUFLeW9KLEdBQVV0c0csWUFDdEMzUSxFQUFNa2pFLEVBQU1scUgsT0FDaEIsSUFBSzlELEVBQUksRUFBR0EsRUFBSXVtRCxFQUFNbDdDLElBQVNyTCxFQUM3Qm9DLEtBQUtwQyxFQUFJcUwsR0FBUzJpSCxFQUFNaHVILEVBQUk4cUQsR0FJaEMsT0FBTzFvRCxNQU1ULElBQUl3N0ssRUFBb0IscUJBbUJ4QixTQUFTakQsRUFBT2w1SyxHQUNkLE9BQUlBLEVBQUksR0FBVyxJQUFNQSxFQUFFZzZELFNBQVMsSUFDN0JoNkQsRUFBRWc2RCxTQUFTLElBR3BCLFNBQVMrNkcsRUFBYTc1RCxFQUFRMDdELEdBRTVCLElBQUlTLEVBREpULEVBQVFBLEdBQVN6ckosSUFNakIsSUFKQSxJQUFJOW9CLEVBQVM2NEcsRUFBTzc0RyxPQUNoQis1SyxFQUFnQixLQUNoQjd2RCxFQUFRLEdBRUhodUgsRUFBSSxFQUFHQSxFQUFJOEQsSUFBVTlELEVBQUcsQ0FJL0IsSUFIQTg0SyxFQUFZbjhELEVBQU83UixXQUFXOXFHLElBR2QsT0FBVTg0SyxFQUFZLE1BQVEsQ0FFNUMsSUFBSytFLEVBQWUsQ0FFbEIsR0FBSS9FLEVBQVksTUFBUSxFQUVqQlQsR0FBUyxJQUFNLEdBQUdycUQsRUFBTXJySCxLQUFLLElBQU0sSUFBTSxLQUM5QyxTQUNLLEdBQUkzQyxFQUFJLElBQU04RCxFQUFRLEVBRXRCdTBLLEdBQVMsSUFBTSxHQUFHcnFELEVBQU1yckgsS0FBSyxJQUFNLElBQU0sS0FDOUMsU0FJRms3SyxFQUFnQi9FLEVBRWhCLFNBSUYsR0FBSUEsRUFBWSxNQUFRLEVBQ2pCVCxHQUFTLElBQU0sR0FBR3JxRCxFQUFNcnJILEtBQUssSUFBTSxJQUFNLEtBQzlDazdLLEVBQWdCL0UsRUFDaEIsU0FJRkEsRUFBa0UsT0FBckQrRSxFQUFnQixPQUFVLEdBQUsvRSxFQUFZLFlBQy9DK0UsSUFFSnhGLEdBQVMsSUFBTSxHQUFHcnFELEVBQU1yckgsS0FBSyxJQUFNLElBQU0sS0FNaEQsR0FIQWs3SyxFQUFnQixLQUdaL0UsRUFBWSxJQUFNLENBQ3BCLElBQUtULEdBQVMsR0FBSyxFQUFHLE1BQ3RCcnFELEVBQU1yckgsS0FBS20ySyxRQUNOLEdBQUlBLEVBQVksS0FBTyxDQUM1QixJQUFLVCxHQUFTLEdBQUssRUFBRyxNQUN0QnJxRCxFQUFNcnJILEtBQ0ptMkssR0FBYSxFQUFNLElBQ1AsR0FBWkEsRUFBbUIsVUFFaEIsR0FBSUEsRUFBWSxNQUFTLENBQzlCLElBQUtULEdBQVMsR0FBSyxFQUFHLE1BQ3RCcnFELEVBQU1yckgsS0FDSm0ySyxHQUFhLEdBQU0sSUFDbkJBLEdBQWEsRUFBTSxHQUFPLElBQ2QsR0FBWkEsRUFBbUIsU0FFaEIsTUFBSUEsRUFBWSxTQVNyQixNQUFNLElBQUlud0ssTUFBTSxzQkFSaEIsSUFBSzB2SyxHQUFTLEdBQUssRUFBRyxNQUN0QnJxRCxFQUFNcnJILEtBQ0ptMkssR0FBYSxHQUFPLElBQ3BCQSxHQUFhLEdBQU0sR0FBTyxJQUMxQkEsR0FBYSxFQUFNLEdBQU8sSUFDZCxHQUFaQSxFQUFtQixNQU96QixPQUFPOXFELEVBNEJULFNBQVN5b0QsRUFBZTV2RixHQUN0QixPQUFPd3VGLEVBQU9iLFlBaEloQixTQUFzQjN0RixHQUlwQixJQUZBQSxFQVVGLFNBQXFCQSxHQUNuQixPQUFJQSxFQUFJdTRDLEtBQWF2NEMsRUFBSXU0QyxPQUNsQnY0QyxFQUFJMGYsUUFBUSxhQUFjLElBWjNCdTNFLENBQVdqM0YsR0FBSzBmLFFBQVFxM0UsRUFBbUIsS0FFekM5NUssT0FBUyxFQUFHLE1BQU8sR0FFM0IsS0FBTytpRixFQUFJL2lGLE9BQVMsR0FBTSxHQUN4QitpRixHQUFZLElBRWQsT0FBT0EsRUF1SG1CazNGLENBQVlsM0YsSUFHeEMsU0FBU2l4RixFQUFZcjZHLEVBQUtELEVBQUszNkIsRUFBUS8rQixHQUNyQyxJQUFLLElBQUk5RCxFQUFJLEVBQUdBLEVBQUk4RCxLQUNiOUQsRUFBSTZpQyxHQUFVMjZCLEVBQUkxNUQsUUFBWTlELEdBQUt5OUQsRUFBSTM1RCxVQURoQjlELEVBRTVCdzlELEVBQUl4OUQsRUFBSTZpQyxHQUFVNDZCLEVBQUl6OUQsR0FFeEIsT0FBT0EsSzs7Ozs7O0FDdHZEVEYsRUFBUW1NLEtBQU8sU0FBVUcsRUFBUXkyQixFQUFRbTdJLEVBQU1DLEVBQU1DLEdBQ25ELElBQUl0OUgsRUFBR3hnRCxFQUNIKzlLLEVBQWlCLEVBQVRELEVBQWNELEVBQU8sRUFDN0JHLEdBQVEsR0FBS0QsR0FBUSxFQUNyQkUsRUFBUUQsR0FBUSxFQUNoQkUsR0FBUyxFQUNUdCtLLEVBQUlnK0ssRUFBUUUsRUFBUyxFQUFLLEVBQzFCNTlLLEVBQUkwOUssR0FBUSxFQUFJLEVBQ2hCajhLLEVBQUlxSyxFQUFPeTJCLEVBQVM3aUMsR0FPeEIsSUFMQUEsR0FBS00sRUFFTHNnRCxFQUFJNytDLEdBQU0sSUFBT3U4SyxHQUFVLEVBQzNCdjhLLEtBQVF1OEssRUFDUkEsR0FBU0gsRUFDRkcsRUFBUSxFQUFHMTlILEVBQVMsSUFBSkEsRUFBV3gwQyxFQUFPeTJCLEVBQVM3aUMsR0FBSUEsR0FBS00sRUFBR2crSyxHQUFTLEdBS3ZFLElBSEFsK0ssRUFBSXdnRCxHQUFNLElBQU8wOUgsR0FBVSxFQUMzQjE5SCxLQUFRMDlILEVBQ1JBLEdBQVNMLEVBQ0ZLLEVBQVEsRUFBR2wrSyxFQUFTLElBQUpBLEVBQVdnTSxFQUFPeTJCLEVBQVM3aUMsR0FBSUEsR0FBS00sRUFBR2crSyxHQUFTLEdBRXZFLEdBQVUsSUFBTjE5SCxFQUNGQSxFQUFJLEVBQUl5OUgsTUFDSCxJQUFJejlILElBQU13OUgsRUFDZixPQUFPaCtLLEVBQUl5c0IsSUFBc0JELEtBQWQ3cUIsR0FBSyxFQUFJLEdBRTVCM0IsR0FBUStELEtBQUt5NEMsSUFBSSxFQUFHcWhJLEdBQ3BCcjlILEdBQVF5OUgsRUFFVixPQUFRdDhLLEdBQUssRUFBSSxHQUFLM0IsRUFBSStELEtBQUt5NEMsSUFBSSxFQUFHZ0UsRUFBSXE5SCxJQUc1Q24rSyxFQUFRNkosTUFBUSxTQUFVeUMsRUFBUW5MLEVBQU80aEMsRUFBUW03SSxFQUFNQyxFQUFNQyxHQUMzRCxJQUFJdDlILEVBQUd4Z0QsRUFBR0MsRUFDTjg5SyxFQUFpQixFQUFURCxFQUFjRCxFQUFPLEVBQzdCRyxHQUFRLEdBQUtELEdBQVEsRUFDckJFLEVBQVFELEdBQVEsRUFDaEJHLEVBQWUsS0FBVE4sRUFBYzk1SyxLQUFLeTRDLElBQUksR0FBSSxJQUFNejRDLEtBQUt5NEMsSUFBSSxHQUFJLElBQU0sRUFDMUQ1OEMsRUFBSWcrSyxFQUFPLEVBQUtFLEVBQVMsRUFDekI1OUssRUFBSTA5SyxFQUFPLEdBQUssRUFDaEJqOEssRUFBSWQsRUFBUSxHQUFnQixJQUFWQSxHQUFlLEVBQUlBLEVBQVEsRUFBSyxFQUFJLEVBbUMxRCxJQWpDQUEsRUFBUWtELEtBQUtpTixJQUFJblEsR0FFYmt6QyxNQUFNbHpDLElBQVVBLElBQVUyckIsS0FDNUJ4c0IsRUFBSSt6QyxNQUFNbHpDLEdBQVMsRUFBSSxFQUN2QjIvQyxFQUFJdzlILElBRUp4OUgsRUFBSXo4QyxLQUFLMlksTUFBTTNZLEtBQUsrVSxJQUFJalksR0FBU2tELEtBQUtxNkssS0FDbEN2OUssR0FBU1osRUFBSThELEtBQUt5NEMsSUFBSSxHQUFJZ0UsSUFBTSxJQUNsQ0EsSUFDQXZnRCxHQUFLLElBR0xZLEdBREUyL0MsRUFBSXk5SCxHQUFTLEVBQ05FLEVBQUtsK0ssRUFFTGsrSyxFQUFLcDZLLEtBQUt5NEMsSUFBSSxFQUFHLEVBQUl5aEksSUFFcEJoK0ssR0FBSyxJQUNmdWdELElBQ0F2Z0QsR0FBSyxHQUdIdWdELEVBQUl5OUgsR0FBU0QsR0FDZmgrSyxFQUFJLEVBQ0p3Z0QsRUFBSXc5SCxHQUNLeDlILEVBQUl5OUgsR0FBUyxHQUN0QmorSyxHQUFNYSxFQUFRWixFQUFLLEdBQUs4RCxLQUFLeTRDLElBQUksRUFBR3FoSSxHQUNwQ3I5SCxHQUFReTlILElBRVJqK0ssRUFBSWEsRUFBUWtELEtBQUt5NEMsSUFBSSxFQUFHeWhJLEVBQVEsR0FBS2w2SyxLQUFLeTRDLElBQUksRUFBR3FoSSxHQUNqRHI5SCxFQUFJLElBSURxOUgsR0FBUSxFQUFHN3hLLEVBQU95MkIsRUFBUzdpQyxHQUFTLElBQUpJLEVBQVVKLEdBQUtNLEVBQUdGLEdBQUssSUFBSzY5SyxHQUFRLEdBSTNFLElBRkFyOUgsRUFBS0EsR0FBS3E5SCxFQUFRNzlLLEVBQ2xCKzlLLEdBQVFGLEVBQ0RFLEVBQU8sRUFBRy94SyxFQUFPeTJCLEVBQVM3aUMsR0FBUyxJQUFKNGdELEVBQVU1Z0QsR0FBS00sRUFBR3NnRCxHQUFLLElBQUt1OUgsR0FBUSxHQUUxRS94SyxFQUFPeTJCLEVBQVM3aUMsRUFBSU0sSUFBVSxJQUFKeUIsSTs7Ozs0Q0NuRjVCLElBQUkwNUQsRUFBVyxHQUFHQSxTQUVsQjE3RCxFQUFPRCxRQUFVMGEsTUFBTXN2RCxTQUFXLFNBQVVoL0MsR0FDMUMsTUFBNkIsa0JBQXRCMndDLEVBQVN0N0QsS0FBSzJxQixLOzs7OzRDQ0h2Qi9xQixFQUFPRCxRQUFVZzBILEVBS2pCLElBQUlsL0IsRUFBTyxLQUVYLElBQ0VBLEVBQU8sSUFBSThDLFlBQVkrbUYsU0FBUyxJQUFJL21GLFlBQVlxTixPQUFPLElBQUlwd0YsV0FBVyxDQUNwRSxFQUFHLEdBQUksSUFBSyxJQUFLLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUFJLEVBQUcsR0FBSSxFQUFHLEVBQUcsSUFBSyxHQUFJLEVBQUcsSUFBSyxJQUFLLElBQUssSUFBSyxFQUFHLElBQUssRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsSUFBSyxFQUFHLEdBQUksRUFBRyxHQUFJLEVBQUcsR0FBSSxFQUFHLEVBQUcsSUFBSyxJQUFLLElBQUssRUFBRyxFQUFHLEVBQUcsSUFBSyxJQUFLLElBQUssR0FBSSxJQUFLLEVBQUcsRUFBRyxFQUFHLElBQUssSUFBSyxJQUFLLEdBQUksSUFBSyxFQUFHLEVBQUcsRUFBRyxJQUFLLElBQUssSUFBSyxHQUFJLElBQUssRUFBRyxFQUFHLEVBQUcsSUFBSyxJQUFLLElBQUssR0FBSSxJQUFLLEVBQUcsRUFBRyxFQUFHLElBQUssSUFBSyxJQUFLLEdBQUksSUFBSyxJQUFLLElBQUssSUFBSyxFQUFHLEVBQUcsR0FBSSxJQUFLLEVBQUcsRUFBRyxFQUFHLEVBQUcsR0FBSSxFQUFHLEdBQUksR0FBSSxFQUFHLEVBQUcsSUFBSyxHQUFJLEVBQUcsSUFBSyxHQUFJLEVBQUcsSUFBSyxHQUFJLEdBQUksSUFBSyxJQUFLLEdBQUksRUFBRyxJQUFLLEdBQUksRUFBRyxJQUFLLEdBQUksR0FBSSxJQUFLLElBQUssSUFBSyxHQUFJLEVBQUcsR0FBSSxHQUFJLElBQUssSUFBSyxHQUFJLEVBQUcsR0FBSSxFQUFHLElBQUssR0FBSSxHQUFJLEVBQUcsRUFBRyxJQUFLLEdBQUksRUFBRyxJQUFLLEdBQUksRUFBRyxJQUFLLEdBQUksR0FBSSxJQUFLLElBQUssR0FBSSxFQUFHLElBQUssR0FBSSxFQUFHLElBQUssR0FBSSxHQUFJLElBQUssSUFBSyxJQUFLLEdBQUksRUFBRyxHQUFJLEdBQUksSUFBSyxJQUFLLEdBQUksRUFBRyxHQUFJLEVBQUcsSUFBSyxHQUFJLEdBQUksRUFBRyxFQUFHLElBQUssR0FBSSxFQUFHLElBQUssR0FBSSxFQUFHLElB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dU8sRUFBTzNLLE1BQU01RCxHQUFLLEdBQUtvbkMsRUFBVXBuQyxHQUFLLEdBQUt5USxFQUFNN00sTUFBTSxFQUFJNUQsR0FFbkUsSUFBSyxJQUFJQSxFQUFJLEVBQUdBLEVBQUksSUFBS0EsRUFDdkJ3OEwsRUFBY3g4TCxFQUFJLEdBQUcsR0FDakI2NUwsRUFBYTc1TCxHQUFLbUUsS0FBSzJZLE1BQU0rOEssRUFBYTc1TCxHQUFLLEdBQ25EdzhMLEVBQWN4OEwsRUFBSSxHQUFHLEdBQUttRSxLQUFLMlksTUFBTSs4SyxFQUFhNzVMLEdBQUssR0FJN0QsT0FBT3c4TCxJIiwiZmlsZSI6IndlYm5uLXBvbHlmaWxsLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDApO1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIEFkZE5Qcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lczogc3RyaW5nW107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXSA9IFtdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG91dHB1dFNoYXBlOiBudW1iZXJbXSwgc2hhcGVzOiBudW1iZXJbXVtdKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IG91dHB1dFNoYXBlO1xuICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IHNoYXBlcy5tYXAoKF8sIGkpID0+IGBUJHtpfWApO1xuXG4gICAgY29uc3Qgc25pcHBldHM6IHN0cmluZ1tdID0gW107XG4gICAgLy8gR2V0IHRhcmdldCBlbGVtZW50cyBmcm9tIGV2ZXJ5IGlucHV0IHRlbnNvci5cbiAgICB0aGlzLnZhcmlhYmxlTmFtZXMuZm9yRWFjaCh2YXJpYWJsZSA9PiB7XG4gICAgICBzbmlwcGV0cy5wdXNoKGBmbG9hdCB2JHt2YXJpYWJsZX0gPSBnZXQke3ZhcmlhYmxlfUF0T3V0Q29vcmRzKCk7YCk7XG4gICAgfSk7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIHN1bSBvZiBhbGwgZWxlbWVudHMuXG4gICAgY29uc3Qgb3BlcmF0aW9uID0gdGhpcy52YXJpYWJsZU5hbWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAodmFyaWFibGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgdiR7dmFyaWFibGV9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4oJyArICcpO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgJHtzbmlwcGV0cy5qb2luKCdcXG4gICAgICAgICcpfVxuXG4gICAgICAgIGZsb2F0IHJlc3VsdCA9ICR7b3BlcmF0aW9ufTtcbiAgICAgICAgc2V0T3V0cHV0KHJlc3VsdCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIEFkZE5QYWNrZWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lczogc3RyaW5nW107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXSA9IFtdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBwYWNrZWRJbnB1dHMgPSB0cnVlO1xuICBwYWNrZWRPdXRwdXQgPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKG91dHB1dFNoYXBlOiBudW1iZXJbXSwgc2hhcGVzOiBudW1iZXJbXVtdKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IG91dHB1dFNoYXBlO1xuICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IHNoYXBlcy5tYXAoKF8sIGkpID0+IGBUJHtpfWApO1xuXG4gICAgY29uc3Qgc25pcHBldHM6IHN0cmluZ1tdID0gW107XG4gICAgLy8gR2V0IHRhcmdldCBlbGVtZW50cyBmcm9tIGV2ZXJ5IGlucHV0IHRlbnNvci5cbiAgICB0aGlzLnZhcmlhYmxlTmFtZXMuZm9yRWFjaCh2YXJpYWJsZSA9PiB7XG4gICAgICBzbmlwcGV0cy5wdXNoKGB2ZWM0IHYke3ZhcmlhYmxlfSA9IGdldCR7dmFyaWFibGV9QXRPdXRDb29yZHMoKTtgKTtcbiAgICB9KTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgc3VtIG9mIGFsbCBlbGVtZW50cy5cbiAgICBjb25zdCBvcGVyYXRpb24gPSB0aGlzLnZhcmlhYmxlTmFtZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCh2YXJpYWJsZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGB2JHt2YXJpYWJsZX1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAuam9pbignICsgJyk7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke3NuaXBwZXRzLmpvaW4oJ1xcbiAgICAgICAgJyl9XG5cbiAgICAgICAgdmVjNCByZXN1bHQgPSAke29wZXJhdGlvbn07XG4gICAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIEFyZ01pbk1heFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydBJ107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHJlZHVjZUluZm86IGJhY2tlbmRfdXRpbC5SZWR1Y2VJbmZvLCBvcDogJ21heCd8J21pbicsXG4gICAgICBmaXJzdFBhc3M6IGJvb2xlYW4pIHtcbiAgICBjb25zdCB7d2luZG93U2l6ZSwgYmF0Y2hTaXplLCBvdXRTaXplfSA9IHJlZHVjZUluZm87XG4gICAgaWYgKCFmaXJzdFBhc3MpIHtcbiAgICAgIHRoaXMudmFyaWFibGVOYW1lcy5wdXNoKCdiZXN0SW5kaWNlc0EnKTtcbiAgICB9XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IFtiYXRjaFNpemUsIG91dFNpemVdO1xuICAgIGNvbnN0IGNvbXBPcCA9IChvcCA9PT0gJ21heCcpID8gJz4nIDogJzwnO1xuICAgIGNvbnN0IGluZGV4U25pcHBldCA9IGZpcnN0UGFzcyA/XG4gICAgICAgICdpbk9mZnNldCArIGk7JyA6XG4gICAgICAgICdyb3VuZChnZXRCZXN0SW5kaWNlc0EoYmF0Y2gsIGluT2Zmc2V0ICsgaSkpOyc7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMiBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgb3V0SWR4ID0gY29vcmRzWzFdO1xuICAgICAgICBpbnQgaW5PZmZzZXQgPSBvdXRJZHggKiAke3dpbmRvd1NpemV9O1xuXG4gICAgICAgIGludCBiZXN0SW5kZXggPSBpbk9mZnNldDtcbiAgICAgICAgZmxvYXQgYmVzdFZhbHVlID0gZ2V0QShiYXRjaCwgYmVzdEluZGV4KTtcblxuICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8ICR7d2luZG93U2l6ZX07IGkrKykge1xuICAgICAgICAgIGludCBpbklkeCA9ICR7aW5kZXhTbmlwcGV0fTtcbiAgICAgICAgICBmbG9hdCBjYW5kaWRhdGUgPSBnZXRBKGJhdGNoLCBpbklkeCk7XG4gICAgICAgICAgaWYgKGNhbmRpZGF0ZSAke2NvbXBPcH0gYmVzdFZhbHVlKSB7XG4gICAgICAgICAgICBiZXN0VmFsdWUgPSBjYW5kaWRhdGU7XG4gICAgICAgICAgICBiZXN0SW5kZXggPSBpbklkeDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0T3V0cHV0KGZsb2F0KGJlc3RJbmRleCkpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHt1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7Z2V0Q2hhbm5lbHN9IGZyb20gJy4vcGFja2luZ191dGlsJztcbmltcG9ydCB7Z2V0Q29vcmRzRGF0YVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuZXhwb3J0IGNsYXNzIEFyZ01pbk1heFBhY2tlZFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydBJ107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgcGFja2VkSW5wdXRzID0gdHJ1ZTtcbiAgcGFja2VkT3V0cHV0ID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHNoYXBlOiBudW1iZXJbXSwgd2luZG93U2l6ZTogbnVtYmVyLCBvcDogJ21heCd8J21pbicsXG4gICAgICBmaXJzdFBhc3M6IGJvb2xlYW4pIHtcbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgc2hhcGUubGVuZ3RoID4gMixcbiAgICAgICAgKCkgPT4gYFBhY2tlZCBhcmcke1xuICAgICAgICAgICAgb3AuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgK1xuICAgICAgICAgICAgb3Auc2xpY2UoMSl9IHN1cHBvcnRzIG9ubHkgaW5wdXRzIHdpdGggcmFuayBhYm92ZSAyLmApO1xuICAgIGNvbnN0IGluU2l6ZSA9IHNoYXBlW3NoYXBlLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IG91dFNpemUgPSBNYXRoLmNlaWwoaW5TaXplIC8gd2luZG93U2l6ZSk7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IHNoYXBlLnNsaWNlKDAsIC0xKTtcbiAgICBpZiAob3V0U2l6ZSA+IDEpIHtcbiAgICAgIHRoaXMub3V0cHV0U2hhcGUucHVzaChvdXRTaXplKTtcbiAgICB9XG4gICAgaWYgKCFmaXJzdFBhc3MpIHtcbiAgICAgIHRoaXMudmFyaWFibGVOYW1lcy5wdXNoKCdiZXN0SW5kaWNlc0EnKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0U2hhcGUgPSB0aGlzLm91dHB1dFNoYXBlO1xuICAgIGNvbnN0IHJhbmsgPSBvdXRTaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgZHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShyYW5rKTtcbiAgICBjb25zdCBjb29yZHMgPSBnZXRDaGFubmVscygnY29vcmRzJywgcmFuayk7XG5cbiAgICBsZXQgc291cmNlTG9jU2V0dXA7XG4gICAgbGV0IHNvdXJjZVJhbms7XG4gICAgaWYgKG91dFNpemUgPT09IDEpIHtcbiAgICAgIHNvdXJjZVJhbmsgPSByYW5rICsgMTtcbiAgICAgIGNvbnN0IHNvdXJjZUxvY0RUeXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUoc291cmNlUmFuayk7XG4gICAgICBzb3VyY2VMb2NTZXR1cCA9IGBcbiAgICAgICAgJHtzb3VyY2VMb2NEVHlwZX0gc291cmNlTG9jUiA9ICR7c291cmNlTG9jRFR5cGV9KCR7Y29vcmRzLmpvaW4oKX0sIDApO1xuICAgICAgICArKyR7Y29vcmRzW3JhbmsgLSAxXX07XG4gICAgICAgICR7c291cmNlTG9jRFR5cGV9IHNvdXJjZUxvY0cgPSAke3NvdXJjZUxvY0RUeXBlfSgke2Nvb3Jkcy5qb2luKCl9LCAwKTtcbiAgICAgICAgKyske2Nvb3Jkc1tyYW5rIC0gMl19O1xuICAgICAgICAke3NvdXJjZUxvY0RUeXBlfSBzb3VyY2VMb2NBID0gJHtzb3VyY2VMb2NEVHlwZX0oJHtjb29yZHMuam9pbigpfSwgMCk7XG4gICAgICAgIC0tJHtjb29yZHNbcmFuayAtIDFdfTtcbiAgICAgICAgJHtzb3VyY2VMb2NEVHlwZX0gc291cmNlTG9jQiA9ICR7c291cmNlTG9jRFR5cGV9KCR7Y29vcmRzLmpvaW4oKX0sIDApO1xuICAgICAgICAtLSR7Y29vcmRzW3JhbmsgLSAyXX07YDtcbiAgICB9IGVsc2Uge1xuICAgICAgc291cmNlUmFuayA9IHJhbms7XG4gICAgICBzb3VyY2VMb2NTZXR1cCA9IGBcbiAgICAgICAgJHtkdHlwZX0gc291cmNlTG9jUiA9IGNvb3JkcztcbiAgICAgICAgKyske2Nvb3Jkc1tyYW5rIC0gMV19O1xuICAgICAgICAke2R0eXBlfSBzb3VyY2VMb2NHID0gY29vcmRzO1xuICAgICAgICArKyR7Y29vcmRzW3JhbmsgLSAyXX07XG4gICAgICAgICR7ZHR5cGV9IHNvdXJjZUxvY0EgPSBjb29yZHM7XG4gICAgICAgIC0tJHtjb29yZHNbcmFuayAtIDFdfTtcbiAgICAgICAgJHtkdHlwZX0gc291cmNlTG9jQiA9IGNvb3JkcztcbiAgICAgICAgLS0ke2Nvb3Jkc1tyYW5rIC0gMl19O2A7XG4gICAgfVxuICAgIGNvbnN0IGNoYW5uZWxzID0gWyd4JywgJ3knLCAneicsICd3JywgJ3UnLCAndiddLnNsaWNlKDAsIHNvdXJjZVJhbmspO1xuICAgIGNvbnN0IGluQ2hhbm5lbCA9ICcuJyArIGNoYW5uZWxzW3NvdXJjZVJhbmsgLSAxXTsgIC8vIGUuZy4gXCIuYlwiIGZvciByYW5rIDMuXG4gICAgY29uc3QgaW50Q2hhbm5lbHMgPSBjaGFubmVscy5tYXAoeCA9PiAnaW50ICcgKyB4KTtcbiAgICBjb25zdCBzcmNSQ29vcmRzID1cbiAgICAgICAgZ2V0Q2hhbm5lbHMoJ3NvdXJjZUxvY1InLCBzb3VyY2VSYW5rIC0gMSkuY29uY2F0KCdpbklkeC5yJyk7XG4gICAgY29uc3Qgc3JjR0Nvb3JkcyA9XG4gICAgICAgIGdldENoYW5uZWxzKCdzb3VyY2VMb2NHJywgc291cmNlUmFuayAtIDEpLmNvbmNhdCgnaW5JZHguZycpO1xuICAgIGNvbnN0IHNyY0JDb29yZHMgPVxuICAgICAgICBnZXRDaGFubmVscygnc291cmNlTG9jQicsIHNvdXJjZVJhbmsgLSAxKS5jb25jYXQoJ2luSWR4LmInKTtcbiAgICBjb25zdCBzcmNBQ29vcmRzID1cbiAgICAgICAgZ2V0Q2hhbm5lbHMoJ3NvdXJjZUxvY0EnLCBzb3VyY2VSYW5rIC0gMSkuY29uY2F0KCdpbklkeC5hJyk7XG5cbiAgICBjb25zdCBjb21wT3AgPSAob3AgPT09ICdtYXgnKSA/ICdncmVhdGVyVGhhbicgOiAnbGVzc1RoYW4nO1xuICAgIGNvbnN0IGZldGNoQ2FuZGlkYXRlSWR4ID0gZmlyc3RQYXNzID8gJycgOiBgXG4gICAgICAgICAgaW5JZHggPSByb3VuZCh2ZWM0KGdldEJlc3RJbmRpY2VzQUNoYW5uZWwoJHtzcmNSQ29vcmRzLmpvaW4oKX0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRCZXN0SW5kaWNlc0FDaGFubmVsKCR7c3JjR0Nvb3Jkcy5qb2luKCl9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QmVzdEluZGljZXNBQ2hhbm5lbCgke3NyY0JDb29yZHMuam9pbigpfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEJlc3RJbmRpY2VzQUNoYW5uZWwoJHtzcmNBQ29vcmRzLmpvaW4oKX0pKSk7YDtcblxuICAgIGNvbnN0IGZldGNoVmFsdWUgPSBgdmVjNChcbiAgICAgICAgICAgIGdldEFDaGFubmVsKCR7c3JjUkNvb3Jkcy5qb2luKCl9KSxcbiAgICAgICAgICAgIGhhc05leHRDb2wgPyBnZXRBQ2hhbm5lbCgke3NyY0dDb29yZHMuam9pbigpfSkgOiAwLixcbiAgICAgICAgICAgIGhhc05leHRSb3cgPyBnZXRBQ2hhbm5lbCgke3NyY0JDb29yZHMuam9pbigpfSkgOiAwLixcbiAgICAgICAgICAgIGhhc05leHRSb3cgJiYgaGFzTmV4dENvbCA/IGdldEFDaGFubmVsKCR7c3JjQUNvb3Jkcy5qb2luKCl9KSA6IDAuKWA7XG5cbiAgICBjb25zdCBnZXRCZXN0SW5kaWNlc0FDaGFubmVsU25pcHBldCA9IGZpcnN0UGFzcyA/ICcnIDogYFxuICAgICAgZmxvYXQgZ2V0QmVzdEluZGljZXNBQ2hhbm5lbCgke2ludENoYW5uZWxzLmpvaW4oKX0pIHtcbiAgICAgICAgcmV0dXJuIGdldENoYW5uZWwoZ2V0QmVzdEluZGljZXNBKCR7Y2hhbm5lbHMuam9pbigpfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKCR7Y2hhbm5lbHMuc2xpY2UoLTIpLmpvaW4oKX0pKTtcbiAgICAgIH1gO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGZsb2F0IGdldEFDaGFubmVsKCR7aW50Q2hhbm5lbHMuam9pbigpfSkge1xuICAgICAgICByZXR1cm4gZ2V0Q2hhbm5lbChnZXRBKCR7Y2hhbm5lbHMuam9pbigpfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke2NoYW5uZWxzLnNsaWNlKC0yKS5qb2luKCl9KSk7XG4gICAgICB9XG4gICAgICAke2dldEJlc3RJbmRpY2VzQUNoYW5uZWxTbmlwcGV0fVxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke2R0eXBlfSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgYm9vbCBoYXNOZXh0Q29sID0gJHtjb29yZHNbcmFuayAtIDFdfSA8ICR7b3V0U2hhcGVbcmFuayAtIDFdIC0gMX07XG4gICAgICAgIGJvb2wgaGFzTmV4dFJvdyA9ICR7Y29vcmRzW3JhbmsgLSAyXX0gPCAke291dFNoYXBlW3JhbmsgLSAyXSAtIDF9O1xuICAgICAgICAke3NvdXJjZUxvY1NldHVwfVxuICAgICAgICBpdmVjNCBzcmNJZHggPSBpdmVjNChzb3VyY2VMb2NSJHtpbkNoYW5uZWx9LCBzb3VyY2VMb2NHJHtpbkNoYW5uZWx9LFxuICAgICAgICAgIHNvdXJjZUxvY0Ike2luQ2hhbm5lbH0sIHNvdXJjZUxvY0Eke2luQ2hhbm5lbH0pICogJHt3aW5kb3dTaXplfTtcbiAgICAgICAgaXZlYzQgaW5JZHggPSBzcmNJZHg7XG4gICAgICAgIHZlYzQgYmVzdEluZGV4ID0gdmVjNChpbklkeCk7XG4gICAgICAgIHZlYzQgYmVzdFZhbHVlID0gJHtmZXRjaFZhbHVlfTtcblxuICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8ICR7d2luZG93U2l6ZX07IGkrKykge1xuICAgICAgICAgIGluSWR4ID0gc3JjSWR4O1xuICAgICAgICAgICR7ZmV0Y2hDYW5kaWRhdGVJZHh9XG4gICAgICAgICAgdmVjNCBjYW5kaWRhdGUgPSAke2ZldGNoVmFsdWV9O1xuICAgICAgICAgIGJ2ZWM0IG5hbiA9IGlzbmFuKGNhbmRpZGF0ZSk7XG4gICAgICAgICAgYnZlYzQgcmVwbGFjZSA9IGJ2ZWM0KFxuICAgICAgICAgICAgdmVjNCgke2NvbXBPcH0oY2FuZGlkYXRlLCBiZXN0VmFsdWUpKSAqICh2ZWM0KDEuMCkgLSB2ZWM0KG5hbikpKTtcblxuICAgICAgICAgIGJlc3RWYWx1ZSA9IHZlYzQocmVwbGFjZS54ICA/IGNhbmRpZGF0ZS54IDogYmVzdFZhbHVlLngsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlLnkgID8gY2FuZGlkYXRlLnkgOiBiZXN0VmFsdWUueSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2UueiAgPyBjYW5kaWRhdGUueiA6IGJlc3RWYWx1ZS56LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZS53ICA/IGNhbmRpZGF0ZS53IDogYmVzdFZhbHVlLncpO1xuICAgICAgICAgIGJlc3RJbmRleCA9IG1peChiZXN0SW5kZXgsIHZlYzQoaW5JZHgpLCB2ZWM0KHJlcGxhY2UpKTtcbiAgICAgICAgICBzcmNJZHgrKztcbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQoYmVzdEluZGV4KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBBdmdQb29sMkRCYWNrcHJvcFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydkeSddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoY29udkluZm86IGJhY2tlbmRfdXRpbC5Db252MkRJbmZvKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGNvbnZJbmZvLmluU2hhcGU7XG4gICAgY29uc3QgZmlsdGVySGVpZ2h0ID0gY29udkluZm8uZmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG4gICAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgY29uc3QgZGlsYXRpb25IZWlnaHQgPSBjb252SW5mby5kaWxhdGlvbkhlaWdodDtcbiAgICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJIZWlnaHQ7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVyV2lkdGggPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJXaWR0aDtcblxuICAgIGNvbnN0IHBhZFRvcCA9IGVmZmVjdGl2ZUZpbHRlckhlaWdodCAtIDEgLSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICBjb25zdCBwYWRMZWZ0ID0gZWZmZWN0aXZlRmlsdGVyV2lkdGggLSAxIC0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuXG4gICAgY29uc3QgYXZnTXVsdGlwbGllciA9IDEgLyAoZmlsdGVySGVpZ2h0ICogZmlsdGVyV2lkdGgpO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IGl2ZWMyIHBhZHMgPSBpdmVjMigke3BhZFRvcH0sICR7cGFkTGVmdH0pO1xuICAgICAgY29uc3QgZmxvYXQgYXZnTXVsdGlwbGllciA9IGZsb2F0KCR7YXZnTXVsdGlwbGllcn0pO1xuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYiA9IGNvb3Jkc1swXTtcbiAgICAgICAgaW50IGQgPSBjb29yZHNbM107XG5cbiAgICAgICAgaXZlYzIgZHlSQ0Nvcm5lciA9IGNvb3Jkcy55eiAtIHBhZHM7XG4gICAgICAgIGludCBkeVJDb3JuZXIgPSBkeVJDQ29ybmVyLng7XG4gICAgICAgIGludCBkeUNDb3JuZXIgPSBkeVJDQ29ybmVyLnk7XG5cbiAgICAgICAgLy8gQ29udm9sdmUgZHkoPywgPywgZCkgd2l0aCBwb3MgbWFzayg6LCA6LCBkKSB0byBnZXQgZHgoeFIsIHhDLCBkKS5cbiAgICAgICAgLy8gPyA9IHRvIGJlIGRldGVybWluZWQuIDogPSBhY3Jvc3MgYWxsIHZhbHVlcyBpbiB0aGF0IGF4aXMuXG4gICAgICAgIGZsb2F0IGRvdFByb2QgPSAwLjA7XG4gICAgICAgIGZvciAoaW50IHdSID0gMDsgd1IgPCAke2VmZmVjdGl2ZUZpbHRlckhlaWdodH07XG4gICAgICAgICAgICB3UiArPSAke2RpbGF0aW9uSGVpZ2h0fSkge1xuICAgICAgICAgIGZsb2F0IGR5UiA9IGZsb2F0KGR5UkNvcm5lciArIHdSKSAvICR7c3RyaWRlSGVpZ2h0fS4wO1xuXG4gICAgICAgICAgaWYgKGR5UiA8IDAuMCB8fCBkeVIgPj0gJHtjb252SW5mby5vdXRIZWlnaHR9LjAgfHwgZnJhY3QoZHlSKSA+IDAuMCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGludCBpZHlSID0gaW50KGR5Uik7XG5cbiAgICAgICAgICBmb3IgKGludCB3QyA9IDA7IHdDIDwgJHtlZmZlY3RpdmVGaWx0ZXJXaWR0aH07XG4gICAgICAgICAgICB3Qys9ICR7ZGlsYXRpb25XaWR0aH0pIHtcbiAgICAgICAgICAgIGZsb2F0IGR5QyA9IGZsb2F0KGR5Q0Nvcm5lciArIHdDKSAvICR7c3RyaWRlV2lkdGh9LjA7XG5cbiAgICAgICAgICAgIGlmIChkeUMgPCAwLjAgfHwgZHlDID49ICR7Y29udkluZm8ub3V0V2lkdGh9LjAgfHxcbiAgICAgICAgICAgICAgICBmcmFjdChkeUMpID4gMC4wKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW50IGlkeUMgPSBpbnQoZHlDKTtcblxuICAgICAgICAgICAgZmxvYXQgZHlWYWx1ZSA9IGdldER5KGIsIGlkeVIsIGlkeUMsIGQpO1xuXG4gICAgICAgICAgICBkb3RQcm9kICs9IGR5VmFsdWUgKiBhdmdNdWx0aXBsaWVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQoZG90UHJvZCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQXZnUG9vbDNEQmFja3Byb3BQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnZHknXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGNvbnZJbmZvOiBiYWNrZW5kX3V0aWwuQ29udjNESW5mbykge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5pblNoYXBlO1xuICAgIGNvbnN0IGZpbHRlckRlcHRoID0gY29udkluZm8uZmlsdGVyRGVwdGg7XG4gICAgY29uc3QgZmlsdGVySGVpZ2h0ID0gY29udkluZm8uZmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG4gICAgY29uc3Qgc3RyaWRlRGVwdGggPSBjb252SW5mby5zdHJpZGVEZXB0aDtcbiAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBkaWxhdGlvbkRlcHRoID0gY29udkluZm8uZGlsYXRpb25EZXB0aDtcbiAgICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICAgIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckRlcHRoID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVyRGVwdGg7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVySGVpZ2h0ID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlcldpZHRoID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVyV2lkdGg7XG5cbiAgICBjb25zdCBwYWRGcm9udCA9IGVmZmVjdGl2ZUZpbHRlckRlcHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8uZnJvbnQ7XG4gICAgY29uc3QgcGFkVG9wID0gZWZmZWN0aXZlRmlsdGVySGVpZ2h0IC0gMSAtIGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IHBhZExlZnQgPSBlZmZlY3RpdmVGaWx0ZXJXaWR0aCAtIDEgLSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG5cbiAgICBjb25zdCBhdmdNdWx0aXBsaWVyID0gMSAvIChmaWx0ZXJEZXB0aCAqIGZpbHRlckhlaWdodCAqIGZpbHRlcldpZHRoKTtcblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCBpdmVjMyBwYWRzID0gaXZlYzMoJHtwYWRGcm9udH0sICR7cGFkVG9wfSwgJHtwYWRMZWZ0fSk7XG4gICAgICBjb25zdCBmbG9hdCBhdmdNdWx0aXBsaWVyID0gZmxvYXQoJHthdmdNdWx0aXBsaWVyfSk7XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzUgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiYXRjaCA9IGNvb3Jkcy54O1xuICAgICAgICBpbnQgY2ggPSBjb29yZHMudTtcblxuICAgICAgICBpdmVjMyBkeUNvcm5lciA9IGl2ZWMzKGNvb3Jkcy55LCBjb29yZHMueiwgY29vcmRzLncpIC0gcGFkcztcbiAgICAgICAgaW50IGR5RENvcm5lciA9IGR5Q29ybmVyLng7XG4gICAgICAgIGludCBkeVJDb3JuZXIgPSBkeUNvcm5lci55O1xuICAgICAgICBpbnQgZHlDQ29ybmVyID0gZHlDb3JuZXIuejtcblxuICAgICAgICAvLyBDb252b2x2ZSBkeSg/LCA/LCA/LCBkKSB3aXRoIHBvcyBtYXNrKDosIDosIDosIGNoKSB0byBnZXRcbiAgICAgICAgLy8gZHgoeEQsIHhSLCB4QywgY2gpLlxuICAgICAgICAvLyA/ID0gdG8gYmUgZGV0ZXJtaW5lZC4gOiA9IGFjcm9zcyBhbGwgdmFsdWVzIGluIHRoYXQgYXhpcy5cbiAgICAgICAgZmxvYXQgZG90UHJvZCA9IDAuMDtcblxuICAgICAgICBmb3IgKGludCB3RCA9IDA7IHdEIDwgJHtlZmZlY3RpdmVGaWx0ZXJEZXB0aH07XG4gICAgICAgICAgICB3RCArPSAke2RpbGF0aW9uRGVwdGh9KSB7XG4gICAgICAgICAgZmxvYXQgZHlEID0gZmxvYXQoZHlEQ29ybmVyICsgd0QpIC8gJHtzdHJpZGVEZXB0aH0uMDtcblxuICAgICAgICAgIGlmIChkeUQgPCAwLjAgfHwgZHlEID49ICR7Y29udkluZm8ub3V0RGVwdGh9LjAgfHwgZnJhY3QoZHlEKSA+IDAuMCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGludCBpZHlEID0gaW50KGR5RCk7XG5cbiAgICAgICAgICBmb3IgKGludCB3UiA9IDA7IHdSIDwgJHtlZmZlY3RpdmVGaWx0ZXJIZWlnaHR9O1xuICAgICAgICAgICAgICB3UiArPSAke2RpbGF0aW9uSGVpZ2h0fSkge1xuICAgICAgICAgICAgZmxvYXQgZHlSID0gZmxvYXQoZHlSQ29ybmVyICsgd1IpIC8gJHtzdHJpZGVIZWlnaHR9LjA7XG5cbiAgICAgICAgICAgIGlmIChkeVIgPCAwLjAgfHwgZHlSID49ICR7Y29udkluZm8ub3V0SGVpZ2h0fS4wIHx8XG4gICAgICAgICAgICAgICAgZnJhY3QoZHlSKSA+IDAuMCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGludCBpZHlSID0gaW50KGR5Uik7XG5cbiAgICAgICAgICAgIGZvciAoaW50IHdDID0gMDsgd0MgPCAke2VmZmVjdGl2ZUZpbHRlcldpZHRofTtcbiAgICAgICAgICAgICAgICB3QyArPSAke2RpbGF0aW9uV2lkdGh9KSB7XG4gICAgICAgICAgICAgIGZsb2F0IGR5QyA9IGZsb2F0KGR5Q0Nvcm5lciArIHdDKSAvICR7c3RyaWRlV2lkdGh9LjA7XG5cbiAgICAgICAgICAgICAgaWYgKGR5QyA8IDAuMCB8fCBkeUMgPj0gJHtjb252SW5mby5vdXRXaWR0aH0uMCB8fFxuICAgICAgICAgICAgICAgICAgZnJhY3QoZHlDKSA+IDAuMCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGludCBpZHlDID0gaW50KGR5Qyk7XG5cbiAgICAgICAgICAgICAgZmxvYXQgZHlWYWx1ZSA9IGdldER5KGJhdGNoLCBpZHlELCBpZHlSLCBpZHlDLCBjaCk7XG5cbiAgICAgICAgICAgICAgZG90UHJvZCArPSBkeVZhbHVlICogYXZnTXVsdGlwbGllcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0T3V0cHV0KGRvdFByb2QpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLy8gSW1wb3J0IHdlYmdsIGZsYWdzLlxuaW1wb3J0ICcuL2ZsYWdzX3dlYmdsJztcblxuaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7YmFja2VuZF91dGlsLCBCYWNrZW5kVmFsdWVzLCBidWZmZXIsIERhdGFJZCwgRGF0YVN0b3JhZ2UsIERhdGFUeXBlLCBEYXRhVmFsdWVzLCBlbmdpbmUsIGVudiwga2VybmVsX2ltcGxzLCBLZXJuZWxCYWNrZW5kLCBNZW1vcnlJbmZvLCBOdW1lcmljRGF0YVR5cGUsIFJhbmssIFJlY3Vyc2l2ZUFycmF5LCBzY2FsYXIsIFNoYXBlTWFwLCBUZW5zb3IsIFRlbnNvcjJELCBUZW5zb3JCdWZmZXIsIFRlbnNvckluZm8sIHRpZHksIFRpbWluZ0luZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7Z2V0V2ViR0xDb250ZXh0fSBmcm9tICcuL2NhbnZhc191dGlsJztcbmltcG9ydCB7RGVjb2RlTWF0cml4UHJvZ3JhbX0gZnJvbSAnLi9kZWNvZGVfbWF0cml4X2dwdSc7XG5pbXBvcnQge0RlY29kZU1hdHJpeFBhY2tlZFByb2dyYW19IGZyb20gJy4vZGVjb2RlX21hdHJpeF9wYWNrZWRfZ3B1JztcbmltcG9ydCB7RW5jb2RlRmxvYXRQcm9ncmFtfSBmcm9tICcuL2VuY29kZV9mbG9hdF9ncHUnO1xuaW1wb3J0IHtFbmNvZGVGbG9hdFBhY2tlZFByb2dyYW19IGZyb20gJy4vZW5jb2RlX2Zsb2F0X3BhY2tlZF9ncHUnO1xuaW1wb3J0IHtFbmNvZGVNYXRyaXhQcm9ncmFtfSBmcm9tICcuL2VuY29kZV9tYXRyaXhfZ3B1JztcbmltcG9ydCB7RW5jb2RlTWF0cml4UGFja2VkUHJvZ3JhbX0gZnJvbSAnLi9lbmNvZGVfbWF0cml4X3BhY2tlZF9ncHUnO1xuaW1wb3J0IHtHUEdQVUNvbnRleHR9IGZyb20gJy4vZ3BncHVfY29udGV4dCc7XG5pbXBvcnQgKiBhcyBncGdwdV9tYXRoIGZyb20gJy4vZ3BncHVfbWF0aCc7XG5pbXBvcnQge0dQR1BVQmluYXJ5LCBHUEdQVVByb2dyYW0sIFRlbnNvckRhdGF9IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5pbXBvcnQge3NpbXBsZUFic0ltcGxDUFV9IGZyb20gJy4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5pbXBvcnQge1BhY2tQcm9ncmFtfSBmcm9tICcuL3BhY2tfZ3B1JztcbmltcG9ydCB7UmVzaGFwZVBhY2tlZFByb2dyYW19IGZyb20gJy4vcmVzaGFwZV9wYWNrZWRfZ3B1JztcbmltcG9ydCAqIGFzIHRleF91dGlsIGZyb20gJy4vdGV4X3V0aWwnO1xuaW1wb3J0IHtUZXh0dXJlRGF0YSwgVGV4dHVyZVVzYWdlfSBmcm9tICcuL3RleF91dGlsJztcbmltcG9ydCB7VGV4dHVyZU1hbmFnZXJ9IGZyb20gJy4vdGV4dHVyZV9tYW5hZ2VyJztcbmltcG9ydCAqIGFzIHVuYXJ5X29wIGZyb20gJy4vdW5hcnlvcF9ncHUnO1xuaW1wb3J0IHtVbmFyeU9wUHJvZ3JhbX0gZnJvbSAnLi91bmFyeW9wX2dwdSc7XG5pbXBvcnQge1VuYXJ5T3BQYWNrZWRQcm9ncmFtfSBmcm9tICcuL3VuYXJ5b3BfcGFja2VkX2dwdSc7XG5pbXBvcnQge1VucGFja1Byb2dyYW19IGZyb20gJy4vdW5wYWNrX2dwdSc7XG5pbXBvcnQgKiBhcyB3ZWJnbF91dGlsIGZyb20gJy4vd2ViZ2xfdXRpbCc7XG5cbmNvbnN0IHdoZXJlSW1wbCA9IGtlcm5lbF9pbXBscy53aGVyZUltcGw7XG5cbmV4cG9ydCBjb25zdCBFUFNJTE9OX0ZMT0FUMzIgPSAxZS03O1xuZXhwb3J0IGNvbnN0IEVQU0lMT05fRkxPQVQxNiA9IDFlLTQ7XG5cbnR5cGUgS2VybmVsSW5mbyA9IHtcbiAgbmFtZTogc3RyaW5nOyBxdWVyeTogUHJvbWlzZTxudW1iZXI+O1xufTtcblxuZXhwb3J0IHR5cGUgVGltZXJOb2RlID0gUmVjdXJzaXZlQXJyYXk8S2VybmVsSW5mbz58S2VybmVsSW5mbztcbmV4cG9ydCBpbnRlcmZhY2UgQ1BVVGltZXJRdWVyeSB7XG4gIHN0YXJ0TXM6IG51bWJlcjtcbiAgZW5kTXM/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2ViR0xNZW1vcnlJbmZvIGV4dGVuZHMgTWVtb3J5SW5mbyB7XG4gIG51bUJ5dGVzSW5HUFU6IG51bWJlcjtcbiAgLy8gVHJhY2tzIHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkIG9uIHRoZSBHUFUsIGFjY291bnRpbmcgZm9yIHRoZVxuICAvLyBwaHlzaWNhbCB0ZXh0dXJlIHR5cGUuXG4gIG51bUJ5dGVzSW5HUFVBbGxvY2F0ZWQ6IG51bWJlcjtcbiAgLy8gVHJhY2tzIGJ5dGUgc2l6ZSBvZiB0ZXh0dXJlcyB0aGF0IHdlcmUgY3JlYXRlZCBhbmQgdGhlbiBtYWRlIGF2YWlsYWJsZSBmb3JcbiAgLy8gcmV1c2UgKGRpc3Bvc2VkKS5cbiAgbnVtQnl0ZXNJbkdQVUZyZWU6IG51bWJlcjtcbiAgdW5yZWxpYWJsZTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXZWJHTFRpbWluZ0luZm8gZXh0ZW5kcyBUaW1pbmdJbmZvIHtcbiAgdXBsb2FkV2FpdE1zOiBudW1iZXI7XG4gIGRvd25sb2FkV2FpdE1zOiBudW1iZXI7XG59XG5cbmNvbnN0IGJpbmFyeUNhY2hlczoge1t3ZWJHTFZlcnNpb246IHN0cmluZ106IHtba2V5OiBzdHJpbmddOiBHUEdQVUJpbmFyeX19ID0ge307XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCaW5hcnlDYWNoZSh3ZWJHTFZlcnNpb246IG51bWJlcikge1xuICBpZiAod2ViR0xWZXJzaW9uIGluIGJpbmFyeUNhY2hlcykge1xuICAgIHJldHVybiBiaW5hcnlDYWNoZXNbd2ViR0xWZXJzaW9uXTtcbiAgfVxuICBiaW5hcnlDYWNoZXNbd2ViR0xWZXJzaW9uXSA9IHt9O1xuICByZXR1cm4gYmluYXJ5Q2FjaGVzW3dlYkdMVmVyc2lvbl07XG59XG5cbi8vIEVtcGlyaWNhbGx5IGRldGVybWluZWQgY29uc3RhbnQgdXNlZCB0byBkZXRlcm1pbmUgc2l6ZSB0aHJlc2hvbGQgZm9yIGhhbmRpbmdcbi8vIG9mZiBleGVjdXRpb24gdG8gdGhlIENQVS5cbmNvbnN0IENQVV9IQU5ET0ZGX1NJWkVfVEhSRVNIT0xEID1cbiAgICBlbnYoKS5nZXROdW1iZXIoJ0NQVV9IQU5ET0ZGX1NJWkVfVEhSRVNIT0xEJyk7XG5cbi8vIEVtcGlyaWNhbGx5IGRldGVybWluZWQgY29uc3RhbnQgdXNlZCB0byBkZWNpZGUgdGhlIG51bWJlciBvZiBNQiBvbiBHUFVcbi8vIGJlZm9yZSB3ZSB3YXJuIGFib3V0IGhpZ2ggbWVtb3J5IHVzZS4gVGhlIE1CIGFyZSB0aGlzIGNvbnN0YW50ICogc2NyZWVuIGFyZWFcbi8vICogZHBpIC8gMTAyNCAvIDEwMjQuXG5jb25zdCBCRUZPUkVfUEFHSU5HX0NPTlNUQU5UID0gNjAwO1xuZnVuY3Rpb24gbnVtTUJCZWZvcmVXYXJuaW5nKCk6IG51bWJlciB7XG4gIGlmIChlbnYoKS5nbG9iYWwuc2NyZWVuID09IG51bGwpIHtcbiAgICByZXR1cm4gMTAyNDsgIC8vIDEgR0IuXG4gIH1cbiAgcmV0dXJuIChlbnYoKS5nbG9iYWwuc2NyZWVuLmhlaWdodCAqIGVudigpLmdsb2JhbC5zY3JlZW4ud2lkdGggKlxuICAgICAgICAgIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKSAqXG4gICAgICBCRUZPUkVfUEFHSU5HX0NPTlNUQU5UIC8gMTAyNCAvIDEwMjQ7XG59XG5cbmV4cG9ydCBjbGFzcyBNYXRoQmFja2VuZFdlYkdMIGV4dGVuZHMgS2VybmVsQmFja2VuZCB7XG4gIHRleERhdGE6IERhdGFTdG9yYWdlPFRleHR1cmVEYXRhPjtcbiAgZ3BncHU6IEdQR1BVQ29udGV4dDtcblxuICBwcml2YXRlIHN0YXRpYyBuZXh0RGF0YUlkID0gMDtcbiAgcHJpdmF0ZSBuZXh0RGF0YUlkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGhCYWNrZW5kV2ViR0wubmV4dERhdGFJZCsrO1xuICB9XG4gIC8vIE1hcHMgZGF0YSBpZHMgdGhhdCBoYXZlIGEgcGVuZGluZyByZWFkIG9wZXJhdGlvbiwgdG8gbGlzdCBvZiBzdWJzY3JpYmVycy5cbiAgcHJpdmF0ZSBwZW5kaW5nUmVhZCA9IG5ldyBXZWFrTWFwPERhdGFJZCwgQXJyYXk8KGFycjogVHlwZWRBcnJheSkgPT4gdm9pZD4+KCk7XG4gIC8vIExpc3Qgb2YgZGF0YSBpZHMgdGhhdCBhcmUgc2NoZWR1bGVkIGZvciBkaXNwb3NhbCwgYnV0IGFyZSB3YWl0aW5nIG9uIGFcbiAgLy8gcGVuZGluZyByZWFkIG9wZXJhdGlvbi5cbiAgcHJpdmF0ZSBwZW5kaW5nRGlzcG9zYWwgPSBuZXcgV2Vha1NldDxEYXRhSWQ+KCk7XG5cbiAgLy8gVXNlZCB0byBjb3VudCB0aGUgbnVtYmVyIG9mICdzaGFsbG93JyBzbGljZWQgdGVuc29ycyB0aGF0IHBvaW50IHRvIHRoZVxuICAvLyBzYW1lIGRhdGEgaWQuXG4gIGRhdGFSZWZDb3VudCA9IG5ldyBXZWFrTWFwPERhdGFJZCwgbnVtYmVyPigpO1xuICBwcml2YXRlIG51bUJ5dGVzSW5HUFUgPSAwO1xuXG4gIHByaXZhdGUgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudHxPZmZzY3JlZW5DYW52YXM7XG5cbiAgcHJpdmF0ZSBwcm9ncmFtVGltZXJzU3RhY2s6IFRpbWVyTm9kZVtdO1xuICBwcml2YXRlIGFjdGl2ZVRpbWVyczogVGltZXJOb2RlW107XG4gIC8vIEFjY3VtdWxhdGVkIHRpbWUgc3BlbnQgKGluY2x1ZGluZyBibG9ja2luZykgaW4gdXBsb2FkaW5nIGRhdGEgdG8gd2ViZ2wuXG4gIHByaXZhdGUgdXBsb2FkV2FpdE1zID0gMDtcbiAgLy8gQWNjdW11bGF0ZWQgdGltZSBzcGVudCAoaW5jbHVkaW5nIGJsb2NraW5nIGluIGRvd25sb2FkaW5nIGRhdGEgZnJvbSB3ZWJnbC5cbiAgcHJpdmF0ZSBkb3dubG9hZFdhaXRNcyA9IDA7XG5cbiAgLy8gcmVjb3JkIHRoZSBsYXN0IG1hbnVhbCBHTCBGbHVzaCB0aW1lLlxuICBwcml2YXRlIGxhc3RHbEZsdXNoVGltZSA9IDA7XG5cbiAgLy8gTnVtYmVyIG9mIGJpdHMgb2YgcHJlY2lzaW9uIG9mIHRoaXMgYmFja2VuZC5cbiAgcHJpdmF0ZSBmbG9hdFByZWNpc2lvblZhbHVlOiAzMnwxNjtcblxuICBwcml2YXRlIHRleHR1cmVNYW5hZ2VyOiBUZXh0dXJlTWFuYWdlcjtcbiAgcHJpdmF0ZSBiaW5hcnlDYWNoZToge1trZXk6IHN0cmluZ106IEdQR1BVQmluYXJ5fTtcbiAgcHJpdmF0ZSBncGdwdUNyZWF0ZWRMb2NhbGx5OiBib29sZWFuO1xuICBwcml2YXRlIG51bU1CQmVmb3JlV2FybmluZzogbnVtYmVyO1xuICBwcml2YXRlIHdhcm5lZEFib3V0TWVtb3J5ID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoZ3BncHU/OiBHUEdQVUNvbnRleHQpIHtcbiAgICBzdXBlcigpO1xuICAgIGlmICghZW52KCkuZ2V0Qm9vbCgnSEFTX1dFQkdMJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignV2ViR0wgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGRldmljZScpO1xuICAgIH1cblxuICAgIGlmIChncGdwdSA9PSBudWxsKSB7XG4gICAgICBjb25zdCBnbCA9IGdldFdlYkdMQ29udGV4dChlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX1ZFUlNJT04nKSk7XG4gICAgICB0aGlzLmJpbmFyeUNhY2hlID0gZ2V0QmluYXJ5Q2FjaGUoZW52KCkuZ2V0TnVtYmVyKCdXRUJHTF9WRVJTSU9OJykpO1xuICAgICAgdGhpcy5ncGdwdSA9IG5ldyBHUEdQVUNvbnRleHQoZ2wpO1xuICAgICAgdGhpcy5jYW52YXMgPSBnbC5jYW52YXM7XG4gICAgICB0aGlzLmdwZ3B1Q3JlYXRlZExvY2FsbHkgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmdwZ3B1ID0gZ3BncHU7XG4gICAgICB0aGlzLmJpbmFyeUNhY2hlID0ge307XG4gICAgICB0aGlzLmdwZ3B1Q3JlYXRlZExvY2FsbHkgPSBmYWxzZTtcbiAgICAgIHRoaXMuY2FudmFzID0gZ3BncHUuZ2wuY2FudmFzO1xuICAgIH1cbiAgICB0aGlzLnRleHR1cmVNYW5hZ2VyID0gbmV3IFRleHR1cmVNYW5hZ2VyKHRoaXMuZ3BncHUpO1xuICAgIHRoaXMubnVtTUJCZWZvcmVXYXJuaW5nID0gbnVtTUJCZWZvcmVXYXJuaW5nKCk7XG5cbiAgICB0aGlzLnRleERhdGEgPSBuZXcgRGF0YVN0b3JhZ2UodGhpcywgZW5naW5lKCkpO1xuICB9XG5cbiAgbnVtRGF0YUlkcygpIHtcbiAgICByZXR1cm4gdGhpcy50ZXhEYXRhLm51bURhdGFJZHMoKSAtIHRoaXMucGVuZGluZ0RlbGV0ZXM7XG4gIH1cblxuICB3cml0ZSh2YWx1ZXM6IEJhY2tlbmRWYWx1ZXMsIHNoYXBlOiBudW1iZXJbXSwgZHR5cGU6IERhdGFUeXBlKTogRGF0YUlkIHtcbiAgICBpZiAoZW52KCkuZ2V0Qm9vbCgnV0VCR0xfQ0hFQ0tfTlVNRVJJQ0FMX1BST0JMRU1TJykgfHxcbiAgICAgICAgZW52KCkuZ2V0Qm9vbCgnREVCVUcnKSkge1xuICAgICAgdGhpcy5jaGVja051bWVyaWNhbFByb2JsZW1zKHZhbHVlcyk7XG4gICAgfVxuICAgIGlmIChkdHlwZSA9PT0gJ2NvbXBsZXg2NCcgJiYgdmFsdWVzICE9IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IHdyaXRlIHRvIGEgY29tcGxleDY0IGR0eXBlLiBgICtcbiAgICAgICAgICBgUGxlYXNlIHVzZSB0Zi5jb21wbGV4KHJlYWwsIGltYWcpLmApO1xuICAgIH1cbiAgICBjb25zdCBkYXRhSWQgPSB7aWQ6IHRoaXMubmV4dERhdGFJZCgpfTtcbiAgICB0aGlzLnRleERhdGEuc2V0KFxuICAgICAgICBkYXRhSWQsXG4gICAgICAgIHtzaGFwZSwgZHR5cGUsIHZhbHVlcywgdXNhZ2U6IFRleHR1cmVVc2FnZS5VUExPQUQsIHJlZkNvdW50OiAxfSk7XG4gICAgcmV0dXJuIGRhdGFJZDtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gcmVmQ291bnQgb2YgYSBgVGVuc29yRGF0YWAuICovXG4gIHJlZkNvdW50KGRhdGFJZDogRGF0YUlkKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy50ZXhEYXRhLmhhcyhkYXRhSWQpKSB7XG4gICAgICBjb25zdCB0ZW5zb3JEYXRhID0gdGhpcy50ZXhEYXRhLmdldChkYXRhSWQpO1xuICAgICAgcmV0dXJuIHRlbnNvckRhdGEucmVmQ291bnQ7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLyoqIEluY3JlYXNlIHJlZkNvdW50IG9mIGEgYFRleHR1cmVEYXRhYC4gKi9cbiAgaW5jUmVmKGRhdGFJZDogRGF0YUlkKTogdm9pZCB7XG4gICAgY29uc3QgdGV4RGF0YSA9IHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKTtcbiAgICB0ZXhEYXRhLnJlZkNvdW50Kys7XG4gIH1cblxuICAvKiogRGVjcmVhc2UgcmVmQ291bnQgb2YgYSBgVGV4dHVyZURhdGFgLiAqL1xuICBkZWNSZWYoZGF0YUlkOiBEYXRhSWQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50ZXhEYXRhLmhhcyhkYXRhSWQpKSB7XG4gICAgICBjb25zdCB0ZXhEYXRhID0gdGhpcy50ZXhEYXRhLmdldChkYXRhSWQpO1xuICAgICAgdGV4RGF0YS5yZWZDb3VudC0tO1xuICAgIH1cbiAgfVxuXG4gIG1vdmUoXG4gICAgICBkYXRhSWQ6IERhdGFJZCwgdmFsdWVzOiBCYWNrZW5kVmFsdWVzLCBzaGFwZTogbnVtYmVyW10sIGR0eXBlOiBEYXRhVHlwZSxcbiAgICAgIHJlZkNvdW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoZW52KCkuZ2V0Qm9vbCgnREVCVUcnKSkge1xuICAgICAgdGhpcy5jaGVja051bWVyaWNhbFByb2JsZW1zKHZhbHVlcyk7XG4gICAgfVxuICAgIGlmIChkdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IHdyaXRlIHRvIGEgY29tcGxleDY0IGR0eXBlLiBgICtcbiAgICAgICAgICBgUGxlYXNlIHVzZSB0Zi5jb21wbGV4KHJlYWwsIGltYWcpLmApO1xuICAgIH1cbiAgICB0aGlzLnRleERhdGEuc2V0KFxuICAgICAgICBkYXRhSWQsIHtzaGFwZSwgZHR5cGUsIHZhbHVlcywgdXNhZ2U6IFRleHR1cmVVc2FnZS5VUExPQUQsIHJlZkNvdW50fSk7XG4gIH1cblxuICBkaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0ZW5zb3JJbmZvOiBUZW5zb3JJbmZvKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwb3NlRGF0YSh0ZW5zb3JJbmZvLmRhdGFJZCk7XG4gIH1cblxuICByZWFkU3luYyhkYXRhSWQ6IERhdGFJZCk6IEJhY2tlbmRWYWx1ZXMge1xuICAgIGNvbnN0IHRleERhdGEgPSB0aGlzLnRleERhdGEuZ2V0KGRhdGFJZCk7XG4gICAgY29uc3Qge3ZhbHVlcywgZHR5cGUsIGNvbXBsZXhUZW5zb3JJbmZvcywgc2xpY2UsIHNoYXBlLCBpc1BhY2tlZH0gPSB0ZXhEYXRhO1xuXG4gICAgLy8gVGhlIHByZXNlbmNlIG9mIGBzbGljZWAgaW5kaWNhdGVzIHRoaXMgdGVuc29yIGlzIGEgc2hhbGxvdyBzbGljZSBvZiBhXG4gICAgLy8gZGlmZmVyZW50IHRlbnNvciwgYW5kIGlzIHVzaW5nIHRoYXQgb3JpZ2luYWwgdGVuc29yJ3MgdGV4dHVyZS4gUnVuXG4gICAgLy8gYGNsb25lYCBpbiBvcmRlciB0byBjb3B5IHRoYXQgdGV4dHVyZSBhbmQgcmVhZCBmcm9tIGl0LlxuICAgIGlmIChzbGljZSAhPSBudWxsKSB7XG4gICAgICBsZXQgcHJvZ3JhbTtcbiAgICAgIGlmIChpc1BhY2tlZCkge1xuICAgICAgICBwcm9ncmFtID0gbmV3IFVuYXJ5T3BQYWNrZWRQcm9ncmFtKHNoYXBlLCB1bmFyeV9vcC5DTE9ORSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9ncmFtID0gbmV3IFVuYXJ5T3BQcm9ncmFtKHNoYXBlLCB1bmFyeV9vcC5DTE9ORSk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXMgPVxuICAgICAgICAgIHRoaXMucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt7ZGF0YUlkLCBzaGFwZSwgZHR5cGV9XSwgZHR5cGUpO1xuICAgICAgY29uc3QgZGF0YSA9IHRoaXMucmVhZFN5bmMocmVzLmRhdGFJZCk7XG4gICAgICB0aGlzLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlcyk7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgaWYgKHZhbHVlcyAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0QW5kQ2FjaGVPbkNQVShkYXRhSWQpO1xuICAgIH1cbiAgICBpZiAoZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdmFsdWVzO1xuICAgIH1cbiAgICBjb25zdCBzaG91bGRUaW1lUHJvZ3JhbSA9IHRoaXMuYWN0aXZlVGltZXJzICE9IG51bGw7XG4gICAgbGV0IHN0YXJ0OiBudW1iZXI7XG4gICAgaWYgKHNob3VsZFRpbWVQcm9ncmFtKSB7XG4gICAgICBzdGFydCA9IHV0aWwubm93KCk7XG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdDogRmxvYXQzMkFycmF5O1xuICAgIGlmIChkdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgIGNvbnN0IHJlYWxWYWx1ZXMgPVxuICAgICAgICAgIHRoaXMucmVhZFN5bmMoY29tcGxleFRlbnNvckluZm9zLnJlYWwuZGF0YUlkKSBhcyBGbG9hdDMyQXJyYXk7XG4gICAgICBjb25zdCBpbWFnVmFsdWVzID1cbiAgICAgICAgICB0aGlzLnJlYWRTeW5jKGNvbXBsZXhUZW5zb3JJbmZvcy5pbWFnLmRhdGFJZCkgYXMgRmxvYXQzMkFycmF5O1xuICAgICAgcmVzdWx0ID0gYmFja2VuZF91dGlsLm1lcmdlUmVhbEFuZEltYWdBcnJheXMocmVhbFZhbHVlcywgaW1hZ1ZhbHVlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMuZ2V0VmFsdWVzRnJvbVRleHR1cmUoZGF0YUlkKTtcbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkVGltZVByb2dyYW0pIHtcbiAgICAgIHRoaXMuZG93bmxvYWRXYWl0TXMgKz0gdXRpbC5ub3coKSAtIHN0YXJ0O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb252ZXJ0QW5kQ2FjaGVPbkNQVShkYXRhSWQsIHJlc3VsdCk7XG4gIH1cblxuICBhc3luYyByZWFkKGRhdGFJZDogRGF0YUlkKTogUHJvbWlzZTxCYWNrZW5kVmFsdWVzPiB7XG4gICAgaWYgKHRoaXMucGVuZGluZ1JlYWQuaGFzKGRhdGFJZCkpIHtcbiAgICAgIGNvbnN0IHN1YnNjcmliZXJzID0gdGhpcy5wZW5kaW5nUmVhZC5nZXQoZGF0YUlkKTtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxUeXBlZEFycmF5PihyZXNvbHZlID0+IHN1YnNjcmliZXJzLnB1c2gocmVzb2x2ZSkpO1xuICAgIH1cbiAgICBjb25zdCB0ZXhEYXRhID0gdGhpcy50ZXhEYXRhLmdldChkYXRhSWQpO1xuICAgIGNvbnN0IHt2YWx1ZXMsIHNoYXBlLCBzbGljZSwgZHR5cGUsIGNvbXBsZXhUZW5zb3JJbmZvcywgaXNQYWNrZWR9ID0gdGV4RGF0YTtcblxuICAgIC8vIFRoZSBwcmVzZW5jZSBvZiBgc2xpY2VgIGluZGljYXRlcyB0aGlzIHRlbnNvciBpcyBhIHNoYWxsb3cgc2xpY2Ugb2YgYVxuICAgIC8vIGRpZmZlcmVudCB0ZW5zb3IsIGFuZCBpcyB1c2luZyB0aGF0IG9yaWdpbmFsIHRlbnNvcidzIHRleHR1cmUuIFJ1blxuICAgIC8vIGBjbG9uZWAgaW4gb3JkZXIgdG8gY29weSB0aGF0IHRleHR1cmUgYW5kIHJlYWQgZnJvbSBpdC5cbiAgICBpZiAoc2xpY2UgIT0gbnVsbCkge1xuICAgICAgbGV0IHByb2dyYW07XG4gICAgICBpZiAoaXNQYWNrZWQpIHtcbiAgICAgICAgcHJvZ3JhbSA9IG5ldyBVbmFyeU9wUGFja2VkUHJvZ3JhbShzaGFwZSwgdW5hcnlfb3AuQ0xPTkUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvZ3JhbSA9IG5ldyBVbmFyeU9wUHJvZ3JhbShzaGFwZSwgdW5hcnlfb3AuQ0xPTkUpO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzID1cbiAgICAgICAgICB0aGlzLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbe2RhdGFJZCwgc2hhcGUsIGR0eXBlfV0sIGR0eXBlKTtcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLnJlYWQocmVzLmRhdGFJZCk7XG4gICAgICB0aGlzLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlcyk7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWVzICE9IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRBbmRDYWNoZU9uQ1BVKGRhdGFJZCk7XG4gICAgfVxuXG4gICAgaWYgKCFlbnYoKS5nZXRCb29sKCdXRUJHTF9ET1dOTE9BRF9GTE9BVF9FTkFCTEVEJykgJiZcbiAgICAgICAgZW52KCkuZ2V0TnVtYmVyKCdXRUJHTF9WRVJTSU9OJykgPT09IDIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgdGVuc29yLmRhdGEoKSB3aXRoIFdFQkdMX0RPV05MT0FEX0ZMT0FUX0VOQUJMRUQ9ZmFsc2UgYW5kIGAgK1xuICAgICAgICAgIGBXRUJHTF9WRVJTSU9OPTIgbm90IHlldCBzdXBwb3J0ZWQuYCk7XG4gICAgfVxuXG4gICAgbGV0IGJ1ZmZlcjogV2ViR0xCdWZmZXIgPSBudWxsO1xuICAgIGxldCB0bXBEb3dubG9hZFRhcmdldDogVGVuc29ySW5mbztcblxuICAgIGlmIChkdHlwZSAhPT0gJ2NvbXBsZXg2NCcgJiYgZW52KCkuZ2V0KCdXRUJHTF9CVUZGRVJfU1VQUE9SVEVEJykpIHtcbiAgICAgIC8vIFBvc3NpYmx5IGNvcHkgdGhlIHRleHR1cmUgaW50byBhIGJ1ZmZlciBiZWZvcmUgaW5zZXJ0aW5nIGEgZmVuY2UuXG4gICAgICB0bXBEb3dubG9hZFRhcmdldCA9IHRoaXMuZGVjb2RlKGRhdGFJZCk7XG4gICAgICBjb25zdCB0bXBEYXRhID0gdGhpcy50ZXhEYXRhLmdldCh0bXBEb3dubG9hZFRhcmdldC5kYXRhSWQpO1xuXG4gICAgICBidWZmZXIgPSB0aGlzLmdwZ3B1LmNyZWF0ZUJ1ZmZlckZyb21UZXh0dXJlKFxuICAgICAgICAgIHRtcERhdGEudGV4dHVyZSwgLi4udGV4X3V0aWwuZ2V0RGVuc2VUZXhTaGFwZShzaGFwZSkpO1xuICAgIH1cblxuICAgIHRoaXMucGVuZGluZ1JlYWQuc2V0KGRhdGFJZCwgW10pO1xuXG4gICAgaWYgKGR0eXBlICE9PSAnY29tcGxleDY0Jykge1xuICAgICAgLy8gQ3JlYXRlIGEgZmVuY2UgYW5kIHdhaXQgZm9yIGl0IHRvIHJlc29sdmUuXG4gICAgICBhd2FpdCB0aGlzLmdwZ3B1LmNyZWF0ZUFuZFdhaXRGb3JGZW5jZSgpO1xuICAgIH1cblxuICAgIC8vIERvd25sb2FkIHRoZSB2YWx1ZXMgZnJvbSB0aGUgR1BVLlxuICAgIGxldCB2YWxzOiBGbG9hdDMyQXJyYXk7XG4gICAgaWYgKGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgY29uc3QgcHMgPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIHRoaXMucmVhZChjb21wbGV4VGVuc29ySW5mb3MucmVhbC5kYXRhSWQpLFxuICAgICAgICB0aGlzLnJlYWQoY29tcGxleFRlbnNvckluZm9zLmltYWcuZGF0YUlkKVxuICAgICAgXSk7XG5cbiAgICAgIGNvbnN0IHJlYWxWYWx1ZXMgPSBwc1swXTtcbiAgICAgIGNvbnN0IGltYWdWYWx1ZXMgPSBwc1sxXTtcbiAgICAgIHZhbHMgPSBiYWNrZW5kX3V0aWwubWVyZ2VSZWFsQW5kSW1hZ0FycmF5cyhcbiAgICAgICAgICByZWFsVmFsdWVzIGFzIEZsb2F0MzJBcnJheSwgaW1hZ1ZhbHVlcyBhcyBGbG9hdDMyQXJyYXkpO1xuICAgIH0gZWxzZSBpZiAoYnVmZmVyID09IG51bGwpIHtcbiAgICAgIHZhbHMgPSB0aGlzLmdldFZhbHVlc0Zyb21UZXh0dXJlKGRhdGFJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoc2hhcGUpO1xuICAgICAgdmFscyA9IHRoaXMuZ3BncHUuZG93bmxvYWRGbG9hdDMyTWF0cml4RnJvbUJ1ZmZlcihidWZmZXIsIHNpemUpO1xuICAgIH1cbiAgICBpZiAodG1wRG93bmxvYWRUYXJnZXQgIT0gbnVsbCkge1xuICAgICAgdGhpcy5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0bXBEb3dubG9hZFRhcmdldCk7XG4gICAgfVxuICAgIGlmIChidWZmZXIgIT0gbnVsbCkge1xuICAgICAgY29uc3QgZ2wgPSB0aGlzLmdwZ3B1LmdsO1xuICAgICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmRlbGV0ZUJ1ZmZlcihidWZmZXIpKTtcbiAgICB9XG4gICAgY29uc3QgZFR5cGVWYWxzID0gdGhpcy5jb252ZXJ0QW5kQ2FjaGVPbkNQVShkYXRhSWQsIHZhbHMpO1xuXG4gICAgY29uc3Qgc3Vic2NyaWJlcnMgPSB0aGlzLnBlbmRpbmdSZWFkLmdldChkYXRhSWQpO1xuICAgIHRoaXMucGVuZGluZ1JlYWQuZGVsZXRlKGRhdGFJZCk7XG5cbiAgICAvLyBOb3RpZnkgYWxsIHBlbmRpbmcgcmVhZHMuXG4gICAgc3Vic2NyaWJlcnMuZm9yRWFjaChyZXNvbHZlID0+IHJlc29sdmUoZFR5cGVWYWxzKSk7XG4gICAgaWYgKHRoaXMucGVuZGluZ0Rpc3Bvc2FsLmhhcyhkYXRhSWQpKSB7XG4gICAgICB0aGlzLnBlbmRpbmdEaXNwb3NhbC5kZWxldGUoZGF0YUlkKTtcbiAgICAgIGlmICh0aGlzLmRpc3Bvc2VEYXRhKGRhdGFJZCkpIHtcbiAgICAgICAgZW5naW5lKCkucmVtb3ZlRGF0YUlkKGRhdGFJZCwgdGhpcyk7XG4gICAgICB9XG4gICAgICB0aGlzLnBlbmRpbmdEZWxldGVzLS07XG4gICAgfVxuICAgIHJldHVybiBkVHlwZVZhbHM7XG4gIH1cblxuICBidWZmZXJTeW5jPFIgZXh0ZW5kcyBSYW5rPih0OiBUZW5zb3JJbmZvKTogVGVuc29yQnVmZmVyPFI+IHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5yZWFkU3luYyh0LmRhdGFJZCk7XG4gICAgbGV0IGRlY29kZWREYXRhID0gZGF0YSBhcyBEYXRhVmFsdWVzO1xuICAgIGlmICh0LmR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gRGVjb2RlIHRoZSBieXRlcyBpbnRvIHN0cmluZy5cbiAgICAgICAgZGVjb2RlZERhdGEgPSAoZGF0YSBhcyBVaW50OEFycmF5W10pLm1hcChkID0+IHV0aWwuZGVjb2RlU3RyaW5nKGQpKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBkZWNvZGUgZW5jb2RlZCBzdHJpbmcgYnl0ZXMgaW50byB1dGYtOCcpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYnVmZmVyKHQuc2hhcGUgYXMgU2hhcGVNYXBbUl0sIHQuZHR5cGUsIGRlY29kZWREYXRhKSBhc1xuICAgICAgICBUZW5zb3JCdWZmZXI8Uj47XG4gIH1cblxuICBwcml2YXRlIGNoZWNrTnVtZXJpY2FsUHJvYmxlbXModmFsdWVzOiBCYWNrZW5kVmFsdWVzKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBudW0gPSB2YWx1ZXNbaV0gYXMgbnVtYmVyO1xuICAgICAgaWYgKCF3ZWJnbF91dGlsLmNhbkJlUmVwcmVzZW50ZWQobnVtKSkge1xuICAgICAgICBpZiAoZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUkVOREVSX0ZMT0FUMzJfQ0FQQUJMRScpKSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgIGBUaGUgdmFsdWUgJHtudW19IGNhbm5vdCBiZSByZXByZXNlbnRlZCB3aXRoIHlvdXIgYCArXG4gICAgICAgICAgICAgIGBjdXJyZW50IHNldHRpbmdzLiBDb25zaWRlciBlbmFibGluZyBmbG9hdDMyIHJlbmRlcmluZzogYCArXG4gICAgICAgICAgICAgIGAndGYuZW52KCkuc2V0KCdXRUJHTF9SRU5ERVJfRkxPQVQzMl9FTkFCTEVEJywgdHJ1ZSk7J2ApO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IEVycm9yKGBUaGUgdmFsdWUgJHtudW19IGNhbm5vdCBiZSByZXByZXNlbnRlZCBvbiB0aGlzIGRldmljZS5gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFZhbHVlc0Zyb21UZXh0dXJlKGRhdGFJZDogRGF0YUlkKTogRmxvYXQzMkFycmF5IHtcbiAgICBjb25zdCB7c2hhcGUsIGR0eXBlLCBpc1BhY2tlZH0gPSB0aGlzLnRleERhdGEuZ2V0KGRhdGFJZCk7XG4gICAgY29uc3Qgc2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShzaGFwZSk7XG4gICAgaWYgKGVudigpLmdldEJvb2woJ1dFQkdMX0RPV05MT0FEX0ZMT0FUX0VOQUJMRUQnKSkge1xuICAgICAgY29uc3QgdG1wVGFyZ2V0ID0gdGhpcy5kZWNvZGUoZGF0YUlkKTtcbiAgICAgIGNvbnN0IHRtcERhdGEgPSB0aGlzLnRleERhdGEuZ2V0KHRtcFRhcmdldC5kYXRhSWQpO1xuICAgICAgY29uc3QgdmFscyA9IHRoaXMuZ3BncHVcbiAgICAgICAgICAgICAgICAgICAgICAgLmRvd25sb2FkTWF0cml4RnJvbVBhY2tlZFRleHR1cmUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBEYXRhLnRleHR1cmUsIC4uLnRleF91dGlsLmdldERlbnNlVGV4U2hhcGUoc2hhcGUpKVxuICAgICAgICAgICAgICAgICAgICAgICAuc3ViYXJyYXkoMCwgc2l6ZSk7XG5cbiAgICAgIHRoaXMuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odG1wVGFyZ2V0KTtcblxuICAgICAgcmV0dXJuIHZhbHM7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkVXNlUGFja2VkUHJvZ3JhbSA9XG4gICAgICAgIGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0snKSAmJiBpc1BhY2tlZCA9PT0gdHJ1ZTtcbiAgICBjb25zdCBvdXRwdXRTaGFwZSA9XG4gICAgICAgIHNob3VsZFVzZVBhY2tlZFByb2dyYW0gPyB3ZWJnbF91dGlsLmdldFNoYXBlQXMzRChzaGFwZSkgOiBzaGFwZTtcbiAgICBjb25zdCBwcm9ncmFtID0gc2hvdWxkVXNlUGFja2VkUHJvZ3JhbSA/XG4gICAgICAgIG5ldyBFbmNvZGVGbG9hdFBhY2tlZFByb2dyYW0ob3V0cHV0U2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXJdKSA6XG4gICAgICAgIG5ldyBFbmNvZGVGbG9hdFByb2dyYW0ob3V0cHV0U2hhcGUpO1xuICAgIGNvbnN0IG91dHB1dCA9IHRoaXMucnVuV2ViR0xQcm9ncmFtKFxuICAgICAgICBwcm9ncmFtLCBbe3NoYXBlOiBvdXRwdXRTaGFwZSwgZHR5cGUsIGRhdGFJZH1dLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IHRtcERhdGEgPSB0aGlzLnRleERhdGEuZ2V0KG91dHB1dC5kYXRhSWQpO1xuICAgIGNvbnN0IHZhbHMgPVxuICAgICAgICB0aGlzLmdwZ3B1XG4gICAgICAgICAgICAuZG93bmxvYWRCeXRlRW5jb2RlZEZsb2F0TWF0cml4RnJvbU91dHB1dFRleHR1cmUoXG4gICAgICAgICAgICAgICAgdG1wRGF0YS50ZXh0dXJlLCB0bXBEYXRhLnRleFNoYXBlWzBdLCB0bXBEYXRhLnRleFNoYXBlWzFdKVxuICAgICAgICAgICAgLnN1YmFycmF5KDAsIHNpemUpO1xuICAgIHRoaXMuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ob3V0cHV0KTtcblxuICAgIHJldHVybiB2YWxzO1xuICB9XG5cbiAgdGltZXJBdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGVudigpLmdldE51bWJlcignV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1JFTElBQkxFJykgPiAwO1xuICB9XG5cbiAgYXN5bmMgdGltZShmOiAoKSA9PiB2b2lkKTogUHJvbWlzZTxXZWJHTFRpbWluZ0luZm8+IHtcbiAgICBjb25zdCBvbGRBY3RpdmVUaW1lcnMgPSB0aGlzLmFjdGl2ZVRpbWVycztcbiAgICBjb25zdCBuZXdBY3RpdmVUaW1lcnM6IFRpbWVyTm9kZVtdID0gW107XG5cbiAgICBsZXQgb3V0ZXJNb3N0VGltZSA9IGZhbHNlO1xuICAgIGlmICh0aGlzLnByb2dyYW1UaW1lcnNTdGFjayA9PSBudWxsKSB7XG4gICAgICB0aGlzLnByb2dyYW1UaW1lcnNTdGFjayA9IG5ld0FjdGl2ZVRpbWVycztcbiAgICAgIG91dGVyTW9zdFRpbWUgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFjdGl2ZVRpbWVycy5wdXNoKG5ld0FjdGl2ZVRpbWVycyk7XG4gICAgfVxuICAgIHRoaXMuYWN0aXZlVGltZXJzID0gbmV3QWN0aXZlVGltZXJzO1xuXG4gICAgZigpO1xuXG4gICAgLy8gbmVlZGluZyB0byBzcGxpdCB0aGVzZSB1cCBiZWNhdXNlIHV0aWwuZmxhdHRlbiBvbmx5IGFjY2VwdHMgY2VydGFpbiB0eXBlc1xuICAgIGNvbnN0IGZsYXR0ZW5lZEFjdGl2ZVRpbWVyUXVlcmllcyA9XG4gICAgICAgIHV0aWwuZmxhdHRlbih0aGlzLmFjdGl2ZVRpbWVycy5tYXAoKGQ6IEtlcm5lbEluZm8pID0+IGQucXVlcnkpKVxuICAgICAgICAgICAgLmZpbHRlcihkID0+IGQgIT0gbnVsbCk7XG4gICAgY29uc3QgZmxhdHRlbmVkQWN0aXZlVGltZXJOYW1lcyA9XG4gICAgICAgIHV0aWwuZmxhdHRlbih0aGlzLmFjdGl2ZVRpbWVycy5tYXAoKGQ6IEtlcm5lbEluZm8pID0+IGQubmFtZSkpXG4gICAgICAgICAgICAuZmlsdGVyKGQgPT4gZCAhPSBudWxsKTtcblxuICAgIHRoaXMuYWN0aXZlVGltZXJzID0gb2xkQWN0aXZlVGltZXJzO1xuXG4gICAgaWYgKG91dGVyTW9zdFRpbWUpIHtcbiAgICAgIHRoaXMucHJvZ3JhbVRpbWVyc1N0YWNrID0gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCByZXM6IFdlYkdMVGltaW5nSW5mbyA9IHtcbiAgICAgIHVwbG9hZFdhaXRNczogdGhpcy51cGxvYWRXYWl0TXMsXG4gICAgICBkb3dubG9hZFdhaXRNczogdGhpcy5kb3dubG9hZFdhaXRNcyxcbiAgICAgIGtlcm5lbE1zOiBudWxsLFxuICAgICAgd2FsbE1zOiBudWxsICAvLyB3aWxsIGJlIGZpbGxlZCBieSB0aGUgZW5naW5lXG4gICAgfTtcblxuICAgIGlmIChlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX0RJU0pPSU5UX1FVRVJZX1RJTUVSX0VYVEVOU0lPTl9SRUxJQUJMRScpID4gMCkge1xuICAgICAgY29uc3Qga2VybmVsTXMgPSBhd2FpdCBQcm9taXNlLmFsbChmbGF0dGVuZWRBY3RpdmVUaW1lclF1ZXJpZXMpO1xuXG4gICAgICByZXNbJ2tlcm5lbE1zJ10gPSB1dGlsLnN1bShrZXJuZWxNcyk7XG4gICAgICByZXNbJ2dldEV4dHJhUHJvZmlsZUluZm8nXSA9ICgpID0+XG4gICAgICAgICAga2VybmVsTXMubWFwKChkLCBpKSA9PiAoe25hbWU6IGZsYXR0ZW5lZEFjdGl2ZVRpbWVyTmFtZXNbaV0sIG1zOiBkfSkpXG4gICAgICAgICAgICAgIC5tYXAoZCA9PiBgJHtkLm5hbWV9OiAke2QubXN9YClcbiAgICAgICAgICAgICAgLmpvaW4oJywgJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc1sna2VybmVsTXMnXSA9IHtcbiAgICAgICAgZXJyb3I6ICdXZWJHTCBxdWVyeSB0aW1lcnMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBlbnZpcm9ubWVudC4nXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMudXBsb2FkV2FpdE1zID0gMDtcbiAgICB0aGlzLmRvd25sb2FkV2FpdE1zID0gMDtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIG1lbW9yeSgpOiBXZWJHTE1lbW9yeUluZm8ge1xuICAgIHJldHVybiB7XG4gICAgICB1bnJlbGlhYmxlOiBmYWxzZSxcbiAgICAgIG51bUJ5dGVzSW5HUFU6IHRoaXMubnVtQnl0ZXNJbkdQVSxcbiAgICAgIG51bUJ5dGVzSW5HUFVBbGxvY2F0ZWQ6IHRoaXMudGV4dHVyZU1hbmFnZXIubnVtQnl0ZXNBbGxvY2F0ZWQsXG4gICAgICBudW1CeXRlc0luR1BVRnJlZTogdGhpcy50ZXh0dXJlTWFuYWdlci5udW1CeXRlc0ZyZWVcbiAgICB9IGFzIFdlYkdMTWVtb3J5SW5mbztcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRUaW1lcigpOiBXZWJHTFF1ZXJ5fENQVVRpbWVyUXVlcnkge1xuICAgIGlmIChlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX0RJU0pPSU5UX1FVRVJZX1RJTUVSX0VYVEVOU0lPTl9SRUxJQUJMRScpID4gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ3BncHUuYmVnaW5RdWVyeSgpO1xuICAgIH1cbiAgICByZXR1cm4ge3N0YXJ0TXM6IHV0aWwubm93KCksIGVuZE1zOiBudWxsfTtcbiAgfVxuXG4gIHByaXZhdGUgZW5kVGltZXIocXVlcnk6IFdlYkdMUXVlcnl8Q1BVVGltZXJRdWVyeSk6IFdlYkdMUXVlcnl8Q1BVVGltZXJRdWVyeSB7XG4gICAgaWYgKGVudigpLmdldE51bWJlcignV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1JFTElBQkxFJykgPiAwKSB7XG4gICAgICB0aGlzLmdwZ3B1LmVuZFF1ZXJ5KCk7XG4gICAgICByZXR1cm4gcXVlcnk7XG4gICAgfVxuICAgIChxdWVyeSBhcyBDUFVUaW1lclF1ZXJ5KS5lbmRNcyA9IHV0aWwubm93KCk7XG4gICAgcmV0dXJuIHF1ZXJ5O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRRdWVyeVRpbWUocXVlcnk6IFdlYkdMUXVlcnl8Q1BVVGltZXJRdWVyeSk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgaWYgKGVudigpLmdldE51bWJlcignV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1JFTElBQkxFJykgPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5ncGdwdS53YWl0Rm9yUXVlcnlBbmRHZXRUaW1lKHF1ZXJ5IGFzIFdlYkdMUXVlcnkpO1xuICAgIH1cbiAgICBjb25zdCB0aW1lclF1ZXJ5ID0gcXVlcnkgYXMgQ1BVVGltZXJRdWVyeTtcbiAgICByZXR1cm4gdGltZXJRdWVyeS5lbmRNcyAtIHRpbWVyUXVlcnkuc3RhcnRNcztcbiAgfVxuXG4gIHByaXZhdGUgcGVuZGluZ0RlbGV0ZXMgPSAwO1xuXG4gIC8qKlxuICAgKiBEZWNyZWFzZSB0aGUgUmVmQ291bnQgb24gdGhlIGRhdGFJZCBhbmQgZGlzcG9zZSB0aGUgbWVtb3J5IGlmIHRoZSBkYXRhSWRcbiAgICogaGFzIDAgcmVmQ291bnQuIElmIHRoZXJlIGFyZSBwZW5kaW5nIHJlYWQgb24gdGhlIGRhdGEsIHRoZSBkaXNwb3NhbCB3b3VsZFxuICAgKiBhZGRlZCB0byB0aGUgcGVuZGluZyBkZWxldGUgcXVldWUuIFJldHVybiB0cnVlIGlmIHRoZSBkYXRhSWQgaXMgcmVtb3ZlZFxuICAgKiBmcm9tIGJhY2tlbmQgb3IgdGhlIGJhY2tlbmQgZG9lcyBub3QgY29udGFpbiB0aGUgZGF0YUlkLCBmYWxzZSBpZiB0aGVcbiAgICogZGF0YUlkIGlzIG5vdCByZW1vdmVkLiBNZW1vcnkgbWF5IG9yIG1heSBub3QgYmUgcmVsZWFzZWQgZXZlbiB3aGVuIGRhdGFJZFxuICAgKiBpcyByZW1vdmVkLCB3aGljaCBhbHNvIGRlcGVuZHMgb24gZGF0YVJlZkNvdW50LCBzZWUgYHJlbGVhc2VHUFVgLlxuICAgKiBAcGFyYW0gZGF0YUlkXG4gICAqIEBvYXJhbSBmb3JjZSBPcHRpb25hbCwgcmVtb3ZlIHRoZSBkYXRhIHJlZ2FyZGxlc3Mgb2YgcmVmQ291bnRcbiAgICovXG4gIGRpc3Bvc2VEYXRhKGRhdGFJZDogRGF0YUlkLCBmb3JjZSA9IGZhbHNlKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMucGVuZGluZ0Rpc3Bvc2FsLmhhcyhkYXRhSWQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gTm8tb3AgaWYgYWxyZWFkeSBkaXNwb3NlZC5cbiAgICBpZiAoIXRoaXMudGV4RGF0YS5oYXMoZGF0YUlkKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gaWYgZm9yY2UgZmxhZyBpcyBzZXQsIGNoYW5nZSByZWZDb3VudCB0byAwLCB0aGlzIHdvdWxkIGVuc3VyZSBkaXNwb3NhbFxuICAgIC8vIHdoZW4gYWRkZWQgdG8gdGhlIHBlbmRpbmdEaXNwb3NhbCBxdWV1ZS4gTWVtb3J5IG1heSBvciBtYXkgbm90IGJlXG4gICAgLy8gcmVsZWFzZWQsIHdoaWNoIGFsc28gZGVwZW5kcyBvbiBkYXRhUmVmQ291bnQsIHNlZSBgcmVsZWFzZUdQVWAuXG4gICAgaWYgKGZvcmNlKSB7XG4gICAgICB0aGlzLnRleERhdGEuZ2V0KGRhdGFJZCkucmVmQ291bnQgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRleERhdGEuZ2V0KGRhdGFJZCkucmVmQ291bnQtLTtcbiAgICB9XG5cbiAgICBpZiAoIWZvcmNlICYmIHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKS5yZWZDb3VudCA+IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wZW5kaW5nUmVhZC5oYXMoZGF0YUlkKSkge1xuICAgICAgdGhpcy5wZW5kaW5nRGlzcG9zYWwuYWRkKGRhdGFJZCk7XG4gICAgICB0aGlzLnBlbmRpbmdEZWxldGVzKys7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5yZWxlYXNlR1BVRGF0YShkYXRhSWQpO1xuICAgIGNvbnN0IHtjb21wbGV4VGVuc29ySW5mb3N9ID0gdGhpcy50ZXhEYXRhLmdldChkYXRhSWQpO1xuICAgIGlmIChjb21wbGV4VGVuc29ySW5mb3MgIT0gbnVsbCkge1xuICAgICAgdGhpcy5kaXNwb3NlRGF0YShjb21wbGV4VGVuc29ySW5mb3MucmVhbC5kYXRhSWQsIGZvcmNlKTtcbiAgICAgIHRoaXMuZGlzcG9zZURhdGEoY29tcGxleFRlbnNvckluZm9zLmltYWcuZGF0YUlkLCBmb3JjZSk7XG4gICAgfVxuXG4gICAgdGhpcy50ZXhEYXRhLmRlbGV0ZShkYXRhSWQpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIHJlbGVhc2VHUFVEYXRhKGRhdGFJZDogRGF0YUlkKTogdm9pZCB7XG4gICAgY29uc3Qge3RleHR1cmUsIGR0eXBlLCB0ZXhTaGFwZSwgdXNhZ2UsIGlzUGFja2VkLCBzbGljZX0gPVxuICAgICAgICB0aGlzLnRleERhdGEuZ2V0KGRhdGFJZCk7XG4gICAgY29uc3Qga2V5ID0gc2xpY2UgJiYgc2xpY2Uub3JpZ0RhdGFJZCB8fCBkYXRhSWQ7XG4gICAgY29uc3QgcmVmQ291bnQgPSB0aGlzLmRhdGFSZWZDb3VudC5nZXQoa2V5KTtcblxuICAgIGlmIChyZWZDb3VudCA+IDEpIHtcbiAgICAgIHRoaXMuZGF0YVJlZkNvdW50LnNldChrZXksIHJlZkNvdW50IC0gMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGF0YVJlZkNvdW50LmRlbGV0ZShrZXkpO1xuICAgICAgaWYgKHRleHR1cmUgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLm51bUJ5dGVzSW5HUFUgLT0gdGhpcy5jb21wdXRlQnl0ZXModGV4U2hhcGUsIGR0eXBlKTtcbiAgICAgICAgdGhpcy50ZXh0dXJlTWFuYWdlci5yZWxlYXNlVGV4dHVyZSh0ZXh0dXJlLCB0ZXhTaGFwZSwgdXNhZ2UsIGlzUGFja2VkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB0ZXhEYXRhID0gdGhpcy50ZXhEYXRhLmdldChkYXRhSWQpO1xuICAgIHRleERhdGEudGV4dHVyZSA9IG51bGw7XG4gICAgdGV4RGF0YS50ZXhTaGFwZSA9IG51bGw7XG4gICAgdGV4RGF0YS5pc1BhY2tlZCA9IGZhbHNlO1xuICAgIHRleERhdGEuc2xpY2UgPSBudWxsO1xuICB9XG5cbiAgZ2V0VGV4dHVyZShkYXRhSWQ6IERhdGFJZCk6IFdlYkdMVGV4dHVyZSB7XG4gICAgdGhpcy51cGxvYWRUb0dQVShkYXRhSWQpO1xuICAgIHJldHVybiB0aGlzLnRleERhdGEuZ2V0KGRhdGFJZCkudGV4dHVyZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGludGVybmFsIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWMgZGF0YSBidWNrZXQuIFVzZWQgaW4gdW5pdFxuICAgKiB0ZXN0cy5cbiAgICovXG4gIGdldERhdGFJbmZvKGRhdGFJZDogRGF0YUlkKTogVGV4dHVyZURhdGEge1xuICAgIHJldHVybiB0aGlzLnRleERhdGEuZ2V0KGRhdGFJZCk7XG4gIH1cblxuICAvKlxuICBUZXN0cyB3aGV0aGVyIGFsbCB0aGUgaW5wdXRzIHRvIGFuIG9wIGFyZSBzbWFsbCBhbmQgb24gdGhlIENQVS4gVGhpcyBoZXVyaXN0aWNcbiAgZGV0ZXJtaW5lcyB3aGVuIGl0IHdvdWxkIGJlIGZhc3RlciB0byBleGVjdXRlIGEga2VybmVsIG9uIHRoZSBDUFUuIFdlYkdMXG4gIGtlcm5lbHMgb3B0IGludG8gcnVubmluZyB0aGlzIGNoZWNrIGFuZCBmb3J3YXJkaW5nIHdoZW4gYXBwcm9wcmlhdGUuXG4gIFRPRE8oaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGZqcy9pc3N1ZXMvODcyKTogRGV2ZWxvcCBhIG1vcmVcbiAgc3VzdGFpbmFibGUgc3RyYXRlZ3kgZm9yIG9wdGltaXppbmcgYmFja2VuZCBleGVjdXRpb24gb2Ygb3BzLlxuICAgKi9cbiAgc2hvdWxkRXhlY3V0ZU9uQ1BVKFxuICAgICAgaW5wdXRzOiBUZW5zb3JJbmZvW10sXG4gICAgICBzaXplVGhyZXNob2xkID0gQ1BVX0hBTkRPRkZfU0laRV9USFJFU0hPTEQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZW52KCkuZ2V0Qm9vbCgnV0VCR0xfQ1BVX0ZPUldBUkQnKSAmJlxuICAgICAgICBpbnB1dHMuZXZlcnkoXG4gICAgICAgICAgICBpbnB1dCA9PiB0aGlzLnRleERhdGEuZ2V0KGlucHV0LmRhdGFJZCkudGV4dHVyZSA9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgdXRpbC5zaXplRnJvbVNoYXBlKGlucHV0LnNoYXBlKSA8IHNpemVUaHJlc2hvbGQpO1xuICB9XG5cbiAgZ2V0R1BHUFVDb250ZXh0KCk6IEdQR1BVQ29udGV4dCB7XG4gICAgcmV0dXJuIHRoaXMuZ3BncHU7XG4gIH1cblxuICB3aGVyZShjb25kaXRpb246IFRlbnNvcik6IFRlbnNvcjJEIHtcbiAgICBiYWNrZW5kX3V0aWwud2FybihcbiAgICAgICAgJ3RmLndoZXJlKCkgaW4gd2ViZ2wgbG9ja3MgdGhlIFVJIHRocmVhZC4gJyArXG4gICAgICAgICdDYWxsIHRmLndoZXJlQXN5bmMoKSBpbnN0ZWFkJyk7XG4gICAgY29uc3QgY29uZFZhbHMgPSBjb25kaXRpb24uZGF0YVN5bmMoKTtcbiAgICByZXR1cm4gd2hlcmVJbXBsKGNvbmRpdGlvbi5zaGFwZSwgY29uZFZhbHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBwYWNrZWRVbmFyeU9wKHg6IFRlbnNvckluZm8sIG9wOiBzdHJpbmcsIGR0eXBlOiBEYXRhVHlwZSkge1xuICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgVW5hcnlPcFBhY2tlZFByb2dyYW0oeC5zaGFwZSwgb3ApO1xuICAgIGNvbnN0IG91dEluZm8gPSB0aGlzLmNvbXBpbGVBbmRSdW4ocHJvZ3JhbSwgW3hdLCBkdHlwZSk7XG4gICAgcmV0dXJuIGVuZ2luZSgpLm1ha2VUZW5zb3JGcm9tRGF0YUlkKFxuICAgICAgICBvdXRJbmZvLmRhdGFJZCwgb3V0SW5mby5zaGFwZSwgb3V0SW5mby5kdHlwZSk7XG4gIH1cblxuICAvLyBUT0RPKG1zb3VsYW5pbGxlKSByZW1vdmUgdGhpcyBvbmNlIHRoZSBiYWNrZW5kIGhhcyBiZWVuIG1vZHVsYXJpemVkXG4gIC8vIGEgY29weSBpcyBuZWVkZWQgaGVyZSB0byBicmVhayBhIGNpcmN1bGFyIGRlcGVuZGVuY3kuXG4gIC8vIEFsc28gcmVtb3ZlIHRoZSBvcCBmcm9tIHVuYXJ5X29wLlxuICBhYnM8VCBleHRlbmRzIFRlbnNvcj4oeDogVCk6IFQge1xuICAgIC8vIFRPRE86IGhhbmRsZSBjYXNlcyB3aGVuIHggaXMgY29tcGxleC5cbiAgICBpZiAodGhpcy5zaG91bGRFeGVjdXRlT25DUFUoW3hdKSAmJiB4LmR0eXBlICE9PSAnY29tcGxleDY0Jykge1xuICAgICAgY29uc3Qgb3V0VmFsdWVzID1cbiAgICAgICAgICBzaW1wbGVBYnNJbXBsQ1BVKHRoaXMudGV4RGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5KTtcbiAgICAgIHJldHVybiB0aGlzLm1ha2VPdXRwdXQoeC5zaGFwZSwgeC5kdHlwZSwgb3V0VmFsdWVzKTtcbiAgICB9XG5cbiAgICBpZiAoZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19VTkFSWV9PUEVSQVRJT05TJykpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhY2tlZFVuYXJ5T3AoeCwgdW5hcnlfb3AuQUJTLCB4LmR0eXBlKSBhcyBUO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgVW5hcnlPcFByb2dyYW0oeC5zaGFwZSwgdW5hcnlfb3AuQUJTKTtcbiAgICBjb25zdCBvdXRJbmZvID0gdGhpcy5jb21waWxlQW5kUnVuKHByb2dyYW0sIFt4XSk7XG4gICAgcmV0dXJuIGVuZ2luZSgpLm1ha2VUZW5zb3JGcm9tRGF0YUlkKFxuICAgICAgICAgICAgICAgb3V0SW5mby5kYXRhSWQsIG91dEluZm8uc2hhcGUsIG91dEluZm8uZHR5cGUpIGFzIFQ7XG4gIH1cblxuICBtYWtlVGVuc29ySW5mbyhcbiAgICAgIHNoYXBlOiBudW1iZXJbXSwgZHR5cGU6IERhdGFUeXBlLFxuICAgICAgdmFsdWVzPzogQmFja2VuZFZhbHVlc3xzdHJpbmdbXSk6IFRlbnNvckluZm8ge1xuICAgIGxldCBkYXRhSWQ7XG4gICAgaWYgKGR0eXBlID09PSAnc3RyaW5nJyAmJiB2YWx1ZXMgIT0gbnVsbCAmJiB2YWx1ZXMubGVuZ3RoID4gMCAmJlxuICAgICAgICB1dGlsLmlzU3RyaW5nKHZhbHVlc1swXSkpIHtcbiAgICAgIGNvbnN0IGVuY29kZWRWYWx1ZXMgPVxuICAgICAgICAgICh2YWx1ZXMgYXMge30gYXMgc3RyaW5nW10pLm1hcChkID0+IHV0aWwuZW5jb2RlU3RyaW5nKGQpKTtcblxuICAgICAgZGF0YUlkID0gdGhpcy53cml0ZShlbmNvZGVkVmFsdWVzLCBzaGFwZSwgZHR5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhSWQgPSB0aGlzLndyaXRlKHZhbHVlcyBhcyBUeXBlZEFycmF5LCBzaGFwZSwgZHR5cGUpO1xuICAgIH1cblxuICAgIHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKS51c2FnZSA9IG51bGw7XG4gICAgcmV0dXJuIHtkYXRhSWQsIHNoYXBlLCBkdHlwZX07XG4gIH1cblxuICBwcml2YXRlIG1ha2VPdXRwdXQ8VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgICBzaGFwZTogbnVtYmVyW10sIGR0eXBlOiBEYXRhVHlwZSwgdmFsdWVzPzogQmFja2VuZFZhbHVlcyk6IFQge1xuICAgIGNvbnN0IHtkYXRhSWR9ID0gdGhpcy5tYWtlVGVuc29ySW5mbyhzaGFwZSwgZHR5cGUsIHZhbHVlcyk7XG4gICAgcmV0dXJuIGVuZ2luZSgpLm1ha2VUZW5zb3JGcm9tRGF0YUlkKGRhdGFJZCwgc2hhcGUsIGR0eXBlLCB0aGlzKSBhcyBUO1xuICB9XG5cbiAgdW5wYWNrVGVuc29yKGlucHV0OiBUZW5zb3JJbmZvKTogVGVuc29ySW5mbyB7XG4gICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBVbnBhY2tQcm9ncmFtKGlucHV0LnNoYXBlKTtcbiAgICByZXR1cm4gdGhpcy5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW2lucHV0XSwgaW5wdXQuZHR5cGUpO1xuICB9XG5cbiAgcGFja1RlbnNvcihpbnB1dDogVGVuc29ySW5mbyk6IFRlbnNvckluZm8ge1xuICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgUGFja1Byb2dyYW0oaW5wdXQuc2hhcGUpO1xuICAgIGNvbnN0IHByZXZlbnRFYWdlclVucGFja2luZ091dHB1dCA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXMucnVuV2ViR0xQcm9ncmFtKFxuICAgICAgICBwcm9ncmFtLCBbaW5wdXRdLCBpbnB1dC5kdHlwZSwgbnVsbCAvKiBjdXN0b21Vbmlmb3JtVmFsdWVzICovLFxuICAgICAgICBwcmV2ZW50RWFnZXJVbnBhY2tpbmdPdXRwdXQpO1xuICB9XG5cbiAgcHJpdmF0ZSBwYWNrZWRSZXNoYXBlKGlucHV0OiBUZW5zb3JJbmZvLCBhZnRlclNoYXBlOiBudW1iZXJbXSk6IFRlbnNvckluZm8ge1xuICAgIGNvbnN0IGlucHV0M0RTaGFwZSA9IFtcbiAgICAgIHdlYmdsX3V0aWwuZ2V0QmF0Y2hEaW0oaW5wdXQuc2hhcGUpLFxuICAgICAgLi4ud2ViZ2xfdXRpbC5nZXRSb3dzQ29scyhpbnB1dC5zaGFwZSlcbiAgICBdIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgICBjb25zdCBpbnB1dDNEOiBUZW5zb3JJbmZvID0ge1xuICAgICAgZHR5cGU6IGlucHV0LmR0eXBlLFxuICAgICAgc2hhcGU6IGlucHV0M0RTaGFwZSxcbiAgICAgIGRhdGFJZDogaW5wdXQuZGF0YUlkXG4gICAgfTtcbiAgICBjb25zdCBhZnRlclNoYXBlQXMzRCA9IFtcbiAgICAgIHdlYmdsX3V0aWwuZ2V0QmF0Y2hEaW0oYWZ0ZXJTaGFwZSksIC4uLndlYmdsX3V0aWwuZ2V0Um93c0NvbHMoYWZ0ZXJTaGFwZSlcbiAgICBdIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcblxuICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgUmVzaGFwZVBhY2tlZFByb2dyYW0oYWZ0ZXJTaGFwZUFzM0QsIGlucHV0M0RTaGFwZSk7XG4gICAgY29uc3QgcHJldmVudEVhZ2VyVW5wYWNraW5nT2ZPdXRwdXQgPSB0cnVlO1xuICAgIGNvbnN0IGN1c3RvbVZhbHVlcyA9IFtpbnB1dDNEU2hhcGVdO1xuICAgIGNvbnN0IG91dHB1dCA9IHRoaXMucnVuV2ViR0xQcm9ncmFtKFxuICAgICAgICBwcm9ncmFtLCBbaW5wdXQzRF0sIGlucHV0LmR0eXBlLCBjdXN0b21WYWx1ZXMsXG4gICAgICAgIHByZXZlbnRFYWdlclVucGFja2luZ09mT3V0cHV0KTtcbiAgICByZXR1cm4ge2RhdGFJZDogb3V0cHV0LmRhdGFJZCwgc2hhcGU6IGFmdGVyU2hhcGUsIGR0eXBlOiBvdXRwdXQuZHR5cGV9O1xuICB9XG5cbiAgcHJpdmF0ZSBkZWNvZGUoZGF0YUlkOiBEYXRhSWQpOiBUZW5zb3JJbmZvIHtcbiAgICBjb25zdCB0ZXhEYXRhID0gdGhpcy50ZXhEYXRhLmdldChkYXRhSWQpO1xuICAgIGNvbnN0IHtpc1BhY2tlZCwgc2hhcGUsIGR0eXBlfSA9IHRleERhdGE7XG4gICAgY29uc3Qgc2hhcGVBczNEID1cbiAgICAgICAgd2ViZ2xfdXRpbC5nZXRTaGFwZUFzM0Qoc2hhcGUpIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgICBsZXQgcHJvZ3JhbTtcbiAgICBjb25zdCBkZW5zZVRleFNoYXBlID0gdGV4X3V0aWwuZ2V0RGVuc2VUZXhTaGFwZShzaGFwZUFzM0QpO1xuICAgIGlmIChpc1BhY2tlZCkge1xuICAgICAgcHJvZ3JhbSA9IG5ldyBEZWNvZGVNYXRyaXhQYWNrZWRQcm9ncmFtKHNoYXBlQXMzRCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2dyYW0gPSBuZXcgRGVjb2RlTWF0cml4UHJvZ3JhbShzaGFwZUFzM0QpO1xuICAgIH1cbiAgICBjb25zdCBwcmV2ZW50RWFnZXJVbnBhY2tpbmdPZk91dHB1dCA9IHRydWU7XG4gICAgY29uc3QgY3VzdG9tVmFsdWVzID0gW2RlbnNlVGV4U2hhcGVdO1xuICAgIGNvbnN0IG91dCA9IHRoaXMucnVuV2ViR0xQcm9ncmFtKFxuICAgICAgICBwcm9ncmFtLCBbe3NoYXBlOiBzaGFwZUFzM0QsIGR0eXBlLCBkYXRhSWR9XSwgZHR5cGUsIGN1c3RvbVZhbHVlcyxcbiAgICAgICAgcHJldmVudEVhZ2VyVW5wYWNraW5nT2ZPdXRwdXQpO1xuICAgIHJldHVybiB7ZHR5cGUsIHNoYXBlLCBkYXRhSWQ6IG91dC5kYXRhSWR9O1xuICB9XG5cbiAgcnVuV2ViR0xQcm9ncmFtKFxuICAgICAgcHJvZ3JhbTogR1BHUFVQcm9ncmFtLCBpbnB1dHM6IFRlbnNvckluZm9bXSwgb3V0cHV0RHR5cGU6IERhdGFUeXBlLFxuICAgICAgY3VzdG9tVW5pZm9ybVZhbHVlcz86IG51bWJlcltdW10sXG4gICAgICBwcmV2ZW50RWFnZXJVbnBhY2tpbmdPZk91dHB1dCA9IGZhbHNlKTogVGVuc29ySW5mbyB7XG4gICAgY29uc3Qgb3V0cHV0ID0gdGhpcy5tYWtlVGVuc29ySW5mbyhwcm9ncmFtLm91dHB1dFNoYXBlLCBvdXRwdXREdHlwZSk7XG4gICAgY29uc3Qgb3V0RGF0YSA9IHRoaXMudGV4RGF0YS5nZXQob3V0cHV0LmRhdGFJZCk7XG4gICAgaWYgKHByb2dyYW0ucGFja2VkT3V0cHV0KSB7XG4gICAgICBvdXREYXRhLmlzUGFja2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHByb2dyYW0ub3V0UGFja2luZ1NjaGVtZSA9PT0gdGV4X3V0aWwuUGFja2luZ1NjaGVtZS5ERU5TRSkge1xuICAgICAgY29uc3QgdGV4ZWxTaGFwZSA9IHRleF91dGlsLmdldERlbnNlVGV4U2hhcGUocHJvZ3JhbS5vdXRwdXRTaGFwZSk7XG4gICAgICAvLyBGb3IgYSBkZW5zZWx5IHBhY2tlZCBvdXRwdXQsIHdlIGV4cGxpY2l0bHkgc2V0IHRleFNoYXBlXG4gICAgICAvLyBzbyBpdCBkb2Vzbid0IGdldCBhc3NpZ25lZCBsYXRlciBhY2NvcmRpbmcgdG8gb3VyIHR5cGljYWwgcGFja2luZ1xuICAgICAgLy8gc2NoZW1lIHdoZXJlaW4gYSBzaW5nbGUgdGV4ZWwgY2FuIG9ubHkgY29udGFpbiB2YWx1ZXMgZnJvbSBhZGphY2VudFxuICAgICAgLy8gcm93cy9jb2xzLlxuICAgICAgb3V0RGF0YS50ZXhTaGFwZSA9IHRleGVsU2hhcGUubWFwKGQgPT4gZCAqIDIpIGFzIFtudW1iZXIsIG51bWJlcl07XG4gICAgfVxuICAgIGlmIChwcm9ncmFtLm91dFRleFVzYWdlICE9IG51bGwpIHtcbiAgICAgIG91dERhdGEudXNhZ2UgPSBwcm9ncmFtLm91dFRleFVzYWdlO1xuICAgIH1cbiAgICBpZiAodXRpbC5zaXplRnJvbVNoYXBlKG91dHB1dC5zaGFwZSkgPT09IDApIHtcbiAgICAgIC8vIFNob3J0LWNpcmN1aXQgdGhlIGNvbXB1dGF0aW9uIHNpbmNlIHRoZSByZXN1bHQgaXMgZW1wdHkgKGhhcyAwIGluIGl0c1xuICAgICAgLy8gc2hhcGUpLlxuICAgICAgb3V0RGF0YS52YWx1ZXMgPVxuICAgICAgICAgIHV0aWwuZ2V0VHlwZWRBcnJheUZyb21EVHlwZShvdXRwdXQuZHR5cGUgYXMgJ2Zsb2F0MzInLCAwKTtcbiAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YVRvRGlzcG9zZTogVGVuc29ySW5mb1tdID0gW107XG4gICAgY29uc3QgaW5wdXRzRGF0YTogVGVuc29yRGF0YVtdID0gaW5wdXRzLm1hcChpbnB1dCA9PiB7XG4gICAgICBpZiAoaW5wdXQuZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBHUEdQVVByb2dyYW0gZG9lcyBub3Qgc3VwcG9ydCBjb21wbGV4NjQgaW5wdXQuIEZvciBjb21wbGV4NjQgYCArXG4gICAgICAgICAgICBgZHR5cGVzLCBwbGVhc2Ugc2VwYXJhdGUgdGhlIHByb2dyYW0gaW50byByZWFsIGFuZCBpbWFnaW5hcnkgYCArXG4gICAgICAgICAgICBgcGFydHMuYCk7XG4gICAgICB9XG5cbiAgICAgIGxldCB0ZXhEYXRhID0gdGhpcy50ZXhEYXRhLmdldChpbnB1dC5kYXRhSWQpO1xuXG4gICAgICBpZiAodGV4RGF0YS50ZXh0dXJlID09IG51bGwpIHtcbiAgICAgICAgaWYgKCFwcm9ncmFtLnBhY2tlZElucHV0cyAmJlxuICAgICAgICAgICAgdXRpbC5zaXplRnJvbVNoYXBlKGlucHV0LnNoYXBlKSA8PVxuICAgICAgICAgICAgICAgIGVudigpLmdldE51bWJlcignV0VCR0xfU0laRV9VUExPQURfVU5JRk9STScpKSB7XG4gICAgICAgICAgLy8gVXBsb2FkIHNtYWxsIHRlbnNvcnMgdGhhdCBsaXZlIG9uIHRoZSBDUFUgYXMgdW5pZm9ybXMsIG5vdCBhc1xuICAgICAgICAgIC8vIHRleHR1cmVzLiBEbyB0aGlzIG9ubHkgd2hlbiB0aGUgZW52aXJvbm1lbnQgc3VwcG9ydHMgMzJiaXQgZmxvYXRzXG4gICAgICAgICAgLy8gZHVlIHRvIHByb2JsZW1zIHdoZW4gY29tcGFyaW5nIDE2Yml0IGZsb2F0cyB3aXRoIDMyYml0IGZsb2F0cy5cbiAgICAgICAgICAvLyBUT0RPKGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RmanMvaXNzdWVzLzgyMSk6IE1ha2UgaXRcbiAgICAgICAgICAvLyBwb3NzaWJsZSBmb3IgcGFja2VkIHNoYWRlcnMgdG8gc2FtcGxlIGZyb20gdW5pZm9ybXMuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNoYXBlOiBpbnB1dC5zaGFwZSxcbiAgICAgICAgICAgIHRleERhdGE6IG51bGwsXG4gICAgICAgICAgICBpc1VuaWZvcm06IHRydWUsXG4gICAgICAgICAgICB1bmlmb3JtVmFsdWVzOiB0ZXhEYXRhLnZhbHVlcyBhcyBUeXBlZEFycmF5XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoaXMgZW5zdXJlcyB0aGF0IGlmIGEgcGFja2VkIHByb2dyYW0ncyBpbnB1dHMgaGF2ZSBub3QgeWV0IGJlZW5cbiAgICAgICAgLy8gdXBsb2FkZWQgdG8gdGhlIEdQVSwgdGhleSBnZXQgdXBsb2FkZWQgYXMgcGFja2VkIHJpZ2h0IG9mZiB0aGUgYmF0LlxuICAgICAgICBpZiAocHJvZ3JhbS5wYWNrZWRJbnB1dHMpIHtcbiAgICAgICAgICB0ZXhEYXRhLmlzUGFja2VkID0gdHJ1ZTtcbiAgICAgICAgICB0ZXhEYXRhLnNoYXBlID0gaW5wdXQuc2hhcGU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoISF0ZXhEYXRhLmlzUGFja2VkICE9PSAhIXByb2dyYW0ucGFja2VkSW5wdXRzKSB7XG4gICAgICAgIGlucHV0ID0gdGV4RGF0YS5pc1BhY2tlZCA/IHRoaXMudW5wYWNrVGVuc29yKGlucHV0KSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFja1RlbnNvcihpbnB1dCk7XG4gICAgICAgIGRhdGFUb0Rpc3Bvc2UucHVzaChpbnB1dCk7XG4gICAgICAgIHRleERhdGEgPSB0aGlzLnRleERhdGEuZ2V0KGlucHV0LmRhdGFJZCk7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIHRleERhdGEuaXNQYWNrZWQgJiZcbiAgICAgICAgICAhd2ViZ2xfdXRpbC5pc1Jlc2hhcGVGcmVlKHRleERhdGEuc2hhcGUsIGlucHV0LnNoYXBlKSkge1xuICAgICAgICAvLyBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIHdoZXJlIGEgdGV4dHVyZSBleGlzdHMgZm9yIGEgdGVuc29yXG4gICAgICAgIC8vIGJ1dCB0aGUgc2hhcGVzIGFyZSBpbmNvbXBhdGlibGUgKGR1ZSB0byBwYWNraW5nIGNvbnN0cmFpbnRzKSBiZWNhdXNlXG4gICAgICAgIC8vIHRoZSB0ZW5zb3IgZGlkIG5vdCBoYXZlIGEgY2hhbmNlIHRvIGdvIHRocm91Z2ggdGhlIHBhY2tlZCByZXNoYXBlXG4gICAgICAgIC8vIHNoYWRlci4gVGhpcyBvbmx5IGhhcHBlbnMgd2hlbiB3ZSByZXNoYXBlIHRoZSAqc2FtZSogdGVuc29yIHRvIGZvcm1cbiAgICAgICAgLy8gKmRpc3RpbmN0KiBpbnB1dHMgdG8gYW4gb3AsIGUuZy4gZG90dGluZyBhIHZlY3RvciB3aXRoIGl0c2VsZi4gVGhpc1xuICAgICAgICAvLyBjYXNlIHdpbGwgZGlzYXBwZWFyIG9uY2UgcGFja2VkIHVwbG9hZGluZyBpcyB0aGUgZGVmYXVsdC5cblxuICAgICAgICBjb25zdCBzYXZlZElucHV0ID0gaW5wdXQ7XG4gICAgICAgIGNvbnN0IHRhcmdldFNoYXBlID0gaW5wdXQuc2hhcGU7XG5cbiAgICAgICAgaW5wdXQuc2hhcGUgPSB0ZXhEYXRhLnNoYXBlO1xuICAgICAgICBpbnB1dCA9IHRoaXMucGFja2VkUmVzaGFwZShpbnB1dCBhcyBUZW5zb3IsIHRhcmdldFNoYXBlKTtcbiAgICAgICAgZGF0YVRvRGlzcG9zZS5wdXNoKGlucHV0KTtcbiAgICAgICAgdGV4RGF0YSA9IHRoaXMudGV4RGF0YS5nZXQoaW5wdXQuZGF0YUlkKTtcblxuICAgICAgICBzYXZlZElucHV0LnNoYXBlID0gdGFyZ2V0U2hhcGU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudXBsb2FkVG9HUFUoaW5wdXQuZGF0YUlkKTtcbiAgICAgIHJldHVybiB7c2hhcGU6IGlucHV0LnNoYXBlLCB0ZXhEYXRhLCBpc1VuaWZvcm06IGZhbHNlfTtcbiAgICB9KTtcblxuICAgIHRoaXMudXBsb2FkVG9HUFUob3V0cHV0LmRhdGFJZCk7XG4gICAgY29uc3Qgb3V0cHV0RGF0YTpcbiAgICAgICAgVGVuc29yRGF0YSA9IHtzaGFwZTogb3V0cHV0LnNoYXBlLCB0ZXhEYXRhOiBvdXREYXRhLCBpc1VuaWZvcm06IGZhbHNlfTtcbiAgICBjb25zdCBrZXkgPSBncGdwdV9tYXRoLm1ha2VTaGFkZXJLZXkocHJvZ3JhbSwgaW5wdXRzRGF0YSwgb3V0cHV0RGF0YSk7XG4gICAgY29uc3QgYmluYXJ5ID0gdGhpcy5nZXRBbmRTYXZlQmluYXJ5KGtleSwgKCkgPT4ge1xuICAgICAgcmV0dXJuIGdwZ3B1X21hdGguY29tcGlsZVByb2dyYW0oXG4gICAgICAgICAgdGhpcy5ncGdwdSwgcHJvZ3JhbSwgaW5wdXRzRGF0YSwgb3V0cHV0RGF0YSk7XG4gICAgfSk7XG4gICAgY29uc3Qgc2hvdWxkVGltZVByb2dyYW0gPSB0aGlzLmFjdGl2ZVRpbWVycyAhPSBudWxsO1xuICAgIGxldCBxdWVyeTogV2ViR0xRdWVyeXxDUFVUaW1lclF1ZXJ5O1xuICAgIGlmIChzaG91bGRUaW1lUHJvZ3JhbSkge1xuICAgICAgcXVlcnkgPSB0aGlzLnN0YXJ0VGltZXIoKTtcbiAgICB9XG5cbiAgICBncGdwdV9tYXRoLnJ1blByb2dyYW0oXG4gICAgICAgIHRoaXMuZ3BncHUsIGJpbmFyeSwgaW5wdXRzRGF0YSwgb3V0cHV0RGF0YSwgY3VzdG9tVW5pZm9ybVZhbHVlcyk7XG5cbiAgICBkYXRhVG9EaXNwb3NlLmZvckVhY2goaW5mbyA9PiB0aGlzLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGluZm8pKTtcblxuICAgIGlmIChzaG91bGRUaW1lUHJvZ3JhbSkge1xuICAgICAgcXVlcnkgPSB0aGlzLmVuZFRpbWVyKHF1ZXJ5KTtcbiAgICAgIHRoaXMuYWN0aXZlVGltZXJzLnB1c2goXG4gICAgICAgICAge25hbWU6IHByb2dyYW0uY29uc3RydWN0b3IubmFtZSwgcXVlcnk6IHRoaXMuZ2V0UXVlcnlUaW1lKHF1ZXJ5KX0pO1xuICAgIH1cblxuICAgIGNvbnN0IGdsRmx1c2hUaHJlc2hvbGQgPSBlbnYoKS5nZXQoJ1dFQkdMX0ZMVVNIX1RIUkVTSE9MRCcpO1xuICAgIC8vIE1hbnVhbGx5IEdMIGZsdXNoIHJlcXVlc3RlZFxuICAgIGlmIChnbEZsdXNoVGhyZXNob2xkID4gMCkge1xuICAgICAgY29uc3QgdGltZSA9IHV0aWwubm93KCk7XG4gICAgICBpZiAoKHRpbWUgLSB0aGlzLmxhc3RHbEZsdXNoVGltZSkgPiBnbEZsdXNoVGhyZXNob2xkKSB7XG4gICAgICAgIHRoaXMuZ3BncHUuZ2wuZmx1c2goKTtcbiAgICAgICAgdGhpcy5sYXN0R2xGbHVzaFRpbWUgPSB0aW1lO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghZW52KCkuZ2V0Qm9vbCgnV0VCR0xfTEFaSUxZX1VOUEFDSycpICYmIG91dERhdGEuaXNQYWNrZWQgJiZcbiAgICAgICAgcHJldmVudEVhZ2VyVW5wYWNraW5nT2ZPdXRwdXQgPT09IGZhbHNlKSB7XG4gICAgICBjb25zdCB1bnBhY2tlZCA9IHRoaXMudW5wYWNrVGVuc29yKG91dHB1dCk7XG4gICAgICB0aGlzLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG91dHB1dCk7XG4gICAgICByZXR1cm4gdW5wYWNrZWQ7XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cblxuICBjb21waWxlQW5kUnVuKFxuICAgICAgcHJvZ3JhbTogR1BHUFVQcm9ncmFtLCBpbnB1dHM6IFRlbnNvckluZm9bXSwgb3V0cHV0RHR5cGU/OiBEYXRhVHlwZSxcbiAgICAgIGN1c3RvbVVuaWZvcm1WYWx1ZXM/OiBudW1iZXJbXVtdLFxuICAgICAgcHJldmVudEVhZ2VyVW5wYWNraW5nT2ZPdXRwdXQgPSBmYWxzZSk6IFRlbnNvckluZm8ge1xuICAgIG91dHB1dER0eXBlID0gb3V0cHV0RHR5cGUgfHwgaW5wdXRzWzBdLmR0eXBlO1xuICAgIGNvbnN0IG91dEluZm8gPSB0aGlzLnJ1bldlYkdMUHJvZ3JhbShcbiAgICAgICAgcHJvZ3JhbSwgaW5wdXRzLCBvdXRwdXREdHlwZSwgY3VzdG9tVW5pZm9ybVZhbHVlcyxcbiAgICAgICAgcHJldmVudEVhZ2VyVW5wYWNraW5nT2ZPdXRwdXQpO1xuICAgIHJldHVybiBvdXRJbmZvO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBbmRTYXZlQmluYXJ5KGtleTogc3RyaW5nLCBnZXRCaW5hcnk6ICgpID0+IEdQR1BVQmluYXJ5KTpcbiAgICAgIEdQR1BVQmluYXJ5IHtcbiAgICBpZiAoIShrZXkgaW4gdGhpcy5iaW5hcnlDYWNoZSkpIHtcbiAgICAgIHRoaXMuYmluYXJ5Q2FjaGVba2V5XSA9IGdldEJpbmFyeSgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5iaW5hcnlDYWNoZVtrZXldO1xuICB9XG5cbiAgZ2V0VGV4dHVyZU1hbmFnZXIoKTogVGV4dHVyZU1hbmFnZXIge1xuICAgIHJldHVybiB0aGlzLnRleHR1cmVNYW5hZ2VyO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNwb3NlZCA9IGZhbHNlO1xuXG4gIGRpc3Bvc2UoKSB7XG4gICAgaWYgKHRoaXMuZGlzcG9zZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gQXZvaWQgZGlzcG9zaW5nIHRoZSBjb21waWxlZCB3ZWJnbCBwcm9ncmFtcyBkdXJpbmcgdW5pdCB0ZXN0aW5nIGJlY2F1c2VcbiAgICAvLyBpdCBzbG93cyBkb3duIHRlc3QgZXhlY3V0aW9uLlxuICAgIGlmICghZW52KCkuZ2V0Qm9vbCgnSVNfVEVTVCcpKSB7XG4gICAgICBjb25zdCBhbGxLZXlzID0gT2JqZWN0LmtleXModGhpcy5iaW5hcnlDYWNoZSk7XG4gICAgICBhbGxLZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgdGhpcy5ncGdwdS5kZWxldGVQcm9ncmFtKHRoaXMuYmluYXJ5Q2FjaGVba2V5XS53ZWJHTFByb2dyYW0pO1xuICAgICAgICBkZWxldGUgdGhpcy5iaW5hcnlDYWNoZVtrZXldO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMudGV4dHVyZU1hbmFnZXIuZGlzcG9zZSgpO1xuICAgIGlmICh0aGlzLmNhbnZhcyAhPSBudWxsICYmXG4gICAgICAgICh0eXBlb2YgKEhUTUxDYW52YXNFbGVtZW50KSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgIHRoaXMuY2FudmFzIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQpKSB7XG4gICAgICB0aGlzLmNhbnZhcy5yZW1vdmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYW52YXMgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy5ncGdwdUNyZWF0ZWRMb2NhbGx5KSB7XG4gICAgICB0aGlzLmdwZ3B1LnByb2dyYW0gPSBudWxsO1xuICAgICAgdGhpcy5ncGdwdS5kaXNwb3NlKCk7XG4gICAgfVxuICAgIHRoaXMuZGlzcG9zZWQgPSB0cnVlO1xuICB9XG5cbiAgZmxvYXRQcmVjaXNpb24oKTogMTZ8MzIge1xuICAgIGlmICh0aGlzLmZsb2F0UHJlY2lzaW9uVmFsdWUgPT0gbnVsbCkge1xuICAgICAgdGhpcy5mbG9hdFByZWNpc2lvblZhbHVlID0gdGlkeSgoKSA9PiB7XG4gICAgICAgIGlmICghZW52KCkuZ2V0KCdXRUJHTF9SRU5ERVJfRkxPQVQzMl9FTkFCTEVEJykpIHtcbiAgICAgICAgICAvLyBNb21lbnRhcmlseSBzd2l0Y2hpbmcgREVCVUcgZmxhZyB0byBmYWxzZSBzbyB3ZSBkb24ndCB0aHJvdyBhblxuICAgICAgICAgIC8vIGVycm9yIHRyeWluZyB0byB1cGxvYWQgYSBzbWFsbCB2YWx1ZS5cbiAgICAgICAgICBjb25zdCBkZWJ1Z0ZsYWcgPSBlbnYoKS5nZXRCb29sKCdERUJVRycpO1xuICAgICAgICAgIGVudigpLnNldCgnREVCVUcnLCBmYWxzZSk7XG4gICAgICAgICAgY29uc3QgdW5kZXJmbG93Q2hlY2tWYWx1ZSA9IHRoaXMuYWJzKHNjYWxhcigxZS04KSkuZGF0YVN5bmMoKVswXTtcbiAgICAgICAgICBlbnYoKS5zZXQoJ0RFQlVHJywgZGVidWdGbGFnKTtcblxuICAgICAgICAgIGlmICh1bmRlcmZsb3dDaGVja1ZhbHVlID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIDMyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMTY7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmxvYXRQcmVjaXNpb25WYWx1ZTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBzbWFsbGVzdCByZXByZXNlbnRhYmxlIG51bWJlci4gICovXG4gIGVwc2lsb24oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5mbG9hdFByZWNpc2lvbigpID09PSAzMiA/IEVQU0lMT05fRkxPQVQzMiA6IEVQU0lMT05fRkxPQVQxNjtcbiAgfVxuXG4gIHVwbG9hZFRvR1BVKGRhdGFJZDogRGF0YUlkKTogdm9pZCB7XG4gICAgY29uc3QgdGV4RGF0YSA9IHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKTtcbiAgICBjb25zdCB7c2hhcGUsIGR0eXBlLCB2YWx1ZXMsIHRleHR1cmUsIHVzYWdlLCBpc1BhY2tlZH0gPSB0ZXhEYXRhO1xuXG4gICAgaWYgKHRleHR1cmUgIT0gbnVsbCkge1xuICAgICAgLy8gQXJyYXkgaXMgYWxyZWFkeSBvbiBHUFUuIE5vLW9wLlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzaG91bGRUaW1lUHJvZ3JhbSA9IHRoaXMuYWN0aXZlVGltZXJzICE9IG51bGw7XG4gICAgbGV0IHN0YXJ0OiBudW1iZXI7XG4gICAgaWYgKHNob3VsZFRpbWVQcm9ncmFtKSB7XG4gICAgICBzdGFydCA9IHV0aWwubm93KCk7XG4gICAgfVxuXG4gICAgbGV0IHRleFNoYXBlID0gdGV4RGF0YS50ZXhTaGFwZTtcbiAgICBpZiAodGV4U2hhcGUgPT0gbnVsbCkge1xuICAgICAgdGV4U2hhcGUgPSB3ZWJnbF91dGlsLmdldFRleHR1cmVTaGFwZUZyb21Mb2dpY2FsU2hhcGUoc2hhcGUsIGlzUGFja2VkKTtcbiAgICAgIHRleERhdGEudGV4U2hhcGUgPSB0ZXhTaGFwZTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWVzICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHNoYXBlQXMzRCA9IHdlYmdsX3V0aWwuZ2V0U2hhcGVBczNEKHNoYXBlKTtcblxuICAgICAgbGV0IHByb2dyYW07XG4gICAgICBsZXQgd2lkdGggPSB0ZXhTaGFwZVsxXSwgaGVpZ2h0ID0gdGV4U2hhcGVbMF07XG4gICAgICBjb25zdCBpc0J5dGVBcnJheSA9IHZhbHVlcyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXk7XG5cbiAgICAgIGlmIChpc1BhY2tlZCkge1xuICAgICAgICBbd2lkdGgsIGhlaWdodF0gPSB0ZXhfdXRpbC5nZXRQYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodChcbiAgICAgICAgICAgIHRleFNoYXBlWzBdLCB0ZXhTaGFwZVsxXSk7XG4gICAgICAgIHByb2dyYW0gPSBuZXcgRW5jb2RlTWF0cml4UGFja2VkUHJvZ3JhbShzaGFwZUFzM0QsIGlzQnl0ZUFycmF5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByb2dyYW0gPSBuZXcgRW5jb2RlTWF0cml4UHJvZ3JhbShzaGFwZUFzM0QsIGlzQnl0ZUFycmF5KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGVtcERlbnNlSW5wdXRIYW5kbGUgPSB0aGlzLm1ha2VUZW5zb3JJbmZvKFtoZWlnaHQsIHdpZHRoXSwgZHR5cGUpO1xuICAgICAgaWYgKGlzQnl0ZUFycmF5KSB7XG4gICAgICAgIHRoaXMudGV4RGF0YS5nZXQodGVtcERlbnNlSW5wdXRIYW5kbGUuZGF0YUlkKS51c2FnZSA9XG4gICAgICAgICAgICBUZXh0dXJlVXNhZ2UuUElYRUxTO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50ZXhEYXRhLmdldCh0ZW1wRGVuc2VJbnB1dEhhbmRsZS5kYXRhSWQpLnVzYWdlID1cbiAgICAgICAgICAgIFRleHR1cmVVc2FnZS5VUExPQUQ7XG4gICAgICB9XG4gICAgICB0aGlzLmdwZ3B1LnVwbG9hZERlbnNlTWF0cml4VG9UZXh0dXJlKFxuICAgICAgICAgIHRoaXMuZ2V0VGV4dHVyZSh0ZW1wRGVuc2VJbnB1dEhhbmRsZS5kYXRhSWQpLCB3aWR0aCwgaGVpZ2h0LFxuICAgICAgICAgIHZhbHVlcyBhcyBUeXBlZEFycmF5KTtcblxuICAgICAgY29uc3QgY3VzdG9tVmFsdWVzID0gW1toZWlnaHQsIHdpZHRoXV07XG4gICAgICAvLyBXZSB3YW50IHRoZSBvdXRwdXQgdG8gcmVtYWluIHBhY2tlZCByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZSBvZlxuICAgICAgLy8gV0VCR0xfUEFDSy5cbiAgICAgIGNvbnN0IHByZXZlbnRFYWdlclVucGFja2luZyA9IHRydWU7XG4gICAgICBjb25zdCBlbmNvZGVkT3V0cHV0VGFyZ2V0ID0gdGhpcy5ydW5XZWJHTFByb2dyYW0oXG4gICAgICAgICAgcHJvZ3JhbSwgW3RlbXBEZW5zZUlucHV0SGFuZGxlXSwgZHR5cGUsIGN1c3RvbVZhbHVlcyxcbiAgICAgICAgICBwcmV2ZW50RWFnZXJVbnBhY2tpbmcpO1xuXG4gICAgICAvLyBIYXZlIHRoZSBvcmlnaW5hbCB0ZXh0dXJlIGFzc3VtZSB0aGUgaWRlbnRpdHkgb2YgdGhlIGVuY29kZWQgb3V0cHV0LlxuICAgICAgY29uc3Qgb3V0cHV0VGV4RGF0YSA9IHRoaXMudGV4RGF0YS5nZXQoZW5jb2RlZE91dHB1dFRhcmdldC5kYXRhSWQpO1xuICAgICAgdGV4RGF0YS50ZXh0dXJlID0gb3V0cHV0VGV4RGF0YS50ZXh0dXJlO1xuICAgICAgdGV4RGF0YS50ZXhTaGFwZSA9IG91dHB1dFRleERhdGEudGV4U2hhcGU7XG4gICAgICB0ZXhEYXRhLmlzUGFja2VkID0gb3V0cHV0VGV4RGF0YS5pc1BhY2tlZDtcbiAgICAgIHRleERhdGEudXNhZ2UgPSBvdXRwdXRUZXhEYXRhLnVzYWdlO1xuXG4gICAgICB0aGlzLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHRlbXBEZW5zZUlucHV0SGFuZGxlKTtcbiAgICAgIHRoaXMudGV4RGF0YS5kZWxldGUoZW5jb2RlZE91dHB1dFRhcmdldC5kYXRhSWQpO1xuXG4gICAgICAvLyBPbmNlIHVwbG9hZGVkLCBkb24ndCBzdG9yZSB0aGUgdmFsdWVzIG9uIGNwdS5cbiAgICAgIHRleERhdGEudmFsdWVzID0gbnVsbDtcbiAgICAgIGlmIChzaG91bGRUaW1lUHJvZ3JhbSkge1xuICAgICAgICB0aGlzLnVwbG9hZFdhaXRNcyArPSB1dGlsLm5vdygpIC0gc3RhcnQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG5ld1RleHR1cmUgPSB0aGlzLmFjcXVpcmVUZXh0dXJlKHRleFNoYXBlLCB1c2FnZSwgZHR5cGUsIGlzUGFja2VkKTtcbiAgICAgIHRleERhdGEudGV4dHVyZSA9IG5ld1RleHR1cmU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0QW5kQ2FjaGVPbkNQVShkYXRhSWQ6IERhdGFJZCwgZmxvYXQzMlZhbHVlcz86IEZsb2F0MzJBcnJheSk6XG4gICAgICBUeXBlZEFycmF5IHtcbiAgICBjb25zdCB0ZXhEYXRhID0gdGhpcy50ZXhEYXRhLmdldChkYXRhSWQpO1xuICAgIGNvbnN0IHtkdHlwZX0gPSB0ZXhEYXRhO1xuXG4gICAgdGhpcy5yZWxlYXNlR1BVRGF0YShkYXRhSWQpO1xuXG4gICAgaWYgKGZsb2F0MzJWYWx1ZXMgIT0gbnVsbCkge1xuICAgICAgdGV4RGF0YS52YWx1ZXMgPSBmbG9hdDMyVG9UeXBlZEFycmF5KGZsb2F0MzJWYWx1ZXMsIGR0eXBlIGFzICdmbG9hdDMyJyk7XG4gICAgfVxuICAgIHJldHVybiB0ZXhEYXRhLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICB9XG5cbiAgcHJpdmF0ZSBhY3F1aXJlVGV4dHVyZShcbiAgICAgIHRleFNoYXBlOiBbbnVtYmVyLCBudW1iZXJdLCB0ZXhUeXBlOiBUZXh0dXJlVXNhZ2UsIGR0eXBlOiBEYXRhVHlwZSxcbiAgICAgIGlzUGFja2VkOiBib29sZWFuKTogV2ViR0xUZXh0dXJlIHtcbiAgICB0aGlzLm51bUJ5dGVzSW5HUFUgKz0gdGhpcy5jb21wdXRlQnl0ZXModGV4U2hhcGUsIGR0eXBlKTtcbiAgICBpZiAoIXRoaXMud2FybmVkQWJvdXRNZW1vcnkgJiZcbiAgICAgICAgdGhpcy5udW1CeXRlc0luR1BVID4gdGhpcy5udW1NQkJlZm9yZVdhcm5pbmcgKiAxMDI0ICogMTAyNCkge1xuICAgICAgY29uc3QgbWIgPSAodGhpcy5udW1CeXRlc0luR1BVIC8gMTAyNCAvIDEwMjQpLnRvRml4ZWQoMik7XG4gICAgICB0aGlzLndhcm5lZEFib3V0TWVtb3J5ID0gdHJ1ZTtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgSGlnaCBtZW1vcnkgdXNhZ2UgaW4gR1BVOiAke21ifSBNQiwgYCArXG4gICAgICAgICAgYG1vc3QgbGlrZWx5IGR1ZSB0byBhIG1lbW9yeSBsZWFrYCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRleHR1cmVNYW5hZ2VyLmFjcXVpcmVUZXh0dXJlKHRleFNoYXBlLCB0ZXhUeXBlLCBpc1BhY2tlZCk7XG4gIH1cblxuICBwcml2YXRlIGNvbXB1dGVCeXRlcyhzaGFwZTogW251bWJlciwgbnVtYmVyXSwgZHR5cGU6IERhdGFUeXBlKSB7XG4gICAgcmV0dXJuIHNoYXBlWzBdICogc2hhcGVbMV0gKiB1dGlsLmJ5dGVzUGVyRWxlbWVudChkdHlwZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmxvYXQzMlRvVHlwZWRBcnJheTxEIGV4dGVuZHMgTnVtZXJpY0RhdGFUeXBlPihcbiAgICBhOiBGbG9hdDMyQXJyYXksIGR0eXBlOiBEKTogdGYuRGF0YVR5cGVNYXBbRF0ge1xuICBpZiAoZHR5cGUgPT09ICdmbG9hdDMyJyB8fCBkdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICByZXR1cm4gYSBhcyB0Zi5EYXRhVHlwZU1hcFtEXTtcbiAgfSBlbHNlIGlmIChkdHlwZSA9PT0gJ2ludDMyJyB8fCBkdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gKGR0eXBlID09PSAnaW50MzInKSA/IG5ldyBJbnQzMkFycmF5KGEubGVuZ3RoKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBVaW50OEFycmF5KGEubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7ICsraSkge1xuICAgICAgcmVzdWx0W2ldID0gTWF0aC5yb3VuZChhW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdCBhcyB0Zi5EYXRhVHlwZU1hcFtEXTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZHR5cGUgJHtkdHlwZX1gKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBiYXNlLnRzIGlzIHRoZSB3ZWJnbCBiYWNrZW5kIHdpdGhvdXQgYXV0byBrZXJuZWwgcmVnaXN0cmF0aW9uLlxuXG5pbXBvcnQge2RldmljZV91dGlsLCByZWdpc3RlckJhY2tlbmR9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4vYmFja2VuZF93ZWJnbCc7XG5leHBvcnQge3ZlcnNpb24gYXMgdmVyc2lvbl93ZWJnbH0gZnJvbSAnLi92ZXJzaW9uJztcblxuaWYgKGRldmljZV91dGlsLmlzQnJvd3NlcigpKSB7XG4gIHJlZ2lzdGVyQmFja2VuZCgnd2ViZ2wnLCAoKSA9PiBuZXcgTWF0aEJhY2tlbmRXZWJHTCgpLCAyIC8qIHByaW9yaXR5ICovKTtcbn1cblxuLy8gRXhwb3J0IHdlYmdsIHV0aWxpdGllc1xuZXhwb3J0ICogZnJvbSAnLi93ZWJnbCc7XG5cbi8vIEV4cG9ydCBmb3JjZUhhbGZGbG9zdCB1bmRlciB3ZWJnbCBuYW1lc3BhY2UgZm9yIHRoZSB1bmlvbiBidW5kbGUuXG5pbXBvcnQge2ZvcmNlSGFsZkZsb2F0fSBmcm9tICcuL3dlYmdsJztcbmV4cG9ydCBjb25zdCB3ZWJnbCA9IHtmb3JjZUhhbGZGbG9hdH07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBCYXRjaE5vcm1Qcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lczogc3RyaW5nW107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXSA9IFtdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgeFNoYXBlOiBudW1iZXJbXSwgbWVhblNoYXBlOiBudW1iZXJbXSwgdmFyaWFuY2VTaGFwZTogbnVtYmVyW10sXG4gICAgICBvZmZzZXRTaGFwZTogbnVtYmVyW118bnVsbCwgc2NhbGVTaGFwZTogbnVtYmVyW118bnVsbCxcbiAgICAgIHZhcmlhbmNlRXBzaWxvbjogbnVtYmVyKSB7XG4gICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWyd4JywgJ21lYW4nLCAndmFyaWFuY2UnXTtcbiAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoeFNoYXBlLCBtZWFuU2hhcGUpO1xuICAgIGJhY2tlbmRfdXRpbC5hc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSh4U2hhcGUsIHZhcmlhbmNlU2hhcGUpO1xuXG4gICAgbGV0IG9mZnNldFNuaXBwZXQgPSAnMC4wJztcbiAgICBpZiAob2Zmc2V0U2hhcGUgIT0gbnVsbCkge1xuICAgICAgYmFja2VuZF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKHhTaGFwZSwgb2Zmc2V0U2hhcGUpO1xuICAgICAgdGhpcy52YXJpYWJsZU5hbWVzLnB1c2goJ29mZnNldCcpO1xuICAgICAgb2Zmc2V0U25pcHBldCA9ICdnZXRPZmZzZXRBdE91dENvb3JkcygpJztcbiAgICB9XG5cbiAgICBsZXQgc2NhbGVTbmlwcGV0ID0gJzEuMCc7XG4gICAgaWYgKHNjYWxlU2hhcGUgIT0gbnVsbCkge1xuICAgICAgYmFja2VuZF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKHhTaGFwZSwgc2NhbGVTaGFwZSk7XG4gICAgICB0aGlzLnZhcmlhYmxlTmFtZXMucHVzaCgnc2NhbGUnKTtcbiAgICAgIHNjYWxlU25pcHBldCA9ICdnZXRTY2FsZUF0T3V0Q29vcmRzKCknO1xuICAgIH1cblxuICAgIHRoaXMub3V0cHV0U2hhcGUgPSB4U2hhcGU7XG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgZmxvYXQgeCA9IGdldFhBdE91dENvb3JkcygpO1xuICAgICAgICBmbG9hdCBtZWFuID0gZ2V0TWVhbkF0T3V0Q29vcmRzKCk7XG4gICAgICAgIGZsb2F0IHZhcmlhbmNlID0gZ2V0VmFyaWFuY2VBdE91dENvb3JkcygpO1xuICAgICAgICBmbG9hdCBvZmZzZXQgPSAke29mZnNldFNuaXBwZXR9O1xuICAgICAgICBmbG9hdCBzY2FsZSA9ICR7c2NhbGVTbmlwcGV0fTtcbiAgICAgICAgZmxvYXQgaW52ID0gc2NhbGUgKiBpbnZlcnNlc3FydCh2YXJpYW5jZSArIGZsb2F0KCR7dmFyaWFuY2VFcHNpbG9ufSkpO1xuICAgICAgICBzZXRPdXRwdXQoZG90KHZlYzMoeCwgLW1lYW4sIG9mZnNldCksIHZlYzMoaW52LCBpbnYsIDEpKSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgQmF0Y2hOb3JtUGFja2VkUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXM6IHN0cmluZ1tdO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIHBhY2tlZElucHV0cyA9IHRydWU7XG4gIHBhY2tlZE91dHB1dCA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICB4U2hhcGU6IG51bWJlcltdLCBtZWFuU2hhcGU6IG51bWJlcltdLCB2YXJpYW5jZVNoYXBlOiBudW1iZXJbXSxcbiAgICAgIG9mZnNldFNoYXBlOiBudW1iZXJbXXxudWxsLCBzY2FsZVNoYXBlOiBudW1iZXJbXXxudWxsLFxuICAgICAgdmFyaWFuY2VFcHNpbG9uOiBudW1iZXIpIHtcbiAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ3gnLCAnbWVhbicsICd2YXJpYW5jZSddO1xuICAgIGJhY2tlbmRfdXRpbC5hc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSh4U2hhcGUsIG1lYW5TaGFwZSk7XG4gICAgYmFja2VuZF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKHhTaGFwZSwgdmFyaWFuY2VTaGFwZSk7XG5cbiAgICBsZXQgb2Zmc2V0U25pcHBldCA9ICd2ZWM0KDAuMCknO1xuICAgIGlmIChvZmZzZXRTaGFwZSAhPSBudWxsKSB7XG4gICAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoeFNoYXBlLCBvZmZzZXRTaGFwZSk7XG4gICAgICB0aGlzLnZhcmlhYmxlTmFtZXMucHVzaCgnb2Zmc2V0Jyk7XG4gICAgICBvZmZzZXRTbmlwcGV0ID0gJ2dldE9mZnNldEF0T3V0Q29vcmRzKCknO1xuICAgIH1cblxuICAgIGxldCBzY2FsZVNuaXBwZXQgPSAndmVjNCgxLjApJztcbiAgICBpZiAoc2NhbGVTaGFwZSAhPSBudWxsKSB7XG4gICAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoeFNoYXBlLCBzY2FsZVNoYXBlKTtcbiAgICAgIHRoaXMudmFyaWFibGVOYW1lcy5wdXNoKCdzY2FsZScpO1xuICAgICAgc2NhbGVTbmlwcGV0ID0gJ2dldFNjYWxlQXRPdXRDb29yZHMoKSc7XG4gICAgfVxuXG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IHhTaGFwZTtcbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICB2ZWM0IG9mZnNldCA9ICR7b2Zmc2V0U25pcHBldH07XG4gICAgICAgIHZlYzQgc2NhbGUgPSAke3NjYWxlU25pcHBldH07XG5cbiAgICAgICAgdmVjNCB4ID0gZ2V0WEF0T3V0Q29vcmRzKCk7XG4gICAgICAgIHZlYzQgbWVhbiA9IGdldE1lYW5BdE91dENvb3JkcygpO1xuICAgICAgICB2ZWM0IHZhcmlhbmNlID0gZ2V0VmFyaWFuY2VBdE91dENvb3JkcygpO1xuXG4gICAgICAgIHZlYzQgaW52ID0gc2NhbGUgKiBpbnZlcnNlc3FydCh2YXJpYW5jZSArIHZlYzQoJHt2YXJpYW5jZUVwc2lsb259KSk7XG5cbiAgICAgICAgc2V0T3V0cHV0KCh4IC0gbWVhbikgKiBpbnYgKyBvZmZzZXQpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuLy8gKEFyICsgQWkpKEJyICsgQmkpID1cbi8vIEFyQnIgKyBBckJpICsgQWlCciArIEFpQmkgPSBBckJyIC0gQUIgKyBBckJpICsgQWlCclxuLy8gWXIgPSBBckJyIC0gQUJcbi8vIFlpID0gQXJCaSArIEFpQnJcbmV4cG9ydCBjb25zdCBDT01QTEVYX01VTFRJUExZID0ge1xuICBSRUFMOiAncmV0dXJuIGFyZWFsICogYnJlYWwgLSBhaW1hZyAqIGJpbWFnOycsXG4gIElNQUc6ICdyZXR1cm4gYXJlYWwgKiBiaW1hZyArIGFpbWFnICogYnJlYWw7J1xufTtcblxuZXhwb3J0IGNsYXNzIEJpbmFyeU9wQ29tcGxleFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydBUmVhbCcsICdBSW1hZycsICdCUmVhbCcsICdCSW1hZyddO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG5cbiAgY29uc3RydWN0b3Iob3A6IHN0cmluZywgYVNoYXBlOiBudW1iZXJbXSwgYlNoYXBlOiBudW1iZXJbXSkge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBiYWNrZW5kX3V0aWwuYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoYVNoYXBlLCBiU2hhcGUpO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGZsb2F0IGJpbmFyeU9wQ29tcGxleChcbiAgICAgICAgICBmbG9hdCBhcmVhbCwgZmxvYXQgYWltYWcsIGZsb2F0IGJyZWFsLCBmbG9hdCBiaW1hZykge1xuICAgICAgICAke29wfVxuICAgICAgfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGZsb2F0IGFyZWFsID0gZ2V0QVJlYWxBdE91dENvb3JkcygpO1xuICAgICAgICBmbG9hdCBhaW1hZyA9IGdldEFJbWFnQXRPdXRDb29yZHMoKTtcbiAgICAgICAgZmxvYXQgYnJlYWwgPSBnZXRCUmVhbEF0T3V0Q29vcmRzKCk7XG4gICAgICAgIGZsb2F0IGJpbWFnID0gZ2V0QkltYWdBdE91dENvb3JkcygpO1xuICAgICAgICBzZXRPdXRwdXQoYmluYXJ5T3BDb21wbGV4KGFyZWFsLCBhaW1hZywgYnJlYWwsIGJpbWFnKSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtHUEdQVVByb2dyYW0sIHVzZVNoYXBlVW5pZm9ybXN9IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjb25zdCBDSEVDS19OQU5fU05JUFBFVCA9IGBcbiAgaWYgKGlzbmFuKGEpKSByZXR1cm4gYTtcbiAgaWYgKGlzbmFuKGIpKSByZXR1cm4gYjtcbmA7XG5cbmV4cG9ydCBjb25zdCBTUVVBUkVEX0RJRkZFUkVOQ0UgPSAncmV0dXJuIChhIC0gYikgKiAoYSAtIGIpOyc7XG5leHBvcnQgY2xhc3MgQmluYXJ5T3BQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnQScsICdCJ107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihvcDogc3RyaW5nLCBhU2hhcGU6IG51bWJlcltdLCBiU2hhcGU6IG51bWJlcltdKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGJhY2tlbmRfdXRpbC5hc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZShhU2hhcGUsIGJTaGFwZSk7XG4gICAgdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID0gdXNlU2hhcGVVbmlmb3Jtcyh0aGlzLm91dHB1dFNoYXBlLmxlbmd0aCk7XG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGZsb2F0IGJpbmFyeU9wZXJhdGlvbihmbG9hdCBhLCBmbG9hdCBiKSB7XG4gICAgICAgICR7b3B9XG4gICAgICB9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgZmxvYXQgYSA9IGdldEFBdE91dENvb3JkcygpO1xuICAgICAgICBmbG9hdCBiID0gZ2V0QkF0T3V0Q29vcmRzKCk7XG4gICAgICAgIHNldE91dHB1dChiaW5hcnlPcGVyYXRpb24oYSwgYikpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtLCB1c2VTaGFwZVVuaWZvcm1zfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtnZXRDaGFubmVsc30gZnJvbSAnLi9wYWNraW5nX3V0aWwnO1xuaW1wb3J0IHtnZXRDb29yZHNEYXRhVHlwZX0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuXG5leHBvcnQgY29uc3QgQ0hFQ0tfTkFOX1NOSVBQRVQgPSBgXG4gIHJlc3VsdC5yID0gaXNOYU4uciA+IDAuID8gTkFOIDogcmVzdWx0LnI7XG4gIHJlc3VsdC5nID0gaXNOYU4uZyA+IDAuID8gTkFOIDogcmVzdWx0Lmc7XG4gIHJlc3VsdC5iID0gaXNOYU4uYiA+IDAuID8gTkFOIDogcmVzdWx0LmI7XG4gIHJlc3VsdC5hID0gaXNOYU4uYSA+IDAuID8gTkFOIDogcmVzdWx0LmE7XG5gO1xuXG5leHBvcnQgY29uc3QgRUxVX0RFUiA9IGBcbiAgdmVjNCBiR1RFWmVybyA9IHZlYzQoZ3JlYXRlclRoYW5FcXVhbChiLCB2ZWM0KDAuKSkpO1xuICByZXR1cm4gKGJHVEVaZXJvICogYSkgKyAoKHZlYzQoMS4wKSAtIGJHVEVaZXJvKSAqIChhICogKGIgKyB2ZWM0KDEuMCkpKSk7XG5gO1xuXG5leHBvcnQgY29uc3QgTk9UX0VRVUFMID0gYFxuICByZXR1cm4gdmVjNChub3RFcXVhbChhLCBiKSk7XG5gO1xuXG5leHBvcnQgY2xhc3MgQmluYXJ5T3BQYWNrZWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnQScsICdCJ107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgc3VwcG9ydHNCcm9hZGNhc3RpbmcgPSB0cnVlO1xuICBwYWNrZWRJbnB1dHMgPSB0cnVlO1xuICBwYWNrZWRPdXRwdXQgPSB0cnVlO1xuICBlbmFibGVTaGFwZVVuaWZvcm1zOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgb3A6IHN0cmluZywgYVNoYXBlOiBudW1iZXJbXSwgYlNoYXBlOiBudW1iZXJbXSxcbiAgICAgIGNoZWNrT3V0T2ZCb3VuZHMgPSBmYWxzZSkge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBiYWNrZW5kX3V0aWwuYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoYVNoYXBlLCBiU2hhcGUpO1xuICAgIGNvbnN0IHJhbmsgPSB0aGlzLm91dHB1dFNoYXBlLmxlbmd0aDtcbiAgICB0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMgPSB1c2VTaGFwZVVuaWZvcm1zKHJhbmspO1xuICAgIGxldCBjaGVja091dE9mQm91bmRzU3RyaW5nID0gJyc7XG4gICAgaWYgKGNoZWNrT3V0T2ZCb3VuZHMpIHtcbiAgICAgIGlmIChyYW5rID09PSAwIHx8IHV0aWwuc2l6ZUZyb21TaGFwZSh0aGlzLm91dHB1dFNoYXBlKSA9PT0gMSkge1xuICAgICAgICBjaGVja091dE9mQm91bmRzU3RyaW5nID0gYFxuICAgICAgICAgIHJlc3VsdC55ID0gMC47XG4gICAgICAgICAgcmVzdWx0LnogPSAwLjtcbiAgICAgICAgICByZXN1bHQudyA9IDAuO1xuICAgICAgICBgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShyYW5rKTtcbiAgICAgICAgY2hlY2tPdXRPZkJvdW5kc1N0cmluZyA9IGBcbiAgICAgICAgICAke2R0eXBlfSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgYDtcbiAgICAgICAgaWYgKHJhbmsgPT09IDEpIHtcbiAgICAgICAgICBpZiAodGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICAgICAgICBjaGVja091dE9mQm91bmRzU3RyaW5nICs9IGBcbiAgICAgICAgICAgIHJlc3VsdC55ID0gKGNvb3JkcyArIDEpID49IG91dFNoYXBlID8gMC4gOiByZXN1bHQueTtcbiAgICAgICAgICAgIHJlc3VsdC56ID0gMC47XG4gICAgICAgICAgICByZXN1bHQudyA9IDAuO1xuICAgICAgICAgIGA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNoZWNrT3V0T2ZCb3VuZHNTdHJpbmcgKz0gYFxuICAgICAgICAgICAgcmVzdWx0LnkgPSAoY29vcmRzICsgMSkgPj0gJHt0aGlzLm91dHB1dFNoYXBlWzBdfSA/IDAuIDogcmVzdWx0Lnk7XG4gICAgICAgICAgICByZXN1bHQueiA9IDAuO1xuICAgICAgICAgICAgcmVzdWx0LncgPSAwLjtcbiAgICAgICAgICBgO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBjaGFubmVscyA9IGdldENoYW5uZWxzKCdjb29yZHMnLCByYW5rKTtcbiAgICAgICAgICBpZiAodGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICAgICAgICBjaGVja091dE9mQm91bmRzU3RyaW5nICs9IGBcbiAgICAgICAgICAgIGJvb2wgbmV4dFJvd091dE9mQm91bmRzID1cbiAgICAgICAgICAgICAgKCR7Y2hhbm5lbHNbcmFuayAtIDJdfSArIDEpID49IG91dFNoYXBlWyR7cmFua30gLSAyXTtcbiAgICAgICAgICAgIGJvb2wgbmV4dENvbE91dE9mQm91bmRzID1cbiAgICAgICAgICAgICAgKCR7Y2hhbm5lbHNbcmFuayAtIDFdfSArIDEpID49IG91dFNoYXBlWyR7cmFua30gLSAxXTtcbiAgICAgICAgICAgIHJlc3VsdC55ID0gbmV4dENvbE91dE9mQm91bmRzID8gMC4gOiByZXN1bHQueTtcbiAgICAgICAgICAgIHJlc3VsdC56ID0gbmV4dFJvd091dE9mQm91bmRzID8gMC4gOiByZXN1bHQuejtcbiAgICAgICAgICAgIHJlc3VsdC53ID0gbmV4dENvbE91dE9mQm91bmRzIHx8IG5leHRSb3dPdXRPZkJvdW5kcyA/IDAuIDogcmVzdWx0Lnc7XG4gICAgICAgICAgYDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2hlY2tPdXRPZkJvdW5kc1N0cmluZyArPSBgXG4gICAgICAgICAgICBib29sIG5leHRSb3dPdXRPZkJvdW5kcyA9XG4gICAgICAgICAgICAgICgke2NoYW5uZWxzW3JhbmsgLSAyXX0gKyAxKSA+PSAke3RoaXMub3V0cHV0U2hhcGVbcmFuayAtIDJdfTtcbiAgICAgICAgICAgIGJvb2wgbmV4dENvbE91dE9mQm91bmRzID1cbiAgICAgICAgICAgICAgKCR7Y2hhbm5lbHNbcmFuayAtIDFdfSArIDEpID49ICR7dGhpcy5vdXRwdXRTaGFwZVtyYW5rIC0gMV19O1xuICAgICAgICAgICAgcmVzdWx0LnkgPSBuZXh0Q29sT3V0T2ZCb3VuZHMgPyAwLiA6IHJlc3VsdC55O1xuICAgICAgICAgICAgcmVzdWx0LnogPSBuZXh0Um93T3V0T2ZCb3VuZHMgPyAwLiA6IHJlc3VsdC56O1xuICAgICAgICAgICAgcmVzdWx0LncgPSBuZXh0Q29sT3V0T2ZCb3VuZHMgfHwgbmV4dFJvd091dE9mQm91bmRzID8gMC4gOiByZXN1bHQudztcbiAgICAgICAgICBgO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2ZWM0IGJpbmFyeU9wZXJhdGlvbih2ZWM0IGEsIHZlYzQgYikge1xuICAgICAgICAke29wfVxuICAgICAgfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIHZlYzQgYSA9IGdldEFBdE91dENvb3JkcygpO1xuICAgICAgICB2ZWM0IGIgPSBnZXRCQXRPdXRDb29yZHMoKTtcblxuICAgICAgICB2ZWM0IHJlc3VsdCA9IGJpbmFyeU9wZXJhdGlvbihhLCBiKTtcbiAgICAgICAgJHtjaGVja091dE9mQm91bmRzU3RyaW5nfVxuXG4gICAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuY29uc3QgY29udGV4dHM6IHtba2V5OiBzdHJpbmddOiBXZWJHTFJlbmRlcmluZ0NvbnRleHR9ID0ge307XG5cbmNvbnN0IFdFQkdMX0FUVFJJQlVURVM6IFdlYkdMQ29udGV4dEF0dHJpYnV0ZXMgPSB7XG4gIGFscGhhOiBmYWxzZSxcbiAgYW50aWFsaWFzOiBmYWxzZSxcbiAgcHJlbXVsdGlwbGllZEFscGhhOiBmYWxzZSxcbiAgcHJlc2VydmVEcmF3aW5nQnVmZmVyOiBmYWxzZSxcbiAgZGVwdGg6IGZhbHNlLFxuICBzdGVuY2lsOiBmYWxzZSxcbiAgZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdDogdHJ1ZVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyV2ViR0xDb250ZXh0KHdlYkdMVmVyc2lvbjogbnVtYmVyKSB7XG4gIGRlbGV0ZSBjb250ZXh0c1t3ZWJHTFZlcnNpb25dO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0V2ViR0xDb250ZXh0KFxuICAgIHdlYkdMVmVyc2lvbjogbnVtYmVyLCBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0KSB7XG4gIGNvbnRleHRzW3dlYkdMVmVyc2lvbl0gPSBnbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFdlYkdMQ29udGV4dCh3ZWJHTFZlcnNpb246IG51bWJlcik6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCB7XG4gIGlmICghKHdlYkdMVmVyc2lvbiBpbiBjb250ZXh0cykpIHtcbiAgICBjb25zdCBuZXdDdHggPSBnZXRXZWJHTFJlbmRlcmluZ0NvbnRleHQod2ViR0xWZXJzaW9uKTtcbiAgICBpZiAobmV3Q3R4ICE9PSBudWxsKSB7XG4gICAgICBjb250ZXh0c1t3ZWJHTFZlcnNpb25dID0gbmV3Q3R4O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZygnQ291bGQgbm90IGdldCBjb250ZXh0IGZvciBXZWJHTCB2ZXJzaW9uJywgd2ViR0xWZXJzaW9uKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuICBjb25zdCBnbCA9IGNvbnRleHRzW3dlYkdMVmVyc2lvbl07XG4gIGlmIChnbC5pc0NvbnRleHRMb3N0KCkpIHtcbiAgICBkZWxldGUgY29udGV4dHNbd2ViR0xWZXJzaW9uXTtcbiAgICByZXR1cm4gZ2V0V2ViR0xDb250ZXh0KHdlYkdMVmVyc2lvbik7XG4gIH1cblxuICBnbC5kaXNhYmxlKGdsLkRFUFRIX1RFU1QpO1xuICBnbC5kaXNhYmxlKGdsLlNURU5DSUxfVEVTVCk7XG4gIGdsLmRpc2FibGUoZ2wuQkxFTkQpO1xuICBnbC5kaXNhYmxlKGdsLkRJVEhFUik7XG4gIGdsLmRpc2FibGUoZ2wuUE9MWUdPTl9PRkZTRVRfRklMTCk7XG4gIGdsLmRpc2FibGUoZ2wuU0FNUExFX0NPVkVSQUdFKTtcbiAgZ2wuZW5hYmxlKGdsLlNDSVNTT1JfVEVTVCk7XG4gIGdsLmVuYWJsZShnbC5DVUxMX0ZBQ0UpO1xuICBnbC5jdWxsRmFjZShnbC5CQUNLKTtcblxuICByZXR1cm4gY29udGV4dHNbd2ViR0xWZXJzaW9uXTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ2FudmFzKHdlYkdMVmVyc2lvbjogbnVtYmVyKSB7XG4gIGlmICh0eXBlb2YgT2Zmc2NyZWVuQ2FudmFzICE9PSAndW5kZWZpbmVkJyAmJiB3ZWJHTFZlcnNpb24gPT09IDIpIHtcbiAgICByZXR1cm4gbmV3IE9mZnNjcmVlbkNhbnZhcygzMDAsIDE1MCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjcmVhdGUgYSBjYW52YXMgaW4gdGhpcyBjb250ZXh0Jyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0V2ViR0xSZW5kZXJpbmdDb250ZXh0KHdlYkdMVmVyc2lvbjogbnVtYmVyKTogV2ViR0xSZW5kZXJpbmdDb250ZXh0IHtcbiAgaWYgKHdlYkdMVmVyc2lvbiAhPT0gMSAmJiB3ZWJHTFZlcnNpb24gIT09IDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBnZXQgV2ViR0wgcmVuZGVyaW5nIGNvbnRleHQsIFdlYkdMIGlzIGRpc2FibGVkLicpO1xuICB9XG4gIGNvbnN0IGNhbnZhcyA9IGNyZWF0ZUNhbnZhcyh3ZWJHTFZlcnNpb24pO1xuXG4gIGNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCd3ZWJnbGNvbnRleHRsb3N0JywgKGV2OiBFdmVudCkgPT4ge1xuICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZGVsZXRlIGNvbnRleHRzW3dlYkdMVmVyc2lvbl07XG4gIH0sIGZhbHNlKTtcbiAgaWYgKHdlYkdMVmVyc2lvbiA9PT0gMSkge1xuICAgIHJldHVybiAoY2FudmFzLmdldENvbnRleHQoJ3dlYmdsJywgV0VCR0xfQVRUUklCVVRFUykgfHxcbiAgICAgICAgICAgIGNhbnZhcy5nZXRDb250ZXh0KCdleHBlcmltZW50YWwtd2ViZ2wnLCBXRUJHTF9BVFRSSUJVVEVTKSkgYXNcbiAgICAgICAgV2ViR0xSZW5kZXJpbmdDb250ZXh0O1xuICB9XG4gIHJldHVybiBjYW52YXMuZ2V0Q29udGV4dCgnd2ViZ2wyJywgV0VCR0xfQVRUUklCVVRFUykgYXMgV2ViR0xSZW5kZXJpbmdDb250ZXh0O1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7VW5pZm9ybVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuZXhwb3J0IGNsYXNzIENsaXBQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIGN1c3RvbVVuaWZvcm1zID0gW1xuICAgIHtuYW1lOiAnbWluVmFsJywgdHlwZTogJ2Zsb2F0JyBhcyBVbmlmb3JtVHlwZX0sXG4gICAge25hbWU6ICdtYXhWYWwnLCB0eXBlOiAnZmxvYXQnIGFzIFVuaWZvcm1UeXBlfVxuICBdO1xuXG4gIGNvbnN0cnVjdG9yKGFTaGFwZTogbnVtYmVyW10pIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gYVNoYXBlO1xuICAgIHRoaXMudXNlckNvZGUgPSBgXG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgZmxvYXQgdmFsdWUgPSBnZXRBQXRPdXRDb29yZHMoKTtcbiAgICAgICAgaWYgKGlzbmFuKHZhbHVlKSkge1xuICAgICAgICAgIHNldE91dHB1dCh2YWx1ZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0T3V0cHV0KGNsYW1wKHZhbHVlLCBtaW5WYWwsIG1heFZhbCkpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5pbXBvcnQge1VuaWZvcm1UeXBlfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5cbmV4cG9ydCBjbGFzcyBDbGlwUGFja2VkUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgcGFja2VkSW5wdXRzID0gdHJ1ZTtcbiAgcGFja2VkT3V0cHV0ID0gdHJ1ZTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICBjdXN0b21Vbmlmb3JtcyA9IFtcbiAgICB7bmFtZTogJ21pblZhbCcsIHR5cGU6ICdmbG9hdCcgYXMgVW5pZm9ybVR5cGV9LFxuICAgIHtuYW1lOiAnbWF4VmFsJywgdHlwZTogJ2Zsb2F0JyBhcyBVbmlmb3JtVHlwZX1cbiAgXTtcblxuICBjb25zdHJ1Y3RvcihhU2hhcGU6IG51bWJlcltdKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGFTaGFwZTtcbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICB2ZWM0IHZhbHVlID0gZ2V0QUF0T3V0Q29vcmRzKCk7XG5cbiAgICAgICAgaWYgKGFueShpc25hbih2YWx1ZSkpKSB7XG4gICAgICAgICAgc2V0T3V0cHV0KHZhbHVlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBzZXRPdXRwdXQoY2xhbXAodmFsdWUsIHZlYzQobWluVmFsKSwgdmVjNChtYXhWYWwpKSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIENvbXBsZXhBYnNQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsncmVhbCcsICdpbWFnJ107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcblxuICBjb25zdHJ1Y3RvcihzaGFwZTogbnVtYmVyW10pIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gc2hhcGU7XG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgZmxvYXQgcmUgPSBhYnMoZ2V0UmVhbEF0T3V0Q29vcmRzKCkpO1xuICAgICAgICBmbG9hdCBpbSA9IGFicyhnZXRJbWFnQXRPdXRDb29yZHMoKSk7XG4gICAgICAgIGZsb2F0IG14ID0gbWF4KHJlLCBpbSk7XG5cbiAgICAgICAgLy8gc2FkbHkgdGhlIGxlbmd0aCBmdW5jdGlvbiBpbiBnbHNsIGlzIG5vdCB1bmRlcmZsb3ctc2FmZVxuICAgICAgICAvLyAoYXQgbGVhc3Qgbm90IG9uIEludGVsIEdQVXMpLiBTbyB0aGUgc2FmZSBzb2x1dGlvbiBpc1xuICAgICAgICAvLyB0byBlbnN1cmUgdW5kZXJmbG93LXNhZmV0eSBpbiBhbGwgY2FzZXMuXG4gICAgICAgIHNldE91dHB1dChcbiAgICAgICAgICBteCA9PSAwLjAgPyAwLjAgOiBteCAqIGxlbmd0aCh2ZWMyKDEsIG1pbihyZSwgaW0pL214KSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBDb25jYXRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lczogc3RyaW5nW107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXSA9IFtdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIC8vIENvbmNhdHMgMmQgdGVuc29ycyBhbG9uZyBheGlzPTEuIFNlZSBjb21tZW50cyBpbiBNYXRoQmFja2VuZFdlYkdMLmNvbmNhdCgpLlxuICBjb25zdHJ1Y3RvcihzaGFwZXM6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+KSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0U2hhcGUoc2hhcGVzLCAxIC8qIGF4aXMgKi8pO1xuICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IHNoYXBlcy5tYXAoKF8sIGkpID0+IGBUJHtpfWApO1xuXG4gICAgY29uc3Qgb2Zmc2V0czogbnVtYmVyW10gPSBuZXcgQXJyYXkoc2hhcGVzLmxlbmd0aCAtIDEpO1xuICAgIG9mZnNldHNbMF0gPSBzaGFwZXNbMF1bMV07XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBvZmZzZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBvZmZzZXRzW2ldID0gb2Zmc2V0c1tpIC0gMV0gKyBzaGFwZXNbaV1bMV07XG4gICAgfVxuXG4gICAgY29uc3Qgc25pcHBldHMgPSBbYGlmICh5QyA8ICR7b2Zmc2V0c1swXX0pIHNldE91dHB1dChnZXRUMCh5UiwgeUMpKTtgXTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IG9mZnNldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHNoaWZ0ID0gb2Zmc2V0c1tpIC0gMV07XG4gICAgICBzbmlwcGV0cy5wdXNoKFxuICAgICAgICAgIGBlbHNlIGlmICh5QyA8ICR7b2Zmc2V0c1tpXX0pIGAgK1xuICAgICAgICAgIGBzZXRPdXRwdXQoZ2V0VCR7aX0oeVIsIHlDLSR7c2hpZnR9KSk7YCk7XG4gICAgfVxuICAgIGNvbnN0IGxhc3RJbmRleCA9IG9mZnNldHMubGVuZ3RoO1xuICAgIGNvbnN0IGxhc3RTaGlmdCA9IG9mZnNldHNbb2Zmc2V0cy5sZW5ndGggLSAxXTtcbiAgICBzbmlwcGV0cy5wdXNoKGBlbHNlIHNldE91dHB1dChnZXRUJHtsYXN0SW5kZXh9KHlSLCB5Qy0ke2xhc3RTaGlmdH0pKTtgKTtcblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWMyIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgeVIgPSBjb29yZHMueDtcbiAgICAgICAgaW50IHlDID0gY29vcmRzLnk7XG5cbiAgICAgICAgJHtzbmlwcGV0cy5qb2luKCdcXG4gICAgICAgICcpfVxuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtnZXRDaGFubmVsc30gZnJvbSAnLi9wYWNraW5nX3V0aWwnO1xuaW1wb3J0IHtnZXRDb29yZHNEYXRhVHlwZX0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuXG5leHBvcnQgY2xhc3MgQ29uY2F0UGFja2VkUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXM6IHN0cmluZ1tdO1xuICBwYWNrZWRJbnB1dHMgPSB0cnVlO1xuICBwYWNrZWRPdXRwdXQgPSB0cnVlO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW10gPSBbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzaGFwZXM6IG51bWJlcltdW10sIGF4aXM6IG51bWJlcikge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dFNoYXBlKHNoYXBlcywgYXhpcyk7XG4gICAgY29uc3Qgc2hhcGUgPSB0aGlzLm91dHB1dFNoYXBlO1xuICAgIGNvbnN0IHJhbmsgPSBzaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgZHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShyYW5rKTtcbiAgICBjb25zdCBjb29yZHMgPSBnZXRDaGFubmVscygnY29vcmRzJywgcmFuayk7XG4gICAgY29uc3QgY2hhbm5lbHMgPSBbJ3gnLCAneScsICd6JywgJ3cnLCAndScsICd2J10uc2xpY2UoMCwgcmFuayk7XG4gICAgdGhpcy52YXJpYWJsZU5hbWVzID0gc2hhcGVzLm1hcCgoXywgaSkgPT4gYFQke2l9YCk7XG5cbiAgICBjb25zdCBvZmZzZXRzOiBudW1iZXJbXSA9IG5ldyBBcnJheShzaGFwZXMubGVuZ3RoIC0gMSk7XG4gICAgb2Zmc2V0c1swXSA9IHNoYXBlc1swXVtheGlzXTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IG9mZnNldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG9mZnNldHNbaV0gPSBvZmZzZXRzW2kgLSAxXSArIHNoYXBlc1tpXVtheGlzXTtcbiAgICB9XG5cbiAgICBjb25zdCBjaGFubmVsID0gY2hhbm5lbHNbYXhpc107XG4gICAgY29uc3QgbGFzdENoYW5uZWxzID0gY2hhbm5lbHMuc2xpY2UoLTIpO1xuICAgIGNvbnN0IGFsbENoYW5uZWxzID0gY2hhbm5lbHMuam9pbigpO1xuXG4gICAgbGV0IGdldFZhbHVlU25pcHBldCA9IGBpZiAoJHtjaGFubmVsfSA8ICR7b2Zmc2V0c1swXX0pIHtcbiAgICAgICAgcmV0dXJuIGdldENoYW5uZWwoXG4gICAgICAgICAgICBnZXRUMCgke2FsbENoYW5uZWxzfSksIHZlYzIoJHtsYXN0Q2hhbm5lbHMuam9pbigpfSkpO1xuICAgICAgICB9YDtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IG9mZnNldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHNoaWZ0ID0gb2Zmc2V0c1tpIC0gMV07XG4gICAgICAvLyBOb3RlOiB0aGUgPj0gY29tcGFyaXNvbiBiZWxvdyBtYXkgc2VlbSB1bm5lY2Vzc2FyeSBnaXZlbiB0aGUgY2hlY2tcbiAgICAgIC8vIGFib3ZlIGJ1dCBpcyBuZWVkZWQgdG8gd29ya2Fyb3VuZCBicmFuY2ggZXhlY3V0aW9uIGlzc3VlcyBvbiBzb21lXG4gICAgICAvLyBkZXZpY2VzLiBJdCBtYWtlcyBhbGwgdGhlIGNvbmRpdGlvbnMgZXhjbHVzaXZlIHdpdGhvdXQgcmVseWluZyBvblxuICAgICAgLy8gZXhlY3V0aW9uIG9yZGVyLlxuICAgICAgZ2V0VmFsdWVTbmlwcGV0ICs9IGBcbiAgICAgICAgaWYgKCR7Y2hhbm5lbH0gPCAke29mZnNldHNbaV19ICAmJiAke2NoYW5uZWx9ID49ICR7b2Zmc2V0c1tpIC0gMV19KSB7XG4gICAgICAgICAgcmV0dXJuIGdldENoYW5uZWwoXG4gICAgICAgICAgICBnZXRUJHtpfSgke3NoaWZ0ZWRDaGFubmVscyhjaGFubmVscywgY2hhbm5lbCwgc2hpZnQpfSksXG4gICAgICAgICAgICB2ZWMyKCR7c2hpZnRlZENoYW5uZWxzKGxhc3RDaGFubmVscywgY2hhbm5lbCwgc2hpZnQpfSkpO1xuICAgICAgICB9YDtcbiAgICB9XG4gICAgY29uc3QgbGFzdEluZGV4ID0gb2Zmc2V0cy5sZW5ndGg7XG4gICAgY29uc3Qgc2hpZnQgPSBvZmZzZXRzW29mZnNldHMubGVuZ3RoIC0gMV07XG4gICAgZ2V0VmFsdWVTbmlwcGV0ICs9IGBcbiAgICAgICAgcmV0dXJuIGdldENoYW5uZWwoXG4gICAgICAgICAgZ2V0VCR7bGFzdEluZGV4fSgke3NoaWZ0ZWRDaGFubmVscyhjaGFubmVscywgY2hhbm5lbCwgc2hpZnQpfSksXG4gICAgICAgICAgdmVjMigke3NoaWZ0ZWRDaGFubmVscyhsYXN0Q2hhbm5lbHMsIGNoYW5uZWwsIHNoaWZ0KX0pKTtgO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGZsb2F0IGdldFZhbHVlKCR7Y2hhbm5lbHMubWFwKHggPT4gJ2ludCAnICsgeCl9KSB7XG4gICAgICAgICR7Z2V0VmFsdWVTbmlwcGV0fVxuICAgICAgfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICR7ZHR5cGV9IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoZ2V0VmFsdWUoJHtjb29yZHN9KSwgMC4sIDAuLCAwLik7XG5cbiAgICAgICAgJHtjb29yZHNbcmFuayAtIDFdfSA9ICR7Y29vcmRzW3JhbmsgLSAxXX0gKyAxO1xuICAgICAgICBpZiAoJHtjb29yZHNbcmFuayAtIDFdfSA8ICR7c2hhcGVbcmFuayAtIDFdfSkge1xuICAgICAgICAgIHJlc3VsdC5nID0gZ2V0VmFsdWUoJHtjb29yZHN9KTtcbiAgICAgICAgfVxuXG4gICAgICAgICR7Y29vcmRzW3JhbmsgLSAyXX0gPSAke2Nvb3Jkc1tyYW5rIC0gMl19ICsgMTtcbiAgICAgICAgaWYgKCR7Y29vcmRzW3JhbmsgLSAyXX0gPCAke3NoYXBlW3JhbmsgLSAyXX0pIHtcbiAgICAgICAgICByZXN1bHQuYSA9IGdldFZhbHVlKCR7Y29vcmRzfSk7XG4gICAgICAgIH1cblxuICAgICAgICAke2Nvb3Jkc1tyYW5rIC0gMV19ID0gJHtjb29yZHNbcmFuayAtIDFdfSAtIDE7XG4gICAgICAgIGlmICgke2Nvb3Jkc1tyYW5rIC0gMl19IDwgJHtzaGFwZVtyYW5rIC0gMl19ICYmXG4gICAgICAgICAgICAke2Nvb3Jkc1tyYW5rIC0gMV19IDwgJHtzaGFwZVtyYW5rIC0gMV19KSB7XG4gICAgICAgICAgcmVzdWx0LmIgPSBnZXRWYWx1ZSgke2Nvb3Jkc30pO1xuICAgICAgICB9XG4gICAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm4gYW4gZXhwcmVzc2lvbiBmb3IgY29vcmRpbmF0ZXMgaW50byBhIHZlY3RvciB3aGVyZSBhIGdpdmVuIGNoYW5uZWxcbiAqIHdpbGwgYmUgb2Zmc2V0IGJ5IFtzaGlmdF0uXG4gKlxuICogQHBhcmFtIGNoYW5uZWxzIHRoZSBjaGFubmVscyB0byBjb25zaWRlclxuICogQHBhcmFtIGNoYW5uZWwgdGhlIGNoYW5uZWwgd2Ugd2FudCBzaGlmdGVkXG4gKiBAcGFyYW0gc2hpZnQgIHRoZSBhbW91bnQgdG8gc3VidHJhY3QgZnJvbSB0aGUgY2hhbm5lbC5cbiAqXG4gKiBAcmV0dXJucyBhIHN0cmluZyBvZiB0aGUgZm9ybSAneCwgeS1bc2hpZnRdLCB6JyB3aGVyZSBhbnkgb25lIGNoYW5uZWwgY2FuXG4gKiBoYXZlIHRoZSBzaGlmdCBhcHBsaWVkLlxuICovXG5mdW5jdGlvbiBzaGlmdGVkQ2hhbm5lbHMoY2hhbm5lbHM6IHN0cmluZ1tdLCBjaGFubmVsOiBzdHJpbmcsIHNoaWZ0OiBudW1iZXIpIHtcbiAgY29uc3QgY2hhbm5lbElkeCA9IGNoYW5uZWxzLmluZGV4T2YoY2hhbm5lbCk7XG4gIGNvbnN0IHJlcyA9IGNoYW5uZWxzLm1hcCgoYywgaWR4KSA9PiB7XG4gICAgaWYgKGlkeCA9PT0gY2hhbm5lbElkeCkge1xuICAgICAgcmV0dXJuIGAke2N9IC0gJHtzaGlmdH1gO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYztcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzLmpvaW4oKTtcbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIENvbnYyRERlckZpbHRlclByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWyd4JywgJ2R5J107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihjb252SW5mbzogYmFja2VuZF91dGlsLkNvbnYyREluZm8pIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gY29udkluZm8uZmlsdGVyU2hhcGU7XG5cbiAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBwYWRUb3AgPSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICBjb25zdCBwYWRMZWZ0ID0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgIGNvbnN0IGlzQ2hhbm5lbHNMYXN0ID0gY29udkluZm8uZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzTGFzdCc7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IHdSID0gY29vcmRzLng7XG4gICAgICAgIGludCB3QyA9IGNvb3Jkcy55O1xuICAgICAgICBpbnQgZDEgPSBjb29yZHMuejtcbiAgICAgICAgaW50IGQyID0gY29vcmRzLnc7XG5cbiAgICAgICAgLy8gQ29udm9sdmUgeCg/LCA/LCBkMSkgd2l0aCBkeSg6LCA6LCBkMikgdG8gZ2V0IGR3KHdSLCB3QywgZDEsIGQyKS5cbiAgICAgICAgLy8gPyA9IHRvIGJlIGRldGVybWluZWQuIDogPSBhY3Jvc3MgYWxsIHZhbHVlcyBpbiB0aGF0IGF4aXMuXG4gICAgICAgIGZsb2F0IGRvdFByb2QgPSAwLjA7XG5cbiAgICAgICAgZm9yIChpbnQgYiA9IDA7IGIgPCAke2NvbnZJbmZvLmJhdGNoU2l6ZX07IGIrKykge1xuICAgICAgICAgIGZvciAoaW50IHlSID0gMDsgeVIgPCAke2NvbnZJbmZvLm91dEhlaWdodH07IHlSKyspIHtcbiAgICAgICAgICAgIGludCB4UiA9IHdSICsgeVIgKiAke3N0cmlkZUhlaWdodH0gLSAke3BhZFRvcH07XG5cbiAgICAgICAgICAgIGlmICh4UiA8IDAgfHwgeFIgPj0gJHtjb252SW5mby5pbkhlaWdodH0pIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoaW50IHlDID0gMDsgeUMgPCAke2NvbnZJbmZvLm91dFdpZHRofTsgeUMrKykge1xuICAgICAgICAgICAgICBpbnQgeEMgPSB3QyArIHlDICogJHtzdHJpZGVXaWR0aH0gLSAke3BhZExlZnR9O1xuXG4gICAgICAgICAgICAgIGlmICh4QyA8IDAgfHwgeEMgPj0gJHtjb252SW5mby5pbldpZHRofSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKCR7aXNDaGFubmVsc0xhc3R9KSB7XG4gICAgICAgICAgICAgICAgZmxvYXQgZHlWYWx1ZSA9IGdldER5KGIsIHlSLCB5QywgZDIpO1xuICAgICAgICAgICAgICAgIGZsb2F0IHhWYWx1ZSA9IGdldFgoYiwgeFIsIHhDLCBkMSk7XG4gICAgICAgICAgICAgICAgZG90UHJvZCArPSAoeFZhbHVlICogZHlWYWx1ZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZmxvYXQgZHlWYWx1ZSA9IGdldER5KGIsIGQyLCB5UiwgeUMpO1xuICAgICAgICAgICAgICAgIGZsb2F0IHhWYWx1ZSA9IGdldFgoYiwgZDEsIHhSLCB4Qyk7XG4gICAgICAgICAgICAgICAgZG90UHJvZCArPSAoeFZhbHVlICogZHlWYWx1ZSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQoZG90UHJvZCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29udjJERGVySW5wdXRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnZHknLCAnVyddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoY29udkluZm86IGJhY2tlbmRfdXRpbC5Db252MkRJbmZvKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGNvbnZJbmZvLmluU2hhcGU7XG5cbiAgICBjb25zdCBmaWx0ZXJIZWlnaHQgPSBjb252SW5mby5maWx0ZXJIZWlnaHQ7XG4gICAgY29uc3QgZmlsdGVyV2lkdGggPSBjb252SW5mby5maWx0ZXJXaWR0aDtcbiAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBpc0NoYW5uZWxzTGFzdCA9IGNvbnZJbmZvLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnO1xuXG4gICAgY29uc3QgcGFkVG9wID0gZmlsdGVySGVpZ2h0IC0gMSAtIGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IHBhZExlZnQgPSBmaWx0ZXJXaWR0aCAtIDEgLSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG5cbiAgICBjb25zdCByb3dEaW0gPSBpc0NoYW5uZWxzTGFzdCA/IDEgOiAyO1xuICAgIGNvbnN0IGNvbERpbSA9IGlzQ2hhbm5lbHNMYXN0ID8gMiA6IDM7XG4gICAgY29uc3QgY2hhbm5lbERpbSA9IGlzQ2hhbm5lbHNMYXN0ID8gMyA6IDE7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgY29uc3QgaXZlYzIgcGFkcyA9IGl2ZWMyKCR7cGFkVG9wfSwgJHtwYWRMZWZ0fSk7XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiYXRjaCA9IGNvb3Jkc1swXTtcbiAgICAgICAgaW50IGQxID0gY29vcmRzWyR7Y2hhbm5lbERpbX1dO1xuXG4gICAgICAgIGl2ZWMyIGR5Q29ybmVyID0gaXZlYzIoY29vcmRzWyR7cm93RGltfV0sIGNvb3Jkc1ske2NvbERpbX1dKSAtIHBhZHM7XG4gICAgICAgIGludCBkeVJDb3JuZXIgPSBkeUNvcm5lci54O1xuICAgICAgICBpbnQgZHlDQ29ybmVyID0gZHlDb3JuZXIueTtcblxuICAgICAgICAvLyBDb252b2x2ZSBkeSg/LCA/LCBkMikgd2l0aCB3KDosIDosIGQxLCBkMikgdG8gY29tcHV0ZSBkeCh4UiwgeEMsIGQxKS5cbiAgICAgICAgLy8gPyA9IHRvIGJlIGRldGVybWluZWQuIDogPSBhY3Jvc3MgYWxsIHZhbHVlcyBpbiB0aGF0IGF4aXMuXG4gICAgICAgIGZsb2F0IGRvdFByb2QgPSAwLjA7XG4gICAgICAgIGZvciAoaW50IHdSID0gMDsgd1IgPCAke2ZpbHRlckhlaWdodH07IHdSKyspIHtcbiAgICAgICAgICBmbG9hdCBkeVIgPSBmbG9hdChkeVJDb3JuZXIgKyB3UikgLyAke3N0cmlkZUhlaWdodH0uMDtcblxuICAgICAgICAgIGlmIChkeVIgPCAwLjAgfHwgZHlSID49ICR7Y29udkluZm8ub3V0SGVpZ2h0fS4wIHx8IGZyYWN0KGR5UikgPiAwLjApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpbnQgaWR5UiA9IGludChkeVIpO1xuXG4gICAgICAgICAgaW50IHdSUGVybSA9ICR7ZmlsdGVySGVpZ2h0fSAtIDEgLSB3UjtcblxuICAgICAgICAgIGZvciAoaW50IHdDID0gMDsgd0MgPCAke2ZpbHRlcldpZHRofTsgd0MrKykge1xuICAgICAgICAgICAgZmxvYXQgZHlDID0gZmxvYXQoZHlDQ29ybmVyICsgd0MpIC8gJHtzdHJpZGVXaWR0aH0uMDtcblxuICAgICAgICAgICAgaWYgKGR5QyA8IDAuMCB8fCBkeUMgPj0gJHtjb252SW5mby5vdXRXaWR0aH0uMCB8fFxuICAgICAgICAgICAgICAgIGZyYWN0KGR5QykgPiAwLjApIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbnQgaWR5QyA9IGludChkeUMpO1xuXG4gICAgICAgICAgICBpbnQgd0NQZXJtID0gJHtmaWx0ZXJXaWR0aH0gLSAxIC0gd0M7XG5cbiAgICAgICAgICAgIGZvciAoaW50IGQyID0gMDsgZDIgPCAke2NvbnZJbmZvLm91dENoYW5uZWxzfTsgZDIrKykge1xuXG4gICAgICAgICAgICAgIGlmICgke2lzQ2hhbm5lbHNMYXN0fSkge1xuICAgICAgICAgICAgICAgIGZsb2F0IHhWYWx1ZSA9IGdldER5KGJhdGNoLCBpZHlSLCBpZHlDLCBkMik7XG4gICAgICAgICAgICAgICAgZmxvYXQgd1ZhbHVlID0gZ2V0Vyh3UlBlcm0sIHdDUGVybSwgZDEsIGQyKTtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9IHhWYWx1ZSAqIHdWYWx1ZTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmbG9hdCB4VmFsdWUgPSBnZXREeShiYXRjaCwgZDIsIGlkeVIsIGlkeUMpO1xuICAgICAgICAgICAgICAgIGZsb2F0IHdWYWx1ZSA9IGdldFcod1JQZXJtLCB3Q1Blcm0sIGQxLCBkMik7XG4gICAgICAgICAgICAgICAgZG90UHJvZCArPSB4VmFsdWUgKiB3VmFsdWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQoZG90UHJvZCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29udjNERGVyRmlsdGVyUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnLCAnZHknXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGNvbnZJbmZvOiBiYWNrZW5kX3V0aWwuQ29udjNESW5mbykge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5maWx0ZXJTaGFwZTtcblxuICAgIGNvbnN0IHN0cmlkZURlcHRoID0gY29udkluZm8uc3RyaWRlRGVwdGg7XG4gICAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgY29uc3QgcGFkRnJvbnQgPSBjb252SW5mby5wYWRJbmZvLmZyb250O1xuICAgIGNvbnN0IHBhZFRvcCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IHBhZExlZnQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjNSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IHdGID0gY29vcmRzLng7XG4gICAgICAgIGludCB3UiA9IGNvb3Jkcy55O1xuICAgICAgICBpbnQgd0MgPSBjb29yZHMuejtcbiAgICAgICAgaW50IGQxID0gY29vcmRzLnc7XG4gICAgICAgIGludCBkMiA9IGNvb3Jkcy51O1xuXG4gICAgICAgIGZsb2F0IGRvdFByb2QgPSAwLjA7XG5cbiAgICAgICAgZm9yIChpbnQgYiA9IDA7IGIgPCAke2NvbnZJbmZvLmJhdGNoU2l6ZX07IGIrKykge1xuICAgICAgICAgIGZvciAoaW50IHlGID0gMDsgeUYgPCAke2NvbnZJbmZvLm91dERlcHRofTsgeUYrKykge1xuICAgICAgICAgICAgaW50IHhGID0gd0YgKyB5RiAqICR7c3RyaWRlRGVwdGh9IC0gJHtwYWRGcm9udH07XG5cbiAgICAgICAgICAgIGlmICh4RiA8IDAgfHwgeEYgPj0gJHtjb252SW5mby5pbkRlcHRofSkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChpbnQgeVIgPSAwOyB5UiA8ICR7Y29udkluZm8ub3V0SGVpZ2h0fTsgeVIrKykge1xuICAgICAgICAgICAgICBpbnQgeFIgPSB3UiArIHlSICogJHtzdHJpZGVIZWlnaHR9IC0gJHtwYWRUb3B9O1xuXG4gICAgICAgICAgICAgIGlmICh4UiA8IDAgfHwgeFIgPj0gJHtjb252SW5mby5pbkhlaWdodH0pIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGZvciAoaW50IHlDID0gMDsgeUMgPCAke2NvbnZJbmZvLm91dFdpZHRofTsgeUMrKykge1xuICAgICAgICAgICAgICAgIGludCB4QyA9IHdDICsgeUMgKiAke3N0cmlkZVdpZHRofSAtICR7cGFkTGVmdH07XG5cbiAgICAgICAgICAgICAgICBpZiAoeEMgPCAwIHx8IHhDID49ICR7Y29udkluZm8uaW5XaWR0aH0pIHtcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZsb2F0IGR5VmFsdWUgPSBnZXREeShiLCB5RiwgeVIsIHlDLCBkMik7XG4gICAgICAgICAgICAgICAgZmxvYXQgeFZhbHVlID0gZ2V0WChiLCB4RiwgeFIsIHhDLCBkMSk7XG4gICAgICAgICAgICAgICAgZG90UHJvZCArPSAoeFZhbHVlICogZHlWYWx1ZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0T3V0cHV0KGRvdFByb2QpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbnYzRERlcklucHV0UHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ2R5JywgJ1cnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGNvbnZJbmZvOiBiYWNrZW5kX3V0aWwuQ29udjNESW5mbykge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5pblNoYXBlO1xuXG4gICAgY29uc3QgZmlsdGVyRGVwdGggPSBjb252SW5mby5maWx0ZXJEZXB0aDtcbiAgICBjb25zdCBmaWx0ZXJIZWlnaHQgPSBjb252SW5mby5maWx0ZXJIZWlnaHQ7XG4gICAgY29uc3QgZmlsdGVyV2lkdGggPSBjb252SW5mby5maWx0ZXJXaWR0aDtcbiAgICBjb25zdCBzdHJpZGVEZXB0aCA9IGNvbnZJbmZvLnN0cmlkZURlcHRoO1xuICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuXG4gICAgY29uc3QgcGFkRnJvbnQgPSBmaWx0ZXJEZXB0aCAtIDEgLSBjb252SW5mby5wYWRJbmZvLmZyb250O1xuICAgIGNvbnN0IHBhZFRvcCA9IGZpbHRlckhlaWdodCAtIDEgLSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICBjb25zdCBwYWRMZWZ0ID0gZmlsdGVyV2lkdGggLSAxIC0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IGl2ZWMzIHBhZHMgPSBpdmVjMygke3BhZEZyb250fSwgJHtwYWRUb3B9LCAke3BhZExlZnR9KTtcblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjNSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzLng7XG4gICAgICAgIGludCBkMSA9IGNvb3Jkcy51O1xuXG5cbiAgICAgICAgaXZlYzMgZHlDb3JuZXIgPSBpdmVjMyhjb29yZHMueSwgY29vcmRzLnosIGNvb3Jkcy53KSAtIHBhZHM7XG4gICAgICAgIGludCBkeUZDb3JuZXIgPSBkeUNvcm5lci54O1xuICAgICAgICBpbnQgZHlSQ29ybmVyID0gZHlDb3JuZXIueTtcbiAgICAgICAgaW50IGR5Q0Nvcm5lciA9IGR5Q29ybmVyLno7XG5cbiAgICAgICAgZmxvYXQgZG90UHJvZCA9IDAuMDtcbiAgICAgICAgZm9yIChpbnQgd0YgPSAwOyB3RiA8ICR7ZmlsdGVyRGVwdGh9OyB3RisrKSB7XG4gICAgICAgICAgZmxvYXQgZHlGID0gZmxvYXQoZHlGQ29ybmVyICsgd0YpIC8gJHtzdHJpZGVEZXB0aH0uMDtcblxuICAgICAgICAgIGlmIChkeUYgPCAwLjAgfHwgZHlGID49ICR7Y29udkluZm8ub3V0RGVwdGh9LjAgfHwgZnJhY3QoZHlGKSA+IDAuMCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGludCBpZHlGID0gaW50KGR5Rik7XG5cbiAgICAgICAgICBpbnQgd0ZQZXJtID0gJHtmaWx0ZXJEZXB0aH0gLSAxIC0gd0Y7XG5cbiAgICAgICAgICBmb3IgKGludCB3UiA9IDA7IHdSIDwgJHtmaWx0ZXJIZWlnaHR9OyB3UisrKSB7XG4gICAgICAgICAgICBmbG9hdCBkeVIgPSBmbG9hdChkeVJDb3JuZXIgKyB3UikgLyAke3N0cmlkZUhlaWdodH0uMDtcblxuICAgICAgICAgICAgaWYgKGR5UiA8IDAuMCB8fCBkeVIgPj0gJHtjb252SW5mby5vdXRIZWlnaHR9LjAgfHxcbiAgICAgICAgICAgICAgZnJhY3QoZHlSKSA+IDAuMCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGludCBpZHlSID0gaW50KGR5Uik7XG5cbiAgICAgICAgICAgIGludCB3UlBlcm0gPSAke2ZpbHRlckhlaWdodH0gLSAxIC0gd1I7XG5cbiAgICAgICAgICAgIGZvciAoaW50IHdDID0gMDsgd0MgPCAke2ZpbHRlcldpZHRofTsgd0MrKykge1xuICAgICAgICAgICAgICBmbG9hdCBkeUMgPSBmbG9hdChkeUNDb3JuZXIgKyB3QykgLyAke3N0cmlkZVdpZHRofS4wO1xuXG4gICAgICAgICAgICAgIGlmIChkeUMgPCAwLjAgfHwgZHlDID49ICR7Y29udkluZm8ub3V0V2lkdGh9LjAgfHxcbiAgICAgICAgICAgICAgICAgIGZyYWN0KGR5QykgPiAwLjApIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpbnQgaWR5QyA9IGludChkeUMpO1xuXG4gICAgICAgICAgICAgIGludCB3Q1Blcm0gPSAke2ZpbHRlcldpZHRofSAtIDEgLSB3QztcblxuICAgICAgICAgICAgICBmb3IgKGludCBkMiA9IDA7IGQyIDwgJHtjb252SW5mby5vdXRDaGFubmVsc307IGQyKyspIHtcbiAgICAgICAgICAgICAgICBmbG9hdCB4VmFsdWUgPSBnZXREeShiYXRjaCwgaWR5RiwgaWR5UiwgaWR5QywgZDIpO1xuICAgICAgICAgICAgICAgIGZsb2F0IHdWYWx1ZSA9IGdldFcod0ZQZXJtLCB3UlBlcm0sIHdDUGVybSwgZDEsIGQyKTtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9IHhWYWx1ZSAqIHdWYWx1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQoZG90UHJvZCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgRGVwdGh3aXNlQ29udjJERGVyRmlsdGVyUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnLCAnZHknXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGNvbnZJbmZvOiBiYWNrZW5kX3V0aWwuQ29udjJESW5mbykge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5maWx0ZXJTaGFwZTtcblxuICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICAgIGNvbnN0IHBhZFRvcCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IHBhZExlZnQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgY29uc3QgY2hhbm5lbE11bCA9IGNvbnZJbmZvLm91dENoYW5uZWxzIC8gY29udkluZm8uaW5DaGFubmVscztcblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgd1IgPSBjb29yZHMueDtcbiAgICAgICAgaW50IHdDID0gY29vcmRzLnk7XG4gICAgICAgIGludCBkMSA9IGNvb3Jkcy56O1xuICAgICAgICBpbnQgZG0gPSBjb29yZHMudztcbiAgICAgICAgaW50IGQyID0gZDEgKiAke2NoYW5uZWxNdWx9ICsgZG07XG5cbiAgICAgICAgZmxvYXQgZG90UHJvZCA9IDAuMDtcblxuICAgICAgICAvLyBUTyBETzogVmVjNCBvdmVyIHRoZSBiYXRjaCBzaXplXG4gICAgICAgIGZvciAoaW50IGIgPSAwOyBiIDwgJHtjb252SW5mby5iYXRjaFNpemV9OyBiKyspIHtcbiAgICAgICAgICBmb3IgKGludCB5UiA9IDA7IHlSIDwgJHtjb252SW5mby5vdXRIZWlnaHR9OyB5UisrKSB7XG4gICAgICAgICAgICBpbnQgeFIgPSB3UiArIHlSICogJHtzdHJpZGVIZWlnaHR9IC0gJHtwYWRUb3B9O1xuXG4gICAgICAgICAgICBpZiAoeFIgPCAwIHx8IHhSID49ICR7Y29udkluZm8uaW5IZWlnaHR9KSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGludCB5QyA9IDA7IHlDIDwgJHtjb252SW5mby5vdXRXaWR0aH07IHlDKyspIHtcbiAgICAgICAgICAgICAgaW50IHhDID0gd0MgKyB5QyAqICR7c3RyaWRlV2lkdGh9IC0gJHtwYWRMZWZ0fTtcblxuICAgICAgICAgICAgICBpZiAoeEMgPCAwIHx8IHhDID49ICR7Y29udkluZm8uaW5XaWR0aH0pIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGZsb2F0IGR5VmFsdWUgPSBnZXREeShiLCB5UiwgeUMsIGQyKTtcbiAgICAgICAgICAgICAgZmxvYXQgeFZhbHVlID0gZ2V0WChiLCB4UiwgeEMsIGQxKTtcbiAgICAgICAgICAgICAgZG90UHJvZCArPSAoeFZhbHVlICogZHlWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNldE91dHB1dChkb3RQcm9kKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEZXB0aHdpc2VDb252MkREZXJJbnB1dFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydkeScsICdXJ107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihjb252SW5mbzogYmFja2VuZF91dGlsLkNvbnYyREluZm8pIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gY29udkluZm8uaW5TaGFwZTtcblxuICAgIGNvbnN0IGZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmZpbHRlckhlaWdodDtcbiAgICBjb25zdCBmaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmZpbHRlcldpZHRoO1xuICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuXG4gICAgY29uc3QgcGFkVG9wID0gZmlsdGVySGVpZ2h0IC0gMSAtIGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IHBhZExlZnQgPSBmaWx0ZXJXaWR0aCAtIDEgLSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgY29uc3QgY2hhbm5lbE11bCA9IGNvbnZJbmZvLm91dENoYW5uZWxzIC8gY29udkluZm8uaW5DaGFubmVscztcblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCBpdmVjMiBwYWRzID0gaXZlYzIoJHtwYWRUb3B9LCAke3BhZExlZnR9KTtcblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgZDEgPSBjb29yZHNbM107XG4gICAgICAgIGl2ZWMyIGR5Q29ybmVyID0gY29vcmRzLnl6IC0gcGFkcztcbiAgICAgICAgaW50IGR5UkNvcm5lciA9IGR5Q29ybmVyLng7XG4gICAgICAgIGludCBkeUNDb3JuZXIgPSBkeUNvcm5lci55O1xuXG4gICAgICAgIGZsb2F0IGRvdFByb2QgPSAwLjA7XG5cbiAgICAgICAgZm9yIChpbnQgd1IgPSAwOyB3UiA8ICR7ZmlsdGVySGVpZ2h0fTsgd1IrKykge1xuICAgICAgICAgIGZsb2F0IGR5UiA9IGZsb2F0KGR5UkNvcm5lciArIHdSKSAvICR7c3RyaWRlSGVpZ2h0fS4wO1xuXG4gICAgICAgICAgaWYgKGR5UiA8IDAuMCB8fCBkeVIgPj0gJHtjb252SW5mby5vdXRIZWlnaHR9LjAgfHwgZnJhY3QoZHlSKSA+IDAuMCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGludCBpZHlSID0gaW50KGR5Uik7XG5cbiAgICAgICAgICBpbnQgd1JQZXJtID0gJHtmaWx0ZXJIZWlnaHR9IC0gMSAtIHdSO1xuXG4gICAgICAgICAgZm9yIChpbnQgd0MgPSAwOyB3QyA8ICR7ZmlsdGVyV2lkdGh9OyB3QysrKSB7XG4gICAgICAgICAgICBmbG9hdCBkeUMgPSBmbG9hdChkeUNDb3JuZXIgKyB3QykgLyAke3N0cmlkZVdpZHRofS4wO1xuXG4gICAgICAgICAgICBpZiAoZHlDIDwgMC4wIHx8IGR5QyA+PSAke2NvbnZJbmZvLm91dFdpZHRofS4wIHx8XG4gICAgICAgICAgICAgICAgZnJhY3QoZHlDKSA+IDAuMCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGludCBpZHlDID0gaW50KGR5Qyk7XG5cbiAgICAgICAgICAgIGludCB3Q1Blcm0gPSAke2ZpbHRlcldpZHRofSAtIDEgLSB3QztcblxuICAgICAgICAgICAgLy8gVE8gRE86IFZlYzQgb3ZlciB0aGUgY2hhbm5lbE11bFxuICAgICAgICAgICAgZm9yIChpbnQgZG0gPSAwOyBkbSA8ICR7Y2hhbm5lbE11bH07IGRtKyspIHtcbiAgICAgICAgICAgICAgaW50IGQyID0gZDEgKiAke2NoYW5uZWxNdWx9ICsgZG07XG4gICAgICAgICAgICAgIGZsb2F0IHhWYWx1ZSA9IGdldER5KGJhdGNoLCBpZHlSLCBpZHlDLCBkMik7XG4gICAgICAgICAgICAgIGZsb2F0IHdWYWx1ZSA9IGdldFcod1JQZXJtLCB3Q1Blcm0sIGQxLCBkbSk7XG4gICAgICAgICAgICAgIGRvdFByb2QgKz0geFZhbHVlICogd1ZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQoZG90UHJvZCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgQ29udjJEUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnLCAnVyddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBjb252SW5mbzogYmFja2VuZF91dGlsLkNvbnYyREluZm8sIGFkZEJpYXMgPSBmYWxzZSxcbiAgICAgIGFjdGl2YXRpb246IHN0cmluZyA9IG51bGwsIGhhc1ByZWx1QWN0aXZhdGlvbldlaWdodHMgPSBmYWxzZSxcbiAgICAgIGhhc0xlYWt5cmVsdUFscGhhID0gZmFsc2UpIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gY29udkluZm8ub3V0U2hhcGU7XG4gICAgY29uc3QgcGFkVG9wID0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgcGFkTGVmdCA9IGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICAgIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICAgIGNvbnN0IGZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmZpbHRlckhlaWdodDtcbiAgICBjb25zdCBmaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmZpbHRlcldpZHRoO1xuXG4gICAgY29uc3QgaW5wdXREZXB0aE5lYXJlc3RWZWM0ID0gTWF0aC5mbG9vcihjb252SW5mby5pbkNoYW5uZWxzIC8gNCkgKiA0O1xuICAgIGNvbnN0IGlucHV0RGVwdGhWZWM0UmVtYWluZGVyID0gY29udkluZm8uaW5DaGFubmVscyAlIDQ7XG4gICAgY29uc3QgaXNDaGFubmVsc0xhc3QgPSBjb252SW5mby5kYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNMYXN0JztcblxuICAgIGNvbnN0IHJvd0RpbSA9IGlzQ2hhbm5lbHNMYXN0ID8gMSA6IDI7XG4gICAgY29uc3QgY29sRGltID0gaXNDaGFubmVsc0xhc3QgPyAyIDogMztcbiAgICBjb25zdCBjaGFubmVsRGltID0gaXNDaGFubmVsc0xhc3QgPyAzIDogMTtcblxuICAgIGxldCBhY3RpdmF0aW9uU25pcHBldCA9ICcnLCBhcHBseUFjdGl2YXRpb25TbmlwcGV0ID0gJyc7XG4gICAgaWYgKGFjdGl2YXRpb24pIHtcbiAgICAgIGlmIChoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzKSB7XG4gICAgICAgIGFjdGl2YXRpb25TbmlwcGV0ID0gYGZsb2F0IGFjdGl2YXRpb24oZmxvYXQgYSkge1xuICAgICAgICAgIGZsb2F0IGIgPSBnZXRQcmVsdUFjdGl2YXRpb25XZWlnaHRzQXRPdXRDb29yZHMoKTtcbiAgICAgICAgICAke2FjdGl2YXRpb259XG4gICAgICAgIH1gO1xuICAgICAgfSBlbHNlIGlmIChoYXNMZWFreXJlbHVBbHBoYSkge1xuICAgICAgICBhY3RpdmF0aW9uU25pcHBldCA9IGBmbG9hdCBhY3RpdmF0aW9uKGZsb2F0IGEpIHtcbiAgICAgICAgICBmbG9hdCBiID0gZ2V0TGVha3lyZWx1QWxwaGFBdE91dENvb3JkcygpO1xuICAgICAgICAgICR7YWN0aXZhdGlvbn1cbiAgICAgICAgfWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhY3RpdmF0aW9uU25pcHBldCA9IGBcbiAgICAgICAgICBmbG9hdCBhY3RpdmF0aW9uKGZsb2F0IHgpIHtcbiAgICAgICAgICAgICR7YWN0aXZhdGlvbn1cbiAgICAgICAgICB9XG4gICAgICAgIGA7XG4gICAgICB9XG5cbiAgICAgIGFwcGx5QWN0aXZhdGlvblNuaXBwZXQgPSBgcmVzdWx0ID0gYWN0aXZhdGlvbihyZXN1bHQpO2A7XG4gICAgfVxuXG4gICAgY29uc3QgYWRkQmlhc1NuaXBwZXQgPSBhZGRCaWFzID8gJ3Jlc3VsdCArPSBnZXRCaWFzQXRPdXRDb29yZHMoKTsnIDogJyc7XG4gICAgaWYgKGFkZEJpYXMpIHtcbiAgICAgIHRoaXMudmFyaWFibGVOYW1lcy5wdXNoKCdiaWFzJyk7XG4gICAgfVxuXG4gICAgaWYgKGhhc1ByZWx1QWN0aXZhdGlvbldlaWdodHMpIHtcbiAgICAgIHRoaXMudmFyaWFibGVOYW1lcy5wdXNoKCdwcmVsdUFjdGl2YXRpb25XZWlnaHRzJyk7XG4gICAgfVxuXG4gICAgaWYgKGhhc0xlYWt5cmVsdUFscGhhKSB7XG4gICAgICB0aGlzLnZhcmlhYmxlTmFtZXMucHVzaCgnbGVha3lyZWx1QWxwaGEnKTtcbiAgICB9XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgJHthY3RpdmF0aW9uU25pcHBldH1cblxuICAgICAgY29uc3QgaXZlYzIgc3RyaWRlcyA9IGl2ZWMyKCR7c3RyaWRlSGVpZ2h0fSwgJHtzdHJpZGVXaWR0aH0pO1xuICAgICAgY29uc3QgaXZlYzIgcGFkcyA9IGl2ZWMyKCR7cGFkVG9wfSwgJHtwYWRMZWZ0fSk7XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiYXRjaCA9IGNvb3Jkc1swXTtcbiAgICAgICAgaW50IGQyID0gY29vcmRzWyR7Y2hhbm5lbERpbX1dO1xuXG4gICAgICAgIGl2ZWMyIHhSQ0Nvcm5lciA9XG4gICAgICAgICAgICBpdmVjMihjb29yZHNbJHtyb3dEaW19XSwgY29vcmRzWyR7Y29sRGltfV0pICogc3RyaWRlcyAtIHBhZHM7XG4gICAgICAgIGludCB4UkNvcm5lciA9IHhSQ0Nvcm5lci54O1xuICAgICAgICBpbnQgeENDb3JuZXIgPSB4UkNDb3JuZXIueTtcblxuICAgICAgICAvLyBDb252b2x2ZSB4KD8sID8sIGQxKSB3aXRoIHcoOiwgOiwgZDEsIGQyKSB0byBnZXQgeSh5UiwgeUMsIGQyKS5cbiAgICAgICAgLy8gPyA9IHRvIGJlIGRldGVybWluZWQuIDogPSBhY3Jvc3MgYWxsIHZhbHVlcyBpbiB0aGF0IGF4aXMuXG4gICAgICAgIGZsb2F0IGRvdFByb2QgPSAwLjA7XG4gICAgICAgIGZvciAoaW50IHdSID0gMDsgd1IgPCAke2ZpbHRlckhlaWdodH07IHdSKyspIHtcbiAgICAgICAgICBpbnQgeFIgPSB4UkNvcm5lciArIHdSICogJHtkaWxhdGlvbkhlaWdodH07XG5cbiAgICAgICAgICBpZiAoeFIgPCAwIHx8IHhSID49ICR7Y29udkluZm8uaW5IZWlnaHR9KSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKGludCB3QyA9IDA7IHdDIDwgJHtmaWx0ZXJXaWR0aH07IHdDKyspIHtcbiAgICAgICAgICAgIGludCB4QyA9IHhDQ29ybmVyICsgd0MgKiAke2RpbGF0aW9uV2lkdGh9O1xuXG4gICAgICAgICAgICBpZiAoeEMgPCAwIHx8IHhDID49ICR7Y29udkluZm8uaW5XaWR0aH0pIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoaW50IGQxID0gMDsgZDEgPCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH07IGQxICs9IDQpIHtcbiAgICAgICAgICAgICAgdmVjNCB3VmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgICAgICBnZXRXKHdSLCB3QywgZDEsIGQyKSxcbiAgICAgICAgICAgICAgICBnZXRXKHdSLCB3QywgZDEgKyAxLCBkMiksXG4gICAgICAgICAgICAgICAgZ2V0Vyh3Uiwgd0MsIGQxICsgMiwgZDIpLFxuICAgICAgICAgICAgICAgIGdldFcod1IsIHdDLCBkMSArIDMsIGQyKVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIGlmICgke2lzQ2hhbm5lbHNMYXN0fSkge1xuICAgICAgICAgICAgICAgIHZlYzQgeFZhbHVlcyA9IHZlYzQoXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4UiwgeEMsIGQxKSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhSLCB4QywgZDEgKyAxKSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhSLCB4QywgZDEgKyAyKSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhSLCB4QywgZDEgKyAzKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZG90UHJvZCArPSBkb3QoeFZhbHVlcywgd1ZhbHVlcyk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmVjNCB4VmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIGQxLCB4UiwgeEMpLFxuICAgICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgZDEgKyAxLCB4UiwgeEMpLFxuICAgICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgZDEgKyAyLCB4UiwgeEMpLFxuICAgICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgZDEgKyAzLCB4UiwgeEMpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9IGRvdCh4VmFsdWVzLCB3VmFsdWVzKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoJHtpbnB1dERlcHRoVmVjNFJlbWFpbmRlciA9PT0gMX0pIHtcblxuICAgICAgICAgICAgICBpZiAoJHtpc0NoYW5uZWxzTGFzdH0pIHtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9XG4gICAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhSLCB4QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9KSAqXG4gICAgICAgICAgICAgICAgICAgIGdldFcod1IsIHdDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0sIGQyKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9XG4gICAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSwgeFIsIHhDKSAqXG4gICAgICAgICAgICAgICAgICAgIGdldFcod1IsIHdDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0sIGQyKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCR7aW5wdXREZXB0aFZlYzRSZW1haW5kZXIgPT09IDJ9KSB7XG4gICAgICAgICAgICAgIHZlYzIgd1ZhbHVlcyA9IHZlYzIoXG4gICAgICAgICAgICAgICAgZ2V0Vyh3Uiwgd0MsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSwgZDIpLFxuICAgICAgICAgICAgICAgIGdldFcod1IsIHdDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0gKyAxLCBkMilcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICBpZiAoJHtpc0NoYW5uZWxzTGFzdH0pIHtcbiAgICAgICAgICAgICAgICB2ZWMyIHhWYWx1ZXMgPSB2ZWMyKFxuICAgICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgeFIsIHhDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0pLFxuICAgICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgeFIsIHhDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0gKyAxKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZG90UHJvZCArPSBkb3QoeFZhbHVlcywgd1ZhbHVlcyk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmVjMiB4VmFsdWVzID0gdmVjMihcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSwgeFIsIHhDKSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSArIDEsIHhSLCB4QylcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGRvdFByb2QgKz0gZG90KHhWYWx1ZXMsIHdWYWx1ZXMpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoJHtpbnB1dERlcHRoVmVjNFJlbWFpbmRlciA9PT0gM30pIHtcbiAgICAgICAgICAgICAgdmVjMyB3VmFsdWVzID0gdmVjMyhcbiAgICAgICAgICAgICAgICBnZXRXKHdSLCB3QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9LCBkMiksXG4gICAgICAgICAgICAgICAgZ2V0Vyh3Uiwgd0MsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSArIDEsIGQyKSxcbiAgICAgICAgICAgICAgICBnZXRXKHdSLCB3QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9ICsgMiwgZDIpXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgaWYgKCR7aXNDaGFubmVsc0xhc3R9KSB7XG4gICAgICAgICAgICAgICAgdmVjMyB4VmFsdWVzID0gdmVjMyhcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhSLCB4QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9KSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhSLCB4QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9ICsgMSksXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4UiwgeEMsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSArIDIpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9IGRvdCh4VmFsdWVzLCB3VmFsdWVzKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2ZWMzIHhWYWx1ZXMgPSB2ZWMzKFxuICAgICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9LCB4UiwgeEMpLFxuICAgICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9ICsgMSwgeFIsIHhDKSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSArIDIsIHhSLCB4QylcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGRvdFByb2QgKz0gZG90KHhWYWx1ZXMsIHdWYWx1ZXMpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmbG9hdCByZXN1bHQgPSBkb3RQcm9kO1xuICAgICAgICAke2FkZEJpYXNTbmlwcGV0fVxuICAgICAgICAke2FwcGx5QWN0aXZhdGlvblNuaXBwZXR9XG4gICAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbnYzRFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWyd4JywgJ1cnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGNvbnZJbmZvOiBiYWNrZW5kX3V0aWwuQ29udjNESW5mbykge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5vdXRTaGFwZTtcbiAgICBjb25zdCBwYWRGcm9udCA9IGNvbnZJbmZvLnBhZEluZm8uZnJvbnQ7XG4gICAgY29uc3QgcGFkVG9wID0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgcGFkTGVmdCA9IGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICBjb25zdCBzdHJpZGVEZXB0aCA9IGNvbnZJbmZvLnN0cmlkZURlcHRoO1xuICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICAgIGNvbnN0IGRpbGF0aW9uRGVwdGggPSBjb252SW5mby5kaWxhdGlvbkRlcHRoO1xuICAgIGNvbnN0IGRpbGF0aW9uSGVpZ2h0ID0gY29udkluZm8uZGlsYXRpb25IZWlnaHQ7XG4gICAgY29uc3QgZGlsYXRpb25XaWR0aCA9IGNvbnZJbmZvLmRpbGF0aW9uV2lkdGg7XG4gICAgY29uc3QgZmlsdGVyRGVwdGggPSBjb252SW5mby5maWx0ZXJEZXB0aDtcbiAgICBjb25zdCBmaWx0ZXJIZWlnaHQgPSBjb252SW5mby5maWx0ZXJIZWlnaHQ7XG4gICAgY29uc3QgZmlsdGVyV2lkdGggPSBjb252SW5mby5maWx0ZXJXaWR0aDtcblxuICAgIGNvbnN0IGlucHV0RGVwdGhOZWFyZXN0VmVjNCA9IE1hdGguZmxvb3IoY29udkluZm8uaW5DaGFubmVscyAvIDQpICogNDtcbiAgICBjb25zdCBpbnB1dERlcHRoVmVjNFJlbWFpbmRlciA9IGNvbnZJbmZvLmluQ2hhbm5lbHMgJSA0O1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IGl2ZWMzIHN0cmlkZXMgPSBpdmVjMygke3N0cmlkZURlcHRofSwgJHtzdHJpZGVIZWlnaHR9LCAke1xuICAgICAgICBzdHJpZGVXaWR0aH0pO1xuICAgICAgY29uc3QgaXZlYzMgcGFkcyA9IGl2ZWMzKCR7cGFkRnJvbnR9LCAke3BhZFRvcH0sICR7cGFkTGVmdH0pO1xuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM1IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHMueDtcbiAgICAgICAgaW50IGQyID0gY29vcmRzLnU7XG5cbiAgICAgICAgaXZlYzMgeEZSQ0Nvcm5lciA9IGl2ZWMzKGNvb3Jkcy55LCBjb29yZHMueiwgY29vcmRzLncpICogc3RyaWRlcyAtIHBhZHM7XG4gICAgICAgIGludCB4RkNvcm5lciA9IHhGUkNDb3JuZXIueDtcbiAgICAgICAgaW50IHhSQ29ybmVyID0geEZSQ0Nvcm5lci55O1xuICAgICAgICBpbnQgeENDb3JuZXIgPSB4RlJDQ29ybmVyLno7XG5cbiAgICAgICAgLy8gQ29udm9sdmUgeCg/LCA/LCA/LCBkMSkgd2l0aCB3KDosIDosIDosIGQxLCBkMikgdG8gZ2V0XG4gICAgICAgIC8vIHkoeUYsIHlSLCB5QywgZDIpLiA/ID0gdG8gYmUgZGV0ZXJtaW5lZC4gOiA9IGFjcm9zcyBhbGxcbiAgICAgICAgLy8gdmFsdWVzIGluIHRoYXQgYXhpcy5cbiAgICAgICAgZmxvYXQgZG90UHJvZCA9IDAuMDtcbiAgICAgICAgZm9yIChpbnQgd0YgPSAwOyB3RiA8ICR7ZmlsdGVyRGVwdGh9OyB3RisrKSB7XG4gICAgICAgICAgaW50IHhGID0geEZDb3JuZXIgKyB3RiAqICR7ZGlsYXRpb25EZXB0aH07XG5cbiAgICAgICAgICBpZiAoeEYgPCAwIHx8IHhGID49ICR7Y29udkluZm8uaW5EZXB0aH0pIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAoaW50IHdSID0gMDsgd1IgPCAke2ZpbHRlckhlaWdodH07IHdSKyspIHtcbiAgICAgICAgICAgIGludCB4UiA9IHhSQ29ybmVyICsgd1IgKiAke2RpbGF0aW9uSGVpZ2h0fTtcblxuICAgICAgICAgICAgaWYgKHhSIDwgMCB8fCB4UiA+PSAke2NvbnZJbmZvLmluSGVpZ2h0fSkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChpbnQgd0MgPSAwOyB3QyA8ICR7ZmlsdGVyV2lkdGh9OyB3QysrKSB7XG4gICAgICAgICAgICAgIGludCB4QyA9IHhDQ29ybmVyICsgd0MgKiAke2RpbGF0aW9uV2lkdGh9O1xuXG4gICAgICAgICAgICAgIGlmICh4QyA8IDAgfHwgeEMgPj0gJHtjb252SW5mby5pbldpZHRofSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZm9yIChpbnQgZDEgPSAwOyBkMSA8ICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fTsgZDEgKz0gNCkge1xuICAgICAgICAgICAgICAgIHZlYzQgeFZhbHVlcyA9IHZlYzQoXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4RiwgeFIsIHhDLCBkMSksXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4RiwgeFIsIHhDLCBkMSArIDEpLFxuICAgICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgeEYsIHhSLCB4QywgZDEgKyAyKSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhGLCB4UiwgeEMsIGQxICsgMylcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHZlYzQgd1ZhbHVlcyA9IHZlYzQoXG4gICAgICAgICAgICAgICAgICBnZXRXKHdGLCB3Uiwgd0MsIGQxLCBkMiksXG4gICAgICAgICAgICAgICAgICBnZXRXKHdGLCB3Uiwgd0MsIGQxICsgMSwgZDIpLFxuICAgICAgICAgICAgICAgICAgZ2V0Vyh3Riwgd1IsIHdDLCBkMSArIDIsIGQyKSxcbiAgICAgICAgICAgICAgICAgIGdldFcod0YsIHdSLCB3QywgZDEgKyAzLCBkMilcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgZG90UHJvZCArPSBkb3QoeFZhbHVlcywgd1ZhbHVlcyk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoJHtpbnB1dERlcHRoVmVjNFJlbWFpbmRlciA9PT0gMX0pIHtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9XG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4RiwgeFIsIHhDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0pICpcbiAgICAgICAgICAgICAgICAgIGdldFcod0YsIHdSLCB3QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9LCBkMik7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoJHtpbnB1dERlcHRoVmVjNFJlbWFpbmRlciA9PT0gMn0pIHtcbiAgICAgICAgICAgICAgICB2ZWMyIHhWYWx1ZXMgPSB2ZWMyKFxuICAgICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgeEYsIHhSLCB4QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9KSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhGLCB4UiwgeEMsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSArIDEpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB2ZWMyIHdWYWx1ZXMgPSB2ZWMyKFxuICAgICAgICAgICAgICAgICAgZ2V0Vyh3Riwgd1IsIHdDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0sIGQyKSxcbiAgICAgICAgICAgICAgICAgIGdldFcod0YsIHdSLCB3QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9ICsgMSwgZDIpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9IGRvdCh4VmFsdWVzLCB3VmFsdWVzKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICgke2lucHV0RGVwdGhWZWM0UmVtYWluZGVyID09PSAzfSkge1xuICAgICAgICAgICAgICAgIHZlYzMgeFZhbHVlcyA9IHZlYzMoXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4RiwgeFIsIHhDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0pLFxuICAgICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgeEYsIHhSLCB4QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9ICsgMSksXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4RiwgeFIsIHhDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0gKyAyKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdmVjMyB3VmFsdWVzID0gdmVjMyhcbiAgICAgICAgICAgICAgICAgIGdldFcod0YsIHdSLCB3QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9LCBkMiksXG4gICAgICAgICAgICAgICAgICBnZXRXKHdGLCB3Uiwgd0MsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSArIDEsIGQyKSxcbiAgICAgICAgICAgICAgICAgIGdldFcod0YsIHdSLCB3QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9ICsgMiwgZDIpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9IGRvdCh4VmFsdWVzLCB3VmFsdWVzKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQoZG90UHJvZCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtLCB1c2VTaGFwZVVuaWZvcm1zfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgRGVwdGh3aXNlQ29udjJEUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnLCAnVyddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW47XG4gIGN1c3RvbVVuaWZvcm1zID0gW1xuICAgIHtuYW1lOiAncGFkcycsIHR5cGU6ICdpdmVjMicgYXMgY29uc3QgfSxcbiAgICB7bmFtZTogJ3N0cmlkZXMnLCB0eXBlOiAnaXZlYzInIGFzIGNvbnN0IH0sXG4gICAge25hbWU6ICdkaWxhdGlvbnMnLCB0eXBlOiAnaXZlYzInIGFzIGNvbnN0IH0sXG4gICAge25hbWU6ICdpbkRpbXMnLCB0eXBlOiAnaXZlYzInIGFzIGNvbnN0IH0sXG4gIF07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBjb252SW5mbzogYmFja2VuZF91dGlsLkNvbnYyREluZm8sIGFkZEJpYXMgPSBmYWxzZSxcbiAgICAgIGFjdGl2YXRpb246IHN0cmluZyA9IG51bGwsIGhhc1ByZWx1QWN0aXZhdGlvbiA9IGZhbHNlLFxuICAgICAgaGFzTGVha3lSZWx1QWxwaGEgPSBmYWxzZSkge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5vdXRTaGFwZTtcbiAgICB0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMgPSB1c2VTaGFwZVVuaWZvcm1zKHRoaXMub3V0cHV0U2hhcGUubGVuZ3RoKTtcblxuICAgIGNvbnN0IGZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmZpbHRlckhlaWdodDtcbiAgICBjb25zdCBmaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmZpbHRlcldpZHRoO1xuICAgIGNvbnN0IGNoYW5uZWxNdWwgPSBjb252SW5mby5vdXRDaGFubmVscyAvIGNvbnZJbmZvLmluQ2hhbm5lbHM7XG5cbiAgICBsZXQgYWN0aXZhdGlvblNuaXBwZXQgPSAnJywgYXBwbHlBY3RpdmF0aW9uU25pcHBldCA9ICcnO1xuICAgIGlmIChhY3RpdmF0aW9uKSB7XG4gICAgICBpZiAoaGFzUHJlbHVBY3RpdmF0aW9uKSB7XG4gICAgICAgIGFjdGl2YXRpb25TbmlwcGV0ID0gYGZsb2F0IGFjdGl2YXRpb24oZmxvYXQgYSkge1xuICAgICAgICAgIGZsb2F0IGIgPSBnZXRQcmVsdUFjdGl2YXRpb25XZWlnaHRzQXRPdXRDb29yZHMoKTtcbiAgICAgICAgICAke2FjdGl2YXRpb259XG4gICAgICAgIH1gO1xuICAgICAgfSBlbHNlIGlmIChoYXNMZWFreVJlbHVBbHBoYSkge1xuICAgICAgICBhY3RpdmF0aW9uU25pcHBldCA9IGBmbG9hdCBhY3RpdmF0aW9uKGZsb2F0IGEpIHtcbiAgICAgICAgICBmbG9hdCBiID0gZ2V0TGVha3lyZWx1QWxwaGFBdE91dENvb3JkcygpO1xuICAgICAgICAgICR7YWN0aXZhdGlvbn1cbiAgICAgICAgfWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhY3RpdmF0aW9uU25pcHBldCA9IGBcbiAgICAgICAgICBmbG9hdCBhY3RpdmF0aW9uKGZsb2F0IHgpIHtcbiAgICAgICAgICAgICR7YWN0aXZhdGlvbn1cbiAgICAgICAgICB9XG4gICAgICAgIGA7XG4gICAgICB9XG5cbiAgICAgIGFwcGx5QWN0aXZhdGlvblNuaXBwZXQgPSBgcmVzdWx0ID0gYWN0aXZhdGlvbihyZXN1bHQpO2A7XG4gICAgfVxuXG4gICAgY29uc3QgYWRkQmlhc1NuaXBwZXQgPSBhZGRCaWFzID8gJ3Jlc3VsdCArPSBnZXRCaWFzQXRPdXRDb29yZHMoKTsnIDogJyc7XG4gICAgaWYgKGFkZEJpYXMpIHtcbiAgICAgIHRoaXMudmFyaWFibGVOYW1lcy5wdXNoKCdiaWFzJyk7XG4gICAgfVxuXG4gICAgaWYgKGhhc1ByZWx1QWN0aXZhdGlvbikge1xuICAgICAgdGhpcy52YXJpYWJsZU5hbWVzLnB1c2goJ3ByZWx1QWN0aXZhdGlvbldlaWdodHMnKTtcbiAgICB9XG4gICAgaWYgKGhhc0xlYWt5UmVsdUFscGhhKSB7XG4gICAgICB0aGlzLnZhcmlhYmxlTmFtZXMucHVzaCgnbGVha3lyZWx1QWxwaGEnKTtcbiAgICB9XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgJHthY3RpdmF0aW9uU25pcHBldH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzLng7XG4gICAgICAgIGl2ZWMyIHhSQ0Nvcm5lciA9IGNvb3Jkcy55eiAqIHN0cmlkZXMgLSBwYWRzO1xuICAgICAgICBpbnQgZDIgPSBjb29yZHMudztcbiAgICAgICAgaW50IGQxID0gZDIgLyAke2NoYW5uZWxNdWx9O1xuICAgICAgICBpbnQgcSA9IGQyIC0gZDEgKiAke2NoYW5uZWxNdWx9O1xuXG4gICAgICAgIGludCB4UkNvcm5lciA9IHhSQ0Nvcm5lci54O1xuICAgICAgICBpbnQgeENDb3JuZXIgPSB4UkNDb3JuZXIueTtcblxuICAgICAgICAvLyBDb252b2x2ZSB4KD8sID8sIGQxKSB3aXRoIHcoOiwgOiwgZDEsIHEpIHRvIGdldCB5KHlSLCB5QywgZDIpLlxuICAgICAgICAvLyA/ID0gdG8gYmUgZGV0ZXJtaW5lZC4gOiA9IGFjcm9zcyBhbGwgdmFsdWVzIGluIHRoYXQgYXhpcy5cbiAgICAgICAgZmxvYXQgZG90UHJvZCA9IDAuMDtcbiAgICAgICAgLy8gVE8gRE8oZHNtaWxrb3YpOiBGbGF0dGVuIHRoZSB0d28gZm9yIGxvb3BzIGFuZCB2ZWM0IHRoZSBvcGVyYXRpb25zLlxuICAgICAgICBmb3IgKGludCB3UiA9IDA7IHdSIDwgJHtmaWx0ZXJIZWlnaHR9OyB3UisrKSB7XG4gICAgICAgICAgaW50IHhSID0geFJDb3JuZXIgKyB3UiAqIGRpbGF0aW9uc1swXTtcblxuICAgICAgICAgIGlmICh4UiA8IDAgfHwgeFIgPj0gaW5EaW1zWzBdKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKGludCB3QyA9IDA7IHdDIDwgJHtmaWx0ZXJXaWR0aH07IHdDKyspIHtcbiAgICAgICAgICAgIGludCB4QyA9IHhDQ29ybmVyICsgd0MgKiBkaWxhdGlvbnNbMV07XG5cbiAgICAgICAgICAgIGlmICh4QyA8IDAgfHwgeEMgPj0gaW5EaW1zWzFdKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmbG9hdCB4VmFsID0gZ2V0WChiYXRjaCwgeFIsIHhDLCBkMSk7XG4gICAgICAgICAgICBmbG9hdCB3VmFsID0gZ2V0Vyh3Uiwgd0MsIGQxLCBxKTtcbiAgICAgICAgICAgIGRvdFByb2QgKz0geFZhbCAqIHdWYWw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZmxvYXQgcmVzdWx0ID0gZG90UHJvZDtcbiAgICAgICAgJHthZGRCaWFzU25pcHBldH1cbiAgICAgICAgJHthcHBseUFjdGl2YXRpb25TbmlwcGV0fVxuICAgICAgICBzZXRPdXRwdXQocmVzdWx0KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbSwgdXNlU2hhcGVVbmlmb3Jtc30gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIERlcHRod2lzZUNvbnZQYWNrZWQyRFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWyd4JywgJ1cnXTtcbiAgcGFja2VkSW5wdXRzID0gdHJ1ZTtcbiAgcGFja2VkT3V0cHV0ID0gdHJ1ZTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBlbmFibGVTaGFwZVVuaWZvcm1zOiBib29sZWFuO1xuICBjdXN0b21Vbmlmb3JtcyA9IFtcbiAgICB7bmFtZTogJ3BhZHMnLCB0eXBlOiAnaXZlYzInIGFzIGNvbnN0IH0sXG4gICAge25hbWU6ICdzdHJpZGVzJywgdHlwZTogJ2l2ZWMyJyBhcyBjb25zdCB9LFxuICAgIHtuYW1lOiAnZGlsYXRpb25zJywgdHlwZTogJ2l2ZWMyJyBhcyBjb25zdCB9LFxuICAgIHtuYW1lOiAnaW5EaW1zJywgdHlwZTogJ2l2ZWMyJyBhcyBjb25zdCB9LFxuICBdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgY29udkluZm86IGJhY2tlbmRfdXRpbC5Db252MkRJbmZvLCBhZGRCaWFzID0gZmFsc2UsXG4gICAgICBhY3RpdmF0aW9uOiBzdHJpbmcgPSBudWxsLCBoYXNQcmVsdUFjdGl2YXRpb24gPSBmYWxzZSxcbiAgICAgIGhhc0xlYWt5UmVsdUFscGhhID0gZmFsc2UpIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gY29udkluZm8ub3V0U2hhcGU7XG4gICAgdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID0gdXNlU2hhcGVVbmlmb3Jtcyh0aGlzLm91dHB1dFNoYXBlLmxlbmd0aCk7XG4gICAgY29uc3QgY2hhbm5lbE11bCA9IGNvbnZJbmZvLm91dENoYW5uZWxzIC8gY29udkluZm8uaW5DaGFubmVscztcbiAgICBjb25zdCBwYWRMZWZ0ID0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgY29uc3QgZGlsYXRpb25XaWR0aCA9IGNvbnZJbmZvLmRpbGF0aW9uV2lkdGg7XG4gICAgY29uc3QgZmlsdGVySGVpZ2h0ID0gY29udkluZm8uZmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG4gICAgY29uc3QgdGV4ZWxzQWNyb3NzID0gZmlsdGVyV2lkdGg7XG5cbiAgICBsZXQgbWFpbkxvb3AgPSBgXG4gICAgICBpbnQgeFI7IGludCB4QzsgaW50IHhDT2Zmc2V0O1xuICAgICAgdmVjNCB3VGV4ZWw7IHZlYzQgcHJldmlvdXM7IHZlYzQgZmluYWw7YDtcblxuICAgIGZvciAobGV0IGMgPSAwOyBjIDwgZmlsdGVyV2lkdGg7IGMrKykge1xuICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgIHZlYzQgeFRleGVsQyR7YyAqIDJ9O1xuICAgICAgICAgIGludCB4VGV4ZWxDJHtjICogMn1SZWFkeTtcbiAgICAgICAgICB2ZWM0IHhUZXhlbEMke2MgKiAyICsgMX07XG4gICAgICAgICAgaW50IHhUZXhlbEMke2MgKiAyICsgMX1SZWFkeTtcbiAgICAgICAgICB2ZWM0IHhDJHtjfTtgO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgdmVjdG9yaXplZCBpbXBsZW1lbnRhdGlvbiB3b3JrcyBieSBnYXRoZXJpbmcgdGhlIHZhbHVlcyBuZWVkZWQgZm9yXG4gICAgICogZWFjaCBvdXRwdXQgY2hhbm5lbCdzIGRvdCBwcm9kdWN0IGludG8gdmVjNCdzIGFuZCB0aGVuIG11bHRpcGx5aW5nIHRoZW1cbiAgICAgKiBhbGwgdG9nZXRoZXIgKHRoaXMgaGFwcGVucyBpbiB0aGUgZmluYWwgZG91YmxlIGZvci1sb29wIGJlbG93KS4gTW9zdCBvZlxuICAgICAqIHRoZSBtYWluIGxvb3AgY29uc2lzdHMgb2YgY29uc3RydWN0aW5nIHRoZXNlIHZlYzQncyB3aXRoIHRoZSBtaW5pbXVtXG4gICAgICogbnVtYmVyIG9mIHRleHR1cmUyRCBjYWxscywgd2hpY2ggbWVhbnMgbWFraW5nIHVzZSBvZiBhbGwgZm91ciByZXR1cm5lZFxuICAgICAqIHZhbHVlcyBmcm9tIGEgdGV4dHVyZTJEIGNhbGwgYXQgb25jZS5cbiAgICAgKi9cbiAgICBmb3IgKGxldCByID0gMDsgciA8IGZpbHRlckhlaWdodDsgcisrKSB7XG4gICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGZpbHRlcldpZHRoOyBjKyspIHtcbiAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgIHhUZXhlbEMke2MgKiAyfSA9IHZlYzQoMC4wKTtcbiAgICAgICAgICB4VGV4ZWxDJHtjICogMn1SZWFkeSA9IDA7XG4gICAgICAgICAgeFRleGVsQyR7YyAqIDIgKyAxfSA9IHZlYzQoMC4wKTtcbiAgICAgICAgICB4VGV4ZWxDJHtjICogMiArIDF9UmVhZHkgPSAwO1xuICAgICAgICAgIHhDJHtjfSA9IHZlYzQoMC4wKTtgO1xuICAgICAgfVxuICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICB4UiA9IHhSQ29ybmVyICsgJHtyfSAqIGRpbGF0aW9uc1swXTtcbiAgICAgICAgaWYgKHhSID49MCAmJiB4UiA8IGluRGltc1swXSkge1xuICAgICAgYDtcblxuICAgICAgZm9yIChsZXQgdGV4ZWxDID0gMDsgdGV4ZWxDIDwgKHRleGVsc0Fjcm9zcyArIDEpIC8gMjsgdGV4ZWxDKyspIHtcbiAgICAgICAgY29uc3QgY29sSW5kZXggPSB0ZXhlbEMgKiAyO1xuXG4gICAgICAgIG1haW5Mb29wICs9IGBcbiAgICAgICAgICB4QyA9IHhDQ29ybmVyICsgJHtjb2xJbmRleCAqIGRpbGF0aW9uV2lkdGh9O1xuICAgICAgICAgIGA7XG5cbiAgICAgICAgaWYgKHN0cmlkZVdpZHRoID09PSAxKSB7XG4gICAgICAgICAgaWYgKGNvbEluZGV4IDwgZmlsdGVyV2lkdGgpIHtcbiAgICAgICAgICAgIC8vIElmIHBhZGRpbmcgaXMgb2RkLCB0aGUgb3V0ZXIgdGV4ZWxzIGhhdmUgdG8gYmUgY29tcG9zZWQuXG4gICAgICAgICAgICBpZiAocGFkTGVmdCAlIDIgPT09IDEpIHtcbiAgICAgICAgICAgICAgLy8gVE9ETzogRW5zdXJlIHZlYzQgcHJldmlvdXMgZG9lcyBub3QgcmVzdWx0IGluIHJlZHVuZGFudCBzYW1wbGUsXG4gICAgICAgICAgICAgIC8vIGFuZCBhdm9pZCBzZXR0aW5nIHhUZXhlbFJDJ3MgdGhhdCBleGNlZWQgdGhlIGJvdW5kYXJ5IGluIHRoZVxuICAgICAgICAgICAgICAvLyBmaXJzdCBwbGFjZSByYXRoZXIgdGhhbiByZXNldHRpbmcgdGhlbSB0byB2ZWM0KDApKS5cblxuICAgICAgICAgICAgICAvLyBUbyBjb21wdXRlIHhDT2Zmc2V0OlxuICAgICAgICAgICAgICAvLyAtIElmIHBhZGRpbmcgaXMgb2RkLCB3ZSBtdXN0IGFkZCAxIHRvIGVuc3VyZSB3ZSBhc2sgZm9yIGFuXG4gICAgICAgICAgICAgIC8vIGV2ZW4tbnVtYmVyZWQgcm93LlxuICAgICAgICAgICAgICAvLyAtIFdlIHN1YnRyYWN0IDIgdG8gYWNjZXNzIHRoZSBwcmV2aW91cyB0ZXhlbC5cblxuICAgICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgICAgeENPZmZzZXQgPSB4QyArIDE7XG4gICAgICAgICAgICAgICAgaWYgKHhDT2Zmc2V0ID49IDAgJiYgeENPZmZzZXQgPCBpbkRpbXNbMV0gJiYgeFRleGVsQyR7XG4gICAgICAgICAgICAgICAgICBjb2xJbmRleH1SZWFkeSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH0gPSBnZXRYKGJhdGNoLCB4UiwgeENPZmZzZXQsIGQxKTtcblxuICAgICAgICAgICAgICAgICAgLy8gTmVlZCB0byBtYW51YWxseSBjbGVhciB1bnVzZWQgY2hhbm5lbHMgaW4gY2FzZVxuICAgICAgICAgICAgICAgICAgLy8gd2UncmUgcmVhZGluZyBmcm9tIHJlY3ljbGVkIHRleHR1cmUuXG4gICAgICAgICAgICAgICAgICBpZiAoeENPZmZzZXQgKyAxID49IGluRGltc1sxXSkge1xuICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH0uencgPSB2ZWMyKDAuMCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH1SZWFkeSA9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgICAvLyBUaGlzIHRleGVsIGhhcyBiZWVuIHJlYWQgaW4gcHJldmlvdXMgaXRlcmF0aW9uIGlmIHRoZSBkaWxhdGlvblxuICAgICAgICAgICAgICAvLyBpcyAxLlxuICAgICAgICAgICAgICBpZiAoZGlsYXRpb25XaWR0aCA9PT0gMSAmJiBjb2xJbmRleCA+IDApIHtcbiAgICAgICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgICAgeEMke2NvbEluZGV4fSA9IHZlYzQoeFRleGVsQyR7Y29sSW5kZXggLSAyfS56dywgeFRleGVsQyR7XG4gICAgICAgICAgICAgICAgICAgIGNvbEluZGV4fS54eSk7XG4gICAgICAgICAgICAgICAgYDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgICAgICB4Q09mZnNldCA9IHhDICsgMSAtIDI7XG5cbiAgICAgICAgICAgICAgICAgIGlmICh4Q09mZnNldCA+PSAwICYmIHhDT2Zmc2V0IDwgaW5EaW1zWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgIHByZXZpb3VzID0gZ2V0WChiYXRjaCwgeFIsIHhDT2Zmc2V0LCBkMSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gTmVlZCB0byBtYW51YWxseSBjbGVhciB1bnVzZWQgY2hhbm5lbHMgaW4gY2FzZVxuICAgICAgICAgICAgICAgICAgICAvLyB3ZSdyZSByZWFkaW5nIGZyb20gcmVjeWNsZWQgdGV4dHVyZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHhDT2Zmc2V0ICsgMSA+PSBpbkRpbXNbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91cy56dyA9IHZlYzIoMC4wKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHhDJHtjb2xJbmRleH0gPSB2ZWM0KHByZXZpb3VzLnp3LCB4VGV4ZWxDJHtjb2xJbmRleH0ueHkpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgeEMke2NvbEluZGV4fSA9IHZlYzQoMC4wLCAwLjAsIHhUZXhlbEMke2NvbEluZGV4fS54eSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBQYWRkaW5nIGlzIGV2ZW4sIHNvIHhSQyBjb3JyZXNwb25kcyB0byBhIHNpbmdsZSB0ZXhlbC5cbiAgICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICAgIGlmICh4QyA+PSAwICYmIHhDIDwgaW5EaW1zWzFdICYmIHhUZXhlbEMke2NvbEluZGV4fVJlYWR5ID09IDApIHtcbiAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4fSA9IGdldFgoYmF0Y2gsIHhSLCB4QywgZDEpO1xuICAgICAgICAgICAgICAgICAgaWYgKHhDICsgMSA+PSBpbkRpbXNbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXh9Lnp3ID0gdmVjMigwLjApO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXh9UmVhZHkgPSAxO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHhDJHtjb2xJbmRleH0gPSB4VGV4ZWxDJHtjb2xJbmRleH07XG4gICAgICAgICAgICAgICAgYDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbEluZGV4ICsgMSA8IGZpbHRlcldpZHRoKSB7XG4gICAgICAgICAgICAgIC8vIElmIGRpbGF0aW9uIGlzIGV2ZW4sIHRoZSBzZWNvbmQgZW50cnkgc2hvdWxkIG1hdGNoIHRoZSBmaXJzdFxuICAgICAgICAgICAgICAvLyAoZWl0aGVyIGJvdGggYXJlIGNvbXBvc2VkIG9yIGJvdGggYXJlIHNpbmdsZSBzYW1wbGVzKS4gQnV0IGlmXG4gICAgICAgICAgICAgIC8vIGRpbGF0aW9uIGlzIG9kZCwgdGhlbiB0aGUgc2Vjb25kIGVudHJ5IHNob3VsZCBiZSB0aGUgb3Bwb3NpdGVcbiAgICAgICAgICAgICAgLy8gb2YgdGhlIGZpcnN0IChpZiB0aGUgZmlyc3QgaXMgY29tcG9zZWQsIHRoZSBzZWNvbmQgaXMgYSBzaW5nbGVcbiAgICAgICAgICAgICAgLy8gc2FtcGxlLCBhbmQgdmljZSB2ZXJzYS4pXG5cbiAgICAgICAgICAgICAgY29uc3QgbmV4dFRleGVsT2Zmc2V0ID0gcGFkTGVmdCAlIDIgPT09IDAgP1xuICAgICAgICAgICAgICAgICAgdXRpbC5uZWFyZXN0TGFyZ2VyRXZlbihkaWxhdGlvbldpZHRoKSA6XG4gICAgICAgICAgICAgICAgICBkaWxhdGlvbldpZHRoO1xuXG4gICAgICAgICAgICAgIGlmICgoZGlsYXRpb25XaWR0aCAlIDIgPT09IDAgJiYgcGFkTGVmdCAlIDIgPT09IDEpIHx8XG4gICAgICAgICAgICAgICAgICAoZGlsYXRpb25XaWR0aCAlIDIgIT09IDAgJiYgcGFkTGVmdCAlIDIgIT09IDEpKSB7XG4gICAgICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICAgICAgeENPZmZzZXQgPSB4QyArIGltb2QocGFkc1sxXSwgMikgKyAke25leHRUZXhlbE9mZnNldH07XG5cbiAgICAgICAgICAgICAgICAgIGlmICh4Q09mZnNldCA+PSAwICYmIHhDT2Zmc2V0IDwgaW5EaW1zWzFdICYmIHhUZXhlbEMke1xuICAgICAgICAgICAgICAgICAgICBjb2xJbmRleCArIDF9UmVhZHkgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleCArIDF9ID0gZ2V0WChiYXRjaCwgeFIsIHhDT2Zmc2V0LCBkMSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gTmVlZCB0byBtYW51YWxseSBjbGVhciB1bnVzZWQgY2hhbm5lbHMgaW4gY2FzZVxuICAgICAgICAgICAgICAgICAgICAvLyB3ZSdyZSByZWFkaW5nIGZyb20gcmVjeWNsZWQgdGV4dHVyZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHhDT2Zmc2V0ICsgMSA+PSBpbkRpbXNbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleCArIDF9Lnp3ID0gdmVjMigwLjApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4ICsgMX1SZWFkeSA9IDE7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBgO1xuXG4gICAgICAgICAgICAgICAgLy8gSWYgZGlsYXRpb24gPiAxIHRoZW4gdGhlIHhSQydzIHdpbGwgbm90IGJlIGFibGUgdG8gc2hhcmUgYW55XG4gICAgICAgICAgICAgICAgLy8gdmFsdWVzLCBzbyBlYWNoIHhSQyB3aWxsIHJlcXVpcmUgdHdvIHVuaXF1ZSBjYWxscyB0byBnZXRYLlxuICAgICAgICAgICAgICAgIGlmIChkaWxhdGlvbldpZHRoID4gMSkge1xuICAgICAgICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICAgICAgICB4Q09mZnNldCAtPSAyO1xuICAgICAgICAgICAgICAgICAgICBpZiAoeENPZmZzZXQgPj0gMCAmJiB4Q09mZnNldCA8IGluRGltc1sxXSAmJiB4VGV4ZWxDJHtcbiAgICAgICAgICAgICAgICAgICAgICBjb2xJbmRleH1SZWFkeSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXh9ID0gZ2V0WChiYXRjaCwgeFIsIHhDT2Zmc2V0LCBkMSk7XG4gICAgICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXh9UmVhZHkgPSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGA7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICAgICAgeEMke2NvbEluZGV4ICsgMX0gPSB2ZWM0KHhUZXhlbEMke2NvbEluZGV4fS56dywgeFRleGVsQyR7XG4gICAgICAgICAgICAgICAgICAgIGNvbEluZGV4ICsgMX0ueHkpO1xuICAgICAgICAgICAgICAgICAgYDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBkaWxhdGlvbiBpcyAxIGFuZCBwYWRkaW5nIGlzIG9kZCwgd2UgaGF2ZSBhbHJlYWR5IHJlYWQgdGhlXG4gICAgICAgICAgICAgICAgLy8gdGV4ZWwgd2hlbiBjb25zdHJ1Y3RpbmcgdGhlIHByZXZpb3VzIHggdmFsdWUuIEhlcmUgd2UgY2FuXG4gICAgICAgICAgICAgICAgLy8gc2ltcGx5IHNraXAgdGhlIHRleHR1cmUgcmVhZC5cbiAgICAgICAgICAgICAgICBpZiAobmV4dFRleGVsT2Zmc2V0ID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgICAgICAgIHhDJHtjb2xJbmRleCArIDF9ID0geFRleGVsQyR7Y29sSW5kZXh9O1xuICAgICAgICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgICAgICAgIHhDT2Zmc2V0ID0geEMgKyAke25leHRUZXhlbE9mZnNldH07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHhDT2Zmc2V0ID49IDAgJiYgeENPZmZzZXQgPCBpbkRpbXNbMV0gJiYgeFRleGVsQyR7XG4gICAgICAgICAgICAgICAgICAgICAgY29sSW5kZXggKyAxfVJlYWR5ID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleCArIDF9ID0gZ2V0WChiYXRjaCwgeFIsIHhDT2Zmc2V0LCBkMSk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHhDT2Zmc2V0ICsgMSA+PSBpbkRpbXNbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4ICsgMX0uencgPSB2ZWMyKDAuMCk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4ICsgMX1SZWFkeSA9IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB4QyR7Y29sSW5kZXggKyAxfSA9IHhUZXhlbEMke2NvbEluZGV4ICsgMX07XG4gICAgICAgICAgICAgICAgICAgIGA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgeyAgLy8gc3RyaWRlID09PSAyXG4gICAgICAgICAgaWYgKGNvbEluZGV4IDwgZmlsdGVyV2lkdGgpIHtcbiAgICAgICAgICAgIC8vIERlcGVuZGluZyBvbiB3aGV0aGVyIHBhZExlZnQgaXMgZXZlbiBvciBvZGQsIHdlIHdhbnQgZWl0aGVyIHRoZVxuICAgICAgICAgICAgLy8geHkgb3IgencgY2hhbm5lbHMgZnJvbSBYIHRleGVscyBmb3IgeEMke2NvbEluZGV4fS4gSWYgcGFkTGVmdCBpc1xuICAgICAgICAgICAgLy8gZXZlbiwgeEMke2NvbEluZGV4ICsxfSBpcyBzaW1wbHkgdGhlIHp3IGNoYW5uZWxzIG9mIHRleGVscyB3ZSd2ZVxuICAgICAgICAgICAgLy8gYWxyZWFkeSBzYW1wbGVkLiBCdXQgaWYgcGFkTGVmdCBpcyBvZGQsIHhDeyRjICsgMX0uencgd2lsbFxuICAgICAgICAgICAgLy8gbmVlZCB0byBjb21lIGZyb20gdGhlIHh5IGNoYW5uZWxzIG9mIGEgbmV3IHRleGVsLCBoZW5jZSB0aGUgYFxuICAgICAgICAgICAgLy8gdmVjNFxuICAgICAgICAgICAgLy8gZmluYWxgIGluaXRpYWxpemVkIGJlbG93LlxuICAgICAgICAgICAgaWYgKHBhZExlZnQgJSAyID09PSAxKSB7XG4gICAgICAgICAgICAgIG1haW5Mb29wICs9IGBcbiAgICAgICAgICAgICAgICB4Q09mZnNldCA9IHhDICsgMSAtIHN0cmlkZXNbMV07XG4gICAgICAgICAgICAgICAgaWYoeENPZmZzZXQgPj0gMCAmJiB4Q09mZnNldCA8IGluRGltc1sxXSAmJiB4VGV4ZWxDJHtcbiAgICAgICAgICAgICAgICAgIGNvbEluZGV4fVJlYWR5ID09IDApIHtcbiAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4fSA9IGdldFgoYmF0Y2gsIHhSLCB4Q09mZnNldCwgZDEpO1xuICAgICAgICAgICAgICAgICAgLy8gTmVlZCB0byBtYW51YWxseSBjbGVhciB1bnVzZWQgY2hhbm5lbHMgaW4gY2FzZVxuICAgICAgICAgICAgICAgICAgLy8gd2UncmUgcmVhZGluZyBmcm9tIHJlY3ljbGVkIHRleHR1cmUuXG4gICAgICAgICAgICAgICAgICBpZiAoeENPZmZzZXQgKyAxID49IGluRGltc1sxXSkge1xuICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH0uencgPSB2ZWMyKDAuMCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH1SZWFkeSA9IDE7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYoeEMgKyAxID49IDAgJiYgeEMgKyAxIDwgaW5EaW1zWzFdICYmIHhUZXhlbEMke1xuICAgICAgICAgICAgICAgICAgY29sSW5kZXggKyAxfVJlYWR5ID09IDApIHtcbiAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4ICsgMX0gPSBnZXRYKGJhdGNoLCB4UiwgeEMgKyAxLCBkMSk7XG4gICAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIG1hbnVhbGx5IGNsZWFyIHVudXNlZCBjaGFubmVscyBpbiBjYXNlXG4gICAgICAgICAgICAgICAgICAvLyB3ZSdyZSByZWFkaW5nIGZyb20gcmVjeWNsZWQgdGV4dHVyZS5cbiAgICAgICAgICAgICAgICAgIGlmICh4QyArIDIgPj0gaW5EaW1zWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4ICsgMX0uencgPSB2ZWMyKDAuMCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleCArIDF9UmVhZHkgPSAxO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHhDJHtjb2xJbmRleH0gPSB2ZWM0KHhUZXhlbEMke2NvbEluZGV4fS56dywgeFRleGVsQyR7XG4gICAgICAgICAgICAgICAgICBjb2xJbmRleCArIDF9Lnp3KTtcbiAgICAgICAgICAgICAgYDtcblxuICAgICAgICAgICAgICBpZiAoY29sSW5kZXggKyAxIDwgZmlsdGVyV2lkdGgpIHtcbiAgICAgICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgICAgICBmaW5hbCA9IHZlYzQoMC4wKTtcbiAgICAgICAgICAgICAgICAgIHhDT2Zmc2V0ID0geEMgKyAxICsgc3RyaWRlc1sxXTtcbiAgICAgICAgICAgICAgICAgIGlmKHhDT2Zmc2V0ID49IDAgJiYgeENPZmZzZXQgPCBpbkRpbXNbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgZmluYWwgPSBnZXRYKGJhdGNoLCB4UiwgeENPZmZzZXQsIGQxKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHhDJHtjb2xJbmRleCArIDF9ID0gdmVjNCh4VGV4ZWxDJHtjb2xJbmRleCArIDF9Lnh5LCBmaW5hbC54eSk7XG4gICAgICAgICAgICAgICAgYDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICAgIGlmKHhDID49IDAgJiYgeEMgPCBpbkRpbXNbMV0gJiYgeFRleGVsQyR7Y29sSW5kZXh9UmVhZHkgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXh9ID0gZ2V0WChiYXRjaCwgeFIsIHhDLCBkMSk7XG4gICAgICAgICAgICAgICAgICBpZiAoeEMgKyAxID49IGluRGltc1sxXSkge1xuICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH0uencgPSB2ZWMyKDAuMCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH1SZWFkeSA9IDE7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgeENPZmZzZXQgPSB4QyArIHN0cmlkZXNbMV07XG4gICAgICAgICAgICAgICAgaWYoeENPZmZzZXQgPj0gMCAmJiB4Q09mZnNldCA8IGluRGltc1sxXSAmJiB4VGV4ZWxDJHtcbiAgICAgICAgICAgICAgICAgIGNvbEluZGV4ICsgMX1SZWFkeSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleCArIDF9ID0gZ2V0WChiYXRjaCwgeFIsIHhDT2Zmc2V0LCBkMSk7XG4gICAgICAgICAgICAgICAgICBpZiAoeENPZmZzZXQgKyAxID49IGluRGltc1sxXSkge1xuICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleCArIDF9Lnp3ID0gdmVjMigwLik7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleCArIDF9UmVhZHkgPSAxO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHhDJHtjb2xJbmRleH0gPSB2ZWM0KFxuICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXh9Lnh5LCB4VGV4ZWxDJHtjb2xJbmRleCArIDF9Lnh5KTtcbiAgICAgICAgICAgICAgYDtcblxuICAgICAgICAgICAgICBpZiAoY29sSW5kZXggKyAxIDwgZmlsdGVyV2lkdGgpIHtcbiAgICAgICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgICAgICB4QyR7Y29sSW5kZXggKyAxfSA9IHZlYzQoeFRleGVsQyR7Y29sSW5kZXh9Lnp3LCB4VGV4ZWxDJHtcbiAgICAgICAgICAgICAgICAgICAgY29sSW5kZXggKyAxfS56dyk7XG4gICAgICAgICAgICAgICAgYDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGxvY2FsaXplIHRoZSBkb3RQcm9kIGFjY3VtdWxhdGlvbiB3aXRoaW4gdGhlIGxvb3AsIHRoZSB0aGVvcnkgaXMgZm9yXG4gICAgICAgIC8vIEdQVSB3aXRoIGxpbWl0ZWQgY2FjaGUsIGFjY3VtdWxhdGUgc3VtIGFjcm9zcyBsYXJnZSBhbW91bnQgb2ZcbiAgICAgICAgLy8gdmVyaWFibGVzIHdpbGwgY2F1c2UgbG90cyBvZiBjYWNoZSBtaXNzZXMuIChpLmUuIDV4NSBmaWx0ZXIgd2lsbCBoYXZlXG4gICAgICAgIC8vIDUwIHZhcmlhYmxlcylcbiAgICAgICAgaWYgKGNvbEluZGV4IDwgZmlsdGVyV2lkdGgpIHtcbiAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICB3VGV4ZWwgPSBnZXRXKCR7cn0sICR7Y29sSW5kZXh9LCBkMSwgcSk7XG4gICAgICAgICAgICBkb3RQcm9kICs9IHhDJHtjb2xJbmRleH0gKiB2ZWM0KHdUZXhlbC54eiwgd1RleGVsLnh6KTtcbiAgICAgICAgICBgO1xuXG4gICAgICAgICAgaWYgKGNvbEluZGV4ICsgMSA8IGZpbHRlcldpZHRoKSB7XG4gICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgIHdUZXhlbCA9IGdldFcoJHtyfSwgJHtjb2xJbmRleCArIDF9LCBkMSwgcSk7XG4gICAgICAgICAgICAgIGRvdFByb2QgKz0geEMke2NvbEluZGV4ICsgMX0gKiB2ZWM0KHdUZXhlbC54eiwgd1RleGVsLnh6KTtcbiAgICAgICAgICAgIGA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgfVxuXG4gICAgbGV0IGFjdGl2YXRpb25TbmlwcGV0ID0gJycsIGFwcGx5QWN0aXZhdGlvblNuaXBwZXQgPSAnJztcbiAgICBpZiAoYWN0aXZhdGlvbikge1xuICAgICAgaWYgKGhhc1ByZWx1QWN0aXZhdGlvbikge1xuICAgICAgICBhY3RpdmF0aW9uU25pcHBldCA9IGB2ZWM0IGFjdGl2YXRpb24odmVjNCBhKSB7XG4gICAgICAgICAgdmVjNCBiID0gZ2V0UHJlbHVBY3RpdmF0aW9uV2VpZ2h0c0F0T3V0Q29vcmRzKCk7XG4gICAgICAgICAgJHthY3RpdmF0aW9ufVxuICAgICAgICB9YDtcbiAgICAgIH0gZWxzZSBpZiAoaGFzTGVha3lSZWx1QWxwaGEpIHtcbiAgICAgICAgYWN0aXZhdGlvblNuaXBwZXQgPSBgdmVjNCBhY3RpdmF0aW9uKHZlYzQgYSkge1xuICAgICAgICAgIHZlYzQgYiA9IGdldExlYWt5cmVsdUFscGhhQXRPdXRDb29yZHMoKTtcbiAgICAgICAgICAke2FjdGl2YXRpb259XG4gICAgICAgIH1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWN0aXZhdGlvblNuaXBwZXQgPSBgdmVjNCBhY3RpdmF0aW9uKHZlYzQgeCkge1xuICAgICAgICAgICR7YWN0aXZhdGlvbn1cbiAgICAgICAgfWA7XG4gICAgICB9XG5cbiAgICAgIGFwcGx5QWN0aXZhdGlvblNuaXBwZXQgPSBgcmVzdWx0ID0gYWN0aXZhdGlvbihyZXN1bHQpO2A7XG4gICAgfVxuXG4gICAgY29uc3QgYWRkQmlhc1NuaXBwZXQgPSBhZGRCaWFzID8gJ3Jlc3VsdCArPSBnZXRCaWFzQXRPdXRDb29yZHMoKTsnIDogJyc7XG4gICAgaWYgKGFkZEJpYXMpIHtcbiAgICAgIHRoaXMudmFyaWFibGVOYW1lcy5wdXNoKCdiaWFzJyk7XG4gICAgfVxuXG4gICAgaWYgKGhhc1ByZWx1QWN0aXZhdGlvbikge1xuICAgICAgdGhpcy52YXJpYWJsZU5hbWVzLnB1c2goJ3ByZWx1QWN0aXZhdGlvbldlaWdodHMnKTtcbiAgICB9XG4gICAgaWYgKGhhc0xlYWt5UmVsdUFscGhhKSB7XG4gICAgICB0aGlzLnZhcmlhYmxlTmFtZXMucHVzaCgnbGVha3lyZWx1QWxwaGEnKTtcbiAgICB9XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgJHthY3RpdmF0aW9uU25pcHBldH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzLng7XG4gICAgICAgIGl2ZWMyIHhSQ0Nvcm5lciA9IGNvb3Jkcy55eiAqIHN0cmlkZXMgLSBwYWRzO1xuICAgICAgICBpbnQgZDIgPSBjb29yZHMudztcbiAgICAgICAgaW50IGQxID0gZDIgLyAke2NoYW5uZWxNdWx9O1xuICAgICAgICBpbnQgcSA9IGQyIC0gZDEgKiAke2NoYW5uZWxNdWx9O1xuICAgICAgICBpbnQgeFJDb3JuZXIgPSB4UkNDb3JuZXIueDtcbiAgICAgICAgaW50IHhDQ29ybmVyID0geFJDQ29ybmVyLnk7XG5cbiAgICAgICAgLy9pbnRpYWxpemUgZG90UHJvZCB3aXRoIGEgc21hbGwgZXBzaWxvbiBzZWVtcyB0byByZWR1Y2UgR1BVIGFjY3VyYWN5IGxvc3MuXG4gICAgICAgIHZlYzQgZG90UHJvZCA9IHZlYzQoMC4wMDAwMDAwMDAwMDAwMDEpO1xuXG4gICAgICAgICR7bWFpbkxvb3B9XG5cbiAgICAgICAgdmVjNCByZXN1bHQgPSBkb3RQcm9kIC0gdmVjNCgwLjAwMDAwMDAwMDAwMDAwMSk7XG4gICAgICAgICR7YWRkQmlhc1NuaXBwZXR9XG4gICAgICAgICR7YXBwbHlBY3RpdmF0aW9uU25pcHBldH1cbiAgICAgICAgc2V0T3V0cHV0KHJlc3VsdCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIENyb3BBbmRSZXNpemVQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnSW1hZ2UnLCAnQm94ZXMnLCAnQm94SW5kJ107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXSA9IFtdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgaW1hZ2VTaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGJveFNoYXBlOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgY3JvcFNpemU6IFtudW1iZXIsIG51bWJlcl0sIG1ldGhvZDogJ2JpbGluZWFyJ3wnbmVhcmVzdCcsXG4gICAgICBleHRyYXBvbGF0aW9uVmFsdWU6IG51bWJlcikge1xuICAgIGNvbnN0IFtiYXRjaCwgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIGRlcHRoXSA9IGltYWdlU2hhcGU7XG4gICAgY29uc3QgW251bUJveGVzLCBdID0gYm94U2hhcGU7XG4gICAgY29uc3QgW2Nyb3BIZWlnaHQsIGNyb3BXaWR0aF0gPSBjcm9wU2l6ZTtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gW251bUJveGVzLCBjcm9wSGVpZ2h0LCBjcm9wV2lkdGgsIGRlcHRoXTtcbiAgICBjb25zdCBtZXRob2RJZCA9IG1ldGhvZCA9PT0gJ2JpbGluZWFyJyA/IDEgOiAwO1xuXG4gICAgY29uc3QgW2lucHV0SGVpZ2h0RmxvYXQsIGlucHV0V2lkdGhGbG9hdF0gPVxuICAgICAgICBbYCR7aW1hZ2VIZWlnaHQgLSAxfS4wYCwgYCR7aW1hZ2VXaWR0aCAtIDF9LjBgXTtcblxuICAgIGNvbnN0IFtoZWlnaHRSYXRpbywgaGVpZ2h0U2NhbGUsIGluWV0gPSBjcm9wSGVpZ2h0ID4gMSA/XG4gICAgICAgIFtcbiAgICAgICAgICBgJHsoaW1hZ2VIZWlnaHQgLSAxKSAvIChjcm9wSGVpZ2h0IC0gMSl9YCxcbiAgICAgICAgICAnKHkyLXkxKSAqIGhlaWdodF9yYXRpbycsXG4gICAgICAgICAgYHkxKiR7aW5wdXRIZWlnaHRGbG9hdH0gKyBmbG9hdCh5KSooaGVpZ2h0X3NjYWxlKWAsXG4gICAgICAgIF0gOlxuICAgICAgICBbXG4gICAgICAgICAgJzAuMCcsXG4gICAgICAgICAgJzAuMCcsXG4gICAgICAgICAgYDAuNSAqICh5MSt5MikgKiAke2lucHV0SGVpZ2h0RmxvYXR9YCxcbiAgICAgICAgXTtcbiAgICBjb25zdCBbd2lkdGhSYXRpbywgd2lkdGhTY2FsZSwgaW5YXSA9IGNyb3BXaWR0aCA+IDEgP1xuICAgICAgICBbXG4gICAgICAgICAgYCR7KGltYWdlV2lkdGggLSAxKSAvIChjcm9wV2lkdGggLSAxKX1gLFxuICAgICAgICAgICcoeDIteDEpICogd2lkdGhfcmF0aW8nLFxuICAgICAgICAgIGB4MSoke2lucHV0V2lkdGhGbG9hdH0gKyBmbG9hdCh4KSood2lkdGhfc2NhbGUpYCxcbiAgICAgICAgXSA6XG4gICAgICAgIFtcbiAgICAgICAgICAnMC4wJyxcbiAgICAgICAgICAnMC4wJyxcbiAgICAgICAgICBgMC41ICogKHgxK3gyKSAqICR7aW5wdXRXaWR0aEZsb2F0fWAsXG4gICAgICAgIF07XG5cbiAgICAvLyBSZWZlcmVuY2UgaW1wbGVtZW50YXRpb25cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yZmxvdy9ibG9iL21hc3Rlci90ZW5zb3JmbG93L2NvcmUva2VybmVscy9jcm9wX2FuZF9yZXNpemVfb3BfZ3B1LmN1LmNjXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IGZsb2F0IGhlaWdodF9yYXRpbyA9IGZsb2F0KCR7aGVpZ2h0UmF0aW99KTtcbiAgICAgIGNvbnN0IGZsb2F0IHdpZHRoX3JhdGlvID0gZmxvYXQoJHt3aWR0aFJhdGlvfSk7XG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYiA9IGNvb3Jkc1swXTtcbiAgICAgICAgaW50IHkgPSBjb29yZHNbMV07XG4gICAgICAgIGludCB4ID0gY29vcmRzWzJdO1xuICAgICAgICBpbnQgZCA9IGNvb3Jkc1szXTtcblxuICAgICAgICAvLyBnZXQgYm94IHZhbHNcbiAgICAgICAgZmxvYXQgeTEgPSBnZXRCb3hlcyhiLDApO1xuICAgICAgICBmbG9hdCB4MSA9IGdldEJveGVzKGIsMSk7XG4gICAgICAgIGZsb2F0IHkyID0gZ2V0Qm94ZXMoYiwyKTtcbiAgICAgICAgZmxvYXQgeDIgPSBnZXRCb3hlcyhiLDMpO1xuXG4gICAgICAgIC8vIGdldCBpbWFnZSBpbiBiYXRjaCBpbmRleFxuICAgICAgICBpbnQgYkluZCA9IHJvdW5kKGdldEJveEluZChiKSk7XG4gICAgICAgIGlmKGJJbmQgPCAwIHx8IGJJbmQgPj0gJHtiYXRjaH0pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmbG9hdCBoZWlnaHRfc2NhbGUgPSAke2hlaWdodFNjYWxlfTtcbiAgICAgICAgZmxvYXQgd2lkdGhfc2NhbGUgPSAke3dpZHRoU2NhbGV9O1xuXG4gICAgICAgIGZsb2F0IGluX3kgPSAke2luWX07XG4gICAgICAgIGlmKCBpbl95IDwgMC4wIHx8IGluX3kgPiAke2lucHV0SGVpZ2h0RmxvYXR9ICkge1xuICAgICAgICAgIHNldE91dHB1dChmbG9hdCgke2V4dHJhcG9sYXRpb25WYWx1ZX0pKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZmxvYXQgaW5feCA9ICR7aW5YfTtcbiAgICAgICAgaWYoIGluX3ggPCAwLjAgfHwgaW5feCA+ICR7aW5wdXRXaWR0aEZsb2F0fSApIHtcbiAgICAgICAgICBzZXRPdXRwdXQoZmxvYXQoJHtleHRyYXBvbGF0aW9uVmFsdWV9KSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmVjMiBzb3VyY2VGcmFjSW5kZXhDUiA9IHZlYzIoaW5feCxpbl95KTtcbiAgICAgICAgaWYoJHttZXRob2RJZH0gPT0gMSkge1xuICAgICAgICAgIC8vIENvbXB1dGUgdGhlIGZvdXIgaW50ZWdlciBpbmRpY2VzLlxuICAgICAgICAgIGl2ZWMyIHNvdXJjZUZsb29yQ1IgPSBpdmVjMihzb3VyY2VGcmFjSW5kZXhDUik7XG4gICAgICAgICAgaXZlYzIgc291cmNlQ2VpbENSID0gaXZlYzIoY2VpbChzb3VyY2VGcmFjSW5kZXhDUikpO1xuXG4gICAgICAgICAgZmxvYXQgdG9wTGVmdCA9IGdldEltYWdlKGIsIHNvdXJjZUZsb29yQ1IueSwgc291cmNlRmxvb3JDUi54LCBkKTtcbiAgICAgICAgICBmbG9hdCBib3R0b21MZWZ0ID0gZ2V0SW1hZ2UoYiwgc291cmNlQ2VpbENSLnksIHNvdXJjZUZsb29yQ1IueCwgZCk7XG4gICAgICAgICAgZmxvYXQgdG9wUmlnaHQgPSBnZXRJbWFnZShiLCBzb3VyY2VGbG9vckNSLnksIHNvdXJjZUNlaWxDUi54LCBkKTtcbiAgICAgICAgICBmbG9hdCBib3R0b21SaWdodCA9IGdldEltYWdlKGIsIHNvdXJjZUNlaWxDUi55LCBzb3VyY2VDZWlsQ1IueCwgZCk7XG5cbiAgICAgICAgICB2ZWMyIGZyYWNDUiA9IHNvdXJjZUZyYWNJbmRleENSIC0gdmVjMihzb3VyY2VGbG9vckNSKTtcblxuICAgICAgICAgIGZsb2F0IHRvcCA9IHRvcExlZnQgKyAodG9wUmlnaHQgLSB0b3BMZWZ0KSAqIGZyYWNDUi54O1xuICAgICAgICAgIGZsb2F0IGJvdHRvbSA9IGJvdHRvbUxlZnQgKyAoYm90dG9tUmlnaHQgLSBib3R0b21MZWZ0KSAqIGZyYWNDUi54O1xuICAgICAgICAgIGZsb2F0IG5ld1ZhbHVlID0gdG9wICsgKGJvdHRvbSAtIHRvcCkgKiBmcmFjQ1IueTtcbiAgICAgICAgICBzZXRPdXRwdXQobmV3VmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIENvbXB1dGUgdGhlIGNvb3JkaW5hdG9ycyBvZiBuZWFyZXN0IG5laWdoYm9yIHBvaW50LlxuICAgICAgICAgIGl2ZWMyIHNvdXJjZU5lYXJlc3RDUiA9IGl2ZWMyKGZsb29yKFxuICAgICAgICAgICAgc291cmNlRnJhY0luZGV4Q1IgKyB2ZWMyKDAuNSwwLjUpKSk7XG4gICAgICAgICAgZmxvYXQgbmV3VmFsdWUgPSBnZXRJbWFnZShiLCBzb3VyY2VOZWFyZXN0Q1IueSwgc291cmNlTmVhcmVzdENSLngsIGQpO1xuICAgICAgICAgIHNldE91dHB1dChuZXdWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7Z2V0Q29vcmRzRGF0YVR5cGUsIFVuaWZvcm1UeXBlfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5cbmV4cG9ydCBjbGFzcyBDdW1TdW1Qcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsneCddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIGN1c3RvbVVuaWZvcm1zID0gW3tuYW1lOiAnaW5kZXgnLCB0eXBlOiAnZmxvYXQnIGFzIFVuaWZvcm1UeXBlfV07XG5cbiAgY29uc3RydWN0b3Ioc2hhcGU6IG51bWJlcltdLCBleGNsdXNpdmU6IGJvb2xlYW4sIHJldmVyc2U6IGJvb2xlYW4pIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gc2hhcGU7XG4gICAgY29uc3QgcmFuayA9IHNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCB2YWwgPSBleGNsdXNpdmUgPyAnMC4wJyA6IGBnZXRYKCR7Z2V0Q29vcmRzKHJhbmssICdjb29yZHMnKX0pYDtcbiAgICBjb25zdCBsZW5ndGggPSBzaGFwZVtzaGFwZS5sZW5ndGggLSAxXTtcbiAgICBsZXQgY29uZGl0aW9uID0gJyc7XG4gICAgbGV0IGlkeFN0cmluZyA9ICcnO1xuICAgIC8vIFdoZW4gZXhjbHVzaXZlIGlzIHNldCwgdGhlIGN1bXN1bSBvcCBiZWNvbWVzIHJvbGwgb3AgdGhhdCBjb3BpZXMgdGhlXG4gICAgLy8gdmFsdWUgZnJvbSB0aGUgcHJldmlvdXMgaW5kZXggYmFzZWQgb24gdGhlIGRpcmVjdGlvbiBzcGVjaWZpZWQgYnkgdGhlXG4gICAgLy8gcmV2ZXJzZSBmbGFnLlxuICAgIGlmIChleGNsdXNpdmUpIHtcbiAgICAgIGNvbmRpdGlvbiA9IHJldmVyc2UgPyBgZW5kICE9ICR7bGVuZ3RoIC0gMX1gIDogJ2VuZCAhPSAwJztcbiAgICAgIGlkeFN0cmluZyA9IHJldmVyc2UgPyAnZW5kICsgMScgOiAnZW5kIC0gMSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmRpdGlvbiA9IHJldmVyc2UgPyBgZW5kICsgcG93MiA8ICR7bGVuZ3RofWAgOiAnZW5kID49IHBvdzInO1xuICAgICAgaWR4U3RyaW5nID0gKHJldmVyc2UgPyAnZW5kICsgcG93MicgOiAnZW5kIC0gcG93MicpO1xuICAgIH1cblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICR7Z2V0Q29vcmRzRGF0YVR5cGUocmFuayl9IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgZW5kID0gJHtnZXRGaW5hbENvb3JkKHJhbmssICdjb29yZHMnKX07XG4gICAgICAgIGZsb2F0IHZhbCA9ICR7dmFsfTtcbiAgICAgICAgaW50IHBvdzIgPSBpbnQocG93KDIuMCwgaW5kZXgpKTtcbiAgICAgICAgaWYgKCR7Y29uZGl0aW9ufSkge1xuICAgICAgICAgIGludCBpZHggPSAke2lkeFN0cmluZ307XG4gICAgICAgICAgJHtnZXRGaW5hbENvb3JkKHJhbmssICdjb29yZHMnKX0gPSBpZHg7XG4gICAgICAgICAgdmFsICs9IGdldFgoJHtnZXRDb29yZHMocmFuaywgJ2Nvb3JkcycpfSk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0T3V0cHV0KHZhbCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRDb29yZHMocmFuazogbnVtYmVyLCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAocmFuayA9PT0gMSkge1xuICAgIHJldHVybiBgJHtuYW1lfWA7XG4gIH0gZWxzZSBpZiAocmFuayA9PT0gMikge1xuICAgIHJldHVybiBgJHtuYW1lfS54LCAke25hbWV9LnlgO1xuICB9IGVsc2UgaWYgKHJhbmsgPT09IDMpIHtcbiAgICByZXR1cm4gYCR7bmFtZX0ueCwgJHtuYW1lfS55LCAke25hbWV9LnpgO1xuICB9IGVsc2UgaWYgKHJhbmsgPT09IDQpIHtcbiAgICByZXR1cm4gYCR7bmFtZX0ueCwgJHtuYW1lfS55LCAke25hbWV9LnosICR7bmFtZX0ud2A7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgRXJyb3IoYEN1bXVsYXRpdmUgc3VtIGZvciByYW5rICR7cmFua30gaXMgbm90IHlldCBzdXBwb3J0ZWRgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRGaW5hbENvb3JkKHJhbms6IG51bWJlciwgbmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHJhbmsgPT09IDEpIHtcbiAgICByZXR1cm4gYCR7bmFtZX1gO1xuICB9IGVsc2UgaWYgKHJhbmsgPT09IDIpIHtcbiAgICByZXR1cm4gYCR7bmFtZX0ueWA7XG4gIH0gZWxzZSBpZiAocmFuayA9PT0gMykge1xuICAgIHJldHVybiBgJHtuYW1lfS56YDtcbiAgfSBlbHNlIGlmIChyYW5rID09PSA0KSB7XG4gICAgcmV0dXJuIGAke25hbWV9LndgO1xuICB9IGVsc2Uge1xuICAgIHRocm93IEVycm9yKGBDdW11bGF0aXZlIHN1bSBmb3IgcmFuayAke3Jhbmt9IGlzIG5vdCB5ZXQgc3VwcG9ydGVkYCk7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtnZXRHbHNsRGlmZmVyZW5jZXN9IGZyb20gJy4vZ2xzbF92ZXJzaW9uJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtLCB1c2VTaGFwZVVuaWZvcm1zfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0ICogYXMgc2hhZGVyX3V0aWwgZnJvbSAnLi9zaGFkZXJfY29tcGlsZXJfdXRpbCc7XG5pbXBvcnQge1BhY2tpbmdTY2hlbWV9IGZyb20gJy4vdGV4X3V0aWwnO1xuXG5leHBvcnQgY2xhc3MgRGVjb2RlTWF0cml4UHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgb3V0cHV0U2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgcGFja2VkSW5wdXRzID0gZmFsc2U7XG4gIHBhY2tlZE91dHB1dCA9IHRydWU7XG4gIG91dFBhY2tpbmdTY2hlbWUgPSBQYWNraW5nU2NoZW1lLkRFTlNFO1xuICBlbmFibGVTaGFwZVVuaWZvcm1zOiBib29sZWFuO1xuICBjdXN0b21Vbmlmb3JtcyA9IFt7bmFtZTogJ3RleFNoYXBlJywgdHlwZTogJ2l2ZWMyJyBhcyBjb25zdCB9XTtcblxuICBjb25zdHJ1Y3RvcihvdXRwdXRTaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdKSB7XG4gICAgY29uc3QgZ2xzbCA9IGdldEdsc2xEaWZmZXJlbmNlcygpO1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICB0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMgPSB1c2VTaGFwZVVuaWZvcm1zKHRoaXMub3V0cHV0U2hhcGUubGVuZ3RoKTtcblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBpdmVjMyBvdXRDb29yZHNGcm9tRmxhdEluZGV4KGludCBpbmRleCkge1xuICAgICAgICAke1xuICAgICAgICB0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMgP1xuICAgICAgICAgICAgc2hhZGVyX3V0aWwuZ2V0T3V0cHV0TG9naWNhbENvb3JkaW5hdGVzRnJvbUZsYXRJbmRleEJ5VW5pZm9ybShcbiAgICAgICAgICAgICAgICBbJ3InLCAnYycsICdkJ10sIG91dHB1dFNoYXBlKSA6XG4gICAgICAgICAgICBzaGFkZXJfdXRpbC5nZXRMb2dpY2FsQ29vcmRpbmF0ZXNGcm9tRmxhdEluZGV4KFxuICAgICAgICAgICAgICAgIFsncicsICdjJywgJ2QnXSwgb3V0cHV0U2hhcGUpfVxuICAgICAgICByZXR1cm4gaXZlYzMociwgYywgZCk7XG4gICAgICB9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihyZXN1bHRVVi55eCAqIHZlYzIodGV4U2hhcGVbMF0sIHRleFNoYXBlWzFdKSk7XG4gICAgICAgIGludCBpbmRleCA9IDQgKiAocmVzVGV4UkMueCAqIHRleFNoYXBlWzFdICsgcmVzVGV4UkMueSk7XG5cbiAgICAgICAgdmVjNCByZXN1bHQgPSB2ZWM0KDAuKTtcblxuICAgICAgICBmb3IgKGludCBpPTA7IGk8NDsgaSsrKSB7XG4gICAgICAgICAgaW50IGZsYXRJbmRleCA9IGluZGV4ICsgaTtcbiAgICAgICAgICBpdmVjMyByYyA9IG91dENvb3Jkc0Zyb21GbGF0SW5kZXgoZmxhdEluZGV4KTtcbiAgICAgICAgICByZXN1bHRbaV0gPSBnZXRBKHJjLngsIHJjLnksIHJjLnopO1xuICAgICAgICB9XG5cbiAgICAgICAgJHtnbHNsLm91dHB1dH0gPSByZXN1bHQ7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2dldEdsc2xEaWZmZXJlbmNlc30gZnJvbSAnLi9nbHNsX3ZlcnNpb24nO1xuaW1wb3J0IHtHUEdQVVByb2dyYW0sIHVzZVNoYXBlVW5pZm9ybXN9IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5pbXBvcnQgKiBhcyBzaGFkZXJfdXRpbCBmcm9tICcuL3NoYWRlcl9jb21waWxlcl91dGlsJztcbmltcG9ydCB7UGFja2luZ1NjaGVtZX0gZnJvbSAnLi90ZXhfdXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBEZWNvZGVNYXRyaXhQYWNrZWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBwYWNrZWRJbnB1dHMgPSB0cnVlO1xuICBwYWNrZWRPdXRwdXQgPSB0cnVlO1xuICBvdXRwdXRTaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICBvdXRQYWNraW5nU2NoZW1lID0gUGFja2luZ1NjaGVtZS5ERU5TRTtcbiAgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbjtcbiAgY3VzdG9tVW5pZm9ybXMgPSBbe25hbWU6ICd0ZXhTaGFwZScsIHR5cGU6ICdpdmVjMicgYXMgY29uc3QgfV07XG5cbiAgY29uc3RydWN0b3Iob3V0cHV0U2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSkge1xuICAgIGNvbnN0IGdsc2wgPSBnZXRHbHNsRGlmZmVyZW5jZXMoKTtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGU7XG4gICAgdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID0gdXNlU2hhcGVVbmlmb3Jtcyh0aGlzLm91dHB1dFNoYXBlLmxlbmd0aCk7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgaXZlYzMgb3V0Q29vcmRzRnJvbUZsYXRJbmRleChpbnQgaW5kZXgpIHtcbiAgICAgICAgJHtcbiAgICAgICAgdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID9cbiAgICAgICAgICAgIHNoYWRlcl91dGlsLmdldE91dHB1dExvZ2ljYWxDb29yZGluYXRlc0Zyb21GbGF0SW5kZXhCeVVuaWZvcm0oXG4gICAgICAgICAgICAgICAgWydyJywgJ2MnLCAnZCddLCBvdXRwdXRTaGFwZSkgOlxuICAgICAgICAgICAgc2hhZGVyX3V0aWwuZ2V0TG9naWNhbENvb3JkaW5hdGVzRnJvbUZsYXRJbmRleChcbiAgICAgICAgICAgICAgICBbJ3InLCAnYycsICdkJ10sIG91dHB1dFNoYXBlKX1cbiAgICAgICAgcmV0dXJuIGl2ZWMzKHIsIGMsIGQpO1xuICAgICAgfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIocmVzdWx0VVYueXggKiB2ZWMyKHRleFNoYXBlWzBdLCB0ZXhTaGFwZVsxXSkpO1xuICAgICAgICBpbnQgaW5kZXggPSA0ICogKHJlc1RleFJDLnggKiB0ZXhTaGFwZVsxXSArIHJlc1RleFJDLnkpO1xuXG4gICAgICAgIHZlYzQgcmVzdWx0ID0gdmVjNCgwLik7XG5cbiAgICAgICAgZm9yIChpbnQgaT0wOyBpPDQ7IGkrKykge1xuICAgICAgICAgIGludCBmbGF0SW5kZXggPSBpbmRleCArIGk7XG4gICAgICAgICAgaXZlYzMgcmMgPSBvdXRDb29yZHNGcm9tRmxhdEluZGV4KGZsYXRJbmRleCk7XG4gICAgICAgICAgcmVzdWx0W2ldID0gZ2V0Q2hhbm5lbChnZXRBKHJjLngsIHJjLnksIHJjLnopLCB2ZWMyKHJjLnksIHJjLnopKTtcbiAgICAgICAgfVxuXG4gICAgICAgICR7Z2xzbC5vdXRwdXR9ID0gcmVzdWx0O1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBEZXB0aFRvU3BhY2VQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsneCddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW10gPSBbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgYmxvY2tTaXplOiBudW1iZXI7XG4gIGRhdGFGb3JtYXQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIG91dHB1dFNoYXBlOiBudW1iZXJbXSwgYmxvY2tTaXplOiBudW1iZXIsIGRhdGFGb3JtYXQ6ICdOSFdDJ3wnTkNIVycpIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGU7XG4gICAgdGhpcy5ibG9ja1NpemUgPSBibG9ja1NpemU7XG4gICAgdGhpcy5kYXRhRm9ybWF0ID0gZGF0YUZvcm1hdDtcbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgIHZvaWQgbWFpbigpIHtcbiAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgaW50IGIgPSBjb29yZHNbMF07XG4gICAgICBpbnQgaCA9ICR7dGhpcy5nZXRIZWlnaHRDb29yZFN0cmluZygpfTtcbiAgICAgIGludCB3ID0gJHt0aGlzLmdldFdpZHRoQ29vcmRTdHJpbmcoKX07XG4gICAgICBpbnQgZCA9ICR7dGhpcy5nZXREZXB0aENvb3JkU3RyaW5nKCl9O1xuXG4gICAgICBpbnQgaW5faCA9IGggLyAke2Jsb2NrU2l6ZX07XG4gICAgICBpbnQgb2Zmc2V0X2ggPSBpbW9kKGgsICR7YmxvY2tTaXplfSk7XG4gICAgICBpbnQgaW5fdyA9IHcgLyAke2Jsb2NrU2l6ZX07XG4gICAgICBpbnQgb2Zmc2V0X3cgPSBpbW9kKHcsICR7YmxvY2tTaXplfSk7XG4gICAgICBpbnQgb2Zmc2V0X2QgPSAob2Zmc2V0X2ggKiAke2Jsb2NrU2l6ZX0gKyBvZmZzZXRfdykgKlxuICAgICAgICAke3RoaXMuZ2V0T3V0cHV0RGVwdGhTaXplKCl9O1xuICAgICAgaW50IGluX2QgPSBkICsgb2Zmc2V0X2Q7XG5cbiAgICAgIGZsb2F0IHJlc3VsdCA9ICR7dGhpcy5nZXRJbnB1dFNhbXBsaW5nU3RyaW5nKCl9O1xuICAgICAgc2V0T3V0cHV0KHJlc3VsdCk7XG4gICAgfVxuICBgO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRIZWlnaHRDb29yZFN0cmluZygpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmRhdGFGb3JtYXQgPT09ICdOSFdDJykge1xuICAgICAgcmV0dXJuIGBjb29yZHNbMV1gO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYGNvb3Jkc1syXWA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRXaWR0aENvb3JkU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZGF0YUZvcm1hdCA9PT0gJ05IV0MnKSB7XG4gICAgICByZXR1cm4gYGNvb3Jkc1syXWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgY29vcmRzWzNdYDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldERlcHRoQ29vcmRTdHJpbmcoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5kYXRhRm9ybWF0ID09PSAnTkhXQycpIHtcbiAgICAgIHJldHVybiBgY29vcmRzWzNdYDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGBjb29yZHNbMV1gO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3V0cHV0RGVwdGhTaXplKCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuZGF0YUZvcm1hdCA9PT0gJ05IV0MnKSB7XG4gICAgICByZXR1cm4gdGhpcy5vdXRwdXRTaGFwZVszXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMub3V0cHV0U2hhcGVbMV07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRJbnB1dFNhbXBsaW5nU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZGF0YUZvcm1hdCA9PT0gJ05IV0MnKSB7XG4gICAgICByZXR1cm4gYGdldFgoYiwgaW5faCwgaW5fdywgaW5fZClgO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYGdldFgoYiwgaW5fZCwgaW5faCwgaW5fdylgO1xuICAgIH1cbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIERpYWdQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnWCddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2l6ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IFtzaXplLCBzaXplXTtcbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgIGl2ZWMyIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgIGZsb2F0IHZhbCA9IGNvb3Jkc1swXSA9PSBjb29yZHNbMV0gPyBnZXRYKGNvb3Jkc1swXSkgOiAwLjA7XG4gICAgICAgICAgc2V0T3V0cHV0KHZhbCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgRGlsYXRpb24yRFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWyd4JywgJ1cnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGNvbnZJbmZvOiBiYWNrZW5kX3V0aWwuQ29udjJESW5mbykge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5vdXRTaGFwZTtcblxuICAgIGNvbnN0IHtcbiAgICAgIGluSGVpZ2h0LFxuICAgICAgaW5XaWR0aCxcbiAgICAgIHBhZEluZm8sXG4gICAgICBzdHJpZGVIZWlnaHQsXG4gICAgICBzdHJpZGVXaWR0aCxcbiAgICAgIGZpbHRlckhlaWdodCxcbiAgICAgIGZpbHRlcldpZHRoLFxuICAgICAgZGlsYXRpb25IZWlnaHQsXG4gICAgICBkaWxhdGlvbldpZHRoXG4gICAgfSA9IGNvbnZJbmZvO1xuXG4gICAgY29uc3Qge3RvcDogcGFkVG9wLCBsZWZ0OiBwYWRMZWZ0fSA9IHBhZEluZm87XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgY29uc3QgaXZlYzIgc3RyaWRlcyA9IGl2ZWMyKCR7c3RyaWRlSGVpZ2h0fSwgJHtzdHJpZGVXaWR0aH0pO1xuICAgICAgY29uc3QgaXZlYzIgcGFkcyA9IGl2ZWMyKCR7cGFkVG9wfSwgJHtwYWRMZWZ0fSk7XG4gICAgICBjb25zdCBmbG9hdCBuZWdfaW5maW5pdHkgPSAtMy40ZTM4O1xuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHMueDtcbiAgICAgICAgaW50IGQxID0gY29vcmRzLnc7XG4gICAgICAgIGl2ZWMyIG91dFRvcExlZnRDb3JuZXIgPVxuICAgICAgICAgICAgY29vcmRzLnl6ICogc3RyaWRlcyAtIHBhZHM7XG4gICAgICAgIGludCBoQmVnID0gb3V0VG9wTGVmdENvcm5lci54O1xuICAgICAgICBpbnQgd0JlZyA9IG91dFRvcExlZnRDb3JuZXIueTtcblxuICAgICAgICBmbG9hdCBjdXJWYWwgPSBuZWdfaW5maW5pdHk7XG4gICAgICAgIGZvciAoaW50IGggPSAwOyBoIDwgJHtmaWx0ZXJIZWlnaHR9OyBoKyspIHtcbiAgICAgICAgICBpbnQgaEluID0gaEJlZyArIGggKiAke2RpbGF0aW9uSGVpZ2h0fTtcblxuICAgICAgICAgIGlmIChoSW4gPj0gMCAmJiBoSW4gPCAke2luSGVpZ2h0fSkge1xuICAgICAgICAgICAgZm9yIChpbnQgdyA9IDA7IHcgPCAke2ZpbHRlcldpZHRofTsgdysrKSB7XG4gICAgICAgICAgICAgIGludCB3SW4gPSB3QmVnICsgdyAqICR7ZGlsYXRpb25XaWR0aH07XG5cbiAgICAgICAgICAgICAgaWYgKHdJbiA+PSAwICYmIHdJbiA8ICR7aW5XaWR0aH0pIHtcbiAgICAgICAgICAgICAgICBmbG9hdCB4VmFsID0gZ2V0WChiYXRjaCwgaEluLCB3SW4sIGQxKTtcbiAgICAgICAgICAgICAgICBmbG9hdCB3VmFsID0gZ2V0VyhoLCB3LCBkMSk7XG5cbiAgICAgICAgICAgICAgICBmbG9hdCB2YWwgPSB4VmFsICsgd1ZhbDtcbiAgICAgICAgICAgICAgICBpZiAodmFsID4gY3VyVmFsKSB7XG4gICAgICAgICAgICAgICAgICBjdXJWYWwgPSB2YWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZmxvYXQgcmVzdWx0ID0gY3VyVmFsO1xuICAgICAgICBzZXRPdXRwdXQocmVzdWx0KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7Z2V0R2xzbERpZmZlcmVuY2VzfSBmcm9tICcuL2dsc2xfdmVyc2lvbic7XG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7RU5DT0RFX0ZMT0FUX1NOSVBQRVR9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyX3V0aWwnO1xuaW1wb3J0IHtUZXh0dXJlVXNhZ2V9IGZyb20gJy4vdGV4X3V0aWwnO1xuXG5leHBvcnQgY2xhc3MgRW5jb2RlRmxvYXRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIG91dFRleFVzYWdlID0gVGV4dHVyZVVzYWdlLkRPV05MT0FEO1xuXG4gIGNvbnN0cnVjdG9yKG91dHB1dFNoYXBlOiBudW1iZXJbXSkge1xuICAgIGNvbnN0IGdsc2wgPSBnZXRHbHNsRGlmZmVyZW5jZXMoKTtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGU7XG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICR7RU5DT0RFX0ZMT0FUX1NOSVBQRVR9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgZmxvYXQgeCA9IGdldEFBdE91dENvb3JkcygpO1xuICAgICAgICAke2dsc2wub3V0cHV0fSA9IGVuY29kZV9mbG9hdCh4KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7Z2V0R2xzbERpZmZlcmVuY2VzfSBmcm9tICcuL2dsc2xfdmVyc2lvbic7XG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7RU5DT0RFX0ZMT0FUX1NOSVBQRVR9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyX3V0aWwnO1xuaW1wb3J0IHtUZXh0dXJlVXNhZ2V9IGZyb20gJy4vdGV4X3V0aWwnO1xuXG5leHBvcnQgY2xhc3MgRW5jb2RlRmxvYXRQYWNrZWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHBhY2tlZElucHV0cyA9IHRydWU7XG4gIHBhY2tlZE91dHB1dCA9IGZhbHNlO1xuICBvdXRUZXhVc2FnZSA9IFRleHR1cmVVc2FnZS5ET1dOTE9BRDtcblxuICBjb25zdHJ1Y3RvcihvdXRwdXRTaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdKSB7XG4gICAgY29uc3QgZ2xzbCA9IGdldEdsc2xEaWZmZXJlbmNlcygpO1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgJHtFTkNPREVfRkxPQVRfU05JUFBFVH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMyBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgZmxvYXQgeCA9IGdldENoYW5uZWwoZ2V0QUF0T3V0Q29vcmRzKCksIHZlYzIoY29vcmRzLnksIGNvb3Jkcy56KSk7XG4gICAgICAgICR7Z2xzbC5vdXRwdXR9ID0gZW5jb2RlX2Zsb2F0KHgpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtnZXRHbHNsRGlmZmVyZW5jZXN9IGZyb20gJy4vZ2xzbF92ZXJzaW9uJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtLCB1c2VTaGFwZVVuaWZvcm1zfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0ICogYXMgc2hhZGVyX3V0aWwgZnJvbSAnLi9zaGFkZXJfY29tcGlsZXJfdXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBFbmNvZGVNYXRyaXhQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW47XG4gIGN1c3RvbVVuaWZvcm1zID0gW3tuYW1lOiAndGV4U2hhcGUnLCB0eXBlOiAnaXZlYzInIGFzIGNvbnN0IH1dO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgb3V0cHV0U2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgaW5wdXRJc1Vuc2lnbmVkQnl0ZSA9IGZhbHNlKSB7XG4gICAgY29uc3QgZ2xzbCA9IGdldEdsc2xEaWZmZXJlbmNlcygpO1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICB0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMgPSB1c2VTaGFwZVVuaWZvcm1zKHRoaXMub3V0cHV0U2hhcGUubGVuZ3RoKTtcblxuICAgIGxldCBvdXRwdXQgPSBgcmVzdWx0YDtcbiAgICBpZiAoaW5wdXRJc1Vuc2lnbmVkQnl0ZSkge1xuICAgICAgb3V0cHV0ID0gYGZsb29yKHJlc3VsdCAqIDI1NS4gKyAwLjUpYDtcbiAgICB9XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgJHtcbiAgICAgICAgdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID8gc2hhZGVyX3V0aWwuZ2V0RmxhdEluZGV4RnJvbTNET3V0cHV0KCkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJfdXRpbC5nZXRGbGF0SW5kZXhGcm9tM0Qob3V0cHV0U2hhcGUpfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWMzIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuXG4gICAgICAgIGludCBmbGF0SW5kZXggPSBnZXRGbGF0SW5kZXgoY29vcmRzKTtcbiAgICAgICAgaW50IG9mZnNldCA9IGltb2QoZmxhdEluZGV4LCA0KTtcblxuICAgICAgICBmbGF0SW5kZXggPSBpZGl2KGZsYXRJbmRleCwgNCwgMS4pO1xuXG4gICAgICAgIGludCByID0gZmxhdEluZGV4IC8gdGV4U2hhcGVbMV07XG4gICAgICAgIGludCBjID0gaW1vZChmbGF0SW5kZXgsIHRleFNoYXBlWzFdKTtcbiAgICAgICAgdmVjMiB1diA9ICh2ZWMyKGMsIHIpICsgaGFsZkNSKSAvIHZlYzIodGV4U2hhcGVbMV0sIHRleFNoYXBlWzBdKTtcbiAgICAgICAgdmVjNCB2YWx1ZXMgPSAke2dsc2wudGV4dHVyZTJEfShBLCB1dik7XG5cbiAgICAgICAgZmxvYXQgcmVzdWx0O1xuXG4gICAgICAgIGlmKG9mZnNldCA9PSAwKSB7XG4gICAgICAgICAgcmVzdWx0ID0gdmFsdWVzWzBdO1xuICAgICAgICB9IGVsc2UgaWYob2Zmc2V0ID09IDEpIHtcbiAgICAgICAgICByZXN1bHQgPSB2YWx1ZXNbMV07XG4gICAgICAgIH0gZWxzZSBpZihvZmZzZXQgPT0gMikge1xuICAgICAgICAgIHJlc3VsdCA9IHZhbHVlc1syXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQgPSB2YWx1ZXNbM107XG4gICAgICAgIH1cblxuICAgICAgICAke2dsc2wub3V0cHV0fSA9IHZlYzQoJHtvdXRwdXR9LCAwLiwgMC4sIDAuKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7Z2V0R2xzbERpZmZlcmVuY2VzfSBmcm9tICcuL2dsc2xfdmVyc2lvbic7XG5pbXBvcnQge0dQR1BVUHJvZ3JhbSwgdXNlU2hhcGVVbmlmb3Jtc30gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCAqIGFzIHNoYWRlcl91dGlsIGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyX3V0aWwnO1xuXG4vKlxuVGhpcyBpcyBob3cgdGhlIHNoYWRlciBlbmNvZGVzIGEgdGVuc29yIHdpdGggc2hhcGUgPSBbMiwgMywgNV1cbihpbmRpY2VzIGFyZSBbYmF0Y2gsIHJvdywgY29sXSkuXG5cbjAwMHwwMDEgICAwMDJ8MDAzICAgMDA0fHh4eCAgIDAyMHwwMjEgICAwMjJ8MDIzICAgMDI0fHh4eFxuLS0tLS0tLSAgIC0tLS0tLS0gICAtLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS0gICAtLS0tLS0tXG4wMTB8MDExICAgMDEyfDAxMyAgIDAxNHx4eHggICB4eHh8eHh4ICAgeHh4fHh4eCAgIHh4eHx4eHhcblxuMTAwfDEwMSAgIDEwMnwxMDMgICAxMDR8eHh4ICAgMTIwfDEyMSAgIDEyMnwxMjMgICAxMjR8eHh4XG4tLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS0gICAtLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS1cbjExMHwxMTEgICAxMTJ8MTEzICAgMTE0fHh4eCAgIHh4eHx4eHggICB4eHh8eHh4ICAgeHh4fHh4eFxuXG5TaW5nbGUgdGV4ZWxzIGNvbnRhaW4gb25seSB2YWx1ZXMgZnJvbSB0aGUgc2FtZSBiYXRjaCwgYW5kIGZyb20gYWRqYWNlbnQgcm93c1xuYW5kIGNvbHVtbnMuXG4gKi9cblxuZXhwb3J0IGNsYXNzIEVuY29kZU1hdHJpeFBhY2tlZFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydBJ107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgcGFja2VkSW5wdXRzID0gZmFsc2U7XG4gIHBhY2tlZE91dHB1dCA9IHRydWU7XG4gIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW47XG4gIGN1c3RvbVVuaWZvcm1zID0gW3tuYW1lOiAndGV4U2hhcGUnLCB0eXBlOiAnaXZlYzInIGFzIGNvbnN0IH1dO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgb3V0cHV0U2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgaW5wdXRJc1Vuc2lnbmVkQnl0ZSA9IGZhbHNlKSB7XG4gICAgY29uc3QgZ2xzbCA9IGdldEdsc2xEaWZmZXJlbmNlcygpO1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICB0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMgPSB1c2VTaGFwZVVuaWZvcm1zKHRoaXMub3V0cHV0U2hhcGUubGVuZ3RoKTtcblxuICAgIGxldCBtYWluTG9vcCA9ICcnO1xuICAgIGxldCBvdXRwdXQgPSAncmVzdWx0JztcbiAgICBpZiAoaW5wdXRJc1Vuc2lnbmVkQnl0ZSkge1xuICAgICAgb3V0cHV0ID0gJ2Zsb29yKHJlc3VsdCAqIDI1NS4gKyAwLjUpJztcbiAgICB9XG5cbiAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPD0gMTsgcm93KyspIHtcbiAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8PSAxOyBjb2wrKykge1xuICAgICAgICBjb25zdCBjaGFubmVsID0gcm93ICogMiArIGNvbDtcblxuICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgbG9jYWxDb29yZHMgPSBjb29yZHM7XG4gICAgICAgICAgaWYobG9jYWxDb29yZHNbMl0gKyAke2NvbH0gPCAke1xuICAgICAgICAgICAgdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID8gJ291dFNoYXBlWzJdJyA6IGAke291dHB1dFNoYXBlWzJdfWB9KSB7XG4gICAgICAgICAgbG9jYWxDb29yZHNbMl0gKz0gJHtjb2x9O1xuICAgICAgICAgIGlmIChsb2NhbENvb3Jkc1sxXSArICR7cm93fSA8ICR7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMgPyAnb3V0U2hhcGVbMV0nIDogYCR7b3V0cHV0U2hhcGVbMV19YH0pIHtcbiAgICAgICAgICAgIGxvY2FsQ29vcmRzWzFdICs9ICR7cm93fTtcblxuICAgICAgICAgICAgZmxhdEluZGV4ID0gZ2V0RmxhdEluZGV4KGxvY2FsQ29vcmRzKTtcbiAgICAgICAgICAgIG9mZnNldCA9IGltb2QoZmxhdEluZGV4LCA0KTtcblxuICAgICAgICAgICAgZmxhdEluZGV4ID0gaWRpdihmbGF0SW5kZXgsIDQsIDEuKTtcblxuICAgICAgICAgICAgaW50IHIgPSBmbGF0SW5kZXggLyB0ZXhTaGFwZVsxXTtcbiAgICAgICAgICAgIGludCBjID0gaW1vZChmbGF0SW5kZXgsIHRleFNoYXBlWzFdKTtcbiAgICAgICAgICAgIHZlYzIgdXYgPSAodmVjMihjLCByKSArIGhhbGZDUikgLyB2ZWMyKHRleFNoYXBlWzFdLCB0ZXhTaGFwZVswXSk7XG4gICAgICAgICAgICB2YWx1ZXMgPSAke2dsc2wudGV4dHVyZTJEfShBLCB1dik7XG5cbiAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gMCkge1xuICAgICAgICAgICAgICByZXN1bHRbJHtjaGFubmVsfV0gPSB2YWx1ZXNbMF07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9mZnNldCA9PSAxKSB7XG4gICAgICAgICAgICAgIHJlc3VsdFske2NoYW5uZWx9XSA9IHZhbHVlc1sxXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob2Zmc2V0ID09IDIpIHtcbiAgICAgICAgICAgICAgcmVzdWx0WyR7Y2hhbm5lbH1dID0gdmFsdWVzWzJdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzdWx0WyR7Y2hhbm5lbH1dID0gdmFsdWVzWzNdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBgO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAgICR7XG4gICAgICAgIHRoaXMuZW5hYmxlU2hhcGVVbmlmb3JtcyA/IHNoYWRlcl91dGlsLmdldEZsYXRJbmRleEZyb20zRE91dHB1dCgpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZGVyX3V0aWwuZ2V0RmxhdEluZGV4RnJvbTNEKG91dHB1dFNoYXBlKX1cblxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgaXZlYzMgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG5cbiAgICAgICAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoMC4pO1xuICAgICAgICAgIGludCBmbGF0SW5kZXgsIHIsIGMsIG9mZnNldDtcbiAgICAgICAgICBpdmVjMyBsb2NhbENvb3JkcztcbiAgICAgICAgICB2ZWMyIHV2O1xuICAgICAgICAgIHZlYzQgdmFsdWVzO1xuXG4gICAgICAgICAgJHttYWluTG9vcH1cblxuICAgICAgICAgICR7Z2xzbC5vdXRwdXR9ID0gJHtvdXRwdXR9O1xuICAgICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIEZGVFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydyZWFsJywgJ2ltYWcnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgY29tcG9uZW50OiAncmVhbCd8J2ltYWcnLCBpbnB1dFNoYXBlOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgaW52ZXJzZTogYm9vbGVhbikge1xuICAgIGNvbnN0IGlubmVyRGltID0gaW5wdXRTaGFwZVsxXTtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gaW5wdXRTaGFwZTtcblxuICAgIGNvbnN0IGV4cG9uZW50TXVsdGlwbGllclNuaXBwZXQgPVxuICAgICAgICBpbnZlcnNlID8gYDIuMCAqICR7TWF0aC5QSX1gIDogYC0yLjAgKiAke01hdGguUEl9YDtcbiAgICBjb25zdCByZXN1bHREZW5vbWluYXRvciA9IGludmVyc2UgPyBgJHtpbm5lckRpbX0uMGAgOiAnMS4wJztcblxuICAgIGxldCBvcFN0cmluZzogc3RyaW5nO1xuICAgIGlmIChjb21wb25lbnQgPT09ICdyZWFsJykge1xuICAgICAgb3BTdHJpbmcgPSAncmV0dXJuIHJlYWwgKiBleHBSIC0gaW1hZyAqIGV4cEk7JztcbiAgICB9IGVsc2UgaWYgKGNvbXBvbmVudCA9PT0gJ2ltYWcnKSB7XG4gICAgICBvcFN0cmluZyA9ICdyZXR1cm4gcmVhbCAqIGV4cEkgKyBpbWFnICogZXhwUjsnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEZGVCBjb21wb25lbnQgbXVzdCBiZSBlaXRoZXIgXCJyZWFsXCIgb3IgXCJpbWFnXCIsIGdvdCAke2NvbXBvbmVudH0uYCk7XG4gICAgfVxuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IGZsb2F0IGV4cG9uZW50TXVsdGlwbGllciA9ICR7ZXhwb25lbnRNdWx0aXBsaWVyU25pcHBldH07XG5cbiAgICAgIGZsb2F0IHVuYXJ5T3BDb21wbGV4KGZsb2F0IHJlYWwsIGZsb2F0IGV4cFIsIGZsb2F0IGltYWcsIGZsb2F0IGV4cEkpIHtcbiAgICAgICAgJHtvcFN0cmluZ31cbiAgICAgIH1cblxuICAgICAgZmxvYXQgbXVsTWF0REZUKGludCBiYXRjaCwgaW50IGluZGV4KSB7XG4gICAgICAgIGZsb2F0IGluZGV4UmF0aW8gPSBmbG9hdChpbmRleCkgLyBmbG9hdCgke2lubmVyRGltfSk7XG4gICAgICAgIGZsb2F0IGV4cG9uZW50TXVsdGlwbGllclRpbWVzSW5kZXhSYXRpbyA9XG4gICAgICAgICAgICBleHBvbmVudE11bHRpcGxpZXIgKiBpbmRleFJhdGlvO1xuXG4gICAgICAgIGZsb2F0IHJlc3VsdCA9IDAuMDtcblxuICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8ICR7aW5uZXJEaW19OyBpKyspIHtcbiAgICAgICAgICAvLyB4ID0gKC0yfDIgKiBQSSAvIE4pICogaW5kZXggKiBpO1xuICAgICAgICAgIGZsb2F0IHggPSBleHBvbmVudE11bHRpcGxpZXJUaW1lc0luZGV4UmF0aW8gKiBmbG9hdChpKTtcbiAgICAgICAgICBmbG9hdCBleHBSID0gY29zKHgpO1xuICAgICAgICAgIGZsb2F0IGV4cEkgPSBzaW4oeCk7XG4gICAgICAgICAgZmxvYXQgcmVhbCA9IGdldFJlYWwoYmF0Y2gsIGkpO1xuICAgICAgICAgIGZsb2F0IGltYWcgPSBnZXRJbWFnKGJhdGNoLCBpKTtcblxuICAgICAgICAgIHJlc3VsdCArPVxuICAgICAgICAgICAgICB1bmFyeU9wQ29tcGxleChyZWFsLCBleHBSLCBpbWFnLCBleHBJKSAvICR7cmVzdWx0RGVub21pbmF0b3J9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMiBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgc2V0T3V0cHV0KG11bE1hdERGVChjb29yZHNbMF0sIGNvb3Jkc1sxXSkpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5pbXBvcnQge1VuaWZvcm1UeXBlfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5cbmV4cG9ydCBjbGFzcyBGaWxsUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXM6IHN0cmluZ1tdO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW10gPSBbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgY3VzdG9tVW5pZm9ybXMgPSBbe25hbWU6ICd2YWx1ZScsIHR5cGU6ICdmbG9hdCcgYXMgVW5pZm9ybVR5cGV9XTtcblxuICBjb25zdHJ1Y3RvcihzaGFwZTogbnVtYmVyW10sIHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gc2hhcGU7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAvLyBJbnB1dCBjYW4gYmUgb2J0YWluZWQgZnJvbSB1bmlmb3JtIHZhbHVlLlxuICAgICAgICBzZXRPdXRwdXQodmFsdWUpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtkZXZpY2VfdXRpbCwgZW52fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge2dldE1heFRleHR1cmVzSW5TaGFkZXIsIGdldFdlYkdMRGlzam9pbnRRdWVyeVRpbWVyVmVyc2lvbiwgZ2V0V2ViR0xNYXhUZXh0dXJlU2l6ZSwgaXNDYXBhYmxlT2ZSZW5kZXJpbmdUb0Zsb2F0VGV4dHVyZSwgaXNEb3dubG9hZEZsb2F0VGV4dHVyZUVuYWJsZWQsIGlzV2ViR0xGZW5jZUVuYWJsZWQsIGlzV2ViR0xWZXJzaW9uRW5hYmxlZH0gZnJvbSAnLi93ZWJnbF91dGlsJztcblxuY29uc3QgRU5WID0gZW52KCk7XG5cbi8qKlxuICogVGhpcyBmaWxlIGNvbnRhaW5zIFdlYkdMLXNwZWNpZmljIGZsYWcgcmVnaXN0cmF0aW9ucy5cbiAqL1xuXG4vKipcbiAqIFRydWUgaWYgV2ViR0wgaXMgc3VwcG9ydGVkLlxuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdIQVNfV0VCR0wnLCAoKSA9PiBFTlYuZ2V0TnVtYmVyKCdXRUJHTF9WRVJTSU9OJykgPiAwKTtcblxuLyoqIDA6IE5vIFdlYkdMLCAxOiBXZWJHTCAxLjAsIDI6IFdlYkdMIDIuMC4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1dFQkdMX1ZFUlNJT04nLCAoKSA9PiB7XG4gIGlmIChpc1dlYkdMVmVyc2lvbkVuYWJsZWQoMikpIHtcbiAgICByZXR1cm4gMjtcbiAgfSBlbHNlIGlmIChpc1dlYkdMVmVyc2lvbkVuYWJsZWQoMSkpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuICByZXR1cm4gMDtcbn0pO1xuXG4vKiogV2hldGhlciB0byBjaGVjayBmb3IgbnVtZXJpY2FsIHJlcHJlc2VudGF0aW9uIHByb2JsZW1zLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfQ0hFQ0tfTlVNRVJJQ0FMX1BST0JMRU1TJywgKCkgPT4gZmFsc2UpO1xuXG5FTlYucmVnaXN0ZXJGbGFnKFxuICAgICdXRUJHTF9CVUZGRVJfU1VQUE9SVEVEJywgKCkgPT4gRU5WLmdldCgnV0VCR0xfVkVSU0lPTicpID09PSAyKTtcblxuLyoqIFdoZXRoZXIgdGhlIFdlYkdMIGJhY2tlbmQgd2lsbCBzb21ldGltZXMgZm9yd2FyZCBvcHMgdG8gdGhlIENQVS4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1dFQkdMX0NQVV9GT1JXQVJEJywgKCkgPT4gdHJ1ZSk7XG5cbi8qKiBXaGV0aGVyIHRoZSBXZWJHTCBiYWNrZW5kIHdpbGwgYWx3YXlzIHVzZSBmMTYgdGV4dHVyZXMgZm9yIHJlbmRlcmluZy4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1dFQkdMX0ZPUkNFX0YxNl9URVhUVVJFUycsICgpID0+IGZhbHNlKTtcblxuLyoqIFdoZXRoZXIgdG8gdHVybiBhbGwgcGFja2luZyByZWxhdGVkIGZsYWdzIG9uLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfUEFDSycsICgpID0+IEVOVi5nZXRCb29sKCdIQVNfV0VCR0wnKSk7XG5cbi8qKiBXaGV0aGVyIHdlIHdpbGwgcGFjayB0aGUgYmF0Y2hub3JtYWxpemF0aW9uIG9wLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfUEFDS19OT1JNQUxJWkFUSU9OJywgKCkgPT4gRU5WLmdldEJvb2woJ1dFQkdMX1BBQ0snKSk7XG5cbi8qKiBXaGV0aGVyIHdlIHdpbGwgcGFjayB0aGUgY2xpcCBvcC4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1dFQkdMX1BBQ0tfQ0xJUCcsICgpID0+IEVOVi5nZXRCb29sKCdXRUJHTF9QQUNLJykpO1xuXG4vKiogV2hldGhlciB3ZSB3aWxsIHBhY2sgdGhlIGRlcHRod2lzZSBjb252IG9wLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfUEFDS19ERVBUSFdJU0VDT05WJywgKCkgPT4gRU5WLmdldEJvb2woJ1dFQkdMX1BBQ0snKSk7XG5cbi8qKiBXaGV0aGVyIHdlIHdpbGwgcGFjayBiaW5hcnkgb3BzLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZyhcbiAgICAnV0VCR0xfUEFDS19CSU5BUllfT1BFUkFUSU9OUycsICgpID0+IEVOVi5nZXRCb29sKCdXRUJHTF9QQUNLJykpO1xuXG4vKiogV2hldGhlciB3ZSB3aWxsIHBhY2sgdW5hcnkgb3BzLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZyhcbiAgICAnV0VCR0xfUEFDS19VTkFSWV9PUEVSQVRJT05TJywgKCkgPT4gRU5WLmdldEJvb2woJ1dFQkdMX1BBQ0snKSk7XG5cbi8qKiBXaGV0aGVyIHdlIHdpbGwgcGFjayBhcnJheSBvcHMuICovXG5FTlYucmVnaXN0ZXJGbGFnKFxuICAgICdXRUJHTF9QQUNLX0FSUkFZX09QRVJBVElPTlMnLCAoKSA9PiBFTlYuZ2V0Qm9vbCgnV0VCR0xfUEFDSycpKTtcblxuLyoqIFdoZXRoZXIgd2Ugd2lsbCBwYWNrIGltYWdlIG9wcy4gKi9cbkVOVi5yZWdpc3RlckZsYWcoXG4gICAgJ1dFQkdMX1BBQ0tfSU1BR0VfT1BFUkFUSU9OUycsICgpID0+IEVOVi5nZXRCb29sKCdXRUJHTF9QQUNLJykpO1xuXG4vKiogV2hldGhlciB3ZSB3aWxsIHBhY2sgcmVkdWNlIG9wcy4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1dFQkdMX1BBQ0tfUkVEVUNFJywgKCkgPT4gRU5WLmdldEJvb2woJ1dFQkdMX1BBQ0snKSk7XG5cbi8qKiBXaGV0aGVyIHBhY2tlZCBXZWJHTCBrZXJuZWxzIGxhemlseSB1bnBhY2sgdGhlaXIgb3V0cHV0cy4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1dFQkdMX0xBWklMWV9VTlBBQ0snLCAoKSA9PiBFTlYuZ2V0Qm9vbCgnV0VCR0xfUEFDSycpKTtcblxuLyoqIFdoZXRoZXIgd2Ugd2lsbCB1c2UgdGhlIGltMmNvbCBhbGdvcml0aG0gdG8gc3BlZWQgdXAgY29udm9sdXRpb25zLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfQ09OVl9JTTJDT0wnLCAoKSA9PiBFTlYuZ2V0Qm9vbCgnV0VCR0xfUEFDSycpKTtcblxuLyoqIFRoZSBtYXhpbXVtIHRleHR1cmUgZGltZW5zaW9uLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZyhcbiAgICAnV0VCR0xfTUFYX1RFWFRVUkVfU0laRScsXG4gICAgKCkgPT4gZ2V0V2ViR0xNYXhUZXh0dXJlU2l6ZShFTlYuZ2V0TnVtYmVyKCdXRUJHTF9WRVJTSU9OJykpKTtcblxuLyoqIFRoZSBtYXhpbXVtIHRleHR1cmUgZGltZW5zaW9uLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZyhcbiAgICAnV0VCR0xfTUFYX1RFWFRVUkVTX0lOX1NIQURFUicsXG4gICAgKCkgPT4gZ2V0TWF4VGV4dHVyZXNJblNoYWRlcihFTlYuZ2V0TnVtYmVyKCdXRUJHTF9WRVJTSU9OJykpKTtcblxuLyoqXG4gKiBUaGUgZGlzam9pbnRfcXVlcnlfdGltZXIgZXh0ZW5zaW9uIHZlcnNpb24uXG4gKiAwOiBkaXNhYmxlZCwgMTogRVhUX2Rpc2pvaW50X3RpbWVyX3F1ZXJ5LCAyOlxuICogRVhUX2Rpc2pvaW50X3RpbWVyX3F1ZXJ5X3dlYmdsMi5cbiAqIEluIEZpcmVmb3ggd2l0aCBXZWJHTCAyLjAsXG4gKiBFWFRfZGlzam9pbnRfdGltZXJfcXVlcnlfd2ViZ2wyIGlzIG5vdCBhdmFpbGFibGUsIHNvIHdlIG11c3QgdXNlIHRoZVxuICogV2ViR0wgMS4wIGV4dGVuc2lvbi5cbiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1ZFUlNJT04nLCAoKSA9PiB7XG4gIGNvbnN0IHdlYkdMVmVyc2lvbiA9IEVOVi5nZXROdW1iZXIoJ1dFQkdMX1ZFUlNJT04nKTtcblxuICBpZiAod2ViR0xWZXJzaW9uID09PSAwKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgcmV0dXJuIGdldFdlYkdMRGlzam9pbnRRdWVyeVRpbWVyVmVyc2lvbih3ZWJHTFZlcnNpb24pO1xufSk7XG5cbi8qKlxuICogV2hldGhlciB0aGUgdGltZXIgb2JqZWN0IGZyb20gdGhlIGRpc2pvaW50X3F1ZXJ5X3RpbWVyIGV4dGVuc2lvbiBnaXZlc1xuICogdGltaW5nIGluZm9ybWF0aW9uIHRoYXQgaXMgcmVsaWFibGUuXG4gKi9cbkVOVi5yZWdpc3RlckZsYWcoXG4gICAgJ1dFQkdMX0RJU0pPSU5UX1FVRVJZX1RJTUVSX0VYVEVOU0lPTl9SRUxJQUJMRScsXG4gICAgKCkgPT4gRU5WLmdldE51bWJlcignV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1ZFUlNJT04nKSA+IDAgJiZcbiAgICAgICAgIWRldmljZV91dGlsLmlzTW9iaWxlKCkpO1xuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGRldmljZSBpcyBwaHlzaWNhbGx5IGNhcGFibGUgb2YgcmVuZGVyaW5nIHRvIGZsb2F0MzIgdGV4dHVyZXMuXG4gKi9cbkVOVi5yZWdpc3RlckZsYWcoXG4gICAgJ1dFQkdMX1JFTkRFUl9GTE9BVDMyX0NBUEFCTEUnLFxuICAgICgpID0+IGlzQ2FwYWJsZU9mUmVuZGVyaW5nVG9GbG9hdFRleHR1cmUoRU5WLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpKSk7XG5cbi8qKlxuICogV2hldGhlciByZW5kZXJpbmcgdG8gZmxvYXQzMiB0ZXh0dXJlcyBpcyBlbmFibGVkLiBJZiBkaXNhYmxlZCwgcmVuZGVycyB0b1xuICogZmxvYXQxNiB0ZXh0dXJlcy5cbiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfUkVOREVSX0ZMT0FUMzJfRU5BQkxFRCcsICgpID0+IHtcbiAgcmV0dXJuIEVOVi5nZXRCb29sKCdXRUJHTF9GT1JDRV9GMTZfVEVYVFVSRVMnKSA/XG4gICAgICBmYWxzZSA6XG4gICAgICBFTlYuZ2V0Qm9vbCgnV0VCR0xfUkVOREVSX0ZMT0FUMzJfQ0FQQUJMRScpO1xufSk7XG5cbi8qKlxuICogV2hldGhlciBkb3dubG9hZGluZyBmbG9hdCB0ZXh0dXJlcyBpcyBlbmFibGVkICgxNiBvciAzMiBiaXQpLiBJZiBkaXNhYmxlZCxcbiAqIHVzZXMgSUVFRSA3NTQgZW5jb2Rpbmcgb2YgdGhlIGZsb2F0MzIgdmFsdWVzIHRvIDQgdWludDggd2hlbiBkb3dubG9hZGluZy5cbiAqL1xuRU5WLnJlZ2lzdGVyRmxhZyhcbiAgICAnV0VCR0xfRE9XTkxPQURfRkxPQVRfRU5BQkxFRCcsXG4gICAgKCkgPT4gaXNEb3dubG9hZEZsb2F0VGV4dHVyZUVuYWJsZWQoRU5WLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpKSk7XG5cbi8qKiBXaGV0aGVyIHRoZSBmZW5jZSBBUEkgaXMgYXZhaWxhYmxlLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZyhcbiAgICAnV0VCR0xfRkVOQ0VfQVBJX0VOQUJMRUQnLFxuICAgICgpID0+IGlzV2ViR0xGZW5jZUVuYWJsZWQoRU5WLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpKSk7XG5cbi8qKlxuICogVGVuc29ycyB3aXRoIHNpemUgPD0gdGhhbiB0aGlzIHdpbGwgYmUgdXBsb2FkZWQgYXMgdW5pZm9ybXMsIG5vdCB0ZXh0dXJlcy5cbiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfU0laRV9VUExPQURfVU5JRk9STScsICgpID0+IHtcbiAgLy8gVXNlIHVuaWZvcm0gdXBsb2FkcyBvbmx5IHdoZW4gMzJiaXQgZmxvYXRzIGFyZSBzdXBwb3J0ZWQuIEluXG4gIC8vIDE2Yml0XG4gIC8vIGVudmlyb25tZW50cyB0aGVyZSBhcmUgcHJvYmxlbXMgd2l0aCBjb21wYXJpbmcgYSAxNmJpdCB0ZXh0dXJlIHZhbHVlXG4gIC8vIHdpdGggYSAzMmJpdCB1bmlmb3JtIHZhbHVlLlxuICBjb25zdCB1c2VVbmlmb3JtcyA9IEVOVi5nZXRCb29sKCdXRUJHTF9SRU5ERVJfRkxPQVQzMl9FTkFCTEVEJyk7XG4gIHJldHVybiB1c2VVbmlmb3JtcyA/IDQgOiAwO1xufSk7XG5cbi8qKlxuICogSWYgdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyBhbGxvY2F0ZWQgb24gdGhlIEdQVSBpcyBncmVhdGVyIHRoYW4gdGhpc1xuICogbnVtYmVyLCB3ZSB3aWxsIGFnZ3Jlc3NpdmVseSBkZWxldGUgdGV4dHVyZXMgdXBvbiBkaXNwb3NhbCB3aXRoXG4gKiBnbC5kZWxldGVNYXRyaXhUZXh0dXJlLCByYXRoZXIgdGhhbiBtYWtpbmcgdGhlbSBhdmFpbGFibGUgZm9yIHJldXNlLlxuICpcbiAqIERlZmF1bHQgdmFsdWUgLTEgaW5kaWNhdGVzIHRoYXQgd2Ugd2lsbCBuZXZlciBhZ2dyZXNzaXZlbHkgZGVsZXRlIHRleHR1cmVzLlxuICovXG5FTlYucmVnaXN0ZXJGbGFnKFxuICAgICdXRUJHTF9ERUxFVEVfVEVYVFVSRV9USFJFU0hPTEQnLFxuICAgICgpID0+IHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9LFxuICAgIHRocmVzaG9sZCA9PiB7XG4gICAgICBpZiAodGhyZXNob2xkIDwgMCAmJiB0aHJlc2hvbGQgIT09IC0xKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBXRUJHTF9ERUxFVEVfVEVYVFVSRV9USFJFU0hPTEQgbXVzdCBiZSAtMSAoaW5kaWNhdGluZyBuZXZlciBgICtcbiAgICAgICAgICAgIGBkZWxldGUpIG9yIGF0IGxlYXN0IDAsIGJ1dCBnb3QgJHt0aHJlc2hvbGR9LmApO1xuICAgICAgfVxuICAgIH0pO1xuXG4vKipcbiAqIFRyaWdnZXIgYSBtYW51YWwgR0wgY29tbWFuZCBmbHVzaCBpZiB0aGUgdGhyZXNob2xkIG9mIHRpbWUgaGFzIHBhc3NlZCBzaW5jZVxuICogcHJldmlvdXMgS2VybmVsIGV4ZWN1dGlvbi4gVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBBbmRvcmlkIGRldmljZSB3aGVyZSBHTFxuICogY29tbWFuZCBmbHVzaCBhcmUgZGVsYXllZCB1biB0aWwgdGhlIGVuZCBvZiBqYXZhc2NyaXB0IHRhc2suIFRoaXMgdmFsdWUgaXNcbiAqIG1lYXN1cmVkIGluIG1pbGxpc2Vjb25kLiBUeXBpY2FsbHkgeW91IHdhbnQgdG8gc2V0IHRoaXMgdmFsdWUgdG8gY2xvc2UgdG8gMS5cbiAqXG4gKiBEZWZhdWx0IHZhbHVlIDEgZm9yIG1vYmlsZSBjaHJvbWUsIGFuZCAtMSBmb3IgcmVzdCBjYXNlcy4gLTEgaW5kaWNhdGVzIHRoYXRcbiAqIHdlIHdpbGwgbm90IGVuZm9yY2UgbWFudWFsIGZsdXNoIGFuZCBkZXBlbmQgb24gc3lzdGVtIGRlZmF1bHQgZmx1c2ggc2NoZWR1bGUuXG4gKi9cbkVOVi5yZWdpc3RlckZsYWcoXG4gICAgJ1dFQkdMX0ZMVVNIX1RIUkVTSE9MRCcsXG4gICAgKCkgPT4ge1xuICAgICAgcmV0dXJuIGRldmljZV91dGlsLmlzTW9iaWxlKCkgJiYgRU5WLmdldEJvb2woJ0lTX0NIUk9NRScpID8gMSA6IC0xO1xuICAgIH0sXG4gICAgdGhyZXNob2xkID0+IHtcbiAgICAgIGlmICh0aHJlc2hvbGQgPCAwICYmIHRocmVzaG9sZCAhPT0gLTEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFdFQkdMX0ZMVVNIX1RIUkVTSE9MRCBtdXN0IGJlIC0xIChpbmRpY2F0aW5nIG5ldmVyIGAgK1xuICAgICAgICAgICAgYG1hbnVhbCBmbHVzaCkgb3IgYXQgbGVhc3QgMCwgYnV0IGdvdCAke3RocmVzaG9sZH0uYCk7XG4gICAgICB9XG4gICAgfSk7XG5cbi8qKlxuICogVGhyZXNob2xkIGZvciBpbnB1dCB0ZW5zb3Igc2l6ZSB0aGF0IGRldGVybWluZXMgd2hldGhlciBXZWJHTCBiYWNrZW5kIHdpbGxcbiAqIGRlbGVnYXRlIGNvbXB1dGF0aW9uIHRvIENQVS5cbiAqXG4gKiBEZWZhdWx0IHZhbHVlIGlzIDEyOC5cbiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnQ1BVX0hBTkRPRkZfU0laRV9USFJFU0hPTEQnLCAoKSA9PiAxMjgpO1xuXG4vKiogV2hldGhlciB3ZSB3aWxsIHVzZSBzaGFwZXMgdW5pZm9ybXMuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdXRUJHTF9VU0VfU0hBUEVTX1VOSUZPUk1TJywgKCkgPT4gZmFsc2UpO1xuXG4vKipcbiAqIFRocmVzaG9sZCBmb3IgbGFzdCBkaW1lbnNpb24gb2YgaW5wdXQgdGVuc29yIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyXG4gKiBXZWJHTCBiYWNrZW5kIGZvciB0aGUgVG9wIEsgb3Agd2lsbCBkZWxlZ2F0ZSBjb21wdXRhdGlvbiB0byBDUFUuIElmIGlucHV0XG4gKiBpcyBzbWFsbGVyIHRoYW4gdGhyZXNob2xkIHRoZW4gQ1BVIHdpbGwgYmUgdXNlZFxuICpcbiAqIERlZmF1bHQgdmFsdWUgaXMgMTAwMDAwLlxuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdUT1BLX0xBU1RfRElNX0NQVV9IQU5ET0ZGX1NJWkVfVEhSRVNIT0xEJywgKCkgPT4gMTAwMDAwKTtcblxuLyoqXG4gKiBUaHJlc2hvbGQgZm9yIEsgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXJcbiAqIFdlYkdMIGJhY2tlbmQgZm9yIHRoZSBUb3AgSyBvcCB3aWxsIGRlbGVnYXRlIGNvbXB1dGF0aW9uIHRvIENQVS4gSWYga1xuICogaXMgbGFyZ2VyIHRoYW4gdGhyZXNob2xkIHRoZW4gQ1BVIHdpbGwgYmUgdXNlZFxuICpcbiAqIERlZmF1bHQgdmFsdWUgaXMgMTI4LlxuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdUT1BLX0tfQ1BVX0hBTkRPRkZfVEhSRVNIT0xEJywgKCkgPT4gMTI4KTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBGbGlwTGVmdFJpZ2h0UHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ0ltYWdlJ107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXSA9IFtdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGltYWdlU2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdKSB7XG4gICAgY29uc3QgaW1hZ2VXaWR0aCA9IGltYWdlU2hhcGVbMl07XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGltYWdlU2hhcGU7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgICAgaW50IHggPSBjb29yZHNbMl07XG5cbiAgICAgICAgICBpbnQgY29vcmRYID0gJHtpbWFnZVdpZHRofSAtIHggLSAxO1xuICAgICAgICAgIGZsb2F0IG91dHB1dFZhbHVlO1xuICAgICAgICAgIGlmKGNvb3JkWCA+PSAwICYmIGNvb3JkWCA8ICR7aW1hZ2VXaWR0aH0pIHtcbiAgICAgICAgICAgIG91dHB1dFZhbHVlID0gZ2V0SW1hZ2UoY29vcmRzWzBdLCBjb29yZHNbMV0sIGNvb3JkWCwgY29vcmRzWzNdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0cHV0VmFsdWUgPSBnZXRJbWFnZShjb29yZHNbMF0sIGNvb3Jkc1sxXSwgY29vcmRzWzJdLCBjb29yZHNbM10pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZXRPdXRwdXQob3V0cHV0VmFsdWUpO1xuICAgICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7Z2V0Q29vcmRzRGF0YVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuZXhwb3J0IGNsYXNzIEdhdGhlclByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydBJywgJ2luZGljZXMnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICByYW5rOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoYVNoYXBlOiBudW1iZXJbXSwgb3V0cHV0U2hhcGU6IG51bWJlcltdKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IG91dHB1dFNoYXBlO1xuICAgIHRoaXMucmFuayA9IG91dHB1dFNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBkdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHRoaXMucmFuayk7XG4gICAgY29uc3Qgc291cmNlQ29vcmRzID0gZ2V0U291cmNlQ29vcmRzKGFTaGFwZSwgMik7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke2R0eXBlfSByZXNSQyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBzZXRPdXRwdXQoZ2V0QSgke3NvdXJjZUNvb3Jkc30pKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG5cbi8vIFRoZSBpbnB1dCBhbmQgb3V0cHV0IGFyZSBhbHdheXMgZmxhdHRlbmVkIGludG8gcmFuayA0IHRlbnNvcnMuXG5mdW5jdGlvbiBnZXRTb3VyY2VDb29yZHMoYVNoYXBlOiBudW1iZXJbXSwgYXhpczogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgY3VycmVudENvb3JkcyA9IFsncmVzUkMueCcsICdyZXNSQy55JywgJ3Jlc1JDLnonLCAncmVzUkMudyddO1xuXG4gIGNvbnN0IHNvdXJjZUNvb3JkcyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFTaGFwZS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChpID09PSAyKSB7XG4gICAgICBzb3VyY2VDb29yZHMucHVzaCgnaW50KGdldEluZGljZXMocmVzUkMueCwgcmVzUkMueikpJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNvdXJjZUNvb3Jkcy5wdXNoKGAke2N1cnJlbnRDb29yZHNbaV19YCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzb3VyY2VDb29yZHMuam9pbigpO1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5pbXBvcnQge2dldENvb3Jkc0RhdGFUeXBlfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5cbmV4cG9ydCBjbGFzcyBHYXRoZXJORFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWyd4JywgJ2luZGljZXMnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBjb25zdHJ1Y3RvcihcbiAgICAgIHByaXZhdGUgc2xpY2VEaW06IG51bWJlciwgcHJpdmF0ZSBzdHJpZGVzOiBudW1iZXJbXSwgc2hhcGU6IG51bWJlcltdKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IHNoYXBlO1xuICAgIGNvbnN0IHN0cmlkZXNUeXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUoc3RyaWRlcy5sZW5ndGgpO1xuICAgIGNvbnN0IGR0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUoc2hhcGUubGVuZ3RoKTtcbiAgICBjb25zdCBzdHJpZGVTdHJpbmcgPSB0aGlzLnNsaWNlRGltID4gMSA/ICdzdHJpZGVzW2pdJyA6ICdzdHJpZGVzJztcbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgICAke3N0cmlkZXNUeXBlfSBzdHJpZGVzID0gJHtzdHJpZGVzVHlwZX0oJHt0aGlzLnN0cmlkZXN9KTtcbiAgICAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgICAke2R0eXBlfSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgICBpbnQgZmxhdHRlbkluZGV4ID0gMDtcbiAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8ICR7dGhpcy5zbGljZURpbX07IGorKykge1xuICAgICAgICAgICAgaW50IGluZGV4ID0gcm91bmQoZ2V0SW5kaWNlcyhjb29yZHNbMF0sIGopKTtcbiAgICAgICAgICAgIGZsYXR0ZW5JbmRleCArPSBpbmRleCAqICR7c3RyaWRlU3RyaW5nfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2V0T3V0cHV0KGdldFgoZmxhdHRlbkluZGV4LCBjb29yZHNbMV0pKTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtlbnZ9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmV4cG9ydCB0eXBlIEdMU0wgPSB7XG4gIHZlcnNpb246IHN0cmluZyxcbiAgYXR0cmlidXRlOiBzdHJpbmcsXG4gIHZhcnlpbmdWczogc3RyaW5nLFxuICB2YXJ5aW5nRnM6IHN0cmluZyxcbiAgdGV4dHVyZTJEOiBzdHJpbmcsXG4gIG91dHB1dDogc3RyaW5nLFxuICBkZWZpbmVPdXRwdXQ6IHN0cmluZyxcbiAgZGVmaW5lU3BlY2lhbE5hTjogc3RyaW5nLFxuICBkZWZpbmVTcGVjaWFsSW5mOiBzdHJpbmcsXG4gIGRlZmluZVJvdW5kOiBzdHJpbmdcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHbHNsRGlmZmVyZW5jZXMoKTogR0xTTCB7XG4gIGxldCB2ZXJzaW9uOiBzdHJpbmc7XG4gIGxldCBhdHRyaWJ1dGU6IHN0cmluZztcbiAgbGV0IHZhcnlpbmdWczogc3RyaW5nO1xuICBsZXQgdmFyeWluZ0ZzOiBzdHJpbmc7XG4gIGxldCB0ZXh0dXJlMkQ6IHN0cmluZztcbiAgbGV0IG91dHB1dDogc3RyaW5nO1xuICBsZXQgZGVmaW5lT3V0cHV0OiBzdHJpbmc7XG4gIGxldCBkZWZpbmVTcGVjaWFsTmFOOiBzdHJpbmc7XG4gIGxldCBkZWZpbmVTcGVjaWFsSW5mOiBzdHJpbmc7XG4gIGxldCBkZWZpbmVSb3VuZDogc3RyaW5nO1xuXG4gIGlmIChlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX1ZFUlNJT04nKSA9PT0gMikge1xuICAgIHZlcnNpb24gPSAnI3ZlcnNpb24gMzAwIGVzJztcbiAgICBhdHRyaWJ1dGUgPSAnaW4nO1xuICAgIHZhcnlpbmdWcyA9ICdvdXQnO1xuICAgIHZhcnlpbmdGcyA9ICdpbic7XG4gICAgdGV4dHVyZTJEID0gJ3RleHR1cmUnO1xuICAgIG91dHB1dCA9ICdvdXRwdXRDb2xvcic7XG4gICAgZGVmaW5lT3V0cHV0ID0gJ291dCB2ZWM0IG91dHB1dENvbG9yOyc7XG5cbiAgICAvLyBVc2UgY3VzdG9tIGlzbmFuIGRlZmluaXRpb24gdG8gd29yayBhY3Jvc3MgZGlmZmVyZW5jZXMgYmV0d2VlblxuICAgIC8vIGltcGxlbWVudGF0aW9ucyBvbiB2YXJpb3VzIHBsYXRmb3Jtcy4gV2hpbGUgdGhpcyBzaG91bGQgaGFwcGVuIGluIEFOR0xFXG4gICAgLy8gd2Ugc3RpbGwgc2VlIGRpZmZlcmVuY2VzIGJldHdlZW4gYW5kcm9pZCBhbmQgd2luZG93cyAob24gY2hyb21lKSB3aGVuXG4gICAgLy8gdXNpbmcgaXNuYW4gZGlyZWN0bHkuXG4gICAgZGVmaW5lU3BlY2lhbE5hTiA9IGBcbiAgICAgIGJvb2wgaXNuYW5fY3VzdG9tKGZsb2F0IHZhbCkge1xuICAgICAgICByZXR1cm4gKHZhbCA+IDAuMCB8fCB2YWwgPCAwLjApID8gZmFsc2UgOiB2YWwgIT0gMC4wO1xuICAgICAgfVxuXG4gICAgICBidmVjNCBpc25hbl9jdXN0b20odmVjNCB2YWwpIHtcbiAgICAgICAgcmV0dXJuIGJ2ZWM0KGlzbmFuX2N1c3RvbSh2YWwueCksXG4gICAgICAgICAgaXNuYW5fY3VzdG9tKHZhbC55KSwgaXNuYW5fY3VzdG9tKHZhbC56KSwgaXNuYW5fY3VzdG9tKHZhbC53KSk7XG4gICAgICB9XG5cbiAgICAgICNkZWZpbmUgaXNuYW4odmFsdWUpIGlzbmFuX2N1c3RvbSh2YWx1ZSlcbiAgICBgO1xuICAgIC8vIEluIHdlYmdsIDIgd2UgZG8gbm90IG5lZWQgdG8gc3BlY2lmeSBhIGN1c3RvbSBpc2luZiBzbyB0aGVyZSBpcyBub1xuICAgIC8vIG5lZWQgZm9yIGEgc3BlY2lhbCBJTkZJTklUWSBjb25zdGFudC5cbiAgICBkZWZpbmVTcGVjaWFsSW5mID0gYGA7XG4gICAgZGVmaW5lUm91bmQgPSBgXG4gICAgICAjZGVmaW5lIHJvdW5kKHZhbHVlKSBuZXdSb3VuZCh2YWx1ZSlcbiAgICAgIGludCBuZXdSb3VuZChmbG9hdCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gaW50KGZsb29yKHZhbHVlICsgMC41KSk7XG4gICAgICB9XG5cbiAgICAgIGl2ZWM0IG5ld1JvdW5kKHZlYzQgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGl2ZWM0KGZsb29yKHZhbHVlICsgdmVjNCgwLjUpKSk7XG4gICAgICB9XG4gICAgYDtcbiAgfSBlbHNlIHtcbiAgICB2ZXJzaW9uID0gJyc7XG4gICAgYXR0cmlidXRlID0gJ2F0dHJpYnV0ZSc7XG4gICAgdmFyeWluZ1ZzID0gJ3ZhcnlpbmcnO1xuICAgIHZhcnlpbmdGcyA9ICd2YXJ5aW5nJztcbiAgICB0ZXh0dXJlMkQgPSAndGV4dHVyZTJEJztcbiAgICBvdXRwdXQgPSAnZ2xfRnJhZ0NvbG9yJztcbiAgICBkZWZpbmVPdXRwdXQgPSAnJztcbiAgICAvLyBXZWJHTDEgaGFzIG5vIGJ1aWx0IGluIGlzbmFuIHNvIHdlIGRlZmluZSBvbmUgaGVyZS5cbiAgICBkZWZpbmVTcGVjaWFsTmFOID0gYFxuICAgICAgI2RlZmluZSBpc25hbih2YWx1ZSkgaXNuYW5fY3VzdG9tKHZhbHVlKVxuICAgICAgYm9vbCBpc25hbl9jdXN0b20oZmxvYXQgdmFsKSB7XG4gICAgICAgIHJldHVybiAodmFsID4gMC4gfHwgdmFsIDwgMS4gfHwgdmFsID09IDAuKSA/IGZhbHNlIDogdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGJ2ZWM0IGlzbmFuX2N1c3RvbSh2ZWM0IHZhbCkge1xuICAgICAgICByZXR1cm4gYnZlYzQoaXNuYW4odmFsLngpLCBpc25hbih2YWwueSksIGlzbmFuKHZhbC56KSwgaXNuYW4odmFsLncpKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIGRlZmluZVNwZWNpYWxJbmYgPSBgXG4gICAgICB1bmlmb3JtIGZsb2F0IElORklOSVRZO1xuXG4gICAgICBib29sIGlzaW5mKGZsb2F0IHZhbCkge1xuICAgICAgICByZXR1cm4gYWJzKHZhbCkgPT0gSU5GSU5JVFk7XG4gICAgICB9XG4gICAgICBidmVjNCBpc2luZih2ZWM0IHZhbCkge1xuICAgICAgICByZXR1cm4gZXF1YWwoYWJzKHZhbCksIHZlYzQoSU5GSU5JVFkpKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIGRlZmluZVJvdW5kID0gYFxuICAgICAgaW50IHJvdW5kKGZsb2F0IHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBpbnQoZmxvb3IodmFsdWUgKyAwLjUpKTtcbiAgICAgIH1cblxuICAgICAgaXZlYzQgcm91bmQodmVjNCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gaXZlYzQoZmxvb3IodmFsdWUgKyB2ZWM0KDAuNSkpKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB2ZXJzaW9uLFxuICAgIGF0dHJpYnV0ZSxcbiAgICB2YXJ5aW5nVnMsXG4gICAgdmFyeWluZ0ZzLFxuICAgIHRleHR1cmUyRCxcbiAgICBvdXRwdXQsXG4gICAgZGVmaW5lT3V0cHV0LFxuICAgIGRlZmluZVNwZWNpYWxOYU4sXG4gICAgZGVmaW5lU3BlY2lhbEluZixcbiAgICBkZWZpbmVSb3VuZFxuICB9O1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2VudiwgUGl4ZWxEYXRhLCBUeXBlZEFycmF5LCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge2dldFdlYkdMQ29udGV4dCwgc2V0V2ViR0xDb250ZXh0fSBmcm9tICcuL2NhbnZhc191dGlsJztcbmltcG9ydCAqIGFzIGdwZ3B1X3V0aWwgZnJvbSAnLi9ncGdwdV91dGlsJztcbmltcG9ydCAqIGFzIHRleF91dGlsIGZyb20gJy4vdGV4X3V0aWwnO1xuaW1wb3J0IHtUZXh0dXJlQ29uZmlnfSBmcm9tICcuL3RleF91dGlsJztcbmltcG9ydCB7V2ViR0wxRGlzam9pbnRRdWVyeVRpbWVyRXh0ZW5zaW9uLCBXZWJHTDJEaXNqb2ludFF1ZXJ5VGltZXJFeHRlbnNpb259IGZyb20gJy4vd2ViZ2xfdHlwZXMnO1xuaW1wb3J0ICogYXMgd2ViZ2xfdXRpbCBmcm9tICcuL3dlYmdsX3V0aWwnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZlbmNlQ29udGV4dCB7XG4gIHF1ZXJ5OiBXZWJHTFF1ZXJ5fFdlYkdMU3luYztcbiAgaXNGZW5jZVBhc3NlZCgpOiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgR1BHUFVDb250ZXh0IHtcbiAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dDtcbiAgdGV4dHVyZUZsb2F0RXh0ZW5zaW9uOiB7fTtcbiAgdGV4dHVyZUhhbGZGbG9hdEV4dGVuc2lvbjoge307XG4gIGNvbG9yQnVmZmVyRmxvYXRFeHRlbnNpb246IHt9O1xuICBjb2xvckJ1ZmZlckhhbGZGbG9hdEV4dGVuc2lvbjoge307XG4gIGRpc2pvaW50UXVlcnlUaW1lckV4dGVuc2lvbjogV2ViR0wyRGlzam9pbnRRdWVyeVRpbWVyRXh0ZW5zaW9ufFxuICAgICAgV2ViR0wxRGlzam9pbnRRdWVyeVRpbWVyRXh0ZW5zaW9uO1xuICB2ZXJ0ZXhCdWZmZXI6IFdlYkdMQnVmZmVyO1xuICBpbmRleEJ1ZmZlcjogV2ViR0xCdWZmZXI7XG4gIGZyYW1lYnVmZmVyOiBXZWJHTEZyYW1lYnVmZmVyO1xuICBvdXRwdXRUZXh0dXJlOiBXZWJHTFRleHR1cmV8bnVsbCA9IG51bGw7XG4gIHByb2dyYW06IFdlYkdMUHJvZ3JhbXxudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBkaXNwb3NlZCA9IGZhbHNlO1xuICBwcml2YXRlIGRpc2pvaW50OiBib29sZWFuO1xuICBwcml2YXRlIHZlcnRleFNoYWRlcjogV2ViR0xTaGFkZXI7XG4gIHRleHR1cmVDb25maWc6IFRleHR1cmVDb25maWc7XG5cbiAgY29uc3RydWN0b3IoZ2w/OiBXZWJHTFJlbmRlcmluZ0NvbnRleHQpIHtcbiAgICBjb25zdCBnbFZlcnNpb24gPSBlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX1ZFUlNJT04nKTtcbiAgICBpZiAoZ2wgIT0gbnVsbCkge1xuICAgICAgdGhpcy5nbCA9IGdsO1xuICAgICAgc2V0V2ViR0xDb250ZXh0KGdsVmVyc2lvbiwgZ2wpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmdsID0gZ2V0V2ViR0xDb250ZXh0KGdsVmVyc2lvbik7XG4gICAgfVxuICAgIC8vIFdlYkdMIDIuMCBlbmFibGVzIHRleHR1cmUgZmxvYXRzIHdpdGhvdXQgYW4gZXh0ZW5zaW9uLlxuICAgIGxldCBDT0xPUl9CVUZGRVJfRkxPQVQgPSAnV0VCR0xfY29sb3JfYnVmZmVyX2Zsb2F0JztcbiAgICBjb25zdCBDT0xPUl9CVUZGRVJfSEFMRl9GTE9BVCA9ICdFWFRfY29sb3JfYnVmZmVyX2hhbGZfZmxvYXQnO1xuICAgIGlmIChlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX1ZFUlNJT04nKSA9PT0gMSkge1xuICAgICAgY29uc3QgVEVYVFVSRV9GTE9BVCA9ICdPRVNfdGV4dHVyZV9mbG9hdCc7XG4gICAgICBjb25zdCBURVhUVVJFX0hBTEZfRkxPQVQgPSAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdCc7XG5cbiAgICAgIHRoaXMudGV4dHVyZUZsb2F0RXh0ZW5zaW9uID1cbiAgICAgICAgICB3ZWJnbF91dGlsLmdldEV4dGVuc2lvbk9yVGhyb3codGhpcy5nbCwgVEVYVFVSRV9GTE9BVCk7XG4gICAgICBpZiAod2ViZ2xfdXRpbC5oYXNFeHRlbnNpb24odGhpcy5nbCwgVEVYVFVSRV9IQUxGX0ZMT0FUKSkge1xuICAgICAgICB0aGlzLnRleHR1cmVIYWxmRmxvYXRFeHRlbnNpb24gPVxuICAgICAgICAgICAgd2ViZ2xfdXRpbC5nZXRFeHRlbnNpb25PclRocm93KHRoaXMuZ2wsIFRFWFRVUkVfSEFMRl9GTE9BVCk7XG4gICAgICB9IGVsc2UgaWYgKGVudigpLmdldCgnV0VCR0xfRk9SQ0VfRjE2X1RFWFRVUkVTJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ0dMIGNvbnRleHQgZG9lcyBub3Qgc3VwcG9ydCBoYWxmIGZsb2F0IHRleHR1cmVzLCB5ZXQgdGhlICcgK1xuICAgICAgICAgICAgJ2Vudmlyb25tZW50IGZsYWcgV0VCR0xfRk9SQ0VfRjE2X1RFWFRVUkVTIGlzIHNldCB0byB0cnVlLicpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNvbG9yQnVmZmVyRmxvYXRFeHRlbnNpb24gPSB0aGlzLmdsLmdldEV4dGVuc2lvbihDT0xPUl9CVUZGRVJfRkxPQVQpO1xuICAgICAgaWYgKHdlYmdsX3V0aWwuaGFzRXh0ZW5zaW9uKHRoaXMuZ2wsIENPTE9SX0JVRkZFUl9IQUxGX0ZMT0FUKSkge1xuICAgICAgICB0aGlzLmNvbG9yQnVmZmVySGFsZkZsb2F0RXh0ZW5zaW9uID1cbiAgICAgICAgICAgIHdlYmdsX3V0aWwuZ2V0RXh0ZW5zaW9uT3JUaHJvdyh0aGlzLmdsLCBDT0xPUl9CVUZGRVJfSEFMRl9GTE9BVCk7XG4gICAgICB9IGVsc2UgaWYgKGVudigpLmdldCgnV0VCR0xfRk9SQ0VfRjE2X1RFWFRVUkVTJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ0dMIGNvbnRleHQgZG9lcyBub3Qgc3VwcG9ydCBjb2xvciByZW5kZXJhYmxlIGhhbGYgZmxvYXRzLCB5ZXQgJyArXG4gICAgICAgICAgICAndGhlIGVudmlyb25tZW50IGZsYWcgV0VCR0xfRk9SQ0VfRjE2X1RFWFRVUkVTIGlzIHNldCB0byB0cnVlLicpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBDT0xPUl9CVUZGRVJfRkxPQVQgPSAnRVhUX2NvbG9yX2J1ZmZlcl9mbG9hdCc7XG4gICAgICBpZiAod2ViZ2xfdXRpbC5oYXNFeHRlbnNpb24odGhpcy5nbCwgQ09MT1JfQlVGRkVSX0ZMT0FUKSkge1xuICAgICAgICB0aGlzLmNvbG9yQnVmZmVyRmxvYXRFeHRlbnNpb24gPVxuICAgICAgICAgICAgdGhpcy5nbC5nZXRFeHRlbnNpb24oQ09MT1JfQlVGRkVSX0ZMT0FUKTtcbiAgICAgIH0gZWxzZSBpZiAod2ViZ2xfdXRpbC5oYXNFeHRlbnNpb24odGhpcy5nbCwgQ09MT1JfQlVGRkVSX0hBTEZfRkxPQVQpKSB7XG4gICAgICAgIHRoaXMuY29sb3JCdWZmZXJIYWxmRmxvYXRFeHRlbnNpb24gPVxuICAgICAgICAgICAgdGhpcy5nbC5nZXRFeHRlbnNpb24oQ09MT1JfQlVGRkVSX0hBTEZfRkxPQVQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdHTCBjb250ZXh0IGRvZXMgbm90IHN1cHBvcnQgY29sb3IgcmVuZGVyYWJsZSBmbG9hdHMnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnZlcnRleEJ1ZmZlciA9IGdwZ3B1X3V0aWwuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMuZ2wpO1xuICAgIHRoaXMuaW5kZXhCdWZmZXIgPSBncGdwdV91dGlsLmNyZWF0ZUluZGV4QnVmZmVyKHRoaXMuZ2wpO1xuICAgIHRoaXMuZnJhbWVidWZmZXIgPSB3ZWJnbF91dGlsLmNyZWF0ZUZyYW1lYnVmZmVyKHRoaXMuZ2wpO1xuXG4gICAgdGhpcy50ZXh0dXJlQ29uZmlnID1cbiAgICAgICAgdGV4X3V0aWwuZ2V0VGV4dHVyZUNvbmZpZyh0aGlzLmdsLCB0aGlzLnRleHR1cmVIYWxmRmxvYXRFeHRlbnNpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgZGVidWcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGVudigpLmdldEJvb2woJ0RFQlVHJyk7XG4gIH1cblxuICBwdWJsaWMgZGlzcG9zZSgpIHtcbiAgICBpZiAodGhpcy5kaXNwb3NlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5wcm9ncmFtICE9IG51bGwpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAnRGlzcG9zaW5nIGEgR1BHUFVDb250ZXh0IHRoYXQgc3RpbGwgaGFzIGEgYm91bmQgV2ViR0xQcm9ncmFtLicgK1xuICAgICAgICAgICcgVGhpcyBpcyBwcm9iYWJseSBhIHJlc291cmNlIGxlYWssIGRlbGV0ZSB0aGUgcHJvZ3JhbSB3aXRoICcgK1xuICAgICAgICAgICdHUEdQVUNvbnRleHQuZGVsZXRlUHJvZ3JhbSBiZWZvcmUgZGlzcG9zaW5nLicpO1xuICAgIH1cbiAgICBpZiAodGhpcy5vdXRwdXRUZXh0dXJlICE9IG51bGwpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAnRGlzcG9zaW5nIGEgR1BHUFVDb250ZXh0IHRoYXQgc3RpbGwgaGFzIGEgYm91bmQgb3V0cHV0IG1hdHJpeCAnICtcbiAgICAgICAgICAndGV4dHVyZS4gIFRoaXMgaXMgcHJvYmFibHkgYSByZXNvdXJjZSBsZWFrLCBkZWxldGUgdGhlIG91dHB1dCAnICtcbiAgICAgICAgICAnbWF0cml4IHRleHR1cmUgd2l0aCBHUEdQVUNvbnRleHQuZGVsZXRlTWF0cml4VGV4dHVyZSBiZWZvcmUgJyArXG4gICAgICAgICAgJ2Rpc3Bvc2luZy4nKTtcbiAgICB9XG4gICAgY29uc3QgZ2wgPSB0aGlzLmdsO1xuICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5maW5pc2goKSk7XG4gICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgbnVsbCkpO1xuICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5kZWxldGVGcmFtZWJ1ZmZlcih0aGlzLmZyYW1lYnVmZmVyKSk7XG4gICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBudWxsKSk7XG4gICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soXG4gICAgICAgIGdsLCAoKSA9PiBnbC5iaW5kQnVmZmVyKGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBudWxsKSk7XG4gICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmRlbGV0ZUJ1ZmZlcih0aGlzLmluZGV4QnVmZmVyKSk7XG4gICAgdGhpcy5kaXNwb3NlZCA9IHRydWU7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlRmxvYXQzMk1hdHJpeFRleHR1cmUocm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIpOlxuICAgICAgV2ViR0xUZXh0dXJlIHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIHJldHVybiBncGdwdV91dGlsLmNyZWF0ZUZsb2F0MzJNYXRyaXhUZXh0dXJlKFxuICAgICAgICB0aGlzLmdsLCByb3dzLCBjb2x1bW5zLCB0aGlzLnRleHR1cmVDb25maWcpO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZUZsb2F0MTZNYXRyaXhUZXh0dXJlKHJvd3M6IG51bWJlciwgY29sdW1uczogbnVtYmVyKTpcbiAgICAgIFdlYkdMVGV4dHVyZSB7XG4gICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICByZXR1cm4gZ3BncHVfdXRpbC5jcmVhdGVGbG9hdDE2TWF0cml4VGV4dHVyZShcbiAgICAgICAgdGhpcy5nbCwgcm93cywgY29sdW1ucywgdGhpcy50ZXh0dXJlQ29uZmlnKTtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVVbnNpZ25lZEJ5dGVzTWF0cml4VGV4dHVyZShyb3dzOiBudW1iZXIsIGNvbHVtbnM6IG51bWJlcik6XG4gICAgICBXZWJHTFRleHR1cmUge1xuICAgIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gICAgcmV0dXJuIGdwZ3B1X3V0aWwuY3JlYXRlVW5zaWduZWRCeXRlc01hdHJpeFRleHR1cmUoXG4gICAgICAgIHRoaXMuZ2wsIHJvd3MsIGNvbHVtbnMsIHRoaXMudGV4dHVyZUNvbmZpZyk7XG4gIH1cblxuICBwdWJsaWMgdXBsb2FkUGl4ZWxEYXRhVG9UZXh0dXJlKFxuICAgICAgdGV4dHVyZTogV2ViR0xUZXh0dXJlLFxuICAgICAgcGl4ZWxzOiBQaXhlbERhdGF8SW1hZ2VEYXRhfEhUTUxJbWFnZUVsZW1lbnR8SFRNTENhbnZhc0VsZW1lbnR8XG4gICAgICBJbWFnZUJpdG1hcCkge1xuICAgIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gICAgZ3BncHVfdXRpbC51cGxvYWRQaXhlbERhdGFUb1RleHR1cmUodGhpcy5nbCwgdGV4dHVyZSwgcGl4ZWxzKTtcbiAgfVxuXG4gIHB1YmxpYyB1cGxvYWREZW5zZU1hdHJpeFRvVGV4dHVyZShcbiAgICAgIHRleHR1cmU6IFdlYkdMVGV4dHVyZSwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIGRhdGE6IFR5cGVkQXJyYXkpIHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIGdwZ3B1X3V0aWwudXBsb2FkRGVuc2VNYXRyaXhUb1RleHR1cmUoXG4gICAgICAgIHRoaXMuZ2wsIHRleHR1cmUsIHdpZHRoLCBoZWlnaHQsIGRhdGEsIHRoaXMudGV4dHVyZUNvbmZpZyk7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlRmxvYXQxNlBhY2tlZE1hdHJpeFRleHR1cmUocm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIpOlxuICAgICAgV2ViR0xUZXh0dXJlIHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIHJldHVybiBncGdwdV91dGlsLmNyZWF0ZUZsb2F0MTZQYWNrZWRNYXRyaXhUZXh0dXJlKFxuICAgICAgICB0aGlzLmdsLCByb3dzLCBjb2x1bW5zLCB0aGlzLnRleHR1cmVDb25maWcpO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZVBhY2tlZE1hdHJpeFRleHR1cmUocm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIpOlxuICAgICAgV2ViR0xUZXh0dXJlIHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIHJldHVybiBncGdwdV91dGlsLmNyZWF0ZVBhY2tlZE1hdHJpeFRleHR1cmUoXG4gICAgICAgIHRoaXMuZ2wsIHJvd3MsIGNvbHVtbnMsIHRoaXMudGV4dHVyZUNvbmZpZyk7XG4gIH1cblxuICBwdWJsaWMgZGVsZXRlTWF0cml4VGV4dHVyZSh0ZXh0dXJlOiBXZWJHTFRleHR1cmUpIHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIGlmICh0aGlzLm91dHB1dFRleHR1cmUgPT09IHRleHR1cmUpIHtcbiAgICAgIHdlYmdsX3V0aWwudW5iaW5kQ29sb3JUZXh0dXJlRnJvbUZyYW1lYnVmZmVyKHRoaXMuZ2wsIHRoaXMuZnJhbWVidWZmZXIpO1xuICAgICAgdGhpcy5vdXRwdXRUZXh0dXJlID0gbnVsbDtcbiAgICB9XG4gICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2sodGhpcy5nbCwgKCkgPT4gdGhpcy5nbC5kZWxldGVUZXh0dXJlKHRleHR1cmUpKTtcbiAgfVxuXG4gIHB1YmxpYyBkb3dubG9hZEJ5dGVFbmNvZGVkRmxvYXRNYXRyaXhGcm9tT3V0cHV0VGV4dHVyZShcbiAgICAgIHRleHR1cmU6IFdlYkdMVGV4dHVyZSwgcm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIpOiBGbG9hdDMyQXJyYXkge1xuICAgIHJldHVybiB0aGlzLmRvd25sb2FkTWF0cml4RHJpdmVyKFxuICAgICAgICB0ZXh0dXJlLFxuICAgICAgICAoKSA9PiBncGdwdV91dGlsLmRvd25sb2FkQnl0ZUVuY29kZWRGbG9hdE1hdHJpeEZyb21PdXRwdXRUZXh0dXJlKFxuICAgICAgICAgICAgdGhpcy5nbCwgcm93cywgY29sdW1ucywgdGhpcy50ZXh0dXJlQ29uZmlnKSk7XG4gIH1cblxuICBwdWJsaWMgZG93bmxvYWRQYWNrZWRNYXRyaXhGcm9tQnVmZmVyKFxuICAgICAgYnVmZmVyOiBXZWJHTEJ1ZmZlciwgYmF0Y2g6IG51bWJlciwgcm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIsXG4gICAgICBwaHlzaWNhbFJvd3M6IG51bWJlciwgcGh5c2ljYWxDb2xzOiBudW1iZXIpOiBGbG9hdDMyQXJyYXkge1xuICAgIHJldHVybiBncGdwdV91dGlsLmRvd25sb2FkUGFja2VkTWF0cml4RnJvbUJ1ZmZlcihcbiAgICAgICAgdGhpcy5nbCwgYnVmZmVyLCBiYXRjaCwgcm93cywgY29sdW1ucywgcGh5c2ljYWxSb3dzLCBwaHlzaWNhbENvbHMsXG4gICAgICAgIHRoaXMudGV4dHVyZUNvbmZpZyk7XG4gIH1cblxuICBwdWJsaWMgZG93bmxvYWRGbG9hdDMyTWF0cml4RnJvbUJ1ZmZlcihidWZmZXI6IFdlYkdMQnVmZmVyLCBzaXplOiBudW1iZXIpOlxuICAgICAgRmxvYXQzMkFycmF5IHtcbiAgICByZXR1cm4gZ3BncHVfdXRpbC5kb3dubG9hZEZsb2F0MzJNYXRyaXhGcm9tQnVmZmVyKHRoaXMuZ2wsIGJ1ZmZlciwgc2l6ZSk7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlQnVmZmVyRnJvbVRleHR1cmUoXG4gICAgICB0ZXh0dXJlOiBXZWJHTFRleHR1cmUsIHJvd3M6IG51bWJlciwgY29sdW1uczogbnVtYmVyKTogV2ViR0xCdWZmZXIge1xuICAgIHRoaXMuYmluZFRleHR1cmVUb0ZyYW1lQnVmZmVyKHRleHR1cmUpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGdwZ3B1X3V0aWwuY3JlYXRlQnVmZmVyRnJvbU91dHB1dFRleHR1cmUoXG4gICAgICAgIHRoaXMuZ2wgYXMgV2ViR0wyUmVuZGVyaW5nQ29udGV4dCwgcm93cywgY29sdW1ucywgdGhpcy50ZXh0dXJlQ29uZmlnKTtcbiAgICB0aGlzLnVuYmluZFRleHR1cmVUb0ZyYW1lQnVmZmVyKCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVBbmRXYWl0Rm9yRmVuY2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZmVuY2VDb250ZXh0ID0gdGhpcy5jcmVhdGVGZW5jZSh0aGlzLmdsKTtcbiAgICByZXR1cm4gdGhpcy5wb2xsRmVuY2UoZmVuY2VDb250ZXh0KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRmVuY2UoZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCk6IEZlbmNlQ29udGV4dCB7XG4gICAgbGV0IHF1ZXJ5OiBXZWJHTFF1ZXJ5fFdlYkdMU3luYztcbiAgICBsZXQgaXNGZW5jZVBhc3NlZDogKCkgPT4gYm9vbGVhbjtcblxuICAgIGlmIChlbnYoKS5nZXRCb29sKCdXRUJHTF9GRU5DRV9BUElfRU5BQkxFRCcpKSB7XG4gICAgICBjb25zdCBnbDIgPSBnbCBhcyBXZWJHTDJSZW5kZXJpbmdDb250ZXh0O1xuXG4gICAgICBjb25zdCBzeW5jID0gZ2wyLmZlbmNlU3luYyhnbDIuU1lOQ19HUFVfQ09NTUFORFNfQ09NUExFVEUsIDApO1xuICAgICAgZ2wuZmx1c2goKTtcblxuICAgICAgaXNGZW5jZVBhc3NlZCA9ICgpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gZ2wyLmNsaWVudFdhaXRTeW5jKHN5bmMsIDAsIDApO1xuICAgICAgICByZXR1cm4gc3RhdHVzID09PSBnbDIuQUxSRUFEWV9TSUdOQUxFRCB8fFxuICAgICAgICAgICAgc3RhdHVzID09PSBnbDIuQ09ORElUSU9OX1NBVElTRklFRDtcbiAgICAgIH07XG5cbiAgICAgIHF1ZXJ5ID0gc3luYztcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgICBlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX0RJU0pPSU5UX1FVRVJZX1RJTUVSX0VYVEVOU0lPTl9WRVJTSU9OJykgPiAwKSB7XG4gICAgICBxdWVyeSA9IHRoaXMuYmVnaW5RdWVyeSgpO1xuICAgICAgdGhpcy5lbmRRdWVyeSgpO1xuICAgICAgaXNGZW5jZVBhc3NlZCA9ICgpID0+IHRoaXMuaXNRdWVyeUF2YWlsYWJsZShcbiAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICBlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX0RJU0pPSU5UX1FVRVJZX1RJTUVSX0VYVEVOU0lPTl9WRVJTSU9OJykpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiB3ZSBoYXZlIG5vIHdheSB0byBmZW5jZSwgcmV0dXJuIHRydWUgaW1tZWRpYXRlbHkuIFRoaXMgd2lsbCBmaXJlIGluXG4gICAgICAvLyBXZWJHTCAxLjAgd2hlbiB0aGVyZSBpcyBubyBkaXNqb2ludCBxdWVyeSB0aW1lci4gSW4gdGhpcyBjYXNlLCBiZWNhdXNlXG4gICAgICAvLyB0aGUgZmVuY2UgcGFzc2VzIGltbWVkaWF0ZWx5LCB3ZSdsbCBpbW1lZGlhdGVseSBhc2sgZm9yIGEgZG93bmxvYWQgb2ZcbiAgICAgIC8vIHRoZSB0ZXh0dXJlLCB3aGljaCB3aWxsIGNhdXNlIHRoZSBVSSB0aHJlYWQgdG8gaGFuZy5cbiAgICAgIGlzRmVuY2VQYXNzZWQgPSAoKSA9PiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiB7cXVlcnksIGlzRmVuY2VQYXNzZWR9O1xuICB9XG5cbiAgcHVibGljIGRvd25sb2FkTWF0cml4RnJvbVBhY2tlZFRleHR1cmUoXG4gICAgICB0ZXh0dXJlOiBXZWJHTFRleHR1cmUsIHBoeXNpY2FsUm93czogbnVtYmVyLFxuICAgICAgcGh5c2ljYWxDb2xzOiBudW1iZXIpOiBGbG9hdDMyQXJyYXkge1xuICAgIHJldHVybiB0aGlzLmRvd25sb2FkTWF0cml4RHJpdmVyKFxuICAgICAgICB0ZXh0dXJlLFxuICAgICAgICAoKSA9PiBncGdwdV91dGlsLmRvd25sb2FkTWF0cml4RnJvbVBhY2tlZE91dHB1dFRleHR1cmUoXG4gICAgICAgICAgICB0aGlzLmdsLCBwaHlzaWNhbFJvd3MsIHBoeXNpY2FsQ29scykpO1xuICB9XG5cbiAgcHJpdmF0ZSB2ZXJ0ZXhBdHRyc0FyZUJvdW5kID0gZmFsc2U7XG5cbiAgcHVibGljIGNyZWF0ZVByb2dyYW0oZnJhZ21lbnRTaGFkZXJTb3VyY2U6IHN0cmluZyk6IFdlYkdMUHJvZ3JhbSB7XG4gICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICBjb25zdCBnbCA9IHRoaXMuZ2w7XG4gICAgY29uc3QgZnJhZ21lbnRTaGFkZXI6IFdlYkdMU2hhZGVyID1cbiAgICAgICAgd2ViZ2xfdXRpbC5jcmVhdGVGcmFnbWVudFNoYWRlcihnbCwgZnJhZ21lbnRTaGFkZXJTb3VyY2UpO1xuICAgIGlmICh0aGlzLnZlcnRleFNoYWRlciA9PSBudWxsKSB7XG4gICAgICB0aGlzLnZlcnRleFNoYWRlciA9IGdwZ3B1X3V0aWwuY3JlYXRlVmVydGV4U2hhZGVyKGdsKTtcbiAgICB9XG4gICAgY29uc3QgcHJvZ3JhbTogV2ViR0xQcm9ncmFtID0gd2ViZ2xfdXRpbC5jcmVhdGVQcm9ncmFtKGdsKTtcbiAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhcbiAgICAgICAgZ2wsICgpID0+IGdsLmF0dGFjaFNoYWRlcihwcm9ncmFtLCB0aGlzLnZlcnRleFNoYWRlcikpO1xuICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgZnJhZ21lbnRTaGFkZXIpKTtcbiAgICB3ZWJnbF91dGlsLmxpbmtQcm9ncmFtKGdsLCBwcm9ncmFtKTtcbiAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgd2ViZ2xfdXRpbC52YWxpZGF0ZVByb2dyYW0oZ2wsIHByb2dyYW0pO1xuICAgIH1cbiAgICBpZiAoIXRoaXMudmVydGV4QXR0cnNBcmVCb3VuZCkge1xuICAgICAgdGhpcy5zZXRQcm9ncmFtKHByb2dyYW0pO1xuICAgICAgdGhpcy52ZXJ0ZXhBdHRyc0FyZUJvdW5kID0gZ3BncHVfdXRpbC5iaW5kVmVydGV4UHJvZ3JhbUF0dHJpYnV0ZVN0cmVhbXMoXG4gICAgICAgICAgZ2wsIHRoaXMucHJvZ3JhbSwgdGhpcy52ZXJ0ZXhCdWZmZXIpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvZ3JhbTtcbiAgfVxuXG4gIHB1YmxpYyBkZWxldGVQcm9ncmFtKHByb2dyYW06IFdlYkdMUHJvZ3JhbSkge1xuICAgIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gICAgaWYgKHByb2dyYW0gPT09IHRoaXMucHJvZ3JhbSkge1xuICAgICAgdGhpcy5wcm9ncmFtID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHByb2dyYW0gIT0gbnVsbCkge1xuICAgICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2sodGhpcy5nbCwgKCkgPT4gdGhpcy5nbC5kZWxldGVQcm9ncmFtKHByb2dyYW0pKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0UHJvZ3JhbShwcm9ncmFtOiBXZWJHTFByb2dyYW18bnVsbCkge1xuICAgIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gICAgdGhpcy5wcm9ncmFtID0gcHJvZ3JhbTtcbiAgICBpZiAoKHRoaXMucHJvZ3JhbSAhPSBudWxsKSAmJiB0aGlzLmRlYnVnKSB7XG4gICAgICB3ZWJnbF91dGlsLnZhbGlkYXRlUHJvZ3JhbSh0aGlzLmdsLCB0aGlzLnByb2dyYW0pO1xuICAgIH1cbiAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayh0aGlzLmdsLCAoKSA9PiB0aGlzLmdsLnVzZVByb2dyYW0ocHJvZ3JhbSkpO1xuICB9XG5cbiAgcHVibGljIGdldFVuaWZvcm1Mb2NhdGlvbihcbiAgICAgIHByb2dyYW06IFdlYkdMUHJvZ3JhbSwgdW5pZm9ybU5hbWU6IHN0cmluZyxcbiAgICAgIHNob3VsZFRocm93ID0gdHJ1ZSk6IFdlYkdMVW5pZm9ybUxvY2F0aW9uIHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIGlmIChzaG91bGRUaHJvdykge1xuICAgICAgcmV0dXJuIHdlYmdsX3V0aWwuZ2V0UHJvZ3JhbVVuaWZvcm1Mb2NhdGlvbk9yVGhyb3coXG4gICAgICAgICAgdGhpcy5nbCwgcHJvZ3JhbSwgdW5pZm9ybU5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gd2ViZ2xfdXRpbC5nZXRQcm9ncmFtVW5pZm9ybUxvY2F0aW9uKFxuICAgICAgICAgIHRoaXMuZ2wsIHByb2dyYW0sIHVuaWZvcm1OYW1lKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0QXR0cmlidXRlTG9jYXRpb24ocHJvZ3JhbTogV2ViR0xQcm9ncmFtLCBhdHRyaWJ1dGU6IHN0cmluZyk6XG4gICAgICBudW1iZXIge1xuICAgIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gICAgcmV0dXJuIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKFxuICAgICAgICB0aGlzLmdsLCAoKSA9PiB0aGlzLmdsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sIGF0dHJpYnV0ZSkpO1xuICB9XG5cbiAgcHVibGljIGdldFVuaWZvcm1Mb2NhdGlvbk5vVGhyb3cocHJvZ3JhbTogV2ViR0xQcm9ncmFtLCB1bmlmb3JtTmFtZTogc3RyaW5nKTpcbiAgICAgIFdlYkdMVW5pZm9ybUxvY2F0aW9uIHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIHJldHVybiB0aGlzLmdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCB1bmlmb3JtTmFtZSk7XG4gIH1cblxuICBwdWJsaWMgc2V0SW5wdXRNYXRyaXhUZXh0dXJlKFxuICAgICAgaW5wdXRNYXRyaXhUZXh0dXJlOiBXZWJHTFRleHR1cmUsIHVuaWZvcm1Mb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb24sXG4gICAgICB0ZXh0dXJlVW5pdDogbnVtYmVyKSB7XG4gICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICB0aGlzLnRocm93SWZOb1Byb2dyYW0oKTtcbiAgICB3ZWJnbF91dGlsLmJpbmRUZXh0dXJlVG9Qcm9ncmFtVW5pZm9ybVNhbXBsZXIoXG4gICAgICAgIHRoaXMuZ2wsIGlucHV0TWF0cml4VGV4dHVyZSwgdW5pZm9ybUxvY2F0aW9uLCB0ZXh0dXJlVW5pdCk7XG4gIH1cblxuICBwdWJsaWMgc2V0T3V0cHV0TWF0cml4VGV4dHVyZShcbiAgICAgIG91dHB1dE1hdHJpeFRleHR1cmU6IFdlYkdMVGV4dHVyZSwgcm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldE91dHB1dE1hdHJpeFRleHR1cmVEcml2ZXIob3V0cHV0TWF0cml4VGV4dHVyZSwgY29sdW1ucywgcm93cyk7XG4gIH1cblxuICBwdWJsaWMgc2V0T3V0cHV0UGFja2VkTWF0cml4VGV4dHVyZShcbiAgICAgIG91dHB1dFBhY2tlZE1hdHJpeFRleHR1cmU6IFdlYkdMVGV4dHVyZSwgcm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIpIHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9XG4gICAgICAgIHRleF91dGlsLmdldFBhY2tlZE1hdHJpeFRleHR1cmVTaGFwZVdpZHRoSGVpZ2h0KHJvd3MsIGNvbHVtbnMpO1xuICAgIHRoaXMuc2V0T3V0cHV0TWF0cml4VGV4dHVyZURyaXZlcihvdXRwdXRQYWNrZWRNYXRyaXhUZXh0dXJlLCB3aWR0aCwgaGVpZ2h0KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRPdXRwdXRNYXRyaXhXcml0ZVJlZ2lvbihcbiAgICAgIHN0YXJ0Um93OiBudW1iZXIsIG51bVJvd3M6IG51bWJlciwgc3RhcnRDb2x1bW46IG51bWJlcixcbiAgICAgIG51bUNvbHVtbnM6IG51bWJlcikge1xuICAgIHRoaXMuc2V0T3V0cHV0TWF0cml4V3JpdGVSZWdpb25Ecml2ZXIoXG4gICAgICAgIHN0YXJ0Q29sdW1uLCBzdGFydFJvdywgbnVtQ29sdW1ucywgbnVtUm93cyk7XG4gIH1cblxuICBwdWJsaWMgc2V0T3V0cHV0UGFja2VkTWF0cml4V3JpdGVSZWdpb24oXG4gICAgICBzdGFydFJvdzogbnVtYmVyLCBudW1Sb3dzOiBudW1iZXIsIHN0YXJ0Q29sdW1uOiBudW1iZXIsXG4gICAgICBudW1Db2x1bW5zOiBudW1iZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldE91dHB1dFBhY2tlZE1hdHJpeFdyaXRlUmVnaW9uIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIHB1YmxpYyBkZWJ1Z1ZhbGlkYXRlKCkge1xuICAgIGlmICh0aGlzLnByb2dyYW0gIT0gbnVsbCkge1xuICAgICAgd2ViZ2xfdXRpbC52YWxpZGF0ZVByb2dyYW0odGhpcy5nbCwgdGhpcy5wcm9ncmFtKTtcbiAgICB9XG4gICAgd2ViZ2xfdXRpbC52YWxpZGF0ZUZyYW1lYnVmZmVyKHRoaXMuZ2wpO1xuICB9XG5cbiAgcHVibGljIGV4ZWN1dGVQcm9ncmFtKCkge1xuICAgIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gICAgdGhpcy50aHJvd0lmTm9Qcm9ncmFtKCk7XG4gICAgY29uc3QgZ2wgPSB0aGlzLmdsO1xuICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICB0aGlzLmRlYnVnVmFsaWRhdGUoKTtcbiAgICB9XG4gICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soXG4gICAgICAgIGdsLCAoKSA9PiBnbC5kcmF3RWxlbWVudHMoZ2wuVFJJQU5HTEVTLCA2LCBnbC5VTlNJR05FRF9TSE9SVCwgMCkpO1xuICB9XG5cbiAgcHVibGljIGJsb2NrVW50aWxBbGxQcm9ncmFtc0NvbXBsZXRlZCgpIHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKHRoaXMuZ2wsICgpID0+IHRoaXMuZ2wuZmluaXNoKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRRdWVyeVRpbWVyRXh0ZW5zaW9uKCk6IFdlYkdMMURpc2pvaW50UXVlcnlUaW1lckV4dGVuc2lvblxuICAgICAgfFdlYkdMMkRpc2pvaW50UXVlcnlUaW1lckV4dGVuc2lvbiB7XG4gICAgaWYgKHRoaXMuZGlzam9pbnRRdWVyeVRpbWVyRXh0ZW5zaW9uID09IG51bGwpIHtcbiAgICAgIHRoaXMuZGlzam9pbnRRdWVyeVRpbWVyRXh0ZW5zaW9uID1cbiAgICAgICAgICB3ZWJnbF91dGlsLmdldEV4dGVuc2lvbk9yVGhyb3coXG4gICAgICAgICAgICAgIHRoaXMuZ2wsXG4gICAgICAgICAgICAgIGVudigpLmdldE51bWJlcihcbiAgICAgICAgICAgICAgICAgICdXRUJHTF9ESVNKT0lOVF9RVUVSWV9USU1FUl9FWFRFTlNJT05fVkVSU0lPTicpID09PSAyID9cbiAgICAgICAgICAgICAgICAgICdFWFRfZGlzam9pbnRfdGltZXJfcXVlcnlfd2ViZ2wyJyA6XG4gICAgICAgICAgICAgICAgICAnRVhUX2Rpc2pvaW50X3RpbWVyX3F1ZXJ5JykgYXNcbiAgICAgICAgICAgICAgV2ViR0wxRGlzam9pbnRRdWVyeVRpbWVyRXh0ZW5zaW9uIHxcbiAgICAgICAgICBXZWJHTDJEaXNqb2ludFF1ZXJ5VGltZXJFeHRlbnNpb247XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRpc2pvaW50UXVlcnlUaW1lckV4dGVuc2lvbjtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UXVlcnlUaW1lckV4dGVuc2lvbldlYkdMMigpOiBXZWJHTDJEaXNqb2ludFF1ZXJ5VGltZXJFeHRlbnNpb24ge1xuICAgIHJldHVybiB0aGlzLmdldFF1ZXJ5VGltZXJFeHRlbnNpb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UXVlcnlUaW1lckV4dGVuc2lvbldlYkdMMSgpOiBXZWJHTDFEaXNqb2ludFF1ZXJ5VGltZXJFeHRlbnNpb24ge1xuICAgIHJldHVybiB0aGlzLmdldFF1ZXJ5VGltZXJFeHRlbnNpb24oKSBhcyBXZWJHTDFEaXNqb2ludFF1ZXJ5VGltZXJFeHRlbnNpb247XG4gIH1cblxuICBiZWdpblF1ZXJ5KCk6IFdlYkdMUXVlcnkge1xuICAgIGlmIChlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX0RJU0pPSU5UX1FVRVJZX1RJTUVSX0VYVEVOU0lPTl9WRVJTSU9OJykgPT09IDIpIHtcbiAgICAgIGNvbnN0IGdsMiA9IHRoaXMuZ2wgYXMgV2ViR0wyUmVuZGVyaW5nQ29udGV4dDtcbiAgICAgIGNvbnN0IGV4dCA9IHRoaXMuZ2V0UXVlcnlUaW1lckV4dGVuc2lvbldlYkdMMigpO1xuXG4gICAgICBjb25zdCBxdWVyeSA9IGdsMi5jcmVhdGVRdWVyeSgpO1xuICAgICAgZ2wyLmJlZ2luUXVlcnkoZXh0LlRJTUVfRUxBUFNFRF9FWFQsIHF1ZXJ5KTtcbiAgICAgIHJldHVybiBxdWVyeTtcbiAgICB9XG4gICAgY29uc3QgZXh0ID0gdGhpcy5nZXRRdWVyeVRpbWVyRXh0ZW5zaW9uV2ViR0wxKCk7XG4gICAgY29uc3QgcXVlcnkgPSBleHQuY3JlYXRlUXVlcnlFWFQoKSBhcyBXZWJHTFF1ZXJ5O1xuICAgIGV4dC5iZWdpblF1ZXJ5RVhUKGV4dC5USU1FX0VMQVBTRURfRVhULCBxdWVyeSk7XG4gICAgcmV0dXJuIHF1ZXJ5O1xuICB9XG5cbiAgZW5kUXVlcnkoKSB7XG4gICAgaWYgKGVudigpLmdldE51bWJlcignV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1ZFUlNJT04nKSA9PT0gMikge1xuICAgICAgY29uc3QgZ2wyID0gdGhpcy5nbCBhcyBXZWJHTDJSZW5kZXJpbmdDb250ZXh0O1xuICAgICAgY29uc3QgZXh0ID0gdGhpcy5nZXRRdWVyeVRpbWVyRXh0ZW5zaW9uV2ViR0wyKCk7XG4gICAgICBnbDIuZW5kUXVlcnkoZXh0LlRJTUVfRUxBUFNFRF9FWFQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBleHQgPSB0aGlzLmdldFF1ZXJ5VGltZXJFeHRlbnNpb25XZWJHTDEoKTtcbiAgICBleHQuZW5kUXVlcnlFWFQoZXh0LlRJTUVfRUxBUFNFRF9FWFQpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHdhaXRGb3JRdWVyeUFuZEdldFRpbWUocXVlcnk6IFdlYkdMUXVlcnkpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGF3YWl0IHV0aWwucmVwZWF0ZWRUcnkoXG4gICAgICAgICgpID0+IHRoaXMuZGlzcG9zZWQgfHwgIC8vIHdoaWxlIHRlc3RpbmcgY29udGV4dHMgYXJlIGNyZWF0ZWQgLyBkaXNwb3NlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiByYXBpZCBzdWNjZXNzaW9uLCBzbyB3aXRob3V0IHRoaXMgY2hlY2sgd2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF5IHBvbGwgZm9yIHRoZSBxdWVyeSB0aW1lciBpbmRlZmluaXRlbHlcbiAgICAgICAgICAgIHRoaXMuaXNRdWVyeUF2YWlsYWJsZShcbiAgICAgICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgICAgICBlbnYoKS5nZXROdW1iZXIoXG4gICAgICAgICAgICAgICAgICAgICdXRUJHTF9ESVNKT0lOVF9RVUVSWV9USU1FUl9FWFRFTlNJT05fVkVSU0lPTicpKSk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UXVlcnlUaW1lKFxuICAgICAgICBxdWVyeSwgZW52KCkuZ2V0TnVtYmVyKCdXRUJHTF9ESVNKT0lOVF9RVUVSWV9USU1FUl9FWFRFTlNJT05fVkVSU0lPTicpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UXVlcnlUaW1lKHF1ZXJ5OiBXZWJHTFF1ZXJ5LCBxdWVyeVRpbWVyVmVyc2lvbjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAocXVlcnlUaW1lclZlcnNpb24gPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChxdWVyeVRpbWVyVmVyc2lvbiA9PT0gMikge1xuICAgICAgY29uc3QgZ2wyID0gdGhpcy5nbCBhcyBXZWJHTDJSZW5kZXJpbmdDb250ZXh0O1xuXG4gICAgICBjb25zdCB0aW1lRWxhcHNlZE5hbm9zID0gZ2wyLmdldFF1ZXJ5UGFyYW1ldGVyKHF1ZXJ5LCBnbDIuUVVFUllfUkVTVUxUKTtcbiAgICAgIC8vIFJldHVybiBtaWxsaXNlY29uZHMuXG4gICAgICByZXR1cm4gdGltZUVsYXBzZWROYW5vcyAvIDEwMDAwMDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGV4dCA9IHRoaXMuZ2V0UXVlcnlUaW1lckV4dGVuc2lvbldlYkdMMSgpO1xuXG4gICAgICBjb25zdCB0aW1lRWxhcHNlZE5hbm9zID1cbiAgICAgICAgICBleHQuZ2V0UXVlcnlPYmplY3RFWFQocXVlcnksIGV4dC5RVUVSWV9SRVNVTFRfRVhUKTtcbiAgICAgIC8vIFJldHVybiBtaWxsaXNlY29uZHMuXG4gICAgICByZXR1cm4gdGltZUVsYXBzZWROYW5vcyAvIDEwMDAwMDA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc1F1ZXJ5QXZhaWxhYmxlKHF1ZXJ5OiBXZWJHTFF1ZXJ5LCBxdWVyeVRpbWVyVmVyc2lvbjogbnVtYmVyKTpcbiAgICAgIGJvb2xlYW4ge1xuICAgIGlmIChxdWVyeVRpbWVyVmVyc2lvbiA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHF1ZXJ5VGltZXJWZXJzaW9uID09PSAyKSB7XG4gICAgICBjb25zdCBnbDIgPSB0aGlzLmdsIGFzIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQ7XG4gICAgICBjb25zdCBleHQgPSB0aGlzLmdldFF1ZXJ5VGltZXJFeHRlbnNpb25XZWJHTDIoKTtcblxuICAgICAgY29uc3QgYXZhaWxhYmxlID1cbiAgICAgICAgICBnbDIuZ2V0UXVlcnlQYXJhbWV0ZXIocXVlcnksIGdsMi5RVUVSWV9SRVNVTFRfQVZBSUxBQkxFKTtcbiAgICAgIGlmICh0aGlzLmRpc2pvaW50ID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5kaXNqb2ludCA9IHRoaXMuZ2wuZ2V0UGFyYW1ldGVyKGV4dC5HUFVfRElTSk9JTlRfRVhUKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF2YWlsYWJsZSAmJiAhdGhpcy5kaXNqb2ludDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXh0ID0gdGhpcy5nZXRRdWVyeVRpbWVyRXh0ZW5zaW9uV2ViR0wxKCk7XG5cbiAgICAgIGNvbnN0IGF2YWlsYWJsZSA9XG4gICAgICAgICAgZXh0LmdldFF1ZXJ5T2JqZWN0RVhUKHF1ZXJ5LCBleHQuUVVFUllfUkVTVUxUX0FWQUlMQUJMRV9FWFQpO1xuICAgICAgaWYgKHRoaXMuZGlzam9pbnQgPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmRpc2pvaW50ID0gdGhpcy5nbC5nZXRQYXJhbWV0ZXIoZXh0LkdQVV9ESVNKT0lOVF9FWFQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXZhaWxhYmxlICYmICF0aGlzLmRpc2pvaW50O1xuICAgIH1cbiAgfVxuXG4gIHBvbGxGZW5jZShmZW5jZUNvbnRleHQ6IEZlbmNlQ29udGV4dCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IHtcbiAgICAgIHRoaXMuYWRkSXRlbVRvUG9sbCgoKSA9PiBmZW5jZUNvbnRleHQuaXNGZW5jZVBhc3NlZCgpLCAoKSA9PiByZXNvbHZlKCkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpdGVtc1RvUG9sbDogUG9sbEl0ZW1bXSA9IFtdO1xuXG4gIHBvbGxJdGVtcygpOiB2b2lkIHtcbiAgICAvLyBGaW5kIHRoZSBsYXN0IHF1ZXJ5IHRoYXQgaGFzIGZpbmlzaGVkLlxuICAgIGNvbnN0IGluZGV4ID0gbGluZWFyU2VhcmNoTGFzdFRydWUodGhpcy5pdGVtc1RvUG9sbC5tYXAoeCA9PiB4LmlzRG9uZUZuKSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gaW5kZXg7ICsraSkge1xuICAgICAgY29uc3Qge3Jlc29sdmVGbn0gPSB0aGlzLml0ZW1zVG9Qb2xsW2ldO1xuICAgICAgcmVzb2x2ZUZuKCk7XG4gICAgfVxuICAgIHRoaXMuaXRlbXNUb1BvbGwgPSB0aGlzLml0ZW1zVG9Qb2xsLnNsaWNlKGluZGV4ICsgMSk7XG4gIH1cblxuICBwcml2YXRlIGFkZEl0ZW1Ub1BvbGwoaXNEb25lRm46ICgpID0+IGJvb2xlYW4sIHJlc29sdmVGbjogKCkgPT4gdm9pZCkge1xuICAgIHRoaXMuaXRlbXNUb1BvbGwucHVzaCh7aXNEb25lRm4sIHJlc29sdmVGbn0pO1xuICAgIGlmICh0aGlzLml0ZW1zVG9Qb2xsLmxlbmd0aCA+IDEpIHtcbiAgICAgIC8vIFdlIGFscmVhZHkgaGF2ZSBhIHJ1bm5pbmcgbG9vcCB0aGF0IHBvbGxzLlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBTdGFydCBhIG5ldyBsb29wIHRoYXQgcG9sbHMuXG4gICAgdXRpbC5yZXBlYXRlZFRyeSgoKSA9PiB7XG4gICAgICB0aGlzLnBvbGxJdGVtcygpO1xuICAgICAgLy8gRW5kIHRoZSBsb29wIGlmIG5vIG1vcmUgaXRlbXMgdG8gcG9sbC5cbiAgICAgIHJldHVybiB0aGlzLml0ZW1zVG9Qb2xsLmxlbmd0aCA9PT0gMDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYmluZFRleHR1cmVUb0ZyYW1lQnVmZmVyKHRleHR1cmU6IFdlYkdMVGV4dHVyZSkge1xuICAgIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gICAgd2ViZ2xfdXRpbC5iaW5kQ29sb3JUZXh0dXJlVG9GcmFtZWJ1ZmZlcihcbiAgICAgICAgdGhpcy5nbCwgdGV4dHVyZSwgdGhpcy5mcmFtZWJ1ZmZlcik7XG4gICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgIHdlYmdsX3V0aWwudmFsaWRhdGVGcmFtZWJ1ZmZlcih0aGlzLmdsKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVuYmluZFRleHR1cmVUb0ZyYW1lQnVmZmVyKCkge1xuICAgIGlmICh0aGlzLm91dHB1dFRleHR1cmUgIT0gbnVsbCkge1xuICAgICAgd2ViZ2xfdXRpbC5iaW5kQ29sb3JUZXh0dXJlVG9GcmFtZWJ1ZmZlcihcbiAgICAgICAgICB0aGlzLmdsLCB0aGlzLm91dHB1dFRleHR1cmUsIHRoaXMuZnJhbWVidWZmZXIpO1xuICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgd2ViZ2xfdXRpbC52YWxpZGF0ZUZyYW1lYnVmZmVyKHRoaXMuZ2wpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB3ZWJnbF91dGlsLnVuYmluZENvbG9yVGV4dHVyZUZyb21GcmFtZWJ1ZmZlcih0aGlzLmdsLCB0aGlzLmZyYW1lYnVmZmVyKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRvd25sb2FkTWF0cml4RHJpdmVyKFxuICAgICAgdGV4dHVyZTogV2ViR0xUZXh0dXJlLFxuICAgICAgZG93bmxvYWRBbmREZWNvZGU6ICgpID0+IEZsb2F0MzJBcnJheSk6IEZsb2F0MzJBcnJheSB7XG4gICAgdGhpcy5iaW5kVGV4dHVyZVRvRnJhbWVCdWZmZXIodGV4dHVyZSk7XG4gICAgY29uc3QgcmVzdWx0ID0gZG93bmxvYWRBbmREZWNvZGUoKTtcbiAgICB0aGlzLnVuYmluZFRleHR1cmVUb0ZyYW1lQnVmZmVyKCk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRPdXRwdXRNYXRyaXhUZXh0dXJlRHJpdmVyKFxuICAgICAgb3V0cHV0TWF0cml4VGV4dHVyZU1heWJlUGFja2VkOiBXZWJHTFRleHR1cmUsIHdpZHRoOiBudW1iZXIsXG4gICAgICBoZWlnaHQ6IG51bWJlcikge1xuICAgIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gICAgY29uc3QgZ2wgPSB0aGlzLmdsO1xuICAgIHdlYmdsX3V0aWwuYmluZENvbG9yVGV4dHVyZVRvRnJhbWVidWZmZXIoXG4gICAgICAgIGdsLCBvdXRwdXRNYXRyaXhUZXh0dXJlTWF5YmVQYWNrZWQsIHRoaXMuZnJhbWVidWZmZXIpO1xuICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICB3ZWJnbF91dGlsLnZhbGlkYXRlRnJhbWVidWZmZXIoZ2wpO1xuICAgIH1cbiAgICB0aGlzLm91dHB1dFRleHR1cmUgPSBvdXRwdXRNYXRyaXhUZXh0dXJlTWF5YmVQYWNrZWQ7XG4gICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLnZpZXdwb3J0KDAsIDAsIHdpZHRoLCBoZWlnaHQpKTtcbiAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuc2Npc3NvcigwLCAwLCB3aWR0aCwgaGVpZ2h0KSk7XG4gIH1cblxuICBwcml2YXRlIHNldE91dHB1dE1hdHJpeFdyaXRlUmVnaW9uRHJpdmVyKFxuICAgICAgeDogbnVtYmVyLCB5OiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XG4gICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhcbiAgICAgICAgdGhpcy5nbCwgKCkgPT4gdGhpcy5nbC5zY2lzc29yKHgsIHksIHdpZHRoLCBoZWlnaHQpKTtcbiAgfVxuXG4gIHByaXZhdGUgdGhyb3dJZkRpc3Bvc2VkKCkge1xuICAgIGlmICh0aGlzLmRpc3Bvc2VkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0F0dGVtcHRlZCB0byB1c2UgZGlzcG9zZWQgR1BHUFVDb250ZXh0LicpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdGhyb3dJZk5vUHJvZ3JhbSgpIHtcbiAgICBpZiAodGhpcy5wcm9ncmFtID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gR1BVIHByb2dyYW0gaXMgY3VycmVudGx5IHNldC4nKTtcbiAgICB9XG4gIH1cbn1cblxudHlwZSBQb2xsSXRlbSA9IHtcbiAgaXNEb25lRm46ICgpID0+IGJvb2xlYW4sXG4gIHJlc29sdmVGbjogKCkgPT4gdm9pZFxufTtcblxuLyoqXG4gKiBGaW5kcyB0aGUgaW5kZXggb2YgdGhlIGxhc3QgdHJ1ZSBlbGVtZW50IHVzaW5nIGxpbmVhciBzZWFyY2guXG4gKiBOb3RlOiBXZSBjYW4ndCBkbyBiaW5hcnkgc2VhcmNoIGJlY2F1c2UgQ2hyb21lIGV4cGVjdHMgdXMgdG8gZXhwbGljaXRseVxuICogdGVzdCBhbGwgZmVuY2VzIGJlZm9yZSBkb3dubG9hZDpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RmanMvaXNzdWVzLzExNDVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpbmVhclNlYXJjaExhc3RUcnVlKGFycjogQXJyYXk8KCkgPT4gYm9vbGVhbj4pOiBudW1iZXIge1xuICBsZXQgaSA9IDA7XG4gIGZvciAoOyBpIDwgYXJyLmxlbmd0aDsgKytpKSB7XG4gICAgY29uc3QgaXNEb25lID0gYXJyW2ldKCk7XG4gICAgaWYgKCFpc0RvbmUpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaSAtIDE7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBlbnYsIFRlbnNvciwgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtHUEdQVUNvbnRleHR9IGZyb20gJy4vZ3BncHVfY29udGV4dCc7XG5pbXBvcnQgKiBhcyBzaGFkZXJfY29tcGlsZXIgZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuaW1wb3J0IHtJbnB1dEluZm8sIFNoYXBlSW5mbywgVW5pZm9ybVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcbmltcG9ydCB7UGFja2luZ1NjaGVtZSwgVGV4dHVyZURhdGEsIFRleHR1cmVVc2FnZX0gZnJvbSAnLi90ZXhfdXRpbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lczogc3RyaW5nW107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgZW5hYmxlU2hhcGVVbmlmb3Jtcz86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCB0aGlzIHByb2dyYW0gZXhwZWN0cyBwYWNrZWQgaW5wdXQgdGV4dHVyZXMuIERlZmF1bHRzIHRvIGZhbHNlLiAqL1xuICBwYWNrZWRJbnB1dHM/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgdGhpcyBwcm9ncmFtIHByb2R1Y2VzIGEgcGFja2VkIHRleHR1cmUuIERlZmF1bHRzIHRvIGZhbHNlLiAqL1xuICBwYWNrZWRPdXRwdXQ/OiBib29sZWFuO1xuICAvKipcbiAgICogQWZmZWN0cyB3aGF0IHR5cGUgb2YgdGV4dHVyZSB3ZSBhbGxvY2F0ZSBmb3IgdGhlIG91dHB1dC4gRGVmYXVsdHMgdG9cbiAgICogYFRleHR1cmVVc2FnZS5SRU5ERVJgLlxuICAgKi9cbiAgb3V0VGV4VXNhZ2U/OiBUZXh0dXJlVXNhZ2U7XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBzY2hlbWUgdG8gdXNlIHdoZW4gcGFja2luZyB0ZXhlbHMgZm9yIHRoZSBvdXRwdXQgdmFsdWVzLlxuICAgKiBTZWUgYFBhY2tpbmdTY2hlbWVgIGZvciBkZXRhaWxzLiBEZWZhdWx0cyB0byBgUGFja2luZ1NjaGVtZS5TSEFSRURfQkFUQ0hgLlxuICAgKi9cbiAgb3V0UGFja2luZ1NjaGVtZT86IFBhY2tpbmdTY2hlbWU7XG4gIGN1c3RvbVVuaWZvcm1zPzpcbiAgICAgIEFycmF5PHtuYW1lOiBzdHJpbmc7IGFycmF5SW5kZXg/OiBudW1iZXI7IHR5cGU6IFVuaWZvcm1UeXBlO30+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdQR1BVQmluYXJ5IHtcbiAgd2ViR0xQcm9ncmFtOiBXZWJHTFByb2dyYW07XG4gIHByb2dyYW06IEdQR1BVUHJvZ3JhbTtcbiAgdW5pZm9ybUxvY2F0aW9uczoge1tuYW1lOiBzdHJpbmddOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbn07XG4gIGN1c3RvbVVuaWZvcm1Mb2NhdGlvbnM/OiBXZWJHTFVuaWZvcm1Mb2NhdGlvbltdO1xuICBzb3VyY2U6IHN0cmluZztcbiAgaW5TaGFwZUluZm9zOiBTaGFwZUluZm9bXTtcbiAgb3V0U2hhcGVJbmZvOiBTaGFwZUluZm87XG4gIGluZkxvYzogV2ViR0xVbmlmb3JtTG9jYXRpb247XG4gIG5hbkxvYzogV2ViR0xVbmlmb3JtTG9jYXRpb247XG4gIGluU2hhcGVzTG9jYXRpb25zPzoge1tuYW1lOiBzdHJpbmddOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbn07XG4gIGluVGV4U2hhcGVzTG9jYXRpb25zPzoge1tuYW1lOiBzdHJpbmddOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbn07XG4gIG91dFNoYXBlTG9jYXRpb24/OiBXZWJHTFVuaWZvcm1Mb2NhdGlvbjtcbiAgb3V0U2hhcGVTdHJpZGVzTG9jYXRpb24/OiBXZWJHTFVuaWZvcm1Mb2NhdGlvbjtcbiAgb3V0VGV4U2hhcGVMb2NhdGlvbj86IFdlYkdMVW5pZm9ybUxvY2F0aW9uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlbnNvckRhdGEge1xuICBzaGFwZTogbnVtYmVyW107XG4gIHRleERhdGE6IFRleHR1cmVEYXRhO1xuICBpc1VuaWZvcm06IGJvb2xlYW47XG4gIC8vIEF2YWlsYWJsZSB3aGVuIHdlIGRlY2lkZSB0byB1cGxvYWQgYXMgdW5pZm9ybSBpbnN0ZWFkIG9mIHRleHR1cmUuXG4gIHVuaWZvcm1WYWx1ZXM/OiBUeXBlZEFycmF5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcGlsZVByb2dyYW08VCBleHRlbmRzIFRlbnNvciwgSyBleHRlbmRzIFRlbnNvcj4oXG4gICAgZ3BncHU6IEdQR1BVQ29udGV4dCwgcHJvZ3JhbTogR1BHUFVQcm9ncmFtLCBpbnB1dHM6IFRlbnNvckRhdGFbXSxcbiAgICBvdXRwdXQ6IFRlbnNvckRhdGEpOiBHUEdQVUJpbmFyeSB7XG4gIGNvbnN0IGlucHV0SW5mb3M6IElucHV0SW5mb1tdID0gaW5wdXRzLm1hcCgoaW5wdXQsIGkpID0+IHtcbiAgICBjb25zdCBzaGFwZUluZm86IFNoYXBlSW5mbyA9IHtcbiAgICAgIGxvZ2ljYWxTaGFwZTogaW5wdXQuc2hhcGUsXG4gICAgICB0ZXhTaGFwZTogaW5wdXQuaXNVbmlmb3JtID8gbnVsbCA6IGlucHV0LnRleERhdGEudGV4U2hhcGUsXG4gICAgICBpc1VuaWZvcm06IGlucHV0LmlzVW5pZm9ybSxcbiAgICAgIGlzUGFja2VkOiBpbnB1dC5pc1VuaWZvcm0gPyBmYWxzZSA6IGlucHV0LnRleERhdGEuaXNQYWNrZWQsXG4gICAgICBmbGF0T2Zmc2V0OiBudWxsXG4gICAgfTtcbiAgICBpZiAoaW5wdXQudGV4RGF0YSAhPSBudWxsICYmIGlucHV0LnRleERhdGEuc2xpY2UgIT0gbnVsbCAmJlxuICAgICAgICBpbnB1dC50ZXhEYXRhLnNsaWNlLmZsYXRPZmZzZXQgPiAwKSB7XG4gICAgICBzaGFwZUluZm8uZmxhdE9mZnNldCA9IGlucHV0LnRleERhdGEuc2xpY2UuZmxhdE9mZnNldDtcbiAgICB9XG4gICAgcmV0dXJuIHtuYW1lOiBwcm9ncmFtLnZhcmlhYmxlTmFtZXNbaV0sIHNoYXBlSW5mb307XG4gIH0pO1xuICBjb25zdCBpblNoYXBlSW5mb3MgPSBpbnB1dEluZm9zLm1hcCh4ID0+IHguc2hhcGVJbmZvKTtcbiAgY29uc3Qgb3V0U2hhcGVJbmZvOiBTaGFwZUluZm8gPSB7XG4gICAgbG9naWNhbFNoYXBlOiBvdXRwdXQuc2hhcGUsXG4gICAgdGV4U2hhcGU6IG91dHB1dC50ZXhEYXRhLnRleFNoYXBlLFxuICAgIGlzVW5pZm9ybTogZmFsc2UsXG4gICAgaXNQYWNrZWQ6IG91dHB1dC50ZXhEYXRhLmlzUGFja2VkLFxuICAgIGZsYXRPZmZzZXQ6IG51bGxcbiAgfTtcbiAgY29uc3Qgc291cmNlID0gc2hhZGVyX2NvbXBpbGVyLm1ha2VTaGFkZXIoaW5wdXRJbmZvcywgb3V0U2hhcGVJbmZvLCBwcm9ncmFtKTtcblxuICBjb25zdCB3ZWJHTFByb2dyYW0gPSBncGdwdS5jcmVhdGVQcm9ncmFtKHNvdXJjZSk7XG5cbiAgLy8gQWRkIHNwZWNpYWwgdW5pZm9ybXMgKE5BTiwgSU5GSU5JVFkpXG4gIGxldCBpbmZMb2M6IFdlYkdMVW5pZm9ybUxvY2F0aW9uID0gbnVsbDtcbiAgY29uc3QgbmFuTG9jID0gZ3BncHUuZ2V0VW5pZm9ybUxvY2F0aW9uKHdlYkdMUHJvZ3JhbSwgJ05BTicsIGZhbHNlKTtcbiAgaWYgKGVudigpLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpID09PSAxKSB7XG4gICAgaW5mTG9jID0gZ3BncHUuZ2V0VW5pZm9ybUxvY2F0aW9uKHdlYkdMUHJvZ3JhbSwgJ0lORklOSVRZJywgZmFsc2UpO1xuICB9XG5cbiAgLy8gQWRkIHVzZXItZGVmaW5lZCB1bmlmb3Jtc1xuICBjb25zdCBzaG91bGRUaHJvdyA9IGZhbHNlO1xuICBjb25zdCB1bmlmb3JtTG9jYXRpb25zOiB7W25hbWU6IHN0cmluZ106IFdlYkdMVW5pZm9ybUxvY2F0aW9ufSA9IHt9O1xuICBjb25zdCBpblNoYXBlc0xvY2F0aW9uczoge1tuYW1lOiBzdHJpbmddOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbn0gPSB7fTtcbiAgY29uc3QgaW5UZXhTaGFwZXNMb2NhdGlvbnM6IHtbbmFtZTogc3RyaW5nXTogV2ViR0xVbmlmb3JtTG9jYXRpb259ID0ge307XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvZ3JhbS52YXJpYWJsZU5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgdmFyTmFtZSA9IHByb2dyYW0udmFyaWFibGVOYW1lc1tpXTtcbiAgICB1bmlmb3JtTG9jYXRpb25zW3Zhck5hbWVdID1cbiAgICAgICAgZ3BncHUuZ2V0VW5pZm9ybUxvY2F0aW9uKHdlYkdMUHJvZ3JhbSwgdmFyTmFtZSwgc2hvdWxkVGhyb3cpO1xuICAgIHVuaWZvcm1Mb2NhdGlvbnNbYG9mZnNldCR7dmFyTmFtZX1gXSA9XG4gICAgICAgIGdwZ3B1LmdldFVuaWZvcm1Mb2NhdGlvbih3ZWJHTFByb2dyYW0sIGBvZmZzZXQke3Zhck5hbWV9YCwgc2hvdWxkVGhyb3cpO1xuICAgIGlmIChwcm9ncmFtLmVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgIGluU2hhcGVzTG9jYXRpb25zW2Ake3Zhck5hbWV9U2hhcGVgXSA9IGdwZ3B1LmdldFVuaWZvcm1Mb2NhdGlvbihcbiAgICAgICAgICB3ZWJHTFByb2dyYW0sIGAke3Zhck5hbWV9U2hhcGVgLCBzaG91bGRUaHJvdyk7XG4gICAgICBpblRleFNoYXBlc0xvY2F0aW9uc1tgJHt2YXJOYW1lfVRleFNoYXBlYF0gPSBncGdwdS5nZXRVbmlmb3JtTG9jYXRpb24oXG4gICAgICAgICAgd2ViR0xQcm9ncmFtLCBgJHt2YXJOYW1lfVRleFNoYXBlYCwgc2hvdWxkVGhyb3cpO1xuICAgIH1cbiAgfVxuXG4gIGxldCBvdXRTaGFwZUxvY2F0aW9uOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbjtcbiAgbGV0IG91dFRleFNoYXBlTG9jYXRpb246IFdlYkdMVW5pZm9ybUxvY2F0aW9uO1xuICBsZXQgb3V0U2hhcGVTdHJpZGVzTG9jYXRpb246IFdlYkdMVW5pZm9ybUxvY2F0aW9uO1xuICBpZiAocHJvZ3JhbS5lbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgb3V0U2hhcGVMb2NhdGlvbiA9XG4gICAgICAgIGdwZ3B1LmdldFVuaWZvcm1Mb2NhdGlvbih3ZWJHTFByb2dyYW0sICdvdXRTaGFwZScsIHNob3VsZFRocm93KTtcbiAgICBvdXRTaGFwZVN0cmlkZXNMb2NhdGlvbiA9XG4gICAgICAgIGdwZ3B1LmdldFVuaWZvcm1Mb2NhdGlvbih3ZWJHTFByb2dyYW0sICdvdXRTaGFwZVN0cmlkZXMnLCBzaG91bGRUaHJvdyk7XG4gICAgb3V0VGV4U2hhcGVMb2NhdGlvbiA9XG4gICAgICAgIGdwZ3B1LmdldFVuaWZvcm1Mb2NhdGlvbih3ZWJHTFByb2dyYW0sICdvdXRUZXhTaGFwZScsIHNob3VsZFRocm93KTtcbiAgfVxuXG4gIGNvbnN0IGN1c3RvbVVuaWZvcm1Mb2NhdGlvbnM6IFdlYkdMVW5pZm9ybUxvY2F0aW9uW10gPSBbXTtcbiAgaWYgKHByb2dyYW0uY3VzdG9tVW5pZm9ybXMpIHtcbiAgICBwcm9ncmFtLmN1c3RvbVVuaWZvcm1zLmZvckVhY2goKGQsIGkpID0+IHtcbiAgICAgIGN1c3RvbVVuaWZvcm1Mb2NhdGlvbnNbaV0gPVxuICAgICAgICAgIGdwZ3B1LmdldFVuaWZvcm1Mb2NhdGlvbih3ZWJHTFByb2dyYW0sIGQubmFtZSwgc2hvdWxkVGhyb3cpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwcm9ncmFtLFxuICAgIHNvdXJjZSxcbiAgICB3ZWJHTFByb2dyYW0sXG4gICAgdW5pZm9ybUxvY2F0aW9ucyxcbiAgICBjdXN0b21Vbmlmb3JtTG9jYXRpb25zLFxuICAgIGluU2hhcGVJbmZvcyxcbiAgICBvdXRTaGFwZUluZm8sXG4gICAgaW5mTG9jLFxuICAgIG5hbkxvYyxcbiAgICBpblNoYXBlc0xvY2F0aW9ucyxcbiAgICBpblRleFNoYXBlc0xvY2F0aW9ucyxcbiAgICBvdXRTaGFwZUxvY2F0aW9uLFxuICAgIG91dFNoYXBlU3RyaWRlc0xvY2F0aW9uLFxuICAgIG91dFRleFNoYXBlTG9jYXRpb25cbiAgfTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVCaW5hcnlBbmRQcm9ncmFtKFxuICAgIHNoYXBlSW5mb3M6IFNoYXBlSW5mb1tdLCBpbnB1dHM6IFRlbnNvckRhdGFbXSkge1xuICBpZiAoc2hhcGVJbmZvcy5sZW5ndGggIT09IGlucHV0cy5sZW5ndGgpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgYEJpbmFyeSB3YXMgY29tcGlsZWQgd2l0aCAke3NoYXBlSW5mb3MubGVuZ3RofSBpbnB1dHMsIGJ1dCBgICtcbiAgICAgICAgYHdhcyBleGVjdXRlZCB3aXRoICR7aW5wdXRzLmxlbmd0aH0gaW5wdXRzYCk7XG4gIH1cblxuICBzaGFwZUluZm9zLmZvckVhY2goKHMsIGkpID0+IHtcbiAgICBjb25zdCBzaGFwZUEgPSBzLmxvZ2ljYWxTaGFwZTtcbiAgICBjb25zdCBpbnB1dCA9IGlucHV0c1tpXTtcbiAgICBjb25zdCBzaGFwZUIgPSBpbnB1dC5zaGFwZTtcblxuICAgIGlmICghdXRpbC5hcnJheXNFcXVhbChzaGFwZUEsIHNoYXBlQikpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgIGBCaW5hcnkgd2FzIGNvbXBpbGVkIHdpdGggZGlmZmVyZW50IHNoYXBlcyB0aGFuIGAgK1xuICAgICAgICAgIGB0aGUgY3VycmVudCBhcmdzLiBTaGFwZXMgJHtzaGFwZUF9IGFuZCAke3NoYXBlQn0gbXVzdCBtYXRjaGApO1xuICAgIH1cbiAgICAvLyBUaGUgaW5wdXQgaXMgdXBsb2FkZWQgYXMgdW5pZm9ybS5cbiAgICBpZiAocy5pc1VuaWZvcm0gJiYgaW5wdXQuaXNVbmlmb3JtKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGV4U2hhcGVBID0gcy50ZXhTaGFwZTtcbiAgICBjb25zdCB0ZXhTaGFwZUIgPSBpbnB1dC5pc1VuaWZvcm0gPyBudWxsIDogaW5wdXQudGV4RGF0YS50ZXhTaGFwZTtcbiAgICBpZiAoIXV0aWwuYXJyYXlzRXF1YWwodGV4U2hhcGVBLCB0ZXhTaGFwZUIpKSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBgQmluYXJ5IHdhcyBjb21waWxlZCB3aXRoIGRpZmZlcmVudCB0ZXh0dXJlIHNoYXBlcyB0aGFuIHRoZWAgK1xuICAgICAgICAgIGAgY3VycmVudCBhcmdzLiBTaGFwZSAke3RleFNoYXBlQX0gYW5kICR7dGV4U2hhcGVCfSBtdXN0IG1hdGNoYCk7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1blByb2dyYW08VCBleHRlbmRzIFRlbnNvciwgSyBleHRlbmRzIFRlbnNvcj4oXG4gICAgZ3BncHU6IEdQR1BVQ29udGV4dCwgYmluYXJ5OiBHUEdQVUJpbmFyeSwgaW5wdXRzOiBUZW5zb3JEYXRhW10sXG4gICAgb3V0cHV0OiBUZW5zb3JEYXRhLCBjdXN0b21Vbmlmb3JtVmFsdWVzPzogbnVtYmVyW11bXSk6IHZvaWQge1xuICBpZiAoIWJpbmFyeS5wcm9ncmFtLmVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICB2YWxpZGF0ZUJpbmFyeUFuZFByb2dyYW0oYmluYXJ5LmluU2hhcGVJbmZvcywgaW5wdXRzKTtcbiAgICB2YWxpZGF0ZUJpbmFyeUFuZFByb2dyYW0oW2JpbmFyeS5vdXRTaGFwZUluZm9dLCBbb3V0cHV0XSk7XG4gIH1cblxuICBjb25zdCBvdXRUZXggPSBvdXRwdXQudGV4RGF0YS50ZXh0dXJlO1xuICBjb25zdCBvdXRUZXhTaGFwZSA9IG91dHB1dC50ZXhEYXRhLnRleFNoYXBlO1xuICBpZiAob3V0cHV0LnRleERhdGEuaXNQYWNrZWQpIHtcbiAgICBncGdwdS5zZXRPdXRwdXRQYWNrZWRNYXRyaXhUZXh0dXJlKG91dFRleCwgb3V0VGV4U2hhcGVbMF0sIG91dFRleFNoYXBlWzFdKTtcbiAgfSBlbHNlIHtcbiAgICBncGdwdS5zZXRPdXRwdXRNYXRyaXhUZXh0dXJlKG91dFRleCwgb3V0VGV4U2hhcGVbMF0sIG91dFRleFNoYXBlWzFdKTtcbiAgfVxuICBncGdwdS5zZXRQcm9ncmFtKGJpbmFyeS53ZWJHTFByb2dyYW0pO1xuXG4gIC8vIFNldCBzcGVjaWFsIHVuaWZvcm1zIChOQU4sIElORklOSVRZKVxuICBpZiAoZW52KCkuZ2V0TnVtYmVyKCdXRUJHTF9WRVJTSU9OJykgPT09IDEpIHtcbiAgICBpZiAoYmluYXJ5LmluZkxvYyAhPT0gbnVsbCkge1xuICAgICAgZ3BncHUuZ2wudW5pZm9ybTFmKGJpbmFyeS5pbmZMb2MsIEluZmluaXR5KTtcbiAgICB9XG4gIH1cbiAgaWYgKGJpbmFyeS5uYW5Mb2MgIT09IG51bGwpIHtcbiAgICBncGdwdS5nbC51bmlmb3JtMWYoYmluYXJ5Lm5hbkxvYywgTmFOKTtcbiAgfVxuXG4gIC8vIFNldCB1c2VyLWRlZmluZWQgaW5wdXRzXG4gIGlucHV0cy5mb3JFYWNoKChpbnB1dCwgaSkgPT4ge1xuICAgIGNvbnN0IHZhck5hbWUgPSBiaW5hcnkucHJvZ3JhbS52YXJpYWJsZU5hbWVzW2ldO1xuICAgIGNvbnN0IHZhckxvYyA9IGJpbmFyeS51bmlmb3JtTG9jYXRpb25zW3Zhck5hbWVdO1xuICAgIGNvbnN0IHZhck9mZnNldExvYyA9IGJpbmFyeS51bmlmb3JtTG9jYXRpb25zW2BvZmZzZXQke3Zhck5hbWV9YF07XG4gICAgY29uc3QgdmFyU2hhcGVMb2MgPSBiaW5hcnkuaW5TaGFwZXNMb2NhdGlvbnNbYCR7dmFyTmFtZX1TaGFwZWBdO1xuICAgIGNvbnN0IHZhclRleFNoYXBlTG9jID0gYmluYXJ5LmluVGV4U2hhcGVzTG9jYXRpb25zW2Ake3Zhck5hbWV9VGV4U2hhcGVgXTtcblxuICAgIGlmICh2YXJTaGFwZUxvYykge1xuICAgICAgY29uc3Qge3VuaWZvcm1TaGFwZX0gPSBzaGFkZXJfY29tcGlsZXIuZ2V0VW5pZm9ybUluZm9Gcm9tU2hhcGUoXG4gICAgICAgICAgYmluYXJ5LnByb2dyYW0ucGFja2VkSW5wdXRzLCBpbnB1dC5zaGFwZSwgaW5wdXQudGV4RGF0YS50ZXhTaGFwZSk7XG4gICAgICBzd2l0Y2ggKHVuaWZvcm1TaGFwZS5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGdwZ3B1LmdsLnVuaWZvcm0xaXYodmFyU2hhcGVMb2MsIG5ldyBJbnQzMkFycmF5KHVuaWZvcm1TaGFwZSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgZ3BncHUuZ2wudW5pZm9ybTJpdih2YXJTaGFwZUxvYywgbmV3IEludDMyQXJyYXkodW5pZm9ybVNoYXBlKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBncGdwdS5nbC51bmlmb3JtM2l2KHZhclNoYXBlTG9jLCBuZXcgSW50MzJBcnJheSh1bmlmb3JtU2hhcGUpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIGdwZ3B1LmdsLnVuaWZvcm00aXYodmFyU2hhcGVMb2MsIG5ldyBJbnQzMkFycmF5KHVuaWZvcm1TaGFwZSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodmFyVGV4U2hhcGVMb2MpIHtcbiAgICAgIGdwZ3B1LmdsLnVuaWZvcm0yaShcbiAgICAgICAgICB2YXJUZXhTaGFwZUxvYywgaW5wdXQudGV4RGF0YS50ZXhTaGFwZVswXSwgaW5wdXQudGV4RGF0YS50ZXhTaGFwZVsxXSk7XG4gICAgfVxuXG4gICAgaWYgKHZhckxvYyA9PSBudWxsKSB7XG4gICAgICAvLyBUaGUgY29tcGlsZXIgaW5mZXJyZWQgdGhhdCB0aGlzIHZhcmlhYmxlIGlzIG5vdCB1c2VkIGluIHRoaXMgc2hhZGVyLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpbnB1dC5pc1VuaWZvcm0pIHtcbiAgICAgIC8vIFVwbG9hZCB0aGUgdmFsdWVzIG9mIHRoZSB0ZW5zb3IgYXMgdW5pZm9ybS5cbiAgICAgIGlmICh1dGlsLnNpemVGcm9tU2hhcGUoaW5wdXQuc2hhcGUpIDwgMikge1xuICAgICAgICBncGdwdS5nbC51bmlmb3JtMWYodmFyTG9jLCBpbnB1dC51bmlmb3JtVmFsdWVzWzBdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCB2YWxzID0gaW5wdXQudW5pZm9ybVZhbHVlcztcbiAgICAgICAgaWYgKCEodmFscyBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSkpIHtcbiAgICAgICAgICB2YWxzID0gbmV3IEZsb2F0MzJBcnJheSh2YWxzKTtcbiAgICAgICAgfVxuICAgICAgICBncGdwdS5nbC51bmlmb3JtMWZ2KHZhckxvYywgdmFscyk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGlucHV0IHdhcyBzbGljZWQsIHVwbG9hZCB0aGUgZmxhdCBvZmZzZXQgaW5kZXguXG4gICAgaWYgKGlucHV0LnRleERhdGEuc2xpY2UgIT0gbnVsbCAmJiB2YXJPZmZzZXRMb2MgIT0gbnVsbCkge1xuICAgICAgZ3BncHUuZ2wudW5pZm9ybTFpKHZhck9mZnNldExvYywgaW5wdXQudGV4RGF0YS5zbGljZS5mbGF0T2Zmc2V0KTtcbiAgICB9XG5cbiAgICBncGdwdS5zZXRJbnB1dE1hdHJpeFRleHR1cmUoaW5wdXQudGV4RGF0YS50ZXh0dXJlLCB2YXJMb2MsIGkpO1xuICB9KTtcblxuICBjb25zdCBvdXRTaGFwZUxvYyA9IGJpbmFyeS5vdXRTaGFwZUxvY2F0aW9uO1xuICBpZiAob3V0U2hhcGVMb2MpIHtcbiAgICBzd2l0Y2ggKG91dHB1dC5zaGFwZS5sZW5ndGgpIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgZ3BncHUuZ2wudW5pZm9ybTFpdihvdXRTaGFwZUxvYywgbmV3IEludDMyQXJyYXkob3V0cHV0LnNoYXBlKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICBncGdwdS5nbC51bmlmb3JtMml2KG91dFNoYXBlTG9jLCBuZXcgSW50MzJBcnJheShvdXRwdXQuc2hhcGUpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIGdwZ3B1LmdsLnVuaWZvcm0zaXYob3V0U2hhcGVMb2MsIG5ldyBJbnQzMkFycmF5KG91dHB1dC5zaGFwZSkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNDpcbiAgICAgICAgZ3BncHUuZ2wudW5pZm9ybTRpdihvdXRTaGFwZUxvYywgbmV3IEludDMyQXJyYXkob3V0cHV0LnNoYXBlKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGlmIChiaW5hcnkub3V0U2hhcGVTdHJpZGVzTG9jYXRpb24pIHtcbiAgICBjb25zdCBzdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhvdXRwdXQuc2hhcGUpO1xuICAgIHN3aXRjaCAob3V0cHV0LnNoYXBlLmxlbmd0aCkge1xuICAgICAgY2FzZSAyOlxuICAgICAgICBncGdwdS5nbC51bmlmb3JtMWl2KFxuICAgICAgICAgICAgYmluYXJ5Lm91dFNoYXBlU3RyaWRlc0xvY2F0aW9uLCBuZXcgSW50MzJBcnJheShzdHJpZGVzKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOlxuICAgICAgICBncGdwdS5nbC51bmlmb3JtMml2KFxuICAgICAgICAgICAgYmluYXJ5Lm91dFNoYXBlU3RyaWRlc0xvY2F0aW9uLCBuZXcgSW50MzJBcnJheShzdHJpZGVzKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA0OlxuICAgICAgICBncGdwdS5nbC51bmlmb3JtM2l2KFxuICAgICAgICAgICAgYmluYXJ5Lm91dFNoYXBlU3RyaWRlc0xvY2F0aW9uLCBuZXcgSW50MzJBcnJheShzdHJpZGVzKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGlmIChiaW5hcnkub3V0VGV4U2hhcGVMb2NhdGlvbikge1xuICAgIGdwZ3B1LmdsLnVuaWZvcm0yaShcbiAgICAgICAgYmluYXJ5Lm91dFRleFNoYXBlTG9jYXRpb24sIG91dHB1dC50ZXhEYXRhLnRleFNoYXBlWzBdLFxuICAgICAgICBvdXRwdXQudGV4RGF0YS50ZXhTaGFwZVsxXSk7XG4gIH1cblxuICBpZiAoYmluYXJ5LnByb2dyYW0uY3VzdG9tVW5pZm9ybXMgJiYgY3VzdG9tVW5pZm9ybVZhbHVlcykge1xuICAgIGJpbmFyeS5wcm9ncmFtLmN1c3RvbVVuaWZvcm1zLmZvckVhY2goKGQsIGkpID0+IHtcbiAgICAgIGNvbnN0IGN1c3RvbUxvYyA9IGJpbmFyeS5jdXN0b21Vbmlmb3JtTG9jYXRpb25zW2ldO1xuICAgICAgY29uc3QgY3VzdG9tVmFsdWUgPSBjdXN0b21Vbmlmb3JtVmFsdWVzW2ldO1xuICAgICAgaWYgKGQudHlwZSA9PT0gJ2Zsb2F0Jykge1xuICAgICAgICBncGdwdS5nbC51bmlmb3JtMWZ2KGN1c3RvbUxvYywgY3VzdG9tVmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChkLnR5cGUgPT09ICd2ZWMyJykge1xuICAgICAgICBncGdwdS5nbC51bmlmb3JtMmZ2KGN1c3RvbUxvYywgY3VzdG9tVmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChkLnR5cGUgPT09ICd2ZWMzJykge1xuICAgICAgICBncGdwdS5nbC51bmlmb3JtM2Z2KGN1c3RvbUxvYywgY3VzdG9tVmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChkLnR5cGUgPT09ICd2ZWM0Jykge1xuICAgICAgICBncGdwdS5nbC51bmlmb3JtNGZ2KGN1c3RvbUxvYywgY3VzdG9tVmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChkLnR5cGUgPT09ICdpbnQnKSB7XG4gICAgICAgIGdwZ3B1LmdsLnVuaWZvcm0xaXYoY3VzdG9tTG9jLCBjdXN0b21WYWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGQudHlwZSA9PT0gJ2l2ZWMyJykge1xuICAgICAgICBncGdwdS5nbC51bmlmb3JtMml2KGN1c3RvbUxvYywgY3VzdG9tVmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChkLnR5cGUgPT09ICdpdmVjMycpIHtcbiAgICAgICAgZ3BncHUuZ2wudW5pZm9ybTNpdihjdXN0b21Mb2MsIGN1c3RvbVZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoZC50eXBlID09PSAnaXZlYzQnKSB7XG4gICAgICAgIGdwZ3B1LmdsLnVuaWZvcm00aXYoY3VzdG9tTG9jLCBjdXN0b21WYWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBFcnJvcihgdW5pZm9ybSB0eXBlICR7ZC50eXBlfSBpcyBub3Qgc3VwcG9ydGVkIHlldC5gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBncGdwdS5leGVjdXRlUHJvZ3JhbSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFrZVNoYWRlcktleShcbiAgICBwcm9ncmFtOiBHUEdQVVByb2dyYW0sIGlucHV0czogVGVuc29yRGF0YVtdLCBvdXRwdXQ6IFRlbnNvckRhdGEpOiBzdHJpbmcge1xuICBsZXQga2V5SW5wdXRzID0gJyc7XG4gIGlucHV0cy5jb25jYXQob3V0cHV0KS5mb3JFYWNoKHggPT4ge1xuICAgIGNvbnN0IGhhc09mZnNldCA9IHgudGV4RGF0YSAhPSBudWxsICYmIHgudGV4RGF0YS5zbGljZSAhPSBudWxsICYmXG4gICAgICAgIHgudGV4RGF0YS5zbGljZS5mbGF0T2Zmc2V0ID4gMDtcbiAgICAvLyBUT0RPOiBSZW1vdmUgdGhlIGNvbmRpdGlvbiBvZiAheC5pc1VuaWZvcm0uXG4gICAgaWYgKHByb2dyYW0uZW5hYmxlU2hhcGVVbmlmb3JtcyAmJiAheC5pc1VuaWZvcm0pIHtcbiAgICAgIGNvbnN0IHhUZXhTaGFwZSA9IHgudGV4RGF0YS50ZXhTaGFwZTtcbiAgICAgIGNvbnN0IHt1c2VTcXVlZXplU2hhcGUsIHVuaWZvcm1TaGFwZSwga2VwdERpbXN9ID1cbiAgICAgICAgICBzaGFkZXJfY29tcGlsZXIuZ2V0VW5pZm9ybUluZm9Gcm9tU2hhcGUoXG4gICAgICAgICAgICAgIHByb2dyYW0ucGFja2VkSW5wdXRzLCB4LnNoYXBlLCB4VGV4U2hhcGUpO1xuICAgICAgbGV0IHJhbmsxID0gJycsIHJhbmsyID0gJycsIHJhbmszNCA9ICcnO1xuICAgICAgaWYgKHVuaWZvcm1TaGFwZS5sZW5ndGggPT09IDEgJiYgcHJvZ3JhbS5wYWNrZWRJbnB1dHMpIHtcbiAgICAgICAgY29uc3QgcGFja2VkVGV4U2hhcGUgPVxuICAgICAgICAgICAgW01hdGguY2VpbCh4VGV4U2hhcGVbMF0gLyAyKSwgTWF0aC5jZWlsKHhUZXhTaGFwZVsxXSAvIDIpXTtcbiAgICAgICAgcmFuazEgPSBgJHtwYWNrZWRUZXhTaGFwZVswXSA+IDF9XyR7cGFja2VkVGV4U2hhcGVbMV0gPiAxfWA7XG4gICAgICB9IGVsc2UgaWYgKHVuaWZvcm1TaGFwZS5sZW5ndGggPT09IDIgJiYgIXByb2dyYW0ucGFja2VkSW5wdXRzKSB7XG4gICAgICAgIHJhbmsyID0gYCR7dW5pZm9ybVNoYXBlWzBdID4gMX1fJHt1bmlmb3JtU2hhcGVbMV0gPiAxfWA7XG4gICAgICB9IGVsc2UgaWYgKHVuaWZvcm1TaGFwZS5sZW5ndGggPiAyICYmICFwcm9ncmFtLnBhY2tlZElucHV0cykge1xuICAgICAgICBjb25zdCBzdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyh1bmlmb3JtU2hhcGUpO1xuICAgICAgICByYW5rMzQgPSBgJHtzdHJpZGVzWzBdID09PSB4VGV4U2hhcGVbMV19XyR7XG4gICAgICAgICAgICBzdHJpZGVzW3N0cmlkZXMubGVuZ3RoIC0gMV0gPT09IHhUZXhTaGFwZVsxXX1gO1xuICAgICAgfVxuICAgICAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcbiAgICAgIGNvbnN0IGlzTG9naWNhbFNoYXBUZXhTaGFwZUVxdWFsID1cbiAgICAgICAgICB1bmlmb3JtU2hhcGUubGVuZ3RoID09PSAyICYmIHV0aWwuYXJyYXlzRXF1YWwoeC5zaGFwZSwgeFRleFNoYXBlKTtcbiAgICAgIGNvbnN0IGlzU2NhbGFyID0gdXRpbC5zaXplRnJvbVNoYXBlKHguc2hhcGUpID09PSAxO1xuICAgICAgY29uc3QgYnJvYWRjYXN0RGltcyA9XG4gICAgICAgICAgYmFja2VuZF91dGlsLmdldEJyb2FkY2FzdERpbXMoeC5zaGFwZSwgb3V0cHV0LnNoYXBlKTtcbiAgICAgIGNvbnN0IGlzSW5PdXRUZXhTaGFwZUVxdWFsID0gIXByb2dyYW0ucGFja2VkSW5wdXRzICYmXG4gICAgICAgICAgeFJhbmsgPT09IG91dHB1dC5zaGFwZS5sZW5ndGggJiZcbiAgICAgICAgICB1dGlsLmFycmF5c0VxdWFsKHhUZXhTaGFwZSwgb3V0cHV0LnRleERhdGEudGV4U2hhcGUpO1xuICAgICAgY29uc3QgaXNUZXhTaGFwZUdyZWF0ZXJUaGFuT25lID1cbiAgICAgICAgICBwcm9ncmFtLnBhY2tlZElucHV0cyB8fCB1bmlmb3JtU2hhcGUubGVuZ3RoID4gMiA/XG4gICAgICAgICAgJycgOlxuICAgICAgICAgIGAke3hUZXhTaGFwZVswXSA+IDF9XyR7eFRleFNoYXBlWzFdID4gMX1gO1xuICAgICAgLy8gVGhlc2Uga2V5IGNvbXBvbmVudHMgYXJlIG5lZWRlZCBkdWUgdG8gc2hhZGVyX2NvbXBpbGVyIGlzIGVtYmVkZGluZ1xuICAgICAgLy8gdGhlbSBpbiB0aGUgc2hhZGVyLlxuICAgICAgLy8gfHhSYW5rfCBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgY29vcmRzIGxlbmd0aC4gU2VlXG4gICAgICAvLyBnZXRbUGFja2VkXVNhbXBsZXJBdE91dHB1dENvb3Jkcy5cbiAgICAgIC8vIHxpc0luT3V0VGV4U2hhcGVFcXVhbHwgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciBnb2luZyB0byBhblxuICAgICAgLy8gb3B0aW1pemF0aW9uIHBhdGggaW4gZ2V0U2FtcGxlckF0T3V0cHV0Q29vcmRzLlxuICAgICAgLy8gfHVzZVNxdWVlemVTaGFwZXwgaXMgZXh0cmFjdGVkIGZyb20gc3F1ZWV6ZUlucHV0SW5mbyBvZlxuICAgICAgLy8gZ2V0U2FtcGxlclsyfDN8NF1EL2dldFBhY2tlZFNhbXBsZXIzRC5cbiAgICAgIC8vIHxpc1NjYWxhcnwgaXMgZXh0cmFjdGVkIGZyb20gaXNJbnB1dFNjYWxhci9pc091dHB1dFNjYWxhciBpblxuICAgICAgLy8gZ2V0UGFja2VkU2FtcGxlckF0T3V0cHV0Q29vcmRzLlxuICAgICAgLy8gfGJyb2FkY2FzdERpbXN8IGlzIGV4dHJhY3RlZCBmcm9tIGdldFtQYWNrZWRdU2FtcGxlckF0T3V0cHV0Q29vcmRzLlxuICAgICAgLy8gfGlzTG9naWNhbFNoYXBUZXhTaGFwZUVxdWFsfCBpcyB1c2VkIGluXG4gICAgICAvLyBnZXRPdXRwdXRbUGFja2VkXTJEQ29vcmRzL2dldFtQYWNrZWRdU2FtcGxlcjJELlxuICAgICAgLy8gfHJhbmsxfCBpcyB1c2VkIGluIGdldE91dHB1dFBhY2tlZDFEQ29vcmRzLlxuICAgICAgLy8gfHJhbmsyfCBpcyB1c2VkIGluIGdldE91dHB1dDJEQ29vcmRzLlxuICAgICAgLy8gfHJhbmszNHwgaXMgdXNlZCBpbiBnZXRTYW1wbGVyM0QvZ2V0U2FtcGxlcjRELlxuICAgICAgLy8gfGlzVGV4U2hhcGVHcmVhdGVyVGhhbk9uZXwgYXJlIHVzZWQgaW5cbiAgICAgIC8vIGdldFNhbXBsZXJbU2NhbGFyfDFEfDJEXS9nZXRPdXRwdXQxRENvb3Jkcy5cbiAgICAgIGtleUlucHV0cyArPSBgJHt4UmFua31fJHtpc0luT3V0VGV4U2hhcGVFcXVhbH1fJHtcbiAgICAgICAgICB1c2VTcXVlZXplU2hhcGUgPyBrZXB0RGltcyA6ICcnfV8ke3VuaWZvcm1TaGFwZS5sZW5ndGh9XyR7aXNTY2FsYXJ9XyR7XG4gICAgICAgICAgYnJvYWRjYXN0RGltc31fJHtpc0xvZ2ljYWxTaGFwVGV4U2hhcGVFcXVhbH1fJHtyYW5rMX1fJHtyYW5rMn1fJHtcbiAgICAgICAgICByYW5rMzR9XyR7aXNUZXhTaGFwZUdyZWF0ZXJUaGFuT25lfV8ke2hhc09mZnNldH1gO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0ZXhTaGFwZSA9IHguaXNVbmlmb3JtID8gJ3VuaWZvcm0nIDogeC50ZXhEYXRhLnRleFNoYXBlO1xuICAgICAga2V5SW5wdXRzICs9IGAke3guc2hhcGV9XyR7dGV4U2hhcGV9XyR7aGFzT2Zmc2V0fWA7XG4gICAgfVxuICB9KTtcbiAgY29uc3Qga2V5VXNlckNvZGUgPSBwcm9ncmFtLnVzZXJDb2RlO1xuICBsZXQga2V5ID0gcHJvZ3JhbS5jb25zdHJ1Y3Rvci5uYW1lO1xuICAvLyBGYXN0IHN0cmluZyBjb25jYXQuIFNlZSBodHRwczovL2pzcGVyZi5jb20vc3RyaW5nLWNvbmNhdGVuYXRpb24vMTQuXG4gIGtleSArPSAnXycgKyBrZXlJbnB1dHMgKyAnXycgKyBrZXlVc2VyQ29kZSArXG4gICAgICBgJHtlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX1ZFUlNJT04nKX1gO1xuICByZXR1cm4ga2V5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlU2hhcGVVbmlmb3JtcyhyYW5rOiBudW1iZXIpIHtcbiAgLy8gVE9ETzogUmVtb3ZlIHRoZSBsaW1pdGFpb24gb2YgcmFuayA8PSA0LlxuICByZXR1cm4gZW52KCkuZ2V0Qm9vbCgnV0VCR0xfVVNFX1NIQVBFU19VTklGT1JNUycpICYmIHJhbmsgPD0gNDtcbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtQaXhlbERhdGEsIFR5cGVkQXJyYXl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7Z2V0R2xzbERpZmZlcmVuY2VzfSBmcm9tICcuL2dsc2xfdmVyc2lvbic7XG5pbXBvcnQgKiBhcyB0ZXhfdXRpbCBmcm9tICcuL3RleF91dGlsJztcbmltcG9ydCB7VGV4dHVyZUNvbmZpZ30gZnJvbSAnLi90ZXhfdXRpbCc7XG5pbXBvcnQgKiBhcyB3ZWJnbF91dGlsIGZyb20gJy4vd2ViZ2xfdXRpbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVWZXJ0ZXhTaGFkZXIoZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCk6IFdlYkdMU2hhZGVyIHtcbiAgY29uc3QgZ2xzbCA9IGdldEdsc2xEaWZmZXJlbmNlcygpO1xuICBjb25zdCB2ZXJ0ZXhTaGFkZXJTb3VyY2UgPSBgJHtnbHNsLnZlcnNpb259XG4gICAgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xuICAgICR7Z2xzbC5hdHRyaWJ1dGV9IHZlYzMgY2xpcFNwYWNlUG9zO1xuICAgICR7Z2xzbC5hdHRyaWJ1dGV9IHZlYzIgdXY7XG4gICAgJHtnbHNsLnZhcnlpbmdWc30gdmVjMiByZXN1bHRVVjtcblxuICAgIHZvaWQgbWFpbigpIHtcbiAgICAgIGdsX1Bvc2l0aW9uID0gdmVjNChjbGlwU3BhY2VQb3MsIDEpO1xuICAgICAgcmVzdWx0VVYgPSB1djtcbiAgICB9YDtcbiAgcmV0dXJuIHdlYmdsX3V0aWwuY3JlYXRlVmVydGV4U2hhZGVyKGdsLCB2ZXJ0ZXhTaGFkZXJTb3VyY2UpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVmVydGV4QnVmZmVyKGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQpOiBXZWJHTEJ1ZmZlciB7XG4gIC8vIFt4IHkgeiB1IHZdICogW3VwcGVyLWxlZnQsIGxvd2VyLWxlZnQsIHVwcGVyLXJpZ2h0LCBsb3dlci1yaWdodF1cbiAgY29uc3QgdmVydGV4QXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KFxuICAgICAgWy0xLCAxLCAwLCAwLCAxLCAtMSwgLTEsIDAsIDAsIDAsIDEsIDEsIDAsIDEsIDEsIDEsIC0xLCAwLCAxLCAwXSk7XG4gIHJldHVybiB3ZWJnbF91dGlsLmNyZWF0ZVN0YXRpY1ZlcnRleEJ1ZmZlcihnbCwgdmVydGV4QXJyYXkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSW5kZXhCdWZmZXIoZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCk6IFdlYkdMQnVmZmVyIHtcbiAgLy8gT3BlbkdMIChhbmQgV2ViR0wpIGhhdmUgXCJDQ1cgPT0gZnJvbnRcIiB3aW5kaW5nXG4gIGNvbnN0IHRyaWFuZ2xlVmVydGV4SW5kaWNlcyA9IG5ldyBVaW50MTZBcnJheShbMCwgMSwgMiwgMiwgMSwgM10pO1xuICByZXR1cm4gd2ViZ2xfdXRpbC5jcmVhdGVTdGF0aWNJbmRleEJ1ZmZlcihnbCwgdHJpYW5nbGVWZXJ0ZXhJbmRpY2VzKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQW5kQ29uZmlndXJlVGV4dHVyZShcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcixcbiAgICBpbnRlcm5hbEZvcm1hdDogbnVtYmVyLCB0ZXh0dXJlRm9ybWF0OiBudW1iZXIsXG4gICAgdGV4dHVyZVR5cGU6IG51bWJlcik6IFdlYkdMVGV4dHVyZSB7XG4gIHdlYmdsX3V0aWwudmFsaWRhdGVUZXh0dXJlU2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgY29uc3QgdGV4dHVyZSA9IHdlYmdsX3V0aWwuY3JlYXRlVGV4dHVyZShnbCk7XG5cbiAgY29uc3QgdGV4MmQgPSBnbC5URVhUVVJFXzJEO1xuICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuYmluZFRleHR1cmUodGV4MmQsIHRleHR1cmUpKTtcbiAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soXG4gICAgICBnbCwgKCkgPT4gZ2wudGV4UGFyYW1ldGVyaSh0ZXgyZCwgZ2wuVEVYVFVSRV9XUkFQX1MsIGdsLkNMQU1QX1RPX0VER0UpKTtcbiAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soXG4gICAgICBnbCwgKCkgPT4gZ2wudGV4UGFyYW1ldGVyaSh0ZXgyZCwgZ2wuVEVYVFVSRV9XUkFQX1QsIGdsLkNMQU1QX1RPX0VER0UpKTtcbiAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soXG4gICAgICBnbCwgKCkgPT4gZ2wudGV4UGFyYW1ldGVyaSh0ZXgyZCwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5ORUFSRVNUKSk7XG4gIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKFxuICAgICAgZ2wsICgpID0+IGdsLnRleFBhcmFtZXRlcmkodGV4MmQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTkVBUkVTVCkpO1xuICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhcbiAgICAgIGdsLFxuICAgICAgKCkgPT4gZ2wudGV4SW1hZ2UyRChcbiAgICAgICAgICB0ZXgyZCwgMCwgaW50ZXJuYWxGb3JtYXQsIHdpZHRoLCBoZWlnaHQsIDAsIHRleHR1cmVGb3JtYXQsXG4gICAgICAgICAgdGV4dHVyZVR5cGUsIG51bGwpKTtcbiAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIG51bGwpKTtcbiAgcmV0dXJuIHRleHR1cmU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnRlcm5hbEZvcm1hdEZvckZsb2F0MzJNYXRyaXhUZXh0dXJlKFxuICAgIHRleHR1cmVDb25maWc6IFRleHR1cmVDb25maWcpIHtcbiAgcmV0dXJuIHRleHR1cmVDb25maWcuaW50ZXJuYWxGb3JtYXRGbG9hdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZsb2F0MzJNYXRyaXhUZXh0dXJlKFxuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHJvd3M6IG51bWJlciwgY29sdW1uczogbnVtYmVyLFxuICAgIHRleHR1cmVDb25maWc6IFRleHR1cmVDb25maWcpOiBXZWJHTFRleHR1cmUge1xuICBjb25zdCBbd2lkdGgsIGhlaWdodF0gPVxuICAgICAgdGV4X3V0aWwuZ2V0VW5wYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodChyb3dzLCBjb2x1bW5zKTtcbiAgcmV0dXJuIGNyZWF0ZUFuZENvbmZpZ3VyZVRleHR1cmUoXG4gICAgICBnbCwgd2lkdGgsIGhlaWdodCxcbiAgICAgIGdldEludGVybmFsRm9ybWF0Rm9yRmxvYXQzMk1hdHJpeFRleHR1cmUodGV4dHVyZUNvbmZpZyksXG4gICAgICB0ZXh0dXJlQ29uZmlnLnRleHR1cmVGb3JtYXRGbG9hdCwgZ2wuRkxPQVQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW50ZXJuYWxGb3JtYXRGb3JGbG9hdDE2TWF0cml4VGV4dHVyZShcbiAgICB0ZXh0dXJlQ29uZmlnOiBUZXh0dXJlQ29uZmlnKSB7XG4gIHJldHVybiB0ZXh0dXJlQ29uZmlnLmludGVybmFsRm9ybWF0SGFsZkZsb2F0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRmxvYXQxNk1hdHJpeFRleHR1cmUoXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgcm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIsXG4gICAgdGV4dHVyZUNvbmZpZzogVGV4dHVyZUNvbmZpZyk6IFdlYkdMVGV4dHVyZSB7XG4gIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9XG4gICAgICB0ZXhfdXRpbC5nZXRVbnBhY2tlZE1hdHJpeFRleHR1cmVTaGFwZVdpZHRoSGVpZ2h0KHJvd3MsIGNvbHVtbnMpO1xuICByZXR1cm4gY3JlYXRlQW5kQ29uZmlndXJlVGV4dHVyZShcbiAgICAgIGdsLCB3aWR0aCwgaGVpZ2h0LFxuICAgICAgZ2V0SW50ZXJuYWxGb3JtYXRGb3JGbG9hdDE2TWF0cml4VGV4dHVyZSh0ZXh0dXJlQ29uZmlnKSxcbiAgICAgIHRleHR1cmVDb25maWcudGV4dHVyZUZvcm1hdEZsb2F0LCB0ZXh0dXJlQ29uZmlnLnRleHR1cmVUeXBlSGFsZkZsb2F0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEludGVybmFsRm9ybWF0Rm9yVW5zaWduZWRCeXRlc01hdHJpeFRleHR1cmUoXG4gICAgdGV4dHVyZUNvbmZpZzogVGV4dHVyZUNvbmZpZykge1xuICByZXR1cm4gdGV4dHVyZUNvbmZpZy5kb3dubG9hZFRleHR1cmVGb3JtYXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVVbnNpZ25lZEJ5dGVzTWF0cml4VGV4dHVyZShcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCByb3dzOiBudW1iZXIsIGNvbHVtbnM6IG51bWJlcixcbiAgICB0ZXh0dXJlQ29uZmlnOiBUZXh0dXJlQ29uZmlnKTogV2ViR0xUZXh0dXJlIHtcbiAgY29uc3QgW3dpZHRoLCBoZWlnaHRdID1cbiAgICAgIHRleF91dGlsLmdldFVucGFja2VkTWF0cml4VGV4dHVyZVNoYXBlV2lkdGhIZWlnaHQocm93cywgY29sdW1ucyk7XG4gIHJldHVybiBjcmVhdGVBbmRDb25maWd1cmVUZXh0dXJlKFxuICAgICAgZ2wsIHdpZHRoLCBoZWlnaHQsXG4gICAgICBnZXRJbnRlcm5hbEZvcm1hdEZvclVuc2lnbmVkQnl0ZXNNYXRyaXhUZXh0dXJlKHRleHR1cmVDb25maWcpLCBnbC5SR0JBLFxuICAgICAgZ2wuVU5TSUdORURfQllURSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnRlcm5hbEZvcm1hdEZvclBhY2tlZE1hdHJpeFRleHR1cmUoXG4gICAgdGV4dHVyZUNvbmZpZzogVGV4dHVyZUNvbmZpZykge1xuICByZXR1cm4gdGV4dHVyZUNvbmZpZy5pbnRlcm5hbEZvcm1hdFBhY2tlZEZsb2F0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUGFja2VkTWF0cml4VGV4dHVyZShcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCByb3dzOiBudW1iZXIsIGNvbHVtbnM6IG51bWJlcixcbiAgICB0ZXh0dXJlQ29uZmlnOiBUZXh0dXJlQ29uZmlnKTogV2ViR0xUZXh0dXJlIHtcbiAgY29uc3QgW3dpZHRoLCBoZWlnaHRdID1cbiAgICAgIHRleF91dGlsLmdldFBhY2tlZE1hdHJpeFRleHR1cmVTaGFwZVdpZHRoSGVpZ2h0KHJvd3MsIGNvbHVtbnMpO1xuICByZXR1cm4gY3JlYXRlQW5kQ29uZmlndXJlVGV4dHVyZShcbiAgICAgIGdsLCB3aWR0aCwgaGVpZ2h0LCBnZXRJbnRlcm5hbEZvcm1hdEZvclBhY2tlZE1hdHJpeFRleHR1cmUodGV4dHVyZUNvbmZpZyksXG4gICAgICBnbC5SR0JBLCBnbC5GTE9BVCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnRlcm5hbEZvcm1hdEZvckZsb2F0MTZQYWNrZWRNYXRyaXhUZXh0dXJlKFxuICAgIHRleHR1cmVDb25maWc6IFRleHR1cmVDb25maWcpIHtcbiAgcmV0dXJuIHRleHR1cmVDb25maWcuaW50ZXJuYWxGb3JtYXRQYWNrZWRIYWxmRmxvYXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGbG9hdDE2UGFja2VkTWF0cml4VGV4dHVyZShcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCByb3dzOiBudW1iZXIsIGNvbHVtbnM6IG51bWJlcixcbiAgICB0ZXh0dXJlQ29uZmlnOiBUZXh0dXJlQ29uZmlnKTogV2ViR0xUZXh0dXJlIHtcbiAgY29uc3QgW3dpZHRoLCBoZWlnaHRdID1cbiAgICAgIHRleF91dGlsLmdldFBhY2tlZE1hdHJpeFRleHR1cmVTaGFwZVdpZHRoSGVpZ2h0KHJvd3MsIGNvbHVtbnMpO1xuICByZXR1cm4gY3JlYXRlQW5kQ29uZmlndXJlVGV4dHVyZShcbiAgICAgIGdsLCB3aWR0aCwgaGVpZ2h0LFxuICAgICAgZ2V0SW50ZXJuYWxGb3JtYXRGb3JGbG9hdDE2UGFja2VkTWF0cml4VGV4dHVyZSh0ZXh0dXJlQ29uZmlnKSwgZ2wuUkdCQSxcbiAgICAgIHRleHR1cmVDb25maWcudGV4dHVyZVR5cGVIYWxmRmxvYXQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYmluZFZlcnRleFByb2dyYW1BdHRyaWJ1dGVTdHJlYW1zKFxuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHByb2dyYW06IFdlYkdMUHJvZ3JhbSxcbiAgICB2ZXJ0ZXhCdWZmZXI6IFdlYkdMQnVmZmVyKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBvc09mZnNldCA9IDA7ICAgICAgICAgICAgICAgLy8geCBpcyB0aGUgZmlyc3QgYnVmZmVyIGVsZW1lbnRcbiAgY29uc3QgdXZPZmZzZXQgPSAzICogNDsgICAgICAgICAgICAvLyB1diBjb21lcyBhZnRlciBbeCB5IHpdXG4gIGNvbnN0IHN0cmlkZSA9ICgzICogNCkgKyAoMiAqIDQpOyAgLy8geHl6ICsgdXYsIGVhY2ggZW50cnkgaXMgNC1ieXRlIGZsb2F0LlxuICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhcbiAgICAgIGdsLCAoKSA9PiBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgdmVydGV4QnVmZmVyKSk7XG4gIGNvbnN0IHN1Y2Nlc3MgPSB3ZWJnbF91dGlsLmJpbmRWZXJ0ZXhCdWZmZXJUb1Byb2dyYW1BdHRyaWJ1dGUoXG4gICAgICBnbCwgcHJvZ3JhbSwgJ2NsaXBTcGFjZVBvcycsIHZlcnRleEJ1ZmZlciwgMywgc3RyaWRlLCBwb3NPZmZzZXQpO1xuICByZXR1cm4gc3VjY2VzcyAmJlxuICAgICAgd2ViZ2xfdXRpbC5iaW5kVmVydGV4QnVmZmVyVG9Qcm9ncmFtQXR0cmlidXRlKFxuICAgICAgICAgIGdsLCBwcm9ncmFtLCAndXYnLCB2ZXJ0ZXhCdWZmZXIsIDIsIHN0cmlkZSwgdXZPZmZzZXQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBsb2FkRGVuc2VNYXRyaXhUb1RleHR1cmUoXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgdGV4dHVyZTogV2ViR0xUZXh0dXJlLCB3aWR0aDogbnVtYmVyLFxuICAgIGhlaWdodDogbnVtYmVyLCBkYXRhOiBUeXBlZEFycmF5LCB0ZXh0dXJlQ29uZmlnOiBUZXh0dXJlQ29uZmlnKSB7XG4gIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0ZXh0dXJlKSk7XG5cbiAgbGV0IGRhdGFGb3JVcGxvYWQ6IFR5cGVkQXJyYXksIHRleGVsRGF0YVR5cGU6IG51bWJlciwgaW50ZXJuYWxGb3JtYXQ6IG51bWJlcjtcbiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgZGF0YUZvclVwbG9hZCA9IG5ldyBVaW50OEFycmF5KHdpZHRoICogaGVpZ2h0ICogNCk7XG4gICAgdGV4ZWxEYXRhVHlwZSA9IGdsLlVOU0lHTkVEX0JZVEU7XG4gICAgaW50ZXJuYWxGb3JtYXQgPSBnbC5SR0JBO1xuICB9IGVsc2Uge1xuICAgIGRhdGFGb3JVcGxvYWQgPSBuZXcgRmxvYXQzMkFycmF5KHdpZHRoICogaGVpZ2h0ICogNCk7XG4gICAgdGV4ZWxEYXRhVHlwZSA9IGdsLkZMT0FUO1xuICAgIGludGVybmFsRm9ybWF0ID0gdGV4dHVyZUNvbmZpZy5pbnRlcm5hbEZvcm1hdFBhY2tlZEZsb2F0O1xuICB9XG5cbiAgZGF0YUZvclVwbG9hZC5zZXQoZGF0YSk7XG5cbiAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soXG4gICAgICBnbCxcbiAgICAgICgpID0+IGdsLnRleEltYWdlMkQoXG4gICAgICAgICAgZ2wuVEVYVFVSRV8yRCwgMCwgaW50ZXJuYWxGb3JtYXQsIHdpZHRoLCBoZWlnaHQsIDAsIGdsLlJHQkEsXG4gICAgICAgICAgdGV4ZWxEYXRhVHlwZSwgZGF0YUZvclVwbG9hZCkpO1xuXG4gIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBudWxsKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGxvYWRQaXhlbERhdGFUb1RleHR1cmUoXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgdGV4dHVyZTogV2ViR0xUZXh0dXJlLFxuICAgIHBpeGVsczogUGl4ZWxEYXRhfEltYWdlRGF0YXxIVE1MSW1hZ2VFbGVtZW50fEhUTUxDYW52YXNFbGVtZW50fFxuICAgIEhUTUxWaWRlb0VsZW1lbnR8SW1hZ2VCaXRtYXApIHtcbiAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRleHR1cmUpKTtcbiAgaWYgKChwaXhlbHMgYXMgUGl4ZWxEYXRhKS5kYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKFxuICAgICAgICBnbCxcbiAgICAgICAgKCkgPT4gZ2wudGV4SW1hZ2UyRChcbiAgICAgICAgICAgIGdsLlRFWFRVUkVfMkQsIDAsIGdsLlJHQkEsIHBpeGVscy53aWR0aCwgcGl4ZWxzLmhlaWdodCwgMCwgZ2wuUkdCQSxcbiAgICAgICAgICAgIGdsLlVOU0lHTkVEX0JZVEUsIChwaXhlbHMgYXMgUGl4ZWxEYXRhKS5kYXRhKSk7XG4gIH0gZWxzZSB7XG4gICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soXG4gICAgICAgIGdsLFxuICAgICAgICAoKSA9PiBnbC50ZXhJbWFnZTJEKFxuICAgICAgICAgICAgZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSxcbiAgICAgICAgICAgIHBpeGVscyBhcyBJbWFnZURhdGEgfCBIVE1MSW1hZ2VFbGVtZW50IHwgSFRNTENhbnZhc0VsZW1lbnQgfFxuICAgICAgICAgICAgICAgIEhUTUxWaWRlb0VsZW1lbnR8SW1hZ2VCaXRtYXApKTtcbiAgfVxuXG4gIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBudWxsKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCdWZmZXJGcm9tT3V0cHV0VGV4dHVyZShcbiAgICBnbDI6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQsIHJvd3M6IG51bWJlciwgY29sdW1uczogbnVtYmVyLFxuICAgIHRleHR1cmVDb25maWc6IFRleHR1cmVDb25maWcpOiBXZWJHTEJ1ZmZlciB7XG4gIC8vIENyZWF0ZSBhbmQgYmluZCB0aGUgYnVmZmVyLlxuICBjb25zdCBidWZmZXIgPSBnbDIuY3JlYXRlQnVmZmVyKCk7XG4gIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKFxuICAgICAgZ2wyLCAoKSA9PiBnbDIuYmluZEJ1ZmZlcihnbDIuUElYRUxfUEFDS19CVUZGRVIsIGJ1ZmZlcikpO1xuXG4gIC8vIEluaXRpYWxpemUgdGhlIGJ1ZmZlciB0byB0aGUgc2l6ZSBvZiB0aGUgdGV4dHVyZSBpbiBieXRlcy5cbiAgY29uc3QgYnl0ZXNQZXJGbG9hdCA9IDQ7XG4gIGNvbnN0IHZhbHVlc1BlclRleGVsID0gNDtcbiAgY29uc3QgYnVmZmVyU2l6ZUJ5dGVzID0gYnl0ZXNQZXJGbG9hdCAqIHZhbHVlc1BlclRleGVsICogcm93cyAqIGNvbHVtbnM7XG5cbiAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soXG4gICAgICBnbDIsXG4gICAgICAoKSA9PiBnbDIuYnVmZmVyRGF0YShcbiAgICAgICAgICBnbDIuUElYRUxfUEFDS19CVUZGRVIsIGJ1ZmZlclNpemVCeXRlcywgZ2wyLlNUUkVBTV9SRUFEKSk7XG5cbiAgLy8gRW5xdWV1ZSBhIGNvbW1hbmQgb24gdGhlIEdQVSBjb21tYW5kIHF1ZXVlIHRvIGNvcHkgb2YgdGV4dHVyZSBpbnRvIHRoZVxuICAvLyBidWZmZXIuXG4gIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKFxuICAgICAgZ2wyLCAoKSA9PiBnbDIucmVhZFBpeGVscygwLCAwLCBjb2x1bW5zLCByb3dzLCBnbDIuUkdCQSwgZ2wyLkZMT0FULCAwKSk7XG5cbiAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soXG4gICAgICBnbDIsICgpID0+IGdsMi5iaW5kQnVmZmVyKGdsMi5QSVhFTF9QQUNLX0JVRkZFUiwgbnVsbCkpO1xuXG4gIHJldHVybiBidWZmZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkb3dubG9hZEZsb2F0MzJNYXRyaXhGcm9tQnVmZmVyKFxuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIGJ1ZmZlcjogV2ViR0xCdWZmZXIsXG4gICAgc2l6ZTogbnVtYmVyKTogRmxvYXQzMkFycmF5IHtcbiAgY29uc3QgZ2wyID0gZ2wgYXMgV2ViR0wyUmVuZGVyaW5nQ29udGV4dDtcblxuICBjb25zdCBkb3dubG9hZFRhcmdldCA9IG5ldyBGbG9hdDMyQXJyYXkoc2l6ZSk7XG5cbiAgZ2wyLmJpbmRCdWZmZXIoZ2wyLlBJWEVMX1BBQ0tfQlVGRkVSLCBidWZmZXIpO1xuICBnbDIuZ2V0QnVmZmVyU3ViRGF0YShnbDIuUElYRUxfUEFDS19CVUZGRVIsIDAsIGRvd25sb2FkVGFyZ2V0KTtcbiAgZ2wyLmJpbmRCdWZmZXIoZ2wyLlBJWEVMX1BBQ0tfQlVGRkVSLCBudWxsKTtcblxuICByZXR1cm4gZG93bmxvYWRUYXJnZXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkb3dubG9hZEJ5dGVFbmNvZGVkRmxvYXRNYXRyaXhGcm9tT3V0cHV0VGV4dHVyZShcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCByb3dzOiBudW1iZXIsIGNvbHVtbnM6IG51bWJlcixcbiAgICB0ZXh0dXJlQ29uZmlnOiBUZXh0dXJlQ29uZmlnKSB7XG4gIGNvbnN0IFt3LCBoXSA9XG4gICAgICB0ZXhfdXRpbC5nZXRVbnBhY2tlZE1hdHJpeFRleHR1cmVTaGFwZVdpZHRoSGVpZ2h0KHJvd3MsIGNvbHVtbnMpO1xuXG4gIGNvbnN0IG51bUNoYW5uZWxzID0gNDtcbiAgY29uc3QgZG93bmxvYWRUYXJnZXQgPSBuZXcgVWludDhBcnJheShcbiAgICAgIHRleF91dGlsLmdldFVucGFja2VkQXJyYXlTaXplRnJvbU1hdHJpeFNpemUocm93cyAqIGNvbHVtbnMsIG51bUNoYW5uZWxzKSk7XG5cbiAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soXG4gICAgICBnbCxcbiAgICAgICgpID0+IGdsLnJlYWRQaXhlbHMoXG4gICAgICAgICAgMCwgMCwgdywgaCwgdGV4dHVyZUNvbmZpZy5kb3dubG9hZFRleHR1cmVGb3JtYXQsIGdsLlVOU0lHTkVEX0JZVEUsXG4gICAgICAgICAgZG93bmxvYWRUYXJnZXQpKTtcblxuICAvLyBCeSB3cmFwcGluZyB0aGUgYnVmZmVyIGluIGEgRmxvYXQzMkFycmF5LCB3ZSB1c2UgbmF0aXZlIGJyb3dzZXIgSUVFRSA3NTRcbiAgLy8gZGVjb2Rpbmcgb2YgdGhlIDQgYnl0ZXMgdGhhdCBiYWNrIGVhY2ggMzIgYml0IGZsb2F0LlxuICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheShkb3dubG9hZFRhcmdldC5idWZmZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZG93bmxvYWRQYWNrZWRNYXRyaXhGcm9tQnVmZmVyKFxuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIGJ1ZmZlcjogV2ViR0xCdWZmZXIsIGJhdGNoOiBudW1iZXIsIHJvd3M6IG51bWJlcixcbiAgICBjb2xzOiBudW1iZXIsIHBoeXNpY2FsUm93czogbnVtYmVyLCBwaHlzaWNhbENvbHM6IG51bWJlcixcbiAgICB0ZXh0dXJlQ29uZmlnOiBUZXh0dXJlQ29uZmlnKTogRmxvYXQzMkFycmF5IHtcbiAgY29uc3QgZ2wyID0gZ2wgYXMgV2ViR0wyUmVuZGVyaW5nQ29udGV4dDtcblxuICBjb25zdCBkb3dubG9hZFRhcmdldCA9XG4gICAgICBuZXcgRmxvYXQzMkFycmF5KHRleF91dGlsLmdldFBhY2tlZFJHQkFBcnJheVNpemVGcm9tTWF0cml4U2hhcGUoXG4gICAgICAgICAgcGh5c2ljYWxSb3dzLCBwaHlzaWNhbENvbHMpKTtcblxuICBnbDIuYmluZEJ1ZmZlcihnbDIuUElYRUxfUEFDS19CVUZGRVIsIGJ1ZmZlcik7XG4gIGdsMi5nZXRCdWZmZXJTdWJEYXRhKGdsMi5QSVhFTF9QQUNLX0JVRkZFUiwgMCwgZG93bmxvYWRUYXJnZXQpO1xuICBnbDIuYmluZEJ1ZmZlcihnbDIuUElYRUxfUEFDS19CVUZGRVIsIG51bGwpO1xuXG4gIHJldHVybiBkb3dubG9hZFRhcmdldDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRvd25sb2FkTWF0cml4RnJvbVBhY2tlZE91dHB1dFRleHR1cmUoXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgcGh5c2ljYWxSb3dzOiBudW1iZXIsXG4gICAgcGh5c2ljYWxDb2xzOiBudW1iZXIpOiBGbG9hdDMyQXJyYXkge1xuICBjb25zdCBwYWNrZWRSR0JBID0gbmV3IEZsb2F0MzJBcnJheShwaHlzaWNhbFJvd3MgKiBwaHlzaWNhbENvbHMgKiA0KTtcbiAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soXG4gICAgICBnbCxcbiAgICAgICgpID0+IGdsLnJlYWRQaXhlbHMoXG4gICAgICAgICAgMCwgMCwgcGh5c2ljYWxDb2xzLCBwaHlzaWNhbFJvd3MsIGdsLlJHQkEsIGdsLkZMT0FULCBwYWNrZWRSR0JBKSk7XG5cbiAgcmV0dXJuIHBhY2tlZFJHQkE7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtnZXRHbHNsRGlmZmVyZW5jZXN9IGZyb20gJy4vZ2xzbF92ZXJzaW9uJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtLCB1c2VTaGFwZVVuaWZvcm1zfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgSW0yQ29sUGFja2VkUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgcGFja2VkSW5wdXRzID0gdHJ1ZTtcbiAgcGFja2VkT3V0cHV0ID0gdHJ1ZTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBlbmFibGVTaGFwZVVuaWZvcm1zOiBib29sZWFuO1xuICBjdXN0b21Vbmlmb3JtcyA9IFtcbiAgICB7bmFtZTogJ2lucHV0U2hhcGUnLCB0eXBlOiAnaXZlYzMnIGFzIGNvbnN0IH0sXG4gICAge25hbWU6ICdwYWQnLCB0eXBlOiAnaXZlYzInIGFzIGNvbnN0IH0sXG4gICAge25hbWU6ICdzdHJpZGUnLCB0eXBlOiAnaXZlYzInIGFzIGNvbnN0IH0sXG4gICAge25hbWU6ICdkaWxhdGlvbicsIHR5cGU6ICdpdmVjMicgYXMgY29uc3QgfSxcbiAgICB7bmFtZTogJ2luQ2hhbm5lbHMnLCB0eXBlOiAnaW50JyBhcyBjb25zdCB9LFxuICAgIHtuYW1lOiAnaXRlbXNQZXJCbG9ja1JvdycsIHR5cGU6ICdpbnQnIGFzIGNvbnN0IH0sXG4gICAge25hbWU6ICdvdXRXaWR0aCcsIHR5cGU6ICdpbnQnIGFzIGNvbnN0IH0sXG4gIF07XG5cbiAgY29uc3RydWN0b3Iob3V0cHV0U2hhcGU6IG51bWJlcltdLCBjb252SW5mbzogYmFja2VuZF91dGlsLkNvbnYyREluZm8pIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGU7XG4gICAgdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID0gdXNlU2hhcGVVbmlmb3Jtcyh0aGlzLm91dHB1dFNoYXBlLmxlbmd0aCk7XG4gICAgY29uc3Qge2RhdGFGb3JtYXR9ID0gY29udkluZm87XG4gICAgY29uc3QgZ2xzbCA9IGdldEdsc2xEaWZmZXJlbmNlcygpO1xuICAgIGNvbnN0IGlzQ2hhbm5lbHNMYXN0ID0gZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzTGFzdCc7XG4gICAgY29uc3Qgcm93RGltID0gaXNDaGFubmVsc0xhc3QgPyAwIDogMTtcbiAgICBjb25zdCBjb2xEaW0gPSBpc0NoYW5uZWxzTGFzdCA/IDEgOiAyO1xuXG4gICAgY29uc3QgYm91bmRzQ2hlY2tpbmdTbmlwcGV0ID0gdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID9cbiAgICAgICAgJ2lmKGJsb2NrSW5kZXggPCBvdXRTaGFwZVsxXSAmJiBwb3MgPCBvdXRTaGFwZVswXSkgeycgOlxuICAgICAgICBgaWYoYmxvY2tJbmRleCA8ICR7b3V0cHV0U2hhcGVbMV19ICYmIHBvcyA8ICR7b3V0cHV0U2hhcGVbMF19KSB7YDtcbiAgICBsZXQgdW5yb2xsZWQgPSBgYDtcblxuICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8PSAxOyByb3crKykge1xuICAgICAgZm9yIChsZXQgY29sID0gMDsgY29sIDw9IDE7IGNvbCsrKSB7XG4gICAgICAgIHVucm9sbGVkICs9IGBcbiAgICAgICAgICBibG9ja0luZGV4ID0gcmMueSArICR7Y29sfTtcbiAgICAgICAgICBwb3MgPSByYy54ICsgJHtyb3d9O1xuXG4gICAgICAgICAgJHtib3VuZHNDaGVja2luZ1NuaXBwZXR9XG4gICAgICAgICAgICBvZmZzZXRZID0gaW50KGJsb2NrSW5kZXggLyBvdXRXaWR0aCkgKiBzdHJpZGVbMF0gLSBwYWRbMF07XG4gICAgICAgICAgICBkMCA9IG9mZnNldFkgKyBkaWxhdGlvblswXSAqIChwb3MgLyBpdGVtc1BlckJsb2NrUm93KTtcblxuICAgICAgICAgICAgaWYoZDAgPCBpbnB1dFNoYXBlWyR7cm93RGltfV0gJiYgZDAgPj0gMCkge1xuICAgICAgICAgICAgICAvLyBVc2UgY3VzdG9tIGltb2QgaW5zdGVhZCBtb2QuIE9uIEludGVsIEdQVSwgbW9kIG1heSBnZW5lcmF0ZVxuICAgICAgICAgICAgICAvLyB1bmV4cGVjdGVkIHZhbHVlLlxuICAgICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZmpzL2lzc3Vlcy81NDQ3XG4gICAgICAgICAgICAgIG9mZnNldFggPSBpbW9kKGJsb2NrSW5kZXgsIG91dFdpZHRoKSAqIHN0cmlkZVsxXSAtIHBhZFsxXTtcbiAgICAgICAgICAgICAgZDEgPSBvZmZzZXRYICsgZGlsYXRpb25bMV0gKiAoaW1vZChwb3MsIGl0ZW1zUGVyQmxvY2tSb3cpIC9cbiAgICAgICAgICAgICAgICAgIGluQ2hhbm5lbHMpO1xuXG4gICAgICAgICAgICAgIGlmKGQxIDwgaW5wdXRTaGFwZVske2NvbERpbX1dICYmIGQxID49IDApIHtcblxuICAgICAgICAgICAgICAgIGNoID0gaW1vZChwb3MsIGluQ2hhbm5lbHMpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCR7aXNDaGFubmVsc0xhc3R9KSB7XG4gICAgICAgICAgICAgICAgICBpbm5lckRpbXMgPSB2ZWMyKGQxLCBjaCk7XG4gICAgICAgICAgICAgICAgICByZXN1bHRbJHtyb3cgKiAyICsgY29sfV0gPSBnZXRDaGFubmVsKFxuICAgICAgICAgICAgICAgICAgICBnZXRBKGQwLCBpbnQoaW5uZXJEaW1zLngpLFxuICAgICAgICAgICAgICAgICAgICBpbnQoaW5uZXJEaW1zLnkpKSwgaW5uZXJEaW1zKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgaW5uZXJEaW1zID0gdmVjMihkMCwgZDEpO1xuICAgICAgICAgICAgICAgICAgcmVzdWx0WyR7cm93ICogMiArIGNvbH1dID0gZ2V0Q2hhbm5lbChcbiAgICAgICAgICAgICAgICAgICAgZ2V0QShjaCwgaW50KGlubmVyRGltcy54KSxcbiAgICAgICAgICAgICAgICAgICAgaW50KGlubmVyRGltcy55KSksIGlubmVyRGltcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICBgO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWMyIHJjID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG5cbiAgICAgICAgdmVjNCByZXN1bHQgPSB2ZWM0KDApO1xuXG4gICAgICAgIGludCBibG9ja0luZGV4LCBwb3MsIG9mZnNldFksIGQwLCBvZmZzZXRYLCBkMSwgY2g7XG4gICAgICAgIHZlYzIgaW5uZXJEaW1zO1xuXG4gICAgICAgICR7dW5yb2xsZWR9XG5cbiAgICAgICAgJHtnbHNsLm91dHB1dH0gPSByZXN1bHQ7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBBbGwgZXhwb3J0cyBmcm9tIHRoaXMgcGFja2FnZSBzaG91bGQgYmUgaW4gYmFzZS5cbmV4cG9ydCAqIGZyb20gJy4vYmFzZSc7XG5pbXBvcnQgJy4vcmVnaXN0ZXJfYWxsX2tlcm5lbHMnO1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgZW52LCBUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge0FyZ01pbk1heFByb2dyYW19IGZyb20gJy4uL2FyZ21pbm1heF9ncHUnO1xuaW1wb3J0IHtBcmdNaW5NYXhQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9hcmdtaW5tYXhfcGFja2VkX2dwdSc7XG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuLi9rZXJuZWxzL1Jlc2hhcGUnO1xuXG5mdW5jdGlvbiBhcmdSZWR1Y2UoXG4gICAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCwgeDogVGVuc29ySW5mbywgcmVkdWNlVHlwZTogJ21heCd8J21pbicsXG4gICAgYmVzdEluZGljZXNBOiBUZW5zb3JJbmZvID0gbnVsbCk6IFRlbnNvckluZm8ge1xuICBsZXQgYmF0Y2hTaXplID0geC5zaGFwZVswXTtcbiAgbGV0IGluU2l6ZSA9IHguc2hhcGVbMV07XG4gIGlmIChiZXN0SW5kaWNlc0EgIT0gbnVsbCkge1xuICAgIGJhdGNoU2l6ZSA9IGJlc3RJbmRpY2VzQS5zaGFwZVswXTtcbiAgICBpblNpemUgPSBiZXN0SW5kaWNlc0Euc2hhcGVbMV07XG4gIH1cbiAgY29uc3Qgd2luZG93U2l6ZSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3B0aW1hbFdpbmRvd1NpemUoaW5TaXplKTtcbiAgY29uc3QgcmVkdWNlSW5mbyA9XG4gICAgICB7d2luZG93U2l6ZSwgaW5TaXplLCBiYXRjaFNpemUsIG91dFNpemU6IE1hdGguY2VpbChpblNpemUgLyB3aW5kb3dTaXplKX07XG4gIGNvbnN0IHByb2dyYW0gPVxuICAgICAgbmV3IEFyZ01pbk1heFByb2dyYW0ocmVkdWNlSW5mbywgcmVkdWNlVHlwZSwgYmVzdEluZGljZXNBID09IG51bGwpO1xuICBjb25zdCBpbnB1dHMgPSBbeF07XG4gIGlmIChiZXN0SW5kaWNlc0EgIT0gbnVsbCkge1xuICAgIGlucHV0cy5wdXNoKGJlc3RJbmRpY2VzQSk7XG4gIH1cbiAgY29uc3Qgb3V0cHV0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgaW5wdXRzLCAnaW50MzInKTtcbiAgLy8gTm8gbmVlZCB0byBydW4gYW5vdGhlciBHUEdQVSBwcm9ncmFtLlxuICBpZiAob3V0cHV0LnNoYXBlWzFdID09PSAxKSB7XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxuICBjb25zdCByZXN1bHQgPSBhcmdSZWR1Y2UoYmFja2VuZCwgeCwgcmVkdWNlVHlwZSwgb3V0cHV0KTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhvdXRwdXQpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBhcmdSZWR1Y2VQYWNrZWQoXG4gICAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCwgeDogVGVuc29ySW5mbywgcmVkdWNlVHlwZTogJ21heCd8J21pbicsXG4gICAgYmVzdEluZGljZXNBOiBUZW5zb3JJbmZvID0gbnVsbCk6IFRlbnNvckluZm8ge1xuICBjb25zdCBpblNoYXBlID0gYmVzdEluZGljZXNBICE9IG51bGwgPyBiZXN0SW5kaWNlc0Euc2hhcGUgOiB4LnNoYXBlO1xuICBjb25zdCBpblNpemUgPSBpblNoYXBlW2luU2hhcGUubGVuZ3RoIC0gMV07XG4gIGNvbnN0IHdpbmRvd1NpemUgPSBiYWNrZW5kX3V0aWwuY29tcHV0ZU9wdGltYWxXaW5kb3dTaXplKGluU2l6ZSk7XG4gIGNvbnN0IHByb2dyYW0gPSBuZXcgQXJnTWluTWF4UGFja2VkUHJvZ3JhbShcbiAgICAgIGluU2hhcGUsIHdpbmRvd1NpemUsIHJlZHVjZVR5cGUsIGJlc3RJbmRpY2VzQSA9PSBudWxsKTtcbiAgY29uc3QgaW5wdXRzID0gYmVzdEluZGljZXNBID09IG51bGwgPyBbeF0gOiBbeCwgYmVzdEluZGljZXNBXTtcbiAgY29uc3Qgb3V0cHV0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgaW5wdXRzLCAnaW50MzInKTtcbiAgaWYgKG91dHB1dC5zaGFwZS5sZW5ndGggPT09IHguc2hhcGUubGVuZ3RoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXJnUmVkdWNlUGFja2VkKGJhY2tlbmQsIHgsIHJlZHVjZVR5cGUsIG91dHB1dCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhvdXRwdXQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFyZ01pbk1heFJlZHVjZShcbiAgICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLCB4OiBUZW5zb3JJbmZvLCBheGlzOiBudW1iZXIsXG4gICAgcmVkdWNlVHlwZTogJ21pbid8J21heCcpOiBUZW5zb3JJbmZvIHtcbiAgY29uc3QgYXhlcyA9IFtheGlzXTtcbiAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKFxuICAgICAgJ2FyZycgKyByZWR1Y2VUeXBlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcmVkdWNlVHlwZS5zbGljZSgxKSwgYXhlcyxcbiAgICAgIHguc2hhcGUubGVuZ3RoKTtcbiAgaWYgKCFlbnYoKS5nZXRCb29sKCdXRUJHTF9QQUNLX1JFRFVDRScpIHx8IHguc2hhcGUubGVuZ3RoIDw9IDIpIHtcbiAgICBjb25zdCBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcyA9IFtdO1xuICAgIC8vIEVhZ2VybHkgdW5wYWNrIHggaW5wdXQgc2luY2UgaXQgaXMgcGFzc2VkIGluIHRvIGFsbCB0aGUgc2hhZGVycyB3aGljaFxuICAgIC8vIHJlcXVpcmUgdW5wYWNrZWQgaW5wdXRzLlxuICAgIGNvbnN0IHh0ZXhEYXRhID0gYmFja2VuZC50ZXhEYXRhLmdldCh4LmRhdGFJZCk7XG4gICAgY29uc3QgeElzUGFja2VkID0geHRleERhdGEgIT09IG51bGwgJiYgeHRleERhdGEuaXNQYWNrZWQ7XG4gICAgbGV0IHhVblBhY2tlZCA9IHg7XG4gICAgaWYgKHhJc1BhY2tlZCkge1xuICAgICAgeFVuUGFja2VkID0gYmFja2VuZC51bnBhY2tUZW5zb3IoeCk7XG4gICAgICBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcy5wdXNoKHhVblBhY2tlZCk7XG4gICAgfVxuXG4gICAgY29uc3QgW291dFNoYXBlLCByZWR1Y2VTaGFwZV0gPVxuICAgICAgICBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcyh4VW5QYWNrZWQuc2hhcGUsIGF4ZXMpO1xuICAgIGNvbnN0IGluU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShyZWR1Y2VTaGFwZSk7XG4gICAgY29uc3QgYTJEID0gcmVzaGFwZShcbiAgICAgICAge2lucHV0czoge3g6IHhVblBhY2tlZH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IFstMSwgaW5TaXplXX19KTtcbiAgICBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcy5wdXNoKGEyRCk7XG5cbiAgICBjb25zdCByZWR1Y2VkID0gYXJnUmVkdWNlKGJhY2tlbmQsIGEyRCwgcmVkdWNlVHlwZSk7XG4gICAgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MucHVzaChyZWR1Y2VkKTtcbiAgICBjb25zdCByZXNoYXBlZCA9XG4gICAgICAgIHJlc2hhcGUoe2lucHV0czoge3g6IHJlZHVjZWR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBvdXRTaGFwZX19KTtcblxuICAgIGludGVybWVkaWF0ZVRlbnNvckluZm9zLmZvckVhY2goXG4gICAgICAgIHQgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0KSk7XG4gICAgcmV0dXJuIHJlc2hhcGVkO1xuICB9XG4gIHJldHVybiBhcmdSZWR1Y2VQYWNrZWQoYmFja2VuZCwgeCwgcmVkdWNlVHlwZSk7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7VW5hcnlPcFByb2dyYW19IGZyb20gJy4uL3VuYXJ5b3BfZ3B1JztcblxuY29uc3QgVE9fSU5UID0gYHJldHVybiBmbG9hdChpbnQoeCkpO2A7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnQoaW5wdXQ6IFRlbnNvckluZm8sIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wpOiBUZW5zb3JJbmZvIHtcbiAgY29uc3QgcHJvZ3JhbSA9IG5ldyBVbmFyeU9wUHJvZ3JhbShpbnB1dC5zaGFwZSwgVE9fSU5UKTtcbiAgY29uc3Qgb3V0cHV0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW2lucHV0XSwgJ2ludDMyJyk7XG4gIHJldHVybiB7ZGF0YUlkOiBvdXRwdXQuZGF0YUlkLCBzaGFwZTogb3V0cHV0LnNoYXBlLCBkdHlwZTogb3V0cHV0LmR0eXBlfTtcbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIEJpbmFyeUlucHV0cywgRGF0YVR5cGUsIGVudiwgS2VybmVsRnVuYywgVHlwZWRBcnJheSwgVW5hcnlJbnB1dHMsIHVwY2FzdFR5cGV9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0JpbmFyeU9wUHJvZ3JhbX0gZnJvbSAnLi4vYmluYXJ5b3BfZ3B1JztcbmltcG9ydCB7QmluYXJ5T3BQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9iaW5hcnlvcF9wYWNrZWRfZ3B1JztcbmltcG9ydCB7Y29tcGxleH0gZnJvbSAnLi4va2VybmVscy9Db21wbGV4JztcbmltcG9ydCB7TEVBS1lSRUxVLCBMRUFLWVJFTFVfUEFDS0VEfSBmcm9tICcuLi9rZXJuZWxzL0xlYWt5UmVsdSc7XG5pbXBvcnQge1BSRUxVLCBQUkVMVV9QQUNLRUR9IGZyb20gJy4uL2tlcm5lbHMvUHJlbHUnO1xuaW1wb3J0ICogYXMgdW5hcnlfb3AgZnJvbSAnLi4vdW5hcnlvcF9ncHUnO1xuaW1wb3J0IHtVbmFyeU9wUHJvZ3JhbX0gZnJvbSAnLi4vdW5hcnlvcF9ncHUnO1xuaW1wb3J0ICogYXMgdW5hcnlfcGFja2VkX29wIGZyb20gJy4uL3VuYXJ5b3BfcGFja2VkX2dwdSc7XG5pbXBvcnQge1VuYXJ5T3BQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi91bmFyeW9wX3BhY2tlZF9ncHUnO1xuXG5pbXBvcnQge1NpbXBsZUJpbmFyeUtlcm5lbEltcGxDUFUsIFNpbXBsZVVuYXJ5S2VybmVsSW1wbENQVX0gZnJvbSAnLi9zaGFyZWQnO1xuXG5leHBvcnQgY29uc3QgQ0hFQ0tfTkFOX1NOSVBQRVRfVU5BUlkgPSBgaWYgKGlzbmFuKHgpKSByZXR1cm4geDtgO1xuXG5leHBvcnQgY29uc3QgQ0hFQ0tfTkFOX1NOSVBQRVRfQklOQVJZID0gYFxuICBpZiAoaXNuYW4oYSkpIHJldHVybiBhO1xuICBpZiAoaXNuYW4oYikpIHJldHVybiBiO1xuYDtcblxuZXhwb3J0IGNvbnN0IENIRUNLX05BTl9TTklQUEVUX0JJTkFSWV9QQUNLRUQgPSBgXG4gIHJlc3VsdC5yID0gaXNOYU4uciA+IDAuID8gTkFOIDogcmVzdWx0LnI7XG4gIHJlc3VsdC5nID0gaXNOYU4uZyA+IDAuID8gTkFOIDogcmVzdWx0Lmc7XG4gIHJlc3VsdC5iID0gaXNOYU4uYiA+IDAuID8gTkFOIDogcmVzdWx0LmI7XG4gIHJlc3VsdC5hID0gaXNOYU4uYSA+IDAuID8gTkFOIDogcmVzdWx0LmE7XG5gO1xuXG50eXBlIFVuYXJ5S2VybmVsRnVuY0NvbmZpZyA9IHtcbiAgb3BTbmlwcGV0OiBzdHJpbmcsXG4gIHBhY2tlZE9wU25pcHBldD86IHN0cmluZyxcbiAgY3B1S2VybmVsSW1wbD86IFNpbXBsZVVuYXJ5S2VybmVsSW1wbENQVSxcbiAgZHR5cGU/OiBEYXRhVHlwZVxufTtcblxuLyoqXG4gKiBUZW1wbGF0ZSB0aGF0IGNyZWF0ZXMgYSBgS2VybmVsRnVuY2AgZm9yIHVuYXJ5IG9wcy5cbiAqIEBwYXJhbSBvcFNuaXBwZXQgT3Agc25pcHBldCB0byBjcmVhdGUgYFVuYXJ5T3BQcm9ncmFtYC5cbiAqIEBwYXJhbSBwYWNrZWRPcFNuaXBwZXQgT3Agc25pcHBldCB0byBjcmVhdGUgYFVuYXJ5T3BQYWNrZWRQcm9ncmFtYC5cbiAqIEBwYXJhbSBkdHlwZSBPcHRpb25hbC4gSWYgc2V0LCB0aGUgcmVzdWx0IGhhcyB0aGlzIGR0eXBlLiBPdGhlcndpc2UsIHRoZVxuICogICAgIHJlc3VsdCBoYXMgdGhlIHNhbWUgZHR5cGUgYXMgdGhlIGZpcnN0IGlucHV0LiBUaGlzIGlzIG1haW5seSB1c2VkIGluXG4gKiAgICAgY29tcGFyaXNvbiBrZXJuZWxzLCBzdWNoIGFzIEVxdWFsLCBMZXNzLCBHcmVhdGVyLCBldGMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmFyeUtlcm5lbEZ1bmMoXG4gICAge29wU25pcHBldCwgcGFja2VkT3BTbmlwcGV0LCBjcHVLZXJuZWxJbXBsLCBkdHlwZX06IFVuYXJ5S2VybmVsRnVuY0NvbmZpZyk6XG4gICAgS2VybmVsRnVuYyB7XG4gIHJldHVybiAoe2lucHV0cywgYmFja2VuZH0pID0+IHtcbiAgICBjb25zdCB7eH0gPSBpbnB1dHMgYXMgVW5hcnlJbnB1dHM7XG4gICAgY29uc3Qgd2ViZ2xCYWNrZW5kID0gYmFja2VuZCBhcyBNYXRoQmFja2VuZFdlYkdMO1xuXG4gICAgY29uc3QgJGR0eXBlID0gZHR5cGUgfHwgeC5kdHlwZTtcbiAgICBpZiAod2ViZ2xCYWNrZW5kLnNob3VsZEV4ZWN1dGVPbkNQVShbeF0pICYmIGNwdUtlcm5lbEltcGwgIT0gbnVsbCkge1xuICAgICAgY29uc3QgeERhdGEgPSB3ZWJnbEJhY2tlbmQudGV4RGF0YS5nZXQoeC5kYXRhSWQpO1xuICAgICAgY29uc3Qgb3V0VmFsdWVzID0gY3B1S2VybmVsSW1wbCh4RGF0YS52YWx1ZXMgYXMgVHlwZWRBcnJheSwgJGR0eXBlKTtcbiAgICAgIHJldHVybiB3ZWJnbEJhY2tlbmQubWFrZVRlbnNvckluZm8oeC5zaGFwZSwgJGR0eXBlLCBvdXRWYWx1ZXMpO1xuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFVzZVBhY2tlZFByb2dyYW0gPVxuICAgICAgICBlbnYoKS5nZXRCb29sKCdXRUJHTF9QQUNLX1VOQVJZX09QRVJBVElPTlMnKSAmJiBwYWNrZWRPcFNuaXBwZXQgIT0gbnVsbDtcbiAgICBsZXQgcHJvZ3JhbTogVW5hcnlPcFByb2dyYW18VW5hcnlPcFBhY2tlZFByb2dyYW07XG4gICAgaWYgKHNob3VsZFVzZVBhY2tlZFByb2dyYW0pIHtcbiAgICAgIHByb2dyYW0gPSBuZXcgVW5hcnlPcFBhY2tlZFByb2dyYW0oeC5zaGFwZSwgcGFja2VkT3BTbmlwcGV0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvZ3JhbSA9IG5ldyBVbmFyeU9wUHJvZ3JhbSh4LnNoYXBlLCBvcFNuaXBwZXQpO1xuICAgIH1cblxuICAgIHJldHVybiB3ZWJnbEJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4XSwgJGR0eXBlKTtcbiAgfTtcbn1cblxudHlwZSBCaW5hcnlLZXJuZWxGdW5jQ29uZmlnID0ge1xuICBvcFNuaXBwZXQ6IHN0cmluZyxcbiAgcGFja2VkT3BTbmlwcGV0Pzogc3RyaW5nLFxuICBjaGVja091dE9mQm91bmRzPzogYm9vbGVhbixcbiAgc3VwcG9ydHNDb21wbGV4PzogYm9vbGVhbixcbiAgY3B1S2VybmVsSW1wbD86IFNpbXBsZUJpbmFyeUtlcm5lbEltcGxDUFUsXG4gIGR0eXBlPzogRGF0YVR5cGVcbn07XG5cbi8qKlxuICogVGVtcGxhdGUgdGhhdCBjcmVhdGVzIGEgYEtlcm5lbEZ1bmNgIGZvciBiaW5hcnkgb3BzLlxuICogQHBhcmFtIG9wU25pcHBldCBPcCBzbmlwcGV0IHRvIGNyZWF0ZSBgQmluYXJ5T3BQcm9ncmFtYC5cbiAqIEBwYXJhbSBwYWNrZWRPcFNuaXBwZXQgT3Agc25pcHBldCB0byBjcmVhdGUgYEJpbmFyeU9wUGFja2VkUHJvZ3JhbWAuXG4gKiBAcGFyYW0gY2hlY2tPdXRPZkJvdW5kc0ZvclBhY2tlZFByb2dyYW0gV2hldGhlciB0byBzZXQgY2hlY2tPdXRPZkJvdW5kcz10cnVlXG4gKiAgICAgd2hlbiBjcmVhdGluZyBCaW5hcnlPcFBhY2tlZFByb2dyYW0uXG4gKiBAcGFyYW0gZHR5cGUgT3B0aW9uYWwuIElmIHNldCwgdGhlIHJlc3VsdCBoYXMgdGhpcyBkdHlwZS4gT3RoZXJ3aXNlLCB0aGVcbiAqICAgICByZXN1bHQgaGFzIHRoZSBzYW1lIGR0eXBlIGFzIHRoZSBmaXJzdCBpbnB1dC4gVGhpcyBpcyBtYWlubHkgdXNlZCBpblxuICogICAgIGNvbXBhcmlzb24ga2VybmVscywgc3VjaCBhcyBFcXVhbCwgTGVzcywgR3JlYXRlciwgZXRjLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmluYXJ5S2VybmVsRnVuYyh7XG4gIG9wU25pcHBldCxcbiAgcGFja2VkT3BTbmlwcGV0LFxuICBjaGVja091dE9mQm91bmRzID0gZmFsc2UsXG4gIHN1cHBvcnRzQ29tcGxleCA9IGZhbHNlLFxuICBjcHVLZXJuZWxJbXBsLFxuICBkdHlwZVxufTogQmluYXJ5S2VybmVsRnVuY0NvbmZpZyk6IEtlcm5lbEZ1bmMge1xuICByZXR1cm4gKHtpbnB1dHMsIGJhY2tlbmR9KSA9PiB7XG4gICAgY29uc3Qge2EsIGJ9ID0gaW5wdXRzIGFzIEJpbmFyeUlucHV0cztcbiAgICBjb25zdCB3ZWJnbEJhY2tlbmQgPSBiYWNrZW5kIGFzIE1hdGhCYWNrZW5kV2ViR0w7XG5cbiAgICBpZiAoc3VwcG9ydHNDb21wbGV4ICYmIGEuZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICBjb25zdCBhRGF0YSA9IHdlYmdsQmFja2VuZC50ZXhEYXRhLmdldChhLmRhdGFJZCk7XG4gICAgICBjb25zdCBiRGF0YSA9IHdlYmdsQmFja2VuZC50ZXhEYXRhLmdldChiLmRhdGFJZCk7XG5cbiAgICAgIGNvbnN0IFtyZWFsLCBpbWFnXSA9IFtcbiAgICAgICAgW2FEYXRhLmNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsLCBiRGF0YS5jb21wbGV4VGVuc29ySW5mb3MucmVhbF0sXG4gICAgICAgIFthRGF0YS5jb21wbGV4VGVuc29ySW5mb3MuaW1hZywgYkRhdGEuY29tcGxleFRlbnNvckluZm9zLmltYWddXG4gICAgICBdLm1hcChjb21wbGV4UGFydHMgPT4ge1xuICAgICAgICBjb25zdCBbYVBhcnQsIGJQYXJ0XSA9IGNvbXBsZXhQYXJ0cztcblxuICAgICAgICBjb25zdCBhSGFuZGxlID0ge1xuICAgICAgICAgIGRhdGFJZDogYVBhcnQuZGF0YUlkLFxuICAgICAgICAgIGR0eXBlOiBhUGFydC5kdHlwZSxcbiAgICAgICAgICBzaGFwZTogYS5zaGFwZVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBiSGFuZGxlID0ge1xuICAgICAgICAgIGRhdGFJZDogYlBhcnQuZGF0YUlkLFxuICAgICAgICAgIGR0eXBlOiBiUGFydC5kdHlwZSxcbiAgICAgICAgICBzaGFwZTogYi5zaGFwZVxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgQmluYXJ5T3BQcm9ncmFtKG9wU25pcHBldCwgYS5zaGFwZSwgYi5zaGFwZSk7XG4gICAgICAgIHJldHVybiB3ZWJnbEJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKFxuICAgICAgICAgICAgcHJvZ3JhbSwgW2FIYW5kbGUsIGJIYW5kbGVdLCB1cGNhc3RUeXBlKGFQYXJ0LmR0eXBlLCBiUGFydC5kdHlwZSkpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGNvbXBsZXhPdXRwdXQgPVxuICAgICAgICAgIGNvbXBsZXgoe2lucHV0czoge3JlYWwsIGltYWd9LCBiYWNrZW5kOiB3ZWJnbEJhY2tlbmR9KTtcblxuICAgICAgd2ViZ2xCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlYWwpO1xuICAgICAgd2ViZ2xCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGltYWcpO1xuXG4gICAgICAvLyBUT0RPKGFubnhpbmd5dWFuKTogSW1wbGVtZW50IENQVSBmb3J3YXJkaW5nIGZvciBjb21wbGV4IGlucHV0cy5cblxuICAgICAgcmV0dXJuIGNvbXBsZXhPdXRwdXQ7XG4gICAgfVxuXG4gICAgY29uc3QgJGR0eXBlID0gZHR5cGUgfHwgdXBjYXN0VHlwZShhLmR0eXBlLCBiLmR0eXBlKTtcbiAgICBpZiAoKGEuZHR5cGUgPT09ICdzdHJpbmcnIHx8IGIuZHR5cGUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICB3ZWJnbEJhY2tlbmQuc2hvdWxkRXhlY3V0ZU9uQ1BVKFthLCBiXSkpICYmXG4gICAgICAgIGNwdUtlcm5lbEltcGwgIT0gbnVsbCkge1xuICAgICAgY29uc3QgYVZhbHMgPSB3ZWJnbEJhY2tlbmQudGV4RGF0YS5nZXQoYS5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICAgICAgY29uc3QgYlZhbHMgPSB3ZWJnbEJhY2tlbmQudGV4RGF0YS5nZXQoYi5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuXG4gICAgICBjb25zdCBkZWNvZGVkQVZhbHMgPSBhLmR0eXBlID09PSAnc3RyaW5nJyA/XG4gICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1hbnlcbiAgICAgICAgICBiYWNrZW5kX3V0aWwuZnJvbVVpbnQ4VG9TdHJpbmdBcnJheShhVmFscyBhcyBhbnkgYXMgVWludDhBcnJheVtdKSA6XG4gICAgICAgICAgYVZhbHM7XG4gICAgICBjb25zdCBkZWNvZGVkQlZhbHMgPSBhLmR0eXBlID09PSAnc3RyaW5nJyA/XG4gICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1hbnlcbiAgICAgICAgICBiYWNrZW5kX3V0aWwuZnJvbVVpbnQ4VG9TdHJpbmdBcnJheShiVmFscyBhcyBhbnkgYXMgVWludDhBcnJheVtdKSA6XG4gICAgICAgICAgYlZhbHM7XG4gICAgICBjb25zdCBbb3V0VmFsdWVzLCBvdXRTaGFwZV0gPVxuICAgICAgICAgIGNwdUtlcm5lbEltcGwoYS5zaGFwZSwgYi5zaGFwZSwgZGVjb2RlZEFWYWxzLCBkZWNvZGVkQlZhbHMsICRkdHlwZSk7XG5cbiAgICAgIGNvbnN0IG91dCA9IHdlYmdsQmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRTaGFwZSwgJGR0eXBlKTtcbiAgICAgIGNvbnN0IG91dERhdGEgPSB3ZWJnbEJhY2tlbmQudGV4RGF0YS5nZXQob3V0LmRhdGFJZCk7XG4gICAgICBvdXREYXRhLnZhbHVlcyA9IG91dFZhbHVlcztcbiAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkVXNlUGFja2VkUHJvZ3JhbSA9XG4gICAgICAgIGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfQklOQVJZX09QRVJBVElPTlMnKSAmJlxuICAgICAgICBwYWNrZWRPcFNuaXBwZXQgIT0gbnVsbDtcbiAgICBsZXQgcHJvZ3JhbTogQmluYXJ5T3BQcm9ncmFtfEJpbmFyeU9wUGFja2VkUHJvZ3JhbTtcbiAgICBpZiAoc2hvdWxkVXNlUGFja2VkUHJvZ3JhbSkge1xuICAgICAgcHJvZ3JhbSA9IG5ldyBCaW5hcnlPcFBhY2tlZFByb2dyYW0oXG4gICAgICAgICAgcGFja2VkT3BTbmlwcGV0LCBhLnNoYXBlLCBiLnNoYXBlLCBjaGVja091dE9mQm91bmRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvZ3JhbSA9IG5ldyBCaW5hcnlPcFByb2dyYW0ob3BTbmlwcGV0LCBhLnNoYXBlLCBiLnNoYXBlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gd2ViZ2xCYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbYSwgYl0sICRkdHlwZSk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXBBY3RpdmF0aW9uVG9TaGFkZXJQcm9ncmFtKFxuICAgIGFjdGl2YXRpb246IGJhY2tlbmRfdXRpbC5BY3RpdmF0aW9uLCBwYWNrZWQgPSBmYWxzZSk6IHN0cmluZyB7XG4gIGlmIChhY3RpdmF0aW9uID09PSAnbGluZWFyJykge1xuICAgIGlmIChwYWNrZWQpIHtcbiAgICAgIHJldHVybiB1bmFyeV9wYWNrZWRfb3AuTElORUFSO1xuICAgIH1cbiAgICByZXR1cm4gdW5hcnlfb3AuTElORUFSO1xuICB9IGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdyZWx1Jykge1xuICAgIGlmIChwYWNrZWQpIHtcbiAgICAgIHJldHVybiB1bmFyeV9wYWNrZWRfb3AuUkVMVTtcbiAgICB9XG4gICAgcmV0dXJuIHVuYXJ5X29wLlJFTFU7XG4gIH0gZWxzZSBpZiAoYWN0aXZhdGlvbiA9PT0gJ2VsdScpIHtcbiAgICBpZiAocGFja2VkKSB7XG4gICAgICByZXR1cm4gdW5hcnlfcGFja2VkX29wLkVMVTtcbiAgICB9XG4gICAgcmV0dXJuIHVuYXJ5X29wLkVMVTtcbiAgfSBlbHNlIGlmIChhY3RpdmF0aW9uID09PSAncmVsdTYnKSB7XG4gICAgaWYgKHBhY2tlZCkge1xuICAgICAgcmV0dXJuIHVuYXJ5X3BhY2tlZF9vcC5SRUxVNjtcbiAgICB9XG4gICAgcmV0dXJuIHVuYXJ5X29wLlJFTFU2O1xuICB9IGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdwcmVsdScpIHtcbiAgICBpZiAocGFja2VkKSB7XG4gICAgICByZXR1cm4gUFJFTFVfUEFDS0VEO1xuICAgIH1cbiAgICByZXR1cm4gUFJFTFU7XG4gIH0gZWxzZSBpZiAoYWN0aXZhdGlvbiA9PT0gJ2xlYWt5cmVsdScpIHtcbiAgICBpZiAocGFja2VkKSB7XG4gICAgICByZXR1cm4gTEVBS1lSRUxVX1BBQ0tFRDtcbiAgICB9XG4gICAgcmV0dXJuIExFQUtZUkVMVTtcbiAgfSBlbHNlIGlmIChhY3RpdmF0aW9uID09PSAnc2lnbW9pZCcpIHtcbiAgICBpZiAocGFja2VkKSB7XG4gICAgICByZXR1cm4gdW5hcnlfcGFja2VkX29wLlNJR01PSUQ7XG4gICAgfVxuICAgIHJldHVybiB1bmFyeV9vcC5TSUdNT0lEO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgQWN0aXZhdGlvbiAke1xuICAgICAgYWN0aXZhdGlvbn0gaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkIGZvciB0aGUgV2ViR0wgYmFja2VuZC5gKTtcbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIERhdGFUeXBlLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtNZWFuUHJvZ3JhbX0gZnJvbSAnLi4vbWVhbl9ncHUnO1xuaW1wb3J0IHtSZWR1Y2VQcm9ncmFtfSBmcm9tICcuLi9yZWR1Y2VfZ3B1JztcblxudHlwZSBSZWR1Y2VUeXBlcyA9ICdhbGwnfCdhbnknfCdtYXgnfCdtaW4nfCdzdW0nfCdwcm9kJ3wnbWVhbic7XG5cbi8vIFJldHVybnMgYW4gYXJyYXkgb2YgY29uZmlndXJhdGlvbiBvYmplY3RzIHRoYXQgZGVzY3JpYmUgZWFjaCBzdGFnZSBvZiB0aGVcbi8vIHJlZHVjdGlvbi5cbmZ1bmN0aW9uIGdldFJlZHVjdGlvblN0YWdlcyhpblNoYXBlOiBudW1iZXJbXSk6XG4gICAgQXJyYXk8e2luU2l6ZTogbnVtYmVyLCB3aW5kb3dTaXplOiBudW1iZXIsIG91dFNpemU6IG51bWJlcn0+IHtcbiAgY29uc3Qgc3RhZ2VzID0gW107XG5cbiAgd2hpbGUgKHN0YWdlcy5sZW5ndGggPT09IDAgfHwgc3RhZ2VzW3N0YWdlcy5sZW5ndGggLSAxXS5vdXRTaXplICE9PSAxKSB7XG4gICAgY29uc3Qgb3V0U2l6ZTogbnVtYmVyID1cbiAgICAgICAgc3RhZ2VzLmxlbmd0aCA/IHN0YWdlc1tzdGFnZXMubGVuZ3RoIC0gMV0ub3V0U2l6ZSA6IGluU2hhcGVbMV07XG4gICAgY29uc3Qgd2luZG93U2l6ZSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3B0aW1hbFdpbmRvd1NpemUob3V0U2l6ZSk7XG4gICAgc3RhZ2VzLnB1c2goe1xuICAgICAgaW5TaXplOiBvdXRTaXplLFxuICAgICAgd2luZG93U2l6ZSxcbiAgICAgIG91dFNpemU6IE1hdGguY2VpbChvdXRTaXplIC8gd2luZG93U2l6ZSlcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBzdGFnZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWR1Y2UoXG4gICAgeDogVGVuc29ySW5mbywgZHR5cGU6IERhdGFUeXBlLCByZWR1Y3Rpb25UeXBlOiBSZWR1Y2VUeXBlcyxcbiAgICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMKTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHJlZHVjdGlvblN0YWdlcyA9IGdldFJlZHVjdGlvblN0YWdlcyh4LnNoYXBlKTtcblxuICBsZXQgcmVzdWx0ID0geDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWR1Y3Rpb25TdGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB7aW5TaXplLCB3aW5kb3dTaXplLCBvdXRTaXplfSA9IHJlZHVjdGlvblN0YWdlc1tpXTtcblxuICAgIGxldCBwcm9ncmFtOiBSZWR1Y2VQcm9ncmFtfE1lYW5Qcm9ncmFtO1xuICAgIGxldCBwcmV2aW91c1Jlc3VsdDogVGVuc29ySW5mbztcbiAgICBpZiAocmVkdWN0aW9uVHlwZSA9PT0gJ21lYW4nKSB7XG4gICAgICBwcm9ncmFtID0gaSA9PT0gMCA/XG4gICAgICAgICAgbmV3IE1lYW5Qcm9ncmFtKFxuICAgICAgICAgICAgICB7d2luZG93U2l6ZSwgaW5TaXplLCBiYXRjaFNpemU6IHguc2hhcGVbMF0sIG91dFNpemV9LCBpblNpemUpIDpcbiAgICAgICAgICBuZXcgTWVhblByb2dyYW0oe3dpbmRvd1NpemUsIGluU2l6ZSwgYmF0Y2hTaXplOiB4LnNoYXBlWzBdLCBvdXRTaXplfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2dyYW0gPSBuZXcgUmVkdWNlUHJvZ3JhbShcbiAgICAgICAgICB7d2luZG93U2l6ZSwgaW5TaXplLCBiYXRjaFNpemU6IHguc2hhcGVbMF0sIG91dFNpemV9LCByZWR1Y3Rpb25UeXBlKTtcbiAgICB9XG5cbiAgICBwcmV2aW91c1Jlc3VsdCA9IHJlc3VsdDtcbiAgICByZXN1bHQgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbcmVzdWx0XSwgZHR5cGUpO1xuXG4gICAgaWYgKHByZXZpb3VzUmVzdWx0LmRhdGFJZCAhPT0geC5kYXRhSWQpIHtcbiAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocHJldmlvdXNSZXN1bHQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7UmVzaGFwZVBhY2tlZFByb2dyYW19IGZyb20gJy4uL3Jlc2hhcGVfcGFja2VkX2dwdSc7XG5pbXBvcnQge2dldEJhdGNoRGltLCBnZXRSb3dzQ29sc30gZnJvbSAnLi4vd2ViZ2xfdXRpbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBwYWNrZWRSZXNoYXBlKFxuICAgIGlucHV0OiBUZW5zb3JJbmZvLCBhZnRlclNoYXBlOiBudW1iZXJbXSxcbiAgICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMKTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IGlucHV0M0RTaGFwZSA9XG4gICAgICBbZ2V0QmF0Y2hEaW0oaW5wdXQuc2hhcGUpLFxuICAgICAgIC4uLmdldFJvd3NDb2xzKGlucHV0LnNoYXBlKV0gYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICBjb25zdCBpbnB1dDNEOiBUZW5zb3JJbmZvID0ge1xuICAgIGR0eXBlOiBpbnB1dC5kdHlwZSxcbiAgICBzaGFwZTogaW5wdXQzRFNoYXBlLFxuICAgIGRhdGFJZDogaW5wdXQuZGF0YUlkXG4gIH07XG4gIGNvbnN0IGFmdGVyU2hhcGVBczNEID1cbiAgICAgIFtnZXRCYXRjaERpbShhZnRlclNoYXBlKSxcbiAgICAgICAuLi5nZXRSb3dzQ29scyhhZnRlclNoYXBlKV0gYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuXG4gIGNvbnN0IHByb2dyYW0gPSBuZXcgUmVzaGFwZVBhY2tlZFByb2dyYW0oYWZ0ZXJTaGFwZUFzM0QsIGlucHV0M0RTaGFwZSk7XG4gIGNvbnN0IHByZXZlbnRFYWdlclVucGFja2luZ09mT3V0cHV0ID0gdHJ1ZTtcbiAgY29uc3QgY3VzdG9tVmFsdWVzID0gW2lucHV0M0RTaGFwZV07XG4gIGNvbnN0IG91dHB1dCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKFxuICAgICAgcHJvZ3JhbSwgW2lucHV0M0RdLCBpbnB1dC5kdHlwZSwgY3VzdG9tVmFsdWVzLFxuICAgICAgcHJldmVudEVhZ2VyVW5wYWNraW5nT2ZPdXRwdXQpO1xuICByZXR1cm4ge2RhdGFJZDogb3V0cHV0LmRhdGFJZCwgc2hhcGU6IGFmdGVyU2hhcGUsIGR0eXBlOiBvdXRwdXQuZHR5cGV9O1xufVxuIiwiXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8vIEltcG9ydCBzaGFyZWQgZnVuY3Rpb25hbGl0eSBmcm9tIHRmanMtYmFja2VuZC1jcHUgd2l0aG91dCB0cmlnZ2VyaW5nXG4vLyBzaWRlIGVmZmVjdHMuXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWltcG9ydHMtZnJvbS1kaXN0XG5pbXBvcnQgKiBhcyBzaGFyZWQgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L3NoYXJlZCc7XG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWltcG9ydHMtZnJvbS1kaXN0XG5pbXBvcnQge1NpbXBsZUJpbmFyeUtlcm5lbEltcGx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9zaGFyZWQnO1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1pbXBvcnRzLWZyb20tZGlzdFxuaW1wb3J0IHtTaW1wbGVVbmFyeUltcGx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC91dGlscy91bmFyeV90eXBlcyc7XG5cbmV4cG9ydCB0eXBlIFNpbXBsZUJpbmFyeUtlcm5lbEltcGxDUFUgPSBTaW1wbGVCaW5hcnlLZXJuZWxJbXBsO1xuZXhwb3J0IHR5cGUgU2ltcGxlVW5hcnlLZXJuZWxJbXBsQ1BVID0gU2ltcGxlVW5hcnlJbXBsO1xuY29uc3Qge1xuICBhZGRJbXBsOiBhZGRJbXBsQ1BVLFxuICBiaW5jb3VudEltcGw6IGJpbmNvdW50SW1wbENQVSxcbiAgYmluY291bnRSZWR1Y2VJbXBsOiBiaW5jb3VudFJlZHVjZUltcGxDUFUsXG4gIGNlaWxJbXBsOiBjZWlsSW1wbENQVSxcbiAgY29uY2F0SW1wbDogY29uY2F0SW1wbENQVSxcbiAgZXF1YWxJbXBsOiBlcXVhbEltcGxDUFUsXG4gIGV4cEltcGw6IGV4cEltcGxDUFUsXG4gIGV4cG0xSW1wbDogZXhwbTFJbXBsQ1BVLFxuICBmbG9vckltcGw6IGZsb29ySW1wbENQVSxcbiAgZ2F0aGVyTmRJbXBsOiBnYXRoZXJOZEltcGxDUFUsXG4gIGdhdGhlclYySW1wbDogZ2F0aGVyVjJJbXBsQ1BVLFxuICBncmVhdGVySW1wbDogZ3JlYXRlckltcGxDUFUsXG4gIGdyZWF0ZXJFcXVhbEltcGw6IGdyZWF0ZXJFcXVhbEltcGxDUFUsXG4gIGxlc3NJbXBsOiBsZXNzSW1wbENQVSxcbiAgbGVzc0VxdWFsSW1wbDogbGVzc0VxdWFsSW1wbENQVSxcbiAgbGluU3BhY2VJbXBsOiBsaW5TcGFjZUltcGxDUFUsXG4gIGxvZ0ltcGw6IGxvZ0ltcGxDUFUsXG4gIG1heEltcGw6IG1heEltcGxDUFUsXG4gIG1heGltdW1JbXBsOiBtYXhpbXVtSW1wbENQVSxcbiAgbWluaW11bUltcGw6IG1pbmltdW1JbXBsQ1BVLFxuICBtdWx0aXBseUltcGw6IG11bHRpcGx5SW1wbENQVSxcbiAgbmVnSW1wbDogbmVnSW1wbENQVSxcbiAgbm90RXF1YWxJbXBsOiBub3RFcXVhbEltcGxDUFUsXG4gIHByb2RJbXBsOiBwcm9kSW1wbENQVSxcbiAgcmFuZ2VJbXBsOiByYW5nZUltcGxDUFUsXG4gIHJzcXJ0SW1wbDogcnNxcnRJbXBsQ1BVLFxuICBzaWdtb2lkSW1wbDogc2lnbW9pZEltcGxDUFUsXG4gIHNpbXBsZUFic0ltcGw6IHNpbXBsZUFic0ltcGxDUFUsXG4gIHNsaWNlSW1wbDogc2xpY2VJbXBsQ1BVLFxuICBzcGFyc2VGaWxsRW1wdHlSb3dzSW1wbDogc3BhcnNlRmlsbEVtcHR5Um93c0ltcGxDUFUsXG4gIHNwYXJzZVJlc2hhcGVJbXBsOiBzcGFyc2VSZXNoYXBlSW1wbENQVSxcbiAgc3BhcnNlU2VnbWVudFJlZHVjdGlvbkltcGw6IHNwYXJzZVNlZ21lbnRSZWR1Y3Rpb25JbXBsQ1BVLFxuICBzcXJ0SW1wbDogc3FydEltcGxDUFUsXG4gIHN0cmlkZWRTbGljZUltcGw6IHN0cmlkZWRTbGljZUltcGxDUFUsXG4gIHN0cmluZ05HcmFtc0ltcGw6IHN0cmluZ05HcmFtc0ltcGxDUFUsXG4gIHN0cmluZ1NwbGl0SW1wbDogc3RyaW5nU3BsaXRJbXBsQ1BVLFxuICBzdHJpbmdUb0hhc2hCdWNrZXRGYXN0SW1wbDogc3RyaW5nVG9IYXNoQnVja2V0RmFzdEltcGxDUFUsXG4gIHN1YkltcGw6IHN1YkltcGxDUFUsXG4gIHRpbGVJbXBsOiB0aWxlSW1wbENQVSxcbiAgdG9wS0ltcGw6IHRvcEtJbXBsQ1BVLFxuICB0cmFuc3Bvc2VJbXBsOiB0cmFuc3Bvc2VJbXBsQ1BVLFxuICB1bmlxdWVJbXBsOiB1bmlxdWVJbXBsQ1BVLFxufSA9IHNoYXJlZDtcblxuZXhwb3J0IHtcbiAgYWRkSW1wbENQVSxcbiAgYmluY291bnRJbXBsQ1BVLFxuICBiaW5jb3VudFJlZHVjZUltcGxDUFUsXG4gIGNlaWxJbXBsQ1BVLFxuICBjb25jYXRJbXBsQ1BVLFxuICBlcXVhbEltcGxDUFUsXG4gIGV4cEltcGxDUFUsXG4gIGV4cG0xSW1wbENQVSxcbiAgZmxvb3JJbXBsQ1BVLFxuICBnYXRoZXJOZEltcGxDUFUsXG4gIGdhdGhlclYySW1wbENQVSxcbiAgZ3JlYXRlckVxdWFsSW1wbENQVSxcbiAgZ3JlYXRlckltcGxDUFUsXG4gIGxlc3NFcXVhbEltcGxDUFUsXG4gIGxlc3NJbXBsQ1BVLFxuICBsaW5TcGFjZUltcGxDUFUsXG4gIGxvZ0ltcGxDUFUsXG4gIG1heEltcGxDUFUsXG4gIG1heGltdW1JbXBsQ1BVLFxuICBtaW5pbXVtSW1wbENQVSxcbiAgbXVsdGlwbHlJbXBsQ1BVLFxuICBuZWdJbXBsQ1BVLFxuICBub3RFcXVhbEltcGxDUFUsXG4gIHByb2RJbXBsQ1BVLFxuICBzaWdtb2lkSW1wbENQVSxcbiAgc2ltcGxlQWJzSW1wbENQVSxcbiAgc2xpY2VJbXBsQ1BVLFxuICBzcGFyc2VGaWxsRW1wdHlSb3dzSW1wbENQVSxcbiAgc3BhcnNlUmVzaGFwZUltcGxDUFUsXG4gIHNwYXJzZVNlZ21lbnRSZWR1Y3Rpb25JbXBsQ1BVLFxuICBzcXJ0SW1wbENQVSxcbiAgc3RyaWRlZFNsaWNlSW1wbENQVSxcbiAgc3RyaW5nTkdyYW1zSW1wbENQVSxcbiAgc3RyaW5nU3BsaXRJbXBsQ1BVLFxuICBzdHJpbmdUb0hhc2hCdWNrZXRGYXN0SW1wbENQVSxcbiAgc3ViSW1wbENQVSxcbiAgcmFuZ2VJbXBsQ1BVLFxuICByc3FydEltcGxDUFUsXG4gIHRpbGVJbXBsQ1BVLFxuICB0b3BLSW1wbENQVSxcbiAgdHJhbnNwb3NlSW1wbENQVSxcbiAgdW5pcXVlSW1wbENQVSxcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7QWJzLCBBYnNJbnB1dHMsIGVudiwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtzaW1wbGVBYnNJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmltcG9ydCB7VW5hcnlPcFByb2dyYW19IGZyb20gJy4uL3VuYXJ5b3BfZ3B1JztcbmltcG9ydCB7VW5hcnlPcFBhY2tlZFByb2dyYW19IGZyb20gJy4uL3VuYXJ5b3BfcGFja2VkX2dwdSc7XG5cbmNvbnN0IEFCUyA9IGByZXR1cm4gYWJzKHgpO2A7XG5cbmV4cG9ydCBmdW5jdGlvbiBhYnMoYXJnczoge2lucHV0czogQWJzSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuXG4gIC8vIFRPRE86IGhhbmRsZSBjYXNlcyB3aGVuIHggaXMgY29tcGxleC4gT25jZSB0aGUgY3B1IGltcGxlbWVudGF0aW9uXG4gIC8vIGNhbiBoYW5kbGUgY29tcGxleCB2YWx1ZXMsIHJlZmFjdG9yIHRvIHVzZSB1bmFyeUtlcm5lbEZ1bmMuXG4gIGlmIChiYWNrZW5kLnNob3VsZEV4ZWN1dGVPbkNQVShbeF0pICYmIHguZHR5cGUgIT09ICdjb21wbGV4NjQnKSB7XG4gICAgY29uc3QgeERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KHguZGF0YUlkKTtcbiAgICBjb25zdCBvdXRWYWx1ZXMgPSBzaW1wbGVBYnNJbXBsQ1BVKHhEYXRhLnZhbHVlcyBhcyBUeXBlZEFycmF5KTtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyh4LnNoYXBlLCB4LmR0eXBlLCBvdXRWYWx1ZXMpO1xuICB9XG5cbiAgbGV0IHByb2dyYW06IFVuYXJ5T3BQcm9ncmFtfFVuYXJ5T3BQYWNrZWRQcm9ncmFtO1xuICBpZiAoZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19VTkFSWV9PUEVSQVRJT05TJykpIHtcbiAgICBwcm9ncmFtID0gbmV3IFVuYXJ5T3BQYWNrZWRQcm9ncmFtKHguc2hhcGUsIEFCUyk7XG4gIH0gZWxzZSB7XG4gICAgcHJvZ3JhbSA9IG5ldyBVbmFyeU9wUHJvZ3JhbSh4LnNoYXBlLCBBQlMpO1xuICB9XG4gIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeF0sIHguZHR5cGUpO1xufVxuXG5leHBvcnQgY29uc3QgYWJzQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEFicyxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGFicyBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0Fjb3MsIEtlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHtDSEVDS19OQU5fU05JUFBFVH0gZnJvbSAnLi4vdW5hcnlvcF9ncHUnO1xuXG5jb25zdCBBQ09TID0gQ0hFQ0tfTkFOX1NOSVBQRVQgKyBgXG4gIGlmIChhYnMoeCkgPiAxLikge1xuICAgIHJldHVybiBOQU47XG4gIH1cbiAgcmV0dXJuIGFjb3MoeCk7XG5gO1xuXG5leHBvcnQgY29uc3QgYWNvcyA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBBQ09TfSk7XG5cbmV4cG9ydCBjb25zdCBhY29zQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEFjb3MsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBhY29zLFxufTtcbiIsIlxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0Fjb3NoLCBLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7Q0hFQ0tfTkFOX1NOSVBQRVR9IGZyb20gJy4uL3VuYXJ5b3BfZ3B1JztcblxuY29uc3QgQUNPU0ggPSBDSEVDS19OQU5fU05JUFBFVCArIGBcbiAgaWYgKHggPCAxLjApIHJldHVybiBOQU47XG5yZXR1cm4gbG9nKHggKyBzcXJ0KHggKiB4IC0gMS4wKSk7YDtcblxuZXhwb3J0IGNvbnN0IGFjb3NoID0gdW5hcnlLZXJuZWxGdW5jKHtvcFNuaXBwZXQ6IEFDT1NIfSk7XG5cbmV4cG9ydCBjb25zdCBhY29zaENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBY29zaCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGFjb3NoLFxufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtBZGQsIEtlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtiaW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7YWRkSW1wbENQVSBhcyBjcHVBZGR9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5jb25zdCBBREQgPSAncmV0dXJuIGEgKyBiOyc7XG5cbmV4cG9ydCBjb25zdCBhZGRLZXJuZWxGdW5jID0gYmluYXJ5S2VybmVsRnVuYyh7XG4gIG9wU25pcHBldDogQURELFxuICBwYWNrZWRPcFNuaXBwZXQ6IEFERCxcbiAgc3VwcG9ydHNDb21wbGV4OiB0cnVlLFxuICBjcHVLZXJuZWxJbXBsOiBjcHVBZGRcbn0pO1xuXG5leHBvcnQgY29uc3QgYWRkQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEFkZCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGFkZEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7QWRkTiwgQWRkTklucHV0cywgZW52LCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIHVwY2FzdFR5cGV9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7QWRkTlByb2dyYW19IGZyb20gJy4uL2FkZG5fZ3B1JztcbmltcG9ydCB7QWRkTlBhY2tlZFByb2dyYW19IGZyb20gJy4uL2FkZG5fcGFja2VkX2dwdSc7XG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtpZGVudGl0eX0gZnJvbSAnLi9JZGVudGl0eSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGROKGFyZ3M6IHtpbnB1dHM6IEFkZE5JbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuXG4gIGNvbnN0IHRlbnNvcnMgPSBpbnB1dHM7XG4gIGlmICh0ZW5zb3JzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBpZGVudGl0eSh7aW5wdXRzOiB7eDogdGVuc29yc1swXX0sIGJhY2tlbmR9KTtcbiAgfVxuXG4gIC8vIExpbWl0IHRoZSBudW1iZXIgb2YgdXBsb2FkZWQgdGV4dHVyZXMgZm9yIG9wdGltaXphdGlvbi5cbiAgaWYgKHRlbnNvcnMubGVuZ3RoID4gZW52KCkuZ2V0KCdXRUJHTF9NQVhfVEVYVFVSRVNfSU5fU0hBREVSJykpIHtcbiAgICBjb25zdCBtaWRJbmRleCA9IE1hdGguZmxvb3IodGVuc29ycy5sZW5ndGggLyAyKTtcbiAgICBjb25zdCBsZWZ0U2lkZSA9IGFkZE4oe2lucHV0czogdGVuc29ycy5zbGljZSgwLCBtaWRJbmRleCksIGJhY2tlbmR9KTtcbiAgICBjb25zdCByaWdodFNpZGUgPSBhZGROKHtpbnB1dHM6IHRlbnNvcnMuc2xpY2UobWlkSW5kZXgpLCBiYWNrZW5kfSk7XG4gICAgcmV0dXJuIGFkZE4oe2lucHV0czogW2xlZnRTaWRlLCByaWdodFNpZGVdLCBiYWNrZW5kfSk7XG4gIH1cblxuICBjb25zdCBkdHlwZSA9XG4gICAgICB0ZW5zb3JzLm1hcCh0ID0+IHQuZHR5cGUpLnJlZHVjZSgoZDEsIGQyKSA9PiB1cGNhc3RUeXBlKGQxLCBkMikpO1xuICBjb25zdCBzaGFwZXMgPSB0ZW5zb3JzLm1hcCh0ID0+IHQuc2hhcGUpO1xuICAvLyBXZSBjYW4gbWFrZSBzdXJlIHNoYXBlcyBhcmUgaWRlbnRpY2FsIGluIG9wIGxldmVsLlxuICBjb25zdCB1c2VQYWNrZWRPcCA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0snKTtcbiAgY29uc3QgcHJvZ3JhbSA9IHVzZVBhY2tlZE9wID9cbiAgICAgIG5ldyBBZGROUGFja2VkUHJvZ3JhbSh0ZW5zb3JzWzBdLnNoYXBlLCBzaGFwZXMpIDpcbiAgICAgIG5ldyBBZGROUHJvZ3JhbSh0ZW5zb3JzWzBdLnNoYXBlLCBzaGFwZXMpO1xuICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgdGVuc29ycywgZHR5cGUpO1xufVxuXG5leHBvcnQgY29uc3QgYWRkTkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBZGROLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogYWRkTiBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0FsbCwgQWxsQXR0cnMsIEFsbElucHV0cywgYmFja2VuZF91dGlsLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge3JlZHVjZX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3JlZHVjZSc7XG5cbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7dHJhbnNwb3NlfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBhbGwoXG4gICAgYXJnczoge2lucHV0czogQWxsSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLCBhdHRyczogQWxsQXR0cnN9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7YXhpcywga2VlcERpbXN9ID0gYXR0cnM7XG5cbiAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcblxuICBjb25zdCBvcmlnQXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG4gIGxldCBheGVzID0gb3JpZ0F4ZXM7XG4gIGNvbnN0IHBlcm11dGVkQXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oYXhlcywgeFJhbmspO1xuICBsZXQgcGVybXV0ZWRYID0geDtcbiAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgcGVybXV0ZWRYID0gdHJhbnNwb3NlKHtpbnB1dHM6IHt4fSwgYmFja2VuZCwgYXR0cnM6IHtwZXJtOiBwZXJtdXRlZEF4ZXN9fSk7XG4gICAgYXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRJbm5lck1vc3RBeGVzKGF4ZXMubGVuZ3RoLCB4UmFuayk7XG4gIH1cblxuICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoJ2FsbCcsIGF4ZXMsIHhSYW5rKTtcbiAgY29uc3QgW291dFNoYXBlLCByZWR1Y2VTaGFwZV0gPVxuICAgICAgYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMocGVybXV0ZWRYLnNoYXBlLCBheGVzKTtcbiAgY29uc3QgaW5TaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcblxuICBjb25zdCBhMkQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogcGVybXV0ZWRYfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogWy0xLCBpblNpemVdfX0pO1xuICBjb25zdCByZWR1Y2VkID0gcmVkdWNlKGEyRCwgYTJELmR0eXBlLCAnYWxsJywgYmFja2VuZCk7XG5cbiAgbGV0IHJlcztcbiAgaWYgKGtlZXBEaW1zKSB7XG4gICAgY29uc3QgbmV3U2hhcGUgPSBiYWNrZW5kX3V0aWwuZXhwYW5kU2hhcGVUb0tlZXBEaW0ob3V0U2hhcGUsIG9yaWdBeGVzKTtcbiAgICByZXMgPSByZXNoYXBlKHtpbnB1dHM6IHt4OiByZWR1Y2VkfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogbmV3U2hhcGV9fSk7XG4gIH0gZWxzZSB7XG4gICAgcmVzID0gcmVzaGFwZSh7aW5wdXRzOiB7eDogcmVkdWNlZH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IG91dFNoYXBlfX0pO1xuICB9XG5cbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhhMkQpO1xuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlZHVjZWQpO1xuXG4gIGlmIChwZXJtdXRlZEF4ZXMgIT0gbnVsbCkge1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocGVybXV0ZWRYKTtcbiAgfVxuXG4gIHJldHVybiByZXM7XG59XG5cbmV4cG9ydCBjb25zdCBhbGxDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQWxsLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogYWxsIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7QW55LCBBbnlBdHRycywgQW55SW5wdXRzLCBiYWNrZW5kX3V0aWwsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7cmVkdWNlfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvcmVkdWNlJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7dHJhbnNwb3NlfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBhbnkoXG4gICAgYXJnczoge2lucHV0czogQW55SW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLCBhdHRyczogQW55QXR0cnN9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7YXhpcywga2VlcERpbXN9ID0gYXR0cnM7XG5cbiAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcblxuICBjb25zdCBvcmlnQXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG4gIGxldCBheGVzID0gb3JpZ0F4ZXM7XG4gIGNvbnN0IHBlcm11dGVkQXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oYXhlcywgeFJhbmspO1xuICBsZXQgcGVybXV0ZWRYID0geDtcbiAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgcGVybXV0ZWRYID0gdHJhbnNwb3NlKHtpbnB1dHM6IHt4fSwgYmFja2VuZCwgYXR0cnM6IHtwZXJtOiBwZXJtdXRlZEF4ZXN9fSk7XG4gICAgYXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRJbm5lck1vc3RBeGVzKGF4ZXMubGVuZ3RoLCB4UmFuayk7XG4gIH1cblxuICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoJ2FueScsIGF4ZXMsIHhSYW5rKTtcbiAgY29uc3QgW291dFNoYXBlLCByZWR1Y2VTaGFwZV0gPVxuICAgICAgYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMocGVybXV0ZWRYLnNoYXBlLCBheGVzKTtcbiAgY29uc3QgaW5TaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcblxuICBjb25zdCBhMkQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogcGVybXV0ZWRYfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogWy0xLCBpblNpemVdfX0pO1xuICBjb25zdCByZWR1Y2VkID0gcmVkdWNlKGEyRCwgYTJELmR0eXBlLCAnYW55JywgYmFja2VuZCk7XG5cbiAgbGV0IHJlcztcbiAgaWYgKGtlZXBEaW1zKSB7XG4gICAgY29uc3QgbmV3U2hhcGUgPSBiYWNrZW5kX3V0aWwuZXhwYW5kU2hhcGVUb0tlZXBEaW0ob3V0U2hhcGUsIG9yaWdBeGVzKTtcbiAgICByZXMgPSByZXNoYXBlKHtpbnB1dHM6IHt4OiByZWR1Y2VkfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogbmV3U2hhcGV9fSk7XG4gIH0gZWxzZSB7XG4gICAgcmVzID0gcmVzaGFwZSh7aW5wdXRzOiB7eDogcmVkdWNlZH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IG91dFNoYXBlfX0pO1xuICB9XG5cbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhhMkQpO1xuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlZHVjZWQpO1xuXG4gIGlmIChwZXJtdXRlZEF4ZXMgIT0gbnVsbCkge1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocGVybXV0ZWRYKTtcbiAgfVxuXG4gIHJldHVybiByZXM7XG59XG5cbmV4cG9ydCBjb25zdCBhbnlDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQW55LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogYW55IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7QXJnTWF4LCBBcmdNYXhBdHRycywgQXJnTWF4SW5wdXRzLCBiYWNrZW5kX3V0aWwsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7YXJnTWluTWF4UmVkdWNlfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvYXJnX21pbl9tYXgnO1xuXG5pbXBvcnQge3RyYW5zcG9zZX0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gYXJnTWF4KFxuICAgIGFyZ3M6XG4gICAgICAgIHtpbnB1dHM6IEFyZ01heElucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCwgYXR0cnM6IEFyZ01heEF0dHJzfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge2F4aXN9ID0gYXR0cnM7XG5cbiAgbGV0IGF4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpO1xuICBjb25zdCBwZXJtdXRlZEF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKGF4ZXMsIHguc2hhcGUubGVuZ3RoKTtcbiAgbGV0ICR4ID0geDtcbiAgY29uc3QgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MgPSBbXTtcbiAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgJHggPSB0cmFuc3Bvc2Uoe2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge3Blcm06IHBlcm11dGVkQXhlc319KTtcbiAgICBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcy5wdXNoKCR4KTtcbiAgICBheGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoYXhlcy5sZW5ndGgsICR4LnNoYXBlLmxlbmd0aCk7XG4gIH1cblxuICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoJ2FyZ01heCcsIFtheGVzWzBdXSwgJHguc2hhcGUubGVuZ3RoKTtcbiAgY29uc3Qgb3V0ID0gYXJnTWluTWF4UmVkdWNlKGJhY2tlbmQsICR4LCBheGVzWzBdLCAnbWF4Jyk7XG5cbiAgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MuZm9yRWFjaChcbiAgICAgIHQgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0KSk7XG4gIHJldHVybiBvdXQ7XG59XG5cbmV4cG9ydCBjb25zdCBhcmdNYXhDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQXJnTWF4LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogYXJnTWF4IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7QXJnTWluLCBBcmdNaW5BdHRycywgQXJnTWluSW5wdXRzLCBiYWNrZW5kX3V0aWwsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7YXJnTWluTWF4UmVkdWNlfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvYXJnX21pbl9tYXgnO1xuaW1wb3J0IHt0cmFuc3Bvc2V9IGZyb20gJy4vVHJhbnNwb3NlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFyZ01pbihcbiAgICBhcmdzOlxuICAgICAgICB7aW5wdXRzOiBBcmdNaW5JbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsIGF0dHJzOiBBcmdNaW5BdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtheGlzfSA9IGF0dHJzO1xuXG4gIGxldCBheGVzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShheGlzLCB4LnNoYXBlKTtcbiAgY29uc3QgcGVybXV0ZWRBeGVzID0gYmFja2VuZF91dGlsLmdldEF4ZXNQZXJtdXRhdGlvbihheGVzLCB4LnNoYXBlLmxlbmd0aCk7XG4gIGxldCAkeCA9IHg7XG4gIGNvbnN0IGludGVybWVkaWF0ZVRlbnNvckluZm9zID0gW107XG4gIGlmIChwZXJtdXRlZEF4ZXMgIT0gbnVsbCkge1xuICAgICR4ID0gdHJhbnNwb3NlKHtpbnB1dHM6IHt4fSwgYmFja2VuZCwgYXR0cnM6IHtwZXJtOiBwZXJtdXRlZEF4ZXN9fSk7XG4gICAgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MucHVzaCgkeCk7XG4gICAgYXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRJbm5lck1vc3RBeGVzKGF4ZXMubGVuZ3RoLCAkeC5zaGFwZS5sZW5ndGgpO1xuICB9XG5cbiAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdhcmdNaW4nLCBbYXhlc1swXV0sICR4LnNoYXBlLmxlbmd0aCk7XG5cbiAgY29uc3Qgb3V0ID0gYXJnTWluTWF4UmVkdWNlKGJhY2tlbmQsICR4LCBheGVzWzBdLCAnbWluJyk7XG5cbiAgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MuZm9yRWFjaChcbiAgICAgIHQgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0KSk7XG4gIHJldHVybiBvdXQ7XG59XG5cbmV4cG9ydCBjb25zdCBhcmdNaW5Db25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQXJnTWluLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogYXJnTWluIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7QXNpbiwgS2VybmVsQ29uZmlnfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge3VuYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQge0NIRUNLX05BTl9TTklQUEVUfSBmcm9tICcuLi91bmFyeW9wX2dwdSc7XG5cbmNvbnN0IEFTSU4gPSBDSEVDS19OQU5fU05JUFBFVCArIGBcbiAgaWYgKGFicyh4KSA+IDEuKSB7XG4gICAgcmV0dXJuIE5BTjtcbiAgfVxuICByZXR1cm4gYXNpbih4KTtcbmA7XG5cbmV4cG9ydCBjb25zdCBhc2luID0gdW5hcnlLZXJuZWxGdW5jKHtvcFNuaXBwZXQ6IEFTSU59KTtcblxuZXhwb3J0IGNvbnN0IGFzaW5Db25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQXNpbixcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGFzaW4sXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0FzaW5oLCBLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7Q0hFQ0tfTkFOX1NOSVBQRVR9IGZyb20gJy4uL3VuYXJ5b3BfZ3B1JztcblxuY29uc3QgQVNJTkggPSBDSEVDS19OQU5fU05JUFBFVCArIGByZXR1cm4gbG9nKHggKyBzcXJ0KHggKiB4ICsgMS4wKSk7YDtcblxuZXhwb3J0IGNvbnN0IGFzaW5oID0gdW5hcnlLZXJuZWxGdW5jKHtvcFNuaXBwZXQ6IEFTSU5IfSk7XG5cbmV4cG9ydCBjb25zdCBhc2luaENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBc2luaCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGFzaW5oLFxufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtBdGFuLCBLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7Q0hFQ0tfTkFOX1NOSVBQRVR9IGZyb20gJy4uL3VuYXJ5b3BfZ3B1JztcblxuY29uc3QgQVRBTiA9IENIRUNLX05BTl9TTklQUEVUICsgYFxuICByZXR1cm4gYXRhbih4KTtcbmA7XG5cbmV4cG9ydCBjb25zdCBhdGFuID0gdW5hcnlLZXJuZWxGdW5jKHtvcFNuaXBwZXQ6IEFUQU59KTtcblxuZXhwb3J0IGNvbnN0IGF0YW5Db25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQXRhbixcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGF0YW4sXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0F0YW4yfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7YmluYXJ5S2VybmVsRnVuYywgQ0hFQ0tfTkFOX1NOSVBQRVRfQklOQVJZLCBDSEVDS19OQU5fU05JUFBFVF9CSU5BUllfUEFDS0VEfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgQVRBTjIgPSBDSEVDS19OQU5fU05JUFBFVF9CSU5BUlkgKyBgXG4gIHJldHVybiBhdGFuKGEsIGIpO1xuYDtcblxuY29uc3QgQVRBTjJfUEFDS0VEID0gYFxuICB2ZWM0IHJlc3VsdCA9IGF0YW4oYSwgYik7XG4gIHZlYzQgaXNOYU4gPSBtaW4odmVjNChpc25hbihhKSkgKyB2ZWM0KGlzbmFuKGIpKSwgdmVjNCgxLjApKTtcbiAgYCArXG4gICAgQ0hFQ0tfTkFOX1NOSVBQRVRfQklOQVJZX1BBQ0tFRCArIGBcbiAgcmV0dXJuIHJlc3VsdDtcbmA7XG5cbmV4cG9ydCBjb25zdCBhdGFuMiA9XG4gICAgYmluYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBBVEFOMiwgcGFja2VkT3BTbmlwcGV0OiBBVEFOMl9QQUNLRUR9KTtcblxuZXhwb3J0IGNvbnN0IGF0YW4yQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEF0YW4yLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogYXRhbjIsXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0F0YW5oLCBLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7Q0hFQ0tfTkFOX1NOSVBQRVR9IGZyb20gJy4uL3VuYXJ5b3BfZ3B1JztcblxuY29uc3QgQVRBTkggPSBDSEVDS19OQU5fU05JUFBFVCArIGBcbiAgaWYgKCh4IDwgLTEuMCkgfHwgKHggPiAxLjApKSByZXR1cm4gTkFOO1xucmV0dXJuIChsb2coMS4wICsgeCkgLSBsb2coMS4wIC0geCkpIC8gMi4wO2A7XG5cbmV4cG9ydCBjb25zdCBhdGFuaCA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBBVEFOSH0pO1xuXG5leHBvcnQgY29uc3QgYXRhbmhDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQXRhbmgsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBhdGFuaCxcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge0F2Z1Bvb2wsIEF2Z1Bvb2xBdHRycywgQXZnUG9vbElucHV0cywgYmFja2VuZF91dGlsLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge1Bvb2wyRFByb2dyYW19IGZyb20gJy4uL3Bvb2xfZ3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vd2ViZ2xfdXRpbCc7XG5pbXBvcnQge2lkZW50aXR5fSBmcm9tICcuL0lkZW50aXR5JztcblxuZXhwb3J0IGZ1bmN0aW9uIGF2Z1Bvb2woYXJnczoge1xuICBpbnB1dHM6IEF2Z1Bvb2xJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBBdmdQb29sQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBhc3NlcnROb3RDb21wbGV4KHgsICdhdmdQb29sJyk7XG4gIGNvbnN0IHtmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZX0gPSBhdHRycztcbiAgY29uc3QgZGlsYXRpb25zID0gMTtcblxuICB1dGlsLmFzc2VydChcbiAgICAgIGJhY2tlbmRfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgZGlsYXRpb25zKSxcbiAgICAgICgpID0+ICdFcnJvciBpbiBhdmdQb29sOiBFaXRoZXIgc3RyaWRlcyBvciBkaWxhdGlvbnMgbXVzdCBiZSAxLiAnICtcbiAgICAgICAgICBgR290IHN0cmlkZXMgJHtzdHJpZGVzfSBhbmQgZGlsYXRpb25zICcke2RpbGF0aW9uc30nYCk7XG5cbiAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wyREluZm8oXG4gICAgICB4LnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBmaWx0ZXJTaXplLCBzdHJpZGVzLFxuICAgICAgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSk7XG4gIGlmIChjb252SW5mby5maWx0ZXJXaWR0aCA9PT0gMSAmJiBjb252SW5mby5maWx0ZXJIZWlnaHQgPT09IDEgJiZcbiAgICAgIHV0aWwuYXJyYXlzRXF1YWwoY29udkluZm8uaW5TaGFwZSwgY29udkluZm8ub3V0U2hhcGUpKSB7XG4gICAgcmV0dXJuIGlkZW50aXR5KHtpbnB1dHM6IHt4fSwgYmFja2VuZH0pO1xuICB9XG4gIGNvbnN0IGF2Z1Bvb2xQcm9ncmFtID0gbmV3IFBvb2wyRFByb2dyYW0oY29udkluZm8sICdhdmcnLCBmYWxzZSk7XG4gIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShhdmdQb29sUHJvZ3JhbSwgW3hdLCAnZmxvYXQzMicpO1xufVxuXG5leHBvcnQgY29uc3QgYXZnUG9vbENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBdmdQb29sLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogYXZnUG9vbCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtBdmdQb29sM0QsIEF2Z1Bvb2wzREF0dHJzLCBBdmdQb29sM0RJbnB1dHMsIGJhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtQb29sM0RQcm9ncmFtfSBmcm9tICcuLi9wb29sX2dwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBhdmdQb29sM0QoYXJnczoge1xuICBpbnB1dHM6IEF2Z1Bvb2wzRElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IEF2Z1Bvb2wzREF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge2ZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCBkYXRhRm9ybWF0fSA9IGF0dHJzO1xuICBjb25zdCBkaWxhdGlvbnM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IFsxLCAxLCAxXTtcblxuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlUG9vbDNESW5mbyhcbiAgICAgIHguc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgZmlsdGVyU2l6ZSwgc3RyaWRlcyxcbiAgICAgIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGRhdGFGb3JtYXQpO1xuICBjb25zdCBhdmdQb29sUHJvZ3JhbSA9IG5ldyBQb29sM0RQcm9ncmFtKGNvbnZJbmZvLCAnYXZnJywgZmFsc2UpO1xuICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0oYXZnUG9vbFByb2dyYW0sIFt4XSwgJ2Zsb2F0MzInKTtcbn1cblxuZXhwb3J0IGNvbnN0IGF2Z1Bvb2wzRENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBdmdQb29sM0QsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBhdmdQb29sM0QgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7QXZnUG9vbDNER3JhZCwgQXZnUG9vbDNER3JhZEF0dHJzLCBBdmdQb29sM0RHcmFkSW5wdXRzLCBiYWNrZW5kX3V0aWwsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtBdmdQb29sM0RCYWNrcHJvcFByb2dyYW19IGZyb20gJy4uL2F2Z19wb29sX2JhY2twcm9wX2dwdSc7XG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuXG5leHBvcnQgZnVuY3Rpb24gYXZnUG9vbDNER3JhZChhcmdzOiB7XG4gIGlucHV0czogQXZnUG9vbDNER3JhZElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IEF2Z1Bvb2wzREdyYWRBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7ZHksIGlucHV0fSA9IGlucHV0cztcbiAgY29uc3QgeCA9IGlucHV0O1xuICBjb25zdCB7ZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGV9ID0gYXR0cnM7XG4gIGNvbnN0IGRpbGF0aW9uczogW251bWJlciwgbnVtYmVyLCBudW1iZXJdID0gWzEsIDEsIDFdO1xuXG4gIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVQb29sM0RJbmZvKFxuICAgICAgeC5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBmaWx0ZXJTaXplLCBzdHJpZGVzLFxuICAgICAgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSk7XG4gIGNvbnN0IGF2Z1Bvb2xCYWNrcHJvcFByb2dyYW0gPSBuZXcgQXZnUG9vbDNEQmFja3Byb3BQcm9ncmFtKGNvbnZJbmZvKTtcbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKGF2Z1Bvb2xCYWNrcHJvcFByb2dyYW0sIFtkeV0sIHguZHR5cGUpO1xufVxuXG5leHBvcnQgY29uc3QgYXZnUG9vbEdyYWQzRENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBdmdQb29sM0RHcmFkLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogYXZnUG9vbDNER3JhZCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtBdmdQb29sR3JhZCwgQXZnUG9vbEdyYWRBdHRycywgQXZnUG9vbEdyYWRJbnB1dHMsIGJhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge0F2Z1Bvb2wyREJhY2twcm9wUHJvZ3JhbX0gZnJvbSAnLi4vYXZnX3Bvb2xfYmFja3Byb3BfZ3B1JztcbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge2Fzc2VydE5vdENvbXBsZXh9IGZyb20gJy4uL3dlYmdsX3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gYXZnUG9vbEdyYWQoYXJnczoge1xuICBpbnB1dHM6IEF2Z1Bvb2xHcmFkSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogQXZnUG9vbEdyYWRBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7ZHksIGlucHV0fSA9IGlucHV0cztcbiAgY29uc3QgeCA9IGlucHV0O1xuICBhc3NlcnROb3RDb21wbGV4KFtkeSwgaW5wdXRdLCAnYXZnUG9vbEdyYWQnKTtcbiAgY29uc3Qge2ZpbHRlclNpemUsIHN0cmlkZXMsIHBhZH0gPSBhdHRycztcblxuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlUG9vbDJESW5mbyhcbiAgICAgIHguc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGZpbHRlclNpemUsIHN0cmlkZXMsXG4gICAgICAxIC8qIGRpbGF0aW9ucyAqLywgcGFkKTtcbiAgY29uc3QgYXZnUG9vbEJhY2twcm9wUHJvZ3JhbSA9IG5ldyBBdmdQb29sMkRCYWNrcHJvcFByb2dyYW0oY29udkluZm8pO1xuICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0oYXZnUG9vbEJhY2twcm9wUHJvZ3JhbSwgW2R5XSwgeC5kdHlwZSk7XG59XG5cbmV4cG9ydCBjb25zdCBhdmdQb29sR3JhZENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBdmdQb29sR3JhZCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGF2Z1Bvb2xHcmFkIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7QmF0Y2hNYXRNdWwsIEJhdGNoTWF0TXVsQXR0cnMsIEJhdGNoTWF0TXVsSW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmN9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge2JhdGNoTWF0TXVsSW1wbH0gZnJvbSAnLi9CYXRjaE1hdE11bF9pbXBsJztcblxuZXhwb3J0IGZ1bmN0aW9uIGJhdGNoTWF0TXVsKGFyZ3M6IHtcbiAgaW5wdXRzOiBCYXRjaE1hdE11bElucHV0cyxcbiAgYXR0cnM6IEJhdGNoTWF0TXVsQXR0cnMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0xcbn0pIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2EsIGJ9ID0gaW5wdXRzO1xuICBjb25zdCB7dHJhbnNwb3NlQSwgdHJhbnNwb3NlQn0gPSBhdHRycztcblxuICByZXR1cm4gYmF0Y2hNYXRNdWxJbXBsKHthLCBiLCB0cmFuc3Bvc2VBLCB0cmFuc3Bvc2VCLCBiYWNrZW5kfSk7XG59XG5cbmV4cG9ydCBjb25zdCBiYXRjaE1hdE11bENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBCYXRjaE1hdE11bCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGJhdGNoTWF0TXVsIGFzIHt9IGFzIEtlcm5lbEZ1bmMsXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgVGVuc29ySW5mbywgdXBjYXN0VHlwZSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7bWFwQWN0aXZhdGlvblRvU2hhZGVyUHJvZ3JhbX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQge01hdE11bFBhY2tlZFByb2dyYW19IGZyb20gJy4uL211bG1hdF9wYWNrZWRfZ3B1JztcblxuaW1wb3J0IHttdWx0aXBseX0gZnJvbSAnLi9NdWx0aXBseSc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQge3N1bX0gZnJvbSAnLi9TdW0nO1xuaW1wb3J0IHt0cmFuc3Bvc2V9IGZyb20gJy4vVHJhbnNwb3NlJztcblxuLy8gRW1waXJpY2FsbHkgZGV0ZXJtaW5lZCBtaW5pbWFsIHNoYXJlZCBkaW1lbnNpb24gaW4gbWF0bXVsIGJlZm9yZSB3ZSBmb3J3YXJkXG4vLyB0byBhLm11bChiKS5zdW0oKSBpbiBvcmRlciB0byB0YWtlIGFkdmFudGFnZSBvZiBHUFUgcGFyYWxsZWxpc20uIFNlZVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGZqcy1jb3JlL3B1bGwvMTM3OSBmb3IgYmVuY2htYXJrcy5cbmV4cG9ydCBjb25zdCBNQVRNVUxfU0hBUkVEX0RJTV9USFJFU0hPTEQgPSAxMDAwO1xuXG50eXBlIEJhdGNoTWF0TXVsQ29uZmlnID0ge1xuICBhOiBUZW5zb3JJbmZvLFxuICBiOiBUZW5zb3JJbmZvLFxuICB0cmFuc3Bvc2VBOiBib29sZWFuLFxuICB0cmFuc3Bvc2VCOiBib29sZWFuLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBiaWFzPzogVGVuc29ySW5mbyxcbiAgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cz86IFRlbnNvckluZm8sXG4gIGxlYWt5cmVsdUFscGhhPzogbnVtYmVyLFxuICBhY3RpdmF0aW9uPzogYmFja2VuZF91dGlsLkFjdGl2YXRpb25cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBiYXRjaE1hdE11bEltcGwoe1xuICBhLFxuICBiLFxuICB0cmFuc3Bvc2VBLFxuICB0cmFuc3Bvc2VCLFxuICBiYWNrZW5kLFxuICBiaWFzID0gbnVsbCxcbiAgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyA9IG51bGwsXG4gIGxlYWt5cmVsdUFscGhhID0gMCxcbiAgYWN0aXZhdGlvbiA9IG51bGxcbn06IEJhdGNoTWF0TXVsQ29uZmlnKTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IGFSYW5rID0gYS5zaGFwZS5sZW5ndGg7XG4gIGNvbnN0IGJSYW5rID0gYi5zaGFwZS5sZW5ndGg7XG5cbiAgY29uc3QgaW5uZXJTaGFwZUEgPSB0cmFuc3Bvc2VBID8gYS5zaGFwZVthUmFuayAtIDJdIDogYS5zaGFwZVthUmFuayAtIDFdO1xuICBjb25zdCBpbm5lclNoYXBlQiA9IHRyYW5zcG9zZUIgPyBiLnNoYXBlW2JSYW5rIC0gMV0gOiBiLnNoYXBlW2JSYW5rIC0gMl07XG5cbiAgY29uc3Qgb3V0ZXJTaGFwZUEgPSB0cmFuc3Bvc2VBID8gYS5zaGFwZVthUmFuayAtIDFdIDogYS5zaGFwZVthUmFuayAtIDJdO1xuICBjb25zdCBvdXRlclNoYXBlQiA9IHRyYW5zcG9zZUIgPyBiLnNoYXBlW2JSYW5rIC0gMl0gOiBiLnNoYXBlW2JSYW5rIC0gMV07XG5cbiAgY29uc3Qgb3V0ZXJEaW1zQSA9IGEuc2hhcGUuc2xpY2UoMCwgLTIpO1xuICBjb25zdCBvdXRlckRpbXNCID0gYi5zaGFwZS5zbGljZSgwLCAtMik7XG5cbiAgY29uc3QgYmF0Y2hEaW1BID0gdXRpbC5zaXplRnJvbVNoYXBlKG91dGVyRGltc0EpO1xuICBjb25zdCBiYXRjaERpbUIgPSB1dGlsLnNpemVGcm9tU2hhcGUob3V0ZXJEaW1zQik7XG5cbiAgY29uc3QgYmF0Y2hEaW1zQ29tcGF0aWJsZSA9XG4gICAgICBiYXRjaERpbUEgPT09IGJhdGNoRGltQiB8fCBiYXRjaERpbUEgPT09IDEgfHwgYmF0Y2hEaW1CID09PSAxO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgYVJhbmsgPj0gMiAmJiBiUmFuayA+PSAyICYmIGJhdGNoRGltc0NvbXBhdGlibGUsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gbWF0TXVsOiB0aGUgaW5wdXQgYmF0Y2ggZGltZW5zaW9ucyBtdXN0IGVpdGhlciBiZSB0aGUgYCArXG4gICAgICAgICAgYHNhbWUgb3IgYXQgbGVhc3Qgb25lIGlucHV0IGJhdGNoIGRpbWVuc2lvbiBtdXN0IGJlIDEuIEdvdCBpbnB1dCBgICtcbiAgICAgICAgICBgYmF0Y2ggZGltZW5zaW9ucyBvZiAoJHtvdXRlckRpbXNBfSkgYW5kICgke291dGVyRGltc0J9KS5gKTtcblxuICBjb25zdCBvdXRTaGFwZU91dGVyRGltcyA9XG4gICAgICBiYXRjaERpbUEgPiBiYXRjaERpbUIgPyBhLnNoYXBlLnNsaWNlKDAsIC0yKSA6IGIuc2hhcGUuc2xpY2UoMCwgLTIpO1xuICBjb25zdCBvdXRTaGFwZSA9IG91dFNoYXBlT3V0ZXJEaW1zLmNvbmNhdChbb3V0ZXJTaGFwZUEsIG91dGVyU2hhcGVCXSk7XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICBpbm5lclNoYXBlQSA9PT0gaW5uZXJTaGFwZUIsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gbWF0TXVsOiBpbm5lciBzaGFwZXMgKCR7aW5uZXJTaGFwZUF9KSBhbmQgKGAgK1xuICAgICAgICAgIGAke2lubmVyU2hhcGVCfSkgb2YgVGVuc29ycyB3aXRoIHNoYXBlcyAke2Euc2hhcGV9IGFuZCBgICtcbiAgICAgICAgICBgJHtiLnNoYXBlfSBhbmQgdHJhbnNwb3NlQT0ke3RyYW5zcG9zZUF9YCArXG4gICAgICAgICAgYCBhbmQgdHJhbnNwb3NlQj0ke3RyYW5zcG9zZUJ9IG11c3QgbWF0Y2guYCk7XG5cbiAgY29uc3QgYTNkU2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IHRyYW5zcG9zZUEgP1xuICAgICAgW2JhdGNoRGltQSwgaW5uZXJTaGFwZUEsIG91dGVyU2hhcGVBXSA6XG4gICAgICBbYmF0Y2hEaW1BLCBvdXRlclNoYXBlQSwgaW5uZXJTaGFwZUFdO1xuICBjb25zdCBiM2RTaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdID0gdHJhbnNwb3NlQiA/XG4gICAgICBbYmF0Y2hEaW1CLCBvdXRlclNoYXBlQiwgaW5uZXJTaGFwZUJdIDpcbiAgICAgIFtiYXRjaERpbUIsIGlubmVyU2hhcGVCLCBvdXRlclNoYXBlQl07XG5cbiAgLy8gVGhlIHJlc3Qgb2YgdGhlIGltcGxlbWVudGF0aW9uIGlzIGRlc2lnbmVkIHRvIG9wZXJhdGUgb24gcmFuay0zIHRlbnNvcnNcbiAgY29uc3QgYTNkID0gcmVzaGFwZSh7aW5wdXRzOiB7eDogYX0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IGEzZFNoYXBlfX0pO1xuICBjb25zdCBiM2QgPSByZXNoYXBlKHtpbnB1dHM6IHt4OiBifSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogYjNkU2hhcGV9fSk7XG5cbiAgY29uc3QgaW50ZXJtZWRpYXRlczogVGVuc29ySW5mb1tdID0gW2EzZCwgYjNkXTtcblxuICBjb25zdCBiYXRjaERpbSA9IE1hdGgubWF4KGJhdGNoRGltQSwgYmF0Y2hEaW1CKTtcbiAgY29uc3Qgc2hhcmVkRGltID0gdHJhbnNwb3NlQSA/IGEzZC5zaGFwZVsxXSA6IGEzZC5zaGFwZVsyXTtcblxuICBjb25zdCBoYXNCaWFzID0gYmlhcyAhPSBudWxsO1xuICBjb25zdCBoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzID0gcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyAhPSBudWxsO1xuICBjb25zdCBoYXNMZWFreXJlbHVBbHBoYSA9IGFjdGl2YXRpb24gPT09ICdsZWFreXJlbHUnO1xuICBjb25zdCBmdXNlZEFjdGl2YXRpb24gPSBhY3RpdmF0aW9uICE9IG51bGwgP1xuICAgICAgbWFwQWN0aXZhdGlvblRvU2hhZGVyUHJvZ3JhbShhY3RpdmF0aW9uLCB0cnVlKSA6XG4gICAgICBudWxsO1xuICBjb25zdCBjb250YWluc0Z1c2VkT3BzID0gaGFzQmlhcyB8fCBoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzIHx8XG4gICAgICBoYXNMZWFreXJlbHVBbHBoYSB8fCBmdXNlZEFjdGl2YXRpb24gIT0gbnVsbDtcbiAgbGV0IG91dDogVGVuc29ySW5mbztcblxuICAvLyBTaW5jZSB0aGUgbWF0cmljZXMgYXJlIHZlY3RvcnMsIGl0IGlzIGZhc3RlciB0byBjYWxsIG11bCgpLnN1bSgpXG4gIC8vIGJlY2F1c2Ugc3VtKCkgaXMgTyhzcXJ0KE4pKSBkdWUgdG8gZGl2aWRlLWFuZC1jb25xdWVyLlxuICBpZiAoKG91dGVyU2hhcGVBID09PSAxIHx8IG91dGVyU2hhcGVCID09PSAxKSAmJlxuICAgICAgc2hhcmVkRGltID4gTUFUTVVMX1NIQVJFRF9ESU1fVEhSRVNIT0xEICYmIGNvbnRhaW5zRnVzZWRPcHMgPT09IGZhbHNlKSB7XG4gICAgbGV0IGFWZWMgPSBhM2Q7XG4gICAgbGV0IGJWZWMgPSBiM2Q7XG4gICAgaWYgKHRyYW5zcG9zZUEpIHtcbiAgICAgIGFWZWMgPSB0cmFuc3Bvc2Uoe2lucHV0czoge3g6IGEzZH0sIGJhY2tlbmQsIGF0dHJzOiB7cGVybTogWzAsIDIsIDFdfX0pO1xuICAgICAgaW50ZXJtZWRpYXRlcy5wdXNoKGFWZWMpO1xuICAgIH1cbiAgICBpZiAodHJhbnNwb3NlQikge1xuICAgICAgYlZlYyA9IHRyYW5zcG9zZSh7aW5wdXRzOiB7eDogYjNkfSwgYmFja2VuZCwgYXR0cnM6IHtwZXJtOiBbMCwgMiwgMV19fSk7XG4gICAgICBpbnRlcm1lZGlhdGVzLnB1c2goYlZlYyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkUmVzaGFwZUEgPSBvdXRlclNoYXBlQiAhPT0gMTtcbiAgICBjb25zdCBzaG91bGRSZXNoYXBlQiA9IG91dGVyU2hhcGVCID09PSAxO1xuXG4gICAgbGV0IGFWZWMzZCA9IGFWZWM7XG4gICAgaWYgKHNob3VsZFJlc2hhcGVBKSB7XG4gICAgICBhVmVjM2QgPSByZXNoYXBlKHtcbiAgICAgICAgaW5wdXRzOiB7eDogYVZlY30sXG4gICAgICAgIGJhY2tlbmQsXG4gICAgICAgIGF0dHJzOiB7c2hhcGU6IFtiYXRjaERpbSwgc2hhcmVkRGltLCAxXX1cbiAgICAgIH0pO1xuXG4gICAgICBpbnRlcm1lZGlhdGVzLnB1c2goYVZlYzNkKTtcbiAgICB9XG5cbiAgICBjb25zdCBheGlzID0gb3V0ZXJTaGFwZUIgPT09IDEgPyAyIDogMTtcblxuICAgIGxldCBiVmVjM2QgPSBiVmVjO1xuICAgIGlmIChzaG91bGRSZXNoYXBlQikge1xuICAgICAgYlZlYzNkID0gcmVzaGFwZSh7XG4gICAgICAgIGlucHV0czoge3g6IGJWZWN9LFxuICAgICAgICBiYWNrZW5kLFxuICAgICAgICBhdHRyczoge3NoYXBlOiBbYmF0Y2hEaW0sIDEsIHNoYXJlZERpbV19XG4gICAgICB9KTtcblxuICAgICAgaW50ZXJtZWRpYXRlcy5wdXNoKGJWZWMzZCk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvZHVjdCA9IG11bHRpcGx5KHtpbnB1dHM6IHthOiBhVmVjM2QsIGI6IGJWZWMzZH0sIGJhY2tlbmR9KTtcbiAgICBvdXQgPSBzdW0oe2lucHV0czoge3g6IHByb2R1Y3R9LCBiYWNrZW5kLCBhdHRyczoge2F4aXMsIGtlZXBEaW1zOiB0cnVlfX0pO1xuICAgIGludGVybWVkaWF0ZXMucHVzaChwcm9kdWN0KTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBkdHlwZSA9IHVwY2FzdFR5cGUoYS5kdHlwZSwgYi5kdHlwZSk7XG5cbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IE1hdE11bFBhY2tlZFByb2dyYW0oXG4gICAgICAgIGEzZFNoYXBlLCBiM2RTaGFwZSwgW2JhdGNoRGltLCBvdXRlclNoYXBlQSwgb3V0ZXJTaGFwZUJdLCB0cmFuc3Bvc2VBLFxuICAgICAgICB0cmFuc3Bvc2VCLCBoYXNCaWFzLCBmdXNlZEFjdGl2YXRpb24sIGhhc1ByZWx1QWN0aXZhdGlvbldlaWdodHMsXG4gICAgICAgIGhhc0xlYWt5cmVsdUFscGhhKTtcblxuICAgIGNvbnN0IGlucHV0czogVGVuc29ySW5mb1tdID0gW2EzZCwgYjNkXTtcbiAgICBpZiAoYmlhcyAhPSBudWxsKSB7XG4gICAgICBpbnB1dHMucHVzaChiaWFzKTtcbiAgICB9XG4gICAgaWYgKGhhc1ByZWx1QWN0aXZhdGlvbldlaWdodHMpIHtcbiAgICAgIGlucHV0cy5wdXNoKHByZWx1QWN0aXZhdGlvbldlaWdodHMpO1xuICAgIH1cbiAgICBpZiAoaGFzTGVha3lyZWx1QWxwaGEpIHtcbiAgICAgIGNvbnN0ICRsZWFreXJlbHVBbHBoYSA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8oXG4gICAgICAgICAgW10sICdmbG9hdDMyJyxcbiAgICAgICAgICB1dGlsLmNyZWF0ZVNjYWxhclZhbHVlKGxlYWt5cmVsdUFscGhhIGFzIHt9IGFzICdmbG9hdDMyJywgJ2Zsb2F0MzInKSk7XG4gICAgICBpbnB1dHMucHVzaCgkbGVha3lyZWx1QWxwaGEpO1xuICAgICAgaW50ZXJtZWRpYXRlcy5wdXNoKCRsZWFreXJlbHVBbHBoYSk7XG4gICAgfVxuXG4gICAgb3V0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgaW5wdXRzLCBkdHlwZSk7XG4gIH1cblxuICBjb25zdCBvdXRSZXNoYXBlZCA9XG4gICAgICByZXNoYXBlKHtpbnB1dHM6IHt4OiBvdXR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBvdXRTaGFwZX19KTtcbiAgaW50ZXJtZWRpYXRlcy5wdXNoKG91dCk7XG4gIGZvciAoY29uc3QgaSBvZiBpbnRlcm1lZGlhdGVzKSB7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpKTtcbiAgfVxuICByZXR1cm4gb3V0UmVzaGFwZWQ7XG59XG4iLCJcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtlbnYsIEZ1c2VkQmF0Y2hOb3JtLCBGdXNlZEJhdGNoTm9ybUF0dHJzLCBGdXNlZEJhdGNoTm9ybUlucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtCYXRjaE5vcm1Qcm9ncmFtfSBmcm9tICcuLi9iYXRjaG5vcm1fZ3B1JztcbmltcG9ydCB7QmF0Y2hOb3JtUGFja2VkUHJvZ3JhbX0gZnJvbSAnLi4vYmF0Y2hub3JtX3BhY2tlZF9ncHUnO1xuXG5leHBvcnQgY29uc3QgYmF0Y2hOb3JtOiAocGFyYW1zOiB7XG4gIGlucHV0czogRnVzZWRCYXRjaE5vcm1JbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBGdXNlZEJhdGNoTm9ybUF0dHJzXG59KSA9PiBUZW5zb3JJbmZvID0gKHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSkgPT4ge1xuICBjb25zdCB7eCwgbWVhbiwgdmFyaWFuY2UsIG9mZnNldCwgc2NhbGV9ID0gaW5wdXRzO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgbWVhbi5zaGFwZS5sZW5ndGggPT09IHZhcmlhbmNlLnNoYXBlLmxlbmd0aCxcbiAgICAgICgpID0+ICdCYXRjaCBub3JtYWxpemF0aW9uIGdyYWRpZW50IHJlcXVpcmVzIG1lYW4gYW5kIHZhcmlhbmNlIHRvIGhhdmUgJyArXG4gICAgICAgICAgJ2VxdWFsIHJhbmtzLicpO1xuICB1dGlsLmFzc2VydChcbiAgICAgIG9mZnNldCA9PSBudWxsIHx8IG1lYW4uc2hhcGUubGVuZ3RoID09PSBvZmZzZXQuc2hhcGUubGVuZ3RoLFxuICAgICAgKCkgPT4gJ0JhdGNoIG5vcm1hbGl6YXRpb24gZ3JhZGllbnQgcmVxdWlyZXMgbWVhbiBhbmQgb2Zmc2V0IHRvIGhhdmUgJyArXG4gICAgICAgICAgJ2VxdWFsIHJhbmtzLicpO1xuICB1dGlsLmFzc2VydChcbiAgICAgIHNjYWxlID09IG51bGwgfHwgbWVhbi5zaGFwZS5sZW5ndGggPT09IHNjYWxlLnNoYXBlLmxlbmd0aCxcbiAgICAgICgpID0+ICdCYXRjaCBub3JtYWxpemF0aW9uIGdyYWRpZW50IHJlcXVpcmVzIG1lYW4gYW5kIHNjYWxlIHRvIGhhdmUgJyArXG4gICAgICAgICAgJ2VxdWFsIHJhbmtzLicpO1xuXG4gIGxldCB7dmFyaWFuY2VFcHNpbG9ufSA9IGF0dHJzO1xuICBpZiAodmFyaWFuY2VFcHNpbG9uID09IG51bGwpIHtcbiAgICB2YXJpYW5jZUVwc2lsb24gPSAwLjAwMTtcbiAgfVxuXG4gIGNvbnN0IGZpbmFsSW5wdXRzID0gW3gsIG1lYW4sIHZhcmlhbmNlXTtcblxuICBsZXQgb2Zmc2V0U2hhcGUgPSBudWxsO1xuICBpZiAob2Zmc2V0ICE9IG51bGwpIHtcbiAgICBvZmZzZXRTaGFwZSA9IG9mZnNldC5zaGFwZTtcbiAgICBmaW5hbElucHV0cy5wdXNoKG9mZnNldCk7XG4gIH1cblxuICBsZXQgc2NhbGVTaGFwZSA9IG51bGw7XG4gIGlmIChzY2FsZSAhPSBudWxsKSB7XG4gICAgc2NhbGVTaGFwZSA9IHNjYWxlLnNoYXBlO1xuICAgIGZpbmFsSW5wdXRzLnB1c2goc2NhbGUpO1xuICB9XG5cbiAgY29uc3QgcHJvZ3JhbSA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfTk9STUFMSVpBVElPTicpID9cbiAgICAgIG5ldyBCYXRjaE5vcm1QYWNrZWRQcm9ncmFtKFxuICAgICAgICAgIHguc2hhcGUsIG1lYW4uc2hhcGUsIHZhcmlhbmNlLnNoYXBlLCBvZmZzZXRTaGFwZSwgc2NhbGVTaGFwZSxcbiAgICAgICAgICB2YXJpYW5jZUVwc2lsb24pIDpcbiAgICAgIG5ldyBCYXRjaE5vcm1Qcm9ncmFtKFxuICAgICAgICAgIHguc2hhcGUsIG1lYW4uc2hhcGUsIHZhcmlhbmNlLnNoYXBlLCBvZmZzZXRTaGFwZSwgc2NhbGVTaGFwZSxcbiAgICAgICAgICB2YXJpYW5jZUVwc2lsb24pO1xuICBjb25zdCBvdXRwdXQgPVxuICAgICAgYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgZmluYWxJbnB1dHMsIGZpbmFsSW5wdXRzWzBdLmR0eXBlKTtcblxuICByZXR1cm4gb3V0cHV0O1xufTtcblxuZXhwb3J0IGNvbnN0IGJhdGNoTm9ybUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBGdXNlZEJhdGNoTm9ybSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGJhdGNoTm9ybSBhcyB7fSBhcyBLZXJuZWxGdW5jLFxufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIEJhdGNoVG9TcGFjZU5ELCBCYXRjaFRvU3BhY2VOREF0dHJzLCBCYXRjaFRvU3BhY2VORElucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuXG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQge3NsaWNlfSBmcm9tICcuL1NsaWNlJztcbmltcG9ydCB7dHJhbnNwb3NlfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5cbmV4cG9ydCBjb25zdCBiYXRjaFRvU3BhY2VORCA9IChhcmdzOiB7XG4gIGlucHV0czogQmF0Y2hUb1NwYWNlTkRJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBCYXRjaFRvU3BhY2VOREF0dHJzXG59KTogVGVuc29ySW5mbyA9PiB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge2Jsb2NrU2hhcGUsIGNyb3BzfSA9IGF0dHJzO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgeC5zaGFwZS5sZW5ndGggPD0gNCxcbiAgICAgICgpID0+ICdiYXRjaFRvU3BhY2VORCBmb3IgcmFuayA+IDQgd2l0aCBhIFdlYkdMIGJhY2tlbmQgbm90ICcgK1xuICAgICAgICAgICdpbXBsZW1lbnRlZCB5ZXQnKTtcbiAgY29uc3QgcHJvZCA9IGJsb2NrU2hhcGUucmVkdWNlKChhLCBiKSA9PiBhICogYik7XG5cbiAgY29uc3QgcmVzaGFwZWQgPSBiYWNrZW5kX3V0aWwuZ2V0UmVzaGFwZWQoeC5zaGFwZSwgYmxvY2tTaGFwZSwgcHJvZCk7XG4gIGNvbnN0IHBlcm11dGVkID0gYmFja2VuZF91dGlsLmdldFBlcm11dGVkKHJlc2hhcGVkLmxlbmd0aCwgYmxvY2tTaGFwZS5sZW5ndGgpO1xuICBjb25zdCByZXNoYXBlZFBlcm11dGVkID1cbiAgICAgIGJhY2tlbmRfdXRpbC5nZXRSZXNoYXBlZFBlcm11dGVkKHguc2hhcGUsIGJsb2NrU2hhcGUsIHByb2QpO1xuICBjb25zdCBzbGljZUJlZ2luQ29vcmRzID1cbiAgICAgIGJhY2tlbmRfdXRpbC5nZXRTbGljZUJlZ2luQ29vcmRzKGNyb3BzLCBibG9ja1NoYXBlLmxlbmd0aCk7XG4gIGNvbnN0IHNsaWNlU2l6ZSA9XG4gICAgICBiYWNrZW5kX3V0aWwuZ2V0U2xpY2VTaXplKHJlc2hhcGVkUGVybXV0ZWQsIGNyb3BzLCBibG9ja1NoYXBlLmxlbmd0aCk7XG5cbiAgY29uc3QgdG9EaXNwb3NlID0gW107XG5cbiAgY29uc3QgcmVzaGFwZWRJbnRlcm1lZGlhdGUgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IHJlc2hhcGVkfX0pO1xuICBjb25zdCB0cmFuc3Bvc2VkSW50ZXJtZWRpYXRlID0gdHJhbnNwb3NlKFxuICAgICAge2lucHV0czoge3g6IHJlc2hhcGVkSW50ZXJtZWRpYXRlfSwgYmFja2VuZCwgYXR0cnM6IHtwZXJtOiBwZXJtdXRlZH19KTtcbiAgY29uc3QgcmVzaGFwZWRJbnRlcm1lZGlhdGUyID0gcmVzaGFwZSh7XG4gICAgaW5wdXRzOiB7eDogdHJhbnNwb3NlZEludGVybWVkaWF0ZX0sXG4gICAgYmFja2VuZCxcbiAgICBhdHRyczoge3NoYXBlOiByZXNoYXBlZFBlcm11dGVkfVxuICB9KTtcbiAgY29uc3Qgc2xpY2VkID0gc2xpY2Uoe1xuICAgIGlucHV0czoge3g6IHJlc2hhcGVkSW50ZXJtZWRpYXRlMn0sXG4gICAgYmFja2VuZCxcbiAgICBhdHRyczoge2JlZ2luOiBzbGljZUJlZ2luQ29vcmRzLCBzaXplOiBzbGljZVNpemV9XG4gIH0pO1xuXG4gIHRvRGlzcG9zZS5wdXNoKHJlc2hhcGVkSW50ZXJtZWRpYXRlKTtcbiAgdG9EaXNwb3NlLnB1c2godHJhbnNwb3NlZEludGVybWVkaWF0ZSk7XG4gIHRvRGlzcG9zZS5wdXNoKHJlc2hhcGVkSW50ZXJtZWRpYXRlMik7XG5cbiAgdG9EaXNwb3NlLmZvckVhY2godCA9PiBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHQpKTtcblxuICByZXR1cm4gc2xpY2VkO1xufTtcblxuZXhwb3J0IGNvbnN0IGJhdGNoVG9TcGFjZU5EQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEJhdGNoVG9TcGFjZU5ELFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogYmF0Y2hUb1NwYWNlTkQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtCaW5jb3VudCwgQmluY291bnRBdHRycywgQmluY291bnRJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgVHlwZWRBcnJheX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7YmluY291bnRJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuZXhwb3J0IGZ1bmN0aW9uIGJpbmNvdW50KGFyZ3M6IHtcbiAgaW5wdXRzOiBCaW5jb3VudElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IEJpbmNvdW50QXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3gsIHdlaWdodHN9ID0gaW5wdXRzO1xuICBjb25zdCB7c2l6ZX0gPSBhdHRycztcblxuICBjb25zdCB4VmFscyA9IGJhY2tlbmQucmVhZFN5bmMoeC5kYXRhSWQpIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IHdlaWdodHNWYWxzID0gYmFja2VuZC5yZWFkU3luYyh3ZWlnaHRzLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcblxuICBjb25zdCBvdXRWYWxzID1cbiAgICAgIGJpbmNvdW50SW1wbENQVSh4VmFscywgd2VpZ2h0c1ZhbHMsIHdlaWdodHMuZHR5cGUsIHdlaWdodHMuc2hhcGUsIHNpemUpO1xuXG4gIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtzaXplXSwgd2VpZ2h0cy5kdHlwZSwgb3V0VmFscyk7XG59XG5cbmV4cG9ydCBjb25zdCBiaW5jb3VudENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBCaW5jb3VudCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGJpbmNvdW50IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgKiBhcyB0ZiBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtCaW5hcnlJbnB1dHMsIENhc3QsIENhc3RBdHRycywgQ2FzdElucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuXG5pbXBvcnQge2NvbXBsZXh9IGZyb20gJy4vQ29tcGxleCc7XG5pbXBvcnQge2lkZW50aXR5fSBmcm9tICcuL0lkZW50aXR5JztcbmltcG9ydCB7bm90RXF1YWx9IGZyb20gJy4vTm90RXF1YWwnO1xuaW1wb3J0IHtyZWFsfSBmcm9tICcuL1JlYWwnO1xuXG5pbXBvcnQge2ludH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2ludCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjYXN0KFxuICAgIGFyZ3M6IHtpbnB1dHM6IENhc3RJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsIGF0dHJzOiBDYXN0QXR0cnN9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7ZHR5cGV9ID0gYXR0cnM7XG5cbiAgLy8gQ2FzdGluZyB0byBjb21wbGV4NjQuXG4gIGlmIChkdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICBpZiAoeC5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgIHJldHVybiBpZGVudGl0eSh7aW5wdXRzOiB7eH0sIGJhY2tlbmR9KTtcbiAgICB9XG5cbiAgICAvLyBUT0RPKGFubnhpbmd5dWFuKTogSW1wb3J0IGtlcm5lbCBmdW5jdGlvbiBvbmNlIHplcm9zIGlzIG1vZHVsYXJpemVkLlxuICAgIGNvbnN0IHplcm9zVGVuc29yID0gdGYuemVyb3MoeC5zaGFwZSk7XG4gICAgY29uc3QgZmxvYXRYID0gY2FzdCh7aW5wdXRzOiB7eH0sIGJhY2tlbmQsIGF0dHJzOiB7ZHR5cGU6ICdmbG9hdDMyJ319KTtcblxuICAgIGNvbnN0IHJlc3VsdCA9XG4gICAgICAgIGNvbXBsZXgoe2lucHV0czoge3JlYWw6IGZsb2F0WCwgaW1hZzogemVyb3NUZW5zb3J9LCBiYWNrZW5kfSk7XG5cbiAgICB6ZXJvc1RlbnNvci5kaXNwb3NlKCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhmbG9hdFgpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIENhc3RpbmcgZnJvbSBjb21wbGV4NjRcbiAgaWYgKHguZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgY29uc3QgcmVhbFBhcnQgPSByZWFsKHtpbnB1dHM6IHtpbnB1dDogeH0sIGJhY2tlbmR9KTtcbiAgICBjb25zdCByZXN1bHQgPSBjYXN0KHtpbnB1dHM6IHt4OiByZWFsUGFydH0sIGJhY2tlbmQsIGF0dHJzOiB7ZHR5cGV9fSk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZWFsUGFydCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGlmICghdXRpbC5oYXNFbmNvZGluZ0xvc3MoeC5kdHlwZSwgZHR5cGUpKSB7XG4gICAgLy8gV2UgZG9uJ3QgY2hhbmdlIHRoZSB1bmRlcmx5aW5nIGRhdGEsIHNpbmNlIHdlIGNhc3QgdG8gaGlnaGVyXG4gICAgLy8gcHJlY2lzaW9uLlxuICAgIGNvbnN0IHJlc3VsdCA9IGlkZW50aXR5KHtpbnB1dHM6IHt4fSwgYmFja2VuZH0pO1xuICAgIHJldHVybiB7ZGF0YUlkOiByZXN1bHQuZGF0YUlkLCBzaGFwZTogcmVzdWx0LnNoYXBlLCBkdHlwZX07XG4gIH1cblxuICBpZiAoZHR5cGUgPT09ICdpbnQzMicpIHtcbiAgICByZXR1cm4gaW50KHgsIGJhY2tlbmQpO1xuICB9XG5cbiAgaWYgKGR0eXBlID09PSAnYm9vbCcpIHtcbiAgICBjb25zdCB6ZXJvc1RlbnNvckluZm8gPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFxuICAgICAgICBbXSwgJ2Jvb2wnLCB1dGlsLmdldFR5cGVkQXJyYXlGcm9tRFR5cGUoJ2Jvb2wnLCAxKSk7XG5cbiAgICBjb25zdCBiaW5hcnlJbnB1dHM6IEJpbmFyeUlucHV0cyA9IHthOiB4LCBiOiB6ZXJvc1RlbnNvckluZm99O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gbm90RXF1YWwoe2lucHV0czogYmluYXJ5SW5wdXRzLCBiYWNrZW5kfSkgYXMgVGVuc29ySW5mbztcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHplcm9zVGVuc29ySW5mbyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgRXJyb3IgaW4gQ2FzdDogZmFpbGVkIHRvIGNhc3QgJHt4LmR0eXBlfSB0byAke2R0eXBlfWApO1xufVxuXG5leHBvcnQgY29uc3QgY2FzdENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBDYXN0LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogY2FzdCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0NlaWwsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuY30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7Y2VpbEltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5jb25zdCBDRUlMID0gYHJldHVybiBjZWlsKHgpO2A7XG5cbmV4cG9ydCBjb25zdCBjZWlsID0gdW5hcnlLZXJuZWxGdW5jKFxuICAgIHtvcFNuaXBwZXQ6IENFSUwsIHBhY2tlZE9wU25pcHBldDogQ0VJTCwgY3B1S2VybmVsSW1wbDogY2VpbEltcGxDUFV9KTtcblxuZXhwb3J0IGNvbnN0IGNlaWxDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ2VpbCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGNlaWwgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtDbGlwQnlWYWx1ZSwgQ2xpcEJ5VmFsdWVBdHRycywgQ2xpcEJ5VmFsdWVJbnB1dHMsIGVudiwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtDbGlwUHJvZ3JhbX0gZnJvbSAnLi4vY2xpcF9ncHUnO1xuaW1wb3J0IHtDbGlwUGFja2VkUHJvZ3JhbX0gZnJvbSAnLi4vY2xpcF9wYWNrZWRfZ3B1JztcblxuZXhwb3J0IGZ1bmN0aW9uIGNsaXBCeVZhbHVlKGFyZ3M6IHtcbiAgaW5wdXRzOiBDbGlwQnlWYWx1ZUlucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IENsaXBCeVZhbHVlQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7Y2xpcFZhbHVlTWluLCBjbGlwVmFsdWVNYXh9ID0gYXR0cnM7XG5cbiAgbGV0IHByb2dyYW07XG4gIGlmIChlbnYoKS5nZXRCb29sKCdXRUJHTF9QQUNLX0NMSVAnKSkge1xuICAgIHByb2dyYW0gPSBuZXcgQ2xpcFBhY2tlZFByb2dyYW0oeC5zaGFwZSk7XG4gIH0gZWxzZSB7XG4gICAgcHJvZ3JhbSA9IG5ldyBDbGlwUHJvZ3JhbSh4LnNoYXBlKTtcbiAgfVxuICBjb25zdCBjdXN0b21WYWx1ZXMgPSBbW2NsaXBWYWx1ZU1pbl0sIFtjbGlwVmFsdWVNYXhdXTtcbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4XSwgeC5kdHlwZSwgY3VzdG9tVmFsdWVzKTtcbn1cblxuZXhwb3J0IGNvbnN0IGNsaXBCeVZhbHVlQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IENsaXBCeVZhbHVlLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogY2xpcEJ5VmFsdWUgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtDb21wbGV4LCBDb21wbGV4SW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge2lkZW50aXR5fSBmcm9tICcuL0lkZW50aXR5JztcblxuLyoqXG4gKiBJbiBXZWJHTCBkYXRhIGlzIHN0b3JlZCBpbiBHUFUgdGV4dHVyZXMgd2hpY2ggY2FuJ3QgYmUgZWZmaWNpZW50bHkgY29waWVkLCBzb1xuICogY29tcGxleCB0ZW5zb3JzIHNoYXJlIGRhdGEgd2l0aCB0aGVpciByZWFsIGFuZCBpbWFnaW5hcnkgY29tcG9uZW50cy4gQ29tcGxleFxuICogdGVuc29ycycgcmVmZXJlbmNlIHRvIHRoZSBjb21wb25lbnRzIGlzIHRyYWNrZWQgYnkgcmVmQ291bnQgb24gdGhlIGluZGl2aWR1YWxcbiAqIGNvbXBvbmVudC4gVGhlIHJlZkNvdW50cyBhcmUgaW5jcmVhc2VkIGJ5IHRoZSBpZGVudGl0eSBjYWxsLlxuICpcbiAqIFdoZW4gYSBjb21wbGV4IHRlbnNvciBpcyBkaXNwb3NlZCwgaXQgd2lsbCByZWR1Y2UgdGhlIHJlZkNvdW50IG9uIHRoZVxuICogY29tcG9uZW50cyBieSBjYWxsaW5nIGRpc3Bvc2VEYXRhIG9uIGVhY2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wbGV4KFxuICAgIGFyZ3M6IHtpbnB1dHM6IENvbXBsZXhJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge3JlYWwsIGltYWd9ID0gaW5wdXRzO1xuXG4gIGNvbnN0IGNvbXBsZXhJbmZvID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhyZWFsLnNoYXBlLCAnY29tcGxleDY0Jyk7XG4gIGNvbnN0IGNvbXBsZXggPSBiYWNrZW5kLnRleERhdGEuZ2V0KGNvbXBsZXhJbmZvLmRhdGFJZCk7XG5cbiAgY29uc3QgcmVhbFRlbnNvckluZm8gPSBpZGVudGl0eSh7aW5wdXRzOiB7eDogcmVhbH0sIGJhY2tlbmR9KTtcblxuICBjb25zdCBpbWFnVGVuc29ySW5mbyA9IGlkZW50aXR5KHtpbnB1dHM6IHt4OiBpbWFnfSwgYmFja2VuZH0pO1xuXG4gIGNvbXBsZXguY29tcGxleFRlbnNvckluZm9zID0ge3JlYWw6IHJlYWxUZW5zb3JJbmZvLCBpbWFnOiBpbWFnVGVuc29ySW5mb307XG5cbiAgcmV0dXJuIGNvbXBsZXhJbmZvO1xufVxuXG5leHBvcnQgY29uc3QgY29tcGxleENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBDb21wbGV4LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogY29tcGxleCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0NvbXBsZXhBYnMsIENvbXBsZXhBYnNJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7Q29tcGxleEFic1Byb2dyYW19IGZyb20gJy4uL2NvbXBsZXhfYWJzX2dwdSc7XG5cbi8vIFJldHVybnMgYSBUZW5zb3JJbmZvIHdpdGggdGhlIGNvbXBsZXggc2hhcGUgYW5kIHRoZSBkYXRhSWQgb2YgdGhlXG4vLyB1bmRlcmx5aW5nIHBhcnQuIFdlIG5lZWQgdG8gZG8gdGhpcyBiZWNhdXNlIGEgcmVzaGFwZWQgY29tcGxleCB0ZW5zb3IgaXNcbi8vIG5vdCByZWZsZWN0ZWQgaW4gaXRzIHBhcnRzLlxuZnVuY3Rpb24gbWFrZUNvbXBsZXhDb21wb25lbnRUZW5zb3JJbmZvKFxuICAgIGNvbXBsZXhUZW5zb3I6IFRlbnNvckluZm8sIGNvbXBsZXhQYXJ0OiBUZW5zb3JJbmZvKTogVGVuc29ySW5mbyB7XG4gIHJldHVybiB7XG4gICAgZGF0YUlkOiBjb21wbGV4UGFydC5kYXRhSWQsXG4gICAgZHR5cGU6IGNvbXBsZXhQYXJ0LmR0eXBlLFxuICAgIHNoYXBlOiBjb21wbGV4VGVuc29yLnNoYXBlXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wbGV4QWJzKFxuICAgIGFyZ3M6IHtpbnB1dHM6IENvbXBsZXhBYnNJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuXG4gIGNvbnN0IHhEYXRhID0gYmFja2VuZC50ZXhEYXRhLmdldCh4LmRhdGFJZCk7XG5cbiAgY29uc3QgcHJvZ3JhbSA9IG5ldyBDb21wbGV4QWJzUHJvZ3JhbSh4LnNoYXBlKTtcbiAgY29uc3QgcHJvZ3JhbUlucHV0cyA9IFtcbiAgICBtYWtlQ29tcGxleENvbXBvbmVudFRlbnNvckluZm8oeCwgeERhdGEuY29tcGxleFRlbnNvckluZm9zLnJlYWwpLFxuICAgIG1ha2VDb21wbGV4Q29tcG9uZW50VGVuc29ySW5mbyh4LCB4RGF0YS5jb21wbGV4VGVuc29ySW5mb3MuaW1hZyksXG4gIF07XG5cbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKFxuICAgICAgcHJvZ3JhbSwgcHJvZ3JhbUlucHV0cywgcHJvZ3JhbUlucHV0c1swXS5kdHlwZSk7XG59XG5cbmV4cG9ydCBjb25zdCBjb21wbGV4QWJzQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IENvbXBsZXhBYnMsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBjb21wbGV4QWJzIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBDb25jYXQsIENvbmNhdEF0dHJzLCBDb25jYXRJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7Y29uY2F0SW1wbH0gZnJvbSAnLi9Db25jYXRfaW1wbCc7XG5pbXBvcnQge2lkZW50aXR5fSBmcm9tICcuL0lkZW50aXR5JztcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbmNhdChcbiAgICBhcmdzOlxuICAgICAgICB7aW5wdXRzOiBDb25jYXRJbnB1dHMsIGF0dHJzOiBDb25jYXRBdHRycywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTH0pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7YXhpc30gPSBhdHRycztcblxuICBjb25zdCAkYXhpcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgaW5wdXRzWzBdLnNoYXBlKVswXTtcbiAgY29uc3Qgb3V0U2hhcGUgPVxuICAgICAgYmFja2VuZF91dGlsLmNvbXB1dGVPdXRTaGFwZShpbnB1dHMubWFwKHQgPT4gdC5zaGFwZSksICRheGlzKTtcblxuICBpZiAodXRpbC5zaXplRnJvbVNoYXBlKG91dFNoYXBlKSA9PT0gMCkge1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dFNoYXBlLCBpbnB1dHNbMF0uZHR5cGUsIFtdKTtcbiAgfVxuXG4gIC8vIEtlZXAgb25seSBub24tZW1wdHkgdGVuc29ycyAoaWdub3JlIHRlbnNvcnMgd2l0aCAwIGluIHRoZWlyIHNoYXBlKS5cbiAgY29uc3QgJGlucHV0cyA9IGlucHV0cy5maWx0ZXIodCA9PiB1dGlsLnNpemVGcm9tU2hhcGUodC5zaGFwZSkgPiAwKTtcbiAgaWYgKCRpbnB1dHMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIGlkZW50aXR5KHtpbnB1dHM6IHt4OiAkaW5wdXRzWzBdfSwgYmFja2VuZH0pO1xuICB9XG5cbiAgY29uc3Qgc2hhcGVzID0gJGlucHV0cy5tYXAodCA9PiB0LnNoYXBlKTtcbiAgYmFja2VuZF91dGlsLmFzc2VydFBhcmFtc0NvbnNpc3RlbnQoc2hhcGVzLCAkYXhpcyk7XG5cbiAgcmV0dXJuIGNvbmNhdEltcGwoJGlucHV0cywgJGF4aXMsIGJhY2tlbmQpO1xufVxuXG5leHBvcnQgY29uc3QgY29uY2F0Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IENvbmNhdCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGNvbmNhdCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgQ29uY2F0SW5wdXRzLCBlbnYsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0NvbmNhdFByb2dyYW19IGZyb20gJy4uL2NvbmNhdF9ncHUnO1xuaW1wb3J0IHtDb25jYXRQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9jb25jYXRfcGFja2VkX2dwdSc7XG5pbXBvcnQge2NvbmNhdEltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5pbXBvcnQge2NvbXBsZXh9IGZyb20gJy4vQ29tcGxleCc7XG5pbXBvcnQge2ltYWd9IGZyb20gJy4vSW1hZyc7XG5pbXBvcnQge3JlYWx9IGZyb20gJy4vUmVhbCc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25jYXRJbXBsKFxuICAgIGlucHV0czogQ29uY2F0SW5wdXRzLCBheGlzOiBudW1iZXIsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wpOiBUZW5zb3JJbmZvIHtcbiAgY29uc3QgZHR5cGUgPSBpbnB1dHNbMF0uZHR5cGU7XG4gIGlmIChkdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICBjb25zdCByZWFscyA9IGlucHV0cy5tYXAoKHQpID0+IHJlYWwoe2lucHV0czoge2lucHV0OiB0fSwgYmFja2VuZH0pKTtcbiAgICBjb25zdCBpbWFncyA9IGlucHV0cy5tYXAoKHQpID0+IGltYWcoe2lucHV0czoge2lucHV0OiB0fSwgYmFja2VuZH0pKTtcblxuICAgIGNvbnN0IHJlYWxDb25jYXRlZCA9IGNvbmNhdEltcGwocmVhbHMsIGF4aXMsIGJhY2tlbmQpO1xuICAgIGNvbnN0IGltYWdDb25jYXRlZCA9IGNvbmNhdEltcGwoaW1hZ3MsIGF4aXMsIGJhY2tlbmQpO1xuXG4gICAgY29uc3QgcmVzdWx0ID1cbiAgICAgICAgY29tcGxleCh7aW5wdXRzOiB7cmVhbDogcmVhbENvbmNhdGVkLCBpbWFnOiBpbWFnQ29uY2F0ZWR9LCBiYWNrZW5kfSk7XG5cbiAgICByZWFscy5mb3JFYWNoKHIgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyKSk7XG4gICAgaW1hZ3MuZm9yRWFjaChpID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaSkpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVhbENvbmNhdGVkKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGltYWdDb25jYXRlZCk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgbGV0IHJ1bk9uQ3B1ID0gYmFja2VuZC5zaG91bGRFeGVjdXRlT25DUFUoaW5wdXRzKTtcblxuICAvLyBSdW4gb24gY3B1IGlmIGR0eXBlIGlzIHN0cmluZy4gRm9yIHN0cmluZywgdGhlIGJhY2tlbmQgcmVwcmVzZW50cyBpdFxuICAvLyBhcyBVaW50OEFycmF5W10sIHdoZXJlIGVhY2ggVWludDhBcnJheSBpcyBhIGNoYXJhY3Rlci4gR2l2ZW4gdGhhdCB0aGVcbiAgLy8gY29tcHV0YXRpb24gaXMgb25seSBvbiB0aGUgb3V0ZXIgYXJyYXksIHVwbG9hZGluZyB0aGUgd2hvbGUgZGF0YSBvbnRvXG4gIC8vIGdwdSBpcyB3YXN0ZWZ1bC4gQWxzbywgY3VycmVudGx5IHdlYmdsIGRvZXNuJ3QgaGF2ZSBhIGRlc2lnbiB0b1xuICAvLyB1cGxvYWQgYW5kIHJldHJpZXZlIFVpbnQ4QXJyYXlbXSBiZXR3ZWVuIGNwdSBhbmQgZ3B1LiBUaGVyZWZvcmUsIHdlXG4gIC8vIGp1c3QgcnVuIHRoZSBrZXJuZWwgb24gY3B1IGlmIGR0eXBlIGlzIHN0cmluZy5cbiAgaWYgKGR0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHJ1bk9uQ3B1ID0gdHJ1ZTtcbiAgfVxuXG4gIGlmIChydW5PbkNwdSkge1xuICAgIC8vIEFueSBjb25jYXQgb2Ygbi1kaW1lbnNpb25hbCB0ZW5zb3JzIGFjcm9zcyBhbnkgYXhpcyBjYW4gYmUgcmVkdWNlZCB0b1xuICAgIC8vIGEgY29uY2F0ZW5hdGlvbiBvZiB0d28tZGltZW5zaW9uYWwgdGVuc29ycyBhY3Jvc3MgdGhlIGF4aXMgMSBieSBmaXJzdFxuICAgIC8vIHBhcnRpdGlvbmluZyB0aGUgYXhlcyBvZiB0aGUgb3JpZ2luYWwgdGVuc29ycyBpbnRvIHRob3NlIGxlc3MgdGhhbiB0aGVcbiAgICAvLyBheGlzIHRvIGJlIGNvbmNhdGVuYXRlZCBhbmQgdGhlIHJlc3QuIFRoZW4gcmVzaGFwZSB0aGUgdGVuc29yc1xuICAgIC8vIGludG8gYSB0d28tZGltZW5zaW9uYWwgdGVuc29yIGJ5IGNvbGxhcHNpbmcgdGhlc2UgdHdvIHNldHMgb2YgYXhlcyBhbmRcbiAgICAvLyBjb25jYXRlbmF0ZSB0aGUgcmVzdWx0aW5nIG1hdHJpY2VzIGFjcm9zcyB0aGUgYXhpcyAxLCBmaW5hbGx5IHJlc2hhcGluZ1xuICAgIC8vIHRoZSByZXN1bHQgdG8gaGF2ZSB0aGUgcHJvcGVyIHNoYXBlLlxuICAgIGNvbnN0IHRlbnNvcnMyRCA9IGlucHV0cy5tYXAodCA9PiB7XG4gICAgICBjb25zdCBpbm5lclNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUodC5zaGFwZS5zbGljZShheGlzKSk7XG4gICAgICBjb25zdCBzaGFwZSA9IFstMSwgaW5uZXJTaXplXTtcbiAgICAgIHJldHVybiByZXNoYXBlKHtpbnB1dHM6IHt4OiB0fSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZX19KTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGlucHV0c1ZhbFNoYXBlcyA9IHRlbnNvcnMyRC5tYXAodCA9PiB7XG4gICAgICByZXR1cm4ge3ZhbHM6IGJhY2tlbmQucmVhZFN5bmModC5kYXRhSWQpLCBzaGFwZTogdC5zaGFwZX07XG4gICAgfSk7XG5cbiAgICAvLyBDb25jYXRzIDJkIHRlbnNvcnMgYWxvbmcgYXhpcz0xLlxuICAgIGNvbnN0IG91dFNoYXBlID1cbiAgICAgICAgYmFja2VuZF91dGlsLmNvbXB1dGVPdXRTaGFwZSh0ZW5zb3JzMkQubWFwKHQgPT4gdC5zaGFwZSksIDEgLyogYXhpcyAqLyk7XG4gICAgY29uc3Qgc2ltcGx5Q29uY2F0ID0gdGVuc29yczJEWzBdLnNoYXBlWzBdID09PSAxO1xuICAgIGNvbnN0IG91dFZhbHMgPVxuICAgICAgICBjb25jYXRJbXBsQ1BVKGlucHV0c1ZhbFNoYXBlcywgb3V0U2hhcGUsIGR0eXBlLCBzaW1wbHlDb25jYXQpO1xuXG4gICAgY29uc3QgZmluYWxPdXRTaGFwZSA9XG4gICAgICAgIGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0U2hhcGUoaW5wdXRzLm1hcCh0ID0+IHQuc2hhcGUpLCBheGlzKTtcblxuICAgIGNvbnN0IG91dEluZm8gPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGZpbmFsT3V0U2hhcGUsIGR0eXBlLCBvdXRWYWxzKTtcblxuICAgIHRlbnNvcnMyRC5mb3JFYWNoKHQgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0KSk7XG5cbiAgICByZXR1cm4gb3V0SW5mbztcbiAgfVxuXG4gIGlmIChpbnB1dHMubGVuZ3RoID4gZW52KCkuZ2V0TnVtYmVyKCdXRUJHTF9NQVhfVEVYVFVSRVNfSU5fU0hBREVSJykpIHtcbiAgICBjb25zdCBtaWRJbmRleCA9IE1hdGguZmxvb3IoaW5wdXRzLmxlbmd0aCAvIDIpO1xuICAgIGNvbnN0IGxlZnRTaWRlID0gY29uY2F0SW1wbChpbnB1dHMuc2xpY2UoMCwgbWlkSW5kZXgpLCBheGlzLCBiYWNrZW5kKTtcbiAgICBjb25zdCByaWdodFNpZGUgPSBjb25jYXRJbXBsKGlucHV0cy5zbGljZShtaWRJbmRleCksIGF4aXMsIGJhY2tlbmQpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gY29uY2F0SW1wbChbbGVmdFNpZGUsIHJpZ2h0U2lkZV0sIGF4aXMsIGJhY2tlbmQpO1xuXG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhsZWZ0U2lkZSk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyaWdodFNpZGUpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGlmIChlbnYoKS5nZXRCb29sKCdXRUJHTF9QQUNLX0FSUkFZX09QRVJBVElPTlMnKSAmJlxuICAgICAgaW5wdXRzWzBdLnNoYXBlLmxlbmd0aCA+IDEpIHtcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IENvbmNhdFBhY2tlZFByb2dyYW0oaW5wdXRzLm1hcCh0ID0+IHQuc2hhcGUpLCBheGlzKTtcbiAgICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgaW5wdXRzLCBkdHlwZSk7XG4gIH1cblxuICBjb25zdCB7dGVuc29yczJELCBvdXRTaGFwZX0gPSBjb21wdXRlVGVuc29yczJEKGlucHV0cywgYXhpcywgYmFja2VuZCk7XG4gIGNvbnN0IHByb2dyYW0gPVxuICAgICAgbmV3IENvbmNhdFByb2dyYW0odGVuc29yczJELm1hcCh0ID0+IHQuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyXSkpO1xuICBjb25zdCByZXN1bHQgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCB0ZW5zb3JzMkQsIGR0eXBlKTtcblxuICB0ZW5zb3JzMkQuZm9yRWFjaChyID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocikpO1xuICBjb25zdCByZXNoYXBlZFJlc3VsdCA9XG4gICAgICByZXNoYXBlKHtpbnB1dHM6IHt4OiByZXN1bHR9LCBhdHRyczoge3NoYXBlOiBvdXRTaGFwZX0sIGJhY2tlbmR9KTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXN1bHQpO1xuXG4gIHJldHVybiByZXNoYXBlZFJlc3VsdDtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZVRlbnNvcnMyRChcbiAgICBpbnB1dHM6IENvbmNhdElucHV0cywgYXhpczogbnVtYmVyLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMKSB7XG4gIC8vIEFueSBjb25jYXQgb2Ygbi1kaW1lbnNpb25hbCB0ZW5zb3JzIGFjcm9zcyBhbnkgYXhpcyBjYW4gYmUgcmVkdWNlZCB0b1xuICAvLyBhIGNvbmNhdGVuYXRpb24gb2YgdHdvLWRpbWVuc2lvbmFsIHRlbnNvcnMgYWNyb3NzIHRoZSBheGlzIDEgYnkgZmlyc3RcbiAgLy8gcGFydGl0aW9uaW5nIHRoZSBheGVzIG9mIHRoZSBvcmlnaW5hbCB0ZW5zb3JzIGludG8gdGhvc2UgbGVzcyB0aGFuIHRoZVxuICAvLyBheGlzIHRvIGJlIGNvbmNhdGVuYXRlZCBhbmQgdGhlIHJlc3QuIFRoZW4gcmVzaGFwZSB0aGUgdGVuc29yc1xuICAvLyBpbnRvIGEgdHdvLWRpbWVuc2lvbmFsIHRlbnNvciBieSBjb2xsYXBzaW5nIHRoZXNlIHR3byBzZXRzIG9mIGF4ZXMgYW5kXG4gIC8vIGNvbmNhdGVuYXRlIHRoZSByZXN1bHRpbmcgbWF0cmljZXMgYWNyb3NzIHRoZSBheGlzIDEsIGZpbmFsbHkgcmVzaGFwaW5nXG4gIC8vIHRoZSByZXN1bHQgdG8gaGF2ZSB0aGUgcHJvcGVyIHNoYXBlLlxuICBjb25zdCBvdXRTaGFwZSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0U2hhcGUoaW5wdXRzLm1hcCh0ID0+IHQuc2hhcGUpLCBheGlzKTtcbiAgY29uc3QgdGVuc29yczJEID0gaW5wdXRzLm1hcChcbiAgICAgIHggPT4gcmVzaGFwZSh7XG4gICAgICAgIGlucHV0czoge3h9LFxuICAgICAgICBhdHRyczoge3NoYXBlOiBbLTEsIHV0aWwuc2l6ZUZyb21TaGFwZSh4LnNoYXBlLnNsaWNlKGF4aXMpKV19LFxuICAgICAgICBiYWNrZW5kXG4gICAgICB9KSk7XG5cbiAgcmV0dXJuIHt0ZW5zb3JzMkQsIG91dFNoYXBlfTtcbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIENvbnYyRCwgQ29udjJEQXR0cnMsIENvbnYyRElucHV0cywgZW52LCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0NvbnYyRFByb2dyYW19IGZyb20gJy4uL2NvbnZfZ3B1JztcbmltcG9ydCB7Y29udjJkQnlNYXRNdWwsIGNvbnYyZFdpdGhJbTJSb3d9IGZyb20gJy4vQ29udjJEX2ltcGwnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuXG5leHBvcnQgZnVuY3Rpb24gY29udjJkKFxuICAgIGFyZ3M6XG4gICAgICAgIHtpbnB1dHM6IENvbnYyRElucHV0cywgYXR0cnM6IENvbnYyREF0dHJzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMfSkge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eCwgZmlsdGVyfSA9IGlucHV0cztcbiAgY29uc3Qge3N0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGlsYXRpb25zLCBkaW1Sb3VuZGluZ01vZGV9ID0gYXR0cnM7XG5cbiAgY29uc3QgJGRhdGFGb3JtYXQgPSBiYWNrZW5kX3V0aWwuY29udmVydENvbnYyRERhdGFGb3JtYXQoZGF0YUZvcm1hdCk7XG4gIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252MkRJbmZvKFxuICAgICAgeC5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgIGZpbHRlci5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsXG4gICAgICBkaW1Sb3VuZGluZ01vZGUsIGZhbHNlIC8qIGRlcHRod2lzZSAqLywgJGRhdGFGb3JtYXQpO1xuICBsZXQgb3V0OiBUZW5zb3JJbmZvO1xuXG4gIGlmIChjb252SW5mby5maWx0ZXJIZWlnaHQgPT09IDEgJiYgY29udkluZm8uZmlsdGVyV2lkdGggPT09IDEgJiZcbiAgICAgIGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0ID09PSAxICYmIGNvbnZJbmZvLmRpbGF0aW9uV2lkdGggPT09IDEgJiZcbiAgICAgIGNvbnZJbmZvLnN0cmlkZUhlaWdodCA9PT0gMSAmJiBjb252SW5mby5zdHJpZGVXaWR0aCA9PT0gMSAmJlxuICAgICAgKGNvbnZJbmZvLnBhZEluZm8udHlwZSA9PT0gJ1NBTUUnIHx8IGNvbnZJbmZvLnBhZEluZm8udHlwZSA9PT0gJ1ZBTElEJykpIHtcbiAgICBvdXQgPSBjb252MmRCeU1hdE11bCh7eCwgZmlsdGVyLCBjb252SW5mbywgYmFja2VuZH0pO1xuICB9IGVsc2UgaWYgKGVudigpLmdldEJvb2woJ1dFQkdMX0NPTlZfSU0yQ09MJykgJiYgeC5zaGFwZVswXSA9PT0gMSkge1xuICAgIG91dCA9IGNvbnYyZFdpdGhJbTJSb3coe3gsIGZpbHRlciwgY29udkluZm8sIGJhY2tlbmR9KTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IENvbnYyRFByb2dyYW0oY29udkluZm8pO1xuICAgIG91dCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4LCBmaWx0ZXJdLCAnZmxvYXQzMicpO1xuICB9XG5cbiAgY29uc3Qgb3V0UmVzaGFwZWQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogb3V0fSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogY29udkluZm8ub3V0U2hhcGV9fSk7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ob3V0KTtcblxuICByZXR1cm4gb3V0UmVzaGFwZWQ7XG59XG5cbmV4cG9ydCBjb25zdCBjb252MkRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ29udjJELFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogY29udjJkIGFzIHt9IGFzIEtlcm5lbEZ1bmMsXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgQ29udjJEQmFja3Byb3BGaWx0ZXIsIENvbnYyREJhY2twcm9wRmlsdGVyQXR0cnMsIENvbnYyREJhY2twcm9wRmlsdGVySW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmN9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0NvbnYyRERlckZpbHRlclByb2dyYW19IGZyb20gJy4uL2NvbnZfYmFja3Byb3BfZ3B1JztcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnYyREJhY2twcm9wRmlsdGVyKGFyZ3M6IHtcbiAgaW5wdXRzOiBDb252MkRCYWNrcHJvcEZpbHRlcklucHV0cyxcbiAgYXR0cnM6IENvbnYyREJhY2twcm9wRmlsdGVyQXR0cnMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0xcbn0pIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3gsIGR5fSA9IGlucHV0cztcbiAgY29uc3Qge3N0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGltUm91bmRpbmdNb2RlLCBmaWx0ZXJTaGFwZX0gPSBhdHRycztcblxuICBjb25zdCAkZGF0YUZvcm1hdCA9IGJhY2tlbmRfdXRpbC5jb252ZXJ0Q29udjJERGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcbiAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZUNvbnYyREluZm8oXG4gICAgICB4LnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBmaWx0ZXJTaGFwZSwgc3RyaWRlcyxcbiAgICAgIDEgLyogZGlsYXRpb25zICovLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgZmFsc2UgLyogZGVwdGh3aXNlICovLFxuICAgICAgJGRhdGFGb3JtYXQpO1xuXG4gIGNvbnN0IHByb2dyYW0gPSBuZXcgQ29udjJERGVyRmlsdGVyUHJvZ3JhbShjb252SW5mbyk7XG4gIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeCwgZHldLCAnZmxvYXQzMicpO1xufVxuXG5leHBvcnQgY29uc3QgY29udjJEQmFja3Byb3BGaWx0ZXJDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ29udjJEQmFja3Byb3BGaWx0ZXIsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBjb252MkRCYWNrcHJvcEZpbHRlciBhcyB7fSBhcyBLZXJuZWxGdW5jLFxufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIENvbnYyREJhY2twcm9wSW5wdXQsIENvbnYyREJhY2twcm9wSW5wdXRBdHRycywgQ29udjJEQmFja3Byb3BJbnB1dElucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtDb252MkREZXJJbnB1dFByb2dyYW19IGZyb20gJy4uL2NvbnZfYmFja3Byb3BfZ3B1JztcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnYyREJhY2twcm9wSW5wdXQoYXJnczoge1xuICBpbnB1dHM6IENvbnYyREJhY2twcm9wSW5wdXRJbnB1dHMsXG4gIGF0dHJzOiBDb252MkRCYWNrcHJvcElucHV0QXR0cnMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0xcbn0pIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2R5LCBmaWx0ZXJ9ID0gaW5wdXRzO1xuICBjb25zdCB7aW5wdXRTaGFwZSwgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0LCBkaW1Sb3VuZGluZ01vZGV9ID0gYXR0cnM7XG5cbiAgY29uc3QgJGRhdGFGb3JtYXQgPSBiYWNrZW5kX3V0aWwuY29udmVydENvbnYyRERhdGFGb3JtYXQoZGF0YUZvcm1hdCk7XG4gIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252MkRJbmZvKFxuICAgICAgaW5wdXRTaGFwZSwgZmlsdGVyLnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBzdHJpZGVzLFxuICAgICAgMSAvKiBkaWxhdGlvbnMgKi8sIHBhZCwgZGltUm91bmRpbmdNb2RlLCBmYWxzZSwgJGRhdGFGb3JtYXQpO1xuXG4gIGNvbnN0IHByb2dyYW0gPSBuZXcgQ29udjJERGVySW5wdXRQcm9ncmFtKGNvbnZJbmZvKTtcbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtkeSwgZmlsdGVyXSwgJ2Zsb2F0MzInKTtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbnYyREJhY2twcm9wSW5wdXRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ29udjJEQmFja3Byb3BJbnB1dCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGNvbnYyREJhY2twcm9wSW5wdXQgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtJbTJDb2xQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9pbTJjb2xfcGFja2VkX2dwdSc7XG5pbXBvcnQge21hcEFjdGl2YXRpb25Ub1NoYWRlclByb2dyYW19IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHtNYXRNdWxQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9tdWxtYXRfcGFja2VkX2dwdSc7XG5pbXBvcnQgKiBhcyB3ZWJnbF91dGlsIGZyb20gJy4uL3dlYmdsX3V0aWwnO1xuXG5pbXBvcnQge2JhdGNoTWF0TXVsSW1wbCwgTUFUTVVMX1NIQVJFRF9ESU1fVEhSRVNIT0xEfSBmcm9tICcuL0JhdGNoTWF0TXVsX2ltcGwnO1xuaW1wb3J0IHtpZGVudGl0eX0gZnJvbSAnLi9JZGVudGl0eSc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5cbnR5cGUgQ29udjJEQ29uZmlnID0ge1xuICB4OiBUZW5zb3JJbmZvLFxuICBmaWx0ZXI6IFRlbnNvckluZm8sXG4gIGNvbnZJbmZvOiBiYWNrZW5kX3V0aWwuQ29udjJESW5mbyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYmlhcz86IFRlbnNvckluZm8sXG4gIHByZWx1QWN0aXZhdGlvbldlaWdodHM/OiBUZW5zb3JJbmZvLFxuICBsZWFreXJlbHVBbHBoYT86IG51bWJlcixcbiAgYWN0aXZhdGlvbj86IGJhY2tlbmRfdXRpbC5BY3RpdmF0aW9uXG59O1xuXG4vLyBGb3IgMXgxIGtlcm5lbHMgdGhhdCBpdGVyYXRlIHRocm91Z2ggZXZlcnkgcG9pbnQgaW4gdGhlIGlucHV0LCBjb252b2x1dGlvblxuLy8gY2FuIGJlIGV4cHJlc3NlZCBhcyBtYXRyaXggbXVsdGlwbGljYXRpb24gKHdpdGhvdXQgbmVlZCBmb3IgbWVtb3J5XG4vLyByZW1hcHBpbmcpLlxuZXhwb3J0IGZ1bmN0aW9uIGNvbnYyZEJ5TWF0TXVsKHtcbiAgeCxcbiAgZmlsdGVyLFxuICBjb252SW5mbyxcbiAgYmFja2VuZCxcbiAgYmlhcyA9IG51bGwsXG4gIHByZWx1QWN0aXZhdGlvbldlaWdodHMgPSBudWxsLFxuICBsZWFreXJlbHVBbHBoYSA9IDAsXG4gIGFjdGl2YXRpb24gPSBudWxsXG59OiBDb252MkRDb25maWcpIHtcbiAgLy8gUmVzaGFwZXMgY29udjJEIGlucHV0IHRvIDJEIHRlbnNvcnMsIHVzZXMgbWF0TXVsIGFuZCB0aGVuIHJlc2hhcGUgdGhlXG4gIC8vIHJlc3VsdCBmcm9tIDJEIHRvIDRELlxuICBjb25zdCB4U2hhcGUgPSB4LnNoYXBlO1xuICBjb25zdCB4VGV4RGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQoeC5kYXRhSWQpO1xuICBjb25zdCBzaGFyZWRNYXRNdWxEaW0gPSBjb252SW5mby5pbkNoYW5uZWxzO1xuICBjb25zdCBvdXRlclNoYXBlWCA9IHhTaGFwZVswXSAqIHhTaGFwZVsxXSAqIHhTaGFwZVsyXTtcbiAgY29uc3Qgb3V0ZXJTaGFwZUZpbHRlciA9IGNvbnZJbmZvLm91dENoYW5uZWxzO1xuICBjb25zdCBpc0NoYW5uZWxzTGFzdCA9IGNvbnZJbmZvLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnO1xuICBjb25zdCB0cmFuc3Bvc2VBID0gZmFsc2U7XG4gIGNvbnN0IHRyYW5zcG9zZUIgPSBmYWxzZTtcblxuICBsZXQgb3V0OiBUZW5zb3JJbmZvO1xuICBjb25zdCBpbnRlcm1lZGlhdGVzOiBUZW5zb3JJbmZvW10gPSBbXTtcblxuICAvLyBUT0RPOiBPbmNlIHJlZHVjdGlvbiBvcHMgYXJlIHBhY2tlZCwgYmF0Y2hNYXRNdWwgd2lsbCBhbHdheXMgYmUgcGFja2VkXG4gIC8vIGFuZCB3ZSBjYW4gcmVtb3ZlIHRoaXMgY29uZGl0aW9uLlxuICBjb25zdCBiYXRjaE1hdE11bFdpbGxCZVVucGFja2VkID1cbiAgICAgIChvdXRlclNoYXBlWCA9PT0gMSB8fCBvdXRlclNoYXBlRmlsdGVyID09PSAxKSAmJlxuICAgICAgc2hhcmVkTWF0TXVsRGltID4gTUFUTVVMX1NIQVJFRF9ESU1fVEhSRVNIT0xEO1xuXG4gIC8vIFRoZSBhbGdvcml0aG0gaW4gdGhlIGlmIGNvbmRpdGlvbiBhc3N1bWVzICgxKSB0aGUgb3V0cHV0IHdpbGwgYmUgcGFja2VkLFxuICAvLyAoMikgeCBpcyBwYWNrZWQsICgzKSB4IGlzQ2hhbm5lbHNMYXN0LCAoNCkgIHgncyBwYWNrZWQgdGV4dHVyZSBpcyBhbHJlYWR5XG4gIC8vIG9uIEdQVSwgKDUpIGNvbCBpcyBvZGQsICg2KSB0aGUgd2lkdGgsIGhlaWdodCBhbmQgaW5DaGFubmVscyBhcmUgdGhlIHNhbWVcbiAgLy8gZm9yIHhUZXhEYXRhLnNoYXBlIGFuZCB4U2hhcGUuXG4gIGNvbnN0IGNhbk9wdGltaXplID0gIWJhdGNoTWF0TXVsV2lsbEJlVW5wYWNrZWQgJiYgeFRleERhdGEuaXNQYWNrZWQgJiZcbiAgICAgIGlzQ2hhbm5lbHNMYXN0ICYmIHhUZXhEYXRhLnRleHR1cmUgIT0gbnVsbCAmJiB4U2hhcGVbMl0gJSAyICE9PSAwICYmXG4gICAgICB1dGlsLmFycmF5c0VxdWFsKHhUZXhEYXRhLnNoYXBlLnNsaWNlKC0zKSwgeFNoYXBlLnNsaWNlKC0zKSk7XG5cbiAgaWYgKGNhbk9wdGltaXplKSB7XG4gICAgLy8gV2UgYXZvaWQgZXhwZW5zaXZlIHBhY2tlZCAyeDIgcmVzaGFwZSBieSBwYWRkaW5nIGNvbCBjb3VudCB0byBuZXh0LFxuICAgIC8vIGV2ZW4gbnVtYmVyLiBXaGVuIGNvbCBpcyBvZGQsIHRoZSByZXN1bHQgb2YgcGFja2VkIGJhdGNoTWF0TXVsIGlzXG4gICAgLy8gdGhlIHNhbWUgKGhhcyB0aGUgc2FtZSB0ZXh0dXJlIGxheW91dCBhbmQgYW5kIHZhbHVlcyBpbiB0aGUgdGV4dHVyZSkgYXNcbiAgICAvLyBpdCBpcyBmb3IgbmV4dCBldmVuIGNvbC4gV2UgbWFrZSB0aGUgb2RkLWNvbHMgdGVuc29yIHRvIGxvb2sgbGlrZVxuICAgIC8vIGV2ZW4tY29scyB0ZW5zb3IgYmVmb3JlIHRoZSBvcGVyYXRpb24gYW5kLCBhZnRlciB0aGUgYmF0Y2hNYXRNdWwsXG4gICAgLy8gZml4IHRoZSBldmVuLWNvbHMgcmVzdWx0IHRvIGhhdmUgb2RkIG51bWJlciBvZiBjb2xzLlxuICAgIGNvbnN0IHRhcmdldFNoYXBlID0geFNoYXBlWzBdICogeFNoYXBlWzFdICogKHhTaGFwZVsyXSArIDEpO1xuICAgIGNvbnN0IHhSZXNoYXBlZDogVGVuc29ySW5mbyA9IHtcbiAgICAgIGRhdGFJZDogeC5kYXRhSWQsXG4gICAgICBzaGFwZTogWzEsIHRhcmdldFNoYXBlLCBjb252SW5mby5pbkNoYW5uZWxzXSxcbiAgICAgIGR0eXBlOiB4LmR0eXBlXG4gICAgfTtcbiAgICAvLyB4VGV4RGF0YS5zaGFwZSBnZXRzIHJlZmVyZW5jZWQgZnJvbSBHUEdQVUJpbmFyeS5pblNoYXBlSW5mb3MuXG4gICAgLy8gRGVjcmVtZW50aW5nIGNvbCBjb3VudCwgYWZ0ZXIgYmF0Y2hNYXRNdWwtPi4uLi0+Y29tcGlsZVByb2dyYW0gbGVhZHMgdG9cbiAgICAvLyBpbnZhbGlkIGNvbCBjb3VudCB3aXRoaW4gdGhlIHJlZmVyZW5jZSBpbiBHUEdQVUJpbmFyeS5pblNoYXBlSW5mb3MuXG4gICAgLy8gQWx0ZXJuYXRpdmUgZml4IHdvdWxkIGJlIHRvIHByb3ZpZGUgYSBjb3B5IHRvIEdQR1BVQmluYXJ5LmluU2hhcGVJbmZvc1xuICAgIC8vIGluIGNvbXBpbGVQcm9ncmFtIG1ldGhvZCwgYnV0IHRoYXQgd291bGQgYWZmZWN0IGNvbXBpbGF0aW9uIG9mIGFsbFxuICAgIC8vIHByb2dyYW1zIC0gaW5zdGVhZCwgcHJvdmlkZSBhIGNvcHkgaGVyZSwgd2l0aCBldmVuIGNvbCBjb3VudCwgYmVmb3JlXG4gICAgLy8gY2FsbGluZyBiYXRjaE1hdE11bC0+Li4uLT5jb21waWxlUHJvZ3JhbSBhbmQgYWZ0ZXIgdGhhdCwgdGhlIG9yaWdpbmFsXG4gICAgLy8geFRleERhdGEuc2hhcGUgaXMgcmVzdG9yZWQuXG4gICAgY29uc3Qgb3JpZ2luYWxYVGV4RGF0YVNoYXBlID0geFRleERhdGEuc2hhcGU7XG4gICAgeFRleERhdGEuc2hhcGUgPSB4VGV4RGF0YS5zaGFwZS5zbGljZSgpO1xuICAgIHhUZXhEYXRhLnNoYXBlW3hUZXhEYXRhLnNoYXBlLmxlbmd0aCAtIDJdKys7XG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIHdlYmdsX3V0aWwuaXNSZXNoYXBlRnJlZSh4VGV4RGF0YS5zaGFwZSwgeFJlc2hhcGVkLnNoYXBlKSxcbiAgICAgICAgKCkgPT4gYHBhY2tlZCByZXNoYXBlICR7eFRleERhdGEuc2hhcGV9IHRvICR7XG4gICAgICAgICAgICB4UmVzaGFwZWQuc2hhcGV9IGlzbid0IGZyZWVgKTtcbiAgICBjb25zdCBmaWx0ZXJSZXNoYXBlZCA9IHJlc2hhcGUoe1xuICAgICAgaW5wdXRzOiB7eDogZmlsdGVyfSxcbiAgICAgIGJhY2tlbmQsXG4gICAgICBhdHRyczoge3NoYXBlOiBbMSwgY29udkluZm8uaW5DaGFubmVscywgY29udkluZm8ub3V0Q2hhbm5lbHNdfVxuICAgIH0pO1xuICAgIGludGVybWVkaWF0ZXMucHVzaChmaWx0ZXJSZXNoYXBlZCk7XG4gICAgY29uc3QgcG9pbnR3aXNlQ29udiA9IGJhdGNoTWF0TXVsSW1wbCh7XG4gICAgICBhOiB4UmVzaGFwZWQsXG4gICAgICBiOiBmaWx0ZXJSZXNoYXBlZCxcbiAgICAgIGJhY2tlbmQsXG4gICAgICB0cmFuc3Bvc2VBLFxuICAgICAgdHJhbnNwb3NlQixcbiAgICAgIGJpYXMsXG4gICAgICBhY3RpdmF0aW9uLFxuICAgICAgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyxcbiAgICAgIGxlYWt5cmVsdUFscGhhXG4gICAgfSk7XG5cbiAgICBjb25zdCBwb2ludHdpc2VDb252VGV4RGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQocG9pbnR3aXNlQ29udi5kYXRhSWQpO1xuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICBwb2ludHdpc2VDb252VGV4RGF0YS5pc1BhY2tlZCxcbiAgICAgICAgKCkgPT4gJ2JhdGNoTWF0TXVsIHJlc3VsdCBpcyBleHBlY3RlZCB0byBiZSBwYWNrZWQnKTtcbiAgICAvLyBSZXN0b3JlIHRoZSBpbnB1dCBzaGFwZSB0byBvcmlnaW5hbC5cbiAgICB4VGV4RGF0YS5zaGFwZSA9IG9yaWdpbmFsWFRleERhdGFTaGFwZTtcbiAgICAvLyBTZXQgdGhlIG91dHB1dCBzaGFwZSAtIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGV4cGVuc2l2ZSByZXNoYXBlIGFzIGRhdGFcbiAgICAvLyBsYXlvdXQgaXMgYWxyZWFkeSBjb3JyZWN0LlxuICAgIHBvaW50d2lzZUNvbnZUZXhEYXRhLnNoYXBlID0gY29udkluZm8ub3V0U2hhcGU7XG5cbiAgICBvdXQgPSBpZGVudGl0eSh7aW5wdXRzOiB7eDogcG9pbnR3aXNlQ29udn0sIGJhY2tlbmR9KTtcbiAgICBvdXQuc2hhcGUgPSBjb252SW5mby5vdXRTaGFwZTtcblxuICAgIGludGVybWVkaWF0ZXMucHVzaChwb2ludHdpc2VDb252KTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB0YXJnZXRTaGFwZSA9IGlzQ2hhbm5lbHNMYXN0ID8geFNoYXBlWzBdICogeFNoYXBlWzFdICogeFNoYXBlWzJdIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFNoYXBlWzBdICogeFNoYXBlWzJdICogeFNoYXBlWzNdO1xuICAgIGNvbnN0IHhSZXNoYXBlZCA9IHJlc2hhcGUoe1xuICAgICAgaW5wdXRzOiB7eH0sXG4gICAgICBiYWNrZW5kLFxuICAgICAgYXR0cnM6IHtzaGFwZTogWzEsIHRhcmdldFNoYXBlLCBjb252SW5mby5pbkNoYW5uZWxzXX1cbiAgICB9KTtcbiAgICBjb25zdCBmaWx0ZXJSZXNoYXBlZCA9IHJlc2hhcGUoe1xuICAgICAgaW5wdXRzOiB7eDogZmlsdGVyfSxcbiAgICAgIGJhY2tlbmQsXG4gICAgICBhdHRyczoge3NoYXBlOiBbMSwgY29udkluZm8uaW5DaGFubmVscywgY29udkluZm8ub3V0Q2hhbm5lbHNdfVxuICAgIH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGJhdGNoTWF0TXVsSW1wbCh7XG4gICAgICBhOiB4UmVzaGFwZWQsXG4gICAgICBiOiBmaWx0ZXJSZXNoYXBlZCxcbiAgICAgIHRyYW5zcG9zZUEsXG4gICAgICB0cmFuc3Bvc2VCLFxuICAgICAgYmFja2VuZCxcbiAgICAgIGJpYXMsXG4gICAgICBhY3RpdmF0aW9uLFxuICAgICAgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyxcbiAgICAgIGxlYWt5cmVsdUFscGhhXG4gICAgfSk7XG5cbiAgICBvdXQgPSByZXNoYXBlKFxuICAgICAgICB7aW5wdXRzOiB7eDogcmVzdWx0fSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogY29udkluZm8ub3V0U2hhcGV9fSk7XG5cbiAgICBpbnRlcm1lZGlhdGVzLnB1c2goeFJlc2hhcGVkKTtcbiAgICBpbnRlcm1lZGlhdGVzLnB1c2goZmlsdGVyUmVzaGFwZWQpO1xuICAgIGludGVybWVkaWF0ZXMucHVzaChyZXN1bHQpO1xuICB9XG5cbiAgZm9yIChjb25zdCBpIG9mIGludGVybWVkaWF0ZXMpIHtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGkpO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cblxuLy8gSW1wbGVtZW50cyB0aGUgaW0ycm93IGFsZ29yaXRobSBhcyBvdXRsaW5lZCBpbiBcIkhpZ2ggUGVyZm9ybWFuY2Vcbi8vIENvbnZvbHV0aW9uYWwgTmV1cmFsIE5ldHdvcmtzIGZvciBEb2N1bWVudCBQcm9jZXNzaW5nXCIgKFN1dmlzb2Z0LCAyMDA2KVxuZXhwb3J0IGZ1bmN0aW9uIGNvbnYyZFdpdGhJbTJSb3coe1xuICB4LFxuICBmaWx0ZXIsXG4gIGNvbnZJbmZvLFxuICBiYWNrZW5kLFxuICBiaWFzID0gbnVsbCxcbiAgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyA9IG51bGwsXG4gIGxlYWt5cmVsdUFscGhhID0gMCxcbiAgYWN0aXZhdGlvbiA9IG51bGxcbn06IENvbnYyRENvbmZpZykge1xuICAvLyBSZWFycmFuZ2VzIGNvbnYyZCBpbnB1dCBzbyBlYWNoIGJsb2NrIHRvIGJlIGNvbnZvbHZlZCBvdmVyIGZvcm1zIHRoZVxuICAvLyBjb2x1bW4gb2YgYSBuZXcgbWF0cml4IHdpdGggc2hhcGUgW2ZpbHRlcldpZHRoICogZmlsdGVySGVpZ2h0ICpcbiAgLy8gaW5DaGFubmVscywgb3V0SGVpZ2h0ICogb3V0V2lkdGhdLiBUaGUgZmlsdGVyIGlzIGFsc28gcmVhcnJhbmdlZCBzbyBlYWNoXG4gIC8vIG91dHB1dCBjaGFubmVsIGZvcm1zIGEgcm93IG9mIGEgbmV3IG1hdHJpeCB3aXRoIHNoYXBlIFtvdXRDaGFubmVscyxcbiAgLy8gZmlsdGVyV2lkdGggKiBmaWx0ZXJIZWlnaHQgKiBpbkNoYW5uZWxzXS4gVGhlIGNvbnZvbHV0aW9uIGlzIHRoZW5cbiAgLy8gY29tcHV0ZWQgYnkgbXVsdGlwbHlpbmcgdGhlc2UgbWF0cmljZXMgYW5kIHJlc2hhcGluZyB0aGUgcmVzdWx0LlxuICBjb25zdCB7XG4gICAgZmlsdGVyV2lkdGgsXG4gICAgZmlsdGVySGVpZ2h0LFxuICAgIGluQ2hhbm5lbHMsXG4gICAgb3V0V2lkdGgsXG4gICAgb3V0SGVpZ2h0LFxuICAgIGRhdGFGb3JtYXRcbiAgfSA9IGNvbnZJbmZvO1xuXG4gIGNvbnN0IGlzQ2hhbm5lbHNMYXN0ID0gZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzTGFzdCc7XG5cbiAgY29uc3Qgc2hhcmVkRGltID0gZmlsdGVyV2lkdGggKiBmaWx0ZXJIZWlnaHQgKiBpbkNoYW5uZWxzO1xuICBjb25zdCBudW1Db2xzID0gb3V0SGVpZ2h0ICogb3V0V2lkdGg7XG4gIGNvbnN0IHgyQ29sU2hhcGUgPSBbc2hhcmVkRGltLCBudW1Db2xzXTtcbiAgY29uc3QgdHJhbnNwb3NlQSA9IHRydWU7XG4gIGNvbnN0IHRyYW5zcG9zZUIgPSBmYWxzZTtcblxuICBjb25zdCBpbnRlcm1lZGlhdGVzOiBUZW5zb3JJbmZvW10gPSBbXTtcblxuICBjb25zdCB4U3F1ZWV6ZWQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IHguc2hhcGUuc2xpY2UoMSl9fSk7XG4gIGNvbnN0IHcyUm93ID0gcmVzaGFwZSh7XG4gICAgaW5wdXRzOiB7eDogZmlsdGVyfSxcbiAgICBiYWNrZW5kLFxuICAgIGF0dHJzOiB7c2hhcGU6IFsxLCBzaGFyZWREaW0sIHV0aWwuc2l6ZUZyb21TaGFwZShmaWx0ZXIuc2hhcGUpIC8gc2hhcmVkRGltXX1cbiAgfSk7XG5cbiAgaW50ZXJtZWRpYXRlcy5wdXNoKHhTcXVlZXplZCk7XG4gIGludGVybWVkaWF0ZXMucHVzaCh3MlJvdyk7XG5cbiAgY29uc3QgaW0yQ29sUHJvZ3JhbSA9IG5ldyBJbTJDb2xQYWNrZWRQcm9ncmFtKHgyQ29sU2hhcGUsIGNvbnZJbmZvKTtcbiAgY29uc3QgY3VzdG9tVmFsdWVzID0gW1xuICAgIHhTcXVlZXplZC5zaGFwZSwgW2NvbnZJbmZvLnBhZEluZm8udG9wLCBjb252SW5mby5wYWRJbmZvLmxlZnRdLFxuICAgIFtjb252SW5mby5zdHJpZGVIZWlnaHQsIGNvbnZJbmZvLnN0cmlkZVdpZHRoXSxcbiAgICBbY29udkluZm8uZGlsYXRpb25IZWlnaHQsIGNvbnZJbmZvLmRpbGF0aW9uV2lkdGhdLCBbY29udkluZm8uaW5DaGFubmVsc10sXG4gICAgW2NvbnZJbmZvLmZpbHRlcldpZHRoICogY29udkluZm8uaW5DaGFubmVsc10sIFtjb252SW5mby5vdXRXaWR0aF1cbiAgXTtcbiAgY29uc3QgaW0yQ29sID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0oXG4gICAgICBpbTJDb2xQcm9ncmFtLCBbeFNxdWVlemVkXSwgJ2Zsb2F0MzInLCBjdXN0b21WYWx1ZXMpO1xuICBjb25zdCBpbTJDb2xSZXNoYXBlZCA9IHJlc2hhcGUoe1xuICAgIGlucHV0czoge3g6IGltMkNvbH0sXG4gICAgYmFja2VuZCxcbiAgICBhdHRyczoge3NoYXBlOiBbMSwgeDJDb2xTaGFwZVswXSwgeDJDb2xTaGFwZVsxXV19XG4gIH0pO1xuXG4gIGludGVybWVkaWF0ZXMucHVzaChpbTJDb2wpO1xuICBpbnRlcm1lZGlhdGVzLnB1c2goaW0yQ29sUmVzaGFwZWQpO1xuXG4gIGNvbnN0IGhhc0JpYXMgPSBiaWFzICE9IG51bGw7XG4gIGNvbnN0IGhhc1ByZWx1QWN0aXZhdGlvbldlaWdodHMgPSBwcmVsdUFjdGl2YXRpb25XZWlnaHRzICE9IG51bGw7XG4gIGNvbnN0IGhhc0xlYWt5cmVsdUFscGhhID0gYWN0aXZhdGlvbiA9PT0gJ2xlYWt5cmVsdSc7XG4gIGNvbnN0IGZ1c2VkQWN0aXZhdGlvbiA9XG4gICAgICBhY3RpdmF0aW9uID8gbWFwQWN0aXZhdGlvblRvU2hhZGVyUHJvZ3JhbShhY3RpdmF0aW9uLCB0cnVlKSA6IG51bGw7XG4gIGNvbnN0IG1hdG11bFByb2dyYW0gPSBuZXcgTWF0TXVsUGFja2VkUHJvZ3JhbShcbiAgICAgIGltMkNvbFJlc2hhcGVkLnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgIHcyUm93LnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgIFsxLCBudW1Db2xzLCBjb252SW5mby5vdXRDaGFubmVsc10sIHRyYW5zcG9zZUEsIHRyYW5zcG9zZUIsIGhhc0JpYXMsXG4gICAgICBmdXNlZEFjdGl2YXRpb24sIGhhc1ByZWx1QWN0aXZhdGlvbldlaWdodHMsIGhhc0xlYWt5cmVsdUFscGhhKTtcbiAgY29uc3QgaW5wdXRzOiBUZW5zb3JJbmZvW10gPSBbaW0yQ29sUmVzaGFwZWQsIHcyUm93XTtcbiAgaWYgKGJpYXMpIHtcbiAgICBpbnB1dHMucHVzaChiaWFzKTtcbiAgfVxuICBpZiAoaGFzUHJlbHVBY3RpdmF0aW9uV2VpZ2h0cykge1xuICAgIGlucHV0cy5wdXNoKHByZWx1QWN0aXZhdGlvbldlaWdodHMpO1xuICB9XG4gIGlmIChoYXNMZWFreXJlbHVBbHBoYSkge1xuICAgIGNvbnN0ICRsZWFreXJlbHVBbHBoYSA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8oXG4gICAgICAgIFtdLCAnZmxvYXQzMicsXG4gICAgICAgIHV0aWwuY3JlYXRlU2NhbGFyVmFsdWUobGVha3lyZWx1QWxwaGEgYXMge30gYXMgJ2Zsb2F0MzInLCAnZmxvYXQzMicpKTtcbiAgICBpbnB1dHMucHVzaCgkbGVha3lyZWx1QWxwaGEpO1xuICAgIGludGVybWVkaWF0ZXMucHVzaCgkbGVha3lyZWx1QWxwaGEpO1xuICB9XG4gIGNvbnN0IHByb2R1Y3QgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShtYXRtdWxQcm9ncmFtLCBpbnB1dHMsICdmbG9hdDMyJyk7XG5cbiAgY29uc3Qgb3V0U2hhcGUgPSBpc0NoYW5uZWxzTGFzdCA/XG4gICAgICBbMSwgb3V0SGVpZ2h0LCBvdXRXaWR0aCwgY29udkluZm8ub3V0Q2hhbm5lbHNdIDpcbiAgICAgIFsxLCBjb252SW5mby5vdXRDaGFubmVscywgb3V0SGVpZ2h0LCBvdXRXaWR0aF07XG4gIGNvbnN0IG91dCA9XG4gICAgICByZXNoYXBlKHtpbnB1dHM6IHt4OiBwcm9kdWN0fSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogb3V0U2hhcGV9fSk7XG5cbiAgaW50ZXJtZWRpYXRlcy5wdXNoKHByb2R1Y3QpO1xuICBmb3IgKGNvbnN0IGkgb2YgaW50ZXJtZWRpYXRlcykge1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaSk7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgQ29udjNELCBDb252M0RBdHRycywgQ29udjNESW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmN9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0NvbnYzRFByb2dyYW19IGZyb20gJy4uL2NvbnZfZ3B1JztcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnYzRChcbiAgICBhcmdzOlxuICAgICAgICB7aW5wdXRzOiBDb252M0RJbnB1dHMsIGF0dHJzOiBDb252M0RBdHRycywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTH0pIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3gsIGZpbHRlcn0gPSBpbnB1dHM7XG4gIGNvbnN0IHtzdHJpZGVzLCBwYWQsIGRpbGF0aW9uc30gPSBhdHRycztcblxuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjNESW5mbyhcbiAgICAgIHguc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgIGZpbHRlci5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBzdHJpZGVzLFxuICAgICAgZGlsYXRpb25zLCBwYWQpO1xuXG4gIGNvbnN0IHByb2dyYW0gPSBuZXcgQ29udjNEUHJvZ3JhbShjb252SW5mbyk7XG4gIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeCwgZmlsdGVyXSwgJ2Zsb2F0MzInKTtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbnYzRENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBDb252M0QsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBjb252M0QgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBDb252M0RCYWNrcHJvcEZpbHRlclYyLCBDb252M0RCYWNrcHJvcEZpbHRlclYyQXR0cnMsIENvbnYzREJhY2twcm9wRmlsdGVyVjJJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuY30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7Q29udjNERGVyRmlsdGVyUHJvZ3JhbX0gZnJvbSAnLi4vY29udl9iYWNrcHJvcF9ncHUnO1xuXG5leHBvcnQgZnVuY3Rpb24gY29udjNEQmFja3Byb3BGaWx0ZXJWMihhcmdzOiB7XG4gIGlucHV0czogQ29udjNEQmFja3Byb3BGaWx0ZXJWMklucHV0cyxcbiAgYXR0cnM6IENvbnYzREJhY2twcm9wRmlsdGVyVjJBdHRycyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTFxufSkge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eCwgZHl9ID0gaW5wdXRzO1xuICBjb25zdCB7c3RyaWRlcywgcGFkLCBmaWx0ZXJTaGFwZX0gPSBhdHRycztcblxuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjNESW5mbyhcbiAgICAgIHguc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgZmlsdGVyU2hhcGUsIHN0cmlkZXMsXG4gICAgICAxIC8qIGRpbGF0aW9ucyAqLywgcGFkKTtcblxuICBjb25zdCBwcm9ncmFtID0gbmV3IENvbnYzRERlckZpbHRlclByb2dyYW0oY29udkluZm8pO1xuICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3gsIGR5XSwgJ2Zsb2F0MzInKTtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbnYzREJhY2twcm9wRmlsdGVyVjJDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ29udjNEQmFja3Byb3BGaWx0ZXJWMixcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGNvbnYzREJhY2twcm9wRmlsdGVyVjIgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIENvbnYzREJhY2twcm9wSW5wdXRWMiwgQ29udjNEQmFja3Byb3BJbnB1dFYyQXR0cnMsIENvbnYzREJhY2twcm9wSW5wdXRWMklucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtDb252M0REZXJJbnB1dFByb2dyYW19IGZyb20gJy4uL2NvbnZfYmFja3Byb3BfZ3B1JztcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnYzREJhY2twcm9wSW5wdXQoYXJnczoge1xuICBpbnB1dHM6IENvbnYzREJhY2twcm9wSW5wdXRWMklucHV0cyxcbiAgYXR0cnM6IENvbnYzREJhY2twcm9wSW5wdXRWMkF0dHJzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMXG59KSB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtkeSwgZmlsdGVyfSA9IGlucHV0cztcbiAgY29uc3Qge3BhZCwgc3RyaWRlcywgaW5wdXRTaGFwZX0gPSBhdHRycztcblxuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjNESW5mbyhcbiAgICAgIGlucHV0U2hhcGUsIGZpbHRlci5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICAgICAgc3RyaWRlcywgMSAvKiBkaWxhdGlvbnMgKi8sIHBhZCk7XG5cbiAgY29uc3QgcHJvZ3JhbSA9IG5ldyBDb252M0REZXJJbnB1dFByb2dyYW0oY29udkluZm8pO1xuICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW2R5LCBmaWx0ZXJdLCAnZmxvYXQzMicpO1xufVxuXG5leHBvcnQgY29uc3QgY29udjNEQmFja3Byb3BJbnB1dENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBDb252M0RCYWNrcHJvcElucHV0VjIsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBjb252M0RCYWNrcHJvcElucHV0IGFzIHt9IGFzIEtlcm5lbEZ1bmMsXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0NvcywgS2VybmVsQ29uZmlnfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge0NIRUNLX05BTl9TTklQUEVUX1VOQVJZLCB1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuXG5jb25zdCBDT1MgPSBDSEVDS19OQU5fU05JUFBFVF9VTkFSWSArIGBcbiAgcmV0dXJuIGNvcyh4KTtcbmA7XG5cbmV4cG9ydCBjb25zdCBjb3MgPSB1bmFyeUtlcm5lbEZ1bmMoe29wU25pcHBldDogQ09TfSk7XG5cbmV4cG9ydCBjb25zdCBjb3NDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ29zLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogY29zLFxufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtDb3NoLCBLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge3VuYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5cbmNvbnN0IENPU0ggPSBgXG4gIGZsb2F0IGUyeCA9IGV4cCgteCk7XG4gIHJldHVybiAoZTJ4ICsgMS4wIC8gZTJ4KSAvIDIuMDtcbmA7XG5cbmV4cG9ydCBjb25zdCBjb3NoID0gdW5hcnlLZXJuZWxGdW5jKHtvcFNuaXBwZXQ6IENPU0h9KTtcblxuZXhwb3J0IGNvbnN0IGNvc2hDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ29zaCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGNvc2gsXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0Nyb3BBbmRSZXNpemUsIENyb3BBbmRSZXNpemVBdHRycywgQ3JvcEFuZFJlc2l6ZUlucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtDcm9wQW5kUmVzaXplUHJvZ3JhbX0gZnJvbSAnLi4vY3JvcF9hbmRfcmVzaXplX2dwdSc7XG5cbmV4cG9ydCBjb25zdCBjcm9wQW5kUmVzaXplID0gKGFyZ3M6IHtcbiAgaW5wdXRzOiBDcm9wQW5kUmVzaXplSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogQ3JvcEFuZFJlc2l6ZUF0dHJzXG59KTogVGVuc29ySW5mbyA9PiB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtpbWFnZSwgYm94ZXMsIGJveEluZH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtjcm9wU2l6ZSwgbWV0aG9kLCBleHRyYXBvbGF0aW9uVmFsdWV9ID0gYXR0cnM7XG5cbiAgY29uc3QgcHJvZ3JhbSA9IG5ldyBDcm9wQW5kUmVzaXplUHJvZ3JhbShcbiAgICAgIGltYWdlLnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICAgICAgYm94ZXMuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyXSwgY3JvcFNpemUsIG1ldGhvZCwgZXh0cmFwb2xhdGlvblZhbHVlKTtcbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtpbWFnZSwgYm94ZXMsIGJveEluZF0sICdmbG9hdDMyJyk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JvcEFuZFJlc2l6ZUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBDcm9wQW5kUmVzaXplLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogY3JvcEFuZFJlc2l6ZSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgQ3Vtc3VtLCBDdW1zdW1BdHRycywgQ3Vtc3VtSW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0N1bVN1bVByb2dyYW19IGZyb20gJy4uL2N1bXN1bV9ncHUnO1xuXG5pbXBvcnQge2lkZW50aXR5fSBmcm9tICcuL0lkZW50aXR5JztcbmltcG9ydCB7dHJhbnNwb3NlfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjdW1zdW0oXG4gICAgYXJnczpcbiAgICAgICAge2lucHV0czogQ3Vtc3VtSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLCBhdHRyczogQ3Vtc3VtQXR0cnN9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7YXhpcywgZXhjbHVzaXZlLCByZXZlcnNlfSA9IGF0dHJzO1xuXG4gIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG4gIGNvbnN0IHBlcm11dGF0aW9uID0gYmFja2VuZF91dGlsLmdldEF4ZXNQZXJtdXRhdGlvbihbYXhpc10sIHhSYW5rKTtcbiAgbGV0IHBlcm11dGVkWCA9IHg7XG4gIGlmIChwZXJtdXRhdGlvbiAhPSBudWxsKSB7XG4gICAgcGVybXV0ZWRYID0gdHJhbnNwb3NlKHtpbnB1dHM6IHt4fSwgYmFja2VuZCwgYXR0cnM6IHtwZXJtOiBwZXJtdXRhdGlvbn19KTtcbiAgfVxuICBjb25zdCBwZXJtdXRlZEF4aXMgPSBiYWNrZW5kX3V0aWwuZ2V0SW5uZXJNb3N0QXhlcygxLCB4UmFuaylbMF07XG5cbiAgaWYgKHBlcm11dGVkQXhpcyAhPT0geFJhbmsgLSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgV2ViR0wgY3Vtc3VtIHNoYWRlciBleHBlY3RzIGFuIGlubmVyLW1vc3QgYXhpcz0ke1xuICAgICAgICAgICAgeC5zaGFwZS5sZW5ndGggLSAxfSBgICtcbiAgICAgICAgYGJ1dCBnb3QgYXhpcz0ke2F4aXN9YCk7XG4gIH1cbiAgY29uc3Qgc2l6ZSA9IHBlcm11dGVkWC5zaGFwZVtwZXJtdXRlZEF4aXNdO1xuICBsZXQgcmVzdWx0ID0gaWRlbnRpdHkoe2lucHV0czoge3g6IHBlcm11dGVkWH0sIGJhY2tlbmR9KTtcbiAgLy8gVXNlIGN1bXN1bSBwYXJhbGxlbCBhbGdvcml0aG0sIHJlZjpcbiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubnZpZGlhLmNvbS9ncHVnZW1zL2dwdWdlbXMzL3BhcnQtdmktZ3B1LWNvbXB1dGluZy9jaGFwdGVyLTM5LXBhcmFsbGVsLXByZWZpeC1zdW0tc2Nhbi1jdWRhXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPD0gTWF0aC5jZWlsKE1hdGgubG9nMihzaXplKSkgLSAxOyBpKyspIHtcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IEN1bVN1bVByb2dyYW0ocGVybXV0ZWRYLnNoYXBlLCBmYWxzZSwgcmV2ZXJzZSk7XG4gICAgY29uc3QgY3VzdG9tVmFsdWVzID0gW1tpXV07XG4gICAgY29uc3QgcHJldlJlc3VsdCA9IHJlc3VsdDtcbiAgICByZXN1bHQgPVxuICAgICAgICBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbcmVzdWx0XSwgcmVzdWx0LmR0eXBlLCBjdXN0b21WYWx1ZXMpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocHJldlJlc3VsdCk7XG4gIH1cbiAgLy8gRm9yIGV4Y2x1c2l2ZSBjdW1zdW0sIHNoaWZ0IHRoZSBlbmQgcmVzdWx0IGluIHRoZSBkaXJlY3Rpb24gb2Ygc3VtXG4gIC8vIGFuZCBhZGQgMCB0byB0aGUgZnJvbnQgaW5kZXguXG4gIGlmIChleGNsdXNpdmUpIHtcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IEN1bVN1bVByb2dyYW0ocGVybXV0ZWRYLnNoYXBlLCBleGNsdXNpdmUsIHJldmVyc2UpO1xuICAgIGNvbnN0IHByZXZSZXN1bHQgPSByZXN1bHQ7XG4gICAgcmVzdWx0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3Jlc3VsdF0sIHJlc3VsdC5kdHlwZSk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhwcmV2UmVzdWx0KTtcbiAgfVxuXG4gIGlmIChwZXJtdXRhdGlvbiAhPSBudWxsKSB7XG4gICAgY29uc3QgcmV2ZXJzZVBlcm11dGF0aW9uID0gYmFja2VuZF91dGlsLmdldFVuZG9BeGVzUGVybXV0YXRpb24ocGVybXV0YXRpb24pO1xuICAgIGNvbnN0IHJldmVyc2VUcmFuc3Bvc2VkUmVzdWx0ID0gdHJhbnNwb3NlKFxuICAgICAgICB7aW5wdXRzOiB7eDogcmVzdWx0fSwgYmFja2VuZCwgYXR0cnM6IHtwZXJtOiByZXZlcnNlUGVybXV0YXRpb259fSk7XG5cbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc3VsdCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhwZXJtdXRlZFgpO1xuXG4gICAgcmV0dXJuIHJldmVyc2VUcmFuc3Bvc2VkUmVzdWx0O1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGNvbnN0IGN1bXN1bUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBDdW1zdW0sXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBjdW1zdW0gYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtEZW5zZUJpbmNvdW50LCBEZW5zZUJpbmNvdW50QXR0cnMsIERlbnNlQmluY291bnRJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgVHlwZWRBcnJheX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7YmluY291bnRJbXBsQ1BVLCBiaW5jb3VudFJlZHVjZUltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5leHBvcnQgZnVuY3Rpb24gZGVuc2VCaW5jb3VudChhcmdzOiB7XG4gIGlucHV0czogRGVuc2VCaW5jb3VudElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IERlbnNlQmluY291bnRBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eCwgd2VpZ2h0c30gPSBpbnB1dHM7XG4gIGNvbnN0IHtzaXplLCBiaW5hcnlPdXRwdXR9ID0gYXR0cnM7XG5cbiAgaWYgKHguc2hhcGUubGVuZ3RoID09PSAxKSB7XG4gICAgY29uc3QgeFZhbHMgPSBiYWNrZW5kLnJlYWRTeW5jKHguZGF0YUlkKSBhcyBUeXBlZEFycmF5O1xuICAgIGNvbnN0IHdlaWdodHNWYWxzID0gYmFja2VuZC5yZWFkU3luYyh3ZWlnaHRzLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcblxuICAgIGNvbnN0IG91dFZhbHMgPVxuICAgICAgICBiaW5jb3VudEltcGxDUFUoeFZhbHMsIHdlaWdodHNWYWxzLCB3ZWlnaHRzLmR0eXBlLCB3ZWlnaHRzLnNoYXBlLCBzaXplKTtcblxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtzaXplXSwgd2VpZ2h0cy5kdHlwZSwgb3V0VmFscyk7XG4gIH0gZWxzZSBpZiAoeC5zaGFwZS5sZW5ndGggPT09IDIpIHtcbiAgICBjb25zdCB4QnVmID0gYmFja2VuZC5idWZmZXJTeW5jKHgpO1xuICAgIGNvbnN0IHdlaWdodHNCdWYgPSBiYWNrZW5kLmJ1ZmZlclN5bmMod2VpZ2h0cyk7XG5cbiAgICBjb25zdCBvdXRCdWYgPSBiaW5jb3VudFJlZHVjZUltcGxDUFUoeEJ1Ziwgd2VpZ2h0c0J1Ziwgc2l6ZSwgYmluYXJ5T3V0cHV0KTtcblxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dEJ1Zi5zaGFwZSwgd2VpZ2h0cy5kdHlwZSwgb3V0QnVmLnZhbHVlcyk7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRXJyb3IgaW4gZGVuc2VCaW5jb3VudDogaW5wdXQgbXVzdCBiZSBhdCBtb3N0IHJhbmsgMiwgYnV0IGdvdCByYW5rYCArXG4gICAgICBgJHt4LnNoYXBlLmxlbmd0aH0uYCk7XG59XG5cbmV4cG9ydCBjb25zdCBkZW5zZUJpbmNvdW50Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IERlbnNlQmluY291bnQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBkZW5zZUJpbmNvdW50IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RGVwdGhUb1NwYWNlLCBEZXB0aFRvU3BhY2VBdHRycywgRGVwdGhUb1NwYWNlSW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0RlcHRoVG9TcGFjZVByb2dyYW19IGZyb20gJy4uL2RlcHRoX3RvX3NwYWNlX2dwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXB0aFRvU3BhY2UoYXJnczoge1xuICBpbnB1dHM6IERlcHRoVG9TcGFjZUlucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IERlcHRoVG9TcGFjZUF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge2Jsb2NrU2l6ZSwgZGF0YUZvcm1hdH0gPSBhdHRycztcblxuICB1dGlsLmFzc2VydChcbiAgICAgIGJsb2NrU2l6ZSA+IDEsXG4gICAgICAoKSA9PiBgYmxvY2tTaXplIHNob3VsZCBiZSA+IDEgZm9yIGRlcHRoVG9TcGFjZSwgYnV0IHdhczogJHtibG9ja1NpemV9YCk7XG5cbiAgY29uc3QgYmF0Y2hTaXplID0geC5zaGFwZVswXTtcbiAgY29uc3QgaW5wdXRIZWlnaHQgPSAoZGF0YUZvcm1hdCA9PT0gJ05IV0MnKSA/IHguc2hhcGVbMV0gOiB4LnNoYXBlWzJdO1xuICBjb25zdCBpbnB1dFdpZHRoID0gKGRhdGFGb3JtYXQgPT09ICdOSFdDJykgPyB4LnNoYXBlWzJdIDogeC5zaGFwZVszXTtcbiAgY29uc3QgaW5wdXREZXB0aCA9IChkYXRhRm9ybWF0ID09PSAnTkhXQycpID8geC5zaGFwZVszXSA6IHguc2hhcGVbMV07XG5cbiAgY29uc3Qgb3V0cHV0SGVpZ2h0ID0gaW5wdXRIZWlnaHQgKiBibG9ja1NpemU7XG4gIGNvbnN0IG91dHB1dFdpZHRoID0gaW5wdXRXaWR0aCAqIGJsb2NrU2l6ZTtcbiAgY29uc3Qgb3V0cHV0RGVwdGggPSBpbnB1dERlcHRoIC8gKGJsb2NrU2l6ZSAqIGJsb2NrU2l6ZSk7XG5cbiAgY29uc3Qgb3V0cHV0U2hhcGUgPSAoZGF0YUZvcm1hdCA9PT0gJ05IV0MnKSA/XG4gICAgICBbYmF0Y2hTaXplLCBvdXRwdXRIZWlnaHQsIG91dHB1dFdpZHRoLCBvdXRwdXREZXB0aF0gOlxuICAgICAgW2JhdGNoU2l6ZSwgb3V0cHV0RGVwdGgsIG91dHB1dEhlaWdodCwgb3V0cHV0V2lkdGhdO1xuXG4gIGNvbnN0IHByb2dyYW0gPSBuZXcgRGVwdGhUb1NwYWNlUHJvZ3JhbShvdXRwdXRTaGFwZSwgYmxvY2tTaXplLCBkYXRhRm9ybWF0KTtcbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4XSwgeC5kdHlwZSk7XG59XG5cbmV4cG9ydCBjb25zdCBkZXB0aFRvU3BhY2VDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRGVwdGhUb1NwYWNlLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogZGVwdGhUb1NwYWNlIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBEZXB0aHdpc2VDb252MmROYXRpdmUsIERlcHRod2lzZUNvbnYyZE5hdGl2ZUF0dHJzLCBEZXB0aHdpc2VDb252MmROYXRpdmVJbnB1dHMsIGVudiwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtEZXB0aHdpc2VDb252MkRQcm9ncmFtfSBmcm9tICcuLi9jb252X2dwdV9kZXB0aHdpc2UnO1xuaW1wb3J0IHtEZXB0aHdpc2VDb252UGFja2VkMkRQcm9ncmFtfSBmcm9tICcuLi9jb252X3BhY2tlZF9ncHVfZGVwdGh3aXNlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGRlcHRod2lzZUNvbnYyZE5hdGl2ZShhcmdzOiB7XG4gIGlucHV0czogRGVwdGh3aXNlQ29udjJkTmF0aXZlSW5wdXRzLFxuICBhdHRyczogRGVwdGh3aXNlQ29udjJkTmF0aXZlQXR0cnMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0xcbn0pIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3gsIGZpbHRlcn0gPSBpbnB1dHM7XG4gIGNvbnN0IHtzdHJpZGVzLCBwYWQsIGRpbGF0aW9ucywgZGltUm91bmRpbmdNb2RlfSA9IGF0dHJzO1xuXG4gIGxldCAkZGlsYXRpb25zID0gZGlsYXRpb25zO1xuICBpZiAoJGRpbGF0aW9ucyA9PSBudWxsKSB7XG4gICAgJGRpbGF0aW9ucyA9IFsxLCAxXTtcbiAgfVxuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgYmFja2VuZF91dGlsLmVpdGhlclN0cmlkZXNPckRpbGF0aW9uc0FyZU9uZShzdHJpZGVzLCAkZGlsYXRpb25zKSxcbiAgICAgICgpID0+ICdFcnJvciBpbiBkZXB0aHdpc2VDb252MmQ6IEVpdGhlciBzdHJpZGVzIG9yIGRpbGF0aW9ucyBtdXN0IGJlICcgK1xuICAgICAgICAgIGAxLiBHb3Qgc3RyaWRlcyAke3N0cmlkZXN9IGFuZCBkaWxhdGlvbnMgJyR7JGRpbGF0aW9uc30nYCk7XG5cbiAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZUNvbnYyREluZm8oXG4gICAgICB4LnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICAgICAgZmlsdGVyLnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBzdHJpZGVzLCAkZGlsYXRpb25zLFxuICAgICAgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIHRydWUgLyogZGVwdGh3aXNlICovKTtcblxuICBsZXQgcHJvZ3JhbTogRGVwdGh3aXNlQ29udjJEUHJvZ3JhbXxEZXB0aHdpc2VDb252UGFja2VkMkRQcm9ncmFtO1xuICBpZiAoZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19ERVBUSFdJU0VDT05WJykgJiYgY29udkluZm8uc3RyaWRlV2lkdGggPD0gMiAmJlxuICAgICAgY29udkluZm8ub3V0Q2hhbm5lbHMgLyBjb252SW5mby5pbkNoYW5uZWxzID09PSAxKSB7XG4gICAgcHJvZ3JhbSA9IG5ldyBEZXB0aHdpc2VDb252UGFja2VkMkRQcm9ncmFtKGNvbnZJbmZvKTtcbiAgfSBlbHNlIHtcbiAgICBwcm9ncmFtID0gbmV3IERlcHRod2lzZUNvbnYyRFByb2dyYW0oY29udkluZm8pO1xuICB9XG4gIGNvbnN0IGN1c3RvbVZhbHVlcyA9IFtcbiAgICBbY29udkluZm8ucGFkSW5mby50b3AsIGNvbnZJbmZvLnBhZEluZm8ubGVmdF0sXG4gICAgW2NvbnZJbmZvLnN0cmlkZUhlaWdodCwgY29udkluZm8uc3RyaWRlV2lkdGhdLFxuICAgIFtjb252SW5mby5kaWxhdGlvbkhlaWdodCwgY29udkluZm8uZGlsYXRpb25XaWR0aF0sXG4gICAgW2NvbnZJbmZvLmluSGVpZ2h0LCBjb252SW5mby5pbldpZHRoXVxuICBdO1xuICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3gsIGZpbHRlcl0sICdmbG9hdDMyJywgY3VzdG9tVmFsdWVzKTtcbn1cblxuZXhwb3J0IGNvbnN0IGRlcHRod2lzZUNvbnYyZE5hdGl2ZUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBEZXB0aHdpc2VDb252MmROYXRpdmUsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBkZXB0aHdpc2VDb252MmROYXRpdmUgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlciwgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXJBdHRycywgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXJJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuY30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7RGVwdGh3aXNlQ29udjJERGVyRmlsdGVyUHJvZ3JhbX0gZnJvbSAnLi4vY29udl9iYWNrcHJvcF9ncHVfZGVwdGh3aXNlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyKGFyZ3M6IHtcbiAgaW5wdXRzOiBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlcklucHV0cyxcbiAgYXR0cnM6IERlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyQXR0cnMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0xcbn0pIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3gsIGR5fSA9IGlucHV0cztcbiAgY29uc3Qge3N0cmlkZXMsIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGZpbHRlclNoYXBlfSA9IGF0dHJzO1xuXG4gIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252MkRJbmZvKFxuICAgICAgeC5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgZmlsdGVyU2hhcGUsIHN0cmlkZXMsXG4gICAgICBkaWxhdGlvbnMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCB0cnVlIC8qIGRlcHRod2lzZSAqLyk7XG5cbiAgY29uc3QgcHJvZ3JhbSA9IG5ldyBEZXB0aHdpc2VDb252MkREZXJGaWx0ZXJQcm9ncmFtKGNvbnZJbmZvKTtcbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4LCBkeV0sICdmbG9hdDMyJyk7XG59XG5cbmV4cG9ydCBjb25zdCBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlckNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlcixcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0LCBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0QXR0cnMsIERlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXRJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuY30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7RGVwdGh3aXNlQ29udjJERGVySW5wdXRQcm9ncmFtfSBmcm9tICcuLi9jb252X2JhY2twcm9wX2dwdV9kZXB0aHdpc2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dChhcmdzOiB7XG4gIGlucHV0czogRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dElucHV0cyxcbiAgYXR0cnM6IERlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXRBdHRycyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTFxufSkge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7ZHksIGZpbHRlcn0gPSBpbnB1dHM7XG4gIGNvbnN0IHtzdHJpZGVzLCBkaWxhdGlvbnMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCBpbnB1dFNoYXBlfSA9IGF0dHJzO1xuXG4gIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252MkRJbmZvKFxuICAgICAgaW5wdXRTaGFwZSwgZmlsdGVyLnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBzdHJpZGVzLFxuICAgICAgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgdHJ1ZSAvKiBkZXB0aHdpc2UgKi8pO1xuXG4gIGNvbnN0IHByb2dyYW0gPSBuZXcgRGVwdGh3aXNlQ29udjJERGVySW5wdXRQcm9ncmFtKGNvbnZJbmZvKTtcbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtkeSwgZmlsdGVyXSwgJ2Zsb2F0MzInKTtcbn1cblxuZXhwb3J0IGNvbnN0IGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtEaWFnLCBEaWFnSW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0RpYWdQcm9ncmFtfSBmcm9tICcuLi9kaWFnX2dwdSc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWFnKGFyZ3M6IHtpbnB1dHM6IERpYWdJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG5cbiAgY29uc3Qgb3V0U2hhcGUgPSBbLi4ueC5zaGFwZSwgLi4ueC5zaGFwZV07XG4gIGNvbnN0IHhTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHguc2hhcGUpO1xuXG4gIGNvbnN0IGZsYXQgPSByZXNoYXBlKHtpbnB1dHM6IHt4fSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogW3hTaXplXX19KTtcblxuICBjb25zdCBwcm9ncmFtID0gbmV3IERpYWdQcm9ncmFtKHhTaXplKTtcbiAgY29uc3QgcmVzID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW2ZsYXRdLCBmbGF0LmR0eXBlKTtcblxuICBjb25zdCBvdXQgPSByZXNoYXBlKHtpbnB1dHM6IHt4OiByZXN9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBvdXRTaGFwZX19KTtcblxuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGZsYXQpO1xuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlcyk7XG5cbiAgcmV0dXJuIG91dDtcbn1cblxuZXhwb3J0IGNvbnN0IGRpYWdDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRGlhZyxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGRpYWcgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIERpbGF0aW9uMkQsIERpbGF0aW9uMkRBdHRycywgRGlsYXRpb24yRElucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtEaWxhdGlvbjJEUHJvZ3JhbX0gZnJvbSAnLi4vZGlsYXRpb25fZ3B1JztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGRpbGF0aW9uMkQoYXJnczoge1xuICBpbnB1dHM6IERpbGF0aW9uMkRJbnB1dHMsXG4gIGF0dHJzOiBEaWxhdGlvbjJEQXR0cnMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0xcbn0pIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3gsIGZpbHRlcn0gPSBpbnB1dHM7XG4gIGNvbnN0IHtzdHJpZGVzLCBwYWQsIGRpbGF0aW9uc30gPSBhdHRycztcblxuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlRGlsYXRpb24yREluZm8oXG4gICAgICB4LnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICAgICAgZmlsdGVyLnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgc3RyaWRlcywgcGFkLFxuICAgICAgJ05IV0MnIC8qIGRhdGFGb3JtYXQgKi8sIGRpbGF0aW9ucyk7XG4gIGxldCBvdXQ6IFRlbnNvckluZm87XG5cbiAgY29uc3QgcHJvZ3JhbSA9IG5ldyBEaWxhdGlvbjJEUHJvZ3JhbShjb252SW5mbyk7XG4gIG91dCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4LCBmaWx0ZXJdLCAnZmxvYXQzMicpO1xuXG4gIGNvbnN0IG91dFJlc2hhcGVkID1cbiAgICAgIHJlc2hhcGUoe2lucHV0czoge3g6IG91dH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IGNvbnZJbmZvLm91dFNoYXBlfX0pO1xuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG91dCk7XG5cbiAgcmV0dXJuIG91dFJlc2hhcGVkO1xufVxuXG5leHBvcnQgY29uc3QgZGlsYXRpb24yRENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBEaWxhdGlvbjJELFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogZGlsYXRpb24yRCBhcyB7fSBhcyBLZXJuZWxGdW5jLFxufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIEVpbnN1bSwgRWluc3VtQXR0cnMsIEVpbnN1bUlucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3IsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5cbmltcG9ydCB7bXVsdGlwbHl9IGZyb20gJy4vTXVsdGlwbHknO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHtzdW19IGZyb20gJy4vU3VtJztcbmltcG9ydCB7dHJhbnNwb3NlfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBlaW5zdW0oXG4gICAgYXJnczpcbiAgICAgICAge2lucHV0czogRWluc3VtSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLCBhdHRyczogRWluc3VtQXR0cnN9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2VxdWF0aW9ufSA9IGF0dHJzO1xuICBjb25zdCB0ZW5zb3JzID0gaW5wdXRzIGFzIFRlbnNvcltdO1xuXG4gIGNvbnN0IHthbGxEaW1zLCBzdW1tZWREaW1zLCBpZERpbXN9ID1cbiAgICAgIGJhY2tlbmRfdXRpbC5kZWNvZGVFaW5zdW1FcXVhdGlvbihlcXVhdGlvbiwgdGVuc29ycy5sZW5ndGgpO1xuICBiYWNrZW5kX3V0aWwuY2hlY2tFaW5zdW1EaW1TaXplcyhhbGxEaW1zLmxlbmd0aCwgaWREaW1zLCB0ZW5zb3JzKTtcbiAgY29uc3Qge3BhdGgsIHN0ZXBzfSA9IGJhY2tlbmRfdXRpbC5nZXRFaW5zdW1Db21wdXRlUGF0aChzdW1tZWREaW1zLCBpZERpbXMpO1xuXG4gIGNvbnN0IG5TdGVwcyA9IHN0ZXBzLmxlbmd0aDtcbiAgbGV0IG91dDogVGVuc29ySW5mb3xudWxsID0gbnVsbDtcbiAgbGV0IG51bURpbXNSZW1haW5pbmcgPSBhbGxEaW1zLmxlbmd0aDtcbiAgY29uc3QgdGVuc29yc1RvRGlzcG9zZTogVGVuc29ySW5mb1tdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgblN0ZXBzOyArK2kpIHtcbiAgICBmb3IgKGNvbnN0IGlkVGVybSBvZiBzdGVwc1tpXSkge1xuICAgICAgY29uc3Qge3Blcm11dGF0aW9uSW5kaWNlczogcGVybSwgZXhwYW5kRGltczogZGltc1RvRXhwYW5kfSA9XG4gICAgICAgICAgYmFja2VuZF91dGlsLmdldEVpbnN1bVBlcm11dGF0aW9uKG51bURpbXNSZW1haW5pbmcsIGlkRGltc1tpZFRlcm1dKTtcbiAgICAgIGxldCB4OiBUZW5zb3JJbmZvO1xuICAgICAgaWYgKGJhY2tlbmRfdXRpbC5pc0lkZW50aXR5UGVybXV0YXRpb24ocGVybSkpIHtcbiAgICAgICAgeCA9IHRlbnNvcnNbaWRUZXJtXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHggPSB0cmFuc3Bvc2Uoe2lucHV0czoge3g6IHRlbnNvcnNbaWRUZXJtXX0sIGJhY2tlbmQsIGF0dHJzOiB7cGVybX19KTtcbiAgICAgICAgdGVuc29yc1RvRGlzcG9zZS5wdXNoKHgpO1xuICAgICAgfVxuICAgICAgY29uc3QgdGFyZ2V0U2hhcGU6IG51bWJlcltdID0geC5zaGFwZS5zbGljZSgpO1xuICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBkaW1zVG9FeHBhbmQubGVuZ3RoOyArK2spIHtcbiAgICAgICAgdGFyZ2V0U2hhcGUuc3BsaWNlKGRpbXNUb0V4cGFuZFtrXSwgMCwgMSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdXRpbC5hcnJheXNFcXVhbCh4LnNoYXBlLCB0YXJnZXRTaGFwZSkpIHtcbiAgICAgICAgeCA9IHJlc2hhcGUoe2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiB0YXJnZXRTaGFwZX19KTtcbiAgICAgICAgdGVuc29yc1RvRGlzcG9zZS5wdXNoKHgpO1xuICAgICAgfVxuICAgICAgaWYgKG91dCA9PT0gbnVsbCkge1xuICAgICAgICBvdXQgPSB4O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgICAgICBvdXQgPSBtdWx0aXBseSh7aW5wdXRzOiB7YTogeCwgYjogb3V0fSwgYmFja2VuZH0pIGFzIFRlbnNvckluZm87XG4gICAgICAgIHRlbnNvcnNUb0Rpc3Bvc2UucHVzaChvdXQpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaSA8IG5TdGVwcyAtIDEpIHtcbiAgICAgIGlmIChwYXRoW2ldID49IDApIHtcbiAgICAgICAgb3V0ID0gc3VtKHtcbiAgICAgICAgICBpbnB1dHM6IHt4OiBvdXR9LFxuICAgICAgICAgIGJhY2tlbmQsXG4gICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgIGF4aXM6IHBhdGhbaV0gLSAoYWxsRGltcy5sZW5ndGggLSBudW1EaW1zUmVtYWluaW5nKSxcbiAgICAgICAgICAgIGtlZXBEaW1zOiBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRlbnNvcnNUb0Rpc3Bvc2UucHVzaChvdXQpO1xuICAgICAgfVxuICAgICAgbnVtRGltc1JlbWFpbmluZy0tO1xuICAgIH1cbiAgfVxuXG4gIC8vIENsZWFuIHVwIGludGVybWVkaWF0ZSB0ZW5zb3JzLlxuICBmb3IgKGNvbnN0IHRlbnNvckluZm8gb2YgdGVuc29yc1RvRGlzcG9zZSkge1xuICAgIGlmICh0ZW5zb3JJbmZvID09PSBvdXQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHRlbnNvckluZm8pO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cblxuZXhwb3J0IGNvbnN0IGVpbnN1bUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBFaW5zdW0sXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBlaW5zdW0gYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFbHUsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuY30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgRUxVID0gYHJldHVybiAoeCA+PSAwLjApID8geCA6IChleHAoeCkgLSAxLjApO2A7XG5cbmNvbnN0IEVMVV9QQUNLRUQgPSBgXG4gIHZlYzQgcmVzdWx0O1xuXG4gIHJlc3VsdC5yID0gKHguciA+PSAwLjApID8geC5yIDogKGV4cCh4LnIpIC0gMS4wKTtcbiAgcmVzdWx0LmcgPSAoeC5nID49IDAuMCkgPyB4LmcgOiAoZXhwKHguZykgLSAxLjApO1xuICByZXN1bHQuYiA9ICh4LmIgPj0gMC4wKSA/IHguYiA6IChleHAoeC5iKSAtIDEuMCk7XG4gIHJlc3VsdC5hID0gKHguYSA+PSAwLjApID8geC5hIDogKGV4cCh4LmEpIC0gMS4wKTtcblxuICByZXR1cm4gcmVzdWx0O1xuYDtcblxuY29uc3QgZWx1ID0gdW5hcnlLZXJuZWxGdW5jKHtvcFNuaXBwZXQ6IEVMVSwgcGFja2VkT3BTbmlwcGV0OiBFTFVfUEFDS0VEfSk7XG5cbmV4cG9ydCBjb25zdCBlbHVDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRWx1LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogZWx1IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RWx1R3JhZCwgRWx1R3JhZElucHV0cywgZW52LCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0JpbmFyeU9wUHJvZ3JhbX0gZnJvbSAnLi4vYmluYXJ5b3BfZ3B1JztcbmltcG9ydCB7QmluYXJ5T3BQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9iaW5hcnlvcF9wYWNrZWRfZ3B1JztcblxuY29uc3QgRUxVX0RFUiA9IGByZXR1cm4gKGIgPj0gMS4wKSA/IGEgOiBhICogKGIgKyAxLjApO2A7XG5jb25zdCBFTFVfREVSX1BBQ0tFRCA9IGBcbiAgdmVjNCBiR1RFWmVybyA9IHZlYzQoZ3JlYXRlclRoYW5FcXVhbChiLCB2ZWM0KDAuKSkpO1xuICByZXR1cm4gKGJHVEVaZXJvICogYSkgKyAoKHZlYzQoMS4wKSAtIGJHVEVaZXJvKSAqIChhICogKGIgKyB2ZWM0KDEuMCkpKSk7XG5gO1xuXG5leHBvcnQgY29uc3QgZWx1R3JhZCA9XG4gICAgKGFyZ3M6IHtpbnB1dHM6IEVsdUdyYWRJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTogVGVuc29ySW5mbyA9PiB7XG4gICAgICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kfSA9IGFyZ3M7XG4gICAgICBjb25zdCB7ZHksIHl9ID0gaW5wdXRzO1xuXG4gICAgICBjb25zdCBwcm9ncmFtID0gZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19CSU5BUllfT1BFUkFUSU9OUycpID9cbiAgICAgICAgICBuZXcgQmluYXJ5T3BQYWNrZWRQcm9ncmFtKEVMVV9ERVJfUEFDS0VELCBkeS5zaGFwZSwgeS5zaGFwZSkgOlxuICAgICAgICAgIG5ldyBCaW5hcnlPcFByb2dyYW0oRUxVX0RFUiwgZHkuc2hhcGUsIHkuc2hhcGUpO1xuICAgICAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtkeSwgeV0sIGR5LmR0eXBlKTtcbiAgICB9O1xuXG5leHBvcnQgY29uc3QgZWx1R3JhZENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBFbHVHcmFkLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogZWx1R3JhZCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VxdWFsLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmN9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge2JpbmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHtlcXVhbEltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuY29uc3QgUEFDS0VEX0VRVUFMID0gYFxuICByZXR1cm4gdmVjNChlcXVhbChhLCBiKSk7XG5gO1xuXG5jb25zdCBFUVVBTCA9IGByZXR1cm4gZmxvYXQoYSA9PSBiKTtgO1xuXG5leHBvcnQgY29uc3QgZXF1YWwgPSBiaW5hcnlLZXJuZWxGdW5jKHtcbiAgb3BTbmlwcGV0OiBFUVVBTCxcbiAgcGFja2VkT3BTbmlwcGV0OiBQQUNLRURfRVFVQUwsXG4gIGR0eXBlOiAnYm9vbCcsXG4gIGNwdUtlcm5lbEltcGw6IGVxdWFsSW1wbENQVSxcbn0pO1xuXG5leHBvcnQgY29uc3QgZXF1YWxDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRXF1YWwsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBlcXVhbCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgRXJmLCBLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgRVJGID0gYFxuICAvLyBFcnJvciBmdW5jdGlvbiBpcyBjYWxjdWxhdGVkIGFwcHJveGltYXRlbHkgd2l0aCBlbGVtZW50YXJ5IGZ1bmN0aW9uLlxuICAvLyBTZWUgXCJIYW5kYm9vayBvZiBNYXRoZW1hdGljYWwgRnVuY3Rpb25zIHdpdGggRm9ybXVsYXMsXG4gIC8vIEdyYXBocywgYW5kIE1hdGhlbWF0aWNhbCBUYWJsZXNcIiwgQWJyYW1vd2l0eiBhbmQgU3RlZ3VuLlxuICBmbG9hdCBwID0gJHtiYWNrZW5kX3V0aWwuRVJGX1B9O1xuICBmbG9hdCBhMSA9ICR7YmFja2VuZF91dGlsLkVSRl9BMX07XG4gIGZsb2F0IGEyID0gJHtiYWNrZW5kX3V0aWwuRVJGX0EyfTtcbiAgZmxvYXQgYTMgPSAke2JhY2tlbmRfdXRpbC5FUkZfQTN9O1xuICBmbG9hdCBhNCA9ICR7YmFja2VuZF91dGlsLkVSRl9BNH07XG4gIGZsb2F0IGE1ID0gJHtiYWNrZW5kX3V0aWwuRVJGX0E1fTtcblxuICBmbG9hdCBzaWduID0gc2lnbih4KTtcbiAgeCA9IGFicyh4KTtcbiAgZmxvYXQgdCA9IDEuMCAvICgxLjAgKyBwICogeCk7XG4gIHJldHVybiBzaWduICogKDEuMCAtICgoKCgoYTUqdCArIGE0KSp0KSArIGEzKSp0ICsgYTIpKnQgKyBhMSkqdCpleHAoLXgqeCkpO1xuYDtcblxuZXhwb3J0IGNvbnN0IGVyZiA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBFUkZ9KTtcblxuZXhwb3J0IGNvbnN0IGVyZkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBFcmYsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBlcmYsXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0V4cCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge3VuYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQge2V4cEltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5leHBvcnQgY29uc3QgRVhQID0gYHJldHVybiBleHAoeCk7YDtcbmV4cG9ydCBjb25zdCBleHAgPSB1bmFyeUtlcm5lbEZ1bmMoXG4gICAge29wU25pcHBldDogRVhQLCBwYWNrZWRPcFNuaXBwZXQ6IEVYUCwgY3B1S2VybmVsSW1wbDogZXhwSW1wbENQVX0pO1xuXG5leHBvcnQgY29uc3QgZXhwQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEV4cCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGV4cCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFeHBhbmREaW1zLCBFeHBhbmREaW1zQXR0cnMsIEV4cGFuZERpbXNJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGV4cGFuZERpbXMoYXJnczoge1xuICBpbnB1dHM6IEV4cGFuZERpbXNJbnB1dHMsXG4gIGF0dHJzOiBFeHBhbmREaW1zQXR0cnMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0xcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYXR0cnMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge2RpbX0gPSBhdHRycztcbiAgY29uc3Qge2lucHV0fSA9IGlucHV0cztcblxuICBjb25zdCBpbnB1dFJhbmsgPSBpbnB1dC5zaGFwZS5sZW5ndGg7XG4gIGNvbnN0IG5ld1NoYXBlID0gaW5wdXQuc2hhcGUuc2xpY2UoKTtcbiAgbGV0ICRkaW0gPSBkaW07XG4gIGlmIChkaW0gPCAwKSB7XG4gICAgLy8gTmVnYXRpdmUgdmFsdWUgaXMgY291bnRlZCBmcm9tIHRoZSB0YWlsIG9mIHJhbmsuXG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIC0oaW5wdXRSYW5rICsgMSkgPD0gZGltLFxuICAgICAgICAoKSA9PiBgQXhpcyBtdXN0IGJlIGluIHRoZSBpbnRlcnZhbCBbJHstIChpbnB1dFJhbmsgKyAxKX0sICR7XG4gICAgICAgICAgICBpbnB1dFJhbmt9XWApO1xuICAgICRkaW0gPSBpbnB1dFJhbmsgKyBkaW0gKyAxO1xuICB9XG4gIG5ld1NoYXBlLnNwbGljZSgkZGltLCAwLCAxKTtcblxuICByZXR1cm4gcmVzaGFwZSh7aW5wdXRzOiB7eDogaW5wdXR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBuZXdTaGFwZX19KTtcbn1cblxuZXhwb3J0IGNvbnN0IGV4cGFuZERpbXNDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRXhwYW5kRGltcyxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGV4cGFuZERpbXMgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RXhwbTEsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuY30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7ZXhwbTFJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuY29uc3QgRVhQTTEgPSBgcmV0dXJuIGV4cCh4KSAtIDEuMDtgO1xuXG5leHBvcnQgY29uc3QgZXhwbTEgPSB1bmFyeUtlcm5lbEZ1bmMoXG4gICAge29wU25pcHBldDogRVhQTTEsIHBhY2tlZE9wU25pcHBldDogRVhQTTEsIGNwdUtlcm5lbEltcGw6IGV4cG0xSW1wbENQVX0pO1xuXG5leHBvcnQgY29uc3QgZXhwbTFDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRXhwbTEsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBleHBtMSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0ZGVCwgRkZUSW5wdXRzLCBLZXJuZWxDb25maWcsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5cbmltcG9ydCB7ZmZ0SW1wbH0gZnJvbSAnLi9GRlRfaW1wbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBmZnQoYXJnczoge2lucHV0czogRkZUSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge2lucHV0fSA9IGlucHV0cztcblxuICByZXR1cm4gZmZ0SW1wbChpbnB1dCwgZmFsc2UgLyogaW52ZXJzZSAqLywgYmFja2VuZCk7XG59XG5cbmV4cG9ydCBjb25zdCBmZnRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRkZULFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogZmZ0XG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0ZGVFByb2dyYW19IGZyb20gJy4uL2ZmdF9ncHUnO1xuXG5pbXBvcnQge2NvbXBsZXh9IGZyb20gJy4vQ29tcGxleCc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBmZnRJbXBsKFxuICAgIHg6IFRlbnNvckluZm8sIGludmVyc2U6IGJvb2xlYW4sIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wpOiBUZW5zb3JJbmZvIHtcbiAgY29uc3QgeERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KHguZGF0YUlkKTtcblxuICBjb25zdCBpbnB1dFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoeC5zaGFwZSk7XG4gIC8vIENvbGxhcHNlIGFsbCBvdXRlciBkaW1lbnNpb25zIHRvIGEgc2luZ2xlIGJhdGNoIGRpbWVuc2lvbi5cbiAgY29uc3QgaW5uZXJEaW1lbnNpb25TaXplID0geC5zaGFwZVt4LnNoYXBlLmxlbmd0aCAtIDFdO1xuICBjb25zdCBiYXRjaCA9IGlucHV0U2l6ZSAvIGlubmVyRGltZW5zaW9uU2l6ZTtcblxuICBjb25zdCBpbnB1dDJEID0gcmVzaGFwZShcbiAgICAgIHtpbnB1dHM6IHt4fSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogW2JhdGNoLCBpbm5lckRpbWVuc2lvblNpemVdfX0pO1xuXG4gIGNvbnN0IHhTaGFwZSA9IGlucHV0MkQuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyXTtcbiAgY29uc3QgcmVhbFByb2dyYW0gPSBuZXcgRkZUUHJvZ3JhbSgncmVhbCcsIHhTaGFwZSwgaW52ZXJzZSk7XG4gIGNvbnN0IGltYWdQcm9ncmFtID0gbmV3IEZGVFByb2dyYW0oJ2ltYWcnLCB4U2hhcGUsIGludmVyc2UpO1xuXG4gIGNvbnN0IGlucHV0cyA9IFtcbiAgICB7XG4gICAgICBkYXRhSWQ6IHhEYXRhLmNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsLmRhdGFJZCxcbiAgICAgIGR0eXBlOiB4RGF0YS5jb21wbGV4VGVuc29ySW5mb3MucmVhbC5kdHlwZSxcbiAgICAgIHNoYXBlOiB4U2hhcGVcbiAgICB9LFxuICAgIHtcbiAgICAgIGRhdGFJZDogeERhdGEuY29tcGxleFRlbnNvckluZm9zLmltYWcuZGF0YUlkLFxuICAgICAgZHR5cGU6IHhEYXRhLmNvbXBsZXhUZW5zb3JJbmZvcy5pbWFnLmR0eXBlLFxuICAgICAgc2hhcGU6IHhTaGFwZVxuICAgIH1cbiAgXTtcblxuICBjb25zdCByZWFsUGFydCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHJlYWxQcm9ncmFtLCBpbnB1dHMsICdmbG9hdDMyJyk7XG4gIGNvbnN0IGltYWdQYXJ0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0oaW1hZ1Byb2dyYW0sIGlucHV0cywgJ2Zsb2F0MzInKTtcblxuICBjb25zdCBjb21wbGV4T3V0cHV0ID1cbiAgICAgIGNvbXBsZXgoe2lucHV0czoge3JlYWw6IHJlYWxQYXJ0LCBpbWFnOiBpbWFnUGFydH0sIGJhY2tlbmR9KTtcblxuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlYWxQYXJ0KTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpbWFnUGFydCk7XG5cbiAgY29uc3QgY29tcGxleE91dHB1dFJlc2hhcGVkID1cbiAgICAgIHJlc2hhcGUoe2lucHV0czoge3g6IGNvbXBsZXhPdXRwdXR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiB4LnNoYXBlfX0pO1xuXG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaW5wdXQyRCk7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oY29tcGxleE91dHB1dCk7XG4gIHJldHVybiBjb21wbGV4T3V0cHV0UmVzaGFwZWQ7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RmlsbCwgRmlsbEF0dHJzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0ZpbGxQcm9ncmFtfSBmcm9tICcuLi9maWxsX2dwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBmaWxsKGFyZ3M6IHtiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLCBhdHRyczogRmlsbEF0dHJzfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7c2hhcGUsIHZhbHVlfSA9IGF0dHJzO1xuICBsZXQge2R0eXBlfSA9IGF0dHJzO1xuXG4gIGR0eXBlID0gZHR5cGUgfHwgdXRpbC5pbmZlckR0eXBlKHZhbHVlKTtcblxuICBpZiAoZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgLy8gU3RyaW5nIHR5cGUgc2hvdWxkIGJlIGhhbmRsZWQgaW4gQ1BVIG1lbW9yeS5cbiAgICBjb25zdCB2YWx1ZXMgPSB1dGlsLmdldEFycmF5RnJvbURUeXBlKGR0eXBlLCB1dGlsLnNpemVGcm9tU2hhcGUoc2hhcGUpKTtcbiAgICB2YWx1ZXMuZmlsbCh2YWx1ZSBhcyBzdHJpbmcpO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHNoYXBlLCBkdHlwZSwgdmFsdWVzKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IEZpbGxQcm9ncmFtKHNoYXBlLCB2YWx1ZSBhcyBudW1iZXIpO1xuICAgIGNvbnN0IGN1c3RvbVZhbHVlcyA9IFtbdmFsdWUgYXMgbnVtYmVyXV07XG4gICAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtdLCBkdHlwZSwgY3VzdG9tVmFsdWVzKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZmlsbENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBGaWxsLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogZmlsbCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgVGVuc29yNER9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge0ZsaXBMZWZ0UmlnaHQsIEZsaXBMZWZ0UmlnaHRJbnB1dHN9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0ZsaXBMZWZ0UmlnaHRQcm9ncmFtfSBmcm9tICcuLi9mbGlwX2xlZnRfcmlnaHRfZ3B1JztcblxuZXhwb3J0IGNvbnN0IGZsaXBMZWZ0UmlnaHRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRmxpcExlZnRSaWdodCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6ICh7aW5wdXRzLCBiYWNrZW5kfSkgPT4ge1xuICAgIGNvbnN0IHtpbWFnZX0gPSBpbnB1dHMgYXMgRmxpcExlZnRSaWdodElucHV0cztcbiAgICBjb25zdCB3ZWJnbEJhY2tlbmQgPSBiYWNrZW5kIGFzIE1hdGhCYWNrZW5kV2ViR0w7XG5cbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IEZsaXBMZWZ0UmlnaHRQcm9ncmFtKChpbWFnZSBhcyBUZW5zb3I0RCkuc2hhcGUpO1xuICAgIGNvbnN0IG91dHB1dCA9IHdlYmdsQmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW2ltYWdlXSwgaW1hZ2UuZHR5cGUpO1xuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cbn07XG4iLCJcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtGbG9vciwgS2VybmVsQ29uZmlnfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHtmbG9vckltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5jb25zdCBGTE9PUiA9IGByZXR1cm4gZmxvb3IoeCk7YDtcblxuZXhwb3J0IGNvbnN0IGZsb29yID0gdW5hcnlLZXJuZWxGdW5jKFxuICAgIHtvcFNuaXBwZXQ6IEZMT09SLCBwYWNrZWRPcFNuaXBwZXQ6IEZMT09SLCBjcHVLZXJuZWxJbXBsOiBmbG9vckltcGxDUFV9KTtcblxuZXhwb3J0IGNvbnN0IGZsb29yQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEZsb29yLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogZmxvb3IsXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0Zsb29yRGl2LCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmN9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7YmluYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5cbi8vIFdlIHVzZSBuYXRpdmUgaW50ZWdlciBkaXZpc2lvbiB0byBkZWFsIHdpdGggZmxvYXRpbmcgcG9pbnQgaW1wcmVjaXNpb24uIFNpbmNlXG4vLyB3ZSBpbXBsZW1lbnQgZmxvb3IgZGl2aXNpb24gYW5kIGdsc2wgaW1wbGVtZW50cyB0cnVuY2F0ZWQgZGl2aXNpb24sIHdlXG4vLyBjb3JyZWN0IGZvciB0aGlzIGJ5IHN1YnRyYWN0aW5nIDEgZnJvbSByZXN1bHQgd2hlbiB0aGUgcmVzdWx0IGlzIG5lZ2F0aXZlIGFuZFxuLy8gdGhlcmUgaXMgYSByZW1haW5kZXIuXG5jb25zdCBJTlRfRElWID0gYFxuICBmbG9hdCBzID0gc2lnbihhKSAqIHNpZ24oYik7XG4gIGludCBpYSA9IHJvdW5kKGEpO1xuICBpbnQgaWIgPSByb3VuZChiKTtcbiAgaWYgKGliICE9IDApIHtcbiAgICAvLyBXaW5kb3dzIChEM0QpIHdhbnRzIGd1YXJhbnRlZWQgbm9uLXplcm8gaW50IGRpdmlzaW9uIGF0IGNvbXBpbGUtdGltZS5cbiAgICByZXR1cm4gZmxvYXQoaWRpdihpYSwgaWIsIHMpKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gTkFOO1xuICB9XG5gO1xuXG5jb25zdCBJTlRfRElWX1BBQ0tFRCA9IGBcbiAgaXZlYzQgaWEgPSByb3VuZChhKTtcbiAgaXZlYzQgaWIgPSByb3VuZChiKTtcbiAgYnZlYzQgY29uZCA9IG5vdEVxdWFsKGliLCBpdmVjNCgwKSk7XG4gIGl2ZWM0IHJlc3VsdCA9IGl2ZWM0KDApO1xuICB2ZWM0IHMgPSBzaWduKGEpICogc2lnbihiKTtcblxuICAvLyBXaW5kb3dzIChEM0QpIHdhbnRzIGd1YXJhbnRlZWQgbm9uLXplcm8gaW50IGRpdmlzaW9uIGF0IGNvbXBpbGUtdGltZS5cbiAgaWYgKGNvbmRbMF0pIHtcbiAgICByZXN1bHRbMF0gPSBpZGl2KGlhWzBdLCBpYlswXSwgc1swXSk7XG4gIH1cbiAgaWYgKGNvbmRbMV0pIHtcbiAgICByZXN1bHRbMV0gPSBpZGl2KGlhWzFdLCBpYlsxXSwgc1sxXSk7XG4gIH1cbiAgaWYgKGNvbmRbMl0pIHtcbiAgICByZXN1bHRbMl0gPSBpZGl2KGlhWzJdLCBpYlsyXSwgc1syXSk7XG4gIH1cbiAgaWYgKGNvbmRbM10pIHtcbiAgICByZXN1bHRbM10gPSBpZGl2KGlhWzNdLCBpYlszXSwgc1szXSk7XG4gIH1cbiAgcmV0dXJuIHZlYzQocmVzdWx0KTtcbmA7XG5cbmV4cG9ydCBjb25zdCBmbG9vckRpdiA9IGJpbmFyeUtlcm5lbEZ1bmMoXG4gICAge29wU25pcHBldDogSU5UX0RJViwgcGFja2VkT3BTbmlwcGV0OiBJTlRfRElWX1BBQ0tFRCwgZHR5cGU6ICdpbnQzMid9KTtcblxuZXhwb3J0IGNvbnN0IGZsb29yRGl2Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEZsb29yRGl2LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogZmxvb3JEaXYgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtlbnYsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7RnJvbVBpeGVscywgRnJvbVBpeGVsc0F0dHJzLCBGcm9tUGl4ZWxzSW5wdXRzfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtUZXh0dXJlVXNhZ2V9IGZyb20gJy4uL3RleF91dGlsJztcblxuaW1wb3J0IHtGcm9tUGl4ZWxzUHJvZ3JhbX0gZnJvbSAnLi9Gcm9tUGl4ZWxzX3V0aWxzL2Zyb21fcGl4ZWxzX2dwdSc7XG5pbXBvcnQge0Zyb21QaXhlbHNQYWNrZWRQcm9ncmFtfSBmcm9tICcuL0Zyb21QaXhlbHNfdXRpbHMvZnJvbV9waXhlbHNfcGFja2VkX2dwdSc7XG5cbmV4cG9ydCBjb25zdCBmcm9tUGl4ZWxzQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEZyb21QaXhlbHMsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBmcm9tUGl4ZWxzIGFzIHt9IGFzIEtlcm5lbEZ1bmMsXG59O1xuXG5sZXQgZnJvbVBpeGVsczJEQ29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xuXG5mdW5jdGlvbiBmcm9tUGl4ZWxzKGFyZ3M6IHtcbiAgaW5wdXRzOiBGcm9tUGl4ZWxzSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogRnJvbVBpeGVsc0F0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGxldCB7cGl4ZWxzfSA9IGlucHV0cztcbiAgY29uc3Qge251bUNoYW5uZWxzfSA9IGF0dHJzO1xuXG4gIGNvbnN0IGlzVmlkZW8gPSB0eXBlb2YgKEhUTUxWaWRlb0VsZW1lbnQpICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgcGl4ZWxzIGluc3RhbmNlb2YgSFRNTFZpZGVvRWxlbWVudDtcbiAgY29uc3QgaXNJbWFnZSA9IHR5cGVvZiAoSFRNTEltYWdlRWxlbWVudCkgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICBwaXhlbHMgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50O1xuICBjb25zdCBbd2lkdGgsIGhlaWdodF0gPSBpc1ZpZGVvID9cbiAgICAgIFtcbiAgICAgICAgKHBpeGVscyBhcyBIVE1MVmlkZW9FbGVtZW50KS52aWRlb1dpZHRoLFxuICAgICAgICAocGl4ZWxzIGFzIEhUTUxWaWRlb0VsZW1lbnQpLnZpZGVvSGVpZ2h0XG4gICAgICBdIDpcbiAgICAgIFtwaXhlbHMud2lkdGgsIHBpeGVscy5oZWlnaHRdO1xuXG4gIGNvbnN0IHRleFNoYXBlOiBbbnVtYmVyLCBudW1iZXJdID0gW2hlaWdodCwgd2lkdGhdO1xuICBjb25zdCBvdXRTaGFwZSA9IFtoZWlnaHQsIHdpZHRoLCBudW1DaGFubmVsc107XG5cbiAgaWYgKGlzSW1hZ2UgfHwgaXNWaWRlbykge1xuICAgIGlmIChmcm9tUGl4ZWxzMkRDb250ZXh0ID09IG51bGwpIHtcbiAgICAgIGZyb21QaXhlbHMyRENvbnRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKS5nZXRDb250ZXh0KCcyZCcpO1xuICAgIH1cblxuICAgIGZyb21QaXhlbHMyRENvbnRleHQuY2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgZnJvbVBpeGVsczJEQ29udGV4dC5jYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIGZyb21QaXhlbHMyRENvbnRleHQuZHJhd0ltYWdlKFxuICAgICAgICBwaXhlbHMgYXMgSFRNTFZpZGVvRWxlbWVudCB8IEhUTUxJbWFnZUVsZW1lbnQgfCBJbWFnZUJpdG1hcCxcbiAgICAgICAgMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgcGl4ZWxzID0gZnJvbVBpeGVsczJEQ29udGV4dC5jYW52YXM7XG4gIH1cblxuICBjb25zdCB0ZW1wUGl4ZWxIYW5kbGUgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHRleFNoYXBlLCAnaW50MzInKTtcbiAgLy8gVGhpcyBpcyBhIGJ5dGUgdGV4dHVyZSB3aXRoIHBpeGVscy5cbiAgYmFja2VuZC50ZXhEYXRhLmdldCh0ZW1wUGl4ZWxIYW5kbGUuZGF0YUlkKS51c2FnZSA9IFRleHR1cmVVc2FnZS5QSVhFTFM7XG4gIGJhY2tlbmQuZ3BncHUudXBsb2FkUGl4ZWxEYXRhVG9UZXh0dXJlKFxuICAgICAgYmFja2VuZC5nZXRUZXh0dXJlKHRlbXBQaXhlbEhhbmRsZS5kYXRhSWQpLCBwaXhlbHMgYXMgSW1hZ2VEYXRhKTtcbiAgY29uc3QgcHJvZ3JhbSA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0snKSA/XG4gICAgICBuZXcgRnJvbVBpeGVsc1BhY2tlZFByb2dyYW0ob3V0U2hhcGUpIDpcbiAgICAgIG5ldyBGcm9tUGl4ZWxzUHJvZ3JhbShvdXRTaGFwZSk7XG4gIGNvbnN0IHJlcyA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt0ZW1wUGl4ZWxIYW5kbGVdLCAnaW50MzInKTtcbiAgYmFja2VuZC5kaXNwb3NlRGF0YSh0ZW1wUGl4ZWxIYW5kbGUuZGF0YUlkKTtcbiAgcmV0dXJuIHJlcztcbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtnZXRHbHNsRGlmZmVyZW5jZXN9IGZyb20gJy4uLy4uL2dsc2xfdmVyc2lvbic7XG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi4vLi4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBGcm9tUGl4ZWxzUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuXG4gIGNvbnN0cnVjdG9yKG91dHB1dFNoYXBlOiBudW1iZXJbXSkge1xuICAgIGNvbnN0IGdsc2wgPSBnZXRHbHNsRGlmZmVyZW5jZXMoKTtcbiAgICBjb25zdCBbaGVpZ2h0LCB3aWR0aCwgXSA9IG91dHB1dFNoYXBlO1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMyBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IHRleFIgPSBjb29yZHNbMF07XG4gICAgICAgIGludCB0ZXhDID0gY29vcmRzWzFdO1xuICAgICAgICBpbnQgZGVwdGggPSBjb29yZHNbMl07XG4gICAgICAgIHZlYzIgdXYgPSAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgLyB2ZWMyKCR7d2lkdGh9LjAsICR7aGVpZ2h0fS4wKTtcblxuICAgICAgICB2ZWM0IHZhbHVlcyA9ICR7Z2xzbC50ZXh0dXJlMkR9KEEsIHV2KTtcbiAgICAgICAgZmxvYXQgdmFsdWU7XG4gICAgICAgIGlmIChkZXB0aCA9PSAwKSB7XG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZXMucjtcbiAgICAgICAgfSBlbHNlIGlmIChkZXB0aCA9PSAxKSB7XG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZXMuZztcbiAgICAgICAgfSBlbHNlIGlmIChkZXB0aCA9PSAyKSB7XG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZXMuYjtcbiAgICAgICAgfSBlbHNlIGlmIChkZXB0aCA9PSAzKSB7XG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZXMuYTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNldE91dHB1dChmbG9vcih2YWx1ZSAqIDI1NS4wICsgMC41KSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2dldEdsc2xEaWZmZXJlbmNlc30gZnJvbSAnLi4vLi4vZ2xzbF92ZXJzaW9uJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuLi8uLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIEZyb21QaXhlbHNQYWNrZWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHBhY2tlZElucHV0cyA9IGZhbHNlO1xuICBwYWNrZWRPdXRwdXQgPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKG91dHB1dFNoYXBlOiBudW1iZXJbXSkge1xuICAgIGNvbnN0IGdsc2wgPSBnZXRHbHNsRGlmZmVyZW5jZXMoKTtcbiAgICBjb25zdCBbaGVpZ2h0LCB3aWR0aCwgXSA9IG91dHB1dFNoYXBlO1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMyBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IHRleFIgPSBjb29yZHNbMF07XG4gICAgICAgIGludCB0ZXhDID0gY29vcmRzWzFdO1xuICAgICAgICBpbnQgZGVwdGggPSBjb29yZHNbMl07XG5cbiAgICAgICAgdmVjNCByZXN1bHQgPSB2ZWM0KDAuKTtcblxuICAgICAgICBmb3IoaW50IHJvdz0wOyByb3c8PTE7IHJvdysrKSB7XG4gICAgICAgICAgZm9yKGludCBjb2w9MDsgY29sPD0xOyBjb2wrKykge1xuICAgICAgICAgICAgdGV4QyA9IGNvb3Jkc1sxXSArIHJvdztcbiAgICAgICAgICAgIGRlcHRoID0gY29vcmRzWzJdICsgY29sO1xuXG4gICAgICAgICAgICB2ZWMyIHV2ID0gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC9cbiAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3dpZHRofS4wLCAke2hlaWdodH0uMCk7XG4gICAgICAgICAgICB2ZWM0IHZhbHVlcyA9ICR7Z2xzbC50ZXh0dXJlMkR9KEEsIHV2KTtcbiAgICAgICAgICAgIGZsb2F0IHZhbHVlO1xuICAgICAgICAgICAgaWYgKGRlcHRoID09IDApIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZXMucjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVwdGggPT0gMSkge1xuICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlcy5nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkZXB0aCA9PSAyKSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gdmFsdWVzLmI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRlcHRoID09IDMpIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZXMuYTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzdWx0W3JvdyAqIDIgKyBjb2xdID0gZmxvb3IodmFsdWUgKiAyNTUuMCArIDAuNSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgJHtnbHNsLm91dHB1dH0gPSByZXN1bHQ7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgZW52LCBGdXNlZENvbnYyRCwgRnVzZWRDb252MkRBdHRycywgRnVzZWRDb252MkRJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7Q29udjJEUHJvZ3JhbX0gZnJvbSAnLi4vY29udl9ncHUnO1xuaW1wb3J0IHttYXBBY3RpdmF0aW9uVG9TaGFkZXJQcm9ncmFtfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuaW1wb3J0IHtjb252MmRCeU1hdE11bCwgY29udjJkV2l0aEltMlJvd30gZnJvbSAnLi9Db252MkRfaW1wbCc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBmdXNlZENvbnYyZChhcmdzOiB7XG4gIGlucHV0czogRnVzZWRDb252MkRJbnB1dHMsXG4gIGF0dHJzOiBGdXNlZENvbnYyREF0dHJzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMXG59KSB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4LCBmaWx0ZXIsIGJpYXMsIHByZWx1QWN0aXZhdGlvbldlaWdodHN9ID0gaW5wdXRzO1xuICBjb25zdCB7XG4gICAgc3RyaWRlcyxcbiAgICBwYWQsXG4gICAgZGF0YUZvcm1hdCxcbiAgICBkaWxhdGlvbnMsXG4gICAgZGltUm91bmRpbmdNb2RlLFxuICAgIGFjdGl2YXRpb24sXG4gICAgbGVha3lyZWx1QWxwaGFcbiAgfSA9IGF0dHJzO1xuXG4gIGNvbnN0ICRkYXRhRm9ybWF0ID0gYmFja2VuZF91dGlsLmNvbnZlcnRDb252MkREYXRhRm9ybWF0KGRhdGFGb3JtYXQpO1xuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyhcbiAgICAgIHguc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICBmaWx0ZXIuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLFxuICAgICAgZGltUm91bmRpbmdNb2RlLCBmYWxzZSAvKiBkZXB0aHdpc2UgKi8sICRkYXRhRm9ybWF0KTtcbiAgbGV0IG91dDogVGVuc29ySW5mbztcbiAgY29uc3QgaW50ZXJtZWRpYXRlczogVGVuc29ySW5mb1tdID0gW107XG5cbiAgaWYgKGNvbnZJbmZvLmZpbHRlckhlaWdodCA9PT0gMSAmJiBjb252SW5mby5maWx0ZXJXaWR0aCA9PT0gMSAmJlxuICAgICAgY29udkluZm8uZGlsYXRpb25IZWlnaHQgPT09IDEgJiYgY29udkluZm8uZGlsYXRpb25XaWR0aCA9PT0gMSAmJlxuICAgICAgY29udkluZm8uc3RyaWRlSGVpZ2h0ID09PSAxICYmIGNvbnZJbmZvLnN0cmlkZVdpZHRoID09PSAxICYmXG4gICAgICAoY29udkluZm8ucGFkSW5mby50eXBlID09PSAnU0FNRScgfHwgY29udkluZm8ucGFkSW5mby50eXBlID09PSAnVkFMSUQnKSkge1xuICAgIG91dCA9IGNvbnYyZEJ5TWF0TXVsKHtcbiAgICAgIHgsXG4gICAgICBmaWx0ZXIsXG4gICAgICBjb252SW5mbyxcbiAgICAgIGJhY2tlbmQsXG4gICAgICBiaWFzLFxuICAgICAgYWN0aXZhdGlvbixcbiAgICAgIHByZWx1QWN0aXZhdGlvbldlaWdodHMsXG4gICAgICBsZWFreXJlbHVBbHBoYVxuICAgIH0pO1xuICB9IGVsc2UgaWYgKGVudigpLmdldEJvb2woJ1dFQkdMX0NPTlZfSU0yQ09MJykgJiYgeC5zaGFwZVswXSA9PT0gMSkge1xuICAgIG91dCA9IGNvbnYyZFdpdGhJbTJSb3coe1xuICAgICAgeCxcbiAgICAgIGZpbHRlcixcbiAgICAgIGNvbnZJbmZvLFxuICAgICAgYmFja2VuZCxcbiAgICAgIGJpYXMsXG4gICAgICBhY3RpdmF0aW9uLFxuICAgICAgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyxcbiAgICAgIGxlYWt5cmVsdUFscGhhXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgaGFzQmlhcyA9IGJpYXMgIT0gbnVsbDtcbiAgICBjb25zdCBoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzID0gcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyAhPSBudWxsO1xuICAgIGNvbnN0IGhhc0xlYWt5cmVsdUFscGhhID0gYWN0aXZhdGlvbiA9PT0gJ2xlYWt5cmVsdSc7XG4gICAgY29uc3QgZnVzZWRBY3RpdmF0aW9uID1cbiAgICAgICAgYWN0aXZhdGlvbiA/IG1hcEFjdGl2YXRpb25Ub1NoYWRlclByb2dyYW0oYWN0aXZhdGlvbiwgZmFsc2UpIDogbnVsbDtcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IENvbnYyRFByb2dyYW0oXG4gICAgICAgIGNvbnZJbmZvLCBoYXNCaWFzLCBmdXNlZEFjdGl2YXRpb24sIGhhc1ByZWx1QWN0aXZhdGlvbldlaWdodHMsXG4gICAgICAgIGhhc0xlYWt5cmVsdUFscGhhKTtcbiAgICBjb25zdCBpbnB1dHM6IFRlbnNvckluZm9bXSA9IFt4LCBmaWx0ZXJdO1xuICAgIGlmIChiaWFzKSB7XG4gICAgICBpbnB1dHMucHVzaChiaWFzKTtcbiAgICB9XG4gICAgaWYgKHByZWx1QWN0aXZhdGlvbldlaWdodHMpIHtcbiAgICAgIGlucHV0cy5wdXNoKHByZWx1QWN0aXZhdGlvbldlaWdodHMpO1xuICAgIH1cbiAgICBpZiAoaGFzTGVha3lyZWx1QWxwaGEpIHtcbiAgICAgIGNvbnN0ICRsZWFreXJlbHVBbHBoYSA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8oXG4gICAgICAgICAgW10sICdmbG9hdDMyJyxcbiAgICAgICAgICB1dGlsLmNyZWF0ZVNjYWxhclZhbHVlKGxlYWt5cmVsdUFscGhhIGFzIHt9IGFzICdmbG9hdDMyJywgJ2Zsb2F0MzInKSk7XG4gICAgICBpbnB1dHMucHVzaCgkbGVha3lyZWx1QWxwaGEpO1xuICAgICAgaW50ZXJtZWRpYXRlcy5wdXNoKCRsZWFreXJlbHVBbHBoYSk7XG4gICAgfVxuICAgIG91dCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIGlucHV0cywgJ2Zsb2F0MzInKTtcbiAgfVxuXG4gIGNvbnN0IG91dFJlc2hhcGVkID1cbiAgICAgIHJlc2hhcGUoe2lucHV0czoge3g6IG91dH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IGNvbnZJbmZvLm91dFNoYXBlfX0pO1xuXG4gIGludGVybWVkaWF0ZXMucHVzaChvdXQpO1xuICBpbnRlcm1lZGlhdGVzLmZvckVhY2godCA9PiBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHQpKTtcblxuICByZXR1cm4gb3V0UmVzaGFwZWQ7XG59XG5cbmV4cG9ydCBjb25zdCBmdXNlZENvbnYyRENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBGdXNlZENvbnYyRCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGZ1c2VkQ29udjJkIGFzIHt9IGFzIEtlcm5lbEZ1bmMsXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgZW52LCBGdXNlZERlcHRod2lzZUNvbnYyRCwgRnVzZWREZXB0aHdpc2VDb252MkRBdHRycywgRnVzZWREZXB0aHdpc2VDb252MkRJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7RGVwdGh3aXNlQ29udjJEUHJvZ3JhbX0gZnJvbSAnLi4vY29udl9ncHVfZGVwdGh3aXNlJztcbmltcG9ydCB7RGVwdGh3aXNlQ29udlBhY2tlZDJEUHJvZ3JhbX0gZnJvbSAnLi4vY29udl9wYWNrZWRfZ3B1X2RlcHRod2lzZSc7XG5pbXBvcnQge21hcEFjdGl2YXRpb25Ub1NoYWRlclByb2dyYW19IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZnVzZWREZXB0aHdpc2VDb252MkQoYXJnczoge1xuICBpbnB1dHM6IEZ1c2VkRGVwdGh3aXNlQ29udjJESW5wdXRzLFxuICBhdHRyczogRnVzZWREZXB0aHdpc2VDb252MkRBdHRycyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTFxufSkge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eCwgZmlsdGVyLCBiaWFzLCBwcmVsdUFjdGl2YXRpb25XZWlnaHRzfSA9IGlucHV0cztcbiAgY29uc3Qge3N0cmlkZXMsIHBhZCwgZGlsYXRpb25zLCBkaW1Sb3VuZGluZ01vZGUsIGFjdGl2YXRpb24sIGxlYWt5cmVsdUFscGhhfSA9XG4gICAgICBhdHRycztcblxuICBjb25zdCBpbnRlcm1lZGlhdGVzOiBUZW5zb3JJbmZvW10gPSBbXTtcblxuICBsZXQgJGRpbGF0aW9ucyA9IGRpbGF0aW9ucztcbiAgaWYgKCRkaWxhdGlvbnMgPT0gbnVsbCkge1xuICAgICRkaWxhdGlvbnMgPSBbMSwgMV07XG4gIH1cblxuICB1dGlsLmFzc2VydChcbiAgICAgIGJhY2tlbmRfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgJGRpbGF0aW9ucyksXG4gICAgICAoKSA9PiAnRXJyb3IgaW4gZGVwdGh3aXNlQ29udjJkOiBFaXRoZXIgc3RyaWRlcyBvciBkaWxhdGlvbnMgbXVzdCBiZSAnICtcbiAgICAgICAgICBgMS4gR290IHN0cmlkZXMgJHtzdHJpZGVzfSBhbmQgZGlsYXRpb25zICckeyRkaWxhdGlvbnN9J2ApO1xuXG4gIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252MkRJbmZvKFxuICAgICAgeC5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgIGZpbHRlci5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgc3RyaWRlcywgJGRpbGF0aW9ucyxcbiAgICAgIHBhZCwgZGltUm91bmRpbmdNb2RlLCB0cnVlIC8qIGRlcHRod2lzZSAqLyk7XG5cbiAgY29uc3Qgc2hvdWxkUGFja0RlcHRod2lzZUNvbnYgPSBlbnYoKS5nZXRCb29sKCdXRUJHTF9QQUNLX0RFUFRIV0lTRUNPTlYnKSAmJlxuICAgICAgY29udkluZm8uc3RyaWRlV2lkdGggPD0gMiAmJlxuICAgICAgY29udkluZm8ub3V0Q2hhbm5lbHMgLyBjb252SW5mby5pbkNoYW5uZWxzID09PSAxO1xuICBjb25zdCBmdXNlZEFjdGl2YXRpb24gPSBhY3RpdmF0aW9uID9cbiAgICAgIG1hcEFjdGl2YXRpb25Ub1NoYWRlclByb2dyYW0oYWN0aXZhdGlvbiwgc2hvdWxkUGFja0RlcHRod2lzZUNvbnYpIDpcbiAgICAgIG51bGw7XG4gIGNvbnN0IHByb2dyYW1JbnB1dHM6IFRlbnNvckluZm9bXSA9IFt4LCBmaWx0ZXJdO1xuXG4gIGNvbnN0IGhhc0JpYXMgPSBiaWFzICE9IG51bGw7XG4gIGNvbnN0IGhhc1ByZWx1QWN0aXZhdGlvbldlaWdodHMgPSBwcmVsdUFjdGl2YXRpb25XZWlnaHRzICE9IG51bGw7XG4gIGNvbnN0IGhhc0xlYWt5cmVsdUFscGhhID0gYWN0aXZhdGlvbiA9PT0gJ2xlYWt5cmVsdSc7XG5cbiAgaWYgKGhhc0JpYXMpIHtcbiAgICBwcm9ncmFtSW5wdXRzLnB1c2goYmlhcyk7XG4gIH1cbiAgaWYgKGhhc1ByZWx1QWN0aXZhdGlvbldlaWdodHMpIHtcbiAgICBwcm9ncmFtSW5wdXRzLnB1c2gocHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyk7XG4gIH1cbiAgaWYgKGhhc0xlYWt5cmVsdUFscGhhKSB7XG4gICAgY29uc3QgJGxlYWt5cmVsdUFscGhhID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgICAgW10sICdmbG9hdDMyJyxcbiAgICAgICAgdXRpbC5jcmVhdGVTY2FsYXJWYWx1ZShsZWFreXJlbHVBbHBoYSBhcyB7fSBhcyAnZmxvYXQzMicsICdmbG9hdDMyJykpO1xuICAgIHByb2dyYW1JbnB1dHMucHVzaCgkbGVha3lyZWx1QWxwaGEpO1xuICAgIGludGVybWVkaWF0ZXMucHVzaCgkbGVha3lyZWx1QWxwaGEpO1xuICB9XG5cbiAgbGV0IHByb2dyYW06IERlcHRod2lzZUNvbnYyRFByb2dyYW18RGVwdGh3aXNlQ29udlBhY2tlZDJEUHJvZ3JhbTtcbiAgaWYgKHNob3VsZFBhY2tEZXB0aHdpc2VDb252KSB7XG4gICAgcHJvZ3JhbSA9IG5ldyBEZXB0aHdpc2VDb252UGFja2VkMkRQcm9ncmFtKFxuICAgICAgICBjb252SW5mbywgaGFzQmlhcywgZnVzZWRBY3RpdmF0aW9uLCBoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzLFxuICAgICAgICBoYXNMZWFreXJlbHVBbHBoYSk7XG4gIH0gZWxzZSB7XG4gICAgcHJvZ3JhbSA9IG5ldyBEZXB0aHdpc2VDb252MkRQcm9ncmFtKFxuICAgICAgICBjb252SW5mbywgaGFzQmlhcywgZnVzZWRBY3RpdmF0aW9uLCBoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzLFxuICAgICAgICBoYXNMZWFreXJlbHVBbHBoYSk7XG4gIH1cbiAgY29uc3QgY3VzdG9tVmFsdWVzID0gW1xuICAgIFtjb252SW5mby5wYWRJbmZvLnRvcCwgY29udkluZm8ucGFkSW5mby5sZWZ0XSxcbiAgICBbY29udkluZm8uc3RyaWRlSGVpZ2h0LCBjb252SW5mby5zdHJpZGVXaWR0aF0sXG4gICAgW2NvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0LCBjb252SW5mby5kaWxhdGlvbldpZHRoXSxcbiAgICBbY29udkluZm8uaW5IZWlnaHQsIGNvbnZJbmZvLmluV2lkdGhdXG4gIF07XG4gIGNvbnN0IHJlc3VsdCA9XG4gICAgICBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBwcm9ncmFtSW5wdXRzLCAnZmxvYXQzMicsIGN1c3RvbVZhbHVlcyk7XG5cbiAgaW50ZXJtZWRpYXRlcy5mb3JFYWNoKHQgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0KSk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGNvbnN0IGZ1c2VkRGVwdGh3aXNlQ29udjJEQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEZ1c2VkRGVwdGh3aXNlQ29udjJELFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogZnVzZWREZXB0aHdpc2VDb252MkQgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBHYXRoZXJOZCwgR2F0aGVyTmRJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7R2F0aGVyTkRQcm9ncmFtfSBmcm9tICcuLi9nYXRoZXJfbmRfZ3B1JztcbmltcG9ydCB7Z2F0aGVyTmRJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2F0aGVyTmQoXG4gICAgYXJnczoge2lucHV0czogR2F0aGVyTmRJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge3BhcmFtcywgaW5kaWNlc30gPSBpbnB1dHM7XG5cbiAgY29uc3QgaW5kaWNlc1NoYXBlID0gaW5kaWNlcy5zaGFwZTtcbiAgY29uc3Qgc2xpY2VSYW5rID0gaW5kaWNlc1NoYXBlW2luZGljZXNTaGFwZS5sZW5ndGggLSAxXTtcbiAgY29uc3QgcGFyYW1zU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShwYXJhbXMuc2hhcGUpO1xuXG4gIGNvbnN0IFtyZXN1bHRTaGFwZSwgbnVtU2xpY2VzLCBzbGljZVNpemUsIHN0cmlkZXNdID1cbiAgICAgIGJhY2tlbmRfdXRpbC5wcmVwYXJlQW5kVmFsaWRhdGUocGFyYW1zLCBpbmRpY2VzKTtcblxuICBjb25zdCBmbGF0dGVuSW5kaWNlcyA9IHJlc2hhcGUoXG4gICAgICB7aW5wdXRzOiB7eDogaW5kaWNlc30sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IFtudW1TbGljZXMsIHNsaWNlUmFua119fSk7XG4gIGNvbnN0IGZsYXR0ZW5YID0gcmVzaGFwZSh7XG4gICAgaW5wdXRzOiB7eDogcGFyYW1zfSxcbiAgICBiYWNrZW5kLFxuICAgIGF0dHJzOiB7c2hhcGU6IFsodXRpbC5zaXplRnJvbVNoYXBlKHBhcmFtcy5zaGFwZSkgLyBzbGljZVNpemUpLCBzbGljZVNpemVdfVxuICB9KTtcblxuICBpZiAoYmFja2VuZC5zaG91bGRFeGVjdXRlT25DUFUoW3BhcmFtcywgaW5kaWNlc10pIHx8XG4gICAgICBwYXJhbXMuZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgaW5kaWNlc0RhdGEgPSBiYWNrZW5kLnJlYWRTeW5jKGluZGljZXMuZGF0YUlkKSBhcyBUeXBlZEFycmF5O1xuICAgIGNvbnN0IHBhcmFtc0J1ZiA9IGJhY2tlbmQuYnVmZmVyU3luYyhwYXJhbXMpO1xuICAgIGNvbnN0IG91dFZhbHVlID0gZ2F0aGVyTmRJbXBsQ1BVKFxuICAgICAgICBpbmRpY2VzRGF0YSwgcGFyYW1zQnVmLCBwYXJhbXMuZHR5cGUsIG51bVNsaWNlcywgc2xpY2VSYW5rLCBzbGljZVNpemUsXG4gICAgICAgIHN0cmlkZXMsIHBhcmFtcy5zaGFwZSwgcGFyYW1zU2l6ZSk7XG5cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhyZXN1bHRTaGFwZSwgcGFyYW1zLmR0eXBlLCBvdXRWYWx1ZS52YWx1ZXMpO1xuICB9XG4gIGNvbnN0IHByb2dyYW0gPVxuICAgICAgbmV3IEdhdGhlck5EUHJvZ3JhbShzbGljZVJhbmssIHN0cmlkZXMsIFtudW1TbGljZXMsIHNsaWNlU2l6ZV0pO1xuICBjb25zdCByZXMgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShcbiAgICAgIHByb2dyYW0sIFtmbGF0dGVuWCwgZmxhdHRlbkluZGljZXNdLCBmbGF0dGVuWC5kdHlwZSk7XG5cbiAgY29uc3QgcmVzaGFwZWQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogcmVzfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogcmVzdWx0U2hhcGV9fSk7XG5cbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhmbGF0dGVuSW5kaWNlcyk7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oZmxhdHRlblgpO1xuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlcyk7XG5cbiAgcmV0dXJuIHJlc2hhcGVkO1xufVxuXG5leHBvcnQgY29uc3QgZ2F0aGVyTmRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogR2F0aGVyTmQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBnYXRoZXJOZCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgR2F0aGVyVjIsIEdhdGhlclYyQXR0cnMsIEdhdGhlclYySW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0dhdGhlclByb2dyYW19IGZyb20gJy4uL2dhdGhlcl9ncHUnO1xuaW1wb3J0IHtnYXRoZXJWMkltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnYXRoZXJWMihhcmdzOiB7XG4gIGlucHV0czogR2F0aGVyVjJJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBHYXRoZXJWMkF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4LCBpbmRpY2VzfSA9IGlucHV0cztcbiAgY29uc3Qge2F4aXMsIGJhdGNoRGltc30gPSBhdHRycztcblxuICBjb25zdCBwYXJzZWRBeGlzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShheGlzLCB4LnNoYXBlKVswXTtcbiAgY29uc3Qgc2hhcGVJbmZvID0gYmFja2VuZF91dGlsLnNlZ21lbnRfdXRpbC5jb2xsZWN0R2F0aGVyT3BTaGFwZUluZm8oXG4gICAgICB4LCBpbmRpY2VzLCBwYXJzZWRBeGlzLCBiYXRjaERpbXMpO1xuXG4gIGNvbnN0IGluZGljZXNTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKGluZGljZXMuc2hhcGUpO1xuXG4gIGNvbnN0IHRvRGlzcG9zZSA9IFtdO1xuXG4gIGNvbnN0IGZsYXR0ZW5YID0gcmVzaGFwZSh7XG4gICAgaW5wdXRzOiB7eH0sXG4gICAgYmFja2VuZCxcbiAgICBhdHRyczoge1xuICAgICAgc2hhcGU6IFtcbiAgICAgICAgc2hhcGVJbmZvLmJhdGNoU2l6ZSwgc2hhcGVJbmZvLm91dGVyU2l6ZSwgc2hhcGVJbmZvLmRpbVNpemUsXG4gICAgICAgIHNoYXBlSW5mby5zbGljZVNpemVcbiAgICAgIF1cbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IGZsYXR0ZW5JbmRleCA9IHJlc2hhcGUoe1xuICAgIGlucHV0czoge3g6IGluZGljZXN9LFxuICAgIGJhY2tlbmQsXG4gICAgYXR0cnM6IHtzaGFwZTogW3NoYXBlSW5mby5iYXRjaFNpemUsIGluZGljZXNTaXplIC8gc2hhcGVJbmZvLmJhdGNoU2l6ZV19XG4gIH0pO1xuXG4gIHRvRGlzcG9zZS5wdXNoKGZsYXR0ZW5YKTtcbiAgdG9EaXNwb3NlLnB1c2goZmxhdHRlbkluZGV4KTtcblxuICBjb25zdCBmbGF0dGVuT3V0cHV0U2hhcGUgPSBbXG4gICAgc2hhcGVJbmZvLmJhdGNoU2l6ZSwgc2hhcGVJbmZvLm91dGVyU2l6ZSwgaW5kaWNlc1NpemUgLyBzaGFwZUluZm8uYmF0Y2hTaXplLFxuICAgIHNoYXBlSW5mby5zbGljZVNpemVcbiAgXTtcblxuICBpZiAoYmFja2VuZC5zaG91bGRFeGVjdXRlT25DUFUoW3gsIGluZGljZXNdKSB8fCB4LmR0eXBlID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IGluZGljZXNCdWYgPSBiYWNrZW5kLmJ1ZmZlclN5bmMoZmxhdHRlbkluZGV4KTtcbiAgICBjb25zdCB4QnVmID0gYmFja2VuZC5idWZmZXJTeW5jKGZsYXR0ZW5YKTtcbiAgICBjb25zdCBvdXRCdWYgPSBnYXRoZXJWMkltcGxDUFUoeEJ1ZiwgaW5kaWNlc0J1ZiwgZmxhdHRlbk91dHB1dFNoYXBlKTtcblxuICAgIHRvRGlzcG9zZS5mb3JFYWNoKHQgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0KSk7XG5cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgICAgc2hhcGVJbmZvLm91dHB1dFNoYXBlLCBvdXRCdWYuZHR5cGUsIG91dEJ1Zi52YWx1ZXMgYXMgVHlwZWRBcnJheSk7XG4gIH1cblxuICBjb25zdCBwcm9ncmFtID0gbmV3IEdhdGhlclByb2dyYW0oZmxhdHRlblguc2hhcGUsIGZsYXR0ZW5PdXRwdXRTaGFwZSk7XG4gIGNvbnN0IHJlcyA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKFxuICAgICAgcHJvZ3JhbSwgW2ZsYXR0ZW5YLCBmbGF0dGVuSW5kZXhdLCBmbGF0dGVuWC5kdHlwZSk7XG4gIHRvRGlzcG9zZS5wdXNoKHJlcyk7XG5cbiAgY29uc3QgcmVzaGFwZWQgPSByZXNoYXBlKFxuICAgICAge2lucHV0czoge3g6IHJlc30sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IHNoYXBlSW5mby5vdXRwdXRTaGFwZX19KTtcbiAgdG9EaXNwb3NlLmZvckVhY2godCA9PiBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHQpKTtcbiAgcmV0dXJuIHJlc2hhcGVkO1xufVxuXG5leHBvcnQgY29uc3QgZ2F0aGVyVjJDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogR2F0aGVyVjIsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBnYXRoZXJWMiBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dyZWF0ZXIsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuY30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtiaW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7Z3JlYXRlckltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5jb25zdCBHUkVBVEVSID0gYHJldHVybiBmbG9hdChhID4gYik7YDtcbmNvbnN0IEdSRUFURVJfUEFDS0VEID0gYFxuICByZXR1cm4gdmVjNChncmVhdGVyVGhhbihhLCBiKSk7XG5gO1xuXG5leHBvcnQgY29uc3QgZ3JlYXRlciA9IGJpbmFyeUtlcm5lbEZ1bmMoe1xuICBvcFNuaXBwZXQ6IEdSRUFURVIsXG4gIHBhY2tlZE9wU25pcHBldDogR1JFQVRFUl9QQUNLRUQsXG4gIGNwdUtlcm5lbEltcGw6IGdyZWF0ZXJJbXBsQ1BVLFxuICBkdHlwZTogJ2Jvb2wnXG59KTtcblxuZXhwb3J0IGNvbnN0IGdyZWF0ZXJDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogR3JlYXRlcixcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGdyZWF0ZXIgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHcmVhdGVyRXF1YWwsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuY30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7YmluYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQge2dyZWF0ZXJFcXVhbEltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5jb25zdCBHUkVBVEVSX0VRVUFMID0gYHJldHVybiBmbG9hdChhID49IGIpO2A7XG5jb25zdCBHUkVBVEVSX0VRVUFMX1BBQ0tFRCA9IGBcbiAgcmV0dXJuIHZlYzQoZ3JlYXRlclRoYW5FcXVhbChhLCBiKSk7XG5gO1xuXG5leHBvcnQgY29uc3QgZ3JlYXRlckVxdWFsID0gYmluYXJ5S2VybmVsRnVuYyh7XG4gIG9wU25pcHBldDogR1JFQVRFUl9FUVVBTCxcbiAgcGFja2VkT3BTbmlwcGV0OiBHUkVBVEVSX0VRVUFMX1BBQ0tFRCxcbiAgZHR5cGU6ICdib29sJyxcbiAgY3B1S2VybmVsSW1wbDogZ3JlYXRlckVxdWFsSW1wbENQVVxufSk7XG5cbmV4cG9ydCBjb25zdCBncmVhdGVyRXF1YWxDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogR3JlYXRlckVxdWFsLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogZ3JlYXRlckVxdWFsIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7SUZGVCwgSUZGVElucHV0cywgS2VybmVsQ29uZmlnLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuXG5pbXBvcnQge2ZmdEltcGx9IGZyb20gJy4vRkZUX2ltcGwnO1xuXG5leHBvcnQgZnVuY3Rpb24gaWZmdChhcmdzOiB7aW5wdXRzOiBJRkZUSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge2lucHV0fSA9IGlucHV0cztcblxuICByZXR1cm4gZmZ0SW1wbChpbnB1dCwgdHJ1ZSAvKiBpbnZlcnNlICovLCBiYWNrZW5kKTtcbn1cblxuZXhwb3J0IGNvbnN0IGlmZnRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogSUZGVCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGlmZnRcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7SWRlbnRpdHksIElkZW50aXR5SW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eShcbiAgICBhcmdzOiB7aW5wdXRzOiBJZGVudGl0eUlucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTH0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG5cbiAgYmFja2VuZC5pbmNSZWYoeC5kYXRhSWQpO1xuXG4gIHJldHVybiB7ZGF0YUlkOiB4LmRhdGFJZCwgc2hhcGU6IHguc2hhcGUsIGR0eXBlOiB4LmR0eXBlfTtcbn1cblxuZXhwb3J0IGNvbnN0IGlkZW50aXR5Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IElkZW50aXR5LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogaWRlbnRpdHkgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtJbWFnLCBJbWFnSW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge2lkZW50aXR5fSBmcm9tICcuL0lkZW50aXR5JztcblxuZXhwb3J0IGZ1bmN0aW9uIGltYWcoYXJnczoge2lucHV0czogSW1hZ0lucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTH0pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kfSA9IGFyZ3M7XG4gIGNvbnN0IHtpbnB1dH0gPSBpbnB1dHM7XG4gIGNvbnN0IGlucHV0RGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQoaW5wdXQuZGF0YUlkKTtcblxuICByZXR1cm4gaWRlbnRpdHkoe2lucHV0czoge3g6IGlucHV0RGF0YS5jb21wbGV4VGVuc29ySW5mb3MuaW1hZ30sIGJhY2tlbmR9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGltYWdDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogSW1hZyxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGltYWcgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtJc0Zpbml0ZSwgS2VybmVsQ29uZmlnfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuXG5jb25zdCBJU19GSU5JVEUgPSBgcmV0dXJuIGZsb2F0KCFpc25hbih4KSAmJiAhaXNpbmYoeCkpO2A7XG5cbmV4cG9ydCBjb25zdCBpc0Zpbml0ZSA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBJU19GSU5JVEUsIGR0eXBlOiAnYm9vbCd9KTtcblxuZXhwb3J0IGNvbnN0IGlzRmluaXRlQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IElzRmluaXRlLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogaXNGaW5pdGUsXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0lzSW5mLCBLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge3VuYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5cbmNvbnN0IElTX0lORiA9IGByZXR1cm4gZmxvYXQoaXNpbmYoeCkpO2A7XG5cbmV4cG9ydCBjb25zdCBpc0luZiA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBJU19JTkYsIGR0eXBlOiAnYm9vbCd9KTtcblxuZXhwb3J0IGNvbnN0IGlzSW5mQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IElzSW5mLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogaXNJbmYsXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0lzTmFuLCBLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge3VuYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5cbmNvbnN0IElTX05BTiA9IGByZXR1cm4gZmxvYXQoaXNuYW4oeCkpO2A7XG5cbmV4cG9ydCBjb25zdCBpc05hTiA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBJU19OQU4sIGR0eXBlOiAnYm9vbCd9KTtcblxuZXhwb3J0IGNvbnN0IGlzTmFOQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IElzTmFuLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogaXNOYU4sXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2VudiwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBMUk4sIExSTkF0dHJzLCBMUk5JbnB1dHMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0xSTlByb2dyYW19IGZyb20gJy4uL2xybl9ncHUnO1xuaW1wb3J0IHtMUk5QYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9scm5fcGFja2VkX2dwdSc7XG5cbmV4cG9ydCBjb25zdCBscm4gPVxuICAgIChhcmdzOiB7aW5wdXRzOiBMUk5JbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsIGF0dHJzOiBMUk5BdHRyc30pOlxuICAgICAgICBUZW5zb3JJbmZvID0+IHtcbiAgICAgICAgICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICAgICAgICAgIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgICAgICAgICBjb25zdCB7ZGVwdGhSYWRpdXMsIGJpYXMsIGFscGhhLCBiZXRhfSA9IGF0dHJzO1xuXG4gICAgICAgICAgY29uc3QgcHJvZ3JhbSA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfTk9STUFMSVpBVElPTicpID9cbiAgICAgICAgICAgICAgbmV3IExSTlBhY2tlZFByb2dyYW0oeC5zaGFwZSwgZGVwdGhSYWRpdXMsIGJpYXMsIGFscGhhLCBiZXRhKSA6XG4gICAgICAgICAgICAgIG5ldyBMUk5Qcm9ncmFtKHguc2hhcGUsIGRlcHRoUmFkaXVzLCBiaWFzLCBhbHBoYSwgYmV0YSk7XG4gICAgICAgICAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4XSwgeC5kdHlwZSk7XG4gICAgICAgIH07XG5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogdmFyaWFibGUtbmFtZVxuZXhwb3J0IGNvbnN0IExSTkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBMUk4sXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBscm4gYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIExSTkdyYWQsIExSTkdyYWRBdHRycywgTFJOR3JhZElucHV0cywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7TFJOR3JhZFByb2dyYW19IGZyb20gJy4uL2xybl9ncmFkX2dwdSc7XG5cbmV4cG9ydCBjb25zdCBscm5HcmFkID0gKGFyZ3M6IHtcbiAgaW5wdXRzOiBMUk5HcmFkSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogTFJOR3JhZEF0dHJzXG59KTogVGVuc29ySW5mbyA9PiB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4LCB5LCBkeX0gPSBpbnB1dHM7XG4gIGNvbnN0IHtkZXB0aFJhZGl1cywgYmlhcywgYWxwaGEsIGJldGF9ID0gYXR0cnM7XG5cbiAgY29uc3QgcHJvZ3JhbSA9IG5ldyBMUk5HcmFkUHJvZ3JhbSh4LnNoYXBlLCBkZXB0aFJhZGl1cywgYmlhcywgYWxwaGEsIGJldGEpO1xuICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3gsIHksIGR5XSwgeC5kdHlwZSk7XG59O1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHZhcmlhYmxlLW5hbWVcbmV4cG9ydCBjb25zdCBMUk5HcmFkQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IExSTkdyYWQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBscm5HcmFkIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7ZW52LCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIExlYWt5UmVsdSwgTGVha3lSZWx1QXR0cnMsIExlYWt5UmVsdUlucHV0cywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0JpbmFyeU9wUHJvZ3JhbX0gZnJvbSAnLi4vYmluYXJ5b3BfZ3B1JztcbmltcG9ydCB7QmluYXJ5T3BQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9iaW5hcnlvcF9wYWNrZWRfZ3B1JztcblxuZXhwb3J0IGNvbnN0IExFQUtZUkVMVSA9IGByZXR1cm4gKGEgPCAwLikgPyBiICogYSA6IGE7YDtcbmV4cG9ydCBjb25zdCBMRUFLWVJFTFVfUEFDS0VEID0gYFxuICB2ZWM0IGFMZXNzVGhhblplcm8gPSB2ZWM0KGxlc3NUaGFuKGEsIHZlYzQoMC4pKSk7XG4gIHJldHVybiAoYUxlc3NUaGFuWmVybyAqIChiICogYSkpICsgKCh2ZWM0KDEuMCkgLSBhTGVzc1RoYW5aZXJvKSAqIGEpO1xuYDtcblxuZXhwb3J0IGZ1bmN0aW9uIGxlYWt5UmVsdShhcmdzOiB7XG4gIGlucHV0czogTGVha3lSZWx1SW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogTGVha3lSZWx1QXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7YWxwaGF9ID0gYXR0cnM7XG5cbiAgY29uc3QgJGFscGhhID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgIFtdLCAnZmxvYXQzMicsXG4gICAgICB1dGlsLmNyZWF0ZVNjYWxhclZhbHVlKGFscGhhIGFzIHt9IGFzICdmbG9hdDMyJywgJ2Zsb2F0MzInKSk7XG5cbiAgY29uc3QgcHJvZ3JhbSA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfQklOQVJZX09QRVJBVElPTlMnKSA/XG4gICAgICBuZXcgQmluYXJ5T3BQYWNrZWRQcm9ncmFtKExFQUtZUkVMVV9QQUNLRUQsIHguc2hhcGUsICRhbHBoYS5zaGFwZSkgOlxuICAgICAgbmV3IEJpbmFyeU9wUHJvZ3JhbShMRUFLWVJFTFUsIHguc2hhcGUsICRhbHBoYS5zaGFwZSk7XG4gIGNvbnN0IHJlc3VsdCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4LCAkYWxwaGFdLCB4LmR0eXBlKTtcblxuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKCRhbHBoYSk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGNvbnN0IGxlYWt5UmVsdUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBMZWFreVJlbHUsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBsZWFreVJlbHUgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIExlc3N9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7YmluYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQge2xlc3NJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuY29uc3QgTEVTUyA9IGByZXR1cm4gZmxvYXQoYSA8IGIpO2A7XG5jb25zdCBMRVNTX1BBQ0tFRCA9IGBcbiAgcmV0dXJuIHZlYzQobGVzc1RoYW4oYSwgYikpO1xuYDtcblxuZXhwb3J0IGNvbnN0IGxlc3MgPSBiaW5hcnlLZXJuZWxGdW5jKHtcbiAgb3BTbmlwcGV0OiBMRVNTLFxuICBwYWNrZWRPcFNuaXBwZXQ6IExFU1NfUEFDS0VELFxuICBjcHVLZXJuZWxJbXBsOiBsZXNzSW1wbENQVSxcbiAgZHR5cGU6ICdib29sJ1xufSk7XG5cbmV4cG9ydCBjb25zdCBsZXNzQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IExlc3MsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBsZXNzIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBMZXNzRXF1YWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7YmluYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQge2xlc3NFcXVhbEltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5leHBvcnQgY29uc3QgTEVTU19FUVVBTCA9IGByZXR1cm4gZmxvYXQoYSA8PSBiKTtgO1xuZXhwb3J0IGNvbnN0IExFU1NfRVFVQUxfUEFDS0VEID0gYFxuICByZXR1cm4gdmVjNChsZXNzVGhhbkVxdWFsKGEsIGIpKTtcbmA7XG5cbmV4cG9ydCBjb25zdCBsZXNzRXF1YWwgPSBiaW5hcnlLZXJuZWxGdW5jKHtcbiAgb3BTbmlwcGV0OiBMRVNTX0VRVUFMLFxuICBwYWNrZWRPcFNuaXBwZXQ6IExFU1NfRVFVQUxfUEFDS0VELFxuICBjcHVLZXJuZWxJbXBsOiBsZXNzRXF1YWxJbXBsQ1BVLFxuICBkdHlwZTogJ2Jvb2wnXG59KTtcblxuZXhwb3J0IGNvbnN0IGxlc3NFcXVhbENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBMZXNzRXF1YWwsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBsZXNzRXF1YWwgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIExpblNwYWNlLCBMaW5TcGFjZUF0dHJzLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtsaW5TcGFjZUltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5leHBvcnQgZnVuY3Rpb24gbGluU3BhY2UoXG4gICAgYXJnczoge2JhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsIGF0dHJzOiBMaW5TcGFjZUF0dHJzfSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7YmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3N0YXJ0LCBzdG9wLCBudW19ID0gYXR0cnM7XG5cbiAgLy8gVE9ETzogVXNlIENQVSBpbXBsZW1lbnRhdGlvbiBkdWUgdG8gdGhlIHByZWNpc2lvbiBwcm9ibGVtIGluIFNhZmFyaS5cbiAgY29uc3Qgb3V0VmFscyA9IGxpblNwYWNlSW1wbENQVShzdGFydCwgc3RvcCwgbnVtKTtcbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW291dFZhbHMubGVuZ3RoXSwgJ2Zsb2F0MzInLCBvdXRWYWxzKTtcbn1cblxuZXhwb3J0IGNvbnN0IGxpblNwYWNlQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IExpblNwYWNlLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogbGluU3BhY2UgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIExvZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7bG9nSW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5cbmNvbnN0IExPRyA9IGBpZiAoeCA8IDAuMCkgcmV0dXJuIE5BTjtcbiAgcmV0dXJuIGxvZyh4KTtgO1xuXG5jb25zdCBMT0dfUEFDS0VEID0gYFxuICB2ZWM0IHJlc3VsdCA9IGxvZyh4KTtcbiAgdmVjNCBpc05hTiA9IHZlYzQobGVzc1RoYW4oeCwgdmVjNCgwLjApKSk7XG4gIHJlc3VsdC5yID0gaXNOYU4uciA9PSAxLjAgPyBOQU4gOiByZXN1bHQucjtcbiAgcmVzdWx0LmcgPSBpc05hTi5nID09IDEuMCA/IE5BTiA6IHJlc3VsdC5nO1xuICByZXN1bHQuYiA9IGlzTmFOLmIgPT0gMS4wID8gTkFOIDogcmVzdWx0LmI7XG4gIHJlc3VsdC5hID0gaXNOYU4uYSA9PSAxLjAgPyBOQU4gOiByZXN1bHQuYTtcblxuICByZXR1cm4gcmVzdWx0O1xuYDtcblxuZXhwb3J0IGNvbnN0IGxvZyA9IHVuYXJ5S2VybmVsRnVuYyhcbiAgICB7b3BTbmlwcGV0OiBMT0csIHBhY2tlZE9wU25pcHBldDogTE9HX1BBQ0tFRCwgY3B1S2VybmVsSW1wbDogbG9nSW1wbENQVX0pO1xuXG5leHBvcnQgY29uc3QgbG9nQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IExvZyxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGxvZyBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgTG9nMXB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge3VuYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5cbmNvbnN0IExPRzFQID0gYHJldHVybiBsb2coMS4wICsgeCk7YDtcblxuZXhwb3J0IGNvbnN0IGxvZzFwID0gdW5hcnlLZXJuZWxGdW5jKHtvcFNuaXBwZXQ6IExPRzFQfSk7XG5cbmV4cG9ydCBjb25zdCBsb2cxcENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBMb2cxcCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGxvZzFwLFxufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIExvZ2ljYWxBbmR9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7YmluYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5cbmNvbnN0IExPR0lDQUxfQU5EID0gYHJldHVybiBmbG9hdChhID49IDEuMCAmJiBiID49IDEuMCk7YDtcbmNvbnN0IExPR0lDQUxfQU5EX1BBQ0tFRCA9IGBcbiAgcmV0dXJuIHZlYzQoXG4gICAgdmVjNChncmVhdGVyVGhhbkVxdWFsKGEsIHZlYzQoMS4wKSkpICpcbiAgICB2ZWM0KGdyZWF0ZXJUaGFuRXF1YWwoYiwgdmVjNCgxLjApKSkpO1xuYDtcblxuZXhwb3J0IGNvbnN0IGxvZ2ljYWxBbmQgPSBiaW5hcnlLZXJuZWxGdW5jKHtcbiAgb3BTbmlwcGV0OiBMT0dJQ0FMX0FORCxcbiAgcGFja2VkT3BTbmlwcGV0OiBMT0dJQ0FMX0FORF9QQUNLRUQsXG4gIGR0eXBlOiAnYm9vbCdcbn0pO1xuXG5leHBvcnQgY29uc3QgbG9naWNhbEFuZENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBMb2dpY2FsQW5kLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogbG9naWNhbEFuZCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgTG9naWNhbE5vdH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgTE9HSUNBTF9OT1QgPSBgcmV0dXJuIGZsb2F0KCEoeCA+PSAxLjApKTtgO1xuXG5leHBvcnQgY29uc3QgbG9naWNhbE5vdCA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBMT0dJQ0FMX05PVH0pO1xuXG5leHBvcnQgY29uc3QgbG9naWNhbE5vdENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBMb2dpY2FsTm90LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogbG9naWNhbE5vdCxcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBMb2dpY2FsT3J9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7YmluYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5cbmNvbnN0IExPR0lDQUxfT1IgPSBgcmV0dXJuIGZsb2F0KGEgPj0gMS4wIHx8IGIgPj0gMS4wKTtgO1xuY29uc3QgTE9HSUNBTF9PUl9QQUNLRUQgPSBgXG4gIHJldHVybiBtaW4oXG4gICAgdmVjNChncmVhdGVyVGhhbkVxdWFsKGEsIHZlYzQoMS4wKSkpICtcbiAgICB2ZWM0KGdyZWF0ZXJUaGFuRXF1YWwoYiwgdmVjNCgxLjApKSksXG4gICAgdmVjNCgxLjApKTtcbmA7XG5cbmV4cG9ydCBjb25zdCBsb2dpY2FsT3IgPSBiaW5hcnlLZXJuZWxGdW5jKFxuICAgIHtvcFNuaXBwZXQ6IExPR0lDQUxfT1IsIHBhY2tlZE9wU25pcHBldDogTE9HSUNBTF9PUl9QQUNLRUQsIGR0eXBlOiAnYm9vbCd9KTtcblxuZXhwb3J0IGNvbnN0IGxvZ2ljYWxPckNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBMb2dpY2FsT3IsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBsb2dpY2FsT3IgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxGdW5jLCBNYXgsIE1heEF0dHJzLCBNYXhJbnB1dHMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBUeXBlZEFycmF5LCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHttYXhJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuaW1wb3J0IHttYXhJbXBsfSBmcm9tICcuL01heF9pbXBsJztcbmltcG9ydCB7dHJhbnNwb3NlSW1wbCwgdHJhbnNwb3NlSW1wbENQVX0gZnJvbSAnLi9UcmFuc3Bvc2VfaW1wbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXgoXG4gICAgYXJnczoge2lucHV0czogTWF4SW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLCBhdHRyczogTWF4QXR0cnN9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7cmVkdWN0aW9uSW5kaWNlcywga2VlcERpbXN9ID0gYXR0cnM7XG5cbiAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcblxuICBjb25zdCBvcmlnQXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0ocmVkdWN0aW9uSW5kaWNlcywgeC5zaGFwZSk7XG4gIGxldCBheGVzID0gb3JpZ0F4ZXM7XG4gIGNvbnN0IHBlcm11dGVkQXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oYXhlcywgeFJhbmspO1xuICBjb25zdCBtYXhJbnB1dElzVHJhbnNwb3NlZCA9IHBlcm11dGVkQXhlcyAhPSBudWxsO1xuICBjb25zdCBzaG91bGRFeGVjdXRlT25DUFUgPSBiYWNrZW5kLnNob3VsZEV4ZWN1dGVPbkNQVShbeF0pO1xuXG4gIGxldCBtYXhJbnB1dCA9IHg7XG4gIGlmIChtYXhJbnB1dElzVHJhbnNwb3NlZCkge1xuICAgIGlmIChzaG91bGRFeGVjdXRlT25DUFUpIHtcbiAgICAgIGNvbnN0IHhUZXhEYXRhID0gYmFja2VuZC50ZXhEYXRhLmdldChtYXhJbnB1dC5kYXRhSWQpO1xuICAgICAgY29uc3QgdmFsdWVzID0geFRleERhdGEudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG5cbiAgICAgIGNvbnN0IG5ld1NoYXBlOiBudW1iZXJbXSA9IG5ldyBBcnJheSh4UmFuayk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld1NoYXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG5ld1NoYXBlW2ldID0geC5zaGFwZVtwZXJtdXRlZEF4ZXNbaV1dO1xuICAgICAgfVxuICAgICAgY29uc3QgbWF4SW5wdXRWYWx1ZXMgPVxuICAgICAgICAgIHRyYW5zcG9zZUltcGxDUFUodmFsdWVzLCB4LnNoYXBlLCB4LmR0eXBlLCBwZXJtdXRlZEF4ZXMsIG5ld1NoYXBlKTtcblxuICAgICAgbWF4SW5wdXQgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG5ld1NoYXBlLCB4LmR0eXBlKTtcbiAgICAgIGNvbnN0IG1heElucHV0RGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQobWF4SW5wdXQuZGF0YUlkKTtcbiAgICAgIG1heElucHV0RGF0YS52YWx1ZXMgPSBtYXhJbnB1dFZhbHVlcztcbiAgICB9IGVsc2Uge1xuICAgICAgbWF4SW5wdXQgPSB0cmFuc3Bvc2VJbXBsKHgsIHBlcm11dGVkQXhlcywgYmFja2VuZCk7XG4gICAgfVxuXG4gICAgYXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRJbm5lck1vc3RBeGVzKGF4ZXMubGVuZ3RoLCB4UmFuayk7XG4gIH1cblxuICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoJ21heCcsIGF4ZXMsIHhSYW5rKTtcbiAgY29uc3QgW21heE91dFNoYXBlLCByZWR1Y2VTaGFwZV0gPVxuICAgICAgYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMobWF4SW5wdXQuc2hhcGUsIGF4ZXMpO1xuXG4gIGxldCBvdXRTaGFwZSA9IG1heE91dFNoYXBlO1xuICBpZiAoa2VlcERpbXMpIHtcbiAgICAvLyByYXRoZXIgdGhhbiByZXNoYXBlIGF0IHRoZSBlbmQsIHNldCB0aGUgdGFyZ2V0IHNoYXBlIGhlcmUuXG4gICAgb3V0U2hhcGUgPSBiYWNrZW5kX3V0aWwuZXhwYW5kU2hhcGVUb0tlZXBEaW0obWF4T3V0U2hhcGUsIG9yaWdBeGVzKTtcbiAgfVxuXG4gIGxldCBvdXQ7XG4gIGlmIChzaG91bGRFeGVjdXRlT25DUFUpIHtcbiAgICBjb25zdCB4VGV4RGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQobWF4SW5wdXQuZGF0YUlkKTtcbiAgICBjb25zdCB2YWx1ZXMgPSB4VGV4RGF0YS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcblxuICAgIGNvbnN0IG91dFZhbHVlcyA9XG4gICAgICAgIG1heEltcGxDUFUodmFsdWVzLCB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpLCBvdXRTaGFwZSwgeC5kdHlwZSk7XG5cbiAgICBvdXQgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dFNoYXBlLCB4LmR0eXBlKTtcbiAgICBjb25zdCBvdXREYXRhID0gYmFja2VuZC50ZXhEYXRhLmdldChvdXQuZGF0YUlkKTtcbiAgICBvdXREYXRhLnZhbHVlcyA9IG91dFZhbHVlcztcbiAgfSBlbHNlIHtcbiAgICBvdXQgPSBtYXhJbXBsKG1heElucHV0LCByZWR1Y2VTaGFwZSwgb3V0U2hhcGUsIGJhY2tlbmQpO1xuICB9XG5cbiAgaWYgKG1heElucHV0SXNUcmFuc3Bvc2VkKSB7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhtYXhJbnB1dCk7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuXG5leHBvcnQgY29uc3QgbWF4Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE1heCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IG1heCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgTWF4UG9vbCwgTWF4UG9vbEF0dHJzLCBNYXhQb29sSW5wdXRzLCBUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtQb29sMkRQcm9ncmFtfSBmcm9tICcuLi9wb29sX2dwdSc7XG5pbXBvcnQge2Fzc2VydE5vdENvbXBsZXh9IGZyb20gJy4uL3dlYmdsX3V0aWwnO1xuaW1wb3J0IHtpZGVudGl0eX0gZnJvbSAnLi9JZGVudGl0eSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXhQb29sKGFyZ3M6IHtcbiAgaW5wdXRzOiBNYXhQb29sSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogTWF4UG9vbEF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnbWF4UG9vbCcpO1xuICBjb25zdCB7ZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGV9ID0gYXR0cnM7XG4gIGNvbnN0IGRpbGF0aW9ucyA9IDE7XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICBiYWNrZW5kX3V0aWwuZWl0aGVyU3RyaWRlc09yRGlsYXRpb25zQXJlT25lKHN0cmlkZXMsIGRpbGF0aW9ucyksXG4gICAgICAoKSA9PiAnRXJyb3IgaW4gbWF4UG9vbDogRWl0aGVyIHN0cmlkZXMgb3IgZGlsYXRpb25zIG11c3QgYmUgMS4gJyArXG4gICAgICAgICAgYEdvdCBzdHJpZGVzICR7c3RyaWRlc30gYW5kIGRpbGF0aW9ucyAnJHtkaWxhdGlvbnN9J2ApO1xuXG4gIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVQb29sMkRJbmZvKFxuICAgICAgeC5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgZmlsdGVyU2l6ZSwgc3RyaWRlcyxcbiAgICAgIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpO1xuICBpZiAoY29udkluZm8uZmlsdGVyV2lkdGggPT09IDEgJiYgY29udkluZm8uZmlsdGVySGVpZ2h0ID09PSAxICYmXG4gICAgICB1dGlsLmFycmF5c0VxdWFsKGNvbnZJbmZvLmluU2hhcGUsIGNvbnZJbmZvLm91dFNoYXBlKSkge1xuICAgIHJldHVybiBpZGVudGl0eSh7aW5wdXRzOiB7eH0sIGJhY2tlbmR9KTtcbiAgfVxuICBjb25zdCBtYXhQb29sUHJvZ3JhbSA9IG5ldyBQb29sMkRQcm9ncmFtKGNvbnZJbmZvLCAnbWF4JywgZmFsc2UpO1xuICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0obWF4UG9vbFByb2dyYW0sIFt4XSwgeC5kdHlwZSk7XG59XG5cbmV4cG9ydCBjb25zdCBtYXhQb29sQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE1heFBvb2wsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBtYXhQb29sIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBNYXhQb29sM0QsIE1heFBvb2wzREF0dHJzLCBNYXhQb29sM0RJbnB1dHMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge1Bvb2wzRFByb2dyYW19IGZyb20gJy4uL3Bvb2xfZ3B1JztcblxuZXhwb3J0IGZ1bmN0aW9uIG1heFBvb2wzZChhcmdzOiB7XG4gIGlucHV0czogTWF4UG9vbDNESW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogTWF4UG9vbDNEQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7ZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0LCBkaW1Sb3VuZGluZ01vZGV9ID0gYXR0cnM7XG4gIGNvbnN0IGRpbGF0aW9uczogW251bWJlciwgbnVtYmVyLCBudW1iZXJdID0gWzEsIDEsIDFdO1xuXG4gIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVQb29sM0RJbmZvKFxuICAgICAgeC5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBmaWx0ZXJTaXplLCBzdHJpZGVzLFxuICAgICAgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgZGF0YUZvcm1hdCk7XG4gIGNvbnN0IG1heFBvb2xQcm9ncmFtID0gbmV3IFBvb2wzRFByb2dyYW0oY29udkluZm8sICdtYXgnLCBmYWxzZSk7XG4gIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShtYXhQb29sUHJvZ3JhbSwgW3hdLCB4LmR0eXBlKTtcbn1cblxuZXhwb3J0IGNvbnN0IG1heFBvb2wzRENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBNYXhQb29sM0QsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBtYXhQb29sM2QgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7YmFja2VuZF91dGlsLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIE1heFBvb2wzREdyYWQsIE1heFBvb2wzREdyYWRBdHRycywgTWF4UG9vbDNER3JhZElucHV0cywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7TWF4UG9vbDNEQmFja3Byb3BQcm9ncmFtfSBmcm9tICcuLi9tYXhfcG9vbF9iYWNrcHJvcF9ncHUnO1xuaW1wb3J0IHtQb29sM0RQcm9ncmFtfSBmcm9tICcuLi9wb29sX2dwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXhQb29sM0RHcmFkKGFyZ3M6IHtcbiAgaW5wdXRzOiBNYXhQb29sM0RHcmFkSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogTWF4UG9vbDNER3JhZEF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtkeSwgaW5wdXR9ID0gaW5wdXRzO1xuICBjb25zdCB4ID0gaW5wdXQ7XG4gIGNvbnN0IHtmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZX0gPSBhdHRycztcbiAgY29uc3QgZGlsYXRpb25zOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPSBbMSwgMSwgMV07XG5cbiAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wzREluZm8oXG4gICAgICB4LnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGZpbHRlclNpemUsIHN0cmlkZXMsXG4gICAgICBkaWxhdGlvbnMsIHBhZCwgZGltUm91bmRpbmdNb2RlKTtcblxuICBjb25zdCBtYXhQb29sM2RQb3NpdGlvbnNQcm9ncmFtID1cbiAgICAgIG5ldyBQb29sM0RQcm9ncmFtKGNvbnZJbmZvLCAnbWF4JywgdHJ1ZSAvKiBnZXQgcG9zaXRpb25zICovKTtcbiAgY29uc3QgbWF4UG9vbDNkUG9zaXRpb25zID1cbiAgICAgIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKG1heFBvb2wzZFBvc2l0aW9uc1Byb2dyYW0sIFt4XSwgeC5kdHlwZSk7XG4gIGNvbnN0IG1heFBvb2xCYWNrcHJvcFByb2dyYW0gPSBuZXcgTWF4UG9vbDNEQmFja3Byb3BQcm9ncmFtKGNvbnZJbmZvKTtcbiAgY29uc3QgcmVzdWx0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0oXG4gICAgICBtYXhQb29sQmFja3Byb3BQcm9ncmFtLCBbZHksIG1heFBvb2wzZFBvc2l0aW9uc10sIHguZHR5cGUpO1xuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG1heFBvb2wzZFBvc2l0aW9ucyk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBjb25zdCBtYXhQb29sR3JhZDNEQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE1heFBvb2wzREdyYWQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBtYXhQb29sM0RHcmFkIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBNYXhQb29sR3JhZCwgTWF4UG9vbEdyYWRBdHRycywgTWF4UG9vbEdyYWRJbnB1dHMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge01heFBvb2wyREJhY2twcm9wUHJvZ3JhbX0gZnJvbSAnLi4vbWF4X3Bvb2xfYmFja3Byb3BfZ3B1JztcbmltcG9ydCB7UG9vbDJEUHJvZ3JhbX0gZnJvbSAnLi4vcG9vbF9ncHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi93ZWJnbF91dGlsJztcblxuZXhwb3J0IGZ1bmN0aW9uIG1heFBvb2xHcmFkKGFyZ3M6IHtcbiAgaW5wdXRzOiBNYXhQb29sR3JhZElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IE1heFBvb2xHcmFkQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2R5LCBpbnB1dCwgb3V0cHV0fSA9IGlucHV0cztcbiAgY29uc3QgeCA9IGlucHV0O1xuICBhc3NlcnROb3RDb21wbGV4KFtpbnB1dCwgb3V0cHV0XSwgJ21heFBvb2xHcmFkJyk7XG4gIGNvbnN0IHtmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZX0gPSBhdHRycztcblxuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlUG9vbDJESW5mbyhcbiAgICAgIHguc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGZpbHRlclNpemUsIHN0cmlkZXMsXG4gICAgICAxIC8qIGRpbGF0aW9ucyAqLywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpO1xuICBjb25zdCBnZXRQb3NpdGlvbnMgPSB0cnVlO1xuICBjb25zdCBtYXhQb29sUG9zaXRpb25zUHJvZ3JhbSA9XG4gICAgICBuZXcgUG9vbDJEUHJvZ3JhbShjb252SW5mbywgJ21heCcsIGdldFBvc2l0aW9ucyk7XG4gIGNvbnN0IG1heFBvb2xQb3NpdGlvbnM6IFRlbnNvckluZm8gPVxuICAgICAgYmFja2VuZC5ydW5XZWJHTFByb2dyYW0obWF4UG9vbFBvc2l0aW9uc1Byb2dyYW0sIFt4XSwgeC5kdHlwZSk7XG5cbiAgY29uc3QgbWF4UG9vbEJhY2tQcm9wUHJvZ3JhbSA9IG5ldyBNYXhQb29sMkRCYWNrcHJvcFByb2dyYW0oY29udkluZm8pO1xuICBjb25zdCByZXN1bHQgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShcbiAgICAgIG1heFBvb2xCYWNrUHJvcFByb2dyYW0sIFtkeSwgbWF4UG9vbFBvc2l0aW9uc10sIHguZHR5cGUpO1xuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG1heFBvb2xQb3NpdGlvbnMpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgY29uc3QgbWF4UG9vbEdyYWRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTWF4UG9vbEdyYWQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBtYXhQb29sR3JhZCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge01heFBvb2xXaXRoQXJnbWF4LCBNYXhQb29sV2l0aEFyZ21heEF0dHJzLCBNYXhQb29sV2l0aEFyZ21heElucHV0c30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7YmFja2VuZF91dGlsLCBLZXJuZWxDb25maWcsIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5cbmltcG9ydCB7bWF4UG9vbFdpdGhBcmdtYXhJbXBsfSBmcm9tICcuL01heFBvb2xXaXRoQXJnbWF4X2ltcGwnO1xuXG5leHBvcnQgY29uc3QgbWF4UG9vbFdpdGhBcmdtYXhDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTWF4UG9vbFdpdGhBcmdtYXgsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiAoe2lucHV0cywgYXR0cnMsIGJhY2tlbmR9KSA9PiB7XG4gICAgY29uc3Qge3h9ID0gaW5wdXRzIGFzIE1heFBvb2xXaXRoQXJnbWF4SW5wdXRzO1xuICAgIGNvbnN0IHtmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGluY2x1ZGVCYXRjaEluSW5kZXh9ID1cbiAgICAgICAgYXR0cnMgYXMge30gYXMgTWF4UG9vbFdpdGhBcmdtYXhBdHRycztcbiAgICBjb25zdCB3ZWJnbEJhY2tlbmQgPSBiYWNrZW5kIGFzIE1hdGhCYWNrZW5kV2ViR0w7XG5cbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgeC5zaGFwZS5sZW5ndGggPT09IDQsXG4gICAgICAgICgpID0+IGBFcnJvciBpbiBtYXhQb29sOiBpbnB1dCBtdXN0IGJlIHJhbmsgNCBidXQgZ290IHJhbmsgJHtcbiAgICAgICAgICAgIHguc2hhcGUubGVuZ3RofS5gKTtcbiAgICBjb25zdCBkaWxhdGlvbnM6IFtudW1iZXIsIG51bWJlcl0gPSBbMSwgMV07XG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIGJhY2tlbmRfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgZGlsYXRpb25zKSxcbiAgICAgICAgKCkgPT4gJ0Vycm9yIGluIG1heFBvb2w6IEVpdGhlciBzdHJpZGVzIG9yIGRpbGF0aW9ucyBtdXN0IGJlIDEuICcgK1xuICAgICAgICAgICAgYEdvdCBzdHJpZGVzICR7c3RyaWRlc30gYW5kIGRpbGF0aW9ucyAnJHtkaWxhdGlvbnN9J2ApO1xuXG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wyREluZm8oXG4gICAgICAgIHguc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGZpbHRlclNpemUsIHN0cmlkZXMsXG4gICAgICAgIGRpbGF0aW9ucywgcGFkKTtcblxuICAgIGNvbnN0IFtyZXN1bHQsIGluZGV4ZXNdID1cbiAgICAgICAgbWF4UG9vbFdpdGhBcmdtYXhJbXBsKHgsIGluY2x1ZGVCYXRjaEluSW5kZXgsIGNvbnZJbmZvLCB3ZWJnbEJhY2tlbmQpO1xuICAgIHJldHVybiBbcmVzdWx0LCBpbmRleGVzXTtcbiAgfVxufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge1Bvb2wyRFByb2dyYW19IGZyb20gJy4uL3Bvb2xfZ3B1JztcblxuZXhwb3J0IGZ1bmN0aW9uIG1heFBvb2xXaXRoQXJnbWF4SW1wbChcbiAgICB4OiBUZW5zb3JJbmZvLCBpbmNsdWRlQmF0Y2hJbkluZGV4OiBib29sZWFuLFxuICAgIGNvbnZJbmZvOiBiYWNrZW5kX3V0aWwuQ29udjJESW5mbyxcbiAgICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMKTogVGVuc29ySW5mb1tdIHtcbiAgbGV0IHByb2dyYW0gPSBuZXcgUG9vbDJEUHJvZ3JhbShjb252SW5mbywgJ21heCcsIGZhbHNlKTtcbiAgY29uc3QgcG9vbE91dHB1dCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4XSwgJ2Zsb2F0MzInKTtcblxuICBwcm9ncmFtID0gbmV3IFBvb2wyRFByb2dyYW0oY29udkluZm8sICdtYXgnLCB0cnVlLCB0cnVlLCBpbmNsdWRlQmF0Y2hJbkluZGV4KTtcbiAgY29uc3QgaW5kZXhPdXRwdXQgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeF0sICdmbG9hdDMyJyk7XG4gIHJldHVybiBbcG9vbE91dHB1dCwgaW5kZXhPdXRwdXRdO1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge3JlZHVjZX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3JlZHVjZSc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4uL2tlcm5lbHMvUmVzaGFwZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXhJbXBsKFxuICAgIHg6IFRlbnNvckluZm8sIHJlZHVjZVNoYXBlOiBudW1iZXJbXSwgb3V0U2hhcGU6IG51bWJlcltdLFxuICAgIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wpOiBUZW5zb3JJbmZvIHtcbiAgY29uc3QgaW5TaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcbiAgY29uc3QgeFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoeC5zaGFwZSk7XG4gIGNvbnN0IGJhdGNoU2l6ZSA9IHhTaXplIC8gaW5TaXplO1xuICBjb25zdCByZXNoYXBlZElucHV0ID1cbiAgICAgIHJlc2hhcGUoe2lucHV0czoge3h9LCBhdHRyczoge3NoYXBlOiBbYmF0Y2hTaXplLCBpblNpemVdfSwgYmFja2VuZH0pO1xuXG4gIGNvbnN0IHJlZHVjZWQgPSByZWR1Y2UocmVzaGFwZWRJbnB1dCwgeC5kdHlwZSwgJ21heCcsIGJhY2tlbmQpO1xuICBjb25zdCByZXNoYXBlZE91dHB1dCA9XG4gICAgICByZXNoYXBlKHtpbnB1dHM6IHt4OiByZWR1Y2VkfSwgYXR0cnM6IHtzaGFwZTogb3V0U2hhcGV9LCBiYWNrZW5kfSk7XG5cbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXNoYXBlZElucHV0KTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZWR1Y2VkKTtcblxuICByZXR1cm4gcmVzaGFwZWRPdXRwdXQ7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBNYXhpbXVtfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge0NIRUNLX05BTl9TTklQUEVUfSBmcm9tICcuLi9iaW5hcnlvcF9ncHUnO1xuaW1wb3J0IHtDSEVDS19OQU5fU05JUFBFVCBhcyBDSEVDS19OQU5fU05JUFBFVF9QQUNLRUR9IGZyb20gJy4uL2JpbmFyeW9wX3BhY2tlZF9ncHUnO1xuaW1wb3J0IHtiaW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7bWF4aW11bUltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5jb25zdCBNQVhJTVVNID0gQ0hFQ0tfTkFOX1NOSVBQRVQgKyBgXG4gIHJldHVybiBtYXgoYSwgYik7XG5gO1xuXG5jb25zdCBNQVhJTVVNX1BBQ0tFRCA9IGBcbiAgdmVjNCByZXN1bHQgPSB2ZWM0KG1heChhLCBiKSk7XG4gIHZlYzQgaXNOYU4gPSBtaW4odmVjNChpc25hbihhKSkgKyB2ZWM0KGlzbmFuKGIpKSwgdmVjNCgxLjApKTtcbiAgYCArXG4gICAgQ0hFQ0tfTkFOX1NOSVBQRVRfUEFDS0VEICsgYFxuICByZXR1cm4gcmVzdWx0O1xuYDtcblxuZXhwb3J0IGNvbnN0IG1heGltdW0gPSBiaW5hcnlLZXJuZWxGdW5jKHtcbiAgb3BTbmlwcGV0OiBNQVhJTVVNLFxuICBwYWNrZWRPcFNuaXBwZXQ6IE1BWElNVU1fUEFDS0VELFxuICBjcHVLZXJuZWxJbXBsOiBtYXhpbXVtSW1wbENQVVxufSk7XG5cbmV4cG9ydCBjb25zdCBtYXhpbXVtQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE1heGltdW0sXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBtYXhpbXVtIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBLZXJuZWxDb25maWcsIE1lYW4sIE1lYW5BdHRycywgTWVhbklucHV0cywgVGVuc29ySW5mbywgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcblxuaW1wb3J0IHttZWFuSW1wbH0gZnJvbSAnLi9NZWFuX2ltcGwnO1xuaW1wb3J0IHt0cmFuc3Bvc2VJbXBsLCB0cmFuc3Bvc2VJbXBsQ1BVfSBmcm9tICcuL1RyYW5zcG9zZV9pbXBsJztcblxuZXhwb3J0IGNvbnN0IG1lYW5Db25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTWVhbixcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6ICh7aW5wdXRzLCBhdHRycywgYmFja2VuZH0pID0+IHtcbiAgICBjb25zdCB7eH0gPSBpbnB1dHMgYXMgTWVhbklucHV0cztcbiAgICBjb25zdCB7a2VlcERpbXMsIGF4aXN9ID0gYXR0cnMgYXMge30gYXMgTWVhbkF0dHJzO1xuICAgIGNvbnN0IHdlYmdsQmFja2VuZCA9IGJhY2tlbmQgYXMgTWF0aEJhY2tlbmRXZWJHTDtcblxuICAgIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3Qgb3JpZ0F4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpO1xuXG4gICAgbGV0IGF4ZXMgPSBvcmlnQXhlcztcbiAgICBjb25zdCBwZXJtdXRlZEF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKGF4ZXMsIHhSYW5rKTtcbiAgICBjb25zdCBtZWFuSW5wdXRJc1RyYW5zcG9zZWQgPSBwZXJtdXRlZEF4ZXMgIT0gbnVsbDtcbiAgICBjb25zdCBzaG91bGRFeGVjdXRlT25DUFUgPSB3ZWJnbEJhY2tlbmQuc2hvdWxkRXhlY3V0ZU9uQ1BVKFt4XSk7XG5cbiAgICBjb25zdCBpbnRlcm1lZGlhdGVzOiBUZW5zb3JJbmZvW10gPSBbXTtcblxuICAgIGxldCBtZWFuSW5wdXQgPSB4O1xuICAgIGlmIChtZWFuSW5wdXRJc1RyYW5zcG9zZWQpIHtcbiAgICAgIGlmIChzaG91bGRFeGVjdXRlT25DUFUpIHtcbiAgICAgICAgY29uc3QgeFRleERhdGEgPSB3ZWJnbEJhY2tlbmQudGV4RGF0YS5nZXQobWVhbklucHV0LmRhdGFJZCk7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHhUZXhEYXRhLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuXG4gICAgICAgIGNvbnN0IG5ld1NoYXBlOiBudW1iZXJbXSA9IG5ldyBBcnJheSh4UmFuayk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3U2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBuZXdTaGFwZVtpXSA9IHguc2hhcGVbcGVybXV0ZWRBeGVzW2ldXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZWFuSW5wdXRWYWx1ZXMgPVxuICAgICAgICAgICAgdHJhbnNwb3NlSW1wbENQVSh2YWx1ZXMsIHguc2hhcGUsIHguZHR5cGUsIHBlcm11dGVkQXhlcywgbmV3U2hhcGUpO1xuXG4gICAgICAgIG1lYW5JbnB1dCA9IHdlYmdsQmFja2VuZC5tYWtlVGVuc29ySW5mbyhuZXdTaGFwZSwgeC5kdHlwZSk7XG4gICAgICAgIGNvbnN0IG1lYW5JbnB1dERhdGEgPSB3ZWJnbEJhY2tlbmQudGV4RGF0YS5nZXQobWVhbklucHV0LmRhdGFJZCk7XG4gICAgICAgIG1lYW5JbnB1dERhdGEudmFsdWVzID0gbWVhbklucHV0VmFsdWVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWVhbklucHV0ID0gdHJhbnNwb3NlSW1wbCh4LCBwZXJtdXRlZEF4ZXMsIHdlYmdsQmFja2VuZCk7XG4gICAgICB9XG5cbiAgICAgIGludGVybWVkaWF0ZXMucHVzaChtZWFuSW5wdXQpO1xuICAgICAgYXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRJbm5lck1vc3RBeGVzKGF4ZXMubGVuZ3RoLCB4UmFuayk7XG4gICAgfVxuXG4gICAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdzdW0nLCBheGVzLCB4UmFuayk7XG4gICAgY29uc3QgW21lYW5PdXRTaGFwZSwgcmVkdWNlU2hhcGVdID1cbiAgICAgICAgYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMobWVhbklucHV0LnNoYXBlLCBheGVzKTtcblxuICAgIGxldCBvdXRTaGFwZSA9IG1lYW5PdXRTaGFwZTtcbiAgICBpZiAoa2VlcERpbXMpIHtcbiAgICAgIC8vIHJhdGhlciB0aGFuIHJlc2hhcGUgYXQgdGhlIGVuZCwgc2V0IHRoZSB0YXJnZXQgc2hhcGUgaGVyZS5cbiAgICAgIG91dFNoYXBlID0gYmFja2VuZF91dGlsLmV4cGFuZFNoYXBlVG9LZWVwRGltKG1lYW5PdXRTaGFwZSwgb3JpZ0F4ZXMpO1xuICAgIH1cblxuICAgIGNvbnN0IG91dCA9IG1lYW5JbXBsKG1lYW5JbnB1dCwgcmVkdWNlU2hhcGUsIG91dFNoYXBlLCB3ZWJnbEJhY2tlbmQpO1xuICAgIGZvciAoY29uc3QgaSBvZiBpbnRlcm1lZGlhdGVzKSB7XG4gICAgICB3ZWJnbEJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dDtcbiAgfVxufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtyZWR1Y2V9IGZyb20gJy4uL2tlcm5lbF91dGlscy9yZWR1Y2UnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuLi9rZXJuZWxzL1Jlc2hhcGUnO1xuXG5leHBvcnQgZnVuY3Rpb24gbWVhbkltcGwoXG4gICAgeDogVGVuc29ySW5mbywgcmVkdWNlU2hhcGU6IG51bWJlcltdLCBvdXRTaGFwZTogbnVtYmVyW10sXG4gICAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCk6IFRlbnNvckluZm8ge1xuICBjb25zdCBpblNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuICBjb25zdCB4U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSh4LnNoYXBlKTtcbiAgY29uc3QgYmF0Y2hTaXplID0geFNpemUgLyBpblNpemU7XG4gIGNvbnN0IHJlc2hhcGVkSW5wdXQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eH0sIGF0dHJzOiB7c2hhcGU6IFtiYXRjaFNpemUsIGluU2l6ZV19LCBiYWNrZW5kfSk7XG5cbiAgY29uc3QgcmVkdWNlZCA9IHJlZHVjZShyZXNoYXBlZElucHV0LCAnZmxvYXQzMicsICdtZWFuJywgYmFja2VuZCk7XG4gIGNvbnN0IHJlc2hhcGVkT3V0cHV0ID1cbiAgICAgIHJlc2hhcGUoe2lucHV0czoge3g6IHJlZHVjZWR9LCBhdHRyczoge3NoYXBlOiBvdXRTaGFwZX0sIGJhY2tlbmR9KTtcblxuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc2hhcGVkSW5wdXQpO1xuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlZHVjZWQpO1xuXG4gIHJldHVybiByZXNoYXBlZE91dHB1dDtcbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgTWluLCBNaW5BdHRycywgTWluSW5wdXRzLCBUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtyZWR1Y2V9IGZyb20gJy4uL2tlcm5lbF91dGlscy9yZWR1Y2UnO1xuXG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQge3RyYW5zcG9zZX0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gbWluKFxuICAgIGFyZ3M6IHtpbnB1dHM6IE1pbklucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCwgYXR0cnM6IE1pbkF0dHJzfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge2F4aXMsIGtlZXBEaW1zfSA9IGF0dHJzO1xuXG4gIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG5cbiAgY29uc3Qgb3JpZ0F4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpO1xuICBsZXQgYXhlcyA9IG9yaWdBeGVzO1xuICBjb25zdCBwZXJtdXRlZEF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKGF4ZXMsIHhSYW5rKTtcbiAgbGV0IHBlcm11dGVkWCA9IHg7XG4gIGlmIChwZXJtdXRlZEF4ZXMgIT0gbnVsbCkge1xuICAgIHBlcm11dGVkWCA9IHRyYW5zcG9zZSh7aW5wdXRzOiB7eH0sIGJhY2tlbmQsIGF0dHJzOiB7cGVybTogcGVybXV0ZWRBeGVzfX0pO1xuICAgIGF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0SW5uZXJNb3N0QXhlcyhheGVzLmxlbmd0aCwgeC5zaGFwZS5sZW5ndGgpO1xuICB9XG5cbiAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdtaW4nLCBheGVzLCB4UmFuayk7XG4gIGNvbnN0IFtvdXRTaGFwZSwgcmVkdWNlU2hhcGVdID1cbiAgICAgIGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKHBlcm11dGVkWC5zaGFwZSwgYXhlcyk7XG4gIGNvbnN0IGluU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShyZWR1Y2VTaGFwZSk7XG4gIGNvbnN0IGEyRCA9XG4gICAgICByZXNoYXBlKHtpbnB1dHM6IHt4OiBwZXJtdXRlZFh9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBbLTEsIGluU2l6ZV19fSk7XG4gIGNvbnN0IHJlZHVjZWQgPSByZWR1Y2UoYTJELCBhMkQuZHR5cGUsICdtaW4nLCBiYWNrZW5kKTtcblxuICBsZXQgcmVzO1xuICBpZiAoa2VlcERpbXMpIHtcbiAgICBjb25zdCBuZXdTaGFwZSA9IGJhY2tlbmRfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbShvdXRTaGFwZSwgb3JpZ0F4ZXMpO1xuICAgIHJlcyA9IHJlc2hhcGUoe2lucHV0czoge3g6IHJlZHVjZWR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBuZXdTaGFwZX19KTtcbiAgfSBlbHNlIHtcbiAgICByZXMgPSByZXNoYXBlKHtpbnB1dHM6IHt4OiByZWR1Y2VkfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogb3V0U2hhcGV9fSk7XG4gIH1cblxuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGEyRCk7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVkdWNlZCk7XG5cbiAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhwZXJtdXRlZFgpO1xuICB9XG5cbiAgcmV0dXJuIHJlcztcbn1cblxuZXhwb3J0IGNvbnN0IG1pbkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBNaW4sXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBtaW4gYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIE1pbmltdW19IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7Q0hFQ0tfTkFOX1NOSVBQRVR9IGZyb20gJy4uL2JpbmFyeW9wX2dwdSc7XG5pbXBvcnQge0NIRUNLX05BTl9TTklQUEVUIGFzIENIRUNLX05BTl9TTklQUEVUX1BBQ0tFRH0gZnJvbSAnLi4vYmluYXJ5b3BfcGFja2VkX2dwdSc7XG5pbXBvcnQge2JpbmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHttaW5pbXVtSW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5cbmNvbnN0IE1JTklNVU0gPSBDSEVDS19OQU5fU05JUFBFVCArIGBcbiAgcmV0dXJuIG1pbihhLCBiKTtcbmA7XG5cbmNvbnN0IE1JTklNVU1fUEFDS0VEID0gYFxuICB2ZWM0IHJlc3VsdCA9IHZlYzQobWluKGEsIGIpKTtcbiAgdmVjNCBpc05hTiA9IG1pbih2ZWM0KGlzbmFuKGEpKSArIHZlYzQoaXNuYW4oYikpLCB2ZWM0KDEuMCkpO1xuICBgICtcbiAgICBDSEVDS19OQU5fU05JUFBFVF9QQUNLRUQgKyBgXG4gIHJldHVybiByZXN1bHQ7XG5gO1xuXG5leHBvcnQgY29uc3QgbWluaW11bSA9IGJpbmFyeUtlcm5lbEZ1bmMoe1xuICBvcFNuaXBwZXQ6IE1JTklNVU0sXG4gIHBhY2tlZE9wU25pcHBldDogTUlOSU1VTV9QQUNLRUQsXG4gIGNwdUtlcm5lbEltcGw6IG1pbmltdW1JbXBsQ1BVXG59KTtcblxuZXhwb3J0IGNvbnN0IG1pbmltdW1Db25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTWluaW11bSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IG1pbmltdW0gYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtlbnYsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgTWlycm9yUGFkLCBNaXJyb3JQYWRBdHRycywgTWlycm9yUGFkSW5wdXRzLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtNaXJyb3JQYWRQcm9ncmFtfSBmcm9tICcuLi9taXJyb3JfcGFkX2dwdSc7XG5pbXBvcnQge01pcnJvclBhZFBhY2tlZFByb2dyYW19IGZyb20gJy4uL21pcnJvcl9wYWRfcGFja2VkX2dwdSc7XG5cbmV4cG9ydCBjb25zdCBtaXJyb3JQYWRLZXJuZWxGdW5jOiAocGFyYW1zOiB7XG4gIGlucHV0czogTWlycm9yUGFkSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogTWlycm9yUGFkQXR0cnNcbn0pID0+IFRlbnNvckluZm8gPSAoe2lucHV0cywgYmFja2VuZCwgYXR0cnN9KSA9PiB7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge3BhZGRpbmdzLCBtb2RlfSA9IGF0dHJzO1xuXG4gIGNvbnN0IHByb2dyYW0gPSBlbnYoKS5nZXRCb29sKCdXRUJHTF9QQUNLX0FSUkFZX09QRVJBVElPTlMnKSA/XG4gICAgICBuZXcgTWlycm9yUGFkUGFja2VkUHJvZ3JhbSh4LnNoYXBlLCBwYWRkaW5ncywgbW9kZSkgOlxuICAgICAgbmV3IE1pcnJvclBhZFByb2dyYW0oeC5zaGFwZSwgcGFkZGluZ3MsIG1vZGUpO1xuXG4gIGNvbnN0IG91dHB1dCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4XSwgeC5kdHlwZSk7XG5cbiAgcmV0dXJuIG91dHB1dDtcbn07XG5cbmV4cG9ydCBjb25zdCBtaXJyb3JQYWRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTWlycm9yUGFkLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogbWlycm9yUGFkS2VybmVsRnVuYyBhcyB7fSBhcyBLZXJuZWxGdW5jLFxufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIE1vZH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtDSEVDS19OQU5fU05JUFBFVH0gZnJvbSAnLi4vYmluYXJ5b3BfcGFja2VkX2dwdSc7XG5pbXBvcnQge2JpbmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuXG5jb25zdCBNT0QgPSBgaWYgKGIgPT0gMC4wKSByZXR1cm4gTkFOO1xuICByZXR1cm4gbW9kKGEsIGIpO2A7XG5cbmNvbnN0IE1PRF9QQUNLRUQgPSBgXG4gIHZlYzQgcmVzdWx0ID0gbW9kKGEsIGIpO1xuICB2ZWM0IGlzTmFOID0gdmVjNChlcXVhbChiLCB2ZWM0KDAuMCkpKTtcbiAgYCArXG4gICAgQ0hFQ0tfTkFOX1NOSVBQRVQgKyBgXG4gIHJldHVybiByZXN1bHQ7XG5gO1xuXG5leHBvcnQgY29uc3QgbW9kID0gYmluYXJ5S2VybmVsRnVuYyh7XG4gIG9wU25pcHBldDogTU9ELFxuICBwYWNrZWRPcFNuaXBwZXQ6IE1PRF9QQUNLRUQsXG59KTtcblxuZXhwb3J0IGNvbnN0IG1vZENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBNb2QsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBtb2QgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIE11bHRpbm9taWFsLCBNdWx0aW5vbWlhbEF0dHJzLCBNdWx0aW5vbWlhbElucHV0cywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7TXVsdGlub21pYWxQcm9ncmFtfSBmcm9tICcuLi9tdWx0aW5vbWlhbF9ncHUnO1xuXG5pbXBvcnQge3NvZnRtYXh9IGZyb20gJy4vU29mdG1heCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aW5vbWlhbChhcmdzOiB7XG4gIGlucHV0czogTXVsdGlub21pYWxJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBNdWx0aW5vbWlhbEF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtsb2dpdHN9ID0gaW5wdXRzO1xuICBjb25zdCB7bnVtU2FtcGxlcywgc2VlZCwgbm9ybWFsaXplZH0gPSBhdHRycztcblxuICBjb25zdCBwcm9icyA9IG5vcm1hbGl6ZWQgP1xuICAgICAgbG9naXRzIDpcbiAgICAgIHNvZnRtYXgoXG4gICAgICAgICAge2lucHV0czoge2xvZ2l0c30sIGJhY2tlbmQsIGF0dHJzOiB7ZGltOiBsb2dpdHMuc2hhcGUubGVuZ3RoIC0gMX19KTtcbiAgY29uc3QgYmF0Y2hTaXplID0gcHJvYnMuc2hhcGVbMF07XG4gIGNvbnN0IG51bU91dGNvbWVzID0gcHJvYnMuc2hhcGVbMV07XG4gIGNvbnN0IHByb2dyYW0gPSBuZXcgTXVsdGlub21pYWxQcm9ncmFtKGJhdGNoU2l6ZSwgbnVtT3V0Y29tZXMsIG51bVNhbXBsZXMpO1xuICBjb25zdCBjdXN0b21WYWx1ZXMgPSBbW3NlZWRdXTtcbiAgY29uc3QgcmVzID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3Byb2JzXSwgJ2ludDMyJywgY3VzdG9tVmFsdWVzKTtcbiAgaWYgKCFub3JtYWxpemVkKSB7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhwcm9icyk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxuZXhwb3J0IGNvbnN0IG11bHRpbm9taWFsQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE11bHRpbm9taWFsLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogbXVsdGlub21pYWwgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIEJpbmFyeUlucHV0cywgZW52LCBLZXJuZWxDb25maWcsIE11bHRpcGx5LCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0ICogYXMgYmluYXJ5b3BfY29tcGxleF9ncHUgZnJvbSAnLi4vYmluYXJ5b3BfY29tcGxleF9ncHUnO1xuaW1wb3J0IHtCaW5hcnlPcENvbXBsZXhQcm9ncmFtfSBmcm9tICcuLi9iaW5hcnlvcF9jb21wbGV4X2dwdSc7XG5pbXBvcnQge0JpbmFyeU9wUHJvZ3JhbX0gZnJvbSAnLi4vYmluYXJ5b3BfZ3B1JztcbmltcG9ydCB7QmluYXJ5T3BQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9iaW5hcnlvcF9wYWNrZWRfZ3B1JztcbmltcG9ydCB7bXVsdGlwbHlJbXBsQ1BVIGFzIGNwdU11bHRpcGx5fSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuaW1wb3J0IHtjb21wbGV4fSBmcm9tICcuL0NvbXBsZXgnO1xuXG5jb25zdCBNVUwgPSAncmV0dXJuIGEgKiBiOyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseShcbiAgICBhcmdzOiB7aW5wdXRzOiBCaW5hcnlJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge2EsIGJ9ID0gaW5wdXRzO1xuICBjb25zdCBkdHlwZSA9IGJhY2tlbmRfdXRpbC51cGNhc3RUeXBlKGEuZHR5cGUsIGIuZHR5cGUpO1xuXG4gIGlmIChhLmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgIGNvbnN0IGFEYXRhID0gYmFja2VuZC50ZXhEYXRhLmdldChhLmRhdGFJZCk7XG4gICAgY29uc3QgYkRhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KGIuZGF0YUlkKTtcblxuICAgIGNvbnN0IHJlYWxQcm9ncmFtID0gbmV3IEJpbmFyeU9wQ29tcGxleFByb2dyYW0oXG4gICAgICAgIGJpbmFyeW9wX2NvbXBsZXhfZ3B1LkNPTVBMRVhfTVVMVElQTFkuUkVBTCwgYS5zaGFwZSwgYi5zaGFwZSk7XG4gICAgY29uc3QgaW1hZ1Byb2dyYW0gPSBuZXcgQmluYXJ5T3BDb21wbGV4UHJvZ3JhbShcbiAgICAgICAgYmluYXJ5b3BfY29tcGxleF9ncHUuQ09NUExFWF9NVUxUSVBMWS5JTUFHLCBhLnNoYXBlLCBiLnNoYXBlKTtcblxuICAgIGNvbnN0IGlucHV0cyA9IFtcbiAgICAgIHtcbiAgICAgICAgZGF0YUlkOiBhRGF0YS5jb21wbGV4VGVuc29ySW5mb3MucmVhbC5kYXRhSWQsXG4gICAgICAgIGR0eXBlOiBhRGF0YS5jb21wbGV4VGVuc29ySW5mb3MucmVhbC5kdHlwZSxcbiAgICAgICAgc2hhcGU6IGEuc2hhcGVcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGRhdGFJZDogYURhdGEuY29tcGxleFRlbnNvckluZm9zLmltYWcuZGF0YUlkLFxuICAgICAgICBkdHlwZTogYURhdGEuY29tcGxleFRlbnNvckluZm9zLmltYWcuZHR5cGUsXG4gICAgICAgIHNoYXBlOiBhLnNoYXBlXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBkYXRhSWQ6IGJEYXRhLmNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsLmRhdGFJZCxcbiAgICAgICAgZHR5cGU6IGJEYXRhLmNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsLmR0eXBlLFxuICAgICAgICBzaGFwZTogYi5zaGFwZVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZGF0YUlkOiBiRGF0YS5jb21wbGV4VGVuc29ySW5mb3MuaW1hZy5kYXRhSWQsXG4gICAgICAgIGR0eXBlOiBiRGF0YS5jb21wbGV4VGVuc29ySW5mb3MuaW1hZy5kdHlwZSxcbiAgICAgICAgc2hhcGU6IGIuc2hhcGVcbiAgICAgIH1cbiAgICBdO1xuXG4gICAgY29uc3QgcmVhbFBhcnQgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShyZWFsUHJvZ3JhbSwgaW5wdXRzLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IGltYWdQYXJ0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0oaW1hZ1Byb2dyYW0sIGlucHV0cywgJ2Zsb2F0MzInKTtcblxuICAgIGNvbnN0IGNvbXBsZXhPdXRwdXQgPVxuICAgICAgICBjb21wbGV4KHtpbnB1dHM6IHtyZWFsOiByZWFsUGFydCwgaW1hZzogaW1hZ1BhcnR9LCBiYWNrZW5kfSk7XG5cbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlYWxQYXJ0KTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGltYWdQYXJ0KTtcblxuICAgIC8vIFRPRE8oYW5ueGluZ3l1YW4pOiBDUFUgZm9yd2FyZGluZyBmb3IgY29tcGxleCBpbnB1dHMuXG4gICAgcmV0dXJuIGNvbXBsZXhPdXRwdXQ7XG4gIH1cblxuICBpZiAoYmFja2VuZC5zaG91bGRFeGVjdXRlT25DUFUoW2EsIGJdKSkge1xuICAgIGNvbnN0IGFEYXRhID0gYmFja2VuZC50ZXhEYXRhLmdldChhLmRhdGFJZCk7XG4gICAgY29uc3QgYkRhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KGIuZGF0YUlkKTtcbiAgICBjb25zdCBbb3V0VmFsdWVzLCBvdXRTaGFwZV0gPSBjcHVNdWx0aXBseShcbiAgICAgICAgYS5zaGFwZSwgYi5zaGFwZSwgYURhdGEudmFsdWVzIGFzIFR5cGVkQXJyYXksXG4gICAgICAgIGJEYXRhLnZhbHVlcyBhcyBUeXBlZEFycmF5LCBkdHlwZSk7XG5cbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dFNoYXBlLCBkdHlwZSk7XG4gICAgY29uc3Qgb3V0RGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQob3V0LmRhdGFJZCk7XG4gICAgb3V0RGF0YS52YWx1ZXMgPSBvdXRWYWx1ZXM7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIGxldCBwcm9ncmFtOiBCaW5hcnlPcFByb2dyYW18QmluYXJ5T3BQYWNrZWRQcm9ncmFtO1xuICBpZiAoZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19CSU5BUllfT1BFUkFUSU9OUycpKSB7XG4gICAgcHJvZ3JhbSA9IG5ldyBCaW5hcnlPcFBhY2tlZFByb2dyYW0oTVVMLCBhLnNoYXBlLCBiLnNoYXBlKTtcbiAgfSBlbHNlIHtcbiAgICBwcm9ncmFtID0gbmV3IEJpbmFyeU9wUHJvZ3JhbShNVUwsIGEuc2hhcGUsIGIuc2hhcGUpO1xuICB9XG5cbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFthLCBiXSwgZHR5cGUpO1xufVxuXG5leHBvcnQgY29uc3QgbXVsdGlwbHlDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTXVsdGlwbHksXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBtdWx0aXBseVxufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtlbnYsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgTmVnLCBOZWdJbnB1dHMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtuZWdJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmltcG9ydCB7VW5hcnlPcFByb2dyYW19IGZyb20gJy4uL3VuYXJ5b3BfZ3B1JztcbmltcG9ydCB7VW5hcnlPcFBhY2tlZFByb2dyYW19IGZyb20gJy4uL3VuYXJ5b3BfcGFja2VkX2dwdSc7XG5cbmNvbnN0IE5FRyA9IGByZXR1cm4gLXg7YDtcblxuLy8gVGhpcyBkb2Vzbid0IHVzZSB1bmFyeUtlcm5lbEZ1bmMgYmVjYXVzZSBuZWdJbXBsQ1BVIGlzIG5vdCBvZiB0eXBlXG4vLyBTaW1wbGVVbmFyeUtlcm5lbEltcGxDUFUuXG5leHBvcnQgZnVuY3Rpb24gbmVnKGFyZ3M6IHtpbnB1dHM6IE5lZ0lucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTH0pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcblxuICBpZiAoYmFja2VuZC5zaG91bGRFeGVjdXRlT25DUFUoW3hdKSkge1xuICAgIGNvbnN0IHhEYXRhID0gYmFja2VuZC50ZXhEYXRhLmdldCh4LmRhdGFJZCk7XG4gICAgY29uc3QgW291dFZhbHVlcywgbmV3U2hhcGVdID1cbiAgICAgICAgbmVnSW1wbENQVSh4RGF0YS52YWx1ZXMgYXMgVHlwZWRBcnJheSwgeC5zaGFwZSwgeC5kdHlwZSk7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8obmV3U2hhcGUsIHguZHR5cGUsIG91dFZhbHVlcyk7XG4gIH1cblxuICBsZXQgcHJvZ3JhbTogVW5hcnlPcFByb2dyYW18VW5hcnlPcFBhY2tlZFByb2dyYW07XG4gIGlmIChlbnYoKS5nZXRCb29sKCdXRUJHTF9QQUNLX1VOQVJZX09QRVJBVElPTlMnKSkge1xuICAgIHByb2dyYW0gPSBuZXcgVW5hcnlPcFBhY2tlZFByb2dyYW0oeC5zaGFwZSwgTkVHKTtcbiAgfSBlbHNlIHtcbiAgICBwcm9ncmFtID0gbmV3IFVuYXJ5T3BQcm9ncmFtKHguc2hhcGUsIE5FRyk7XG4gIH1cblxuICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3hdLCB4LmR0eXBlKTtcbn1cblxuZXhwb3J0IGNvbnN0IG5lZ0NvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBOZWcsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBuZWcgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIGtlcm5lbF9pbXBscywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBOb25NYXhTdXBwcmVzc2lvblYzLCBOb25NYXhTdXBwcmVzc2lvblYzQXR0cnMsIE5vbk1heFN1cHByZXNzaW9uVjNJbnB1dHMsIFR5cGVkQXJyYXl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmNvbnN0IG5vbk1heFN1cHByZXNzaW9uVjNJbXBsID0ga2VybmVsX2ltcGxzLm5vbk1heFN1cHByZXNzaW9uVjNJbXBsO1xuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcblxuZXhwb3J0IGZ1bmN0aW9uIG5vbk1heFN1cHByZXNzaW9uVjMoYXJnczoge1xuICBpbnB1dHM6IE5vbk1heFN1cHByZXNzaW9uVjNJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBOb25NYXhTdXBwcmVzc2lvblYzQXR0cnNcbn0pIHtcbiAgYmFja2VuZF91dGlsLndhcm4oXG4gICAgICAndGYubm9uTWF4U3VwcHJlc3Npb24oKSBpbiB3ZWJnbCBsb2NrcyB0aGUgVUkgdGhyZWFkLiAnICtcbiAgICAgICdDYWxsIHRmLm5vbk1heFN1cHByZXNzaW9uQXN5bmMoKSBpbnN0ZWFkJyk7XG5cbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2JveGVzLCBzY29yZXN9ID0gaW5wdXRzO1xuICBjb25zdCB7bWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZH0gPSBhdHRycztcblxuICBjb25zdCBib3hlc1ZhbHMgPSBiYWNrZW5kLnJlYWRTeW5jKGJveGVzLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcbiAgY29uc3Qgc2NvcmVzVmFscyA9IGJhY2tlbmQucmVhZFN5bmMoc2NvcmVzLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcblxuICBjb25zdCB7c2VsZWN0ZWRJbmRpY2VzfSA9IG5vbk1heFN1cHByZXNzaW9uVjNJbXBsKFxuICAgICAgYm94ZXNWYWxzLCBzY29yZXNWYWxzLCBtYXhPdXRwdXRTaXplLCBpb3VUaHJlc2hvbGQsIHNjb3JlVGhyZXNob2xkKTtcblxuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgIFtzZWxlY3RlZEluZGljZXMubGVuZ3RoXSwgJ2ludDMyJywgbmV3IEludDMyQXJyYXkoc2VsZWN0ZWRJbmRpY2VzKSk7XG59XG5cbmV4cG9ydCBjb25zdCBub25NYXhTdXBwcmVzc2lvblYzQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE5vbk1heFN1cHByZXNzaW9uVjMsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBub25NYXhTdXBwcmVzc2lvblYzIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBrZXJuZWxfaW1wbHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgTm9uTWF4U3VwcHJlc3Npb25WNCwgTm9uTWF4U3VwcHJlc3Npb25WNEF0dHJzLCBOb25NYXhTdXBwcmVzc2lvblY0SW5wdXRzLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25WNEltcGwgPSBrZXJuZWxfaW1wbHMubm9uTWF4U3VwcHJlc3Npb25WNEltcGw7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBub25NYXhTdXBwcmVzc2lvblY0KGFyZ3M6IHtcbiAgaW5wdXRzOiBOb25NYXhTdXBwcmVzc2lvblY0SW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogTm9uTWF4U3VwcHJlc3Npb25WNEF0dHJzXG59KTogW1RlbnNvckluZm8sIFRlbnNvckluZm9dIHtcbiAgYmFja2VuZF91dGlsLndhcm4oXG4gICAgICAndGYubm9uTWF4U3VwcHJlc3Npb24oKSBpbiB3ZWJnbCBsb2NrcyB0aGUgVUkgdGhyZWFkLiAnICtcbiAgICAgICdDYWxsIHRmLm5vbk1heFN1cHByZXNzaW9uQXN5bmMoKSBpbnN0ZWFkJyk7XG5cbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2JveGVzLCBzY29yZXN9ID0gaW5wdXRzO1xuICBjb25zdCB7bWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCwgcGFkVG9NYXhPdXRwdXRTaXplfSA9XG4gICAgICBhdHRycztcblxuICBjb25zdCBib3hlc1ZhbHMgPSBiYWNrZW5kLnJlYWRTeW5jKGJveGVzLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcbiAgY29uc3Qgc2NvcmVzVmFscyA9IGJhY2tlbmQucmVhZFN5bmMoc2NvcmVzLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcblxuICBjb25zdCB7c2VsZWN0ZWRJbmRpY2VzLCB2YWxpZE91dHB1dHN9ID0gbm9uTWF4U3VwcHJlc3Npb25WNEltcGwoXG4gICAgICBib3hlc1ZhbHMsIHNjb3Jlc1ZhbHMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsXG4gICAgICBwYWRUb01heE91dHB1dFNpemUpO1xuXG4gIHJldHVybiBbXG4gICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgICAgW3NlbGVjdGVkSW5kaWNlcy5sZW5ndGhdLCAnaW50MzInLCBuZXcgSW50MzJBcnJheShzZWxlY3RlZEluZGljZXMpKSxcbiAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtdLCAnaW50MzInLCBuZXcgSW50MzJBcnJheShbdmFsaWRPdXRwdXRzXSkpXG4gIF07XG59XG5cbmV4cG9ydCBjb25zdCBub25NYXhTdXBwcmVzc2lvblY0Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE5vbk1heFN1cHByZXNzaW9uVjQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBub25NYXhTdXBwcmVzc2lvblY0IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBrZXJuZWxfaW1wbHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgTm9uTWF4U3VwcHJlc3Npb25WNSwgTm9uTWF4U3VwcHJlc3Npb25WNUF0dHJzLCBOb25NYXhTdXBwcmVzc2lvblY1SW5wdXRzLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5jb25zdCBub25NYXhTdXBwcmVzc2lvblY1SW1wbCA9IGtlcm5lbF9pbXBscy5ub25NYXhTdXBwcmVzc2lvblY1SW1wbDtcbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBub25NYXhTdXBwcmVzc2lvblY1KGFyZ3M6IHtcbiAgaW5wdXRzOiBOb25NYXhTdXBwcmVzc2lvblY1SW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogTm9uTWF4U3VwcHJlc3Npb25WNUF0dHJzXG59KTogW1RlbnNvckluZm8sIFRlbnNvckluZm9dIHtcbiAgYmFja2VuZF91dGlsLndhcm4oXG4gICAgICAndGYubm9uTWF4U3VwcHJlc3Npb24oKSBpbiB3ZWJnbCBsb2NrcyB0aGUgVUkgdGhyZWFkLiAnICtcbiAgICAgICdDYWxsIHRmLm5vbk1heFN1cHByZXNzaW9uQXN5bmMoKSBpbnN0ZWFkJyk7XG5cbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2JveGVzLCBzY29yZXN9ID0gaW5wdXRzO1xuICBjb25zdCB7bWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCwgc29mdE5tc1NpZ21hfSA9IGF0dHJzO1xuXG4gIGNvbnN0IGJveGVzVmFscyA9IGJhY2tlbmQucmVhZFN5bmMoYm94ZXMuZGF0YUlkKSBhcyBUeXBlZEFycmF5O1xuICBjb25zdCBzY29yZXNWYWxzID0gYmFja2VuZC5yZWFkU3luYyhzY29yZXMuZGF0YUlkKSBhcyBUeXBlZEFycmF5O1xuXG4gIGNvbnN0IG1heE91dHB1dFNpemVWYWwgPSBtYXhPdXRwdXRTaXplO1xuICBjb25zdCBpb3VUaHJlc2hvbGRWYWwgPSBpb3VUaHJlc2hvbGQ7XG4gIGNvbnN0IHNjb3JlVGhyZXNob2xkVmFsID0gc2NvcmVUaHJlc2hvbGQ7XG4gIGNvbnN0IHNvZnRObXNTaWdtYVZhbCA9IHNvZnRObXNTaWdtYTtcblxuICBjb25zdCB7c2VsZWN0ZWRJbmRpY2VzLCBzZWxlY3RlZFNjb3Jlc30gPSBub25NYXhTdXBwcmVzc2lvblY1SW1wbChcbiAgICAgIGJveGVzVmFscywgc2NvcmVzVmFscywgbWF4T3V0cHV0U2l6ZVZhbCwgaW91VGhyZXNob2xkVmFsLFxuICAgICAgc2NvcmVUaHJlc2hvbGRWYWwsIHNvZnRObXNTaWdtYVZhbCk7XG5cbiAgcmV0dXJuIFtcbiAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFxuICAgICAgICBbc2VsZWN0ZWRJbmRpY2VzLmxlbmd0aF0sICdpbnQzMicsIG5ldyBJbnQzMkFycmF5KHNlbGVjdGVkSW5kaWNlcykpLFxuICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oXG4gICAgICAgIFtzZWxlY3RlZFNjb3Jlcy5sZW5ndGhdLCAnZmxvYXQzMicsIG5ldyBGbG9hdDMyQXJyYXkoc2VsZWN0ZWRTY29yZXMpKVxuICBdO1xufVxuXG5leHBvcnQgY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25WNUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBOb25NYXhTdXBwcmVzc2lvblY1LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogbm9uTWF4U3VwcHJlc3Npb25WNSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge05vdEVxdWFsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge2JpbmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHtub3RFcXVhbEltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5jb25zdCBOT1RfRVFVQUwgPSBgcmV0dXJuIGZsb2F0KGEgIT0gYik7YDtcblxuZXhwb3J0IGNvbnN0IG5vdEVxdWFsID0gYmluYXJ5S2VybmVsRnVuYyhcbiAgICB7b3BTbmlwcGV0OiBOT1RfRVFVQUwsIGNwdUtlcm5lbEltcGw6IG5vdEVxdWFsSW1wbENQVSwgZHR5cGU6ICdib29sJ30pO1xuXG5leHBvcnQgY29uc3Qgbm90RXF1YWxDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTm90RXF1YWwsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBub3RFcXVhbCxcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBPbmVIb3QsIE9uZUhvdEF0dHJzLCBPbmVIb3RJbnB1dHMsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge09uZUhvdFByb2dyYW19IGZyb20gJy4uL29uZWhvdF9ncHUnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuXG5leHBvcnQgY29uc3Qgb25lSG90ID0gKGFyZ3M6IHtcbiAgaW5wdXRzOiBPbmVIb3RJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBPbmVIb3RBdHRyc1xufSk6IFRlbnNvckluZm8gPT4ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7aW5kaWNlc30gPSBpbnB1dHM7XG4gIGNvbnN0IHtkZXB0aCwgb25WYWx1ZSwgb2ZmVmFsdWV9ID0gYXR0cnM7XG5cbiAgY29uc3QgaW5kaWNlc1NpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoaW5kaWNlcy5zaGFwZSk7XG4gIGNvbnN0IHByb2dyYW0gPSBuZXcgT25lSG90UHJvZ3JhbShpbmRpY2VzU2l6ZSwgZGVwdGgsIG9uVmFsdWUsIG9mZlZhbHVlKTtcbiAgY29uc3QgcmVzaGFwZWQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogaW5kaWNlc30sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IFtpbmRpY2VzU2l6ZV19fSk7XG4gIGNvbnN0IHJlc3VsdCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtyZXNoYXBlZF0sIGluZGljZXMuZHR5cGUpO1xuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc2hhcGVkKTtcblxuICBjb25zdCBvdXRTaGFwZSA9IFsuLi5pbmRpY2VzLnNoYXBlLCBkZXB0aF07XG4gIGNvbnN0IG91dCA9IHJlc2hhcGUoe2lucHV0czoge3g6IHJlc3VsdH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IG91dFNoYXBlfX0pO1xuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc3VsdCk7XG4gIHJldHVybiBvdXQ7XG59O1xuXG5leHBvcnQgY29uc3Qgb25lSG90Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE9uZUhvdCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IG9uZUhvdCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgT25lc0xpa2UsIE9uZXNMaWtlSW5wdXRzLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuXG5pbXBvcnQge2NvbXBsZXh9IGZyb20gJy4vQ29tcGxleCc7XG5pbXBvcnQge2ZpbGx9IGZyb20gJy4vRmlsbCc7XG5pbXBvcnQge2ltYWd9IGZyb20gJy4vSW1hZyc7XG5pbXBvcnQge3JlYWx9IGZyb20gJy4vUmVhbCc7XG5pbXBvcnQge3plcm9zTGlrZX0gZnJvbSAnLi9aZXJvc0xpa2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gb25lc0xpa2UoXG4gICAgYXJnczoge2lucHV0czogT25lc0xpa2VJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuXG4gIGlmICh4LmR0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcignb25lc0xpa2UgaXMgbm90IHN1cHBvcnRlZCB1bmRlciBzdHJpbmcgZHR5cGUnKTtcbiAgfSBlbHNlIGlmICh4LmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgIGNvbnN0IHJlYWxQYXJ0ID0gcmVhbCh7aW5wdXRzOiB7aW5wdXQ6IHh9LCBiYWNrZW5kfSk7XG4gICAgY29uc3QgciA9IG9uZXNMaWtlKHtpbnB1dHM6IHt4OiByZWFsUGFydH0sIGJhY2tlbmR9KTtcbiAgICBjb25zdCBpbWFnUGFydCA9IGltYWcoe2lucHV0czoge2lucHV0OiB4fSwgYmFja2VuZH0pO1xuICAgIGNvbnN0IGkgPSB6ZXJvc0xpa2Uoe2lucHV0czoge3g6IGltYWdQYXJ0fSwgYmFja2VuZH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gY29tcGxleCh7aW5wdXRzOiB7cmVhbDogciwgaW1hZzogaX0sIGJhY2tlbmR9KTtcblxuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVhbFBhcnQpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocik7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpbWFnUGFydCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gZWxzZSB7XG4gICAgLy8gVE9ETyhjYWlzLCBzbWlsa292KTogQWRkIFdlYkdMIHNoYWRlciBmb3Igb25lc0xpa2U6XG4gICAgLy8gICBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZmpzL2lzc3Vlcy8xMjkzXG4gICAgcmV0dXJuIGZpbGwoe2F0dHJzOiB7c2hhcGU6IHguc2hhcGUsIGR0eXBlOiB4LmR0eXBlLCB2YWx1ZTogMX0sIGJhY2tlbmR9KTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgb25lc0xpa2VDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogT25lc0xpa2UsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBvbmVzTGlrZSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgUGFjaywgUGFja0F0dHJzLCBQYWNrSW5wdXRzLCBUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtjb25jYXR9IGZyb20gJy4vQ29uY2F0JztcbmltcG9ydCB7ZXhwYW5kRGltc30gZnJvbSAnLi9FeHBhbmREaW1zJztcblxuZXhwb3J0IGZ1bmN0aW9uIHBhY2soXG4gICAgYXJnczoge2lucHV0czogUGFja0lucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCwgYXR0cnM6IFBhY2tBdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7YXhpc30gPSBhdHRycztcblxuICBpZiAoaW5wdXRzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBleHBhbmREaW1zKFxuICAgICAgICB7aW5wdXRzOiB7aW5wdXQ6IGlucHV0c1swXX0sIGJhY2tlbmQsIGF0dHJzOiB7ZGltOiBheGlzfX0pO1xuICB9XG5cbiAgY29uc3Qgc2hhcGUgPSBpbnB1dHNbMF0uc2hhcGU7XG4gIGNvbnN0IGR0eXBlID0gaW5wdXRzWzBdLmR0eXBlO1xuXG4gIGlucHV0cy5mb3JFYWNoKHQgPT4ge1xuICAgIHV0aWwuYXNzZXJ0U2hhcGVzTWF0Y2goXG4gICAgICAgIHNoYXBlLCB0LnNoYXBlLFxuICAgICAgICAnQWxsIHRlbnNvcnMgcGFzc2VkIHRvIHN0YWNrIG11c3QgaGF2ZSBtYXRjaGluZyBzaGFwZXMnKTtcbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgZHR5cGUgPT09IHQuZHR5cGUsXG4gICAgICAgICgpID0+ICdBbGwgdGVuc29ycyBwYXNzZWQgdG8gc3RhY2sgbXVzdCBoYXZlIG1hdGNoaW5nIGR0eXBlcycpO1xuICB9KTtcblxuICBjb25zdCBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvczogVGVuc29ySW5mb1tdID0gW107XG4gIGNvbnN0IGV4cGFuZGVkVGVuc29ycyA9IGlucHV0cy5tYXAodCA9PiB7XG4gICAgY29uc3QgZXhwYW5kZWRUID1cbiAgICAgICAgZXhwYW5kRGltcyh7aW5wdXRzOiB7aW5wdXQ6IHR9LCBiYWNrZW5kLCBhdHRyczoge2RpbTogYXhpc319KTtcbiAgICBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcy5wdXNoKGV4cGFuZGVkVCk7XG4gICAgcmV0dXJuIGV4cGFuZGVkVDtcbiAgfSk7XG5cbiAgY29uc3QgcmVzdWx0ID0gY29uY2F0KHtpbnB1dHM6IGV4cGFuZGVkVGVuc29ycywgYmFja2VuZCwgYXR0cnM6IHtheGlzfX0pO1xuXG4gIGludGVybWVkaWF0ZVRlbnNvckluZm9zLmZvckVhY2goXG4gICAgICB0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBjb25zdCBwYWNrQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFBhY2ssXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBwYWNrIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7ZW52LCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFBhZFYyLCBQYWRWMkF0dHJzLCBQYWRWMklucHV0cywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7UGFkUHJvZ3JhbX0gZnJvbSAnLi4vcGFkX2dwdSc7XG5pbXBvcnQge1BhZFBhY2tlZFByb2dyYW19IGZyb20gJy4uL3BhZF9wYWNrZWRfZ3B1JztcbmltcG9ydCB7ZmlsbH0gZnJvbSAnLi9GaWxsJztcblxuZXhwb3J0IGNvbnN0IHBhZFYyID1cbiAgICAoYXJnczoge2lucHV0czogUGFkVjJJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsIGF0dHJzOiBQYWRWMkF0dHJzfSk6XG4gICAgICAgIFRlbnNvckluZm8gPT4ge1xuICAgICAgICAgIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gICAgICAgICAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICAgICAgICAgIGNvbnN0IHtwYWRkaW5ncywgY29uc3RhbnRWYWx1ZX0gPSBhdHRycztcblxuICAgICAgICAgIGlmICh1dGlsLnNpemVGcm9tU2hhcGUoeC5zaGFwZSkgPT09IDApIHtcbiAgICAgICAgICAgIC8vIFNob3J0LWNpcmN1aXQgdGhlIGNvbXB1dGF0aW9uLCBzaW5jZSB4IGRvZXNuJ3QgaGF2ZSB2YWx1ZSwgb25seVxuICAgICAgICAgICAgLy8gdGhlIHNoYXBlIGlzIHVzZWQgdG8gY29tcHV0ZSBvdXRwdXQgc2hhcGUgdG8gcGFkLlxuICAgICAgICAgICAgY29uc3Qgb3V0cHV0U2hhcGUgPSBwYWRkaW5ncy5tYXAoXG4gICAgICAgICAgICAgICAgKHAsIGkpID0+XG4gICAgICAgICAgICAgICAgICAgIHBbMF0gLyogYmVmb3JlUGFkICovICsgeC5zaGFwZVtpXSArIHBbMV0gLyogYWZ0ZXJQYWQgKi8pO1xuICAgICAgICAgICAgcmV0dXJuIGZpbGwoe1xuICAgICAgICAgICAgICBiYWNrZW5kLFxuICAgICAgICAgICAgICBhdHRyczoge3NoYXBlOiBvdXRwdXRTaGFwZSwgdmFsdWU6IGNvbnN0YW50VmFsdWUsIGR0eXBlOiB4LmR0eXBlfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgcHJvZ3JhbSA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfQVJSQVlfT1BFUkFUSU9OUycpID9cbiAgICAgICAgICAgICAgbmV3IFBhZFBhY2tlZFByb2dyYW0oeC5zaGFwZSwgcGFkZGluZ3MsIGNvbnN0YW50VmFsdWUpIDpcbiAgICAgICAgICAgICAgbmV3IFBhZFByb2dyYW0oeC5zaGFwZSwgcGFkZGluZ3MsIGNvbnN0YW50VmFsdWUpO1xuICAgICAgICAgIGNvbnN0IGN1c3RvbVZhbHVlcyA9IFtbY29uc3RhbnRWYWx1ZV1dO1xuICAgICAgICAgIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeF0sIHguZHR5cGUsIGN1c3RvbVZhbHVlcyk7XG4gICAgICAgIH07XG5cbmV4cG9ydCBjb25zdCBwYWRWMkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBQYWRWMixcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHBhZFYyIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBQb3d9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7Q0hFQ0tfTkFOX1NOSVBQRVR9IGZyb20gJy4uL2JpbmFyeW9wX3BhY2tlZF9ncHUnO1xuaW1wb3J0IHtiaW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgUE9XID0gYFxuICBpZihhIDwgMC4wICYmIGZsb29yKGIpIDwgYil7XG4gICAgcmV0dXJuIE5BTjtcbiAgfVxuICBpZiAoYiA9PSAwLjApIHtcbiAgICByZXR1cm4gMS4wO1xuICB9XG4gIHJldHVybiAocm91bmQobW9kKGIsIDIuMCkpICE9IDEpID9cbiAgICAgIHBvdyhhYnMoYSksIGIpIDogc2lnbihhKSAqIHBvdyhhYnMoYSksIGIpO1xuYDtcblxuY29uc3QgUE9XX1BBQ0tFRCA9IGBcbiAgLy8gaXNNb2RSb3VuZDEgaGFzIDEgZm9yIGNvbXBvbmVudHMgd2l0aCByb3VuZChtb2QoYiwgMi4wKSkgPT0gMSwgMCBvdGhlcndpc2UuXG4gIHZlYzQgaXNNb2RSb3VuZDEgPSB2ZWM0KGVxdWFsKHJvdW5kKG1vZChiLCAyLjApKSwgaXZlYzQoMSkpKTtcbiAgdmVjNCBtdWx0aXBsaWVyID0gc2lnbihhKSAqIGlzTW9kUm91bmQxICsgKHZlYzQoMS4wKSAtIGlzTW9kUm91bmQxKTtcbiAgdmVjNCByZXN1bHQgPSBtdWx0aXBsaWVyICogcG93KGFicyhhKSwgYik7XG5cbiAgLy8gRW5zdXJlIHRoYXQgYV4wID0gMSwgaW5jbHVkaW5nIDBeMCA9IDEgYXMgdGhpcyBjb3JyZXNwb25kIHRvIFRGIGFuZCBKU1xuICBidmVjNCBpc0V4cFplcm8gPSBlcXVhbChiLCB2ZWM0KDAuMCkpO1xuICByZXN1bHQuciA9IGlzRXhwWmVyby5yID8gMS4wIDogcmVzdWx0LnI7XG4gIHJlc3VsdC5nID0gaXNFeHBaZXJvLmcgPyAxLjAgOiByZXN1bHQuZztcbiAgcmVzdWx0LmIgPSBpc0V4cFplcm8uYiA/IDEuMCA6IHJlc3VsdC5iO1xuICByZXN1bHQuYSA9IGlzRXhwWmVyby5hID8gMS4wIDogcmVzdWx0LmE7XG5cbiAgdmVjNCBpc05hTiA9IHZlYzQobGVzc1RoYW4oYSwgdmVjNCgwLjApKSkgKiB2ZWM0KGxlc3NUaGFuKGZsb29yKGIpLCBiKSk7XG4gIGAgK1xuICAgIENIRUNLX05BTl9TTklQUEVUICsgYFxuICByZXR1cm4gcmVzdWx0O1xuYDtcblxuZXhwb3J0IGNvbnN0IHBvdyA9XG4gICAgYmluYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBQT1csIHBhY2tlZE9wU25pcHBldDogUE9XX1BBQ0tFRH0pO1xuXG5leHBvcnQgY29uc3QgcG93Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFBvdyxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHBvdyBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2VudiwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBQcmVsdSwgUHJlbHVJbnB1dHMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0JpbmFyeU9wUHJvZ3JhbX0gZnJvbSAnLi4vYmluYXJ5b3BfZ3B1JztcbmltcG9ydCB7QmluYXJ5T3BQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9iaW5hcnlvcF9wYWNrZWRfZ3B1JztcblxuZXhwb3J0IGNvbnN0IFBSRUxVID0gYHJldHVybiAoYSA8IDAuKSA/IGIgKiBhIDogYTtgO1xuZXhwb3J0IGNvbnN0IFBSRUxVX1BBQ0tFRCA9IGBcbiAgdmVjNCBhTGVzc1RoYW5aZXJvID0gdmVjNChsZXNzVGhhbihhLCB2ZWM0KDAuKSkpO1xuICByZXR1cm4gKGFMZXNzVGhhblplcm8gKiAoYiAqIGEpKSArICgodmVjNCgxLjApIC0gYUxlc3NUaGFuWmVybykgKiBhKTtcbmA7XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmVsdShhcmdzOiB7aW5wdXRzOiBQcmVsdUlucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTH0pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kfSA9IGFyZ3M7XG4gIGNvbnN0IHt4LCBhbHBoYX0gPSBpbnB1dHM7XG5cbiAgY29uc3QgcHJvZ3JhbSA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfQklOQVJZX09QRVJBVElPTlMnKSA/XG4gICAgICBuZXcgQmluYXJ5T3BQYWNrZWRQcm9ncmFtKFBSRUxVX1BBQ0tFRCwgeC5zaGFwZSwgYWxwaGEuc2hhcGUpIDpcbiAgICAgIG5ldyBCaW5hcnlPcFByb2dyYW0oUFJFTFUsIHguc2hhcGUsIGFscGhhLnNoYXBlKTtcbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4LCBhbHBoYV0sIHguZHR5cGUpO1xufVxuXG5leHBvcnQgY29uc3QgcHJlbHVDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogUHJlbHUsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBwcmVsdSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBQcm9kLCBQcm9kQXR0cnMsIFByb2RJbnB1dHMsIHN1bU91dFR5cGUsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge3JlZHVjZX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3JlZHVjZSc7XG5pbXBvcnQge3Byb2RJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHt0cmFuc3Bvc2V9IGZyb20gJy4vVHJhbnNwb3NlJztcblxuZXhwb3J0IGZ1bmN0aW9uIHByb2QoXG4gICAgYXJnczoge2lucHV0czogUHJvZElucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCwgYXR0cnM6IFByb2RBdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtheGlzLCBrZWVwRGltc30gPSBhdHRycztcblxuICBjb25zdCB4UmFuayA9IHguc2hhcGUubGVuZ3RoO1xuICBjb25zdCB0b0Rpc3Bvc2UgPSBbXTtcblxuICBjb25zdCBvcmlnQXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG4gIGxldCBheGVzID0gb3JpZ0F4ZXM7XG4gIGNvbnN0IHBlcm11dGVkQXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oYXhlcywgeFJhbmspO1xuICBsZXQgcGVybXV0ZWRYID0geDtcbiAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgcGVybXV0ZWRYID0gdHJhbnNwb3NlKHtpbnB1dHM6IHt4fSwgYmFja2VuZCwgYXR0cnM6IHtwZXJtOiBwZXJtdXRlZEF4ZXN9fSk7XG4gICAgYXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRJbm5lck1vc3RBeGVzKGF4ZXMubGVuZ3RoLCB4UmFuayk7XG4gICAgdG9EaXNwb3NlLnB1c2gocGVybXV0ZWRYKTtcbiAgfVxuXG4gIGJhY2tlbmRfdXRpbC5hc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcygncHJvZCcsIGF4ZXMsIHhSYW5rKTtcblxuICBsZXQgcmVzO1xuICBpZiAoYmFja2VuZC5zaG91bGRFeGVjdXRlT25DUFUoW3Blcm11dGVkWF0pKSB7XG4gICAgY29uc3QgeFZhbHMgPSBiYWNrZW5kLnRleERhdGEuZ2V0KHBlcm11dGVkWC5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICAgIGNvbnN0IHtvdXRWYWxzLCBvdXRTaGFwZSwgb3V0RHR5cGV9ID1cbiAgICAgICAgcHJvZEltcGxDUFUocGVybXV0ZWRYLnNoYXBlLCBwZXJtdXRlZFguZHR5cGUsIHhWYWxzLCBheGVzKTtcbiAgICByZXMgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dFNoYXBlLCBvdXREdHlwZSwgb3V0VmFscyk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgW291dFNoYXBlLCByZWR1Y2VTaGFwZV0gPVxuICAgICAgICBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcyhwZXJtdXRlZFguc2hhcGUsIGF4ZXMpO1xuICAgIGNvbnN0IGluU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShyZWR1Y2VTaGFwZSk7XG4gICAgY29uc3QgYTJEID0gcmVzaGFwZShcbiAgICAgICAge2lucHV0czoge3g6IHBlcm11dGVkWH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IFstMSwgaW5TaXplXX19KTtcbiAgICBjb25zdCBvdXRwdXREVHlwZSA9IHN1bU91dFR5cGUoeC5kdHlwZSk7XG4gICAgY29uc3QgcmVkdWNlZCA9IHJlZHVjZShhMkQsIG91dHB1dERUeXBlLCAncHJvZCcsIGJhY2tlbmQpO1xuICAgIHJlcyA9IHJlc2hhcGUoe2lucHV0czoge3g6IHJlZHVjZWR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBvdXRTaGFwZX19KTtcblxuICAgIHRvRGlzcG9zZS5wdXNoKGEyRCk7XG4gICAgdG9EaXNwb3NlLnB1c2gocmVkdWNlZCk7XG4gIH1cblxuICBpZiAoa2VlcERpbXMpIHtcbiAgICB0b0Rpc3Bvc2UucHVzaChyZXMpO1xuICAgIGNvbnN0IG5ld1NoYXBlID0gYmFja2VuZF91dGlsLmV4cGFuZFNoYXBlVG9LZWVwRGltKHJlcy5zaGFwZSwgb3JpZ0F4ZXMpO1xuICAgIHJlcyA9IHJlc2hhcGUoe2lucHV0czoge3g6IHJlc30sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IG5ld1NoYXBlfX0pO1xuICB9XG5cbiAgdG9EaXNwb3NlLmZvckVhY2godCA9PiBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHQpKTtcblxuICByZXR1cm4gcmVzO1xufVxuXG5leHBvcnQgY29uc3QgcHJvZENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBQcm9kLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogcHJvZCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgUmFuZ2UsIFJhbmdlQXR0cnMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge3JhbmdlSW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5cbmV4cG9ydCBjb25zdCByYW5nZSA9XG4gICAgKGFyZ3M6IHtiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLCBhdHRyczogUmFuZ2VBdHRyc30pOiBUZW5zb3JJbmZvID0+IHtcbiAgICAgIGNvbnN0IHtiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICAgICAgY29uc3Qge3N0YXJ0LCBzdG9wLCBzdGVwLCBkdHlwZX0gPSBhdHRycztcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHJhbmdlSW1wbENQVShzdGFydCwgc3RvcCwgc3RlcCwgZHR5cGUpO1xuICAgICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW3ZhbHVlcy5sZW5ndGhdLCBkdHlwZSwgdmFsdWVzKTtcbiAgICB9O1xuXG5leHBvcnQgY29uc3QgcmFuZ2VDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogUmFuZ2UsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiByYW5nZSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgUmVhbCwgUmVhbElucHV0cywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7aWRlbnRpdHl9IGZyb20gJy4vSWRlbnRpdHknO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVhbChhcmdzOiB7aW5wdXRzOiBSZWFsSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge2lucHV0fSA9IGlucHV0cztcbiAgY29uc3QgaW5wdXREYXRhID0gYmFja2VuZC50ZXhEYXRhLmdldChpbnB1dC5kYXRhSWQpO1xuXG4gIHJldHVybiBpZGVudGl0eSh7aW5wdXRzOiB7eDogaW5wdXREYXRhLmNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsfSwgYmFja2VuZH0pO1xufVxuXG5leHBvcnQgY29uc3QgcmVhbENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBSZWFsLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogcmVhbCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1JlYWxEaXZ9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge0tlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7YmluYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5cbi8vIFdpdGhvdXQgdGhlIGVxdWFsaXR5IGNoZWNrIGRpdiBwcm9kdWNlcyAwLjk5OTkgZm9yIGEgPSBiLCB3aGljaCB3aGVuXG4vLyBmbG9vcmVkIGNhbiBjYXVzZSBlcnJvcnMuXG5jb25zdCBESVYgPSBgXG5pZiAoYSA9PSBiKSB7XG4gIHJldHVybiAxLjA7XG59O1xucmV0dXJuIGEgLyBiO2A7XG5cbi8vIFdlIGRvIHRoZSBzYW1lIGFzIGluIC4vYmluYXJ5b3BfZ3B1LCB3aXRoIHZlYzQgYW5kIGl2ZWM0LlxuLy8gT24gTGludXgsIHRoZSB2ZWN0b3JpemVkIGltcGxlbWVudGF0aW9uIHByb2R1Y2VzIE5hTnMgd2hlbiBhIGFuZCBiIGFyZSAwLlxuY29uc3QgRElWX1BBQ0tFRCA9IGBcbiAgLy8gdmVjNCBvbmUgPSB2ZWM0KGVxdWFsKGEsIGIpKTtcbiAgLy8gcmV0dXJuIG9uZSArICh2ZWM0KDEuMCkgLSBvbmUpICogYSAvIGI7XG4gIHZlYzQgcmVzdWx0ID0gYSAvIGI7XG4gIGlmKGEueCA9PSBiLngpIHtcbiAgICByZXN1bHQueCA9IDEuO1xuICB9XG4gIGlmKGEueSA9PSBiLnkpIHtcbiAgICByZXN1bHQueSA9IDEuO1xuICB9XG4gIGlmKGEueiA9PSBiLnopIHtcbiAgICByZXN1bHQueiA9IDEuO1xuICB9XG4gIGlmKGEudyA9PSBiLncpIHtcbiAgICByZXN1bHQudyA9IDEuO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbmA7XG5cbmV4cG9ydCBjb25zdCByZWFsRGl2ID0gYmluYXJ5S2VybmVsRnVuYyhcbiAgICB7b3BTbmlwcGV0OiBESVYsIHBhY2tlZE9wU25pcHBldDogRElWX1BBQ0tFRCwgY2hlY2tPdXRPZkJvdW5kczogdHJ1ZX0pO1xuXG5leHBvcnQgY29uc3QgcmVhbERpdkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBSZWFsRGl2LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogcmVhbERpdixcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBSZWNpcHJvY2FsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuXG5jb25zdCBSRUNJUFJPQ0FMID0gYHJldHVybiAxLjAgLyB4O2A7XG5cbmV4cG9ydCBjb25zdCByZWNpcHJvY2FsID0gdW5hcnlLZXJuZWxGdW5jKHtvcFNuaXBwZXQ6IFJFQ0lQUk9DQUx9KTtcblxuZXhwb3J0IGNvbnN0IHJlY2lwcm9jYWxDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogUmVjaXByb2NhbCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHJlY2lwcm9jYWwsXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgUmVsdX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7Q0hFQ0tfTkFOX1NOSVBQRVR9IGZyb20gJy4uL3VuYXJ5b3BfZ3B1JztcblxuY29uc3QgUkVMVSA9IENIRUNLX05BTl9TTklQUEVUICsgYFxuICByZXR1cm4gKHggPCAwLjApID8gMC4wIDogeDtcbmA7XG5cbmNvbnN0IFJFTFVfUEFDS0VEID0gYFxuICB2ZWM0IHJlc3VsdCA9IHggKiB2ZWM0KGdyZWF0ZXJUaGFuRXF1YWwoeCwgdmVjNCgwLjApKSk7XG4gIGJ2ZWM0IGlzTmFOID0gaXNuYW4oeCk7XG5cbiAgcmVzdWx0LnIgPSBpc05hTi5yID8geC5yIDogcmVzdWx0LnI7XG4gIHJlc3VsdC5nID0gaXNOYU4uZyA/IHguZyA6IHJlc3VsdC5nO1xuICByZXN1bHQuYiA9IGlzTmFOLmIgPyB4LmIgOiByZXN1bHQuYjtcbiAgcmVzdWx0LmEgPSBpc05hTi5hID8geC5hIDogcmVzdWx0LmE7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbmA7XG5cbmV4cG9ydCBjb25zdCByZWx1ID1cbiAgICB1bmFyeUtlcm5lbEZ1bmMoe29wU25pcHBldDogUkVMVSwgcGFja2VkT3BTbmlwcGV0OiBSRUxVX1BBQ0tFRH0pO1xuXG5leHBvcnQgY29uc3QgcmVsdUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBSZWx1LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogcmVsdSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgUmVsdTZ9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge3VuYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQge0NIRUNLX05BTl9TTklQUEVUfSBmcm9tICcuLi91bmFyeW9wX2dwdSc7XG5cbmNvbnN0IFJFTFU2ID0gQ0hFQ0tfTkFOX1NOSVBQRVQgKyBgXG4gIHJldHVybiAoeCA8IDAuMCkgPyAwLjAgOiBtaW4oNi4wLCB4KTtcbmA7XG5cbmNvbnN0IFJFTFU2X1BBQ0tFRCA9IGBcbiAgdmVjNCByZXN1bHQgPSBtaW4oeCwgdmVjNCg2LikpICogdmVjNChncmVhdGVyVGhhbkVxdWFsKHgsIHZlYzQoMC4wKSkpO1xuICBidmVjNCBpc05hTiA9IGlzbmFuKHgpO1xuXG4gIHJlc3VsdC5yID0gaXNOYU4uciA/IHguciA6IHJlc3VsdC5yO1xuICByZXN1bHQuZyA9IGlzTmFOLmcgPyB4LmcgOiByZXN1bHQuZztcbiAgcmVzdWx0LmIgPSBpc05hTi5iID8geC5iIDogcmVzdWx0LmI7XG4gIHJlc3VsdC5hID0gaXNOYU4uYSA/IHguYSA6IHJlc3VsdC5hO1xuXG4gIHJldHVybiByZXN1bHQ7XG5gO1xuXG5leHBvcnQgY29uc3QgcmVsdTYgPVxuICAgIHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBSRUxVNiwgcGFja2VkT3BTbmlwcGV0OiBSRUxVNl9QQUNLRUR9KTtcblxuZXhwb3J0IGNvbnN0IHJlbHU2Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJlbHU2LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogcmVsdTYgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFJlc2hhcGUsIFJlc2hhcGVBdHRycywgUmVzaGFwZUlucHV0cywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7cGFja2VkUmVzaGFwZX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3Jlc2hhcGUnO1xuaW1wb3J0IHtpc1Jlc2hhcGVGcmVlfSBmcm9tICcuLi93ZWJnbF91dGlsJztcblxuZXhwb3J0IGZ1bmN0aW9uIHJlc2hhcGUoYXJnczoge1xuICBpbnB1dHM6IFJlc2hhcGVJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBSZXNoYXBlQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7c2hhcGV9ID0gYXR0cnM7XG4gIGNvbnN0IHdlYmdsQmFja2VuZCA9IGJhY2tlbmQ7XG5cbiAgY29uc3QgeFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoeC5zaGFwZSk7XG4gIGNvbnN0ICRzaGFwZSA9IHV0aWwuaW5mZXJGcm9tSW1wbGljaXRTaGFwZShzaGFwZSwgeFNpemUpO1xuICBjb25zdCAkeFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoJHNoYXBlKTtcblxuICB1dGlsLmFzc2VydChcbiAgICAgIHhTaXplID09PSAkeFNpemUsXG4gICAgICAoKSA9PiBgVGhlIG5ldyBzaGFwZSAoJHskc2hhcGV9KSBoYXMgJHskeFNpemV9IGVsZW1lbnRzIGFuZCB0aGUgb2xkIGAgK1xuICAgICAgICAgIGBzaGFwZSAoJHt4LnNoYXBlfSkgaGFzICR7eFNpemV9IGVsZW1lbnRzLiBUaGUgbmV3IHNoYXBlIGFuZCBvbGQgYCArXG4gICAgICAgICAgYHNoYXBlIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMuYCk7XG5cbiAgY29uc3QgeFRleERhdGEgPSB3ZWJnbEJhY2tlbmQudGV4RGF0YS5nZXQoeC5kYXRhSWQpO1xuICBpZiAoeFRleERhdGEuaXNQYWNrZWQgJiYgIWlzUmVzaGFwZUZyZWUoeC5zaGFwZSwgJHNoYXBlKSAmJlxuICAgICAgISh4VGV4RGF0YS50ZXh0dXJlICE9PSBudWxsICYmIGlzUmVzaGFwZUZyZWUoeFRleERhdGEuc2hhcGUsICRzaGFwZSkpKSB7XG4gICAgcmV0dXJuIHBhY2tlZFJlc2hhcGUoeCwgJHNoYXBlLCB3ZWJnbEJhY2tlbmQpO1xuICB9XG5cbiAgd2ViZ2xCYWNrZW5kLmluY1JlZih4LmRhdGFJZCk7XG5cbiAgcmV0dXJuIHtkYXRhSWQ6IHguZGF0YUlkLCBzaGFwZTogJHNoYXBlLCBkdHlwZTogeC5kdHlwZX07XG59XG5cbmV4cG9ydCBjb25zdCByZXNoYXBlQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJlc2hhcGUsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiByZXNoYXBlIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7ZW52LCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFJlc2l6ZUJpbGluZWFyLCBSZXNpemVCaWxpbmVhckF0dHJzLCBSZXNpemVCaWxpbmVhcklucHV0cywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7UmVzaXplQmlsaW5lYXJQcm9ncmFtfSBmcm9tICcuLi9yZXNpemVfYmlsaW5lYXJfZ3B1JztcbmltcG9ydCB7UmVzaXplQmlsaW5lYXJQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9yZXNpemVfYmlsaW5lYXJfcGFja2VkX2dwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNpemVCaWxpbmVhcihhcmdzOiB7XG4gIGlucHV0czogUmVzaXplQmlsaW5lYXJJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBSZXNpemVCaWxpbmVhckF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtpbWFnZXN9ID0gaW5wdXRzO1xuICBjb25zdCB7YWxpZ25Db3JuZXJzLCBoYWxmUGl4ZWxDZW50ZXJzLCBzaXplfSA9IGF0dHJzO1xuXG4gIGNvbnN0IFtuZXdIZWlnaHQsIG5ld1dpZHRoXSA9IHNpemU7XG5cbiAgY29uc3QgcHJvZ3JhbSA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfSU1BR0VfT1BFUkFUSU9OUycpID9cbiAgICAgIG5ldyBSZXNpemVCaWxpbmVhclBhY2tlZFByb2dyYW0oXG4gICAgICAgICAgaW1hZ2VzLnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBuZXdIZWlnaHQsIG5ld1dpZHRoLFxuICAgICAgICAgIGFsaWduQ29ybmVycywgaGFsZlBpeGVsQ2VudGVycykgOlxuICAgICAgbmV3IFJlc2l6ZUJpbGluZWFyUHJvZ3JhbShcbiAgICAgICAgICBpbWFnZXMuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIG5ld0hlaWdodCwgbmV3V2lkdGgsXG4gICAgICAgICAgYWxpZ25Db3JuZXJzLCBoYWxmUGl4ZWxDZW50ZXJzKTtcbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtpbWFnZXNdLCAnZmxvYXQzMicpO1xufVxuXG5leHBvcnQgY29uc3QgcmVzaXplQmlsaW5lYXJDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogUmVzaXplQmlsaW5lYXIsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiByZXNpemVCaWxpbmVhciBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgUmVzaXplQmlsaW5lYXJHcmFkLCBSZXNpemVCaWxpbmVhckdyYWRBdHRycywgUmVzaXplQmlsaW5lYXJHcmFkSW5wdXRzLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtSZXNpemVCaWxpbmVhckJhY2twcm9wUHJvZ3JhbX0gZnJvbSAnLi4vcmVzaXplX2JpbGluZWFyX2JhY2twcm9wX2dwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNpemVCaWxpbmVhckdyYWQoYXJnczoge1xuICBpbnB1dHM6IFJlc2l6ZUJpbGluZWFyR3JhZElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IFJlc2l6ZUJpbGluZWFyR3JhZEF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtpbWFnZXMsIGR5fSA9IGlucHV0cztcbiAgY29uc3Qge2FsaWduQ29ybmVyc30gPSBhdHRycztcblxuICBjb25zdCBwcm9ncmFtID0gbmV3IFJlc2l6ZUJpbGluZWFyQmFja3Byb3BQcm9ncmFtKFxuICAgICAgZHkuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICBpbWFnZXMuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGFsaWduQ29ybmVycyk7XG5cbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtkeV0sIGR5LmR0eXBlKTtcbn1cblxuZXhwb3J0IGNvbnN0IHJlc2l6ZUJpbGluZWFyR3JhZENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBSZXNpemVCaWxpbmVhckdyYWQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiByZXNpemVCaWxpbmVhckdyYWQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtlbnYsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgUmVzaXplTmVhcmVzdE5laWdoYm9yLCBSZXNpemVOZWFyZXN0TmVpZ2hib3JBdHRycywgUmVzaXplTmVhcmVzdE5laWdoYm9ySW5wdXRzLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtSZXNpemVOZWFyZXN0TmVpZ2hib3JQcm9ncmFtfSBmcm9tICcuLi9yZXNpemVfbmVhcmVzdF9uZWlnaGJvcl9ncHUnO1xuaW1wb3J0IHtSZXNpemVOZWFyZXN0TmVpZ2hib3JQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9yZXNpemVfbmVhcmVzdF9uZWlnaGJvcl9wYWNrZWRfZ3B1JztcblxuZXhwb3J0IGZ1bmN0aW9uIHJlc2l6ZU5lYXJlc3ROZWlnaGJvcihhcmdzOiB7XG4gIGlucHV0czogUmVzaXplTmVhcmVzdE5laWdoYm9ySW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogUmVzaXplTmVhcmVzdE5laWdoYm9yQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2ltYWdlc30gPSBpbnB1dHM7XG4gIGNvbnN0IHthbGlnbkNvcm5lcnMsIGhhbGZQaXhlbENlbnRlcnMsIHNpemV9ID0gYXR0cnM7XG5cbiAgY29uc3QgW25ld0hlaWdodCwgbmV3V2lkdGhdID0gc2l6ZTtcblxuICBjb25zdCBwcm9ncmFtID0gZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19JTUFHRV9PUEVSQVRJT05TJykgP1xuICAgICAgbmV3IFJlc2l6ZU5lYXJlc3ROZWlnaGJvclBhY2tlZFByb2dyYW0oXG4gICAgICAgICAgaW1hZ2VzLnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBuZXdIZWlnaHQsIG5ld1dpZHRoLFxuICAgICAgICAgIGFsaWduQ29ybmVycywgaGFsZlBpeGVsQ2VudGVycykgOlxuICAgICAgbmV3IFJlc2l6ZU5lYXJlc3ROZWlnaGJvclByb2dyYW0oXG4gICAgICAgICAgaW1hZ2VzLnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBuZXdIZWlnaHQsIG5ld1dpZHRoLFxuICAgICAgICAgIGFsaWduQ29ybmVycywgaGFsZlBpeGVsQ2VudGVycyk7XG4gIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbaW1hZ2VzXSwgaW1hZ2VzLmR0eXBlKTtcbn1cblxuZXhwb3J0IGNvbnN0IHJlc2l6ZU5lYXJlc3ROZWlnaGJvckNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBSZXNpemVOZWFyZXN0TmVpZ2hib3IsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiByZXNpemVOZWFyZXN0TmVpZ2hib3IgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFJlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWQsIFJlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWRBdHRycywgUmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZElucHV0cywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7UmVzaXplTmVhcmVzdE5laWdib3JCYWNrcHJvcFByb2dyYW19IGZyb20gJy4uL3Jlc2l6ZV9uZWFyZXN0X25laWdoYm9yX2JhY2twcm9wX2dwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkKGFyZ3M6IHtcbiAgaW5wdXRzOiBSZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogUmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZEF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtpbWFnZXMsIGR5fSA9IGlucHV0cztcbiAgY29uc3Qge2FsaWduQ29ybmVyc30gPSBhdHRycztcblxuICBjb25zdCBwcm9ncmFtID0gbmV3IFJlc2l6ZU5lYXJlc3ROZWlnYm9yQmFja3Byb3BQcm9ncmFtKFxuICAgICAgZHkuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICBpbWFnZXMuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGFsaWduQ29ybmVycyk7XG4gIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbZHldLCBkeS5kdHlwZSk7XG59XG5cbmV4cG9ydCBjb25zdCByZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiByZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7ZW52LCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFJldmVyc2UsIFJldmVyc2VBdHRycywgUmV2ZXJzZUlucHV0cywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7UmV2ZXJzZVByb2dyYW19IGZyb20gJy4uL3JldmVyc2VfZ3B1JztcbmltcG9ydCB7UmV2ZXJzZVBhY2tlZFByb2dyYW19IGZyb20gJy4uL3JldmVyc2VfcGFja2VkX2dwdSc7XG5cbmltcG9ydCB7aWRlbnRpdHl9IGZyb20gJy4vSWRlbnRpdHknO1xuXG5leHBvcnQgZnVuY3Rpb24gcmV2ZXJzZShhcmdzOiB7XG4gIGlucHV0czogUmV2ZXJzZUlucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IFJldmVyc2VBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtkaW1zfSA9IGF0dHJzO1xuXG4gIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG5cbiAgY29uc3QgJGRpbXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGRpbXMsIHguc2hhcGUpO1xuICBpZiAoeFJhbmsgPT09IDApIHtcbiAgICByZXR1cm4gaWRlbnRpdHkoe2lucHV0czoge3h9LCBiYWNrZW5kfSk7XG4gIH1cblxuICBjb25zdCBwcm9ncmFtID0gZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19BUlJBWV9PUEVSQVRJT05TJykgP1xuICAgICAgbmV3IFJldmVyc2VQYWNrZWRQcm9ncmFtKHguc2hhcGUsICRkaW1zKSA6XG4gICAgICBuZXcgUmV2ZXJzZVByb2dyYW0oeC5zaGFwZSwgJGRpbXMpO1xuXG4gIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeF0sIHguZHR5cGUpO1xufVxuXG5leHBvcnQgY29uc3QgcmV2ZXJzZUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBSZXZlcnNlLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogcmV2ZXJzZSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBUZW5zb3I0RH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7Um90YXRlV2l0aE9mZnNldCwgUm90YXRlV2l0aE9mZnNldEF0dHJzLCBSb3RhdGVXaXRoT2Zmc2V0SW5wdXRzfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtSb3RhdGVQcm9ncmFtfSBmcm9tICcuLi9yb3RhdGVfZ3B1JztcblxuZXhwb3J0IGNvbnN0IHJvdGF0ZVdpdGhPZmZzZXRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogUm90YXRlV2l0aE9mZnNldCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6ICh7aW5wdXRzLCBhdHRycywgYmFja2VuZH0pID0+IHtcbiAgICBjb25zdCB7aW1hZ2V9ID0gaW5wdXRzIGFzIFJvdGF0ZVdpdGhPZmZzZXRJbnB1dHM7XG4gICAgY29uc3Qge3JhZGlhbnMsIGZpbGxWYWx1ZSwgY2VudGVyfSA9IGF0dHJzIGFzIHt9IGFzIFJvdGF0ZVdpdGhPZmZzZXRBdHRycztcbiAgICBjb25zdCB3ZWJnbEJhY2tlbmQgPSBiYWNrZW5kIGFzIE1hdGhCYWNrZW5kV2ViR0w7XG5cbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IFJvdGF0ZVByb2dyYW0oKGltYWdlIGFzIFRlbnNvcjREKS5zaGFwZSwgZmlsbFZhbHVlKTtcbiAgICBjb25zdCBbY2VudGVyWCwgY2VudGVyWV0gPVxuICAgICAgICBiYWNrZW5kX3V0aWwuZ2V0SW1hZ2VDZW50ZXIoY2VudGVyLCBpbWFnZS5zaGFwZVsxXSwgaW1hZ2Uuc2hhcGVbMl0pO1xuICAgIGNvbnN0IGN1c3RvbVZhbHVlcyA9XG4gICAgICAgIFtbY2VudGVyWCwgY2VudGVyWSwgTWF0aC5zaW4ocmFkaWFucyksIE1hdGguY29zKHJhZGlhbnMpXV07XG4gICAgY29uc3Qgb3V0cHV0ID0gd2ViZ2xCYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShcbiAgICAgICAgcHJvZ3JhbSwgW2ltYWdlXSwgaW1hZ2UuZHR5cGUsIGN1c3RvbVZhbHVlcyk7XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIFJvdW5kfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuXG5jb25zdCBST1VORCA9IGBcbiAgLy8gT3BlbkdMIEVTIGRvZXMgbm90IHN1cHBvcnQgcm91bmQgZnVuY3Rpb24uXG4gIC8vIFRoZSBhbGdvcml0aG0gaXMgYmFzZWQgb24gYmFua2VyJ3Mgcm91bmRpbmcuXG4gIGZsb2F0IGJhc2UgPSBmbG9vcih4KTtcbiAgaWYgKCh4IC0gYmFzZSkgPCAwLjUpIHtcbiAgICByZXR1cm4gZmxvb3IoeCk7XG4gIH0gZWxzZSBpZiAoKHggLSBiYXNlKSA+IDAuNSkge1xuICAgIHJldHVybiBjZWlsKHgpO1xuICB9IGVsc2Uge1xuICAgIGlmIChtb2QoYmFzZSwgMi4wKSA9PSAwLjApIHtcbiAgICAgIHJldHVybiBiYXNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYmFzZSArIDEuMDtcbiAgICB9XG4gIH1cbmA7XG5cbmV4cG9ydCBjb25zdCByb3VuZCA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBST1VORH0pO1xuXG5leHBvcnQgY29uc3Qgcm91bmRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogUm91bmQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiByb3VuZCxcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBSc3FydH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7cnNxcnRJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuY29uc3QgUlNRUlQgPSBgcmV0dXJuIGludmVyc2VzcXJ0KHgpO2A7XG5cbmV4cG9ydCBjb25zdCByc3FydCA9XG4gICAgdW5hcnlLZXJuZWxGdW5jKHtvcFNuaXBwZXQ6IFJTUVJULCBjcHVLZXJuZWxJbXBsOiByc3FydEltcGxDUFV9KTtcblxuZXhwb3J0IGNvbnN0IHJzcXJ0Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJzcXJ0LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogcnNxcnQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgU2NhdHRlck5kLCBTY2F0dGVyTmRBdHRycywgU2NhdHRlck5kSW5wdXRzLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtTY2F0dGVyUHJvZ3JhbX0gZnJvbSAnLi4vc2NhdHRlcl9ncHUnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuXG5leHBvcnQgZnVuY3Rpb24gc2NhdHRlck5kKGFyZ3M6IHtcbiAgaW5wdXRzOiBTY2F0dGVyTmRJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBTY2F0dGVyTmRBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7aW5kaWNlcywgdXBkYXRlc30gPSBpbnB1dHM7XG4gIGNvbnN0IHtzaGFwZX0gPSBhdHRycztcblxuICBjb25zdCB7c2xpY2VSYW5rLCBudW1VcGRhdGVzLCBzbGljZVNpemUsIHN0cmlkZXMsIG91dHB1dFNpemV9ID1cbiAgICAgIGJhY2tlbmRfdXRpbC5jYWxjdWxhdGVTaGFwZXModXBkYXRlcywgaW5kaWNlcywgc2hhcGUpO1xuXG4gIGNvbnN0IGZsYXR0ZW5TaGFwZSA9IFtvdXRwdXRTaXplIC8gc2xpY2VTaXplLCBzbGljZVNpemVdO1xuXG4gIGlmIChvdXRwdXRTaXplID09PSAwKSB7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oc2hhcGUsIGluZGljZXMuZHR5cGUpO1xuICB9XG5cbiAgY29uc3QgZmxhdHRlbkluZGljZXMgPSByZXNoYXBlKFxuICAgICAge2lucHV0czoge3g6IGluZGljZXN9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBbbnVtVXBkYXRlcywgc2xpY2VSYW5rXX19KTtcbiAgY29uc3QgZmxhdHRlblggPSByZXNoYXBlKFxuICAgICAge2lucHV0czoge3g6IHVwZGF0ZXN9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBbbnVtVXBkYXRlcywgc2xpY2VTaXplXX19KTtcblxuICBjb25zdCBkZWZhdWx0VmFsdWUgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFxuICAgICAgW10sICdmbG9hdDMyJywgbmV3IEZsb2F0MzJBcnJheShbMF0pKTsgIC8vIHNjYWxhcigwKVxuICBjb25zdCBwcm9ncmFtID0gbmV3IFNjYXR0ZXJQcm9ncmFtKFxuICAgICAgbnVtVXBkYXRlcywgc2xpY2VSYW5rLCBmbGF0dGVuSW5kaWNlcy5zaGFwZS5sZW5ndGgsIGZsYXR0ZW5YLnNoYXBlLmxlbmd0aCxcbiAgICAgIHN0cmlkZXMsIGZsYXR0ZW5TaGFwZSk7XG4gIGNvbnN0IHJlcyA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKFxuICAgICAgcHJvZ3JhbSwgW2ZsYXR0ZW5YLCBmbGF0dGVuSW5kaWNlcywgZGVmYXVsdFZhbHVlXSwgZmxhdHRlblguZHR5cGUpO1xuXG4gIGNvbnN0IHJlc2hhcGVkID0gcmVzaGFwZSh7aW5wdXRzOiB7eDogcmVzfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZX19KTtcblxuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGZsYXR0ZW5JbmRpY2VzKTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhmbGF0dGVuWCk7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVzKTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhkZWZhdWx0VmFsdWUpO1xuXG4gIHJldHVybiByZXNoYXBlZDtcbn1cblxuZXhwb3J0IGNvbnN0IHNjYXR0ZXJOZENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTY2F0dGVyTmQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBzY2F0dGVyTmQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFNlbGVjdCwgU2VsZWN0SW5wdXRzLCBUZW5zb3JJbmZvLCB1cGNhc3RUeXBlfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtTZWxlY3RQcm9ncmFtfSBmcm9tICcuLi9zZWxlY3RfZ3B1JztcblxuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdChhcmdzOiB7aW5wdXRzOiBTZWxlY3RJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7Y29uZGl0aW9uLCB0LCBlfSA9IGlucHV0cztcblxuICBjb25zdCBwcm9ncmFtID1cbiAgICAgIG5ldyBTZWxlY3RQcm9ncmFtKGNvbmRpdGlvbi5zaGFwZS5sZW5ndGgsIHQuc2hhcGUsIHQuc2hhcGUubGVuZ3RoKTtcbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKFxuICAgICAgcHJvZ3JhbSwgW2NvbmRpdGlvbiwgdCwgZV0sIHVwY2FzdFR5cGUodC5kdHlwZSwgZS5kdHlwZSkpO1xufVxuXG5leHBvcnQgY29uc3Qgc2VsZWN0Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNlbGVjdCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHNlbGVjdCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBTZWx1fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge3VuYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5cbmNvbnN0IFNFTFUgPSBgXG4gIC8vIFN0YWJsZSBhbmQgQXR0cmFjdGluZyBGaXhlZCBQb2ludCAoMCwgMSkgZm9yIE5vcm1hbGl6ZWQgV2VpZ2h0cy5cbiAgLy8gc2VlOiBodHRwczovL2FyeGl2Lm9yZy9hYnMvMTcwNi4wMjUxNVxuICBmbG9hdCBzY2FsZUFscGhhID0gJHtiYWNrZW5kX3V0aWwuU0VMVV9TQ0FMRUFMUEhBfTtcbiAgZmxvYXQgc2NhbGUgPSAke2JhY2tlbmRfdXRpbC5TRUxVX1NDQUxFfTtcbiAgcmV0dXJuICh4ID49IDAuMCkgPyBzY2FsZSAqIHggOiBzY2FsZUFscGhhICogKGV4cCh4KSAtIDEuMCk7XG5gO1xuXG5leHBvcnQgY29uc3Qgc2VsdSA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBTRUxVfSk7XG5cbmV4cG9ydCBjb25zdCBzZWx1Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNlbHUsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBzZWx1LFxufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIFNpZ21vaWR9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge3VuYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQge3NpZ21vaWRJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuY29uc3QgU0lHTU9JRCA9IGByZXR1cm4gMS4wIC8gKDEuMCArIGV4cCgtMS4wICogeCkpO2A7XG5cbmV4cG9ydCBjb25zdCBzaWdtb2lkID0gdW5hcnlLZXJuZWxGdW5jKHtcbiAgb3BTbmlwcGV0OiBTSUdNT0lELFxuICBwYWNrZWRPcFNuaXBwZXQ6IFNJR01PSUQsXG4gIGNwdUtlcm5lbEltcGw6IHNpZ21vaWRJbXBsQ1BVXG59KTtcblxuZXhwb3J0IGNvbnN0IHNpZ21vaWRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU2lnbW9pZCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHNpZ21vaWQsXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgU2lnbn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuXG4vLyBTaWduIGRvZXMgbm90IHByb3BhZ2F0ZSBOQU5zLlxuY29uc3QgU0lHTiA9IGBcbiAgaWYgKGlzbmFuKHgpKSB7IHJldHVybiAwLjA7IH1cbiAgcmV0dXJuIHNpZ24oeCk7XG5gO1xuXG5leHBvcnQgY29uc3Qgc2lnbiA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBTSUdOfSk7XG5cbmV4cG9ydCBjb25zdCBzaWduQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNpZ24sXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBzaWduLFxufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIFNpbn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtDSEVDS19OQU5fU05JUFBFVF9VTkFSWSwgdW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgU0lOID0gQ0hFQ0tfTkFOX1NOSVBQRVRfVU5BUlkgKyBgXG4gIHJldHVybiBzaW4oeCk7XG5gO1xuXG5leHBvcnQgY29uc3Qgc2luID0gdW5hcnlLZXJuZWxGdW5jKHtvcFNuaXBwZXQ6IFNJTn0pO1xuXG5leHBvcnQgY29uc3Qgc2luQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNpbixcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHNpbixcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBTaW5ofSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuXG5jb25zdCBTSU5IID0gYFxuICBmbG9hdCBlMnggPSBleHAoeCk7XG4gIHJldHVybiAoZTJ4IC0gMS4wIC8gZTJ4KSAvIDIuMDtcbmA7XG5cbmV4cG9ydCBjb25zdCBzaW5oID0gdW5hcnlLZXJuZWxGdW5jKHtvcFNuaXBwZXQ6IFNJTkh9KTtcblxuZXhwb3J0IGNvbnN0IHNpbmhDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU2luaCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHNpbmgsXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2VudiwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBTbGljZSwgc2xpY2VfdXRpbCwgU2xpY2VBdHRycywgU2xpY2VJbnB1dHMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge3NsaWNlSW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5pbXBvcnQge1NsaWNlUHJvZ3JhbX0gZnJvbSAnLi4vc2xpY2VfZ3B1JztcbmltcG9ydCB7U2xpY2VQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9zbGljZV9wYWNrZWRfZ3B1JztcblxuZnVuY3Rpb24gc2hhbGxvd1NsaWNlKFxuICAgIHg6IFRlbnNvckluZm8sIGJlZ2luOiBudW1iZXJbXSwgc2l6ZTogbnVtYmVyW10sIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wpIHtcbiAgY29uc3QgeFRleERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KHguZGF0YUlkKTtcbiAgY29uc3QgdCA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8oc2l6ZSwgeC5kdHlwZSk7XG4gIGNvbnN0IG5ld1RleERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KHQuZGF0YUlkKTtcbiAgLy8gQ29weSB0ZXh0dXJlIGRhdGEgZnJvbSB0aGUgb3JpZ2luYWwgdGVuc29yLlxuICBPYmplY3QuYXNzaWduKG5ld1RleERhdGEsIHhUZXhEYXRhKTtcbiAgbmV3VGV4RGF0YS5yZWZDb3VudCA9IDE7XG4gIG5ld1RleERhdGEuc2hhcGUgPSBzaXplO1xuICBuZXdUZXhEYXRhLmR0eXBlID0geC5kdHlwZTtcbiAgbGV0IGZsYXRPZmZzZXQgPVxuICAgICAgc2xpY2VfdXRpbC5jb21wdXRlRmxhdE9mZnNldChiZWdpbiwgdXRpbC5jb21wdXRlU3RyaWRlcyh4LnNoYXBlKSk7XG4gIGlmICh4VGV4RGF0YS5zbGljZSkge1xuICAgIC8vIFdlIGFyZSBzbGljaW5nIGFuIGFscmVhZHkgc2xpY2VkIHRlbnNvciwgc28gd2UgaGF2ZSB0byBhY2N1bXVsYXRlXG4gICAgLy8gdGhlIG9mZnNldC5cbiAgICBmbGF0T2Zmc2V0ICs9IHhUZXhEYXRhLnNsaWNlLmZsYXRPZmZzZXQ7XG4gIH1cbiAgbmV3VGV4RGF0YS5zbGljZSA9IHtcbiAgICBmbGF0T2Zmc2V0LFxuICAgIC8vIFBvaW50IHRvIHRoZSBvcmlnaW5hbCBkYXRhSWQsIHdoaWNoIGlzIHVzZWQgdG8gZG8gcmVmIGNvdW50aW5nLlxuICAgIG9yaWdEYXRhSWQ6IHhUZXhEYXRhLnNsaWNlICYmIHhUZXhEYXRhLnNsaWNlLm9yaWdEYXRhSWQgfHwgeC5kYXRhSWRcbiAgfTtcblxuICAvLyBJbmNyZWFzZSB0aGUgcmVmIGNvdW50IGZvciB0aGF0IGRhdGEgYnVja2V0LlxuICBjb25zdCByZWZDb3VudCA9IGJhY2tlbmQuZGF0YVJlZkNvdW50LmdldChuZXdUZXhEYXRhLnNsaWNlLm9yaWdEYXRhSWQpIHx8IDE7XG4gIGJhY2tlbmQuZGF0YVJlZkNvdW50LnNldChuZXdUZXhEYXRhLnNsaWNlLm9yaWdEYXRhSWQsIHJlZkNvdW50ICsgMSk7XG4gIHJldHVybiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2xpY2UoXG4gICAgYXJnczoge2lucHV0czogU2xpY2VJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsIGF0dHJzOiBTbGljZUF0dHJzfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge2JlZ2luLCBzaXplfSA9IGF0dHJzO1xuXG4gIGNvbnN0IFskYmVnaW4sICRzaXplXSA9IHNsaWNlX3V0aWwucGFyc2VTbGljZVBhcmFtcyh4LCBiZWdpbiwgc2l6ZSk7XG4gIHNsaWNlX3V0aWwuYXNzZXJ0UGFyYW1zVmFsaWQoeCwgJGJlZ2luLCAkc2l6ZSk7XG5cbiAgaWYgKHV0aWwuc2l6ZUZyb21TaGFwZSgkc2l6ZSkgPT09IDApIHtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbygkc2l6ZSwgeC5kdHlwZSwgW10pO1xuICB9XG5cbiAgLy8gUnVuIG9uIGNwdSBpZiBkdHlwZSBpcyBzdHJpbmcuIEZvciBzdHJpbmcsIHRoZSBiYWNrZW5kIHJlcHJlc2VudHMgaXRcbiAgLy8gYXMgVWludDhBcnJheVtdLCB3aGVyZSBlYWNoIFVpbnQ4QXJyYXkgaXMgYSBjaGFyYWN0ZXIuIEdpdmVuIHRoYXQgdGhlXG4gIC8vIGNvbXB1dGF0aW9uIGlzIG9ubHkgb24gdGhlIG91dGVyIGFycmF5LCB1cGxvYWRpbmcgdGhlIHdob2xlIGRhdGEgb250b1xuICAvLyBncHUgaXMgd2FzdGVmdWwuIEFsc28sIGN1cnJlbnRseSB3ZWJnbCBkb2Vzbid0IGhhdmUgYSBkZXNpZ24gdG9cbiAgLy8gdXBsb2FkIGFuZCByZXRyaWV2ZSBVaW50OEFycmF5W10gYmV0d2VlbiBjcHUgYW5kIGdwdS4gVGhlcmVmb3JlLCB3ZVxuICAvLyBqdXN0IHJ1biB0aGUga2VybmVsIG9uIGNwdSBpZiBkdHlwZSBpcyBzdHJpbmcuXG4gIGlmIChiYWNrZW5kLnNob3VsZEV4ZWN1dGVPbkNQVShbeF0pIHx8IHguZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgeFRleERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KHguZGF0YUlkKTtcbiAgICBjb25zdCBvdXRWYWx1ZXMgPSBzbGljZUltcGxDUFUoXG4gICAgICAgIHhUZXhEYXRhLnZhbHVlcyBhcyBUeXBlZEFycmF5LCAkYmVnaW4sICRzaXplLCB4LnNoYXBlLCB4LmR0eXBlKTtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbygkc2l6ZSwgeC5kdHlwZSwgb3V0VmFsdWVzKTtcbiAgfVxuXG4gIGNvbnN0IHtpc1BhY2tlZH0gPSBiYWNrZW5kLnRleERhdGEuZ2V0KHguZGF0YUlkKTtcbiAgY29uc3QgaXNDb250aW5vdXMgPSBzbGljZV91dGlsLmlzU2xpY2VDb250aW5vdXMoeC5zaGFwZSwgJGJlZ2luLCAkc2l6ZSk7XG4gIGlmIChpc1BhY2tlZCB8fCAhaXNDb250aW5vdXMpIHtcbiAgICBjb25zdCBwcm9ncmFtID0gZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19BUlJBWV9PUEVSQVRJT05TJykgP1xuICAgICAgICBuZXcgU2xpY2VQYWNrZWRQcm9ncmFtKCRzaXplKSA6XG4gICAgICAgIG5ldyBTbGljZVByb2dyYW0oJHNpemUpO1xuICAgIGNvbnN0IGN1c3RvbVZhbHVlcyA9IFskYmVnaW5dO1xuICAgIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeF0sIHguZHR5cGUsIGN1c3RvbVZhbHVlcyk7XG4gIH1cbiAgYmFja2VuZC51cGxvYWRUb0dQVSh4LmRhdGFJZCk7XG4gIHJldHVybiBzaGFsbG93U2xpY2UoeCwgJGJlZ2luLCAkc2l6ZSwgYmFja2VuZCk7XG59XG5cbmV4cG9ydCBjb25zdCBzbGljZUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTbGljZSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHNsaWNlIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFNvZnRtYXgsIFNvZnRtYXhBdHRycywgU29mdG1heElucHV0cywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcblxuaW1wb3J0IHtleHB9IGZyb20gJy4vRXhwJztcbmltcG9ydCB7bWF4fSBmcm9tICcuL01heCc7XG5pbXBvcnQge3JlYWxEaXZ9IGZyb20gJy4vUmVhbERpdic7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQge3N1Yn0gZnJvbSAnLi9TdWInO1xuaW1wb3J0IHtzdW19IGZyb20gJy4vU3VtJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNvZnRtYXgoYXJnczoge1xuICBpbnB1dHM6IFNvZnRtYXhJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBTb2Z0bWF4QXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2xvZ2l0c30gPSBpbnB1dHM7XG4gIGNvbnN0IHtkaW19ID0gYXR0cnM7XG5cbiAgY29uc3QgYXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oW2RpbV0sIGxvZ2l0cy5zaGFwZSk7XG5cbiAgY29uc3QgbWF4TG9naXQgPSBtYXgoe1xuICAgIGlucHV0czoge3g6IGxvZ2l0c30sXG4gICAgYmFja2VuZCxcbiAgICBhdHRyczoge3JlZHVjdGlvbkluZGljZXM6IGF4ZXMsIGtlZXBEaW1zOiBmYWxzZX1cbiAgfSk7XG5cbiAgY29uc3QgZXhwYW5kZWRTaGFwZSA9IGJhY2tlbmRfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbShtYXhMb2dpdC5zaGFwZSwgYXhlcyk7XG5cbiAgY29uc3QgbWF4TG9naXRzUmVzaGFwZWQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogbWF4TG9naXR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBleHBhbmRlZFNoYXBlfX0pO1xuICBjb25zdCBhID1cbiAgICAgIHN1Yih7aW5wdXRzOiB7YTogbG9naXRzLCBiOiBtYXhMb2dpdHNSZXNoYXBlZH0sIGJhY2tlbmR9KSBhcyBUZW5zb3JJbmZvO1xuICBjb25zdCBiID0gZXhwKHtpbnB1dHM6IHt4OiBhfSwgYmFja2VuZH0pIGFzIFRlbnNvckluZm87XG4gIGNvbnN0IHN1bUV4cCA9XG4gICAgICBzdW0oe2lucHV0czoge3g6IGJ9LCBiYWNrZW5kLCBhdHRyczoge2F4aXM6IGF4ZXMsIGtlZXBEaW1zOiBmYWxzZX19KTtcbiAgY29uc3Qgc3VtRXhwUmVzaGFwZWQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogc3VtRXhwfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogZXhwYW5kZWRTaGFwZX19KTtcblxuICBjb25zdCByZXMgPVxuICAgICAgcmVhbERpdih7aW5wdXRzOiB7YTogYiwgYjogc3VtRXhwUmVzaGFwZWR9LCBiYWNrZW5kfSkgYXMgVGVuc29ySW5mbztcblxuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG1heExvZ2l0KTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhtYXhMb2dpdHNSZXNoYXBlZCk7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oYSk7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oYik7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oc3VtRXhwKTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhzdW1FeHBSZXNoYXBlZCk7XG5cbiAgcmV0dXJuIHJlcztcbn1cblxuZXhwb3J0IGNvbnN0IHNvZnRtYXhDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU29mdG1heCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHNvZnRtYXggYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIFNvZnRwbHVzfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuXG5jb25zdCBTT0ZUUExVUyA9IGBcbiAgZmxvYXQgZXBzaWxvbiA9IDEuMTkyMDkyODk1NTA3ODEyNWUtNztcbiAgZmxvYXQgdGhyZXNob2xkID0gbG9nKGVwc2lsb24pICsgMi4wO1xuXG4gIGJvb2wgdG9vX2xhcmdlID0geCA+IC10aHJlc2hvbGQ7XG4gIGJvb2wgdG9vX3NtYWxsID0geCA8IHRocmVzaG9sZDtcblxuICBmbG9hdCByZXN1bHQ7XG4gIGZsb2F0IGV4cF94ID0gZXhwKHgpO1xuXG4gIGlmICh0b29fbGFyZ2Upe1xuICAgIHJlc3VsdCA9IHg7XG4gIH1cbiAgZWxzZSBpZiAodG9vX3NtYWxsKXtcbiAgICByZXN1bHQgPSBleHBfeDtcbiAgfVxuICBlbHNle1xuICAgIHJlc3VsdCA9IGxvZyhleHBfeCArIDEuMCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbmA7XG5cbmV4cG9ydCBjb25zdCBzb2Z0cGx1cyA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBTT0ZUUExVU30pO1xuXG5leHBvcnQgY29uc3Qgc29mdHBsdXNDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU29mdHBsdXMsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBzb2Z0cGx1cyxcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFNwYWNlVG9CYXRjaE5ELCBTcGFjZVRvQmF0Y2hOREF0dHJzLCBTcGFjZVRvQmF0Y2hORElucHV0cywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcblxuaW1wb3J0IHtwYWRWMn0gZnJvbSAnLi9QYWRWMic7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQge3RyYW5zcG9zZX0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuXG5leHBvcnQgY29uc3Qgc3BhY2VUb0JhdGNoTkQgPSAoYXJnczoge1xuICBpbnB1dHM6IFNwYWNlVG9CYXRjaE5ESW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogU3BhY2VUb0JhdGNoTkRBdHRyc1xufSk6IFRlbnNvckluZm8gPT4ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtibG9ja1NoYXBlLCBwYWRkaW5nc30gPSBhdHRycztcblxuICB1dGlsLmFzc2VydChcbiAgICAgIHguc2hhcGUubGVuZ3RoIDw9IDQsXG4gICAgICAoKSA9PiAnc3BhY2VUb0JhdGNoTkQgZm9yIHJhbmsgPiA0IHdpdGggYSBXZWJHTCBiYWNrZW5kIG5vdCAnICtcbiAgICAgICAgICAnaW1wbGVtZW50ZWQgeWV0Jyk7XG5cbiAgY29uc3QgcHJvZCA9IGJsb2NrU2hhcGUucmVkdWNlKChhLCBiKSA9PiBhICogYik7XG5cbiAgY29uc3QgY29tcGxldGVQYWRkaW5nczogQXJyYXk8W251bWJlciwgbnVtYmVyXT4gPSBbWzAsIDBdXTtcbiAgY29tcGxldGVQYWRkaW5ncy5wdXNoKC4uLnBhZGRpbmdzIGFzIEFycmF5PFtudW1iZXIsIG51bWJlcl0+KTtcbiAgZm9yIChsZXQgaSA9IDEgKyBibG9ja1NoYXBlLmxlbmd0aDsgaSA8IHguc2hhcGUubGVuZ3RoOyArK2kpIHtcbiAgICBjb21wbGV0ZVBhZGRpbmdzLnB1c2goWzAsIDBdKTtcbiAgfVxuXG4gIGNvbnN0IHRvRGlzcG9zZSA9IFtdO1xuXG4gIGNvbnN0IHBhZGRlZFggPSBwYWRWMih7XG4gICAgaW5wdXRzOiB7eH0sXG4gICAgYmFja2VuZCxcbiAgICBhdHRyczoge3BhZGRpbmdzOiBjb21wbGV0ZVBhZGRpbmdzLCBjb25zdGFudFZhbHVlOiAwfVxuICB9KTtcblxuICBjb25zdCByZXNoYXBlZFBhZGRlZFNoYXBlID1cbiAgICAgIGJhY2tlbmRfdXRpbC5nZXRSZXNoYXBlZChwYWRkZWRYLnNoYXBlLCBibG9ja1NoYXBlLCBwcm9kLCBmYWxzZSk7XG5cbiAgY29uc3QgcGVybXV0ZWRSZXNoYXBlZFBhZGRlZFBlcm11dGF0aW9uID0gYmFja2VuZF91dGlsLmdldFBlcm11dGVkKFxuICAgICAgcmVzaGFwZWRQYWRkZWRTaGFwZS5sZW5ndGgsIGJsb2NrU2hhcGUubGVuZ3RoLCBmYWxzZSk7XG5cbiAgY29uc3QgZmxhdHRlblNoYXBlID1cbiAgICAgIGJhY2tlbmRfdXRpbC5nZXRSZXNoYXBlZFBlcm11dGVkKHBhZGRlZFguc2hhcGUsIGJsb2NrU2hhcGUsIHByb2QsIGZhbHNlKTtcblxuICBjb25zdCByZXNoYXBlZFBhZGRlZFggPSByZXNoYXBlKFxuICAgICAge2lucHV0czoge3g6IHBhZGRlZFh9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiByZXNoYXBlZFBhZGRlZFNoYXBlfX0pO1xuXG4gIGNvbnN0IHBhZGRlZFhUID0gdHJhbnNwb3NlKHtcbiAgICBpbnB1dHM6IHt4OiByZXNoYXBlZFBhZGRlZFh9LFxuICAgIGJhY2tlbmQsXG4gICAgYXR0cnM6IHtwZXJtOiBwZXJtdXRlZFJlc2hhcGVkUGFkZGVkUGVybXV0YXRpb259XG4gIH0pO1xuXG4gIGNvbnN0IHJlc3VsdCA9XG4gICAgICByZXNoYXBlKHtpbnB1dHM6IHt4OiBwYWRkZWRYVH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IGZsYXR0ZW5TaGFwZX19KTtcblxuICB0b0Rpc3Bvc2UucHVzaChwYWRkZWRYKTtcbiAgdG9EaXNwb3NlLnB1c2gocmVzaGFwZWRQYWRkZWRYKTtcbiAgdG9EaXNwb3NlLnB1c2gocGFkZGVkWFQpO1xuXG4gIHRvRGlzcG9zZS5mb3JFYWNoKHQgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0KSk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmV4cG9ydCBjb25zdCBzcGFjZVRvQmF0Y2hORENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTcGFjZVRvQmF0Y2hORCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHNwYWNlVG9CYXRjaE5EIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBTcGFyc2VGaWxsRW1wdHlSb3dzLCBTcGFyc2VGaWxsRW1wdHlSb3dzSW5wdXRzLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtzcGFyc2VGaWxsRW1wdHlSb3dzSW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGFyc2VGaWxsRW1wdHlSb3dzKGFyZ3M6IHtcbiAgaW5wdXRzOiBTcGFyc2VGaWxsRW1wdHlSb3dzSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMXG59KTogW1RlbnNvckluZm8sIFRlbnNvckluZm8sIFRlbnNvckluZm8sIFRlbnNvckluZm9dIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7aW5kaWNlcywgdmFsdWVzLCBkZW5zZVNoYXBlLCBkZWZhdWx0VmFsdWV9ID0gaW5wdXRzO1xuICBpZiAoZGVuc2VTaGFwZS5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYERlbnNlIHNoYXBlIG11c3QgYmUgYSB2ZWN0b3IsIHNhdzpcbiAgICAgICAgICR7ZGVuc2VTaGFwZS5zaGFwZX1gKTtcbiAgfVxuICBpZiAoaW5kaWNlcy5zaGFwZS5sZW5ndGggIT09IDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEluZGljZXMgbXVzdCBiZSBhIG1hdHJpeCwgc2F3OlxuICAgICAgICAgJHtpbmRpY2VzLnNoYXBlfWApO1xuICB9XG4gIGlmICh2YWx1ZXMuc2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBWYWx1ZXMgbXVzdCBiZSBhIHZlY3Rvciwgc2F3OlxuICAgICAgICAgJHt2YWx1ZXMuc2hhcGV9YCk7XG4gIH1cbiAgaWYgKGRlZmF1bHRWYWx1ZS5zaGFwZS5sZW5ndGggIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYERlZmF1bHQgdmFsdWUgbXVzdCBiZSBhIHNjYWxhciwgc2F3OlxuICAgICAgICAke2RlZmF1bHRWYWx1ZS5zaGFwZX1gKTtcbiAgfVxuXG4gIGNvbnN0ICRpbmRpY2VzID0gYmFja2VuZC5yZWFkU3luYyhpbmRpY2VzLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgJHZhbHVlcyA9IGJhY2tlbmQucmVhZFN5bmModmFsdWVzLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgJGRlbnNlU2hhcGUgPSBiYWNrZW5kLnJlYWRTeW5jKGRlbnNlU2hhcGUuZGF0YUlkKSBhcyBUeXBlZEFycmF5O1xuICBjb25zdCAkZGVmYXVsdFZhbHVlID1cbiAgICAgIGJhY2tlbmQucmVhZFN5bmMoZGVmYXVsdFZhbHVlLmRhdGFJZClbMF0gYXMgbnVtYmVyO1xuXG4gIGNvbnN0IFtvdXRwdXRJbmRpY2VzLCBvdXRwdXRJbmRpY2VzU2hhcGUsIG91dHB1dFZhbHVlcyxcbiAgICAgICAgIGVtcHR5Um93SW5kaWNhdG9yLCByZXZlcnNlSW5kZXhNYXBdID1cbiAgICAgIHNwYXJzZUZpbGxFbXB0eVJvd3NJbXBsQ1BVKFxuICAgICAgICAgICRpbmRpY2VzLCBpbmRpY2VzLnNoYXBlLCBpbmRpY2VzLmR0eXBlLCAkdmFsdWVzLCB2YWx1ZXMuZHR5cGUsXG4gICAgICAgICAgJGRlbnNlU2hhcGUsICRkZWZhdWx0VmFsdWUpO1xuICByZXR1cm4gW1xuICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0cHV0SW5kaWNlc1NoYXBlLCBpbmRpY2VzLmR0eXBlLCBvdXRwdXRJbmRpY2VzKSxcbiAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFxuICAgICAgICBbb3V0cHV0SW5kaWNlc1NoYXBlWzBdXSwgdmFsdWVzLmR0eXBlLCBvdXRwdXRWYWx1ZXMpLFxuICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oXG4gICAgICAgIFtlbXB0eVJvd0luZGljYXRvci5sZW5ndGhdLCAnYm9vbCcsXG4gICAgICAgIG5ldyBVaW50OEFycmF5KFxuICAgICAgICAgICAgZW1wdHlSb3dJbmRpY2F0b3IubWFwKCh2YWx1ZTogYm9vbGVhbikgPT4gTnVtYmVyKHZhbHVlKSkpKSxcbiAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFxuICAgICAgICBbcmV2ZXJzZUluZGV4TWFwLmxlbmd0aF0sIGluZGljZXMuZHR5cGUsXG4gICAgICAgIG5ldyBJbnQzMkFycmF5KHJldmVyc2VJbmRleE1hcCkpLFxuICBdO1xufVxuXG5leHBvcnQgY29uc3Qgc3BhcnNlRmlsbEVtcHR5Um93c0NvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTcGFyc2VGaWxsRW1wdHlSb3dzLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogc3BhcnNlRmlsbEVtcHR5Um93cyBhcyB7fSBhcyBLZXJuZWxGdW5jLFxufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIFNwYXJzZVJlc2hhcGUsIFNwYXJzZVJlc2hhcGVJbnB1dHMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge3NwYXJzZVJlc2hhcGVJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXJzZVJlc2hhcGUoXG4gICAgYXJnczoge2lucHV0czogU3BhcnNlUmVzaGFwZUlucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTH0pOlxuICAgIFtUZW5zb3JJbmZvLCBUZW5zb3JJbmZvXSB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge2lucHV0SW5kaWNlcywgaW5wdXRTaGFwZSwgbmV3U2hhcGV9ID0gaW5wdXRzO1xuICBpZiAoaW5wdXRJbmRpY2VzLnNoYXBlLmxlbmd0aCAhPT0gMikge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW5wdXQgaW5kaWNlcyBzaG91bGQgYmUgYSBtYXRyaXggYnV0IHJlY2VpdmVkIHNoYXBlICR7XG4gICAgICAgIGlucHV0SW5kaWNlcy5zaGFwZX1gKTtcbiAgfVxuICBpZiAoaW5wdXRTaGFwZS5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYElucHV0IHNoYXBlIHNob3VsZCBiZSBhIHZlY3RvciBidXQgcmVjZWl2ZWQgc2hhcGUgJHtcbiAgICAgICAgaW5wdXRTaGFwZS5zaGFwZX1gKTtcbiAgfVxuXG4gIGlmIChuZXdTaGFwZS5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUYXJnZXQgc2hhcGUgc2hvdWxkIGJlIGEgdmVjdG9yIGJ1dCByZWNlaXZlZCBzaGFwZSAke25ld1NoYXBlLnNoYXBlfWApO1xuICB9XG5cbiAgY29uc3QgJGlucHV0U2hhcGUgPVxuICAgICAgQXJyYXkuZnJvbShiYWNrZW5kLnJlYWRTeW5jKGlucHV0U2hhcGUuZGF0YUlkKSBhcyBUeXBlZEFycmF5KTtcbiAgY29uc3QgJGlucHV0SW5kaWNlcyA9IGJhY2tlbmQucmVhZFN5bmMoaW5wdXRJbmRpY2VzLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgdGFyZ2V0U2hhcGUgPVxuICAgICAgQXJyYXkuZnJvbShiYWNrZW5kLnJlYWRTeW5jKG5ld1NoYXBlLmRhdGFJZCkgYXMgVHlwZWRBcnJheSk7XG5cbiAgY29uc3QgW25ld0luZGljZXMsIGluZGljZXNTaGFwZSwgb3V0cHV0U2hhcGVdID0gc3BhcnNlUmVzaGFwZUltcGxDUFUoXG4gICAgICAkaW5wdXRJbmRpY2VzLCBpbnB1dEluZGljZXMuc2hhcGUsIGlucHV0SW5kaWNlcy5kdHlwZSwgJGlucHV0U2hhcGUsXG4gICAgICB0YXJnZXRTaGFwZSk7XG4gIHJldHVybiBbXG4gICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhpbmRpY2VzU2hhcGUsIGlucHV0SW5kaWNlcy5kdHlwZSwgbmV3SW5kaWNlcyksXG4gICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgICAgW291dHB1dFNoYXBlLmxlbmd0aF0sIG5ld1NoYXBlLmR0eXBlLCBuZXcgSW50MzJBcnJheShvdXRwdXRTaGFwZSkpLFxuICBdO1xufVxuXG5leHBvcnQgY29uc3Qgc3BhcnNlUmVzaGFwZUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTcGFyc2VSZXNoYXBlLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogc3BhcnNlUmVzaGFwZSxcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBTcGFyc2VTZWdtZW50TWVhbiwgU3BhcnNlU2VnbWVudE1lYW5JbnB1dHMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge3NwYXJzZVNlZ21lbnRSZWR1Y3Rpb25JbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXJzZVNlZ21lbnRNZWFuKFxuICAgIGFyZ3M6IHtpbnB1dHM6IFNwYXJzZVNlZ21lbnRNZWFuSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge2RhdGEsIGluZGljZXMsIHNlZ21lbnRJZHN9ID0gaW5wdXRzO1xuICBpZiAoZGF0YS5zaGFwZS5sZW5ndGggPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRGF0YSBzaG91bGQgYmUgYXQgbGVhc3QgMSBkaW1lbnNpb25hbCBidXQgcmVjZWl2ZWQgc2NhbGFyYCk7XG4gIH1cbiAgaWYgKGluZGljZXMuc2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbmRpY2VzIHNob3VsZCBiZSBhIHZlY3RvciBidXQgcmVjZWl2ZWQgc2hhcGVcbiAgICAgICAgICAgICAgJHtpbmRpY2VzLnNoYXBlfWApO1xuICB9XG4gIGlmIChzZWdtZW50SWRzLnNoYXBlLmxlbmd0aCAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgU2VnbWVudCBpZHMgc2hvdWxkIGJlIGEgdmVjdG9yIGJ1dCByZWNlaXZlZCBzaGFwZVxuICAgICAgICAgICAgICAke3NlZ21lbnRJZHMuc2hhcGV9YCk7XG4gIH1cblxuICBjb25zdCAkZGF0YSA9IGJhY2tlbmQucmVhZFN5bmMoZGF0YS5kYXRhSWQpIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0ICRpbmRpY2VzID0gYmFja2VuZC5yZWFkU3luYyhpbmRpY2VzLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgJHNlZ21lbnRJZHMgPSBiYWNrZW5kLnJlYWRTeW5jKHNlZ21lbnRJZHMuZGF0YUlkKSBhcyBUeXBlZEFycmF5O1xuXG4gIGNvbnN0IFtvdXRwdXREYXRhLCBvdXRwdXREYXRhU2hhcGVdID0gc3BhcnNlU2VnbWVudFJlZHVjdGlvbkltcGxDUFUoXG4gICAgICAkZGF0YSwgZGF0YS5zaGFwZSwgZGF0YS5kdHlwZSwgJGluZGljZXMsICRzZWdtZW50SWRzLCB0cnVlKTtcbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0cHV0RGF0YVNoYXBlLCBkYXRhLmR0eXBlLCBvdXRwdXREYXRhKTtcbn1cblxuZXhwb3J0IGNvbnN0IHNwYXJzZVNlZ21lbnRNZWFuQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNwYXJzZVNlZ21lbnRNZWFuLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogc3BhcnNlU2VnbWVudE1lYW4gYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBTcGFyc2VTZWdtZW50U3VtLCBTcGFyc2VTZWdtZW50U3VtSW5wdXRzLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtzcGFyc2VTZWdtZW50UmVkdWN0aW9uSW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGFyc2VTZWdtZW50U3VtKFxuICAgIGFyZ3M6IHtpbnB1dHM6IFNwYXJzZVNlZ21lbnRTdW1JbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7ZGF0YSwgaW5kaWNlcywgc2VnbWVudElkc30gPSBpbnB1dHM7XG4gIGlmIChkYXRhLnNoYXBlLmxlbmd0aCA8IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBEYXRhIHNob3VsZCBiZSBhdCBsZWFzdCAxIGRpbWVuc2lvbmFsIGJ1dCByZWNlaXZlZCBzY2FsYXJgKTtcbiAgfVxuICBpZiAoaW5kaWNlcy5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEluZGljZXMgc2hvdWxkIGJlIGEgdmVjdG9yIGJ1dCByZWNlaXZlZCBzaGFwZVxuICAgICAgICAgICAgICR7aW5kaWNlcy5zaGFwZX1gKTtcbiAgfVxuICBpZiAoc2VnbWVudElkcy5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNlZ21lbnQgaWRzIHNob3VsZCBiZSBhIHZlY3RvciBidXQgcmVjZWl2ZWQgc2hhcGVcbiAgICAgICAgICAgICAke3NlZ21lbnRJZHMuc2hhcGV9YCk7XG4gIH1cblxuICBjb25zdCAkZGF0YSA9IGJhY2tlbmQucmVhZFN5bmMoZGF0YS5kYXRhSWQpIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0ICRpbmRpY2VzID0gYmFja2VuZC5yZWFkU3luYyhpbmRpY2VzLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgJHNlZ21lbnRJZHMgPSBiYWNrZW5kLnJlYWRTeW5jKHNlZ21lbnRJZHMuZGF0YUlkKSBhcyBUeXBlZEFycmF5O1xuXG4gIGNvbnN0IFtvdXRwdXREYXRhLCBvdXRwdXREYXRhU2hhcGVdID0gc3BhcnNlU2VnbWVudFJlZHVjdGlvbkltcGxDUFUoXG4gICAgICAkZGF0YSwgZGF0YS5zaGFwZSwgZGF0YS5kdHlwZSwgJGluZGljZXMsICRzZWdtZW50SWRzKTtcbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0cHV0RGF0YVNoYXBlLCBkYXRhLmR0eXBlLCBvdXRwdXREYXRhKTtcbn1cblxuZXhwb3J0IGNvbnN0IHNwYXJzZVNlZ21lbnRTdW1Db25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU3BhcnNlU2VnbWVudFN1bSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHNwYXJzZVNlZ21lbnRTdW0gYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFNwYXJzZVRvRGVuc2UsIFNwYXJzZVRvRGVuc2VBdHRycywgU3BhcnNlVG9EZW5zZUlucHV0cywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7U2NhdHRlclByb2dyYW19IGZyb20gJy4uL3NjYXR0ZXJfZ3B1JztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXJzZVRvRGVuc2UoYXJnczoge1xuICBpbnB1dHM6IFNwYXJzZVRvRGVuc2VJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBTcGFyc2VUb0RlbnNlQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3NwYXJzZUluZGljZXMsIHNwYXJzZVZhbHVlcywgZGVmYXVsdFZhbHVlfSA9IGlucHV0cztcbiAgY29uc3Qge291dHB1dFNoYXBlfSA9IGF0dHJzO1xuXG4gIGNvbnN0IHtzbGljZVJhbmssIG51bVVwZGF0ZXMsIHN0cmlkZXMsIG91dHB1dFNpemV9ID1cbiAgICAgIGJhY2tlbmRfdXRpbC5jYWxjdWxhdGVTaGFwZXMoc3BhcnNlVmFsdWVzLCBzcGFyc2VJbmRpY2VzLCBvdXRwdXRTaGFwZSk7XG5cbiAgY29uc3Qgc3VtRHVwZUluZGljZXMgPSBmYWxzZTtcbiAgY29uc3QgcHJvZ3JhbSA9IG5ldyBTY2F0dGVyUHJvZ3JhbShcbiAgICAgIG51bVVwZGF0ZXMsIHNsaWNlUmFuaywgc3BhcnNlSW5kaWNlcy5zaGFwZS5sZW5ndGgsXG4gICAgICBzcGFyc2VWYWx1ZXMuc2hhcGUubGVuZ3RoLCBzdHJpZGVzLCBbb3V0cHV0U2l6ZSwgMV0sIHN1bUR1cGVJbmRpY2VzKTtcblxuICBjb25zdCByZXMgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShcbiAgICAgIHByb2dyYW0sIFtzcGFyc2VWYWx1ZXMsIHNwYXJzZUluZGljZXMsIGRlZmF1bHRWYWx1ZV0sIHNwYXJzZVZhbHVlcy5kdHlwZSk7XG5cbiAgY29uc3QgcmVzaGFwZWQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogcmVzfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogb3V0cHV0U2hhcGV9fSk7XG5cbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXMpO1xuICByZXR1cm4gcmVzaGFwZWQ7XG59XG5cbmV4cG9ydCBjb25zdCBzcGFyc2VUb0RlbnNlQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNwYXJzZVRvRGVuc2UsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBzcGFyc2VUb0RlbnNlIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFNwbGl0ViwgU3BsaXRWQXR0cnMsIFNwbGl0VklucHV0cywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7c2xpY2V9IGZyb20gJy4vU2xpY2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRWKFxuICAgIGFyZ3M6XG4gICAgICAgIHtpbnB1dHM6IFNwbGl0VklucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCwgYXR0cnM6IFNwbGl0VkF0dHJzfSk6XG4gICAgVGVuc29ySW5mb1tdIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7bnVtT3JTaXplU3BsaXRzLCBheGlzfSA9IGF0dHJzO1xuXG4gIGNvbnN0ICRheGlzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShheGlzLCB4LnNoYXBlKVswXTtcbiAgY29uc3Qgc3BsaXRTaXplcyA9IGJhY2tlbmRfdXRpbC5wcmVwYXJlU3BsaXRTaXplKHgsIG51bU9yU2l6ZVNwbGl0cywgJGF4aXMpO1xuXG4gIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG4gIGNvbnN0IGJlZ2luID0gbmV3IEFycmF5KHhSYW5rKS5maWxsKDApO1xuICBjb25zdCBzaXplID0geC5zaGFwZS5zbGljZSgpO1xuXG4gIHJldHVybiBzcGxpdFNpemVzLm1hcChzID0+IHtcbiAgICBjb25zdCBzbGljZVNpemUgPSBbLi4uc2l6ZV07XG4gICAgc2xpY2VTaXplWyRheGlzXSA9IHM7XG4gICAgY29uc3Qgc2xpY2VUID1cbiAgICAgICAgc2xpY2Uoe2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge2JlZ2luLCBzaXplOiBzbGljZVNpemV9fSk7XG4gICAgYmVnaW5bJGF4aXNdICs9IHM7XG4gICAgcmV0dXJuIHNsaWNlVDtcbiAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBzcGxpdFZDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU3BsaXRWLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogc3BsaXRWIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBTcXJ0fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge3VuYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQge3NxcnRJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuY29uc3QgU1FSVCA9IGByZXR1cm4gc3FydCh4KTtgO1xuXG5leHBvcnQgY29uc3Qgc3FydCA9IHVuYXJ5S2VybmVsRnVuYyhcbiAgICB7b3BTbmlwcGV0OiBTUVJULCBwYWNrZWRPcFNuaXBwZXQ6IFNRUlQsIGNwdUtlcm5lbEltcGw6IHNxcnRJbXBsQ1BVfSk7XG5cbmV4cG9ydCBjb25zdCBzcXJ0Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNxcnQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBzcXJ0IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBTcXVhcmV9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgU1FVQVJFID0gYHJldHVybiB4ICogeDtgO1xuXG5leHBvcnQgY29uc3Qgc3F1YXJlID0gdW5hcnlLZXJuZWxGdW5jKHtvcFNuaXBwZXQ6IFNRVUFSRX0pO1xuXG5leHBvcnQgY29uc3Qgc3F1YXJlQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNxdWFyZSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHNxdWFyZSxcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBTcXVhcmVkRGlmZmVyZW5jZX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtiaW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgU1FVQVJFRF9ESUZGRVJFTkNFID0gJ3JldHVybiAoYSAtIGIpICogKGEgLSBiKTsnO1xuXG5leHBvcnQgY29uc3Qgc3F1YXJlZERpZmZlcmVuY2UgPSBiaW5hcnlLZXJuZWxGdW5jKFxuICAgIHtvcFNuaXBwZXQ6IFNRVUFSRURfRElGRkVSRU5DRSwgcGFja2VkT3BTbmlwcGV0OiBTUVVBUkVEX0RJRkZFUkVOQ0V9KTtcblxuZXhwb3J0IGNvbnN0IHNxdWFyZWREaWZmZXJlbmNlQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNxdWFyZWREaWZmZXJlbmNlLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogc3F1YXJlZERpZmZlcmVuY2UsXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgU3RlcCwgU3RlcEF0dHJzLCBUZW5zb3JJbmZvLCBVbmFyeUlucHV0c30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7Q0hFQ0tfTkFOX1NOSVBQRVQsIFVuYXJ5T3BQcm9ncmFtfSBmcm9tICcuLi91bmFyeW9wX2dwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdGVwKFxuICAgIHtpbnB1dHMsIGF0dHJzLCBiYWNrZW5kfTpcbiAgICAgICAge2lucHV0czogVW5hcnlJbnB1dHMsIGF0dHJzOiBTdGVwQXR0cnMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCBvcFNuaXBwZXQgPSBDSEVDS19OQU5fU05JUFBFVCArIGBcbiAgICByZXR1cm4geCA+IDAuMCA/IDEuMCA6IGZsb2F0KCR7YXR0cnMuYWxwaGF9KTtcbiAgYDtcblxuICBjb25zdCBwcm9ncmFtID0gbmV3IFVuYXJ5T3BQcm9ncmFtKHguc2hhcGUsIG9wU25pcHBldCk7XG5cbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4XSwgeC5kdHlwZSk7XG59XG5cbmV4cG9ydCBjb25zdCBzdGVwQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFN0ZXAsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBzdGVwIGFzIHt9IGFzIEtlcm5lbEZ1bmMsXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2J1ZmZlciwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBSYW5rLCBzbGljZV91dGlsLCBTdHJpZGVkU2xpY2UsIFN0cmlkZWRTbGljZUF0dHJzLCBTdHJpZGVkU2xpY2VJbnB1dHMsIFRlbnNvckJ1ZmZlciwgVGVuc29ySW5mbywgVHlwZWRBcnJheX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7c3RyaWRlZFNsaWNlSW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5pbXBvcnQge1N0cmlkZWRTbGljZVByb2dyYW19IGZyb20gJy4uL3N0cmlkZWRfc2xpY2VfZ3B1JztcblxuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHtzbGljZX0gZnJvbSAnLi9TbGljZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpZGVkU2xpY2UoYXJnczoge1xuICBpbnB1dHM6IFN0cmlkZWRTbGljZUlucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IFN0cmlkZWRTbGljZUF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge1xuICAgIGJlZ2luLFxuICAgIGVuZCxcbiAgICBzdHJpZGVzLFxuICAgIGJlZ2luTWFzayxcbiAgICBlbmRNYXNrLFxuICAgIGVsbGlwc2lzTWFzayxcbiAgICBuZXdBeGlzTWFzayxcbiAgICBzaHJpbmtBeGlzTWFza1xuICB9ID0gYXR0cnM7XG5cbiAgY29uc3Qge25vblN0cmlkZWQsICRiZWdpbiwgJHN0cmlkZXMsIHNpemUsIG5ld1NoYXBlLCBvdXRTaGFwZX0gPVxuICAgICAgc2xpY2VfdXRpbC5zbGljZUluZm8oXG4gICAgICAgICAgeC5zaGFwZSwgYmVnaW4sIGVuZCwgc3RyaWRlcywgYmVnaW5NYXNrLCBlbmRNYXNrLCBlbGxpcHNpc01hc2ssXG4gICAgICAgICAgbmV3QXhpc01hc2ssIHNocmlua0F4aXNNYXNrKTtcblxuICBjb25zdCAkeCA9IHJlc2hhcGUoe2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBuZXdTaGFwZX19KTtcblxuICBsZXQgcmVzdWx0O1xuICBpZiAobm9uU3RyaWRlZCkge1xuICAgIGNvbnN0IHNsaWNlZCA9XG4gICAgICAgIHNsaWNlKHtpbnB1dHM6IHt4OiAkeH0sIGJhY2tlbmQsIGF0dHJzOiB7YmVnaW46ICRiZWdpbiwgc2l6ZX19KTtcbiAgICByZXN1bHQgPSByZXNoYXBlKHtpbnB1dHM6IHt4OiBzbGljZWR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBvdXRTaGFwZX19KTtcblxuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oc2xpY2VkKTtcbiAgfSBlbHNlIGlmIChvdXRTaGFwZS5zb21lKGF4aXMgPT4gYXhpcyA9PT0gMCkpIHtcbiAgICByZXN1bHQgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dFNoYXBlLCB4LmR0eXBlLCBbXSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3Qgc2hvdWxkRXhlY3V0ZU9uQ1BVID0gYmFja2VuZC5zaG91bGRFeGVjdXRlT25DUFUoWyR4XSk7XG4gICAgaWYgKHNob3VsZEV4ZWN1dGVPbkNQVSkge1xuICAgICAgY29uc3QgeFRleERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KCR4LmRhdGFJZCk7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB4VGV4RGF0YS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgICAgIGNvbnN0IHhCdWYgPSBidWZmZXIoJHguc2hhcGUsICR4LmR0eXBlLCB2YWx1ZXMpIGFzIFRlbnNvckJ1ZmZlcjxSYW5rPjtcbiAgICAgIGNvbnN0IHJlc3VsdFZhbHVlcyA9XG4gICAgICAgICAgc3RyaWRlZFNsaWNlSW1wbENQVShvdXRTaGFwZSwgeEJ1ZiwgJHN0cmlkZXMsICRiZWdpbik7XG4gICAgICByZXN1bHQgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dFNoYXBlLCAkeC5kdHlwZSwgcmVzdWx0VmFsdWVzLnZhbHVlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgU3RyaWRlZFNsaWNlUHJvZ3JhbSgkYmVnaW4sICRzdHJpZGVzLCBvdXRTaGFwZSk7XG4gICAgICByZXN1bHQgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbJHhdLCAkeC5kdHlwZSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVzdWx0UmVzaGFwZWQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogcmVzdWx0fSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogb3V0U2hhcGV9fSk7XG5cbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbygkeCk7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVzdWx0KTtcblxuICByZXR1cm4gcmVzdWx0UmVzaGFwZWQ7XG59XG5cbmV4cG9ydCBjb25zdCBzdHJpZGVkU2xpY2VDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU3RyaWRlZFNsaWNlLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogc3RyaWRlZFNsaWNlIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBTdHJpbmdOR3JhbXMsIFN0cmluZ05HcmFtc0F0dHJzLCBTdHJpbmdOR3JhbXNJbnB1dHMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge3N0cmluZ05HcmFtc0ltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nTkdyYW1zKGFyZ3M6IHtcbiAgaW5wdXRzOiBTdHJpbmdOR3JhbXNJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBTdHJpbmdOR3JhbXNBdHRyc1xufSk6IFtUZW5zb3JJbmZvLCBUZW5zb3JJbmZvXSB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtcbiAgICBzZXBhcmF0b3IsXG4gICAgbkdyYW1XaWR0aHMsXG4gICAgbGVmdFBhZCxcbiAgICByaWdodFBhZCxcbiAgICBwYWRXaWR0aCxcbiAgICBwcmVzZXJ2ZVNob3J0U2VxdWVuY2VzXG4gIH0gPSBhdHRycztcbiAgY29uc3Qge2RhdGEsIGRhdGFTcGxpdHN9ID0gaW5wdXRzO1xuICBjb25zdCAkZGF0YSA9IGJhY2tlbmQucmVhZFN5bmMoZGF0YS5kYXRhSWQpIGFzIFVpbnQ4QXJyYXlbXTtcbiAgY29uc3QgJGRhdGFTcGxpdHMgPSBiYWNrZW5kLnJlYWRTeW5jKGRhdGFTcGxpdHMuZGF0YUlkKSBhcyBJbnQzMkFycmF5O1xuXG4gIGNvbnN0IFtuR3JhbXMsIG5HcmFtc1NwbGl0c10gPSBzdHJpbmdOR3JhbXNJbXBsQ1BVKFxuICAgICAgJGRhdGEsICRkYXRhU3BsaXRzLCBzZXBhcmF0b3IsIG5HcmFtV2lkdGhzLCBsZWZ0UGFkLCByaWdodFBhZCwgcGFkV2lkdGgsXG4gICAgICBwcmVzZXJ2ZVNob3J0U2VxdWVuY2VzKTtcbiAgcmV0dXJuIFtcbiAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtuR3JhbXMubGVuZ3RoXSwgJ3N0cmluZycsIG5HcmFtcyksXG4gICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhkYXRhU3BsaXRzLnNoYXBlLCAnaW50MzInLCBuR3JhbXNTcGxpdHMpLFxuICBdO1xufVxuXG5leHBvcnQgY29uc3Qgc3RyaW5nTkdyYW1zQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFN0cmluZ05HcmFtcyxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHN0cmluZ05HcmFtcyBhcyB7fSBhcyBLZXJuZWxGdW5jLFxufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFN0cmluZ1NwbGl0LCBTdHJpbmdTcGxpdEF0dHJzLCBTdHJpbmdTcGxpdElucHV0cywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7c3RyaW5nU3BsaXRJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ1NwbGl0KGFyZ3M6IHtcbiAgaW5wdXRzOiBTdHJpbmdTcGxpdElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IFN0cmluZ1NwbGl0QXR0cnNcbn0pOiBbVGVuc29ySW5mbywgVGVuc29ySW5mbywgVGVuc29ySW5mb10ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7c2tpcEVtcHR5fSA9IGF0dHJzO1xuICBjb25zdCB7aW5wdXQsIGRlbGltaXRlcn0gPSBpbnB1dHM7XG5cbiAgaWYgKGlucHV0LmR0eXBlICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcignSW5wdXQgbXVzdCBiZSBvZiBkYXRhdHlwZSBzdHJpbmcnKTtcbiAgfVxuICBpZiAoaW5wdXQuc2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnB1dCBtdXN0IGJlIGEgdmVjdG9yLCBnb3Qgc2hhcGU6ICR7aW5wdXQuc2hhcGV9YCk7XG4gIH1cbiAgaWYgKGRlbGltaXRlci5zaGFwZS5sZW5ndGggIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBEZWxpbWl0ZXIgbXVzdCBiZSBhIHNjYWxhciwgZ290IHNoYXBlOiAke2RlbGltaXRlci5zaGFwZX1gKTtcbiAgfVxuXG4gIGNvbnN0ICRpbnB1dCA9IGJhY2tlbmQucmVhZFN5bmMoaW5wdXQuZGF0YUlkKSBhcyBVaW50OEFycmF5W107XG4gIGNvbnN0ICRkZWxpbWl0ZXIgPSBiYWNrZW5kLnJlYWRTeW5jKGRlbGltaXRlci5kYXRhSWQpWzBdIGFzIFVpbnQ4QXJyYXk7XG5cbiAgY29uc3QgW2luZGljZXMsIHZhbHVlcywgc2hhcGVdID1cbiAgICAgIHN0cmluZ1NwbGl0SW1wbENQVSgkaW5wdXQsICRkZWxpbWl0ZXIsIHNraXBFbXB0eSk7XG4gIGNvbnN0IG91dHB1dFNpemUgPSB2YWx1ZXMubGVuZ3RoO1xuICByZXR1cm4gW1xuICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW291dHB1dFNpemUsIDJdLCAnaW50MzInLCBpbmRpY2VzKSxcbiAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtvdXRwdXRTaXplXSwgJ3N0cmluZycsIHZhbHVlcyksXG4gICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbMl0sICdpbnQzMicsIG5ldyBJbnQzMkFycmF5KHNoYXBlKSlcbiAgXTtcbn1cblxuZXhwb3J0IGNvbnN0IHN0cmluZ1NwbGl0Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFN0cmluZ1NwbGl0LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogc3RyaW5nU3BsaXQgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBTdHJpbmdUb0hhc2hCdWNrZXRGYXN0LCBTdHJpbmdUb0hhc2hCdWNrZXRGYXN0QXR0cnMsIFN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RJbnB1dHMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge3N0cmluZ1RvSGFzaEJ1Y2tldEZhc3RJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3QoYXJnczoge1xuICBpbnB1dHM6IFN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBTdHJpbmdUb0hhc2hCdWNrZXRGYXN0QXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge251bUJ1Y2tldHN9ID0gYXR0cnM7XG4gIGNvbnN0IHtpbnB1dH0gPSBpbnB1dHM7XG5cbiAgaWYgKGlucHV0LmR0eXBlICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcignSW5wdXQgbXVzdCBiZSBvZiBkYXRhdHlwZSBzdHJpbmcnKTtcbiAgfVxuICBpZiAobnVtQnVja2V0cyA8PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBOdW1iZXIgb2YgYnVja2V0cyBtdXN0IGJlIGF0IGxlYXN0IDFgKTtcbiAgfVxuXG4gIGNvbnN0ICRpbnB1dCA9IGJhY2tlbmQucmVhZFN5bmMoaW5wdXQuZGF0YUlkKSBhcyBVaW50OEFycmF5W107XG5cbiAgY29uc3Qgb3V0cHV0ID0gc3RyaW5nVG9IYXNoQnVja2V0RmFzdEltcGxDUFUoJGlucHV0LCBudW1CdWNrZXRzKTtcbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oaW5wdXQuc2hhcGUsICdpbnQzMicsIG91dHB1dCk7XG59XG5cbmV4cG9ydCBjb25zdCBzdHJpbmdUb0hhc2hCdWNrZXRGYXN0Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFN0cmluZ1RvSGFzaEJ1Y2tldEZhc3QsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBzdHJpbmdUb0hhc2hCdWNrZXRGYXN0IGFzIHt9IGFzIEtlcm5lbEZ1bmMsXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgU3VifSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge2JpbmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHtzdWJJbXBsQ1BVIGFzIGNwdVN1Yn0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5cbmNvbnN0IFNVQiA9ICdyZXR1cm4gYSAtIGI7JztcblxuZXhwb3J0IGNvbnN0IHN1YiA9IGJpbmFyeUtlcm5lbEZ1bmMoe1xuICBvcFNuaXBwZXQ6IFNVQixcbiAgcGFja2VkT3BTbmlwcGV0OiBTVUIsXG4gIHN1cHBvcnRzQ29tcGxleDogdHJ1ZSxcbiAgY3B1S2VybmVsSW1wbDogY3B1U3ViXG59KTtcblxuZXhwb3J0IGNvbnN0IHN1YkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTdWIsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBzdWJcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBTdW0sIFN1bUF0dHJzLCBTdW1JbnB1dHN9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5cbmltcG9ydCB7c3VtSW1wbH0gZnJvbSAnLi9TdW1faW1wbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdW0oXG4gICAgYXJnczoge2lucHV0czogU3VtSW5wdXRzLCBhdHRyczogU3VtQXR0cnMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KSB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG5cbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7YXhpcywga2VlcERpbXN9ID0gYXR0cnM7XG5cbiAgcmV0dXJuIHN1bUltcGwoeCwgYXhpcywga2VlcERpbXMsIGJhY2tlbmQpO1xufVxuXG5leHBvcnQgY29uc3Qgc3VtQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFN1bSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHN1bSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgc3VtT3V0VHlwZSwgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7cmVkdWNlfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvcmVkdWNlJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcblxuaW1wb3J0IHt0cmFuc3Bvc2VJbXBsfSBmcm9tICcuL1RyYW5zcG9zZV9pbXBsJztcblxuZXhwb3J0IGZ1bmN0aW9uIHN1bUltcGwoXG4gICAgeDogVGVuc29ySW5mbywgYXhpczogbnVtYmVyfG51bWJlcltdLCBrZWVwRGltczogYm9vbGVhbixcbiAgICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMKTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHJlZHVjdGlvbkluZGljZXMgPSBheGlzO1xuXG4gIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG5cbiAgY29uc3Qgb3JpZ0F4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKHJlZHVjdGlvbkluZGljZXMsIHguc2hhcGUpO1xuICBsZXQgYXhlcyA9IG9yaWdBeGVzO1xuICBjb25zdCBwZXJtdXRlZEF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKGF4ZXMsIHhSYW5rKTtcbiAgY29uc3Qgc3VtSW5wdXRJc1RyYW5zcG9zZWQgPSBwZXJtdXRlZEF4ZXMgIT0gbnVsbDtcblxuICBsZXQgc3VtSW5wdXQgPSB4O1xuICBpZiAoc3VtSW5wdXRJc1RyYW5zcG9zZWQpIHtcbiAgICBzdW1JbnB1dCA9IHRyYW5zcG9zZUltcGwoeCwgcGVybXV0ZWRBeGVzLCBiYWNrZW5kKTtcblxuICAgIGF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0SW5uZXJNb3N0QXhlcyhheGVzLmxlbmd0aCwgeFJhbmspO1xuICB9XG5cbiAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdzdW0nLCBheGVzLCB4UmFuayk7XG4gIGNvbnN0IFtzdW1PdXRTaGFwZSwgcmVkdWNlU2hhcGVdID1cbiAgICAgIGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKHN1bUlucHV0LnNoYXBlLCBheGVzKTtcblxuICBsZXQgb3V0U2hhcGUgPSBzdW1PdXRTaGFwZTtcbiAgaWYgKGtlZXBEaW1zKSB7XG4gICAgLy8gcmF0aGVyIHRoYW4gcmVzaGFwZSBhdCB0aGUgZW5kLCBzZXQgdGhlIHRhcmdldCBzaGFwZSBoZXJlLlxuICAgIG91dFNoYXBlID0gYmFja2VuZF91dGlsLmV4cGFuZFNoYXBlVG9LZWVwRGltKHN1bU91dFNoYXBlLCBvcmlnQXhlcyk7XG4gIH1cblxuICBjb25zdCBpblNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuICBjb25zdCB4U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSh4LnNoYXBlKTtcbiAgY29uc3QgYmF0Y2hTaXplID0geFNpemUgLyBpblNpemU7XG4gIGNvbnN0IHJlc2hhcGVkSW5wdXQgPSByZXNoYXBlKFxuICAgICAge2lucHV0czoge3g6IHN1bUlucHV0fSwgYXR0cnM6IHtzaGFwZTogW2JhdGNoU2l6ZSwgaW5TaXplXX0sIGJhY2tlbmR9KTtcblxuICBjb25zdCBvdXRUeXBlID0gc3VtT3V0VHlwZSh4LmR0eXBlKTtcblxuICBjb25zdCByZWR1Y2VkID0gcmVkdWNlKHJlc2hhcGVkSW5wdXQsIG91dFR5cGUsICdzdW0nLCBiYWNrZW5kKTtcbiAgY29uc3Qgb3V0ID1cbiAgICAgIHJlc2hhcGUoe2lucHV0czoge3g6IHJlZHVjZWR9LCBhdHRyczoge3NoYXBlOiBvdXRTaGFwZX0sIGJhY2tlbmR9KTtcblxuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc2hhcGVkSW5wdXQpO1xuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlZHVjZWQpO1xuICBpZiAoc3VtSW5wdXRJc1RyYW5zcG9zZWQpIHtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHN1bUlucHV0KTtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBUYW59IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgVEFOID0gYHJldHVybiB0YW4oeCk7YDtcblxuZXhwb3J0IGNvbnN0IHRhbiA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBUQU59KTtcblxuZXhwb3J0IGNvbnN0IHRhbkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBUYW4sXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiB0YW4sXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgVGFuaH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgVEFOSCA9IGBcbiAgZmxvYXQgZTJ4ID0gZXhwKC0yLjAgKiBhYnMoeCkpO1xuICByZXR1cm4gc2lnbih4KSAqICgxLjAgLSBlMngpIC8gKDEuMCArIGUyeCk7XG5gO1xuXG5leHBvcnQgY29uc3QgdGFuaCA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBUQU5IfSk7XG5cbmV4cG9ydCBjb25zdCB0YW5oQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFRhbmgsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiB0YW5oLFxufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtidWZmZXIsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgVGlsZSwgVGlsZUF0dHJzLCBUaWxlSW5wdXRzLCBUeXBlZEFycmF5LCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHt0aWxlSW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5pbXBvcnQge1RpbGVQcm9ncmFtfSBmcm9tICcuLi90aWxlX2dwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiB0aWxlKFxuICAgIHBhcmFtczoge2lucHV0czogVGlsZUlucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCwgYXR0cnM6IFRpbGVBdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBwYXJhbXM7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge3JlcHN9ID0gYXR0cnM7XG5cbiAgLy8gdGlsZSBncHUgcHJvZ3JhbSBjYW5ub3QgaGFuZGxlIHJhbmsgPiA1IGNhc2UuXG4gIGlmICh4LmR0eXBlID09PSAnc3RyaW5nJyB8fCB4LnNoYXBlLmxlbmd0aCA+IDUpIHtcbiAgICAvLyBFdmVuIHRob3VnaHQgc3RyaW5nIHRlbnNvciBpcyBhbHdheXMgb24gQ1BVLCBqdXN0IHRvIGJlIGNvbnNpc3RlbnQgb24gaG93XG4gICAgLy8gdG8gYWNjZXNzIHRlbnNvciBkYXRhLlxuICAgIGNvbnN0IGRhdGEgPSBiYWNrZW5kLnJlYWRTeW5jKHguZGF0YUlkKTtcbiAgICBjb25zdCB2YWx1ZSA9IHguZHR5cGUgPT09ICdzdHJpbmcnID9cbiAgICAgICAgKGRhdGEgYXMgVWludDhBcnJheVtdKS5tYXAoZCA9PiB1dGlsLmRlY29kZVN0cmluZyhkKSkgOlxuICAgICAgICBkYXRhIGFzIFR5cGVkQXJyYXk7XG4gICAgY29uc3QgYnVmID0gYnVmZmVyKHguc2hhcGUsIHguZHR5cGUsIHZhbHVlKTtcbiAgICBjb25zdCBvdXRCdWYgPSB0aWxlSW1wbENQVShidWYsIHJlcHMpO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dEJ1Zi5zaGFwZSwgb3V0QnVmLmR0eXBlLCBvdXRCdWYudmFsdWVzKTtcbiAgfVxuXG4gIGNvbnN0IHByb2dyYW0gPSBuZXcgVGlsZVByb2dyYW0oeC5zaGFwZSwgcmVwcyk7XG4gIGNvbnN0IG91dHB1dCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4XSwgeC5kdHlwZSk7XG5cbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuZXhwb3J0IGNvbnN0IHRpbGVDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogVGlsZSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHRpbGUgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7ZW52LCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIE51bWVyaWNEYXRhVHlwZSwgVGVuc29ySW5mbywgVG9wSywgVG9wS0F0dHJzLCBUb3BLSW5wdXRzLCBUeXBlZEFycmF5LCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHt0b3BLSW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5pbXBvcnQge01lcmdlUHJvZ3JhbSwgU3dhcFByb2dyYW19IGZyb20gJy4uL3RvcF9rX2dwdSc7XG5pbXBvcnQge2ZpbGx9IGZyb20gJy4vRmlsbCc7XG5pbXBvcnQge2dhdGhlclYyfSBmcm9tICcuL0dhdGhlclYyJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7c2xpY2V9IGZyb20gJy4vU2xpY2UnO1xuXG5mdW5jdGlvbiBkaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mb09yTnVsbChcbiAgICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLCB0ZW5zb3JJbmZvOiBUZW5zb3JJbmZvKSB7XG4gIGlmICh0ZW5zb3JJbmZvICE9PSBudWxsKSB7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0ZW5zb3JJbmZvKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByb3VuZFVwVG9Qb3cyKG51bTogbnVtYmVyKSB7XG4gIGxldCBwb3cyID0gMTtcbiAgd2hpbGUgKHBvdzIgPCBudW0pIHtcbiAgICBwb3cyICo9IDI7XG4gIH1cbiAgcmV0dXJuIHBvdzI7XG59XG5cbi8vIEJhc2VkIG9uIEFsZ29yaXRobSAyIG9mIEJpdG9uaWMgVG9wIEssIHJlZjpcbi8vIGh0dHBzOi8vYW5pbHNoYW5iaGFnLmluL3N0YXRpYy9wYXBlcnMvZ3B1dG9wa19zaWdtb2QxOC5wZGZcbmV4cG9ydCBmdW5jdGlvbiB0b3BLKFxuICAgIGFyZ3M6IHtpbnB1dHM6IFRvcEtJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsIGF0dHJzOiBUb3BLQXR0cnN9KTpcbiAgICBUZW5zb3JJbmZvW10ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtrLCBzb3J0ZWR9ID0gYXR0cnM7XG5cbiAgLy8gRW1waXJpY2FsbHkgZGV0ZXJtaW5lZCBjb25zdGFudCB1c2VkIHRvIGRldGVybWluZSBsYXN0IGRpbSB0aHJlc2hvbGQgZm9yXG4gIC8vIGhhbmRpbmcgb2ZmIGV4ZWN1dGlvbiB0byB0aGUgQ1BVLlxuICBjb25zdCBUT1BLX0xBU1RfRElNX0NQVV9IQU5ET0ZGX1NJWkVfVEhSRVNIT0xEID1cbiAgICAgIGVudigpLmdldE51bWJlcignVE9QS19MQVNUX0RJTV9DUFVfSEFORE9GRl9TSVpFX1RIUkVTSE9MRCcpO1xuXG4gIC8vIEVtcGlyaWNhbGx5IGRldGVybWluZWQgY29uc3RhbnQgdXNlZCB0byBkZXRlcm1pbmUgayB0aHJlc2hvbGQgZm9yIGhhbmRpbmdcbiAgLy8gb2ZmIGV4ZWN1dGlvbiB0byB0aGUgQ1BVLlxuICBjb25zdCBUT1BLX0tfQ1BVX0hBTkRPRkZfVEhSRVNIT0xEID1cbiAgICAgIGVudigpLmdldE51bWJlcignVE9QS19LX0NQVV9IQU5ET0ZGX1RIUkVTSE9MRCcpO1xuXG4gIGNvbnN0IHhTaGFwZSA9IHguc2hhcGU7XG4gIGNvbnN0IGxhc3REaW0gPSB4U2hhcGVbeFNoYXBlLmxlbmd0aCAtIDFdO1xuXG4gIGlmIChiYWNrZW5kLnNob3VsZEV4ZWN1dGVPbkNQVShbeF0pIHx8XG4gICAgICBsYXN0RGltIDwgVE9QS19MQVNUX0RJTV9DUFVfSEFORE9GRl9TSVpFX1RIUkVTSE9MRCB8fFxuICAgICAgayA+IFRPUEtfS19DUFVfSEFORE9GRl9USFJFU0hPTEQpIHtcbiAgICBjb25zdCB4VmFscyA9IGJhY2tlbmQucmVhZFN5bmMoeC5kYXRhSWQpIGFzIFR5cGVkQXJyYXk7XG4gICAgY29uc3QgW2FsbFRvcEtWYWxzLCBhbGxUb3BLSW5kaWNlc10gPVxuICAgICAgICB0b3BLSW1wbENQVSh4VmFscywgeFNoYXBlLCB4LmR0eXBlIGFzIE51bWVyaWNEYXRhVHlwZSwgaywgc29ydGVkKTtcblxuICAgIHJldHVybiBbXG4gICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFxuICAgICAgICAgIGFsbFRvcEtWYWxzLnNoYXBlLCBhbGxUb3BLVmFscy5kdHlwZSwgYWxsVG9wS1ZhbHMudmFsdWVzKSxcbiAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oXG4gICAgICAgICAgYWxsVG9wS0luZGljZXMuc2hhcGUsIGFsbFRvcEtJbmRpY2VzLmR0eXBlLCBhbGxUb3BLSW5kaWNlcy52YWx1ZXMpXG4gICAgXTtcbiAgfVxuXG4gIGlmIChrID09PSAwKSB7XG4gICAgeFNoYXBlW3hTaGFwZS5sZW5ndGggLSAxXSA9IDA7XG4gICAgcmV0dXJuIFtcbiAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oeFNoYXBlLCB4LmR0eXBlLCBbXSksXG4gICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHhTaGFwZSwgJ2ludDMyJywgW10pXG4gICAgXTtcbiAgfVxuXG4gIGlmIChsYXN0RGltID09PSAxIC8qIGZpcnN0UGFzcyAqLykge1xuICAgIHJldHVybiBbXG4gICAgICB4LCBmaWxsKHthdHRyczoge3NoYXBlOiB4U2hhcGUsIGR0eXBlOiAnaW50MzInLCB2YWx1ZTogMH0sIGJhY2tlbmR9KVxuICAgIF07XG4gIH1cblxuICAvLyBFYWdlcmx5IHVucGFjayB4IGlucHV0IHNpbmNlIGl0IGlzIHBhc3NlZCBpbiB0byBhbGwgdGhlIHNoYWRlcnMgd2hpY2hcbiAgLy8gcmVxdWlyZSB1bnBhY2tlZCBpbnB1dHMuXG4gIGNvbnN0IHh0ZXhEYXRhID0gYmFja2VuZC50ZXhEYXRhLmdldCh4LmRhdGFJZCk7XG4gIGNvbnN0IHhJc1BhY2tlZCA9IHh0ZXhEYXRhICE9PSBudWxsICYmIHh0ZXhEYXRhLmlzUGFja2VkO1xuICBjb25zdCB4VW5QYWNrZWQgPSB4SXNQYWNrZWQgPyBiYWNrZW5kLnVucGFja1RlbnNvcih4KSA6IHg7XG5cbiAgLy8gUmVzaGFwZSBpbnRvIGEgMmQgdGVuc29yIFtiYXRjaCwgbGFzdERpbV0gYW5kIGNvbXB1dGUgdG9wayBhbG9uZyBsYXN0RGltLlxuICBjb25zdCB4U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSh4U2hhcGUpO1xuICBjb25zdCBiYXRjaCA9IHhTaXplIC8gbGFzdERpbTtcbiAgY29uc3QgeDJEID0gcmVzaGFwZShcbiAgICAgIHtpbnB1dHM6IHt4OiB4VW5QYWNrZWR9LCBhdHRyczoge3NoYXBlOiBbYmF0Y2gsIGxhc3REaW1dfSwgYmFja2VuZH0pO1xuXG4gIGlmICh4SXNQYWNrZWQpIHtcbiAgICBkaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mb09yTnVsbChiYWNrZW5kLCB4VW5QYWNrZWQpO1xuICB9XG5cbiAgY29uc3Qga1BvdzIgPSByb3VuZFVwVG9Qb3cyKGspO1xuICBjb25zdCBsYXN0RGltUG93MiA9IHJvdW5kVXBUb1BvdzIobGFzdERpbSk7XG5cbiAgLy8gT25seSB0aGUgaW5kaWNlcyBjb250YWluaW5nIHRoZSB0b3AgSyBhcmUga2VwdCBhdCBldmVyeSBzdGVwIHRvIHJlZHVjZVxuICAvLyBudW1iZXIgb2Ygb3V0cHV0cyBpbiB0aGUgR1BVIGFsZ29yaXRobXMsIHNvIG9uY2UgdGhlIGZpbmFsIHNldCBvZiBpbmRpY2VzXG4gIC8vIGlzIGNvbXB1dGVkIHRoZW4gZ2F0aGVyIGlzIHVzZWQgdG8gZ3JhYiB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXNcbiAgLy8gZnJvbSB0aGUgb3JpZ2luYWwgaW5wdXQuXG4gIGxldCBpbmRpY2VzOiBUZW5zb3JJbmZvID0gbnVsbDtcblxuICAvLyBHUFUgYWxnb3JpdGhtIGFsd2F5cyB0YWtlcyBpbiBhbiBpbmRpY2VzIGlucHV0IGJ1dCB0aGlzIGlucHV0IGlzIG5vdCB1c2VkXG4gIC8vIG9uIHRoZSBmaXJzdCBydW4gb2YgYSBHUFUgYWxnb3JpdGhtLCB0aGVyZWZvcmUgaWYgaW5kaWNlcyBpcyBudWxsIHdlIHNpbXBseVxuICAvLyBwYXNzIGluIHgyRCBpbnN0ZWFkIG9mIGl0IGJ1dCB0aGUgdmFsdWUgd2lsbCBub3QgYWN0dWFsbHkgYmUgdXNlZFxuICBjb25zdCBnZXRJbnB1dHMgPSAoKSA9PiBpbmRpY2VzID09PSBudWxsID8gW3gyRCwgeDJEXSA6IFt4MkQsIGluZGljZXNdO1xuXG4gIGNvbnN0IHJ1blN3YXAgPSAoZGlyOiBudW1iZXIsIGluYzogbnVtYmVyLCBzaGFwZTogbnVtYmVyW10pID0+IHtcbiAgICBjb25zdCBpbnB1dHMgPSBnZXRJbnB1dHMoKTtcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IFN3YXBQcm9ncmFtKHNoYXBlKTtcbiAgICBjb25zdCBmaXN0UGFzcyA9IGluZGljZXMgPT09IG51bGwgPyAxIDogMDtcbiAgICBjb25zdCBjdXN0b21WYWx1ZXMgPVxuICAgICAgICBbW2xhc3REaW1dLCBbZmlzdFBhc3NdLCBbTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZXSwgW2Rpcl0sIFtpbmNdXTtcbiAgICBjb25zdCBwcmV2SW5kaWNlcyA9IGluZGljZXM7XG4gICAgaW5kaWNlcyA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIGlucHV0cywgJ2ludDMyJywgY3VzdG9tVmFsdWVzKTtcbiAgICBkaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mb09yTnVsbChiYWNrZW5kLCBwcmV2SW5kaWNlcyk7XG4gIH07XG5cbiAgLy8gU3RlcCAxOiBsb2NhbCBzb3J0XG4gIGZvciAobGV0IGxlbiA9IDE7IGxlbiA8IGtQb3cyOyBsZW4gKj0gMikge1xuICAgIGNvbnN0IGRpciA9IGxlbiAqIDI7XG4gICAgZm9yIChsZXQgaW5jID0gbGVuOyBpbmMgPj0gMTsgaW5jIC89IDIpIHtcbiAgICAgIHJ1blN3YXAoZGlyLCBpbmMsIFtiYXRjaCwgbGFzdERpbVBvdzJdKTtcbiAgICB9XG4gIH1cblxuICAvLyBTdGVwIDI6IG1lcmdlXG4gIGZvciAobGV0IGluZGljZXNTaXplID0gbGFzdERpbVBvdzI7IGluZGljZXNTaXplID4ga1BvdzI7IGluZGljZXNTaXplIC89IDIpIHtcbiAgICBjb25zdCBpbnB1dHMgPSBnZXRJbnB1dHMoKTtcbiAgICBjb25zdCBtZXJnZVByb2dyYW0gPSBuZXcgTWVyZ2VQcm9ncmFtKFtiYXRjaCwgaW5kaWNlc1NpemUgLyAyXSk7XG4gICAgY29uc3QgZmlyc3RQYXNzID0gaW5kaWNlcyA9PT0gbnVsbCA/IDEgOiAwO1xuICAgIGNvbnN0IGN1c3RvbVZhbHVlcyA9IFtbbGFzdERpbV0sIFtmaXJzdFBhc3NdLCBba1BvdzJdXTtcbiAgICBjb25zdCBwcmV2SW5kaWNlcyA9IGluZGljZXM7XG4gICAgaW5kaWNlcyA9XG4gICAgICAgIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKG1lcmdlUHJvZ3JhbSwgaW5wdXRzLCAnaW50MzInLCBjdXN0b21WYWx1ZXMpO1xuICAgIGRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvT3JOdWxsKGJhY2tlbmQsIHByZXZJbmRpY2VzKTtcblxuICAgIC8vIFN0ZXAgMzogcmVidWlsZFxuICAgIGNvbnN0IGxlbiA9IGtQb3cyIC8gMjtcbiAgICBjb25zdCBkaXIgPSBsZW4gKiAyO1xuICAgIGZvciAobGV0IGluYyA9IGxlbjsgaW5jID49IDE7IGluYyAvPSAyKSB7XG4gICAgICBydW5Td2FwKGRpciwgaW5jLCBpbmRpY2VzLnNoYXBlKTtcbiAgICB9XG4gIH1cblxuICAvLyBLZWVwIG9ubHkgdGhlIHJlcXVlc3RlZCB0b3AgSyByZXN1bHRzIGluc3RlYWQgb2Yga1BvdzJcbiAgbGV0IHByZXZJbmRpY2VzID0gaW5kaWNlcztcbiAgaW5kaWNlcyA9IHNsaWNlKFxuICAgICAge2lucHV0czoge3g6IGluZGljZXN9LCBiYWNrZW5kLCBhdHRyczoge2JlZ2luOiAwLCBzaXplOiBbYmF0Y2gsIGtdfX0pO1xuICBkaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mb09yTnVsbChiYWNrZW5kLCBwcmV2SW5kaWNlcyk7XG5cbiAgLy8gR2F0aGVyIHZhbHVlcyBvbiBsYXN0IGRpbWVuc2lvblxuICBsZXQgdmFsdWVzID0gZ2F0aGVyVjIoXG4gICAgICB7aW5wdXRzOiB7eDogeDJELCBpbmRpY2VzfSwgYmFja2VuZCwgYXR0cnM6IHtheGlzOiAxLCBiYXRjaERpbXM6IDF9fSk7XG4gIGRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvT3JOdWxsKGJhY2tlbmQsIHgyRCk7XG5cbiAgLy8gUmVzaGFwZSBiYWNrIHRvIHRoZSBvcmlnaW5hbCBpbnB1dCBzaGFwZSwgZXhjZXB0IHRoYXQgdGhlIGxhc3RcbiAgLy8gZGltZW5zaW9uIGlzIGsuXG4gIGNvbnN0IG5ld1NoYXBlID0geFNoYXBlLnNsaWNlKDAsIC0xKTtcbiAgbmV3U2hhcGUucHVzaChrKTtcblxuICBwcmV2SW5kaWNlcyA9IGluZGljZXM7XG4gIGluZGljZXMgPSByZXNoYXBlKHtpbnB1dHM6IHt4OiBpbmRpY2VzfSwgYXR0cnM6IHtzaGFwZTogbmV3U2hhcGV9LCBiYWNrZW5kfSk7XG4gIGRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvT3JOdWxsKGJhY2tlbmQsIHByZXZJbmRpY2VzKTtcblxuICBjb25zdCBwcmV2VmFsdWVzID0gdmFsdWVzO1xuICB2YWx1ZXMgPSByZXNoYXBlKHtpbnB1dHM6IHt4OiB2YWx1ZXN9LCBhdHRyczoge3NoYXBlOiBuZXdTaGFwZX0sIGJhY2tlbmR9KTtcbiAgZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm9Pck51bGwoYmFja2VuZCwgcHJldlZhbHVlcyk7XG5cbiAgcmV0dXJuIFt2YWx1ZXMsIGluZGljZXNdO1xufVxuXG5leHBvcnQgY29uc3QgdG9wS0NvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBUb3BLLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogdG9wSyBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgVHJhbnNmb3JtLCBUcmFuc2Zvcm1BdHRycywgVHJhbnNmb3JtSW5wdXRzfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtUcmFuc2Zvcm1Qcm9ncmFtfSBmcm9tICcuLi90cmFuc2Zvcm1fZ3B1JztcblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybShhcmdzOiB7XG4gIGlucHV0czogVHJhbnNmb3JtSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogVHJhbnNmb3JtQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2ltYWdlLCB0cmFuc2Zvcm1zfSA9IGlucHV0cztcbiAgY29uc3Qge2ludGVycG9sYXRpb24sIGZpbGxNb2RlLCBmaWxsVmFsdWUsIG91dHB1dFNoYXBlfSA9IGF0dHJzO1xuXG4gIGNvbnN0IFtiYXRjaCwgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIG51bUNoYW5uZWxzXSA9IGltYWdlLnNoYXBlO1xuICBjb25zdCBbb3V0SGVpZ2h0LCBvdXRXaWR0aF0gPVxuICAgICAgb3V0cHV0U2hhcGUgIT0gbnVsbCA/IG91dHB1dFNoYXBlIDogW2ltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoXTtcbiAgY29uc3Qgb3V0U2hhcGUgPVxuICAgICAgW2JhdGNoLCBvdXRIZWlnaHQsIG91dFdpZHRoLFxuICAgICAgIG51bUNoYW5uZWxzXSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcblxuICBjb25zdCBwcm9ncmFtID0gbmV3IFRyYW5zZm9ybVByb2dyYW0oXG4gICAgICBpbWFnZUhlaWdodCwgaW1hZ2VXaWR0aCwgaW50ZXJwb2xhdGlvbiwgZmlsbE1vZGUsIGZpbGxWYWx1ZSwgb3V0U2hhcGUpO1xuICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW2ltYWdlLCB0cmFuc2Zvcm1zXSwgJ2Zsb2F0MzInKTtcbn1cblxuZXhwb3J0IGNvbnN0IHRyYW5zZm9ybUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBUcmFuc2Zvcm0sXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiB0cmFuc2Zvcm0gYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIFRyYW5zcG9zZSwgVHJhbnNwb3NlQXR0cnMsIFRyYW5zcG9zZUlucHV0cywgVHlwZWRBcnJheX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcblxuaW1wb3J0IHt0cmFuc3Bvc2VJbXBsfSBmcm9tICcuL1RyYW5zcG9zZV9pbXBsJztcbmltcG9ydCB7dHJhbnNwb3NlSW1wbENQVSBhcyBjcHVUcmFuc3Bvc2V9IGZyb20gJy4vVHJhbnNwb3NlX2ltcGwnO1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNwb3NlKGFyZ3M6IHtcbiAgaW5wdXRzOiBUcmFuc3Bvc2VJbnB1dHMsXG4gIGF0dHJzOiBUcmFuc3Bvc2VBdHRycyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTFxufSkge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtwZXJtfSA9IGF0dHJzO1xuICBjb25zdCB3ZWJnbEJhY2tlbmQgPSBiYWNrZW5kO1xuXG4gIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG5cbiAgY29uc3QgbmV3U2hhcGU6IG51bWJlcltdID0gbmV3IEFycmF5KHhSYW5rKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdTaGFwZS5sZW5ndGg7IGkrKykge1xuICAgIG5ld1NoYXBlW2ldID0geC5zaGFwZVtwZXJtW2ldXTtcbiAgfVxuXG4gIGxldCBvdXQ6IFRlbnNvckluZm87XG4gIGlmICh3ZWJnbEJhY2tlbmQuc2hvdWxkRXhlY3V0ZU9uQ1BVKFt4XSkpIHtcbiAgICBjb25zdCB4VGV4RGF0YSA9IHdlYmdsQmFja2VuZC50ZXhEYXRhLmdldCh4LmRhdGFJZCk7XG4gICAgY29uc3QgdmFsdWVzID0geFRleERhdGEudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gICAgY29uc3Qgb3V0VmFsdWVzID0gY3B1VHJhbnNwb3NlKHZhbHVlcywgeC5zaGFwZSwgeC5kdHlwZSwgcGVybSwgbmV3U2hhcGUpO1xuXG4gICAgb3V0ID0gd2ViZ2xCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG5ld1NoYXBlLCB4LmR0eXBlKTtcbiAgICBjb25zdCBvdXREYXRhID0gd2ViZ2xCYWNrZW5kLnRleERhdGEuZ2V0KG91dC5kYXRhSWQpO1xuICAgIG91dERhdGEudmFsdWVzID0gb3V0VmFsdWVzO1xuICB9IGVsc2Uge1xuICAgIG91dCA9IHRyYW5zcG9zZUltcGwoeCwgcGVybSwgd2ViZ2xCYWNrZW5kKTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG5leHBvcnQgY29uc3QgdHJhbnNwb3NlQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFRyYW5zcG9zZSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHRyYW5zcG9zZSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2VudiwgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7dHJhbnNwb3NlSW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5pbXBvcnQge1RyYW5zcG9zZVByb2dyYW19IGZyb20gJy4uL3RyYW5zcG9zZV9ncHUnO1xuaW1wb3J0IHtUcmFuc3Bvc2VQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi90cmFuc3Bvc2VfcGFja2VkX2dwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc3Bvc2VJbXBsKFxuICAgIHg6IFRlbnNvckluZm8sIHBlcm06IG51bWJlcltdLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMKTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHByb2dyYW0gPSBlbnYoKS5nZXRCb29sKCdXRUJHTF9QQUNLX0FSUkFZX09QRVJBVElPTlMnKSA/XG4gICAgICBuZXcgVHJhbnNwb3NlUGFja2VkUHJvZ3JhbSh4LnNoYXBlLCBwZXJtKSA6XG4gICAgICBuZXcgVHJhbnNwb3NlUHJvZ3JhbSh4LnNoYXBlLCBwZXJtKTtcbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4XSwgeC5kdHlwZSk7XG59XG5cbmV4cG9ydCB7dHJhbnNwb3NlSW1wbENQVX07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgVW5pcXVlLCBVbmlxdWVBdHRycywgVW5pcXVlSW5wdXRzfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHt1bmlxdWVJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vd2ViZ2xfdXRpbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiB1bmlxdWUoXG4gICAgYXJnczpcbiAgICAgICAge2lucHV0czogVW5pcXVlSW5wdXRzLCBhdHRyczogVW5pcXVlQXR0cnMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTpcbiAgICBUZW5zb3JJbmZvW10ge1xuICBjb25zdCB7aW5wdXRzLCBhdHRycywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7YXhpc30gPSBhdHRycztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBhc3NlcnROb3RDb21wbGV4KHgsICd1bmlxdWUnKTtcblxuICAvLyBGb3Igbm93LCBhbHdheXMgZm9yd2FyZCBjYWxjdWxhdGlvbiB0byB0aGUgQ1BVIGJhY2tlbmQuXG4gIGNvbnNvbGUud2FybihcbiAgICAgICdXQVJOSU5HOiAnLFxuICAgICAgJ1VJIG1pZ2h0IGJlIGxvY2tlZCB0ZW1wb3JhcmlseSBhcyBkYXRhIGlzIGJlaW5nIGRvd25sb2FkZWQnKTtcbiAgY29uc3QgdmFsdWVzID0gYmFja2VuZC5yZWFkU3luYyh4LmRhdGFJZCk7XG4gIGNvbnN0IHtvdXRwdXRWYWx1ZXMsIG91dHB1dFNoYXBlLCBpbmRpY2VzfSA9XG4gICAgICB1bmlxdWVJbXBsQ1BVKHZhbHVlcywgYXhpcywgeC5zaGFwZSwgeC5kdHlwZSk7XG4gIHJldHVybiBbXG4gICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRwdXRTaGFwZSwgeC5kdHlwZSwgb3V0cHV0VmFsdWVzKSxcbiAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtpbmRpY2VzLmxlbmd0aF0sICdpbnQzMicsIGluZGljZXMpLFxuICBdO1xufVxuXG5leHBvcnQgY29uc3QgdW5pcXVlQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFVuaXF1ZSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHVuaXF1ZSBhcyB7fSBhcyBLZXJuZWxGdW5jLFxufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIFVucGFjaywgVW5wYWNrQXR0cnMsIFVucGFja0lucHV0c30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcblxuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHtzbGljZX0gZnJvbSAnLi9TbGljZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiB1bnBhY2soXG4gICAgYXJnczpcbiAgICAgICAge2lucHV0czogVW5wYWNrSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLCBhdHRyczogVW5wYWNrQXR0cnN9KTpcbiAgICBUZW5zb3JJbmZvW10ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7dmFsdWV9ID0gaW5wdXRzO1xuICBsZXQge2F4aXN9ID0gYXR0cnM7XG5cbiAgaWYgKGF4aXMgPCAwKSB7XG4gICAgYXhpcyArPSB2YWx1ZS5zaGFwZS5sZW5ndGg7XG4gIH1cblxuICBjb25zdCB4ID0gdmFsdWU7XG4gIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG5cbiAgY29uc3QgbnVtID0gdmFsdWUuc2hhcGVbYXhpc107XG4gIGNvbnN0IG91dFNoYXBlOiBudW1iZXJbXSA9IG5ldyBBcnJheSh4UmFuayAtIDEpO1xuICBsZXQgb3V0SW5kZXggPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHhSYW5rOyBpKyspIHtcbiAgICBpZiAoaSAhPT0gYXhpcykge1xuICAgICAgb3V0U2hhcGVbb3V0SW5kZXgrK10gPSB4LnNoYXBlW2ldO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHRvRGlzcG9zZSA9IFtdO1xuXG4gIGNvbnN0IGJlZ2luID0gbmV3IEFycmF5KHhSYW5rKS5maWxsKDApO1xuICBjb25zdCBzaXplID0geC5zaGFwZS5zbGljZSgpO1xuICBzaXplW2F4aXNdID0gMTtcbiAgY29uc3QgcmVzOiBUZW5zb3JJbmZvW10gPSBuZXcgQXJyYXkobnVtKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXMubGVuZ3RoOyBpKyspIHtcbiAgICBiZWdpbltheGlzXSA9IGk7XG4gICAgY29uc3Qgc2xpY2VkID0gc2xpY2Uoe2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge2JlZ2luLCBzaXplfX0pO1xuICAgIGNvbnN0IHJlc2hhcGVkID1cbiAgICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogc2xpY2VkfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogb3V0U2hhcGV9fSk7XG4gICAgcmVzW2ldID0gcmVzaGFwZWQ7XG5cbiAgICB0b0Rpc3Bvc2UucHVzaChzbGljZWQpO1xuICB9XG5cbiAgdG9EaXNwb3NlLmZvckVhY2godCA9PiBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHQpKTtcbiAgcmV0dXJuIHJlcztcbn1cblxuZXhwb3J0IGNvbnN0IHVucGFja0NvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBVbnBhY2ssXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiB1bnBhY2sgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIERhdGFUeXBlLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIHN1bU91dFR5cGUsIFRlbnNvckluZm8sIFVuc29ydGVkU2VnbWVudFN1bSwgVW5zb3J0ZWRTZWdtZW50U3VtQXR0cnMsIFVuc29ydGVkU2VnbWVudFN1bUlucHV0cywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7U2VnbWVudE9wUHJvZ3JhbX0gZnJvbSAnLi4vc2VnbWVudF9ncHUnO1xuXG5pbXBvcnQge3JhbmdlfSBmcm9tICcuL1JhbmdlJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7dGlsZX0gZnJvbSAnLi9UaWxlJztcbmltcG9ydCB7dHJhbnNwb3NlfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiB1bnNvcnRlZFNlZ21lbnRTdW0oYXJnczoge1xuICBpbnB1dHM6IFVuc29ydGVkU2VnbWVudFN1bUlucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IFVuc29ydGVkU2VnbWVudFN1bUF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4LCBzZWdtZW50SWRzfSA9IGlucHV0cztcbiAgY29uc3Qge251bVNlZ21lbnRzfSA9IGF0dHJzO1xuXG4gIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG5cbiAgY29uc3QgdG9EaXNwb3NlID0gW107XG5cbiAgbGV0IGF4aXMgPSAwO1xuICBjb25zdCBwZXJtdXRhdGlvbiA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oW2F4aXNdLCB4UmFuayk7XG4gIGxldCBwZXJtdXRlZFggPSB4O1xuICBpZiAocGVybXV0YXRpb24gIT0gbnVsbCkge1xuICAgIHBlcm11dGVkWCA9IHRyYW5zcG9zZSh7aW5wdXRzOiB7eH0sIGJhY2tlbmQsIGF0dHJzOiB7cGVybTogcGVybXV0YXRpb259fSk7XG4gICAgdG9EaXNwb3NlLnB1c2gocGVybXV0ZWRYKTtcbiAgICBheGlzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoMSwgeFJhbmspWzBdO1xuICB9XG5cbiAgY29uc3Qgb3V0U2hhcGUgPSBiYWNrZW5kX3V0aWwuc2VnbWVudF91dGlsLmNvbXB1dGVPdXRTaGFwZShcbiAgICAgIHBlcm11dGVkWC5zaGFwZSwgYXhpcywgbnVtU2VnbWVudHMpO1xuICBjb25zdCBpblNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoW3Blcm11dGVkWC5zaGFwZVtheGlzXV0pO1xuICBjb25zdCBhMkQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogcGVybXV0ZWRYfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogWy0xLCBpblNpemVdfX0pO1xuICB0b0Rpc3Bvc2UucHVzaChhMkQpO1xuXG4gIGNvbnN0IG91dHB1dERUeXBlID0gc3VtT3V0VHlwZSh4LmR0eXBlKTtcblxuICBjb25zdCBzZWdPcENvbXB1dGUgPVxuICAgICAgKHg6IFRlbnNvckluZm8sIHNlZ09wVHlwZTogJ3Vuc29ydGVkU2VnbWVudFN1bScsIHNlZ21lbnRJZHM6IFRlbnNvckluZm8sXG4gICAgICAgZHR5cGU6IERhdGFUeXBlLCBudW1TZWdtZW50czogbnVtYmVyKTogVGVuc29ySW5mbyA9PiB7XG4gICAgICAgIGNvbnN0IGJhdGNoU2l6ZSA9IHguc2hhcGVbMF07XG4gICAgICAgIGNvbnN0IGluU2l6ZSA9IHguc2hhcGVbMV07XG4gICAgICAgIGNvbnN0IHdpbmRvd1NpemUgPVxuICAgICAgICAgICAgYmFja2VuZF91dGlsLnNlZ21lbnRfdXRpbC5zZWdPcENvbXB1dGVPcHRpbWFsV2luZG93U2l6ZShcbiAgICAgICAgICAgICAgICBpblNpemUsIG51bVNlZ21lbnRzKTtcbiAgICAgICAgY29uc3Qgc2VnT3BJbmZvID0ge3dpbmRvd1NpemUsIGluU2l6ZSwgYmF0Y2hTaXplLCBudW1TZWdtZW50c307XG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgU2VnbWVudE9wUHJvZ3JhbShzZWdPcEluZm8sIHNlZ09wVHlwZSk7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IGJhY2tlbmQuY29tcGlsZUFuZFJ1bihwcm9ncmFtLCBbeCwgc2VnbWVudElkc10sIGR0eXBlKTtcbiAgICAgICAgdG9EaXNwb3NlLnB1c2gob3V0cHV0KTtcbiAgICAgICAgLy8gTm8gbmVlZCB0byBydW4gYW5vdGhlciBHUEdQVSBwcm9ncmFtLlxuICAgICAgICBpZiAob3V0cHV0LnNoYXBlWzFdID09PSBudW1TZWdtZW50cykge1xuICAgICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmFuZ2VJbmZvID0gcmFuZ2Uoe1xuICAgICAgICAgIGJhY2tlbmQsXG4gICAgICAgICAgYXR0cnM6IHtzdGFydDogMCwgc3RvcDogbnVtU2VnbWVudHMsIHN0ZXA6IDEsIGR0eXBlOiAnZmxvYXQzMid9XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB0aWxlSW5mbyA9IHRpbGUoe1xuICAgICAgICAgIGlucHV0czoge3g6IHJhbmdlSW5mb30sXG4gICAgICAgICAgYmFja2VuZCxcbiAgICAgICAgICBhdHRyczoge3JlcHM6IFtpblNpemUgLyB3aW5kb3dTaXplXX1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdG9EaXNwb3NlLnB1c2gocmFuZ2VJbmZvKTtcbiAgICAgICAgdG9EaXNwb3NlLnB1c2godGlsZUluZm8pO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9XG4gICAgICAgICAgICBzZWdPcENvbXB1dGUob3V0cHV0LCBzZWdPcFR5cGUsIHRpbGVJbmZvLCBkdHlwZSwgbnVtU2VnbWVudHMpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcblxuICBjb25zdCBzZWdPcFJlc3VsdCA9IHNlZ09wQ29tcHV0ZShcbiAgICAgIGEyRCwgJ3Vuc29ydGVkU2VnbWVudFN1bScsIHNlZ21lbnRJZHMsIG91dHB1dERUeXBlLCBudW1TZWdtZW50cyk7XG5cbiAgY29uc3QgcmVzaGFwZWQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogc2VnT3BSZXN1bHR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBvdXRTaGFwZX19KTtcblxuICBsZXQgcmVzdWx0ID0gcmVzaGFwZWQ7XG4gIGlmIChwZXJtdXRhdGlvbiAhPSBudWxsKSB7XG4gICAgdG9EaXNwb3NlLnB1c2gocmVzaGFwZWQpO1xuICAgIGNvbnN0IHBlcm0gPSBiYWNrZW5kX3V0aWwuZ2V0VW5kb0F4ZXNQZXJtdXRhdGlvbihwZXJtdXRhdGlvbik7XG4gICAgcmVzdWx0ID0gdHJhbnNwb3NlKHtpbnB1dHM6IHt4OiByZXN1bHR9LCBiYWNrZW5kLCBhdHRyczoge3Blcm19fSk7XG4gIH1cblxuICB0b0Rpc3Bvc2UuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgY29uc3QgdW5zb3J0ZWRTZWdtZW50U3VtQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFVuc29ydGVkU2VnbWVudFN1bSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHVuc29ydGVkU2VnbWVudFN1bSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgWmVyb3NMaWtlLCBaZXJvc0xpa2VJbnB1dHN9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5cbmltcG9ydCB7Y29tcGxleH0gZnJvbSAnLi9Db21wbGV4JztcbmltcG9ydCB7ZmlsbH0gZnJvbSAnLi9GaWxsJztcbmltcG9ydCB7aW1hZ30gZnJvbSAnLi9JbWFnJztcbmltcG9ydCB7cmVhbH0gZnJvbSAnLi9SZWFsJztcblxuZXhwb3J0IGZ1bmN0aW9uIHplcm9zTGlrZShcbiAgICBhcmdzOiB7aW5wdXRzOiBaZXJvc0xpa2VJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuXG4gIGlmICh4LmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgIGNvbnN0IHJlYWxQYXJ0ID0gcmVhbCh7aW5wdXRzOiB7aW5wdXQ6IHh9LCBiYWNrZW5kfSk7XG4gICAgY29uc3QgciA9IHplcm9zTGlrZSh7aW5wdXRzOiB7eDogcmVhbFBhcnR9LCBiYWNrZW5kfSk7XG4gICAgY29uc3QgaW1hZ1BhcnQgPSBpbWFnKHtpbnB1dHM6IHtpbnB1dDogeH0sIGJhY2tlbmR9KTtcbiAgICBjb25zdCBpID0gemVyb3NMaWtlKHtpbnB1dHM6IHt4OiBpbWFnUGFydH0sIGJhY2tlbmR9KTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBsZXgoe2lucHV0czoge3JlYWw6IHIsIGltYWc6IGl9LCBiYWNrZW5kfSk7XG5cbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlYWxQYXJ0KTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHIpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaW1hZ1BhcnQpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmaWxsKHtcbiAgICAgIGF0dHJzOiB7XG4gICAgICAgIHNoYXBlOiB4LnNoYXBlLFxuICAgICAgICBkdHlwZTogeC5kdHlwZSxcbiAgICAgICAgdmFsdWU6IHguZHR5cGUgPT09ICdzdHJpbmcnID8gJycgOiAwXG4gICAgICB9LFxuICAgICAgYmFja2VuZFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCB6ZXJvc0xpa2VDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogWmVyb3NMaWtlLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogemVyb3NMaWtlIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge19GdXNlZE1hdE11bCwgX0Z1c2VkTWF0TXVsQXR0cnMsIF9GdXNlZE1hdE11bElucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtiYXRjaE1hdE11bEltcGx9IGZyb20gJy4vQmF0Y2hNYXRNdWxfaW1wbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBfZnVzZWRNYXRNdWwoYXJnczoge1xuICBpbnB1dHM6IF9GdXNlZE1hdE11bElucHV0cyxcbiAgYXR0cnM6IF9GdXNlZE1hdE11bEF0dHJzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMXG59KSB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHthLCBiLCBiaWFzLCBwcmVsdUFjdGl2YXRpb25XZWlnaHRzfSA9IGlucHV0cztcbiAgY29uc3Qge3RyYW5zcG9zZUEsIHRyYW5zcG9zZUIsIGFjdGl2YXRpb24sIGxlYWt5cmVsdUFscGhhfSA9IGF0dHJzO1xuXG4gIHJldHVybiBiYXRjaE1hdE11bEltcGwoe1xuICAgIGEsXG4gICAgYixcbiAgICB0cmFuc3Bvc2VBLFxuICAgIHRyYW5zcG9zZUIsXG4gICAgYmFja2VuZCxcbiAgICBiaWFzLFxuICAgIHByZWx1QWN0aXZhdGlvbldlaWdodHMsXG4gICAgbGVha3lyZWx1QWxwaGEsXG4gICAgYWN0aXZhdGlvblxuICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IF9mdXNlZE1hdE11bENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBfRnVzZWRNYXRNdWwsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBfZnVzZWRNYXRNdWwgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgTFJOUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdID0gW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICB4U2hhcGU6IG51bWJlcltdLCByYWRpdXM6IG51bWJlciwgYmlhczogbnVtYmVyLCBhbHBoYTogbnVtYmVyLFxuICAgICAgYmV0YTogbnVtYmVyKSB7XG4gICAgY29uc3QgcmFkID0gcmFkaXVzO1xuICAgIGNvbnN0IG1heEQgPSB4U2hhcGVbM10gLSAxO1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSB4U2hhcGU7XG5cbiAgICAvLyBvcHRpbWl6ZSBwb3coYmlhcyArIGFscGhhICogc3VtLCAtYmV0YSlcbiAgICAvLyBzcmM6IGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmZsb3cvLi5cbiAgICAvLyBibG9iLzI2MDMzYTE2NDRhOWM0YTVmYmUzMTcwYWIyZTg2NGI2YTRjY2Q0Y2EvLi5cbiAgICAvLyB0ZW5zb3JmbG93L2NvcmUva2VybmVscy9ta2xfbHJuX29wLmNjI0wzMjBcbiAgICBsZXQgcG93T3BlcmF0b3I7XG4gICAgY29uc3QgYmFzaXMgPSBgZmxvYXQoJHtiaWFzfSkgKyBmbG9hdCgke2FscGhhfSkgKiBzdW1gO1xuICAgIGlmIChiZXRhID09PSAwLjUpIHtcbiAgICAgIHBvd09wZXJhdG9yID0gYGludmVyc2VzcXJ0KCR7YmFzaXN9KWA7XG4gICAgfSBlbHNlIGlmIChiZXRhID09PSAxLjApIHtcbiAgICAgIHBvd09wZXJhdG9yID0gYDEuMC8oJHtiYXNpc30pYDtcbiAgICB9IGVsc2Uge1xuICAgICAgcG93T3BlcmF0b3IgPSBgZXhwKGxvZygke2Jhc2lzfSkgKiBmbG9hdCgtJHtiZXRhfSkpO2A7XG4gICAgfVxuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgciA9IGNvb3Jkc1sxXTtcbiAgICAgICAgaW50IGMgPSBjb29yZHNbMl07XG4gICAgICAgIGludCBkID0gY29vcmRzWzNdO1xuICAgICAgICBmbG9hdCB4ID0gZ2V0WChiLCByLCBjLCBkKTtcbiAgICAgICAgZmxvYXQgc3VtID0gMC4wO1xuICAgICAgICBmb3IgKGludCBqID0gLSR7cmFkfTsgaiA8PSAke3JhZH07IGorKykge1xuICAgICAgICAgIGludCBpZHggPSBkICsgajtcbiAgICAgICAgICBpZiAoaWR4ID49IDAgJiYgaWR4IDw9ICAke21heER9KSB7XG4gICAgICAgICAgICBmbG9hdCB6ID0gZ2V0WChiLCByLCBjLCBpZHgpO1xuICAgICAgICAgICAgc3VtICs9IHogKiB6O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmbG9hdCB2YWwgPSB4ICogJHtwb3dPcGVyYXRvcn07XG4gICAgICAgIHNldE91dHB1dCh2YWwpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBMUk5HcmFkUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ2lucHV0SW1hZ2UnLCAnb3V0cHV0SW1hZ2UnLCAnZHknXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdID0gW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIGRlcHRoUmFkaXVzOiBudW1iZXI7XG4gIGJpYXM6IG51bWJlcjtcbiAgYWxwaGE6IG51bWJlcjtcbiAgYmV0YTogbnVtYmVyO1xuICBkZXB0aDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgaW5wdXRTaGFwZTogbnVtYmVyW10sIGRlcHRoUmFkaXVzOiBudW1iZXIsIGJpYXM6IG51bWJlciwgYWxwaGE6IG51bWJlcixcbiAgICAgIGJldGE6IG51bWJlcikge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBpbnB1dFNoYXBlO1xuICAgIHRoaXMuZGVwdGggPSBpbnB1dFNoYXBlWzNdO1xuICAgIHRoaXMuZGVwdGhSYWRpdXMgPSBkZXB0aFJhZGl1cztcbiAgICB0aGlzLmJpYXMgPSBiaWFzO1xuICAgIHRoaXMuYWxwaGEgPSBhbHBoYTtcbiAgICB0aGlzLmJldGEgPSBiZXRhO1xuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYiA9IGNvb3Jkc1swXTtcbiAgICAgICAgaW50IHIgPSBjb29yZHNbMV07XG4gICAgICAgIGludCBjID0gY29vcmRzWzJdO1xuXG4gICAgICAgIGZsb2F0IHJlc3VsdCA9IDAuMDtcbiAgICAgICAgZm9yIChpbnQgZCA9IDA7IGQgPCAke3RoaXMuZGVwdGh9OyArK2QpIHtcbiAgICAgICAgICBpbnQgZGVwdGhCZWdpbiA9IGludChtYXgoMC4wLCBmbG9hdChkIC0gJHtkZXB0aFJhZGl1c30pKSk7XG4gICAgICAgICAgaW50IGRlcHRoRW5kID0gaW50KG1pbihmbG9hdCgke3RoaXMuZGVwdGh9KSxcbiAgICAgICAgICAgICAgZmxvYXQoZCArICR7ZGVwdGhSYWRpdXN9ICsgMSkpKTtcblxuICAgICAgICAgIGNvbnN0IGludCBNSU5fREVQVEhfQkVHSU4gPSAwO1xuICAgICAgICAgIGNvbnN0IGludCBNQVhfREVQVEhfRU5EID0gJHt0aGlzLmRlcHRofTtcblxuICAgICAgICAgIGZsb2F0IG5vcm0gPSAwLjA7XG4gICAgICAgICAgZm9yIChpbnQgayA9IE1JTl9ERVBUSF9CRUdJTjsgayA8IE1BWF9ERVBUSF9FTkQ7ICsraykge1xuICAgICAgICAgICAgaWYgKGsgPCBkZXB0aEJlZ2luKXtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChrID49IGRlcHRoQmVnaW4gJiYgayA8IGRlcHRoRW5kKSB7XG4gICAgICAgICAgICAgIG5vcm0gKz0gZ2V0SW5wdXRJbWFnZShiLCByLCBjLCBrKSAqIGdldElucHV0SW1hZ2UoYiwgciwgYywgayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbm9ybSA9IGZsb2F0KCR7YWxwaGF9KSAqIG5vcm0gKyBmbG9hdCgke2JpYXN9KTtcblxuICAgICAgICAgIGZvcihpbnQgayA9IE1JTl9ERVBUSF9CRUdJTjsgayA8IE1BWF9ERVBUSF9FTkQ7ICsrayl7XG4gICAgICAgICAgICBpZiAoayA8IGRlcHRoQmVnaW4pe1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGsgPj0gZGVwdGhCZWdpbiAmJiBrIDwgZGVwdGhFbmQpe1xuICAgICAgICAgICAgICBmbG9hdCBkeWkgPSAtMi4wICogZmxvYXQoJHthbHBoYX0pXG4gICAgICAgICAgICAgICAgKiBmbG9hdCgke2JldGF9KVxuICAgICAgICAgICAgICAgICogZ2V0SW5wdXRJbWFnZShiICxyICxjLCBrKSAqIGdldE91dHB1dEltYWdlKGIsIHIsIGMsIGQpXG4gICAgICAgICAgICAgICAgLyBub3JtO1xuICAgICAgICAgICAgICBpZiAoayA9PSBkKSB7XG4gICAgICAgICAgICAgICAgZHlpICs9IHBvdyhub3JtLCAtMS4wICogJHtiZXRhfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGsgPT0gY29vcmRzWzNdKSB7XG4gICAgICAgICAgICAgICAgZHlpICo9IGdldER5KGIsIHIsIGMsIGQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBkeWk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICBzZXRPdXRwdXQocmVzdWx0KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgTFJOUGFja2VkUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdID0gW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIHBhY2tlZElucHV0cyA9IHRydWU7XG4gIHBhY2tlZE91dHB1dCA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICB4U2hhcGU6IG51bWJlcltdLCByYWRpdXM6IG51bWJlciwgYmlhczogbnVtYmVyLCBhbHBoYTogbnVtYmVyLFxuICAgICAgYmV0YTogbnVtYmVyKSB7XG4gICAgY29uc3QgcmFkID0gcmFkaXVzO1xuICAgIGNvbnN0IG1heEQgPSB4U2hhcGVbM10gLSAxO1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSB4U2hhcGU7XG5cbiAgICAvLyBvcHRpbWl6ZSBwb3coYmlhcyArIGFscGhhICogc3VtLCAtYmV0YSlcbiAgICAvLyBzcmM6IGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmZsb3cvLi5cbiAgICAvLyBibG9iLzI2MDMzYTE2NDRhOWM0YTVmYmUzMTcwYWIyZTg2NGI2YTRjY2Q0Y2EvLi5cbiAgICAvLyB0ZW5zb3JmbG93L2NvcmUva2VybmVscy9ta2xfbHJuX29wLmNjI0wzMjBcbiAgICBsZXQgcG93T3BlcmF0b3I7XG4gICAgY29uc3QgYmFzaXMgPSBgZmxvYXQoJHtiaWFzfSkgKyBmbG9hdCgke2FscGhhfSkgKiBzdW1gO1xuICAgIGlmIChiZXRhID09PSAwLjUpIHtcbiAgICAgIHBvd09wZXJhdG9yID0gYGludmVyc2VzcXJ0KCR7YmFzaXN9KWA7XG4gICAgfSBlbHNlIGlmIChiZXRhID09PSAxLjApIHtcbiAgICAgIHBvd09wZXJhdG9yID0gYDEuMC8oJHtiYXNpc30pYDtcbiAgICB9IGVsc2Uge1xuICAgICAgcG93T3BlcmF0b3IgPSBgZXhwKGxvZygke2Jhc2lzfSkgKiBmbG9hdCgtJHtiZXRhfSkpO2A7XG4gICAgfVxuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiID0gY29vcmRzLng7XG4gICAgICAgIGludCByID0gY29vcmRzLnk7XG4gICAgICAgIGludCBjID0gY29vcmRzLno7XG4gICAgICAgIGludCBkID0gY29vcmRzLnc7XG5cbiAgICAgICAgYm9vbCBoYXNOZXh0Q29sID0gZCA8ICR7dGhpcy5vdXRwdXRTaGFwZVszXX07XG4gICAgICAgIGJvb2wgaGFzTmV4dFJvdyA9IGMgPCAke3RoaXMub3V0cHV0U2hhcGVbMl19O1xuXG4gICAgICAgIHZlYzQgc3VtID0gdmVjNCgwLik7XG4gICAgICAgIHZlYzQgeEZyYWdBdE91dHB1dENvb3JkcyA9IGdldFgoYiwgciwgYywgZCk7XG5cbiAgICAgICAgdmVjNCB4QXRPdXRwdXRDb29yZHMgPSB2ZWM0KFxuICAgICAgICAgIGdldENoYW5uZWwoeEZyYWdBdE91dHB1dENvb3JkcywgdmVjMihjLCBkKSksXG4gICAgICAgICAgaGFzTmV4dENvbCA/XG4gICAgICAgICAgICBnZXRDaGFubmVsKHhGcmFnQXRPdXRwdXRDb29yZHMsIHZlYzIoYywgZCArIDEpKSA6IDAuMCxcbiAgICAgICAgICBoYXNOZXh0Um93ID9cbiAgICAgICAgICAgIGdldENoYW5uZWwoeEZyYWdBdE91dHB1dENvb3JkcyAsIHZlYzIoYyArIDEsIGQpKSA6IDAuMCxcbiAgICAgICAgICAoaGFzTmV4dFJvdyAmJiBoYXNOZXh0Q29sKSA/XG4gICAgICAgICAgICBnZXRDaGFubmVsKHhGcmFnQXRPdXRwdXRDb29yZHMsIHZlYzIoYyArIDEsIGQgKyAxKSkgOiAwLjBcbiAgICAgICAgKTtcblxuICAgICAgICBpbnQgZmlyc3RDaGFubmVsID0gZCAtICR7cmFkfTtcbiAgICAgICAgdmVjMiBjYWNoZSA9IHZlYzIoMC4pO1xuICAgICAgICBpZihmaXJzdENoYW5uZWwgPj0gMCl7XG4gICAgICAgICAgdmVjNCBmaXJzdENoYW5uZWxGcmFnID0gZ2V0WChiLCByLCBjLCBmaXJzdENoYW5uZWwpO1xuICAgICAgICAgIGNhY2hlLnggPSBnZXRDaGFubmVsKGZpcnN0Q2hhbm5lbEZyYWcsIHZlYzIoYywgZmlyc3RDaGFubmVsKSk7XG4gICAgICAgICAgICBpZihoYXNOZXh0Um93KXtcbiAgICAgICAgICAgICAgY2FjaGUueSA9IGdldENoYW5uZWwoZmlyc3RDaGFubmVsRnJhZywgdmVjMihjICsgMSwgZmlyc3RDaGFubmVsKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpdmVjMiBkZXB0aCA9IGl2ZWMyKGQsIGQgKyAxKTtcbiAgICAgICAgZm9yIChpbnQgaiA9IC0gJHtyYWR9OyBqIDw9ICR7cmFkfTsgaisrKSB7XG4gICAgICAgICAgaXZlYzIgaWR4ID0gZGVwdGggKyBqO1xuICAgICAgICAgIGJ2ZWMyIGFib3ZlTG93ZXJCb3VuZCA9IGdyZWF0ZXJUaGFuRXF1YWwoaWR4LCBpdmVjMigwKSk7XG4gICAgICAgICAgYnZlYzIgYmVsb3dVcHBlckJvdW5kID0gbGVzc1RoYW5FcXVhbChpZHgsIGl2ZWMyKCR7bWF4RH0pKTtcblxuICAgICAgICAgIGJvb2wgZGVwdGhJblJhbmdlID0gYWJvdmVMb3dlckJvdW5kLnggJiYgYmVsb3dVcHBlckJvdW5kLng7XG4gICAgICAgICAgYm9vbCBkZXB0aFBsdXNPbmVJblJhbmdlID0gYWJvdmVMb3dlckJvdW5kLnkgJiYgYmVsb3dVcHBlckJvdW5kLnk7XG5cbiAgICAgICAgICBpZihkZXB0aEluUmFuZ2UgfHwgZGVwdGhQbHVzT25lSW5SYW5nZSl7XG4gICAgICAgICAgICB2ZWM0IHogPSB2ZWM0KDAuKTtcbiAgICAgICAgICAgIHZlYzQgeEZyYWdBdEN1cnJlbnREZXB0aDtcbiAgICAgICAgICAgIHoueHogPSBjYWNoZS54eTtcbiAgICAgICAgICAgIGlmKGRlcHRoUGx1c09uZUluUmFuZ2UgJiYgaGFzTmV4dENvbCl7XG4gICAgICAgICAgICAgIHhGcmFnQXRDdXJyZW50RGVwdGggPSBpZHgueSAhPSBkID9cbiAgICAgICAgICAgICAgICBnZXRYKGIsIHIsIGMsIGlkeC55KSA6IHhGcmFnQXRPdXRwdXRDb29yZHM7XG4gICAgICAgICAgICAgIHoueSA9IGdldENoYW5uZWwoeEZyYWdBdEN1cnJlbnREZXB0aCwgdmVjMihjLCBpZHgueSkpO1xuICAgICAgICAgICAgICBpZihoYXNOZXh0Um93KXtcbiAgICAgICAgICAgICAgICB6LncgPSBnZXRDaGFubmVsKHhGcmFnQXRDdXJyZW50RGVwdGgsIHZlYzIoYyArIDEsIGlkeC55KSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhY2hlLnh5ID0gei55dztcbiAgICAgICAgICAgIHN1bSArPSB6ICogejtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmVjNCByZXN1bHQgPSB4QXRPdXRwdXRDb29yZHMgKiAke3Bvd09wZXJhdG9yfTtcbiAgICAgICAgc2V0T3V0cHV0KHJlc3VsdCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgTWF4UG9vbDJEQmFja3Byb3BQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnZHknLCAnbWF4UG9zJ107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihjb252SW5mbzogYmFja2VuZF91dGlsLkNvbnYyREluZm8pIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gY29udkluZm8uaW5TaGFwZTtcbiAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckhlaWdodDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoO1xuXG4gICAgY29uc3QgcGFkVG9wID0gZWZmZWN0aXZlRmlsdGVySGVpZ2h0IC0gMSAtIGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IHBhZExlZnQgPSBlZmZlY3RpdmVGaWx0ZXJXaWR0aCAtIDEgLSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG5cbiAgICBjb25zdCBsYXN0SW5kZXggPSBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgKiBlZmZlY3RpdmVGaWx0ZXJXaWR0aCAtIDE7XG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IGl2ZWMyIHBhZHMgPSBpdmVjMigke3BhZFRvcH0sICR7cGFkTGVmdH0pO1xuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYiA9IGNvb3Jkc1swXTtcbiAgICAgICAgaW50IGQgPSBjb29yZHNbM107XG5cbiAgICAgICAgaXZlYzIgZHlSQ0Nvcm5lciA9IGNvb3Jkcy55eiAtIHBhZHM7XG4gICAgICAgIGludCBkeVJDb3JuZXIgPSBkeVJDQ29ybmVyLng7XG4gICAgICAgIGludCBkeUNDb3JuZXIgPSBkeVJDQ29ybmVyLnk7XG5cbiAgICAgICAgLy8gQ29udm9sdmUgZHkoPywgPywgZCkgd2l0aCBwb3MgbWFzayg6LCA6LCBkKSB0byBnZXQgZHgoeFIsIHhDLCBkKS5cbiAgICAgICAgLy8gPyA9IHRvIGJlIGRldGVybWluZWQuIDogPSBhY3Jvc3MgYWxsIHZhbHVlcyBpbiB0aGF0IGF4aXMuXG4gICAgICAgIGZsb2F0IGRvdFByb2QgPSAwLjA7XG4gICAgICAgIGZvciAoaW50IHdSID0gMDsgd1IgPCAke2VmZmVjdGl2ZUZpbHRlckhlaWdodH07XG4gICAgICAgICAgd1IgKz0gJHtkaWxhdGlvbkhlaWdodH0pIHtcbiAgICAgICAgICBmbG9hdCBkeVIgPSBmbG9hdChkeVJDb3JuZXIgKyB3UikgLyAke3N0cmlkZUhlaWdodH0uMDtcblxuICAgICAgICAgIGlmIChkeVIgPCAwLjAgfHwgZHlSID49ICR7Y29udkluZm8ub3V0SGVpZ2h0fS4wIHx8IGZyYWN0KGR5UikgPiAwLjApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpbnQgaWR5UiA9IGludChkeVIpO1xuXG4gICAgICAgICAgZm9yIChpbnQgd0MgPSAwOyB3QyA8ICR7ZWZmZWN0aXZlRmlsdGVyV2lkdGh9OyB3QysrKSB7XG4gICAgICAgICAgICBmbG9hdCBkeUMgPSBmbG9hdChkeUNDb3JuZXIgKyB3QykgLyAke3N0cmlkZVdpZHRofS4wO1xuXG4gICAgICAgICAgICBpZiAoZHlDIDwgMC4wIHx8IGR5QyA+PSAke2NvbnZJbmZvLm91dFdpZHRofS4wIHx8XG4gICAgICAgICAgICAgICAgZnJhY3QoZHlDKSA+IDAuMCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGludCBpZHlDID0gaW50KGR5Qyk7XG5cbiAgICAgICAgICAgIGZsb2F0IGR5VmFsdWUgPSBnZXREeShiLCBpZHlSLCBpZHlDLCBkKTtcbiAgICAgICAgICAgIGludCBtYXhQb3NWYWx1ZSA9ICR7bGFzdEluZGV4fSAtIGludChnZXRNYXhQb3MoYiwgaWR5UiwgaWR5QywgZCkpO1xuXG4gICAgICAgICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgdmFsdWUsIGNoZWNrIGl0IGFnYWluc3QgdGhlIHZhbHVlIGZyb20gdGhlXG4gICAgICAgICAgICAvLyBwb3NpdGlvbiBtYXRyaXguXG4gICAgICAgICAgICBpbnQgY3VyUG9zVmFsdWUgPSB3UiAqICR7ZWZmZWN0aXZlRmlsdGVyV2lkdGh9ICsgd0M7XG4gICAgICAgICAgICBmbG9hdCBtYXNrID0gZmxvYXQobWF4UG9zVmFsdWUgPT0gY3VyUG9zVmFsdWUgPyAxLjAgOiAwLjApO1xuXG4gICAgICAgICAgICBkb3RQcm9kICs9IGR5VmFsdWUgKiBtYXNrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQoZG90UHJvZCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWF4UG9vbDNEQmFja3Byb3BQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnZHknLCAnbWF4UG9zJ107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihjb252SW5mbzogYmFja2VuZF91dGlsLkNvbnYzREluZm8pIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gY29udkluZm8uaW5TaGFwZTtcbiAgICBjb25zdCBzdHJpZGVEZXB0aCA9IGNvbnZJbmZvLnN0cmlkZURlcHRoO1xuICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICAgIGNvbnN0IGRpbGF0aW9uRGVwdGggPSBjb252SW5mby5kaWxhdGlvbkRlcHRoO1xuICAgIGNvbnN0IGRpbGF0aW9uSGVpZ2h0ID0gY29udkluZm8uZGlsYXRpb25IZWlnaHQ7XG4gICAgY29uc3QgZGlsYXRpb25XaWR0aCA9IGNvbnZJbmZvLmRpbGF0aW9uV2lkdGg7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVyRGVwdGggPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJEZXB0aDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJIZWlnaHQ7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVyV2lkdGggPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJXaWR0aDtcblxuICAgIGNvbnN0IHBhZEZyb250ID0gZWZmZWN0aXZlRmlsdGVyRGVwdGggLSAxIC0gY29udkluZm8ucGFkSW5mby5mcm9udDtcbiAgICBjb25zdCBwYWRUb3AgPSBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgLSAxIC0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgcGFkTGVmdCA9IGVmZmVjdGl2ZUZpbHRlcldpZHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcblxuICAgIGNvbnN0IGxhc3RJbmRleCA9XG4gICAgICAgIGVmZmVjdGl2ZUZpbHRlckRlcHRoICogZWZmZWN0aXZlRmlsdGVySGVpZ2h0ICogZWZmZWN0aXZlRmlsdGVyV2lkdGggLSAxO1xuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCBpdmVjMyBwYWRzID0gaXZlYzMoJHtwYWRGcm9udH0sICR7cGFkVG9wfSwgJHtwYWRMZWZ0fSk7XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzUgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiYXRjaCA9IGNvb3Jkcy54O1xuICAgICAgICBpbnQgY2ggPSBjb29yZHMudTtcblxuICAgICAgICBpdmVjMyBkeUNvcm5lciA9IGl2ZWMzKGNvb3Jkcy55LCBjb29yZHMueiwgY29vcmRzLncpIC0gcGFkcztcbiAgICAgICAgaW50IGR5RENvcm5lciA9IGR5Q29ybmVyLng7XG4gICAgICAgIGludCBkeVJDb3JuZXIgPSBkeUNvcm5lci55O1xuICAgICAgICBpbnQgZHlDQ29ybmVyID0gZHlDb3JuZXIuejtcblxuICAgICAgICAvLyBDb252b2x2ZSBkeSg/LCA/LCA/LCBjaCkgd2l0aCBwb3MgbWFzayg6LCA6LCA6LCBkKSB0byBnZXRcbiAgICAgICAgLy8gZHgoeEQsIHhSLCB4QywgY2gpLlxuICAgICAgICAvLyA/ID0gdG8gYmUgZGV0ZXJtaW5lZC4gOiA9IGFjcm9zcyBhbGwgdmFsdWVzIGluIHRoYXQgYXhpcy5cbiAgICAgICAgZmxvYXQgZG90UHJvZCA9IDAuMDtcblxuICAgICAgICBmb3IgKGludCB3RCA9IDA7IHdEIDwgJHtlZmZlY3RpdmVGaWx0ZXJEZXB0aH07XG4gICAgICAgICAgIHdEICs9ICR7ZGlsYXRpb25EZXB0aH0pIHtcbiAgICAgICAgICBmbG9hdCBkeUQgPSBmbG9hdChkeURDb3JuZXIgKyB3RCkgLyAke3N0cmlkZURlcHRofS4wO1xuXG4gICAgICAgICAgaWYgKGR5RCA8IDAuMCB8fCBkeUQgPj0gJHtjb252SW5mby5vdXREZXB0aH0uMCB8fCBmcmFjdChkeUQpID4gMC4wKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaW50IGlkeUQgPSBpbnQoZHlEKTtcblxuICAgICAgICAgIGZvciAoaW50IHdSID0gMDsgd1IgPCAke2VmZmVjdGl2ZUZpbHRlckhlaWdodH07XG4gICAgICAgICAgICAgIHdSICs9ICR7ZGlsYXRpb25IZWlnaHR9KSB7XG4gICAgICAgICAgICBmbG9hdCBkeVIgPSBmbG9hdChkeVJDb3JuZXIgKyB3UikgLyAke3N0cmlkZUhlaWdodH0uMDtcblxuICAgICAgICAgICAgaWYgKGR5UiA8IDAuMCB8fCBkeVIgPj0gJHtjb252SW5mby5vdXRIZWlnaHR9LjAgfHxcbiAgICAgICAgICAgICAgICBmcmFjdChkeVIpID4gMC4wKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW50IGlkeVIgPSBpbnQoZHlSKTtcblxuICAgICAgICAgICAgZm9yIChpbnQgd0MgPSAwOyB3QyA8ICR7ZWZmZWN0aXZlRmlsdGVyV2lkdGh9O1xuICAgICAgICAgICAgICAgIHdDICs9ICR7ZGlsYXRpb25XaWR0aH0pIHtcbiAgICAgICAgICAgICAgZmxvYXQgZHlDID0gZmxvYXQoZHlDQ29ybmVyICsgd0MpIC8gJHtzdHJpZGVXaWR0aH0uMDtcblxuICAgICAgICAgICAgICBpZiAoZHlDIDwgMC4wIHx8IGR5QyA+PSAke2NvbnZJbmZvLm91dFdpZHRofS4wIHx8XG4gICAgICAgICAgICAgICAgICBmcmFjdChkeUMpID4gMC4wKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaW50IGlkeUMgPSBpbnQoZHlDKTtcblxuICAgICAgICAgICAgICBmbG9hdCBkeVZhbHVlID0gZ2V0RHkoYmF0Y2gsIGlkeUQsIGlkeVIsIGlkeUMsIGNoKTtcbiAgICAgICAgICAgICAgaW50IG1heFBvc1ZhbHVlID0gJHtsYXN0SW5kZXh9IC1cbiAgICAgICAgICAgICAgICAgIGludChnZXRNYXhQb3MoYmF0Y2gsIGlkeUQsIGlkeVIsIGlkeUMsIGNoKSk7XG5cbiAgICAgICAgICAgICAgLy8gR2V0IHRoZSBjdXJyZW50IHZhbHVlLCBjaGVjayBpdCBhZ2FpbnN0IHRoZSB2YWx1ZSBmcm9tIHRoZVxuICAgICAgICAgICAgICAvLyBwb3NpdGlvbiBtYXRyaXguXG4gICAgICAgICAgICAgIGludCBjdXJQb3NWYWx1ZSA9XG4gICAgICAgICAgICAgICAgICB3RCAqICR7ZWZmZWN0aXZlRmlsdGVySGVpZ2h0fSAqICR7ZWZmZWN0aXZlRmlsdGVyV2lkdGh9ICtcbiAgICAgICAgICAgICAgICAgIHdSICogJHtlZmZlY3RpdmVGaWx0ZXJXaWR0aH0gKyB3QztcbiAgICAgICAgICAgICAgZmxvYXQgbWFzayA9IGZsb2F0KG1heFBvc1ZhbHVlID09IGN1clBvc1ZhbHVlID8gMS4wIDogMC4wKTtcblxuICAgICAgICAgICAgICBkb3RQcm9kICs9IGR5VmFsdWUgKiBtYXNrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQoZG90UHJvZCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgTWVhblByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWyd4J107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihyZWR1Y2VJbmZvOiBiYWNrZW5kX3V0aWwuUmVkdWNlSW5mbywgZGl2aXNvcj86IG51bWJlcikge1xuICAgIGNvbnN0IHt3aW5kb3dTaXplLCBiYXRjaFNpemUsIGluU2l6ZSwgb3V0U2l6ZX0gPSByZWR1Y2VJbmZvO1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBbYmF0Y2hTaXplLCBvdXRTaXplXTtcblxuICAgIGNvbnN0IHdpbmRvd1NpemVOZWFyZXN0VmVjNCA9IE1hdGguZmxvb3Iod2luZG93U2l6ZSAvIDQpICogNDtcbiAgICBjb25zdCB3aW5kb3dTaXplVmVjNFJlbWFpbmRlciA9IHdpbmRvd1NpemUgJSA0O1xuXG4gICAgbGV0IHVwZGF0ZVNuaXBwZXQgPSBgc3VtVmFsdWUgKz0gZG90KHZhbHVlcywgb25lcyk7YDtcbiAgICBpZiAoZGl2aXNvciAhPSBudWxsKSB7XG4gICAgICBjb25zdCBkZW5vbWluYXRvciA9IDEgLyBkaXZpc29yO1xuICAgICAgdXBkYXRlU25pcHBldCA9IGBzdW1WYWx1ZSArPSBkb3QodmFsdWVzICogJHtcbiAgICAgICAgICB1dGlsLmlzSW50KGRlbm9taW5hdG9yKSA/IGRlbm9taW5hdG9yLnRvUHJlY2lzaW9uKDIpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbm9taW5hdG9yfSwgb25lcyk7YDtcbiAgICB9XG5cbiAgICBsZXQgY2hlY2tPdXRPZkJvdW5kcyA9ICcnO1xuICAgIGlmIChpblNpemUgJSB3aW5kb3dTaXplID4gMCkge1xuICAgICAgY2hlY2tPdXRPZkJvdW5kcyA9IGBcbiAgICAgICAgaWYgKGluSWR4IDwgMCB8fCBpbklkeCA+PSAke2luU2l6ZX0pIHtcbiAgICAgICAgICByZXR1cm4gMC4wO1xuICAgICAgICB9XG4gICAgICBgO1xuICAgIH1cblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCB2ZWM0IG9uZXMgPSB2ZWM0KDEuMCwgMS4wLCAxLjAsIDEuMCk7XG5cbiAgICAgIGZsb2F0IGdldFZhbHVlKGludCBiYXRjaCwgaW50IGluSWR4KSB7XG4gICAgICAgICR7Y2hlY2tPdXRPZkJvdW5kc31cbiAgICAgICAgcmV0dXJuIGdldFgoYmF0Y2gsIGluSWR4KTtcbiAgICAgIH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMiBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgb3V0SWR4ID0gY29vcmRzWzFdO1xuICAgICAgICBpbnQgaW5PZmZzZXQgPSBvdXRJZHggKiAke3dpbmRvd1NpemV9O1xuXG4gICAgICAgIGZsb2F0IHN1bVZhbHVlID0gMC4wO1xuXG4gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgJHt3aW5kb3dTaXplTmVhcmVzdFZlYzR9OyBpICs9IDQpIHtcbiAgICAgICAgICBpbnQgaW5JZHggPSBpbk9mZnNldCArIGk7XG4gICAgICAgICAgdmVjNCB2YWx1ZXMgPSB2ZWM0KFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4KSxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDEpLFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4ICsgMiksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAzKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAke3VwZGF0ZVNuaXBwZXR9XG4gICAgICAgIH1cblxuICAgICAgICBpbnQgaW5JZHggPSBpbk9mZnNldCArICR7d2luZG93U2l6ZU5lYXJlc3RWZWM0fTtcbiAgICAgICAgaWYgKCR7d2luZG93U2l6ZVZlYzRSZW1haW5kZXIgPT09IDF9KSB7XG4gICAgICAgICAgdmVjNCB2YWx1ZXMgPSB2ZWM0KGdldFZhbHVlKGJhdGNoLCBpbklkeCksIDAuMCwgMC4wLCAwLjApO1xuXG4gICAgICAgICAgJHt1cGRhdGVTbmlwcGV0fVxuICAgICAgICB9IGVsc2UgaWYgKCR7d2luZG93U2l6ZVZlYzRSZW1haW5kZXIgPT09IDJ9KSB7XG4gICAgICAgICAgdmVjNCB2YWx1ZXMgPSB2ZWM0KFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4KSxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDEpLCAwLjAsIDAuMCk7XG5cbiAgICAgICAgICAke3VwZGF0ZVNuaXBwZXR9XG4gICAgICAgIH0gZWxzZSBpZiAoJHt3aW5kb3dTaXplVmVjNFJlbWFpbmRlciA9PT0gM30pIHtcbiAgICAgICAgICB2ZWM0IHZhbHVlcyA9IHZlYzQoXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHgpLFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4ICsgMSksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAyKSwgMC4wKTtcblxuICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQoc3VtVmFsdWUpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5pbXBvcnQge2dldENvb3Jkc0RhdGFUeXBlfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5cbmV4cG9ydCBjbGFzcyBNaXJyb3JQYWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsneCddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICB4U2hhcGU6IG51bWJlcltdLCBwYWRkaW5nczogQXJyYXk8W251bWJlciwgbnVtYmVyXT4sXG4gICAgICBtb2RlOiAncmVmbGVjdCd8J3N5bW1ldHJpYycpIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gcGFkZGluZ3MubWFwKFxuICAgICAgICAocCwgaSkgPT4gcFswXSAvKiBiZWZvcmVQYWQgKi8gKyB4U2hhcGVbaV0gKyBwWzFdIC8qIGFmdGVyUGFkICovKTtcbiAgICBjb25zdCByYW5rID0geFNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBkdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHJhbmspO1xuXG4gICAgY29uc3Qgc3RhcnQgPSBwYWRkaW5ncy5tYXAocCA9PiBwWzBdKS5qb2luKCcsJyk7XG4gICAgY29uc3QgZW5kID0gcGFkZGluZ3MubWFwKChwLCBpKSA9PiBwWzBdICsgeFNoYXBlW2ldKS5qb2luKCcsJyk7XG4gICAgY29uc3QgdW5wYWNrZWRDb29yZHMgPVxuICAgICAgICBbJ2Nvb3Jkc1swXScsICdjb29yZHNbMV0nLCAnY29vcmRzWzJdJywgJ2Nvb3Jkc1szXSddLnNsaWNlKDAsIHJhbmspO1xuICAgIGNvbnN0IG9mZnNldCA9IG1vZGUgPT09ICdyZWZsZWN0JyA/IDAgOiAxO1xuXG4gICAgaWYgKHJhbmsgPT09IDEpIHtcbiAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAgIGludCBzdGFydCA9ICR7c3RhcnR9O1xuICAgICAgICBpbnQgZW5kID0gJHtlbmR9O1xuXG4gICAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgICBpbnQgb3V0QyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgIGlmIChvdXRDIDwgc3RhcnQpIHtcbiAgICAgICAgICAgIG91dEMgPSBzdGFydCAqIDIgLSBvdXRDIC0gJHtvZmZzZXR9O1xuICAgICAgICAgIH0gZWxzZSBpZihvdXRDID49IGVuZCkge1xuICAgICAgICAgICAgb3V0QyA9IChlbmQgLSAxKSAqIDIgLSBvdXRDICsgJHtvZmZzZXR9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZXRPdXRwdXQoZ2V0WChvdXRDIC0gc3RhcnQpKTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICR7ZHR5cGV9IHN0YXJ0ID0gJHtkdHlwZX0oJHtzdGFydH0pO1xuICAgICAgJHtkdHlwZX0gZW5kID0gJHtkdHlwZX0oJHtlbmR9KTtcblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke2R0eXBlfSBvdXRDID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgJHtyYW5rfTsgaSsrKSB7XG4gICAgICAgICAgaWYgKG91dENbaV0gPCBzdGFydFtpXSkge1xuICAgICAgICAgICAgb3V0Q1tpXSA9IHN0YXJ0W2ldICogMiAtIG91dENbaV0gLSAke29mZnNldH07XG4gICAgICAgICAgfSBlbHNlIGlmKG91dENbaV0gPj0gZW5kW2ldKSB7XG4gICAgICAgICAgICBvdXRDW2ldID0gKGVuZFtpXSAtIDEpICogMiAtIG91dENbaV0gKyAke29mZnNldH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgICR7ZHR5cGV9IGNvb3JkcyA9IG91dEMgLSBzdGFydDtcbiAgICAgICAgc2V0T3V0cHV0KGdldFgoJHt1bnBhY2tlZENvb3Jkc30pKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtnZXRDaGFubmVsc30gZnJvbSAnLi9wYWNraW5nX3V0aWwnO1xuaW1wb3J0IHtnZXRDb29yZHNEYXRhVHlwZX0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuXG4vKipcbiAqIEV4YW1wbGUgc2hhZGVyIGNvZGUgZm9yXG4gKiBgbWlycm9yUGFkKHRmLnRlbnNvcjFkKFsxLCAyLCAzXSwgJ2ludDMyJyksIFtbMiwgMl1dLCAncmVmbGVjdCcpYFxuICogYGBgXG4gKiAgICBjb25zdCBpbnQgc3RhcnQgPSBpbnQoMik7XG4gKiAgICBjb25zdCBpbnQgZW5kID0gaW50KDUpO1xuICpcbiAqICAgIHZvaWQgbWFpbigpIHtcbiAqICAgICAgIGludCBvdXRwdXRMb2MgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAqICAgICAgIHZlYzQgcmVzdWx0ID0gdmVjNCgwLik7XG4gKlxuICogICAgICAgaW50IHJjID0gb3V0cHV0TG9jO1xuICpcbiAqICAgICAgIGludCBzb3VyY2UgPSByYztcbiAqICAgICAgIGlmIChzb3VyY2UgPCBzdGFydCkge1xuICogICAgICAgICBzb3VyY2UgPSBzdGFydCAqIDIgLSBzb3VyY2UgLSAwO1xuICogICAgICAgfSBlbHNlIGlmIChzb3VyY2UgPj0gZW5kKSB7XG4gKiAgICAgICAgIHNvdXJjZSA9IChlbmQgLSAxKSAqIDIgLSBzb3VyY2UgKyAwO1xuICogICAgICAgfVxuICogICAgICAgc291cmNlIC09IHN0YXJ0O1xuICpcbiAqICAgICAgIHJlc3VsdFswXSA9IGdldENoYW5uZWwoZ2V0WChzb3VyY2UpLCBzb3VyY2UpO1xuICogICAgICAgcmMgKz0gMTtcbiAqICAgICAgIGlmKHJjIDwgNikge1xuICogICAgICAgICAgaW50IHNvdXJjZSA9IHJjO1xuICogICAgICAgICAgaWYgKHNvdXJjZSA8IHN0YXJ0KSB7XG4gKiAgICAgICAgICAgIHNvdXJjZSA9IHN0YXJ0ICogMiAtIHNvdXJjZSAtIDA7XG4gKiAgICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZSA+PSBlbmQpIHtcbiAqICAgICAgICAgICAgc291cmNlID0gKGVuZCAtIDEpICogMiAtIHNvdXJjZSArIDA7XG4gKiAgICAgICAgICB9XG4gKiAgICAgICAgICBzb3VyY2UgLT0gc3RhcnQ7XG4gKlxuICogICAgICAgICByZXN1bHRbMV0gPSBnZXRDaGFubmVsKGdldFgoc291cmNlKSwgc291cmNlKTtcbiAqICAgICAgIH1cbiAqXG4gKiAgICAgICBzZXRPdXRwdXQocmVzdWx0KTtcbiAqICAgICB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIE1pcnJvclBhZFBhY2tlZFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWyd4J107XG4gIHBhY2tlZElucHV0cyA9IHRydWU7XG4gIHBhY2tlZE91dHB1dCA9IHRydWU7XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHhTaGFwZTogbnVtYmVyW10sIHBhZGRpbmdzOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPixcbiAgICAgIG1vZGU6ICdyZWZsZWN0J3wnc3ltbWV0cmljJykge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBwYWRkaW5ncy5tYXAoXG4gICAgICAgIChwLCBpKSA9PiBwWzBdIC8qIGJlZm9yZVBhZCAqLyArIHhTaGFwZVtpXSArIHBbMV0gLyogYWZ0ZXJQYWQgKi8pO1xuICAgIGNvbnN0IHJhbmsgPSB4U2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IGR0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUocmFuayk7XG5cbiAgICBjb25zdCBzdGFydCA9IHBhZGRpbmdzLm1hcChwID0+IHBbMF0pLmpvaW4oJywnKTtcbiAgICBjb25zdCBlbmQgPSBwYWRkaW5ncy5tYXAoKHAsIGkpID0+IHBbMF0gKyB4U2hhcGVbaV0pLmpvaW4oJywnKTtcbiAgICBjb25zdCBjb29yZHMgPSBnZXRDaGFubmVscygncmMnLCByYW5rKTtcbiAgICBjb25zdCBzb3VyY2UgPSBnZXRDaGFubmVscygnc291cmNlJywgcmFuayk7XG4gICAgY29uc3QgY0xpbWl0ID0gYCR7Y29vcmRzW3JhbmsgLSAxXX0gPCAke3RoaXMub3V0cHV0U2hhcGVbcmFuayAtIDFdfWA7XG4gICAgY29uc3QgaW5uZXJEaW1zID1cbiAgICAgICAgcmFuayA9PT0gMSA/ICdzb3VyY2UnIDogYHZlYzIoJHtzb3VyY2Uuc2xpY2UoLTIpLmpvaW4oKX0pYDtcbiAgICBjb25zdCBvZmZzZXQgPSBtb2RlID09PSAncmVmbGVjdCcgPyAwIDogMTtcblxuICAgIGxldCBtYWluTG9vcCA9ICcnO1xuICAgIGlmIChyYW5rID09PSAxKSB7XG4gICAgICBjb25zdCBwYWRTZXR1cCA9IGBcbiAgICAgICAgJHtkdHlwZX0gc291cmNlID0gcmM7XG4gICAgICAgIGlmIChzb3VyY2UgPCBzdGFydCkge1xuICAgICAgICAgIHNvdXJjZSA9IHN0YXJ0ICogMiAtIHNvdXJjZSAtICR7b2Zmc2V0fTtcbiAgICAgICAgfSBlbHNlIGlmIChzb3VyY2UgPj0gZW5kKSB7XG4gICAgICAgICAgc291cmNlID0gKGVuZCAtIDEpICogMiAtIHNvdXJjZSArICR7b2Zmc2V0fTtcbiAgICAgICAgfVxuICAgICAgICBzb3VyY2UgLT0gc3RhcnQ7XG4gICAgICBgO1xuICAgICAgbWFpbkxvb3AgPSBgXG4gICAgICAgICR7ZHR5cGV9IHJjID0gb3V0cHV0TG9jO1xuICAgICAgICAke3BhZFNldHVwfVxuICAgICAgICByZXN1bHRbMF0gPSBnZXRDaGFubmVsKGdldFgoJHtzb3VyY2Uuam9pbigpfSksICR7aW5uZXJEaW1zfSk7XG4gICAgICAgICR7Y29vcmRzW3JhbmsgLSAxXX0gKz0gMTtcbiAgICAgICAgaWYoJHtjTGltaXR9KSB7XG4gICAgICAgICAgJHtwYWRTZXR1cH1cbiAgICAgICAgICByZXN1bHRbMV0gPSBnZXRDaGFubmVsKGdldFgoJHtzb3VyY2Uuam9pbigpfSksICR7aW5uZXJEaW1zfSk7XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHBhZFNldHVwID0gYFxuICAgICAgICAke2R0eXBlfSBzb3VyY2UgPSByYztcbiAgICAgICAgJHtkdHlwZX0gbHQgPSAke2R0eXBlfShsZXNzVGhhbihzb3VyY2UsIHN0YXJ0KSk7XG4gICAgICAgICR7ZHR5cGV9IGd0ZSA9ICR7ZHR5cGV9KGdyZWF0ZXJUaGFuRXF1YWwoc291cmNlLCBlbmQpKTtcbiAgICAgICAgJHtkdHlwZX0gb3JpZyA9IDEgLSAobHQgKyBndGUpO1xuICAgICAgICBzb3VyY2UgPSBvcmlnICogc291cmNlICtcbiAgICAgICAgICAgICAgICBsdCAqIChzdGFydCAqIDIgLSBzb3VyY2UgLSAke29mZnNldH0pICtcbiAgICAgICAgICAgICAgICBndGUgKiAoKGVuZCAtIDEpICogMiAtIHNvdXJjZSArICR7b2Zmc2V0fSk7XG4gICAgICAgIHNvdXJjZSAtPSBzdGFydDtcbiAgICAgIGA7XG5cbiAgICAgIG1haW5Mb29wID0gYFxuICAgICAgICAke2R0eXBlfSByYyA9IG91dHB1dExvYztcbiAgICAgICAgJHtwYWRTZXR1cH1cbiAgICAgICAgcmVzdWx0WzBdID0gZ2V0Q2hhbm5lbChnZXRYKCR7c291cmNlLmpvaW4oKX0pLCAke2lubmVyRGltc30pO1xuICAgICAgICAke2Nvb3Jkc1tyYW5rIC0gMV19ICs9IDE7XG4gICAgICAgIGlmKCR7Y0xpbWl0fSkge1xuICAgICAgICAgICR7cGFkU2V0dXB9XG4gICAgICAgICAgcmVzdWx0WzFdID0gZ2V0Q2hhbm5lbChnZXRYKCR7c291cmNlLmpvaW4oKX0pLCAke2lubmVyRGltc30pO1xuICAgICAgICB9XG4gICAgICAgIHJjID0gb3V0cHV0TG9jO1xuICAgICAgICAke2Nvb3Jkc1tyYW5rIC0gMl19ICs9IDE7XG4gICAgICAgIGlmKCR7Y29vcmRzW3JhbmsgLSAyXX0gPCAke3RoaXMub3V0cHV0U2hhcGVbcmFuayAtIDJdfSkge1xuICAgICAgICAgICR7cGFkU2V0dXB9XG4gICAgICAgICAgcmVzdWx0WzJdID0gZ2V0Q2hhbm5lbChnZXRYKCR7c291cmNlLmpvaW4oKX0pLCAke2lubmVyRGltc30pO1xuICAgICAgICAgICR7Y29vcmRzW3JhbmsgLSAxXX0gKz0gMTtcbiAgICAgICAgICBpZigke2NMaW1pdH0pIHtcbiAgICAgICAgICAgICR7cGFkU2V0dXB9XG4gICAgICAgICAgICByZXN1bHRbM10gPSBnZXRDaGFubmVsKGdldFgoJHtzb3VyY2Uuam9pbigpfSksICR7aW5uZXJEaW1zfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBgO1xuICAgIH1cblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCAke2R0eXBlfSBzdGFydCA9ICR7ZHR5cGV9KCR7c3RhcnR9KTtcbiAgICAgIGNvbnN0ICR7ZHR5cGV9IGVuZCA9ICR7ZHR5cGV9KCR7ZW5kfSk7XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgJHtkdHlwZX0gb3V0cHV0TG9jID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIHZlYzQgcmVzdWx0ID0gdmVjNCgwLik7XG4gICAgICAgICR7bWFpbkxvb3B9XG4gICAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW0sIHVzZVNoYXBlVW5pZm9ybXN9IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBNYXRNdWxQYWNrZWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnbWF0cml4QScsICdtYXRyaXhCJ107XG4gIHBhY2tlZElucHV0cyA9IHRydWU7XG4gIHBhY2tlZE91dHB1dCA9IHRydWU7XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIGFTaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdLCBiU2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgIG91dHB1dFNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIHRyYW5zcG9zZUEgPSBmYWxzZSxcbiAgICAgIHRyYW5zcG9zZUIgPSBmYWxzZSwgYWRkQmlhcyA9IGZhbHNlLCBhY3RpdmF0aW9uOiBzdHJpbmcgPSBudWxsLFxuICAgICAgaGFzUHJlbHVBY3RpdmF0aW9uID0gZmFsc2UsIGhhc0xlYWt5cmVsdUFjdGl2YXRpb24gPSBmYWxzZSkge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICB0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMgPSB1c2VTaGFwZVVuaWZvcm1zKHRoaXMub3V0cHV0U2hhcGUubGVuZ3RoKTtcblxuICAgIGNvbnN0IHNoYXJlZERpbSA9IHRyYW5zcG9zZUEgPyBhU2hhcGVbMV0gOiBhU2hhcGVbMl07XG4gICAgY29uc3Qgc2hhcmVkRGltZW5zaW9uUGFja2VkID0gTWF0aC5jZWlsKHNoYXJlZERpbSAvIDIpO1xuXG4gICAgY29uc3QgYVNhbXBsZSA9IHRyYW5zcG9zZUEgPyAnaSAqIDIsIHJjLnknIDogJ3JjLnksIGkgKiAyJztcbiAgICBjb25zdCBiU2FtcGxlID0gdHJhbnNwb3NlQiA/ICdyYy56LCBpICogMicgOiAnaSAqIDIsIHJjLnonO1xuICAgIGNvbnN0IGFTd2l6emxlID0gdHJhbnNwb3NlQSA/IFsnYS54eHl5JywgJ2Euenp3dyddIDogWydhLnh4enonLCAnYS55eXd3J107XG4gICAgY29uc3QgYlN3aXp6bGUgPSB0cmFuc3Bvc2VCID8gWydiLnh6eHonLCAnYi55d3l3J10gOiBbJ2IueHl4eScsICdiLnp3encnXTtcblxuICAgIGxldCBhY3RpdmF0aW9uU25pcHBldCA9ICcnLCBhcHBseUFjdGl2YXRpb25TbmlwcGV0ID0gJyc7XG4gICAgaWYgKGFjdGl2YXRpb24pIHtcbiAgICAgIGlmIChoYXNQcmVsdUFjdGl2YXRpb24pIHtcbiAgICAgICAgYWN0aXZhdGlvblNuaXBwZXQgPSBgdmVjNCBhY3RpdmF0aW9uKHZlYzQgYSkge1xuICAgICAgICAgIHZlYzQgYiA9IGdldFByZWx1QWN0aXZhdGlvbldlaWdodHNBdE91dENvb3JkcygpO1xuICAgICAgICAgICR7YWN0aXZhdGlvbn1cbiAgICAgICAgfWA7XG4gICAgICB9IGVsc2UgaWYgKGhhc0xlYWt5cmVsdUFjdGl2YXRpb24pIHtcbiAgICAgICAgYWN0aXZhdGlvblNuaXBwZXQgPSBgdmVjNCBhY3RpdmF0aW9uKHZlYzQgYSkge1xuICAgICAgICAgIHZlYzQgYiA9IGdldExlYWt5cmVsdUFscGhhQXRPdXRDb29yZHMoKTtcbiAgICAgICAgICAke2FjdGl2YXRpb259XG4gICAgICAgIH1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWN0aXZhdGlvblNuaXBwZXQgPSBgdmVjNCBhY3RpdmF0aW9uKHZlYzQgeCkge1xuICAgICAgICAgICR7YWN0aXZhdGlvbn1cbiAgICAgICAgfWA7XG4gICAgICB9XG5cbiAgICAgIGFwcGx5QWN0aXZhdGlvblNuaXBwZXQgPSBgcmVzdWx0ID0gYWN0aXZhdGlvbihyZXN1bHQpO2A7XG4gICAgfVxuXG4gICAgY29uc3QgYWRkQmlhc1NuaXBwZXQgPSBhZGRCaWFzID8gJ3Jlc3VsdCArPSBnZXRCaWFzQXRPdXRDb29yZHMoKTsnIDogJyc7XG4gICAgaWYgKGFkZEJpYXMpIHtcbiAgICAgIHRoaXMudmFyaWFibGVOYW1lcy5wdXNoKCdiaWFzJyk7XG4gICAgfVxuXG4gICAgaWYgKGhhc1ByZWx1QWN0aXZhdGlvbikge1xuICAgICAgdGhpcy52YXJpYWJsZU5hbWVzLnB1c2goJ3ByZWx1QWN0aXZhdGlvbldlaWdodHMnKTtcbiAgICB9XG5cbiAgICBpZiAoaGFzTGVha3lyZWx1QWN0aXZhdGlvbikge1xuICAgICAgdGhpcy52YXJpYWJsZU5hbWVzLnB1c2goJ2xlYWt5cmVsdUFscGhhJyk7XG4gICAgfVxuXG4gICAgbGV0IGJhdGNoQVNuaXBwZXQgPSAncmMueCc7XG4gICAgbGV0IGJhdGNoQlNuaXBwZXQgPSAncmMueCc7XG4gICAgaWYgKGFTaGFwZVswXSA8IGJTaGFwZVswXSkge1xuICAgICAgYmF0Y2hBU25pcHBldCA9IGBpbnQobWluKGZsb2F0KHJjLngpLCAke2FTaGFwZVswXSAtIDF9LikpYDtcbiAgICB9IGVsc2UgaWYgKGJTaGFwZVswXSA8IGFTaGFwZVswXSkge1xuICAgICAgYmF0Y2hCU25pcHBldCA9IGBpbnQobWluKGZsb2F0KHJjLngpLCAke2JTaGFwZVswXSAtIDF9LikpYDtcbiAgICB9XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgJHthY3RpdmF0aW9uU25pcHBldH1cbiAgICAgIC8vIERvbid0IHVzZSB1bmlmb3JtIGZvciBzaGFyZWREaW1lbnNpb25QYWNrZWQgZm9yIHBlcmZvcm1hbmNlLlxuICAgICAgY29uc3QgZmxvYXQgc2hhcmVkRGltZW5zaW9uID0gJHtzaGFyZWREaW1lbnNpb25QYWNrZWR9LjA7XG5cbiAgICAgIHZlYzQgZG90MngyQVJvd0JDb2woaXZlYzMgcmMpIHtcbiAgICAgICAgdmVjNCByZXN1bHQgPSB2ZWM0KDApO1xuICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8ICR7c2hhcmVkRGltZW5zaW9uUGFja2VkfTsgaSsrKSB7XG4gICAgICAgICAgaW50IGJhdGNoQSA9ICR7YmF0Y2hBU25pcHBldH07XG4gICAgICAgICAgaW50IGJhdGNoQiA9ICR7YmF0Y2hCU25pcHBldH07XG4gICAgICAgICAgdmVjNCBhID0gZ2V0TWF0cml4QShiYXRjaEEsICR7YVNhbXBsZX0pO1xuICAgICAgICAgIHZlYzQgYiA9IGdldE1hdHJpeEIoYmF0Y2hCLCAke2JTYW1wbGV9KTtcblxuICAgICAgICAgIC8vIFRoZXNlIHN3aXp6bGVkIHByb2R1Y3RzIG5lZWQgdG8gYmUgc2VwYXJhdGVseSBhZGRlZC5cbiAgICAgICAgICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RmanMvaXNzdWVzLzE3MzVcbiAgICAgICAgICByZXN1bHQgKz0gKCR7YVN3aXp6bGVbMF19ICogJHtiU3dpenpsZVswXX0pO1xuICAgICAgICAgIHJlc3VsdCArPSAoJHthU3dpenpsZVsxXX0gKiAke2JTd2l6emxlWzFdfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMyByYyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICB2ZWM0IHJlc3VsdCA9IGRvdDJ4MkFSb3dCQ29sKHJjKTtcblxuICAgICAgICAke2FkZEJpYXNTbmlwcGV0fVxuXG4gICAgICAgICR7YXBwbHlBY3RpdmF0aW9uU25pcHBldH1cblxuICAgICAgICBzZXRPdXRwdXQocmVzdWx0KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtVbmlmb3JtVHlwZX0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuXG5leHBvcnQgY2xhc3MgTXVsdGlub21pYWxQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsncHJvYnMnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBjdXN0b21Vbmlmb3JtcyA9IFt7bmFtZTogJ3NlZWQnLCB0eXBlOiAnZmxvYXQnIGFzIFVuaWZvcm1UeXBlfV07XG5cbiAgY29uc3RydWN0b3IoYmF0Y2hTaXplOiBudW1iZXIsIG51bU91dGNvbWVzOiBudW1iZXIsIG51bVNhbXBsZXM6IG51bWJlcikge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBbYmF0Y2hTaXplLCBudW1TYW1wbGVzXTtcblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWMyIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHNbMF07XG5cbiAgICAgICAgZmxvYXQgciA9IHJhbmRvbShzZWVkKTtcbiAgICAgICAgZmxvYXQgY2RmID0gMC4wO1xuXG4gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgJHtudW1PdXRjb21lcyAtIDF9OyBpKyspIHtcbiAgICAgICAgICBjZGYgKz0gZ2V0UHJvYnMoYmF0Y2gsIGkpO1xuXG4gICAgICAgICAgaWYgKHIgPCBjZGYpIHtcbiAgICAgICAgICAgIHNldE91dHB1dChmbG9hdChpKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgbm8gb3RoZXIgZXZlbnQgaGFwcGVuZWQsIGxhc3QgZXZlbnQgaGFwcGVuZWQuXG4gICAgICAgIHNldE91dHB1dChmbG9hdCgke251bU91dGNvbWVzIC0gMX0pKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgT25lSG90UHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ2luZGljZXMnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIC8vIENhY2hpbmcgdW5pZm9ybSBsb2NhdGlvbiBmb3Igc3BlZWQuXG4gIHNlZWRMb2M6IFdlYkdMVW5pZm9ybUxvY2F0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgbnVtSW5kaWNlczogbnVtYmVyLCBkZXB0aDogbnVtYmVyLCBvblZhbHVlOiBudW1iZXIsIG9mZlZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gW251bUluZGljZXMsIGRlcHRoXTtcblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWMyIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgaW5kZXggPSByb3VuZChnZXRJbmRpY2VzKGNvb3Jkcy54KSk7XG4gICAgICAgIHNldE91dHB1dChtaXgoZmxvYXQoJHtvZmZWYWx1ZX0pLCBmbG9hdCgke29uVmFsdWV9KSxcbiAgICAgICAgICAgICAgICAgICAgICBmbG9hdChpbmRleCA9PSBjb29yZHMueSkpKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtnZXRDaGFubmVsc30gZnJvbSAnLi9wYWNraW5nX3V0aWwnO1xuaW1wb3J0IHtnZXRDb29yZHNEYXRhVHlwZX0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuXG5leHBvcnQgY2xhc3MgUGFja1Byb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydBJ107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgcGFja2VkSW5wdXRzID0gZmFsc2U7XG4gIHBhY2tlZE91dHB1dCA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBvdXRwdXRTaGFwZTpcbiAgICAgICAgICBudW1iZXJbXSkgeyAgLy8gVE9ETyhodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZmpzL2lzc3Vlcy84OTMpOlxuICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGlucHV0IC8gb3V0cHV0IDNEIHRlbnNvcnMuXG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IG91dHB1dFNoYXBlO1xuICAgIGNvbnN0IHJhbmsgPSBvdXRwdXRTaGFwZS5sZW5ndGg7XG5cbiAgICBpZiAocmFuayA9PT0gMCkge1xuICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgIHNldE91dHB1dCh2ZWM0KGdldEEoKSwgMC4sIDAuLCAwLikpO1xuICAgICAgICB9XG4gICAgICBgO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjaGFubmVscyA9IGdldENoYW5uZWxzKCdyYycsIHJhbmspO1xuICAgICAgY29uc3QgZHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShyYW5rKTtcbiAgICAgIGNvbnN0IG91dE9mQm91bmRzQ29uZGl0aW9uID1cbiAgICAgICAgICBnZXRPdXRPZkJvdW5kc0NvbmRpdGlvbihyYW5rLCBvdXRwdXRTaGFwZSwgY2hhbm5lbHMpO1xuICAgICAgY29uc3Qgc2V0dXAgPSBnZXRTZXR1cChcbiAgICAgICAgICByYW5rLCBvdXRwdXRTaGFwZVtvdXRwdXRTaGFwZS5sZW5ndGggLSAxXSxcbiAgICAgICAgICBvdXRwdXRTaGFwZVtvdXRwdXRTaGFwZS5sZW5ndGggLSAyXSwgY2hhbm5lbHMpO1xuICAgICAgY29uc3Qgb3V0cHV0ID0gZ2V0T3V0cHV0KG91dHB1dFNoYXBlLCBjaGFubmVscyk7XG5cbiAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgICAke2R0eXBlfSByYyA9IGdldE91dHB1dENvb3JkcygpO1xuXG4gICAgICAgICAgaWYoJHtvdXRPZkJvdW5kc0NvbmRpdGlvbn0pIHtcbiAgICAgICAgICAgIHNldE91dHB1dCh2ZWM0KDApKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJHtzZXR1cH1cblxuICAgICAgICAgICAgc2V0T3V0cHV0KHZlYzQoJHtvdXRwdXR9KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBgO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRTb3VyY2VDb29yZHNBcnIocmFuazogbnVtYmVyLCBkaW1zOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgY29vcmRzID0gW107XG5cbiAgZm9yIChsZXQgcm93ID0gMDsgcm93IDw9IDE7IHJvdysrKSB7XG4gICAgZm9yIChsZXQgY29sID0gMDsgY29sIDw9IDE7IGNvbCsrKSB7XG4gICAgICBsZXQgY29vcmQgPSBgJHtyb3cgPT09IDAgPyAncicgOiAncnAxJ30sICR7Y29sID09PSAwID8gJ2MnIDogJ2NwMSd9YDtcblxuICAgICAgZm9yIChsZXQgZCA9IDI7IGQgPCByYW5rOyBkKyspIHtcbiAgICAgICAgY29vcmQgPSBgJHtkaW1zW2RpbXMubGVuZ3RoIC0gMSAtIGRdfSxgICsgY29vcmQ7XG4gICAgICB9XG5cbiAgICAgIGNvb3Jkcy5wdXNoKGNvb3JkKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvb3Jkcztcbn1cblxuZnVuY3Rpb24gZ2V0T3V0T2ZCb3VuZHNDb25kaXRpb24oXG4gICAgcmFuazogbnVtYmVyLCBzaGFwZTogbnVtYmVyW10sIGRpbXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgaWYgKHJhbmsgPT09IDEpIHtcbiAgICByZXR1cm4gYHJjID4gJHtzaGFwZVswXX1gO1xuICB9XG5cbiAgbGV0IGNvbmQgPSAnJztcbiAgZm9yIChsZXQgaSA9IHJhbmsgLSAyOyBpIDwgcmFuazsgaSsrKSB7XG4gICAgY29uZCArPSBgJHtkaW1zW2ldfSA+PSAke3NoYXBlW2ldfWA7XG4gICAgaWYgKGkgPCByYW5rIC0gMSkge1xuICAgICAgY29uZCArPSAnfHwnO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb25kO1xufVxuXG5mdW5jdGlvbiBnZXRTZXR1cChcbiAgICByYW5rOiBudW1iZXIsIGNvbHM6IG51bWJlciwgcm93czogbnVtYmVyLCBkaW1zOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGlmIChyYW5rID09PSAxKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgY29uc3QgaW5uZXJEaW1zID0gZGltcy5zbGljZSgtMik7XG5cbiAgcmV0dXJuIGBcbiAgICBpbnQgciA9ICR7aW5uZXJEaW1zWzBdfTtcbiAgICBpbnQgYyA9ICR7aW5uZXJEaW1zWzFdfTtcbiAgICBpbnQgcnAxID0gciArIDE7XG4gICAgaW50IGNwMSA9IGMgKyAxO1xuXG4gICAgYm9vbCBjRWRnZSA9IGNwMSA+PSAke2NvbHN9O1xuICAgIGJvb2wgckVkZ2UgPSBycDEgPj0gJHtyb3dzfTtcbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0T3V0cHV0KHNoYXBlOiBudW1iZXJbXSwgZGltczogc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCByYW5rID0gc2hhcGUubGVuZ3RoO1xuICBjb25zdCBzb3VyY2VDb29yZHMgPSBnZXRTb3VyY2VDb29yZHNBcnIocmFuaywgZGltcyk7XG4gIGlmIChyYW5rID09PSAxKSB7XG4gICAgcmV0dXJuIGBnZXRBKHJjKSxcbiAgICAgICAgICAgIHJjICsgMSA+PSAke3NoYXBlWzBdfSA/IDAuIDogZ2V0QShyYyArIDEpLFxuICAgICAgICAgICAgMCwgMGA7XG4gIH1cblxuICByZXR1cm4gYGdldEEoJHtzb3VyY2VDb29yZHNbMF19KSxcbiAgICAgICAgICBjRWRnZSA/IDAuIDogZ2V0QSgke3NvdXJjZUNvb3Jkc1sxXX0pLFxuICAgICAgICAgIHJFZGdlID8gMC4gOiBnZXRBKCR7c291cmNlQ29vcmRzWzJdfSksXG4gICAgICAgICAgckVkZ2UgfHwgY0VkZ2UgPyAwLiA6IGdldEEoJHtzb3VyY2VDb29yZHNbM119KWA7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRWZWNDaGFubmVscyhuYW1lOiBzdHJpbmcsIHJhbms6IG51bWJlcik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFsneCcsICd5JywgJ3onLCAndycsICd1JywgJ3YnXS5zbGljZSgwLCByYW5rKS5tYXAoZCA9PiBgJHtuYW1lfS4ke2R9YCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDaGFubmVscyhuYW1lOiBzdHJpbmcsIHJhbms6IG51bWJlcik6IHN0cmluZ1tdIHtcbiAgaWYgKHJhbmsgPT09IDEpIHtcbiAgICByZXR1cm4gW25hbWVdO1xuICB9XG4gIHJldHVybiBnZXRWZWNDaGFubmVscyhuYW1lLCByYW5rKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNvdXJjZUNvb3JkcyhyYW5rOiBudW1iZXIsIGRpbXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgaWYgKHJhbmsgPT09IDEpIHtcbiAgICByZXR1cm4gJ3JjJztcbiAgfVxuXG4gIGxldCBjb29yZHMgPSAnJztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5rOyBpKyspIHtcbiAgICBjb29yZHMgKz0gZGltc1tpXTtcbiAgICBpZiAoaSA8IHJhbmsgLSAxKSB7XG4gICAgICBjb29yZHMgKz0gJywnO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY29vcmRzO1xufSIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5pbXBvcnQge2dldENvb3Jkc0RhdGFUeXBlLCBVbmlmb3JtVHlwZX0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuXG5leHBvcnQgY2xhc3MgUGFkUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBjdXN0b21Vbmlmb3JtcyA9IFt7bmFtZTogJ3ZhbHVlJywgdHlwZTogJ2Zsb2F0JyBhcyBVbmlmb3JtVHlwZX1dO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgeFNoYXBlOiBudW1iZXJbXSwgcGFkZGluZ3M6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+LFxuICAgICAgY29uc3RhbnRWYWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IHBhZGRpbmdzLm1hcChcbiAgICAgICAgKHAsIGkpID0+IHBbMF0gLyogYmVmb3JlUGFkICovICsgeFNoYXBlW2ldICsgcFsxXSAvKiBhZnRlclBhZCAqLyk7XG4gICAgY29uc3QgcmFuayA9IHhTaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHJhbmspO1xuXG4gICAgY29uc3Qgc3RhcnQgPSBwYWRkaW5ncy5tYXAocCA9PiBwWzBdKS5qb2luKCcsJyk7XG4gICAgY29uc3QgZW5kID0gcGFkZGluZ3MubWFwKChwLCBpKSA9PiBwWzBdICsgeFNoYXBlW2ldKS5qb2luKCcsJyk7XG4gICAgY29uc3QgdW5wYWNrZWRDb29yZHMgPVxuICAgICAgICBbJ2Nvb3Jkc1swXScsICdjb29yZHNbMV0nLCAnY29vcmRzWzJdJywgJ2Nvb3Jkc1szXSddLnNsaWNlKDAsIHJhbmspO1xuXG4gICAgaWYgKHJhbmsgPT09IDEpIHtcbiAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAgIGludCBzdGFydCA9ICR7c3RhcnR9O1xuICAgICAgICBpbnQgZW5kID0gJHtlbmR9O1xuXG4gICAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgICBpbnQgb3V0QyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgIGlmIChvdXRDIDwgc3RhcnQgfHwgb3V0QyA+PSBlbmQpIHtcbiAgICAgICAgICAgIHNldE91dHB1dCh2YWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNldE91dHB1dChnZXRYKG91dEMgLSBzdGFydCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgYDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICR7dHlwZX0gc3RhcnQgPSAke3R5cGV9KCR7c3RhcnR9KTtcbiAgICAgICR7dHlwZX0gZW5kID0gJHt0eXBlfSgke2VuZH0pO1xuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICR7dHlwZX0gb3V0QyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpZiAoYW55KGxlc3NUaGFuKG91dEMsIHN0YXJ0KSkgfHwgYW55KGdyZWF0ZXJUaGFuRXF1YWwob3V0QywgZW5kKSkpIHtcbiAgICAgICAgICBzZXRPdXRwdXQodmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICR7dHlwZX0gY29vcmRzID0gb3V0QyAtIHN0YXJ0O1xuICAgICAgICAgIHNldE91dHB1dChnZXRYKCR7dW5wYWNrZWRDb29yZHN9KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtnZXRDaGFubmVsc30gZnJvbSAnLi9wYWNraW5nX3V0aWwnO1xuaW1wb3J0IHtnZXRDb29yZHNEYXRhVHlwZSwgVW5pZm9ybVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuZXhwb3J0IGNsYXNzIFBhZFBhY2tlZFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWyd4J107XG4gIHBhY2tlZElucHV0cyA9IHRydWU7XG4gIHBhY2tlZE91dHB1dCA9IHRydWU7XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgY3VzdG9tVW5pZm9ybXMgPSBbe25hbWU6ICd2YWx1ZScsIHR5cGU6ICdmbG9hdCcgYXMgVW5pZm9ybVR5cGV9XTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHhTaGFwZTogbnVtYmVyW10sIHBhZGRpbmdzOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPixcbiAgICAgIGNvbnN0YW50VmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBwYWRkaW5ncy5tYXAoXG4gICAgICAgIChwLCBpKSA9PiBwWzBdIC8qIGJlZm9yZVBhZCAqLyArIHhTaGFwZVtpXSArIHBbMV0gLyogYWZ0ZXJQYWQgKi8pO1xuICAgIGNvbnN0IHJhbmsgPSB4U2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IGR0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUocmFuayk7XG5cbiAgICBjb25zdCBzdGFydCA9IHBhZGRpbmdzLm1hcChwID0+IHBbMF0pLmpvaW4oJywnKTtcbiAgICBjb25zdCBlbmQgPSBwYWRkaW5ncy5tYXAoKHAsIGkpID0+IHBbMF0gKyB4U2hhcGVbaV0pLmpvaW4oJywnKTtcbiAgICBjb25zdCBjb29yZHMgPSBnZXRDaGFubmVscygncmMnLCByYW5rKTtcbiAgICBjb25zdCBzb3VyY2UgPSBnZXRDaGFubmVscygnc291cmNlJywgcmFuayk7XG4gICAgY29uc3QgY0xpbWl0ID0gYCR7Y29vcmRzW3JhbmsgLSAxXX0gPCAke3RoaXMub3V0cHV0U2hhcGVbcmFuayAtIDFdfWA7XG4gICAgY29uc3QgaW5uZXJEaW1zID1cbiAgICAgICAgcmFuayA9PT0gMSA/ICdzb3VyY2UnIDogYHZlYzIoJHtzb3VyY2Uuc2xpY2UoLTIpLmpvaW4oKX0pYDtcblxuICAgIGNvbnN0IGNvbXBvbmVudFNldHVwID0gW1xuICAgICAgYCR7ZHR5cGV9IHJjID0gb3V0cHV0TG9jO2AsIGAke2Nvb3Jkc1tyYW5rIC0gMV19ICs9IDE7XG4gICAgICAgaWYoJHtjTGltaXR9KSB7XG4gICAgICBgLFxuICAgICAgcmFuayA9PT0gMSA/ICcnIDogYH1cbiAgICAgICByYyA9IG91dHB1dExvYztcbiAgICAgICAke2Nvb3Jkc1tyYW5rIC0gMl19ICs9IDE7XG4gICAgICAgaWYoJHtjb29yZHNbcmFuayAtIDJdfSA8ICR7dGhpcy5vdXRwdXRTaGFwZVtyYW5rIC0gMl19KSB7YCxcbiAgICAgIHJhbmsgPT09IDEgPyAnJyA6IGAgICR7Y29vcmRzW3JhbmsgLSAxXX0gKz0gMTtcbiAgICAgICAgIGlmKCR7Y0xpbWl0fSkge2BcbiAgICBdO1xuXG4gICAgY29uc3QgcGFkZGluZ0FyZWEgPSByYW5rID09PSAxID9cbiAgICAgICAgJ3JjIDwgc3RhcnQgfHwgcmMgPj0gZW5kJyA6XG4gICAgICAgICdhbnkobGVzc1RoYW4ocmMsIHN0YXJ0KSkgfHwgYW55KGdyZWF0ZXJUaGFuRXF1YWwocmMsIGVuZCkpJztcbiAgICBsZXQgbWFpbkxvb3AgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMCwgaiA9IHJhbmsgPT09IDEgPyAyIDogNDsgaSA8IGo7IGkrKykge1xuICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAke2NvbXBvbmVudFNldHVwW2ldfVxuICAgICAgICBpZiAoJHtwYWRkaW5nQXJlYX0pIHtcbiAgICAgICAgICByZXN1bHRbJHtpfV0gPSBmbG9hdCh2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgJHtkdHlwZX0gc291cmNlID0gcmMgLSBzdGFydDtcbiAgICAgICAgICByZXN1bHRbJHtpfV0gPSBnZXRDaGFubmVsKGdldFgoJHtzb3VyY2Uuam9pbigpfSksICR7aW5uZXJEaW1zfSk7XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgfVxuICAgIG1haW5Mb29wICs9IChyYW5rID09PSAxID8gYH0gYCA6IGB9fWApO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0ICR7ZHR5cGV9IHN0YXJ0ID0gJHtkdHlwZX0oJHtzdGFydH0pO1xuICAgICAgY29uc3QgJHtkdHlwZX0gZW5kID0gJHtkdHlwZX0oJHtlbmR9KTtcblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke2R0eXBlfSBvdXRwdXRMb2MgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgdmVjNCByZXN1bHQgPSB2ZWM0KDAuKTtcbiAgICAgICAgJHttYWluTG9vcH1cbiAgICAgICAgc2V0T3V0cHV0KHJlc3VsdCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgUG9vbDJEUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgY29udkluZm86IGJhY2tlbmRfdXRpbC5Db252MkRJbmZvLCBwb29sVHlwZTogJ21heCd8J2F2ZycsXG4gICAgICBjb21wdXRlUG9zaXRpb25zOiBib29sZWFuLCBmbGF0dGVuUG9zaXRpb25zID0gZmFsc2UsXG4gICAgICBpbmNsdWRlQmF0Y2hJbkluZGV4ID0gZmFsc2UpIHtcbiAgICBpZiAocG9vbFR5cGUgPT09ICdhdmcnICYmIGNvbXB1dGVQb3NpdGlvbnMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNvbXB1dGUgcG9zaXRpb25zIGZvciBhdmVyYWdlIHBvb2wuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsdGVyV2lkdGggPSBjb252SW5mby5maWx0ZXJXaWR0aDtcbiAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICAgIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckhlaWdodDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoO1xuXG4gICAgY29uc3QgcGFkVG9wID0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgcGFkTGVmdCA9IGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gY29udkluZm8ub3V0U2hhcGU7XG5cbiAgICBjb25zdCBpc0F2Z1Bvb2wgPSBwb29sVHlwZSA9PT0gJ2F2Zyc7XG4gICAgY29uc3QgYmF0Y2hGbGF0dGVuUG9zaXRpb25TdHIgPSBgKChiYXRjaCAgKiAke2NvbnZJbmZvLmluSGVpZ2h0fSArIHhSKSAqICR7XG4gICAgICAgIGNvbnZJbmZvLmluV2lkdGh9ICsgeEMpICogJHtjb252SW5mby5pbkNoYW5uZWxzfSArIGRgO1xuICAgIGNvbnN0IGZsYXR0ZW5Qb3NpdGlvblN0ciA9XG4gICAgICAgIGAoeFIgKiAke2NvbnZJbmZvLmluV2lkdGh9ICsgeEMpICogJHtjb252SW5mby5pbkNoYW5uZWxzfSArIGRgO1xuXG4gICAgbGV0IGluaXRpYWxpemF0aW9uVmFsdWUgPSAnMC4wJztcbiAgICBpZiAoIWlzQXZnUG9vbCkge1xuICAgICAgLy8gV2ViR0wgb24gRmlyZWZveCBMaW51eCBjYW4ndCBjb21waWxlIDEvMCBzbyB3ZSBkbyAxL2Vwcy5cbiAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUgPSAnLTEuMCAvIDFlLTIwJztcbiAgICB9XG5cbiAgICBpZiAoY29tcHV0ZVBvc2l0aW9ucykge1xuICAgICAgY29uc3QgY29tcGFyZU9wID0gJz49JztcblxuICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICAgY29uc3QgaXZlYzIgc3RyaWRlcyA9IGl2ZWMyKCR7c3RyaWRlSGVpZ2h0fSwgJHtzdHJpZGVXaWR0aH0pO1xuICAgICAgICBjb25zdCBpdmVjMiBwYWRzID0gaXZlYzIoJHtwYWRUb3B9LCAke3BhZExlZnR9KTtcblxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgICAgaW50IGJhdGNoID0gY29vcmRzWzBdO1xuICAgICAgICAgIGludCBkID0gY29vcmRzWzNdO1xuXG4gICAgICAgICAgaXZlYzIgeFJDQ29ybmVyID0gY29vcmRzLnl6ICogc3RyaWRlcyAtIHBhZHM7XG4gICAgICAgICAgaW50IHhSQ29ybmVyID0geFJDQ29ybmVyLng7XG4gICAgICAgICAgaW50IHhDQ29ybmVyID0geFJDQ29ybmVyLnk7XG5cbiAgICAgICAgICAvLyBtYXgvbWluIHgoPywgPywgZCkgdG8gZ2V0IHkoeVIsIHlDLCBkKS5cbiAgICAgICAgICAvLyA/ID0gdG8gYmUgZGV0ZXJtaW5lZFxuICAgICAgICAgIGZsb2F0IG1pbk1heFZhbHVlID0gMC4wO1xuICAgICAgICAgIGZsb2F0IG1pbk1heFZhbHVlRm91bmQgPSAwLjA7XG4gICAgICAgICAgaW50IG1pbk1heFBvc2l0aW9uID0gMDtcbiAgICAgICAgICBmbG9hdCBhdmdWYWx1ZSA9IDAuMDtcblxuICAgICAgICAgIGZvciAoaW50IHdSID0gMDsgd1IgPCAke2VmZmVjdGl2ZUZpbHRlckhlaWdodH07XG4gICAgICAgICAgICAgIHdSICs9ICR7ZGlsYXRpb25IZWlnaHR9KSB7XG4gICAgICAgICAgICBpbnQgeFIgPSB4UkNvcm5lciArIHdSO1xuXG4gICAgICAgICAgICBpZiAoeFIgPCAwIHx8IHhSID49ICR7Y29udkluZm8uaW5IZWlnaHR9KSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGludCB3QyA9IDA7IHdDIDwgJHtlZmZlY3RpdmVGaWx0ZXJXaWR0aH07XG4gICAgICAgICAgICAgICAgd0MgKz0gJHtkaWxhdGlvbldpZHRofSkge1xuICAgICAgICAgICAgICBpbnQgeEMgPSB4Q0Nvcm5lciArIHdDO1xuXG4gICAgICAgICAgICAgIGlmICh4QyA8IDAgfHwgeEMgPj0gJHtjb252SW5mby5pbldpZHRofSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZmxvYXQgdmFsdWUgPSBnZXRYKGJhdGNoLCB4UiwgeEMsIGQpO1xuXG4gICAgICAgICAgICAgIC8vIElmIGEgbWluIC8gbWF4IHZhbHVlIGhhcyBhbHJlYWR5IGJlZW4gZm91bmQsIHVzZSBpdC4gSWYgbm90LFxuICAgICAgICAgICAgICAvLyB1c2UgdGhlIGN1cnJlbnQgdmFsdWUuXG4gICAgICAgICAgICAgIGZsb2F0IGN1cnJNaW5NYXhWYWx1ZSA9IG1peChcbiAgICAgICAgICAgICAgICAgIHZhbHVlLCBtaW5NYXhWYWx1ZSwgbWluTWF4VmFsdWVGb3VuZCk7XG4gICAgICAgICAgICAgIGlmICh2YWx1ZSAke2NvbXBhcmVPcH0gY3Vyck1pbk1heFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgbWluTWF4VmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICBtaW5NYXhWYWx1ZUZvdW5kID0gMS4wO1xuICAgICAgICAgICAgICAgIG1pbk1heFBvc2l0aW9uID0gJHtcbiAgICAgICAgICBmbGF0dGVuUG9zaXRpb25zID8gKGluY2x1ZGVCYXRjaEluSW5kZXggPyBiYXRjaEZsYXR0ZW5Qb3NpdGlvblN0ciA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhdHRlblBvc2l0aW9uU3RyKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGB3UiAqICR7ZWZmZWN0aXZlRmlsdGVyV2lkdGh9ICsgd0NgfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBzZXRPdXRwdXQoZmxvYXQobWluTWF4UG9zaXRpb24pKTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wYXJlT3AgPSAnbWF4JztcblxuICAgIGxldCByZXR1cm5WYWx1ZSA9IGAke3Bvb2xUeXBlfSgke3Bvb2xUeXBlfSgke3Bvb2xUeXBlfShgICtcbiAgICAgICAgJ21pbk1heFZhbHVlWzBdLCBtaW5NYXhWYWx1ZVsxXSksIG1pbk1heFZhbHVlWzJdKSwgbWluTWF4VmFsdWVbM10pJztcbiAgICBpZiAocG9vbFR5cGUgPT09ICdhdmcnKSB7XG4gICAgICByZXR1cm5WYWx1ZSA9IGBhdmdWYWx1ZSAvIGNvdW50YDtcbiAgICB9XG5cbiAgICBjb25zdCBmaWx0ZXJXaWR0aE5lYXJlc3RWZWM0ID0gTWF0aC5mbG9vcihmaWx0ZXJXaWR0aCAvIDQpICogNDtcbiAgICBjb25zdCBmaWx0ZXJXaWR0aFZlYzRSZW1haW5kZXIgPSBmaWx0ZXJXaWR0aCAlIDQ7XG5cbiAgICBjb25zdCB1cGRhdGVTbmlwcGV0ID0gYFxuICAgICAgaWYgKCR7aXNBdmdQb29sfSkge1xuICAgICAgICBhdmdWYWx1ZSArPSBkb3QodmFsdWVzLCBvbmVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1pbk1heFZhbHVlID0gJHtjb21wYXJlT3B9KHZhbHVlcywgbWluTWF4VmFsdWUpO1xuICAgICAgfVxuICAgIGA7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgY29uc3QgaXZlYzIgc3RyaWRlcyA9IGl2ZWMyKCR7c3RyaWRlSGVpZ2h0fSwgJHtzdHJpZGVXaWR0aH0pO1xuICAgICAgY29uc3QgaXZlYzIgcGFkcyA9IGl2ZWMyKCR7cGFkVG9wfSwgJHtwYWRMZWZ0fSk7XG4gICAgICBjb25zdCBmbG9hdCBpbml0aWFsaXphdGlvblZhbHVlID0gJHtpbml0aWFsaXphdGlvblZhbHVlfTtcbiAgICAgIGNvbnN0IHZlYzQgb25lcyA9IHZlYzQoMS4wLCAxLjAsIDEuMCwgMS4wKTtcblxuICAgICAgZmxvYXQgY291bnQgPSAwLjA7XG5cbiAgICAgIGZsb2F0IGdldFZhbHVlKGludCBiYXRjaCwgaW50IHhSLCBpbnQgeEMsIGludCBkKSB7XG4gICAgICAgIGlmICh4QyA8IDAgfHwgeEMgPj0gJHtjb252SW5mby5pbldpZHRofSkge1xuICAgICAgICAgIHJldHVybiBpbml0aWFsaXphdGlvblZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGNvdW50ICs9IDEuMDtcbiAgICAgICAgcmV0dXJuIGdldFgoYmF0Y2gsIHhSLCB4QywgZCk7XG4gICAgICB9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiYXRjaCA9IGNvb3Jkc1swXTtcbiAgICAgICAgaW50IGQgPSBjb29yZHNbM107XG5cbiAgICAgICAgaXZlYzIgeFJDQ29ybmVyID0gY29vcmRzLnl6ICogc3RyaWRlcyAtIHBhZHM7XG4gICAgICAgIGludCB4UkNvcm5lciA9IHhSQ0Nvcm5lci54O1xuICAgICAgICBpbnQgeENDb3JuZXIgPSB4UkNDb3JuZXIueTtcblxuICAgICAgICAvLyBtYXgvbWluIHgoPywgPywgZCkgdG8gZ2V0IHkoeVIsIHlDLCBkKS5cbiAgICAgICAgLy8gPyA9IHRvIGJlIGRldGVybWluZWRcbiAgICAgICAgdmVjNCBtaW5NYXhWYWx1ZSA9IHZlYzQoJHtpbml0aWFsaXphdGlvblZhbHVlfSk7XG4gICAgICAgIGZsb2F0IGF2Z1ZhbHVlID0gMC4wO1xuICAgICAgICBjb3VudCA9IDAuMDtcblxuICAgICAgICBmb3IgKGludCB3UiA9IDA7IHdSIDwgJHtlZmZlY3RpdmVGaWx0ZXJIZWlnaHR9O1xuICAgICAgICAgICAgd1IgKz0gJHtkaWxhdGlvbkhlaWdodH0pIHtcbiAgICAgICAgICBpbnQgeFIgPSB4UkNvcm5lciArIHdSO1xuXG4gICAgICAgICAgaWYgKHhSIDwgMCB8fCB4UiA+PSAke2NvbnZJbmZvLmluSGVpZ2h0fSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yIChpbnQgd0MgPSAwOyB3QyA8ICR7ZmlsdGVyV2lkdGhOZWFyZXN0VmVjNH07IHdDICs9IDQpIHtcbiAgICAgICAgICAgIGludCB4QyA9IHhDQ29ybmVyICsgd0MgKiAke2RpbGF0aW9uV2lkdGh9O1xuXG4gICAgICAgICAgICB2ZWM0IHZhbHVlcyA9IHZlYzQoXG4gICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4UiwgeEMsIGQpLFxuICAgICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgeFIsIHhDICsgJHtkaWxhdGlvbldpZHRofSwgZCksXG4gICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4UiwgeEMgKyAyICogJHtkaWxhdGlvbldpZHRofSwgZCksXG4gICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4UiwgeEMgKyAzICogJHtkaWxhdGlvbldpZHRofSwgZClcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpbnQgeEMgPSB4Q0Nvcm5lciArICR7ZmlsdGVyV2lkdGhOZWFyZXN0VmVjNH07XG4gICAgICAgICAgaWYgKCR7ZmlsdGVyV2lkdGhWZWM0UmVtYWluZGVyID09PSAxfSkge1xuICAgICAgICAgICAgdmVjNCB2YWx1ZXMgPSB2ZWM0KFxuICAgICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgeFIsIHhDLCBkKSxcbiAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZSxcbiAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZSxcbiAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgJHt1cGRhdGVTbmlwcGV0fVxuICAgICAgICAgIH0gZWxzZSBpZiAoJHtmaWx0ZXJXaWR0aFZlYzRSZW1haW5kZXIgPT09IDJ9KSB7XG4gICAgICAgICAgICB2ZWM0IHZhbHVlcyA9IHZlYzQoXG4gICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4UiwgeEMsIGQpLFxuICAgICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgeFIsIHhDICsgJHtkaWxhdGlvbldpZHRofSwgZCksXG4gICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUsXG4gICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWVcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgICB9IGVsc2UgaWYgKCR7ZmlsdGVyV2lkdGhWZWM0UmVtYWluZGVyID09PSAzfSkge1xuICAgICAgICAgICAgdmVjNCB2YWx1ZXMgPSB2ZWM0KFxuICAgICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgeFIsIHhDLCBkKSxcbiAgICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIHhSLCB4QyArICR7ZGlsYXRpb25XaWR0aH0sIGQpLFxuICAgICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgeFIsIHhDICsgMiAqICR7ZGlsYXRpb25XaWR0aH0sIGQpLFxuICAgICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAke3VwZGF0ZVNuaXBwZXR9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNldE91dHB1dCgke3JldHVyblZhbHVlfSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUG9vbDNEUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgY29udkluZm86IGJhY2tlbmRfdXRpbC5Db252M0RJbmZvLCBwb29sVHlwZTogJ21heCd8J2F2ZycsXG4gICAgICBjb21wdXRlUG9zaXRpb25zOiBib29sZWFuLCBmbGF0dGVuUG9zaXRpb25zID0gZmFsc2UsXG4gICAgICBpbmNsdWRlQmF0Y2hJbkluZGV4ID0gZmFsc2UpIHtcbiAgICBpZiAocG9vbFR5cGUgPT09ICdhdmcnICYmIGNvbXB1dGVQb3NpdGlvbnMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNvbXB1dGUgcG9zaXRpb25zIGZvciBhdmVyYWdlIHBvb2wuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsdGVyV2lkdGggPSBjb252SW5mby5maWx0ZXJXaWR0aDtcbiAgICBjb25zdCBzdHJpZGVEZXB0aCA9IGNvbnZJbmZvLnN0cmlkZURlcHRoO1xuICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICAgIGNvbnN0IGRpbGF0aW9uRGVwdGggPSBjb252SW5mby5kaWxhdGlvbkRlcHRoO1xuICAgIGNvbnN0IGRpbGF0aW9uSGVpZ2h0ID0gY29udkluZm8uZGlsYXRpb25IZWlnaHQ7XG4gICAgY29uc3QgZGlsYXRpb25XaWR0aCA9IGNvbnZJbmZvLmRpbGF0aW9uV2lkdGg7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVyRGVwdGggPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJEZXB0aDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJIZWlnaHQ7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVyV2lkdGggPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJXaWR0aDtcblxuICAgIGNvbnN0IHBhZEZyb250ID0gY29udkluZm8ucGFkSW5mby5mcm9udDtcbiAgICBjb25zdCBwYWRUb3AgPSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICBjb25zdCBwYWRMZWZ0ID0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5vdXRTaGFwZTtcblxuICAgIGNvbnN0IGlzQXZnUG9vbCA9IHBvb2xUeXBlID09PSAnYXZnJztcblxuICAgIGxldCBpbml0aWFsaXphdGlvblZhbHVlID0gJzAuMCc7XG4gICAgaWYgKCFpc0F2Z1Bvb2wpIHtcbiAgICAgIC8vIFdlYkdMIG9uIEZpcmVmb3ggTGludXggY2FuJ3QgY29tcGlsZSAxLzAgc28gd2UgZG8gMS9lcHMuXG4gICAgICBpbml0aWFsaXphdGlvblZhbHVlID0gJy0xLjAgLyAxZS0yMCc7XG4gICAgfVxuXG4gICAgaWYgKGNvbXB1dGVQb3NpdGlvbnMpIHtcbiAgICAgIGNvbnN0IGNvbXBhcmVPcCA9ICc+PSc7XG5cbiAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAgIGNvbnN0IGl2ZWMzIHN0cmlkZXMgPVxuICAgICAgICAgICAgaXZlYzMoJHtzdHJpZGVEZXB0aH0sICR7c3RyaWRlSGVpZ2h0fSwgJHtzdHJpZGVXaWR0aH0pO1xuICAgICAgICBjb25zdCBpdmVjMyBwYWRzID0gaXZlYzMoJHtwYWRGcm9udH0sICR7cGFkVG9wfSwgJHtwYWRMZWZ0fSk7XG5cbiAgICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgIGl2ZWM1IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgIGludCBiYXRjaCA9IGNvb3Jkcy54O1xuICAgICAgICAgIGludCBjaCA9IGNvb3Jkcy51O1xuXG4gICAgICAgICAgaXZlYzMgeENvcm5lciA9IGl2ZWMzKGNvb3Jkcy55LCBjb29yZHMueiwgY29vcmRzLncpICogc3RyaWRlcyAtIHBhZHM7XG4gICAgICAgICAgaW50IHhEQ29ybmVyID0geENvcm5lci54O1xuICAgICAgICAgIGludCB4UkNvcm5lciA9IHhDb3JuZXIueTtcbiAgICAgICAgICBpbnQgeENDb3JuZXIgPSB4Q29ybmVyLno7XG5cbiAgICAgICAgICAvLyBtYXgvbWluIHgoPywgPywgPywgY2gpIHRvIGdldCB5KHlELCB5UiwgeUMsIGNoKS5cbiAgICAgICAgICAvLyA/ID0gdG8gYmUgZGV0ZXJtaW5lZFxuICAgICAgICAgIGZsb2F0IG1pbk1heFZhbHVlID0gMC4wO1xuICAgICAgICAgIGZsb2F0IG1pbk1heFZhbHVlRm91bmQgPSAwLjA7XG4gICAgICAgICAgaW50IG1pbk1heFBvc2l0aW9uID0gMDtcblxuICAgICAgICAgIGZvciAoaW50IHdEID0gMDsgd0QgPCAke2VmZmVjdGl2ZUZpbHRlckRlcHRofTtcbiAgICAgICAgICAgICAgd0QgKz0gJHtkaWxhdGlvbkRlcHRofSkge1xuICAgICAgICAgICAgaW50IHhEID0geERDb3JuZXIgKyB3RDtcblxuICAgICAgICAgICAgaWYgKHhEIDwgMCB8fCB4RCA+PSAke2NvbnZJbmZvLmluRGVwdGh9KSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGludCB3UiA9IDA7IHdSIDwgJHtlZmZlY3RpdmVGaWx0ZXJIZWlnaHR9O1xuICAgICAgICAgICAgICAgIHdSICs9ICR7ZGlsYXRpb25IZWlnaHR9KSB7XG4gICAgICAgICAgICAgIGludCB4UiA9IHhSQ29ybmVyICsgd1I7XG5cbiAgICAgICAgICAgICAgaWYgKHhSIDwgMCB8fCB4UiA+PSAke2NvbnZJbmZvLmluSGVpZ2h0fSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZm9yIChpbnQgd0MgPSAwOyB3QyA8ICR7ZWZmZWN0aXZlRmlsdGVyV2lkdGh9O1xuICAgICAgICAgICAgICAgICAgd0MgKz0gJHtkaWxhdGlvbldpZHRofSkge1xuICAgICAgICAgICAgICAgIGludCB4QyA9IHhDQ29ybmVyICsgd0M7XG5cbiAgICAgICAgICAgICAgICBpZiAoeEMgPCAwIHx8IHhDID49ICR7Y29udkluZm8uaW5XaWR0aH0pIHtcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZsb2F0IHZhbHVlID0gZ2V0WChiYXRjaCwgeEQsIHhSLCB4QywgY2gpO1xuXG4gICAgICAgICAgICAgICAgLy8gSWYgYSBtaW4gLyBtYXggdmFsdWUgaGFzIGFscmVhZHkgYmVlbiBmb3VuZCwgdXNlIGl0LiBJZiBub3QsXG4gICAgICAgICAgICAgICAgLy8gdXNlIHRoZSBjdXJyZW50IHZhbHVlLlxuICAgICAgICAgICAgICAgIGZsb2F0IGN1cnJNaW5NYXhWYWx1ZSA9IG1peChcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsIG1pbk1heFZhbHVlLCBtaW5NYXhWYWx1ZUZvdW5kKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgJHtjb21wYXJlT3B9IGN1cnJNaW5NYXhWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgbWluTWF4VmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgIG1pbk1heFZhbHVlRm91bmQgPSAxLjA7XG4gICAgICAgICAgICAgICAgICBtaW5NYXhQb3NpdGlvbiA9ICR7XG4gICAgICAgICAgZmxhdHRlblBvc2l0aW9ucyA/XG4gICAgICAgICAgICAgIChpbmNsdWRlQmF0Y2hJbkluZGV4ID9cbiAgICAgICAgICAgICAgICAgICBgKCgoYmF0Y2ggKiAke2NvbnZJbmZvLmluRGVwdGh9ICsgeEQpICogJHtcbiAgICAgICAgICAgICAgICAgICAgICAgY29udkluZm8uaW5IZWlnaHR9ICsgeFIpICogJHtjb252SW5mby5pbldpZHRofSArIHhDKSAqICR7XG4gICAgICAgICAgICAgICAgICAgICAgIGNvbnZJbmZvLmluQ2hhbm5lbHN9ICsgY2hgIDpcbiAgICAgICAgICAgICAgICAgICBgKCh4RCAqICR7Y29udkluZm8uaW5IZWlnaHR9ICsgeFIpICogJHtcbiAgICAgICAgICAgICAgICAgICAgICAgY29udkluZm8uaW5XaWR0aH0gKyB4QykgKiAke2NvbnZJbmZvLmluQ2hhbm5lbHN9ICsgY2hgKSA6XG4gICAgICAgICAgICAgIGB3RCAqICR7ZWZmZWN0aXZlRmlsdGVySGVpZ2h0fSAqICR7ZWZmZWN0aXZlRmlsdGVyV2lkdGh9ICtcbiAgICAgICAgICAgICAgICAgICAgICB3UiAqICR7ZWZmZWN0aXZlRmlsdGVyV2lkdGh9ICsgd0NgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgc2V0T3V0cHV0KGZsb2F0KG1pbk1heFBvc2l0aW9uKSk7XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29tcGFyZU9wID0gJ21heCc7XG5cbiAgICBsZXQgcmV0dXJuVmFsdWUgPSBgJHtwb29sVHlwZX0oJHtwb29sVHlwZX0oJHtwb29sVHlwZX0oYCArXG4gICAgICAgICdtaW5NYXhWYWx1ZVswXSwgbWluTWF4VmFsdWVbMV0pLCBtaW5NYXhWYWx1ZVsyXSksIG1pbk1heFZhbHVlWzNdKSc7XG4gICAgaWYgKHBvb2xUeXBlID09PSAnYXZnJykge1xuICAgICAgcmV0dXJuVmFsdWUgPSBgYXZnVmFsdWUgLyBjb3VudGA7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsdGVyV2lkdGhOZWFyZXN0VmVjNCA9IE1hdGguZmxvb3IoZmlsdGVyV2lkdGggLyA0KSAqIDQ7XG4gICAgY29uc3QgZmlsdGVyV2lkdGhWZWM0UmVtYWluZGVyID0gZmlsdGVyV2lkdGggJSA0O1xuXG4gICAgY29uc3QgdXBkYXRlU25pcHBldCA9IGBcbiAgICAgIGlmICgke2lzQXZnUG9vbH0pIHtcbiAgICAgICAgYXZnVmFsdWUgKz0gZG90KHZhbHVlcywgb25lcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtaW5NYXhWYWx1ZSA9ICR7Y29tcGFyZU9wfSh2YWx1ZXMsIG1pbk1heFZhbHVlKTtcbiAgICAgIH1cbiAgICBgO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IGl2ZWMzIHN0cmlkZXMgPVxuICAgICAgICBpdmVjMygke3N0cmlkZURlcHRofSwgJHtzdHJpZGVIZWlnaHR9LCAke3N0cmlkZVdpZHRofSk7XG4gICAgICBjb25zdCBpdmVjMyBwYWRzID0gaXZlYzMoJHtwYWRGcm9udH0sICR7cGFkVG9wfSwgJHtwYWRMZWZ0fSk7XG4gICAgICBjb25zdCBmbG9hdCBpbml0aWFsaXphdGlvblZhbHVlID0gJHtpbml0aWFsaXphdGlvblZhbHVlfTtcbiAgICAgIGNvbnN0IHZlYzQgb25lcyA9IHZlYzQoMS4wLCAxLjAsIDEuMCwgMS4wKTtcblxuICAgICAgZmxvYXQgY291bnQgPSAwLjA7XG5cbiAgICAgIGZsb2F0IGdldFZhbHVlKGludCBiYXRjaCwgaW50IHhELCBpbnQgeFIsIGludCB4QywgaW50IGNoKSB7XG4gICAgICAgIGlmICh4QyA8IDAgfHwgeEMgPj0gJHtjb252SW5mby5pbldpZHRofSkge1xuICAgICAgICAgIHJldHVybiBpbml0aWFsaXphdGlvblZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGNvdW50ICs9IDEuMDtcbiAgICAgICAgcmV0dXJuIGdldFgoYmF0Y2gsIHhELCB4UiwgeEMsIGNoKTtcbiAgICAgIH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjNSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzLng7XG4gICAgICAgIGludCBjaCA9IGNvb3Jkcy51O1xuXG4gICAgICAgIGl2ZWMzIHhDb3JuZXIgPSBpdmVjMyhjb29yZHMueSwgY29vcmRzLnosIGNvb3Jkcy53KSAqIHN0cmlkZXMgLSBwYWRzO1xuICAgICAgICBpbnQgeERDb3JuZXIgPSB4Q29ybmVyLng7XG4gICAgICAgIGludCB4UkNvcm5lciA9IHhDb3JuZXIueTtcbiAgICAgICAgaW50IHhDQ29ybmVyID0geENvcm5lci56O1xuXG4gICAgICAgIC8vIG1heC9taW4geCg/LCA/LCA/LCBkKSB0byBnZXQgeSh5RCwgeVIsIHlDLCBjaCkuXG4gICAgICAgIC8vID8gPSB0byBiZSBkZXRlcm1pbmVkXG4gICAgICAgIHZlYzQgbWluTWF4VmFsdWUgPSB2ZWM0KCR7aW5pdGlhbGl6YXRpb25WYWx1ZX0pO1xuICAgICAgICBmbG9hdCBhdmdWYWx1ZSA9IDAuMDtcbiAgICAgICAgY291bnQgPSAwLjA7XG5cbiAgICAgICAgZm9yIChpbnQgd0QgPSAwOyB3RCA8ICR7ZWZmZWN0aXZlRmlsdGVyRGVwdGh9O1xuICAgICAgICAgICAgd0QgKz0gJHtkaWxhdGlvbkRlcHRofSkge1xuICAgICAgICAgIGludCB4RCA9IHhEQ29ybmVyICsgd0Q7XG5cbiAgICAgICAgICBpZiAoeEQgPCAwIHx8IHhEID49ICR7Y29udkluZm8uaW5EZXB0aH0pIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAoaW50IHdSID0gMDsgd1IgPCAke2VmZmVjdGl2ZUZpbHRlckhlaWdodH07XG4gICAgICAgICAgICB3UiArPSAke2RpbGF0aW9uSGVpZ2h0fSkge1xuICAgICAgICAgICAgaW50IHhSID0geFJDb3JuZXIgKyB3UjtcblxuICAgICAgICAgICAgaWYgKHhSIDwgMCB8fCB4UiA+PSAke2NvbnZJbmZvLmluSGVpZ2h0fSkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChpbnQgd0MgPSAwOyB3QyA8ICR7ZmlsdGVyV2lkdGhOZWFyZXN0VmVjNH07IHdDICs9IDQpIHtcbiAgICAgICAgICAgICAgaW50IHhDID0geENDb3JuZXIgKyB3QyAqICR7ZGlsYXRpb25XaWR0aH07XG5cbiAgICAgICAgICAgICAgdmVjNCB2YWx1ZXMgPSB2ZWM0KFxuICAgICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4RCwgeFIsIHhDLCBjaCksXG4gICAgICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIHhELCB4UiwgeEMgKyAke2RpbGF0aW9uV2lkdGh9LCBjaCksXG4gICAgICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIHhELCB4UiwgeEMgKyAyICogJHtkaWxhdGlvbldpZHRofSwgY2gpLFxuICAgICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4RCwgeFIsIHhDICsgMyAqICR7ZGlsYXRpb25XaWR0aH0sIGNoKVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW50IHhDID0geENDb3JuZXIgKyAke2ZpbHRlcldpZHRoTmVhcmVzdFZlYzR9O1xuICAgICAgICAgICAgaWYgKCR7ZmlsdGVyV2lkdGhWZWM0UmVtYWluZGVyID09PSAxfSkge1xuICAgICAgICAgICAgICB2ZWM0IHZhbHVlcyA9IHZlYzQoXG4gICAgICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIHhELCB4UiwgeEMsIGNoKSxcbiAgICAgICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlLFxuICAgICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUsXG4gICAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoJHtmaWx0ZXJXaWR0aFZlYzRSZW1haW5kZXIgPT09IDJ9KSB7XG4gICAgICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgeEQsIHhSLCB4QywgY2gpLFxuICAgICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4RCwgeFIsIHhDICsgJHtkaWxhdGlvbldpZHRofSwgY2gpLFxuICAgICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUsXG4gICAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoJHtmaWx0ZXJXaWR0aFZlYzRSZW1haW5kZXIgPT09IDN9KSB7XG4gICAgICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgeEQsIHhSLCB4QywgY2gpLFxuICAgICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4RCwgeFIsIHhDICsgJHtkaWxhdGlvbldpZHRofSwgY2gpLFxuICAgICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4RCwgeFIsIHhDICsgMiAqICR7ZGlsYXRpb25XaWR0aH0sIGNoKSxcbiAgICAgICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgJHt1cGRhdGVTbmlwcGV0fVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBzZXRPdXRwdXQoJHtyZXR1cm5WYWx1ZX0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgUmVkdWNlUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgcmVkdWNlSW5mbzogYmFja2VuZF91dGlsLlJlZHVjZUluZm8sXG4gICAgICByZWR1Y2VUeXBlOiAnYWxsJ3wnYW55J3wnbWF4J3wnbWluJ3wnc3VtJ3wncHJvZCcpIHtcbiAgICBjb25zdCB7d2luZG93U2l6ZSwgYmF0Y2hTaXplLCBpblNpemUsIG91dFNpemV9ID0gcmVkdWNlSW5mbztcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gW2JhdGNoU2l6ZSwgb3V0U2l6ZV07XG5cbiAgICBsZXQgaW5pdGlhbGl6YXRpb25WYWx1ZSA9ICcwLjAnO1xuICAgIGxldCBjb21wYXJlT3AgPSBgYDtcblxuICAgIGlmIChyZWR1Y2VUeXBlID09PSAncHJvZCcpIHtcbiAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUgPSAnMS4wJztcbiAgICB9IGVsc2UgaWYgKHJlZHVjZVR5cGUgPT09ICdtaW4nKSB7XG4gICAgICAvLyBXZWJHTCBvbiBGaXJlZm94IExpbnV4IGNhbid0IGNvbXBpbGUgMS8wIHNvIHdlIGRvIDEvZXBzLlxuICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZSA9ICcxLjAgLyAxZS0yMCc7XG4gICAgICBjb21wYXJlT3AgPSBgbWluYDtcbiAgICB9IGVsc2UgaWYgKHJlZHVjZVR5cGUgPT09ICdtYXgnKSB7XG4gICAgICAvLyBXZWJHTCBvbiBGaXJlZm94IExpbnV4IGNhbid0IGNvbXBpbGUgMS8wIHNvIHdlIGRvIDEvZXBzLlxuICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZSA9ICctMS4wIC8gMWUtMjAnO1xuICAgICAgY29tcGFyZU9wID0gYG1heGA7XG4gICAgfVxuXG4gICAgbGV0IHJldHVyblZhbHVlID0gYCR7cmVkdWNlVHlwZX0oJHtyZWR1Y2VUeXBlfSgke3JlZHVjZVR5cGV9KGAgK1xuICAgICAgICAnbWluTWF4VmFsdWVbMF0sIG1pbk1heFZhbHVlWzFdKSwgbWluTWF4VmFsdWVbMl0pLCBtaW5NYXhWYWx1ZVszXSknO1xuXG4gICAgaWYgKHJlZHVjZVR5cGUgPT09ICdzdW0nKSB7XG4gICAgICByZXR1cm5WYWx1ZSA9IGBzdW1WYWx1ZWA7XG4gICAgfSBlbHNlIGlmIChyZWR1Y2VUeXBlID09PSAncHJvZCcpIHtcbiAgICAgIHJldHVyblZhbHVlID0gYHByb2RWYWx1ZWA7XG4gICAgfSBlbHNlIGlmIChyZWR1Y2VUeXBlID09PSAnYWxsJykge1xuICAgICAgcmV0dXJuVmFsdWUgPSBgYWxsVmFsdWVgO1xuICAgIH0gZWxzZSBpZiAocmVkdWNlVHlwZSA9PT0gJ2FueScpIHtcbiAgICAgIHJldHVyblZhbHVlID0gYGFueVZhbHVlYDtcbiAgICB9XG5cbiAgICBjb25zdCB3aW5kb3dTaXplTmVhcmVzdFZlYzQgPSBNYXRoLmZsb29yKHdpbmRvd1NpemUgLyA0KSAqIDQ7XG4gICAgY29uc3Qgd2luZG93U2l6ZVZlYzRSZW1haW5kZXIgPSB3aW5kb3dTaXplICUgNDtcblxuICAgIGxldCB1cGRhdGVTbmlwcGV0ID0gYFxuICAgICAgaWYgKCR7cmVkdWNlVHlwZSA9PT0gJ3N1bSd9KSB7XG4gICAgICAgIHN1bVZhbHVlICs9IGRvdCh2YWx1ZXMsIG9uZXMpO1xuICAgICAgfSBlbHNlIGlmICgke3JlZHVjZVR5cGUgPT09ICdwcm9kJ30pIHtcbiAgICAgICAgdmVjMiB0bXAgPSB2ZWMyKHZhbHVlc1swXSwgdmFsdWVzWzFdKSAqIHZlYzIodmFsdWVzWzJdLCB2YWx1ZXNbM10pO1xuICAgICAgICBwcm9kVmFsdWUgKj0gdG1wWzBdICogdG1wWzFdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWluTWF4VmFsdWUgPSAke2NvbXBhcmVPcH0odmFsdWVzLCBtaW5NYXhWYWx1ZSk7XG4gICAgICAgIGlmICgke3JlZHVjZVR5cGUgPT09ICdtaW4nfSB8fCAke3JlZHVjZVR5cGUgPT09ICdtYXgnfSkge1xuICAgICAgICAgIG1pbk1heFZhbHVlID0gJHtjb21wYXJlT3B9KHZhbHVlcywgbWluTWF4VmFsdWUpO1xuICAgICAgICAgIGJ2ZWM0IGlzTmFOID0gaXNuYW4odmFsdWVzKTtcbiAgICAgICAgICBpZiAoaXNOYU4uciB8fCBpc05hTi5nIHx8IGlzTmFOLmIgfHwgaXNOYU4uYSkge1xuICAgICAgICAgICAgbWluTWF4VmFsdWUgPSB2ZWM0KE5BTik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgYDtcblxuICAgIGxldCB2ZWNUeXBlID0gYHZlYzRgO1xuXG4gICAgaWYgKHJlZHVjZVR5cGUgPT09ICdhbGwnKSB7XG4gICAgICBpbml0aWFsaXphdGlvblZhbHVlID0gJzEuMCc7XG4gICAgICB1cGRhdGVTbmlwcGV0ID0gYFxuICAgICAgICBib29sIHJlZHVjZWRBbGxWYWx1ZSA9IGFsbCh2YWx1ZXMpO1xuICAgICAgICBmbG9hdCBmbG9hdGVkUmVkdWNlZEFsbFZhbHVlID0gZmxvYXQocmVkdWNlZEFsbFZhbHVlKTtcbiAgICAgICAgYWxsVmFsdWUgPSBmbG9hdChhbGxWYWx1ZSA+PSAxLjAgJiYgZmxvYXRlZFJlZHVjZWRBbGxWYWx1ZSA+PSAxLjApO1xuICAgICAgYDtcbiAgICAgIHZlY1R5cGUgPSBgYnZlYzRgO1xuICAgIH0gZWxzZSBpZiAocmVkdWNlVHlwZSA9PT0gJ2FueScpIHtcbiAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUgPSAnMC4wJztcbiAgICAgIHVwZGF0ZVNuaXBwZXQgPSBgXG4gICAgICAgIGJvb2wgcmVkdWNlZEFueVZhbHVlID0gYW55KHZhbHVlcyk7XG4gICAgICAgIGZsb2F0IGZsb2F0ZWRSZWR1Y2VkQW55VmFsdWUgPSBmbG9hdChyZWR1Y2VkQW55VmFsdWUpO1xuICAgICAgICBhbnlWYWx1ZSA9IGZsb2F0KGFueVZhbHVlID49IDEuMCB8fCBmbG9hdGVkUmVkdWNlZEFueVZhbHVlID49IDEuMCk7XG4gICAgICBgO1xuICAgICAgdmVjVHlwZSA9IGBidmVjNGA7XG4gICAgfVxuXG4gICAgbGV0IGNoZWNrT3V0T2ZCb3VuZHMgPSAnJztcbiAgICBpZiAoaW5TaXplICUgd2luZG93U2l6ZSA+IDApIHtcbiAgICAgIGNoZWNrT3V0T2ZCb3VuZHMgPSBgXG4gICAgICAgIGlmIChpbklkeCA8IDAgfHwgaW5JZHggPj0gJHtpblNpemV9KSB7XG4gICAgICAgICAgcmV0dXJuIGluaXRpYWxpemF0aW9uVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgfVxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCBmbG9hdCBpbml0aWFsaXphdGlvblZhbHVlID0gJHtpbml0aWFsaXphdGlvblZhbHVlfTtcbiAgICAgIGNvbnN0IHZlYzQgb25lcyA9IHZlYzQoMS4wLCAxLjAsIDEuMCwgMS4wKTtcblxuICAgICAgZmxvYXQgZ2V0VmFsdWUoaW50IGJhdGNoLCBpbnQgaW5JZHgpIHtcbiAgICAgICAgJHtjaGVja091dE9mQm91bmRzfVxuICAgICAgICByZXR1cm4gZ2V0WChiYXRjaCwgaW5JZHgpO1xuICAgICAgfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWMyIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHNbMF07XG4gICAgICAgIGludCBvdXRJZHggPSBjb29yZHNbMV07XG4gICAgICAgIGludCBpbk9mZnNldCA9IG91dElkeCAqICR7d2luZG93U2l6ZX07XG5cbiAgICAgICAgdmVjNCBtaW5NYXhWYWx1ZSA9IHZlYzQoJHtpbml0aWFsaXphdGlvblZhbHVlfSk7XG4gICAgICAgIGZsb2F0IHByb2RWYWx1ZSA9IDEuMDtcbiAgICAgICAgZmxvYXQgc3VtVmFsdWUgPSAwLjA7XG4gICAgICAgIGZsb2F0IGFsbFZhbHVlID0gMS4wO1xuICAgICAgICBmbG9hdCBhbnlWYWx1ZSA9IDAuMDtcblxuICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8ICR7d2luZG93U2l6ZU5lYXJlc3RWZWM0fTsgaSArPSA0KSB7XG4gICAgICAgICAgaW50IGluSWR4ID0gaW5PZmZzZXQgKyBpO1xuICAgICAgICAgICR7dmVjVHlwZX0gdmFsdWVzID0gJHt2ZWNUeXBlfShcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAxKSxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDIpLFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4ICsgMylcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgJHt1cGRhdGVTbmlwcGV0fVxuICAgICAgICB9XG5cbiAgICAgICAgaW50IGluSWR4ID0gaW5PZmZzZXQgKyAke3dpbmRvd1NpemVOZWFyZXN0VmVjNH07XG4gICAgICAgIGlmICgke3dpbmRvd1NpemVWZWM0UmVtYWluZGVyID09PSAxfSkge1xuICAgICAgICAgICR7dmVjVHlwZX0gdmFsdWVzID0gJHt2ZWNUeXBlfShcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCksXG4gICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlLFxuICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZSxcbiAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWVcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgJHt1cGRhdGVTbmlwcGV0fVxuICAgICAgICB9IGVsc2UgaWYgKCR7d2luZG93U2l6ZVZlYzRSZW1haW5kZXIgPT09IDJ9KSB7XG4gICAgICAgICAgJHt2ZWNUeXBlfSB2YWx1ZXMgPSAke3ZlY1R5cGV9KFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4KSxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDEpLFxuICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZSxcbiAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWVcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgJHt1cGRhdGVTbmlwcGV0fVxuICAgICAgICB9IGVsc2UgaWYgKCR7d2luZG93U2l6ZVZlYzRSZW1haW5kZXIgPT09IDN9KSB7XG4gICAgICAgICAgJHt2ZWNUeXBlfSB2YWx1ZXMgPSAke3ZlY1R5cGV9KFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4KSxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDEpLFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4ICsgMiksXG4gICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlXG4gICAgICAgICAgKTtcblxuICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQoJHtyZXR1cm5WYWx1ZX0pO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7S2VybmVsQ29uZmlnLCByZWdpc3Rlcktlcm5lbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtfZnVzZWRNYXRNdWxDb25maWd9IGZyb20gJy4va2VybmVscy9fRnVzZWRNYXRNdWwnO1xuaW1wb3J0IHthYnNDb25maWd9IGZyb20gJy4va2VybmVscy9BYnMnO1xuaW1wb3J0IHthY29zQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQWNvcyc7XG5pbXBvcnQge2Fjb3NoQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQWNvc2gnO1xuaW1wb3J0IHthZGRDb25maWd9IGZyb20gJy4va2VybmVscy9BZGQnO1xuaW1wb3J0IHthZGROQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQWRkTic7XG5pbXBvcnQge2FsbENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0FsbCc7XG5pbXBvcnQge2FueUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0FueSc7XG5pbXBvcnQge2FyZ01heENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0FyZ01heCc7XG5pbXBvcnQge2FyZ01pbkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0FyZ01pbic7XG5pbXBvcnQge2FzaW5Db25maWd9IGZyb20gJy4va2VybmVscy9Bc2luJztcbmltcG9ydCB7YXNpbmhDb25maWd9IGZyb20gJy4va2VybmVscy9Bc2luaCc7XG5pbXBvcnQge2F0YW5Db25maWd9IGZyb20gJy4va2VybmVscy9BdGFuJztcbmltcG9ydCB7YXRhbjJDb25maWd9IGZyb20gJy4va2VybmVscy9BdGFuMic7XG5pbXBvcnQge2F0YW5oQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQXRhbmgnO1xuaW1wb3J0IHthdmdQb29sQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQXZnUG9vbCc7XG5pbXBvcnQge2F2Z1Bvb2wzRENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0F2Z1Bvb2wzRCc7XG5pbXBvcnQge2F2Z1Bvb2xHcmFkM0RDb25maWd9IGZyb20gJy4va2VybmVscy9BdmdQb29sM0RHcmFkJztcbmltcG9ydCB7YXZnUG9vbEdyYWRDb25maWd9IGZyb20gJy4va2VybmVscy9BdmdQb29sR3JhZCc7XG5pbXBvcnQge2JhdGNoTWF0TXVsQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQmF0Y2hNYXRNdWwnO1xuaW1wb3J0IHtiYXRjaE5vcm1Db25maWd9IGZyb20gJy4va2VybmVscy9CYXRjaE5vcm0nO1xuaW1wb3J0IHtiYXRjaFRvU3BhY2VORENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0JhdGNoVG9TcGFjZU5EJztcbmltcG9ydCB7YmluY291bnRDb25maWd9IGZyb20gJy4va2VybmVscy9CaW5jb3VudCc7XG5pbXBvcnQge2Nhc3RDb25maWd9IGZyb20gJy4va2VybmVscy9DYXN0JztcbmltcG9ydCB7Y2VpbENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0NlaWwnO1xuaW1wb3J0IHtjbGlwQnlWYWx1ZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0NsaXBCeVZhbHVlJztcbmltcG9ydCB7Y29tcGxleENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0NvbXBsZXgnO1xuaW1wb3J0IHtjb21wbGV4QWJzQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQ29tcGxleEFicyc7XG5pbXBvcnQge2NvbmNhdENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0NvbmNhdCc7XG5pbXBvcnQge2NvbnYyRENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0NvbnYyRCc7XG5pbXBvcnQge2NvbnYyREJhY2twcm9wRmlsdGVyQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQ29udjJEQmFja3Byb3BGaWx0ZXInO1xuaW1wb3J0IHtjb252MkRCYWNrcHJvcElucHV0Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQ29udjJEQmFja3Byb3BJbnB1dCc7XG5pbXBvcnQge2NvbnYzRENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0NvbnYzRCc7XG5pbXBvcnQge2NvbnYzREJhY2twcm9wRmlsdGVyVjJDb25maWd9IGZyb20gJy4va2VybmVscy9Db252M0RCYWNrcHJvcEZpbHRlclYyJztcbmltcG9ydCB7Y29udjNEQmFja3Byb3BJbnB1dENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0NvbnYzREJhY2twcm9wSW5wdXRWMic7XG5pbXBvcnQge2Nvc0NvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0Nvcyc7XG5pbXBvcnQge2Nvc2hDb25maWd9IGZyb20gJy4va2VybmVscy9Db3NoJztcbmltcG9ydCB7Y3JvcEFuZFJlc2l6ZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0Nyb3BBbmRSZXNpemUnO1xuaW1wb3J0IHtjdW1zdW1Db25maWd9IGZyb20gJy4va2VybmVscy9DdW1zdW0nO1xuaW1wb3J0IHtkZW5zZUJpbmNvdW50Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRGVuc2VCaW5jb3VudCc7XG5pbXBvcnQge2RlcHRoVG9TcGFjZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0RlcHRoVG9TcGFjZSc7XG5pbXBvcnQge2RlcHRod2lzZUNvbnYyZE5hdGl2ZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0RlcHRod2lzZUNvbnYyZE5hdGl2ZSc7XG5pbXBvcnQge2RlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXInO1xuaW1wb3J0IHtkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCc7XG5pbXBvcnQge2RpYWdDb25maWd9IGZyb20gJy4va2VybmVscy9EaWFnJztcbmltcG9ydCB7ZGlsYXRpb24yRENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0RpbGF0aW9uMkQnO1xuaW1wb3J0IHtlaW5zdW1Db25maWd9IGZyb20gJy4va2VybmVscy9FaW5zdW0nO1xuaW1wb3J0IHtlbHVDb25maWd9IGZyb20gJy4va2VybmVscy9FbHUnO1xuaW1wb3J0IHtlbHVHcmFkQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRWx1R3JhZCc7XG5pbXBvcnQge2VxdWFsQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRXF1YWwnO1xuaW1wb3J0IHtlcmZDb25maWd9IGZyb20gJy4va2VybmVscy9FcmYnO1xuaW1wb3J0IHtleHBDb25maWd9IGZyb20gJy4va2VybmVscy9FeHAnO1xuaW1wb3J0IHtleHBhbmREaW1zQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRXhwYW5kRGltcyc7XG5pbXBvcnQge2V4cG0xQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRXhwbTEnO1xuaW1wb3J0IHtmZnRDb25maWd9IGZyb20gJy4va2VybmVscy9GRlQnO1xuaW1wb3J0IHtmaWxsQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRmlsbCc7XG5pbXBvcnQge2ZsaXBMZWZ0UmlnaHRDb25maWd9IGZyb20gJy4va2VybmVscy9GbGlwTGVmdFJpZ2h0JztcbmltcG9ydCB7Zmxvb3JDb25maWd9IGZyb20gJy4va2VybmVscy9GbG9vcic7XG5pbXBvcnQge2Zsb29yRGl2Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRmxvb3JEaXYnO1xuaW1wb3J0IHtmcm9tUGl4ZWxzQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRnJvbVBpeGVscyc7XG5pbXBvcnQge2Z1c2VkQ29udjJEQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRnVzZWRDb252MkQnO1xuaW1wb3J0IHtmdXNlZERlcHRod2lzZUNvbnYyRENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0Z1c2VkRGVwdGh3aXNlQ29udjJEJztcbmltcG9ydCB7Z2F0aGVyTmRDb25maWd9IGZyb20gJy4va2VybmVscy9HYXRoZXJOZCc7XG5pbXBvcnQge2dhdGhlclYyQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvR2F0aGVyVjInO1xuaW1wb3J0IHtncmVhdGVyQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvR3JlYXRlcic7XG5pbXBvcnQge2dyZWF0ZXJFcXVhbENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0dyZWF0ZXJFcXVhbCc7XG5pbXBvcnQge2lkZW50aXR5Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvSWRlbnRpdHknO1xuaW1wb3J0IHtpZmZ0Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvSUZGVCc7XG5pbXBvcnQge2ltYWdDb25maWd9IGZyb20gJy4va2VybmVscy9JbWFnJztcbmltcG9ydCB7aXNGaW5pdGVDb25maWd9IGZyb20gJy4va2VybmVscy9Jc0Zpbml0ZSc7XG5pbXBvcnQge2lzSW5mQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvSXNJbmYnO1xuaW1wb3J0IHtpc05hTkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0lzTmFOJztcbmltcG9ydCB7bGVha3lSZWx1Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTGVha3lSZWx1JztcbmltcG9ydCB7bGVzc0NvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0xlc3MnO1xuaW1wb3J0IHtsZXNzRXF1YWxDb25maWd9IGZyb20gJy4va2VybmVscy9MZXNzRXF1YWwnO1xuaW1wb3J0IHtsaW5TcGFjZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0xpblNwYWNlJztcbmltcG9ydCB7bG9nQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTG9nJztcbmltcG9ydCB7bG9nMXBDb25maWd9IGZyb20gJy4va2VybmVscy9Mb2cxcCc7XG5pbXBvcnQge2xvZ2ljYWxBbmRDb25maWd9IGZyb20gJy4va2VybmVscy9Mb2dpY2FsQW5kJztcbmltcG9ydCB7bG9naWNhbE5vdENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0xvZ2ljYWxOb3QnO1xuaW1wb3J0IHtsb2dpY2FsT3JDb25maWd9IGZyb20gJy4va2VybmVscy9Mb2dpY2FsT3InO1xuaW1wb3J0IHtMUk5Db25maWd9IGZyb20gJy4va2VybmVscy9MUk4nO1xuaW1wb3J0IHtMUk5HcmFkQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTFJOR3JhZCc7XG5pbXBvcnQge21heENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL01heCc7XG5pbXBvcnQge21heGltdW1Db25maWd9IGZyb20gJy4va2VybmVscy9NYXhpbXVtJztcbmltcG9ydCB7bWF4UG9vbENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL01heFBvb2wnO1xuaW1wb3J0IHttYXhQb29sM0RDb25maWd9IGZyb20gJy4va2VybmVscy9NYXhQb29sM0QnO1xuaW1wb3J0IHttYXhQb29sR3JhZDNEQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTWF4UG9vbDNER3JhZCc7XG5pbXBvcnQge21heFBvb2xHcmFkQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTWF4UG9vbEdyYWQnO1xuaW1wb3J0IHttYXhQb29sV2l0aEFyZ21heENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL01heFBvb2xXaXRoQXJnbWF4JztcbmltcG9ydCB7bWVhbkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL01lYW4nO1xuaW1wb3J0IHttaW5Db25maWd9IGZyb20gJy4va2VybmVscy9NaW4nO1xuaW1wb3J0IHttaW5pbXVtQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTWluaW11bSc7XG5pbXBvcnQge21pcnJvclBhZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL01pcnJvclBhZCc7XG5pbXBvcnQge21vZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL01vZCc7XG5pbXBvcnQge211bHRpbm9taWFsQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTXVsdGlub21pYWwnO1xuaW1wb3J0IHttdWx0aXBseUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL011bHRpcGx5JztcbmltcG9ydCB7bmVnQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTmVnJztcbmltcG9ydCB7bm9uTWF4U3VwcHJlc3Npb25WM0NvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL05vbk1heFN1cHByZXNzaW9uVjMnO1xuaW1wb3J0IHtub25NYXhTdXBwcmVzc2lvblY0Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTm9uTWF4U3VwcHJlc3Npb25WNCc7XG5pbXBvcnQge25vbk1heFN1cHByZXNzaW9uVjVDb25maWd9IGZyb20gJy4va2VybmVscy9Ob25NYXhTdXBwcmVzc2lvblY1JztcbmltcG9ydCB7bm90RXF1YWxDb25maWd9IGZyb20gJy4va2VybmVscy9Ob3RFcXVhbCc7XG5pbXBvcnQge29uZUhvdENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL09uZUhvdCc7XG5pbXBvcnQge29uZXNMaWtlQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvT25lc0xpa2UnO1xuaW1wb3J0IHtwYWNrQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvUGFjayc7XG5pbXBvcnQge3BhZFYyQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvUGFkVjInO1xuaW1wb3J0IHtwb3dDb25maWd9IGZyb20gJy4va2VybmVscy9Qb3cnO1xuaW1wb3J0IHtwcmVsdUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1ByZWx1JztcbmltcG9ydCB7cHJvZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1Byb2QnO1xuaW1wb3J0IHtyYW5nZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1JhbmdlJztcbmltcG9ydCB7cmVhbENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1JlYWwnO1xuaW1wb3J0IHtyZWFsRGl2Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvUmVhbERpdic7XG5pbXBvcnQge3JlY2lwcm9jYWxDb25maWd9IGZyb20gJy4va2VybmVscy9SZWNpcHJvY2FsJztcbmltcG9ydCB7cmVsdUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1JlbHUnO1xuaW1wb3J0IHtyZWx1NkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1JlbHU2JztcbmltcG9ydCB7cmVzaGFwZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1Jlc2hhcGUnO1xuaW1wb3J0IHtyZXNpemVCaWxpbmVhckNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1Jlc2l6ZUJpbGluZWFyJztcbmltcG9ydCB7cmVzaXplQmlsaW5lYXJHcmFkQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvUmVzaXplQmlsaW5lYXJHcmFkJztcbmltcG9ydCB7cmVzaXplTmVhcmVzdE5laWdoYm9yQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvUmVzaXplTmVhcmVzdE5laWdoYm9yJztcbmltcG9ydCB7cmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1Jlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWQnO1xuaW1wb3J0IHtyZXZlcnNlQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvUmV2ZXJzZSc7XG5pbXBvcnQge3JvdGF0ZVdpdGhPZmZzZXRDb25maWd9IGZyb20gJy4va2VybmVscy9Sb3RhdGVXaXRoT2Zmc2V0JztcbmltcG9ydCB7cm91bmRDb25maWd9IGZyb20gJy4va2VybmVscy9Sb3VuZCc7XG5pbXBvcnQge3JzcXJ0Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvUnNxcnQnO1xuaW1wb3J0IHtzY2F0dGVyTmRDb25maWd9IGZyb20gJy4va2VybmVscy9TY2F0dGVyTmQnO1xuaW1wb3J0IHtzZWxlY3RDb25maWd9IGZyb20gJy4va2VybmVscy9TZWxlY3QnO1xuaW1wb3J0IHtzZWx1Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU2VsdSc7XG5pbXBvcnQge3NpZ21vaWRDb25maWd9IGZyb20gJy4va2VybmVscy9TaWdtb2lkJztcbmltcG9ydCB7c2lnbkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1NpZ24nO1xuaW1wb3J0IHtzaW5Db25maWd9IGZyb20gJy4va2VybmVscy9TaW4nO1xuaW1wb3J0IHtzaW5oQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU2luaCc7XG5pbXBvcnQge3NsaWNlQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU2xpY2UnO1xuaW1wb3J0IHtzb2Z0bWF4Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU29mdG1heCc7XG5pbXBvcnQge3NvZnRwbHVzQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU29mdHBsdXMnO1xuaW1wb3J0IHtzcGFjZVRvQmF0Y2hORENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1NwYWNlVG9CYXRjaE5EJztcbmltcG9ydCB7c3BhcnNlRmlsbEVtcHR5Um93c0NvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1NwYXJzZUZpbGxFbXB0eVJvd3MnO1xuaW1wb3J0IHtzcGFyc2VSZXNoYXBlQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU3BhcnNlUmVzaGFwZSc7XG5pbXBvcnQge3NwYXJzZVNlZ21lbnRNZWFuQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU3BhcnNlU2VnbWVudE1lYW4nO1xuaW1wb3J0IHtzcGFyc2VTZWdtZW50U3VtQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU3BhcnNlU2VnbWVudFN1bSc7XG5pbXBvcnQge3NwYXJzZVRvRGVuc2VDb25maWd9IGZyb20gJy4va2VybmVscy9TcGFyc2VUb0RlbnNlJztcbmltcG9ydCB7c3BsaXRWQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU3BsaXRWJztcbmltcG9ydCB7c3FydENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1NxcnQnO1xuaW1wb3J0IHtzcXVhcmVDb25maWd9IGZyb20gJy4va2VybmVscy9TcXVhcmUnO1xuaW1wb3J0IHtzcXVhcmVkRGlmZmVyZW5jZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1NxdWFyZWREaWZmZXJlbmNlJztcbmltcG9ydCB7c3RlcENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1N0ZXAnO1xuaW1wb3J0IHtzdHJpZGVkU2xpY2VDb25maWd9IGZyb20gJy4va2VybmVscy9TdHJpZGVkU2xpY2UnO1xuaW1wb3J0IHtzdHJpbmdOR3JhbXNDb25maWd9IGZyb20gJy4va2VybmVscy9TdHJpbmdOR3JhbXMnO1xuaW1wb3J0IHtzdHJpbmdTcGxpdENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1N0cmluZ1NwbGl0JztcbmltcG9ydCB7c3RyaW5nVG9IYXNoQnVja2V0RmFzdENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1N0cmluZ1RvSGFzaEJ1Y2tldEZhc3QnO1xuaW1wb3J0IHtzdWJDb25maWd9IGZyb20gJy4va2VybmVscy9TdWInO1xuaW1wb3J0IHtzdW1Db25maWd9IGZyb20gJy4va2VybmVscy9TdW0nO1xuaW1wb3J0IHt0YW5Db25maWd9IGZyb20gJy4va2VybmVscy9UYW4nO1xuaW1wb3J0IHt0YW5oQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvVGFuaCc7XG5pbXBvcnQge3RpbGVDb25maWd9IGZyb20gJy4va2VybmVscy9UaWxlJztcbmltcG9ydCB7dG9wS0NvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1RvcEsnO1xuaW1wb3J0IHt0cmFuc2Zvcm1Db25maWd9IGZyb20gJy4va2VybmVscy9UcmFuc2Zvcm0nO1xuaW1wb3J0IHt0cmFuc3Bvc2VDb25maWd9IGZyb20gJy4va2VybmVscy9UcmFuc3Bvc2UnO1xuaW1wb3J0IHt1bmlxdWVDb25maWd9IGZyb20gJy4va2VybmVscy9VbmlxdWUnO1xuaW1wb3J0IHt1bnBhY2tDb25maWd9IGZyb20gJy4va2VybmVscy9VbnBhY2snO1xuaW1wb3J0IHt1bnNvcnRlZFNlZ21lbnRTdW1Db25maWd9IGZyb20gJy4va2VybmVscy9VbnNvcnRlZFNlZ21lbnRTdW0nO1xuaW1wb3J0IHt6ZXJvc0xpa2VDb25maWd9IGZyb20gJy4va2VybmVscy9aZXJvc0xpa2UnO1xuXG4vLyBMaXN0IGFsbCBrZXJuZWwgY29uZmlncyBoZXJlXG5jb25zdCBrZXJuZWxDb25maWdzOiBLZXJuZWxDb25maWdbXSA9IFtcbiAgTFJOQ29uZmlnLFxuICBMUk5HcmFkQ29uZmlnLFxuICBfZnVzZWRNYXRNdWxDb25maWcsXG4gIGFic0NvbmZpZyxcbiAgYWNvc0NvbmZpZyxcbiAgYWNvc2hDb25maWcsXG4gIGFkZENvbmZpZyxcbiAgYWRkTkNvbmZpZyxcbiAgYWxsQ29uZmlnLFxuICBhbnlDb25maWcsXG4gIGFyZ01heENvbmZpZyxcbiAgYXJnTWluQ29uZmlnLFxuICBhc2luQ29uZmlnLFxuICBhc2luaENvbmZpZyxcbiAgYXRhbjJDb25maWcsXG4gIGF0YW5Db25maWcsXG4gIGF0YW5oQ29uZmlnLFxuICBhdmdQb29sM0RDb25maWcsXG4gIGF2Z1Bvb2xDb25maWcsXG4gIGF2Z1Bvb2xHcmFkM0RDb25maWcsXG4gIGF2Z1Bvb2xHcmFkQ29uZmlnLFxuICBiYXRjaE1hdE11bENvbmZpZyxcbiAgYmF0Y2hOb3JtQ29uZmlnLFxuICBiYXRjaFRvU3BhY2VORENvbmZpZyxcbiAgYmluY291bnRDb25maWcsXG4gIGNhc3RDb25maWcsXG4gIGNlaWxDb25maWcsXG4gIGNsaXBCeVZhbHVlQ29uZmlnLFxuICBjb21wbGV4QWJzQ29uZmlnLFxuICBjb21wbGV4Q29uZmlnLFxuICBjb25jYXRDb25maWcsXG4gIGNvbnYyREJhY2twcm9wRmlsdGVyQ29uZmlnLFxuICBjb252MkRCYWNrcHJvcElucHV0Q29uZmlnLFxuICBjb252MkRDb25maWcsXG4gIGNvbnYzREJhY2twcm9wRmlsdGVyVjJDb25maWcsXG4gIGNvbnYzREJhY2twcm9wSW5wdXRDb25maWcsXG4gIGNvbnYzRENvbmZpZyxcbiAgY29zQ29uZmlnLFxuICBjb3NoQ29uZmlnLFxuICBjcm9wQW5kUmVzaXplQ29uZmlnLFxuICBjdW1zdW1Db25maWcsXG4gIGRlbnNlQmluY291bnRDb25maWcsXG4gIGRlcHRoVG9TcGFjZUNvbmZpZyxcbiAgZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXJDb25maWcsXG4gIGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXRDb25maWcsXG4gIGRlcHRod2lzZUNvbnYyZE5hdGl2ZUNvbmZpZyxcbiAgZGlhZ0NvbmZpZyxcbiAgZGlsYXRpb24yRENvbmZpZyxcbiAgZWluc3VtQ29uZmlnLFxuICBlbHVDb25maWcsXG4gIGVsdUdyYWRDb25maWcsXG4gIGVxdWFsQ29uZmlnLFxuICBlcmZDb25maWcsXG4gIGV4cENvbmZpZyxcbiAgZXhwYW5kRGltc0NvbmZpZyxcbiAgZXhwbTFDb25maWcsXG4gIGZmdENvbmZpZyxcbiAgZmlsbENvbmZpZyxcbiAgZmxpcExlZnRSaWdodENvbmZpZyxcbiAgZmxvb3JDb25maWcsXG4gIGZsb29yRGl2Q29uZmlnLFxuICBmcm9tUGl4ZWxzQ29uZmlnLFxuICBmdXNlZENvbnYyRENvbmZpZyxcbiAgZnVzZWREZXB0aHdpc2VDb252MkRDb25maWcsXG4gIGdhdGhlck5kQ29uZmlnLFxuICBnYXRoZXJWMkNvbmZpZyxcbiAgZ3JlYXRlckNvbmZpZyxcbiAgZ3JlYXRlckVxdWFsQ29uZmlnLFxuICBpZGVudGl0eUNvbmZpZyxcbiAgaWZmdENvbmZpZyxcbiAgaW1hZ0NvbmZpZyxcbiAgaXNGaW5pdGVDb25maWcsXG4gIGlzSW5mQ29uZmlnLFxuICBpc05hTkNvbmZpZyxcbiAgbGVha3lSZWx1Q29uZmlnLFxuICBsZXNzQ29uZmlnLFxuICBsZXNzRXF1YWxDb25maWcsXG4gIGxpblNwYWNlQ29uZmlnLFxuICBsb2cxcENvbmZpZyxcbiAgbG9nQ29uZmlnLFxuICBsb2dpY2FsQW5kQ29uZmlnLFxuICBsb2dpY2FsTm90Q29uZmlnLFxuICBsb2dpY2FsT3JDb25maWcsXG4gIG1heENvbmZpZyxcbiAgbWF4UG9vbDNEQ29uZmlnLFxuICBtYXhQb29sQ29uZmlnLFxuICBtYXhQb29sR3JhZDNEQ29uZmlnLFxuICBtYXhQb29sR3JhZENvbmZpZyxcbiAgbWF4UG9vbFdpdGhBcmdtYXhDb25maWcsXG4gIG1heGltdW1Db25maWcsXG4gIG1lYW5Db25maWcsXG4gIG1pbkNvbmZpZyxcbiAgbWluaW11bUNvbmZpZyxcbiAgbWlycm9yUGFkQ29uZmlnLFxuICBtb2RDb25maWcsXG4gIG11bHRpbm9taWFsQ29uZmlnLFxuICBtdWx0aXBseUNvbmZpZyxcbiAgbmVnQ29uZmlnLFxuICBub25NYXhTdXBwcmVzc2lvblYzQ29uZmlnLFxuICBub25NYXhTdXBwcmVzc2lvblY0Q29uZmlnLFxuICBub25NYXhTdXBwcmVzc2lvblY1Q29uZmlnLFxuICBub3RFcXVhbENvbmZpZyxcbiAgb25lSG90Q29uZmlnLFxuICBvbmVzTGlrZUNvbmZpZyxcbiAgcGFja0NvbmZpZyxcbiAgcGFkVjJDb25maWcsXG4gIHBvd0NvbmZpZyxcbiAgcHJlbHVDb25maWcsXG4gIHByb2RDb25maWcsXG4gIHJhbmdlQ29uZmlnLFxuICByZWFsQ29uZmlnLFxuICByZWFsRGl2Q29uZmlnLFxuICByZWNpcHJvY2FsQ29uZmlnLFxuICByZWx1NkNvbmZpZyxcbiAgcmVsdUNvbmZpZyxcbiAgcmVzaGFwZUNvbmZpZyxcbiAgcmVzaXplQmlsaW5lYXJDb25maWcsXG4gIHJlc2l6ZUJpbGluZWFyR3JhZENvbmZpZyxcbiAgcmVzaXplTmVhcmVzdE5laWdoYm9yQ29uZmlnLFxuICByZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkQ29uZmlnLFxuICByZXZlcnNlQ29uZmlnLFxuICByb3RhdGVXaXRoT2Zmc2V0Q29uZmlnLFxuICByb3VuZENvbmZpZyxcbiAgcnNxcnRDb25maWcsXG4gIHNjYXR0ZXJOZENvbmZpZyxcbiAgc2VsZWN0Q29uZmlnLFxuICBzZWx1Q29uZmlnLFxuICBzaWdtb2lkQ29uZmlnLFxuICBzaWduQ29uZmlnLFxuICBzaW5Db25maWcsXG4gIHNpbmhDb25maWcsXG4gIHNsaWNlQ29uZmlnLFxuICBzb2Z0bWF4Q29uZmlnLFxuICBzb2Z0cGx1c0NvbmZpZyxcbiAgc3BhY2VUb0JhdGNoTkRDb25maWcsXG4gIHNwYXJzZUZpbGxFbXB0eVJvd3NDb25maWcsXG4gIHNwYXJzZVJlc2hhcGVDb25maWcsXG4gIHNwYXJzZVNlZ21lbnRNZWFuQ29uZmlnLFxuICBzcGFyc2VTZWdtZW50U3VtQ29uZmlnLFxuICBzcGFyc2VUb0RlbnNlQ29uZmlnLFxuICBzcGxpdFZDb25maWcsXG4gIHNxcnRDb25maWcsXG4gIHNxdWFyZUNvbmZpZyxcbiAgc3F1YXJlZERpZmZlcmVuY2VDb25maWcsXG4gIHN0ZXBDb25maWcsXG4gIHN0cmlkZWRTbGljZUNvbmZpZyxcbiAgc3RyaW5nTkdyYW1zQ29uZmlnLFxuICBzdHJpbmdTcGxpdENvbmZpZyxcbiAgc3RyaW5nVG9IYXNoQnVja2V0RmFzdENvbmZpZyxcbiAgc3ViQ29uZmlnLFxuICBzdW1Db25maWcsXG4gIHRhbkNvbmZpZyxcbiAgdGFuaENvbmZpZyxcbiAgdGlsZUNvbmZpZyxcbiAgdG9wS0NvbmZpZyxcbiAgdHJhbnNmb3JtQ29uZmlnLFxuICB0cmFuc3Bvc2VDb25maWcsXG4gIHVuaXF1ZUNvbmZpZyxcbiAgdW5wYWNrQ29uZmlnLFxuICB1bnNvcnRlZFNlZ21lbnRTdW1Db25maWcsXG4gIHplcm9zTGlrZUNvbmZpZ1xuXTtcblxuZm9yIChjb25zdCBrZXJuZWxDb25maWcgb2Yga2VybmVsQ29uZmlncykge1xuICByZWdpc3Rlcktlcm5lbChrZXJuZWxDb25maWcpO1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbSwgdXNlU2hhcGVVbmlmb3Jtc30gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCAqIGFzIHNoYWRlcl91dGlsIGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyX3V0aWwnO1xuXG5leHBvcnQgY2xhc3MgUmVzaGFwZVBhY2tlZFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydBJ107XG4gIHBhY2tlZElucHV0cyA9IHRydWU7XG4gIHBhY2tlZE91dHB1dCA9IHRydWU7XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbjtcbiAgY3VzdG9tVW5pZm9ybXMgPSBbe25hbWU6ICdpbnB1dFNoYXBlJywgdHlwZTogJ2l2ZWMzJyBhcyBjb25zdCB9XTtcblxuICBjb25zdHJ1Y3RvcihvdXRwdXRTaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdLCBpbnB1dFNoYXBlOiBbXG4gICAgbnVtYmVyLCBudW1iZXIsIG51bWJlclxuICBdKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IG91dHB1dFNoYXBlO1xuICAgIHRoaXMuZW5hYmxlU2hhcGVVbmlmb3JtcyA9IHVzZVNoYXBlVW5pZm9ybXModGhpcy5vdXRwdXRTaGFwZS5sZW5ndGgpO1xuXG4gICAgbGV0IG1haW5Mb29wID0gYGA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgIGxldCB0aGlzUkMgPSBgdGhpc1JDID0gcmM7YDtcbiAgICAgIGlmIChpICUgMiA9PT0gMSkge1xuICAgICAgICB0aGlzUkMgKz0gYHRoaXNSQy56ICs9IDE7YDtcbiAgICAgIH1cbiAgICAgIGlmIChpID4gMSkge1xuICAgICAgICB0aGlzUkMgKz0gYHRoaXNSQy55ICs9IDE7YDtcbiAgICAgIH1cblxuICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAke3RoaXNSQ31cbiAgICAgICAgJHtpID4gMCA/IGBpZih0aGlzUkMueSA8IHJvd3MgJiYgdGhpc1JDLnogPCBjb2xzKXtgIDogJyd9XG4gICAgICAgICAgaW50IGZsYXRJbmRleCA9IGdldEZsYXRJbmRleCh0aGlzUkMpO1xuXG4gICAgICAgICAgaXZlYzMgaW5wdXRSQyA9IGlucHV0Q29vcmRzRnJvbVJlc2hhcGVkT3V0Q29vcmRzKGZsYXRJbmRleCk7XG4gICAgICAgICAgdmVjMiBpbnB1dFJDSW5uZXJEaW1zID0gdmVjMihmbG9hdChpbnB1dFJDLnkpLGZsb2F0KGlucHV0UkMueikpO1xuXG4gICAgICAgICAgcmVzdWx0WyR7aX1dID1cbiAgICAgICAgICAgIGdldENoYW5uZWwoZ2V0QShpbnB1dFJDLngsIGlucHV0UkMueSwgaW5wdXRSQy56KSwgaW5wdXRSQ0lubmVyRGltcyk7XG4gICAgICAgICR7aSA+IDAgPyAnfScgOiAnJ31cbiAgICAgIGA7XG4gICAgfVxuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICR7Z2V0UmVzaGFwZWRJbnB1dENvb3JkcyhpbnB1dFNoYXBlLCB0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMpfVxuICAgICAgJHtcbiAgICAgICAgdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID8gc2hhZGVyX3V0aWwuZ2V0RmxhdEluZGV4RnJvbTNET3V0cHV0KCkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJfdXRpbC5nZXRGbGF0SW5kZXhGcm9tM0Qob3V0cHV0U2hhcGUpfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWMzIHJjID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG5cbiAgICAgICAgdmVjNCByZXN1bHQgPSB2ZWM0KDAuKTtcblxuICAgICAgICBpdmVjMyB0aGlzUkM7XG4gICAgICAgIGludCByb3dzID0gJHt0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMgPyAnb3V0U2hhcGVbMV0nIDogb3V0cHV0U2hhcGVbMV19O1xuICAgICAgICBpbnQgY29scyA9ICR7dGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID8gJ291dFNoYXBlWzJdJyA6IG91dHB1dFNoYXBlWzJdfTtcblxuICAgICAgICAke21haW5Mb29wfVxuXG4gICAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UmVzaGFwZWRJbnB1dENvb3JkcyhcbiAgICBzaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdLCBlbmFibGVTaGFwZVVuaWZvcm1zOiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgY29vcmRzRnJvbUluZGV4U25pcHBldCA9IGVuYWJsZVNoYXBlVW5pZm9ybXMgP1xuICAgICAgc2hhZGVyX3V0aWwuZ2V0TG9naWNhbENvb3JkaW5hdGVzRnJvbUZsYXRJbmRleEJ5VW5pZm9ybShcbiAgICAgICAgICBbJ3InLCAnYycsICdkJ10sICdpbnB1dFNoYXBlJykgOlxuICAgICAgc2hhZGVyX3V0aWwuZ2V0TG9naWNhbENvb3JkaW5hdGVzRnJvbUZsYXRJbmRleChbJ3InLCAnYycsICdkJ10sIHNoYXBlKTtcblxuICByZXR1cm4gYFxuICAgIGl2ZWMzIGlucHV0Q29vcmRzRnJvbVJlc2hhcGVkT3V0Q29vcmRzKGludCBpbmRleCkge1xuICAgICAgJHtjb29yZHNGcm9tSW5kZXhTbmlwcGV0fVxuICAgICAgcmV0dXJuIGl2ZWMzKHIsIGMsIGQpO1xuICAgIH1cbiAgYDtcbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBSZXNpemVCaWxpbmVhckJhY2twcm9wUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ2R5J107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXSA9IFtdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgZHlTaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICBpbnB1dFNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgYWxpZ25Db3JuZXJzOiBib29sZWFuKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGlucHV0U2hhcGU7XG4gICAgY29uc3QgWywgeEhlaWdodCwgeFdpZHRoLCBdID0gaW5wdXRTaGFwZTtcbiAgICBjb25zdCBbLCB5SGVpZ2h0LCB5V2lkdGhdID0gZHlTaGFwZTtcblxuICAgIC8vIEluIHRoZSBiYWNrd2FyZHMgcGFzcywgd2Ugd2FudCB0byBmaW5kIHRoZSBwaXhlbHMgdGhhdCB3ZXJlIGdlbmVyYXRlZCBmb3JcbiAgICAvLyBlYWNoIHBpeGVsIGluIHRoZSBpbnB1dCBpbWFnZSB0aGUgZm9yd2FyZCBwYXNzIGFuZCBhZGQgdGhlIGNvcnJlc3BvbmRpbmdcbiAgICAvLyBjb2VmZmljaWVudCBmcm9tIGR5IHRvIHRoZSBncmFkaWVudCAod2l0aCBzb21lIGludGVycG9sYXRpb24pLlxuXG4gICAgY29uc3QgZWZmZWN0aXZlWFNpemU6IFtudW1iZXIsIG51bWJlcl0gPSBbXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIHlIZWlnaHQgPiAxKSA/IHhIZWlnaHQgLSAxIDogeEhlaWdodCxcbiAgICAgIChhbGlnbkNvcm5lcnMgJiYgeVdpZHRoID4gMSkgPyB4V2lkdGggLSAxIDogeFdpZHRoXG4gICAgXTtcblxuICAgIGNvbnN0IGVmZmVjdGl2ZVlTaXplOiBbbnVtYmVyLCBudW1iZXJdID0gW1xuICAgICAgKGFsaWduQ29ybmVycyAmJiB5SGVpZ2h0ID4gMSkgPyB5SGVpZ2h0IC0gMSA6IHlIZWlnaHQsXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIHlXaWR0aCA+IDEpID8geVdpZHRoIC0gMSA6IHlXaWR0aFxuICAgIF07XG5cbiAgICBjb25zdCBoZWlnaHRTY2FsZSA9IGVmZmVjdGl2ZVhTaXplWzBdIC8gZWZmZWN0aXZlWVNpemVbMF07XG4gICAgY29uc3Qgd2lkdGhTY2FsZSA9IGVmZmVjdGl2ZVhTaXplWzFdIC8gZWZmZWN0aXZlWVNpemVbMV07XG5cbiAgICBjb25zdCBpbnZIZWlnaHRTY2FsZSA9IDEgLyBoZWlnaHRTY2FsZTtcbiAgICBjb25zdCBpbnZXaWR0aFNjYWxlID0gMSAvIHdpZHRoU2NhbGU7XG5cbiAgICAvLyBUaGlzIGRlZmluZXMgdGhlIHNpemUgb2YgdGhlIHdpbmRvdyBvZiB2YWx1ZXMgYXJvdW5kIGEgcGFydGljdWxhclxuICAgIC8vIGluZGV4IGluIGR5IHRoYXQgd2Ugd2FudCB0byBzZWFyY2ggZm9yIGNvbnRyaWJ1dGlvbnMgdG8gZHguXG4gICAgY29uc3Qgd2luSGVpZ2h0ID0gKE1hdGguY2VpbChpbnZIZWlnaHRTY2FsZSkgKiAyKSArIDI7XG4gICAgY29uc3Qgd2luV2lkdGggPSAoTWF0aC5jZWlsKGludldpZHRoU2NhbGUpICogMikgKyAyO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgZCA9IGNvb3Jkc1szXTtcbiAgICAgICAgaW50IHIgPSBjb29yZHNbMV07XG4gICAgICAgIGludCBjID0gY29vcmRzWzJdO1xuXG4gICAgICAgIGZsb2F0IGFjY3VtdWxhdG9yID0gMC4wO1xuXG4gICAgICAgIGNvbnN0IGZsb2F0IGhlaWdodFNjYWxlID0gZmxvYXQoJHtoZWlnaHRTY2FsZX0pO1xuICAgICAgICBjb25zdCBmbG9hdCB3aWR0aFNjYWxlID0gZmxvYXQoJHt3aWR0aFNjYWxlfSk7XG5cbiAgICAgICAgY29uc3QgZmxvYXQgaW52SGVpZ2h0U2NhbGUgPSBmbG9hdCgke2ludkhlaWdodFNjYWxlfSk7XG4gICAgICAgIGNvbnN0IGZsb2F0IGludldpZHRoU2NhbGUgPSBmbG9hdCgke2ludldpZHRoU2NhbGV9KTtcblxuICAgICAgICBjb25zdCBpbnQgd2luSGVpZ2h0ID0gaW50KCR7d2luSGVpZ2h0fSk7XG4gICAgICAgIGNvbnN0IGludCB3aW5XaWR0aCA9IGludCgke3dpbldpZHRofSk7XG5cbiAgICAgICAgLy8gQ29tcHV0ZSBib3VuZHMgZm9yIHdoZXJlIGluIGR5IHdlIHdpbGwgbG9va1xuICAgICAgICBmbG9hdCBzdGFydFJMZXJwID0gZmxvb3IoZmxvYXQocikgKiBpbnZIZWlnaHRTY2FsZSk7XG4gICAgICAgIGludCBzdGFydER5UiA9IGludChzdGFydFJMZXJwIC0gZmxvYXQod2luSGVpZ2h0IC8gMikpO1xuXG4gICAgICAgIGZsb2F0IHN0YXJ0Q0xlcnAgPSBmbG9vcihmbG9hdChjKSAqIGludldpZHRoU2NhbGUpO1xuICAgICAgICBpbnQgc3RhcnREeUMgPSBpbnQoc3RhcnRDTGVycCAtIGZsb2F0KHdpbldpZHRoIC8gMikpO1xuXG4gICAgICAgIC8vIExvb3Agb3ZlciBkeVxuICAgICAgICBmb3IgKGludCBkeVJPZmZzZXQgPSAwOyBkeVJPZmZzZXQgPCB3aW5IZWlnaHQ7IGR5Uk9mZnNldCsrKSB7XG4gICAgICAgICAgaW50IGR5UiA9IGR5Uk9mZnNldCArIHN0YXJ0RHlSO1xuXG4gICAgICAgICAgLy8gR3VhcmQgYWdhaW5zdCB0aGUgd2luZG93IGV4Y2VlZGluZyB0aGUgYm91bmRzIG9mIGR5XG4gICAgICAgICAgaWYgKGR5UiA8IDAgfHwgZHlSID49ICR7eUhlaWdodH0pIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAoaW50IGR5Q09mZnNldCA9IDA7IGR5Q09mZnNldCA8IHdpbldpZHRoOyBkeUNPZmZzZXQrKykge1xuICAgICAgICAgICAgaW50IGR5QyA9IGR5Q09mZnNldCArIHN0YXJ0RHlDO1xuXG4gICAgICAgICAgICAvLyBHdWFyZCBhZ2FpbnN0IHRoZSB3aW5kb3cgZXhjZWVkaW5nIHRoZSBib3VuZHMgb2YgZHlcbiAgICAgICAgICAgIGlmIChkeUMgPCAwIHx8IGR5QyA+PSAke3lXaWR0aH0pIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZsb2F0IGR4UiA9IGZsb2F0KGR5UikgKiBoZWlnaHRTY2FsZTtcbiAgICAgICAgICAgIGludCB0b3BEeFJJbmRleCA9IGludChmbG9vcihkeFIpKTtcbiAgICAgICAgICAgIGludCBib3R0b21EeFJJbmRleCA9IGludChtaW4oY2VpbChkeFIpLCAke3hIZWlnaHQgLSAxfS4wKSk7XG4gICAgICAgICAgICBmbG9hdCBkeFJMZXJwID0gZHhSIC0gZmxvYXQodG9wRHhSSW5kZXgpO1xuICAgICAgICAgICAgZmxvYXQgaW52ZXJzZUR4UkxlcnAgPSAxLjAgLSBkeFJMZXJwO1xuXG4gICAgICAgICAgICBmbG9hdCBkeEMgPSBmbG9hdChkeUMpICogd2lkdGhTY2FsZTtcbiAgICAgICAgICAgIGludCBsZWZ0RHhDSW5kZXggPSBpbnQoZmxvb3IoZHhDKSk7XG4gICAgICAgICAgICBpbnQgcmlnaHREeENJbmRleCA9IGludChtaW4oY2VpbChkeEMpLCAke3hXaWR0aCAtIDF9LjApKTtcbiAgICAgICAgICAgIGZsb2F0IGR4Q0xlcnAgPSBkeEMgLSBmbG9hdChsZWZ0RHhDSW5kZXgpO1xuICAgICAgICAgICAgZmxvYXQgaW52ZXJzZUR4Q0xlcnAgPSAxLjAgLSBkeENMZXJwO1xuXG4gICAgICAgICAgICBpZiAociA9PSB0b3BEeFJJbmRleCAmJiBjID09IGxlZnREeENJbmRleCkge1xuICAgICAgICAgICAgICAvLyB0b3BMZWZ0XG4gICAgICAgICAgICAgIGFjY3VtdWxhdG9yICs9XG4gICAgICAgICAgICAgICAgZ2V0RHkoYiwgZHlSLCBkeUMsIGQpICogaW52ZXJzZUR4UkxlcnAgKiBpbnZlcnNlRHhDTGVycDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHIgPT0gdG9wRHhSSW5kZXggJiYgYyA9PSByaWdodER4Q0luZGV4KSB7XG4gICAgICAgICAgICAgIC8vIHRvcFJpZ2h0XG4gICAgICAgICAgICAgIGFjY3VtdWxhdG9yICs9IGdldER5KGIsIGR5UiwgZHlDLCBkKSAqIGludmVyc2VEeFJMZXJwICogZHhDTGVycDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHIgPT0gYm90dG9tRHhSSW5kZXggJiYgYyA9PSBsZWZ0RHhDSW5kZXgpIHtcbiAgICAgICAgICAgICAgLy8gYm90dG9tTGVmdFxuICAgICAgICAgICAgICBhY2N1bXVsYXRvciArPSBnZXREeShiLCBkeVIsIGR5QywgZCkgKiBkeFJMZXJwICogaW52ZXJzZUR4Q0xlcnA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyID09IGJvdHRvbUR4UkluZGV4ICYmIGMgPT0gcmlnaHREeENJbmRleCkge1xuICAgICAgICAgICAgICAvLyBib3R0b21SaWdodFxuICAgICAgICAgICAgICBhY2N1bXVsYXRvciArPSBnZXREeShiLCBkeVIsIGR5QywgZCkgKiBkeFJMZXJwICogZHhDTGVycDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gRW5kIGxvb3Agb3ZlciBkeVxuXG4gICAgICAgIHNldE91dHB1dChhY2N1bXVsYXRvcik7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIFJlc2l6ZUJpbGluZWFyUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdID0gW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBpbnB1dFNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgbmV3SGVpZ2h0OiBudW1iZXIsXG4gICAgICBuZXdXaWR0aDogbnVtYmVyLCBhbGlnbkNvcm5lcnM6IGJvb2xlYW4sIGhhbGZQaXhlbENlbnRlcnM6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBbYmF0Y2gsIG9sZEhlaWdodCwgb2xkV2lkdGgsIGRlcHRoXSA9IGlucHV0U2hhcGU7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IFtiYXRjaCwgbmV3SGVpZ2h0LCBuZXdXaWR0aCwgZGVwdGhdO1xuXG4gICAgY29uc3QgZWZmZWN0aXZlSW5TaXplOiBbbnVtYmVyLCBudW1iZXJdID0gW1xuICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdIZWlnaHQgPiAxKSA/IG9sZEhlaWdodCAtIDEgOiBvbGRIZWlnaHQsXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld1dpZHRoID4gMSkgPyBvbGRXaWR0aCAtIDEgOiBvbGRXaWR0aFxuICAgIF07XG5cbiAgICBjb25zdCBlZmZlY3RpdmVPdXRTaXplOiBbbnVtYmVyLCBudW1iZXJdID0gW1xuICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdIZWlnaHQgPiAxKSA/IG5ld0hlaWdodCAtIDEgOiBuZXdIZWlnaHQsXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld1dpZHRoID4gMSkgPyBuZXdXaWR0aCAtIDEgOiBuZXdXaWR0aFxuICAgIF07XG5cbiAgICBsZXQgc291cmNlRnJhY0luZGV4UkM6IHN0cmluZztcbiAgICBpZiAoaGFsZlBpeGVsQ2VudGVycykge1xuICAgICAgc291cmNlRnJhY0luZGV4UkMgPVxuICAgICAgICAgIGAodmVjMih5UkMpICsgdmVjMigwLjUpKSAqIGVmZmVjdGl2ZUlucHV0T3Zlck91dHB1dFJhdGlvUkNgICtcbiAgICAgICAgICBgIC0gdmVjMigwLjUpYDtcbiAgICB9IGVsc2Uge1xuICAgICAgc291cmNlRnJhY0luZGV4UkMgPSBgdmVjMih5UkMpICogZWZmZWN0aXZlSW5wdXRPdmVyT3V0cHV0UmF0aW9SQ2A7XG4gICAgfVxuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IHZlYzIgZWZmZWN0aXZlSW5wdXRPdmVyT3V0cHV0UmF0aW9SQyA9IHZlYzIoXG4gICAgICAgICAgJHtlZmZlY3RpdmVJblNpemVbMF0gLyBlZmZlY3RpdmVPdXRTaXplWzBdfSxcbiAgICAgICAgICAke2VmZmVjdGl2ZUluU2l6ZVsxXSAvIGVmZmVjdGl2ZU91dFNpemVbMV19KTtcbiAgICAgIGNvbnN0IHZlYzIgaW5wdXRTaGFwZVJDID0gdmVjMigke29sZEhlaWdodH0uMCwgJHtvbGRXaWR0aH0uMCk7XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgZCA9IGNvb3Jkc1szXTtcbiAgICAgICAgaXZlYzIgeVJDID0gY29vcmRzLnl6O1xuXG4gICAgICAgIC8vIEZyYWN0aW9uYWwgc291cmNlIGluZGV4LlxuICAgICAgICB2ZWMyIHNvdXJjZUZyYWNJbmRleFJDID0gJHtzb3VyY2VGcmFjSW5kZXhSQ307XG5cbiAgICAgICAgLy8gQ29tcHV0ZSB0aGUgZm91ciBpbnRlZ2VyIGluZGljZXMuXG4gICAgICAgIGl2ZWMyIHNvdXJjZUZsb29yUkMgPSBpdmVjMihtYXgoc291cmNlRnJhY0luZGV4UkMsIHZlYzIoMC4wKSkpO1xuICAgICAgICBpdmVjMiBzb3VyY2VDZWlsUkMgPSBpdmVjMihcbiAgICAgICAgICBtaW4oaW5wdXRTaGFwZVJDIC0gMS4wLCBjZWlsKHNvdXJjZUZyYWNJbmRleFJDKSkpO1xuXG4gICAgICAgIGZsb2F0IHRvcExlZnQgPSBnZXRBKGIsIHNvdXJjZUZsb29yUkMueCwgc291cmNlRmxvb3JSQy55LCBkKTtcbiAgICAgICAgZmxvYXQgYm90dG9tTGVmdCA9IGdldEEoYiwgc291cmNlQ2VpbFJDLngsIHNvdXJjZUZsb29yUkMueSwgZCk7XG4gICAgICAgIGZsb2F0IHRvcFJpZ2h0ID0gZ2V0QShiLCBzb3VyY2VGbG9vclJDLngsIHNvdXJjZUNlaWxSQy55LCBkKTtcbiAgICAgICAgZmxvYXQgYm90dG9tUmlnaHQgPSBnZXRBKGIsIHNvdXJjZUNlaWxSQy54LCBzb3VyY2VDZWlsUkMueSwgZCk7XG5cbiAgICAgICAgdmVjMiBmcmFjUkMgPSBzb3VyY2VGcmFjSW5kZXhSQyAtIHZlYzIoc291cmNlRmxvb3JSQyk7XG5cbiAgICAgICAgZmxvYXQgdG9wID0gdG9wTGVmdCArICh0b3BSaWdodCAtIHRvcExlZnQpICogZnJhY1JDLnk7XG4gICAgICAgIGZsb2F0IGJvdHRvbSA9IGJvdHRvbUxlZnQgKyAoYm90dG9tUmlnaHQgLSBib3R0b21MZWZ0KSAqIGZyYWNSQy55O1xuICAgICAgICBmbG9hdCBuZXdWYWx1ZSA9IHRvcCArIChib3R0b20gLSB0b3ApICogZnJhY1JDLng7XG5cbiAgICAgICAgc2V0T3V0cHV0KG5ld1ZhbHVlKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgUmVzaXplQmlsaW5lYXJQYWNrZWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICBwYWNrZWRJbnB1dHMgPSB0cnVlO1xuICBwYWNrZWRPdXRwdXQgPSB0cnVlO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW10gPSBbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIGlucHV0U2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBuZXdIZWlnaHQ6IG51bWJlcixcbiAgICAgIG5ld1dpZHRoOiBudW1iZXIsIGFsaWduQ29ybmVyczogYm9vbGVhbiwgaGFsZlBpeGVsQ2VudGVyczogYm9vbGVhbikge1xuICAgIGNvbnN0IFtiYXRjaCwgb2xkSGVpZ2h0LCBvbGRXaWR0aCwgZGVwdGhdID0gaW5wdXRTaGFwZTtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gW2JhdGNoLCBuZXdIZWlnaHQsIG5ld1dpZHRoLCBkZXB0aF07XG5cbiAgICBjb25zdCBlZmZlY3RpdmVJblNpemU6IFtudW1iZXIsIG51bWJlcl0gPSBbXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld0hlaWdodCA+IDEpID8gb2xkSGVpZ2h0IC0gMSA6IG9sZEhlaWdodCxcbiAgICAgIChhbGlnbkNvcm5lcnMgJiYgbmV3V2lkdGggPiAxKSA/IG9sZFdpZHRoIC0gMSA6IG9sZFdpZHRoXG4gICAgXTtcblxuICAgIGNvbnN0IGVmZmVjdGl2ZU91dFNpemU6IFtudW1iZXIsIG51bWJlcl0gPSBbXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld0hlaWdodCA+IDEpID8gbmV3SGVpZ2h0IC0gMSA6IG5ld0hlaWdodCxcbiAgICAgIChhbGlnbkNvcm5lcnMgJiYgbmV3V2lkdGggPiAxKSA/IG5ld1dpZHRoIC0gMSA6IG5ld1dpZHRoXG4gICAgXTtcblxuICAgIGxldCBzb3VyY2VGcmFjSW5kZXhSQzogc3RyaW5nO1xuICAgIGlmIChoYWxmUGl4ZWxDZW50ZXJzKSB7XG4gICAgICBzb3VyY2VGcmFjSW5kZXhSQyA9IGAodmVjMyh5UkMpICsgdmVjMygwLjUpKSAqIGAgK1xuICAgICAgICAgIGBlZmZlY3RpdmVJbnB1dE92ZXJPdXRwdXRSYXRpb1JDIC0gdmVjMygwLjUpYDtcbiAgICB9IGVsc2Uge1xuICAgICAgc291cmNlRnJhY0luZGV4UkMgPSBgdmVjMyh5UkMpICogZWZmZWN0aXZlSW5wdXRPdmVyT3V0cHV0UmF0aW9SQ2A7XG4gICAgfVxuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IHZlYzMgZWZmZWN0aXZlSW5wdXRPdmVyT3V0cHV0UmF0aW9SQyA9IHZlYzMoXG4gICAgICAgICAgJHtlZmZlY3RpdmVJblNpemVbMF0gLyBlZmZlY3RpdmVPdXRTaXplWzBdfSxcbiAgICAgICAgICAke2VmZmVjdGl2ZUluU2l6ZVsxXSAvIGVmZmVjdGl2ZU91dFNpemVbMV19LFxuICAgICAgICAgICR7ZWZmZWN0aXZlSW5TaXplWzFdIC8gZWZmZWN0aXZlT3V0U2l6ZVsxXX0pO1xuICAgICAgY29uc3QgdmVjMyBpbnB1dFNoYXBlUkMgPSB2ZWMzKCR7b2xkSGVpZ2h0fS4wLCAke29sZFdpZHRofS4wLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7b2xkV2lkdGh9LjApO1xuXG4gICAgICBmbG9hdCBnZXRBVmFsdWUoaW50IGIsIGludCByLCBpbnQgYywgaW50IGQpIHtcbiAgICAgICAgcmV0dXJuIGdldENoYW5uZWwoZ2V0QShiLCByLCBjLCBkKSwgdmVjMihjLCBkKSk7XG4gICAgICB9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgZCA9IGNvb3Jkc1szXTtcbiAgICAgICAgLy8gQ2FsY3VsYXRlIHZhbHVlcyBmb3IgbmV4dCBjb2x1bW4gaW4geVJDLnouXG4gICAgICAgIGl2ZWMzIHlSQyA9IGNvb3Jkcy55enogKyBpdmVjMygwLCAwLCAxKTtcblxuICAgICAgICAvLyBGcmFjdGlvbmFsIHNvdXJjZSBpbmRleC5cbiAgICAgICAgdmVjMyBzb3VyY2VGcmFjSW5kZXhSQyA9ICR7c291cmNlRnJhY0luZGV4UkN9O1xuXG4gICAgICAgIC8vIENvbXB1dGUgdGhlIGZvdXIgaW50ZWdlciBpbmRpY2VzLlxuICAgICAgICBpdmVjMyBzb3VyY2VGbG9vclJDID0gaXZlYzMobWF4KHNvdXJjZUZyYWNJbmRleFJDLCB2ZWMzKDAuMCkpKTtcbiAgICAgICAgaXZlYzMgc291cmNlQ2VpbFJDID0gaXZlYzMoXG4gICAgICAgICAgbWluKGlucHV0U2hhcGVSQyAtIDEuMCwgY2VpbChzb3VyY2VGcmFjSW5kZXhSQykpKTtcblxuICAgICAgICAvLyBTaG91bGQgd2UgY2FsY3VsYXRlIG5leHQgY29sdW1uIGFuZCByb3cgZWxlbWVudHMgaW4gMngyIHBhY2tlZCBjZWxsLlxuICAgICAgICBib29sIGhhc05leHRDb2wgPSBkIDwgJHtkZXB0aCAtIDF9O1xuICAgICAgICBib29sIGhhc05leHRSb3cgPSBjb29yZHMueiA8ICR7bmV3V2lkdGggLSAxfTtcblxuICAgICAgICAvLyBJbiBwYXJhbGxlbCwgY29uc3RydWN0IGZvdXIgY29ybmVycyBmb3IgYWxsIGZvdXIgY29tcG9uZW50cyBpblxuICAgICAgICAvLyBwYWNrZWQgMngyIGNlbGwuXG4gICAgICAgIHZlYzQgdG9wTGVmdCA9IHZlYzQoXG4gICAgICAgICAgZ2V0QVZhbHVlKGIsIHNvdXJjZUZsb29yUkMueCwgc291cmNlRmxvb3JSQy55LCBkKSxcbiAgICAgICAgICBoYXNOZXh0Q29sID8gZ2V0QVZhbHVlKGIsIHNvdXJjZUZsb29yUkMueCwgc291cmNlRmxvb3JSQy55LCBkICsgMSlcbiAgICAgICAgICAgICAgICAgICAgIDogMC4wLFxuICAgICAgICAgIGhhc05leHRSb3cgPyBnZXRBVmFsdWUoYiwgc291cmNlRmxvb3JSQy54LCBzb3VyY2VGbG9vclJDLnosIGQpXG4gICAgICAgICAgICAgICAgICAgICA6IDAuMCxcbiAgICAgICAgICAoaGFzTmV4dFJvdyAmJiBoYXNOZXh0Q29sKSA/XG4gICAgICAgICAgICBnZXRBVmFsdWUoYiwgc291cmNlRmxvb3JSQy54LCBzb3VyY2VGbG9vclJDLnosIGQgKyAxKSA6IDAuMCk7XG5cbiAgICAgICAgdmVjNCBib3R0b21MZWZ0ID0gdmVjNChcbiAgICAgICAgICBnZXRBVmFsdWUoYiwgc291cmNlQ2VpbFJDLngsIHNvdXJjZUZsb29yUkMueSwgZCksXG4gICAgICAgICAgaGFzTmV4dENvbCA/IGdldEFWYWx1ZShiLCBzb3VyY2VDZWlsUkMueCwgc291cmNlRmxvb3JSQy55LCBkICsgMSlcbiAgICAgICAgICAgICAgICAgICAgIDogMC4wLFxuICAgICAgICAgIGhhc05leHRSb3cgPyBnZXRBVmFsdWUoYiwgc291cmNlQ2VpbFJDLngsIHNvdXJjZUZsb29yUkMueiwgZClcbiAgICAgICAgICAgICAgICAgICAgIDogMC4wLFxuICAgICAgICAgIChoYXNOZXh0Um93ICYmIGhhc05leHRDb2wpID9cbiAgICAgICAgICAgIGdldEFWYWx1ZShiLCBzb3VyY2VDZWlsUkMueCwgc291cmNlRmxvb3JSQy56LCBkICsgMSkgOiAwLjApO1xuXG4gICAgICAgIHZlYzQgdG9wUmlnaHQgPSB2ZWM0KFxuICAgICAgICAgIGdldEFWYWx1ZShiLCBzb3VyY2VGbG9vclJDLngsIHNvdXJjZUNlaWxSQy55LCBkKSxcbiAgICAgICAgICBoYXNOZXh0Q29sID8gZ2V0QVZhbHVlKGIsIHNvdXJjZUZsb29yUkMueCwgc291cmNlQ2VpbFJDLnksIGQgKyAxKVxuICAgICAgICAgICAgICAgICAgICAgOiAwLjAsXG4gICAgICAgICAgaGFzTmV4dFJvdyA/IGdldEFWYWx1ZShiLCBzb3VyY2VGbG9vclJDLngsIHNvdXJjZUNlaWxSQy56LCBkKVxuICAgICAgICAgICAgICAgICAgICAgOiAwLjAsXG4gICAgICAgICAgKGhhc05leHRSb3cgJiYgaGFzTmV4dENvbCkgP1xuICAgICAgICAgICAgZ2V0QVZhbHVlKGIsIHNvdXJjZUZsb29yUkMueCwgc291cmNlQ2VpbFJDLnosIGQgKyAxKSA6IDAuMCk7XG5cbiAgICAgICAgdmVjNCBib3R0b21SaWdodCA9IHZlYzQoXG4gICAgICAgICAgZ2V0QVZhbHVlKGIsIHNvdXJjZUNlaWxSQy54LCBzb3VyY2VDZWlsUkMueSwgZCksXG4gICAgICAgICAgaGFzTmV4dENvbCA/IGdldEFWYWx1ZShiLCBzb3VyY2VDZWlsUkMueCwgc291cmNlQ2VpbFJDLnksIGQgKyAxKVxuICAgICAgICAgICAgICAgICAgICAgOiAwLjAsXG4gICAgICAgICAgaGFzTmV4dFJvdyA/IGdldEFWYWx1ZShiLCBzb3VyY2VDZWlsUkMueCwgc291cmNlQ2VpbFJDLnosIGQpXG4gICAgICAgICAgICAgICAgICAgICA6IDAuMCxcbiAgICAgICAgICAoaGFzTmV4dFJvdyAmJiBoYXNOZXh0Q29sKSA/XG4gICAgICAgICAgICBnZXRBVmFsdWUoYiwgc291cmNlQ2VpbFJDLngsIHNvdXJjZUNlaWxSQy56LCBkICsgMSkgOiAwLjApO1xuXG4gICAgICAgIHZlYzMgZnJhY1JDID0gc291cmNlRnJhY0luZGV4UkMgLSB2ZWMzKHNvdXJjZUZsb29yUkMpO1xuXG4gICAgICAgIHZlYzQgdG9wID0gbWl4KHRvcExlZnQsIHRvcFJpZ2h0LCBmcmFjUkMueXl6eik7XG4gICAgICAgIHZlYzQgYm90dG9tID0gbWl4KGJvdHRvbUxlZnQsIGJvdHRvbVJpZ2h0LCBmcmFjUkMueXl6eik7XG4gICAgICAgIHZlYzQgbmV3VmFsdWUgPSBtaXgodG9wLCBib3R0b20sIGZyYWNSQy54KTtcblxuICAgICAgICBzZXRPdXRwdXQobmV3VmFsdWUpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBSZXNpemVOZWFyZXN0TmVpZ2JvckJhY2twcm9wUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ2R5J107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXSA9IFtdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgZHlTaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICBpbnB1dFNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgYWxpZ25Db3JuZXJzOiBib29sZWFuKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGlucHV0U2hhcGU7XG4gICAgY29uc3QgWywgeEhlaWdodCwgeFdpZHRoLCBdID0gaW5wdXRTaGFwZTtcbiAgICBjb25zdCBbLCB5SGVpZ2h0LCB5V2lkdGhdID0gZHlTaGFwZTtcblxuICAgIC8vIEluIHRoZSBiYWNrd2FyZHMgcGFzcywgd2Ugd2FudCB0byBmaW5kIHRoZSBwaXhlbHMgdGhhdCB3ZXJlIGdlbmVyYXRlZCBmb3JcbiAgICAvLyBlYWNoIHBpeGVsIGluIHRoZSBpbnB1dCBpbWFnZSB0aGUgZm9yd2FyZCBwYXNzIGFuZCBhZGQgdGhlIGNvcnJlc3BvbmRpbmdcbiAgICAvLyBjb2VmZmljaWVudCBmcm9tIGR5IHRvIHRoZSBncmFkaWVudCAod2l0aCBzb21lIGludGVycG9sYXRpb24pLlxuXG4gICAgY29uc3QgZWZmZWN0aXZlWFNpemU6IFtudW1iZXIsIG51bWJlcl0gPSBbXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIHlIZWlnaHQgPiAxKSA/IHhIZWlnaHQgLSAxIDogeEhlaWdodCxcbiAgICAgIChhbGlnbkNvcm5lcnMgJiYgeVdpZHRoID4gMSkgPyB4V2lkdGggLSAxIDogeFdpZHRoXG4gICAgXTtcblxuICAgIGNvbnN0IGVmZmVjdGl2ZVlTaXplOiBbbnVtYmVyLCBudW1iZXJdID0gW1xuICAgICAgKGFsaWduQ29ybmVycyAmJiB5SGVpZ2h0ID4gMSkgPyB5SGVpZ2h0IC0gMSA6IHlIZWlnaHQsXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIHlXaWR0aCA+IDEpID8geVdpZHRoIC0gMSA6IHlXaWR0aFxuICAgIF07XG5cbiAgICBjb25zdCBoZWlnaHRTY2FsZSA9IGVmZmVjdGl2ZVhTaXplWzBdIC8gZWZmZWN0aXZlWVNpemVbMF07XG4gICAgY29uc3Qgd2lkdGhTY2FsZSA9IGVmZmVjdGl2ZVhTaXplWzFdIC8gZWZmZWN0aXZlWVNpemVbMV07XG5cbiAgICBjb25zdCBpbnZIZWlnaHRTY2FsZSA9IDEgLyBoZWlnaHRTY2FsZTtcbiAgICBjb25zdCBpbnZXaWR0aFNjYWxlID0gMSAvIHdpZHRoU2NhbGU7XG5cbiAgICAvLyBUaGlzIGRlZmluZXMgdGhlIHNpemUgb2YgdGhlIHdpbmRvdyBvZiB2YWx1ZXMgYXJvdW5kIGEgcGFydGljdWxhclxuICAgIC8vIGluZGV4IGluIGR5IHRoYXQgd2Ugd2FudCB0byBzZWFyY2ggZm9yIGNvbnRyaWJ1dGlvbnMgdG8gZHguXG4gICAgY29uc3Qgd2luSGVpZ2h0ID0gKE1hdGguY2VpbChpbnZIZWlnaHRTY2FsZSkgKiAyKSArIDI7XG4gICAgY29uc3Qgd2luV2lkdGggPSAoTWF0aC5jZWlsKGludldpZHRoU2NhbGUpICogMikgKyAyO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgZCA9IGNvb3Jkc1szXTtcbiAgICAgICAgaW50IHIgPSBjb29yZHNbMV07XG4gICAgICAgIGludCBjID0gY29vcmRzWzJdO1xuXG4gICAgICAgIGZsb2F0IGFjY3VtdWxhdG9yID0gMC4wO1xuXG4gICAgICAgIGNvbnN0IGZsb2F0IGhlaWdodFNjYWxlID0gZmxvYXQoJHtoZWlnaHRTY2FsZX0pO1xuICAgICAgICBjb25zdCBmbG9hdCB3aWR0aFNjYWxlID0gZmxvYXQoJHt3aWR0aFNjYWxlfSk7XG5cbiAgICAgICAgY29uc3QgZmxvYXQgaW52SGVpZ2h0U2NhbGUgPSBmbG9hdCgke2ludkhlaWdodFNjYWxlfSk7XG4gICAgICAgIGNvbnN0IGZsb2F0IGludldpZHRoU2NhbGUgPSBmbG9hdCgke2ludldpZHRoU2NhbGV9KTtcblxuICAgICAgICBjb25zdCBpbnQgd2luSGVpZ2h0ID0gaW50KCR7d2luSGVpZ2h0fSk7XG4gICAgICAgIGNvbnN0IGludCB3aW5XaWR0aCA9IGludCgke3dpbldpZHRofSk7XG5cbiAgICAgICAgLy8gQ29tcHV0ZSBib3VuZHMgZm9yIHdoZXJlIGluIGR5IHdlIHdpbGwgbG9va1xuICAgICAgICBmbG9hdCBzdGFydFJMZXJwID0gZmxvb3IoZmxvYXQocikgKiBpbnZIZWlnaHRTY2FsZSk7XG4gICAgICAgIGludCBzdGFydER5UiA9IGludChmbG9vcihzdGFydFJMZXJwIC0gZmxvYXQod2luSGVpZ2h0IC8gMikpKTtcblxuICAgICAgICBmbG9hdCBzdGFydENMZXJwID0gZmxvb3IoZmxvYXQoYykgKiBpbnZXaWR0aFNjYWxlKTtcbiAgICAgICAgaW50IHN0YXJ0RHlDID0gaW50KGZsb29yKHN0YXJ0Q0xlcnAgLSBmbG9hdCh3aW5XaWR0aCAvIDIpKSk7XG5cbiAgICAgICAgLy8gTG9vcCBvdmVyIGR5XG4gICAgICAgIGZvciAoaW50IGR5Uk9mZnNldCA9IDA7IGR5Uk9mZnNldCA8IHdpbkhlaWdodDsgZHlST2Zmc2V0KyspIHtcbiAgICAgICAgICBpbnQgZHlSID0gZHlST2Zmc2V0ICsgc3RhcnREeVI7XG5cbiAgICAgICAgICAvLyBHdWFyZCBhZ2FpbnN0IHRoZSB3aW5kb3cgZXhjZWVkaW5nIHRoZSBib3VuZHMgb2YgZHlcbiAgICAgICAgICBpZiAoZHlSIDwgMCB8fCBkeVIgPj0gJHt5SGVpZ2h0fSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yIChpbnQgZHlDT2Zmc2V0ID0gMDsgZHlDT2Zmc2V0IDwgd2luV2lkdGg7IGR5Q09mZnNldCsrKSB7XG4gICAgICAgICAgICBpbnQgZHlDID0gZHlDT2Zmc2V0ICsgc3RhcnREeUM7XG5cbiAgICAgICAgICAgIC8vIEd1YXJkIGFnYWluc3QgdGhlIHdpbmRvdyBleGNlZWRpbmcgdGhlIGJvdW5kcyBvZiBkeVxuICAgICAgICAgICAgaWYgKGR5QyA8IDAgfHwgZHlDID49ICR7eVdpZHRofSkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZmxvYXQgc291cmNlRnJhY1JvdyA9XG4gICAgICAgICAgICAgIGZsb2F0KCR7ZWZmZWN0aXZlWFNpemVbMF19KSAqXG4gICAgICAgICAgICAgICAgKGZsb2F0KGR5UikgLyBmbG9hdCgke2VmZmVjdGl2ZVlTaXplWzBdfSkpO1xuXG4gICAgICAgICAgICBmbG9hdCBzb3VyY2VGcmFjQ29sID1cbiAgICAgICAgICAgICAgICBmbG9hdCgke2VmZmVjdGl2ZVhTaXplWzFdfSkgKlxuICAgICAgICAgICAgICAgICAgKGZsb2F0KGR5QykgLyBmbG9hdCgke2VmZmVjdGl2ZVlTaXplWzFdfSkpO1xuXG4gICAgICAgICAgICBpbnQgc291cmNlTmVhcmVzdFJvdyA9IGludChtaW4oXG4gICAgICAgICAgICAgICAgZmxvYXQoaW50KCR7eEhlaWdodH0pIC0gMSksXG4gICAgICAgICAgICAgICAgJHthbGlnbkNvcm5lcnN9ID8gZmxvYXQocm91bmQoc291cmNlRnJhY1JvdykpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdChmbG9vcihzb3VyY2VGcmFjUm93KSkpKTtcblxuICAgICAgICAgICAgaW50IHNvdXJjZU5lYXJlc3RDb2wgPSBpbnQobWluKFxuICAgICAgICAgICAgICAgIGZsb2F0KGludCgke3hXaWR0aH0pIC0gMSksXG4gICAgICAgICAgICAgICAgJHthbGlnbkNvcm5lcnN9ID8gZmxvYXQocm91bmQoc291cmNlRnJhY0NvbCkpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdChmbG9vcihzb3VyY2VGcmFjQ29sKSkpKTtcblxuICAgICAgICAgICAgaWYgKHIgPT0gc291cmNlTmVhcmVzdFJvdyAmJiBjID09IHNvdXJjZU5lYXJlc3RDb2wpIHtcbiAgICAgICAgICAgICAgYWNjdW11bGF0b3IgKz0gZ2V0RHkoYiwgZHlSLCBkeUMsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBFbmQgbG9vcCBvdmVyIGR5XG5cbiAgICAgICAgc2V0T3V0cHV0KGFjY3VtdWxhdG9yKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgUmVzaXplTmVhcmVzdE5laWdoYm9yUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdID0gW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBpbnB1dFNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgbmV3SGVpZ2h0OiBudW1iZXIsXG4gICAgICBuZXdXaWR0aDogbnVtYmVyLCBhbGlnbkNvcm5lcnM6IGJvb2xlYW4sIGhhbGZQaXhlbENlbnRlcnM6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBbYmF0Y2gsIG9sZEhlaWdodCwgb2xkV2lkdGgsIGRlcHRoXSA9IGlucHV0U2hhcGU7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IFtiYXRjaCwgbmV3SGVpZ2h0LCBuZXdXaWR0aCwgZGVwdGhdO1xuXG4gICAgY29uc3QgZWZmZWN0aXZlSW5TaXplOiBbbnVtYmVyLCBudW1iZXJdID0gW1xuICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdIZWlnaHQgPiAxKSA/IG9sZEhlaWdodCAtIDEgOiBvbGRIZWlnaHQsXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld1dpZHRoID4gMSkgPyBvbGRXaWR0aCAtIDEgOiBvbGRXaWR0aFxuICAgIF07XG5cbiAgICBjb25zdCBlZmZlY3RpdmVPdXRTaXplOiBbbnVtYmVyLCBudW1iZXJdID0gW1xuICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdIZWlnaHQgPiAxKSA/IG5ld0hlaWdodCAtIDEgOiBuZXdIZWlnaHQsXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld1dpZHRoID4gMSkgPyBuZXdXaWR0aCAtIDEgOiBuZXdXaWR0aFxuICAgIF07XG5cbiAgICAvLyBXaGVuIGFsaWduIGNvcm5lcnMgaXMgZmFsc2UsIHdlIHJvdW5kcyB0aGUgdmFsdWUgd2l0aCBmbG9vci5cbiAgICBjb25zdCByb3VuZEJhc2UgPSBhbGlnbkNvcm5lcnMgPyAnMC41JyA6ICcwLjAnO1xuXG4gICAgbGV0IHNvdXJjZUZyYWNJbmRleFJDOiBzdHJpbmc7XG4gICAgaWYgKGhhbGZQaXhlbENlbnRlcnMpIHtcbiAgICAgIHNvdXJjZUZyYWNJbmRleFJDID1cbiAgICAgICAgICBgbWF4KCh2ZWMyKHlSQykgKyB2ZWMyKDAuNSkpICogZWZmZWN0aXZlSW5wdXRPdmVyT3V0cHV0UmF0aW9SQ2AgK1xuICAgICAgICAgIGAsIHZlYzIoMC4wKSlgO1xuICAgIH0gZWxzZSB7XG4gICAgICBzb3VyY2VGcmFjSW5kZXhSQyA9IGB2ZWMyKHlSQykgKiBlZmZlY3RpdmVJbnB1dE92ZXJPdXRwdXRSYXRpb1JDYDtcbiAgICB9XG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IHZlYzIgZWZmZWN0aXZlSW5wdXRPdmVyT3V0cHV0UmF0aW9SQyA9IHZlYzIoXG4gICAgICAgICAgJHtlZmZlY3RpdmVJblNpemVbMF0gLyBlZmZlY3RpdmVPdXRTaXplWzBdfSxcbiAgICAgICAgICAke2VmZmVjdGl2ZUluU2l6ZVsxXSAvIGVmZmVjdGl2ZU91dFNpemVbMV19KTtcbiAgICAgIGNvbnN0IHZlYzIgaW5wdXRTaGFwZVJDID0gdmVjMigke29sZEhlaWdodH0uMCwgJHtvbGRXaWR0aH0uMCk7XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgZCA9IGNvb3Jkc1szXTtcbiAgICAgICAgaXZlYzIgeVJDID0gY29vcmRzLnl6O1xuXG4gICAgICAgIC8vIEZyYWN0aW9uYWwgc291cmNlIGluZGV4LlxuICAgICAgICB2ZWMyIHNvdXJjZUZyYWNJbmRleFJDID0gJHtzb3VyY2VGcmFjSW5kZXhSQ307XG5cbiAgICAgICAgLy8gQ29tcHV0ZSB0aGUgY29vcmRpbmF0b3JzIG9mIG5lYXJlc3QgbmVpZ2hib3IgcG9pbnQuXG4gICAgICAgIGl2ZWMyIHNvdXJjZU5lYXJlc3RSQyA9IGl2ZWMyKFxuICAgICAgICAgIG1pbihpbnB1dFNoYXBlUkMgLSAxLjAsIGZsb29yKHNvdXJjZUZyYWNJbmRleFJDICsgJHtyb3VuZEJhc2V9KSkpO1xuICAgICAgICBmbG9hdCBuZXdWYWx1ZSA9IGdldEEoYiwgc291cmNlTmVhcmVzdFJDLngsIHNvdXJjZU5lYXJlc3RSQy55LCBkKTtcblxuICAgICAgICBzZXRPdXRwdXQobmV3VmFsdWUpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBSZXNpemVOZWFyZXN0TmVpZ2hib3JQYWNrZWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICBwYWNrZWRJbnB1dHMgPSB0cnVlO1xuICBwYWNrZWRPdXRwdXQgPSB0cnVlO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW10gPSBbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIGlucHV0U2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBuZXdIZWlnaHQ6IG51bWJlcixcbiAgICAgIG5ld1dpZHRoOiBudW1iZXIsIGFsaWduQ29ybmVyczogYm9vbGVhbiwgaGFsZlBpeGVsQ2VudGVyczogYm9vbGVhbikge1xuICAgIGNvbnN0IFtiYXRjaCwgb2xkSGVpZ2h0LCBvbGRXaWR0aCwgZGVwdGhdID0gaW5wdXRTaGFwZTtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gW2JhdGNoLCBuZXdIZWlnaHQsIG5ld1dpZHRoLCBkZXB0aF07XG5cbiAgICBjb25zdCBlZmZlY3RpdmVJblNpemU6IFtudW1iZXIsIG51bWJlcl0gPSBbXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld0hlaWdodCA+IDEpID8gb2xkSGVpZ2h0IC0gMSA6IG9sZEhlaWdodCxcbiAgICAgIChhbGlnbkNvcm5lcnMgJiYgbmV3V2lkdGggPiAxKSA/IG9sZFdpZHRoIC0gMSA6IG9sZFdpZHRoXG4gICAgXTtcblxuICAgIGNvbnN0IGVmZmVjdGl2ZU91dFNpemU6IFtudW1iZXIsIG51bWJlcl0gPSBbXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld0hlaWdodCA+IDEpID8gbmV3SGVpZ2h0IC0gMSA6IG5ld0hlaWdodCxcbiAgICAgIChhbGlnbkNvcm5lcnMgJiYgbmV3V2lkdGggPiAxKSA/IG5ld1dpZHRoIC0gMSA6IG5ld1dpZHRoXG4gICAgXTtcblxuICAgIC8vIFdoZW4gYWxpZ24gY29ybmVycyBpcyBmYWxzZSwgd2Ugcm91bmRzIHRoZSB2YWx1ZSB3aXRoIGZsb29yLlxuICAgIGNvbnN0IHJvdW5kQmFzZSA9IGFsaWduQ29ybmVycyA/ICcwLjUnIDogJzAuMCc7XG4gICAgbGV0IHNvdXJjZUZyYWNJbmRleFJDOiBzdHJpbmc7XG4gICAgaWYgKGhhbGZQaXhlbENlbnRlcnMpIHtcbiAgICAgIHNvdXJjZUZyYWNJbmRleFJDID0gYG1heCgodmVjMyh5UkMpICsgdmVjMygwLjUpKSAqIGAgK1xuICAgICAgICAgIGBlZmZlY3RpdmVJbnB1dE92ZXJPdXRwdXRSYXRpb1JDLCB2ZWMzKDAuMCkpYDtcbiAgICB9IGVsc2Uge1xuICAgICAgc291cmNlRnJhY0luZGV4UkMgPSBgdmVjMyh5UkMpICogZWZmZWN0aXZlSW5wdXRPdmVyT3V0cHV0UmF0aW9SQ2A7XG4gICAgfVxuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IHZlYzMgZWZmZWN0aXZlSW5wdXRPdmVyT3V0cHV0UmF0aW9SQyA9IHZlYzMoXG4gICAgICAgICAgJHtlZmZlY3RpdmVJblNpemVbMF0gLyBlZmZlY3RpdmVPdXRTaXplWzBdfSxcbiAgICAgICAgICAke2VmZmVjdGl2ZUluU2l6ZVsxXSAvIGVmZmVjdGl2ZU91dFNpemVbMV19LFxuICAgICAgICAgICR7ZWZmZWN0aXZlSW5TaXplWzFdIC8gZWZmZWN0aXZlT3V0U2l6ZVsxXX0pO1xuICAgICAgY29uc3QgdmVjMyBpbnB1dFNoYXBlUkMgPSB2ZWMzKCR7b2xkSGVpZ2h0fS4wLCAke29sZFdpZHRofS4wLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7b2xkV2lkdGh9LjApO1xuXG4gICAgICBmbG9hdCBnZXRBVmFsdWUoaW50IGIsIGludCByLCBpbnQgYywgaW50IGQpIHtcbiAgICAgICAgcmV0dXJuIGdldENoYW5uZWwoZ2V0QShiLCByLCBjLCBkKSwgdmVjMihjLCBkKSk7XG4gICAgICB9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgZCA9IGNvb3Jkc1szXTtcbiAgICAgICAgLy8gQ2FsY3VsYXRlIHZhbHVlcyBmb3IgbmV4dCBjb2x1bW4gaW4geVJDLnouXG4gICAgICAgIGl2ZWMzIHlSQyA9IGNvb3Jkcy55enogKyBpdmVjMygwLCAwLCAxKTtcblxuICAgICAgICAvLyBGcmFjdGlvbmFsIHNvdXJjZSBpbmRleC5cbiAgICAgICAgdmVjMyBzb3VyY2VGcmFjSW5kZXhSQyA9ICR7c291cmNlRnJhY0luZGV4UkN9O1xuXG4gICAgICAgIC8vIENvbXB1dGUgdGhlIGNvb3JkaW5hdG9ycyBvZiBuZWFyZXN0IG5laWdoYm9yIHBvaW50LlxuICAgICAgICBpdmVjMyBzb3VyY2VOZWFyZXN0UkMgPSBpdmVjMyhcbiAgICAgICAgICBtaW4oaW5wdXRTaGFwZVJDIC0gMS4wLCBmbG9vcihzb3VyY2VGcmFjSW5kZXhSQyArICR7cm91bmRCYXNlfSkpKTtcblxuICAgICAgICAvLyBTaG91bGQgd2UgY2FsY3VsYXRlIG5leHQgY29sdW1uIGFuZCByb3cgZWxlbWVudHMgaW4gMngyIHBhY2tlZCBjZWxsLlxuICAgICAgICBib29sIGhhc05leHRDb2wgPSBkIDwgJHtkZXB0aCAtIDF9O1xuICAgICAgICBib29sIGhhc05leHRSb3cgPSBjb29yZHMueiA8ICR7bmV3V2lkdGggLSAxfTtcblxuICAgICAgICB2ZWM0IG5ld1ZhbHVlID0gdmVjNChcbiAgICAgICAgICBnZXRBVmFsdWUoYiwgc291cmNlTmVhcmVzdFJDLngsIHNvdXJjZU5lYXJlc3RSQy55LCBkKSxcbiAgICAgICAgICBoYXNOZXh0Q29sID8gZ2V0QVZhbHVlKGIsIHNvdXJjZU5lYXJlc3RSQy54LCBzb3VyY2VOZWFyZXN0UkMueSwgZCArIDEpXG4gICAgICAgICAgICAgICAgICAgICA6IDAuMCxcbiAgICAgICAgICBoYXNOZXh0Um93ID8gZ2V0QVZhbHVlKGIsIHNvdXJjZU5lYXJlc3RSQy54LCBzb3VyY2VOZWFyZXN0UkMueiwgZClcbiAgICAgICAgICAgICAgICAgICAgIDogMC4wLFxuICAgICAgICAgIChoYXNOZXh0Um93ICYmIGhhc05leHRDb2wpID9cbiAgICAgICAgICAgIGdldEFWYWx1ZShiLCBzb3VyY2VOZWFyZXN0UkMueCwgc291cmNlTmVhcmVzdFJDLnosIGQgKyAxKSA6IDAuMCk7XG5cbiAgICAgICAgc2V0T3V0cHV0KG5ld1ZhbHVlKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtnZXRDb29yZHNEYXRhVHlwZX0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuXG5leHBvcnQgY2xhc3MgUmV2ZXJzZVByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWyd4J107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcih4U2hhcGU6IG51bWJlcltdLCBheGlzOiBudW1iZXJbXSkge1xuICAgIGNvbnN0IHJhbmsgPSB4U2hhcGUubGVuZ3RoO1xuICAgIGlmIChyYW5rID4gNCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBXZWJHTCBiYWNrZW5kOiBSZXZlcnNlIG9mIHJhbmstJHtyYW5rfSB0ZW5zb3IgaXMgbm90IHlldCBzdXBwb3J0ZWRgKTtcbiAgICB9XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IHhTaGFwZTtcblxuICAgIGlmIChyYW5rID09PSAxKSB7XG4gICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgaW50IGNvb3JkID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgICAgc2V0T3V0cHV0KGdldFgoJHt4U2hhcGVbMF19IC0gY29vcmQgLSAxKSk7XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGdldEluQ29vcmQgPSAoaTogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoYXhpcy5pbmRleE9mKGkpICE9PSAtMSAmJiB4U2hhcGVbaV0gIT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGAke3hTaGFwZVtpXX0gLSBjb29yZHNbJHtpfV0gLSAxYDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgY29vcmRzWyR7aX1dYDtcbiAgICB9O1xuICAgIGNvbnN0IGluQ29vcmRzID0geFNoYXBlLm1hcCgoXywgaSkgPT4gZ2V0SW5Db29yZChpKSkuam9pbignLCcpO1xuICAgIGNvbnN0IHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShyYW5rKTtcblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICR7dHlwZX0gY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIHNldE91dHB1dChnZXRYKCR7aW5Db29yZHN9KSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7Z2V0Q2hhbm5lbHN9IGZyb20gJy4vcGFja2luZ191dGlsJztcbmltcG9ydCB7Z2V0Q29vcmRzRGF0YVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuZXhwb3J0IGNsYXNzIFJldmVyc2VQYWNrZWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsneCddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIHBhY2tlZElucHV0cyA9IHRydWU7XG4gIHBhY2tlZE91dHB1dCA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IoeFNoYXBlOiBudW1iZXJbXSwgYXhpczogbnVtYmVyW10pIHtcbiAgICBjb25zdCByYW5rID0geFNoYXBlLmxlbmd0aDtcbiAgICBpZiAocmFuayA+IDQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgV2ViR0wgYmFja2VuZDogUmV2ZXJzZSBvZiByYW5rLSR7cmFua30gdGVuc29yIGlzIG5vdCB5ZXQgc3VwcG9ydGVkYCk7XG4gICAgfVxuICAgIHRoaXMub3V0cHV0U2hhcGUgPSB4U2hhcGU7XG4gICAgY29uc3QgY2hhbm5lbHMgPSBnZXRDaGFubmVscygncmMnLCByYW5rKTtcbiAgICBjb25zdCBuZXh0Q29sdW1uID1cbiAgICAgICAgYCR7Y2hhbm5lbHNbcmFuayAtIDFdfSArIDEgPCAke3RoaXMub3V0cHV0U2hhcGVbcmFuayAtIDFdfWA7XG4gICAgY29uc3QgbmV4dFJvdyA9IGAke2NoYW5uZWxzW3JhbmsgLSAyXX0gKyAxIDwgJHt0aGlzLm91dHB1dFNoYXBlW3JhbmsgLSAyXX1gO1xuICAgIGNvbnN0IHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShyYW5rKTtcbiAgICBpZiAocmFuayA9PT0gMSkge1xuICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICAgdm9pZCBtYWluKCl7XG4gICAgICAgICAgaW50IHJjID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgICAgdmVjNCByZXN1bHQgPSB2ZWM0KDAuKTtcbiAgICAgICAgICByZXN1bHQuciA9IGdldENoYW5uZWwoZ2V0WCgke3hTaGFwZVswXX0gLSByYyAtIDEpLFxuICAgICAgICAgICAgJHt4U2hhcGVbMF19IC0gcmMgLSAxKTtcbiAgICAgICAgICBpZigke25leHRDb2x1bW59KXtcbiAgICAgICAgICAgICAgcmVzdWx0LmcgPSBnZXRDaGFubmVsKGdldFgoJHt4U2hhcGVbMF19IC0gKHJjICArIDEpIC0gMSksXG4gICAgICAgICAgICAgICAgJHt4U2hhcGVbMF19IC0gKHJjICArIDEpIC0gMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgICAgICB9XG4gICAgICBgO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgJHt0eXBlfSByYyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgIHZlYzQgcmVzdWx0ID0gdmVjNCgwLik7XG4gICAgICAgICAgcmVzdWx0LnIgPSAke2dldFIoY2hhbm5lbHMuc2xpY2UoKSl9O1xuICAgICAgICAgIGlmKCR7bmV4dENvbHVtbn0pe1xuICAgICAgICAgICAgcmVzdWx0LmcgPSAke2dldEcoY2hhbm5lbHMuc2xpY2UoKSl9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZigke25leHRSb3d9KSB7XG4gICAgICAgICAgICByZXN1bHQuYiA9ICR7Z2V0QihjaGFubmVscy5zbGljZSgpKX07XG4gICAgICAgICAgICBpZigke25leHRDb2x1bW59KSB7XG4gICAgICAgICAgICAgIHJlc3VsdC5hID0gJHtnZXRBKGNoYW5uZWxzLnNsaWNlKCkpfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgc2V0T3V0cHV0KHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICBgO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFIoY2hhbm5lbHM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBnZXRDaGFubmVsKGNoYW5uZWxzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRHKGNoYW5uZWxzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgICBjaGFubmVsc1tyYW5rIC0gMV0gPSAnKCcgKyBjaGFubmVsc1tyYW5rIC0gMV0gKyBgICsgMSlgO1xuICAgICAgcmV0dXJuIGdldENoYW5uZWwoY2hhbm5lbHMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldEIoY2hhbm5lbHM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICAgIGNoYW5uZWxzW3JhbmsgLSAyXSA9ICcoJyArIGNoYW5uZWxzW3JhbmsgLSAyXSArIGAgKyAxKWA7XG4gICAgICByZXR1cm4gZ2V0Q2hhbm5lbChjaGFubmVscyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0QShjaGFubmVsczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgICAgY2hhbm5lbHNbcmFuayAtIDFdID0gJygnICsgY2hhbm5lbHNbcmFuayAtIDFdICsgYCArIDEpYDtcbiAgICAgIGNoYW5uZWxzW3JhbmsgLSAyXSA9ICcoJyArIGNoYW5uZWxzW3JhbmsgLSAyXSArIGAgKyAxKWA7XG4gICAgICByZXR1cm4gZ2V0Q2hhbm5lbChjaGFubmVscyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Q2hhbm5lbChjaGFubmVsczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgICAgY29uc3QgaW5Db29yZHNBcnJheSA9IHhTaGFwZS5tYXAoKF8sIGkpID0+IGdldEluQ29vcmQoaSwgY2hhbm5lbHMpKTtcbiAgICAgIGNvbnN0IGluQ29vcmRzID0gaW5Db29yZHNBcnJheS5qb2luKCcsJyk7XG4gICAgICBjb25zdCBpbm5lckRpbXMgPSBpbkNvb3Jkc0FycmF5LnNsaWNlKC0yKS5qb2luKCcsJyk7XG4gICAgICByZXR1cm4gYGdldENoYW5uZWwoZ2V0WCgke2luQ29vcmRzfSksIHZlYzIoJHtpbm5lckRpbXN9KSlgO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldEluQ29vcmQoaTogbnVtYmVyLCBjaGFubmVsczE6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICAgIGlmIChheGlzLmluZGV4T2YoaSkgIT09IC0xICYmIHhTaGFwZVtpXSAhPT0gMSkge1xuICAgICAgICByZXR1cm4gYCR7eFNoYXBlW2ldfSAtICR7Y2hhbm5lbHMxW2ldfSAtIDFgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGAke2NoYW5uZWxzMVtpXX1gO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7VW5pZm9ybVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuZXhwb3J0IGNsYXNzIFJvdGF0ZVByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydJbWFnZSddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW10gPSBbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgY3VzdG9tVW5pZm9ybXMgPSBbe25hbWU6ICdwYXJhbXMnLCB0eXBlOiAndmVjNCcgYXMgVW5pZm9ybVR5cGV9XTtcbiAgY29uc3RydWN0b3IoXG4gICAgICBpbWFnZVNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgIGZpbGxWYWx1ZTogbnVtYmVyfFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSkge1xuICAgIGNvbnN0IGltYWdlSGVpZ2h0ID0gaW1hZ2VTaGFwZVsxXTtcbiAgICBjb25zdCBpbWFnZVdpZHRoID0gaW1hZ2VTaGFwZVsyXTtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gaW1hZ2VTaGFwZTtcblxuICAgIGxldCBmaWxsU25pcHBldCA9ICcnO1xuICAgIGlmICh0eXBlb2YgZmlsbFZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgZmlsbFNuaXBwZXQgPSBgZmxvYXQgb3V0cHV0VmFsdWUgPSAke2ZpbGxWYWx1ZS50b0ZpeGVkKDIpfTtgO1xuICAgIH0gZWxzZSB7XG4gICAgICBmaWxsU25pcHBldCA9IGBcbiAgICAgICAgdmVjMyBmaWxsID0gdmVjMygke2ZpbGxWYWx1ZS5qb2luKCcsJyl9KTtcbiAgICAgICAgZmxvYXQgb3V0cHV0VmFsdWUgPSBmaWxsW2Nvb3Jkc1szXV07YDtcbiAgICB9XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgICAgaW50IHggPSBjb29yZHNbMl07XG4gICAgICAgICAgaW50IHkgPSBjb29yZHNbMV07XG4gICAgICAgICAgZmxvYXQgY29vcmRYRmxvYXQgPSAoZmxvYXQoeCkgLSBwYXJhbXNbMF0pICogcGFyYW1zWzNdIC1cbiAgICAgICAgICAgIChmbG9hdCh5KSAtIHBhcmFtc1sxXSkgKiBwYXJhbXNbMl07XG4gICAgICAgICAgZmxvYXQgY29vcmRZRmxvYXQgPSAoZmxvYXQoeCkgLSBwYXJhbXNbMF0pICogcGFyYW1zWzJdICtcbiAgICAgICAgICAgIChmbG9hdCh5KSAtIHBhcmFtc1sxXSkgKiBwYXJhbXNbM107XG4gICAgICAgICAgaW50IGNvb3JkWCA9IGludChyb3VuZChjb29yZFhGbG9hdCArIHBhcmFtc1swXSkpO1xuICAgICAgICAgIGludCBjb29yZFkgPSBpbnQocm91bmQoY29vcmRZRmxvYXQgKyBwYXJhbXNbMV0pKTtcbiAgICAgICAgICAke2ZpbGxTbmlwcGV0fVxuICAgICAgICAgIGlmKGNvb3JkWCA+PSAwICYmIGNvb3JkWCA8ICR7aW1hZ2VXaWR0aH0gJiYgY29vcmRZID49IDAgJiYgY29vcmRZIDwgJHtcbiAgICAgICAgaW1hZ2VIZWlnaHR9KSB7XG4gICAgICAgICAgICBvdXRwdXRWYWx1ZSA9IGdldEltYWdlKGNvb3Jkc1swXSwgY29vcmRZLCBjb29yZFgsIGNvb3Jkc1szXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNldE91dHB1dChvdXRwdXRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtnZXRDb29yZHNEYXRhVHlwZX0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuXG5leHBvcnQgY2xhc3MgU2NhdHRlclByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWyd1cGRhdGVzJywgJ2luZGljZXMnLCAnZGVmYXVsdFZhbHVlJ107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHVwZGF0ZVNpemU6IG51bWJlciwgc2xpY2VEaW06IG51bWJlciwgaW5kaWNlc1Jhbms6IG51bWJlcixcbiAgICAgIHVwZGF0ZXNSYW5rOiBudW1iZXIsIHN0cmlkZXM6IG51bWJlcltdLCBzaGFwZTogbnVtYmVyW10sXG4gICAgICBzdW1taW5nRHVwZUluZGV4ID0gdHJ1ZSkge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBzaGFwZTtcbiAgICBjb25zdCBzdHJpZGVzVHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHN0cmlkZXMubGVuZ3RoKTtcbiAgICBjb25zdCBkdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHNoYXBlLmxlbmd0aCk7XG4gICAgbGV0IGluZGljZXNTdHJpbmcgPSAnJztcbiAgICBpZiAoaW5kaWNlc1JhbmsgPT09IDEpIHtcbiAgICAgIGluZGljZXNTdHJpbmcgPSAnaSc7XG4gICAgfSBlbHNlIGlmIChpbmRpY2VzUmFuayA9PT0gMikge1xuICAgICAgaW5kaWNlc1N0cmluZyA9ICdpLCBqJztcbiAgICB9XG4gICAgY29uc3QgaW5kaWNlc1NuaXBwZXQgPSBgZ2V0SW5kaWNlcygke2luZGljZXNTdHJpbmd9KWA7XG5cbiAgICBsZXQgdXBkYXRlc1N0cmluZyA9ICcnO1xuICAgIGlmICh1cGRhdGVzUmFuayA9PT0gMSkge1xuICAgICAgdXBkYXRlc1N0cmluZyA9ICdpJztcbiAgICB9IGVsc2UgaWYgKHVwZGF0ZXNSYW5rID09PSAyKSB7XG4gICAgICB1cGRhdGVzU3RyaW5nID0gJ2ksIGNvb3Jkc1sxXSc7XG4gICAgfVxuICAgIGNvbnN0IHVwZGF0ZXNTbmlwcGV0ID0gYGdldFVwZGF0ZXMoJHt1cGRhdGVzU3RyaW5nfSlgO1xuXG4gICAgY29uc3Qgc3RyaWRlU3RyaW5nID0gc2xpY2VEaW0gPiAxID8gJ3N0cmlkZXNbal0nIDogJ3N0cmlkZXMnO1xuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAgICR7c3RyaWRlc1R5cGV9IHN0cmlkZXMgPSAke3N0cmlkZXNUeXBlfSgke3N0cmlkZXN9KTtcblxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgJHtkdHlwZX0gY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgICAgZmxvYXQgc3VtID0gMC4wO1xuICAgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8ICR7dXBkYXRlU2l6ZX07IGkrKykge1xuICAgICAgICAgICAgaW50IGZsYXR0ZW5lZEluZGV4ID0gMDtcbiAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgJHtzbGljZURpbX07IGorKykge1xuICAgICAgICAgICAgICBpbnQgaW5kZXggPSByb3VuZCgke2luZGljZXNTbmlwcGV0fSk7XG4gICAgICAgICAgICAgIGZsYXR0ZW5lZEluZGV4ICs9IGluZGV4ICogJHtzdHJpZGVTdHJpbmd9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZsYXR0ZW5lZEluZGV4ID09IGNvb3Jkc1swXSkge1xuICAgICAgICAgICAgICBzdW0gKz0gJHt1cGRhdGVzU25pcHBldH07XG4gICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgc2V0T3V0cHV0KG1peChnZXREZWZhdWx0VmFsdWUoKSwgc3VtLCBmbG9hdChmb3VuZCkpKTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgU2VnbWVudE9wUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnLCAnc2VnbWVudElkcyddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBzZWdPcEluZm86IGJhY2tlbmRfdXRpbC5zZWdtZW50X3V0aWwuU2VnT3BJbmZvLFxuICAgICAgc2VnT3BUeXBlOiAndW5zb3J0ZWRTZWdtZW50U3VtJykge1xuICAgIGNvbnN0IHdpbmRvd1NpemUgPSBzZWdPcEluZm8ud2luZG93U2l6ZTtcbiAgICBjb25zdCBiYXRjaFNpemUgPSBzZWdPcEluZm8uYmF0Y2hTaXplO1xuICAgIGNvbnN0IGluU2l6ZSA9IHNlZ09wSW5mby5pblNpemU7XG4gICAgY29uc3QgbnVtU2VnbWVudHMgPSBzZWdPcEluZm8ubnVtU2VnbWVudHM7XG4gICAgY29uc3Qgb3V0U2l6ZSA9IG51bVNlZ21lbnRzICogTWF0aC5jZWlsKGluU2l6ZSAvIHdpbmRvd1NpemUpO1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBbYmF0Y2hTaXplLCBvdXRTaXplXTtcblxuICAgIGNvbnN0IGluaXRpYWxpemF0aW9uVmFsdWUgPSAnMC4wJztcbiAgICBjb25zdCByZXR1cm5WYWx1ZSA9IGBzdW1WYWx1ZWA7XG5cbiAgICBjb25zdCB3aW5kb3dTaXplTmVhcmVzdFZlYzQgPSBNYXRoLmZsb29yKHdpbmRvd1NpemUgLyA0KSAqIDQ7XG4gICAgY29uc3Qgd2luZG93U2l6ZVZlYzRSZW1haW5kZXIgPSB3aW5kb3dTaXplICUgNDtcblxuICAgIGNvbnN0IHVwZGF0ZVNuaXBwZXQgPSBgXG4gICAgICAgIHN1bVZhbHVlICs9IGRvdCh2YWx1ZXMsIHNlZ0ZpbHRlcik7XG4gICAgYDtcblxuICAgIGxldCBjaGVja1ZhbHVlT3V0T2ZCb3VuZHMgPSAnJztcbiAgICBpZiAoaW5TaXplICUgd2luZG93U2l6ZSA+IDApIHtcbiAgICAgIGNoZWNrVmFsdWVPdXRPZkJvdW5kcyA9IGBcbiAgICAgICAgaWYgKGluSWR4IDwgMCB8fCBpbklkeCA+PSAke2luU2l6ZX0pIHtcbiAgICAgICAgICByZXR1cm4gaW5pdGlhbGl6YXRpb25WYWx1ZTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgICB9XG5cbiAgICBsZXQgY2hlY2tTZWdtZW50SWRPdXRPZkJvdW5kcyA9ICcnO1xuICAgIGlmIChpblNpemUgJSB3aW5kb3dTaXplID4gMCkge1xuICAgICAgY2hlY2tTZWdtZW50SWRPdXRPZkJvdW5kcyA9IGBcbiAgICAgICAgaWYgKGluSWR4IDwgMCB8fCBpbklkeCA+PSAke2luU2l6ZX0pIHtcbiAgICAgICAgICByZXR1cm4gLTEuMDtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgICB9XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgY29uc3QgZmxvYXQgaW5pdGlhbGl6YXRpb25WYWx1ZSA9ICR7aW5pdGlhbGl6YXRpb25WYWx1ZX07XG5cbiAgICAgIGZsb2F0IGdldFZhbHVlKGludCBiYXRjaCwgaW50IGluSWR4KSB7XG4gICAgICAgICR7Y2hlY2tWYWx1ZU91dE9mQm91bmRzfVxuICAgICAgICByZXR1cm4gZ2V0WChiYXRjaCwgaW5JZHgpO1xuICAgICAgfVxuXG4gICAgICBmbG9hdCBnZXRTZWdtZW50SWRBdEluZGV4KGludCBpbklkeCkge1xuICAgICAgICAke2NoZWNrU2VnbWVudElkT3V0T2ZCb3VuZHN9XG4gICAgICAgIHJldHVybiBnZXRTZWdtZW50SWRzKGluSWR4KTtcbiAgICAgIH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMiBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgb3V0SWR4ID0gY29vcmRzWzFdO1xuICAgICAgICBpbnQgaW5PZmZzZXQgPSBpbnQoZmxvb3IoZmxvYXQob3V0SWR4KSAvIGZsb2F0KFxuICAgICAgICAgICR7bnVtU2VnbWVudHN9KSkgKiBmbG9hdCgke3dpbmRvd1NpemV9KSk7XG4gICAgICAgIGludCBjdXJyZW50U2VnID0gaW50KG1vZChmbG9hdChvdXRJZHgpLCBmbG9hdCgke251bVNlZ21lbnRzfSkpKTtcblxuICAgICAgICBmbG9hdCBzdW1WYWx1ZSA9IDAuMDtcblxuICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8ICR7d2luZG93U2l6ZU5lYXJlc3RWZWM0fTsgaSArPSA0KSB7XG4gICAgICAgICAgaW50IGluSWR4ID0gaW5PZmZzZXQgKyBpO1xuICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAxKSxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDIpLFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4ICsgMylcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgdmVjNCBzZWdGaWx0ZXIgPSB2ZWM0KFxuICAgICAgICAgICAgaW50KGdldFNlZ21lbnRJZEF0SW5kZXgoaW5JZHgpKSA9PSBjdXJyZW50U2VnID8gMSA6IDAsXG4gICAgICAgICAgICBpbnQoZ2V0U2VnbWVudElkQXRJbmRleChpbklkeCArIDEpKSA9PSBjdXJyZW50U2VnID8gMSA6IDAsXG4gICAgICAgICAgICBpbnQoZ2V0U2VnbWVudElkQXRJbmRleChpbklkeCArIDIpKSA9PSBjdXJyZW50U2VnID8gMSA6IDAsXG4gICAgICAgICAgICBpbnQoZ2V0U2VnbWVudElkQXRJbmRleChpbklkeCArIDMpKSA9PSBjdXJyZW50U2VnID8gMSA6IDBcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgJHt1cGRhdGVTbmlwcGV0fVxuICAgICAgICB9XG5cbiAgICAgICAgaW50IGluSWR4ID0gaW5PZmZzZXQgKyAke3dpbmRvd1NpemVOZWFyZXN0VmVjNH07XG4gICAgICAgIGlmICgke3dpbmRvd1NpemVWZWM0UmVtYWluZGVyID09PSAxfSkge1xuICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCksXG4gICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlLFxuICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZSxcbiAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWVcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaW50IGluSWR4U2VnID0gaW50KGdldFNlZ21lbnRJZEF0SW5kZXgoaW5JZHgpKTtcblxuICAgICAgICAgIHZlYzQgc2VnRmlsdGVyID0gdmVjNChcbiAgICAgICAgICAgIGludChnZXRTZWdtZW50SWRBdEluZGV4KGluSWR4KSkgPT0gY3VycmVudFNlZyA/IDEgOiAwLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAwXG4gICAgICAgICAgKTtcblxuICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgfSBlbHNlIGlmICgke3dpbmRvd1NpemVWZWM0UmVtYWluZGVyID09PSAyfSkge1xuICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAxKSxcbiAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUsXG4gICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHZlYzQgc2VnRmlsdGVyID0gdmVjNChcbiAgICAgICAgICAgIGludChnZXRTZWdtZW50SWRBdEluZGV4KGluSWR4KSkgPT0gY3VycmVudFNlZyA/IDEgOiAwLFxuICAgICAgICAgICAgaW50KGdldFNlZ21lbnRJZEF0SW5kZXgoaW5JZHggKyAxKSkgPT0gY3VycmVudFNlZyA/IDEgOiAwLFxuICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAwXG4gICAgICAgICAgKTtcblxuICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgfSBlbHNlIGlmICgke3dpbmRvd1NpemVWZWM0UmVtYWluZGVyID09PSAzfSkge1xuICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAxKSxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDIpLFxuICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICB2ZWM0IHNlZ0ZpbHRlciA9IHZlYzQoXG4gICAgICAgICAgICBpbnQoZ2V0U2VnbWVudElkQXRJbmRleChpbklkeCkpID09IGN1cnJlbnRTZWcgPyAxIDogMCxcbiAgICAgICAgICAgIGludChnZXRTZWdtZW50SWRBdEluZGV4KGluSWR4ICsgMSkpID09IGN1cnJlbnRTZWcgPyAxIDogMCxcbiAgICAgICAgICAgIGludChnZXRTZWdtZW50SWRBdEluZGV4KGluSWR4ICsgMikpID09IGN1cnJlbnRTZWcgPyAxIDogMCxcbiAgICAgICAgICAgIDBcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgJHt1cGRhdGVTbmlwcGV0fVxuICAgICAgICB9XG4gICAgICAgIHNldE91dHB1dCgke3JldHVyblZhbHVlfSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7Z2V0Q29vcmRzRGF0YVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuZXhwb3J0IGNsYXNzIFNlbGVjdFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydjJywgJ2EnLCAnYiddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoY1Jhbms6IG51bWJlciwgc2hhcGU6IG51bWJlcltdLCByYW5rOiBudW1iZXIpIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gc2hhcGU7XG5cbiAgICBsZXQgY0Nvb3JkcztcbiAgICBsZXQgYWJDb29yZHM7XG4gICAgaWYgKHJhbmsgPiA0KSB7XG4gICAgICB0aHJvdyBFcnJvcihgV2hlcmUgZm9yIHJhbmsgJHtyYW5rfSBpcyBub3QgeWV0IHN1cHBvcnRlZGApO1xuICAgIH1cblxuICAgIGlmIChyYW5rID09PSAxKSB7XG4gICAgICBhYkNvb3JkcyA9IGByZXNSQ2A7XG4gICAgICBjQ29vcmRzID0gYHJlc1JDYDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY3VycmVudENvb3JkcyA9IFsncmVzUkMueCcsICdyZXNSQy55JywgJ3Jlc1JDLnonLCAncmVzUkMudyddO1xuICAgICAgY29uc3QgY0Nvb3JkVmFycyA9IFtdO1xuICAgICAgY29uc3QgYWJDb29yZFZhcnMgPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYWJDb29yZFZhcnMucHVzaChgJHtjdXJyZW50Q29vcmRzW2ldfWApO1xuICAgICAgICBpZiAoaSA8IGNSYW5rKSB7XG4gICAgICAgICAgY0Nvb3JkVmFycy5wdXNoKGAke2N1cnJlbnRDb29yZHNbaV19YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNDb29yZHMgPSBjQ29vcmRWYXJzLmpvaW4oKTtcbiAgICAgIGFiQ29vcmRzID0gYWJDb29yZFZhcnMuam9pbigpO1xuICAgIH1cblxuICAgIGNvbnN0IGR0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUocmFuayk7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke2R0eXBlfSByZXNSQyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBmbG9hdCBjVmFsID0gZ2V0Qygke2NDb29yZHN9KTtcbiAgICAgICAgaWYgKGNWYWwgPj0gMS4wKSB7XG4gICAgICAgICAgc2V0T3V0cHV0KGdldEEoJHthYkNvb3Jkc30pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXRPdXRwdXQoZ2V0Qigke2FiQ29vcmRzfSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBQbGVhc2UgbWFrZSBzdXJlIHRoZSBzaGFrZXIga2V5IGluIG1ha2VTaGFkZXJLZXkgaW4gZ3BncHVfbWF0aC50cyBpcyB3ZWxsXG4vLyBtYXBwZWQgaWYgYW55IHNoYWRlciBzb3VyY2UgY29kZSBpcyBjaGFuZ2VkIGluIHRoaXMgZmlsZS5cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5jb25zdCB7Z2V0QnJvYWRjYXN0RGltc30gPSBiYWNrZW5kX3V0aWw7XG5pbXBvcnQge2dldEdsc2xEaWZmZXJlbmNlcywgR0xTTH0gZnJvbSAnLi9nbHNsX3ZlcnNpb24nO1xuaW1wb3J0ICogYXMgc2hhZGVyX3V0aWwgZnJvbSAnLi9zaGFkZXJfY29tcGlsZXJfdXRpbCc7XG5cbmV4cG9ydCB0eXBlIFNoYXBlSW5mbyA9IHtcbiAgbG9naWNhbFNoYXBlOiBudW1iZXJbXSxcbiAgdGV4U2hhcGU6IFtudW1iZXIsIG51bWJlcl0sXG4gIGlzVW5pZm9ybTogYm9vbGVhbixcbiAgaXNQYWNrZWQ6IGJvb2xlYW4sXG4gIGZsYXRPZmZzZXQ6IG51bWJlclxufTtcblxuZXhwb3J0IHR5cGUgSW5wdXRJbmZvID0ge1xuICBuYW1lOiBzdHJpbmcsXG4gIHNoYXBlSW5mbzogU2hhcGVJbmZvXG59O1xuXG5leHBvcnQgdHlwZSBVbmlmb3JtVHlwZSA9XG4gICAgJ2Zsb2F0J3wndmVjMid8J3ZlYzMnfCd2ZWM0J3wnaW50J3wnaXZlYzInfCdpdmVjMyd8J2l2ZWM0JztcblxuaW50ZXJmYWNlIFByb2dyYW1QYXJhbXMge1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBlbmFibGVTaGFwZVVuaWZvcm1zPzogYm9vbGVhbjtcbiAgcGFja2VkSW5wdXRzPzogYm9vbGVhbjtcbiAgY3VzdG9tVW5pZm9ybXM/OlxuICAgICAgQXJyYXk8e25hbWU6IHN0cmluZzsgYXJyYXlJbmRleD86IG51bWJlcjsgdHlwZTogVW5pZm9ybVR5cGU7fT47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlU2hhZGVyKFxuICAgIGlucHV0c0luZm86IElucHV0SW5mb1tdLCBvdXRwdXRTaGFwZTogU2hhcGVJbmZvLFxuICAgIHByb2dyYW06IFByb2dyYW1QYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCBwcmVmaXhTbmlwcGV0czogc3RyaW5nW10gPSBbXTtcbiAgaW5wdXRzSW5mby5mb3JFYWNoKHggPT4ge1xuICAgIGNvbnN0IHNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoeC5zaGFwZUluZm8ubG9naWNhbFNoYXBlKTtcblxuICAgIC8vIFNuaXBwZXQgd2hlbiB3ZSBkZWNpZGVkIHRvIHVwbG9hZCB0aGUgdmFsdWVzIGFzIHVuaWZvcm0uXG4gICAgaWYgKHguc2hhcGVJbmZvLmlzVW5pZm9ybSkge1xuICAgICAgcHJlZml4U25pcHBldHMucHVzaChcbiAgICAgICAgICBgdW5pZm9ybSBmbG9hdCAke3gubmFtZX0ke3NpemUgPiAxID8gYFske3NpemV9XWAgOiAnJ307YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByZWZpeFNuaXBwZXRzLnB1c2goYHVuaWZvcm0gc2FtcGxlcjJEICR7eC5uYW1lfTtgKTtcbiAgICAgIHByZWZpeFNuaXBwZXRzLnB1c2goYHVuaWZvcm0gaW50IG9mZnNldCR7eC5uYW1lfTtgKTtcbiAgICB9XG5cbiAgICBpZiAocHJvZ3JhbS5lbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICBjb25zdCB7dW5pZm9ybVNoYXBlfSA9IGdldFVuaWZvcm1JbmZvRnJvbVNoYXBlKFxuICAgICAgICAgIHByb2dyYW0ucGFja2VkSW5wdXRzLCB4LnNoYXBlSW5mby5sb2dpY2FsU2hhcGUsIHguc2hhcGVJbmZvLnRleFNoYXBlKTtcbiAgICAgIHN3aXRjaCAodW5pZm9ybVNoYXBlLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgcHJlZml4U25pcHBldHMucHVzaChgdW5pZm9ybSBpbnQgJHt4Lm5hbWV9U2hhcGU7YCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBwcmVmaXhTbmlwcGV0cy5wdXNoKGB1bmlmb3JtIGl2ZWMyICR7eC5uYW1lfVNoYXBlO2ApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgcHJlZml4U25pcHBldHMucHVzaChgdW5pZm9ybSBpdmVjMyAke3gubmFtZX1TaGFwZTtgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHByZWZpeFNuaXBwZXRzLnB1c2goYHVuaWZvcm0gaXZlYzQgJHt4Lm5hbWV9U2hhcGU7YCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBwcmVmaXhTbmlwcGV0cy5wdXNoKGB1bmlmb3JtIGl2ZWMyICR7eC5uYW1lfVRleFNoYXBlO2ApO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKHByb2dyYW0uZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgIHN3aXRjaCAob3V0cHV0U2hhcGUubG9naWNhbFNoYXBlLmxlbmd0aCkge1xuICAgICAgY2FzZSAxOlxuICAgICAgICBwcmVmaXhTbmlwcGV0cy5wdXNoKGB1bmlmb3JtIGludCBvdXRTaGFwZTtgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHByZWZpeFNuaXBwZXRzLnB1c2goYHVuaWZvcm0gaXZlYzIgb3V0U2hhcGU7YCk7XG4gICAgICAgIHByZWZpeFNuaXBwZXRzLnB1c2goYHVuaWZvcm0gaW50IG91dFNoYXBlU3RyaWRlcztgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIHByZWZpeFNuaXBwZXRzLnB1c2goYHVuaWZvcm0gaXZlYzMgb3V0U2hhcGU7YCk7XG4gICAgICAgIHByZWZpeFNuaXBwZXRzLnB1c2goYHVuaWZvcm0gaXZlYzIgb3V0U2hhcGVTdHJpZGVzO2ApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNDpcbiAgICAgICAgcHJlZml4U25pcHBldHMucHVzaChgdW5pZm9ybSBpdmVjNCBvdXRTaGFwZTtgKTtcbiAgICAgICAgcHJlZml4U25pcHBldHMucHVzaChgdW5pZm9ybSBpdmVjMyBvdXRTaGFwZVN0cmlkZXM7YCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHByZWZpeFNuaXBwZXRzLnB1c2goYHVuaWZvcm0gaXZlYzIgb3V0VGV4U2hhcGU7YCk7XG4gIH1cbiAgaWYgKHByb2dyYW0uY3VzdG9tVW5pZm9ybXMpIHtcbiAgICBwcm9ncmFtLmN1c3RvbVVuaWZvcm1zLmZvckVhY2goKGQpID0+IHtcbiAgICAgIHByZWZpeFNuaXBwZXRzLnB1c2goYHVuaWZvcm0gJHtkLnR5cGV9ICR7ZC5uYW1lfSR7XG4gICAgICAgICAgZC5hcnJheUluZGV4ID8gYFske2QuYXJyYXlJbmRleH1dYCA6ICcnfTtgKTtcbiAgICB9KTtcbiAgfVxuICBjb25zdCBpbnB1dFByZWZpeFNuaXBwZXQgPSBwcmVmaXhTbmlwcGV0cy5qb2luKCdcXG4nKTtcblxuICBjb25zdCBpbnB1dFNhbXBsaW5nU25pcHBldCA9IGlucHV0c0luZm9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPT4gZ2V0SW5wdXRTYW1wbGluZ1NuaXBwZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwgb3V0cHV0U2hhcGUsIHByb2dyYW0ucGFja2VkSW5wdXRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyYW0uZW5hYmxlU2hhcGVVbmlmb3JtcykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcbiAgY29uc3Qgb3V0VGV4U2hhcGUgPSBvdXRwdXRTaGFwZS50ZXhTaGFwZTtcbiAgY29uc3QgZ2xzbCA9IGdldEdsc2xEaWZmZXJlbmNlcygpO1xuICBjb25zdCBmbG9hdFRleHR1cmVTYW1wbGVTbmlwcGV0ID0gZ2V0RmxvYXRUZXh0dXJlU2FtcGxlU25pcHBldChnbHNsKTtcbiAgbGV0IG91dHB1dFNhbXBsaW5nU25pcHBldDogc3RyaW5nO1xuICBsZXQgZmxvYXRUZXh0dXJlU2V0T3V0cHV0U25pcHBldDogc3RyaW5nO1xuICBsZXQgc2hhZGVyUHJlZml4ID0gZ2V0U2hhZGVyUHJlZml4KGdsc2wpO1xuXG4gIGlmIChvdXRwdXRTaGFwZS5pc1BhY2tlZCkge1xuICAgIG91dHB1dFNhbXBsaW5nU25pcHBldCA9IGdldFBhY2tlZE91dHB1dFNhbXBsaW5nU25pcHBldChcbiAgICAgICAgb3V0cHV0U2hhcGUubG9naWNhbFNoYXBlLCBvdXRUZXhTaGFwZSwgcHJvZ3JhbS5lbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICBmbG9hdFRleHR1cmVTZXRPdXRwdXRTbmlwcGV0ID0gZ2V0RmxvYXRUZXh0dXJlU2V0UkdCQVNuaXBwZXQoZ2xzbCk7XG4gIH0gZWxzZSB7XG4gICAgb3V0cHV0U2FtcGxpbmdTbmlwcGV0ID0gZ2V0T3V0cHV0U2FtcGxpbmdTbmlwcGV0KFxuICAgICAgICBvdXRwdXRTaGFwZS5sb2dpY2FsU2hhcGUsIG91dFRleFNoYXBlLCBwcm9ncmFtLmVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICAgIGZsb2F0VGV4dHVyZVNldE91dHB1dFNuaXBwZXQgPSBnZXRGbG9hdFRleHR1cmVTZXRSU25pcHBldChnbHNsKTtcbiAgfVxuXG4gIGlmIChwcm9ncmFtLnBhY2tlZElucHV0cykge1xuICAgIHNoYWRlclByZWZpeCArPSBTSEFERVJfUEFDS0VEX1BSRUZJWDtcbiAgfVxuXG4gIGNvbnN0IHNvdXJjZSA9IFtcbiAgICBzaGFkZXJQcmVmaXgsIGZsb2F0VGV4dHVyZVNhbXBsZVNuaXBwZXQsIGZsb2F0VGV4dHVyZVNldE91dHB1dFNuaXBwZXQsXG4gICAgaW5wdXRQcmVmaXhTbmlwcGV0LCBvdXRwdXRTYW1wbGluZ1NuaXBwZXQsIGlucHV0U2FtcGxpbmdTbmlwcGV0LFxuICAgIHByb2dyYW0udXNlckNvZGVcbiAgXS5qb2luKCdcXG4nKTtcbiAgcmV0dXJuIHNvdXJjZTtcbn1cblxuZnVuY3Rpb24gZ2V0U2FtcGxlckZyb21JbkluZm8oXG4gICAgaW5JbmZvOiBJbnB1dEluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMgPSBmYWxzZSk6IHN0cmluZyB7XG4gIGNvbnN0IHNoYXBlID0gaW5JbmZvLnNoYXBlSW5mby5sb2dpY2FsU2hhcGU7XG4gIHN3aXRjaCAoc2hhcGUubGVuZ3RoKSB7XG4gICAgY2FzZSAwOlxuICAgICAgcmV0dXJuIGdldFNhbXBsZXJTY2FsYXIoaW5JbmZvLCBlbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gZ2V0U2FtcGxlcjFEKGluSW5mbywgZW5hYmxlU2hhcGVVbmlmb3Jtcyk7XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIGdldFNhbXBsZXIyRChpbkluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiBnZXRTYW1wbGVyM0QoaW5JbmZvLCBlbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICBjYXNlIDQ6XG4gICAgICByZXR1cm4gZ2V0U2FtcGxlcjREKGluSW5mbywgZW5hYmxlU2hhcGVVbmlmb3Jtcyk7XG4gICAgY2FzZSA1OlxuICAgICAgcmV0dXJuIGdldFNhbXBsZXI1RChpbkluZm8pO1xuICAgIGNhc2UgNjpcbiAgICAgIHJldHVybiBnZXRTYW1wbGVyNkQoaW5JbmZvKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGAke3NoYXBlLmxlbmd0aH0tRCBpbnB1dCBzYW1wbGluZ2AgK1xuICAgICAgICAgIGAgaXMgbm90IHlldCBzdXBwb3J0ZWRgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQYWNrZWRTYW1wbGVyRnJvbUluSW5mbyhcbiAgICBpbkluZm86IElucHV0SW5mbywgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IHNoYXBlID0gaW5JbmZvLnNoYXBlSW5mby5sb2dpY2FsU2hhcGU7XG4gIHN3aXRjaCAoc2hhcGUubGVuZ3RoKSB7XG4gICAgY2FzZSAwOlxuICAgICAgcmV0dXJuIGdldFBhY2tlZFNhbXBsZXJTY2FsYXIoaW5JbmZvKTtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gZ2V0UGFja2VkU2FtcGxlcjFEKGluSW5mbywgZW5hYmxlU2hhcGVVbmlmb3Jtcyk7XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIGdldFBhY2tlZFNhbXBsZXIyRChpbkluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiBnZXRQYWNrZWRTYW1wbGVyM0QoaW5JbmZvLCBlbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGdldFBhY2tlZFNhbXBsZXJORChpbkluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldElucHV0U2FtcGxpbmdTbmlwcGV0KFxuICAgIGluSW5mbzogSW5wdXRJbmZvLCBvdXRTaGFwZUluZm86IFNoYXBlSW5mbywgdXNlc1BhY2tlZFRleHR1cmVzID0gZmFsc2UsXG4gICAgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbik6IHN0cmluZyB7XG4gIGxldCByZXMgPSAnJztcbiAgaWYgKHVzZXNQYWNrZWRUZXh0dXJlcykge1xuICAgIHJlcyArPSBnZXRQYWNrZWRTYW1wbGVyRnJvbUluSW5mbyhpbkluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICB9IGVsc2Uge1xuICAgIHJlcyArPSBnZXRTYW1wbGVyRnJvbUluSW5mbyhpbkluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICB9XG5cbiAgY29uc3QgaW5TaGFwZSA9IGluSW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlO1xuICBjb25zdCBvdXRTaGFwZSA9IG91dFNoYXBlSW5mby5sb2dpY2FsU2hhcGU7XG4gIGlmIChpblNoYXBlLmxlbmd0aCA8PSBvdXRTaGFwZS5sZW5ndGgpIHtcbiAgICBpZiAodXNlc1BhY2tlZFRleHR1cmVzKSB7XG4gICAgICByZXMgKz0gZ2V0UGFja2VkU2FtcGxlckF0T3V0cHV0Q29vcmRzKGluSW5mbywgb3V0U2hhcGVJbmZvKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzICs9IGdldFNhbXBsZXJBdE91dHB1dENvb3JkcyhpbkluZm8sIG91dFNoYXBlSW5mbyk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59XG5cbmZ1bmN0aW9uIGdldFBhY2tlZE91dHB1dFNhbXBsaW5nU25pcHBldChcbiAgICBvdXRTaGFwZTogbnVtYmVyW10sIG91dFRleFNoYXBlOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBzd2l0Y2ggKG91dFNoYXBlLmxlbmd0aCkge1xuICAgIGNhc2UgMDpcbiAgICAgIHJldHVybiBnZXRPdXRwdXRTY2FsYXJDb29yZHMoKTtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gZ2V0T3V0cHV0UGFja2VkMURDb29yZHMoXG4gICAgICAgICAgb3V0U2hhcGUgYXMgW251bWJlcl0sIG91dFRleFNoYXBlLCBlbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gZ2V0T3V0cHV0UGFja2VkMkRDb29yZHMoXG4gICAgICAgICAgb3V0U2hhcGUgYXMgW251bWJlciwgbnVtYmVyXSwgb3V0VGV4U2hhcGUsIGVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiBnZXRPdXRwdXRQYWNrZWQzRENvb3JkcyhcbiAgICAgICAgICBvdXRTaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIG91dFRleFNoYXBlLFxuICAgICAgICAgIGVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZ2V0T3V0cHV0UGFja2VkTkRDb29yZHMoXG4gICAgICAgICAgb3V0U2hhcGUsIG91dFRleFNoYXBlLCBlbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRPdXRwdXRTYW1wbGluZ1NuaXBwZXQoXG4gICAgb3V0U2hhcGU6IG51bWJlcltdLCBvdXRUZXhTaGFwZTogW251bWJlciwgbnVtYmVyXSxcbiAgICBlbmFibGVTaGFwZVVuaWZvcm1zOiBib29sZWFuKTogc3RyaW5nIHtcbiAgc3dpdGNoIChvdXRTaGFwZS5sZW5ndGgpIHtcbiAgICBjYXNlIDA6XG4gICAgICByZXR1cm4gZ2V0T3V0cHV0U2NhbGFyQ29vcmRzKCk7XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIGdldE91dHB1dDFEQ29vcmRzKFxuICAgICAgICAgIG91dFNoYXBlIGFzIFtudW1iZXJdLCBvdXRUZXhTaGFwZSwgZW5hYmxlU2hhcGVVbmlmb3Jtcyk7XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIGdldE91dHB1dDJEQ29vcmRzKFxuICAgICAgICAgIG91dFNoYXBlIGFzIFtudW1iZXIsIG51bWJlcl0sIG91dFRleFNoYXBlLCBlbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICBjYXNlIDM6XG4gICAgICByZXR1cm4gZ2V0T3V0cHV0M0RDb29yZHMoXG4gICAgICAgICAgb3V0U2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXJdLCBvdXRUZXhTaGFwZSxcbiAgICAgICAgICBlbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICBjYXNlIDQ6XG4gICAgICByZXR1cm4gZ2V0T3V0cHV0NERDb29yZHMoXG4gICAgICAgICAgb3V0U2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIG91dFRleFNoYXBlLFxuICAgICAgICAgIGVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICAgIGNhc2UgNTpcbiAgICAgIHJldHVybiBnZXRPdXRwdXQ1RENvb3JkcyhcbiAgICAgICAgICBvdXRTaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBvdXRUZXhTaGFwZSk7XG4gICAgY2FzZSA2OlxuICAgICAgcmV0dXJuIGdldE91dHB1dDZEQ29vcmRzKFxuICAgICAgICAgIG91dFNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgICAgICBvdXRUZXhTaGFwZSk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgJHtvdXRTaGFwZS5sZW5ndGh9LUQgb3V0cHV0IHNhbXBsaW5nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkYCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RmxvYXRUZXh0dXJlU2FtcGxlU25pcHBldChnbHNsOiBHTFNMKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBcbiAgICBmbG9hdCBzYW1wbGVUZXh0dXJlKHNhbXBsZXIyRCB0ZXh0dXJlU2FtcGxlciwgdmVjMiB1dikge1xuICAgICAgcmV0dXJuICR7Z2xzbC50ZXh0dXJlMkR9KHRleHR1cmVTYW1wbGVyLCB1dikucjtcbiAgICB9XG4gIGA7XG59XG5cbmZ1bmN0aW9uIGdldEZsb2F0VGV4dHVyZVNldFJTbmlwcGV0KGdsc2w6IEdMU0wpOiBzdHJpbmcge1xuICByZXR1cm4gYFxuICAgIHZvaWQgc2V0T3V0cHV0KGZsb2F0IHZhbCkge1xuICAgICAgJHtnbHNsLm91dHB1dH0gPSB2ZWM0KHZhbCwgMCwgMCwgMCk7XG4gICAgfVxuICBgO1xufVxuXG5mdW5jdGlvbiBnZXRGbG9hdFRleHR1cmVTZXRSR0JBU25pcHBldChnbHNsOiBHTFNMKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBcbiAgICB2b2lkIHNldE91dHB1dCh2ZWM0IHZhbCkge1xuICAgICAgJHtnbHNsLm91dHB1dH0gPSB2YWw7XG4gICAgfVxuICBgO1xufVxuXG5mdW5jdGlvbiBnZXRTaGFkZXJQcmVmaXgoZ2xzbDogR0xTTCk6IHN0cmluZyB7XG4gIGNvbnN0IFNIQURFUl9QUkVGSVggPSBgJHtnbHNsLnZlcnNpb259XG4gICAgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xuICAgIHByZWNpc2lvbiBoaWdocCBpbnQ7XG4gICAgcHJlY2lzaW9uIGhpZ2hwIHNhbXBsZXIyRDtcbiAgICAke2dsc2wudmFyeWluZ0ZzfSB2ZWMyIHJlc3VsdFVWO1xuICAgICR7Z2xzbC5kZWZpbmVPdXRwdXR9XG4gICAgY29uc3QgdmVjMiBoYWxmQ1IgPSB2ZWMyKDAuNSwgMC41KTtcblxuICAgIHN0cnVjdCBpdmVjNVxuICAgIHtcbiAgICAgIGludCB4O1xuICAgICAgaW50IHk7XG4gICAgICBpbnQgejtcbiAgICAgIGludCB3O1xuICAgICAgaW50IHU7XG4gICAgfTtcblxuICAgIHN0cnVjdCBpdmVjNlxuICAgIHtcbiAgICAgIGludCB4O1xuICAgICAgaW50IHk7XG4gICAgICBpbnQgejtcbiAgICAgIGludCB3O1xuICAgICAgaW50IHU7XG4gICAgICBpbnQgdjtcbiAgICB9O1xuXG4gICAgdW5pZm9ybSBmbG9hdCBOQU47XG4gICAgJHtnbHNsLmRlZmluZVNwZWNpYWxOYU59XG4gICAgJHtnbHNsLmRlZmluZVNwZWNpYWxJbmZ9XG4gICAgJHtnbHNsLmRlZmluZVJvdW5kfVxuXG4gICAgaW50IGltb2QoaW50IHgsIGludCB5KSB7XG4gICAgICByZXR1cm4geCAtIHkgKiAoeCAvIHkpO1xuICAgIH1cblxuICAgIGludCBpZGl2KGludCBhLCBpbnQgYiwgZmxvYXQgc2lnbikge1xuICAgICAgaW50IHJlcyA9IGEgLyBiO1xuICAgICAgaW50IG1vZCA9IGltb2QoYSwgYik7XG4gICAgICBpZiAoc2lnbiA8IDAuICYmIG1vZCAhPSAwKSB7XG4gICAgICAgIHJlcyAtPSAxO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvL0Jhc2VkIG9uIHRoZSB3b3JrIG9mIERhdmUgSG9za2luc1xuICAgIC8vaHR0cHM6Ly93d3cuc2hhZGVydG95LmNvbS92aWV3LzRkalNSV1xuICAgICNkZWZpbmUgSEFTSFNDQUxFMSA0NDMuODk3NVxuICAgIGZsb2F0IHJhbmRvbShmbG9hdCBzZWVkKXtcbiAgICAgIHZlYzIgcCA9IHJlc3VsdFVWICogc2VlZDtcbiAgICAgIHZlYzMgcDMgID0gZnJhY3QodmVjMyhwLnh5eCkgKiBIQVNIU0NBTEUxKTtcbiAgICAgIHAzICs9IGRvdChwMywgcDMueXp4ICsgMTkuMTkpO1xuICAgICAgcmV0dXJuIGZyYWN0KChwMy54ICsgcDMueSkgKiBwMy56KTtcbiAgICB9XG5cbiAgICAke1NBTVBMRV8xRF9TTklQUEVUfVxuICAgICR7U0FNUExFXzJEX1NOSVBQRVR9XG4gICAgJHtTQU1QTEVfM0RfU05JUFBFVH1cbiAgYDtcblxuICByZXR1cm4gU0hBREVSX1BSRUZJWDtcbn1cblxuY29uc3QgU0FNUExFXzFEX1NOSVBQRVQgPSBgXG52ZWMyIHV2RnJvbUZsYXQoaW50IHRleE51bVIsIGludCB0ZXhOdW1DLCBpbnQgaW5kZXgpIHtcbiAgaW50IHRleFIgPSBpbmRleCAvIHRleE51bUM7XG4gIGludCB0ZXhDID0gaW5kZXggLSB0ZXhSICogdGV4TnVtQztcbiAgcmV0dXJuICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvIHZlYzIodGV4TnVtQywgdGV4TnVtUik7XG59XG52ZWMyIHBhY2tlZFVWZnJvbTFEKGludCB0ZXhOdW1SLCBpbnQgdGV4TnVtQywgaW50IGluZGV4KSB7XG4gIGludCB0ZXhlbEluZGV4ID0gaW5kZXggLyAyO1xuICBpbnQgdGV4UiA9IHRleGVsSW5kZXggLyB0ZXhOdW1DO1xuICBpbnQgdGV4QyA9IHRleGVsSW5kZXggLSB0ZXhSICogdGV4TnVtQztcbiAgcmV0dXJuICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvIHZlYzIodGV4TnVtQywgdGV4TnVtUik7XG59XG5gO1xuXG5jb25zdCBTQU1QTEVfMkRfU05JUFBFVCA9IGBcbnZlYzIgcGFja2VkVVZmcm9tMkQoaW50IHRleGVsc0luTG9naWNhbFJvdywgaW50IHRleE51bVIsXG4gIGludCB0ZXhOdW1DLCBpbnQgcm93LCBpbnQgY29sKSB7XG4gIGludCB0ZXhlbEluZGV4ID0gKHJvdyAvIDIpICogdGV4ZWxzSW5Mb2dpY2FsUm93ICsgKGNvbCAvIDIpO1xuICBpbnQgdGV4UiA9IHRleGVsSW5kZXggLyB0ZXhOdW1DO1xuICBpbnQgdGV4QyA9IHRleGVsSW5kZXggLSB0ZXhSICogdGV4TnVtQztcbiAgcmV0dXJuICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvIHZlYzIodGV4TnVtQywgdGV4TnVtUik7XG59XG5gO1xuXG5jb25zdCBTQU1QTEVfM0RfU05JUFBFVCA9IGBcbnZlYzIgcGFja2VkVVZmcm9tM0QoaW50IHRleE51bVIsIGludCB0ZXhOdW1DLFxuICAgIGludCB0ZXhlbHNJbkJhdGNoLCBpbnQgdGV4ZWxzSW5Mb2dpY2FsUm93LCBpbnQgYixcbiAgICBpbnQgcm93LCBpbnQgY29sKSB7XG4gIGludCBpbmRleCA9IGIgKiB0ZXhlbHNJbkJhdGNoICsgKHJvdyAvIDIpICogdGV4ZWxzSW5Mb2dpY2FsUm93ICsgKGNvbCAvIDIpO1xuICBpbnQgdGV4UiA9IGluZGV4IC8gdGV4TnVtQztcbiAgaW50IHRleEMgPSBpbmRleCAtIHRleFIgKiB0ZXhOdW1DO1xuICByZXR1cm4gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC8gdmVjMih0ZXhOdW1DLCB0ZXhOdW1SKTtcbn1cbmA7XG5cbmNvbnN0IFNIQURFUl9QQUNLRURfUFJFRklYID0gYFxuICBmbG9hdCBnZXRDaGFubmVsKHZlYzQgZnJhZywgdmVjMiBpbm5lckRpbXMpIHtcbiAgICB2ZWMyIG1vZENvb3JkID0gbW9kKGlubmVyRGltcywgMi4pO1xuICAgIHJldHVybiBtb2RDb29yZC54ID09IDAuID9cbiAgICAgIChtb2RDb29yZC55ID09IDAuID8gZnJhZy5yIDogZnJhZy5nKSA6XG4gICAgICAobW9kQ29vcmQueSA9PSAwLiA/IGZyYWcuYiA6IGZyYWcuYSk7XG4gIH1cbiAgZmxvYXQgZ2V0Q2hhbm5lbCh2ZWM0IGZyYWcsIGludCBkaW0pIHtcbiAgICBmbG9hdCBtb2RDb29yZCA9IG1vZChmbG9hdChkaW0pLCAyLik7XG4gICAgcmV0dXJuIG1vZENvb3JkID09IDAuID8gZnJhZy5yIDogZnJhZy5nO1xuICB9XG5gO1xuXG5mdW5jdGlvbiBnZXRPdXRwdXRTY2FsYXJDb29yZHMoKSB7XG4gIHJldHVybiBgXG4gICAgaW50IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0T3V0cHV0UGFja2VkMURDb29yZHMoXG4gICAgc2hhcGU6IFtudW1iZXJdLCB0ZXhTaGFwZTogW251bWJlciwgbnVtYmVyXSxcbiAgICBlbmFibGVTaGFwZVVuaWZvcm1zOiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgcGFja2VkVGV4U2hhcGUgPVxuICAgICAgW01hdGguY2VpbCh0ZXhTaGFwZVswXSAvIDIpLCBNYXRoLmNlaWwodGV4U2hhcGVbMV0gLyAyKV07XG4gIGlmIChwYWNrZWRUZXhTaGFwZVswXSA9PT0gMSkge1xuICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICByZXR1cm4gYFxuICAgICAgaW50IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgcmV0dXJuIDIgKiBpbnQocmVzdWx0VVYueCAqIGNlaWwoZmxvYXQob3V0VGV4U2hhcGVbMV0pIC8gMi4wKSk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG5cbiAgICByZXR1cm4gYFxuICAgICAgaW50IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgcmV0dXJuIDIgKiBpbnQocmVzdWx0VVYueCAqICR7cGFja2VkVGV4U2hhcGVbMV19LjApO1xuICAgICAgfVxuICAgIGA7XG4gIH1cblxuICBpZiAocGFja2VkVGV4U2hhcGVbMV0gPT09IDEpIHtcbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgcmV0dXJuIGBcbiAgICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgIHJldHVybiAyICogaW50KHJlc3VsdFVWLnkgKiBjZWlsKGZsb2F0KG91dFRleFNoYXBlWzBdKSAvIDIuMCkpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGBcbiAgICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgIHJldHVybiAyICogaW50KHJlc3VsdFVWLnkgKiAke3BhY2tlZFRleFNoYXBlWzBdfS4wKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG5cbiAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICByZXR1cm4gYFxuICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiBwYWNrZWRUZXhTaGFwZSA9IGl2ZWMyKGNlaWwoZmxvYXQob3V0VGV4U2hhcGVbMF0pIC8gMi4wKSwgY2VpbChmbG9hdChvdXRUZXhTaGFwZVsxXSkgLyAyLjApKTtcbiAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIocmVzdWx0VVYueXggKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKHBhY2tlZFRleFNoYXBlWzBdLCBwYWNrZWRUZXhTaGFwZVsxXSkpO1xuICAgICAgcmV0dXJuIDIgKiAocmVzVGV4UkMueCAqIHBhY2tlZFRleFNoYXBlWzFdICsgcmVzVGV4UkMueSk7XG4gICAgfVxuICBgO1xuICB9XG5cbiAgcmV0dXJuIGBcbiAgICBpbnQgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihyZXN1bHRVVi55eCAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoJHtwYWNrZWRUZXhTaGFwZVswXX0sICR7cGFja2VkVGV4U2hhcGVbMV19KSk7XG4gICAgICByZXR1cm4gMiAqIChyZXNUZXhSQy54ICogJHtwYWNrZWRUZXhTaGFwZVsxXX0gKyByZXNUZXhSQy55KTtcbiAgICB9XG4gIGA7XG59XG5cbmZ1bmN0aW9uIGdldE91dHB1dDFEQ29vcmRzKFxuICAgIHNoYXBlOiBbbnVtYmVyXSwgdGV4U2hhcGU6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbik6IHN0cmluZyB7XG4gIGlmICh0ZXhTaGFwZVswXSA9PT0gMSkge1xuICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICByZXR1cm4gYFxuICAgICAgaW50IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgcmV0dXJuIGludChyZXN1bHRVVi54ICogZmxvYXQob3V0VGV4U2hhcGVbMV0pKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbiAgICByZXR1cm4gYFxuICAgICAgaW50IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgcmV0dXJuIGludChyZXN1bHRVVi54ICogJHt0ZXhTaGFwZVsxXX0uMCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuICBpZiAodGV4U2hhcGVbMV0gPT09IDEpIHtcbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgcmV0dXJuIGBcbiAgICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgIHJldHVybiBpbnQocmVzdWx0VVYueSAqIGZsb2F0KG91dFRleFNoYXBlWzBdKSk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG4gICAgcmV0dXJuIGBcbiAgICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgIHJldHVybiBpbnQocmVzdWx0VVYueSAqICR7dGV4U2hhcGVbMF19LjApO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbiAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICByZXR1cm4gYFxuICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMihvdXRUZXhTaGFwZVswXSwgb3V0VGV4U2hhcGVbMV0pKTtcbiAgICAgIHJldHVybiByZXNUZXhSQy54ICogb3V0VGV4U2hhcGVbMV0gKyByZXNUZXhSQy55O1xuICAgIH1cbiAgYDtcbiAgfVxuICByZXR1cm4gYFxuICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3RleFNoYXBlWzBdfSwgJHt0ZXhTaGFwZVsxXX0pKTtcbiAgICAgIHJldHVybiByZXNUZXhSQy54ICogJHt0ZXhTaGFwZVsxXX0gKyByZXNUZXhSQy55O1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0T3V0cHV0UGFja2VkM0RDb29yZHMoXG4gICAgc2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgdGV4U2hhcGU6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbik6IHN0cmluZyB7XG4gIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgcmV0dXJuIGBcbiAgICBpdmVjMyBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiBwYWNrZWRUZXhTaGFwZSA9IGl2ZWMyKGNlaWwoZmxvYXQob3V0VGV4U2hhcGVbMF0pIC8gMi4wKSwgY2VpbChmbG9hdChvdXRUZXhTaGFwZVsxXSkgLyAyLjApKTtcbiAgICAgIGludCB0ZXhlbHNJbkxvZ2ljYWxSb3cgPSBpbnQoY2VpbChmbG9hdChvdXRTaGFwZVsyXSkgLyAyLjApKTtcbiAgICAgIGludCB0ZXhlbHNJbkJhdGNoID0gdGV4ZWxzSW5Mb2dpY2FsUm93ICogaW50KGNlaWwoZmxvYXQob3V0U2hhcGVbMV0pIC8gMi4wKSk7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMihwYWNrZWRUZXhTaGFwZVswXSwgcGFja2VkVGV4U2hhcGVbMV0pKTtcbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiBwYWNrZWRUZXhTaGFwZVsxXSArIHJlc1RleFJDLnk7XG5cbiAgICAgIGludCBiID0gaW5kZXggLyB0ZXhlbHNJbkJhdGNoO1xuICAgICAgaW5kZXggLT0gYiAqIHRleGVsc0luQmF0Y2g7XG5cbiAgICAgIGludCByID0gMiAqIChpbmRleCAvIHRleGVsc0luTG9naWNhbFJvdyk7XG4gICAgICBpbnQgYyA9IGltb2QoaW5kZXgsIHRleGVsc0luTG9naWNhbFJvdykgKiAyO1xuXG4gICAgICByZXR1cm4gaXZlYzMoYiwgciwgYyk7XG4gICAgfVxuICBgO1xuICB9XG5cbiAgY29uc3QgcGFja2VkVGV4U2hhcGUgPVxuICAgICAgW01hdGguY2VpbCh0ZXhTaGFwZVswXSAvIDIpLCBNYXRoLmNlaWwodGV4U2hhcGVbMV0gLyAyKV07XG4gIGNvbnN0IHRleGVsc0luTG9naWNhbFJvdyA9IE1hdGguY2VpbChzaGFwZVsyXSAvIDIpO1xuICBjb25zdCB0ZXhlbHNJbkJhdGNoID0gdGV4ZWxzSW5Mb2dpY2FsUm93ICogTWF0aC5jZWlsKHNoYXBlWzFdIC8gMik7XG5cbiAgcmV0dXJuIGBcbiAgICBpdmVjMyBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3BhY2tlZFRleFNoYXBlWzBdfSwgJHtwYWNrZWRUZXhTaGFwZVsxXX0pKTtcbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiAke3BhY2tlZFRleFNoYXBlWzFdfSArIHJlc1RleFJDLnk7XG5cbiAgICAgIGludCBiID0gaW5kZXggLyAke3RleGVsc0luQmF0Y2h9O1xuICAgICAgaW5kZXggLT0gYiAqICR7dGV4ZWxzSW5CYXRjaH07XG5cbiAgICAgIGludCByID0gMiAqIChpbmRleCAvICR7dGV4ZWxzSW5Mb2dpY2FsUm93fSk7XG4gICAgICBpbnQgYyA9IGltb2QoaW5kZXgsICR7dGV4ZWxzSW5Mb2dpY2FsUm93fSkgKiAyO1xuXG4gICAgICByZXR1cm4gaXZlYzMoYiwgciwgYyk7XG4gICAgfVxuICBgO1xufVxuXG5mdW5jdGlvbiBnZXRPdXRwdXQzRENvb3JkcyhcbiAgICBzaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdLCB0ZXhTaGFwZTogW251bWJlciwgbnVtYmVyXSxcbiAgICBlbmFibGVTaGFwZVVuaWZvcm1zOiBib29sZWFuKTogc3RyaW5nIHtcbiAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICBjb25zdCBjb29yZHNGcm9tSW5kZXhTbmlwcGV0ID1cbiAgICAgICAgc2hhZGVyX3V0aWwuZ2V0T3V0cHV0TG9naWNhbENvb3JkaW5hdGVzRnJvbUZsYXRJbmRleEJ5VW5pZm9ybShcbiAgICAgICAgICAgIFsncicsICdjJywgJ2QnXSwgc2hhcGUpO1xuXG4gICAgcmV0dXJuIGBcbiAgaXZlYzMgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIocmVzdWx0VVYueXggKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMihvdXRUZXhTaGFwZVswXSwgb3V0VGV4U2hhcGVbMV0pKTtcbiAgICBpbnQgaW5kZXggPSByZXNUZXhSQy54ICogb3V0VGV4U2hhcGVbMV0gKyByZXNUZXhSQy55O1xuICAgICR7Y29vcmRzRnJvbUluZGV4U25pcHBldH1cbiAgICByZXR1cm4gaXZlYzMociwgYywgZCk7XG4gIH1cbmA7XG4gIH1cbiAgY29uc3QgY29vcmRzRnJvbUluZGV4U25pcHBldCA9XG4gICAgICBzaGFkZXJfdXRpbC5nZXRMb2dpY2FsQ29vcmRpbmF0ZXNGcm9tRmxhdEluZGV4KFsncicsICdjJywgJ2QnXSwgc2hhcGUpO1xuXG4gIHJldHVybiBgXG4gICAgaXZlYzMgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihyZXN1bHRVVi55eCAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoJHt0ZXhTaGFwZVswXX0sICR7dGV4U2hhcGVbMV19KSk7XG4gICAgICBpbnQgaW5kZXggPSByZXNUZXhSQy54ICogJHt0ZXhTaGFwZVsxXX0gKyByZXNUZXhSQy55O1xuICAgICAgJHtjb29yZHNGcm9tSW5kZXhTbmlwcGV0fVxuICAgICAgcmV0dXJuIGl2ZWMzKHIsIGMsIGQpO1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0T3V0cHV0UGFja2VkTkRDb29yZHMoXG4gICAgc2hhcGU6IG51bWJlcltdLCB0ZXhTaGFwZTogW251bWJlciwgbnVtYmVyXSxcbiAgICBlbmFibGVTaGFwZVVuaWZvcm1zOiBib29sZWFuKTogc3RyaW5nIHtcbiAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAvLyBUT0RPOiBzdXBwb3J0IDVkIGFuZCA2ZFxuICAgIHJldHVybiBgXG4gICAgaXZlYzQgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgaXZlYzIgcGFja2VkVGV4U2hhcGUgPSBpdmVjMihjZWlsKGZsb2F0KG91dFRleFNoYXBlWzBdKSAvIDIuMCksIGNlaWwoZmxvYXQob3V0VGV4U2hhcGVbMV0pIC8gMi4wKSk7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMihwYWNrZWRUZXhTaGFwZVswXSwgcGFja2VkVGV4U2hhcGVbMV0pKTtcbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiBwYWNrZWRUZXhTaGFwZVsxXSArIHJlc1RleFJDLnk7XG5cbiAgICAgIGludCB0ZXhlbHNJbkxvZ2ljYWxSb3cgPSBpbnQoY2VpbChmbG9hdChvdXRTaGFwZVszXSkgLyAyLjApKTtcbiAgICAgIGludCB0ZXhlbHNJbkJhdGNoID0gdGV4ZWxzSW5Mb2dpY2FsUm93ICogaW50KGNlaWwoZmxvYXQob3V0U2hhcGVbMl0pIC8gMi4wKSk7XG4gICAgICBpbnQgdGV4ZWxzSW5CYXRjaE4gPSB0ZXhlbHNJbkJhdGNoICogb3V0U2hhcGVbMV07XG5cbiAgICAgIGludCBiMiA9IGluZGV4IC8gdGV4ZWxzSW5CYXRjaE47XG4gICAgICBpbmRleCAtPSBiMiAqIHRleGVsc0luQmF0Y2hOO1xuXG4gICAgICBpbnQgYiA9IGluZGV4IC8gdGV4ZWxzSW5CYXRjaDtcbiAgICAgIGluZGV4IC09IGIgKiB0ZXhlbHNJbkJhdGNoO1xuXG4gICAgICBpbnQgciA9IDIgKiAoaW5kZXggLyB0ZXhlbHNJbkxvZ2ljYWxSb3cpO1xuICAgICAgaW50IGMgPSBpbW9kKGluZGV4LCB0ZXhlbHNJbkxvZ2ljYWxSb3cpICogMjtcblxuICAgICAgcmV0dXJuIGl2ZWM0KGIyLCBiLCByLCBjKTtcbiAgICB9XG4gIGA7XG4gIH1cbiAgY29uc3QgcGFja2VkVGV4U2hhcGUgPVxuICAgICAgW01hdGguY2VpbCh0ZXhTaGFwZVswXSAvIDIpLCBNYXRoLmNlaWwodGV4U2hhcGVbMV0gLyAyKV07XG5cbiAgY29uc3QgdGV4ZWxzSW5Mb2dpY2FsUm93ID0gTWF0aC5jZWlsKHNoYXBlW3NoYXBlLmxlbmd0aCAtIDFdIC8gMik7XG4gIGNvbnN0IHRleGVsc0luQmF0Y2ggPVxuICAgICAgdGV4ZWxzSW5Mb2dpY2FsUm93ICogTWF0aC5jZWlsKHNoYXBlW3NoYXBlLmxlbmd0aCAtIDJdIC8gMik7XG4gIGxldCB0ZXhlbHNJbkJhdGNoTiA9IHRleGVsc0luQmF0Y2g7XG4gIGxldCBiYXRjaGVzID0gYGA7XG4gIGxldCBjb29yZHMgPSAnYiwgciwgYyc7XG5cbiAgZm9yIChsZXQgYiA9IDI7IGIgPCBzaGFwZS5sZW5ndGggLSAxOyBiKyspIHtcbiAgICB0ZXhlbHNJbkJhdGNoTiAqPSBzaGFwZVtzaGFwZS5sZW5ndGggLSBiIC0gMV07XG4gICAgYmF0Y2hlcyA9IGBcbiAgICAgIGludCBiJHtifSA9IGluZGV4IC8gJHt0ZXhlbHNJbkJhdGNoTn07XG4gICAgICBpbmRleCAtPSBiJHtifSAqICR7dGV4ZWxzSW5CYXRjaE59O1xuICAgIGAgKyBiYXRjaGVzO1xuICAgIGNvb3JkcyA9IGBiJHtifSwgYCArIGNvb3JkcztcbiAgfVxuXG4gIHJldHVybiBgXG4gICAgaXZlYyR7c2hhcGUubGVuZ3RofSBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3BhY2tlZFRleFNoYXBlWzBdfSwgJHtwYWNrZWRUZXhTaGFwZVsxXX0pKTtcbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiAke3BhY2tlZFRleFNoYXBlWzFdfSArIHJlc1RleFJDLnk7XG5cbiAgICAgICR7YmF0Y2hlc31cblxuICAgICAgaW50IGIgPSBpbmRleCAvICR7dGV4ZWxzSW5CYXRjaH07XG4gICAgICBpbmRleCAtPSBiICogJHt0ZXhlbHNJbkJhdGNofTtcblxuICAgICAgaW50IHIgPSAyICogKGluZGV4IC8gJHt0ZXhlbHNJbkxvZ2ljYWxSb3d9KTtcbiAgICAgIGludCBjID0gaW1vZChpbmRleCwgJHt0ZXhlbHNJbkxvZ2ljYWxSb3d9KSAqIDI7XG5cbiAgICAgIHJldHVybiBpdmVjJHtzaGFwZS5sZW5ndGh9KCR7Y29vcmRzfSk7XG4gICAgfVxuICBgO1xufVxuXG5mdW5jdGlvbiBnZXRPdXRwdXQ0RENvb3JkcyhcbiAgICBzaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIHRleFNoYXBlOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgIGNvbnN0IGNvb3Jkc0Zyb21JbmRleFNuaXBwZXQgPVxuICAgICAgICBzaGFkZXJfdXRpbC5nZXRPdXRwdXRMb2dpY2FsQ29vcmRpbmF0ZXNGcm9tRmxhdEluZGV4QnlVbmlmb3JtKFxuICAgICAgICAgICAgWydyJywgJ2MnLCAnZCcsICdkMiddLCBzaGFwZSk7XG5cbiAgICByZXR1cm4gYFxuICAgIGl2ZWM0IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIocmVzdWx0VVYueXggKlxuICAgICAgICB2ZWMyKG91dFRleFNoYXBlWzBdLCBvdXRUZXhTaGFwZVsxXSkpO1xuICAgICAgaW50IGluZGV4ID0gcmVzVGV4UkMueCAqIG91dFRleFNoYXBlWzFdICsgcmVzVGV4UkMueTtcbiAgICAgICR7Y29vcmRzRnJvbUluZGV4U25pcHBldH1cbiAgICAgIHJldHVybiBpdmVjNChyLCBjLCBkLCBkMik7XG4gICAgfVxuICBgO1xuICB9XG4gIGNvbnN0IGNvb3Jkc0Zyb21JbmRleFNuaXBwZXQgPSBzaGFkZXJfdXRpbC5nZXRMb2dpY2FsQ29vcmRpbmF0ZXNGcm9tRmxhdEluZGV4KFxuICAgICAgWydyJywgJ2MnLCAnZCcsICdkMiddLCBzaGFwZSk7XG5cbiAgcmV0dXJuIGBcbiAgICBpdmVjNCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgdmVjMigke3RleFNoYXBlWzBdfSwgJHt0ZXhTaGFwZVsxXX0pKTtcbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiAke3RleFNoYXBlWzFdfSArIHJlc1RleFJDLnk7XG4gICAgICAke2Nvb3Jkc0Zyb21JbmRleFNuaXBwZXR9XG4gICAgICByZXR1cm4gaXZlYzQociwgYywgZCwgZDIpO1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0T3V0cHV0NURDb29yZHMoXG4gICAgc2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgdGV4U2hhcGU6IFtudW1iZXIsIG51bWJlcl0pOiBzdHJpbmcge1xuICBjb25zdCBjb29yZHNGcm9tSW5kZXhTbmlwcGV0ID0gc2hhZGVyX3V0aWwuZ2V0TG9naWNhbENvb3JkaW5hdGVzRnJvbUZsYXRJbmRleChcbiAgICAgIFsncicsICdjJywgJ2QnLCAnZDInLCAnZDMnXSwgc2hhcGUpO1xuXG4gIHJldHVybiBgXG4gICAgaXZlYzUgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihyZXN1bHRVVi55eCAqIHZlYzIoJHt0ZXhTaGFwZVswXX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7dGV4U2hhcGVbMV19KSk7XG5cbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiAke3RleFNoYXBlWzFdfSArIHJlc1RleFJDLnk7XG5cbiAgICAgICR7Y29vcmRzRnJvbUluZGV4U25pcHBldH1cblxuICAgICAgaXZlYzUgb3V0U2hhcGUgPSBpdmVjNShyLCBjLCBkLCBkMiwgZDMpO1xuICAgICAgcmV0dXJuIG91dFNoYXBlO1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0T3V0cHV0NkRDb29yZHMoXG4gICAgc2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICB0ZXhTaGFwZTogW251bWJlciwgbnVtYmVyXSk6IHN0cmluZyB7XG4gIGNvbnN0IGNvb3Jkc0Zyb21JbmRleFNuaXBwZXQgPSBzaGFkZXJfdXRpbC5nZXRMb2dpY2FsQ29vcmRpbmF0ZXNGcm9tRmxhdEluZGV4KFxuICAgICAgWydyJywgJ2MnLCAnZCcsICdkMicsICdkMycsICdkNCddLCBzaGFwZSk7XG5cbiAgcmV0dXJuIGBcbiAgICBpdmVjNiBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgdmVjMigke3RleFNoYXBlWzBdfSwgJHt0ZXhTaGFwZVsxXX0pKTtcbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiAke3RleFNoYXBlWzFdfSArIHJlc1RleFJDLnk7XG5cbiAgICAgICR7Y29vcmRzRnJvbUluZGV4U25pcHBldH1cblxuICAgICAgaXZlYzYgcmVzdWx0ID0gaXZlYzYociwgYywgZCwgZDIsIGQzLCBkNCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0T3V0cHV0UGFja2VkMkRDb29yZHMoXG4gICAgc2hhcGU6IFtudW1iZXIsIG51bWJlcl0sIHRleFNoYXBlOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBwYWNrZWRUZXhTaGFwZSA9XG4gICAgICBbTWF0aC5jZWlsKHRleFNoYXBlWzBdIC8gMiksIE1hdGguY2VpbCh0ZXhTaGFwZVsxXSAvIDIpXTtcbiAgaWYgKHV0aWwuYXJyYXlzRXF1YWwoc2hhcGUsIHRleFNoYXBlKSkge1xuICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICByZXR1cm4gYFxuICAgICAgaXZlYzIgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgICBpdmVjMiBwYWNrZWRUZXhTaGFwZSA9IGl2ZWMyKGNlaWwoZmxvYXQob3V0VGV4U2hhcGVbMF0pIC8gMi4wKSwgY2VpbChmbG9hdChvdXRUZXhTaGFwZVsxXSkgLyAyLjApKTtcbiAgICAgICAgcmV0dXJuIDIgKiBpdmVjMihyZXN1bHRVVi55eCAqIHZlYzIocGFja2VkVGV4U2hhcGVbMF0sIHBhY2tlZFRleFNoYXBlWzFdKSk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG5cbiAgICByZXR1cm4gYFxuICAgICAgaXZlYzIgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgICByZXR1cm4gMiAqIGl2ZWMyKHJlc3VsdFVWLnl4ICogdmVjMigke3BhY2tlZFRleFNoYXBlWzBdfSwgJHtcbiAgICAgICAgcGFja2VkVGV4U2hhcGVbMV19KSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuXG4gIC8vIHRleGVscyBuZWVkZWQgdG8gYWNjb21tb2RhdGUgYSBsb2dpY2FsIHJvd1xuICBjb25zdCB0ZXhlbHNJbkxvZ2ljYWxSb3cgPSBNYXRoLmNlaWwoc2hhcGVbMV0gLyAyKTtcblxuICAvKipcbiAgICogZ2V0T3V0cHV0Q29vcmRzXG4gICAqXG4gICAqIHJlc1RleFJDOiBUaGUgcm93cyBhbmQgY29sdW1ucyBvZiB0aGUgdGV4ZWxzLiBJZiB5b3UgbW92ZSBvdmVyIG9uZVxuICAgKiB0ZXhlbCB0byB0aGUgcmlnaHQgaW4gdGhlIHBhY2tlZCB0ZXh0dXJlLCB5b3UgYXJlIG1vdmluZyBvdmVyIG9uZSBjb2x1bW5cbiAgICogKG5vdCB0d28pLlxuICAgKlxuICAgKiBpbmRleDogVGhlIHRleGVsIGluZGV4XG4gICAqL1xuICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgIHJldHVybiBgXG4gICAgaXZlYzIgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgaXZlYzIgcGFja2VkVGV4U2hhcGUgPSBpdmVjMihjZWlsKGZsb2F0KG91dFRleFNoYXBlWzBdKSAvIDIuMCksIGNlaWwoZmxvYXQob3V0VGV4U2hhcGVbMV0pIC8gMi4wKSk7XG4gICAgICBpbnQgdGV4ZWxzSW5Mb2dpY2FsUm93ID0gaW50KGNlaWwoZmxvYXQob3V0U2hhcGVbMV0pIC8gMi4wKSk7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMihwYWNrZWRUZXhTaGFwZVswXSwgcGFja2VkVGV4U2hhcGVbMV0pKTtcblxuICAgICAgaW50IGluZGV4ID0gcmVzVGV4UkMueCAqIHBhY2tlZFRleFNoYXBlWzFdICsgcmVzVGV4UkMueTtcbiAgICAgIGludCByID0gMiAqIChpbmRleCAvIHRleGVsc0luTG9naWNhbFJvdyk7XG4gICAgICBpbnQgYyA9IGltb2QoaW5kZXgsIHRleGVsc0luTG9naWNhbFJvdykgKiAyO1xuXG4gICAgICByZXR1cm4gaXZlYzIociwgYyk7XG4gICAgfVxuICBgO1xuICB9XG5cbiAgcmV0dXJuIGBcbiAgICBpdmVjMiBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3BhY2tlZFRleFNoYXBlWzBdfSwgJHtwYWNrZWRUZXhTaGFwZVsxXX0pKTtcblxuICAgICAgaW50IGluZGV4ID0gcmVzVGV4UkMueCAqICR7cGFja2VkVGV4U2hhcGVbMV19ICsgcmVzVGV4UkMueTtcbiAgICAgIGludCByID0gMiAqIChpbmRleCAvICR7dGV4ZWxzSW5Mb2dpY2FsUm93fSk7XG4gICAgICBpbnQgYyA9IGltb2QoaW5kZXgsICR7dGV4ZWxzSW5Mb2dpY2FsUm93fSkgKiAyO1xuXG4gICAgICByZXR1cm4gaXZlYzIociwgYyk7XG4gICAgfVxuICBgO1xufVxuXG5mdW5jdGlvbiBnZXRPdXRwdXQyRENvb3JkcyhcbiAgICBzaGFwZTogW251bWJlciwgbnVtYmVyXSwgdGV4U2hhcGU6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbik6IHN0cmluZyB7XG4gIGlmICh1dGlsLmFycmF5c0VxdWFsKHNoYXBlLCB0ZXhTaGFwZSkpIHtcbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgcmV0dXJuIGBcbiAgICAgIGl2ZWMyIGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgcmV0dXJuIGl2ZWMyKHJlc3VsdFVWLnl4ICogdmVjMihvdXRUZXhTaGFwZVswXSwgb3V0VGV4U2hhcGVbMV0pKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbiAgICByZXR1cm4gYFxuICAgICAgaXZlYzIgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgICByZXR1cm4gaXZlYzIocmVzdWx0VVYueXggKiB2ZWMyKCR7dGV4U2hhcGVbMF19LCAke3RleFNoYXBlWzFdfSkpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbiAgaWYgKHNoYXBlWzFdID09PSAxKSB7XG4gICAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgIHJldHVybiBgXG4gICAgICBpdmVjMiBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIocmVzdWx0VVYueXggKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIob3V0VGV4U2hhcGVbMF0sIG91dFRleFNoYXBlWzFdKSk7XG4gICAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiBvdXRUZXhTaGFwZVsxXSArIHJlc1RleFJDLnk7XG4gICAgICAgIHJldHVybiBpdmVjMihpbmRleCwgMCk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG4gICAgcmV0dXJuIGBcbiAgICAgIGl2ZWMyIGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihyZXN1bHRVVi55eCAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3RleFNoYXBlWzBdfSwgJHt0ZXhTaGFwZVsxXX0pKTtcbiAgICAgICAgaW50IGluZGV4ID0gcmVzVGV4UkMueCAqICR7dGV4U2hhcGVbMV19ICsgcmVzVGV4UkMueTtcbiAgICAgICAgcmV0dXJuIGl2ZWMyKGluZGV4LCAwKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG4gIGlmIChzaGFwZVswXSA9PT0gMSkge1xuICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICByZXR1cm4gYFxuICAgICAgaXZlYzIgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKG91dFRleFNoYXBlWzBdLCBvdXRUZXhTaGFwZVsxXSkpO1xuICAgICAgICBpbnQgaW5kZXggPSByZXNUZXhSQy54ICogb3V0VGV4U2hhcGVbMV0gKyByZXNUZXhSQy55O1xuICAgICAgICByZXR1cm4gaXZlYzIoMCwgaW5kZXgpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIHJldHVybiBgXG4gICAgICBpdmVjMiBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIocmVzdWx0VVYueXggKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoJHt0ZXhTaGFwZVswXX0sICR7dGV4U2hhcGVbMV19KSk7XG4gICAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiAke3RleFNoYXBlWzFdfSArIHJlc1RleFJDLnk7XG4gICAgICAgIHJldHVybiBpdmVjMigwLCBpbmRleCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgIHJldHVybiBgXG4gICAgaXZlYzIgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihyZXN1bHRVVi55eCAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIob3V0VGV4U2hhcGVbMF0sIG91dFRleFNoYXBlWzFdKSk7XG4gICAgICBpbnQgaW5kZXggPSByZXNUZXhSQy54ICogb3V0VGV4U2hhcGVbMV0gKyByZXNUZXhSQy55O1xuICAgICAgaW50IHIgPSBpbmRleCAvIG91dFNoYXBlWzFdO1xuICAgICAgaW50IGMgPSBpbmRleCAtIHIgKiBvdXRTaGFwZVsxXTtcbiAgICAgIHJldHVybiBpdmVjMihyLCBjKTtcbiAgICB9XG4gIGA7XG4gIH1cbiAgcmV0dXJuIGBcbiAgICBpdmVjMiBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3RleFNoYXBlWzBdfSwgJHt0ZXhTaGFwZVsxXX0pKTtcbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiAke3RleFNoYXBlWzFdfSArIHJlc1RleFJDLnk7XG4gICAgICBpbnQgciA9IGluZGV4IC8gJHtzaGFwZVsxXX07XG4gICAgICBpbnQgYyA9IGluZGV4IC0gciAqICR7c2hhcGVbMV19O1xuICAgICAgcmV0dXJuIGl2ZWMyKHIsIGMpO1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0RmxhdE9mZnNldFVuaWZvcm1OYW1lKHRleE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgb2Zmc2V0JHt0ZXhOYW1lfWA7XG59XG5cbmZ1bmN0aW9uIGdldFBhY2tlZFNhbXBsZXJTY2FsYXIoaW5wdXRJbmZvOiBJbnB1dEluZm8pOiBzdHJpbmcge1xuICBjb25zdCB0ZXhOYW1lID0gaW5wdXRJbmZvLm5hbWU7XG4gIGNvbnN0IGZ1bmNOYW1lID0gJ2dldCcgKyB0ZXhOYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGV4TmFtZS5zbGljZSgxKTtcbiAgY29uc3QgZ2xzbCA9IGdldEdsc2xEaWZmZXJlbmNlcygpO1xuICByZXR1cm4gYFxuICAgIHZlYzQgJHtmdW5jTmFtZX0oKSB7XG4gICAgICByZXR1cm4gJHtnbHNsLnRleHR1cmUyRH0oJHt0ZXhOYW1lfSwgaGFsZkNSKTtcbiAgICB9XG4gIGA7XG59XG5cbmZ1bmN0aW9uIGdldFNhbXBsZXJTY2FsYXIoXG4gICAgaW5wdXRJbmZvOiBJbnB1dEluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCB0ZXhOYW1lID0gaW5wdXRJbmZvLm5hbWU7XG4gIGNvbnN0IGZ1bmNOYW1lID0gJ2dldCcgKyB0ZXhOYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGV4TmFtZS5zbGljZSgxKTtcbiAgaWYgKGlucHV0SW5mby5zaGFwZUluZm8uaXNVbmlmb3JtKSB7XG4gICAgcmV0dXJuIGBmbG9hdCAke2Z1bmNOYW1lfSgpIHtyZXR1cm4gJHt0ZXhOYW1lfTt9YDtcbiAgfVxuICBjb25zdCBbdGV4TnVtUiwgdGV4TnVtQ10gPSBpbnB1dEluZm8uc2hhcGVJbmZvLnRleFNoYXBlO1xuICBpZiAodGV4TnVtUiA9PT0gMSAmJiB0ZXhOdW1DID09PSAxKSB7XG4gICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KCkge1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCBoYWxmQ1IpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cblxuICBjb25zdCBvZmZzZXQgPSBnZXRGbGF0T2Zmc2V0VW5pZm9ybU5hbWUodGV4TmFtZSk7XG4gIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgcmV0dXJuIGBcbiAgICBmbG9hdCAke2Z1bmNOYW1lfSgpIHtcbiAgICAgIHZlYzIgdXYgPSB1dkZyb21GbGF0KCR7dGV4TmFtZX1UZXhTaGFwZVswXSwgJHt0ZXhOYW1lfVRleFNoYXBlWzFdLCAke1xuICAgICAgICBvZmZzZXR9KTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG4gIH1cblxuICBjb25zdCBbdE51bVIsIHROdW1DXSA9IGlucHV0SW5mby5zaGFwZUluZm8udGV4U2hhcGU7XG4gIHJldHVybiBgXG4gICAgZmxvYXQgJHtmdW5jTmFtZX0oKSB7XG4gICAgICB2ZWMyIHV2ID0gdXZGcm9tRmxhdCgke3ROdW1SfSwgJHt0TnVtQ30sICR7b2Zmc2V0fSk7XG4gICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgfVxuICBgO1xufVxuXG5mdW5jdGlvbiBnZXRQYWNrZWRTYW1wbGVyMUQoXG4gICAgaW5wdXRJbmZvOiBJbnB1dEluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCB0ZXhOYW1lID0gaW5wdXRJbmZvLm5hbWU7XG4gIGNvbnN0IGZ1bmNOYW1lID0gJ2dldCcgKyB0ZXhOYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGV4TmFtZS5zbGljZSgxKTtcbiAgY29uc3QgdGV4U2hhcGUgPSBpbnB1dEluZm8uc2hhcGVJbmZvLnRleFNoYXBlO1xuICBjb25zdCBnbHNsID0gZ2V0R2xzbERpZmZlcmVuY2VzKCk7XG4gIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgcmV0dXJuIGBcbiAgICB2ZWM0ICR7ZnVuY05hbWV9KGludCBpbmRleCkge1xuICAgICAgaXZlYzIgcGFja2VkVGV4U2hhcGUgPSBpdmVjMihjZWlsKGZsb2F0KCR7XG4gICAgICAgIHRleE5hbWV9VGV4U2hhcGVbMF0pIC8gMi4wKSwgY2VpbChmbG9hdCgke3RleE5hbWV9VGV4U2hhcGVbMV0pIC8gMi4wKSk7XG4gICAgICB2ZWMyIHV2ID0gcGFja2VkVVZmcm9tMUQoXG4gICAgICAgIHBhY2tlZFRleFNoYXBlWzBdLCBwYWNrZWRUZXhTaGFwZVsxXSwgaW5kZXgpO1xuICAgICAgcmV0dXJuICR7Z2xzbC50ZXh0dXJlMkR9KCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG4gIH1cbiAgY29uc3QgcGFja2VkVGV4U2hhcGUgPVxuICAgICAgW01hdGguY2VpbCh0ZXhTaGFwZVswXSAvIDIpLCBNYXRoLmNlaWwodGV4U2hhcGVbMV0gLyAyKV07XG4gIHJldHVybiBgXG4gICAgdmVjNCAke2Z1bmNOYW1lfShpbnQgaW5kZXgpIHtcbiAgICAgIHZlYzIgdXYgPSBwYWNrZWRVVmZyb20xRChcbiAgICAgICAgJHtwYWNrZWRUZXhTaGFwZVswXX0sICR7cGFja2VkVGV4U2hhcGVbMV19LCBpbmRleCk7XG4gICAgICByZXR1cm4gJHtnbHNsLnRleHR1cmUyRH0oJHt0ZXhOYW1lfSwgdXYpO1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0U2FtcGxlcjFEKFxuICAgIGlucHV0SW5mbzogSW5wdXRJbmZvLCBlbmFibGVTaGFwZVVuaWZvcm1zOiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgdGV4TmFtZSA9IGlucHV0SW5mby5uYW1lO1xuICBjb25zdCBmdW5jTmFtZSA9ICdnZXQnICsgdGV4TmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRleE5hbWUuc2xpY2UoMSk7XG5cbiAgaWYgKGlucHV0SW5mby5zaGFwZUluZm8uaXNVbmlmb3JtKSB7XG4gICAgLy8gVW5pZm9ybSBhcnJheXMgd2lsbCBiZSBsZXNzIHRoYW4gNjU1MDUgKG5vIHJpc2sgb2YgZmxvYXQxNiBvdmVyZmxvdykuXG4gICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCBpbmRleCkge1xuICAgICAgICAke2dldFVuaWZvcm1TYW1wbGVyKGlucHV0SW5mbyl9XG4gICAgICB9XG4gICAgYDtcbiAgfVxuXG4gIGNvbnN0IHRleFNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby50ZXhTaGFwZTtcbiAgY29uc3QgdE51bVIgPSB0ZXhTaGFwZVswXTtcbiAgY29uc3QgdE51bUMgPSB0ZXhTaGFwZVsxXTtcblxuICBpZiAodE51bUMgPT09IDEgJiYgdE51bVIgPT09IDEpIHtcbiAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IGluZGV4KSB7XG4gICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIGhhbGZDUik7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuICBjb25zdCBvZmZzZXQgPSBnZXRGbGF0T2Zmc2V0VW5pZm9ybU5hbWUodGV4TmFtZSk7XG4gIGlmICh0TnVtQyA9PT0gMSkge1xuICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IGluZGV4KSB7XG4gICAgICAgIHZlYzIgdXYgPSB2ZWMyKDAuNSwgKGZsb2F0KGluZGV4ICsgJHtvZmZzZXR9KSArIDAuNSkgLyBmbG9hdCgke1xuICAgICAgICAgIHRleE5hbWV9VGV4U2hhcGVbMF0pKTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCBpbmRleCkge1xuICAgICAgICB2ZWMyIHV2ID0gdmVjMigwLjUsIChmbG9hdChpbmRleCArICR7b2Zmc2V0fSkgKyAwLjUpIC8gJHt0TnVtUn0uMCk7XG4gICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG4gIGlmICh0TnVtUiA9PT0gMSkge1xuICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IGluZGV4KSB7XG4gICAgICAgIHZlYzIgdXYgPSB2ZWMyKChmbG9hdChpbmRleCArICR7b2Zmc2V0fSkgKyAwLjUpIC8gZmxvYXQoJHtcbiAgICAgICAgICB0ZXhOYW1lfVRleFNoYXBlWzFdKSwgMC41KTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCBpbmRleCkge1xuICAgICAgICB2ZWMyIHV2ID0gdmVjMigoZmxvYXQoaW5kZXggKyAke29mZnNldH0pICsgMC41KSAvICR7dE51bUN9LjAsIDAuNSk7XG4gICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG5cbiAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICByZXR1cm4gYFxuICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCBpbmRleCkge1xuICAgICAgdmVjMiB1diA9IHV2RnJvbUZsYXQoJHt0ZXhOYW1lfVRleFNoYXBlWzBdLCAke1xuICAgICAgICB0ZXhOYW1lfVRleFNoYXBlWzFdLCBpbmRleCArICR7b2Zmc2V0fSk7XG4gICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgfVxuICBgO1xuICB9XG5cbiAgcmV0dXJuIGBcbiAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgaW5kZXgpIHtcbiAgICAgIHZlYzIgdXYgPSB1dkZyb21GbGF0KCR7dE51bVJ9LCAke3ROdW1DfSwgaW5kZXggKyAke29mZnNldH0pO1xuICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0UGFja2VkU2FtcGxlcjJEKFxuICAgIGlucHV0SW5mbzogSW5wdXRJbmZvLCBlbmFibGVTaGFwZVVuaWZvcm1zOiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3Qgc2hhcGUgPSBpbnB1dEluZm8uc2hhcGVJbmZvLmxvZ2ljYWxTaGFwZTtcbiAgY29uc3QgdGV4TmFtZSA9IGlucHV0SW5mby5uYW1lO1xuICBjb25zdCBmdW5jTmFtZSA9ICdnZXQnICsgdGV4TmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRleE5hbWUuc2xpY2UoMSk7XG4gIGNvbnN0IHRleFNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby50ZXhTaGFwZTtcblxuICBjb25zdCB0ZXhOdW1SID0gdGV4U2hhcGVbMF07XG4gIGNvbnN0IHRleE51bUMgPSB0ZXhTaGFwZVsxXTtcbiAgY29uc3QgZ2xzbCA9IGdldEdsc2xEaWZmZXJlbmNlcygpO1xuICBpZiAodGV4U2hhcGUgIT0gbnVsbCAmJiB1dGlsLmFycmF5c0VxdWFsKHNoYXBlLCB0ZXhTaGFwZSkpIHtcbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgcmV0dXJuIGBcbiAgICAgIHZlYzQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgICB2ZWMyIHV2ID0gKHZlYzIoY29sLCByb3cpICsgaGFsZkNSKSAvIHZlYzIoJHt0ZXhOYW1lfVRleFNoYXBlWzFdLCAke1xuICAgICAgICAgIHRleE5hbWV9VGV4U2hhcGVbMF0pO1xuXG4gICAgICAgIHJldHVybiAke2dsc2wudGV4dHVyZTJEfSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG4gICAgcmV0dXJuIGBcbiAgICAgIHZlYzQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgICB2ZWMyIHV2ID0gKHZlYzIoY29sLCByb3cpICsgaGFsZkNSKSAvIHZlYzIoJHt0ZXhOdW1DfS4wLCAke3RleE51bVJ9LjApO1xuXG4gICAgICAgIHJldHVybiAke2dsc2wudGV4dHVyZTJEfSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuXG4gIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgcmV0dXJuIGBcbiAgICB2ZWM0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wpIHtcbiAgICAgIGl2ZWMyIHBhY2tlZFRleFNoYXBlID0gaXZlYzIoY2VpbChmbG9hdCgke1xuICAgICAgICB0ZXhOYW1lfVRleFNoYXBlWzBdKSAvIDIuMCksIGNlaWwoZmxvYXQoJHt0ZXhOYW1lfVRleFNoYXBlWzFdKSAvIDIuMCkpO1xuICAgICAgaW50IHZhbHVlc1BlclJvdyA9IGludChjZWlsKGZsb2F0KCR7dGV4TmFtZX1TaGFwZVsxXSkgLyAyLjApKTtcbiAgICAgIHZlYzIgdXYgPSBwYWNrZWRVVmZyb20yRCh2YWx1ZXNQZXJSb3csIHBhY2tlZFRleFNoYXBlWzBdLCBwYWNrZWRUZXhTaGFwZVsxXSwgcm93LCBjb2wpO1xuICAgICAgcmV0dXJuICR7Z2xzbC50ZXh0dXJlMkR9KCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG4gIH1cbiAgY29uc3QgcGFja2VkVGV4U2hhcGUgPVxuICAgICAgW01hdGguY2VpbCh0ZXhTaGFwZVswXSAvIDIpLCBNYXRoLmNlaWwodGV4U2hhcGVbMV0gLyAyKV07XG4gIGNvbnN0IHZhbHVlc1BlclJvdyA9IE1hdGguY2VpbChzaGFwZVsxXSAvIDIpO1xuXG4gIHJldHVybiBgXG4gICAgdmVjNCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICB2ZWMyIHV2ID0gcGFja2VkVVZmcm9tMkQoJHt2YWx1ZXNQZXJSb3d9LCAke3BhY2tlZFRleFNoYXBlWzBdfSwgJHtcbiAgICAgIHBhY2tlZFRleFNoYXBlWzFdfSwgcm93LCBjb2wpO1xuICAgICAgcmV0dXJuICR7Z2xzbC50ZXh0dXJlMkR9KCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG59XG5cbmZ1bmN0aW9uIGdldFNhbXBsZXIyRChcbiAgICBpbnB1dEluZm86IElucHV0SW5mbywgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IHNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby5sb2dpY2FsU2hhcGU7XG4gIGNvbnN0IHRleE5hbWUgPSBpbnB1dEluZm8ubmFtZTtcbiAgY29uc3QgZnVuY05hbWUgPSAnZ2V0JyArIHRleE5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0ZXhOYW1lLnNsaWNlKDEpO1xuICBjb25zdCB0ZXhTaGFwZSA9IGlucHV0SW5mby5zaGFwZUluZm8udGV4U2hhcGU7XG5cbiAgaWYgKHRleFNoYXBlICE9IG51bGwgJiYgdXRpbC5hcnJheXNFcXVhbChzaGFwZSwgdGV4U2hhcGUpKSB7XG4gICAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICAgIHZlYzIgdXYgPSAodmVjMihjb2wsIHJvdykgKyBoYWxmQ1IpIC8gdmVjMigke3RleE5hbWV9VGV4U2hhcGVbMV0sICR7XG4gICAgICAgICAgdGV4TmFtZX1UZXhTaGFwZVswXSk7XG4gICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cblxuICAgIGNvbnN0IHRleE51bVIgPSB0ZXhTaGFwZVswXTtcbiAgICBjb25zdCB0ZXhOdW1DID0gdGV4U2hhcGVbMV07XG4gICAgcmV0dXJuIGBcbiAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICB2ZWMyIHV2ID0gKHZlYzIoY29sLCByb3cpICsgaGFsZkNSKSAvIHZlYzIoJHt0ZXhOdW1DfS4wLCAke3RleE51bVJ9LjApO1xuICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgIH1cbiAgYDtcbiAgfVxuXG4gIGNvbnN0IHtuZXdTaGFwZSwga2VwdERpbXN9ID0gdXRpbC5zcXVlZXplU2hhcGUoc2hhcGUpO1xuICBjb25zdCBzcXVlZXplZFNoYXBlID0gbmV3U2hhcGU7XG4gIGlmIChzcXVlZXplZFNoYXBlLmxlbmd0aCA8IHNoYXBlLmxlbmd0aCkge1xuICAgIGNvbnN0IG5ld0lucHV0SW5mbyA9IHNxdWVlemVJbnB1dEluZm8oaW5wdXRJbmZvLCBzcXVlZXplZFNoYXBlKTtcbiAgICBjb25zdCBwYXJhbXMgPSBbJ3JvdycsICdjb2wnXTtcbiAgICByZXR1cm4gYFxuICAgICAgJHtnZXRTYW1wbGVyRnJvbUluSW5mbyhuZXdJbnB1dEluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpfVxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgICByZXR1cm4gJHtmdW5jTmFtZX0oJHtnZXRTcXVlZXplZFBhcmFtcyhwYXJhbXMsIGtlcHREaW1zKX0pO1xuICAgICAgfVxuICAgIGA7XG4gIH1cblxuICBpZiAoaW5wdXRJbmZvLnNoYXBlSW5mby5pc1VuaWZvcm0pIHtcbiAgICAvLyBVbmlmb3JtIGFycmF5cyB3aWxsIGJlIGxlc3MgdGhhbiA2NTUwNSAobm8gcmlzayBvZiBmbG9hdDE2IG92ZXJmbG93KS5cbiAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgICBpbnQgaW5kZXggPSByb3VuZChkb3QodmVjMihyb3csIGNvbCksIHZlYzIoJHtzaGFwZVsxXX0sIDEpKSk7XG4gICAgICAgICR7Z2V0VW5pZm9ybVNhbXBsZXIoaW5wdXRJbmZvKX1cbiAgICAgIH1cbiAgICBgO1xuICB9XG5cbiAgY29uc3QgdGV4TnVtUiA9IHRleFNoYXBlWzBdO1xuICBjb25zdCB0ZXhOdW1DID0gdGV4U2hhcGVbMV07XG4gIGNvbnN0IG9mZnNldCA9IGdldEZsYXRPZmZzZXRVbmlmb3JtTmFtZSh0ZXhOYW1lKTtcbiAgaWYgKHRleE51bUMgPT09IDEpIHtcbiAgICAvLyBpbmRleCBpcyB1c2VkIGRpcmVjdGx5IGFzIHBoeXNpY2FsIChubyByaXNrIG9mIGZsb2F0MTYgb3ZlcmZsb3cpLlxuICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgICBmbG9hdCBpbmRleCA9IGRvdCh2ZWMzKHJvdywgY29sLCAke29mZnNldH0pLCB2ZWMzKCR7XG4gICAgICAgICAgdGV4TmFtZX1TaGFwZVsxXSwgMSwgMSkpO1xuICAgICAgICB2ZWMyIHV2ID0gdmVjMigwLjUsIChpbmRleCArIDAuNSkgLyBmbG9hdCgke3RleE5hbWV9VGV4U2hhcGVbMF0pKTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIHJldHVybiBgXG4gICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgZmxvYXQgaW5kZXggPSBkb3QodmVjMyhyb3csIGNvbCwgJHtvZmZzZXR9KSwgdmVjMygke3NoYXBlWzFdfSwgMSwgMSkpO1xuICAgICAgdmVjMiB1diA9IHZlYzIoMC41LCAoaW5kZXggKyAwLjUpIC8gJHt0ZXhOdW1SfS4wKTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG4gIH1cbiAgaWYgKHRleE51bVIgPT09IDEpIHtcbiAgICAvLyBpbmRleCBpcyB1c2VkIGRpcmVjdGx5IGFzIHBoeXNpY2FsIChubyByaXNrIG9mIGZsb2F0MTYgb3ZlcmZsb3cpLlxuICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgICBmbG9hdCBpbmRleCA9IGRvdCh2ZWMzKHJvdywgY29sLCAke29mZnNldH0pLCB2ZWMzKCR7XG4gICAgICAgICAgdGV4TmFtZX1TaGFwZVsxXSwgMSwgMSkpO1xuICAgICAgICB2ZWMyIHV2ID0gdmVjMigoaW5kZXggKyAwLjUpIC8gZmxvYXQoJHt0ZXhOYW1lfVRleFNoYXBlWzFdKSwgMC41KTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIHJldHVybiBgXG4gICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgZmxvYXQgaW5kZXggPSBkb3QodmVjMyhyb3csIGNvbCwgJHtvZmZzZXR9KSwgdmVjMygke3NoYXBlWzFdfSwgMSwgMSkpO1xuICAgICAgdmVjMiB1diA9IHZlYzIoKGluZGV4ICsgMC41KSAvICR7dGV4TnVtQ30uMCwgMC41KTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG4gIH1cblxuICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICAgIC8vIEV4cGxpY2l0bHkgdXNlIGludGVnZXIgb3BlcmF0aW9ucyBhcyBkb3QoKSBvbmx5IHdvcmtzIG9uIGZsb2F0cy5cbiAgICAgICAgaW50IGluZGV4ID0gcm93ICogJHt0ZXhOYW1lfVNoYXBlWzFdICsgY29sICsgJHtvZmZzZXR9O1xuICAgICAgICB2ZWMyIHV2ID0gdXZGcm9tRmxhdCgke3RleE5hbWV9VGV4U2hhcGVbMF0sICR7XG4gICAgICAgIHRleE5hbWV9VGV4U2hhcGVbMV0sIGluZGV4KTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbiAgcmV0dXJuIGBcbiAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgIC8vIEV4cGxpY2l0bHkgdXNlIGludGVnZXIgb3BlcmF0aW9ucyBhcyBkb3QoKSBvbmx5IHdvcmtzIG9uIGZsb2F0cy5cbiAgICBpbnQgaW5kZXggPSByb3cgKiAke3NoYXBlWzFdfSArIGNvbCArICR7b2Zmc2V0fTtcbiAgICB2ZWMyIHV2ID0gdXZGcm9tRmxhdCgke3RleE51bVJ9LCAke3RleE51bUN9LCBpbmRleCk7XG4gICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICB9XG5gO1xufVxuXG5mdW5jdGlvbiBnZXRQYWNrZWRTYW1wbGVyM0QoXG4gICAgaW5wdXRJbmZvOiBJbnB1dEluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBzaGFwZSA9IGlucHV0SW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlO1xuICBjb25zdCB0ZXhOYW1lID0gaW5wdXRJbmZvLm5hbWU7XG4gIGNvbnN0IGZ1bmNOYW1lID0gJ2dldCcgKyB0ZXhOYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGV4TmFtZS5zbGljZSgxKTtcbiAgY29uc3QgdGV4U2hhcGUgPSBpbnB1dEluZm8uc2hhcGVJbmZvLnRleFNoYXBlO1xuICBjb25zdCBwYWNrZWRUZXhTaGFwZSA9XG4gICAgICBbTWF0aC5jZWlsKHRleFNoYXBlWzBdIC8gMiksIE1hdGguY2VpbCh0ZXhTaGFwZVsxXSAvIDIpXTtcblxuICBpZiAoc2hhcGVbMF0gPT09IDEpIHtcbiAgICBjb25zdCBzcXVlZXplZFNoYXBlID0gc2hhcGUuc2xpY2UoMSk7XG4gICAgY29uc3Qga2VwdERpbXMgPSBbMSwgMl07XG4gICAgY29uc3QgbmV3SW5wdXRJbmZvID0gc3F1ZWV6ZUlucHV0SW5mbyhpbnB1dEluZm8sIHNxdWVlemVkU2hhcGUpO1xuICAgIGNvbnN0IHBhcmFtcyA9IFsnYicsICdyb3cnLCAnY29sJ107XG4gICAgcmV0dXJuIGBcbiAgICAgICAgJHtnZXRQYWNrZWRTYW1wbGVyRnJvbUluSW5mbyhuZXdJbnB1dEluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpfVxuICAgICAgICB2ZWM0ICR7ZnVuY05hbWV9KGludCBiLCBpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICAgICAgcmV0dXJuICR7ZnVuY05hbWV9KCR7Z2V0U3F1ZWV6ZWRQYXJhbXMocGFyYW1zLCBrZXB0RGltcyl9KTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgfVxuXG4gIGNvbnN0IGdsc2wgPSBnZXRHbHNsRGlmZmVyZW5jZXMoKTtcbiAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICByZXR1cm4gYFxuICAgIHZlYzQgJHtmdW5jTmFtZX0oaW50IGIsIGludCByb3csIGludCBjb2wpIHtcbiAgICAgIGl2ZWMyIHBhY2tlZFRleFNoYXBlID0gaXZlYzIoY2VpbChmbG9hdCgke1xuICAgICAgICB0ZXhOYW1lfVRleFNoYXBlWzBdKSAvIDIuMCksIGNlaWwoZmxvYXQoJHt0ZXhOYW1lfVRleFNoYXBlWzFdKSAvIDIuMCkpO1xuICAgICAgaW50IHZhbHVlc1BlclJvdyA9IGludChjZWlsKGZsb2F0KCR7dGV4TmFtZX1TaGFwZVsyXSkgLyAyLjApKTtcbiAgICAgIGludCB0ZXhlbHNJbkJhdGNoID0gdmFsdWVzUGVyUm93ICogaW50KGNlaWwoZmxvYXQoJHtcbiAgICAgICAgdGV4TmFtZX1TaGFwZVsxXSkgLyAyLjApKTtcbiAgICAgIHZlYzIgdXYgPSBwYWNrZWRVVmZyb20zRChcbiAgICAgICAgcGFja2VkVGV4U2hhcGVbMF0sIHBhY2tlZFRleFNoYXBlWzFdLCB0ZXhlbHNJbkJhdGNoLCB2YWx1ZXNQZXJSb3csIGIsIHJvdywgY29sKTtcbiAgICAgIHJldHVybiAke2dsc2wudGV4dHVyZTJEfSgke3RleE5hbWV9LCB1dik7XG4gICAgfVxuICBgO1xuICB9XG5cbiAgY29uc3QgdGV4TnVtUiA9IHBhY2tlZFRleFNoYXBlWzBdO1xuICBjb25zdCB0ZXhOdW1DID0gcGFja2VkVGV4U2hhcGVbMV07XG5cbiAgY29uc3QgdmFsdWVzUGVyUm93ID0gTWF0aC5jZWlsKHNoYXBlWzJdIC8gMik7XG4gIGNvbnN0IHRleGVsc0luQmF0Y2ggPSB2YWx1ZXNQZXJSb3cgKiBNYXRoLmNlaWwoc2hhcGVbMV0gLyAyKTtcblxuICByZXR1cm4gYFxuICAgIHZlYzQgJHtmdW5jTmFtZX0oaW50IGIsIGludCByb3csIGludCBjb2wpIHtcbiAgICAgIHZlYzIgdXYgPSBwYWNrZWRVVmZyb20zRChcbiAgICAgICAgJHt0ZXhOdW1SfSwgJHt0ZXhOdW1DfSwgJHt0ZXhlbHNJbkJhdGNofSwgJHt2YWx1ZXNQZXJSb3d9LCBiLCByb3csIGNvbCk7XG4gICAgICByZXR1cm4gJHtnbHNsLnRleHR1cmUyRH0oJHt0ZXhOYW1lfSwgdXYpO1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0U2FtcGxlcjNEKFxuICAgIGlucHV0SW5mbzogSW5wdXRJbmZvLCBlbmFibGVTaGFwZVVuaWZvcm1zOiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3Qgc2hhcGUgPSBpbnB1dEluZm8uc2hhcGVJbmZvLmxvZ2ljYWxTaGFwZTtcbiAgY29uc3QgdGV4TmFtZSA9IGlucHV0SW5mby5uYW1lO1xuICBjb25zdCBmdW5jTmFtZSA9ICdnZXQnICsgdGV4TmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRleE5hbWUuc2xpY2UoMSk7XG4gIGNvbnN0IHN0cmlkZTAgPSBzaGFwZVsxXSAqIHNoYXBlWzJdO1xuICBjb25zdCBzdHJpZGUxID0gc2hhcGVbMl07XG5cbiAgY29uc3Qge25ld1NoYXBlLCBrZXB0RGltc30gPSB1dGlsLnNxdWVlemVTaGFwZShzaGFwZSk7XG4gIGNvbnN0IHNxdWVlemVkU2hhcGUgPSBuZXdTaGFwZTtcbiAgaWYgKHNxdWVlemVkU2hhcGUubGVuZ3RoIDwgc2hhcGUubGVuZ3RoKSB7XG4gICAgY29uc3QgbmV3SW5wdXRJbmZvID0gc3F1ZWV6ZUlucHV0SW5mbyhpbnB1dEluZm8sIHNxdWVlemVkU2hhcGUpO1xuICAgIGNvbnN0IHBhcmFtcyA9IFsncm93JywgJ2NvbCcsICdkZXB0aCddO1xuICAgIHJldHVybiBgXG4gICAgICAgICR7Z2V0U2FtcGxlckZyb21JbkluZm8obmV3SW5wdXRJbmZvLCBlbmFibGVTaGFwZVVuaWZvcm1zKX1cbiAgICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoKSB7XG4gICAgICAgICAgcmV0dXJuICR7ZnVuY05hbWV9KCR7Z2V0U3F1ZWV6ZWRQYXJhbXMocGFyYW1zLCBrZXB0RGltcyl9KTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgfVxuXG4gIGlmIChpbnB1dEluZm8uc2hhcGVJbmZvLmlzVW5pZm9ybSkge1xuICAgIC8vIFVuaWZvcm0gYXJyYXlzIHdpbGwgYmUgbGVzcyB0aGFuIDY1NTA1IChubyByaXNrIG9mIGZsb2F0MTYgb3ZlcmZsb3cpLlxuICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgpIHtcbiAgICAgICAgaW50IGluZGV4ID0gcm91bmQoZG90KHZlYzMocm93LCBjb2wsIGRlcHRoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMygke3N0cmlkZTB9LCAke3N0cmlkZTF9LCAxKSkpO1xuICAgICAgICAke2dldFVuaWZvcm1TYW1wbGVyKGlucHV0SW5mbyl9XG4gICAgICB9XG4gICAgYDtcbiAgfVxuXG4gIGNvbnN0IHRleFNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby50ZXhTaGFwZTtcbiAgY29uc3QgdGV4TnVtUiA9IHRleFNoYXBlWzBdO1xuICBjb25zdCB0ZXhOdW1DID0gdGV4U2hhcGVbMV07XG4gIGNvbnN0IGZsYXRPZmZzZXQgPSBpbnB1dEluZm8uc2hhcGVJbmZvLmZsYXRPZmZzZXQ7XG4gIGlmICh0ZXhOdW1DID09PSBzdHJpZGUwICYmIGZsYXRPZmZzZXQgPT0gbnVsbCkge1xuICAgIC8vIHRleEMgaXMgdXNlZCBkaXJlY3RseSBhcyBwaHlzaWNhbCAobm8gcmlzayBvZiBmbG9hdDE2IG92ZXJmbG93KS5cbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCkge1xuICAgICAgICBpbnQgc3RyaWRlMSA9ICR7dGV4TmFtZX1TaGFwZVsyXTtcbiAgICAgICAgZmxvYXQgdGV4UiA9IGZsb2F0KHJvdyk7XG4gICAgICAgIGZsb2F0IHRleEMgPSBkb3QodmVjMihjb2wsIGRlcHRoKSwgdmVjMihzdHJpZGUxLCAxKSk7XG4gICAgICAgIHZlYzIgdXYgPSAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgL1xuICAgICAgICAgICAgICAgICAgIHZlYzIoJHt0ZXhOYW1lfVRleFNoYXBlWzFdLCAke3RleE5hbWV9VGV4U2hhcGVbMF0pO1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG4gICAgcmV0dXJuIGBcbiAgICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoKSB7XG4gICAgICAgICAgZmxvYXQgdGV4UiA9IGZsb2F0KHJvdyk7XG4gICAgICAgICAgZmxvYXQgdGV4QyA9IGRvdCh2ZWMyKGNvbCwgZGVwdGgpLCB2ZWMyKCR7c3RyaWRlMX0sIDEpKTtcbiAgICAgICAgICB2ZWMyIHV2ID0gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC9cbiAgICAgICAgICAgICAgICAgICAgIHZlYzIoJHt0ZXhOdW1DfS4wLCAke3RleE51bVJ9LjApO1xuICAgICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgfVxuXG4gIGlmICh0ZXhOdW1DID09PSBzdHJpZGUxICYmIGZsYXRPZmZzZXQgPT0gbnVsbCkge1xuICAgIC8vIHRleFIgaXMgdXNlZCBkaXJlY3RseSBhcyBwaHlzaWNhbCAobm8gcmlzayBvZiBmbG9hdDE2IG92ZXJmbG93KS5cbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCkge1xuICAgICAgICBmbG9hdCB0ZXhSID0gZG90KHZlYzIocm93LCBjb2wpLCB2ZWMyKCR7dGV4TmFtZX1TaGFwZVsxXSwgMSkpO1xuICAgICAgICBmbG9hdCB0ZXhDID0gZmxvYXQoZGVwdGgpO1xuICAgICAgICB2ZWMyIHV2ID0gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC8gdmVjMigke3RleE5hbWV9VGV4U2hhcGVbMV0sICR7XG4gICAgICAgICAgdGV4TmFtZX1UZXhTaGFwZVswXSk7XG4gICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbiAgICByZXR1cm4gYFxuICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCkge1xuICAgICAgZmxvYXQgdGV4UiA9IGRvdCh2ZWMyKHJvdywgY29sKSwgdmVjMigke3NoYXBlWzFdfSwgMSkpO1xuICAgICAgZmxvYXQgdGV4QyA9IGZsb2F0KGRlcHRoKTtcbiAgICAgIHZlYzIgdXYgPSAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgLyB2ZWMyKCR7dGV4TnVtQ30uMCwgJHt0ZXhOdW1SfS4wKTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG4gIH1cblxuICBjb25zdCBvZmZzZXQgPSBnZXRGbGF0T2Zmc2V0VW5pZm9ybU5hbWUodGV4TmFtZSk7XG4gIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgcmV0dXJuIGBcbiAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgpIHtcbiAgICAgIC8vIEV4cGxpY2l0bHkgdXNlIGludGVnZXIgb3BlcmF0aW9ucyBhcyBkb3QoKSBvbmx5IHdvcmtzIG9uIGZsb2F0cy5cbiAgICAgIGludCBzdHJpZGUwID0gJHt0ZXhOYW1lfVNoYXBlWzFdICogJHt0ZXhOYW1lfVNoYXBlWzJdO1xuICAgICAgaW50IHN0cmlkZTEgPSAke3RleE5hbWV9U2hhcGVbMl07XG4gICAgICBpbnQgaW5kZXggPSByb3cgKiAke3N0cmlkZTB9ICsgY29sICogJHtzdHJpZGUxfSArIGRlcHRoICsgJHtvZmZzZXR9O1xuICAgICAgdmVjMiB1diA9IHV2RnJvbUZsYXQoJHt0ZXhOYW1lfVRleFNoYXBlWzBdLCAke3RleE5hbWV9VGV4U2hhcGVbMV0sIGluZGV4KTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gICAgYDtcbiAgfVxuICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoKSB7XG4gICAgICAgIC8vIEV4cGxpY2l0bHkgdXNlIGludGVnZXIgb3BlcmF0aW9ucyBhcyBkb3QoKSBvbmx5IHdvcmtzIG9uIGZsb2F0cy5cbiAgICAgICAgaW50IGluZGV4ID0gcm93ICogJHtzdHJpZGUwfSArIGNvbCAqICR7c3RyaWRlMX0gKyBkZXB0aCArICR7b2Zmc2V0fTtcbiAgICAgICAgdmVjMiB1diA9IHV2RnJvbUZsYXQoJHt0ZXhOdW1SfSwgJHt0ZXhOdW1DfSwgaW5kZXgpO1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gIGA7XG59XG5cbmZ1bmN0aW9uIGdldFBhY2tlZFNhbXBsZXJORChcbiAgICBpbnB1dEluZm86IElucHV0SW5mbywgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IHRleE5hbWUgPSBpbnB1dEluZm8ubmFtZTtcbiAgY29uc3QgZnVuY05hbWUgPSAnZ2V0JyArIHRleE5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0ZXhOYW1lLnNsaWNlKDEpO1xuICBjb25zdCBnbHNsID0gZ2V0R2xzbERpZmZlcmVuY2VzKCk7XG4gIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgLy8gVE9ETzogc3VwcG9ydCA1ZCBhbmQgNmRcbiAgICByZXR1cm4gYFxuICAgIHZlYzQgJHtmdW5jTmFtZX0oaW50IGIyLCBpbnQgYiwgaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgaW50IHZhbHVlc1BlclJvdyA9IGludChjZWlsKGZsb2F0KCR7dGV4TmFtZX1TaGFwZVszXSkgLyAyLjApKTtcbiAgICAgIGludCB0ZXhlbHNJbkJhdGNoID0gdmFsdWVzUGVyUm93ICogaW50KGNlaWwoZmxvYXQoJHtcbiAgICAgICAgdGV4TmFtZX1TaGFwZVsyXSkgLyAyLjApKTtcbiAgICAgIGludCBpbmRleCA9IGIgKiB0ZXhlbHNJbkJhdGNoICsgKHJvdyAvIDIpICogdmFsdWVzUGVyUm93ICsgKGNvbCAvIDIpO1xuICAgICAgdGV4ZWxzSW5CYXRjaCAqPSAke3RleE5hbWV9U2hhcGVbMV07XG4gICAgICBpbmRleCA9IGIyICogdGV4ZWxzSW5CYXRjaCArIGluZGV4O1xuICAgICAgaXZlYzIgcGFja2VkVGV4U2hhcGUgPSBpdmVjMihjZWlsKGZsb2F0KCR7XG4gICAgICAgIHRleE5hbWV9VGV4U2hhcGVbMF0pIC8gMi4wKSwgY2VpbChmbG9hdCgke3RleE5hbWV9VGV4U2hhcGVbMV0pIC8gMi4wKSk7XG4gICAgICBpbnQgdGV4UiA9IGluZGV4IC8gcGFja2VkVGV4U2hhcGVbMV07XG4gICAgICBpbnQgdGV4QyA9IGluZGV4IC0gdGV4UiAqIHBhY2tlZFRleFNoYXBlWzFdO1xuICAgICAgdmVjMiB1diA9ICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvIHZlYzIocGFja2VkVGV4U2hhcGVbMV0sIHBhY2tlZFRleFNoYXBlWzBdKTsgcmV0dXJuICR7XG4gICAgICAgIGdsc2wudGV4dHVyZTJEfSgke3RleE5hbWV9LCB1dik7XG4gICAgfVxuICBgO1xuICB9XG4gIGNvbnN0IHNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby5sb2dpY2FsU2hhcGU7XG4gIGNvbnN0IHJhbmsgPSBzaGFwZS5sZW5ndGg7XG4gIGNvbnN0IHRleFNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby50ZXhTaGFwZTtcbiAgY29uc3QgcGFja2VkVGV4U2hhcGUgPVxuICAgICAgW01hdGguY2VpbCh0ZXhTaGFwZVswXSAvIDIpLCBNYXRoLmNlaWwodGV4U2hhcGVbMV0gLyAyKV07XG4gIGNvbnN0IHRleE51bVIgPSBwYWNrZWRUZXhTaGFwZVswXTtcbiAgY29uc3QgdGV4TnVtQyA9IHBhY2tlZFRleFNoYXBlWzFdO1xuXG4gIGNvbnN0IHZhbHVlc1BlclJvdyA9IE1hdGguY2VpbChzaGFwZVtyYW5rIC0gMV0gLyAyKTtcbiAgbGV0IHRleGVsc0luQmF0Y2ggPSB2YWx1ZXNQZXJSb3cgKiBNYXRoLmNlaWwoc2hhcGVbcmFuayAtIDJdIC8gMik7XG4gIGxldCBwYXJhbXMgPSBgaW50IGIsIGludCByb3csIGludCBjb2xgO1xuICBsZXQgaW5kZXggPSBgYiAqICR7dGV4ZWxzSW5CYXRjaH0gKyAocm93IC8gMikgKiAke3ZhbHVlc1BlclJvd30gKyAoY29sIC8gMilgO1xuICBmb3IgKGxldCBiID0gMjsgYiA8IHJhbmsgLSAxOyBiKyspIHtcbiAgICBwYXJhbXMgPSBgaW50IGIke2J9LCBgICsgcGFyYW1zO1xuICAgIHRleGVsc0luQmF0Y2ggKj0gc2hhcGVbcmFuayAtIGIgLSAxXTtcbiAgICBpbmRleCA9IGBiJHtifSAqICR7dGV4ZWxzSW5CYXRjaH0gKyBgICsgaW5kZXg7XG4gIH1cbiAgcmV0dXJuIGBcbiAgICB2ZWM0ICR7ZnVuY05hbWV9KCR7cGFyYW1zfSkge1xuICAgICAgaW50IGluZGV4ID0gJHtpbmRleH07XG4gICAgICBpbnQgdGV4UiA9IGluZGV4IC8gJHt0ZXhOdW1DfTtcbiAgICAgIGludCB0ZXhDID0gaW5kZXggLSB0ZXhSICogJHt0ZXhOdW1DfTtcbiAgICAgIHZlYzIgdXYgPSAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgLyB2ZWMyKCR7dGV4TnVtQ30sICR7dGV4TnVtUn0pO1xuICAgICAgcmV0dXJuICR7Z2xzbC50ZXh0dXJlMkR9KCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG59XG5cbmZ1bmN0aW9uIGdldFNhbXBsZXI0RChcbiAgICBpbnB1dEluZm86IElucHV0SW5mbywgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IHNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby5sb2dpY2FsU2hhcGU7XG4gIGNvbnN0IHRleE5hbWUgPSBpbnB1dEluZm8ubmFtZTtcbiAgY29uc3QgZnVuY05hbWUgPSAnZ2V0JyArIHRleE5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0ZXhOYW1lLnNsaWNlKDEpO1xuICBjb25zdCBzdHJpZGUyID0gc2hhcGVbM107XG4gIGNvbnN0IHN0cmlkZTEgPSBzaGFwZVsyXSAqIHN0cmlkZTI7XG4gIGNvbnN0IHN0cmlkZTAgPSBzaGFwZVsxXSAqIHN0cmlkZTE7XG5cbiAgY29uc3Qge25ld1NoYXBlLCBrZXB0RGltc30gPSB1dGlsLnNxdWVlemVTaGFwZShzaGFwZSk7XG4gIGlmIChuZXdTaGFwZS5sZW5ndGggPCBzaGFwZS5sZW5ndGgpIHtcbiAgICBjb25zdCBuZXdJbnB1dEluZm8gPSBzcXVlZXplSW5wdXRJbmZvKGlucHV0SW5mbywgbmV3U2hhcGUpO1xuICAgIGNvbnN0IHBhcmFtcyA9IFsncm93JywgJ2NvbCcsICdkZXB0aCcsICdkZXB0aDInXTtcbiAgICByZXR1cm4gYFxuICAgICAgJHtnZXRTYW1wbGVyRnJvbUluSW5mbyhuZXdJbnB1dEluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpfVxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLCBpbnQgZGVwdGgyKSB7XG4gICAgICAgIHJldHVybiAke2Z1bmNOYW1lfSgke2dldFNxdWVlemVkUGFyYW1zKHBhcmFtcywga2VwdERpbXMpfSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuXG4gIGlmIChpbnB1dEluZm8uc2hhcGVJbmZvLmlzVW5pZm9ybSkge1xuICAgIC8vIFVuaWZvcm0gYXJyYXlzIHdpbGwgYmUgbGVzcyB0aGFuIDY1NTA1IChubyByaXNrIG9mIGZsb2F0MTYgb3ZlcmZsb3cpLlxuICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsIGludCBkZXB0aDIpIHtcbiAgICAgICAgaW50IGluZGV4ID0gcm91bmQoZG90KHZlYzQocm93LCBjb2wsIGRlcHRoLCBkZXB0aDIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWM0KCR7c3RyaWRlMH0sICR7c3RyaWRlMX0sICR7c3RyaWRlMn0sIDEpKSk7XG4gICAgICAgICR7Z2V0VW5pZm9ybVNhbXBsZXIoaW5wdXRJbmZvKX1cbiAgICAgIH1cbiAgICBgO1xuICB9XG5cbiAgY29uc3QgZmxhdE9mZnNldCA9IGlucHV0SW5mby5zaGFwZUluZm8uZmxhdE9mZnNldDtcbiAgY29uc3QgdGV4U2hhcGUgPSBpbnB1dEluZm8uc2hhcGVJbmZvLnRleFNoYXBlO1xuICBjb25zdCB0ZXhOdW1SID0gdGV4U2hhcGVbMF07XG4gIGNvbnN0IHRleE51bUMgPSB0ZXhTaGFwZVsxXTtcblxuICBjb25zdCBzdHJpZGUyU3RyID0gYGludCBzdHJpZGUyID0gJHt0ZXhOYW1lfVNoYXBlWzNdO2A7XG4gIGNvbnN0IHN0cmlkZTFTdHIgPSBgaW50IHN0cmlkZTEgPSAke3RleE5hbWV9U2hhcGVbMl0gKiBzdHJpZGUyO2A7XG4gIGNvbnN0IHN0cmlkZTBTdHIgPSBgaW50IHN0cmlkZTAgPSAke3RleE5hbWV9U2hhcGVbMV0gKiBzdHJpZGUxO2A7XG4gIGlmICh0ZXhOdW1DID09PSBzdHJpZGUwICYmIGZsYXRPZmZzZXQgPT0gbnVsbCkge1xuICAgIC8vIHRleEMgaXMgdXNlZCBkaXJlY3RseSBhcyBwaHlzaWNhbCAobm8gcmlzayBvZiBmbG9hdDE2IG92ZXJmbG93KS5cbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCwgaW50IGRlcHRoMikge1xuICAgICAgICAke3N0cmlkZTJTdHJ9XG4gICAgICAgICR7c3RyaWRlMVN0cn1cbiAgICAgICAgZmxvYXQgdGV4UiA9IGZsb2F0KHJvdyk7XG4gICAgICAgIGZsb2F0IHRleEMgPVxuICAgICAgICAgICAgZG90KHZlYzMoY29sLCBkZXB0aCwgZGVwdGgyKSxcbiAgICAgICAgICAgICAgICB2ZWMzKHN0cmlkZTEsIHN0cmlkZTIsIDEpKTtcbiAgICAgICAgdmVjMiB1diA9ICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvXG4gICAgICAgICAgICAgICAgICAgdmVjMigke3RleE5hbWV9VGV4U2hhcGVbMV0sICR7dGV4TmFtZX1UZXhTaGFwZVswXSk7XG4gICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbiAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLCBpbnQgZGVwdGgyKSB7XG4gICAgICAgIGZsb2F0IHRleFIgPSBmbG9hdChyb3cpO1xuICAgICAgICBmbG9hdCB0ZXhDID1cbiAgICAgICAgICAgIGRvdCh2ZWMzKGNvbCwgZGVwdGgsIGRlcHRoMiksXG4gICAgICAgICAgICAgICAgdmVjMygke3N0cmlkZTF9LCAke3N0cmlkZTJ9LCAxKSk7XG4gICAgICAgIHZlYzIgdXYgPSAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgL1xuICAgICAgICAgICAgICAgICAgIHZlYzIoJHt0ZXhOdW1DfS4wLCAke3RleE51bVJ9LjApO1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuICBpZiAodGV4TnVtQyA9PT0gc3RyaWRlMiAmJiBmbGF0T2Zmc2V0ID09IG51bGwpIHtcbiAgICAvLyB0ZXhSIGlzIHVzZWQgZGlyZWN0bHkgYXMgcGh5c2ljYWwgKG5vIHJpc2sgb2YgZmxvYXQxNiBvdmVyZmxvdykuXG4gICAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsIGludCBkZXB0aDIpIHtcbiAgICAgICAgZmxvYXQgdGV4UiA9IGRvdCh2ZWMzKHJvdywgY29sLCBkZXB0aCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgdmVjMygke3RleE5hbWV9U2hhcGVbMV0gKiAke3RleE5hbWV9U2hhcGVbMl0sICR7XG4gICAgICAgICAgdGV4TmFtZX1TaGFwZVsyXSwgMSkpO1xuICAgICAgICBmbG9hdCB0ZXhDID0gZmxvYXQoZGVwdGgyKTtcbiAgICAgICAgdmVjMiB1diA9ICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvXG4gICAgICAgICAgICAgICAgICB2ZWMyKCR7dGV4TmFtZX1UZXhTaGFwZVsxXSwgJHt0ZXhOYW1lfVRleFNoYXBlWzBdKTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsIGludCBkZXB0aDIpIHtcbiAgICAgICAgZmxvYXQgdGV4UiA9IGRvdCh2ZWMzKHJvdywgY29sLCBkZXB0aCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgdmVjMygke3NoYXBlWzFdICogc2hhcGVbMl19LCAke3NoYXBlWzJdfSwgMSkpO1xuICAgICAgICBmbG9hdCB0ZXhDID0gZmxvYXQoZGVwdGgyKTtcbiAgICAgICAgdmVjMiB1diA9ICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvXG4gICAgICAgICAgICAgICAgICB2ZWMyKCR7dGV4TnVtQ30uMCwgJHt0ZXhOdW1SfS4wKTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cblxuICBjb25zdCBvZmZzZXQgPSBnZXRGbGF0T2Zmc2V0VW5pZm9ybU5hbWUodGV4TmFtZSk7XG4gIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgcmV0dXJuIGBcbiAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsIGludCBkZXB0aDIpIHtcbiAgICAgIC8vIEV4cGxpY2l0bHkgdXNlIGludGVnZXIgb3BlcmF0aW9ucyBhcyBkb3QoKSBvbmx5IHdvcmtzIG9uIGZsb2F0cy5cbiAgICAgICR7c3RyaWRlMlN0cn1cbiAgICAgICR7c3RyaWRlMVN0cn1cbiAgICAgICR7c3RyaWRlMFN0cn1cbiAgICAgIGludCBpbmRleCA9IHJvdyAqIHN0cmlkZTAgKyBjb2wgKiBzdHJpZGUxICtcbiAgICAgICAgICBkZXB0aCAqIHN0cmlkZTIgKyBkZXB0aDI7XG4gICAgICB2ZWMyIHV2ID0gdXZGcm9tRmxhdCgke3RleE5hbWV9VGV4U2hhcGVbMF0sICR7XG4gICAgICAgIHRleE5hbWV9VGV4U2hhcGVbMV0sIGluZGV4ICsgJHtvZmZzZXR9KTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG4gIH1cbiAgcmV0dXJuIGBcbiAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsIGludCBkZXB0aDIpIHtcbiAgICAgIC8vIEV4cGxpY2l0bHkgdXNlIGludGVnZXIgb3BlcmF0aW9ucyBhcyBkb3QoKSBvbmx5IHdvcmtzIG9uIGZsb2F0cy5cbiAgICAgIGludCBpbmRleCA9IHJvdyAqICR7c3RyaWRlMH0gKyBjb2wgKiAke3N0cmlkZTF9ICtcbiAgICAgICAgICBkZXB0aCAqICR7c3RyaWRlMn0gKyBkZXB0aDI7XG4gICAgICB2ZWMyIHV2ID0gdXZGcm9tRmxhdCgke3RleE51bVJ9LCAke3RleE51bUN9LCBpbmRleCArICR7b2Zmc2V0fSk7XG4gICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgfVxuICBgO1xufVxuXG5mdW5jdGlvbiBnZXRTYW1wbGVyNUQoaW5wdXRJbmZvOiBJbnB1dEluZm8pOiBzdHJpbmcge1xuICBjb25zdCBzaGFwZSA9IGlucHV0SW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlO1xuICBjb25zdCB0ZXhOYW1lID0gaW5wdXRJbmZvLm5hbWU7XG4gIGNvbnN0IGZ1bmNOYW1lID0gJ2dldCcgKyB0ZXhOYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGV4TmFtZS5zbGljZSgxKTtcbiAgY29uc3Qgc3RyaWRlMyA9IHNoYXBlWzRdO1xuICBjb25zdCBzdHJpZGUyID0gc2hhcGVbM10gKiBzdHJpZGUzO1xuICBjb25zdCBzdHJpZGUxID0gc2hhcGVbMl0gKiBzdHJpZGUyO1xuICBjb25zdCBzdHJpZGUwID0gc2hhcGVbMV0gKiBzdHJpZGUxO1xuXG4gIGNvbnN0IHtuZXdTaGFwZSwga2VwdERpbXN9ID0gdXRpbC5zcXVlZXplU2hhcGUoc2hhcGUpO1xuICBpZiAobmV3U2hhcGUubGVuZ3RoIDwgc2hhcGUubGVuZ3RoKSB7XG4gICAgY29uc3QgbmV3SW5wdXRJbmZvID0gc3F1ZWV6ZUlucHV0SW5mbyhpbnB1dEluZm8sIG5ld1NoYXBlKTtcbiAgICBjb25zdCBwYXJhbXMgPSBbJ3JvdycsICdjb2wnLCAnZGVwdGgnLCAnZGVwdGgyJywgJ2RlcHRoMyddO1xuICAgIHJldHVybiBgXG4gICAgICAke2dldFNhbXBsZXJGcm9tSW5JbmZvKG5ld0lucHV0SW5mbyl9XG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsIGludCBkZXB0aDIsIGludCBkZXB0aDMpIHtcbiAgICAgICAgcmV0dXJuICR7ZnVuY05hbWV9KCR7Z2V0U3F1ZWV6ZWRQYXJhbXMocGFyYW1zLCBrZXB0RGltcyl9KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG5cbiAgaWYgKGlucHV0SW5mby5zaGFwZUluZm8uaXNVbmlmb3JtKSB7XG4gICAgLy8gVW5pZm9ybSBhcnJheXMgd2lsbCBiZSBsZXNzIHRoYW4gNjU1MDUgKG5vIHJpc2sgb2YgZmxvYXQxNiBvdmVyZmxvdykuXG4gICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCwgaW50IGRlcHRoMiwgaW50IGRlcHRoMykge1xuICAgICAgICBmbG9hdCBpbmRleCA9IGRvdChcbiAgICAgICAgICB2ZWM0KHJvdywgY29sLCBkZXB0aCwgZGVwdGgyKSxcbiAgICAgICAgICB2ZWM0KCR7c3RyaWRlMH0sICR7c3RyaWRlMX0sICR7c3RyaWRlMn0sICR7c3RyaWRlM30pKSArXG4gICAgICAgICAgZGVwdGgzO1xuICAgICAgICAke2dldFVuaWZvcm1TYW1wbGVyKGlucHV0SW5mbyl9XG4gICAgICB9XG4gICAgYDtcbiAgfVxuXG4gIGNvbnN0IGZsYXRPZmZzZXQgPSBpbnB1dEluZm8uc2hhcGVJbmZvLmZsYXRPZmZzZXQ7XG4gIGNvbnN0IHRleFNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby50ZXhTaGFwZTtcbiAgY29uc3QgdGV4TnVtUiA9IHRleFNoYXBlWzBdO1xuICBjb25zdCB0ZXhOdW1DID0gdGV4U2hhcGVbMV07XG5cbiAgaWYgKHRleE51bUMgPT09IHN0cmlkZTAgJiYgZmxhdE9mZnNldCA9PSBudWxsKSB7XG4gICAgLy8gdGV4QyBpcyB1c2VkIGRpcmVjdGx5IGFzIHBoeXNpY2FsIChubyByaXNrIG9mIGZsb2F0MTYgb3ZlcmZsb3cpLlxuICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsIGludCBkZXB0aDIsIGludCBkZXB0aDMpIHtcbiAgICAgICAgaW50IHRleFIgPSByb3c7XG4gICAgICAgIGZsb2F0IHRleEMgPSBkb3QodmVjNChjb2wsIGRlcHRoLCBkZXB0aDIsIGRlcHRoMyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgdmVjNCgke3N0cmlkZTF9LCAke3N0cmlkZTJ9LCAke3N0cmlkZTN9LCAxKSk7XG4gICAgICAgIHZlYzIgdXYgPSAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgL1xuICAgICAgICAgICAgICAgICAgIHZlYzIoJHt0ZXhOdW1DfS4wLCAke3RleE51bVJ9LjApO1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuXG4gIGlmICh0ZXhOdW1DID09PSBzdHJpZGUzICYmIGZsYXRPZmZzZXQgPT0gbnVsbCkge1xuICAgIC8vIHRleFIgaXMgdXNlZCBkaXJlY3RseSBhcyBwaHlzaWNhbCAobm8gcmlzayBvZiBmbG9hdDE2IG92ZXJmbG93KS5cbiAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLCBpbnQgZGVwdGgyLCBpbnQgZGVwdGgzKSB7XG4gICAgICAgIGZsb2F0IHRleFIgPSBkb3QoXG4gICAgICAgICAgdmVjNChyb3csIGNvbCwgZGVwdGgsIGRlcHRoMiksXG4gICAgICAgICAgdmVjNCgke3NoYXBlWzFdICogc2hhcGVbMl0gKiBzaGFwZVszXX0sXG4gICAgICAgICAgICAgICAke3NoYXBlWzJdICogc2hhcGVbM119LCAke3NoYXBlWzNdfSwgMSkpO1xuICAgICAgICBpbnQgdGV4QyA9IGRlcHRoMztcbiAgICAgICAgdmVjMiB1diA9ICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvXG4gICAgICAgICAgICAgICAgICB2ZWMyKCR7dGV4TnVtQ30uMCwgJHt0ZXhOdW1SfS4wKTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cblxuICBjb25zdCBvZmZzZXQgPSBnZXRGbGF0T2Zmc2V0VW5pZm9ybU5hbWUodGV4TmFtZSk7XG4gIHJldHVybiBgXG4gICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLCBpbnQgZGVwdGgyLCBpbnQgZGVwdGgzKSB7XG4gICAgICAvLyBFeHBsaWNpdGx5IHVzZSBpbnRlZ2VyIG9wZXJhdGlvbnMgYXMgZG90KCkgb25seSB3b3JrcyBvbiBmbG9hdHMuXG4gICAgICBpbnQgaW5kZXggPSByb3cgKiAke3N0cmlkZTB9ICsgY29sICogJHtzdHJpZGUxfSArIGRlcHRoICogJHtzdHJpZGUyfSArXG4gICAgICAgICAgZGVwdGgyICogJHtzdHJpZGUzfSArIGRlcHRoMyArICR7b2Zmc2V0fTtcbiAgICAgIHZlYzIgdXYgPSB1dkZyb21GbGF0KCR7dGV4TnVtUn0sICR7dGV4TnVtQ30sIGluZGV4KTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG59XG5cbmZ1bmN0aW9uIGdldFNhbXBsZXI2RChpbnB1dEluZm86IElucHV0SW5mbyk6IHN0cmluZyB7XG4gIGNvbnN0IHNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby5sb2dpY2FsU2hhcGU7XG4gIGNvbnN0IHRleE5hbWUgPSBpbnB1dEluZm8ubmFtZTtcbiAgY29uc3QgZnVuY05hbWUgPSAnZ2V0JyArIHRleE5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0ZXhOYW1lLnNsaWNlKDEpO1xuXG4gIGNvbnN0IHtuZXdTaGFwZSwga2VwdERpbXN9ID0gdXRpbC5zcXVlZXplU2hhcGUoc2hhcGUpO1xuICBpZiAobmV3U2hhcGUubGVuZ3RoIDwgc2hhcGUubGVuZ3RoKSB7XG4gICAgY29uc3QgbmV3SW5wdXRJbmZvID0gc3F1ZWV6ZUlucHV0SW5mbyhpbnB1dEluZm8sIG5ld1NoYXBlKTtcbiAgICBjb25zdCBwYXJhbXMgPSBbJ3JvdycsICdjb2wnLCAnZGVwdGgnLCAnZGVwdGgyJywgJ2RlcHRoMycsICdkZXB0aDQnXTtcbiAgICByZXR1cm4gYFxuICAgICAgJHtnZXRTYW1wbGVyRnJvbUluSW5mbyhuZXdJbnB1dEluZm8pfVxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLFxuICAgICAgICAgICAgICAgICAgICBpbnQgZGVwdGgyLCBpbnQgZGVwdGgzLCBpbnQgZGVwdGg0KSB7XG4gICAgICAgIHJldHVybiAke2Z1bmNOYW1lfSgke2dldFNxdWVlemVkUGFyYW1zKHBhcmFtcywga2VwdERpbXMpfSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuXG4gIGNvbnN0IHN0cmlkZTQgPSBzaGFwZVs1XTtcbiAgY29uc3Qgc3RyaWRlMyA9IHNoYXBlWzRdICogc3RyaWRlNDtcbiAgY29uc3Qgc3RyaWRlMiA9IHNoYXBlWzNdICogc3RyaWRlMztcbiAgY29uc3Qgc3RyaWRlMSA9IHNoYXBlWzJdICogc3RyaWRlMjtcbiAgY29uc3Qgc3RyaWRlMCA9IHNoYXBlWzFdICogc3RyaWRlMTtcblxuICBpZiAoaW5wdXRJbmZvLnNoYXBlSW5mby5pc1VuaWZvcm0pIHtcbiAgICAvLyBVbmlmb3JtIGFycmF5cyB3aWxsIGJlIGxlc3MgdGhhbiA2NTUwNSAobm8gcmlzayBvZiBmbG9hdDE2IG92ZXJmbG93KS5cbiAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLFxuICAgICAgICAgICAgICAgICAgaW50IGRlcHRoMiwgaW50IGRlcHRoMywgaW50IGRlcHRoNCkge1xuICAgICAgICBpbnQgaW5kZXggPSByb3VuZChkb3QoXG4gICAgICAgICAgdmVjNChyb3csIGNvbCwgZGVwdGgsIGRlcHRoMiksXG4gICAgICAgICAgdmVjNCgke3N0cmlkZTB9LCAke3N0cmlkZTF9LCAke3N0cmlkZTJ9LCAke3N0cmlkZTN9KSkgK1xuICAgICAgICAgIGRvdChcbiAgICAgICAgICAgIHZlYzIoZGVwdGgzLCBkZXB0aDQpLFxuICAgICAgICAgICAgdmVjMigke3N0cmlkZTR9LCAxKSkpO1xuICAgICAgICAke2dldFVuaWZvcm1TYW1wbGVyKGlucHV0SW5mbyl9XG4gICAgICB9XG4gICAgYDtcbiAgfVxuXG4gIGNvbnN0IGZsYXRPZmZzZXQgPSBpbnB1dEluZm8uc2hhcGVJbmZvLmZsYXRPZmZzZXQ7XG4gIGNvbnN0IHRleFNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby50ZXhTaGFwZTtcbiAgY29uc3QgdGV4TnVtUiA9IHRleFNoYXBlWzBdO1xuICBjb25zdCB0ZXhOdW1DID0gdGV4U2hhcGVbMV07XG4gIGlmICh0ZXhOdW1DID09PSBzdHJpZGUwICYmIGZsYXRPZmZzZXQgPT0gbnVsbCkge1xuICAgIC8vIHRleEMgaXMgdXNlZCBkaXJlY3RseSBhcyBwaHlzaWNhbCAobm8gcmlzayBvZiBmbG9hdDE2IG92ZXJmbG93KS5cbiAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLFxuICAgICAgICAgICAgICAgICAgICBpbnQgZGVwdGgyLCBpbnQgZGVwdGgzLCBpbnQgZGVwdGg0KSB7XG4gICAgICAgIGludCB0ZXhSID0gcm93O1xuICAgICAgICBmbG9hdCB0ZXhDID0gZG90KHZlYzQoY29sLCBkZXB0aCwgZGVwdGgyLCBkZXB0aDMpLFxuICAgICAgICAgIHZlYzQoJHtzdHJpZGUxfSwgJHtzdHJpZGUyfSwgJHtzdHJpZGUzfSwgJHtzdHJpZGU0fSkpICtcbiAgICAgICAgICAgICAgIGZsb2F0KGRlcHRoNCk7XG4gICAgICAgIHZlYzIgdXYgPSAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgL1xuICAgICAgICAgICAgICAgICAgIHZlYzIoJHt0ZXhOdW1DfS4wLCAke3RleE51bVJ9LjApO1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuICBpZiAodGV4TnVtQyA9PT0gc3RyaWRlNCAmJiBmbGF0T2Zmc2V0ID09IG51bGwpIHtcbiAgICAvLyB0ZXhSIGlzIHVzZWQgZGlyZWN0bHkgYXMgcGh5c2ljYWwgKG5vIHJpc2sgb2YgZmxvYXQxNiBvdmVyZmxvdykuXG4gICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCxcbiAgICAgICAgICAgICAgICAgICAgaW50IGRlcHRoMiwgaW50IGRlcHRoMywgaW50IGRlcHRoNCkge1xuICAgICAgICBmbG9hdCB0ZXhSID0gZG90KHZlYzQocm93LCBjb2wsIGRlcHRoLCBkZXB0aDIpLFxuICAgICAgICAgIHZlYzQoJHtzaGFwZVsxXSAqIHNoYXBlWzJdICogc2hhcGVbM10gKiBzaGFwZVs0XX0sXG4gICAgICAgICAgICAgICAke3NoYXBlWzJdICogc2hhcGVbM10gKiBzaGFwZVs0XX0sXG4gICAgICAgICAgICAgICAke3NoYXBlWzNdICogc2hhcGVbNF19LFxuICAgICAgICAgICAgICAgJHtzaGFwZVs0XX0pKSArIGZsb2F0KGRlcHRoMyk7XG4gICAgICAgIGludCB0ZXhDID0gZGVwdGg0O1xuICAgICAgICB2ZWMyIHV2ID0gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC9cbiAgICAgICAgICAgICAgICAgIHZlYzIoJHt0ZXhOdW1DfS4wLCAke3RleE51bVJ9LjApO1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuICBjb25zdCBvZmZzZXQgPSBnZXRGbGF0T2Zmc2V0VW5pZm9ybU5hbWUodGV4TmFtZSk7XG4gIHJldHVybiBgXG4gICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLFxuICAgICAgICAgICAgICAgICAgaW50IGRlcHRoMiwgaW50IGRlcHRoMywgaW50IGRlcHRoNCkge1xuICAgICAgLy8gRXhwbGljaXRseSB1c2UgaW50ZWdlciBvcGVyYXRpb25zIGFzIGRvdCgpIG9ubHkgd29ya3Mgb24gZmxvYXRzLlxuICAgICAgaW50IGluZGV4ID0gcm93ICogJHtzdHJpZGUwfSArIGNvbCAqICR7c3RyaWRlMX0gKyBkZXB0aCAqICR7c3RyaWRlMn0gK1xuICAgICAgICAgIGRlcHRoMiAqICR7c3RyaWRlM30gKyBkZXB0aDMgKiAke3N0cmlkZTR9ICsgZGVwdGg0ICsgJHtvZmZzZXR9O1xuICAgICAgdmVjMiB1diA9IHV2RnJvbUZsYXQoJHt0ZXhOdW1SfSwgJHt0ZXhOdW1DfSwgaW5kZXgpO1xuICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0VW5pZm9ybVNhbXBsZXIoaW5wdXRJbmZvOiBJbnB1dEluZm8pOiBzdHJpbmcge1xuICBjb25zdCB0ZXhOYW1lID0gaW5wdXRJbmZvLm5hbWU7XG4gIGNvbnN0IGluU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShpbnB1dEluZm8uc2hhcGVJbmZvLmxvZ2ljYWxTaGFwZSk7XG5cbiAgaWYgKGluU2l6ZSA8IDIpIHtcbiAgICByZXR1cm4gYHJldHVybiAke3RleE5hbWV9O2A7XG4gIH1cblxuICByZXR1cm4gYFxuICAgIGZvciAoaW50IGkgPSAwOyBpIDwgJHtpblNpemV9OyBpKyspIHtcbiAgICAgIGlmIChpID09IGluZGV4KSB7XG4gICAgICAgIHJldHVybiAke3RleE5hbWV9W2ldO1xuICAgICAgfVxuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0UGFja2VkU2FtcGxlckF0T3V0cHV0Q29vcmRzKFxuICAgIGlucHV0SW5mbzogSW5wdXRJbmZvLCBvdXRTaGFwZUluZm86IFNoYXBlSW5mbykge1xuICBjb25zdCB0ZXhOYW1lID0gaW5wdXRJbmZvLm5hbWU7XG4gIGNvbnN0IHRleEZ1bmNTbmlwcGV0ID0gdGV4TmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRleE5hbWUuc2xpY2UoMSk7XG4gIGNvbnN0IGZ1bmNOYW1lID0gJ2dldCcgKyB0ZXhGdW5jU25pcHBldCArICdBdE91dENvb3Jkcyc7XG4gIGNvbnN0IGluUmFuayA9IGlucHV0SW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlLmxlbmd0aDtcbiAgY29uc3Qgb3V0UmFuayA9IG91dFNoYXBlSW5mby5sb2dpY2FsU2hhcGUubGVuZ3RoO1xuXG4gIGNvbnN0IGJyb2FkY2FzdERpbXMgPSBnZXRCcm9hZGNhc3REaW1zKFxuICAgICAgaW5wdXRJbmZvLnNoYXBlSW5mby5sb2dpY2FsU2hhcGUsIG91dFNoYXBlSW5mby5sb2dpY2FsU2hhcGUpO1xuXG4gIGNvbnN0IHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShvdXRSYW5rKTtcbiAgY29uc3QgcmFua0RpZmYgPSBvdXRSYW5rIC0gaW5SYW5rO1xuICBsZXQgY29vcmRzU25pcHBldDogc3RyaW5nO1xuICBjb25zdCBmaWVsZHMgPSBbJ3gnLCAneScsICd6JywgJ3cnLCAndScsICd2J107XG5cbiAgaWYgKGluUmFuayA9PT0gMCkge1xuICAgIGNvb3Jkc1NuaXBwZXQgPSAnJztcbiAgfSBlbHNlIGlmIChvdXRSYW5rIDwgMiAmJiBicm9hZGNhc3REaW1zLmxlbmd0aCA+PSAxKSB7XG4gICAgY29vcmRzU25pcHBldCA9ICdjb29yZHMgPSAwOyc7XG4gIH0gZWxzZSB7XG4gICAgY29vcmRzU25pcHBldCA9XG4gICAgICAgIGJyb2FkY2FzdERpbXMubWFwKGQgPT4gYGNvb3Jkcy4ke2ZpZWxkc1tkICsgcmFua0RpZmZdfSA9IDA7YClcbiAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcbiAgfVxuICBsZXQgdW5wYWNrZWRDb29yZHNTbmlwcGV0ID0gJyc7XG4gIGlmIChvdXRSYW5rIDwgMiAmJiBpblJhbmsgPiAwKSB7XG4gICAgdW5wYWNrZWRDb29yZHNTbmlwcGV0ID0gJ2Nvb3Jkcyc7XG4gIH0gZWxzZSB7XG4gICAgdW5wYWNrZWRDb29yZHNTbmlwcGV0ID0gaW5wdXRJbmZvLnNoYXBlSW5mby5sb2dpY2FsU2hhcGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocywgaSkgPT4gYGNvb3Jkcy4ke2ZpZWxkc1tpICsgcmFua0RpZmZdfWApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKCcsICcpO1xuICB9XG5cbiAgbGV0IG91dHB1dCA9IGByZXR1cm4gb3V0cHV0VmFsdWU7YDtcbiAgY29uc3QgaW5TaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKGlucHV0SW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlKTtcbiAgY29uc3QgaXNJbnB1dFNjYWxhciA9IGluU2l6ZSA9PT0gMTtcbiAgY29uc3Qgb3V0U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShvdXRTaGFwZUluZm8ubG9naWNhbFNoYXBlKTtcbiAgY29uc3QgaXNPdXRwdXRTY2FsYXIgPSBvdXRTaXplID09PSAxO1xuXG4gIGlmIChpblJhbmsgPT09IDEgJiYgIWlzSW5wdXRTY2FsYXIgJiYgIWlzT3V0cHV0U2NhbGFyKSB7XG4gICAgb3V0cHV0ID0gYFxuICAgICAgcmV0dXJuIHZlYzQob3V0cHV0VmFsdWUueHksIG91dHB1dFZhbHVlLnh5KTtcbiAgICBgO1xuICB9IGVsc2UgaWYgKGlzSW5wdXRTY2FsYXIgJiYgIWlzT3V0cHV0U2NhbGFyKSB7XG4gICAgaWYgKG91dFJhbmsgPT09IDEpIHtcbiAgICAgIG91dHB1dCA9IGBcbiAgICAgICAgcmV0dXJuIHZlYzQob3V0cHV0VmFsdWUueCwgb3V0cHV0VmFsdWUueCwgMC4sIDAuKTtcbiAgICAgIGA7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dCA9IGBcbiAgICAgICAgcmV0dXJuIHZlYzQob3V0cHV0VmFsdWUueCk7XG4gICAgICBgO1xuICAgIH1cbiAgfSBlbHNlIGlmIChicm9hZGNhc3REaW1zLmxlbmd0aCkge1xuICAgIGNvbnN0IHJvd3MgPSBpblJhbmsgLSAyO1xuICAgIGNvbnN0IGNvbHMgPSBpblJhbmsgLSAxO1xuXG4gICAgaWYgKGJyb2FkY2FzdERpbXMuaW5kZXhPZihyb3dzKSA+IC0xICYmIGJyb2FkY2FzdERpbXMuaW5kZXhPZihjb2xzKSA+IC0xKSB7XG4gICAgICBvdXRwdXQgPSBgcmV0dXJuIHZlYzQob3V0cHV0VmFsdWUueCk7YDtcbiAgICB9IGVsc2UgaWYgKGJyb2FkY2FzdERpbXMuaW5kZXhPZihyb3dzKSA+IC0xKSB7XG4gICAgICBvdXRwdXQgPSBgcmV0dXJuIHZlYzQob3V0cHV0VmFsdWUueCwgb3V0cHV0VmFsdWUueSwgYCArXG4gICAgICAgICAgYG91dHB1dFZhbHVlLngsIG91dHB1dFZhbHVlLnkpO2A7XG4gICAgfSBlbHNlIGlmIChicm9hZGNhc3REaW1zLmluZGV4T2YoY29scykgPiAtMSkge1xuICAgICAgb3V0cHV0ID0gYHJldHVybiB2ZWM0KG91dHB1dFZhbHVlLnh4LCBvdXRwdXRWYWx1ZS56eik7YDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYFxuICAgIHZlYzQgJHtmdW5jTmFtZX0oKSB7XG4gICAgICAke3R5cGV9IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgJHtjb29yZHNTbmlwcGV0fVxuICAgICAgdmVjNCBvdXRwdXRWYWx1ZSA9IGdldCR7dGV4RnVuY1NuaXBwZXR9KCR7dW5wYWNrZWRDb29yZHNTbmlwcGV0fSk7XG4gICAgICAke291dHB1dH1cbiAgICB9XG4gIGA7XG59XG5cbmZ1bmN0aW9uIGdldFNhbXBsZXJBdE91dHB1dENvb3JkcyhcbiAgICBpbnB1dEluZm86IElucHV0SW5mbywgb3V0U2hhcGVJbmZvOiBTaGFwZUluZm8pIHtcbiAgY29uc3QgdGV4TmFtZSA9IGlucHV0SW5mby5uYW1lO1xuICBjb25zdCB0ZXhGdW5jU25pcHBldCA9IHRleE5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0ZXhOYW1lLnNsaWNlKDEpO1xuICBjb25zdCBmdW5jTmFtZSA9ICdnZXQnICsgdGV4RnVuY1NuaXBwZXQgKyAnQXRPdXRDb29yZHMnO1xuICBjb25zdCBvdXRUZXhTaGFwZSA9IG91dFNoYXBlSW5mby50ZXhTaGFwZTtcbiAgY29uc3QgaW5UZXhTaGFwZSA9IGlucHV0SW5mby5zaGFwZUluZm8udGV4U2hhcGU7XG4gIGNvbnN0IGluUmFuayA9IGlucHV0SW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlLmxlbmd0aDtcbiAgY29uc3Qgb3V0UmFuayA9IG91dFNoYXBlSW5mby5sb2dpY2FsU2hhcGUubGVuZ3RoO1xuXG4gIGlmICghaW5wdXRJbmZvLnNoYXBlSW5mby5pc1VuaWZvcm0gJiYgaW5SYW5rID09PSBvdXRSYW5rICYmXG4gICAgICBpbnB1dEluZm8uc2hhcGVJbmZvLmZsYXRPZmZzZXQgPT0gbnVsbCAmJlxuICAgICAgdXRpbC5hcnJheXNFcXVhbChpblRleFNoYXBlLCBvdXRUZXhTaGFwZSkpIHtcbiAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oKSB7XG4gICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHJlc3VsdFVWKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG5cbiAgY29uc3QgdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKG91dFJhbmspO1xuICBjb25zdCBicm9hZGNhc3REaW1zID0gZ2V0QnJvYWRjYXN0RGltcyhcbiAgICAgIGlucHV0SW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlLCBvdXRTaGFwZUluZm8ubG9naWNhbFNoYXBlKTtcbiAgY29uc3QgcmFua0RpZmYgPSBvdXRSYW5rIC0gaW5SYW5rO1xuICBsZXQgY29vcmRzU25pcHBldDogc3RyaW5nO1xuICBjb25zdCBmaWVsZHMgPSBbJ3gnLCAneScsICd6JywgJ3cnLCAndScsICd2J107XG5cbiAgaWYgKGluUmFuayA9PT0gMCkge1xuICAgIGNvb3Jkc1NuaXBwZXQgPSAnJztcbiAgfSBlbHNlIGlmIChvdXRSYW5rIDwgMiAmJiBicm9hZGNhc3REaW1zLmxlbmd0aCA+PSAxKSB7XG4gICAgY29vcmRzU25pcHBldCA9ICdjb29yZHMgPSAwOyc7XG4gIH0gZWxzZSB7XG4gICAgY29vcmRzU25pcHBldCA9XG4gICAgICAgIGJyb2FkY2FzdERpbXMubWFwKGQgPT4gYGNvb3Jkcy4ke2ZpZWxkc1tkICsgcmFua0RpZmZdfSA9IDA7YClcbiAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcbiAgfVxuICBsZXQgdW5wYWNrZWRDb29yZHNTbmlwcGV0ID0gJyc7XG4gIGlmIChvdXRSYW5rIDwgMiAmJiBpblJhbmsgPiAwKSB7XG4gICAgdW5wYWNrZWRDb29yZHNTbmlwcGV0ID0gJ2Nvb3Jkcyc7XG4gIH0gZWxzZSB7XG4gICAgdW5wYWNrZWRDb29yZHNTbmlwcGV0ID0gaW5wdXRJbmZvLnNoYXBlSW5mby5sb2dpY2FsU2hhcGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocywgaSkgPT4gYGNvb3Jkcy4ke2ZpZWxkc1tpICsgcmFua0RpZmZdfWApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKCcsICcpO1xuICB9XG5cbiAgcmV0dXJuIGBcbiAgICBmbG9hdCAke2Z1bmNOYW1lfSgpIHtcbiAgICAgICR7dHlwZX0gY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAke2Nvb3Jkc1NuaXBwZXR9XG4gICAgICByZXR1cm4gZ2V0JHt0ZXhGdW5jU25pcHBldH0oJHt1bnBhY2tlZENvb3Jkc1NuaXBwZXR9KTtcbiAgICB9XG4gIGA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb29yZHNEYXRhVHlwZShyYW5rOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAocmFuayA8PSAxKSB7XG4gICAgcmV0dXJuICdpbnQnO1xuICB9IGVsc2UgaWYgKHJhbmsgPT09IDIpIHtcbiAgICByZXR1cm4gJ2l2ZWMyJztcbiAgfSBlbHNlIGlmIChyYW5rID09PSAzKSB7XG4gICAgcmV0dXJuICdpdmVjMyc7XG4gIH0gZWxzZSBpZiAocmFuayA9PT0gNCkge1xuICAgIHJldHVybiAnaXZlYzQnO1xuICB9IGVsc2UgaWYgKHJhbmsgPT09IDUpIHtcbiAgICByZXR1cm4gJ2l2ZWM1JztcbiAgfSBlbHNlIGlmIChyYW5rID09PSA2KSB7XG4gICAgcmV0dXJuICdpdmVjNic7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgRXJyb3IoYEdQVSBmb3IgcmFuayAke3Jhbmt9IGlzIG5vdCB5ZXQgc3VwcG9ydGVkYCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVuaWZvcm1JbmZvRnJvbVNoYXBlKFxuICAgIGlzUGFja2VkOiBib29sZWFuLCBzaGFwZTogbnVtYmVyW10sIHRleFNoYXBlOiBudW1iZXJbXSkge1xuICBjb25zdCB7bmV3U2hhcGUsIGtlcHREaW1zfSA9IHV0aWwuc3F1ZWV6ZVNoYXBlKHNoYXBlKTtcbiAgY29uc3QgcmFuayA9IHNoYXBlLmxlbmd0aDtcbiAgY29uc3QgdXNlU3F1ZWV6ZVBhY2tlZFNoYXBlID0gaXNQYWNrZWQgJiYgcmFuayA9PT0gMyAmJiBzaGFwZVswXSA9PT0gMTtcbiAgY29uc3Qgc3F1ZWV6ZVNoYXBlID0gdXNlU3F1ZWV6ZVBhY2tlZFNoYXBlID8gc2hhcGUuc2xpY2UoMSkgOiBuZXdTaGFwZTtcbiAgY29uc3QgdXNlU3F1ZWV6ZVNoYXBlID1cbiAgICAgICghaXNQYWNrZWQgJiYgcmFuayA+IDEgJiYgIXV0aWwuYXJyYXlzRXF1YWwoc2hhcGUsIHRleFNoYXBlKSAmJlxuICAgICAgIG5ld1NoYXBlLmxlbmd0aCA8IHJhbmspIHx8XG4gICAgICB1c2VTcXVlZXplUGFja2VkU2hhcGU7XG4gIGNvbnN0IHVuaWZvcm1TaGFwZSA9IHVzZVNxdWVlemVTaGFwZSA/IHNxdWVlemVTaGFwZSA6IHNoYXBlO1xuICByZXR1cm4ge3VzZVNxdWVlemVTaGFwZSwgdW5pZm9ybVNoYXBlLCBrZXB0RGltc307XG59XG5cbi8qKiBSZXR1cm5zIGEgbmV3IGlucHV0IGluZm8gKGEgY29weSkgdGhhdCBoYXMgYSBzcXVlZXplZCBsb2dpY2FsIHNoYXBlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNxdWVlemVJbnB1dEluZm8oXG4gICAgaW5JbmZvOiBJbnB1dEluZm8sIHNxdWVlemVkU2hhcGU6IG51bWJlcltdKTogSW5wdXRJbmZvIHtcbiAgLy8gRGVlcCBjb3B5LlxuICBjb25zdCBuZXdJbnB1dEluZm86IElucHV0SW5mbyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoaW5JbmZvKSk7XG4gIG5ld0lucHV0SW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlID0gc3F1ZWV6ZWRTaGFwZTtcbiAgcmV0dXJuIG5ld0lucHV0SW5mbztcbn1cblxuZnVuY3Rpb24gZ2V0U3F1ZWV6ZWRQYXJhbXMocGFyYW1zOiBzdHJpbmdbXSwga2VwdERpbXM6IG51bWJlcltdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGtlcHREaW1zLm1hcChkID0+IHBhcmFtc1tkXSkuam9pbignLCAnKTtcbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHt1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG4vKipcbiAqIFByb2R1Y2VzIEdMU0wgY29kZSB0aGF0IGRlcml2ZXMgbG9naWNhbCBjb29yZGluYXRlcyBmcm9tIGEgZmxhdFxuICogaW5kZXguIFRoZSBjb2RlIHBlcmZvcm1zIGludGVnZXIgZGl2aXNpb24gd2l0aCBlYWNoIHN0cmlkZSBhbmQgZGVjcmVtZW50c1xuICogdGhlIGluZGV4IHVudGlsIHRoZSBpbmRleCBlcXVhbHMgdGhlIGZpbmFsIGRpbWVuc2lvbiBjb29yZGluYXRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9naWNhbENvb3JkaW5hdGVzRnJvbUZsYXRJbmRleChcbiAgICBjb29yZHM6IHN0cmluZ1tdLCBzaGFwZTogbnVtYmVyW10sIGluZGV4ID0gJ2luZGV4Jyk6IHN0cmluZyB7XG4gIGNvbnN0IHN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKHNoYXBlKTtcbiAgcmV0dXJuIHN0cmlkZXNcbiAgICAgIC5tYXAoKHN0cmlkZSwgaSkgPT4ge1xuICAgICAgICBjb25zdCBsaW5lMSA9IGBpbnQgJHtjb29yZHNbaV19ID0gJHtpbmRleH0gLyAke3N0cmlkZX1gO1xuICAgICAgICBjb25zdCBsaW5lMiA9IGkgPT09IHN0cmlkZXMubGVuZ3RoIC0gMSA/XG4gICAgICAgICAgICBgaW50ICR7Y29vcmRzW2kgKyAxXX0gPSAke2luZGV4fSAtICR7Y29vcmRzW2ldfSAqICR7c3RyaWRlfWAgOlxuICAgICAgICAgICAgYGluZGV4IC09ICR7Y29vcmRzW2ldfSAqICR7c3RyaWRlfWA7XG4gICAgICAgIHJldHVybiBgJHtsaW5lMX07ICR7bGluZTJ9O2A7XG4gICAgICB9KVxuICAgICAgLmpvaW4oJycpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3V0cHV0TG9naWNhbENvb3JkaW5hdGVzRnJvbUZsYXRJbmRleEJ5VW5pZm9ybShcbiAgICBjb29yZHM6IHN0cmluZ1tdLCBzaGFwZTogbnVtYmVyW10sIGluZGV4ID0gJ2luZGV4Jyk6IHN0cmluZyB7XG4gIGNvbnN0IHN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKHNoYXBlKTtcbiAgcmV0dXJuIHN0cmlkZXNcbiAgICAgIC5tYXAoKF8sIGkpID0+IHtcbiAgICAgICAgY29uc3QgbGluZTEgPSBgaW50ICR7Y29vcmRzW2ldfSA9ICR7aW5kZXh9IC8gb3V0U2hhcGVTdHJpZGVzWyR7aX1dYDtcbiAgICAgICAgY29uc3QgbGluZTIgPSBpID09PSBzdHJpZGVzLmxlbmd0aCAtIDEgP1xuICAgICAgICAgICAgYGludCAke2Nvb3Jkc1tpICsgMV19ID0gJHtpbmRleH0gLSAke2Nvb3Jkc1tpXX0gKiBvdXRTaGFwZVN0cmlkZXNbJHtcbiAgICAgICAgICAgICAgICBpfV1gIDpcbiAgICAgICAgICAgIGBpbmRleCAtPSAke2Nvb3Jkc1tpXX0gKiBvdXRTaGFwZVN0cmlkZXNbJHtpfV1gO1xuICAgICAgICByZXR1cm4gYCR7bGluZTF9OyAke2xpbmUyfTtgO1xuICAgICAgfSlcbiAgICAgIC5qb2luKCcnKTtcbn1cblxuLy8gUHJvZHVjZXMgR0xTTCBjb2RlIHRoYXQgY29tcHV0ZXMgc3RyaWRlcy5cbmZ1bmN0aW9uIHN5bWJvbGljYWxseUNvbXB1dGVTdHJpZGVzKFxuICAgIGluZGljZXNBcnI6IG51bWJlcltdLCB2YXJpYWJsZU5hbWU6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgbnVtQ29vcmRzID0gaW5kaWNlc0Fyci5sZW5ndGg7XG4gIGNvbnN0IHNoYXBlID0gaW5kaWNlc0Fyci5tYXAoZCA9PiBgJHt2YXJpYWJsZU5hbWV9WyR7ZH1dYCk7XG4gIGNvbnN0IHN0cmlkZXMgPSBuZXcgQXJyYXkobnVtQ29vcmRzIC0gMSk7XG4gIHN0cmlkZXNbbnVtQ29vcmRzIC0gMl0gPSBzaGFwZVtudW1Db29yZHMgLSAxXTtcbiAgZm9yIChsZXQgaSA9IG51bUNvb3JkcyAtIDM7IGkgPj0gMDsgLS1pKSB7XG4gICAgc3RyaWRlc1tpXSA9IGAoJHtzdHJpZGVzW2kgKyAxXX0gKiAke3NoYXBlW2kgKyAxXX0pYDtcbiAgfVxuXG4gIHJldHVybiBzdHJpZGVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9naWNhbENvb3JkaW5hdGVzRnJvbUZsYXRJbmRleEJ5VW5pZm9ybShcbiAgICBjb29yZHM6IHN0cmluZ1tdLCB2YXJpYWJsZU5hbWU6IHN0cmluZywgaW5kZXggPSAnaW5kZXgnKTogc3RyaW5nIHtcbiAgY29uc3QgaW5kaWNlc0FycmF5ID0gY29vcmRzLm1hcCgoXywgaSkgPT4gaSk7XG4gIGNvbnN0IHN0cmlkZXMgPSBzeW1ib2xpY2FsbHlDb21wdXRlU3RyaWRlcyhpbmRpY2VzQXJyYXksIHZhcmlhYmxlTmFtZSk7XG4gIHJldHVybiBzdHJpZGVzXG4gICAgICAubWFwKChfLCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IGxpbmUxID0gYGludCAke2Nvb3Jkc1tpXX0gPSAke2luZGV4fSAvICR7c3RyaWRlc1tpXX1gO1xuICAgICAgICBjb25zdCBsaW5lMiA9IGkgPT09IHN0cmlkZXMubGVuZ3RoIC0gMSA/XG4gICAgICAgICAgICBgaW50ICR7Y29vcmRzW2kgKyAxXX0gPSAke2luZGV4fSAtICR7Y29vcmRzW2ldfSAqICR7c3RyaWRlc1tpXX1gIDpcbiAgICAgICAgICAgIGBpbmRleCAtPSAke2Nvb3Jkc1tpXX0gKiAke3N0cmlkZXNbaV19YDtcbiAgICAgICAgcmV0dXJuIGAke2xpbmUxfTsgJHtsaW5lMn07YDtcbiAgICAgIH0pXG4gICAgICAuam9pbignJyk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkVmVjKHg6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgaWYgKHgubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIGAke3hbMF19YDtcbiAgfVxuICByZXR1cm4gYHZlYyR7eC5sZW5ndGh9KCR7eC5qb2luKCcsJyl9KWA7XG59XG5cbi8qKlxuICogUHJvZHVjZXMgR0xTTCBjb2RlIHRoYXQgY29tcHV0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHRoZSBpbnB1dCB4IGFuZCB5XG4gKiB2ZWN0b3JzLiBIYW5kbGVzIHNwbGl0dGluZyBpbnB1dHMgaW50byBpbmNyZW1lbnRzIG9mIHZlYzRzIHdoZW4gbmVjZXNzYXJ5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZG90aWZ5KHg6IHN0cmluZ1tdLCB5OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGlmICh4Lmxlbmd0aCAhPT0geS5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBWZWN0b3JzIHRvIGJlIGRvdHRlZCBtdXN0IGJlIG9mIHRoZSBzYW1lIGxlbmd0aCAtYCArXG4gICAgICAgIGBnb3QgJHt4Lmxlbmd0aH0gYW5kICR7eS5sZW5ndGh9YCk7XG4gIH1cblxuICBjb25zdCBzbGljZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IG5lYXJlc3RWZWM0ID0gTWF0aC5mbG9vcih4Lmxlbmd0aCAvIDQpO1xuICBjb25zdCBuZWFyZXN0VmVjNFJlbWFpbmRlciA9IHgubGVuZ3RoICUgNDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG5lYXJlc3RWZWM0OyBpKyspIHtcbiAgICBjb25zdCB4U2xpY2UgPSB4LnNsaWNlKGkgKiA0LCBpICogNCArIDQpO1xuICAgIGNvbnN0IHlTbGljZSA9IHkuc2xpY2UoaSAqIDQsIGkgKiA0ICsgNCk7XG4gICAgc2xpY2VzLnB1c2goYCR7YnVpbGRWZWMoeFNsaWNlKX0sICR7YnVpbGRWZWMoeVNsaWNlKX1gKTtcbiAgfVxuXG4gIGlmIChuZWFyZXN0VmVjNFJlbWFpbmRlciAhPT0gMCkge1xuICAgIGxldCB4U2xpY2UgPSB4LnNsaWNlKG5lYXJlc3RWZWM0ICogNCk7XG4gICAgbGV0IHlTbGljZSA9IHkuc2xpY2UobmVhcmVzdFZlYzQgKiA0KTtcbiAgICBpZiAoeFNsaWNlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgeFNsaWNlID0geFNsaWNlLm1hcChkID0+IGBmbG9hdCgke2R9KWApO1xuICAgICAgeVNsaWNlID0geVNsaWNlLm1hcChkID0+IGBmbG9hdCgke2R9KWApO1xuICAgIH1cbiAgICBzbGljZXMucHVzaChgJHtidWlsZFZlYyh4U2xpY2UpfSwgJHtidWlsZFZlYyh5U2xpY2UpfWApO1xuICB9XG5cbiAgcmV0dXJuIHNsaWNlcy5tYXAoKGQsIGkpID0+IGBkb3QoJHtkfSlgKS5qb2luKCcrJyk7XG59XG5cbi8qKlxuICogUHJvZHVjZXMgR0xTTCB0aGF0IGNvbXB1dGVzIHRoZSBmbGF0IGluZGV4IGZyb20gM0QgY29vcmRpbmF0ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGbGF0SW5kZXhGcm9tM0Qoc2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSk6IHN0cmluZyB7XG4gIGNvbnN0IHN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKHNoYXBlKS5tYXAoZCA9PiBkLnRvU3RyaW5nKCkpO1xuXG4gIHJldHVybiBgXG4gIGludCBnZXRGbGF0SW5kZXgoaXZlYzMgY29vcmRzKSB7XG4gICAgcmV0dXJuIGNvb3Jkcy54ICogJHtzdHJpZGVzWzBdfSArIGNvb3Jkcy55ICogJHtzdHJpZGVzWzFdfSArIGNvb3Jkcy56O1xuICB9XG5gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmxhdEluZGV4RnJvbTNET3V0cHV0KCk6IHN0cmluZyB7XG4gIHJldHVybiBgXG4gIGludCBnZXRGbGF0SW5kZXgoaXZlYzMgY29vcmRzKSB7XG4gICAgcmV0dXJuIGNvb3Jkcy54ICogb3V0U2hhcGVTdHJpZGVzWzBdICsgY29vcmRzLnkgKiBvdXRTaGFwZVN0cmlkZXNbMV0gKyBjb29yZHMuejtcbiAgfVxuYDtcbn1cblxuZXhwb3J0IGNvbnN0IEVOQ09ERV9GTE9BVF9TTklQUEVUID0gYFxuICBjb25zdCBmbG9hdCBGTE9BVF9NQVggPSAxLjcwMTQxMTg0ZTM4O1xuICBjb25zdCBmbG9hdCBGTE9BVF9NSU4gPSAxLjE3NTQ5NDM1ZS0zODtcblxuICBsb3dwIHZlYzQgZW5jb2RlX2Zsb2F0KGhpZ2hwIGZsb2F0IHYpIHtcbiAgICBpZiAoaXNuYW4odikpIHtcbiAgICAgIHJldHVybiB2ZWM0KDI1NSwgMjU1LCAyNTUsIDI1NSk7XG4gICAgfVxuXG4gICAgaGlnaHAgZmxvYXQgYXYgPSBhYnModik7XG5cbiAgICBpZihhdiA8IEZMT0FUX01JTikge1xuICAgICAgcmV0dXJuIHZlYzQoMC4wLCAwLjAsIDAuMCwgMC4wKTtcbiAgICB9IGVsc2UgaWYodiA+IEZMT0FUX01BWCkge1xuICAgICAgcmV0dXJuIHZlYzQoMC4wLCAwLjAsIDEyOC4wLCAxMjcuMCkgLyAyNTUuMDtcbiAgICB9IGVsc2UgaWYodiA8IC1GTE9BVF9NQVgpIHtcbiAgICAgIHJldHVybiB2ZWM0KDAuMCwgMC4wLCAgMTI4LjAsIDI1NS4wKSAvIDI1NS4wO1xuICAgIH1cblxuICAgIGhpZ2hwIHZlYzQgYyA9IHZlYzQoMCwwLDAsMCk7XG5cbiAgICBoaWdocCBmbG9hdCBlID0gZmxvb3IobG9nMihhdikpO1xuICAgIGhpZ2hwIGZsb2F0IG0gPSBleHAyKGZyYWN0KGxvZzIoYXYpKSkgLSAxLjA7XG5cbiAgICBjWzJdID0gZmxvb3IoMTI4LjAgKiBtKTtcbiAgICBtIC09IGNbMl0gLyAxMjguMDtcbiAgICBjWzFdID0gZmxvb3IoMzI3NjguMCAqIG0pO1xuICAgIG0gLT0gY1sxXSAvIDMyNzY4LjA7XG4gICAgY1swXSA9IGZsb29yKDgzODg2MDguMCAqIG0pO1xuXG4gICAgaGlnaHAgZmxvYXQgZWJpYXMgPSBlICsgMTI3LjA7XG4gICAgY1szXSA9IGZsb29yKGViaWFzIC8gMi4wKTtcbiAgICBlYmlhcyAtPSBjWzNdICogMi4wO1xuICAgIGNbMl0gKz0gZmxvb3IoZWJpYXMpICogMTI4LjA7XG5cbiAgICBjWzNdICs9IDEyOC4wICogc3RlcCgwLjAsIC12KTtcblxuICAgIHJldHVybiBjIC8gMjU1LjA7XG4gIH1cbmA7XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtnZXRDb29yZHNEYXRhVHlwZSwgVW5pZm9ybVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuZXhwb3J0IGNsYXNzIFNsaWNlUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3NvdXJjZSddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIHJhbms6IG51bWJlcjtcbiAgY3VzdG9tVW5pZm9ybXM6IEFycmF5PHtuYW1lOiBzdHJpbmc7IGFycmF5SW5kZXg6IG51bWJlcjsgdHlwZTogVW5pZm9ybVR5cGU7fT47XG5cbiAgY29uc3RydWN0b3IoZGVzdFNpemU6IG51bWJlcltdKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGRlc3RTaXplO1xuICAgIHRoaXMucmFuayA9IGRlc3RTaXplLmxlbmd0aDtcblxuICAgIGNvbnN0IGR0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUodGhpcy5yYW5rKTtcbiAgICB0aGlzLmN1c3RvbVVuaWZvcm1zID0gW3tuYW1lOiAnc3RhcnQnLCBhcnJheUluZGV4OiB0aGlzLnJhbmssIHR5cGU6ICdpbnQnfV07XG4gICAgY29uc3Qgc291cmNlQ29vcmRzID0gZ2V0Q29vcmRzKHRoaXMucmFuayk7XG5cbiAgICBsZXQgYm9keTogc3RyaW5nO1xuICAgIGNvbnN0IGNvb3JkU3VtID0gZGVzdFNpemUubWFwKChfLCBpKSA9PiB7XG4gICAgICByZXR1cm4gYHNvdXJjZUxvYy4ke2Nvb3Jkc1tpXX0gPSBzdGFydFske2l9XSArIGNvb3Jkcy4ke2Nvb3Jkc1tpXX07YDtcbiAgICB9KTtcbiAgICBib2R5ID0gYFxuICAgICAgICAke2R0eXBlfSBzb3VyY2VMb2M7XG4gICAgICAgICR7ZHR5cGV9IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAke2Nvb3JkU3VtLmpvaW4oJ1xcbicpfVxuICAgICAgYDtcbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke2JvZHl9XG4gICAgICAgIHNldE91dHB1dChnZXRTb3VyY2UoJHtzb3VyY2VDb29yZHN9KSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuXG5jb25zdCBjb29yZHMgPSBbJ3gnLCAneScsICd6JywgJ3cnLCAndScsICd2J107XG5cbmZ1bmN0aW9uIGdldENvb3JkcyhyYW5rOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAocmFuayA9PT0gMSkge1xuICAgIHJldHVybiAnc291cmNlTG9jJztcbiAgfSBlbHNlIGlmIChyYW5rIDw9IDYpIHtcbiAgICByZXR1cm4gY29vcmRzLnNsaWNlKDAsIHJhbmspLm1hcCh4ID0+ICdzb3VyY2VMb2MuJyArIHgpLmpvaW4oJywnKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBFcnJvcihgU2xpY2luZyBmb3IgcmFuayAke3Jhbmt9IGlzIG5vdCB5ZXQgc3VwcG9ydGVkYCk7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5pbXBvcnQge2dldENoYW5uZWxzfSBmcm9tICcuL3BhY2tpbmdfdXRpbCc7XG5pbXBvcnQge2dldENvb3Jkc0RhdGFUeXBlLCBVbmlmb3JtVHlwZX0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuXG5leHBvcnQgY2xhc3MgU2xpY2VQYWNrZWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnc291cmNlJ107XG4gIHBhY2tlZElucHV0cyA9IHRydWU7XG4gIHBhY2tlZE91dHB1dCA9IHRydWU7XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgcmFuazogbnVtYmVyO1xuICBjdXN0b21Vbmlmb3JtczogQXJyYXk8e25hbWU6IHN0cmluZzsgYXJyYXlJbmRleDogbnVtYmVyOyB0eXBlOiBVbmlmb3JtVHlwZTt9PjtcblxuICBjb25zdHJ1Y3RvcihkZXN0U2l6ZTogbnVtYmVyW10pIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gZGVzdFNpemU7XG4gICAgdGhpcy5yYW5rID0gZGVzdFNpemUubGVuZ3RoO1xuICAgIHRoaXMuY3VzdG9tVW5pZm9ybXMgPSBbe25hbWU6ICdzdGFydCcsIGFycmF5SW5kZXg6IHRoaXMucmFuaywgdHlwZTogJ2ludCd9XTtcbiAgICBjb25zdCBkdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHRoaXMucmFuayk7XG4gICAgY29uc3QgY29vcmRzID0gZ2V0Q2hhbm5lbHMoJ2Nvb3JkcycsIHRoaXMucmFuayk7XG4gICAgY29uc3Qgc291cmNlTG9jID0gZ2V0Q2hhbm5lbHMoJ3NvdXJjZUxvYycsIHRoaXMucmFuayk7XG5cbiAgICBjb25zdCBpbm5lckRpbXMgPVxuICAgICAgICB0aGlzLnJhbmsgPT09IDEgPyAnc291cmNlTG9jJyA6IGB2ZWMyKCR7c291cmNlTG9jLnNsaWNlKC0yKS5qb2luKCl9KWA7XG4gICAgY29uc3QgZ2V0Q2hhbm5lbCA9XG4gICAgICAgIGBnZXRDaGFubmVsKGdldFNvdXJjZSgke3NvdXJjZUxvYy5qb2luKCl9KSwgJHtpbm5lckRpbXN9KWA7XG4gICAgY29uc3QgdXBwZXJSb3cgPSBgXG4gICAgICByZXN1bHQueCA9ICR7Z2V0Q2hhbm5lbH07XG4gICAgICBpZiAoKyske2Nvb3Jkc1t0aGlzLnJhbmsgLSAxXX0gPCAke2Rlc3RTaXplW3RoaXMucmFuayAtIDFdfSkge1xuICAgICAgICArKyR7c291cmNlTG9jW3RoaXMucmFuayAtIDFdfTtcbiAgICAgICAgcmVzdWx0LnkgPSAke2dldENoYW5uZWx9O1xuICAgICAgICAtLSR7c291cmNlTG9jW3RoaXMucmFuayAtIDFdfTtcbiAgICAgIH1cbiAgICBgO1xuICAgIGNvbnN0IGxvd2VyUm93ID0gdGhpcy5yYW5rID09PSAxID8gJycgOiBgXG4gICAgICAtLSR7Y29vcmRzW3RoaXMucmFuayAtIDFdfTtcbiAgICAgIGlmICgrKyR7Y29vcmRzW3RoaXMucmFuayAtIDJdfSA8ICR7ZGVzdFNpemVbdGhpcy5yYW5rIC0gMl19KSB7XG4gICAgICAgICsrJHtzb3VyY2VMb2NbdGhpcy5yYW5rIC0gMl19O1xuICAgICAgICByZXN1bHQueiA9ICR7Z2V0Q2hhbm5lbH07XG4gICAgICAgIGlmICgrKyR7Y29vcmRzW3RoaXMucmFuayAtIDFdfSA8ICR7ZGVzdFNpemVbdGhpcy5yYW5rIC0gMV19KSB7XG4gICAgICAgICAgKyske3NvdXJjZUxvY1t0aGlzLnJhbmsgLSAxXX07XG4gICAgICAgICAgcmVzdWx0LncgPSAke2dldENoYW5uZWx9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgYDtcblxuICAgIGNvbnN0IHNvdXJjZUxvY1NldHVwID0gdGhpcy5yYW5rIDw9IDQgP1xuICAgICAgICBgc291cmNlTG9jID0gY29vcmRzICtcbiAgICAgICAgICAgICR7ZHR5cGV9KCR7ZGVzdFNpemUubWFwKChfLCBpKSA9PiBgc3RhcnRbJHtpfV1gKS5qb2luKCl9KTtgIDpcbiAgICAgICAgZGVzdFNpemUubWFwKChfLCBpKSA9PiBgJHtzb3VyY2VMb2NbaV19ID0gJHtjb29yZHNbaV19ICsgc3RhcnRbJHtpfV07YClcbiAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke2R0eXBlfSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgJHtkdHlwZX0gc291cmNlTG9jO1xuICAgICAgICAke3NvdXJjZUxvY1NldHVwfVxuICAgICAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoMC4pO1xuICAgICAgICAke3VwcGVyUm93fVxuICAgICAgICAke2xvd2VyUm93fVxuICAgICAgICBzZXRPdXRwdXQocmVzdWx0KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtnZXRDb29yZHNEYXRhVHlwZX0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuXG5leHBvcnQgY2xhc3MgU3RyaWRlZFNsaWNlUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGJlZ2luOiBudW1iZXJbXSwgc3RyaWRlczogbnVtYmVyW10sIHNpemU6IG51bWJlcltdKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IHNpemU7XG4gICAgY29uc3QgcmFuayA9IHNpemUubGVuZ3RoO1xuICAgIGNvbnN0IGlucHV0RHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShzaXplLmxlbmd0aCk7XG4gICAgY29uc3QgZHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShzaXplLmxlbmd0aCk7XG5cbiAgICBsZXQgbmV3Q29vcmRzID0gJyc7XG4gICAgaWYgKHJhbmsgPT09IDEpIHtcbiAgICAgIG5ld0Nvb3JkcyA9ICdjb29yZHMgKiBzdHJpZGVzICsgYmVnaW4nO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgb3V0cHV0QXhpcyA9IDA7XG4gICAgICBuZXdDb29yZHMgPVxuICAgICAgICAgIHNpemUubWFwKChfLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgb3V0cHV0QXhpcysrO1xuICAgICAgICAgICAgICAgIHJldHVybiBzaXplLmxlbmd0aCA9PT0gMSA/XG4gICAgICAgICAgICAgICAgICAgIGBjb29yZHMgKiBzdHJpZGVzWyR7aX1dICsgYmVnaW5bJHtpfV1gIDpcbiAgICAgICAgICAgICAgICAgICAgYGNvb3Jkc1ske291dHB1dEF4aXMgLSAxfV0gKiBzdHJpZGVzWyR7aX1dICsgYmVnaW5bJHtpfV1gO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAuam9pbignLCcpO1xuICAgIH1cblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAke2lucHV0RHR5cGV9IGJlZ2luID0gJHtpbnB1dER0eXBlfSgke2JlZ2lufSk7XG4gICAgICAke2lucHV0RHR5cGV9IHN0cmlkZXMgPSAke2lucHV0RHR5cGV9KCR7c3RyaWRlc30pO1xuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICR7ZHR5cGV9IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBzZXRPdXRwdXQoZ2V0WCgke25ld0Nvb3Jkc30pKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBEYXRhSWQsIERhdGFUeXBlLCBlbnYsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmV4cG9ydCBlbnVtIFBhY2tpbmdTY2hlbWUge1xuICAvKipcbiAgICogQWxsIHZhbHVlcyBpbiBhIHNpbmdsZSB0ZXhlbCBhcmUgZGVuc2VseSBwYWNrZWQgd2l0aG91dCBhbnkgY29uc3RyYWludHMuXG4gICAqXG4gICAqIFRoaXMgaXMgaG93IHRoZSBzaGFkZXIgZW5jb2RlcyBhIHRlbnNvciB3aXRoIHNoYXBlID0gWzIsIDMsIDRdXG4gICAqIChpbmRpY2VzIGFyZSBbYmF0Y2gsIHJvdywgY29sXSkuXG4gICAqXG4gICAqIDAwMHwwMDEgICAwMTB8MDExICAgMDIwfDAyMVxuICAgKiAtLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS1cbiAgICogMDAyfDAwMyAgIDAxMnwwMTMgICAwMjJ8MDIzXG4gICAqXG4gICAqIDEwMHwxMDEgICAxMTB8MTExICAgMTIwfDEyMVxuICAgKiAtLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS1cbiAgICogMTAyfDEwMyAgIDExMnwxMTMgICAxMjJ8MTIzXG4gICAqXG4gICAqL1xuICBERU5TRSxcblxuICAvKipcbiAgICogU2luZ2xlIHRleGVscyBjb250YWluIG9ubHkgdmFsdWVzIGZyb20gdGhlIHNhbWUgYmF0Y2gsIGFuZCBmcm9tIGFkamFjZW50XG4gICAqIHJvd3MgYW5kIGNvbHVtbnMuXG4gICAqXG4gICAqIFRoaXMgaXMgaG93IHRoZSBzaGFkZXIgZW5jb2RlcyBhIHRlbnNvciB3aXRoIHNoYXBlID0gWzIsIDMsIDVdXG4gICAqIChpbmRpY2VzIGFyZSBbYmF0Y2gsIHJvdywgY29sXSkuXG4gICAqXG4gICAqIDAwMHwwMDEgICAwMDJ8MDAzICAgMDA0fHh4eCAgIDAyMHwwMjEgICAwMjJ8MDIzICAgMDI0fHh4eFxuICAgKiAtLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS0gICAtLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS1cbiAgICogMDEwfDAxMSAgIDAxMnwwMTMgICAwMTR8eHh4ICAgeHh4fHh4eCAgIHh4eHx4eHggICB4eHh8eHh4XG4gICAqXG4gICAqIDEwMHwxMDEgICAxMDJ8MTAzICAgMTA0fHh4eCAgIDEyMHwxMjEgICAxMjJ8MTIzICAgMTI0fHh4eFxuICAgKiAtLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS0gICAtLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS1cbiAgICogMTEwfDExMSAgIDExMnwxMTMgICAxMTR8eHh4ICAgeHh4fHh4eCAgIHh4eHx4eHggICB4eHh8eHh4XG4gICAqXG4gICAqL1xuICBTSEFSRURfQkFUQ0hcbn1cblxuZXhwb3J0IGVudW0gVGV4dHVyZVVzYWdlIHtcbiAgUkVOREVSLFxuICBVUExPQUQsXG4gIFBJWEVMUyxcbiAgRE9XTkxPQURcbn1cblxuZXhwb3J0IGVudW0gUGh5c2ljYWxUZXh0dXJlVHlwZSB7XG4gIFVOUEFDS0VEX0ZMT0FUMTYsXG4gIFVOUEFDS0VEX0ZMT0FUMzIsXG4gIFBBQ0tFRF80WDFfVU5TSUdORURfQllURSxcbiAgUEFDS0VEXzJYMl9GTE9BVDMyLFxuICBQQUNLRURfMlgyX0ZMT0FUMTZcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZXh0dXJlRGF0YSB7XG4gIC8vIFJlcXVpcmVkLlxuICBzaGFwZTogbnVtYmVyW107XG4gIGR0eXBlOiBEYXRhVHlwZTtcblxuICAvLyBPcHRpb25hbC5cbiAgdmFsdWVzPzogYmFja2VuZF91dGlsLkJhY2tlbmRWYWx1ZXM7XG4gIHRleHR1cmU/OiBXZWJHTFRleHR1cmU7XG4gIC8vIEZvciBjb21wbGV4IG51bWJlcnMsIHRoZSByZWFsIGFuZCBpbWFnaW5hcnkgcGFydHMgYXJlIHN0b3JlZCBhcyB0aGVpciBvd25cbiAgLy8gaW5kaXZpZHVhbCB0ZW5zb3JJbmZvcywgd2l0aCBhIHBhcmVudCBqb2luaW5nIHRoZSB0d28gd2l0aCB0aGVcbiAgLy8gY29tcGxleFRlbnNvcnMgZmllbGQuIFdoZW4gdGhpcyBpcyBkZWZpbmVkLCB0ZXh0dXJlIHdpbGwgYmUgbnVsbC5cbiAgY29tcGxleFRlbnNvckluZm9zPzoge3JlYWw6IFRlbnNvckluZm8sIGltYWc6IFRlbnNvckluZm99O1xuICAvKiogW3Jvd3MsIGNvbHVtbnNdIHNoYXBlIG9mIHRoZSB0ZXh0dXJlLiAqL1xuICB0ZXhTaGFwZT86IFtudW1iZXIsIG51bWJlcl07XG4gIHVzYWdlPzogVGV4dHVyZVVzYWdlO1xuICBpc1BhY2tlZD86IGJvb2xlYW47XG5cbiAgcmVmQ291bnQ6IG51bWJlcjtcblxuICAvLyBBdmFpbGFibGUgd2hlbiB0aGUgdGVuc29yIGhhcyBiZWVuIHNsaWNlZC5cbiAgc2xpY2U/OiB7XG4gICAgLy8gT2Zmc2V0IGluIHRoZSAnZmxhdCBpbmRleCcgc3BhY2UuXG4gICAgZmxhdE9mZnNldDogbnVtYmVyO1xuICAgIC8vIFVzZWQgZm9yIGNvdW50aW5nIGhvdyBtYW55IHNsaWNlZCB0ZW5zb3JzIHBvaW50IHRvIHRoZSBzYW1lIHRleHR1cmUuXG4gICAgb3JpZ0RhdGFJZDogRGF0YUlkO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VW5wYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodChcbiAgICByb3dzOiBudW1iZXIsIGNvbHVtbnM6IG51bWJlcik6IFtudW1iZXIsIG51bWJlcl0ge1xuICByZXR1cm4gW2NvbHVtbnMsIHJvd3NdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VW5wYWNrZWRBcnJheVNpemVGcm9tTWF0cml4U2l6ZShcbiAgICBtYXRyaXhTaXplOiBudW1iZXIsIGNoYW5uZWxzUGVyVGV4dHVyZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIG1hdHJpeFNpemUgKiBjaGFubmVsc1BlclRleHR1cmU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb2xvck1hdHJpeFRleHR1cmVTaGFwZVdpZHRoSGVpZ2h0KFxuICAgIHJvd3M6IG51bWJlciwgY29sdW1uczogbnVtYmVyKTogW251bWJlciwgbnVtYmVyXSB7XG4gIHJldHVybiBbY29sdW1ucyAqIDQsIHJvd3NdO1xufVxuXG4vKipcbiAqIEdldCBzaGFwZSBmb3IgZGVuc2VseSBwYWNrZWQgUkdCQSB0ZXh0dXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVuc2VUZXhTaGFwZShzaGFwZTogbnVtYmVyW10pOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgY29uc3Qgc2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShzaGFwZSk7XG4gIGNvbnN0IHRleGVsc05lZWRlZCA9IE1hdGguY2VpbChzaXplIC8gNCk7XG4gIHJldHVybiB1dGlsLnNpemVUb1NxdWFyaXNoU2hhcGUodGV4ZWxzTmVlZGVkKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1hdHJpeFNpemVGcm9tVW5wYWNrZWRBcnJheVNpemUoXG4gICAgdW5wYWNrZWRTaXplOiBudW1iZXIsIGNoYW5uZWxzUGVyVGV4dHVyZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKHVucGFja2VkU2l6ZSAlIGNoYW5uZWxzUGVyVGV4dHVyZSAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYHVucGFja2VkU2l6ZSAoJHt1bnBhY2tlZFNpemV9KSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgYCArXG4gICAgICAgIGAke2NoYW5uZWxzUGVyVGV4dHVyZX1gKTtcbiAgfVxuICByZXR1cm4gdW5wYWNrZWRTaXplIC8gY2hhbm5lbHNQZXJUZXh0dXJlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlTWF0cml4RnJvbVVucGFja2VkQ29sb3JSR0JBQXJyYXkoXG4gICAgdW5wYWNrZWRBcnJheTogRmxvYXQzMkFycmF5LCBtYXRyaXg6IEZsb2F0MzJBcnJheSwgY2hhbm5lbHM6IG51bWJlcikge1xuICBjb25zdCByZXF1aXJlZFNpemUgPSB1bnBhY2tlZEFycmF5Lmxlbmd0aCAqIGNoYW5uZWxzIC8gNDtcbiAgaWYgKG1hdHJpeC5sZW5ndGggPCByZXF1aXJlZFNpemUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBtYXRyaXggbGVuZ3RoICgke21hdHJpeC5sZW5ndGh9KSBtdXN0IGJlID49ICR7cmVxdWlyZWRTaXplfWApO1xuICB9XG4gIGxldCBkc3QgPSAwO1xuICBmb3IgKGxldCBzcmMgPSAwOyBzcmMgPCB1bnBhY2tlZEFycmF5Lmxlbmd0aDsgc3JjICs9IDQpIHtcbiAgICBmb3IgKGxldCBjID0gMDsgYyA8IGNoYW5uZWxzOyBjKyspIHtcbiAgICAgIG1hdHJpeFtkc3QrK10gPSB1bnBhY2tlZEFycmF5W3NyYyArIGNdO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFja2VkTWF0cml4VGV4dHVyZVNoYXBlV2lkdGhIZWlnaHQoXG4gICAgcm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgcmV0dXJuIFtcbiAgICBNYXRoLm1heCgxLCBNYXRoLmNlaWwoY29sdW1ucyAvIDIpKSwgTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHJvd3MgLyAyKSlcbiAgXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhY2tlZFJHQkFBcnJheVNpemVGcm9tTWF0cml4U2hhcGUoXG4gICAgcm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBbdywgaF0gPSBnZXRQYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodChyb3dzLCBjb2x1bW5zKTtcbiAgcmV0dXJuIHcgKiBoICogNDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZXh0dXJlQ29uZmlnIHtcbiAgaW50ZXJuYWxGb3JtYXRGbG9hdDogbnVtYmVyO1xuICB0ZXh0dXJlRm9ybWF0RmxvYXQ6IG51bWJlcjtcbiAgaW50ZXJuYWxGb3JtYXRQYWNrZWRIYWxmRmxvYXQ6IG51bWJlcjtcbiAgaW50ZXJuYWxGb3JtYXRIYWxmRmxvYXQ6IG51bWJlcjtcbiAgaW50ZXJuYWxGb3JtYXRQYWNrZWRGbG9hdDogbnVtYmVyO1xuXG4gIC8vIFRoZSBmb3JtYXQgdG8gdXNlIGR1cmluZyBhIGdsLnJlYWRQaXhlbHMgY2FsbC5cbiAgZG93bmxvYWRUZXh0dXJlRm9ybWF0OiBudW1iZXI7XG4gIC8vIEhvdyBtYW55IGNoYW5uZWxzIG5lZWQgdG8gYmUgdW5wYWNrZWQgYWZ0ZXIgYSBnbC5yZWFkUGl4ZWxzIGNhbGwuXG4gIGRvd25sb2FkVW5wYWNrTnVtQ2hhbm5lbHM6IG51bWJlcjtcblxuICBkZWZhdWx0TnVtQ2hhbm5lbHM6IG51bWJlcjtcbiAgdGV4dHVyZVR5cGVIYWxmRmxvYXQ6IG51bWJlcjtcbiAgdGV4dHVyZVR5cGVGbG9hdDogbnVtYmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGV4dHVyZUNvbmZpZyhcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgdGV4dHVyZUhhbGZGbG9hdEV4dGVuc2lvbj86IGFueSk6IFRleHR1cmVDb25maWcge1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIGNvbnN0IGdsYW55ID0gZ2wgYXMgYW55O1xuXG4gIGxldCBpbnRlcm5hbEZvcm1hdEZsb2F0OiBudW1iZXI7XG4gIGxldCBpbnRlcm5hbEZvcm1hdEhhbGZGbG9hdDogbnVtYmVyO1xuICBsZXQgaW50ZXJuYWxGb3JtYXRQYWNrZWRIYWxmRmxvYXQ6IG51bWJlcjtcbiAgbGV0IGludGVybmFsRm9ybWF0UGFja2VkRmxvYXQ6IG51bWJlcjtcbiAgbGV0IHRleHR1cmVGb3JtYXRGbG9hdDogbnVtYmVyO1xuXG4gIGxldCBkb3dubG9hZFRleHR1cmVGb3JtYXQ6IG51bWJlcjtcbiAgbGV0IGRvd25sb2FkVW5wYWNrTnVtQ2hhbm5lbHM6IG51bWJlcjtcblxuICBsZXQgZGVmYXVsdE51bUNoYW5uZWxzOiBudW1iZXI7XG4gIGxldCB0ZXh0dXJlVHlwZUhhbGZGbG9hdDogbnVtYmVyO1xuICBsZXQgdGV4dHVyZVR5cGVGbG9hdDogbnVtYmVyO1xuXG4gIGlmIChlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX1ZFUlNJT04nKSA9PT0gMikge1xuICAgIGludGVybmFsRm9ybWF0RmxvYXQgPSBnbGFueS5SMzJGO1xuICAgIGludGVybmFsRm9ybWF0SGFsZkZsb2F0ID0gZ2xhbnkuUjE2RjtcbiAgICBpbnRlcm5hbEZvcm1hdFBhY2tlZEhhbGZGbG9hdCA9IGdsYW55LlJHQkExNkY7XG4gICAgaW50ZXJuYWxGb3JtYXRQYWNrZWRGbG9hdCA9IGdsYW55LlJHQkEzMkY7XG4gICAgdGV4dHVyZUZvcm1hdEZsb2F0ID0gZ2xhbnkuUkVEO1xuICAgIGRvd25sb2FkVW5wYWNrTnVtQ2hhbm5lbHMgPSA0O1xuICAgIGRlZmF1bHROdW1DaGFubmVscyA9IDE7XG4gICAgdGV4dHVyZVR5cGVIYWxmRmxvYXQgPSBnbGFueS5IQUxGX0ZMT0FUO1xuICAgIHRleHR1cmVUeXBlRmxvYXQgPSBnbGFueS5GTE9BVDtcbiAgfSBlbHNlIHtcbiAgICBpbnRlcm5hbEZvcm1hdEZsb2F0ID0gZ2wuUkdCQTtcbiAgICBpbnRlcm5hbEZvcm1hdEhhbGZGbG9hdCA9IGdsLlJHQkE7XG4gICAgaW50ZXJuYWxGb3JtYXRQYWNrZWRIYWxmRmxvYXQgPSBnbC5SR0JBO1xuICAgIGludGVybmFsRm9ybWF0UGFja2VkRmxvYXQgPSBnbGFueS5SR0JBO1xuICAgIHRleHR1cmVGb3JtYXRGbG9hdCA9IGdsLlJHQkE7XG4gICAgZG93bmxvYWRVbnBhY2tOdW1DaGFubmVscyA9IDQ7XG4gICAgZGVmYXVsdE51bUNoYW5uZWxzID0gNDtcbiAgICB0ZXh0dXJlVHlwZUhhbGZGbG9hdCA9IHRleHR1cmVIYWxmRmxvYXRFeHRlbnNpb24gIT0gbnVsbCA/XG4gICAgICAgIHRleHR1cmVIYWxmRmxvYXRFeHRlbnNpb24uSEFMRl9GTE9BVF9PRVMgOlxuICAgICAgICBudWxsO1xuICAgIHRleHR1cmVUeXBlRmxvYXQgPSBnbC5GTE9BVDtcbiAgfVxuICBkb3dubG9hZFRleHR1cmVGb3JtYXQgPSBnbC5SR0JBO1xuXG4gIHJldHVybiB7XG4gICAgaW50ZXJuYWxGb3JtYXRGbG9hdCxcbiAgICBpbnRlcm5hbEZvcm1hdEhhbGZGbG9hdCxcbiAgICBpbnRlcm5hbEZvcm1hdFBhY2tlZEhhbGZGbG9hdCxcbiAgICBpbnRlcm5hbEZvcm1hdFBhY2tlZEZsb2F0LFxuICAgIHRleHR1cmVGb3JtYXRGbG9hdCxcbiAgICBkb3dubG9hZFRleHR1cmVGb3JtYXQsXG4gICAgZG93bmxvYWRVbnBhY2tOdW1DaGFubmVscyxcbiAgICBkZWZhdWx0TnVtQ2hhbm5lbHMsXG4gICAgdGV4dHVyZVR5cGVIYWxmRmxvYXQsXG4gICAgdGV4dHVyZVR5cGVGbG9hdFxuICB9O1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2Vudn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtHUEdQVUNvbnRleHR9IGZyb20gJy4vZ3BncHVfY29udGV4dCc7XG5pbXBvcnQge2dldEludGVybmFsRm9ybWF0Rm9yRmxvYXQxNk1hdHJpeFRleHR1cmUsIGdldEludGVybmFsRm9ybWF0Rm9yRmxvYXQxNlBhY2tlZE1hdHJpeFRleHR1cmUsIGdldEludGVybmFsRm9ybWF0Rm9yRmxvYXQzMk1hdHJpeFRleHR1cmUsIGdldEludGVybmFsRm9ybWF0Rm9yUGFja2VkTWF0cml4VGV4dHVyZSwgZ2V0SW50ZXJuYWxGb3JtYXRGb3JVbnNpZ25lZEJ5dGVzTWF0cml4VGV4dHVyZX0gZnJvbSAnLi9ncGdwdV91dGlsJztcbmltcG9ydCB7Z2V0UGFja2VkTWF0cml4VGV4dHVyZVNoYXBlV2lkdGhIZWlnaHQsIGdldFVucGFja2VkTWF0cml4VGV4dHVyZVNoYXBlV2lkdGhIZWlnaHQsIFBoeXNpY2FsVGV4dHVyZVR5cGUsIFRleHR1cmVDb25maWcsIFRleHR1cmVVc2FnZX0gZnJvbSAnLi90ZXhfdXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBUZXh0dXJlTWFuYWdlciB7XG4gIHByaXZhdGUgbnVtVXNlZFRleHR1cmVzID0gMDtcbiAgcHJpdmF0ZSBudW1GcmVlVGV4dHVyZXMgPSAwO1xuICBwcml2YXRlIF9udW1CeXRlc0FsbG9jYXRlZCA9IDA7XG4gIHByaXZhdGUgX251bUJ5dGVzRnJlZSA9IDA7ICAvLyBIb3cgbWFueSBieXRlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZSBhdmFpbGFibGUgZm9yIHJldXNlLlxuICBwcml2YXRlIGZyZWVUZXh0dXJlczoge1tzaGFwZTogc3RyaW5nXTogV2ViR0xUZXh0dXJlW119ID0ge307XG4gIHByaXZhdGUgbG9nRW5hYmxlZCA9IGZhbHNlO1xuICBwcml2YXRlIHVzZWRUZXh0dXJlczoge1tzaGFwZTogc3RyaW5nXTogV2ViR0xUZXh0dXJlW119ID0ge307XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBncGdwdTogR1BHUFVDb250ZXh0KSB7fVxuXG4gIGFjcXVpcmVUZXh0dXJlKFxuICAgICAgc2hhcGVSQzogW251bWJlciwgbnVtYmVyXSwgdXNhZ2U6IFRleHR1cmVVc2FnZSxcbiAgICAgIGlzUGFja2VkOiBib29sZWFuKTogV2ViR0xUZXh0dXJlIHtcbiAgICBjb25zdCBwaHlzaWNhbFRleFR5cGUgPSBnZXRQaHlzaWNhbEZyb21Mb2dpY2FsVGV4dHVyZVR5cGUodXNhZ2UsIGlzUGFja2VkKTtcblxuICAgIGNvbnN0IHNoYXBlS2V5ID0gZ2V0S2V5RnJvbVRleHR1cmVTaGFwZShzaGFwZVJDLCBwaHlzaWNhbFRleFR5cGUsIGlzUGFja2VkKTtcbiAgICBpZiAoIShzaGFwZUtleSBpbiB0aGlzLmZyZWVUZXh0dXJlcykpIHtcbiAgICAgIHRoaXMuZnJlZVRleHR1cmVzW3NoYXBlS2V5XSA9IFtdO1xuICAgIH1cbiAgICBpZiAoIShzaGFwZUtleSBpbiB0aGlzLnVzZWRUZXh0dXJlcykpIHtcbiAgICAgIHRoaXMudXNlZFRleHR1cmVzW3NoYXBlS2V5XSA9IFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHRleEJ5dGVzID0gY29tcHV0ZUJ5dGVzKFxuICAgICAgICBzaGFwZVJDLCBwaHlzaWNhbFRleFR5cGUsIHRoaXMuZ3BncHUuZ2wsIHRoaXMuZ3BncHUudGV4dHVyZUNvbmZpZyxcbiAgICAgICAgaXNQYWNrZWQpO1xuXG4gICAgaWYgKHRoaXMuZnJlZVRleHR1cmVzW3NoYXBlS2V5XS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLm51bUZyZWVUZXh0dXJlcy0tO1xuICAgICAgdGhpcy5udW1Vc2VkVGV4dHVyZXMrKztcbiAgICAgIHRoaXMuX251bUJ5dGVzRnJlZSAtPSB0ZXhCeXRlcztcbiAgICAgIHRoaXMubG9nKCk7XG4gICAgICBjb25zdCBuZXdUZXh0dXJlID0gdGhpcy5mcmVlVGV4dHVyZXNbc2hhcGVLZXldLnNoaWZ0KCk7XG4gICAgICB0aGlzLnVzZWRUZXh0dXJlc1tzaGFwZUtleV0ucHVzaChuZXdUZXh0dXJlKTtcbiAgICAgIHJldHVybiBuZXdUZXh0dXJlO1xuICAgIH1cblxuICAgIGxldCBuZXdUZXh0dXJlOiBXZWJHTFRleHR1cmU7XG4gICAgaWYgKHBoeXNpY2FsVGV4VHlwZSA9PT0gUGh5c2ljYWxUZXh0dXJlVHlwZS5QQUNLRURfMlgyX0ZMT0FUMzIpIHtcbiAgICAgIG5ld1RleHR1cmUgPSB0aGlzLmdwZ3B1LmNyZWF0ZVBhY2tlZE1hdHJpeFRleHR1cmUoc2hhcGVSQ1swXSwgc2hhcGVSQ1sxXSk7XG4gICAgfSBlbHNlIGlmIChwaHlzaWNhbFRleFR5cGUgPT09IFBoeXNpY2FsVGV4dHVyZVR5cGUuUEFDS0VEXzJYMl9GTE9BVDE2KSB7XG4gICAgICBuZXdUZXh0dXJlID1cbiAgICAgICAgICB0aGlzLmdwZ3B1LmNyZWF0ZUZsb2F0MTZQYWNrZWRNYXRyaXhUZXh0dXJlKHNoYXBlUkNbMF0sIHNoYXBlUkNbMV0pO1xuICAgIH0gZWxzZSBpZiAocGh5c2ljYWxUZXhUeXBlID09PSBQaHlzaWNhbFRleHR1cmVUeXBlLlVOUEFDS0VEX0ZMT0FUMzIpIHtcbiAgICAgIG5ld1RleHR1cmUgPVxuICAgICAgICAgIHRoaXMuZ3BncHUuY3JlYXRlRmxvYXQzMk1hdHJpeFRleHR1cmUoc2hhcGVSQ1swXSwgc2hhcGVSQ1sxXSk7XG4gICAgfSBlbHNlIGlmIChwaHlzaWNhbFRleFR5cGUgPT09IFBoeXNpY2FsVGV4dHVyZVR5cGUuVU5QQUNLRURfRkxPQVQxNikge1xuICAgICAgbmV3VGV4dHVyZSA9XG4gICAgICAgICAgdGhpcy5ncGdwdS5jcmVhdGVGbG9hdDE2TWF0cml4VGV4dHVyZShzaGFwZVJDWzBdLCBzaGFwZVJDWzFdKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgICBwaHlzaWNhbFRleFR5cGUgPT09IFBoeXNpY2FsVGV4dHVyZVR5cGUuUEFDS0VEXzRYMV9VTlNJR05FRF9CWVRFKSB7XG4gICAgICBuZXdUZXh0dXJlID1cbiAgICAgICAgICB0aGlzLmdwZ3B1LmNyZWF0ZVVuc2lnbmVkQnl0ZXNNYXRyaXhUZXh0dXJlKHNoYXBlUkNbMF0sIHNoYXBlUkNbMV0pO1xuICAgIH1cbiAgICB0aGlzLnVzZWRUZXh0dXJlc1tzaGFwZUtleV0ucHVzaChuZXdUZXh0dXJlKTtcblxuICAgIHRoaXMubnVtVXNlZFRleHR1cmVzKys7XG4gICAgdGhpcy5fbnVtQnl0ZXNBbGxvY2F0ZWQgKz0gdGV4Qnl0ZXM7XG4gICAgdGhpcy5sb2coKTtcblxuICAgIHJldHVybiBuZXdUZXh0dXJlO1xuICB9XG5cbiAgcmVsZWFzZVRleHR1cmUoXG4gICAgICB0ZXh0dXJlOiBXZWJHTFRleHR1cmUsIHNoYXBlOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgbG9naWNhbFRleFR5cGU6IFRleHR1cmVVc2FnZSwgaXNQYWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5mcmVlVGV4dHVyZXMgPT0gbnVsbCkge1xuICAgICAgLy8gQWxyZWFkeSBkaXNwb3NlZC5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcGh5c2ljYWxUZXhUeXBlID1cbiAgICAgICAgZ2V0UGh5c2ljYWxGcm9tTG9naWNhbFRleHR1cmVUeXBlKGxvZ2ljYWxUZXhUeXBlLCBpc1BhY2tlZCk7XG4gICAgY29uc3Qgc2hhcGVLZXkgPSBnZXRLZXlGcm9tVGV4dHVyZVNoYXBlKHNoYXBlLCBwaHlzaWNhbFRleFR5cGUsIGlzUGFja2VkKTtcbiAgICBpZiAoIShzaGFwZUtleSBpbiB0aGlzLmZyZWVUZXh0dXJlcykpIHtcbiAgICAgIHRoaXMuZnJlZVRleHR1cmVzW3NoYXBlS2V5XSA9IFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHRleEJ5dGVzID0gY29tcHV0ZUJ5dGVzKFxuICAgICAgICBzaGFwZSwgcGh5c2ljYWxUZXhUeXBlLCB0aGlzLmdwZ3B1LmdsLCB0aGlzLmdwZ3B1LnRleHR1cmVDb25maWcsXG4gICAgICAgIGlzUGFja2VkKTtcbiAgICBjb25zdCBkZWxldGVUZXhUaHJlc2hvbGQgPSBlbnYoKS5nZXQoJ1dFQkdMX0RFTEVURV9URVhUVVJFX1RIUkVTSE9MRCcpO1xuICAgIGlmIChkZWxldGVUZXhUaHJlc2hvbGQgIT09IC0xICYmXG4gICAgICAgIHRoaXMuX251bUJ5dGVzQWxsb2NhdGVkID4gZGVsZXRlVGV4VGhyZXNob2xkKSB7XG4gICAgICB0aGlzLmdwZ3B1LmRlbGV0ZU1hdHJpeFRleHR1cmUodGV4dHVyZSk7XG4gICAgICB0aGlzLl9udW1CeXRlc0FsbG9jYXRlZCAtPSB0ZXhCeXRlcztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mcmVlVGV4dHVyZXNbc2hhcGVLZXldLnB1c2godGV4dHVyZSk7XG4gICAgICB0aGlzLm51bUZyZWVUZXh0dXJlcysrO1xuICAgICAgdGhpcy5fbnVtQnl0ZXNGcmVlICs9IHRleEJ5dGVzO1xuICAgIH1cblxuICAgIHRoaXMubnVtVXNlZFRleHR1cmVzLS07XG5cbiAgICBjb25zdCB0ZXhMaXN0ID0gdGhpcy51c2VkVGV4dHVyZXNbc2hhcGVLZXldO1xuICAgIGNvbnN0IHRleEluZGV4ID0gdGV4TGlzdC5pbmRleE9mKHRleHR1cmUpO1xuICAgIGlmICh0ZXhJbmRleCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnQ2Fubm90IHJlbGVhc2UgYSB0ZXh0dXJlIHRoYXQgd2FzIG5ldmVyIHByb3ZpZGVkIGJ5IHRoaXMgJyArXG4gICAgICAgICAgJ3RleHR1cmUgbWFuYWdlcicpO1xuICAgIH1cbiAgICB0ZXhMaXN0LnNwbGljZSh0ZXhJbmRleCwgMSk7XG4gICAgdGhpcy5sb2coKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nKCkge1xuICAgIGlmICghdGhpcy5sb2dFbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRvdGFsID0gdGhpcy5udW1GcmVlVGV4dHVyZXMgKyB0aGlzLm51bVVzZWRUZXh0dXJlcztcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgJ0ZyZWUvVXNlZCcsIGAke3RoaXMubnVtRnJlZVRleHR1cmVzfSAvICR7dGhpcy5udW1Vc2VkVGV4dHVyZXN9YCxcbiAgICAgICAgYCgke3RvdGFsfSlgKTtcbiAgICBjb25zdCBmcmVlUmF0aW8gPSB0aGlzLl9udW1CeXRlc0ZyZWUgLyB0aGlzLl9udW1CeXRlc0FsbG9jYXRlZDtcbiAgICBjb25zb2xlLmxvZyhgQnl0ZXMgYWxsb2NhdGVkOiAke3RoaXMuX251bUJ5dGVzQWxsb2NhdGVkfWApO1xuICAgIGNvbnNvbGUubG9nKGBCeXRlcyB1bnVzZWQ6ICR7dGhpcy5fbnVtQnl0ZXNGcmVlfSAoJHtcbiAgICAgICAgTWF0aC5yb3VuZCgxMDAgKiBmcmVlUmF0aW8pfSUpYCk7XG4gIH1cblxuICBnZXQgbnVtQnl0ZXNBbGxvY2F0ZWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbnVtQnl0ZXNBbGxvY2F0ZWQ7XG4gIH1cblxuICBnZXQgbnVtQnl0ZXNGcmVlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX251bUJ5dGVzRnJlZTtcbiAgfVxuXG4gIGdldE51bVVzZWRUZXh0dXJlcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm51bVVzZWRUZXh0dXJlcztcbiAgfVxuXG4gIGdldE51bUZyZWVUZXh0dXJlcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm51bUZyZWVUZXh0dXJlcztcbiAgfVxuXG4gIGRpc3Bvc2UoKSB7XG4gICAgaWYgKHRoaXMuZnJlZVRleHR1cmVzID09IG51bGwpIHtcbiAgICAgIC8vIEFscmVhZHkgZGlzcG9zZWQuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgdGV4U2hhcGUgaW4gdGhpcy5mcmVlVGV4dHVyZXMpIHtcbiAgICAgIHRoaXMuZnJlZVRleHR1cmVzW3RleFNoYXBlXS5mb3JFYWNoKHRleCA9PiB7XG4gICAgICAgIHRoaXMuZ3BncHUuZGVsZXRlTWF0cml4VGV4dHVyZSh0ZXgpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdGV4U2hhcGUgaW4gdGhpcy51c2VkVGV4dHVyZXMpIHtcbiAgICAgIHRoaXMudXNlZFRleHR1cmVzW3RleFNoYXBlXS5mb3JFYWNoKHRleCA9PiB7XG4gICAgICAgIHRoaXMuZ3BncHUuZGVsZXRlTWF0cml4VGV4dHVyZSh0ZXgpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuZnJlZVRleHR1cmVzID0gbnVsbDtcbiAgICB0aGlzLnVzZWRUZXh0dXJlcyA9IG51bGw7XG4gICAgdGhpcy5udW1Vc2VkVGV4dHVyZXMgPSAwO1xuICAgIHRoaXMubnVtRnJlZVRleHR1cmVzID0gMDtcbiAgICB0aGlzLl9udW1CeXRlc0FsbG9jYXRlZCA9IDA7XG4gICAgdGhpcy5fbnVtQnl0ZXNGcmVlID0gMDtcbiAgfVxufVxuXG5mdW5jdGlvbiBudW1CeXRlc0ZvckludGVybmFsRm9ybWF0KFxuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIGludGVybmFsRm9ybWF0OiBudW1iZXIpOiBudW1iZXIge1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIGNvbnN0IGdsYW55ID0gZ2wgYXMgYW55O1xuICBpZiAoaW50ZXJuYWxGb3JtYXQgPT09IGdsYW55LlIzMkYpIHtcbiAgICByZXR1cm4gNDtcbiAgfSBlbHNlIGlmIChpbnRlcm5hbEZvcm1hdCA9PT0gZ2xhbnkuUjE2Rikge1xuICAgIHJldHVybiAyO1xuICB9IGVsc2UgaWYgKGludGVybmFsRm9ybWF0ID09PSBnbGFueS5SR0JBMzJGKSB7XG4gICAgcmV0dXJuIDE2O1xuICB9IGVsc2UgaWYgKGludGVybmFsRm9ybWF0ID09PSBnbC5SR0JBKSB7XG4gICAgcmV0dXJuIDE2O1xuICB9IGVsc2UgaWYgKGludGVybmFsRm9ybWF0ID09PSBnbGFueS5SR0JBMTZGKSB7XG4gICAgcmV0dXJuIDg7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGludGVybmFsIGZvcm1hdCAke2ludGVybmFsRm9ybWF0fWApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZUJ5dGVzKFxuICAgIHNoYXBlOiBbbnVtYmVyLCBudW1iZXJdLCBwaHlzaWNhbFRleFR5cGU6IFBoeXNpY2FsVGV4dHVyZVR5cGUsXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgdGV4dHVyZUNvbmZpZzogVGV4dHVyZUNvbmZpZyxcbiAgICBpc1BhY2tlZDogYm9vbGVhbik6IG51bWJlciB7XG4gIC8vIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBpbmZlciBwYWNrZWQgc3RhdHVzIGZyb20gdGhlIHRleHR1cmUgdHlwZSBiZWNhdXNlXG4gIC8vIGRlcGVuZGluZyBvbiB0aGUgdGV4dHVyZUNvbmZpZywgZGlmZmVyZW50ICB0ZXh0dXJlIHR5cGVzIG1heSByZXNvbHZlIHRvIHRoZVxuICAvLyBzYW1lIGludGVybmFsIGZvcm1hdCAoZS5nLiBpbiBXZWJHTDEsIHRoZSBpbnRlcm5hbCBmb3JtYXQgZm9yXG4gIC8vIFVOUEFDS0VEX0ZMT0FUMTYgdGV4dHVyZXMgaXMgZ2wuUkdCQSkuIFRoZXJlZm9yZSB3ZSBwYXNzIGluIGBpc1BhY2tlZGBcbiAgLy8gZXhwbGljaXRseS5cbiAgY29uc3QgaW50ZXJuYWxGb3JtYXQgPVxuICAgICAgaW50ZXJuYWxGb3JtYXRGb3JQaHlzaWNhbFRleFR5cGUocGh5c2ljYWxUZXhUeXBlLCB0ZXh0dXJlQ29uZmlnKTtcblxuICBsZXQgbnVtRWxlbWVudHM6IG51bWJlcjtcbiAgaWYgKGlzUGFja2VkKSB7XG4gICAgY29uc3QgW3BhY2tlZFdpZHRoLCBwYWNrZWRIZWlnaHRdID1cbiAgICAgICAgZ2V0UGFja2VkTWF0cml4VGV4dHVyZVNoYXBlV2lkdGhIZWlnaHQoc2hhcGVbMF0sIHNoYXBlWzFdKTtcbiAgICBudW1FbGVtZW50cyA9IHBhY2tlZFdpZHRoICogcGFja2VkSGVpZ2h0O1xuXG4gIH0gZWxzZSB7XG4gICAgY29uc3QgW3dpZHRoLCBoZWlnaHRdID1cbiAgICAgICAgZ2V0VW5wYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodChzaGFwZVswXSwgc2hhcGVbMV0pO1xuICAgIG51bUVsZW1lbnRzID0gd2lkdGggKiBoZWlnaHQ7XG4gIH1cblxuICBjb25zdCBieXRlc1BlckVsZW1lbnQgPSBudW1CeXRlc0ZvckludGVybmFsRm9ybWF0KGdsLCBpbnRlcm5hbEZvcm1hdCk7XG4gIHJldHVybiBudW1FbGVtZW50cyAqIGJ5dGVzUGVyRWxlbWVudDtcbn1cblxuZnVuY3Rpb24gaW50ZXJuYWxGb3JtYXRGb3JQaHlzaWNhbFRleFR5cGUoXG4gICAgcGh5c2ljYWxUZXhUeXBlOiBQaHlzaWNhbFRleHR1cmVUeXBlLFxuICAgIHRleHR1cmVDb25maWc6IFRleHR1cmVDb25maWcpOiBudW1iZXIge1xuICBzd2l0Y2ggKHBoeXNpY2FsVGV4VHlwZSkge1xuICAgIGNhc2UgUGh5c2ljYWxUZXh0dXJlVHlwZS5QQUNLRURfMlgyX0ZMT0FUMzI6XG4gICAgICByZXR1cm4gZ2V0SW50ZXJuYWxGb3JtYXRGb3JQYWNrZWRNYXRyaXhUZXh0dXJlKHRleHR1cmVDb25maWcpO1xuICAgIGNhc2UgUGh5c2ljYWxUZXh0dXJlVHlwZS5QQUNLRURfMlgyX0ZMT0FUMTY6XG4gICAgICByZXR1cm4gZ2V0SW50ZXJuYWxGb3JtYXRGb3JGbG9hdDE2UGFja2VkTWF0cml4VGV4dHVyZSh0ZXh0dXJlQ29uZmlnKTtcbiAgICBjYXNlIFBoeXNpY2FsVGV4dHVyZVR5cGUuVU5QQUNLRURfRkxPQVQzMjpcbiAgICAgIHJldHVybiBnZXRJbnRlcm5hbEZvcm1hdEZvckZsb2F0MzJNYXRyaXhUZXh0dXJlKHRleHR1cmVDb25maWcpO1xuICAgIGNhc2UgUGh5c2ljYWxUZXh0dXJlVHlwZS5VTlBBQ0tFRF9GTE9BVDE2OlxuICAgICAgcmV0dXJuIGdldEludGVybmFsRm9ybWF0Rm9yRmxvYXQxNk1hdHJpeFRleHR1cmUodGV4dHVyZUNvbmZpZyk7XG4gICAgY2FzZSBQaHlzaWNhbFRleHR1cmVUeXBlLlBBQ0tFRF80WDFfVU5TSUdORURfQllURTpcbiAgICAgIHJldHVybiBnZXRJbnRlcm5hbEZvcm1hdEZvclVuc2lnbmVkQnl0ZXNNYXRyaXhUZXh0dXJlKHRleHR1cmVDb25maWcpO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcGh5c2ljYWwgdGV4dHVyZSB0eXBlICR7cGh5c2ljYWxUZXhUeXBlfWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFBoeXNpY2FsVGV4dHVyZUZvclJlbmRlcmluZyhpc1BhY2tlZDogYm9vbGVhbik6XG4gICAgUGh5c2ljYWxUZXh0dXJlVHlwZSB7XG4gIGlmIChlbnYoKS5nZXRCb29sKCdXRUJHTF9SRU5ERVJfRkxPQVQzMl9FTkFCTEVEJykpIHtcbiAgICBpZiAoaXNQYWNrZWQpIHtcbiAgICAgIHJldHVybiBQaHlzaWNhbFRleHR1cmVUeXBlLlBBQ0tFRF8yWDJfRkxPQVQzMjtcbiAgICB9XG4gICAgcmV0dXJuIFBoeXNpY2FsVGV4dHVyZVR5cGUuVU5QQUNLRURfRkxPQVQzMjtcbiAgfVxuXG4gIGlmIChpc1BhY2tlZCkge1xuICAgIHJldHVybiBQaHlzaWNhbFRleHR1cmVUeXBlLlBBQ0tFRF8yWDJfRkxPQVQxNjtcbiAgfVxuICByZXR1cm4gUGh5c2ljYWxUZXh0dXJlVHlwZS5VTlBBQ0tFRF9GTE9BVDE2O1xufVxuXG5mdW5jdGlvbiBnZXRQaHlzaWNhbEZyb21Mb2dpY2FsVGV4dHVyZVR5cGUoXG4gICAgbG9naWNhbFRleFR5cGU6IFRleHR1cmVVc2FnZSwgaXNQYWNrZWQ6IGJvb2xlYW4pOiBQaHlzaWNhbFRleHR1cmVUeXBlIHtcbiAgaWYgKGxvZ2ljYWxUZXhUeXBlID09PSBUZXh0dXJlVXNhZ2UuVVBMT0FEKSB7XG4gICAgcmV0dXJuIFBoeXNpY2FsVGV4dHVyZVR5cGUuUEFDS0VEXzJYMl9GTE9BVDMyO1xuICB9IGVsc2UgaWYgKGxvZ2ljYWxUZXhUeXBlID09PSBUZXh0dXJlVXNhZ2UuUkVOREVSIHx8IGxvZ2ljYWxUZXhUeXBlID09IG51bGwpIHtcbiAgICByZXR1cm4gZ2V0UGh5c2ljYWxUZXh0dXJlRm9yUmVuZGVyaW5nKGlzUGFja2VkKTtcbiAgfSBlbHNlIGlmIChcbiAgICAgIGxvZ2ljYWxUZXhUeXBlID09PSBUZXh0dXJlVXNhZ2UuRE9XTkxPQUQgfHxcbiAgICAgIGxvZ2ljYWxUZXhUeXBlID09PSBUZXh0dXJlVXNhZ2UuUElYRUxTKSB7XG4gICAgcmV0dXJuIFBoeXNpY2FsVGV4dHVyZVR5cGUuUEFDS0VEXzRYMV9VTlNJR05FRF9CWVRFO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBsb2dpY2FsIHRleHR1cmUgdHlwZSAke2xvZ2ljYWxUZXhUeXBlfWApO1xufVxuXG5mdW5jdGlvbiBnZXRLZXlGcm9tVGV4dHVyZVNoYXBlKFxuICAgIHNoYXBlUm93c0NvbDogW251bWJlciwgbnVtYmVyXSwgcGh5c2ljYWxUZXhUeXBlOiBQaHlzaWNhbFRleHR1cmVUeXBlLFxuICAgIGlzUGFja2VkOiBib29sZWFuKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke3NoYXBlUm93c0NvbFswXX1fJHtzaGFwZVJvd3NDb2xbMV19XyR7cGh5c2ljYWxUZXhUeXBlfV8ke2lzUGFja2VkfWA7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtnZXRDb29yZHNEYXRhVHlwZX0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuXG5leHBvcnQgY2xhc3MgVGlsZVByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydBJ107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgcmFuazogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGFTaGFwZTogbnVtYmVyW10sIHJlcHM6IG51bWJlcltdKSB7XG4gICAgY29uc3Qgb3V0cHV0U2hhcGU6IG51bWJlcltdID0gbmV3IEFycmF5KGFTaGFwZS5sZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0cHV0U2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIG91dHB1dFNoYXBlW2ldID0gYVNoYXBlW2ldICogcmVwc1tpXTtcbiAgICB9XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IG91dHB1dFNoYXBlO1xuICAgIHRoaXMucmFuayA9IG91dHB1dFNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBkdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHRoaXMucmFuayk7XG4gICAgY29uc3Qgc291cmNlQ29vcmRzID0gZ2V0U291cmNlQ29vcmRzKGFTaGFwZSk7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke2R0eXBlfSByZXNSQyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBzZXRPdXRwdXQoZ2V0QSgke3NvdXJjZUNvb3Jkc30pKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFNvdXJjZUNvb3JkcyhhU2hhcGU6IG51bWJlcltdKTogc3RyaW5nIHtcbiAgY29uc3QgcmFuayA9IGFTaGFwZS5sZW5ndGg7XG4gIGlmIChyYW5rID4gNSkge1xuICAgIHRocm93IEVycm9yKGBUaWxlIGZvciByYW5rICR7cmFua30gaXMgbm90IHlldCBzdXBwb3J0ZWRgKTtcbiAgfVxuICBpZiAocmFuayA9PT0gMSkge1xuICAgIHJldHVybiBgaW1vZChyZXNSQywgJHthU2hhcGVbMF19KWA7XG4gIH1cblxuICBjb25zdCBjdXJyZW50Q29vcmRzID0gWydyZXNSQy54JywgJ3Jlc1JDLnknLCAncmVzUkMueicsICdyZXNSQy53JywgJ3Jlc1JDLnUnXTtcblxuICBjb25zdCBzb3VyY2VDb29yZHMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhU2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICBzb3VyY2VDb29yZHMucHVzaChgaW1vZCgke2N1cnJlbnRDb29yZHNbaV19LCAke2FTaGFwZVtpXX0pYCk7XG4gIH1cbiAgcmV0dXJuIHNvdXJjZUNvb3Jkcy5qb2luKCk7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7VW5pZm9ybVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuLy8gQmFzZWQgb24gQWxnb3JpdGhtIDIgb2YgQml0b25pYyBUb3AgSywgcmVmOlxuLy8gaHR0cHM6Ly9hbmlsc2hhbmJoYWcuaW4vc3RhdGljL3BhcGVycy9ncHV0b3BrX3NpZ21vZDE4LnBkZlxuLy8gVGhlIG9yaWdpbmFsIGFsZ29yaXRobSBpcyBiYXNlZCBvbiBjb21wdXRpbmcgdGhlIHRvcCBLIG9ubHksIGhvd2V2ZXJcbi8vIHNpbmNlIGZvciBURkpTIHdlIHJlcXVpcmUgdGhlIGluZGljZXMgb2YgdGhlIHRvcCBLIHZhbHVlcyBhcyB3ZWxsIHRoZW4gdGhlXG4vLyBhbGdvcml0aG0gZm91bmQgaGVyZSBpcyBhIGJpdCBtb2RpZmllZC4gUmF0aGVyIHRoYW4gcHJvZHVjaW5nIHRoZSB2YWx1ZXNcbi8vIGF0IGVhY2ggc3RlcCwgdGhlIGluZGljZXMgY29udGFpbmluZyB0aGUgdG9wIEsgYXJlIGdlbmVyYXRlZCBpbnN0ZWFkLlxuLy8gVGhlIG91dHB1dCB2YWx1ZXMgYXJlIG5vdCBnZW5lcmF0ZWQgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2Ygb3V0cHV0cyBpbiB0aGVcbi8vIEdQVSwgdGhlIHZhbHVlcyBjYW4gZWFzaWx5IGJlIHJldHJpZXZlZCBmcm9tIHRoZSBpbmRpY2VzIHVzaW5nIGEgZ2F0aGVyXG4vLyBvcC5cbmV4cG9ydCBjbGFzcyBTd2FwUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnLCAnaW5kaWNlcyddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIC8vIHxufCBTaXplIG9mIHRoZSBvcmlnaW5hbCBpbnB1dCBvZiBUb3BLLlxuICAvLyB8Zmlyc3RQYXNzfGluZGljYXRlcyBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHN3YXAgaXMgYmVpbmcgdXNlZCB3aGljaFxuICAvLyBtZWFucyBubyBpbmRpY2VzIGlucHV0IGNvbnRhaW5pbmcgdGhlIHRvcCBLIGlzIHByZXNlbnQgeWV0LlxuICAvLyB8aW5jfCBTd2FwcyBwYWlycyBvZiBpbmRpY2VzICgwLCBpbmMpLCAoMSwgaW5jICsgMSksICgyLCBpbmMgKyAyKSAuLi5cbiAgY3VzdG9tVW5pZm9ybXMgPSBbXG4gICAge25hbWU6ICduJywgdHlwZTogJ2ludCcgYXMgVW5pZm9ybVR5cGV9LFxuICAgIHtuYW1lOiAnZmlyc3RQYXNzJywgdHlwZTogJ2ludCcgYXMgVW5pZm9ybVR5cGV9LFxuICAgIHtuYW1lOiAnbmVnYXRpdmVJbmYnLCB0eXBlOiAnZmxvYXQnIGFzIFVuaWZvcm1UeXBlfSxcbiAgICB7bmFtZTogJ2RpcicsIHR5cGU6ICdpbnQnIGFzIFVuaWZvcm1UeXBlfSxcbiAgICB7bmFtZTogJ2luYycsIHR5cGU6ICdpbnQnIGFzIFVuaWZvcm1UeXBlfVxuICBdO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gc2hhcGUgZGVzaXJlZCBvdXRwdXQgc2hhcGUgKGNhbiBiZSBsYXJnZXIgdGhhbiBpbnB1dCBzaGFwZSwgb3V0cHV0XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBwYWRkZWQgd2l0aCAtSW5maW5pdHkpXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzaGFwZTogbnVtYmVyW10pIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gc2hhcGU7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgIGl2ZWMyIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgaW50IGJhdGNoID0gY29vcmRzWzBdO1xuICAgICAgICAgaW50IGVsZW1JZHggPSBjb29yZHNbMV07XG5cbiAgICAgICAgIC8vIFdlIGNvbXBhcmUgZWxlbWVudHMgcGFpci13aXNlIHdpdGhpbiBhIGdyb3VwIG9mIHNpemUgMiAqIGluYy5cbiAgICAgICAgIC8vIFRoZSBjb21wYXJpbmcgcnVsZSBmb3IgZWFjaCBncm91cCBhbHRlcm5hdGVzIGJldHdlZW4gYXNjZW5kaW5nXG4gICAgICAgICAvLyBhbmQgZGVzY2VuZGluZy4gV2l0aGluIGVhY2ggZ3JvdXAsIHdlIGNvbXBhcmUgZWFjaCBwYWlyIGF0XG4gICAgICAgICAvLyBwb3NpdGlvbnMgaSBhbmQgaStpbmMuIFRvIGRlY2lkZSB3aGV0aGVyIGFuIGVsZW1lbnQgYXQgcG9zaXRpb24gaVxuICAgICAgICAgLy8gaXMgeDAgb3IgeDEsIHdlIG1vZCBpdCBieSAyICogaW5jLCBpZiB0aGUgcmVzdWx0IGlzIHNtYWxsZXIgdGhhblxuICAgICAgICAgLy8gaW5jLCBpdCBpcyBpbiB0aGUgZmlyc3QgaGFsZiBvZiB0aGUgZ3JvdXAsIHdlIGRlbm90ZSBpdCBhcyB4MCxcbiAgICAgICAgIC8vIG90aGVyd2lzZSB3ZSBkZW5vdGUgaXQgYXMgeDEuXG4gICAgICAgICAvLyBGb3IgZXhhbXBsZSwgYXMgc2hvd24gaW4gdGhlIEJpdG9uaWMgdG9wIEsgcGFwZXIgcmVmZXJlbmNlZCBhYm92ZSxcbiAgICAgICAgIC8vIEZpZ3VyZTUoYSkgc2hvd3MgdGhhdCBlbGVtZW50WzFdIGlzIGluIHRoZVxuICAgICAgICAgLy8gc2Vjb25kIGhhbGYgb2YgdGhlIGdyb3VwIHdoZW4gZ3JvdXAgc2l6ZSBpcyAyLCBidXQgaXQgaXMgaW4gdGhlXG4gICAgICAgICAvLyBmaXJzdCBoYWxmIG9mIHRoZSBncm91cCB3aGVuIGdyb3VwIHNpemUgaXMgNC5cblxuICAgICAgICAgYm9vbCBpc0ZpcnN0SW5QYWlyID0gaW1vZChlbGVtSWR4LCAyICogaW5jKSA8IGluYztcbiAgICAgICAgIGludCBpID0gaXNGaXJzdEluUGFpciA/IGVsZW1JZHggOiBlbGVtSWR4IC0gaW5jO1xuXG4gICAgICAgICBpbnQgaTAgPSBmaXJzdFBhc3MgPT0gMSA/IGkgOiBpbnQoZ2V0SW5kaWNlcyhiYXRjaCwgaSkpO1xuICAgICAgICAgaW50IGkxID0gZmlyc3RQYXNzID09IDEgPyBpICsgaW5jIDogaW50KGdldEluZGljZXMoYmF0Y2gsIGkgKyBpbmMpKTtcbiAgICAgICAgIGZsb2F0IHgwID0gaTAgPCBuID8gZ2V0WChiYXRjaCwgaTApIDogbmVnYXRpdmVJbmY7XG4gICAgICAgICBmbG9hdCB4MSA9IGkxIDwgbiA/IGdldFgoYmF0Y2gsIGkxKSA6IG5lZ2F0aXZlSW5mO1xuXG4gICAgICAgICAvLyBEZW5vdGVzIHdoaWNoIGRpcmVjdGlvbiBpbmRpY2VzIGFyZSBpbiAoYXNjZW5kaW5nIG9yIGRlc2NlbmRpbmcpLlxuICAgICAgICAgYm9vbCByZXZlcnNlID0gaW1vZChlbGVtSWR4LCAyICogZGlyKSA+PSBkaXI7XG4gICAgICAgICBib29sIGlzR3JlYXRlciA9IHgwID4geDEgfHwgKHgwID09IHgxICYmIGkxID4gaTApO1xuICAgICAgICAgaWYgKHJldmVyc2UgPT0gaXNHcmVhdGVyKSB7IC8vIEVsZW1lbnRzIGluIG9wcG9zaXRlIG9yZGVyIG9mIGRpcmVjdGlvblxuICAgICAgICAgICBpbnQgaVRlbXAgPSBpMDtcbiAgICAgICAgICAgaTAgPSBpMTtcbiAgICAgICAgICAgaTEgPSBpVGVtcDtcbiAgICAgICAgIH1cbiAgICAgICAgIGlmIChpc0ZpcnN0SW5QYWlyKSB7XG4gICAgICAgICAgICBzZXRPdXRwdXQoZmxvYXQoaTApKTtcbiAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXRPdXRwdXQoZmxvYXQoaTEpKTtcbiAgICAgICAgIH1cbiAgICAgICB9XG4gICAgIGA7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1lcmdlUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnLCAnaW5kaWNlcyddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIC8vIHxufCBTaXplIG9mIHRoZSBvcmlnaW5hbCBpbnB1dCBvZiBUb3BLXG4gIC8vIHxmaXJzdFBhc3N8IGluZGljYXRlcyBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHN3YXAgaXMgYmVpbmcgdXNlZCB3aGljaFxuICAvLyBtZWFucyBubyBpbmRpY2VzIGlucHV0IGNvbnRhaW5pbmcgdGhlIHRvcCBLIGlzIHByZXNlbnQgeWV0LlxuICAvLyB8a3wgVG9wIGsgZWxlbWVudHMgZGVzaXJlZFxuICBjdXN0b21Vbmlmb3JtcyA9IFtcbiAgICB7bmFtZTogJ24nLCB0eXBlOiAnaW50JyBhcyBVbmlmb3JtVHlwZX0sXG4gICAge25hbWU6ICdmaXJzdFBhc3MnLCB0eXBlOiAnaW50JyBhcyBVbmlmb3JtVHlwZX0sXG4gICAge25hbWU6ICdrJywgdHlwZTogJ2ludCcgYXMgVW5pZm9ybVR5cGV9XG4gIF07XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBzaGFwZSBkZXNpcmVkIG91dHB1dCBzaGFwZSAobXVzdCBiZSBoYWxmIG9mIHRoZSBpbnB1dCBzaXplKVxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2hhcGU6IG51bWJlcltdKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IHNoYXBlO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAvLyBUYWtlcyBtYXggb2YgaW5kaWNlcyAoMCwgayksICgxLCBrICsgMSksICgyLCBrICsgMikgLi4uXG4gICAgICAgICBpdmVjMiBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgIGludCBiYXRjaCA9IGNvb3Jkc1swXTtcbiAgICAgICAgIGludCBlbGVtSWR4ID0gY29vcmRzWzFdO1xuXG4gICAgICAgICAvLyBUaGUgb3V0cHV0IHNpemUgaXMgaGFsZiBvZiB0aGUgcHJldmlvdXMgc2l6ZS5cbiAgICAgICAgIC8vIElmIHRoZSBwcmV2aW91cyBzZXF1ZW5jZSBpcyB8IHwgfCB8IF8gXyBfIF8gIHwgfCB8IHwgIF8gXyBfIF8gKGs9NCksXG4gICAgICAgICAvLyB3ZSBvbmx5IG5lZWQgdG8gb3V0cHV0IHRoZSBpbmRpY2VzIGF0IHBvc2l0aW9ucyB8LCB0aGUgaW5kaWNlcyBhdFxuICAgICAgICAgLy8gcG9zaXRpb25zIF8gY2FuIGJlIHRocm93biBhd2F5LCBzZWUgRmlndXJlNShiKSBBZnRlciBQaGFzZSAyXG4gICAgICAgICAvLyAoTWVyZ2UgcGhhc2UpIGluIHRoZSBCaXRvbmljIFRvcCBLIHBhcGVyIHJlZmVyZW5jZWQgYWJvdmUuXG4gICAgICAgICAvLyBGb3IgZXhhbXBsZSwgdGhlIHBhcGVyIHNob3dzIHdlIG9ubHkgbmVlZCB0byBvdXRwdXQgdGhlIG9yYW5nZSBiYXJzLlxuICAgICAgICAgLy8gVGhlIG91dHB1dCBzZXF1ZW5jZSBzaG91bGQgbG9vayBsaWtlIHRoaXMgfCB8IHwgfCB8IHwgfCB8LlxuICAgICAgICAgLy8gQmVjYXVzZSB0aGUgc2VxdWVuY2UgaXMgaGFsdmVkLCB0byBtYXAgdGhlIG91dHB1dCBpbmRleCBiYWNrXG4gICAgICAgICAvLyB0byB0aGUgcHJldmlvdXMgc2VxdWVuY2UgdG8gZmluZCB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSxcbiAgICAgICAgIC8vIHdlIG5lZWQgdG8gZG91YmxlIHRoZSBpbmRleC4gV2hlbiB3ZSBkb3VibGUgdGhlIGluZGV4LFxuICAgICAgICAgLy8gd2UgYmFzaWNhbGx5IGludGVycG9sYXRlIGEgcG9zaXRpb24sIHNvIDJpIGxvb2tzIGxpa2VcbiAgICAgICAgIC8vIHwgXyB8IF8gfCBfIHwgXyB8IF8gfCBfIHwgXy4gV2UgbW92ZSB0aGUgfCB0byB0aGUgZmlyc3QgayBwb3NpdGlvblxuICAgICAgICAgLy8gb2YgZWFjaCAyayBwb3NpdGlvbnMgYnkgLSBlbGVtSWR4ICUgay4gRS5nLiBmb3Igb3V0cHV0IGF0XG4gICAgICAgICAvLyBpbmRleCA0LDUsNiw3LCB3ZSB3YW50IHRvIGdldCB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IGF0XG4gICAgICAgICAvLyBvcmlnaW5hbCBpbmRleCA4LDksMTAsMTEsIGZvciBvdXRwdXQgYXQgaW5kZXggOCw5LDEwLDExLFxuICAgICAgICAgLy8gd2Ugd2FudCB0byBnZXQgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBhdCBvcmlnaW5hbCBpbmRleFxuICAgICAgICAgLy8gMTYsMTcsMTgsMTksIHNvIG9uIGFuZCBzbyBmb3J0aC5cblxuICAgICAgICAgaW50IGkgPSBlbGVtSWR4IDwgayA/IGVsZW1JZHggOiAoZWxlbUlkeCAqIDIgLSBpbW9kKGVsZW1JZHgsIGspKTtcbiAgICAgICAgIGludCBpMCA9IGZpcnN0UGFzcyA9PSAxID8gaSA6IGludChnZXRJbmRpY2VzKGJhdGNoLCBpKSk7XG4gICAgICAgICBpbnQgaTEgPSBmaXJzdFBhc3MgPT0gMSA/IGkgKyBrIDogaW50KGdldEluZGljZXMoYmF0Y2gsIGkgKyBrKSk7XG5cbiAgICAgICAgIGZsb2F0IHgwID0gZ2V0WChiYXRjaCwgaTApO1xuICAgICAgICAgZmxvYXQgeDEgPSBpMSA8IG4gPyBnZXRYKGJhdGNoLCBpMSkgOiB4MDtcblxuICAgICAgICAgc2V0T3V0cHV0KHgwID49IHgxID8gZmxvYXQoaTApIDogZmxvYXQoaTEpKTtcbiAgICAgICB9XG4gICAgIGA7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2Zvcm1Qcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnSW1hZ2UnLCAnVHJhbnNmb3JtcyddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBpbWFnZUhlaWdodDogbnVtYmVyLCBpbWFnZVdpZHRoOiBudW1iZXIsXG4gICAgICBpbnRlcnBvbGF0aW9uOiAnbmVhcmVzdCd8J2JpbGluZWFyJyxcbiAgICAgIGZpbGxNb2RlOiAnY29uc3RhbnQnfCdyZWZsZWN0J3wnd3JhcCd8J25lYXJlc3QnLCBmaWxsVmFsdWU6IG51bWJlcixcbiAgICAgIG91dFNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSkge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRTaGFwZTtcbiAgICBjb25zdCBpbnRlcnBvbGF0aW9uTW9kZUlkID0gaW50ZXJwb2xhdGlvbiA9PT0gJ25lYXJlc3QnID8gMSA6IDI7XG4gICAgbGV0IGZpbGxNb2RlSWQ7XG4gICAgc3dpdGNoIChmaWxsTW9kZSkge1xuICAgICAgY2FzZSAnY29uc3RhbnQnOlxuICAgICAgICBmaWxsTW9kZUlkID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyZWZsZWN0JzpcbiAgICAgICAgZmlsbE1vZGVJZCA9IDI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnd3JhcCc6XG4gICAgICAgIGZpbGxNb2RlSWQgPSAzO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ25lYXJlc3QnOlxuICAgICAgICBmaWxsTW9kZUlkID0gNDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBmaWxsTW9kZUlkID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAgICAgICBmbG9hdCBtYXBDb29yZChmbG9hdCBvdXRDb29yZCwgZmxvYXQgbGVuKSB7XG4gICAgICAgICAgICAgIGZsb2F0IGluQ29vcmQgPSBvdXRDb29yZDtcbiAgICAgICAgICAgICAgaWYoJHtmaWxsTW9kZUlkfSA9PSAyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGluQ29vcmQgPCAwLjApIHtcbiAgICAgICAgICAgICAgICAgIGlmIChsZW4gPD0gMS4wKSB7XG4gICAgICAgICAgICAgICAgICAgIGluQ29vcmQgPSAwLjA7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmbG9hdCBzejIgPSAyLjAgKiBsZW47XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbkNvb3JkIDwgc3oyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaW5Db29yZCA9IHN6MiAqIGZsb2F0KGludChmbG9hdCgtaW5Db29yZCAvIHN6MikpKSArXG4gICAgICAgICAgICAgICAgICAgICAgaW5Db29yZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpbkNvb3JkID0gaW5Db29yZCA8IC1sZW4gPyBpbkNvb3JkICsgc3oyIDogLWluQ29vcmQgLSAxLjA7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbkNvb3JkID4gbGVuIC0gMS4wKSB7XG4gICAgICAgICAgICAgICAgICBpZiAobGVuIDw9IDEuMCkge1xuICAgICAgICAgICAgICAgICAgICBpbkNvb3JkID0gMC4wO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmxvYXQgc3oyID0gMi4wICogbGVuO1xuICAgICAgICAgICAgICAgICAgICBpbkNvb3JkIC09IHN6MiAqIGZsb2F0KGludChmbG9hdChpbkNvb3JkIC8gc3oyKSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5Db29yZCA+PSBsZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICBpbkNvb3JkID0gc3oyIC0gaW5Db29yZCAtIDEuMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gY2xhbXAoaW5Db29yZCwgMC4wLCBsZW4gLSAxLjApO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKCR7ZmlsbE1vZGVJZH0gPT0gMykge1xuICAgICAgICAgICAgICAgIGlmIChpbkNvb3JkIDwgMC4wKSB7XG4gICAgICAgICAgICAgICAgICBpZiAobGVuIDw9IDEuMCkge1xuICAgICAgICAgICAgICAgICAgICBpbkNvb3JkID0gMC4wO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmxvYXQgc3ogPSBsZW4gLSAxLjA7XG4gICAgICAgICAgICAgICAgICAgIGluQ29vcmQgKz0gbGVuICogKGZsb2F0KGludChmbG9hdCgtaW5Db29yZCAvIHN6KSkpICsgMS4wKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluQ29vcmQgPiBsZW4gLSAxLjApIHtcbiAgICAgICAgICAgICAgICAgIGlmIChsZW4gPD0gMS4wKSB7XG4gICAgICAgICAgICAgICAgICAgIGluQ29vcmQgPSAwLjA7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmbG9hdCBzeiA9IGxlbiAtIDEuMDtcbiAgICAgICAgICAgICAgICAgICAgaW5Db29yZCAtPSBsZW4gKiBmbG9hdChpbnQoZmxvYXQoaW5Db29yZCAvIHN6KSkpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gY2xhbXAoaW5Db29yZCwgMC4wLCBsZW4gLSAxLjApO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKCR7ZmlsbE1vZGVJZH0gPT0gNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjbGFtcChvdXRDb29yZCwgMC4wLCBsZW4gLSAxLjApO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBvdXRDb29yZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmbG9hdCByZWFkV2l0aEZpbGxWYWx1ZShpbnQgYmF0Y2gsIGludCBjb29yZFksIGludCBjb29yZFgsXG4gICAgICAgICAgICAgIGludCBjaGFubmVsKSB7XG4gICAgICAgICAgICAgIGZsb2F0IG91dHB1dFZhbHVlO1xuICAgICAgICAgICAgICBpZiAoMCA8PSBjb29yZFkgJiYgY29vcmRZIDwgJHtcbiAgICAgICAgaW1hZ2VIZWlnaHR9ICYmIDAgPD0gY29vcmRYICYmIGNvb3JkWCA8ICR7aW1hZ2VXaWR0aH0pIHtcbiAgICAgICAgICAgICAgICAgIG91dHB1dFZhbHVlID0gZ2V0SW1hZ2UoYmF0Y2gsIGNvb3JkWSwgY29vcmRYLCBjaGFubmVsKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRWYWx1ZSA9IGZsb2F0KCR7ZmlsbFZhbHVlfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIG91dHB1dFZhbHVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgICAgICBmbG9hdCBvdXRwdXRWYWx1ZTtcbiAgICAgICAgICAgICAgaW50IGJhdGNoID0gY29vcmRzWzBdO1xuICAgICAgICAgICAgICBpbnQgeCA9IGNvb3Jkc1syXTtcbiAgICAgICAgICAgICAgaW50IHkgPSBjb29yZHNbMV07XG4gICAgICAgICAgICAgIGludCBjaGFubmVsID0gY29vcmRzWzNdO1xuICAgICAgICAgICAgICBmbG9hdCB4ZiA9IGZsb2F0KHgpO1xuICAgICAgICAgICAgICBmbG9hdCB5ZiA9IGZsb2F0KHkpO1xuICAgICAgICAgICAgICBmbG9hdCBhMSA9IGdldFRyYW5zZm9ybXMoYmF0Y2gsIDApO1xuICAgICAgICAgICAgICBmbG9hdCBhMiA9IGdldFRyYW5zZm9ybXMoYmF0Y2gsIDEpO1xuICAgICAgICAgICAgICBmbG9hdCBhMyA9IGdldFRyYW5zZm9ybXMoYmF0Y2gsIDIpO1xuICAgICAgICAgICAgICBmbG9hdCBiMSA9IGdldFRyYW5zZm9ybXMoYmF0Y2gsIDMpO1xuICAgICAgICAgICAgICBmbG9hdCBiMiA9IGdldFRyYW5zZm9ybXMoYmF0Y2gsIDQpO1xuICAgICAgICAgICAgICBmbG9hdCBiMyA9IGdldFRyYW5zZm9ybXMoYmF0Y2gsIDUpO1xuICAgICAgICAgICAgICBmbG9hdCBjMSA9IGdldFRyYW5zZm9ybXMoYmF0Y2gsIDYpO1xuICAgICAgICAgICAgICBmbG9hdCBjMiA9IGdldFRyYW5zZm9ybXMoYmF0Y2gsIDcpO1xuICAgICAgICAgICAgICBmbG9hdCBwcm9qZWN0aW9uID0gYzEgKiB4ZiArIGMyICogeWYgKyAxLjA7XG4gICAgICAgICAgICAgIGlmIChwcm9qZWN0aW9uID09IDAuMCkge1xuICAgICAgICAgICAgICAgIG91dHB1dFZhbHVlID0gZmxvYXQoJHtmaWxsVmFsdWV9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmbG9hdCBpblggPSAoYTEgKiB4ZiArIGEyICogeWYgKyBhMykgLyBwcm9qZWN0aW9uO1xuICAgICAgICAgICAgICAgIGZsb2F0IGluWSA9IChiMSAqIHhmICsgYjIgKiB5ZiArIGIzKSAvIHByb2plY3Rpb247XG4gICAgICAgICAgICAgICAgZmxvYXQgbWFwWCA9IG1hcENvb3JkKGluWCwgZmxvYXQoJHtpbWFnZVdpZHRofSkpO1xuICAgICAgICAgICAgICAgIGZsb2F0IG1hcFkgPSBtYXBDb29yZChpblksIGZsb2F0KCR7aW1hZ2VIZWlnaHR9KSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoJHtpbnRlcnBvbGF0aW9uTW9kZUlkfSA9PSAxKSB7XG4gICAgICAgICAgICAgICAgICBpbnQgY29vcmRZID0gaW50KHJvdW5kKG1hcFkpKTtcbiAgICAgICAgICAgICAgICAgIGludCBjb29yZFggPSBpbnQocm91bmQobWFwWCkpO1xuICAgICAgICAgICAgICAgICAgb3V0cHV0VmFsdWUgPSByZWFkV2l0aEZpbGxWYWx1ZShiYXRjaCwgY29vcmRZLCBjb29yZFgsXG4gICAgICAgICAgICAgICAgICAgIGNoYW5uZWwpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBmbG9hdCB5Rmxvb3IgPSBmbG9vcihtYXBZKTtcbiAgICAgICAgICAgICAgICAgIGZsb2F0IHhGbG9vciA9IGZsb29yKG1hcFgpO1xuICAgICAgICAgICAgICAgICAgZmxvYXQgeUNlaWwgPSB5Rmxvb3IgKyAxLjA7XG4gICAgICAgICAgICAgICAgICBmbG9hdCB4Q2VpbCA9IHhGbG9vciArIDEuMDtcbiAgICAgICAgICAgICAgICAgIGZsb2F0IHZhbHVlWUZsb29yID0gKHhDZWlsIC0gbWFwWCkgKlxuICAgICAgICAgICAgICAgICAgcmVhZFdpdGhGaWxsVmFsdWUoYmF0Y2gsIGludCh5Rmxvb3IpLCBpbnQoeEZsb29yKSwgY2hhbm5lbCkgK1xuICAgICAgICAgICAgICAgICAgKG1hcFggLSB4Rmxvb3IpICpcbiAgICAgICAgICAgICAgICAgIHJlYWRXaXRoRmlsbFZhbHVlKGJhdGNoLCBpbnQoeUZsb29yKSwgaW50KHhDZWlsKSwgY2hhbm5lbCk7XG4gICAgICAgICAgICAgICAgICBmbG9hdCB2YWx1ZVlDZWlsID0gKHhDZWlsIC0gbWFwWCkgKlxuICAgICAgICAgICAgICAgICAgcmVhZFdpdGhGaWxsVmFsdWUoYmF0Y2gsIGludCh5Q2VpbCksIGludCh4Rmxvb3IpLCBjaGFubmVsKSArXG4gICAgICAgICAgICAgICAgICAobWFwWCAtIHhGbG9vcikgKlxuICAgICAgICAgICAgICAgICAgcmVhZFdpdGhGaWxsVmFsdWUoYmF0Y2gsIGludCh5Q2VpbCksIGludCh4Q2VpbCksIGNoYW5uZWwpO1xuICAgICAgICAgICAgICAgICAgb3V0cHV0VmFsdWUgPSAoeUNlaWwgLSBtYXBZKSAqIHZhbHVlWUZsb29yICtcbiAgICAgICAgICAgICAgICAgIChtYXBZIC0geUZsb29yKSAqIHZhbHVlWUNlaWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHNldE91dHB1dChvdXRwdXRWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIGA7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5pbXBvcnQge2dldENvb3Jkc0RhdGFUeXBlfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc3Bvc2VQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIHJhbms6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihhU2hhcGU6IG51bWJlcltdLCBuZXdEaW06IG51bWJlcltdKSB7XG4gICAgY29uc3Qgb3V0cHV0U2hhcGU6IG51bWJlcltdID0gbmV3IEFycmF5KGFTaGFwZS5sZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0cHV0U2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIG91dHB1dFNoYXBlW2ldID0gYVNoYXBlW25ld0RpbVtpXV07XG4gICAgfVxuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICB0aGlzLnJhbmsgPSBvdXRwdXRTaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgZHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZSh0aGlzLnJhbmspO1xuICAgIGNvbnN0IHN3aXRjaGVkID0gZ2V0U3dpdGNoZWRDb29yZHMobmV3RGltKTtcblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgdm9pZCBtYWluKCkge1xuICAgICAgJHtkdHlwZX0gcmVzUkMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgIHNldE91dHB1dChnZXRBKCR7c3dpdGNoZWR9KSk7XG4gICAgfVxuICAgIGA7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0U3dpdGNoZWRDb29yZHMobmV3RGltOiBudW1iZXJbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHJhbmsgPSBuZXdEaW0ubGVuZ3RoO1xuICBpZiAocmFuayA+IDYpIHtcbiAgICB0aHJvdyBFcnJvcihgVHJhbnNwb3NlIGZvciByYW5rICR7cmFua30gaXMgbm90IHlldCBzdXBwb3J0ZWRgKTtcbiAgfVxuICBjb25zdCBvcmlnaW5hbE9yZGVyID1cbiAgICAgIFsncmVzUkMueCcsICdyZXNSQy55JywgJ3Jlc1JDLnonLCAncmVzUkMudycsICdyZXNSQy51JywgJ3Jlc1JDLnYnXTtcbiAgY29uc3Qgc3dpdGNoZWRDb29yZHMgPSBuZXcgQXJyYXkocmFuayk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3RGltLmxlbmd0aDsgaSsrKSB7XG4gICAgc3dpdGNoZWRDb29yZHNbbmV3RGltW2ldXSA9IG9yaWdpbmFsT3JkZXJbaV07XG4gIH1cbiAgcmV0dXJuIHN3aXRjaGVkQ29vcmRzLmpvaW4oKTtcbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5pbXBvcnQge2dldFZlY0NoYW5uZWxzfSBmcm9tICcuL3BhY2tpbmdfdXRpbCc7XG5pbXBvcnQge2dldENvb3Jkc0RhdGFUeXBlfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc3Bvc2VQYWNrZWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIHJhbms6IG51bWJlcjtcbiAgcGFja2VkSW5wdXRzID0gdHJ1ZTtcbiAgcGFja2VkT3V0cHV0ID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcihhU2hhcGU6IG51bWJlcltdLCBuZXdEaW06IG51bWJlcltdKSB7XG4gICAgY29uc3Qgb3V0cHV0U2hhcGU6IG51bWJlcltdID0gbmV3IEFycmF5KGFTaGFwZS5sZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0cHV0U2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIG91dHB1dFNoYXBlW2ldID0gYVNoYXBlW25ld0RpbVtpXV07XG4gICAgfVxuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICB0aGlzLnJhbmsgPSBvdXRwdXRTaGFwZS5sZW5ndGg7XG4gICAgaWYgKHRoaXMucmFuayA+IDYpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgIGBQYWNrZWQgdHJhbnNwb3NlIGZvciByYW5rICR7dGhpcy5yYW5rfSBpcyBub3QgeWV0IHN1cHBvcnRlZC5gKTtcbiAgICB9XG4gICAgY29uc3QgZHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZSh0aGlzLnJhbmspO1xuXG4gICAgY29uc3Qgb3V0cHV0T3JkZXIgPSBnZXRWZWNDaGFubmVscygncmMnLCB0aGlzLnJhbmspO1xuICAgIGNvbnN0IHN3aXRjaGVkT3JkZXIgPSBuZXcgQXJyYXkodGhpcy5yYW5rKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld0RpbS5sZW5ndGg7IGkrKykge1xuICAgICAgc3dpdGNoZWRPcmRlcltuZXdEaW1baV1dID0gb3V0cHV0T3JkZXJbaV07XG4gICAgfVxuICAgIGNvbnN0IGlubmVyRGltcyA9IGB2ZWMyKCR7c3dpdGNoZWRPcmRlci5zbGljZSgtMikuam9pbigpfSlgO1xuICAgIGNvbnN0IG5leHRDb2x1bW4gPVxuICAgICAgICBgKyske291dHB1dE9yZGVyW3RoaXMucmFuayAtIDFdfSA8ICR7b3V0cHV0U2hhcGVbdGhpcy5yYW5rIC0gMV19YDtcbiAgICBjb25zdCBnZXRjID0gYGdldENoYW5uZWwoZ2V0QSgke3N3aXRjaGVkT3JkZXIuam9pbigpfSksICR7aW5uZXJEaW1zfSlgO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICB2b2lkIG1haW4oKSB7XG4gICAgICAke2R0eXBlfSByYyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgdmVjNCByZXN1bHQgPSB2ZWM0KDAuKTtcbiAgICAgIHJlc3VsdFswXSA9ICR7Z2V0Y307XG4gICAgICBpZigke25leHRDb2x1bW59KSB7XG4gICAgICAgIHJlc3VsdFsxXSA9ICR7Z2V0Y307XG4gICAgICB9XG4gICAgICAtLSR7b3V0cHV0T3JkZXJbdGhpcy5yYW5rIC0gMV19O1xuICAgICAgaWYoKyske291dHB1dE9yZGVyW3RoaXMucmFuayAtIDJdfSA8ICR7b3V0cHV0U2hhcGVbdGhpcy5yYW5rIC0gMl19KSB7XG4gICAgICAgIHJlc3VsdFsyXSA9ICR7Z2V0Y307XG4gICAgICAgIGlmKCR7bmV4dENvbHVtbn0pIHtcbiAgICAgICAgICByZXN1bHRbM10gPSAke2dldGN9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzZXRPdXRwdXQocmVzdWx0KTtcbiAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbSwgdXNlU2hhcGVVbmlmb3Jtc30gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIFVuYXJ5T3BQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoYVNoYXBlOiBudW1iZXJbXSwgb3BTbmlwcGV0OiBzdHJpbmcpIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gYVNoYXBlO1xuICAgIHRoaXMuZW5hYmxlU2hhcGVVbmlmb3JtcyA9IHVzZVNoYXBlVW5pZm9ybXModGhpcy5vdXRwdXRTaGFwZS5sZW5ndGgpO1xuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBmbG9hdCB1bmFyeU9wZXJhdGlvbihmbG9hdCB4KSB7XG4gICAgICAgICR7b3BTbmlwcGV0fVxuICAgICAgfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGZsb2F0IHggPSBnZXRBQXRPdXRDb29yZHMoKTtcbiAgICAgICAgZmxvYXQgeSA9IHVuYXJ5T3BlcmF0aW9uKHgpO1xuXG4gICAgICAgIHNldE91dHB1dCh5KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBDSEVDS19OQU5fU05JUFBFVCA9IGBpZiAoaXNuYW4oeCkpIHJldHVybiB4O2A7XG5cbmV4cG9ydCBjb25zdCBMSU5FQVIgPSBgcmV0dXJuIHg7YDtcblxuZXhwb3J0IGNvbnN0IEFCUyA9IGByZXR1cm4gYWJzKHgpO2A7XG5cbmV4cG9ydCBmdW5jdGlvbiBTVEVQKGFscGhhID0gMC4wKSB7XG4gIHJldHVybiBDSEVDS19OQU5fU05JUFBFVCArIGBcbiAgICByZXR1cm4geCA+IDAuMCA/IDEuMCA6IGZsb2F0KCR7YWxwaGF9KTtcbiAgYDtcbn1cblxuZXhwb3J0IGNvbnN0IEVMVSA9IGByZXR1cm4gKHggPj0gMC4wKSA/IHggOiAoZXhwKHgpIC0gMS4wKTtgO1xuZXhwb3J0IGNvbnN0IFJFTFUgPSBDSEVDS19OQU5fU05JUFBFVCArIGBcbiAgcmV0dXJuICh4IDwgMC4wKSA/IDAuMCA6IHg7XG5gO1xuXG5leHBvcnQgY29uc3QgUkVMVTYgPSBDSEVDS19OQU5fU05JUFBFVCArIGBcbiAgcmV0dXJuICh4IDwgMC4wKSA/IDAuMCA6IG1pbig2LjAsIHgpO1xuYDtcblxuZXhwb3J0IGNvbnN0IENMT05FID0gJ3JldHVybiB4Oyc7XG5cbmV4cG9ydCBjb25zdCBTSUdNT0lEID0gYHJldHVybiAxLjAgLyAoMS4wICsgZXhwKC0xLjAgKiB4KSk7YDtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW0sIHVzZVNoYXBlVW5pZm9ybXN9IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjb25zdCBMSU5FQVIgPSBgcmV0dXJuIHg7YDtcblxuZXhwb3J0IGNvbnN0IEVMVSA9IGBcbiAgdmVjNCByZXN1bHQ7XG5cbiAgcmVzdWx0LnIgPSAoeC5yID49IDAuMCkgPyB4LnIgOiAoZXhwKHgucikgLSAxLjApO1xuICByZXN1bHQuZyA9ICh4LmcgPj0gMC4wKSA/IHguZyA6IChleHAoeC5nKSAtIDEuMCk7XG4gIHJlc3VsdC5iID0gKHguYiA+PSAwLjApID8geC5iIDogKGV4cCh4LmIpIC0gMS4wKTtcbiAgcmVzdWx0LmEgPSAoeC5hID49IDAuMCkgPyB4LmEgOiAoZXhwKHguYSkgLSAxLjApO1xuXG4gIHJldHVybiByZXN1bHQ7XG5gO1xuXG5leHBvcnQgY29uc3QgUkVMVSA9IGBcbiAgdmVjNCByZXN1bHQgPSB4ICogdmVjNChncmVhdGVyVGhhbkVxdWFsKHgsIHZlYzQoMC4wKSkpO1xuICBidmVjNCBpc05hTiA9IGlzbmFuKHgpO1xuXG4gIHJlc3VsdC5yID0gaXNOYU4uciA/IHguciA6IHJlc3VsdC5yO1xuICByZXN1bHQuZyA9IGlzTmFOLmcgPyB4LmcgOiByZXN1bHQuZztcbiAgcmVzdWx0LmIgPSBpc05hTi5iID8geC5iIDogcmVzdWx0LmI7XG4gIHJlc3VsdC5hID0gaXNOYU4uYSA/IHguYSA6IHJlc3VsdC5hO1xuXG4gIHJldHVybiByZXN1bHQ7XG5gO1xuXG5leHBvcnQgY29uc3QgUkVMVTYgPSBgXG4gIHZlYzQgcmVzdWx0ID0gbWluKHgsIHZlYzQoNi4pKSAqIHZlYzQoZ3JlYXRlclRoYW5FcXVhbCh4LCB2ZWM0KDAuMCkpKTtcbiAgYnZlYzQgaXNOYU4gPSBpc25hbih4KTtcblxuICByZXN1bHQuciA9IGlzTmFOLnIgPyB4LnIgOiByZXN1bHQucjtcbiAgcmVzdWx0LmcgPSBpc05hTi5nID8geC5nIDogcmVzdWx0Lmc7XG4gIHJlc3VsdC5iID0gaXNOYU4uYiA/IHguYiA6IHJlc3VsdC5iO1xuICByZXN1bHQuYSA9IGlzTmFOLmEgPyB4LmEgOiByZXN1bHQuYTtcblxuICByZXR1cm4gcmVzdWx0O1xuYDtcblxuZXhwb3J0IGNvbnN0IFNJR01PSUQgPSBgcmV0dXJuIDEuMCAvICgxLjAgKyBleHAoLTEuMCAqIHgpKTtgO1xuXG5leHBvcnQgY2xhc3MgVW5hcnlPcFBhY2tlZFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydBJ107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW47XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgcGFja2VkSW5wdXRzID0gdHJ1ZTtcbiAgcGFja2VkT3V0cHV0ID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcihhU2hhcGU6IG51bWJlcltdLCBvcFNuaXBwZXQ6IHN0cmluZykge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBhU2hhcGU7XG4gICAgdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID0gdXNlU2hhcGVVbmlmb3Jtcyh0aGlzLm91dHB1dFNoYXBlLmxlbmd0aCk7XG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZlYzQgdW5hcnlPcGVyYXRpb24odmVjNCB4KSB7XG4gICAgICAgICR7b3BTbmlwcGV0fVxuICAgICAgfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIHZlYzQgeCA9IGdldEFBdE91dENvb3JkcygpO1xuICAgICAgICB2ZWM0IHkgPSB1bmFyeU9wZXJhdGlvbih4KTtcblxuICAgICAgICBzZXRPdXRwdXQoeSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7Z2V0Q2hhbm5lbHMsIGdldFNvdXJjZUNvb3Jkc30gZnJvbSAnLi9wYWNraW5nX3V0aWwnO1xuaW1wb3J0IHtnZXRDb29yZHNEYXRhVHlwZX0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuXG5leHBvcnQgY2xhc3MgVW5wYWNrUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgcGFja2VkSW5wdXRzID0gdHJ1ZTtcbiAgcGFja2VkT3V0cHV0ID0gZmFsc2U7XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihvdXRwdXRTaGFwZTogbnVtYmVyW10pIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGU7XG4gICAgY29uc3QgcmFuayA9IG91dHB1dFNoYXBlLmxlbmd0aDtcblxuICAgIGNvbnN0IGNoYW5uZWxzID0gZ2V0Q2hhbm5lbHMoJ3JjJywgcmFuayk7XG4gICAgY29uc3QgZHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShyYW5rKTtcbiAgICBjb25zdCBzb3VyY2VDb29yZHMgPSBnZXRTb3VyY2VDb29yZHMocmFuaywgY2hhbm5lbHMpO1xuICAgIGNvbnN0IGlubmVyRGltcyA9IGNoYW5uZWxzLnNsaWNlKC0yKTtcbiAgICBjb25zdCBjb29yZHMgPSByYW5rIDw9IDEgPyAncmMnIDogYHZlYzIoJHtpbm5lckRpbXMuam9pbignLCcpfSlgO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgJHtkdHlwZX0gcmMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgdmVjNCBwYWNrZWRJbnB1dCA9IGdldEEoJHtzb3VyY2VDb29yZHN9KTtcblxuICAgICAgICBzZXRPdXRwdXQoZ2V0Q2hhbm5lbChwYWNrZWRJbnB1dCwgJHtjb29yZHN9KSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqIEBsaWNlbnNlIFNlZSB0aGUgTElDRU5TRSBmaWxlLiAqL1xuXG4vLyBUaGlzIGNvZGUgaXMgYXV0by1nZW5lcmF0ZWQsIGRvIG5vdCBtb2RpZnkgdGhpcyBmaWxlIVxuY29uc3QgdmVyc2lvbiA9ICcwLjAuMCc7XG5leHBvcnQge3ZlcnNpb259O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2Vudn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0ICogYXMgZ3BncHVfdXRpbCBmcm9tICcuL2dwZ3B1X3V0aWwnO1xuaW1wb3J0ICogYXMgd2ViZ2xfdXRpbCBmcm9tICcuL3dlYmdsX3V0aWwnO1xuXG5leHBvcnQge01hdGhCYWNrZW5kV2ViR0wsIFdlYkdMTWVtb3J5SW5mbywgV2ViR0xUaW1pbmdJbmZvfSBmcm9tICcuL2JhY2tlbmRfd2ViZ2wnO1xuZXhwb3J0IHtzZXRXZWJHTENvbnRleHR9IGZyb20gJy4vY2FudmFzX3V0aWwnO1xuZXhwb3J0IHtHUEdQVUNvbnRleHR9IGZyb20gJy4vZ3BncHVfY29udGV4dCc7XG5leHBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbi8vIFdlYkdMIHNwZWNpZmljIHV0aWxzLlxuZXhwb3J0IHtncGdwdV91dGlsLCB3ZWJnbF91dGlsfTtcblxuLyoqXG4gKiBFbmZvcmNlIHVzZSBvZiBoYWxmIHByZWNpc2lvbiB0ZXh0dXJlcyBpZiBhdmFpbGFibGUgb24gdGhlIHBsYXRmb3JtLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdFbnZpcm9ubWVudCcsIG5hbWVzcGFjZTogJ3dlYmdsJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcmNlSGFsZkZsb2F0KCk6IHZvaWQge1xuICBlbnYoKS5zZXQoJ1dFQkdMX0ZPUkNFX0YxNl9URVhUVVJFUycsIHRydWUpO1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2VudiwgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtnZXRXZWJHTENvbnRleHR9IGZyb20gJy4vY2FudmFzX3V0aWwnO1xuaW1wb3J0IHtnZXRUZXh0dXJlQ29uZmlnfSBmcm9tICcuL3RleF91dGlsJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGxBbmRDaGVjazxUPihnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCBmdW5jOiAoKSA9PiBUKTogVCB7XG4gIGNvbnN0IHJldHVyblZhbHVlID0gZnVuYygpO1xuICBpZiAoZW52KCkuZ2V0Qm9vbCgnREVCVUcnKSkge1xuICAgIGNoZWNrV2ViR0xFcnJvcihnbCk7XG4gIH1cbiAgcmV0dXJuIHJldHVyblZhbHVlO1xufVxuXG5mdW5jdGlvbiBjaGVja1dlYkdMRXJyb3IoZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCkge1xuICBjb25zdCBlcnJvciA9IGdsLmdldEVycm9yKCk7XG4gIGlmIChlcnJvciAhPT0gZ2wuTk9fRVJST1IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlYkdMIEVycm9yOiAnICsgZ2V0V2ViR0xFcnJvck1lc3NhZ2UoZ2wsIGVycm9yKSk7XG4gIH1cbn1cblxuLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSGFsZi1wcmVjaXNpb25fZmxvYXRpbmctcG9pbnRfZm9ybWF0XG5jb25zdCBNSU5fRkxPQVQxNiA9IDUuOTZlLTg7XG5jb25zdCBNQVhfRkxPQVQxNiA9IDY1NTA0O1xuXG5leHBvcnQgZnVuY3Rpb24gY2FuQmVSZXByZXNlbnRlZChudW06IG51bWJlcik6IGJvb2xlYW4ge1xuICBpZiAoZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUkVOREVSX0ZMT0FUMzJfRU5BQkxFRCcpIHx8IG51bSA9PT0gMCB8fFxuICAgICAgKE1JTl9GTE9BVDE2IDwgTWF0aC5hYnMobnVtKSAmJiBNYXRoLmFicyhudW0pIDwgTUFYX0ZMT0FUMTYpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2ViR0xFcnJvck1lc3NhZ2UoXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgc3RhdHVzOiBudW1iZXIpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHN0YXR1cykge1xuICAgIGNhc2UgZ2wuTk9fRVJST1I6XG4gICAgICByZXR1cm4gJ05PX0VSUk9SJztcbiAgICBjYXNlIGdsLklOVkFMSURfRU5VTTpcbiAgICAgIHJldHVybiAnSU5WQUxJRF9FTlVNJztcbiAgICBjYXNlIGdsLklOVkFMSURfVkFMVUU6XG4gICAgICByZXR1cm4gJ0lOVkFMSURfVkFMVUUnO1xuICAgIGNhc2UgZ2wuSU5WQUxJRF9PUEVSQVRJT046XG4gICAgICByZXR1cm4gJ0lOVkFMSURfT1BFUkFUSU9OJztcbiAgICBjYXNlIGdsLklOVkFMSURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OOlxuICAgICAgcmV0dXJuICdJTlZBTElEX0ZSQU1FQlVGRkVSX09QRVJBVElPTic7XG4gICAgY2FzZSBnbC5PVVRfT0ZfTUVNT1JZOlxuICAgICAgcmV0dXJuICdPVVRfT0ZfTUVNT1JZJztcbiAgICBjYXNlIGdsLkNPTlRFWFRfTE9TVF9XRUJHTDpcbiAgICAgIHJldHVybiAnQ09OVEVYVF9MT1NUX1dFQkdMJztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGBVbmtub3duIGVycm9yIGNvZGUgJHtzdGF0dXN9YDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uT3JUaHJvdyhcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCBleHRlbnNpb25OYW1lOiBzdHJpbmcpOiB7fSB7XG4gIHJldHVybiB0aHJvd0lmTnVsbDx7fT4oXG4gICAgICBnbCwgKCkgPT4gZ2wuZ2V0RXh0ZW5zaW9uKGV4dGVuc2lvbk5hbWUpLFxuICAgICAgJ0V4dGVuc2lvbiBcIicgKyBleHRlbnNpb25OYW1lICsgJ1wiIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBicm93c2VyLicpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVmVydGV4U2hhZGVyKFxuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHZlcnRleFNoYWRlclNvdXJjZTogc3RyaW5nKTogV2ViR0xTaGFkZXIge1xuICBjb25zdCB2ZXJ0ZXhTaGFkZXI6IFdlYkdMU2hhZGVyID0gdGhyb3dJZk51bGw8V2ViR0xTaGFkZXI+KFxuICAgICAgZ2wsICgpID0+IGdsLmNyZWF0ZVNoYWRlcihnbC5WRVJURVhfU0hBREVSKSxcbiAgICAgICdVbmFibGUgdG8gY3JlYXRlIHZlcnRleCBXZWJHTFNoYWRlci4nKTtcbiAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5zaGFkZXJTb3VyY2UodmVydGV4U2hhZGVyLCB2ZXJ0ZXhTaGFkZXJTb3VyY2UpKTtcbiAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5jb21waWxlU2hhZGVyKHZlcnRleFNoYWRlcikpO1xuICBpZiAoZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKHZlcnRleFNoYWRlciwgZ2wuQ09NUElMRV9TVEFUVVMpID09PSBmYWxzZSkge1xuICAgIGNvbnNvbGUubG9nKGdsLmdldFNoYWRlckluZm9Mb2codmVydGV4U2hhZGVyKSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gY29tcGlsZSB2ZXJ0ZXggc2hhZGVyLicpO1xuICB9XG4gIHJldHVybiB2ZXJ0ZXhTaGFkZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGcmFnbWVudFNoYWRlcihcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCBmcmFnbWVudFNoYWRlclNvdXJjZTogc3RyaW5nKTogV2ViR0xTaGFkZXIge1xuICBjb25zdCBmcmFnbWVudFNoYWRlcjogV2ViR0xTaGFkZXIgPSB0aHJvd0lmTnVsbDxXZWJHTFNoYWRlcj4oXG4gICAgICBnbCwgKCkgPT4gZ2wuY3JlYXRlU2hhZGVyKGdsLkZSQUdNRU5UX1NIQURFUiksXG4gICAgICAnVW5hYmxlIHRvIGNyZWF0ZSBmcmFnbWVudCBXZWJHTFNoYWRlci4nKTtcbiAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5zaGFkZXJTb3VyY2UoZnJhZ21lbnRTaGFkZXIsIGZyYWdtZW50U2hhZGVyU291cmNlKSk7XG4gIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuY29tcGlsZVNoYWRlcihmcmFnbWVudFNoYWRlcikpO1xuICBpZiAoZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKGZyYWdtZW50U2hhZGVyLCBnbC5DT01QSUxFX1NUQVRVUykgPT09IGZhbHNlKSB7XG4gICAgbG9nU2hhZGVyU291cmNlQW5kSW5mb0xvZyhcbiAgICAgICAgZnJhZ21lbnRTaGFkZXJTb3VyY2UsIGdsLmdldFNoYWRlckluZm9Mb2coZnJhZ21lbnRTaGFkZXIpKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBjb21waWxlIGZyYWdtZW50IHNoYWRlci4nKTtcbiAgfVxuICByZXR1cm4gZnJhZ21lbnRTaGFkZXI7XG59XG5cbmNvbnN0IGxpbmVOdW1iZXJSZWdleCA9IC9FUlJPUjogWzAtOV0rOihbMC05XSspOi9nO1xuZnVuY3Rpb24gbG9nU2hhZGVyU291cmNlQW5kSW5mb0xvZyhcbiAgICBzaGFkZXJTb3VyY2U6IHN0cmluZywgc2hhZGVySW5mb0xvZzogc3RyaW5nKSB7XG4gIGNvbnN0IGxpbmVOdW1iZXJSZWdleFJlc3VsdCA9IGxpbmVOdW1iZXJSZWdleC5leGVjKHNoYWRlckluZm9Mb2cpO1xuICBpZiAobGluZU51bWJlclJlZ2V4UmVzdWx0ID09IG51bGwpIHtcbiAgICBjb25zb2xlLmxvZyhgQ291bGRuJ3QgcGFyc2UgbGluZSBudW1iZXIgaW4gZXJyb3I6ICR7c2hhZGVySW5mb0xvZ31gKTtcbiAgICBjb25zb2xlLmxvZyhzaGFkZXJTb3VyY2UpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGxpbmVOdW1iZXIgPSArbGluZU51bWJlclJlZ2V4UmVzdWx0WzFdO1xuXG4gIGNvbnN0IHNoYWRlckxpbmVzID0gc2hhZGVyU291cmNlLnNwbGl0KCdcXG4nKTtcbiAgY29uc3QgcGFkID0gc2hhZGVyTGluZXMubGVuZ3RoLnRvU3RyaW5nKCkubGVuZ3RoICsgMjtcbiAgY29uc3QgbGluZXNXaXRoTGluZU51bWJlcnMgPSBzaGFkZXJMaW5lcy5tYXAoXG4gICAgICAobGluZSwgbGluZU51bWJlcikgPT5cbiAgICAgICAgICB1dGlsLnJpZ2h0UGFkKChsaW5lTnVtYmVyICsgMSkudG9TdHJpbmcoKSwgcGFkKSArIGxpbmUpO1xuICBsZXQgbWF4TGluZUxlbmd0aCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXNXaXRoTGluZU51bWJlcnMubGVuZ3RoOyBpKyspIHtcbiAgICBtYXhMaW5lTGVuZ3RoID0gTWF0aC5tYXgobGluZXNXaXRoTGluZU51bWJlcnNbaV0ubGVuZ3RoLCBtYXhMaW5lTGVuZ3RoKTtcbiAgfVxuXG4gIGNvbnN0IGJlZm9yZUVycm9yTGluZXMgPSBsaW5lc1dpdGhMaW5lTnVtYmVycy5zbGljZSgwLCBsaW5lTnVtYmVyIC0gMSk7XG4gIGNvbnN0IGVycm9yTGluZSA9IGxpbmVzV2l0aExpbmVOdW1iZXJzLnNsaWNlKGxpbmVOdW1iZXIgLSAxLCBsaW5lTnVtYmVyKTtcbiAgY29uc3QgYWZ0ZXJFcnJvckxpbmVzID0gbGluZXNXaXRoTGluZU51bWJlcnMuc2xpY2UobGluZU51bWJlcik7XG5cbiAgY29uc29sZS5sb2coYmVmb3JlRXJyb3JMaW5lcy5qb2luKCdcXG4nKSk7XG4gIGNvbnNvbGUubG9nKHNoYWRlckluZm9Mb2cuc3BsaXQoJ1xcbicpWzBdKTtcbiAgY29uc29sZS5sb2coXG4gICAgICBgJWMgJHt1dGlsLnJpZ2h0UGFkKGVycm9yTGluZVswXSwgbWF4TGluZUxlbmd0aCl9YCxcbiAgICAgICdib3JkZXI6MXB4IHNvbGlkIHJlZDsgYmFja2dyb3VuZC1jb2xvcjojZTNkMmQyOyBjb2xvcjojYTYxNzE3Jyk7XG4gIGNvbnNvbGUubG9nKGFmdGVyRXJyb3JMaW5lcy5qb2luKCdcXG4nKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm9ncmFtKGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQpOiBXZWJHTFByb2dyYW0ge1xuICByZXR1cm4gdGhyb3dJZk51bGw8V2ViR0xQcm9ncmFtPihcbiAgICAgIGdsLCAoKSA9PiBnbC5jcmVhdGVQcm9ncmFtKCksICdVbmFibGUgdG8gY3JlYXRlIFdlYkdMUHJvZ3JhbS4nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxpbmtQcm9ncmFtKGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHByb2dyYW06IFdlYkdMUHJvZ3JhbSkge1xuICBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmxpbmtQcm9ncmFtKHByb2dyYW0pKTtcbiAgaWYgKGdsLmdldFByb2dyYW1QYXJhbWV0ZXIocHJvZ3JhbSwgZ2wuTElOS19TVEFUVVMpID09PSBmYWxzZSkge1xuICAgIGNvbnNvbGUubG9nKGdsLmdldFByb2dyYW1JbmZvTG9nKHByb2dyYW0pKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBsaW5rIHZlcnRleCBhbmQgZnJhZ21lbnQgc2hhZGVycy4nKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVQcm9ncmFtKFxuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHByb2dyYW06IFdlYkdMUHJvZ3JhbSkge1xuICBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLnZhbGlkYXRlUHJvZ3JhbShwcm9ncmFtKSk7XG4gIGlmIChnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHByb2dyYW0sIGdsLlZBTElEQVRFX1NUQVRVUykgPT09IGZhbHNlKSB7XG4gICAgY29uc29sZS5sb2coZ2wuZ2V0UHJvZ3JhbUluZm9Mb2cocHJvZ3JhbSkpO1xuICAgIHRocm93IG5ldyBFcnJvcignU2hhZGVyIHByb2dyYW0gdmFsaWRhdGlvbiBmYWlsZWQuJyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0YXRpY1ZlcnRleEJ1ZmZlcihcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCBkYXRhOiBGbG9hdDMyQXJyYXkpOiBXZWJHTEJ1ZmZlciB7XG4gIGNvbnN0IGJ1ZmZlcjogV2ViR0xCdWZmZXIgPSB0aHJvd0lmTnVsbDxXZWJHTEJ1ZmZlcj4oXG4gICAgICBnbCwgKCkgPT4gZ2wuY3JlYXRlQnVmZmVyKCksICdVbmFibGUgdG8gY3JlYXRlIFdlYkdMQnVmZmVyJyk7XG4gIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIGJ1ZmZlcikpO1xuICBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBkYXRhLCBnbC5TVEFUSUNfRFJBVykpO1xuICByZXR1cm4gYnVmZmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3RhdGljSW5kZXhCdWZmZXIoXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgZGF0YTogVWludDE2QXJyYXkpOiBXZWJHTEJ1ZmZlciB7XG4gIGNvbnN0IGJ1ZmZlcjogV2ViR0xCdWZmZXIgPSB0aHJvd0lmTnVsbDxXZWJHTEJ1ZmZlcj4oXG4gICAgICBnbCwgKCkgPT4gZ2wuY3JlYXRlQnVmZmVyKCksICdVbmFibGUgdG8gY3JlYXRlIFdlYkdMQnVmZmVyJyk7XG4gIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuYmluZEJ1ZmZlcihnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgYnVmZmVyKSk7XG4gIGNhbGxBbmRDaGVjayhcbiAgICAgIGdsLCAoKSA9PiBnbC5idWZmZXJEYXRhKGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBkYXRhLCBnbC5TVEFUSUNfRFJBVykpO1xuICByZXR1cm4gYnVmZmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TnVtQ2hhbm5lbHMoKTogbnVtYmVyIHtcbiAgaWYgKGVudigpLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpID09PSAyKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cbiAgcmV0dXJuIDQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUZXh0dXJlKGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQpOiBXZWJHTFRleHR1cmUge1xuICByZXR1cm4gdGhyb3dJZk51bGw8V2ViR0xUZXh0dXJlPihcbiAgICAgIGdsLCAoKSA9PiBnbC5jcmVhdGVUZXh0dXJlKCksICdVbmFibGUgdG8gY3JlYXRlIFdlYkdMVGV4dHVyZS4nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlVGV4dHVyZVNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgY29uc3QgbWF4VGV4dHVyZVNpemUgPSBlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX01BWF9URVhUVVJFX1NJWkUnKTtcbiAgaWYgKCh3aWR0aCA8PSAwKSB8fCAoaGVpZ2h0IDw9IDApKSB7XG4gICAgY29uc3QgcmVxdWVzdGVkID0gYFske3dpZHRofXgke2hlaWdodH1dYDtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVlc3RlZCB0ZXh0dXJlIHNpemUgJyArIHJlcXVlc3RlZCArICcgaXMgaW52YWxpZC4nKTtcbiAgfVxuICBpZiAoKHdpZHRoID4gbWF4VGV4dHVyZVNpemUpIHx8IChoZWlnaHQgPiBtYXhUZXh0dXJlU2l6ZSkpIHtcbiAgICBjb25zdCByZXF1ZXN0ZWQgPSBgWyR7d2lkdGh9eCR7aGVpZ2h0fV1gO1xuICAgIGNvbnN0IG1heCA9IGBbJHttYXhUZXh0dXJlU2l6ZX14JHttYXhUZXh0dXJlU2l6ZX1dYDtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdSZXF1ZXN0ZWQgdGV4dHVyZSBzaXplICcgKyByZXF1ZXN0ZWQgK1xuICAgICAgICAnIGdyZWF0ZXIgdGhhbiBXZWJHTCBtYXhpbXVtIG9uIHRoaXMgYnJvd3NlciAvIEdQVSAnICsgbWF4ICsgJy4nKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRnJhbWVidWZmZXIoZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCk6IFdlYkdMRnJhbWVidWZmZXIge1xuICByZXR1cm4gdGhyb3dJZk51bGw8V2ViR0xGcmFtZWJ1ZmZlcj4oXG4gICAgICBnbCwgKCkgPT4gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKSwgJ1VuYWJsZSB0byBjcmVhdGUgV2ViR0xGcmFtZWJ1ZmZlci4nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJpbmRWZXJ0ZXhCdWZmZXJUb1Byb2dyYW1BdHRyaWJ1dGUoXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgcHJvZ3JhbTogV2ViR0xQcm9ncmFtLCBhdHRyaWJ1dGU6IHN0cmluZyxcbiAgICBidWZmZXI6IFdlYkdMQnVmZmVyLCBhcnJheUVudHJpZXNQZXJJdGVtOiBudW1iZXIsIGl0ZW1TdHJpZGVJbkJ5dGVzOiBudW1iZXIsXG4gICAgaXRlbU9mZnNldEluQnl0ZXM6IG51bWJlcik6IGJvb2xlYW4ge1xuICBjb25zdCBsb2MgPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCBhdHRyaWJ1dGUpO1xuICBpZiAobG9jID09PSAtMSkge1xuICAgIC8vIFRoZSBHUFUgY29tcGlsZXIgZGVjaWRlZCB0byBzdHJpcCBvdXQgdGhpcyBhdHRyaWJ1dGUgYmVjYXVzZSBpdCdzIHVudXNlZCxcbiAgICAvLyB0aHVzIG5vIG5lZWQgdG8gYmluZC5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgYnVmZmVyKSk7XG4gIGNhbGxBbmRDaGVjayhcbiAgICAgIGdsLFxuICAgICAgKCkgPT4gZ2wudmVydGV4QXR0cmliUG9pbnRlcihcbiAgICAgICAgICBsb2MsIGFycmF5RW50cmllc1Blckl0ZW0sIGdsLkZMT0FULCBmYWxzZSwgaXRlbVN0cmlkZUluQnl0ZXMsXG4gICAgICAgICAgaXRlbU9mZnNldEluQnl0ZXMpKTtcbiAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShsb2MpKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBiaW5kVGV4dHVyZVVuaXQoXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgdGV4dHVyZTogV2ViR0xUZXh0dXJlLCB0ZXh0dXJlVW5pdDogbnVtYmVyKSB7XG4gIHZhbGlkYXRlVGV4dHVyZVVuaXQoZ2wsIHRleHR1cmVVbml0KTtcbiAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUwICsgdGV4dHVyZVVuaXQpKTtcbiAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0ZXh0dXJlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bmJpbmRUZXh0dXJlVW5pdChcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCB0ZXh0dXJlVW5pdDogbnVtYmVyKSB7XG4gIHZhbGlkYXRlVGV4dHVyZVVuaXQoZ2wsIHRleHR1cmVVbml0KTtcbiAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUwICsgdGV4dHVyZVVuaXQpKTtcbiAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBudWxsKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcm9ncmFtVW5pZm9ybUxvY2F0aW9uT3JUaHJvdyhcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCBwcm9ncmFtOiBXZWJHTFByb2dyYW0sXG4gICAgdW5pZm9ybU5hbWU6IHN0cmluZyk6IFdlYkdMVW5pZm9ybUxvY2F0aW9uIHtcbiAgcmV0dXJuIHRocm93SWZOdWxsPFdlYkdMVW5pZm9ybUxvY2F0aW9uPihcbiAgICAgIGdsLCAoKSA9PiBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgdW5pZm9ybU5hbWUpLFxuICAgICAgJ3VuaWZvcm0gXCInICsgdW5pZm9ybU5hbWUgKyAnXCIgbm90IHByZXNlbnQgaW4gcHJvZ3JhbS4nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFByb2dyYW1Vbmlmb3JtTG9jYXRpb24oXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgcHJvZ3JhbTogV2ViR0xQcm9ncmFtLFxuICAgIHVuaWZvcm1OYW1lOiBzdHJpbmcpOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbiB7XG4gIHJldHVybiBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgdW5pZm9ybU5hbWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYmluZFRleHR1cmVUb1Byb2dyYW1Vbmlmb3JtU2FtcGxlcihcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCB0ZXh0dXJlOiBXZWJHTFRleHR1cmUsXG4gICAgdW5pZm9ybVNhbXBsZXJMb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb24sIHRleHR1cmVVbml0OiBudW1iZXIpIHtcbiAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBiaW5kVGV4dHVyZVVuaXQoZ2wsIHRleHR1cmUsIHRleHR1cmVVbml0KSk7XG4gIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wudW5pZm9ybTFpKHVuaWZvcm1TYW1wbGVyTG9jYXRpb24sIHRleHR1cmVVbml0KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBiaW5kQ2FudmFzVG9GcmFtZWJ1ZmZlcihnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0KSB7XG4gIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBudWxsKSk7XG4gIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wudmlld3BvcnQoMCwgMCwgZ2wuY2FudmFzLndpZHRoLCBnbC5jYW52YXMuaGVpZ2h0KSk7XG4gIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuc2Npc3NvcigwLCAwLCBnbC5jYW52YXMud2lkdGgsIGdsLmNhbnZhcy5oZWlnaHQpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJpbmRDb2xvclRleHR1cmVUb0ZyYW1lYnVmZmVyKFxuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHRleHR1cmU6IFdlYkdMVGV4dHVyZSxcbiAgICBmcmFtZWJ1ZmZlcjogV2ViR0xGcmFtZWJ1ZmZlcikge1xuICBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgZnJhbWVidWZmZXIpKTtcbiAgY2FsbEFuZENoZWNrKFxuICAgICAgZ2wsXG4gICAgICAoKSA9PiBnbC5mcmFtZWJ1ZmZlclRleHR1cmUyRChcbiAgICAgICAgICBnbC5GUkFNRUJVRkZFUiwgZ2wuQ09MT1JfQVRUQUNITUVOVDAsIGdsLlRFWFRVUkVfMkQsIHRleHR1cmUsIDApKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVuYmluZENvbG9yVGV4dHVyZUZyb21GcmFtZWJ1ZmZlcihcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCBmcmFtZWJ1ZmZlcjogV2ViR0xGcmFtZWJ1ZmZlcikge1xuICBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgZnJhbWVidWZmZXIpKTtcbiAgY2FsbEFuZENoZWNrKFxuICAgICAgZ2wsXG4gICAgICAoKSA9PiBnbC5mcmFtZWJ1ZmZlclRleHR1cmUyRChcbiAgICAgICAgICBnbC5GUkFNRUJVRkZFUiwgZ2wuQ09MT1JfQVRUQUNITUVOVDAsIGdsLlRFWFRVUkVfMkQsIG51bGwsIDApKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlRnJhbWVidWZmZXIoZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCkge1xuICBjb25zdCBzdGF0dXMgPSBnbC5jaGVja0ZyYW1lYnVmZmVyU3RhdHVzKGdsLkZSQU1FQlVGRkVSKTtcbiAgaWYgKHN0YXR1cyAhPT0gZ2wuRlJBTUVCVUZGRVJfQ09NUExFVEUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdFcnJvciBiaW5kaW5nIGZyYW1lYnVmZmVyOiAnICsgZ2V0RnJhbWVidWZmZXJFcnJvck1lc3NhZ2UoZ2wsIHN0YXR1cykpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGcmFtZWJ1ZmZlckVycm9yTWVzc2FnZShcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCBzdGF0dXM6IG51bWJlcik6IHN0cmluZyB7XG4gIHN3aXRjaCAoc3RhdHVzKSB7XG4gICAgY2FzZSBnbC5GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0FUVEFDSE1FTlQ6XG4gICAgICByZXR1cm4gJ0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfQVRUQUNITUVOVCc7XG4gICAgY2FzZSBnbC5GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01JU1NJTkdfQVRUQUNITUVOVDpcbiAgICAgIHJldHVybiAnRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NSVNTSU5HX0FUVEFDSE1FTlQnO1xuICAgIGNhc2UgZ2wuRlJBTUVCVUZGRVJfSU5DT01QTEVURV9ESU1FTlNJT05TOlxuICAgICAgcmV0dXJuICdGUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJTUVOU0lPTlMnO1xuICAgIGNhc2UgZ2wuRlJBTUVCVUZGRVJfVU5TVVBQT1JURUQ6XG4gICAgICByZXR1cm4gJ0ZSQU1FQlVGRkVSX1VOU1VQUE9SVEVEJztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGB1bmtub3duIGVycm9yICR7c3RhdHVzfWA7XG4gIH1cbn1cblxuZnVuY3Rpb24gdGhyb3dJZk51bGw8VD4oXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgcmV0dXJuVE9yTnVsbDogKCkgPT4gVCB8IG51bGwsXG4gICAgZmFpbHVyZU1lc3NhZ2U6IHN0cmluZyk6IFQge1xuICBjb25zdCB0T3JOdWxsOiBUfG51bGwgPSBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IHJldHVyblRPck51bGwoKSk7XG4gIGlmICh0T3JOdWxsID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZmFpbHVyZU1lc3NhZ2UpO1xuICB9XG4gIHJldHVybiB0T3JOdWxsO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVRleHR1cmVVbml0KGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHRleHR1cmVVbml0OiBudW1iZXIpIHtcbiAgY29uc3QgbWF4VGV4dHVyZVVuaXQgPSBnbC5NQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUUyAtIDE7XG4gIGNvbnN0IGdsVGV4dHVyZVVuaXQgPSB0ZXh0dXJlVW5pdCArIGdsLlRFWFRVUkUwO1xuICBpZiAoZ2xUZXh0dXJlVW5pdCA8IGdsLlRFWFRVUkUwIHx8IGdsVGV4dHVyZVVuaXQgPiBtYXhUZXh0dXJlVW5pdCkge1xuICAgIGNvbnN0IHRleHR1cmVVbml0UmFuZ2UgPSBgW2dsLlRFWFRVUkUwLCBnbC5URVhUVVJFJHttYXhUZXh0dXJlVW5pdH1dYDtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHRleHR1cmVVbml0IG11c3QgYmUgaW4gJHt0ZXh0dXJlVW5pdFJhbmdlfS5gKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QmF0Y2hEaW0oc2hhcGU6IG51bWJlcltdLCBkaW1zVG9Ta2lwID0gMik6IG51bWJlciB7XG4gIHJldHVybiB1dGlsLnNpemVGcm9tU2hhcGUoc2hhcGUuc2xpY2UoMCwgc2hhcGUubGVuZ3RoIC0gZGltc1RvU2tpcCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Um93c0NvbHMoc2hhcGU6IG51bWJlcltdKTogW251bWJlciwgbnVtYmVyXSB7XG4gIGlmIChzaGFwZS5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBFcnJvcignQ2Fubm90IGdldCByb3dzIGFuZCBjb2x1bW5zIG9mIGFuIGVtcHR5IHNoYXBlIGFycmF5LicpO1xuICB9XG5cbiAgcmV0dXJuIFtcbiAgICBzaGFwZS5sZW5ndGggPiAxID8gc2hhcGVbc2hhcGUubGVuZ3RoIC0gMl0gOiAxLCBzaGFwZVtzaGFwZS5sZW5ndGggLSAxXVxuICBdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2hhcGVBczNEKHNoYXBlOiBudW1iZXJbXSk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XG4gIGxldCBzaGFwZUFzM0Q6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IFsxLCAxLCAxXTtcbiAgY29uc3QgaXNTY2FsYXIgPSBzaGFwZS5sZW5ndGggPT09IDAgfHwgKHNoYXBlLmxlbmd0aCA9PT0gMSAmJiBzaGFwZVswXSA9PT0gMSk7XG4gIGlmICghaXNTY2FsYXIpIHtcbiAgICBzaGFwZUFzM0QgPVxuICAgICAgICBbZ2V0QmF0Y2hEaW0oc2hhcGUpLCAuLi5nZXRSb3dzQ29scyhzaGFwZSldIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgfVxuICByZXR1cm4gc2hhcGVBczNEO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGV4dHVyZVNoYXBlRnJvbUxvZ2ljYWxTaGFwZShcbiAgICBsb2dTaGFwZTogbnVtYmVyW10sIGlzUGFja2VkID0gZmFsc2UpOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgbGV0IG1heFRleFNpemUgPSBlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX01BWF9URVhUVVJFX1NJWkUnKTtcbiAgaWYgKGlzUGFja2VkKSB7XG4gICAgbWF4VGV4U2l6ZSA9IG1heFRleFNpemUgKiAyO1xuXG4gICAgLy8gVGhpcyBsb2dpYyBlbnN1cmVzIHdlIGFjY3VyYXRlbHkgY291bnQgdGhlIG51bWJlciBvZiBwYWNrZWQgdGV4ZWxzIG5lZWRlZFxuICAgIC8vIHRvIGFjY29tbW9kYXRlIHRoZSB0ZW5zb3IuIFdlIGNhbiBvbmx5IHBhY2sgdmFsdWVzIGluIHRoZSBzYW1lIHRleGVsIGlmXG4gICAgLy8gdGhleSBhcmUgZnJvbSBhZGphY2VudCBwYWlycyBvZiByb3dzL2NvbHMgd2l0aGluIHRoZSBzYW1lIGJhdGNoLiBTbyBpZiBhXG4gICAgLy8gdGVuc29yIGhhcyAzIHJvd3MsIHdlIHByZXRlbmQgaXQgaGFzIDQgcm93cyBpbiBvcmRlciB0byBhY2NvdW50IGZvciB0aGVcbiAgICAvLyBmYWN0IHRoYXQgdGhlIHRleGVscyBjb250YWluaW5nIHRoZSB0aGlyZCByb3cgYXJlIGhhbGYgZW1wdHkuXG4gICAgbG9nU2hhcGUgPSBsb2dTaGFwZS5tYXAoXG4gICAgICAgIChkLCBpKSA9PiBpID49IGxvZ1NoYXBlLmxlbmd0aCAtIDIgP1xuICAgICAgICAgICAgdXRpbC5uZWFyZXN0TGFyZ2VyRXZlbihsb2dTaGFwZVtpXSkgOlxuICAgICAgICAgICAgbG9nU2hhcGVbaV0pO1xuXG4gICAgLy8gUGFja2VkIHRleHR1cmUgaGVpZ2h0IGlzIGF0IGxlYXN0IDIgKHRoZSBjaGFubmVsIGhlaWdodCBvZiBhIHNpbmdsZVxuICAgIC8vIHRleGVsKS5cbiAgICBpZiAobG9nU2hhcGUubGVuZ3RoID09PSAxKSB7XG4gICAgICBsb2dTaGFwZSA9IFsyLCBsb2dTaGFwZVswXV07XG4gICAgfVxuICB9XG5cbiAgLy8gSWYgbG9naWNhbCBzaGFwZSBpcyAyLCB3ZSBkb24ndCBzcXVlZXplLCBzaW5jZSB3ZSB3YW50IHRvIG1hdGNoIHBoeXNpY2FsLlxuICBpZiAobG9nU2hhcGUubGVuZ3RoICE9PSAyKSB7XG4gICAgY29uc3Qgc3F1ZWV6ZVJlc3VsdCA9IHV0aWwuc3F1ZWV6ZVNoYXBlKGxvZ1NoYXBlKTtcbiAgICBsb2dTaGFwZSA9IHNxdWVlemVSZXN1bHQubmV3U2hhcGU7XG4gIH1cblxuICBsZXQgc2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShsb2dTaGFwZSk7XG4gIGlmIChsb2dTaGFwZS5sZW5ndGggPD0gMSAmJiBzaXplIDw9IG1heFRleFNpemUpIHtcbiAgICByZXR1cm4gWzEsIHNpemVdO1xuICB9IGVsc2UgaWYgKFxuICAgICAgbG9nU2hhcGUubGVuZ3RoID09PSAyICYmIGxvZ1NoYXBlWzBdIDw9IG1heFRleFNpemUgJiZcbiAgICAgIGxvZ1NoYXBlWzFdIDw9IG1heFRleFNpemUpIHtcbiAgICByZXR1cm4gbG9nU2hhcGUgYXMgW251bWJlciwgbnVtYmVyXTtcbiAgfSBlbHNlIGlmIChcbiAgICAgIGxvZ1NoYXBlLmxlbmd0aCA9PT0gMyAmJiBsb2dTaGFwZVswXSAqIGxvZ1NoYXBlWzFdIDw9IG1heFRleFNpemUgJiZcbiAgICAgIGxvZ1NoYXBlWzJdIDw9IG1heFRleFNpemUpIHtcbiAgICByZXR1cm4gW2xvZ1NoYXBlWzBdICogbG9nU2hhcGVbMV0sIGxvZ1NoYXBlWzJdXTtcbiAgfSBlbHNlIGlmIChcbiAgICAgIGxvZ1NoYXBlLmxlbmd0aCA9PT0gMyAmJiBsb2dTaGFwZVswXSA8PSBtYXhUZXhTaXplICYmXG4gICAgICBsb2dTaGFwZVsxXSAqIGxvZ1NoYXBlWzJdIDw9IG1heFRleFNpemUpIHtcbiAgICByZXR1cm4gW2xvZ1NoYXBlWzBdLCBsb2dTaGFwZVsxXSAqIGxvZ1NoYXBlWzJdXTtcbiAgfSBlbHNlIGlmIChcbiAgICAgIGxvZ1NoYXBlLmxlbmd0aCA9PT0gNCAmJlxuICAgICAgbG9nU2hhcGVbMF0gKiBsb2dTaGFwZVsxXSAqIGxvZ1NoYXBlWzJdIDw9IG1heFRleFNpemUgJiZcbiAgICAgIGxvZ1NoYXBlWzNdIDw9IG1heFRleFNpemUpIHtcbiAgICByZXR1cm4gW2xvZ1NoYXBlWzBdICogbG9nU2hhcGVbMV0gKiBsb2dTaGFwZVsyXSwgbG9nU2hhcGVbM11dO1xuICB9IGVsc2UgaWYgKFxuICAgICAgbG9nU2hhcGUubGVuZ3RoID09PSA0ICYmIGxvZ1NoYXBlWzBdIDw9IG1heFRleFNpemUgJiZcbiAgICAgIGxvZ1NoYXBlWzFdICogbG9nU2hhcGVbMl0gKiBsb2dTaGFwZVszXSA8PSBtYXhUZXhTaXplKSB7XG4gICAgcmV0dXJuIFtsb2dTaGFwZVswXSwgbG9nU2hhcGVbMV0gKiBsb2dTaGFwZVsyXSAqIGxvZ1NoYXBlWzNdXTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoaXNQYWNrZWQpIHtcbiAgICAgIC8vIEZvciBwYWNrZWQgdGV4dHVyZXMgc2l6ZSBlcXVhbHMgdGhlIG51bWJlciBvZiBjaGFubmVscyByZXF1aXJlZCB0b1xuICAgICAgLy8gYWNjb21tb2RhdGUgdGhlIHRleHR1cmUgZGF0YS4gSG93ZXZlciBpbiBvcmRlciB0byBzcXVhcmlmeSBzdWNoIHRoYXRcbiAgICAgIC8vIGlubmVyIGRpbWVuc2lvbnMgc3RheSBldmVuLCB3ZSByZXdyaXRlIHNpemUgdG8gZXF1YWwgdGhlIG51bWJlciBvZlxuICAgICAgLy8gdGV4ZWxzLiBUaGVuIGluIHRoZSByZXR1cm4gc3RhdGVtZW50IHdlIHJlaHlkcmF0ZSB0aGUgc3F1YXJpZmllZFxuICAgICAgLy8gZGltZW5zaW9ucyB0byBjaGFubmVsIHVuaXRzLlxuXG4gICAgICBjb25zdCBiYXRjaERpbSA9IGdldEJhdGNoRGltKGxvZ1NoYXBlKTtcbiAgICAgIGxldCByb3dzID0gMiwgY29scyA9IDI7XG4gICAgICBpZiAobG9nU2hhcGUubGVuZ3RoKSB7XG4gICAgICAgIFtyb3dzLCBjb2xzXSA9IGdldFJvd3NDb2xzKGxvZ1NoYXBlKTtcbiAgICAgIH1cbiAgICAgIHNpemUgPSBiYXRjaERpbSAqIChyb3dzIC8gMikgKiAoY29scyAvIDIpO1xuICAgICAgcmV0dXJuIHV0aWwuc2l6ZVRvU3F1YXJpc2hTaGFwZShzaXplKS5tYXAoZCA9PiBkICogMikgYXMgW251bWJlciwgbnVtYmVyXTtcbiAgICB9XG4gICAgcmV0dXJuIHV0aWwuc2l6ZVRvU3F1YXJpc2hTaGFwZShzaXplKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0V2ZW4objogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiBuICUgMiA9PT0gMDtcbn1cblxuLyoqXG4gKiBUaGlzIGRldGVybWluZXMgd2hldGhlciByZXNoYXBpbmcgYSBwYWNrZWQgdGV4dHVyZSByZXF1aXJlcyByZWFycmFuZ2luZ1xuICogdGhlIGRhdGEgd2l0aGluIHRoZSB0ZXh0dXJlLCBhc3N1bWluZyAyeDIgcGFja2luZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVzaGFwZUZyZWUoc2hhcGUxOiBudW1iZXJbXSwgc2hhcGUyOiBudW1iZXJbXSk6IGJvb2xlYW4ge1xuICBzaGFwZTEgPSBzaGFwZTEuc2xpY2UoLTIpO1xuICBzaGFwZTIgPSBzaGFwZTIuc2xpY2UoLTIpO1xuXG4gIGlmICh1dGlsLmFycmF5c0VxdWFsKHNoYXBlMSwgc2hhcGUyKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKCFzaGFwZTEubGVuZ3RoIHx8ICFzaGFwZTIubGVuZ3RoKSB7ICAvLyBPbmUgb2YgdGhlIHNoYXBlcyBpcyBhIHNjYWxhci5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChzaGFwZTFbMF0gPT09IDAgfHwgc2hhcGUxWzFdID09PSAwIHx8IHNoYXBlMlswXSA9PT0gMCB8fFxuICAgICAgc2hhcGUyWzFdID09PSAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoc2hhcGUxLmxlbmd0aCAhPT0gc2hhcGUyLmxlbmd0aCkgeyAgLy8gT25lIG9mIHRoZSBzaGFwZXMgaXMgYSB2ZWN0b3IuXG4gICAgY29uc3Qgc2hhcGUxQ29scyA9IHNoYXBlMS5zbGljZSgtMSlbMF07XG4gICAgY29uc3Qgc2hhcGUyQ29scyA9IHNoYXBlMi5zbGljZSgtMSlbMF07XG4gICAgaWYgKHNoYXBlMUNvbHMgPT09IHNoYXBlMkNvbHMpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChpc0V2ZW4oc2hhcGUxQ29scykgJiYgaXNFdmVuKHNoYXBlMkNvbHMpICYmXG4gICAgICAgIChzaGFwZTFbMF0gPT09IDEgfHwgc2hhcGUyWzBdID09PSAxKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBzaGFwZTFbMV0gPT09IHNoYXBlMlsxXSAmJiBpc0V2ZW4oc2hhcGUxWzBdKSAmJiBpc0V2ZW4oc2hhcGUyWzBdKTtcbn1cblxuLy8gV2UgY2FjaGUgd2ViZ2wgcGFyYW1zIGJlY2F1c2UgdGhlIGVudmlyb25tZW50IGdldHMgcmVzZXQgYmV0d2VlblxuLy8gdW5pdCB0ZXN0cyBhbmQgd2UgZG9uJ3Qgd2FudCB0byBjb25zdGFudGx5IHF1ZXJ5IHRoZSBXZWJHTENvbnRleHQgZm9yXG4vLyBNQVhfVEVYVFVSRV9TSVpFLlxubGV0IE1BWF9URVhUVVJFX1NJWkU6IG51bWJlcjtcbmxldCBNQVhfVEVYVFVSRVNfSU5fU0hBREVSOiBudW1iZXI7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRXZWJHTE1heFRleHR1cmVTaXplKHdlYkdMVmVyc2lvbjogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKE1BWF9URVhUVVJFX1NJWkUgPT0gbnVsbCkge1xuICAgIGNvbnN0IGdsID0gZ2V0V2ViR0xDb250ZXh0KHdlYkdMVmVyc2lvbik7XG4gICAgTUFYX1RFWFRVUkVfU0laRSA9IGdsLmdldFBhcmFtZXRlcihnbC5NQVhfVEVYVFVSRV9TSVpFKTtcbiAgfVxuICByZXR1cm4gTUFYX1RFWFRVUkVfU0laRTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0TWF4VGV4dHVyZVNpemUoKSB7XG4gIE1BWF9URVhUVVJFX1NJWkUgPSBudWxsO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0TWF4VGV4dHVyZXNJblNoYWRlcigpIHtcbiAgTUFYX1RFWFRVUkVTX0lOX1NIQURFUiA9IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNYXhUZXh0dXJlc0luU2hhZGVyKHdlYkdMVmVyc2lvbjogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKE1BWF9URVhUVVJFU19JTl9TSEFERVIgPT0gbnVsbCkge1xuICAgIGNvbnN0IGdsID0gZ2V0V2ViR0xDb250ZXh0KHdlYkdMVmVyc2lvbik7XG4gICAgTUFYX1RFWFRVUkVTX0lOX1NIQURFUiA9IGdsLmdldFBhcmFtZXRlcihnbC5NQVhfVEVYVFVSRV9JTUFHRV9VTklUUyk7XG4gIH1cbiAgLy8gV2UgY2FwIGF0IDE2IHRvIGF2b2lkIHNwdXJpb3VzIHJ1bnRpbWUgXCJtZW1vcnkgZXhoYXVzdGVkXCIgZXJyb3IuXG4gIHJldHVybiBNYXRoLm1pbigxNiwgTUFYX1RFWFRVUkVTX0lOX1NIQURFUik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRXZWJHTERpc2pvaW50UXVlcnlUaW1lclZlcnNpb24od2ViR0xWZXJzaW9uOiBudW1iZXIpOlxuICAgIG51bWJlciB7XG4gIGlmICh3ZWJHTFZlcnNpb24gPT09IDApIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGxldCBxdWVyeVRpbWVyVmVyc2lvbjogbnVtYmVyO1xuICBjb25zdCBnbCA9IGdldFdlYkdMQ29udGV4dCh3ZWJHTFZlcnNpb24pO1xuXG4gIGlmIChoYXNFeHRlbnNpb24oZ2wsICdFWFRfZGlzam9pbnRfdGltZXJfcXVlcnlfd2ViZ2wyJykgJiZcbiAgICAgIHdlYkdMVmVyc2lvbiA9PT0gMikge1xuICAgIHF1ZXJ5VGltZXJWZXJzaW9uID0gMjtcbiAgfSBlbHNlIGlmIChoYXNFeHRlbnNpb24oZ2wsICdFWFRfZGlzam9pbnRfdGltZXJfcXVlcnknKSkge1xuICAgIHF1ZXJ5VGltZXJWZXJzaW9uID0gMTtcbiAgfSBlbHNlIHtcbiAgICBxdWVyeVRpbWVyVmVyc2lvbiA9IDA7XG4gIH1cbiAgcmV0dXJuIHF1ZXJ5VGltZXJWZXJzaW9uO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzRXh0ZW5zaW9uKGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIGV4dGVuc2lvbk5hbWU6IHN0cmluZykge1xuICBjb25zdCBleHQgPSBnbC5nZXRFeHRlbnNpb24oZXh0ZW5zaW9uTmFtZSk7XG4gIHJldHVybiBleHQgIT0gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzV2ViR0xWZXJzaW9uRW5hYmxlZCh3ZWJHTFZlcnNpb246IDF8Mikge1xuICB0cnkge1xuICAgIGNvbnN0IGdsID0gZ2V0V2ViR0xDb250ZXh0KHdlYkdMVmVyc2lvbik7XG4gICAgaWYgKGdsICE9IG51bGwpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUubG9nKCdFcnJvciB3aGVuIGdldHRpbmcgV2ViR0wgY29udGV4dDogJywgZSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ2FwYWJsZU9mUmVuZGVyaW5nVG9GbG9hdFRleHR1cmUod2ViR0xWZXJzaW9uOiBudW1iZXIpOlxuICAgIGJvb2xlYW4ge1xuICBpZiAod2ViR0xWZXJzaW9uID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgZ2wgPSBnZXRXZWJHTENvbnRleHQod2ViR0xWZXJzaW9uKTtcblxuICBpZiAod2ViR0xWZXJzaW9uID09PSAxKSB7XG4gICAgaWYgKCFoYXNFeHRlbnNpb24oZ2wsICdPRVNfdGV4dHVyZV9mbG9hdCcpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICghaGFzRXh0ZW5zaW9uKGdsLCAnRVhUX2NvbG9yX2J1ZmZlcl9mbG9hdCcpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgaXNGcmFtZUJ1ZmZlckNvbXBsZXRlID0gY3JlYXRlRmxvYXRUZXh0dXJlQW5kQmluZFRvRnJhbWVidWZmZXIoZ2wpO1xuICByZXR1cm4gaXNGcmFtZUJ1ZmZlckNvbXBsZXRlO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHdlIGNhbiBkb3dubG9hZCB2YWx1ZXMgZnJvbSBhIGZsb2F0L2hhbGYtZmxvYXQgdGV4dHVyZS5cbiAqXG4gKiBOb3RlIHRoYXQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgd2UgdXNlIGJpbmRpbmcgYSB0ZXh0dXJlIHRvIGEgZnJhbWVidWZmZXJcbiAqIGFzIGEgcHJveHkgZm9yIGFiaWxpdHkgdG8gZG93bmxvYWQgZmxvYXQgdmFsdWVzIGxhdGVyIHVzaW5nIHJlYWRQaXhlbHMuIFRoZVxuICogdGV4dHVyZSBwYXJhbXMgb2YgdGhpcyB0ZXh0dXJlIHdpbGwgbm90IG1hdGNoIHRob3NlIGluIHJlYWRQaXhlbHMgZXhhY3RseVxuICogYnV0IGlmIHdlIGFyZSB1bmFibGUgdG8gYmluZCBzb21lIGtpbmQgb2YgZmxvYXQgdGV4dHVyZSB0byB0aGUgZnJhbWVCdWZmZXJcbiAqIHRoZW4gd2UgZGVmaW5pdGVseSB3aWxsIG5vdCBiZSBhYmxlIHRvIHJlYWQgZmxvYXQgdmFsdWVzIGZyb20gaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Rvd25sb2FkRmxvYXRUZXh0dXJlRW5hYmxlZCh3ZWJHTFZlcnNpb246IG51bWJlcik6IGJvb2xlYW4ge1xuICBpZiAod2ViR0xWZXJzaW9uID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgZ2wgPSBnZXRXZWJHTENvbnRleHQod2ViR0xWZXJzaW9uKTtcblxuICBpZiAod2ViR0xWZXJzaW9uID09PSAxKSB7XG4gICAgaWYgKCFoYXNFeHRlbnNpb24oZ2wsICdPRVNfdGV4dHVyZV9mbG9hdCcpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghaGFzRXh0ZW5zaW9uKGdsLCAnV0VCR0xfY29sb3JfYnVmZmVyX2Zsb2F0JykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGhhc0V4dGVuc2lvbihnbCwgJ0VYVF9jb2xvcl9idWZmZXJfZmxvYXQnKSkge1xuICAgICAgcmV0dXJuIGNyZWF0ZUZsb2F0VGV4dHVyZUFuZEJpbmRUb0ZyYW1lYnVmZmVyKGdsKTtcbiAgICB9XG5cbiAgICBjb25zdCBDT0xPUl9CVUZGRVJfSEFMRl9GTE9BVCA9ICdFWFRfY29sb3JfYnVmZmVyX2hhbGZfZmxvYXQnO1xuICAgIGlmIChoYXNFeHRlbnNpb24oZ2wsIENPTE9SX0JVRkZFUl9IQUxGX0ZMT0FUKSkge1xuICAgICAgY29uc3QgdGV4dHVyZUhhbGZGbG9hdEV4dGVuc2lvbiA9XG4gICAgICAgICAgZ2wuZ2V0RXh0ZW5zaW9uKENPTE9SX0JVRkZFUl9IQUxGX0ZMT0FUKTtcbiAgICAgIHJldHVybiBjcmVhdGVIYWxmRmxvYXRUZXh0dXJlQW5kQmluZFRvRnJhbWVidWZmZXIoXG4gICAgICAgICAgZ2wsIHRleHR1cmVIYWxmRmxvYXRFeHRlbnNpb24pO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGlzRnJhbWVCdWZmZXJDb21wbGV0ZSA9IGNyZWF0ZUZsb2F0VGV4dHVyZUFuZEJpbmRUb0ZyYW1lYnVmZmVyKGdsKTtcbiAgcmV0dXJuIGlzRnJhbWVCdWZmZXJDb21wbGV0ZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRmxvYXRUZXh0dXJlQW5kQmluZFRvRnJhbWVidWZmZXIoZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCk6XG4gICAgYm9vbGVhbiB7XG4gIGNvbnN0IHRleENvbmZpZyA9IGdldFRleHR1cmVDb25maWcoZ2wpO1xuXG4gIGNvbnN0IHRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7XG4gIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRleHR1cmUpO1xuXG4gIGNvbnN0IHdpZHRoID0gMTtcbiAgY29uc3QgaGVpZ2h0ID0gMTtcbiAgZ2wudGV4SW1hZ2UyRChcbiAgICAgIGdsLlRFWFRVUkVfMkQsIDAsIHRleENvbmZpZy5pbnRlcm5hbEZvcm1hdEZsb2F0LCB3aWR0aCwgaGVpZ2h0LCAwLFxuICAgICAgdGV4Q29uZmlnLnRleHR1cmVGb3JtYXRGbG9hdCwgdGV4Q29uZmlnLnRleHR1cmVUeXBlRmxvYXQsIG51bGwpO1xuXG4gIGNvbnN0IGZyYW1lQnVmZmVyID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTtcbiAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBmcmFtZUJ1ZmZlcik7XG4gIGdsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKFxuICAgICAgZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCB0ZXh0dXJlLCAwKTtcblxuICBjb25zdCBpc0ZyYW1lQnVmZmVyQ29tcGxldGUgPVxuICAgICAgZ2wuY2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyhnbC5GUkFNRUJVRkZFUikgPT09IGdsLkZSQU1FQlVGRkVSX0NPTVBMRVRFO1xuXG4gIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIG51bGwpO1xuICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIG51bGwpO1xuICBnbC5kZWxldGVUZXh0dXJlKHRleHR1cmUpO1xuICBnbC5kZWxldGVGcmFtZWJ1ZmZlcihmcmFtZUJ1ZmZlcik7XG5cbiAgcmV0dXJuIGlzRnJhbWVCdWZmZXJDb21wbGV0ZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlSGFsZkZsb2F0VGV4dHVyZUFuZEJpbmRUb0ZyYW1lYnVmZmVyKFxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCB0ZXh0dXJlSGFsZkZsb2F0RXh0ZW5zaW9uOiBhbnkpOiBib29sZWFuIHtcbiAgY29uc3QgdGV4Q29uZmlnID0gZ2V0VGV4dHVyZUNvbmZpZyhnbCwgdGV4dHVyZUhhbGZGbG9hdEV4dGVuc2lvbik7XG4gIGNvbnN0IHRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7XG4gIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRleHR1cmUpO1xuXG4gIGNvbnN0IHdpZHRoID0gMTtcbiAgY29uc3QgaGVpZ2h0ID0gMTtcbiAgZ2wudGV4SW1hZ2UyRChcbiAgICAgIGdsLlRFWFRVUkVfMkQsIDAsIHRleENvbmZpZy5pbnRlcm5hbEZvcm1hdEhhbGZGbG9hdCwgd2lkdGgsIGhlaWdodCwgMCxcbiAgICAgIHRleENvbmZpZy50ZXh0dXJlRm9ybWF0RmxvYXQsIHRleENvbmZpZy50ZXh0dXJlVHlwZUhhbGZGbG9hdCwgbnVsbCk7XG5cbiAgY29uc3QgZnJhbWVCdWZmZXIgPSBnbC5jcmVhdGVGcmFtZWJ1ZmZlcigpO1xuICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyKTtcbiAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoXG4gICAgICBnbC5GUkFNRUJVRkZFUiwgZ2wuQ09MT1JfQVRUQUNITUVOVDAsIGdsLlRFWFRVUkVfMkQsIHRleHR1cmUsIDApO1xuXG4gIGNvbnN0IGlzRnJhbWVCdWZmZXJDb21wbGV0ZSA9XG4gICAgICBnbC5jaGVja0ZyYW1lYnVmZmVyU3RhdHVzKGdsLkZSQU1FQlVGRkVSKSA9PT0gZ2wuRlJBTUVCVUZGRVJfQ09NUExFVEU7XG5cbiAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgbnVsbCk7XG4gIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgbnVsbCk7XG4gIGdsLmRlbGV0ZVRleHR1cmUodGV4dHVyZSk7XG4gIGdsLmRlbGV0ZUZyYW1lYnVmZmVyKGZyYW1lQnVmZmVyKTtcblxuICByZXR1cm4gaXNGcmFtZUJ1ZmZlckNvbXBsZXRlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNXZWJHTEZlbmNlRW5hYmxlZCh3ZWJHTFZlcnNpb246IG51bWJlcikge1xuICBpZiAod2ViR0xWZXJzaW9uICE9PSAyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGdsID0gZ2V0V2ViR0xDb250ZXh0KHdlYkdMVmVyc2lvbik7XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICBjb25zdCBpc0VuYWJsZWQgPSAoZ2wgYXMgYW55KS5mZW5jZVN5bmMgIT0gbnVsbDtcbiAgcmV0dXJuIGlzRW5hYmxlZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE5vdENvbXBsZXgoXG4gICAgdGVuc29yOiBUZW5zb3JJbmZvfFRlbnNvckluZm9bXSwgb3BOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHRlbnNvcikpIHtcbiAgICB0ZW5zb3IgPSBbdGVuc29yXTtcbiAgfVxuICB0ZW5zb3IuZm9yRWFjaCh0ID0+IHtcbiAgICBpZiAodCAhPSBudWxsKSB7XG4gICAgICB1dGlsLmFzc2VydChcbiAgICAgICAgICB0LmR0eXBlICE9PSAnY29tcGxleDY0JyxcbiAgICAgICAgICAoKSA9PiBgJHtvcE5hbWV9IGRvZXMgbm90IHN1cHBvcnQgY29tcGxleDY0IHRlbnNvcnMgYCArXG4gICAgICAgICAgICAgICdpbiB0aGUgV2ViR0wgYmFja2VuZC4nKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBidWZmZXIsIERhdGFTdG9yYWdlLCBlbmdpbmUsIGVudiwga2VybmVsX2ltcGxzLCBLZXJuZWxCYWNrZW5kLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmNvbnN0IHdoZXJlSW1wbCA9IGtlcm5lbF9pbXBscy53aGVyZUltcGw7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi9jcHVfdXRpbCc7XG5leHBvcnQgY2xhc3MgTWF0aEJhY2tlbmRDUFUgZXh0ZW5kcyBLZXJuZWxCYWNrZW5kIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5ibG9ja1NpemUgPSA0ODtcbiAgICAgICAgdGhpcy5maXJzdFVzZSA9IHRydWU7XG4gICAgICAgIHRoaXMuZGF0YSA9IG5ldyBEYXRhU3RvcmFnZSh0aGlzLCBlbmdpbmUoKSk7XG4gICAgfVxuICAgIG5leHREYXRhSWQoKSB7XG4gICAgICAgIHJldHVybiBNYXRoQmFja2VuZENQVS5uZXh0RGF0YUlkKys7XG4gICAgfVxuICAgIHdyaXRlKHZhbHVlcywgc2hhcGUsIGR0eXBlKSB7XG4gICAgICAgIGlmICh0aGlzLmZpcnN0VXNlKSB7XG4gICAgICAgICAgICB0aGlzLmZpcnN0VXNlID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoZW52KCkuZ2V0KCdJU19OT0RFJykpIHtcbiAgICAgICAgICAgICAgICBiYWNrZW5kX3V0aWwud2FybignXFxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxcbicgK1xuICAgICAgICAgICAgICAgICAgICAnSGkgdGhlcmUg8J+Riy4gTG9va3MgbGlrZSB5b3UgYXJlIHJ1bm5pbmcgVGVuc29yRmxvdy5qcyBpbiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ05vZGUuanMuIFRvIHNwZWVkIHRoaW5ncyB1cCBkcmFtYXRpY2FsbHksIGluc3RhbGwgb3VyIG5vZGUgJyArXG4gICAgICAgICAgICAgICAgICAgICdiYWNrZW5kLCB3aGljaCBiaW5kcyB0byBUZW5zb3JGbG93IEMrKywgYnkgcnVubmluZyAnICtcbiAgICAgICAgICAgICAgICAgICAgJ25wbSBpIEB0ZW5zb3JmbG93L3RmanMtbm9kZSwgJyArXG4gICAgICAgICAgICAgICAgICAgICdvciBucG0gaSBAdGVuc29yZmxvdy90ZmpzLW5vZGUtZ3B1IGlmIHlvdSBoYXZlIENVREEuICcgK1xuICAgICAgICAgICAgICAgICAgICAnVGhlbiBjYWxsIHJlcXVpcmUoXFwnQHRlbnNvcmZsb3cvdGZqcy1ub2RlXFwnKTsgKC1ncHUgJyArXG4gICAgICAgICAgICAgICAgICAgICdzdWZmaXggZm9yIENVREEpIGF0IHRoZSBzdGFydCBvZiB5b3VyIHByb2dyYW0uICcgK1xuICAgICAgICAgICAgICAgICAgICAnVmlzaXQgaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGZqcy1ub2RlIGZvciBtb3JlIGRldGFpbHMuJyArXG4gICAgICAgICAgICAgICAgICAgICdcXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YUlkID0geyBpZDogdGhpcy5uZXh0RGF0YUlkKCkgfTtcbiAgICAgICAgdGhpcy5kYXRhLnNldChkYXRhSWQsIHsgdmFsdWVzLCBkdHlwZSwgcmVmQ291bnQ6IDEgfSk7XG4gICAgICAgIHJldHVybiBkYXRhSWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIGRhdGEgYnVja2V0IGluIGNwdSBiYWNrZW5kLlxuICAgICAqIEBwYXJhbSBzaGFwZSBTaGFwZSBvZiB0aGUgYFRlbnNvckluZm9gLlxuICAgICAqIEBwYXJhbSBkdHlwZSBEVHlwZSBvZiB0aGUgYFRlbnNvckluZm9gLlxuICAgICAqIEBwYXJhbSB2YWx1ZXMgVGhlIHZhbHVlIG9mIHRoZSBgVGVuc29ySW5mb2Agc3RvcmVkIGFzIGEgZmxhdHRlbmVkIGFycmF5LlxuICAgICAqL1xuICAgIG1ha2VUZW5zb3JJbmZvKHNoYXBlLCBkdHlwZSwgdmFsdWVzKSB7XG4gICAgICAgIGxldCBvdXRJZDtcbiAgICAgICAgaWYgKGR0eXBlID09PSAnc3RyaW5nJyAmJiB2YWx1ZXMgIT0gbnVsbCAmJiB2YWx1ZXMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgdXRpbC5pc1N0cmluZyh2YWx1ZXNbMF0pKSB7XG4gICAgICAgICAgICBjb25zdCBlbmNvZGVkVmFsdWVzID0gdmFsdWVzLm1hcChkID0+IHV0aWwuZW5jb2RlU3RyaW5nKGQpKTtcbiAgICAgICAgICAgIG91dElkID0gdGhpcy53cml0ZShlbmNvZGVkVmFsdWVzLCBzaGFwZSwgZHR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb3V0SWQgPSB0aGlzLndyaXRlKHZhbHVlcywgc2hhcGUsIGR0eXBlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBkYXRhSWQ6IG91dElkLCBzaGFwZSwgZHR5cGUgfTtcbiAgICB9XG4gICAgLyoqIFJldHVybiByZWZDb3VudCBvZiBhIGBUZW5zb3JEYXRhYC4gKi9cbiAgICByZWZDb3VudChkYXRhSWQpIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YS5oYXMoZGF0YUlkKSkge1xuICAgICAgICAgICAgY29uc3QgdGVuc29yRGF0YSA9IHRoaXMuZGF0YS5nZXQoZGF0YUlkKTtcbiAgICAgICAgICAgIHJldHVybiB0ZW5zb3JEYXRhLnJlZkNvdW50O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICAvKiogSW5jcmVhc2UgcmVmQ291bnQgb2YgYSBgVGVuc29yRGF0YWAuICovXG4gICAgaW5jUmVmKGRhdGFJZCkge1xuICAgICAgICBjb25zdCB0ZW5zb3JEYXRhID0gdGhpcy5kYXRhLmdldChkYXRhSWQpO1xuICAgICAgICB0ZW5zb3JEYXRhLnJlZkNvdW50Kys7XG4gICAgfVxuICAgIC8qKiBEZWNyZWFzZSByZWZDb3VudCBvZiBhIGBUZW5zb3JEYXRhYC4gKi9cbiAgICBkZWNSZWYoZGF0YUlkKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGEuaGFzKGRhdGFJZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHRlbnNvckRhdGEgPSB0aGlzLmRhdGEuZ2V0KGRhdGFJZCk7XG4gICAgICAgICAgICB0ZW5zb3JEYXRhLnJlZkNvdW50LS07XG4gICAgICAgIH1cbiAgICB9XG4gICAgbW92ZShkYXRhSWQsIHZhbHVlcywgc2hhcGUsIGR0eXBlLCByZWZDb3VudCkge1xuICAgICAgICB0aGlzLmRhdGEuc2V0KGRhdGFJZCwgeyB2YWx1ZXMsIGR0eXBlLCByZWZDb3VudCB9KTtcbiAgICB9XG4gICAgbnVtRGF0YUlkcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5udW1EYXRhSWRzKCk7XG4gICAgfVxuICAgIGFzeW5jIHJlYWQoZGF0YUlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRTeW5jKGRhdGFJZCk7XG4gICAgfVxuICAgIHJlYWRTeW5jKGRhdGFJZCkge1xuICAgICAgICBjb25zdCB7IGR0eXBlLCBjb21wbGV4VGVuc29ySW5mb3MgfSA9IHRoaXMuZGF0YS5nZXQoZGF0YUlkKTtcbiAgICAgICAgaWYgKGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICAgICAgY29uc3QgcmVhbFZhbHVlcyA9IHRoaXMucmVhZFN5bmMoY29tcGxleFRlbnNvckluZm9zLnJlYWwuZGF0YUlkKTtcbiAgICAgICAgICAgIGNvbnN0IGltYWdWYWx1ZXMgPSB0aGlzLnJlYWRTeW5jKGNvbXBsZXhUZW5zb3JJbmZvcy5pbWFnLmRhdGFJZCk7XG4gICAgICAgICAgICByZXR1cm4gYmFja2VuZF91dGlsLm1lcmdlUmVhbEFuZEltYWdBcnJheXMocmVhbFZhbHVlcywgaW1hZ1ZhbHVlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5nZXQoZGF0YUlkKS52YWx1ZXM7XG4gICAgfVxuICAgIGJ1ZmZlclN5bmModCkge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5yZWFkU3luYyh0LmRhdGFJZCk7XG4gICAgICAgIGxldCBkZWNvZGVkRGF0YSA9IGRhdGE7XG4gICAgICAgIGlmICh0LmR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAvLyBEZWNvZGUgdGhlIGJ5dGVzIGludG8gc3RyaW5nLlxuICAgICAgICAgICAgICAgIGRlY29kZWREYXRhID0gZGF0YS5tYXAoZCA9PiB1dGlsLmRlY29kZVN0cmluZyhkKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoX2EpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBkZWNvZGUgZW5jb2RlZCBzdHJpbmcgYnl0ZXMgaW50byB1dGYtOCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWZmZXIodC5zaGFwZSwgdC5kdHlwZSwgZGVjb2RlZERhdGEpO1xuICAgIH1cbiAgICBtYWtlT3V0cHV0KHZhbHVlcywgc2hhcGUsIGR0eXBlKSB7XG4gICAgICAgIGNvbnN0IGRhdGFJZCA9IHRoaXMud3JpdGUodmFsdWVzLCBzaGFwZSwgZHR5cGUpO1xuICAgICAgICByZXR1cm4gZW5naW5lKCkubWFrZVRlbnNvckZyb21EYXRhSWQoZGF0YUlkLCBzaGFwZSwgZHR5cGUsIHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEaXNwb3NlIHRoZSBtZW1vcnkgaWYgdGhlIGRhdGFJZCBoYXMgMCByZWZDb3VudC4gUmV0dXJuIHRydWUgaWYgdGhlIG1lbW9yeVxuICAgICAqIGlzIHJlbGVhc2VkIG9yIG1lbW9yeSBpcyBub3QgbWFuYWdlZCBpbiB0aGlzIGJhY2tlbmQsIGZhbHNlIGlmIG1lbW9yeSBpc1xuICAgICAqIG5vdCBjbGVhcmVkLlxuICAgICAqIEBwYXJhbSBkYXRhSWRcbiAgICAgKiBAb2FyYW0gZm9yY2UgT3B0aW9uYWwsIHJlbW92ZSB0aGUgZGF0YSByZWdhcmRsZXNzIG9mIHJlZkNvdW50XG4gICAgICovXG4gICAgZGlzcG9zZURhdGEoZGF0YUlkLCBmb3JjZSA9IGZhbHNlKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGEuaGFzKGRhdGFJZCkpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YS5nZXQoZGF0YUlkKS5yZWZDb3VudC0tO1xuICAgICAgICAgICAgaWYgKCFmb3JjZSAmJiB0aGlzLmRhdGEuZ2V0KGRhdGFJZCkucmVmQ291bnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBjb21wbGV4VGVuc29ySW5mb3MgfSA9IHRoaXMuZGF0YS5nZXQoZGF0YUlkKTtcbiAgICAgICAgICAgIGlmIChjb21wbGV4VGVuc29ySW5mb3MgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzcG9zZURhdGEoY29tcGxleFRlbnNvckluZm9zLnJlYWwuZGF0YUlkLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3Bvc2VEYXRhKGNvbXBsZXhUZW5zb3JJbmZvcy5pbWFnLmRhdGFJZCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRhdGEuZGVsZXRlKGRhdGFJZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHRlbnNvckluZm8pIHtcbiAgICAgICAgdGhpcy5kaXNwb3NlRGF0YSh0ZW5zb3JJbmZvLmRhdGFJZCk7XG4gICAgfVxuICAgIGFzeW5jIHRpbWUoZikge1xuICAgICAgICBjb25zdCBzdGFydCA9IHV0aWwubm93KCk7XG4gICAgICAgIGYoKTtcbiAgICAgICAgY29uc3Qga2VybmVsTXMgPSB1dGlsLm5vdygpIC0gc3RhcnQ7XG4gICAgICAgIHJldHVybiB7IGtlcm5lbE1zIH07XG4gICAgfVxuICAgIG1lbW9yeSgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC8vIFVucmVsaWFibGUgZHVlIHRvIGF1dG9tYXRpYyBnYy4gVGhlIG51bWJlcnMgYWJvdmUgYXJlIGN1bXVsYXRpdmUuXG4gICAgICAgICAgICB1bnJlbGlhYmxlOiB0cnVlLFxuICAgICAgICAgICAgcmVhc29uczogWydUaGUgcmVwb3J0ZWQgbWVtb3J5IGlzIGFuIHVwcGVyIGJvdW5kLiBEdWUgdG8gYXV0b21hdGljIGdhcmJhZ2UgJyArXG4gICAgICAgICAgICAgICAgICAgICdjb2xsZWN0aW9uLCB0aGUgdHJ1ZSBhbGxvY2F0ZWQgbWVtb3J5IG1heSBiZSBsZXNzLiddXG4gICAgICAgIH07XG4gICAgfVxuICAgIHdoZXJlKGNvbmRpdGlvbikge1xuICAgICAgICBhc3NlcnROb3RDb21wbGV4KFtjb25kaXRpb25dLCAnd2hlcmUnKTtcbiAgICAgICAgY29uc3QgY29uZFZhbHMgPSB0aGlzLnJlYWRTeW5jKGNvbmRpdGlvbi5kYXRhSWQpO1xuICAgICAgICByZXR1cm4gd2hlcmVJbXBsKGNvbmRpdGlvbi5zaGFwZSwgY29uZFZhbHMpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkgeyB9XG4gICAgZmxvYXRQcmVjaXNpb24oKSB7XG4gICAgICAgIHJldHVybiAzMjtcbiAgICB9XG4gICAgLyoqIFJldHVybnMgdGhlIHNtYWxsZXN0IHJlcHJlc2VudGFibGUgbnVtYmVyLiAgKi9cbiAgICBlcHNpbG9uKCkge1xuICAgICAgICByZXR1cm4gc3VwZXIuZXBzaWxvbigpO1xuICAgIH1cbn1cbk1hdGhCYWNrZW5kQ1BVLm5leHREYXRhSWQgPSAwO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmFja2VuZF9jcHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLypcbiAqIGJhc2UudHMgY29udGFpbnMgYWxsIHRoZSBleHBvcnRzIGZyb20gdGZqcy1iYWNrZW5kLWNwdVxuICogd2l0aG91dCBhdXRvLWtlcm5lbCByZWdpc3RyYXRpb25cbiAqL1xuaW1wb3J0IHsgcmVnaXN0ZXJCYWNrZW5kIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IE1hdGhCYWNrZW5kQ1BVIH0gZnJvbSAnLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQgKiBhcyBzaGFyZWQgZnJvbSAnLi9zaGFyZWQnO1xuZXhwb3J0IHsgTWF0aEJhY2tlbmRDUFUgfSBmcm9tICcuL2JhY2tlbmRfY3B1JztcbmV4cG9ydCB7IHZlcnNpb24gYXMgdmVyc2lvbl9jcHUgfSBmcm9tICcuL3ZlcnNpb24nO1xuZXhwb3J0IHsgc2hhcmVkIH07XG4vLyBTaWRlIGVmZmVjdHMgZm9yIGRlZmF1bHQgaW5pdGlhbGl6YXRpb24gb2YgTWF0aEJhY2tlbmRDUFVcbnJlZ2lzdGVyQmFja2VuZCgnY3B1JywgKCkgPT4gbmV3IE1hdGhCYWNrZW5kQ1BVKCksIDEgLyogcHJpb3JpdHkgKi8pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmFzZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnROb3RDb21wbGV4KHRlbnNvciwgb3BOYW1lKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRlbnNvcikpIHtcbiAgICAgICAgdGVuc29yID0gW3RlbnNvcl07XG4gICAgfVxuICAgIHRlbnNvci5mb3JFYWNoKHQgPT4ge1xuICAgICAgICBpZiAodCAhPSBudWxsKSB7XG4gICAgICAgICAgICB1dGlsLmFzc2VydCh0LmR0eXBlICE9PSAnY29tcGxleDY0JywgKCkgPT4gYCR7b3BOYW1lfSBkb2VzIG5vdCBzdXBwb3J0IGNvbXBsZXg2NCB0ZW5zb3JzIGluIHRoZSBDUFUgYmFja2VuZC5gKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y3B1X3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLy8gQWxsIGV4cG9ydHMgZnJvbSB0aGlzIHBhY2thZ2Ugc2hvdWxkIGJlIGluIGJhc2UuXG5leHBvcnQgKiBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0ICcuL3JlZ2lzdGVyX2FsbF9rZXJuZWxzJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBYnMsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBzaW1wbGVBYnNJbXBsKHZhbHMpIHtcbiAgICBjb25zdCByZXN1bHRWYWx1ZXMgPSBuZXcgRmxvYXQzMkFycmF5KHZhbHMubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgcmVzdWx0VmFsdWVzW2ldID0gTWF0aC5hYnModmFsc1tpXSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRWYWx1ZXM7XG59XG5leHBvcnQgY29uc3QgYWJzID0gKGFyZ3MpID0+IHtcbiAgICBjb25zdCB7IHggfSA9IGFyZ3MuaW5wdXRzO1xuICAgIGNvbnN0IGNwdUJhY2tlbmQgPSBhcmdzLmJhY2tlbmQ7XG4gICAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnYWJzJyk7XG4gICAgbGV0IHJlc3VsdFZhbHVlcyA9IG5ldyBGbG9hdDMyQXJyYXkodXRpbC5zaXplRnJvbVNoYXBlKHguc2hhcGUpKTtcbiAgICBjb25zdCB2YWx1ZXMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgcmVzdWx0VmFsdWVzID0gc2ltcGxlQWJzSW1wbCh2YWx1ZXMpO1xuICAgIHJldHVybiBjcHVCYWNrZW5kLm1ha2VPdXRwdXQocmVzdWx0VmFsdWVzLCB4LnNoYXBlLCAnZmxvYXQzMicpO1xufTtcbmV4cG9ydCBjb25zdCBhYnNDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQWJzLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBhYnMsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QWJzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBY29zIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBhY29zID0gdW5hcnlLZXJuZWxGdW5jKEFjb3MsICh4aSkgPT4gTWF0aC5hY29zKHhpKSk7XG5leHBvcnQgY29uc3QgYWNvc0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBBY29zLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBhY29zLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFjb3MuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEFjb3NoIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBhY29zaCA9IHVuYXJ5S2VybmVsRnVuYyhBY29zaCwgKHhpKSA9PiBNYXRoLmFjb3NoKHhpKSk7XG5leHBvcnQgY29uc3QgYWNvc2hDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQWNvc2gsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGFjb3NoLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFjb3NoLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEFkZCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X2ltcGwnO1xuaW1wb3J0IHsgYmluYXJ5S2VybmVsRnVuYywgY3JlYXRlQ29tcGxleEJpbmFyeUtlcm5lbEltcGwgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IGFkZEltcGwgPSBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsKCgoYSwgYikgPT4gYSArIGIpKTtcbmV4cG9ydCBjb25zdCBhZGRDb21wbGV4SW1wbCA9IGNyZWF0ZUNvbXBsZXhCaW5hcnlLZXJuZWxJbXBsKCgoYVJlYWwsIGFJbWFnLCBiUmVhbCwgYkltYWcpID0+IHtcbiAgICByZXR1cm4geyByZWFsOiBhUmVhbCArIGJSZWFsLCBpbWFnOiBhSW1hZyArIGJJbWFnIH07XG59KSk7XG5leHBvcnQgY29uc3QgYWRkID0gYmluYXJ5S2VybmVsRnVuYyhBZGQsIGFkZEltcGwsIGFkZENvbXBsZXhJbXBsKTtcbmV4cG9ydCBjb25zdCBhZGRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQWRkLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBhZGRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BZGQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQWRkTiwgYnVmZmVyIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5leHBvcnQgZnVuY3Rpb24gYWRkTihhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgdGVuc29ycyA9IGlucHV0cztcbiAgICBhc3NlcnROb3RDb21wbGV4KGlucHV0cywgJ2FkZE4nKTtcbiAgICBjb25zdCB2YWxzID0gdGVuc29ycy5tYXAodCA9PiBiYWNrZW5kLmRhdGEuZ2V0KHQuZGF0YUlkKS52YWx1ZXMpO1xuICAgIGNvbnN0IG91dEJ1ZiA9IGJ1ZmZlcih0ZW5zb3JzWzBdLnNoYXBlLCB0ZW5zb3JzWzBdLmR0eXBlKTtcbiAgICBjb25zdCBvdXRWYWxzID0gb3V0QnVmLnZhbHVlcztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRlbnNvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY3VyclZhbHMgPSB2YWxzW2ldO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG91dFZhbHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIG91dFZhbHNbal0gKz0gY3VyclZhbHNbal07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0QnVmLnNoYXBlLCBvdXRCdWYuZHR5cGUsIG91dEJ1Zi52YWx1ZXMpO1xufVxuZXhwb3J0IGNvbnN0IGFkZE5Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQWRkTixcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogYWRkTlxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFkZE4uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQWxsLCBiYWNrZW5kX3V0aWwsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHsgdHJhbnNwb3NlIH0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuZXhwb3J0IGZ1bmN0aW9uIGFsbChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYXhpcywga2VlcERpbXMgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ2FsbCcpO1xuICAgIGNvbnN0IG9yaWdBeGVzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShheGlzLCB4LnNoYXBlKTtcbiAgICBsZXQgYXhlcyA9IG9yaWdBeGVzO1xuICAgIGNvbnN0IHBlcm11dGVkQXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oYXhlcywgeC5zaGFwZS5sZW5ndGgpO1xuICAgIGxldCAkeCA9IHg7XG4gICAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgICAgICR4ID0gdHJhbnNwb3NlKHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCwgYXR0cnM6IHsgcGVybTogcGVybXV0ZWRBeGVzIH0gfSk7XG4gICAgICAgIGF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0SW5uZXJNb3N0QXhlcyhheGVzLmxlbmd0aCwgeC5zaGFwZS5sZW5ndGgpO1xuICAgIH1cbiAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoJ2FsbCcsIGF4ZXMsICR4LnNoYXBlLmxlbmd0aCk7XG4gICAgY29uc3QgW291dFNoYXBlLCByZWR1Y2VTaGFwZV0gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcygkeC5zaGFwZSwgYXhlcyk7XG4gICAgY29uc3QgcmVkdWNlU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShyZWR1Y2VTaGFwZSk7XG4gICAgY29uc3QgdmFscyA9IHV0aWwubWFrZVplcm9zVHlwZWRBcnJheSh1dGlsLnNpemVGcm9tU2hhcGUob3V0U2hhcGUpLCAkeC5kdHlwZSk7XG4gICAgY29uc3QgYVZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KCR4LmRhdGFJZCkudmFsdWVzO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBpICogcmVkdWNlU2l6ZTtcbiAgICAgICAgbGV0IGFsbCA9IGFWYWxzW29mZnNldF07XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmVkdWNlU2l6ZTsgKytqKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGFWYWxzW29mZnNldCArIGpdO1xuICAgICAgICAgICAgYWxsID0gYWxsICYmIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHZhbHNbaV0gPSBhbGw7XG4gICAgfVxuICAgIGlmIChwZXJtdXRlZEF4ZXMgIT0gbnVsbCkge1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKCR4KTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRTaGFwZSwgJHguZHR5cGUsIHZhbHMpO1xuICAgIGlmIChrZWVwRGltcykge1xuICAgICAgICBjb25zdCBleHBhbmRlZFNoYXBlID0gYmFja2VuZF91dGlsLmV4cGFuZFNoYXBlVG9LZWVwRGltKG91dFNoYXBlLCBvcmlnQXhlcyk7XG4gICAgICAgIGNvbnN0IHJlc2hhcGVkUmVzdWx0ID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiByZXN1bHQgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IGV4cGFuZGVkU2hhcGUgfSB9KTtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXN1bHQpO1xuICAgICAgICByZXR1cm4gcmVzaGFwZWRSZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgY29uc3QgYWxsQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEFsbCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogYWxsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QWxsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEFueSwgYmFja2VuZF91dGlsLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7IHRyYW5zcG9zZSB9IGZyb20gJy4vVHJhbnNwb3NlJztcbmV4cG9ydCBmdW5jdGlvbiBhbnkoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGF4aXMsIGtlZXBEaW1zIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KHgsICdhbnknKTtcbiAgICBjb25zdCBvcmlnQXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG4gICAgbGV0IGF4ZXMgPSBvcmlnQXhlcztcbiAgICBjb25zdCBwZXJtdXRlZEF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKGF4ZXMsIHguc2hhcGUubGVuZ3RoKTtcbiAgICBsZXQgJHggPSB4O1xuICAgIGlmIChwZXJtdXRlZEF4ZXMgIT0gbnVsbCkge1xuICAgICAgICAkeCA9IHRyYW5zcG9zZSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHBlcm06IHBlcm11dGVkQXhlcyB9IH0pO1xuICAgICAgICBheGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoYXhlcy5sZW5ndGgsIHguc2hhcGUubGVuZ3RoKTtcbiAgICB9XG4gICAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdhbnknLCBheGVzLCAkeC5zaGFwZS5sZW5ndGgpO1xuICAgIGNvbnN0IFtvdXRTaGFwZSwgcmVkdWNlU2hhcGVdID0gYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMoJHguc2hhcGUsIGF4ZXMpO1xuICAgIGNvbnN0IHJlZHVjZVNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuICAgIGNvbnN0IHZhbHMgPSB1dGlsLm1ha2VaZXJvc1R5cGVkQXJyYXkodXRpbC5zaXplRnJvbVNoYXBlKG91dFNoYXBlKSwgJHguZHR5cGUpO1xuICAgIGNvbnN0IGFWYWxzID0gYmFja2VuZC5kYXRhLmdldCgkeC5kYXRhSWQpLnZhbHVlcztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gaSAqIHJlZHVjZVNpemU7XG4gICAgICAgIGxldCBhbnlWYWwgPSBhVmFsc1tvZmZzZXRdO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJlZHVjZVNpemU7ICsraikge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhVmFsc1tvZmZzZXQgKyBqXTtcbiAgICAgICAgICAgIGFueVZhbCA9IGFueVZhbCB8fCB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICB2YWxzW2ldID0gYW55VmFsO1xuICAgIH1cbiAgICBpZiAocGVybXV0ZWRBeGVzICE9IG51bGwpIHtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbygkeCk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0U2hhcGUsICR4LmR0eXBlLCB2YWxzKTtcbiAgICBpZiAoa2VlcERpbXMpIHtcbiAgICAgICAgY29uc3QgZXhwYW5kZWRTaGFwZSA9IGJhY2tlbmRfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbShvdXRTaGFwZSwgb3JpZ0F4ZXMpO1xuICAgICAgICBjb25zdCByZXNoYXBlZFJlc3VsdCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogcmVzdWx0IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBleHBhbmRlZFNoYXBlIH0gfSk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHJlc2hhcGVkUmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGNvbnN0IGFueUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBBbnksXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGFueVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFueS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBcmdNYXgsIGJhY2tlbmRfdXRpbCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHsgdHJhbnNwb3NlIH0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuZXhwb3J0IGZ1bmN0aW9uIGFyZ01heChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYXhpcyB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnYXJnTWF4Jyk7XG4gICAgbGV0IGF4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpO1xuICAgIGNvbnN0IHBlcm11dGVkQXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oYXhlcywgeC5zaGFwZS5sZW5ndGgpO1xuICAgIGxldCAkeCA9IHg7XG4gICAgY29uc3QgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MgPSBbXTtcbiAgICBpZiAocGVybXV0ZWRBeGVzICE9IG51bGwpIHtcbiAgICAgICAgJHggPSB0cmFuc3Bvc2UoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kLCBhdHRyczogeyBwZXJtOiBwZXJtdXRlZEF4ZXMgfSB9KTtcbiAgICAgICAgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MucHVzaCgkeCk7XG4gICAgICAgIGF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0SW5uZXJNb3N0QXhlcyhheGVzLmxlbmd0aCwgJHguc2hhcGUubGVuZ3RoKTtcbiAgICB9XG4gICAgYXhlcyA9IFtheGVzWzBdXTtcbiAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoJ2FyZ01heCcsIGF4ZXMsICR4LnNoYXBlLmxlbmd0aCk7XG4gICAgY29uc3QgW291dFNoYXBlLCByZWR1Y2VTaGFwZV0gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcygkeC5zaGFwZSwgYXhlcyk7XG4gICAgY29uc3Qgb3V0U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShvdXRTaGFwZSk7XG4gICAgY29uc3QgdmFscyA9IHV0aWwubWFrZVplcm9zVHlwZWRBcnJheShvdXRTaXplLCAnaW50MzInKTtcbiAgICBjb25zdCByZWR1Y2VTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcbiAgICBjb25zdCBhVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoJHguZGF0YUlkKS52YWx1ZXM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGkgKiByZWR1Y2VTaXplO1xuICAgICAgICBsZXQgbWF4ID0gYVZhbHNbb2Zmc2V0XTtcbiAgICAgICAgbGV0IG1heEluZGV4ID0gMDtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByZWR1Y2VTaXplOyArK2opIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYVZhbHNbb2Zmc2V0ICsgal07XG4gICAgICAgICAgICBpZiAodmFsdWUgPiBtYXgpIHtcbiAgICAgICAgICAgICAgICBtYXggPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICBtYXhJbmRleCA9IGo7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFsc1tpXSA9IG1heEluZGV4O1xuICAgIH1cbiAgICBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcy5mb3JFYWNoKHQgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0KSk7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0U2hhcGUsICdpbnQzMicsIHZhbHMpO1xufVxuZXhwb3J0IGNvbnN0IGFyZ01heENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBBcmdNYXgsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGFyZ01heFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFyZ01heC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBcmdNaW4sIGJhY2tlbmRfdXRpbCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHsgdHJhbnNwb3NlIH0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuZXhwb3J0IGZ1bmN0aW9uIGFyZ01pbihhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYXhpcyB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnYXJnTWluJyk7XG4gICAgbGV0IGF4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpO1xuICAgIGNvbnN0IHBlcm11dGVkQXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oYXhlcywgeC5zaGFwZS5sZW5ndGgpO1xuICAgIGxldCAkeCA9IHg7XG4gICAgY29uc3QgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MgPSBbXTtcbiAgICBpZiAocGVybXV0ZWRBeGVzICE9IG51bGwpIHtcbiAgICAgICAgJHggPSB0cmFuc3Bvc2UoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kLCBhdHRyczogeyBwZXJtOiBwZXJtdXRlZEF4ZXMgfSB9KTtcbiAgICAgICAgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MucHVzaCgkeCk7XG4gICAgICAgIGF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0SW5uZXJNb3N0QXhlcyhheGVzLmxlbmd0aCwgJHguc2hhcGUubGVuZ3RoKTtcbiAgICB9XG4gICAgYXhlcyA9IFtheGVzWzBdXTtcbiAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoJ2FyZ01pbicsIGF4ZXMsICR4LnNoYXBlLmxlbmd0aCk7XG4gICAgY29uc3QgW291dFNoYXBlLCByZWR1Y2VTaGFwZV0gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcygkeC5zaGFwZSwgYXhlcyk7XG4gICAgY29uc3Qgb3V0U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShvdXRTaGFwZSk7XG4gICAgY29uc3QgdmFscyA9IHV0aWwubWFrZVplcm9zVHlwZWRBcnJheShvdXRTaXplLCAnaW50MzInKTtcbiAgICBjb25zdCByZWR1Y2VTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcbiAgICBjb25zdCBhVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoJHguZGF0YUlkKS52YWx1ZXM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGkgKiByZWR1Y2VTaXplO1xuICAgICAgICBsZXQgbWluID0gYVZhbHNbb2Zmc2V0XTtcbiAgICAgICAgbGV0IG1pbkluZGV4ID0gMDtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByZWR1Y2VTaXplOyArK2opIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYVZhbHNbb2Zmc2V0ICsgal07XG4gICAgICAgICAgICBpZiAodmFsdWUgPCBtaW4pIHtcbiAgICAgICAgICAgICAgICBtaW4gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICBtaW5JbmRleCA9IGo7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFsc1tpXSA9IG1pbkluZGV4O1xuICAgIH1cbiAgICBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcy5mb3JFYWNoKHQgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0KSk7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0U2hhcGUsICdpbnQzMicsIHZhbHMpO1xufVxuZXhwb3J0IGNvbnN0IGFyZ01pbkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBBcmdNaW4sXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGFyZ01pblxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFyZ01pbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQXNpbiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgYXNpbiA9IHVuYXJ5S2VybmVsRnVuYyhBc2luLCAoeGkpID0+IE1hdGguYXNpbih4aSkpO1xuZXhwb3J0IGNvbnN0IGFzaW5Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQXNpbixcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogYXNpbixcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Bc2luLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBc2luaCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgYXNpbmggPSB1bmFyeUtlcm5lbEZ1bmMoQXNpbmgsICh4aSkgPT4gTWF0aC5hc2luaCh4aSkpO1xuZXhwb3J0IGNvbnN0IGFzaW5oQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEFzaW5oLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBhc2luaCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Bc2luaC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQXRhbiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgYXRhbiA9IHVuYXJ5S2VybmVsRnVuYyhBdGFuLCAoeGkpID0+IE1hdGguYXRhbih4aSkpO1xuZXhwb3J0IGNvbnN0IGF0YW5Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQXRhbixcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogYXRhbixcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BdGFuLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBdGFuMiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X2ltcGwnO1xuaW1wb3J0IHsgYmluYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgYXRhbjJJbXBsID0gY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoYVZhbHVlLCBiVmFsdWUpID0+IE1hdGguYXRhbjIoYVZhbHVlLCBiVmFsdWUpKTtcbmV4cG9ydCBjb25zdCBhdGFuMiA9IGJpbmFyeUtlcm5lbEZ1bmMoQXRhbjIsIGF0YW4ySW1wbCk7XG5leHBvcnQgY29uc3QgYXRhbjJDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQXRhbjIsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGF0YW4yLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUF0YW4yLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBdGFuaCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgYXRhbmggPSB1bmFyeUtlcm5lbEZ1bmMoQXRhbmgsICh4aSkgPT4gTWF0aC5hdGFuaCh4aSkpO1xuZXhwb3J0IGNvbnN0IGF0YW5oQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEF0YW5oLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBhdGFuaCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BdGFuaC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBdmdQb29sLCBiYWNrZW5kX3V0aWwsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7IHBvb2wgfSBmcm9tICcuLi91dGlscy9wb29sX3V0aWxzJztcbmltcG9ydCB7IGlkZW50aXR5IH0gZnJvbSAnLi9JZGVudGl0eSc7XG5leHBvcnQgZnVuY3Rpb24gYXZnUG9vbChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ2F2Z1Bvb2wnKTtcbiAgICBjb25zdCB7IGZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlIH0gPSBhdHRycztcbiAgICBjb25zdCBkaWxhdGlvbnMgPSAxO1xuICAgIHV0aWwuYXNzZXJ0KGJhY2tlbmRfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgZGlsYXRpb25zKSwgKCkgPT4gJ0Vycm9yIGluIGF2Z1Bvb2w6IEVpdGhlciBzdHJpZGVzIG9yIGRpbGF0aW9ucyBtdXN0IGJlIDEuICcgK1xuICAgICAgICBgR290IHN0cmlkZXMgJHtzdHJpZGVzfSBhbmQgZGlsYXRpb25zICcke2RpbGF0aW9uc30nYCk7XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wyREluZm8oeC5zaGFwZSwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSk7XG4gICAgbGV0IHJlcztcbiAgICBpZiAoY29udkluZm8uZmlsdGVyV2lkdGggPT09IDEgJiYgY29udkluZm8uZmlsdGVySGVpZ2h0ID09PSAxICYmXG4gICAgICAgIHV0aWwuYXJyYXlzRXF1YWwoY29udkluZm8uaW5TaGFwZSwgY29udkluZm8ub3V0U2hhcGUpKSB7XG4gICAgICAgIHJlcyA9IGlkZW50aXR5KHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IHhWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgICAgIGNvbnN0IHN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKHguc2hhcGUpO1xuICAgICAgICBjb25zdCBidWZmZXIgPSBwb29sKHhWYWx1ZXMsIHguc2hhcGUsIHguZHR5cGUsIHN0cmlkZXMsIGNvbnZJbmZvLCAnYXZnJyk7XG4gICAgICAgIHJlcyA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8oY29udkluZm8ub3V0U2hhcGUsIHguZHR5cGUsIGJ1ZmZlci52YWx1ZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IGF2Z1Bvb2xDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQXZnUG9vbCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogYXZnUG9vbFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUF2Z1Bvb2wuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQXZnUG9vbDNELCBiYWNrZW5kX3V0aWwsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7IHBvb2wzZCB9IGZyb20gJy4uL3V0aWxzL3Bvb2xfdXRpbHMnO1xuZXhwb3J0IGZ1bmN0aW9uIGF2Z1Bvb2wzRChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGRhdGFGb3JtYXQgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ2F2Z1Bvb2wzZCcpO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVQb29sM0RJbmZvKHguc2hhcGUsIGZpbHRlclNpemUsIHN0cmlkZXMsIDEgLyogZGlsYXRpb25zICovLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgZGF0YUZvcm1hdCk7XG4gICAgY29uc3QgeFZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBvdXRCdWYgPSBwb29sM2QoeFZhbHVlcywgeC5zaGFwZSwgeC5kdHlwZSwgdXRpbC5jb21wdXRlU3RyaWRlcyh4LnNoYXBlKSwgY29udkluZm8sICdhdmcnKTtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRCdWYuc2hhcGUsICdmbG9hdDMyJywgb3V0QnVmLnZhbHVlcyk7XG59XG5leHBvcnQgY29uc3QgYXZnUG9vbDNEQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEF2Z1Bvb2wzRCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogYXZnUG9vbDNEXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXZnUG9vbDNELmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEF2Z1Bvb2wzREdyYWQsIGJhY2tlbmRfdXRpbCwgYnVmZmVyIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5leHBvcnQgZnVuY3Rpb24gYXZnUG9vbDNER3JhZChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgZHksIGlucHV0IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChbZHksIGlucHV0XSwgJ2F2Z1Bvb2wzREdyYWQnKTtcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlUG9vbDNESW5mbyhpbnB1dC5zaGFwZSwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgMSAvKiBkaWxhdGlvbnMgKi8sIHBhZCwgZGltUm91bmRpbmdNb2RlKTtcbiAgICBjb25zdCBzdHJpZGVEZXB0aCA9IGNvbnZJbmZvLnN0cmlkZURlcHRoO1xuICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICAgIGNvbnN0IGZpbHRlckRlcHRoID0gY29udkluZm8uZmlsdGVyRGVwdGg7XG4gICAgY29uc3QgZmlsdGVySGVpZ2h0ID0gY29udkluZm8uZmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG4gICAgY29uc3QgZGlsYXRpb25EZXB0aCA9IGNvbnZJbmZvLmRpbGF0aW9uRGVwdGg7XG4gICAgY29uc3QgZGlsYXRpb25IZWlnaHQgPSBjb252SW5mby5kaWxhdGlvbkhlaWdodDtcbiAgICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJEZXB0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckRlcHRoO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckhlaWdodDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoO1xuICAgIGNvbnN0IHBhZEZyb250ID0gZWZmZWN0aXZlRmlsdGVyRGVwdGggLSAxIC0gY29udkluZm8ucGFkSW5mby5mcm9udDtcbiAgICBjb25zdCBwYWRMZWZ0ID0gZWZmZWN0aXZlRmlsdGVyV2lkdGggLSAxIC0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgIGNvbnN0IHBhZFRvcCA9IGVmZmVjdGl2ZUZpbHRlckhlaWdodCAtIDEgLSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICBjb25zdCBkeCA9IGJ1ZmZlcihpbnB1dC5zaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICBjb25zdCBhdmdNdWx0aXBsaWVyID0gMSAvIChmaWx0ZXJEZXB0aCAqIGZpbHRlckhlaWdodCAqIGZpbHRlcldpZHRoKTtcbiAgICBjb25zdCBkeUJ1ZiA9IGJhY2tlbmQuYnVmZmVyU3luYyhkeSk7XG4gICAgZm9yIChsZXQgYmF0Y2ggPSAwOyBiYXRjaCA8IGNvbnZJbmZvLmJhdGNoU2l6ZTsgKytiYXRjaCkge1xuICAgICAgICBmb3IgKGxldCBjaGFubmVsID0gMDsgY2hhbm5lbCA8IGNvbnZJbmZvLmluQ2hhbm5lbHM7ICsrY2hhbm5lbCkge1xuICAgICAgICAgICAgZm9yIChsZXQgZHhEZXB0aCA9IDA7IGR4RGVwdGggPCBjb252SW5mby5pbkRlcHRoOyArK2R4RGVwdGgpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBkeFJvdyA9IDA7IGR4Um93IDwgY29udkluZm8uaW5IZWlnaHQ7ICsrZHhSb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgZHhDb2wgPSAwOyBkeENvbCA8IGNvbnZJbmZvLmluV2lkdGg7ICsrZHhDb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNoYWRlciBjb2RlIGJlZ2lucy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGR5RGVwdGhDb3JuZXIgPSBkeERlcHRoIC0gcGFkRnJvbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkeVJvd0Nvcm5lciA9IGR4Um93IC0gcGFkVG9wO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHlDb2xDb3JuZXIgPSBkeENvbCAtIHBhZExlZnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZG90UHJvZCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB3RGVwdGggPSAwOyB3RGVwdGggPCBlZmZlY3RpdmVGaWx0ZXJEZXB0aDsgd0RlcHRoICs9IGRpbGF0aW9uRGVwdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkeURlcHRoID0gKGR5RGVwdGhDb3JuZXIgKyB3RGVwdGgpIC8gc3RyaWRlRGVwdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR5RGVwdGggPCAwIHx8IGR5RGVwdGggPj0gY29udkluZm8ub3V0RGVwdGggfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihkeURlcHRoKSAhPT0gZHlEZXB0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgd1JvdyA9IDA7IHdSb3cgPCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQ7IHdSb3cgKz0gZGlsYXRpb25IZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHlSb3cgPSAoZHlSb3dDb3JuZXIgKyB3Um93KSAvIHN0cmlkZUhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR5Um93IDwgMCB8fCBkeVJvdyA+PSBjb252SW5mby5vdXRIZWlnaHQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoZHlSb3cpICE9PSBkeVJvdykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgd0NvbCA9IDA7IHdDb2wgPCBlZmZlY3RpdmVGaWx0ZXJXaWR0aDsgd0NvbCArPSBkaWxhdGlvbldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkeUNvbCA9IChkeUNvbENvcm5lciArIHdDb2wpIC8gc3RyaWRlV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHlDb2wgPCAwIHx8IGR5Q29sID49IGNvbnZJbmZvLm91dFdpZHRoIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihkeUNvbCkgIT09IGR5Q29sKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwaXhlbCA9IGR5QnVmLmdldChiYXRjaCwgZHlEZXB0aCwgZHlSb3csIGR5Q29sLCBjaGFubmVsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdFByb2QgKz0gcGl4ZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBkeC5zZXQoZG90UHJvZCAqIGF2Z011bHRpcGxpZXIsIGJhdGNoLCBkeERlcHRoLCBkeFJvdywgZHhDb2wsIGNoYW5uZWwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGR4LnNoYXBlLCBkeC5kdHlwZSwgZHgudmFsdWVzKTtcbn1cbmV4cG9ydCBjb25zdCBhdmdQb29sM0RHcmFkQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEF2Z1Bvb2wzREdyYWQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGF2Z1Bvb2wzREdyYWRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BdmdQb29sM0RHcmFkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEF2Z1Bvb2xHcmFkLCBiYWNrZW5kX3V0aWwsIGJ1ZmZlciB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIGF2Z1Bvb2xHcmFkKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBkeSwgaW5wdXQgfSA9IGlucHV0cztcbiAgICBjb25zdCB4ID0gaW5wdXQ7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChbZHksIGlucHV0XSwgJ2F2Z1Bvb2xHcmFkJyk7XG4gICAgY29uc3QgeyBmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQgfSA9IGF0dHJzO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVQb29sMkRJbmZvKHguc2hhcGUsIGZpbHRlclNpemUsIHN0cmlkZXMsIDEgLyogZGlsYXRpb25zICovLCBwYWQpO1xuICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICAgIGNvbnN0IGZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmZpbHRlckhlaWdodDtcbiAgICBjb25zdCBmaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmZpbHRlcldpZHRoO1xuICAgIGNvbnN0IGRpbGF0aW9uSGVpZ2h0ID0gY29udkluZm8uZGlsYXRpb25IZWlnaHQ7XG4gICAgY29uc3QgZGlsYXRpb25XaWR0aCA9IGNvbnZJbmZvLmRpbGF0aW9uV2lkdGg7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVySGVpZ2h0ID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlcldpZHRoID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVyV2lkdGg7XG4gICAgY29uc3QgcGFkTGVmdCA9IGVmZmVjdGl2ZUZpbHRlcldpZHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICBjb25zdCBwYWRUb3AgPSBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgLSAxIC0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgZHggPSBidWZmZXIoeC5zaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICBjb25zdCBhdmdNdWx0aXBsaWVyID0gMSAvIChmaWx0ZXJIZWlnaHQgKiBmaWx0ZXJXaWR0aCk7XG4gICAgY29uc3QgZHlEYXRhID0gYmFja2VuZC5kYXRhLmdldChkeS5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBkeUJ1ZiA9IGJ1ZmZlcihkeS5zaGFwZSwgJ2Zsb2F0MzInLCBkeURhdGEpO1xuICAgIGZvciAobGV0IGIgPSAwOyBiIDwgY29udkluZm8uYmF0Y2hTaXplOyArK2IpIHtcbiAgICAgICAgZm9yIChsZXQgZCA9IDA7IGQgPCBjb252SW5mby5pbkNoYW5uZWxzOyArK2QpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGR4UiA9IDA7IGR4UiA8IGNvbnZJbmZvLmluSGVpZ2h0OyArK2R4Uikge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGR4QyA9IDA7IGR4QyA8IGNvbnZJbmZvLmluV2lkdGg7ICsrZHhDKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNoYWRlciBjb2RlIGJlZ2lucy5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZHlSQ29ybmVyID0gZHhSIC0gcGFkVG9wO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkeUNDb3JuZXIgPSBkeEMgLSBwYWRMZWZ0O1xuICAgICAgICAgICAgICAgICAgICBsZXQgZG90UHJvZCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHdSID0gMDsgd1IgPCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQ7IHdSICs9IGRpbGF0aW9uSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkeVIgPSAoZHlSQ29ybmVyICsgd1IpIC8gc3RyaWRlSGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR5UiA8IDAgfHwgZHlSID49IGNvbnZJbmZvLm91dEhlaWdodCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoZHlSKSAhPT0gZHlSKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB3QyA9IDA7IHdDIDwgZWZmZWN0aXZlRmlsdGVyV2lkdGg7IHdDICs9IGRpbGF0aW9uV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkeUMgPSAoZHlDQ29ybmVyICsgd0MpIC8gc3RyaWRlV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR5QyA8IDAgfHwgZHlDID49IGNvbnZJbmZvLm91dFdpZHRoIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoZHlDKSAhPT0gZHlDKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwaXhlbCA9IGR5QnVmLmdldChiLCBkeVIsIGR5QywgZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG90UHJvZCArPSBwaXhlbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkeC5zZXQoZG90UHJvZCAqIGF2Z011bHRpcGxpZXIsIGIsIGR4UiwgZHhDLCBkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oZHguc2hhcGUsIGR4LmR0eXBlLCBkeC52YWx1ZXMpO1xufVxuZXhwb3J0IGNvbnN0IGF2Z1Bvb2xHcmFkQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEF2Z1Bvb2xHcmFkLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBhdmdQb29sR3JhZFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUF2Z1Bvb2xHcmFkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBCYXRjaE1hdE11bCwgYnVmZmVyLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmV4cG9ydCBmdW5jdGlvbiBiYXRjaE1hdE11bChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgYSwgYiB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgdHJhbnNwb3NlQSwgdHJhbnNwb3NlQiB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChbYSwgYl0sICdtYXRNdWwnKTtcbiAgICBjb25zdCBhUmFuayA9IGEuc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IGJSYW5rID0gYi5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgaW5uZXJTaGFwZUEgPSB0cmFuc3Bvc2VBID8gYS5zaGFwZVthUmFuayAtIDJdIDogYS5zaGFwZVthUmFuayAtIDFdO1xuICAgIGNvbnN0IGlubmVyU2hhcGVCID0gdHJhbnNwb3NlQiA/IGIuc2hhcGVbYlJhbmsgLSAxXSA6IGIuc2hhcGVbYlJhbmsgLSAyXTtcbiAgICBjb25zdCBvdXRlclNoYXBlQSA9IHRyYW5zcG9zZUEgPyBhLnNoYXBlW2FSYW5rIC0gMV0gOiBhLnNoYXBlW2FSYW5rIC0gMl07XG4gICAgY29uc3Qgb3V0ZXJTaGFwZUIgPSB0cmFuc3Bvc2VCID8gYi5zaGFwZVtiUmFuayAtIDJdIDogYi5zaGFwZVtiUmFuayAtIDFdO1xuICAgIGNvbnN0IG91dGVyRGltc0EgPSBhLnNoYXBlLnNsaWNlKDAsIC0yKTtcbiAgICBjb25zdCBvdXRlckRpbXNCID0gYi5zaGFwZS5zbGljZSgwLCAtMik7XG4gICAgY29uc3QgYmF0Y2hEaW1BID0gdXRpbC5zaXplRnJvbVNoYXBlKG91dGVyRGltc0EpO1xuICAgIGNvbnN0IGJhdGNoRGltQiA9IHV0aWwuc2l6ZUZyb21TaGFwZShvdXRlckRpbXNCKTtcbiAgICBjb25zdCBiYXRjaERpbXNDb21wYXRpYmxlID0gYmF0Y2hEaW1BID09PSBiYXRjaERpbUIgfHwgYmF0Y2hEaW1BID09PSAxIHx8IGJhdGNoRGltQiA9PT0gMTtcbiAgICB1dGlsLmFzc2VydChhUmFuayA+PSAyICYmIGJSYW5rID49IDIgJiYgYmF0Y2hEaW1zQ29tcGF0aWJsZSwgKCkgPT4gYEVycm9yIGluIG1hdE11bDogdGhlIGlucHV0IGJhdGNoIGRpbWVuc2lvbnMgbXVzdCBlaXRoZXIgYmUgdGhlIGAgK1xuICAgICAgICBgc2FtZSBvciBhdCBsZWFzdCBvbmUgaW5wdXQgYmF0Y2ggZGltZW5zaW9uIG11c3QgYmUgMS4gR290IGlucHV0IGAgK1xuICAgICAgICBgYmF0Y2ggZGltZW5zaW9ucyBvZiAoJHtvdXRlckRpbXNBfSkgYW5kICgke291dGVyRGltc0J9KS5gKTtcbiAgICBjb25zdCBvdXRTaGFwZU91dGVyRGltcyA9IGJhdGNoRGltQSA+IGJhdGNoRGltQiA/IGEuc2hhcGUuc2xpY2UoMCwgLTIpIDogYi5zaGFwZS5zbGljZSgwLCAtMik7XG4gICAgY29uc3Qgb3V0U2hhcGUgPSBvdXRTaGFwZU91dGVyRGltcy5jb25jYXQoW291dGVyU2hhcGVBLCBvdXRlclNoYXBlQl0pO1xuICAgIHV0aWwuYXNzZXJ0KGlubmVyU2hhcGVBID09PSBpbm5lclNoYXBlQiwgKCkgPT4gYEVycm9yIGluIG1hdE11bDogaW5uZXIgc2hhcGVzICgke2lubmVyU2hhcGVBfSkgYW5kIChgICtcbiAgICAgICAgYCR7aW5uZXJTaGFwZUJ9KSBvZiBUZW5zb3JzIHdpdGggc2hhcGVzICR7YS5zaGFwZX0gYW5kIGAgK1xuICAgICAgICBgJHtiLnNoYXBlfSBhbmQgdHJhbnNwb3NlQT0ke3RyYW5zcG9zZUF9YCArXG4gICAgICAgIGAgYW5kIHRyYW5zcG9zZUI9JHt0cmFuc3Bvc2VCfSBtdXN0IG1hdGNoLmApO1xuICAgIGNvbnN0IGEzZFNoYXBlID0gdHJhbnNwb3NlQSA/IFtiYXRjaERpbUEsIGlubmVyU2hhcGVBLCBvdXRlclNoYXBlQV0gOlxuICAgICAgICBbYmF0Y2hEaW1BLCBvdXRlclNoYXBlQSwgaW5uZXJTaGFwZUFdO1xuICAgIGNvbnN0IGIzZFNoYXBlID0gdHJhbnNwb3NlQiA/IFtiYXRjaERpbUIsIG91dGVyU2hhcGVCLCBpbm5lclNoYXBlQl0gOlxuICAgICAgICBbYmF0Y2hEaW1CLCBpbm5lclNoYXBlQiwgb3V0ZXJTaGFwZUJdO1xuICAgIC8vIFRoZSByZXN0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBkZXNpZ25lZCB0byBvcGVyYXRlIG9uIHJhbmstMyB0ZW5zb3JzXG4gICAgY29uc3QgYTNkID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiBhIH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBhM2RTaGFwZSB9IH0pO1xuICAgIGNvbnN0IGIzZCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogYiB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogYjNkU2hhcGUgfSB9KTtcbiAgICBjb25zdCBzaGFyZWREaW0gPSB0cmFuc3Bvc2VBID8gYTNkLnNoYXBlWzFdIDogYTNkLnNoYXBlWzJdO1xuICAgIGNvbnN0IGxlZnREaW0gPSB0cmFuc3Bvc2VBID8gYTNkLnNoYXBlWzJdIDogYTNkLnNoYXBlWzFdO1xuICAgIGNvbnN0IHJpZ2h0RGltID0gdHJhbnNwb3NlQiA/IGIzZC5zaGFwZVsxXSA6IGIzZC5zaGFwZVsyXTtcbiAgICBjb25zdCBiYXRjaERpbSA9IE1hdGgubWF4KGJhdGNoRGltQSwgYmF0Y2hEaW1CKTtcbiAgICBjb25zdCBhM2RWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGEzZC5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBiM2RWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGIzZC5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBhM2RTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhhM2Quc2hhcGUpO1xuICAgIGNvbnN0IGIzZFN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGIzZC5zaGFwZSk7XG4gICAgY29uc3QgW2FCYXRjaCwgYU91dGVyU3RlcCwgYUlubmVyU3RlcF0gPSB0cmFuc3Bvc2VBID9cbiAgICAgICAgW2EzZFN0cmlkZXNbMF0sIDEsIGEzZFN0cmlkZXNbMV1dIDpcbiAgICAgICAgW2EzZFN0cmlkZXNbMF0sIGEzZFN0cmlkZXNbMV0sIDFdO1xuICAgIGNvbnN0IFtiSW5uZXJTdGVwLCBiT3V0ZXJTdGVwLCBiQmF0Y2hdID0gdHJhbnNwb3NlQiA/XG4gICAgICAgIFsxLCBiM2RTdHJpZGVzWzFdLCBiM2RTdHJpZGVzWzBdXSA6XG4gICAgICAgIFtiM2RTdHJpZGVzWzFdLCAxLCBiM2RTdHJpZGVzWzBdXTtcbiAgICBjb25zdCBzaXplID0gbGVmdERpbSAqIHJpZ2h0RGltO1xuICAgIGNvbnN0IHJlc3VsdCA9IGJ1ZmZlcihbYmF0Y2hEaW0sIGxlZnREaW0sIHJpZ2h0RGltXSwgYTNkLmR0eXBlKTtcbiAgICBjb25zdCByZXNWYWxzID0gcmVzdWx0LnZhbHVlcztcbiAgICBjb25zdCBibG9ja1NpemUgPSBiYWNrZW5kLmJsb2NrU2l6ZTtcbiAgICBmb3IgKGxldCBiaSA9IDA7IGJpIDwgYmF0Y2hEaW07IGJpKyspIHtcbiAgICAgICAgZm9yIChsZXQgaTAgPSAwOyBpMCA8IGxlZnREaW07IGkwICs9IGJsb2NrU2l6ZSkge1xuICAgICAgICAgICAgZm9yIChsZXQgajAgPSAwOyBqMCA8IHJpZ2h0RGltOyBqMCArPSBibG9ja1NpemUpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrMCA9IDA7IGswIDwgc2hhcmVkRGltOyBrMCArPSBibG9ja1NpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHdoZW4gYmxvY2tTaXplIGRvZXNuJ3QgZXZlbmx5IGRpdmlkZSB0aGUgaW5wdXRcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaUJsb2NrID0gTWF0aC5taW4oaTAgKyBibG9ja1NpemUsIGxlZnREaW0pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBqQmxvY2sgPSBNYXRoLm1pbihqMCArIGJsb2NrU2l6ZSwgcmlnaHREaW0pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBrQmxvY2sgPSBNYXRoLm1pbihrMCArIGJsb2NrU2l6ZSwgc2hhcmVkRGltKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IGkwOyBpIDwgaUJsb2NrOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSBqMDsgaiA8IGpCbG9jazsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN1bSA9IDAuMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gazA7IGsgPCBrQmxvY2s7IGsrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXRjaE9mZnNldEEgPSBNYXRoLm1pbihiaSwgYmF0Y2hEaW1BIC0gMSkgKiBhQmF0Y2g7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhdGNoT2Zmc2V0QiA9IE1hdGgubWluKGJpLCBiYXRjaERpbUIgLSAxKSAqIGJCYXRjaDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVZhbCA9IGEzZFZhbHVlc1tiYXRjaE9mZnNldEEgKyBpICogYU91dGVyU3RlcCArIGsgKiBhSW5uZXJTdGVwXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYlZhbCA9IGIzZFZhbHVlc1trICogYklubmVyU3RlcCArIGogKiBiT3V0ZXJTdGVwICsgYmF0Y2hPZmZzZXRCXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtICs9IGFWYWwgKiBiVmFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNWYWxzW2JpICogc2l6ZSArIChpICogcmlnaHREaW0gKyBqKV0gKz0gc3VtO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oYTNkKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGIzZCk7XG4gICAgLy8gc2V0IGNvcnJlY3Qgc2hhcGUgb24gb3V0cHV0LlxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dFNoYXBlLCByZXN1bHQuZHR5cGUsIHJlc3VsdC52YWx1ZXMpO1xufVxuZXhwb3J0IGNvbnN0IGJhdGNoTWF0TXVsQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEJhdGNoTWF0TXVsLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBiYXRjaE1hdE11bCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1CYXRjaE1hdE11bC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBGdXNlZEJhdGNoTm9ybSwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIGJhdGNoTm9ybShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCwgc2NhbGUsIG9mZnNldCwgbWVhbiwgdmFyaWFuY2UgfSA9IGlucHV0cztcbiAgICB1dGlsLmFzc2VydChtZWFuLnNoYXBlLmxlbmd0aCA9PT0gdmFyaWFuY2Uuc2hhcGUubGVuZ3RoLCAoKSA9PiAnQmF0Y2ggbm9ybWFsaXphdGlvbiBncmFkaWVudCByZXF1aXJlcyBtZWFuIGFuZCB2YXJpYW5jZSB0byBoYXZlICcgK1xuICAgICAgICAnZXF1YWwgcmFua3MuJyk7XG4gICAgdXRpbC5hc3NlcnQob2Zmc2V0ID09IG51bGwgfHwgbWVhbi5zaGFwZS5sZW5ndGggPT09IG9mZnNldC5zaGFwZS5sZW5ndGgsICgpID0+ICdCYXRjaCBub3JtYWxpemF0aW9uIGdyYWRpZW50IHJlcXVpcmVzIG1lYW4gYW5kIG9mZnNldCB0byBoYXZlICcgK1xuICAgICAgICAnZXF1YWwgcmFua3MuJyk7XG4gICAgdXRpbC5hc3NlcnQoc2NhbGUgPT0gbnVsbCB8fCBtZWFuLnNoYXBlLmxlbmd0aCA9PT0gc2NhbGUuc2hhcGUubGVuZ3RoLCAoKSA9PiAnQmF0Y2ggbm9ybWFsaXphdGlvbiBncmFkaWVudCByZXF1aXJlcyBtZWFuIGFuZCBzY2FsZSB0byBoYXZlICcgK1xuICAgICAgICAnZXF1YWwgcmFua3MuJyk7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChbeCwgbWVhbiwgdmFyaWFuY2UsIHNjYWxlLCBvZmZzZXRdLCAnYmF0Y2hOb3JtJyk7XG4gICAgbGV0IHsgdmFyaWFuY2VFcHNpbG9uIH0gPSBhdHRycztcbiAgICBpZiAodmFyaWFuY2VFcHNpbG9uID09IG51bGwpIHtcbiAgICAgICAgdmFyaWFuY2VFcHNpbG9uID0gMC4wMDE7XG4gICAgfVxuICAgIGNvbnN0IHhWYWxzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IG1WYWxzID0gYmFja2VuZC5kYXRhLmdldChtZWFuLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHZhclZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHZhcmlhbmNlLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHNWYWxzID0gc2NhbGUgPyBiYWNrZW5kLmRhdGEuZ2V0KHNjYWxlLmRhdGFJZCkudmFsdWVzIDpcbiAgICAgICAgbmV3IEZsb2F0MzJBcnJheShbMV0pO1xuICAgIGNvbnN0IG9mZlZhbHMgPSBvZmZzZXQgP1xuICAgICAgICBiYWNrZW5kLmRhdGEuZ2V0KG9mZnNldC5kYXRhSWQpLnZhbHVlcyA6XG4gICAgICAgIG5ldyBGbG9hdDMyQXJyYXkoWzBdKTtcbiAgICBjb25zdCBvdXRWYWxzID0gbmV3IEZsb2F0MzJBcnJheSh4VmFscy5sZW5ndGgpO1xuICAgIGNvbnN0IG9mZlZhbHNMZW5ndGggPSBvZmZWYWxzLmxlbmd0aDtcbiAgICBjb25zdCBzVmFsc0xlbmd0aCA9IHNWYWxzLmxlbmd0aDtcbiAgICBjb25zdCB2YXJWYWxzTGVuZ3RoID0gdmFyVmFscy5sZW5ndGg7XG4gICAgY29uc3QgbVZhbHNMZW5ndGggPSBtVmFscy5sZW5ndGg7XG4gICAgbGV0IG9mZmkgPSAwO1xuICAgIGxldCBtaSA9IDA7XG4gICAgbGV0IHNpID0gMDtcbiAgICBsZXQgdmkgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeFZhbHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgb3V0VmFsc1tpXSA9IG9mZlZhbHNbb2ZmaSsrXSArXG4gICAgICAgICAgICAoeFZhbHNbaV0gLSBtVmFsc1ttaSsrXSkgKiBzVmFsc1tzaSsrXSAvXG4gICAgICAgICAgICAgICAgTWF0aC5zcXJ0KHZhclZhbHNbdmkrK10gKyB2YXJpYW5jZUVwc2lsb24pO1xuICAgICAgICBpZiAob2ZmaSA+PSBvZmZWYWxzTGVuZ3RoKSB7XG4gICAgICAgICAgICBvZmZpID0gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWkgPj0gbVZhbHNMZW5ndGgpIHtcbiAgICAgICAgICAgIG1pID0gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2kgPj0gc1ZhbHNMZW5ndGgpIHtcbiAgICAgICAgICAgIHNpID0gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmkgPj0gdmFyVmFsc0xlbmd0aCkge1xuICAgICAgICAgICAgdmkgPSAwO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHguc2hhcGUsIHguZHR5cGUsIG91dFZhbHMpO1xufVxuZXhwb3J0IGNvbnN0IGJhdGNoTm9ybUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBGdXNlZEJhdGNoTm9ybSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogYmF0Y2hOb3JtLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJhdGNoTm9ybS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIEJhdGNoVG9TcGFjZU5EIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7IHNsaWNlIH0gZnJvbSAnLi9TbGljZSc7XG5pbXBvcnQgeyB0cmFuc3Bvc2UgfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5leHBvcnQgZnVuY3Rpb24gYmF0Y2hUb1NwYWNlTkQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGJsb2NrU2hhcGUsIGNyb3BzIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KFt4XSwgJ2JhdGNoVG9TcGFjZU5EJyk7XG4gICAgY29uc3QgcHJvZCA9IGJsb2NrU2hhcGUucmVkdWNlKChhLCBiKSA9PiBhICogYik7XG4gICAgY29uc3QgcmVzaGFwZWQgPSBiYWNrZW5kX3V0aWwuZ2V0UmVzaGFwZWQoeC5zaGFwZSwgYmxvY2tTaGFwZSwgcHJvZCk7XG4gICAgY29uc3QgcGVybXV0ZWQgPSBiYWNrZW5kX3V0aWwuZ2V0UGVybXV0ZWQocmVzaGFwZWQubGVuZ3RoLCBibG9ja1NoYXBlLmxlbmd0aCk7XG4gICAgY29uc3QgcmVzaGFwZWRQZXJtdXRlZCA9IGJhY2tlbmRfdXRpbC5nZXRSZXNoYXBlZFBlcm11dGVkKHguc2hhcGUsIGJsb2NrU2hhcGUsIHByb2QpO1xuICAgIGNvbnN0IHNsaWNlQmVnaW5Db29yZHMgPSBiYWNrZW5kX3V0aWwuZ2V0U2xpY2VCZWdpbkNvb3Jkcyhjcm9wcywgYmxvY2tTaGFwZS5sZW5ndGgpO1xuICAgIGNvbnN0IHNsaWNlU2l6ZSA9IGJhY2tlbmRfdXRpbC5nZXRTbGljZVNpemUocmVzaGFwZWRQZXJtdXRlZCwgY3JvcHMsIGJsb2NrU2hhcGUubGVuZ3RoKTtcbiAgICBjb25zdCB4UmVzaGFwZWQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IHJlc2hhcGVkIH0gfSk7XG4gICAgY29uc3QgeFRyYW5zcG9zZWQgPSB0cmFuc3Bvc2UoeyBpbnB1dHM6IHsgeDogeFJlc2hhcGVkIH0sIGJhY2tlbmQsIGF0dHJzOiB7IHBlcm06IHBlcm11dGVkIH0gfSk7XG4gICAgY29uc3QgeFRyYW5zcG9zZWRSZXNoYXBlZCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogeFRyYW5zcG9zZWQgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IHJlc2hhcGVkUGVybXV0ZWQgfSB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBzbGljZSh7XG4gICAgICAgIGlucHV0czogeyB4OiB4VHJhbnNwb3NlZFJlc2hhcGVkIH0sXG4gICAgICAgIGJhY2tlbmQsXG4gICAgICAgIGF0dHJzOiB7IGJlZ2luOiBzbGljZUJlZ2luQ29vcmRzLCBzaXplOiBzbGljZVNpemUgfVxuICAgIH0pO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oeFJlc2hhcGVkKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHhUcmFuc3Bvc2VkKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHhUcmFuc3Bvc2VkUmVzaGFwZWQpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgY29uc3QgYmF0Y2hUb1NwYWNlTkRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQmF0Y2hUb1NwYWNlTkQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGJhdGNoVG9TcGFjZU5EXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QmF0Y2hUb1NwYWNlTkQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQmluY291bnQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYmluY291bnRJbXBsIH0gZnJvbSAnLi9CaW5jb3VudF9pbXBsJztcbmV4cG9ydCBmdW5jdGlvbiBiaW5jb3VudChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCwgd2VpZ2h0cyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgc2l6ZSB9ID0gYXR0cnM7XG4gICAgY29uc3QgeFZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3Qgd2VpZ2h0c1ZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHdlaWdodHMuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3Qgb3V0VmFscyA9IGJpbmNvdW50SW1wbCh4VmFscywgd2VpZ2h0c1ZhbHMsIHdlaWdodHMuZHR5cGUsIHdlaWdodHMuc2hhcGUsIHNpemUpO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtzaXplXSwgd2VpZ2h0cy5kdHlwZSwgb3V0VmFscyk7XG59XG5leHBvcnQgY29uc3QgYmluY291bnRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQmluY291bnQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGJpbmNvdW50XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QmluY291bnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYnVmZmVyLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiBiaW5jb3VudEltcGwoeFZhbHMsIHdlaWdodHNWYWxzLCB3ZWlnaHRzRHR5cGUsIHdlaWdodHNTaGFwZSwgc2l6ZSkge1xuICAgIGNvbnN0IHdlaWdodHNTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHdlaWdodHNTaGFwZSk7XG4gICAgY29uc3Qgb3V0VmFscyA9IHV0aWwubWFrZVplcm9zVHlwZWRBcnJheShzaXplLCB3ZWlnaHRzRHR5cGUpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeFZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB4VmFsc1tpXTtcbiAgICAgICAgaWYgKHZhbHVlIDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnB1dCB4IG11c3QgYmUgbm9uLW5lZ2F0aXZlIScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSA+PSBzaXplKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAod2VpZ2h0c1NpemUgPiAwKSB7XG4gICAgICAgICAgICBvdXRWYWxzW3ZhbHVlXSArPSB3ZWlnaHRzVmFsc1tpXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG91dFZhbHNbdmFsdWVdICs9IDE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dFZhbHM7XG59XG5leHBvcnQgZnVuY3Rpb24gYmluY291bnRSZWR1Y2VJbXBsKHhCdWYsIHdlaWdodHNCdWYsIHNpemUsIGJpbmFyeU91dHB1dCA9IGZhbHNlKSB7XG4gICAgY29uc3QgbnVtUm93cyA9IHhCdWYuc2hhcGVbMF07XG4gICAgY29uc3QgbnVtQ29scyA9IHhCdWYuc2hhcGVbMV07XG4gICAgY29uc3Qgb3V0QnVmID0gYnVmZmVyKFtudW1Sb3dzLCBzaXplXSwgd2VpZ2h0c0J1Zi5kdHlwZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1Sb3dzOyBpKyspIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBudW1Db2xzOyBqKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0geEJ1Zi5nZXQoaSwgaik7XG4gICAgICAgICAgICBpZiAodmFsdWUgPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnB1dCB4IG11c3QgYmUgbm9uLW5lZ2F0aXZlIScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbHVlID49IHNpemUpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChiaW5hcnlPdXRwdXQpIHtcbiAgICAgICAgICAgICAgICBvdXRCdWYuc2V0KDEsIGksIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh3ZWlnaHRzQnVmLnNpemUgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG91dEJ1Zi5zZXQob3V0QnVmLmdldChpLCB2YWx1ZSkgKyB3ZWlnaHRzQnVmLmdldChpLCBqKSwgaSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0QnVmLnNldChvdXRCdWYuZ2V0KGksIHZhbHVlKSArIDEsIGksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dEJ1Zjtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJpbmNvdW50X2ltcGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQ2FzdCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X2ltcGwnO1xuaW1wb3J0IHsgemVyb3MgfSBmcm9tICcuLi91dGlscy96ZXJvc19pbXBsJztcbmltcG9ydCB7IGNvbXBsZXggfSBmcm9tICcuL0NvbXBsZXgnO1xuaW1wb3J0IHsgaWRlbnRpdHkgfSBmcm9tICcuL0lkZW50aXR5JztcbmltcG9ydCB7IHJlYWwgfSBmcm9tICcuL1JlYWwnO1xuZXhwb3J0IGZ1bmN0aW9uIGNhc3QoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGR0eXBlIH0gPSBhdHRycztcbiAgICAvLyBDYXN0aW5nIHRvIGNvbXBsZXg2NC5cbiAgICBpZiAoZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICAgIGlmICh4LmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICAgICAgcmV0dXJuIGlkZW50aXR5KHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB6ZXJvc1RlbnNvckluZm8gPSB6ZXJvcyhiYWNrZW5kLCB4LnNoYXBlLCB4LmR0eXBlKTtcbiAgICAgICAgY29uc3QgZmxvYXRYID0gY2FzdCh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQsIGF0dHJzOiB7IGR0eXBlOiAnZmxvYXQzMicgfSB9KTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY29tcGxleCh7IGlucHV0czogeyByZWFsOiBmbG9hdFgsIGltYWc6IHplcm9zVGVuc29ySW5mbyB9LCBiYWNrZW5kIH0pO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHplcm9zVGVuc29ySW5mbyk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oZmxvYXRYKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLy8gQ2FzdGluZyBmcm9tIGNvbXBsZXg2NFxuICAgIGlmICh4LmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICBjb25zdCByZWFsUGFydCA9IHJlYWwoeyBpbnB1dHM6IHsgaW5wdXQ6IHggfSwgYmFja2VuZCB9KTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY2FzdCh7IGlucHV0czogeyB4OiByZWFsUGFydCB9LCBiYWNrZW5kLCBhdHRyczogeyBkdHlwZSB9IH0pO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlYWxQYXJ0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgaWYgKCF1dGlsLmhhc0VuY29kaW5nTG9zcyh4LmR0eXBlLCBkdHlwZSkpIHtcbiAgICAgICAgLy8gV2UgZG9uJ3QgY2hhbmdlIHRoZSB1bmRlcmx5aW5nIGRhdGEsIHNpbmNlIHdlIGNhc3QgdG8gaGlnaGVyXG4gICAgICAgIC8vIHByZWNpc2lvbi5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gaWRlbnRpdHkoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kIH0pO1xuICAgICAgICByZXR1cm4geyBkYXRhSWQ6IHJlc3VsdC5kYXRhSWQsIHNoYXBlOiByZXN1bHQuc2hhcGUsIGR0eXBlIH07XG4gICAgfVxuICAgIGlmIChkdHlwZSA9PT0gJ2ludDMyJykge1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgICAgIGNvbnN0IHJlc3VsdFZhbHVlcyA9IEludDMyQXJyYXkuZnJvbSh2YWx1ZXMpO1xuICAgICAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyh4LnNoYXBlLCAnaW50MzInLCByZXN1bHRWYWx1ZXMpO1xuICAgIH1cbiAgICBpZiAoZHR5cGUgPT09ICdib29sJykge1xuICAgICAgICAvLyBUaGlzIGlzIGVzc2VudGlhbGx5IHRoZSByZXN1bHQgb2Ygbm90RXF1YWwoeCwgMCkuIFdlIGF2b2lkIHVzaW5nXG4gICAgICAgIC8vIGtlcm5lbCBub3RFcXVhbCB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmN5LCBpLmUuIGJpbmFyeV91dGlscyAtPlxuICAgICAgICAvLyBjYXN0IC0+IG5vdEVxdWFsIC0+IGJpbmFyeV91dGlscy5cbiAgICAgICAgY29uc3QgeFZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgICAgIGNvbnN0IHplcm8gPSB1dGlsLnRvVHlwZWRBcnJheShbMF0sIHguZHR5cGUpO1xuICAgICAgICBjb25zdCBbcmVzdWx0RGF0YSwgcmVzdWx0U2hhcGVdID0gY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoYSwgYikgPT4gKGEgIT09IGIpID8gMSA6IDApKHguc2hhcGUsIFtdLCB4VmFscywgemVybywgJ2Jvb2wnKTtcbiAgICAgICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVzdWx0U2hhcGUsICdib29sJywgcmVzdWx0RGF0YSk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgaW4gQ2FzdDogZmFpbGVkIHRvIGNhc3QgJHt4LmR0eXBlfSB0byAke2R0eXBlfWApO1xufVxuZXhwb3J0IGNvbnN0IGNhc3RDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQ2FzdCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogY2FzdFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNhc3QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IENlaWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlU2ltcGxlVW5hcnlJbXBsIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfaW1wbCc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmNGcm9tSW1wbCB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBjZWlsSW1wbCA9IGNyZWF0ZVNpbXBsZVVuYXJ5SW1wbCgoeGkpID0+IE1hdGguY2VpbCh4aSkpO1xuZXhwb3J0IGNvbnN0IGNlaWwgPSB1bmFyeUtlcm5lbEZ1bmNGcm9tSW1wbChDZWlsLCBjZWlsSW1wbCk7XG5leHBvcnQgY29uc3QgY2VpbENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBDZWlsLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBjZWlsLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNlaWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IENsaXBCeVZhbHVlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBjbGlwID0gdW5hcnlLZXJuZWxGdW5jKENsaXBCeVZhbHVlLCAoeGksIGF0dHJzKSA9PiB7XG4gICAgY29uc3QgY2xpcEF0dHJzID0gYXR0cnM7XG4gICAgaWYgKHhpID4gY2xpcEF0dHJzLmNsaXBWYWx1ZU1heCkge1xuICAgICAgICByZXR1cm4gY2xpcEF0dHJzLmNsaXBWYWx1ZU1heDtcbiAgICB9XG4gICAgcmV0dXJuIHhpIDwgY2xpcEF0dHJzLmNsaXBWYWx1ZU1pbiA/IGNsaXBBdHRycy5jbGlwVmFsdWVNaW4gOiB4aTtcbn0pO1xuZXhwb3J0IGNvbnN0IGNsaXBDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQ2xpcEJ5VmFsdWUsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGNsaXAsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q2xpcC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBDb21wbGV4IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiBjb21wbGV4KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IHJlYWwsIGltYWcgfSA9IGlucHV0cztcbiAgICBjb25zdCByZWFsVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQocmVhbC5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBpbWFnVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoaW1hZy5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBjb21wbGV4SW5mbyA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVhbC5zaGFwZSwgJ2NvbXBsZXg2NCcpO1xuICAgIGNvbnN0IGNvbXBsZXggPSBiYWNrZW5kLmRhdGEuZ2V0KGNvbXBsZXhJbmZvLmRhdGFJZCk7XG4gICAgLy8gVGhlIGNvbXBsZXggdGVuc29yIG93bnMgdGhlIHVuZGVybHlpbmcgcmVhbCBhbmQgaW1hZyB0ZW5zb3JJbmZvcywgb25seSB0aGVcbiAgICAvLyBjb21wbGV4IHRlbnNvciB0cmFja3MgcmVmQ291bnQsIHdoZW4gY29tcGxleERhdGEgaXMgZGlzcG9zZWQgdGhlXG4gICAgLy8gdW5kZXJseWluZyB0ZW5zb3JEYXRhIHdpbGwgYmUgZGlzcG9zZWQuXG4gICAgY29tcGxleC5jb21wbGV4VGVuc29ySW5mb3MgPSB7XG4gICAgICAgIHJlYWw6IGJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVhbC5zaGFwZSwgJ2Zsb2F0MzInLCByZWFsVmFscyksXG4gICAgICAgIGltYWc6IGJhY2tlbmQubWFrZVRlbnNvckluZm8oaW1hZy5zaGFwZSwgJ2Zsb2F0MzInLCBpbWFnVmFscylcbiAgICB9O1xuICAgIHJldHVybiBjb21wbGV4SW5mbztcbn1cbmV4cG9ydCBjb25zdCBjb21wbGV4Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IENvbXBsZXgsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGNvbXBsZXhcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db21wbGV4LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBDb21wbGV4QWJzLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBjb25zdCBjb21wbGV4QWJzID0gKGFyZ3MpID0+IHtcbiAgICBjb25zdCB7IHggfSA9IGFyZ3MuaW5wdXRzO1xuICAgIGNvbnN0IGNwdUJhY2tlbmQgPSBhcmdzLmJhY2tlbmQ7XG4gICAgY29uc3QgcmVzdWx0VmFsdWVzID0gbmV3IEZsb2F0MzJBcnJheSh1dGlsLnNpemVGcm9tU2hhcGUoeC5zaGFwZSkpO1xuICAgIGNvbnN0IGNvbXBsZXhWYWxzID0gY3B1QmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCk7XG4gICAgY29uc3QgcmVhbCA9IGNvbXBsZXhWYWxzLmNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsO1xuICAgIGNvbnN0IGltYWcgPSBjb21wbGV4VmFscy5jb21wbGV4VGVuc29ySW5mb3MuaW1hZztcbiAgICBjb25zdCByZWFsVmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQocmVhbC5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBpbWFnVmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoaW1hZy5kYXRhSWQpLnZhbHVlcztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlYWxWYWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHJlYWwgPSByZWFsVmFsc1tpXTtcbiAgICAgICAgY29uc3QgaW1hZyA9IGltYWdWYWxzW2ldO1xuICAgICAgICByZXN1bHRWYWx1ZXNbaV0gPSBNYXRoLmh5cG90KHJlYWwsIGltYWcpO1xuICAgIH1cbiAgICByZXR1cm4gY3B1QmFja2VuZC5tYWtlT3V0cHV0KHJlc3VsdFZhbHVlcywgeC5zaGFwZSwgJ2Zsb2F0MzInKTtcbn07XG5leHBvcnQgY29uc3QgY29tcGxleEFic0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBDb21wbGV4QWJzLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBjb21wbGV4QWJzLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbXBsZXhBYnMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBDb25jYXQsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY29tcGxleCB9IGZyb20gJy4vQ29tcGxleCc7XG5pbXBvcnQgeyBjb25jYXRJbXBsIH0gZnJvbSAnLi9Db25jYXRfaW1wbCc7XG5pbXBvcnQgeyBpZGVudGl0eSB9IGZyb20gJy4vSWRlbnRpdHknO1xuaW1wb3J0IHsgaW1hZyB9IGZyb20gJy4vSW1hZyc7XG5pbXBvcnQgeyByZWFsIH0gZnJvbSAnLi9SZWFsJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmNhdChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgYXhpcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgJGF4aXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIGlucHV0c1swXS5zaGFwZSlbMF07XG4gICAgbGV0IG91dFNoYXBlID0gYmFja2VuZF91dGlsLmNvbXB1dGVPdXRTaGFwZShpbnB1dHMubWFwKHQgPT4gdC5zaGFwZSksICRheGlzKTtcbiAgICBpZiAodXRpbC5zaXplRnJvbVNoYXBlKG91dFNoYXBlKSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRTaGFwZSwgaW5wdXRzWzBdLmR0eXBlLCBbXSk7XG4gICAgfVxuICAgIC8vIEtlZXAgb25seSBub24tZW1wdHkgdGVuc29ycyAoaWdub3JlIHRlbnNvcnMgd2l0aCAwIGluIHRoZWlyIHNoYXBlKS5cbiAgICBjb25zdCAkaW5wdXRzID0gaW5wdXRzLmZpbHRlcih0ID0+IHV0aWwuc2l6ZUZyb21TaGFwZSh0LnNoYXBlKSA+IDApO1xuICAgIGlmICgkaW5wdXRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gaWRlbnRpdHkoeyBpbnB1dHM6IHsgeDogJGlucHV0c1swXSB9LCBiYWNrZW5kIH0pO1xuICAgIH1cbiAgICBjb25zdCBzaGFwZXMgPSAkaW5wdXRzLm1hcCh0ID0+IHQuc2hhcGUpO1xuICAgIGJhY2tlbmRfdXRpbC5hc3NlcnRQYXJhbXNDb25zaXN0ZW50KHNoYXBlcywgJGF4aXMpO1xuICAgIGlmICgkaW5wdXRzWzBdLmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICBjb25zdCByZWFscyA9ICRpbnB1dHMubWFwKCh0KSA9PiByZWFsKHsgaW5wdXRzOiB7IGlucHV0OiB0IH0sIGJhY2tlbmQgfSkpO1xuICAgICAgICBjb25zdCBpbWFncyA9ICRpbnB1dHMubWFwKCh0KSA9PiBpbWFnKHsgaW5wdXRzOiB7IGlucHV0OiB0IH0sIGJhY2tlbmQgfSkpO1xuICAgICAgICBjb25zdCByZWFsQ29uY2F0ZWQgPSBjb25jYXQoeyBpbnB1dHM6IHJlYWxzLCBiYWNrZW5kLCBhdHRyczogeyBheGlzOiAkYXhpcyB9IH0pO1xuICAgICAgICBjb25zdCBpbWFnQ29uY2F0ZWQgPSBjb25jYXQoeyBpbnB1dHM6IGltYWdzLCBiYWNrZW5kLCBhdHRyczogeyBheGlzOiAkYXhpcyB9IH0pO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBjb21wbGV4KHsgaW5wdXRzOiB7IHJlYWw6IHJlYWxDb25jYXRlZCwgaW1hZzogaW1hZ0NvbmNhdGVkIH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIHJlYWxzLmZvckVhY2gociA9PiBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHIpKTtcbiAgICAgICAgaW1hZ3MuZm9yRWFjaChpID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaSkpO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlYWxDb25jYXRlZCk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaW1hZ0NvbmNhdGVkKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLy8gQW55IGNvbmNhdCBvZiBuLWRpbWVuc2lvbmFsIHRlbnNvcnMgYWNyb3NzIGFueSBheGlzIGNhbiBiZSByZWR1Y2VkIHRvXG4gICAgLy8gYSBjb25jYXRlbmF0aW9uIG9mIHR3by1kaW1lbnNpb25hbCB0ZW5zb3JzIGFjcm9zcyB0aGUgYXhpcyAxIGJ5IGZpcnN0XG4gICAgLy8gcGFydGl0aW9uaW5nIHRoZSBheGVzIG9mIHRoZSBvcmlnaW5hbCB0ZW5zb3JzIGludG8gdGhvc2UgbGVzcyB0aGFuIHRoZVxuICAgIC8vIGF4aXMgdG8gYmUgY29uY2F0ZW5hdGVkIGFuZCB0aGUgcmVzdC4gVGhlbiByZXNoYXBlIHRoZSB0ZW5zb3JzXG4gICAgLy8gaW50byBhIHR3by1kaW1lbnNpb25hbCB0ZW5zb3IgYnkgY29sbGFwc2luZyB0aGVzZSB0d28gc2V0cyBvZiBheGVzIGFuZFxuICAgIC8vIGNvbmNhdGVuYXRlIHRoZSByZXN1bHRpbmcgbWF0cmljZXMgYWNyb3NzIHRoZSBheGlzIDEsIGZpbmFsbHkgcmVzaGFwaW5nXG4gICAgLy8gdGhlIHJlc3VsdCB0byBoYXZlIHRoZSBwcm9wZXIgc2hhcGUuXG4gICAgY29uc3QgaW5wdXRzMkQgPSAkaW5wdXRzLm1hcCh0ID0+IHtcbiAgICAgICAgY29uc3QgaW5uZXJTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHQuc2hhcGUuc2xpY2UoJGF4aXMpKTtcbiAgICAgICAgY29uc3Qgc2hhcGUgPSBbLTEsIGlubmVyU2l6ZV07XG4gICAgICAgIHJldHVybiByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHQgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGUgfSB9KTtcbiAgICB9KTtcbiAgICBjb25zdCBpbnB1dHNWYWxTaGFwZXMgPSBpbnB1dHMyRC5tYXAodCA9PiB7XG4gICAgICAgIHJldHVybiB7IHZhbHM6IGJhY2tlbmQuZGF0YS5nZXQodC5kYXRhSWQpLnZhbHVlcywgc2hhcGU6IHQuc2hhcGUgfTtcbiAgICB9KTtcbiAgICAvLyBDb25jYXRzIDJkIHRlbnNvcnMgYWxvbmcgYXhpcz0xLlxuICAgIG91dFNoYXBlID1cbiAgICAgICAgYmFja2VuZF91dGlsLmNvbXB1dGVPdXRTaGFwZShpbnB1dHMyRC5tYXAodCA9PiB0LnNoYXBlKSwgMSAvKiBheGlzICovKTtcbiAgICBjb25zdCBzaW1wbHlDb25jYXQgPSBpbnB1dHMyRFswXS5zaGFwZVswXSA9PT0gMTtcbiAgICBjb25zdCBvdXRWYWxzID0gY29uY2F0SW1wbChpbnB1dHNWYWxTaGFwZXMsIG91dFNoYXBlLCBpbnB1dHNbMF0uZHR5cGUsIHNpbXBseUNvbmNhdCk7XG4gICAgY29uc3QgZmluYWxPdXRTaGFwZSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0U2hhcGUoJGlucHV0cy5tYXAodCA9PiB0LnNoYXBlKSwgJGF4aXMpO1xuICAgIGNvbnN0IG91dEluZm8gPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGZpbmFsT3V0U2hhcGUsIGlucHV0c1swXS5kdHlwZSwgb3V0VmFscyk7XG4gICAgaW5wdXRzMkQuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuICAgIHJldHVybiBvdXRJbmZvO1xufVxuZXhwb3J0IGNvbnN0IGNvbmNhdENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBDb25jYXQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGNvbmNhdFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbmNhdC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmNhdEltcGwoaW5wdXRzLCBvdXRTaGFwZSwgZHR5cGUsIHNpbXBseUNvbmNhdCkge1xuICAgIGNvbnN0IG91dFZhbHMgPSB1dGlsLmdldEFycmF5RnJvbURUeXBlKGR0eXBlLCB1dGlsLnNpemVGcm9tU2hhcGUob3V0U2hhcGUpKTtcbiAgICBpZiAoc2ltcGx5Q29uY2F0ICYmIGR0eXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBVc2UgYnVpbHQtaW4gVHlwZWRBcnJheS5zZXQoKSBtZXRob2QgZm9yIHNwZWVkLlxuICAgICAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICAgICAgaW5wdXRzLmZvckVhY2goaW5wdXQgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShpbnB1dC5zaGFwZSk7XG4gICAgICAgICAgICBvdXRWYWxzLnNldChpbnB1dC52YWxzLCBvZmZzZXQpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IHNpemU7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IGNvbE9mZnNldCA9IDA7XG4gICAgICAgIGlucHV0cy5mb3JFYWNoKGlucHV0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRlY29kZWREYXRhID0gZHR5cGUgPT09ICdzdHJpbmcnID9cbiAgICAgICAgICAgICAgICBiYWNrZW5kX3V0aWwuZnJvbVVpbnQ4VG9TdHJpbmdBcnJheShpbnB1dC52YWxzKSA6XG4gICAgICAgICAgICAgICAgaW5wdXQudmFscztcbiAgICAgICAgICAgIGxldCB0SWR4ID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGlucHV0LnNoYXBlWzBdOyArK3Jvdykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc0lkeCA9IHJvdyAqIG91dFNoYXBlWzFdICsgY29sT2Zmc2V0O1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IGlucHV0LnNoYXBlWzFdOyArK2NvbCkge1xuICAgICAgICAgICAgICAgICAgICBvdXRWYWxzW3Jlc0lkeCArIGNvbF0gPSBkZWNvZGVkRGF0YVt0SWR4KytdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbE9mZnNldCArPSBpbnB1dC5zaGFwZVsxXTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBvdXRWYWxzO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29uY2F0X2ltcGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBDb252MkQsIFRlbnNvckJ1ZmZlciwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnYyRChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCwgZmlsdGVyIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQsIGRpbGF0aW9ucywgZGltUm91bmRpbmdNb2RlIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KFt4LCBmaWx0ZXJdLCAnY29udjJkJyk7XG4gICAgY29uc3QgJGRhdGFGb3JtYXQgPSBiYWNrZW5kX3V0aWwuY29udmVydENvbnYyRERhdGFGb3JtYXQoZGF0YUZvcm1hdCk7XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZUNvbnYyREluZm8oeC5zaGFwZSwgZmlsdGVyLnNoYXBlLCBzdHJpZGVzLCBkaWxhdGlvbnMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCBmYWxzZSAvKiBkZXB0aHdpc2UgKi8sICRkYXRhRm9ybWF0KTtcbiAgICBjb25zdCBmaWx0ZXJIZWlnaHQgPSBjb252SW5mby5maWx0ZXJIZWlnaHQ7XG4gICAgY29uc3QgZmlsdGVyV2lkdGggPSBjb252SW5mby5maWx0ZXJXaWR0aDtcbiAgICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICAgIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICAgIGNvbnN0IHBhZExlZnQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgY29uc3QgcGFkVG9wID0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgaXNDaGFubmVsc0xhc3QgPSBjb252SW5mby5kYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNMYXN0JztcbiAgICBjb25zdCB5ID0gbmV3IFRlbnNvckJ1ZmZlcihjb252SW5mby5vdXRTaGFwZSwgeC5kdHlwZSk7XG4gICAgY29uc3QgeFN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKHguc2hhcGUpO1xuICAgIGNvbnN0IGZpbHRlclN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGZpbHRlci5zaGFwZSk7XG4gICAgY29uc3QgeEJhdGNoU3RyaWRlID0geFN0cmlkZXNbMF07XG4gICAgY29uc3QgeFJvd1N0cmlkZSA9IGlzQ2hhbm5lbHNMYXN0ID8geFN0cmlkZXNbMV0gOiB4U3RyaWRlc1syXTtcbiAgICBjb25zdCB4Q29sU3RyaWRlID0gaXNDaGFubmVsc0xhc3QgPyB4U3RyaWRlc1syXSA6IDE7XG4gICAgY29uc3QgeENoYW5uZWxTdHJpZGUgPSBpc0NoYW5uZWxzTGFzdCA/IDEgOiB4U3RyaWRlc1sxXTtcbiAgICBjb25zdCB5QmF0Y2hTdHJpZGUgPSB5LnN0cmlkZXNbMF07XG4gICAgY29uc3QgeVJvd1N0cmlkZSA9IGlzQ2hhbm5lbHNMYXN0ID8geS5zdHJpZGVzWzFdIDogeS5zdHJpZGVzWzJdO1xuICAgIGNvbnN0IHlDb2xTdHJpZGUgPSBpc0NoYW5uZWxzTGFzdCA/IHkuc3RyaWRlc1syXSA6IDE7XG4gICAgY29uc3QgeUNoYW5uZWxTdHJpZGUgPSBpc0NoYW5uZWxzTGFzdCA/IDEgOiB5LnN0cmlkZXNbMV07XG4gICAgY29uc3QgeFZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3Qgd1ZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KGZpbHRlci5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCB5VmFscyA9IHkudmFsdWVzO1xuICAgIGZvciAobGV0IGIgPSAwOyBiIDwgY29udkluZm8uYmF0Y2hTaXplOyArK2IpIHtcbiAgICAgICAgY29uc3QgeE9mZnNldDEgPSBiICogeEJhdGNoU3RyaWRlO1xuICAgICAgICBjb25zdCB5T2Zmc2V0MSA9IGIgKiB5QmF0Y2hTdHJpZGU7XG4gICAgICAgIGZvciAobGV0IHlSID0gMDsgeVIgPCBjb252SW5mby5vdXRIZWlnaHQ7ICsreVIpIHtcbiAgICAgICAgICAgIGNvbnN0IHlPZmZzZXQyID0geU9mZnNldDEgKyB5UiAqIHlSb3dTdHJpZGU7XG4gICAgICAgICAgICBjb25zdCB4UkNvcm5lciA9IHlSICogY29udkluZm8uc3RyaWRlSGVpZ2h0IC0gcGFkVG9wO1xuICAgICAgICAgICAgZm9yIChsZXQgd1IgPSAwOyB3UiA8IGZpbHRlckhlaWdodDsgKyt3Uikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhSID0geFJDb3JuZXIgKyB3UiAqIGRpbGF0aW9uSGVpZ2h0O1xuICAgICAgICAgICAgICAgIGlmICh4UiA8IDAgfHwgeFIgPj0gY29udkluZm8uaW5IZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHdPZmZzZXQxID0gd1IgKiBmaWx0ZXJTdHJpZGVzWzBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHhPZmZzZXQyID0geE9mZnNldDEgKyB4UiAqIHhSb3dTdHJpZGU7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgeUMgPSAwOyB5QyA8IGNvbnZJbmZvLm91dFdpZHRoOyArK3lDKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHlPZmZzZXQzID0geU9mZnNldDIgKyB5QyAqIHlDb2xTdHJpZGU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhDQ29ybmVyID0geUMgKiBjb252SW5mby5zdHJpZGVXaWR0aCAtIHBhZExlZnQ7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHdDID0gMDsgd0MgPCBmaWx0ZXJXaWR0aDsgKyt3Qykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeEMgPSB4Q0Nvcm5lciArIHdDICogZGlsYXRpb25XaWR0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4QyA8IDAgfHwgeEMgPj0gY29udkluZm8uaW5XaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd09mZnNldDIgPSB3T2Zmc2V0MSArIHdDICogZmlsdGVyU3RyaWRlc1sxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhPZmZzZXQzID0geE9mZnNldDIgKyB4QyAqIHhDb2xTdHJpZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgd09mZnNldDMgPSB3T2Zmc2V0MjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGQxID0gMDsgZDEgPCBjb252SW5mby5pbkNoYW5uZWxzOyArK2QxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeFZhbCA9IHhWYWxzW3hPZmZzZXQzICsgZDEgKiB4Q2hhbm5lbFN0cmlkZV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgZDIgPSAwOyBkMiA8IGNvbnZJbmZvLm91dENoYW5uZWxzOyArK2QyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlWYWxzW3lPZmZzZXQzICsgZDIgKiB5Q2hhbm5lbFN0cmlkZV0gKz1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWYWwgKiB3VmFsc1t3T2Zmc2V0MyArIGQyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd09mZnNldDMgKz0gY29udkluZm8ub3V0Q2hhbm5lbHM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oeS5zaGFwZSwgeS5kdHlwZSwgeVZhbHMpO1xufVxuZXhwb3J0IGNvbnN0IGNvbnYyRENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBDb252MkQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGNvbnYyRFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbnYyRC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIENvbnYyREJhY2twcm9wRmlsdGVyLCBUZW5zb3JCdWZmZXIgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBjb252MkRCYWNrcHJvcEZpbHRlcihhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCwgZHkgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGltUm91bmRpbmdNb2RlLCBmaWx0ZXJTaGFwZSB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChbeCwgZHldLCAnY29udjJkQmFja3Byb3BGaWx0ZXInKTtcbiAgICBjb25zdCAkZGF0YUZvcm1hdCA9IGJhY2tlbmRfdXRpbC5jb252ZXJ0Q29udjJERGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyh4LnNoYXBlLCBmaWx0ZXJTaGFwZSwgc3RyaWRlcywgMSAvKiBkaWxhdGlvbnMgKi8sIHBhZCwgZGltUm91bmRpbmdNb2RlLCBmYWxzZSAvKiBkZXB0aHdpc2UgKi8sICRkYXRhRm9ybWF0KTtcbiAgICBjb25zdCB7IHN0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGggfSA9IGNvbnZJbmZvO1xuICAgIGNvbnN0IGlzQ2hhbm5lbHNMYXN0ID0gY29udkluZm8uZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzTGFzdCc7XG4gICAgY29uc3QgZFcgPSBuZXcgVGVuc29yQnVmZmVyKGNvbnZJbmZvLmZpbHRlclNoYXBlLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IGxlZnRQYWQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgY29uc3QgdG9wUGFkID0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgeFZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgZHlWYWxzID0gYmFja2VuZC5kYXRhLmdldChkeS5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCB4QnVmID0gbmV3IFRlbnNvckJ1ZmZlcih4LnNoYXBlLCB4LmR0eXBlLCB4VmFscyk7XG4gICAgY29uc3QgZHlCdWYgPSBuZXcgVGVuc29yQnVmZmVyKGR5LnNoYXBlLCBkeS5kdHlwZSwgZHlWYWxzKTtcbiAgICBmb3IgKGxldCB3UiA9IDA7IHdSIDwgZmlsdGVySGVpZ2h0OyArK3dSKSB7XG4gICAgICAgIGNvbnN0IHlSTWluID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKCh0b3BQYWQgLSB3UikgLyBzdHJpZGVIZWlnaHQpKTtcbiAgICAgICAgY29uc3QgeVJNYXggPSBNYXRoLm1pbihjb252SW5mby5vdXRIZWlnaHQsIChjb252SW5mby5pbkhlaWdodCArIHRvcFBhZCAtIHdSKSAvIHN0cmlkZUhlaWdodCk7XG4gICAgICAgIGZvciAobGV0IHdDID0gMDsgd0MgPCBmaWx0ZXJXaWR0aDsgKyt3Qykge1xuICAgICAgICAgICAgY29uc3QgeUNNaW4gPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoKGxlZnRQYWQgLSB3QykgLyBzdHJpZGVXaWR0aCkpO1xuICAgICAgICAgICAgY29uc3QgeUNNYXggPSBNYXRoLm1pbihjb252SW5mby5vdXRXaWR0aCwgKGNvbnZJbmZvLmluV2lkdGggKyBsZWZ0UGFkIC0gd0MpIC8gc3RyaWRlV2lkdGgpO1xuICAgICAgICAgICAgZm9yIChsZXQgZDEgPSAwOyBkMSA8IGNvbnZJbmZvLmluQ2hhbm5lbHM7ICsrZDEpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBkMiA9IDA7IGQyIDwgY29udkluZm8ub3V0Q2hhbm5lbHM7ICsrZDIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRvdFByb2QgPSAwO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBiID0gMDsgYiA8IGNvbnZJbmZvLmJhdGNoU2l6ZTsgKytiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB5UiA9IHlSTWluOyB5UiA8IHlSTWF4OyArK3lSKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeFIgPSB3UiArIHlSICogc3RyaWRlSGVpZ2h0IC0gdG9wUGFkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHlDID0geUNNaW47IHlDIDwgeUNNYXg7ICsreUMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeEMgPSB3QyArIHlDICogc3RyaWRlV2lkdGggLSBsZWZ0UGFkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNDaGFubmVsc0xhc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdFByb2QgKz0geEJ1Zi5nZXQoYiwgeFIsIHhDLCBkMSkgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5QnVmLmdldChiLCB5UiwgeUMsIGQyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdFByb2QgKz0geEJ1Zi5nZXQoYiwgZDEsIHhSLCB4QykgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5QnVmLmdldChiLCBkMiwgeVIsIHlDKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkVy5zZXQoZG90UHJvZCwgd1IsIHdDLCBkMSwgZDIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhkVy5zaGFwZSwgZFcuZHR5cGUsIGRXLnZhbHVlcyk7XG59XG5leHBvcnQgY29uc3QgY29udjJEQmFja3Byb3BGaWx0ZXJDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQ29udjJEQmFja3Byb3BGaWx0ZXIsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGNvbnYyREJhY2twcm9wRmlsdGVyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29udjJEQmFja3Byb3BGaWx0ZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBDb252MkRCYWNrcHJvcElucHV0LCBUZW5zb3JCdWZmZXIsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBjb252MkRCYWNrcHJvcElucHV0KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBkeSwgZmlsdGVyIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBpbnB1dFNoYXBlLCBzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQsIGRpbVJvdW5kaW5nTW9kZSB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChbZHksIGZpbHRlcl0sICdjb252MmRCYWNrcHJvcElucHV0Jyk7XG4gICAgY29uc3QgZmlsdGVyU3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoZmlsdGVyLnNoYXBlKTtcbiAgICBjb25zdCBkeVN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGR5LnNoYXBlKTtcbiAgICBsZXQgJGRhdGFGb3JtYXQgPSBiYWNrZW5kX3V0aWwuY29udmVydENvbnYyRERhdGFGb3JtYXQoZGF0YUZvcm1hdCk7XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZUNvbnYyREluZm8oaW5wdXRTaGFwZSwgZmlsdGVyLnNoYXBlLCBzdHJpZGVzLCAxIC8qIGRpbGF0aW9ucyAqLywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGZhbHNlLCAkZGF0YUZvcm1hdCk7XG4gICAgY29uc3QgZHggPSBuZXcgVGVuc29yQnVmZmVyKGNvbnZJbmZvLmluU2hhcGUsICdmbG9hdDMyJyk7XG4gICAgY29uc3QgZHhWYWx1ZXMgPSBkeC52YWx1ZXM7XG4gICAgY29uc3QgZHlWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGR5LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IGZsdFZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoZmlsdGVyLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IFtmbHRTMCwgZmx0UzEsIGZsdFMyXSA9IGZpbHRlclN0cmlkZXM7XG4gICAgY29uc3QgeyBiYXRjaFNpemUsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGluQ2hhbm5lbHMsIGluSGVpZ2h0LCBpbldpZHRoLCBvdXRDaGFubmVscywgb3V0SGVpZ2h0LCBvdXRXaWR0aCwgc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aCB9ID0gY29udkluZm87XG4gICAgJGRhdGFGb3JtYXQgPSBjb252SW5mby5kYXRhRm9ybWF0O1xuICAgIGNvbnN0IHRvcFBhZCA9IGZpbHRlckhlaWdodCAtIDEgLSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICBjb25zdCBsZWZ0UGFkID0gZmlsdGVyV2lkdGggLSAxIC0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgIGNvbnN0IGlzQ2hhbm5lbHNMYXN0ID0gJGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnO1xuICAgIGNvbnN0IHhCYXRjaFN0cmlkZSA9IGR4LnN0cmlkZXNbMF07XG4gICAgY29uc3QgeFJvd1N0cmlkZSA9IGlzQ2hhbm5lbHNMYXN0ID8gZHguc3RyaWRlc1sxXSA6IGR4LnN0cmlkZXNbMl07XG4gICAgY29uc3QgeENvbFN0cmlkZSA9IGlzQ2hhbm5lbHNMYXN0ID8gZHguc3RyaWRlc1syXSA6IDE7XG4gICAgY29uc3QgeENoYW5uZWxTdHJpZGUgPSBpc0NoYW5uZWxzTGFzdCA/IDEgOiBkeC5zdHJpZGVzWzFdO1xuICAgIGNvbnN0IHlCYXRjaFN0cmlkZSA9IGR5U3RyaWRlc1swXTtcbiAgICBjb25zdCB5Um93U3RyaWRlID0gaXNDaGFubmVsc0xhc3QgPyBkeVN0cmlkZXNbMV0gOiBkeVN0cmlkZXNbMl07XG4gICAgY29uc3QgeUNvbFN0cmlkZSA9IGlzQ2hhbm5lbHNMYXN0ID8gZHlTdHJpZGVzWzJdIDogMTtcbiAgICBjb25zdCB5Q2hhbm5lbFN0cmlkZSA9IGlzQ2hhbm5lbHNMYXN0ID8gMSA6IGR5U3RyaWRlc1sxXTtcbiAgICBmb3IgKGxldCBiID0gMDsgYiA8IGJhdGNoU2l6ZTsgKytiKSB7XG4gICAgICAgIGZvciAobGV0IGQxID0gMDsgZDEgPCBpbkNoYW5uZWxzOyArK2QxKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB4UiA9IDA7IHhSIDwgaW5IZWlnaHQ7ICsreFIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4UkNvcm5lciA9IHhSIC0gdG9wUGFkO1xuICAgICAgICAgICAgICAgIGNvbnN0IHhSTWluID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKHhSQ29ybmVyIC8gc3RyaWRlSGVpZ2h0KSk7XG4gICAgICAgICAgICAgICAgY29uc3QgeVJNYXggPSBNYXRoLm1pbihvdXRIZWlnaHQsIChmaWx0ZXJIZWlnaHQgKyB4UkNvcm5lcikgLyBzdHJpZGVIZWlnaHQpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHhDID0gMDsgeEMgPCBpbldpZHRoOyArK3hDKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhDQ29ybmVyID0geEMgLSBsZWZ0UGFkO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4Q01pbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCh4Q0Nvcm5lciAvIHN0cmlkZVdpZHRoKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHlDTWF4ID0gTWF0aC5taW4ob3V0V2lkdGgsIChmaWx0ZXJXaWR0aCArIHhDQ29ybmVyKSAvIHN0cmlkZVdpZHRoKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRvdFByb2QgPSAwO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB5UiA9IHhSTWluOyB5UiA8IHlSTWF4OyArK3lSKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3UiA9IHlSICogc3RyaWRlSGVpZ2h0IC0geFJDb3JuZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB5QyA9IHhDTWluOyB5QyA8IHlDTWF4OyArK3lDKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd0MgPSB5QyAqIHN0cmlkZVdpZHRoIC0geENDb3JuZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHlPZmZzZXQgPSB5QmF0Y2hTdHJpZGUgKiBiICsgeVJvd1N0cmlkZSAqIHlSICsgeUNvbFN0cmlkZSAqIHlDO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsdE9mZnNldCA9IGZsdFMwICogKGZpbHRlckhlaWdodCAtIDEgLSB3UikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHRTMSAqIChmaWx0ZXJXaWR0aCAtIDEgLSB3QykgKyBmbHRTMiAqIGQxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGQyID0gMDsgZDIgPCBvdXRDaGFubmVsczsgKytkMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwaXhlbCA9IGR5VmFsdWVzW2R5T2Zmc2V0ICsgeUNoYW5uZWxTdHJpZGUgKiBkMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdlaWdodCA9IGZsdFZhbHVlc1tmbHRPZmZzZXQgKyBkMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdFByb2QgKz0gcGl4ZWwgKiB3ZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGR4T2Zmc2V0ID0geEJhdGNoU3RyaWRlICogYiArIHhSb3dTdHJpZGUgKiB4UiArXG4gICAgICAgICAgICAgICAgICAgICAgICB4Q29sU3RyaWRlICogeEMgKyB4Q2hhbm5lbFN0cmlkZSAqIGQxO1xuICAgICAgICAgICAgICAgICAgICBkeFZhbHVlc1tkeE9mZnNldF0gPSBkb3RQcm9kO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhkeC5zaGFwZSwgZHguZHR5cGUsIGR4LnZhbHVlcyk7XG59XG5leHBvcnQgY29uc3QgY29udjJEQmFja3Byb3BJbnB1dENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBDb252MkRCYWNrcHJvcElucHV0LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBjb252MkRCYWNrcHJvcElucHV0XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29udjJEQmFja3Byb3BJbnB1dC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIENvbnYzRCwgVGVuc29yQnVmZmVyLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5leHBvcnQgZnVuY3Rpb24gY29udjNEKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4LCBmaWx0ZXIgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHN0cmlkZXMsIHBhZCwgZGlsYXRpb25zIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KFt4LCBmaWx0ZXJdLCAnY29udjNkJyk7XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZUNvbnYzREluZm8oeC5zaGFwZSwgZmlsdGVyLnNoYXBlLCBzdHJpZGVzLCBkaWxhdGlvbnMsIHBhZCk7XG4gICAgY29uc3QgeyBmaWx0ZXJEZXB0aCwgZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgZGlsYXRpb25EZXB0aCwgZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGgsIHBhZEluZm8gfSA9IGNvbnZJbmZvO1xuICAgIGNvbnN0IHBhZEZyb250ID0gcGFkSW5mby5mcm9udDtcbiAgICBjb25zdCBwYWRMZWZ0ID0gcGFkSW5mby5sZWZ0O1xuICAgIGNvbnN0IHBhZFRvcCA9IHBhZEluZm8udG9wO1xuICAgIGNvbnN0IHkgPSBuZXcgVGVuc29yQnVmZmVyKGNvbnZJbmZvLm91dFNoYXBlLCB4LmR0eXBlKTtcbiAgICBjb25zdCB4VmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCB3VmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoZmlsdGVyLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHlWYWxzID0geS52YWx1ZXM7XG4gICAgY29uc3QgeFN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKHguc2hhcGUpO1xuICAgIGNvbnN0IGZpbHRlclN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGZpbHRlci5zaGFwZSk7XG4gICAgZm9yIChsZXQgYiA9IDA7IGIgPCBjb252SW5mby5iYXRjaFNpemU7ICsrYikge1xuICAgICAgICBjb25zdCB4T2Zmc2V0MSA9IGIgKiB4U3RyaWRlc1swXTtcbiAgICAgICAgY29uc3QgeU9mZnNldDEgPSBiICogeS5zdHJpZGVzWzBdO1xuICAgICAgICBmb3IgKGxldCB5RiA9IDA7IHlGIDwgY29udkluZm8ub3V0RGVwdGg7ICsreUYpIHtcbiAgICAgICAgICAgIGNvbnN0IHlPZmZzZXQyID0geU9mZnNldDEgKyB5RiAqIHkuc3RyaWRlc1sxXTtcbiAgICAgICAgICAgIGNvbnN0IHhGQ29ybmVyID0geUYgKiBjb252SW5mby5zdHJpZGVEZXB0aCAtIHBhZEZyb250O1xuICAgICAgICAgICAgZm9yIChsZXQgd0YgPSAwOyB3RiA8IGZpbHRlckRlcHRoOyArK3dGKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeEYgPSB4RkNvcm5lciArIHdGICogZGlsYXRpb25EZXB0aDtcbiAgICAgICAgICAgICAgICBpZiAoeEYgPCAwIHx8IHhGID49IGNvbnZJbmZvLmluRGVwdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHdPZmZzZXQxID0gd0YgKiBmaWx0ZXJTdHJpZGVzWzBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHhPZmZzZXQyID0geE9mZnNldDEgKyB4RiAqIHhTdHJpZGVzWzFdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHlSID0gMDsgeVIgPCBjb252SW5mby5vdXRIZWlnaHQ7ICsreVIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeU9mZnNldDMgPSB5T2Zmc2V0MiArIHlSICogeS5zdHJpZGVzWzJdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4UkNvcm5lciA9IHlSICogY29udkluZm8uc3RyaWRlSGVpZ2h0IC0gcGFkVG9wO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB3UiA9IDA7IHdSIDwgZmlsdGVySGVpZ2h0OyArK3dSKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4UiA9IHhSQ29ybmVyICsgd1IgKiBkaWxhdGlvbkhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4UiA8IDAgfHwgeFIgPj0gY29udkluZm8uaW5IZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdPZmZzZXQyID0gd09mZnNldDEgKyB3UiAqIGZpbHRlclN0cmlkZXNbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4T2Zmc2V0MyA9IHhPZmZzZXQyICsgeFIgKiB4U3RyaWRlc1syXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHlDID0gMDsgeUMgPCBjb252SW5mby5vdXRXaWR0aDsgKyt5Qykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHlPZmZzZXQ0ID0geU9mZnNldDMgKyB5QyAqIGNvbnZJbmZvLm91dENoYW5uZWxzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhDQ29ybmVyID0geUMgKiBjb252SW5mby5zdHJpZGVXaWR0aCAtIHBhZExlZnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgd0MgPSAwOyB3QyA8IGZpbHRlcldpZHRoOyArK3dDKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhDID0geENDb3JuZXIgKyB3QyAqIGRpbGF0aW9uV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4QyA8IDAgfHwgeEMgPj0gY29udkluZm8uaW5XaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd09mZnNldDMgPSB3T2Zmc2V0MiArIHdDICogZmlsdGVyU3RyaWRlc1syXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeE9mZnNldDQgPSB4T2Zmc2V0MyArIHhDICogY29udkluZm8uaW5DaGFubmVscztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHdPZmZzZXQ0ID0gd09mZnNldDM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGQxID0gMDsgZDEgPCBjb252SW5mby5pbkNoYW5uZWxzOyArK2QxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4VmFsID0geFZhbHNbeE9mZnNldDQgKyBkMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBkMiA9IDA7IGQyIDwgY29udkluZm8ub3V0Q2hhbm5lbHM7ICsrZDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5VmFsc1t5T2Zmc2V0NCArIGQyXSArPSB4VmFsICogd1ZhbHNbd09mZnNldDQgKyBkMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3T2Zmc2V0NCArPSBjb252SW5mby5vdXRDaGFubmVscztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyh5LnNoYXBlLCB5LmR0eXBlLCB5LnZhbHVlcyk7XG59XG5leHBvcnQgY29uc3QgY29udjNEQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IENvbnYzRCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogY29udjNEXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29udjNELmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgQ29udjNEQmFja3Byb3BGaWx0ZXJWMiwgVGVuc29yQnVmZmVyLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5leHBvcnQgZnVuY3Rpb24gY29udjNEQmFja3Byb3BGaWx0ZXJWMihhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCwgZHkgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHN0cmlkZXMsIHBhZCwgZmlsdGVyU2hhcGUgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoW3gsIGR5XSwgJ2NvbnYzZEJhY2twcm9wRmlsdGVyVjInKTtcbiAgICBjb25zdCB4U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoeC5zaGFwZSk7XG4gICAgY29uc3QgZHlTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhkeS5zaGFwZSk7XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZUNvbnYzREluZm8oeC5zaGFwZSwgZmlsdGVyU2hhcGUsIHN0cmlkZXMsIDEgLyogZGlsYXRpb25zICovLCBwYWQpO1xuICAgIGNvbnN0IHN0cmlkZURlcHRoID0gY29udkluZm8uc3RyaWRlRGVwdGg7XG4gICAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgY29uc3QgZmlsdGVyRGVwdGggPSBjb252SW5mby5maWx0ZXJEZXB0aDtcbiAgICBjb25zdCBmaWx0ZXJIZWlnaHQgPSBjb252SW5mby5maWx0ZXJIZWlnaHQ7XG4gICAgY29uc3QgZmlsdGVyV2lkdGggPSBjb252SW5mby5maWx0ZXJXaWR0aDtcbiAgICBjb25zdCBkdyA9IG5ldyBUZW5zb3JCdWZmZXIoY29udkluZm8uZmlsdGVyU2hhcGUsICdmbG9hdDMyJyk7XG4gICAgY29uc3QgZHdWYWx1ZXMgPSBkdy52YWx1ZXM7XG4gICAgY29uc3QgW2R3UzAsIGR3UzEsIGR3UzIsIGR3UzNdID0gZHcuc3RyaWRlcztcbiAgICBjb25zdCBkeVZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoZHkuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgW2R5UzAsIGR5UzEsIGR5UzIsIGR5UzNdID0gZHlTdHJpZGVzO1xuICAgIGNvbnN0IHhWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgW3hTMCwgeFMxLCB4UzIsIHhTM10gPSB4U3RyaWRlcztcbiAgICBjb25zdCBmcm9udFBhZCA9IGNvbnZJbmZvLnBhZEluZm8uZnJvbnQ7XG4gICAgY29uc3QgbGVmdFBhZCA9IGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICBjb25zdCB0b3BQYWQgPSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICBmb3IgKGxldCB3RiA9IDA7IHdGIDwgZmlsdGVyRGVwdGg7ICsrd0YpIHtcbiAgICAgICAgY29uc3QgeUZNaW4gPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoKGZyb250UGFkIC0gd0YpIC8gc3RyaWRlRGVwdGgpKTtcbiAgICAgICAgY29uc3QgeUZNYXggPSBNYXRoLm1pbihjb252SW5mby5vdXREZXB0aCwgKGNvbnZJbmZvLmluRGVwdGggKyBmcm9udFBhZCAtIHdGKSAvIHN0cmlkZURlcHRoKTtcbiAgICAgICAgY29uc3Qgd09mZnNldDEgPSB3RiAqIGR3UzA7XG4gICAgICAgIGZvciAobGV0IHdSID0gMDsgd1IgPCBmaWx0ZXJIZWlnaHQ7ICsrd1IpIHtcbiAgICAgICAgICAgIGNvbnN0IHlSTWluID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKCh0b3BQYWQgLSB3UikgLyBzdHJpZGVIZWlnaHQpKTtcbiAgICAgICAgICAgIGNvbnN0IHlSTWF4ID0gTWF0aC5taW4oY29udkluZm8ub3V0SGVpZ2h0LCAoY29udkluZm8uaW5IZWlnaHQgKyB0b3BQYWQgLSB3UikgLyBzdHJpZGVIZWlnaHQpO1xuICAgICAgICAgICAgY29uc3Qgd09mZnNldDIgPSB3UiAqIGR3UzEgKyB3T2Zmc2V0MTtcbiAgICAgICAgICAgIGZvciAobGV0IHdDID0gMDsgd0MgPCBmaWx0ZXJXaWR0aDsgKyt3Qykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHlDTWluID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKChsZWZ0UGFkIC0gd0MpIC8gc3RyaWRlV2lkdGgpKTtcbiAgICAgICAgICAgICAgICBjb25zdCB5Q01heCA9IE1hdGgubWluKGNvbnZJbmZvLm91dFdpZHRoLCAoY29udkluZm8uaW5XaWR0aCArIGxlZnRQYWQgLSB3QykgLyBzdHJpZGVXaWR0aCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgd09mZnNldDMgPSB3QyAqIGR3UzIgKyB3T2Zmc2V0MjtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBkMSA9IDA7IGQxIDwgY29udkluZm8uaW5DaGFubmVsczsgKytkMSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB3T2Zmc2V0NCA9IGQxICogZHdTMyArIHdPZmZzZXQzO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBkMiA9IDA7IGQyIDwgY29udkluZm8ub3V0Q2hhbm5lbHM7ICsrZDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkb3RQcm9kID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGIgPSAwOyBiIDwgY29udkluZm8uYmF0Y2hTaXplOyArK2IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4T2Zmc2V0MSA9IGIgKiB4UzA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeU9mZnNldDEgPSBiICogZHlTMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB5RiA9IHlGTWluOyB5RiA8IHlGTWF4OyArK3lGKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhGID0gd0YgKyB5RiAqIHN0cmlkZURlcHRoIC0gZnJvbnRQYWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhPZmZzZXQyID0geEYgKiB4UzEgKyB4T2Zmc2V0MTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeU9mZnNldDIgPSB5RiAqIGR5UzEgKyB5T2Zmc2V0MTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgeVIgPSB5Uk1pbjsgeVIgPCB5Uk1heDsgKyt5Uikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeFIgPSB3UiArIHlSICogc3RyaWRlSGVpZ2h0IC0gdG9wUGFkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeE9mZnNldDMgPSB4UiAqIHhTMiArIHhPZmZzZXQyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeU9mZnNldDMgPSB5UiAqIGR5UzIgKyB5T2Zmc2V0MjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHlDID0geUNNaW47IHlDIDwgeUNNYXg7ICsreUMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4QyA9IHdDICsgeUMgKiBzdHJpZGVXaWR0aCAtIGxlZnRQYWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeE9mZnNldDQgPSB4QyAqIHhTMyArIHhPZmZzZXQzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHlPZmZzZXQ0ID0geUMgKiBkeVMzICsgeU9mZnNldDM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG90UHJvZCArPSB4VmFsdWVzW3hPZmZzZXQ0ICsgZDFdICogZHlWYWx1ZXNbeU9mZnNldDQgKyBkMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBkd1ZhbHVlc1t3T2Zmc2V0NCArIGQyXSA9IGRvdFByb2Q7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oZHcuc2hhcGUsIGR3LmR0eXBlLCBkdy52YWx1ZXMpO1xufVxuZXhwb3J0IGNvbnN0IGNvbnYzREJhY2twcm9wRmlsdGVyVjJDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQ29udjNEQmFja3Byb3BGaWx0ZXJWMixcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogY29udjNEQmFja3Byb3BGaWx0ZXJWMlxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbnYzREJhY2twcm9wRmlsdGVyVjIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBDb252M0RCYWNrcHJvcElucHV0VjIsIFRlbnNvckJ1ZmZlciwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnYzREJhY2twcm9wSW5wdXRWMihhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgZHksIGZpbHRlciB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgcGFkLCBzdHJpZGVzLCBpbnB1dFNoYXBlIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KFtkeV0sICdjb252M2RCYWNrcHJvcElucHV0VjInKTtcbiAgICBjb25zdCBkeVN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGR5LnNoYXBlKTtcbiAgICBjb25zdCBmaWx0ZXJTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhmaWx0ZXIuc2hhcGUpO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252M0RJbmZvKGlucHV0U2hhcGUsIGZpbHRlci5zaGFwZSwgc3RyaWRlcywgMSAvKiBkaWxhdGlvbnMgKi8sIHBhZCk7XG4gICAgY29uc3QgZHggPSBuZXcgVGVuc29yQnVmZmVyKGNvbnZJbmZvLmluU2hhcGUsICdmbG9hdDMyJyk7XG4gICAgY29uc3QgZHhWYWx1ZXMgPSBkeC52YWx1ZXM7XG4gICAgY29uc3QgW2R4UzAsIGR4UzEsIGR4UzIsIGR4UzNdID0gZHguc3RyaWRlcztcbiAgICBjb25zdCBkeVZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoZHkuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgW2R5UzAsIGR5UzEsIGR5UzIsIGR5UzNdID0gZHlTdHJpZGVzO1xuICAgIGNvbnN0IGZsdFZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoZmlsdGVyLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IFtmbHRTMCwgZmx0UzEsIGZsdFMyLCBmbHRTM10gPSBmaWx0ZXJTdHJpZGVzO1xuICAgIGNvbnN0IHsgYmF0Y2hTaXplLCBmaWx0ZXJEZXB0aCwgZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5DaGFubmVscywgaW5EZXB0aCwgaW5IZWlnaHQsIGluV2lkdGgsIG91dENoYW5uZWxzLCBvdXREZXB0aCwgb3V0SGVpZ2h0LCBvdXRXaWR0aCwgc3RyaWRlRGVwdGgsIHN0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGggfSA9IGNvbnZJbmZvO1xuICAgIGNvbnN0IGZyb250UGFkID0gZmlsdGVyRGVwdGggLSAxIC0gY29udkluZm8ucGFkSW5mby5mcm9udDtcbiAgICBjb25zdCB0b3BQYWQgPSBmaWx0ZXJIZWlnaHQgLSAxIC0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgbGVmdFBhZCA9IGZpbHRlcldpZHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICBmb3IgKGxldCBiID0gMDsgYiA8IGJhdGNoU2l6ZTsgKytiKSB7XG4gICAgICAgIGZvciAobGV0IGQxID0gMDsgZDEgPCBpbkNoYW5uZWxzOyArK2QxKSB7XG4gICAgICAgICAgICAvLyBGcmFtZXMgb2YgZGVwdGhcbiAgICAgICAgICAgIGZvciAobGV0IHhGID0gMDsgeEYgPCBpbkRlcHRoOyArK3hGKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeEZDb3JuZXIgPSB4RiAtIGZyb250UGFkO1xuICAgICAgICAgICAgICAgIGNvbnN0IHhGTWluID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKHhGQ29ybmVyIC8gc3RyaWRlRGVwdGgpKTtcbiAgICAgICAgICAgICAgICBjb25zdCB5Rk1heCA9IE1hdGgubWluKG91dERlcHRoLCAoZmlsdGVyRGVwdGggKyB4RkNvcm5lcikgLyBzdHJpZGVEZXB0aCk7XG4gICAgICAgICAgICAgICAgLy8gUm93cyBhcyBwZXIgc3RhbmRhcmQgMmQgbWF0cml4IG5vdGF0aW9uXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgeFIgPSAwOyB4UiA8IGluSGVpZ2h0OyArK3hSKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhSQ29ybmVyID0geFIgLSB0b3BQYWQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhSTWluID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKHhSQ29ybmVyIC8gc3RyaWRlSGVpZ2h0KSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHlSTWF4ID0gTWF0aC5taW4ob3V0SGVpZ2h0LCAoZmlsdGVySGVpZ2h0ICsgeFJDb3JuZXIpIC8gc3RyaWRlSGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ29sdW1ucyBhcyBwZXIgc3RhbmRhcmQgMmQgbWF0cml4IG5vdGF0aW9uXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHhDID0gMDsgeEMgPCBpbldpZHRoOyArK3hDKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4Q0Nvcm5lciA9IHhDIC0gbGVmdFBhZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhDTWluID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKHhDQ29ybmVyIC8gc3RyaWRlV2lkdGgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHlDTWF4ID0gTWF0aC5taW4ob3V0V2lkdGgsIChmaWx0ZXJXaWR0aCArIHhDQ29ybmVyKSAvIHN0cmlkZVdpZHRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkb3RQcm9kID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHlGID0geEZNaW47IHlGIDwgeUZNYXg7ICsreUYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3RiA9IHlGICogc3RyaWRlRGVwdGggLSB4RkNvcm5lcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB5UiA9IHhSTWluOyB5UiA8IHlSTWF4OyArK3lSKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdSID0geVIgKiBzdHJpZGVIZWlnaHQgLSB4UkNvcm5lcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgeUMgPSB4Q01pbjsgeUMgPCB5Q01heDsgKyt5Qykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd0MgPSB5QyAqIHN0cmlkZVdpZHRoIC0geENDb3JuZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkeU9mZnNldCA9IGR5UzAgKiBiICsgZHlTMSAqIHlGICsgZHlTMiAqIHlSICsgZHlTMyAqIHlDO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmx0T2Zmc2V0ID0gZmx0UzAgKiAoZmlsdGVyRGVwdGggLSAxIC0gd0YpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHRTMSAqIChmaWx0ZXJIZWlnaHQgLSAxIC0gd1IpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHRTMiAqIChmaWx0ZXJXaWR0aCAtIDEgLSB3QykgKyBmbHRTMyAqIGQxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgZDIgPSAwOyBkMiA8IG91dENoYW5uZWxzOyArK2QyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGl4ZWwgPSBkeVZhbHVlc1tkeU9mZnNldCArIGQyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3ZWlnaHQgPSBmbHRWYWx1ZXNbZmx0T2Zmc2V0ICsgZDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdFByb2QgKz0gcGl4ZWwgKiB3ZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBkeFZhbHVlc1tkeFMwICogYiArIGR4UzEgKiB4RiArIGR4UzIgKiB4UiArIGR4UzMgKiB4QyArIGQxXSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG90UHJvZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhkeC5zaGFwZSwgZHguZHR5cGUsIGR4LnZhbHVlcyk7XG59XG5leHBvcnQgY29uc3QgY29udjNEQmFja3Byb3BJbnB1dFYyQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IENvbnYzREJhY2twcm9wSW5wdXRWMixcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogY29udjNEQmFja3Byb3BJbnB1dFYyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29udjNEQmFja3Byb3BJbnB1dFYyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IENvcyB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgY29zID0gdW5hcnlLZXJuZWxGdW5jKENvcywgKHhpKSA9PiBNYXRoLmNvcyh4aSkpO1xuZXhwb3J0IGNvbnN0IGNvc0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBDb3MsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGNvcyxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db3MuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IENvc2ggfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IGNvc2ggPSB1bmFyeUtlcm5lbEZ1bmMoQ29zaCwgKHhpKSA9PiBNYXRoLmNvc2goeGkpKTtcbmV4cG9ydCBjb25zdCBjb3NoQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IENvc2gsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGNvc2gsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29zaC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBidWZmZXIsIENyb3BBbmRSZXNpemUsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIGNyb3BBbmRSZXNpemUoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGltYWdlLCBib3hlcywgYm94SW5kIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBjcm9wU2l6ZSwgbWV0aG9kLCBleHRyYXBvbGF0aW9uVmFsdWUgfSA9IGF0dHJzO1xuICAgIGNvbnN0IFtiYXRjaCwgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIG51bUNoYW5uZWxzXSA9IGltYWdlLnNoYXBlO1xuICAgIGNvbnN0IG51bUJveGVzID0gYm94ZXMuc2hhcGVbMF07XG4gICAgY29uc3QgW2Nyb3BIZWlnaHQsIGNyb3BXaWR0aF0gPSBjcm9wU2l6ZTtcbiAgICBjb25zdCBvdXRwdXQgPSBidWZmZXIoW251bUJveGVzLCBjcm9wSGVpZ2h0LCBjcm9wV2lkdGgsIG51bUNoYW5uZWxzXSwgJ2Zsb2F0MzInKTtcbiAgICBjb25zdCBib3hWYWxzID0gYmFja2VuZC5kYXRhLmdldChib3hlcy5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBib3hJbmRWYWxzID0gYmFja2VuZC5kYXRhLmdldChib3hJbmQuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgaW1hZ2VWYWxzID0gYmFja2VuZC5kYXRhLmdldChpbWFnZS5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBpblN0cmlkZSA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoaW1hZ2Uuc2hhcGUpOyAvLyB0byBjYWxjdWxhdGUgZmxhdCBpbmRleGVzIGludG8gaW1hZ2VcbiAgICBjb25zdCBvdXRTdHJpZGUgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKG91dHB1dC5zaGFwZSk7IC8vIHRvIGNhbGN1bGF0ZSBmbGF0IGluZGV4ZXMgaW50byBvdXRwdXRcbiAgICAvLyBSZWZlcmVuY2UgaW1wbGVtZW50YXRpb25cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yZmxvdy9ibG9iL21hc3Rlci90ZW5zb3JmbG93L2NvcmUva2VybmVscy9jcm9wX2FuZF9yZXNpemVfb3AuY2NcbiAgICBmb3IgKGxldCBiID0gMDsgYiA8IG51bUJveGVzOyBiKyspIHtcbiAgICAgICAgY29uc3Qgc3RhcnRJbmQgPSBiICogNDtcbiAgICAgICAgY29uc3QgeTEgPSBib3hWYWxzW3N0YXJ0SW5kXTtcbiAgICAgICAgY29uc3QgeDEgPSBib3hWYWxzW3N0YXJ0SW5kICsgMV07XG4gICAgICAgIGNvbnN0IHkyID0gYm94VmFsc1tzdGFydEluZCArIDJdO1xuICAgICAgICBjb25zdCB4MiA9IGJveFZhbHNbc3RhcnRJbmQgKyAzXTtcbiAgICAgICAgY29uc3QgYkluZCA9IGJveEluZFZhbHNbYl07XG4gICAgICAgIGlmIChiSW5kID49IGJhdGNoKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBoZWlnaHRTY2FsZSA9IChjcm9wSGVpZ2h0ID4gMSkgPyAoeTIgLSB5MSkgKiAoaW1hZ2VIZWlnaHQgLSAxKSAvIChjcm9wSGVpZ2h0IC0gMSkgOiAwO1xuICAgICAgICBjb25zdCB3aWR0aFNjYWxlID0gKGNyb3BXaWR0aCA+IDEpID8gKHgyIC0geDEpICogKGltYWdlV2lkdGggLSAxKSAvIChjcm9wV2lkdGggLSAxKSA6IDA7XG4gICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgY3JvcEhlaWdodDsgeSsrKSB7XG4gICAgICAgICAgICBjb25zdCB5SW5kID0gKGNyb3BIZWlnaHQgPiAxKSA/XG4gICAgICAgICAgICAgICAgeTEgKiAoaW1hZ2VIZWlnaHQgLSAxKSArIHkgKiAoaGVpZ2h0U2NhbGUpIDpcbiAgICAgICAgICAgICAgICAwLjUgKiAoeTEgKyB5MikgKiAoaW1hZ2VIZWlnaHQgLSAxKTtcbiAgICAgICAgICAgIGlmICh5SW5kIDwgMCB8fCB5SW5kID4gaW1hZ2VIZWlnaHQgLSAxKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCBjcm9wV2lkdGg7IHgrKykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IG51bUNoYW5uZWxzOyBjKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZCA9IGMgKyB4ICogb3V0U3RyaWRlWzJdICsgeSAqIG91dFN0cmlkZVsxXSArIGIgKiBvdXRTdHJpZGVbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQudmFsdWVzW2luZF0gPSBleHRyYXBvbGF0aW9uVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWV0aG9kID09PSAnYmlsaW5lYXInKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9wSW5kID0gTWF0aC5mbG9vcih5SW5kKTtcbiAgICAgICAgICAgICAgICBjb25zdCBib3R0b21JbmQgPSBNYXRoLmNlaWwoeUluZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgeUxlcnAgPSB5SW5kIC0gdG9wSW5kO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgY3JvcFdpZHRoOyB4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeEluZCA9IChjcm9wV2lkdGggPiAxKSA/XG4gICAgICAgICAgICAgICAgICAgICAgICB4MSAqIChpbWFnZVdpZHRoIC0gMSkgKyB4ICogd2lkdGhTY2FsZSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAwLjUgKiAoeDEgKyB4MikgKiAoaW1hZ2VXaWR0aCAtIDEpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoeEluZCA8IDAgfHwgeEluZCA+IGltYWdlV2lkdGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IG51bUNoYW5uZWxzOyBjKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmQgPSBjICsgeCAqIG91dFN0cmlkZVsyXSArIHkgKiBvdXRTdHJpZGVbMV0gKyBiICogb3V0U3RyaWRlWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC52YWx1ZXNbaW5kXSA9IGV4dHJhcG9sYXRpb25WYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxlZnRJbmQgPSBNYXRoLmZsb29yKHhJbmQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByaWdodEluZCA9IE1hdGguY2VpbCh4SW5kKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeExlcnAgPSB4SW5kIC0gbGVmdEluZDtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBudW1DaGFubmVsczsgYysrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5kID0gYyArIGxlZnRJbmQgKiBpblN0cmlkZVsyXSArIHRvcEluZCAqIGluU3RyaWRlWzFdICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSW5kICogaW5TdHJpZGVbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0b3BMZWZ0ID0gaW1hZ2VWYWxzW2luZF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmQgPSBjICsgcmlnaHRJbmQgKiBpblN0cmlkZVsyXSArIHRvcEluZCAqIGluU3RyaWRlWzFdICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSW5kICogaW5TdHJpZGVbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0b3BSaWdodCA9IGltYWdlVmFsc1tpbmRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5kID0gYyArIGxlZnRJbmQgKiBpblN0cmlkZVsyXSArIGJvdHRvbUluZCAqIGluU3RyaWRlWzFdICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSW5kICogaW5TdHJpZGVbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib3R0b21MZWZ0ID0gaW1hZ2VWYWxzW2luZF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmQgPSBjICsgcmlnaHRJbmQgKiBpblN0cmlkZVsyXSArIGJvdHRvbUluZCAqIGluU3RyaWRlWzFdICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSW5kICogaW5TdHJpZGVbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib3R0b21SaWdodCA9IGltYWdlVmFsc1tpbmRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9wID0gdG9wTGVmdCArICh0b3BSaWdodCAtIHRvcExlZnQpICogeExlcnA7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib3R0b20gPSBib3R0b21MZWZ0ICsgKGJvdHRvbVJpZ2h0IC0gYm90dG9tTGVmdCkgKiB4TGVycDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZCA9IGMgKyB4ICogb3V0U3RyaWRlWzJdICsgeSAqIG91dFN0cmlkZVsxXSArIGIgKiBvdXRTdHJpZGVbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQudmFsdWVzW2luZF0gPSB0b3AgKyAoKGJvdHRvbSAtIHRvcCkgKiB5TGVycCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHsgLy8gbWV0aG9kID09IFwibmVhcmVzdFwiXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCBjcm9wV2lkdGg7ICsreCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4SW5kID0gKGNyb3BXaWR0aCA+IDEpID9cbiAgICAgICAgICAgICAgICAgICAgICAgIHgxICogKGltYWdlV2lkdGggLSAxKSArIHggKiB3aWR0aFNjYWxlIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIDAuNSAqICh4MSArIHgyKSAqIChpbWFnZVdpZHRoIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh4SW5kIDwgMCB8fCB4SW5kID4gaW1hZ2VXaWR0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgbnVtQ2hhbm5lbHM7IGMrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZCA9IGMgKyB4ICogb3V0U3RyaWRlWzJdICsgeSAqIG91dFN0cmlkZVsxXSArIGIgKiBvdXRTdHJpZGVbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnZhbHVlc1tpbmRdID0gZXh0cmFwb2xhdGlvblZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xvc2VzdFggPSBNYXRoLnJvdW5kKHhJbmQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbG9zZXN0WSA9IE1hdGgucm91bmQoeUluZCk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgbnVtQ2hhbm5lbHM7IGMrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5JbmQgPSBjICsgY2xvc2VzdFggKiBpblN0cmlkZVsyXSArIGNsb3Nlc3RZICogaW5TdHJpZGVbMV0gK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJbmQgKiBpblN0cmlkZVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG91dEluZCA9IGMgKyB4ICogb3V0U3RyaWRlWzJdICsgeSAqIG91dFN0cmlkZVsxXSArIGIgKiBvdXRTdHJpZGVbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQudmFsdWVzW291dEluZF0gPSBpbWFnZVZhbHNbaW5JbmRdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dHB1dC5zaGFwZSwgb3V0cHV0LmR0eXBlLCBvdXRwdXQudmFsdWVzKTtcbn1cbmV4cG9ydCBjb25zdCBjcm9wQW5kUmVzaXplQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IENyb3BBbmRSZXNpemUsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGNyb3BBbmRSZXNpemVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Dcm9wQW5kUmVzaXplLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgQ3Vtc3VtLCB1cGNhc3RUeXBlLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyB0cmFuc3Bvc2UgfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5leHBvcnQgZnVuY3Rpb24gY3Vtc3VtKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBheGlzLCBleGNsdXNpdmUsIHJldmVyc2UgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ2N1bXN1bScpO1xuICAgIGNvbnN0IHBlcm11dGF0aW9uID0gYmFja2VuZF91dGlsLmdldEF4ZXNQZXJtdXRhdGlvbihbYXhpc10sIHguc2hhcGUubGVuZ3RoKTtcbiAgICBsZXQgJHggPSB4O1xuICAgIGlmIChwZXJtdXRhdGlvbiAhPSBudWxsKSB7XG4gICAgICAgICR4ID0gdHJhbnNwb3NlKHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCwgYXR0cnM6IHsgcGVybTogcGVybXV0YXRpb24gfSB9KTtcbiAgICB9XG4gICAgY29uc3QgcGVybXV0ZWRBeGlzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoMSwgeC5zaGFwZS5sZW5ndGgpWzBdO1xuICAgIGlmIChwZXJtdXRlZEF4aXMgIT09ICR4LnNoYXBlLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBiYWNrZW5kLmN1bXN1bSBpbiBDUFUgZXhwZWN0cyBhbiBpbm5lci1tb3N0IGAgK1xuICAgICAgICAgICAgYGF4aXM9JHskeC5zaGFwZS5sZW5ndGggLSAxfSBidXQgZ290IGF4aXM9JHtwZXJtdXRlZEF4aXN9YCk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdER0eXBlID0gdXBjYXN0VHlwZSgkeC5kdHlwZSwgJ2ludDMyJyk7XG4gICAgY29uc3QgdmFscyA9IHV0aWwubWFrZVplcm9zVHlwZWRBcnJheSh1dGlsLnNpemVGcm9tU2hhcGUoJHguc2hhcGUpLCByZXN1bHREdHlwZSk7XG4gICAgY29uc3QgYVZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KCR4LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IGZpbmFsRGltID0gJHguc2hhcGVbJHguc2hhcGUubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgaW5kZXhBZGp1c3RlciA9IHJldmVyc2UgP1xuICAgICAgICAoaSwgaikgPT4gaSArIGZpbmFsRGltIC0gaiAtIDEgOlxuICAgICAgICAoaSwgaikgPT4gaSArIGo7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhVmFscy5sZW5ndGg7IGkgKz0gZmluYWxEaW0pIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBmaW5hbERpbTsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBpZHggPSBpbmRleEFkanVzdGVyKGksIGopO1xuICAgICAgICAgICAgaWYgKGogPT09IDApIHtcbiAgICAgICAgICAgICAgICB2YWxzW2lkeF0gPSBleGNsdXNpdmUgPyAwIDogYVZhbHNbaWR4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZJZHggPSBpbmRleEFkanVzdGVyKGksIGogLSAxKTtcbiAgICAgICAgICAgICAgICB2YWxzW2lkeF0gPSBleGNsdXNpdmUgPyBhVmFsc1twcmV2SWR4XSArIHZhbHNbcHJldklkeF0gOlxuICAgICAgICAgICAgICAgICAgICBhVmFsc1tpZHhdICsgdmFsc1twcmV2SWR4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKCR4LnNoYXBlLCByZXN1bHREdHlwZSwgdmFscyk7XG4gICAgaWYgKHBlcm11dGF0aW9uICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgcmV2ZXJzZVBlcm11dGF0aW9uID0gYmFja2VuZF91dGlsLmdldFVuZG9BeGVzUGVybXV0YXRpb24ocGVybXV0YXRpb24pO1xuICAgICAgICBjb25zdCByZXZlcnNlVHJhbnNwb3NlZFJlc3VsdCA9IHRyYW5zcG9zZSh7IGlucHV0czogeyB4OiByZXN1bHQgfSwgYmFja2VuZCwgYXR0cnM6IHsgcGVybTogcmV2ZXJzZVBlcm11dGF0aW9uIH0gfSk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVzdWx0KTtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbygkeCk7XG4gICAgICAgIHJldHVybiByZXZlcnNlVHJhbnNwb3NlZFJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBjb25zdCBjdW1zdW1Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQ3Vtc3VtLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBjdW1zdW1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DdW1zdW0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRGVuc2VCaW5jb3VudCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBiaW5jb3VudEltcGwsIGJpbmNvdW50UmVkdWNlSW1wbCB9IGZyb20gJy4vQmluY291bnRfaW1wbCc7XG5leHBvcnQgZnVuY3Rpb24gZGVuc2VCaW5jb3VudChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCwgd2VpZ2h0cyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgc2l6ZSwgYmluYXJ5T3V0cHV0IH0gPSBhdHRycztcbiAgICBpZiAoeC5zaGFwZS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgY29uc3QgeFZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgICAgIGNvbnN0IHdlaWdodHNWYWxzID0gYmFja2VuZC5kYXRhLmdldCh3ZWlnaHRzLmRhdGFJZCkudmFsdWVzO1xuICAgICAgICBjb25zdCBvdXRWYWxzID0gYmluY291bnRJbXBsKHhWYWxzLCB3ZWlnaHRzVmFscywgd2VpZ2h0cy5kdHlwZSwgd2VpZ2h0cy5zaGFwZSwgc2l6ZSk7XG4gICAgICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtzaXplXSwgd2VpZ2h0cy5kdHlwZSwgb3V0VmFscyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHguc2hhcGUubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIGNvbnN0IHhCdWYgPSBiYWNrZW5kLmJ1ZmZlclN5bmMoeCk7XG4gICAgICAgIGNvbnN0IHdlaWdodHNCdWYgPSBiYWNrZW5kLmJ1ZmZlclN5bmMod2VpZ2h0cyk7XG4gICAgICAgIGNvbnN0IG91dEJ1ZiA9IGJpbmNvdW50UmVkdWNlSW1wbCh4QnVmLCB3ZWlnaHRzQnVmLCBzaXplLCBiaW5hcnlPdXRwdXQpO1xuICAgICAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRCdWYuc2hhcGUsIHdlaWdodHMuZHR5cGUsIG91dEJ1Zi52YWx1ZXMpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIGRlbnNlQmluY291bnQ6IGlucHV0IG11c3QgYmUgYXQgbW9zdCByYW5rIDIsIGJ1dCBnb3QgcmFua2AgK1xuICAgICAgICBgJHt4LnNoYXBlLmxlbmd0aH0uYCk7XG59XG5leHBvcnQgY29uc3QgZGVuc2VCaW5jb3VudENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBEZW5zZUJpbmNvdW50LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBkZW5zZUJpbmNvdW50XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGVuc2VCaW5jb3VudC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBEZXB0aFRvU3BhY2UsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIGRlcHRoVG9TcGFjZShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYmxvY2tTaXplLCBkYXRhRm9ybWF0IH0gPSBhdHRycztcbiAgICB1dGlsLmFzc2VydChkYXRhRm9ybWF0ID09PSAnTkhXQycsICgpID0+IGBPbmx5IE5IV0MgZGF0YUZvcm1hdCBzdXBwb3J0ZWQgb24gQ1BVIGZvciBkZXB0aFRvU3BhY2UuIEdvdCAke2RhdGFGb3JtYXR9YCk7XG4gICAgdXRpbC5hc3NlcnQoYmxvY2tTaXplID4gMSwgKCkgPT4gYGJsb2NrU2l6ZSBzaG91bGQgYmUgPiAxIGZvciBkZXB0aFRvU3BhY2UsIGJ1dCB3YXM6ICR7YmxvY2tTaXplfWApO1xuICAgIGNvbnN0IGJhdGNoU2l6ZSA9IHguc2hhcGVbMF07XG4gICAgY29uc3QgaW5wdXRIZWlnaHQgPSB4LnNoYXBlWzFdO1xuICAgIGNvbnN0IGlucHV0V2lkdGggPSB4LnNoYXBlWzJdO1xuICAgIGNvbnN0IGlucHV0RGVwdGggPSB4LnNoYXBlWzNdO1xuICAgIGNvbnN0IG91dHB1dEhlaWdodCA9IGlucHV0SGVpZ2h0ICogYmxvY2tTaXplO1xuICAgIGNvbnN0IG91dHB1dFdpZHRoID0gaW5wdXRXaWR0aCAqIGJsb2NrU2l6ZTtcbiAgICBjb25zdCBvdXRwdXREZXB0aCA9IGlucHV0RGVwdGggLyAoYmxvY2tTaXplICogYmxvY2tTaXplKTtcbiAgICBjb25zdCB4VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBGbG9hdDMyQXJyYXkoYmF0Y2hTaXplICogb3V0cHV0SGVpZ2h0ICogb3V0cHV0V2lkdGggKiBvdXRwdXREZXB0aCk7XG4gICAgbGV0IG91dHB1dElkeCA9IDA7XG4gICAgZm9yIChsZXQgYiA9IDA7IGIgPCBiYXRjaFNpemU7ICsrYikge1xuICAgICAgICBmb3IgKGxldCBoID0gMDsgaCA8IG91dHB1dEhlaWdodDsgKytoKSB7XG4gICAgICAgICAgICBjb25zdCBpbkggPSBNYXRoLmZsb29yKGggLyBibG9ja1NpemUpO1xuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0SCA9IChoICUgYmxvY2tTaXplKTtcbiAgICAgICAgICAgIGZvciAobGV0IHcgPSAwOyB3IDwgb3V0cHV0V2lkdGg7ICsrdykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluVyA9IE1hdGguZmxvb3IodyAvIGJsb2NrU2l6ZSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0VyA9ICh3ICUgYmxvY2tTaXplKTtcbiAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXREID0gKG9mZnNldEggKiBibG9ja1NpemUgKyBvZmZzZXRXKSAqIG91dHB1dERlcHRoO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGQgPSAwOyBkIDwgb3V0cHV0RGVwdGg7ICsrZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbkQgPSBkICsgb2Zmc2V0RDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5wdXRJZHggPSBpbkQgKyBpbnB1dERlcHRoICogKGluVyArIGlucHV0V2lkdGggKiAoaW5IICsgaW5wdXRIZWlnaHQgKiBiKSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtvdXRwdXRJZHgrK10gPSB4VmFsdWVzW2lucHV0SWR4XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW2JhdGNoU2l6ZSwgb3V0cHV0SGVpZ2h0LCBvdXRwdXRXaWR0aCwgb3V0cHV0RGVwdGhdLCB4LmR0eXBlLCByZXN1bHQpO1xufVxuZXhwb3J0IGNvbnN0IGRlcHRoVG9TcGFjZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBEZXB0aFRvU3BhY2UsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGRlcHRoVG9TcGFjZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURlcHRoVG9TcGFjZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIERlcHRod2lzZUNvbnYyZE5hdGl2ZSwgVGVuc29yQnVmZmVyLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5leHBvcnQgZnVuY3Rpb24gZGVwdGh3aXNlQ29udjJkTmF0aXZlKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4LCBmaWx0ZXIgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHN0cmlkZXMsIHBhZCwgZGlsYXRpb25zLCBkaW1Sb3VuZGluZ01vZGUgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoW3gsIGZpbHRlcl0sICdkZXB0aHdpc2VDb252MkROYXRpdmUnKTtcbiAgICBjb25zdCB4U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoeC5zaGFwZSk7XG4gICAgY29uc3QgZmlsdGVyU3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoZmlsdGVyLnNoYXBlKTtcbiAgICBsZXQgJGRpbGF0aW9ucyA9IGRpbGF0aW9ucztcbiAgICBpZiAoJGRpbGF0aW9ucyA9PSBudWxsKSB7XG4gICAgICAgICRkaWxhdGlvbnMgPSBbMSwgMV07XG4gICAgfVxuICAgIHV0aWwuYXNzZXJ0KGJhY2tlbmRfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgJGRpbGF0aW9ucyksICgpID0+ICdFcnJvciBpbiBkZXB0aHdpc2VDb252MmQ6IEVpdGhlciBzdHJpZGVzIG9yIGRpbGF0aW9ucyBtdXN0IGJlICcgK1xuICAgICAgICBgMS4gR290IHN0cmlkZXMgJHtzdHJpZGVzfSBhbmQgZGlsYXRpb25zICckeyRkaWxhdGlvbnN9J2ApO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252MkRJbmZvKHguc2hhcGUsIGZpbHRlci5zaGFwZSwgc3RyaWRlcywgJGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIHRydWUgLyogZGVwdGh3aXNlICovKTtcbiAgICBjb25zdCB7IGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGRpbGF0aW9uSGVpZ2h0LCBkaWxhdGlvbldpZHRoLCBwYWRJbmZvIH0gPSBjb252SW5mbztcbiAgICBjb25zdCBwYWRMZWZ0ID0gcGFkSW5mby5sZWZ0O1xuICAgIGNvbnN0IHBhZFRvcCA9IHBhZEluZm8udG9wO1xuICAgIGNvbnN0IGNoTXVsID0gY29udkluZm8ub3V0Q2hhbm5lbHMgLyBjb252SW5mby5pbkNoYW5uZWxzO1xuICAgIGNvbnN0IHkgPSBuZXcgVGVuc29yQnVmZmVyKGNvbnZJbmZvLm91dFNoYXBlLCB4LmR0eXBlKTtcbiAgICBjb25zdCB4VmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCB3VmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoZmlsdGVyLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHlWYWxzID0geS52YWx1ZXM7XG4gICAgZm9yIChsZXQgYiA9IDA7IGIgPCBjb252SW5mby5iYXRjaFNpemU7ICsrYikge1xuICAgICAgICBjb25zdCB4T2Zmc2V0MSA9IGIgKiB4U3RyaWRlc1swXTtcbiAgICAgICAgY29uc3QgeU9mZnNldDEgPSBiICogeS5zdHJpZGVzWzBdO1xuICAgICAgICBmb3IgKGxldCB5UiA9IDA7IHlSIDwgY29udkluZm8ub3V0SGVpZ2h0OyArK3lSKSB7XG4gICAgICAgICAgICBjb25zdCB5T2Zmc2V0MiA9IHlPZmZzZXQxICsgeVIgKiB5LnN0cmlkZXNbMV07XG4gICAgICAgICAgICBjb25zdCB4UkNvcm5lciA9IHlSICogY29udkluZm8uc3RyaWRlSGVpZ2h0IC0gcGFkVG9wO1xuICAgICAgICAgICAgZm9yIChsZXQgd1IgPSAwOyB3UiA8IGZpbHRlckhlaWdodDsgKyt3Uikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhSID0geFJDb3JuZXIgKyB3UiAqIGRpbGF0aW9uSGVpZ2h0O1xuICAgICAgICAgICAgICAgIGlmICh4UiA8IDAgfHwgeFIgPj0gY29udkluZm8uaW5IZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHdPZmZzZXQxID0gd1IgKiBmaWx0ZXJTdHJpZGVzWzBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHhPZmZzZXQyID0geE9mZnNldDEgKyB4UiAqIHhTdHJpZGVzWzFdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHlDID0gMDsgeUMgPCBjb252SW5mby5vdXRXaWR0aDsgKyt5Qykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB5T2Zmc2V0MyA9IHlPZmZzZXQyICsgeUMgKiB5LnN0cmlkZXNbMl07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhDQ29ybmVyID0geUMgKiBjb252SW5mby5zdHJpZGVXaWR0aCAtIHBhZExlZnQ7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHdDID0gMDsgd0MgPCBmaWx0ZXJXaWR0aDsgKyt3Qykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeEMgPSB4Q0Nvcm5lciArIHdDICogZGlsYXRpb25XaWR0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4QyA8IDAgfHwgeEMgPj0gY29udkluZm8uaW5XaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd09mZnNldDIgPSB3T2Zmc2V0MSArIHdDICogZmlsdGVyU3RyaWRlc1sxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhPZmZzZXQzID0geE9mZnNldDIgKyB4QyAqIGNvbnZJbmZvLmluQ2hhbm5lbHM7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgeU9mZnNldDQgPSB5T2Zmc2V0MztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB3T2Zmc2V0MyA9IHdPZmZzZXQyO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgZDEgPSAwOyBkMSA8IGNvbnZJbmZvLmluQ2hhbm5lbHM7ICsrZDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4VmFsID0geFZhbHNbeE9mZnNldDMgKyBkMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgcSA9IDA7IHEgPCBjaE11bDsgKytxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlWYWxzW3lPZmZzZXQ0ICsgcV0gKz0geFZhbCAqIHdWYWxzW3dPZmZzZXQzICsgcV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlPZmZzZXQ0ICs9IGNoTXVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdPZmZzZXQzICs9IGNoTXVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHkuc2hhcGUsIHkuZHR5cGUsIHkudmFsdWVzKTtcbn1cbmV4cG9ydCBjb25zdCBkZXB0aHdpc2VDb252MmROYXRpdmVDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRGVwdGh3aXNlQ29udjJkTmF0aXZlLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBkZXB0aHdpc2VDb252MmROYXRpdmVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EZXB0aHdpc2VDb252MmROYXRpdmUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlciwgVGVuc29yQnVmZmVyIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5leHBvcnQgZnVuY3Rpb24gZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHgsIGR5IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBzdHJpZGVzLCBkaWxhdGlvbnMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCBmaWx0ZXJTaGFwZSB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChbeCwgZHldLCAnZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXInKTtcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyh4LnNoYXBlLCBmaWx0ZXJTaGFwZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgdHJ1ZSAvKiBkZXB0aHdpc2UgKi8pO1xuICAgIGNvbnN0IHsgc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aCwgZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCB9ID0gY29udkluZm87XG4gICAgY29uc3QgZFcgPSBuZXcgVGVuc29yQnVmZmVyKGNvbnZJbmZvLmZpbHRlclNoYXBlLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IGxlZnRQYWQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgY29uc3QgdG9wUGFkID0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgY2hNdWwgPSBjb252SW5mby5vdXRDaGFubmVscyAvIGNvbnZJbmZvLmluQ2hhbm5lbHM7XG4gICAgY29uc3QgeFZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgeEJ1ZiA9IG5ldyBUZW5zb3JCdWZmZXIoeC5zaGFwZSwgeC5kdHlwZSwgeFZhbHMpO1xuICAgIGNvbnN0IGR5VmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoZHkuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgZHlCdWYgPSBuZXcgVGVuc29yQnVmZmVyKGR5LnNoYXBlLCBkeS5kdHlwZSwgZHlWYWxzKTtcbiAgICBmb3IgKGxldCB3UiA9IDA7IHdSIDwgZmlsdGVySGVpZ2h0OyArK3dSKSB7XG4gICAgICAgIGNvbnN0IHlSTWluID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKCh0b3BQYWQgLSB3UikgLyBzdHJpZGVIZWlnaHQpKTtcbiAgICAgICAgY29uc3QgeVJNYXggPSBNYXRoLm1pbihjb252SW5mby5vdXRIZWlnaHQsIChjb252SW5mby5pbkhlaWdodCArIHRvcFBhZCAtIHdSKSAvIHN0cmlkZUhlaWdodCk7XG4gICAgICAgIGZvciAobGV0IHdDID0gMDsgd0MgPCBmaWx0ZXJXaWR0aDsgKyt3Qykge1xuICAgICAgICAgICAgY29uc3QgeUNNaW4gPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoKGxlZnRQYWQgLSB3QykgLyBzdHJpZGVXaWR0aCkpO1xuICAgICAgICAgICAgY29uc3QgeUNNYXggPSBNYXRoLm1pbihjb252SW5mby5vdXRXaWR0aCwgKGNvbnZJbmZvLmluV2lkdGggKyBsZWZ0UGFkIC0gd0MpIC8gc3RyaWRlV2lkdGgpO1xuICAgICAgICAgICAgZm9yIChsZXQgZDIgPSAwOyBkMiA8IGNvbnZJbmZvLm91dENoYW5uZWxzOyArK2QyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZDEgPSBNYXRoLnRydW5jKGQyIC8gY2hNdWwpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRtID0gZDIgJSBjaE11bDtcbiAgICAgICAgICAgICAgICBsZXQgZG90UHJvZCA9IDA7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYiA9IDA7IGIgPCBjb252SW5mby5iYXRjaFNpemU7ICsrYikge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB5UiA9IHlSTWluOyB5UiA8IHlSTWF4OyArK3lSKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4UiA9IHdSICsgeVIgKiBzdHJpZGVIZWlnaHQgLSB0b3BQYWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB5QyA9IHlDTWluOyB5QyA8IHlDTWF4OyArK3lDKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeEMgPSB3QyArIHlDICogc3RyaWRlV2lkdGggLSBsZWZ0UGFkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdFByb2QgKz0geEJ1Zi5nZXQoYiwgeFIsIHhDLCBkMSkgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeUJ1Zi5nZXQoYiwgeVIsIHlDLCBkMik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZFcuc2V0KGRvdFByb2QsIHdSLCB3QywgZDEsIGRtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhkVy5zaGFwZSwgZFcuZHR5cGUsIGRXLnZhbHVlcyk7XG59XG5leHBvcnQgY29uc3QgZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXJDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0LCBUZW5zb3JCdWZmZXIsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBkeSwgZmlsdGVyIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBzdHJpZGVzLCBkaWxhdGlvbnMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCBpbnB1dFNoYXBlIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KFtkeSwgZmlsdGVyXSwgJ2RlcHRod2lzZUNvbnYyRE5hdGl2ZUJhY2twcm9wSW5wdXQnKTtcbiAgICBjb25zdCBkeVN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGR5LnNoYXBlKTtcbiAgICBjb25zdCBmaWx0ZXJTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhmaWx0ZXIuc2hhcGUpO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252MkRJbmZvKGlucHV0U2hhcGUsIGZpbHRlci5zaGFwZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgdHJ1ZSAvKiBkZXB0aHdpc2UgKi8pO1xuICAgIGNvbnN0IGR4ID0gbmV3IFRlbnNvckJ1ZmZlcihjb252SW5mby5pblNoYXBlLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IGR4VmFsdWVzID0gZHgudmFsdWVzO1xuICAgIGNvbnN0IFtkeFMwLCBkeFMxLCBkeFMyXSA9IGR4LnN0cmlkZXM7XG4gICAgY29uc3QgZHlWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGR5LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IFtkeVMwLCBkeVMxLCBkeVMyXSA9IGR5U3RyaWRlcztcbiAgICBjb25zdCBmbHRWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGZpbHRlci5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBbZmx0UzAsIGZsdFMxLCBmbHRTMl0gPSBmaWx0ZXJTdHJpZGVzO1xuICAgIGNvbnN0IHsgYmF0Y2hTaXplLCBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBpbkNoYW5uZWxzLCBpbkhlaWdodCwgaW5XaWR0aCwgb3V0Q2hhbm5lbHMsIG91dEhlaWdodCwgb3V0V2lkdGgsIHN0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGggfSA9IGNvbnZJbmZvO1xuICAgIGNvbnN0IHRvcFBhZCA9IGZpbHRlckhlaWdodCAtIDEgLSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICBjb25zdCBsZWZ0UGFkID0gZmlsdGVyV2lkdGggLSAxIC0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgIGNvbnN0IGNoTXVsID0gb3V0Q2hhbm5lbHMgLyBpbkNoYW5uZWxzO1xuICAgIGZvciAobGV0IGIgPSAwOyBiIDwgYmF0Y2hTaXplOyArK2IpIHtcbiAgICAgICAgZm9yIChsZXQgZDEgPSAwOyBkMSA8IGluQ2hhbm5lbHM7ICsrZDEpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHhSID0gMDsgeFIgPCBpbkhlaWdodDsgKyt4Uikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhSQ29ybmVyID0geFIgLSB0b3BQYWQ7XG4gICAgICAgICAgICAgICAgY29uc3QgeFJNaW4gPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoeFJDb3JuZXIgLyBzdHJpZGVIZWlnaHQpKTtcbiAgICAgICAgICAgICAgICBjb25zdCB5Uk1heCA9IE1hdGgubWluKG91dEhlaWdodCwgKGZpbHRlckhlaWdodCArIHhSQ29ybmVyKSAvIHN0cmlkZUhlaWdodCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgeEMgPSAwOyB4QyA8IGluV2lkdGg7ICsreEMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeENDb3JuZXIgPSB4QyAtIGxlZnRQYWQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhDTWluID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKHhDQ29ybmVyIC8gc3RyaWRlV2lkdGgpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeUNNYXggPSBNYXRoLm1pbihvdXRXaWR0aCwgKGZpbHRlcldpZHRoICsgeENDb3JuZXIpIC8gc3RyaWRlV2lkdGgpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZG90UHJvZCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHlSID0geFJNaW47IHlSIDwgeVJNYXg7ICsreVIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdSID0geVIgKiBzdHJpZGVIZWlnaHQgLSB4UkNvcm5lcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHlDID0geENNaW47IHlDIDwgeUNNYXg7ICsreUMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3QyA9IHlDICogc3RyaWRlV2lkdGggLSB4Q0Nvcm5lcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkeU9mZnNldCA9IGR5UzAgKiBiICsgZHlTMSAqIHlSICsgZHlTMiAqIHlDO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsdE9mZnNldCA9IGZsdFMwICogKGZpbHRlckhlaWdodCAtIDEgLSB3UikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHRTMSAqIChmaWx0ZXJXaWR0aCAtIDEgLSB3QykgKyBmbHRTMiAqIGQxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGRtID0gMDsgZG0gPCBjaE11bDsgKytkbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkMiA9IGQxICogY2hNdWwgKyBkbTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGl4ZWwgPSBkeVZhbHVlc1tkeU9mZnNldCArIGQyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2VpZ2h0ID0gZmx0VmFsdWVzW2ZsdE9mZnNldCArIGRtXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG90UHJvZCArPSBwaXhlbCAqIHdlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZHhWYWx1ZXNbZHhTMCAqIGIgKyBkeFMxICogeFIgKyBkeFMyICogeEMgKyBkMV0gPSBkb3RQcm9kO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhkeC5zaGFwZSwgZHguZHR5cGUsIGR4LnZhbHVlcyk7XG59XG5leHBvcnQgY29uc3QgZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBidWZmZXIsIERpYWcsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIGRpYWcoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHhTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHguc2hhcGUpO1xuICAgIGNvbnN0IHhWYWxzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IG91dEJ1ZiA9IGJ1ZmZlcihbeFNpemUsIHhTaXplXSwgeC5kdHlwZSk7XG4gICAgY29uc3QgdmFscyA9IG91dEJ1Zi52YWx1ZXM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB4VmFscy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YWxzW2kgKiB4U2l6ZSArIGldID0geFZhbHNbaV07XG4gICAgfVxuICAgIGNvbnN0IG91dFNoYXBlID0gWy4uLnguc2hhcGUsIC4uLnguc2hhcGVdO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dFNoYXBlLCBvdXRCdWYuZHR5cGUsIG91dEJ1Zi52YWx1ZXMpO1xufVxuZXhwb3J0IGNvbnN0IGRpYWdDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRGlhZyxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogZGlhZ1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURpYWcuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBEaWxhdGlvbjJELCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBjb25zdCBkaWxhdGlvbjJkQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IERpbGF0aW9uMkQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6ICh7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IHgsIGZpbHRlciB9ID0gaW5wdXRzO1xuICAgICAgICBjb25zdCB7IHN0cmlkZXMsIHBhZCwgZGlsYXRpb25zIH0gPSBhdHRycztcbiAgICAgICAgY29uc3QgY3B1QmFja2VuZCA9IGJhY2tlbmQ7XG4gICAgICAgIGNvbnN0IHhWYWxzID0gY3B1QmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgICAgICBjb25zdCB4UmFuayA9IHguc2hhcGUubGVuZ3RoO1xuICAgICAgICBjb25zdCBmaWx0ZXJWYWxzID0gY3B1QmFja2VuZC5kYXRhLmdldChmaWx0ZXIuZGF0YUlkKS52YWx1ZXM7XG4gICAgICAgIGNvbnN0IGZpbHRlclJhbmsgPSBmaWx0ZXIuc2hhcGUubGVuZ3RoO1xuICAgICAgICBjb25zdCB7IGJhdGNoU2l6ZSwgaW5IZWlnaHQsIGluV2lkdGgsIGluQ2hhbm5lbHMsIG91dEhlaWdodCwgb3V0V2lkdGgsIHBhZEluZm8sIHN0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGRpbGF0aW9uSGVpZ2h0LCBkaWxhdGlvbldpZHRoLCBvdXRTaGFwZSB9ID0gYmFja2VuZF91dGlsLmNvbXB1dGVEaWxhdGlvbjJESW5mbyh4LnNoYXBlLCBmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsIHBhZCwgJ05IV0MnIC8qIGRhdGFGb3JtYXQgKi8sIGRpbGF0aW9ucyk7XG4gICAgICAgIGNvbnN0IG91dFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUob3V0U2hhcGUpO1xuICAgICAgICBjb25zdCBvdXRSYW5rID0gb3V0U2hhcGUubGVuZ3RoO1xuICAgICAgICBjb25zdCBvdXRwdXRWYWxzID0gdXRpbC5nZXRBcnJheUZyb21EVHlwZSh4LmR0eXBlLCBvdXRTaXplKTtcbiAgICAgICAgLy8gVXBzYW1wbGluZyB0aGUgaW5wdXQgYnkgZmlsbCBpbiBgZGlsYXRpb24gc2l6ZSAtIDFgIHZhbHVlcyBiZXR3ZWVuIGVhY2hcbiAgICAgICAgLy8gaW5wdXQgdmFsdWUuXG4gICAgICAgIC8vIFRoaXMgaW1wbGVtZW50YXRpb24gZm9sbG93cyB0aGUgVEYgYysrIGltcGxlbWVudGF0aW9uOlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3JmbG93L2Jsb2IvZDlhM2E4NDllZGMxOThlOTAxNzJiYzU4ZWIyOTNkZTQ1N2Y5ZDk4Ni90ZW5zb3JmbG93L2NvcmUva2VybmVscy9kaWxhdGlvbl9vcHMuY2NcbiAgICAgICAgZm9yIChsZXQgYiA9IDA7IGIgPCBiYXRjaFNpemU7ICsrYikge1xuICAgICAgICAgICAgZm9yIChsZXQgaE91dCA9IDA7IGhPdXQgPCBvdXRIZWlnaHQ7ICsraE91dCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhCZWcgPSBoT3V0ICogc3RyaWRlSGVpZ2h0IC0gcGFkSW5mby50b3A7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgd091dCA9IDA7IHdPdXQgPCBvdXRXaWR0aDsgKyt3T3V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHdCZWcgPSB3T3V0ICogc3RyaWRlV2lkdGggLSBwYWRJbmZvLmxlZnQ7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGQgPSAwOyBkIDwgaW5DaGFubmVsczsgKytkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY3VyVmFsID0gTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVI7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBoID0gMDsgaCA8IGZpbHRlckhlaWdodDsgKytoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaEluID0gaEJlZyArIGggKiBkaWxhdGlvbkhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaEluID49IDAgJiYgaEluIDwgaW5IZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgdyA9IDA7IHcgPCBmaWx0ZXJXaWR0aDsgKyt3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3SW4gPSB3QmVnICsgdyAqIGRpbGF0aW9uV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod0luID49IDAgJiYgd0luIDwgaW5XaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhJbmRleCA9IHV0aWwubG9jVG9JbmRleChbYiwgaEluLCB3SW4sIGRdLCB4UmFuaywgdXRpbC5jb21wdXRlU3RyaWRlcyh4LnNoYXBlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsdGVySW5kZXggPSB1dGlsLmxvY1RvSW5kZXgoW2gsIHcsIGRdLCBmaWx0ZXJSYW5rLCB1dGlsLmNvbXB1dGVTdHJpZGVzKGZpbHRlci5zaGFwZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IHhWYWxzW3hJbmRleF0gKyBmaWx0ZXJWYWxzW2ZpbHRlckluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsID4gY3VyVmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1clZhbCA9IHZhbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvdXRwdXRJbmRleCA9IHV0aWwubG9jVG9JbmRleChbYiwgaE91dCwgd091dCwgZF0sIG91dFJhbmssIHV0aWwuY29tcHV0ZVN0cmlkZXMob3V0U2hhcGUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFZhbHNbb3V0cHV0SW5kZXhdID0gY3VyVmFsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGFJZCA9IGNwdUJhY2tlbmQud3JpdGUodXRpbC50b1R5cGVkQXJyYXkob3V0cHV0VmFscywgeC5kdHlwZSksIG91dFNoYXBlLCB4LmR0eXBlKTtcbiAgICAgICAgcmV0dXJuIHsgZGF0YUlkLCBzaGFwZTogb3V0U2hhcGUsIGR0eXBlOiB4LmR0eXBlIH07XG4gICAgfVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURpbGF0aW9uMkQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBEaWxhdGlvbjJEQmFja3Byb3BGaWx0ZXIsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGNvbnN0IGRpbGF0aW9uMmRCYWNrcHJvcEZpbHRlckNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBEaWxhdGlvbjJEQmFja3Byb3BGaWx0ZXIsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6ICh7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IHgsIGZpbHRlciwgZHkgfSA9IGlucHV0cztcbiAgICAgICAgY29uc3QgeyBzdHJpZGVzLCBwYWQsIGRpbGF0aW9ucyB9ID0gYXR0cnM7XG4gICAgICAgIGNvbnN0IGNwdUJhY2tlbmQgPSBiYWNrZW5kO1xuICAgICAgICBjb25zdCAkeCA9IHV0aWwudG9OZXN0ZWRBcnJheSh4LnNoYXBlLCBjcHVCYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXMpO1xuICAgICAgICBjb25zdCAkZmlsdGVyID0gdXRpbC50b05lc3RlZEFycmF5KGZpbHRlci5zaGFwZSwgY3B1QmFja2VuZC5kYXRhLmdldChmaWx0ZXIuZGF0YUlkKS52YWx1ZXMpO1xuICAgICAgICBjb25zdCB7IGJhdGNoU2l6ZSwgaW5IZWlnaHQsIGluV2lkdGgsIGluQ2hhbm5lbHMsIG91dEhlaWdodCwgb3V0V2lkdGgsIHBhZEluZm8sIHN0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGRpbGF0aW9uSGVpZ2h0LCBkaWxhdGlvbldpZHRoLCBvdXRTaGFwZSB9ID0gYmFja2VuZF91dGlsLmNvbXB1dGVEaWxhdGlvbjJESW5mbyh4LnNoYXBlLCBmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsIHBhZCwgJ05IV0MnIC8qIGRhdGFGb3JtYXQgKi8sIGRpbGF0aW9ucyk7XG4gICAgICAgIHV0aWwuYXNzZXJ0KGR5LnJhbmsgPT09IG91dFNoYXBlLmxlbmd0aCwgKCkgPT4gYEVycm9yIGluICR7RGlsYXRpb24yREJhY2twcm9wRmlsdGVyfSwgZHkgYCArXG4gICAgICAgICAgICBgbXVzdCBoYXZlIHRoZSBzYW1lIHJhbmsgYXMgb3V0cHV0ICR7b3V0U2hhcGUubGVuZ3RofSwgYnV0IGdvdCBgICtcbiAgICAgICAgICAgIGAke2R5LnJhbmt9YCk7XG4gICAgICAgIGNvbnN0ICRkeSA9IHV0aWwudG9OZXN0ZWRBcnJheShvdXRTaGFwZSwgY3B1QmFja2VuZC5kYXRhLmdldChkeS5kYXRhSWQpLnZhbHVlcyk7XG4gICAgICAgIC8vIFRoZSBjb21wdXRlZCBmaWx0ZXIgZ3JhZGllbnRzIGhhcyB0aGUgc2FtZSBkaW1lbnNpb25zIGFzIHRoZSBmaWx0ZXI6XG4gICAgICAgIC8vIFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBkZXB0aF1cbiAgICAgICAgY29uc3QgZ3JhZGllbnRzID0gdXRpbC5tYWtlWmVyb3NOZXN0ZWRUeXBlZEFycmF5KGZpbHRlci5zaGFwZSwgZmlsdGVyLmR0eXBlKTtcbiAgICAgICAgLy8gSW4gdGhlIGNhc2Ugb2YgbXVsdGlwbGUgYXJnbWF4IGJyYW5jaGVzLCB3ZSBvbmx5IGJhY2stcHJvcGFnYXRlIGFsb25nIHRoZVxuICAgICAgICAvLyBsYXN0IGJyYW5jaCwgaS5lLiwgdGhlIG9uZSB3aXRoIGxhcmdlc3QgdmFsdWUgb2YgYGggKiBmaWx0ZXJfY29scyArIHdgLFxuICAgICAgICAvLyBzaW1pbGFybHkgdG8gdGhlIG1heC1wb29saW5nIGJhY2t3YXJkIHJvdXRpbmVzLlxuICAgICAgICAvLyBUaGlzIGltcGxlbWVudGF0aW9uIGZvbGxvd3MgdGhlIFRGIGMrKyBpbXBsZW1lbnRhdGlvbjpcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yZmxvdy9ibG9iL2Q5YTNhODQ5ZWRjMTk4ZTkwMTcyYmM1OGViMjkzZGU0NTdmOWQ5ODYvdGVuc29yZmxvdy9jb3JlL2tlcm5lbHMvZGlsYXRpb25fb3BzLmNjXG4gICAgICAgIGZvciAobGV0IGIgPSAwOyBiIDwgYmF0Y2hTaXplOyArK2IpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGhPdXQgPSAwOyBoT3V0IDwgb3V0SGVpZ2h0OyArK2hPdXQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBoQmVnID0gaE91dCAqIHN0cmlkZUhlaWdodCAtIHBhZEluZm8udG9wO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHdPdXQgPSAwOyB3T3V0IDwgb3V0V2lkdGg7ICsrd091dCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB3QmVnID0gd091dCAqIHN0cmlkZVdpZHRoIC0gcGFkSW5mby5sZWZ0O1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBkID0gMDsgZCA8IGluQ2hhbm5lbHM7ICsrZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGN1clZhbCA9IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhNYXggPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHdNYXggPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaCA9IDA7IGggPCBmaWx0ZXJIZWlnaHQ7ICsraCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhJbiA9IGhCZWcgKyBoICogZGlsYXRpb25IZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhJbiA+PSAwICYmIGhJbiA8IGluSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHcgPSAwOyB3IDwgZmlsdGVyV2lkdGg7ICsrdykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd0luID0gd0JlZyArIHcgKiBkaWxhdGlvbldpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdJbiA+PSAwICYmIHdJbiA8IGluV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSAkeFtiXVtoSW5dW3dJbl1bZF0gKyAkZmlsdGVyW2hdW3ddW2RdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwgPiBjdXJWYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyVmFsID0gdmFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoTWF4ID0gaDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd01heCA9IHc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JhZGllbnRzW2hNYXhdW3dNYXhdW2RdICs9ICRkeVtiXVtoT3V0XVt3T3V0XVtkXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRhSWQgPSBjcHVCYWNrZW5kLndyaXRlKHV0aWwudG9UeXBlZEFycmF5KGdyYWRpZW50cywgeC5kdHlwZSksIGZpbHRlci5zaGFwZSwgZmlsdGVyLmR0eXBlKTtcbiAgICAgICAgcmV0dXJuIHsgZGF0YUlkLCBzaGFwZTogZmlsdGVyLnNoYXBlLCBkdHlwZTogZmlsdGVyLmR0eXBlIH07XG4gICAgfVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURpbGF0aW9uMkRCYWNrcHJvcEZpbHRlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIERpbGF0aW9uMkRCYWNrcHJvcElucHV0LCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBjb25zdCBkaWxhdGlvbjJkQmFja3Byb3BJbnB1dENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBEaWxhdGlvbjJEQmFja3Byb3BJbnB1dCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogKHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgeCwgZmlsdGVyLCBkeSB9ID0gaW5wdXRzO1xuICAgICAgICBjb25zdCB7IHN0cmlkZXMsIHBhZCwgZGlsYXRpb25zIH0gPSBhdHRycztcbiAgICAgICAgY29uc3QgY3B1QmFja2VuZCA9IGJhY2tlbmQ7XG4gICAgICAgIGNvbnN0ICR4ID0gdXRpbC50b05lc3RlZEFycmF5KHguc2hhcGUsIGNwdUJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcyk7XG4gICAgICAgIGNvbnN0ICRmaWx0ZXIgPSB1dGlsLnRvTmVzdGVkQXJyYXkoZmlsdGVyLnNoYXBlLCBjcHVCYWNrZW5kLmRhdGEuZ2V0KGZpbHRlci5kYXRhSWQpLnZhbHVlcyk7XG4gICAgICAgIGNvbnN0IHsgYmF0Y2hTaXplLCBpbkhlaWdodCwgaW5XaWR0aCwgaW5DaGFubmVscywgb3V0SGVpZ2h0LCBvdXRXaWR0aCwgcGFkSW5mbywgc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aCwgZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGgsIG91dFNoYXBlIH0gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZURpbGF0aW9uMkRJbmZvKHguc2hhcGUsIGZpbHRlci5zaGFwZSwgc3RyaWRlcywgcGFkLCAnTkhXQycgLyogZGF0YUZvcm1hdCAqLywgZGlsYXRpb25zKTtcbiAgICAgICAgdXRpbC5hc3NlcnQoZHkucmFuayA9PT0gb3V0U2hhcGUubGVuZ3RoLCAoKSA9PiBgRXJyb3IgaW4gJHtEaWxhdGlvbjJEQmFja3Byb3BJbnB1dH0sIGR5IGAgK1xuICAgICAgICAgICAgYG11c3QgaGF2ZSB0aGUgc2FtZSByYW5rIGFzIG91dHB1dCAke291dFNoYXBlLmxlbmd0aH0sIGJ1dCBnb3QgYCArXG4gICAgICAgICAgICBgJHtkeS5yYW5rfWApO1xuICAgICAgICBjb25zdCAkZHkgPSB1dGlsLnRvTmVzdGVkQXJyYXkob3V0U2hhcGUsIGNwdUJhY2tlbmQuZGF0YS5nZXQoZHkuZGF0YUlkKS52YWx1ZXMpO1xuICAgICAgICAvLyBUaGUgY29tcHV0ZWQgZ3JhZGllbnRzIGhhcyB0aGUgc2FtZSBkaW1lbnNpb25zIGFzIHRoZSBpbnB1dDpcbiAgICAgICAgLy8gW2JhdGNoLCBpbnB1dEhlaWdodCwgaW5wdXRDb2xzLCBpbkNoYW5uZWxdXG4gICAgICAgIGNvbnN0IGdyYWRpZW50cyA9IHV0aWwubWFrZVplcm9zTmVzdGVkVHlwZWRBcnJheSh4LnNoYXBlLCB4LmR0eXBlKTtcbiAgICAgICAgLy8gSW4gdGhlIGNhc2Ugb2YgbXVsdGlwbGUgYXJnbWF4IGJyYW5jaGVzLCB3ZSBvbmx5IGJhY2stcHJvcGFnYXRlIGFsb25nIHRoZVxuICAgICAgICAvLyBsYXN0IGJyYW5jaCwgaS5lLiwgdGhlIG9uZSB3aXRoIGxhcmdlc3QgdmFsdWUgb2YgYGggKiBmaWx0ZXJfY29scyArIHdgLFxuICAgICAgICAvLyBzaW1pbGFybHkgdG8gdGhlIG1heC1wb29saW5nIGJhY2t3YXJkIHJvdXRpbmVzLlxuICAgICAgICAvLyBUaGlzIGltcGxlbWVudGF0aW9uIGZvbGxvd3MgdGhlIFRGIGMrKyBpbXBsZW1lbnRhdGlvbjpcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yZmxvdy9ibG9iL2Q5YTNhODQ5ZWRjMTk4ZTkwMTcyYmM1OGViMjkzZGU0NTdmOWQ5ODYvdGVuc29yZmxvdy9jb3JlL2tlcm5lbHMvZGlsYXRpb25fb3BzLmNjXG4gICAgICAgIGZvciAobGV0IGIgPSAwOyBiIDwgYmF0Y2hTaXplOyArK2IpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGhPdXQgPSAwOyBoT3V0IDwgb3V0SGVpZ2h0OyArK2hPdXQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBoQmVnID0gaE91dCAqIHN0cmlkZUhlaWdodCAtIHBhZEluZm8udG9wO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHdPdXQgPSAwOyB3T3V0IDwgb3V0V2lkdGg7ICsrd091dCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB3QmVnID0gd091dCAqIHN0cmlkZVdpZHRoIC0gcGFkSW5mby5sZWZ0O1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBkID0gMDsgZCA8IGluQ2hhbm5lbHM7ICsrZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGN1clZhbCA9IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhJbk1heCA9IChoQmVnIDwgMCkgPyAwIDogaEJlZztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB3SW5NYXggPSAod0JlZyA8IDApID8gMCA6IHdCZWc7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBoID0gMDsgaCA8IGZpbHRlckhlaWdodDsgKytoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaEluID0gaEJlZyArIGggKiBkaWxhdGlvbkhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaEluID49IDAgJiYgaEluIDwgaW5IZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgdyA9IDA7IHcgPCBmaWx0ZXJXaWR0aDsgKyt3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3SW4gPSB3QmVnICsgdyAqIGRpbGF0aW9uV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod0luID49IDAgJiYgd0luIDwgaW5XaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9ICR4W2JdW2hJbl1bd0luXVtkXSArICRmaWx0ZXJbaF1bd11bZF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA+IGN1clZhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJWYWwgPSB2YWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhJbk1heCA9IGhJbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd0luTWF4ID0gd0luO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGdyYWRpZW50c1tiXVtoSW5NYXhdW3dJbk1heF1bZF0gKz0gJGR5W2JdW2hPdXRdW3dPdXRdW2RdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGFJZCA9IGNwdUJhY2tlbmQud3JpdGUodXRpbC50b1R5cGVkQXJyYXkoZ3JhZGllbnRzLCB4LmR0eXBlKSwgeC5zaGFwZSwgeC5kdHlwZSk7XG4gICAgICAgIHJldHVybiB7IGRhdGFJZCwgc2hhcGU6IHguc2hhcGUsIGR0eXBlOiB4LmR0eXBlIH07XG4gICAgfVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURpbGF0aW9uMkRCYWNrcHJvcElucHV0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgRWluc3VtLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IG11bHRpcGx5IH0gZnJvbSAnLi9NdWx0aXBseSc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7IHN1bSB9IGZyb20gJy4vU3VtJztcbmltcG9ydCB7IHRyYW5zcG9zZSB9IGZyb20gJy4vVHJhbnNwb3NlJztcbmV4cG9ydCBmdW5jdGlvbiBlaW5zdW0oYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGVxdWF0aW9uIH0gPSBhdHRycztcbiAgICBjb25zdCB0ZW5zb3JzID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYWxsRGltcywgc3VtbWVkRGltcywgaWREaW1zIH0gPSBiYWNrZW5kX3V0aWwuZGVjb2RlRWluc3VtRXF1YXRpb24oZXF1YXRpb24sIHRlbnNvcnMubGVuZ3RoKTtcbiAgICBiYWNrZW5kX3V0aWwuY2hlY2tFaW5zdW1EaW1TaXplcyhhbGxEaW1zLmxlbmd0aCwgaWREaW1zLCB0ZW5zb3JzKTtcbiAgICBjb25zdCB7IHBhdGgsIHN0ZXBzIH0gPSBiYWNrZW5kX3V0aWwuZ2V0RWluc3VtQ29tcHV0ZVBhdGgoc3VtbWVkRGltcywgaWREaW1zKTtcbiAgICBjb25zdCBuU3RlcHMgPSBzdGVwcy5sZW5ndGg7XG4gICAgbGV0IG91dCA9IG51bGw7XG4gICAgbGV0IG51bURpbXNSZW1haW5pbmcgPSBhbGxEaW1zLmxlbmd0aDtcbiAgICBjb25zdCB0ZW5zb3JzVG9EaXNwb3NlID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuU3RlcHM7ICsraSkge1xuICAgICAgICBmb3IgKGNvbnN0IGlkVGVybSBvZiBzdGVwc1tpXSkge1xuICAgICAgICAgICAgY29uc3QgeyBwZXJtdXRhdGlvbkluZGljZXM6IHBlcm0sIGV4cGFuZERpbXM6IGRpbXNUb0V4cGFuZCB9ID0gYmFja2VuZF91dGlsLmdldEVpbnN1bVBlcm11dGF0aW9uKG51bURpbXNSZW1haW5pbmcsIGlkRGltc1tpZFRlcm1dKTtcbiAgICAgICAgICAgIGxldCB4O1xuICAgICAgICAgICAgaWYgKGJhY2tlbmRfdXRpbC5pc0lkZW50aXR5UGVybXV0YXRpb24ocGVybSkpIHtcbiAgICAgICAgICAgICAgICB4ID0gdGVuc29yc1tpZFRlcm1dO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgeCA9IHRyYW5zcG9zZSh7IGlucHV0czogeyB4OiB0ZW5zb3JzW2lkVGVybV0gfSwgYmFja2VuZCwgYXR0cnM6IHsgcGVybSB9IH0pO1xuICAgICAgICAgICAgICAgIHRlbnNvcnNUb0Rpc3Bvc2UucHVzaCh4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHRhcmdldFNoYXBlID0geC5zaGFwZS5zbGljZSgpO1xuICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBkaW1zVG9FeHBhbmQubGVuZ3RoOyArK2spIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRTaGFwZS5zcGxpY2UoZGltc1RvRXhwYW5kW2tdLCAwLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdXRpbC5hcnJheXNFcXVhbCh4LnNoYXBlLCB0YXJnZXRTaGFwZSkpIHtcbiAgICAgICAgICAgICAgICB4ID0gcmVzaGFwZSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiB0YXJnZXRTaGFwZSB9IH0pO1xuICAgICAgICAgICAgICAgIHRlbnNvcnNUb0Rpc3Bvc2UucHVzaCh4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvdXQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBvdXQgPSB4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgICAgICAgICAgICAgIG91dCA9IG11bHRpcGx5KHsgaW5wdXRzOiB7IGE6IHgsIGI6IG91dCB9LCBiYWNrZW5kIH0pO1xuICAgICAgICAgICAgICAgIHRlbnNvcnNUb0Rpc3Bvc2UucHVzaChvdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpIDwgblN0ZXBzIC0gMSkge1xuICAgICAgICAgICAgaWYgKHBhdGhbaV0gPj0gMCkge1xuICAgICAgICAgICAgICAgIG91dCA9IHN1bSh7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0czogeyB4OiBvdXQgfSxcbiAgICAgICAgICAgICAgICAgICAgYmFja2VuZCxcbiAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF4aXM6IHBhdGhbaV0gLSAoYWxsRGltcy5sZW5ndGggLSBudW1EaW1zUmVtYWluaW5nKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBEaW1zOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGVuc29yc1RvRGlzcG9zZS5wdXNoKG91dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBudW1EaW1zUmVtYWluaW5nLS07XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQ2xlYW4gdXAgaW50ZXJtZWRpYXRlIHRlbnNvcnMuXG4gICAgZm9yIChjb25zdCB0ZW5zb3JJbmZvIG9mIHRlbnNvcnNUb0Rpc3Bvc2UpIHtcbiAgICAgICAgaWYgKHRlbnNvckluZm8gPT09IG91dCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0ZW5zb3JJbmZvKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBlaW5zdW1Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRWluc3VtLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBlaW5zdW1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FaW5zdW0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVsdSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgZWx1ID0gdW5hcnlLZXJuZWxGdW5jKEVsdSwgKHhpKSA9PiB4aSA+PSAwID8geGkgOiAoTWF0aC5leHAoeGkpIC0gMSkpO1xuZXhwb3J0IGNvbnN0IGVsdUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBFbHUsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGVsdSxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FbHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRWx1R3JhZCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIGVsdUdyYWQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgZHksIHkgfSA9IGlucHV0cztcbiAgICBhc3NlcnROb3RDb21wbGV4KFtkeSwgeV0sICdlbHVHcmFkJyk7XG4gICAgY29uc3QgcmVzdWx0VmFsdWVzID0gbmV3IEZsb2F0MzJBcnJheSh1dGlsLnNpemVGcm9tU2hhcGUoeS5zaGFwZSkpO1xuICAgIGNvbnN0IHZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoeS5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBkeVZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoZHkuZGF0YUlkKS52YWx1ZXM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3QgdiA9IHZhbHVlc1tpXTtcbiAgICAgICAgaWYgKHYgPj0gMSkge1xuICAgICAgICAgICAgcmVzdWx0VmFsdWVzW2ldID0gZHlWYWx1ZXNbaV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHRWYWx1ZXNbaV0gPSBkeVZhbHVlc1tpXSAqICh2ICsgMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oeS5zaGFwZSwgJ2Zsb2F0MzInLCByZXN1bHRWYWx1ZXMpO1xufVxuZXhwb3J0IGNvbnN0IGVsdUdyYWRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRWx1R3JhZCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogZWx1R3JhZFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUVsdUdyYWQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRXF1YWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IGVxdWFsSW1wbCA9IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwoKGEsIGIpID0+IChhID09PSBiKSA/IDEgOiAwKTtcbmV4cG9ydCBjb25zdCBlcXVhbCA9IGJpbmFyeUtlcm5lbEZ1bmMoRXF1YWwsIGVxdWFsSW1wbCwgbnVsbCAvKiBjb21wbGV4SW1wbCAqLywgJ2Jvb2wnKTtcbmV4cG9ydCBjb25zdCBlcXVhbENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBFcXVhbCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogZXF1YWxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FcXVhbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBFcmYgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuY29uc3QgcCA9IGJhY2tlbmRfdXRpbC5FUkZfUDtcbmNvbnN0IGExID0gYmFja2VuZF91dGlsLkVSRl9BMTtcbmNvbnN0IGEyID0gYmFja2VuZF91dGlsLkVSRl9BMjtcbmNvbnN0IGEzID0gYmFja2VuZF91dGlsLkVSRl9BMztcbmNvbnN0IGE0ID0gYmFja2VuZF91dGlsLkVSRl9BNDtcbmNvbnN0IGE1ID0gYmFja2VuZF91dGlsLkVSRl9BNTtcbmV4cG9ydCBjb25zdCBlcmYgPSB1bmFyeUtlcm5lbEZ1bmMoRXJmLCAoeGkpID0+IHtcbiAgICBjb25zdCBzaWduID0gTWF0aC5zaWduKHhpKTtcbiAgICBjb25zdCB2ID0gTWF0aC5hYnMoeGkpO1xuICAgIGNvbnN0IHQgPSAxLjAgLyAoMS4wICsgcCAqIHYpO1xuICAgIHJldHVybiBzaWduICpcbiAgICAgICAgKDEuMCAtXG4gICAgICAgICAgICAoKCgoKGE1ICogdCArIGE0KSAqIHQpICsgYTMpICogdCArIGEyKSAqIHQgKyBhMSkgKiB0ICpcbiAgICAgICAgICAgICAgICBNYXRoLmV4cCgtdiAqIHYpKTtcbn0pO1xuZXhwb3J0IGNvbnN0IGVyZkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBFcmYsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGVyZixcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FcmYuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEV4cCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVTaW1wbGVVbmFyeUltcGwgfSBmcm9tICcuLi91dGlscy91bmFyeV9pbXBsJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuY0Zyb21JbXBsIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IGV4cEltcGwgPSBjcmVhdGVTaW1wbGVVbmFyeUltcGwoKHhpKSA9PiBNYXRoLmV4cCh4aSkpO1xuZXhwb3J0IGNvbnN0IGV4cCA9IHVuYXJ5S2VybmVsRnVuY0Zyb21JbXBsKEV4cCwgZXhwSW1wbCk7XG5leHBvcnQgY29uc3QgZXhwQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEV4cCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogZXhwLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUV4cC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFeHBhbmREaW1zLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuZXhwb3J0IGZ1bmN0aW9uIGV4cGFuZERpbXMoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGlucHV0IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBkaW0gfSA9IGF0dHJzO1xuICAgIGNvbnN0IGlucHV0UmFuayA9IGlucHV0LnNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBuZXdTaGFwZSA9IGlucHV0LnNoYXBlLnNsaWNlKCk7XG4gICAgbGV0ICRkaW0gPSBkaW07XG4gICAgaWYgKGRpbSA8IDApIHtcbiAgICAgICAgLy8gTmVnYXRpdmUgdmFsdWUgaXMgY291bnRlZCBmcm9tIHRoZSB0YWlsIG9mIHJhbmsuXG4gICAgICAgIHV0aWwuYXNzZXJ0KC0oaW5wdXRSYW5rICsgMSkgPD0gZGltLCAoKSA9PiBgQXhpcyBtdXN0IGJlIGluIHRoZSBpbnRlcnZhbCBbJHstKGlucHV0UmFuayArIDEpfSwgJHtpbnB1dFJhbmt9XWApO1xuICAgICAgICAkZGltID0gaW5wdXRSYW5rICsgZGltICsgMTtcbiAgICB9XG4gICAgbmV3U2hhcGUuc3BsaWNlKCRkaW0sIDAsIDEpO1xuICAgIHJldHVybiByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IGlucHV0IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBuZXdTaGFwZSB9IH0pO1xufVxuZXhwb3J0IGNvbnN0IGV4cGFuZERpbXNDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRXhwYW5kRGltcyxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogZXhwYW5kRGltc1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUV4cGFuZERpbXMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEV4cG0xIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVNpbXBsZVVuYXJ5SW1wbCB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X2ltcGwnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jRnJvbUltcGwgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgZXhwbTFJbXBsID0gY3JlYXRlU2ltcGxlVW5hcnlJbXBsKCh4aSkgPT4gTWF0aC5leHBtMSh4aSkpO1xuZXhwb3J0IGNvbnN0IGV4cG0xID0gdW5hcnlLZXJuZWxGdW5jRnJvbUltcGwoRXhwbTEsIGV4cG0xSW1wbCk7XG5leHBvcnQgY29uc3QgZXhwbTFDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRXhwbTEsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGV4cG0xLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUV4cG0xLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEZGVCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBmZnRCYXRjaCB9IGZyb20gJy4uL3V0aWxzL2ZmdF91dGlscyc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmV4cG9ydCBmdW5jdGlvbiBmZnQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW5wdXQgfSA9IGlucHV0cztcbiAgICBjb25zdCBpbnB1dFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoaW5wdXQuc2hhcGUpO1xuICAgIC8vIENvbGxhcHNlIGFsbCBvdXRlciBkaW1lbnNpb25zIHRvIGEgc2luZ2xlIGJhdGNoIGRpbWVuc2lvbi5cbiAgICBjb25zdCBpbm5lckRpbWVuc2lvblNpemUgPSBpbnB1dC5zaGFwZVtpbnB1dC5zaGFwZS5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBiYXRjaCA9IGlucHV0U2l6ZSAvIGlubmVyRGltZW5zaW9uU2l6ZTtcbiAgICBjb25zdCBpbnB1dDJEID0gcmVzaGFwZSh7XG4gICAgICAgIGlucHV0czogeyB4OiBpbnB1dCB9LFxuICAgICAgICBiYWNrZW5kLFxuICAgICAgICBhdHRyczogeyBzaGFwZTogW2JhdGNoLCBpbm5lckRpbWVuc2lvblNpemVdIH1cbiAgICB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBmZnRCYXRjaChpbnB1dDJELCBmYWxzZSwgYmFja2VuZCk7XG4gICAgY29uc3QgcmVzdWx0UmVzaGFwZWQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHJlc3VsdCB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogaW5wdXQuc2hhcGUgfSB9KTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGlucHV0MkQpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0UmVzaGFwZWQ7XG59XG5leHBvcnQgY29uc3QgZmZ0Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEZGVCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogZmZ0XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RkZULmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEZpbGwsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGwoYXJncykge1xuICAgIGNvbnN0IHsgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBzaGFwZSwgdmFsdWUsIGR0eXBlIH0gPSBhdHRycztcbiAgICBjb25zdCAkZHR5cGUgPSBkdHlwZSB8fCB1dGlsLmluZmVyRHR5cGUodmFsdWUpO1xuICAgIGNvbnN0IHZhbHVlcyA9IHV0aWwuZ2V0QXJyYXlGcm9tRFR5cGUoJGR0eXBlLCB1dGlsLnNpemVGcm9tU2hhcGUoc2hhcGUpKTtcbiAgICBmaWxsVmFsdWVzKHZhbHVlcywgdmFsdWUsICRkdHlwZSk7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oc2hhcGUsICRkdHlwZSwgdmFsdWVzKTtcbn1cbmV4cG9ydCBjb25zdCBmaWxsQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEZpbGwsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGZpbGxcbn07XG5mdW5jdGlvbiBmaWxsVmFsdWVzKHZhbHVlcywgdmFsdWUsIGR0eXBlKSB7XG4gICAgaWYgKGR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICB2YWx1ZXMuZmlsbCh2YWx1ZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YWx1ZXMuZmlsbCh2YWx1ZSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RmlsbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBGbGlwTGVmdFJpZ2h0LCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBjb25zdCBmbGlwTGVmdFJpZ2h0Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEZsaXBMZWZ0UmlnaHQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6ICh7IGlucHV0cywgYXR0cnMsIGJhY2tlbmQgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IGltYWdlIH0gPSBpbnB1dHM7XG4gICAgICAgIGNvbnN0IGNwdUJhY2tlbmQgPSBiYWNrZW5kO1xuICAgICAgICBjb25zdCBvdXRwdXQgPSB1dGlsLmdldFR5cGVkQXJyYXlGcm9tRFR5cGUoaW1hZ2UuZHR5cGUsIHV0aWwuc2l6ZUZyb21TaGFwZShpbWFnZS5zaGFwZSkpO1xuICAgICAgICBjb25zdCBbYmF0Y2gsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBudW1DaGFubmVsc10gPSBpbWFnZS5zaGFwZTtcbiAgICAgICAgY29uc3QgaW1hZ2VWYWxzID0gY3B1QmFja2VuZC5kYXRhLmdldChpbWFnZS5kYXRhSWQpLnZhbHVlcztcbiAgICAgICAgZm9yIChsZXQgYmF0Y2hJZHggPSAwOyBiYXRjaElkeCA8IGJhdGNoOyBiYXRjaElkeCsrKSB7XG4gICAgICAgICAgICBjb25zdCBiYXRjaE9mZnNldCA9IGJhdGNoSWR4ICogaW1hZ2VXaWR0aCAqIGltYWdlSGVpZ2h0ICogbnVtQ2hhbm5lbHM7XG4gICAgICAgICAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBpbWFnZUhlaWdodDsgcm93KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3dPZmZzZXQgPSByb3cgKiAoaW1hZ2VXaWR0aCAqIG51bUNoYW5uZWxzKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCBpbWFnZVdpZHRoOyBjb2wrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2xPZmZzZXQgPSBjb2wgKiBudW1DaGFubmVscztcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBudW1DaGFubmVsczsgY2hhbm5lbCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb29yZFggPSBNYXRoLnJvdW5kKGltYWdlV2lkdGggLSBjb2wgLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG91dElkeCA9IGJhdGNoT2Zmc2V0ICsgcm93T2Zmc2V0ICsgY29sT2Zmc2V0ICsgY2hhbm5lbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvdXRwdXRWYWx1ZSA9IGltYWdlVmFsc1tvdXRJZHhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGNvb3JkaW5hdGUgcG9zaXRpb24gZmFsbHMgd2l0aGluIHRoZSBpbWFnZSBib3VuZGFyaWVzLi4uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29vcmRYID49IDAgJiYgY29vcmRYIDwgaW1hZ2VXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgb3V0cHV0IHRvIHRoZSBpbWFnZSB2YWx1ZSBhdCB0aGUgY29vcmRpbmF0ZSBwb3NpdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByb3RhdGVkQ29sT2Zmc2V0ID0gY29vcmRYICogbnVtQ2hhbm5lbHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW1hZ2VJZHggPSBiYXRjaE9mZnNldCArIHJvd09mZnNldCArIHJvdGF0ZWRDb2xPZmZzZXQgKyBjaGFubmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFZhbHVlID0gaW1hZ2VWYWxzW2ltYWdlSWR4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtvdXRJZHhdID0gb3V0cHV0VmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YUlkID0gY3B1QmFja2VuZC53cml0ZShvdXRwdXQsIGltYWdlLnNoYXBlLCBpbWFnZS5kdHlwZSk7XG4gICAgICAgIHJldHVybiB7IGRhdGFJZCwgc2hhcGU6IGltYWdlLnNoYXBlLCBkdHlwZTogaW1hZ2UuZHR5cGUgfTtcbiAgICB9XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RmxpcExlZnRSaWdodC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRmxvb3IgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlU2ltcGxlVW5hcnlJbXBsIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfaW1wbCc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmNGcm9tSW1wbCB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBmbG9vckltcGwgPSBjcmVhdGVTaW1wbGVVbmFyeUltcGwoKHhpKSA9PiBNYXRoLmZsb29yKHhpKSk7XG5leHBvcnQgY29uc3QgZmxvb3IgPSB1bmFyeUtlcm5lbEZ1bmNGcm9tSW1wbChGbG9vciwgZmxvb3JJbXBsKTtcbmV4cG9ydCBjb25zdCBmbG9vckNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBGbG9vcixcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogZmxvb3IsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Rmxvb3IuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRmxvb3JEaXYgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IGZsb29yRGl2SW1wbCA9IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwoKGEsIGIpID0+IE1hdGguZmxvb3IoYSAvIGIpKTtcbmV4cG9ydCBjb25zdCBmbG9vckRpdiA9IGJpbmFyeUtlcm5lbEZ1bmMoRmxvb3JEaXYsIGZsb29yRGl2SW1wbCwgbnVsbCAvKiBjb21wbGV4SW1wbCAqLywgJ2ludDMyJyk7XG5leHBvcnQgY29uc3QgZmxvb3JEaXZDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRmxvb3JEaXYsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGZsb29yRGl2XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Rmxvb3JEaXYuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRnVzZWRDb252MkQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXBwbHlBY3RpdmF0aW9uIH0gZnJvbSAnLi4vdXRpbHMvZnVzZWRfdXRpbHMnO1xuaW1wb3J0IHsgYWRkIH0gZnJvbSAnLi9BZGQnO1xuaW1wb3J0IHsgY29udjJEIH0gZnJvbSAnLi9Db252MkQnO1xuZXhwb3J0IGZ1bmN0aW9uIGZ1c2VkQ29udjJEKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4LCBmaWx0ZXIsIGJpYXMsIHByZWx1QWN0aXZhdGlvbldlaWdodHMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGlsYXRpb25zLCBkaW1Sb3VuZGluZ01vZGUsIGFjdGl2YXRpb24sIGxlYWt5cmVsdUFscGhhIH0gPSBhdHRycztcbiAgICBsZXQgcmVzdWx0ID0gY29udjJEKHtcbiAgICAgICAgaW5wdXRzOiB7IHgsIGZpbHRlciB9LFxuICAgICAgICBiYWNrZW5kLFxuICAgICAgICBhdHRyczogeyBzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQsIGRpbGF0aW9ucywgZGltUm91bmRpbmdNb2RlIH1cbiAgICB9KTtcbiAgICBpZiAoYmlhcykge1xuICAgICAgICBjb25zdCByZXN1bHRPbGQgPSByZXN1bHQ7XG4gICAgICAgIHJlc3VsdCA9IGFkZCh7IGlucHV0czogeyBhOiByZXN1bHQsIGI6IGJpYXMgfSwgYmFja2VuZCB9KTtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXN1bHRPbGQpO1xuICAgIH1cbiAgICBpZiAoYWN0aXZhdGlvbikge1xuICAgICAgICBjb25zdCByZXN1bHRPbGQgPSByZXN1bHQ7XG4gICAgICAgIHJlc3VsdCA9IGFwcGx5QWN0aXZhdGlvbihiYWNrZW5kLCByZXN1bHQsIGFjdGl2YXRpb24sIHByZWx1QWN0aXZhdGlvbldlaWdodHMsIGxlYWt5cmVsdUFscGhhKTtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXN1bHRPbGQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGNvbnN0IGZ1c2VkQ29udjJEQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEZ1c2VkQ29udjJELFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBmdXNlZENvbnYyRFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZ1c2VkQ29udjJELmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEZ1c2VkRGVwdGh3aXNlQ29udjJEIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFwcGx5QWN0aXZhdGlvbiB9IGZyb20gJy4uL3V0aWxzL2Z1c2VkX3V0aWxzJztcbmltcG9ydCB7IGFkZCB9IGZyb20gJy4vQWRkJztcbmltcG9ydCB7IGRlcHRod2lzZUNvbnYyZE5hdGl2ZSB9IGZyb20gJy4vRGVwdGh3aXNlQ29udjJkTmF0aXZlJztcbmV4cG9ydCBmdW5jdGlvbiBmdXNlZERlcHRod2lzZUNvbnYyRChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCwgZmlsdGVyLCBiaWFzLCBwcmVsdUFjdGl2YXRpb25XZWlnaHRzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQsIGRpbGF0aW9ucywgZGltUm91bmRpbmdNb2RlLCBhY3RpdmF0aW9uLCBsZWFreXJlbHVBbHBoYSB9ID0gYXR0cnM7XG4gICAgbGV0IHJlc3VsdCA9IGRlcHRod2lzZUNvbnYyZE5hdGl2ZSh7XG4gICAgICAgIGlucHV0czogeyB4LCBmaWx0ZXIgfSxcbiAgICAgICAgYmFja2VuZCxcbiAgICAgICAgYXR0cnM6IHsgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0LCBkaWxhdGlvbnMsIGRpbVJvdW5kaW5nTW9kZSB9XG4gICAgfSk7XG4gICAgaWYgKGJpYXMpIHtcbiAgICAgICAgY29uc3Qgb2xkUmVzdWx0ID0gcmVzdWx0O1xuICAgICAgICByZXN1bHQgPSBhZGQoeyBpbnB1dHM6IHsgYTogcmVzdWx0LCBiOiBiaWFzIH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ob2xkUmVzdWx0KTtcbiAgICB9XG4gICAgaWYgKGFjdGl2YXRpb24pIHtcbiAgICAgICAgY29uc3Qgb2xkUmVzdWx0ID0gcmVzdWx0O1xuICAgICAgICByZXN1bHQgPSBhcHBseUFjdGl2YXRpb24oYmFja2VuZCwgcmVzdWx0LCBhY3RpdmF0aW9uLCBwcmVsdUFjdGl2YXRpb25XZWlnaHRzLCBsZWFreXJlbHVBbHBoYSk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ob2xkUmVzdWx0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBjb25zdCBmdXNlZERlcHRod2lzZUNvbnYyRENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBGdXNlZERlcHRod2lzZUNvbnYyRCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogZnVzZWREZXB0aHdpc2VDb252MkRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GdXNlZERlcHRod2lzZUNvbnYyRC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIEdhdGhlck5kLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGdhdGhlck5kSW1wbCB9IGZyb20gJy4vR2F0aGVyTmRfSW1wbCc7XG5leHBvcnQgZnVuY3Rpb24gZ2F0aGVyTmQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgcGFyYW1zLCBpbmRpY2VzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgcGFyYW1zU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShwYXJhbXMuc2hhcGUpO1xuICAgIGNvbnN0IGluZGljZXNTaGFwZSA9IGluZGljZXMuc2hhcGU7XG4gICAgY29uc3Qgc2xpY2VSYW5rID0gaW5kaWNlc1NoYXBlW2luZGljZXNTaGFwZS5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBbcmVzdWx0U2hhcGUsIG51bVNsaWNlcywgc2xpY2VTaXplLCBzdHJpZGVzXSA9IGJhY2tlbmRfdXRpbC5wcmVwYXJlQW5kVmFsaWRhdGUocGFyYW1zLCBpbmRpY2VzKTtcbiAgICBpZiAobnVtU2xpY2VzID09PSAwKSB7XG4gICAgICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHJlc3VsdFNoYXBlLCBwYXJhbXMuZHR5cGUsIFtdKTtcbiAgICB9XG4gICAgY29uc3QgaW5kaWNlc0RhdGEgPSBiYWNrZW5kLmRhdGEuZ2V0KGluZGljZXMuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgcGFyYW1zQnVmID0gYmFja2VuZC5idWZmZXJTeW5jKHBhcmFtcyk7XG4gICAgY29uc3Qgb3V0QnVmID0gZ2F0aGVyTmRJbXBsKGluZGljZXNEYXRhLCBwYXJhbXNCdWYsIHBhcmFtcy5kdHlwZSwgbnVtU2xpY2VzLCBzbGljZVJhbmssIHNsaWNlU2l6ZSwgc3RyaWRlcywgcGFyYW1zLnNoYXBlLCBwYXJhbXNTaXplKTtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhyZXN1bHRTaGFwZSwgcGFyYW1zLmR0eXBlLCBvdXRCdWYudmFsdWVzKTtcbn1cbmV4cG9ydCBjb25zdCBnYXRoZXJOZENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBHYXRoZXJOZCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogZ2F0aGVyTmRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1HYXRoZXJOZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBidWZmZXIgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIGdhdGhlck5kSW1wbChpbmRpY2VzRGF0YSwgcGFyYW1zQnVmLCBkdHlwZSwgbnVtU2xpY2VzLCBzbGljZVJhbmssIHNsaWNlU2l6ZSwgc3RyaWRlcywgcGFyYW1zU2hhcGUsIHBhcmFtc1NpemUpIHtcbiAgICBjb25zdCBvdXRCdWYgPSBidWZmZXIoW251bVNsaWNlcywgc2xpY2VTaXplXSwgZHR5cGUpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtU2xpY2VzOyBpKyspIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBbXTtcbiAgICAgICAgbGV0IGZsYXR0ZW5JbmRleCA9IDA7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc2xpY2VSYW5rOyBqKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGRpbSA9IGluZGljZXNEYXRhW2kgKiBzbGljZVJhbmsgKyBqXTtcbiAgICAgICAgICAgIGZsYXR0ZW5JbmRleCArPSBkaW0gKiBzdHJpZGVzW2pdO1xuICAgICAgICAgICAgaW5kZXgucHVzaChkaW0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmbGF0dGVuSW5kZXggPCAwIHx8IGZsYXR0ZW5JbmRleCA+PSBwYXJhbXNTaXplIC8gc2xpY2VTaXplKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaW5kaWNlczogJHtpbmRleH0gZG9lcyBub3QgaW5kZXggaW50byAke3BhcmFtc1NoYXBlfWApO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgc2xpY2VTaXplOyBrKyspIHtcbiAgICAgICAgICAgIG91dEJ1Zi52YWx1ZXNbaSAqIHNsaWNlU2l6ZSArIGtdID1cbiAgICAgICAgICAgICAgICBwYXJhbXNCdWYuZ2V0KC4uLnBhcmFtc0J1Zi5pbmRleFRvTG9jKGZsYXR0ZW5JbmRleCAqIHNsaWNlU2l6ZSArIGspKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0QnVmO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9R2F0aGVyTmRfSW1wbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIEdhdGhlclYyLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyBnYXRoZXJWMkltcGwgfSBmcm9tICcuL0dhdGhlclYyX2ltcGwnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5leHBvcnQgZnVuY3Rpb24gZ2F0aGVyVjIoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHgsIGluZGljZXMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGF4aXMsIGJhdGNoRGltcyB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChbeCwgaW5kaWNlc10sICdnYXRoZXJWMicpO1xuICAgIGxldCAkYmF0Y2hEaW1zID0gYmF0Y2hEaW1zO1xuICAgIGlmIChiYXRjaERpbXMgPT0gbnVsbCkge1xuICAgICAgICAkYmF0Y2hEaW1zID0gMDtcbiAgICB9XG4gICAgY29uc3QgaW5kaWNlc1NpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoaW5kaWNlcy5zaGFwZSk7XG4gICAgY29uc3QgcGFyc2VkQXhpcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSlbMF07XG4gICAgY29uc3Qgc2hhcGVJbmZvID0gYmFja2VuZF91dGlsLnNlZ21lbnRfdXRpbC5jb2xsZWN0R2F0aGVyT3BTaGFwZUluZm8oeCwgaW5kaWNlcywgcGFyc2VkQXhpcywgJGJhdGNoRGltcyk7XG4gICAgY29uc3QgZmxhdHRlblggPSByZXNoYXBlKHtcbiAgICAgICAgaW5wdXRzOiB7IHggfSxcbiAgICAgICAgYmFja2VuZCxcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgIHNoYXBlOiBbXG4gICAgICAgICAgICAgICAgc2hhcGVJbmZvLmJhdGNoU2l6ZSwgc2hhcGVJbmZvLm91dGVyU2l6ZSwgc2hhcGVJbmZvLmRpbVNpemUsXG4gICAgICAgICAgICAgICAgc2hhcGVJbmZvLnNsaWNlU2l6ZVxuICAgICAgICAgICAgXVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgZmxhdHRlbkluZGV4ID0gcmVzaGFwZSh7XG4gICAgICAgIGlucHV0czogeyB4OiBpbmRpY2VzIH0sXG4gICAgICAgIGJhY2tlbmQsXG4gICAgICAgIGF0dHJzOiB7IHNoYXBlOiBbc2hhcGVJbmZvLmJhdGNoU2l6ZSwgaW5kaWNlc1NpemUgLyBzaGFwZUluZm8uYmF0Y2hTaXplXSB9XG4gICAgfSk7XG4gICAgY29uc3QgZmxhdHRlbk91dHB1dFNoYXBlID0gW1xuICAgICAgICBzaGFwZUluZm8uYmF0Y2hTaXplLCBzaGFwZUluZm8ub3V0ZXJTaXplLCBpbmRpY2VzU2l6ZSAvIHNoYXBlSW5mby5iYXRjaFNpemUsXG4gICAgICAgIHNoYXBlSW5mby5zbGljZVNpemVcbiAgICBdO1xuICAgIGNvbnN0IGluZGljZXNCdWYgPSBiYWNrZW5kLmJ1ZmZlclN5bmMoZmxhdHRlbkluZGV4KTtcbiAgICBjb25zdCB4QnVmID0gYmFja2VuZC5idWZmZXJTeW5jKGZsYXR0ZW5YKTtcbiAgICBjb25zdCBvdXRCdWYgPSBnYXRoZXJWMkltcGwoeEJ1ZiwgaW5kaWNlc0J1ZiwgZmxhdHRlbk91dHB1dFNoYXBlKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGZsYXR0ZW5YKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGZsYXR0ZW5JbmRleCk7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oc2hhcGVJbmZvLm91dHB1dFNoYXBlLCBvdXRCdWYuZHR5cGUsIG91dEJ1Zi52YWx1ZXMpO1xufVxuZXhwb3J0IGNvbnN0IGdhdGhlclYyQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEdhdGhlclYyLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBnYXRoZXJWMlxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUdhdGhlclYyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJ1ZmZlciB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgZnVuY3Rpb24gZ2F0aGVyVjJJbXBsKHhCdWYsIGluZGljZXNCdWYsIGZsYXR0ZW5PdXRwdXRTaGFwZSkge1xuICAgIGNvbnN0IG91dEJ1ZiA9IGJ1ZmZlcihmbGF0dGVuT3V0cHV0U2hhcGUsIHhCdWYuZHR5cGUpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0QnVmLnNpemU7ICsraSkge1xuICAgICAgICBjb25zdCBuZXdMb2MgPSBvdXRCdWYuaW5kZXhUb0xvYyhpKTtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxMb2MgPSBuZXdMb2Muc2xpY2UoKTtcbiAgICAgICAgY29uc3QgYmF0Y2hJZHggPSBvcmlnaW5hbExvY1swXTtcbiAgICAgICAgY29uc3QgaW5kaWNlc0lkeCA9IG9yaWdpbmFsTG9jWzJdO1xuICAgICAgICBjb25zdCBpbmRpY2VzSW5kZXggPSBpbmRpY2VzQnVmLmxvY1RvSW5kZXgoW2JhdGNoSWR4LCBpbmRpY2VzSWR4XSk7XG4gICAgICAgIG9yaWdpbmFsTG9jWzJdID0gaW5kaWNlc0J1Zi52YWx1ZXNbaW5kaWNlc0luZGV4XTtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxJbmRleCA9IHhCdWYubG9jVG9JbmRleChvcmlnaW5hbExvYyk7XG4gICAgICAgIG91dEJ1Zi52YWx1ZXNbaV0gPSB4QnVmLnZhbHVlc1tvcmlnaW5hbEluZGV4XTtcbiAgICB9XG4gICAgcmV0dXJuIG91dEJ1Zjtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUdhdGhlclYyX2ltcGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgR3JlYXRlciB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X2ltcGwnO1xuaW1wb3J0IHsgYmluYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgZ3JlYXRlckltcGwgPSBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsKChhLCBiKSA9PiAoYSA+IGIpID8gMSA6IDApO1xuZXhwb3J0IGNvbnN0IGdyZWF0ZXIgPSBiaW5hcnlLZXJuZWxGdW5jKEdyZWF0ZXIsIGdyZWF0ZXJJbXBsLCBudWxsIC8qIGNvbXBsZXhJbXBsICovLCAnYm9vbCcpO1xuZXhwb3J0IGNvbnN0IGdyZWF0ZXJDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogR3JlYXRlcixcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogZ3JlYXRlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUdyZWF0ZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgR3JlYXRlckVxdWFsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfaW1wbCc7XG5pbXBvcnQgeyBiaW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBncmVhdGVyRXF1YWxJbXBsID0gY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoYSwgYikgPT4gKGEgPj0gYikgPyAxIDogMCk7XG5leHBvcnQgY29uc3QgZ3JlYXRlckVxdWFsID0gYmluYXJ5S2VybmVsRnVuYyhHcmVhdGVyRXF1YWwsIGdyZWF0ZXJFcXVhbEltcGwsIG51bGwgLyogY29tcGxleEltcGwgKi8sICdib29sJyk7XG5leHBvcnQgY29uc3QgZ3JlYXRlckVxdWFsQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEdyZWF0ZXJFcXVhbCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogZ3JlYXRlckVxdWFsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9R3JlYXRlckVxdWFsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IElGRlQsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgZmZ0QmF0Y2ggfSBmcm9tICcuLi91dGlscy9mZnRfdXRpbHMnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5leHBvcnQgZnVuY3Rpb24gaWZmdChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBpbnB1dCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IGlucHV0U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShpbnB1dC5zaGFwZSk7XG4gICAgLy8gQ29sbGFwc2UgYWxsIG91dGVyIGRpbWVuc2lvbnMgdG8gYSBzaW5nbGUgYmF0Y2ggZGltZW5zaW9uLlxuICAgIGNvbnN0IGlubmVyRGltZW5zaW9uU2l6ZSA9IGlucHV0LnNoYXBlW2lucHV0LnNoYXBlLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IGJhdGNoID0gaW5wdXRTaXplIC8gaW5uZXJEaW1lbnNpb25TaXplO1xuICAgIGNvbnN0IGlucHV0MkQgPSByZXNoYXBlKHtcbiAgICAgICAgaW5wdXRzOiB7IHg6IGlucHV0IH0sXG4gICAgICAgIGJhY2tlbmQsXG4gICAgICAgIGF0dHJzOiB7IHNoYXBlOiBbYmF0Y2gsIGlubmVyRGltZW5zaW9uU2l6ZV0gfVxuICAgIH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGZmdEJhdGNoKGlucHV0MkQsIHRydWUsIGJhY2tlbmQpO1xuICAgIGNvbnN0IHJlc3VsdFJlc2hhcGVkID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiByZXN1bHQgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IGlucHV0LnNoYXBlIH0gfSk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpbnB1dDJEKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdFJlc2hhcGVkO1xufVxuZXhwb3J0IGNvbnN0IGlmZnRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogSUZGVCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogaWZmdFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUlGRlQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgSWRlbnRpdHkgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBiYWNrZW5kLmluY1JlZih4LmRhdGFJZCk7XG4gICAgcmV0dXJuIHsgZGF0YUlkOiB4LmRhdGFJZCwgc2hhcGU6IHguc2hhcGUsIGR0eXBlOiB4LmR0eXBlIH07XG59XG5leHBvcnQgY29uc3QgaWRlbnRpdHlDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogSWRlbnRpdHksXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGlkZW50aXR5XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SWRlbnRpdHkuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgSW1hZyB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgZnVuY3Rpb24gaW1hZyhhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBpbnB1dCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IGltYWcgPSBiYWNrZW5kLmRhdGEuZ2V0KGlucHV0LmRhdGFJZCkuY29tcGxleFRlbnNvckluZm9zLmltYWc7XG4gICAgY29uc3QgaW1hZ1ZhbCA9IGJhY2tlbmQuZGF0YS5nZXQoaW1hZy5kYXRhSWQpLnZhbHVlcztcbiAgICAvLyBXaGVuIGNvbXBsZXggdGVuc29yIGlzIGRpc3Bvc2VkLCBpdHMgdW5kZXJseWluZyBwYXJ0cyB3aWxsIGJlIGRpc3Bvc2VkIHRvby5cbiAgICAvLyBNYWtlIG5ldyB0ZW5zb3Igb3V0IG9mIHRoZSBpbWFnIHZhbHVlIG9mIHRoZSBjb21wbGV4LiBUaGlzIG1ha2VzIHN1cmUgdGhlXG4gICAgLy8gdmFsdWUgaXMgc3RpbGwgYWNjZXNzaWJsZSBldmVuIGlmIGNvbXBsZXggdGVuc29yIGlzIGRpc3Bvc2VkLlxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGltYWcuc2hhcGUsIGltYWcuZHR5cGUsIGltYWdWYWwpO1xufVxuZXhwb3J0IGNvbnN0IGltYWdDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogSW1hZyxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogaW1hZ1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUltYWcuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IElzRmluaXRlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBpc0Zpbml0ZSA9IHVuYXJ5S2VybmVsRnVuYyhJc0Zpbml0ZSwgKHhpKSA9PiBOdW1iZXIuaXNGaW5pdGUoeGkpID8gMSA6IDAsICdib29sJyk7XG5leHBvcnQgY29uc3QgaXNGaW5pdGVDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogSXNGaW5pdGUsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGlzRmluaXRlLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUlzRmluaXRlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBJc0luZiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgaXNJbmYgPSB1bmFyeUtlcm5lbEZ1bmMoSXNJbmYsICh4aSkgPT4gTWF0aC5hYnMoeGkpID09PSBJbmZpbml0eSA/IDEgOiAwLCAnYm9vbCcpO1xuZXhwb3J0IGNvbnN0IGlzSW5mQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IElzSW5mLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBpc0luZixcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Jc0luZi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgSXNOYW4gfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IGlzTmFOID0gdW5hcnlLZXJuZWxGdW5jKElzTmFuLCAoeGkpID0+IE51bWJlci5pc05hTih4aSkgPyAxIDogMCwgJ2Jvb2wnKTtcbmV4cG9ydCBjb25zdCBpc05hTkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBJc05hbixcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogaXNOYU4sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SXNOYU4uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTFJOLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5leHBvcnQgZnVuY3Rpb24gbFJOKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBkZXB0aFJhZGl1cywgYmlhcywgYWxwaGEsIGJldGEgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ0xSTicpO1xuICAgIGNvbnN0IGNoYW5uZWxzID0geC5zaGFwZVszXTtcbiAgICBjb25zdCBtYXhEID0gY2hhbm5lbHMgLSAxO1xuICAgIGNvbnN0IHhWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3Qgc2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSh4LnNoYXBlKTtcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgRmxvYXQzMkFycmF5KHNpemUpO1xuICAgIGZ1bmN0aW9uIHN1bUFjcm9zc0NoYW5uZWxzKG9mZnNldCkge1xuICAgICAgICBjb25zdCBjdXJyZW50Q2hhbm5lbCA9IG9mZnNldCAlIGNoYW5uZWxzO1xuICAgICAgICBsZXQgYmVnaW5TdW1PZmZzZXQgPSBvZmZzZXQgLSBjdXJyZW50Q2hhbm5lbCArIE1hdGgubWF4KDAsIGN1cnJlbnRDaGFubmVsIC0gZGVwdGhSYWRpdXMpO1xuICAgICAgICBjb25zdCBlbmRTdW1PZmZzZXQgPSBvZmZzZXQgLSBjdXJyZW50Q2hhbm5lbCArIE1hdGgubWluKGN1cnJlbnRDaGFubmVsICsgZGVwdGhSYWRpdXMsIG1heEQpO1xuICAgICAgICBsZXQgc3VtID0gMC4wO1xuICAgICAgICBmb3IgKDsgYmVnaW5TdW1PZmZzZXQgPD0gZW5kU3VtT2Zmc2V0OyBiZWdpblN1bU9mZnNldCsrKSB7XG4gICAgICAgICAgICBjb25zdCB6ID0geFZhbHVlc1tiZWdpblN1bU9mZnNldF07XG4gICAgICAgICAgICBzdW0gKz0geiAqIHo7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1bTtcbiAgICB9XG4gICAgZm9yIChsZXQgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgc2l6ZTsgb2Zmc2V0KyspIHtcbiAgICAgICAgY29uc3Qgc3VtID0gc3VtQWNyb3NzQ2hhbm5lbHMob2Zmc2V0KTtcbiAgICAgICAgY29uc3QgdmFsID0geFZhbHVlc1tvZmZzZXRdICogTWF0aC5wb3coYmlhcyArIGFscGhhICogc3VtLCAtYmV0YSk7XG4gICAgICAgIHJlc3VsdFtvZmZzZXRdID0gdmFsO1xuICAgIH1cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyh4LnNoYXBlLCB4LmR0eXBlLCByZXN1bHQpO1xufVxuZXhwb3J0IGNvbnN0IGxSTkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBMUk4sXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGxSTlxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxSTi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBMUk5HcmFkLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5leHBvcnQgZnVuY3Rpb24gbFJOR3JhZChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCwgeSwgZHkgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGRlcHRoUmFkaXVzLCBiaWFzLCBhbHBoYSwgYmV0YSB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChkeSwgJ0xSTkdyYWQnKTtcbiAgICBjb25zdCBkeVNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoZHkuc2hhcGUpO1xuICAgIGNvbnN0IGNoYW5uZWxzID0gZHkuc2hhcGVbM107XG4gICAgY29uc3QgZHlWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGR5LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHhWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgeVZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoeS5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgRmxvYXQzMkFycmF5KGR5U2l6ZSk7XG4gICAgY29uc3Qgc2l6ZSA9IGR5U2l6ZTtcbiAgICBmb3IgKGxldCBvZmZzZXQgPSAwOyBvZmZzZXQgPCBzaXplOyBvZmZzZXQrKykge1xuICAgICAgICBjb25zdCBjdXJyZW50Q2hhbm5lbCA9IG9mZnNldCAlIGNoYW5uZWxzO1xuICAgICAgICBjb25zdCBkZXB0aEJlZ2luID0gKG9mZnNldCAtIGN1cnJlbnRDaGFubmVsKSArIE1hdGgubWF4KDAsIGN1cnJlbnRDaGFubmVsIC0gZGVwdGhSYWRpdXMpO1xuICAgICAgICBjb25zdCBkZXB0aEVuZCA9IChvZmZzZXQgLSBjdXJyZW50Q2hhbm5lbCkgK1xuICAgICAgICAgICAgTWF0aC5taW4oY2hhbm5lbHMsIGN1cnJlbnRDaGFubmVsICsgZGVwdGhSYWRpdXMgKyAxKTtcbiAgICAgICAgbGV0IG5vcm0gPSAwO1xuICAgICAgICBmb3IgKGxldCBrID0gZGVwdGhCZWdpbjsgayA8IGRlcHRoRW5kOyBrKyspIHtcbiAgICAgICAgICAgIG5vcm0gKz0gTWF0aC5wb3coeFZhbHVlc1trXSwgMik7XG4gICAgICAgIH1cbiAgICAgICAgbm9ybSA9IGFscGhhICogbm9ybSArIGJpYXM7XG4gICAgICAgIGZvciAobGV0IGsgPSBkZXB0aEJlZ2luOyBrIDwgZGVwdGhFbmQ7IGsrKykge1xuICAgICAgICAgICAgbGV0IGR5aSA9IC0yICogYWxwaGEgKiBiZXRhICogeFZhbHVlc1trXSAqIHlWYWx1ZXNbb2Zmc2V0XSAvIG5vcm07XG4gICAgICAgICAgICBpZiAob2Zmc2V0ID09PSBrKSB7XG4gICAgICAgICAgICAgICAgZHlpICs9IE1hdGgucG93KG5vcm0sIC1iZXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGR5aSAqPSBkeVZhbHVlc1tvZmZzZXRdO1xuICAgICAgICAgICAgcmVzdWx0W2tdICs9IGR5aTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhkeS5zaGFwZSwgeC5kdHlwZSwgcmVzdWx0KTtcbn1cbmV4cG9ydCBjb25zdCBsUk5HcmFkQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IExSTkdyYWQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGxSTkdyYWRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1MUk5HcmFkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IExlYWt5UmVsdSwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIGxlYWt5UmVsdShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYWxwaGEgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoW3hdLCAnbGVha3lSZWx1Jyk7XG4gICAgY29uc3QgeFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoeC5zaGFwZSk7XG4gICAgY29uc3QgeFZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3Qgb3V0VmFscyA9IHV0aWwuZ2V0VHlwZWRBcnJheUZyb21EVHlwZSgnZmxvYXQzMicsIHhTaXplKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHhWYWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG91dFZhbHNbaV0gPSB4VmFsc1tpXSA8IDAgPyBhbHBoYSAqIHhWYWxzW2ldIDogeFZhbHNbaV07XG4gICAgfVxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHguc2hhcGUsICdmbG9hdDMyJywgb3V0VmFscyk7XG59XG5leHBvcnQgY29uc3QgbGVha3lSZWx1Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IExlYWt5UmVsdSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogbGVha3lSZWx1XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TGVha3lSZWx1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IExlc3MgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IGxlc3NJbXBsID0gY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoYSwgYikgPT4gKGEgPCBiKSA/IDEgOiAwKTtcbmV4cG9ydCBjb25zdCBsZXNzID0gYmluYXJ5S2VybmVsRnVuYyhMZXNzLCBsZXNzSW1wbCwgbnVsbCAvKiBjb21wbGV4SW1wbCAqLywgJ2Jvb2wnKTtcbmV4cG9ydCBjb25zdCBsZXNzQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IExlc3MsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGxlc3Ncbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1MZXNzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IExlc3NFcXVhbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X2ltcGwnO1xuaW1wb3J0IHsgYmluYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgbGVzc0VxdWFsSW1wbCA9IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwoKGEsIGIpID0+IChhIDw9IGIpID8gMSA6IDApO1xuZXhwb3J0IGNvbnN0IGxlc3NFcXVhbCA9IGJpbmFyeUtlcm5lbEZ1bmMoTGVzc0VxdWFsLCBsZXNzRXF1YWxJbXBsLCBudWxsIC8qIGNvbXBsZXhJbXBsICovLCAnYm9vbCcpO1xuZXhwb3J0IGNvbnN0IGxlc3NFcXVhbENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBMZXNzRXF1YWwsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGxlc3NFcXVhbFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxlc3NFcXVhbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBMaW5TcGFjZSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBsaW5TcGFjZUltcGwgfSBmcm9tICcuL0xpblNwYWNlX2ltcGwnO1xuZXhwb3J0IGZ1bmN0aW9uIGxpblNwYWNlKGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgc3RhcnQsIHN0b3AsIG51bSB9ID0gYXR0cnM7XG4gICAgY29uc3Qgb3V0VmFscyA9IGxpblNwYWNlSW1wbChzdGFydCwgc3RvcCwgbnVtKTtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbb3V0VmFscy5sZW5ndGhdLCAnZmxvYXQzMicsIG91dFZhbHMpO1xufVxuZXhwb3J0IGNvbnN0IGxpblNwYWNlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IExpblNwYWNlLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBsaW5TcGFjZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxpblNwYWNlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIGxpblNwYWNlSW1wbChzdGFydCwgc3RvcCwgbnVtKSB7XG4gICAgY29uc3Qgc3RlcCA9IChzdG9wIC0gc3RhcnQpIC8gKG51bSAtIDEpO1xuICAgIGNvbnN0IHZhbHVlcyA9IHV0aWwubWFrZVplcm9zVHlwZWRBcnJheShudW0sICdmbG9hdDMyJyk7XG4gICAgdmFsdWVzWzBdID0gc3RhcnQ7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFsdWVzW2ldID0gdmFsdWVzW2kgLSAxXSArIHN0ZXA7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZXM7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1MaW5TcGFjZV9pbXBsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBMb2cgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlU2ltcGxlVW5hcnlJbXBsIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfaW1wbCc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmNGcm9tSW1wbCB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBsb2dJbXBsID0gY3JlYXRlU2ltcGxlVW5hcnlJbXBsKCh4aSkgPT4gTWF0aC5sb2coeGkpKTtcbmV4cG9ydCBjb25zdCBsb2cgPSB1bmFyeUtlcm5lbEZ1bmNGcm9tSW1wbChMb2csIGxvZ0ltcGwpO1xuZXhwb3J0IGNvbnN0IGxvZ0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBMb2csXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGxvZyxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Mb2cuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IExvZzFwIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBsb2cxcCA9IHVuYXJ5S2VybmVsRnVuYyhMb2cxcCwgKHhpKSA9PiBNYXRoLmxvZzFwKHhpKSk7XG5leHBvcnQgY29uc3QgbG9nMXBDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTG9nMXAsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGxvZzFwLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxvZzFwLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IExvZ2ljYWxBbmQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IGxvZ2ljYWxBbmRJbXBsID0gY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoYSwgYikgPT4gYSAmJiBiKTtcbmV4cG9ydCBjb25zdCBsb2dpY2FsQW5kID0gYmluYXJ5S2VybmVsRnVuYyhMb2dpY2FsQW5kLCBsb2dpY2FsQW5kSW1wbCwgbnVsbCAvKiBjb21wbGV4SW1wbCAqLywgJ2Jvb2wnKTtcbmV4cG9ydCBjb25zdCBsb2dpY2FsQW5kQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IExvZ2ljYWxBbmQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGxvZ2ljYWxBbmRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Mb2dpY2FsQW5kLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBMb2dpY2FsTm90IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBsb2dpY2FsTm90ID0gdW5hcnlLZXJuZWxGdW5jKExvZ2ljYWxOb3QsICh4aSkgPT4geGkgPyAwIDogMSwgJ2Jvb2wnKTtcbmV4cG9ydCBjb25zdCBsb2dpY2FsTm90Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IExvZ2ljYWxOb3QsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGxvZ2ljYWxOb3QsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TG9naWNhbE5vdC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBMb2dpY2FsT3IgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IGxvZ2ljYWxPckltcGwgPSBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsKChhLCBiKSA9PiBhIHx8IGIpO1xuZXhwb3J0IGNvbnN0IGxvZ2ljYWxPciA9IGJpbmFyeUtlcm5lbEZ1bmMoTG9naWNhbE9yLCBsb2dpY2FsT3JJbXBsLCBudWxsIC8qIGNvbXBsZXhJbXBsICovLCAnYm9vbCcpO1xuZXhwb3J0IGNvbnN0IGxvZ2ljYWxPckNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBMb2dpY2FsT3IsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGxvZ2ljYWxPclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxvZ2ljYWxPci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBNYXggfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYmFja2VuZF91dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7IG1heEltcGwgfSBmcm9tICcuL01heF9pbXBsJztcbmltcG9ydCB7IHRyYW5zcG9zZUltcGwgfSBmcm9tICcuL1RyYW5zcG9zZV9pbXBsJztcbmV4cG9ydCBmdW5jdGlvbiBtYXgoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHJlZHVjdGlvbkluZGljZXMsIGtlZXBEaW1zIH0gPSBhdHRycztcbiAgICBjb25zdCBjcHVCYWNrZW5kID0gYmFja2VuZDtcbiAgICBsZXQgeFNoYXBlID0geC5zaGFwZTtcbiAgICBjb25zdCB4UmFuayA9IHhTaGFwZS5sZW5ndGg7XG4gICAgY29uc3Qgb3JpZ0F4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKHJlZHVjdGlvbkluZGljZXMsIHhTaGFwZSk7XG4gICAgbGV0IGF4ZXMgPSBvcmlnQXhlcztcbiAgICBjb25zdCBwZXJtdXRlZEF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKGF4ZXMsIHhSYW5rKTtcbiAgICBsZXQgeFZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IG5ld1NoYXBlID0gbmV3IEFycmF5KHhSYW5rKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdTaGFwZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbmV3U2hhcGVbaV0gPSB4U2hhcGVbcGVybXV0ZWRBeGVzW2ldXTtcbiAgICAgICAgfVxuICAgICAgICB4VmFscyA9IHRyYW5zcG9zZUltcGwoeFZhbHMsIHhTaGFwZSwgeC5kdHlwZSwgcGVybXV0ZWRBeGVzLCBuZXdTaGFwZSk7XG4gICAgICAgIGF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0SW5uZXJNb3N0QXhlcyhheGVzLmxlbmd0aCwgeFJhbmspO1xuICAgICAgICB4U2hhcGUgPSBuZXdTaGFwZTtcbiAgICB9XG4gICAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnbWF4Jyk7XG4gICAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdtYXgnLCBheGVzLCB4UmFuayk7XG4gICAgY29uc3QgW21heE91dFNoYXBlLCByZWR1Y2VTaGFwZV0gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcyh4U2hhcGUsIGF4ZXMpO1xuICAgIGNvbnN0IHJlZHVjZVNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuICAgIGNvbnN0IHJlc3VsdCA9IG1heEltcGwoeFZhbHMsIHJlZHVjZVNpemUsIG1heE91dFNoYXBlLCB4LmR0eXBlKTtcbiAgICBjb25zdCBkYXRhSWQgPSBjcHVCYWNrZW5kLndyaXRlKHJlc3VsdCwgbWF4T3V0U2hhcGUsIHguZHR5cGUpO1xuICAgIGxldCBvdXRTaGFwZSA9IG1heE91dFNoYXBlO1xuICAgIGlmIChrZWVwRGltcykge1xuICAgICAgICAvLyByZXNoYXBlXG4gICAgICAgIGNvbnN0IG5ld1NoYXBlID0gYmFja2VuZF91dGlsLmV4cGFuZFNoYXBlVG9LZWVwRGltKG1heE91dFNoYXBlLCBvcmlnQXhlcyk7XG4gICAgICAgIG91dFNoYXBlID0gbmV3U2hhcGU7XG4gICAgfVxuICAgIHJldHVybiB7IGRhdGFJZCwgc2hhcGU6IG91dFNoYXBlLCBkdHlwZTogeC5kdHlwZSB9O1xufVxuZXhwb3J0IGNvbnN0IG1heENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBNYXgsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IG1heFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1heC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIE1heFBvb2wsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7IHBvb2wgfSBmcm9tICcuLi91dGlscy9wb29sX3V0aWxzJztcbmltcG9ydCB7IGlkZW50aXR5IH0gZnJvbSAnLi9JZGVudGl0eSc7XG5leHBvcnQgZnVuY3Rpb24gbWF4UG9vbChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ21heFBvb2wnKTtcbiAgICBjb25zdCB7IGZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlIH0gPSBhdHRycztcbiAgICBjb25zdCBkaWxhdGlvbnMgPSAxO1xuICAgIHV0aWwuYXNzZXJ0KGJhY2tlbmRfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgZGlsYXRpb25zKSwgKCkgPT4gJ0Vycm9yIGluIG1heFBvb2w6IEVpdGhlciBzdHJpZGVzIG9yIGRpbGF0aW9ucyBtdXN0IGJlIDEuICcgK1xuICAgICAgICBgR290IHN0cmlkZXMgJHtzdHJpZGVzfSBhbmQgZGlsYXRpb25zICcke2RpbGF0aW9uc30nYCk7XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wyREluZm8oeC5zaGFwZSwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSk7XG4gICAgbGV0IHJlcztcbiAgICBpZiAoY29udkluZm8uZmlsdGVyV2lkdGggPT09IDEgJiYgY29udkluZm8uZmlsdGVySGVpZ2h0ID09PSAxICYmXG4gICAgICAgIHV0aWwuYXJyYXlzRXF1YWwoY29udkluZm8uaW5TaGFwZSwgY29udkluZm8ub3V0U2hhcGUpKSB7XG4gICAgICAgIHJlcyA9IGlkZW50aXR5KHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IHhWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgICAgIGNvbnN0IHN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKHguc2hhcGUpO1xuICAgICAgICBjb25zdCBidWZmZXIgPSBwb29sKHhWYWx1ZXMsIHguc2hhcGUsIHguZHR5cGUsIHN0cmlkZXMsIGNvbnZJbmZvLCAnbWF4Jyk7XG4gICAgICAgIHJlcyA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8oY29udkluZm8ub3V0U2hhcGUsIHguZHR5cGUsIGJ1ZmZlci52YWx1ZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IG1heFBvb2xDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTWF4UG9vbCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogbWF4UG9vbFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1heFBvb2wuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBNYXhQb29sM0QsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7IHBvb2wzZCB9IGZyb20gJy4uL3V0aWxzL3Bvb2xfdXRpbHMnO1xuZXhwb3J0IGZ1bmN0aW9uIG1heFBvb2wzRChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGRhdGFGb3JtYXQgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ21heFBvb2wzZCcpO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVQb29sM0RJbmZvKHguc2hhcGUsIGZpbHRlclNpemUsIHN0cmlkZXMsIDEgLyogZGlsYXRpb25zICovLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgZGF0YUZvcm1hdCk7XG4gICAgY29uc3QgeFZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBvdXRCdWYgPSBwb29sM2QoeFZhbHVlcywgeC5zaGFwZSwgeC5kdHlwZSwgdXRpbC5jb21wdXRlU3RyaWRlcyh4LnNoYXBlKSwgY29udkluZm8sICdtYXgnKTtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRCdWYuc2hhcGUsICdmbG9hdDMyJywgb3V0QnVmLnZhbHVlcyk7XG59XG5leHBvcnQgY29uc3QgbWF4UG9vbDNEQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE1heFBvb2wzRCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogbWF4UG9vbDNEXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWF4UG9vbDNELmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgYnVmZmVyLCBNYXhQb29sM0RHcmFkIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyBtYXhQb29sM2RQb3NpdGlvbnMgfSBmcm9tICcuLi91dGlscy9wb29sX3V0aWxzJztcbmV4cG9ydCBmdW5jdGlvbiBtYXhQb29sM0RHcmFkKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBkeSwgaW5wdXQgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KFtkeSwgaW5wdXRdLCAnbWF4UG9vbDNER3JhZCcpO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVQb29sM0RJbmZvKGlucHV0LnNoYXBlLCBmaWx0ZXJTaXplLCBzdHJpZGVzLCAxIC8qIGRpbGF0aW9ucyAqLywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpO1xuICAgIGNvbnN0IGlucHV0QnVmID0gYmFja2VuZC5idWZmZXJTeW5jKGlucHV0KTtcbiAgICBjb25zdCBtYXhQb3NCdWYgPSBtYXhQb29sM2RQb3NpdGlvbnMoaW5wdXRCdWYsIGNvbnZJbmZvKTtcbiAgICBjb25zdCBzdHJpZGVEZXB0aCA9IGNvbnZJbmZvLnN0cmlkZURlcHRoO1xuICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICAgIGNvbnN0IGRpbGF0aW9uRGVwdGggPSBjb252SW5mby5kaWxhdGlvbkRlcHRoO1xuICAgIGNvbnN0IGRpbGF0aW9uSGVpZ2h0ID0gY29udkluZm8uZGlsYXRpb25IZWlnaHQ7XG4gICAgY29uc3QgZGlsYXRpb25XaWR0aCA9IGNvbnZJbmZvLmRpbGF0aW9uV2lkdGg7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVyRGVwdGggPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJEZXB0aDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJIZWlnaHQ7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVyV2lkdGggPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJXaWR0aDtcbiAgICBjb25zdCBwYWRGcm9udCA9IGVmZmVjdGl2ZUZpbHRlckRlcHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8uZnJvbnQ7XG4gICAgY29uc3QgcGFkTGVmdCA9IGVmZmVjdGl2ZUZpbHRlcldpZHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICBjb25zdCBwYWRUb3AgPSBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgLSAxIC0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgZHggPSBidWZmZXIoaW5wdXQuc2hhcGUsICdmbG9hdDMyJyk7XG4gICAgY29uc3QgZHlCdWYgPSBiYWNrZW5kLmJ1ZmZlclN5bmMoZHkpO1xuICAgIGZvciAobGV0IGJhdGNoID0gMDsgYmF0Y2ggPCBjb252SW5mby5iYXRjaFNpemU7ICsrYmF0Y2gpIHtcbiAgICAgICAgZm9yIChsZXQgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBjb252SW5mby5pbkNoYW5uZWxzOyArK2NoYW5uZWwpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGR4RGVwdGggPSAwOyBkeERlcHRoIDwgY29udkluZm8uaW5EZXB0aDsgKytkeERlcHRoKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZHhSb3cgPSAwOyBkeFJvdyA8IGNvbnZJbmZvLmluSGVpZ2h0OyArK2R4Um93KSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGR4Q29sID0gMDsgZHhDb2wgPCBjb252SW5mby5pbldpZHRoOyArK2R4Q29sKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTaGFkZXIgY29kZSBiZWdpbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGR5RGVwdGhDb3JuZXIgPSBkeERlcHRoIC0gcGFkRnJvbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkeVJvd0Nvcm5lciA9IGR4Um93IC0gcGFkVG9wO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHlDb2xDb3JuZXIgPSBkeENvbCAtIHBhZExlZnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZG90UHJvZCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB3RGVwdGggPSAwOyB3RGVwdGggPCBlZmZlY3RpdmVGaWx0ZXJEZXB0aDsgd0RlcHRoICs9IGRpbGF0aW9uRGVwdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkeURlcHRoID0gKGR5RGVwdGhDb3JuZXIgKyB3RGVwdGgpIC8gc3RyaWRlRGVwdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR5RGVwdGggPCAwIHx8IGR5RGVwdGggPj0gY29udkluZm8ub3V0RGVwdGggfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihkeURlcHRoKSAhPT0gZHlEZXB0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgd1JvdyA9IDA7IHdSb3cgPCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQ7IHdSb3cgKz0gZGlsYXRpb25IZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHlSb3cgPSAoZHlSb3dDb3JuZXIgKyB3Um93KSAvIHN0cmlkZUhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR5Um93IDwgMCB8fCBkeVJvdyA+PSBjb252SW5mby5vdXRIZWlnaHQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoZHlSb3cpICE9PSBkeVJvdykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgd0NvbCA9IDA7IHdDb2wgPCBlZmZlY3RpdmVGaWx0ZXJXaWR0aDsgd0NvbCArPSBkaWxhdGlvbldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkeUNvbCA9IChkeUNvbENvcm5lciArIHdDb2wpIC8gc3RyaWRlV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHlDb2wgPCAwIHx8IGR5Q29sID49IGNvbnZJbmZvLm91dFdpZHRoIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihkeUNvbCkgIT09IGR5Q29sKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXhQb3MgPSBlZmZlY3RpdmVGaWx0ZXJEZXB0aCAqIGVmZmVjdGl2ZUZpbHRlckhlaWdodCAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0aXZlRmlsdGVyV2lkdGggLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFBvc0J1Zi5nZXQoYmF0Y2gsIGR5RGVwdGgsIGR5Um93LCBkeUNvbCwgY2hhbm5lbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJQb3MgPSB3RGVwdGggKiBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgKiBlZmZlY3RpdmVGaWx0ZXJXaWR0aCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1JvdyAqIGVmZmVjdGl2ZUZpbHRlcldpZHRoICsgd0NvbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hc2sgPSBtYXhQb3MgPT09IGN1clBvcyA/IDEgOiAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hc2sgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBpeGVsID0gZHlCdWYuZ2V0KGJhdGNoLCBkeURlcHRoLCBkeVJvdywgZHlDb2wsIGNoYW5uZWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG90UHJvZCArPSBwaXhlbCAqIG1hc2s7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBkeC5zZXQoZG90UHJvZCwgYmF0Y2gsIGR4RGVwdGgsIGR4Um93LCBkeENvbCwgY2hhbm5lbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oZHguc2hhcGUsIGR4LmR0eXBlLCBkeC52YWx1ZXMpO1xufVxuZXhwb3J0IGNvbnN0IG1heFBvb2wzREdyYWRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTWF4UG9vbDNER3JhZCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogbWF4UG9vbDNER3JhZFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1heFBvb2wzREdyYWQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBidWZmZXIsIE1heFBvb2xHcmFkIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyBtYXhQb29sUG9zaXRpb25zIH0gZnJvbSAnLi4vdXRpbHMvcG9vbF91dGlscyc7XG5leHBvcnQgZnVuY3Rpb24gbWF4UG9vbEdyYWQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGR5LCBpbnB1dCwgb3V0cHV0IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeCA9IGlucHV0O1xuICAgIGFzc2VydE5vdENvbXBsZXgoW2lucHV0LCBvdXRwdXRdLCAnbWF4UG9vbEdyYWQnKTtcbiAgICBjb25zdCB7IGZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlIH0gPSBhdHRycztcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlUG9vbDJESW5mbyh4LnNoYXBlLCBmaWx0ZXJTaXplLCBzdHJpZGVzLCAxIC8qIGRpbGF0aW9ucyAqLywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpO1xuICAgIGNvbnN0IHhWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgbWF4UG9zQnVmID0gYnVmZmVyKGNvbnZJbmZvLm91dFNoYXBlLCB4LmR0eXBlLCBtYXhQb29sUG9zaXRpb25zKHhWYWx1ZXMsIHguc2hhcGUsIHguZHR5cGUsIGNvbnZJbmZvKS52YWx1ZXMpO1xuICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICAgIGNvbnN0IGRpbGF0aW9uSGVpZ2h0ID0gY29udkluZm8uZGlsYXRpb25IZWlnaHQ7XG4gICAgY29uc3QgZGlsYXRpb25XaWR0aCA9IGNvbnZJbmZvLmRpbGF0aW9uV2lkdGg7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVySGVpZ2h0ID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlcldpZHRoID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVyV2lkdGg7XG4gICAgY29uc3QgcGFkTGVmdCA9IGVmZmVjdGl2ZUZpbHRlcldpZHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICBjb25zdCBwYWRUb3AgPSBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgLSAxIC0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgZHggPSBidWZmZXIoeC5zaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICBjb25zdCBkeURhdGEgPSBiYWNrZW5kLmRhdGEuZ2V0KGR5LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IGR5QnVmID0gYnVmZmVyKGR5LnNoYXBlLCAnZmxvYXQzMicsIGR5RGF0YSk7XG4gICAgZm9yIChsZXQgYiA9IDA7IGIgPCBjb252SW5mby5iYXRjaFNpemU7ICsrYikge1xuICAgICAgICBmb3IgKGxldCBkID0gMDsgZCA8IGNvbnZJbmZvLmluQ2hhbm5lbHM7ICsrZCkge1xuICAgICAgICAgICAgZm9yIChsZXQgZHhSID0gMDsgZHhSIDwgY29udkluZm8uaW5IZWlnaHQ7ICsrZHhSKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZHhDID0gMDsgZHhDIDwgY29udkluZm8uaW5XaWR0aDsgKytkeEMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2hhZGVyIGNvZGUgYmVnaW5zLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkeVJDb3JuZXIgPSBkeFIgLSBwYWRUb3A7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGR5Q0Nvcm5lciA9IGR4QyAtIHBhZExlZnQ7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkb3RQcm9kID0gMDtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgd1IgPSAwOyB3UiA8IGVmZmVjdGl2ZUZpbHRlckhlaWdodDsgd1IgKz0gZGlsYXRpb25IZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGR5UiA9IChkeVJDb3JuZXIgKyB3UikgLyBzdHJpZGVIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHlSIDwgMCB8fCBkeVIgPj0gY29udkluZm8ub3V0SGVpZ2h0IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihkeVIpICE9PSBkeVIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHdDID0gMDsgd0MgPCBlZmZlY3RpdmVGaWx0ZXJXaWR0aDsgd0MgKz0gZGlsYXRpb25XaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGR5QyA9IChkeUNDb3JuZXIgKyB3QykgLyBzdHJpZGVXaWR0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHlDIDwgMCB8fCBkeUMgPj0gY29udkluZm8ub3V0V2lkdGggfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihkeUMpICE9PSBkeUMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1heFBvcyA9IGVmZmVjdGl2ZUZpbHRlckhlaWdodCAqIGVmZmVjdGl2ZUZpbHRlcldpZHRoIC0gMSAtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFBvc0J1Zi5nZXQoYiwgZHlSLCBkeUMsIGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1clBvcyA9IHdSICogZWZmZWN0aXZlRmlsdGVyV2lkdGggKyB3QztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXNrID0gbWF4UG9zID09PSBjdXJQb3MgPyAxIDogMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFzayA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGl4ZWwgPSBkeUJ1Zi5nZXQoYiwgZHlSLCBkeUMsIGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdFByb2QgKz0gcGl4ZWwgKiBtYXNrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGR4LnNldChkb3RQcm9kLCBiLCBkeFIsIGR4QywgZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGR4LnNoYXBlLCBkeC5kdHlwZSwgZHgudmFsdWVzKTtcbn1cbmV4cG9ydCBjb25zdCBtYXhQb29sR3JhZENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBNYXhQb29sR3JhZCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogbWF4UG9vbEdyYWRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NYXhQb29sR3JhZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBNYXhQb29sV2l0aEFyZ21heCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7IG1heFBvb2xXaXRoQXJnbWF4SW1wbCB9IGZyb20gJy4vTWF4UG9vbFdpdGhBcmdtYXhfaW1wbCc7XG5leHBvcnQgY29uc3QgbWF4UG9vbFdpdGhBcmdtYXhDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTWF4UG9vbFdpdGhBcmdtYXgsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6ICh7IGlucHV0cywgYXR0cnMsIGJhY2tlbmQgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICAgICAgY29uc3QgeyBmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGluY2x1ZGVCYXRjaEluSW5kZXggfSA9IGF0dHJzO1xuICAgICAgICBjb25zdCBjcHVCYWNrZW5kID0gYmFja2VuZDtcbiAgICAgICAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnTWF4UG9vbFdpdGhBcmdtYXgnKTtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gY3B1QmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgICAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlUG9vbDJESW5mbyh4LnNoYXBlLCBmaWx0ZXJTaXplLCBzdHJpZGVzLCBbMSwgMV0sIHBhZCk7XG4gICAgICAgIGNvbnN0IFtwb29sZWQsIGluZGV4ZXNdID0gbWF4UG9vbFdpdGhBcmdtYXhJbXBsKHZhbHVlcywgeC5zaGFwZSwgeC5kdHlwZSwgaW5jbHVkZUJhdGNoSW5JbmRleCwgY29udkluZm8pO1xuICAgICAgICBjb25zdCBwb29sZWREYXRhSWQgPSBjcHVCYWNrZW5kLndyaXRlKHBvb2xlZCwgY29udkluZm8ub3V0U2hhcGUsIHguZHR5cGUpO1xuICAgICAgICBjb25zdCBpbmRleGVzRGF0YUlkID0gY3B1QmFja2VuZC53cml0ZShpbmRleGVzLCBjb252SW5mby5vdXRTaGFwZSwgeC5kdHlwZSk7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB7IGRhdGFJZDogcG9vbGVkRGF0YUlkLCBzaGFwZTogY29udkluZm8ub3V0U2hhcGUsIGR0eXBlOiB4LmR0eXBlIH0sXG4gICAgICAgICAgICB7IGRhdGFJZDogaW5kZXhlc0RhdGFJZCwgc2hhcGU6IGNvbnZJbmZvLm91dFNoYXBlLCBkdHlwZTogJ2ludDMyJyB9XG4gICAgICAgIF07XG4gICAgfVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1heFBvb2xXaXRoQXJnbWF4LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgbWF4UG9vbFBvc2l0aW9ucywgcG9vbCB9IGZyb20gJy4uL3V0aWxzL3Bvb2xfdXRpbHMnO1xuZXhwb3J0IGZ1bmN0aW9uIG1heFBvb2xXaXRoQXJnbWF4SW1wbCh4VmFsdWVzLCB4U2hhcGUsIGR0eXBlLCBpbmNsdWRlQmF0Y2hJbkluZGV4LCBjb252SW5mbykge1xuICAgIGNvbnN0IHN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKHhTaGFwZSk7XG4gICAgY29uc3QgbWF4UG9vbHMgPSBwb29sKHhWYWx1ZXMsIHhTaGFwZSwgZHR5cGUsIHN0cmlkZXMsIGNvbnZJbmZvLCAnbWF4Jyk7XG4gICAgY29uc3QgbWF4UG9zaXRpb25zID0gbWF4UG9vbFBvc2l0aW9ucyh4VmFsdWVzLCB4U2hhcGUsIGR0eXBlLCBjb252SW5mbywgdHJ1ZSwgaW5jbHVkZUJhdGNoSW5JbmRleCk7XG4gICAgcmV0dXJuIFttYXhQb29scy52YWx1ZXMsIG1heFBvc2l0aW9ucy52YWx1ZXNdO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWF4UG9vbFdpdGhBcmdtYXhfaW1wbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiBtYXhJbXBsKGFWYWxzLCByZWR1Y2VTaXplLCBvdXRTaGFwZSwgZHR5cGUpIHtcbiAgICBjb25zdCB2YWxzID0gdXRpbC5nZXRUeXBlZEFycmF5RnJvbURUeXBlKGR0eXBlLCB1dGlsLnNpemVGcm9tU2hhcGUob3V0U2hhcGUpKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gaSAqIHJlZHVjZVNpemU7XG4gICAgICAgIGxldCBtYXggPSBhVmFsc1tvZmZzZXRdO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJlZHVjZVNpemU7ICsraikge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhVmFsc1tvZmZzZXQgKyBqXTtcbiAgICAgICAgICAgIGlmIChOdW1iZXIuaXNOYU4odmFsdWUpIHx8XG4gICAgICAgICAgICAgICAgdmFsdWUgPiBtYXgpIHsgLy8gY29tcGFyaXNvbiB3aXRoIE5hTiBhbHdheXMgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICAgICAgbWF4ID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFsc1tpXSA9IG1heDtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHM7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NYXhfaW1wbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBNYXhpbXVtIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfaW1wbCc7XG5pbXBvcnQgeyBiaW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBtYXhpbXVtSW1wbCA9IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwoKChhVmFsdWUsIGJWYWx1ZSkgPT4gTWF0aC5tYXgoYVZhbHVlLCBiVmFsdWUpKSk7XG5leHBvcnQgY29uc3QgbWF4aW11bSA9IGJpbmFyeUtlcm5lbEZ1bmMoTWF4aW11bSwgbWF4aW11bUltcGwpO1xuZXhwb3J0IGNvbnN0IG1heGltdW1Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTWF4aW11bSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogbWF4aW11bVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1heGltdW0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBNZWFuLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNhc3QgfSBmcm9tICcuL0Nhc3QnO1xuaW1wb3J0IHsgZGl2IH0gZnJvbSAnLi9SZWFsRGl2JztcbmltcG9ydCB7IHN1bSB9IGZyb20gJy4vU3VtJztcbmV4cG9ydCBmdW5jdGlvbiBtZWFuKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBheGlzLCBrZWVwRGltcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgYXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG4gICAgY29uc3Qgc2hhcGVzID0gYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMoeC5zaGFwZSwgYXhlcyk7XG4gICAgY29uc3QgcmVkdWNlU2hhcGUgPSBzaGFwZXNbMV07XG4gICAgY29uc3QgcmVkdWNlU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShyZWR1Y2VTaGFwZSk7XG4gICAgY29uc3QgdG9EaXNwb3NlID0gW107XG4gICAgY29uc3QgcmVkdWNlU2l6ZVNjYWxhciA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8oW10sICdmbG9hdDMyJywgbmV3IEZsb2F0MzJBcnJheShbcmVkdWNlU2l6ZV0pKTtcbiAgICB0b0Rpc3Bvc2UucHVzaChyZWR1Y2VTaXplU2NhbGFyKTtcbiAgICBjb25zdCAkeCA9IGNhc3QoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kLCBhdHRyczogeyBkdHlwZTogJ2Zsb2F0MzInIH0gfSk7XG4gICAgdG9EaXNwb3NlLnB1c2goJHgpO1xuICAgIGNvbnN0IHJlcyA9IGRpdih7IGlucHV0czogeyBhOiAkeCwgYjogcmVkdWNlU2l6ZVNjYWxhciB9LCBiYWNrZW5kIH0pO1xuICAgIHRvRGlzcG9zZS5wdXNoKHJlcyk7XG4gICAgY29uc3QgcmVzdWx0ID0gc3VtKHsgaW5wdXRzOiB7IHg6IHJlcyB9LCBiYWNrZW5kLCBhdHRyczogeyBheGlzLCBrZWVwRGltcyB9IH0pO1xuICAgIHRvRGlzcG9zZS5mb3JFYWNoKHQgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0KSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBjb25zdCBtZWFuQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE1lYW4sXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IG1lYW5cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NZWFuLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgTWluLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7IHRyYW5zcG9zZSB9IGZyb20gJy4vVHJhbnNwb3NlJztcbmV4cG9ydCBmdW5jdGlvbiBtaW4oYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGF4aXMsIGtlZXBEaW1zIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KHgsICdtaW4nKTtcbiAgICBjb25zdCBvcmlnQXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG4gICAgbGV0IGF4ZXMgPSBvcmlnQXhlcztcbiAgICBjb25zdCBwZXJtdXRlZEF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKGF4ZXMsIHguc2hhcGUubGVuZ3RoKTtcbiAgICBsZXQgJHggPSB4O1xuICAgIGlmIChwZXJtdXRlZEF4ZXMgIT0gbnVsbCkge1xuICAgICAgICAkeCA9IHRyYW5zcG9zZSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHBlcm06IHBlcm11dGVkQXhlcyB9IH0pO1xuICAgICAgICBheGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoYXhlcy5sZW5ndGgsIHguc2hhcGUubGVuZ3RoKTtcbiAgICB9XG4gICAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdtaW4nLCBheGVzLCAkeC5zaGFwZS5sZW5ndGgpO1xuICAgIGNvbnN0IFtvdXRTaGFwZSwgcmVkdWNlU2hhcGVdID0gYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMoJHguc2hhcGUsIGF4ZXMpO1xuICAgIGNvbnN0IHJlZHVjZVNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuICAgIGNvbnN0IHZhbHMgPSB1dGlsLm1ha2VaZXJvc1R5cGVkQXJyYXkodXRpbC5zaXplRnJvbVNoYXBlKG91dFNoYXBlKSwgJHguZHR5cGUpO1xuICAgIGNvbnN0IGFWYWxzID0gYmFja2VuZC5kYXRhLmdldCgkeC5kYXRhSWQpLnZhbHVlcztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gaSAqIHJlZHVjZVNpemU7XG4gICAgICAgIGxldCBtaW4gPSBhVmFsc1tvZmZzZXRdO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJlZHVjZVNpemU7ICsraikge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhVmFsc1tvZmZzZXQgKyBqXTtcbiAgICAgICAgICAgIGlmIChOdW1iZXIuaXNOYU4odmFsdWUpIHx8XG4gICAgICAgICAgICAgICAgdmFsdWUgPCBtaW4pIHsgLy8gY29tcGFyaXNvbiB3aXRoIE5hTiBhbHdheXMgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICAgICAgbWluID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFsc1tpXSA9IG1pbjtcbiAgICB9XG4gICAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oJHgpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dFNoYXBlLCAkeC5kdHlwZSwgdmFscyk7XG4gICAgaWYgKGtlZXBEaW1zKSB7XG4gICAgICAgIGNvbnN0IGV4cGFuZGVkU2hhcGUgPSBiYWNrZW5kX3V0aWwuZXhwYW5kU2hhcGVUb0tlZXBEaW0ob3V0U2hhcGUsIG9yaWdBeGVzKTtcbiAgICAgICAgY29uc3QgcmVzaGFwZWRSZXN1bHQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHJlc3VsdCB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogZXhwYW5kZWRTaGFwZSB9IH0pO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc3VsdCk7XG4gICAgICAgIHJldHVybiByZXNoYXBlZFJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBjb25zdCBtaW5Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTWluLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBtaW5cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NaW4uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTWluaW11bSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X2ltcGwnO1xuaW1wb3J0IHsgYmluYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgbWluaW11bUltcGwgPSBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsKCgoYVZhbHVlLCBiVmFsdWUpID0+IE1hdGgubWluKGFWYWx1ZSwgYlZhbHVlKSkpO1xuZXhwb3J0IGNvbnN0IG1pbmltdW0gPSBiaW5hcnlLZXJuZWxGdW5jKE1pbmltdW0sIG1pbmltdW1JbXBsKTtcbmV4cG9ydCBjb25zdCBtaW5pbXVtQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE1pbmltdW0sXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IG1pbmltdW1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NaW5pbXVtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IE1pcnJvclBhZCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIG1pcnJvclBhZChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgcGFkZGluZ3MsIG1vZGUgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ21pcnJvclBhZCcpO1xuICAgIGNvbnN0IG91dFNoYXBlID0gcGFkZGluZ3MubWFwKChwLCBpKSA9PiBwWzBdIC8qIGJlZm9yZVBhZCAqLyArIHguc2hhcGVbaV0gKyBwWzFdIC8qIGFmdGVyUGFkICovKTtcbiAgICBjb25zdCBzdGFydCA9IHBhZGRpbmdzLm1hcChwID0+IHBbMF0pO1xuICAgIGNvbnN0IGVuZCA9IHBhZGRpbmdzLm1hcCgocCwgaSkgPT4gcFswXSArIHguc2hhcGVbaV0pO1xuICAgIGNvbnN0IG9mZnNldCA9IG1vZGUgPT09ICdyZWZsZWN0JyA/IDAgOiAxO1xuICAgIGNvbnN0IHhWYWxzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgeFN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKHguc2hhcGUpO1xuICAgIGNvbnN0IHJlc3VsdFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUob3V0U2hhcGUpO1xuICAgIGNvbnN0IHJlc3VsdFJhbmsgPSBvdXRTaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgcmVzdWx0U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMob3V0U2hhcGUpO1xuICAgIGNvbnN0IHJlc1ZhbHMgPSB1dGlsLmdldFR5cGVkQXJyYXlGcm9tRFR5cGUoeC5kdHlwZSwgcmVzdWx0U2l6ZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRTaXplOyBpKyspIHtcbiAgICAgICAgbGV0IGNvb3JkcyA9IHV0aWwuaW5kZXhUb0xvYyhpLCByZXN1bHRSYW5rLCByZXN1bHRTdHJpZGVzKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRSYW5rOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChjb29yZHNbaV0gPCBzdGFydFtpXSkge1xuICAgICAgICAgICAgICAgIGNvb3Jkc1tpXSA9IHN0YXJ0W2ldICogMiAtIGNvb3Jkc1tpXSAtIG9mZnNldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNvb3Jkc1tpXSA+PSBlbmRbaV0pIHtcbiAgICAgICAgICAgICAgICBjb29yZHNbaV0gPSAoZW5kW2ldIC0gMSkgKiAyIC0gY29vcmRzW2ldICsgb2Zmc2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvb3JkcyA9IGNvb3Jkcy5tYXAoKGMsIGkpID0+IGMgLSBzdGFydFtpXSk7XG4gICAgICAgIGNvbnN0IGluSW5kZXggPSB1dGlsLmxvY1RvSW5kZXgoY29vcmRzLCB4UmFuaywgeFN0cmlkZXMpO1xuICAgICAgICByZXNWYWxzW2ldID0geFZhbHNbaW5JbmRleF07XG4gICAgfVxuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC53cml0ZShyZXNWYWxzLCBvdXRTaGFwZSwgeC5kdHlwZSk7XG4gICAgcmV0dXJuIHsgZGF0YUlkOiBvdXRJZCwgc2hhcGU6IG91dFNoYXBlLCBkdHlwZTogeC5kdHlwZSB9O1xufVxuZXhwb3J0IGNvbnN0IG1pcnJvclBhZENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBNaXJyb3JQYWQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IG1pcnJvclBhZFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1pcnJvclBhZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBNb2QgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IG1vZEltcGwgPSBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsKCgoYVZhbHVlLCBiVmFsdWUpID0+IHtcbiAgICBjb25zdCByZW0gPSBhVmFsdWUgJSBiVmFsdWU7XG4gICAgaWYgKChhVmFsdWUgPCAwICYmIGJWYWx1ZSA8IDApIHx8IChhVmFsdWUgPj0gMCAmJiBiVmFsdWUgPj0gMCkpIHtcbiAgICAgICAgcmV0dXJuIHJlbTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiAocmVtICsgYlZhbHVlKSAlIGJWYWx1ZTtcbiAgICB9XG59KSk7XG5leHBvcnQgY29uc3QgbW9kID0gYmluYXJ5S2VybmVsRnVuYyhNb2QsIG1vZEltcGwpO1xuZXhwb3J0IGNvbnN0IG1vZENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBNb2QsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IG1vZFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1vZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBNdWx0aW5vbWlhbCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgKiBhcyBzZWVkcmFuZG9tIGZyb20gJ3NlZWRyYW5kb20nO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7IHNvZnRtYXggfSBmcm9tICcuL1NvZnRtYXgnO1xuZXhwb3J0IGZ1bmN0aW9uIG11bHRpbm9taWFsKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBsb2dpdHMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IG51bVNhbXBsZXMsIHNlZWQsIG5vcm1hbGl6ZWQgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgobG9naXRzLCAnbXVsdGlub21pYWwnKTtcbiAgICBjb25zdCBwcm9iYWJpbGl0aWVzID0gbm9ybWFsaXplZCA/XG4gICAgICAgIGxvZ2l0cyA6XG4gICAgICAgIHNvZnRtYXgoeyBpbnB1dHM6IHsgbG9naXRzIH0sIGJhY2tlbmQsIGF0dHJzOiB7IGRpbTogLTEgfSB9KTtcbiAgICBjb25zdCBiYXRjaFNpemUgPSBwcm9iYWJpbGl0aWVzLnNoYXBlWzBdO1xuICAgIGNvbnN0IG51bUV2ZW50cyA9IHByb2JhYmlsaXRpZXMuc2hhcGVbMV07XG4gICAgY29uc3QgcHJvYlZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHByb2JhYmlsaXRpZXMuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgcmVzU2hhcGUgPSBbYmF0Y2hTaXplLCBudW1TYW1wbGVzXTtcbiAgICBjb25zdCByZXNWYWxzID0gdXRpbC5tYWtlWmVyb3NUeXBlZEFycmF5KHV0aWwuc2l6ZUZyb21TaGFwZShyZXNTaGFwZSksICdpbnQzMicpO1xuICAgIGZvciAobGV0IGIgPSAwOyBiIDwgYmF0Y2hTaXplOyArK2IpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYiAqIG51bUV2ZW50cztcbiAgICAgICAgLy8gVGhlIGNkZiB3b24ndCBpbmNsdWRlIHRoZSBsYXN0IGV2ZW50LiBJdCB3aWxsIGJlIGltcGxpY2l0IGlmIG5vIG90aGVyXG4gICAgICAgIC8vIGV2ZW50IGhhcHBlbmVkLlxuICAgICAgICBjb25zdCBjZGYgPSBuZXcgRmxvYXQzMkFycmF5KG51bUV2ZW50cyAtIDEpO1xuICAgICAgICBjZGZbMF0gPSBwcm9iVmFsc1tvZmZzZXRdO1xuICAgICAgICBmb3IgKGxldCBldmVudCA9IDE7IGV2ZW50IDwgY2RmLmxlbmd0aDsgKytldmVudCkge1xuICAgICAgICAgICAgY2RmW2V2ZW50XSA9IGNkZltldmVudCAtIDFdICsgcHJvYlZhbHNbb2Zmc2V0ICsgZXZlbnRdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJhbmRvbSA9IHNlZWRyYW5kb20uYWxlYShzZWVkLnRvU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBvdXRPZmZzZXQgPSBiICogbnVtU2FtcGxlcztcbiAgICAgICAgZm9yIChsZXQgc2FtcGxlSWQgPSAwOyBzYW1wbGVJZCA8IG51bVNhbXBsZXM7ICsrc2FtcGxlSWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHIgPSByYW5kb20oKTtcbiAgICAgICAgICAgIC8vIEFzc3VtZSBsYXN0IGV2ZW50IGhhcHBlbmVkIGJ5IGRlZmF1bHQuXG4gICAgICAgICAgICByZXNWYWxzW291dE9mZnNldCArIHNhbXBsZUlkXSA9IGNkZi5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKGxldCBldmVudCA9IDA7IGV2ZW50IDwgY2RmLmxlbmd0aDsgZXZlbnQrKykge1xuICAgICAgICAgICAgICAgIGlmIChyIDwgY2RmW2V2ZW50XSkge1xuICAgICAgICAgICAgICAgICAgICByZXNWYWxzW291dE9mZnNldCArIHNhbXBsZUlkXSA9IGV2ZW50O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFub3JtYWxpemVkKSB7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocHJvYmFiaWxpdGllcyk7XG4gICAgfVxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHJlc1NoYXBlLCAnaW50MzInLCByZXNWYWxzKTtcbn1cbmV4cG9ydCBjb25zdCBtdWx0aW5vbWlhbENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBNdWx0aW5vbWlhbCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogbXVsdGlub21pYWxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NdWx0aW5vbWlhbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBNdWx0aXBseSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X2ltcGwnO1xuaW1wb3J0IHsgYmluYXJ5S2VybmVsRnVuYywgY3JlYXRlQ29tcGxleEJpbmFyeUtlcm5lbEltcGwgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IG11bHRpcGx5SW1wbCA9IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwoKChhVmFsdWUsIGJWYWx1ZSkgPT4gYVZhbHVlICogYlZhbHVlKSk7XG5leHBvcnQgY29uc3QgbXVsdGlwbHlDb21wbGV4SW1wbCA9IGNyZWF0ZUNvbXBsZXhCaW5hcnlLZXJuZWxJbXBsKCgoYVJlYWwsIGFJbWFnLCBiUmVhbCwgYkltYWcpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgICByZWFsOiBhUmVhbCAqIGJSZWFsIC0gYUltYWcgKiBiSW1hZyxcbiAgICAgICAgaW1hZzogYVJlYWwgKiBiSW1hZyArIGFJbWFnICogYlJlYWxcbiAgICB9O1xufSkpO1xuZXhwb3J0IGNvbnN0IG11bHRpcGx5ID0gYmluYXJ5S2VybmVsRnVuYyhNdWx0aXBseSwgbXVsdGlwbHlJbXBsLCBtdWx0aXBseUNvbXBsZXhJbXBsKTtcbmV4cG9ydCBjb25zdCBtdWx0aXBseUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBNdWx0aXBseSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogbXVsdGlwbHlcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NdWx0aXBseS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBOZWcsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7IG11bHRpcGx5SW1wbCB9IGZyb20gJy4vTXVsdGlwbHknO1xuZXhwb3J0IGZ1bmN0aW9uIG5lZ0ltcGwoeFZhbHMsIHhTaGFwZSwgeER0eXBlKSB7XG4gICAgY29uc3QgbWludXNPbmUgPSB1dGlsLmNyZWF0ZVNjYWxhclZhbHVlKC0xLCB4RHR5cGUpO1xuICAgIHJldHVybiBtdWx0aXBseUltcGwoW10sIHhTaGFwZSwgbWludXNPbmUsIHhWYWxzLCB4RHR5cGUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG5lZyhhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnbmVnJyk7XG4gICAgY29uc3QgeFZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgW3JlcywgbmV3U2hhcGVdID0gbmVnSW1wbCh4VmFscywgeC5zaGFwZSwgeC5kdHlwZSk7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8obmV3U2hhcGUsIHguZHR5cGUsIHJlcyk7XG59XG5leHBvcnQgY29uc3QgbmVnQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE5lZyxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogbmVnXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TmVnLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGtlcm5lbF9pbXBscywgTm9uTWF4U3VwcHJlc3Npb25WMyB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5jb25zdCBub25NYXhTdXBwcmVzc2lvblYzSW1wbCA9IGtlcm5lbF9pbXBscy5ub25NYXhTdXBwcmVzc2lvblYzSW1wbDtcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5leHBvcnQgZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25WMyhhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgYm94ZXMsIHNjb3JlcyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChib3hlcywgJ05vbk1heFN1cHByZXNzaW9uJyk7XG4gICAgY29uc3QgYm94ZXNWYWxzID0gYmFja2VuZC5kYXRhLmdldChib3hlcy5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBzY29yZXNWYWxzID0gYmFja2VuZC5kYXRhLmdldChzY29yZXMuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgeyBzZWxlY3RlZEluZGljZXMgfSA9IG5vbk1heFN1cHByZXNzaW9uVjNJbXBsKGJveGVzVmFscywgc2NvcmVzVmFscywgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCk7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW3NlbGVjdGVkSW5kaWNlcy5sZW5ndGhdLCAnaW50MzInLCBuZXcgSW50MzJBcnJheShzZWxlY3RlZEluZGljZXMpKTtcbn1cbmV4cG9ydCBjb25zdCBub25NYXhTdXBwcmVzc2lvblYzQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE5vbk1heFN1cHByZXNzaW9uVjMsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IG5vbk1heFN1cHByZXNzaW9uVjNcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ob25NYXhTdXBwcmVzc2lvblYzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGtlcm5lbF9pbXBscywgTm9uTWF4U3VwcHJlc3Npb25WNCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5jb25zdCBub25NYXhTdXBwcmVzc2lvblY0SW1wbCA9IGtlcm5lbF9pbXBscy5ub25NYXhTdXBwcmVzc2lvblY0SW1wbDtcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5leHBvcnQgZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25WNChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgYm94ZXMsIHNjb3JlcyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCwgcGFkVG9NYXhPdXRwdXRTaXplIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KGJveGVzLCAnTm9uTWF4U3VwcHJlc3Npb25QYWRkZWQnKTtcbiAgICBjb25zdCBib3hlc1ZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KGJveGVzLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHNjb3Jlc1ZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHNjb3Jlcy5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCB7IHNlbGVjdGVkSW5kaWNlcywgdmFsaWRPdXRwdXRzIH0gPSBub25NYXhTdXBwcmVzc2lvblY0SW1wbChib3hlc1ZhbHMsIHNjb3Jlc1ZhbHMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsIHBhZFRvTWF4T3V0cHV0U2l6ZSk7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbc2VsZWN0ZWRJbmRpY2VzLmxlbmd0aF0sICdpbnQzMicsIG5ldyBJbnQzMkFycmF5KHNlbGVjdGVkSW5kaWNlcykpLFxuICAgICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtdLCAnaW50MzInLCBuZXcgSW50MzJBcnJheShbdmFsaWRPdXRwdXRzXSkpXG4gICAgXTtcbn1cbmV4cG9ydCBjb25zdCBub25NYXhTdXBwcmVzc2lvblY0Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE5vbk1heFN1cHByZXNzaW9uVjQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IG5vbk1heFN1cHByZXNzaW9uVjRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ob25NYXhTdXBwcmVzc2lvblY0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGtlcm5lbF9pbXBscywgTm9uTWF4U3VwcHJlc3Npb25WNSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5jb25zdCBub25NYXhTdXBwcmVzc2lvblY1SW1wbCA9IGtlcm5lbF9pbXBscy5ub25NYXhTdXBwcmVzc2lvblY1SW1wbDtcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5leHBvcnQgZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25WNShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgYm94ZXMsIHNjb3JlcyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCwgc29mdE5tc1NpZ21hIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KGJveGVzLCAnTm9uTWF4U3VwcHJlc3Npb25XaXRoU2NvcmUnKTtcbiAgICBjb25zdCBib3hlc1ZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KGJveGVzLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHNjb3Jlc1ZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHNjb3Jlcy5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBtYXhPdXRwdXRTaXplVmFsID0gbWF4T3V0cHV0U2l6ZTtcbiAgICBjb25zdCBpb3VUaHJlc2hvbGRWYWwgPSBpb3VUaHJlc2hvbGQ7XG4gICAgY29uc3Qgc2NvcmVUaHJlc2hvbGRWYWwgPSBzY29yZVRocmVzaG9sZDtcbiAgICBjb25zdCBzb2Z0Tm1zU2lnbWFWYWwgPSBzb2Z0Tm1zU2lnbWE7XG4gICAgY29uc3QgeyBzZWxlY3RlZEluZGljZXMsIHNlbGVjdGVkU2NvcmVzIH0gPSBub25NYXhTdXBwcmVzc2lvblY1SW1wbChib3hlc1ZhbHMsIHNjb3Jlc1ZhbHMsIG1heE91dHB1dFNpemVWYWwsIGlvdVRocmVzaG9sZFZhbCwgc2NvcmVUaHJlc2hvbGRWYWwsIHNvZnRObXNTaWdtYVZhbCk7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbc2VsZWN0ZWRJbmRpY2VzLmxlbmd0aF0sICdpbnQzMicsIG5ldyBJbnQzMkFycmF5KHNlbGVjdGVkSW5kaWNlcykpLFxuICAgICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtzZWxlY3RlZFNjb3Jlcy5sZW5ndGhdLCAnZmxvYXQzMicsIG5ldyBGbG9hdDMyQXJyYXkoc2VsZWN0ZWRTY29yZXMpKVxuICAgIF07XG59XG5leHBvcnQgY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25WNUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBOb25NYXhTdXBwcmVzc2lvblY1LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBub25NYXhTdXBwcmVzc2lvblY1XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Tm9uTWF4U3VwcHJlc3Npb25WNS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBOb3RFcXVhbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X2ltcGwnO1xuaW1wb3J0IHsgYmluYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV91dGlscyc7XG5leHBvcnQgY29uc3Qgbm90RXF1YWxJbXBsID0gY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoKGEsIGIpID0+IChhICE9PSBiKSA/IDEgOiAwKSk7XG5leHBvcnQgY29uc3Qgbm90RXF1YWwgPSBiaW5hcnlLZXJuZWxGdW5jKE5vdEVxdWFsLCBub3RFcXVhbEltcGwsIG51bGwgLyogY29tcGxleE9wICovLCAnYm9vbCcpO1xuZXhwb3J0IGNvbnN0IG5vdEVxdWFsQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE5vdEVxdWFsLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBub3RFcXVhbFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5vdEVxdWFsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IE9uZUhvdCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIG9uZUhvdChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW5kaWNlcyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgZGVwdGgsIG9uVmFsdWUsIG9mZlZhbHVlIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KGluZGljZXMsICdvbmVIb3QnKTtcbiAgICBjb25zdCBpbmRpY2VzU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShpbmRpY2VzLnNoYXBlKTtcbiAgICBjb25zdCByZXMgPSBuZXcgRmxvYXQzMkFycmF5KGluZGljZXNTaXplICogZGVwdGgpO1xuICAgIHJlcy5maWxsKG9mZlZhbHVlKTtcbiAgICBjb25zdCBpbmRpY2VzVmFsID0gYmFja2VuZC5kYXRhLmdldChpbmRpY2VzLmRhdGFJZCkudmFsdWVzO1xuICAgIGZvciAobGV0IGV2ZW50ID0gMDsgZXZlbnQgPCBpbmRpY2VzU2l6ZTsgKytldmVudCkge1xuICAgICAgICBpZiAoaW5kaWNlc1ZhbFtldmVudF0gPj0gMCAmJiBpbmRpY2VzVmFsW2V2ZW50XSA8IGRlcHRoKSB7XG4gICAgICAgICAgICByZXNbZXZlbnQgKiBkZXB0aCArIGluZGljZXNWYWxbZXZlbnRdXSA9IG9uVmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oWy4uLmluZGljZXMuc2hhcGUsIGRlcHRoXSwgJ2ludDMyJywgcmVzKTtcbn1cbmV4cG9ydCBjb25zdCBvbmVIb3RDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogT25lSG90LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBvbmVIb3Rcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1PbmVIb3QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgT25lc0xpa2UgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY29tcGxleCB9IGZyb20gJy4vQ29tcGxleCc7XG5pbXBvcnQgeyBmaWxsIH0gZnJvbSAnLi9GaWxsJztcbmltcG9ydCB7IGltYWcgfSBmcm9tICcuL0ltYWcnO1xuaW1wb3J0IHsgcmVhbCB9IGZyb20gJy4vUmVhbCc7XG5pbXBvcnQgeyB6ZXJvc0xpa2UgfSBmcm9tICcuL1plcm9zTGlrZSc7XG5leHBvcnQgZnVuY3Rpb24gb25lc0xpa2UoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGlmICh4LmR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ29uZXNMaWtlIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHN0cmluZyB0ZW5zb3JzJyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHguZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICAgIGNvbnN0IHJlYWxQYXJ0ID0gcmVhbCh7IGlucHV0czogeyBpbnB1dDogeCB9LCBiYWNrZW5kIH0pO1xuICAgICAgICBjb25zdCByID0gb25lc0xpa2UoeyBpbnB1dHM6IHsgeDogcmVhbFBhcnQgfSwgYmFja2VuZCB9KTtcbiAgICAgICAgY29uc3QgaW1hZ1BhcnQgPSBpbWFnKHsgaW5wdXRzOiB7IGlucHV0OiB4IH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIGNvbnN0IGkgPSB6ZXJvc0xpa2UoeyBpbnB1dHM6IHsgeDogaW1hZ1BhcnQgfSwgYmFja2VuZCB9KTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY29tcGxleCh7IGlucHV0czogeyByZWFsOiByLCBpbWFnOiBpIH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVhbFBhcnQpO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHIpO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGltYWdQYXJ0KTtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBmaWxsKHsgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IHguc2hhcGUsIHZhbHVlOiAxLCBkdHlwZTogeC5kdHlwZSB9IH0pO1xuICAgIH1cbn1cbmV4cG9ydCBjb25zdCBvbmVzTGlrZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBPbmVzTGlrZSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogb25lc0xpa2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1PbmVzTGlrZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBQYWNrLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNvbmNhdCB9IGZyb20gJy4vQ29uY2F0JztcbmltcG9ydCB7IGV4cGFuZERpbXMgfSBmcm9tICcuL0V4cGFuZERpbXMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhY2soYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGF4aXMgfSA9IGF0dHJzO1xuICAgIGlmIChpbnB1dHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiBleHBhbmREaW1zKHsgaW5wdXRzOiB7IGlucHV0OiBpbnB1dHNbMF0gfSwgYmFja2VuZCwgYXR0cnM6IHsgZGltOiBheGlzIH0gfSk7XG4gICAgfVxuICAgIGNvbnN0IHNoYXBlID0gaW5wdXRzWzBdLnNoYXBlO1xuICAgIGNvbnN0IGR0eXBlID0gaW5wdXRzWzBdLmR0eXBlO1xuICAgIGlucHV0cy5mb3JFYWNoKHQgPT4ge1xuICAgICAgICB1dGlsLmFzc2VydFNoYXBlc01hdGNoKHNoYXBlLCB0LnNoYXBlLCAnQWxsIHRlbnNvcnMgcGFzc2VkIHRvIHN0YWNrIG11c3QgaGF2ZSBtYXRjaGluZyBzaGFwZXMnKTtcbiAgICAgICAgdXRpbC5hc3NlcnQoZHR5cGUgPT09IHQuZHR5cGUsICgpID0+ICdBbGwgdGVuc29ycyBwYXNzZWQgdG8gc3RhY2sgbXVzdCBoYXZlIG1hdGNoaW5nIGR0eXBlcycpO1xuICAgIH0pO1xuICAgIGNvbnN0IGludGVybWVkaWF0ZVRlbnNvckluZm9zID0gW107XG4gICAgY29uc3QgZXhwYW5kZWRUZW5zb3JzID0gaW5wdXRzLm1hcCh0ID0+IHtcbiAgICAgICAgY29uc3QgZXhwYW5kZWRUID0gZXhwYW5kRGltcyh7IGlucHV0czogeyBpbnB1dDogdCB9LCBiYWNrZW5kLCBhdHRyczogeyBkaW06IGF4aXMgfSB9KTtcbiAgICAgICAgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MucHVzaChleHBhbmRlZFQpO1xuICAgICAgICByZXR1cm4gZXhwYW5kZWRUO1xuICAgIH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGNvbmNhdCh7IGlucHV0czogZXhwYW5kZWRUZW5zb3JzLCBiYWNrZW5kLCBhdHRyczogeyBheGlzIH0gfSk7XG4gICAgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgY29uc3QgcGFja0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBQYWNrLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBwYWNrXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UGFjay5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBQYWRWMiwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhZFYyKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBwYWRkaW5ncywgY29uc3RhbnRWYWx1ZSB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleCh4LCAncGFkJyk7XG4gICAgY29uc3Qgb3V0U2hhcGUgPSBwYWRkaW5ncy5tYXAoKHAsIGkpID0+IHBbMF0gLyogYmVmb3JlUGFkICovICsgeC5zaGFwZVtpXSArIHBbMV0gLyogYWZ0ZXJQYWQgKi8pO1xuICAgIGNvbnN0IHN0YXJ0ID0gcGFkZGluZ3MubWFwKHAgPT4gcFswXSk7XG4gICAgY29uc3QgeFZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgeFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoeC5zaGFwZSk7XG4gICAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCB4U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoeC5zaGFwZSk7XG4gICAgY29uc3QgcmVzdWx0U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShvdXRTaGFwZSk7XG4gICAgY29uc3QgcmVzdWx0UmFuayA9IG91dFNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCByZXN1bHRTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhvdXRTaGFwZSk7XG4gICAgY29uc3QgcmVzVmFscyA9IHV0aWwuZ2V0VHlwZWRBcnJheUZyb21EVHlwZSh4LmR0eXBlLCByZXN1bHRTaXplKTtcbiAgICBpZiAoY29uc3RhbnRWYWx1ZSAhPT0gMCkge1xuICAgICAgICByZXNWYWxzLmZpbGwoY29uc3RhbnRWYWx1ZSk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeFNpemU7IGkrKykge1xuICAgICAgICBjb25zdCBjb29yZHMgPSB1dGlsLmluZGV4VG9Mb2MoaSwgeFJhbmssIHhTdHJpZGVzKTtcbiAgICAgICAgY29uc3Qgb3V0Q29vcmRzID0gY29vcmRzLm1hcCgoYywgaSkgPT4gYyArIHN0YXJ0W2ldKTtcbiAgICAgICAgY29uc3Qgb3V0SW5kZXggPSB1dGlsLmxvY1RvSW5kZXgob3V0Q29vcmRzLCByZXN1bHRSYW5rLCByZXN1bHRTdHJpZGVzKTtcbiAgICAgICAgcmVzVmFsc1tvdXRJbmRleF0gPSB4VmFsc1tpXTtcbiAgICB9XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLndyaXRlKHJlc1ZhbHMsIG91dFNoYXBlLCB4LmR0eXBlKTtcbiAgICByZXR1cm4geyBkYXRhSWQ6IG91dElkLCBzaGFwZTogb3V0U2hhcGUsIGR0eXBlOiB4LmR0eXBlIH07XG59XG5leHBvcnQgY29uc3QgcGFkVjJDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUGFkVjIsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHBhZFYyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UGFkVjIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUG93IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfaW1wbCc7XG5pbXBvcnQgeyBiaW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBwb3dJbXBsID0gY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoYSwgYikgPT4gTWF0aC5wb3coYSwgYikpO1xuZXhwb3J0IGNvbnN0IHBvdyA9IGJpbmFyeUtlcm5lbEZ1bmMoUG93LCBwb3dJbXBsKTtcbmV4cG9ydCBjb25zdCBwb3dDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUG93LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBwb3dcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Qb3cuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFByZWx1IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X2ltcGwnO1xuY29uc3QgcHJlbHVJbXBsID0gY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoeFZhbHVlLCBhVmFsdWUpID0+IHhWYWx1ZSA8IDAgPyBhVmFsdWUgKiB4VmFsdWUgOiB4VmFsdWUpO1xuZXhwb3J0IGZ1bmN0aW9uIHByZWx1KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IHgsIGFscGhhIH0gPSBpbnB1dHM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChbeCwgYWxwaGFdLCAncHJlbHUnKTtcbiAgICBjb25zdCBhVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBiVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoYWxwaGEuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgW3Jlc3VsdERhdGEsIHJlc3VsdFNoYXBlXSA9IHByZWx1SW1wbCh4LnNoYXBlLCBhbHBoYS5zaGFwZSwgYVZhbHMsIGJWYWxzLCB4LmR0eXBlKTtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhyZXN1bHRTaGFwZSwgeC5kdHlwZSwgcmVzdWx0RGF0YSk7XG59XG5leHBvcnQgY29uc3QgcHJlbHVDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUHJlbHUsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHByZWx1LFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVByZWx1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgUHJvZCwgdXBjYXN0VHlwZSwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHsgdHJhbnNwb3NlIH0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuZXhwb3J0IGZ1bmN0aW9uIHByb2RJbXBsKHhTaGFwZSwgeER0eXBlLCB4VmFscywgcmVkdWN0aW9uQXhlcykge1xuICAgIGNvbnN0IFtvdXRTaGFwZSwgcmVkdWNlU2hhcGVdID0gYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMoeFNoYXBlLCByZWR1Y3Rpb25BeGVzKTtcbiAgICBjb25zdCBvdXREdHlwZSA9IHVwY2FzdFR5cGUoeER0eXBlLCAnaW50MzInKTtcbiAgICBjb25zdCBvdXRWYWxzID0gdXRpbC5tYWtlWmVyb3NUeXBlZEFycmF5KHV0aWwuc2l6ZUZyb21TaGFwZShvdXRTaGFwZSksIG91dER0eXBlKTtcbiAgICBjb25zdCByZWR1Y2VTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dFZhbHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gaSAqIHJlZHVjZVNpemU7XG4gICAgICAgIGxldCBwcm9kID0gMTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByZWR1Y2VTaXplOyArK2opIHtcbiAgICAgICAgICAgIHByb2QgKj0geFZhbHNbb2Zmc2V0ICsgal07XG4gICAgICAgIH1cbiAgICAgICAgb3V0VmFsc1tpXSA9IHByb2Q7XG4gICAgfVxuICAgIHJldHVybiB7IG91dFZhbHMsIG91dFNoYXBlLCBvdXREdHlwZSB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByb2QoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGF4aXMsIGtlZXBEaW1zIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KHgsICdwcm9kJyk7XG4gICAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBheGVzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShheGlzLCB4LnNoYXBlKTtcbiAgICBjb25zdCBwZXJtdXRhdGlvbiA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oYXhlcywgeFJhbmspO1xuICAgIGxldCByZWR1Y3Rpb25BeGVzID0gYXhlcztcbiAgICBsZXQgcGVybXV0ZWRYID0geDtcbiAgICBjb25zdCBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcyA9IFtdO1xuICAgIGlmIChwZXJtdXRhdGlvbiAhPSBudWxsKSB7XG4gICAgICAgIHBlcm11dGVkWCA9IHRyYW5zcG9zZSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHBlcm06IHBlcm11dGF0aW9uIH0gfSk7XG4gICAgICAgIGludGVybWVkaWF0ZVRlbnNvckluZm9zLnB1c2gocGVybXV0ZWRYKTtcbiAgICAgICAgcmVkdWN0aW9uQXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRJbm5lck1vc3RBeGVzKHJlZHVjdGlvbkF4ZXMubGVuZ3RoLCB4UmFuayk7XG4gICAgfVxuICAgIGNvbnN0IHhWYWxzID0gYmFja2VuZC5kYXRhLmdldChwZXJtdXRlZFguZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgeyBvdXRWYWxzLCBvdXRTaGFwZSwgb3V0RHR5cGUgfSA9IHByb2RJbXBsKHBlcm11dGVkWC5zaGFwZSwgcGVybXV0ZWRYLmR0eXBlLCB4VmFscywgcmVkdWN0aW9uQXhlcyk7XG4gICAgbGV0IHJlc3VsdFNoYXBlID0gb3V0U2hhcGU7XG4gICAgaWYgKGtlZXBEaW1zKSB7XG4gICAgICAgIHJlc3VsdFNoYXBlID0gYmFja2VuZF91dGlsLmV4cGFuZFNoYXBlVG9LZWVwRGltKG91dFNoYXBlLCBheGVzKTtcbiAgICB9XG4gICAgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHJlc3VsdFNoYXBlLCBvdXREdHlwZSwgb3V0VmFscyk7XG59XG5leHBvcnQgY29uc3QgcHJvZENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBQcm9kLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBwcm9kXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHJvZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBSYW5nZSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyByYW5nZUltcGwgfSBmcm9tICcuL1JhbmdlX2ltcGwnO1xuZXhwb3J0IGZ1bmN0aW9uIHJhbmdlKGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgc3RhcnQsIHN0b3AsIGR0eXBlLCBzdGVwIH0gPSBhdHRycztcbiAgICBjb25zdCB2YWx1ZXMgPSByYW5nZUltcGwoc3RhcnQsIHN0b3AsIHN0ZXAsIGR0eXBlKTtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbdmFsdWVzLmxlbmd0aF0sIGR0eXBlLCB2YWx1ZXMpO1xufVxuZXhwb3J0IGNvbnN0IHJhbmdlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJhbmdlLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiByYW5nZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJhbmdlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIHJhbmdlSW1wbChzdGFydCwgc3RvcCwgc3RlcCwgZHR5cGUpIHtcbiAgICBjb25zdCBzYW1lU3RhcnRTdG9wID0gc3RhcnQgPT09IHN0b3A7XG4gICAgY29uc3QgaW5jcmVhc2luZ1JhbmdlTmVnYXRpdmVTdGVwID0gc3RhcnQgPCBzdG9wICYmIHN0ZXAgPCAwO1xuICAgIGNvbnN0IGRlY3JlYXNpbmdSYW5nZVBvc2l0aXZlU3RlcCA9IHN0b3AgPCBzdGFydCAmJiBzdGVwID4gMTtcbiAgICBpZiAoc2FtZVN0YXJ0U3RvcCB8fCBpbmNyZWFzaW5nUmFuZ2VOZWdhdGl2ZVN0ZXAgfHxcbiAgICAgICAgZGVjcmVhc2luZ1JhbmdlUG9zaXRpdmVTdGVwKSB7XG4gICAgICAgIHJldHVybiB1dGlsLm1ha2VaZXJvc1R5cGVkQXJyYXkoMCwgZHR5cGUpO1xuICAgIH1cbiAgICBjb25zdCBudW1FbGVtZW50cyA9IE1hdGguYWJzKE1hdGguY2VpbCgoc3RvcCAtIHN0YXJ0KSAvIHN0ZXApKTtcbiAgICBjb25zdCB2YWx1ZXMgPSB1dGlsLm1ha2VaZXJvc1R5cGVkQXJyYXkobnVtRWxlbWVudHMsIGR0eXBlKTtcbiAgICBpZiAoc3RvcCA8IHN0YXJ0ICYmIHN0ZXAgPT09IDEpIHtcbiAgICAgICAgLy8gQXV0byBhZGp1c3QgdGhlIHN0ZXAncyBzaWduIGlmIGl0IGhhc24ndCBiZWVuIHNldFxuICAgICAgICAvLyAob3Igd2FzIHNldCB0byAxKVxuICAgICAgICBzdGVwID0gLTE7XG4gICAgfVxuICAgIHZhbHVlc1swXSA9IHN0YXJ0O1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhbHVlc1tpXSA9IHZhbHVlc1tpIC0gMV0gKyBzdGVwO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVzO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmFuZ2VfaW1wbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBSZWFsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiByZWFsKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IGlucHV0IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgcmVhbCA9IGJhY2tlbmQuZGF0YS5nZXQoaW5wdXQuZGF0YUlkKS5jb21wbGV4VGVuc29ySW5mb3MucmVhbDtcbiAgICBjb25zdCByZWFsVmFsID0gYmFja2VuZC5kYXRhLmdldChyZWFsLmRhdGFJZCkudmFsdWVzO1xuICAgIC8vIFdoZW4gY29tcGxleCB0ZW5zb3IgaXMgZGlzcG9zZWQsIGl0cyB1bmRlcmx5aW5nIHBhcnRzIHdpbGwgYmUgZGlzcG9zZWQgdG9vLlxuICAgIC8vIE1ha2UgbmV3IHRlbnNvciBvdXQgb2YgdGhlIHJlYWwgdmFsdWUgb2YgdGhlIGNvbXBsZXguIFRoaXMgbWFrZXMgc3VyZSB0aGVcbiAgICAvLyB2YWx1ZSBpcyBzdGlsbCBhY2Nlc3NpYmxlIGV2ZW4gaWYgY29tcGxleCB0ZW5zb3IgaXMgZGlzcG9zZWQuXG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVhbC5zaGFwZSwgcmVhbC5kdHlwZSwgcmVhbFZhbCk7XG59XG5leHBvcnQgY29uc3QgcmVhbENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBSZWFsLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiByZWFsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVhbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBSZWFsRGl2IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfaW1wbCc7XG5pbXBvcnQgeyBiaW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCByZWFsRGl2SW1wbCA9IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwoKGEsIGIpID0+IGEgLyBiKTtcbmV4cG9ydCBjb25zdCBkaXYgPSBiaW5hcnlLZXJuZWxGdW5jKFJlYWxEaXYsIHJlYWxEaXZJbXBsKTtcbmV4cG9ydCBjb25zdCByZWFsRGl2Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJlYWxEaXYsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGRpdlxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlYWxEaXYuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFJlY2lwcm9jYWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IHJlY2lwcm9jYWwgPSB1bmFyeUtlcm5lbEZ1bmMoUmVjaXByb2NhbCwgKHhpKSA9PiAxIC8geGkpO1xuZXhwb3J0IGNvbnN0IHJlY2lwcm9jYWxDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUmVjaXByb2NhbCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogcmVjaXByb2NhbCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWNpcHJvY2FsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBSZWx1IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCByZWx1ID0gdW5hcnlLZXJuZWxGdW5jKFJlbHUsICh4aSkgPT4gTWF0aC5tYXgoMCwgeGkpKTtcbmV4cG9ydCBjb25zdCByZWx1Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJlbHUsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHJlbHUsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVsdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUmVsdTYgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IHJlbHU2ID0gdW5hcnlLZXJuZWxGdW5jKFJlbHU2LCAoeGkpID0+IE1hdGgubWluKE1hdGgubWF4KDAsIHhpKSwgNikpO1xuZXhwb3J0IGNvbnN0IHJlbHU2Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJlbHU2LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiByZWx1Nixcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWx1Ni5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBSZXNoYXBlLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiByZXNoYXBlKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBzaGFwZSB9ID0gYXR0cnM7XG4gICAgY29uc3QgeFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoeC5zaGFwZSk7XG4gICAgY29uc3QgJHNoYXBlID0gdXRpbC5pbmZlckZyb21JbXBsaWNpdFNoYXBlKHNoYXBlLCB4U2l6ZSk7XG4gICAgY29uc3QgJHhTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKCRzaGFwZSk7XG4gICAgdXRpbC5hc3NlcnQoeFNpemUgPT09ICR4U2l6ZSwgKCkgPT4gYFRoZSBuZXcgc2hhcGUgKCR7JHNoYXBlfSkgaGFzICR7JHhTaXplfSBlbGVtZW50cyBhbmQgdGhlIG9sZCBgICtcbiAgICAgICAgYHNoYXBlICgke3guc2hhcGV9KSBoYXMgJHt4U2l6ZX0gZWxlbWVudHMuIFRoZSBuZXcgc2hhcGUgYW5kIG9sZCBgICtcbiAgICAgICAgYHNoYXBlIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMuYCk7XG4gICAgYmFja2VuZC5pbmNSZWYoeC5kYXRhSWQpO1xuICAgIGNvbnN0IHhEYXRhID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCk7XG4gICAgaWYgKHhEYXRhLmNvbXBsZXhUZW5zb3JJbmZvcyAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHJlYWwgPSB4RGF0YS5jb21wbGV4VGVuc29ySW5mb3MucmVhbDtcbiAgICAgICAgY29uc3QgaW1hZyA9IHhEYXRhLmNvbXBsZXhUZW5zb3JJbmZvcy5pbWFnO1xuICAgICAgICByZWFsLnNoYXBlID0gJHNoYXBlO1xuICAgICAgICBpbWFnLnNoYXBlID0gJHNoYXBlO1xuICAgIH1cbiAgICByZXR1cm4geyBkYXRhSWQ6IHguZGF0YUlkLCBzaGFwZTogJHNoYXBlLCBkdHlwZTogeC5kdHlwZSB9O1xufVxuZXhwb3J0IGNvbnN0IHJlc2hhcGVDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUmVzaGFwZSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogcmVzaGFwZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlc2hhcGUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUmVzaXplQmlsaW5lYXIsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiByZXNpemVCaWxpbmVhcihhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW1hZ2VzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBhbGlnbkNvcm5lcnMsIGhhbGZQaXhlbENlbnRlcnMsIHNpemUgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoaW1hZ2VzLCAncmVzaXplQmlsaW5lYXInKTtcbiAgICBjb25zdCBpbWFnZXNTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhpbWFnZXMuc2hhcGUpO1xuICAgIGNvbnN0IFtuZXdIZWlnaHQsIG5ld1dpZHRoXSA9IHNpemU7XG4gICAgY29uc3QgW2JhdGNoLCBvbGRIZWlnaHQsIG9sZFdpZHRoLCBudW1DaGFubmVsc10gPSBpbWFnZXMuc2hhcGU7XG4gICAgY29uc3QgeFZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoaW1hZ2VzLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBGbG9hdDMyQXJyYXkodXRpbC5zaXplRnJvbVNoYXBlKFtiYXRjaCwgbmV3SGVpZ2h0LCBuZXdXaWR0aCwgbnVtQ2hhbm5lbHNdKSk7XG4gICAgY29uc3QgZWZmZWN0aXZlSW5wdXRTaXplID0gW1xuICAgICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld0hlaWdodCA+IDEpID8gb2xkSGVpZ2h0IC0gMSA6IG9sZEhlaWdodCxcbiAgICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdXaWR0aCA+IDEpID8gb2xkV2lkdGggLSAxIDogb2xkV2lkdGhcbiAgICBdO1xuICAgIGNvbnN0IGVmZmVjdGl2ZU91dHB1dFNpemUgPSBbXG4gICAgICAgIChhbGlnbkNvcm5lcnMgJiYgbmV3SGVpZ2h0ID4gMSkgPyBuZXdIZWlnaHQgLSAxIDogbmV3SGVpZ2h0LFxuICAgICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld1dpZHRoID4gMSkgPyBuZXdXaWR0aCAtIDEgOiBuZXdXaWR0aFxuICAgIF07XG4gICAgbGV0IG91dHB1dElkeCA9IDA7XG4gICAgY29uc3QgZWZmZWN0aXZlUm93U2l6ZVJhdGlvID0gZWZmZWN0aXZlSW5wdXRTaXplWzBdIC8gZWZmZWN0aXZlT3V0cHV0U2l6ZVswXTtcbiAgICBjb25zdCBlZmZlY3RpdmVDb2xTaXplUmF0aW8gPSBlZmZlY3RpdmVJbnB1dFNpemVbMV0gLyBlZmZlY3RpdmVPdXRwdXRTaXplWzFdO1xuICAgIGZvciAobGV0IGIgPSAwOyBiIDwgYmF0Y2g7IGIrKykge1xuICAgICAgICBmb3IgKGxldCByID0gMDsgciA8IG5ld0hlaWdodDsgcisrKSB7XG4gICAgICAgICAgICBsZXQgc291cmNlRnJhY1JvdztcbiAgICAgICAgICAgIGlmIChoYWxmUGl4ZWxDZW50ZXJzKSB7XG4gICAgICAgICAgICAgICAgc291cmNlRnJhY1JvdyA9IGVmZmVjdGl2ZVJvd1NpemVSYXRpbyAqIChyICsgMC41KSAtIDAuNTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHNvdXJjZUZyYWNSb3cgPSBlZmZlY3RpdmVSb3dTaXplUmF0aW8gKiByO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc291cmNlUm93Rmxvb3IgPSBNYXRoLm1heCgwLCBNYXRoLmZsb29yKHNvdXJjZUZyYWNSb3cpKTtcbiAgICAgICAgICAgIGNvbnN0IHJvd0ZyYWMgPSBzb3VyY2VGcmFjUm93IC0gc291cmNlUm93Rmxvb3I7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VSb3dDZWlsID0gTWF0aC5taW4ob2xkSGVpZ2h0IC0gMSwgTWF0aC5jZWlsKHNvdXJjZUZyYWNSb3cpKTtcbiAgICAgICAgICAgIGNvbnN0IHRvcFJvd09mZnNldCA9IGIgKiBpbWFnZXNTdHJpZGVzWzBdICsgc291cmNlUm93Rmxvb3IgKiBpbWFnZXNTdHJpZGVzWzFdO1xuICAgICAgICAgICAgY29uc3QgYm90Um93T2Zmc2V0ID0gYiAqIGltYWdlc1N0cmlkZXNbMF0gKyBzb3VyY2VSb3dDZWlsICogaW1hZ2VzU3RyaWRlc1sxXTtcbiAgICAgICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgbmV3V2lkdGg7IGMrKykge1xuICAgICAgICAgICAgICAgIGxldCBzb3VyY2VGcmFjQ29sO1xuICAgICAgICAgICAgICAgIGlmIChoYWxmUGl4ZWxDZW50ZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUZyYWNDb2wgPSBlZmZlY3RpdmVDb2xTaXplUmF0aW8gKiAoYyArIDAuNSkgLSAwLjU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzb3VyY2VGcmFjQ29sID0gZWZmZWN0aXZlQ29sU2l6ZVJhdGlvICogYztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3Qgc291cmNlQ29sRmxvb3IgPSBNYXRoLm1heCgwLCBNYXRoLmZsb29yKHNvdXJjZUZyYWNDb2wpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2xGcmFjID0gc291cmNlRnJhY0NvbCAtIHNvdXJjZUNvbEZsb29yO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNvbENlaWwgPSBNYXRoLm1pbihvbGRXaWR0aCAtIDEsIE1hdGguY2VpbChzb3VyY2VGcmFjQ29sKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9wTGVmdE9mZmVzdCA9IHRvcFJvd09mZnNldCArIHNvdXJjZUNvbEZsb29yICogaW1hZ2VzU3RyaWRlc1syXTtcbiAgICAgICAgICAgICAgICBjb25zdCBib3RMZWZ0T2Zmc2V0ID0gYm90Um93T2Zmc2V0ICsgc291cmNlQ29sRmxvb3IgKiBpbWFnZXNTdHJpZGVzWzJdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvcFJpZ2h0T2Zmc2V0ID0gdG9wUm93T2Zmc2V0ICsgc291cmNlQ29sQ2VpbCAqIGltYWdlc1N0cmlkZXNbMl07XG4gICAgICAgICAgICAgICAgY29uc3QgYm90UmlnaHRPZmZlc3QgPSBib3RSb3dPZmZzZXQgKyBzb3VyY2VDb2xDZWlsICogaW1hZ2VzU3RyaWRlc1syXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBkID0gMDsgZCA8IG51bUNoYW5uZWxzOyBkKyspIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQmVnaW4gc2hhZGVyLlxuICAgICAgICAgICAgICAgICAgICAvLyBDb21wdXRlIHRoZSBmcmFjdGlvbmFsIGluZGV4IG9mIHRoZSBzb3VyY2UuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvcExlZnQgPSB4VmFsdWVzW3RvcExlZnRPZmZlc3QgKyBkXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYm90dG9tTGVmdCA9IHhWYWx1ZXNbYm90TGVmdE9mZnNldCArIGRdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0b3BSaWdodCA9IHhWYWx1ZXNbdG9wUmlnaHRPZmZzZXQgKyBkXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYm90dG9tUmlnaHQgPSB4VmFsdWVzW2JvdFJpZ2h0T2ZmZXN0ICsgZF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvcCA9IHRvcExlZnQgKyAodG9wUmlnaHQgLSB0b3BMZWZ0KSAqIGNvbEZyYWM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvdHRvbSA9IGJvdHRvbUxlZnQgKyAoYm90dG9tUmlnaHQgLSBib3R0b21MZWZ0KSAqIGNvbEZyYWM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdG9wICsgKGJvdHRvbSAtIHRvcCkgKiByb3dGcmFjO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRbb3V0cHV0SWR4KytdID0gbmV3VmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtiYXRjaCwgbmV3SGVpZ2h0LCBuZXdXaWR0aCwgbnVtQ2hhbm5lbHNdLCAnZmxvYXQzMicsIHJlc3VsdCk7XG59XG5leHBvcnQgY29uc3QgcmVzaXplQmlsaW5lYXJDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUmVzaXplQmlsaW5lYXIsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHJlc2l6ZUJpbGluZWFyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVzaXplQmlsaW5lYXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUmVzaXplQmlsaW5lYXJHcmFkLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5leHBvcnQgZnVuY3Rpb24gcmVzaXplQmlsaW5lYXJHcmFkKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBpbWFnZXMsIGR5IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBhbGlnbkNvcm5lcnMgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoW2R5LCBpbWFnZXNdLCAncmVzaXplQmlsaW5lYXJHcmFkJyk7XG4gICAgY29uc3QgaW1hZ2VzU3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoaW1hZ2VzLnNoYXBlKTtcbiAgICBjb25zdCBbYmF0Y2gsIHhIZWlnaHQsIHhXaWR0aCwgZGVwdGhdID0gaW1hZ2VzLnNoYXBlO1xuICAgIGNvbnN0IFssIHlIZWlnaHQsIHlXaWR0aF0gPSBkeS5zaGFwZTtcbiAgICBjb25zdCBvdXRwdXQgPSBuZXcgRmxvYXQzMkFycmF5KGJhdGNoICogeEhlaWdodCAqIHhXaWR0aCAqIGRlcHRoKTtcbiAgICAvLyBJbiB0aGUgYmFja3dhcmRzIHBhc3MsIHdlIHdhbnQgdG8gZmluZCB0aGUgcGl4ZWxzIHRoYXQgd2VyZSBnZW5lcmF0ZWRcbiAgICAvLyBmb3IgZWFjaCBwaXhlbCBpbiB0aGUgaW5wdXQgaW1hZ2UgdGhlIGZvcndhcmQgcGFzcyBhbmQgYWRkIHRoZVxuICAgIC8vIGNvcnJlc3BvbmRpbmcgY29lZmZpY2llbnQgZnJvbSBkeSB0byB0aGUgZ3JhZGllbnQgKHdpdGggc29tZVxuICAgIC8vIGludGVycG9sYXRpb24pLlxuICAgIGNvbnN0IGVmZmVjdGl2ZVhTaXplID0gW1xuICAgICAgICAoYWxpZ25Db3JuZXJzICYmIHlIZWlnaHQgPiAxKSA/IHhIZWlnaHQgLSAxIDogeEhlaWdodCxcbiAgICAgICAgKGFsaWduQ29ybmVycyAmJiB5V2lkdGggPiAxKSA/IHhXaWR0aCAtIDEgOiB4V2lkdGhcbiAgICBdO1xuICAgIGNvbnN0IGVmZmVjdGl2ZVlTaXplID0gW1xuICAgICAgICAoYWxpZ25Db3JuZXJzICYmIHlIZWlnaHQgPiAxKSA/IHlIZWlnaHQgLSAxIDogeUhlaWdodCxcbiAgICAgICAgKGFsaWduQ29ybmVycyAmJiB5V2lkdGggPiAxKSA/IHlXaWR0aCAtIDEgOiB5V2lkdGhcbiAgICBdO1xuICAgIGNvbnN0IGhlaWdodFNjYWxlID0gZWZmZWN0aXZlWFNpemVbMF0gLyBlZmZlY3RpdmVZU2l6ZVswXTtcbiAgICBjb25zdCB3aWR0aFNjYWxlID0gZWZmZWN0aXZlWFNpemVbMV0gLyBlZmZlY3RpdmVZU2l6ZVsxXTtcbiAgICAvLyBSZWZlcmVuY2UgaW1wbGVtZW50YXRpb25cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yZmxvdy9ibG9iLzMwMzkzNzVjODZhNWJiYzk2MTBjNzcyNWRjYWE5NWQ2MzVmODdiYTIvdGVuc29yZmxvdy9jb3JlL2tlcm5lbHMvcmVzaXplX2JpbGluZWFyX29wLmNjI0wyNzVcbiAgICBjb25zdCBkeVZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoZHkuZGF0YUlkKS52YWx1ZXM7XG4gICAgbGV0IG9mZnNldCA9IDA7XG4gICAgZm9yIChsZXQgYiA9IDA7IGIgPCBiYXRjaDsgYisrKSB7XG4gICAgICAgIGNvbnN0IGJPZmZzZXQgPSBiICogaW1hZ2VzU3RyaWRlc1swXTtcbiAgICAgICAgZm9yIChsZXQgciA9IDA7IHIgPCB5SGVpZ2h0OyByKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGR4UiA9IHIgKiBoZWlnaHRTY2FsZTtcbiAgICAgICAgICAgIGNvbnN0IHRvcER4UkluZGV4ID0gTWF0aC5mbG9vcihkeFIpO1xuICAgICAgICAgICAgY29uc3QgYm90dG9tRHhSSW5kZXggPSBNYXRoLm1pbihNYXRoLmNlaWwoZHhSKSwgeEhlaWdodCAtIDEpO1xuICAgICAgICAgICAgY29uc3QgdG9wRHhST2Zmc2V0ID0gYk9mZnNldCArIHRvcER4UkluZGV4ICogaW1hZ2VzU3RyaWRlc1sxXTtcbiAgICAgICAgICAgIGNvbnN0IGJvdHRvbUR4Uk9mZnNldCA9IGJPZmZzZXQgKyBib3R0b21EeFJJbmRleCAqIGltYWdlc1N0cmlkZXNbMV07XG4gICAgICAgICAgICBjb25zdCBkeFJMZXJwID0gZHhSIC0gdG9wRHhSSW5kZXg7XG4gICAgICAgICAgICBjb25zdCBpbnZlcnNlRHhSTGVycCA9IDEuMCAtIGR4UkxlcnA7XG4gICAgICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IHlXaWR0aDsgYysrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZHhDID0gYyAqIHdpZHRoU2NhbGU7XG4gICAgICAgICAgICAgICAgY29uc3QgbGVmdER4Q0luZGV4ID0gTWF0aC5mbG9vcihkeEMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJpZ2h0RHhDSW5kZXggPSBNYXRoLm1pbihNYXRoLmNlaWwoZHhDKSwgeFdpZHRoIC0gMSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZHhDTGVycCA9IGR4QyAtIGxlZnREeENJbmRleDtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnZlcnNlRHhDTGVycCA9IDEuMCAtIGR4Q0xlcnA7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9wTGVmdFJDT2Zmc2V0ID0gdG9wRHhST2Zmc2V0ICsgbGVmdER4Q0luZGV4ICogaW1hZ2VzU3RyaWRlc1syXTtcbiAgICAgICAgICAgICAgICBjb25zdCB0b3BSaWdodFJDT2Zmc2V0ID0gdG9wRHhST2Zmc2V0ICsgcmlnaHREeENJbmRleCAqIGltYWdlc1N0cmlkZXNbMl07XG4gICAgICAgICAgICAgICAgY29uc3QgYm90dG9tTGVmdFJDT2Zmc2V0ID0gYm90dG9tRHhST2Zmc2V0ICsgbGVmdER4Q0luZGV4ICogaW1hZ2VzU3RyaWRlc1syXTtcbiAgICAgICAgICAgICAgICBjb25zdCBib3R0b21SaWdodFJDT2Zmc2V0ID0gYm90dG9tRHhST2Zmc2V0ICsgcmlnaHREeENJbmRleCAqIGltYWdlc1N0cmlkZXNbMl07XG4gICAgICAgICAgICAgICAgY29uc3QgaW52ZXJzZUR4UkxlcnBUaW1lc0ludmVyc2VEeENMZXJwID0gaW52ZXJzZUR4UkxlcnAgKiBpbnZlcnNlRHhDTGVycDtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnZlcnNlRHhSTGVycFRpbWVzRHhDTGVycCA9IGludmVyc2VEeFJMZXJwICogZHhDTGVycDtcbiAgICAgICAgICAgICAgICBjb25zdCBkeFJMZXJwVGltZXNJbnZlcnNlRHhDTGVycCA9IGR4UkxlcnAgKiBpbnZlcnNlRHhDTGVycDtcbiAgICAgICAgICAgICAgICBjb25zdCBkeFJMZXJwVGltZXNEeENMZXJwID0gZHhSTGVycCAqIGR4Q0xlcnA7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZCA9IDA7IGQgPCBkZXB0aDsgZCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGR5VmFsID0gZHlWYWx1ZXNbb2Zmc2V0KytdO1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRbdG9wTGVmdFJDT2Zmc2V0ICsgZF0gKz1cbiAgICAgICAgICAgICAgICAgICAgICAgIGR5VmFsICogaW52ZXJzZUR4UkxlcnBUaW1lc0ludmVyc2VEeENMZXJwO1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRbdG9wUmlnaHRSQ09mZnNldCArIGRdICs9IGR5VmFsICogaW52ZXJzZUR4UkxlcnBUaW1lc0R4Q0xlcnA7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtib3R0b21MZWZ0UkNPZmZzZXQgKyBkXSArPSBkeVZhbCAqIGR4UkxlcnBUaW1lc0ludmVyc2VEeENMZXJwO1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRbYm90dG9tUmlnaHRSQ09mZnNldCArIGRdICs9IGR5VmFsICogZHhSTGVycFRpbWVzRHhDTGVycDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW2JhdGNoLCB4V2lkdGgsIHhIZWlnaHQsIGRlcHRoXSwgJ2Zsb2F0MzInLCBvdXRwdXQpO1xufVxuZXhwb3J0IGNvbnN0IHJlc2l6ZUJpbGluZWFyR3JhZENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBSZXNpemVCaWxpbmVhckdyYWQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHJlc2l6ZUJpbGluZWFyR3JhZFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlc2l6ZUJpbGluZWFyR3JhZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBSZXNpemVOZWFyZXN0TmVpZ2hib3IsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiByZXNpemVOZWFyZXN0TmVpZ2hib3IoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGltYWdlcyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYWxpZ25Db3JuZXJzLCBoYWxmUGl4ZWxDZW50ZXJzLCBzaXplIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KGltYWdlcywgJ3Jlc2l6ZU5lYXJlc3ROZWlnaGJvcicpO1xuICAgIGNvbnN0IGltYWdlc1N0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGltYWdlcy5zaGFwZSk7XG4gICAgY29uc3QgW25ld0hlaWdodCwgbmV3V2lkdGhdID0gc2l6ZTtcbiAgICBjb25zdCBbYmF0Y2gsIG9sZEhlaWdodCwgb2xkV2lkdGgsIG51bUNoYW5uZWxzXSA9IGltYWdlcy5zaGFwZTtcbiAgICBjb25zdCB4VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldChpbWFnZXMuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3Qgb3V0cHV0ID0gbmV3IEZsb2F0MzJBcnJheShiYXRjaCAqIG5ld0hlaWdodCAqIG5ld1dpZHRoICogbnVtQ2hhbm5lbHMpO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUlucHV0U2l6ZSA9IFtcbiAgICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdIZWlnaHQgPiAxKSA/IG9sZEhlaWdodCAtIDEgOiBvbGRIZWlnaHQsXG4gICAgICAgIChhbGlnbkNvcm5lcnMgJiYgbmV3V2lkdGggPiAxKSA/IG9sZFdpZHRoIC0gMSA6IG9sZFdpZHRoXG4gICAgXTtcbiAgICBjb25zdCBlZmZlY3RpdmVPdXRwdXRTaXplID0gW1xuICAgICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld0hlaWdodCA+IDEpID8gbmV3SGVpZ2h0IC0gMSA6IG5ld0hlaWdodCxcbiAgICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdXaWR0aCA+IDEpID8gbmV3V2lkdGggLSAxIDogbmV3V2lkdGhcbiAgICBdO1xuICAgIGNvbnN0IGVmZmVjdGl2ZVJvd1NpemVSYXRpbyA9IGVmZmVjdGl2ZUlucHV0U2l6ZVswXSAvIGVmZmVjdGl2ZU91dHB1dFNpemVbMF07XG4gICAgY29uc3QgZWZmZWN0aXZlQ29sU2l6ZVJhdGlvID0gZWZmZWN0aXZlSW5wdXRTaXplWzFdIC8gZWZmZWN0aXZlT3V0cHV0U2l6ZVsxXTtcbiAgICBsZXQgb3V0cHV0T2Zmc2V0ID0gMDtcbiAgICBmb3IgKGxldCBiID0gMDsgYiA8IGJhdGNoOyBiKyspIHtcbiAgICAgICAgY29uc3QgYmF0Y2hPZmZzZXQgPSBiICogaW1hZ2VzU3RyaWRlc1swXTtcbiAgICAgICAgZm9yIChsZXQgciA9IDA7IHIgPCBuZXdIZWlnaHQ7IHIrKykge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlRnJhY1JvdyA9IGhhbGZQaXhlbENlbnRlcnMgP1xuICAgICAgICAgICAgICAgIGVmZmVjdGl2ZVJvd1NpemVSYXRpbyAqIChyICsgMC41KSA6XG4gICAgICAgICAgICAgICAgZWZmZWN0aXZlUm93U2l6ZVJhdGlvICogcjtcbiAgICAgICAgICAgIGxldCBzb3VyY2VOZWFyZXN0Um93ID0gTWF0aC5taW4ob2xkSGVpZ2h0IC0gMSwgYWxpZ25Db3JuZXJzID8gTWF0aC5yb3VuZChzb3VyY2VGcmFjUm93KSA6IE1hdGguZmxvb3Ioc291cmNlRnJhY1JvdykpO1xuICAgICAgICAgICAgaWYgKGhhbGZQaXhlbENlbnRlcnMpIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VOZWFyZXN0Um93ID0gTWF0aC5tYXgoMCwgc291cmNlTmVhcmVzdFJvdyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByb3dPZmZzZXQgPSBiYXRjaE9mZnNldCArIHNvdXJjZU5lYXJlc3RSb3cgKiBpbWFnZXNTdHJpZGVzWzFdO1xuICAgICAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBuZXdXaWR0aDsgYysrKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc291cmNlRnJhY0NvbCA9IGhhbGZQaXhlbENlbnRlcnMgP1xuICAgICAgICAgICAgICAgICAgICBlZmZlY3RpdmVDb2xTaXplUmF0aW8gKiAoYyArIDAuNSkgOlxuICAgICAgICAgICAgICAgICAgICBlZmZlY3RpdmVDb2xTaXplUmF0aW8gKiBjO1xuICAgICAgICAgICAgICAgIGxldCBzb3VyY2VOZWFyZXN0Q29sID0gTWF0aC5taW4ob2xkV2lkdGggLSAxLCBhbGlnbkNvcm5lcnMgPyBNYXRoLnJvdW5kKHNvdXJjZUZyYWNDb2wpIDpcbiAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihzb3VyY2VGcmFjQ29sKSk7XG4gICAgICAgICAgICAgICAgaWYgKGhhbGZQaXhlbENlbnRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlTmVhcmVzdENvbCA9IE1hdGgubWF4KDAsIHNvdXJjZU5lYXJlc3RDb2wpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBjb2xPZmZzZXQgPSByb3dPZmZzZXQgKyBzb3VyY2VOZWFyZXN0Q29sICogaW1hZ2VzU3RyaWRlc1syXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBkID0gMDsgZCA8IG51bUNoYW5uZWxzOyBkKyspIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQmVnaW4gc2hhZGVyLlxuICAgICAgICAgICAgICAgICAgICAvLyBDb21wdXRlIHRoZSBmcmFjdGlvbmFsIGluZGV4IG9mIHRoZSBzb3VyY2UuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1ZhbCA9IHhWYWx1ZXNbY29sT2Zmc2V0ICsgZF07XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtvdXRwdXRPZmZzZXQrK10gPSBuZXdWYWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtiYXRjaCwgbmV3SGVpZ2h0LCBuZXdXaWR0aCwgbnVtQ2hhbm5lbHNdLCBpbWFnZXMuZHR5cGUsIG91dHB1dCk7XG59XG5leHBvcnQgY29uc3QgcmVzaXplTmVhcmVzdE5laWdoYm9yQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJlc2l6ZU5lYXJlc3ROZWlnaGJvcixcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogcmVzaXplTmVhcmVzdE5laWdoYm9yXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVzaXplTmVhcmVzdE5laWdoYm9yLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFJlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWQsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiByZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBpbWFnZXMsIGR5IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBhbGlnbkNvcm5lcnMgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoW2R5LCBpbWFnZXNdLCAncmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZCcpO1xuICAgIGNvbnN0IGltYWdlc1N0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGltYWdlcy5zaGFwZSk7XG4gICAgY29uc3QgZHlTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhkeS5zaGFwZSk7XG4gICAgY29uc3QgW2JhdGNoLCB4SGVpZ2h0LCB4V2lkdGgsIGRlcHRoXSA9IGltYWdlcy5zaGFwZTtcbiAgICBjb25zdCBbLCB5SGVpZ2h0LCB5V2lkdGhdID0gZHkuc2hhcGU7XG4gICAgY29uc3Qgb3V0cHV0ID0gbmV3IEZsb2F0MzJBcnJheShiYXRjaCAqIHhIZWlnaHQgKiB4V2lkdGggKiBkZXB0aCk7XG4gICAgY29uc3QgZHlWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGR5LmRhdGFJZCkudmFsdWVzO1xuICAgIC8vIEluIHRoZSBiYWNrd2FyZHMgcGFzcywgd2Ugd2FudCB0byBmaW5kIHRoZSBwaXhlbHMgdGhhdCB3ZXJlIGdlbmVyYXRlZFxuICAgIC8vIGZvciBlYWNoIHBpeGVsIGluIHRoZSBpbnB1dCBpbWFnZSB0aGUgZm9yd2FyZCBwYXNzXG4gICAgY29uc3QgZWZmZWN0aXZlWFNpemUgPSBbXG4gICAgICAgIChhbGlnbkNvcm5lcnMgJiYgeUhlaWdodCA+IDEpID8geEhlaWdodCAtIDEgOiB4SGVpZ2h0LFxuICAgICAgICAoYWxpZ25Db3JuZXJzICYmIHlXaWR0aCA+IDEpID8geFdpZHRoIC0gMSA6IHhXaWR0aFxuICAgIF07XG4gICAgY29uc3QgZWZmZWN0aXZlWVNpemUgPSBbXG4gICAgICAgIChhbGlnbkNvcm5lcnMgJiYgeUhlaWdodCA+IDEpID8geUhlaWdodCAtIDEgOiB5SGVpZ2h0LFxuICAgICAgICAoYWxpZ25Db3JuZXJzICYmIHlXaWR0aCA+IDEpID8geVdpZHRoIC0gMSA6IHlXaWR0aFxuICAgIF07XG4gICAgY29uc3QgaGVpZ2h0U2NhbGUgPSBlZmZlY3RpdmVYU2l6ZVswXSAvIGVmZmVjdGl2ZVlTaXplWzBdO1xuICAgIGNvbnN0IHdpZHRoU2NhbGUgPSBlZmZlY3RpdmVYU2l6ZVsxXSAvIGVmZmVjdGl2ZVlTaXplWzFdO1xuICAgIGNvbnN0IGludkhlaWdodFNjYWxlID0gMSAvIGhlaWdodFNjYWxlO1xuICAgIGNvbnN0IGludldpZHRoU2NhbGUgPSAxIC8gd2lkdGhTY2FsZTtcbiAgICAvLyBUaGlzIGRlZmluZXMgdGhlIHNpemUgb2YgdGhlIHdpbmRvdyBvZiB2YWx1ZXMgYXJvdW5kIGEgcGFydGljdWxhclxuICAgIC8vIGluZGV4IGluIGR5IHRoYXQgd2Ugd2FudCB0byBzZWFyY2ggZm9yIGNvbnRyaWJ1dGlvbnMgdG8gZHguXG4gICAgY29uc3Qgd2luSGVpZ2h0ID0gKE1hdGguY2VpbChpbnZIZWlnaHRTY2FsZSkgKiAyKSArIDI7XG4gICAgY29uc3Qgd2luV2lkdGggPSAoTWF0aC5jZWlsKGludldpZHRoU2NhbGUpICogMikgKyAyO1xuICAgIC8vIExvb3Agb3ZlciB0aGUgb3V0cHV0IHNwYWNlLlxuICAgIGZvciAobGV0IGIgPSAwOyBiIDwgYmF0Y2g7IGIrKykge1xuICAgICAgICBjb25zdCBiYXRjaE9mZnNldCA9IGIgKiBpbWFnZXNTdHJpZGVzWzBdO1xuICAgICAgICBmb3IgKGxldCByID0gMDsgciA8IHhIZWlnaHQ7IHIrKykge1xuICAgICAgICAgICAgY29uc3Qgcm93T2Zmc2V0ID0gYmF0Y2hPZmZzZXQgKyByICogaW1hZ2VzU3RyaWRlc1sxXTtcbiAgICAgICAgICAgIC8vIENvbXB1dGUgYm91bmRzIGZvciB3aGVyZSBpbiBkeSB3ZSB3aWxsIGxvb2tcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0UkxlcnAgPSBNYXRoLmZsb29yKHIgKiBpbnZIZWlnaHRTY2FsZSk7XG4gICAgICAgICAgICBjb25zdCBzdGFydER5UiA9IE1hdGguZmxvb3Ioc3RhcnRSTGVycCAtICh3aW5IZWlnaHQgLyAyKSk7XG4gICAgICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IHhXaWR0aDsgYysrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sT2Zmc2V0ID0gcm93T2Zmc2V0ICsgYyAqIGltYWdlc1N0cmlkZXNbMl07XG4gICAgICAgICAgICAgICAgLy8gQ29tcHV0ZSBib3VuZHMgZm9yIHdoZXJlIGluIGR5IHdlIHdpbGwgbG9va1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0Q0xlcnAgPSBNYXRoLmZsb29yKGMgKiBpbnZXaWR0aFNjYWxlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydER5QyA9IE1hdGguZmxvb3Ioc3RhcnRDTGVycCAtICh3aW5XaWR0aCAvIDIpKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBkID0gMDsgZCA8IGRlcHRoOyBkKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFjY3VtID0gMDtcbiAgICAgICAgICAgICAgICAgICAgLy8gbG9vcCBvdmVyIGR5XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGR5UkluZGV4ID0gMDsgZHlSSW5kZXggPCB3aW5IZWlnaHQ7IGR5UkluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGR5UiA9IGR5UkluZGV4ICsgc3RhcnREeVI7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBHdWFyZCBhZ2FpbnN0IHRoZSB3aW5kb3cgZXhjZWVkaW5nIHRoZSBib3VuZHMgb2YgZHlcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkeVIgPCAwIHx8IGR5UiA+PSB5SGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkeVJPZmZzZXQgPSBiYXRjaE9mZnNldCArIGR5UiAqIGR5U3RyaWRlc1sxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUZyYWNSb3cgPSBkeVIgKiBoZWlnaHRTY2FsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZU5lYXJlc3RSb3cgPSBNYXRoLm1pbih4SGVpZ2h0IC0gMSwgYWxpZ25Db3JuZXJzID8gTWF0aC5yb3VuZChzb3VyY2VGcmFjUm93KSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihzb3VyY2VGcmFjUm93KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAociAhPT0gc291cmNlTmVhcmVzdFJvdykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgZHlDSW5kZXggPSAwOyBkeUNJbmRleCA8IHdpbldpZHRoOyBkeUNJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHlDID0gZHlDSW5kZXggKyBzdGFydER5QztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHdWFyZCBhZ2FpbnN0IHRoZSB3aW5kb3cgZXhjZWVkaW5nIHRoZSBib3VuZHMgb2YgZHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHlDIDwgMCB8fCBkeUMgPj0geVdpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkeUNPZmZzZXQgPSBkeVJPZmZzZXQgKyBkeUMgKiBkeVN0cmlkZXNbMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291cmNlRnJhY0NvbCA9IGR5QyAqIHdpZHRoU2NhbGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291cmNlTmVhcmVzdENvbCA9IE1hdGgubWluKHhXaWR0aCAtIDEsIGFsaWduQ29ybmVycyA/IE1hdGgucm91bmQoc291cmNlRnJhY0NvbCkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLmZsb29yKHNvdXJjZUZyYWNDb2wpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PT0gc291cmNlTmVhcmVzdENvbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2N1bSArPSBkeVZhbHVlc1tkeUNPZmZzZXQgKyBkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W2NvbE9mZnNldCArIGRdID0gYWNjdW07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGltYWdlcy5zaGFwZSwgaW1hZ2VzLmR0eXBlLCBvdXRwdXQpO1xufVxuZXhwb3J0IGNvbnN0IHJlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogcmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUmV2ZXJzZSwgVGVuc29yQnVmZmVyLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyBpZGVudGl0eSB9IGZyb20gJy4vSWRlbnRpdHknO1xuZXhwb3J0IGZ1bmN0aW9uIHJldmVyc2UoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGRpbXMgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ3JldmVyc2UnKTtcbiAgICBjb25zdCB4UmFuayA9IHguc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0ICRkaW1zID0gdXRpbC5wYXJzZUF4aXNQYXJhbShkaW1zLCB4LnNoYXBlKTtcbiAgICBpZiAoeFJhbmsgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGlkZW50aXR5KHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCB9KTtcbiAgICB9XG4gICAgY29uc3Qgb3V0QnVmID0gbmV3IFRlbnNvckJ1ZmZlcih4LnNoYXBlLCB4LmR0eXBlKTtcbiAgICBjb25zdCB4QnVmID0gYmFja2VuZC5idWZmZXJTeW5jKHgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0QnVmLnNpemU7IGkrKykge1xuICAgICAgICBjb25zdCBvdXRMb2MgPSBvdXRCdWYuaW5kZXhUb0xvYyhpKTtcbiAgICAgICAgY29uc3QgaW5Mb2MgPSBvdXRMb2Muc2xpY2UoKTtcbiAgICAgICAgJGRpbXMuZm9yRWFjaChkID0+IGluTG9jW2RdID0geC5zaGFwZVtkXSAtIDEgLSBpbkxvY1tkXSk7XG4gICAgICAgIG91dEJ1Zi5zZXQoeEJ1Zi5nZXQoLi4uaW5Mb2MpLCAuLi5vdXRMb2MpO1xuICAgIH1cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRCdWYuc2hhcGUsIG91dEJ1Zi5kdHlwZSwgb3V0QnVmLnZhbHVlcyk7XG59XG5leHBvcnQgY29uc3QgcmV2ZXJzZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBSZXZlcnNlLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiByZXZlcnNlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmV2ZXJzZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIFJvdGF0ZVdpdGhPZmZzZXQsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGNvbnN0IHJvdGF0ZVdpdGhPZmZzZXRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUm90YXRlV2l0aE9mZnNldCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogKHsgaW5wdXRzLCBhdHRycywgYmFja2VuZCB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgaW1hZ2UgfSA9IGlucHV0cztcbiAgICAgICAgY29uc3QgeyByYWRpYW5zLCBmaWxsVmFsdWUsIGNlbnRlciB9ID0gYXR0cnM7XG4gICAgICAgIGNvbnN0IGNwdUJhY2tlbmQgPSBiYWNrZW5kO1xuICAgICAgICBjb25zdCBvdXRwdXQgPSB1dGlsLmdldFR5cGVkQXJyYXlGcm9tRFR5cGUoaW1hZ2UuZHR5cGUsIHV0aWwuc2l6ZUZyb21TaGFwZShpbWFnZS5zaGFwZSkpO1xuICAgICAgICBjb25zdCBbYmF0Y2gsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBudW1DaGFubmVsc10gPSBpbWFnZS5zaGFwZTtcbiAgICAgICAgY29uc3QgW2NlbnRlclgsIGNlbnRlclldID0gYmFja2VuZF91dGlsLmdldEltYWdlQ2VudGVyKGNlbnRlciwgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgpO1xuICAgICAgICBjb25zdCBmdWxsT3BhY2l0eVZhbHVlID0gMjU1O1xuICAgICAgICBjb25zdCBzaW5GYWN0b3IgPSBNYXRoLnNpbihyYWRpYW5zKTtcbiAgICAgICAgY29uc3QgY29zRmFjdG9yID0gTWF0aC5jb3MocmFkaWFucyk7XG4gICAgICAgIGNvbnN0IGltYWdlVmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoaW1hZ2UuZGF0YUlkKS52YWx1ZXM7XG4gICAgICAgIGZvciAobGV0IGJhdGNoSWR4ID0gMDsgYmF0Y2hJZHggPCBiYXRjaDsgYmF0Y2hJZHgrKykge1xuICAgICAgICAgICAgY29uc3QgYmF0Y2hPZmZzZXQgPSBiYXRjaElkeCAqIGltYWdlV2lkdGggKiBpbWFnZUhlaWdodCAqIG51bUNoYW5uZWxzO1xuICAgICAgICAgICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgaW1hZ2VIZWlnaHQ7IHJvdysrKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93T2Zmc2V0ID0gcm93ICogKGltYWdlV2lkdGggKiBudW1DaGFubmVscyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgaW1hZ2VXaWR0aDsgY29sKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29sT2Zmc2V0ID0gY29sICogbnVtQ2hhbm5lbHM7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgbnVtQ2hhbm5lbHM7IGNoYW5uZWwrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29vcmRzID0gW2JhdGNoLCByb3csIGNvbCwgY2hhbm5lbF07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4ID0gY29vcmRzWzJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeSA9IGNvb3Jkc1sxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvb3JkWC9jb29yZFkgYXJlIHRoZSByZXN1bHQgb2Ygcm90YXRpbmcgYW5kIHRyYW5zbGF0aW5nIHgveS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb29yZFggPSAoeCAtIGNlbnRlclgpICogY29zRmFjdG9yIC0gKHkgLSBjZW50ZXJZKSAqIHNpbkZhY3RvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb29yZFkgPSAoeCAtIGNlbnRlclgpICogc2luRmFjdG9yICsgKHkgLSBjZW50ZXJZKSAqIGNvc0ZhY3RvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkWCA9IE1hdGgucm91bmQoY29vcmRYICsgY2VudGVyWCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb29yZFkgPSBNYXRoLnJvdW5kKGNvb3JkWSArIGNlbnRlclkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG91dHB1dFZhbHVlID0gZmlsbFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmaWxsVmFsdWUgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5uZWwgPT09IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VmFsdWUgPSBmdWxsT3BhY2l0eVZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VmFsdWUgPSBmaWxsVmFsdWVbY2hhbm5lbF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGNvb3JkaW5hdGUgcG9zaXRpb24gZmFsbHMgd2l0aGluIHRoZSBpbWFnZSBib3VuZGFyaWVzLi4uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29vcmRYID49IDAgJiYgY29vcmRYIDwgaW1hZ2VXaWR0aCAmJiBjb29yZFkgPj0gMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkWSA8IGltYWdlSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRoZSBvdXRwdXQgdG8gdGhlIGltYWdlIHZhbHVlIGF0IHRoZSBjb29yZGluYXRlIHBvc2l0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvdGF0ZWRSb3dPZmZzZXQgPSBjb29yZFkgKiAoaW1hZ2VXaWR0aCAqIG51bUNoYW5uZWxzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByb3RhdGVkQ29sT2Zmc2V0ID0gY29vcmRYICogbnVtQ2hhbm5lbHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW1hZ2VJZHggPSBiYXRjaE9mZnNldCArIHJvdGF0ZWRSb3dPZmZzZXQgKyByb3RhdGVkQ29sT2Zmc2V0ICsgY2hhbm5lbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRWYWx1ZSA9IGltYWdlVmFsc1tpbWFnZUlkeF07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvdXRJZHggPSBiYXRjaE9mZnNldCArIHJvd09mZnNldCArIGNvbE9mZnNldCArIGNoYW5uZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbb3V0SWR4XSA9IG91dHB1dFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGFJZCA9IGNwdUJhY2tlbmQud3JpdGUob3V0cHV0LCBpbWFnZS5zaGFwZSwgaW1hZ2UuZHR5cGUpO1xuICAgICAgICByZXR1cm4geyBkYXRhSWQsIHNoYXBlOiBpbWFnZS5zaGFwZSwgZHR5cGU6IGltYWdlLmR0eXBlIH07XG4gICAgfVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJvdGF0ZVdpdGhPZmZzZXQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFJvdW5kIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCByb3VuZCA9IHVuYXJ5S2VybmVsRnVuYyhSb3VuZCwgKHhpKSA9PiB7XG4gICAgLy8gVGhlIGFsZ29yaXRobSBpcyBiYXNlZCBvbiBiYW5rZXIncyByb3VuZGluZy5cbiAgICBjb25zdCBiYXNlID0gTWF0aC5mbG9vcih4aSk7XG4gICAgaWYgKHhpIC0gYmFzZSA8IDAuNSkge1xuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcih4aSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHhpIC0gYmFzZSA+IDAuNSkge1xuICAgICAgICByZXR1cm4gTWF0aC5jZWlsKHhpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmIChiYXNlICUgMi4wID09PSAwLjApIHtcbiAgICAgICAgICAgIHJldHVybiBiYXNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGJhc2UgKyAxLjA7XG4gICAgICAgIH1cbiAgICB9XG59KTtcbmV4cG9ydCBjb25zdCByb3VuZENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBSb3VuZCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogcm91bmQsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Um91bmQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFJzcXJ0IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVNpbXBsZVVuYXJ5SW1wbCB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X2ltcGwnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jRnJvbUltcGwgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgcnNxcnRJbXBsID0gY3JlYXRlU2ltcGxlVW5hcnlJbXBsKCh4aSkgPT4gMSAvIE1hdGguc3FydCh4aSkpO1xuZXhwb3J0IGNvbnN0IHJzcXJ0ID0gdW5hcnlLZXJuZWxGdW5jRnJvbUltcGwoUnNxcnQsIHJzcXJ0SW1wbCk7XG5leHBvcnQgY29uc3QgcnNxcnRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUnNxcnQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHJzcXJ0LFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJzcXJ0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgU2NhdHRlck5kIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHNjYXR0ZXJJbXBsIH0gZnJvbSAnLi9TY2F0dGVyX2ltcGwnO1xuZXhwb3J0IGZ1bmN0aW9uIHNjYXR0ZXJOZChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW5kaWNlcywgdXBkYXRlcyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgc2hhcGUgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHsgc2xpY2VSYW5rLCBudW1VcGRhdGVzLCBzbGljZVNpemUsIHN0cmlkZXMsIG91dHB1dFNpemUgfSA9IGJhY2tlbmRfdXRpbC5jYWxjdWxhdGVTaGFwZXModXBkYXRlcywgaW5kaWNlcywgc2hhcGUpO1xuICAgIGNvbnN0IHN1bUR1cGVJbmRpY2VzID0gdHJ1ZTtcbiAgICBjb25zdCBpbmRpY2VzQnVmID0gYmFja2VuZC5idWZmZXJTeW5jKGluZGljZXMpO1xuICAgIGNvbnN0IHVwZGF0ZXNCdWYgPSBiYWNrZW5kLmJ1ZmZlclN5bmModXBkYXRlcyk7XG4gICAgY29uc3Qgb3V0QnVmID0gc2NhdHRlckltcGwoaW5kaWNlc0J1ZiwgdXBkYXRlc0J1Ziwgc2hhcGUsIG91dHB1dFNpemUsIHNsaWNlU2l6ZSwgbnVtVXBkYXRlcywgc2xpY2VSYW5rLCBzdHJpZGVzLCAwIC8qIGRlZmF1bHRWYWx1ZSAqLywgc3VtRHVwZUluZGljZXMpO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHNoYXBlLCBvdXRCdWYuZHR5cGUsIG91dEJ1Zi52YWx1ZXMpO1xufVxuZXhwb3J0IGNvbnN0IHNjYXR0ZXJOZENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTY2F0dGVyTmQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHNjYXR0ZXJOZFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNjYXR0ZXJOZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBidWZmZXIgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIHNjYXR0ZXJJbXBsKGluZGljZXMsIHVwZGF0ZXMsIHNoYXBlLCBvdXRwdXRTaXplLCBzbGljZVNpemUsIG51bVVwZGF0ZXMsIHNsaWNlUmFuaywgc3RyaWRlcywgZGVmYXVsdFZhbHVlLCBzdW1EdXBlSW5kaWNlcykge1xuICAgIGNvbnN0IGZsYXR0ZW5TaGFwZSA9IFtvdXRwdXRTaXplIC8gc2xpY2VTaXplLCBzbGljZVNpemVdO1xuICAgIGNvbnN0IGluZGljZXNEYXRhID0gaW5kaWNlcy52YWx1ZXM7XG4gICAgY29uc3QgdXBkYXRlc0RhdGEgPSB1cGRhdGVzLnZhbHVlcztcbiAgICBpZiAob3V0cHV0U2l6ZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gYnVmZmVyKHNoYXBlLCB1cGRhdGVzLmR0eXBlKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0QnVmID0gYnVmZmVyKGZsYXR0ZW5TaGFwZSwgdXBkYXRlcy5kdHlwZSk7XG4gICAgb3V0QnVmLnZhbHVlcy5maWxsKGRlZmF1bHRWYWx1ZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1VcGRhdGVzOyBpKyspIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBbXTtcbiAgICAgICAgbGV0IGZsYXR0ZW5JbmRleCA9IDA7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc2xpY2VSYW5rOyBqKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGRpbSA9IGluZGljZXNEYXRhW2kgKiBzbGljZVJhbmsgKyBqXTtcbiAgICAgICAgICAgIGluZGV4LnB1c2goZGltKTtcbiAgICAgICAgICAgIGZsYXR0ZW5JbmRleCArPSBkaW0gKiBzdHJpZGVzW2pdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmbGF0dGVuSW5kZXggPCAwIHx8IGZsYXR0ZW5JbmRleCA+PSBvdXRwdXRTaXplIC8gc2xpY2VTaXplKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaW5kaWNlczogJHtpbmRleH0gZG9lcyBub3QgaW5kZXggaW50byAke3NoYXBlfWApO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgc2xpY2VTaXplOyBrKyspIHtcbiAgICAgICAgICAgIGlmIChzdW1EdXBlSW5kaWNlcykge1xuICAgICAgICAgICAgICAgIG91dEJ1Zi52YWx1ZXNbZmxhdHRlbkluZGV4ICogc2xpY2VTaXplICsga10gKz1cbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlc0RhdGFbaSAqIHNsaWNlU2l6ZSArIGtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgb3V0QnVmLnZhbHVlc1tmbGF0dGVuSW5kZXggKiBzbGljZVNpemUgKyBrXSA9IHVwZGF0ZXMucmFuayA9PT0gMCA/XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZXNEYXRhWzBdIDpcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlc0RhdGFbaSAqIHNsaWNlU2l6ZSArIGtdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXRCdWY7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TY2F0dGVyX2ltcGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU2VsZWN0LCB1cGNhc3RUeXBlLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IGNvbmRpdGlvbiwgdCwgZSB9ID0gaW5wdXRzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoW2NvbmRpdGlvbiwgdCwgZV0sICdzZWxlY3QnKTtcbiAgICBjb25zdCBjb25kaXRpb25SYW5rID0gY29uZGl0aW9uLnNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCB2YWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGNvbmRpdGlvbi5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCB0VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldCh0LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IGVWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGUuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgcmVzdWx0RHR5cGUgPSB1cGNhc3RUeXBlKHQuZHR5cGUsIGUuZHR5cGUpO1xuICAgIGNvbnN0IG5ld1ZhbHVlcyA9IHV0aWwubWFrZVplcm9zVHlwZWRBcnJheSh1dGlsLnNpemVGcm9tU2hhcGUodC5zaGFwZSksIHJlc3VsdER0eXBlKTtcbiAgICBsZXQgaW5kZXggPSAwO1xuICAgIGNvbnN0IG9mZnNldCA9IGNvbmRpdGlvblJhbmsgPT09IDAgfHwgY29uZGl0aW9uUmFuayA+IDEgfHwgdC5zaGFwZS5sZW5ndGggPT09IDEgP1xuICAgICAgICAxIDpcbiAgICAgICAgdXRpbC5zaXplRnJvbVNoYXBlKHQuc2hhcGUuc2xpY2UoMSkpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgb2Zmc2V0OyBqKyspIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZXNbaV0gPT09IDEpIHtcbiAgICAgICAgICAgICAgICBuZXdWYWx1ZXNbaW5kZXgrK10gPSB0VmFsdWVzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV3VmFsdWVzW2luZGV4KytdID0gZVZhbHVlc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyh0LnNoYXBlLCByZXN1bHREdHlwZSwgbmV3VmFsdWVzKTtcbn1cbmV4cG9ydCBjb25zdCBzZWxlY3RDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU2VsZWN0LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBzZWxlY3Rcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TZWxlY3QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgU2VsdSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5jb25zdCBzY2FsZUFscGhhID0gYmFja2VuZF91dGlsLlNFTFVfU0NBTEVBTFBIQTtcbmNvbnN0IHNjYWxlID0gYmFja2VuZF91dGlsLlNFTFVfU0NBTEU7XG5leHBvcnQgY29uc3Qgc2VsdSA9IHVuYXJ5S2VybmVsRnVuYyhTZWx1LCAoeGkpID0+IHtcbiAgICBpZiAoeGkgPj0gMCkge1xuICAgICAgICByZXR1cm4gc2NhbGUgKiB4aTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBzY2FsZUFscGhhICogKE1hdGguZXhwKHhpKSAtIDEpO1xuICAgIH1cbn0pO1xuZXhwb3J0IGNvbnN0IHNlbHVDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU2VsdSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogc2VsdSxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TZWx1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTaWdtb2lkIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBzaWdtb2lkID0gdW5hcnlLZXJuZWxGdW5jKFNpZ21vaWQsICh4aSkgPT4gMSAvICgxICsgTWF0aC5leHAoLXhpKSkpO1xuZXhwb3J0IGNvbnN0IHNpZ21vaWRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU2lnbW9pZCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogc2lnbW9pZCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TaWdtb2lkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTaWduIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBzaWduID0gdW5hcnlLZXJuZWxGdW5jKFNpZ24sICh4aSkgPT4ge1xuICAgIGlmICh4aSA8IDApIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgICBlbHNlIGlmICh4aSA+IDApIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG59KTtcbmV4cG9ydCBjb25zdCBzaWduQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNpZ24sXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHNpZ24sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2lnbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU2luIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBzaW4gPSB1bmFyeUtlcm5lbEZ1bmMoU2luLCAoeGkpID0+IE1hdGguc2luKHhpKSk7XG5leHBvcnQgY29uc3Qgc2luQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNpbixcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogc2luLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNpbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU2luaCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3Qgc2luaCA9IHVuYXJ5S2VybmVsRnVuYyhTaW5oLCAoeGkpID0+IE1hdGguc2luaCh4aSkpO1xuZXhwb3J0IGNvbnN0IHNpbmhDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU2luaCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogc2luaCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TaW5oLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgYnVmZmVyLCBTbGljZSwgc2xpY2VfdXRpbCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIHNsaWNlSW1wbCh2YWxzLCBiZWdpbiwgc2l6ZSwgc2hhcGUsIGR0eXBlKSB7XG4gICAgY29uc3QgaXNDb250aW5vdXMgPSBzbGljZV91dGlsLmlzU2xpY2VDb250aW5vdXMoc2hhcGUsIGJlZ2luLCBzaXplKTtcbiAgICBjb25zdCBsZW5ndGggPSB1dGlsLnNpemVGcm9tU2hhcGUoc2l6ZSk7XG4gICAgY29uc3QgeFN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKHNoYXBlKTtcbiAgICBpZiAoaXNDb250aW5vdXMpIHtcbiAgICAgICAgY29uc3QgZmxhdE9mZnNldCA9IHNsaWNlX3V0aWwuY29tcHV0ZUZsYXRPZmZzZXQoYmVnaW4sIHhTdHJpZGVzKTtcbiAgICAgICAgaWYgKGR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHMuc2xpY2UoZmxhdE9mZnNldCwgZmxhdE9mZnNldCArIGxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHMuc3ViYXJyYXkoZmxhdE9mZnNldCwgZmxhdE9mZnNldCArIGxlbmd0aCk7XG4gICAgfVxuICAgIGNvbnN0IGRlY29kZWREYXRhID0gZHR5cGUgPT09ICdzdHJpbmcnID9cbiAgICAgICAgYmFja2VuZF91dGlsLmZyb21VaW50OFRvU3RyaW5nQXJyYXkodmFscykgOlxuICAgICAgICB2YWxzO1xuICAgIGNvbnN0IGluQnVmID0gYnVmZmVyKHNoYXBlLCBkdHlwZSwgZGVjb2RlZERhdGEpO1xuICAgIGNvbnN0IG91dEJ1ZiA9IGJ1ZmZlcihzaXplLCBkdHlwZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRCdWYuc2l6ZTsgKytpKSB7XG4gICAgICAgIGNvbnN0IG91dExvYyA9IG91dEJ1Zi5pbmRleFRvTG9jKGkpO1xuICAgICAgICBjb25zdCBpbkxvYyA9IG91dExvYy5tYXAoKGlkeCwgaikgPT4gaWR4ICsgYmVnaW5bal0pO1xuICAgICAgICBvdXRCdWYuc2V0KGluQnVmLmdldCguLi5pbkxvYyksIC4uLm91dExvYyk7XG4gICAgfVxuICAgIGlmIChkdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGJhY2tlbmRfdXRpbC5mcm9tU3RyaW5nQXJyYXlUb1VpbnQ4KG91dEJ1Zi52YWx1ZXMpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0QnVmLnZhbHVlcztcbn1cbmV4cG9ydCBmdW5jdGlvbiBzbGljZShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYmVnaW4sIHNpemUgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ3NsaWNlJyk7XG4gICAgY29uc3QgWyRiZWdpbiwgJHNpemVdID0gc2xpY2VfdXRpbC5wYXJzZVNsaWNlUGFyYW1zKHgsIGJlZ2luLCBzaXplKTtcbiAgICBzbGljZV91dGlsLmFzc2VydFBhcmFtc1ZhbGlkKHgsICRiZWdpbiwgJHNpemUpO1xuICAgIGNvbnN0IHZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3Qgb3V0VmFscyA9IHNsaWNlSW1wbCh2YWxzLCAkYmVnaW4sICRzaXplLCB4LnNoYXBlLCB4LmR0eXBlKTtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbygkc2l6ZSwgeC5kdHlwZSwgb3V0VmFscyk7XG59XG5leHBvcnQgY29uc3Qgc2xpY2VDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU2xpY2UsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHNsaWNlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2xpY2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBTb2Z0bWF4LCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGV4cCB9IGZyb20gJy4vRXhwJztcbmltcG9ydCB7IG1heCB9IGZyb20gJy4vTWF4JztcbmltcG9ydCB7IGRpdiB9IGZyb20gJy4vUmVhbERpdic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7IHN1YiB9IGZyb20gJy4vU3ViJztcbmltcG9ydCB7IHN1bSB9IGZyb20gJy4vU3VtJztcbmV4cG9ydCBmdW5jdGlvbiBzb2Z0bWF4KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBsb2dpdHMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGRpbSB9ID0gYXR0cnM7XG4gICAgY29uc3QgbG9naXRzUmFuayA9IGxvZ2l0cy5zaGFwZS5sZW5ndGg7XG4gICAgbGV0ICRkaW0gPSBkaW07XG4gICAgaWYgKCRkaW0gPT09IC0xKSB7XG4gICAgICAgICRkaW0gPSBsb2dpdHNSYW5rIC0gMTtcbiAgICB9XG4gICAgaWYgKCRkaW0gIT09IGxvZ2l0c1JhbmsgLSAxKSB7XG4gICAgICAgIHRocm93IEVycm9yKCdTb2Z0bWF4IGFsb25nIGEgbm9uLWxhc3QgZGltZW5zaW9uIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiAnICtcbiAgICAgICAgICAgIGBMb2dpdHMgd2FzIHJhbmsgJHtsb2dpdHNSYW5rfSBhbmQgZGltIHdhcyAkeyRkaW19YCk7XG4gICAgfVxuICAgIGNvbnN0IGF4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKFskZGltXSwgbG9naXRzLnNoYXBlKTtcbiAgICBjb25zdCBtYXhMb2dpdCA9IG1heCh7XG4gICAgICAgIGlucHV0czogeyB4OiBsb2dpdHMgfSxcbiAgICAgICAgYmFja2VuZCxcbiAgICAgICAgYXR0cnM6IHsgcmVkdWN0aW9uSW5kaWNlczogYXhlcywga2VlcERpbXM6IGZhbHNlIH1cbiAgICB9KTtcbiAgICBjb25zdCBleHBhbmRlZFNoYXBlID0gYmFja2VuZF91dGlsLmV4cGFuZFNoYXBlVG9LZWVwRGltKG1heExvZ2l0LnNoYXBlLCBheGVzKTtcbiAgICBjb25zdCBtYXhMb2dpdFJlc2hhcGVkID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiBtYXhMb2dpdCB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogZXhwYW5kZWRTaGFwZSB9IH0pO1xuICAgIGNvbnN0IGEgPSBzdWIoeyBpbnB1dHM6IHsgYTogbG9naXRzLCBiOiBtYXhMb2dpdFJlc2hhcGVkIH0sIGJhY2tlbmQgfSk7XG4gICAgY29uc3QgYiA9IGV4cCh7IGlucHV0czogeyB4OiBhIH0sIGJhY2tlbmQgfSk7XG4gICAgY29uc3Qgc3VtRXhwID0gc3VtKHsgaW5wdXRzOiB7IHg6IGIgfSwgYmFja2VuZCwgYXR0cnM6IHsgYXhpczogYXhlcywga2VlcERpbXM6IGZhbHNlIH0gfSk7XG4gICAgY29uc3Qgc3VtUmVzaGFwZWQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHN1bUV4cCB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogZXhwYW5kZWRTaGFwZSB9IH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGRpdih7IGlucHV0czogeyBhOiBiLCBiOiBzdW1SZXNoYXBlZCB9LCBiYWNrZW5kIH0pO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8obWF4TG9naXQpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8obWF4TG9naXRSZXNoYXBlZCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhhKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGIpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oc3VtRXhwKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHN1bVJlc2hhcGVkKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGNvbnN0IHNvZnRtYXhDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU29mdG1heCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogc29mdG1heFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNvZnRtYXguanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFNvZnRwbHVzIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbi8vIG1pcnJvcnMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRmLm5uLnNvZnRwbHVzOiBodHRwczovL2dvby5nbC92a2N2d1hcbi8vIGVwc2lsb24gaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAxLjAgYW5kIHRoZSBuZXh0IHJlcHJlc2VudGFibGUgZmxvYXQuXG4vLyBGb3IgYSBzaW5nbGUgcHJlY2lzaW9uIDMyIGJpdCBmbG9hdCB0aGlzIHNob3VsZCBiZSAyXi0yMywgc2VlOlxuLy8gaHR0cHM6Ly9tYXRoLmJ5dS5lZHUvfnNjaG93L3dvcmsvSUVFRUZsb2F0aW5nUG9pbnQuaHRtXG5jb25zdCBlcHNpbG9uID0gMS4xOTIwOTI4OTU1MDc4MTI1ZS03O1xuY29uc3QgdGhyZXNob2xkID0gTWF0aC5sb2coZXBzaWxvbikgKyAyLjA7XG5leHBvcnQgY29uc3Qgc29mdHBsdXMgPSB1bmFyeUtlcm5lbEZ1bmMoU29mdHBsdXMsICh4aSkgPT4ge1xuICAgIC8vIFZhbHVlIGFib3ZlIHdoaWNoIGV4cCh4KSBtYXkgb3ZlcmZsb3csIGJ1dCBzb2Z0cGx1cyh4KSA9PSB4XG4gICAgLy8gaXMgd2l0aGluIG1hY2hpbmUgZXBzaWxvbi5cbiAgICBjb25zdCB0b29MYXJnZSA9IHhpID4gLXRocmVzaG9sZDtcbiAgICAvLyBWYWx1ZSBiZWxvdyB3aGljaCBleHAoeCkgbWF5IHVuZGVyZmxvdywgYnV0IHNvZnRwbHVzKHgpID09IGV4cCh4KVxuICAgIC8vIGlzIHdpdGhpbiBtYWNoaW5lIGVwc2lsb24uXG4gICAgY29uc3QgdG9vU21hbGwgPSB4aSA8IHRocmVzaG9sZDtcbiAgICBjb25zdCBleHBYID0gTWF0aC5leHAoeGkpO1xuICAgIGxldCByZXN1bHQ7XG4gICAgaWYgKHRvb1NtYWxsKSB7XG4gICAgICAgIHJlc3VsdCA9IGV4cFg7XG4gICAgfVxuICAgIGVsc2UgaWYgKHRvb0xhcmdlKSB7XG4gICAgICAgIHJlc3VsdCA9IHhpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gTWF0aC5sb2coMS4wICsgZXhwWCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59KTtcbmV4cG9ydCBjb25zdCBzb2Z0cGx1c0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTb2Z0cGx1cyxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogc29mdHBsdXMsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U29mdHBsdXMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBTcGFjZVRvQmF0Y2hORCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHsgcGFkVjJDb25maWcgfSBmcm9tICcuL1BhZFYyJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHsgdHJhbnNwb3NlIH0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuZXhwb3J0IGZ1bmN0aW9uIHNwYWNlVG9CYXRjaE5EKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBibG9ja1NoYXBlLCBwYWRkaW5ncyB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChbeF0sICdzcGFjZVRvQmF0Y2hORCcpO1xuICAgIGNvbnN0IHByb2QgPSB1dGlsLnNpemVGcm9tU2hhcGUoYmxvY2tTaGFwZSk7XG4gICAgY29uc3QgY29tcGxldGVQYWRkaW5ncyA9IFtbMCwgMF1dO1xuICAgIGNvbXBsZXRlUGFkZGluZ3MucHVzaCguLi5wYWRkaW5ncyk7XG4gICAgZm9yIChsZXQgaSA9IDEgKyBibG9ja1NoYXBlLmxlbmd0aDsgaSA8IHguc2hhcGUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29tcGxldGVQYWRkaW5ncy5wdXNoKFswLCAwXSk7XG4gICAgfVxuICAgIGNvbnN0IHBhZGRlZFggPSBwYWRWMkNvbmZpZy5rZXJuZWxGdW5jKHtcbiAgICAgICAgaW5wdXRzOiB7IHggfSxcbiAgICAgICAgYmFja2VuZCxcbiAgICAgICAgYXR0cnM6IHsgcGFkZGluZ3M6IGNvbXBsZXRlUGFkZGluZ3MsIGNvbnN0YW50VmFsdWU6IDAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHJlc2hhcGVkUGFkZGVkU2hhcGUgPSBiYWNrZW5kX3V0aWwuZ2V0UmVzaGFwZWQocGFkZGVkWC5zaGFwZSwgYmxvY2tTaGFwZSwgcHJvZCwgZmFsc2UpO1xuICAgIGNvbnN0IHBlcm11dGVkUmVzaGFwZWRQYWRkZWRQZXJtdXRhdGlvbiA9IGJhY2tlbmRfdXRpbC5nZXRQZXJtdXRlZChyZXNoYXBlZFBhZGRlZFNoYXBlLmxlbmd0aCwgYmxvY2tTaGFwZS5sZW5ndGgsIGZhbHNlKTtcbiAgICBjb25zdCBmbGF0dGVuU2hhcGUgPSBiYWNrZW5kX3V0aWwuZ2V0UmVzaGFwZWRQZXJtdXRlZChwYWRkZWRYLnNoYXBlLCBibG9ja1NoYXBlLCBwcm9kLCBmYWxzZSk7XG4gICAgY29uc3QgcmVzaGFwZUlucHV0cyA9IHsgeDogcGFkZGVkWCB9O1xuICAgIGNvbnN0IHJlc2hhcGVBdHRycyA9IHsgc2hhcGU6IHJlc2hhcGVkUGFkZGVkU2hhcGUgfTtcbiAgICBjb25zdCBwYWRkZWRYUmVzaGFwZWQgPSByZXNoYXBlKHsgaW5wdXRzOiByZXNoYXBlSW5wdXRzLCBiYWNrZW5kLCBhdHRyczogcmVzaGFwZUF0dHJzIH0pO1xuICAgIGNvbnN0IHRyYW5zcG9zZUlucHV0cyA9IHsgeDogcGFkZGVkWFJlc2hhcGVkIH07XG4gICAgY29uc3QgdHJhbnNwb3NlQXR0cnMgPSB7IHBlcm06IHBlcm11dGVkUmVzaGFwZWRQYWRkZWRQZXJtdXRhdGlvbiB9O1xuICAgIGNvbnN0IHBhZGRlZFhUID0gdHJhbnNwb3NlKHsgaW5wdXRzOiB0cmFuc3Bvc2VJbnB1dHMsIGJhY2tlbmQsIGF0dHJzOiB0cmFuc3Bvc2VBdHRycyB9KTtcbiAgICBjb25zdCByZXN1bHRSZXNoYXBlSW5wdXRzID0geyB4OiBwYWRkZWRYVCB9O1xuICAgIGNvbnN0IHJlc3VsdFJlc2hhcGVBdHRycyA9IHsgc2hhcGU6IGZsYXR0ZW5TaGFwZSB9O1xuICAgIGNvbnN0IHJlc3VsdCA9IHJlc2hhcGUoeyBpbnB1dHM6IHJlc3VsdFJlc2hhcGVJbnB1dHMsIGJhY2tlbmQsIGF0dHJzOiByZXN1bHRSZXNoYXBlQXR0cnMgfSk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhwYWRkZWRYKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHBhZGRlZFhSZXNoYXBlZCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhwYWRkZWRYVCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBjb25zdCBzcGFjZVRvQmF0Y2hORENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTcGFjZVRvQmF0Y2hORCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogc3BhY2VUb0JhdGNoTkRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TcGFjZVRvQmF0Y2hORC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTcGFyc2VGaWxsRW1wdHlSb3dzIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHNwYXJzZUZpbGxFbXB0eVJvd3NJbXBsIH0gZnJvbSAnLi9TcGFyc2VGaWxsRW1wdHlSb3dzX2ltcGwnO1xuZXhwb3J0IGZ1bmN0aW9uIHNwYXJzZUZpbGxFbXB0eVJvd3MoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW5kaWNlcywgdmFsdWVzLCBkZW5zZVNoYXBlLCBkZWZhdWx0VmFsdWUgfSA9IGlucHV0cztcbiAgICBpZiAoZGVuc2VTaGFwZS5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEZW5zZSBzaGFwZSBtdXN0IGJlIGEgdmVjdG9yLCBzYXc6XG4gICAgICAgICR7ZGVuc2VTaGFwZS5zaGFwZX1gKTtcbiAgICB9XG4gICAgaWYgKGluZGljZXMuc2hhcGUubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW5kaWNlcyBtdXN0IGJlIGEgbWF0cml4LCBzYXc6XG4gICAgICAgICR7aW5kaWNlcy5zaGFwZX1gKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlcy5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBWYWx1ZXMgbXVzdCBiZSBhIHZlY3Rvciwgc2F3OlxuICAgICAgICAke3ZhbHVlcy5zaGFwZX1gKTtcbiAgICB9XG4gICAgaWYgKGRlZmF1bHRWYWx1ZS5zaGFwZS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEZWZhdWx0IHZhbHVlIG11c3QgYmUgYSBzY2FsYXIsIHNhdzpcbiAgICAgICAgJHtkZWZhdWx0VmFsdWUuc2hhcGV9YCk7XG4gICAgfVxuICAgIGNvbnN0ICRpbmRpY2VzID0gYmFja2VuZC5kYXRhLmdldChpbmRpY2VzLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0ICR2YWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KHZhbHVlcy5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCAkZGVuc2VTaGFwZSA9IGJhY2tlbmQuZGF0YS5nZXQoZGVuc2VTaGFwZS5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCAkZGVmYXVsdFZhbHVlID0gYmFja2VuZC5kYXRhLmdldChkZWZhdWx0VmFsdWUuZGF0YUlkKS52YWx1ZXNbMF07XG4gICAgY29uc3QgW291dHB1dEluZGljZXMsIG91dHB1dEluZGljZXNTaGFwZSwgb3V0cHV0VmFsdWVzLCBlbXB0eVJvd0luZGljYXRvciwgcmV2ZXJzZUluZGV4TWFwXSA9IHNwYXJzZUZpbGxFbXB0eVJvd3NJbXBsKCRpbmRpY2VzLCBpbmRpY2VzLnNoYXBlLCBpbmRpY2VzLmR0eXBlLCAkdmFsdWVzLCB2YWx1ZXMuZHR5cGUsICRkZW5zZVNoYXBlLCAkZGVmYXVsdFZhbHVlKTtcbiAgICByZXR1cm4gW1xuICAgICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dHB1dEluZGljZXNTaGFwZSwgaW5kaWNlcy5kdHlwZSwgb3V0cHV0SW5kaWNlcyksXG4gICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW291dHB1dEluZGljZXNTaGFwZVswXV0sIHZhbHVlcy5kdHlwZSwgb3V0cHV0VmFsdWVzKSxcbiAgICAgICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbZW1wdHlSb3dJbmRpY2F0b3IubGVuZ3RoXSwgJ2Jvb2wnLCBuZXcgVWludDhBcnJheShlbXB0eVJvd0luZGljYXRvci5tYXAoKHZhbHVlKSA9PiBOdW1iZXIodmFsdWUpKSkpLFxuICAgICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtyZXZlcnNlSW5kZXhNYXAubGVuZ3RoXSwgaW5kaWNlcy5kdHlwZSwgbmV3IEludDMyQXJyYXkocmV2ZXJzZUluZGV4TWFwKSksXG4gICAgXTtcbn1cbmV4cG9ydCBjb25zdCBzcGFyc2VGaWxsRW1wdHlSb3dzQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNwYXJzZUZpbGxFbXB0eVJvd3MsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHNwYXJzZUZpbGxFbXB0eVJvd3MsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3BhcnNlRmlsbEVtcHR5Um93cy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiBzcGFyc2VGaWxsRW1wdHlSb3dzSW1wbChpbmRpY2VzLCBpbmRpY2VzU2hhcGUsIGluZGljZXNEVHlwZSwgdmFsdWVzLCB2YWx1ZXNEVHlwZSwgZGVuc2VTaGFwZSwgZGVmYXVsdFZhbHVlKSB7XG4gICAgY29uc3QgaW5kaWNlc0NvdW50ID0gaW5kaWNlc1NoYXBlWzBdO1xuICAgIGNvbnN0IGRlbnNlUm93cyA9IGRlbnNlU2hhcGVbMF07XG4gICAgY29uc3QgZW1wdHlSb3dJbmRpY2F0b3IgPSBuZXcgQXJyYXkoZGVuc2VSb3dzKTtcbiAgICBjb25zdCByZXZlcnNlSW5kZXhNYXAgPSBuZXcgQXJyYXkoaW5kaWNlc0NvdW50KTtcbiAgICBjb25zdCByYW5rID0gaW5kaWNlc1NoYXBlWzFdO1xuICAgIGlmIChkZW5zZVJvd3MgPT09IDApIHtcbiAgICAgICAgaWYgKGluZGljZXNDb3VudCAhPT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWNlaXZlZCBTcGFyc2VUZW5zb3Igd2l0aCBkZW5zZVNoYXBlWzBdID0gMCBidXRcbiAgICAgICAgIGluZGljZXMuc2hhcGVbMF0gPSAke2luZGljZXNDb3VudH1gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvdXRwdXRJbmRpY2VzID0gdXRpbC5nZXRBcnJheUZyb21EVHlwZShpbmRpY2VzRFR5cGUsIDApO1xuICAgICAgICBjb25zdCBvdXRwdXRWYWx1ZXMgPSB1dGlsLmdldEFycmF5RnJvbURUeXBlKHZhbHVlc0RUeXBlLCAwKTtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIG91dHB1dEluZGljZXMsIFswLCByYW5rXSwgb3V0cHV0VmFsdWVzLCBlbXB0eVJvd0luZGljYXRvciwgcmV2ZXJzZUluZGV4TWFwXG4gICAgICAgIF07XG4gICAgfVxuICAgIGxldCByb3dzQXJlT3JkZXJlZCA9IHRydWU7XG4gICAgbGV0IGxhc3RJbmRpY2VzUm93ID0gMDtcbiAgICBjb25zdCBjc3JPZmZzZXQgPSBuZXcgQXJyYXkoZGVuc2VSb3dzKS5maWxsKDApO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kaWNlc0NvdW50OyArK2kpIHtcbiAgICAgICAgLy8gaW5kaWNlcyBpcyBhIDJkIHRlbnNvciB3aXRoIHNoYXBlIG9mIFtOLCByYW5rXVxuICAgICAgICBjb25zdCByb3cgPSBpbmRpY2VzW2kgKiByYW5rXTtcbiAgICAgICAgaWYgKHJvdyA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgaW5kaWNlcygke2l9LCAwKSBpcyBpbnZhbGlkOiAke3Jvd30gPCAwYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJvdyA+PSBkZW5zZVJvd3MpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgaW5kaWNlcygke2l9LCAwKSBpcyBpbnZhbGlkOiAke3Jvd30gPj0gJHtkZW5zZVJvd3N9YCk7XG4gICAgICAgIH1cbiAgICAgICAgKytjc3JPZmZzZXRbcm93XTtcbiAgICAgICAgcm93c0FyZU9yZGVyZWQgPSByb3dzQXJlT3JkZXJlZCAmJiAocm93ID49IGxhc3RJbmRpY2VzUm93KTtcbiAgICAgICAgbGFzdEluZGljZXNSb3cgPSByb3c7XG4gICAgfVxuICAgIGxldCBhbGxSb3dzRnVsbCA9IHRydWU7XG4gICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgZGVuc2VSb3dzOyArK3Jvdykge1xuICAgICAgICAvLyBjc3JPZmZzZXQgaGVyZSBkZXNjcmliZXMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIGRlbnNlIHJvd1xuICAgICAgICBjb25zdCByb3dFbXB0eSA9IChjc3JPZmZzZXRbcm93XSA9PT0gMCk7XG4gICAgICAgIGVtcHR5Um93SW5kaWNhdG9yW3Jvd10gPSByb3dFbXB0eTtcbiAgICAgICAgYWxsUm93c0Z1bGwgPSBhbGxSb3dzRnVsbCAmJiAhcm93RW1wdHk7XG4gICAgICAgIC8vIEluIGZpbGxlZCB2ZXJzaW9uLCBlYWNoIHJvdyBoYXMgYXQgbGVhc3Qgb25lIGVsZW1lbnQuXG4gICAgICAgIGNzck9mZnNldFtyb3ddID0gTWF0aC5tYXgoY3NyT2Zmc2V0W3Jvd10sIDEpO1xuICAgICAgICAvLyBVcGRhdGUgY3NyT2Zmc2V0IHRvIHJlcHJlc2VudCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHVwIHRvIGFuZFxuICAgICAgICAvLyBpbmNsdWRpbmcgZGVuc2VSb3dzICsgMTpcbiAgICAgICAgLy8gIGNzck9mZnNldFswXSA9PSAje2VsZW1lbnRzIG9mIHJvdyAwfVxuICAgICAgICAvLyAgY3NyT2Zmc2V0WzFdID09ICN7ZWxlbWVudHMgb2Ygcm93IDF9ICsgI3tlbGVtZW50cyBvZiByb3cgMH1cbiAgICAgICAgLy8gIC4uXG4gICAgICAgIC8vICBjc3JPZmZzZXRbaV0gPT0gc3RhcnRpbmcgaW5kZXggZm9yIGVsZW1lbnRzIGluIHJvdyBpICsgMS5cbiAgICAgICAgaWYgKHJvdyA+IDApIHtcbiAgICAgICAgICAgIGNzck9mZnNldFtyb3ddICs9IGNzck9mZnNldFtyb3cgLSAxXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoYWxsUm93c0Z1bGwgJiYgcm93c0FyZU9yZGVyZWQpIHtcbiAgICAgICAgY29uc3Qgb3V0cHV0SW5kaWNlcyA9IGluZGljZXM7XG4gICAgICAgIGNvbnN0IG91dHB1dFZhbHVlcyA9IHZhbHVlcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmRpY2VzQ291bnQ7ICsraSkge1xuICAgICAgICAgICAgcmV2ZXJzZUluZGV4TWFwW2ldID0gaTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgb3V0cHV0SW5kaWNlcywgW2luZGljZXNDb3VudCwgcmFua10sIG91dHB1dFZhbHVlcywgZW1wdHlSb3dJbmRpY2F0b3IsXG4gICAgICAgICAgICByZXZlcnNlSW5kZXhNYXBcbiAgICAgICAgXTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGZ1bGxJbmRpY2VzQ291bnQgPSBjc3JPZmZzZXRbZGVuc2VSb3dzIC0gMV07XG4gICAgICAgIGNvbnN0IG91dHB1dEluZGljZXMgPSB1dGlsLmdldEFycmF5RnJvbURUeXBlKGluZGljZXNEVHlwZSwgZnVsbEluZGljZXNDb3VudCAqIHJhbmspO1xuICAgICAgICBjb25zdCBvdXRwdXRWYWx1ZXMgPSB1dGlsLmdldEFycmF5RnJvbURUeXBlKHZhbHVlc0RUeXBlLCBmdWxsSW5kaWNlc0NvdW50KTtcbiAgICAgICAgY29uc3QgZmlsbGVkQ291bnQgPSBuZXcgQXJyYXkoZGVuc2VSb3dzKS5maWxsKDApO1xuICAgICAgICAvLyBGaWxsIGluIHZhbHVlcyBmb3Igcm93cyB0aGF0IGFyZSBub3QgbWlzc2luZ1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGljZXNDb3VudDsgKytpKSB7XG4gICAgICAgICAgICAvLyBpbmRpY2VzIGlzIGEgMmQgdGVuc29yIHdpdGggc2hhcGUgb2YgW04sIHJhbmtdXG4gICAgICAgICAgICBjb25zdCByb3cgPSBpbmRpY2VzW2kgKiByYW5rXTtcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IGZpbGxlZENvdW50W3Jvd107XG4gICAgICAgICAgICBjb25zdCBvdXRwdXRJID0gKChyb3cgPT09IDApID8gMCA6IGNzck9mZnNldFtyb3cgLSAxXSkgKyBvZmZzZXQ7XG4gICAgICAgICAgICBmaWxsZWRDb3VudFtyb3ddKys7IC8vIEluY3JlbWVudCB0aGUgZmlsbGVkIGNvdW50IGZvciB0aGlzIHJvdy5cbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmFuazsgKytqKSB7XG4gICAgICAgICAgICAgICAgLy8gaW5kaWNlcyBhbmQgb3V0cHV0SW5kaWNlcyBhcmUgMmQgdGVuc29ycyB3aXRoIHNoYXBlIG9mIFtOLCByYW5rXVxuICAgICAgICAgICAgICAgIG91dHB1dEluZGljZXNbb3V0cHV0SSAqIHJhbmsgKyBqXSA9IGluZGljZXNbaSAqIHJhbmsgKyBqXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dHB1dFZhbHVlc1tvdXRwdXRJXSA9IHZhbHVlc1tpXTtcbiAgICAgICAgICAgIC8vIFdlJ2xsIG5lZWQgdGhpcyByZXZlcnNlIGluZGV4IG1hcCB0byBiYWNrcHJvcCBjb3JyZWN0bHkuXG4gICAgICAgICAgICByZXZlcnNlSW5kZXhNYXBbaV0gPSBvdXRwdXRJO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZpbGwgaW4gdmFsdWVzIGZvciByb3dzIHRoYXQgYXJlIG1pc3NpbmdcbiAgICAgICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgZGVuc2VSb3dzOyArK3Jvdykge1xuICAgICAgICAgICAgY29uc3Qgcm93Q291bnQgPSBmaWxsZWRDb3VudFtyb3ddO1xuICAgICAgICAgICAgaWYgKHJvd0NvdW50ID09PSAwKSB7IC8vIFdlIGhhdmVuJ3QgZmlsbGVkIHRoaXMgcm93XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRpbmdJbmRleCA9IChyb3cgPT09IDApID8gMCA6IGNzck9mZnNldFtyb3cgLSAxXTtcbiAgICAgICAgICAgICAgICAvLyBSZW1haW5pbmcgaW5kZXggdmFsdWVzIHdlcmUgc2V0IHRvIHplcm8gYWxyZWFkeS5cbiAgICAgICAgICAgICAgICAvLyBKdXN0IG5lZWQgdG8gc2V0IHRoZSByb3cgaW5kZXggaW4gdGhlIHJpZ2h0IGxvY2F0aW9uLlxuICAgICAgICAgICAgICAgIC8vIG91dHB1dEluZGljZXMgaXMgYSAyZCB0ZW5zb3Igd2l0aCBzaGFwZSBvZiBbTiwgcmFua11cbiAgICAgICAgICAgICAgICBvdXRwdXRJbmRpY2VzW3N0YXJ0aW5nSW5kZXggKiByYW5rICsgMF0gPSByb3c7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY29sID0gMTsgY29sIDwgcmFuazsgKytjb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0SW5kaWNlc1tzdGFydGluZ0luZGV4ICogcmFuayArIGNvbF0gPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvdXRwdXRWYWx1ZXNbc3RhcnRpbmdJbmRleF0gPSBkZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIG91dHB1dEluZGljZXMsIFtmdWxsSW5kaWNlc0NvdW50LCByYW5rXSwgb3V0cHV0VmFsdWVzLCBlbXB0eVJvd0luZGljYXRvcixcbiAgICAgICAgICAgIHJldmVyc2VJbmRleE1hcFxuICAgICAgICBdO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNwYXJzZUZpbGxFbXB0eVJvd3NfaW1wbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTcGFyc2VSZXNoYXBlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHNwYXJzZVJlc2hhcGVJbXBsIH0gZnJvbSAnLi9TcGFyc2VSZXNoYXBlX2ltcGwnO1xuZXhwb3J0IGZ1bmN0aW9uIHNwYXJzZVJlc2hhcGUoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW5wdXRJbmRpY2VzLCBpbnB1dFNoYXBlLCBuZXdTaGFwZSB9ID0gaW5wdXRzO1xuICAgIGlmIChpbnB1dEluZGljZXMuc2hhcGUubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW5wdXQgaW5kaWNlcyBzaG91bGQgYmUgYSBtYXRyaXggYnV0IHJlY2VpdmVkIHNoYXBlXG4gICAgICAgICR7aW5wdXRJbmRpY2VzLnNoYXBlfWApO1xuICAgIH1cbiAgICBpZiAoaW5wdXRTaGFwZS5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnB1dCBzaGFwZSBzaG91bGQgYmUgYSB2ZWN0b3IgYnV0IHJlY2VpdmVkIHNoYXBlXG4gICAgICAgICR7aW5wdXRTaGFwZS5zaGFwZX1gKTtcbiAgICB9XG4gICAgaWYgKG5ld1NoYXBlLnNoYXBlLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRhcmdldCBzaGFwZSBzaG91bGQgYmUgYSB2ZWN0b3IgYnV0IHJlY2VpdmVkIHNoYXBlICR7bmV3U2hhcGUuc2hhcGV9YCk7XG4gICAgfVxuICAgIGNvbnN0ICRpbnB1dFNoYXBlID0gQXJyYXkuZnJvbShiYWNrZW5kLmRhdGEuZ2V0KGlucHV0U2hhcGUuZGF0YUlkKS52YWx1ZXMpO1xuICAgIGNvbnN0ICRpbnB1dEluZGljZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGlucHV0SW5kaWNlcy5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCB0YXJnZXRTaGFwZSA9IEFycmF5LmZyb20oYmFja2VuZC5kYXRhLmdldChuZXdTaGFwZS5kYXRhSWQpLnZhbHVlcyk7XG4gICAgY29uc3QgW25ld0luZGljZXMsIGluZGljZXNTaGFwZSwgb3V0cHV0U2hhcGVdID0gc3BhcnNlUmVzaGFwZUltcGwoJGlucHV0SW5kaWNlcywgaW5wdXRJbmRpY2VzLnNoYXBlLCBpbnB1dEluZGljZXMuZHR5cGUsICRpbnB1dFNoYXBlLCB0YXJnZXRTaGFwZSk7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhpbmRpY2VzU2hhcGUsIGlucHV0SW5kaWNlcy5kdHlwZSwgbmV3SW5kaWNlcyksXG4gICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW291dHB1dFNoYXBlLmxlbmd0aF0sIG5ld1NoYXBlLmR0eXBlLCBuZXcgSW50MzJBcnJheShvdXRwdXRTaGFwZSkpLFxuICAgIF07XG59XG5leHBvcnQgY29uc3Qgc3BhcnNlUmVzaGFwZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTcGFyc2VSZXNoYXBlLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBzcGFyc2VSZXNoYXBlLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNwYXJzZVJlc2hhcGUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgZnVuY3Rpb24gc3BhcnNlUmVzaGFwZUltcGwoaW5wdXRJbmRpY2VzLCBpbnB1dEluZGljZXNTaGFwZSwgaW5wdXREVHlwZSwgaW5wdXRTaGFwZSwgdGFyZ2V0U2hhcGUpIHtcbiAgICBjb25zdCBkZW5zZVNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoaW5wdXRTaGFwZSk7XG4gICAgY29uc3Qgbm56ID0gaW5wdXRJbmRpY2VzU2hhcGVbMF07XG4gICAgY29uc3Qgb3V0cHV0UmFuayA9IHRhcmdldFNoYXBlLmxlbmd0aDtcbiAgICAvLyBDb21wdXRlIHRoZSBvdXRwdXQgc2hhcGUuIERldGVybWluZSBwcm9kdWN0IG9mIHNwZWNpZmllZCBkaW1lbnNpb25zLCBhbmRcbiAgICAvLyBmaW5kIHRoZSBpbmRleCBvZiB0aGUgdW5zcGVjaWZpZWQgb25lLlxuICAgIGNvbnN0IG91dHB1dFNoYXBlID0gW107XG4gICAgbGV0IHByb2R1Y3QgPSAxO1xuICAgIGxldCB1bmtub3duSW5kZXggPSAtMTtcbiAgICBmb3IgKGxldCBkID0gMDsgZCA8IG91dHB1dFJhbms7ICsrZCkge1xuICAgICAgICBjb25zdCBzaXplID0gdGFyZ2V0U2hhcGVbZF07XG4gICAgICAgIGlmIChzaXplID09PSAtMSkge1xuICAgICAgICAgICAgaWYgKHVua25vd25JbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG9ubHkgb25lIG91dHB1dCBkaW1lbnNpb24gbWF5IGJlIC0xLCBub3QgYm90aCAke3Vua25vd25JbmRleH0gYW5kICR7ZH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHVua25vd25JbmRleCA9IGQ7XG4gICAgICAgICAgICBvdXRwdXRTaGFwZS5wdXNoKDEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHNpemUgPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzaXplICR7ZH0gbXVzdCBiZSBub24tbmVnYXRpdmUsIG5vdCAke3NpemV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcm9kdWN0ICo9IHNpemU7XG4gICAgICAgICAgICBvdXRwdXRTaGFwZS5wdXNoKHNpemUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh1bmtub3duSW5kZXggIT09IC0xKSB7XG4gICAgICAgIGlmIChwcm9kdWN0IDw9IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncmVzaGFwZSBjYW5ub3QgaW5mZXIgdGhlIG1pc3NpbmcgJyArXG4gICAgICAgICAgICAgICAgJ2lucHV0IHNpemUgZm9yIGFuIGVtcHR5IHRlbnNvciB1bmxlc3MgYWxsICcgK1xuICAgICAgICAgICAgICAgICdzcGVjaWZpZWQgaW5wdXQgc2l6ZXMgYXJlIG5vbi16ZXJvJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWlzc2luZyA9IE1hdGgudHJ1bmMoZGVuc2VTaXplIC8gcHJvZHVjdCk7XG4gICAgICAgIGlmIChwcm9kdWN0ICogbWlzc2luZyAhPT0gZGVuc2VTaXplKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYElucHV0IHRvIHJlc2hhcGUgaXMgYSBTcGFyc2VUZW5zb3Igd2l0aCAke2RlbnNlU2l6ZX1cbiAgICAgICAgICBkZW5zZSB2YWx1ZXMsIGJ1dCB0aGUgcmVxdWVzdGVkIHNoYXBlIHJlcXVpcmVzIGEgbXVsdGlwbGUgb2YgJHtwcm9kdWN0fS4gaW5wdXRTaGFwZT0ke2lucHV0U2hhcGV9IG91dHB1dFNoYXBlPSAke291dHB1dFNoYXBlfWApO1xuICAgICAgICB9XG4gICAgICAgIG91dHB1dFNoYXBlW3Vua25vd25JbmRleF0gPSBtaXNzaW5nO1xuICAgIH1cbiAgICBjb25zdCBvdXRwdXRTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKG91dHB1dFNoYXBlKTtcbiAgICBpZiAob3V0cHV0U2l6ZSAhPT0gZGVuc2VTaXplKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW5wdXQgdG8gcmVzaGFwZSBpcyBhIHRlbnNvciB3aXRoICR7ZGVuc2VTaXplfSBkZW5zZSB2YWx1ZXMsIGJ1dCB0aGUgcmVxdWVzdGVkIHNoYXBlIGhhcyAke291dHB1dFNpemV9LiBpbnB1dFNoYXBlPSR7aW5wdXRTaGFwZX0gb3V0cHV0U2hhcGU9JHtvdXRwdXRTaGFwZX1gKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRSYW5rID0gaW5wdXRTaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgaW5wdXRTdHJpZGVzID0gW107XG4gICAgaWYgKGlucHV0UmFuayA+IDApIHtcbiAgICAgICAgaW5wdXRTdHJpZGVzW2lucHV0UmFuayAtIDFdID0gMTtcbiAgICAgICAgZm9yIChsZXQgZCA9IGlucHV0UmFuayAtIDI7IGQgPj0gMDsgLS1kKSB7XG4gICAgICAgICAgICBpbnB1dFN0cmlkZXNbZF0gPSBpbnB1dFN0cmlkZXNbZCArIDFdICogaW5wdXRTaGFwZVtkICsgMV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgb3V0cHV0U3RyaWRlcyA9IFtdO1xuICAgIGlmIChvdXRwdXRSYW5rID4gMCkge1xuICAgICAgICBvdXRwdXRTdHJpZGVzW291dHB1dFJhbmsgLSAxXSA9IDE7XG4gICAgICAgIGZvciAobGV0IGQgPSBvdXRwdXRSYW5rIC0gMjsgZCA+PSAwOyAtLWQpIHtcbiAgICAgICAgICAgIG91dHB1dFN0cmlkZXNbZF0gPSBvdXRwdXRTdHJpZGVzW2QgKyAxXSAqIG91dHB1dFNoYXBlW2QgKyAxXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBuZXdJbmRpY2VzID0gdXRpbC5nZXRBcnJheUZyb21EVHlwZShpbnB1dERUeXBlLCBubnogKiBvdXRwdXRSYW5rKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5uejsgKytpKSB7XG4gICAgICAgIGxldCBpZCA9IDA7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaW5wdXRSYW5rOyArK2opIHtcbiAgICAgICAgICAgIC8vIGlucHV0SW5kaWNlcyBpcyBhIDJkIHRlbnNvciB3aXRoIHNoYXBlIG9mIFtubnosIGlucHV0UmFua11cbiAgICAgICAgICAgIGlkICs9IGlucHV0SW5kaWNlc1tpICogaW5wdXRSYW5rICsgal0gKiBpbnB1dFN0cmlkZXNbal07XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBvdXRwdXRSYW5rOyArK2opIHtcbiAgICAgICAgICAgIC8vIG5ld0luZGljZXMgaXMgYSAyZCB0ZW5zb3Igd2l0aCBzaGFwZSBvZiBbbm56LCBvdXRwdXRSYW5rXVxuICAgICAgICAgICAgbmV3SW5kaWNlc1tpICogb3V0cHV0UmFuayArIGpdID0gTWF0aC50cnVuYyhpZCAvIG91dHB1dFN0cmlkZXNbal0pO1xuICAgICAgICAgICAgaWQgJT0gb3V0cHV0U3RyaWRlc1tqXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW25ld0luZGljZXMsIFtubnosIG91dHB1dFJhbmtdLCBvdXRwdXRTaGFwZV07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TcGFyc2VSZXNoYXBlX2ltcGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3BhcnNlU2VnbWVudE1lYW4gfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgc3BhcnNlU2VnbWVudFJlZHVjdGlvbkltcGwgfSBmcm9tICcuL1NwYXJzZVNlZ21lbnRSZWR1Y3Rpb25faW1wbCc7XG5leHBvcnQgZnVuY3Rpb24gc3BhcnNlU2VnbWVudE1lYW4oYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgZGF0YSwgaW5kaWNlcywgc2VnbWVudElkcyB9ID0gaW5wdXRzO1xuICAgIGlmIChkYXRhLnNoYXBlLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEYXRhIHNob3VsZCBiZSBhdCBsZWFzdCAxIGRpbWVuc2lvbmFsIGJ1dCByZWNlaXZlZCBzY2FsYXJgKTtcbiAgICB9XG4gICAgaWYgKGluZGljZXMuc2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW5kaWNlcyBzaG91bGQgYmUgYSB2ZWN0b3IgYnV0IHJlY2VpdmVkIHNoYXBlXG4gICAgICAgICAgJHtpbmRpY2VzLnNoYXBlfWApO1xuICAgIH1cbiAgICBpZiAoc2VnbWVudElkcy5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZWdtZW50IGlkcyBzaG91bGQgYmUgYSB2ZWN0b3IgYnV0IHJlY2VpdmVkIHNoYXBlXG4gICAgICAgICAgJHtzZWdtZW50SWRzLnNoYXBlfWApO1xuICAgIH1cbiAgICBjb25zdCAkZGF0YSA9IGJhY2tlbmQuZGF0YS5nZXQoZGF0YS5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCAkaW5kaWNlcyA9IGJhY2tlbmQuZGF0YS5nZXQoaW5kaWNlcy5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCAkc2VnbWVudElkcyA9IGJhY2tlbmQuZGF0YS5nZXQoc2VnbWVudElkcy5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBbb3V0cHV0RGF0YSwgb3V0cHV0RGF0YVNoYXBlXSA9IHNwYXJzZVNlZ21lbnRSZWR1Y3Rpb25JbXBsKCRkYXRhLCBkYXRhLnNoYXBlLCBkYXRhLmR0eXBlLCAkaW5kaWNlcywgJHNlZ21lbnRJZHMsIHRydWUpO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dHB1dERhdGFTaGFwZSwgZGF0YS5kdHlwZSwgb3V0cHV0RGF0YSk7XG59XG5leHBvcnQgY29uc3Qgc3BhcnNlU2VnbWVudE1lYW5Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU3BhcnNlU2VnbWVudE1lYW4sXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHNwYXJzZVNlZ21lbnRNZWFuLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNwYXJzZVNlZ21lbnRNZWFuLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIHNwYXJzZVNlZ21lbnRSZWR1Y3Rpb25JbXBsKGlucHV0LCBpbnB1dFNoYXBlLCBpbnB1dERUeXBlLCBpbmRpY2VzLCBzZWdtZW50SWRzLCBpc01lYW4gPSBmYWxzZSwgZGVmYXVsdFZhbHVlID0gMCkge1xuICAgIGNvbnN0IG51bUluZGljZXMgPSBpbmRpY2VzLmxlbmd0aDtcbiAgICBpZiAobnVtSW5kaWNlcyAhPT0gc2VnbWVudElkcy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzZWdtZW50SWRzIGFuZCBpbmRpY2VzIHNob3VsZCBoYXZlIHNhbWUgc2l6ZS5gKTtcbiAgICB9XG4gICAgLy8gRmxhdHRlbiB0aGUgYXJyYXkgdG8gdHdvIGRpbWVuc2lvbnNcbiAgICBjb25zdCBpbnB1dEZsYXQgPSBbaW5wdXRTaGFwZVswXSwgaW5wdXQubGVuZ3RoIC8gaW5wdXRTaGFwZVswXV07XG4gICAgY29uc3QgbnVtQ29sID0gaW5wdXRGbGF0WzFdO1xuICAgIC8vIE5vdGUgdGhhdCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBhc3N1bWVzIHRoYXQgc2VnbWVudElkcyB2YWx1ZXMgYXJlXG4gICAgLy8gc29ydGVkLlxuICAgIGNvbnN0IGxhc3RTZWdtZW50SWRQbHVzT25lID0gbnVtSW5kaWNlcyA+IDAgPyBzZWdtZW50SWRzW251bUluZGljZXMgLSAxXSArIDEgOiAwO1xuICAgIGNvbnN0IG91dHB1dFJvd3MgPSBsYXN0U2VnbWVudElkUGx1c09uZTtcbiAgICBpZiAob3V0cHV0Um93cyA8IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzZWdtZW50IGlkcyBtdXN0IGJlID49IDBgKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0cHV0U2hhcGUgPSBpbnB1dFNoYXBlLnNsaWNlKCk7XG4gICAgb3V0cHV0U2hhcGVbMF0gPSBvdXRwdXRSb3dzO1xuICAgIGNvbnN0IG91dHB1dExlbmd0aCA9IG91dHB1dFNoYXBlLnJlZHVjZSgocHJvZHVjdCwgdmFsdWUpID0+IHByb2R1Y3QgKiB2YWx1ZSwgMSk7XG4gICAgLy8gT3V0cHV0IGFycmF5IGlzIGluaXRpYWxpemVkIHdpdGggdGhlIHZhbHVlIDAgYnkgZGVmYXVsdC5cbiAgICBjb25zdCBvdXRwdXQgPSB1dGlsLmdldEFycmF5RnJvbURUeXBlKGlucHV0RFR5cGUsIG91dHB1dExlbmd0aCk7XG4gICAgLy8gTm90ZSB0aGF0IHdlIGRvIG5vdCBpbml0aWFsaXplIHRoZSBvdXRwdXQgYnVmZmVyIHdpdGggYSBkZWZhdWx0IHZhbHVlLCBzb1xuICAgIC8vIHdlIG5lZWQgdG8gZXhwbGljaXRseSBzZXQgbWlzc2luZyBpbmRpY2VzIHRvIHRoZSBkZWZhdWx0IHZhbHVlLlxuICAgIGlmIChudW1JbmRpY2VzID09PSAwKSB7XG4gICAgICAgIGlmIChvdXRwdXRSb3dzID4gMCkge1xuICAgICAgICAgICAgb3V0cHV0LmZpbGwoZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW291dHB1dCwgb3V0cHV0U2hhcGVdO1xuICAgIH1cbiAgICBpZiAob3V0cHV0Um93cyA8PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgc2VnbWVudCBpZHMgbXVzdCBiZSA+PSAwYCk7XG4gICAgfVxuICAgIGxldCBzdGFydCA9IDAsIGVuZCA9IDE7XG4gICAgLy8gSW5kZXggZnJvbSB3aGljaCB0aGUgb3V0cHV0IGlzIG5vdCBpbml0aWFsaXplZC5cbiAgICBsZXQgdW5pbml0aWFsaXplZEluZGV4ID0gMDtcbiAgICBsZXQgb3V0SW5kZXggPSBzZWdtZW50SWRzW3N0YXJ0XTtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAvLyBXZSBpbml0aWFsaXplIG5leHRJbmRleCB0byAwIHRvIGF2b2lkIG1heSBiZSB1bmluaXRpYWxpemVkIHdhcm5pbmdcbiAgICAgICAgbGV0IG5leHRJbmRleCA9IDA7XG4gICAgICAgIGlmIChlbmQgPCBudW1JbmRpY2VzKSB7XG4gICAgICAgICAgICBuZXh0SW5kZXggPSBzZWdtZW50SWRzW2VuZF07XG4gICAgICAgICAgICBpZiAob3V0SW5kZXggPT09IG5leHRJbmRleCkge1xuICAgICAgICAgICAgICAgICsrZW5kO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gV2UgaGF2ZSBhIG5ldyBzZWdtZW50IGhlcmUuICBWZXJpZnkgdGhhdCB0aGUgc2VnbWVudCBpZHMgYXJlIGdyb3dpbmcuXG4gICAgICAgICAgICBpZiAob3V0SW5kZXggPj0gbmV4dEluZGV4KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzZWdtZW50IGlkcyBhcmUgbm90IGluY3JlYXNpbmdgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAob3V0SW5kZXggPCAwIHx8IG91dEluZGV4ID49IG91dHB1dFJvd3MpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU2VnbWVudCBpZCAke291dEluZGV4fSBvdXQgb2YgcmFuZ2UgWzAsICR7b3V0cHV0Um93c30pLCBwb3NzaWJseSBiZWNhdXNlIHNlZ21lbnRJZHMgaW5wdXQgaXMgbm90IHNvcnRlZC5gKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIGdhcCBiZXR3ZWVuIHR3byBpbmRpY2VzLCB3ZSBuZWVkIHRvIHNldCB0aGF0IGdhcCB0byB0aGVcbiAgICAgICAgLy8gZGVmYXVsdCB2YWx1ZS5cbiAgICAgICAgaWYgKG91dEluZGV4ID4gdW5pbml0aWFsaXplZEluZGV4KSB7XG4gICAgICAgICAgICBvdXRwdXQuZmlsbChkZWZhdWx0VmFsdWUsIHVuaW5pdGlhbGl6ZWRJbmRleCAqIG51bUNvbCwgb3V0SW5kZXggKiBudW1Db2wpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IGluZGljZXNbaV07XG4gICAgICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGlucHV0RmxhdFswXSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQmFkOiBpbmRpY2VzWyR7aX1dID09ICR7aW5kaWNlc1tpXX0gb3V0IG9mIHJhbmdlIFswLCAke2lucHV0RmxhdFswXX0pYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG51bUNvbDsgaisrKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0W291dEluZGV4ICogbnVtQ29sICsgal0gKz0gaW5wdXRbaW5kZXggKiBudW1Db2wgKyBqXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNNZWFuKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG51bUNvbDsgaisrKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0W291dEluZGV4ICogbnVtQ29sICsgal0gLz0gZW5kIC0gc3RhcnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3RhcnQgPSBlbmQ7XG4gICAgICAgICsrZW5kO1xuICAgICAgICB1bmluaXRpYWxpemVkSW5kZXggPSBvdXRJbmRleCArIDE7XG4gICAgICAgIG91dEluZGV4ID0gbmV4dEluZGV4O1xuICAgICAgICBpZiAoZW5kID4gbnVtSW5kaWNlcykge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gRmlsbCB0aGUgZ2FwIGF0IHRoZSBlbmQgd2l0aCB0aGUgZGVmYXVsdCB2YWx1ZS5cbiAgICBpZiAodW5pbml0aWFsaXplZEluZGV4IDwgb3V0cHV0Um93cykge1xuICAgICAgICBvdXRwdXQuZmlsbChkZWZhdWx0VmFsdWUsIHVuaW5pdGlhbGl6ZWRJbmRleCAqIG51bUNvbCwgb3V0cHV0Um93cyAqIG51bUNvbCk7XG4gICAgfVxuICAgIHJldHVybiBbb3V0cHV0LCBvdXRwdXRTaGFwZV07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TcGFyc2VTZWdtZW50UmVkdWN0aW9uX2ltcGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3BhcnNlU2VnbWVudFN1bSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBzcGFyc2VTZWdtZW50UmVkdWN0aW9uSW1wbCB9IGZyb20gJy4vU3BhcnNlU2VnbWVudFJlZHVjdGlvbl9pbXBsJztcbmV4cG9ydCBmdW5jdGlvbiBzcGFyc2VTZWdtZW50U3VtKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IGRhdGEsIGluZGljZXMsIHNlZ21lbnRJZHMgfSA9IGlucHV0cztcbiAgICBpZiAoZGF0YS5zaGFwZS5sZW5ndGggPCAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRGF0YSBzaG91bGQgYmUgYXQgbGVhc3QgMSBkaW1lbnNpb25hbCBidXQgcmVjZWl2ZWQgc2NhbGFyYCk7XG4gICAgfVxuICAgIGlmIChpbmRpY2VzLnNoYXBlLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluZGljZXMgc2hvdWxkIGJlIGEgdmVjdG9yIGJ1dCByZWNlaXZlZCBzaGFwZVxuICAgICAgICAgJHtpbmRpY2VzLnNoYXBlfWApO1xuICAgIH1cbiAgICBpZiAoc2VnbWVudElkcy5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZWdtZW50IGlkcyBzaG91bGQgYmUgYSB2ZWN0b3IgYnV0IHJlY2VpdmVkIHNoYXBlXG4gICAgICAgICAke3NlZ21lbnRJZHMuc2hhcGV9YCk7XG4gICAgfVxuICAgIGNvbnN0ICRkYXRhID0gYmFja2VuZC5kYXRhLmdldChkYXRhLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0ICRpbmRpY2VzID0gYmFja2VuZC5kYXRhLmdldChpbmRpY2VzLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0ICRzZWdtZW50SWRzID0gYmFja2VuZC5kYXRhLmdldChzZWdtZW50SWRzLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IFtvdXRwdXREYXRhLCBvdXRwdXREYXRhU2hhcGVdID0gc3BhcnNlU2VnbWVudFJlZHVjdGlvbkltcGwoJGRhdGEsIGRhdGEuc2hhcGUsIGRhdGEuZHR5cGUsICRpbmRpY2VzLCAkc2VnbWVudElkcyk7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0cHV0RGF0YVNoYXBlLCBkYXRhLmR0eXBlLCBvdXRwdXREYXRhKTtcbn1cbmV4cG9ydCBjb25zdCBzcGFyc2VTZWdtZW50U3VtQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNwYXJzZVNlZ21lbnRTdW0sXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHNwYXJzZVNlZ21lbnRTdW0sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3BhcnNlU2VnbWVudFN1bS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIFNwYXJzZVRvRGVuc2UgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgc2NhdHRlckltcGwgfSBmcm9tICcuL1NjYXR0ZXJfaW1wbCc7XG5leHBvcnQgZnVuY3Rpb24gc3BhcnNlVG9EZW5zZShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgc3BhcnNlSW5kaWNlcywgc3BhcnNlVmFsdWVzLCBkZWZhdWx0VmFsdWUgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IG91dHB1dFNoYXBlIH0gPSBhdHRycztcbiAgICBjb25zdCB7IHNsaWNlUmFuaywgbnVtVXBkYXRlcywgc2xpY2VTaXplLCBzdHJpZGVzLCBvdXRwdXRTaXplIH0gPSBiYWNrZW5kX3V0aWwuY2FsY3VsYXRlU2hhcGVzKHNwYXJzZVZhbHVlcywgc3BhcnNlSW5kaWNlcywgb3V0cHV0U2hhcGUpO1xuICAgIGNvbnN0IHN1bUR1cGVJbmRpY2VzID0gZmFsc2U7XG4gICAgY29uc3QgaW5kaWNlc0J1ZiA9IGJhY2tlbmQuYnVmZmVyU3luYyhzcGFyc2VJbmRpY2VzKTtcbiAgICBjb25zdCB1cGRhdGVzQnVmID0gYmFja2VuZC5idWZmZXJTeW5jKHNwYXJzZVZhbHVlcyk7XG4gICAgY29uc3QgJGRlZmF1bHRWYWx1ZSA9IGJhY2tlbmQuZGF0YS5nZXQoZGVmYXVsdFZhbHVlLmRhdGFJZCkudmFsdWVzWzBdO1xuICAgIGNvbnN0IG91dEJ1ZiA9IHNjYXR0ZXJJbXBsKGluZGljZXNCdWYsIHVwZGF0ZXNCdWYsIG91dHB1dFNoYXBlLCBvdXRwdXRTaXplLCBzbGljZVNpemUsIG51bVVwZGF0ZXMsIHNsaWNlUmFuaywgc3RyaWRlcywgJGRlZmF1bHRWYWx1ZSwgc3VtRHVwZUluZGljZXMpO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dHB1dFNoYXBlLCBvdXRCdWYuZHR5cGUsIG91dEJ1Zi52YWx1ZXMpO1xufVxuZXhwb3J0IGNvbnN0IHNwYXJzZVRvRGVuc2VDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU3BhcnNlVG9EZW5zZSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogc3BhcnNlVG9EZW5zZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNwYXJzZVRvRGVuc2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IFNwbGl0ViwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBzbGljZSB9IGZyb20gJy4vU2xpY2UnO1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0VihhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgbnVtT3JTaXplU3BsaXRzLCBheGlzIH0gPSBhdHRycztcbiAgICBjb25zdCAkYXhpcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSlbMF07XG4gICAgY29uc3Qgc3BsaXRTaXplcyA9IGJhY2tlbmRfdXRpbC5wcmVwYXJlU3BsaXRTaXplKHgsIG51bU9yU2l6ZVNwbGl0cywgJGF4aXMpO1xuICAgIGNvbnN0IGJlZ2luID0gbmV3IEFycmF5KHguc2hhcGUubGVuZ3RoKS5maWxsKDApO1xuICAgIGNvbnN0IHNpemUgPSB4LnNoYXBlLnNsaWNlKCk7XG4gICAgcmV0dXJuIHNwbGl0U2l6ZXMubWFwKHMgPT4ge1xuICAgICAgICBjb25zdCBzbGljZVNpemUgPSBbLi4uc2l6ZV07XG4gICAgICAgIHNsaWNlU2l6ZVskYXhpc10gPSBzO1xuICAgICAgICBjb25zdCBzbGljZVQgPSBzbGljZSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQsIGF0dHJzOiB7IGJlZ2luLCBzaXplOiBzbGljZVNpemUgfSB9KTtcbiAgICAgICAgYmVnaW5bJGF4aXNdICs9IHM7XG4gICAgICAgIHJldHVybiBzbGljZVQ7XG4gICAgfSk7XG59XG5leHBvcnQgY29uc3Qgc3BsaXRWQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNwbGl0VixcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogc3BsaXRWXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3BsaXRWLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTcXJ0IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBzcXJ0ID0gdW5hcnlLZXJuZWxGdW5jKFNxcnQsICh4aSkgPT4gTWF0aC5zcXJ0KHhpKSk7XG5leHBvcnQgY29uc3Qgc3FydENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTcXJ0LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBzcXJ0LFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNxcnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3F1YXJlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5leHBvcnQgY29uc3Qgc3F1YXJlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNxdWFyZSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogKHsgaW5wdXRzLCBiYWNrZW5kIH0pID0+IHtcbiAgICAgICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgICAgIGNvbnN0IGNwdUJhY2tlbmQgPSBiYWNrZW5kO1xuICAgICAgICBhc3NlcnROb3RDb21wbGV4KHgsICdzcXVhcmUnKTtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gY3B1QmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgICAgICBjb25zdCBuZXdWYWx1ZXMgPSBuZXcgRmxvYXQzMkFycmF5KHZhbHVlcy5sZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZXNbaV07XG4gICAgICAgICAgICBuZXdWYWx1ZXNbaV0gPSB2YWx1ZSAqIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGFJZCA9IGNwdUJhY2tlbmQud3JpdGUobmV3VmFsdWVzLCB4LnNoYXBlLCB4LmR0eXBlKTtcbiAgICAgICAgcmV0dXJuIHsgZGF0YUlkLCBzaGFwZTogeC5zaGFwZSwgZHR5cGU6IHguZHR5cGUgfTtcbiAgICB9XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3F1YXJlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFNxdWFyZWREaWZmZXJlbmNlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfaW1wbCc7XG5pbXBvcnQgeyBiaW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBzcXVhcmVkRGlmZmVyZW5jZUltcGwgPSBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsKCgoYSwgYikgPT4ge1xuICAgIGNvbnN0IGRpZmYgPSBhIC0gYjtcbiAgICByZXR1cm4gZGlmZiAqIGRpZmY7XG59KSk7XG5leHBvcnQgY29uc3Qgc3F1YXJlZERpZmZlcmVuY2UgPSBiaW5hcnlLZXJuZWxGdW5jKFNxdWFyZWREaWZmZXJlbmNlLCBzcXVhcmVkRGlmZmVyZW5jZUltcGwpO1xuZXhwb3J0IGNvbnN0IHNxdWFyZWREaWZmZXJlbmNlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNxdWFyZWREaWZmZXJlbmNlLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBzcXVhcmVkRGlmZmVyZW5jZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNxdWFyZWREaWZmZXJlbmNlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTdGVwIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBzdGVwID0gdW5hcnlLZXJuZWxGdW5jKFN0ZXAsICh4aSwgYXR0cnMpID0+IHtcbiAgICBjb25zdCBzdGVwQXR0cnMgPSBhdHRycztcbiAgICBpZiAoaXNOYU4oeGkpKSB7XG4gICAgICAgIHJldHVybiBOYU47XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4geGkgPiAwID8gMSA6IHN0ZXBBdHRycy5hbHBoYTtcbiAgICB9XG59KTtcbmV4cG9ydCBjb25zdCBzdGVwQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFN0ZXAsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHN0ZXAsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3RlcC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBzbGljZV91dGlsLCBTdHJpZGVkU2xpY2UgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHsgc2xpY2UgfSBmcm9tICcuL1NsaWNlJztcbmltcG9ydCB7IHN0cmlkZWRTbGljZUltcGwgfSBmcm9tICcuL1N0cmlkZWRTbGljZV9pbXBsJztcbmV4cG9ydCBmdW5jdGlvbiBzdHJpZGVkU2xpY2UoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGJlZ2luLCBlbmQsIHN0cmlkZXMsIGJlZ2luTWFzaywgZW5kTWFzaywgZWxsaXBzaXNNYXNrLCBuZXdBeGlzTWFzaywgc2hyaW5rQXhpc01hc2sgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ3N0cmlkZWRTbGljZScpO1xuICAgIGNvbnN0IHsgbm9uU3RyaWRlZCwgJGJlZ2luLCAkc3RyaWRlcywgc2l6ZSwgbmV3U2hhcGUsIG91dFNoYXBlIH0gPSBzbGljZV91dGlsLnNsaWNlSW5mbyh4LnNoYXBlLCBiZWdpbiwgZW5kLCBzdHJpZGVzLCBiZWdpbk1hc2ssIGVuZE1hc2ssIGVsbGlwc2lzTWFzaywgbmV3QXhpc01hc2ssIHNocmlua0F4aXNNYXNrKTtcbiAgICBjb25zdCAkeCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogbmV3U2hhcGUgfSB9KTtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGlmIChub25TdHJpZGVkKSB7XG4gICAgICAgIGNvbnN0IHNsaWNlZCA9IHNsaWNlKHsgaW5wdXRzOiB7IHg6ICR4IH0sIGJhY2tlbmQsIGF0dHJzOiB7IGJlZ2luOiAkYmVnaW4sIHNpemUgfSB9KTtcbiAgICAgICAgcmVzdWx0ID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiBzbGljZWQgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IG91dFNoYXBlIH0gfSk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oc2xpY2VkKTtcbiAgICB9XG4gICAgZWxzZSBpZiAob3V0U2hhcGUuc29tZShheGlzID0+IGF4aXMgPT09IDApKSB7XG4gICAgICAgIHJlc3VsdCA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0U2hhcGUsIHguZHR5cGUsIFtdKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IHhCdWYgPSBiYWNrZW5kLmJ1ZmZlclN5bmMoJHgpO1xuICAgICAgICBjb25zdCBvdXRCdWYgPSBzdHJpZGVkU2xpY2VJbXBsKG91dFNoYXBlLCB4QnVmLCAkc3RyaWRlcywgJGJlZ2luKTtcbiAgICAgICAgcmVzdWx0ID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRCdWYuc2hhcGUsIG91dEJ1Zi5kdHlwZSwgb3V0QnVmLnZhbHVlcyk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdFJlc2hhcGVkID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiByZXN1bHQgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IG91dFNoYXBlIH0gfSk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbygkeCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXN1bHQpO1xuICAgIHJldHVybiByZXN1bHRSZXNoYXBlZDtcbn1cbmV4cG9ydCBjb25zdCBzdHJpZGVkU2xpY2VDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU3RyaWRlZFNsaWNlLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBzdHJpZGVkU2xpY2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdHJpZGVkU2xpY2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYnVmZmVyIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiBzdHJpZGVkU2xpY2VJbXBsKG91dFNoYXBlLCB4QnVmLCBzdHJpZGVzLCBiZWdpbikge1xuICAgIGNvbnN0IG91dEJ1ZiA9IGJ1ZmZlcihvdXRTaGFwZSwgeEJ1Zi5kdHlwZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRCdWYuc2l6ZTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGxvYyA9IG91dEJ1Zi5pbmRleFRvTG9jKGkpO1xuICAgICAgICBjb25zdCBuZXdMb2MgPSBuZXcgQXJyYXkobG9jLmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbmV3TG9jLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBuZXdMb2Nbal0gPSBsb2Nbal0gKiBzdHJpZGVzW2pdICsgYmVnaW5bal07XG4gICAgICAgIH1cbiAgICAgICAgb3V0QnVmLnNldCh4QnVmLmdldCguLi5uZXdMb2MpLCAuLi5sb2MpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0QnVmO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3RyaWRlZFNsaWNlX2ltcGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3RyaW5nTkdyYW1zIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHN0cmluZ05HcmFtc0ltcGwgfSBmcm9tICcuL1N0cmluZ05HcmFtc19pbXBsJztcbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdOR3JhbXMoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHNlcGFyYXRvciwgbkdyYW1XaWR0aHMsIGxlZnRQYWQsIHJpZ2h0UGFkLCBwYWRXaWR0aCwgcHJlc2VydmVTaG9ydFNlcXVlbmNlcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgeyBkYXRhLCBkYXRhU3BsaXRzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgJGRhdGEgPSBiYWNrZW5kLmRhdGEuZ2V0KGRhdGEuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgJGRhdGFTcGxpdHMgPSBiYWNrZW5kLmRhdGEuZ2V0KGRhdGFTcGxpdHMuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgW25HcmFtcywgbkdyYW1zU3BsaXRzXSA9IHN0cmluZ05HcmFtc0ltcGwoJGRhdGEsICRkYXRhU3BsaXRzLCBzZXBhcmF0b3IsIG5HcmFtV2lkdGhzLCBsZWZ0UGFkLCByaWdodFBhZCwgcGFkV2lkdGgsIHByZXNlcnZlU2hvcnRTZXF1ZW5jZXMpO1xuICAgIHJldHVybiBbXG4gICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW25HcmFtcy5sZW5ndGhdLCAnc3RyaW5nJywgbkdyYW1zKSxcbiAgICAgICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhkYXRhU3BsaXRzLnNoYXBlLCAnaW50MzInLCBuR3JhbXNTcGxpdHMpLFxuICAgIF07XG59XG5leHBvcnQgY29uc3Qgc3RyaW5nTkdyYW1zQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFN0cmluZ05HcmFtcyxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogc3RyaW5nTkdyYW1zLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN0cmluZ05HcmFtcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbi8qKlxuICogVGhlIFN0cmluZ05HcmFtc09wIGNsYXNzIGNyZWF0ZXMgbmdyYW1zIGZyb20gcmFnZ2VkIHN0cmluZyBkYXRhLlxuICogVGhlIGNvbnN0cnVjdG9yIGNvbnRhaW5zIGFsbCBhdHRyaWJ1dGVzIHJlbGF0ZWQgdG8gdGhlIG9wZXJhdGlvbiBzdWNoIGFzXG4gKiBwYWRkaW5nIHdpZHRocyBhbmQgc3RyaW5ncywgYW5kIHRoZSBjb21wdXRlIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvXG4gKiBjb21wdXRlIHRoZSBuZ3JhbXMgZm9yIGRpZmZlcmVudCByYWdnZWQgdGVuc29yIGlucHV0cy5cbiAqL1xuY2xhc3MgU3RyaW5nTkdyYW1zT3Age1xuICAgIGNvbnN0cnVjdG9yKHNlcGFyYXRvciwgbkdyYW1XaWR0aHMsIGxlZnRQYWQsIHJpZ2h0UGFkLCBwYWRXaWR0aCwgcHJlc2VydmVTaG9ydFNlcXVlbmNlcykge1xuICAgICAgICB0aGlzLnNlcGFyYXRvciA9IHV0aWwuZW5jb2RlU3RyaW5nKHNlcGFyYXRvcik7XG4gICAgICAgIHRoaXMubkdyYW1XaWR0aHMgPSBuR3JhbVdpZHRocztcbiAgICAgICAgdGhpcy5sZWZ0UGFkID0gdXRpbC5lbmNvZGVTdHJpbmcobGVmdFBhZCk7XG4gICAgICAgIHRoaXMucmlnaHRQYWQgPSB1dGlsLmVuY29kZVN0cmluZyhyaWdodFBhZCk7XG4gICAgICAgIHRoaXMucGFkV2lkdGggPSBwYWRXaWR0aDtcbiAgICAgICAgdGhpcy5wcmVzZXJ2ZVNob3J0ID0gcHJlc2VydmVTaG9ydFNlcXVlbmNlcztcbiAgICB9XG4gICAgZ2V0UGFkV2lkdGgobkdyYW1XaWR0aCkge1xuICAgICAgICAvLyBOZ3JhbXMgY2FuIGJlIHBhZGRlZCB3aXRoIGVpdGhlciBhIGZpeGVkIHBhZCB3aWR0aCBvciBhIGR5bmFtaWMgcGFkXG4gICAgICAgIC8vIHdpZHRoIGRlcGVuZGluZyBvbiB0aGUgJ3BhZFdpZHRoJyBhcmcsIGJ1dCBpbiBubyBjYXNlIHNob3VsZCB0aGUgcGFkZGluZ1xuICAgICAgICAvLyBldmVyIGJlIHdpZGVyIHRoYW4gJ25HcmFtV2lkdGgnIC0gMS5cbiAgICAgICAgcmV0dXJuIE1hdGgubWluKHRoaXMucGFkV2lkdGggPCAwID8gbkdyYW1XaWR0aCAtIDEgOiB0aGlzLnBhZFdpZHRoLCBuR3JhbVdpZHRoIC0gMSk7XG4gICAgfVxuICAgIGdldE51bU5HcmFtcyhsZW5ndGgsIG5HcmFtV2lkdGgpIHtcbiAgICAgICAgY29uc3QgcGFkV2lkdGggPSB0aGlzLmdldFBhZFdpZHRoKG5HcmFtV2lkdGgpO1xuICAgICAgICByZXR1cm4gTWF0aC5tYXgoMCwgKChsZW5ndGggKyAyICogcGFkV2lkdGgpIC0gbkdyYW1XaWR0aCkgKyAxKTtcbiAgICB9XG4gICAgY3JlYXRlTkdyYW1zKGRhdGEsIHNwbGl0SW5kZXgsIG91dHB1dCwgb3V0cHV0U3RhcnRJbmRleCwgbnVtTkdyYW1zLCBuR3JhbVdpZHRoKSB7XG4gICAgICAgIGZvciAobGV0IG5HcmFtSW5kZXggPSAwOyBuR3JhbUluZGV4IDwgbnVtTkdyYW1zOyArK25HcmFtSW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhZFdpZHRoID0gdGhpcy5nZXRQYWRXaWR0aChuR3JhbVdpZHRoKTtcbiAgICAgICAgICAgIGNvbnN0IGxlZnRQYWRkaW5nID0gTWF0aC5tYXgoMCwgcGFkV2lkdGggLSBuR3JhbUluZGV4KTtcbiAgICAgICAgICAgIGNvbnN0IHJpZ2h0UGFkZGluZyA9IE1hdGgubWF4KDAsIHBhZFdpZHRoIC0gKG51bU5HcmFtcyAtIChuR3JhbUluZGV4ICsgMSkpKTtcbiAgICAgICAgICAgIGNvbnN0IG51bVRva2VucyA9IG5HcmFtV2lkdGggLSAobGVmdFBhZGRpbmcgKyByaWdodFBhZGRpbmcpO1xuICAgICAgICAgICAgY29uc3QgZGF0YVN0YXJ0SW5kZXggPSBzcGxpdEluZGV4ICsgKGxlZnRQYWRkaW5nID4gMCA/IDAgOiBuR3JhbUluZGV4IC0gcGFkV2lkdGgpO1xuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSB0b3RhbCBleHBlY3RlZCBzaXplIG9mIHRoZSBuR3JhbSBzbyB3ZSBjYW4gcmVzZXJ2ZSB0aGVcbiAgICAgICAgICAgIC8vIGNvcnJlY3QgYW1vdW50IG9mIHNwYWNlIGluIHRoZSBzdHJpbmcuXG4gICAgICAgICAgICBsZXQgbkdyYW1TaXplID0gMDtcbiAgICAgICAgICAgIC8vIFNpemUgb2YgdGhlIGxlZnQgcGFkZGluZy5cbiAgICAgICAgICAgIG5HcmFtU2l6ZSArPSBsZWZ0UGFkZGluZyAqIHRoaXMubGVmdFBhZC5sZW5ndGg7XG4gICAgICAgICAgICAvLyBTaXplIG9mIHRoZSB0b2tlbnMuXG4gICAgICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IG51bVRva2VuczsgKytuKSB7XG4gICAgICAgICAgICAgICAgbkdyYW1TaXplICs9IGRhdGFbZGF0YVN0YXJ0SW5kZXggKyBuXS5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTaXplIG9mIHRoZSByaWdodCBwYWRkaW5nLlxuICAgICAgICAgICAgbkdyYW1TaXplICs9IHJpZ2h0UGFkZGluZyAqIHRoaXMucmlnaHRQYWQubGVuZ3RoO1xuICAgICAgICAgICAgLy8gU2l6ZSBvZiB0aGUgc2VwYXJhdG9ycy5cbiAgICAgICAgICAgIGNvbnN0IG51bVNlcGFyYXRvcnMgPSBsZWZ0UGFkZGluZyArIHJpZ2h0UGFkZGluZyArIG51bVRva2VucyAtIDE7XG4gICAgICAgICAgICBuR3JhbVNpemUgKz0gbnVtU2VwYXJhdG9ycyAqIHRoaXMuc2VwYXJhdG9yLmxlbmd0aDtcbiAgICAgICAgICAgIC8vIEJ1aWxkIHRoZSBuR3JhbS5cbiAgICAgICAgICAgIG91dHB1dFtvdXRwdXRTdGFydEluZGV4ICsgbkdyYW1JbmRleF0gPSBuZXcgVWludDhBcnJheShuR3JhbVNpemUpO1xuICAgICAgICAgICAgY29uc3QgbkdyYW0gPSBvdXRwdXRbb3V0cHV0U3RhcnRJbmRleCArIG5HcmFtSW5kZXhdO1xuICAgICAgICAgICAgbGV0IG5leHROR3JhbUluZGV4ID0gMDtcbiAgICAgICAgICAgIGNvbnN0IGFwcGVuZFRvTkdyYW0gPSAoc3RyKSA9PiBzdHIuZm9yRWFjaCgodmFsdWUpID0+IG5HcmFtW25leHROR3JhbUluZGV4KytdID0gdmFsdWUpO1xuICAgICAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBsZWZ0UGFkZGluZzsgKytuKSB7XG4gICAgICAgICAgICAgICAgYXBwZW5kVG9OR3JhbSh0aGlzLmxlZnRQYWQpO1xuICAgICAgICAgICAgICAgIGFwcGVuZFRvTkdyYW0odGhpcy5zZXBhcmF0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gT25seSBvdXRwdXQgZmlyc3QgbnVtVG9rZW5zIC0gMSBwYWlycyBvZiBkYXRhIGFuZCBzZXBhcmF0b3JcbiAgICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgbnVtVG9rZW5zIC0gMTsgKytuKSB7XG4gICAgICAgICAgICAgICAgYXBwZW5kVG9OR3JhbShkYXRhW2RhdGFTdGFydEluZGV4ICsgbl0pO1xuICAgICAgICAgICAgICAgIGFwcGVuZFRvTkdyYW0odGhpcy5zZXBhcmF0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSGFuZGxlIGNhc2Ugd2hlbiB0aGVyZSBhcmUgbm8gdG9rZW5zIG9yIG5vIHJpZ2h0IHBhZGRpbmcgYXMgdGhlc2VcbiAgICAgICAgICAgIC8vIGNhbiByZXN1bHQgaW4gY29uc2VjdXRpdmUgc2VwYXJhdG9ycy5cbiAgICAgICAgICAgIGlmIChudW1Ub2tlbnMgPiAwKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSB0b2tlbnMsIHRoZW4gb3V0cHV0IGxhc3QgYW5kIHRoZW4gcGFpciBlYWNoIHNlcGFyYXRvclxuICAgICAgICAgICAgICAgIC8vIHdpdGggdGhlIHJpZ2h0IHBhZGRpbmcgdGhhdCBmb2xsb3dzLCB0byBlbnN1cmUgbkdyYW0gZW5kcyBlaXRoZXIgd2l0aFxuICAgICAgICAgICAgICAgIC8vIHRoZSB0b2tlbiBvciB3aXRoIHRoZSByaWdodCBwYWQuXG4gICAgICAgICAgICAgICAgYXBwZW5kVG9OR3JhbShkYXRhW2RhdGFTdGFydEluZGV4ICsgbnVtVG9rZW5zIC0gMV0pO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgcmlnaHRQYWRkaW5nOyArK24pIHtcbiAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG9OR3JhbSh0aGlzLnNlcGFyYXRvcik7XG4gICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvTkdyYW0odGhpcy5yaWdodFBhZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSB0b2tlbnMsIHRoZW4gdGhlIGxhc3QgaXRlbSBpbnNlcnRlZCBpbnRvIHRoZSBuR3JhbVxuICAgICAgICAgICAgICAgIC8vIGhhcyBiZWVuIHRoZSBzZXBhcmF0b3IgZnJvbSB0aGUgbGVmdCBwYWRkaW5nIGxvb3AgYWJvdmUuIEhlbmNlLFxuICAgICAgICAgICAgICAgIC8vIG91dHB1dCByaWdodCBwYWQgYW5kIHNlcGFyYXRvciBhbmQgbWFrZSBzdXJlIHRvIGZpbmlzaCB3aXRoIGFcbiAgICAgICAgICAgICAgICAvLyBwYWRkaW5nLCBub3QgYSBzZXBhcmF0b3IuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCByaWdodFBhZGRpbmcgLSAxOyArK24pIHtcbiAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG9OR3JhbSh0aGlzLnJpZ2h0UGFkKTtcbiAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG9OR3JhbSh0aGlzLnNlcGFyYXRvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFwcGVuZFRvTkdyYW0odGhpcy5yaWdodFBhZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gRGF0YSBhbmQgc3BsaXRzIHRvZ2V0aGVyIGZvcm0gdGhlIGRlZmluaXRpb24gb2YgdGhlIHJhZ2dlZCB0ZW5zb3IsXG4gICAgLy8gd2hlcmUgZGF0YSBpcyAxIGRpbWVuc2lvbmFsIGFuZCBjb250YWlucyB0aGUgdmFsdWVzIG9mIHRoZSB0ZW5zb3JcbiAgICAvLyBhbmQgc3BsaXRzIGRlbm90ZXMgdGhlIGluZGljZXMgYXQgd2hpY2ggZWFjaCByb3cgc3RhcnRzLlxuICAgIGNvbXB1dGUoZGF0YSwgc3BsaXRzKSB7XG4gICAgICAgIC8vIFZhbGlkYXRlIHRoYXQgdGhlIHNwbGl0cyBhcmUgdmFsaWQgaW5kaWNlcyBpbnRvIGRhdGEsIG9ubHkgaWYgdGhlcmUgYXJlXG4gICAgICAgIC8vIHNwbGl0cyBzcGVjaWZpZWQuXG4gICAgICAgIGNvbnN0IGlucHV0RGF0YVNpemUgPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgY29uc3Qgc3BsaXRzU2l6ZSA9IHNwbGl0cy5sZW5ndGg7XG4gICAgICAgIGlmIChzcGxpdHNTaXplID4gMCkge1xuICAgICAgICAgICAgbGV0IHByZXZTcGxpdCA9IHNwbGl0c1swXTtcbiAgICAgICAgICAgIGlmIChwcmV2U3BsaXQgIT09IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpcnN0IHNwbGl0IHZhbHVlIG11c3QgYmUgMCwgZ290ICR7cHJldlNwbGl0fWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzcGxpdHNTaXplOyArK2kpIHtcbiAgICAgICAgICAgICAgICBsZXQgdmFsaWRTcGxpdHMgPSBzcGxpdHNbaV0gPj0gcHJldlNwbGl0O1xuICAgICAgICAgICAgICAgIHZhbGlkU3BsaXRzID0gdmFsaWRTcGxpdHMgJiYgKHNwbGl0c1tpXSA8PSBpbnB1dERhdGFTaXplKTtcbiAgICAgICAgICAgICAgICBpZiAoIXZhbGlkU3BsaXRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzcGxpdCB2YWx1ZSAke3NwbGl0c1tpXX0sIG11c3QgYmUgaW4gWyR7cHJldlNwbGl0fSwgJHtpbnB1dERhdGFTaXplfV1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJldlNwbGl0ID0gc3BsaXRzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByZXZTcGxpdCAhPT0gaW5wdXREYXRhU2l6ZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTGFzdCBzcGxpdCB2YWx1ZSBtdXN0IGJlIGRhdGEgc2l6ZS4gRXhwZWN0ZWQgJHtpbnB1dERhdGFTaXplfSwgZ290ICR7cHJldlNwbGl0fWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG51bUJhdGNoSXRlbXMgPSBzcGxpdHNTaXplIC0gMTtcbiAgICAgICAgY29uc3QgbkdyYW1zU3BsaXRzID0gdXRpbC5nZXRBcnJheUZyb21EVHlwZSgnaW50MzInLCBzcGxpdHNTaXplKTtcbiAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gZGF0YSBvciBzaXplLCByZXR1cm4gYW4gZW1wdHkgcmFnZ2VkIHRlbnNvci5cbiAgICAgICAgaWYgKGlucHV0RGF0YVNpemUgPT09IDAgfHwgc3BsaXRzU2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3QgZW1wdHkgPSBuZXcgQXJyYXkoaW5wdXREYXRhU2l6ZSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBudW1CYXRjaEl0ZW1zOyArK2kpIHtcbiAgICAgICAgICAgICAgICBuR3JhbXNTcGxpdHNbaV0gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFtlbXB0eSwgbkdyYW1zU3BsaXRzXTtcbiAgICAgICAgfVxuICAgICAgICBuR3JhbXNTcGxpdHNbMF0gPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBudW1CYXRjaEl0ZW1zOyArK2kpIHtcbiAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHNwbGl0c1tpXSAtIHNwbGl0c1tpIC0gMV07XG4gICAgICAgICAgICBsZXQgbnVtTkdyYW1zID0gMDtcbiAgICAgICAgICAgIHRoaXMubkdyYW1XaWR0aHMuZm9yRWFjaCgobkdyYW1XaWR0aCkgPT4ge1xuICAgICAgICAgICAgICAgIG51bU5HcmFtcyArPSB0aGlzLmdldE51bU5HcmFtcyhsZW5ndGgsIG5HcmFtV2lkdGgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmVzZXJ2ZVNob3J0ICYmIGxlbmd0aCA+IDAgJiYgbnVtTkdyYW1zID09PSAwKSB7XG4gICAgICAgICAgICAgICAgbnVtTkdyYW1zID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5HcmFtc1NwbGl0c1tpXSA9IG5HcmFtc1NwbGl0c1tpIC0gMV0gKyBudW1OR3JhbXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbkdyYW1zID0gbmV3IEFycmF5KG5HcmFtc1NwbGl0c1tudW1CYXRjaEl0ZW1zXSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtQmF0Y2hJdGVtczsgKytpKSB7XG4gICAgICAgICAgICBjb25zdCBzcGxpdEluZGV4ID0gc3BsaXRzW2ldO1xuICAgICAgICAgICAgbGV0IG91dHB1dFN0YXJ0SWR4ID0gbkdyYW1zU3BsaXRzW2ldO1xuICAgICAgICAgICAgdGhpcy5uR3JhbVdpZHRocy5mb3JFYWNoKChuR3JhbVdpZHRoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gc3BsaXRzW2kgKyAxXSAtIHNwbGl0c1tpXTtcbiAgICAgICAgICAgICAgICBjb25zdCBudW1OR3JhbXMgPSB0aGlzLmdldE51bU5HcmFtcyhsZW5ndGgsIG5HcmFtV2lkdGgpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlTkdyYW1zKGRhdGEsIHNwbGl0SW5kZXgsIG5HcmFtcywgb3V0cHV0U3RhcnRJZHgsIG51bU5HcmFtcywgbkdyYW1XaWR0aCk7XG4gICAgICAgICAgICAgICAgb3V0cHV0U3RhcnRJZHggKz0gbnVtTkdyYW1zO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBJZiB3ZSdyZSBwcmVzZXJ2aW5nIHNob3J0IHNlcXVlbmNlcywgY2hlY2sgdG8gc2VlIGlmIG5vIHNlcXVlbmNlIHdhc1xuICAgICAgICAgICAgLy8gZ2VuZXJhdGVkIGJ5IGNvbXBhcmluZyB0aGUgY3VycmVudCBvdXRwdXQgc3RhcnQgaWR4IHRvIHRoZSBvcmlnaW5hbFxuICAgICAgICAgICAgLy8gb25lIChuR3JhbVNwbGl0c2RhdGEpLiBJZiBubyBuZ3JhbXMgd2VyZSBnZW5lcmF0ZWQsIHRoZW4gdGhleSB3aWxsXG4gICAgICAgICAgICAvLyBiZSBlcXVhbCAoc2luY2Ugd2UgaW5jcmVtZW50IG91dHB1dFN0YXJ0SWR4IGJ5IG51bU5HcmFtcyBldmVyeVxuICAgICAgICAgICAgLy8gdGltZSB3ZSBjcmVhdGUgYSBzZXQgb2YgbmdyYW1zLilcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXNlcnZlU2hvcnQgJiYgb3V0cHV0U3RhcnRJZHggPT09IG5HcmFtc1NwbGl0c1tpXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFMZW5ndGggPSBzcGxpdHNbaSArIDFdIC0gc3BsaXRzW2ldO1xuICAgICAgICAgICAgICAgIC8vIE9uZSBsZWdpdGltYXRlIHJlYXNvbiB0byBub3QgaGF2ZSBhbnkgbmdyYW1zIHdoZW4gdGhpcy5wcmVzZXJ2ZVNob3J0XG4gICAgICAgICAgICAgICAgLy8gaXMgdHJ1ZSBpcyBpZiB0aGUgc2VxdWVuY2UgaXRzZWxmIGlzIGVtcHR5LiBJbiB0aGF0IGNhc2UsIG1vdmUgb24uXG4gICAgICAgICAgICAgICAgaWYgKGRhdGFMZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgZHluYW1pYyBwYWRkaW5nIHNpemVzIGhlcmU6IGlmIHBhZGRpbmdcbiAgICAgICAgICAgICAgICAvLyB3YXMgZHluYW1pYywgZXZlcnkgc2VxdWVuY2Ugd291bGQgaGF2ZSBoYWQgc3VmZmljaWVudCBwYWRkaW5nIHRvXG4gICAgICAgICAgICAgICAgLy8gZ2VuZXJhdGUgYXQgbGVhc3Qgb25lIG5HcmFtLlxuICAgICAgICAgICAgICAgIGNvbnN0IG5HcmFtV2lkdGggPSBkYXRhTGVuZ3RoICsgMiAqIHRoaXMucGFkV2lkdGg7XG4gICAgICAgICAgICAgICAgY29uc3QgbnVtTkdyYW1zID0gMTtcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZU5HcmFtcyhkYXRhLCBzcGxpdEluZGV4LCBuR3JhbXMsIG91dHB1dFN0YXJ0SWR4LCBudW1OR3JhbXMsIG5HcmFtV2lkdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbbkdyYW1zLCBuR3JhbXNTcGxpdHNdO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdOR3JhbXNJbXBsKGRhdGEsIGRhdGFTcGxpdHMsIHNlcGFyYXRvciwgbkdyYW1XaWR0aHMsIGxlZnRQYWQsIHJpZ2h0UGFkLCBwYWRXaWR0aCwgcHJlc2VydmVTaG9ydFNlcXVlbmNlcykge1xuICAgIHJldHVybiBuZXcgU3RyaW5nTkdyYW1zT3Aoc2VwYXJhdG9yLCBuR3JhbVdpZHRocywgbGVmdFBhZCwgcmlnaHRQYWQsIHBhZFdpZHRoLCBwcmVzZXJ2ZVNob3J0U2VxdWVuY2VzKVxuICAgICAgICAuY29tcHV0ZShkYXRhLCBkYXRhU3BsaXRzKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN0cmluZ05HcmFtc19pbXBsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFN0cmluZ1NwbGl0IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHN0cmluZ1NwbGl0SW1wbCB9IGZyb20gJy4vU3RyaW5nU3BsaXRfaW1wbCc7XG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nU3BsaXQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHNraXBFbXB0eSB9ID0gYXR0cnM7XG4gICAgY29uc3QgeyBpbnB1dCwgZGVsaW1pdGVyIH0gPSBpbnB1dHM7XG4gICAgaWYgKGlucHV0LmR0eXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0lucHV0IG11c3QgYmUgb2YgZGF0YXR5cGUgc3RyaW5nJyk7XG4gICAgfVxuICAgIGlmIChpbnB1dC5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnB1dCBtdXN0IGJlIGEgdmVjdG9yLCBnb3Qgc2hhcGU6ICR7aW5wdXQuc2hhcGV9YCk7XG4gICAgfVxuICAgIGlmIChkZWxpbWl0ZXIuc2hhcGUubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRGVsaW1pdGVyIG11c3QgYmUgYSBzY2FsYXIsIGdvdCBzaGFwZTogJHtkZWxpbWl0ZXIuc2hhcGV9YCk7XG4gICAgfVxuICAgIGNvbnN0ICRpbnB1dCA9IGJhY2tlbmQuZGF0YS5nZXQoaW5wdXQuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgJGRlbGltaXRlciA9IGJhY2tlbmQuZGF0YS5nZXQoZGVsaW1pdGVyLmRhdGFJZCkudmFsdWVzWzBdO1xuICAgIGNvbnN0IFtpbmRpY2VzLCB2YWx1ZXMsIHNoYXBlXSA9IHN0cmluZ1NwbGl0SW1wbCgkaW5wdXQsICRkZWxpbWl0ZXIsIHNraXBFbXB0eSk7XG4gICAgY29uc3Qgb3V0cHV0U2l6ZSA9IHZhbHVlcy5sZW5ndGg7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbb3V0cHV0U2l6ZSwgMl0sICdpbnQzMicsIGluZGljZXMpLFxuICAgICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtvdXRwdXRTaXplXSwgJ3N0cmluZycsIHZhbHVlcyksXG4gICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oWzJdLCAnaW50MzInLCBuZXcgSW50MzJBcnJheShzaGFwZSkpXG4gICAgXTtcbn1cbmV4cG9ydCBjb25zdCBzdHJpbmdTcGxpdENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTdHJpbmdTcGxpdCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogc3RyaW5nU3BsaXQsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3RyaW5nU3BsaXQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5mdW5jdGlvbiBzcGxpdChzdHIsIGRlbGltaXRlcnMsIHNraXBFbXB0eSkge1xuICAgIGlmICghc3RyLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIC8vIFdoZW4gdGhlIGRlbGltaXRlciBpcyBlbXB0eSwgdGhlIGlucHV0IGlzIHNwbGl0IGludG8gaW5kaXZpZHVhbCBjaGFyYWN0ZXJzLlxuICAgIGlmIChkZWxpbWl0ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXkoc3RyLmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICByZXN1bHRbaV0gPSBzdHIuc3ViYXJyYXkoaSwgaSArIDEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8vIFdoZW4gdGhlcmUgaXMgb25lIGRlbGltaXRlciwgdGhlIGlucHV0IGlzIHNwbGl0IG9ubHkgYXQgdGhhdCBkZWxpbWl0ZXIuXG4gICAgaWYgKGRlbGltaXRlcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvbnN0IGRlbGltaXRlciA9IGRlbGltaXRlcnNbMF07XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgICAgICBsZXQgZiA9IHN0ci5pbmRleE9mKGRlbGltaXRlcik7XG4gICAgICAgIHdoaWxlIChmICE9PSAtMSkge1xuICAgICAgICAgICAgY29uc3QgdG9rZW4gPSBzdHIuc3ViYXJyYXkoMCwgZik7XG4gICAgICAgICAgICBpZiAoIXNraXBFbXB0eSB8fCB0b2tlbi5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0b2tlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdHIgPSBzdHIuc3ViYXJyYXkoZiArIDEpO1xuICAgICAgICAgICAgZiA9IHN0ci5pbmRleE9mKGRlbGltaXRlcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFza2lwRW1wdHkgfHwgc3RyLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goc3RyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvLyBXaGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBkZWxpbWl0ZXJzLCB0aGUgaW5wdXQgaXMgc3BsaXQgYXQgZXZlcnkgaW5zdGFuY2VcbiAgICAvLyBvbmUgb2YgdGhlIGRlbGltaXRlcnMgYXBwZWFycy5cbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBsZXQgdG9rZW5TdGFydCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoICsgMTsgaSsrKSB7XG4gICAgICAgIGlmICgoaSA9PT0gc3RyLmxlbmd0aCkgfHwgKGRlbGltaXRlcnMuaW5kZXhPZihzdHJbaV0pICE9PSAtMSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuID0gc3RyLnN1YmFycmF5KHRva2VuU3RhcnQsIGkpO1xuICAgICAgICAgICAgaWYgKCFza2lwRW1wdHkgfHwgdG9rZW4ubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godG9rZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdG9rZW5TdGFydCA9IGkgKyAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nU3BsaXRJbXBsKGlucHV0LCBkZWxpbWl0ZXIsIHNraXBFbXB0eSkge1xuICAgIGNvbnN0IGJhdGNoU2l6ZSA9IGlucHV0Lmxlbmd0aDtcbiAgICAvLyBFbXB0eSBkZWxpbWl0ZXIgbWVhbnMgc3BsaXQgdGhlIGlucHV0IGNoYXJhY3RlciBieSBjaGFyYWN0ZXIuXG4gICAgY29uc3QgdG9rZW5zID0gW107XG4gICAgbGV0IG91dHB1dFNpemUgPSAwO1xuICAgIGxldCBtYXhOdW1FbnRyaWVzID0gMDtcbiAgICBjb25zdCBudW1JbmRpY2VzID0gbmV3IEFycmF5KGJhdGNoU2l6ZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiYXRjaFNpemU7ICsraSkge1xuICAgICAgICBjb25zdCBwYXJ0cyA9IHNwbGl0KGlucHV0W2ldLCBkZWxpbWl0ZXIsIHNraXBFbXB0eSk7XG4gICAgICAgIGNvbnN0IG5FbnRyaWVzID0gcGFydHMubGVuZ3RoO1xuICAgICAgICBudW1JbmRpY2VzW2ldID0gbkVudHJpZXM7XG4gICAgICAgIG91dHB1dFNpemUgKz0gbkVudHJpZXM7XG4gICAgICAgIG1heE51bUVudHJpZXMgPSBNYXRoLm1heChtYXhOdW1FbnRyaWVzLCBuRW50cmllcyk7XG4gICAgICAgIHRva2Vucy5wdXNoKC4uLnBhcnRzKTtcbiAgICB9XG4gICAgY29uc3QgaW5kaWNlcyA9IHV0aWwuZ2V0QXJyYXlGcm9tRFR5cGUoJ2ludDMyJywgb3V0cHV0U2l6ZSAqIDIpO1xuICAgIGNvbnN0IHZhbHVlcyA9IG5ldyBBcnJheShvdXRwdXRTaXplKTtcbiAgICBjb25zdCBzaGFwZSA9IFtiYXRjaFNpemUsIG1heE51bUVudHJpZXNdO1xuICAgIGxldCBjID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJhdGNoU2l6ZTsgKytpKSB7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbnVtSW5kaWNlc1tpXTsgKytqKSB7XG4gICAgICAgICAgICAvLyBpbmRpY2VzIGlzIGEgMmQgdGVuc29yIHdpdGggc2hhcGUgb2YgW291dHB1dFNpemUsIDJdXG4gICAgICAgICAgICBpbmRpY2VzW2MgKiAyXSA9IGk7XG4gICAgICAgICAgICBpbmRpY2VzW2MgKiAyICsgMV0gPSBqO1xuICAgICAgICAgICAgdmFsdWVzW2NdID0gdG9rZW5zW2NdO1xuICAgICAgICAgICAgKytjO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbaW5kaWNlcywgdmFsdWVzLCBzaGFwZV07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdHJpbmdTcGxpdF9pbXBsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFN0cmluZ1RvSGFzaEJ1Y2tldEZhc3QgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgc3RyaW5nVG9IYXNoQnVja2V0RmFzdEltcGwgfSBmcm9tICcuL1N0cmluZ1RvSGFzaEJ1Y2tldEZhc3RfaW1wbCc7XG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nVG9IYXNoQnVja2V0RmFzdChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgbnVtQnVja2V0cyB9ID0gYXR0cnM7XG4gICAgY29uc3QgeyBpbnB1dCB9ID0gaW5wdXRzO1xuICAgIGlmIChpbnB1dC5kdHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnB1dCBtdXN0IGJlIG9mIGRhdGF0eXBlIHN0cmluZycpO1xuICAgIH1cbiAgICBpZiAobnVtQnVja2V0cyA8PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTnVtYmVyIG9mIGJ1Y2tldHMgbXVzdCBiZSBhdCBsZWFzdCAxYCk7XG4gICAgfVxuICAgIGNvbnN0ICRpbnB1dCA9IGJhY2tlbmQuZGF0YS5nZXQoaW5wdXQuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3Qgb3V0cHV0ID0gc3RyaW5nVG9IYXNoQnVja2V0RmFzdEltcGwoJGlucHV0LCBudW1CdWNrZXRzKTtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhpbnB1dC5zaGFwZSwgJ2ludDMyJywgb3V0cHV0KTtcbn1cbmV4cG9ydCBjb25zdCBzdHJpbmdUb0hhc2hCdWNrZXRGYXN0Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFN0cmluZ1RvSGFzaEJ1Y2tldEZhc3QsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3QsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3RyaW5nVG9IYXNoQnVja2V0RmFzdC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdUb0hhc2hCdWNrZXRGYXN0SW1wbChpbnB1dCwgbnVtQnVja2V0cykge1xuICAgIGNvbnN0IG91dHB1dCA9IHV0aWwuZ2V0QXJyYXlGcm9tRFR5cGUoJ2ludDMyJywgaW5wdXQubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgKytpKSB7XG4gICAgICAgIG91dHB1dFtpXSA9XG4gICAgICAgICAgICB1dGlsLmZpbmdlclByaW50NjQoaW5wdXRbaV0pLm1vZHVsbyhudW1CdWNrZXRzKS5nZXRMb3dCaXRzVW5zaWduZWQoKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RfaW1wbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTdWIgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMsIGNyZWF0ZUNvbXBsZXhCaW5hcnlLZXJuZWxJbXBsIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBzdWJJbXBsID0gY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoKGFWYWx1ZSwgYlZhbHVlKSA9PiBhVmFsdWUgLSBiVmFsdWUpKTtcbmV4cG9ydCBjb25zdCBzdWJDb21wbGV4SW1wbCA9IGNyZWF0ZUNvbXBsZXhCaW5hcnlLZXJuZWxJbXBsKCgoYVJlYWwsIGFJbWFnLCBiUmVhbCwgYkltYWcpID0+IHtcbiAgICByZXR1cm4geyByZWFsOiBhUmVhbCAtIGJSZWFsLCBpbWFnOiBhSW1hZyAtIGJJbWFnIH07XG59KSk7XG5leHBvcnQgY29uc3Qgc3ViID0gYmluYXJ5S2VybmVsRnVuYyhTdWIsIHN1YkltcGwsIHN1YkNvbXBsZXhJbXBsKTtcbmV4cG9ydCBjb25zdCBzdWJDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU3ViLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBzdWJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdWIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBTdW0sIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7IHplcm9zIH0gZnJvbSAnLi4vdXRpbHMvemVyb3NfaW1wbCc7XG5pbXBvcnQgeyBjYXN0IH0gZnJvbSAnLi9DYXN0JztcbmltcG9ydCB7IGlkZW50aXR5IH0gZnJvbSAnLi9JZGVudGl0eSc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7IHRyYW5zcG9zZSB9IGZyb20gJy4vVHJhbnNwb3NlJztcbmV4cG9ydCBmdW5jdGlvbiBzdW0oYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGF4aXMsIGtlZXBEaW1zIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KHgsICdzdW0nKTtcbiAgICBsZXQgJHg7XG4gICAgaWYgKHguZHR5cGUgPT09ICdib29sJykge1xuICAgICAgICAkeCA9IGNhc3QoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kLCBhdHRyczogeyBkdHlwZTogJ2ludDMyJyB9IH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgJHggPSBpZGVudGl0eSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQgfSk7XG4gICAgfVxuICAgIGNvbnN0IHhSYW5rID0gJHguc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IGF4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsICR4LnNoYXBlKTtcbiAgICBjb25zdCBwZXJtdXRhdGlvbiA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oYXhlcywgeFJhbmspO1xuICAgIGxldCByZWR1Y3Rpb25BeGVzID0gYXhlcztcbiAgICBsZXQgcGVybXV0ZWRYID0gJHg7XG4gICAgaWYgKHBlcm11dGF0aW9uICE9IG51bGwpIHtcbiAgICAgICAgcGVybXV0ZWRYID1cbiAgICAgICAgICAgIHRyYW5zcG9zZSh7IGlucHV0czogeyB4OiAkeCB9LCBiYWNrZW5kLCBhdHRyczogeyBwZXJtOiBwZXJtdXRhdGlvbiB9IH0pO1xuICAgICAgICByZWR1Y3Rpb25BeGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMocmVkdWN0aW9uQXhlcy5sZW5ndGgsIHhSYW5rKTtcbiAgICB9XG4gICAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdzdW0nLCByZWR1Y3Rpb25BeGVzLCBwZXJtdXRlZFguc2hhcGUubGVuZ3RoKTtcbiAgICBjb25zdCBbb3V0U2hhcGUsIHJlZHVjZVNoYXBlXSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKHBlcm11dGVkWC5zaGFwZSwgcmVkdWN0aW9uQXhlcyk7XG4gICAgY29uc3QgcmVzdWx0RHR5cGUgPSBiYWNrZW5kX3V0aWwudXBjYXN0VHlwZShwZXJtdXRlZFguZHR5cGUsICdpbnQzMicpO1xuICAgIGxldCByZXN1bHQgPSB6ZXJvcyhiYWNrZW5kLCBvdXRTaGFwZSwgcmVzdWx0RHR5cGUpO1xuICAgIGNvbnN0IHJlZHVjZVNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuICAgIGNvbnN0IHZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHJlc3VsdC5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBhVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQocGVybXV0ZWRYLmRhdGFJZCkudmFsdWVzO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBpICogcmVkdWNlU2l6ZTtcbiAgICAgICAgbGV0IHN1bSA9IDA7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmVkdWNlU2l6ZTsgKytqKSB7XG4gICAgICAgICAgICBzdW0gKz0gYVZhbHNbb2Zmc2V0ICsgal07XG4gICAgICAgIH1cbiAgICAgICAgdmFsc1tpXSA9IHN1bTtcbiAgICB9XG4gICAgaWYgKGtlZXBEaW1zKSB7XG4gICAgICAgIGNvbnN0IG5ld1NoYXBlID0gYmFja2VuZF91dGlsLmV4cGFuZFNoYXBlVG9LZWVwRGltKHJlc3VsdC5zaGFwZSwgYXhlcyk7XG4gICAgICAgIGNvbnN0IG9sZFJlc3VsdCA9IHJlc3VsdDtcbiAgICAgICAgcmVzdWx0ID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiByZXN1bHQgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IG5ld1NoYXBlIH0gfSk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ob2xkUmVzdWx0KTtcbiAgICB9XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbygkeCk7XG4gICAgaWYgKHBlcm11dGF0aW9uICE9IG51bGwpIHtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhwZXJtdXRlZFgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGNvbnN0IHN1bUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTdW0sXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHN1bVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN1bS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgVGFuIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCB0YW4gPSB1bmFyeUtlcm5lbEZ1bmMoVGFuLCAoeGkpID0+IE1hdGgudGFuKHhpKSk7XG5leHBvcnQgY29uc3QgdGFuQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFRhbixcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogdGFuLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRhbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgVGFuaCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgdGFuaCA9IHVuYXJ5S2VybmVsRnVuYyhUYW5oLCAoeGkpID0+IE1hdGgudGFuaCh4aSkpO1xuZXhwb3J0IGNvbnN0IHRhbmhDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogVGFuaCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogdGFuaCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1UYW5oLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFRpbGUgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7IHRpbGVJbXBsIH0gZnJvbSAnLi9UaWxlX2ltcGwnO1xuZXhwb3J0IGZ1bmN0aW9uIHRpbGUoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHJlcHMgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ3RpbGUnKTtcbiAgICBjb25zdCBvdXRCdWYgPSB0aWxlSW1wbChiYWNrZW5kLmJ1ZmZlclN5bmMoeCksIHJlcHMpO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dEJ1Zi5zaGFwZSwgb3V0QnVmLmR0eXBlLCBvdXRCdWYudmFsdWVzKTtcbn1cbmV4cG9ydCBjb25zdCB0aWxlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFRpbGUsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHRpbGVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1UaWxlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJ1ZmZlciB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG4vKipcbiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSB0aWxlIGtlcm5lbCBzaGFyZWQgYmV0d2VlbiB3ZWJnbCBhbmQgY3B1IGZvciBzdHJpbmdcbiAqIHRlbnNvcnMgb25seS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRpbGVJbXBsKHhCdWYsIHJlcHMpIHtcbiAgICBjb25zdCBuZXdTaGFwZSA9IG5ldyBBcnJheSh4QnVmLnJhbmspO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3U2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbmV3U2hhcGVbaV0gPSB4QnVmLnNoYXBlW2ldICogcmVwc1tpXTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gYnVmZmVyKG5ld1NoYXBlLCB4QnVmLmR0eXBlKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdC52YWx1ZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3QgbmV3TG9jID0gcmVzdWx0LmluZGV4VG9Mb2MoaSk7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsTG9jID0gbmV3IEFycmF5KHhCdWYucmFuayk7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgb3JpZ2luYWxMb2MubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIG9yaWdpbmFsTG9jW2pdID0gbmV3TG9jW2pdICUgeEJ1Zi5zaGFwZVtqXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcmlnaW5hbEluZGV4ID0geEJ1Zi5sb2NUb0luZGV4KG9yaWdpbmFsTG9jKTtcbiAgICAgICAgcmVzdWx0LnZhbHVlc1tpXSA9IHhCdWYudmFsdWVzW29yaWdpbmFsSW5kZXhdO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VGlsZV9pbXBsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFRvcEsgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7IHRvcEtJbXBsIH0gZnJvbSAnLi9Ub3BLX2ltcGwnO1xuZXhwb3J0IGZ1bmN0aW9uIHRvcEsoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGssIHNvcnRlZCB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleCh4LCAndG9waycpO1xuICAgIGNvbnN0IHhWYWxzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IFthbGxUb3BLVmFscywgYWxsVG9wS0luZGljZXNdID0gdG9wS0ltcGwoeFZhbHMsIHguc2hhcGUsIHguZHR5cGUsIGssIHNvcnRlZCk7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhhbGxUb3BLVmFscy5zaGFwZSwgYWxsVG9wS1ZhbHMuZHR5cGUsIGFsbFRvcEtWYWxzLnZhbHVlcyksXG4gICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oYWxsVG9wS0luZGljZXMuc2hhcGUsIGFsbFRvcEtJbmRpY2VzLmR0eXBlLCBhbGxUb3BLSW5kaWNlcy52YWx1ZXMpXG4gICAgXTtcbn1cbmV4cG9ydCBjb25zdCB0b3BLQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFRvcEssXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHRvcEtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ub3BLLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVG9wSyBrZXJuZWwgc2hhcmVkIGJldHdlZW4gd2ViZ2wgYW5kIGNwdS4gKi9cbmltcG9ydCB7IGJ1ZmZlciwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5jb25zdCBjb21wYXJlUGFpciA9IChhLCBiKSA9PiB7XG4gICAgY29uc3QgdmFsdWVEaWZmID0gYi52YWx1ZSAtIGEudmFsdWU7XG4gICAgcmV0dXJuIHZhbHVlRGlmZiA9PT0gMCA/IGEuaW5kZXggLSBiLmluZGV4IDogdmFsdWVEaWZmO1xufTtcbi8qKlxuICogUGFydGl0aW9ucyBhcnJheSB3aGVyZSBhbGwgZWxlbWVudHMgc21hbGxlciB0aGFuIHRoZSAoaysxKSBzbWFsbGVzdCBlbGVtZW50XG4gKiBhcmUgZm91bmQgdG8gdGhlIGxlZnQgb2YgaXQsIGFuZCBhbGwgbGFyZ2VyIHRvIHRoZSByaWdodCBvZiBpdC5cbiAqIEJhc2VkIG9uIHRoZSBGbG95ZC1SaXZlc3QgQWxnb3JpdGhtLCByZWY6XG4gKiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9GbG95ZCVFMiU4MCU5M1JpdmVzdF9hbGdvcml0aG1cbiAqIEBwYXJhbSBhcnJheTogQXJyYXkgdG8gcGFydGl0aW9uXG4gKiBAcGFyYW0gbGVmdDogTGVmdCBpbmRleCBmb3IgdGhlIGludGVydmFsXG4gKiBAcGFyYW0gcmlnaHQ6IFJpZ2h0IGluZGV4IGZvciB0aGUgaW50ZXJ2YWxcbiAqIEBwYXJhbSBrOiBEZXNpcmVkIGluZGV4IHZhbHVlLCB3aGVyZSBhcnJheVtrXSBpcyB0aGUgKGsrMSl0aCBzbWFsbGVzdCBlbGVtZW50XG4gKiAgICAgICAgICAgd2hlbiBsZWZ0ID0gMFxuICovXG5mdW5jdGlvbiBzZWxlY3QoYXJyYXksIGssIGxlZnQgPSAwLCByaWdodCA9IGFycmF5Lmxlbmd0aCAtIDEpIHtcbiAgICB3aGlsZSAocmlnaHQgPiBsZWZ0KSB7XG4gICAgICAgIC8vIFVzZSBzZWxlY3QgcmVjdXJzaXZlbHkgdG8gc2FtcGxlIGEgc21hbGxlciBzZXQgb2Ygc2l6ZSBzXG4gICAgICAgIC8vIHRoZSBhcmJpdHJhcnkgY29uc3RhbnRzIDYwMCBhbmQgMC41IGFyZSB1c2VkIGluIHRoZSBvcmlnaW5hbFxuICAgICAgICAvLyB2ZXJzaW9uIHRvIG1pbmltaXplIGV4ZWN1dGlvbiB0aW1lLlxuICAgICAgICBpZiAocmlnaHQgLSBsZWZ0ID4gNjAwKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gcmlnaHQgLSBsZWZ0ICsgMTtcbiAgICAgICAgICAgIGNvbnN0IGkgPSBrIC0gbGVmdCArIDE7XG4gICAgICAgICAgICBjb25zdCB6ID0gTWF0aC5sb2cobik7XG4gICAgICAgICAgICBjb25zdCBzID0gMC41ICogTWF0aC5leHAoMiAqIHogLyAzKTtcbiAgICAgICAgICAgIGNvbnN0IHNkID0gMC41ICogTWF0aC5zcXJ0KHogKiBzICogKG4gLSBzKSAvIG4pICogTWF0aC5zaWduKGkgLSBuIC8gMik7XG4gICAgICAgICAgICBjb25zdCBuZXdMZWZ0ID0gTWF0aC5tYXgobGVmdCwgTWF0aC5mbG9vcihrIC0gaSAqIHMgLyBuICsgc2QpKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld1JpZ2h0ID0gTWF0aC5taW4ocmlnaHQsIE1hdGguZmxvb3IoayArIChuIC0gaSkgKiBzIC8gbiArIHNkKSk7XG4gICAgICAgICAgICBzZWxlY3QoYXJyYXksIGssIG5ld0xlZnQsIG5ld1JpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBwYXJ0aXRpb24gdGhlIGVsZW1lbnRzIGJldHdlZW4gbGVmdCBhbmQgcmlnaHQgYXJvdW5kIHRcbiAgICAgICAgY29uc3QgdCA9IGFycmF5W2tdO1xuICAgICAgICBsZXQgaSA9IGxlZnQ7XG4gICAgICAgIGxldCBqID0gcmlnaHQ7XG4gICAgICAgIHV0aWwuc3dhcChhcnJheSwgbGVmdCwgayk7XG4gICAgICAgIGlmIChjb21wYXJlUGFpcihhcnJheVtyaWdodF0sIHQpID4gMCkge1xuICAgICAgICAgICAgdXRpbC5zd2FwKGFycmF5LCBsZWZ0LCByaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGkgPCBqKSB7XG4gICAgICAgICAgICB1dGlsLnN3YXAoYXJyYXksIGksIGopO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgai0tO1xuICAgICAgICAgICAgd2hpbGUgKGNvbXBhcmVQYWlyKGFycmF5W2ldLCB0KSA8IDApIHtcbiAgICAgICAgICAgICAgICBpID0gaSArIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aGlsZSAoY29tcGFyZVBhaXIoYXJyYXlbal0sIHQpID4gMCkge1xuICAgICAgICAgICAgICAgIGogPSBqIC0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tcGFyZVBhaXIoYXJyYXlbbGVmdF0sIHQpID09PSAwKSB7XG4gICAgICAgICAgICB1dGlsLnN3YXAoYXJyYXksIGxlZnQsIGopO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaiA9IGogKyAxO1xuICAgICAgICAgICAgdXRpbC5zd2FwKGFycmF5LCBqLCByaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQWRqdXN0IGxlZnQgYW5kIHJpZ2h0IHRvd2FyZHMgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIHN1YnNldFxuICAgICAgICAvLyBjb250YWluaW5nIHRoZSAoayAtIGxlZnQgKyAxKXRoIHNtYWxsZXN0IGVsZW1lbnQuXG4gICAgICAgIGlmIChqIDw9IGspIHtcbiAgICAgICAgICAgIGxlZnQgPSBqICsgMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoayA8PSBqKSB7XG4gICAgICAgICAgICByaWdodCA9IGogLSAxO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHRvcEtJbXBsKHgsIHhTaGFwZSwgeER0eXBlLCBrLCBzb3J0ZWQpIHtcbiAgICAvLyBSZXNoYXBlIGludG8gYSAyZCB0ZW5zb3IgW2JhdGNoLCBsYXN0RGltXSBhbmQgY29tcHV0ZSB0b3BrIGFsb25nIGxhc3REaW0uXG4gICAgY29uc3QgbGFzdERpbSA9IHhTaGFwZVt4U2hhcGUubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgW2JhdGNoLCBzaXplXSA9IFt4Lmxlbmd0aCAvIGxhc3REaW0sIGxhc3REaW1dO1xuICAgIGNvbnN0IGFsbFRvcEtWYWxzID0gdXRpbC5nZXRUeXBlZEFycmF5RnJvbURUeXBlKHhEdHlwZSwgYmF0Y2ggKiBrKTtcbiAgICBjb25zdCBhbGxUb3BLSW5kaWNlcyA9IHV0aWwuZ2V0VHlwZWRBcnJheUZyb21EVHlwZSgnaW50MzInLCBiYXRjaCAqIGspO1xuICAgIGZvciAobGV0IGIgPSAwOyBiIDwgYmF0Y2g7IGIrKykge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBiICogc2l6ZTtcbiAgICAgICAgY29uc3QgdmFscyA9IHguc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyBzaXplKTtcbiAgICAgICAgbGV0IHZhbEFuZEluZCA9IG5ldyBBcnJheSh2YWxzLmxlbmd0aCk7XG4gICAgICAgIHZhbHMuZm9yRWFjaCgodmFsdWUsIGluZGV4KSA9PiB2YWxBbmRJbmRbaW5kZXhdID0geyB2YWx1ZSwgaW5kZXggfSk7XG4gICAgICAgIGlmIChrIDwgdmFsQW5kSW5kLmxlbmd0aCkge1xuICAgICAgICAgICAgc2VsZWN0KHZhbEFuZEluZCwgayk7XG4gICAgICAgICAgICB2YWxBbmRJbmQgPSB2YWxBbmRJbmQuc2xpY2UoMCwgayk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNvcnRlZCkge1xuICAgICAgICAgICAgdmFsQW5kSW5kLnNvcnQoY29tcGFyZVBhaXIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG91dE9mZnNldCA9IGIgKiBrO1xuICAgICAgICBjb25zdCB0b3BLVmFscyA9IGFsbFRvcEtWYWxzLnN1YmFycmF5KG91dE9mZnNldCwgb3V0T2Zmc2V0ICsgayk7XG4gICAgICAgIGNvbnN0IHRvcEtJbmRpY2VzID0gYWxsVG9wS0luZGljZXMuc3ViYXJyYXkob3V0T2Zmc2V0LCBvdXRPZmZzZXQgKyBrKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrOyBpKyspIHtcbiAgICAgICAgICAgIHRvcEtWYWxzW2ldID0gdmFsQW5kSW5kW2ldLnZhbHVlO1xuICAgICAgICAgICAgdG9wS0luZGljZXNbaV0gPSB2YWxBbmRJbmRbaV0uaW5kZXg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gUmVzaGFwZSBiYWNrIHRvIHRoZSBvcmlnaW5hbCBpbnB1dCBzaGFwZSwgZXhjZXB0IHRoYXQgdGhlIGxhc3RcbiAgICAvLyBkaW1lbnNpb24gaXMgay5cbiAgICBjb25zdCBvdXRwdXRTaGFwZSA9IHhTaGFwZS5zbGljZSgpO1xuICAgIG91dHB1dFNoYXBlW291dHB1dFNoYXBlLmxlbmd0aCAtIDFdID0gaztcbiAgICByZXR1cm4gW1xuICAgICAgICBidWZmZXIob3V0cHV0U2hhcGUsIHhEdHlwZSwgYWxsVG9wS1ZhbHMpLFxuICAgICAgICBidWZmZXIob3V0cHV0U2hhcGUsICdpbnQzMicsIGFsbFRvcEtJbmRpY2VzKVxuICAgIF07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ub3BLX2ltcGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgVHJhbnNmb3JtLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm0oYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBhdHRycywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IGltYWdlLCB0cmFuc2Zvcm1zIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBpbnRlcnBvbGF0aW9uLCBmaWxsTW9kZSwgZmlsbFZhbHVlLCBvdXRwdXRTaGFwZSB9ID0gYXR0cnM7XG4gICAgY29uc3QgW2JhdGNoLCBpbWFnZUhlaWdodCwgaW1hZ2VXaWR0aCwgbnVtQ2hhbm5lbHNdID0gaW1hZ2Uuc2hhcGU7XG4gICAgY29uc3QgW291dEhlaWdodCwgb3V0V2lkdGhdID0gb3V0cHV0U2hhcGUgIT0gbnVsbCA/IG91dHB1dFNoYXBlIDogW2ltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoXTtcbiAgICBjb25zdCBvdXRTaGFwZSA9IFtiYXRjaCwgb3V0SGVpZ2h0LCBvdXRXaWR0aCwgbnVtQ2hhbm5lbHNdO1xuICAgIGNvbnN0IHN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGltYWdlLnNoYXBlKTtcbiAgICBjb25zdCBiYXRjaFN0cmlkZSA9IHN0cmlkZXNbMF07XG4gICAgY29uc3Qgcm93U3RyaWRlID0gc3RyaWRlc1sxXTtcbiAgICBjb25zdCBjb2xTdHJpZGUgPSBzdHJpZGVzWzJdO1xuICAgIGNvbnN0IG91dFZhbHMgPSB1dGlsLmdldFR5cGVkQXJyYXlGcm9tRFR5cGUoaW1hZ2UuZHR5cGUsIHV0aWwuc2l6ZUZyb21TaGFwZShvdXRTaGFwZSkpO1xuICAgIG91dFZhbHMuZmlsbChmaWxsVmFsdWUpO1xuICAgIGNvbnN0IGltYWdlVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoaW1hZ2UuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgdHJhbnNmb3JtVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQodHJhbnNmb3Jtcy5kYXRhSWQpLnZhbHVlcztcbiAgICAvLyBSZWYgVEYgaW1wbGVtZW50YXRpb246XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yZmxvdy9ibG9iL21hc3Rlci90ZW5zb3JmbG93L2NvcmUva2VybmVscy9pbWFnZS9pbWFnZV9vcHMuaFxuICAgIGZvciAobGV0IGIgPSAwOyBiIDwgYmF0Y2g7ICsrYikge1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSB0cmFuc2Zvcm1zLnNoYXBlWzBdID09PSAxID9cbiAgICAgICAgICAgIHRyYW5zZm9ybVZhbHMgOlxuICAgICAgICAgICAgdHJhbnNmb3JtVmFscy5zdWJhcnJheShiICogOCwgYiAqIDggKyA4KTtcbiAgICAgICAgZm9yIChsZXQgb3V0WSA9IDA7IG91dFkgPCBvdXRIZWlnaHQ7ICsrb3V0WSkge1xuICAgICAgICAgICAgZm9yIChsZXQgb3V0WCA9IDA7IG91dFggPCBvdXRXaWR0aDsgKytvdXRYKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBudW1DaGFubmVsczsgKytjaGFubmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWw7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb2plY3Rpb24gPSB0cmFuc2Zvcm1bNl0gKiBvdXRYICsgdHJhbnNmb3JtWzddICogb3V0WSArIDE7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9qZWN0aW9uID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIGZpbGwgdmFsdWUgZm9yIGluZmluaXRlIGNvb3JkaW5hdGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggYXJlIG91dHNpZGUgdGhlIGlucHV0IGltYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpblggPSAodHJhbnNmb3JtWzBdICogb3V0WCArIHRyYW5zZm9ybVsxXSAqIG91dFkgKyB0cmFuc2Zvcm1bMl0pIC9cbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3Rpb247XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGluWSA9ICh0cmFuc2Zvcm1bM10gKiBvdXRYICsgdHJhbnNmb3JtWzRdICogb3V0WSArIHRyYW5zZm9ybVs1XSkgL1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeCA9IG1hcENvb3JkKGluWCwgaW1hZ2VXaWR0aCwgZmlsbE1vZGUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB5ID0gbWFwQ29vcmQoaW5ZLCBpbWFnZUhlaWdodCwgZmlsbE1vZGUpO1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGludGVycG9sYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ25lYXJlc3QnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IG5lYXJlc3RJbnRlcnBvbGF0aW9uKGltYWdlVmFscywgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIGJhdGNoU3RyaWRlLCByb3dTdHJpZGUsIGNvbFN0cmlkZSwgYiwgeSwgeCwgY2hhbm5lbCwgZmlsbFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2JpbGluZWFyJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBiaWxpbmVhckludGVycG9sYXRpb24oaW1hZ2VWYWxzLCBpbWFnZUhlaWdodCwgaW1hZ2VXaWR0aCwgYmF0Y2hTdHJpZGUsIHJvd1N0cmlkZSwgY29sU3RyaWRlLCBiLCB5LCB4LCBjaGFubmVsLCBmaWxsVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIFRyYW5zZm9ybTogRXhwZWN0ICduZWFyZXN0JyBvciBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYCdiaWxpbmVhcicsIGJ1dCBnb3QgJHtpbnRlcnBvbGF0aW9ufWApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZCA9IGIgKiBiYXRjaFN0cmlkZSArIG91dFkgKiByb3dTdHJpZGUgKyBvdXRYICogY29sU3RyaWRlICsgY2hhbm5lbDtcbiAgICAgICAgICAgICAgICAgICAgb3V0VmFsc1tpbmRdID0gdmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRTaGFwZSwgaW1hZ2UuZHR5cGUsIG91dFZhbHMpO1xuICAgIH1cbiAgICBjb25zdCBkYXRhSWQgPSBiYWNrZW5kLndyaXRlKG91dFZhbHMsIG91dFNoYXBlLCBpbWFnZS5kdHlwZSk7XG4gICAgcmV0dXJuIHsgZGF0YUlkLCBzaGFwZTogaW1hZ2Uuc2hhcGUsIGR0eXBlOiBpbWFnZS5kdHlwZSB9O1xufVxuZXhwb3J0IGNvbnN0IHRyYW5zZm9ybUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBUcmFuc2Zvcm0sXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHRyYW5zZm9ybVxufTtcbmZ1bmN0aW9uIG1hcENvb3JkKG91dENvb3JkLCBsZW4sIG1vZGUpIHtcbiAgICBzd2l0Y2ggKG1vZGUpIHtcbiAgICAgICAgY2FzZSAncmVmbGVjdCc6XG4gICAgICAgICAgICByZXR1cm4gbWFwQ29vcmRSZWZsZWN0KG91dENvb3JkLCBsZW4pO1xuICAgICAgICBjYXNlICd3cmFwJzpcbiAgICAgICAgICAgIHJldHVybiBtYXBDb29yZFdyYXAob3V0Q29vcmQsIGxlbik7XG4gICAgICAgIGNhc2UgJ25lYXJlc3QnOlxuICAgICAgICAgICAgcmV0dXJuIG1hcENvb3JkTmVhcmVzdChvdXRDb29yZCwgbGVuKTtcbiAgICAgICAgY2FzZSAnY29uc3RhbnQnOlxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIG1hcENvb3JkQ29uc3RhbnQob3V0Q29vcmQsIGxlbik7XG4gICAgfVxufVxuZnVuY3Rpb24gbWFwQ29vcmRSZWZsZWN0KG91dENvb3JkLCBsZW4pIHtcbiAgICAvLyBSZWZsZWN0IFthYmNkXSB0byBbZGNiYXxhYmNkfGRjYmFdLlxuICAgIGxldCBpbkNvb3JkID0gb3V0Q29vcmQ7XG4gICAgaWYgKGluQ29vcmQgPCAwKSB7XG4gICAgICAgIGlmIChsZW4gPD0gMSkge1xuICAgICAgICAgICAgaW5Db29yZCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzejIgPSAyICogbGVuO1xuICAgICAgICAgICAgaWYgKGluQ29vcmQgPCBzejIpIHtcbiAgICAgICAgICAgICAgICBpbkNvb3JkID0gc3oyICogTWF0aC50cnVuYygtaW5Db29yZCAvIHN6MikgKyBpbkNvb3JkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5Db29yZCA9IGluQ29vcmQgPCAtbGVuID8gaW5Db29yZCArIHN6MiA6IC1pbkNvb3JkIC0gMTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChpbkNvb3JkID4gbGVuIC0gMSkge1xuICAgICAgICBpZiAobGVuIDw9IDEpIHtcbiAgICAgICAgICAgIGluQ29vcmQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc3oyID0gMiAqIGxlbjtcbiAgICAgICAgICAgIGluQ29vcmQgLT0gc3oyICogTWF0aC50cnVuYyhpbkNvb3JkIC8gc3oyKTtcbiAgICAgICAgICAgIGlmIChpbkNvb3JkID49IGxlbikge1xuICAgICAgICAgICAgICAgIGluQ29vcmQgPSBzejIgLSBpbkNvb3JkIC0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBjbGFtcCBpcyBuZWNlc3NhcnkgYmVjYXVzZSB3aGVuIG91dENvb3JkID0gMy41IGFuZCBsZW4gPSA0LFxuICAgIC8vIGluQ29vcmQgPSAzLjUgYW5kIHdpbGwgYmUgcm91bmRlZCB0byA0IGluIG5lYXJlc3QgaW50ZXJwb2xhdGlvbi5cbiAgICByZXR1cm4gdXRpbC5jbGFtcCgwLCBpbkNvb3JkLCBsZW4gLSAxKTtcbn1cbmZ1bmN0aW9uIG1hcENvb3JkV3JhcChvdXRDb29yZCwgbGVuKSB7XG4gICAgLy8gV3JhcCBbYWJjZF0gdG8gW2FiY2R8YWJjZHxhYmNkXS5cbiAgICBsZXQgaW5Db29yZCA9IG91dENvb3JkO1xuICAgIGlmIChpbkNvb3JkIDwgMCkge1xuICAgICAgICBpZiAobGVuIDw9IDEpIHtcbiAgICAgICAgICAgIGluQ29vcmQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc3ogPSBsZW4gLSAxO1xuICAgICAgICAgICAgaW5Db29yZCArPSBsZW4gKiAoTWF0aC50cnVuYygtaW5Db29yZCAvIHN6KSArIDEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGluQ29vcmQgPiBsZW4gLSAxKSB7XG4gICAgICAgIGlmIChsZW4gPD0gMSkge1xuICAgICAgICAgICAgaW5Db29yZCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzeiA9IGxlbiAtIDE7XG4gICAgICAgICAgICBpbkNvb3JkIC09IGxlbiAqIE1hdGgudHJ1bmMoaW5Db29yZCAvIHN6KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBjbGFtcCBpcyBuZWNlc3NhcnkgYmVjYXVzZSB3aGVuIG91dENvb3JkID0gLTAuNSBhbmQgbGVuID0gNCxcbiAgICAvLyBpbkNvb3JkID0gMy41IGFuZCB3aWxsIGJlIHJvdW5kZWQgdG8gNCBpbiBuZWFyZXN0IGludGVycG9sYXRpb24uXG4gICAgcmV0dXJuIHV0aWwuY2xhbXAoMCwgaW5Db29yZCwgbGVuIC0gMSk7XG59XG5mdW5jdGlvbiBtYXBDb29yZENvbnN0YW50KG91dENvb3JkLCBsZW4pIHtcbiAgICByZXR1cm4gb3V0Q29vcmQ7XG59XG5mdW5jdGlvbiBtYXBDb29yZE5lYXJlc3Qob3V0Q29vcmQsIGxlbikge1xuICAgIHJldHVybiB1dGlsLmNsYW1wKDAsIG91dENvb3JkLCBsZW4gLSAxKTtcbn1cbmZ1bmN0aW9uIHJlYWRXaXRoRmlsbFZhbHVlKGltYWdlVmFscywgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIGJhdGNoU3RyaWRlLCByb3dTdHJpZGUsIGNvbFN0cmlkZSwgYmF0Y2gsIHksIHgsIGNoYW5uZWwsIGZpbGxWYWx1ZSkge1xuICAgIGNvbnN0IGluZCA9IGJhdGNoICogYmF0Y2hTdHJpZGUgKyB5ICogcm93U3RyaWRlICsgeCAqIGNvbFN0cmlkZSArIGNoYW5uZWw7XG4gICAgaWYgKDAgPD0geSAmJiB5IDwgaW1hZ2VIZWlnaHQgJiYgMCA8PSB4ICYmIHggPCBpbWFnZVdpZHRoKSB7XG4gICAgICAgIHJldHVybiBpbWFnZVZhbHNbaW5kXTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBmaWxsVmFsdWU7XG4gICAgfVxufVxuZnVuY3Rpb24gbmVhcmVzdEludGVycG9sYXRpb24oaW1hZ2VWYWxzLCBpbWFnZUhlaWdodCwgaW1hZ2VXaWR0aCwgYmF0Y2hTdHJpZGUsIHJvd1N0cmlkZSwgY29sU3RyaWRlLCBiYXRjaCwgeSwgeCwgY2hhbm5lbCwgZmlsbFZhbHVlKSB7XG4gICAgY29uc3QgJHkgPSBNYXRoLnJvdW5kKHkpO1xuICAgIGNvbnN0ICR4ID0gTWF0aC5yb3VuZCh4KTtcbiAgICByZXR1cm4gcmVhZFdpdGhGaWxsVmFsdWUoaW1hZ2VWYWxzLCBpbWFnZUhlaWdodCwgaW1hZ2VXaWR0aCwgYmF0Y2hTdHJpZGUsIHJvd1N0cmlkZSwgY29sU3RyaWRlLCBiYXRjaCwgJHksICR4LCBjaGFubmVsLCBmaWxsVmFsdWUpO1xufVxuZnVuY3Rpb24gYmlsaW5lYXJJbnRlcnBvbGF0aW9uKGltYWdlVmFscywgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIGJhdGNoU3RyaWRlLCByb3dTdHJpZGUsIGNvbFN0cmlkZSwgYmF0Y2gsIHksIHgsIGNoYW5uZWwsIGZpbGxWYWx1ZSkge1xuICAgIGNvbnN0IHlGbG9vciA9IE1hdGguZmxvb3IoeSk7XG4gICAgY29uc3QgeEZsb29yID0gTWF0aC5mbG9vcih4KTtcbiAgICBjb25zdCB5Q2VpbCA9IHlGbG9vciArIDE7XG4gICAgY29uc3QgeENlaWwgPSB4Rmxvb3IgKyAxO1xuICAgIC8vIGYoeCwgeUZsb29yKSA9ICh4Q2VpbCAtIHgpIC8gKHhDZWlsIC0geEZsb29yKSAqIGYoeEZsb29yLCB5Rmxvb3IpXG4gICAgLy8gICAgICAgICAgICAgICArICh4IC0geEZsb29yKSAvICh4Q2VpbCAtIHhGbG9vcikgKiBmKHhDZWlsLCB5Rmxvb3IpXG4gICAgY29uc3QgdmFsdWVZRmxvb3IgPSAoeENlaWwgLSB4KSAqXG4gICAgICAgIHJlYWRXaXRoRmlsbFZhbHVlKGltYWdlVmFscywgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIGJhdGNoU3RyaWRlLCByb3dTdHJpZGUsIGNvbFN0cmlkZSwgYmF0Y2gsIHlGbG9vciwgeEZsb29yLCBjaGFubmVsLCBmaWxsVmFsdWUpICtcbiAgICAgICAgKHggLSB4Rmxvb3IpICpcbiAgICAgICAgICAgIHJlYWRXaXRoRmlsbFZhbHVlKGltYWdlVmFscywgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIGJhdGNoU3RyaWRlLCByb3dTdHJpZGUsIGNvbFN0cmlkZSwgYmF0Y2gsIHlGbG9vciwgeENlaWwsIGNoYW5uZWwsIGZpbGxWYWx1ZSk7XG4gICAgLy8gZih4LCB5Q2VpbCkgPSAoeENlaWwgLSB4KSAvICh4Q2VpbCAtIHhGbG9vcikgKiBmKHhGbG9vciwgeUNlaWwpXG4gICAgLy8gICAgICAgICAgICAgKyAoeCAtIHhGbG9vcikgLyAoeENlaWwgLSB4Rmxvb3IpICogZih4Q2VpbCwgeUNlaWwpXG4gICAgY29uc3QgdmFsdWVZQ2VpbCA9ICh4Q2VpbCAtIHgpICpcbiAgICAgICAgcmVhZFdpdGhGaWxsVmFsdWUoaW1hZ2VWYWxzLCBpbWFnZUhlaWdodCwgaW1hZ2VXaWR0aCwgYmF0Y2hTdHJpZGUsIHJvd1N0cmlkZSwgY29sU3RyaWRlLCBiYXRjaCwgeUNlaWwsIHhGbG9vciwgY2hhbm5lbCwgZmlsbFZhbHVlKSArXG4gICAgICAgICh4IC0geEZsb29yKSAqXG4gICAgICAgICAgICByZWFkV2l0aEZpbGxWYWx1ZShpbWFnZVZhbHMsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBiYXRjaFN0cmlkZSwgcm93U3RyaWRlLCBjb2xTdHJpZGUsIGJhdGNoLCB5Q2VpbCwgeENlaWwsIGNoYW5uZWwsIGZpbGxWYWx1ZSk7XG4gICAgLy8gZih4LCB5KSA9ICh5Q2VpbCAtIHkpIC8gKHlDZWlsIC0geUZsb29yKSAqIGYoeCwgeUZsb29yKVxuICAgIC8vICAgICAgICAgKyAoeSAtIHlGbG9vcikgLyAoeUNlaWwgLSB5Rmxvb3IpICogZih4LCB5Q2VpbClcbiAgICByZXR1cm4gKHlDZWlsIC0geSkgKiB2YWx1ZVlGbG9vciArICh5IC0geUZsb29yKSAqIHZhbHVlWUNlaWw7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1UcmFuc2Zvcm0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgVHJhbnNwb3NlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyB0cmFuc3Bvc2VJbXBsIH0gZnJvbSAnLi9UcmFuc3Bvc2VfaW1wbCc7XG5leHBvcnQgZnVuY3Rpb24gdHJhbnNwb3NlKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYXR0cnMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBwZXJtIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KHgsICd0cmFuc3Bvc2UnKTtcbiAgICBjb25zdCB4UmFuayA9IHguc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IG5ld1NoYXBlID0gbmV3IEFycmF5KHhSYW5rKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld1NoYXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG5ld1NoYXBlW2ldID0geC5zaGFwZVtwZXJtW2ldXTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWVzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHJlc3VsdCA9IHRyYW5zcG9zZUltcGwodmFsdWVzLCB4LnNoYXBlLCB4LmR0eXBlLCBwZXJtLCBuZXdTaGFwZSk7XG4gICAgY29uc3QgZGF0YUlkID0gYmFja2VuZC53cml0ZShyZXN1bHQsIG5ld1NoYXBlLCB4LmR0eXBlKTtcbiAgICByZXR1cm4geyBkYXRhSWQsIHNoYXBlOiBuZXdTaGFwZSwgZHR5cGU6IHguZHR5cGUgfTtcbn1cbmV4cG9ydCBjb25zdCB0cmFuc3Bvc2VDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogVHJhbnNwb3NlLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiB0cmFuc3Bvc2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1UcmFuc3Bvc2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgZnVuY3Rpb24gdHJhbnNwb3NlSW1wbCh4VmFscywgeFNoYXBlLCBkdHlwZSwgcGVybSwgbmV3U2hhcGUpIHtcbiAgICBjb25zdCB4UmFuayA9IHhTaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgeFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoeFNoYXBlKTtcbiAgICBjb25zdCB4U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoeFNoYXBlKTtcbiAgICBjb25zdCBuZXdTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhuZXdTaGFwZSk7XG4gICAgY29uc3QgcmVzdWx0ID0gdXRpbC5nZXRUeXBlZEFycmF5RnJvbURUeXBlKGR0eXBlLCB1dGlsLnNpemVGcm9tU2hhcGUobmV3U2hhcGUpKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHhTaXplOyArK2kpIHtcbiAgICAgICAgY29uc3QgbG9jID0gdXRpbC5pbmRleFRvTG9jKGksIHhSYW5rLCB4U3RyaWRlcyk7XG4gICAgICAgIC8vIFBlcm11dGUgbG9jYXRpb24uXG4gICAgICAgIGNvbnN0IG5ld0xvYyA9IG5ldyBBcnJheShsb2MubGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdMb2MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIG5ld0xvY1tpXSA9IGxvY1twZXJtW2ldXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdJbmRleCA9IHV0aWwubG9jVG9JbmRleChuZXdMb2MsIHhSYW5rLCBuZXdTdHJpZGVzKTtcbiAgICAgICAgcmVzdWx0W25ld0luZGV4XSA9IHhWYWxzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VHJhbnNwb3NlX2ltcGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFVuaXF1ZSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHsgdW5pcXVlSW1wbCB9IGZyb20gJy4vVW5pcXVlX2ltcGwnO1xuZXhwb3J0IGZ1bmN0aW9uIHVuaXF1ZShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGF0dHJzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgYXhpcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleCh4LCAndW5pcXVlJyk7XG4gICAgY29uc3QgdmFsdWVzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHsgb3V0cHV0VmFsdWVzLCBvdXRwdXRTaGFwZSwgaW5kaWNlcyB9ID0gdW5pcXVlSW1wbCh2YWx1ZXMsIGF4aXMsIHguc2hhcGUsIHguZHR5cGUpO1xuICAgIHJldHVybiBbXG4gICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0cHV0U2hhcGUsIHguZHR5cGUsIG91dHB1dFZhbHVlcyksXG4gICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW2luZGljZXMubGVuZ3RoXSwgJ2ludDMyJywgaW5kaWNlcyksXG4gICAgXTtcbn1cbmV4cG9ydCBjb25zdCB1bmlxdWVDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogVW5pcXVlLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiB1bmlxdWUsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VW5pcXVlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFRlbnNvckJ1ZmZlciwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgZnVuY3Rpb24gdW5pcXVlSW1wbCh2YWx1ZXMsIGF4aXMsIHNoYXBlLCBkdHlwZSkge1xuICAgIC8vIE5vcm1hbGl6ZSBhbmQgdmFsaWRhdGUgYXhpcy5cbiAgICBjb25zdCAkYXhpcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgc2hhcGUpWzBdO1xuICAgIC8vIENhbGN1bGF0ZSB0aGUgbmV3IHNoYXBlIHRoYXQgaXMgc3VpdGFibGUgZm9yIGV4dHJhY3RpbmcgZGF0YSBhbG9uZyB0aGVcbiAgICAvLyBnaXZlbiBheGlzLlxuICAgIC8vXG4gICAgLy8gVGhlIHJhbmsgaXMgMy5cbiAgICAvLyBUaGUgc2l6ZSBvZiB0aGUgMXN0IGRpbWVuc2lvbiBpcyB0aGUgc2l6ZSBvZiBhbGwgdGhlIGF4ZXMgPCB0aGUgZ2l2ZW4gYXhpcy5cbiAgICAvLyBUaGUgc2l6ZSBvZiB0aGUgMm5kIGRpbWVuc2lvbiBpcyB0aGUgc2FtZSBhcyB0aGUgc2l6ZSBvZiB0aGUgZ2l2ZW4gYXhpcy5cbiAgICAvLyBUaGUgc2l6ZSBvZiB0aGUgM3JkIGRpbWVuc2lvbiBpcyB0aGUgc2l6ZSBvZiBhbGwgdGhlIGF4ZXMgPiB0aGUgZ2l2ZW4gYXhpcy5cbiAgICAvL1xuICAgIC8vIEZvciBleGFtcGxlLCBmb3IgYSA0RCB0ZW5zb3Igd2l0aCBzaGFwZT1bMiwgMywgNSwgNF0gYW5kIGF4aXM9MiwgdGhlXG4gICAgLy8gbmV3U2hhcGUgd291bGQgYmU6IFsyKjMsIDUsIDRdLlxuICAgIC8vXG4gICAgLy8gTm90ZSB0aGF0IHRoaXMgaXMgbm90IHRoZSBmaW5hbCBvdXRwdXQgc2hhcGUuIFRoaXMgd2lsbCBiZSB0aGUgc2hhcGUgZm9yIGFuXG4gICAgLy8gaW50ZXJtZWRpYXRlIFRlbnNvckJ1ZmZlciAoc2VlIGlucHV0QnVmZmVyIGJlbG93KSB0byBhbGxvdyB1cyB0byBleHRyYWN0XG4gICAgLy8gdmFsdWVzIGFsb25nIHRoZSBnaXZlbiBheGlzLiBUbyBkZW1vbnN0cmF0ZSBob3cgaXQgd29ya3MsIGNvbnNpZGVyIHRoZVxuICAgIC8vIGZvbGxvd2luZyBleGFtcGxlOlxuICAgIC8vXG4gICAgLy8gSW5wdXQ6IGEgM0QgdGVuc29yLCB3aXRoIHNoYXBlIFsxLCAyLCAzXVxuICAgIC8vIFtcbiAgICAvLyAgIFtcbiAgICAvLyAgICAgIFsxLDIsM10sXG4gICAgLy8gICAgICBbNCw1LDZdXG4gICAgLy8gICBdXG4gICAgLy8gXVxuICAgIC8vIEF4aXM6IDIgKHRoZSBsYXN0IGF4aXMpLlxuICAgIC8vIEFsb25nIGF4aXMgMiwgd2UgZXhwZWN0IHRvIGV4dHJhY3QgMyB0ZW5zb3JzOiBbMSw0XSwgWzIsNV0sIFszLDZdLlxuICAgIC8vXG4gICAgLy8gRm9yIHRoaXMgZXhhbXBsZSwgbmV3U2hhcGUgd291bGQgYmU6IFsyLCAzLCAxXSwgd2hlcmUgMiBpcyBjYWxjdWxhdGVkIGZyb21cbiAgICAvLyAxKjIuIFRoZSByZS1zaGFwZWQgZGF0YSB3b3VsZCBsb29rIGxpa2U6XG4gICAgLy9cbiAgICAvLyBbXG4gICAgLy8gICBbXG4gICAgLy8gICAgIFsxXSwgWzJdLCBbM11cbiAgICAvLyAgIF0sXG4gICAgLy8gICBbXG4gICAgLy8gICAgIFs0XSwgWzVdLCBbNl1cbiAgICAvLyAgIF1cbiAgICAvLyBdXG4gICAgLy9cbiAgICAvLyBUaGVuLCB3ZSBjYW4gY29uc3RydWN0IGEgMy1sZXZlbCBuZXN0ZWQgbG9vcCBieSB0aGUgZm9sbG93aW5nIGRpbWVuc2lvblxuICAgIC8vIG9yZGVyIHRvIGV4dHJhY3QgdGhlIHZhbHVlcyBhbG9uZyB0aGUgYXhpcyAoZGltZW5zaW9uMSk6XG4gICAgLy8gaTogZGltZW5zaW9uMSAgICAgICAvLyAwLDEsMiAobmV3U2hhcGVbMV0pXG4gICAgLy8gICBtOiBkaW1lbnNpb24wICAgICAvLyAwLDEgICAobmV3U2hhcGVbMF0pXG4gICAgLy8gICAgIG46IGRpbWVuc2lvbjIgICAvLyAwICAgICAobmV3U2hhcGVbMl0pXG4gICAgLy9cbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgbSwgaSwgblxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLVxuICAgIC8vIEl0ZXJhdGlvbiAwOiBkYXRhIGF0IFswLCAwLCAwXSA9PiBcIjFcIlxuICAgIC8vIEl0ZXJhdGlvbiAxOiBkYXRhIGF0IFsxLCAwLCAwXSA9PiBcIjRcIlxuICAgIC8vIFdlIGdvdCBbMSw0XS5cbiAgICAvLyBJdGVyYXRpb24gMjogZGF0YSBhdCBbMCwgMSwgMF0gPT4gXCIyXCJcbiAgICAvLyBJdGVyYXRpb24gMzogZGF0YSBhdCBbMSwgMSwgMF0gPT4gXCI1XCJcbiAgICAvLyBXZSBnb3QgWzIsNV0uXG4gICAgLy8gSXRlcmF0aW9uIDQ6IGRhdGEgYXQgWzAsIDIsIDBdID0+IFwiM1wiXG4gICAgLy8gSXRlcmF0aW9uIDU6IGRhdGEgYXQgWzEsIDIsIDBdID0+IFwiNlwiXG4gICAgLy8gV2UgZ290IFszLDZdLlxuICAgIGNvbnN0IG5ld1NoYXBlID0gWzEsIHNoYXBlWzBdLCAxXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8ICRheGlzOyBpKyspIHtcbiAgICAgICAgbmV3U2hhcGVbMF0gKj0gc2hhcGVbaV07XG4gICAgfVxuICAgIG5ld1NoYXBlWzFdID0gc2hhcGVbJGF4aXNdO1xuICAgIGZvciAobGV0IGkgPSAkYXhpcyArIDE7IGkgPCBzaGFwZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBuZXdTaGFwZVsyXSAqPSBzaGFwZVtpXTtcbiAgICB9XG4gICAgLy8gQSBtYXAgZnJvbSB1bmlxdWUgZWxlbWVudHMgKHRoZWlyIHN0cmluZyByZXByZXNlbnRhdGlvbnMpIHRvIHRoZWlyIHZhbHVlc1xuICAgIC8vIGluIFwiaW5kaWNlc1wiIChiZWxvdykuXG4gICAgY29uc3QgdW5pcXVlRWxlbWVudHMgPSB7fTtcbiAgICAvLyBUaGUgaW5kaWNlcyBvZiBlYWNoIHVuaXF1ZSBlbGVtZW50IGluIHRoZSBvcmlnaW5hbCB0ZW5zb3IgYWxvbmcgdGhlIGdpdmVuXG4gICAgLy8gYXhpcy4gSXQgaXMgMUQgYW5kIGhhcyB0aGUgc2FtZSBzaXplIGFzIHRoZSBnaXZlbiBheGlzLlxuICAgIGNvbnN0IGluZGljZXMgPSBuZXcgSW50MzJBcnJheShzaGFwZVskYXhpc10pO1xuICAgIC8vIENyZWF0ZSBhIGJ1ZmZlciBzbyB3ZSBjYW4gZWFzaWx5IGV4dHJhY3QgdmFsdWUgYXQgYSBnaXZlbiBsb2NhdGlvbi5cbiAgICBjb25zdCBpbnB1dEJ1ZmZlciA9IG5ldyBUZW5zb3JCdWZmZXIobmV3U2hhcGUsIGR0eXBlLCB2YWx1ZXMpO1xuICAgIC8vIFRoZSBpbmRpY2VzIGFsb25nIHRoZSBnaXZlbiBheGlzIHRoYXQgaGF2ZSB1bmlxdWUgZWxlbWVudHMuIFRoaXMgaXMgYVxuICAgIC8vIGRlLWR1cGVkIHZlcnNpb24gb2YgXCJpbmRpY2VzXCIgYWJvdmUuXG4gICAgY29uc3QgdW5pcXVlSW5kaWNlcyA9IFtdO1xuICAgIGNvbnN0IGlzMURUZW5zb3IgPSBuZXdTaGFwZVswXSA9PT0gMSAmJiBuZXdTaGFwZVsyXSA9PT0gMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNoYXBlWyRheGlzXTsgaSsrKSB7XG4gICAgICAgIC8vIEV4dHJhY3QgdmFsdWVzIGFsb25nIHRoZSBheGlzLlxuICAgICAgICBsZXQgZWxlbWVudDtcbiAgICAgICAgaWYgKGlzMURUZW5zb3IpIHtcbiAgICAgICAgICAgIC8vIEZhc3QgcGF0aCBmb3IgMUQgdGVuc29yIGlucHV0LlxuICAgICAgICAgICAgZWxlbWVudCA9IHZhbHVlc1tpXS50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgYXhpc1ZhbHVlcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgbSA9IDA7IG0gPCBuZXdTaGFwZVswXTsgbSsrKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBuZXdTaGFwZVsyXTsgbisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGF4aXNWYWx1ZXMucHVzaChpbnB1dEJ1ZmZlci5nZXQobSwgaSwgbikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsZW1lbnQgPSBheGlzVmFsdWVzLmpvaW4oJywnKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBEZWR1cCBhbmQgdXBkYXRlIHZhcmlvdXMgaW5kaWNlcy5cbiAgICAgICAgaWYgKHVuaXF1ZUVsZW1lbnRzW2VsZW1lbnRdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGluZGljZXNbaV0gPSB1bmlxdWVFbGVtZW50c1tlbGVtZW50XTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHVuaXF1ZUluZGV4ID0gT2JqZWN0LmtleXModW5pcXVlRWxlbWVudHMpLmxlbmd0aDtcbiAgICAgICAgICAgIHVuaXF1ZUVsZW1lbnRzW2VsZW1lbnRdID0gdW5pcXVlSW5kZXg7XG4gICAgICAgICAgICBpbmRpY2VzW2ldID0gdW5pcXVlSW5kZXg7XG4gICAgICAgICAgICB1bmlxdWVJbmRpY2VzLnB1c2goaSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gTm93IHdlIGtub3cgd2hlcmUgZWFjaCBvZiB0aGUgdW5pcXVlIGVsZW1lbnRzIGFyZSBsb2NhdGVkIGFsb25nIHRoZSBheGlzXG4gICAgLy8gKHVuaXF1ZUluZGljZXMpLiBFeHRyYWN0IHRoZW0gZnJvbSBpbnB1dCBidWZmZXIgYW5kIHN0b3JlIHRoZW0gaW4gdGhlXG4gICAgLy8gb3V0cHV0IGJ1ZmZlci5cbiAgICBjb25zdCBvdXRwdXRUbXBTaGFwZSA9IG5ld1NoYXBlLnNsaWNlKCk7XG4gICAgb3V0cHV0VG1wU2hhcGVbMV0gPSBPYmplY3Qua2V5cyh1bmlxdWVFbGVtZW50cykubGVuZ3RoO1xuICAgIGNvbnN0IG91dHB1dEJ1ZmZlciA9IG5ldyBUZW5zb3JCdWZmZXIob3V0cHV0VG1wU2hhcGUsIGR0eXBlKTtcbiAgICB1bmlxdWVJbmRpY2VzLmZvckVhY2goKHVuaXF1ZUVsZW1lbnRJbmRleCwgaSkgPT4ge1xuICAgICAgICBmb3IgKGxldCBtID0gMDsgbSA8IG5ld1NoYXBlWzBdOyBtKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgbmV3U2hhcGVbMl07IG4rKykge1xuICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlci5zZXQoaW5wdXRCdWZmZXIuZ2V0KG0sIHVuaXF1ZUVsZW1lbnRJbmRleCwgbiksIG0sIGksIG4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgLy8gVGhlIG91dHB1dCBzaGFwZSBjYW4gYmUgY2FsY3VsYXRlZCBmcm9tIHRoZSBpbnB1dCBzaGFwZSB3aXRoIHRoZSBzaXplIG9mXG4gICAgLy8gdGhlIGdpdmVuIGF4aXMgcmVwbGFjZWQgYnkgdGhlIG51bWJlciBvZiB1bmlxdWUgZWxlbWVudHMgYWxvbmcgdGhhdCBheGlzLlxuICAgIGNvbnN0IG91dHB1dFNoYXBlID0gc2hhcGUuc2xpY2UoKTtcbiAgICBvdXRwdXRTaGFwZVskYXhpc10gPSBvdXRwdXRUbXBTaGFwZVsxXTtcbiAgICByZXR1cm4ge1xuICAgICAgICBvdXRwdXRWYWx1ZXM6IG91dHB1dEJ1ZmZlci52YWx1ZXMsXG4gICAgICAgIG91dHB1dFNoYXBlLFxuICAgICAgICBpbmRpY2VzLFxuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1VbmlxdWVfaW1wbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBVbnBhY2sgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQgeyBzbGljZSB9IGZyb20gJy4vU2xpY2UnO1xuZXhwb3J0IGZ1bmN0aW9uIHVucGFjayhhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgdmFsdWUgfSA9IGlucHV0cztcbiAgICBsZXQgeyBheGlzIH0gPSBhdHRycztcbiAgICBpZiAoYXhpcyA8IDApIHtcbiAgICAgICAgYXhpcyArPSB2YWx1ZS5zaGFwZS5sZW5ndGg7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlUmFuayA9IHZhbHVlLnNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBudW0gPSB2YWx1ZS5zaGFwZVtheGlzXTtcbiAgICBjb25zdCBvdXRTaGFwZSA9IG5ldyBBcnJheSh2YWx1ZVJhbmsgLSAxKTtcbiAgICBsZXQgb3V0SW5kZXggPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVSYW5rOyBpKyspIHtcbiAgICAgICAgaWYgKGkgIT09IGF4aXMpIHtcbiAgICAgICAgICAgIG91dFNoYXBlW291dEluZGV4KytdID0gdmFsdWUuc2hhcGVbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgYmVnaW4gPSBuZXcgQXJyYXkodmFsdWVSYW5rKS5maWxsKDApO1xuICAgIGNvbnN0IHNpemUgPSB2YWx1ZS5zaGFwZS5zbGljZSgpO1xuICAgIHNpemVbYXhpc10gPSAxO1xuICAgIGNvbnN0IHJlcyA9IG5ldyBBcnJheShudW0pO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGJlZ2luW2F4aXNdID0gaTtcbiAgICAgICAgY29uc3QgdGVtcFJlcyA9IHNsaWNlKHsgaW5wdXRzOiB7IHg6IHZhbHVlIH0sIGJhY2tlbmQsIGF0dHJzOiB7IGJlZ2luLCBzaXplIH0gfSk7XG4gICAgICAgIHJlc1tpXSA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogdGVtcFJlcyB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogb3V0U2hhcGUgfSB9KTtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0ZW1wUmVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydCBjb25zdCB1bnBhY2tDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogVW5wYWNrLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiB1bnBhY2tcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1VbnBhY2suanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgVW5zb3J0ZWRTZWdtZW50U3VtLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyBjYXN0IH0gZnJvbSAnLi9DYXN0JztcbmltcG9ydCB7IGVxdWFsIH0gZnJvbSAnLi9FcXVhbCc7XG5pbXBvcnQgeyBleHBhbmREaW1zIH0gZnJvbSAnLi9FeHBhbmREaW1zJztcbmltcG9ydCB7IG11bHRpcGx5IH0gZnJvbSAnLi9NdWx0aXBseSc7XG5pbXBvcnQgeyBwYWNrIH0gZnJvbSAnLi9QYWNrJztcbmltcG9ydCB7IHN1bSB9IGZyb20gJy4vU3VtJztcbmV4cG9ydCBmdW5jdGlvbiB1bnNvcnRlZFNlZ21lbnRTdW0oYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHgsIHNlZ21lbnRJZHMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IG51bVNlZ21lbnRzIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KHgsICd1bnNvcnRlZFNlZ21lbnRTdW0nKTtcbiAgICBjb25zdCB4UmFuayA9IHguc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IHNlZ21lbnRJZHNSYW5rID0gc2VnbWVudElkcy5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgcmVzID0gW107XG4gICAgY29uc3QgaW50ZXJtZWRpYXRlcyA9IFtdO1xuICAgIC8vIFJlc2hhcGUgdGhlIHNlZ21lbnQgaWQncyBzbyB0aGF0IHRoZXkgY2FuIGJlIGJyb2FkY2FzdCB3aXRoXG4gICAgLy8geC4gVGhlIG5ldyBzaGFwZSBzaG91bGQgYmUgW3NlZ21lbnRJZHMuc2hhcGUsIDEsIC4uLiwgMV1cbiAgICBjb25zdCBudW1JdGVycyA9IHhSYW5rIC0gc2VnbWVudElkc1Jhbms7XG4gICAgbGV0ICRzZWdtZW50SWRzID0gc2VnbWVudElkcztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUl0ZXJzOyArK2kpIHtcbiAgICAgICAgY29uc3QgZXhwYW5kZWQgPSBleHBhbmREaW1zKHsgaW5wdXRzOiB7IGlucHV0OiAkc2VnbWVudElkcyB9LCBiYWNrZW5kLCBhdHRyczogeyBkaW06IGkgKyAxIH0gfSk7XG4gICAgICAgICRzZWdtZW50SWRzID0gZXhwYW5kZWQ7XG4gICAgICAgIGludGVybWVkaWF0ZXMucHVzaChleHBhbmRlZCk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtU2VnbWVudHM7ICsraSkge1xuICAgICAgICBjb25zdCBzY2FsYXJWYWx1ZSA9IHV0aWwuY3JlYXRlU2NhbGFyVmFsdWUoaSwgJ2ludDMyJyk7XG4gICAgICAgIGNvbnN0IHNlZ21lbnRJZCA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8oW10sICdpbnQzMicsIHNjYWxhclZhbHVlKTtcbiAgICAgICAgY29uc3QgbWFzayA9IGVxdWFsKHsgaW5wdXRzOiB7IGE6IHNlZ21lbnRJZCwgYjogJHNlZ21lbnRJZHMgfSwgYmFja2VuZCB9KTtcbiAgICAgICAgY29uc3QgbWFza0Nhc3RlZCA9IGNhc3QoeyBpbnB1dHM6IHsgeDogbWFzayB9LCBiYWNrZW5kLCBhdHRyczogeyBkdHlwZTogJ2Zsb2F0MzInIH0gfSk7XG4gICAgICAgIGNvbnN0IG11bCA9IG11bHRpcGx5KHsgaW5wdXRzOiB7IGE6IG1hc2tDYXN0ZWQsIGI6IHggfSwgYmFja2VuZCB9KTtcbiAgICAgICAgY29uc3Qgc3VtVGVuc29ySW5mbyA9IHN1bSh7IGlucHV0czogeyB4OiBtdWwgfSwgYmFja2VuZCwgYXR0cnM6IHsgYXhpczogMCwga2VlcERpbXM6IGZhbHNlIH0gfSk7XG4gICAgICAgIHJlcy5wdXNoKHN1bVRlbnNvckluZm8pO1xuICAgICAgICBpbnRlcm1lZGlhdGVzLnB1c2goc2VnbWVudElkKTtcbiAgICAgICAgaW50ZXJtZWRpYXRlcy5wdXNoKG1hc2spO1xuICAgICAgICBpbnRlcm1lZGlhdGVzLnB1c2gobWFza0Nhc3RlZCk7XG4gICAgICAgIGludGVybWVkaWF0ZXMucHVzaChtdWwpO1xuICAgICAgICBpbnRlcm1lZGlhdGVzLnB1c2goc3VtVGVuc29ySW5mbyk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IHBhY2soeyBpbnB1dHM6IHJlcywgYmFja2VuZCwgYXR0cnM6IHsgYXhpczogMCB9IH0pO1xuICAgIGludGVybWVkaWF0ZXMuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgY29uc3QgdW5zb3J0ZWRTZWdtZW50U3VtQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFVuc29ydGVkU2VnbWVudFN1bSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogdW5zb3J0ZWRTZWdtZW50U3VtXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VW5zb3J0ZWRTZWdtZW50U3VtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFplcm9zTGlrZSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjb21wbGV4IH0gZnJvbSAnLi9Db21wbGV4JztcbmltcG9ydCB7IGZpbGwgfSBmcm9tICcuL0ZpbGwnO1xuaW1wb3J0IHsgaW1hZyB9IGZyb20gJy4vSW1hZyc7XG5pbXBvcnQgeyByZWFsIH0gZnJvbSAnLi9SZWFsJztcbmV4cG9ydCBmdW5jdGlvbiB6ZXJvc0xpa2UoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGlmICh4LmR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3plcm9zTGlrZSBpcyBub3Qgc3VwcG9ydGVkIGZvciBzdHJpbmcgdGVuc29ycycpO1xuICAgIH1cbiAgICBlbHNlIGlmICh4LmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICBjb25zdCByZWFsUGFydCA9IHJlYWwoeyBpbnB1dHM6IHsgaW5wdXQ6IHggfSwgYmFja2VuZCB9KTtcbiAgICAgICAgY29uc3QgciA9IHplcm9zTGlrZSh7IGlucHV0czogeyB4OiByZWFsUGFydCB9LCBiYWNrZW5kIH0pO1xuICAgICAgICBjb25zdCBpbWFnUGFydCA9IGltYWcoeyBpbnB1dHM6IHsgaW5wdXQ6IHggfSwgYmFja2VuZCB9KTtcbiAgICAgICAgY29uc3QgaSA9IHplcm9zTGlrZSh7IGlucHV0czogeyB4OiBpbWFnUGFydCB9LCBiYWNrZW5kIH0pO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBjb21wbGV4KHsgaW5wdXRzOiB7IHJlYWw6IHIsIGltYWc6IGkgfSwgYmFja2VuZCB9KTtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZWFsUGFydCk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocik7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaW1hZ1BhcnQpO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZpbGwoeyBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogeC5zaGFwZSwgdmFsdWU6IDAsIGR0eXBlOiB4LmR0eXBlIH0gfSk7XG4gICAgfVxufVxuZXhwb3J0IGNvbnN0IHplcm9zTGlrZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBaZXJvc0xpa2UsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHplcm9zTGlrZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVplcm9zTGlrZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgX0Z1c2VkTWF0TXVsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFwcGx5QWN0aXZhdGlvbiB9IGZyb20gJy4uL3V0aWxzL2Z1c2VkX3V0aWxzJztcbmltcG9ydCB7IGFkZCB9IGZyb20gJy4vQWRkJztcbmltcG9ydCB7IGJhdGNoTWF0TXVsIH0gZnJvbSAnLi9CYXRjaE1hdE11bCc7XG5leHBvcnQgZnVuY3Rpb24gX2Z1c2VkTWF0TXVsKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBhLCBiLCBiaWFzLCBwcmVsdUFjdGl2YXRpb25XZWlnaHRzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyB0cmFuc3Bvc2VBLCB0cmFuc3Bvc2VCLCBhY3RpdmF0aW9uLCBsZWFreXJlbHVBbHBoYSB9ID0gYXR0cnM7XG4gICAgbGV0IGN1cnJlbnQ7XG4gICAgbGV0IGFkZFJlcztcbiAgICBsZXQgYWN0aXZhdGlvblJlcztcbiAgICBjb25zdCBpbnRlcm1lZGlhdGVzID0gW107XG4gICAgY29uc3QgbWF0TXVsUmVzID0gYmF0Y2hNYXRNdWwoeyBpbnB1dHM6IHsgYSwgYiB9LCBhdHRyczogeyB0cmFuc3Bvc2VBLCB0cmFuc3Bvc2VCIH0sIGJhY2tlbmQgfSk7XG4gICAgY3VycmVudCA9IG1hdE11bFJlcztcbiAgICBpZiAoYmlhcykge1xuICAgICAgICBhZGRSZXMgPSBhZGQoeyBpbnB1dHM6IHsgYTogY3VycmVudCwgYjogYmlhcyB9LCBiYWNrZW5kIH0pO1xuICAgICAgICBpbnRlcm1lZGlhdGVzLnB1c2goY3VycmVudCk7XG4gICAgICAgIGN1cnJlbnQgPSBhZGRSZXM7XG4gICAgfVxuICAgIGlmIChhY3RpdmF0aW9uKSB7XG4gICAgICAgIGFjdGl2YXRpb25SZXMgPSBhcHBseUFjdGl2YXRpb24oYmFja2VuZCwgY3VycmVudCwgYWN0aXZhdGlvbiwgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cywgbGVha3lyZWx1QWxwaGEpO1xuICAgICAgICBpbnRlcm1lZGlhdGVzLnB1c2goY3VycmVudCk7XG4gICAgICAgIGN1cnJlbnQgPSBhY3RpdmF0aW9uUmVzO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGkgb2YgaW50ZXJtZWRpYXRlcykge1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGkpO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudDtcbn1cbmV4cG9ydCBjb25zdCBfZnVzZWRNYXRNdWxDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogX0Z1c2VkTWF0TXVsLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBfZnVzZWRNYXRNdWwsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9X0Z1c2VkTWF0TXVsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8vIFdlIGV4cGxpY2l0bHkgaW1wb3J0IHRoZSBtb2R1bGFyIGtlcm5lbHMgc28gdGhleSBnZXQgcmVnaXN0ZXJlZCBpbiB0aGVcbi8vIGdsb2JhbCByZWdpc3RyeSB3aGVuIHdlIGNvbXBpbGUgdGhlIGxpYnJhcnkuIEEgbW9kdWxhciBidWlsZCB3b3VsZCByZXBsYWNlXG4vLyB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFuZCBpbXBvcnQgb25seSB0aGUga2VybmVscyB0aGF0IGFyZSBuZWVkZWQuXG5pbXBvcnQgeyByZWdpc3Rlcktlcm5lbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBfZnVzZWRNYXRNdWxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvX0Z1c2VkTWF0TXVsJztcbmltcG9ydCB7IGFic0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9BYnMnO1xuaW1wb3J0IHsgYWNvc0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9BY29zJztcbmltcG9ydCB7IGFjb3NoQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0Fjb3NoJztcbmltcG9ydCB7IGFkZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9BZGQnO1xuaW1wb3J0IHsgYWRkTkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9BZGROJztcbmltcG9ydCB7IGFsbENvbmZpZyB9IGZyb20gJy4va2VybmVscy9BbGwnO1xuaW1wb3J0IHsgYW55Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0FueSc7XG5pbXBvcnQgeyBhcmdNYXhDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQXJnTWF4JztcbmltcG9ydCB7IGFyZ01pbkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9BcmdNaW4nO1xuaW1wb3J0IHsgYXNpbkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9Bc2luJztcbmltcG9ydCB7IGFzaW5oQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0FzaW5oJztcbmltcG9ydCB7IGF0YW5Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvQXRhbic7XG5pbXBvcnQgeyBhdGFuMkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9BdGFuMic7XG5pbXBvcnQgeyBhdGFuaENvbmZpZyB9IGZyb20gJy4va2VybmVscy9BdGFuaCc7XG5pbXBvcnQgeyBhdmdQb29sQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0F2Z1Bvb2wnO1xuaW1wb3J0IHsgYXZnUG9vbDNEQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0F2Z1Bvb2wzRCc7XG5pbXBvcnQgeyBhdmdQb29sM0RHcmFkQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0F2Z1Bvb2wzREdyYWQnO1xuaW1wb3J0IHsgYXZnUG9vbEdyYWRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQXZnUG9vbEdyYWQnO1xuaW1wb3J0IHsgYmF0Y2hNYXRNdWxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQmF0Y2hNYXRNdWwnO1xuaW1wb3J0IHsgYmF0Y2hOb3JtQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0JhdGNoTm9ybSc7XG5pbXBvcnQgeyBiYXRjaFRvU3BhY2VORENvbmZpZyB9IGZyb20gJy4va2VybmVscy9CYXRjaFRvU3BhY2VORCc7XG5pbXBvcnQgeyBiaW5jb3VudENvbmZpZyB9IGZyb20gJy4va2VybmVscy9CaW5jb3VudCc7XG5pbXBvcnQgeyBjYXN0Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0Nhc3QnO1xuaW1wb3J0IHsgY2VpbENvbmZpZyB9IGZyb20gJy4va2VybmVscy9DZWlsJztcbmltcG9ydCB7IGNsaXBDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQ2xpcCc7XG5pbXBvcnQgeyBjb21wbGV4Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0NvbXBsZXgnO1xuaW1wb3J0IHsgY29tcGxleEFic0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9Db21wbGV4QWJzJztcbmltcG9ydCB7IGNvbmNhdENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Db25jYXQnO1xuaW1wb3J0IHsgY29udjJEQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0NvbnYyRCc7XG5pbXBvcnQgeyBjb252MkRCYWNrcHJvcEZpbHRlckNvbmZpZyB9IGZyb20gJy4va2VybmVscy9Db252MkRCYWNrcHJvcEZpbHRlcic7XG5pbXBvcnQgeyBjb252MkRCYWNrcHJvcElucHV0Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0NvbnYyREJhY2twcm9wSW5wdXQnO1xuaW1wb3J0IHsgY29udjNEQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0NvbnYzRCc7XG5pbXBvcnQgeyBjb252M0RCYWNrcHJvcEZpbHRlclYyQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0NvbnYzREJhY2twcm9wRmlsdGVyVjInO1xuaW1wb3J0IHsgY29udjNEQmFja3Byb3BJbnB1dFYyQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0NvbnYzREJhY2twcm9wSW5wdXRWMic7XG5pbXBvcnQgeyBjb3NDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQ29zJztcbmltcG9ydCB7IGNvc2hDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQ29zaCc7XG5pbXBvcnQgeyBjcm9wQW5kUmVzaXplQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0Nyb3BBbmRSZXNpemUnO1xuaW1wb3J0IHsgY3Vtc3VtQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0N1bXN1bSc7XG5pbXBvcnQgeyBkZW5zZUJpbmNvdW50Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0RlbnNlQmluY291bnQnO1xuaW1wb3J0IHsgZGVwdGhUb1NwYWNlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0RlcHRoVG9TcGFjZSc7XG5pbXBvcnQgeyBkZXB0aHdpc2VDb252MmROYXRpdmVDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRGVwdGh3aXNlQ29udjJkTmF0aXZlJztcbmltcG9ydCB7IGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0RlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyJztcbmltcG9ydCB7IGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCc7XG5pbXBvcnQgeyBkaWFnQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0RpYWcnO1xuaW1wb3J0IHsgZGlsYXRpb24yZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9EaWxhdGlvbjJEJztcbmltcG9ydCB7IGRpbGF0aW9uMmRCYWNrcHJvcEZpbHRlckNvbmZpZyB9IGZyb20gJy4va2VybmVscy9EaWxhdGlvbjJEQmFja3Byb3BGaWx0ZXInO1xuaW1wb3J0IHsgZGlsYXRpb24yZEJhY2twcm9wSW5wdXRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRGlsYXRpb24yREJhY2twcm9wSW5wdXQnO1xuaW1wb3J0IHsgZWluc3VtQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0VpbnN1bSc7XG5pbXBvcnQgeyBlbHVDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRWx1JztcbmltcG9ydCB7IGVsdUdyYWRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRWx1R3JhZCc7XG5pbXBvcnQgeyBlcXVhbENvbmZpZyB9IGZyb20gJy4va2VybmVscy9FcXVhbCc7XG5pbXBvcnQgeyBlcmZDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRXJmJztcbmltcG9ydCB7IGV4cENvbmZpZyB9IGZyb20gJy4va2VybmVscy9FeHAnO1xuaW1wb3J0IHsgZXhwYW5kRGltc0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9FeHBhbmREaW1zJztcbmltcG9ydCB7IGV4cG0xQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0V4cG0xJztcbmltcG9ydCB7IGZmdENvbmZpZyB9IGZyb20gJy4va2VybmVscy9GRlQnO1xuaW1wb3J0IHsgZmlsbENvbmZpZyB9IGZyb20gJy4va2VybmVscy9GaWxsJztcbmltcG9ydCB7IGZsaXBMZWZ0UmlnaHRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRmxpcExlZnRSaWdodCc7XG5pbXBvcnQgeyBmbG9vckNvbmZpZyB9IGZyb20gJy4va2VybmVscy9GbG9vcic7XG5pbXBvcnQgeyBmbG9vckRpdkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9GbG9vckRpdic7XG5pbXBvcnQgeyBmdXNlZENvbnYyRENvbmZpZyB9IGZyb20gJy4va2VybmVscy9GdXNlZENvbnYyRCc7XG5pbXBvcnQgeyBmdXNlZERlcHRod2lzZUNvbnYyRENvbmZpZyB9IGZyb20gJy4va2VybmVscy9GdXNlZERlcHRod2lzZUNvbnYyRCc7XG5pbXBvcnQgeyBnYXRoZXJOZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9HYXRoZXJOZCc7XG5pbXBvcnQgeyBnYXRoZXJWMkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9HYXRoZXJWMic7XG5pbXBvcnQgeyBncmVhdGVyQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0dyZWF0ZXInO1xuaW1wb3J0IHsgZ3JlYXRlckVxdWFsQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0dyZWF0ZXJFcXVhbCc7XG5pbXBvcnQgeyBpZGVudGl0eUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9JZGVudGl0eSc7XG5pbXBvcnQgeyBpZmZ0Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0lGRlQnO1xuaW1wb3J0IHsgaW1hZ0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9JbWFnJztcbmltcG9ydCB7IGlzRmluaXRlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0lzRmluaXRlJztcbmltcG9ydCB7IGlzSW5mQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0lzSW5mJztcbmltcG9ydCB7IGlzTmFOQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0lzTmFOJztcbmltcG9ydCB7IGxlYWt5UmVsdUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9MZWFreVJlbHUnO1xuaW1wb3J0IHsgbGVzc0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9MZXNzJztcbmltcG9ydCB7IGxlc3NFcXVhbENvbmZpZyB9IGZyb20gJy4va2VybmVscy9MZXNzRXF1YWwnO1xuaW1wb3J0IHsgbGluU3BhY2VDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTGluU3BhY2UnO1xuaW1wb3J0IHsgbG9nQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0xvZyc7XG5pbXBvcnQgeyBsb2cxcENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Mb2cxcCc7XG5pbXBvcnQgeyBsb2dpY2FsQW5kQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0xvZ2ljYWxBbmQnO1xuaW1wb3J0IHsgbG9naWNhbE5vdENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Mb2dpY2FsTm90JztcbmltcG9ydCB7IGxvZ2ljYWxPckNvbmZpZyB9IGZyb20gJy4va2VybmVscy9Mb2dpY2FsT3InO1xuaW1wb3J0IHsgbFJOQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0xSTic7XG5pbXBvcnQgeyBsUk5HcmFkQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0xSTkdyYWQnO1xuaW1wb3J0IHsgbWF4Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL01heCc7XG5pbXBvcnQgeyBtYXhpbXVtQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL01heGltdW0nO1xuaW1wb3J0IHsgbWF4UG9vbENvbmZpZyB9IGZyb20gJy4va2VybmVscy9NYXhQb29sJztcbmltcG9ydCB7IG1heFBvb2wzRENvbmZpZyB9IGZyb20gJy4va2VybmVscy9NYXhQb29sM0QnO1xuaW1wb3J0IHsgbWF4UG9vbDNER3JhZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9NYXhQb29sM0RHcmFkJztcbmltcG9ydCB7IG1heFBvb2xHcmFkQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL01heFBvb2xHcmFkJztcbmltcG9ydCB7IG1heFBvb2xXaXRoQXJnbWF4Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL01heFBvb2xXaXRoQXJnbWF4JztcbmltcG9ydCB7IG1lYW5Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvTWVhbic7XG5pbXBvcnQgeyBtaW5Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvTWluJztcbmltcG9ydCB7IG1pbmltdW1Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvTWluaW11bSc7XG5pbXBvcnQgeyBtaXJyb3JQYWRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTWlycm9yUGFkJztcbmltcG9ydCB7IG1vZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Nb2QnO1xuaW1wb3J0IHsgbXVsdGlub21pYWxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTXVsdGlub21pYWwnO1xuaW1wb3J0IHsgbXVsdGlwbHlDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTXVsdGlwbHknO1xuaW1wb3J0IHsgbmVnQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL05lZyc7XG5pbXBvcnQgeyBub25NYXhTdXBwcmVzc2lvblYzQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL05vbk1heFN1cHByZXNzaW9uVjMnO1xuaW1wb3J0IHsgbm9uTWF4U3VwcHJlc3Npb25WNENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Ob25NYXhTdXBwcmVzc2lvblY0JztcbmltcG9ydCB7IG5vbk1heFN1cHByZXNzaW9uVjVDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTm9uTWF4U3VwcHJlc3Npb25WNSc7XG5pbXBvcnQgeyBub3RFcXVhbENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Ob3RFcXVhbCc7XG5pbXBvcnQgeyBvbmVIb3RDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvT25lSG90JztcbmltcG9ydCB7IG9uZXNMaWtlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL09uZXNMaWtlJztcbmltcG9ydCB7IHBhY2tDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUGFjayc7XG5pbXBvcnQgeyBwYWRWMkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9QYWRWMic7XG5pbXBvcnQgeyBwb3dDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUG93JztcbmltcG9ydCB7IHByZWx1Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1ByZWx1JztcbmltcG9ydCB7IHByb2RDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUHJvZCc7XG5pbXBvcnQgeyByYW5nZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9SYW5nZSc7XG5pbXBvcnQgeyByZWFsQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1JlYWwnO1xuaW1wb3J0IHsgcmVhbERpdkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9SZWFsRGl2JztcbmltcG9ydCB7IHJlY2lwcm9jYWxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUmVjaXByb2NhbCc7XG5pbXBvcnQgeyByZWx1Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1JlbHUnO1xuaW1wb3J0IHsgcmVsdTZDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUmVsdTYnO1xuaW1wb3J0IHsgcmVzaGFwZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9SZXNoYXBlJztcbmltcG9ydCB7IHJlc2l6ZUJpbGluZWFyQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1Jlc2l6ZUJpbGluZWFyJztcbmltcG9ydCB7IHJlc2l6ZUJpbGluZWFyR3JhZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9SZXNpemVCaWxpbmVhckdyYWQnO1xuaW1wb3J0IHsgcmVzaXplTmVhcmVzdE5laWdoYm9yQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1Jlc2l6ZU5lYXJlc3ROZWlnaGJvcic7XG5pbXBvcnQgeyByZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1Jlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWQnO1xuaW1wb3J0IHsgcmV2ZXJzZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9SZXZlcnNlJztcbmltcG9ydCB7IHJvdGF0ZVdpdGhPZmZzZXRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUm90YXRlV2l0aE9mZnNldCc7XG5pbXBvcnQgeyByb3VuZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Sb3VuZCc7XG5pbXBvcnQgeyByc3FydENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Sc3FydCc7XG5pbXBvcnQgeyBzY2F0dGVyTmRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU2NhdHRlck5kJztcbmltcG9ydCB7IHNlbGVjdENvbmZpZyB9IGZyb20gJy4va2VybmVscy9TZWxlY3QnO1xuaW1wb3J0IHsgc2VsdUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9TZWx1JztcbmltcG9ydCB7IHNpZ21vaWRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU2lnbW9pZCc7XG5pbXBvcnQgeyBzaWduQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NpZ24nO1xuaW1wb3J0IHsgc2luQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1Npbic7XG5pbXBvcnQgeyBzaW5oQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NpbmgnO1xuaW1wb3J0IHsgc2xpY2VDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU2xpY2UnO1xuaW1wb3J0IHsgc29mdG1heENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Tb2Z0bWF4JztcbmltcG9ydCB7IHNvZnRwbHVzQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NvZnRwbHVzJztcbmltcG9ydCB7IHNwYWNlVG9CYXRjaE5EQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NwYWNlVG9CYXRjaE5EJztcbmltcG9ydCB7IHNwYXJzZUZpbGxFbXB0eVJvd3NDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3BhcnNlRmlsbEVtcHR5Um93cyc7XG5pbXBvcnQgeyBzcGFyc2VSZXNoYXBlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NwYXJzZVJlc2hhcGUnO1xuaW1wb3J0IHsgc3BhcnNlU2VnbWVudE1lYW5Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3BhcnNlU2VnbWVudE1lYW4nO1xuaW1wb3J0IHsgc3BhcnNlU2VnbWVudFN1bUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9TcGFyc2VTZWdtZW50U3VtJztcbmltcG9ydCB7IHNwYXJzZVRvRGVuc2VDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3BhcnNlVG9EZW5zZSc7XG5pbXBvcnQgeyBzcGxpdFZDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3BsaXRWJztcbmltcG9ydCB7IHNxcnRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3FydCc7XG5pbXBvcnQgeyBzcXVhcmVDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3F1YXJlJztcbmltcG9ydCB7IHNxdWFyZWREaWZmZXJlbmNlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NxdWFyZWREaWZmZXJlbmNlJztcbmltcG9ydCB7IHN0ZXBDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3RlcCc7XG5pbXBvcnQgeyBzdHJpZGVkU2xpY2VDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3RyaWRlZFNsaWNlJztcbmltcG9ydCB7IHN0cmluZ05HcmFtc0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9TdHJpbmdOR3JhbXMnO1xuaW1wb3J0IHsgc3RyaW5nU3BsaXRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3RyaW5nU3BsaXQnO1xuaW1wb3J0IHsgc3RyaW5nVG9IYXNoQnVja2V0RmFzdENvbmZpZyB9IGZyb20gJy4va2VybmVscy9TdHJpbmdUb0hhc2hCdWNrZXRGYXN0JztcbmltcG9ydCB7IHN1YkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9TdWInO1xuaW1wb3J0IHsgc3VtQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1N1bSc7XG5pbXBvcnQgeyB0YW5Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvVGFuJztcbmltcG9ydCB7IHRhbmhDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvVGFuaCc7XG5pbXBvcnQgeyB0aWxlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1RpbGUnO1xuaW1wb3J0IHsgdG9wS0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9Ub3BLJztcbmltcG9ydCB7IHRyYW5zZm9ybUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9UcmFuc2Zvcm0nO1xuaW1wb3J0IHsgdHJhbnNwb3NlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1RyYW5zcG9zZSc7XG5pbXBvcnQgeyB1bmlxdWVDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvVW5pcXVlJztcbmltcG9ydCB7IHVucGFja0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9VbnBhY2snO1xuaW1wb3J0IHsgdW5zb3J0ZWRTZWdtZW50U3VtQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1Vuc29ydGVkU2VnbWVudFN1bSc7XG5pbXBvcnQgeyB6ZXJvc0xpa2VDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvWmVyb3NMaWtlJztcbi8vIExpc3QgYWxsIGtlcm5lbCBjb25maWdzIGhlcmVcbmNvbnN0IGtlcm5lbENvbmZpZ3MgPSBbXG4gICAgX2Z1c2VkTWF0TXVsQ29uZmlnLFxuICAgIGFic0NvbmZpZyxcbiAgICBhY29zQ29uZmlnLFxuICAgIGFjb3NoQ29uZmlnLFxuICAgIGFkZENvbmZpZyxcbiAgICBhZGROQ29uZmlnLFxuICAgIGFsbENvbmZpZyxcbiAgICBhbnlDb25maWcsXG4gICAgYXJnTWF4Q29uZmlnLFxuICAgIGFyZ01pbkNvbmZpZyxcbiAgICBhc2luQ29uZmlnLFxuICAgIGFzaW5oQ29uZmlnLFxuICAgIGF0YW5Db25maWcsXG4gICAgYXRhbjJDb25maWcsXG4gICAgYXRhbmhDb25maWcsXG4gICAgYXZnUG9vbENvbmZpZyxcbiAgICBhdmdQb29sM0RDb25maWcsXG4gICAgYXZnUG9vbDNER3JhZENvbmZpZyxcbiAgICBhdmdQb29sR3JhZENvbmZpZyxcbiAgICBiYXRjaE1hdE11bENvbmZpZyxcbiAgICBiYXRjaE5vcm1Db25maWcsXG4gICAgYmF0Y2hUb1NwYWNlTkRDb25maWcsXG4gICAgYmluY291bnRDb25maWcsXG4gICAgY2FzdENvbmZpZyxcbiAgICBjZWlsQ29uZmlnLFxuICAgIGNsaXBDb25maWcsXG4gICAgY29tcGxleENvbmZpZyxcbiAgICBjb21wbGV4QWJzQ29uZmlnLFxuICAgIGNvbmNhdENvbmZpZyxcbiAgICBjb252MkRCYWNrcHJvcEZpbHRlckNvbmZpZyxcbiAgICBjb252MkRCYWNrcHJvcElucHV0Q29uZmlnLFxuICAgIGNvbnYyRENvbmZpZyxcbiAgICBjb252M0RCYWNrcHJvcEZpbHRlclYyQ29uZmlnLFxuICAgIGNvbnYzREJhY2twcm9wSW5wdXRWMkNvbmZpZyxcbiAgICBjb252M0RDb25maWcsXG4gICAgY29zQ29uZmlnLFxuICAgIGNvc2hDb25maWcsXG4gICAgY3JvcEFuZFJlc2l6ZUNvbmZpZyxcbiAgICBjdW1zdW1Db25maWcsXG4gICAgZGVuc2VCaW5jb3VudENvbmZpZyxcbiAgICBkZXB0aFRvU3BhY2VDb25maWcsXG4gICAgZGVwdGh3aXNlQ29udjJkTmF0aXZlQ29uZmlnLFxuICAgIGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyQ29uZmlnLFxuICAgIGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXRDb25maWcsXG4gICAgZGlhZ0NvbmZpZyxcbiAgICBkaWxhdGlvbjJkQ29uZmlnLFxuICAgIGRpbGF0aW9uMmRCYWNrcHJvcElucHV0Q29uZmlnLFxuICAgIGRpbGF0aW9uMmRCYWNrcHJvcEZpbHRlckNvbmZpZyxcbiAgICByZWFsRGl2Q29uZmlnLFxuICAgIGVpbnN1bUNvbmZpZyxcbiAgICBlbHVDb25maWcsXG4gICAgZWx1R3JhZENvbmZpZyxcbiAgICBlcXVhbENvbmZpZyxcbiAgICBlcmZDb25maWcsXG4gICAgZXhwQ29uZmlnLFxuICAgIGV4cGFuZERpbXNDb25maWcsXG4gICAgZXhwbTFDb25maWcsXG4gICAgZmZ0Q29uZmlnLFxuICAgIGZpbGxDb25maWcsXG4gICAgZmxpcExlZnRSaWdodENvbmZpZyxcbiAgICBmbG9vckNvbmZpZyxcbiAgICBmbG9vckRpdkNvbmZpZyxcbiAgICBmdXNlZENvbnYyRENvbmZpZyxcbiAgICBmdXNlZERlcHRod2lzZUNvbnYyRENvbmZpZyxcbiAgICBnYXRoZXJOZENvbmZpZyxcbiAgICBnYXRoZXJWMkNvbmZpZyxcbiAgICBncmVhdGVyQ29uZmlnLFxuICAgIGdyZWF0ZXJFcXVhbENvbmZpZyxcbiAgICBpZGVudGl0eUNvbmZpZyxcbiAgICBpZmZ0Q29uZmlnLFxuICAgIGltYWdDb25maWcsXG4gICAgaXNGaW5pdGVDb25maWcsXG4gICAgaXNJbmZDb25maWcsXG4gICAgaXNOYU5Db25maWcsXG4gICAgbGVha3lSZWx1Q29uZmlnLFxuICAgIGxlc3NDb25maWcsXG4gICAgbGVzc0VxdWFsQ29uZmlnLFxuICAgIGxpblNwYWNlQ29uZmlnLFxuICAgIGxvZ0NvbmZpZyxcbiAgICBsb2cxcENvbmZpZyxcbiAgICBsb2dpY2FsQW5kQ29uZmlnLFxuICAgIGxvZ2ljYWxOb3RDb25maWcsXG4gICAgbG9naWNhbE9yQ29uZmlnLFxuICAgIGxSTkNvbmZpZyxcbiAgICBsUk5HcmFkQ29uZmlnLFxuICAgIG1heGltdW1Db25maWcsXG4gICAgbWF4UG9vbENvbmZpZyxcbiAgICBtYXhQb29sM0RDb25maWcsXG4gICAgbWF4UG9vbDNER3JhZENvbmZpZyxcbiAgICBtYXhQb29sR3JhZENvbmZpZyxcbiAgICBtYXhQb29sV2l0aEFyZ21heENvbmZpZyxcbiAgICBtYXhDb25maWcsXG4gICAgbWVhbkNvbmZpZyxcbiAgICBtaW5Db25maWcsXG4gICAgbWluaW11bUNvbmZpZyxcbiAgICBtaXJyb3JQYWRDb25maWcsXG4gICAgbW9kQ29uZmlnLFxuICAgIG11bHRpbm9taWFsQ29uZmlnLFxuICAgIG11bHRpcGx5Q29uZmlnLFxuICAgIG5lZ0NvbmZpZyxcbiAgICBub25NYXhTdXBwcmVzc2lvblYzQ29uZmlnLFxuICAgIG5vbk1heFN1cHByZXNzaW9uVjRDb25maWcsXG4gICAgbm9uTWF4U3VwcHJlc3Npb25WNUNvbmZpZyxcbiAgICBub3RFcXVhbENvbmZpZyxcbiAgICBvbmVIb3RDb25maWcsXG4gICAgb25lc0xpa2VDb25maWcsXG4gICAgcGFja0NvbmZpZyxcbiAgICBwYWRWMkNvbmZpZyxcbiAgICBwb3dDb25maWcsXG4gICAgcHJlbHVDb25maWcsXG4gICAgcHJvZENvbmZpZyxcbiAgICByYW5nZUNvbmZpZyxcbiAgICByZWFsQ29uZmlnLFxuICAgIHJlY2lwcm9jYWxDb25maWcsXG4gICAgcmVsdUNvbmZpZyxcbiAgICByZWx1NkNvbmZpZyxcbiAgICByZXNoYXBlQ29uZmlnLFxuICAgIHJlc2l6ZUJpbGluZWFyQ29uZmlnLFxuICAgIHJlc2l6ZUJpbGluZWFyR3JhZENvbmZpZyxcbiAgICByZXNpemVOZWFyZXN0TmVpZ2hib3JDb25maWcsXG4gICAgcmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZENvbmZpZyxcbiAgICByZXZlcnNlQ29uZmlnLFxuICAgIHJvdGF0ZVdpdGhPZmZzZXRDb25maWcsXG4gICAgcm91bmRDb25maWcsXG4gICAgcnNxcnRDb25maWcsXG4gICAgc2NhdHRlck5kQ29uZmlnLFxuICAgIHNlbGVjdENvbmZpZyxcbiAgICBzZWx1Q29uZmlnLFxuICAgIHNpZ21vaWRDb25maWcsXG4gICAgc2lnbkNvbmZpZyxcbiAgICBzaW5Db25maWcsXG4gICAgc2luaENvbmZpZyxcbiAgICBzbGljZUNvbmZpZyxcbiAgICBzb2Z0bWF4Q29uZmlnLFxuICAgIHNvZnRwbHVzQ29uZmlnLFxuICAgIHNwYWNlVG9CYXRjaE5EQ29uZmlnLFxuICAgIHNwYXJzZUZpbGxFbXB0eVJvd3NDb25maWcsXG4gICAgc3BhcnNlUmVzaGFwZUNvbmZpZyxcbiAgICBzcGFyc2VTZWdtZW50TWVhbkNvbmZpZyxcbiAgICBzcGFyc2VTZWdtZW50U3VtQ29uZmlnLFxuICAgIHNwYXJzZVRvRGVuc2VDb25maWcsXG4gICAgc3BsaXRWQ29uZmlnLFxuICAgIHNxcnRDb25maWcsXG4gICAgc3F1YXJlQ29uZmlnLFxuICAgIHNxdWFyZWREaWZmZXJlbmNlQ29uZmlnLFxuICAgIHN0ZXBDb25maWcsXG4gICAgc3RyaWRlZFNsaWNlQ29uZmlnLFxuICAgIHN0cmluZ05HcmFtc0NvbmZpZyxcbiAgICBzdHJpbmdTcGxpdENvbmZpZyxcbiAgICBzdHJpbmdUb0hhc2hCdWNrZXRGYXN0Q29uZmlnLFxuICAgIHN1YkNvbmZpZyxcbiAgICBzdW1Db25maWcsXG4gICAgdGFuQ29uZmlnLFxuICAgIHRhbmhDb25maWcsXG4gICAgdGlsZUNvbmZpZyxcbiAgICB0b3BLQ29uZmlnLFxuICAgIHRyYW5zcG9zZUNvbmZpZyxcbiAgICB0cmFuc2Zvcm1Db25maWcsXG4gICAgdW5pcXVlQ29uZmlnLFxuICAgIHVucGFja0NvbmZpZyxcbiAgICB1bnNvcnRlZFNlZ21lbnRTdW1Db25maWcsXG4gICAgemVyb3NMaWtlQ29uZmlnXG5dO1xuZm9yIChjb25zdCBrZXJuZWxDb25maWcgb2Yga2VybmVsQ29uZmlncykge1xuICAgIHJlZ2lzdGVyS2VybmVsKGtlcm5lbENvbmZpZyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWdpc3Rlcl9hbGxfa2VybmVscy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vLyBTaGFyZWQgZnVuY3Rpb25hbGl0eSBhbW9uZyBiYWNrZW5kcy5cbmV4cG9ydCB7IHNpbXBsZUFic0ltcGwgfSBmcm9tICcuL2tlcm5lbHMvQWJzJztcbmV4cG9ydCB7IGFkZEltcGwgfSBmcm9tICcuL2tlcm5lbHMvQWRkJztcbmV4cG9ydCB7IGJpbmNvdW50SW1wbCwgYmluY291bnRSZWR1Y2VJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL0JpbmNvdW50X2ltcGwnO1xuZXhwb3J0IHsgY2VpbEltcGwgfSBmcm9tICcuL2tlcm5lbHMvQ2VpbCc7XG5leHBvcnQgeyBjb25jYXRJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL0NvbmNhdF9pbXBsJztcbmV4cG9ydCB7IGVxdWFsSW1wbCB9IGZyb20gJy4va2VybmVscy9FcXVhbCc7XG5leHBvcnQgeyBleHBJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL0V4cCc7XG5leHBvcnQgeyBleHBtMUltcGwgfSBmcm9tICcuL2tlcm5lbHMvRXhwbTEnO1xuZXhwb3J0IHsgZmxvb3JJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL0Zsb29yJztcbmV4cG9ydCB7IGdhdGhlck5kSW1wbCB9IGZyb20gJy4va2VybmVscy9HYXRoZXJOZF9JbXBsJztcbmV4cG9ydCB7IGdhdGhlclYySW1wbCB9IGZyb20gJy4va2VybmVscy9HYXRoZXJWMl9pbXBsJztcbmV4cG9ydCB7IGdyZWF0ZXJJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL0dyZWF0ZXInO1xuZXhwb3J0IHsgZ3JlYXRlckVxdWFsSW1wbCB9IGZyb20gJy4va2VybmVscy9HcmVhdGVyRXF1YWwnO1xuZXhwb3J0IHsgbGVzc0ltcGwgfSBmcm9tICcuL2tlcm5lbHMvTGVzcyc7XG5leHBvcnQgeyBsZXNzRXF1YWxJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL0xlc3NFcXVhbCc7XG5leHBvcnQgeyBsaW5TcGFjZUltcGwgfSBmcm9tICcuL2tlcm5lbHMvTGluU3BhY2VfaW1wbCc7XG5leHBvcnQgeyBsb2dJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL0xvZyc7XG5leHBvcnQgeyBtYXhJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL01heF9pbXBsJztcbmV4cG9ydCB7IG1heGltdW1JbXBsIH0gZnJvbSAnLi9rZXJuZWxzL01heGltdW0nO1xuZXhwb3J0IHsgbWluaW11bUltcGwgfSBmcm9tICcuL2tlcm5lbHMvTWluaW11bSc7XG5leHBvcnQgeyBtdWx0aXBseUltcGwgfSBmcm9tICcuL2tlcm5lbHMvTXVsdGlwbHknO1xuZXhwb3J0IHsgbmVnSW1wbCB9IGZyb20gJy4va2VybmVscy9OZWcnO1xuZXhwb3J0IHsgbm90RXF1YWxJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL05vdEVxdWFsJztcbmV4cG9ydCB7IHByb2RJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL1Byb2QnO1xuZXhwb3J0IHsgcmFuZ2VJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL1JhbmdlX2ltcGwnO1xuZXhwb3J0IHsgcnNxcnRJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL1JzcXJ0JztcbmV4cG9ydCB7IHNsaWNlSW1wbCB9IGZyb20gJy4va2VybmVscy9TbGljZSc7XG5leHBvcnQgeyBzcGFyc2VGaWxsRW1wdHlSb3dzSW1wbCB9IGZyb20gJy4va2VybmVscy9TcGFyc2VGaWxsRW1wdHlSb3dzX2ltcGwnO1xuZXhwb3J0IHsgc3BhcnNlUmVzaGFwZUltcGwgfSBmcm9tICcuL2tlcm5lbHMvU3BhcnNlUmVzaGFwZV9pbXBsJztcbmV4cG9ydCB7IHNwYXJzZVNlZ21lbnRSZWR1Y3Rpb25JbXBsIH0gZnJvbSAnLi9rZXJuZWxzL1NwYXJzZVNlZ21lbnRSZWR1Y3Rpb25faW1wbCc7XG5leHBvcnQgeyBzcXVhcmVkRGlmZmVyZW5jZUltcGwgfSBmcm9tICcuL2tlcm5lbHMvU3F1YXJlZERpZmZlcmVuY2UnO1xuZXhwb3J0IHsgc3RyaWRlZFNsaWNlSW1wbCB9IGZyb20gJy4va2VybmVscy9TdHJpZGVkU2xpY2VfaW1wbCc7XG5leHBvcnQgeyBzdHJpbmdOR3JhbXNJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL1N0cmluZ05HcmFtc19pbXBsJztcbmV4cG9ydCB7IHN0cmluZ1NwbGl0SW1wbCB9IGZyb20gJy4va2VybmVscy9TdHJpbmdTcGxpdF9pbXBsJztcbmV4cG9ydCB7IHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL1N0cmluZ1RvSGFzaEJ1Y2tldEZhc3RfaW1wbCc7XG5leHBvcnQgeyBzdWJJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL1N1Yic7XG5leHBvcnQgeyB0aWxlSW1wbCB9IGZyb20gJy4va2VybmVscy9UaWxlX2ltcGwnO1xuZXhwb3J0IHsgdG9wS0ltcGwgfSBmcm9tICcuL2tlcm5lbHMvVG9wS19pbXBsJztcbmV4cG9ydCB7IHRyYW5zcG9zZUltcGwgfSBmcm9tICcuL2tlcm5lbHMvVHJhbnNwb3NlX2ltcGwnO1xuZXhwb3J0IHsgdW5pcXVlSW1wbCB9IGZyb20gJy4va2VybmVscy9VbmlxdWVfaW1wbCc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zaGFyZWQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbi8qKlxuICogVGVtcGxhdGUgdGhhdCBjcmVhdGVzIGltcGxlbWVudGF0aW9uIGZvciBiaW5hcnkgb3BzLiBTdXBwb3J0cyBicm9hZGNhc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsKG9wKSB7XG4gICAgcmV0dXJuIChhU2hhcGUsIGJTaGFwZSwgYVZhbHMsIGJWYWxzLCBkdHlwZSkgPT4ge1xuICAgICAgICBjb25zdCBuZXdTaGFwZSA9IGJhY2tlbmRfdXRpbC5hc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZShhU2hhcGUsIGJTaGFwZSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdFJhbmsgPSBuZXdTaGFwZS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHJlc3VsdFN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKG5ld1NoYXBlKTtcbiAgICAgICAgY29uc3QgcmVzdWx0U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShuZXdTaGFwZSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHV0aWwuZ2V0VHlwZWRBcnJheUZyb21EVHlwZShkdHlwZSwgcmVzdWx0U2l6ZSk7XG4gICAgICAgIGNvbnN0IGFSYW5rID0gYVNoYXBlLmxlbmd0aDtcbiAgICAgICAgY29uc3QgYlJhbmsgPSBiU2hhcGUubGVuZ3RoO1xuICAgICAgICBjb25zdCBhU3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoYVNoYXBlKTtcbiAgICAgICAgY29uc3QgYlN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGJTaGFwZSk7XG4gICAgICAgIGNvbnN0IGFCcm9hZGNhc3REaW1zID0gYmFja2VuZF91dGlsLmdldEJyb2FkY2FzdERpbXMoYVNoYXBlLCBuZXdTaGFwZSk7XG4gICAgICAgIGNvbnN0IGJCcm9hZGNhc3REaW1zID0gYmFja2VuZF91dGlsLmdldEJyb2FkY2FzdERpbXMoYlNoYXBlLCBuZXdTaGFwZSk7XG4gICAgICAgIGlmIChhQnJvYWRjYXN0RGltcy5sZW5ndGggKyBiQnJvYWRjYXN0RGltcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gb3AoYVZhbHNbaSAlIGFWYWxzLmxlbmd0aF0sIGJWYWxzW2kgJSBiVmFscy5sZW5ndGhdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbG9jID0gdXRpbC5pbmRleFRvTG9jKGksIHJlc3VsdFJhbmssIHJlc3VsdFN0cmlkZXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFMb2MgPSBsb2Muc2xpY2UoLWFSYW5rKTtcbiAgICAgICAgICAgICAgICBhQnJvYWRjYXN0RGltcy5mb3JFYWNoKGQgPT4gYUxvY1tkXSA9IDApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFJbmRleCA9IHV0aWwubG9jVG9JbmRleChhTG9jLCBhUmFuaywgYVN0cmlkZXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJMb2MgPSBsb2Muc2xpY2UoLWJSYW5rKTtcbiAgICAgICAgICAgICAgICBiQnJvYWRjYXN0RGltcy5mb3JFYWNoKGQgPT4gYkxvY1tkXSA9IDApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJJbmRleCA9IHV0aWwubG9jVG9JbmRleChiTG9jLCBiUmFuaywgYlN0cmlkZXMpO1xuICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IG9wKGFWYWxzW2FJbmRleF0sIGJWYWxzW2JJbmRleF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbcmVzdWx0LCBuZXdTaGFwZV07XG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJpbmFyeV9pbXBsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHsgY2FzdCB9IGZyb20gJy4uL2tlcm5lbHMvQ2FzdCc7XG5pbXBvcnQgeyBjb21wbGV4IH0gZnJvbSAnLi4va2VybmVscy9Db21wbGV4Jztcbi8qKlxuICogVGVtcGxhdGUgdGhhdCBjcmVhdGVzIGEgYEtlcm5lbEZ1bmNgIGZvciBiaW5hcnkgb3BzLlxuICogQHBhcmFtIG5hbWUgS2VybmVsIG5hbWUuXG4gKiBAcGFyYW0gYmluYXJ5S2VybmVsSW1wbCBBIGBTaW1wbGVCaW5hcnlLZXJuZWxJbXBsYCBmb3IgdGhlIGtlcm5lbC5cbiAqIEBwYXJhbSBiaW5hcnlLZXJuZWxDb21wbGV4SW1wbCBPcHRpb25hbC4gSWYgZXhpc3RzLCByZXByZXNlbnRzIGFcbiAqICAgICBgQ29tcGxleEJpbmFyeUtlcm5lbEltcGxgIGZvciB0aGUga2VybmVsLCB3aWxsIGJlIHVzZWQgd2hlbiBpbnB1dCBkdHlwZVxuICogICAgIGlzIGBjb21wbGV4NjRgLlxuICogQHBhcmFtIGR0eXBlIE9wdGlvbmFsLiBJZiBzZXQsIHRoZSByZXN1bHQgaGFzIHRoaXMgZHR5cGUuIE90aGVyd2lzZSwgdGhlXG4gKiAgICAgcmVzdWx0IGhhcyB0aGUgc2FtZSBkdHlwZSBhcyB0aGUgZmlyc3QgaW5wdXQuIFRoaXMgaXMgbWFpbmx5IHVzZWQgaW5cbiAqICAgICBjb21wYXJpc29uIGtlcm5lbHMsIHN1Y2ggYXMgRXF1YWwsIExlc3MsIEdyZWF0ZXIsIGV0Yy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmFyeUtlcm5lbEZ1bmMobmFtZSwgc2ltcGxlSW1wbCwgY29tcGxleEltcGwsIGR0eXBlKSB7XG4gICAgaWYgKGNvbXBsZXhJbXBsID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICh7IGlucHV0cywgYmFja2VuZCB9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IGEsIGIgfSA9IGlucHV0cztcbiAgICAgICAgICAgIGNvbnN0IGNwdUJhY2tlbmQgPSBiYWNrZW5kO1xuICAgICAgICAgICAgYXNzZXJ0Tm90Q29tcGxleChbYSwgYl0sIG5hbWUpO1xuICAgICAgICAgICAgY29uc3QgYVZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KGEuZGF0YUlkKS52YWx1ZXM7XG4gICAgICAgICAgICBjb25zdCBiVmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoYi5kYXRhSWQpLnZhbHVlcztcbiAgICAgICAgICAgIGNvbnN0IGRlY29kZWRBVmFscyA9IGEuZHR5cGUgPT09ICdzdHJpbmcnID9cbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWFueVxuICAgICAgICAgICAgICAgIGJhY2tlbmRfdXRpbC5mcm9tVWludDhUb1N0cmluZ0FycmF5KGFWYWxzKSA6XG4gICAgICAgICAgICAgICAgYVZhbHM7XG4gICAgICAgICAgICBjb25zdCBkZWNvZGVkQlZhbHMgPSBhLmR0eXBlID09PSAnc3RyaW5nJyA/XG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1hbnlcbiAgICAgICAgICAgICAgICBiYWNrZW5kX3V0aWwuZnJvbVVpbnQ4VG9TdHJpbmdBcnJheShiVmFscykgOlxuICAgICAgICAgICAgICAgIGJWYWxzO1xuICAgICAgICAgICAgY29uc3QgJGR0eXBlID0gZHR5cGUgfHwgYS5kdHlwZTtcbiAgICAgICAgICAgIGNvbnN0IFtyZXN1bHREYXRhLCByZXN1bHRTaGFwZV0gPSBzaW1wbGVJbXBsKGEuc2hhcGUsIGIuc2hhcGUsIGRlY29kZWRBVmFscywgZGVjb2RlZEJWYWxzLCAkZHR5cGUpO1xuICAgICAgICAgICAgcmV0dXJuIGNwdUJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVzdWx0U2hhcGUsICRkdHlwZSwgcmVzdWx0RGF0YSk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiAoeyBpbnB1dHMsIGJhY2tlbmQgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IGEsIGIgfSA9IGlucHV0cztcbiAgICAgICAgY29uc3QgY3B1QmFja2VuZCA9IGJhY2tlbmQ7XG4gICAgICAgIGlmIChhLmR0eXBlID09PSAnY29tcGxleDY0JyB8fCBiLmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICAgICAgY29uc3QgJGFDb21wbGV4ID0gY2FzdCh7IGlucHV0czogeyB4OiBhIH0sIGJhY2tlbmQ6IGNwdUJhY2tlbmQsIGF0dHJzOiB7IGR0eXBlOiAnY29tcGxleDY0JyB9IH0pO1xuICAgICAgICAgICAgY29uc3QgJGFDb21wbGV4VmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoJGFDb21wbGV4LmRhdGFJZCk7XG4gICAgICAgICAgICBjb25zdCBhUmVhbCA9ICRhQ29tcGxleFZhbHMuY29tcGxleFRlbnNvckluZm9zLnJlYWw7XG4gICAgICAgICAgICBjb25zdCBhSW1hZyA9ICRhQ29tcGxleFZhbHMuY29tcGxleFRlbnNvckluZm9zLmltYWc7XG4gICAgICAgICAgICBjb25zdCBhUmVhbFZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KGFSZWFsLmRhdGFJZCkudmFsdWVzO1xuICAgICAgICAgICAgY29uc3QgYUltYWdWYWxzID0gY3B1QmFja2VuZC5kYXRhLmdldChhSW1hZy5kYXRhSWQpLnZhbHVlcztcbiAgICAgICAgICAgIGNvbnN0ICRiQ29tcGxleCA9IGNhc3QoeyBpbnB1dHM6IHsgeDogYiB9LCBiYWNrZW5kOiBjcHVCYWNrZW5kLCBhdHRyczogeyBkdHlwZTogJ2NvbXBsZXg2NCcgfSB9KTtcbiAgICAgICAgICAgIGNvbnN0ICRiQ29tcGxleFZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KCRiQ29tcGxleC5kYXRhSWQpO1xuICAgICAgICAgICAgY29uc3QgYlJlYWwgPSAkYkNvbXBsZXhWYWxzLmNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsO1xuICAgICAgICAgICAgY29uc3QgYkltYWcgPSAkYkNvbXBsZXhWYWxzLmNvbXBsZXhUZW5zb3JJbmZvcy5pbWFnO1xuICAgICAgICAgICAgY29uc3QgYlJlYWxWYWxzID0gY3B1QmFja2VuZC5kYXRhLmdldChiUmVhbC5kYXRhSWQpLnZhbHVlcztcbiAgICAgICAgICAgIGNvbnN0IGJJbWFnVmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoYkltYWcuZGF0YUlkKS52YWx1ZXM7XG4gICAgICAgICAgICBjb25zdCBbcmVzdWx0UmVhbERhdGEsIHJlc3VsdEltYWdEYXRhLCByZXN1bHRTaGFwZV0gPSBjb21wbGV4SW1wbChhLnNoYXBlLCBiLnNoYXBlLCBhUmVhbFZhbHMsIGFJbWFnVmFscywgYlJlYWxWYWxzLCBiSW1hZ1ZhbHMpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0UmVhbCA9IGNwdUJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVzdWx0U2hhcGUsICdmbG9hdDMyJywgcmVzdWx0UmVhbERhdGEpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0SW1hZyA9IGNwdUJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVzdWx0U2hhcGUsICdmbG9hdDMyJywgcmVzdWx0SW1hZ0RhdGEpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29tcGxleCh7IGlucHV0czogeyByZWFsOiByZXN1bHRSZWFsLCBpbWFnOiByZXN1bHRJbWFnIH0sIGJhY2tlbmQ6IGNwdUJhY2tlbmQgfSk7XG4gICAgICAgICAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKCRhQ29tcGxleCk7XG4gICAgICAgICAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKCRiQ29tcGxleCk7XG4gICAgICAgICAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc3VsdFJlYWwpO1xuICAgICAgICAgICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXN1bHRJbWFnKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBhVmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoYS5kYXRhSWQpLnZhbHVlcztcbiAgICAgICAgICAgIGNvbnN0IGJWYWxzID0gY3B1QmFja2VuZC5kYXRhLmdldChiLmRhdGFJZCkudmFsdWVzO1xuICAgICAgICAgICAgY29uc3QgJGR0eXBlID0gZHR5cGUgfHwgYS5kdHlwZTtcbiAgICAgICAgICAgIGNvbnN0IFtyZXN1bHREYXRhLCByZXN1bHRTaGFwZV0gPSBzaW1wbGVJbXBsKGEuc2hhcGUsIGIuc2hhcGUsIGFWYWxzLCBiVmFscywgJGR0eXBlKTtcbiAgICAgICAgICAgIHJldHVybiBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHJlc3VsdFNoYXBlLCAkZHR5cGUsIHJlc3VsdERhdGEpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbi8qKlxuICogVGVtcGxhdGUgdGhhdCBjcmVhdGVzIHRoZSBjb21wbGV4IHR5cGUgaW1wbGVtZW50YXRpb24gZm9yIGJpbmFyeSBvcHMuXG4gKiBTdXBwb3J0cyBicm9hZGNhc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb21wbGV4QmluYXJ5S2VybmVsSW1wbChvcCkge1xuICAgIHJldHVybiAoYVNoYXBlLCBiU2hhcGUsIGFSZWFsVmFscywgYUltYWdWYWxzLCBiUmVhbFZhbHMsIGJJbWFnVmFscykgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHRTaGFwZSA9IGJhY2tlbmRfdXRpbC5hc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZShhU2hhcGUsIGJTaGFwZSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVzdWx0U2hhcGUpO1xuICAgICAgICBjb25zdCByZXN1bHRSYW5rID0gcmVzdWx0U2hhcGUubGVuZ3RoO1xuICAgICAgICBjb25zdCByZXN1bHRTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhyZXN1bHRTaGFwZSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdFJlYWxWYWxzID0gdXRpbC5nZXRUeXBlZEFycmF5RnJvbURUeXBlKCdmbG9hdDMyJywgcmVzdWx0U2l6ZSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdEltYWdWYWxzID0gdXRpbC5nZXRUeXBlZEFycmF5RnJvbURUeXBlKCdmbG9hdDMyJywgcmVzdWx0U2l6ZSk7XG4gICAgICAgIGNvbnN0IGFCcm9hZGNhc3REaW1zID0gYmFja2VuZF91dGlsLmdldEJyb2FkY2FzdERpbXMoYVNoYXBlLCByZXN1bHRTaGFwZSk7XG4gICAgICAgIGNvbnN0IGJCcm9hZGNhc3REaW1zID0gYmFja2VuZF91dGlsLmdldEJyb2FkY2FzdERpbXMoYlNoYXBlLCByZXN1bHRTaGFwZSk7XG4gICAgICAgIGNvbnN0IGFWYWxzID0gYmFja2VuZF91dGlsLm1lcmdlUmVhbEFuZEltYWdBcnJheXMoYVJlYWxWYWxzLCBhSW1hZ1ZhbHMpO1xuICAgICAgICBjb25zdCBiVmFscyA9IGJhY2tlbmRfdXRpbC5tZXJnZVJlYWxBbmRJbWFnQXJyYXlzKGJSZWFsVmFscywgYkltYWdWYWxzKTtcbiAgICAgICAgY29uc3QgYVJhbmsgPSBhU2hhcGUubGVuZ3RoO1xuICAgICAgICBjb25zdCBhU3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoYVNoYXBlKTtcbiAgICAgICAgY29uc3QgYlJhbmsgPSBiU2hhcGUubGVuZ3RoO1xuICAgICAgICBjb25zdCBiU3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoYlNoYXBlKTtcbiAgICAgICAgaWYgKGFCcm9hZGNhc3REaW1zLmxlbmd0aCArIGJCcm9hZGNhc3REaW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRSZWFsVmFscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFJZHggPSBpICUgYVZhbHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJJZHggPSBpICUgYlZhbHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9wKGFWYWxzW2FJZHggKiAyXSwgYVZhbHNbYUlkeCAqIDIgKyAxXSwgYlZhbHNbYklkeCAqIDJdLCBiVmFsc1tiSWR4ICogMiArIDFdKTtcbiAgICAgICAgICAgICAgICByZXN1bHRSZWFsVmFsc1tpXSA9IHJlc3VsdC5yZWFsO1xuICAgICAgICAgICAgICAgIHJlc3VsdEltYWdWYWxzW2ldID0gcmVzdWx0LmltYWc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdFJlYWxWYWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbG9jID0gdXRpbC5pbmRleFRvTG9jKGksIHJlc3VsdFJhbmssIHJlc3VsdFN0cmlkZXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFMb2MgPSBsb2Muc2xpY2UoLWFSYW5rKTtcbiAgICAgICAgICAgICAgICBhQnJvYWRjYXN0RGltcy5mb3JFYWNoKGQgPT4gYUxvY1tkXSA9IDApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFJbmRleCA9IHV0aWwubG9jVG9JbmRleChhTG9jLCBhUmFuaywgYVN0cmlkZXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJMb2MgPSBsb2Muc2xpY2UoLWJSYW5rKTtcbiAgICAgICAgICAgICAgICBiQnJvYWRjYXN0RGltcy5mb3JFYWNoKGQgPT4gYkxvY1tkXSA9IDApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJJbmRleCA9IHV0aWwubG9jVG9JbmRleChiTG9jLCBiUmFuaywgYlN0cmlkZXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wUmVzdWx0ID0gb3AoYVZhbHNbYUluZGV4ICogMl0sIGFWYWxzW2FJbmRleCAqIDIgKyAxXSwgYlZhbHNbYkluZGV4ICogMl0sIGJWYWxzW2JJbmRleCAqIDIgKyAxXSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0UmVhbFZhbHNbaV0gPSBvcFJlc3VsdC5yZWFsO1xuICAgICAgICAgICAgICAgIHJlc3VsdEltYWdWYWxzW2ldID0gb3BSZXN1bHQuaW1hZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW3Jlc3VsdFJlYWxWYWxzLCByZXN1bHRJbWFnVmFscywgcmVzdWx0U2hhcGVdO1xuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iaW5hcnlfdXRpbHMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFkZCB9IGZyb20gJy4uL2tlcm5lbHMvQWRkJztcbmltcG9ydCB7IGNvbXBsZXggfSBmcm9tICcuLi9rZXJuZWxzL0NvbXBsZXgnO1xuaW1wb3J0IHsgY29uY2F0IH0gZnJvbSAnLi4va2VybmVscy9Db25jYXQnO1xuaW1wb3J0IHsgaWRlbnRpdHkgfSBmcm9tICcuLi9rZXJuZWxzL0lkZW50aXR5JztcbmltcG9ydCB7IGltYWcgfSBmcm9tICcuLi9rZXJuZWxzL0ltYWcnO1xuaW1wb3J0IHsgbXVsdGlwbHkgfSBmcm9tICcuLi9rZXJuZWxzL011bHRpcGx5JztcbmltcG9ydCB7IHJlYWwgfSBmcm9tICcuLi9rZXJuZWxzL1JlYWwnO1xuaW1wb3J0IHsgcmVhbERpdkNvbmZpZyB9IGZyb20gJy4uL2tlcm5lbHMvUmVhbERpdic7XG5pbXBvcnQgeyBzbGljZSB9IGZyb20gJy4uL2tlcm5lbHMvU2xpY2UnO1xuaW1wb3J0IHsgc3ViIH0gZnJvbSAnLi4va2VybmVscy9TdWInO1xuLyoqXG4gKiBDYWxjdWxhdGUgRkZUIG9mIGlubmVyIG1vc3QgZWxlbWVudHMgb2YgYmF0Y2ggdGVuc29yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmZ0QmF0Y2goaW5wdXQsIGludmVyc2UsIGNwdUJhY2tlbmQpIHtcbiAgICBjb25zdCBpbnB1dFNoYXBlID0gaW5wdXQuc2hhcGU7XG4gICAgY29uc3QgYmF0Y2ggPSBpbnB1dFNoYXBlWzBdO1xuICAgIGNvbnN0IGlubmVyRGltID0gaW5wdXRTaGFwZVsxXTtcbiAgICBjb25zdCBpbnB1dFZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KGlucHV0LmRhdGFJZCk7XG4gICAgY29uc3QgcmVhbDJEID0gaW5wdXRWYWxzLmNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsO1xuICAgIGNvbnN0IGltYWcyRCA9IGlucHV0VmFscy5jb21wbGV4VGVuc29ySW5mb3MuaW1hZztcbiAgICAvLyBDb2xsZWN0cyByZWFsIGFuZCBpbWFnaW5hcnkgdmFsdWVzIHNlcGFyYXRlbHkuXG4gICAgY29uc3QgcmVzdWx0U2hhcGUgPSBbYmF0Y2gsIGlubmVyRGltXTtcbiAgICBjb25zdCByZXN1bHRTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlc3VsdFNoYXBlKTtcbiAgICBjb25zdCByZXN1bHRSZWFsID0gdXRpbC5nZXRUeXBlZEFycmF5RnJvbURUeXBlKCdmbG9hdDMyJywgcmVzdWx0U2l6ZSk7XG4gICAgY29uc3QgcmVzdWx0SW1hZyA9IHV0aWwuZ2V0VHlwZWRBcnJheUZyb21EVHlwZSgnZmxvYXQzMicsIHJlc3VsdFNpemUpO1xuICAgIGZvciAobGV0IGIgPSAwOyBiIDwgYmF0Y2g7IGIrKykge1xuICAgICAgICAvLyBUT0RPOiBTdXBwb3J0IHNsaWNlIG9wcyBmb3IgY29tcGxleCB0eXBlLlxuICAgICAgICBjb25zdCByID0gc2xpY2Uoe1xuICAgICAgICAgICAgaW5wdXRzOiB7IHg6IHJlYWwyRCB9LFxuICAgICAgICAgICAgYmFja2VuZDogY3B1QmFja2VuZCxcbiAgICAgICAgICAgIGF0dHJzOiB7IGJlZ2luOiBbYiwgMF0sIHNpemU6IFsxLCBpbm5lckRpbV0gfVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgaSA9IHNsaWNlKHtcbiAgICAgICAgICAgIGlucHV0czogeyB4OiBpbWFnMkQgfSxcbiAgICAgICAgICAgIGJhY2tlbmQ6IGNwdUJhY2tlbmQsXG4gICAgICAgICAgICBhdHRyczogeyBiZWdpbjogW2IsIDBdLCBzaXplOiBbMSwgaW5uZXJEaW1dIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gY29tcGxleCh7IGlucHV0czogeyByZWFsOiByLCBpbWFnOiBpIH0sIGJhY2tlbmQ6IGNwdUJhY2tlbmQgfSk7XG4gICAgICAgIC8vIFJ1biBGRlQgYnkgYmF0Y2ggZWxlbWVudC5cbiAgICAgICAgY29uc3QgeyByZWFsLCBpbWFnIH0gPSBmZnRJbXBsKGlucHV0LCBpbnZlcnNlLCBjcHVCYWNrZW5kKTtcbiAgICAgICAgY29uc3QgcmVzID0gYmFja2VuZF91dGlsLm1lcmdlUmVhbEFuZEltYWdBcnJheXMocmVhbCwgaW1hZyk7XG4gICAgICAgIGZvciAobGV0IGQgPSAwOyBkIDwgaW5uZXJEaW07IGQrKykge1xuICAgICAgICAgICAgY29uc3QgYyA9IGJhY2tlbmRfdXRpbC5nZXRDb21wbGV4V2l0aEluZGV4KHJlcywgZCk7XG4gICAgICAgICAgICByZXN1bHRSZWFsW2IgKiBpbm5lckRpbSArIGRdID0gYy5yZWFsO1xuICAgICAgICAgICAgcmVzdWx0SW1hZ1tiICogaW5uZXJEaW0gKyBkXSA9IGMuaW1hZztcbiAgICAgICAgfVxuICAgICAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHIpO1xuICAgICAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGkpO1xuICAgICAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGlucHV0KTtcbiAgICB9XG4gICAgY29uc3QgJHJlYWxJbmZvID0gY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbyhyZXN1bHRTaGFwZSwgJ2Zsb2F0MzInLCByZXN1bHRSZWFsKTtcbiAgICBjb25zdCAkaW1hZ0luZm8gPSBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHJlc3VsdFNoYXBlLCAnZmxvYXQzMicsIHJlc3VsdEltYWcpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBsZXgoeyBpbnB1dHM6IHsgcmVhbDogJHJlYWxJbmZvLCBpbWFnOiAkaW1hZ0luZm8gfSwgYmFja2VuZDogY3B1QmFja2VuZCB9KTtcbiAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKCRyZWFsSW5mbyk7XG4gICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbygkaW1hZ0luZm8pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgZnVuY3Rpb24gZmZ0SW1wbChpbnB1dCwgaW52ZXJzZSwgY3B1QmFja2VuZCkge1xuICAgIGNvbnN0IGlucHV0U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShpbnB1dC5zaGFwZSk7XG4gICAgY29uc3QgaW5wdXRWYWxzID0gY3B1QmFja2VuZC5kYXRhLmdldChpbnB1dC5kYXRhSWQpO1xuICAgIGNvbnN0IHJlYWxWYWxzID0gY3B1QmFja2VuZC5kYXRhLmdldChpbnB1dFZhbHMuY29tcGxleFRlbnNvckluZm9zLnJlYWwuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgaW1hZ1ZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KGlucHV0VmFscy5jb21wbGV4VGVuc29ySW5mb3MuaW1hZy5kYXRhSWQpLnZhbHVlcztcbiAgICBpZiAoaXNFeHBvbmVudE9mMihpbnB1dFNpemUpKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGZmdFJhZGl4MihyZWFsVmFscywgaW1hZ1ZhbHMsIGlucHV0U2l6ZSwgaW52ZXJzZSwgY3B1QmFja2VuZCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdFNoYXBlID0gW2lucHV0LnNoYXBlWzBdLCBpbnB1dC5zaGFwZVsxXV07XG4gICAgICAgIGlmIChpbnZlcnNlKSB7XG4gICAgICAgICAgICBjb25zdCByZWFsSW5mbyA9IGNwdUJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVzdWx0U2hhcGUsICdmbG9hdDMyJywgcmVzdWx0LnJlYWwpO1xuICAgICAgICAgICAgY29uc3QgaW1hZ0luZm8gPSBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHJlc3VsdFNoYXBlLCAnZmxvYXQzMicsIHJlc3VsdC5pbWFnKTtcbiAgICAgICAgICAgIGNvbnN0IHNpemVJbmZvID0gY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbyhbXSwgJ2Zsb2F0MzInLCB1dGlsLmNyZWF0ZVNjYWxhclZhbHVlKGlucHV0U2l6ZSwgJ2Zsb2F0MzInKSk7XG4gICAgICAgICAgICBjb25zdCBzaXplSW5mb0NvcHkgPSBpZGVudGl0eSh7IGlucHV0czogeyB4OiBzaXplSW5mbyB9LCBiYWNrZW5kOiBjcHVCYWNrZW5kIH0pO1xuICAgICAgICAgICAgY29uc3QgZGl2UmVhbEluZm8gPSByZWFsRGl2Q29uZmlnLmtlcm5lbEZ1bmMoeyBpbnB1dHM6IHsgYTogcmVhbEluZm8sIGI6IHNpemVJbmZvIH0sIGJhY2tlbmQ6IGNwdUJhY2tlbmQgfSk7XG4gICAgICAgICAgICBjb25zdCBkaXZJbWFnSW5mbyA9IHJlYWxEaXZDb25maWcua2VybmVsRnVuYyh7IGlucHV0czogeyBhOiBpbWFnSW5mbywgYjogc2l6ZUluZm9Db3B5IH0sIGJhY2tlbmQ6IGNwdUJhY2tlbmQgfSk7XG4gICAgICAgICAgICBjb25zdCBkaXZSZWFsVmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoZGl2UmVhbEluZm8uZGF0YUlkKS52YWx1ZXM7XG4gICAgICAgICAgICBjb25zdCBkaXZJbWFnVmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoZGl2SW1hZ0luZm8uZGF0YUlkKS52YWx1ZXM7XG4gICAgICAgICAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlYWxJbmZvKTtcbiAgICAgICAgICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaW1hZ0luZm8pO1xuICAgICAgICAgICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhzaXplSW5mbyk7XG4gICAgICAgICAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHNpemVJbmZvQ29weSk7XG4gICAgICAgICAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGRpdlJlYWxJbmZvKTtcbiAgICAgICAgICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oZGl2SW1hZ0luZm8pO1xuICAgICAgICAgICAgcmV0dXJuIHsgcmVhbDogZGl2UmVhbFZhbHMsIGltYWc6IGRpdkltYWdWYWxzIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBiYWNrZW5kX3V0aWwubWVyZ2VSZWFsQW5kSW1hZ0FycmF5cyhyZWFsVmFscywgaW1hZ1ZhbHMpO1xuICAgICAgICBjb25zdCByYXdPdXRwdXQgPSBmb3VyaWVyVHJhbnNmb3JtQnlNYXRtdWwoZGF0YSwgaW5wdXRTaXplLCBpbnZlcnNlKTtcbiAgICAgICAgcmV0dXJuIGJhY2tlbmRfdXRpbC5zcGxpdFJlYWxBbmRJbWFnQXJyYXlzKHJhd091dHB1dCk7XG4gICAgfVxufVxuZnVuY3Rpb24gaXNFeHBvbmVudE9mMihzaXplKSB7XG4gICAgcmV0dXJuIChzaXplICYgc2l6ZSAtIDEpID09PSAwO1xufVxuLy8gRkZUIHVzaW5nIENvb2xleS1UdWtleSBhbGdvcml0aG0gb24gcmFkaXggMiBkaW1lbnNpb25hbCBpbnB1dC5cbmZ1bmN0aW9uIGZmdFJhZGl4MihyZWFsVmFscywgaW1hZ1ZhbHMsIHNpemUsIGludmVyc2UsIGNwdUJhY2tlbmQpIHtcbiAgICBpZiAoc2l6ZSA9PT0gMSkge1xuICAgICAgICByZXR1cm4geyByZWFsOiByZWFsVmFscywgaW1hZzogaW1hZ1ZhbHMgfTtcbiAgICB9XG4gICAgY29uc3QgZGF0YSA9IGJhY2tlbmRfdXRpbC5tZXJnZVJlYWxBbmRJbWFnQXJyYXlzKHJlYWxWYWxzLCBpbWFnVmFscyk7XG4gICAgY29uc3QgaGFsZiA9IHNpemUgLyAyO1xuICAgIGNvbnN0IGV2ZW5Db21wbGV4ID0gYmFja2VuZF91dGlsLmNvbXBsZXhXaXRoRXZlbkluZGV4KGRhdGEpO1xuICAgIGNvbnN0IGV2ZW5SZWFsVmFscyA9IGV2ZW5Db21wbGV4LnJlYWw7XG4gICAgY29uc3QgZXZlbkltYWdWYWxzID0gZXZlbkNvbXBsZXguaW1hZztcbiAgICBjb25zdCBldmVuU2hhcGUgPSBbZXZlblJlYWxWYWxzLmxlbmd0aF07XG4gICAgY29uc3QgZXZlblJlYWxJbmZvID0gY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbyhldmVuU2hhcGUsICdmbG9hdDMyJywgZXZlblJlYWxWYWxzKTtcbiAgICBjb25zdCBldmVuSW1hZ0luZm8gPSBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGV2ZW5TaGFwZSwgJ2Zsb2F0MzInLCBldmVuSW1hZ1ZhbHMpO1xuICAgIGNvbnN0IGV2ZW5UZW5zb3JJbmZvID0gY29tcGxleCh7IGlucHV0czogeyByZWFsOiBldmVuUmVhbEluZm8sIGltYWc6IGV2ZW5JbWFnSW5mbyB9LCBiYWNrZW5kOiBjcHVCYWNrZW5kIH0pO1xuICAgIGNvbnN0IG9kZENvbXBsZXggPSBiYWNrZW5kX3V0aWwuY29tcGxleFdpdGhPZGRJbmRleChkYXRhKTtcbiAgICBjb25zdCBvZGRSZWFsVmFscyA9IG9kZENvbXBsZXgucmVhbDtcbiAgICBjb25zdCBvZGRJbWFnVmFscyA9IG9kZENvbXBsZXguaW1hZztcbiAgICBjb25zdCBvZGRTaGFwZSA9IFtvZGRSZWFsVmFscy5sZW5ndGhdO1xuICAgIGNvbnN0IG9kZFJlYWxJbmZvID0gY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbyhvZGRTaGFwZSwgJ2Zsb2F0MzInLCBvZGRSZWFsVmFscyk7XG4gICAgY29uc3Qgb2RkSW1hZ0luZm8gPSBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG9kZFNoYXBlLCAnZmxvYXQzMicsIG9kZEltYWdWYWxzKTtcbiAgICBjb25zdCBvZGRUZW5zb3JJbmZvID0gY29tcGxleCh7IGlucHV0czogeyByZWFsOiBvZGRSZWFsSW5mbywgaW1hZzogb2RkSW1hZ0luZm8gfSwgYmFja2VuZDogY3B1QmFja2VuZCB9KTtcbiAgICAvLyBSZWN1cnNpdmUgY2FsbCBmb3IgaGFsZiBwYXJ0IG9mIG9yaWdpbmFsIGlucHV0LlxuICAgIGNvbnN0ICRldmVuQ29tcGxleCA9IGZmdFJhZGl4MihldmVuUmVhbFZhbHMsIGV2ZW5JbWFnVmFscywgaGFsZiwgaW52ZXJzZSwgY3B1QmFja2VuZCk7XG4gICAgY29uc3QgJGV2ZW5SZWFsVmFscyA9ICRldmVuQ29tcGxleC5yZWFsO1xuICAgIGNvbnN0ICRldmVuSW1hZ1ZhbHMgPSAkZXZlbkNvbXBsZXguaW1hZztcbiAgICBjb25zdCAkZXZlblNoYXBlID0gWyRldmVuUmVhbFZhbHMubGVuZ3RoXTtcbiAgICBjb25zdCAkZXZlblJlYWxJbmZvID0gY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbygkZXZlblNoYXBlLCAnZmxvYXQzMicsICRldmVuUmVhbFZhbHMpO1xuICAgIGNvbnN0ICRldmVuSW1hZ0luZm8gPSBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKCRldmVuU2hhcGUsICdmbG9hdDMyJywgJGV2ZW5JbWFnVmFscyk7XG4gICAgY29uc3QgJGV2ZW5UZW5zb3JJbmZvID0gY29tcGxleCh7XG4gICAgICAgIGlucHV0czogeyByZWFsOiAkZXZlblJlYWxJbmZvLCBpbWFnOiAkZXZlbkltYWdJbmZvIH0sXG4gICAgICAgIGJhY2tlbmQ6IGNwdUJhY2tlbmRcbiAgICB9KTtcbiAgICBjb25zdCAkb2RkQ29tcGxleCA9IGZmdFJhZGl4MihvZGRSZWFsVmFscywgb2RkSW1hZ1ZhbHMsIGhhbGYsIGludmVyc2UsIGNwdUJhY2tlbmQpO1xuICAgIGNvbnN0ICRvZGRSZWFsVmFscyA9ICRvZGRDb21wbGV4LnJlYWw7XG4gICAgY29uc3QgJG9kZEltYWdWYWxzID0gJG9kZENvbXBsZXguaW1hZztcbiAgICBjb25zdCAkb2RkU2hhcGUgPSBbJG9kZFJlYWxWYWxzLmxlbmd0aF07XG4gICAgY29uc3QgJG9kZFJlYWxJbmZvID0gY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbygkb2RkU2hhcGUsICdmbG9hdDMyJywgJG9kZFJlYWxWYWxzKTtcbiAgICBjb25zdCAkb2RkSW1hZ0luZm8gPSBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKCRvZGRTaGFwZSwgJ2Zsb2F0MzInLCAkb2RkSW1hZ1ZhbHMpO1xuICAgIGNvbnN0ICRvZGRUZW5zb3JJbmZvID0gY29tcGxleCh7IGlucHV0czogeyByZWFsOiAkb2RkUmVhbEluZm8sIGltYWc6ICRvZGRJbWFnSW5mbyB9LCBiYWNrZW5kOiBjcHVCYWNrZW5kIH0pO1xuICAgIGNvbnN0IGUgPSBiYWNrZW5kX3V0aWwuZXhwb25lbnRzKHNpemUsIGludmVyc2UpO1xuICAgIGNvbnN0IGVTaGFwZSA9IFtlLnJlYWwubGVuZ3RoXTtcbiAgICBjb25zdCBlUmVhbEluZm8gPSBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGVTaGFwZSwgJ2Zsb2F0MzInLCBlLnJlYWwpO1xuICAgIGNvbnN0IGVJbWFnSW5mbyA9IGNwdUJhY2tlbmQubWFrZVRlbnNvckluZm8oZVNoYXBlLCAnZmxvYXQzMicsIGUuaW1hZyk7XG4gICAgY29uc3QgY29tcGxleEluZm8gPSBjb21wbGV4KHsgaW5wdXRzOiB7IHJlYWw6IGVSZWFsSW5mbywgaW1hZzogZUltYWdJbmZvIH0sIGJhY2tlbmQ6IGNwdUJhY2tlbmQgfSk7XG4gICAgY29uc3QgZXhwb25lbnRJbmZvID0gbXVsdGlwbHkoeyBpbnB1dHM6IHsgYTogY29tcGxleEluZm8sIGI6ICRvZGRUZW5zb3JJbmZvIH0sIGJhY2tlbmQ6IGNwdUJhY2tlbmQgfSk7XG4gICAgY29uc3QgYWRkUGFydCA9IGFkZCh7XG4gICAgICAgIGlucHV0czogeyBhOiAkZXZlblRlbnNvckluZm8sIGI6IGV4cG9uZW50SW5mbyB9LFxuICAgICAgICBiYWNrZW5kOiBjcHVCYWNrZW5kXG4gICAgfSk7XG4gICAgY29uc3Qgc3ViUGFydCA9IHN1Yih7XG4gICAgICAgIGlucHV0czogeyBhOiAkZXZlblRlbnNvckluZm8sIGI6IGV4cG9uZW50SW5mbyB9LFxuICAgICAgICBiYWNrZW5kOiBjcHVCYWNrZW5kXG4gICAgfSk7XG4gICAgY29uc3QgYWRkUGFydFJlYWwgPSByZWFsKHsgaW5wdXRzOiB7IGlucHV0OiBhZGRQYXJ0IH0sIGJhY2tlbmQ6IGNwdUJhY2tlbmQgfSk7XG4gICAgY29uc3Qgc3ViUGFydFJlYWwgPSByZWFsKHsgaW5wdXRzOiB7IGlucHV0OiBzdWJQYXJ0IH0sIGJhY2tlbmQ6IGNwdUJhY2tlbmQgfSk7XG4gICAgY29uc3QgYWRkUGFydEltYWcgPSBpbWFnKHsgaW5wdXRzOiB7IGlucHV0OiBhZGRQYXJ0IH0sIGJhY2tlbmQ6IGNwdUJhY2tlbmQgfSk7XG4gICAgY29uc3Qgc3ViUGFydEltYWcgPSBpbWFnKHsgaW5wdXRzOiB7IGlucHV0OiBzdWJQYXJ0IH0sIGJhY2tlbmQ6IGNwdUJhY2tlbmQgfSk7XG4gICAgY29uc3QgJHJlYWwgPSBjb25jYXQoe1xuICAgICAgICBpbnB1dHM6IFthZGRQYXJ0UmVhbCwgc3ViUGFydFJlYWxdLFxuICAgICAgICBiYWNrZW5kOiBjcHVCYWNrZW5kLFxuICAgICAgICBhdHRyczogeyBheGlzOiAwIH1cbiAgICB9KTtcbiAgICBjb25zdCAkaW1hZyA9IGNvbmNhdCh7XG4gICAgICAgIGlucHV0czogW2FkZFBhcnRJbWFnLCBzdWJQYXJ0SW1hZ10sXG4gICAgICAgIGJhY2tlbmQ6IGNwdUJhY2tlbmQsXG4gICAgICAgIGF0dHJzOiB7IGF4aXM6IDAgfVxuICAgIH0pO1xuICAgIGNvbnN0ICRyZWFsVmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoJHJlYWwuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgJGltYWdWYWxzID0gY3B1QmFja2VuZC5kYXRhLmdldCgkaW1hZy5kYXRhSWQpLnZhbHVlcztcbiAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGV2ZW5SZWFsSW5mbyk7XG4gICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhldmVuSW1hZ0luZm8pO1xuICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oZXZlblRlbnNvckluZm8pO1xuICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ob2RkUmVhbEluZm8pO1xuICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ob2RkSW1hZ0luZm8pO1xuICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ob2RkVGVuc29ySW5mbyk7XG4gICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbygkZXZlblJlYWxJbmZvKTtcbiAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKCRldmVuSW1hZ0luZm8pO1xuICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oJGV2ZW5UZW5zb3JJbmZvKTtcbiAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKCRvZGRSZWFsSW5mbyk7XG4gICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbygkb2RkSW1hZ0luZm8pO1xuICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oJG9kZFRlbnNvckluZm8pO1xuICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oZVJlYWxJbmZvKTtcbiAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGVJbWFnSW5mbyk7XG4gICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhjb21wbGV4SW5mbyk7XG4gICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhleHBvbmVudEluZm8pO1xuICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oYWRkUGFydCk7XG4gICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhzdWJQYXJ0KTtcbiAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGFkZFBhcnRSZWFsKTtcbiAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGFkZFBhcnRJbWFnKTtcbiAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHN1YlBhcnRSZWFsKTtcbiAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHN1YlBhcnRJbWFnKTtcbiAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKCRyZWFsKTtcbiAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKCRpbWFnKTtcbiAgICByZXR1cm4geyByZWFsOiAkcmVhbFZhbHMsIGltYWc6ICRpbWFnVmFscyB9O1xufVxuLy8gQ2FsY3VsYXRlIGZvdXJpZXIgdHJhbnNmb3JtIGJ5IG11bHRwbHlpbmcgc2ludXNvaWQgbWF0cml4LlxuZnVuY3Rpb24gZm91cmllclRyYW5zZm9ybUJ5TWF0bXVsKGRhdGEsIHNpemUsIGludmVyc2UpIHtcbiAgICBjb25zdCByZXQgPSBuZXcgRmxvYXQzMkFycmF5KHNpemUgKiAyKTtcbiAgICAvLyBUT0RPOiBVc2UgbWF0bXVsIGluc3RlYWQgb25jZSBpdCBzdXBwb3J0cyBjb21wbGV4NjQgdHlwZS5cbiAgICBmb3IgKGxldCByID0gMDsgciA8IHNpemU7IHIrKykge1xuICAgICAgICBsZXQgcmVhbCA9IDAuMDtcbiAgICAgICAgbGV0IGltYWcgPSAwLjA7XG4gICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgc2l6ZTsgYysrKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gYmFja2VuZF91dGlsLmV4cG9uZW50KHIgKiBjLCBzaXplLCBpbnZlcnNlKTtcbiAgICAgICAgICAgIGNvbnN0IHRlcm0gPSBiYWNrZW5kX3V0aWwuZ2V0Q29tcGxleFdpdGhJbmRleChkYXRhLCBjKTtcbiAgICAgICAgICAgIHJlYWwgKz0gdGVybS5yZWFsICogZS5yZWFsIC0gdGVybS5pbWFnICogZS5pbWFnO1xuICAgICAgICAgICAgaW1hZyArPSB0ZXJtLnJlYWwgKiBlLmltYWcgKyB0ZXJtLmltYWcgKiBlLnJlYWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGludmVyc2UpIHtcbiAgICAgICAgICAgIHJlYWwgLz0gc2l6ZTtcbiAgICAgICAgICAgIGltYWcgLz0gc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBiYWNrZW5kX3V0aWwuYXNzaWduVG9UeXBlZEFycmF5KHJldCwgcmVhbCwgaW1hZywgcik7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mZnRfdXRpbHMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZWx1IH0gZnJvbSAnLi4va2VybmVscy9FbHUnO1xuaW1wb3J0IHsgaWRlbnRpdHkgfSBmcm9tICcuLi9rZXJuZWxzL0lkZW50aXR5JztcbmltcG9ydCB7IGxlYWt5UmVsdSB9IGZyb20gJy4uL2tlcm5lbHMvTGVha3lSZWx1JztcbmltcG9ydCB7IHByZWx1IH0gZnJvbSAnLi4va2VybmVscy9QcmVsdSc7XG5pbXBvcnQgeyByZWx1IH0gZnJvbSAnLi4va2VybmVscy9SZWx1JztcbmltcG9ydCB7IHJlbHU2IH0gZnJvbSAnLi4va2VybmVscy9SZWx1Nic7XG5pbXBvcnQgeyBzaWdtb2lkIH0gZnJvbSAnLi4va2VybmVscy9TaWdtb2lkJztcbmV4cG9ydCBmdW5jdGlvbiBhcHBseUFjdGl2YXRpb24oYmFja2VuZCwgeCwgYWN0aXZhdGlvbiwgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cywgbGVha3lyZWx1QWxwaGEpIHtcbiAgICBpZiAoYWN0aXZhdGlvbiA9PT0gJ2xpbmVhcicpIHtcbiAgICAgICAgcmV0dXJuIGlkZW50aXR5KHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYWN0aXZhdGlvbiA9PT0gJ3JlbHUnKSB7XG4gICAgICAgIHJldHVybiByZWx1KHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYWN0aXZhdGlvbiA9PT0gJ2VsdScpIHtcbiAgICAgICAgcmV0dXJuIGVsdSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdyZWx1NicpIHtcbiAgICAgICAgcmV0dXJuIHJlbHU2KHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYWN0aXZhdGlvbiA9PT0gJ3ByZWx1Jykge1xuICAgICAgICByZXR1cm4gcHJlbHUoeyBpbnB1dHM6IHsgeCwgYWxwaGE6IHByZWx1QWN0aXZhdGlvbldlaWdodHMgfSwgYmFja2VuZCB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYWN0aXZhdGlvbiA9PT0gJ2xlYWt5cmVsdScpIHtcbiAgICAgICAgcmV0dXJuIGxlYWt5UmVsdSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQsIGF0dHJzOiB7IGFscGhhOiBsZWFreXJlbHVBbHBoYSB9IH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChhY3RpdmF0aW9uID09PSAnc2lnbW9pZCcpIHtcbiAgICAgICAgcmV0dXJuIHNpZ21vaWQoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kIH0pO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEFjdGl2YXRpb24gJHthY3RpdmF0aW9ufSBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQgZm9yIHRoZSBDUFUgYmFja2VuZC5gKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZ1c2VkX3V0aWxzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJ1ZmZlciB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgZnVuY3Rpb24gcG9vbCh4VmFsdWVzLCB4U2hhcGUsIGR0eXBlLCBzdHJpZGVzLCBjb252SW5mbywgcG9vbFR5cGUpIHtcbiAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICAgIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckhlaWdodDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoO1xuICAgIGNvbnN0IHBhZFRvcCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IHBhZExlZnQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgY29uc3QgaW5pdGlhbFZhbHVlID0gKHBvb2xUeXBlID09PSAnbWF4JyA/IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSA6XG4gICAgICAgIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7XG4gICAgY29uc3Qgb3V0cHV0ID0gYnVmZmVyKGNvbnZJbmZvLm91dFNoYXBlLCBkdHlwZSk7XG4gICAgY29uc3Qgb3V0cHV0VmFscyA9IG91dHB1dC52YWx1ZXM7XG4gICAgY29uc3Qgb3V0cHV0QmF0Y2hTdHJpZGVzID0gY29udkluZm8ub3V0U2hhcGVbMV0gKiBjb252SW5mby5vdXRTaGFwZVsyXSAqIGNvbnZJbmZvLm91dFNoYXBlWzNdO1xuICAgIGNvbnN0IG91dHB1dFJvd1N0cmlkZXMgPSBjb252SW5mby5vdXRTaGFwZVsyXSAqIGNvbnZJbmZvLm91dFNoYXBlWzNdO1xuICAgIGNvbnN0IG91dHB1dENvbFN0cmlkZXMgPSBjb252SW5mby5vdXRTaGFwZVszXTtcbiAgICBmb3IgKGxldCBiID0gMDsgYiA8IGNvbnZJbmZvLmJhdGNoU2l6ZTsgKytiKSB7XG4gICAgICAgIGNvbnN0IG91dHB1dEJhdGNoT2Zmc2V0ID0gYiAqIG91dHB1dEJhdGNoU3RyaWRlcztcbiAgICAgICAgY29uc3QgaW5wdXRCYXRjaE9mZnNldCA9IGIgKiBzdHJpZGVzWzBdO1xuICAgICAgICBmb3IgKGxldCBkID0gMDsgZCA8IGNvbnZJbmZvLmluQ2hhbm5lbHM7ICsrZCkge1xuICAgICAgICAgICAgZm9yIChsZXQgeVIgPSAwOyB5UiA8IGNvbnZJbmZvLm91dEhlaWdodDsgKyt5Uikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhSQ29ybmVyID0geVIgKiBzdHJpZGVIZWlnaHQgLSBwYWRUb3A7XG4gICAgICAgICAgICAgICAgY29uc3QgeFJNaW4gPSBNYXRoLm1heCgwLCB4UkNvcm5lcik7XG4gICAgICAgICAgICAgICAgY29uc3QgeFJNYXggPSBNYXRoLm1pbihjb252SW5mby5pbkhlaWdodCwgZWZmZWN0aXZlRmlsdGVySGVpZ2h0ICsgeFJDb3JuZXIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG91dHB1dFJvd09mZnNldCA9IG91dHB1dEJhdGNoT2Zmc2V0ICsgeVIgKiBvdXRwdXRSb3dTdHJpZGVzO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHlDID0gMDsgeUMgPCBjb252SW5mby5vdXRXaWR0aDsgKyt5Qykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4Q0Nvcm5lciA9IHlDICogc3RyaWRlV2lkdGggLSBwYWRMZWZ0O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4Q01pbiA9IE1hdGgubWF4KDAsIHhDQ29ybmVyKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeENNYXggPSBNYXRoLm1pbihjb252SW5mby5pbldpZHRoLCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCArIHhDQ29ybmVyKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1pbk1heFZhbHVlID0gaW5pdGlhbFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYXZnVmFsdWUgPSAwO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY291bnQgPSAwO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB4UiA9IHhSTWluOyB4UiA8IHhSTWF4OyB4UiArPSBkaWxhdGlvbkhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeFJPZmZzZXQgPSBpbnB1dEJhdGNoT2Zmc2V0ICsgeFIgKiBzdHJpZGVzWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgeEMgPSB4Q01pbjsgeEMgPCB4Q01heDsgeEMgKz0gZGlsYXRpb25XaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhDT2Zmc2V0ID0geFJPZmZzZXQgKyB4QyAqIHN0cmlkZXNbMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGl4ZWwgPSB4VmFsdWVzW3hDT2Zmc2V0ICsgZF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwb29sVHlwZSA9PT0gJ21heCcgJiYgcGl4ZWwgPiBtaW5NYXhWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluTWF4VmFsdWUgPSBwaXhlbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocG9vbFR5cGUgPT09ICdhdmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Z1ZhbHVlICs9IHBpeGVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc05hTihtaW5NYXhWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBvdXRwdXRPZmZzZXQgPSBvdXRwdXRSb3dPZmZzZXQgKyB5QyAqIG91dHB1dENvbFN0cmlkZXMgKyBkO1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRWYWxzW291dHB1dE9mZnNldF0gPVxuICAgICAgICAgICAgICAgICAgICAgICAgcG9vbFR5cGUgPT09ICdhdmcnID8gYXZnVmFsdWUgLyBjb3VudCA6IG1pbk1heFZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xufVxuZXhwb3J0IGZ1bmN0aW9uIG1heFBvb2xQb3NpdGlvbnMoeFZhbHVlcywgeFNoYXBlLCBkdHlwZSwgY29udkluZm8sIGZsYXR0ZW5Qb3NpdGlvbnMgPSBmYWxzZSwgaW5jbHVkZUJhdGNoSW5JbmRleCA9IGZhbHNlKSB7XG4gICAgY29uc3QgbWF4UG9zaXRpb25zID0gYnVmZmVyKGNvbnZJbmZvLm91dFNoYXBlLCAnaW50MzInKTtcbiAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICAgIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckhlaWdodDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoO1xuICAgIGNvbnN0IHBhZFRvcCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IHBhZExlZnQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgY29uc3QgeEJ1ZiA9IGJ1ZmZlcih4U2hhcGUsIGR0eXBlLCB4VmFsdWVzKTtcbiAgICBmb3IgKGxldCBiID0gMDsgYiA8IGNvbnZJbmZvLmJhdGNoU2l6ZTsgKytiKSB7XG4gICAgICAgIGZvciAobGV0IGQgPSAwOyBkIDwgY29udkluZm8uaW5DaGFubmVsczsgKytkKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB5UiA9IDA7IHlSIDwgY29udkluZm8ub3V0SGVpZ2h0OyArK3lSKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeFJDb3JuZXIgPSB5UiAqIHN0cmlkZUhlaWdodCAtIHBhZFRvcDtcbiAgICAgICAgICAgICAgICBsZXQgeFJNaW4gPSB4UkNvcm5lcjtcbiAgICAgICAgICAgICAgICB3aGlsZSAoeFJNaW4gPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHhSTWluICs9IGRpbGF0aW9uSGVpZ2h0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBjb25zdCB4Uk1pbiA9IE1hdGgubWF4KDAsIHhSQ29ybmVyKTtcbiAgICAgICAgICAgICAgICBjb25zdCB4Uk1heCA9IE1hdGgubWluKGNvbnZJbmZvLmluSGVpZ2h0LCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgKyB4UkNvcm5lcik7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgeUMgPSAwOyB5QyA8IGNvbnZJbmZvLm91dFdpZHRoOyArK3lDKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhDQ29ybmVyID0geUMgKiBzdHJpZGVXaWR0aCAtIHBhZExlZnQ7XG4gICAgICAgICAgICAgICAgICAgIGxldCB4Q01pbiA9IHhDQ29ybmVyO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeENNaW4gPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB4Q01pbiArPSBkaWxhdGlvbldpZHRoO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhDTWF4ID0gTWF0aC5taW4oY29udkluZm8uaW5XaWR0aCwgZWZmZWN0aXZlRmlsdGVyV2lkdGggKyB4Q0Nvcm5lcik7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtYXhWYWx1ZSA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1heFBvc2l0aW9uID0gLTE7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHhSID0geFJNaW47IHhSIDwgeFJNYXg7IHhSICs9IGRpbGF0aW9uSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3UiA9IHhSIC0geFJDb3JuZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB4QyA9IHhDTWluOyB4QyA8IHhDTWF4OyB4QyArPSBkaWxhdGlvbldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd0MgPSB4QyAtIHhDQ29ybmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBpeGVsID0geEJ1Zi5nZXQoYiwgeFIsIHhDLCBkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGl4ZWwgPiBtYXhWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhWYWx1ZSA9IHBpeGVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmxhdHRlblBvc2l0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UG9zaXRpb24gPSBpbmNsdWRlQmF0Y2hJbkluZGV4ID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGIgKiBjb252SW5mby5pbkhlaWdodCArIHhSKSAqIGNvbnZJbmZvLmluV2lkdGggKyB4QykgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252SW5mby5pbkNoYW5uZWxzICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHhSICogY29udkluZm8uaW5XaWR0aCArIHhDKSAqIGNvbnZJbmZvLmluQ2hhbm5lbHMgKyBkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UG9zaXRpb24gPSB3UiAqIGVmZmVjdGl2ZUZpbHRlcldpZHRoICsgd0M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWF4UG9zaXRpb25zLnNldChtYXhQb3NpdGlvbiwgYiwgeVIsIHlDLCBkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1heFBvc2l0aW9ucztcbn1cbmV4cG9ydCBmdW5jdGlvbiBwb29sM2QoeFZhbHVlcywgeFNoYXBlLCBkdHlwZSwgc3RyaWRlcywgY29udkluZm8sIHBvb2xUeXBlKSB7XG4gICAgY29uc3Qgc3RyaWRlRGVwdGggPSBjb252SW5mby5zdHJpZGVEZXB0aDtcbiAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBkaWxhdGlvbkRlcHRoID0gY29udkluZm8uZGlsYXRpb25EZXB0aDtcbiAgICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICAgIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckRlcHRoID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVyRGVwdGg7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVySGVpZ2h0ID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlcldpZHRoID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVyV2lkdGg7XG4gICAgY29uc3QgcGFkRnJvbnQgPSBjb252SW5mby5wYWRJbmZvLmZyb250O1xuICAgIGNvbnN0IHBhZFRvcCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IHBhZExlZnQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgY29uc3QgaW5pdGlhbFZhbHVlID0gKHBvb2xUeXBlID09PSAnbWF4JyA/IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSA6XG4gICAgICAgIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7XG4gICAgY29uc3Qgb3V0cHV0ID0gYnVmZmVyKGNvbnZJbmZvLm91dFNoYXBlLCBkdHlwZSk7XG4gICAgY29uc3Qgb3V0cHV0VmFscyA9IG91dHB1dC52YWx1ZXM7XG4gICAgY29uc3Qgb3V0cHV0QmF0Y2hTdHJpZGVzID0gY29udkluZm8ub3V0U2hhcGVbMV0gKiBjb252SW5mby5vdXRTaGFwZVsyXSAqXG4gICAgICAgIGNvbnZJbmZvLm91dFNoYXBlWzNdICogY29udkluZm8ub3V0U2hhcGVbNF07XG4gICAgY29uc3Qgb3V0cHV0RGVwdGhTdHJpZGVzID0gY29udkluZm8ub3V0U2hhcGVbMl0gKiBjb252SW5mby5vdXRTaGFwZVszXSAqIGNvbnZJbmZvLm91dFNoYXBlWzRdO1xuICAgIGNvbnN0IG91dHB1dFJvd1N0cmlkZXMgPSBjb252SW5mby5vdXRTaGFwZVszXSAqIGNvbnZJbmZvLm91dFNoYXBlWzRdO1xuICAgIGNvbnN0IG91dHB1dENvbFN0cmlkZXMgPSBjb252SW5mby5vdXRTaGFwZVs0XTtcbiAgICBmb3IgKGxldCBiYXRjaCA9IDA7IGJhdGNoIDwgY29udkluZm8uYmF0Y2hTaXplOyArK2JhdGNoKSB7XG4gICAgICAgIGNvbnN0IG91dHB1dEJhdGNoT2Zmc2V0ID0gYmF0Y2ggKiBvdXRwdXRCYXRjaFN0cmlkZXM7XG4gICAgICAgIGNvbnN0IGlucHV0QmF0Y2hPZmZzZXQgPSBiYXRjaCAqIHN0cmlkZXNbMF07XG4gICAgICAgIGZvciAobGV0IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgY29udkluZm8uaW5DaGFubmVsczsgKytjaGFubmVsKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB5RGVwdGggPSAwOyB5RGVwdGggPCBjb252SW5mby5vdXREZXB0aDsgKyt5RGVwdGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4RGVwdGhDb3JuZXIgPSB5RGVwdGggKiBzdHJpZGVEZXB0aCAtIHBhZEZyb250O1xuICAgICAgICAgICAgICAgIGxldCB4RGVwdGhNaW4gPSB4RGVwdGhDb3JuZXI7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHhEZXB0aE1pbiA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgeERlcHRoTWluICs9IGRpbGF0aW9uRGVwdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHhEZXB0aE1heCA9IE1hdGgubWluKGNvbnZJbmZvLmluRGVwdGgsIGVmZmVjdGl2ZUZpbHRlckRlcHRoICsgeERlcHRoQ29ybmVyKTtcbiAgICAgICAgICAgICAgICBjb25zdCBvdXRwdXREZXB0aE9mZnNldCA9IG91dHB1dEJhdGNoT2Zmc2V0ICsgeURlcHRoICogb3V0cHV0RGVwdGhTdHJpZGVzO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHlSb3cgPSAwOyB5Um93IDwgY29udkluZm8ub3V0SGVpZ2h0OyArK3lSb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeFJvd0Nvcm5lciA9IHlSb3cgKiBzdHJpZGVIZWlnaHQgLSBwYWRUb3A7XG4gICAgICAgICAgICAgICAgICAgIGxldCB4Um93TWluID0geFJvd0Nvcm5lcjtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhSb3dNaW4gPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB4Um93TWluICs9IGRpbGF0aW9uSGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhSb3dNYXggPSBNYXRoLm1pbihjb252SW5mby5pbkhlaWdodCwgZWZmZWN0aXZlRmlsdGVySGVpZ2h0ICsgeFJvd0Nvcm5lcik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG91dHB1dFJvd09mZnNldCA9IG91dHB1dERlcHRoT2Zmc2V0ICsgeVJvdyAqIG91dHB1dFJvd1N0cmlkZXM7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHlDb2wgPSAwOyB5Q29sIDwgY29udkluZm8ub3V0V2lkdGg7ICsreUNvbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeENvbENvcm5lciA9IHlDb2wgKiBzdHJpZGVXaWR0aCAtIHBhZExlZnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgeENvbE1pbiA9IHhDb2xDb3JuZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeENvbE1pbiA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Q29sTWluICs9IGRpbGF0aW9uV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4Q29sTWF4ID0gTWF0aC5taW4oY29udkluZm8uaW5XaWR0aCwgZWZmZWN0aXZlRmlsdGVyV2lkdGggKyB4Q29sQ29ybmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNoYWRlciBjb2RlIGJlZ2luc1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0Q29sT2Zmc2V0ID0gb3V0cHV0Um93T2Zmc2V0ICsgeUNvbCAqIG91dHB1dENvbFN0cmlkZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWluTWF4VmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXZnVmFsdWUgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHhEZXB0aCA9IHhEZXB0aE1pbjsgeERlcHRoIDwgeERlcHRoTWF4OyB4RGVwdGggKz0gZGlsYXRpb25EZXB0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhEZXB0aE9mZnNldCA9IGlucHV0QmF0Y2hPZmZzZXQgKyB4RGVwdGggKiBzdHJpZGVzWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHhSb3cgPSB4Um93TWluOyB4Um93IDwgeFJvd01heDsgeFJvdyArPSBkaWxhdGlvbkhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4Um93T2Zmc2V0ID0geERlcHRoT2Zmc2V0ICsgeFJvdyAqIHN0cmlkZXNbMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHhDb2wgPSB4Q29sTWluOyB4Q29sIDwgeENvbE1heDsgeENvbCArPSBkaWxhdGlvbldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4Q29sT2Zmc2V0ID0geFJvd09mZnNldCArIHhDb2wgKiBzdHJpZGVzWzNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGl4ZWwgPSB4VmFsdWVzW3hDb2xPZmZzZXQgKyBjaGFubmVsXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocG9vbFR5cGUgPT09ICdtYXgnICYmIHBpeGVsID4gbWluTWF4VmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluTWF4VmFsdWUgPSBwaXhlbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBvb2xUeXBlID09PSAnYXZnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Z1ZhbHVlICs9IHBpeGVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNOYU4obWluTWF4VmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKG1pbk1heFZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKG1pbk1heFZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvdXRwdXRPZmZzZXQgPSBvdXRwdXRDb2xPZmZzZXQgKyBjaGFubmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VmFsc1tvdXRwdXRPZmZzZXRdID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29sVHlwZSA9PT0gJ2F2ZycgPyBhdmdWYWx1ZSAvIGNvdW50IDogbWluTWF4VmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBtYXhQb29sM2RQb3NpdGlvbnMoeEJ1ZiwgY29udkluZm8pIHtcbiAgICBjb25zdCBtYXhQb3NpdGlvbnMgPSBidWZmZXIoY29udkluZm8ub3V0U2hhcGUsICdpbnQzMicpO1xuICAgIGNvbnN0IHN0cmlkZURlcHRoID0gY29udkluZm8uc3RyaWRlRGVwdGg7XG4gICAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgY29uc3QgZGlsYXRpb25EZXB0aCA9IGNvbnZJbmZvLmRpbGF0aW9uRGVwdGg7XG4gICAgY29uc3QgZGlsYXRpb25IZWlnaHQgPSBjb252SW5mby5kaWxhdGlvbkhlaWdodDtcbiAgICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJEZXB0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckRlcHRoO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckhlaWdodDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoO1xuICAgIGNvbnN0IHBhZEZyb250ID0gY29udkluZm8ucGFkSW5mby5mcm9udDtcbiAgICBjb25zdCBwYWRUb3AgPSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICBjb25zdCBwYWRMZWZ0ID0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgIGZvciAobGV0IGJhdGNoID0gMDsgYmF0Y2ggPCBjb252SW5mby5iYXRjaFNpemU7ICsrYmF0Y2gpIHtcbiAgICAgICAgZm9yIChsZXQgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBjb252SW5mby5pbkNoYW5uZWxzOyArK2NoYW5uZWwpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHlEZXB0aCA9IDA7IHlEZXB0aCA8IGNvbnZJbmZvLm91dERlcHRoOyArK3lEZXB0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhEZXB0aENvcm5lciA9IHlEZXB0aCAqIHN0cmlkZURlcHRoIC0gcGFkRnJvbnQ7XG4gICAgICAgICAgICAgICAgbGV0IHhEZXB0aE1pbiA9IHhEZXB0aENvcm5lcjtcbiAgICAgICAgICAgICAgICB3aGlsZSAoeERlcHRoTWluIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICB4RGVwdGhNaW4gKz0gZGlsYXRpb25EZXB0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgeERlcHRoTWF4ID0gTWF0aC5taW4oY29udkluZm8uaW5EZXB0aCwgZWZmZWN0aXZlRmlsdGVyRGVwdGggKyB4RGVwdGhDb3JuZXIpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHlSb3cgPSAwOyB5Um93IDwgY29udkluZm8ub3V0SGVpZ2h0OyArK3lSb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeFJvd0Nvcm5lciA9IHlSb3cgKiBzdHJpZGVIZWlnaHQgLSBwYWRUb3A7XG4gICAgICAgICAgICAgICAgICAgIGxldCB4Um93TWluID0geFJvd0Nvcm5lcjtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhSb3dNaW4gPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB4Um93TWluICs9IGRpbGF0aW9uSGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhSb3dNYXggPSBNYXRoLm1pbihjb252SW5mby5pbkhlaWdodCwgZWZmZWN0aXZlRmlsdGVySGVpZ2h0ICsgeFJvd0Nvcm5lcik7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHlDb2wgPSAwOyB5Q29sIDwgY29udkluZm8ub3V0V2lkdGg7ICsreUNvbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeENvbENvcm5lciA9IHlDb2wgKiBzdHJpZGVXaWR0aCAtIHBhZExlZnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgeENvbE1pbiA9IHhDb2xDb3JuZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeENvbE1pbiA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Q29sTWluICs9IGRpbGF0aW9uV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4Q29sTWF4ID0gTWF0aC5taW4oY29udkluZm8uaW5XaWR0aCwgZWZmZWN0aXZlRmlsdGVyV2lkdGggKyB4Q29sQ29ybmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNoYWRlciBjb2RlIGJlZ2luc1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1heFZhbHVlID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1heFBvc2l0aW9uID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB4RGVwdGggPSB4RGVwdGhNaW47IHhEZXB0aCA8IHhEZXB0aE1heDsgeERlcHRoICs9IGRpbGF0aW9uRGVwdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3RGVwdGggPSB4RGVwdGggLSB4RGVwdGhDb3JuZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgeFJvdyA9IHhSb3dNaW47IHhSb3cgPCB4Um93TWF4OyB4Um93ICs9IGRpbGF0aW9uSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdSb3cgPSB4Um93IC0geFJvd0Nvcm5lcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgeENvbCA9IHhDb2xNaW47IHhDb2wgPCB4Q29sTWF4OyB4Q29sICs9IGRpbGF0aW9uV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdDb2wgPSB4Q29sIC0geENvbENvcm5lcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBpeGVsID0geEJ1Zi5nZXQoYmF0Y2gsIHhEZXB0aCwgeFJvdywgeENvbCwgY2hhbm5lbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGl4ZWwgPj0gbWF4VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhWYWx1ZSA9IHBpeGVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFBvc2l0aW9uID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd0RlcHRoICogZWZmZWN0aXZlRmlsdGVySGVpZ2h0ICogZWZmZWN0aXZlRmlsdGVyV2lkdGggK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1JvdyAqIGVmZmVjdGl2ZUZpbHRlckhlaWdodCArIHdDb2w7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhQb3NpdGlvbnMuc2V0KG1heFBvc2l0aW9uLCBiYXRjaCwgeURlcHRoLCB5Um93LCB5Q29sLCBjaGFubmVsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWF4UG9zaXRpb25zO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cG9vbF91dGlscy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbi8qKlxuICogVGVtcGxhdGUgdGhhdCBjcmVhdGVzIGltcGxlbWVudGF0aW9uIGZvciB1bmFyeSBvcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNpbXBsZVVuYXJ5SW1wbChvcCkge1xuICAgIHJldHVybiAodmFsdWVzLCBkdHlwZSwgYXR0cnMpID0+IHtcbiAgICAgICAgY29uc3QgbmV3VmFsdWVzID0gdXRpbC5nZXRUeXBlZEFycmF5RnJvbURUeXBlKGR0eXBlLCB2YWx1ZXMubGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlc1tpXSA9IG9wKHZhbHVlc1tpXSwgYXR0cnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdWYWx1ZXM7XG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVuYXJ5X2ltcGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuLyoqXG4gKiBUZW1wbGF0ZSB0aGF0IGNyZWF0ZXMgYSBgS2VybmVsRnVuY2AgZm9yIHVuYXJ5IG9wcy5cbiAqIEBwYXJhbSBuYW1lIEtlcm5lbCBuYW1lLlxuICogQHBhcmFtIG9wIEEgYFNpbXBsZVVuYXJ5T3BlcmF0aW9uYCBmb3IgdGhlIGtlcm5lbC5cbiAqIEBwYXJhbSBkdHlwZSBPcHRpb25hbC4gSWYgc2V0LCB0aGUgcmVzdWx0IGhhcyB0aGlzIGR0eXBlLiBPdGhlcndpc2UsIHRoZVxuICogICAgIHJlc3VsdCBoYXMgdGhlIHNhbWUgZHR5cGUgYXMgdGhlIGlucHV0LiBUaGlzIGlzIG1haW5seSB1c2VkIGluIGNlcnRhaW5cbiAqICAgICBrZXJuZWxzIHRoYXQgcmV0dXJuIGJvb2wgdHlwZSwgc3VjaCBhcyBpc0Zpbml0ZSwgaXNJbmYsIGV0Yy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuYXJ5S2VybmVsRnVuYyhuYW1lLCBvcCwgZHR5cGUpIHtcbiAgICByZXR1cm4gKHsgaW5wdXRzLCBhdHRycywgYmFja2VuZCB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgICAgICBhc3NlcnROb3RDb21wbGV4KHgsIG5hbWUpO1xuICAgICAgICBpZiAoeC5kdHlwZSA9PT0gJ3N0cmluZycgfHwgZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VuYXJ5S2VybmVsRnVuYyBkb2VzIG5vdCBzdXBwb3J0IHN0cmluZyBpbnB1dC9vdXRwdXQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjcHVCYWNrZW5kID0gYmFja2VuZDtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gY3B1QmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgICAgICBjb25zdCB4U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSh4LnNoYXBlKTtcbiAgICAgICAgY29uc3QgJGR0eXBlID0gZHR5cGUgfHwgeC5kdHlwZTtcbiAgICAgICAgY29uc3QgbmV3VmFsdWVzID0gdXRpbC5nZXRBcnJheUZyb21EVHlwZSgkZHR5cGUsIHhTaXplKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB4U2l6ZTsgKytpKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZXNbaV0gPSBvcCh2YWx1ZXNbaV0sIGF0dHJzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbyh4LnNoYXBlLCAkZHR5cGUsIG5ld1ZhbHVlcyk7XG4gICAgfTtcbn1cbi8qKlxuICogVGVtcGxhdGUgdGhhdCBjcmVhdGVzIGEgYEtlcm5lbEZ1bmNgIGZvciB1bmFyeSBvcHMgZnJvbSB0aGUgZ2l2ZW5cbiAqIGBTaW1wbGVVbmFyeUltcGxgLi5cbiAqIEBwYXJhbSBuYW1lIEtlcm5lbCBuYW1lLlxuICogQHBhcmFtIHVuYXJ5SW1wbCBBIGBTaW1wbGVVbmFyeUltcGxgIHRoYXQgaW1wbGVtZW50cyB0aGUgb3AuXG4gKiBAcGFyYW0gZHR5cGUgT3B0aW9uYWwuIElmIHNldCwgdGhlIHJlc3VsdCBoYXMgdGhpcyBkdHlwZS4gT3RoZXJ3aXNlLCB0aGVcbiAqICAgICByZXN1bHQgaGFzIHRoZSBzYW1lIGR0eXBlIGFzIHRoZSBpbnB1dC4gVGhpcyBpcyBtYWlubHkgdXNlZCBpbiBjZXJ0YWluXG4gKiAgICAga2VybmVscyB0aGF0IHJldHVybiBib29sIHR5cGUsIHN1Y2ggYXMgaXNGaW5pdGUsIGlzSW5mLCBldGMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmFyeUtlcm5lbEZ1bmNGcm9tSW1wbChuYW1lLCB1bmFyeUltcGwsIGR0eXBlKSB7XG4gICAgcmV0dXJuICh7IGlucHV0cywgYXR0cnMsIGJhY2tlbmQgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICAgICAgYXNzZXJ0Tm90Q29tcGxleCh4LCBuYW1lKTtcbiAgICAgICAgaWYgKHguZHR5cGUgPT09ICdzdHJpbmcnIHx8IGR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmFyeUtlcm5lbEZ1bmMgZG9lcyBub3Qgc3VwcG9ydCBzdHJpbmcgaW5wdXQvb3V0cHV0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY3B1QmFja2VuZCA9IGJhY2tlbmQ7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcztcbiAgICAgICAgY29uc3QgJGR0eXBlID0gZHR5cGUgfHwgeC5kdHlwZTtcbiAgICAgICAgY29uc3QgbmV3VmFsdWVzID0gdW5hcnlJbXBsKHZhbHVlcywgJGR0eXBlLCBhdHRycyk7XG4gICAgICAgIHJldHVybiBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHguc2hhcGUsICRkdHlwZSwgbmV3VmFsdWVzKTtcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dW5hcnlfdXRpbHMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjb21wbGV4IH0gZnJvbSAnLi4va2VybmVscy9Db21wbGV4Jztcbi8qKlxuICogR2VuZXJhdGVzIGEgdGVuc29ySW5mbyB3aXRoIGFsbCB6ZXJvcyB2YWx1ZS5cbiAqIEBwYXJhbSBiYWNrZW5kIGNwdSBiYWNrZW5kLlxuICogQHBhcmFtIHNoYXBlIFNoYXBlIGZvciB0aGUgemVyb3MgdGVuc29yLlxuICogQHBhcmFtIGR0eXBlIE9wdGlvbmFsLiBJZiBzZXQsIHRoZSByZXN1bHQgaGFzIHRoaXMgZHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB6ZXJvcyhiYWNrZW5kLCBzaGFwZSwgZHR5cGUgPSAnZmxvYXQzMicpIHtcbiAgICBpZiAoZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICAgIGNvbnN0IHJlYWwgPSB6ZXJvcyhiYWNrZW5kLCBzaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICAgICAgY29uc3QgaW1hZyA9IHplcm9zKGJhY2tlbmQsIHNoYXBlLCAnZmxvYXQzMicpO1xuICAgICAgICByZXR1cm4gY29tcGxleCh7IGlucHV0czogeyByZWFsLCBpbWFnIH0sIGJhY2tlbmQgfSk7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlcyA9IHV0aWwubWFrZVplcm9zVHlwZWRBcnJheSh1dGlsLnNpemVGcm9tU2hhcGUoc2hhcGUpLCBkdHlwZSk7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oc2hhcGUsIGR0eXBlLCB2YWx1ZXMpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9emVyb3NfaW1wbC5qcy5tYXAiLCIvKiogQGxpY2Vuc2UgU2VlIHRoZSBMSUNFTlNFIGZpbGUuICovXG4vLyBUaGlzIGNvZGUgaXMgYXV0by1nZW5lcmF0ZWQsIGRvIG5vdCBtb2RpZnkgdGhpcyBmaWxlIVxuY29uc3QgdmVyc2lvbiA9ICczLjguMCc7XG5leHBvcnQgeyB2ZXJzaW9uIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD12ZXJzaW9uLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCAnLi9mbGFnc193YXNtJztcbmltcG9ydCB7IERhdGFTdG9yYWdlLCBkZXByZWNhdGlvbldhcm4sIGVuZ2luZSwgZW52LCBLZXJuZWxCYWNrZW5kLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB3YXNtRmFjdG9yeVRocmVhZGVkU2ltZCBmcm9tICcuLi93YXNtLW91dC90ZmpzLWJhY2tlbmQtd2FzbS10aHJlYWRlZC1zaW1kLmpzJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IHdhc21Xb3JrZXJDb250ZW50cyB9IGZyb20gJy4uL3dhc20tb3V0L3RmanMtYmFja2VuZC13YXNtLXRocmVhZGVkLXNpbWQud29ya2VyLmpzJztcbmltcG9ydCB3YXNtRmFjdG9yeSBmcm9tICcuLi93YXNtLW91dC90ZmpzLWJhY2tlbmQtd2FzbS5qcyc7XG5leHBvcnQgY2xhc3MgQmFja2VuZFdhc20gZXh0ZW5kcyBLZXJuZWxCYWNrZW5kIHtcbiAgICBjb25zdHJ1Y3Rvcih3YXNtKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMud2FzbSA9IHdhc207XG4gICAgICAgIC8vIDAgaXMgcmVzZXJ2ZWQgZm9yIG51bGwgZGF0YSBpZHMuXG4gICAgICAgIHRoaXMuZGF0YUlkTmV4dE51bWJlciA9IDE7XG4gICAgICAgIHRoaXMud2FzbS50ZmpzLmluaXQoKTtcbiAgICAgICAgdGhpcy5kYXRhSWRNYXAgPSBuZXcgRGF0YVN0b3JhZ2UodGhpcywgZW5naW5lKCkpO1xuICAgIH1cbiAgICB3cml0ZSh2YWx1ZXMsIHNoYXBlLCBkdHlwZSkge1xuICAgICAgICBjb25zdCBkYXRhSWQgPSB7IGlkOiB0aGlzLmRhdGFJZE5leHROdW1iZXIrKyB9O1xuICAgICAgICB0aGlzLm1vdmUoZGF0YUlkLCB2YWx1ZXMsIHNoYXBlLCBkdHlwZSwgMSk7XG4gICAgICAgIHJldHVybiBkYXRhSWQ7XG4gICAgfVxuICAgIG51bURhdGFJZHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFJZE1hcC5udW1EYXRhSWRzKCk7XG4gICAgfVxuICAgIGFzeW5jIHRpbWUoZikge1xuICAgICAgICBjb25zdCBzdGFydCA9IHV0aWwubm93KCk7XG4gICAgICAgIGYoKTtcbiAgICAgICAgY29uc3Qga2VybmVsTXMgPSB1dGlsLm5vdygpIC0gc3RhcnQ7XG4gICAgICAgIHJldHVybiB7IGtlcm5lbE1zIH07XG4gICAgfVxuICAgIG1vdmUoZGF0YUlkLCB2YWx1ZXMsIHNoYXBlLCBkdHlwZSwgcmVmQ291bnQpIHtcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLmRhdGFJZE5leHROdW1iZXIrKztcbiAgICAgICAgaWYgKGR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3Qgc3RyaW5nQnl0ZXMgPSB2YWx1ZXM7XG4gICAgICAgICAgICB0aGlzLmRhdGFJZE1hcC5zZXQoZGF0YUlkLCB7IGlkLCBzdHJpbmdCeXRlcywgc2hhcGUsIGR0eXBlLCBtZW1vcnlPZmZzZXQ6IG51bGwsIHJlZkNvdW50IH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoc2hhcGUpO1xuICAgICAgICBjb25zdCBudW1CeXRlcyA9IHNpemUgKiB1dGlsLmJ5dGVzUGVyRWxlbWVudChkdHlwZSk7XG4gICAgICAgIGNvbnN0IG1lbW9yeU9mZnNldCA9IHRoaXMud2FzbS5fbWFsbG9jKG51bUJ5dGVzKTtcbiAgICAgICAgdGhpcy5kYXRhSWRNYXAuc2V0KGRhdGFJZCwgeyBpZCwgbWVtb3J5T2Zmc2V0LCBzaGFwZSwgZHR5cGUsIHJlZkNvdW50IH0pO1xuICAgICAgICB0aGlzLndhc20udGZqcy5yZWdpc3RlclRlbnNvcihpZCwgc2l6ZSwgbWVtb3J5T2Zmc2V0KTtcbiAgICAgICAgaWYgKHZhbHVlcyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLndhc20uSEVBUFU4LnNldChuZXcgVWludDhBcnJheSh2YWx1ZXMuYnVmZmVyLCB2YWx1ZXMuYnl0ZU9mZnNldCwgbnVtQnl0ZXMpLCBtZW1vcnlPZmZzZXQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIHJlYWQoZGF0YUlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRTeW5jKGRhdGFJZCk7XG4gICAgfVxuICAgIHJlYWRTeW5jKGRhdGFJZCkge1xuICAgICAgICBjb25zdCB7IG1lbW9yeU9mZnNldCwgZHR5cGUsIHNoYXBlLCBzdHJpbmdCeXRlcyB9ID0gdGhpcy5kYXRhSWRNYXAuZ2V0KGRhdGFJZCk7XG4gICAgICAgIGlmIChkdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmdCeXRlcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBieXRlcyA9IHRoaXMud2FzbS5IRUFQVTguc2xpY2UobWVtb3J5T2Zmc2V0LCBtZW1vcnlPZmZzZXQgKyB1dGlsLnNpemVGcm9tU2hhcGUoc2hhcGUpICogdXRpbC5ieXRlc1BlckVsZW1lbnQoZHR5cGUpKTtcbiAgICAgICAgcmV0dXJuIHR5cGVkQXJyYXlGcm9tQnVmZmVyKGJ5dGVzLmJ1ZmZlciwgZHR5cGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEaXNwb3NlIHRoZSBtZW1vcnkgaWYgdGhlIGRhdGFJZCBoYXMgMCByZWZDb3VudC4gUmV0dXJuIHRydWUgaWYgdGhlIG1lbW9yeVxuICAgICAqIGlzIHJlbGVhc2VkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICogQHBhcmFtIGRhdGFJZFxuICAgICAqIEBvYXJhbSBmb3JjZSBPcHRpb25hbCwgcmVtb3ZlIHRoZSBkYXRhIHJlZ2FyZGxlc3Mgb2YgcmVmQ291bnRcbiAgICAgKi9cbiAgICBkaXNwb3NlRGF0YShkYXRhSWQsIGZvcmNlID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YUlkTWFwLmhhcyhkYXRhSWQpKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhSWRNYXAuZ2V0KGRhdGFJZCk7XG4gICAgICAgICAgICBkYXRhLnJlZkNvdW50LS07XG4gICAgICAgICAgICBpZiAoIWZvcmNlICYmIGRhdGEucmVmQ291bnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy53YXNtLl9mcmVlKGRhdGEubWVtb3J5T2Zmc2V0KTtcbiAgICAgICAgICAgIHRoaXMud2FzbS50ZmpzLmRpc3Bvc2VEYXRhKGRhdGEuaWQpO1xuICAgICAgICAgICAgdGhpcy5kYXRhSWRNYXAuZGVsZXRlKGRhdGFJZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKiBSZXR1cm4gcmVmQ291bnQgb2YgYSBgVGVuc29yRGF0YWAuICovXG4gICAgcmVmQ291bnQoZGF0YUlkKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGFJZE1hcC5oYXMoZGF0YUlkKSkge1xuICAgICAgICAgICAgY29uc3QgdGVuc29yRGF0YSA9IHRoaXMuZGF0YUlkTWFwLmdldChkYXRhSWQpO1xuICAgICAgICAgICAgcmV0dXJuIHRlbnNvckRhdGEucmVmQ291bnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGluY1JlZihkYXRhSWQpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YUlkTWFwLmdldChkYXRhSWQpO1xuICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7XG4gICAgICAgICAgICBkYXRhLnJlZkNvdW50Kys7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZmxvYXRQcmVjaXNpb24oKSB7XG4gICAgICAgIHJldHVybiAzMjtcbiAgICB9XG4gICAgLy8gUmV0dXJucyB0aGUgbWVtb3J5IG9mZnNldCBvZiBhIHRlbnNvci4gVXNlZnVsIGZvciBkZWJ1Z2dpbmcgYW5kIHVuaXRcbiAgICAvLyB0ZXN0aW5nLlxuICAgIGdldE1lbW9yeU9mZnNldChkYXRhSWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YUlkTWFwLmdldChkYXRhSWQpLm1lbW9yeU9mZnNldDtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy53YXNtLnRmanMuZGlzcG9zZSgpO1xuICAgICAgICBpZiAoJ1BUaHJlYWQnIGluIHRoaXMud2FzbSkge1xuICAgICAgICAgICAgdGhpcy53YXNtLlBUaHJlYWQudGVybWluYXRlQWxsVGhyZWFkcygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMud2FzbSA9IG51bGw7XG4gICAgfVxuICAgIG1lbW9yeSgpIHtcbiAgICAgICAgcmV0dXJuIHsgdW5yZWxpYWJsZTogZmFsc2UgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFrZSBhIHRlbnNvciBpbmZvIGZvciB0aGUgb3V0cHV0IG9mIGFuIG9wLiBJZiBgbWVtb3J5T2Zmc2V0YCBpcyBub3RcbiAgICAgKiBwcmVzZW50LCB0aGlzIG1ldGhvZCBhbGxvY2F0ZXMgbWVtb3J5IG9uIHRoZSBXQVNNIGhlYXAuIElmIGBtZW1vcnlPZmZzZXRgXG4gICAgICogaXMgcHJlc2VudCwgdGhlIG1lbW9yeSB3YXMgYWxsb2NhdGVkIGVsc2V3aGVyZSAoaW4gYysrKSBhbmQgd2UganVzdCByZWNvcmRcbiAgICAgKiB0aGUgcG9pbnRlciB3aGVyZSB0aGF0IG1lbW9yeSBsaXZlcy5cbiAgICAgKi9cbiAgICBtYWtlT3V0cHV0KHNoYXBlLCBkdHlwZSwgbWVtb3J5T2Zmc2V0KSB7XG4gICAgICAgIGxldCBkYXRhSWQ7XG4gICAgICAgIGlmIChtZW1vcnlPZmZzZXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgZGF0YUlkID0gdGhpcy53cml0ZShudWxsIC8qIHZhbHVlcyAqLywgc2hhcGUsIGR0eXBlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gdGhpcy5kYXRhSWROZXh0TnVtYmVyKys7XG4gICAgICAgICAgICBkYXRhSWQgPSB7IGlkIH07XG4gICAgICAgICAgICB0aGlzLmRhdGFJZE1hcC5zZXQoZGF0YUlkLCB7IGlkLCBtZW1vcnlPZmZzZXQsIHNoYXBlLCBkdHlwZSwgcmVmQ291bnQ6IDEgfSk7XG4gICAgICAgICAgICBjb25zdCBzaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHNoYXBlKTtcbiAgICAgICAgICAgIHRoaXMud2FzbS50ZmpzLnJlZ2lzdGVyVGVuc29yKGlkLCBzaXplLCBtZW1vcnlPZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGRhdGFJZCwgc2hhcGUsIGR0eXBlIH07XG4gICAgfVxuICAgIHR5cGVkQXJyYXlGcm9tSGVhcCh7IHNoYXBlLCBkdHlwZSwgZGF0YUlkIH0pIHtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gdGhpcy53YXNtLkhFQVBVOC5idWZmZXI7XG4gICAgICAgIGNvbnN0IHsgbWVtb3J5T2Zmc2V0IH0gPSB0aGlzLmRhdGFJZE1hcC5nZXQoZGF0YUlkKTtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShzaGFwZSk7XG4gICAgICAgIHN3aXRjaCAoZHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2Zsb2F0MzInOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KGJ1ZmZlciwgbWVtb3J5T2Zmc2V0LCBzaXplKTtcbiAgICAgICAgICAgIGNhc2UgJ2ludDMyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEludDMyQXJyYXkoYnVmZmVyLCBtZW1vcnlPZmZzZXQsIHNpemUpO1xuICAgICAgICAgICAgY2FzZSAnYm9vbCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGJ1ZmZlciwgbWVtb3J5T2Zmc2V0LCBzaXplKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGR0eXBlICR7ZHR5cGV9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBjcmVhdGVJbnN0YW50aWF0ZVdhc21GdW5jKHBhdGgpIHtcbiAgICAvLyB0aGlzIHdpbGwgYmUgcmVwbGFjZSBieSByb2xsdXAgcGx1Z2luIHBhdGNoV2VjaGF0V2ViQXNzZW1ibHkgaW4gXG4gICAgLy8gbWlucHJvZ3JhbSdzIG91dHB1dC5cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgcmV0dXJuIChpbXBvcnRzLCBjYWxsYmFjaykgPT4ge1xuICAgICAgICB1dGlsLmZldGNoKHBhdGgsIHsgY3JlZGVudGlhbHM6ICdzYW1lLW9yaWdpbicgfSkudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIGlmICghcmVzcG9uc2VbJ29rJ10pIHtcbiAgICAgICAgICAgICAgICBpbXBvcnRzLmVudi5hKGBmYWlsZWQgdG8gbG9hZCB3YXNtIGJpbmFyeSBmaWxlIGF0ICcke3BhdGh9J2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKS50aGVuKGJpbmFyeSA9PiB7XG4gICAgICAgICAgICAgICAgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoYmluYXJ5LCBpbXBvcnRzKS50aGVuKG91dHB1dCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG91dHB1dC5pbnN0YW5jZSwgb3V0cHV0Lm1vZHVsZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9O1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwYXRoIG9mIHRoZSBXQVNNIGJpbmFyeS5cbiAqIEBwYXJhbSBzaW1kU3VwcG9ydGVkIHdoZXRoZXIgU0lNRCBpcyBzdXBwb3J0ZWRcbiAqIEBwYXJhbSB0aHJlYWRzU3VwcG9ydGVkIHdoZXRoZXIgbXVsdGl0aHJlYWRpbmcgaXMgc3VwcG9ydGVkXG4gKiBAcGFyYW0gd2FzbU1vZHVsZUZvbGRlciB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIFdBU00gYmluYXJpZXMuXG4gKi9cbmZ1bmN0aW9uIGdldFBhdGhUb1dhc21CaW5hcnkoc2ltZFN1cHBvcnRlZCwgdGhyZWFkc1N1cHBvcnRlZCwgd2FzbU1vZHVsZUZvbGRlcikge1xuICAgIGlmICh3YXNtUGF0aCAhPSBudWxsKSB7XG4gICAgICAgIC8vIElmIHdhc21QYXRoIGlzIGRlZmluZWQsIHRoZSB1c2VyIGhhcyBzdXBwbGllZCBhIGZ1bGwgcGF0aCB0b1xuICAgICAgICAvLyB0aGUgdmFuaWxsYSAud2FzbSBiaW5hcnkuXG4gICAgICAgIHJldHVybiB3YXNtUGF0aDtcbiAgICB9XG4gICAgbGV0IHBhdGggPSAndGZqcy1iYWNrZW5kLXdhc20ud2FzbSc7XG4gICAgaWYgKHNpbWRTdXBwb3J0ZWQgJiYgdGhyZWFkc1N1cHBvcnRlZCkge1xuICAgICAgICBwYXRoID0gJ3RmanMtYmFja2VuZC13YXNtLXRocmVhZGVkLXNpbWQud2FzbSc7XG4gICAgfVxuICAgIGVsc2UgaWYgKHNpbWRTdXBwb3J0ZWQpIHtcbiAgICAgICAgcGF0aCA9ICd0ZmpzLWJhY2tlbmQtd2FzbS1zaW1kLndhc20nO1xuICAgIH1cbiAgICBpZiAod2FzbUZpbGVNYXAgIT0gbnVsbCkge1xuICAgICAgICBpZiAod2FzbUZpbGVNYXBbcGF0aF0gIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHdhc21GaWxlTWFwW3BhdGhdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB3YXNtTW9kdWxlRm9sZGVyICsgcGF0aDtcbn1cbi8qKlxuICogSW5pdGlhbGl6ZXMgdGhlIHdhc20gbW9kdWxlIGFuZCBjcmVhdGVzIHRoZSBqcyA8LS0+IHdhc20gYnJpZGdlLlxuICpcbiAqIE5PVEU6IFdlIHdyYXAgdGhlIHdhc20gbW9kdWxlIGluIGEgb2JqZWN0IHdpdGggcHJvcGVydHkgJ3dhc20nIGluc3RlYWQgb2ZcbiAqIHJldHVybmluZyBQcm9taXNlPEJhY2tlbmRXYXNtTW9kdWxlPiB0byBhdm9pZCBmcmVlemluZyBDaHJvbWUgKGxhc3QgdGVzdGVkXG4gKiBpbiBDaHJvbWUgNzYpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5pdCgpIHtcbiAgICBjb25zdCBbc2ltZFN1cHBvcnRlZCwgdGhyZWFkc1N1cHBvcnRlZF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIGVudigpLmdldEFzeW5jKCdXQVNNX0hBU19TSU1EX1NVUFBPUlQnKSxcbiAgICAgICAgZW52KCkuZ2V0QXN5bmMoJ1dBU01fSEFTX01VTFRJVEhSRUFEX1NVUFBPUlQnKVxuICAgIF0pO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGZhY3RvcnlDb25maWcgPSB7fTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZnVuY3Rpb24gb3ZlcnJpZGVzIHRoZSBFbXNjcmlwdGVuIG1vZHVsZSBsb2NhdGVGaWxlIHV0aWxpdHkuXG4gICAgICAgICAqIEBwYXJhbSBwYXRoIFRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBmaWxlIHRoYXQgbmVlZHMgdG8gYmUgbG9hZGVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJlZml4IFRoZSBwYXRoIHRvIHRoZSBtYWluIEphdmFTY3JpcHQgZmlsZSdzIGRpcmVjdG9yeS5cbiAgICAgICAgICovXG4gICAgICAgIGZhY3RvcnlDb25maWcubG9jYXRlRmlsZSA9IChwYXRoLCBwcmVmaXgpID0+IHtcbiAgICAgICAgICAgIGlmIChwYXRoLmVuZHNXaXRoKCcud29ya2VyLmpzJykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHdhc21Xb3JrZXJDb250ZW50cztcbiAgICAgICAgICAgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW3Jlc3BvbnNlXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vamF2YXNjcmlwdCcgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGF0aC5lbmRzV2l0aCgnLndhc20nKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZXRQYXRoVG9XYXNtQmluYXJ5KHNpbWRTdXBwb3J0ZWQsIHRocmVhZHNTdXBwb3J0ZWQsIHdhc21QYXRoUHJlZml4ICE9IG51bGwgPyB3YXNtUGF0aFByZWZpeCA6IHByZWZpeCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgcGF0aDtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gVXNlIHRoZSBpbnN0YW50aWF0ZVdhc20gb3ZlcnJpZGUgd2hlbiBzeXN0ZW0gZmV0Y2ggaXMgbm90IGF2YWlsYWJsZS5cbiAgICAgICAgLy8gUmVmZXJlbmNlOlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZW1zY3JpcHRlbi1jb3JlL2Vtc2NyaXB0ZW4vYmxvYi8yYmNhMDgzY2JiZDVhNDEzM2RiNjFmYmQ3NGQwNGY3ZmVlY2ZhOTA3L3Rlc3RzL21hbnVhbF93YXNtX2luc3RhbnRpYXRlLmh0bWwjTDE3MFxuICAgICAgICBpZiAoY3VzdG9tRmV0Y2gpIHtcbiAgICAgICAgICAgIGZhY3RvcnlDb25maWcuaW5zdGFudGlhdGVXYXNtID1cbiAgICAgICAgICAgICAgICBjcmVhdGVJbnN0YW50aWF0ZVdhc21GdW5jKGdldFBhdGhUb1dhc21CaW5hcnkoc2ltZFN1cHBvcnRlZCwgdGhyZWFkc1N1cHBvcnRlZCwgd2FzbVBhdGhQcmVmaXggIT0gbnVsbCA/IHdhc21QYXRoUHJlZml4IDogJycpKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICAgICAgZmFjdG9yeUNvbmZpZy5vbkFib3J0ID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGluaXRpYWxpemVkKSB7XG4gICAgICAgICAgICAgICAgLy8gRW1zY3JpcHRlbiBhbHJlYWR5IGNhbGxlZCBjb25zb2xlLndhcm4gc28gbm8gbmVlZCB0byBkb3VibGUgbG9nLlxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbml0QWJvcnRlZCkge1xuICAgICAgICAgICAgICAgIC8vIEVtc2NyaXB0ZW4gY2FsbHMgYG9uQWJvcnRgIHR3aWNlLCByZXN1bHRpbmcgaW4gZG91YmxlIGVycm9yXG4gICAgICAgICAgICAgICAgLy8gbWVzc2FnZXMuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5pdEFib3J0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgY29uc3QgcmVqZWN0TXNnID0gJ01ha2Ugc3VyZSB0aGUgc2VydmVyIGNhbiBzZXJ2ZSB0aGUgYC53YXNtYCBmaWxlIHJlbGF0aXZlIHRvIHRoZSAnICtcbiAgICAgICAgICAgICAgICAnYnVuZGxlZCBqcyBmaWxlLiBGb3IgbW9yZSBkZXRhaWxzIHNlZSBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZmpzL2Jsb2IvbWFzdGVyL3RmanMtYmFja2VuZC13YXNtL1JFQURNRS5tZCN1c2luZy1idW5kbGVycyc7XG4gICAgICAgICAgICByZWplY3QoeyBtZXNzYWdlOiByZWplY3RNc2cgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGxldCB3YXNtO1xuICAgICAgICAvLyBJZiBgd2FzbVBhdGhgIGhhcyBiZWVuIGRlZmluZWQgd2UgbXVzdCBpbml0aWFsaXplIHRoZSB2YW5pbGxhIG1vZHVsZS5cbiAgICAgICAgaWYgKHRocmVhZHNTdXBwb3J0ZWQgJiYgc2ltZFN1cHBvcnRlZCAmJiB3YXNtUGF0aCA9PSBudWxsKSB7XG4gICAgICAgICAgICBmYWN0b3J5Q29uZmlnLm1haW5TY3JpcHRVcmxPckJsb2IgPSBuZXcgQmxvYihbYHZhciBXYXNtQmFja2VuZE1vZHVsZVRocmVhZGVkU2ltZCA9IGAgK1xuICAgICAgICAgICAgICAgICAgICB3YXNtRmFjdG9yeVRocmVhZGVkU2ltZC50b1N0cmluZygpXSwgeyB0eXBlOiAndGV4dC9qYXZhc2NyaXB0JyB9KTtcbiAgICAgICAgICAgIHdhc20gPSB3YXNtRmFjdG9yeVRocmVhZGVkU2ltZChmYWN0b3J5Q29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIFRoZSB3YXNtRmFjdG9yeSB3b3JrcyBmb3IgYm90aCB2YW5pbGxhIGFuZCBTSU1EIGJpbmFyaWVzLlxuICAgICAgICAgICAgd2FzbSA9IHdhc21GYWN0b3J5KGZhY3RvcnlDb25maWcpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSBXQVNNIG1vZHVsZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgY3JlYXRlZCBieSB0aGUgZmFjdG9yeS5cbiAgICAgICAgLy8gQW55IGVycm9yIHdpbGwgYmUgY2F1Z2h0IGJ5IHRoZSBvbkFib3J0IGNhbGxiYWNrIGRlZmluZWQgYWJvdmUuXG4gICAgICAgIHdhc20udGhlbigobW9kdWxlKSA9PiB7XG4gICAgICAgICAgICBpbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgICAgICBpbml0QWJvcnRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3Qgdm9pZFJldHVyblR5cGUgPSBudWxsO1xuICAgICAgICAgICAgLy8gVXNpbmcgdGhlIHRmanMgbmFtZXNwYWNlIHRvIGF2b2lkIGNvbmZsaWN0IHdpdGggZW1zY3JpcHRlbidzIEFQSS5cbiAgICAgICAgICAgIG1vZHVsZS50ZmpzID0ge1xuICAgICAgICAgICAgICAgIGluaXQ6IG1vZHVsZS5jd3JhcCgnaW5pdCcsIG51bGwsIFtdKSxcbiAgICAgICAgICAgICAgICByZWdpc3RlclRlbnNvcjogbW9kdWxlLmN3cmFwKCdyZWdpc3Rlcl90ZW5zb3InLCBudWxsLCBbXG4gICAgICAgICAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICAgICAgZGlzcG9zZURhdGE6IG1vZHVsZS5jd3JhcCgnZGlzcG9zZV9kYXRhJywgdm9pZFJldHVyblR5cGUsIFsnbnVtYmVyJ10pLFxuICAgICAgICAgICAgICAgIGRpc3Bvc2U6IG1vZHVsZS5jd3JhcCgnZGlzcG9zZScsIHZvaWRSZXR1cm5UeXBlLCBbXSksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVzb2x2ZSh7IHdhc206IG1vZHVsZSB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiB0eXBlZEFycmF5RnJvbUJ1ZmZlcihidWZmZXIsIGR0eXBlKSB7XG4gICAgc3dpdGNoIChkdHlwZSkge1xuICAgICAgICBjYXNlICdmbG9hdDMyJzpcbiAgICAgICAgICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KGJ1ZmZlcik7XG4gICAgICAgIGNhc2UgJ2ludDMyJzpcbiAgICAgICAgICAgIHJldHVybiBuZXcgSW50MzJBcnJheShidWZmZXIpO1xuICAgICAgICBjYXNlICdib29sJzpcbiAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShidWZmZXIpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGR0eXBlICR7ZHR5cGV9YCk7XG4gICAgfVxufVxuY29uc3Qgd2FzbUJpbmFyeU5hbWVzID0gW1xuICAgICd0ZmpzLWJhY2tlbmQtd2FzbS53YXNtJywgJ3RmanMtYmFja2VuZC13YXNtLXNpbWQud2FzbScsXG4gICAgJ3RmanMtYmFja2VuZC13YXNtLXRocmVhZGVkLXNpbWQud2FzbSdcbl07XG5sZXQgd2FzbVBhdGggPSBudWxsO1xubGV0IHdhc21QYXRoUHJlZml4ID0gbnVsbDtcbmxldCB3YXNtRmlsZU1hcCA9IHt9O1xubGV0IGluaXRBYm9ydGVkID0gZmFsc2U7XG5sZXQgY3VzdG9tRmV0Y2ggPSBmYWxzZTtcbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIGBzZXRXYXNtUGF0aHNgIGluc3RlYWQuXG4gKiBTZXRzIHRoZSBwYXRoIHRvIHRoZSBgLndhc21gIGZpbGUgd2hpY2ggd2lsbCBiZSBmZXRjaGVkIHdoZW4gdGhlIHdhc21cbiAqIGJhY2tlbmQgaXMgaW5pdGlhbGl6ZWQuIFNlZVxuICogaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGZqcy9ibG9iL21hc3Rlci90ZmpzLWJhY2tlbmQtd2FzbS9SRUFETUUubWQjdXNpbmctYnVuZGxlcnNcbiAqIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0gcGF0aCB3YXNtIGZpbGUgcGF0aCBvciB1cmxcbiAqIEBwYXJhbSB1c2VQbGF0Zm9ybUZldGNoIG9wdGlvbmFsIGJvb2xlYW4gdG8gdXNlIHBsYXRmb3JtIGZldGNoIHRvIGRvd25sb2FkXG4gKiAgICAgdGhlIHdhc20gZmlsZSwgZGVmYXVsdCB0byBmYWxzZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnRW52aXJvbm1lbnQnLCBuYW1lc3BhY2U6ICd3YXNtJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFdhc21QYXRoKHBhdGgsIHVzZVBsYXRmb3JtRmV0Y2ggPSBmYWxzZSkge1xuICAgIGRlcHJlY2F0aW9uV2Fybignc2V0V2FzbVBhdGggaGFzIGJlZW4gZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBzZXRXYXNtUGF0aHMgYW5kJyArXG4gICAgICAgICcgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuJyk7XG4gICAgaWYgKGluaXRBYm9ydGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIFdBU00gYmFja2VuZCB3YXMgYWxyZWFkeSBpbml0aWFsaXplZC4gTWFrZSBzdXJlIHlvdSBjYWxsICcgK1xuICAgICAgICAgICAgJ2BzZXRXYXNtUGF0aCgpYCBiZWZvcmUgeW91IGNhbGwgYHRmLnNldEJhY2tlbmQoKWAgb3IgYHRmLnJlYWR5KClgJyk7XG4gICAgfVxuICAgIHdhc21QYXRoID0gcGF0aDtcbiAgICBjdXN0b21GZXRjaCA9IHVzZVBsYXRmb3JtRmV0Y2g7XG59XG4vKipcbiAqIENvbmZpZ3VyZXMgdGhlIGxvY2F0aW9ucyBvZiB0aGUgV0FTTSBiaW5hcmllcy5cbiAqXG4gKiBgYGBqc1xuICogc2V0V2FzbVBhdGhzKHtcbiAqICAndGZqcy1iYWNrZW5kLXdhc20ud2FzbSc6ICdyZW5hbWVkLndhc20nLFxuICogICd0ZmpzLWJhY2tlbmQtd2FzbS1zaW1kLndhc20nOiAncmVuYW1lZC1zaW1kLndhc20nLFxuICogICd0ZmpzLWJhY2tlbmQtd2FzbS10aHJlYWRlZC1zaW1kLndhc20nOiAncmVuYW1lZC10aHJlYWRlZC1zaW1kLndhc20nXG4gKiB9KTtcbiAqIHRmLnNldEJhY2tlbmQoJ3dhc20nKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBwcmVmaXhPckZpbGVNYXAgVGhpcyBjYW4gYmUgZWl0aGVyIGEgc3RyaW5nIG9yIG9iamVjdDpcbiAqICAtIChzdHJpbmcpIFRoZSBwYXRoIHRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIFdBU00gYmluYXJpZXMgYXJlIGxvY2F0ZWQuXG4gKiAgICAgTm90ZSB0aGF0IHRoaXMgcHJlZml4IHdpbGwgYmUgdXNlZCB0byBsb2FkIGVhY2ggYmluYXJ5ICh2YW5pbGxhLFxuICogICAgIFNJTUQtZW5hYmxlZCwgdGhyZWFkaW5nLWVuYWJsZWQsIGV0Yy4pLlxuICogIC0gKG9iamVjdCkgTWFwcGluZyBmcm9tIG5hbWVzIG9mIFdBU00gYmluYXJpZXMgdG8gY3VzdG9tXG4gKiAgICAgZnVsbCBwYXRocyBzcGVjaWZ5aW5nIHRoZSBsb2NhdGlvbnMgb2YgdGhvc2UgYmluYXJpZXMuIFRoaXMgaXMgdXNlZnVsIGlmXG4gKiAgICAgeW91ciBXQVNNIGJpbmFyaWVzIGFyZSBub3QgYWxsIGxvY2F0ZWQgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LCBvciBpZiB5b3VyXG4gKiAgICAgV0FTTSBiaW5hcmllcyBoYXZlIGJlZW4gcmVuYW1lZC5cbiAqIEBwYXJhbSB1c2VQbGF0Zm9ybUZldGNoIG9wdGlvbmFsIGJvb2xlYW4gdG8gdXNlIHBsYXRmb3JtIGZldGNoIHRvIGRvd25sb2FkXG4gKiAgICAgdGhlIHdhc20gZmlsZSwgZGVmYXVsdCB0byBmYWxzZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnRW52aXJvbm1lbnQnLCBuYW1lc3BhY2U6ICd3YXNtJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFdhc21QYXRocyhwcmVmaXhPckZpbGVNYXAsIHVzZVBsYXRmb3JtRmV0Y2ggPSBmYWxzZSkge1xuICAgIGlmIChpbml0QWJvcnRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBXQVNNIGJhY2tlbmQgd2FzIGFscmVhZHkgaW5pdGlhbGl6ZWQuIE1ha2Ugc3VyZSB5b3UgY2FsbCAnICtcbiAgICAgICAgICAgICdgc2V0V2FzbVBhdGhzKClgIGJlZm9yZSB5b3UgY2FsbCBgdGYuc2V0QmFja2VuZCgpYCBvciAnICtcbiAgICAgICAgICAgICdgdGYucmVhZHkoKWAnKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwcmVmaXhPckZpbGVNYXAgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHdhc21QYXRoUHJlZml4ID0gcHJlZml4T3JGaWxlTWFwO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgd2FzbUZpbGVNYXAgPSBwcmVmaXhPckZpbGVNYXA7XG4gICAgICAgIGNvbnN0IG1pc3NpbmdQYXRocyA9IHdhc21CaW5hcnlOYW1lcy5maWx0ZXIobmFtZSA9PiB3YXNtRmlsZU1hcFtuYW1lXSA9PSBudWxsKTtcbiAgICAgICAgaWYgKG1pc3NpbmdQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZXJlIHdlcmUgbm8gZW50cmllcyBmb3VuZCBmb3IgdGhlIGZvbGxvd2luZyBiaW5hcmllczogYCArXG4gICAgICAgICAgICAgICAgYCR7bWlzc2luZ1BhdGhzLmpvaW4oJywnKX0uIFBsZWFzZSBlaXRoZXIgY2FsbCBzZXRXYXNtUGF0aHMgd2l0aCBhIGAgK1xuICAgICAgICAgICAgICAgIGBtYXAgcHJvdmlkaW5nIGEgcGF0aCBmb3IgZWFjaCBiaW5hcnksIG9yIHdpdGggYSBzdHJpbmcgaW5kaWNhdGluZyBgICtcbiAgICAgICAgICAgICAgICBgdGhlIGRpcmVjdG9yeSB3aGVyZSBhbGwgdGhlIGJpbmFyaWVzIGNhbiBiZSBmb3VuZC5gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjdXN0b21GZXRjaCA9IHVzZVBsYXRmb3JtRmV0Y2g7XG59XG4vKiogVXNlZCBpbiB1bml0IHRlc3RzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0V2FzbVBhdGgoKSB7XG4gICAgd2FzbVBhdGggPSBudWxsO1xuICAgIHdhc21QYXRoUHJlZml4ID0gbnVsbDtcbiAgICB3YXNtRmlsZU1hcCA9IHt9O1xuICAgIGN1c3RvbUZldGNoID0gZmFsc2U7XG4gICAgaW5pdEFib3J0ZWQgPSBmYWxzZTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJhY2tlbmRfd2FzbS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgJy4vZmxhZ3Nfd2FzbSc7XG5pbXBvcnQgeyByZWdpc3RlckJhY2tlbmQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgQmFja2VuZFdhc20sIGluaXQgfSBmcm9tICcuL2JhY2tlbmRfd2FzbSc7XG5leHBvcnQgeyBCYWNrZW5kV2FzbSwgc2V0V2FzbVBhdGgsIHNldFdhc21QYXRocyB9IGZyb20gJy4vYmFja2VuZF93YXNtJztcbmV4cG9ydCB7IHZlcnNpb24gYXMgdmVyc2lvbl93YXNtIH0gZnJvbSAnLi92ZXJzaW9uJztcbmNvbnN0IFdBU01fUFJJT1JJVFkgPSAyO1xucmVnaXN0ZXJCYWNrZW5kKCd3YXNtJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgd2FzbSB9ID0gYXdhaXQgaW5pdCgpO1xuICAgIHJldHVybiBuZXcgQmFja2VuZFdhc20od2FzbSk7XG59LCBXQVNNX1BSSU9SSVRZKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJhc2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmNvbnN0IEVOViA9IGVudigpO1xuLyoqXG4gKiBUcnVlIGlmIFNJTUQgaXMgc3VwcG9ydGVkLlxuICovXG4vLyBGcm9tOiBodHRwczovL2dpdGh1Yi5jb20vR29vZ2xlQ2hyb21lTGFicy93YXNtLWZlYXR1cmUtZGV0ZWN0XG5FTlYucmVnaXN0ZXJGbGFnKFxuLy8gVGhpcyB0eXBlZCBhcnJheSBwYXNzZWQgaW4gdG8gV2ViQXNzZW1ibHkudmFsaWRhdGUgaXMgV2ViQXNzZW1ibHkgYmluYXJ5XG4vLyBjb2RlLiBJbiB0aGlzIGNhc2UgaXQgaXMgYSBzbWFsbCBwcm9ncmFtIHRoYXQgY29udGFpbnMgU0lNRFxuLy8gaW5zdHJ1Y3Rpb25zLlxuJ1dBU01fSEFTX1NJTURfU1VQUE9SVCcsIGFzeW5jICgpID0+IFdlYkFzc2VtYmx5LnZhbGlkYXRlKG5ldyBVaW50OEFycmF5KFtcbiAgICAwLCA5NywgMTE1LCAxMDksIDEsIDAsIDAsIDAsIDEsIDQsIDEsIDk2LCAwLCAwLCAzLFxuICAgIDIsIDEsIDAsIDEwLCA5LCAxLCA3LCAwLCA2NSwgMCwgMjUzLCAxNSwgMjYsIDExXG5dKSkpO1xuLyoqXG4gKiBUcnVlIGlmIHRocmVhZHMgYXJlIHN1cHBvcnRlZC5cbiAqL1xuLy8gRnJvbTogaHR0cHM6Ly9naXRodWIuY29tL0dvb2dsZUNocm9tZUxhYnMvd2FzbS1mZWF0dXJlLWRldGVjdFxuRU5WLnJlZ2lzdGVyRmxhZygnV0FTTV9IQVNfTVVMVElUSFJFQURfU1VQUE9SVCcsIGFzeW5jICgpID0+IHtcbiAgICAvLyBUT0RPKGFubnhpbmd5dWFuKTogRW5hYmxlIG5vZGUgc3VwcG9ydCBvbmNlIHRoaXMgaXMgcmVzb2x2ZWQ6XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGZqcy9pc3N1ZXMvMzgzMFxuICAgIGlmIChFTlYuZ2V0KCdJU19OT0RFJykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyBUZXN0IGZvciB0cmFuc2ZlcmFiaWxpdHkgb2YgU0FCcyAobmVlZGVkIGZvciBGaXJlZm94KVxuICAgICAgICAvLyBodHRwczovL2dyb3Vwcy5nb29nbGUuY29tL2ZvcnVtLyMhbXNnL21vemlsbGEuZGV2LnBsYXRmb3JtL0lIa0JabEhFVHBBL2R3c01OY2hXRVFBSlxuICAgICAgICBuZXcgTWVzc2FnZUNoYW5uZWwoKS5wb3J0MS5wb3N0TWVzc2FnZShuZXcgU2hhcmVkQXJyYXlCdWZmZXIoMSkpO1xuICAgICAgICAvLyBUaGlzIHR5cGVkIGFycmF5IGlzIGEgV2ViQXNzZW1ibHkgcHJvZ3JhbSBjb250YWluaW5nIHRocmVhZGVkXG4gICAgICAgIC8vIGluc3RydWN0aW9ucy5cbiAgICAgICAgcmV0dXJuIFdlYkFzc2VtYmx5LnZhbGlkYXRlKG5ldyBVaW50OEFycmF5KFtcbiAgICAgICAgICAgIDAsIDk3LCAxMTUsIDEwOSwgMSwgMCwgMCwgMCwgMSwgNCwgMSwgOTYsIDAsIDAsIDMsIDIsIDEsIDAsIDUsXG4gICAgICAgICAgICA0LCAxLCAzLCAxLCAxLCAxMCwgMTEsIDEsIDksIDAsIDY1LCAwLCAyNTQsIDE2LCAyLCAwLCAyNiwgMTFcbiAgICAgICAgXSkpO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mbGFnc193YXNtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCAnLi9yZWdpc3Rlcl9hbGxfa2VybmVscyc7XG5leHBvcnQgKiBmcm9tICcuL2Jhc2UnO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLy8gSW1wb3J0IHNoYXJlZCBmdW5jdGlvbmFsaXR5IGZyb20gdGZqcy1iYWNrZW5kLWNwdSB3aXRob3V0IHRyaWdnZXJpbmdcbi8vIHNpZGUgZWZmZWN0cy5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8taW1wb3J0cy1mcm9tLWRpc3RcbmltcG9ydCB7IGNvbmNhdEltcGwgYXMgY29uY2F0SW1wbENQVSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9zaGFyZWQnO1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1pbXBvcnRzLWZyb20tZGlzdFxuaW1wb3J0IHsgc2xpY2VJbXBsIGFzIHNsaWNlSW1wbENQVSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9zaGFyZWQnO1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1pbXBvcnRzLWZyb20tZGlzdFxuaW1wb3J0IHsgcmFuZ2VJbXBsIGFzIHJhbmdlSW1wbENQVSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9zaGFyZWQnO1xuZXhwb3J0IHsgY29uY2F0SW1wbENQVSwgcmFuZ2VJbXBsQ1BVLCBzbGljZUltcGxDUFUgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNoYXJlZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBYnMgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlVW5hcnlLZXJuZWxDb25maWcgfSBmcm9tICcuL3VuYXJ5X2tlcm5lbCc7XG5leHBvcnQgY29uc3QgYWJzQ29uZmlnID0gY3JlYXRlVW5hcnlLZXJuZWxDb25maWcoQWJzKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFicy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBZGQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi9iaW5hcnlfa2VybmVsJztcbmNvbnN0IHN1cHBvcnRzRnVsbEJyb2FkY2FzdCA9IHRydWU7XG5leHBvcnQgY29uc3QgYWRkQ29uZmlnID0gY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnKEFkZCwgc3VwcG9ydHNGdWxsQnJvYWRjYXN0KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFkZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBZGROLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IENwcERUeXBlIH0gZnJvbSAnLi90eXBlcyc7XG5sZXQgd2FzbUZ1bmM7XG5mdW5jdGlvbiBzZXR1cEZ1bmMoYmFja2VuZCkge1xuICAgIHdhc21GdW5jID0gYmFja2VuZC53YXNtLmN3cmFwKEFkZE4sIG51bGwgLyogdm9pZCAqLywgW1xuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgIF0pO1xufVxuZnVuY3Rpb24gYWRkbihhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KGlucHV0c1swXS5zaGFwZSwgaW5wdXRzWzBdLmR0eXBlKTtcbiAgICAvLyBTaG9ydC1jaXJjdWl0IHplcm8tc2l6ZWQgdGVuc29ycy5cbiAgICBpZiAodXRpbC5zaXplRnJvbVNoYXBlKG91dC5zaGFwZSkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRJZHMgPSBpbnB1dHMubWFwKHggPT4gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHguZGF0YUlkKS5pZCk7XG4gICAgY29uc3QgaW5wdXRJZHNCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KGlucHV0SWRzKS5idWZmZXIpO1xuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIHdhc21GdW5jKGlucHV0SWRzQnl0ZXMsIGlucHV0SWRzLmxlbmd0aCwgQ3BwRFR5cGVbb3V0LmR0eXBlXSwgb3V0SWQpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgYWRkTkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBBZGROLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jLFxuICAgIGtlcm5lbEZ1bmM6IGFkZG4sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QWRkTi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBbGwsIGJhY2tlbmRfdXRpbCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBwZXJtdXRlQXhlc0FuZFRyYW5zcG9zZSB9IGZyb20gJy4va2VybmVsX3V0aWxzJztcbmxldCB3YXNtQWxsO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21BbGwgPSBiYWNrZW5kLndhc20uY3dyYXAoQWxsLCBudWxsIC8qdm9pZCovLCBbJ251bWJlciwgbnVtYmVyLCBudW1iZXInXSk7XG59XG5mdW5jdGlvbiBhbGwoYXJncykge1xuICAgIGNvbnN0IHsgYmFja2VuZCwgaW5wdXRzLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGF4aXMsIGtlZXBEaW1zIH0gPSBhdHRycztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB4SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeC5kYXRhSWQpLmlkO1xuICAgIGxldCBpbnB1dElkID0geElkO1xuICAgIGxldCBpbnB1dCA9IHg7XG4gICAgY29uc3QgeyB0cmFuc3Bvc2VkLCBheGVzLCBvcmlnaW5hbEF4ZXMsIGlucHV0V2FzVHJhbnNwb3NlZCB9ID0gcGVybXV0ZUF4ZXNBbmRUcmFuc3Bvc2UoeCwgYXhpcywgYmFja2VuZCk7XG4gICAgaWYgKGlucHV0V2FzVHJhbnNwb3NlZCkge1xuICAgICAgICBjb25zdCB0cmFuc3Bvc2VkSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQodHJhbnNwb3NlZC5kYXRhSWQpLmlkO1xuICAgICAgICBpbnB1dCA9IHRyYW5zcG9zZWQ7XG4gICAgICAgIGlucHV0SWQgPSB0cmFuc3Bvc2VkSWQ7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0UmFuayA9IGlucHV0LnNoYXBlLmxlbmd0aDtcbiAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoJ2FsbCcsIGF4ZXMsIGlucHV0UmFuayk7XG4gICAgY29uc3QgW291dFNoYXBlLCByZWR1Y2VTaGFwZV0gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcyhpbnB1dC5zaGFwZSwgYXhlcyk7XG4gICAgY29uc3QgcmVkdWNlU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShyZWR1Y2VTaGFwZSk7XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KG91dFNoYXBlLCB4LmR0eXBlKTtcbiAgICBpZiAodXRpbC5zaXplRnJvbVNoYXBlKGlucHV0LnNoYXBlKSAhPT0gMCkge1xuICAgICAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICAgICAgd2FzbUFsbChpbnB1dElkLCByZWR1Y2VTaXplLCBvdXRJZCk7XG4gICAgfVxuICAgIGlmIChpbnB1dFdhc1RyYW5zcG9zZWQpIHtcbiAgICAgICAgLy8gZGlzcG9zZSBvZiB0aGUgdHJhbnNwb3NlZCB0ZW5zb3IuXG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZURhdGEodHJhbnNwb3NlZC5kYXRhSWQpO1xuICAgIH1cbiAgICBpZiAoa2VlcERpbXMpIHtcbiAgICAgICAgLy8gcmVzaGFwZVxuICAgICAgICBjb25zdCBuZXdTaGFwZSA9IGJhY2tlbmRfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbShvdXQuc2hhcGUsIG9yaWdpbmFsQXhlcyk7XG4gICAgICAgIG91dC5zaGFwZSA9IG5ld1NoYXBlO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IGFsbENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBBbGwsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IGFsbFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFsbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBbnksIGJhY2tlbmRfdXRpbCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBwZXJtdXRlQXhlc0FuZFRyYW5zcG9zZSB9IGZyb20gJy4va2VybmVsX3V0aWxzJztcbmxldCB3YXNtQW55O1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21BbnkgPSBiYWNrZW5kLndhc20uY3dyYXAoQW55LCBudWxsIC8qdm9pZCovLCBbJ251bWJlciwgbnVtYmVyLCBudW1iZXInXSk7XG59XG5mdW5jdGlvbiBhbnkoYXJncykge1xuICAgIGNvbnN0IHsgYmFja2VuZCwgaW5wdXRzLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGF4aXMsIGtlZXBEaW1zIH0gPSBhdHRycztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB4SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeC5kYXRhSWQpLmlkO1xuICAgIGxldCBpbnB1dElkID0geElkO1xuICAgIGxldCBpbnB1dCA9IHg7XG4gICAgY29uc3QgeyB0cmFuc3Bvc2VkLCBheGVzLCBvcmlnaW5hbEF4ZXMsIGlucHV0V2FzVHJhbnNwb3NlZCB9ID0gcGVybXV0ZUF4ZXNBbmRUcmFuc3Bvc2UoeCwgYXhpcywgYmFja2VuZCk7XG4gICAgaWYgKGlucHV0V2FzVHJhbnNwb3NlZCkge1xuICAgICAgICBjb25zdCB0cmFuc3Bvc2VkSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQodHJhbnNwb3NlZC5kYXRhSWQpLmlkO1xuICAgICAgICBpbnB1dCA9IHRyYW5zcG9zZWQ7XG4gICAgICAgIGlucHV0SWQgPSB0cmFuc3Bvc2VkSWQ7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0UmFuayA9IGlucHV0LnNoYXBlLmxlbmd0aDtcbiAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoJ2FueScsIGF4ZXMsIGlucHV0UmFuayk7XG4gICAgY29uc3QgW291dFNoYXBlLCByZWR1Y2VTaGFwZV0gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcyhpbnB1dC5zaGFwZSwgYXhlcyk7XG4gICAgY29uc3QgcmVkdWNlU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShyZWR1Y2VTaGFwZSk7XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KG91dFNoYXBlLCB4LmR0eXBlKTtcbiAgICBpZiAodXRpbC5zaXplRnJvbVNoYXBlKGlucHV0LnNoYXBlKSAhPT0gMCkge1xuICAgICAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICAgICAgd2FzbUFueShpbnB1dElkLCByZWR1Y2VTaXplLCBvdXRJZCk7XG4gICAgfVxuICAgIGlmIChpbnB1dFdhc1RyYW5zcG9zZWQpIHtcbiAgICAgICAgLy8gZGlzcG9zZSBvZiB0aGUgdHJhbnNwb3NlZCB0ZW5zb3IuXG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZURhdGEodHJhbnNwb3NlZC5kYXRhSWQpO1xuICAgIH1cbiAgICBpZiAoa2VlcERpbXMpIHtcbiAgICAgICAgLy8gcmVzaGFwZVxuICAgICAgICBjb25zdCBuZXdTaGFwZSA9IGJhY2tlbmRfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbShvdXQuc2hhcGUsIG9yaWdpbmFsQXhlcyk7XG4gICAgICAgIG91dC5zaGFwZSA9IG5ld1NoYXBlO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IGFueUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBBbnksXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IGFueVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFueS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBcmdNYXgsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgcGVybXV0ZUF4ZXNBbmRUcmFuc3Bvc2UgfSBmcm9tICcuL2tlcm5lbF91dGlscyc7XG5pbXBvcnQgeyBDcHBEVHlwZSB9IGZyb20gJy4vdHlwZXMnO1xubGV0IHdhc21GdW5jO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21GdW5jID0gYmFja2VuZC53YXNtLmN3cmFwKEFyZ01heCwgbnVsbCAvKiB2b2lkICovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyAvLyBvdXRfaWRcbiAgICBdKTtcbn1cbmZ1bmN0aW9uIGFyZ21heChhcmdzKSB7XG4gICAgY29uc3QgeyBiYWNrZW5kLCBpbnB1dHMsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgYXhpcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHguZGF0YUlkKS5pZDtcbiAgICBsZXQgaW5wdXRJZCA9IHhJZDtcbiAgICBsZXQgaW5wdXQgPSB4O1xuICAgIGNvbnN0IHsgdHJhbnNwb3NlZCwgYXhlcywgaW5wdXRXYXNUcmFuc3Bvc2VkIH0gPSBwZXJtdXRlQXhlc0FuZFRyYW5zcG9zZSh4LCBheGlzLCBiYWNrZW5kKTtcbiAgICBpZiAoaW5wdXRXYXNUcmFuc3Bvc2VkKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zcG9zZWRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh0cmFuc3Bvc2VkLmRhdGFJZCkuaWQ7XG4gICAgICAgIGlmICh0cmFuc3Bvc2VkSWQgIT09IHhJZCkge1xuICAgICAgICAgICAgLy8gdHJhbnNwb3NlIHdhcyBub3QgYSBuby1vcC4gV2Ugd2lsbCBuZWVkIHRvIGRpc3Bvc2Ugb2YgdGhpc1xuICAgICAgICAgICAgLy8gb25jZSB3ZSBhcmUgZG9uZS5cbiAgICAgICAgICAgIGlucHV0ID0gdHJhbnNwb3NlZDtcbiAgICAgICAgICAgIGlucHV0SWQgPSB0cmFuc3Bvc2VkSWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgb3V0U2hhcGUgPSBpbnB1dC5zaGFwZS5zbGljZSgwLCAtMSk7XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KG91dFNoYXBlLCAnaW50MzInKTtcbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBvdXRlclNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUob3V0LnNoYXBlKTtcbiAgICBjb25zdCBpbm5lclNpemUgPSBpbnB1dC5zaGFwZVtheGVzWzBdXTtcbiAgICB3YXNtRnVuYyhpbnB1dElkLCBDcHBEVHlwZVtpbnB1dC5kdHlwZV0sIG91dGVyU2l6ZSwgaW5uZXJTaXplLCBvdXRJZCk7XG4gICAgaWYgKGlucHV0V2FzVHJhbnNwb3NlZCkge1xuICAgICAgICAvLyBkaXNwb3NlIG9mIHRoZSB0cmFuc3Bvc2VkIHRlbnNvci5cbiAgICAgICAgYmFja2VuZC5kaXNwb3NlRGF0YSh0cmFuc3Bvc2VkLmRhdGFJZCk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgYXJnTWF4Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEFyZ01heCxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIGtlcm5lbEZ1bmM6IGFyZ21heCxcbiAgICBzZXR1cEZ1bmM6IHNldHVwXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXJnTWF4LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEF2Z1Bvb2wsIGJhY2tlbmRfdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5sZXQgd2FzbUF2Z1Bvb2w7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbUF2Z1Bvb2wgPSBiYWNrZW5kLndhc20uY3dyYXAoQXZnUG9vbCwgbnVsbCAvKiB2b2lkICovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICBdKTtcbn1cbmZ1bmN0aW9uIGF2Z1Bvb2woYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBhdHRycywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB4ID0gaW5wdXRzLng7XG4gICAgY29uc3QgeElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHguZGF0YUlkKS5pZDtcbiAgICBjb25zdCB7IGZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlIH0gPSBhdHRycztcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlUG9vbDJESW5mbyh4LnNoYXBlLCBmaWx0ZXJTaXplLCBzdHJpZGVzLCAxIC8qIGRpbGF0aW9ucyAqLywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpO1xuICAgIGNvbnN0IGZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmZpbHRlckhlaWdodDtcbiAgICBjb25zdCBmaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmZpbHRlcldpZHRoO1xuICAgIGNvbnN0IHBhZFRvcCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IHBhZFJpZ2h0ID0gY29udkluZm8ucGFkSW5mby5yaWdodDtcbiAgICBjb25zdCBwYWRCb3R0b20gPSBjb252SW5mby5wYWRJbmZvLmJvdHRvbTtcbiAgICBjb25zdCBwYWRMZWZ0ID0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICAgIGNvbnN0IGNoYW5uZWxzID0gY29udkluZm8uaW5DaGFubmVscztcbiAgICBpZiAoY29udkluZm8uZGF0YUZvcm1hdCAhPT0gJ2NoYW5uZWxzTGFzdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB3YXNtIGJhY2tlbmQgZG9lcyBub3Qgc3VwcG9ydCBkYXRhRm9ybWF0OidgICtcbiAgICAgICAgICAgIGAke2NvbnZJbmZvLmRhdGFGb3JtYXR9Jy4gUGxlYXNlIHVzZSAnY2hhbm5lbHNMYXN0Jy5gKTtcbiAgICB9XG4gICAgaWYgKGNvbnZJbmZvLmRpbGF0aW9uV2lkdGggIT09IDEgfHwgY29udkluZm8uZGlsYXRpb25IZWlnaHQgIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB3YXMgYmFja2VuZCBvbmx5IHN1cHBvcnRzIGF2ZXJhZ2UgcG9vbGluZyB3aXRoIGRpbGF0aW9uID0gWzEsIDFdLCBgICtcbiAgICAgICAgICAgIGBnb3QgWyR7Y29udkluZm8uZGlsYXRpb25IZWlnaHR9LCAke2NvbnZJbmZvLmRpbGF0aW9uV2lkdGh9XS5gKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KGNvbnZJbmZvLm91dFNoYXBlLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIHdhc21BdmdQb29sKHhJZCwgeC5zaGFwZVswXSwgeC5zaGFwZVsxXSwgeC5zaGFwZVsyXSwgZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgcGFkVG9wLCBwYWRSaWdodCwgcGFkQm90dG9tLCBwYWRMZWZ0LCBzdHJpZGVIZWlnaHQsIHN0cmlkZVdpZHRoLCBjaGFubmVscywgb3V0SWQpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgYXZnUG9vbENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBBdmdQb29sLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiBhdmdQb29sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXZnUG9vbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBCYXRjaE1hdE11bCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmxldCB3YXNtQmF0Y2hNYXRNdWw7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbUJhdGNoTWF0TXVsID0gYmFja2VuZC53YXNtLmN3cmFwKEJhdGNoTWF0TXVsLCBudWxsIC8qIHZvaWQgKi8sIFtcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicgLy8gb3V0X2lkXG4gICAgXSk7XG59XG5mdW5jdGlvbiBiYXRjaE1hdE11bChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgYSwgYiB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgdHJhbnNwb3NlQSwgdHJhbnNwb3NlQiB9ID0gYXR0cnM7XG4gICAgaWYgKGEuZHR5cGUgIT09ICdmbG9hdDMyJyB8fCBiLmR0eXBlICE9PSAnZmxvYXQzMicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCYXRjaE1hdE11bCBmb3Igbm9uIG5vbi1mbG9hdDMyIHRlbnNvcnMgbm90IHlldCBzdXBwb3J0ZWQuYCk7XG4gICAgfVxuICAgIGNvbnN0IGFSYW5rID0gYS5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgYlJhbmsgPSBiLnNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBpbm5lclNoYXBlQSA9IHRyYW5zcG9zZUEgPyBhLnNoYXBlW2FSYW5rIC0gMl0gOiBhLnNoYXBlW2FSYW5rIC0gMV07XG4gICAgY29uc3QgaW5uZXJTaGFwZUIgPSB0cmFuc3Bvc2VCID8gYi5zaGFwZVtiUmFuayAtIDFdIDogYi5zaGFwZVtiUmFuayAtIDJdO1xuICAgIGNvbnN0IG91dGVyU2hhcGVBID0gdHJhbnNwb3NlQSA/IGEuc2hhcGVbYVJhbmsgLSAxXSA6IGEuc2hhcGVbYVJhbmsgLSAyXTtcbiAgICBjb25zdCBvdXRlclNoYXBlQiA9IHRyYW5zcG9zZUIgPyBiLnNoYXBlW2JSYW5rIC0gMl0gOiBiLnNoYXBlW2JSYW5rIC0gMV07XG4gICAgY29uc3Qgb3V0ZXJEaW1zQSA9IGEuc2hhcGUuc2xpY2UoMCwgLTIpO1xuICAgIGNvbnN0IG91dGVyRGltc0IgPSBiLnNoYXBlLnNsaWNlKDAsIC0yKTtcbiAgICBjb25zdCBiYXRjaERpbUEgPSB1dGlsLnNpemVGcm9tU2hhcGUob3V0ZXJEaW1zQSk7XG4gICAgY29uc3QgYmF0Y2hEaW1CID0gdXRpbC5zaXplRnJvbVNoYXBlKG91dGVyRGltc0IpO1xuICAgIGNvbnN0IGJhdGNoRGltc0NvbXBhdGlibGUgPSBiYXRjaERpbUEgPT09IGJhdGNoRGltQiB8fCBiYXRjaERpbUEgPT09IDEgfHwgYmF0Y2hEaW1CID09PSAxO1xuICAgIHV0aWwuYXNzZXJ0KGFSYW5rID49IDIgJiYgYlJhbmsgPj0gMiAmJiBiYXRjaERpbXNDb21wYXRpYmxlLCAoKSA9PiBgRXJyb3IgaW4gbWF0TXVsOiB0aGUgaW5wdXQgYmF0Y2ggZGltZW5zaW9ucyBtdXN0IGVpdGhlciBiZSB0aGUgYCArXG4gICAgICAgIGBzYW1lIG9yIGF0IGxlYXN0IG9uZSBpbnB1dCBiYXRjaCBkaW1lbnNpb24gbXVzdCBiZSAxLiBHb3QgaW5wdXQgYCArXG4gICAgICAgIGBiYXRjaCBkaW1lbnNpb25zIG9mICgke291dGVyRGltc0F9KSBhbmQgKCR7b3V0ZXJEaW1zQn0pLmApO1xuICAgIGNvbnN0IG91dFNoYXBlT3V0ZXJEaW1zID0gYmF0Y2hEaW1BID4gYmF0Y2hEaW1CID8gYS5zaGFwZS5zbGljZSgwLCAtMikgOiBiLnNoYXBlLnNsaWNlKDAsIC0yKTtcbiAgICBjb25zdCBvdXRTaGFwZSA9IG91dFNoYXBlT3V0ZXJEaW1zLmNvbmNhdChbb3V0ZXJTaGFwZUEsIG91dGVyU2hhcGVCXSk7XG4gICAgdXRpbC5hc3NlcnQoaW5uZXJTaGFwZUEgPT09IGlubmVyU2hhcGVCLCAoKSA9PiBgRXJyb3IgaW4gbWF0TXVsOiBpbm5lciBzaGFwZXMgKCR7aW5uZXJTaGFwZUF9KSBhbmQgKGAgK1xuICAgICAgICBgJHtpbm5lclNoYXBlQn0pIG9mIFRlbnNvcnMgd2l0aCBzaGFwZXMgJHthLnNoYXBlfSBhbmQgYCArXG4gICAgICAgIGAke2Iuc2hhcGV9IGFuZCB0cmFuc3Bvc2VBPSR7dHJhbnNwb3NlQX1gICtcbiAgICAgICAgYCBhbmQgdHJhbnNwb3NlQj0ke3RyYW5zcG9zZUJ9IG11c3QgbWF0Y2guYCk7XG4gICAgY29uc3QgYTNkU2hhcGUgPSB0cmFuc3Bvc2VBID8gW2JhdGNoRGltQSwgaW5uZXJTaGFwZUEsIG91dGVyU2hhcGVBXSA6XG4gICAgICAgIFtiYXRjaERpbUEsIG91dGVyU2hhcGVBLCBpbm5lclNoYXBlQV07XG4gICAgY29uc3QgYjNkU2hhcGUgPSB0cmFuc3Bvc2VCID8gW2JhdGNoRGltQiwgb3V0ZXJTaGFwZUIsIGlubmVyU2hhcGVCXSA6XG4gICAgICAgIFtiYXRjaERpbUIsIGlubmVyU2hhcGVCLCBvdXRlclNoYXBlQl07XG4gICAgLy8gVGhlIHJlc3Qgb2YgdGhlIGltcGxlbWVudGF0aW9uIGlzIGRlc2lnbmVkIHRvIG9wZXJhdGUgb24gcmFuay0zIHRlbnNvcnNcbiAgICBjb25zdCBhM2QgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IGEgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IGEzZFNoYXBlIH0gfSk7XG4gICAgY29uc3QgYjNkID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiBiIH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBiM2RTaGFwZSB9IH0pO1xuICAgIGNvbnN0IGEzZElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGEzZC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IGIzZElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGIzZC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IGxlZnREaW0gPSB0cmFuc3Bvc2VBID8gYTNkLnNoYXBlWzJdIDogYTNkLnNoYXBlWzFdO1xuICAgIGNvbnN0IHJpZ2h0RGltID0gdHJhbnNwb3NlQiA/IGIzZC5zaGFwZVsxXSA6IGIzZC5zaGFwZVsyXTtcbiAgICBjb25zdCBiYXRjaERpbSA9IE1hdGgubWF4KGJhdGNoRGltQSwgYmF0Y2hEaW1CKTtcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoW2JhdGNoRGltLCBsZWZ0RGltLCByaWdodERpbV0sIGEzZC5kdHlwZSk7XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgYVNoYXBlQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheShhM2Quc2hhcGUpLmJ1ZmZlcik7XG4gICAgY29uc3QgYlNoYXBlQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheShiM2Quc2hhcGUpLmJ1ZmZlcik7XG4gICAgd2FzbUJhdGNoTWF0TXVsKGEzZElkLCBhU2hhcGVCeXRlcywgYTNkLnNoYXBlLmxlbmd0aCwgYjNkSWQsIGJTaGFwZUJ5dGVzLCBiM2Quc2hhcGUubGVuZ3RoLCB0cmFuc3Bvc2VBLCB0cmFuc3Bvc2VCLCBvdXRJZCk7XG4gICAgYmFja2VuZC5kaXNwb3NlRGF0YShhM2QuZGF0YUlkKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VEYXRhKGIzZC5kYXRhSWQpO1xuICAgIG91dC5zaGFwZSA9IG91dFNoYXBlO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgYmF0Y2hNYXRNdWxDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQmF0Y2hNYXRNdWwsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IGJhdGNoTWF0TXVsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QmF0Y2hNYXRNdWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBCYXRjaFRvU3BhY2VORCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7IHNsaWNlIH0gZnJvbSAnLi9TbGljZSc7XG5pbXBvcnQgeyB0cmFuc3Bvc2UgfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5mdW5jdGlvbiBiYXRjaFRvU3BhY2VORChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYmxvY2tTaGFwZSwgY3JvcHMgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHByb2QgPSBibG9ja1NoYXBlLnJlZHVjZSgoYSwgYikgPT4gYSAqIGIpO1xuICAgIGNvbnN0IHJlc2hhcGVkID0gYmFja2VuZF91dGlsLmdldFJlc2hhcGVkKHguc2hhcGUsIGJsb2NrU2hhcGUsIHByb2QpO1xuICAgIGNvbnN0IHBlcm11dGVkID0gYmFja2VuZF91dGlsLmdldFBlcm11dGVkKHJlc2hhcGVkLmxlbmd0aCwgYmxvY2tTaGFwZS5sZW5ndGgpO1xuICAgIGNvbnN0IHJlc2hhcGVkUGVybXV0ZWQgPSBiYWNrZW5kX3V0aWwuZ2V0UmVzaGFwZWRQZXJtdXRlZCh4LnNoYXBlLCBibG9ja1NoYXBlLCBwcm9kKTtcbiAgICBjb25zdCBzbGljZUJlZ2luQ29vcmRzID0gYmFja2VuZF91dGlsLmdldFNsaWNlQmVnaW5Db29yZHMoY3JvcHMsIGJsb2NrU2hhcGUubGVuZ3RoKTtcbiAgICBjb25zdCBzbGljZVNpemUgPSBiYWNrZW5kX3V0aWwuZ2V0U2xpY2VTaXplKHJlc2hhcGVkUGVybXV0ZWQsIGNyb3BzLCBibG9ja1NoYXBlLmxlbmd0aCk7XG4gICAgY29uc3QgeFJlc2hhcGVkID0gcmVzaGFwZSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiByZXNoYXBlZCB9IH0pO1xuICAgIGNvbnN0IHhUcmFuc3Bvc2VkID0gdHJhbnNwb3NlKHsgaW5wdXRzOiB7IHg6IHhSZXNoYXBlZCB9LCBiYWNrZW5kLCBhdHRyczogeyBwZXJtOiBwZXJtdXRlZCB9IH0pO1xuICAgIGNvbnN0IHhUcmFuc3Bvc2VkUmVzaGFwZWQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHhUcmFuc3Bvc2VkIH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiByZXNoYXBlZFBlcm11dGVkIH0gfSk7XG4gICAgY29uc3QgcmVzdWx0ID0gc2xpY2Uoe1xuICAgICAgICBpbnB1dHM6IHsgeDogeFRyYW5zcG9zZWRSZXNoYXBlZCB9LFxuICAgICAgICBiYWNrZW5kLFxuICAgICAgICBhdHRyczogeyBiZWdpbjogc2xpY2VCZWdpbkNvb3Jkcywgc2l6ZTogc2xpY2VTaXplIH1cbiAgICB9KTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VEYXRhKHhSZXNoYXBlZC5kYXRhSWQpO1xuICAgIGJhY2tlbmQuZGlzcG9zZURhdGEoeFRyYW5zcG9zZWQuZGF0YUlkKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VEYXRhKHhSZXNoYXBlZC5kYXRhSWQpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgY29uc3QgYmF0Y2hUb1NwYWNlTkRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQmF0Y2hUb1NwYWNlTkQsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBrZXJuZWxGdW5jOiBiYXRjaFRvU3BhY2VORFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJhdGNoVG9TcGFjZU5ELmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IENhc3QgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIGNhc3QoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzOiB7IHggfSwgYXR0cnM6IHsgZHR5cGUgfSwgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoeC5zaGFwZSwgZHR5cGUpO1xuICAgIGNvbnN0IGluVmFscyA9IGJhY2tlbmQudHlwZWRBcnJheUZyb21IZWFwKHgpO1xuICAgIGNvbnN0IG91dFZhbHMgPSBiYWNrZW5kLnR5cGVkQXJyYXlGcm9tSGVhcChvdXQpO1xuICAgIG91dFZhbHMuc2V0KGluVmFscyk7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBjYXN0Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IENhc3QsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBrZXJuZWxGdW5jOiBjYXN0LFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNhc3QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQ2VpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVVbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vdW5hcnlfa2VybmVsJztcbmV4cG9ydCBjb25zdCBjZWlsQ29uZmlnID0gY3JlYXRlVW5hcnlLZXJuZWxDb25maWcoQ2VpbCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DZWlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IENsaXBCeVZhbHVlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmxldCB3YXNtQ2xpcDtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtQ2xpcCA9IGJhY2tlbmQud2FzbS5jd3JhcChDbGlwQnlWYWx1ZSwgbnVsbCAvKiB2b2lkICovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInIC8vIG91dF9pZFxuICAgIF0pO1xufVxuZnVuY3Rpb24gY2xpcChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgY2xpcFZhbHVlTWluLCBjbGlwVmFsdWVNYXggfSA9IGF0dHJzO1xuICAgIGNvbnN0IHhJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh4LmRhdGFJZCkuaWQ7XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KHguc2hhcGUsIHguZHR5cGUpO1xuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIHdhc21DbGlwKHhJZCwgY2xpcFZhbHVlTWluLCBjbGlwVmFsdWVNYXgsIG91dElkKTtcbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IGNsaXBCeVZhbHVlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IENsaXBCeVZhbHVlLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiBjbGlwXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q2xpcEJ5VmFsdWUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBDb25jYXQsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY29uY2F0SW1wbENQVSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuaW1wb3J0IHsgaWRlbnRpdHkgfSBmcm9tICcuL0lkZW50aXR5JztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmNhdChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgYXhpcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXJncy5hdHRycy5heGlzLCBpbnB1dHNbMF0uc2hhcGUpWzBdO1xuICAgIGxldCBvdXRTaGFwZSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0U2hhcGUoaW5wdXRzLm1hcCh0ID0+IHQuc2hhcGUpLCBheGlzKTtcbiAgICAvLyBLZWVwIG9ubHkgbm9uLWVtcHR5IHRlbnNvcnMgKGlnbm9yZSB0ZW5zb3JzIHdpdGggMCBpbiB0aGVpciBzaGFwZSkuXG4gICAgY29uc3QgJGlucHV0cyA9IGlucHV0cy5maWx0ZXIodCA9PiB1dGlsLnNpemVGcm9tU2hhcGUodC5zaGFwZSkgPiAwKTtcbiAgICBpZiAoJGlucHV0cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGlkZW50aXR5KHsgaW5wdXRzOiB7IHg6ICRpbnB1dHNbMF0gfSwgYmFja2VuZCB9KTtcbiAgICB9XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KG91dFNoYXBlLCBpbnB1dHNbMF0uZHR5cGUpO1xuICAgIGlmICh1dGlsLnNpemVGcm9tU2hhcGUob3V0U2hhcGUpID09PSAwKSB7XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuICAgIGNvbnN0IHNoYXBlcyA9ICRpbnB1dHMubWFwKHQgPT4gdC5zaGFwZSk7XG4gICAgYmFja2VuZF91dGlsLmFzc2VydFBhcmFtc0NvbnNpc3RlbnQoc2hhcGVzLCBheGlzKTtcbiAgICBpZiAoJGlucHV0c1swXS5kdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gQW55IGNvbmNhdCBvZiBuLWRpbWVuc2lvbmFsIHRlbnNvcnMgYWNyb3NzIGFueSBheGlzIGNhbiBiZSByZWR1Y2VkIHRvXG4gICAgICAgIC8vIGEgY29uY2F0ZW5hdGlvbiBvZiB0d28tZGltZW5zaW9uYWwgdGVuc29ycyBhY3Jvc3MgdGhlIGF4aXMgMSBieSBmaXJzdFxuICAgICAgICAvLyBwYXJ0aXRpb25pbmcgdGhlIGF4ZXMgb2YgdGhlIG9yaWdpbmFsIHRlbnNvcnMgaW50byB0aG9zZSBsZXNzIHRoYW4gdGhlXG4gICAgICAgIC8vIGF4aXMgdG8gYmUgY29uY2F0ZW5hdGVkIGFuZCB0aGUgcmVzdC4gVGhlbiByZXNoYXBlIHRoZSB0ZW5zb3JzXG4gICAgICAgIC8vIGludG8gYSB0d28tZGltZW5zaW9uYWwgdGVuc29yIGJ5IGNvbGxhcHNpbmcgdGhlc2UgdHdvIHNldHMgb2YgYXhlcyBhbmRcbiAgICAgICAgLy8gY29uY2F0ZW5hdGUgdGhlIHJlc3VsdGluZyBtYXRyaWNlcyBhY3Jvc3MgdGhlIGF4aXMgMSwgZmluYWxseSByZXNoYXBpbmdcbiAgICAgICAgLy8gdGhlIHJlc3VsdCB0byBoYXZlIHRoZSBwcm9wZXIgc2hhcGUuXG4gICAgICAgIGNvbnN0IGlucHV0czJEID0gJGlucHV0cy5tYXAodCA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbm5lclNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUodC5zaGFwZS5zbGljZShheGlzKSk7XG4gICAgICAgICAgICBjb25zdCBzaGFwZSA9IFstMSwgaW5uZXJTaXplXTtcbiAgICAgICAgICAgIHJldHVybiByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHQgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGUgfSB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGlucHV0c1ZhbFNoYXBlcyA9IGlucHV0czJELm1hcCh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHM6IGJhY2tlbmQucmVhZFN5bmModC5kYXRhSWQpLCBzaGFwZTogdC5zaGFwZSB9O1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gQ29uY2F0cyAyZCB0ZW5zb3JzIGFsb25nIGF4aXM9MS5cbiAgICAgICAgb3V0U2hhcGUgPVxuICAgICAgICAgICAgYmFja2VuZF91dGlsLmNvbXB1dGVPdXRTaGFwZShpbnB1dHMyRC5tYXAodCA9PiB0LnNoYXBlKSwgMSAvKiBheGlzICovKTtcbiAgICAgICAgY29uc3Qgc2ltcGx5Q29uY2F0ID0gaW5wdXRzMkRbMF0uc2hhcGVbMF0gPT09IDE7XG4gICAgICAgIGNvbnN0IG91dFZhbHMgPSBjb25jYXRJbXBsQ1BVKGlucHV0c1ZhbFNoYXBlcywgb3V0U2hhcGUsIGlucHV0c1swXS5kdHlwZSwgc2ltcGx5Q29uY2F0KTtcbiAgICAgICAgY29uc3QgZmluYWxPdXRTaGFwZSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0U2hhcGUoJGlucHV0cy5tYXAodCA9PiB0LnNoYXBlKSwgYXhpcyk7XG4gICAgICAgIG91dC5zaGFwZSA9IGZpbmFsT3V0U2hhcGU7XG4gICAgICAgIGNvbnN0IG91dERhdGEgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCk7XG4gICAgICAgIG91dERhdGEuc3RyaW5nQnl0ZXMgPSBiYWNrZW5kX3V0aWwuZnJvbVN0cmluZ0FycmF5VG9VaW50OChvdXRWYWxzKTtcbiAgICAgICAgaW5wdXRzMkQuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZURhdGEodC5kYXRhSWQpKTtcbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG4gICAgY29uc3QgYmF0Y2hEaW0gPSB1dGlsLnNpemVGcm9tU2hhcGUoJGlucHV0c1swXS5zaGFwZS5zbGljZSgwLCBheGlzKSk7XG4gICAgbGV0IHN1bUlubmVyRGltcyA9IDA7XG4gICAgY29uc3QgaW5uZXJEaW1zID0gJGlucHV0cy5tYXAoaW5wdXQgPT4ge1xuICAgICAgICBjb25zdCBpbm5lckRpbSA9IHV0aWwuc2l6ZUZyb21TaGFwZShpbnB1dC5zaGFwZS5zbGljZShheGlzKSk7XG4gICAgICAgIHN1bUlubmVyRGltcyArPSBpbm5lckRpbTtcbiAgICAgICAgcmV0dXJuIGlubmVyRGltO1xuICAgIH0pO1xuICAgIGNvbnN0IGluVmFscyA9ICRpbnB1dHMubWFwKGlucHV0ID0+IGJhY2tlbmQudHlwZWRBcnJheUZyb21IZWFwKGlucHV0KSk7XG4gICAgY29uc3Qgb3V0VmFscyA9IGJhY2tlbmQudHlwZWRBcnJheUZyb21IZWFwKG91dCk7XG4gICAgZm9yIChsZXQgYiA9IDA7IGIgPCBiYXRjaERpbTsgYisrKSB7XG4gICAgICAgIGxldCBvdXRPZmZzZXQgPSBiICogc3VtSW5uZXJEaW1zO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluVmFscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaW5uZXJEaW0gPSBpbm5lckRpbXNbaV07XG4gICAgICAgICAgICBjb25zdCBpbk9mZnNldCA9IGIgKiBpbm5lckRpbTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHMgPSBpblZhbHNbaV0uc3ViYXJyYXkoaW5PZmZzZXQsIGluT2Zmc2V0ICsgaW5uZXJEaW0pO1xuICAgICAgICAgICAgb3V0VmFscy5zZXQodmFscywgb3V0T2Zmc2V0KTtcbiAgICAgICAgICAgIG91dE9mZnNldCArPSBpbm5lckRpbTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IGNvbmNhdENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBDb25jYXQsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBrZXJuZWxGdW5jOiBjb25jYXQsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29uY2F0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgQ29udjJEIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmxldCB3YXNtQ29udjJkO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21Db252MmQgPSBiYWNrZW5kLndhc20uY3dyYXAoQ29udjJELCBudWxsIC8qIHZvaWQgKi8sIFtcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgXSk7XG59XG5mdW5jdGlvbiBjb252MmQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBhdHRycywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IHgsIGZpbHRlciB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHhJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh4LmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgZmlsdGVySWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoZmlsdGVyLmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgeyBzdHJpZGVzLCBkaWxhdGlvbnMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCBkYXRhRm9ybWF0IH0gPSBhdHRycztcbiAgICBjb25zdCAkZGF0YUZvcm1hdCA9IGJhY2tlbmRfdXRpbC5jb252ZXJ0Q29udjJERGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyh4LnNoYXBlLCBmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGZhbHNlLCAkZGF0YUZvcm1hdCk7XG4gICAgY29uc3QgZmlsdGVySGVpZ2h0ID0gY29udkluZm8uZmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG4gICAgY29uc3QgcGFkVG9wID0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgcGFkUmlnaHQgPSBjb252SW5mby5wYWRJbmZvLnJpZ2h0O1xuICAgIGNvbnN0IHBhZEJvdHRvbSA9IGNvbnZJbmZvLnBhZEluZm8uYm90dG9tO1xuICAgIGNvbnN0IHBhZExlZnQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgY29uc3QgZGlsYXRpb25IZWlnaHQgPSBjb252SW5mby5kaWxhdGlvbkhlaWdodDtcbiAgICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBpbnB1dENoYW5uZWxzID0gY29udkluZm8uaW5DaGFubmVscztcbiAgICBjb25zdCBvdXRwdXRDaGFubmVscyA9IGNvbnZJbmZvLm91dENoYW5uZWxzO1xuICAgIGNvbnN0IGlzU2FtZVBhZCA9IGNvbnZJbmZvLnBhZEluZm8udHlwZSA9PT0gJ1NBTUUnID8gMSA6IDA7XG4gICAgaWYgKGNvbnZJbmZvLmRhdGFGb3JtYXQgIT09ICdjaGFubmVsc0xhc3QnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgd2FzbSBiYWNrZW5kIENvbnYyRCBkb2VzIG5vdCBzdXBwb3J0IGRhdGFGb3JtYXQ6J2AgK1xuICAgICAgICAgICAgYCR7Y29udkluZm8uZGF0YUZvcm1hdH0nLiBQbGVhc2UgdXNlICdjaGFubmVsc0xhc3QnLmApO1xuICAgIH1cbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoY29udkluZm8ub3V0U2hhcGUsICdmbG9hdDMyJyk7XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgd2FzbUNvbnYyZCh4SWQsIHguc2hhcGVbMF0sIHguc2hhcGVbMV0sIHguc2hhcGVbMl0sIGZpbHRlcklkLCBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBwYWRUb3AsIHBhZFJpZ2h0LCBwYWRCb3R0b20sIHBhZExlZnQsIGlzU2FtZVBhZCwgZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGgsIHN0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGgsIGlucHV0Q2hhbm5lbHMsIG91dHB1dENoYW5uZWxzLCBvdXRJZCk7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBjb252MkRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQ29udjJELFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiBjb252MmRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db252MkQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBDb252MkRCYWNrcHJvcElucHV0LCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmxldCB3YXNtQ29udjJEQmFja3Byb3BJbnB1dDtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtQ29udjJEQmFja3Byb3BJbnB1dCA9IGJhY2tlbmQud2FzbS5jd3JhcChDb252MkRCYWNrcHJvcElucHV0LCBudWxsLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgXSk7XG59XG5mdW5jdGlvbiBjb252MkRCYWNrcHJvcElucHV0KGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGlucHV0cywgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBkeSwgZmlsdGVyIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQsIGRpbVJvdW5kaW5nTW9kZSwgaW5wdXRTaGFwZSB9ID0gYXR0cnM7XG4gICAgY29uc3QgZGlsYXRpb25zID0gMTtcbiAgICBjb25zdCAkZGF0YUZvcm1hdCA9IGJhY2tlbmRfdXRpbC5jb252ZXJ0Q29udjJERGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyhpbnB1dFNoYXBlLCBmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGZhbHNlIC8qIGRlcHRod2lzZSAqLywgJGRhdGFGb3JtYXQpO1xuICAgIGNvbnN0IHsgYmF0Y2hTaXplLCBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBpbkNoYW5uZWxzLCBpbkhlaWdodCwgaW5XaWR0aCwgb3V0Q2hhbm5lbHMsIG91dEhlaWdodCwgb3V0V2lkdGgsIHN0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGggfSA9IGNvbnZJbmZvO1xuICAgIGNvbnN0IHRvcFBhZCA9IGZpbHRlckhlaWdodCAtIDEgLSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICBjb25zdCBsZWZ0UGFkID0gZmlsdGVyV2lkdGggLSAxIC0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgIGNvbnN0IGlzQ2hhbm5lbHNMYXN0ID0gY29udkluZm8uZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzTGFzdCc7XG4gICAgY29uc3QgZHhTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhjb252SW5mby5pblNoYXBlKTtcbiAgICBjb25zdCBkeVN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGR5LnNoYXBlKTtcbiAgICBjb25zdCBbZmx0UzAsIGZsdFMxLCBmbHRTMl0gPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGZpbHRlci5zaGFwZSk7XG4gICAgY29uc3QgeEJhdGNoU3RyaWRlID0gZHhTdHJpZGVzWzBdO1xuICAgIGNvbnN0IHhSb3dTdHJpZGUgPSBpc0NoYW5uZWxzTGFzdCA/IGR4U3RyaWRlc1sxXSA6IGR4U3RyaWRlc1syXTtcbiAgICBjb25zdCB4Q29sU3RyaWRlID0gaXNDaGFubmVsc0xhc3QgPyBkeFN0cmlkZXNbMl0gOiAxO1xuICAgIGNvbnN0IHhDaGFubmVsU3RyaWRlID0gaXNDaGFubmVsc0xhc3QgPyAxIDogZHhTdHJpZGVzWzFdO1xuICAgIGNvbnN0IHlCYXRjaFN0cmlkZSA9IGR5U3RyaWRlc1swXTtcbiAgICBjb25zdCB5Um93U3RyaWRlID0gaXNDaGFubmVsc0xhc3QgPyBkeVN0cmlkZXNbMV0gOiBkeVN0cmlkZXNbMl07XG4gICAgY29uc3QgeUNvbFN0cmlkZSA9IGlzQ2hhbm5lbHNMYXN0ID8gZHlTdHJpZGVzWzJdIDogMTtcbiAgICBjb25zdCB5Q2hhbm5lbFN0cmlkZSA9IGlzQ2hhbm5lbHNMYXN0ID8gMSA6IGR5U3RyaWRlc1sxXTtcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoY29udkluZm8uaW5TaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBkeUlkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGR5LmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgZmlsdGVySWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoZmlsdGVyLmRhdGFJZCkuaWQ7XG4gICAgd2FzbUNvbnYyREJhY2twcm9wSW5wdXQoZHlJZCwgZmlsdGVySWQsIGJhdGNoU2l6ZSwgZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5IZWlnaHQsIGluV2lkdGgsIGluQ2hhbm5lbHMsIG91dEhlaWdodCwgb3V0V2lkdGgsIG91dENoYW5uZWxzLCBzdHJpZGVIZWlnaHQsIHN0cmlkZVdpZHRoLCB0b3BQYWQsIGxlZnRQYWQsIGZsdFMwLCBmbHRTMSwgZmx0UzIsIHhCYXRjaFN0cmlkZSwgeFJvd1N0cmlkZSwgeENvbFN0cmlkZSwgeENoYW5uZWxTdHJpZGUsIHlCYXRjaFN0cmlkZSwgeVJvd1N0cmlkZSwgeUNvbFN0cmlkZSwgeUNoYW5uZWxTdHJpZGUsIG91dElkKTtcbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IGNvbnYyREJhY2twcm9wSW5wdXRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQ29udjJEQmFja3Byb3BJbnB1dCxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogY29udjJEQmFja3Byb3BJbnB1dFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbnYyREJhY2twcm9wSW5wdXQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQ29zIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi91bmFyeV9rZXJuZWwnO1xuZXhwb3J0IGNvbnN0IGNvc0NvbmZpZyA9IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnKENvcyk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db3MuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQ29zaCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVVbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vdW5hcnlfa2VybmVsJztcbmV4cG9ydCBjb25zdCBjb3NoQ29uZmlnID0gY3JlYXRlVW5hcnlLZXJuZWxDb25maWcoQ29zaCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db3NoLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IENyb3BBbmRSZXNpemUgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY2FzdCB9IGZyb20gJy4vQ2FzdCc7XG4vLyBNdXN0IG1hdGNoIGVudW0gaW4gQ3JvcEFuZFJlc2l6ZS5jY1xudmFyIEludGVycG9sYXRpb25NZXRob2Q7XG4oZnVuY3Rpb24gKEludGVycG9sYXRpb25NZXRob2QpIHtcbiAgICBJbnRlcnBvbGF0aW9uTWV0aG9kW0ludGVycG9sYXRpb25NZXRob2RbXCJiaWxpbmVhclwiXSA9IDBdID0gXCJiaWxpbmVhclwiO1xuICAgIEludGVycG9sYXRpb25NZXRob2RbSW50ZXJwb2xhdGlvbk1ldGhvZFtcIm5lYXJlc3RcIl0gPSAxXSA9IFwibmVhcmVzdFwiO1xufSkoSW50ZXJwb2xhdGlvbk1ldGhvZCB8fCAoSW50ZXJwb2xhdGlvbk1ldGhvZCA9IHt9KSk7XG5sZXQgd2FzbUNyb3BBbmRSZXNpemU7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbUNyb3BBbmRSZXNpemUgPSBiYWNrZW5kLndhc20uY3dyYXAoQ3JvcEFuZFJlc2l6ZSwgbnVsbCAvKnZvaWQqLywgW1xuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInIC8vIG91dCBpZFxuICAgIF0pO1xufVxuZnVuY3Rpb24gY3JvcEFuZFJlc2l6ZShhcmdzKSB7XG4gICAgY29uc3QgeyBiYWNrZW5kLCBpbnB1dHMsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgbWV0aG9kLCBleHRyYXBvbGF0aW9uVmFsdWUsIGNyb3BTaXplIH0gPSBhdHRycztcbiAgICBjb25zdCB7IGltYWdlLCBib3hlcywgYm94SW5kIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgbnVtQm94ZXMgPSBib3hlcy5zaGFwZVswXTtcbiAgICBjb25zdCBbY3JvcEhlaWdodCwgY3JvcFdpZHRoXSA9IGNyb3BTaXplO1xuICAgIGNvbnN0IG91dFNoYXBlID0gW251bUJveGVzLCBjcm9wSGVpZ2h0LCBjcm9wV2lkdGgsIGltYWdlLnNoYXBlWzNdXTtcbiAgICBsZXQgaW1hZ2VzRGF0YSA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChpbWFnZS5kYXRhSWQpO1xuICAgIGxldCBjYXN0ZWREYXRhO1xuICAgIGlmIChpbWFnZS5kdHlwZSAhPT0gJ2Zsb2F0MzInKSB7XG4gICAgICAgIGNhc3RlZERhdGEgPSBjYXN0KHsgYmFja2VuZCwgaW5wdXRzOiB7IHg6IGltYWdlIH0sIGF0dHJzOiB7IGR0eXBlOiAnZmxvYXQzMicgfSB9KTtcbiAgICAgICAgaW1hZ2VzRGF0YSA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChjYXN0ZWREYXRhLmRhdGFJZCk7XG4gICAgfVxuICAgIGNvbnN0IGltYWdlc0lkID0gaW1hZ2VzRGF0YS5pZDtcbiAgICBjb25zdCBib3hlc0lkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGJveGVzLmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgYm94SW5kSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoYm94SW5kLmRhdGFJZCkuaWQ7XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KG91dFNoYXBlLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IGltYWdlc1NoYXBlQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheShpbWFnZS5zaGFwZSkuYnVmZmVyKTtcbiAgICB3YXNtQ3JvcEFuZFJlc2l6ZShpbWFnZXNJZCwgYm94ZXNJZCwgYm94SW5kSWQsIG51bUJveGVzLCBpbWFnZXNTaGFwZUJ5dGVzLCBjcm9wSGVpZ2h0LCBjcm9wV2lkdGgsIEludGVycG9sYXRpb25NZXRob2RbbWV0aG9kXSwgZXh0cmFwb2xhdGlvblZhbHVlLCBvdXRJZCk7XG4gICAgaWYgKGNhc3RlZERhdGEgIT0gbnVsbCkge1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VEYXRhKGNhc3RlZERhdGEuZGF0YUlkKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBjcm9wQW5kUmVzaXplQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IENyb3BBbmRSZXNpemUsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IGNyb3BBbmRSZXNpemVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Dcm9wQW5kUmVzaXplLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgQ3Vtc3VtLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IENwcERUeXBlIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyB0cmFuc3Bvc2UgfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5sZXQgd2FzbUN1bXN1bTtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtQ3Vtc3VtID0gYmFja2VuZC53YXNtLmN3cmFwKEN1bXN1bSwgbnVsbCAvKiB2b2lkICovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicgLy8gZHR5cGVcbiAgICBdKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjdW1zdW0oYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGF4aXMsIGV4Y2x1c2l2ZSwgcmV2ZXJzZSB9ID0gYXR0cnM7XG4gICAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcbiAgICB1dGlsLmFzc2VydCh4LmR0eXBlID09PSAnZmxvYXQzMicgfHwgeC5kdHlwZSA9PT0gJ2ludDMyJywgKCkgPT4gYGN1bXN1bSBkb2VzIG5vdCBzdXBwb3J0ICR7eC5kdHlwZX0gdGVuc29ycyBpbiB0aGUgV0FTTSBiYWNrZW5kYCk7XG4gICAgLy8gcGVybXV0ZSByZXF1aXJlZCBheGlzIHRvIGlubmVyIG1vc3QgYXhpc1xuICAgIGNvbnN0IHBlcm11dGF0aW9uID0gYmFja2VuZF91dGlsLmdldEF4ZXNQZXJtdXRhdGlvbihbYXhpc10sIHhSYW5rKTtcbiAgICBsZXQgcGVybXV0ZWRYID0geDtcbiAgICBpZiAocGVybXV0YXRpb24gIT09IG51bGwpIHtcbiAgICAgICAgcGVybXV0ZWRYID0gdHJhbnNwb3NlKHsgaW5wdXRzOiB7IHggfSwgYXR0cnM6IHsgcGVybTogcGVybXV0YXRpb24gfSwgYmFja2VuZCB9KTtcbiAgICB9XG4gICAgY29uc3QgcGVybXV0ZWRBeGlzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoMSwgeFJhbmspWzBdO1xuICAgIGJhY2tlbmRfdXRpbC5hc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcygnY3Vtc3VtJywgW3Blcm11dGVkQXhpc10sIHhSYW5rKTtcbiAgICBjb25zdCBwZXJtdXRlZE91dCA9IGJhY2tlbmQubWFrZU91dHB1dChwZXJtdXRlZFguc2hhcGUsIHBlcm11dGVkWC5kdHlwZSk7XG4gICAgY29uc3QgZmluYWxEaW0gPSBwZXJtdXRlZFguc2hhcGVbcGVybXV0ZWRBeGlzXTtcbiAgICBjb25zdCBwZXJtdXRlZFhJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChwZXJtdXRlZFguZGF0YUlkKS5pZDtcbiAgICBjb25zdCBwZXJtdXRlZE91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHBlcm11dGVkT3V0LmRhdGFJZCkuaWQ7XG4gICAgd2FzbUN1bXN1bShwZXJtdXRlZFhJZCwgZXhjbHVzaXZlID8gMSA6IDAsIHJldmVyc2UgPyAxIDogMCwgZmluYWxEaW0sIHBlcm11dGVkT3V0SWQsIENwcERUeXBlW3guZHR5cGVdKTtcbiAgICAvLyB0cmFuc3Bvc2UgZGF0YSBiYWNrIGlmIHBlcm11dGVkXG4gICAgbGV0IG91dCA9IHBlcm11dGVkT3V0O1xuICAgIGlmIChwZXJtdXRhdGlvbiAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCB1bmRvUGVybXV0YXRpb24gPSBiYWNrZW5kX3V0aWwuZ2V0VW5kb0F4ZXNQZXJtdXRhdGlvbihwZXJtdXRhdGlvbik7XG4gICAgICAgIG91dCA9IHRyYW5zcG9zZSh7IGlucHV0czogeyB4OiBwZXJtdXRlZE91dCB9LCBhdHRyczogeyBwZXJtOiB1bmRvUGVybXV0YXRpb24gfSwgYmFja2VuZCB9KTtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlRGF0YShwZXJtdXRlZFguZGF0YUlkKTtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlRGF0YShwZXJtdXRlZE91dC5kYXRhSWQpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IGN1bXN1bUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBDdW1zdW0sXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IGN1bXN1bVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUN1bXN1bS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBEZXB0aFRvU3BhY2UsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xubGV0IHdhc21EZXB0aFRvU3BhY2U7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbURlcHRoVG9TcGFjZSA9IGJhY2tlbmQud2FzbS5jd3JhcChEZXB0aFRvU3BhY2UsIG51bGwgLyp2b2lkKi8sIFtcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICBdKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZXB0aFRvU3BhY2UoYXJncykge1xuICAgIGNvbnN0IHsgYmFja2VuZCwgaW5wdXRzLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGJsb2NrU2l6ZSwgZGF0YUZvcm1hdCB9ID0gYXR0cnM7XG4gICAgdXRpbC5hc3NlcnQoYmxvY2tTaXplID4gMSwgKCkgPT4gYGJsb2NrU2l6ZSBzaG91bGQgYmUgPiAxIGZvciBkZXB0aFRvU3BhY2UsIGJ1dCB3YXM6ICR7YmxvY2tTaXplfWApO1xuICAgIGNvbnN0IGJhdGNoU2l6ZSA9IHguc2hhcGVbMF07XG4gICAgY29uc3QgaW5wdXRIZWlnaHQgPSAoZGF0YUZvcm1hdCA9PT0gJ05IV0MnKSA/IHguc2hhcGVbMV0gOiB4LnNoYXBlWzJdO1xuICAgIGNvbnN0IGlucHV0V2lkdGggPSAoZGF0YUZvcm1hdCA9PT0gJ05IV0MnKSA/IHguc2hhcGVbMl0gOiB4LnNoYXBlWzNdO1xuICAgIGNvbnN0IGlucHV0RGVwdGggPSAoZGF0YUZvcm1hdCA9PT0gJ05IV0MnKSA/IHguc2hhcGVbM10gOiB4LnNoYXBlWzFdO1xuICAgIGNvbnN0IG91dHB1dEhlaWdodCA9IGlucHV0SGVpZ2h0ICogYmxvY2tTaXplO1xuICAgIGNvbnN0IG91dHB1dFdpZHRoID0gaW5wdXRXaWR0aCAqIGJsb2NrU2l6ZTtcbiAgICBjb25zdCBvdXRwdXREZXB0aCA9IGlucHV0RGVwdGggLyAoYmxvY2tTaXplICogYmxvY2tTaXplKTtcbiAgICBjb25zdCBvdXRwdXRTaGFwZSA9IChkYXRhRm9ybWF0ID09PSAnTkhXQycpID9cbiAgICAgICAgW2JhdGNoU2l6ZSwgb3V0cHV0SGVpZ2h0LCBvdXRwdXRXaWR0aCwgb3V0cHV0RGVwdGhdIDpcbiAgICAgICAgW2JhdGNoU2l6ZSwgb3V0cHV0RGVwdGgsIG91dHB1dEhlaWdodCwgb3V0cHV0V2lkdGhdO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChvdXRwdXRTaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICBjb25zdCB4RGF0YSA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh4LmRhdGFJZCk7XG4gICAgY29uc3QgeElkID0geERhdGEuaWQ7XG4gICAgY29uc3QgeFN0cmlkZXNCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KHV0aWwuY29tcHV0ZVN0cmlkZXMoeC5zaGFwZSkpLmJ1ZmZlcik7XG4gICAgY29uc3Qgb3V0cHV0U2hhcGVCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KG91dHB1dFNoYXBlKS5idWZmZXIpO1xuICAgIGNvbnN0IG91dFN0cmlkZXNCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KHV0aWwuY29tcHV0ZVN0cmlkZXMob3V0cHV0U2hhcGUpKS5idWZmZXIpO1xuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IGNoYW5uZWxzTGFzdCA9IGRhdGFGb3JtYXQgPT09ICdOSFdDJyA/IDEgOiAwO1xuICAgIHdhc21EZXB0aFRvU3BhY2UoeElkLCBibG9ja1NpemUsIGNoYW5uZWxzTGFzdCwgeFN0cmlkZXNCeXRlcywgeC5zaGFwZS5sZW5ndGggLSAxLCBvdXRwdXRTaGFwZUJ5dGVzLCBvdXRTdHJpZGVzQnl0ZXMsIG91dHB1dFNoYXBlLmxlbmd0aCwgb3V0SWQpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgZGVwdGhUb1NwYWNlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IERlcHRoVG9TcGFjZSxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogZGVwdGhUb1NwYWNlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGVwdGhUb1NwYWNlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgRGVwdGh3aXNlQ29udjJkTmF0aXZlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmxldCB3YXNtRGVwdGh3aXNlQ29udjJkO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21EZXB0aHdpc2VDb252MmQgPVxuICAgICAgICBiYWNrZW5kLndhc20uY3dyYXAoRGVwdGh3aXNlQ29udjJkTmF0aXZlLCBudWxsIC8qIHZvaWQgKi8sIFtcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICBdKTtcbn1cbmZ1bmN0aW9uIGRlcHRod2lzZUNvbnYyZChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGF0dHJzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCwgZmlsdGVyIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHguZGF0YUlkKS5pZDtcbiAgICBjb25zdCBmaWx0ZXJJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChmaWx0ZXIuZGF0YUlkKS5pZDtcbiAgICBjb25zdCB7IHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUgfSA9IGF0dHJzO1xuICAgIGNvbnN0ICRkaWxhdGlvbnMgPSBkaWxhdGlvbnMgPT0gbnVsbCA/IFsxLCAxXSA6IGRpbGF0aW9ucztcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyh4LnNoYXBlLCBmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsICRkaWxhdGlvbnMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCB0cnVlIC8qIGRlcHRod2lzZSAqLyk7XG4gICAgY29uc3QgZmlsdGVySGVpZ2h0ID0gY29udkluZm8uZmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG4gICAgY29uc3QgcGFkVG9wID0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgcGFkUmlnaHQgPSBjb252SW5mby5wYWRJbmZvLnJpZ2h0O1xuICAgIGNvbnN0IHBhZEJvdHRvbSA9IGNvbnZJbmZvLnBhZEluZm8uYm90dG9tO1xuICAgIGNvbnN0IHBhZExlZnQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgY29uc3QgZGlsYXRpb25IZWlnaHQgPSBjb252SW5mby5kaWxhdGlvbkhlaWdodDtcbiAgICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBpbnB1dENoYW5uZWxzID0gY29udkluZm8uaW5DaGFubmVscztcbiAgICBjb25zdCBvdXRwdXRDaGFubmVscyA9IGNvbnZJbmZvLm91dENoYW5uZWxzO1xuICAgIGNvbnN0IGlzU2FtZVBhZCA9IGNvbnZJbmZvLnBhZEluZm8udHlwZSA9PT0gJ1NBTUUnID8gMSA6IDA7XG4gICAgaWYgKGNvbnZJbmZvLmRhdGFGb3JtYXQgIT09ICdjaGFubmVsc0xhc3QnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgd2FzbSBiYWNrZW5kIERlcHRod2lzZUNvbnYyZE5hdGl2ZSBkb2VzIG5vdCBzdXBwb3J0IGRhdGFGb3JtYXQ6J2AgK1xuICAgICAgICAgICAgYCR7Y29udkluZm8uZGF0YUZvcm1hdH0nLiBQbGVhc2UgdXNlICdjaGFubmVsc0xhc3QnLmApO1xuICAgIH1cbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoY29udkluZm8ub3V0U2hhcGUsICdmbG9hdDMyJyk7XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgd2FzbURlcHRod2lzZUNvbnYyZCh4SWQsIHguc2hhcGVbMF0sIHguc2hhcGVbMV0sIHguc2hhcGVbMl0sIGZpbHRlcklkLCBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBwYWRUb3AsIHBhZFJpZ2h0LCBwYWRCb3R0b20sIHBhZExlZnQsIGlzU2FtZVBhZCwgZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGgsIHN0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGgsIGlucHV0Q2hhbm5lbHMsIG91dHB1dENoYW5uZWxzLCBvdXRJZCk7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBkZXB0aHdpc2VDb252MmROYXRpdmVDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRGVwdGh3aXNlQ29udjJkTmF0aXZlLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiBkZXB0aHdpc2VDb252MmRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EZXB0aHdpc2VDb252MmROYXRpdmUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRXF1YWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi9iaW5hcnlfa2VybmVsJztcbmNvbnN0IHN1cHBvcnRzRnVsbEJyb2FkY2FzdCA9IGZhbHNlO1xuZXhwb3J0IGNvbnN0IGVxdWFsQ29uZmlnID0gY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnKEVxdWFsLCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QsICdib29sJyk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FcXVhbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFeHAgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlVW5hcnlLZXJuZWxDb25maWcgfSBmcm9tICcuL3VuYXJ5X2tlcm5lbCc7XG5leHBvcnQgY29uc3QgZXhwQ29uZmlnID0gY3JlYXRlVW5hcnlLZXJuZWxDb25maWcoRXhwKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUV4cC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFeHBhbmREaW1zLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuZXhwb3J0IGZ1bmN0aW9uIGV4cGFuZERpbXMoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBhdHRycywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IGlucHV0IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBkaW0gfSA9IGF0dHJzO1xuICAgIGNvbnN0IGlucHV0UmFuayA9IGlucHV0LnNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBuZXdTaGFwZSA9IGlucHV0LnNoYXBlLnNsaWNlKCk7XG4gICAgbGV0ICRkaW0gPSBkaW07XG4gICAgaWYgKGRpbSA8IDApIHtcbiAgICAgICAgLy8gTmVnYXRpdmUgdmFsdWUgaXMgY291bnRlZCBmcm9tIHRoZSB0YWlsIG9mIHJhbmsuXG4gICAgICAgIHV0aWwuYXNzZXJ0KC0oaW5wdXRSYW5rICsgMSkgPD0gZGltLCAoKSA9PiBgQXhpcyBtdXN0IGJlIGluIHRoZSBpbnRlcnZhbCBbJHstKGlucHV0UmFuayArIDEpfSwgJHtpbnB1dFJhbmt9XWApO1xuICAgICAgICAkZGltID0gaW5wdXRSYW5rICsgZGltICsgMTtcbiAgICB9XG4gICAgbmV3U2hhcGUuc3BsaWNlKCRkaW0sIDAsIDEpO1xuICAgIHJldHVybiByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IGlucHV0IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBuZXdTaGFwZSB9IH0pO1xufVxuZXhwb3J0IGNvbnN0IGV4cGFuZERpbXNDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRXhwYW5kRGltcyxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIGtlcm5lbEZ1bmM6IGV4cGFuZERpbXMsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RXhwYW5kRGltcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBGaWxsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmZ1bmN0aW9uIGZpbGwoYXJncykge1xuICAgIGNvbnN0IHsgYXR0cnM6IHsgc2hhcGUsIHZhbHVlLCBkdHlwZSB9LCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChzaGFwZSwgZHR5cGUpO1xuICAgIGNvbnN0IG91dFZhbHMgPSBiYWNrZW5kLnR5cGVkQXJyYXlGcm9tSGVhcChvdXQpO1xuICAgIG91dFZhbHMuZmlsbCh2YWx1ZSk7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBmaWxsQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEZpbGwsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBrZXJuZWxGdW5jOiBmaWxsLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZpbGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRmxpcExlZnRSaWdodCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5sZXQgd2FzbUZsaXBMZWZ0UmlnaHQ7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbUZsaXBMZWZ0UmlnaHQgPSBiYWNrZW5kLndhc20uY3dyYXAoRmxpcExlZnRSaWdodCwgbnVsbCAvKiB2b2lkICovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgXSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZmxpcExlZnRSaWdodChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBpbWFnZSB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChpbWFnZS5zaGFwZSwgaW1hZ2UuZHR5cGUpO1xuICAgIGNvbnN0IGltYWdlSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoaW1hZ2UuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBbYmF0Y2gsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBudW1DaGFubmVsc10gPSBpbWFnZS5zaGFwZTtcbiAgICB3YXNtRmxpcExlZnRSaWdodChpbWFnZUlkLCBiYXRjaCwgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIG51bUNoYW5uZWxzLCBvdXRJZCk7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBmbGlwTGVmdFJpZ2h0Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEZsaXBMZWZ0UmlnaHQsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBrZXJuZWxGdW5jOiBmbGlwTGVmdFJpZ2h0LFxuICAgIHNldHVwRnVuYzogc2V0dXBcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GbGlwTGVmdFJpZ2h0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEZsb29yIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi91bmFyeV9rZXJuZWwnO1xuZXhwb3J0IGNvbnN0IGZsb29yQ29uZmlnID0gY3JlYXRlVW5hcnlLZXJuZWxDb25maWcoRmxvb3IpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Rmxvb3IuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRmxvb3JEaXYgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi9iaW5hcnlfa2VybmVsJztcbmNvbnN0IHN1cHBvcnRzRnVsbEJyb2FkY2FzdCA9IGZhbHNlO1xuZXhwb3J0IGNvbnN0IGZsb29yRGl2Q29uZmlnID0gY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnKEZsb29yRGl2LCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Rmxvb3JEaXYuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRnVzZWRCYXRjaE5vcm0sIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xubGV0IHdhc21CYXRjaE5vcm07XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbUJhdGNoTm9ybSA9IGJhY2tlbmQud2FzbS5jd3JhcChGdXNlZEJhdGNoTm9ybSwgbnVsbCAvKiB2b2lkICovLCBbJ251bWJlcicsICdudW1iZXInLCAnbnVtYmVyJywgJ251bWJlcicsICdudW1iZXInLCAnbnVtYmVyJywgJ251bWJlciddKTtcbn1cbmZ1bmN0aW9uIGZ1c2VkQmF0Y2hOb3JtKGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGlucHV0cywgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB2YXJpYW5jZUVwc2lsb24gfSA9IGF0dHJzO1xuICAgIGNvbnN0IHsgeCwgbWVhbiwgdmFyaWFuY2UsIG9mZnNldCwgc2NhbGUgfSA9IGlucHV0cztcbiAgICBjb25zdCB4SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IG1lYW5JZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChtZWFuLmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgdmFyaWFuY2VJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh2YXJpYW5jZS5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IG9mZnNldElkID0gb2Zmc2V0ICE9IG51bGwgPyBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob2Zmc2V0LmRhdGFJZCkuaWQgOiAwO1xuICAgIGNvbnN0IHNjYWxlSWQgPSBzY2FsZSAhPSBudWxsID8gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHNjYWxlLmRhdGFJZCkuaWQgOiAwO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dCh4LnNoYXBlLCB4LmR0eXBlKTtcbiAgICAvLyBTaG9ydC1jaXJjdWl0IHplcm8tc2l6ZWQgdGVuc29ycy5cbiAgICBpZiAodXRpbC5zaXplRnJvbVNoYXBlKHguc2hhcGUpID09PSAwKSB7XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIHdhc21CYXRjaE5vcm0oeElkLCBtZWFuSWQsIHZhcmlhbmNlSWQsIG9mZnNldElkLCBzY2FsZUlkLCB2YXJpYW5jZUVwc2lsb24sIG91dElkKTtcbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IGZ1c2VkQmF0Y2hOb3JtQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEZ1c2VkQmF0Y2hOb3JtLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiBmdXNlZEJhdGNoTm9ybVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZ1c2VkQmF0Y2hOb3JtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgRnVzZWRDb252MkQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgRnVzYWJsZUFjdGl2YXRpb24gfSBmcm9tICcuL3R5cGVzJztcbmxldCB3YXNtRnVzZWRDb252MmQ7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbUZ1c2VkQ29udjJkID0gYmFja2VuZC53YXNtLmN3cmFwKEZ1c2VkQ29udjJELCBudWxsIC8qIHZvaWQgKi8sIFtcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgIF0pO1xufVxuZnVuY3Rpb24gZnVzZWRDb252MmQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBhdHRycywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IHgsIGZpbHRlciwgYmlhcywgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgc3RyaWRlcywgcGFkLCBkaWxhdGlvbnMsIGRhdGFGb3JtYXQsIGRpbVJvdW5kaW5nTW9kZSwgYWN0aXZhdGlvbiwgbGVha3lyZWx1QWxwaGEgfSA9IGF0dHJzO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252MkRJbmZvKHguc2hhcGUsIGZpbHRlci5zaGFwZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSk7XG4gICAgY29uc3QgZnVzZWRBY3RpdmF0aW9uID0gRnVzYWJsZUFjdGl2YXRpb25bYWN0aXZhdGlvbl07XG4gICAgaWYgKGZ1c2VkQWN0aXZhdGlvbiA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHthY3RpdmF0aW9ufSBhY3RpdmF0aW9uIG5vdCB5ZXQgc3VwcG9ydGVkIGZvciBGdXNlZENvbnYyRCBgICtcbiAgICAgICAgICAgIGBpbiB0aGUgd2FzbSBiYWNrZW5kLmApO1xuICAgIH1cbiAgICBjb25zdCB4SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IGZpbHRlcklkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGZpbHRlci5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IG91dHB1dENoYW5uZWxzID0gY29udkluZm8ub3V0Q2hhbm5lbHM7XG4gICAgbGV0IGJpYXNJZCA9IDA7XG4gICAgaWYgKGJpYXMgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBiaWFzRGF0YSA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChiaWFzLmRhdGFJZCk7XG4gICAgICAgIGlmIChiaWFzRGF0YS5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRnVzZWRDb252MkQgb25seSBzdXBwb3J0cyByYW5rLTEgYmlhcyBidXQgZ290IGAgK1xuICAgICAgICAgICAgICAgIGByYW5rICR7Ymlhc0RhdGEuc2hhcGUubGVuZ3RofS5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYmlhc0RhdGEuc2hhcGVbMF0gIT09IG91dHB1dENoYW5uZWxzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZ1c2VkQ29udjJEIGJpYXMgc2hhcGUgKCR7Ymlhc0RhdGEuc2hhcGV9KSBkb2VzIG5vdCBgICtcbiAgICAgICAgICAgICAgICBgbWF0Y2ggdGhlIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMgKCR7b3V0cHV0Q2hhbm5lbHN9KWApO1xuICAgICAgICB9XG4gICAgICAgIGJpYXNJZCA9IGJpYXNEYXRhLmlkO1xuICAgIH1cbiAgICBjb25zdCBmaWx0ZXJIZWlnaHQgPSBjb252SW5mby5maWx0ZXJIZWlnaHQ7XG4gICAgY29uc3QgZmlsdGVyV2lkdGggPSBjb252SW5mby5maWx0ZXJXaWR0aDtcbiAgICBjb25zdCBwYWRUb3AgPSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICBjb25zdCBwYWRSaWdodCA9IGNvbnZJbmZvLnBhZEluZm8ucmlnaHQ7XG4gICAgY29uc3QgcGFkQm90dG9tID0gY29udkluZm8ucGFkSW5mby5ib3R0b207XG4gICAgY29uc3QgcGFkTGVmdCA9IGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICAgIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICAgIGNvbnN0IGlucHV0Q2hhbm5lbHMgPSBjb252SW5mby5pbkNoYW5uZWxzO1xuICAgIGNvbnN0IGlzU2FtZVBhZCA9IGNvbnZJbmZvLnBhZEluZm8udHlwZSA9PT0gJ1NBTUUnID8gMSA6IDA7XG4gICAgY29uc3QgYmF0Y2hTaXplID0gY29udkluZm8uYmF0Y2hTaXplO1xuICAgIGNvbnN0IGluSGVpZ2h0ID0gY29udkluZm8uaW5IZWlnaHQ7XG4gICAgY29uc3QgaW5XaWR0aCA9IGNvbnZJbmZvLmluV2lkdGg7XG4gICAgaWYgKGRhdGFGb3JtYXQgIT09ICdOSFdDJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHdhc20gYmFja2VuZCBGdXNlZENvbnYyRCBkb2VzIG5vdCBzdXBwb3J0IGRhdGFGb3JtYXQ6J2AgK1xuICAgICAgICAgICAgYCR7ZGF0YUZvcm1hdH0nLiBQbGVhc2UgdXNlICdOSFdDJy5gKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KGNvbnZJbmZvLm91dFNoYXBlLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IHByZWx1QWN0aXZhdGlvbldlaWdodHNJZCA9IHByZWx1QWN0aXZhdGlvbldlaWdodHMgPT0gbnVsbCA/XG4gICAgICAgIDAgOlxuICAgICAgICBiYWNrZW5kLmRhdGFJZE1hcC5nZXQocHJlbHVBY3RpdmF0aW9uV2VpZ2h0cy5kYXRhSWQpLmlkO1xuICAgIHdhc21GdXNlZENvbnYyZCh4SWQsIGJhdGNoU2l6ZSwgaW5IZWlnaHQsIGluV2lkdGgsIGZpbHRlcklkLCBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBiaWFzSWQsIHBhZFRvcCwgcGFkUmlnaHQsIHBhZEJvdHRvbSwgcGFkTGVmdCwgaXNTYW1lUGFkLCBkaWxhdGlvbkhlaWdodCwgZGlsYXRpb25XaWR0aCwgc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aCwgaW5wdXRDaGFubmVscywgb3V0cHV0Q2hhbm5lbHMsIGZ1c2VkQWN0aXZhdGlvbiwgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0c0lkLCBsZWFreXJlbHVBbHBoYSB8fCAwLCBvdXRJZCk7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBmdXNlZENvbnYyRENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBGdXNlZENvbnYyRCxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogZnVzZWRDb252MmRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GdXNlZENvbnYyRC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIEZ1c2VkRGVwdGh3aXNlQ29udjJEIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IEZ1c2FibGVBY3RpdmF0aW9uIH0gZnJvbSAnLi90eXBlcyc7XG5sZXQgd2FzbUZ1c2VkRGVwdGh3aXNlQ29udjJkO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21GdXNlZERlcHRod2lzZUNvbnYyZCA9XG4gICAgICAgIGJhY2tlbmQud2FzbS5jd3JhcChGdXNlZERlcHRod2lzZUNvbnYyRCwgbnVsbCAvKiB2b2lkICovLCBbXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICBdKTtcbn1cbmZ1bmN0aW9uIGZ1c2VkRGVwdGh3aXNlQ29udjJkKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYXR0cnMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4LCBmaWx0ZXIsIGJpYXMsIHByZWx1QWN0aXZhdGlvbldlaWdodHMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHN0cmlkZXMsIHBhZCwgZGlsYXRpb25zLCBkYXRhRm9ybWF0LCBkaW1Sb3VuZGluZ01vZGUsIGFjdGl2YXRpb24sIGxlYWt5cmVsdUFscGhhIH0gPSBhdHRycztcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyh4LnNoYXBlLCBmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIHRydWUgLyogZGVwdGh3aXNlICovKTtcbiAgICBjb25zdCBmdXNlZEFjdGl2YXRpb24gPSBGdXNhYmxlQWN0aXZhdGlvblthY3RpdmF0aW9uXTtcbiAgICBpZiAoZnVzZWRBY3RpdmF0aW9uID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2FjdGl2YXRpb259IGFjdGl2YXRpb24gbm90IHlldCBzdXBwb3J0ZWQgZm9yIEZ1c2VkRGVwdGh3aXNlQ29udjJEIGAgK1xuICAgICAgICAgICAgYGluIHRoZSB3YXNtIGJhY2tlbmQuYCk7XG4gICAgfVxuICAgIGNvbnN0IHhJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh4LmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgZmlsdGVySWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoZmlsdGVyLmRhdGFJZCkuaWQ7XG4gICAgY29uc3Qgb3V0cHV0Q2hhbm5lbHMgPSBjb252SW5mby5vdXRDaGFubmVscztcbiAgICBsZXQgYmlhc0lkID0gMDtcbiAgICBpZiAoYmlhcyAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGJpYXNEYXRhID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGJpYXMuZGF0YUlkKTtcbiAgICAgICAgaWYgKGJpYXNEYXRhLnNoYXBlLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGdXNlZERlcHRod2lzZUNvbnYyRCBvbmx5IHN1cHBvcnRzIHJhbmstMSBiaWFzIGJ1dCBnb3QgYCArXG4gICAgICAgICAgICAgICAgYHJhbmsgJHtiaWFzRGF0YS5zaGFwZS5sZW5ndGh9LmApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiaWFzRGF0YS5zaGFwZVswXSAhPT0gb3V0cHV0Q2hhbm5lbHMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRnVzZWREZXB0aHdpc2VDb252MkQgYmlhcyBzaGFwZSAoJHtiaWFzRGF0YS5zaGFwZX0pIGRvZXMgbm90IGAgK1xuICAgICAgICAgICAgICAgIGBtYXRjaCB0aGUgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscyAoJHtvdXRwdXRDaGFubmVsc30pYCk7XG4gICAgICAgIH1cbiAgICAgICAgYmlhc0lkID0gYmlhc0RhdGEuaWQ7XG4gICAgfVxuICAgIGNvbnN0IGZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmZpbHRlckhlaWdodDtcbiAgICBjb25zdCBmaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmZpbHRlcldpZHRoO1xuICAgIGNvbnN0IHBhZFRvcCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IHBhZFJpZ2h0ID0gY29udkluZm8ucGFkSW5mby5yaWdodDtcbiAgICBjb25zdCBwYWRCb3R0b20gPSBjb252SW5mby5wYWRJbmZvLmJvdHRvbTtcbiAgICBjb25zdCBwYWRMZWZ0ID0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgIGNvbnN0IGRpbGF0aW9uSGVpZ2h0ID0gY29udkluZm8uZGlsYXRpb25IZWlnaHQ7XG4gICAgY29uc3QgZGlsYXRpb25XaWR0aCA9IGNvbnZJbmZvLmRpbGF0aW9uV2lkdGg7XG4gICAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgY29uc3QgaW5wdXRDaGFubmVscyA9IGNvbnZJbmZvLmluQ2hhbm5lbHM7XG4gICAgY29uc3QgaXNTYW1lUGFkID0gY29udkluZm8ucGFkSW5mby50eXBlID09PSAnU0FNRScgPyAxIDogMDtcbiAgICBjb25zdCBiYXRjaFNpemUgPSBjb252SW5mby5iYXRjaFNpemU7XG4gICAgY29uc3QgaW5IZWlnaHQgPSBjb252SW5mby5pbkhlaWdodDtcbiAgICBjb25zdCBpbldpZHRoID0gY29udkluZm8uaW5XaWR0aDtcbiAgICBpZiAoZGF0YUZvcm1hdCAhPT0gJ05IV0MnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgd2FzbSBiYWNrZW5kIEZ1c2VkRGVwdGh3aXNlQ29udjJEIGRvZXMgbm90IHN1cHBvcnQgZGF0YUZvcm1hdDonYCArXG4gICAgICAgICAgICBgJHtkYXRhRm9ybWF0fScuIFBsZWFzZSB1c2UgJ05IV0MnLmApO1xuICAgIH1cbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoY29udkluZm8ub3V0U2hhcGUsICdmbG9hdDMyJyk7XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0c0lkID0gcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyA9PSBudWxsID9cbiAgICAgICAgMCA6XG4gICAgICAgIGJhY2tlbmQuZGF0YUlkTWFwLmdldChwcmVsdUFjdGl2YXRpb25XZWlnaHRzLmRhdGFJZCkuaWQ7XG4gICAgd2FzbUZ1c2VkRGVwdGh3aXNlQ29udjJkKHhJZCwgYmF0Y2hTaXplLCBpbkhlaWdodCwgaW5XaWR0aCwgZmlsdGVySWQsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGJpYXNJZCwgcGFkVG9wLCBwYWRSaWdodCwgcGFkQm90dG9tLCBwYWRMZWZ0LCBpc1NhbWVQYWQsIGRpbGF0aW9uSGVpZ2h0LCBkaWxhdGlvbldpZHRoLCBzdHJpZGVIZWlnaHQsIHN0cmlkZVdpZHRoLCBpbnB1dENoYW5uZWxzLCBvdXRwdXRDaGFubmVscywgZnVzZWRBY3RpdmF0aW9uLCBwcmVsdUFjdGl2YXRpb25XZWlnaHRzSWQsIGxlYWt5cmVsdUFscGhhIHx8IDAsIG91dElkKTtcbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IGZ1c2VkRGVwdGh3aXNlQ29udjJEQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEZ1c2VkRGVwdGh3aXNlQ29udjJELFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiBmdXNlZERlcHRod2lzZUNvbnYyZFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZ1c2VkRGVwdGh3aXNlQ29udjJELmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGdhdGhlcl91dGlsLCBHYXRoZXJOZCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBDcHBEVHlwZSB9IGZyb20gJy4vdHlwZXMnO1xubGV0IHdhc21HYXRoZXJOZDtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtR2F0aGVyTmQgPSBiYWNrZW5kLndhc20uY3dyYXAoR2F0aGVyTmQsIG51bGwgLyp2b2lkKi8sIFtcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgJ251bWJlcicgLy8gb3V0SWRcbiAgICBdKTtcbn1cbmZ1bmN0aW9uIGdhdGhlck5kKGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGlucHV0cyB9ID0gYXJncztcbiAgICBjb25zdCB7IHBhcmFtcywgaW5kaWNlcyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IFtyZXN1bHRTaGFwZSwgbnVtU2xpY2VzLCBzbGljZVNpemUsIHN0cmlkZXNdID0gZ2F0aGVyX3V0aWwucHJlcGFyZUFuZFZhbGlkYXRlKHBhcmFtcywgaW5kaWNlcyk7XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KHJlc3VsdFNoYXBlLCBwYXJhbXMuZHR5cGUpO1xuICAgIGlmIChudW1TbGljZXMgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG4gICAgY29uc3QgaW5kaWNlc1NoYXBlID0gaW5kaWNlcy5zaGFwZTtcbiAgICBjb25zdCBzbGljZVJhbmsgPSBpbmRpY2VzU2hhcGVbaW5kaWNlc1NoYXBlLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IHhEYXRhID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHBhcmFtcy5kYXRhSWQpO1xuICAgIGNvbnN0IHhJZCA9IHhEYXRhLmlkO1xuICAgIGNvbnN0IGluZGljZXNEYXRhID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGluZGljZXMuZGF0YUlkKTtcbiAgICBjb25zdCBpbmRpY2VzSWQgPSBpbmRpY2VzRGF0YS5pZDtcbiAgICBjb25zdCBzdHJpZGVzQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheShzdHJpZGVzKS5idWZmZXIpO1xuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIHdhc21HYXRoZXJOZCh4SWQsIENwcERUeXBlW3BhcmFtcy5kdHlwZV0sIGluZGljZXNJZCwgbnVtU2xpY2VzLCBzbGljZVJhbmssIHNsaWNlU2l6ZSwgc3RyaWRlc0J5dGVzLCBvdXRJZCk7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBnYXRoZXJOZENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBHYXRoZXJOZCxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogZ2F0aGVyTmRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1HYXRoZXJOZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIEdhdGhlclYyLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHsgQ3BwRFR5cGUgfSBmcm9tICcuL3R5cGVzJztcbmxldCB3YXNtR2F0aGVyO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21HYXRoZXIgPSBiYWNrZW5kLndhc20uY3dyYXAoJ0dhdGhlcicsIG51bGwgLyp2b2lkKi8sIFtcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnbnVtYmVyJyAvLyBvdXRJZFxuICAgIF0pO1xufVxuZnVuY3Rpb24gZ2F0aGVyVjIoYXJncykge1xuICAgIGNvbnN0IHsgYmFja2VuZCwgaW5wdXRzLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHgsIGluZGljZXMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGF4aXMsIGJhdGNoRGltcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgcGFyc2VkQXhpcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSlbMF07XG4gICAgY29uc3Qgc2hhcGVJbmZvID0gYmFja2VuZF91dGlsLnNlZ21lbnRfdXRpbC5jb2xsZWN0R2F0aGVyT3BTaGFwZUluZm8oeCwgaW5kaWNlcywgcGFyc2VkQXhpcywgYmF0Y2hEaW1zKTtcbiAgICBjb25zdCBmbGF0dGVuWCA9IHJlc2hhcGUoe1xuICAgICAgICBpbnB1dHM6IHsgeCB9LFxuICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgc2hhcGU6IFtcbiAgICAgICAgICAgICAgICBzaGFwZUluZm8uYmF0Y2hTaXplLCBzaGFwZUluZm8ub3V0ZXJTaXplLCBzaGFwZUluZm8uZGltU2l6ZSxcbiAgICAgICAgICAgICAgICBzaGFwZUluZm8uc2xpY2VTaXplXG4gICAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIGJhY2tlbmRcbiAgICB9KTtcbiAgICBjb25zdCBpbmRpY2VzU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShpbmRpY2VzLnNoYXBlKTtcbiAgICBjb25zdCBmbGF0dGVuSW5kZXggPSByZXNoYXBlKHtcbiAgICAgICAgaW5wdXRzOiB7IHg6IGluZGljZXMgfSxcbiAgICAgICAgYXR0cnM6IHsgc2hhcGU6IFtzaGFwZUluZm8uYmF0Y2hTaXplLCBpbmRpY2VzU2l6ZSAvIHNoYXBlSW5mby5iYXRjaFNpemVdIH0sXG4gICAgICAgIGJhY2tlbmRcbiAgICB9KTtcbiAgICBjb25zdCBmbGF0dGVuT3V0cHV0U2hhcGUgPSBbXG4gICAgICAgIHNoYXBlSW5mby5iYXRjaFNpemUsIHNoYXBlSW5mby5vdXRlclNpemUsIGluZGljZXNTaXplIC8gc2hhcGVJbmZvLmJhdGNoU2l6ZSxcbiAgICAgICAgc2hhcGVJbmZvLnNsaWNlU2l6ZVxuICAgIF07XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KGZsYXR0ZW5PdXRwdXRTaGFwZSwgeC5kdHlwZSk7XG4gICAgaWYgKHV0aWwuc2l6ZUZyb21TaGFwZSh4LnNoYXBlKSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cbiAgICBjb25zdCBzdHJpZGVzU2l6ZSA9IGZsYXR0ZW5YLnNoYXBlLmxlbmd0aCAtIDE7XG4gICAgY29uc3QgeERhdGEgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoZmxhdHRlblguZGF0YUlkKTtcbiAgICBjb25zdCB4SWQgPSB4RGF0YS5pZDtcbiAgICBjb25zdCBpbmRpY2VzRGF0YSA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChmbGF0dGVuSW5kZXguZGF0YUlkKTtcbiAgICBjb25zdCBpbmRpY2VzSWQgPSBpbmRpY2VzRGF0YS5pZDtcbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICBjb25zdCB4U3RyaWRlc0J5dGVzID0gbmV3IFVpbnQ4QXJyYXkobmV3IEludDMyQXJyYXkodXRpbC5jb21wdXRlU3RyaWRlcyhmbGF0dGVuWC5zaGFwZSkpLmJ1ZmZlcik7XG4gICAgY29uc3Qgb3V0U3RyaWRlc0J5dGVzID0gbmV3IFVpbnQ4QXJyYXkobmV3IEludDMyQXJyYXkodXRpbC5jb21wdXRlU3RyaWRlcyhmbGF0dGVuT3V0cHV0U2hhcGUpKS5idWZmZXIpO1xuICAgIHdhc21HYXRoZXIoeElkLCBDcHBEVHlwZVt4LmR0eXBlXSwgeFN0cmlkZXNCeXRlcywgc3RyaWRlc1NpemUsIGluZGljZXNJZCwgc2hhcGVJbmZvLmJhdGNoU2l6ZSwgb3V0U3RyaWRlc0J5dGVzLCBvdXRJZCk7XG4gICAgYmFja2VuZC5kaXNwb3NlRGF0YShmbGF0dGVuWC5kYXRhSWQpO1xuICAgIGJhY2tlbmQuZGlzcG9zZURhdGEoZmxhdHRlbkluZGV4LmRhdGFJZCk7XG4gICAgLy8gcmVzaGFwZVxuICAgIG91dC5zaGFwZSA9IHNoYXBlSW5mby5vdXRwdXRTaGFwZTtcbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IGdhdGhlclYyQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEdhdGhlclYyLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiBnYXRoZXJWMlxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUdhdGhlclYyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEdyZWF0ZXIgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi9iaW5hcnlfa2VybmVsJztcbmNvbnN0IHN1cHBvcnRzRnVsbEJyb2FkY2FzdCA9IGZhbHNlO1xuZXhwb3J0IGNvbnN0IGdyZWF0ZXJDb25maWcgPSBjcmVhdGVCaW5hcnlLZXJuZWxDb25maWcoR3JlYXRlciwgc3VwcG9ydHNGdWxsQnJvYWRjYXN0LCAnYm9vbCcpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9R3JlYXRlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBHcmVhdGVyRXF1YWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi9iaW5hcnlfa2VybmVsJztcbmNvbnN0IHN1cHBvcnRzRnVsbEJyb2FkY2FzdCA9IGZhbHNlO1xuZXhwb3J0IGNvbnN0IGdyZWF0ZXJFcXVhbENvbmZpZyA9IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyhHcmVhdGVyRXF1YWwsIHN1cHBvcnRzRnVsbEJyb2FkY2FzdCwgJ2Jvb2wnKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUdyZWF0ZXJFcXVhbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBJZGVudGl0eSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHkoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoeC5zaGFwZSwgeC5kdHlwZSk7XG4gICAgY29uc3QgaW5WYWxzID0gYmFja2VuZC50eXBlZEFycmF5RnJvbUhlYXAoeCk7XG4gICAgY29uc3Qgb3V0VmFscyA9IGJhY2tlbmQudHlwZWRBcnJheUZyb21IZWFwKG91dCk7XG4gICAgb3V0VmFscy5zZXQoaW5WYWxzKTtcbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IGlkZW50aXR5Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IElkZW50aXR5LFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAga2VybmVsRnVuYzogaWRlbnRpdHksXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SWRlbnRpdHkuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTGVha3lSZWx1LCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmxldCB3YXNtRnVuYztcbmZ1bmN0aW9uIHNldHVwRnVuYyhiYWNrZW5kKSB7XG4gICAgd2FzbUZ1bmMgPSBiYWNrZW5kLndhc20uY3dyYXAoTGVha3lSZWx1LCBudWxsIC8qIHZvaWQgKi8sIFtcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyAvLyBvdXRfaWRcbiAgICBdKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBsZWFreVJlbHUoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzOiB7IHggfSwgYXR0cnM6IHsgYWxwaGEgfSwgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB4SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dCh4LnNoYXBlLCB4LmR0eXBlKTtcbiAgICBpZiAodXRpbC5zaXplRnJvbVNoYXBlKHguc2hhcGUpICE9PSAwKSB7XG4gICAgICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgICAgICB3YXNtRnVuYyh4SWQsIGFscGhhLCBvdXRJZCk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgbGVha3lSZWx1Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IExlYWt5UmVsdSxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYyxcbiAgICBrZXJuZWxGdW5jOiBsZWFreVJlbHUsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TGVha3lSZWx1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IExlc3MgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi9iaW5hcnlfa2VybmVsJztcbmNvbnN0IHN1cHBvcnRzRnVsbEJyb2FkY2FzdCA9IGZhbHNlO1xuZXhwb3J0IGNvbnN0IGxlc3NDb25maWcgPSBjcmVhdGVCaW5hcnlLZXJuZWxDb25maWcoTGVzcywgc3VwcG9ydHNGdWxsQnJvYWRjYXN0LCAnYm9vbCcpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TGVzcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBMZXNzRXF1YWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi9iaW5hcnlfa2VybmVsJztcbmNvbnN0IHN1cHBvcnRzRnVsbEJyb2FkY2FzdCA9IGZhbHNlO1xuZXhwb3J0IGNvbnN0IGxlc3NFcXVhbENvbmZpZyA9IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyhMZXNzRXF1YWwsIHN1cHBvcnRzRnVsbEJyb2FkY2FzdCwgJ2Jvb2wnKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxlc3NFcXVhbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBMb2cgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlVW5hcnlLZXJuZWxDb25maWcgfSBmcm9tICcuL3VuYXJ5X2tlcm5lbCc7XG5leHBvcnQgY29uc3QgbG9nQ29uZmlnID0gY3JlYXRlVW5hcnlLZXJuZWxDb25maWcoTG9nKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxvZy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBMb2dpY2FsQW5kIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vYmluYXJ5X2tlcm5lbCc7XG5jb25zdCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QgPSBmYWxzZTtcbmV4cG9ydCBjb25zdCBsb2dpY2FsQW5kQ29uZmlnID0gY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnKExvZ2ljYWxBbmQsIHN1cHBvcnRzRnVsbEJyb2FkY2FzdCwgJ2Jvb2wnKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxvZ2ljYWxBbmQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IE1heCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBwZXJtdXRlQXhlc0FuZFRyYW5zcG9zZSB9IGZyb20gJy4va2VybmVsX3V0aWxzJztcbmxldCB3YXNtTWF4O1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21NYXggPSBiYWNrZW5kLndhc20uY3dyYXAoTWF4LCBudWxsIC8qdm9pZCovLCBbJ251bWJlciwgbnVtYmVyLCBudW1iZXInXSk7XG59XG5mdW5jdGlvbiBtYXgoYXJncykge1xuICAgIGNvbnN0IHsgYmFja2VuZCwgaW5wdXRzLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHJlZHVjdGlvbkluZGljZXM6IGF4aXMsIGtlZXBEaW1zIH0gPSBhdHRycztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB4SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeC5kYXRhSWQpLmlkO1xuICAgIGxldCBpbnB1dElkID0geElkO1xuICAgIGxldCBpbnB1dCA9IHg7XG4gICAgY29uc3QgeyB0cmFuc3Bvc2VkLCBheGVzLCBvcmlnaW5hbEF4ZXMsIGlucHV0V2FzVHJhbnNwb3NlZCB9ID0gcGVybXV0ZUF4ZXNBbmRUcmFuc3Bvc2UoeCwgYXhpcywgYmFja2VuZCk7XG4gICAgaWYgKGlucHV0V2FzVHJhbnNwb3NlZCkge1xuICAgICAgICBjb25zdCB0cmFuc3Bvc2VkSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQodHJhbnNwb3NlZC5kYXRhSWQpLmlkO1xuICAgICAgICBpbnB1dCA9IHRyYW5zcG9zZWQ7XG4gICAgICAgIGlucHV0SWQgPSB0cmFuc3Bvc2VkSWQ7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0UmFuayA9IGlucHV0LnNoYXBlLmxlbmd0aDtcbiAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoJ21heCcsIGF4ZXMsIGlucHV0UmFuayk7XG4gICAgY29uc3QgW291dFNoYXBlLCByZWR1Y2VTaGFwZV0gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcyhpbnB1dC5zaGFwZSwgYXhlcyk7XG4gICAgY29uc3QgcmVkdWNlU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShyZWR1Y2VTaGFwZSk7XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KG91dFNoYXBlLCB4LmR0eXBlKTtcbiAgICBpZiAodXRpbC5zaXplRnJvbVNoYXBlKGlucHV0LnNoYXBlKSAhPT0gMCkge1xuICAgICAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICAgICAgd2FzbU1heChpbnB1dElkLCByZWR1Y2VTaXplLCBvdXRJZCk7XG4gICAgfVxuICAgIGlmIChpbnB1dFdhc1RyYW5zcG9zZWQpIHtcbiAgICAgICAgLy8gZGlzcG9zZSBvZiB0aGUgdHJhbnNwb3NlZCB0ZW5zb3IuXG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZURhdGEodHJhbnNwb3NlZC5kYXRhSWQpO1xuICAgIH1cbiAgICBpZiAoa2VlcERpbXMpIHtcbiAgICAgICAgLy8gcmVzaGFwZVxuICAgICAgICBjb25zdCBuZXdTaGFwZSA9IGJhY2tlbmRfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbShvdXQuc2hhcGUsIG9yaWdpbmFsQXhlcyk7XG4gICAgICAgIG91dC5zaGFwZSA9IG5ld1NoYXBlO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IG1heENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBNYXgsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IG1heFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1heC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIE1heFBvb2wgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xubGV0IHdhc21NYXhQb29sO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21NYXhQb29sID0gYmFja2VuZC53YXNtLmN3cmFwKE1heFBvb2wsIG51bGwgLyogdm9pZCAqLywgW1xuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgXSk7XG59XG5mdW5jdGlvbiBtYXhQb29sKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYXR0cnMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeCA9IGlucHV0cy54O1xuICAgIGNvbnN0IHhJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh4LmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgeyBmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSB9ID0gYXR0cnM7XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wyREluZm8oeC5zaGFwZSwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgMSAvKiBkaWxhdGlvbnMgKi8sIHBhZCwgZGltUm91bmRpbmdNb2RlKTtcbiAgICBjb25zdCBmaWx0ZXJIZWlnaHQgPSBjb252SW5mby5maWx0ZXJIZWlnaHQ7XG4gICAgY29uc3QgZmlsdGVyV2lkdGggPSBjb252SW5mby5maWx0ZXJXaWR0aDtcbiAgICBjb25zdCBwYWRUb3AgPSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICBjb25zdCBwYWRSaWdodCA9IGNvbnZJbmZvLnBhZEluZm8ucmlnaHQ7XG4gICAgY29uc3QgcGFkQm90dG9tID0gY29udkluZm8ucGFkSW5mby5ib3R0b207XG4gICAgY29uc3QgcGFkTGVmdCA9IGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICAgIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICAgIGNvbnN0IGlucHV0Q2hhbm5lbHMgPSBjb252SW5mby5pbkNoYW5uZWxzO1xuICAgIGNvbnN0IG91dHB1dENoYW5uZWxzID0gY29udkluZm8ub3V0Q2hhbm5lbHM7XG4gICAgaWYgKGNvbnZJbmZvLmRhdGFGb3JtYXQgIT09ICdjaGFubmVsc0xhc3QnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgd2FzbSBiYWNrZW5kIGRvZXMgbm90IHN1cHBvcnQgZGF0YUZvcm1hdDonYCArXG4gICAgICAgICAgICBgJHtjb252SW5mby5kYXRhRm9ybWF0fScuIFBsZWFzZSB1c2UgJ2NoYW5uZWxzTGFzdCcuYCk7XG4gICAgfVxuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChjb252SW5mby5vdXRTaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICB3YXNtTWF4UG9vbCh4SWQsIHguc2hhcGVbMF0sIHguc2hhcGVbMV0sIHguc2hhcGVbMl0sIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIHBhZFRvcCwgcGFkUmlnaHQsIHBhZEJvdHRvbSwgcGFkTGVmdCwgZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGgsIHN0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGgsIGlucHV0Q2hhbm5lbHMsIG91dHB1dENoYW5uZWxzLCBvdXRJZCk7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBtYXhQb29sQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE1heFBvb2wsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IG1heFBvb2xcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NYXhQb29sLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IE1heGltdW0gfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi9iaW5hcnlfa2VybmVsJztcbmNvbnN0IHN1cHBvcnRzRnVsbEJyb2FkY2FzdCA9IGZhbHNlO1xuZXhwb3J0IGNvbnN0IG1heGltdW1Db25maWcgPSBjcmVhdGVCaW5hcnlLZXJuZWxDb25maWcoTWF4aW11bSwgc3VwcG9ydHNGdWxsQnJvYWRjYXN0KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1heGltdW0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBNZWFuLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNhc3QgfSBmcm9tICcuL0Nhc3QnO1xuaW1wb3J0IHsgcGVybXV0ZUF4ZXNBbmRUcmFuc3Bvc2UgfSBmcm9tICcuL2tlcm5lbF91dGlscyc7XG5sZXQgd2FzbU1lYW47XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbU1lYW4gPVxuICAgICAgICBiYWNrZW5kLndhc20uY3dyYXAoTWVhbiwgbnVsbCAvKnZvaWQqLywgWydudW1iZXIsIG51bWJlciwgbnVtYmVyJ10pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG1lYW4oYXJncykge1xuICAgIGNvbnN0IHsgYmFja2VuZCwgaW5wdXRzLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGF4aXMsIGtlZXBEaW1zIH0gPSBhdHRycztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB4SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeC5kYXRhSWQpLmlkO1xuICAgIGxldCBpbnB1dElkID0geElkO1xuICAgIGxldCBpbnB1dCA9IHg7XG4gICAgY29uc3QgeyB0cmFuc3Bvc2VkLCBheGVzLCBvcmlnaW5hbEF4ZXMsIGlucHV0V2FzVHJhbnNwb3NlZCB9ID0gcGVybXV0ZUF4ZXNBbmRUcmFuc3Bvc2UoeCwgYXhpcywgYmFja2VuZCk7XG4gICAgbGV0IHJlZHVjdGlvbkF4ZXMgPSBheGVzO1xuICAgIGlmIChpbnB1dFdhc1RyYW5zcG9zZWQpIHtcbiAgICAgICAgY29uc3QgdHJhbnNwb3NlZElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHRyYW5zcG9zZWQuZGF0YUlkKS5pZDtcbiAgICAgICAgaWYgKHRyYW5zcG9zZWRJZCAhPT0geElkKSB7XG4gICAgICAgICAgICAvLyB0cmFuc3Bvc2Ugd2FzIG5vdCBhIG5vLW9wLiBXZSB3aWxsIG5lZWQgdG8gZGlzcG9zZSBvZiB0aGlzXG4gICAgICAgICAgICAvLyBvbmNlIHdlIGFyZSBkb25lLlxuICAgICAgICAgICAgaW5wdXQgPSB0cmFuc3Bvc2VkO1xuICAgICAgICAgICAgaW5wdXRJZCA9IHRyYW5zcG9zZWRJZDtcbiAgICAgICAgICAgIHJlZHVjdGlvbkF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0SW5uZXJNb3N0QXhlcyhyZWR1Y3Rpb25BeGVzLmxlbmd0aCwgaW5wdXQuc2hhcGUubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoJ21lYW4nLCByZWR1Y3Rpb25BeGVzLCBpbnB1dC5zaGFwZS5sZW5ndGgpO1xuICAgIGNvbnN0IFtvdXRTaGFwZSwgcmVkdWNlU2hhcGVdID0gYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMoaW5wdXQuc2hhcGUsIHJlZHVjdGlvbkF4ZXMpO1xuICAgIGNvbnN0IHJlZHVjZVNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuICAgIGxldCBjYXN0ZWRJbnB1dCA9IGlucHV0O1xuICAgIGlmIChpbnB1dC5kdHlwZSAhPT0gJ2Zsb2F0MzInKSB7XG4gICAgICAgIGNhc3RlZElucHV0ID1cbiAgICAgICAgICAgIGNhc3QoeyBiYWNrZW5kLCBpbnB1dHM6IHsgeDogaW5wdXQgfSwgYXR0cnM6IHsgZHR5cGU6ICdmbG9hdDMyJyB9IH0pO1xuICAgICAgICBpbnB1dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGNhc3RlZElucHV0LmRhdGFJZCkuaWQ7XG4gICAgfVxuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChvdXRTaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICBpZiAodXRpbC5zaXplRnJvbVNoYXBlKGlucHV0LnNoYXBlKSAhPT0gMCkge1xuICAgICAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICAgICAgd2FzbU1lYW4oaW5wdXRJZCwgcmVkdWNlU2l6ZSwgb3V0SWQpO1xuICAgIH1cbiAgICBpZiAoaW5wdXRXYXNUcmFuc3Bvc2VkKSB7XG4gICAgICAgIC8vIGRpc3Bvc2Ugb2YgdGhlIHRyYW5zcG9zZWQgdGVuc29yLlxuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VEYXRhKHRyYW5zcG9zZWQuZGF0YUlkKTtcbiAgICB9XG4gICAgaWYgKGtlZXBEaW1zKSB7XG4gICAgICAgIC8vIHJlc2hhcGVcbiAgICAgICAgY29uc3QgbmV3U2hhcGUgPSBiYWNrZW5kX3V0aWwuZXhwYW5kU2hhcGVUb0tlZXBEaW0ob3V0LnNoYXBlLCBvcmlnaW5hbEF4ZXMpO1xuICAgICAgICBvdXQuc2hhcGUgPSBuZXdTaGFwZTtcbiAgICB9XG4gICAgaWYgKGlucHV0LmR0eXBlICE9PSAnZmxvYXQzMicpIHtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlRGF0YShjYXN0ZWRJbnB1dC5kYXRhSWQpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IG1lYW5Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTWVhbixcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogbWVhblxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1lYW4uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBNaW4sIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgcGVybXV0ZUF4ZXNBbmRUcmFuc3Bvc2UgfSBmcm9tICcuL2tlcm5lbF91dGlscyc7XG5sZXQgd2FzbU1pbjtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtTWluID0gYmFja2VuZC53YXNtLmN3cmFwKE1pbiwgbnVsbCAvKnZvaWQqLywgWydudW1iZXIsIG51bWJlciwgbnVtYmVyJ10pO1xufVxuZnVuY3Rpb24gbWluKGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGlucHV0cywgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBheGlzLCBrZWVwRGltcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHguZGF0YUlkKS5pZDtcbiAgICBsZXQgaW5wdXRJZCA9IHhJZDtcbiAgICBsZXQgaW5wdXQgPSB4O1xuICAgIGNvbnN0IHsgdHJhbnNwb3NlZCwgYXhlcywgb3JpZ2luYWxBeGVzLCBpbnB1dFdhc1RyYW5zcG9zZWQgfSA9IHBlcm11dGVBeGVzQW5kVHJhbnNwb3NlKHgsIGF4aXMsIGJhY2tlbmQpO1xuICAgIGlmIChpbnB1dFdhc1RyYW5zcG9zZWQpIHtcbiAgICAgICAgY29uc3QgdHJhbnNwb3NlZElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHRyYW5zcG9zZWQuZGF0YUlkKS5pZDtcbiAgICAgICAgaWYgKHRyYW5zcG9zZWRJZCAhPT0geElkKSB7XG4gICAgICAgICAgICAvLyB0cmFuc3Bvc2Ugd2FzIG5vdCBhIG5vLW9wLiBXZSB3aWxsIG5lZWQgdG8gZGlzcG9zZSBvZiB0aGlzXG4gICAgICAgICAgICAvLyBvbmNlIHdlIGFyZSBkb25lLlxuICAgICAgICAgICAgaW5wdXQgPSB0cmFuc3Bvc2VkO1xuICAgICAgICAgICAgaW5wdXRJZCA9IHRyYW5zcG9zZWRJZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBpbnB1dFJhbmsgPSBpbnB1dC5zaGFwZS5sZW5ndGg7XG4gICAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdtaW4nLCBheGVzLCBpbnB1dFJhbmspO1xuICAgIGNvbnN0IFtvdXRTaGFwZSwgcmVkdWNlU2hhcGVdID0gYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMoaW5wdXQuc2hhcGUsIGF4ZXMpO1xuICAgIGNvbnN0IHJlZHVjZVNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChvdXRTaGFwZSwgaW5wdXQuZHR5cGUpO1xuICAgIGlmICh1dGlsLnNpemVGcm9tU2hhcGUoaW5wdXQuc2hhcGUpICE9PSAwKSB7XG4gICAgICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgICAgICB3YXNtTWluKGlucHV0SWQsIHJlZHVjZVNpemUsIG91dElkKTtcbiAgICB9XG4gICAgaWYgKGlucHV0V2FzVHJhbnNwb3NlZCkge1xuICAgICAgICAvLyBkaXNwb3NlIG9mIHRoZSB0cmFuc3Bvc2VkIHRlbnNvci5cbiAgICAgICAgYmFja2VuZC5kaXNwb3NlRGF0YSh0cmFuc3Bvc2VkLmRhdGFJZCk7XG4gICAgfVxuICAgIGlmIChrZWVwRGltcykge1xuICAgICAgICAvLyByZXNoYXBlXG4gICAgICAgIGNvbnN0IG5ld1NoYXBlID0gYmFja2VuZF91dGlsLmV4cGFuZFNoYXBlVG9LZWVwRGltKG91dC5zaGFwZSwgb3JpZ2luYWxBeGVzKTtcbiAgICAgICAgb3V0LnNoYXBlID0gbmV3U2hhcGU7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgbWluQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE1pbixcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogbWluXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWluLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IE1pbmltdW0gfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi9iaW5hcnlfa2VybmVsJztcbmNvbnN0IHN1cHBvcnRzRnVsbEJyb2FkY2FzdCA9IGZhbHNlO1xuZXhwb3J0IGNvbnN0IG1pbmltdW1Db25maWcgPSBjcmVhdGVCaW5hcnlLZXJuZWxDb25maWcoTWluaW11bSwgc3VwcG9ydHNGdWxsQnJvYWRjYXN0KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1pbmltdW0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTWlycm9yUGFkIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IENwcERUeXBlIH0gZnJvbSAnLi90eXBlcyc7XG4vLyBNdXN0IG1hdGNoIGVudW0gaW4gTWlycm9yUGFkLmNjXG52YXIgTWlycm9yUGFkZGluZ01vZGU7XG4oZnVuY3Rpb24gKE1pcnJvclBhZGRpbmdNb2RlKSB7XG4gICAgTWlycm9yUGFkZGluZ01vZGVbTWlycm9yUGFkZGluZ01vZGVbXCJyZWZsZWN0XCJdID0gMF0gPSBcInJlZmxlY3RcIjtcbiAgICBNaXJyb3JQYWRkaW5nTW9kZVtNaXJyb3JQYWRkaW5nTW9kZVtcInN5bW1ldHJpY1wiXSA9IDFdID0gXCJzeW1tZXRyaWNcIjtcbn0pKE1pcnJvclBhZGRpbmdNb2RlIHx8IChNaXJyb3JQYWRkaW5nTW9kZSA9IHt9KSk7XG5sZXQgd2FzbU1pcnJvclBhZDtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtTWlycm9yUGFkID0gYmFja2VuZC53YXNtLmN3cmFwKE1pcnJvclBhZCwgbnVsbCAvKiB2b2lkICovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICBdKTtcbn1cbmZ1bmN0aW9uIG1pcnJvclBhZChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kLCBhdHRyczogeyBwYWRkaW5ncywgbW9kZSB9IH0gPSBhcmdzO1xuICAgIGNvbnN0IG91dFNoYXBlID0gcGFkZGluZ3MubWFwKChwLCBpKSA9PiBwWzBdIC8qIGJlZm9yZVBhZCAqLyArIHguc2hhcGVbaV0gKyBwWzFdIC8qIGFmdGVyUGFkICovKTtcbiAgICBjb25zdCB4SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChvdXRTaGFwZSwgeC5kdHlwZSk7XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgeFNoYXBlQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheSh4LnNoYXBlKS5idWZmZXIpO1xuICAgIGNvbnN0IHByZVBhZGRpbmdzRmxhdCA9IHBhZGRpbmdzLm1hcChwYWRUdXBsZSA9PiBwYWRUdXBsZVswXSk7XG4gICAgY29uc3QgcG9zdFBhZGRpbmdzRmxhdCA9IHBhZGRpbmdzLm1hcChwYWRUdXBsZSA9PiBwYWRUdXBsZVsxXSk7XG4gICAgY29uc3QgcHJlUGFkZGluZ3NCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KHByZVBhZGRpbmdzRmxhdCkuYnVmZmVyKTtcbiAgICBjb25zdCBwb3N0UGFkZGluZ3NCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KHBvc3RQYWRkaW5nc0ZsYXQpLmJ1ZmZlcik7XG4gICAgd2FzbU1pcnJvclBhZCh4SWQsIHhTaGFwZUJ5dGVzLCB4LnNoYXBlLmxlbmd0aCwgQ3BwRFR5cGVbeC5kdHlwZV0sIHByZVBhZGRpbmdzQnl0ZXMsIHBvc3RQYWRkaW5nc0J5dGVzLCBNaXJyb3JQYWRkaW5nTW9kZVttb2RlXSwgb3V0SWQpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgbWlycm9yUGFkQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE1pcnJvclBhZCxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIGtlcm5lbEZ1bmM6IG1pcnJvclBhZCxcbiAgICBzZXR1cEZ1bmM6IHNldHVwXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWlycm9yUGFkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IE11bHRpcGx5IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vYmluYXJ5X2tlcm5lbCc7XG5jb25zdCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QgPSB0cnVlO1xuZXhwb3J0IGNvbnN0IG11bHRpcGx5Q29uZmlnID0gY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnKE11bHRpcGx5LCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TXVsdGlwbHkuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTmVnIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi91bmFyeV9rZXJuZWwnO1xuZXhwb3J0IGNvbnN0IG5lZ0NvbmZpZyA9IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnKE5lZyk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1OZWcuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTm9uTWF4U3VwcHJlc3Npb25WMyB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBwYXJzZVJlc3VsdFN0cnVjdCB9IGZyb20gJy4vTm9uTWF4U3VwcHJlc3Npb25fdXRpbCc7XG5sZXQgd2FzbUZ1bmM7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbUZ1bmMgPSBiYWNrZW5kLndhc20uY3dyYXAoTm9uTWF4U3VwcHJlc3Npb25WMywgJ251bWJlcicsIC8vIFJlc3VsdCpcbiAgICBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICBdKTtcbn1cbmZ1bmN0aW9uIGtlcm5lbEZ1bmMoYXJncykge1xuICAgIGNvbnN0IHsgYmFja2VuZCwgaW5wdXRzLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGlvdVRocmVzaG9sZCwgbWF4T3V0cHV0U2l6ZSwgc2NvcmVUaHJlc2hvbGQgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHsgYm94ZXMsIHNjb3JlcyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IGJveGVzSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoYm94ZXMuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBzY29yZXNJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChzY29yZXMuZGF0YUlkKS5pZDtcbiAgICBjb25zdCByZXNPZmZzZXQgPSB3YXNtRnVuYyhib3hlc0lkLCBzY29yZXNJZCwgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCk7XG4gICAgY29uc3QgeyBwU2VsZWN0ZWRJbmRpY2VzLCBzZWxlY3RlZFNpemUsIHBTZWxlY3RlZFNjb3JlcywgcFZhbGlkT3V0cHV0cyB9ID0gcGFyc2VSZXN1bHRTdHJ1Y3QoYmFja2VuZCwgcmVzT2Zmc2V0KTtcbiAgICAvLyBTaW5jZSB3ZSBhcmUgbm90IHVzaW5nIHNjb3JlcyBmb3IgVjMsIHdlIGhhdmUgdG8gZGVsZXRlIGl0IGZyb20gdGhlIGhlYXAuXG4gICAgYmFja2VuZC53YXNtLl9mcmVlKHBTZWxlY3RlZFNjb3Jlcyk7XG4gICAgYmFja2VuZC53YXNtLl9mcmVlKHBWYWxpZE91dHB1dHMpO1xuICAgIGNvbnN0IHNlbGVjdGVkSW5kaWNlc1RlbnNvciA9IGJhY2tlbmQubWFrZU91dHB1dChbc2VsZWN0ZWRTaXplXSwgJ2ludDMyJywgcFNlbGVjdGVkSW5kaWNlcyk7XG4gICAgcmV0dXJuIHNlbGVjdGVkSW5kaWNlc1RlbnNvcjtcbn1cbmV4cG9ydCBjb25zdCBub25NYXhTdXBwcmVzc2lvblYzQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE5vbk1heFN1cHByZXNzaW9uVjMsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IGtlcm5lbEZ1bmMsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Tm9uTWF4U3VwcHJlc3Npb25WMy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBOb25NYXhTdXBwcmVzc2lvblY0IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHBhcnNlUmVzdWx0U3RydWN0IH0gZnJvbSAnLi9Ob25NYXhTdXBwcmVzc2lvbl91dGlsJztcbmxldCB3YXNtRnVuYztcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtRnVuYyA9IGJhY2tlbmQud2FzbS5jd3JhcChOb25NYXhTdXBwcmVzc2lvblY0LCAnbnVtYmVyJywgLy8gUmVzdWx0KlxuICAgIFtcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnYm9vbCcsXG4gICAgXSk7XG59XG5mdW5jdGlvbiBub25NYXhTdXBwcmVzc2lvblY0KGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGlucHV0cywgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBpb3VUaHJlc2hvbGQsIG1heE91dHB1dFNpemUsIHNjb3JlVGhyZXNob2xkLCBwYWRUb01heE91dHB1dFNpemUgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHsgYm94ZXMsIHNjb3JlcyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IGJveGVzSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoYm94ZXMuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBzY29yZXNJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChzY29yZXMuZGF0YUlkKS5pZDtcbiAgICBjb25zdCByZXNPZmZzZXQgPSB3YXNtRnVuYyhib3hlc0lkLCBzY29yZXNJZCwgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCwgcGFkVG9NYXhPdXRwdXRTaXplKTtcbiAgICBjb25zdCB7IHBTZWxlY3RlZEluZGljZXMsIHNlbGVjdGVkU2l6ZSwgcFNlbGVjdGVkU2NvcmVzLCBwVmFsaWRPdXRwdXRzIH0gPSBwYXJzZVJlc3VsdFN0cnVjdChiYWNrZW5kLCByZXNPZmZzZXQpO1xuICAgIC8vIFNpbmNlIHdlIGFyZSBub3QgdXNpbmcgc2NvcmVzIGZvciBWNCwgd2UgaGF2ZSB0byBkZWxldGUgaXQgZnJvbSB0aGUgaGVhcC5cbiAgICBiYWNrZW5kLndhc20uX2ZyZWUocFNlbGVjdGVkU2NvcmVzKTtcbiAgICBjb25zdCBzZWxlY3RlZEluZGljZXNUZW5zb3IgPSBiYWNrZW5kLm1ha2VPdXRwdXQoW3NlbGVjdGVkU2l6ZV0sICdpbnQzMicsIHBTZWxlY3RlZEluZGljZXMpO1xuICAgIGNvbnN0IHZhbGlkT3V0cHV0c1RlbnNvciA9IGJhY2tlbmQubWFrZU91dHB1dChbXSwgJ2ludDMyJywgcFZhbGlkT3V0cHV0cyk7XG4gICAgcmV0dXJuIFtzZWxlY3RlZEluZGljZXNUZW5zb3IsIHZhbGlkT3V0cHV0c1RlbnNvcl07XG59XG5leHBvcnQgY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25WNENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBOb25NYXhTdXBwcmVzc2lvblY0LFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiBub25NYXhTdXBwcmVzc2lvblY0LFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5vbk1heFN1cHByZXNzaW9uVjQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTm9uTWF4U3VwcHJlc3Npb25WNSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBwYXJzZVJlc3VsdFN0cnVjdCB9IGZyb20gJy4vTm9uTWF4U3VwcHJlc3Npb25fdXRpbCc7XG5sZXQgd2FzbUZ1bmM7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbUZ1bmMgPSBiYWNrZW5kLndhc20uY3dyYXAoTm9uTWF4U3VwcHJlc3Npb25WNSwgJ251bWJlcicsIC8vIFJlc3VsdCpcbiAgICBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgXSk7XG59XG5mdW5jdGlvbiBrZXJuZWxGdW5jKGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGlucHV0cywgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBpb3VUaHJlc2hvbGQsIG1heE91dHB1dFNpemUsIHNjb3JlVGhyZXNob2xkLCBzb2Z0Tm1zU2lnbWEgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHsgYm94ZXMsIHNjb3JlcyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IGJveGVzSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoYm94ZXMuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBzY29yZXNJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChzY29yZXMuZGF0YUlkKS5pZDtcbiAgICBjb25zdCByZXNPZmZzZXQgPSB3YXNtRnVuYyhib3hlc0lkLCBzY29yZXNJZCwgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCwgc29mdE5tc1NpZ21hKTtcbiAgICBjb25zdCB7IHBTZWxlY3RlZEluZGljZXMsIHNlbGVjdGVkU2l6ZSwgcFNlbGVjdGVkU2NvcmVzLCBwVmFsaWRPdXRwdXRzIH0gPSBwYXJzZVJlc3VsdFN0cnVjdChiYWNrZW5kLCByZXNPZmZzZXQpO1xuICAgIC8vIFNpbmNlIHdlIGFyZSBub3QgdXNpbmcgdmFsaWRPdXRwdXRzIGZvciBWNSwgd2UgaGF2ZSB0byBkZWxldGUgaXQgZnJvbSB0aGVcbiAgICAvLyBoZWFwLlxuICAgIGJhY2tlbmQud2FzbS5fZnJlZShwVmFsaWRPdXRwdXRzKTtcbiAgICBjb25zdCBzZWxlY3RlZEluZGljZXNUZW5zb3IgPSBiYWNrZW5kLm1ha2VPdXRwdXQoW3NlbGVjdGVkU2l6ZV0sICdpbnQzMicsIHBTZWxlY3RlZEluZGljZXMpO1xuICAgIGNvbnN0IHNlbGVjdGVkU2NvcmVzVGVuc29yID0gYmFja2VuZC5tYWtlT3V0cHV0KFtzZWxlY3RlZFNpemVdLCAnZmxvYXQzMicsIHBTZWxlY3RlZFNjb3Jlcyk7XG4gICAgcmV0dXJuIFtzZWxlY3RlZEluZGljZXNUZW5zb3IsIHNlbGVjdGVkU2NvcmVzVGVuc29yXTtcbn1cbmV4cG9ydCBjb25zdCBub25NYXhTdXBwcmVzc2lvblY1Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE5vbk1heFN1cHByZXNzaW9uVjUsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IGtlcm5lbEZ1bmMsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Tm9uTWF4U3VwcHJlc3Npb25WNS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vKipcbiAqIFBhcnNlIHRoZSByZXN1bHQgb2YgdGhlIGMrKyBtZXRob2QsIHdoaWNoIGhhcyB0aGUgc2hhcGUgZXF1aXZhbGVudCB0b1xuICogYFJlc3VsdGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJlc3VsdFN0cnVjdChiYWNrZW5kLCByZXNPZmZzZXQpIHtcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgSW50MzJBcnJheShiYWNrZW5kLndhc20uSEVBUFU4LmJ1ZmZlciwgcmVzT2Zmc2V0LCA0KTtcbiAgICBjb25zdCBwU2VsZWN0ZWRJbmRpY2VzID0gcmVzdWx0WzBdO1xuICAgIGNvbnN0IHNlbGVjdGVkU2l6ZSA9IHJlc3VsdFsxXTtcbiAgICBjb25zdCBwU2VsZWN0ZWRTY29yZXMgPSByZXN1bHRbMl07XG4gICAgY29uc3QgcFZhbGlkT3V0cHV0cyA9IHJlc3VsdFszXTtcbiAgICAvLyBTaW5jZSB0aGUgcmVzdWx0IHdhcyBhbGxvY2F0ZWQgb24gdGhlIGhlYXAsIHdlIGhhdmUgdG8gZGVsZXRlIGl0LlxuICAgIGJhY2tlbmQud2FzbS5fZnJlZShyZXNPZmZzZXQpO1xuICAgIHJldHVybiB7IHBTZWxlY3RlZEluZGljZXMsIHNlbGVjdGVkU2l6ZSwgcFNlbGVjdGVkU2NvcmVzLCBwVmFsaWRPdXRwdXRzIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ob25NYXhTdXBwcmVzc2lvbl91dGlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IE5vdEVxdWFsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vYmluYXJ5X2tlcm5lbCc7XG5jb25zdCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QgPSBmYWxzZTtcbmV4cG9ydCBjb25zdCBub3RFcXVhbENvbmZpZyA9IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyhOb3RFcXVhbCwgc3VwcG9ydHNGdWxsQnJvYWRjYXN0LCAnYm9vbCcpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Tm90RXF1YWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgT25lSG90IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmxldCB3YXNtT25lSG90O1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21PbmVIb3QgPSBiYWNrZW5kLndhc20uY3dyYXAoT25lSG90LCBudWxsIC8qIHZvaWQgKi8sIFtcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInIC8vIG91dF9pZFxuICAgIF0pO1xufVxuZnVuY3Rpb24gb25lSG90KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBpbmRpY2VzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBkZXB0aCwgb25WYWx1ZSwgb2ZmVmFsdWUgfSA9IGF0dHJzO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChbLi4uaW5kaWNlcy5zaGFwZSwgZGVwdGhdLCAnaW50MzInKTtcbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBpbmRpY2VzRGF0YSA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChpbmRpY2VzLmRhdGFJZCk7XG4gICAgY29uc3QgaW5kaWNlc0lkID0gaW5kaWNlc0RhdGEuaWQ7XG4gICAgd2FzbU9uZUhvdChpbmRpY2VzSWQsIGRlcHRoLCBvblZhbHVlLCBvZmZWYWx1ZSwgb3V0SWQpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3Qgb25lSG90Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE9uZUhvdCxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogb25lSG90LFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU9uZUhvdC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBPbmVzTGlrZSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5mdW5jdGlvbiBvbmVzTGlrZShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dCh4LnNoYXBlLCB4LmR0eXBlKTtcbiAgICBjb25zdCBvdXRWYWxzID0gYmFja2VuZC50eXBlZEFycmF5RnJvbUhlYXAob3V0KTtcbiAgICBvdXRWYWxzLmZpbGwoMSk7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBvbmVzTGlrZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBPbmVzTGlrZSxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIGtlcm5lbEZ1bmM6IG9uZXNMaWtlLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU9uZXNMaWtlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFBhY2ssIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY29uY2F0IH0gZnJvbSAnLi9Db25jYXQnO1xuaW1wb3J0IHsgZXhwYW5kRGltcyB9IGZyb20gJy4vRXhwYW5kRGltcyc7XG5leHBvcnQgZnVuY3Rpb24gcGFjayhhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgYXhpcyB9ID0gYXR0cnM7XG4gICAgaWYgKGlucHV0cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGV4cGFuZERpbXMoeyBpbnB1dHM6IHsgaW5wdXQ6IGlucHV0c1swXSB9LCBiYWNrZW5kLCBhdHRyczogeyBkaW06IGF4aXMgfSB9KTtcbiAgICB9XG4gICAgY29uc3Qgc2hhcGUgPSBpbnB1dHNbMF0uc2hhcGU7XG4gICAgY29uc3QgZHR5cGUgPSBpbnB1dHNbMF0uZHR5cGU7XG4gICAgaW5wdXRzLmZvckVhY2godCA9PiB7XG4gICAgICAgIHV0aWwuYXNzZXJ0U2hhcGVzTWF0Y2goc2hhcGUsIHQuc2hhcGUsICdBbGwgdGVuc29ycyBwYXNzZWQgdG8gc3RhY2sgbXVzdCBoYXZlIG1hdGNoaW5nIHNoYXBlcycpO1xuICAgICAgICB1dGlsLmFzc2VydChkdHlwZSA9PT0gdC5kdHlwZSwgKCkgPT4gJ0FsbCB0ZW5zb3JzIHBhc3NlZCB0byBzdGFjayBtdXN0IGhhdmUgbWF0Y2hpbmcgZHR5cGVzJyk7XG4gICAgfSk7XG4gICAgY29uc3QgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MgPSBbXTtcbiAgICBjb25zdCBleHBhbmRlZFRlbnNvcnMgPSBpbnB1dHMubWFwKHQgPT4ge1xuICAgICAgICBjb25zdCBleHBhbmRlZFQgPSBleHBhbmREaW1zKHsgaW5wdXRzOiB7IGlucHV0OiB0IH0sIGJhY2tlbmQsIGF0dHJzOiB7IGRpbTogYXhpcyB9IH0pO1xuICAgICAgICBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcy5wdXNoKGV4cGFuZGVkVCk7XG4gICAgICAgIHJldHVybiBleHBhbmRlZFQ7XG4gICAgfSk7XG4gICAgY29uc3QgcmVzdWx0ID0gY29uY2F0KHsgaW5wdXRzOiBleHBhbmRlZFRlbnNvcnMsIGJhY2tlbmQsIGF0dHJzOiB7IGF4aXMgfSB9KTtcbiAgICBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcy5mb3JFYWNoKHQgPT4gYmFja2VuZC5kaXNwb3NlRGF0YSh0LmRhdGFJZCkpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgY29uc3QgcGFja0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBQYWNrLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAga2VybmVsRnVuYzogcGFja1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBhY2suanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUGFkVjIgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgQ3BwRFR5cGUgfSBmcm9tICcuL3R5cGVzJztcbmxldCB3YXNtUGFkVjI7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbVBhZFYyID0gYmFja2VuZC53YXNtLmN3cmFwKFBhZFYyLCBudWxsIC8qIHZvaWQgKi8sIFtcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgIF0pO1xufVxuZnVuY3Rpb24gcGFkKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0czogeyB4IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHBhZGRpbmdzLCBjb25zdGFudFZhbHVlIH0gfSA9IGFyZ3M7XG4gICAgY29uc3Qgb3V0U2hhcGUgPSBwYWRkaW5ncy5tYXAoKHAsIGkpID0+IHBbMF0gLyogYmVmb3JlUGFkICovICsgeC5zaGFwZVtpXSArIHBbMV0gLyogYWZ0ZXJQYWQgKi8pO1xuICAgIGNvbnN0IHhJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh4LmRhdGFJZCkuaWQ7XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KG91dFNoYXBlLCB4LmR0eXBlKTtcbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICBjb25zdCB4U2hhcGVCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KHguc2hhcGUpLmJ1ZmZlcik7XG4gICAgY29uc3QgcHJlUGFkZGluZ3NGbGF0ID0gcGFkZGluZ3MubWFwKHBhZFR1cGxlID0+IHBhZFR1cGxlWzBdKTtcbiAgICBjb25zdCBwb3N0UGFkZGluZ3NGbGF0ID0gcGFkZGluZ3MubWFwKHBhZFR1cGxlID0+IHBhZFR1cGxlWzFdKTtcbiAgICBjb25zdCBwcmVQYWRkaW5nc0J5dGVzID0gbmV3IFVpbnQ4QXJyYXkobmV3IEludDMyQXJyYXkocHJlUGFkZGluZ3NGbGF0KS5idWZmZXIpO1xuICAgIGNvbnN0IHBvc3RQYWRkaW5nc0J5dGVzID0gbmV3IFVpbnQ4QXJyYXkobmV3IEludDMyQXJyYXkocG9zdFBhZGRpbmdzRmxhdCkuYnVmZmVyKTtcbiAgICB3YXNtUGFkVjIoeElkLCB4U2hhcGVCeXRlcywgeC5zaGFwZS5sZW5ndGgsIENwcERUeXBlW3guZHR5cGVdLCBwcmVQYWRkaW5nc0J5dGVzLCBwb3N0UGFkZGluZ3NCeXRlcywgY29uc3RhbnRWYWx1ZSwgb3V0SWQpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgcGFkVjJDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUGFkVjIsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBrZXJuZWxGdW5jOiBwYWQsXG4gICAgc2V0dXBGdW5jOiBzZXR1cFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBhZFYyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFBvdyB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVCaW5hcnlLZXJuZWxDb25maWcgfSBmcm9tICcuL2JpbmFyeV9rZXJuZWwnO1xuY29uc3Qgc3VwcG9ydHNGdWxsQnJvYWRjYXN0ID0gZmFsc2U7XG5leHBvcnQgY29uc3QgcG93Q29uZmlnID0gY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnKFBvdywgc3VwcG9ydHNGdWxsQnJvYWRjYXN0KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBvdy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBQcmVsdSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5sZXQgd2FzbVByZWx1O1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21QcmVsdSA9IGJhY2tlbmQud2FzbS5jd3JhcChQcmVsdSwgbnVsbCAvKiB2b2lkICovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicgLy8gb3V0X2lkXG4gICAgXSk7XG59XG5mdW5jdGlvbiBwcmVsdShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4LCBhbHBoYSB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHhJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh4LmRhdGFJZCkuaWQ7XG4gICAgY29uc3Qgd2VpZ2h0c0lkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGFscGhhLmRhdGFJZCkuaWQ7XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KHguc2hhcGUsICdmbG9hdDMyJyk7XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgd2FzbVByZWx1KHhJZCwgd2VpZ2h0c0lkLCBvdXRJZCk7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBwcmVsdUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBQcmVsdSxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogcHJlbHVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QcmVsdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIFByb2QsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgcGVybXV0ZUF4ZXNBbmRUcmFuc3Bvc2UgfSBmcm9tICcuL2tlcm5lbF91dGlscyc7XG5pbXBvcnQgeyBDcHBEVHlwZSB9IGZyb20gJy4vdHlwZXMnO1xubGV0IHdhc21Qcm9kO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21Qcm9kID0gYmFja2VuZC53YXNtLmN3cmFwKFByb2QsIG51bGwgLyp2b2lkKi8sIFtcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcidcbiAgICBdKTtcbn1cbmZ1bmN0aW9uIHByb2QoYXJncykge1xuICAgIGNvbnN0IHsgYmFja2VuZCwgaW5wdXRzLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGF4aXMsIGtlZXBEaW1zIH0gPSBhdHRycztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB4SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeC5kYXRhSWQpLmlkO1xuICAgIGxldCBpbnB1dElkID0geElkO1xuICAgIGxldCBpbnB1dCA9IHg7XG4gICAgY29uc3QgeyB0cmFuc3Bvc2VkLCBheGVzLCBvcmlnaW5hbEF4ZXMsIGlucHV0V2FzVHJhbnNwb3NlZCB9ID0gcGVybXV0ZUF4ZXNBbmRUcmFuc3Bvc2UoeCwgYXhpcywgYmFja2VuZCk7XG4gICAgbGV0IHJlZHVjdGlvbkF4ZXMgPSBheGVzO1xuICAgIGlmIChpbnB1dFdhc1RyYW5zcG9zZWQpIHtcbiAgICAgICAgY29uc3QgdHJhbnNwb3NlZElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHRyYW5zcG9zZWQuZGF0YUlkKS5pZDtcbiAgICAgICAgaWYgKHRyYW5zcG9zZWRJZCAhPT0geElkKSB7XG4gICAgICAgICAgICAvLyB0cmFuc3Bvc2Ugd2FzIG5vdCBhIG5vLW9wLiBXZSB3aWxsIG5lZWQgdG8gZGlzcG9zZSBvZiB0aGlzXG4gICAgICAgICAgICAvLyBvbmNlIHdlIGFyZSBkb25lLlxuICAgICAgICAgICAgaW5wdXQgPSB0cmFuc3Bvc2VkO1xuICAgICAgICAgICAgaW5wdXRJZCA9IHRyYW5zcG9zZWRJZDtcbiAgICAgICAgICAgIHJlZHVjdGlvbkF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0SW5uZXJNb3N0QXhlcyhyZWR1Y3Rpb25BeGVzLmxlbmd0aCwgaW5wdXQuc2hhcGUubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoJ3Byb2QnLCByZWR1Y3Rpb25BeGVzLCBpbnB1dC5zaGFwZS5sZW5ndGgpO1xuICAgIGNvbnN0IFtvdXRTaGFwZSwgcmVkdWNlU2hhcGVdID0gYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMoaW5wdXQuc2hhcGUsIHJlZHVjdGlvbkF4ZXMpO1xuICAgIGNvbnN0IHJlZHVjZVNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChvdXRTaGFwZSwgaW5wdXQuZHR5cGUpO1xuICAgIGlmICh1dGlsLnNpemVGcm9tU2hhcGUoaW5wdXQuc2hhcGUpICE9PSAwKSB7XG4gICAgICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgICAgICB3YXNtUHJvZChpbnB1dElkLCByZWR1Y2VTaXplLCBDcHBEVHlwZVtvdXQuZHR5cGVdLCBvdXRJZCk7XG4gICAgfVxuICAgIGlmIChpbnB1dFdhc1RyYW5zcG9zZWQpIHtcbiAgICAgICAgLy8gZGlzcG9zZSBvZiB0aGUgdHJhbnNwb3NlZCB0ZW5zb3IuXG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZURhdGEodHJhbnNwb3NlZC5kYXRhSWQpO1xuICAgIH1cbiAgICBpZiAoa2VlcERpbXMpIHtcbiAgICAgICAgLy8gcmVzaGFwZVxuICAgICAgICBjb25zdCBuZXdTaGFwZSA9IGJhY2tlbmRfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbShvdXQuc2hhcGUsIG9yaWdpbmFsQXhlcyk7XG4gICAgICAgIG91dC5zaGFwZSA9IG5ld1NoYXBlO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IHByb2RDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUHJvZCxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogcHJvZFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVByb2QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUmFuZ2UgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgcmFuZ2VJbXBsQ1BVIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5leHBvcnQgY29uc3QgcmFuZ2UgPSAoYXJncykgPT4ge1xuICAgIGNvbnN0IHsgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBzdGFydCwgc3RvcCwgc3RlcCwgZHR5cGUgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHZhbHVlcyA9IHJhbmdlSW1wbENQVShzdGFydCwgc3RvcCwgc3RlcCwgZHR5cGUpO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChbdmFsdWVzLmxlbmd0aF0sIGR0eXBlKTtcbiAgICBjb25zdCBvdXRWYWxzID0gYmFja2VuZC50eXBlZEFycmF5RnJvbUhlYXAob3V0KTtcbiAgICBvdXRWYWxzLnNldCh2YWx1ZXMpO1xuICAgIHJldHVybiBvdXQ7XG59O1xuZXhwb3J0IGNvbnN0IHJhbmdlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJhbmdlLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAga2VybmVsRnVuYzogcmFuZ2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SYW5nZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBSZWFsRGl2IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vYmluYXJ5X2tlcm5lbCc7XG5jb25zdCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QgPSB0cnVlO1xuZXhwb3J0IGNvbnN0IHJlYWxEaXZDb25maWcgPSBjcmVhdGVCaW5hcnlLZXJuZWxDb25maWcoUmVhbERpdiwgc3VwcG9ydHNGdWxsQnJvYWRjYXN0KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlYWxEaXYuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUmVsdSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVVbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vdW5hcnlfa2VybmVsJztcbmV4cG9ydCBjb25zdCByZWx1Q29uZmlnID0gY3JlYXRlVW5hcnlLZXJuZWxDb25maWcoUmVsdSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWx1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFJlbHU2IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi91bmFyeV9rZXJuZWwnO1xuZXhwb3J0IGNvbnN0IHJlbHU2Q29uZmlnID0gY3JlYXRlVW5hcnlLZXJuZWxDb25maWcoUmVsdTYpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVsdTYuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUmVzaGFwZSwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgZnVuY3Rpb24gcmVzaGFwZShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgc2hhcGUgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHhTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHguc2hhcGUpO1xuICAgIGNvbnN0ICRzaGFwZSA9IHV0aWwuaW5mZXJGcm9tSW1wbGljaXRTaGFwZShzaGFwZSwgeFNpemUpO1xuICAgIHV0aWwuYXNzZXJ0KHhTaXplID09PSB1dGlsLnNpemVGcm9tU2hhcGUoJHNoYXBlKSwgKCkgPT4gYG5ldyBzaGFwZTogJHskc2hhcGV9LCBvbGQgc2hhcGU6ICR7eC5zaGFwZX0uIE5ldyBzaGFwZSBhbmQgb2xkIGAgK1xuICAgICAgICBgc2hhcGUgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBlbGVtZW50cy5gKTtcbiAgICAvLyBCYWNrZW5kIG5lZWRzIHRvIHRyYWNrIHJlZkNvdW50IGZvciB0aGUgZGF0YUlkIGZvciByZXNoYXBlIG9wXG4gICAgYXJncy5iYWNrZW5kLmluY1JlZih4LmRhdGFJZCk7XG4gICAgcmV0dXJuIHsgZGF0YUlkOiB4LmRhdGFJZCwgc2hhcGU6ICRzaGFwZSwgZHR5cGU6IHguZHR5cGUgfTtcbn1cbmV4cG9ydCBjb25zdCByZXNoYXBlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJlc2hhcGUsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBrZXJuZWxGdW5jOiByZXNoYXBlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVzaGFwZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBSZXNpemVCaWxpbmVhciwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjYXN0IH0gZnJvbSAnLi9DYXN0JztcbmxldCB3YXNtUmVzaXplQmlsaW5lYXI7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbVJlc2l6ZUJpbGluZWFyID0gYmFja2VuZC53YXNtLmN3cmFwKFJlc2l6ZUJpbGluZWFyLCBudWxsIC8qdm9pZCovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInIC8vIG91dElkXG4gICAgXSk7XG59XG5mdW5jdGlvbiByZXNpemVCaWxpbmVhcihhcmdzKSB7XG4gICAgY29uc3QgeyBiYWNrZW5kLCBpbnB1dHMsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW1hZ2VzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBhbGlnbkNvcm5lcnMsIGhhbGZQaXhlbENlbnRlcnMsIHNpemUgfSA9IGF0dHJzO1xuICAgIGNvbnN0IFtuZXdIZWlnaHQsIG5ld1dpZHRoXSA9IHNpemU7XG4gICAgY29uc3QgW2JhdGNoLCBvbGRIZWlnaHQsIG9sZFdpZHRoLCBudW1DaGFubmVsc10gPSBpbWFnZXMuc2hhcGU7XG4gICAgY29uc3Qgb3V0U2hhcGUgPSBbYmF0Y2gsIG5ld0hlaWdodCwgbmV3V2lkdGgsIG51bUNoYW5uZWxzXTtcbiAgICBsZXQgeERhdGEgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoaW1hZ2VzLmRhdGFJZCk7XG4gICAgbGV0IGNhc3RlZERhdGE7XG4gICAgaWYgKHhEYXRhLmR0eXBlICE9PSAnZmxvYXQzMicpIHtcbiAgICAgICAgY2FzdGVkRGF0YSA9XG4gICAgICAgICAgICBjYXN0KHsgYmFja2VuZCwgaW5wdXRzOiB7IHg6IGltYWdlcyB9LCBhdHRyczogeyBkdHlwZTogJ2Zsb2F0MzInIH0gfSk7XG4gICAgICAgIHhEYXRhID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGNhc3RlZERhdGEuZGF0YUlkKTtcbiAgICB9XG4gICAgY29uc3QgeElkID0geERhdGEuaWQ7XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KG91dFNoYXBlLCAnZmxvYXQzMicpO1xuICAgIGlmICh1dGlsLnNpemVGcm9tU2hhcGUoaW1hZ2VzLnNoYXBlKSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICB3YXNtUmVzaXplQmlsaW5lYXIoeElkLCBiYXRjaCwgb2xkSGVpZ2h0LCBvbGRXaWR0aCwgbnVtQ2hhbm5lbHMsIG5ld0hlaWdodCwgbmV3V2lkdGgsIGFsaWduQ29ybmVycyA/IDEgOiAwLCBoYWxmUGl4ZWxDZW50ZXJzID8gMSA6IDAsIG91dElkKTtcbiAgICBpZiAoY2FzdGVkRGF0YSAhPSBudWxsKSB7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZURhdGEoY2FzdGVkRGF0YS5kYXRhSWQpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IHJlc2l6ZUJpbGluZWFyQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJlc2l6ZUJpbGluZWFyLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiByZXNpemVCaWxpbmVhclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlc2l6ZUJpbGluZWFyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFJldmVyc2UsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgaWRlbnRpdHkgfSBmcm9tICcuL0lkZW50aXR5JztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xubGV0IHdhc21SZXZlcnNlO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21SZXZlcnNlID0gYmFja2VuZC53YXNtLmN3cmFwKFJldmVyc2UsIG51bGwsIFtcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicgLy8gb3V0X2lkXG4gICAgXSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcmV2ZXJzZShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgZGltcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgYXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oZGltcywgeC5zaGFwZSk7XG4gICAgaWYgKHguc2hhcGUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBpZGVudGl0eSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQgfSk7XG4gICAgfVxuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dCh4LnNoYXBlLCB4LmR0eXBlKTtcbiAgICBjb25zdCB4SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IGF4ZXNCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KGF4ZXMpLmJ1ZmZlcik7XG4gICAgY29uc3Qgb3V0U2hhcGVCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KHguc2hhcGUpLmJ1ZmZlcik7XG4gICAgd2FzbVJldmVyc2UoeElkLCBheGVzQnl0ZXMsIGF4ZXMubGVuZ3RoLCBvdXRTaGFwZUJ5dGVzLCB4LnNoYXBlLmxlbmd0aCwgb3V0SWQpO1xuICAgIGNvbnN0IHJlc2hhcGVkID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiBvdXQgfSwgYXR0cnM6IHsgc2hhcGU6IHguc2hhcGUgfSwgYmFja2VuZCB9KTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VEYXRhKG91dC5kYXRhSWQpO1xuICAgIHJldHVybiByZXNoYXBlZDtcbn1cbmV4cG9ydCBjb25zdCByZXZlcnNlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJldmVyc2UsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBrZXJuZWxGdW5jOiByZXZlcnNlLFxuICAgIHNldHVwRnVuYzogc2V0dXBcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZXZlcnNlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFJvdGF0ZVdpdGhPZmZzZXQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYmFja2VuZF91dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmxldCB3YXNtUm90YXRlO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21Sb3RhdGUgPSBiYWNrZW5kLndhc20uY3dyYXAoUm90YXRlV2l0aE9mZnNldCwgbnVsbCAvKiB2b2lkICovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgIF0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVdpdGhPZmZzZXQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGltYWdlIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyByYWRpYW5zLCBmaWxsVmFsdWUsIGNlbnRlciB9ID0gYXR0cnM7XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KGltYWdlLnNoYXBlLCBpbWFnZS5kdHlwZSk7XG4gICAgY29uc3QgaW1hZ2VJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChpbWFnZS5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IFtiYXRjaCwgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIG51bUNoYW5uZWxzXSA9IGltYWdlLnNoYXBlO1xuICAgIGNvbnN0IFtjZW50ZXJYLCBjZW50ZXJZXSA9IGJhY2tlbmRfdXRpbC5nZXRJbWFnZUNlbnRlcihjZW50ZXIsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoKTtcbiAgICBjb25zdCBmaWxsSXNCbGFjayA9IGZpbGxWYWx1ZSA9PT0gMDtcbiAgICBjb25zdCBmdWxsT3BhY2l0eVZhbHVlID0gMjU1O1xuICAgIGNvbnN0IGZpbGxWYWx1ZXMgPSB0eXBlb2YgZmlsbFZhbHVlID09PSAnbnVtYmVyJyA/XG4gICAgICAgIFtmaWxsVmFsdWUsIGZpbGxWYWx1ZSwgZmlsbFZhbHVlLCBmaWxsSXNCbGFjayA/IDAgOiBmdWxsT3BhY2l0eVZhbHVlXSA6XG4gICAgICAgIFsuLi5maWxsVmFsdWUsIGZ1bGxPcGFjaXR5VmFsdWVdO1xuICAgIGNvbnN0IGZpbGxCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KGZpbGxWYWx1ZXMpLmJ1ZmZlcik7XG4gICAgd2FzbVJvdGF0ZShpbWFnZUlkLCBiYXRjaCwgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIG51bUNoYW5uZWxzLCByYWRpYW5zLCBjZW50ZXJYLCBjZW50ZXJZLCBmaWxsQnl0ZXMsIGZpbGxWYWx1ZXMubGVuZ3RoLCBvdXRJZCk7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCByb3RhdGVXaXRoT2Zmc2V0Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJvdGF0ZVdpdGhPZmZzZXQsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBrZXJuZWxGdW5jOiByb3RhdGVXaXRoT2Zmc2V0LFxuICAgIHNldHVwRnVuYzogc2V0dXBcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Sb3RhdGVXaXRoT2Zmc2V0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFJvdW5kIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi91bmFyeV9rZXJuZWwnO1xuZXhwb3J0IGNvbnN0IHJvdW5kQ29uZmlnID0gY3JlYXRlVW5hcnlLZXJuZWxDb25maWcoUm91bmQpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Um91bmQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUnNxcnQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlVW5hcnlLZXJuZWxDb25maWcgfSBmcm9tICcuL3VuYXJ5X2tlcm5lbCc7XG5leHBvcnQgY29uc3QgcnNxcnRDb25maWcgPSBjcmVhdGVVbmFyeUtlcm5lbENvbmZpZyhSc3FydCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Sc3FydC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBzY2F0dGVyX3V0aWwsIFNjYXR0ZXJOZCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBDcHBEVHlwZSB9IGZyb20gJy4vdHlwZXMnO1xubGV0IHdhc21TY2F0dGVyTmQ7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbVNjYXR0ZXJOZCA9IGJhY2tlbmQud2FzbS5jd3JhcChTY2F0dGVyTmQsIG51bGwgLyp2b2lkKi8sIFtcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInIC8vIG91dElkXG4gICAgXSk7XG59XG5mdW5jdGlvbiBzY2F0dGVyTmQoYXJncykge1xuICAgIGNvbnN0IHsgYmFja2VuZCwgaW5wdXRzLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGluZGljZXMsIHVwZGF0ZXMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHNoYXBlIH0gPSBhdHRycztcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoc2hhcGUsIHVwZGF0ZXMuZHR5cGUpO1xuICAgIGlmICh1dGlsLnNpemVGcm9tU2hhcGUoc2hhcGUpID09PSAwKSB7XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuICAgIGNvbnN0IHsgc2xpY2VSYW5rLCBudW1VcGRhdGVzLCBzbGljZVNpemUsIHN0cmlkZXMsIG91dHB1dFNpemUgfSA9IHNjYXR0ZXJfdXRpbC5jYWxjdWxhdGVTaGFwZXModXBkYXRlcywgaW5kaWNlcywgc2hhcGUpO1xuICAgIGNvbnN0IGluZGljZXNEYXRhID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGluZGljZXMuZGF0YUlkKTtcbiAgICBjb25zdCBpbmRpY2VzSWQgPSBpbmRpY2VzRGF0YS5pZDtcbiAgICBjb25zdCB1cGRhdGVzRGF0YSA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh1cGRhdGVzLmRhdGFJZCk7XG4gICAgY29uc3QgdXBkYXRlc0lkID0gdXBkYXRlc0RhdGEuaWQ7XG4gICAgY29uc3Qgc3RyaWRlc0J5dGVzID0gbmV3IFVpbnQ4QXJyYXkobmV3IEludDMyQXJyYXkoc3RyaWRlcykuYnVmZmVyKTtcbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICB3YXNtU2NhdHRlck5kKGluZGljZXNJZCwgdXBkYXRlc0lkLCBDcHBEVHlwZVt1cGRhdGVzLmR0eXBlXSwgc2xpY2VSYW5rLCBudW1VcGRhdGVzLCBzbGljZVNpemUsIHN0cmlkZXNCeXRlcywgb3V0cHV0U2l6ZSwgb3V0SWQpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3Qgc2NhdHRlck5kQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNjYXR0ZXJOZCxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogc2NhdHRlck5kXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2NhdHRlck5kLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFNlbGVjdCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5sZXQgd2FzbVNlbGVjdDtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtU2VsZWN0ID0gYmFja2VuZC53YXNtLmN3cmFwKCdTZWxlY3RWMicsIG51bGwsIFtcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgIF0pO1xufVxuZnVuY3Rpb24gc2VsZWN0KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IGNvbmRpdGlvbiwgdCwgZSB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IGNvbmRpdGlvbklkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGNvbmRpdGlvbi5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IHRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh0LmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgZUlkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGUuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQodC5zaGFwZSwgdC5kdHlwZSk7XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgY1JhbmsgPSBjb25kaXRpb24uc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IHRSYW5rID0gdC5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3Qgb2Zmc2V0ID0gY1JhbmsgPT09IDAgfHwgY1JhbmsgPiAxIHx8IHRSYW5rID09PSAxID9cbiAgICAgICAgMSA6XG4gICAgICAgIHV0aWwuc2l6ZUZyb21TaGFwZSh0LnNoYXBlLnNsaWNlKDEpKTtcbiAgICB3YXNtU2VsZWN0KGNvbmRpdGlvbklkLCB0SWQsIGVJZCwgb2Zmc2V0LCBvdXRJZCk7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBzZWxlY3RDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU2VsZWN0LFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAga2VybmVsRnVuYzogc2VsZWN0LFxuICAgIHNldHVwRnVuYzogc2V0dXBcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TZWxlY3QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU2lnbW9pZCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5sZXQgd2FzbUZ1bmM7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbUZ1bmMgPSBiYWNrZW5kLndhc20uY3dyYXAoU2lnbW9pZCwgbnVsbCAvKiB2b2lkICovLCBbJ251bWJlcicsICdudW1iZXInXSk7XG59XG5mdW5jdGlvbiBzaWdtb2lkKGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGlucHV0czogeyB4IH0gfSA9IGFyZ3M7XG4gICAgY29uc3QgeElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHguZGF0YUlkKS5pZDtcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoeC5zaGFwZSwgeC5kdHlwZSk7XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgLy8gU2hvcnQtY2lyY3VpdCB6ZXJvLXNpemVkIHRlbnNvcnMuXG4gICAgaWYgKHV0aWwuc2l6ZUZyb21TaGFwZShvdXQuc2hhcGUpID09PSAwKSB7XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuICAgIHdhc21GdW5jKHhJZCwgb3V0SWQpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3Qgc2lnbW9pZENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiAnU2lnbW9pZCcsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IHNpZ21vaWRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TaWdtb2lkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFNpbiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVVbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vdW5hcnlfa2VybmVsJztcbmV4cG9ydCBjb25zdCBzaW5Db25maWcgPSBjcmVhdGVVbmFyeUtlcm5lbENvbmZpZyhTaW4pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2luLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFNsaWNlLCBzbGljZV91dGlsLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHNsaWNlSW1wbENQVSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuZXhwb3J0IGZ1bmN0aW9uIHNsaWNlKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0czogeyB4IH0sIGF0dHJzOiB7IGJlZ2luLCBzaXplIH0sIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgW2JlZ2luXywgc2l6ZV9dID0gc2xpY2VfdXRpbC5wYXJzZVNsaWNlUGFyYW1zKHgsIGJlZ2luLCBzaXplKTtcbiAgICBjb25zdCBpc0NvbnRpbm91cyA9IHNsaWNlX3V0aWwuaXNTbGljZUNvbnRpbm91cyh4LnNoYXBlLCBiZWdpbl8sIHNpemVfKTtcbiAgICBjb25zdCB4VmFscyA9IGJhY2tlbmQucmVhZFN5bmMoeC5kYXRhSWQpO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChzaXplXywgeC5kdHlwZSk7XG4gICAgY29uc3QgeFN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKHguc2hhcGUpO1xuICAgIGNvbnN0IG91dERhdGEgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCk7XG4gICAgaWYgKGlzQ29udGlub3VzKSB7XG4gICAgICAgIGNvbnN0IGZsYXRPZmZzZXQgPSBzbGljZV91dGlsLmNvbXB1dGVGbGF0T2Zmc2V0KGJlZ2luXywgeFN0cmlkZXMpO1xuICAgICAgICBpZiAoeC5kdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIG91dERhdGEuc3RyaW5nQnl0ZXMgPVxuICAgICAgICAgICAgICAgIHhWYWxzXG4gICAgICAgICAgICAgICAgICAgIC5zbGljZShmbGF0T2Zmc2V0LCBmbGF0T2Zmc2V0ICsgdXRpbC5zaXplRnJvbVNoYXBlKHNpemVfKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBvdXRWYWxzID0gYmFja2VuZC50eXBlZEFycmF5RnJvbUhlYXAob3V0KTtcbiAgICAgICAgICAgIG91dFZhbHMuc2V0KHhWYWxzXG4gICAgICAgICAgICAgICAgLnN1YmFycmF5KGZsYXRPZmZzZXQsIGZsYXRPZmZzZXQgKyB1dGlsLnNpemVGcm9tU2hhcGUoc2l6ZV8pKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG4gICAgaWYgKHguZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IHNsaWNlSW1wbENQVSh4VmFscywgYmVnaW5fLCBzaXplXywgeC5zaGFwZSwgeC5kdHlwZSk7XG4gICAgICAgIG91dERhdGEuc3RyaW5nQnl0ZXMgPSByZXM7XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuICAgIGNvbnN0IG91dFZhbHMgPSBiYWNrZW5kLnR5cGVkQXJyYXlGcm9tSGVhcChvdXQpO1xuICAgIGNvbnN0IHJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcbiAgICBpZiAocmFuayA9PT0gMikge1xuICAgICAgICBzbGljZTJkKHhWYWxzLCB4U3RyaWRlc1swXSwgb3V0VmFscywgYmVnaW5fLCBzaXplXyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHJhbmsgPT09IDMpIHtcbiAgICAgICAgc2xpY2UzZCh4VmFscywgeFN0cmlkZXNbMF0sIHhTdHJpZGVzWzFdLCBvdXRWYWxzLCBiZWdpbl8sIHNpemVfKTtcbiAgICB9XG4gICAgZWxzZSBpZiAocmFuayA9PT0gNCkge1xuICAgICAgICBzbGljZTRkKHhWYWxzLCB4U3RyaWRlc1swXSwgeFN0cmlkZXNbMV0sIHhTdHJpZGVzWzJdLCBvdXRWYWxzLCBiZWdpbl8sIHNpemVfKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IHNsaWNlSW1wbENQVSh4VmFscywgYmVnaW5fLCBzaXplXywgeC5zaGFwZSwgeC5kdHlwZSk7XG4gICAgICAgIG91dFZhbHMuc2V0KHJlcyk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG59XG5mdW5jdGlvbiBzbGljZTJkKHhWYWxzLCB4U3RyaWRlLCBvdXRWYWxzLCBiZWdpbiwgc2l6ZSkge1xuICAgIGxldCBvdXRPZmZzZXQgPSAwO1xuICAgIGNvbnN0IGJlZ2luSSA9IGJlZ2luWzBdO1xuICAgIGNvbnN0IGJlZ2luSiA9IGJlZ2luWzFdO1xuICAgIGNvbnN0IGVuZEkgPSBiZWdpbkkgKyBzaXplWzBdO1xuICAgIGZvciAobGV0IGkgPSBiZWdpbkk7IGkgPCBlbmRJOyBpKyspIHtcbiAgICAgICAgY29uc3QgeE9mZnNldCA9IGkgKiB4U3RyaWRlICsgYmVnaW5KO1xuICAgICAgICBvdXRWYWxzLnNldCh4VmFscy5zdWJhcnJheSh4T2Zmc2V0LCB4T2Zmc2V0ICsgc2l6ZVsxXSksIG91dE9mZnNldCk7XG4gICAgICAgIG91dE9mZnNldCArPSBzaXplWzFdO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNsaWNlM2QoeFZhbHMsIHhTdHJpZGUxLCB4U3RyaWRlMiwgb3V0VmFscywgYmVnaW4sIHNpemUpIHtcbiAgICBsZXQgb3V0T2Zmc2V0ID0gMDtcbiAgICBjb25zdCBiZWdpbkkgPSBiZWdpblswXTtcbiAgICBjb25zdCBiZWdpbkogPSBiZWdpblsxXTtcbiAgICBjb25zdCBiZWdpbksgPSBiZWdpblsyXTtcbiAgICBjb25zdCBlbmRJID0gYmVnaW5JICsgc2l6ZVswXTtcbiAgICBjb25zdCBlbmRKID0gYmVnaW5KICsgc2l6ZVsxXTtcbiAgICBmb3IgKGxldCBpID0gYmVnaW5JOyBpIDwgZW5kSTsgaSsrKSB7XG4gICAgICAgIGZvciAobGV0IGogPSBiZWdpbko7IGogPCBlbmRKOyBqKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHhPZmZzZXQgPSBpICogeFN0cmlkZTEgKyBqICogeFN0cmlkZTIgKyBiZWdpbks7XG4gICAgICAgICAgICBvdXRWYWxzLnNldCh4VmFscy5zdWJhcnJheSh4T2Zmc2V0LCB4T2Zmc2V0ICsgc2l6ZVsyXSksIG91dE9mZnNldCk7XG4gICAgICAgICAgICBvdXRPZmZzZXQgKz0gc2l6ZVsyXTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHNsaWNlNGQoeFZhbHMsIHhTdHJpZGUxLCB4U3RyaWRlMiwgeFN0cmlkZTMsIG91dFZhbHMsIGJlZ2luLCBzaXplKSB7XG4gICAgbGV0IG91dE9mZnNldCA9IDA7XG4gICAgY29uc3QgYmVnaW5JID0gYmVnaW5bMF07XG4gICAgY29uc3QgYmVnaW5KID0gYmVnaW5bMV07XG4gICAgY29uc3QgYmVnaW5LID0gYmVnaW5bMl07XG4gICAgY29uc3QgZW5kSSA9IGJlZ2luSSArIHNpemVbMF07XG4gICAgY29uc3QgZW5kSiA9IGJlZ2luSiArIHNpemVbMV07XG4gICAgY29uc3QgZW5kSyA9IGJlZ2luSyArIHNpemVbMl07XG4gICAgY29uc3QgYmVnaW5MID0gYmVnaW5bM107XG4gICAgZm9yIChsZXQgaSA9IGJlZ2luSTsgaSA8IGVuZEk7IGkrKykge1xuICAgICAgICBmb3IgKGxldCBqID0gYmVnaW5KOyBqIDwgZW5kSjsgaisrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBrID0gYmVnaW5LOyBrIDwgZW5kSzsgaysrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeE9mZnNldCA9IGkgKiB4U3RyaWRlMSArIGogKiB4U3RyaWRlMiArIGsgKiB4U3RyaWRlMyArIGJlZ2luTDtcbiAgICAgICAgICAgICAgICBvdXRWYWxzLnNldCh4VmFscy5zdWJhcnJheSh4T2Zmc2V0LCB4T2Zmc2V0ICsgc2l6ZVszXSksIG91dE9mZnNldCk7XG4gICAgICAgICAgICAgICAgb3V0T2Zmc2V0ICs9IHNpemVbM107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgY29uc3Qgc2xpY2VDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU2xpY2UsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBrZXJuZWxGdW5jOiBzbGljZSxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TbGljZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTb2Z0bWF4LCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmxldCB3YXNtRnVuYztcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtRnVuYyA9IGJhY2tlbmQud2FzbS5jd3JhcChTb2Z0bWF4LCBudWxsIC8qIHZvaWQgKi8sIFtcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicgLy8gYmF0Y2hcbiAgICBdKTtcbn1cbmZ1bmN0aW9uIHNvZnRtYXgoYXJncykge1xuICAgIGNvbnN0IHsgYmFja2VuZCwgaW5wdXRzOiB7IGxvZ2l0cyB9LCBhdHRyczogeyBkaW0gfSB9ID0gYXJncztcbiAgICBjb25zdCB4SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQobG9naXRzLmRhdGFJZCkuaWQ7XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KGxvZ2l0cy5zaGFwZSwgbG9naXRzLmR0eXBlKTtcbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBjaGFubmVscyA9IGxvZ2l0cy5zaGFwZVtkaW1dO1xuICAgIGNvbnN0IGJhdGNoID0gdXRpbC5zaXplRnJvbVNoYXBlKGxvZ2l0cy5zaGFwZSkgLyBjaGFubmVscztcbiAgICAvLyBTaG9ydC1jaXJjdWl0IHplcm8tc2l6ZWQgdGVuc29ycy5cbiAgICBpZiAodXRpbC5zaXplRnJvbVNoYXBlKG91dC5zaGFwZSkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG4gICAgd2FzbUZ1bmMoeElkLCBvdXRJZCwgY2hhbm5lbHMsIGJhdGNoKTtcbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IHNvZnRtYXhDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU29mdG1heCxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogc29mdG1heFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNvZnRtYXguanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBTcGFjZVRvQmF0Y2hORCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBwYWRWMkNvbmZpZyB9IGZyb20gJy4vUGFkVjInO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQgeyB0cmFuc3Bvc2UgfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5mdW5jdGlvbiBzcGFjZVRvQmF0Y2hORChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYmxvY2tTaGFwZSwgcGFkZGluZ3MgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHByb2QgPSB1dGlsLnNpemVGcm9tU2hhcGUoYmxvY2tTaGFwZSk7XG4gICAgY29uc3QgY29tcGxldGVQYWRkaW5ncyA9IFtbMCwgMF1dO1xuICAgIGNvbXBsZXRlUGFkZGluZ3MucHVzaCguLi5wYWRkaW5ncyk7XG4gICAgZm9yIChsZXQgaSA9IDEgKyBibG9ja1NoYXBlLmxlbmd0aDsgaSA8IHguc2hhcGUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29tcGxldGVQYWRkaW5ncy5wdXNoKFswLCAwXSk7XG4gICAgfVxuICAgIGNvbnN0IHBhZGRlZFggPSBwYWRWMkNvbmZpZy5rZXJuZWxGdW5jKHtcbiAgICAgICAgaW5wdXRzOiB7IHggfSxcbiAgICAgICAgYmFja2VuZCxcbiAgICAgICAgYXR0cnM6IHsgcGFkZGluZ3M6IGNvbXBsZXRlUGFkZGluZ3MsIGNvbnN0YW50VmFsdWU6IDAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHJlc2hhcGVkUGFkZGVkU2hhcGUgPSBiYWNrZW5kX3V0aWwuZ2V0UmVzaGFwZWQocGFkZGVkWC5zaGFwZSwgYmxvY2tTaGFwZSwgcHJvZCwgZmFsc2UpO1xuICAgIGNvbnN0IHBlcm11dGVkUmVzaGFwZWRQYWRkZWRQZXJtdXRhdGlvbiA9IGJhY2tlbmRfdXRpbC5nZXRQZXJtdXRlZChyZXNoYXBlZFBhZGRlZFNoYXBlLmxlbmd0aCwgYmxvY2tTaGFwZS5sZW5ndGgsIGZhbHNlKTtcbiAgICBjb25zdCBmbGF0dGVuU2hhcGUgPSBiYWNrZW5kX3V0aWwuZ2V0UmVzaGFwZWRQZXJtdXRlZChwYWRkZWRYLnNoYXBlLCBibG9ja1NoYXBlLCBwcm9kLCBmYWxzZSk7XG4gICAgY29uc3QgcmVzaGFwZUlucHV0cyA9IHsgeDogcGFkZGVkWCB9O1xuICAgIGNvbnN0IHJlc2hhcGVBdHRycyA9IHsgc2hhcGU6IHJlc2hhcGVkUGFkZGVkU2hhcGUgfTtcbiAgICBjb25zdCBwYWRkZWRYUmVzaGFwZWQgPSByZXNoYXBlKHsgaW5wdXRzOiByZXNoYXBlSW5wdXRzLCBiYWNrZW5kLCBhdHRyczogcmVzaGFwZUF0dHJzIH0pO1xuICAgIGNvbnN0IHRyYW5zcG9zZUlucHV0cyA9IHsgeDogcGFkZGVkWFJlc2hhcGVkIH07XG4gICAgY29uc3QgdHJhbnNwb3NlQXR0cnMgPSB7IHBlcm06IHBlcm11dGVkUmVzaGFwZWRQYWRkZWRQZXJtdXRhdGlvbiB9O1xuICAgIGNvbnN0IHBhZGRlZFhUID0gdHJhbnNwb3NlKHsgaW5wdXRzOiB0cmFuc3Bvc2VJbnB1dHMsIGJhY2tlbmQsIGF0dHJzOiB0cmFuc3Bvc2VBdHRycyB9KTtcbiAgICBjb25zdCByZXN1bHRSZXNoYXBlSW5wdXRzID0geyB4OiBwYWRkZWRYVCB9O1xuICAgIGNvbnN0IHJlc3VsdFJlc2hhcGVBdHRycyA9IHsgc2hhcGU6IGZsYXR0ZW5TaGFwZSB9O1xuICAgIGNvbnN0IHJlc3VsdCA9IHJlc2hhcGUoeyBpbnB1dHM6IHJlc3VsdFJlc2hhcGVJbnB1dHMsIGJhY2tlbmQsIGF0dHJzOiByZXN1bHRSZXNoYXBlQXR0cnMgfSk7XG4gICAgYmFja2VuZC5kaXNwb3NlRGF0YShwYWRkZWRYLmRhdGFJZCk7XG4gICAgYmFja2VuZC5kaXNwb3NlRGF0YShwYWRkZWRYUmVzaGFwZWQuZGF0YUlkKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VEYXRhKHBhZGRlZFhULmRhdGFJZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBjb25zdCBzcGFjZVRvQmF0Y2hORENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTcGFjZVRvQmF0Y2hORCxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIGtlcm5lbEZ1bmM6IHNwYWNlVG9CYXRjaE5EXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3BhY2VUb0JhdGNoTkQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3BsaXRWLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGJhY2tlbmRfdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBzbGljZSB9IGZyb20gJy4vU2xpY2UnO1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0VihhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGF0dHJzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgbnVtT3JTaXplU3BsaXRzLCBheGlzIH0gPSBhdHRycztcbiAgICBjb25zdCAkYXhpcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSlbMF07XG4gICAgY29uc3Qgc3BsaXRTaXplcyA9IGJhY2tlbmRfdXRpbC5wcmVwYXJlU3BsaXRTaXplKHgsIG51bU9yU2l6ZVNwbGl0cywgJGF4aXMpO1xuICAgIGNvbnN0IGJlZ2luID0gbmV3IEFycmF5KHguc2hhcGUubGVuZ3RoKS5maWxsKDApO1xuICAgIGNvbnN0IHNpemUgPSB4LnNoYXBlLnNsaWNlKCk7XG4gICAgcmV0dXJuIHNwbGl0U2l6ZXMubWFwKHMgPT4ge1xuICAgICAgICBjb25zdCB4U2xpY2VTaXplID0gWy4uLnNpemVdO1xuICAgICAgICB4U2xpY2VTaXplWyRheGlzXSA9IHM7XG4gICAgICAgIGNvbnN0IHhTbGljZSA9IHNsaWNlKHsgaW5wdXRzOiB7IHggfSwgYXR0cnM6IHsgYmVnaW4sIHNpemU6IHhTbGljZVNpemUgfSwgYmFja2VuZCB9KTtcbiAgICAgICAgYmVnaW5bJGF4aXNdICs9IHM7XG4gICAgICAgIHJldHVybiB4U2xpY2U7XG4gICAgfSk7XG59XG5leHBvcnQgY29uc3Qgc3BsaXRWQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNwbGl0VixcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIGtlcm5lbEZ1bmM6IHNwbGl0VlxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNwbGl0Vi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTcXJ0IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi91bmFyeV9rZXJuZWwnO1xuZXhwb3J0IGNvbnN0IHNxcnRDb25maWcgPSBjcmVhdGVVbmFyeUtlcm5lbENvbmZpZyhTcXJ0KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNxcnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3F1YXJlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi91bmFyeV9rZXJuZWwnO1xuZXhwb3J0IGNvbnN0IHNxdWFyZUNvbmZpZyA9IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnKFNxdWFyZSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TcXVhcmUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3F1YXJlZERpZmZlcmVuY2UgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi9iaW5hcnlfa2VybmVsJztcbmNvbnN0IHN1cHBvcnRzRnVsbEJyb2FkY2FzdCA9IHRydWU7XG5leHBvcnQgY29uc3Qgc3F1YXJlZERpZmZlcmVuY2VDb25maWcgPSBjcmVhdGVCaW5hcnlLZXJuZWxDb25maWcoU3F1YXJlZERpZmZlcmVuY2UsIHN1cHBvcnRzRnVsbEJyb2FkY2FzdCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TcXVhcmVkRGlmZmVyZW5jZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTdGVwIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmxldCB3YXNtU3RlcDtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtU3RlcCA9IGJhY2tlbmQud2FzbS5jd3JhcChTdGVwLCBudWxsIC8qdm9pZCovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgXSk7XG59XG5mdW5jdGlvbiBzdGVwKGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGlucHV0cywgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBhbHBoYSB9ID0gYXR0cnM7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHguZGF0YUlkKS5pZDtcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoeC5zaGFwZSwgeC5kdHlwZSk7XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgd2FzbVN0ZXAoeElkLCBhbHBoYSwgb3V0SWQpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3Qgc3RlcENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTdGVwLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiBzdGVwXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3RlcC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIFN0cmlkZWRTbGljZSwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7IHNsaWNlIH0gZnJvbSAnLi9TbGljZSc7XG5sZXQgd2FzbVN0cmlkZWRTbGljZTtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtU3RyaWRlZFNsaWNlID0gYmFja2VuZC53YXNtLmN3cmFwKFN0cmlkZWRTbGljZSwgbnVsbCAvKnZvaWQqLywgW1xuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICBdKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzdHJpZGVkU2xpY2UoYXJncykge1xuICAgIGNvbnN0IHsgYmFja2VuZCwgaW5wdXRzLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBsZXQgeyBiZWdpbiwgZW5kLCBzdHJpZGVzIH0gPSBhdHRycztcbiAgICBpZiAoc3RyaWRlcyA9PSBudWxsKSB7XG4gICAgICAgIHN0cmlkZXMgPSBuZXcgQXJyYXkoYmVnaW4ubGVuZ3RoKTtcbiAgICB9XG4gICAgY29uc3QgeyBiZWdpbk1hc2ssIGVuZE1hc2ssIGVsbGlwc2lzTWFzaywgbmV3QXhpc01hc2ssIHNocmlua0F4aXNNYXNrIH0gPSBhdHRycztcbiAgICBjb25zdCBlbGxpcHNpc0F4ZXMgPSBiYWNrZW5kX3V0aWwuc2xpY2VfdXRpbC5tYXNrVG9BeGVzKGVsbGlwc2lzTWFzayk7XG4gICAgaWYgKGVsbGlwc2lzQXhlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTXVsdGlwbGUgZWxsaXBzZXMgaW4gc2xpY2UgaXMgbm90IGFsbG93ZWQuJyk7XG4gICAgfVxuICAgIGlmIChlbGxpcHNpc01hc2sgIT09IDAgJiYgbmV3QXhpc01hc2sgIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVc2luZyBib3RoIGVsbGlwc2lzTWFzayBhbmQgbmV3QXhpc01hc2sgaXMgbm90IHlldCBzdXBwb3J0ZWQuJyk7XG4gICAgfVxuICAgIGlmIChlbGxpcHNpc01hc2sgIT09IDAgJiYgc2hyaW5rQXhpc01hc2sgIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVc2luZyBib3RoIGVsbGlwc2lzTWFzayBhbmQgc2hyaW5rQXhpc01hc2sgaXMgbm90IHlldCBzdXBwb3J0ZWQuJyk7XG4gICAgfVxuICAgIGNvbnN0IG51bUludGVycG9sYXRlZEF4ZXMgPSB4LnNoYXBlLmxlbmd0aCAtIGJlZ2luLmxlbmd0aDtcbiAgICAvLyBFeHBhbmQgdGhlIGRpbXMgb2YgeCBiYXNlZCBvbiB0aGUgbmV3QXhpc01hc2suXG4gICAgY29uc3QgZXhwYW5kQXhlcyA9IGJhY2tlbmRfdXRpbC5zbGljZV91dGlsLm1hc2tUb0F4ZXMobmV3QXhpc01hc2spO1xuICAgIGNvbnN0IG5ld1NoYXBlID0geC5zaGFwZS5zbGljZSgpO1xuICAgIGV4cGFuZEF4ZXMuZm9yRWFjaChheGlzID0+IHtcbiAgICAgICAgYmVnaW5bYXhpc10gPSAwO1xuICAgICAgICBlbmRbYXhpc10gPSAxO1xuICAgICAgICBuZXdTaGFwZS5zcGxpY2UoYXhpcywgMCwgMSk7XG4gICAgfSk7XG4gICAgY29uc3QgeFJlc2hhcGVkID0gcmVzaGFwZSh7IGlucHV0czogeyB4IH0sIGF0dHJzOiB7IHNoYXBlOiBuZXdTaGFwZSB9LCBiYWNrZW5kIH0pO1xuICAgIGNvbnN0IHsgYmVnaW46IG5vcm1hbGl6ZWRCZWdpbiwgZW5kOiBub3JtYWxpemVkRW5kLCBzdHJpZGVzOiBub3JtYWxpemVkU3RyaWRlcyB9ID0gYmFja2VuZF91dGlsLnNsaWNlX3V0aWwuZ2V0Tm9ybWFsaXplZEF4ZXMoeFJlc2hhcGVkLnNoYXBlLCBlbGxpcHNpc0F4ZXMsIG51bUludGVycG9sYXRlZEF4ZXMsIGJlZ2luLCBlbmQsIHN0cmlkZXMsIGJlZ2luTWFzaywgZW5kTWFzaywgZWxsaXBzaXNNYXNrKTtcbiAgICBiZWdpbiA9IG5vcm1hbGl6ZWRCZWdpbjtcbiAgICBlbmQgPSBub3JtYWxpemVkRW5kO1xuICAgIHN0cmlkZXMgPSBub3JtYWxpemVkU3RyaWRlcztcbiAgICBjb25zdCBzaHJpbmtBeGVzID0gYmFja2VuZF91dGlsLnNsaWNlX3V0aWwubWFza1RvQXhlcyhzaHJpbmtBeGlzTWFzayk7XG4gICAgLy8gQWRqdXN0IHRoZSBlbmRzIGJhc2VkIG9uIHRoZSBzaHJpbmsgbWFzay5cbiAgICBzaHJpbmtBeGVzLmZvckVhY2goYXhpcyA9PiB7XG4gICAgICAgIGVuZFtheGlzXSA9IGJlZ2luW2F4aXNdICsgMTtcbiAgICAgICAgc3RyaWRlc1theGlzXSA9IDE7XG4gICAgfSk7XG4gICAgLy8gRmlndXJlIG91dCB0aGUgb3V0cHV0IHNoYXBlLlxuICAgIGNvbnN0IHNpemUgPSBiYWNrZW5kX3V0aWwuc2xpY2VfdXRpbC5jb21wdXRlT3V0U2hhcGUoYmVnaW4sIGVuZCwgc3RyaWRlcyk7XG4gICAgLy8gUmVtb3ZlIHRoZSBheGVzIGJhc2VkIG9uIHNocmlua01hc2suXG4gICAgY29uc3Qgb3V0U2hhcGUgPSBzaXplLmZpbHRlcigoXywgYXhpcykgPT4gc2hyaW5rQXhlcy5pbmRleE9mKGF4aXMpID09PSAtMSk7XG4gICAgY29uc3Qgbm9uU3RyaWRlZCA9IHN0cmlkZXMuZXZlcnkodiA9PiB2ID09PSAxKTtcbiAgICBpZiAobm9uU3RyaWRlZCkge1xuICAgICAgICBjb25zdCB4U2xpY2VkID0gc2xpY2UoeyBpbnB1dHM6IHsgeDogeFJlc2hhcGVkIH0sIGF0dHJzOiB7IGJlZ2luLCBzaXplIH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZURhdGEoeFJlc2hhcGVkLmRhdGFJZCk7XG4gICAgICAgIGNvbnN0IHJlc2hhcGVkID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiB4U2xpY2VkIH0sIGF0dHJzOiB7IHNoYXBlOiBvdXRTaGFwZSB9LCBiYWNrZW5kIH0pO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VEYXRhKHhTbGljZWQuZGF0YUlkKTtcbiAgICAgICAgcmV0dXJuIHJlc2hhcGVkO1xuICAgIH1cbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQob3V0U2hhcGUsICdmbG9hdDMyJyk7XG4gICAgaWYgKCFvdXRTaGFwZS5zb21lKGF4aXMgPT4gYXhpcyA9PT0gMCkpIHtcbiAgICAgICAgY29uc3QgeElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHhSZXNoYXBlZC5kYXRhSWQpLmlkO1xuICAgICAgICBjb25zdCB4U3RyaWRlc0J5dGVzID0gbmV3IFVpbnQ4QXJyYXkobmV3IEludDMyQXJyYXkodXRpbC5jb21wdXRlU3RyaWRlcyh4UmVzaGFwZWQuc2hhcGUpKS5idWZmZXIpO1xuICAgICAgICBjb25zdCBiZWdpbkJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobmV3IEludDMyQXJyYXkoYmVnaW4pLmJ1ZmZlcik7XG4gICAgICAgIGNvbnN0IGVuZEJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobmV3IEludDMyQXJyYXkoZW5kKS5idWZmZXIpO1xuICAgICAgICBjb25zdCBzdHJpZGVzQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheShzdHJpZGVzKS5idWZmZXIpO1xuICAgICAgICBjb25zdCBvdXRwdXRTaGFwZUJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobmV3IEludDMyQXJyYXkob3V0U2hhcGUpLmJ1ZmZlcik7XG4gICAgICAgIGNvbnN0IG91dFN0cmlkZXNCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KHV0aWwuY29tcHV0ZVN0cmlkZXMob3V0U2hhcGUpKS5idWZmZXIpO1xuICAgICAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICAgICAgd2FzbVN0cmlkZWRTbGljZSh4SWQsIHhTdHJpZGVzQnl0ZXMsIHhSZXNoYXBlZC5zaGFwZS5sZW5ndGgsIGJlZ2luQnl0ZXMsIGVuZEJ5dGVzLCBzdHJpZGVzQnl0ZXMsIG91dHB1dFNoYXBlQnl0ZXMsIG91dFN0cmlkZXNCeXRlcywgb3V0U2hhcGUubGVuZ3RoLCBvdXRJZCk7XG4gICAgfVxuICAgIGJhY2tlbmQuZGlzcG9zZURhdGEoeFJlc2hhcGVkLmRhdGFJZCk7XG4gICAgY29uc3QgcmVzaGFwZWQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IG91dCB9LCBhdHRyczogeyBzaGFwZTogb3V0U2hhcGUgfSwgYmFja2VuZCB9KTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VEYXRhKG91dC5kYXRhSWQpO1xuICAgIHJldHVybiByZXNoYXBlZDtcbn1cbmV4cG9ydCBjb25zdCBzdHJpZGVkU2xpY2VDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU3RyaWRlZFNsaWNlLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiBzdHJpZGVkU2xpY2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdHJpZGVkU2xpY2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3ViIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vYmluYXJ5X2tlcm5lbCc7XG5jb25zdCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QgPSB0cnVlO1xuZXhwb3J0IGNvbnN0IHN1YkNvbmZpZyA9IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyhTdWIsIHN1cHBvcnRzRnVsbEJyb2FkY2FzdCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdWIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBTdW0sIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgcGVybXV0ZUF4ZXNBbmRUcmFuc3Bvc2UgfSBmcm9tICcuL2tlcm5lbF91dGlscyc7XG5sZXQgd2FzbVN1bTtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtU3VtID0gYmFja2VuZC53YXNtLmN3cmFwKFN1bSwgbnVsbCAvKnZvaWQqLywgWydudW1iZXIsIG51bWJlciwgbnVtYmVyJ10pO1xufVxuZnVuY3Rpb24gc3VtKGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGlucHV0cywgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBheGlzLCBrZWVwRGltcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHguZGF0YUlkKS5pZDtcbiAgICBsZXQgaW5wdXRJZCA9IHhJZDtcbiAgICBsZXQgaW5wdXQgPSB4O1xuICAgIGNvbnN0IHsgdHJhbnNwb3NlZCwgYXhlcywgb3JpZ2luYWxBeGVzLCBpbnB1dFdhc1RyYW5zcG9zZWQgfSA9IHBlcm11dGVBeGVzQW5kVHJhbnNwb3NlKHgsIGF4aXMsIGJhY2tlbmQpO1xuICAgIGxldCByZWR1Y3Rpb25BeGVzID0gYXhlcztcbiAgICBpZiAoaW5wdXRXYXNUcmFuc3Bvc2VkKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zcG9zZWRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh0cmFuc3Bvc2VkLmRhdGFJZCkuaWQ7XG4gICAgICAgIGlmICh0cmFuc3Bvc2VkSWQgIT09IHhJZCkge1xuICAgICAgICAgICAgLy8gdHJhbnNwb3NlIHdhcyBub3QgYSBuby1vcC4gV2Ugd2lsbCBuZWVkIHRvIGRpc3Bvc2Ugb2YgdGhpc1xuICAgICAgICAgICAgLy8gb25jZSB3ZSBhcmUgZG9uZS5cbiAgICAgICAgICAgIGlucHV0ID0gdHJhbnNwb3NlZDtcbiAgICAgICAgICAgIGlucHV0SWQgPSB0cmFuc3Bvc2VkSWQ7XG4gICAgICAgICAgICByZWR1Y3Rpb25BeGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMocmVkdWN0aW9uQXhlcy5sZW5ndGgsIGlucHV0LnNoYXBlLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdzdW0nLCByZWR1Y3Rpb25BeGVzLCBpbnB1dC5zaGFwZS5sZW5ndGgpO1xuICAgIGNvbnN0IFtvdXRTaGFwZSwgcmVkdWNlU2hhcGVdID0gYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMoaW5wdXQuc2hhcGUsIHJlZHVjdGlvbkF4ZXMpO1xuICAgIGNvbnN0IHJlZHVjZVNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChvdXRTaGFwZSwgaW5wdXQuZHR5cGUpO1xuICAgIGlmICh1dGlsLnNpemVGcm9tU2hhcGUoaW5wdXQuc2hhcGUpICE9PSAwKSB7XG4gICAgICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgICAgICB3YXNtU3VtKGlucHV0SWQsIHJlZHVjZVNpemUsIG91dElkKTtcbiAgICB9XG4gICAgaWYgKGlucHV0V2FzVHJhbnNwb3NlZCkge1xuICAgICAgICAvLyBkaXNwb3NlIG9mIHRoZSB0cmFuc3Bvc2VkIHRlbnNvci5cbiAgICAgICAgYmFja2VuZC5kaXNwb3NlRGF0YSh0cmFuc3Bvc2VkLmRhdGFJZCk7XG4gICAgfVxuICAgIGlmIChrZWVwRGltcykge1xuICAgICAgICAvLyByZXNoYXBlXG4gICAgICAgIGNvbnN0IG5ld1NoYXBlID0gYmFja2VuZF91dGlsLmV4cGFuZFNoYXBlVG9LZWVwRGltKG91dC5zaGFwZSwgb3JpZ2luYWxBeGVzKTtcbiAgICAgICAgb3V0LnNoYXBlID0gbmV3U2hhcGU7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3Qgc3VtQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFN1bSxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogc3VtXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3VtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFRhbiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVVbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vdW5hcnlfa2VybmVsJztcbmV4cG9ydCBjb25zdCB0YW5Db25maWcgPSBjcmVhdGVVbmFyeUtlcm5lbENvbmZpZyhUYW4pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VGFuLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFRhbmggfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlVW5hcnlLZXJuZWxDb25maWcgfSBmcm9tICcuL3VuYXJ5X2tlcm5lbCc7XG5leHBvcnQgY29uc3QgdGFuaENvbmZpZyA9IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnKFRhbmgpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VGFuaC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBUaWxlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IENwcERUeXBlIH0gZnJvbSAnLi90eXBlcyc7XG5sZXQgd2FzbVRpbGU7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbVRpbGUgPSBiYWNrZW5kLndhc20uY3dyYXAoVGlsZSwgbnVsbCAvKiB2b2lkICovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInIC8vIG91dF9pZFxuICAgIF0pO1xufVxuZnVuY3Rpb24gdGlsZShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHhJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh4LmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgeyByZXBzIH0gPSBhdHRycztcbiAgICBjb25zdCBuZXdTaGFwZSA9IG5ldyBBcnJheSh4LnNoYXBlLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdTaGFwZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBuZXdTaGFwZVtpXSA9IHguc2hhcGVbaV0gKiByZXBzW2ldO1xuICAgIH1cbiAgICBjb25zdCB4U2hhcGVCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KHguc2hhcGUpLmJ1ZmZlcik7XG4gICAgY29uc3QgbmV3U2hhcGVCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KG5ld1NoYXBlKS5idWZmZXIpO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChuZXdTaGFwZSwgeC5kdHlwZSk7XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgd2FzbVRpbGUoeElkLCB4U2hhcGVCeXRlcywgeC5zaGFwZS5sZW5ndGgsIG5ld1NoYXBlQnl0ZXMsIG5ld1NoYXBlLmxlbmd0aCwgQ3BwRFR5cGVbb3V0LmR0eXBlXSwgb3V0SWQpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgdGlsZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBUaWxlLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiB0aWxlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VGlsZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBUb3BLIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IENwcERUeXBlIH0gZnJvbSAnLi90eXBlcyc7XG5sZXQgd2FzbVRvcEs7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbVRvcEsgPSBiYWNrZW5kLndhc20uY3dyYXAoVG9wSywgbnVsbCAvKiB2b2lkICovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnYm9vbCcsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICBdKTtcbn1cbmV4cG9ydCBjb25zdCB0b3BrID0gKHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9KSA9PiB7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBrLCBzb3J0ZWQgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHhJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh4LmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgeFNoYXBlQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheSh4LnNoYXBlKS5idWZmZXIpO1xuICAgIGNvbnN0IG91dHB1dFNoYXBlID0geC5zaGFwZS5zbGljZSgpO1xuICAgIG91dHB1dFNoYXBlW291dHB1dFNoYXBlLmxlbmd0aCAtIDFdID0gaztcbiAgICBjb25zdCBvdXRWYWx1ZXMgPSBiYWNrZW5kLm1ha2VPdXRwdXQob3V0cHV0U2hhcGUsIHguZHR5cGUpO1xuICAgIGNvbnN0IG91dFZhbHVlc0lkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dFZhbHVlcy5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IG91dEluZGljZXMgPSBiYWNrZW5kLm1ha2VPdXRwdXQob3V0cHV0U2hhcGUsICdpbnQzMicpO1xuICAgIGNvbnN0IG91dEluZGljZXNJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXRJbmRpY2VzLmRhdGFJZCkuaWQ7XG4gICAgd2FzbVRvcEsoeElkLCB4U2hhcGVCeXRlcywgeC5zaGFwZS5sZW5ndGgsIENwcERUeXBlW3guZHR5cGVdLCBrLCBzb3J0ZWQsIG91dFZhbHVlc0lkLCBvdXRJbmRpY2VzSWQpO1xuICAgIHJldHVybiBbb3V0VmFsdWVzLCBvdXRJbmRpY2VzXTtcbn07XG5leHBvcnQgY29uc3QgdG9wS0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBUb3BLLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiB0b3BrLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRvcEsuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgVHJhbnNmb3JtLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmxldCB3YXNtVHJhbnNmb3JtO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21UcmFuc2Zvcm0gPSBiYWNrZW5kLndhc20uY3dyYXAoVHJhbnNmb3JtLCBudWxsIC8qdm9pZCovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2Jvb2wnLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicgLy8gb3V0SWRcbiAgICBdKTtcbn1cbmZ1bmN0aW9uIHRyYW5zZm9ybShhcmdzKSB7XG4gICAgY29uc3QgeyBiYWNrZW5kLCBpbnB1dHMsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW1hZ2UsIHRyYW5zZm9ybXMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGludGVycG9sYXRpb24sIGZpbGxNb2RlLCBmaWxsVmFsdWUsIG91dHB1dFNoYXBlIH0gPSBhdHRycztcbiAgICBjb25zdCBbYmF0Y2gsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBudW1DaGFubmVsc10gPSBpbWFnZS5zaGFwZTtcbiAgICBjb25zdCBbb3V0SGVpZ2h0LCBvdXRXaWR0aF0gPSBvdXRwdXRTaGFwZSAhPSBudWxsID8gb3V0cHV0U2hhcGUgOiBbaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGhdO1xuICAgIGNvbnN0IG91dFNoYXBlID0gW2JhdGNoLCBvdXRIZWlnaHQsIG91dFdpZHRoLFxuICAgICAgICBudW1DaGFubmVsc107XG4gICAgY29uc3Qgc3RyaWRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KHV0aWwuY29tcHV0ZVN0cmlkZXMoaW1hZ2Uuc2hhcGUpKS5idWZmZXIpO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChvdXRTaGFwZSwgaW1hZ2UuZHR5cGUpO1xuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IGltYWdlRGF0YSA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChpbWFnZS5kYXRhSWQpO1xuICAgIGNvbnN0IGltYWdlSWQgPSBpbWFnZURhdGEuaWQ7XG4gICAgY29uc3QgdHJhbnNmb3Jtc0RhdGEgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQodHJhbnNmb3Jtcy5kYXRhSWQpO1xuICAgIGNvbnN0IHRyYW5zZm9ybXNJZCA9IHRyYW5zZm9ybXNEYXRhLmlkO1xuICAgIGNvbnN0IGludGVycG9sYXRpb25Nb2RlSWQgPSBpbnRlcnBvbGF0aW9uID09PSAnbmVhcmVzdCcgPyAxIDogMjtcbiAgICBsZXQgZmlsbE1vZGVJZDtcbiAgICBzd2l0Y2ggKGZpbGxNb2RlKSB7XG4gICAgICAgIGNhc2UgJ2NvbnN0YW50JzpcbiAgICAgICAgICAgIGZpbGxNb2RlSWQgPSAxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3JlZmxlY3QnOlxuICAgICAgICAgICAgZmlsbE1vZGVJZCA9IDI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnd3JhcCc6XG4gICAgICAgICAgICBmaWxsTW9kZUlkID0gMztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICduZWFyZXN0JzpcbiAgICAgICAgICAgIGZpbGxNb2RlSWQgPSA0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBmaWxsTW9kZUlkID0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB3YXNtVHJhbnNmb3JtKGltYWdlSWQsIHRyYW5zZm9ybXNJZCwgKHRyYW5zZm9ybXMuc2hhcGVbMF0gPiAxKSwgYmF0Y2gsIG91dEhlaWdodCwgb3V0V2lkdGgsIG51bUNoYW5uZWxzLCBpbWFnZVdpZHRoLCBpbWFnZUhlaWdodCwgc3RyaWRlcywgaW1hZ2Uuc2hhcGUubGVuZ3RoIC0gMSwgaW50ZXJwb2xhdGlvbk1vZGVJZCwgZmlsbE1vZGVJZCwgZmlsbFZhbHVlLCBvdXRJZCk7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCB0cmFuc2Zvcm1Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogVHJhbnNmb3JtLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiB0cmFuc2Zvcm1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1UcmFuc2Zvcm0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgVHJhbnNwb3NlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGlkZW50aXR5IH0gZnJvbSAnLi9JZGVudGl0eSc7XG5pbXBvcnQgeyBDcHBEVHlwZSB9IGZyb20gJy4vdHlwZXMnO1xubGV0IHdhc21UcmFuc3Bvc2U7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbVRyYW5zcG9zZSA9IGJhY2tlbmQud2FzbS5jd3JhcChUcmFuc3Bvc2UsIG51bGwgLyogdm9pZCAqLywgW1xuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgXSk7XG59XG5leHBvcnQgZnVuY3Rpb24gdHJhbnNwb3NlKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgLy8gUmVkdWNlIGFueSBkaW1lbnNpb25zIHdpdGggc2l6ZSBvbmUuIExvd2VyLXJhbmsgdHJhbnNwb3NlIGtlcm5lbCBwZXJmb3Jtc1xuICAgIC8vIGJldHRlciBkdWUgdG8gc2ltcGxlciBtZW1vcnkgYWNjZXNzIHBhdHRlcm4uXG4gICAgY29uc3QgW3JlZHVjZWRTaGFwZSwgcGVybV0gPSByZW1vdmVPbmVTaXplRGltcyhpbnB1dHMueC5zaGFwZSwgYXR0cnMucGVybSk7XG4gICAgbGV0IHBlcm1Jc05vT3AgPSB0cnVlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGVybS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocGVybVtpXSAhPT0gaSkge1xuICAgICAgICAgICAgcGVybUlzTm9PcCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG91dFNoYXBlID0gY29tcHV0ZU91dFNoYXBlKGlucHV0cy54LnNoYXBlLCBhdHRycy5wZXJtKTtcbiAgICBjb25zdCB4ID0ge1xuICAgICAgICBkYXRhSWQ6IGlucHV0cy54LmRhdGFJZCxcbiAgICAgICAgc2hhcGU6IHJlZHVjZWRTaGFwZSxcbiAgICAgICAgZHR5cGU6IGlucHV0cy54LmR0eXBlXG4gICAgfTtcbiAgICBpZiAocGVybUlzTm9PcCkge1xuICAgICAgICBjb25zdCBjbG9uZWQgPSBpZGVudGl0eSh7IGlucHV0cywgYmFja2VuZCB9KTtcbiAgICAgICAgY2xvbmVkLnNoYXBlID0gb3V0U2hhcGU7XG4gICAgICAgIHJldHVybiBjbG9uZWQ7XG4gICAgfVxuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChvdXRTaGFwZSwgeC5kdHlwZSk7XG4gICAgY29uc3QgeElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHguZGF0YUlkKS5pZDtcbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBwZXJtQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheShwZXJtKS5idWZmZXIpO1xuICAgIGNvbnN0IHhTaGFwZUJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobmV3IEludDMyQXJyYXkoeC5zaGFwZSkuYnVmZmVyKTtcbiAgICB3YXNtVHJhbnNwb3NlKHhJZCwgeFNoYXBlQnl0ZXMsIHguc2hhcGUubGVuZ3RoLCBDcHBEVHlwZVt4LmR0eXBlXSwgb3V0SWQsIHBlcm1CeXRlcywgcGVybS5sZW5ndGgpO1xuICAgIHJldHVybiBvdXQ7XG59XG5mdW5jdGlvbiBjb21wdXRlT3V0U2hhcGUoaW5TaGFwZSwgcGVybSkge1xuICAgIGNvbnN0IG91dFNoYXBlID0gbmV3IEFycmF5KGluU2hhcGUubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dFNoYXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG91dFNoYXBlW2ldID0gaW5TaGFwZVtwZXJtW2ldXTtcbiAgICB9XG4gICAgcmV0dXJuIG91dFNoYXBlO1xufVxuZnVuY3Rpb24gcmVtb3ZlT25lU2l6ZURpbXMoc2hhcGUsIHBlcm0pIHtcbiAgICBjb25zdCBuZXdTaGFwZSA9IFtdO1xuICAgIGNvbnN0IG5ld1Blcm0gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNoYXBlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmIChzaGFwZVtpXSAhPT0gMSkge1xuICAgICAgICAgICAgbmV3U2hhcGUucHVzaChzaGFwZVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNoYXBlW3Blcm1baV1dICE9PSAxKSB7XG4gICAgICAgICAgICBuZXdQZXJtLnB1c2gocGVybVtpXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdQZXJtLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGxldCBtaW5WYWxJZHggPSAtMTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBuZXdQZXJtLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICBpZiAobmV3UGVybVtqXSA+PSBpICYmXG4gICAgICAgICAgICAgICAgKG1pblZhbElkeCA9PT0gLTEgfHwgbmV3UGVybVttaW5WYWxJZHhdID4gbmV3UGVybVtqXSkpIHtcbiAgICAgICAgICAgICAgICBtaW5WYWxJZHggPSBqO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG5ld1Blcm1bbWluVmFsSWR4XSA9IGk7XG4gICAgfVxuICAgIHJldHVybiBbbmV3U2hhcGUsIG5ld1Blcm1dO1xufVxuZXhwb3J0IGNvbnN0IHRyYW5zcG9zZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBUcmFuc3Bvc2UsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBrZXJuZWxGdW5jOiB0cmFuc3Bvc2UsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1UcmFuc3Bvc2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgVW5wYWNrIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHNsaWNlIH0gZnJvbSAnLi9TbGljZSc7XG5mdW5jdGlvbiB1bnBhY2soYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHZhbHVlIH0gPSBpbnB1dHM7XG4gICAgbGV0IHsgYXhpcyB9ID0gYXR0cnM7XG4gICAgaWYgKGF4aXMgPCAwKSB7XG4gICAgICAgIGF4aXMgKz0gdmFsdWUuc2hhcGUubGVuZ3RoO1xuICAgIH1cbiAgICBjb25zdCBudW1PdXRwdXRzID0gdmFsdWUuc2hhcGVbYXhpc107XG4gICAgY29uc3QgcmFuayA9IHZhbHVlLnNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBvdXRTaGFwZSA9IG5ldyBBcnJheShyYW5rIC0gMSk7XG4gICAgbGV0IG91dEluZGV4ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhbms7IGkrKykge1xuICAgICAgICBpZiAoaSAhPT0gYXhpcykge1xuICAgICAgICAgICAgb3V0U2hhcGVbb3V0SW5kZXgrK10gPSB2YWx1ZS5zaGFwZVtpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBvdXRzID0gbmV3IEFycmF5KG51bU91dHB1dHMpO1xuICAgIGNvbnN0IGJlZ2luID0gbmV3IEFycmF5KHJhbmspLmZpbGwoMCk7XG4gICAgY29uc3Qgc2l6ZSA9IHZhbHVlLnNoYXBlLnNsaWNlKCk7XG4gICAgc2l6ZVtheGlzXSA9IDE7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGJlZ2luW2F4aXNdID0gaTtcbiAgICAgICAgb3V0c1tpXSA9IHNsaWNlKHsgaW5wdXRzOiB7IHg6IHZhbHVlIH0sIGF0dHJzOiB7IGJlZ2luLCBzaXplIH0sIGJhY2tlbmQgfSk7XG4gICAgfVxuICAgIHJldHVybiBvdXRzLm1hcCgoeyBkYXRhSWQsIGR0eXBlIH0pID0+ICh7IGRhdGFJZCwgZHR5cGUsIHNoYXBlOiBvdXRTaGFwZSB9KSk7XG59XG5leHBvcnQgY29uc3QgdW5wYWNrQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFVucGFjayxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIGtlcm5lbEZ1bmM6IHVucGFjayxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1VbnBhY2suanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgWmVyb3NMaWtlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmZ1bmN0aW9uIHplcm9zTGlrZShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dCh4LnNoYXBlLCB4LmR0eXBlKTtcbiAgICBjb25zdCBvdXRWYWxzID0gYmFja2VuZC50eXBlZEFycmF5RnJvbUhlYXAob3V0KTtcbiAgICBvdXRWYWxzLmZpbGwoMCk7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCB6ZXJvc0xpa2VDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogWmVyb3NMaWtlLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAga2VybmVsRnVuYzogemVyb3NMaWtlLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVplcm9zTGlrZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBfRnVzZWRNYXRNdWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgRnVzYWJsZUFjdGl2YXRpb24gfSBmcm9tICcuL3R5cGVzJztcbmxldCB3YXNtRnVzZWRNYXRNdWw7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbUZ1c2VkTWF0TXVsID0gYmFja2VuZC53YXNtLmN3cmFwKF9GdXNlZE1hdE11bCwgbnVsbCAvKiB2b2lkICovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyAvLyBvdXRfaWRcbiAgICBdKTtcbn1cbmZ1bmN0aW9uIGZ1c2VkQmF0Y2hNYXRNdWwoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGEsIGIsIGJpYXMsIHByZWx1QWN0aXZhdGlvbldlaWdodHMgfSA9IGlucHV0cztcbiAgICBpZiAoYS5kdHlwZSAhPT0gJ2Zsb2F0MzInIHx8IGIuZHR5cGUgIT09ICdmbG9hdDMyJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYF9GdXNlZE1hdE11bCBmb3Igbm9uIG5vbi1mbG9hdDMyIHRlbnNvcnMgbm90IHlldCBzdXBwb3J0ZWQuYCk7XG4gICAgfVxuICAgIGNvbnN0IHsgdHJhbnNwb3NlQSwgdHJhbnNwb3NlQiwgYWN0aXZhdGlvbiwgbGVha3lyZWx1QWxwaGEgfSA9IGF0dHJzO1xuICAgIGNvbnN0IGFJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChhLmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgYklkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGIuZGF0YUlkKS5pZDtcbiAgICBsZXQgYmlhc0lkID0gMDtcbiAgICBpZiAoYmlhcyAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGJpYXNEYXRhID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGJpYXMuZGF0YUlkKTtcbiAgICAgICAgaWYgKGJpYXNEYXRhLnNoYXBlLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBfRnVzZWRNYXRNdWwgb25seSBzdXBwb3J0cyByYW5rLTEgYmlhcyBidXQgZ290IGAgK1xuICAgICAgICAgICAgICAgIGByYW5rICR7Ymlhc0RhdGEuc2hhcGUubGVuZ3RofS5gKTtcbiAgICAgICAgfVxuICAgICAgICBiaWFzSWQgPSBiaWFzRGF0YS5pZDtcbiAgICB9XG4gICAgY29uc3QgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0c0lkID0gcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyA9PSBudWxsID9cbiAgICAgICAgMCA6XG4gICAgICAgIGJhY2tlbmQuZGF0YUlkTWFwLmdldChwcmVsdUFjdGl2YXRpb25XZWlnaHRzLmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgZnVzZWRBY3RpdmF0aW9uID0gRnVzYWJsZUFjdGl2YXRpb25bYWN0aXZhdGlvbl07XG4gICAgaWYgKGZ1c2VkQWN0aXZhdGlvbiA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHthY3RpdmF0aW9ufSBhY3RpdmF0aW9uIG5vdCB5ZXQgc3VwcG9ydGVkIGZvciBGdXNlZENvbnYyRCBgICtcbiAgICAgICAgICAgIGBpbiB0aGUgd2FzbSBiYWNrZW5kLmApO1xuICAgIH1cbiAgICBjb25zdCBsZWZ0RGltID0gdHJhbnNwb3NlQSA/IGEuc2hhcGVbMl0gOiBhLnNoYXBlWzFdO1xuICAgIGNvbnN0IHJpZ2h0RGltID0gdHJhbnNwb3NlQiA/IGIuc2hhcGVbMV0gOiBiLnNoYXBlWzJdO1xuICAgIGNvbnN0IGJhdGNoRGltID0gYS5zaGFwZVswXTtcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoW2JhdGNoRGltLCBsZWZ0RGltLCByaWdodERpbV0sIGEuZHR5cGUpO1xuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IGFTaGFwZUJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobmV3IEludDMyQXJyYXkoYS5zaGFwZSkuYnVmZmVyKTtcbiAgICBjb25zdCBiU2hhcGVCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KGIuc2hhcGUpLmJ1ZmZlcik7XG4gICAgd2FzbUZ1c2VkTWF0TXVsKGFJZCwgYVNoYXBlQnl0ZXMsIGEuc2hhcGUubGVuZ3RoLCBiSWQsIGJTaGFwZUJ5dGVzLCBiLnNoYXBlLmxlbmd0aCwgdHJhbnNwb3NlQSwgdHJhbnNwb3NlQiwgZnVzZWRBY3RpdmF0aW9uLCBiaWFzSWQsIHByZWx1QWN0aXZhdGlvbldlaWdodHNJZCwgbGVha3lyZWx1QWxwaGEgfHwgMCwgb3V0SWQpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgZnVzZWRNYXRNdWxDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogX0Z1c2VkTWF0TXVsLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiBmdXNlZEJhdGNoTWF0TXVsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9X0Z1c2VkTWF0TXVsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBDcHBEVHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyhrZXJuZWxOYW1lLCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QsIGR0eXBlKSB7XG4gICAgbGV0IHdhc21GdW5jO1xuICAgIGZ1bmN0aW9uIHNldHVwRnVuYyhiYWNrZW5kKSB7XG4gICAgICAgIHdhc21GdW5jID0gYmFja2VuZC53YXNtLmN3cmFwKGtlcm5lbE5hbWUsIG51bGwgLyogdm9pZCAqLywgW1xuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnYXJyYXknLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdhcnJheScsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicgLy8gb3V0X2lkXG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBrZXJuZWxGdW5jKGFyZ3MpIHtcbiAgICAgICAgY29uc3QgeyBiYWNrZW5kLCBpbnB1dHMgfSA9IGFyZ3M7XG4gICAgICAgIGNvbnN0IHsgYSwgYiB9ID0gaW5wdXRzO1xuICAgICAgICBjb25zdCBhSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoYS5kYXRhSWQpLmlkO1xuICAgICAgICBjb25zdCBiSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoYi5kYXRhSWQpLmlkO1xuICAgICAgICBjb25zdCBvdXRwdXRUeXBlID0gZHR5cGUgIT0gbnVsbCA/IGR0eXBlIDogYS5kdHlwZTtcbiAgICAgICAgY29uc3QgbmV3U2hhcGUgPSBiYWNrZW5kX3V0aWwuYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoYS5zaGFwZSwgYi5zaGFwZSk7XG4gICAgICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChuZXdTaGFwZSwgb3V0cHV0VHlwZSk7XG4gICAgICAgIC8vIFNob3J0LWNpcmN1aXQgemVyby1zaXplZCB0ZW5zb3JzLlxuICAgICAgICBpZiAodXRpbC5zaXplRnJvbVNoYXBlKG5ld1NoYXBlKSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhU2hhcGVCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KGEuc2hhcGUpLmJ1ZmZlcik7XG4gICAgICAgIGNvbnN0IGJTaGFwZUJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobmV3IEludDMyQXJyYXkoYi5zaGFwZSkuYnVmZmVyKTtcbiAgICAgICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgICAgIGNvbnN0IGtlcm5lbEZ1bmMgPSAoKSA9PiB3YXNtRnVuYyhhSWQsIGFTaGFwZUJ5dGVzLCBhLnNoYXBlLmxlbmd0aCwgYklkLCBiU2hhcGVCeXRlcywgYi5zaGFwZS5sZW5ndGgsIENwcERUeXBlW2EuZHR5cGVdLCBvdXRJZCk7XG4gICAgICAgIC8vIEN1cnJlbnRseSBvbmx5IHNvbWUgZmxvYXQgb3BlcmF0aW9ucyBzdXBwb3J0IGZ1bGwgYnJvYWRjYXN0LlxuICAgICAgICBpZiAoc3VwcG9ydHNGdWxsQnJvYWRjYXN0ICYmIGEuZHR5cGUgPT09ICdmbG9hdDMyJykge1xuICAgICAgICAgICAga2VybmVsRnVuYygpO1xuICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhQnJvYWRjYXN0RGltcyA9IGJhY2tlbmRfdXRpbC5nZXRCcm9hZGNhc3REaW1zKGEuc2hhcGUsIG5ld1NoYXBlKTtcbiAgICAgICAgY29uc3QgYkJyb2FkY2FzdERpbXMgPSBiYWNrZW5kX3V0aWwuZ2V0QnJvYWRjYXN0RGltcyhiLnNoYXBlLCBuZXdTaGFwZSk7XG4gICAgICAgIGNvbnN0IGxvb3BzT3ZlckFsbE9mQSA9IGFCcm9hZGNhc3REaW1zLmV2ZXJ5KCh2LCBpKSA9PiB2ID09PSBpKTtcbiAgICAgICAgY29uc3QgbG9vcHNPdmVyQWxsT2ZCID0gYkJyb2FkY2FzdERpbXMuZXZlcnkoKHYsIGkpID0+IHYgPT09IGkpO1xuICAgICAgICBpZiAobG9vcHNPdmVyQWxsT2ZBICYmIGxvb3BzT3ZlckFsbE9mQikge1xuICAgICAgICAgICAga2VybmVsRnVuYygpO1xuICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQnJvYWRjYXN0aW5nIGFsb25nIG91dGVyIGRpbXMgaXMgbm90IHlldCBgICtcbiAgICAgICAgICAgICAgICBgc3VwcG9ydGVkIGZvciAke2EuZHR5cGV9ICR7a2VybmVsTmFtZX0uYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsga2VybmVsTmFtZSwgYmFja2VuZE5hbWU6ICd3YXNtJywgc2V0dXBGdW5jLCBrZXJuZWxGdW5jIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iaW5hcnlfa2VybmVsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB0cmFuc3Bvc2UgfSBmcm9tICcuL1RyYW5zcG9zZSc7XG4vKipcbiAqIENvbXB1dGUgcGVybXV0YXRpb24gYXhlcyBhbmQgZG8gYSB0cmFuc3Bvc2UgaWYgbmVjZXNzYXJ5LlxuICpcbiAqIFVzZWQgYnkgcmVkdWN0aW9uIG9wcy5cbiAqIEBwYXJhbSB4IGlucHV0IFRlbnNvckluZm9cbiAqIEBwYXJhbSBheGlzIHJlZHVjdGlvbiBheGVzXG4gKiBAcGFyYW0gYmFja2VuZCB3YXNtIGJhY2tlbmQgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBlcm11dGVBeGVzQW5kVHJhbnNwb3NlKHgsIGF4aXMsIGJhY2tlbmQpIHtcbiAgICBjb25zdCB4U2hhcGUgPSB4LnNoYXBlO1xuICAgIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3Qgb3JpZ2luYWxBeGVzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShheGlzLCB4U2hhcGUpO1xuICAgIGxldCBheGVzID0gb3JpZ2luYWxBeGVzO1xuICAgIGNvbnN0IHBlcm11dGVkQXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oYXhlcywgeFJhbmspO1xuICAgIGxldCB4VHJhbnNwb3NlZCA9IG51bGw7XG4gICAgbGV0IGlucHV0V2FzVHJhbnNwb3NlZCA9IGZhbHNlO1xuICAgIGlmIChwZXJtdXRlZEF4ZXMgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBuZXdTaGFwZSA9IG5ldyBBcnJheSh4UmFuayk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3U2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIG5ld1NoYXBlW2ldID0geFNoYXBlW3Blcm11dGVkQXhlc1tpXV07XG4gICAgICAgIH1cbiAgICAgICAgYXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRJbm5lck1vc3RBeGVzKGF4ZXMubGVuZ3RoLCB4UmFuayk7XG4gICAgICAgIHhUcmFuc3Bvc2VkID1cbiAgICAgICAgICAgIHRyYW5zcG9zZSh7IGlucHV0czogeyB4IH0sIGF0dHJzOiB7IHBlcm06IHBlcm11dGVkQXhlcyB9LCBiYWNrZW5kIH0pO1xuICAgICAgICBjb25zdCB4SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeC5kYXRhSWQpLmlkO1xuICAgICAgICBjb25zdCB0cmFuc3Bvc2VkSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeFRyYW5zcG9zZWQuZGF0YUlkKS5pZDtcbiAgICAgICAgaWYgKHRyYW5zcG9zZWRJZCAhPT0geElkKSB7XG4gICAgICAgICAgICBpbnB1dFdhc1RyYW5zcG9zZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IHRyYW5zcG9zZWQ6IHhUcmFuc3Bvc2VkLCBvcmlnaW5hbEF4ZXMsIGF4ZXMsIGlucHV0V2FzVHJhbnNwb3NlZCB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9a2VybmVsX3V0aWxzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8vIFRoaXMgZW51bSBtdXN0IGFsaWduIHdpdGggdGhlIGVudW0gZGVmaW5lZCBpbiBjYy9iYWNrZW5kLmguXG5leHBvcnQgdmFyIENwcERUeXBlO1xuKGZ1bmN0aW9uIChDcHBEVHlwZSkge1xuICAgIENwcERUeXBlW0NwcERUeXBlW1wiZmxvYXQzMlwiXSA9IDBdID0gXCJmbG9hdDMyXCI7XG4gICAgQ3BwRFR5cGVbQ3BwRFR5cGVbXCJpbnQzMlwiXSA9IDFdID0gXCJpbnQzMlwiO1xuICAgIENwcERUeXBlW0NwcERUeXBlW1wiYm9vbFwiXSA9IDJdID0gXCJib29sXCI7XG4gICAgQ3BwRFR5cGVbQ3BwRFR5cGVbXCJzdHJpbmdcIl0gPSAzXSA9IFwic3RyaW5nXCI7XG4gICAgQ3BwRFR5cGVbQ3BwRFR5cGVbXCJjb21wbGV4NjRcIl0gPSA0XSA9IFwiY29tcGxleDY0XCI7XG59KShDcHBEVHlwZSB8fCAoQ3BwRFR5cGUgPSB7fSkpO1xuLy8gTXVzdCBtYXRjaCBlbnVtIGluIGNjL2Z1c2FibGVfYWN0aXZhdGlvbnMuaC5cbmV4cG9ydCB2YXIgRnVzYWJsZUFjdGl2YXRpb247XG4oZnVuY3Rpb24gKEZ1c2FibGVBY3RpdmF0aW9uKSB7XG4gICAgRnVzYWJsZUFjdGl2YXRpb25bRnVzYWJsZUFjdGl2YXRpb25bXCJsaW5lYXJcIl0gPSAwXSA9IFwibGluZWFyXCI7XG4gICAgRnVzYWJsZUFjdGl2YXRpb25bRnVzYWJsZUFjdGl2YXRpb25bXCJyZWx1XCJdID0gMV0gPSBcInJlbHVcIjtcbiAgICBGdXNhYmxlQWN0aXZhdGlvbltGdXNhYmxlQWN0aXZhdGlvbltcInJlbHU2XCJdID0gMl0gPSBcInJlbHU2XCI7XG4gICAgRnVzYWJsZUFjdGl2YXRpb25bRnVzYWJsZUFjdGl2YXRpb25bXCJwcmVsdVwiXSA9IDNdID0gXCJwcmVsdVwiO1xuICAgIEZ1c2FibGVBY3RpdmF0aW9uW0Z1c2FibGVBY3RpdmF0aW9uW1wibGVha3lyZWx1XCJdID0gNF0gPSBcImxlYWt5cmVsdVwiO1xuICAgIEZ1c2FibGVBY3RpdmF0aW9uW0Z1c2FibGVBY3RpdmF0aW9uW1wic2lnbW9pZFwiXSA9IDVdID0gXCJzaWdtb2lkXCI7XG59KShGdXNhYmxlQWN0aXZhdGlvbiB8fCAoRnVzYWJsZUFjdGl2YXRpb24gPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHlwZXMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVW5hcnlLZXJuZWxDb25maWcoa2VybmVsTmFtZSkge1xuICAgIGxldCB3YXNtRnVuYztcbiAgICBmdW5jdGlvbiBzZXR1cEZ1bmMoYmFja2VuZCkge1xuICAgICAgICB3YXNtRnVuYyA9XG4gICAgICAgICAgICBiYWNrZW5kLndhc20uY3dyYXAoa2VybmVsTmFtZSwgbnVsbCAvKiB2b2lkICovLCBbJ251bWJlcicsICdudW1iZXInXSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGtlcm5lbEZ1bmMoYXJncykge1xuICAgICAgICBjb25zdCB7IGJhY2tlbmQsIGlucHV0czogeyB4IH0gfSA9IGFyZ3M7XG4gICAgICAgIGNvbnN0IHhJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh4LmRhdGFJZCkuaWQ7XG4gICAgICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dCh4LnNoYXBlLCB4LmR0eXBlKTtcbiAgICAgICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgICAgIC8vIFNob3J0LWNpcmN1aXQgemVyby1zaXplZCB0ZW5zb3JzLlxuICAgICAgICBpZiAodXRpbC5zaXplRnJvbVNoYXBlKG91dC5zaGFwZSkgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBvdXQ7XG4gICAgICAgIH1cbiAgICAgICAgd2FzbUZ1bmMoeElkLCBvdXRJZCk7XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuICAgIHJldHVybiB7IGtlcm5lbE5hbWUsIGJhY2tlbmROYW1lOiAnd2FzbScsIHNldHVwRnVuYywga2VybmVsRnVuYyB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dW5hcnlfa2VybmVsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8vIFdlIGV4cGxpY2l0bHkgaW1wb3J0IHRoZSBtb2R1bGFyIGtlcm5lbHMgc28gdGhleSBnZXQgcmVnaXN0ZXJlZCBpbiB0aGVcbi8vIGdsb2JhbCByZWdpc3RyeSB3aGVuIHdlIGNvbXBpbGUgdGhlIGxpYnJhcnkuIEEgbW9kdWxhciBidWlsZCB3b3VsZCByZXBsYWNlXG4vLyB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFuZCBpbXBvcnQgb25seSB0aGUga2VybmVscyB0aGF0IGFyZSBuZWVkZWQuXG5pbXBvcnQgeyByZWdpc3Rlcktlcm5lbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBmdXNlZE1hdE11bENvbmZpZyB9IGZyb20gJy4va2VybmVscy9fRnVzZWRNYXRNdWwnO1xuaW1wb3J0IHsgYWJzQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0Ficyc7XG5pbXBvcnQgeyBhZGRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQWRkJztcbmltcG9ydCB7IGFkZE5Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvQWRkTic7XG5pbXBvcnQgeyBhbGxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQWxsJztcbmltcG9ydCB7IGFueUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9BbnknO1xuaW1wb3J0IHsgYXJnTWF4Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0FyZ01heCc7XG5pbXBvcnQgeyBhdmdQb29sQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0F2Z1Bvb2wnO1xuaW1wb3J0IHsgYmF0Y2hNYXRNdWxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQmF0Y2hNYXRNdWwnO1xuaW1wb3J0IHsgYmF0Y2hUb1NwYWNlTkRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQmF0Y2hUb1NwYWNlTkQnO1xuaW1wb3J0IHsgY2FzdENvbmZpZyB9IGZyb20gJy4va2VybmVscy9DYXN0JztcbmltcG9ydCB7IGNlaWxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQ2VpbCc7XG5pbXBvcnQgeyBjbGlwQnlWYWx1ZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9DbGlwQnlWYWx1ZSc7XG5pbXBvcnQgeyBjb25jYXRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQ29uY2F0JztcbmltcG9ydCB7IGNvbnYyRENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Db252MkQnO1xuaW1wb3J0IHsgY29udjJEQmFja3Byb3BJbnB1dENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Db252MkRCYWNrcHJvcElucHV0JztcbmltcG9ydCB7IGNvc0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9Db3MnO1xuaW1wb3J0IHsgY29zaENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Db3NoJztcbmltcG9ydCB7IGNyb3BBbmRSZXNpemVDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQ3JvcEFuZFJlc2l6ZSc7XG5pbXBvcnQgeyBjdW1zdW1Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvQ3Vtc3VtJztcbmltcG9ydCB7IGRlcHRoVG9TcGFjZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9EZXB0aFRvU3BhY2UnO1xuaW1wb3J0IHsgZGVwdGh3aXNlQ29udjJkTmF0aXZlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0RlcHRod2lzZUNvbnYyZE5hdGl2ZSc7XG5pbXBvcnQgeyBlcXVhbENvbmZpZyB9IGZyb20gJy4va2VybmVscy9FcXVhbCc7XG5pbXBvcnQgeyBleHBDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRXhwJztcbmltcG9ydCB7IGV4cGFuZERpbXNDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRXhwYW5kRGltcyc7XG5pbXBvcnQgeyBmaWxsQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0ZpbGwnO1xuaW1wb3J0IHsgZmxpcExlZnRSaWdodENvbmZpZyB9IGZyb20gJy4va2VybmVscy9GbGlwTGVmdFJpZ2h0JztcbmltcG9ydCB7IGZsb29yQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0Zsb29yJztcbmltcG9ydCB7IGZsb29yRGl2Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0Zsb29yRGl2JztcbmltcG9ydCB7IGZ1c2VkQmF0Y2hOb3JtQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0Z1c2VkQmF0Y2hOb3JtJztcbmltcG9ydCB7IGZ1c2VkQ29udjJEQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0Z1c2VkQ29udjJEJztcbmltcG9ydCB7IGZ1c2VkRGVwdGh3aXNlQ29udjJEQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0Z1c2VkRGVwdGh3aXNlQ29udjJEJztcbmltcG9ydCB7IGdhdGhlck5kQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0dhdGhlck5kJztcbmltcG9ydCB7IGdhdGhlclYyQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0dhdGhlclYyJztcbmltcG9ydCB7IGdyZWF0ZXJDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvR3JlYXRlcic7XG5pbXBvcnQgeyBncmVhdGVyRXF1YWxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvR3JlYXRlckVxdWFsJztcbmltcG9ydCB7IGlkZW50aXR5Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0lkZW50aXR5JztcbmltcG9ydCB7IGxlYWt5UmVsdUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9MZWFreVJlbHUnO1xuaW1wb3J0IHsgbGVzc0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9MZXNzJztcbmltcG9ydCB7IGxlc3NFcXVhbENvbmZpZyB9IGZyb20gJy4va2VybmVscy9MZXNzRXF1YWwnO1xuaW1wb3J0IHsgbG9nQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0xvZyc7XG5pbXBvcnQgeyBsb2dpY2FsQW5kQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0xvZ2ljYWxBbmQnO1xuaW1wb3J0IHsgbWF4Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL01heCc7XG5pbXBvcnQgeyBtYXhpbXVtQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL01heGltdW0nO1xuaW1wb3J0IHsgbWF4UG9vbENvbmZpZyB9IGZyb20gJy4va2VybmVscy9NYXhQb29sJztcbmltcG9ydCB7IG1lYW5Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvTWVhbic7XG5pbXBvcnQgeyBtaW5Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvTWluJztcbmltcG9ydCB7IG1pbmltdW1Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvTWluaW11bSc7XG5pbXBvcnQgeyBtaXJyb3JQYWRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTWlycm9yUGFkJztcbmltcG9ydCB7IG11bHRpcGx5Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL011bHRpcGx5JztcbmltcG9ydCB7IG5lZ0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9OZWcnO1xuaW1wb3J0IHsgbm9uTWF4U3VwcHJlc3Npb25WM0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9Ob25NYXhTdXBwcmVzc2lvblYzJztcbmltcG9ydCB7IG5vbk1heFN1cHByZXNzaW9uVjRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTm9uTWF4U3VwcHJlc3Npb25WNCc7XG5pbXBvcnQgeyBub25NYXhTdXBwcmVzc2lvblY1Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL05vbk1heFN1cHByZXNzaW9uVjUnO1xuaW1wb3J0IHsgbm90RXF1YWxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTm90RXF1YWwnO1xuaW1wb3J0IHsgb25lSG90Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL09uZUhvdCc7XG5pbXBvcnQgeyBvbmVzTGlrZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9PbmVzTGlrZSc7XG5pbXBvcnQgeyBwYWNrQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1BhY2snO1xuaW1wb3J0IHsgcGFkVjJDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUGFkVjInO1xuaW1wb3J0IHsgcG93Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1Bvdyc7XG5pbXBvcnQgeyBwcmVsdUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9QcmVsdSc7XG5pbXBvcnQgeyBwcm9kQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1Byb2QnO1xuaW1wb3J0IHsgcmFuZ2VDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUmFuZ2UnO1xuaW1wb3J0IHsgcmVhbERpdkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9SZWFsRGl2JztcbmltcG9ydCB7IHJlbHVDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUmVsdSc7XG5pbXBvcnQgeyByZWx1NkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9SZWx1Nic7XG5pbXBvcnQgeyByZXNoYXBlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1Jlc2hhcGUnO1xuaW1wb3J0IHsgcmVzaXplQmlsaW5lYXJDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUmVzaXplQmlsaW5lYXInO1xuaW1wb3J0IHsgcmV2ZXJzZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9SZXZlcnNlJztcbmltcG9ydCB7IHJvdGF0ZVdpdGhPZmZzZXRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUm90YXRlV2l0aE9mZnNldCc7XG5pbXBvcnQgeyByb3VuZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Sb3VuZCc7XG5pbXBvcnQgeyByc3FydENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Sc3FydCc7XG5pbXBvcnQgeyBzY2F0dGVyTmRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU2NhdHRlck5kJztcbmltcG9ydCB7IHNlbGVjdENvbmZpZyB9IGZyb20gJy4va2VybmVscy9TZWxlY3QnO1xuaW1wb3J0IHsgc2lnbW9pZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9TaWdtb2lkJztcbmltcG9ydCB7IHNpbkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9TaW4nO1xuaW1wb3J0IHsgc2xpY2VDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU2xpY2UnO1xuaW1wb3J0IHsgc29mdG1heENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Tb2Z0bWF4JztcbmltcG9ydCB7IHNwYWNlVG9CYXRjaE5EQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NwYWNlVG9CYXRjaE5EJztcbmltcG9ydCB7IHNwbGl0VkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9TcGxpdFYnO1xuaW1wb3J0IHsgc3FydENvbmZpZyB9IGZyb20gJy4va2VybmVscy9TcXJ0JztcbmltcG9ydCB7IHNxdWFyZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9TcXVhcmUnO1xuaW1wb3J0IHsgc3F1YXJlZERpZmZlcmVuY2VDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3F1YXJlZERpZmZlcmVuY2UnO1xuaW1wb3J0IHsgc3RlcENvbmZpZyB9IGZyb20gJy4va2VybmVscy9TdGVwJztcbmltcG9ydCB7IHN0cmlkZWRTbGljZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9TdHJpZGVkU2xpY2UnO1xuaW1wb3J0IHsgc3ViQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1N1Yic7XG5pbXBvcnQgeyBzdW1Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3VtJztcbmltcG9ydCB7IHRhbkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9UYW4nO1xuaW1wb3J0IHsgdGFuaENvbmZpZyB9IGZyb20gJy4va2VybmVscy9UYW5oJztcbmltcG9ydCB7IHRpbGVDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvVGlsZSc7XG5pbXBvcnQgeyB0b3BLQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1RvcEsnO1xuaW1wb3J0IHsgdHJhbnNmb3JtQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1RyYW5zZm9ybSc7XG5pbXBvcnQgeyB0cmFuc3Bvc2VDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvVHJhbnNwb3NlJztcbmltcG9ydCB7IHVucGFja0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9VbnBhY2snO1xuaW1wb3J0IHsgemVyb3NMaWtlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1plcm9zTGlrZSc7XG4vLyBMaXN0IGFsbCBrZXJuZWwgY29uZmlncyBoZXJlXG5jb25zdCBrZXJuZWxDb25maWdzID0gW1xuICAgIGFic0NvbmZpZyxcbiAgICBhZGRDb25maWcsXG4gICAgYWRkTkNvbmZpZyxcbiAgICBhbGxDb25maWcsXG4gICAgYW55Q29uZmlnLFxuICAgIGFyZ01heENvbmZpZyxcbiAgICBhdmdQb29sQ29uZmlnLFxuICAgIGJhdGNoTWF0TXVsQ29uZmlnLFxuICAgIGJhdGNoVG9TcGFjZU5EQ29uZmlnLFxuICAgIGNhc3RDb25maWcsXG4gICAgY2VpbENvbmZpZyxcbiAgICBjbGlwQnlWYWx1ZUNvbmZpZyxcbiAgICBjb25jYXRDb25maWcsXG4gICAgY29udjJEQ29uZmlnLFxuICAgIGNvbnYyREJhY2twcm9wSW5wdXRDb25maWcsXG4gICAgY29zQ29uZmlnLFxuICAgIGNvc2hDb25maWcsXG4gICAgY3JvcEFuZFJlc2l6ZUNvbmZpZyxcbiAgICBjdW1zdW1Db25maWcsXG4gICAgZGVwdGhUb1NwYWNlQ29uZmlnLFxuICAgIGRlcHRod2lzZUNvbnYyZE5hdGl2ZUNvbmZpZyxcbiAgICBlcXVhbENvbmZpZyxcbiAgICBleHBDb25maWcsXG4gICAgZXhwYW5kRGltc0NvbmZpZyxcbiAgICBmaWxsQ29uZmlnLFxuICAgIGZsaXBMZWZ0UmlnaHRDb25maWcsXG4gICAgZmxvb3JDb25maWcsXG4gICAgZmxvb3JEaXZDb25maWcsXG4gICAgZnVzZWRNYXRNdWxDb25maWcsXG4gICAgZnVzZWRCYXRjaE5vcm1Db25maWcsXG4gICAgZnVzZWRDb252MkRDb25maWcsXG4gICAgZnVzZWREZXB0aHdpc2VDb252MkRDb25maWcsXG4gICAgZ2F0aGVyTmRDb25maWcsXG4gICAgZ2F0aGVyVjJDb25maWcsXG4gICAgZ3JlYXRlckNvbmZpZyxcbiAgICBncmVhdGVyRXF1YWxDb25maWcsXG4gICAgaWRlbnRpdHlDb25maWcsXG4gICAgbGVha3lSZWx1Q29uZmlnLFxuICAgIGxlc3NDb25maWcsXG4gICAgbGVzc0VxdWFsQ29uZmlnLFxuICAgIGxvZ0NvbmZpZyxcbiAgICBsb2dpY2FsQW5kQ29uZmlnLFxuICAgIG1heENvbmZpZyxcbiAgICBtYXhpbXVtQ29uZmlnLFxuICAgIG1heFBvb2xDb25maWcsXG4gICAgbWVhbkNvbmZpZyxcbiAgICBtaW5Db25maWcsXG4gICAgbWluaW11bUNvbmZpZyxcbiAgICBtaXJyb3JQYWRDb25maWcsXG4gICAgbXVsdGlwbHlDb25maWcsXG4gICAgbmVnQ29uZmlnLFxuICAgIG5vbk1heFN1cHByZXNzaW9uVjNDb25maWcsXG4gICAgbm9uTWF4U3VwcHJlc3Npb25WNENvbmZpZyxcbiAgICBub25NYXhTdXBwcmVzc2lvblY1Q29uZmlnLFxuICAgIG5vdEVxdWFsQ29uZmlnLFxuICAgIG9uZUhvdENvbmZpZyxcbiAgICBvbmVzTGlrZUNvbmZpZyxcbiAgICBwYWNrQ29uZmlnLFxuICAgIHBhZFYyQ29uZmlnLFxuICAgIHBvd0NvbmZpZyxcbiAgICBwcmVsdUNvbmZpZyxcbiAgICBwcm9kQ29uZmlnLFxuICAgIHJhbmdlQ29uZmlnLFxuICAgIHJlYWxEaXZDb25maWcsXG4gICAgcmVsdUNvbmZpZyxcbiAgICByZWx1NkNvbmZpZyxcbiAgICByZXNoYXBlQ29uZmlnLFxuICAgIHJlc2l6ZUJpbGluZWFyQ29uZmlnLFxuICAgIHJldmVyc2VDb25maWcsXG4gICAgcm90YXRlV2l0aE9mZnNldENvbmZpZyxcbiAgICByc3FydENvbmZpZyxcbiAgICByb3VuZENvbmZpZyxcbiAgICBzY2F0dGVyTmRDb25maWcsXG4gICAgc2VsZWN0Q29uZmlnLFxuICAgIHNpZ21vaWRDb25maWcsXG4gICAgc2luQ29uZmlnLFxuICAgIHNsaWNlQ29uZmlnLFxuICAgIHNvZnRtYXhDb25maWcsXG4gICAgc3BhY2VUb0JhdGNoTkRDb25maWcsXG4gICAgc3BsaXRWQ29uZmlnLFxuICAgIHNxcnRDb25maWcsXG4gICAgc3F1YXJlQ29uZmlnLFxuICAgIHNxdWFyZWREaWZmZXJlbmNlQ29uZmlnLFxuICAgIHN0ZXBDb25maWcsXG4gICAgc3RyaWRlZFNsaWNlQ29uZmlnLFxuICAgIHN1YkNvbmZpZyxcbiAgICBzdW1Db25maWcsXG4gICAgdGFuQ29uZmlnLFxuICAgIHRhbmhDb25maWcsXG4gICAgdGlsZUNvbmZpZyxcbiAgICB0b3BLQ29uZmlnLFxuICAgIHRyYW5zZm9ybUNvbmZpZyxcbiAgICB0cmFuc3Bvc2VDb25maWcsXG4gICAgdW5wYWNrQ29uZmlnLFxuICAgIHplcm9zTGlrZUNvbmZpZ1xuXTtcbmZvciAoY29uc3Qga2VybmVsQ29uZmlnIG9mIGtlcm5lbENvbmZpZ3MpIHtcbiAgICByZWdpc3Rlcktlcm5lbChrZXJuZWxDb25maWcpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVnaXN0ZXJfYWxsX2tlcm5lbHMuanMubWFwIiwiLyoqIEBsaWNlbnNlIFNlZSB0aGUgTElDRU5TRSBmaWxlLiAqL1xuLy8gVGhpcyBjb2RlIGlzIGF1dG8tZ2VuZXJhdGVkLCBkbyBub3QgbW9kaWZ5IHRoaXMgZmlsZSFcbmNvbnN0IHZlcnNpb24gPSAnMy44LjAnO1xuZXhwb3J0IHsgdmVyc2lvbiB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dmVyc2lvbi5qcy5tYXAiLCJcbnZhciBXYXNtQmFja2VuZE1vZHVsZVRocmVhZGVkU2ltZCA9IChmdW5jdGlvbigpIHtcbiAgdmFyIF9zY3JpcHREaXIgPSB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQgPyBkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYyA6IHVuZGVmaW5lZDtcbiAgaWYgKHR5cGVvZiBfX2ZpbGVuYW1lICE9PSAndW5kZWZpbmVkJykgX3NjcmlwdERpciA9IF9zY3JpcHREaXIgfHwgX19maWxlbmFtZTtcbiAgcmV0dXJuIChcbmZ1bmN0aW9uKFdhc21CYWNrZW5kTW9kdWxlVGhyZWFkZWRTaW1kKSB7XG4gIFdhc21CYWNrZW5kTW9kdWxlVGhyZWFkZWRTaW1kID0gV2FzbUJhY2tlbmRNb2R1bGVUaHJlYWRlZFNpbWQgfHwge307XG5cbmZ1bmN0aW9uIEdST1dBQkxFX0hFQVBfSTgoKXtpZih3YXNtTWVtb3J5LmJ1ZmZlciE9YnVmZmVyKXt1cGRhdGVHbG9iYWxCdWZmZXJBbmRWaWV3cyh3YXNtTWVtb3J5LmJ1ZmZlcil9cmV0dXJuIEhFQVA4fWZ1bmN0aW9uIEdST1dBQkxFX0hFQVBfVTgoKXtpZih3YXNtTWVtb3J5LmJ1ZmZlciE9YnVmZmVyKXt1cGRhdGVHbG9iYWxCdWZmZXJBbmRWaWV3cyh3YXNtTWVtb3J5LmJ1ZmZlcil9cmV0dXJuIEhFQVBVOH1mdW5jdGlvbiBHUk9XQUJMRV9IRUFQX0kzMigpe2lmKHdhc21NZW1vcnkuYnVmZmVyIT1idWZmZXIpe3VwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzKHdhc21NZW1vcnkuYnVmZmVyKX1yZXR1cm4gSEVBUDMyfWZ1bmN0aW9uIEdST1dBQkxFX0hFQVBfVTMyKCl7aWYod2FzbU1lbW9yeS5idWZmZXIhPWJ1ZmZlcil7dXBkYXRlR2xvYmFsQnVmZmVyQW5kVmlld3Mod2FzbU1lbW9yeS5idWZmZXIpfXJldHVybiBIRUFQVTMyfWZ1bmN0aW9uIEdST1dBQkxFX0hFQVBfRjY0KCl7aWYod2FzbU1lbW9yeS5idWZmZXIhPWJ1ZmZlcil7dXBkYXRlR2xvYmFsQnVmZmVyQW5kVmlld3Mod2FzbU1lbW9yeS5idWZmZXIpfXJldHVybiBIRUFQRjY0fXZhciBNb2R1bGU9dHlwZW9mIFdhc21CYWNrZW5kTW9kdWxlVGhyZWFkZWRTaW1kIT09XCJ1bmRlZmluZWRcIj9XYXNtQmFja2VuZE1vZHVsZVRocmVhZGVkU2ltZDp7fTt2YXIgcmVhZHlQcm9taXNlUmVzb2x2ZSxyZWFkeVByb21pc2VSZWplY3Q7TW9kdWxlW1wicmVhZHlcIl09bmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSxyZWplY3Qpe3JlYWR5UHJvbWlzZVJlc29sdmU9cmVzb2x2ZTtyZWFkeVByb21pc2VSZWplY3Q9cmVqZWN0fSk7dmFyIG1vZHVsZU92ZXJyaWRlcz17fTt2YXIga2V5O2ZvcihrZXkgaW4gTW9kdWxlKXtpZihNb2R1bGUuaGFzT3duUHJvcGVydHkoa2V5KSl7bW9kdWxlT3ZlcnJpZGVzW2tleV09TW9kdWxlW2tleV19fXZhciBhcmd1bWVudHNfPVtdO3ZhciB0aGlzUHJvZ3JhbT1cIi4vdGhpcy5wcm9ncmFtXCI7dmFyIHF1aXRfPWZ1bmN0aW9uKHN0YXR1cyx0b1Rocm93KXt0aHJvdyB0b1Rocm93fTt2YXIgRU5WSVJPTk1FTlRfSVNfV0VCPWZhbHNlO3ZhciBFTlZJUk9OTUVOVF9JU19XT1JLRVI9ZmFsc2U7dmFyIEVOVklST05NRU5UX0lTX05PREU9ZmFsc2U7dmFyIEVOVklST05NRU5UX0lTX1NIRUxMPWZhbHNlO0VOVklST05NRU5UX0lTX1dFQj10eXBlb2Ygd2luZG93PT09XCJvYmplY3RcIjtFTlZJUk9OTUVOVF9JU19XT1JLRVI9dHlwZW9mIGltcG9ydFNjcmlwdHM9PT1cImZ1bmN0aW9uXCI7RU5WSVJPTk1FTlRfSVNfTk9ERT10eXBlb2YgcHJvY2Vzcz09PVwib2JqZWN0XCImJnR5cGVvZiBwcm9jZXNzLnZlcnNpb25zPT09XCJvYmplY3RcIiYmdHlwZW9mIHByb2Nlc3MudmVyc2lvbnMubm9kZT09PVwic3RyaW5nXCI7RU5WSVJPTk1FTlRfSVNfU0hFTEw9IUVOVklST05NRU5UX0lTX1dFQiYmIUVOVklST05NRU5UX0lTX05PREUmJiFFTlZJUk9OTUVOVF9JU19XT1JLRVI7dmFyIEVOVklST05NRU5UX0lTX1BUSFJFQUQ9TW9kdWxlW1wiRU5WSVJPTk1FTlRfSVNfUFRIUkVBRFwiXXx8ZmFsc2U7aWYoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRCl7YnVmZmVyPU1vZHVsZVtcImJ1ZmZlclwiXX12YXIgc2NyaXB0RGlyZWN0b3J5PVwiXCI7ZnVuY3Rpb24gbG9jYXRlRmlsZShwYXRoKXtpZihNb2R1bGVbXCJsb2NhdGVGaWxlXCJdKXtyZXR1cm4gTW9kdWxlW1wibG9jYXRlRmlsZVwiXShwYXRoLHNjcmlwdERpcmVjdG9yeSl9cmV0dXJuIHNjcmlwdERpcmVjdG9yeStwYXRofXZhciByZWFkXyxyZWFkQXN5bmMscmVhZEJpbmFyeSxzZXRXaW5kb3dUaXRsZTt2YXIgbm9kZUZTO3ZhciBub2RlUGF0aDtpZihFTlZJUk9OTUVOVF9JU19OT0RFKXtpZihFTlZJUk9OTUVOVF9JU19XT1JLRVIpe3NjcmlwdERpcmVjdG9yeT1yZXF1aXJlKFwicGF0aFwiKS5kaXJuYW1lKHNjcmlwdERpcmVjdG9yeSkrXCIvXCJ9ZWxzZXtzY3JpcHREaXJlY3Rvcnk9X19kaXJuYW1lK1wiL1wifXJlYWRfPWZ1bmN0aW9uIHNoZWxsX3JlYWQoZmlsZW5hbWUsYmluYXJ5KXtpZighbm9kZUZTKW5vZGVGUz1yZXF1aXJlKFwiZnNcIik7aWYoIW5vZGVQYXRoKW5vZGVQYXRoPXJlcXVpcmUoXCJwYXRoXCIpO2ZpbGVuYW1lPW5vZGVQYXRoW1wibm9ybWFsaXplXCJdKGZpbGVuYW1lKTtyZXR1cm4gbm9kZUZTW1wicmVhZEZpbGVTeW5jXCJdKGZpbGVuYW1lLGJpbmFyeT9udWxsOlwidXRmOFwiKX07cmVhZEJpbmFyeT1mdW5jdGlvbiByZWFkQmluYXJ5KGZpbGVuYW1lKXt2YXIgcmV0PXJlYWRfKGZpbGVuYW1lLHRydWUpO2lmKCFyZXQuYnVmZmVyKXtyZXQ9bmV3IFVpbnQ4QXJyYXkocmV0KX1hc3NlcnQocmV0LmJ1ZmZlcik7cmV0dXJuIHJldH07aWYocHJvY2Vzc1tcImFyZ3ZcIl0ubGVuZ3RoPjEpe3RoaXNQcm9ncmFtPXByb2Nlc3NbXCJhcmd2XCJdWzFdLnJlcGxhY2UoL1xcXFwvZyxcIi9cIil9YXJndW1lbnRzXz1wcm9jZXNzW1wiYXJndlwiXS5zbGljZSgyKTtwcm9jZXNzW1wib25cIl0oXCJ1bmNhdWdodEV4Y2VwdGlvblwiLGZ1bmN0aW9uKGV4KXtpZighKGV4IGluc3RhbmNlb2YgRXhpdFN0YXR1cykpe3Rocm93IGV4fX0pO3Byb2Nlc3NbXCJvblwiXShcInVuaGFuZGxlZFJlamVjdGlvblwiLGFib3J0KTtxdWl0Xz1mdW5jdGlvbihzdGF0dXMpe3Byb2Nlc3NbXCJleGl0XCJdKHN0YXR1cyl9O01vZHVsZVtcImluc3BlY3RcIl09ZnVuY3Rpb24oKXtyZXR1cm5cIltFbXNjcmlwdGVuIE1vZHVsZSBvYmplY3RdXCJ9O3ZhciBub2RlV29ya2VyVGhyZWFkczt0cnl7bm9kZVdvcmtlclRocmVhZHM9cmVxdWlyZShcIndvcmtlcl90aHJlYWRzXCIpfWNhdGNoKGUpe2NvbnNvbGUuZXJyb3IoJ1RoZSBcIndvcmtlcl90aHJlYWRzXCIgbW9kdWxlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBub2RlLmpzIGJ1aWxkIC0gcGVyaGFwcyBhIG5ld2VyIHZlcnNpb24gaXMgbmVlZGVkPycpO3Rocm93IGV9Z2xvYmFsLldvcmtlcj1ub2RlV29ya2VyVGhyZWFkcy5Xb3JrZXJ9ZWxzZSBpZihFTlZJUk9OTUVOVF9JU19TSEVMTCl7aWYodHlwZW9mIHJlYWQhPVwidW5kZWZpbmVkXCIpe3JlYWRfPWZ1bmN0aW9uIHNoZWxsX3JlYWQoZil7cmV0dXJuIHJlYWQoZil9fXJlYWRCaW5hcnk9ZnVuY3Rpb24gcmVhZEJpbmFyeShmKXt2YXIgZGF0YTtpZih0eXBlb2YgcmVhZGJ1ZmZlcj09PVwiZnVuY3Rpb25cIil7cmV0dXJuIG5ldyBVaW50OEFycmF5KHJlYWRidWZmZXIoZikpfWRhdGE9cmVhZChmLFwiYmluYXJ5XCIpO2Fzc2VydCh0eXBlb2YgZGF0YT09PVwib2JqZWN0XCIpO3JldHVybiBkYXRhfTtpZih0eXBlb2Ygc2NyaXB0QXJncyE9XCJ1bmRlZmluZWRcIil7YXJndW1lbnRzXz1zY3JpcHRBcmdzfWVsc2UgaWYodHlwZW9mIGFyZ3VtZW50cyE9XCJ1bmRlZmluZWRcIil7YXJndW1lbnRzXz1hcmd1bWVudHN9aWYodHlwZW9mIHF1aXQ9PT1cImZ1bmN0aW9uXCIpe3F1aXRfPWZ1bmN0aW9uKHN0YXR1cyl7cXVpdChzdGF0dXMpfX1pZih0eXBlb2YgcHJpbnQhPT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgY29uc29sZT09PVwidW5kZWZpbmVkXCIpY29uc29sZT17fTtjb25zb2xlLmxvZz1wcmludDtjb25zb2xlLndhcm49Y29uc29sZS5lcnJvcj10eXBlb2YgcHJpbnRFcnIhPT1cInVuZGVmaW5lZFwiP3ByaW50RXJyOnByaW50fX1lbHNlIGlmKEVOVklST05NRU5UX0lTX1dFQnx8RU5WSVJPTk1FTlRfSVNfV09SS0VSKXtpZihFTlZJUk9OTUVOVF9JU19XT1JLRVIpe3NjcmlwdERpcmVjdG9yeT1zZWxmLmxvY2F0aW9uLmhyZWZ9ZWxzZSBpZih0eXBlb2YgZG9jdW1lbnQhPT1cInVuZGVmaW5lZFwiJiZkb2N1bWVudC5jdXJyZW50U2NyaXB0KXtzY3JpcHREaXJlY3Rvcnk9ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmN9aWYodHlwZW9mIF9zY3JpcHREaXIgIT09IFwidW5kZWZpbmVkXCIgJiYgX3NjcmlwdERpcil7c2NyaXB0RGlyZWN0b3J5PV9zY3JpcHREaXJ9aWYoc2NyaXB0RGlyZWN0b3J5LmluZGV4T2YoXCJibG9iOlwiKSE9PTApe3NjcmlwdERpcmVjdG9yeT1zY3JpcHREaXJlY3Rvcnkuc3Vic3RyKDAsc2NyaXB0RGlyZWN0b3J5Lmxhc3RJbmRleE9mKFwiL1wiKSsxKX1lbHNle3NjcmlwdERpcmVjdG9yeT1cIlwifWlmKEVOVklST05NRU5UX0lTX05PREUpe3JlYWRfPWZ1bmN0aW9uIHNoZWxsX3JlYWQoZmlsZW5hbWUsYmluYXJ5KXtpZighbm9kZUZTKW5vZGVGUz1yZXF1aXJlKFwiZnNcIik7aWYoIW5vZGVQYXRoKW5vZGVQYXRoPXJlcXVpcmUoXCJwYXRoXCIpO2ZpbGVuYW1lPW5vZGVQYXRoW1wibm9ybWFsaXplXCJdKGZpbGVuYW1lKTtyZXR1cm4gbm9kZUZTW1wicmVhZEZpbGVTeW5jXCJdKGZpbGVuYW1lLGJpbmFyeT9udWxsOlwidXRmOFwiKX07cmVhZEJpbmFyeT1mdW5jdGlvbiByZWFkQmluYXJ5KGZpbGVuYW1lKXt2YXIgcmV0PXJlYWRfKGZpbGVuYW1lLHRydWUpO2lmKCFyZXQuYnVmZmVyKXtyZXQ9bmV3IFVpbnQ4QXJyYXkocmV0KX1hc3NlcnQocmV0LmJ1ZmZlcik7cmV0dXJuIHJldH19ZWxzZXtyZWFkXz1mdW5jdGlvbih1cmwpe3ZhciB4aHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3hoci5vcGVuKFwiR0VUXCIsdXJsLGZhbHNlKTt4aHIuc2VuZChudWxsKTtyZXR1cm4geGhyLnJlc3BvbnNlVGV4dH07aWYoRU5WSVJPTk1FTlRfSVNfV09SS0VSKXtyZWFkQmluYXJ5PWZ1bmN0aW9uKHVybCl7dmFyIHhocj1uZXcgWE1MSHR0cFJlcXVlc3Q7eGhyLm9wZW4oXCJHRVRcIix1cmwsZmFsc2UpO3hoci5yZXNwb25zZVR5cGU9XCJhcnJheWJ1ZmZlclwiO3hoci5zZW5kKG51bGwpO3JldHVybiBuZXcgVWludDhBcnJheSh4aHIucmVzcG9uc2UpfX1yZWFkQXN5bmM9ZnVuY3Rpb24odXJsLG9ubG9hZCxvbmVycm9yKXt2YXIgeGhyPW5ldyBYTUxIdHRwUmVxdWVzdDt4aHIub3BlbihcIkdFVFwiLHVybCx0cnVlKTt4aHIucmVzcG9uc2VUeXBlPVwiYXJyYXlidWZmZXJcIjt4aHIub25sb2FkPWZ1bmN0aW9uKCl7aWYoeGhyLnN0YXR1cz09MjAwfHx4aHIuc3RhdHVzPT0wJiZ4aHIucmVzcG9uc2Upe29ubG9hZCh4aHIucmVzcG9uc2UpO3JldHVybn1vbmVycm9yKCl9O3hoci5vbmVycm9yPW9uZXJyb3I7eGhyLnNlbmQobnVsbCl9fXNldFdpbmRvd1RpdGxlPWZ1bmN0aW9uKHRpdGxlKXtkb2N1bWVudC50aXRsZT10aXRsZX19ZWxzZXt9aWYoRU5WSVJPTk1FTlRfSVNfTk9ERSl7aWYodHlwZW9mIHBlcmZvcm1hbmNlPT09XCJ1bmRlZmluZWRcIil7Z2xvYmFsLnBlcmZvcm1hbmNlPXJlcXVpcmUoXCJwZXJmX2hvb2tzXCIpLnBlcmZvcm1hbmNlfX12YXIgb3V0PU1vZHVsZVtcInByaW50XCJdfHxjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpO3ZhciBlcnI9TW9kdWxlW1wicHJpbnRFcnJcIl18fGNvbnNvbGUud2Fybi5iaW5kKGNvbnNvbGUpO2ZvcihrZXkgaW4gbW9kdWxlT3ZlcnJpZGVzKXtpZihtb2R1bGVPdmVycmlkZXMuaGFzT3duUHJvcGVydHkoa2V5KSl7TW9kdWxlW2tleV09bW9kdWxlT3ZlcnJpZGVzW2tleV19fW1vZHVsZU92ZXJyaWRlcz1udWxsO2lmKE1vZHVsZVtcImFyZ3VtZW50c1wiXSlhcmd1bWVudHNfPU1vZHVsZVtcImFyZ3VtZW50c1wiXTtpZihNb2R1bGVbXCJ0aGlzUHJvZ3JhbVwiXSl0aGlzUHJvZ3JhbT1Nb2R1bGVbXCJ0aGlzUHJvZ3JhbVwiXTtpZihNb2R1bGVbXCJxdWl0XCJdKXF1aXRfPU1vZHVsZVtcInF1aXRcIl07dmFyIEF0b21pY3NfbG9hZD1BdG9taWNzLmxvYWQ7dmFyIEF0b21pY3Nfc3RvcmU9QXRvbWljcy5zdG9yZTt2YXIgQXRvbWljc19jb21wYXJlRXhjaGFuZ2U9QXRvbWljcy5jb21wYXJlRXhjaGFuZ2U7dmFyIHdhc21CaW5hcnk7aWYoTW9kdWxlW1wid2FzbUJpbmFyeVwiXSl3YXNtQmluYXJ5PU1vZHVsZVtcIndhc21CaW5hcnlcIl07dmFyIG5vRXhpdFJ1bnRpbWU9TW9kdWxlW1wibm9FeGl0UnVudGltZVwiXXx8dHJ1ZTtpZih0eXBlb2YgV2ViQXNzZW1ibHkhPT1cIm9iamVjdFwiKXthYm9ydChcIm5vIG5hdGl2ZSB3YXNtIHN1cHBvcnQgZGV0ZWN0ZWRcIil9dmFyIHdhc21NZW1vcnk7dmFyIHdhc21Nb2R1bGU7dmFyIEFCT1JUPWZhbHNlO3ZhciBFWElUU1RBVFVTO2Z1bmN0aW9uIGFzc2VydChjb25kaXRpb24sdGV4dCl7aWYoIWNvbmRpdGlvbil7YWJvcnQoXCJBc3NlcnRpb24gZmFpbGVkOiBcIit0ZXh0KX19ZnVuY3Rpb24gZ2V0Q0Z1bmMoaWRlbnQpe3ZhciBmdW5jPU1vZHVsZVtcIl9cIitpZGVudF07YXNzZXJ0KGZ1bmMsXCJDYW5ub3QgY2FsbCB1bmtub3duIGZ1bmN0aW9uIFwiK2lkZW50K1wiLCBtYWtlIHN1cmUgaXQgaXMgZXhwb3J0ZWRcIik7cmV0dXJuIGZ1bmN9ZnVuY3Rpb24gY2NhbGwoaWRlbnQscmV0dXJuVHlwZSxhcmdUeXBlcyxhcmdzLG9wdHMpe3ZhciB0b0M9e1wic3RyaW5nXCI6ZnVuY3Rpb24oc3RyKXt2YXIgcmV0PTA7aWYoc3RyIT09bnVsbCYmc3RyIT09dW5kZWZpbmVkJiZzdHIhPT0wKXt2YXIgbGVuPShzdHIubGVuZ3RoPDwyKSsxO3JldD1zdGFja0FsbG9jKGxlbik7c3RyaW5nVG9VVEY4KHN0cixyZXQsbGVuKX1yZXR1cm4gcmV0fSxcImFycmF5XCI6ZnVuY3Rpb24oYXJyKXt2YXIgcmV0PXN0YWNrQWxsb2MoYXJyLmxlbmd0aCk7d3JpdGVBcnJheVRvTWVtb3J5KGFycixyZXQpO3JldHVybiByZXR9fTtmdW5jdGlvbiBjb252ZXJ0UmV0dXJuVmFsdWUocmV0KXtpZihyZXR1cm5UeXBlPT09XCJzdHJpbmdcIilyZXR1cm4gVVRGOFRvU3RyaW5nKHJldCk7aWYocmV0dXJuVHlwZT09PVwiYm9vbGVhblwiKXJldHVybiBCb29sZWFuKHJldCk7cmV0dXJuIHJldH12YXIgZnVuYz1nZXRDRnVuYyhpZGVudCk7dmFyIGNBcmdzPVtdO3ZhciBzdGFjaz0wO2lmKGFyZ3Mpe2Zvcih2YXIgaT0wO2k8YXJncy5sZW5ndGg7aSsrKXt2YXIgY29udmVydGVyPXRvQ1thcmdUeXBlc1tpXV07aWYoY29udmVydGVyKXtpZihzdGFjaz09PTApc3RhY2s9c3RhY2tTYXZlKCk7Y0FyZ3NbaV09Y29udmVydGVyKGFyZ3NbaV0pfWVsc2V7Y0FyZ3NbaV09YXJnc1tpXX19fXZhciByZXQ9ZnVuYy5hcHBseShudWxsLGNBcmdzKTtyZXQ9Y29udmVydFJldHVyblZhbHVlKHJldCk7aWYoc3RhY2shPT0wKXN0YWNrUmVzdG9yZShzdGFjayk7cmV0dXJuIHJldH1mdW5jdGlvbiBjd3JhcChpZGVudCxyZXR1cm5UeXBlLGFyZ1R5cGVzLG9wdHMpe2FyZ1R5cGVzPWFyZ1R5cGVzfHxbXTt2YXIgbnVtZXJpY0FyZ3M9YXJnVHlwZXMuZXZlcnkoZnVuY3Rpb24odHlwZSl7cmV0dXJuIHR5cGU9PT1cIm51bWJlclwifSk7dmFyIG51bWVyaWNSZXQ9cmV0dXJuVHlwZSE9PVwic3RyaW5nXCI7aWYobnVtZXJpY1JldCYmbnVtZXJpY0FyZ3MmJiFvcHRzKXtyZXR1cm4gZ2V0Q0Z1bmMoaWRlbnQpfXJldHVybiBmdW5jdGlvbigpe3JldHVybiBjY2FsbChpZGVudCxyZXR1cm5UeXBlLGFyZ1R5cGVzLGFyZ3VtZW50cyxvcHRzKX19ZnVuY3Rpb24gVVRGOEFycmF5VG9TdHJpbmcoaGVhcCxpZHgsbWF4Qnl0ZXNUb1JlYWQpe3ZhciBlbmRJZHg9aWR4K21heEJ5dGVzVG9SZWFkO3ZhciBzdHI9XCJcIjt3aGlsZSghKGlkeD49ZW5kSWR4KSl7dmFyIHUwPWhlYXBbaWR4KytdO2lmKCF1MClyZXR1cm4gc3RyO2lmKCEodTAmMTI4KSl7c3RyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHUwKTtjb250aW51ZX12YXIgdTE9aGVhcFtpZHgrK10mNjM7aWYoKHUwJjIyNCk9PTE5Mil7c3RyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCh1MCYzMSk8PDZ8dTEpO2NvbnRpbnVlfXZhciB1Mj1oZWFwW2lkeCsrXSY2MztpZigodTAmMjQwKT09MjI0KXt1MD0odTAmMTUpPDwxMnx1MTw8Nnx1Mn1lbHNle3UwPSh1MCY3KTw8MTh8dTE8PDEyfHUyPDw2fGhlYXBbaWR4KytdJjYzfWlmKHUwPDY1NTM2KXtzdHIrPVN0cmluZy5mcm9tQ2hhckNvZGUodTApfWVsc2V7dmFyIGNoPXUwLTY1NTM2O3N0cis9U3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NnxjaD4+MTAsNTYzMjB8Y2gmMTAyMyl9fXJldHVybiBzdHJ9ZnVuY3Rpb24gVVRGOFRvU3RyaW5nKHB0cixtYXhCeXRlc1RvUmVhZCl7cmV0dXJuIHB0cj9VVEY4QXJyYXlUb1N0cmluZyhHUk9XQUJMRV9IRUFQX1U4KCkscHRyLG1heEJ5dGVzVG9SZWFkKTpcIlwifWZ1bmN0aW9uIHN0cmluZ1RvVVRGOEFycmF5KHN0cixoZWFwLG91dElkeCxtYXhCeXRlc1RvV3JpdGUpe2lmKCEobWF4Qnl0ZXNUb1dyaXRlPjApKXJldHVybiAwO3ZhciBzdGFydElkeD1vdXRJZHg7dmFyIGVuZElkeD1vdXRJZHgrbWF4Qnl0ZXNUb1dyaXRlLTE7Zm9yKHZhciBpPTA7aTxzdHIubGVuZ3RoOysraSl7dmFyIHU9c3RyLmNoYXJDb2RlQXQoaSk7aWYodT49NTUyOTYmJnU8PTU3MzQzKXt2YXIgdTE9c3RyLmNoYXJDb2RlQXQoKytpKTt1PTY1NTM2KygodSYxMDIzKTw8MTApfHUxJjEwMjN9aWYodTw9MTI3KXtpZihvdXRJZHg+PWVuZElkeClicmVhaztoZWFwW291dElkeCsrXT11fWVsc2UgaWYodTw9MjA0Nyl7aWYob3V0SWR4KzE+PWVuZElkeClicmVhaztoZWFwW291dElkeCsrXT0xOTJ8dT4+NjtoZWFwW291dElkeCsrXT0xMjh8dSY2M31lbHNlIGlmKHU8PTY1NTM1KXtpZihvdXRJZHgrMj49ZW5kSWR4KWJyZWFrO2hlYXBbb3V0SWR4KytdPTIyNHx1Pj4xMjtoZWFwW291dElkeCsrXT0xMjh8dT4+NiY2MztoZWFwW291dElkeCsrXT0xMjh8dSY2M31lbHNle2lmKG91dElkeCszPj1lbmRJZHgpYnJlYWs7aGVhcFtvdXRJZHgrK109MjQwfHU+PjE4O2hlYXBbb3V0SWR4KytdPTEyOHx1Pj4xMiY2MztoZWFwW291dElkeCsrXT0xMjh8dT4+NiY2MztoZWFwW291dElkeCsrXT0xMjh8dSY2M319aGVhcFtvdXRJZHhdPTA7cmV0dXJuIG91dElkeC1zdGFydElkeH1mdW5jdGlvbiBzdHJpbmdUb1VURjgoc3RyLG91dFB0cixtYXhCeXRlc1RvV3JpdGUpe3JldHVybiBzdHJpbmdUb1VURjhBcnJheShzdHIsR1JPV0FCTEVfSEVBUF9VOCgpLG91dFB0cixtYXhCeXRlc1RvV3JpdGUpfWZ1bmN0aW9uIGxlbmd0aEJ5dGVzVVRGOChzdHIpe3ZhciBsZW49MDtmb3IodmFyIGk9MDtpPHN0ci5sZW5ndGg7KytpKXt2YXIgdT1zdHIuY2hhckNvZGVBdChpKTtpZih1Pj01NTI5NiYmdTw9NTczNDMpdT02NTUzNisoKHUmMTAyMyk8PDEwKXxzdHIuY2hhckNvZGVBdCgrK2kpJjEwMjM7aWYodTw9MTI3KSsrbGVuO2Vsc2UgaWYodTw9MjA0NylsZW4rPTI7ZWxzZSBpZih1PD02NTUzNSlsZW4rPTM7ZWxzZSBsZW4rPTR9cmV0dXJuIGxlbn1mdW5jdGlvbiB3cml0ZUFycmF5VG9NZW1vcnkoYXJyYXksYnVmZmVyKXtHUk9XQUJMRV9IRUFQX0k4KCkuc2V0KGFycmF5LGJ1ZmZlcil9ZnVuY3Rpb24gYWxpZ25VcCh4LG11bHRpcGxlKXtpZih4JW11bHRpcGxlPjApe3grPW11bHRpcGxlLXglbXVsdGlwbGV9cmV0dXJuIHh9dmFyIGJ1ZmZlcixIRUFQOCxIRUFQVTgsSEVBUDE2LEhFQVBVMTYsSEVBUDMyLEhFQVBVMzIsSEVBUEYzMixIRUFQRjY0O2Z1bmN0aW9uIHVwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzKGJ1Zil7YnVmZmVyPWJ1ZjtNb2R1bGVbXCJIRUFQOFwiXT1IRUFQOD1uZXcgSW50OEFycmF5KGJ1Zik7TW9kdWxlW1wiSEVBUDE2XCJdPUhFQVAxNj1uZXcgSW50MTZBcnJheShidWYpO01vZHVsZVtcIkhFQVAzMlwiXT1IRUFQMzI9bmV3IEludDMyQXJyYXkoYnVmKTtNb2R1bGVbXCJIRUFQVThcIl09SEVBUFU4PW5ldyBVaW50OEFycmF5KGJ1Zik7TW9kdWxlW1wiSEVBUFUxNlwiXT1IRUFQVTE2PW5ldyBVaW50MTZBcnJheShidWYpO01vZHVsZVtcIkhFQVBVMzJcIl09SEVBUFUzMj1uZXcgVWludDMyQXJyYXkoYnVmKTtNb2R1bGVbXCJIRUFQRjMyXCJdPUhFQVBGMzI9bmV3IEZsb2F0MzJBcnJheShidWYpO01vZHVsZVtcIkhFQVBGNjRcIl09SEVBUEY2ND1uZXcgRmxvYXQ2NEFycmF5KGJ1Zil9dmFyIElOSVRJQUxfTUVNT1JZPU1vZHVsZVtcIklOSVRJQUxfTUVNT1JZXCJdfHwxNjc3NzIxNjtpZihFTlZJUk9OTUVOVF9JU19QVEhSRUFEKXt3YXNtTWVtb3J5PU1vZHVsZVtcIndhc21NZW1vcnlcIl07YnVmZmVyPU1vZHVsZVtcImJ1ZmZlclwiXX1lbHNle2lmKE1vZHVsZVtcIndhc21NZW1vcnlcIl0pe3dhc21NZW1vcnk9TW9kdWxlW1wid2FzbU1lbW9yeVwiXX1lbHNle3dhc21NZW1vcnk9bmV3IFdlYkFzc2VtYmx5Lk1lbW9yeSh7XCJpbml0aWFsXCI6SU5JVElBTF9NRU1PUlkvNjU1MzYsXCJtYXhpbXVtXCI6MjE0NzQ4MzY0OC82NTUzNixcInNoYXJlZFwiOnRydWV9KTtpZighKHdhc21NZW1vcnkuYnVmZmVyIGluc3RhbmNlb2YgU2hhcmVkQXJyYXlCdWZmZXIpKXtlcnIoXCJyZXF1ZXN0ZWQgYSBzaGFyZWQgV2ViQXNzZW1ibHkuTWVtb3J5IGJ1dCB0aGUgcmV0dXJuZWQgYnVmZmVyIGlzIG5vdCBhIFNoYXJlZEFycmF5QnVmZmVyLCBpbmRpY2F0aW5nIHRoYXQgd2hpbGUgdGhlIGJyb3dzZXIgaGFzIFNoYXJlZEFycmF5QnVmZmVyIGl0IGRvZXMgbm90IGhhdmUgV2ViQXNzZW1ibHkgdGhyZWFkcyBzdXBwb3J0IC0geW91IG1heSBuZWVkIHRvIHNldCBhIGZsYWdcIik7aWYoRU5WSVJPTk1FTlRfSVNfTk9ERSl7Y29uc29sZS5sb2coXCIob24gbm9kZSB5b3UgbWF5IG5lZWQ6IC0tZXhwZXJpbWVudGFsLXdhc20tdGhyZWFkcyAtLWV4cGVyaW1lbnRhbC13YXNtLWJ1bGstbWVtb3J5IGFuZCBhbHNvIHVzZSBhIHJlY2VudCB2ZXJzaW9uKVwiKX10aHJvdyBFcnJvcihcImJhZCBtZW1vcnlcIil9fX1pZih3YXNtTWVtb3J5KXtidWZmZXI9d2FzbU1lbW9yeS5idWZmZXJ9SU5JVElBTF9NRU1PUlk9YnVmZmVyLmJ5dGVMZW5ndGg7dXBkYXRlR2xvYmFsQnVmZmVyQW5kVmlld3MoYnVmZmVyKTt2YXIgd2FzbVRhYmxlO3ZhciBfX0FUUFJFUlVOX189W107dmFyIF9fQVRJTklUX189W107dmFyIF9fQVRNQUlOX189W107dmFyIF9fQVRFWElUX189W107dmFyIF9fQVRQT1NUUlVOX189W107dmFyIHJ1bnRpbWVJbml0aWFsaXplZD1mYWxzZTt2YXIgcnVudGltZUV4aXRlZD1mYWxzZTtpZighRU5WSVJPTk1FTlRfSVNfUFRIUkVBRClfX0FUSU5JVF9fLnB1c2goe2Z1bmM6ZnVuY3Rpb24oKXtfX193YXNtX2NhbGxfY3RvcnMoKX19KTtmdW5jdGlvbiBwcmVSdW4oKXtpZihFTlZJUk9OTUVOVF9JU19QVEhSRUFEKXJldHVybjtpZihNb2R1bGVbXCJwcmVSdW5cIl0pe2lmKHR5cGVvZiBNb2R1bGVbXCJwcmVSdW5cIl09PVwiZnVuY3Rpb25cIilNb2R1bGVbXCJwcmVSdW5cIl09W01vZHVsZVtcInByZVJ1blwiXV07d2hpbGUoTW9kdWxlW1wicHJlUnVuXCJdLmxlbmd0aCl7YWRkT25QcmVSdW4oTW9kdWxlW1wicHJlUnVuXCJdLnNoaWZ0KCkpfX1jYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUUFJFUlVOX18pfWZ1bmN0aW9uIGluaXRSdW50aW1lKCl7cnVudGltZUluaXRpYWxpemVkPXRydWU7aWYoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRClyZXR1cm47Y2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVElOSVRfXyl9ZnVuY3Rpb24gcHJlTWFpbigpe2lmKEVOVklST05NRU5UX0lTX1BUSFJFQUQpcmV0dXJuO2NhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRNQUlOX18pfWZ1bmN0aW9uIGV4aXRSdW50aW1lKCl7aWYoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRClyZXR1cm47cnVudGltZUV4aXRlZD10cnVlfWZ1bmN0aW9uIHBvc3RSdW4oKXtpZihFTlZJUk9OTUVOVF9JU19QVEhSRUFEKXJldHVybjtpZihNb2R1bGVbXCJwb3N0UnVuXCJdKXtpZih0eXBlb2YgTW9kdWxlW1wicG9zdFJ1blwiXT09XCJmdW5jdGlvblwiKU1vZHVsZVtcInBvc3RSdW5cIl09W01vZHVsZVtcInBvc3RSdW5cIl1dO3doaWxlKE1vZHVsZVtcInBvc3RSdW5cIl0ubGVuZ3RoKXthZGRPblBvc3RSdW4oTW9kdWxlW1wicG9zdFJ1blwiXS5zaGlmdCgpKX19Y2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVFBPU1RSVU5fXyl9ZnVuY3Rpb24gYWRkT25QcmVSdW4oY2Ipe19fQVRQUkVSVU5fXy51bnNoaWZ0KGNiKX1mdW5jdGlvbiBhZGRPblBvc3RSdW4oY2Ipe19fQVRQT1NUUlVOX18udW5zaGlmdChjYil9dmFyIHJ1bkRlcGVuZGVuY2llcz0wO3ZhciBydW5EZXBlbmRlbmN5V2F0Y2hlcj1udWxsO3ZhciBkZXBlbmRlbmNpZXNGdWxmaWxsZWQ9bnVsbDtmdW5jdGlvbiBhZGRSdW5EZXBlbmRlbmN5KGlkKXthc3NlcnQoIUVOVklST05NRU5UX0lTX1BUSFJFQUQsXCJhZGRSdW5EZXBlbmRlbmN5IGNhbm5vdCBiZSB1c2VkIGluIGEgcHRocmVhZCB3b3JrZXJcIik7cnVuRGVwZW5kZW5jaWVzKys7aWYoTW9kdWxlW1wibW9uaXRvclJ1bkRlcGVuZGVuY2llc1wiXSl7TW9kdWxlW1wibW9uaXRvclJ1bkRlcGVuZGVuY2llc1wiXShydW5EZXBlbmRlbmNpZXMpfX1mdW5jdGlvbiByZW1vdmVSdW5EZXBlbmRlbmN5KGlkKXtydW5EZXBlbmRlbmNpZXMtLTtpZihNb2R1bGVbXCJtb25pdG9yUnVuRGVwZW5kZW5jaWVzXCJdKXtNb2R1bGVbXCJtb25pdG9yUnVuRGVwZW5kZW5jaWVzXCJdKHJ1bkRlcGVuZGVuY2llcyl9aWYocnVuRGVwZW5kZW5jaWVzPT0wKXtpZihydW5EZXBlbmRlbmN5V2F0Y2hlciE9PW51bGwpe2NsZWFySW50ZXJ2YWwocnVuRGVwZW5kZW5jeVdhdGNoZXIpO3J1bkRlcGVuZGVuY3lXYXRjaGVyPW51bGx9aWYoZGVwZW5kZW5jaWVzRnVsZmlsbGVkKXt2YXIgY2FsbGJhY2s9ZGVwZW5kZW5jaWVzRnVsZmlsbGVkO2RlcGVuZGVuY2llc0Z1bGZpbGxlZD1udWxsO2NhbGxiYWNrKCl9fX1Nb2R1bGVbXCJwcmVsb2FkZWRJbWFnZXNcIl09e307TW9kdWxlW1wicHJlbG9hZGVkQXVkaW9zXCJdPXt9O2Z1bmN0aW9uIGFib3J0KHdoYXQpe2lmKE1vZHVsZVtcIm9uQWJvcnRcIl0pe01vZHVsZVtcIm9uQWJvcnRcIl0od2hhdCl9aWYoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRCljb25zb2xlLmVycm9yKFwiUHRocmVhZCBhYm9ydGluZyBhdCBcIisobmV3IEVycm9yKS5zdGFjayk7d2hhdCs9XCJcIjtlcnIod2hhdCk7QUJPUlQ9dHJ1ZTtFWElUU1RBVFVTPTE7d2hhdD1cImFib3J0KFwiK3doYXQrXCIpLiBCdWlsZCB3aXRoIC1zIEFTU0VSVElPTlM9MSBmb3IgbW9yZSBpbmZvLlwiO3ZhciBlPW5ldyBXZWJBc3NlbWJseS5SdW50aW1lRXJyb3Iod2hhdCk7cmVhZHlQcm9taXNlUmVqZWN0KGUpO3Rocm93IGV9ZnVuY3Rpb24gaGFzUHJlZml4KHN0cixwcmVmaXgpe3JldHVybiBTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGg/c3RyLnN0YXJ0c1dpdGgocHJlZml4KTpzdHIuaW5kZXhPZihwcmVmaXgpPT09MH12YXIgZGF0YVVSSVByZWZpeD1cImRhdGE6YXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtO2Jhc2U2NCxcIjtmdW5jdGlvbiBpc0RhdGFVUkkoZmlsZW5hbWUpe3JldHVybiBoYXNQcmVmaXgoZmlsZW5hbWUsZGF0YVVSSVByZWZpeCl9dmFyIGZpbGVVUklQcmVmaXg9XCJmaWxlOi8vXCI7ZnVuY3Rpb24gaXNGaWxlVVJJKGZpbGVuYW1lKXtyZXR1cm4gaGFzUHJlZml4KGZpbGVuYW1lLGZpbGVVUklQcmVmaXgpfXZhciB3YXNtQmluYXJ5RmlsZT1cInRmanMtYmFja2VuZC13YXNtLXRocmVhZGVkLXNpbWQud2FzbVwiO2lmKCFpc0RhdGFVUkkod2FzbUJpbmFyeUZpbGUpKXt3YXNtQmluYXJ5RmlsZT1sb2NhdGVGaWxlKHdhc21CaW5hcnlGaWxlKX1mdW5jdGlvbiBnZXRCaW5hcnkoZmlsZSl7dHJ5e2lmKGZpbGU9PXdhc21CaW5hcnlGaWxlJiZ3YXNtQmluYXJ5KXtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkod2FzbUJpbmFyeSl9aWYocmVhZEJpbmFyeSl7cmV0dXJuIHJlYWRCaW5hcnkoZmlsZSl9ZWxzZXt0aHJvd1wiYm90aCBhc3luYyBhbmQgc3luYyBmZXRjaGluZyBvZiB0aGUgd2FzbSBmYWlsZWRcIn19Y2F0Y2goZXJyKXthYm9ydChlcnIpfX1mdW5jdGlvbiBnZXRCaW5hcnlQcm9taXNlKCl7aWYoIXdhc21CaW5hcnkmJihFTlZJUk9OTUVOVF9JU19XRUJ8fEVOVklST05NRU5UX0lTX1dPUktFUikpe2lmKHR5cGVvZiBmZXRjaD09PVwiZnVuY3Rpb25cIiYmIWlzRmlsZVVSSSh3YXNtQmluYXJ5RmlsZSkpe3JldHVybiBmZXRjaCh3YXNtQmluYXJ5RmlsZSx7Y3JlZGVudGlhbHM6XCJzYW1lLW9yaWdpblwifSkudGhlbihmdW5jdGlvbihyZXNwb25zZSl7aWYoIXJlc3BvbnNlW1wib2tcIl0pe3Rocm93XCJmYWlsZWQgdG8gbG9hZCB3YXNtIGJpbmFyeSBmaWxlIGF0ICdcIit3YXNtQmluYXJ5RmlsZStcIidcIn1yZXR1cm4gcmVzcG9uc2VbXCJhcnJheUJ1ZmZlclwiXSgpfSkuY2F0Y2goZnVuY3Rpb24oKXtyZXR1cm4gZ2V0QmluYXJ5KHdhc21CaW5hcnlGaWxlKX0pfWVsc2V7aWYocmVhZEFzeW5jKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSxyZWplY3Qpe3JlYWRBc3luYyh3YXNtQmluYXJ5RmlsZSxmdW5jdGlvbihyZXNwb25zZSl7cmVzb2x2ZShuZXcgVWludDhBcnJheShyZXNwb25zZSkpfSxyZWplY3QpfSl9fX1yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbigpe3JldHVybiBnZXRCaW5hcnkod2FzbUJpbmFyeUZpbGUpfSl9ZnVuY3Rpb24gY3JlYXRlV2FzbSgpe3ZhciBpbmZvPXtcImFcIjphc21MaWJyYXJ5QXJnfTtmdW5jdGlvbiByZWNlaXZlSW5zdGFuY2UoaW5zdGFuY2UsbW9kdWxlKXt2YXIgZXhwb3J0cz1pbnN0YW5jZS5leHBvcnRzO01vZHVsZVtcImFzbVwiXT1leHBvcnRzO3dhc21UYWJsZT1Nb2R1bGVbXCJhc21cIl1bXCJGXCJdO3dhc21Nb2R1bGU9bW9kdWxlO2lmKCFFTlZJUk9OTUVOVF9JU19QVEhSRUFEKXt2YXIgbnVtV29ya2Vyc1RvTG9hZD1QVGhyZWFkLnVudXNlZFdvcmtlcnMubGVuZ3RoO1BUaHJlYWQudW51c2VkV29ya2Vycy5mb3JFYWNoKGZ1bmN0aW9uKHcpe1BUaHJlYWQubG9hZFdhc21Nb2R1bGVUb1dvcmtlcih3LGZ1bmN0aW9uKCl7aWYoIS0tbnVtV29ya2Vyc1RvTG9hZClyZW1vdmVSdW5EZXBlbmRlbmN5KFwid2FzbS1pbnN0YW50aWF0ZVwiKX0pfSl9fWlmKCFFTlZJUk9OTUVOVF9JU19QVEhSRUFEKXthZGRSdW5EZXBlbmRlbmN5KFwid2FzbS1pbnN0YW50aWF0ZVwiKX1mdW5jdGlvbiByZWNlaXZlSW5zdGFudGlhdGVkU291cmNlKG91dHB1dCl7cmVjZWl2ZUluc3RhbmNlKG91dHB1dFtcImluc3RhbmNlXCJdLG91dHB1dFtcIm1vZHVsZVwiXSl9ZnVuY3Rpb24gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlcil7cmV0dXJuIGdldEJpbmFyeVByb21pc2UoKS50aGVuKGZ1bmN0aW9uKGJpbmFyeSl7cmV0dXJuIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKGJpbmFyeSxpbmZvKX0pLnRoZW4ocmVjZWl2ZXIsZnVuY3Rpb24ocmVhc29uKXtlcnIoXCJmYWlsZWQgdG8gYXN5bmNocm9ub3VzbHkgcHJlcGFyZSB3YXNtOiBcIityZWFzb24pO2Fib3J0KHJlYXNvbil9KX1mdW5jdGlvbiBpbnN0YW50aWF0ZUFzeW5jKCl7aWYoIXdhc21CaW5hcnkmJnR5cGVvZiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZz09PVwiZnVuY3Rpb25cIiYmIWlzRGF0YVVSSSh3YXNtQmluYXJ5RmlsZSkmJiFpc0ZpbGVVUkkod2FzbUJpbmFyeUZpbGUpJiZ0eXBlb2YgZmV0Y2g9PT1cImZ1bmN0aW9uXCIpe3JldHVybiBmZXRjaCh3YXNtQmluYXJ5RmlsZSx7Y3JlZGVudGlhbHM6XCJzYW1lLW9yaWdpblwifSkudGhlbihmdW5jdGlvbihyZXNwb25zZSl7dmFyIHJlc3VsdD1XZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhyZXNwb25zZSxpbmZvKTtyZXR1cm4gcmVzdWx0LnRoZW4ocmVjZWl2ZUluc3RhbnRpYXRlZFNvdXJjZSxmdW5jdGlvbihyZWFzb24pe2VycihcIndhc20gc3RyZWFtaW5nIGNvbXBpbGUgZmFpbGVkOiBcIityZWFzb24pO2VycihcImZhbGxpbmcgYmFjayB0byBBcnJheUJ1ZmZlciBpbnN0YW50aWF0aW9uXCIpO3JldHVybiBpbnN0YW50aWF0ZUFycmF5QnVmZmVyKHJlY2VpdmVJbnN0YW50aWF0ZWRTb3VyY2UpfSl9KX1lbHNle3JldHVybiBpbnN0YW50aWF0ZUFycmF5QnVmZmVyKHJlY2VpdmVJbnN0YW50aWF0ZWRTb3VyY2UpfX1pZihNb2R1bGVbXCJpbnN0YW50aWF0ZVdhc21cIl0pe3RyeXt2YXIgZXhwb3J0cz1Nb2R1bGVbXCJpbnN0YW50aWF0ZVdhc21cIl0oaW5mbyxyZWNlaXZlSW5zdGFuY2UpO3JldHVybiBleHBvcnRzfWNhdGNoKGUpe2VycihcIk1vZHVsZS5pbnN0YW50aWF0ZVdhc20gY2FsbGJhY2sgZmFpbGVkIHdpdGggZXJyb3I6IFwiK2UpO3JldHVybiBmYWxzZX19aW5zdGFudGlhdGVBc3luYygpLmNhdGNoKHJlYWR5UHJvbWlzZVJlamVjdCk7cmV0dXJue319dmFyIEFTTV9DT05TVFM9ezk4MzI6ZnVuY3Rpb24oKXt0aHJvd1wiQ2FuY2VsZWQhXCJ9LDk4NTA6ZnVuY3Rpb24oJDAsJDEpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtfX2Vtc2NyaXB0ZW5fZG9fZGlzcGF0Y2hfdG9fdGhyZWFkKCQwLCQxKX0sMCl9fTtmdW5jdGlvbiBpbml0UHRocmVhZHNKUygpe1BUaHJlYWQuaW5pdFJ1bnRpbWUoKX1mdW5jdGlvbiBjYWxsUnVudGltZUNhbGxiYWNrcyhjYWxsYmFja3Mpe3doaWxlKGNhbGxiYWNrcy5sZW5ndGg+MCl7dmFyIGNhbGxiYWNrPWNhbGxiYWNrcy5zaGlmdCgpO2lmKHR5cGVvZiBjYWxsYmFjaz09XCJmdW5jdGlvblwiKXtjYWxsYmFjayhNb2R1bGUpO2NvbnRpbnVlfXZhciBmdW5jPWNhbGxiYWNrLmZ1bmM7aWYodHlwZW9mIGZ1bmM9PT1cIm51bWJlclwiKXtpZihjYWxsYmFjay5hcmc9PT11bmRlZmluZWQpe3dhc21UYWJsZS5nZXQoZnVuYykoKX1lbHNle3dhc21UYWJsZS5nZXQoZnVuYykoY2FsbGJhY2suYXJnKX19ZWxzZXtmdW5jKGNhbGxiYWNrLmFyZz09PXVuZGVmaW5lZD9udWxsOmNhbGxiYWNrLmFyZyl9fX1mdW5jdGlvbiBfZW1zY3JpcHRlbl9mdXRleF93YWtlKGFkZHIsY291bnQpe2lmKGFkZHI8PTB8fGFkZHI+R1JPV0FCTEVfSEVBUF9JOCgpLmxlbmd0aHx8YWRkciYzIT0wfHxjb3VudDwwKXJldHVybi0yODtpZihjb3VudD09MClyZXR1cm4gMDtpZihjb3VudD49MjE0NzQ4MzY0Nyljb3VudD1JbmZpbml0eTt2YXIgbWFpblRocmVhZFdhaXRBZGRyZXNzPUF0b21pY3MubG9hZChHUk9XQUJMRV9IRUFQX0kzMigpLF9fZW1zY3JpcHRlbl9tYWluX3RocmVhZF9mdXRleD4+Mik7dmFyIG1haW5UaHJlYWRXb2tlbj0wO2lmKG1haW5UaHJlYWRXYWl0QWRkcmVzcz09YWRkcil7dmFyIGxvYWRlZEFkZHI9QXRvbWljcy5jb21wYXJlRXhjaGFuZ2UoR1JPV0FCTEVfSEVBUF9JMzIoKSxfX2Vtc2NyaXB0ZW5fbWFpbl90aHJlYWRfZnV0ZXg+PjIsbWFpblRocmVhZFdhaXRBZGRyZXNzLDApO2lmKGxvYWRlZEFkZHI9PW1haW5UaHJlYWRXYWl0QWRkcmVzcyl7LS1jb3VudDttYWluVGhyZWFkV29rZW49MTtpZihjb3VudDw9MClyZXR1cm4gMX19dmFyIHJldD1BdG9taWNzLm5vdGlmeShHUk9XQUJMRV9IRUFQX0kzMigpLGFkZHI+PjIsY291bnQpO2lmKHJldD49MClyZXR1cm4gcmV0K21haW5UaHJlYWRXb2tlbjt0aHJvd1wiQXRvbWljcy5ub3RpZnkgcmV0dXJuZWQgYW4gdW5leHBlY3RlZCB2YWx1ZSBcIityZXR9TW9kdWxlW1wiX2Vtc2NyaXB0ZW5fZnV0ZXhfd2FrZVwiXT1fZW1zY3JpcHRlbl9mdXRleF93YWtlO2Z1bmN0aW9uIGtpbGxUaHJlYWQocHRocmVhZF9wdHIpe2lmKEVOVklST05NRU5UX0lTX1BUSFJFQUQpdGhyb3dcIkludGVybmFsIEVycm9yISBraWxsVGhyZWFkKCkgY2FuIG9ubHkgZXZlciBiZSBjYWxsZWQgZnJvbSBtYWluIGFwcGxpY2F0aW9uIHRocmVhZCFcIjtpZighcHRocmVhZF9wdHIpdGhyb3dcIkludGVybmFsIEVycm9yISBOdWxsIHB0aHJlYWRfcHRyIGluIGtpbGxUaHJlYWQhXCI7R1JPV0FCTEVfSEVBUF9JMzIoKVtwdGhyZWFkX3B0cisxMj4+Ml09MDt2YXIgcHRocmVhZD1QVGhyZWFkLnB0aHJlYWRzW3B0aHJlYWRfcHRyXTtwdGhyZWFkLndvcmtlci50ZXJtaW5hdGUoKTtQVGhyZWFkLmZyZWVUaHJlYWREYXRhKHB0aHJlYWQpO1BUaHJlYWQucnVubmluZ1dvcmtlcnMuc3BsaWNlKFBUaHJlYWQucnVubmluZ1dvcmtlcnMuaW5kZXhPZihwdGhyZWFkLndvcmtlciksMSk7cHRocmVhZC53b3JrZXIucHRocmVhZD11bmRlZmluZWR9ZnVuY3Rpb24gY2FuY2VsVGhyZWFkKHB0aHJlYWRfcHRyKXtpZihFTlZJUk9OTUVOVF9JU19QVEhSRUFEKXRocm93XCJJbnRlcm5hbCBFcnJvciEgY2FuY2VsVGhyZWFkKCkgY2FuIG9ubHkgZXZlciBiZSBjYWxsZWQgZnJvbSBtYWluIGFwcGxpY2F0aW9uIHRocmVhZCFcIjtpZighcHRocmVhZF9wdHIpdGhyb3dcIkludGVybmFsIEVycm9yISBOdWxsIHB0aHJlYWRfcHRyIGluIGNhbmNlbFRocmVhZCFcIjt2YXIgcHRocmVhZD1QVGhyZWFkLnB0aHJlYWRzW3B0aHJlYWRfcHRyXTtwdGhyZWFkLndvcmtlci5wb3N0TWVzc2FnZSh7XCJjbWRcIjpcImNhbmNlbFwifSl9ZnVuY3Rpb24gY2xlYW51cFRocmVhZChwdGhyZWFkX3B0cil7aWYoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRCl0aHJvd1wiSW50ZXJuYWwgRXJyb3IhIGNsZWFudXBUaHJlYWQoKSBjYW4gb25seSBldmVyIGJlIGNhbGxlZCBmcm9tIG1haW4gYXBwbGljYXRpb24gdGhyZWFkIVwiO2lmKCFwdGhyZWFkX3B0cil0aHJvd1wiSW50ZXJuYWwgRXJyb3IhIE51bGwgcHRocmVhZF9wdHIgaW4gY2xlYW51cFRocmVhZCFcIjt2YXIgcHRocmVhZD1QVGhyZWFkLnB0aHJlYWRzW3B0aHJlYWRfcHRyXTtpZihwdGhyZWFkKXtHUk9XQUJMRV9IRUFQX0kzMigpW3B0aHJlYWRfcHRyKzEyPj4yXT0wO3ZhciB3b3JrZXI9cHRocmVhZC53b3JrZXI7UFRocmVhZC5yZXR1cm5Xb3JrZXJUb1Bvb2wod29ya2VyKX19dmFyIFBUaHJlYWQ9e3VudXNlZFdvcmtlcnM6W10scnVubmluZ1dvcmtlcnM6W10saW5pdE1haW5UaHJlYWRCbG9jazpmdW5jdGlvbigpe3ZhciBwdGhyZWFkUG9vbFNpemU9TWF0aC5taW4oNCxNYXRoLm1heCgxLChuYXZpZ2F0b3IuaGFyZHdhcmVDb25jdXJyZW5jeXx8MSkvMikpO2Zvcih2YXIgaT0wO2k8cHRocmVhZFBvb2xTaXplOysraSl7UFRocmVhZC5hbGxvY2F0ZVVudXNlZFdvcmtlcigpfX0saW5pdFJ1bnRpbWU6ZnVuY3Rpb24oKXt2YXIgdGI9X21hbGxvYygyMjgpO2Zvcih2YXIgaT0wO2k8MjI4LzQ7KytpKUdST1dBQkxFX0hFQVBfVTMyKClbdGIvNCtpXT0wO0dST1dBQkxFX0hFQVBfSTMyKClbdGIrMTI+PjJdPXRiO3ZhciBoZWFkUHRyPXRiKzE1MjtHUk9XQUJMRV9IRUFQX0kzMigpW2hlYWRQdHI+PjJdPWhlYWRQdHI7dmFyIHRsc01lbW9yeT1fbWFsbG9jKDUxMik7Zm9yKHZhciBpPTA7aTwxMjg7KytpKUdST1dBQkxFX0hFQVBfVTMyKClbdGxzTWVtb3J5LzQraV09MDtBdG9taWNzLnN0b3JlKEdST1dBQkxFX0hFQVBfVTMyKCksdGIrMTAwPj4yLHRsc01lbW9yeSk7QXRvbWljcy5zdG9yZShHUk9XQUJMRV9IRUFQX1UzMigpLHRiKzQwPj4yLHRiKTtfX2Vtc2NyaXB0ZW5fdGhyZWFkX2luaXQodGIsIUVOVklST05NRU5UX0lTX1dPUktFUiwxKTtfZW1zY3JpcHRlbl9yZWdpc3Rlcl9tYWluX2Jyb3dzZXJfdGhyZWFkX2lkKHRiKX0saW5pdFdvcmtlcjpmdW5jdGlvbigpe30scHRocmVhZHM6e30sdGhyZWFkRXhpdEhhbmRsZXJzOltdLHNldFRocmVhZFN0YXR1czpmdW5jdGlvbigpe30scnVuRXhpdEhhbmRsZXJzOmZ1bmN0aW9uKCl7d2hpbGUoUFRocmVhZC50aHJlYWRFeGl0SGFuZGxlcnMubGVuZ3RoPjApe1BUaHJlYWQudGhyZWFkRXhpdEhhbmRsZXJzLnBvcCgpKCl9aWYoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRCYmX3B0aHJlYWRfc2VsZigpKV9fX3B0aHJlYWRfdHNkX3J1bl9kdG9ycygpfSxydW5FeGl0SGFuZGxlcnNBbmREZWluaXRUaHJlYWQ6ZnVuY3Rpb24odGIsZXhpdENvZGUpe0F0b21pY3Muc3RvcmUoR1JPV0FCTEVfSEVBUF9VMzIoKSx0Yis1Nj4+MiwxKTtBdG9taWNzLnN0b3JlKEdST1dBQkxFX0hFQVBfVTMyKCksdGIrNjA+PjIsMCk7UFRocmVhZC5ydW5FeGl0SGFuZGxlcnMoKTtBdG9taWNzLnN0b3JlKEdST1dBQkxFX0hFQVBfVTMyKCksdGIrND4+MixleGl0Q29kZSk7QXRvbWljcy5zdG9yZShHUk9XQUJMRV9IRUFQX1UzMigpLHRiKzA+PjIsMSk7X2Vtc2NyaXB0ZW5fZnV0ZXhfd2FrZSh0YiswLDIxNDc0ODM2NDcpO19fZW1zY3JpcHRlbl90aHJlYWRfaW5pdCgwLDAsMCl9LHRocmVhZEV4aXQ6ZnVuY3Rpb24oZXhpdENvZGUpe3ZhciB0Yj1fcHRocmVhZF9zZWxmKCk7aWYodGIpe1BUaHJlYWQucnVuRXhpdEhhbmRsZXJzQW5kRGVpbml0VGhyZWFkKHRiLGV4aXRDb2RlKTtpZihFTlZJUk9OTUVOVF9JU19QVEhSRUFEKXtwb3N0TWVzc2FnZSh7XCJjbWRcIjpcImV4aXRcIn0pfX19LHRocmVhZENhbmNlbDpmdW5jdGlvbigpe1BUaHJlYWQucnVuRXhpdEhhbmRsZXJzQW5kRGVpbml0VGhyZWFkKF9wdGhyZWFkX3NlbGYoKSwtMSk7cG9zdE1lc3NhZ2Uoe1wiY21kXCI6XCJjYW5jZWxEb25lXCJ9KX0sdGVybWluYXRlQWxsVGhyZWFkczpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiBQVGhyZWFkLnB0aHJlYWRzKXt2YXIgcHRocmVhZD1QVGhyZWFkLnB0aHJlYWRzW3RdO2lmKHB0aHJlYWQmJnB0aHJlYWQud29ya2VyKXtQVGhyZWFkLnJldHVybldvcmtlclRvUG9vbChwdGhyZWFkLndvcmtlcil9fVBUaHJlYWQucHRocmVhZHM9e307Zm9yKHZhciBpPTA7aTxQVGhyZWFkLnVudXNlZFdvcmtlcnMubGVuZ3RoOysraSl7dmFyIHdvcmtlcj1QVGhyZWFkLnVudXNlZFdvcmtlcnNbaV07d29ya2VyLnRlcm1pbmF0ZSgpfVBUaHJlYWQudW51c2VkV29ya2Vycz1bXTtmb3IodmFyIGk9MDtpPFBUaHJlYWQucnVubmluZ1dvcmtlcnMubGVuZ3RoOysraSl7dmFyIHdvcmtlcj1QVGhyZWFkLnJ1bm5pbmdXb3JrZXJzW2ldO3ZhciBwdGhyZWFkPXdvcmtlci5wdGhyZWFkO1BUaHJlYWQuZnJlZVRocmVhZERhdGEocHRocmVhZCk7d29ya2VyLnRlcm1pbmF0ZSgpfVBUaHJlYWQucnVubmluZ1dvcmtlcnM9W119LGZyZWVUaHJlYWREYXRhOmZ1bmN0aW9uKHB0aHJlYWQpe2lmKCFwdGhyZWFkKXJldHVybjtpZihwdGhyZWFkLnRocmVhZEluZm9TdHJ1Y3Qpe3ZhciB0bHNNZW1vcnk9R1JPV0FCTEVfSEVBUF9JMzIoKVtwdGhyZWFkLnRocmVhZEluZm9TdHJ1Y3QrMTAwPj4yXTtHUk9XQUJMRV9IRUFQX0kzMigpW3B0aHJlYWQudGhyZWFkSW5mb1N0cnVjdCsxMDA+PjJdPTA7X2ZyZWUodGxzTWVtb3J5KTtfZnJlZShwdGhyZWFkLnRocmVhZEluZm9TdHJ1Y3QpfXB0aHJlYWQudGhyZWFkSW5mb1N0cnVjdD0wO2lmKHB0aHJlYWQuYWxsb2NhdGVkT3duU3RhY2smJnB0aHJlYWQuc3RhY2tCYXNlKV9mcmVlKHB0aHJlYWQuc3RhY2tCYXNlKTtwdGhyZWFkLnN0YWNrQmFzZT0wO2lmKHB0aHJlYWQud29ya2VyKXB0aHJlYWQud29ya2VyLnB0aHJlYWQ9bnVsbH0scmV0dXJuV29ya2VyVG9Qb29sOmZ1bmN0aW9uKHdvcmtlcil7UFRocmVhZC5ydW5XaXRob3V0TWFpblRocmVhZFF1ZXVlZENhbGxzKGZ1bmN0aW9uKCl7ZGVsZXRlIFBUaHJlYWQucHRocmVhZHNbd29ya2VyLnB0aHJlYWQudGhyZWFkSW5mb1N0cnVjdF07UFRocmVhZC51bnVzZWRXb3JrZXJzLnB1c2god29ya2VyKTtQVGhyZWFkLnJ1bm5pbmdXb3JrZXJzLnNwbGljZShQVGhyZWFkLnJ1bm5pbmdXb3JrZXJzLmluZGV4T2Yod29ya2VyKSwxKTtQVGhyZWFkLmZyZWVUaHJlYWREYXRhKHdvcmtlci5wdGhyZWFkKTt3b3JrZXIucHRocmVhZD11bmRlZmluZWR9KX0scnVuV2l0aG91dE1haW5UaHJlYWRRdWV1ZWRDYWxsczpmdW5jdGlvbihmdW5jKXtHUk9XQUJMRV9IRUFQX0kzMigpW19fZW1zY3JpcHRlbl9hbGxvd19tYWluX3J1bnRpbWVfcXVldWVkX2NhbGxzPj4yXT0wO3RyeXtmdW5jKCl9ZmluYWxseXtHUk9XQUJMRV9IRUFQX0kzMigpW19fZW1zY3JpcHRlbl9hbGxvd19tYWluX3J1bnRpbWVfcXVldWVkX2NhbGxzPj4yXT0xfX0scmVjZWl2ZU9iamVjdFRyYW5zZmVyOmZ1bmN0aW9uKGRhdGEpe30sbG9hZFdhc21Nb2R1bGVUb1dvcmtlcjpmdW5jdGlvbih3b3JrZXIsb25GaW5pc2hlZExvYWRpbmcpe3dvcmtlci5vbm1lc3NhZ2U9ZnVuY3Rpb24oZSl7dmFyIGQ9ZVtcImRhdGFcIl07dmFyIGNtZD1kW1wiY21kXCJdO2lmKHdvcmtlci5wdGhyZWFkKVBUaHJlYWQuY3VycmVudFByb3hpZWRPcGVyYXRpb25DYWxsZXJUaHJlYWQ9d29ya2VyLnB0aHJlYWQudGhyZWFkSW5mb1N0cnVjdDtpZihkW1widGFyZ2V0VGhyZWFkXCJdJiZkW1widGFyZ2V0VGhyZWFkXCJdIT1fcHRocmVhZF9zZWxmKCkpe3ZhciB0aHJlYWQ9UFRocmVhZC5wdGhyZWFkc1tkLnRhcmdldFRocmVhZF07aWYodGhyZWFkKXt0aHJlYWQud29ya2VyLnBvc3RNZXNzYWdlKGUuZGF0YSxkW1widHJhbnNmZXJMaXN0XCJdKX1lbHNle2NvbnNvbGUuZXJyb3IoJ0ludGVybmFsIGVycm9yISBXb3JrZXIgc2VudCBhIG1lc3NhZ2UgXCInK2NtZCsnXCIgdG8gdGFyZ2V0IHB0aHJlYWQgJytkW1widGFyZ2V0VGhyZWFkXCJdK1wiLCBidXQgdGhhdCB0aHJlYWQgbm8gbG9uZ2VyIGV4aXN0cyFcIil9UFRocmVhZC5jdXJyZW50UHJveGllZE9wZXJhdGlvbkNhbGxlclRocmVhZD11bmRlZmluZWQ7cmV0dXJufWlmKGNtZD09PVwicHJvY2Vzc1F1ZXVlZE1haW5UaHJlYWRXb3JrXCIpe19lbXNjcmlwdGVuX21haW5fdGhyZWFkX3Byb2Nlc3NfcXVldWVkX2NhbGxzKCl9ZWxzZSBpZihjbWQ9PT1cInNwYXduVGhyZWFkXCIpe3NwYXduVGhyZWFkKGUuZGF0YSl9ZWxzZSBpZihjbWQ9PT1cImNsZWFudXBUaHJlYWRcIil7Y2xlYW51cFRocmVhZChkW1widGhyZWFkXCJdKX1lbHNlIGlmKGNtZD09PVwia2lsbFRocmVhZFwiKXtraWxsVGhyZWFkKGRbXCJ0aHJlYWRcIl0pfWVsc2UgaWYoY21kPT09XCJjYW5jZWxUaHJlYWRcIil7Y2FuY2VsVGhyZWFkKGRbXCJ0aHJlYWRcIl0pfWVsc2UgaWYoY21kPT09XCJsb2FkZWRcIil7d29ya2VyLmxvYWRlZD10cnVlO2lmKG9uRmluaXNoZWRMb2FkaW5nKW9uRmluaXNoZWRMb2FkaW5nKHdvcmtlcik7aWYod29ya2VyLnJ1blB0aHJlYWQpe3dvcmtlci5ydW5QdGhyZWFkKCk7ZGVsZXRlIHdvcmtlci5ydW5QdGhyZWFkfX1lbHNlIGlmKGNtZD09PVwicHJpbnRcIil7b3V0KFwiVGhyZWFkIFwiK2RbXCJ0aHJlYWRJZFwiXStcIjogXCIrZFtcInRleHRcIl0pfWVsc2UgaWYoY21kPT09XCJwcmludEVyclwiKXtlcnIoXCJUaHJlYWQgXCIrZFtcInRocmVhZElkXCJdK1wiOiBcIitkW1widGV4dFwiXSl9ZWxzZSBpZihjbWQ9PT1cImFsZXJ0XCIpe2FsZXJ0KFwiVGhyZWFkIFwiK2RbXCJ0aHJlYWRJZFwiXStcIjogXCIrZFtcInRleHRcIl0pfWVsc2UgaWYoY21kPT09XCJleGl0XCIpe3ZhciBkZXRhY2hlZD13b3JrZXIucHRocmVhZCYmQXRvbWljcy5sb2FkKEdST1dBQkxFX0hFQVBfVTMyKCksd29ya2VyLnB0aHJlYWQudGhyZWFkSW5mb1N0cnVjdCs2ND4+Mik7aWYoZGV0YWNoZWQpe1BUaHJlYWQucmV0dXJuV29ya2VyVG9Qb29sKHdvcmtlcil9fWVsc2UgaWYoY21kPT09XCJleGl0UHJvY2Vzc1wiKXt0cnl7ZXhpdChkW1wicmV0dXJuQ29kZVwiXSl9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIEV4aXRTdGF0dXMpcmV0dXJuO3Rocm93IGV9fWVsc2UgaWYoY21kPT09XCJjYW5jZWxEb25lXCIpe1BUaHJlYWQucmV0dXJuV29ya2VyVG9Qb29sKHdvcmtlcil9ZWxzZSBpZihjbWQ9PT1cIm9iamVjdFRyYW5zZmVyXCIpe1BUaHJlYWQucmVjZWl2ZU9iamVjdFRyYW5zZmVyKGUuZGF0YSl9ZWxzZSBpZihlLmRhdGEudGFyZ2V0PT09XCJzZXRpbW1lZGlhdGVcIil7d29ya2VyLnBvc3RNZXNzYWdlKGUuZGF0YSl9ZWxzZXtlcnIoXCJ3b3JrZXIgc2VudCBhbiB1bmtub3duIGNvbW1hbmQgXCIrY21kKX1QVGhyZWFkLmN1cnJlbnRQcm94aWVkT3BlcmF0aW9uQ2FsbGVyVGhyZWFkPXVuZGVmaW5lZH07d29ya2VyLm9uZXJyb3I9ZnVuY3Rpb24oZSl7ZXJyKFwicHRocmVhZCBzZW50IGFuIGVycm9yISBcIitlLmZpbGVuYW1lK1wiOlwiK2UubGluZW5vK1wiOiBcIitlLm1lc3NhZ2UpfTtpZihFTlZJUk9OTUVOVF9JU19OT0RFKXt3b3JrZXIub24oXCJtZXNzYWdlXCIsZnVuY3Rpb24oZGF0YSl7d29ya2VyLm9ubWVzc2FnZSh7ZGF0YTpkYXRhfSl9KTt3b3JrZXIub24oXCJlcnJvclwiLGZ1bmN0aW9uKGRhdGEpe3dvcmtlci5vbmVycm9yKGRhdGEpfSk7d29ya2VyLm9uKFwiZXhpdFwiLGZ1bmN0aW9uKGRhdGEpe30pfXdvcmtlci5wb3N0TWVzc2FnZSh7XCJjbWRcIjpcImxvYWRcIixcInVybE9yQmxvYlwiOk1vZHVsZVtcIm1haW5TY3JpcHRVcmxPckJsb2JcIl18fF9zY3JpcHREaXIsXCJ3YXNtTWVtb3J5XCI6d2FzbU1lbW9yeSxcIndhc21Nb2R1bGVcIjp3YXNtTW9kdWxlfSl9LGFsbG9jYXRlVW51c2VkV29ya2VyOmZ1bmN0aW9uKCl7dmFyIHB0aHJlYWRNYWluSnM9bG9jYXRlRmlsZShcInRmanMtYmFja2VuZC13YXNtLXRocmVhZGVkLXNpbWQud29ya2VyLmpzXCIpO1BUaHJlYWQudW51c2VkV29ya2Vycy5wdXNoKG5ldyBXb3JrZXIocHRocmVhZE1haW5KcykpfSxnZXROZXdXb3JrZXI6ZnVuY3Rpb24oKXtpZihQVGhyZWFkLnVudXNlZFdvcmtlcnMubGVuZ3RoPT0wKXtQVGhyZWFkLmFsbG9jYXRlVW51c2VkV29ya2VyKCk7UFRocmVhZC5sb2FkV2FzbU1vZHVsZVRvV29ya2VyKFBUaHJlYWQudW51c2VkV29ya2Vyc1swXSl9aWYoUFRocmVhZC51bnVzZWRXb3JrZXJzLmxlbmd0aD4wKXJldHVybiBQVGhyZWFkLnVudXNlZFdvcmtlcnMucG9wKCk7ZWxzZSByZXR1cm4gbnVsbH0sYnVzeVNwaW5XYWl0OmZ1bmN0aW9uKG1zZWNzKXt2YXIgdD1wZXJmb3JtYW5jZS5ub3coKSttc2Vjczt3aGlsZShwZXJmb3JtYW5jZS5ub3coKTx0KXt9fX07ZnVuY3Rpb24gZXN0YWJsaXNoU3RhY2tTcGFjZShzdGFja1RvcCxzdGFja01heCl7X2Vtc2NyaXB0ZW5fc3RhY2tfc2V0X2xpbWl0cyhzdGFja1RvcCxzdGFja01heCk7c3RhY2tSZXN0b3JlKHN0YWNrVG9wKX1Nb2R1bGVbXCJlc3RhYmxpc2hTdGFja1NwYWNlXCJdPWVzdGFibGlzaFN0YWNrU3BhY2U7ZnVuY3Rpb24gZ2V0Tm9FeGl0UnVudGltZSgpe3JldHVybiBub0V4aXRSdW50aW1lfU1vZHVsZVtcImdldE5vRXhpdFJ1bnRpbWVcIl09Z2V0Tm9FeGl0UnVudGltZTtmdW5jdGlvbiBpbnZva2VFbnRyeVBvaW50KHB0cixhcmcpe3JldHVybiB3YXNtVGFibGUuZ2V0KHB0cikoYXJnKX1Nb2R1bGVbXCJpbnZva2VFbnRyeVBvaW50XCJdPWludm9rZUVudHJ5UG9pbnQ7ZnVuY3Rpb24gX19fYXNzZXJ0X2ZhaWwoY29uZGl0aW9uLGZpbGVuYW1lLGxpbmUsZnVuYyl7YWJvcnQoXCJBc3NlcnRpb24gZmFpbGVkOiBcIitVVEY4VG9TdHJpbmcoY29uZGl0aW9uKStcIiwgYXQ6IFwiK1tmaWxlbmFtZT9VVEY4VG9TdHJpbmcoZmlsZW5hbWUpOlwidW5rbm93biBmaWxlbmFtZVwiLGxpbmUsZnVuYz9VVEY4VG9TdHJpbmcoZnVuYyk6XCJ1bmtub3duIGZ1bmN0aW9uXCJdKX1mdW5jdGlvbiBfX19jYWxsX21haW4oYXJnYyxhcmd2KXt2YXIgcmV0dXJuQ29kZT1fbWFpbihhcmdjLGFyZ3YpfXZhciBfZW1zY3JpcHRlbl9nZXRfbm93O2lmKEVOVklST05NRU5UX0lTX05PREUpe19lbXNjcmlwdGVuX2dldF9ub3c9ZnVuY3Rpb24oKXt2YXIgdD1wcm9jZXNzW1wiaHJ0aW1lXCJdKCk7cmV0dXJuIHRbMF0qMWUzK3RbMV0vMWU2fX1lbHNlIGlmKEVOVklST05NRU5UX0lTX1BUSFJFQUQpe19lbXNjcmlwdGVuX2dldF9ub3c9ZnVuY3Rpb24oKXtyZXR1cm4gcGVyZm9ybWFuY2Uubm93KCktTW9kdWxlW1wiX19wZXJmb3JtYW5jZV9ub3dfY2xvY2tfZHJpZnRcIl19fWVsc2UgaWYodHlwZW9mIGRhdGVOb3chPT1cInVuZGVmaW5lZFwiKXtfZW1zY3JpcHRlbl9nZXRfbm93PWRhdGVOb3d9ZWxzZSBfZW1zY3JpcHRlbl9nZXRfbm93PWZ1bmN0aW9uKCl7cmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpfTtmdW5jdGlvbiBzZXRFcnJObyh2YWx1ZSl7R1JPV0FCTEVfSEVBUF9JMzIoKVtfX19lcnJub19sb2NhdGlvbigpPj4yXT12YWx1ZTtyZXR1cm4gdmFsdWV9ZnVuY3Rpb24gX2F0ZXhpdChmdW5jLGFyZyl7aWYoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRClyZXR1cm4gX2Vtc2NyaXB0ZW5fcHJveHlfdG9fbWFpbl90aHJlYWRfanMoMSwxLGZ1bmMsYXJnKX1mdW5jdGlvbiBfX2Vtc2NyaXB0ZW5fbm90aWZ5X3RocmVhZF9xdWV1ZSh0YXJnZXRUaHJlYWRJZCxtYWluVGhyZWFkSWQpe2lmKHRhcmdldFRocmVhZElkPT1tYWluVGhyZWFkSWQpe3Bvc3RNZXNzYWdlKHtcImNtZFwiOlwicHJvY2Vzc1F1ZXVlZE1haW5UaHJlYWRXb3JrXCJ9KX1lbHNlIGlmKEVOVklST05NRU5UX0lTX1BUSFJFQUQpe3Bvc3RNZXNzYWdlKHtcInRhcmdldFRocmVhZFwiOnRhcmdldFRocmVhZElkLFwiY21kXCI6XCJwcm9jZXNzVGhyZWFkUXVldWVcIn0pfWVsc2V7dmFyIHB0aHJlYWQ9UFRocmVhZC5wdGhyZWFkc1t0YXJnZXRUaHJlYWRJZF07dmFyIHdvcmtlcj1wdGhyZWFkJiZwdGhyZWFkLndvcmtlcjtpZighd29ya2VyKXtyZXR1cm59d29ya2VyLnBvc3RNZXNzYWdlKHtcImNtZFwiOlwicHJvY2Vzc1RocmVhZFF1ZXVlXCJ9KX1yZXR1cm4gMX1mdW5jdGlvbiBfYWJvcnQoKXthYm9ydCgpfWZ1bmN0aW9uIF9lbXNjcmlwdGVuX2FzbV9jb25zdF9pbnQoY29kZSxzaWdQdHIsYXJnYnVmKXt2YXIgYXJncz1yZWFkQXNtQ29uc3RBcmdzKHNpZ1B0cixhcmdidWYpO3JldHVybiBBU01fQ09OU1RTW2NvZGVdLmFwcGx5KG51bGwsYXJncyl9ZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fY29uZGl0aW9uYWxfc2V0X2N1cnJlbnRfdGhyZWFkX3N0YXR1cyhleHBlY3RlZFN0YXR1cyxuZXdTdGF0dXMpe31mdW5jdGlvbiBfZW1zY3JpcHRlbl9mdXRleF93YWl0KGFkZHIsdmFsLHRpbWVvdXQpe2lmKGFkZHI8PTB8fGFkZHI+R1JPV0FCTEVfSEVBUF9JOCgpLmxlbmd0aHx8YWRkciYzIT0wKXJldHVybi0yODtpZighRU5WSVJPTk1FTlRfSVNfV0VCKXt2YXIgcmV0PUF0b21pY3Mud2FpdChHUk9XQUJMRV9IRUFQX0kzMigpLGFkZHI+PjIsdmFsLHRpbWVvdXQpO2lmKHJldD09PVwidGltZWQtb3V0XCIpcmV0dXJuLTczO2lmKHJldD09PVwibm90LWVxdWFsXCIpcmV0dXJuLTY7aWYocmV0PT09XCJva1wiKXJldHVybiAwO3Rocm93XCJBdG9taWNzLndhaXQgcmV0dXJuZWQgYW4gdW5leHBlY3RlZCB2YWx1ZSBcIityZXR9ZWxzZXtpZihBdG9taWNzLmxvYWQoR1JPV0FCTEVfSEVBUF9JMzIoKSxhZGRyPj4yKSE9dmFsKXtyZXR1cm4tNn12YXIgdE5vdz1wZXJmb3JtYW5jZS5ub3coKTt2YXIgdEVuZD10Tm93K3RpbWVvdXQ7dmFyIGxhc3RBZGRyPUF0b21pY3MuZXhjaGFuZ2UoR1JPV0FCTEVfSEVBUF9JMzIoKSxfX2Vtc2NyaXB0ZW5fbWFpbl90aHJlYWRfZnV0ZXg+PjIsYWRkcik7d2hpbGUoMSl7dE5vdz1wZXJmb3JtYW5jZS5ub3coKTtpZih0Tm93PnRFbmQpe2xhc3RBZGRyPUF0b21pY3MuZXhjaGFuZ2UoR1JPV0FCTEVfSEVBUF9JMzIoKSxfX2Vtc2NyaXB0ZW5fbWFpbl90aHJlYWRfZnV0ZXg+PjIsMCk7cmV0dXJuLTczfWxhc3RBZGRyPUF0b21pY3MuZXhjaGFuZ2UoR1JPV0FCTEVfSEVBUF9JMzIoKSxfX2Vtc2NyaXB0ZW5fbWFpbl90aHJlYWRfZnV0ZXg+PjIsMCk7aWYobGFzdEFkZHI9PTApe2JyZWFrfV9lbXNjcmlwdGVuX21haW5fdGhyZWFkX3Byb2Nlc3NfcXVldWVkX2NhbGxzKCk7aWYoQXRvbWljcy5sb2FkKEdST1dBQkxFX0hFQVBfSTMyKCksYWRkcj4+MikhPXZhbCl7cmV0dXJuLTZ9bGFzdEFkZHI9QXRvbWljcy5leGNoYW5nZShHUk9XQUJMRV9IRUFQX0kzMigpLF9fZW1zY3JpcHRlbl9tYWluX3RocmVhZF9mdXRleD4+MixhZGRyKX1yZXR1cm4gMH19ZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fbWVtY3B5X2JpZyhkZXN0LHNyYyxudW0pe0dST1dBQkxFX0hFQVBfVTgoKS5jb3B5V2l0aGluKGRlc3Qsc3JjLHNyYytudW0pfWZ1bmN0aW9uIF9lbXNjcmlwdGVuX251bV9sb2dpY2FsX2NvcmVzKCl7aWYoRU5WSVJPTk1FTlRfSVNfTk9ERSlyZXR1cm4gcmVxdWlyZShcIm9zXCIpLmNwdXMoKS5sZW5ndGg7cmV0dXJuIG5hdmlnYXRvcltcImhhcmR3YXJlQ29uY3VycmVuY3lcIl19ZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fcHJveHlfdG9fbWFpbl90aHJlYWRfanMoaW5kZXgsc3luYyl7dmFyIG51bUNhbGxBcmdzPWFyZ3VtZW50cy5sZW5ndGgtMjt2YXIgc3RhY2s9c3RhY2tTYXZlKCk7dmFyIHNlcmlhbGl6ZWROdW1DYWxsQXJncz1udW1DYWxsQXJnczt2YXIgYXJncz1zdGFja0FsbG9jKHNlcmlhbGl6ZWROdW1DYWxsQXJncyo4KTt2YXIgYj1hcmdzPj4zO2Zvcih2YXIgaT0wO2k8bnVtQ2FsbEFyZ3M7aSsrKXt2YXIgYXJnPWFyZ3VtZW50c1syK2ldO0dST1dBQkxFX0hFQVBfRjY0KClbYitpXT1hcmd9dmFyIHJldD1fZW1zY3JpcHRlbl9ydW5faW5fbWFpbl9ydW50aW1lX3RocmVhZF9qcyhpbmRleCxzZXJpYWxpemVkTnVtQ2FsbEFyZ3MsYXJncyxzeW5jKTtzdGFja1Jlc3RvcmUoc3RhY2spO3JldHVybiByZXR9dmFyIF9lbXNjcmlwdGVuX3JlY2VpdmVfb25fbWFpbl90aHJlYWRfanNfY2FsbEFyZ3M9W107dmFyIHJlYWRBc21Db25zdEFyZ3NBcnJheT1bXTtmdW5jdGlvbiByZWFkQXNtQ29uc3RBcmdzKHNpZ1B0cixidWYpe3JlYWRBc21Db25zdEFyZ3NBcnJheS5sZW5ndGg9MDt2YXIgY2g7YnVmPj49Mjt3aGlsZShjaD1HUk9XQUJMRV9IRUFQX1U4KClbc2lnUHRyKytdKXt2YXIgZG91YmxlPWNoPDEwNTtpZihkb3VibGUmJmJ1ZiYxKWJ1ZisrO3JlYWRBc21Db25zdEFyZ3NBcnJheS5wdXNoKGRvdWJsZT9HUk9XQUJMRV9IRUFQX0Y2NCgpW2J1ZisrPj4xXTpHUk9XQUJMRV9IRUFQX0kzMigpW2J1Zl0pOysrYnVmfXJldHVybiByZWFkQXNtQ29uc3RBcmdzQXJyYXl9ZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fcmVjZWl2ZV9vbl9tYWluX3RocmVhZF9qcyhpbmRleCxudW1DYWxsQXJncyxhcmdzKXtfZW1zY3JpcHRlbl9yZWNlaXZlX29uX21haW5fdGhyZWFkX2pzX2NhbGxBcmdzLmxlbmd0aD1udW1DYWxsQXJnczt2YXIgYj1hcmdzPj4zO2Zvcih2YXIgaT0wO2k8bnVtQ2FsbEFyZ3M7aSsrKXtfZW1zY3JpcHRlbl9yZWNlaXZlX29uX21haW5fdGhyZWFkX2pzX2NhbGxBcmdzW2ldPUdST1dBQkxFX0hFQVBfRjY0KClbYitpXX12YXIgaXNFbUFzbUNvbnN0PWluZGV4PDA7dmFyIGZ1bmM9IWlzRW1Bc21Db25zdD9wcm94aWVkRnVuY3Rpb25UYWJsZVtpbmRleF06QVNNX0NPTlNUU1staW5kZXgtMV07cmV0dXJuIGZ1bmMuYXBwbHkobnVsbCxfZW1zY3JpcHRlbl9yZWNlaXZlX29uX21haW5fdGhyZWFkX2pzX2NhbGxBcmdzKX1mdW5jdGlvbiBfZW1zY3JpcHRlbl9nZXRfaGVhcF9zaXplKCl7cmV0dXJuIEdST1dBQkxFX0hFQVBfVTgoKS5sZW5ndGh9ZnVuY3Rpb24gZW1zY3JpcHRlbl9yZWFsbG9jX2J1ZmZlcihzaXplKXt0cnl7d2FzbU1lbW9yeS5ncm93KHNpemUtYnVmZmVyLmJ5dGVMZW5ndGgrNjU1MzU+Pj4xNik7dXBkYXRlR2xvYmFsQnVmZmVyQW5kVmlld3Mod2FzbU1lbW9yeS5idWZmZXIpO3JldHVybiAxfWNhdGNoKGUpe319ZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fcmVzaXplX2hlYXAocmVxdWVzdGVkU2l6ZSl7dmFyIG9sZFNpemU9X2Vtc2NyaXB0ZW5fZ2V0X2hlYXBfc2l6ZSgpO2lmKHJlcXVlc3RlZFNpemU8PW9sZFNpemUpe3JldHVybiBmYWxzZX12YXIgbWF4SGVhcFNpemU9MjE0NzQ4MzY0ODtpZihyZXF1ZXN0ZWRTaXplPm1heEhlYXBTaXplKXtyZXR1cm4gZmFsc2V9Zm9yKHZhciBjdXREb3duPTE7Y3V0RG93bjw9NDtjdXREb3duKj0yKXt2YXIgb3Zlckdyb3duSGVhcFNpemU9b2xkU2l6ZSooMSsuMi9jdXREb3duKTtvdmVyR3Jvd25IZWFwU2l6ZT1NYXRoLm1pbihvdmVyR3Jvd25IZWFwU2l6ZSxyZXF1ZXN0ZWRTaXplKzEwMDY2MzI5Nik7dmFyIG5ld1NpemU9TWF0aC5taW4obWF4SGVhcFNpemUsYWxpZ25VcChNYXRoLm1heChyZXF1ZXN0ZWRTaXplLG92ZXJHcm93bkhlYXBTaXplKSw2NTUzNikpO3ZhciByZXBsYWNlbWVudD1lbXNjcmlwdGVuX3JlYWxsb2NfYnVmZmVyKG5ld1NpemUpO2lmKHJlcGxhY2VtZW50KXtyZXR1cm4gdHJ1ZX19cmV0dXJuIGZhbHNlfXZhciBKU0V2ZW50cz17aW5FdmVudEhhbmRsZXI6MCxyZW1vdmVBbGxFdmVudExpc3RlbmVyczpmdW5jdGlvbigpe2Zvcih2YXIgaT1KU0V2ZW50cy5ldmVudEhhbmRsZXJzLmxlbmd0aC0xO2k+PTA7LS1pKXtKU0V2ZW50cy5fcmVtb3ZlSGFuZGxlcihpKX1KU0V2ZW50cy5ldmVudEhhbmRsZXJzPVtdO0pTRXZlbnRzLmRlZmVycmVkQ2FsbHM9W119LHJlZ2lzdGVyUmVtb3ZlRXZlbnRMaXN0ZW5lcnM6ZnVuY3Rpb24oKXtpZighSlNFdmVudHMucmVtb3ZlRXZlbnRMaXN0ZW5lcnNSZWdpc3RlcmVkKXtfX0FURVhJVF9fLnB1c2goSlNFdmVudHMucmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnMpO0pTRXZlbnRzLnJlbW92ZUV2ZW50TGlzdGVuZXJzUmVnaXN0ZXJlZD10cnVlfX0sZGVmZXJyZWRDYWxsczpbXSxkZWZlckNhbGw6ZnVuY3Rpb24odGFyZ2V0RnVuY3Rpb24scHJlY2VkZW5jZSxhcmdzTGlzdCl7ZnVuY3Rpb24gYXJyYXlzSGF2ZUVxdWFsQ29udGVudChhcnJBLGFyckIpe2lmKGFyckEubGVuZ3RoIT1hcnJCLmxlbmd0aClyZXR1cm4gZmFsc2U7Zm9yKHZhciBpIGluIGFyckEpe2lmKGFyckFbaV0hPWFyckJbaV0pcmV0dXJuIGZhbHNlfXJldHVybiB0cnVlfWZvcih2YXIgaSBpbiBKU0V2ZW50cy5kZWZlcnJlZENhbGxzKXt2YXIgY2FsbD1KU0V2ZW50cy5kZWZlcnJlZENhbGxzW2ldO2lmKGNhbGwudGFyZ2V0RnVuY3Rpb249PXRhcmdldEZ1bmN0aW9uJiZhcnJheXNIYXZlRXF1YWxDb250ZW50KGNhbGwuYXJnc0xpc3QsYXJnc0xpc3QpKXtyZXR1cm59fUpTRXZlbnRzLmRlZmVycmVkQ2FsbHMucHVzaCh7dGFyZ2V0RnVuY3Rpb246dGFyZ2V0RnVuY3Rpb24scHJlY2VkZW5jZTpwcmVjZWRlbmNlLGFyZ3NMaXN0OmFyZ3NMaXN0fSk7SlNFdmVudHMuZGVmZXJyZWRDYWxscy5zb3J0KGZ1bmN0aW9uKHgseSl7cmV0dXJuIHgucHJlY2VkZW5jZTx5LnByZWNlZGVuY2V9KX0scmVtb3ZlRGVmZXJyZWRDYWxsczpmdW5jdGlvbih0YXJnZXRGdW5jdGlvbil7Zm9yKHZhciBpPTA7aTxKU0V2ZW50cy5kZWZlcnJlZENhbGxzLmxlbmd0aDsrK2kpe2lmKEpTRXZlbnRzLmRlZmVycmVkQ2FsbHNbaV0udGFyZ2V0RnVuY3Rpb249PXRhcmdldEZ1bmN0aW9uKXtKU0V2ZW50cy5kZWZlcnJlZENhbGxzLnNwbGljZShpLDEpOy0taX19fSxjYW5QZXJmb3JtRXZlbnRIYW5kbGVyUmVxdWVzdHM6ZnVuY3Rpb24oKXtyZXR1cm4gSlNFdmVudHMuaW5FdmVudEhhbmRsZXImJkpTRXZlbnRzLmN1cnJlbnRFdmVudEhhbmRsZXIuYWxsb3dzRGVmZXJyZWRDYWxsc30scnVuRGVmZXJyZWRDYWxsczpmdW5jdGlvbigpe2lmKCFKU0V2ZW50cy5jYW5QZXJmb3JtRXZlbnRIYW5kbGVyUmVxdWVzdHMoKSl7cmV0dXJufWZvcih2YXIgaT0wO2k8SlNFdmVudHMuZGVmZXJyZWRDYWxscy5sZW5ndGg7KytpKXt2YXIgY2FsbD1KU0V2ZW50cy5kZWZlcnJlZENhbGxzW2ldO0pTRXZlbnRzLmRlZmVycmVkQ2FsbHMuc3BsaWNlKGksMSk7LS1pO2NhbGwudGFyZ2V0RnVuY3Rpb24uYXBwbHkobnVsbCxjYWxsLmFyZ3NMaXN0KX19LGV2ZW50SGFuZGxlcnM6W10scmVtb3ZlQWxsSGFuZGxlcnNPblRhcmdldDpmdW5jdGlvbih0YXJnZXQsZXZlbnRUeXBlU3RyaW5nKXtmb3IodmFyIGk9MDtpPEpTRXZlbnRzLmV2ZW50SGFuZGxlcnMubGVuZ3RoOysraSl7aWYoSlNFdmVudHMuZXZlbnRIYW5kbGVyc1tpXS50YXJnZXQ9PXRhcmdldCYmKCFldmVudFR5cGVTdHJpbmd8fGV2ZW50VHlwZVN0cmluZz09SlNFdmVudHMuZXZlbnRIYW5kbGVyc1tpXS5ldmVudFR5cGVTdHJpbmcpKXtKU0V2ZW50cy5fcmVtb3ZlSGFuZGxlcihpLS0pfX19LF9yZW1vdmVIYW5kbGVyOmZ1bmN0aW9uKGkpe3ZhciBoPUpTRXZlbnRzLmV2ZW50SGFuZGxlcnNbaV07aC50YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihoLmV2ZW50VHlwZVN0cmluZyxoLmV2ZW50TGlzdGVuZXJGdW5jLGgudXNlQ2FwdHVyZSk7SlNFdmVudHMuZXZlbnRIYW5kbGVycy5zcGxpY2UoaSwxKX0scmVnaXN0ZXJPclJlbW92ZUhhbmRsZXI6ZnVuY3Rpb24oZXZlbnRIYW5kbGVyKXt2YXIganNFdmVudEhhbmRsZXI9ZnVuY3Rpb24ganNFdmVudEhhbmRsZXIoZXZlbnQpeysrSlNFdmVudHMuaW5FdmVudEhhbmRsZXI7SlNFdmVudHMuY3VycmVudEV2ZW50SGFuZGxlcj1ldmVudEhhbmRsZXI7SlNFdmVudHMucnVuRGVmZXJyZWRDYWxscygpO2V2ZW50SGFuZGxlci5oYW5kbGVyRnVuYyhldmVudCk7SlNFdmVudHMucnVuRGVmZXJyZWRDYWxscygpOy0tSlNFdmVudHMuaW5FdmVudEhhbmRsZXJ9O2lmKGV2ZW50SGFuZGxlci5jYWxsYmFja2Z1bmMpe2V2ZW50SGFuZGxlci5ldmVudExpc3RlbmVyRnVuYz1qc0V2ZW50SGFuZGxlcjtldmVudEhhbmRsZXIudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRIYW5kbGVyLmV2ZW50VHlwZVN0cmluZyxqc0V2ZW50SGFuZGxlcixldmVudEhhbmRsZXIudXNlQ2FwdHVyZSk7SlNFdmVudHMuZXZlbnRIYW5kbGVycy5wdXNoKGV2ZW50SGFuZGxlcik7SlNFdmVudHMucmVnaXN0ZXJSZW1vdmVFdmVudExpc3RlbmVycygpfWVsc2V7Zm9yKHZhciBpPTA7aTxKU0V2ZW50cy5ldmVudEhhbmRsZXJzLmxlbmd0aDsrK2kpe2lmKEpTRXZlbnRzLmV2ZW50SGFuZGxlcnNbaV0udGFyZ2V0PT1ldmVudEhhbmRsZXIudGFyZ2V0JiZKU0V2ZW50cy5ldmVudEhhbmRsZXJzW2ldLmV2ZW50VHlwZVN0cmluZz09ZXZlbnRIYW5kbGVyLmV2ZW50VHlwZVN0cmluZyl7SlNFdmVudHMuX3JlbW92ZUhhbmRsZXIoaS0tKX19fX0scXVldWVFdmVudEhhbmRsZXJPblRocmVhZF9paWlpOmZ1bmN0aW9uKHRhcmdldFRocmVhZCxldmVudEhhbmRsZXJGdW5jLGV2ZW50VHlwZUlkLGV2ZW50RGF0YSx1c2VyRGF0YSl7dmFyIHN0YWNrVG9wPXN0YWNrU2F2ZSgpO3ZhciB2YXJhcmdzPXN0YWNrQWxsb2MoMTIpO0dST1dBQkxFX0hFQVBfSTMyKClbdmFyYXJncz4+Ml09ZXZlbnRUeXBlSWQ7R1JPV0FCTEVfSEVBUF9JMzIoKVt2YXJhcmdzKzQ+PjJdPWV2ZW50RGF0YTtHUk9XQUJMRV9IRUFQX0kzMigpW3ZhcmFyZ3MrOD4+Ml09dXNlckRhdGE7X19lbXNjcmlwdGVuX2NhbGxfb25fdGhyZWFkKDAsdGFyZ2V0VGhyZWFkLDYzNzUzNDIwOCxldmVudEhhbmRsZXJGdW5jLGV2ZW50RGF0YSx2YXJhcmdzKTtzdGFja1Jlc3RvcmUoc3RhY2tUb3ApfSxnZXRUYXJnZXRUaHJlYWRGb3JFdmVudENhbGxiYWNrOmZ1bmN0aW9uKHRhcmdldFRocmVhZCl7c3dpdGNoKHRhcmdldFRocmVhZCl7Y2FzZSAxOnJldHVybiAwO2Nhc2UgMjpyZXR1cm4gUFRocmVhZC5jdXJyZW50UHJveGllZE9wZXJhdGlvbkNhbGxlclRocmVhZDtkZWZhdWx0OnJldHVybiB0YXJnZXRUaHJlYWR9fSxnZXROb2RlTmFtZUZvclRhcmdldDpmdW5jdGlvbih0YXJnZXQpe2lmKCF0YXJnZXQpcmV0dXJuXCJcIjtpZih0YXJnZXQ9PXdpbmRvdylyZXR1cm5cIiN3aW5kb3dcIjtpZih0YXJnZXQ9PXNjcmVlbilyZXR1cm5cIiNzY3JlZW5cIjtyZXR1cm4gdGFyZ2V0JiZ0YXJnZXQubm9kZU5hbWU/dGFyZ2V0Lm5vZGVOYW1lOlwiXCJ9LGZ1bGxzY3JlZW5FbmFibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmZ1bGxzY3JlZW5FbmFibGVkfHxkb2N1bWVudC53ZWJraXRGdWxsc2NyZWVuRW5hYmxlZH19O2Z1bmN0aW9uIHN0cmluZ1RvTmV3VVRGOChqc1N0cmluZyl7dmFyIGxlbmd0aD1sZW5ndGhCeXRlc1VURjgoanNTdHJpbmcpKzE7dmFyIGNTdHJpbmc9X21hbGxvYyhsZW5ndGgpO3N0cmluZ1RvVVRGOChqc1N0cmluZyxjU3RyaW5nLGxlbmd0aCk7cmV0dXJuIGNTdHJpbmd9ZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fc2V0X29mZnNjcmVlbmNhbnZhc19zaXplX29uX3RhcmdldF90aHJlYWRfanModGFyZ2V0VGhyZWFkLHRhcmdldENhbnZhcyx3aWR0aCxoZWlnaHQpe3ZhciBzdGFja1RvcD1zdGFja1NhdmUoKTt2YXIgdmFyYXJncz1zdGFja0FsbG9jKDEyKTt2YXIgdGFyZ2V0Q2FudmFzUHRyPTA7aWYodGFyZ2V0Q2FudmFzKXt0YXJnZXRDYW52YXNQdHI9c3RyaW5nVG9OZXdVVEY4KHRhcmdldENhbnZhcyl9R1JPV0FCTEVfSEVBUF9JMzIoKVt2YXJhcmdzPj4yXT10YXJnZXRDYW52YXNQdHI7R1JPV0FCTEVfSEVBUF9JMzIoKVt2YXJhcmdzKzQ+PjJdPXdpZHRoO0dST1dBQkxFX0hFQVBfSTMyKClbdmFyYXJncys4Pj4yXT1oZWlnaHQ7X19lbXNjcmlwdGVuX2NhbGxfb25fdGhyZWFkKDAsdGFyZ2V0VGhyZWFkLDY1NzQ1NzE1MiwwLHRhcmdldENhbnZhc1B0cix2YXJhcmdzKTtzdGFja1Jlc3RvcmUoc3RhY2tUb3ApfWZ1bmN0aW9uIF9lbXNjcmlwdGVuX3NldF9vZmZzY3JlZW5jYW52YXNfc2l6ZV9vbl90YXJnZXRfdGhyZWFkKHRhcmdldFRocmVhZCx0YXJnZXRDYW52YXMsd2lkdGgsaGVpZ2h0KXt0YXJnZXRDYW52YXM9dGFyZ2V0Q2FudmFzP1VURjhUb1N0cmluZyh0YXJnZXRDYW52YXMpOlwiXCI7X2Vtc2NyaXB0ZW5fc2V0X29mZnNjcmVlbmNhbnZhc19zaXplX29uX3RhcmdldF90aHJlYWRfanModGFyZ2V0VGhyZWFkLHRhcmdldENhbnZhcyx3aWR0aCxoZWlnaHQpfWZ1bmN0aW9uIG1heWJlQ1N0cmluZ1RvSnNTdHJpbmcoY1N0cmluZyl7cmV0dXJuIGNTdHJpbmc+Mj9VVEY4VG9TdHJpbmcoY1N0cmluZyk6Y1N0cmluZ312YXIgc3BlY2lhbEhUTUxUYXJnZXRzPVswLHR5cGVvZiBkb2N1bWVudCE9PVwidW5kZWZpbmVkXCI/ZG9jdW1lbnQ6MCx0eXBlb2Ygd2luZG93IT09XCJ1bmRlZmluZWRcIj93aW5kb3c6MF07ZnVuY3Rpb24gZmluZEV2ZW50VGFyZ2V0KHRhcmdldCl7dGFyZ2V0PW1heWJlQ1N0cmluZ1RvSnNTdHJpbmcodGFyZ2V0KTt2YXIgZG9tRWxlbWVudD1zcGVjaWFsSFRNTFRhcmdldHNbdGFyZ2V0XXx8KHR5cGVvZiBkb2N1bWVudCE9PVwidW5kZWZpbmVkXCI/ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0YXJnZXQpOnVuZGVmaW5lZCk7cmV0dXJuIGRvbUVsZW1lbnR9ZnVuY3Rpb24gZmluZENhbnZhc0V2ZW50VGFyZ2V0KHRhcmdldCl7cmV0dXJuIGZpbmRFdmVudFRhcmdldCh0YXJnZXQpfWZ1bmN0aW9uIF9lbXNjcmlwdGVuX3NldF9jYW52YXNfZWxlbWVudF9zaXplX2NhbGxpbmdfdGhyZWFkKHRhcmdldCx3aWR0aCxoZWlnaHQpe3ZhciBjYW52YXM9ZmluZENhbnZhc0V2ZW50VGFyZ2V0KHRhcmdldCk7aWYoIWNhbnZhcylyZXR1cm4tNDtpZihjYW52YXMuY2FudmFzU2hhcmVkUHRyKXtHUk9XQUJMRV9IRUFQX0kzMigpW2NhbnZhcy5jYW52YXNTaGFyZWRQdHI+PjJdPXdpZHRoO0dST1dBQkxFX0hFQVBfSTMyKClbY2FudmFzLmNhbnZhc1NoYXJlZFB0cis0Pj4yXT1oZWlnaHR9aWYoY2FudmFzLm9mZnNjcmVlbkNhbnZhc3x8IWNhbnZhcy5jb250cm9sVHJhbnNmZXJyZWRPZmZzY3JlZW4pe2lmKGNhbnZhcy5vZmZzY3JlZW5DYW52YXMpY2FudmFzPWNhbnZhcy5vZmZzY3JlZW5DYW52YXM7dmFyIGF1dG9SZXNpemVWaWV3cG9ydD1mYWxzZTtpZihjYW52YXMuR0xjdHhPYmplY3QmJmNhbnZhcy5HTGN0eE9iamVjdC5HTGN0eCl7dmFyIHByZXZWaWV3cG9ydD1jYW52YXMuR0xjdHhPYmplY3QuR0xjdHguZ2V0UGFyYW1ldGVyKDI5NzgpO2F1dG9SZXNpemVWaWV3cG9ydD1wcmV2Vmlld3BvcnRbMF09PT0wJiZwcmV2Vmlld3BvcnRbMV09PT0wJiZwcmV2Vmlld3BvcnRbMl09PT1jYW52YXMud2lkdGgmJnByZXZWaWV3cG9ydFszXT09PWNhbnZhcy5oZWlnaHR9Y2FudmFzLndpZHRoPXdpZHRoO2NhbnZhcy5oZWlnaHQ9aGVpZ2h0O2lmKGF1dG9SZXNpemVWaWV3cG9ydCl7Y2FudmFzLkdMY3R4T2JqZWN0LkdMY3R4LnZpZXdwb3J0KDAsMCx3aWR0aCxoZWlnaHQpfX1lbHNlIGlmKGNhbnZhcy5jYW52YXNTaGFyZWRQdHIpe3ZhciB0YXJnZXRUaHJlYWQ9R1JPV0FCTEVfSEVBUF9JMzIoKVtjYW52YXMuY2FudmFzU2hhcmVkUHRyKzg+PjJdO19lbXNjcmlwdGVuX3NldF9vZmZzY3JlZW5jYW52YXNfc2l6ZV9vbl90YXJnZXRfdGhyZWFkKHRhcmdldFRocmVhZCx0YXJnZXQsd2lkdGgsaGVpZ2h0KTtyZXR1cm4gMX1lbHNle3JldHVybi00fXJldHVybiAwfWZ1bmN0aW9uIF9lbXNjcmlwdGVuX3NldF9jYW52YXNfZWxlbWVudF9zaXplX21haW5fdGhyZWFkKHRhcmdldCx3aWR0aCxoZWlnaHQpe2lmKEVOVklST05NRU5UX0lTX1BUSFJFQUQpcmV0dXJuIF9lbXNjcmlwdGVuX3Byb3h5X3RvX21haW5fdGhyZWFkX2pzKDIsMSx0YXJnZXQsd2lkdGgsaGVpZ2h0KTtyZXR1cm4gX2Vtc2NyaXB0ZW5fc2V0X2NhbnZhc19lbGVtZW50X3NpemVfY2FsbGluZ190aHJlYWQodGFyZ2V0LHdpZHRoLGhlaWdodCl9ZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fc2V0X2NhbnZhc19lbGVtZW50X3NpemUodGFyZ2V0LHdpZHRoLGhlaWdodCl7dmFyIGNhbnZhcz1maW5kQ2FudmFzRXZlbnRUYXJnZXQodGFyZ2V0KTtpZihjYW52YXMpe3JldHVybiBfZW1zY3JpcHRlbl9zZXRfY2FudmFzX2VsZW1lbnRfc2l6ZV9jYWxsaW5nX3RocmVhZCh0YXJnZXQsd2lkdGgsaGVpZ2h0KX1lbHNle3JldHVybiBfZW1zY3JpcHRlbl9zZXRfY2FudmFzX2VsZW1lbnRfc2l6ZV9tYWluX3RocmVhZCh0YXJnZXQsd2lkdGgsaGVpZ2h0KX19ZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fc2V0X2N1cnJlbnRfdGhyZWFkX3N0YXR1cyhuZXdTdGF0dXMpe31mdW5jdGlvbiBfZW1zY3JpcHRlbl9zZXRfdGhyZWFkX25hbWUodGhyZWFkSWQsbmFtZSl7fWZ1bmN0aW9uIF9fd2ViZ2xfZW5hYmxlX0FOR0xFX2luc3RhbmNlZF9hcnJheXMoY3R4KXt2YXIgZXh0PWN0eC5nZXRFeHRlbnNpb24oXCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzXCIpO2lmKGV4dCl7Y3R4W1widmVydGV4QXR0cmliRGl2aXNvclwiXT1mdW5jdGlvbihpbmRleCxkaXZpc29yKXtleHRbXCJ2ZXJ0ZXhBdHRyaWJEaXZpc29yQU5HTEVcIl0oaW5kZXgsZGl2aXNvcil9O2N0eFtcImRyYXdBcnJheXNJbnN0YW5jZWRcIl09ZnVuY3Rpb24obW9kZSxmaXJzdCxjb3VudCxwcmltY291bnQpe2V4dFtcImRyYXdBcnJheXNJbnN0YW5jZWRBTkdMRVwiXShtb2RlLGZpcnN0LGNvdW50LHByaW1jb3VudCl9O2N0eFtcImRyYXdFbGVtZW50c0luc3RhbmNlZFwiXT1mdW5jdGlvbihtb2RlLGNvdW50LHR5cGUsaW5kaWNlcyxwcmltY291bnQpe2V4dFtcImRyYXdFbGVtZW50c0luc3RhbmNlZEFOR0xFXCJdKG1vZGUsY291bnQsdHlwZSxpbmRpY2VzLHByaW1jb3VudCl9O3JldHVybiAxfX1mdW5jdGlvbiBfX3dlYmdsX2VuYWJsZV9PRVNfdmVydGV4X2FycmF5X29iamVjdChjdHgpe3ZhciBleHQ9Y3R4LmdldEV4dGVuc2lvbihcIk9FU192ZXJ0ZXhfYXJyYXlfb2JqZWN0XCIpO2lmKGV4dCl7Y3R4W1wiY3JlYXRlVmVydGV4QXJyYXlcIl09ZnVuY3Rpb24oKXtyZXR1cm4gZXh0W1wiY3JlYXRlVmVydGV4QXJyYXlPRVNcIl0oKX07Y3R4W1wiZGVsZXRlVmVydGV4QXJyYXlcIl09ZnVuY3Rpb24odmFvKXtleHRbXCJkZWxldGVWZXJ0ZXhBcnJheU9FU1wiXSh2YW8pfTtjdHhbXCJiaW5kVmVydGV4QXJyYXlcIl09ZnVuY3Rpb24odmFvKXtleHRbXCJiaW5kVmVydGV4QXJyYXlPRVNcIl0odmFvKX07Y3R4W1wiaXNWZXJ0ZXhBcnJheVwiXT1mdW5jdGlvbih2YW8pe3JldHVybiBleHRbXCJpc1ZlcnRleEFycmF5T0VTXCJdKHZhbyl9O3JldHVybiAxfX1mdW5jdGlvbiBfX3dlYmdsX2VuYWJsZV9XRUJHTF9kcmF3X2J1ZmZlcnMoY3R4KXt2YXIgZXh0PWN0eC5nZXRFeHRlbnNpb24oXCJXRUJHTF9kcmF3X2J1ZmZlcnNcIik7aWYoZXh0KXtjdHhbXCJkcmF3QnVmZmVyc1wiXT1mdW5jdGlvbihuLGJ1ZnMpe2V4dFtcImRyYXdCdWZmZXJzV0VCR0xcIl0obixidWZzKX07cmV0dXJuIDF9fWZ1bmN0aW9uIF9fd2ViZ2xfZW5hYmxlX1dFQkdMX211bHRpX2RyYXcoY3R4KXtyZXR1cm4hIShjdHgubXVsdGlEcmF3V2ViZ2w9Y3R4LmdldEV4dGVuc2lvbihcIldFQkdMX211bHRpX2RyYXdcIikpfXZhciBHTD17Y291bnRlcjoxLGJ1ZmZlcnM6W10scHJvZ3JhbXM6W10sZnJhbWVidWZmZXJzOltdLHJlbmRlcmJ1ZmZlcnM6W10sdGV4dHVyZXM6W10sdW5pZm9ybXM6W10sc2hhZGVyczpbXSx2YW9zOltdLGNvbnRleHRzOnt9LG9mZnNjcmVlbkNhbnZhc2VzOnt9LHRpbWVyUXVlcmllc0VYVDpbXSxwcm9ncmFtSW5mb3M6e30sc3RyaW5nQ2FjaGU6e30sdW5wYWNrQWxpZ25tZW50OjQscmVjb3JkRXJyb3I6ZnVuY3Rpb24gcmVjb3JkRXJyb3IoZXJyb3JDb2RlKXtpZighR0wubGFzdEVycm9yKXtHTC5sYXN0RXJyb3I9ZXJyb3JDb2RlfX0sZ2V0TmV3SWQ6ZnVuY3Rpb24odGFibGUpe3ZhciByZXQ9R0wuY291bnRlcisrO2Zvcih2YXIgaT10YWJsZS5sZW5ndGg7aTxyZXQ7aSsrKXt0YWJsZVtpXT1udWxsfXJldHVybiByZXR9LGdldFNvdXJjZTpmdW5jdGlvbihzaGFkZXIsY291bnQsc3RyaW5nLGxlbmd0aCl7dmFyIHNvdXJjZT1cIlwiO2Zvcih2YXIgaT0wO2k8Y291bnQ7KytpKXt2YXIgbGVuPWxlbmd0aD9HUk9XQUJMRV9IRUFQX0kzMigpW2xlbmd0aCtpKjQ+PjJdOi0xO3NvdXJjZSs9VVRGOFRvU3RyaW5nKEdST1dBQkxFX0hFQVBfSTMyKClbc3RyaW5nK2kqND4+Ml0sbGVuPDA/dW5kZWZpbmVkOmxlbil9cmV0dXJuIHNvdXJjZX0sY3JlYXRlQ29udGV4dDpmdW5jdGlvbihjYW52YXMsd2ViR0xDb250ZXh0QXR0cmlidXRlcyl7dmFyIGN0eD1jYW52YXMuZ2V0Q29udGV4dChcIndlYmdsXCIsd2ViR0xDb250ZXh0QXR0cmlidXRlcyk7aWYoIWN0eClyZXR1cm4gMDt2YXIgaGFuZGxlPUdMLnJlZ2lzdGVyQ29udGV4dChjdHgsd2ViR0xDb250ZXh0QXR0cmlidXRlcyk7cmV0dXJuIGhhbmRsZX0scmVnaXN0ZXJDb250ZXh0OmZ1bmN0aW9uKGN0eCx3ZWJHTENvbnRleHRBdHRyaWJ1dGVzKXt2YXIgaGFuZGxlPV9tYWxsb2MoOCk7R1JPV0FCTEVfSEVBUF9JMzIoKVtoYW5kbGUrND4+Ml09X3B0aHJlYWRfc2VsZigpO3ZhciBjb250ZXh0PXtoYW5kbGU6aGFuZGxlLGF0dHJpYnV0ZXM6d2ViR0xDb250ZXh0QXR0cmlidXRlcyx2ZXJzaW9uOndlYkdMQ29udGV4dEF0dHJpYnV0ZXMubWFqb3JWZXJzaW9uLEdMY3R4OmN0eH07aWYoY3R4LmNhbnZhcyljdHguY2FudmFzLkdMY3R4T2JqZWN0PWNvbnRleHQ7R0wuY29udGV4dHNbaGFuZGxlXT1jb250ZXh0O2lmKHR5cGVvZiB3ZWJHTENvbnRleHRBdHRyaWJ1dGVzLmVuYWJsZUV4dGVuc2lvbnNCeURlZmF1bHQ9PT1cInVuZGVmaW5lZFwifHx3ZWJHTENvbnRleHRBdHRyaWJ1dGVzLmVuYWJsZUV4dGVuc2lvbnNCeURlZmF1bHQpe0dMLmluaXRFeHRlbnNpb25zKGNvbnRleHQpfXJldHVybiBoYW5kbGV9LG1ha2VDb250ZXh0Q3VycmVudDpmdW5jdGlvbihjb250ZXh0SGFuZGxlKXtHTC5jdXJyZW50Q29udGV4dD1HTC5jb250ZXh0c1tjb250ZXh0SGFuZGxlXTtNb2R1bGUuY3R4PUdMY3R4PUdMLmN1cnJlbnRDb250ZXh0JiZHTC5jdXJyZW50Q29udGV4dC5HTGN0eDtyZXR1cm4hKGNvbnRleHRIYW5kbGUmJiFHTGN0eCl9LGdldENvbnRleHQ6ZnVuY3Rpb24oY29udGV4dEhhbmRsZSl7cmV0dXJuIEdMLmNvbnRleHRzW2NvbnRleHRIYW5kbGVdfSxkZWxldGVDb250ZXh0OmZ1bmN0aW9uKGNvbnRleHRIYW5kbGUpe2lmKEdMLmN1cnJlbnRDb250ZXh0PT09R0wuY29udGV4dHNbY29udGV4dEhhbmRsZV0pR0wuY3VycmVudENvbnRleHQ9bnVsbDtpZih0eXBlb2YgSlNFdmVudHM9PT1cIm9iamVjdFwiKUpTRXZlbnRzLnJlbW92ZUFsbEhhbmRsZXJzT25UYXJnZXQoR0wuY29udGV4dHNbY29udGV4dEhhbmRsZV0uR0xjdHguY2FudmFzKTtpZihHTC5jb250ZXh0c1tjb250ZXh0SGFuZGxlXSYmR0wuY29udGV4dHNbY29udGV4dEhhbmRsZV0uR0xjdHguY2FudmFzKUdMLmNvbnRleHRzW2NvbnRleHRIYW5kbGVdLkdMY3R4LmNhbnZhcy5HTGN0eE9iamVjdD11bmRlZmluZWQ7X2ZyZWUoR0wuY29udGV4dHNbY29udGV4dEhhbmRsZV0uaGFuZGxlKTtHTC5jb250ZXh0c1tjb250ZXh0SGFuZGxlXT1udWxsfSxpbml0RXh0ZW5zaW9uczpmdW5jdGlvbihjb250ZXh0KXtpZighY29udGV4dCljb250ZXh0PUdMLmN1cnJlbnRDb250ZXh0O2lmKGNvbnRleHQuaW5pdEV4dGVuc2lvbnNEb25lKXJldHVybjtjb250ZXh0LmluaXRFeHRlbnNpb25zRG9uZT10cnVlO3ZhciBHTGN0eD1jb250ZXh0LkdMY3R4O19fd2ViZ2xfZW5hYmxlX0FOR0xFX2luc3RhbmNlZF9hcnJheXMoR0xjdHgpO19fd2ViZ2xfZW5hYmxlX09FU192ZXJ0ZXhfYXJyYXlfb2JqZWN0KEdMY3R4KTtfX3dlYmdsX2VuYWJsZV9XRUJHTF9kcmF3X2J1ZmZlcnMoR0xjdHgpO0dMY3R4LmRpc2pvaW50VGltZXJRdWVyeUV4dD1HTGN0eC5nZXRFeHRlbnNpb24oXCJFWFRfZGlzam9pbnRfdGltZXJfcXVlcnlcIik7X193ZWJnbF9lbmFibGVfV0VCR0xfbXVsdGlfZHJhdyhHTGN0eCk7dmFyIGV4dHM9R0xjdHguZ2V0U3VwcG9ydGVkRXh0ZW5zaW9ucygpfHxbXTtleHRzLmZvckVhY2goZnVuY3Rpb24oZXh0KXtpZihleHQuaW5kZXhPZihcImxvc2VfY29udGV4dFwiKTwwJiZleHQuaW5kZXhPZihcImRlYnVnXCIpPDApe0dMY3R4LmdldEV4dGVuc2lvbihleHQpfX0pfSxwb3B1bGF0ZVVuaWZvcm1UYWJsZTpmdW5jdGlvbihwcm9ncmFtKXt2YXIgcD1HTC5wcm9ncmFtc1twcm9ncmFtXTt2YXIgcHRhYmxlPUdMLnByb2dyYW1JbmZvc1twcm9ncmFtXT17dW5pZm9ybXM6e30sbWF4VW5pZm9ybUxlbmd0aDowLG1heEF0dHJpYnV0ZUxlbmd0aDotMSxtYXhVbmlmb3JtQmxvY2tOYW1lTGVuZ3RoOi0xfTt2YXIgdXRhYmxlPXB0YWJsZS51bmlmb3Jtczt2YXIgbnVtVW5pZm9ybXM9R0xjdHguZ2V0UHJvZ3JhbVBhcmFtZXRlcihwLDM1NzE4KTtmb3IodmFyIGk9MDtpPG51bVVuaWZvcm1zOysraSl7dmFyIHU9R0xjdHguZ2V0QWN0aXZlVW5pZm9ybShwLGkpO3ZhciBuYW1lPXUubmFtZTtwdGFibGUubWF4VW5pZm9ybUxlbmd0aD1NYXRoLm1heChwdGFibGUubWF4VW5pZm9ybUxlbmd0aCxuYW1lLmxlbmd0aCsxKTtpZihuYW1lLnNsaWNlKC0xKT09XCJdXCIpe25hbWU9bmFtZS5zbGljZSgwLG5hbWUubGFzdEluZGV4T2YoXCJbXCIpKX12YXIgbG9jPUdMY3R4LmdldFVuaWZvcm1Mb2NhdGlvbihwLG5hbWUpO2lmKGxvYyl7dmFyIGlkPUdMLmdldE5ld0lkKEdMLnVuaWZvcm1zKTt1dGFibGVbbmFtZV09W3Uuc2l6ZSxpZF07R0wudW5pZm9ybXNbaWRdPWxvYztmb3IodmFyIGo9MTtqPHUuc2l6ZTsrK2ope3ZhciBuPW5hbWUrXCJbXCIraitcIl1cIjtsb2M9R0xjdHguZ2V0VW5pZm9ybUxvY2F0aW9uKHAsbik7aWQ9R0wuZ2V0TmV3SWQoR0wudW5pZm9ybXMpO0dMLnVuaWZvcm1zW2lkXT1sb2N9fX19fTt2YXIgX19lbXNjcmlwdGVuX3dlYmdsX3Bvd2VyX3ByZWZlcmVuY2VzPVtcImRlZmF1bHRcIixcImxvdy1wb3dlclwiLFwiaGlnaC1wZXJmb3JtYW5jZVwiXTtmdW5jdGlvbiBfZW1zY3JpcHRlbl93ZWJnbF9kb19jcmVhdGVfY29udGV4dCh0YXJnZXQsYXR0cmlidXRlcyl7dmFyIGE9YXR0cmlidXRlcz4+Mjt2YXIgcG93ZXJQcmVmZXJlbmNlPUdST1dBQkxFX0hFQVBfSTMyKClbYSsoMjQ+PjIpXTt2YXIgY29udGV4dEF0dHJpYnV0ZXM9e1wiYWxwaGFcIjohIUdST1dBQkxFX0hFQVBfSTMyKClbYSsoMD4+MildLFwiZGVwdGhcIjohIUdST1dBQkxFX0hFQVBfSTMyKClbYSsoND4+MildLFwic3RlbmNpbFwiOiEhR1JPV0FCTEVfSEVBUF9JMzIoKVthKyg4Pj4yKV0sXCJhbnRpYWxpYXNcIjohIUdST1dBQkxFX0hFQVBfSTMyKClbYSsoMTI+PjIpXSxcInByZW11bHRpcGxpZWRBbHBoYVwiOiEhR1JPV0FCTEVfSEVBUF9JMzIoKVthKygxNj4+MildLFwicHJlc2VydmVEcmF3aW5nQnVmZmVyXCI6ISFHUk9XQUJMRV9IRUFQX0kzMigpW2ErKDIwPj4yKV0sXCJwb3dlclByZWZlcmVuY2VcIjpfX2Vtc2NyaXB0ZW5fd2ViZ2xfcG93ZXJfcHJlZmVyZW5jZXNbcG93ZXJQcmVmZXJlbmNlXSxcImZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXRcIjohIUdST1dBQkxFX0hFQVBfSTMyKClbYSsoMjg+PjIpXSxtYWpvclZlcnNpb246R1JPV0FCTEVfSEVBUF9JMzIoKVthKygzMj4+MildLG1pbm9yVmVyc2lvbjpHUk9XQUJMRV9IRUFQX0kzMigpW2ErKDM2Pj4yKV0sZW5hYmxlRXh0ZW5zaW9uc0J5RGVmYXVsdDpHUk9XQUJMRV9IRUFQX0kzMigpW2ErKDQwPj4yKV0sZXhwbGljaXRTd2FwQ29udHJvbDpHUk9XQUJMRV9IRUFQX0kzMigpW2ErKDQ0Pj4yKV0scHJveHlDb250ZXh0VG9NYWluVGhyZWFkOkdST1dBQkxFX0hFQVBfSTMyKClbYSsoNDg+PjIpXSxyZW5kZXJWaWFPZmZzY3JlZW5CYWNrQnVmZmVyOkdST1dBQkxFX0hFQVBfSTMyKClbYSsoNTI+PjIpXX07dmFyIGNhbnZhcz1maW5kQ2FudmFzRXZlbnRUYXJnZXQodGFyZ2V0KTtpZighY2FudmFzKXtyZXR1cm4gMH1pZihjb250ZXh0QXR0cmlidXRlcy5leHBsaWNpdFN3YXBDb250cm9sKXtyZXR1cm4gMH12YXIgY29udGV4dEhhbmRsZT1HTC5jcmVhdGVDb250ZXh0KGNhbnZhcyxjb250ZXh0QXR0cmlidXRlcyk7cmV0dXJuIGNvbnRleHRIYW5kbGV9ZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fd2ViZ2xfY3JlYXRlX2NvbnRleHQoYTAsYTEpe3JldHVybiBfZW1zY3JpcHRlbl93ZWJnbF9kb19jcmVhdGVfY29udGV4dChhMCxhMSl9dmFyIFNZU0NBTExTPXttYXBwaW5nczp7fSxidWZmZXJzOltudWxsLFtdLFtdXSxwcmludENoYXI6ZnVuY3Rpb24oc3RyZWFtLGN1cnIpe3ZhciBidWZmZXI9U1lTQ0FMTFMuYnVmZmVyc1tzdHJlYW1dO2lmKGN1cnI9PT0wfHxjdXJyPT09MTApeyhzdHJlYW09PT0xP291dDplcnIpKFVURjhBcnJheVRvU3RyaW5nKGJ1ZmZlciwwKSk7YnVmZmVyLmxlbmd0aD0wfWVsc2V7YnVmZmVyLnB1c2goY3Vycil9fSx2YXJhcmdzOnVuZGVmaW5lZCxnZXQ6ZnVuY3Rpb24oKXtTWVNDQUxMUy52YXJhcmdzKz00O3ZhciByZXQ9R1JPV0FCTEVfSEVBUF9JMzIoKVtTWVNDQUxMUy52YXJhcmdzLTQ+PjJdO3JldHVybiByZXR9LGdldFN0cjpmdW5jdGlvbihwdHIpe3ZhciByZXQ9VVRGOFRvU3RyaW5nKHB0cik7cmV0dXJuIHJldH0sZ2V0NjQ6ZnVuY3Rpb24obG93LGhpZ2gpe3JldHVybiBsb3d9fTtmdW5jdGlvbiBfZmRfY2xvc2UoZmQpe2lmKEVOVklST05NRU5UX0lTX1BUSFJFQUQpcmV0dXJuIF9lbXNjcmlwdGVuX3Byb3h5X3RvX21haW5fdGhyZWFkX2pzKDMsMSxmZCk7cmV0dXJuIDB9ZnVuY3Rpb24gX2ZkX3NlZWsoZmQsb2Zmc2V0X2xvdyxvZmZzZXRfaGlnaCx3aGVuY2UsbmV3T2Zmc2V0KXtpZihFTlZJUk9OTUVOVF9JU19QVEhSRUFEKXJldHVybiBfZW1zY3JpcHRlbl9wcm94eV90b19tYWluX3RocmVhZF9qcyg0LDEsZmQsb2Zmc2V0X2xvdyxvZmZzZXRfaGlnaCx3aGVuY2UsbmV3T2Zmc2V0KX1mdW5jdGlvbiBfZmRfd3JpdGUoZmQsaW92LGlvdmNudCxwbnVtKXtpZihFTlZJUk9OTUVOVF9JU19QVEhSRUFEKXJldHVybiBfZW1zY3JpcHRlbl9wcm94eV90b19tYWluX3RocmVhZF9qcyg1LDEsZmQsaW92LGlvdmNudCxwbnVtKTt2YXIgbnVtPTA7Zm9yKHZhciBpPTA7aTxpb3ZjbnQ7aSsrKXt2YXIgcHRyPUdST1dBQkxFX0hFQVBfSTMyKClbaW92K2kqOD4+Ml07dmFyIGxlbj1HUk9XQUJMRV9IRUFQX0kzMigpW2lvdisoaSo4KzQpPj4yXTtmb3IodmFyIGo9MDtqPGxlbjtqKyspe1NZU0NBTExTLnByaW50Q2hhcihmZCxHUk9XQUJMRV9IRUFQX1U4KClbcHRyK2pdKX1udW0rPWxlbn1HUk9XQUJMRV9IRUFQX0kzMigpW3BudW0+PjJdPW51bTtyZXR1cm4gMH1mdW5jdGlvbiBfcHRocmVhZF9jbGVhbnVwX3BvcChleGVjdXRlKXt2YXIgcm91dGluZT1QVGhyZWFkLnRocmVhZEV4aXRIYW5kbGVycy5wb3AoKTtpZihleGVjdXRlKXJvdXRpbmUoKX1mdW5jdGlvbiBfcHRocmVhZF9jbGVhbnVwX3B1c2gocm91dGluZSxhcmcpe1BUaHJlYWQudGhyZWFkRXhpdEhhbmRsZXJzLnB1c2goZnVuY3Rpb24oKXt3YXNtVGFibGUuZ2V0KHJvdXRpbmUpKGFyZyl9KX1mdW5jdGlvbiBzcGF3blRocmVhZCh0aHJlYWRQYXJhbXMpe2lmKEVOVklST05NRU5UX0lTX1BUSFJFQUQpdGhyb3dcIkludGVybmFsIEVycm9yISBzcGF3blRocmVhZCgpIGNhbiBvbmx5IGV2ZXIgYmUgY2FsbGVkIGZyb20gbWFpbiBhcHBsaWNhdGlvbiB0aHJlYWQhXCI7dmFyIHdvcmtlcj1QVGhyZWFkLmdldE5ld1dvcmtlcigpO2lmKHdvcmtlci5wdGhyZWFkIT09dW5kZWZpbmVkKXRocm93XCJJbnRlcm5hbCBlcnJvciFcIjtpZighdGhyZWFkUGFyYW1zLnB0aHJlYWRfcHRyKXRocm93XCJJbnRlcm5hbCBlcnJvciwgbm8gcHRocmVhZCBwdHIhXCI7UFRocmVhZC5ydW5uaW5nV29ya2Vycy5wdXNoKHdvcmtlcik7dmFyIHRsc01lbW9yeT1fbWFsbG9jKDEyOCo0KTtmb3IodmFyIGk9MDtpPDEyODsrK2kpe0dST1dBQkxFX0hFQVBfSTMyKClbdGxzTWVtb3J5K2kqND4+Ml09MH12YXIgc3RhY2tIaWdoPXRocmVhZFBhcmFtcy5zdGFja0Jhc2UrdGhyZWFkUGFyYW1zLnN0YWNrU2l6ZTt2YXIgcHRocmVhZD1QVGhyZWFkLnB0aHJlYWRzW3RocmVhZFBhcmFtcy5wdGhyZWFkX3B0cl09e3dvcmtlcjp3b3JrZXIsc3RhY2tCYXNlOnRocmVhZFBhcmFtcy5zdGFja0Jhc2Usc3RhY2tTaXplOnRocmVhZFBhcmFtcy5zdGFja1NpemUsYWxsb2NhdGVkT3duU3RhY2s6dGhyZWFkUGFyYW1zLmFsbG9jYXRlZE93blN0YWNrLHRocmVhZEluZm9TdHJ1Y3Q6dGhyZWFkUGFyYW1zLnB0aHJlYWRfcHRyfTt2YXIgdGlzPXB0aHJlYWQudGhyZWFkSW5mb1N0cnVjdD4+MjtBdG9taWNzLnN0b3JlKEdST1dBQkxFX0hFQVBfVTMyKCksdGlzKyg2ND4+MiksdGhyZWFkUGFyYW1zLmRldGFjaGVkKTtBdG9taWNzLnN0b3JlKEdST1dBQkxFX0hFQVBfVTMyKCksdGlzKygxMDA+PjIpLHRsc01lbW9yeSk7QXRvbWljcy5zdG9yZShHUk9XQUJMRV9IRUFQX1UzMigpLHRpcysoNDA+PjIpLHB0aHJlYWQudGhyZWFkSW5mb1N0cnVjdCk7QXRvbWljcy5zdG9yZShHUk9XQUJMRV9IRUFQX1UzMigpLHRpcysoODA+PjIpLHRocmVhZFBhcmFtcy5zdGFja1NpemUpO0F0b21pY3Muc3RvcmUoR1JPV0FCTEVfSEVBUF9VMzIoKSx0aXMrKDc2Pj4yKSxzdGFja0hpZ2gpO0F0b21pY3Muc3RvcmUoR1JPV0FCTEVfSEVBUF9VMzIoKSx0aXMrKDEwND4+MiksdGhyZWFkUGFyYW1zLnN0YWNrU2l6ZSk7QXRvbWljcy5zdG9yZShHUk9XQUJMRV9IRUFQX1UzMigpLHRpcysoMTA0Kzg+PjIpLHN0YWNrSGlnaCk7QXRvbWljcy5zdG9yZShHUk9XQUJMRV9IRUFQX1UzMigpLHRpcysoMTA0KzEyPj4yKSx0aHJlYWRQYXJhbXMuZGV0YWNoZWQpO3ZhciBnbG9iYWxfbGliYz1fZW1zY3JpcHRlbl9nZXRfZ2xvYmFsX2xpYmMoKTt2YXIgZ2xvYmFsX2xvY2FsZT1nbG9iYWxfbGliYys0MDtBdG9taWNzLnN0b3JlKEdST1dBQkxFX0hFQVBfVTMyKCksdGlzKygxNzI+PjIpLGdsb2JhbF9sb2NhbGUpO3dvcmtlci5wdGhyZWFkPXB0aHJlYWQ7dmFyIG1zZz17XCJjbWRcIjpcInJ1blwiLFwic3RhcnRfcm91dGluZVwiOnRocmVhZFBhcmFtcy5zdGFydFJvdXRpbmUsXCJhcmdcIjp0aHJlYWRQYXJhbXMuYXJnLFwidGhyZWFkSW5mb1N0cnVjdFwiOnRocmVhZFBhcmFtcy5wdGhyZWFkX3B0cixcInN0YWNrQmFzZVwiOnRocmVhZFBhcmFtcy5zdGFja0Jhc2UsXCJzdGFja1NpemVcIjp0aHJlYWRQYXJhbXMuc3RhY2tTaXplfTt3b3JrZXIucnVuUHRocmVhZD1mdW5jdGlvbigpe21zZy50aW1lPXBlcmZvcm1hbmNlLm5vdygpO3dvcmtlci5wb3N0TWVzc2FnZShtc2csdGhyZWFkUGFyYW1zLnRyYW5zZmVyTGlzdCl9O2lmKHdvcmtlci5sb2FkZWQpe3dvcmtlci5ydW5QdGhyZWFkKCk7ZGVsZXRlIHdvcmtlci5ydW5QdGhyZWFkfX1mdW5jdGlvbiBfcHRocmVhZF9jcmVhdGUocHRocmVhZF9wdHIsYXR0cixzdGFydF9yb3V0aW5lLGFyZyl7aWYodHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyPT09XCJ1bmRlZmluZWRcIil7ZXJyKFwiQ3VycmVudCBlbnZpcm9ubWVudCBkb2VzIG5vdCBzdXBwb3J0IFNoYXJlZEFycmF5QnVmZmVyLCBwdGhyZWFkcyBhcmUgbm90IGF2YWlsYWJsZSFcIik7cmV0dXJuIDZ9aWYoIXB0aHJlYWRfcHRyKXtlcnIoXCJwdGhyZWFkX2NyZWF0ZSBjYWxsZWQgd2l0aCBhIG51bGwgdGhyZWFkIHBvaW50ZXIhXCIpO3JldHVybiAyOH12YXIgdHJhbnNmZXJMaXN0PVtdO3ZhciBlcnJvcj0wO2lmKEVOVklST05NRU5UX0lTX1BUSFJFQUQmJih0cmFuc2Zlckxpc3QubGVuZ3RoPT09MHx8ZXJyb3IpKXtyZXR1cm4gX2Vtc2NyaXB0ZW5fc3luY19ydW5faW5fbWFpbl90aHJlYWRfNCg2ODc4NjU4NTYscHRocmVhZF9wdHIsYXR0cixzdGFydF9yb3V0aW5lLGFyZyl9aWYoZXJyb3IpcmV0dXJuIGVycm9yO3ZhciBzdGFja1NpemU9MDt2YXIgc3RhY2tCYXNlPTA7dmFyIGRldGFjaGVkPTA7aWYoYXR0ciYmYXR0ciE9LTEpe3N0YWNrU2l6ZT1HUk9XQUJMRV9IRUFQX0kzMigpW2F0dHI+PjJdO3N0YWNrU2l6ZSs9ODE5MjA7c3RhY2tCYXNlPUdST1dBQkxFX0hFQVBfSTMyKClbYXR0cis4Pj4yXTtkZXRhY2hlZD1HUk9XQUJMRV9IRUFQX0kzMigpW2F0dHIrMTI+PjJdIT09MH1lbHNle3N0YWNrU2l6ZT0yMDk3MTUyfXZhciBhbGxvY2F0ZWRPd25TdGFjaz1zdGFja0Jhc2U9PTA7aWYoYWxsb2NhdGVkT3duU3RhY2spe3N0YWNrQmFzZT1fbWVtYWxpZ24oMTYsc3RhY2tTaXplKX1lbHNle3N0YWNrQmFzZS09c3RhY2tTaXplO2Fzc2VydChzdGFja0Jhc2U+MCl9dmFyIHRocmVhZEluZm9TdHJ1Y3Q9X21hbGxvYygyMjgpO2Zvcih2YXIgaT0wO2k8MjI4Pj4yOysraSlHUk9XQUJMRV9IRUFQX1UzMigpWyh0aHJlYWRJbmZvU3RydWN0Pj4yKStpXT0wO0dST1dBQkxFX0hFQVBfSTMyKClbcHRocmVhZF9wdHI+PjJdPXRocmVhZEluZm9TdHJ1Y3Q7R1JPV0FCTEVfSEVBUF9JMzIoKVt0aHJlYWRJbmZvU3RydWN0KzEyPj4yXT10aHJlYWRJbmZvU3RydWN0O3ZhciBoZWFkUHRyPXRocmVhZEluZm9TdHJ1Y3QrMTUyO0dST1dBQkxFX0hFQVBfSTMyKClbaGVhZFB0cj4+Ml09aGVhZFB0cjt2YXIgdGhyZWFkUGFyYW1zPXtzdGFja0Jhc2U6c3RhY2tCYXNlLHN0YWNrU2l6ZTpzdGFja1NpemUsYWxsb2NhdGVkT3duU3RhY2s6YWxsb2NhdGVkT3duU3RhY2ssZGV0YWNoZWQ6ZGV0YWNoZWQsc3RhcnRSb3V0aW5lOnN0YXJ0X3JvdXRpbmUscHRocmVhZF9wdHI6dGhyZWFkSW5mb1N0cnVjdCxhcmc6YXJnLHRyYW5zZmVyTGlzdDp0cmFuc2Zlckxpc3R9O2lmKEVOVklST05NRU5UX0lTX1BUSFJFQUQpe3RocmVhZFBhcmFtcy5jbWQ9XCJzcGF3blRocmVhZFwiO3Bvc3RNZXNzYWdlKHRocmVhZFBhcmFtcyx0cmFuc2Zlckxpc3QpfWVsc2V7c3Bhd25UaHJlYWQodGhyZWFkUGFyYW1zKX1yZXR1cm4gMH1mdW5jdGlvbiBfc3lzY29uZihuYW1lKXtpZihFTlZJUk9OTUVOVF9JU19QVEhSRUFEKXJldHVybiBfZW1zY3JpcHRlbl9wcm94eV90b19tYWluX3RocmVhZF9qcyg2LDEsbmFtZSk7c3dpdGNoKG5hbWUpe2Nhc2UgMzA6cmV0dXJuIDE2Mzg0O2Nhc2UgODU6dmFyIG1heEhlYXBTaXplPTIxNDc0ODM2NDg7cmV0dXJuIG1heEhlYXBTaXplLzE2Mzg0O2Nhc2UgMTMyOmNhc2UgMTMzOmNhc2UgMTI6Y2FzZSAxMzc6Y2FzZSAxMzg6Y2FzZSAxNTpjYXNlIDIzNTpjYXNlIDE2OmNhc2UgMTc6Y2FzZSAxODpjYXNlIDE5OmNhc2UgMjA6Y2FzZSAxNDk6Y2FzZSAxMzpjYXNlIDEwOmNhc2UgMjM2OmNhc2UgMTUzOmNhc2UgOTpjYXNlIDIxOmNhc2UgMjI6Y2FzZSAxNTk6Y2FzZSAxNTQ6Y2FzZSAxNDpjYXNlIDc3OmNhc2UgNzg6Y2FzZSAxMzk6Y2FzZSA4MjpjYXNlIDY4OmNhc2UgNjc6Y2FzZSAxNjQ6Y2FzZSAxMTpjYXNlIDI5OmNhc2UgNDc6Y2FzZSA0ODpjYXNlIDk1OmNhc2UgNTI6Y2FzZSA1MTpjYXNlIDQ2OnJldHVybiAyMDA4MDk7Y2FzZSAyNzpjYXNlIDI0NjpjYXNlIDEyNzpjYXNlIDEyODpjYXNlIDIzOmNhc2UgMjQ6Y2FzZSAxNjA6Y2FzZSAxNjE6Y2FzZSAxODE6Y2FzZSAxODI6Y2FzZSAyNDI6Y2FzZSAxODM6Y2FzZSAxODQ6Y2FzZSAyNDM6Y2FzZSAyNDQ6Y2FzZSAyNDU6Y2FzZSAxNjU6Y2FzZSAxNzg6Y2FzZSAxNzk6Y2FzZSA0OTpjYXNlIDUwOmNhc2UgMTY4OmNhc2UgMTY5OmNhc2UgMTc1OmNhc2UgMTcwOmNhc2UgMTcxOmNhc2UgMTcyOmNhc2UgOTc6Y2FzZSA3NjpjYXNlIDMyOmNhc2UgMTczOmNhc2UgMzU6Y2FzZSA4MDpjYXNlIDgxOmNhc2UgNzk6cmV0dXJuLTE7Y2FzZSAxNzY6Y2FzZSAxNzc6Y2FzZSA3OmNhc2UgMTU1OmNhc2UgODpjYXNlIDE1NzpjYXNlIDEyNTpjYXNlIDEyNjpjYXNlIDkyOmNhc2UgOTM6Y2FzZSAxMjk6Y2FzZSAxMzA6Y2FzZSAxMzE6Y2FzZSA5NDpjYXNlIDkxOnJldHVybiAxO2Nhc2UgNzQ6Y2FzZSA2MDpjYXNlIDY5OmNhc2UgNzA6Y2FzZSA0OnJldHVybiAxMDI0O2Nhc2UgMzE6Y2FzZSA0MjpjYXNlIDcyOnJldHVybiAzMjtjYXNlIDg3OmNhc2UgMjY6Y2FzZSAzMzpyZXR1cm4gMjE0NzQ4MzY0NztjYXNlIDM0OmNhc2UgMTpyZXR1cm4gNDc4Mzk7Y2FzZSAzODpjYXNlIDM2OnJldHVybiA5OTtjYXNlIDQzOmNhc2UgMzc6cmV0dXJuIDIwNDg7Y2FzZSAwOnJldHVybiAyMDk3MTUyO2Nhc2UgMzpyZXR1cm4gNjU1MzY7Y2FzZSAyODpyZXR1cm4gMzI3Njg7Y2FzZSA0NDpyZXR1cm4gMzI3Njc7Y2FzZSA3NTpyZXR1cm4gMTYzODQ7Y2FzZSAzOTpyZXR1cm4gMWUzO2Nhc2UgODk6cmV0dXJuIDcwMDtjYXNlIDcxOnJldHVybiAyNTY7Y2FzZSA0MDpyZXR1cm4gMjU1O2Nhc2UgMjpyZXR1cm4gMTAwO2Nhc2UgMTgwOnJldHVybiA2NDtjYXNlIDI1OnJldHVybiAyMDtjYXNlIDU6cmV0dXJuIDE2O2Nhc2UgNjpyZXR1cm4gNjtjYXNlIDczOnJldHVybiA0O2Nhc2UgODQ6e2lmKHR5cGVvZiBuYXZpZ2F0b3I9PT1cIm9iamVjdFwiKXJldHVybiBuYXZpZ2F0b3JbXCJoYXJkd2FyZUNvbmN1cnJlbmN5XCJdfHwxO3JldHVybiAxfX1zZXRFcnJObygyOCk7cmV0dXJuLTF9aWYoIUVOVklST05NRU5UX0lTX1BUSFJFQUQpUFRocmVhZC5pbml0TWFpblRocmVhZEJsb2NrKCk7dmFyIEdMY3R4O3ZhciBwcm94aWVkRnVuY3Rpb25UYWJsZT1bbnVsbCxfYXRleGl0LF9lbXNjcmlwdGVuX3NldF9jYW52YXNfZWxlbWVudF9zaXplX21haW5fdGhyZWFkLF9mZF9jbG9zZSxfZmRfc2VlayxfZmRfd3JpdGUsX3N5c2NvbmZdO3ZhciBhc21MaWJyYXJ5QXJnPXtcImVcIjpfX19hc3NlcnRfZmFpbCxcInJcIjpfX19jYWxsX21haW4sXCJ4XCI6X19lbXNjcmlwdGVuX25vdGlmeV90aHJlYWRfcXVldWUsXCJiXCI6X2Fib3J0LFwieVwiOl9lbXNjcmlwdGVuX2FzbV9jb25zdF9pbnQsXCJqXCI6X2Vtc2NyaXB0ZW5fY29uZGl0aW9uYWxfc2V0X2N1cnJlbnRfdGhyZWFkX3N0YXR1cyxcImNcIjpfZW1zY3JpcHRlbl9mdXRleF93YWl0LFwiZFwiOl9lbXNjcmlwdGVuX2Z1dGV4X3dha2UsXCJmXCI6X2Vtc2NyaXB0ZW5fZ2V0X25vdyxcInBcIjpfZW1zY3JpcHRlbl9tZW1jcHlfYmlnLFwielwiOl9lbXNjcmlwdGVuX251bV9sb2dpY2FsX2NvcmVzLFwidVwiOl9lbXNjcmlwdGVuX3JlY2VpdmVfb25fbWFpbl90aHJlYWRfanMsXCJxXCI6X2Vtc2NyaXB0ZW5fcmVzaXplX2hlYXAsXCJ2XCI6X2Vtc2NyaXB0ZW5fc2V0X2NhbnZhc19lbGVtZW50X3NpemUsXCJpXCI6X2Vtc2NyaXB0ZW5fc2V0X2N1cnJlbnRfdGhyZWFkX3N0YXR1cyxcInRcIjpfZW1zY3JpcHRlbl9zZXRfdGhyZWFkX25hbWUsXCJ3XCI6X2Vtc2NyaXB0ZW5fd2ViZ2xfY3JlYXRlX2NvbnRleHQsXCJtXCI6X2ZkX2Nsb3NlLFwiblwiOl9mZF9zZWVrLFwiZ1wiOl9mZF93cml0ZSxcIm9cIjppbml0UHRocmVhZHNKUyxcImFcIjp3YXNtTWVtb3J5fHxNb2R1bGVbXCJ3YXNtTWVtb3J5XCJdLFwia1wiOl9wdGhyZWFkX2NsZWFudXBfcG9wLFwibFwiOl9wdGhyZWFkX2NsZWFudXBfcHVzaCxcImhcIjpfcHRocmVhZF9jcmVhdGUsXCJzXCI6X3N5c2NvbmZ9O3ZhciBhc209Y3JlYXRlV2FzbSgpO3ZhciBfX193YXNtX2NhbGxfY3RvcnM9TW9kdWxlW1wiX19fd2FzbV9jYWxsX2N0b3JzXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9fX3dhc21fY2FsbF9jdG9ycz1Nb2R1bGVbXCJfX193YXNtX2NhbGxfY3RvcnNcIl09TW9kdWxlW1wiYXNtXCJdW1wiQVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX2luaXQ9TW9kdWxlW1wiX2luaXRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX2luaXQ9TW9kdWxlW1wiX2luaXRcIl09TW9kdWxlW1wiYXNtXCJdW1wiQlwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX3JlZ2lzdGVyX3RlbnNvcj1Nb2R1bGVbXCJfcmVnaXN0ZXJfdGVuc29yXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9yZWdpc3Rlcl90ZW5zb3I9TW9kdWxlW1wiX3JlZ2lzdGVyX3RlbnNvclwiXT1Nb2R1bGVbXCJhc21cIl1bXCJDXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfZGlzcG9zZV9kYXRhPU1vZHVsZVtcIl9kaXNwb3NlX2RhdGFcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX2Rpc3Bvc2VfZGF0YT1Nb2R1bGVbXCJfZGlzcG9zZV9kYXRhXCJdPU1vZHVsZVtcImFzbVwiXVtcIkRcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9kaXNwb3NlPU1vZHVsZVtcIl9kaXNwb3NlXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9kaXNwb3NlPU1vZHVsZVtcIl9kaXNwb3NlXCJdPU1vZHVsZVtcImFzbVwiXVtcIkVcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9BYnM9TW9kdWxlW1wiX0Fic1wiXT1mdW5jdGlvbigpe3JldHVybihfQWJzPU1vZHVsZVtcIl9BYnNcIl09TW9kdWxlW1wiYXNtXCJdW1wiR1wiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0FkZD1Nb2R1bGVbXCJfQWRkXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9BZGQ9TW9kdWxlW1wiX0FkZFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJIXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQWRkTj1Nb2R1bGVbXCJfQWRkTlwiXT1mdW5jdGlvbigpe3JldHVybihfQWRkTj1Nb2R1bGVbXCJfQWRkTlwiXT1Nb2R1bGVbXCJhc21cIl1bXCJJXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQWxsPU1vZHVsZVtcIl9BbGxcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0FsbD1Nb2R1bGVbXCJfQWxsXCJdPU1vZHVsZVtcImFzbVwiXVtcIkpcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Bbnk9TW9kdWxlW1wiX0FueVwiXT1mdW5jdGlvbigpe3JldHVybihfQW55PU1vZHVsZVtcIl9BbnlcIl09TW9kdWxlW1wiYXNtXCJdW1wiS1wiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0FyZ01heD1Nb2R1bGVbXCJfQXJnTWF4XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9BcmdNYXg9TW9kdWxlW1wiX0FyZ01heFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJMXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQXZnUG9vbD1Nb2R1bGVbXCJfQXZnUG9vbFwiXT1mdW5jdGlvbigpe3JldHVybihfQXZnUG9vbD1Nb2R1bGVbXCJfQXZnUG9vbFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJNXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQmF0Y2hNYXRNdWw9TW9kdWxlW1wiX0JhdGNoTWF0TXVsXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9CYXRjaE1hdE11bD1Nb2R1bGVbXCJfQmF0Y2hNYXRNdWxcIl09TW9kdWxlW1wiYXNtXCJdW1wiTlwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0NlaWw9TW9kdWxlW1wiX0NlaWxcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0NlaWw9TW9kdWxlW1wiX0NlaWxcIl09TW9kdWxlW1wiYXNtXCJdW1wiT1wiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0NsaXBCeVZhbHVlPU1vZHVsZVtcIl9DbGlwQnlWYWx1ZVwiXT1mdW5jdGlvbigpe3JldHVybihfQ2xpcEJ5VmFsdWU9TW9kdWxlW1wiX0NsaXBCeVZhbHVlXCJdPU1vZHVsZVtcImFzbVwiXVtcIlBcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Db252MkQ9TW9kdWxlW1wiX0NvbnYyRFwiXT1mdW5jdGlvbigpe3JldHVybihfQ29udjJEPU1vZHVsZVtcIl9Db252MkRcIl09TW9kdWxlW1wiYXNtXCJdW1wiUVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0NvbnYyREJhY2twcm9wSW5wdXQ9TW9kdWxlW1wiX0NvbnYyREJhY2twcm9wSW5wdXRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0NvbnYyREJhY2twcm9wSW5wdXQ9TW9kdWxlW1wiX0NvbnYyREJhY2twcm9wSW5wdXRcIl09TW9kdWxlW1wiYXNtXCJdW1wiUlwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0Nvcz1Nb2R1bGVbXCJfQ29zXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Db3M9TW9kdWxlW1wiX0Nvc1wiXT1Nb2R1bGVbXCJhc21cIl1bXCJTXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQ29zaD1Nb2R1bGVbXCJfQ29zaFwiXT1mdW5jdGlvbigpe3JldHVybihfQ29zaD1Nb2R1bGVbXCJfQ29zaFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJUXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQ3JvcEFuZFJlc2l6ZT1Nb2R1bGVbXCJfQ3JvcEFuZFJlc2l6ZVwiXT1mdW5jdGlvbigpe3JldHVybihfQ3JvcEFuZFJlc2l6ZT1Nb2R1bGVbXCJfQ3JvcEFuZFJlc2l6ZVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJVXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQ3Vtc3VtPU1vZHVsZVtcIl9DdW1zdW1cIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0N1bXN1bT1Nb2R1bGVbXCJfQ3Vtc3VtXCJdPU1vZHVsZVtcImFzbVwiXVtcIlZcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9EZXB0aFRvU3BhY2U9TW9kdWxlW1wiX0RlcHRoVG9TcGFjZVwiXT1mdW5jdGlvbigpe3JldHVybihfRGVwdGhUb1NwYWNlPU1vZHVsZVtcIl9EZXB0aFRvU3BhY2VcIl09TW9kdWxlW1wiYXNtXCJdW1wiV1wiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0RlcHRod2lzZUNvbnYyZE5hdGl2ZT1Nb2R1bGVbXCJfRGVwdGh3aXNlQ29udjJkTmF0aXZlXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9EZXB0aHdpc2VDb252MmROYXRpdmU9TW9kdWxlW1wiX0RlcHRod2lzZUNvbnYyZE5hdGl2ZVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJYXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfRXF1YWw9TW9kdWxlW1wiX0VxdWFsXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9FcXVhbD1Nb2R1bGVbXCJfRXF1YWxcIl09TW9kdWxlW1wiYXNtXCJdW1wiWVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0V4cD1Nb2R1bGVbXCJfRXhwXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9FeHA9TW9kdWxlW1wiX0V4cFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJaXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfRmxpcExlZnRSaWdodD1Nb2R1bGVbXCJfRmxpcExlZnRSaWdodFwiXT1mdW5jdGlvbigpe3JldHVybihfRmxpcExlZnRSaWdodD1Nb2R1bGVbXCJfRmxpcExlZnRSaWdodFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJfXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfRmxvb3I9TW9kdWxlW1wiX0Zsb29yXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9GbG9vcj1Nb2R1bGVbXCJfRmxvb3JcIl09TW9kdWxlW1wiYXNtXCJdW1wiJFwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0Zsb29yRGl2PU1vZHVsZVtcIl9GbG9vckRpdlwiXT1mdW5jdGlvbigpe3JldHVybihfRmxvb3JEaXY9TW9kdWxlW1wiX0Zsb29yRGl2XCJdPU1vZHVsZVtcImFzbVwiXVtcImFhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfRnVzZWRCYXRjaE5vcm09TW9kdWxlW1wiX0Z1c2VkQmF0Y2hOb3JtXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9GdXNlZEJhdGNoTm9ybT1Nb2R1bGVbXCJfRnVzZWRCYXRjaE5vcm1cIl09TW9kdWxlW1wiYXNtXCJdW1wiYmFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9GdXNlZENvbnYyRD1Nb2R1bGVbXCJfRnVzZWRDb252MkRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0Z1c2VkQ29udjJEPU1vZHVsZVtcIl9GdXNlZENvbnYyRFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJjYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0Z1c2VkRGVwdGh3aXNlQ29udjJEPU1vZHVsZVtcIl9GdXNlZERlcHRod2lzZUNvbnYyRFwiXT1mdW5jdGlvbigpe3JldHVybihfRnVzZWREZXB0aHdpc2VDb252MkQ9TW9kdWxlW1wiX0Z1c2VkRGVwdGh3aXNlQ29udjJEXCJdPU1vZHVsZVtcImFzbVwiXVtcImRhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfR2F0aGVyPU1vZHVsZVtcIl9HYXRoZXJcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0dhdGhlcj1Nb2R1bGVbXCJfR2F0aGVyXCJdPU1vZHVsZVtcImFzbVwiXVtcImVhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfR2F0aGVyTmQ9TW9kdWxlW1wiX0dhdGhlck5kXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9HYXRoZXJOZD1Nb2R1bGVbXCJfR2F0aGVyTmRcIl09TW9kdWxlW1wiYXNtXCJdW1wiZmFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9HcmVhdGVyPU1vZHVsZVtcIl9HcmVhdGVyXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9HcmVhdGVyPU1vZHVsZVtcIl9HcmVhdGVyXCJdPU1vZHVsZVtcImFzbVwiXVtcImdhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfR3JlYXRlckVxdWFsPU1vZHVsZVtcIl9HcmVhdGVyRXF1YWxcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0dyZWF0ZXJFcXVhbD1Nb2R1bGVbXCJfR3JlYXRlckVxdWFsXCJdPU1vZHVsZVtcImFzbVwiXVtcImhhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTGVha3lSZWx1PU1vZHVsZVtcIl9MZWFreVJlbHVcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0xlYWt5UmVsdT1Nb2R1bGVbXCJfTGVha3lSZWx1XCJdPU1vZHVsZVtcImFzbVwiXVtcImlhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTGVzcz1Nb2R1bGVbXCJfTGVzc1wiXT1mdW5jdGlvbigpe3JldHVybihfTGVzcz1Nb2R1bGVbXCJfTGVzc1wiXT1Nb2R1bGVbXCJhc21cIl1bXCJqYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0xlc3NFcXVhbD1Nb2R1bGVbXCJfTGVzc0VxdWFsXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9MZXNzRXF1YWw9TW9kdWxlW1wiX0xlc3NFcXVhbFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJrYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0xvZz1Nb2R1bGVbXCJfTG9nXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Mb2c9TW9kdWxlW1wiX0xvZ1wiXT1Nb2R1bGVbXCJhc21cIl1bXCJsYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0xvZ2ljYWxBbmQ9TW9kdWxlW1wiX0xvZ2ljYWxBbmRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0xvZ2ljYWxBbmQ9TW9kdWxlW1wiX0xvZ2ljYWxBbmRcIl09TW9kdWxlW1wiYXNtXCJdW1wibWFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9NYXg9TW9kdWxlW1wiX01heFwiXT1mdW5jdGlvbigpe3JldHVybihfTWF4PU1vZHVsZVtcIl9NYXhcIl09TW9kdWxlW1wiYXNtXCJdW1wibmFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9NYXhQb29sPU1vZHVsZVtcIl9NYXhQb29sXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9NYXhQb29sPU1vZHVsZVtcIl9NYXhQb29sXCJdPU1vZHVsZVtcImFzbVwiXVtcIm9hXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTWF4aW11bT1Nb2R1bGVbXCJfTWF4aW11bVwiXT1mdW5jdGlvbigpe3JldHVybihfTWF4aW11bT1Nb2R1bGVbXCJfTWF4aW11bVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJwYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX01lYW49TW9kdWxlW1wiX01lYW5cIl09ZnVuY3Rpb24oKXtyZXR1cm4oX01lYW49TW9kdWxlW1wiX01lYW5cIl09TW9kdWxlW1wiYXNtXCJdW1wicWFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9NaW49TW9kdWxlW1wiX01pblwiXT1mdW5jdGlvbigpe3JldHVybihfTWluPU1vZHVsZVtcIl9NaW5cIl09TW9kdWxlW1wiYXNtXCJdW1wicmFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9NaW5pbXVtPU1vZHVsZVtcIl9NaW5pbXVtXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9NaW5pbXVtPU1vZHVsZVtcIl9NaW5pbXVtXCJdPU1vZHVsZVtcImFzbVwiXVtcInNhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTWlycm9yUGFkPU1vZHVsZVtcIl9NaXJyb3JQYWRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX01pcnJvclBhZD1Nb2R1bGVbXCJfTWlycm9yUGFkXCJdPU1vZHVsZVtcImFzbVwiXVtcInRhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTXVsdGlwbHk9TW9kdWxlW1wiX011bHRpcGx5XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9NdWx0aXBseT1Nb2R1bGVbXCJfTXVsdGlwbHlcIl09TW9kdWxlW1wiYXNtXCJdW1widWFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9OZWc9TW9kdWxlW1wiX05lZ1wiXT1mdW5jdGlvbigpe3JldHVybihfTmVnPU1vZHVsZVtcIl9OZWdcIl09TW9kdWxlW1wiYXNtXCJdW1widmFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Ob25NYXhTdXBwcmVzc2lvblYzPU1vZHVsZVtcIl9Ob25NYXhTdXBwcmVzc2lvblYzXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Ob25NYXhTdXBwcmVzc2lvblYzPU1vZHVsZVtcIl9Ob25NYXhTdXBwcmVzc2lvblYzXCJdPU1vZHVsZVtcImFzbVwiXVtcIndhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTm9uTWF4U3VwcHJlc3Npb25WND1Nb2R1bGVbXCJfTm9uTWF4U3VwcHJlc3Npb25WNFwiXT1mdW5jdGlvbigpe3JldHVybihfTm9uTWF4U3VwcHJlc3Npb25WND1Nb2R1bGVbXCJfTm9uTWF4U3VwcHJlc3Npb25WNFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJ4YVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX05vbk1heFN1cHByZXNzaW9uVjU9TW9kdWxlW1wiX05vbk1heFN1cHByZXNzaW9uVjVcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX05vbk1heFN1cHByZXNzaW9uVjU9TW9kdWxlW1wiX05vbk1heFN1cHByZXNzaW9uVjVcIl09TW9kdWxlW1wiYXNtXCJdW1wieWFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Ob3RFcXVhbD1Nb2R1bGVbXCJfTm90RXF1YWxcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX05vdEVxdWFsPU1vZHVsZVtcIl9Ob3RFcXVhbFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJ6YVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX09uZUhvdD1Nb2R1bGVbXCJfT25lSG90XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9PbmVIb3Q9TW9kdWxlW1wiX09uZUhvdFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJBYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1BhZFYyPU1vZHVsZVtcIl9QYWRWMlwiXT1mdW5jdGlvbigpe3JldHVybihfUGFkVjI9TW9kdWxlW1wiX1BhZFYyXCJdPU1vZHVsZVtcImFzbVwiXVtcIkJhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfUG93PU1vZHVsZVtcIl9Qb3dcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1Bvdz1Nb2R1bGVbXCJfUG93XCJdPU1vZHVsZVtcImFzbVwiXVtcIkNhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfUHJlbHU9TW9kdWxlW1wiX1ByZWx1XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9QcmVsdT1Nb2R1bGVbXCJfUHJlbHVcIl09TW9kdWxlW1wiYXNtXCJdW1wiRGFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Qcm9kPU1vZHVsZVtcIl9Qcm9kXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Qcm9kPU1vZHVsZVtcIl9Qcm9kXCJdPU1vZHVsZVtcImFzbVwiXVtcIkVhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfUmVhbERpdj1Nb2R1bGVbXCJfUmVhbERpdlwiXT1mdW5jdGlvbigpe3JldHVybihfUmVhbERpdj1Nb2R1bGVbXCJfUmVhbERpdlwiXT1Nb2R1bGVbXCJhc21cIl1bXCJGYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1JlbHU9TW9kdWxlW1wiX1JlbHVcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1JlbHU9TW9kdWxlW1wiX1JlbHVcIl09TW9kdWxlW1wiYXNtXCJdW1wiR2FcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9SZWx1Nj1Nb2R1bGVbXCJfUmVsdTZcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1JlbHU2PU1vZHVsZVtcIl9SZWx1NlwiXT1Nb2R1bGVbXCJhc21cIl1bXCJIYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1Jlc2l6ZUJpbGluZWFyPU1vZHVsZVtcIl9SZXNpemVCaWxpbmVhclwiXT1mdW5jdGlvbigpe3JldHVybihfUmVzaXplQmlsaW5lYXI9TW9kdWxlW1wiX1Jlc2l6ZUJpbGluZWFyXCJdPU1vZHVsZVtcImFzbVwiXVtcIklhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfUmV2ZXJzZT1Nb2R1bGVbXCJfUmV2ZXJzZVwiXT1mdW5jdGlvbigpe3JldHVybihfUmV2ZXJzZT1Nb2R1bGVbXCJfUmV2ZXJzZVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJKYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1JvdGF0ZVdpdGhPZmZzZXQ9TW9kdWxlW1wiX1JvdGF0ZVdpdGhPZmZzZXRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1JvdGF0ZVdpdGhPZmZzZXQ9TW9kdWxlW1wiX1JvdGF0ZVdpdGhPZmZzZXRcIl09TW9kdWxlW1wiYXNtXCJdW1wiS2FcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Sb3VuZD1Nb2R1bGVbXCJfUm91bmRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1JvdW5kPU1vZHVsZVtcIl9Sb3VuZFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJMYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1JzcXJ0PU1vZHVsZVtcIl9Sc3FydFwiXT1mdW5jdGlvbigpe3JldHVybihfUnNxcnQ9TW9kdWxlW1wiX1JzcXJ0XCJdPU1vZHVsZVtcImFzbVwiXVtcIk1hXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfU2NhdHRlck5kPU1vZHVsZVtcIl9TY2F0dGVyTmRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1NjYXR0ZXJOZD1Nb2R1bGVbXCJfU2NhdHRlck5kXCJdPU1vZHVsZVtcImFzbVwiXVtcIk5hXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfU2VsZWN0VjI9TW9kdWxlW1wiX1NlbGVjdFYyXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9TZWxlY3RWMj1Nb2R1bGVbXCJfU2VsZWN0VjJcIl09TW9kdWxlW1wiYXNtXCJdW1wiT2FcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9TaWdtb2lkPU1vZHVsZVtcIl9TaWdtb2lkXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9TaWdtb2lkPU1vZHVsZVtcIl9TaWdtb2lkXCJdPU1vZHVsZVtcImFzbVwiXVtcIlBhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfU2luPU1vZHVsZVtcIl9TaW5cIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1Npbj1Nb2R1bGVbXCJfU2luXCJdPU1vZHVsZVtcImFzbVwiXVtcIlFhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfU29mdG1heD1Nb2R1bGVbXCJfU29mdG1heFwiXT1mdW5jdGlvbigpe3JldHVybihfU29mdG1heD1Nb2R1bGVbXCJfU29mdG1heFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJSYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1NxcnQ9TW9kdWxlW1wiX1NxcnRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1NxcnQ9TW9kdWxlW1wiX1NxcnRcIl09TW9kdWxlW1wiYXNtXCJdW1wiU2FcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9TcXVhcmU9TW9kdWxlW1wiX1NxdWFyZVwiXT1mdW5jdGlvbigpe3JldHVybihfU3F1YXJlPU1vZHVsZVtcIl9TcXVhcmVcIl09TW9kdWxlW1wiYXNtXCJdW1wiVGFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9TcXVhcmVkRGlmZmVyZW5jZT1Nb2R1bGVbXCJfU3F1YXJlZERpZmZlcmVuY2VcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1NxdWFyZWREaWZmZXJlbmNlPU1vZHVsZVtcIl9TcXVhcmVkRGlmZmVyZW5jZVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJVYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1N0ZXA9TW9kdWxlW1wiX1N0ZXBcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1N0ZXA9TW9kdWxlW1wiX1N0ZXBcIl09TW9kdWxlW1wiYXNtXCJdW1wiVmFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9TdHJpZGVkU2xpY2U9TW9kdWxlW1wiX1N0cmlkZWRTbGljZVwiXT1mdW5jdGlvbigpe3JldHVybihfU3RyaWRlZFNsaWNlPU1vZHVsZVtcIl9TdHJpZGVkU2xpY2VcIl09TW9kdWxlW1wiYXNtXCJdW1wiV2FcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9TdWI9TW9kdWxlW1wiX1N1YlwiXT1mdW5jdGlvbigpe3JldHVybihfU3ViPU1vZHVsZVtcIl9TdWJcIl09TW9kdWxlW1wiYXNtXCJdW1wiWGFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9TdW09TW9kdWxlW1wiX1N1bVwiXT1mdW5jdGlvbigpe3JldHVybihfU3VtPU1vZHVsZVtcIl9TdW1cIl09TW9kdWxlW1wiYXNtXCJdW1wiWWFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9UYW49TW9kdWxlW1wiX1RhblwiXT1mdW5jdGlvbigpe3JldHVybihfVGFuPU1vZHVsZVtcIl9UYW5cIl09TW9kdWxlW1wiYXNtXCJdW1wiWmFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9UYW5oPU1vZHVsZVtcIl9UYW5oXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9UYW5oPU1vZHVsZVtcIl9UYW5oXCJdPU1vZHVsZVtcImFzbVwiXVtcIl9hXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfVGlsZT1Nb2R1bGVbXCJfVGlsZVwiXT1mdW5jdGlvbigpe3JldHVybihfVGlsZT1Nb2R1bGVbXCJfVGlsZVwiXT1Nb2R1bGVbXCJhc21cIl1bXCIkYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1RvcEs9TW9kdWxlW1wiX1RvcEtcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1RvcEs9TW9kdWxlW1wiX1RvcEtcIl09TW9kdWxlW1wiYXNtXCJdW1wiYWJcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9UcmFuc2Zvcm09TW9kdWxlW1wiX1RyYW5zZm9ybVwiXT1mdW5jdGlvbigpe3JldHVybihfVHJhbnNmb3JtPU1vZHVsZVtcIl9UcmFuc2Zvcm1cIl09TW9kdWxlW1wiYXNtXCJdW1wiYmJcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9UcmFuc3Bvc2U9TW9kdWxlW1wiX1RyYW5zcG9zZVwiXT1mdW5jdGlvbigpe3JldHVybihfVHJhbnNwb3NlPU1vZHVsZVtcIl9UcmFuc3Bvc2VcIl09TW9kdWxlW1wiYXNtXCJdW1wiY2JcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9fRnVzZWRNYXRNdWw9TW9kdWxlW1wiX19GdXNlZE1hdE11bFwiXT1mdW5jdGlvbigpe3JldHVybihfX0Z1c2VkTWF0TXVsPU1vZHVsZVtcIl9fRnVzZWRNYXRNdWxcIl09TW9kdWxlW1wiYXNtXCJdW1wiZGJcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9tYWxsb2M9TW9kdWxlW1wiX21hbGxvY1wiXT1mdW5jdGlvbigpe3JldHVybihfbWFsbG9jPU1vZHVsZVtcIl9tYWxsb2NcIl09TW9kdWxlW1wiYXNtXCJdW1wiZWJcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9mcmVlPU1vZHVsZVtcIl9mcmVlXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9mcmVlPU1vZHVsZVtcIl9mcmVlXCJdPU1vZHVsZVtcImFzbVwiXVtcImZiXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfX19lcnJub19sb2NhdGlvbj1Nb2R1bGVbXCJfX19lcnJub19sb2NhdGlvblwiXT1mdW5jdGlvbigpe3JldHVybihfX19lcnJub19sb2NhdGlvbj1Nb2R1bGVbXCJfX19lcnJub19sb2NhdGlvblwiXT1Nb2R1bGVbXCJhc21cIl1bXCJnYlwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX2Vtc2NyaXB0ZW5fZ2V0X2dsb2JhbF9saWJjPU1vZHVsZVtcIl9lbXNjcmlwdGVuX2dldF9nbG9iYWxfbGliY1wiXT1mdW5jdGlvbigpe3JldHVybihfZW1zY3JpcHRlbl9nZXRfZ2xvYmFsX2xpYmM9TW9kdWxlW1wiX2Vtc2NyaXB0ZW5fZ2V0X2dsb2JhbF9saWJjXCJdPU1vZHVsZVtcImFzbVwiXVtcImhiXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfcHRocmVhZF9zZWxmPU1vZHVsZVtcIl9wdGhyZWFkX3NlbGZcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX3B0aHJlYWRfc2VsZj1Nb2R1bGVbXCJfcHRocmVhZF9zZWxmXCJdPU1vZHVsZVtcImFzbVwiXVtcImliXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfX19wdGhyZWFkX3RzZF9ydW5fZHRvcnM9TW9kdWxlW1wiX19fcHRocmVhZF90c2RfcnVuX2R0b3JzXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9fX3B0aHJlYWRfdHNkX3J1bl9kdG9ycz1Nb2R1bGVbXCJfX19wdGhyZWFkX3RzZF9ydW5fZHRvcnNcIl09TW9kdWxlW1wiYXNtXCJdW1wiamJcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9lbXNjcmlwdGVuX21haW5fdGhyZWFkX3Byb2Nlc3NfcXVldWVkX2NhbGxzPU1vZHVsZVtcIl9lbXNjcmlwdGVuX21haW5fdGhyZWFkX3Byb2Nlc3NfcXVldWVkX2NhbGxzXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9lbXNjcmlwdGVuX21haW5fdGhyZWFkX3Byb2Nlc3NfcXVldWVkX2NhbGxzPU1vZHVsZVtcIl9lbXNjcmlwdGVuX21haW5fdGhyZWFkX3Byb2Nlc3NfcXVldWVkX2NhbGxzXCJdPU1vZHVsZVtcImFzbVwiXVtcImtiXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfZW1zY3JpcHRlbl9jdXJyZW50X3RocmVhZF9wcm9jZXNzX3F1ZXVlZF9jYWxscz1Nb2R1bGVbXCJfZW1zY3JpcHRlbl9jdXJyZW50X3RocmVhZF9wcm9jZXNzX3F1ZXVlZF9jYWxsc1wiXT1mdW5jdGlvbigpe3JldHVybihfZW1zY3JpcHRlbl9jdXJyZW50X3RocmVhZF9wcm9jZXNzX3F1ZXVlZF9jYWxscz1Nb2R1bGVbXCJfZW1zY3JpcHRlbl9jdXJyZW50X3RocmVhZF9wcm9jZXNzX3F1ZXVlZF9jYWxsc1wiXT1Nb2R1bGVbXCJhc21cIl1bXCJsYlwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX2Vtc2NyaXB0ZW5fcmVnaXN0ZXJfbWFpbl9icm93c2VyX3RocmVhZF9pZD1Nb2R1bGVbXCJfZW1zY3JpcHRlbl9yZWdpc3Rlcl9tYWluX2Jyb3dzZXJfdGhyZWFkX2lkXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9lbXNjcmlwdGVuX3JlZ2lzdGVyX21haW5fYnJvd3Nlcl90aHJlYWRfaWQ9TW9kdWxlW1wiX2Vtc2NyaXB0ZW5fcmVnaXN0ZXJfbWFpbl9icm93c2VyX3RocmVhZF9pZFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJtYlwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX19lbXNjcmlwdGVuX2RvX2Rpc3BhdGNoX3RvX3RocmVhZD1Nb2R1bGVbXCJfX2Vtc2NyaXB0ZW5fZG9fZGlzcGF0Y2hfdG9fdGhyZWFkXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9fZW1zY3JpcHRlbl9kb19kaXNwYXRjaF90b190aHJlYWQ9TW9kdWxlW1wiX19lbXNjcmlwdGVuX2RvX2Rpc3BhdGNoX3RvX3RocmVhZFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJuYlwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX2Vtc2NyaXB0ZW5fc3luY19ydW5faW5fbWFpbl90aHJlYWRfND1Nb2R1bGVbXCJfZW1zY3JpcHRlbl9zeW5jX3J1bl9pbl9tYWluX3RocmVhZF80XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9lbXNjcmlwdGVuX3N5bmNfcnVuX2luX21haW5fdGhyZWFkXzQ9TW9kdWxlW1wiX2Vtc2NyaXB0ZW5fc3luY19ydW5faW5fbWFpbl90aHJlYWRfNFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJvYlwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX2Vtc2NyaXB0ZW5fcnVuX2luX21haW5fcnVudGltZV90aHJlYWRfanM9TW9kdWxlW1wiX2Vtc2NyaXB0ZW5fcnVuX2luX21haW5fcnVudGltZV90aHJlYWRfanNcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX2Vtc2NyaXB0ZW5fcnVuX2luX21haW5fcnVudGltZV90aHJlYWRfanM9TW9kdWxlW1wiX2Vtc2NyaXB0ZW5fcnVuX2luX21haW5fcnVudGltZV90aHJlYWRfanNcIl09TW9kdWxlW1wiYXNtXCJdW1wicGJcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9fZW1zY3JpcHRlbl9jYWxsX29uX3RocmVhZD1Nb2R1bGVbXCJfX2Vtc2NyaXB0ZW5fY2FsbF9vbl90aHJlYWRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX19lbXNjcmlwdGVuX2NhbGxfb25fdGhyZWFkPU1vZHVsZVtcIl9fZW1zY3JpcHRlbl9jYWxsX29uX3RocmVhZFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJxYlwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX2Vtc2NyaXB0ZW5fdGxzX2luaXQ9TW9kdWxlW1wiX2Vtc2NyaXB0ZW5fdGxzX2luaXRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX2Vtc2NyaXB0ZW5fdGxzX2luaXQ9TW9kdWxlW1wiX2Vtc2NyaXB0ZW5fdGxzX2luaXRcIl09TW9kdWxlW1wiYXNtXCJdW1wicmJcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9fZW1zY3JpcHRlbl90aHJlYWRfaW5pdD1Nb2R1bGVbXCJfX2Vtc2NyaXB0ZW5fdGhyZWFkX2luaXRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX19lbXNjcmlwdGVuX3RocmVhZF9pbml0PU1vZHVsZVtcIl9fZW1zY3JpcHRlbl90aHJlYWRfaW5pdFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJzYlwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgc3RhY2tTYXZlPU1vZHVsZVtcInN0YWNrU2F2ZVwiXT1mdW5jdGlvbigpe3JldHVybihzdGFja1NhdmU9TW9kdWxlW1wic3RhY2tTYXZlXCJdPU1vZHVsZVtcImFzbVwiXVtcInRiXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBzdGFja1Jlc3RvcmU9TW9kdWxlW1wic3RhY2tSZXN0b3JlXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKHN0YWNrUmVzdG9yZT1Nb2R1bGVbXCJzdGFja1Jlc3RvcmVcIl09TW9kdWxlW1wiYXNtXCJdW1widWJcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIHN0YWNrQWxsb2M9TW9kdWxlW1wic3RhY2tBbGxvY1wiXT1mdW5jdGlvbigpe3JldHVybihzdGFja0FsbG9jPU1vZHVsZVtcInN0YWNrQWxsb2NcIl09TW9kdWxlW1wiYXNtXCJdW1widmJcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9lbXNjcmlwdGVuX3N0YWNrX3NldF9saW1pdHM9TW9kdWxlW1wiX2Vtc2NyaXB0ZW5fc3RhY2tfc2V0X2xpbWl0c1wiXT1mdW5jdGlvbigpe3JldHVybihfZW1zY3JpcHRlbl9zdGFja19zZXRfbGltaXRzPU1vZHVsZVtcIl9lbXNjcmlwdGVuX3N0YWNrX3NldF9saW1pdHNcIl09TW9kdWxlW1wiYXNtXCJdW1wid2JcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9tZW1hbGlnbj1Nb2R1bGVbXCJfbWVtYWxpZ25cIl09ZnVuY3Rpb24oKXtyZXR1cm4oX21lbWFsaWduPU1vZHVsZVtcIl9tZW1hbGlnblwiXT1Nb2R1bGVbXCJhc21cIl1bXCJ4YlwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX19lbXNjcmlwdGVuX2FsbG93X21haW5fcnVudGltZV9xdWV1ZWRfY2FsbHM9TW9kdWxlW1wiX19lbXNjcmlwdGVuX2FsbG93X21haW5fcnVudGltZV9xdWV1ZWRfY2FsbHNcIl09OTgyNDt2YXIgX19lbXNjcmlwdGVuX21haW5fdGhyZWFkX2Z1dGV4PU1vZHVsZVtcIl9fZW1zY3JpcHRlbl9tYWluX3RocmVhZF9mdXRleFwiXT0xMTQ0ODtNb2R1bGVbXCJjd3JhcFwiXT1jd3JhcDtNb2R1bGVbXCJQVGhyZWFkXCJdPVBUaHJlYWQ7TW9kdWxlW1wiUFRocmVhZFwiXT1QVGhyZWFkO01vZHVsZVtcIndhc21NZW1vcnlcIl09d2FzbU1lbW9yeTtNb2R1bGVbXCJFeGl0U3RhdHVzXCJdPUV4aXRTdGF0dXM7dmFyIGNhbGxlZFJ1bjtmdW5jdGlvbiBFeGl0U3RhdHVzKHN0YXR1cyl7dGhpcy5uYW1lPVwiRXhpdFN0YXR1c1wiO3RoaXMubWVzc2FnZT1cIlByb2dyYW0gdGVybWluYXRlZCB3aXRoIGV4aXQoXCIrc3RhdHVzK1wiKVwiO3RoaXMuc3RhdHVzPXN0YXR1c31kZXBlbmRlbmNpZXNGdWxmaWxsZWQ9ZnVuY3Rpb24gcnVuQ2FsbGVyKCl7aWYoIWNhbGxlZFJ1bilydW4oKTtpZighY2FsbGVkUnVuKWRlcGVuZGVuY2llc0Z1bGZpbGxlZD1ydW5DYWxsZXJ9O2Z1bmN0aW9uIHJ1bihhcmdzKXthcmdzPWFyZ3N8fGFyZ3VtZW50c187aWYocnVuRGVwZW5kZW5jaWVzPjApe3JldHVybn1pZihFTlZJUk9OTUVOVF9JU19QVEhSRUFEKXtyZWFkeVByb21pc2VSZXNvbHZlKE1vZHVsZSk7aW5pdFJ1bnRpbWUoKTtwb3N0TWVzc2FnZSh7XCJjbWRcIjpcImxvYWRlZFwifSk7cmV0dXJufXByZVJ1bigpO2lmKHJ1bkRlcGVuZGVuY2llcz4wKXtyZXR1cm59ZnVuY3Rpb24gZG9SdW4oKXtpZihjYWxsZWRSdW4pcmV0dXJuO2NhbGxlZFJ1bj10cnVlO01vZHVsZVtcImNhbGxlZFJ1blwiXT10cnVlO2lmKEFCT1JUKXJldHVybjtpbml0UnVudGltZSgpO3ByZU1haW4oKTtyZWFkeVByb21pc2VSZXNvbHZlKE1vZHVsZSk7aWYoTW9kdWxlW1wib25SdW50aW1lSW5pdGlhbGl6ZWRcIl0pTW9kdWxlW1wib25SdW50aW1lSW5pdGlhbGl6ZWRcIl0oKTtwb3N0UnVuKCl9aWYoTW9kdWxlW1wic2V0U3RhdHVzXCJdKXtNb2R1bGVbXCJzZXRTdGF0dXNcIl0oXCJSdW5uaW5nLi4uXCIpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7TW9kdWxlW1wic2V0U3RhdHVzXCJdKFwiXCIpfSwxKTtkb1J1bigpfSwxKX1lbHNle2RvUnVuKCl9fU1vZHVsZVtcInJ1blwiXT1ydW47ZnVuY3Rpb24gZXhpdChzdGF0dXMsaW1wbGljaXQpe2lmKGltcGxpY2l0JiZub0V4aXRSdW50aW1lJiZzdGF0dXM9PT0wKXtyZXR1cm59aWYoIWltcGxpY2l0KXtpZihFTlZJUk9OTUVOVF9JU19QVEhSRUFEKXtwb3N0TWVzc2FnZSh7XCJjbWRcIjpcImV4aXRQcm9jZXNzXCIsXCJyZXR1cm5Db2RlXCI6c3RhdHVzfSk7dGhyb3cgbmV3IEV4aXRTdGF0dXMoc3RhdHVzKX1lbHNle319aWYobm9FeGl0UnVudGltZSl7fWVsc2V7UFRocmVhZC50ZXJtaW5hdGVBbGxUaHJlYWRzKCk7RVhJVFNUQVRVUz1zdGF0dXM7ZXhpdFJ1bnRpbWUoKTtpZihNb2R1bGVbXCJvbkV4aXRcIl0pTW9kdWxlW1wib25FeGl0XCJdKHN0YXR1cyk7QUJPUlQ9dHJ1ZX1xdWl0XyhzdGF0dXMsbmV3IEV4aXRTdGF0dXMoc3RhdHVzKSl9aWYoTW9kdWxlW1wicHJlSW5pdFwiXSl7aWYodHlwZW9mIE1vZHVsZVtcInByZUluaXRcIl09PVwiZnVuY3Rpb25cIilNb2R1bGVbXCJwcmVJbml0XCJdPVtNb2R1bGVbXCJwcmVJbml0XCJdXTt3aGlsZShNb2R1bGVbXCJwcmVJbml0XCJdLmxlbmd0aD4wKXtNb2R1bGVbXCJwcmVJbml0XCJdLnBvcCgpKCl9fWlmKEVOVklST05NRU5UX0lTX1BUSFJFQUQpe25vRXhpdFJ1bnRpbWU9ZmFsc2U7UFRocmVhZC5pbml0V29ya2VyKCl9cnVuKCk7XG5cblxuICByZXR1cm4gV2FzbUJhY2tlbmRNb2R1bGVUaHJlYWRlZFNpbWQucmVhZHlcbn1cbik7XG59KSgpO1xuaWYgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JylcbiAgbW9kdWxlLmV4cG9ydHMgPSBXYXNtQmFja2VuZE1vZHVsZVRocmVhZGVkU2ltZDtcbmVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lWydhbWQnXSlcbiAgZGVmaW5lKFtdLCBmdW5jdGlvbigpIHsgcmV0dXJuIFdhc21CYWNrZW5kTW9kdWxlVGhyZWFkZWRTaW1kOyB9KTtcbmVsc2UgaWYgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JylcbiAgZXhwb3J0c1tcIldhc21CYWNrZW5kTW9kdWxlVGhyZWFkZWRTaW1kXCJdID0gV2FzbUJhY2tlbmRNb2R1bGVUaHJlYWRlZFNpbWQ7XG4iLCJleHBvcnQgY29uc3Qgd2FzbVdvcmtlckNvbnRlbnRzID0gJ3ZhciBNb2R1bGU9e307ZnVuY3Rpb24gdGhyZWFkUHJpbnRFcnIoKXt2YXIgdGV4dD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLmpvaW4oXCIgXCIpO2NvbnNvbGUuZXJyb3IodGV4dCl9ZnVuY3Rpb24gdGhyZWFkQWxlcnQoKXt2YXIgdGV4dD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLmpvaW4oXCIgXCIpO3Bvc3RNZXNzYWdlKHtjbWQ6XCJhbGVydFwiLHRleHQ6dGV4dCx0aHJlYWRJZDpNb2R1bGVbXCJfcHRocmVhZF9zZWxmXCJdKCl9KX12YXIgZXJyPXRocmVhZFByaW50RXJyO3RoaXMuYWxlcnQ9dGhyZWFkQWxlcnQ7TW9kdWxlW1wiaW5zdGFudGlhdGVXYXNtXCJdPWZ1bmN0aW9uKGluZm8scmVjZWl2ZUluc3RhbmNlKXt2YXIgaW5zdGFuY2U9bmV3IFdlYkFzc2VtYmx5Lkluc3RhbmNlKE1vZHVsZVtcIndhc21Nb2R1bGVcIl0saW5mbyk7TW9kdWxlW1wid2FzbU1vZHVsZVwiXT1udWxsO3JlY2VpdmVJbnN0YW5jZShpbnN0YW5jZSk7cmV0dXJuIGluc3RhbmNlLmV4cG9ydHN9O2Z1bmN0aW9uIG1vZHVsZUxvYWRlZCgpe310aGlzLm9ubWVzc2FnZT1mdW5jdGlvbihlKXt0cnl7aWYoZS5kYXRhLmNtZD09PVwibG9hZFwiKXtNb2R1bGVbXCJ3YXNtTW9kdWxlXCJdPWUuZGF0YS53YXNtTW9kdWxlO01vZHVsZVtcIndhc21NZW1vcnlcIl09ZS5kYXRhLndhc21NZW1vcnk7TW9kdWxlW1wiYnVmZmVyXCJdPU1vZHVsZVtcIndhc21NZW1vcnlcIl0uYnVmZmVyO01vZHVsZVtcIkVOVklST05NRU5UX0lTX1BUSFJFQURcIl09dHJ1ZTtpZih0eXBlb2YgZS5kYXRhLnVybE9yQmxvYj09PVwic3RyaW5nXCIpe2ltcG9ydFNjcmlwdHMoZS5kYXRhLnVybE9yQmxvYil9ZWxzZXt2YXIgb2JqZWN0VXJsPVVSTC5jcmVhdGVPYmplY3RVUkwoZS5kYXRhLnVybE9yQmxvYik7aW1wb3J0U2NyaXB0cyhvYmplY3RVcmwpO1VSTC5yZXZva2VPYmplY3RVUkwob2JqZWN0VXJsKX1XYXNtQmFja2VuZE1vZHVsZVRocmVhZGVkU2ltZChNb2R1bGUpLnRoZW4oZnVuY3Rpb24oaW5zdGFuY2Upe01vZHVsZT1pbnN0YW5jZTttb2R1bGVMb2FkZWQoKX0pfWVsc2UgaWYoZS5kYXRhLmNtZD09PVwib2JqZWN0VHJhbnNmZXJcIil7TW9kdWxlW1wiUFRocmVhZFwiXS5yZWNlaXZlT2JqZWN0VHJhbnNmZXIoZS5kYXRhKX1lbHNlIGlmKGUuZGF0YS5jbWQ9PT1cInJ1blwiKXtNb2R1bGVbXCJfX3BlcmZvcm1hbmNlX25vd19jbG9ja19kcmlmdFwiXT1wZXJmb3JtYW5jZS5ub3coKS1lLmRhdGEudGltZTtNb2R1bGVbXCJfX2Vtc2NyaXB0ZW5fdGhyZWFkX2luaXRcIl0oZS5kYXRhLnRocmVhZEluZm9TdHJ1Y3QsMCwwKTt2YXIgbWF4PWUuZGF0YS5zdGFja0Jhc2U7dmFyIHRvcD1lLmRhdGEuc3RhY2tCYXNlK2UuZGF0YS5zdGFja1NpemU7TW9kdWxlW1wiZXN0YWJsaXNoU3RhY2tTcGFjZVwiXSh0b3AsbWF4KTtNb2R1bGVbXCJfZW1zY3JpcHRlbl90bHNfaW5pdFwiXSgpO01vZHVsZVtcIlBUaHJlYWRcIl0ucmVjZWl2ZU9iamVjdFRyYW5zZmVyKGUuZGF0YSk7TW9kdWxlW1wiUFRocmVhZFwiXS5zZXRUaHJlYWRTdGF0dXMoTW9kdWxlW1wiX3B0aHJlYWRfc2VsZlwiXSgpLDEpO3RyeXt2YXIgcmVzdWx0PU1vZHVsZVtcImludm9rZUVudHJ5UG9pbnRcIl0oZS5kYXRhLnN0YXJ0X3JvdXRpbmUsZS5kYXRhLmFyZyk7aWYoIU1vZHVsZVtcImdldE5vRXhpdFJ1bnRpbWVcIl0oKSlNb2R1bGVbXCJQVGhyZWFkXCJdLnRocmVhZEV4aXQocmVzdWx0KX1jYXRjaChleCl7aWYoZXg9PT1cIkNhbmNlbGVkIVwiKXtNb2R1bGVbXCJQVGhyZWFkXCJdLnRocmVhZENhbmNlbCgpfWVsc2UgaWYoZXghPVwidW53aW5kXCIpe2lmKGV4IGluc3RhbmNlb2YgTW9kdWxlW1wiRXhpdFN0YXR1c1wiXSl7aWYoTW9kdWxlW1wiZ2V0Tm9FeGl0UnVudGltZVwiXSgpKXt9ZWxzZXtNb2R1bGVbXCJQVGhyZWFkXCJdLnRocmVhZEV4aXQoZXguc3RhdHVzKX19ZWxzZXtNb2R1bGVbXCJQVGhyZWFkXCJdLnRocmVhZEV4aXQoLTIpO3Rocm93IGV4fX19fWVsc2UgaWYoZS5kYXRhLmNtZD09PVwiY2FuY2VsXCIpe2lmKE1vZHVsZVtcIl9wdGhyZWFkX3NlbGZcIl0oKSl7TW9kdWxlW1wiUFRocmVhZFwiXS50aHJlYWRDYW5jZWwoKX19ZWxzZSBpZihlLmRhdGEudGFyZ2V0PT09XCJzZXRpbW1lZGlhdGVcIil7fWVsc2UgaWYoZS5kYXRhLmNtZD09PVwicHJvY2Vzc1RocmVhZFF1ZXVlXCIpe2lmKE1vZHVsZVtcIl9wdGhyZWFkX3NlbGZcIl0oKSl7TW9kdWxlW1wiX2Vtc2NyaXB0ZW5fY3VycmVudF90aHJlYWRfcHJvY2Vzc19xdWV1ZWRfY2FsbHNcIl0oKX19ZWxzZXtlcnIoXCJ3b3JrZXIuanMgcmVjZWl2ZWQgdW5rbm93biBjb21tYW5kIFwiK2UuZGF0YS5jbWQpO2VycihlLmRhdGEpfX1jYXRjaChleCl7ZXJyKFwid29ya2VyLmpzIG9ubWVzc2FnZSgpIGNhcHR1cmVkIGFuIHVuY2F1Z2h0IGV4Y2VwdGlvbjogXCIrZXgpO2lmKGV4JiZleC5zdGFjayllcnIoZXguc3RhY2spO3Rocm93IGV4fX07aWYodHlwZW9mIHByb2Nlc3M9PT1cIm9iamVjdFwiJiZ0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucz09PVwib2JqZWN0XCImJnR5cGVvZiBwcm9jZXNzLnZlcnNpb25zLm5vZGU9PT1cInN0cmluZ1wiKXtzZWxmPXtsb2NhdGlvbjp7aHJlZjpfX2ZpbGVuYW1lfX07dmFyIG9ubWVzc2FnZT10aGlzLm9ubWVzc2FnZTt2YXIgbm9kZVdvcmtlclRocmVhZHM9cmVxdWlyZShcIndvcmtlcl90aHJlYWRzXCIpO2dsb2JhbC5Xb3JrZXI9bm9kZVdvcmtlclRocmVhZHMuV29ya2VyO3ZhciBwYXJlbnRQb3J0PW5vZGVXb3JrZXJUaHJlYWRzLnBhcmVudFBvcnQ7cGFyZW50UG9ydC5vbihcIm1lc3NhZ2VcIixmdW5jdGlvbihkYXRhKXtvbm1lc3NhZ2Uoe2RhdGE6ZGF0YX0pfSk7dmFyIG5vZGVGUz1yZXF1aXJlKFwiZnNcIik7dmFyIG5vZGVSZWFkPWZ1bmN0aW9uKGZpbGVuYW1lKXtyZXR1cm4gbm9kZUZTLnJlYWRGaWxlU3luYyhmaWxlbmFtZSxcInV0ZjhcIil9O2Z1bmN0aW9uIGdsb2JhbEV2YWwoeCl7Z2xvYmFsLnJlcXVpcmU9cmVxdWlyZTtnbG9iYWwuTW9kdWxlPU1vZHVsZTtldmFsLmNhbGwobnVsbCx4KX1pbXBvcnRTY3JpcHRzPWZ1bmN0aW9uKGYpe2dsb2JhbEV2YWwobm9kZVJlYWQoZikpfTtwb3N0TWVzc2FnZT1mdW5jdGlvbihtc2cpe3BhcmVudFBvcnQucG9zdE1lc3NhZ2UobXNnKX07aWYodHlwZW9mIHBlcmZvcm1hbmNlPT09XCJ1bmRlZmluZWRcIil7cGVyZm9ybWFuY2U9e25vdzpmdW5jdGlvbigpe3JldHVybiBEYXRlLm5vdygpfX19fSc7IiwiXG52YXIgV2FzbUJhY2tlbmRNb2R1bGUgPSAoZnVuY3Rpb24oKSB7XG4gIHZhciBfc2NyaXB0RGlyID0gdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBkb2N1bWVudC5jdXJyZW50U2NyaXB0ID8gZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMgOiB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2YgX19maWxlbmFtZSAhPT0gJ3VuZGVmaW5lZCcpIF9zY3JpcHREaXIgPSBfc2NyaXB0RGlyIHx8IF9fZmlsZW5hbWU7XG4gIHJldHVybiAoXG5mdW5jdGlvbihXYXNtQmFja2VuZE1vZHVsZSkge1xuICBXYXNtQmFja2VuZE1vZHVsZSA9IFdhc21CYWNrZW5kTW9kdWxlIHx8IHt9O1xuXG52YXIgTW9kdWxlPXR5cGVvZiBXYXNtQmFja2VuZE1vZHVsZSE9PVwidW5kZWZpbmVkXCI/V2FzbUJhY2tlbmRNb2R1bGU6e307dmFyIHJlYWR5UHJvbWlzZVJlc29sdmUscmVhZHlQcm9taXNlUmVqZWN0O01vZHVsZVtcInJlYWR5XCJdPW5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUscmVqZWN0KXtyZWFkeVByb21pc2VSZXNvbHZlPXJlc29sdmU7cmVhZHlQcm9taXNlUmVqZWN0PXJlamVjdH0pO3ZhciBtb2R1bGVPdmVycmlkZXM9e307dmFyIGtleTtmb3Ioa2V5IGluIE1vZHVsZSl7aWYoTW9kdWxlLmhhc093blByb3BlcnR5KGtleSkpe21vZHVsZU92ZXJyaWRlc1trZXldPU1vZHVsZVtrZXldfX12YXIgYXJndW1lbnRzXz1bXTt2YXIgdGhpc1Byb2dyYW09XCIuL3RoaXMucHJvZ3JhbVwiO3ZhciBxdWl0Xz1mdW5jdGlvbihzdGF0dXMsdG9UaHJvdyl7dGhyb3cgdG9UaHJvd307dmFyIEVOVklST05NRU5UX0lTX1dFQj1mYWxzZTt2YXIgRU5WSVJPTk1FTlRfSVNfV09SS0VSPWZhbHNlO3ZhciBFTlZJUk9OTUVOVF9JU19OT0RFPWZhbHNlO3ZhciBFTlZJUk9OTUVOVF9JU19TSEVMTD1mYWxzZTtFTlZJUk9OTUVOVF9JU19XRUI9dHlwZW9mIHdpbmRvdz09PVwib2JqZWN0XCI7RU5WSVJPTk1FTlRfSVNfV09SS0VSPXR5cGVvZiBpbXBvcnRTY3JpcHRzPT09XCJmdW5jdGlvblwiO0VOVklST05NRU5UX0lTX05PREU9dHlwZW9mIHByb2Nlc3M9PT1cIm9iamVjdFwiJiZ0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucz09PVwib2JqZWN0XCImJnR5cGVvZiBwcm9jZXNzLnZlcnNpb25zLm5vZGU9PT1cInN0cmluZ1wiO0VOVklST05NRU5UX0lTX1NIRUxMPSFFTlZJUk9OTUVOVF9JU19XRUImJiFFTlZJUk9OTUVOVF9JU19OT0RFJiYhRU5WSVJPTk1FTlRfSVNfV09SS0VSO3ZhciBzY3JpcHREaXJlY3Rvcnk9XCJcIjtmdW5jdGlvbiBsb2NhdGVGaWxlKHBhdGgpe2lmKE1vZHVsZVtcImxvY2F0ZUZpbGVcIl0pe3JldHVybiBNb2R1bGVbXCJsb2NhdGVGaWxlXCJdKHBhdGgsc2NyaXB0RGlyZWN0b3J5KX1yZXR1cm4gc2NyaXB0RGlyZWN0b3J5K3BhdGh9dmFyIHJlYWRfLHJlYWRBc3luYyxyZWFkQmluYXJ5LHNldFdpbmRvd1RpdGxlO3ZhciBub2RlRlM7dmFyIG5vZGVQYXRoO2lmKEVOVklST05NRU5UX0lTX05PREUpe2lmKEVOVklST05NRU5UX0lTX1dPUktFUil7c2NyaXB0RGlyZWN0b3J5PXJlcXVpcmUoXCJwYXRoXCIpLmRpcm5hbWUoc2NyaXB0RGlyZWN0b3J5KStcIi9cIn1lbHNle3NjcmlwdERpcmVjdG9yeT1fX2Rpcm5hbWUrXCIvXCJ9cmVhZF89ZnVuY3Rpb24gc2hlbGxfcmVhZChmaWxlbmFtZSxiaW5hcnkpe2lmKCFub2RlRlMpbm9kZUZTPXJlcXVpcmUoXCJmc1wiKTtpZighbm9kZVBhdGgpbm9kZVBhdGg9cmVxdWlyZShcInBhdGhcIik7ZmlsZW5hbWU9bm9kZVBhdGhbXCJub3JtYWxpemVcIl0oZmlsZW5hbWUpO3JldHVybiBub2RlRlNbXCJyZWFkRmlsZVN5bmNcIl0oZmlsZW5hbWUsYmluYXJ5P251bGw6XCJ1dGY4XCIpfTtyZWFkQmluYXJ5PWZ1bmN0aW9uIHJlYWRCaW5hcnkoZmlsZW5hbWUpe3ZhciByZXQ9cmVhZF8oZmlsZW5hbWUsdHJ1ZSk7aWYoIXJldC5idWZmZXIpe3JldD1uZXcgVWludDhBcnJheShyZXQpfWFzc2VydChyZXQuYnVmZmVyKTtyZXR1cm4gcmV0fTtpZihwcm9jZXNzW1wiYXJndlwiXS5sZW5ndGg+MSl7dGhpc1Byb2dyYW09cHJvY2Vzc1tcImFyZ3ZcIl1bMV0ucmVwbGFjZSgvXFxcXC9nLFwiL1wiKX1hcmd1bWVudHNfPXByb2Nlc3NbXCJhcmd2XCJdLnNsaWNlKDIpO3Byb2Nlc3NbXCJvblwiXShcInVuY2F1Z2h0RXhjZXB0aW9uXCIsZnVuY3Rpb24oZXgpe2lmKCEoZXggaW5zdGFuY2VvZiBFeGl0U3RhdHVzKSl7dGhyb3cgZXh9fSk7cHJvY2Vzc1tcIm9uXCJdKFwidW5oYW5kbGVkUmVqZWN0aW9uXCIsYWJvcnQpO3F1aXRfPWZ1bmN0aW9uKHN0YXR1cyl7cHJvY2Vzc1tcImV4aXRcIl0oc3RhdHVzKX07TW9kdWxlW1wiaW5zcGVjdFwiXT1mdW5jdGlvbigpe3JldHVyblwiW0Vtc2NyaXB0ZW4gTW9kdWxlIG9iamVjdF1cIn19ZWxzZSBpZihFTlZJUk9OTUVOVF9JU19TSEVMTCl7aWYodHlwZW9mIHJlYWQhPVwidW5kZWZpbmVkXCIpe3JlYWRfPWZ1bmN0aW9uIHNoZWxsX3JlYWQoZil7cmV0dXJuIHJlYWQoZil9fXJlYWRCaW5hcnk9ZnVuY3Rpb24gcmVhZEJpbmFyeShmKXt2YXIgZGF0YTtpZih0eXBlb2YgcmVhZGJ1ZmZlcj09PVwiZnVuY3Rpb25cIil7cmV0dXJuIG5ldyBVaW50OEFycmF5KHJlYWRidWZmZXIoZikpfWRhdGE9cmVhZChmLFwiYmluYXJ5XCIpO2Fzc2VydCh0eXBlb2YgZGF0YT09PVwib2JqZWN0XCIpO3JldHVybiBkYXRhfTtpZih0eXBlb2Ygc2NyaXB0QXJncyE9XCJ1bmRlZmluZWRcIil7YXJndW1lbnRzXz1zY3JpcHRBcmdzfWVsc2UgaWYodHlwZW9mIGFyZ3VtZW50cyE9XCJ1bmRlZmluZWRcIil7YXJndW1lbnRzXz1hcmd1bWVudHN9aWYodHlwZW9mIHF1aXQ9PT1cImZ1bmN0aW9uXCIpe3F1aXRfPWZ1bmN0aW9uKHN0YXR1cyl7cXVpdChzdGF0dXMpfX1pZih0eXBlb2YgcHJpbnQhPT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgY29uc29sZT09PVwidW5kZWZpbmVkXCIpY29uc29sZT17fTtjb25zb2xlLmxvZz1wcmludDtjb25zb2xlLndhcm49Y29uc29sZS5lcnJvcj10eXBlb2YgcHJpbnRFcnIhPT1cInVuZGVmaW5lZFwiP3ByaW50RXJyOnByaW50fX1lbHNlIGlmKEVOVklST05NRU5UX0lTX1dFQnx8RU5WSVJPTk1FTlRfSVNfV09SS0VSKXtpZihFTlZJUk9OTUVOVF9JU19XT1JLRVIpe3NjcmlwdERpcmVjdG9yeT1zZWxmLmxvY2F0aW9uLmhyZWZ9ZWxzZSBpZih0eXBlb2YgZG9jdW1lbnQhPT1cInVuZGVmaW5lZFwiJiZkb2N1bWVudC5jdXJyZW50U2NyaXB0KXtzY3JpcHREaXJlY3Rvcnk9ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmN9aWYoX3NjcmlwdERpcil7c2NyaXB0RGlyZWN0b3J5PV9zY3JpcHREaXJ9aWYoc2NyaXB0RGlyZWN0b3J5LmluZGV4T2YoXCJibG9iOlwiKSE9PTApe3NjcmlwdERpcmVjdG9yeT1zY3JpcHREaXJlY3Rvcnkuc3Vic3RyKDAsc2NyaXB0RGlyZWN0b3J5Lmxhc3RJbmRleE9mKFwiL1wiKSsxKX1lbHNle3NjcmlwdERpcmVjdG9yeT1cIlwifXtyZWFkXz1mdW5jdGlvbih1cmwpe3ZhciB4aHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3hoci5vcGVuKFwiR0VUXCIsdXJsLGZhbHNlKTt4aHIuc2VuZChudWxsKTtyZXR1cm4geGhyLnJlc3BvbnNlVGV4dH07aWYoRU5WSVJPTk1FTlRfSVNfV09SS0VSKXtyZWFkQmluYXJ5PWZ1bmN0aW9uKHVybCl7dmFyIHhocj1uZXcgWE1MSHR0cFJlcXVlc3Q7eGhyLm9wZW4oXCJHRVRcIix1cmwsZmFsc2UpO3hoci5yZXNwb25zZVR5cGU9XCJhcnJheWJ1ZmZlclwiO3hoci5zZW5kKG51bGwpO3JldHVybiBuZXcgVWludDhBcnJheSh4aHIucmVzcG9uc2UpfX1yZWFkQXN5bmM9ZnVuY3Rpb24odXJsLG9ubG9hZCxvbmVycm9yKXt2YXIgeGhyPW5ldyBYTUxIdHRwUmVxdWVzdDt4aHIub3BlbihcIkdFVFwiLHVybCx0cnVlKTt4aHIucmVzcG9uc2VUeXBlPVwiYXJyYXlidWZmZXJcIjt4aHIub25sb2FkPWZ1bmN0aW9uKCl7aWYoeGhyLnN0YXR1cz09MjAwfHx4aHIuc3RhdHVzPT0wJiZ4aHIucmVzcG9uc2Upe29ubG9hZCh4aHIucmVzcG9uc2UpO3JldHVybn1vbmVycm9yKCl9O3hoci5vbmVycm9yPW9uZXJyb3I7eGhyLnNlbmQobnVsbCl9fXNldFdpbmRvd1RpdGxlPWZ1bmN0aW9uKHRpdGxlKXtkb2N1bWVudC50aXRsZT10aXRsZX19ZWxzZXt9dmFyIG91dD1Nb2R1bGVbXCJwcmludFwiXXx8Y29uc29sZS5sb2cuYmluZChjb25zb2xlKTt2YXIgZXJyPU1vZHVsZVtcInByaW50RXJyXCJdfHxjb25zb2xlLndhcm4uYmluZChjb25zb2xlKTtmb3Ioa2V5IGluIG1vZHVsZU92ZXJyaWRlcyl7aWYobW9kdWxlT3ZlcnJpZGVzLmhhc093blByb3BlcnR5KGtleSkpe01vZHVsZVtrZXldPW1vZHVsZU92ZXJyaWRlc1trZXldfX1tb2R1bGVPdmVycmlkZXM9bnVsbDtpZihNb2R1bGVbXCJhcmd1bWVudHNcIl0pYXJndW1lbnRzXz1Nb2R1bGVbXCJhcmd1bWVudHNcIl07aWYoTW9kdWxlW1widGhpc1Byb2dyYW1cIl0pdGhpc1Byb2dyYW09TW9kdWxlW1widGhpc1Byb2dyYW1cIl07aWYoTW9kdWxlW1wicXVpdFwiXSlxdWl0Xz1Nb2R1bGVbXCJxdWl0XCJdO3ZhciB3YXNtQmluYXJ5O2lmKE1vZHVsZVtcIndhc21CaW5hcnlcIl0pd2FzbUJpbmFyeT1Nb2R1bGVbXCJ3YXNtQmluYXJ5XCJdO3ZhciBub0V4aXRSdW50aW1lPU1vZHVsZVtcIm5vRXhpdFJ1bnRpbWVcIl18fHRydWU7aWYodHlwZW9mIFdlYkFzc2VtYmx5IT09XCJvYmplY3RcIil7YWJvcnQoXCJubyBuYXRpdmUgd2FzbSBzdXBwb3J0IGRldGVjdGVkXCIpfXZhciB3YXNtTWVtb3J5O3ZhciBBQk9SVD1mYWxzZTt2YXIgRVhJVFNUQVRVUztmdW5jdGlvbiBhc3NlcnQoY29uZGl0aW9uLHRleHQpe2lmKCFjb25kaXRpb24pe2Fib3J0KFwiQXNzZXJ0aW9uIGZhaWxlZDogXCIrdGV4dCl9fWZ1bmN0aW9uIGdldENGdW5jKGlkZW50KXt2YXIgZnVuYz1Nb2R1bGVbXCJfXCIraWRlbnRdO2Fzc2VydChmdW5jLFwiQ2Fubm90IGNhbGwgdW5rbm93biBmdW5jdGlvbiBcIitpZGVudCtcIiwgbWFrZSBzdXJlIGl0IGlzIGV4cG9ydGVkXCIpO3JldHVybiBmdW5jfWZ1bmN0aW9uIGNjYWxsKGlkZW50LHJldHVyblR5cGUsYXJnVHlwZXMsYXJncyxvcHRzKXt2YXIgdG9DPXtcInN0cmluZ1wiOmZ1bmN0aW9uKHN0cil7dmFyIHJldD0wO2lmKHN0ciE9PW51bGwmJnN0ciE9PXVuZGVmaW5lZCYmc3RyIT09MCl7dmFyIGxlbj0oc3RyLmxlbmd0aDw8MikrMTtyZXQ9c3RhY2tBbGxvYyhsZW4pO3N0cmluZ1RvVVRGOChzdHIscmV0LGxlbil9cmV0dXJuIHJldH0sXCJhcnJheVwiOmZ1bmN0aW9uKGFycil7dmFyIHJldD1zdGFja0FsbG9jKGFyci5sZW5ndGgpO3dyaXRlQXJyYXlUb01lbW9yeShhcnIscmV0KTtyZXR1cm4gcmV0fX07ZnVuY3Rpb24gY29udmVydFJldHVyblZhbHVlKHJldCl7aWYocmV0dXJuVHlwZT09PVwic3RyaW5nXCIpcmV0dXJuIFVURjhUb1N0cmluZyhyZXQpO2lmKHJldHVyblR5cGU9PT1cImJvb2xlYW5cIilyZXR1cm4gQm9vbGVhbihyZXQpO3JldHVybiByZXR9dmFyIGZ1bmM9Z2V0Q0Z1bmMoaWRlbnQpO3ZhciBjQXJncz1bXTt2YXIgc3RhY2s9MDtpZihhcmdzKXtmb3IodmFyIGk9MDtpPGFyZ3MubGVuZ3RoO2krKyl7dmFyIGNvbnZlcnRlcj10b0NbYXJnVHlwZXNbaV1dO2lmKGNvbnZlcnRlcil7aWYoc3RhY2s9PT0wKXN0YWNrPXN0YWNrU2F2ZSgpO2NBcmdzW2ldPWNvbnZlcnRlcihhcmdzW2ldKX1lbHNle2NBcmdzW2ldPWFyZ3NbaV19fX12YXIgcmV0PWZ1bmMuYXBwbHkobnVsbCxjQXJncyk7cmV0PWNvbnZlcnRSZXR1cm5WYWx1ZShyZXQpO2lmKHN0YWNrIT09MClzdGFja1Jlc3RvcmUoc3RhY2spO3JldHVybiByZXR9ZnVuY3Rpb24gY3dyYXAoaWRlbnQscmV0dXJuVHlwZSxhcmdUeXBlcyxvcHRzKXthcmdUeXBlcz1hcmdUeXBlc3x8W107dmFyIG51bWVyaWNBcmdzPWFyZ1R5cGVzLmV2ZXJ5KGZ1bmN0aW9uKHR5cGUpe3JldHVybiB0eXBlPT09XCJudW1iZXJcIn0pO3ZhciBudW1lcmljUmV0PXJldHVyblR5cGUhPT1cInN0cmluZ1wiO2lmKG51bWVyaWNSZXQmJm51bWVyaWNBcmdzJiYhb3B0cyl7cmV0dXJuIGdldENGdW5jKGlkZW50KX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gY2NhbGwoaWRlbnQscmV0dXJuVHlwZSxhcmdUeXBlcyxhcmd1bWVudHMsb3B0cyl9fXZhciBVVEY4RGVjb2Rlcj10eXBlb2YgVGV4dERlY29kZXIhPT1cInVuZGVmaW5lZFwiP25ldyBUZXh0RGVjb2RlcihcInV0ZjhcIik6dW5kZWZpbmVkO2Z1bmN0aW9uIFVURjhBcnJheVRvU3RyaW5nKGhlYXAsaWR4LG1heEJ5dGVzVG9SZWFkKXt2YXIgZW5kSWR4PWlkeCttYXhCeXRlc1RvUmVhZDt2YXIgZW5kUHRyPWlkeDt3aGlsZShoZWFwW2VuZFB0cl0mJiEoZW5kUHRyPj1lbmRJZHgpKSsrZW5kUHRyO2lmKGVuZFB0ci1pZHg+MTYmJmhlYXAuc3ViYXJyYXkmJlVURjhEZWNvZGVyKXtyZXR1cm4gVVRGOERlY29kZXIuZGVjb2RlKGhlYXAuc3ViYXJyYXkoaWR4LGVuZFB0cikpfWVsc2V7dmFyIHN0cj1cIlwiO3doaWxlKGlkeDxlbmRQdHIpe3ZhciB1MD1oZWFwW2lkeCsrXTtpZighKHUwJjEyOCkpe3N0cis9U3RyaW5nLmZyb21DaGFyQ29kZSh1MCk7Y29udGludWV9dmFyIHUxPWhlYXBbaWR4KytdJjYzO2lmKCh1MCYyMjQpPT0xOTIpe3N0cis9U3RyaW5nLmZyb21DaGFyQ29kZSgodTAmMzEpPDw2fHUxKTtjb250aW51ZX12YXIgdTI9aGVhcFtpZHgrK10mNjM7aWYoKHUwJjI0MCk9PTIyNCl7dTA9KHUwJjE1KTw8MTJ8dTE8PDZ8dTJ9ZWxzZXt1MD0odTAmNyk8PDE4fHUxPDwxMnx1Mjw8NnxoZWFwW2lkeCsrXSY2M31pZih1MDw2NTUzNil7c3RyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHUwKX1lbHNle3ZhciBjaD11MC02NTUzNjtzdHIrPVN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTZ8Y2g+PjEwLDU2MzIwfGNoJjEwMjMpfX19cmV0dXJuIHN0cn1mdW5jdGlvbiBVVEY4VG9TdHJpbmcocHRyLG1heEJ5dGVzVG9SZWFkKXtyZXR1cm4gcHRyP1VURjhBcnJheVRvU3RyaW5nKEhFQVBVOCxwdHIsbWF4Qnl0ZXNUb1JlYWQpOlwiXCJ9ZnVuY3Rpb24gc3RyaW5nVG9VVEY4QXJyYXkoc3RyLGhlYXAsb3V0SWR4LG1heEJ5dGVzVG9Xcml0ZSl7aWYoIShtYXhCeXRlc1RvV3JpdGU+MCkpcmV0dXJuIDA7dmFyIHN0YXJ0SWR4PW91dElkeDt2YXIgZW5kSWR4PW91dElkeCttYXhCeXRlc1RvV3JpdGUtMTtmb3IodmFyIGk9MDtpPHN0ci5sZW5ndGg7KytpKXt2YXIgdT1zdHIuY2hhckNvZGVBdChpKTtpZih1Pj01NTI5NiYmdTw9NTczNDMpe3ZhciB1MT1zdHIuY2hhckNvZGVBdCgrK2kpO3U9NjU1MzYrKCh1JjEwMjMpPDwxMCl8dTEmMTAyM31pZih1PD0xMjcpe2lmKG91dElkeD49ZW5kSWR4KWJyZWFrO2hlYXBbb3V0SWR4KytdPXV9ZWxzZSBpZih1PD0yMDQ3KXtpZihvdXRJZHgrMT49ZW5kSWR4KWJyZWFrO2hlYXBbb3V0SWR4KytdPTE5Mnx1Pj42O2hlYXBbb3V0SWR4KytdPTEyOHx1JjYzfWVsc2UgaWYodTw9NjU1MzUpe2lmKG91dElkeCsyPj1lbmRJZHgpYnJlYWs7aGVhcFtvdXRJZHgrK109MjI0fHU+PjEyO2hlYXBbb3V0SWR4KytdPTEyOHx1Pj42JjYzO2hlYXBbb3V0SWR4KytdPTEyOHx1JjYzfWVsc2V7aWYob3V0SWR4KzM+PWVuZElkeClicmVhaztoZWFwW291dElkeCsrXT0yNDB8dT4+MTg7aGVhcFtvdXRJZHgrK109MTI4fHU+PjEyJjYzO2hlYXBbb3V0SWR4KytdPTEyOHx1Pj42JjYzO2hlYXBbb3V0SWR4KytdPTEyOHx1JjYzfX1oZWFwW291dElkeF09MDtyZXR1cm4gb3V0SWR4LXN0YXJ0SWR4fWZ1bmN0aW9uIHN0cmluZ1RvVVRGOChzdHIsb3V0UHRyLG1heEJ5dGVzVG9Xcml0ZSl7cmV0dXJuIHN0cmluZ1RvVVRGOEFycmF5KHN0cixIRUFQVTgsb3V0UHRyLG1heEJ5dGVzVG9Xcml0ZSl9ZnVuY3Rpb24gd3JpdGVBcnJheVRvTWVtb3J5KGFycmF5LGJ1ZmZlcil7SEVBUDguc2V0KGFycmF5LGJ1ZmZlcil9ZnVuY3Rpb24gYWxpZ25VcCh4LG11bHRpcGxlKXtpZih4JW11bHRpcGxlPjApe3grPW11bHRpcGxlLXglbXVsdGlwbGV9cmV0dXJuIHh9dmFyIGJ1ZmZlcixIRUFQOCxIRUFQVTgsSEVBUDE2LEhFQVBVMTYsSEVBUDMyLEhFQVBVMzIsSEVBUEYzMixIRUFQRjY0O2Z1bmN0aW9uIHVwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzKGJ1Zil7YnVmZmVyPWJ1ZjtNb2R1bGVbXCJIRUFQOFwiXT1IRUFQOD1uZXcgSW50OEFycmF5KGJ1Zik7TW9kdWxlW1wiSEVBUDE2XCJdPUhFQVAxNj1uZXcgSW50MTZBcnJheShidWYpO01vZHVsZVtcIkhFQVAzMlwiXT1IRUFQMzI9bmV3IEludDMyQXJyYXkoYnVmKTtNb2R1bGVbXCJIRUFQVThcIl09SEVBUFU4PW5ldyBVaW50OEFycmF5KGJ1Zik7TW9kdWxlW1wiSEVBUFUxNlwiXT1IRUFQVTE2PW5ldyBVaW50MTZBcnJheShidWYpO01vZHVsZVtcIkhFQVBVMzJcIl09SEVBUFUzMj1uZXcgVWludDMyQXJyYXkoYnVmKTtNb2R1bGVbXCJIRUFQRjMyXCJdPUhFQVBGMzI9bmV3IEZsb2F0MzJBcnJheShidWYpO01vZHVsZVtcIkhFQVBGNjRcIl09SEVBUEY2ND1uZXcgRmxvYXQ2NEFycmF5KGJ1Zil9dmFyIElOSVRJQUxfTUVNT1JZPU1vZHVsZVtcIklOSVRJQUxfTUVNT1JZXCJdfHwxNjc3NzIxNjt2YXIgd2FzbVRhYmxlO3ZhciBfX0FUUFJFUlVOX189W107dmFyIF9fQVRJTklUX189W107dmFyIF9fQVRNQUlOX189W107dmFyIF9fQVRQT1NUUlVOX189W107dmFyIHJ1bnRpbWVJbml0aWFsaXplZD1mYWxzZTtfX0FUSU5JVF9fLnB1c2goe2Z1bmM6ZnVuY3Rpb24oKXtfX193YXNtX2NhbGxfY3RvcnMoKX19KTtmdW5jdGlvbiBwcmVSdW4oKXtpZihNb2R1bGVbXCJwcmVSdW5cIl0pe2lmKHR5cGVvZiBNb2R1bGVbXCJwcmVSdW5cIl09PVwiZnVuY3Rpb25cIilNb2R1bGVbXCJwcmVSdW5cIl09W01vZHVsZVtcInByZVJ1blwiXV07d2hpbGUoTW9kdWxlW1wicHJlUnVuXCJdLmxlbmd0aCl7YWRkT25QcmVSdW4oTW9kdWxlW1wicHJlUnVuXCJdLnNoaWZ0KCkpfX1jYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUUFJFUlVOX18pfWZ1bmN0aW9uIGluaXRSdW50aW1lKCl7cnVudGltZUluaXRpYWxpemVkPXRydWU7Y2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVElOSVRfXyl9ZnVuY3Rpb24gcHJlTWFpbigpe2NhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRNQUlOX18pfWZ1bmN0aW9uIHBvc3RSdW4oKXtpZihNb2R1bGVbXCJwb3N0UnVuXCJdKXtpZih0eXBlb2YgTW9kdWxlW1wicG9zdFJ1blwiXT09XCJmdW5jdGlvblwiKU1vZHVsZVtcInBvc3RSdW5cIl09W01vZHVsZVtcInBvc3RSdW5cIl1dO3doaWxlKE1vZHVsZVtcInBvc3RSdW5cIl0ubGVuZ3RoKXthZGRPblBvc3RSdW4oTW9kdWxlW1wicG9zdFJ1blwiXS5zaGlmdCgpKX19Y2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVFBPU1RSVU5fXyl9ZnVuY3Rpb24gYWRkT25QcmVSdW4oY2Ipe19fQVRQUkVSVU5fXy51bnNoaWZ0KGNiKX1mdW5jdGlvbiBhZGRPblBvc3RSdW4oY2Ipe19fQVRQT1NUUlVOX18udW5zaGlmdChjYil9dmFyIHJ1bkRlcGVuZGVuY2llcz0wO3ZhciBydW5EZXBlbmRlbmN5V2F0Y2hlcj1udWxsO3ZhciBkZXBlbmRlbmNpZXNGdWxmaWxsZWQ9bnVsbDtmdW5jdGlvbiBhZGRSdW5EZXBlbmRlbmN5KGlkKXtydW5EZXBlbmRlbmNpZXMrKztpZihNb2R1bGVbXCJtb25pdG9yUnVuRGVwZW5kZW5jaWVzXCJdKXtNb2R1bGVbXCJtb25pdG9yUnVuRGVwZW5kZW5jaWVzXCJdKHJ1bkRlcGVuZGVuY2llcyl9fWZ1bmN0aW9uIHJlbW92ZVJ1bkRlcGVuZGVuY3koaWQpe3J1bkRlcGVuZGVuY2llcy0tO2lmKE1vZHVsZVtcIm1vbml0b3JSdW5EZXBlbmRlbmNpZXNcIl0pe01vZHVsZVtcIm1vbml0b3JSdW5EZXBlbmRlbmNpZXNcIl0ocnVuRGVwZW5kZW5jaWVzKX1pZihydW5EZXBlbmRlbmNpZXM9PTApe2lmKHJ1bkRlcGVuZGVuY3lXYXRjaGVyIT09bnVsbCl7Y2xlYXJJbnRlcnZhbChydW5EZXBlbmRlbmN5V2F0Y2hlcik7cnVuRGVwZW5kZW5jeVdhdGNoZXI9bnVsbH1pZihkZXBlbmRlbmNpZXNGdWxmaWxsZWQpe3ZhciBjYWxsYmFjaz1kZXBlbmRlbmNpZXNGdWxmaWxsZWQ7ZGVwZW5kZW5jaWVzRnVsZmlsbGVkPW51bGw7Y2FsbGJhY2soKX19fU1vZHVsZVtcInByZWxvYWRlZEltYWdlc1wiXT17fTtNb2R1bGVbXCJwcmVsb2FkZWRBdWRpb3NcIl09e307ZnVuY3Rpb24gYWJvcnQod2hhdCl7aWYoTW9kdWxlW1wib25BYm9ydFwiXSl7TW9kdWxlW1wib25BYm9ydFwiXSh3aGF0KX13aGF0Kz1cIlwiO2Vycih3aGF0KTtBQk9SVD10cnVlO0VYSVRTVEFUVVM9MTt3aGF0PVwiYWJvcnQoXCIrd2hhdCtcIikuIEJ1aWxkIHdpdGggLXMgQVNTRVJUSU9OUz0xIGZvciBtb3JlIGluZm8uXCI7dmFyIGU9bmV3IFdlYkFzc2VtYmx5LlJ1bnRpbWVFcnJvcih3aGF0KTtyZWFkeVByb21pc2VSZWplY3QoZSk7dGhyb3cgZX1mdW5jdGlvbiBoYXNQcmVmaXgoc3RyLHByZWZpeCl7cmV0dXJuIFN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aD9zdHIuc3RhcnRzV2l0aChwcmVmaXgpOnN0ci5pbmRleE9mKHByZWZpeCk9PT0wfXZhciBkYXRhVVJJUHJlZml4PVwiZGF0YTphcHBsaWNhdGlvbi9vY3RldC1zdHJlYW07YmFzZTY0LFwiO2Z1bmN0aW9uIGlzRGF0YVVSSShmaWxlbmFtZSl7cmV0dXJuIGhhc1ByZWZpeChmaWxlbmFtZSxkYXRhVVJJUHJlZml4KX12YXIgZmlsZVVSSVByZWZpeD1cImZpbGU6Ly9cIjtmdW5jdGlvbiBpc0ZpbGVVUkkoZmlsZW5hbWUpe3JldHVybiBoYXNQcmVmaXgoZmlsZW5hbWUsZmlsZVVSSVByZWZpeCl9dmFyIHdhc21CaW5hcnlGaWxlPVwidGZqcy1iYWNrZW5kLXdhc20ud2FzbVwiO2lmKCFpc0RhdGFVUkkod2FzbUJpbmFyeUZpbGUpKXt3YXNtQmluYXJ5RmlsZT1sb2NhdGVGaWxlKHdhc21CaW5hcnlGaWxlKX1mdW5jdGlvbiBnZXRCaW5hcnkoZmlsZSl7dHJ5e2lmKGZpbGU9PXdhc21CaW5hcnlGaWxlJiZ3YXNtQmluYXJ5KXtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkod2FzbUJpbmFyeSl9aWYocmVhZEJpbmFyeSl7cmV0dXJuIHJlYWRCaW5hcnkoZmlsZSl9ZWxzZXt0aHJvd1wiYm90aCBhc3luYyBhbmQgc3luYyBmZXRjaGluZyBvZiB0aGUgd2FzbSBmYWlsZWRcIn19Y2F0Y2goZXJyKXthYm9ydChlcnIpfX1mdW5jdGlvbiBnZXRCaW5hcnlQcm9taXNlKCl7aWYoIXdhc21CaW5hcnkmJihFTlZJUk9OTUVOVF9JU19XRUJ8fEVOVklST05NRU5UX0lTX1dPUktFUikpe2lmKHR5cGVvZiBmZXRjaD09PVwiZnVuY3Rpb25cIiYmIWlzRmlsZVVSSSh3YXNtQmluYXJ5RmlsZSkpe3JldHVybiBmZXRjaCh3YXNtQmluYXJ5RmlsZSx7Y3JlZGVudGlhbHM6XCJzYW1lLW9yaWdpblwifSkudGhlbihmdW5jdGlvbihyZXNwb25zZSl7aWYoIXJlc3BvbnNlW1wib2tcIl0pe3Rocm93XCJmYWlsZWQgdG8gbG9hZCB3YXNtIGJpbmFyeSBmaWxlIGF0ICdcIit3YXNtQmluYXJ5RmlsZStcIidcIn1yZXR1cm4gcmVzcG9uc2VbXCJhcnJheUJ1ZmZlclwiXSgpfSkuY2F0Y2goZnVuY3Rpb24oKXtyZXR1cm4gZ2V0QmluYXJ5KHdhc21CaW5hcnlGaWxlKX0pfWVsc2V7aWYocmVhZEFzeW5jKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSxyZWplY3Qpe3JlYWRBc3luYyh3YXNtQmluYXJ5RmlsZSxmdW5jdGlvbihyZXNwb25zZSl7cmVzb2x2ZShuZXcgVWludDhBcnJheShyZXNwb25zZSkpfSxyZWplY3QpfSl9fX1yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbigpe3JldHVybiBnZXRCaW5hcnkod2FzbUJpbmFyeUZpbGUpfSl9ZnVuY3Rpb24gY3JlYXRlV2FzbSgpe3ZhciBpbmZvPXtcImFcIjphc21MaWJyYXJ5QXJnfTtmdW5jdGlvbiByZWNlaXZlSW5zdGFuY2UoaW5zdGFuY2UsbW9kdWxlKXt2YXIgZXhwb3J0cz1pbnN0YW5jZS5leHBvcnRzO01vZHVsZVtcImFzbVwiXT1leHBvcnRzO3dhc21NZW1vcnk9TW9kdWxlW1wiYXNtXCJdW1wiaVwiXTt1cGRhdGVHbG9iYWxCdWZmZXJBbmRWaWV3cyh3YXNtTWVtb3J5LmJ1ZmZlcik7d2FzbVRhYmxlPU1vZHVsZVtcImFzbVwiXVtcIm9cIl07cmVtb3ZlUnVuRGVwZW5kZW5jeShcIndhc20taW5zdGFudGlhdGVcIil9YWRkUnVuRGVwZW5kZW5jeShcIndhc20taW5zdGFudGlhdGVcIik7ZnVuY3Rpb24gcmVjZWl2ZUluc3RhbnRpYXRlZFNvdXJjZShvdXRwdXQpe3JlY2VpdmVJbnN0YW5jZShvdXRwdXRbXCJpbnN0YW5jZVwiXSl9ZnVuY3Rpb24gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlcil7cmV0dXJuIGdldEJpbmFyeVByb21pc2UoKS50aGVuKGZ1bmN0aW9uKGJpbmFyeSl7cmV0dXJuIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKGJpbmFyeSxpbmZvKX0pLnRoZW4ocmVjZWl2ZXIsZnVuY3Rpb24ocmVhc29uKXtlcnIoXCJmYWlsZWQgdG8gYXN5bmNocm9ub3VzbHkgcHJlcGFyZSB3YXNtOiBcIityZWFzb24pO2Fib3J0KHJlYXNvbil9KX1mdW5jdGlvbiBpbnN0YW50aWF0ZUFzeW5jKCl7aWYoIXdhc21CaW5hcnkmJnR5cGVvZiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZz09PVwiZnVuY3Rpb25cIiYmIWlzRGF0YVVSSSh3YXNtQmluYXJ5RmlsZSkmJiFpc0ZpbGVVUkkod2FzbUJpbmFyeUZpbGUpJiZ0eXBlb2YgZmV0Y2g9PT1cImZ1bmN0aW9uXCIpe3JldHVybiBmZXRjaCh3YXNtQmluYXJ5RmlsZSx7Y3JlZGVudGlhbHM6XCJzYW1lLW9yaWdpblwifSkudGhlbihmdW5jdGlvbihyZXNwb25zZSl7dmFyIHJlc3VsdD1XZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhyZXNwb25zZSxpbmZvKTtyZXR1cm4gcmVzdWx0LnRoZW4ocmVjZWl2ZUluc3RhbnRpYXRlZFNvdXJjZSxmdW5jdGlvbihyZWFzb24pe2VycihcIndhc20gc3RyZWFtaW5nIGNvbXBpbGUgZmFpbGVkOiBcIityZWFzb24pO2VycihcImZhbGxpbmcgYmFjayB0byBBcnJheUJ1ZmZlciBpbnN0YW50aWF0aW9uXCIpO3JldHVybiBpbnN0YW50aWF0ZUFycmF5QnVmZmVyKHJlY2VpdmVJbnN0YW50aWF0ZWRTb3VyY2UpfSl9KX1lbHNle3JldHVybiBpbnN0YW50aWF0ZUFycmF5QnVmZmVyKHJlY2VpdmVJbnN0YW50aWF0ZWRTb3VyY2UpfX1pZihNb2R1bGVbXCJpbnN0YW50aWF0ZVdhc21cIl0pe3RyeXt2YXIgZXhwb3J0cz1Nb2R1bGVbXCJpbnN0YW50aWF0ZVdhc21cIl0oaW5mbyxyZWNlaXZlSW5zdGFuY2UpO3JldHVybiBleHBvcnRzfWNhdGNoKGUpe2VycihcIk1vZHVsZS5pbnN0YW50aWF0ZVdhc20gY2FsbGJhY2sgZmFpbGVkIHdpdGggZXJyb3I6IFwiK2UpO3JldHVybiBmYWxzZX19aW5zdGFudGlhdGVBc3luYygpLmNhdGNoKHJlYWR5UHJvbWlzZVJlamVjdCk7cmV0dXJue319ZnVuY3Rpb24gY2FsbFJ1bnRpbWVDYWxsYmFja3MoY2FsbGJhY2tzKXt3aGlsZShjYWxsYmFja3MubGVuZ3RoPjApe3ZhciBjYWxsYmFjaz1jYWxsYmFja3Muc2hpZnQoKTtpZih0eXBlb2YgY2FsbGJhY2s9PVwiZnVuY3Rpb25cIil7Y2FsbGJhY2soTW9kdWxlKTtjb250aW51ZX12YXIgZnVuYz1jYWxsYmFjay5mdW5jO2lmKHR5cGVvZiBmdW5jPT09XCJudW1iZXJcIil7aWYoY2FsbGJhY2suYXJnPT09dW5kZWZpbmVkKXt3YXNtVGFibGUuZ2V0KGZ1bmMpKCl9ZWxzZXt3YXNtVGFibGUuZ2V0KGZ1bmMpKGNhbGxiYWNrLmFyZyl9fWVsc2V7ZnVuYyhjYWxsYmFjay5hcmc9PT11bmRlZmluZWQ/bnVsbDpjYWxsYmFjay5hcmcpfX19ZnVuY3Rpb24gX2Fib3J0KCl7YWJvcnQoKX1mdW5jdGlvbiBfZW1zY3JpcHRlbl9tZW1jcHlfYmlnKGRlc3Qsc3JjLG51bSl7SEVBUFU4LmNvcHlXaXRoaW4oZGVzdCxzcmMsc3JjK251bSl9ZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fZ2V0X2hlYXBfc2l6ZSgpe3JldHVybiBIRUFQVTgubGVuZ3RofWZ1bmN0aW9uIGVtc2NyaXB0ZW5fcmVhbGxvY19idWZmZXIoc2l6ZSl7dHJ5e3dhc21NZW1vcnkuZ3JvdyhzaXplLWJ1ZmZlci5ieXRlTGVuZ3RoKzY1NTM1Pj4+MTYpO3VwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzKHdhc21NZW1vcnkuYnVmZmVyKTtyZXR1cm4gMX1jYXRjaChlKXt9fWZ1bmN0aW9uIF9lbXNjcmlwdGVuX3Jlc2l6ZV9oZWFwKHJlcXVlc3RlZFNpemUpe3ZhciBvbGRTaXplPV9lbXNjcmlwdGVuX2dldF9oZWFwX3NpemUoKTt2YXIgbWF4SGVhcFNpemU9MjE0NzQ4MzY0ODtpZihyZXF1ZXN0ZWRTaXplPm1heEhlYXBTaXplKXtyZXR1cm4gZmFsc2V9Zm9yKHZhciBjdXREb3duPTE7Y3V0RG93bjw9NDtjdXREb3duKj0yKXt2YXIgb3Zlckdyb3duSGVhcFNpemU9b2xkU2l6ZSooMSsuMi9jdXREb3duKTtvdmVyR3Jvd25IZWFwU2l6ZT1NYXRoLm1pbihvdmVyR3Jvd25IZWFwU2l6ZSxyZXF1ZXN0ZWRTaXplKzEwMDY2MzI5Nik7dmFyIG5ld1NpemU9TWF0aC5taW4obWF4SGVhcFNpemUsYWxpZ25VcChNYXRoLm1heChyZXF1ZXN0ZWRTaXplLG92ZXJHcm93bkhlYXBTaXplKSw2NTUzNikpO3ZhciByZXBsYWNlbWVudD1lbXNjcmlwdGVuX3JlYWxsb2NfYnVmZmVyKG5ld1NpemUpO2lmKHJlcGxhY2VtZW50KXtyZXR1cm4gdHJ1ZX19cmV0dXJuIGZhbHNlfXZhciBTWVNDQUxMUz17bWFwcGluZ3M6e30sYnVmZmVyczpbbnVsbCxbXSxbXV0scHJpbnRDaGFyOmZ1bmN0aW9uKHN0cmVhbSxjdXJyKXt2YXIgYnVmZmVyPVNZU0NBTExTLmJ1ZmZlcnNbc3RyZWFtXTtpZihjdXJyPT09MHx8Y3Vycj09PTEwKXsoc3RyZWFtPT09MT9vdXQ6ZXJyKShVVEY4QXJyYXlUb1N0cmluZyhidWZmZXIsMCkpO2J1ZmZlci5sZW5ndGg9MH1lbHNle2J1ZmZlci5wdXNoKGN1cnIpfX0sdmFyYXJnczp1bmRlZmluZWQsZ2V0OmZ1bmN0aW9uKCl7U1lTQ0FMTFMudmFyYXJncys9NDt2YXIgcmV0PUhFQVAzMltTWVNDQUxMUy52YXJhcmdzLTQ+PjJdO3JldHVybiByZXR9LGdldFN0cjpmdW5jdGlvbihwdHIpe3ZhciByZXQ9VVRGOFRvU3RyaW5nKHB0cik7cmV0dXJuIHJldH0sZ2V0NjQ6ZnVuY3Rpb24obG93LGhpZ2gpe3JldHVybiBsb3d9fTtmdW5jdGlvbiBfZmRfY2xvc2UoZmQpe3JldHVybiAwfWZ1bmN0aW9uIF9mZF9zZWVrKGZkLG9mZnNldF9sb3csb2Zmc2V0X2hpZ2gsd2hlbmNlLG5ld09mZnNldCl7fWZ1bmN0aW9uIF9mZF93cml0ZShmZCxpb3YsaW92Y250LHBudW0pe3ZhciBudW09MDtmb3IodmFyIGk9MDtpPGlvdmNudDtpKyspe3ZhciBwdHI9SEVBUDMyW2lvditpKjg+PjJdO3ZhciBsZW49SEVBUDMyW2lvdisoaSo4KzQpPj4yXTtmb3IodmFyIGo9MDtqPGxlbjtqKyspe1NZU0NBTExTLnByaW50Q2hhcihmZCxIRUFQVThbcHRyK2pdKX1udW0rPWxlbn1IRUFQMzJbcG51bT4+Ml09bnVtO3JldHVybiAwfWZ1bmN0aW9uIF9wdGhyZWFkX2NyZWF0ZSgpe3JldHVybiA2fWZ1bmN0aW9uIHNldEVyck5vKHZhbHVlKXtIRUFQMzJbX19fZXJybm9fbG9jYXRpb24oKT4+Ml09dmFsdWU7cmV0dXJuIHZhbHVlfWZ1bmN0aW9uIF9zeXNjb25mKG5hbWUpe3N3aXRjaChuYW1lKXtjYXNlIDMwOnJldHVybiAxNjM4NDtjYXNlIDg1OnZhciBtYXhIZWFwU2l6ZT0yMTQ3NDgzNjQ4O3JldHVybiBtYXhIZWFwU2l6ZS8xNjM4NDtjYXNlIDEzMjpjYXNlIDEzMzpjYXNlIDEyOmNhc2UgMTM3OmNhc2UgMTM4OmNhc2UgMTU6Y2FzZSAyMzU6Y2FzZSAxNjpjYXNlIDE3OmNhc2UgMTg6Y2FzZSAxOTpjYXNlIDIwOmNhc2UgMTQ5OmNhc2UgMTM6Y2FzZSAxMDpjYXNlIDIzNjpjYXNlIDE1MzpjYXNlIDk6Y2FzZSAyMTpjYXNlIDIyOmNhc2UgMTU5OmNhc2UgMTU0OmNhc2UgMTQ6Y2FzZSA3NzpjYXNlIDc4OmNhc2UgMTM5OmNhc2UgODI6Y2FzZSA2ODpjYXNlIDY3OmNhc2UgMTY0OmNhc2UgMTE6Y2FzZSAyOTpjYXNlIDQ3OmNhc2UgNDg6Y2FzZSA5NTpjYXNlIDUyOmNhc2UgNTE6Y2FzZSA0NjpyZXR1cm4gMjAwODA5O2Nhc2UgMjc6Y2FzZSAyNDY6Y2FzZSAxMjc6Y2FzZSAxMjg6Y2FzZSAyMzpjYXNlIDI0OmNhc2UgMTYwOmNhc2UgMTYxOmNhc2UgMTgxOmNhc2UgMTgyOmNhc2UgMjQyOmNhc2UgMTgzOmNhc2UgMTg0OmNhc2UgMjQzOmNhc2UgMjQ0OmNhc2UgMjQ1OmNhc2UgMTY1OmNhc2UgMTc4OmNhc2UgMTc5OmNhc2UgNDk6Y2FzZSA1MDpjYXNlIDE2ODpjYXNlIDE2OTpjYXNlIDE3NTpjYXNlIDE3MDpjYXNlIDE3MTpjYXNlIDE3MjpjYXNlIDk3OmNhc2UgNzY6Y2FzZSAzMjpjYXNlIDE3MzpjYXNlIDM1OmNhc2UgODA6Y2FzZSA4MTpjYXNlIDc5OnJldHVybi0xO2Nhc2UgMTc2OmNhc2UgMTc3OmNhc2UgNzpjYXNlIDE1NTpjYXNlIDg6Y2FzZSAxNTc6Y2FzZSAxMjU6Y2FzZSAxMjY6Y2FzZSA5MjpjYXNlIDkzOmNhc2UgMTI5OmNhc2UgMTMwOmNhc2UgMTMxOmNhc2UgOTQ6Y2FzZSA5MTpyZXR1cm4gMTtjYXNlIDc0OmNhc2UgNjA6Y2FzZSA2OTpjYXNlIDcwOmNhc2UgNDpyZXR1cm4gMTAyNDtjYXNlIDMxOmNhc2UgNDI6Y2FzZSA3MjpyZXR1cm4gMzI7Y2FzZSA4NzpjYXNlIDI2OmNhc2UgMzM6cmV0dXJuIDIxNDc0ODM2NDc7Y2FzZSAzNDpjYXNlIDE6cmV0dXJuIDQ3ODM5O2Nhc2UgMzg6Y2FzZSAzNjpyZXR1cm4gOTk7Y2FzZSA0MzpjYXNlIDM3OnJldHVybiAyMDQ4O2Nhc2UgMDpyZXR1cm4gMjA5NzE1MjtjYXNlIDM6cmV0dXJuIDY1NTM2O2Nhc2UgMjg6cmV0dXJuIDMyNzY4O2Nhc2UgNDQ6cmV0dXJuIDMyNzY3O2Nhc2UgNzU6cmV0dXJuIDE2Mzg0O2Nhc2UgMzk6cmV0dXJuIDFlMztjYXNlIDg5OnJldHVybiA3MDA7Y2FzZSA3MTpyZXR1cm4gMjU2O2Nhc2UgNDA6cmV0dXJuIDI1NTtjYXNlIDI6cmV0dXJuIDEwMDtjYXNlIDE4MDpyZXR1cm4gNjQ7Y2FzZSAyNTpyZXR1cm4gMjA7Y2FzZSA1OnJldHVybiAxNjtjYXNlIDY6cmV0dXJuIDY7Y2FzZSA3MzpyZXR1cm4gNDtjYXNlIDg0OntpZih0eXBlb2YgbmF2aWdhdG9yPT09XCJvYmplY3RcIilyZXR1cm4gbmF2aWdhdG9yW1wiaGFyZHdhcmVDb25jdXJyZW5jeVwiXXx8MTtyZXR1cm4gMX19c2V0RXJyTm8oMjgpO3JldHVybi0xfXZhciBhc21MaWJyYXJ5QXJnPXtcImFcIjpfYWJvcnQsXCJkXCI6X2Vtc2NyaXB0ZW5fbWVtY3B5X2JpZyxcImVcIjpfZW1zY3JpcHRlbl9yZXNpemVfaGVhcCxcImZcIjpfZmRfY2xvc2UsXCJjXCI6X2ZkX3NlZWssXCJiXCI6X2ZkX3dyaXRlLFwiZ1wiOl9wdGhyZWFkX2NyZWF0ZSxcImhcIjpfc3lzY29uZn07dmFyIGFzbT1jcmVhdGVXYXNtKCk7dmFyIF9fX3dhc21fY2FsbF9jdG9ycz1Nb2R1bGVbXCJfX193YXNtX2NhbGxfY3RvcnNcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX19fd2FzbV9jYWxsX2N0b3JzPU1vZHVsZVtcIl9fX3dhc21fY2FsbF9jdG9yc1wiXT1Nb2R1bGVbXCJhc21cIl1bXCJqXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfaW5pdD1Nb2R1bGVbXCJfaW5pdFwiXT1mdW5jdGlvbigpe3JldHVybihfaW5pdD1Nb2R1bGVbXCJfaW5pdFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJrXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfcmVnaXN0ZXJfdGVuc29yPU1vZHVsZVtcIl9yZWdpc3Rlcl90ZW5zb3JcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX3JlZ2lzdGVyX3RlbnNvcj1Nb2R1bGVbXCJfcmVnaXN0ZXJfdGVuc29yXCJdPU1vZHVsZVtcImFzbVwiXVtcImxcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9kaXNwb3NlX2RhdGE9TW9kdWxlW1wiX2Rpc3Bvc2VfZGF0YVwiXT1mdW5jdGlvbigpe3JldHVybihfZGlzcG9zZV9kYXRhPU1vZHVsZVtcIl9kaXNwb3NlX2RhdGFcIl09TW9kdWxlW1wiYXNtXCJdW1wibVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX2Rpc3Bvc2U9TW9kdWxlW1wiX2Rpc3Bvc2VcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX2Rpc3Bvc2U9TW9kdWxlW1wiX2Rpc3Bvc2VcIl09TW9kdWxlW1wiYXNtXCJdW1wiblwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0Ficz1Nb2R1bGVbXCJfQWJzXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9BYnM9TW9kdWxlW1wiX0Fic1wiXT1Nb2R1bGVbXCJhc21cIl1bXCJwXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQWRkPU1vZHVsZVtcIl9BZGRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0FkZD1Nb2R1bGVbXCJfQWRkXCJdPU1vZHVsZVtcImFzbVwiXVtcInFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9BZGROPU1vZHVsZVtcIl9BZGROXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9BZGROPU1vZHVsZVtcIl9BZGROXCJdPU1vZHVsZVtcImFzbVwiXVtcInJcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9BbGw9TW9kdWxlW1wiX0FsbFwiXT1mdW5jdGlvbigpe3JldHVybihfQWxsPU1vZHVsZVtcIl9BbGxcIl09TW9kdWxlW1wiYXNtXCJdW1wic1wiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0FueT1Nb2R1bGVbXCJfQW55XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Bbnk9TW9kdWxlW1wiX0FueVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJ0XCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQXJnTWF4PU1vZHVsZVtcIl9BcmdNYXhcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0FyZ01heD1Nb2R1bGVbXCJfQXJnTWF4XCJdPU1vZHVsZVtcImFzbVwiXVtcInVcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9BdmdQb29sPU1vZHVsZVtcIl9BdmdQb29sXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9BdmdQb29sPU1vZHVsZVtcIl9BdmdQb29sXCJdPU1vZHVsZVtcImFzbVwiXVtcInZcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9CYXRjaE1hdE11bD1Nb2R1bGVbXCJfQmF0Y2hNYXRNdWxcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0JhdGNoTWF0TXVsPU1vZHVsZVtcIl9CYXRjaE1hdE11bFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJ3XCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQ2VpbD1Nb2R1bGVbXCJfQ2VpbFwiXT1mdW5jdGlvbigpe3JldHVybihfQ2VpbD1Nb2R1bGVbXCJfQ2VpbFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJ4XCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQ2xpcEJ5VmFsdWU9TW9kdWxlW1wiX0NsaXBCeVZhbHVlXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9DbGlwQnlWYWx1ZT1Nb2R1bGVbXCJfQ2xpcEJ5VmFsdWVcIl09TW9kdWxlW1wiYXNtXCJdW1wieVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0NvbnYyRD1Nb2R1bGVbXCJfQ29udjJEXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Db252MkQ9TW9kdWxlW1wiX0NvbnYyRFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJ6XCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQ29udjJEQmFja3Byb3BJbnB1dD1Nb2R1bGVbXCJfQ29udjJEQmFja3Byb3BJbnB1dFwiXT1mdW5jdGlvbigpe3JldHVybihfQ29udjJEQmFja3Byb3BJbnB1dD1Nb2R1bGVbXCJfQ29udjJEQmFja3Byb3BJbnB1dFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJBXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQ29zPU1vZHVsZVtcIl9Db3NcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0Nvcz1Nb2R1bGVbXCJfQ29zXCJdPU1vZHVsZVtcImFzbVwiXVtcIkJcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Db3NoPU1vZHVsZVtcIl9Db3NoXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Db3NoPU1vZHVsZVtcIl9Db3NoXCJdPU1vZHVsZVtcImFzbVwiXVtcIkNcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Dcm9wQW5kUmVzaXplPU1vZHVsZVtcIl9Dcm9wQW5kUmVzaXplXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Dcm9wQW5kUmVzaXplPU1vZHVsZVtcIl9Dcm9wQW5kUmVzaXplXCJdPU1vZHVsZVtcImFzbVwiXVtcIkRcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9DdW1zdW09TW9kdWxlW1wiX0N1bXN1bVwiXT1mdW5jdGlvbigpe3JldHVybihfQ3Vtc3VtPU1vZHVsZVtcIl9DdW1zdW1cIl09TW9kdWxlW1wiYXNtXCJdW1wiRVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0RlcHRoVG9TcGFjZT1Nb2R1bGVbXCJfRGVwdGhUb1NwYWNlXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9EZXB0aFRvU3BhY2U9TW9kdWxlW1wiX0RlcHRoVG9TcGFjZVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJGXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfRGVwdGh3aXNlQ29udjJkTmF0aXZlPU1vZHVsZVtcIl9EZXB0aHdpc2VDb252MmROYXRpdmVcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0RlcHRod2lzZUNvbnYyZE5hdGl2ZT1Nb2R1bGVbXCJfRGVwdGh3aXNlQ29udjJkTmF0aXZlXCJdPU1vZHVsZVtcImFzbVwiXVtcIkdcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9FcXVhbD1Nb2R1bGVbXCJfRXF1YWxcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0VxdWFsPU1vZHVsZVtcIl9FcXVhbFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJIXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfRXhwPU1vZHVsZVtcIl9FeHBcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0V4cD1Nb2R1bGVbXCJfRXhwXCJdPU1vZHVsZVtcImFzbVwiXVtcIklcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9GbGlwTGVmdFJpZ2h0PU1vZHVsZVtcIl9GbGlwTGVmdFJpZ2h0XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9GbGlwTGVmdFJpZ2h0PU1vZHVsZVtcIl9GbGlwTGVmdFJpZ2h0XCJdPU1vZHVsZVtcImFzbVwiXVtcIkpcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9GbG9vcj1Nb2R1bGVbXCJfRmxvb3JcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0Zsb29yPU1vZHVsZVtcIl9GbG9vclwiXT1Nb2R1bGVbXCJhc21cIl1bXCJLXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfRmxvb3JEaXY9TW9kdWxlW1wiX0Zsb29yRGl2XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9GbG9vckRpdj1Nb2R1bGVbXCJfRmxvb3JEaXZcIl09TW9kdWxlW1wiYXNtXCJdW1wiTFwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0Z1c2VkQmF0Y2hOb3JtPU1vZHVsZVtcIl9GdXNlZEJhdGNoTm9ybVwiXT1mdW5jdGlvbigpe3JldHVybihfRnVzZWRCYXRjaE5vcm09TW9kdWxlW1wiX0Z1c2VkQmF0Y2hOb3JtXCJdPU1vZHVsZVtcImFzbVwiXVtcIk1cIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9GdXNlZENvbnYyRD1Nb2R1bGVbXCJfRnVzZWRDb252MkRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0Z1c2VkQ29udjJEPU1vZHVsZVtcIl9GdXNlZENvbnYyRFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJOXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfRnVzZWREZXB0aHdpc2VDb252MkQ9TW9kdWxlW1wiX0Z1c2VkRGVwdGh3aXNlQ29udjJEXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9GdXNlZERlcHRod2lzZUNvbnYyRD1Nb2R1bGVbXCJfRnVzZWREZXB0aHdpc2VDb252MkRcIl09TW9kdWxlW1wiYXNtXCJdW1wiT1wiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0dhdGhlcj1Nb2R1bGVbXCJfR2F0aGVyXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9HYXRoZXI9TW9kdWxlW1wiX0dhdGhlclwiXT1Nb2R1bGVbXCJhc21cIl1bXCJQXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfR2F0aGVyTmQ9TW9kdWxlW1wiX0dhdGhlck5kXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9HYXRoZXJOZD1Nb2R1bGVbXCJfR2F0aGVyTmRcIl09TW9kdWxlW1wiYXNtXCJdW1wiUVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0dyZWF0ZXI9TW9kdWxlW1wiX0dyZWF0ZXJcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0dyZWF0ZXI9TW9kdWxlW1wiX0dyZWF0ZXJcIl09TW9kdWxlW1wiYXNtXCJdW1wiUlwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0dyZWF0ZXJFcXVhbD1Nb2R1bGVbXCJfR3JlYXRlckVxdWFsXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9HcmVhdGVyRXF1YWw9TW9kdWxlW1wiX0dyZWF0ZXJFcXVhbFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJTXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTGVha3lSZWx1PU1vZHVsZVtcIl9MZWFreVJlbHVcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0xlYWt5UmVsdT1Nb2R1bGVbXCJfTGVha3lSZWx1XCJdPU1vZHVsZVtcImFzbVwiXVtcIlRcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9MZXNzPU1vZHVsZVtcIl9MZXNzXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9MZXNzPU1vZHVsZVtcIl9MZXNzXCJdPU1vZHVsZVtcImFzbVwiXVtcIlVcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9MZXNzRXF1YWw9TW9kdWxlW1wiX0xlc3NFcXVhbFwiXT1mdW5jdGlvbigpe3JldHVybihfTGVzc0VxdWFsPU1vZHVsZVtcIl9MZXNzRXF1YWxcIl09TW9kdWxlW1wiYXNtXCJdW1wiVlwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0xvZz1Nb2R1bGVbXCJfTG9nXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Mb2c9TW9kdWxlW1wiX0xvZ1wiXT1Nb2R1bGVbXCJhc21cIl1bXCJXXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTG9naWNhbEFuZD1Nb2R1bGVbXCJfTG9naWNhbEFuZFwiXT1mdW5jdGlvbigpe3JldHVybihfTG9naWNhbEFuZD1Nb2R1bGVbXCJfTG9naWNhbEFuZFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJYXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTWF4PU1vZHVsZVtcIl9NYXhcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX01heD1Nb2R1bGVbXCJfTWF4XCJdPU1vZHVsZVtcImFzbVwiXVtcIllcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9NYXhQb29sPU1vZHVsZVtcIl9NYXhQb29sXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9NYXhQb29sPU1vZHVsZVtcIl9NYXhQb29sXCJdPU1vZHVsZVtcImFzbVwiXVtcIlpcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9NYXhpbXVtPU1vZHVsZVtcIl9NYXhpbXVtXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9NYXhpbXVtPU1vZHVsZVtcIl9NYXhpbXVtXCJdPU1vZHVsZVtcImFzbVwiXVtcIl9cIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9NZWFuPU1vZHVsZVtcIl9NZWFuXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9NZWFuPU1vZHVsZVtcIl9NZWFuXCJdPU1vZHVsZVtcImFzbVwiXVtcIiRcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9NaW49TW9kdWxlW1wiX01pblwiXT1mdW5jdGlvbigpe3JldHVybihfTWluPU1vZHVsZVtcIl9NaW5cIl09TW9kdWxlW1wiYXNtXCJdW1wiYWFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9NaW5pbXVtPU1vZHVsZVtcIl9NaW5pbXVtXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9NaW5pbXVtPU1vZHVsZVtcIl9NaW5pbXVtXCJdPU1vZHVsZVtcImFzbVwiXVtcImJhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTWlycm9yUGFkPU1vZHVsZVtcIl9NaXJyb3JQYWRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX01pcnJvclBhZD1Nb2R1bGVbXCJfTWlycm9yUGFkXCJdPU1vZHVsZVtcImFzbVwiXVtcImNhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTXVsdGlwbHk9TW9kdWxlW1wiX011bHRpcGx5XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9NdWx0aXBseT1Nb2R1bGVbXCJfTXVsdGlwbHlcIl09TW9kdWxlW1wiYXNtXCJdW1wiZGFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9OZWc9TW9kdWxlW1wiX05lZ1wiXT1mdW5jdGlvbigpe3JldHVybihfTmVnPU1vZHVsZVtcIl9OZWdcIl09TW9kdWxlW1wiYXNtXCJdW1wiZWFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Ob25NYXhTdXBwcmVzc2lvblYzPU1vZHVsZVtcIl9Ob25NYXhTdXBwcmVzc2lvblYzXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Ob25NYXhTdXBwcmVzc2lvblYzPU1vZHVsZVtcIl9Ob25NYXhTdXBwcmVzc2lvblYzXCJdPU1vZHVsZVtcImFzbVwiXVtcImZhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTm9uTWF4U3VwcHJlc3Npb25WND1Nb2R1bGVbXCJfTm9uTWF4U3VwcHJlc3Npb25WNFwiXT1mdW5jdGlvbigpe3JldHVybihfTm9uTWF4U3VwcHJlc3Npb25WND1Nb2R1bGVbXCJfTm9uTWF4U3VwcHJlc3Npb25WNFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJnYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX05vbk1heFN1cHByZXNzaW9uVjU9TW9kdWxlW1wiX05vbk1heFN1cHByZXNzaW9uVjVcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX05vbk1heFN1cHByZXNzaW9uVjU9TW9kdWxlW1wiX05vbk1heFN1cHByZXNzaW9uVjVcIl09TW9kdWxlW1wiYXNtXCJdW1wiaGFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Ob3RFcXVhbD1Nb2R1bGVbXCJfTm90RXF1YWxcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX05vdEVxdWFsPU1vZHVsZVtcIl9Ob3RFcXVhbFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJpYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX09uZUhvdD1Nb2R1bGVbXCJfT25lSG90XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9PbmVIb3Q9TW9kdWxlW1wiX09uZUhvdFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJqYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1BhZFYyPU1vZHVsZVtcIl9QYWRWMlwiXT1mdW5jdGlvbigpe3JldHVybihfUGFkVjI9TW9kdWxlW1wiX1BhZFYyXCJdPU1vZHVsZVtcImFzbVwiXVtcImthXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfUG93PU1vZHVsZVtcIl9Qb3dcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1Bvdz1Nb2R1bGVbXCJfUG93XCJdPU1vZHVsZVtcImFzbVwiXVtcImxhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfUHJlbHU9TW9kdWxlW1wiX1ByZWx1XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9QcmVsdT1Nb2R1bGVbXCJfUHJlbHVcIl09TW9kdWxlW1wiYXNtXCJdW1wibWFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Qcm9kPU1vZHVsZVtcIl9Qcm9kXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Qcm9kPU1vZHVsZVtcIl9Qcm9kXCJdPU1vZHVsZVtcImFzbVwiXVtcIm5hXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfUmVhbERpdj1Nb2R1bGVbXCJfUmVhbERpdlwiXT1mdW5jdGlvbigpe3JldHVybihfUmVhbERpdj1Nb2R1bGVbXCJfUmVhbERpdlwiXT1Nb2R1bGVbXCJhc21cIl1bXCJvYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1JlbHU9TW9kdWxlW1wiX1JlbHVcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1JlbHU9TW9kdWxlW1wiX1JlbHVcIl09TW9kdWxlW1wiYXNtXCJdW1wicGFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9SZWx1Nj1Nb2R1bGVbXCJfUmVsdTZcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1JlbHU2PU1vZHVsZVtcIl9SZWx1NlwiXT1Nb2R1bGVbXCJhc21cIl1bXCJxYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1Jlc2l6ZUJpbGluZWFyPU1vZHVsZVtcIl9SZXNpemVCaWxpbmVhclwiXT1mdW5jdGlvbigpe3JldHVybihfUmVzaXplQmlsaW5lYXI9TW9kdWxlW1wiX1Jlc2l6ZUJpbGluZWFyXCJdPU1vZHVsZVtcImFzbVwiXVtcInJhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfUmV2ZXJzZT1Nb2R1bGVbXCJfUmV2ZXJzZVwiXT1mdW5jdGlvbigpe3JldHVybihfUmV2ZXJzZT1Nb2R1bGVbXCJfUmV2ZXJzZVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJzYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1JvdGF0ZVdpdGhPZmZzZXQ9TW9kdWxlW1wiX1JvdGF0ZVdpdGhPZmZzZXRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1JvdGF0ZVdpdGhPZmZzZXQ9TW9kdWxlW1wiX1JvdGF0ZVdpdGhPZmZzZXRcIl09TW9kdWxlW1wiYXNtXCJdW1widGFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Sb3VuZD1Nb2R1bGVbXCJfUm91bmRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1JvdW5kPU1vZHVsZVtcIl9Sb3VuZFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJ1YVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1JzcXJ0PU1vZHVsZVtcIl9Sc3FydFwiXT1mdW5jdGlvbigpe3JldHVybihfUnNxcnQ9TW9kdWxlW1wiX1JzcXJ0XCJdPU1vZHVsZVtcImFzbVwiXVtcInZhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfU2NhdHRlck5kPU1vZHVsZVtcIl9TY2F0dGVyTmRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1NjYXR0ZXJOZD1Nb2R1bGVbXCJfU2NhdHRlck5kXCJdPU1vZHVsZVtcImFzbVwiXVtcIndhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfU2VsZWN0VjI9TW9kdWxlW1wiX1NlbGVjdFYyXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9TZWxlY3RWMj1Nb2R1bGVbXCJfU2VsZWN0VjJcIl09TW9kdWxlW1wiYXNtXCJdW1wieGFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9TaWdtb2lkPU1vZHVsZVtcIl9TaWdtb2lkXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9TaWdtb2lkPU1vZHVsZVtcIl9TaWdtb2lkXCJdPU1vZHVsZVtcImFzbVwiXVtcInlhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfU2luPU1vZHVsZVtcIl9TaW5cIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1Npbj1Nb2R1bGVbXCJfU2luXCJdPU1vZHVsZVtcImFzbVwiXVtcInphXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfU29mdG1heD1Nb2R1bGVbXCJfU29mdG1heFwiXT1mdW5jdGlvbigpe3JldHVybihfU29mdG1heD1Nb2R1bGVbXCJfU29mdG1heFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJBYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1NxcnQ9TW9kdWxlW1wiX1NxcnRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1NxcnQ9TW9kdWxlW1wiX1NxcnRcIl09TW9kdWxlW1wiYXNtXCJdW1wiQmFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9TcXVhcmU9TW9kdWxlW1wiX1NxdWFyZVwiXT1mdW5jdGlvbigpe3JldHVybihfU3F1YXJlPU1vZHVsZVtcIl9TcXVhcmVcIl09TW9kdWxlW1wiYXNtXCJdW1wiQ2FcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9TcXVhcmVkRGlmZmVyZW5jZT1Nb2R1bGVbXCJfU3F1YXJlZERpZmZlcmVuY2VcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1NxdWFyZWREaWZmZXJlbmNlPU1vZHVsZVtcIl9TcXVhcmVkRGlmZmVyZW5jZVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJEYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1N0ZXA9TW9kdWxlW1wiX1N0ZXBcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1N0ZXA9TW9kdWxlW1wiX1N0ZXBcIl09TW9kdWxlW1wiYXNtXCJdW1wiRWFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9TdHJpZGVkU2xpY2U9TW9kdWxlW1wiX1N0cmlkZWRTbGljZVwiXT1mdW5jdGlvbigpe3JldHVybihfU3RyaWRlZFNsaWNlPU1vZHVsZVtcIl9TdHJpZGVkU2xpY2VcIl09TW9kdWxlW1wiYXNtXCJdW1wiRmFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9TdWI9TW9kdWxlW1wiX1N1YlwiXT1mdW5jdGlvbigpe3JldHVybihfU3ViPU1vZHVsZVtcIl9TdWJcIl09TW9kdWxlW1wiYXNtXCJdW1wiR2FcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9TdW09TW9kdWxlW1wiX1N1bVwiXT1mdW5jdGlvbigpe3JldHVybihfU3VtPU1vZHVsZVtcIl9TdW1cIl09TW9kdWxlW1wiYXNtXCJdW1wiSGFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9UYW49TW9kdWxlW1wiX1RhblwiXT1mdW5jdGlvbigpe3JldHVybihfVGFuPU1vZHVsZVtcIl9UYW5cIl09TW9kdWxlW1wiYXNtXCJdW1wiSWFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9UYW5oPU1vZHVsZVtcIl9UYW5oXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9UYW5oPU1vZHVsZVtcIl9UYW5oXCJdPU1vZHVsZVtcImFzbVwiXVtcIkphXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfVGlsZT1Nb2R1bGVbXCJfVGlsZVwiXT1mdW5jdGlvbigpe3JldHVybihfVGlsZT1Nb2R1bGVbXCJfVGlsZVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJLYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1RvcEs9TW9kdWxlW1wiX1RvcEtcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1RvcEs9TW9kdWxlW1wiX1RvcEtcIl09TW9kdWxlW1wiYXNtXCJdW1wiTGFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9UcmFuc2Zvcm09TW9kdWxlW1wiX1RyYW5zZm9ybVwiXT1mdW5jdGlvbigpe3JldHVybihfVHJhbnNmb3JtPU1vZHVsZVtcIl9UcmFuc2Zvcm1cIl09TW9kdWxlW1wiYXNtXCJdW1wiTWFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9UcmFuc3Bvc2U9TW9kdWxlW1wiX1RyYW5zcG9zZVwiXT1mdW5jdGlvbigpe3JldHVybihfVHJhbnNwb3NlPU1vZHVsZVtcIl9UcmFuc3Bvc2VcIl09TW9kdWxlW1wiYXNtXCJdW1wiTmFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9fRnVzZWRNYXRNdWw9TW9kdWxlW1wiX19GdXNlZE1hdE11bFwiXT1mdW5jdGlvbigpe3JldHVybihfX0Z1c2VkTWF0TXVsPU1vZHVsZVtcIl9fRnVzZWRNYXRNdWxcIl09TW9kdWxlW1wiYXNtXCJdW1wiT2FcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9tYWxsb2M9TW9kdWxlW1wiX21hbGxvY1wiXT1mdW5jdGlvbigpe3JldHVybihfbWFsbG9jPU1vZHVsZVtcIl9tYWxsb2NcIl09TW9kdWxlW1wiYXNtXCJdW1wiUGFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9mcmVlPU1vZHVsZVtcIl9mcmVlXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9mcmVlPU1vZHVsZVtcIl9mcmVlXCJdPU1vZHVsZVtcImFzbVwiXVtcIlFhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfX19lcnJub19sb2NhdGlvbj1Nb2R1bGVbXCJfX19lcnJub19sb2NhdGlvblwiXT1mdW5jdGlvbigpe3JldHVybihfX19lcnJub19sb2NhdGlvbj1Nb2R1bGVbXCJfX19lcnJub19sb2NhdGlvblwiXT1Nb2R1bGVbXCJhc21cIl1bXCJSYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgc3RhY2tTYXZlPU1vZHVsZVtcInN0YWNrU2F2ZVwiXT1mdW5jdGlvbigpe3JldHVybihzdGFja1NhdmU9TW9kdWxlW1wic3RhY2tTYXZlXCJdPU1vZHVsZVtcImFzbVwiXVtcIlNhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBzdGFja1Jlc3RvcmU9TW9kdWxlW1wic3RhY2tSZXN0b3JlXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKHN0YWNrUmVzdG9yZT1Nb2R1bGVbXCJzdGFja1Jlc3RvcmVcIl09TW9kdWxlW1wiYXNtXCJdW1wiVGFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIHN0YWNrQWxsb2M9TW9kdWxlW1wic3RhY2tBbGxvY1wiXT1mdW5jdGlvbigpe3JldHVybihzdGFja0FsbG9jPU1vZHVsZVtcInN0YWNrQWxsb2NcIl09TW9kdWxlW1wiYXNtXCJdW1wiVWFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07TW9kdWxlW1wiY3dyYXBcIl09Y3dyYXA7dmFyIGNhbGxlZFJ1bjtmdW5jdGlvbiBFeGl0U3RhdHVzKHN0YXR1cyl7dGhpcy5uYW1lPVwiRXhpdFN0YXR1c1wiO3RoaXMubWVzc2FnZT1cIlByb2dyYW0gdGVybWluYXRlZCB3aXRoIGV4aXQoXCIrc3RhdHVzK1wiKVwiO3RoaXMuc3RhdHVzPXN0YXR1c31kZXBlbmRlbmNpZXNGdWxmaWxsZWQ9ZnVuY3Rpb24gcnVuQ2FsbGVyKCl7aWYoIWNhbGxlZFJ1bilydW4oKTtpZighY2FsbGVkUnVuKWRlcGVuZGVuY2llc0Z1bGZpbGxlZD1ydW5DYWxsZXJ9O2Z1bmN0aW9uIHJ1bihhcmdzKXthcmdzPWFyZ3N8fGFyZ3VtZW50c187aWYocnVuRGVwZW5kZW5jaWVzPjApe3JldHVybn1wcmVSdW4oKTtpZihydW5EZXBlbmRlbmNpZXM+MCl7cmV0dXJufWZ1bmN0aW9uIGRvUnVuKCl7aWYoY2FsbGVkUnVuKXJldHVybjtjYWxsZWRSdW49dHJ1ZTtNb2R1bGVbXCJjYWxsZWRSdW5cIl09dHJ1ZTtpZihBQk9SVClyZXR1cm47aW5pdFJ1bnRpbWUoKTtwcmVNYWluKCk7cmVhZHlQcm9taXNlUmVzb2x2ZShNb2R1bGUpO2lmKE1vZHVsZVtcIm9uUnVudGltZUluaXRpYWxpemVkXCJdKU1vZHVsZVtcIm9uUnVudGltZUluaXRpYWxpemVkXCJdKCk7cG9zdFJ1bigpfWlmKE1vZHVsZVtcInNldFN0YXR1c1wiXSl7TW9kdWxlW1wic2V0U3RhdHVzXCJdKFwiUnVubmluZy4uLlwiKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe01vZHVsZVtcInNldFN0YXR1c1wiXShcIlwiKX0sMSk7ZG9SdW4oKX0sMSl9ZWxzZXtkb1J1bigpfX1Nb2R1bGVbXCJydW5cIl09cnVuO2lmKE1vZHVsZVtcInByZUluaXRcIl0pe2lmKHR5cGVvZiBNb2R1bGVbXCJwcmVJbml0XCJdPT1cImZ1bmN0aW9uXCIpTW9kdWxlW1wicHJlSW5pdFwiXT1bTW9kdWxlW1wicHJlSW5pdFwiXV07d2hpbGUoTW9kdWxlW1wicHJlSW5pdFwiXS5sZW5ndGg+MCl7TW9kdWxlW1wicHJlSW5pdFwiXS5wb3AoKSgpfX1ydW4oKTtcblxuXG4gIHJldHVybiBXYXNtQmFja2VuZE1vZHVsZS5yZWFkeVxufVxuKTtcbn0pKCk7XG5pZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuICBtb2R1bGUuZXhwb3J0cyA9IFdhc21CYWNrZW5kTW9kdWxlO1xuZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmVbJ2FtZCddKVxuICBkZWZpbmUoW10sIGZ1bmN0aW9uKCkgeyByZXR1cm4gV2FzbUJhY2tlbmRNb2R1bGU7IH0pO1xuZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuICBleHBvcnRzW1wiV2FzbUJhY2tlbmRNb2R1bGVcIl0gPSBXYXNtQmFja2VuZE1vZHVsZTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmV4cG9ydCBjb25zdCBFUFNJTE9OX0ZMT0FUMzIgPSAxZS03O1xuZXhwb3J0IGNvbnN0IEVQU0lMT05fRkxPQVQxNiA9IDFlLTQ7XG4vKiogQ29udmVuaWVudCBjbGFzcyBmb3Igc3RvcmluZyB0ZW5zb3ItcmVsYXRlZCBkYXRhLiAqL1xuZXhwb3J0IGNsYXNzIERhdGFTdG9yYWdlIHtcbiAgICBjb25zdHJ1Y3RvcihiYWNrZW5kLCBkYXRhTW92ZXIpIHtcbiAgICAgICAgdGhpcy5iYWNrZW5kID0gYmFja2VuZDtcbiAgICAgICAgdGhpcy5kYXRhTW92ZXIgPSBkYXRhTW92ZXI7XG4gICAgICAgIHRoaXMuZGF0YSA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIHRoaXMuZGF0YUlkc0NvdW50ID0gMDtcbiAgICB9XG4gICAgZ2V0KGRhdGFJZCkge1xuICAgICAgICBpZiAoIXRoaXMuZGF0YS5oYXMoZGF0YUlkKSkge1xuICAgICAgICAgICAgdGhpcy5kYXRhTW92ZXIubW92ZURhdGEodGhpcy5iYWNrZW5kLCBkYXRhSWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuZ2V0KGRhdGFJZCk7XG4gICAgfVxuICAgIHNldChkYXRhSWQsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuZGF0YUlkc0NvdW50Kys7XG4gICAgICAgIHRoaXMuZGF0YS5zZXQoZGF0YUlkLCB2YWx1ZSk7XG4gICAgfVxuICAgIGhhcyhkYXRhSWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5oYXMoZGF0YUlkKTtcbiAgICB9XG4gICAgZGVsZXRlKGRhdGFJZCkge1xuICAgICAgICB0aGlzLmRhdGFJZHNDb3VudC0tO1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmRlbGV0ZShkYXRhSWQpO1xuICAgIH1cbiAgICBudW1EYXRhSWRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhSWRzQ291bnQ7XG4gICAgfVxufVxuLyoqXG4gKiBUaGUgaW50ZXJmYWNlIHRoYXQgZGVmaW5lcyB0aGUga2VybmVscyB0aGF0IHNob3VsZCBiZSBpbXBsZW1lbnRlZCB3aGVuXG4gKiBhZGRpbmcgYSBuZXcgYmFja2VuZC4gTmV3IGJhY2tlbmRzIGRvbid0IG5lZWQgdG8gaW1wbGVtZW50IGV2ZXJ5IG9uZSBvZiB0aGVcbiAqIG1ldGhvZHMsIHRoaXMgY2FuIGJlIGRvbmUgZ3JhZHVhbGx5ICh0aHJvdyBhbiBlcnJvciBmb3IgdW5pbXBsZW1lbnRlZFxuICogbWV0aG9kcykuXG4gKi9cbmV4cG9ydCBjbGFzcyBLZXJuZWxCYWNrZW5kIHtcbiAgICByZWZDb3VudChkYXRhSWQpIHtcbiAgICAgICAgcmV0dXJuIG5vdFlldEltcGxlbWVudGVkKCdyZWZDb3VudCcpO1xuICAgIH1cbiAgICBpbmNSZWYoZGF0YUlkKSB7XG4gICAgICAgIHJldHVybiBub3RZZXRJbXBsZW1lbnRlZCgnaW5jUmVmJyk7XG4gICAgfVxuICAgIHRpbWVyQXZhaWxhYmxlKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdGltZShmKSB7XG4gICAgICAgIHJldHVybiBub3RZZXRJbXBsZW1lbnRlZCgndGltZScpO1xuICAgIH1cbiAgICByZWFkKGRhdGFJZCkge1xuICAgICAgICByZXR1cm4gbm90WWV0SW1wbGVtZW50ZWQoJ3JlYWQnKTtcbiAgICB9XG4gICAgcmVhZFN5bmMoZGF0YUlkKSB7XG4gICAgICAgIHJldHVybiBub3RZZXRJbXBsZW1lbnRlZCgncmVhZFN5bmMnKTtcbiAgICB9XG4gICAgbnVtRGF0YUlkcygpIHtcbiAgICAgICAgcmV0dXJuIG5vdFlldEltcGxlbWVudGVkKCdudW1EYXRhSWRzJyk7XG4gICAgfVxuICAgIGRpc3Bvc2VEYXRhKGRhdGFJZCwgZm9yY2UpIHtcbiAgICAgICAgcmV0dXJuIG5vdFlldEltcGxlbWVudGVkKCdkaXNwb3NlRGF0YScpO1xuICAgIH1cbiAgICB3cml0ZSh2YWx1ZXMsIHNoYXBlLCBkdHlwZSkge1xuICAgICAgICByZXR1cm4gbm90WWV0SW1wbGVtZW50ZWQoJ3dyaXRlJyk7XG4gICAgfVxuICAgIG1vdmUoZGF0YUlkLCB2YWx1ZXMsIHNoYXBlLCBkdHlwZSwgcmVmQ291bnQpIHtcbiAgICAgICAgcmV0dXJuIG5vdFlldEltcGxlbWVudGVkKCdtb3ZlJyk7XG4gICAgfVxuICAgIG1lbW9yeSgpIHtcbiAgICAgICAgcmV0dXJuIG5vdFlldEltcGxlbWVudGVkKCdtZW1vcnknKTtcbiAgICB9XG4gICAgLyoqIFJldHVybnMgdGhlIGhpZ2hlc3QgcHJlY2lzaW9uIGZvciBmbG9hdHMgaW4gYml0cyAoZS5nLiAxNiBvciAzMikgKi9cbiAgICBmbG9hdFByZWNpc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIG5vdFlldEltcGxlbWVudGVkKCdmbG9hdFByZWNpc2lvbicpO1xuICAgIH1cbiAgICAvKiogUmV0dXJucyB0aGUgc21hbGxlc3QgcmVwcmVzZW50YWJsZSBudW1iZXIuICAqL1xuICAgIGVwc2lsb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZsb2F0UHJlY2lzaW9uKCkgPT09IDMyID8gRVBTSUxPTl9GTE9BVDMyIDogRVBTSUxPTl9GTE9BVDE2O1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICByZXR1cm4gbm90WWV0SW1wbGVtZW50ZWQoJ2Rpc3Bvc2UnKTtcbiAgICB9XG59XG5mdW5jdGlvbiBub3RZZXRJbXBsZW1lbnRlZChrZXJuZWxOYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAnJHtrZXJuZWxOYW1lfScgbm90IHlldCBpbXBsZW1lbnRlZCBvciBub3QgZm91bmQgaW4gdGhlIHJlZ2lzdHJ5LiBgICtcbiAgICAgICAgYFRoaXMga2VybmVsIG1heSBub3QgYmUgc3VwcG9ydGVkIGJ5IHRoZSB0ZmpzIGJhY2tlbmQgeW91IGhhdmUgY2hvc2VuYCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iYWNrZW5kLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGRlY29kZVN0cmluZywgZW5jb2RlU3RyaW5nIH0gZnJvbSAnLi4vdXRpbCc7XG4vLyBVdGlsaXRpZXMgbmVlZGVkIGJ5IGJhY2tlbmQgY29uc3VtZXJzIG9mIHRmLWNvcmUuXG5leHBvcnQgKiBmcm9tICcuLi9vcHMvYXhpc191dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL29wcy9icm9hZGNhc3RfdXRpbCc7XG5leHBvcnQgKiBmcm9tICcuLi9vcHMvY29uY2F0X3V0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi4vb3BzL2NvbnZfdXRpbCc7XG5leHBvcnQgKiBmcm9tICcuLi9vcHMvZnVzZWRfdXRpbCc7XG5leHBvcnQgKiBmcm9tICcuLi9vcHMvcmVkdWNlX3V0aWwnO1xuaW1wb3J0ICogYXMgc2xpY2VfdXRpbCBmcm9tICcuLi9vcHMvc2xpY2VfdXRpbCc7XG5leHBvcnQgeyBzbGljZV91dGlsIH07XG5leHBvcnQgeyB1cGNhc3RUeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi4vb3BzL3JvdGF0ZV91dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL29wcy9hcnJheV9vcHNfdXRpbCc7XG5leHBvcnQgKiBmcm9tICcuLi9vcHMvZ2F0aGVyX25kX3V0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi4vb3BzL3NjYXR0ZXJfbmRfdXRpbCc7XG5leHBvcnQgKiBmcm9tICcuLi9vcHMvc2VsdV91dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL29wcy9mdXNlZF91dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL29wcy9lcmZfdXRpbCc7XG5leHBvcnQgKiBmcm9tICcuLi9sb2cnO1xuZXhwb3J0ICogZnJvbSAnLi4vYmFja2VuZHMvY29tcGxleF91dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL2JhY2tlbmRzL2VpbnN1bV91dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL29wcy9zcGxpdF91dGlsJztcbmltcG9ydCAqIGFzIHNlZ21lbnRfdXRpbCBmcm9tICcuLi9vcHMvc2VnbWVudF91dGlsJztcbmV4cG9ydCB7IHNlZ21lbnRfdXRpbCB9O1xuZXhwb3J0IGZ1bmN0aW9uIGZyb21VaW50OFRvU3RyaW5nQXJyYXkodmFscykge1xuICAgIHRyeSB7XG4gICAgICAgIC8vIERlY29kZSB0aGUgYnl0ZXMgaW50byBzdHJpbmcuXG4gICAgICAgIHJldHVybiB2YWxzLm1hcCh2YWwgPT4gZGVjb2RlU3RyaW5nKHZhbCkpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGRlY29kZSBlbmNvZGVkIHN0cmluZyBieXRlcyBpbnRvIHV0Zi04LCBlcnJvcjogJHtlcnJ9YCk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGZyb21TdHJpbmdBcnJheVRvVWludDgoc3RyaW5ncykge1xuICAgIHJldHVybiBzdHJpbmdzLm1hcChzID0+IGVuY29kZVN0cmluZyhzKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iYWNrZW5kX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLyoqXG4gKiBNZXJnZXMgcmVhbCBhbmQgaW1hZ2luYXJ5IEZsb2F0MzJBcnJheXMgaW50byBhIHNpbmdsZSBjb21wbGV4IEZsb2F0MzJBcnJheS5cbiAqXG4gKiBUaGUgbWVtb3J5IGxheW91dCBpcyBpbnRlcmxlYXZlZCBhcyBmb2xsb3dzOlxuICogcmVhbDogW3IwLCByMSwgcjJdXG4gKiBpbWFnOiBbaTAsIGkxLCBpMl1cbiAqIGNvbXBsZXg6IFtyMCwgaTAsIHIxLCBpMSwgcjIsIGkyXVxuICpcbiAqIFRoaXMgaXMgdGhlIGludmVyc2Ugb2Ygc3BsaXRSZWFsQW5kSW1hZ0FycmF5cy5cbiAqXG4gKiBAcGFyYW0gcmVhbCBUaGUgcmVhbCB2YWx1ZXMgb2YgdGhlIGNvbXBsZXggdGVuc29yIHZhbHVlcy5cbiAqIEBwYXJhbSBpbWFnIFRoZSBpbWFnIHZhbHVlcyBvZiB0aGUgY29tcGxleCB0ZW5zb3IgdmFsdWVzLlxuICogQHJldHVybnMgQSBjb21wbGV4IHRlbnNvciBhcyBhIEZsb2F0MzJBcnJheSB3aXRoIG1lcmdlZCB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVJlYWxBbmRJbWFnQXJyYXlzKHJlYWwsIGltYWcpIHtcbiAgICBpZiAocmVhbC5sZW5ndGggIT09IGltYWcubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IG1lcmdlIHJlYWwgYW5kIGltYWcgYXJyYXlzIG9mIGRpZmZlcmVudCBsZW5ndGhzLiByZWFsOmAgK1xuICAgICAgICAgICAgYCR7cmVhbC5sZW5ndGh9LCBpbWFnOiAke2ltYWcubGVuZ3RofS5gKTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IEZsb2F0MzJBcnJheShyZWFsLmxlbmd0aCAqIDIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgIHJlc3VsdFtpXSA9IHJlYWxbaSAvIDJdO1xuICAgICAgICByZXN1bHRbaSArIDFdID0gaW1hZ1tpIC8gMl07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIFNwbGl0cyBhIGNvbXBsZXggRmxvYXQzMkFycmF5IGludG8gcmVhbCBhbmQgaW1hZyBwYXJ0cy5cbiAqXG4gKiBUaGUgbWVtb3J5IGxheW91dCBpcyBpbnRlcmxlYXZlZCBhcyBmb2xsb3dzOlxuICogY29tcGxleDogW3IwLCBpMCwgcjEsIGkxLCByMiwgaTJdXG4gKiByZWFsOiBbcjAsIHIxLCByMl1cbiAqIGltYWc6IFtpMCwgaTEsIGkyXVxuICpcbiAqIFRoaXMgaXMgdGhlIGludmVyc2Ugb2YgbWVyZ2VSZWFsQW5kSW1hZ0FycmF5cy5cbiAqXG4gKiBAcGFyYW0gY29tcGxleCBUaGUgY29tcGxleCB0ZW5zb3IgdmFsdWVzLlxuICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggcmVhbCBhbmQgaW1hZyBGbG9hdDMyQXJyYXkgY29tcG9uZW50cyBvZiB0aGUgY29tcGxleFxuICogICAgIHRlbnNvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0UmVhbEFuZEltYWdBcnJheXMoY29tcGxleCkge1xuICAgIGNvbnN0IHJlYWwgPSBuZXcgRmxvYXQzMkFycmF5KGNvbXBsZXgubGVuZ3RoIC8gMik7XG4gICAgY29uc3QgaW1hZyA9IG5ldyBGbG9hdDMyQXJyYXkoY29tcGxleC5sZW5ndGggLyAyKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbXBsZXgubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgcmVhbFtpIC8gMl0gPSBjb21wbGV4W2ldO1xuICAgICAgICBpbWFnW2kgLyAyXSA9IGNvbXBsZXhbaSArIDFdO1xuICAgIH1cbiAgICByZXR1cm4geyByZWFsLCBpbWFnIH07XG59XG4vKipcbiAqIEV4dHJhY3RzIGV2ZW4gaW5kZXhlZCBjb21wbGV4IHZhbHVlcyBpbiB0aGUgZ2l2ZW4gYXJyYXkuXG4gKiBAcGFyYW0gY29tcGxleCBUaGUgY29tcGxleCB0ZW5zb3IgdmFsdWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wbGV4V2l0aEV2ZW5JbmRleChjb21wbGV4KSB7XG4gICAgY29uc3QgbGVuID0gTWF0aC5jZWlsKGNvbXBsZXgubGVuZ3RoIC8gNCk7XG4gICAgY29uc3QgcmVhbCA9IG5ldyBGbG9hdDMyQXJyYXkobGVuKTtcbiAgICBjb25zdCBpbWFnID0gbmV3IEZsb2F0MzJBcnJheShsZW4pO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tcGxleC5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgICByZWFsW01hdGguZmxvb3IoaSAvIDQpXSA9IGNvbXBsZXhbaV07XG4gICAgICAgIGltYWdbTWF0aC5mbG9vcihpIC8gNCldID0gY29tcGxleFtpICsgMV07XG4gICAgfVxuICAgIHJldHVybiB7IHJlYWwsIGltYWcgfTtcbn1cbi8qKlxuICogRXh0cmFjdHMgb2RkIGluZGV4ZWQgY29tcGxlIHZhbHVlcyBpbiB0aGUgZ2l2ZW4gYXJyYXkuXG4gKiBAcGFyYW0gY29tcGxleCBUaGUgY29tcGxleCB0ZW5zb3IgdmFsdWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wbGV4V2l0aE9kZEluZGV4KGNvbXBsZXgpIHtcbiAgICBjb25zdCBsZW4gPSBNYXRoLmZsb29yKGNvbXBsZXgubGVuZ3RoIC8gNCk7XG4gICAgY29uc3QgcmVhbCA9IG5ldyBGbG9hdDMyQXJyYXkobGVuKTtcbiAgICBjb25zdCBpbWFnID0gbmV3IEZsb2F0MzJBcnJheShsZW4pO1xuICAgIGZvciAobGV0IGkgPSAyOyBpIDwgY29tcGxleC5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgICByZWFsW01hdGguZmxvb3IoaSAvIDQpXSA9IGNvbXBsZXhbaV07XG4gICAgICAgIGltYWdbTWF0aC5mbG9vcihpIC8gNCldID0gY29tcGxleFtpICsgMV07XG4gICAgfVxuICAgIHJldHVybiB7IHJlYWwsIGltYWcgfTtcbn1cbi8qKlxuICogR2V0IHRoZSBtYXAgcmVwcmVzZW50aW5nIGEgY29tcGxleCB2YWx1ZSBpbiB0aGUgZ2l2ZW4gYXJyYXkuXG4gKiBAcGFyYW0gY29tcGxleCBUaGUgY29tcGxleCB0ZW5zb3IgdmFsdWVzLlxuICogQHBhcmFtIGluZGV4IEFuIGluZGV4IG9mIHRoZSB0YXJnZXQgY29tcGxleCB2YWx1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvbXBsZXhXaXRoSW5kZXgoY29tcGxleCwgaW5kZXgpIHtcbiAgICBjb25zdCByZWFsID0gY29tcGxleFtpbmRleCAqIDJdO1xuICAgIGNvbnN0IGltYWcgPSBjb21wbGV4W2luZGV4ICogMiArIDFdO1xuICAgIHJldHVybiB7IHJlYWwsIGltYWcgfTtcbn1cbi8qKlxuICogSW5zZXJ0IGEgZ2l2ZW4gY29tcGxleCB2YWx1ZSBpbnRvIHRoZSBUeXBlZEFycmF5LlxuICogQHBhcmFtIGRhdGEgVGhlIGFycmF5IGluIHdoaWNoIHRoZSBjb21wbGV4IHZhbHVlIGlzIGluc2VydGVkLlxuICogQHBhcmFtIGMgVGhlIGNvbXBsZXggdmFsdWUgdG8gYmUgaW5zZXJ0ZWQuXG4gKiBAcGFyYW0gaW5kZXggQW4gaW5kZXggb2YgdGhlIHRhcmdldCBjb21wbGV4IHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzaWduVG9UeXBlZEFycmF5KGRhdGEsIHJlYWwsIGltYWcsIGluZGV4KSB7XG4gICAgZGF0YVtpbmRleCAqIDJdID0gcmVhbDtcbiAgICBkYXRhW2luZGV4ICogMiArIDFdID0gaW1hZztcbn1cbi8qKlxuICogTWFrZSB0aGUgbGlzdCBvZiBleHBvbmVudCB0ZXJtcyB1c2VkIGJ5IEZGVC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4cG9uZW50cyhuLCBpbnZlcnNlKSB7XG4gICAgY29uc3QgcmVhbCA9IG5ldyBGbG9hdDMyQXJyYXkobiAvIDIpO1xuICAgIGNvbnN0IGltYWcgPSBuZXcgRmxvYXQzMkFycmF5KG4gLyAyKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGguY2VpbChuIC8gMik7IGkrKykge1xuICAgICAgICBjb25zdCB4ID0gKGludmVyc2UgPyAyIDogLTIpICogTWF0aC5QSSAqIChpIC8gbik7XG4gICAgICAgIHJlYWxbaV0gPSBNYXRoLmNvcyh4KTtcbiAgICAgICAgaW1hZ1tpXSA9IE1hdGguc2luKHgpO1xuICAgIH1cbiAgICByZXR1cm4geyByZWFsLCBpbWFnIH07XG59XG4vKipcbiAqIE1ha2UgdGhlIGV4cG9uZW50IHRlcm0gdXNlZCBieSBGRlQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHBvbmVudChrLCBuLCBpbnZlcnNlKSB7XG4gICAgY29uc3QgeCA9IChpbnZlcnNlID8gMiA6IC0yKSAqIE1hdGguUEkgKiAoayAvIG4pO1xuICAgIGNvbnN0IHJlYWwgPSBNYXRoLmNvcyh4KTtcbiAgICBjb25zdCBpbWFnID0gTWF0aC5zaW4oeCk7XG4gICAgcmV0dXJuIHsgcmVhbCwgaW1hZyB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29tcGxleF91dGlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWxfYmFzZSc7XG5jb25zdCBBUlJPVyA9ICctPic7XG5jb25zdCBBUlJPV19SRUdFWCA9IC8tPi9nO1xuY29uc3QgQ09NTUEgPSAnLCc7XG5jb25zdCBFTExJUFNJUyA9ICcuLi4nO1xuLyoqXG4gKiBQYXJzZSBhbiBlcXVhdGlvbiBmb3IgZWluc3VtLlxuICpcbiAqIEBwYXJhbSBlcXVhdGlvbiBUaGUgZWluc3VtIGVxdWF0aW9uIChlLmcuLCBcImlqLGprLT5pa1wiKS5cbiAqIEBwYXJhbSBudW1UZW5zb3JzIE51bWJlciBvZiB0ZW5zb3JzIHByb3ZpZGVkIGFsb25nIHdpdGggYGVxdWF0aW9uYC4gVXNlZCB0b1xuICogICBjaGVjayBtYXRjaGluZyBudW1iZXIgb2YgaW5wdXQgdGVuc29ycy5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCBjb25zaXN0aW5nIG9mIHRoZSBmb2xsb3dpbmcgZmllbGRzOlxuICogICAtIGFsbERpbXM6IGFsbCBkaW1lbnNpb24gbmFtZXMgYXMgc3RyaW5ncy5cbiAqICAgLSBzdW1tZWREaW1zOiBhIGxpc3Qgb2YgYWxsIGRpbWVuc2lvbnMgYmVpbmcgc3VtbWVkIG92ZXIsIGFzIGluZGljZXMgdG9cbiAqICAgICB0aGUgZWxlbWVudHMgb2YgYGFsbERpbXNgLlxuICogICAtIGlkRGltczogaW5kaWNlcyBvZiB0aGUgZGltZW5zaW9ucyBpbiBlYWNoIGlucHV0IHRlbnNvciwgYXMgaW5kaWNlcyB0b1xuICogICAgIHRoZSBlbGVtZW50cyBvZiBgYWxsRGltcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUVpbnN1bUVxdWF0aW9uKGVxdWF0aW9uLCBudW1UZW5zb3JzKSB7XG4gICAgZXF1YXRpb24gPSBlcXVhdGlvbi5yZXBsYWNlKC9cXHMvZywgJycpOyAvLyBSZW1vdmUgd2l0ZXNwYWNlIGluIGVxdWF0aW9uLlxuICAgIGNvbnN0IG51bUFycm93cyA9IChlcXVhdGlvbi5sZW5ndGggLSBlcXVhdGlvbi5yZXBsYWNlKEFSUk9XX1JFR0VYLCAnJykubGVuZ3RoKSAvXG4gICAgICAgIEFSUk9XLmxlbmd0aDtcbiAgICBpZiAobnVtQXJyb3dzIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VxdWF0aW9ucyB3aXRob3V0IGFuIGFycm93IGFyZSBub3Qgc3VwcG9ydGVkLicpO1xuICAgIH1cbiAgICBlbHNlIGlmIChudW1BcnJvd3MgPiAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXF1YXRpb24gbXVzdCBjb250YWluIGV4YWN0bHkgb25lIGFycm93IChcIiR7QVJST1d9XCIpLmApO1xuICAgIH1cbiAgICBjb25zdCBbaW5wdXRTdHJpbmcsIG91dHB1dFN0cmluZ10gPSBlcXVhdGlvbi5zcGxpdChBUlJPVyk7XG4gICAgYXNzZXJ0KGlucHV0U3RyaW5nLmluZGV4T2YoRUxMSVBTSVMpID09PSAtMSwgKCkgPT4gYFRoZSBlbGxpcHNpcyBub3RhdGlvbiAoXCIke0VMTElQU0lTfVwiKSBpcyBub3Qgc3VwcG9ydGVkIHlldC5gKTtcbiAgICBjb25zdCBpbnB1dFRlcm1zID0gaW5wdXRTdHJpbmcuc3BsaXQoQ09NTUEpO1xuICAgIGNvbnN0IG51bUlucHV0cyA9IGlucHV0VGVybXMubGVuZ3RoO1xuICAgIGlmIChudW1UZW5zb3JzICE9PSBudW1JbnB1dHMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke251bUlucHV0c30gaW5wdXQgdGVuc29ycywgcmVjZWl2ZWQgJHtudW1UZW5zb3JzfWApO1xuICAgIH1cbiAgICBpZiAobnVtSW5wdXRzID4gMikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N1cHBvcnQgZm9yIG1vcmUgdGhhbiAyIGlucHV0IHRlbnNvcnMgaXMgbm90IGltcGxlbWVudGVkIHlldC4nKTtcbiAgICB9XG4gICAgY29uc3QgYWxsRGltcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0cHV0U3RyaW5nLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IGRpbU5hbWUgPSBvdXRwdXRTdHJpbmdbaV07XG4gICAgICAgIGlmICghaW5wdXRUZXJtcy5zb21lKGlucHV0VGVybSA9PiBpbnB1dFRlcm0uaW5kZXhPZihkaW1OYW1lKSAhPT0gLTEpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE91dHB1dCBzdWJzY3JpcHRzIGNvbnRhaW4gdGhlIGxhYmVsICR7ZGltTmFtZX0gYCArXG4gICAgICAgICAgICAgICAgYG5vdCBwcmVzZW50IGluIHRoZSBpbnB1dCBzdWJzY3JpcHRzLmApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbGxEaW1zLmluZGV4T2YoZGltTmFtZSkgPT09IC0xKSB7XG4gICAgICAgICAgICBhbGxEaW1zLnB1c2goZGltTmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dFN0cmluZy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBkaW1OYW1lID0gaW5wdXRTdHJpbmdbaV07XG4gICAgICAgIGlmIChhbGxEaW1zLmluZGV4T2YoZGltTmFtZSkgPT09IC0xICYmIGRpbU5hbWUgIT09IENPTU1BKSB7XG4gICAgICAgICAgICBhbGxEaW1zLnB1c2goZGltTmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaWREaW1zID0gbmV3IEFycmF5KGlucHV0VGVybXMubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUlucHV0czsgKytpKSB7XG4gICAgICAgIGlmIChuZXcgU2V0KGlucHV0VGVybXNbaV0uc3BsaXQoJycpKS5zaXplICE9PSBpbnB1dFRlcm1zW2ldLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGb3VuZCBkdXBsaWNhdGUgYXhlcyBpbiBpbnB1dCBjb21wb25lbnQgJHtpbnB1dFRlcm1zW2ldfS4gYCArXG4gICAgICAgICAgICAgICAgYFN1cHBvcnQgZm9yIGR1cGxpY2F0ZSBheGVzIGluIGlucHV0IGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWREaW1zW2ldID0gW107XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaW5wdXRUZXJtc1tpXS5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgaWREaW1zW2ldLnB1c2goYWxsRGltcy5pbmRleE9mKGlucHV0VGVybXNbaV1bal0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBudW1EaW1zID0gYWxsRGltcy5sZW5ndGg7IC8vIE51bWJlciBvZiB1bmlxdWUgZGltZW5zaW9ucy5cbiAgICBjb25zdCBudW1PdXREaW1zID0gb3V0cHV0U3RyaW5nLmxlbmd0aDsgLy8gTnVtYmVyIG9mIG91dHB1dCBkaW1lbnNpb25zLlxuICAgIGNvbnN0IHN1bW1lZERpbXMgPSBbXTsgLy8gRGltZW5zaW9ucyBiZWluZyBzdW1tZWQgb3Zlci5cbiAgICBmb3IgKGxldCBpID0gbnVtT3V0RGltczsgaSA8IG51bURpbXM7ICsraSkge1xuICAgICAgICBzdW1tZWREaW1zLnB1c2goaSk7XG4gICAgfVxuICAgIHJldHVybiB7IGFsbERpbXMsIHN1bW1lZERpbXMsIGlkRGltcyB9O1xufVxuLyoqXG4gKiBHZXQgdGhlIHBlcm11dGF0aW9uIGZvciBhIGdpdmVuIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAcGFyYW0gbkRpbXMgVG90YWwgbnVtYmVyIG9mIGRpbWVuc2lvbiBvZiBhbGwgdGVuc29ycyBpbnZvbHZlZCBpbiB0aGUgZWluc3VtXG4gKiAgIG9wZXJhdGlvbi5cbiAqIEBwYXJhbSBpZERpbXMgRGltZW5zaW9uIGluZGljZXMgaW52b2x2ZSBpbiB0aGUgdGVuc29yIGluIHF1ZXN0aW9uLlxuICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnNpc3Rpbmcgb2YgdGhlIGZvbGxvd2luZyBmaWVsZHM6XG4gKiAgIC0gcGVybXV0YXRpb25JbmRpY2VzOiBJbmRpY2VzIHRvIHBlcm11dGUgdGhlIGF4ZXMgb2YgdGhlIHRlbnNvciB3aXRoLlxuICogICAtIGV4cGFuZERpbXM6IEluZGljZXMgdG8gdGhlIGRpbWVuc2lvbiB0aGF0IG5lZWQgdG8gYmUgZXhwYW5kZWQgZnJvbSB0aGVcbiAqICAgICB0ZW5zb3IgYWZ0ZXIgcGVybXV0YXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFaW5zdW1QZXJtdXRhdGlvbihuRGltcywgaWREaW1zKSB7XG4gICAgbGV0IHBlcm11dGF0aW9uSW5kaWNlcyA9IG5ldyBBcnJheShuRGltcyk7XG4gICAgcGVybXV0YXRpb25JbmRpY2VzLmZpbGwoLTEpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaWREaW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHBlcm11dGF0aW9uSW5kaWNlc1tpZERpbXNbaV1dID0gaTtcbiAgICB9XG4gICAgY29uc3QgZXhwYW5kRGltcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbkRpbXM7ICsraSkge1xuICAgICAgICBpZiAocGVybXV0YXRpb25JbmRpY2VzW2ldID09PSAtMSkge1xuICAgICAgICAgICAgZXhwYW5kRGltcy5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHBlcm11dGF0aW9uSW5kaWNlcyA9IHBlcm11dGF0aW9uSW5kaWNlcy5maWx0ZXIoZCA9PiBkICE9PSAtMSk7XG4gICAgcmV0dXJuIHsgcGVybXV0YXRpb25JbmRpY2VzLCBleHBhbmREaW1zIH07XG59XG4vKipcbiAqIENoZWNrcyB0aGF0IHRoZSBkaW1lbnNpb24gc2l6ZXMgZnJvbSBkaWZmZXJlbnQgaW5wdXQgdGVuc29ycyBtYXRjaCB0aGVcbiAqIGVxdWF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tFaW5zdW1EaW1TaXplcyhuRGltcywgaWREaW1zLCB0ZW5zb3JzKSB7XG4gICAgY29uc3QgZGltU2l6ZXMgPSBuZXcgQXJyYXkobkRpbXMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGVuc29ycy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBzaGFwZSA9IHRlbnNvcnNbaV0uc2hhcGU7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaWREaW1zW2ldLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICBpZiAoZGltU2l6ZXNbaWREaW1zW2ldW2pdXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZGltU2l6ZXNbaWREaW1zW2ldW2pdXSA9IHNoYXBlW2pdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KGRpbVNpemVzW2lkRGltc1tpXVtqXV0gPT09IHNoYXBlW2pdLCAoKSA9PiBgRXhwZWN0ZWQgZGltZW5zaW9uICR7ZGltU2l6ZXNbaWREaW1zW2ldW2pdXX0gYXQgYXhpcyAke2p9IGAgK1xuICAgICAgICAgICAgICAgICAgICBgb2YgaW5wdXQgc2hhcGVkICR7SlNPTi5zdHJpbmdpZnkoc2hhcGUpfSwgYCArXG4gICAgICAgICAgICAgICAgICAgIGBidXQgZ290IGRpbWVuc2lvbiAke3NoYXBlW2pdfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBHZXRzIHBhdGggb2YgY29tcHV0YXRpb24gZm9yIGVpbnN1bS5cbiAqXG4gKiBAcGFyYW0gc3VtbWVkRGltcyBpbmRpY2VzIHRvIHRoZSBkaW1lbnNpb25zIGJlaW5nIHN1bW1lZCBvdmVyLlxuICogQHBhcmFtIGlkRGltcyBBIGxvb2sgdXAgdGFibGUgZm9yIHRoZSBkaW1lbnNpb25zIHByZXNlbnQgaW4gZWFjaCBpbnB1dFxuICogICAgIHRlbnNvci4gRWFjaCBjb25zaXR1ZW50IGFycmF5IGNvbnRhaW5zIGluZGljZXMgZm9yIHRoZSBkaW1lbnNpb25zIGluIHRoZVxuICogICAgIGNvcnJlc3BvbmRpbmcgaW5wdXQgdGVuc29yLlxuICpcbiAqIEByZXR1cm4gQSBtYXAgd2l0aCB0d28gZmllbGRzOlxuICogICAtIHBhdGg6IFRoZSBwYXRoIG9mIGNvbXB1dGF0aW9uLCB3aXRoIGVhY2ggZWxlbWVudCBpbmRpY2F0aW5nIHRoZSBkaW1lbnNpb25cbiAqICAgICBiZWluZyBzdW1tZWQgb3ZlciBhZnRlciB0aGUgZWxlbWVudC13aXNlIG11bHRpcGxpY2F0aW9uIGluIHRoYXQgc3RlcC5cbiAqICAgLSBzdGVwczogV2l0aCB0aGUgc2FtZSBsZW5ndGggYXMgYHBhdGhgLiBFYWNoIGVsZW1lbnQgY29udGFpbnMgdGhlIGluZGljZXNcbiAqICAgICB0byB0aGUgaW5wdXQgdGVuc29ycyBiZWluZyB1c2VkIGZvciBlbGVtZW50LXdpc2UgbXVsdGlwbGljYXRpb24gaW4gdGhlXG4gKiAgICAgY29ycmVzcG9uZGluZyBzdGVwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWluc3VtQ29tcHV0ZVBhdGgoc3VtbWVkRGltcywgaWREaW1zKSB7XG4gICAgY29uc3QgcGF0aCA9IHN1bW1lZERpbXM7XG4gICAgY29uc3Qgc3RlcHMgPSBbXTtcbiAgICBsZXQgblN0ZXBzID0gMDtcbiAgICBpZiAoc3VtbWVkRGltcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gRWluc3VtIHRoYXQgaW52b2xlcyBubyBzdW1taW5nOiBlLmcuLCB0cmFuc3Bvc2UgYW5kIG91dGVyIHByb2R1Y3QuXG4gICAgICAgIHBhdGgucHVzaCgtMSk7XG4gICAgfVxuICAgIG5TdGVwcyA9IHN1bW1lZERpbXMubGVuZ3RoICsgMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5TdGVwczsgKytpKSB7XG4gICAgICAgIHN0ZXBzLnB1c2goW10pO1xuICAgIH1cbiAgICBjb25zdCBjb21wdXRlZFRlcm1JbmRpY2VzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IHN1bW1lZERpbSA9IHBhdGhbaV07XG4gICAgICAgIGNvbnN0IHRlcm1JbmRpY2VzID0gZmluZFRlcm1zV2l0aERpbShpZERpbXMsIHN1bW1lZERpbSk7XG4gICAgICAgIGZvciAoY29uc3QgdGVybUluZGV4IG9mIHRlcm1JbmRpY2VzKSB7XG4gICAgICAgICAgICBpZiAoY29tcHV0ZWRUZXJtSW5kaWNlcy5pbmRleE9mKHRlcm1JbmRleCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgc3RlcHNbaV0ucHVzaCh0ZXJtSW5kZXgpO1xuICAgICAgICAgICAgICAgIGNvbXB1dGVkVGVybUluZGljZXMucHVzaCh0ZXJtSW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IHBhdGgsIHN0ZXBzIH07XG59XG4vKiogRGV0ZXJtaW5lcyBpZiBhbiBheGVzIHBlcm11dGF0aW9uIGlzIHRoZSBpZGVudGl0eSBwZXJtdXRhdGlvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0lkZW50aXR5UGVybXV0YXRpb24ocGVybSkge1xuICAgIHJldHVybiBwZXJtLmV2ZXJ5KChkaW0sIGluZGV4KSA9PiBkaW0gPT09IGluZGV4KTtcbn1cbmZ1bmN0aW9uIGZpbmRUZXJtc1dpdGhEaW0oaWREaW1zLCBkaW0pIHtcbiAgICBjb25zdCB0ZXJtSW5kaWNlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaWREaW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmIChpZERpbXNbaV0ubGVuZ3RoID09PSAwIHx8IGlkRGltc1tpXS5pbmRleE9mKGRpbSkgIT09IC0xIHx8IGRpbSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRlcm1JbmRpY2VzLnB1c2goaSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRlcm1JbmRpY2VzO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZWluc3VtX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuZXhwb3J0IHsgbm9uTWF4U3VwcHJlc3Npb25WM0ltcGwsIG5vbk1heFN1cHByZXNzaW9uVjRJbXBsLCBub25NYXhTdXBwcmVzc2lvblY1SW1wbCB9IGZyb20gJy4vbm9uX21heF9zdXBwcmVzc2lvbl9pbXBsJztcbmV4cG9ydCB7IHdoZXJlSW1wbCB9IGZyb20gJy4vd2hlcmVfaW1wbCc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1rZXJuZWxfaW1wbHMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmluYXJ5SW5zZXJ0IH0gZnJvbSAnLi9ub25fbWF4X3N1cHByZXNzaW9uX3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIG5vbk1heFN1cHByZXNzaW9uVjNJbXBsKGJveGVzLCBzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQpIHtcbiAgICByZXR1cm4gbm9uTWF4U3VwcHJlc3Npb25JbXBsXyhib3hlcywgc2NvcmVzLCBtYXhPdXRwdXRTaXplLCBpb3VUaHJlc2hvbGQsIHNjb3JlVGhyZXNob2xkLCAwIC8qIHNvZnRObXNTaWdtYSAqLyk7XG59XG5leHBvcnQgZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25WNEltcGwoYm94ZXMsIHNjb3JlcywgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCwgcGFkVG9NYXhPdXRwdXRTaXplKSB7XG4gICAgcmV0dXJuIG5vbk1heFN1cHByZXNzaW9uSW1wbF8oYm94ZXMsIHNjb3JlcywgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCwgMCAvKiBzb2Z0Tm1zU2lnbWEgKi8sIGZhbHNlIC8qIHJldHVyblNjb3Jlc1RlbnNvciAqLywgcGFkVG9NYXhPdXRwdXRTaXplIC8qIHBhZFRvTWF4T3V0cHV0U2l6ZSAqLywgdHJ1ZVxuICAgIC8qIHJldHVyblZhbGlkT3V0cHV0cyAqLyApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG5vbk1heFN1cHByZXNzaW9uVjVJbXBsKGJveGVzLCBzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsIHNvZnRObXNTaWdtYSkge1xuICAgIHJldHVybiBub25NYXhTdXBwcmVzc2lvbkltcGxfKGJveGVzLCBzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsIHNvZnRObXNTaWdtYSwgdHJ1ZSAvKiByZXR1cm5TY29yZXNUZW5zb3IgKi8pO1xufVxuZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25JbXBsXyhib3hlcywgc2NvcmVzLCBtYXhPdXRwdXRTaXplLCBpb3VUaHJlc2hvbGQsIHNjb3JlVGhyZXNob2xkLCBzb2Z0Tm1zU2lnbWEsIHJldHVyblNjb3Jlc1RlbnNvciA9IGZhbHNlLCBwYWRUb01heE91dHB1dFNpemUgPSBmYWxzZSwgcmV0dXJuVmFsaWRPdXRwdXRzID0gZmFsc2UpIHtcbiAgICAvLyBUaGUgbGlzdCBpcyBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyLCBzbyB0aGF0IHdlIGNhbiBhbHdheXMgcG9wIHRoZVxuICAgIC8vIGNhbmRpZGF0ZSB3aXRoIHRoZSBsYXJnZXN0IHNjb3JlIGluIE8oMSkgdGltZS5cbiAgICBjb25zdCBjYW5kaWRhdGVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY29yZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHNjb3Jlc1tpXSA+IHNjb3JlVGhyZXNob2xkKSB7XG4gICAgICAgICAgICBjYW5kaWRhdGVzLnB1c2goeyBzY29yZTogc2NvcmVzW2ldLCBib3hJbmRleDogaSwgc3VwcHJlc3NCZWdpbkluZGV4OiAwIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhbmRpZGF0ZXMuc29ydChhc2NlbmRpbmdDb21wYXJhdG9yKTtcbiAgICAvLyBJZiBzb2Z0Tm1zU2lnbWEgaXMgMCwgdGhlIG91dGNvbWUgb2YgdGhpcyBhbGdvcml0aG0gaXMgZXhhY3RseSBzYW1lIGFzXG4gICAgLy8gYmVmb3JlLlxuICAgIGNvbnN0IHNjYWxlID0gc29mdE5tc1NpZ21hID4gMCA/ICgtMC41IC8gc29mdE5tc1NpZ21hKSA6IDAuMDtcbiAgICBjb25zdCBzZWxlY3RlZEluZGljZXMgPSBbXTtcbiAgICBjb25zdCBzZWxlY3RlZFNjb3JlcyA9IFtdO1xuICAgIHdoaWxlIChzZWxlY3RlZEluZGljZXMubGVuZ3RoIDwgbWF4T3V0cHV0U2l6ZSAmJiBjYW5kaWRhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gY2FuZGlkYXRlcy5wb3AoKTtcbiAgICAgICAgY29uc3QgeyBzY29yZTogb3JpZ2luYWxTY29yZSwgYm94SW5kZXgsIHN1cHByZXNzQmVnaW5JbmRleCB9ID0gY2FuZGlkYXRlO1xuICAgICAgICBpZiAob3JpZ2luYWxTY29yZSA8IHNjb3JlVGhyZXNob2xkKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLyBPdmVybGFwcGluZyBib3hlcyBhcmUgbGlrZWx5IHRvIGhhdmUgc2ltaWxhciBzY29yZXMsIHRoZXJlZm9yZSB3ZVxuICAgICAgICAvLyBpdGVyYXRlIHRocm91Z2ggdGhlIHByZXZpb3VzbHkgc2VsZWN0ZWQgYm94ZXMgYmFja3dhcmRzIGluIG9yZGVyIHRvXG4gICAgICAgIC8vIHNlZSBpZiBjYW5kaWRhdGUncyBzY29yZSBzaG91bGQgYmUgc3VwcHJlc3NlZC4gV2UgdXNlXG4gICAgICAgIC8vIHN1cHByZXNzQmVnaW5JbmRleCB0byB0cmFjayBhbmQgZW5zdXJlIGEgY2FuZGlkYXRlIGNhbiBiZSBzdXBwcmVzc2VkXG4gICAgICAgIC8vIGJ5IGEgc2VsZWN0ZWQgYm94IG5vIG1vcmUgdGhhbiBvbmNlLiBBbHNvLCBpZiB0aGUgb3ZlcmxhcCBleGNlZWRzXG4gICAgICAgIC8vIGlvdVRocmVzaG9sZCwgd2Ugc2ltcGx5IGlnbm9yZSB0aGUgY2FuZGlkYXRlLlxuICAgICAgICBsZXQgaWdub3JlQ2FuZGlkYXRlID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGogPSBzZWxlY3RlZEluZGljZXMubGVuZ3RoIC0gMTsgaiA+PSBzdXBwcmVzc0JlZ2luSW5kZXg7IC0taikge1xuICAgICAgICAgICAgY29uc3QgaW91ID0gaW50ZXJzZWN0aW9uT3ZlclVuaW9uKGJveGVzLCBib3hJbmRleCwgc2VsZWN0ZWRJbmRpY2VzW2pdKTtcbiAgICAgICAgICAgIGlmIChpb3UgPj0gaW91VGhyZXNob2xkKSB7XG4gICAgICAgICAgICAgICAgaWdub3JlQ2FuZGlkYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbmRpZGF0ZS5zY29yZSA9XG4gICAgICAgICAgICAgICAgY2FuZGlkYXRlLnNjb3JlICogc3VwcHJlc3NXZWlnaHQoaW91VGhyZXNob2xkLCBzY2FsZSwgaW91KTtcbiAgICAgICAgICAgIGlmIChjYW5kaWRhdGUuc2NvcmUgPD0gc2NvcmVUaHJlc2hvbGQpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCBpZiBgY2FuZGlkYXRlLnNjb3JlYCBoYXMgbm90IGRyb3BwZWQgYmVsb3dcbiAgICAgICAgLy8gYHNjb3JlVGhyZXNob2xkYCwgdGhlbiB3ZSBrbm93IHRoYXQgd2Ugd2VudCB0aHJvdWdoIGFsbCBvZiB0aGVcbiAgICAgICAgLy8gcHJldmlvdXMgc2VsZWN0aW9ucyBhbmQgY2FuIHNhZmVseSB1cGRhdGUgYHN1cHByZXNzQmVnaW5JbmRleGAgdG8gdGhlXG4gICAgICAgIC8vIGVuZCBvZiB0aGUgc2VsZWN0ZWQgYXJyYXkuIFRoZW4gd2UgY2FuIHJlLWluc2VydCB0aGUgY2FuZGlkYXRlIHdpdGhcbiAgICAgICAgLy8gdGhlIHVwZGF0ZWQgc2NvcmUgYW5kIHN1cHByZXNzQmVnaW5JbmRleCBiYWNrIGluIHRoZSBjYW5kaWRhdGUgbGlzdC5cbiAgICAgICAgLy8gSWYgb24gdGhlIG90aGVyIGhhbmQsIGBjYW5kaWRhdGUuc2NvcmVgIGhhcyBkcm9wcGVkIGJlbG93IHRoZSBzY29yZVxuICAgICAgICAvLyB0aHJlc2hvbGQsIHdlIHdpbGwgbm90IGFkZCBpdCBiYWNrIHRvIHRoZSBjYW5kaWRhdGVzIGxpc3QuXG4gICAgICAgIGNhbmRpZGF0ZS5zdXBwcmVzc0JlZ2luSW5kZXggPSBzZWxlY3RlZEluZGljZXMubGVuZ3RoO1xuICAgICAgICBpZiAoIWlnbm9yZUNhbmRpZGF0ZSkge1xuICAgICAgICAgICAgLy8gQ2FuZGlkYXRlIGhhcyBwYXNzZWQgYWxsIHRoZSB0ZXN0cywgYW5kIGlzIG5vdCBzdXBwcmVzc2VkLCBzb1xuICAgICAgICAgICAgLy8gc2VsZWN0IHRoZSBjYW5kaWRhdGUuXG4gICAgICAgICAgICBpZiAoY2FuZGlkYXRlLnNjb3JlID09PSBvcmlnaW5hbFNjb3JlKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRJbmRpY2VzLnB1c2goYm94SW5kZXgpO1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkU2NvcmVzLnB1c2goY2FuZGlkYXRlLnNjb3JlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNhbmRpZGF0ZS5zY29yZSA+IHNjb3JlVGhyZXNob2xkKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2FuZGlkYXRlJ3Mgc2NvcmUgaXMgc3VwcHJlc3NlZCBidXQgaXMgc3RpbGwgaGlnaCBlbm91Z2ggdG8gYmVcbiAgICAgICAgICAgICAgICAvLyBjb25zaWRlcmVkLCBzbyBhZGQgYmFjayB0byB0aGUgY2FuZGlkYXRlcyBsaXN0LlxuICAgICAgICAgICAgICAgIGJpbmFyeUluc2VydChjYW5kaWRhdGVzLCBjYW5kaWRhdGUsIGFzY2VuZGluZ0NvbXBhcmF0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIE5vbk1heFN1cHByZXNzaW9uVjQgZmVhdHVyZTogcGFkZGluZyBvdXRwdXQgdG8gbWF4T3V0cHV0U2l6ZS5cbiAgICBjb25zdCB2YWxpZE91dHB1dHMgPSBzZWxlY3RlZEluZGljZXMubGVuZ3RoO1xuICAgIGNvbnN0IGVsZW1zVG9QYWQgPSBtYXhPdXRwdXRTaXplIC0gdmFsaWRPdXRwdXRzO1xuICAgIGlmIChwYWRUb01heE91dHB1dFNpemUgJiYgZWxlbXNUb1BhZCA+IDApIHtcbiAgICAgICAgc2VsZWN0ZWRJbmRpY2VzLnB1c2goLi4ubmV3IEFycmF5KGVsZW1zVG9QYWQpLmZpbGwoMCkpO1xuICAgICAgICBzZWxlY3RlZFNjb3Jlcy5wdXNoKC4uLm5ldyBBcnJheShlbGVtc1RvUGFkKS5maWxsKDAuMCkpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSB7IHNlbGVjdGVkSW5kaWNlcyB9O1xuICAgIGlmIChyZXR1cm5TY29yZXNUZW5zb3IpIHtcbiAgICAgICAgcmVzdWx0WydzZWxlY3RlZFNjb3JlcyddID0gc2VsZWN0ZWRTY29yZXM7XG4gICAgfVxuICAgIGlmIChyZXR1cm5WYWxpZE91dHB1dHMpIHtcbiAgICAgICAgcmVzdWx0Wyd2YWxpZE91dHB1dHMnXSA9IHZhbGlkT3V0cHV0cztcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGludGVyc2VjdGlvbk92ZXJVbmlvbihib3hlcywgaSwgaikge1xuICAgIGNvbnN0IGlDb29yZCA9IGJveGVzLnN1YmFycmF5KGkgKiA0LCBpICogNCArIDQpO1xuICAgIGNvbnN0IGpDb29yZCA9IGJveGVzLnN1YmFycmF5KGogKiA0LCBqICogNCArIDQpO1xuICAgIGNvbnN0IHltaW5JID0gTWF0aC5taW4oaUNvb3JkWzBdLCBpQ29vcmRbMl0pO1xuICAgIGNvbnN0IHhtaW5JID0gTWF0aC5taW4oaUNvb3JkWzFdLCBpQ29vcmRbM10pO1xuICAgIGNvbnN0IHltYXhJID0gTWF0aC5tYXgoaUNvb3JkWzBdLCBpQ29vcmRbMl0pO1xuICAgIGNvbnN0IHhtYXhJID0gTWF0aC5tYXgoaUNvb3JkWzFdLCBpQ29vcmRbM10pO1xuICAgIGNvbnN0IHltaW5KID0gTWF0aC5taW4oakNvb3JkWzBdLCBqQ29vcmRbMl0pO1xuICAgIGNvbnN0IHhtaW5KID0gTWF0aC5taW4oakNvb3JkWzFdLCBqQ29vcmRbM10pO1xuICAgIGNvbnN0IHltYXhKID0gTWF0aC5tYXgoakNvb3JkWzBdLCBqQ29vcmRbMl0pO1xuICAgIGNvbnN0IHhtYXhKID0gTWF0aC5tYXgoakNvb3JkWzFdLCBqQ29vcmRbM10pO1xuICAgIGNvbnN0IGFyZWFJID0gKHltYXhJIC0geW1pbkkpICogKHhtYXhJIC0geG1pbkkpO1xuICAgIGNvbnN0IGFyZWFKID0gKHltYXhKIC0geW1pbkopICogKHhtYXhKIC0geG1pbkopO1xuICAgIGlmIChhcmVhSSA8PSAwIHx8IGFyZWFKIDw9IDApIHtcbiAgICAgICAgcmV0dXJuIDAuMDtcbiAgICB9XG4gICAgY29uc3QgaW50ZXJzZWN0aW9uWW1pbiA9IE1hdGgubWF4KHltaW5JLCB5bWluSik7XG4gICAgY29uc3QgaW50ZXJzZWN0aW9uWG1pbiA9IE1hdGgubWF4KHhtaW5JLCB4bWluSik7XG4gICAgY29uc3QgaW50ZXJzZWN0aW9uWW1heCA9IE1hdGgubWluKHltYXhJLCB5bWF4Sik7XG4gICAgY29uc3QgaW50ZXJzZWN0aW9uWG1heCA9IE1hdGgubWluKHhtYXhJLCB4bWF4Sik7XG4gICAgY29uc3QgaW50ZXJzZWN0aW9uQXJlYSA9IE1hdGgubWF4KGludGVyc2VjdGlvblltYXggLSBpbnRlcnNlY3Rpb25ZbWluLCAwLjApICpcbiAgICAgICAgTWF0aC5tYXgoaW50ZXJzZWN0aW9uWG1heCAtIGludGVyc2VjdGlvblhtaW4sIDAuMCk7XG4gICAgcmV0dXJuIGludGVyc2VjdGlvbkFyZWEgLyAoYXJlYUkgKyBhcmVhSiAtIGludGVyc2VjdGlvbkFyZWEpO1xufVxuLy8gQSBHYXVzc2lhbiBwZW5hbHR5IGZ1bmN0aW9uLCB0aGlzIG1ldGhvZCBhbHdheXMgcmV0dXJucyB2YWx1ZXMgaW4gWzAsIDFdLlxuLy8gVGhlIHdlaWdodCBpcyBhIGZ1bmN0aW9uIG9mIHNpbWlsYXJpdHksIHRoZSBtb3JlIG92ZXJsYXAgdHdvIGJveGVzIGFyZSwgdGhlXG4vLyBzbWFsbGVyIHRoZSB3ZWlnaHQgaXMsIG1lYW5pbmcgaGlnaGx5IG92ZXJsYXBwaW5nIGJveGUgd2lsbCBiZSBzaWduaWZpY2FudGx5XG4vLyBwZW5hbGl6ZWQuIE9uIHRoZSBvdGhlciBoYW5kLCBhIG5vbi1vdmVybGFwcGluZyBib3ggd2lsbCBub3QgYmUgcGVuYWxpemVkLlxuZnVuY3Rpb24gc3VwcHJlc3NXZWlnaHQoaW91VGhyZXNob2xkLCBzY2FsZSwgaW91KSB7XG4gICAgY29uc3Qgd2VpZ2h0ID0gTWF0aC5leHAoc2NhbGUgKiBpb3UgKiBpb3UpO1xuICAgIHJldHVybiBpb3UgPD0gaW91VGhyZXNob2xkID8gd2VpZ2h0IDogMC4wO1xufVxuZnVuY3Rpb24gYXNjZW5kaW5nQ29tcGFyYXRvcihjMSwgYzIpIHtcbiAgICAvLyBGb3Igb2JqZWN0cyB3aXRoIHNhbWUgc2NvcmVzLCB3ZSBtYWtlIHRoZSBvYmplY3Qgd2l0aCB0aGUgbGFyZ2VyIGluZGV4IGdvXG4gICAgLy8gZmlyc3QuIEluIGFuIGFycmF5IHRoYXQgcG9wcyBmcm9tIHRoZSBlbmQsIHRoaXMgbWVhbnMgdGhhdCB0aGUgb2JqZWN0IHdpdGhcbiAgICAvLyB0aGUgc21hbGxlciBpbmRleCB3aWxsIGJlIHBvcHBlZCBmaXJzdC4gVGhpcyBlbnN1cmVzIHRoZSBzYW1lIG91dHB1dCBhc1xuICAgIC8vIHRoZSBUZW5zb3JGbG93IHB5dGhvbiB2ZXJzaW9uLlxuICAgIHJldHVybiAoYzEuc2NvcmUgLSBjMi5zY29yZSkgfHxcbiAgICAgICAgKChjMS5zY29yZSA9PT0gYzIuc2NvcmUpICYmIChjMi5ib3hJbmRleCAtIGMxLmJveEluZGV4KSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ub25fbWF4X3N1cHByZXNzaW9uX2ltcGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLyoqXG4gKiBJbnNlcnRzIGEgdmFsdWUgaW50byBhIHNvcnRlZCBhcnJheS4gVGhpcyBtZXRob2QgYWxsb3dzIGR1cGxpY2F0ZSwgbWVhbmluZyBpdFxuICogYWxsb3dzIGluc2VydGluZyBkdXBsaWNhdGUgdmFsdWUsIGluIHdoaWNoIGNhc2UsIHRoZSBlbGVtZW50IHdpbGwgYmUgaW5zZXJ0ZWRcbiAqIGF0IHRoZSBsb3dlc3QgaW5kZXggb2YgdGhlIHZhbHVlLlxuICogQHBhcmFtIGFyciBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICogQHBhcmFtIGVsZW1lbnQgVGhlIGVsZW1lbnQgdG8gaW5zZXJ0LlxuICogQHBhcmFtIGNvbXBhcmF0b3IgT3B0aW9uYWwuIElmIG5vIGNvbXBhcmF0b3IgaXMgc3BlY2lmaWVkLCBlbGVtZW50cyBhcmVcbiAqIGNvbXBhcmVkIHVzaW5nIGFycmF5X3V0aWwuZGVmYXVsdENvbXBhcmF0b3IsIHdoaWNoIGlzIHN1aXRhYmxlIGZvciBTdHJpbmdzXG4gKiBhbmQgTnVtYmVycyBpbiBhc2NlbmRpbmcgYXJyYXlzLiBJZiB0aGUgYXJyYXkgY29udGFpbnMgbXVsdGlwbGUgaW5zdGFuY2VzIG9mXG4gKiB0aGUgdGFyZ2V0IHZhbHVlLCB0aGUgbGVmdC1tb3N0IGluc3RhbmNlIHdpbGwgYmUgcmV0dXJuZWQuIFRvIHByb3ZpZGUgYVxuICogY29tcGFyYXRvciwgaXQgc2hvdWxkIHRha2UgMiBhcmd1bWVudHMgdG8gY29tcGFyZSBhbmQgcmV0dXJuIGEgbmVnYXRpdmUsXG4gKiB6ZXJvLCBvciBhIHBvc2l0aXZlIG51bWJlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmFyeUluc2VydChhcnIsIGVsZW1lbnQsIGNvbXBhcmF0b3IpIHtcbiAgICBjb25zdCBpbmRleCA9IGJpbmFyeVNlYXJjaChhcnIsIGVsZW1lbnQsIGNvbXBhcmF0b3IpO1xuICAgIGNvbnN0IGluc2VydGlvblBvaW50ID0gaW5kZXggPCAwID8gLShpbmRleCArIDEpIDogaW5kZXg7XG4gICAgYXJyLnNwbGljZShpbnNlcnRpb25Qb2ludCwgMCwgZWxlbWVudCk7XG59XG4vKipcbiAqIFNlYXJjaGVzIHRoZSBhcnJheSBmb3IgdGhlIHRhcmdldCB1c2luZyBiaW5hcnkgc2VhcmNoLCByZXR1cm5zIHRoZSBpbmRleFxuICogb2YgdGhlIGZvdW5kIGVsZW1lbnQsIG9yIHBvc2l0aW9uIHRvIGluc2VydCBpZiBlbGVtZW50IG5vdCBmb3VuZC4gSWYgbm9cbiAqIGNvbXBhcmF0b3IgaXMgc3BlY2lmaWVkLCBlbGVtZW50cyBhcmUgY29tcGFyZWQgdXNpbmcgYXJyYXlfXG4gKiB1dGlsLmRlZmF1bHRDb21wYXJhdG9yLCB3aGljaCBpcyBzdWl0YWJsZSBmb3IgU3RyaW5ncyBhbmQgTnVtYmVycyBpblxuICogYXNjZW5kaW5nIGFycmF5cy4gSWYgdGhlIGFycmF5IGNvbnRhaW5zIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgdGFyZ2V0XG4gKiB2YWx1ZSwgdGhlIGxlZnQtbW9zdCBpbnN0YW5jZSB3aWxsIGJlIHJldHVybmVkLlxuICogQHBhcmFtIGFyciBUaGUgYXJyYXkgdG8gYmUgc2VhcmNoZWQgaW4uXG4gKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgdG8gYmUgc2VhcmNoZWQgZm9yLlxuICogQHBhcmFtIGNvbXBhcmF0b3IgU2hvdWxkIHRha2UgMiBhcmd1bWVudHMgdG8gY29tcGFyZSBhbmQgcmV0dXJuIGEgbmVnYXRpdmUsXG4gKiAgICB6ZXJvLCBvciBhIHBvc2l0aXZlIG51bWJlci5cbiAqIEByZXR1cm4gTG93ZXN0IGluZGV4IG9mIHRoZSB0YXJnZXQgdmFsdWUgaWYgZm91bmQsIG90aGVyd2lzZSB0aGUgaW5zZXJ0aW9uXG4gKiAgICBwb2ludCB3aGVyZSB0aGUgdGFyZ2V0IHNob3VsZCBiZSBpbnNlcnRlZCwgaW4gdGhlIGZvcm0gb2ZcbiAqICAgICgtaW5zZXJ0aW9uUG9pbnQgLSAxKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmFyeVNlYXJjaChhcnIsIHRhcmdldCwgY29tcGFyYXRvcikge1xuICAgIHJldHVybiBiaW5hcnlTZWFyY2hfKGFyciwgdGFyZ2V0LCBjb21wYXJhdG9yIHx8IGRlZmF1bHRDb21wYXJhdG9yKTtcbn1cbi8qKlxuICogQ29tcGFyZXMgaXRzIHR3byBhcmd1bWVudHMgZm9yIG9yZGVyLlxuICogQHBhcmFtIGEgVGhlIGZpcnN0IGVsZW1lbnQgdG8gYmUgY29tcGFyZWQuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIGVsZW1lbnQgdG8gYmUgY29tcGFyZWQuXG4gKiBAcmV0dXJuIEEgbmVnYXRpdmUgbnVtYmVyLCB6ZXJvLCBvciBhIHBvc2l0aXZlIG51bWJlciBhcyB0aGUgZmlyc3RcbiAqICAgICBhcmd1bWVudCBpcyBsZXNzIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIHNlY29uZC5cbiAqL1xuZnVuY3Rpb24gZGVmYXVsdENvbXBhcmF0b3IoYSwgYikge1xuICAgIHJldHVybiBhID4gYiA/IDEgOiBhIDwgYiA/IC0xIDogMDtcbn1cbmZ1bmN0aW9uIGJpbmFyeVNlYXJjaF8oYXJyLCB0YXJnZXQsIGNvbXBhcmF0b3IpIHtcbiAgICBsZXQgbGVmdCA9IDA7XG4gICAgbGV0IHJpZ2h0ID0gYXJyLmxlbmd0aDtcbiAgICBsZXQgbWlkZGxlID0gMDtcbiAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICB3aGlsZSAobGVmdCA8IHJpZ2h0KSB7XG4gICAgICAgIG1pZGRsZSA9IGxlZnQgKyAoKHJpZ2h0IC0gbGVmdCkgPj4+IDEpO1xuICAgICAgICBjb25zdCBjb21wYXJlUmVzdWx0ID0gY29tcGFyYXRvcih0YXJnZXQsIGFyclttaWRkbGVdKTtcbiAgICAgICAgaWYgKGNvbXBhcmVSZXN1bHQgPiAwKSB7XG4gICAgICAgICAgICBsZWZ0ID0gbWlkZGxlICsgMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJpZ2h0ID0gbWlkZGxlO1xuICAgICAgICAgICAgLy8gSWYgY29tcGFyZVJlc3VsdCBpcyAwLCB0aGUgdmFsdWUgaXMgZm91bmQuIFdlIHJlY29yZCBpdCBpcyBmb3VuZCxcbiAgICAgICAgICAgIC8vIGFuZCB0aGVuIGtlZXAgbG9va2luZyBiZWNhdXNlIHRoZXJlIG1heSBiZSBkdXBsaWNhdGUuXG4gICAgICAgICAgICBmb3VuZCA9ICFjb21wYXJlUmVzdWx0O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3VuZCA/IGxlZnQgOiAtbGVmdCAtIDE7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ub25fbWF4X3N1cHByZXNzaW9uX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLyoqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBXaGVyZSBrZXJuZWwgc2hhcmVkIGJldHdlZW4gY3B1IGFuZCB3ZWJnbCAqL1xuaW1wb3J0IHsgYnVmZmVyIH0gZnJvbSAnLi4vb3BzL2J1ZmZlcic7XG5leHBvcnQgZnVuY3Rpb24gd2hlcmVJbXBsKGNvbmRTaGFwZSwgY29uZFZhbHMpIHtcbiAgICBjb25zdCBpbmRpY2VzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25kVmFscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoY29uZFZhbHNbaV0pIHtcbiAgICAgICAgICAgIGluZGljZXMucHVzaChpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBpbkJ1ZmZlciA9IGJ1ZmZlcihjb25kU2hhcGUsICdpbnQzMicpO1xuICAgIGNvbnN0IG91dCA9IGJ1ZmZlcihbaW5kaWNlcy5sZW5ndGgsIGNvbmRTaGFwZS5sZW5ndGhdLCAnaW50MzInKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgbG9jID0gaW5CdWZmZXIuaW5kZXhUb0xvYyhpbmRpY2VzW2ldKTtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gaSAqIGNvbmRTaGFwZS5sZW5ndGg7XG4gICAgICAgIG91dC52YWx1ZXMuc2V0KGxvYywgb2Zmc2V0KTtcbiAgICB9XG4gICAgcmV0dXJuIG91dC50b1RlbnNvcigpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d2hlcmVfaW1wbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vLyBiYXNlLnRzIGlzIHRmanMtY29yZSB3aXRob3V0IGF1dG8gcmVnaXN0cmF0aW9uIG9mIHRoaW5ncyBsaWtlIGZsYWdzLFxuLy8gZ3JhZGllbnRzLCBjaGFpbmVkIG9wcyBvciB0aGUgb3BIYW5kbGVyLiBTZWUgYmFzZV9zaWRlX2VmZmVjdHMudHMgZm9yIHBhcnRzXG4vLyB0ZmpzIGNvcmUgdGhhdCBhcmUgcmVxdWlyZWQgc2lkZSBlZmZlY3RzLlxuLyoqXG4gKiBAZmlsZW92ZXJ2aWV3XG4gKiBAc3VwcHJlc3Mge3BhcnRpYWxBbGlhc30gT3B0aW1pemF0aW9uIGRpc2FibGVkIGR1ZSB0byBwYXNzaW5nIHRoZSBtb2R1bGVcbiAqIG9iamVjdCBpbnRvIGEgZnVuY3Rpb24gYmVsb3c6XG4gKlxuICogICBpbXBvcnQgKiBhcyBvcHMgZnJvbSAnLi9vcHMvb3BzJztcbiAqICAgc2V0T3BIYW5kbGVyKG9wcyk7XG4gKi9cbi8vIFNlcmlhbGl6YXRpb24uXG5pbXBvcnQgKiBhcyBpbyBmcm9tICcuL2lvL2lvJztcbmltcG9ydCAqIGFzIG1hdGggZnJvbSAnLi9tYXRoJztcbmltcG9ydCAqIGFzIGJyb3dzZXIgZnJvbSAnLi9vcHMvYnJvd3Nlcic7XG5pbXBvcnQgKiBhcyBnYXRoZXJfdXRpbCBmcm9tICcuL29wcy9nYXRoZXJfbmRfdXRpbCc7XG5pbXBvcnQgKiBhcyBzY2F0dGVyX3V0aWwgZnJvbSAnLi9vcHMvc2NhdHRlcl9uZF91dGlsJztcbmltcG9ydCAqIGFzIHNsaWNlX3V0aWwgZnJvbSAnLi9vcHMvc2xpY2VfdXRpbCc7XG5pbXBvcnQgKiBhcyBzZXJpYWxpemF0aW9uIGZyb20gJy4vc2VyaWFsaXphdGlvbic7XG5pbXBvcnQgKiBhcyB0ZW5zb3JfdXRpbCBmcm9tICcuL3RlbnNvcl91dGlsJztcbmltcG9ydCAqIGFzIHRlc3RfdXRpbCBmcm9tICcuL3Rlc3RfdXRpbCc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4vdXRpbCc7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi92ZXJzaW9uJztcbi8vIE9wdGltaXplcnMuXG5leHBvcnQgeyBBZGFkZWx0YU9wdGltaXplciB9IGZyb20gJy4vb3B0aW1pemVycy9hZGFkZWx0YV9vcHRpbWl6ZXInO1xuZXhwb3J0IHsgQWRhZ3JhZE9wdGltaXplciB9IGZyb20gJy4vb3B0aW1pemVycy9hZGFncmFkX29wdGltaXplcic7XG5leHBvcnQgeyBBZGFtT3B0aW1pemVyIH0gZnJvbSAnLi9vcHRpbWl6ZXJzL2FkYW1fb3B0aW1pemVyJztcbmV4cG9ydCB7IEFkYW1heE9wdGltaXplciB9IGZyb20gJy4vb3B0aW1pemVycy9hZGFtYXhfb3B0aW1pemVyJztcbmV4cG9ydCB7IE1vbWVudHVtT3B0aW1pemVyIH0gZnJvbSAnLi9vcHRpbWl6ZXJzL21vbWVudHVtX29wdGltaXplcic7XG5leHBvcnQgeyBPcHRpbWl6ZXIgfSBmcm9tICcuL29wdGltaXplcnMvb3B0aW1pemVyJztcbmV4cG9ydCB7IFJNU1Byb3BPcHRpbWl6ZXIgfSBmcm9tICcuL29wdGltaXplcnMvcm1zcHJvcF9vcHRpbWl6ZXInO1xuZXhwb3J0IHsgU0dET3B0aW1pemVyIH0gZnJvbSAnLi9vcHRpbWl6ZXJzL3NnZF9vcHRpbWl6ZXInO1xuZXhwb3J0IHsgVGVuc29yLCBUZW5zb3JCdWZmZXIsIFZhcmlhYmxlIH0gZnJvbSAnLi90ZW5zb3InO1xuZXhwb3J0IHsgUmFuaywgc3VtT3V0VHlwZSwgdXBjYXN0VHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9vcHMvb3BzJztcbmV4cG9ydCB7IFJlZHVjdGlvbiB9IGZyb20gJy4vb3BzL2xvc3Nfb3BzX3V0aWxzJztcbmV4cG9ydCAqIGZyb20gJy4vdHJhaW4nO1xuZXhwb3J0ICogZnJvbSAnLi9nbG9iYWxzJztcbmV4cG9ydCAqIGZyb20gJy4va2VybmVsX3JlZ2lzdHJ5JztcbmV4cG9ydCB7IGN1c3RvbUdyYWQsIGdyYWQsIGdyYWRzLCB2YWx1ZUFuZEdyYWQsIHZhbHVlQW5kR3JhZHMsIHZhcmlhYmxlR3JhZHMgfSBmcm9tICcuL2dyYWRpZW50cyc7XG5leHBvcnQgeyBFbnZpcm9ubWVudCwgZW52LCBFTlYgfSBmcm9tICcuL2Vudmlyb25tZW50JztcbmV4cG9ydCB7IHZlcnNpb24gYXMgdmVyc2lvbl9jb3JlIH07XG4vLyBUb3AtbGV2ZWwgbWV0aG9kIGV4cG9ydHMuXG5leHBvcnQgeyBuZXh0RnJhbWUgfSBmcm9tICcuL2Jyb3dzZXJfdXRpbCc7XG4vLyBTZWNvbmQgbGV2ZWwgZXhwb3J0cy5cbmltcG9ydCAqIGFzIGJhY2tlbmRfdXRpbCBmcm9tICcuL2JhY2tlbmRzL2JhY2tlbmRfdXRpbCc7XG5pbXBvcnQgKiBhcyBkZXZpY2VfdXRpbCBmcm9tICcuL2RldmljZV91dGlsJztcbmV4cG9ydCB7IGJyb3dzZXIsIGlvLCBtYXRoLCBzZXJpYWxpemF0aW9uLCB0ZXN0X3V0aWwsIHV0aWwsIGJhY2tlbmRfdXRpbCwgdGVuc29yX3V0aWwsIHNsaWNlX3V0aWwsIGdhdGhlcl91dGlsLCBzY2F0dGVyX3V0aWwsIGRldmljZV91dGlsIH07XG5pbXBvcnQgKiBhcyBrZXJuZWxfaW1wbHMgZnJvbSAnLi9iYWNrZW5kcy9rZXJuZWxfaW1wbHMnO1xuZXhwb3J0IHsga2VybmVsX2ltcGxzIH07XG4vLyBCYWNrZW5kIHNwZWNpZmljLlxuZXhwb3J0IHsgS2VybmVsQmFja2VuZCwgRGF0YVN0b3JhZ2UgfSBmcm9tICcuL2JhY2tlbmRzL2JhY2tlbmQnO1xuLy8gRXhwb3J0IGFsbCBrZXJuZWwgbmFtZXMgLyBpbmZvLlxuZXhwb3J0ICogZnJvbSAnLi9rZXJuZWxfbmFtZXMnO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmFzZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vLyBSZXF1aXJlZCBzaWRlIGVmZmVjdGZ1bCBjb2RlIGZvciB0ZmpzLWNvcmVcbi8vIFNldCB1cCBFbmdpbmUgYW5kIEVOVlxuaW1wb3J0IHsgZ2V0T3JNYWtlRW5naW5lIH0gZnJvbSAnLi9lbmdpbmUnO1xuZ2V0T3JNYWtlRW5naW5lKCk7XG4vLyBSZWdpc3RlciBiYWNrZW5kLWFnbm9zdGljIGZsYWdzLlxuaW1wb3J0ICcuL2ZsYWdzJztcbi8vIFJlZ2lzdGVyIHBsYXRmb3Jtc1xuaW1wb3J0ICcuL3BsYXRmb3Jtcy9wbGF0Zm9ybV9icm93c2VyJztcbmltcG9ydCAnLi9wbGF0Zm9ybXMvcGxhdGZvcm1fbm9kZSc7XG4vLyBTZXQgdXAgT3BIYW5kbGVyXG5pbXBvcnQgeyBidWZmZXIgfSBmcm9tICcuL29wcy9idWZmZXInO1xuaW1wb3J0IHsgY2FzdCB9IGZyb20gJy4vb3BzL2Nhc3QnO1xuaW1wb3J0IHsgY2xvbmUgfSBmcm9tICcuL29wcy9jbG9uZSc7XG5pbXBvcnQgeyBwcmludCB9IGZyb20gJy4vb3BzL3ByaW50JztcbmltcG9ydCB7IHNldE9wSGFuZGxlciB9IGZyb20gJy4vdGVuc29yJztcbmNvbnN0IG9wSGFuZGxlciA9IHtcbiAgICBidWZmZXIsXG4gICAgY2FzdCxcbiAgICBjbG9uZSxcbiAgICBwcmludFxufTtcbnNldE9wSGFuZGxlcihvcEhhbmRsZXIpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmFzZV9zaWRlX2VmZmVjdHMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuY29uc3QgZGVsYXlDYWxsYmFjayA9ICgoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiByZXF1ZXN0QW5pbWF0aW9uRnJhbWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBzZXRJbW1lZGlhdGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBzZXRJbW1lZGlhdGU7XG4gICAgfVxuICAgIHJldHVybiAoZikgPT4gZigpOyAvLyBubyBkZWxheXNcbn0pKCk7XG4vKipcbiAqIFJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZSB3aGVuIGEgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIGhhcyBjb21wbGV0ZWQuXG4gKlxuICogT24gTm9kZS5qcyB0aGlzIHVzZXMgc2V0SW1tZWRpYXRlIGluc3RlYWQgb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lLlxuICpcbiAqIFRoaXMgaXMgc2ltcGx5IGEgc3VnYXIgbWV0aG9kIHNvIHRoYXQgdXNlcnMgY2FuIGRvIHRoZSBmb2xsb3dpbmc6XG4gKiBgYXdhaXQgdGYubmV4dEZyYW1lKCk7YFxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdQZXJmb3JtYW5jZScsIHN1YmhlYWRpbmc6ICdUaW1pbmcnfVxuICovXG5mdW5jdGlvbiBuZXh0RnJhbWUoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gZGVsYXlDYWxsYmFjaygoKSA9PiByZXNvbHZlKCkpKTtcbn1cbmV4cG9ydCB7IG5leHRGcmFtZSB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YnJvd3Nlcl91dGlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbmZ1bmN0aW9uIF9pc05hdmlnYXRvckRlZmluZWQoKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvciAhPSBudWxsO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTW9iaWxlKG5hdikge1xuICAgIGlmIChuYXYgfHwgX2lzTmF2aWdhdG9yRGVmaW5lZCgpKSB7XG4gICAgICAgIGlmICghbmF2KSB7XG4gICAgICAgICAgICBuYXYgPSBuYXZpZ2F0b3I7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hdi5wcm9kdWN0ID09PSAnUmVhY3ROYXRpdmUnKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgICAgIGNvbnN0IGEgPSBuYXYudXNlckFnZW50IHx8IG5hdi52ZW5kb3IgfHwgd2luZG93Lm9wZXJhO1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgIHJldHVybiAvKGFuZHJvaWR8YmJcXGQrfG1lZWdvKS4rbW9iaWxlfGF2YW50Z298YmFkYVxcL3xibGFja2JlcnJ5fGJsYXplcnxjb21wYWx8ZWxhaW5lfGZlbm5lY3xoaXB0b3B8aWVtb2JpbGV8aXAoaG9uZXxvZCl8aXJpc3xraW5kbGV8bGdlIHxtYWVtb3xtaWRwfG1tcHxtb2JpbGUuK2ZpcmVmb3h8bmV0ZnJvbnR8b3BlcmEgbShvYnxpbilpfHBhbG0oIG9zKT98cGhvbmV8cChpeGl8cmUpXFwvfHBsdWNrZXJ8cG9ja2V0fHBzcHxzZXJpZXMoNHw2KTB8c3ltYmlhbnx0cmVvfHVwXFwuKGJyb3dzZXJ8bGluayl8dm9kYWZvbmV8d2FwfHdpbmRvd3MgY2V8eGRhfHhpaW5vL2lcbiAgICAgICAgICAgIC50ZXN0KGEpIHx8XG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgICAgICAvMTIwN3w2MzEwfDY1OTB8M2dzb3w0dGhwfDUwWzEtNl1pfDc3MHN8ODAyc3xhIHdhfGFiYWN8YWMoZXJ8b298c1xcLSl8YWkoa298cm4pfGFsKGF2fGNhfGNvKXxhbW9pfGFuKGV4fG55fHl3KXxhcHR1fGFyKGNofGdvKXxhcyh0ZXx1cyl8YXR0d3xhdShkaXxcXC1tfHIgfHMgKXxhdmFufGJlKGNrfGxsfG5xKXxiaShsYnxyZCl8YmwoYWN8YXopfGJyKGV8dil3fGJ1bWJ8YndcXC0obnx1KXxjNTVcXC98Y2FwaXxjY3dhfGNkbVxcLXxjZWxsfGNodG18Y2xkY3xjbWRcXC18Y28obXB8bmQpfGNyYXd8ZGEoaXR8bGx8bmcpfGRidGV8ZGNcXC1zfGRldml8ZGljYXxkbW9ifGRvKGN8cClvfGRzKDEyfFxcLWQpfGVsKDQ5fGFpKXxlbShsMnx1bCl8ZXIoaWN8azApfGVzbDh8ZXooWzQtN10wfG9zfHdhfHplKXxmZXRjfGZseShcXC18Xyl8ZzEgdXxnNTYwfGdlbmV8Z2ZcXC01fGdcXC1tb3xnbyhcXC53fG9kKXxncihhZHx1bil8aGFpZXxoY2l0fGhkXFwtKG18cHx0KXxoZWlcXC18aGkocHR8dGEpfGhwKCBpfGlwKXxoc1xcLWN8aHQoYyhcXC18IHxffGF8Z3xwfHN8dCl8dHApfGh1KGF3fHRjKXxpXFwtKDIwfGdvfG1hKXxpMjMwfGlhYyggfFxcLXxcXC8pfGlicm98aWRlYXxpZzAxfGlrb218aW0xa3xpbm5vfGlwYXF8aXJpc3xqYSh0fHYpYXxqYnJvfGplbXV8amlnc3xrZGRpfGtlaml8a2d0KCB8XFwvKXxrbG9ufGtwdCB8a3djXFwtfGt5byhjfGspfGxlKG5vfHhpKXxsZyggZ3xcXC8oa3xsfHUpfDUwfDU0fFxcLVthLXddKXxsaWJ3fGx5bnh8bTFcXC13fG0zZ2F8bTUwXFwvfG1hKHRlfHVpfHhvKXxtYygwMXwyMXxjYSl8bVxcLWNyfG1lKHJjfHJpKXxtaShvOHxvYXx0cyl8bW1lZnxtbygwMXwwMnxiaXxkZXxkb3x0KFxcLXwgfG98dil8enopfG10KDUwfHAxfHYgKXxtd2JwfG15d2F8bjEwWzAtMl18bjIwWzItM118bjMwKDB8Mil8bjUwKDB8Mnw1KXxuNygwKDB8MSl8MTApfG5lKChjfG0pXFwtfG9ufHRmfHdmfHdnfHd0KXxub2soNnxpKXxuenBofG8yaW18b3AodGl8d3YpfG9yYW58b3dnMXxwODAwfHBhbihhfGR8dCl8cGR4Z3xwZygxM3xcXC0oWzEtOF18YykpfHBoaWx8cGlyZXxwbChheXx1Yyl8cG5cXC0yfHBvKGNrfHJ0fHNlKXxwcm94fHBzaW98cHRcXC1nfHFhXFwtYXxxYygwN3wxMnwyMXwzMnw2MHxcXC1bMi03XXxpXFwtKXxxdGVrfHIzODB8cjYwMHxyYWtzfHJpbTl8cm8odmV8em8pfHM1NVxcL3xzYShnZXxtYXxtbXxtc3xueXx2YSl8c2MoMDF8aFxcLXxvb3xwXFwtKXxzZGtcXC98c2UoYyhcXC18MHwxKXw0N3xtY3xuZHxyaSl8c2doXFwtfHNoYXJ8c2llKFxcLXxtKXxza1xcLTB8c2woNDV8aWQpfHNtKGFsfGFyfGIzfGl0fHQ1KXxzbyhmdHxueSl8c3AoMDF8aFxcLXx2XFwtfHYgKXxzeSgwMXxtYil8dDIoMTh8NTApfHQ2KDAwfDEwfDE4KXx0YShndHxsayl8dGNsXFwtfHRkZ1xcLXx0ZWwoaXxtKXx0aW1cXC18dFxcLW1vfHRvKHBsfHNoKXx0cyg3MHxtXFwtfG0zfG01KXx0eFxcLTl8dXAoXFwuYnxnMXxzaSl8dXRzdHx2NDAwfHY3NTB8dmVyaXx2aShyZ3x0ZSl8dmsoNDB8NVswLTNdfFxcLXYpfHZtNDB8dm9kYXx2dWxjfHZ4KDUyfDUzfDYwfDYxfDcwfDgwfDgxfDgzfDg1fDk4KXx3M2MoXFwtfCApfHdlYmN8d2hpdHx3aShnIHxuY3xudyl8d21sYnx3b251fHg3MDB8eWFzXFwtfHlvdXJ8emV0b3x6dGVcXC0vaVxuICAgICAgICAgICAgICAgIC50ZXN0KGEuc3Vic3RyKDAsIDQpKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQnJvd3NlcigpIHtcbiAgICByZXR1cm4gKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5kb2N1bWVudCAhPSBudWxsKSB8fFxuICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgKHR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZSAhPT0gJ3VuZGVmaW5lZCcpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGV2aWNlX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgS2VybmVsQmFja2VuZCB9IGZyb20gJy4vYmFja2VuZHMvYmFja2VuZCc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudCwgc2V0RW52aXJvbm1lbnRHbG9iYWwgfSBmcm9tICcuL2Vudmlyb25tZW50JztcbmltcG9ydCB7IGdldEdsb2JhbE5hbWVzcGFjZSB9IGZyb20gJy4vZ2xvYmFsX3V0aWwnO1xuaW1wb3J0IHsgQWRkLCBDYXN0LCBJZGVudGl0eSB9IGZyb20gJy4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGdldEdyYWRpZW50LCBnZXRLZXJuZWwsIGdldEtlcm5lbHNGb3JCYWNrZW5kIH0gZnJvbSAnLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHsgUHJvZmlsZXIgfSBmcm9tICcuL3Byb2ZpbGVyJztcbmltcG9ydCB7IGJhY2twcm9wYWdhdGVHcmFkaWVudHMsIGdldEZpbHRlcmVkTm9kZXNYVG9ZIH0gZnJvbSAnLi90YXBlJztcbmltcG9ydCB7IHNldFRlbnNvclRyYWNrZXIsIFRlbnNvciwgVmFyaWFibGUgfSBmcm9tICcuL3RlbnNvcic7XG5pbXBvcnQgeyBnZXRUZW5zb3JzSW5Db250YWluZXIgfSBmcm9tICcuL3RlbnNvcl91dGlsJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi91dGlsJztcbmltcG9ydCB7IGJ5dGVzRnJvbVN0cmluZ0FycmF5LCBtYWtlT25lc1R5cGVkQXJyYXksIG5vdywgc2l6ZUZyb21TaGFwZSB9IGZyb20gJy4vdXRpbCc7XG5mdW5jdGlvbiBpc1JlZ2lzdGVyZWRLZXJuZWxJbnZvY2F0aW9uKGtlcm5lbEludm9jYXRpb24pIHtcbiAgICByZXR1cm4ga2VybmVsSW52b2NhdGlvbi5rZXJuZWxOYW1lICE9IG51bGw7XG59XG5jbGFzcyBFbmdpbmVTdGF0ZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8vIFB1YmxpYyBzaW5jZSBvcHRpbWl6ZXJzIHdpbGwgdXNlIGl0LlxuICAgICAgICB0aGlzLnJlZ2lzdGVyZWRWYXJpYWJsZXMgPSB7fTtcbiAgICAgICAgdGhpcy5uZXh0VGFwZU5vZGVJZCA9IDA7XG4gICAgICAgIHRoaXMubnVtQnl0ZXMgPSAwO1xuICAgICAgICB0aGlzLm51bVRlbnNvcnMgPSAwO1xuICAgICAgICB0aGlzLm51bVN0cmluZ1RlbnNvcnMgPSAwO1xuICAgICAgICB0aGlzLm51bURhdGFCdWZmZXJzID0gMDtcbiAgICAgICAgLy8gTnVtYmVyIG9mIG5lc3RlZCB0Zi5ncmFkKCkgc3RhdGVtZW50cyB3aGVuIGNvbXB1dGluZyBoaWdoZXItb3JkZXJcbiAgICAgICAgLy8gZ3JhZGllbnRzLiBFLmcuIGAxYCBmb3IgZmlyc3Qtb3JkZXIgZ3JhZGllbnRzIGFuZCBgMmAgZm9yIHNlY29uZC1vcmRlclxuICAgICAgICAvLyBncmFkaWVudHMuIFVzZWQgdG8gdHJhY2sgaWYgdGhlIHRhcGUgc2hvdWxkIGJlIHJlbW92ZWQgYWZ0ZXIgYSBiYWNrcHJvcC5cbiAgICAgICAgdGhpcy5ncmFkaWVudERlcHRoID0gMDtcbiAgICAgICAgLy8gTnVtYmVyIG9mIG5lc3RlZCBrZXJuZWwgY2FsbHMuIFdoZW4ga2VybmVsIGRlcHRoIGlzIGdyZWF0ZXIgdGhhbiAxLCB3ZSB0dXJuXG4gICAgICAgIC8vIG9mZiB0aGUgdGFwZS5cbiAgICAgICAgdGhpcy5rZXJuZWxEZXB0aCA9IDA7XG4gICAgICAgIHRoaXMuc2NvcGVTdGFjayA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogS2VlcHMgdHJhY2sgb2YgdGhlIG51bWJlciBvZiBkYXRhIG1vdmVzIGR1cmluZyBhIGtlcm5lbCBleGVjdXRpb24uIFdlXG4gICAgICAgICAqIG1haW50YWluIGEgc3RhY2sgc2luY2Uga2VybmVscyBjYW4gY2FsbCBvdGhlciBrZXJuZWxzLCByZWN1cnNpdmVseS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubnVtRGF0YU1vdmVzU3RhY2sgPSBbXTtcbiAgICAgICAgdGhpcy5uZXh0U2NvcGVJZCA9IDA7XG4gICAgICAgIHRoaXMudGVuc29ySW5mbyA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIHRoaXMucHJvZmlsaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYWN0aXZlUHJvZmlsZSA9IHtcbiAgICAgICAgICAgIG5ld0J5dGVzOiAwLFxuICAgICAgICAgICAgbmV3VGVuc29yczogMCxcbiAgICAgICAgICAgIHBlYWtCeXRlczogMCxcbiAgICAgICAgICAgIGtlcm5lbHM6IFtdLFxuICAgICAgICAgICAgcmVzdWx0OiBudWxsLFxuICAgICAgICAgICAgZ2V0IGtlcm5lbE5hbWVzKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQodGhpcy5rZXJuZWxzLm1hcChrID0+IGsubmFtZSkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgZm9yIChjb25zdCB2YXJpYWJsZU5hbWUgaW4gdGhpcy5yZWdpc3RlcmVkVmFyaWFibGVzKSB7XG4gICAgICAgICAgICB0aGlzLnJlZ2lzdGVyZWRWYXJpYWJsZXNbdmFyaWFibGVOYW1lXS5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgY2xhc3MgRW5naW5lIHtcbiAgICBjb25zdHJ1Y3RvcihFTlYpIHtcbiAgICAgICAgdGhpcy5FTlYgPSBFTlY7XG4gICAgICAgIHRoaXMucmVnaXN0cnkgPSB7fTtcbiAgICAgICAgdGhpcy5yZWdpc3RyeUZhY3RvcnkgPSB7fTtcbiAgICAgICAgdGhpcy5wZW5kaW5nQmFja2VuZEluaXRJZCA9IDA7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBuZXcgRW5naW5lU3RhdGUoKTtcbiAgICB9XG4gICAgYXN5bmMgcmVhZHkoKSB7XG4gICAgICAgIGlmICh0aGlzLnBlbmRpbmdCYWNrZW5kSW5pdCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wZW5kaW5nQmFja2VuZEluaXQudGhlbigoKSA9PiB7IH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmJhY2tlbmRJbnN0YW5jZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc29ydGVkQmFja2VuZHMgPSB0aGlzLmdldFNvcnRlZEJhY2tlbmRzKCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc29ydGVkQmFja2VuZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGJhY2tlbmROYW1lID0gc29ydGVkQmFja2VuZHNbaV07XG4gICAgICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgdGhpcy5pbml0aWFsaXplQmFja2VuZChiYWNrZW5kTmFtZSkuc3VjY2VzcztcbiAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRCYWNrZW5kKGJhY2tlbmROYW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgaW5pdGlhbGl6ZSBhbnkgYmFja2VuZHMsIGFsbCBiYWNrZW5kIGluaXRpYWxpemF0aW9ucyBgICtcbiAgICAgICAgICAgIGBmYWlsZWQuYCk7XG4gICAgfVxuICAgIGdldCBiYWNrZW5kKCkge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nQmFja2VuZEluaXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCYWNrZW5kICcke3RoaXMuYmFja2VuZE5hbWV9JyBoYXMgbm90IHlldCBiZWVuIGluaXRpYWxpemVkLiBNYWtlIGAgK1xuICAgICAgICAgICAgICAgIGBzdXJlIHRvIGF3YWl0IHRmLnJlYWR5KCkgb3IgYXdhaXQgdGYuc2V0QmFja2VuZCgpIGJlZm9yZSBjYWxsaW5nIGAgK1xuICAgICAgICAgICAgICAgIGBvdGhlciBtZXRob2RzYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYmFja2VuZEluc3RhbmNlID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgbmFtZSwgYXN5bmNJbml0IH0gPSB0aGlzLmluaXRpYWxpemVCYWNrZW5kc0FuZFJldHVybkJlc3QoKTtcbiAgICAgICAgICAgIGlmIChhc3luY0luaXQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBoaWdoZXN0IHByaW9yaXR5IGJhY2tlbmQgJyR7bmFtZX0nIGhhcyBub3QgeWV0IGJlZW4gYCArXG4gICAgICAgICAgICAgICAgICAgIGBpbml0aWFsaXplZC4gTWFrZSBzdXJlIHRvIGF3YWl0IHRmLnJlYWR5KCkgb3IgYCArXG4gICAgICAgICAgICAgICAgICAgIGBhd2FpdCB0Zi5zZXRCYWNrZW5kKCkgYmVmb3JlIGNhbGxpbmcgb3RoZXIgbWV0aG9kc2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZXRCYWNrZW5kKG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmJhY2tlbmRJbnN0YW5jZTtcbiAgICB9XG4gICAgYmFja2VuZE5hbWVzKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5yZWdpc3RyeUZhY3RvcnkpO1xuICAgIH1cbiAgICBmaW5kQmFja2VuZChiYWNrZW5kTmFtZSkge1xuICAgICAgICBpZiAoIShiYWNrZW5kTmFtZSBpbiB0aGlzLnJlZ2lzdHJ5KSkge1xuICAgICAgICAgICAgLy8gSWYgdGhlIGJhY2tlbmQgaGFzbid0IGJlZW4gaW5pdGlhbGl6ZWQgYnV0IHdlIGhhdmUgYSByZWdpc3RyeSBlbnRyeSBmb3JcbiAgICAgICAgICAgIC8vIGl0LCBpbml0aWFsaXplIGl0IGFuZCByZXR1cm4gaXQuXG4gICAgICAgICAgICBpZiAoYmFja2VuZE5hbWUgaW4gdGhpcy5yZWdpc3RyeUZhY3RvcnkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGFzeW5jSW5pdCB9ID0gdGhpcy5pbml0aWFsaXplQmFja2VuZChiYWNrZW5kTmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGFzeW5jSW5pdCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBCYWNrZW5kIGlzIG5vdCByZWFkeSB5ZXQuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5W2JhY2tlbmROYW1lXTtcbiAgICB9XG4gICAgZmluZEJhY2tlbmRGYWN0b3J5KGJhY2tlbmROYW1lKSB7XG4gICAgICAgIGlmICghKGJhY2tlbmROYW1lIGluIHRoaXMucmVnaXN0cnlGYWN0b3J5KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucmVnaXN0cnlGYWN0b3J5W2JhY2tlbmROYW1lXS5mYWN0b3J5O1xuICAgIH1cbiAgICByZWdpc3RlckJhY2tlbmQoYmFja2VuZE5hbWUsIGZhY3RvcnksIHByaW9yaXR5ID0gMSkge1xuICAgICAgICBpZiAoYmFja2VuZE5hbWUgaW4gdGhpcy5yZWdpc3RyeUZhY3RvcnkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgJHtiYWNrZW5kTmFtZX0gYmFja2VuZCB3YXMgYWxyZWFkeSByZWdpc3RlcmVkLiBgICtcbiAgICAgICAgICAgICAgICBgUmV1c2luZyBleGlzdGluZyBiYWNrZW5kIGZhY3RvcnkuYCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWdpc3RyeUZhY3RvcnlbYmFja2VuZE5hbWVdID0geyBmYWN0b3J5LCBwcmlvcml0eSB9O1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgYXN5bmMgc2V0QmFja2VuZChiYWNrZW5kTmFtZSkge1xuICAgICAgICBpZiAodGhpcy5yZWdpc3RyeUZhY3RvcnlbYmFja2VuZE5hbWVdID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQmFja2VuZCBuYW1lICcke2JhY2tlbmROYW1lfScgbm90IGZvdW5kIGluIHJlZ2lzdHJ5YCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5iYWNrZW5kTmFtZSA9IGJhY2tlbmROYW1lO1xuICAgICAgICBpZiAodGhpcy5yZWdpc3RyeVtiYWNrZW5kTmFtZV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5iYWNrZW5kSW5zdGFuY2UgPSBudWxsO1xuICAgICAgICAgICAgY29uc3QgeyBzdWNjZXNzLCBhc3luY0luaXQgfSA9IHRoaXMuaW5pdGlhbGl6ZUJhY2tlbmQoYmFja2VuZE5hbWUpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXN5bmNJbml0ID8gYXdhaXQgc3VjY2VzcyA6IHN1Y2Nlc3M7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJhY2tlbmRJbnN0YW5jZSA9IHRoaXMucmVnaXN0cnlbYmFja2VuZE5hbWVdO1xuICAgICAgICB0aGlzLnNldHVwUmVnaXN0ZXJlZEtlcm5lbHMoKTtcbiAgICAgICAgLy8gUmVzZXQgdGhlIHByb2ZpbGVyLlxuICAgICAgICB0aGlzLnByb2ZpbGVyID0gbmV3IFByb2ZpbGVyKHRoaXMuYmFja2VuZEluc3RhbmNlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHNldHVwUmVnaXN0ZXJlZEtlcm5lbHMoKSB7XG4gICAgICAgIGNvbnN0IGtlcm5lbHMgPSBnZXRLZXJuZWxzRm9yQmFja2VuZCh0aGlzLmJhY2tlbmROYW1lKTtcbiAgICAgICAga2VybmVscy5mb3JFYWNoKGtlcm5lbCA9PiB7XG4gICAgICAgICAgICBpZiAoa2VybmVsLnNldHVwRnVuYyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAga2VybmVsLnNldHVwRnVuYyh0aGlzLmJhY2tlbmRJbnN0YW5jZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBkaXNwb3NlUmVnaXN0ZXJlZEtlcm5lbHMoYmFja2VuZE5hbWUpIHtcbiAgICAgICAgY29uc3Qga2VybmVscyA9IGdldEtlcm5lbHNGb3JCYWNrZW5kKGJhY2tlbmROYW1lKTtcbiAgICAgICAga2VybmVscy5mb3JFYWNoKGtlcm5lbCA9PiB7XG4gICAgICAgICAgICBpZiAoa2VybmVsLmRpc3Bvc2VGdW5jICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBrZXJuZWwuZGlzcG9zZUZ1bmModGhpcy5yZWdpc3RyeVtiYWNrZW5kTmFtZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZXMgYSBiYWNrZW5kIGJ5IGxvb2tpbmcgdXAgdGhlIGJhY2tlbmQgbmFtZSBpbiB0aGUgZmFjdG9yeVxuICAgICAqIHJlZ2lzdHJ5IGFuZCBjYWxsaW5nIHRoZSBmYWN0b3J5IG1ldGhvZC4gUmV0dXJucyBhIGJvb2xlYW4gcmVwcmVzZW50aW5nXG4gICAgICogd2hldGhlciB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGJhY2tlbmQgc3VjZWVkZWQuIFRocm93cyBhbiBlcnJvciBpZlxuICAgICAqIHRoZXJlIGlzIG5vIGJhY2tlbmQgaW4gdGhlIGZhY3RvcnkgcmVnaXN0cnkuXG4gICAgICovXG4gICAgaW5pdGlhbGl6ZUJhY2tlbmQoYmFja2VuZE5hbWUpIHtcbiAgICAgICAgY29uc3QgcmVnaXN0cnlGYWN0b3J5RW50cnkgPSB0aGlzLnJlZ2lzdHJ5RmFjdG9yeVtiYWNrZW5kTmFtZV07XG4gICAgICAgIGlmIChyZWdpc3RyeUZhY3RvcnlFbnRyeSA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBpbml0aWFsaXplIGJhY2tlbmQgJHtiYWNrZW5kTmFtZX0sIG5vIHJlZ2lzdHJhdGlvbiBmb3VuZC5gKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgYmFja2VuZCA9IHJlZ2lzdHJ5RmFjdG9yeUVudHJ5LmZhY3RvcnkoKTtcbiAgICAgICAgICAgIC8qIFRlc3QgaWYgdGhlIGZhY3RvcnkgcmV0dXJucyBhIHByb21pc2UuXG4gICAgICAgICAgICBEb25lIGluIGEgbW9yZSBsaWJlcmFsIHdheSB0aGFuXG4gICAgICAgICAgICBwcmV2aW91cyAnUHJvbWlzZS5yZXNvbHZlKGJhY2tlbmQpPT09YmFja2VuZCdcbiAgICAgICAgICAgIGFzIHdlIG5lZWRlZCB0byBhY2NvdW50IGZvciBjdXN0b20gUHJvbWlzZVxuICAgICAgICAgICAgaW1wbGVtZW50YXRpb25zIChlLmcuIEFuZ3VsYXIpICovXG4gICAgICAgICAgICBpZiAoYmFja2VuZCAmJiAhKGJhY2tlbmQgaW5zdGFuY2VvZiBLZXJuZWxCYWNrZW5kKSAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBiYWNrZW5kLnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9taXNlSWQgPSArK3RoaXMucGVuZGluZ0JhY2tlbmRJbml0SWQ7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGJhY2tlbmRcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oYmFja2VuZEluc3RhbmNlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gT3V0ZGF0ZWQgcHJvbWlzZS4gQW5vdGhlciBiYWNrZW5kIHdhcyBzZXQgaW4gdGhlIG1lYW50aW1lLlxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvbWlzZUlkIDwgdGhpcy5wZW5kaW5nQmFja2VuZEluaXRJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVnaXN0cnlbYmFja2VuZE5hbWVdID0gYmFja2VuZEluc3RhbmNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdCYWNrZW5kSW5pdCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBPdXRkYXRlZCBwcm9taXNlLiBBbm90aGVyIGJhY2tlbmQgd2FzIHNldCBpbiB0aGUgbWVhbnRpbWUuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9taXNlSWQgPCB0aGlzLnBlbmRpbmdCYWNrZW5kSW5pdElkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nQmFja2VuZEluaXQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYEluaXRpYWxpemF0aW9uIG9mIGJhY2tlbmQgJHtiYWNrZW5kTmFtZX0gZmFpbGVkYCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihlcnIuc3RhY2sgfHwgZXJyLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nQmFja2VuZEluaXQgPSBzdWNjZXNzO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3MsIGFzeW5jSW5pdDogdHJ1ZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWdpc3RyeVtiYWNrZW5kTmFtZV0gPSBiYWNrZW5kO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGFzeW5jSW5pdDogZmFsc2UgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYEluaXRpYWxpemF0aW9uIG9mIGJhY2tlbmQgJHtiYWNrZW5kTmFtZX0gZmFpbGVkYCk7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oZXJyLnN0YWNrIHx8IGVyci5tZXNzYWdlKTtcbiAgICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBhc3luY0luaXQ6IGZhbHNlIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVtb3ZlQmFja2VuZChiYWNrZW5kTmFtZSkge1xuICAgICAgICBpZiAoIShiYWNrZW5kTmFtZSBpbiB0aGlzLnJlZ2lzdHJ5RmFjdG9yeSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtiYWNrZW5kTmFtZX0gYmFja2VuZCBub3QgZm91bmQgaW4gcmVnaXN0cnlgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5iYWNrZW5kTmFtZSA9PT0gYmFja2VuZE5hbWUgJiYgdGhpcy5wZW5kaW5nQmFja2VuZEluaXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gVGhlcmUgaXMgYSBwZW5kaW5nIHByb21pc2Ugb2YgdGhlIGJhY2tlbmQgd2Ugd2FudCB0byByZW1vdmUuIE1ha2UgaXRcbiAgICAgICAgICAgIC8vIG9ic29sZXRlLlxuICAgICAgICAgICAgdGhpcy5wZW5kaW5nQmFja2VuZEluaXRJZCsrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiYWNrZW5kTmFtZSBpbiB0aGlzLnJlZ2lzdHJ5KSB7XG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2VSZWdpc3RlcmVkS2VybmVscyhiYWNrZW5kTmFtZSk7XG4gICAgICAgICAgICB0aGlzLnJlZ2lzdHJ5W2JhY2tlbmROYW1lXS5kaXNwb3NlKCk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5yZWdpc3RyeVtiYWNrZW5kTmFtZV07XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIHRoaXMucmVnaXN0cnlGYWN0b3J5W2JhY2tlbmROYW1lXTtcbiAgICAgICAgLy8gVW5zZXQgdGhlIGJhY2tlbmQgaWYgaXQgaXMgYWN0aXZlLlxuICAgICAgICBpZiAodGhpcy5iYWNrZW5kTmFtZSA9PT0gYmFja2VuZE5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0JhY2tlbmRJbml0ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuYmFja2VuZE5hbWUgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5iYWNrZW5kSW5zdGFuY2UgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldFNvcnRlZEJhY2tlbmRzKCkge1xuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5yZWdpc3RyeUZhY3RvcnkpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBiYWNrZW5kIGZvdW5kIGluIHJlZ2lzdHJ5LicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLnJlZ2lzdHJ5RmFjdG9yeSkuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgLy8gSGlnaGVzdCBwcmlvcml0eSBjb21lcyBmaXJzdC5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5RmFjdG9yeVtiXS5wcmlvcml0eSAtXG4gICAgICAgICAgICAgICAgdGhpcy5yZWdpc3RyeUZhY3RvcnlbYV0ucHJpb3JpdHk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpbml0aWFsaXplQmFja2VuZHNBbmRSZXR1cm5CZXN0KCkge1xuICAgICAgICBjb25zdCBzb3J0ZWRCYWNrZW5kcyA9IHRoaXMuZ2V0U29ydGVkQmFja2VuZHMoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3J0ZWRCYWNrZW5kcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgYmFja2VuZE5hbWUgPSBzb3J0ZWRCYWNrZW5kc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IHsgc3VjY2VzcywgYXN5bmNJbml0IH0gPSB0aGlzLmluaXRpYWxpemVCYWNrZW5kKGJhY2tlbmROYW1lKTtcbiAgICAgICAgICAgIGlmIChhc3luY0luaXQgfHwgc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IG5hbWU6IGJhY2tlbmROYW1lLCBhc3luY0luaXQgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBpbml0aWFsaXplIGFueSBiYWNrZW5kcywgYWxsIGJhY2tlbmQgaW5pdGlhbGl6YXRpb25zIGAgK1xuICAgICAgICAgICAgYGZhaWxlZC5gKTtcbiAgICB9XG4gICAgbW92ZURhdGEoYmFja2VuZCwgZGF0YUlkKSB7XG4gICAgICAgIGNvbnN0IGluZm8gPSB0aGlzLnN0YXRlLnRlbnNvckluZm8uZ2V0KGRhdGFJZCk7XG4gICAgICAgIGNvbnN0IHNyY0JhY2tlbmQgPSBpbmZvLmJhY2tlbmQ7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMucmVhZFN5bmMoZGF0YUlkKTtcbiAgICAgICAgY29uc3QgcmVmQ291bnQgPSBzcmNCYWNrZW5kLnJlZkNvdW50KGRhdGFJZCk7XG4gICAgICAgIC8vIERlbGV0ZSB0aGUgdGVuc29yIGZyb20gdGhlIG9sZCBiYWNrZW5kIGFuZCBtb3ZlIGl0IHRvIHRoZSBuZXdcbiAgICAgICAgLy8gYmFja2VuZC5cbiAgICAgICAgc3JjQmFja2VuZC5kaXNwb3NlRGF0YShkYXRhSWQsIHRydWUpO1xuICAgICAgICBpbmZvLmJhY2tlbmQgPSBiYWNrZW5kO1xuICAgICAgICBiYWNrZW5kLm1vdmUoZGF0YUlkLCB2YWx1ZXMsIGluZm8uc2hhcGUsIGluZm8uZHR5cGUsIHJlZkNvdW50KTtcbiAgICAgICAgaWYgKHRoaXMuc2hvdWxkQ2hlY2tGb3JNZW1MZWFrcygpKSB7XG4gICAgICAgICAgICAvLyBUcmFjayB0aGUgbnVtYmVyIG9mIG1vdmVzIGR1cmluZyBhIGtlcm5lbCBleGVjdXRpb24gdG8gY29ycmVjdGx5XG4gICAgICAgICAgICAvLyBkZXRlY3QgbWVtb3J5IGxlYWtzLlxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5udW1EYXRhTW92ZXNTdGFja1t0aGlzLnN0YXRlLm51bURhdGFNb3Zlc1N0YWNrLmxlbmd0aCAtIDFdKys7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGlkeShuYW1lT3JGbiwgZm4pIHtcbiAgICAgICAgbGV0IG5hbWUgPSBudWxsO1xuICAgICAgICBpZiAoZm4gPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gQ2FsbGVkIHdpdGggb25seSAxIGFyZ3VtZW50LlxuICAgICAgICAgICAgaWYgKHR5cGVvZiBuYW1lT3JGbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIHByb3ZpZGUgYSBmdW5jdGlvbiB0byB0aWR5KCknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZuID0gbmFtZU9yRm47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBDYWxsZWQgd2l0aCAyIGFyZ3VtZW50cy5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgbmFtZU9yRm4gIT09ICdzdHJpbmcnICYmICEobmFtZU9yRm4gaW5zdGFuY2VvZiBTdHJpbmcpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXaGVuIGNhbGxpbmcgd2l0aCB0d28gYXJndW1lbnRzLCB0aGUgZmlyc3QgYXJndW1lbnQgJyArXG4gICAgICAgICAgICAgICAgICAgICd0byB0aWR5KCkgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV2hlbiBjYWxsaW5nIHdpdGggdHdvIGFyZ3VtZW50cywgdGhlIDJuZCBhcmd1bWVudCAnICtcbiAgICAgICAgICAgICAgICAgICAgJ3RvIHRpZHkoKSBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5hbWUgPSBuYW1lT3JGbjtcbiAgICAgICAgICAgIC8vIFRPRE8obnN0aG9yYXQsc21pbGtvdik6IERvIG9wZXJhdGlvbiBsb2dnaW5nIGFuZCBwZXJmb3JtYW5jZVxuICAgICAgICAgICAgLy8gcHJvZmlsaW5nLlxuICAgICAgICB9XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIHJldHVybiB0aGlzLnNjb3BlZFJ1bigoKSA9PiB0aGlzLnN0YXJ0U2NvcGUobmFtZSksICgpID0+IHRoaXMuZW5kU2NvcGUocmVzdWx0KSwgKCkgPT4ge1xuICAgICAgICAgICAgcmVzdWx0ID0gZm4oKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ2Fubm90IHJldHVybiBhIFByb21pc2UgaW5zaWRlIG9mIHRpZHkuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2NvcGVkUnVuKHN0YXJ0LCBlbmQsIGYpIHtcbiAgICAgICAgc3RhcnQoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGYoKTtcbiAgICAgICAgICAgIGVuZCgpO1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgIGVuZCgpO1xuICAgICAgICAgICAgdGhyb3cgZXg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmV4dFRlbnNvcklkKCkge1xuICAgICAgICByZXR1cm4gRW5naW5lLm5leHRUZW5zb3JJZCsrO1xuICAgIH1cbiAgICBuZXh0VmFyaWFibGVJZCgpIHtcbiAgICAgICAgcmV0dXJuIEVuZ2luZS5uZXh0VmFyaWFibGVJZCsrO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgaW5zdGVhZCBvZiB0aGUgcHVibGljLWZhY2luZyB0ZW5zb3IuY2xvbmUoKSB3aGVuXG4gICAgICogc2F2aW5nIGEgdGVuc29yIGZvciBiYWNrd2FyZHMgcGFzcy4gSXQgbWFrZXMgc3VyZSB0byBhZGQgdGhlIGNsb25lXG4gICAgICogb3BlcmF0aW9uIHRvIHRoZSB0YXBlIHJlZ2FyZGxlc3Mgb2YgYmVpbmcgY2FsbGVkIGluc2lkZSBhIGtlcm5lbFxuICAgICAqIGV4ZWN1dGlvbi5cbiAgICAgKi9cbiAgICBjbG9uZSh4KSB7XG4gICAgICAgIGNvbnN0IHkgPSBFTkdJTkUucnVuS2VybmVsKElkZW50aXR5LCB7IHggfSk7XG4gICAgICAgIGNvbnN0IGlucHV0cyA9IHsgeCB9O1xuICAgICAgICBjb25zdCBncmFkID0gKGR5KSA9PiAoe1xuICAgICAgICAgICAgeDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGR0eXBlID0gJ2Zsb2F0MzInO1xuICAgICAgICAgICAgICAgIGNvbnN0IGdyYWRJbnB1dHMgPSB7IHg6IGR5IH07XG4gICAgICAgICAgICAgICAgY29uc3QgYXR0cnMgPSB7IGR0eXBlIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoQ2FzdCwgZ3JhZElucHV0cywgXG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgICAgICAgICAgICAgIGF0dHJzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHNhdmVkID0gW107XG4gICAgICAgIHRoaXMuYWRkVGFwZU5vZGUodGhpcy5zdGF0ZS5hY3RpdmVTY29wZS5uYW1lLCBpbnB1dHMsIFt5XSwgZ3JhZCwgc2F2ZWQsIHt9KTtcbiAgICAgICAgcmV0dXJuIHk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGUgYSBrZXJuZWwgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgcmV0dXJuIHRoZSBvdXRwdXQgdGVuc29yLlxuICAgICAqXG4gICAgICogQHBhcmFtIGtlcm5lbE5hbWUgVGhlIG5hbWUgb2YgdGhlIGtlcm5lbCB0byBleGVjdXRlLlxuICAgICAqIEBwYXJhbSBpbnB1dHMgQSBtYXAgb2YgaW5wdXQgbmFtZXMgdG8gdGVuc29ycy5cbiAgICAgKiBAcGFyYW0gYXR0cnMgQSBtYXAgb2YgYXR0cmlidXRlIG5hbWVzIHRvIHRoZWlyIHZhbHVlcy4gQW4gYXR0cmlidXRlIGlzIGFcbiAgICAgKiAgICAgcHJpbWl0aXZlIChub24tdGVuc29yKSBpbnB1dCB0byB0aGUga2VybmVsLlxuICAgICAqIEBwYXJhbSBpbnB1dHNUb1NhdmUgQSBsaXN0IG9mIHRlbnNvcnMsIGlucHV0cyB0byBzYXZlIGZvciB0aGUgYmFja3Byb3BcbiAgICAgKiAgICAgY29tcHV0YXRpb24uXG4gICAgICogQHBhcmFtIG91dHB1dHNUb1NhdmUgQSBsaXN0IG9mIGJvb2xlYW5zLCBzcGVjaWZ5aW5nIHdoaWNoIG91dHB1dCB0byBzYXZlXG4gICAgICogICAgIGZvciB0aGUgYmFja3Byb3AgY29tcHV0YXRpb24uIFRoZXNlIGFyZSBib29sZWFucyBzaW5jZSB0aGUgb3V0cHV0XG4gICAgICogdGVuc29ycyBhcmUgbm90IHZpc2libGUgdG8gdGhlIHVzZXIuXG4gICAgICovXG4gICAgcnVuS2VybmVsKGtlcm5lbE5hbWUsIGlucHV0cywgYXR0cnMpIHtcbiAgICAgICAgaWYgKHRoaXMuYmFja2VuZE5hbWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gYmFja2VuZCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0IChiYWNrZW5kIGluaXRpYWxpemF0aW9uIGlzIGxhenlcbiAgICAgICAgICAgIC8vIGNhbiBiZSBkZWZlcnJlZCB1bnRpbCBhbiBvcC8ga2VybmVsIGlzIHJ1bikuXG4gICAgICAgICAgICAvLyBUaGUgYmVsb3cgZ2V0dGVyIGhhcyBzaWRlIGVmZmVjdHMgdGhhdCB3aWxsIHRyeSB0byBpbml0aWFsaXplIHRoZVxuICAgICAgICAgICAgLy8gYmFja2VuZCBhbmQgc2V0IHByb3BlcnRpZXMgbGlrZSB0aGlzLmJhY2tlbmROYW1lXG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVudXNlZC1leHByZXNzaW9uXG4gICAgICAgICAgICB0aGlzLmJhY2tlbmQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaGFzS2VybmVsID0gZ2V0S2VybmVsKGtlcm5lbE5hbWUsIHRoaXMuYmFja2VuZE5hbWUpICE9IG51bGw7XG4gICAgICAgIGlmICghaGFzS2VybmVsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEtlcm5lbCAnJHtrZXJuZWxOYW1lfScgbm90IHJlZ2lzdGVyZWQgZm9yIGJhY2tlbmQgJyR7dGhpcy5iYWNrZW5kTmFtZX0nYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucnVuS2VybmVsRnVuYyh7IGtlcm5lbE5hbWUsIGlucHV0cywgYXR0cnMgfSk7XG4gICAgfVxuICAgIHNob3VsZENoZWNrRm9yTWVtTGVha3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkVOVi5nZXRCb29sKCdJU19URVNUJyk7XG4gICAgfVxuICAgIGNoZWNrS2VybmVsRm9yTWVtTGVhayhrZXJuZWxOYW1lLCBudW1EYXRhSWRzQmVmb3JlLCBvdXRJbmZvcykge1xuICAgICAgICBjb25zdCBudW1EYXRhSWRzQWZ0ZXIgPSB0aGlzLmJhY2tlbmQubnVtRGF0YUlkcygpO1xuICAgICAgICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIGRhdGEgaWRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZSBrZXJuZWwuXG4gICAgICAgIGxldCBudW1PdXRwdXREYXRhSWRzID0gMDtcbiAgICAgICAgb3V0SW5mb3MuZm9yRWFjaChpbmZvID0+IHtcbiAgICAgICAgICAgIC8vIENvbXBsZXggbnVtYmVycyBhbGxvY2F0ZSAzIGRhdGEgaWRzLCBvbmUgZm9yICdyZWFsJywgb25lIGZvclxuICAgICAgICAgICAgLy8gJ2ltYWdpbmFyeScsIGFuZCBvbmUgZm9yIHRoZSBjb250YWluZXIgdGhhdCBob2xkcyB0aGUgZm9ybWVyIHR3by5cbiAgICAgICAgICAgIG51bU91dHB1dERhdGFJZHMgKz0gKGluZm8uZHR5cGUgPT09ICdjb21wbGV4NjQnID8gMyA6IDEpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gQWNjb3VudCBmb3IgdGhlIG51bWJlciBvZiBtb3ZlcyBkdXJpbmcga2VybmVsIGV4ZWN1dGlvbi4gQSBcImRhdGEgbW92ZVwiXG4gICAgICAgIC8vIGNhbiBoYXBwZW4gaW4gdGhlIG1pZGRsZSBvZiBhIGtlcm5lbCBleGVjdXRpb24sIHBsYWNpbmcgYSBuZXcgKGtleSx2YWx1ZSlcbiAgICAgICAgLy8gcGFpciBpbiB0aGUgZGF0YSBzdG9yYWdlLiBTaW5jZSBkYXRhIG1vdmVzIGhhdmUgbmV0IHplcm8gZWZmZWN0ICh3ZVxuICAgICAgICAvLyBhbHdheXMgcmVtb3ZlIHRoZSBkYXRhIGZyb20gdGhlIG9sZCBiYWNrZW5kKSwgd2UgaGF2ZSB0byBjYW5jZWwgdGhlbSBvdXRcbiAgICAgICAgLy8gd2hlbiBkZXRlY3RpbmcgbWVtb3J5IGxlYWtzLlxuICAgICAgICBjb25zdCBudW1Nb3ZlcyA9IHRoaXMuc3RhdGUubnVtRGF0YU1vdmVzU3RhY2tbdGhpcy5zdGF0ZS5udW1EYXRhTW92ZXNTdGFjay5sZW5ndGggLSAxXTtcbiAgICAgICAgY29uc3QgZGF0YUlkc0xlYWtlZCA9IG51bURhdGFJZHNBZnRlciAtIG51bURhdGFJZHNCZWZvcmUgLSBudW1PdXRwdXREYXRhSWRzIC0gbnVtTW92ZXM7XG4gICAgICAgIGlmIChkYXRhSWRzTGVha2VkID4gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCYWNrZW5kICcke3RoaXMuYmFja2VuZE5hbWV9JyBoYXMgYW4gaW50ZXJuYWwgbWVtb3J5IGxlYWsgYCArXG4gICAgICAgICAgICAgICAgYCgke2RhdGFJZHNMZWFrZWR9IGRhdGEgaWRzKSBhZnRlciBydW5uaW5nICcke2tlcm5lbE5hbWV9J2ApO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEludGVybmFsIGhlbHBlciBtZXRob2QgdG8gZXhlY3V0ZSBhIGtlcm5lbCBGdW5jXG4gICAgICpcbiAgICAgKiBVc2UgYHJ1bktlcm5lbGAgdG8gZXhlY3V0ZSBrZXJuZWxzIGZyb20gb3V0c2lkZSBvZiBlbmdpbmUuXG4gICAgICovXG4gICAgcnVuS2VybmVsRnVuYyhrZXJuZWxQYXJhbXMpIHtcbiAgICAgICAgbGV0IG91dHB1dHM7XG4gICAgICAgIGxldCBzYXZlZCA9IFtdO1xuICAgICAgICBjb25zdCBpc1RhcGVPbiA9IHRoaXMuaXNUYXBlT24oKTtcbiAgICAgICAgY29uc3Qgc3RhcnRpbmdCeXRlY291bnQgPSB0aGlzLnN0YXRlLm51bUJ5dGVzO1xuICAgICAgICBjb25zdCBzdGFydGluZ051bVRlbnNvcnMgPSB0aGlzLnN0YXRlLm51bVRlbnNvcnM7XG4gICAgICAgIGlmICh0aGlzLnNob3VsZENoZWNrRm9yTWVtTGVha3MoKSkge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS5udW1EYXRhTW92ZXNTdGFjay5wdXNoKDApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBrZXJuZWxGdW5jO1xuICAgICAgICBpZiAodGhpcy5iYWNrZW5kTmFtZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBiYWNrZW5kIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXQgKGJhY2tlbmQgaW5pdGlhbGl6YXRpb24gaXMgbGF6eVxuICAgICAgICAgICAgLy8gY2FuIGJlIGRlZmVycmVkIHVudGlsIGFuIG9wLyBrZXJuZWwgaXMgcnVuKS5cbiAgICAgICAgICAgIC8vIFRoZSBiZWxvdyBnZXR0ZXIgaGFzIHNpZGUgZWZmZWN0cyB0aGF0IHdpbGwgdHJ5IHRvIGluaXRpYWxpemUgdGhlXG4gICAgICAgICAgICAvLyBiYWNrZW5kIGFuZCBzZXQgcHJvcGVydGllcyBsaWtlIHRoaXMuYmFja2VuZE5hbWVcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW51c2VkLWV4cHJlc3Npb25cbiAgICAgICAgICAgIHRoaXMuYmFja2VuZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb3V0O1xuICAgICAgICBjb25zdCBrZXJuZWxPclNjb3BlTmFtZSA9IGlzUmVnaXN0ZXJlZEtlcm5lbEludm9jYXRpb24oa2VybmVsUGFyYW1zKSA/XG4gICAgICAgICAgICBrZXJuZWxQYXJhbXMua2VybmVsTmFtZSA6XG4gICAgICAgICAgICB0aGlzLnN0YXRlLmFjdGl2ZVNjb3BlICE9IG51bGwgPyB0aGlzLnN0YXRlLmFjdGl2ZVNjb3BlLm5hbWUgOiAnJztcbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBrZXJuZWxGdW5jIGZyb20gZWl0aGVyIGEgcmVnaXN0ZXJlZCBrZXJuZWwgT1IgcGFzc2VkIGluXG4gICAgICAgIC8vIGZvcndhcmQvYmFja3dhcmQgZnVuY3Rpb25zICh1c2VkIGJ5IGN1c3RvbSBncmFkKS4gSW4gdGhpcyBjb250ZXh0IGFcbiAgICAgICAgLy8ga2VybmVsRnVuYyB3cmFwcyBhIGtlcm5lbCBpbXBsZW1lbnRhdGlvbiB3aXRoIHNvbWUgYm9va2tlZXBpbmcuXG4gICAgICAgIGlmIChpc1JlZ2lzdGVyZWRLZXJuZWxJbnZvY2F0aW9uKGtlcm5lbFBhcmFtcykpIHtcbiAgICAgICAgICAgIGNvbnN0IHsga2VybmVsTmFtZSwgaW5wdXRzLCBhdHRycyB9ID0ga2VybmVsUGFyYW1zO1xuICAgICAgICAgICAgaWYgKHRoaXMuYmFja2VuZE5hbWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIGJhY2tlbmQgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIHlldCAoYmFja2VuZCBpbml0aWFsaXphdGlvbiBpcyBsYXp5XG4gICAgICAgICAgICAgICAgLy8gY2FuIGJlIGRlZmVycmVkIHVudGlsIGFuIG9wLyBrZXJuZWwgaXMgcnVuKS5cbiAgICAgICAgICAgICAgICAvLyBUaGUgYmVsb3cgZ2V0dGVyIGhhcyBzaWRlIGVmZmVjdHMgdGhhdCB3aWxsIHRyeSB0byBpbml0aWFsaXplIHRoZVxuICAgICAgICAgICAgICAgIC8vIGJhY2tlbmQgYW5kIHNldCBwcm9wZXJ0aWVzIGxpa2UgdGhpcy5iYWNrZW5kTmFtZVxuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW51c2VkLWV4cHJlc3Npb25cbiAgICAgICAgICAgICAgICB0aGlzLmJhY2tlbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBrZXJuZWwgPSBnZXRLZXJuZWwoa2VybmVsTmFtZSwgdGhpcy5iYWNrZW5kTmFtZSk7XG4gICAgICAgICAgICB1dGlsLmFzc2VydChrZXJuZWwgIT0gbnVsbCwgKCkgPT4gYENhbm5vdCBmaW5kIHJlZ2lzdGVyZWQga2VybmVsICcke2tlcm5lbE5hbWV9JyBmb3IgYmFja2VuZCAnJHt0aGlzLmJhY2tlbmROYW1lfSdgKTtcbiAgICAgICAgICAgIGtlcm5lbEZ1bmMgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbnVtRGF0YUlkc0JlZm9yZSA9IHRoaXMuYmFja2VuZC5udW1EYXRhSWRzKCk7XG4gICAgICAgICAgICAgICAgb3V0ID0ga2VybmVsLmtlcm5lbEZ1bmMoeyBpbnB1dHMsIGF0dHJzLCBiYWNrZW5kOiB0aGlzLmJhY2tlbmQgfSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3V0SW5mb3MgPSBBcnJheS5pc0FycmF5KG91dCkgPyBvdXQgOiBbb3V0XTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG91bGRDaGVja0Zvck1lbUxlYWtzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja0tlcm5lbEZvck1lbUxlYWsoa2VybmVsTmFtZSwgbnVtRGF0YUlkc0JlZm9yZSwgb3V0SW5mb3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBvdXRUZW5zb3JzID0gb3V0SW5mb3MubWFwKChvdXRJbmZvKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRvZG8gKHlhc3NvZ2JhKSByZW1vdmUgdGhpcyBvcHRpb24gKFRlbnNvcikgd2hlbiBub2RlIGJhY2tlbmRcbiAgICAgICAgICAgICAgICAgICAgLy8gbWV0aG9kcyBoYXZlIGJlZW4gbW9kdWxhcml6ZWQgYW5kIHRoZXkgYWxsIHJldHVybiB0ZW5zb3JJbmZvLlxuICAgICAgICAgICAgICAgICAgICAvLyBUZW5zb3JJbmZvcyBkbyBub3QgaGF2ZSBhIHJhbmsgYXR0cmlidXRlLlxuICAgICAgICAgICAgICAgICAgICBpZiAob3V0SW5mby5yYW5rICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvdXRJbmZvO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgZGF0YUlkLCBzaGFwZSwgZHR5cGUgfSA9IG91dEluZm87XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1ha2VUZW5zb3JGcm9tRGF0YUlkKGRhdGFJZCwgc2hhcGUsIGR0eXBlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAvLyBTYXZlIGFueSByZXF1aXJlZCBpbnB1dHMgYW5kIG91dHB1dHMuXG4gICAgICAgICAgICAgICAgLy8gRG8gbm90IHNhdmUgdW5sZXNzIHdlIGFyZSByZWNvcmRpbmcgdG8gdGhlIHRhcGUuIE90aGVyd2lzZSBpdCB3b3VsZFxuICAgICAgICAgICAgICAgIC8vIGNhdXNlIGEgbWVtIGxlYWsgc2luY2UgdGhlcmUgd291bGQgYmUgbm8gYmFja3Byb3AgZm9yIHRoZXNlIHRlbnNvcnNcbiAgICAgICAgICAgICAgICAvLyAod2hpY2ggd291bGQgb3RoZXJ3aXNlIGRpc3Bvc2UgdGhlbSkuXG4gICAgICAgICAgICAgICAgaWYgKGlzVGFwZU9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlbnNvcnNUb1NhdmUgPSB0aGlzLmdldFRlbnNvcnNGb3JHcmFkaWVudChrZXJuZWxOYW1lLCBpbnB1dHMsIG91dFRlbnNvcnMpO1xuICAgICAgICAgICAgICAgICAgICBzYXZlZCA9IHRoaXMuc2F2ZVRlbnNvcnNGb3JCYWNrd2FyZE1vZGUodGVuc29yc1RvU2F2ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBvdXRUZW5zb3JzO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHsgZm9yd2FyZEZ1bmMgfSA9IGtlcm5lbFBhcmFtcztcbiAgICAgICAgICAgIC8vIFJ1bm5pbmcgYSBjdXN0b21HcmFkIG9wLlxuICAgICAgICAgICAgY29uc3Qgc2F2ZUZ1bmMgPSAodGVuc29ycykgPT4ge1xuICAgICAgICAgICAgICAgIC8vIERvIG5vdCBzYXZlIHVubGVzcyB3ZSBhcmUgcmVjb3JkaW5nIHRvIHRoZSB0YXBlLiBPdGhlcndpc2UgaXQgd291bGRcbiAgICAgICAgICAgICAgICAvLyBjYXVzZSBhIG1lbSBsZWFrIHNpbmNlIHdlIHdvdWxkIG5ldmVyIHJ1biBiYWNrcHJvcCwgd2hpY2ggZGlzcG9zZXNcbiAgICAgICAgICAgICAgICAvLyB0aGUga2VwdCB0ZW5zb3JzLlxuICAgICAgICAgICAgICAgIGlmICghaXNUYXBlT24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzYXZlZCA9IHRlbnNvcnMubWFwKHRlbnNvciA9PiB0aGlzLmtlZXAodGhpcy5jbG9uZSh0ZW5zb3IpKSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAga2VybmVsRnVuYyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBudW1EYXRhSWRzQmVmb3JlID0gdGhpcy5iYWNrZW5kLm51bURhdGFJZHMoKTtcbiAgICAgICAgICAgICAgICBvdXQgPSB0aGlzLnRpZHkoKCkgPT4gZm9yd2FyZEZ1bmModGhpcy5iYWNrZW5kLCBzYXZlRnVuYykpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG91dHMgPSAoQXJyYXkuaXNBcnJheShvdXQpID8gb3V0IDogW291dF0pO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3VsZENoZWNrRm9yTWVtTGVha3MoKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTY29wZSBuYW1lIGlzIHVzZWQgdG8gcHJpbnQgYSBtb3JlIGhlbHBmdWwgZXJyb3IgbWVzc2FnZSBpZiBuZWVkZWQuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tLZXJuZWxGb3JNZW1MZWFrKGtlcm5lbE9yU2NvcGVOYW1lLCBudW1EYXRhSWRzQmVmb3JlLCBvdXRzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG91dHM7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIC8vXG4gICAgICAgIC8vIFJ1biB0aGUga2VybmVsRnVuYy4gT3B0aW9uYWxseSBwcm9maWxpbmcgaXQuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHsgaW5wdXRzLCBhdHRycyB9ID0ga2VybmVsUGFyYW1zO1xuICAgICAgICBjb25zdCBiYWNrd2FyZHNGdW5jID0gaXNSZWdpc3RlcmVkS2VybmVsSW52b2NhdGlvbihrZXJuZWxQYXJhbXMpID9cbiAgICAgICAgICAgIG51bGwgOlxuICAgICAgICAgICAga2VybmVsUGFyYW1zLmJhY2t3YXJkc0Z1bmM7XG4gICAgICAgIGxldCBrZXJuZWxQcm9maWxlO1xuICAgICAgICB0aGlzLnNjb3BlZFJ1bihcbiAgICAgICAgLy8gU3RvcCByZWNvcmRpbmcgdG8gYSB0YXBlIHdoZW4gcnVubmluZyBhIGtlcm5lbC5cbiAgICAgICAgKCkgPT4gdGhpcy5zdGF0ZS5rZXJuZWxEZXB0aCsrLCAoKSA9PiB0aGlzLnN0YXRlLmtlcm5lbERlcHRoLS0sICgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5FTlYuZ2V0Qm9vbCgnREVCVUcnKSAmJiAhdGhpcy5zdGF0ZS5wcm9maWxpbmcpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRzID0ga2VybmVsRnVuYygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAga2VybmVsUHJvZmlsZSA9IHRoaXMucHJvZmlsZXIucHJvZmlsZUtlcm5lbChrZXJuZWxPclNjb3BlTmFtZSwgaW5wdXRzLCAoKSA9PiBrZXJuZWxGdW5jKCkpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLkVOVi5nZXRCb29sKCdERUJVRycpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvZmlsZXIubG9nS2VybmVsUHJvZmlsZShrZXJuZWxQcm9maWxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3V0cHV0cyA9IGtlcm5lbFByb2ZpbGUub3V0cHV0cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChpc1RhcGVPbikge1xuICAgICAgICAgICAgdGhpcy5hZGRUYXBlTm9kZShrZXJuZWxPclNjb3BlTmFtZSwgaW5wdXRzLCBvdXRwdXRzLCBiYWNrd2FyZHNGdW5jLCBzYXZlZCwgYXR0cnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLnByb2ZpbGluZykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS5hY3RpdmVQcm9maWxlLmtlcm5lbHMucHVzaCh7XG4gICAgICAgICAgICAgICAgbmFtZToga2VybmVsT3JTY29wZU5hbWUsXG4gICAgICAgICAgICAgICAgYnl0ZXNBZGRlZDogdGhpcy5zdGF0ZS5udW1CeXRlcyAtIHN0YXJ0aW5nQnl0ZWNvdW50LFxuICAgICAgICAgICAgICAgIHRvdGFsQnl0ZXNTbmFwc2hvdDogdGhpcy5zdGF0ZS5udW1CeXRlcyxcbiAgICAgICAgICAgICAgICB0ZW5zb3JzQWRkZWQ6IHRoaXMuc3RhdGUubnVtVGVuc29ycyAtIHN0YXJ0aW5nTnVtVGVuc29ycyxcbiAgICAgICAgICAgICAgICB0b3RhbFRlbnNvcnNTbmFwc2hvdDogdGhpcy5zdGF0ZS5udW1UZW5zb3JzLFxuICAgICAgICAgICAgICAgIGlucHV0U2hhcGVzOiBPYmplY3Qua2V5cyhpbnB1dHMpLm1hcChrZXkgPT4gaW5wdXRzW2tleV0gIT0gbnVsbCA/IGlucHV0c1trZXldLnNoYXBlIDogbnVsbCksXG4gICAgICAgICAgICAgICAgb3V0cHV0U2hhcGVzOiBvdXRwdXRzLm1hcChpdGVtID0+IGl0ZW0uc2hhcGUpLFxuICAgICAgICAgICAgICAgIGtlcm5lbFRpbWVNczoga2VybmVsUHJvZmlsZS50aW1lTXMsXG4gICAgICAgICAgICAgICAgZXh0cmFJbmZvOiBrZXJuZWxQcm9maWxlLmV4dHJhSW5mb1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChBcnJheS5pc0FycmF5KG91dCkgPyBvdXRwdXRzIDogb3V0cHV0c1swXSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNhdmVzIHRlbnNvcnMgdXNlZCBpbiBmb3J3YXJkIG1vZGUgZm9yIHVzZSBpbiBiYWNrd2FyZCBtb2RlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRlbnNvcnMgdGhlIGxpc3Qgb2YgdGVuc29ycyB0byBzYXZlLlxuICAgICAqL1xuICAgIHNhdmVUZW5zb3JzRm9yQmFja3dhcmRNb2RlKHRlbnNvcnMpIHtcbiAgICAgICAgY29uc3Qgc2F2ZWQgPSB0ZW5zb3JzLm1hcCh0ZW5zb3IgPT4gdGhpcy5rZWVwKHRoaXMuY2xvbmUodGVuc29yKSkpO1xuICAgICAgICByZXR1cm4gc2F2ZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHRlbnNvcnMgdG8gc2F2ZSBmb3IgYSBnaXZlbiBncmFkaWVudCBjYWxjdWxhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBrZXJuZWxOYW1lIG5hbWUgb2Yga2VybmVsIHRvIGxvb2sgdXAgZ3JhZGllbnQgZm9yLlxuICAgICAqIEBwYXJhbSBpbnB1dHMgYSBtYXAgb2YgaW5wdXQgdGVuc29ycy5cbiAgICAgKiBAcGFyYW0gb3V0cHV0cyBhbiBhcnJheSBvZiBvdXRwdXQgdGVuc29ycyBmcm9tIGZvcndhcmQgbW9kZSBvZiBrZXJuZWwuXG4gICAgICovXG4gICAgZ2V0VGVuc29yc0ZvckdyYWRpZW50KGtlcm5lbE5hbWUsIGlucHV0cywgb3V0cHV0cykge1xuICAgICAgICBjb25zdCBncmFkQ29uZmlnID0gZ2V0R3JhZGllbnQoa2VybmVsTmFtZSk7XG4gICAgICAgIGlmIChncmFkQ29uZmlnICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0c1RvU2F2ZSA9IGdyYWRDb25maWcuaW5wdXRzVG9TYXZlIHx8IFtdO1xuICAgICAgICAgICAgY29uc3Qgb3V0cHV0c1RvU2F2ZSA9IGdyYWRDb25maWcub3V0cHV0c1RvU2F2ZSB8fCBbXTtcbiAgICAgICAgICAgIC8vIElmIHNhdmVBbGxJbnB1dHMgaXMgdHJ1ZSwgYWxsIGlucHV0cyB3aWxsIGJlIHNhdmVkLiBPdGhlcndpc2UsIGlucHV0c1xuICAgICAgICAgICAgLy8gc3BlY2lmaWVkIGluIGlucHV0c1RvU2F2ZSB3aWxsIGJlIHNhdmVkLlxuICAgICAgICAgICAgbGV0IGlucHV0VGVuc29yc1RvU2F2ZTtcbiAgICAgICAgICAgIGlmIChncmFkQ29uZmlnLnNhdmVBbGxJbnB1dHMpIHtcbiAgICAgICAgICAgICAgICB1dGlsLmFzc2VydChBcnJheS5pc0FycmF5KGlucHV0cyksICgpID0+ICdzYXZlQWxsSW5wdXRzIGlzIHRydWUsIGV4cGVjdGVkIGlucHV0cyB0byBiZSBhbiBhcnJheS4nKTtcbiAgICAgICAgICAgICAgICBpbnB1dFRlbnNvcnNUb1NhdmUgPSBPYmplY3Qua2V5cyhpbnB1dHMpLm1hcCgoa2V5KSA9PiBpbnB1dHNba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbnB1dFRlbnNvcnNUb1NhdmUgPSBpbnB1dHNUb1NhdmUubWFwKChpbnB1dE5hbWUpID0+IGlucHV0c1tpbnB1dE5hbWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG91dHB1dFRlbnNvcnNUb1NhdmUgPSBvdXRwdXRzLmZpbHRlcigoXywgaSkgPT4gb3V0cHV0c1RvU2F2ZVtpXSk7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXRUZW5zb3JzVG9TYXZlLmNvbmNhdChvdXRwdXRUZW5zb3JzVG9TYXZlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXZSByZXR1cm4gYW4gZW1wdHkgbGlzdCByYXRoZXIgdGhhbiB0aHJvdyBhbiBlcnJvciBiZWNhdXNlIHRoZSBrZXJuZWwgd2VcbiAgICAgICAgLy8gYXJlIGxvb2tpbmcgdXAgbWF5IG5vdCBhY3R1YWxseSBiZSByZWxldmFudCB0byBiYWNrcHJvcGluZyB0aHJvdWdoIHRoZVxuICAgICAgICAvLyBvdmVyYWxsIGZ1bmN0aW9uXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFNlZSAnZG9lcyBub3QgZXJyb3IgaWYgaXJyZWxldmFudCAocHJ1bmVkKSBvcHMgYXJlIG1pc3NpbmcgZ3JhZHMnIHRlc3RcbiAgICAgICAgLy8gaW4gZ3JhZGllbnRzX3Rlc3QudHMgZm9yIGFuIGV4YW1wbGUuXG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgbWV0aG9kIHVzZWQgYnkgcHVibGljIEFQSXMgZm9yIHRlbnNvciBjcmVhdGlvbi4gTWFrZXMgYSBuZXdcbiAgICAgKiB0ZW5zb3Igd2l0aCB0aGUgcHJvdmlkZWQgc2hhcGUsIGR0eXBlIGFuZCB2YWx1ZXMuIEl0IGFsd2F5c1xuICAgICAqIGNyZWF0ZXMgYSBuZXcgZGF0YSBpZCBhbmQgd3JpdGVzIHRoZSB2YWx1ZXMgdG8gdGhlIHVuZGVybHlpbmcgYmFja2VuZC5cbiAgICAgKi9cbiAgICBtYWtlVGVuc29yKHZhbHVlcywgc2hhcGUsIGR0eXBlLCBiYWNrZW5kKSB7XG4gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZXMgcGFzc2VkIHRvIGVuZ2luZS5tYWtlVGVuc29yKCkgYXJlIG51bGwnKTtcbiAgICAgICAgfVxuICAgICAgICBkdHlwZSA9IGR0eXBlIHx8ICdmbG9hdDMyJztcbiAgICAgICAgYmFja2VuZCA9IGJhY2tlbmQgfHwgdGhpcy5iYWNrZW5kO1xuICAgICAgICBsZXQgYmFja2VuZFZhbHMgPSB2YWx1ZXM7XG4gICAgICAgIGlmIChkdHlwZSA9PT0gJ3N0cmluZycgJiYgdXRpbC5pc1N0cmluZyh2YWx1ZXNbMF0pKSB7XG4gICAgICAgICAgICBiYWNrZW5kVmFscyA9IHZhbHVlcy5tYXAoZCA9PiB1dGlsLmVuY29kZVN0cmluZyhkKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YUlkID0gYmFja2VuZC53cml0ZShiYWNrZW5kVmFscywgc2hhcGUsIGR0eXBlKTtcbiAgICAgICAgY29uc3QgdCA9IG5ldyBUZW5zb3Ioc2hhcGUsIGR0eXBlLCBkYXRhSWQsIHRoaXMubmV4dFRlbnNvcklkKCkpO1xuICAgICAgICB0aGlzLnRyYWNrVGVuc29yKHQsIGJhY2tlbmQpO1xuICAgICAgICAvLyBDb3VudCBieXRlcyBmb3Igc3RyaW5nIHRlbnNvcnMuXG4gICAgICAgIGlmIChkdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZm8gPSB0aGlzLnN0YXRlLnRlbnNvckluZm8uZ2V0KGRhdGFJZCk7XG4gICAgICAgICAgICBjb25zdCBuZXdCeXRlcyA9IGJ5dGVzRnJvbVN0cmluZ0FycmF5KGJhY2tlbmRWYWxzKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUubnVtQnl0ZXMgKz0gbmV3Qnl0ZXMgLSBpbmZvLmJ5dGVzO1xuICAgICAgICAgICAgaW5mby5ieXRlcyA9IG5ld0J5dGVzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnRlcm5hbCBtZXRob2QgdXNlZCBieSBiYWNrZW5kcy4gTWFrZXMgYSBuZXcgdGVuc29yXG4gICAgICogdGhhdCBpcyBhIHdyYXBwZXIgYXJvdW5kIGFuIGV4aXN0aW5nIGRhdGEgaWQuIEl0IGRvZXNuJ3QgY3JlYXRlXG4gICAgICogYSBuZXcgZGF0YSBpZCwgb25seSBpbmNyZW1lbnRzIHRoZSByZWYgY291bnQgdXNlZCBpbiBtZW1vcnkgdHJhY2tpbmcuXG4gICAgICovXG4gICAgbWFrZVRlbnNvckZyb21EYXRhSWQoZGF0YUlkLCBzaGFwZSwgZHR5cGUsIGJhY2tlbmQpIHtcbiAgICAgICAgZHR5cGUgPSBkdHlwZSB8fCAnZmxvYXQzMic7XG4gICAgICAgIGNvbnN0IHQgPSBuZXcgVGVuc29yKHNoYXBlLCBkdHlwZSwgZGF0YUlkLCB0aGlzLm5leHRUZW5zb3JJZCgpKTtcbiAgICAgICAgdGhpcy50cmFja1RlbnNvcih0LCBiYWNrZW5kKTtcbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfVxuICAgIG1ha2VWYXJpYWJsZShpbml0aWFsVmFsdWUsIHRyYWluYWJsZSA9IHRydWUsIG5hbWUsIGR0eXBlKSB7XG4gICAgICAgIG5hbWUgPSBuYW1lIHx8IHRoaXMubmV4dFZhcmlhYmxlSWQoKS50b1N0cmluZygpO1xuICAgICAgICBpZiAoZHR5cGUgIT0gbnVsbCAmJiBkdHlwZSAhPT0gaW5pdGlhbFZhbHVlLmR0eXBlKSB7XG4gICAgICAgICAgICBpbml0aWFsVmFsdWUgPSBpbml0aWFsVmFsdWUuY2FzdChkdHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdiA9IG5ldyBWYXJpYWJsZShpbml0aWFsVmFsdWUsIHRyYWluYWJsZSwgbmFtZSwgdGhpcy5uZXh0VGVuc29ySWQoKSk7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLnJlZ2lzdGVyZWRWYXJpYWJsZXNbdi5uYW1lXSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFZhcmlhYmxlIHdpdGggbmFtZSAke3YubmFtZX0gd2FzIGFscmVhZHkgcmVnaXN0ZXJlZGApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdGUucmVnaXN0ZXJlZFZhcmlhYmxlc1t2Lm5hbWVdID0gdjtcbiAgICAgICAgdGhpcy5pbmNSZWYodiwgdGhpcy5iYWNrZW5kKTtcbiAgICAgICAgcmV0dXJuIHY7XG4gICAgfVxuICAgIHRyYWNrVGVuc29yKGEsIGJhY2tlbmQpIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5udW1UZW5zb3JzKys7XG4gICAgICAgIGlmIChhLmR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS5udW1TdHJpbmdUZW5zb3JzKys7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQnl0ZXMgZm9yIGNvbXBsZXggbnVtYmVycyBhcmUgY291bnRlZCBieSB0aGVpciBjb21wb25lbnRzLiBCeXRlcyBmb3JcbiAgICAgICAgLy8gc3RyaW5nIHRlbnNvcnMgYXJlIGNvdW50ZWQgd2hlbiB3cml0aW5nIHZhbHVlcy5cbiAgICAgICAgbGV0IGJ5dGVzID0gMDtcbiAgICAgICAgaWYgKGEuZHR5cGUgIT09ICdjb21wbGV4NjQnICYmIGEuZHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBieXRlcyA9IGEuc2l6ZSAqIHV0aWwuYnl0ZXNQZXJFbGVtZW50KGEuZHR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdGUubnVtQnl0ZXMgKz0gYnl0ZXM7XG4gICAgICAgIGlmICghdGhpcy5zdGF0ZS50ZW5zb3JJbmZvLmhhcyhhLmRhdGFJZCkpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUubnVtRGF0YUJ1ZmZlcnMrKztcbiAgICAgICAgICAgIHRoaXMuc3RhdGUudGVuc29ySW5mby5zZXQoYS5kYXRhSWQsIHtcbiAgICAgICAgICAgICAgICBiYWNrZW5kOiBiYWNrZW5kIHx8IHRoaXMuYmFja2VuZCxcbiAgICAgICAgICAgICAgICBkdHlwZTogYS5kdHlwZSxcbiAgICAgICAgICAgICAgICBzaGFwZTogYS5zaGFwZSxcbiAgICAgICAgICAgICAgICBieXRlc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEoYSBpbnN0YW5jZW9mIFZhcmlhYmxlKSkge1xuICAgICAgICAgICAgdGhpcy50cmFjayhhKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUcmFjayB0aGUgdGVuc29yIGJ5IGRhdGFJZCBhbmQgaW5jcmVhc2UgdGhlIHJlZkNvdW50IGZvciB0aGUgZGF0YUlkIGluIHRoZVxuICAgIC8vIGJhY2tlbmQuXG4gICAgLy8gVE9ETyhweXUxMDA1NSk6IFRoaXMgaXMgY3VycmVudGx5IHVzZWQgYnkgbWFrZVZhcmlhYmxlIG1ldGhvZCwgdG8gaW5jcmVhc2VcbiAgICAvLyByZWZDb3VudCBvbiB0aGUgYmFja2VuZCBmb3IgdGhlIGRhdGFJZC4gSXQgY2FuIHBvdGVudGlhbGx5IGJlIHJlcGxhY2VkIHdpdGhcbiAgICAvLyBJZGVudGl0eSBvcCBpbmRlYWQgb2YgY2FsbGluZyBiYWNrZW5kIGRpcmVjdGx5LlxuICAgIGluY1JlZihhLCBiYWNrZW5kKSB7XG4gICAgICAgIHRoaXMudHJhY2tUZW5zb3IoYSwgYmFja2VuZCk7XG4gICAgICAgIHRoaXMuYmFja2VuZC5pbmNSZWYoYS5kYXRhSWQpO1xuICAgIH1cbiAgICByZW1vdmVEYXRhSWQoZGF0YUlkLCBiYWNrZW5kKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLnRlbnNvckluZm8uaGFzKGRhdGFJZCkgJiZcbiAgICAgICAgICAgIHRoaXMuc3RhdGUudGVuc29ySW5mby5nZXQoZGF0YUlkKS5iYWNrZW5kID09PSBiYWNrZW5kKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlLnRlbnNvckluZm8uZGVsZXRlKGRhdGFJZCk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlLm51bURhdGFCdWZmZXJzLS07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGlzcG9zZVRlbnNvcihhKSB7XG4gICAgICAgIGlmICghdGhpcy5zdGF0ZS50ZW5zb3JJbmZvLmhhcyhhLmRhdGFJZCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmZvID0gdGhpcy5zdGF0ZS50ZW5zb3JJbmZvLmdldChhLmRhdGFJZCk7XG4gICAgICAgIHRoaXMuc3RhdGUubnVtVGVuc29ycy0tO1xuICAgICAgICBpZiAoYS5kdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUubnVtU3RyaW5nVGVuc29ycy0tO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS5udW1CeXRlcyAtPSBpbmZvLmJ5dGVzO1xuICAgICAgICB9XG4gICAgICAgIC8vIERvbid0IGNvdW50IGJ5dGVzIGZvciBjb21wbGV4IG51bWJlcnMgYXMgdGhleSBhcmUgY291bnRlZCBieSB0aGVpclxuICAgICAgICAvLyBjb21wb25lbnRzLlxuICAgICAgICBpZiAoYS5kdHlwZSAhPT0gJ2NvbXBsZXg2NCcgJiYgYS5kdHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnN0IGJ5dGVzID0gYS5zaXplICogdXRpbC5ieXRlc1BlckVsZW1lbnQoYS5kdHlwZSk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlLm51bUJ5dGVzIC09IGJ5dGVzO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlbW92ZSB0aGUgcmVmZXJlbmNlIHRvIGRhdGFJZCBpZiBiYWNrZW5kIGRpc3Bvc2UgdGhlIGRhdGEgc3VjY2Vzc2Z1bGx5XG4gICAgICAgIGlmIChpbmZvLmJhY2tlbmQuZGlzcG9zZURhdGEoYS5kYXRhSWQpKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZURhdGFJZChhLmRhdGFJZCwgaW5mby5iYWNrZW5kKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPKG5zdGhvcmF0KTogQ29uc3RydWN0IGFuIGVycm9yIGFuZCBzYXZlIHRoZSBzdGFjayB0cmFjZSBmb3JcbiAgICAgICAgLy8gZGVidWdnaW5nIHdoZW4gaW4gZGVidWcgbW9kZS4gQ3JlYXRpbmcgYSBzdGFjayB0cmFjZSBpcyB0b28gZXhwZW5zaXZlXG4gICAgICAgIC8vIHRvIGRvIHVuY29uZGl0aW9uYWxseS5cbiAgICB9XG4gICAgZGlzcG9zZVZhcmlhYmxlcygpIHtcbiAgICAgICAgZm9yIChjb25zdCB2YXJOYW1lIGluIHRoaXMuc3RhdGUucmVnaXN0ZXJlZFZhcmlhYmxlcykge1xuICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMuc3RhdGUucmVnaXN0ZXJlZFZhcmlhYmxlc1t2YXJOYW1lXTtcbiAgICAgICAgICAgIHRoaXMuZGlzcG9zZVZhcmlhYmxlKHYpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2VWYXJpYWJsZSh2KSB7XG4gICAgICAgIHRoaXMuZGlzcG9zZVRlbnNvcih2KTtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUucmVnaXN0ZXJlZFZhcmlhYmxlc1t2Lm5hbWVdICE9IG51bGwpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnN0YXRlLnJlZ2lzdGVyZWRWYXJpYWJsZXNbdi5uYW1lXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBtZW1vcnkoKSB7XG4gICAgICAgIGNvbnN0IGluZm8gPSB0aGlzLmJhY2tlbmQubWVtb3J5KCk7XG4gICAgICAgIGluZm8ubnVtVGVuc29ycyA9IHRoaXMuc3RhdGUubnVtVGVuc29ycztcbiAgICAgICAgaW5mby5udW1EYXRhQnVmZmVycyA9IHRoaXMuc3RhdGUubnVtRGF0YUJ1ZmZlcnM7XG4gICAgICAgIGluZm8ubnVtQnl0ZXMgPSB0aGlzLnN0YXRlLm51bUJ5dGVzO1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5udW1TdHJpbmdUZW5zb3JzID4gMCkge1xuICAgICAgICAgICAgaW5mby51bnJlbGlhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChpbmZvLnJlYXNvbnMgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGluZm8ucmVhc29ucyA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5mby5yZWFzb25zLnB1c2goJ01lbW9yeSB1c2FnZSBieSBzdHJpbmcgdGVuc29ycyBpcyBhcHByb3hpbWF0ZSAnICtcbiAgICAgICAgICAgICAgICAnKDIgYnl0ZXMgcGVyIGNoYXJhY3RlciknKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5mbztcbiAgICB9XG4gICAgYXN5bmMgcHJvZmlsZShxdWVyeSkge1xuICAgICAgICB0aGlzLnN0YXRlLnByb2ZpbGluZyA9IHRydWU7XG4gICAgICAgIGNvbnN0IHN0YXJ0Qnl0ZXMgPSB0aGlzLnN0YXRlLm51bUJ5dGVzO1xuICAgICAgICBjb25zdCBzdGFydE51bVRlbnNvcnMgPSB0aGlzLnN0YXRlLm51bVRlbnNvcnM7XG4gICAgICAgIHRoaXMuc3RhdGUuYWN0aXZlUHJvZmlsZS5rZXJuZWxzID0gW107XG4gICAgICAgIHRoaXMuc3RhdGUuYWN0aXZlUHJvZmlsZS5yZXN1bHQgPSBhd2FpdCBxdWVyeSgpO1xuICAgICAgICB0aGlzLnN0YXRlLnByb2ZpbGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnN0YXRlLmFjdGl2ZVByb2ZpbGUucGVha0J5dGVzID0gTWF0aC5tYXgoLi4udGhpcy5zdGF0ZS5hY3RpdmVQcm9maWxlLmtlcm5lbHMubWFwKGQgPT4gZC50b3RhbEJ5dGVzU25hcHNob3QpKTtcbiAgICAgICAgdGhpcy5zdGF0ZS5hY3RpdmVQcm9maWxlLm5ld0J5dGVzID0gdGhpcy5zdGF0ZS5udW1CeXRlcyAtIHN0YXJ0Qnl0ZXM7XG4gICAgICAgIHRoaXMuc3RhdGUuYWN0aXZlUHJvZmlsZS5uZXdUZW5zb3JzID1cbiAgICAgICAgICAgIHRoaXMuc3RhdGUubnVtVGVuc29ycyAtIHN0YXJ0TnVtVGVuc29ycztcbiAgICAgICAgZm9yIChjb25zdCBrZXJuZWwgb2YgdGhpcy5zdGF0ZS5hY3RpdmVQcm9maWxlLmtlcm5lbHMpIHtcbiAgICAgICAgICAgIGtlcm5lbC5rZXJuZWxUaW1lTXMgPSBhd2FpdCBrZXJuZWwua2VybmVsVGltZU1zO1xuICAgICAgICAgICAga2VybmVsLmV4dHJhSW5mbyA9IGF3YWl0IGtlcm5lbC5leHRyYUluZm87XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuYWN0aXZlUHJvZmlsZTtcbiAgICB9XG4gICAgaXNUYXBlT24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLmdyYWRpZW50RGVwdGggPiAwICYmIHRoaXMuc3RhdGUua2VybmVsRGVwdGggPT09IDA7XG4gICAgfVxuICAgIGFkZFRhcGVOb2RlKGtlcm5lbE5hbWUsIGlucHV0cywgb3V0cHV0cywgZ3JhZGllbnRzRnVuYywgc2F2ZWQsIGF0dHJzKSB7XG4gICAgICAgIGNvbnN0IHRhcGVOb2RlID0geyBpZDogdGhpcy5zdGF0ZS5uZXh0VGFwZU5vZGVJZCsrLCBrZXJuZWxOYW1lLCBpbnB1dHMsIG91dHB1dHMsIHNhdmVkIH07XG4gICAgICAgIGNvbnN0IGdyYWRDb25maWcgPSBnZXRHcmFkaWVudChrZXJuZWxOYW1lKTtcbiAgICAgICAgaWYgKGdyYWRDb25maWcgIT0gbnVsbCkge1xuICAgICAgICAgICAgZ3JhZGllbnRzRnVuYyA9IGdyYWRDb25maWcuZ3JhZEZ1bmM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdyYWRpZW50c0Z1bmMgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGFwZU5vZGUuZ3JhZGllbnQgPSAoZHlzKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETyhzbWlsa292KTogVG8gb3B0aW1pemUgYmFjay1wcm9wLCBwYXNzIGR5cyB0aGF0IGFyZSBub3QgdXNlZCBpblxuICAgICAgICAgICAgICAgIC8vIHRoZSBiYWNrcHJvcCBncmFwaCB0byB0aGUgdXNlciBhcyBudWxsIGluc3RlYWQgb2YgemVyb3NcbiAgICAgICAgICAgICAgICBkeXMgPSBkeXMubWFwKChkeSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZHkgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0ID0gb3V0cHV0c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHMgPSB1dGlsLm1ha2VaZXJvc1R5cGVkQXJyYXkob3V0cHV0LnNpemUsIG91dHB1dC5kdHlwZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tYWtlVGVuc29yKHZhbHMsIG91dHB1dC5zaGFwZSwgb3V0cHV0LmR0eXBlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZHk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gR3JhZCBmdW5jdGlvbnMgb2Ygb3BzIHdpdGggc2luZ2xlIG91dHB1dHMgZXhwZWN0IGEgZHksIHdoaWxlIG9wc1xuICAgICAgICAgICAgICAgIC8vIHdpdGggbXVsdGlwbGUgb3V0cHV0cyBleHBlY3QgZHlzIChhcnJheSBvZiBkeSkuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGdyYWRpZW50c0Z1bmMoZHlzLmxlbmd0aCA+IDEgPyBkeXMgOiBkeXNbMF0sIHNhdmVkLCBhdHRycyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdGUuYWN0aXZlVGFwZS5wdXNoKHRhcGVOb2RlKTtcbiAgICB9XG4gICAga2VlcChyZXN1bHQpIHtcbiAgICAgICAgcmVzdWx0LmtlcHQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBzdGFydFRhcGUoKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmdyYWRpZW50RGVwdGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuYWN0aXZlVGFwZSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdGUuZ3JhZGllbnREZXB0aCsrO1xuICAgIH1cbiAgICBlbmRUYXBlKCkge1xuICAgICAgICB0aGlzLnN0YXRlLmdyYWRpZW50RGVwdGgtLTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RhcnQgYSBzY29wZS4gVXNlIHRoaXMgd2l0aCBlbmRTY29wZSgpIHRvIGFjaGlldmUgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eVxuICAgICAqIGFzIHNjb3BlKCkgd2l0aG91dCB0aGUgbmVlZCBmb3IgYSBmdW5jdGlvbiBjbG9zdXJlLlxuICAgICAqL1xuICAgIHN0YXJ0U2NvcGUobmFtZSkge1xuICAgICAgICBjb25zdCBzY29wZUluZm8gPSB7XG4gICAgICAgICAgICB0cmFjazogW10sXG4gICAgICAgICAgICBuYW1lOiAndW5uYW1lZCBzY29wZScsXG4gICAgICAgICAgICBpZDogdGhpcy5zdGF0ZS5uZXh0U2NvcGVJZCsrXG4gICAgICAgIH07XG4gICAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgICAgICBzY29wZUluZm8ubmFtZSA9IG5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGF0ZS5zY29wZVN0YWNrLnB1c2goc2NvcGVJbmZvKTtcbiAgICAgICAgdGhpcy5zdGF0ZS5hY3RpdmVTY29wZSA9IHNjb3BlSW5mbztcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5kIGEgc2NvcGUuIFVzZSB0aGlzIHdpdGggc3RhcnRTY29wZSgpIHRvIGFjaGlldmUgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eVxuICAgICAqIGFzIHNjb3BlKCkgd2l0aG91dCB0aGUgbmVlZCBmb3IgYSBmdW5jdGlvbiBjbG9zdXJlLlxuICAgICAqL1xuICAgIGVuZFNjb3BlKHJlc3VsdCkge1xuICAgICAgICBjb25zdCB0ZW5zb3JzVG9UcmFja0luUGFyZW50ID0gZ2V0VGVuc29yc0luQ29udGFpbmVyKHJlc3VsdCk7XG4gICAgICAgIGNvbnN0IHRlbnNvcnNUb1RyYWNrSW5QYXJlbnRTZXQgPSBuZXcgU2V0KHRlbnNvcnNUb1RyYWNrSW5QYXJlbnQubWFwKHQgPT4gdC5pZCkpO1xuICAgICAgICAvLyBEaXNwb3NlIHRoZSBhcnJheXMgdHJhY2tlZCBpbiB0aGlzIHNjb3BlLlxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc3RhdGUuYWN0aXZlU2NvcGUudHJhY2subGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHRlbnNvciA9IHRoaXMuc3RhdGUuYWN0aXZlU2NvcGUudHJhY2tbaV07XG4gICAgICAgICAgICBpZiAoIXRlbnNvci5rZXB0ICYmICF0ZW5zb3JzVG9UcmFja0luUGFyZW50U2V0Lmhhcyh0ZW5zb3IuaWQpKSB7XG4gICAgICAgICAgICAgICAgdGVuc29yLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvbGRTY29wZSA9IHRoaXMuc3RhdGUuc2NvcGVTdGFjay5wb3AoKTtcbiAgICAgICAgdGhpcy5zdGF0ZS5hY3RpdmVTY29wZSA9IHRoaXMuc3RhdGUuc2NvcGVTdGFjay5sZW5ndGggPT09IDAgP1xuICAgICAgICAgICAgbnVsbCA6XG4gICAgICAgICAgICB0aGlzLnN0YXRlLnNjb3BlU3RhY2tbdGhpcy5zdGF0ZS5zY29wZVN0YWNrLmxlbmd0aCAtIDFdO1xuICAgICAgICAvLyBUcmFjayB0aGUgY3VycmVudCByZXN1bHQgaW4gdGhlIHBhcmVudCBzY29wZS5cbiAgICAgICAgdGVuc29yc1RvVHJhY2tJblBhcmVudC5mb3JFYWNoKHRlbnNvciA9PiB7XG4gICAgICAgICAgICAvLyBPbmx5IHRyYWNrIHRoZSB0ZW5zb3IgaWYgd2FzIGFsbG9jYXRlZCBpbiB0aGUgaW5uZXIgc2NvcGUgYW5kIGlzIG5vdFxuICAgICAgICAgICAgLy8gZ2xvYmFsbHkga2VwdC5cbiAgICAgICAgICAgIGlmICghdGVuc29yLmtlcHQgJiYgdGVuc29yLnNjb3BlSWQgPT09IG9sZFNjb3BlLmlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmFjayh0ZW5zb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBncmFkaWVudHMgb2YgYGZgIHdpdGggcmVzcGVjdCB0byBlYWNoIG9mIHRoZSBgeHNgLiBUaGUgZ3JhZGllbnRzXG4gICAgICogcmV0dXJuZWQgYXJlIG9mIHRoZSBzYW1lIGxlbmd0aCBhcyBgeHNgLCBidXQgc29tZSBtaWdodCBiZSBudWxsIGlmIGBmYFxuICAgICAqIHdhcyBub3QgYSBmdW5jdGlvbiBvZiB0aGF0IGB4YC4gSXQgYWxzbyB0YWtlcyBvcHRpb25hbCBkeSB0byBtdWx0aXBseSB0aGVcbiAgICAgKiBncmFkaWVudCwgd2hpY2ggZGVmYXVsdHMgdG8gYDFgLlxuICAgICAqL1xuICAgIGdyYWRpZW50cyhmLCB4cywgZHksIGFsbG93Tm9HcmFkaWVudHMgPSBmYWxzZSkge1xuICAgICAgICB1dGlsLmFzc2VydCh4cy5sZW5ndGggPiAwLCAoKSA9PiAnZ3JhZGllbnRzKCkgcmVjZWl2ZWQgYW4gZW1wdHkgbGlzdCBvZiB4cy4nKTtcbiAgICAgICAgaWYgKGR5ICE9IG51bGwgJiYgZHkuZHR5cGUgIT09ICdmbG9hdDMyJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBkeSBtdXN0IGhhdmUgJ2Zsb2F0MzInIGR0eXBlLCBidXQgaGFzICcke2R5LmR0eXBlfSdgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB5ID0gdGhpcy5zY29wZWRSdW4oKCkgPT4gdGhpcy5zdGFydFRhcGUoKSwgKCkgPT4gdGhpcy5lbmRUYXBlKCksICgpID0+IHRoaXMudGlkeSgnZm9yd2FyZCcsIGYpKTtcbiAgICAgICAgdXRpbC5hc3NlcnQoeSBpbnN0YW5jZW9mIFRlbnNvciwgKCkgPT4gJ1RoZSByZXN1bHQgeSByZXR1cm5lZCBieSBmKCkgbXVzdCBiZSBhIHRlbnNvci4nKTtcbiAgICAgICAgLy8gRmlsdGVyIG91dCB0aGUgbm9kZXMgdGhhdCBkb24ndCBjb25uZWN0IHggPT4geS5cbiAgICAgICAgY29uc3QgZmlsdGVyZWRUYXBlID0gZ2V0RmlsdGVyZWROb2Rlc1hUb1kodGhpcy5zdGF0ZS5hY3RpdmVUYXBlLCB4cywgeSk7XG4gICAgICAgIGlmICghYWxsb3dOb0dyYWRpZW50cyAmJiBmaWx0ZXJlZFRhcGUubGVuZ3RoID09PSAwICYmIHhzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNvbXB1dGUgZ3JhZGllbnQgb2YgeT1mKHgpIHdpdGggcmVzcGVjdCB0byB4LiBNYWtlIHN1cmUgJyArXG4gICAgICAgICAgICAgICAgJ3RoYXQgdGhlIGYgeW91IHBhc3NlZCBlbmNsb3NlcyBhbGwgb3BlcmF0aW9ucyB0aGF0IGxlYWQgZnJvbSB4ICcgK1xuICAgICAgICAgICAgICAgICd0byB5LicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnRpZHkoJ2JhY2t3YXJkJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYWNjdW11bGF0ZWRHcmFkaWVudE1hcCA9IHt9O1xuICAgICAgICAgICAgYWNjdW11bGF0ZWRHcmFkaWVudE1hcFt5LmlkXSA9IChkeSA9PSBudWxsKSA/IG9uZXMoeS5zaGFwZSkgOiBkeTtcbiAgICAgICAgICAgIC8vIEJhY2twcm9wIGdyYWRpZW50cyB0aHJvdWdoIHRoZSBmaWx0ZXJlZCBub2Rlcy5cbiAgICAgICAgICAgIGJhY2twcm9wYWdhdGVHcmFkaWVudHMoYWNjdW11bGF0ZWRHcmFkaWVudE1hcCwgZmlsdGVyZWRUYXBlLCBcbiAgICAgICAgICAgIC8vIFBhc3MgdGhlIHRpZHkgZnVuY3Rpb24gdG8gYXZvaWQgY2lyY3VsYXIgZGVwIHdpdGggYHRhcGUudHNgLlxuICAgICAgICAgICAgZiA9PiB0aGlzLnRpZHkoZiksIFxuICAgICAgICAgICAgLy8gUGFzcyBhbiBhZGQgZnVuY3Rpb24gdG8gYXZvaWRlIGEgY2lyY3VsYXIgZGVwIHdpdGggYHRhcGUudHNgLlxuICAgICAgICAgICAgYWRkKTtcbiAgICAgICAgICAgIGNvbnN0IGdyYWRzID0geHMubWFwKHggPT4gYWNjdW11bGF0ZWRHcmFkaWVudE1hcFt4LmlkXSk7XG4gICAgICAgICAgICBpZiAodGhpcy5zdGF0ZS5ncmFkaWVudERlcHRoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBtZWFucyB0aGF0IHdlIGFyZSBub3QgY29tcHV0aW5nIGhpZ2hlci1vcmRlciBncmFkaWVudHNcbiAgICAgICAgICAgICAgICAvLyBhbmQgY2FuIGNsZWFuIHVwIHRoZSB0YXBlLlxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUuYWN0aXZlVGFwZS5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRlbnNvciBvZiBub2RlLnNhdmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW5zb3IuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5hY3RpdmVUYXBlID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB5LCBncmFkcyB9O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgY3VzdG9tR3JhZChmKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNGdW5jdGlvbihmKSwgKCkgPT4gJ1RoZSBmIHBhc3NlZCBpbiBjdXN0b21HcmFkKGYpIG11c3QgYmUgYSBmdW5jdGlvbi4nKTtcbiAgICAgICAgcmV0dXJuICguLi5pbnB1dHMpID0+IHtcbiAgICAgICAgICAgIHV0aWwuYXNzZXJ0KGlucHV0cy5ldmVyeSh0ID0+IHQgaW5zdGFuY2VvZiBUZW5zb3IpLCAoKSA9PiAnVGhlIGFyZ3MgcGFzc2VkIGluIGN1c3RvbUdyYWQoZikoeDEsIHgyLC4uLikgbXVzdCBhbGwgYmUgJyArXG4gICAgICAgICAgICAgICAgJ3RlbnNvcnMnKTtcbiAgICAgICAgICAgIGxldCByZXM7XG4gICAgICAgICAgICBjb25zdCBpbnB1dE1hcCA9IHt9O1xuICAgICAgICAgICAgaW5wdXRzLmZvckVhY2goKGlucHV0LCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgaW5wdXRNYXBbaV0gPSBpbnB1dDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgZm9yd2FyZEZ1bmMgPSAoXywgc2F2ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJlcyA9IGYoLi4uWy4uLmlucHV0cywgc2F2ZV0pO1xuICAgICAgICAgICAgICAgIHV0aWwuYXNzZXJ0KHJlcy52YWx1ZSBpbnN0YW5jZW9mIFRlbnNvciwgKCkgPT4gJ1RoZSBmdW5jdGlvbiBmIHBhc3NlZCBpbiBjdXN0b21HcmFkKGYpIG11c3QgcmV0dXJuIGFuICcgK1xuICAgICAgICAgICAgICAgICAgICAnb2JqZWN0IHdoZXJlIGBvYmoudmFsdWVgIGlzIGEgdGVuc29yJyk7XG4gICAgICAgICAgICAgICAgdXRpbC5hc3NlcnQodXRpbC5pc0Z1bmN0aW9uKHJlcy5ncmFkRnVuYyksICgpID0+ICdUaGUgZnVuY3Rpb24gZiBwYXNzZWQgaW4gY3VzdG9tR3JhZChmKSBtdXN0IHJldHVybiBhbiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ29iamVjdCB3aGVyZSBgb2JqLmdyYWRGdW5jYCBpcyBhIGZ1bmN0aW9uLicpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXMudmFsdWU7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgYmFja3dhcmRzRnVuYyA9IChkeSwgc2F2ZWQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBncmFkUmVzID0gcmVzLmdyYWRGdW5jKGR5LCBzYXZlZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JhZHMgPSBBcnJheS5pc0FycmF5KGdyYWRSZXMpID8gZ3JhZFJlcyA6IFtncmFkUmVzXTtcbiAgICAgICAgICAgICAgICB1dGlsLmFzc2VydChncmFkcy5sZW5ndGggPT09IGlucHV0cy5sZW5ndGgsICgpID0+ICdUaGUgZnVuY3Rpb24gZiBwYXNzZWQgaW4gY3VzdG9tR3JhZChmKSBtdXN0IHJldHVybiBhbiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ29iamVjdCB3aGVyZSBgb2JqLmdyYWRGdW5jYCBpcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyAnICtcbiAgICAgICAgICAgICAgICAgICAgJ3RoZSBzYW1lIG51bWJlciBvZiB0ZW5zb3JzIGFzIGlucHV0cyBwYXNzZWQgdG8gZiguLi4pLicpO1xuICAgICAgICAgICAgICAgIHV0aWwuYXNzZXJ0KGdyYWRzLmV2ZXJ5KHQgPT4gdCBpbnN0YW5jZW9mIFRlbnNvciksICgpID0+ICdUaGUgZnVuY3Rpb24gZiBwYXNzZWQgaW4gY3VzdG9tR3JhZChmKSBtdXN0IHJldHVybiBhbiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ29iamVjdCB3aGVyZSBgb2JqLmdyYWRGdW5jYCBpcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyAnICtcbiAgICAgICAgICAgICAgICAgICAgJ2EgbGlzdCBvZiBvbmx5IHRlbnNvcnMuJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JhZE1hcCA9IHt9O1xuICAgICAgICAgICAgICAgIGdyYWRzLmZvckVhY2goKGdyYWQsIGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZ3JhZE1hcFtpXSA9ICgpID0+IGdyYWQ7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdyYWRNYXA7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucnVuS2VybmVsRnVuYyh7XG4gICAgICAgICAgICAgICAgZm9yd2FyZEZ1bmMsXG4gICAgICAgICAgICAgICAgYmFja3dhcmRzRnVuYyxcbiAgICAgICAgICAgICAgICBpbnB1dHM6IGlucHV0TWFwLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJlYWRTeW5jKGRhdGFJZCkge1xuICAgICAgICAvLyBSb3V0ZSB0aGUgcmVhZCB0byB0aGUgY29ycmVjdCBiYWNrZW5kLlxuICAgICAgICBjb25zdCBpbmZvID0gdGhpcy5zdGF0ZS50ZW5zb3JJbmZvLmdldChkYXRhSWQpO1xuICAgICAgICByZXR1cm4gaW5mby5iYWNrZW5kLnJlYWRTeW5jKGRhdGFJZCk7XG4gICAgfVxuICAgIHJlYWQoZGF0YUlkKSB7XG4gICAgICAgIC8vIFJvdXRlIHRoZSByZWFkIHRvIHRoZSBjb3JyZWN0IGJhY2tlbmQuXG4gICAgICAgIGNvbnN0IGluZm8gPSB0aGlzLnN0YXRlLnRlbnNvckluZm8uZ2V0KGRhdGFJZCk7XG4gICAgICAgIHJldHVybiBpbmZvLmJhY2tlbmQucmVhZChkYXRhSWQpO1xuICAgIH1cbiAgICBhc3luYyB0aW1lKHF1ZXJ5KSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gbm93KCk7XG4gICAgICAgIGNvbnN0IHRpbWluZ0luZm8gPSBhd2FpdCB0aGlzLmJhY2tlbmQudGltZShxdWVyeSk7XG4gICAgICAgIHRpbWluZ0luZm8ud2FsbE1zID0gbm93KCkgLSBzdGFydDtcbiAgICAgICAgcmV0dXJuIHRpbWluZ0luZm87XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRyYWNrcyBhIFRlbnNvciBpbiB0aGUgY3VycmVudCBzY29wZSB0byBiZSBhdXRvbWF0aWNhbGx5IGNsZWFuZWQgdXBcbiAgICAgKiB3aGVuIHRoZSBjdXJyZW50IHNjb3BlIGVuZHMsIGFuZCByZXR1cm5zIHRoZSB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXN1bHQgVGhlIFRlbnNvciB0byB0cmFjayBpbiB0aGUgY3VycmVudCBzY29wZS5cbiAgICAgKi9cbiAgICB0cmFjayhyZXN1bHQpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuYWN0aXZlU2NvcGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0LnNjb3BlSWQgPSB0aGlzLnN0YXRlLmFjdGl2ZVNjb3BlLmlkO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS5hY3RpdmVTY29wZS50cmFjay5wdXNoKHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZ2V0IHJlZ2lzdGVyZWRWYXJpYWJsZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLnJlZ2lzdGVyZWRWYXJpYWJsZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgZW5naW5lIHN0YXRlLiBSZW1vdmVzIGFsbCBiYWNrZW5kcyBidXQgZG9lcyBub3QgcmVtb3ZlXG4gICAgICogcmVnaXN0ZXJlZCBiYWNrZW5kIGZhY3Rvcmllcy5cbiAgICAgKi9cbiAgICByZXNldCgpIHtcbiAgICAgICAgLy8gTWFrZSBhbnkgcGVuZGluZyBwcm9taXNlIG9ic29sZXRlLlxuICAgICAgICB0aGlzLnBlbmRpbmdCYWNrZW5kSW5pdElkKys7XG4gICAgICAgIHRoaXMuc3RhdGUuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLkVOVi5yZXNldCgpO1xuICAgICAgICB0aGlzLnN0YXRlID0gbmV3IEVuZ2luZVN0YXRlKCk7XG4gICAgICAgIGZvciAoY29uc3QgYmFja2VuZE5hbWUgaW4gdGhpcy5yZWdpc3RyeSkge1xuICAgICAgICAgICAgdGhpcy5kaXNwb3NlUmVnaXN0ZXJlZEtlcm5lbHMoYmFja2VuZE5hbWUpO1xuICAgICAgICAgICAgdGhpcy5yZWdpc3RyeVtiYWNrZW5kTmFtZV0uZGlzcG9zZSgpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMucmVnaXN0cnlbYmFja2VuZE5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYmFja2VuZE5hbWUgPSBudWxsO1xuICAgICAgICB0aGlzLmJhY2tlbmRJbnN0YW5jZSA9IG51bGw7XG4gICAgICAgIHRoaXMucGVuZGluZ0JhY2tlbmRJbml0ID0gbnVsbDtcbiAgICB9XG59XG5FbmdpbmUubmV4dFRlbnNvcklkID0gMDtcbkVuZ2luZS5uZXh0VmFyaWFibGVJZCA9IDA7XG5mdW5jdGlvbiBvbmVzKHNoYXBlKSB7XG4gICAgY29uc3QgdmFsdWVzID0gbWFrZU9uZXNUeXBlZEFycmF5KHNpemVGcm9tU2hhcGUoc2hhcGUpLCAnZmxvYXQzMicpO1xuICAgIHJldHVybiBFTkdJTkUubWFrZVRlbnNvcih2YWx1ZXMsIHNoYXBlLCAnZmxvYXQzMicpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldE9yTWFrZUVuZ2luZSgpIHtcbiAgICBjb25zdCBucyA9IGdldEdsb2JhbE5hbWVzcGFjZSgpO1xuICAgIGlmIChucy5fdGZlbmdpbmUgPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBlbnZpcm9ubWVudCA9IG5ldyBFbnZpcm9ubWVudChucyk7XG4gICAgICAgIG5zLl90ZmVuZ2luZSA9IG5ldyBFbmdpbmUoZW52aXJvbm1lbnQpO1xuICAgIH1cbiAgICBzZXRFbnZpcm9ubWVudEdsb2JhbChucy5fdGZlbmdpbmUuRU5WKTtcbiAgICAvLyBUZWxsIHRoZSBjdXJyZW50IHRlbnNvciBpbnRlcmZhY2UgdGhhdCB0aGUgZ2xvYmFsIGVuZ2luZSBpcyByZXNwb25zaWJsZVxuICAgIC8vIGZvciB0cmFja2luZy5cbiAgICBzZXRUZW5zb3JUcmFja2VyKCgpID0+IG5zLl90ZmVuZ2luZSk7XG4gICAgcmV0dXJuIG5zLl90ZmVuZ2luZTtcbn1cbmV4cG9ydCBjb25zdCBFTkdJTkUgPSBnZXRPck1ha2VFbmdpbmUoKTtcbi8qKlxuICogQSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYWRkIG9wIGZvciB1c2Ugd2l0aGluIGVuZ2luZSBhbmQgdGFwZS5cbiAqXG4gKiBUaGlzIGFsbG93cyB1cyB0byBhdm9pZCBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgYmV0d2VlbiBhZGQudHMgYW5kIGVuZ2luZS5cbiAqIEl0IGlzIGV4cG9ydGVkIHRvIGJlIGF2YWlsYWJsZSBpbiB0YXBlIHRlc3RzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkKGEsIGIpIHtcbiAgICAvLyBXZSBkdXBsaWNhdGUgQWRkIGhlcmUgdG8gYXZvaWQgYSBjaXJjdWxhciBkZXBlbmRlbmN5IHdpdGggYWRkLnRzLlxuICAgIGNvbnN0IGlucHV0cyA9IHsgYSwgYiB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEFkZCwgaW5wdXRzKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVuZ2luZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBpc1Byb21pc2UgfSBmcm9tICcuL3V0aWxfYmFzZSc7XG4vLyBFeHBlY3RzIGZsYWdzIGZyb20gVVJMIGluIHRoZSBmb3JtYXQgP3RmanNmbGFncz1GTEFHMToxLEZMQUcyOnRydWUuXG5jb25zdCBURU5TT1JGTE9XSlNfRkxBR1NfUFJFRklYID0gJ3RmanNmbGFncyc7XG4vKipcbiAqIFRoZSBlbnZpcm9ubWVudCBjb250YWlucyBldmFsdWF0ZWQgZmxhZ3MgYXMgd2VsbCBhcyB0aGUgcmVnaXN0ZXJlZCBwbGF0Zm9ybS5cbiAqIFRoaXMgaXMgYWx3YXlzIHVzZWQgYXMgYSBnbG9iYWwgc2luZ2xldG9uIGFuZCBjYW4gYmUgcmV0cmlldmVkIHdpdGhcbiAqIGB0Zi5lbnYoKWAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0Vudmlyb25tZW50J31cbiAqL1xuZXhwb3J0IGNsYXNzIEVudmlyb25tZW50IHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWFueVxuICAgIGNvbnN0cnVjdG9yKGdsb2JhbCkge1xuICAgICAgICB0aGlzLmdsb2JhbCA9IGdsb2JhbDtcbiAgICAgICAgdGhpcy5mbGFncyA9IHt9O1xuICAgICAgICB0aGlzLmZsYWdSZWdpc3RyeSA9IHt9O1xuICAgICAgICB0aGlzLnVybEZsYWdzID0ge307XG4gICAgICAgIC8vIEphc21pbmUgc3BpZXMgb24gdGhpcyBpbiAnZW52aXJvbm1lbnRfdGVzdC50cydcbiAgICAgICAgdGhpcy5nZXRRdWVyeVBhcmFtcyA9IGdldFF1ZXJ5UGFyYW1zO1xuICAgICAgICB0aGlzLnBvcHVsYXRlVVJMRmxhZ3MoKTtcbiAgICB9XG4gICAgc2V0UGxhdGZvcm0ocGxhdGZvcm1OYW1lLCBwbGF0Zm9ybSkge1xuICAgICAgICBpZiAodGhpcy5wbGF0Zm9ybSAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFBsYXRmb3JtICR7dGhpcy5wbGF0Zm9ybU5hbWV9IGhhcyBhbHJlYWR5IGJlZW4gc2V0LiBgICtcbiAgICAgICAgICAgICAgICBgT3ZlcndyaXRpbmcgdGhlIHBsYXRmb3JtIHdpdGggJHtwbGF0Zm9ybX0uYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wbGF0Zm9ybU5hbWUgPSBwbGF0Zm9ybU5hbWU7XG4gICAgICAgIHRoaXMucGxhdGZvcm0gPSBwbGF0Zm9ybTtcbiAgICB9XG4gICAgcmVnaXN0ZXJGbGFnKGZsYWdOYW1lLCBldmFsdWF0aW9uRm4sIHNldEhvb2spIHtcbiAgICAgICAgdGhpcy5mbGFnUmVnaXN0cnlbZmxhZ05hbWVdID0geyBldmFsdWF0aW9uRm4sIHNldEhvb2sgfTtcbiAgICAgICAgLy8gT3ZlcnJpZGUgdGhlIGZsYWcgdmFsdWUgZnJvbSB0aGUgVVJMLiBUaGlzIGhhcyB0byBoYXBwZW4gaGVyZSBiZWNhdXNlIHRoZVxuICAgICAgICAvLyBlbnZpcm9ubWVudCBpcyBpbml0aWFsaXplZCBiZWZvcmUgZmxhZ3MgZ2V0IHJlZ2lzdGVyZWQuXG4gICAgICAgIGlmICh0aGlzLnVybEZsYWdzW2ZsYWdOYW1lXSAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBmbGFnVmFsdWUgPSB0aGlzLnVybEZsYWdzW2ZsYWdOYW1lXTtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgU2V0dGluZyBmZWF0dXJlIG92ZXJyaWRlIGZyb20gVVJMICR7ZmxhZ05hbWV9OiAke2ZsYWdWYWx1ZX0uYCk7XG4gICAgICAgICAgICB0aGlzLnNldChmbGFnTmFtZSwgZmxhZ1ZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBnZXRBc3luYyhmbGFnTmFtZSkge1xuICAgICAgICBpZiAoZmxhZ05hbWUgaW4gdGhpcy5mbGFncykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmxhZ3NbZmxhZ05hbWVdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmxhZ3NbZmxhZ05hbWVdID0gYXdhaXQgdGhpcy5ldmFsdWF0ZUZsYWcoZmxhZ05hbWUpO1xuICAgICAgICByZXR1cm4gdGhpcy5mbGFnc1tmbGFnTmFtZV07XG4gICAgfVxuICAgIGdldChmbGFnTmFtZSkge1xuICAgICAgICBpZiAoZmxhZ05hbWUgaW4gdGhpcy5mbGFncykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmxhZ3NbZmxhZ05hbWVdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZsYWdWYWx1ZSA9IHRoaXMuZXZhbHVhdGVGbGFnKGZsYWdOYW1lKTtcbiAgICAgICAgaWYgKGlzUHJvbWlzZShmbGFnVmFsdWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZsYWcgJHtmbGFnTmFtZX0gY2Fubm90IGJlIHN5bmNocm9ub3VzbHkgZXZhbHVhdGVkLiBgICtcbiAgICAgICAgICAgICAgICBgUGxlYXNlIHVzZSBnZXRBc3luYygpIGluc3RlYWQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mbGFnc1tmbGFnTmFtZV0gPSBmbGFnVmFsdWU7XG4gICAgICAgIHJldHVybiB0aGlzLmZsYWdzW2ZsYWdOYW1lXTtcbiAgICB9XG4gICAgZ2V0TnVtYmVyKGZsYWdOYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldChmbGFnTmFtZSk7XG4gICAgfVxuICAgIGdldEJvb2woZmxhZ05hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KGZsYWdOYW1lKTtcbiAgICB9XG4gICAgZ2V0RmxhZ3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZsYWdzO1xuICAgIH1cbiAgICAvLyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG4gICAgZ2V0IGZlYXR1cmVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mbGFncztcbiAgICB9XG4gICAgc2V0KGZsYWdOYW1lLCB2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5mbGFnUmVnaXN0cnlbZmxhZ05hbWVdID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHNldCBmbGFnICR7ZmxhZ05hbWV9IGFzIGl0IGhhcyBub3QgYmVlbiByZWdpc3RlcmVkLmApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmxhZ3NbZmxhZ05hbWVdID0gdmFsdWU7XG4gICAgICAgIGlmICh0aGlzLmZsYWdSZWdpc3RyeVtmbGFnTmFtZV0uc2V0SG9vayAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmZsYWdSZWdpc3RyeVtmbGFnTmFtZV0uc2V0SG9vayh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZXZhbHVhdGVGbGFnKGZsYWdOYW1lKSB7XG4gICAgICAgIGlmICh0aGlzLmZsYWdSZWdpc3RyeVtmbGFnTmFtZV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZXZhbHVhdGUgZmxhZyAnJHtmbGFnTmFtZX0nOiBubyBldmFsdWF0aW9uIGZ1bmN0aW9uIGZvdW5kLmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmZsYWdSZWdpc3RyeVtmbGFnTmFtZV0uZXZhbHVhdGlvbkZuKCk7XG4gICAgfVxuICAgIHNldEZsYWdzKGZsYWdzKSB7XG4gICAgICAgIHRoaXMuZmxhZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBmbGFncyk7XG4gICAgfVxuICAgIHJlc2V0KCkge1xuICAgICAgICB0aGlzLmZsYWdzID0ge307XG4gICAgICAgIHRoaXMudXJsRmxhZ3MgPSB7fTtcbiAgICAgICAgdGhpcy5wb3B1bGF0ZVVSTEZsYWdzKCk7XG4gICAgfVxuICAgIHBvcHVsYXRlVVJMRmxhZ3MoKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5nbG9iYWwgPT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5nbG9iYWwubG9jYXRpb24gPT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5nbG9iYWwubG9jYXRpb24uc2VhcmNoID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVybFBhcmFtcyA9IHRoaXMuZ2V0UXVlcnlQYXJhbXModGhpcy5nbG9iYWwubG9jYXRpb24uc2VhcmNoKTtcbiAgICAgICAgaWYgKFRFTlNPUkZMT1dKU19GTEFHU19QUkVGSVggaW4gdXJsUGFyYW1zKSB7XG4gICAgICAgICAgICBjb25zdCBrZXlWYWx1ZXMgPSB1cmxQYXJhbXNbVEVOU09SRkxPV0pTX0ZMQUdTX1BSRUZJWF0uc3BsaXQoJywnKTtcbiAgICAgICAgICAgIGtleVZhbHVlcy5mb3JFYWNoKGtleVZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBrZXlWYWx1ZS5zcGxpdCgnOicpO1xuICAgICAgICAgICAgICAgIHRoaXMudXJsRmxhZ3Nba2V5XSA9IHBhcnNlVmFsdWUoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRRdWVyeVBhcmFtcyhxdWVyeVN0cmluZykge1xuICAgIGNvbnN0IHBhcmFtcyA9IHt9O1xuICAgIHF1ZXJ5U3RyaW5nLnJlcGxhY2UoL1s/Jl0oW149PyZdKykoPzo9KFteJl0qKSk/L2csIChzLCAuLi50KSA9PiB7XG4gICAgICAgIGRlY29kZVBhcmFtKHBhcmFtcywgdFswXSwgdFsxXSk7XG4gICAgICAgIHJldHVybiB0LmpvaW4oJz0nKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcGFyYW1zO1xufVxuZnVuY3Rpb24gZGVjb2RlUGFyYW0ocGFyYW1zLCBuYW1lLCB2YWx1ZSkge1xuICAgIHBhcmFtc1tkZWNvZGVVUklDb21wb25lbnQobmFtZSldID0gZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlIHx8ICcnKTtcbn1cbmZ1bmN0aW9uIHBhcnNlVmFsdWUoZmxhZ05hbWUsIHZhbHVlKSB7XG4gICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICh2YWx1ZSA9PT0gJ3RydWUnIHx8IHZhbHVlID09PSAnZmFsc2UnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gJ3RydWUnO1xuICAgIH1cbiAgICBlbHNlIGlmIChgJHsrdmFsdWV9YCA9PT0gdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuICt2YWx1ZTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgcGFyc2UgdmFsdWUgZmxhZyB2YWx1ZSAke3ZhbHVlfSBmb3IgZmxhZyAke2ZsYWdOYW1lfS5gKTtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgY3VycmVudCBlbnZpcm9ubWVudCAoYSBnbG9iYWwgc2luZ2xldG9uKS5cbiAqXG4gKiBUaGUgZW52aXJvbm1lbnQgb2JqZWN0IGNvbnRhaW5zIHRoZSBldmFsdWF0ZWQgZmVhdHVyZSB2YWx1ZXMgYXMgd2VsbCBhcyB0aGVcbiAqIGFjdGl2ZSBwbGF0Zm9ybS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnRW52aXJvbm1lbnQnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZW52KCkge1xuICAgIHJldHVybiBFTlY7XG59XG5leHBvcnQgbGV0IEVOViA9IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gc2V0RW52aXJvbm1lbnRHbG9iYWwoZW52aXJvbm1lbnQpIHtcbiAgICBFTlYgPSBlbnZpcm9ubWVudDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVudmlyb25tZW50LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCAnLi9lbmdpbmUnO1xuaW1wb3J0ICogYXMgZGV2aWNlX3V0aWwgZnJvbSAnLi9kZXZpY2VfdXRpbCc7XG5pbXBvcnQgeyBlbnYgfSBmcm9tICcuL2Vudmlyb25tZW50JztcbmNvbnN0IEVOViA9IGVudigpO1xuLyoqXG4gKiBUaGlzIGZpbGUgY29udGFpbnMgZW52aXJvbm1lbnQtcmVsYXRlZCBmbGFnIHJlZ2lzdHJhdGlvbnMuXG4gKi9cbi8qKiBXaGV0aGVyIHRvIGVuYWJsZSBkZWJ1ZyBtb2RlLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnREVCVUcnLCAoKSA9PiBmYWxzZSwgZGVidWdWYWx1ZSA9PiB7XG4gICAgaWYgKGRlYnVnVmFsdWUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdEZWJ1Z2dpbmcgbW9kZSBpcyBPTi4gVGhlIG91dHB1dCBvZiBldmVyeSBtYXRoIGNhbGwgd2lsbCAnICtcbiAgICAgICAgICAgICdiZSBkb3dubG9hZGVkIHRvIENQVSBhbmQgY2hlY2tlZCBmb3IgTmFOcy4gJyArXG4gICAgICAgICAgICAnVGhpcyBzaWduaWZpY2FudGx5IGltcGFjdHMgcGVyZm9ybWFuY2UuJyk7XG4gICAgfVxufSk7XG4vKiogV2hldGhlciB3ZSBhcmUgaW4gYSBicm93c2VyIChhcyB2ZXJzdXMsIHNheSwgbm9kZS5qcykgZW52aXJvbm1lbnQuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdJU19CUk9XU0VSJywgKCkgPT4gZGV2aWNlX3V0aWwuaXNCcm93c2VyKCkpO1xuLyoqIFdoZXRoZXIgd2UgYXJlIGluIGEgYnJvd3NlciAoYXMgdmVyc3VzLCBzYXksIG5vZGUuanMpIGVudmlyb25tZW50LiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnSVNfTk9ERScsICgpID0+ICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcpICYmXG4gICAgKHR5cGVvZiBwcm9jZXNzLnZlcnNpb25zICE9PSAndW5kZWZpbmVkJykgJiZcbiAgICAodHlwZW9mIHByb2Nlc3MudmVyc2lvbnMubm9kZSAhPT0gJ3VuZGVmaW5lZCcpKTtcbi8qKiBXaGV0aGVyIHRoaXMgYnJvd3NlciBpcyBDaHJvbWUuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdJU19DSFJPTUUnLCAoKSA9PiB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IgIT0gbnVsbCAmJlxuICAgIG5hdmlnYXRvci51c2VyQWdlbnQgIT0gbnVsbCAmJiAvQ2hyb21lLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpICYmXG4gICAgL0dvb2dsZSBJbmMvLnRlc3QobmF2aWdhdG9yLnZlbmRvcikpO1xuLyoqXG4gKiBUcnVlIHdoZW4gdGhlIGVudmlyb25tZW50IGlzIFwicHJvZHVjdGlvblwiIHdoZXJlIHdlIGRpc2FibGUgc2FmZXR5IGNoZWNrc1xuICogdG8gZ2FpbiBwZXJmb3JtYW5jZS5cbiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnUFJPRCcsICgpID0+IGZhbHNlKTtcbi8qKlxuICogV2hldGhlciB0byBkbyBzYW5pdHkgY2hlY2tzIHdoZW4gaW5mZXJyaW5nIGEgc2hhcGUgZnJvbSB1c2VyLXByb3ZpZGVkXG4gKiB2YWx1ZXMsIHVzZWQgd2hlbiBjcmVhdGluZyBhIG5ldyB0ZW5zb3IuXG4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1RFTlNPUkxJS0VfQ0hFQ0tfU0hBUEVfQ09OU0lTVEVOQ1knLCAoKSA9PiBFTlYuZ2V0Qm9vbCgnREVCVUcnKSk7XG4vKiogV2hldGhlciBkZXByZWNhdGlvbiB3YXJuaW5ncyBhcmUgZW5hYmxlZC4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ0RFUFJFQ0FUSU9OX1dBUk5JTkdTX0VOQUJMRUQnLCAoKSA9PiB0cnVlKTtcbi8qKiBUcnVlIGlmIHJ1bm5pbmcgdW5pdCB0ZXN0cy4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ0lTX1RFU1QnLCAoKSA9PiBmYWxzZSk7XG4vKiogV2hldGhlciB0byBjaGVjayBjb21wdXRhdGlvbiByZXN1bHQgZm9yIGVycm9ycy4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ0NIRUNLX0NPTVBVVEFUSU9OX0ZPUl9FUlJPUlMnLCAoKSA9PiB0cnVlKTtcbi8qKiBXaGV0aGVyIHRoZSBiYWNrZW5kIG5lZWRzIHRvIHdyYXAgaW5wdXQgdG8gaW1hZ2VCaXRtYXAuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdXUkFQX1RPX0lNQUdFQklUTUFQJywgKCkgPT4gZmFsc2UpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmxhZ3MuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLy8gTm90ZSB0aGF0IHRoZSBpZGVudGlmaWVyIGdsb2JhbE5hbWVTcGFjZSBpcyBzY29wZWQgdG8gdGhpcyBtb2R1bGUsIGJ1dCB3aWxsXG4vLyBhbHdheXMgcmVzb2x2ZSB0byB0aGUgc2FtZSBnbG9iYWwgb2JqZWN0IHJlZ2FyZGxlc3Mgb2YgaG93IHRoZSBtb2R1bGUgaXNcbi8vIHJlc29sdmVkLlxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxubGV0IGdsb2JhbE5hbWVTcGFjZTtcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbmV4cG9ydCBmdW5jdGlvbiBnZXRHbG9iYWxOYW1lc3BhY2UoKSB7XG4gICAgaWYgKGdsb2JhbE5hbWVTcGFjZSA9PSBudWxsKSB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICAgICAgbGV0IG5zO1xuICAgICAgICBpZiAodHlwZW9mICh3aW5kb3cpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgbnMgPSB3aW5kb3c7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIChnbG9iYWwpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgbnMgPSBnbG9iYWw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIChwcm9jZXNzKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIG5zID0gcHJvY2VzcztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgKHNlbGYpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgbnMgPSBzZWxmO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCBhIGdsb2JhbCBvYmplY3QnKTtcbiAgICAgICAgfVxuICAgICAgICBnbG9iYWxOYW1lU3BhY2UgPSBucztcbiAgICB9XG4gICAgcmV0dXJuIGdsb2JhbE5hbWVTcGFjZTtcbn1cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbmZ1bmN0aW9uIGdldEdsb2JhbE1hcCgpIHtcbiAgICBjb25zdCBucyA9IGdldEdsb2JhbE5hbWVzcGFjZSgpO1xuICAgIGlmIChucy5fdGZHbG9iYWxzID09IG51bGwpIHtcbiAgICAgICAgbnMuX3RmR2xvYmFscyA9IG5ldyBNYXAoKTtcbiAgICB9XG4gICAgcmV0dXJuIG5zLl90Zkdsb2JhbHM7XG59XG4vKipcbiAqIFJldHVybnMgYSBnbG9iYWxseSBhY2Nlc3NpYmxlICdzaW5nbGV0b24nIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ga2V5IHRoZSBuYW1lIG9mIHRoZSBvYmplY3RcbiAqIEBwYXJhbSBpbml0IGEgZnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSB0byBpbml0aWFsaXplIHRoaXMgb2JqZWN0XG4gKiAgICAgICAgICAgICB0aGUgZmlyc3QgdGltZSBpdCBpcyBmZXRjaGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2xvYmFsKGtleSwgaW5pdCkge1xuICAgIGNvbnN0IGdsb2JhbE1hcCA9IGdldEdsb2JhbE1hcCgpO1xuICAgIGlmIChnbG9iYWxNYXAuaGFzKGtleSkpIHtcbiAgICAgICAgcmV0dXJuIGdsb2JhbE1hcC5nZXQoa2V5KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IHNpbmdsZXRvbiA9IGluaXQoKTtcbiAgICAgICAgZ2xvYmFsTWFwLnNldChrZXksIHNpbmdsZXRvbik7XG4gICAgICAgIHJldHVybiBnbG9iYWxNYXAuZ2V0KGtleSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2xvYmFsX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi9lbmdpbmUnO1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBzZXREZXByZWNhdGlvbldhcm5pbmdGbiB9IGZyb20gJy4vdGVuc29yJztcbmltcG9ydCB7IGdldFRlbnNvcnNJbkNvbnRhaW5lciB9IGZyb20gJy4vdGVuc29yX3V0aWwnO1xuLyoqXG4gKiBFbmFibGVzIHByb2R1Y3Rpb24gbW9kZSB3aGljaCBkaXNhYmxlcyBjb3JyZWN0bmVzcyBjaGVja3MgaW4gZmF2b3Igb2ZcbiAqIHBlcmZvcm1hbmNlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdFbnZpcm9ubWVudCd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmFibGVQcm9kTW9kZSgpIHtcbiAgICBlbnYoKS5zZXQoJ1BST0QnLCB0cnVlKTtcbn1cbi8qKlxuICogRW5hYmxlcyBkZWJ1ZyBtb2RlIHdoaWNoIHdpbGwgbG9nIGluZm9ybWF0aW9uIGFib3V0IGFsbCBleGVjdXRlZCBrZXJuZWxzOlxuICogdGhlIGVsYXBzZWQgdGltZSBvZiB0aGUga2VybmVsIGV4ZWN1dGlvbiwgYXMgd2VsbCBhcyB0aGUgcmFuaywgc2hhcGUsIGFuZFxuICogc2l6ZSBvZiB0aGUgb3V0cHV0IHRlbnNvci5cbiAqXG4gKiBEZWJ1ZyBtb2RlIHdpbGwgc2lnbmlmaWNhbnRseSBzbG93IGRvd24geW91ciBhcHBsaWNhdGlvbiBhcyBpdCB3aWxsXG4gKiBkb3dubG9hZCB0aGUgcmVzdWx0IG9mIGV2ZXJ5IG9wZXJhdGlvbiB0byB0aGUgQ1BVLiBUaGlzIHNob3VsZCBub3QgYmUgdXNlZCBpblxuICogcHJvZHVjdGlvbi4gRGVidWcgbW9kZSBkb2VzIG5vdCBhZmZlY3QgdGhlIHRpbWluZyBpbmZvcm1hdGlvbiBvZiB0aGUga2VybmVsXG4gKiBleGVjdXRpb24gYXMgd2UgZG8gbm90IG1lYXN1cmUgZG93bmxvYWQgdGltZSBpbiB0aGUga2VybmVsIGV4ZWN1dGlvbiB0aW1lLlxuICpcbiAqIFNlZSBhbHNvOiBgdGYucHJvZmlsZWAsIGB0Zi5tZW1vcnlgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdFbnZpcm9ubWVudCd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmFibGVEZWJ1Z01vZGUoKSB7XG4gICAgZW52KCkuc2V0KCdERUJVRycsIHRydWUpO1xufVxuLyoqIEdsb2JhbGx5IGRpc2FibGVzIGRlcHJlY2F0aW9uIHdhcm5pbmdzICovXG5leHBvcnQgZnVuY3Rpb24gZGlzYWJsZURlcHJlY2F0aW9uV2FybmluZ3MoKSB7XG4gICAgZW52KCkuc2V0KCdERVBSRUNBVElPTl9XQVJOSU5HU19FTkFCTEVEJywgZmFsc2UpO1xuICAgIGNvbnNvbGUud2FybihgVGVuc29yRmxvdy5qcyBkZXByZWNhdGlvbiB3YXJuaW5ncyBoYXZlIGJlZW4gZGlzYWJsZWQuYCk7XG59XG4vKiogV2FybiB1c2VycyBhYm91dCBkZXByZWNhdGVkIGZ1bmN0aW9uYWxpdHkuICovXG5leHBvcnQgZnVuY3Rpb24gZGVwcmVjYXRpb25XYXJuKG1zZykge1xuICAgIGlmIChlbnYoKS5nZXRCb29sKCdERVBSRUNBVElPTl9XQVJOSU5HU19FTkFCTEVEJykpIHtcbiAgICAgICAgY29uc29sZS53YXJuKG1zZyArICcgWW91IGNhbiBkaXNhYmxlIGRlcHJlY2F0aW9uIHdhcm5pbmdzIHdpdGggJyArXG4gICAgICAgICAgICAndGYuZGlzYWJsZURlcHJlY2F0aW9uV2FybmluZ3MoKS4nKTtcbiAgICB9XG59XG5zZXREZXByZWNhdGlvbldhcm5pbmdGbihkZXByZWNhdGlvbldhcm4pO1xuLyoqXG4gKiBEaXNwb3NlIGFsbCB2YXJpYWJsZXMga2VwdCBpbiBiYWNrZW5kIGVuZ2luZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnRW52aXJvbm1lbnQnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzcG9zZVZhcmlhYmxlcygpIHtcbiAgICBFTkdJTkUuZGlzcG9zZVZhcmlhYmxlcygpO1xufVxuLyoqXG4gKiBJdCByZXR1cm5zIHRoZSBnbG9iYWwgZW5naW5lIHRoYXQga2VlcHMgdHJhY2sgb2YgYWxsIHRlbnNvcnMgYW5kIGJhY2tlbmRzLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdFbnZpcm9ubWVudCd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmdpbmUoKSB7XG4gICAgcmV0dXJuIEVOR0lORTtcbn1cbi8qKlxuICogUmV0dXJucyBtZW1vcnkgaW5mbyBhdCB0aGUgY3VycmVudCB0aW1lIGluIHRoZSBwcm9ncmFtLiBUaGUgcmVzdWx0IGlzIGFuXG4gKiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogLSBgbnVtQnl0ZXNgOiBOdW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkICh1bmRpc3Bvc2VkKSBhdCB0aGlzIHRpbWUuXG4gKiAtIGBudW1UZW5zb3JzYDogTnVtYmVyIG9mIHVuaXF1ZSB0ZW5zb3JzIGFsbG9jYXRlZC5cbiAqIC0gYG51bURhdGFCdWZmZXJzYDogTnVtYmVyIG9mIHVuaXF1ZSBkYXRhIGJ1ZmZlcnMgYWxsb2NhdGVkXG4gKiAgICh1bmRpc3Bvc2VkKSBhdCB0aGlzIHRpbWUsIHdoaWNoIGlzIOKJpCB0aGUgbnVtYmVyIG9mIHRlbnNvcnNcbiAqICAgKGUuZy4gYGEucmVzaGFwZShuZXdTaGFwZSlgIG1ha2VzIGEgbmV3IFRlbnNvciB0aGF0IHNoYXJlcyB0aGUgc2FtZVxuICogICBkYXRhIGJ1ZmZlciB3aXRoIGBhYCkuXG4gKiAtIGB1bnJlbGlhYmxlYDogVHJ1ZSBpZiB0aGUgbWVtb3J5IHVzYWdlIGlzIHVucmVsaWFibGUuIFNlZSBgcmVhc29uc2Agd2hlblxuICogICAgYHVucmVsaWFibGVgIGlzIHRydWUuXG4gKiAtIGByZWFzb25zYDogYHN0cmluZ1tdYCwgcmVhc29ucyB3aHkgdGhlIG1lbW9yeSBpcyB1bnJlbGlhYmxlLCBwcmVzZW50IGlmXG4gKiAgICBgdW5yZWxpYWJsZWAgaXMgdHJ1ZS5cbiAqXG4gKiBXZWJHTCBQcm9wZXJ0aWVzOlxuICogLSBgbnVtQnl0ZXNJbkdQVWA6IE51bWJlciBvZiBieXRlcyBhbGxvY2F0ZWQgKHVuZGlzcG9zZWQpIGluIHRoZSBHUFUgb25seSBhdFxuICogICAgIHRoaXMgdGltZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnUGVyZm9ybWFuY2UnLCBzdWJoZWFkaW5nOiAnTWVtb3J5J31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lbW9yeSgpIHtcbiAgICByZXR1cm4gRU5HSU5FLm1lbW9yeSgpO1xufVxuLyoqXG4gKiBFeGVjdXRlcyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gYGYoKWAgYW5kIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXNcbiAqIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZ1bmN0aW9uJ3MgbWVtb3J5IHVzZTpcbiAqIC0gYG5ld0J5dGVzYDogdGhlIG51bWJlciBvZiBuZXcgYnl0ZXMgYWxsb2NhdGVkXG4gKiAtIGBuZXdUZW5zb3JzYDogdGhlIG51bWJlciBvZiBuZXcgdGVuc29ycyBjcmVhdGVkXG4gKiAtIGBwZWFrQnl0ZXNgOiB0aGUgcGVhayBudW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkXG4gKiAtIGBrZXJuZWxzYDogYW4gYXJyYXkgb2Ygb2JqZWN0cyBmb3IgZWFjaCBrZXJuZWwgaW52b2x2ZWQgdGhhdCByZXBvcnRzXG4gKiB0aGVpciBpbnB1dCBhbmQgb3V0cHV0IHNoYXBlcywgbnVtYmVyIG9mIGJ5dGVzIHVzZWQsIGFuZCBudW1iZXIgb2YgbmV3XG4gKiB0ZW5zb3JzIGNyZWF0ZWQuXG4gKiAtIGBrZXJuZWxOYW1lc2A6IGFuIGFycmF5IG9mIHVuaXF1ZSBzdHJpbmdzIHdpdGgganVzdCB0aGUgbmFtZXMgb2YgdGhlXG4gKiBrZXJuZWxzIGluIHRoZSBga2VybmVsc2AgYXJyYXkuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHByb2ZpbGUgPSBhd2FpdCB0Zi5wcm9maWxlKCgpID0+IHtcbiAqICAgY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKiAgIGxldCB4MiA9IHguc3F1YXJlKCk7XG4gKiAgIHgyLmRpc3Bvc2UoKTtcbiAqICAgeDIgPSB4LnNxdWFyZSgpO1xuICogICB4Mi5kaXNwb3NlKCk7XG4gKiAgIHJldHVybiB4O1xuICogfSk7XG4gKlxuICogY29uc29sZS5sb2coYG5ld0J5dGVzOiAke3Byb2ZpbGUubmV3Qnl0ZXN9YCk7XG4gKiBjb25zb2xlLmxvZyhgbmV3VGVuc29yczogJHtwcm9maWxlLm5ld1RlbnNvcnN9YCk7XG4gKiBjb25zb2xlLmxvZyhgYnl0ZSB1c2FnZSBvdmVyIGFsbCBrZXJuZWxzOiAke3Byb2ZpbGUua2VybmVscy5tYXAoayA9PlxuICogay50b3RhbEJ5dGVzU25hcHNob3QpfWApO1xuICogYGBgXG4gKlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdQZXJmb3JtYW5jZScsIHN1YmhlYWRpbmc6ICdQcm9maWxlJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb2ZpbGUoZikge1xuICAgIHJldHVybiBFTkdJTkUucHJvZmlsZShmKTtcbn1cbi8qKlxuICogRXhlY3V0ZXMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIGBmbmAgYW5kIGFmdGVyIGl0IGlzIGV4ZWN1dGVkLCBjbGVhbnMgdXAgYWxsXG4gKiBpbnRlcm1lZGlhdGUgdGVuc29ycyBhbGxvY2F0ZWQgYnkgYGZuYCBleGNlcHQgdGhvc2UgcmV0dXJuZWQgYnkgYGZuYC5cbiAqIGBmbmAgbXVzdCBub3QgcmV0dXJuIGEgUHJvbWlzZSAoYXN5bmMgZnVuY3Rpb25zIG5vdCBhbGxvd2VkKS4gVGhlIHJldHVybmVkXG4gKiByZXN1bHQgY2FuIGJlIGEgY29tcGxleCBvYmplY3QuXG4gKlxuICogVXNpbmcgdGhpcyBtZXRob2QgaGVscHMgYXZvaWQgbWVtb3J5IGxlYWtzLiBJbiBnZW5lcmFsLCB3cmFwIGNhbGxzIHRvXG4gKiBvcGVyYXRpb25zIGluIGB0Zi50aWR5YCBmb3IgYXV0b21hdGljIG1lbW9yeSBjbGVhbnVwLlxuICpcbiAqIE5PVEU6IFZhcmlhYmxlcyBkbyAqbm90KiBnZXQgY2xlYW5lZCB1cCB3aGVuIGluc2lkZSBhIHRpZHkoKS4gSWYgeW91IHdhbnQgdG9cbiAqIGRpc3Bvc2UgdmFyaWFibGVzLCBwbGVhc2UgdXNlIGB0Zi5kaXNwb3NlVmFyaWFibGVzYCBvciBjYWxsIGRpc3Bvc2UoKVxuICogZGlyZWN0bHkgb24gdmFyaWFibGVzLlxuICpcbiAqIGBgYGpzXG4gKiAvLyB5ID0gMiBeIDIgKyAxXG4gKiBjb25zdCB5ID0gdGYudGlkeSgoKSA9PiB7XG4gKiAgIC8vIGEsIGIsIGFuZCBvbmUgd2lsbCBiZSBjbGVhbmVkIHVwIHdoZW4gdGhlIHRpZHkgZW5kcy5cbiAqICAgY29uc3Qgb25lID0gdGYuc2NhbGFyKDEpO1xuICogICBjb25zdCBhID0gdGYuc2NhbGFyKDIpO1xuICogICBjb25zdCBiID0gYS5zcXVhcmUoKTtcbiAqXG4gKiAgIGNvbnNvbGUubG9nKCdudW1UZW5zb3JzIChpbiB0aWR5KTogJyArIHRmLm1lbW9yeSgpLm51bVRlbnNvcnMpO1xuICpcbiAqICAgLy8gVGhlIHZhbHVlIHJldHVybmVkIGluc2lkZSB0aGUgdGlkeSBmdW5jdGlvbiB3aWxsIHJldHVyblxuICogICAvLyB0aHJvdWdoIHRoZSB0aWR5LCBpbiB0aGlzIGNhc2UgdG8gdGhlIHZhcmlhYmxlIHkuXG4gKiAgIHJldHVybiBiLmFkZChvbmUpO1xuICogfSk7XG4gKlxuICogY29uc29sZS5sb2coJ251bVRlbnNvcnMgKG91dHNpZGUgdGlkeSk6ICcgKyB0Zi5tZW1vcnkoKS5udW1UZW5zb3JzKTtcbiAqIHkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBuYW1lT3JGbiBUaGUgbmFtZSBvZiB0aGUgY2xvc3VyZSwgb3IgdGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUuXG4gKiAgICAgSWYgYSBuYW1lIGlzIHByb3ZpZGVkLCB0aGUgMm5kIGFyZ3VtZW50IHNob3VsZCBiZSB0aGUgZnVuY3Rpb24uXG4gKiAgICAgSWYgZGVidWcgbW9kZSBpcyBvbiwgdGhlIHRpbWluZyBhbmQgdGhlIG1lbW9yeSB1c2FnZSBvZiB0aGUgZnVuY3Rpb25cbiAqICAgICB3aWxsIGJlIHRyYWNrZWQgYW5kIGRpc3BsYXllZCBvbiB0aGUgY29uc29sZSB1c2luZyB0aGUgcHJvdmlkZWQgbmFtZS5cbiAqIEBwYXJhbSBmbiBUaGUgZnVuY3Rpb24gdG8gZXhlY3V0ZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnUGVyZm9ybWFuY2UnLCBzdWJoZWFkaW5nOiAnTWVtb3J5J31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRpZHkobmFtZU9yRm4sIGZuKSB7XG4gICAgcmV0dXJuIEVOR0lORS50aWR5KG5hbWVPckZuLCBmbik7XG59XG4vKipcbiAqIERpc3Bvc2VzIGFueSBgdGYuVGVuc29yYHMgZm91bmQgd2l0aGluIHRoZSBwcm92aWRlZCBvYmplY3QuXG4gKlxuICogQHBhcmFtIGNvbnRhaW5lciBhbiBvYmplY3QgdGhhdCBtYXkgYmUgYSBgdGYuVGVuc29yYCBvciBtYXkgZGlyZWN0bHlcbiAqICAgICBjb250YWluIGB0Zi5UZW5zb3Jgcywgc3VjaCBhcyBhIGBUZW5zb3JbXWAgb3IgYHtrZXk6IFRlbnNvciwgLi4ufWAuIElmXG4gKiAgICAgdGhlIG9iamVjdCBpcyBub3QgYSBgdGYuVGVuc29yYCBvciBkb2VzIG5vdCBjb250YWluIGBUZW5zb3JzYCwgbm90aGluZ1xuICogICAgIGhhcHBlbnMuIEluIGdlbmVyYWwgaXQgaXMgc2FmZSB0byBwYXNzIGFueSBvYmplY3QgaGVyZSwgZXhjZXB0IHRoYXRcbiAqICAgICBgUHJvbWlzZWBzIGFyZSBub3Qgc3VwcG9ydGVkLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdQZXJmb3JtYW5jZScsIHN1YmhlYWRpbmc6ICdNZW1vcnknfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzcG9zZShjb250YWluZXIpIHtcbiAgICBjb25zdCB0ZW5zb3JzID0gZ2V0VGVuc29yc0luQ29udGFpbmVyKGNvbnRhaW5lcik7XG4gICAgdGVuc29ycy5mb3JFYWNoKHRlbnNvciA9PiB0ZW5zb3IuZGlzcG9zZSgpKTtcbn1cbi8qKlxuICogS2VlcHMgYSBgdGYuVGVuc29yYCBnZW5lcmF0ZWQgaW5zaWRlIGEgYHRmLnRpZHlgIGZyb20gYmVpbmcgZGlzcG9zZWRcbiAqIGF1dG9tYXRpY2FsbHkuXG4gKlxuICogYGBganNcbiAqIGxldCBiO1xuICogY29uc3QgeSA9IHRmLnRpZHkoKCkgPT4ge1xuICogICBjb25zdCBvbmUgPSB0Zi5zY2FsYXIoMSk7XG4gKiAgIGNvbnN0IGEgPSB0Zi5zY2FsYXIoMik7XG4gKlxuICogICAvLyBiIHdpbGwgbm90IGJlIGNsZWFuZWQgdXAgYnkgdGhlIHRpZHkuIGEgYW5kIG9uZSB3aWxsIGJlIGNsZWFuZWQgdXBcbiAqICAgLy8gd2hlbiB0aGUgdGlkeSBlbmRzLlxuICogICBiID0gdGYua2VlcChhLnNxdWFyZSgpKTtcbiAqXG4gKiAgIGNvbnNvbGUubG9nKCdudW1UZW5zb3JzIChpbiB0aWR5KTogJyArIHRmLm1lbW9yeSgpLm51bVRlbnNvcnMpO1xuICpcbiAqICAgLy8gVGhlIHZhbHVlIHJldHVybmVkIGluc2lkZSB0aGUgdGlkeSBmdW5jdGlvbiB3aWxsIHJldHVyblxuICogICAvLyB0aHJvdWdoIHRoZSB0aWR5LCBpbiB0aGlzIGNhc2UgdG8gdGhlIHZhcmlhYmxlIHkuXG4gKiAgIHJldHVybiBiLmFkZChvbmUpO1xuICogfSk7XG4gKlxuICogY29uc29sZS5sb2coJ251bVRlbnNvcnMgKG91dHNpZGUgdGlkeSk6ICcgKyB0Zi5tZW1vcnkoKS5udW1UZW5zb3JzKTtcbiAqIGNvbnNvbGUubG9nKCd5OicpO1xuICogeS5wcmludCgpO1xuICogY29uc29sZS5sb2coJ2I6Jyk7XG4gKiBiLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gcmVzdWx0IFRoZSB0ZW5zb3IgdG8ga2VlcCBmcm9tIGJlaW5nIGRpc3Bvc2VkLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdQZXJmb3JtYW5jZScsIHN1YmhlYWRpbmc6ICdNZW1vcnknfVxuICovXG5leHBvcnQgZnVuY3Rpb24ga2VlcChyZXN1bHQpIHtcbiAgICByZXR1cm4gRU5HSU5FLmtlZXAocmVzdWx0KTtcbn1cbi8qKlxuICogRXhlY3V0ZXMgYGYoKWAgYW5kIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aW1pbmdcbiAqIGluZm9ybWF0aW9uLlxuICpcbiAqIFRoZSByZXN1bHQgaXMgYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqIC0gYHdhbGxNc2A6IFdhbGwgZXhlY3V0aW9uIHRpbWUuXG4gKiAtIGBrZXJuZWxNc2A6IEtlcm5lbCBleGVjdXRpb24gdGltZSwgaWdub3JpbmcgZGF0YSB0cmFuc2Zlci4gSWYgdXNpbmcgdGhlXG4gKiBXZWJHTCBiYWNrZW5kIGFuZCB0aGUgcXVlcnkgdGltZXIgZXh0ZW5zaW9uIGlzIG5vdCBhdmFpbGFibGUsIHRoaXMgd2lsbFxuICogcmV0dXJuIGFuIGVycm9yIG9iamVjdC5cbiAqIC0gT24gYFdlYkdMYCBUaGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgcHJvcGVydGllcyBleGlzdDpcbiAqICAgLSBgdXBsb2FkV2FpdE1zYDogQ1BVIGJsb2NraW5nIHRpbWUgb24gdGV4dHVyZSB1cGxvYWRzLlxuICogICAtIGBkb3dubG9hZFdhaXRNc2A6IENQVSBibG9ja2luZyB0aW1lIG9uIHRleHR1cmUgZG93bmxvYWRzIChyZWFkUGl4ZWxzKS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnJhbmRvbU5vcm1hbChbMjAsIDIwXSk7XG4gKiBjb25zdCB0aW1lID0gYXdhaXQgdGYudGltZSgoKSA9PiB4Lm1hdE11bCh4KSk7XG4gKlxuICogY29uc29sZS5sb2coYGtlcm5lbE1zOiAke3RpbWUua2VybmVsTXN9LCB3YWxsVGltZU1zOiAke3RpbWUud2FsbE1zfWApO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGYgVGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgYW5kIHRpbWUuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1BlcmZvcm1hbmNlJywgc3ViaGVhZGluZzogJ1RpbWluZyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aW1lKGYpIHtcbiAgICByZXR1cm4gRU5HSU5FLnRpbWUoZik7XG59XG4vKipcbiAqIFNldHMgdGhlIGJhY2tlbmQgKGNwdSwgd2ViZ2wsIHdhc20sIGV0YykgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRlbnNvcnMgYW5kXG4gKiBleGVjdXRpbmcgb3BlcmF0aW9ucyBvbiB0aG9zZSB0ZW5zb3JzLiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzXG4gKiB0byBhIGJvb2xlYW4gaWYgdGhlIGJhY2tlbmQgaW5pdGlhbGl6YXRpb24gd2FzIHN1Y2Nlc3NmdWwuXG4gKlxuICogTm90ZSB0aGlzIGRpc3Bvc2VzIHRoZSBjdXJyZW50IGJhY2tlbmQsIGlmIGFueSwgYXMgd2VsbCBhcyBhbnkgdGVuc29yc1xuICogYXNzb2NpYXRlZCB3aXRoIGl0LiBBIG5ldyBiYWNrZW5kIGlzIGluaXRpYWxpemVkLCBldmVuIGlmIGl0IGlzIG9mIHRoZVxuICogc2FtZSB0eXBlIGFzIHRoZSBwcmV2aW91cyBvbmUuXG4gKlxuICogQHBhcmFtIGJhY2tlbmROYW1lIFRoZSBuYW1lIG9mIHRoZSBiYWNrZW5kLiBDdXJyZW50bHkgc3VwcG9ydHNcbiAqICAgICBgJ3dlYmdsJ3wnY3B1J2AgaW4gdGhlIGJyb3dzZXIsIGAndGVuc29yZmxvdydgIHVuZGVyIG5vZGUuanNcbiAqICAgICAocmVxdWlyZXMgdGZqcy1ub2RlKSwgYW5kIGAnd2FzbSdgIChyZXF1aXJlcyB0ZmpzLWJhY2tlbmQtd2FzbSkuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0JhY2tlbmRzJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEJhY2tlbmQoYmFja2VuZE5hbWUpIHtcbiAgICByZXR1cm4gRU5HSU5FLnNldEJhY2tlbmQoYmFja2VuZE5hbWUpO1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBiYWNrZW5kIChvciB0aGVcbiAqIGhpZ2hlc3QgcHJpb3JpdHkgb25lKSBoYXMgaW5pdGlhbGl6ZWQuIEF3YWl0IHRoaXMgcHJvbWlzZSB3aGVuIHlvdSBhcmUgdXNpbmdcbiAqIGEgYmFja2VuZCB0aGF0IGhhcyBhc3luYyBpbml0aWFsaXphdGlvbi5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnQmFja2VuZHMnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZHkoKSB7XG4gICAgcmV0dXJuIEVOR0lORS5yZWFkeSgpO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjdXJyZW50IGJhY2tlbmQgbmFtZSAoY3B1LCB3ZWJnbCwgZXRjKS4gVGhlIGJhY2tlbmQgaXNcbiAqIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0ZW5zb3JzIGFuZCBleGVjdXRpbmcgb3BlcmF0aW9ucyBvbiB0aG9zZSB0ZW5zb3JzLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdCYWNrZW5kcyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRCYWNrZW5kKCkge1xuICAgIHJldHVybiBFTkdJTkUuYmFja2VuZE5hbWU7XG59XG4vKipcbiAqIFJlbW92ZXMgYSBiYWNrZW5kIGFuZCB0aGUgcmVnaXN0ZXJlZCBmYWN0b3J5LlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdCYWNrZW5kcyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVCYWNrZW5kKG5hbWUpIHtcbiAgICBFTkdJTkUucmVtb3ZlQmFja2VuZChuYW1lKTtcbn1cbi8qKlxuICogRmluZHMgdGhlIGJhY2tlbmQgcmVnaXN0ZXJlZCB1bmRlciB0aGUgcHJvdmlkZWQgbmFtZS4gUmV0dXJucyBudWxsIGlmIHRoZVxuICogbmFtZSBpcyBub3QgaW4gdGhlIHJlZ2lzdHJ5LCBvciB0aGUgcmVnaXN0cmF0aW9uIGhhc24ndCBmaW5pc2hlZCB5ZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQmFja2VuZChuYW1lKSB7XG4gICAgcmV0dXJuIEVOR0lORS5maW5kQmFja2VuZChuYW1lKTtcbn1cbi8qKlxuICogRmluZHMgdGhlIGJhY2tlbmQgZmFjdG9yeSByZWdpc3RlcmVkIHVuZGVyIHRoZSBwcm92aWRlZCBuYW1lLiBSZXR1cm5zIGFcbiAqIGZ1bmN0aW9uIHRoYXQgcHJvZHVjZXMgYSBuZXcgYmFja2VuZCB3aGVuIGNhbGxlZC4gUmV0dXJucyBudWxsIGlmIHRoZSBuYW1lXG4gKiBpcyBub3QgaW4gdGhlIHJlZ2lzdHJ5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZEJhY2tlbmRGYWN0b3J5KG5hbWUpIHtcbiAgICByZXR1cm4gRU5HSU5FLmZpbmRCYWNrZW5kRmFjdG9yeShuYW1lKTtcbn1cbi8qKlxuICogUmVnaXN0ZXJzIGEgZ2xvYmFsIGJhY2tlbmQuIFRoZSByZWdpc3RyYXRpb24gc2hvdWxkIGhhcHBlbiB3aGVuIGltcG9ydGluZ1xuICogYSBtb2R1bGUgZmlsZSAoZS5nLiB3aGVuIGltcG9ydGluZyBgYmFja2VuZF93ZWJnbC50c2ApLCBhbmQgaXMgdXNlZCBmb3JcbiAqIG1vZHVsYXIgYnVpbGRzIChlLmcuIGN1c3RvbSB0ZmpzIGJ1bmRsZSB3aXRoIG9ubHkgd2ViZ2wgc3VwcG9ydCkuXG4gKlxuICogQHBhcmFtIGZhY3RvcnkgVGhlIGJhY2tlbmQgZmFjdG9yeSBmdW5jdGlvbi4gV2hlbiBjYWxsZWQsIGl0IHNob3VsZFxuICogcmV0dXJuIGEgYmFja2VuZCBpbnN0YW5jZSwgb3IgYSBwcm9taXNlIG9mIGFuIGluc3RhbmNlLlxuICogQHBhcmFtIHByaW9yaXR5IFRoZSBwcmlvcml0eSBvZiB0aGUgYmFja2VuZCAoaGlnaGVyID0gbW9yZSBpbXBvcnRhbnQpLlxuICogICAgIEluIGNhc2UgbXVsdGlwbGUgYmFja2VuZHMgYXJlIHJlZ2lzdGVyZWQsIHRoZSBwcmlvcml0eSBpcyB1c2VkIHRvIGZpbmRcbiAqICAgICB0aGUgYmVzdCBiYWNrZW5kLiBEZWZhdWx0cyB0byAxLlxuICogQHJldHVybiBGYWxzZSBpZiB0aGVyZSBpcyBhbHJlYWR5IGEgcmVnaXN0ZXJlZCBiYWNrZW5kIHVuZGVyIHRoaXMgbmFtZSwgdHJ1ZVxuICogICAgIGlmIG5vdC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnQmFja2VuZHMnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJCYWNrZW5kKG5hbWUsIGZhY3RvcnksIHByaW9yaXR5ID0gMSkge1xuICAgIHJldHVybiBFTkdJTkUucmVnaXN0ZXJCYWNrZW5kKG5hbWUsIGZhY3RvcnksIHByaW9yaXR5KTtcbn1cbi8qKlxuICogR2V0cyB0aGUgY3VycmVudCBiYWNrZW5kLiBJZiBubyBiYWNrZW5kcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQsIHRoaXMgd2lsbFxuICogYXR0ZW1wdCB0byBpbml0aWFsaXplIHRoZSBiZXN0IGJhY2tlbmQuIFdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgdGhlIGhpZ2hlc3RcbiAqIHByaW9yaXR5IGJhY2tlbmQgaGFzIGFzeW5jIGluaXRpYWxpemF0aW9uLCBpbiB3aGljaCBjYXNlLCB5b3Ugc2hvdWxkIGNhbGxcbiAqICdhd2FpdCB0Zi5yZWFkeSgpJyBiZWZvcmUgcnVubmluZyBvdGhlciBjb2RlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdCYWNrZW5kcyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiYWNrZW5kKCkge1xuICAgIHJldHVybiBFTkdJTkUuYmFja2VuZDtcbn1cbi8qKlxuICogU2V0cyB0aGUgZ2xvYmFsIHBsYXRmb3JtLlxuICpcbiAqIEBwYXJhbSBwbGF0Zm9ybU5hbWUgVGhlIG5hbWUgb2YgdGhpcyBwbGF0Zm9ybS5cbiAqIEBwYXJhbSBwbGF0Zm9ybSBBIHBsYXRmb3JtIGltcGxlbWVudGF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0UGxhdGZvcm0ocGxhdGZvcm1OYW1lLCBwbGF0Zm9ybSkge1xuICAgIGVudigpLnNldFBsYXRmb3JtKHBsYXRmb3JtTmFtZSwgcGxhdGZvcm0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2xvYmFscy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuL2VuZ2luZSc7XG5pbXBvcnQgeyBUZW5zb3IsIFZhcmlhYmxlIH0gZnJvbSAnLi90ZW5zb3InO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yLCBjb252ZXJ0VG9UZW5zb3JBcnJheSB9IGZyb20gJy4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi91dGlsJztcbi8qKlxuICogUHJvdmlkZWQgYGYoeClgLCByZXR1cm5zIGFub3RoZXIgZnVuY3Rpb24gYGcoeCwgZHk/KWAsIHdoaWNoIGdpdmVzIHRoZVxuICogZ3JhZGllbnQgb2YgYGYoeClgIHdpdGggcmVzcGVjdCB0byBgeGAuXG4gKlxuICogSWYgYGR5YCBpcyBwcm92aWRlZCwgdGhlIGdyYWRpZW50IG9mIGBmKHgpLm11bChkeSkuc3VtKClgIHdpdGggcmVzcGVjdCB0b1xuICogYHhgIGlzIGNvbXB1dGVkIGluc3RlYWQuIGBmKHgpYCBtdXN0IHRha2UgYSBzaW5nbGUgdGVuc29yIGB4YCBhbmQgcmV0dXJuIGFcbiAqIHNpbmdsZSB0ZW5zb3IgYHlgLiBJZiBgZigpYCB0YWtlcyBtdWx0aXBsZSBpbnB1dHMsIHVzZSBgdGYuZ3JhZHNgIGluc3RlYWQuXG4gKlxuICogYGBganNcbiAqIC8vIGYoeCkgPSB4IF4gMlxuICogY29uc3QgZiA9IHggPT4geC5zcXVhcmUoKTtcbiAqIC8vIGYnKHgpID0gMnhcbiAqIGNvbnN0IGcgPSB0Zi5ncmFkKGYpO1xuICpcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMiwgM10pO1xuICogZyh4KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogYGBganNcbiAqIC8vIGYoeCkgPSB4IF4gM1xuICogY29uc3QgZiA9IHggPT4geC5wb3codGYuc2NhbGFyKDMsICdpbnQzMicpKTtcbiAqIC8vIGYnKHgpID0gM3ggXiAyXG4gKiBjb25zdCBnID0gdGYuZ3JhZChmKTtcbiAqIC8vIGYnJyh4KSA9IDZ4XG4gKiBjb25zdCBnZyA9IHRmLmdyYWQoZyk7XG4gKlxuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsyLCAzXSk7XG4gKiBnZyh4KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGYgVGhlIGZ1bmN0aW9uIGYoeCksIHRvIGNvbXB1dGUgZ3JhZGllbnQgZm9yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdHcmFkaWVudHMnfVxuICovXG5mdW5jdGlvbiBncmFkKGYpIHtcbiAgICB1dGlsLmFzc2VydCh1dGlsLmlzRnVuY3Rpb24oZiksICgpID0+ICdUaGUgZiBwYXNzZWQgaW4gZ3JhZChmKSBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICByZXR1cm4gKHgsIGR5KSA9PiB7XG4gICAgICAgIC8vIHggY2FuIGJlIG9mIGFueSBkdHlwZSwgdGh1cyBudWxsIGFzIHRoZSBsYXN0IGFyZ3VtZW50LlxuICAgICAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICd0Zi5ncmFkJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG4gICAgICAgIGNvbnN0ICRkeSA9IChkeSAhPSBudWxsKSA/IGNvbnZlcnRUb1RlbnNvcihkeSwgJ2R5JywgJ3RmLmdyYWQnKSA6IG51bGw7XG4gICAgICAgIHJldHVybiBFTkdJTkUudGlkeSgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IHZhbHVlLCBncmFkcyB9ID0gRU5HSU5FLmdyYWRpZW50cygoKSA9PiBmKCR4KSwgWyR4XSwgJGR5KTtcbiAgICAgICAgICAgIGlmICgkZHkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHV0aWwuYXNzZXJ0U2hhcGVzTWF0Y2godmFsdWUuc2hhcGUsICRkeS5zaGFwZSwgJ1RoZSBzaGFwZSBvZiBkeSBwYXNzZWQgaW4gZ3JhZChmKSh4LCBkeSkgbXVzdCBtYXRjaCB0aGUgc2hhcGUgJyArXG4gICAgICAgICAgICAgICAgICAgICdyZXR1cm5lZCBieSBmKHgpJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaGVja0dyYWRzKGdyYWRzKTtcbiAgICAgICAgICAgIHJldHVybiBncmFkc1swXTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cbi8qKlxuICogUHJvdmlkZWQgYGYoeDEsIHgyLC4uLilgLCByZXR1cm5zIGFub3RoZXIgZnVuY3Rpb24gYGcoW3gxLCB4MiwuLi5dLCBkeT8pYCxcbiAqIHdoaWNoIGdpdmVzIGFuIGFycmF5IG9mIGdyYWRpZW50cyBvZiBgZigpYCB3aXRoIHJlc3BlY3QgdG8gZWFjaCBpbnB1dFxuICogW2B4MWAsYHgyYCwuLi5dLlxuICpcbiAqIElmIGBkeWAgaXMgcGFzc2VkIHdoZW4gY2FsbGluZyBgZygpYCwgdGhlIGdyYWRpZW50IG9mXG4gKiBgZih4MSwuLi4pLm11bChkeSkuc3VtKClgIHdpdGggcmVzcGVjdCB0byBlYWNoIGlucHV0IGlzIGNvbXB1dGVkIGluc3RlYWQuXG4gKiBUaGUgcHJvdmlkZWQgYGZgIG11c3QgdGFrZSBvbmUgb3IgbW9yZSB0ZW5zb3JzIGFuZCByZXR1cm4gYSBzaW5nbGUgdGVuc29yXG4gKiBgeWAuIElmIGBmKClgIHRha2VzIGEgc2luZ2xlIGlucHV0LCB3ZSByZWNvbW1lbmQgdXNpbmcgYHRmLmdyYWRgIGluc3RlYWQuXG4gKlxuICogYGBganNcbiAqIC8vIGYoYSwgYikgPSBhICogYlxuICogY29uc3QgZiA9IChhLCBiKSA9PiBhLm11bChiKTtcbiAqIC8vIGRmIC8gZGEgPSBiLCBkZiAvIGRiID0gYVxuICogY29uc3QgZyA9IHRmLmdyYWRzKGYpO1xuICpcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMiwgM10pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFstMiwgLTNdKTtcbiAqIGNvbnN0IFtkYSwgZGJdID0gZyhbYSwgYl0pO1xuICogY29uc29sZS5sb2coJ2RhJyk7XG4gKiBkYS5wcmludCgpO1xuICogY29uc29sZS5sb2coJ2RiJyk7XG4gKiBkYi5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGYgVGhlIGZ1bmN0aW9uIGBmKHgxLCB4MiwuLi4pYCB0byBjb21wdXRlIGdyYWRpZW50cyBmb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0dyYWRpZW50cyd9XG4gKi9cbmZ1bmN0aW9uIGdyYWRzKGYpIHtcbiAgICB1dGlsLmFzc2VydCh1dGlsLmlzRnVuY3Rpb24oZiksICgpID0+ICdUaGUgZiBwYXNzZWQgaW4gZ3JhZHMoZikgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgcmV0dXJuIChhcmdzLCBkeSkgPT4ge1xuICAgICAgICB1dGlsLmFzc2VydChBcnJheS5pc0FycmF5KGFyZ3MpLCAoKSA9PiAnVGhlIGFyZ3MgcGFzc2VkIGluIGdyYWRzKGYpKGFyZ3MpIG11c3QgYmUgYW4gYXJyYXkgJyArXG4gICAgICAgICAgICAnb2YgYFRlbnNvcmBzIG9yIGBUZW5zb3JMaWtlYHMnKTtcbiAgICAgICAgLy8gYXJncyBjYW4gYmUgb2YgYW55IGR0eXBlLCB0aHVzIG51bGwgYXMgdGhlIGxhc3QgYXJndW1lbnQuXG4gICAgICAgIGNvbnN0ICRhcmdzID0gY29udmVydFRvVGVuc29yQXJyYXkoYXJncywgJ2FyZ3MnLCAndGYuZ3JhZHMnLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgICAgICAgY29uc3QgJGR5ID0gKGR5ICE9IG51bGwpID8gY29udmVydFRvVGVuc29yKGR5LCAnZHknLCAndGYuZ3JhZHMnKSA6IG51bGw7XG4gICAgICAgIHJldHVybiBFTkdJTkUudGlkeSgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IHZhbHVlLCBncmFkcyB9ID0gRU5HSU5FLmdyYWRpZW50cygoKSA9PiBmKC4uLiRhcmdzKSwgJGFyZ3MsICRkeSk7XG4gICAgICAgICAgICBpZiAoJGR5ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB1dGlsLmFzc2VydFNoYXBlc01hdGNoKHZhbHVlLnNoYXBlLCAkZHkuc2hhcGUsICdUaGUgc2hhcGUgb2YgZHkgcGFzc2VkIGluIGdyYWRzKGYpKFt4MSwuLi5dLCBkeSkgbXVzdCAnICtcbiAgICAgICAgICAgICAgICAgICAgJ21hdGNoIHRoZSBzaGFwZSByZXR1cm5lZCBieSBmKFt4MSwuLi5dKScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2hlY2tHcmFkcyhncmFkcyk7XG4gICAgICAgICAgICByZXR1cm4gZ3JhZHM7XG4gICAgICAgIH0pO1xuICAgIH07XG59XG4vKipcbiAqIExpa2UgYHRmLmdyYWRgLCBidXQgYWxzbyByZXR1cm5zIHRoZSB2YWx1ZSBvZiBgZigpYC4gVXNlZnVsIHdoZW4gYGYoKWBcbiAqIHJldHVybnMgYSBtZXRyaWMgeW91IHdhbnQgdG8gc2hvdy5cbiAqXG4gKiBUaGUgcmVzdWx0IGlzIGEgcmljaCBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAtIGdyYWQ6IFRoZSBncmFkaWVudCBvZiBgZih4KWAgdy5yLnQgYHhgIChyZXN1bHQgb2YgYHRmLmdyYWRgKS5cbiAqIC0gdmFsdWU6IFRoZSB2YWx1ZSByZXR1cm5lZCBieSBgZih4KWAuXG4gKlxuICogYGBganNcbiAqIC8vIGYoeCkgPSB4IF4gMlxuICogY29uc3QgZiA9IHggPT4geC5zcXVhcmUoKTtcbiAqIC8vIGYnKHgpID0gMnhcbiAqIGNvbnN0IGcgPSB0Zi52YWx1ZUFuZEdyYWQoZik7XG4gKlxuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsyLCAzXSk7XG4gKiBjb25zdCB7dmFsdWUsIGdyYWR9ID0gZyh4KTtcbiAqXG4gKiBjb25zb2xlLmxvZygndmFsdWUnKTtcbiAqIHZhbHVlLnByaW50KCk7XG4gKiBjb25zb2xlLmxvZygnZ3JhZCcpO1xuICogZ3JhZC5wcmludCgpO1xuICogYGBgXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0dyYWRpZW50cyd9XG4gKi9cbmZ1bmN0aW9uIHZhbHVlQW5kR3JhZChmKSB7XG4gICAgdXRpbC5hc3NlcnQodXRpbC5pc0Z1bmN0aW9uKGYpLCAoKSA9PiAnVGhlIGYgcGFzc2VkIGluIHZhbHVlQW5kR3JhZChmKSBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICByZXR1cm4gKHgsIGR5KSA9PiB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHggaW5zdGFuY2VvZiBUZW5zb3IsICgpID0+ICdUaGUgeCBwYXNzZWQgaW4gdmFsdWVBbmRHcmFkKGYpKHgpIG11c3QgYmUgYSB0ZW5zb3InKTtcbiAgICAgICAgdXRpbC5hc3NlcnQoZHkgPT0gbnVsbCB8fCBkeSBpbnN0YW5jZW9mIFRlbnNvciwgKCkgPT4gJ1RoZSBkeSBwYXNzZWQgaW4gdmFsdWVBbmRHcmFkKGYpKHgsIGR5KSBtdXN0IGJlIGEgdGVuc29yJyk7XG4gICAgICAgIGNvbnN0IHsgZ3JhZHMsIHZhbHVlIH0gPSBFTkdJTkUuZ3JhZGllbnRzKCgpID0+IGYoeCksIFt4XSwgZHkpO1xuICAgICAgICBjaGVja0dyYWRzKGdyYWRzKTtcbiAgICAgICAgcmV0dXJuIHsgZ3JhZDogZ3JhZHNbMF0sIHZhbHVlIH07XG4gICAgfTtcbn1cbi8qKlxuICogTGlrZSBgdGYuZ3JhZHNgLCBidXQgcmV0dXJucyBhbHNvIHRoZSB2YWx1ZSBvZiBgZigpYC4gVXNlZnVsIHdoZW4gYGYoKWBcbiAqIHJldHVybnMgYSBtZXRyaWMgeW91IHdhbnQgdG8gc2hvdy5cbiAqXG4gKiBUaGUgcmVzdWx0IGlzIGEgcmljaCBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAtIGdyYWRzOiBUaGUgZ3JhZGllbnRzIG9mIGBmKClgIHcuci50IGVhY2ggaW5wdXQgKHJlc3VsdCBvZiBgdGYuZ3JhZHNgKS5cbiAqIC0gdmFsdWU6IFRoZSB2YWx1ZSByZXR1cm5lZCBieSBgZih4KWAuXG4gKlxuICogYGBganNcbiAqIC8vIGYoYSwgYikgPSBhICogYlxuICogY29uc3QgZiA9IChhLCBiKSA9PiBhLm11bChiKTtcbiAqIC8vIGRmL2RhID0gYiwgZGYvZGIgPSBhXG4gKiBjb25zdCBnID0gdGYudmFsdWVBbmRHcmFkcyhmKTtcbiAqXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzIsIDNdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbLTIsIC0zXSk7XG4gKiBjb25zdCB7dmFsdWUsIGdyYWRzfSA9IGcoW2EsIGJdKTtcbiAqXG4gKiBjb25zdCBbZGEsIGRiXSA9IGdyYWRzO1xuICpcbiAqIGNvbnNvbGUubG9nKCd2YWx1ZScpO1xuICogdmFsdWUucHJpbnQoKTtcbiAqXG4gKiBjb25zb2xlLmxvZygnZGEnKTtcbiAqIGRhLnByaW50KCk7XG4gKiBjb25zb2xlLmxvZygnZGInKTtcbiAqIGRiLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVHJhaW5pbmcnLCBzdWJoZWFkaW5nOiAnR3JhZGllbnRzJ31cbiAqL1xuZnVuY3Rpb24gdmFsdWVBbmRHcmFkcyhmKSB7XG4gICAgdXRpbC5hc3NlcnQodXRpbC5pc0Z1bmN0aW9uKGYpLCAoKSA9PiAnVGhlIGYgcGFzc2VkIGluIHZhbHVlQW5kR3JhZHMoZikgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgcmV0dXJuIChhcmdzLCBkeSkgPT4ge1xuICAgICAgICB1dGlsLmFzc2VydChBcnJheS5pc0FycmF5KGFyZ3MpICYmIGFyZ3MuZXZlcnkoYXJnID0+IGFyZyBpbnN0YW5jZW9mIFRlbnNvciksICgpID0+ICdUaGUgYXJncyBwYXNzZWQgaW4gdmFsdWVBbmRHcmFkcyhmKShhcmdzKSBtdXN0IGJlIGFycmF5IG9mICcgK1xuICAgICAgICAgICAgJ3RlbnNvcnMnKTtcbiAgICAgICAgdXRpbC5hc3NlcnQoZHkgPT0gbnVsbCB8fCBkeSBpbnN0YW5jZW9mIFRlbnNvciwgKCkgPT4gJ1RoZSBkeSBwYXNzZWQgaW4gdmFsdWVBbmRHcmFkcyhmKShhcmdzLCBkeSkgbXVzdCBiZSBhIHRlbnNvcicpO1xuICAgICAgICBjb25zdCByZXMgPSBFTkdJTkUuZ3JhZGllbnRzKCgpID0+IGYoLi4uYXJncyksIGFyZ3MsIGR5KTtcbiAgICAgICAgaWYgKGR5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHV0aWwuYXNzZXJ0U2hhcGVzTWF0Y2gocmVzLnZhbHVlLnNoYXBlLCBkeS5zaGFwZSwgJ1RoZSBzaGFwZSBvZiBkeSBwYXNzZWQgaW4gdmFsdWVBbmRHcmFkcyhmKShbeDEsLi4uXSwgZHkpIG11c3QgJyArXG4gICAgICAgICAgICAgICAgJ21hdGNoIHRoZSBzaGFwZSByZXR1cm5lZCBieSBmKFt4MSwuLi5dKScpO1xuICAgICAgICB9XG4gICAgICAgIGNoZWNrR3JhZHMocmVzLmdyYWRzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9O1xufVxuLyoqXG4gKiBDb21wdXRlcyBhbmQgcmV0dXJucyB0aGUgZ3JhZGllbnQgb2YgZih4KSB3aXRoIHJlc3BlY3QgdG8gdGhlIGxpc3Qgb2ZcbiAqIHRyYWluYWJsZSB2YXJpYWJsZXMgcHJvdmlkZWQgYnkgYHZhckxpc3RgLiBJZiBubyBsaXN0IGlzIHByb3ZpZGVkLCBpdFxuICogZGVmYXVsdHMgdG8gYWxsIHRyYWluYWJsZSB2YXJpYWJsZXMuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi52YXJpYWJsZSh0Zi50ZW5zb3IxZChbMywgNF0pKTtcbiAqIGNvbnN0IGIgPSB0Zi52YXJpYWJsZSh0Zi50ZW5zb3IxZChbNSwgNl0pKTtcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMl0pO1xuICpcbiAqIC8vIGYoYSwgYikgPSBhICogeCBeIDIgKyBiICogeFxuICogY29uc3QgZiA9ICgpID0+IGEubXVsKHguc3F1YXJlKCkpLmFkZChiLm11bCh4KSkuc3VtKCk7XG4gKiAvLyBkZi9kYSA9IHggXiAyLCBkZi9kYiA9IHhcbiAqIGNvbnN0IHt2YWx1ZSwgZ3JhZHN9ID0gdGYudmFyaWFibGVHcmFkcyhmKTtcbiAqXG4gKiBPYmplY3Qua2V5cyhncmFkcykuZm9yRWFjaCh2YXJOYW1lID0+IGdyYWRzW3Zhck5hbWVdLnByaW50KCkpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGYgVGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUuIGYoKSBzaG91bGQgcmV0dXJuIGEgc2NhbGFyLlxuICogQHBhcmFtIHZhckxpc3QgVGhlIGxpc3Qgb2YgdmFyaWFibGVzIHRvIGNvbXB1dGUgdGhlIGdyYWRpZW50cyB3aXRoIHJlc3BlY3RcbiAqICAgICB0by4gRGVmYXVsdHMgdG8gYWxsIHRyYWluYWJsZSB2YXJpYWJsZXMuXG4gKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIGtleXMgYW5kIHZhbHVlczpcbiAqICAgLSBgdmFsdWVgOiBUaGUgdmFsdWUgb2YgdGhlIGZ1bmN0aW9uIGBmYC5cbiAqICAgLSBgZ3JhZHNgOiBBIG1hcCBmcm9tIHRoZSBuYW1lcyBvZiB0aGUgdmFyaWFibGVzIHRvIHRoZSBncmFkaWVudHMuXG4gKiAgICAgSWYgdGhlIGB2YXJMaXN0YCBhcmd1bWVudCBpcyBwcm92aWRlZCBleHBsaWNpdGx5IGFuZCBjb250YWlucyBhIHN1YnNldCBvZlxuICogICAgIG5vbi10cmFpbmFibGUgdmFyaWFibGVzLCB0aGlzIG1hcCBpbiB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgY29udGFpbiBrZXlzXG4gKiAgICAgdGhhdCBtYXAgdGhlIG5hbWVzIG9mIHRoZSBub24tdHJhaW5hYmxlIHZhcmlhYmxlcyB0byBgbnVsbGAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0dyYWRpZW50cyd9XG4gKi9cbmZ1bmN0aW9uIHZhcmlhYmxlR3JhZHMoZiwgdmFyTGlzdCkge1xuICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNGdW5jdGlvbihmKSwgKCkgPT4gJ1RoZSBmIHBhc3NlZCBpbiB2YXJpYWJsZUdyYWRzKGYpIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgIHV0aWwuYXNzZXJ0KHZhckxpc3QgPT0gbnVsbCB8fFxuICAgICAgICBBcnJheS5pc0FycmF5KHZhckxpc3QpICYmIHZhckxpc3QuZXZlcnkodiA9PiB2IGluc3RhbmNlb2YgVmFyaWFibGUpLCAoKSA9PiAnVGhlIHZhckxpc3QgcGFzc2VkIGluIHZhcmlhYmxlR3JhZHMoZiwgdmFyTGlzdCkgbXVzdCBiZSBhbiBhcnJheSAnICtcbiAgICAgICAgJ29mIHZhcmlhYmxlcycpO1xuICAgIGNvbnN0IHNwZWNpZmllZFZhckxpc3QgPSB2YXJMaXN0ICE9IG51bGw7XG4gICAgaWYgKCFzcGVjaWZpZWRWYXJMaXN0KSB7XG4gICAgICAgIC8vIEdldCBhbGwgb2YgdGhlIHRyYWluYWJsZSB2YXJpYWJsZXMuXG4gICAgICAgIHZhckxpc3QgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCB2YXJOYW1lIGluIEVOR0lORS5yZWdpc3RlcmVkVmFyaWFibGVzKSB7XG4gICAgICAgICAgICB2YXJMaXN0LnB1c2goRU5HSU5FLnJlZ2lzdGVyZWRWYXJpYWJsZXNbdmFyTmFtZV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHNwZWNpZmllZE5vblRyYWluYWJsZSA9IHNwZWNpZmllZFZhckxpc3QgPyB2YXJMaXN0LmZpbHRlcih2YXJpYWJsZSA9PiAhdmFyaWFibGUudHJhaW5hYmxlKSA6IG51bGw7XG4gICAgLy8gUHJ1bmUgbm9uLXRyYWluYWJsZSB2YXJpYWJsZXMuXG4gICAgY29uc3Qgb3JpZ2luYWxWYXJDb3VudCA9IHZhckxpc3QubGVuZ3RoO1xuICAgIHZhckxpc3QgPSB2YXJMaXN0LmZpbHRlcih2YXJpYWJsZSA9PiB2YXJpYWJsZS50cmFpbmFibGUpO1xuICAgIHV0aWwuYXNzZXJ0KHZhckxpc3QubGVuZ3RoID4gMCwgKCkgPT4gYHZhcmlhYmxlR3JhZHMoKSBleHBlY3RzIGF0IGxlYXN0IG9uZSBvZiB0aGUgaW5wdXQgdmFyaWFibGVzIHRvIGAgK1xuICAgICAgICBgYmUgdHJhaW5hYmxlLCBidXQgbm9uZSBvZiB0aGUgJHtvcmlnaW5hbFZhckNvdW50fSB2YXJpYWJsZXMgaXMgYCArXG4gICAgICAgIGB0cmFpbmFibGUuYCk7XG4gICAgY29uc3QgYWxsb3dOb0dyYWRpZW50cyA9IHRydWU7XG4gICAgY29uc3QgeyB2YWx1ZSwgZ3JhZHMgfSA9IEVOR0lORS5ncmFkaWVudHMoZiwgdmFyTGlzdCwgbnVsbCwgYWxsb3dOb0dyYWRpZW50cyk7XG4gICAgdXRpbC5hc3NlcnQoZ3JhZHMuc29tZShnID0+IGcgIT0gbnVsbCksICgpID0+ICdDYW5ub3QgZmluZCBhIGNvbm5lY3Rpb24gYmV0d2VlbiBhbnkgdmFyaWFibGUgYW5kIHRoZSByZXN1bHQgb2YgJyArXG4gICAgICAgICd0aGUgbG9zcyBmdW5jdGlvbiB5PWYoeCkuIFBsZWFzZSBtYWtlIHN1cmUgdGhlIG9wZXJhdGlvbnMgdGhhdCAnICtcbiAgICAgICAgJ3VzZSB2YXJpYWJsZXMgYXJlIGluc2lkZSB0aGUgZnVuY3Rpb24gZiBwYXNzZWQgdG8gbWluaW1pemUoKS4nKTtcbiAgICB1dGlsLmFzc2VydCh2YWx1ZS5yYW5rID09PSAwLCAoKSA9PiBgVGhlIGYgcGFzc2VkIGluIHZhcmlhYmxlR3JhZHMoZikgbXVzdCByZXR1cm4gYSBzY2FsYXIsIGJ1dCBpdCBgICtcbiAgICAgICAgYHJldHVybmVkIGEgcmFuay0ke3ZhbHVlLnJhbmt9IHRlbnNvcmApO1xuICAgIGNvbnN0IG5hbWVkR3JhZHMgPSB7fTtcbiAgICB2YXJMaXN0LmZvckVhY2goKHYsIGkpID0+IHtcbiAgICAgICAgaWYgKGdyYWRzW2ldICE9IG51bGwpIHtcbiAgICAgICAgICAgIG5hbWVkR3JhZHNbdi5uYW1lXSA9IGdyYWRzW2ldO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHNwZWNpZmllZE5vblRyYWluYWJsZSAhPSBudWxsKSB7XG4gICAgICAgIC8vIElmIHZhckxpc3QgaXMgZXhwbGljaXRseSBwcm92aWRlZCBhbmQgY29udGFpbnMgbm9uLXRyYWluYWJsZSB2YWx1ZXMsXG4gICAgICAgIC8vIGFkZCB0aGVtIHRvIHRoZSByZXR1cm5lZCBncmFkaWVudHMgd2l0aCBgbnVsbGAgdmFsdWVzLlxuICAgICAgICBzcGVjaWZpZWROb25UcmFpbmFibGUuZm9yRWFjaCh2ID0+IG5hbWVkR3JhZHNbdi5uYW1lXSA9IG51bGwpO1xuICAgIH1cbiAgICByZXR1cm4geyB2YWx1ZSwgZ3JhZHM6IG5hbWVkR3JhZHMgfTtcbn1cbi8qKlxuICogT3ZlcnJpZGVzIHRoZSBncmFkaWVudCBjb21wdXRhdGlvbiBvZiBhIGZ1bmN0aW9uIGBmYC5cbiAqXG4gKiBUYWtlcyBhIGZ1bmN0aW9uXG4gKiBgZiguLi5pbnB1dHMsIHNhdmUpID0+IHt2YWx1ZTogVGVuc29yLCBncmFkRnVuYzogKGR5LCBzYXZlZCkgPT4gVGVuc29yW119YFxuICogYW5kIHJldHVybnMgYW5vdGhlciBmdW5jdGlvbiBgZyguLi5pbnB1dHMpYCB3aGljaCB0YWtlcyB0aGUgc2FtZSBpbnB1dHMgYXNcbiAqIGBmYC4gV2hlbiBjYWxsZWQsIGBnYCByZXR1cm5zIGBmKCkudmFsdWVgLiBJbiBiYWNrd2FyZCBtb2RlLCBjdXN0b20gZ3JhZGllbnRzXG4gKiB3aXRoIHJlc3BlY3QgdG8gZWFjaCBpbnB1dCBvZiBgZmAgYXJlIGNvbXB1dGVkIHVzaW5nIGBmKCkuZ3JhZEZ1bmNgLlxuICpcbiAqIFRoZSBgc2F2ZWAgZnVuY3Rpb24gcGFzc3NlZCB0byBgZmAgc2hvdWxkIGJlIHVzZWQgZm9yIHNhdmluZyB0ZW5zb3JzIG5lZWRlZFxuICogaW4gdGhlIGdyYWRpZW50LiBBbmQgdGhlIGBzYXZlZGAgcGFzc2VkIHRvIHRoZSBgZ3JhZEZ1bmNgIGlzIGFcbiAqIGBOYW1lZFRlbnNvck1hcGAsIHdoaWNoIGNvbnRhaW5zIHRob3NlIHNhdmVkIHRlbnNvci5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgY3VzdG9tT3AgPSB0Zi5jdXN0b21HcmFkKCh4LCBzYXZlKSA9PiB7XG4gKiAgIC8vIFNhdmUgeCB0byBtYWtlIHN1cmUgaXQncyBhdmFpbGFibGUgbGF0ZXIgZm9yIHRoZSBncmFkaWVudC5cbiAqICAgc2F2ZShbeF0pO1xuICogICAvLyBPdmVycmlkZSBncmFkaWVudCBvZiBvdXIgY3VzdG9tIHggXiAyIG9wIHRvIGJlIGR5ICogYWJzKHgpO1xuICogICByZXR1cm4ge1xuICogICAgIHZhbHVlOiB4LnNxdWFyZSgpLFxuICogICAgIC8vIE5vdGUgYHNhdmVkLnhgIHdoaWNoIHBvaW50cyB0byB0aGUgYHhgIHdlIHNhdmVkIGVhcmxpZXIuXG4gKiAgICAgZ3JhZEZ1bmM6IChkeSwgc2F2ZWQpID0+IFtkeS5tdWwoc2F2ZWRbMF0uYWJzKCkpXVxuICogICB9O1xuICogfSk7XG4gKlxuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFstMSwgLTIsIDNdKTtcbiAqIGNvbnN0IGR4ID0gdGYuZ3JhZCh4ID0+IGN1c3RvbU9wKHgpKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhgZih4KTpgKTtcbiAqIGN1c3RvbU9wKHgpLnByaW50KCk7XG4gKiBjb25zb2xlLmxvZyhgZicoeCk6YCk7XG4gKiBkeCh4KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGYgVGhlIGZ1bmN0aW9uIHRvIGV2YWx1YXRlIGluIGZvcndhcmQgbW9kZSwgd2hpY2ggc2hvdWxkIHJldHVyblxuICogICAgIGB7dmFsdWU6IFRlbnNvciwgZ3JhZEZ1bmM6IChkeSwgc2F2ZWQpID0+IFRlbnNvcltdfWAsIHdoZXJlIGBncmFkRnVuY2BcbiAqICAgICByZXR1cm5zIHRoZSBjdXN0b20gZ3JhZGllbnRzIG9mIGBmYCB3aXRoIHJlc3BlY3QgdG8gaXRzIGlucHV0cy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVHJhaW5pbmcnLCBzdWJoZWFkaW5nOiAnR3JhZGllbnRzJ31cbiAqL1xuZnVuY3Rpb24gY3VzdG9tR3JhZChmKSB7XG4gICAgcmV0dXJuIEVOR0lORS5jdXN0b21HcmFkKGYpO1xufVxuZnVuY3Rpb24gY2hlY2tHcmFkcyhncmFkcykge1xuICAgIGNvbnN0IG51bU51bGxHcmFkaWVudHMgPSBncmFkcy5maWx0ZXIoZyA9PiBnID09IG51bGwpLmxlbmd0aDtcbiAgICBpZiAobnVtTnVsbEdyYWRpZW50cyA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29tcHV0ZSBncmFkaWVudCBvZiB5PWYoeCkgd2l0aCByZXNwZWN0IHRvIHguIE1ha2Ugc3VyZSB0aGF0XG4gICAgdGhlIGYgeW91IHBhc3NlZCBlbmNsb3NlcyBhbGwgb3BlcmF0aW9ucyB0aGF0IGxlYWQgZnJvbSB4IHRvIHkuYCk7XG4gICAgfVxufVxuZXhwb3J0IHsgY3VzdG9tR3JhZCwgdmFyaWFibGVHcmFkcywgdmFsdWVBbmRHcmFkLCB2YWx1ZUFuZEdyYWRzLCBncmFkLCBncmFkcywgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdyYWRpZW50cy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vLyBXb3JrYXJvdW5kIGZvciBhbGxvd2luZyBjanMgbW9kdWxlIHRvIGJlIGluY2x1ZGVkIGluIGJ1bmRsZSBjcmVhdGVkIGJ5XG4vLyByb2xsdXAuXG5pbXBvcnQgKiBhcyBMb25nRXhwb3J0cyBmcm9tICdsb25nJztcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuY29uc3QgTG9uZyA9IFxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG5Mb25nRXhwb3J0cy5kZWZhdWx0IHx8IExvbmdFeHBvcnRzO1xuZXhwb3J0IGZ1bmN0aW9uIGhleFRvTG9uZyhoZXgpIHtcbiAgICByZXR1cm4gTG9uZy5mcm9tU3RyaW5nKGhleCwgdHJ1ZSwgMTYpO1xufVxuLy8gU29tZSBwcmltZXMgYmV0d2VlbiAyXjYzIGFuZCAyXjY0IGZvciB2YXJpb3VzIHVzZXMuXG4vLyBIZXggMHhjM2E1Yzg1Yzk3Y2IzMTI3XG5jb25zdCBrMCA9IGhleFRvTG9uZygnYzNhNWM4NWM5N2NiMzEyNycpO1xuLy8gSGV4IDB4YjQ5MmI2NmZiZTk4ZjI3M1xuY29uc3QgazEgPSBoZXhUb0xvbmcoJ2I0OTJiNjZmYmU5OGYyNzMnKTtcbi8vIEhleCAweDlhZTE2YTNiMmY5MDQwNGZcbmNvbnN0IGsyID0gaGV4VG9Mb25nKCc5YWUxNmEzYjJmOTA0MDRmJyk7XG5mdW5jdGlvbiBzaGlmdE1peCh2YWwpIHtcbiAgICByZXR1cm4gdmFsLnhvcih2YWwuc2hydSg0NykpO1xufVxuZnVuY3Rpb24gZmV0Y2gocywgb2Zmc2V0LCBudW1CeXRlcykge1xuICAgIGNvbnN0IGJ5dGVzID0gcy5zbGljZShvZmZzZXQsIG9mZnNldCArIG51bUJ5dGVzKTtcbiAgICByZXR1cm4gTG9uZy5mcm9tQnl0ZXMoQXJyYXkuZnJvbShieXRlcyksIHRydWUsIHRydWUpO1xufVxuZnVuY3Rpb24gZmV0Y2g2NChzLCBvZmZzZXQpIHtcbiAgICByZXR1cm4gZmV0Y2gocywgb2Zmc2V0LCA4KTtcbn1cbmZ1bmN0aW9uIGZldGNoMzIocywgb2Zmc2V0KSB7XG4gICAgcmV0dXJuIGZldGNoKHMsIG9mZnNldCwgNCk7XG59XG5mdW5jdGlvbiByb3RhdGU2NCh2YWwsIHNoaWZ0KSB7XG4gICAgLy8gQXZvaWQgc2hpZnRpbmcgYnkgNjQ6IGRvaW5nIHNvIHlpZWxkcyBhbiB1bmRlZmluZWQgcmVzdWx0LlxuICAgIHJldHVybiBzaGlmdCA9PT0gMCA/IHZhbCA6IHZhbC5zaHJ1KHNoaWZ0KS5vcih2YWwuc2hsKDY0IC0gc2hpZnQpKTtcbn1cbmZ1bmN0aW9uIGhhc2hMZW4xNih1LCB2LCBtdWwgPSBoZXhUb0xvbmcoJzlkZGZlYTA4ZWIzODJkNjknKSkge1xuICAgIC8vIE11cm11ci1pbnNwaXJlZCBoYXNoaW5nLlxuICAgIGxldCBhID0gdS54b3IodikubXVsKG11bCk7XG4gICAgYSA9IGEueG9yKGEuc2hydSg0NykpO1xuICAgIGxldCBiID0gdi54b3IoYSkubXVsKG11bCk7XG4gICAgYiA9IGIueG9yKGIuc2hydSg0NykpO1xuICAgIGIgPSBiLm11bChtdWwpO1xuICAgIHJldHVybiBiO1xufVxuLy8gUmV0dXJuIGEgMTYtYnl0ZSBoYXNoIGZvciA0OCBieXRlcy4gIFF1aWNrIGFuZCBkaXJ0eS5cbi8vIENhbGxlcnMgZG8gYmVzdCB0byB1c2UgXCJyYW5kb20tbG9va2luZ1wiIHZhbHVlcyBmb3IgYSBhbmQgYi5cbmZ1bmN0aW9uIHdlYWtIYXNoTGVuMzJXaXRoU2VlZHModywgeCwgeSwgeiwgYSwgYikge1xuICAgIGEgPSBhLmFkZCh3KTtcbiAgICBiID0gcm90YXRlNjQoYi5hZGQoYSkuYWRkKHopLCAyMSk7XG4gICAgY29uc3QgYyA9IGE7XG4gICAgYSA9IGEuYWRkKHgpO1xuICAgIGEgPSBhLmFkZCh5KTtcbiAgICBiID0gYi5hZGQocm90YXRlNjQoYSwgNDQpKTtcbiAgICByZXR1cm4gW2EuYWRkKHopLCBiLmFkZChjKV07XG59XG5mdW5jdGlvbiB3ZWFrSGFzaExlbjMyV2l0aFNlZWRzU3RyKHMsIG9mZnNldCwgYSwgYikge1xuICAgIHJldHVybiB3ZWFrSGFzaExlbjMyV2l0aFNlZWRzKGZldGNoNjQocywgb2Zmc2V0KSwgZmV0Y2g2NChzLCBvZmZzZXQgKyA4KSwgZmV0Y2g2NChzLCBvZmZzZXQgKyAxNiksIGZldGNoNjQocywgb2Zmc2V0ICsgMjQpLCBhLCBiKTtcbn1cbmZ1bmN0aW9uIGhhc2hMZW4wdG8xNihzLCBsZW4gPSBzLmxlbmd0aCkge1xuICAgIGlmIChsZW4gPj0gOCkge1xuICAgICAgICBjb25zdCBtdWwgPSBrMi5hZGQobGVuICogMik7XG4gICAgICAgIGNvbnN0IGEgPSBmZXRjaDY0KHMsIDApLmFkZChrMik7XG4gICAgICAgIGNvbnN0IGIgPSBmZXRjaDY0KHMsIGxlbiAtIDgpO1xuICAgICAgICBjb25zdCBjID0gcm90YXRlNjQoYiwgMzcpLm11bChtdWwpLmFkZChhKTtcbiAgICAgICAgY29uc3QgZCA9IHJvdGF0ZTY0KGEsIDI1KS5hZGQoYikubXVsKG11bCk7XG4gICAgICAgIHJldHVybiBoYXNoTGVuMTYoYywgZCwgbXVsKTtcbiAgICB9XG4gICAgaWYgKGxlbiA+PSA0KSB7XG4gICAgICAgIGNvbnN0IG11bCA9IGsyLmFkZChsZW4gKiAyKTtcbiAgICAgICAgY29uc3QgYSA9IGZldGNoMzIocywgMCk7XG4gICAgICAgIHJldHVybiBoYXNoTGVuMTYoYS5zaGwoMykuYWRkKGxlbiksIGZldGNoMzIocywgbGVuIC0gNCksIG11bCk7XG4gICAgfVxuICAgIGlmIChsZW4gPiAwKSB7XG4gICAgICAgIGNvbnN0IGEgPSBzWzBdO1xuICAgICAgICBjb25zdCBiID0gc1tsZW4gPj4gMV07XG4gICAgICAgIGNvbnN0IGMgPSBzW2xlbiAtIDFdO1xuICAgICAgICBjb25zdCB5ID0gYSArIChiIDw8IDgpO1xuICAgICAgICBjb25zdCB6ID0gbGVuICsgKGMgPDwgMik7XG4gICAgICAgIHJldHVybiBzaGlmdE1peChrMi5tdWwoeSkueG9yKGswLm11bCh6KSkpLm11bChrMik7XG4gICAgfVxuICAgIHJldHVybiBrMjtcbn1cbmZ1bmN0aW9uIGhhc2hMZW4xN3RvMzIocywgbGVuID0gcy5sZW5ndGgpIHtcbiAgICBjb25zdCBtdWwgPSBrMi5hZGQobGVuICogMik7XG4gICAgY29uc3QgYSA9IGZldGNoNjQocywgMCkubXVsKGsxKTtcbiAgICBjb25zdCBiID0gZmV0Y2g2NChzLCA4KTtcbiAgICBjb25zdCBjID0gZmV0Y2g2NChzLCBsZW4gLSA4KS5tdWwobXVsKTtcbiAgICBjb25zdCBkID0gZmV0Y2g2NChzLCBsZW4gLSAxNikubXVsKGsyKTtcbiAgICByZXR1cm4gaGFzaExlbjE2KHJvdGF0ZTY0KGEuYWRkKGIpLCA0MykuYWRkKHJvdGF0ZTY0KGMsIDMwKSkuYWRkKGQpLCBhLmFkZChyb3RhdGU2NChiLmFkZChrMiksIDE4KSkuYWRkKGMpLCBtdWwpO1xufVxuZnVuY3Rpb24gaGFzaExlbjMzdG82NChzLCBsZW4gPSBzLmxlbmd0aCkge1xuICAgIGNvbnN0IG11bCA9IGsyLmFkZChsZW4gKiAyKTtcbiAgICBjb25zdCBhID0gZmV0Y2g2NChzLCAwKS5tdWwoazIpO1xuICAgIGNvbnN0IGIgPSBmZXRjaDY0KHMsIDgpO1xuICAgIGNvbnN0IGMgPSBmZXRjaDY0KHMsIGxlbiAtIDgpLm11bChtdWwpO1xuICAgIGNvbnN0IGQgPSBmZXRjaDY0KHMsIGxlbiAtIDE2KS5tdWwoazIpO1xuICAgIGNvbnN0IHkgPSByb3RhdGU2NChhLmFkZChiKSwgNDMpLmFkZChyb3RhdGU2NChjLCAzMCkpLmFkZChkKTtcbiAgICBjb25zdCB6ID0gaGFzaExlbjE2KHksIGEuYWRkKHJvdGF0ZTY0KGIuYWRkKGsyKSwgMTgpKS5hZGQoYyksIG11bCk7XG4gICAgY29uc3QgZSA9IGZldGNoNjQocywgMTYpLm11bChtdWwpO1xuICAgIGNvbnN0IGYgPSBmZXRjaDY0KHMsIDI0KTtcbiAgICBjb25zdCBnID0geS5hZGQoZmV0Y2g2NChzLCBsZW4gLSAzMikpLm11bChtdWwpO1xuICAgIGNvbnN0IGggPSB6LmFkZChmZXRjaDY0KHMsIGxlbiAtIDI0KSkubXVsKG11bCk7XG4gICAgcmV0dXJuIGhhc2hMZW4xNihyb3RhdGU2NChlLmFkZChmKSwgNDMpLmFkZChyb3RhdGU2NChnLCAzMCkpLmFkZChoKSwgZS5hZGQocm90YXRlNjQoZi5hZGQoYSksIDE4KSkuYWRkKGcpLCBtdWwpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZpbmdlclByaW50NjQocywgbGVuID0gcy5sZW5ndGgpIHtcbiAgICBjb25zdCBzZWVkID0gTG9uZy5mcm9tTnVtYmVyKDgxLCB0cnVlKTtcbiAgICBpZiAobGVuIDw9IDMyKSB7XG4gICAgICAgIGlmIChsZW4gPD0gMTYpIHtcbiAgICAgICAgICAgIHJldHVybiBoYXNoTGVuMHRvMTYocywgbGVuKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBoYXNoTGVuMTd0bzMyKHMsIGxlbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAobGVuIDw9IDY0KSB7XG4gICAgICAgIHJldHVybiBoYXNoTGVuMzN0bzY0KHMsIGxlbik7XG4gICAgfVxuICAgIC8vIEZvciBzdHJpbmdzIG92ZXIgNjQgYnl0ZXMgd2UgbG9vcC4gIEludGVybmFsIHN0YXRlIGNvbnNpc3RzIG9mXG4gICAgLy8gNTYgYnl0ZXM6IHYsIHcsIHgsIHksIGFuZCB6LlxuICAgIGxldCB4ID0gc2VlZDtcbiAgICBsZXQgeSA9IHNlZWQubXVsKGsxKS5hZGQoMTEzKTtcbiAgICBsZXQgeiA9IHNoaWZ0TWl4KHkubXVsKGsyKS5hZGQoMTEzKSkubXVsKGsyKTtcbiAgICBsZXQgdiA9IFtMb25nLlVaRVJPLCBMb25nLlVaRVJPXTtcbiAgICBsZXQgdyA9IFtMb25nLlVaRVJPLCBMb25nLlVaRVJPXTtcbiAgICB4ID0geC5tdWwoazIpLmFkZChmZXRjaDY0KHMsIDApKTtcbiAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICAvLyBTZXQgZW5kIHNvIHRoYXQgYWZ0ZXIgdGhlIGxvb3Agd2UgaGF2ZSAxIHRvIDY0IGJ5dGVzIGxlZnQgdG8gcHJvY2Vzcy5cbiAgICBjb25zdCBlbmQgPSAoKGxlbiAtIDEpID4+IDYpICogNjQ7XG4gICAgY29uc3QgbGFzdDY0ID0gZW5kICsgKChsZW4gLSAxKSAmIDYzKSAtIDYzO1xuICAgIGRvIHtcbiAgICAgICAgeCA9IHJvdGF0ZTY0KHguYWRkKHkpLmFkZCh2WzBdKS5hZGQoZmV0Y2g2NChzLCBvZmZzZXQgKyA4KSksIDM3KS5tdWwoazEpO1xuICAgICAgICB5ID0gcm90YXRlNjQoeS5hZGQodlsxXSkuYWRkKGZldGNoNjQocywgb2Zmc2V0ICsgNDgpKSwgNDIpLm11bChrMSk7XG4gICAgICAgIHggPSB4Lnhvcih3WzFdKTtcbiAgICAgICAgeSA9IHkuYWRkKHZbMF0pLmFkZChmZXRjaDY0KHMsIG9mZnNldCArIDQwKSk7XG4gICAgICAgIHogPSByb3RhdGU2NCh6LmFkZCh3WzBdKSwgMzMpLm11bChrMSk7XG4gICAgICAgIHYgPSB3ZWFrSGFzaExlbjMyV2l0aFNlZWRzU3RyKHMsIG9mZnNldCwgdlsxXS5tdWwoazEpLCB4LmFkZCh3WzBdKSk7XG4gICAgICAgIHcgPSB3ZWFrSGFzaExlbjMyV2l0aFNlZWRzU3RyKHMsIG9mZnNldCArIDMyLCB6LmFkZCh3WzFdKSwgeS5hZGQoZmV0Y2g2NChzLCBvZmZzZXQgKyAxNikpKTtcbiAgICAgICAgW3osIHhdID0gW3gsIHpdO1xuICAgICAgICBvZmZzZXQgKz0gNjQ7XG4gICAgfSB3aGlsZSAob2Zmc2V0ICE9PSBlbmQpO1xuICAgIGNvbnN0IG11bCA9IGsxLmFkZCh6LmFuZCgweGZmKS5zaGwoMSkpO1xuICAgIC8vIFBvaW50IHRvIHRoZSBsYXN0IDY0IGJ5dGVzIG9mIGlucHV0LlxuICAgIG9mZnNldCA9IGxhc3Q2NDtcbiAgICB3WzBdID0gd1swXS5hZGQoKGxlbiAtIDEpICYgNjMpO1xuICAgIHZbMF0gPSB2WzBdLmFkZCh3WzBdKTtcbiAgICB3WzBdID0gd1swXS5hZGQodlswXSk7XG4gICAgeCA9IHJvdGF0ZTY0KHguYWRkKHkpLmFkZCh2WzBdKS5hZGQoZmV0Y2g2NChzLCBvZmZzZXQgKyA4KSksIDM3KS5tdWwobXVsKTtcbiAgICB5ID0gcm90YXRlNjQoeS5hZGQodlsxXSkuYWRkKGZldGNoNjQocywgb2Zmc2V0ICsgNDgpKSwgNDIpLm11bChtdWwpO1xuICAgIHggPSB4Lnhvcih3WzFdLm11bCg5KSk7XG4gICAgeSA9IHkuYWRkKHZbMF0ubXVsKDkpLmFkZChmZXRjaDY0KHMsIG9mZnNldCArIDQwKSkpO1xuICAgIHogPSByb3RhdGU2NCh6LmFkZCh3WzBdKSwgMzMpLm11bChtdWwpO1xuICAgIHYgPSB3ZWFrSGFzaExlbjMyV2l0aFNlZWRzU3RyKHMsIG9mZnNldCwgdlsxXS5tdWwobXVsKSwgeC5hZGQod1swXSkpO1xuICAgIHcgPSB3ZWFrSGFzaExlbjMyV2l0aFNlZWRzU3RyKHMsIG9mZnNldCArIDMyLCB6LmFkZCh3WzFdKSwgeS5hZGQoZmV0Y2g2NChzLCBvZmZzZXQgKyAxNikpKTtcbiAgICBbeiwgeF0gPSBbeCwgel07XG4gICAgcmV0dXJuIGhhc2hMZW4xNihoYXNoTGVuMTYodlswXSwgd1swXSwgbXVsKS5hZGQoc2hpZnRNaXgoeSkubXVsKGswKSkuYWRkKHopLCBoYXNoTGVuMTYodlsxXSwgd1sxXSwgbXVsKS5hZGQoeCksIG11bCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1oYXNoX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLy8gUmVxdWlyZWQgc2lkZSBlZmZlY3RmdWwgY29kZS5cbmltcG9ydCAnLi9iYXNlX3NpZGVfZWZmZWN0cyc7XG4vLyBBbGwgZXhwb3J0cyBmcm9tIHRoaXMgcGFja2FnZSBzaG91bGQgYmUgaW4gYmFzZS5cbmV4cG9ydCAqIGZyb20gJy4vYmFzZSc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vKipcbiAqIElPSGFuZGxlcnMgcmVsYXRlZCB0byBmaWxlcywgc3VjaCBhcyBicm93c2VyLXRyaWdnZXJlZCBmaWxlIGRvd25sb2FkcyxcbiAqIHVzZXItc2VsZWN0ZWQgZmlsZXMgaW4gYnJvd3Nlci5cbiAqL1xuaW1wb3J0ICcuLi9mbGFncyc7XG5pbXBvcnQgeyBlbnYgfSBmcm9tICcuLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBiYXNlbmFtZSwgY29uY2F0ZW5hdGVBcnJheUJ1ZmZlcnMsIGdldE1vZGVsQXJ0aWZhY3RzRm9ySlNPTiwgZ2V0TW9kZWxBcnRpZmFjdHNJbmZvRm9ySlNPTiwgZ2V0TW9kZWxKU09ORm9yTW9kZWxBcnRpZmFjdHMgfSBmcm9tICcuL2lvX3V0aWxzJztcbmltcG9ydCB7IElPUm91dGVyUmVnaXN0cnkgfSBmcm9tICcuL3JvdXRlcl9yZWdpc3RyeSc7XG5jb25zdCBERUZBVUxUX0ZJTEVfTkFNRV9QUkVGSVggPSAnbW9kZWwnO1xuY29uc3QgREVGQVVMVF9KU09OX0VYVEVOU0lPTl9OQU1FID0gJy5qc29uJztcbmNvbnN0IERFRkFVTFRfV0VJR0hUX0RBVEFfRVhURU5TSU9OX05BTUUgPSAnLndlaWdodHMuYmluJztcbmZ1bmN0aW9uIGRlZmVyKGYpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUpKS50aGVuKGYpO1xufVxuZXhwb3J0IGNsYXNzIEJyb3dzZXJEb3dubG9hZHMge1xuICAgIGNvbnN0cnVjdG9yKGZpbGVOYW1lUHJlZml4KSB7XG4gICAgICAgIGlmICghZW52KCkuZ2V0Qm9vbCgnSVNfQlJPV1NFUicpKSB7XG4gICAgICAgICAgICAvLyBUT0RPKGNhaXMpOiBQcm92aWRlIGluZm8gb24gd2hhdCBJT0hhbmRsZXJzIGFyZSBhdmFpbGFibGUgdW5kZXIgdGhlXG4gICAgICAgICAgICAvLyAgIGN1cnJlbnQgZW52aXJvbm1lbnQuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Jyb3dzZXJEb3dubG9hZHMoKSBjYW5ub3QgcHJvY2VlZCBiZWNhdXNlIHRoZSBjdXJyZW50IGVudmlyb25tZW50ICcgK1xuICAgICAgICAgICAgICAgICdpcyBub3QgYSBicm93c2VyLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWxlTmFtZVByZWZpeC5zdGFydHNXaXRoKEJyb3dzZXJEb3dubG9hZHMuVVJMX1NDSEVNRSkpIHtcbiAgICAgICAgICAgIGZpbGVOYW1lUHJlZml4ID0gZmlsZU5hbWVQcmVmaXguc2xpY2UoQnJvd3NlckRvd25sb2Fkcy5VUkxfU0NIRU1FLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbGVOYW1lUHJlZml4ID09IG51bGwgfHwgZmlsZU5hbWVQcmVmaXgubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBmaWxlTmFtZVByZWZpeCA9IERFRkFVTFRfRklMRV9OQU1FX1BSRUZJWDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1vZGVsSnNvbkZpbGVOYW1lID0gZmlsZU5hbWVQcmVmaXggKyBERUZBVUxUX0pTT05fRVhURU5TSU9OX05BTUU7XG4gICAgICAgIHRoaXMud2VpZ2h0RGF0YUZpbGVOYW1lID1cbiAgICAgICAgICAgIGZpbGVOYW1lUHJlZml4ICsgREVGQVVMVF9XRUlHSFRfREFUQV9FWFRFTlNJT05fTkFNRTtcbiAgICB9XG4gICAgYXN5bmMgc2F2ZShtb2RlbEFydGlmYWN0cykge1xuICAgICAgICBpZiAodHlwZW9mIChkb2N1bWVudCkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Jyb3dzZXIgZG93bmxvYWRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICcgK1xuICAgICAgICAgICAgICAgICd0aGlzIGVudmlyb25tZW50IHNpbmNlIGBkb2N1bWVudGAgaXMgbm90IHByZXNlbnQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB3ZWlnaHRzVVJMID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW21vZGVsQXJ0aWZhY3RzLndlaWdodERhdGFdLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nIH0pKTtcbiAgICAgICAgaWYgKG1vZGVsQXJ0aWZhY3RzLm1vZGVsVG9wb2xvZ3kgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCcm93c2VyRG93bmxvYWRzLnNhdmUoKSBkb2VzIG5vdCBzdXBwb3J0IHNhdmluZyBtb2RlbCB0b3BvbG9neSAnICtcbiAgICAgICAgICAgICAgICAnaW4gYmluYXJ5IGZvcm1hdHMgeWV0LicpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgd2VpZ2h0c01hbmlmZXN0ID0gW3tcbiAgICAgICAgICAgICAgICAgICAgcGF0aHM6IFsnLi8nICsgdGhpcy53ZWlnaHREYXRhRmlsZU5hbWVdLFxuICAgICAgICAgICAgICAgICAgICB3ZWlnaHRzOiBtb2RlbEFydGlmYWN0cy53ZWlnaHRTcGVjc1xuICAgICAgICAgICAgICAgIH1dO1xuICAgICAgICAgICAgY29uc3QgbW9kZWxKU09OID0gZ2V0TW9kZWxKU09ORm9yTW9kZWxBcnRpZmFjdHMobW9kZWxBcnRpZmFjdHMsIHdlaWdodHNNYW5pZmVzdCk7XG4gICAgICAgICAgICBjb25zdCBtb2RlbEpzb25VUkwgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkobW9kZWxKU09OKV0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nIH0pKTtcbiAgICAgICAgICAgIC8vIElmIGFuY2hvciBlbGVtZW50cyBhcmUgbm90IHByb3ZpZGVkLCBjcmVhdGUgdGhlbSB3aXRob3V0IGF0dGFjaGluZyB0aGVtXG4gICAgICAgICAgICAvLyB0byBwYXJlbnRzLCBzbyB0aGF0IHRoZSBkb3dubG9hZGVkIGZpbGUgbmFtZXMgY2FuIGJlIGNvbnRyb2xsZWQuXG4gICAgICAgICAgICBjb25zdCBqc29uQW5jaG9yID0gdGhpcy5tb2RlbEpzb25BbmNob3IgPT0gbnVsbCA/XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpIDpcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsSnNvbkFuY2hvcjtcbiAgICAgICAgICAgIGpzb25BbmNob3IuZG93bmxvYWQgPSB0aGlzLm1vZGVsSnNvbkZpbGVOYW1lO1xuICAgICAgICAgICAganNvbkFuY2hvci5ocmVmID0gbW9kZWxKc29uVVJMO1xuICAgICAgICAgICAgLy8gVHJpZ2dlciBkb3dubG9hZHMgYnkgZXZva2luZyBhIGNsaWNrIGV2ZW50IG9uIHRoZSBkb3dubG9hZCBhbmNob3JzLlxuICAgICAgICAgICAgLy8gV2hlbiBtdWx0aXBsZSBkb3dubG9hZHMgYXJlIHN0YXJ0ZWQgc3luY2hyb25vdXNseSwgRmlyZWZveCB3aWxsIG9ubHlcbiAgICAgICAgICAgIC8vIHNhdmUgdGhlIGxhc3Qgb25lLlxuICAgICAgICAgICAgYXdhaXQgZGVmZXIoKCkgPT4ganNvbkFuY2hvci5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KCdjbGljaycpKSk7XG4gICAgICAgICAgICBpZiAobW9kZWxBcnRpZmFjdHMud2VpZ2h0RGF0YSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2VpZ2h0RGF0YUFuY2hvciA9IHRoaXMud2VpZ2h0RGF0YUFuY2hvciA9PSBudWxsID9cbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpIDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53ZWlnaHREYXRhQW5jaG9yO1xuICAgICAgICAgICAgICAgIHdlaWdodERhdGFBbmNob3IuZG93bmxvYWQgPSB0aGlzLndlaWdodERhdGFGaWxlTmFtZTtcbiAgICAgICAgICAgICAgICB3ZWlnaHREYXRhQW5jaG9yLmhyZWYgPSB3ZWlnaHRzVVJMO1xuICAgICAgICAgICAgICAgIGF3YWl0IGRlZmVyKCgpID0+IHdlaWdodERhdGFBbmNob3IuZGlzcGF0Y2hFdmVudChuZXcgTW91c2VFdmVudCgnY2xpY2snKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgbW9kZWxBcnRpZmFjdHNJbmZvOiBnZXRNb2RlbEFydGlmYWN0c0luZm9Gb3JKU09OKG1vZGVsQXJ0aWZhY3RzKSB9O1xuICAgICAgICB9XG4gICAgfVxufVxuQnJvd3NlckRvd25sb2Fkcy5VUkxfU0NIRU1FID0gJ2Rvd25sb2FkczovLyc7XG5jbGFzcyBCcm93c2VyRmlsZXMge1xuICAgIGNvbnN0cnVjdG9yKGZpbGVzKSB7XG4gICAgICAgIGlmIChmaWxlcyA9PSBudWxsIHx8IGZpbGVzLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgV2hlbiBjYWxsaW5nIGJyb3dzZXJGaWxlcywgYXQgbGVhc3QgMSBmaWxlIGlzIHJlcXVpcmVkLCBgICtcbiAgICAgICAgICAgICAgICBgYnV0IHJlY2VpdmVkICR7ZmlsZXN9YCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5qc29uRmlsZSA9IGZpbGVzWzBdO1xuICAgICAgICB0aGlzLndlaWdodHNGaWxlcyA9IGZpbGVzLnNsaWNlKDEpO1xuICAgIH1cbiAgICBhc3luYyBsb2FkKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QganNvblJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgICAgICBqc29uUmVhZGVyLm9ubG9hZCA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICAgICAgICAgICAgICBjb25zdCBtb2RlbEpTT04gPSBKU09OLnBhcnNlKGV2ZW50LnRhcmdldC5yZXN1bHQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1vZGVsVG9wb2xvZ3kgPSBtb2RlbEpTT04ubW9kZWxUb3BvbG9neTtcbiAgICAgICAgICAgICAgICBpZiAobW9kZWxUb3BvbG9neSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYG1vZGVsVG9wb2xvZ3kgZmllbGQgaXMgbWlzc2luZyBmcm9tIGZpbGUgJHt0aGlzLmpzb25GaWxlLm5hbWV9YCkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHdlaWdodHNNYW5pZmVzdCA9IG1vZGVsSlNPTi53ZWlnaHRzTWFuaWZlc3Q7XG4gICAgICAgICAgICAgICAgaWYgKHdlaWdodHNNYW5pZmVzdCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYHdlaWdodE1hbmlmZXN0IGZpZWxkIGlzIG1pc3NpbmcgZnJvbSBmaWxlICR7dGhpcy5qc29uRmlsZS5uYW1lfWApKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy53ZWlnaHRzRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoeyBtb2RlbFRvcG9sb2d5IH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG1vZGVsQXJ0aWZhY3RzUHJvbWlzZSA9IGdldE1vZGVsQXJ0aWZhY3RzRm9ySlNPTihtb2RlbEpTT04sICh3ZWlnaHRzTWFuaWZlc3QpID0+IHRoaXMubG9hZFdlaWdodHMod2VpZ2h0c01hbmlmZXN0KSk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShtb2RlbEFydGlmYWN0c1Byb21pc2UpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGpzb25SZWFkZXIub25lcnJvciA9IGVycm9yID0+IHJlamVjdChgRmFpbGVkIHRvIHJlYWQgbW9kZWwgdG9wb2xvZ3kgYW5kIHdlaWdodHMgbWFuaWZlc3QgSlNPTiBgICtcbiAgICAgICAgICAgICAgICBgZnJvbSBmaWxlICcke3RoaXMuanNvbkZpbGUubmFtZX0nLiBCcm93c2VyRmlsZXMgc3VwcG9ydHMgbG9hZGluZyBgICtcbiAgICAgICAgICAgICAgICBgS2VyYXMtc3R5bGUgdGYuTW9kZWwgYXJ0aWZhY3RzIG9ubHkuYCk7XG4gICAgICAgICAgICBqc29uUmVhZGVyLnJlYWRBc1RleHQodGhpcy5qc29uRmlsZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBsb2FkV2VpZ2h0cyh3ZWlnaHRzTWFuaWZlc3QpIHtcbiAgICAgICAgY29uc3Qgd2VpZ2h0U3BlY3MgPSBbXTtcbiAgICAgICAgY29uc3QgcGF0aHMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiB3ZWlnaHRzTWFuaWZlc3QpIHtcbiAgICAgICAgICAgIHdlaWdodFNwZWNzLnB1c2goLi4uZW50cnkud2VpZ2h0cyk7XG4gICAgICAgICAgICBwYXRocy5wdXNoKC4uLmVudHJ5LnBhdGhzKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXRoVG9GaWxlID0gdGhpcy5jaGVja01hbmlmZXN0QW5kV2VpZ2h0RmlsZXMod2VpZ2h0c01hbmlmZXN0KTtcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBwYXRocy5tYXAocGF0aCA9PiB0aGlzLmxvYWRXZWlnaHRzRmlsZShwYXRoLCBwYXRoVG9GaWxlW3BhdGhdKSk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbihidWZmZXJzID0+IFt3ZWlnaHRTcGVjcywgY29uY2F0ZW5hdGVBcnJheUJ1ZmZlcnMoYnVmZmVycyldKTtcbiAgICB9XG4gICAgbG9hZFdlaWdodHNGaWxlKHBhdGgsIGZpbGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHdlaWdodEZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICAgICAgd2VpZ2h0RmlsZVJlYWRlci5vbmxvYWQgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgICAgICAgICAgICAgY29uc3Qgd2VpZ2h0RGF0YSA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh3ZWlnaHREYXRhKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB3ZWlnaHRGaWxlUmVhZGVyLm9uZXJyb3IgPSBlcnJvciA9PiByZWplY3QoYEZhaWxlZCB0byB3ZWlnaHRzIGRhdGEgZnJvbSBmaWxlIG9mIHBhdGggJyR7cGF0aH0nLmApO1xuICAgICAgICAgICAgd2VpZ2h0RmlsZVJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihmaWxlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrIHRoZSBjb21wYXRpYmlsaXR5IGJldHdlZW4gd2VpZ2h0cyBtYW5pZmVzdCBhbmQgd2VpZ2h0IGZpbGVzLlxuICAgICAqL1xuICAgIGNoZWNrTWFuaWZlc3RBbmRXZWlnaHRGaWxlcyhtYW5pZmVzdCkge1xuICAgICAgICBjb25zdCBiYXNlbmFtZXMgPSBbXTtcbiAgICAgICAgY29uc3QgZmlsZU5hbWVzID0gdGhpcy53ZWlnaHRzRmlsZXMubWFwKGZpbGUgPT4gYmFzZW5hbWUoZmlsZS5uYW1lKSk7XG4gICAgICAgIGNvbnN0IHBhdGhUb0ZpbGUgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBncm91cCBvZiBtYW5pZmVzdCkge1xuICAgICAgICAgICAgZ3JvdXAucGF0aHMuZm9yRWFjaChwYXRoID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRoQmFzZW5hbWUgPSBiYXNlbmFtZShwYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoYmFzZW5hbWVzLmluZGV4T2YocGF0aEJhc2VuYW1lKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEdXBsaWNhdGUgZmlsZSBiYXNlbmFtZSBmb3VuZCBpbiB3ZWlnaHRzIG1hbmlmZXN0OiBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAnJHtwYXRoQmFzZW5hbWV9J2ApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBiYXNlbmFtZXMucHVzaChwYXRoQmFzZW5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChmaWxlTmFtZXMuaW5kZXhPZihwYXRoQmFzZW5hbWUpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFdlaWdodCBmaWxlIHdpdGggYmFzZW5hbWUgJyR7cGF0aEJhc2VuYW1lfScgaXMgbm90IHByb3ZpZGVkLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcGF0aFRvRmlsZVtwYXRoXSA9IHRoaXMud2VpZ2h0c0ZpbGVzW2ZpbGVOYW1lcy5pbmRleE9mKHBhdGhCYXNlbmFtZSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiYXNlbmFtZXMubGVuZ3RoICE9PSB0aGlzLndlaWdodHNGaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzbWF0Y2ggaW4gdGhlIG51bWJlciBvZiBmaWxlcyBpbiB3ZWlnaHRzIG1hbmlmZXN0IGAgK1xuICAgICAgICAgICAgICAgIGAoJHtiYXNlbmFtZXMubGVuZ3RofSkgYW5kIHRoZSBudW1iZXIgb2Ygd2VpZ2h0IGZpbGVzIHByb3ZpZGVkIGAgK1xuICAgICAgICAgICAgICAgIGAoJHt0aGlzLndlaWdodHNGaWxlcy5sZW5ndGh9KS5gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF0aFRvRmlsZTtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgYnJvd3NlckRvd25sb2Fkc1JvdXRlciA9ICh1cmwpID0+IHtcbiAgICBpZiAoIWVudigpLmdldEJvb2woJ0lTX0JST1dTRVInKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh1cmwpICYmIHVybC5zdGFydHNXaXRoKEJyb3dzZXJEb3dubG9hZHMuVVJMX1NDSEVNRSkpIHtcbiAgICAgICAgICAgIHJldHVybiBicm93c2VyRG93bmxvYWRzKHVybC5zbGljZShCcm93c2VyRG93bmxvYWRzLlVSTF9TQ0hFTUUubGVuZ3RoKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn07XG5JT1JvdXRlclJlZ2lzdHJ5LnJlZ2lzdGVyU2F2ZVJvdXRlcihicm93c2VyRG93bmxvYWRzUm91dGVyKTtcbi8qKlxuICogQ3JlYXRlcyBhbiBJT0hhbmRsZXIgdGhhdCB0cmlnZ2VycyBmaWxlIGRvd25sb2FkcyBmcm9tIHRoZSBicm93c2VyLlxuICpcbiAqIFRoZSByZXR1cm5lZCBgSU9IYW5kbGVyYCBpbnN0YW5jZSBjYW4gYmUgdXNlZCBhcyBtb2RlbCBleHBvcnRpbmcgbWV0aG9kcyBzdWNoXG4gKiBhcyBgdGYuTW9kZWwuc2F2ZWAgYW5kIHN1cHBvcnRzIG9ubHkgc2F2aW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtb2RlbCA9IHRmLnNlcXVlbnRpYWwoKTtcbiAqIG1vZGVsLmFkZCh0Zi5sYXllcnMuZGVuc2UoXG4gKiAgICAge3VuaXRzOiAxLCBpbnB1dFNoYXBlOiBbMTBdLCBhY3RpdmF0aW9uOiAnc2lnbW9pZCd9KSk7XG4gKiBjb25zdCBzYXZlUmVzdWx0ID0gYXdhaXQgbW9kZWwuc2F2ZSgnZG93bmxvYWRzOi8vbXltb2RlbCcpO1xuICogLy8gVGhpcyB3aWxsIHRyaWdnZXIgZG93bmxvYWRpbmcgb2YgdHdvIGZpbGVzOlxuICogLy8gICAnbXltb2RlbC5qc29uJyBhbmQgJ215bW9kZWwud2VpZ2h0cy5iaW4nLlxuICogY29uc29sZS5sb2coc2F2ZVJlc3VsdCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gZmlsZU5hbWVQcmVmaXggUHJlZml4IG5hbWUgb2YgdGhlIGZpbGVzIHRvIGJlIGRvd25sb2FkZWQuIEZvciB1c2Ugd2l0aFxuICogICBgdGYuTW9kZWxgLCBgZmlsZU5hbWVQcmVmaXhgIHNob3VsZCBmb2xsb3cgZWl0aGVyIG9mIHRoZSBmb2xsb3dpbmcgdHdvXG4gKiAgIGZvcm1hdHM6XG4gKiAgIDEuIGBudWxsYCBvciBgdW5kZWZpbmVkYCwgaW4gd2hpY2ggY2FzZSB0aGUgZGVmYXVsdCBmaWxlXG4gKiAgICAgIG5hbWVzIHdpbGwgYmUgdXNlZDpcbiAqICAgICAgLSAnbW9kZWwuanNvbicgZm9yIHRoZSBKU09OIGZpbGUgY29udGFpbmluZyB0aGUgbW9kZWwgdG9wb2xvZ3kgYW5kXG4gKiAgICAgICAgd2VpZ2h0cyBtYW5pZmVzdC5cbiAqICAgICAgLSAnbW9kZWwud2VpZ2h0cy5iaW4nIGZvciB0aGUgYmluYXJ5IGZpbGUgY29udGFpbmluZyB0aGUgYmluYXJ5IHdlaWdodFxuICogICAgICAgIHZhbHVlcy5cbiAqICAgMi4gQSBzaW5nbGUgc3RyaW5nIG9yIGFuIEFycmF5IG9mIGEgc2luZ2xlIHN0cmluZywgYXMgdGhlIGZpbGUgbmFtZSBwcmVmaXguXG4gKiAgICAgIEZvciBleGFtcGxlLCBpZiBgJ2ZvbydgIGlzIHByb3ZpZGVkLCB0aGUgZG93bmxvYWRlZCBKU09OXG4gKiAgICAgIGZpbGUgYW5kIGJpbmFyeSB3ZWlnaHRzIGZpbGUgd2lsbCBiZSBuYW1lZCAnZm9vLmpzb24nIGFuZFxuICogICAgICAnZm9vLndlaWdodHMuYmluJywgcmVzcGVjdGl2ZWx5LlxuICogQHBhcmFtIGNvbmZpZyBBZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gZm9yIHRyaWdnZXJpbmcgZG93bmxvYWRzLlxuICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgYEJyb3dzZXJEb3dubG9hZHNgIGBJT0hhbmRsZXJgLlxuICpcbiAqIEBkb2Mge1xuICogICBoZWFkaW5nOiAnTW9kZWxzJyxcbiAqICAgc3ViaGVhZGluZzogJ0xvYWRpbmcnLFxuICogICBuYW1lc3BhY2U6ICdpbycsXG4gKiAgIGlnbm9yZUNJOiB0cnVlXG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBicm93c2VyRG93bmxvYWRzKGZpbGVOYW1lUHJlZml4ID0gJ21vZGVsJykge1xuICAgIHJldHVybiBuZXcgQnJvd3NlckRvd25sb2FkcyhmaWxlTmFtZVByZWZpeCk7XG59XG4vKipcbiAqIENyZWF0ZXMgYW4gSU9IYW5kbGVyIHRoYXQgbG9hZHMgbW9kZWwgYXJ0aWZhY3RzIGZyb20gdXNlci1zZWxlY3RlZCBmaWxlcy5cbiAqXG4gKiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCBmb3IgbG9hZGluZyBmcm9tIGZpbGVzIHN1Y2ggYXMgdXNlci1zZWxlY3RlZCBmaWxlc1xuICogaW4gdGhlIGJyb3dzZXIuXG4gKiBXaGVuIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBgdGYubG9hZExheWVyc01vZGVsYCwgYW4gaW5zdGFuY2Ugb2ZcbiAqIGB0Zi5MYXllcnNNb2RlbGAgKEtlcmFzLXN0eWxlKSBjYW4gYmUgY29uc3RydWN0ZWQgZnJvbSB0aGUgbG9hZGVkIGFydGlmYWN0cy5cbiAqXG4gKiBgYGBqc1xuICogLy8gTm90ZTogVGhpcyBjb2RlIHNuaXBwZXQgd29uJ3QgcnVuIHByb3Blcmx5IHdpdGhvdXQgdGhlIGFjdHVhbCBmaWxlIGlucHV0XG4gKiAvLyAgIGVsZW1lbnRzIGluIHRoZSBIVE1MIERPTS5cbiAqXG4gKiAvLyBTdXBwb3NlIHRoZXJlIGFyZSB0d28gSFRNTCBmaWxlIGlucHV0IChgPGlucHV0IHR5cGU9XCJmaWxlXCIgLi4uPmApXG4gKiAvLyBlbGVtZW50cy5cbiAqIGNvbnN0IHVwbG9hZEpTT05JbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGxvYWQtanNvbicpO1xuICogY29uc3QgdXBsb2FkV2VpZ2h0c0lucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwbG9hZC13ZWlnaHRzJyk7XG4gKiBjb25zdCBtb2RlbCA9IGF3YWl0IHRmLmxvYWRMYXllcnNNb2RlbCh0Zi5pby5icm93c2VyRmlsZXMoXG4gKiAgICAgW3VwbG9hZEpTT05JbnB1dC5maWxlc1swXSwgdXBsb2FkV2VpZ2h0c0lucHV0LmZpbGVzWzBdXSkpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGZpbGVzIGBGaWxlYHMgdG8gbG9hZCBmcm9tLiBDdXJyZW50bHksIHRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgb25seVxuICogICBsb2FkaW5nIGZyb20gZmlsZXMgdGhhdCBjb250YWluIEtlcmFzLXN0eWxlIG1vZGVscyAoaS5lLiwgYHRmLk1vZGVsYHMpLCBmb3JcbiAqICAgd2hpY2ggYW4gYEFycmF5YCBvZiBgRmlsZWBzIGlzIGV4cGVjdGVkIChpbiB0aGF0IG9yZGVyKTpcbiAqICAgLSBBIEpTT04gZmlsZSBjb250YWluaW5nIHRoZSBtb2RlbCB0b3BvbG9neSBhbmQgd2VpZ2h0IG1hbmlmZXN0LlxuICogICAtIE9wdGlvbmFsbHksIE9uZSBvciBtb3JlIGJpbmFyeSBmaWxlcyBjb250YWluaW5nIHRoZSBiaW5hcnkgd2VpZ2h0cy5cbiAqICAgICBUaGVzZSBmaWxlcyBtdXN0IGhhdmUgbmFtZXMgdGhhdCBtYXRjaCB0aGUgcGF0aHMgaW4gdGhlIGB3ZWlnaHRzTWFuaWZlc3RgXG4gKiAgICAgY29udGFpbmVkIGJ5IHRoZSBhZm9yZW1lbnRpb25lZCBKU09OIGZpbGUsIG9yIGVycm9ycyB3aWxsIGJlIHRocm93blxuICogICAgIGR1cmluZyBsb2FkaW5nLiBUaGVzZSB3ZWlnaHRzIGZpbGVzIGhhdmUgdGhlIHNhbWUgZm9ybWF0IGFzIHRoZSBvbmVzXG4gKiAgICAgZ2VuZXJhdGVkIGJ5IGB0ZW5zb3JmbG93anNfY29udmVydGVyYCB0aGF0IGNvbWVzIHdpdGggdGhlIGB0ZW5zb3JmbG93anNgXG4gKiAgICAgUHl0aG9uIFBJUCBwYWNrYWdlLiBJZiBubyB3ZWlnaHRzIGZpbGVzIGFyZSBwcm92aWRlZCwgb25seSB0aGUgbW9kZWxcbiAqICAgICB0b3BvbG9neSB3aWxsIGJlIGxvYWRlZCBmcm9tIHRoZSBKU09OIGZpbGUgYWJvdmUuXG4gKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiBgRmlsZXNgIGBJT0hhbmRsZXJgLlxuICpcbiAqIEBkb2Mge1xuICogICBoZWFkaW5nOiAnTW9kZWxzJyxcbiAqICAgc3ViaGVhZGluZzogJ0xvYWRpbmcnLFxuICogICBuYW1lc3BhY2U6ICdpbycsXG4gKiAgIGlnbm9yZUNJOiB0cnVlXG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBicm93c2VyRmlsZXMoZmlsZXMpIHtcbiAgICByZXR1cm4gbmV3IEJyb3dzZXJGaWxlcyhmaWxlcyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1icm93c2VyX2ZpbGVzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qKlxuICogSU9IYW5kbGVyIGltcGxlbWVudGF0aW9ucyBiYXNlZCBvbiBIVFRQIHJlcXVlc3RzIGluIHRoZSB3ZWIgYnJvd3Nlci5cbiAqXG4gKiBVc2VzIFtgZmV0Y2hgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRmV0Y2hfQVBJKS5cbiAqL1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi4vZW52aXJvbm1lbnQnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBjb25jYXRlbmF0ZUFycmF5QnVmZmVycywgZ2V0TW9kZWxBcnRpZmFjdHNGb3JKU09OLCBnZXRNb2RlbEFydGlmYWN0c0luZm9Gb3JKU09OLCBnZXRNb2RlbEpTT05Gb3JNb2RlbEFydGlmYWN0cyB9IGZyb20gJy4vaW9fdXRpbHMnO1xuaW1wb3J0IHsgSU9Sb3V0ZXJSZWdpc3RyeSB9IGZyb20gJy4vcm91dGVyX3JlZ2lzdHJ5JztcbmltcG9ydCB7IGxvYWRXZWlnaHRzQXNBcnJheUJ1ZmZlciB9IGZyb20gJy4vd2VpZ2h0c19sb2FkZXInO1xuY29uc3QgT0NURVRfU1RSRUFNX01JTUVfVFlQRSA9ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nO1xuY29uc3QgSlNPTl9UWVBFID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuZXhwb3J0IGNsYXNzIEhUVFBSZXF1ZXN0IHtcbiAgICBjb25zdHJ1Y3RvcihwYXRoLCBsb2FkT3B0aW9ucykge1xuICAgICAgICB0aGlzLkRFRkFVTFRfTUVUSE9EID0gJ1BPU1QnO1xuICAgICAgICBpZiAobG9hZE9wdGlvbnMgPT0gbnVsbCkge1xuICAgICAgICAgICAgbG9hZE9wdGlvbnMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndlaWdodFBhdGhQcmVmaXggPSBsb2FkT3B0aW9ucy53ZWlnaHRQYXRoUHJlZml4O1xuICAgICAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBsb2FkT3B0aW9ucy5vblByb2dyZXNzO1xuICAgICAgICB0aGlzLndlaWdodFVybENvbnZlcnRlciA9IGxvYWRPcHRpb25zLndlaWdodFVybENvbnZlcnRlcjtcbiAgICAgICAgaWYgKGxvYWRPcHRpb25zLmZldGNoRnVuYyAhPSBudWxsKSB7XG4gICAgICAgICAgICBhc3NlcnQodHlwZW9mIGxvYWRPcHRpb25zLmZldGNoRnVuYyA9PT0gJ2Z1bmN0aW9uJywgKCkgPT4gJ011c3QgcGFzcyBhIGZ1bmN0aW9uIHRoYXQgbWF0Y2hlcyB0aGUgc2lnbmF0dXJlIG9mICcgK1xuICAgICAgICAgICAgICAgICdgZmV0Y2hgIChzZWUgJyArXG4gICAgICAgICAgICAgICAgJ2h0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GZXRjaF9BUEkpJyk7XG4gICAgICAgICAgICB0aGlzLmZldGNoID0gbG9hZE9wdGlvbnMuZmV0Y2hGdW5jO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5mZXRjaCA9IGVudigpLnBsYXRmb3JtLmZldGNoO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydChwYXRoICE9IG51bGwgJiYgcGF0aC5sZW5ndGggPiAwLCAoKSA9PiAnVVJMIHBhdGggZm9yIGh0dHAgbXVzdCBub3QgYmUgbnVsbCwgdW5kZWZpbmVkIG9yICcgK1xuICAgICAgICAgICAgJ2VtcHR5LicpO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXRoKSkge1xuICAgICAgICAgICAgYXNzZXJ0KHBhdGgubGVuZ3RoID09PSAyLCAoKSA9PiAnVVJMIHBhdGhzIGZvciBodHRwIG11c3QgaGF2ZSBhIGxlbmd0aCBvZiAyLCAnICtcbiAgICAgICAgICAgICAgICBgKGFjdHVhbCBsZW5ndGggaXMgJHtwYXRoLmxlbmd0aH0pLmApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgICAgIGlmIChsb2FkT3B0aW9ucy5yZXF1ZXN0SW5pdCAhPSBudWxsICYmXG4gICAgICAgICAgICBsb2FkT3B0aW9ucy5yZXF1ZXN0SW5pdC5ib2R5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWVzdEluaXQgaXMgZXhwZWN0ZWQgdG8gaGF2ZSBubyBwcmUtZXhpc3RpbmcgYm9keSwgYnV0IGhhcyBvbmUuJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXF1ZXN0SW5pdCA9IGxvYWRPcHRpb25zLnJlcXVlc3RJbml0IHx8IHt9O1xuICAgIH1cbiAgICBhc3luYyBzYXZlKG1vZGVsQXJ0aWZhY3RzKSB7XG4gICAgICAgIGlmIChtb2RlbEFydGlmYWN0cy5tb2RlbFRvcG9sb2d5IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnJvd3NlckhUVFBSZXF1ZXN0LnNhdmUoKSBkb2VzIG5vdCBzdXBwb3J0IHNhdmluZyBtb2RlbCB0b3BvbG9neSAnICtcbiAgICAgICAgICAgICAgICAnaW4gYmluYXJ5IGZvcm1hdHMgeWV0LicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluaXQgPSBPYmplY3QuYXNzaWduKHsgbWV0aG9kOiB0aGlzLkRFRkFVTFRfTUVUSE9EIH0sIHRoaXMucmVxdWVzdEluaXQpO1xuICAgICAgICBpbml0LmJvZHkgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgY29uc3Qgd2VpZ2h0c01hbmlmZXN0ID0gW3tcbiAgICAgICAgICAgICAgICBwYXRoczogWycuL21vZGVsLndlaWdodHMuYmluJ10sXG4gICAgICAgICAgICAgICAgd2VpZ2h0czogbW9kZWxBcnRpZmFjdHMud2VpZ2h0U3BlY3MsXG4gICAgICAgICAgICB9XTtcbiAgICAgICAgY29uc3QgbW9kZWxUb3BvbG9neUFuZFdlaWdodE1hbmlmZXN0ID0gZ2V0TW9kZWxKU09ORm9yTW9kZWxBcnRpZmFjdHMobW9kZWxBcnRpZmFjdHMsIHdlaWdodHNNYW5pZmVzdCk7XG4gICAgICAgIGluaXQuYm9keS5hcHBlbmQoJ21vZGVsLmpzb24nLCBuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkobW9kZWxUb3BvbG9neUFuZFdlaWdodE1hbmlmZXN0KV0sIHsgdHlwZTogSlNPTl9UWVBFIH0pLCAnbW9kZWwuanNvbicpO1xuICAgICAgICBpZiAobW9kZWxBcnRpZmFjdHMud2VpZ2h0RGF0YSAhPSBudWxsKSB7XG4gICAgICAgICAgICBpbml0LmJvZHkuYXBwZW5kKCdtb2RlbC53ZWlnaHRzLmJpbicsIG5ldyBCbG9iKFttb2RlbEFydGlmYWN0cy53ZWlnaHREYXRhXSwgeyB0eXBlOiBPQ1RFVF9TVFJFQU1fTUlNRV9UWVBFIH0pLCAnbW9kZWwud2VpZ2h0cy5iaW4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZmV0Y2godGhpcy5wYXRoLCBpbml0KTtcbiAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG1vZGVsQXJ0aWZhY3RzSW5mbzogZ2V0TW9kZWxBcnRpZmFjdHNJbmZvRm9ySlNPTihtb2RlbEFydGlmYWN0cyksXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VzOiBbcmVzcG9uc2VdLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQnJvd3NlckhUVFBSZXF1ZXN0LnNhdmUoKSBmYWlsZWQgZHVlIHRvIEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGAgK1xuICAgICAgICAgICAgICAgIGAke3Jlc3BvbnNlLnN0YXR1c30uYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogTG9hZCBtb2RlbCBhcnRpZmFjdHMgdmlhIEhUVFAgcmVxdWVzdChzKS5cbiAgICAgKlxuICAgICAqIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiB0byBgdGYuaW8uaHR0cGAgZm9yIGRldGFpbHMgb24gdGhlIHNhdmVkXG4gICAgICogYXJ0aWZhY3RzLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIGxvYWRlZCBtb2RlbCBhcnRpZmFjdHMgKGlmIGxvYWRpbmcgc3VjY2VlZHMpLlxuICAgICAqL1xuICAgIGFzeW5jIGxvYWQoKSB7XG4gICAgICAgIGNvbnN0IG1vZGVsQ29uZmlnUmVxdWVzdCA9IGF3YWl0IHRoaXMuZmV0Y2godGhpcy5wYXRoLCB0aGlzLnJlcXVlc3RJbml0KTtcbiAgICAgICAgaWYgKCFtb2RlbENvbmZpZ1JlcXVlc3Qub2spIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVxdWVzdCB0byAke3RoaXMucGF0aH0gZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgYCArXG4gICAgICAgICAgICAgICAgYCR7bW9kZWxDb25maWdSZXF1ZXN0LnN0YXR1c30uIFBsZWFzZSB2ZXJpZnkgdGhpcyBVUkwgcG9pbnRzIHRvIGAgK1xuICAgICAgICAgICAgICAgIGB0aGUgbW9kZWwgSlNPTiBvZiB0aGUgbW9kZWwgdG8gbG9hZC5gKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbW9kZWxKU09OO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbW9kZWxKU09OID0gYXdhaXQgbW9kZWxDb25maWdSZXF1ZXN0Lmpzb24oKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBgRmFpbGVkIHRvIHBhcnNlIG1vZGVsIEpTT04gb2YgcmVzcG9uc2UgZnJvbSAke3RoaXMucGF0aH0uYDtcbiAgICAgICAgICAgIC8vIFRPRE8obnN0aG9yYXQpOiBSZW1vdmUgdGhpcyBhZnRlciBzb21lIHRpbWUgd2hlbiB3ZSdyZSBjb21mb3J0YWJsZSB0aGF0XG4gICAgICAgICAgICAvLyAucGIgZmlsZXMgYXJlIG1vc3RseSBnb25lLlxuICAgICAgICAgICAgaWYgKHRoaXMucGF0aC5lbmRzV2l0aCgnLnBiJykpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlICs9ICcgWW91ciBwYXRoIGNvbnRhaW5zIGEgLnBiIGZpbGUgZXh0ZW5zaW9uLiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ1N1cHBvcnQgZm9yIC5wYiBtb2RlbHMgaGF2ZSBiZWVuIHJlbW92ZWQgaW4gVGVuc29yRmxvdy5qcyAxLjAgJyArXG4gICAgICAgICAgICAgICAgICAgICdpbiBmYXZvciBvZiAuanNvbiBtb2RlbHMuIFlvdSBjYW4gcmUtY29udmVydCB5b3VyIFB5dGhvbiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ1RlbnNvckZsb3cgbW9kZWwgdXNpbmcgdGhlIFRlbnNvckZsb3cuanMgMS4wIGNvbnZlcnNpb24gc2NyaXB0cyAnICtcbiAgICAgICAgICAgICAgICAgICAgJ29yIHlvdSBjYW4gY29udmVydCB5b3VyLnBiIG1vZGVscyB3aXRoIHRoZSBcXCdwYjJqc29uXFwnJyArXG4gICAgICAgICAgICAgICAgICAgICdOUE0gc2NyaXB0IGluIHRoZSB0ZW5zb3JmbG93L3RmanMtY29udmVydGVyIHJlcG9zaXRvcnkuJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgKz0gJyBQbGVhc2UgbWFrZSBzdXJlIHRoZSBzZXJ2ZXIgaXMgc2VydmluZyB2YWxpZCAnICtcbiAgICAgICAgICAgICAgICAgICAgJ0pTT04gZm9yIHRoaXMgcmVxdWVzdC4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlIGRvIG5vdCBhbGxvdyBib3RoIG1vZGVsVG9wb2xvZ3kgYW5kIHdlaWdodHNNYW5pZmVzdCB0byBiZSBtaXNzaW5nLlxuICAgICAgICBjb25zdCBtb2RlbFRvcG9sb2d5ID0gbW9kZWxKU09OLm1vZGVsVG9wb2xvZ3k7XG4gICAgICAgIGNvbnN0IHdlaWdodHNNYW5pZmVzdCA9IG1vZGVsSlNPTi53ZWlnaHRzTWFuaWZlc3Q7XG4gICAgICAgIGlmIChtb2RlbFRvcG9sb2d5ID09IG51bGwgJiYgd2VpZ2h0c01hbmlmZXN0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIEpTT04gZnJvbSBIVFRQIHBhdGggJHt0aGlzLnBhdGh9IGNvbnRhaW5zIG5laXRoZXIgbW9kZWwgYCArXG4gICAgICAgICAgICAgICAgYHRvcG9sb2d5IG9yIG1hbmlmZXN0IGZvciB3ZWlnaHRzLmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnZXRNb2RlbEFydGlmYWN0c0ZvckpTT04obW9kZWxKU09OLCAod2VpZ2h0c01hbmlmZXN0KSA9PiB0aGlzLmxvYWRXZWlnaHRzKHdlaWdodHNNYW5pZmVzdCkpO1xuICAgIH1cbiAgICBhc3luYyBsb2FkV2VpZ2h0cyh3ZWlnaHRzTWFuaWZlc3QpIHtcbiAgICAgICAgY29uc3Qgd2VpZ2h0UGF0aCA9IEFycmF5LmlzQXJyYXkodGhpcy5wYXRoKSA/IHRoaXMucGF0aFsxXSA6IHRoaXMucGF0aDtcbiAgICAgICAgY29uc3QgW3ByZWZpeCwgc3VmZml4XSA9IHBhcnNlVXJsKHdlaWdodFBhdGgpO1xuICAgICAgICBjb25zdCBwYXRoUHJlZml4ID0gdGhpcy53ZWlnaHRQYXRoUHJlZml4IHx8IHByZWZpeDtcbiAgICAgICAgY29uc3Qgd2VpZ2h0U3BlY3MgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiB3ZWlnaHRzTWFuaWZlc3QpIHtcbiAgICAgICAgICAgIHdlaWdodFNwZWNzLnB1c2goLi4uZW50cnkud2VpZ2h0cyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmV0Y2hVUkxzID0gW107XG4gICAgICAgIGNvbnN0IHVybFByb21pc2VzID0gW107XG4gICAgICAgIGZvciAoY29uc3Qgd2VpZ2h0c0dyb3VwIG9mIHdlaWdodHNNYW5pZmVzdCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwYXRoIG9mIHdlaWdodHNHcm91cC5wYXRocykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLndlaWdodFVybENvbnZlcnRlciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHVybFByb21pc2VzLnB1c2godGhpcy53ZWlnaHRVcmxDb252ZXJ0ZXIocGF0aCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmV0Y2hVUkxzLnB1c2gocGF0aFByZWZpeCArIHBhdGggKyBzdWZmaXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy53ZWlnaHRVcmxDb252ZXJ0ZXIpIHtcbiAgICAgICAgICAgIGZldGNoVVJMcy5wdXNoKC4uLmF3YWl0IFByb21pc2UuYWxsKHVybFByb21pc2VzKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYnVmZmVycyA9IGF3YWl0IGxvYWRXZWlnaHRzQXNBcnJheUJ1ZmZlcihmZXRjaFVSTHMsIHtcbiAgICAgICAgICAgIHJlcXVlc3RJbml0OiB0aGlzLnJlcXVlc3RJbml0LFxuICAgICAgICAgICAgZmV0Y2hGdW5jOiB0aGlzLmZldGNoLFxuICAgICAgICAgICAgb25Qcm9ncmVzczogdGhpcy5vblByb2dyZXNzXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gW3dlaWdodFNwZWNzLCBjb25jYXRlbmF0ZUFycmF5QnVmZmVycyhidWZmZXJzKV07XG4gICAgfVxufVxuSFRUUFJlcXVlc3QuVVJMX1NDSEVNRV9SRUdFWCA9IC9eaHR0cHM/OlxcL1xcLy87XG4vKipcbiAqIEV4dHJhY3QgdGhlIHByZWZpeCBhbmQgc3VmZml4IG9mIHRoZSB1cmwsIHdoZXJlIHRoZSBwcmVmaXggaXMgdGhlIHBhdGggYmVmb3JlXG4gKiB0aGUgbGFzdCBmaWxlLCBhbmQgc3VmZml4IGlzIHRoZSBzZWFyY2ggcGFyYW1zIGFmdGVyIHRoZSBsYXN0IGZpbGUuXG4gKiBgYGBcbiAqIGNvbnN0IHVybCA9ICdodHRwOi8vdGZodWIuZGV2L21vZGVsLzEvdGVuc29yZmxvd2pzX21vZGVsLnBiP3RmanMtZm9ybWF0PWZpbGUnXG4gKiBbcHJlZml4LCBzdWZmaXhdID0gcGFyc2VVcmwodXJsKVxuICogLy8gcHJlZml4ID0gJ2h0dHA6Ly90Zmh1Yi5kZXYvbW9kZWwvMS8nXG4gKiAvLyBzdWZmaXggPSAnP3RmanMtZm9ybWF0PWZpbGUnXG4gKiBgYGBcbiAqIEBwYXJhbSB1cmwgdGhlIG1vZGVsIHVybCB0byBiZSBwYXJzZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVVybCh1cmwpIHtcbiAgICBjb25zdCBsYXN0U2xhc2ggPSB1cmwubGFzdEluZGV4T2YoJy8nKTtcbiAgICBjb25zdCBsYXN0U2VhcmNoUGFyYW0gPSB1cmwubGFzdEluZGV4T2YoJz8nKTtcbiAgICBjb25zdCBwcmVmaXggPSB1cmwuc3Vic3RyaW5nKDAsIGxhc3RTbGFzaCk7XG4gICAgY29uc3Qgc3VmZml4ID0gbGFzdFNlYXJjaFBhcmFtID4gbGFzdFNsYXNoID8gdXJsLnN1YnN0cmluZyhsYXN0U2VhcmNoUGFyYW0pIDogJyc7XG4gICAgcmV0dXJuIFtwcmVmaXggKyAnLycsIHN1ZmZpeF07XG59XG5leHBvcnQgZnVuY3Rpb24gaXNIVFRQU2NoZW1lKHVybCkge1xuICAgIHJldHVybiB1cmwubWF0Y2goSFRUUFJlcXVlc3QuVVJMX1NDSEVNRV9SRUdFWCkgIT0gbnVsbDtcbn1cbmV4cG9ydCBjb25zdCBodHRwUm91dGVyID0gKHVybCwgbG9hZE9wdGlvbnMpID0+IHtcbiAgICBpZiAodHlwZW9mIGZldGNoID09PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAobG9hZE9wdGlvbnMgPT0gbnVsbCB8fCBsb2FkT3B0aW9ucy5mZXRjaEZ1bmMgPT0gbnVsbCkpIHtcbiAgICAgICAgLy8gYGh0dHBgIHVzZXMgYGZldGNoYCBvciBgbm9kZS1mZXRjaGAsIGlmIG9uZSB3YW50cyB0byB1c2UgaXQgaW5cbiAgICAgICAgLy8gYW4gZW52aXJvbm1lbnQgdGhhdCBpcyBub3QgdGhlIGJyb3dzZXIgb3Igbm9kZSB0aGV5IGhhdmUgdG8gc2V0dXAgYVxuICAgICAgICAvLyBnbG9iYWwgZmV0Y2ggcG9seWZpbGwuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IGlzSFRUUCA9IHRydWU7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHVybCkpIHtcbiAgICAgICAgICAgIGlzSFRUUCA9IHVybC5ldmVyeSh1cmxJdGVtID0+IGlzSFRUUFNjaGVtZSh1cmxJdGVtKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpc0hUVFAgPSBpc0hUVFBTY2hlbWUodXJsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNIVFRQKSB7XG4gICAgICAgICAgICByZXR1cm4gaHR0cCh1cmwsIGxvYWRPcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn07XG5JT1JvdXRlclJlZ2lzdHJ5LnJlZ2lzdGVyU2F2ZVJvdXRlcihodHRwUm91dGVyKTtcbklPUm91dGVyUmVnaXN0cnkucmVnaXN0ZXJMb2FkUm91dGVyKGh0dHBSb3V0ZXIpO1xuLyoqXG4gKiBDcmVhdGVzIGFuIElPSGFuZGxlciBzdWJ0eXBlIHRoYXQgc2VuZHMgbW9kZWwgYXJ0aWZhY3RzIHRvIEhUVFAgc2VydmVyLlxuICpcbiAqIEFuIEhUVFAgcmVxdWVzdCBvZiB0aGUgYG11bHRpcGFydC9mb3JtLWRhdGFgIG1pbWUgdHlwZSB3aWxsIGJlIHNlbnQgdG8gdGhlXG4gKiBgcGF0aGAgVVJMLiBUaGUgZm9ybSBkYXRhIGluY2x1ZGVzIGFydGlmYWN0cyB0aGF0IHJlcHJlc2VudCB0aGUgdG9wb2xvZ3lcbiAqIGFuZC9vciB3ZWlnaHRzIG9mIHRoZSBtb2RlbC4gSW4gdGhlIGNhc2Ugb2YgS2VyYXMtc3R5bGUgYHRmLk1vZGVsYCwgdHdvXG4gKiBibG9icyAoZmlsZXMpIGV4aXN0IGluIGZvcm0tZGF0YTpcbiAqICAgLSBBIEpTT04gZmlsZSBjb25zaXN0aW5nIG9mIGBtb2RlbFRvcG9sb2d5YCBhbmQgYHdlaWdodHNNYW5pZmVzdGAuXG4gKiAgIC0gQSBiaW5hcnkgd2VpZ2h0cyBmaWxlIGNvbnNpc3Rpbmcgb2YgdGhlIGNvbmNhdGVuYXRlZCB3ZWlnaHQgdmFsdWVzLlxuICogVGhlc2UgZmlsZXMgYXJlIGluIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgb25lIGdlbmVyYXRlZCBieVxuICogW3RmanNfY29udmVydGVyXShodHRwczovL2pzLnRlbnNvcmZsb3cub3JnL3R1dG9yaWFscy9pbXBvcnQta2VyYXMuaHRtbCkuXG4gKlxuICogVGhlIGZvbGxvd2luZyBjb2RlIHNuaXBwZXQgZXhlbXBsaWZpZXMgdGhlIGNsaWVudC1zaWRlIGNvZGUgdGhhdCB1c2VzIHRoaXNcbiAqIGZ1bmN0aW9uOlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtb2RlbCA9IHRmLnNlcXVlbnRpYWwoKTtcbiAqIG1vZGVsLmFkZChcbiAqICAgICB0Zi5sYXllcnMuZGVuc2Uoe3VuaXRzOiAxLCBpbnB1dFNoYXBlOiBbMTAwXSwgYWN0aXZhdGlvbjogJ3NpZ21vaWQnfSkpO1xuICpcbiAqIGNvbnN0IHNhdmVSZXN1bHQgPSBhd2FpdCBtb2RlbC5zYXZlKHRmLmlvLmh0dHAoXG4gKiAgICAgJ2h0dHA6Ly9tb2RlbC1zZXJ2ZXI6NTAwMC91cGxvYWQnLCB7cmVxdWVzdEluaXQ6IHttZXRob2Q6ICdQVVQnfX0pKTtcbiAqIGNvbnNvbGUubG9nKHNhdmVSZXN1bHQpO1xuICogYGBgXG4gKlxuICogSWYgdGhlIGRlZmF1bHQgYFBPU1RgIG1ldGhvZCBpcyB0byBiZSB1c2VkLCB3aXRob3V0IGFueSBjdXN0b20gcGFyYW1ldGVyc1xuICogc3VjaCBhcyBoZWFkZXJzLCB5b3UgY2FuIHNpbXBseSBwYXNzIGFuIEhUVFAgb3IgSFRUUFMgVVJMIHRvIGBtb2RlbC5zYXZlYDpcbiAqXG4gKiBgYGBqc1xuICogY29uc3Qgc2F2ZVJlc3VsdCA9IGF3YWl0IG1vZGVsLnNhdmUoJ2h0dHA6Ly9tb2RlbC1zZXJ2ZXI6NTAwMC91cGxvYWQnKTtcbiAqIGBgYFxuICpcbiAqIFRoZSBmb2xsb3dpbmcgR2l0SHViIEdpc3RcbiAqIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2RzbWlsa292LzFiNjA0NmZkNjEzMmQ3NDA4ZDUyNTdiMDk3NmY3ODY0XG4gKiBpbXBsZW1lbnRzIGEgc2VydmVyIGJhc2VkIG9uIFtmbGFza10oaHR0cHM6Ly9naXRodWIuY29tL3BhbGxldHMvZmxhc2spIHRoYXRcbiAqIGNhbiByZWNlaXZlIHRoZSByZXF1ZXN0LiBVcG9uIHJlY2VpdmluZyB0aGUgbW9kZWwgYXJ0aWZhY3RzIHZpYSB0aGUgcmVxdXN0LFxuICogdGhpcyBwYXJ0aWN1bGFyIHNlcnZlciByZWNvbnNpc3R1dGVzIGluc3RhbmNlcyBvZiBbS2VyYXNcbiAqIE1vZGVsc10oaHR0cHM6Ly9rZXJhcy5pby9tb2RlbHMvbW9kZWwvKSBpbiBtZW1vcnkuXG4gKlxuICpcbiAqIEBwYXJhbSBwYXRoIEEgVVJMIHBhdGggdG8gdGhlIG1vZGVsLlxuICogICBDYW4gYmUgYW4gYWJzb2x1dGUgSFRUUCBwYXRoIChlLmcuLFxuICogICAnaHR0cDovL2xvY2FsaG9zdDo4MDAwL21vZGVsLXVwbG9hZCknKSBvciBhIHJlbGF0aXZlIHBhdGggKGUuZy4sXG4gKiAgICcuL21vZGVsLXVwbG9hZCcpLlxuICogQHBhcmFtIHJlcXVlc3RJbml0IFJlcXVlc3QgY29uZmlndXJhdGlvbnMgdG8gYmUgdXNlZCB3aGVuIHNlbmRpbmdcbiAqICAgIEhUVFAgcmVxdWVzdCB0byBzZXJ2ZXIgdXNpbmcgYGZldGNoYC4gSXQgY2FuIGNvbnRhaW4gZmllbGRzIHN1Y2ggYXNcbiAqICAgIGBtZXRob2RgLCBgY3JlZGVudGlhbHNgLCBgaGVhZGVyc2AsIGBtb2RlYCwgZXRjLiBTZWVcbiAqICAgIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9SZXF1ZXN0L1JlcXVlc3RcbiAqICAgIGZvciBtb3JlIGluZm9ybWF0aW9uLiBgcmVxdWVzdEluaXRgIG11c3Qgbm90IGhhdmUgYSBib2R5LCBiZWNhdXNlIHRoZVxuICogYm9keSB3aWxsIGJlIHNldCBieSBUZW5zb3JGbG93LmpzLiBGaWxlIGJsb2JzIHJlcHJlc2VudGluZyB0aGUgbW9kZWxcbiAqIHRvcG9sb2d5IChmaWxlbmFtZTogJ21vZGVsLmpzb24nKSBhbmQgdGhlIHdlaWdodHMgb2YgdGhlIG1vZGVsIChmaWxlbmFtZTpcbiAqICdtb2RlbC53ZWlnaHRzLmJpbicpIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGJvZHkuIElmIGByZXF1ZXN0SW5pdGAgaGFzIGFcbiAqIGBib2R5YCwgYW4gRXJyb3Igd2lsbCBiZSB0aHJvd24uXG4gKiBAcGFyYW0gbG9hZE9wdGlvbnMgT3B0aW9uYWwgY29uZmlndXJhdGlvbiBmb3IgdGhlIGxvYWRpbmcuIEl0IGluY2x1ZGVzIHRoZVxuICogICBmb2xsb3dpbmcgZmllbGRzOlxuICogICAtIHdlaWdodFBhdGhQcmVmaXggT3B0aW9uYWwsIHRoaXMgc3BlY2lmaWVzIHRoZSBwYXRoIHByZWZpeCBmb3Igd2VpZ2h0XG4gKiAgICAgZmlsZXMsIGJ5IGRlZmF1bHQgdGhpcyBpcyBjYWxjdWxhdGVkIGZyb20gdGhlIHBhdGggcGFyYW0uXG4gKiAgIC0gZmV0Y2hGdW5jIE9wdGlvbmFsLCBjdXN0b20gYGZldGNoYCBmdW5jdGlvbi4gRS5nLiwgaW4gTm9kZS5qcyxcbiAqICAgICB0aGUgYGZldGNoYCBmcm9tIG5vZGUtZmV0Y2ggY2FuIGJlIHVzZWQgaGVyZS5cbiAqICAgLSBvblByb2dyZXNzIE9wdGlvbmFsLCBwcm9ncmVzcyBjYWxsYmFjayBmdW5jdGlvbiwgZmlyZWQgcGVyaW9kaWNhbGx5XG4gKiAgICAgYmVmb3JlIHRoZSBsb2FkIGlzIGNvbXBsZXRlZC5cbiAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIGBJT0hhbmRsZXJgLlxuICpcbiAqIEBkb2Mge1xuICogICBoZWFkaW5nOiAnTW9kZWxzJyxcbiAqICAgc3ViaGVhZGluZzogJ0xvYWRpbmcnLFxuICogICBuYW1lc3BhY2U6ICdpbycsXG4gKiAgIGlnbm9yZUNJOiB0cnVlXG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBodHRwKHBhdGgsIGxvYWRPcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBIVFRQUmVxdWVzdChwYXRoLCBsb2FkT3B0aW9ucyk7XG59XG4vKipcbiAqIERlcHJlY2F0ZWQuIFVzZSBgdGYuaW8uaHR0cGAuXG4gKiBAcGFyYW0gcGF0aFxuICogQHBhcmFtIGxvYWRPcHRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBicm93c2VySFRUUFJlcXVlc3QocGF0aCwgbG9hZE9wdGlvbnMpIHtcbiAgICByZXR1cm4gaHR0cChwYXRoLCBsb2FkT3B0aW9ucyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1odHRwLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCAnLi4vZmxhZ3MnO1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi4vZW52aXJvbm1lbnQnO1xuaW1wb3J0IHsgZ2V0TW9kZWxBcnRpZmFjdHNJbmZvRm9ySlNPTiB9IGZyb20gJy4vaW9fdXRpbHMnO1xuaW1wb3J0IHsgSU9Sb3V0ZXJSZWdpc3RyeSB9IGZyb20gJy4vcm91dGVyX3JlZ2lzdHJ5JztcbmNvbnN0IERBVEFCQVNFX05BTUUgPSAndGVuc29yZmxvd2pzJztcbmNvbnN0IERBVEFCQVNFX1ZFUlNJT04gPSAxO1xuLy8gTW9kZWwgZGF0YSBhbmQgTW9kZWxBcnRpZmFjdHNJbmZvIChtZXRhZGF0YSkgYXJlIHN0b3JlZCBpbiB0d28gc2VwYXJhdGVcbi8vIHN0b3JlcyBmb3IgZWZmaWNpZW50IGFjY2VzcyBvZiB0aGUgbGlzdCBvZiBzdG9yZWQgbW9kZWxzIGFuZCB0aGVpciBtZXRhZGF0YS5cbi8vIDEuIFRoZSBvYmplY3Qgc3RvcmUgZm9yIG1vZGVsIGRhdGE6IHRvcG9sb2d5LCB3ZWlnaHRzIGFuZCB3ZWlnaHQgbWFuaWZlc3RzLlxuY29uc3QgTU9ERUxfU1RPUkVfTkFNRSA9ICdtb2RlbHNfc3RvcmUnO1xuLy8gMi4gVGhlIG9iamVjdCBzdG9yZSBmb3IgTW9kZWxBcnRpZmFjdHNJbmZvLCBpbmNsdWRpbmcgbWV0YS1pbmZvcm1hdGlvbiBzdWNoXG4vLyAgICBhcyB0aGUgdHlwZSBvZiB0b3BvbG9neSAoSlNPTiB2cyBiaW5hcnkpLCBieXRlIHNpemUgb2YgdGhlIHRvcG9sb2d5LCBieXRlXG4vLyAgICBzaXplIG9mIHRoZSB3ZWlnaHRzLCBldGMuXG5jb25zdCBJTkZPX1NUT1JFX05BTUUgPSAnbW9kZWxfaW5mb19zdG9yZSc7XG4vKipcbiAqIERlbGV0ZSB0aGUgZW50aXJlIGRhdGFiYXNlIGZvciB0ZW5zb3JmbG93LmpzLCBpbmNsdWRpbmcgdGhlIG1vZGVscyBzdG9yZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZURhdGFiYXNlKCkge1xuICAgIGNvbnN0IGlkYkZhY3RvcnkgPSBnZXRJbmRleGVkREJGYWN0b3J5KCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgZGVsZXRlUmVxdWVzdCA9IGlkYkZhY3RvcnkuZGVsZXRlRGF0YWJhc2UoREFUQUJBU0VfTkFNRSk7XG4gICAgICAgIGRlbGV0ZVJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4gcmVzb2x2ZSgpO1xuICAgICAgICBkZWxldGVSZXF1ZXN0Lm9uZXJyb3IgPSBlcnJvciA9PiByZWplY3QoZXJyb3IpO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gZ2V0SW5kZXhlZERCRmFjdG9yeSgpIHtcbiAgICBpZiAoIWVudigpLmdldEJvb2woJ0lTX0JST1dTRVInKSkge1xuICAgICAgICAvLyBUT0RPKGNhaXMpOiBBZGQgbW9yZSBpbmZvIGFib3V0IHdoYXQgSU9IYW5kbGVyIHN1YnR5cGVzIGFyZSBhdmFpbGFibGUuXG4gICAgICAgIC8vICAgTWF5YmUgcG9pbnQgdG8gYSBkb2MgcGFnZSBvbiB0aGUgd2ViIGFuZC9vciBhdXRvbWF0aWNhbGx5IGRldGVybWluZVxuICAgICAgICAvLyAgIHRoZSBhdmFpbGFibGUgSU9IYW5kbGVycyBhbmQgcHJpbnQgdGhlbSBpbiB0aGUgZXJyb3IgbWVzc2FnZS5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gb2J0YWluIEluZGV4ZWREQiBmYWN0b3J5IGJlY2F1c2UgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQnICtcbiAgICAgICAgICAgICdpcyBub3QgYSB3ZWIgYnJvd3Nlci4nKTtcbiAgICB9XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgIGNvbnN0IHRoZVdpbmRvdyA9IHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHdpbmRvdztcbiAgICBjb25zdCBmYWN0b3J5ID0gdGhlV2luZG93LmluZGV4ZWREQiB8fCB0aGVXaW5kb3cubW96SW5kZXhlZERCIHx8XG4gICAgICAgIHRoZVdpbmRvdy53ZWJraXRJbmRleGVkREIgfHwgdGhlV2luZG93Lm1zSW5kZXhlZERCIHx8XG4gICAgICAgIHRoZVdpbmRvdy5zaGltSW5kZXhlZERCO1xuICAgIGlmIChmYWN0b3J5ID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgY3VycmVudCBicm93c2VyIGRvZXMgbm90IGFwcGVhciB0byBzdXBwb3J0IEluZGV4ZWREQi4nKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhY3Rvcnk7XG59XG5mdW5jdGlvbiBzZXRVcERhdGFiYXNlKG9wZW5SZXF1ZXN0KSB7XG4gICAgY29uc3QgZGIgPSBvcGVuUmVxdWVzdC5yZXN1bHQ7XG4gICAgZGIuY3JlYXRlT2JqZWN0U3RvcmUoTU9ERUxfU1RPUkVfTkFNRSwgeyBrZXlQYXRoOiAnbW9kZWxQYXRoJyB9KTtcbiAgICBkYi5jcmVhdGVPYmplY3RTdG9yZShJTkZPX1NUT1JFX05BTUUsIHsga2V5UGF0aDogJ21vZGVsUGF0aCcgfSk7XG59XG4vKipcbiAqIElPSGFuZGxlciBzdWJjbGFzczogQnJvd3NlciBJbmRleGVkREIuXG4gKlxuICogU2VlIHRoZSBkb2Mgc3RyaW5nIG9mIGBicm93c2VySW5kZXhlZERCYCBmb3IgbW9yZSBkZXRhaWxzLlxuICovXG5leHBvcnQgY2xhc3MgQnJvd3NlckluZGV4ZWREQiB7XG4gICAgY29uc3RydWN0b3IobW9kZWxQYXRoKSB7XG4gICAgICAgIHRoaXMuaW5kZXhlZERCID0gZ2V0SW5kZXhlZERCRmFjdG9yeSgpO1xuICAgICAgICBpZiAobW9kZWxQYXRoID09IG51bGwgfHwgIW1vZGVsUGF0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3IgSW5kZXhlZERCLCBtb2RlbFBhdGggbXVzdCBub3QgYmUgbnVsbCwgdW5kZWZpbmVkIG9yIGVtcHR5LicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubW9kZWxQYXRoID0gbW9kZWxQYXRoO1xuICAgIH1cbiAgICBhc3luYyBzYXZlKG1vZGVsQXJ0aWZhY3RzKSB7XG4gICAgICAgIC8vIFRPRE8oY2Fpcyk6IFN1cHBvcnQgc2F2aW5nIEdyYXBoRGVmIG1vZGVscy5cbiAgICAgICAgaWYgKG1vZGVsQXJ0aWZhY3RzLm1vZGVsVG9wb2xvZ3kgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCcm93c2VyTG9jYWxTdG9yYWdlLnNhdmUoKSBkb2VzIG5vdCBzdXBwb3J0IHNhdmluZyBtb2RlbCB0b3BvbG9neSAnICtcbiAgICAgICAgICAgICAgICAnaW4gYmluYXJ5IGZvcm1hdHMgeWV0LicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlQWN0aW9uKHRoaXMubW9kZWxQYXRoLCBtb2RlbEFydGlmYWN0cyk7XG4gICAgfVxuICAgIGFzeW5jIGxvYWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlQWN0aW9uKHRoaXMubW9kZWxQYXRoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGVyZm9ybSBkYXRhYmFzZSBhY3Rpb24gdG8gcHV0IG1vZGVsIGFydGlmYWN0cyBpbnRvIG9yIHJlYWQgbW9kZWwgYXJ0aWZhY3RzXG4gICAgICogZnJvbSBJbmRleGVkREIgb2JqZWN0IHN0b3JlLlxuICAgICAqXG4gICAgICogV2hldGhlciB0aGUgYWN0aW9uIGlzIHB1dCBvciBnZXQgZGVwZW5kcyBvbiB3aGV0aGVyIGBtb2RlbEFydGlmYWN0c2AgaXNcbiAgICAgKiBzcGVjaWZpZWQuIElmIGl0IGlzIHNwZWNpZmllZCwgdGhlIGFjdGlvbiB3aWxsIGJlIHB1dDsgb3RoZXJ3aXNlIHRoZSBhY3Rpb25cbiAgICAgKiB3aWxsIGJlIGdldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtb2RlbFBhdGggQSB1bmlxdWUgc3RyaW5nIHBhdGggZm9yIHRoZSBtb2RlbC5cbiAgICAgKiBAcGFyYW0gbW9kZWxBcnRpZmFjdHMgSWYgc3BlY2lmaWVkLCBpdCB3aWxsIGJlIHRoZSBtb2RlbCBhcnRpZmFjdHMgdG8gYmVcbiAgICAgKiAgIHN0b3JlZCBpbiBJbmRleGVkREIuXG4gICAgICogQHJldHVybnMgQSBgUHJvbWlzZWAgb2YgYFNhdmVSZXN1bHRgLCBpZiB0aGUgYWN0aW9uIGlzIHB1dCwgb3IgYSBgUHJvbWlzZWBcbiAgICAgKiAgIG9mIGBNb2RlbEFydGlmYWN0c2AsIGlmIHRoZSBhY3Rpb24gaXMgZ2V0LlxuICAgICAqL1xuICAgIGRhdGFiYXNlQWN0aW9uKG1vZGVsUGF0aCwgbW9kZWxBcnRpZmFjdHMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9wZW5SZXF1ZXN0ID0gdGhpcy5pbmRleGVkREIub3BlbihEQVRBQkFTRV9OQU1FLCBEQVRBQkFTRV9WRVJTSU9OKTtcbiAgICAgICAgICAgIG9wZW5SZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9ICgpID0+IHNldFVwRGF0YWJhc2Uob3BlblJlcXVlc3QpO1xuICAgICAgICAgICAgb3BlblJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRiID0gb3BlblJlcXVlc3QucmVzdWx0O1xuICAgICAgICAgICAgICAgIGlmIChtb2RlbEFydGlmYWN0cyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJlYWQgbW9kZWwgb3V0IGZyb20gb2JqZWN0IHN0b3JlLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtb2RlbFR4ID0gZGIudHJhbnNhY3Rpb24oTU9ERUxfU1RPUkVfTkFNRSwgJ3JlYWRvbmx5Jyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1vZGVsU3RvcmUgPSBtb2RlbFR4Lm9iamVjdFN0b3JlKE1PREVMX1NUT1JFX05BTUUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBnZXRSZXF1ZXN0ID0gbW9kZWxTdG9yZS5nZXQodGhpcy5tb2RlbFBhdGgpO1xuICAgICAgICAgICAgICAgICAgICBnZXRSZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRSZXF1ZXN0LnJlc3VsdCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGIuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgbW9kZWwgd2l0aCBwYXRoICcke3RoaXMubW9kZWxQYXRofScgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBpbiBJbmRleGVkREIuYCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShnZXRSZXF1ZXN0LnJlc3VsdC5tb2RlbEFydGlmYWN0cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGdldFJlcXVlc3Qub25lcnJvciA9IGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KGdldFJlcXVlc3QuZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBtb2RlbFR4Lm9uY29tcGxldGUgPSAoKSA9PiBkYi5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUHV0IG1vZGVsIGludG8gb2JqZWN0IHN0b3JlLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtb2RlbEFydGlmYWN0c0luZm8gPSBnZXRNb2RlbEFydGlmYWN0c0luZm9Gb3JKU09OKG1vZGVsQXJ0aWZhY3RzKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gRmlyc3QsIHB1dCBNb2RlbEFydGlmYWN0c0luZm8gaW50byBpbmZvIHN0b3JlLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmZvVHggPSBkYi50cmFuc2FjdGlvbihJTkZPX1NUT1JFX05BTUUsICdyZWFkd3JpdGUnKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluZm9TdG9yZSA9IGluZm9UeC5vYmplY3RTdG9yZShJTkZPX1NUT1JFX05BTUUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwdXRJbmZvUmVxdWVzdCA9IGluZm9TdG9yZS5wdXQoeyBtb2RlbFBhdGg6IHRoaXMubW9kZWxQYXRoLCBtb2RlbEFydGlmYWN0c0luZm8gfSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtb2RlbFR4O1xuICAgICAgICAgICAgICAgICAgICBwdXRJbmZvUmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWNvbmQsIHB1dCBtb2RlbCBkYXRhIGludG8gbW9kZWwgc3RvcmUuXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbFR4ID0gZGIudHJhbnNhY3Rpb24oTU9ERUxfU1RPUkVfTkFNRSwgJ3JlYWR3cml0ZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9kZWxTdG9yZSA9IG1vZGVsVHgub2JqZWN0U3RvcmUoTU9ERUxfU1RPUkVfTkFNRSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwdXRNb2RlbFJlcXVlc3QgPSBtb2RlbFN0b3JlLnB1dCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxQYXRoOiB0aGlzLm1vZGVsUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbEFydGlmYWN0cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbEFydGlmYWN0c0luZm9cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHV0TW9kZWxSZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHJlc29sdmUoeyBtb2RlbEFydGlmYWN0c0luZm8gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwdXRNb2RlbFJlcXVlc3Qub25lcnJvciA9IGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcHV0LW1vZGVsIHJlcXVlc3QgZmFpbHMsIHJvbGwgYmFjayB0aGUgaW5mbyBlbnRyeSBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlbGwuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1N0b3JlID0gaW5mb1R4Lm9iamVjdFN0b3JlKElORk9fU1RPUkVfTkFNRSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVsZXRlSW5mb1JlcXVlc3QgPSBpbmZvU3RvcmUuZGVsZXRlKHRoaXMubW9kZWxQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVJbmZvUmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QocHV0TW9kZWxSZXF1ZXN0LmVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUluZm9SZXF1ZXN0Lm9uZXJyb3IgPSBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QocHV0TW9kZWxSZXF1ZXN0LmVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgcHV0SW5mb1JlcXVlc3Qub25lcnJvciA9IGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KHB1dEluZm9SZXF1ZXN0LmVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaW5mb1R4Lm9uY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kZWxUeCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGIuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsVHgub25jb21wbGV0ZSA9ICgpID0+IGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIG9wZW5SZXF1ZXN0Lm9uZXJyb3IgPSBlcnJvciA9PiByZWplY3Qob3BlblJlcXVlc3QuZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5Ccm93c2VySW5kZXhlZERCLlVSTF9TQ0hFTUUgPSAnaW5kZXhlZGRiOi8vJztcbmV4cG9ydCBjb25zdCBpbmRleGVkREJSb3V0ZXIgPSAodXJsKSA9PiB7XG4gICAgaWYgKCFlbnYoKS5nZXRCb29sKCdJU19CUk9XU0VSJykpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodXJsKSAmJiB1cmwuc3RhcnRzV2l0aChCcm93c2VySW5kZXhlZERCLlVSTF9TQ0hFTUUpKSB7XG4gICAgICAgICAgICByZXR1cm4gYnJvd3NlckluZGV4ZWREQih1cmwuc2xpY2UoQnJvd3NlckluZGV4ZWREQi5VUkxfU0NIRU1FLmxlbmd0aCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG59O1xuSU9Sb3V0ZXJSZWdpc3RyeS5yZWdpc3RlclNhdmVSb3V0ZXIoaW5kZXhlZERCUm91dGVyKTtcbklPUm91dGVyUmVnaXN0cnkucmVnaXN0ZXJMb2FkUm91dGVyKGluZGV4ZWREQlJvdXRlcik7XG4vKipcbiAqIENyZWF0ZXMgYSBicm93c2VyIEluZGV4ZWREQiBJT0hhbmRsZXIgZm9yIHNhdmluZyBhbmQgbG9hZGluZyBtb2RlbHMuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1vZGVsID0gdGYuc2VxdWVudGlhbCgpO1xuICogbW9kZWwuYWRkKFxuICogICAgIHRmLmxheWVycy5kZW5zZSh7dW5pdHM6IDEsIGlucHV0U2hhcGU6IFsxMDBdLCBhY3RpdmF0aW9uOiAnc2lnbW9pZCd9KSk7XG4gKlxuICogY29uc3Qgc2F2ZVJlc3VsdCA9IGF3YWl0IG1vZGVsLnNhdmUoJ2luZGV4ZWRkYjovL015TW9kZWwnKSk7XG4gKiBjb25zb2xlLmxvZyhzYXZlUmVzdWx0KTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBtb2RlbFBhdGggQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG1vZGVsIHRvIGJlIHNhdmVkLiBNdXN0IGJlIGFcbiAqICAgbm9uLWVtcHR5IHN0cmluZy5cbiAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIGBCcm93c2VySW5kZXhlZERCYCAoc3VibGNhc3Mgb2YgYElPSGFuZGxlcmApLFxuICogICB3aGljaCBjYW4gYmUgdXNlZCB3aXRoLCBlLmcuLCBgdGYuTW9kZWwuc2F2ZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBicm93c2VySW5kZXhlZERCKG1vZGVsUGF0aCkge1xuICAgIHJldHVybiBuZXcgQnJvd3NlckluZGV4ZWREQihtb2RlbFBhdGgpO1xufVxuZnVuY3Rpb24gbWF5YmVTdHJpcFNjaGVtZShrZXkpIHtcbiAgICByZXR1cm4ga2V5LnN0YXJ0c1dpdGgoQnJvd3NlckluZGV4ZWREQi5VUkxfU0NIRU1FKSA/XG4gICAgICAgIGtleS5zbGljZShCcm93c2VySW5kZXhlZERCLlVSTF9TQ0hFTUUubGVuZ3RoKSA6XG4gICAgICAgIGtleTtcbn1cbmV4cG9ydCBjbGFzcyBCcm93c2VySW5kZXhlZERCTWFuYWdlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuaW5kZXhlZERCID0gZ2V0SW5kZXhlZERCRmFjdG9yeSgpO1xuICAgIH1cbiAgICBhc3luYyBsaXN0TW9kZWxzKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3BlblJlcXVlc3QgPSB0aGlzLmluZGV4ZWREQi5vcGVuKERBVEFCQVNFX05BTUUsIERBVEFCQVNFX1ZFUlNJT04pO1xuICAgICAgICAgICAgb3BlblJlcXVlc3Qub251cGdyYWRlbmVlZGVkID0gKCkgPT4gc2V0VXBEYXRhYmFzZShvcGVuUmVxdWVzdCk7XG4gICAgICAgICAgICBvcGVuUmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGIgPSBvcGVuUmVxdWVzdC5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgY29uc3QgdHggPSBkYi50cmFuc2FjdGlvbihJTkZPX1NUT1JFX05BTUUsICdyZWFkb25seScpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0b3JlID0gdHgub2JqZWN0U3RvcmUoSU5GT19TVE9SRV9OQU1FKTtcbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZTptYXgtbGluZS1sZW5ndGhcbiAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIGNhc3QgYHN0b3JlYCBhcyBgYW55YCBoZXJlIGJlY2F1c2UgVHlwZVNjcmlwdCdzIERPTVxuICAgICAgICAgICAgICAgIC8vIGxpYnJhcnkgZG9lcyBub3QgaGF2ZSB0aGUgYGdldEFsbCgpYCBtZXRob2QgZXZlbiB0aG91Z2ggdGhlXG4gICAgICAgICAgICAgICAgLy8gbWV0aG9kIGlzIHN1cHBvcnRlZCBpbiB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgbW9zdCBtYWluc3RyZWFtXG4gICAgICAgICAgICAgICAgLy8gYnJvd3NlcnM6XG4gICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0lEQk9iamVjdFN0b3JlL2dldEFsbFxuICAgICAgICAgICAgICAgIC8vIHRzbGludDplbmFibGU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgICAgICAgICAgICAgIGNvbnN0IGdldEFsbEluZm9SZXF1ZXN0ID0gc3RvcmUuZ2V0QWxsKCk7XG4gICAgICAgICAgICAgICAgZ2V0QWxsSW5mb1JlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvdXQgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGdldEFsbEluZm9SZXF1ZXN0LnJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0W2l0ZW0ubW9kZWxQYXRoXSA9IGl0ZW0ubW9kZWxBcnRpZmFjdHNJbmZvO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUob3V0KTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGdldEFsbEluZm9SZXF1ZXN0Lm9uZXJyb3IgPSBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QoZ2V0QWxsSW5mb1JlcXVlc3QuZXJyb3IpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdHgub25jb21wbGV0ZSA9ICgpID0+IGRiLmNsb3NlKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgb3BlblJlcXVlc3Qub25lcnJvciA9IGVycm9yID0+IHJlamVjdChvcGVuUmVxdWVzdC5lcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyByZW1vdmVNb2RlbChwYXRoKSB7XG4gICAgICAgIHBhdGggPSBtYXliZVN0cmlwU2NoZW1lKHBhdGgpO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3BlblJlcXVlc3QgPSB0aGlzLmluZGV4ZWREQi5vcGVuKERBVEFCQVNFX05BTUUsIERBVEFCQVNFX1ZFUlNJT04pO1xuICAgICAgICAgICAgb3BlblJlcXVlc3Qub251cGdyYWRlbmVlZGVkID0gKCkgPT4gc2V0VXBEYXRhYmFzZShvcGVuUmVxdWVzdCk7XG4gICAgICAgICAgICBvcGVuUmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGIgPSBvcGVuUmVxdWVzdC5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5mb1R4ID0gZGIudHJhbnNhY3Rpb24oSU5GT19TVE9SRV9OQU1FLCAncmVhZHdyaXRlJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5mb1N0b3JlID0gaW5mb1R4Lm9iamVjdFN0b3JlKElORk9fU1RPUkVfTkFNRSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZ2V0SW5mb1JlcXVlc3QgPSBpbmZvU3RvcmUuZ2V0KHBhdGgpO1xuICAgICAgICAgICAgICAgIGxldCBtb2RlbFR4O1xuICAgICAgICAgICAgICAgIGdldEluZm9SZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGdldEluZm9SZXF1ZXN0LnJlc3VsdCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYi5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoYENhbm5vdCBmaW5kIG1vZGVsIHdpdGggcGF0aCAnJHtwYXRofScgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYGluIEluZGV4ZWREQi5gKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXJzdCwgZGVsZXRlIHRoZSBlbnRyeSBpbiB0aGUgaW5mbyBzdG9yZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbGV0ZUluZm9SZXF1ZXN0ID0gaW5mb1N0b3JlLmRlbGV0ZShwYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbGV0ZU1vZGVsRGF0YSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWNvbmQsIGRlbGV0ZSB0aGUgZW50cnkgaW4gdGhlIG1vZGVsIHN0b3JlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsVHggPSBkYi50cmFuc2FjdGlvbihNT0RFTF9TVE9SRV9OQU1FLCAncmVhZHdyaXRlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9kZWxTdG9yZSA9IG1vZGVsVHgub2JqZWN0U3RvcmUoTU9ERUxfU1RPUkVfTkFNRSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVsZXRlTW9kZWxSZXF1ZXN0ID0gbW9kZWxTdG9yZS5kZWxldGUocGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlTW9kZWxSZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHJlc29sdmUoZ2V0SW5mb1JlcXVlc3QucmVzdWx0Lm1vZGVsQXJ0aWZhY3RzSW5mbyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlTW9kZWxSZXF1ZXN0Lm9uZXJyb3IgPSBlcnJvciA9PiByZWplY3QoZ2V0SW5mb1JlcXVlc3QuZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByb2NlZWQgd2l0aCBkZWxldGluZyBtb2RlbCBkYXRhIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBkZWxldGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgaW5mbyBkYXRhIHN1Y2NlZWRzIG9yIG5vdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUluZm9SZXF1ZXN0Lm9uc3VjY2VzcyA9IGRlbGV0ZU1vZGVsRGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUluZm9SZXF1ZXN0Lm9uZXJyb3IgPSBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlTW9kZWxEYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGIuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KGdldEluZm9SZXF1ZXN0LmVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGdldEluZm9SZXF1ZXN0Lm9uZXJyb3IgPSBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QoZ2V0SW5mb1JlcXVlc3QuZXJyb3IpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaW5mb1R4Lm9uY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtb2RlbFR4ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbFR4Lm9uY29tcGxldGUgPSAoKSA9PiBkYi5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBvcGVuUmVxdWVzdC5vbmVycm9yID0gZXJyb3IgPT4gcmVqZWN0KG9wZW5SZXF1ZXN0LmVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXhlZF9kYi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vLyBJbXBvcnRpbmcgbG9jYWxfc3RvcmFnZSBhbmQgaW5kZXhlZF9kYiBpcyBuZWNlc3NhcnkgZm9yIHRoZSByb3V0ZXJzIHRvIGJlXG4vLyByZWdpc3RlcmVkLlxuaW1wb3J0ICcuL2luZGV4ZWRfZGInO1xuaW1wb3J0ICcuL2xvY2FsX3N0b3JhZ2UnO1xuaW1wb3J0IHsgYnJvd3NlckZpbGVzIH0gZnJvbSAnLi9icm93c2VyX2ZpbGVzJztcbmltcG9ydCB7IGJyb3dzZXJIVFRQUmVxdWVzdCwgaHR0cCwgaXNIVFRQU2NoZW1lIH0gZnJvbSAnLi9odHRwJztcbmltcG9ydCB7IGNvbmNhdGVuYXRlQXJyYXlCdWZmZXJzLCBkZWNvZGVXZWlnaHRzLCBlbmNvZGVXZWlnaHRzLCBnZXRNb2RlbEFydGlmYWN0c0ZvckpTT04sIGdldE1vZGVsQXJ0aWZhY3RzSW5mb0ZvckpTT04gfSBmcm9tICcuL2lvX3V0aWxzJztcbmltcG9ydCB7IGZyb21NZW1vcnksIHdpdGhTYXZlSGFuZGxlciB9IGZyb20gJy4vcGFzc3Rocm91Z2gnO1xuaW1wb3J0IHsgZ2V0TG9hZEhhbmRsZXJzLCBnZXRTYXZlSGFuZGxlcnMsIHJlZ2lzdGVyTG9hZFJvdXRlciwgcmVnaXN0ZXJTYXZlUm91dGVyIH0gZnJvbSAnLi9yb3V0ZXJfcmVnaXN0cnknO1xuaW1wb3J0IHsgbG9hZFdlaWdodHMsIHdlaWdodHNMb2FkZXJGYWN0b3J5IH0gZnJvbSAnLi93ZWlnaHRzX2xvYWRlcic7XG5leHBvcnQgeyBjb3B5TW9kZWwsIGxpc3RNb2RlbHMsIG1vdmVNb2RlbCwgcmVtb3ZlTW9kZWwgfSBmcm9tICcuL21vZGVsX21hbmFnZW1lbnQnO1xuZXhwb3J0IHsgYnJvd3NlckZpbGVzLCBicm93c2VySFRUUFJlcXVlc3QsIGNvbmNhdGVuYXRlQXJyYXlCdWZmZXJzLCBkZWNvZGVXZWlnaHRzLCBlbmNvZGVXZWlnaHRzLCBmcm9tTWVtb3J5LCBnZXRMb2FkSGFuZGxlcnMsIGdldE1vZGVsQXJ0aWZhY3RzRm9ySlNPTiwgZ2V0TW9kZWxBcnRpZmFjdHNJbmZvRm9ySlNPTiwgZ2V0U2F2ZUhhbmRsZXJzLCBodHRwLCBpc0hUVFBTY2hlbWUsIGxvYWRXZWlnaHRzLCByZWdpc3RlckxvYWRSb3V0ZXIsIHJlZ2lzdGVyU2F2ZVJvdXRlciwgd2VpZ2h0c0xvYWRlckZhY3RvcnksIHdpdGhTYXZlSGFuZGxlciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW8uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29tcGxleCB9IGZyb20gJy4uL29wcy9jb21wbGV4JztcbmltcG9ydCB7IHRlbnNvciB9IGZyb20gJy4uL29wcy90ZW5zb3InO1xuaW1wb3J0IHsgc2l6ZUZyb21TaGFwZSB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgRFRZUEVfVkFMVUVfU0laRV9NQVAgfSBmcm9tICcuL3R5cGVzJztcbi8qKiBOdW1iZXIgb2YgYnl0ZXMgcmVzZXJ2ZWQgZm9yIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZy4gKDMyYml0IGludGVnZXIpLiAqL1xuY29uc3QgTlVNX0JZVEVTX1NUUklOR19MRU5HVEggPSA0O1xuLyoqXG4gKiBFbmNvZGUgYSBtYXAgZnJvbSBuYW1lcyB0byB3ZWlnaHQgdmFsdWVzIGFzIGFuIEFycmF5QnVmZmVyLCBhbG9uZyB3aXRoIGFuXG4gKiBgQXJyYXlgIG9mIGBXZWlnaHRzTWFuaWZlc3RFbnRyeWAgYXMgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZW5jb2RlZCB3ZWlnaHRzLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcGVyZm9ybSBzaGFyZGluZy5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSByZXZlcnNlIG9mIGBkZWNvZGVXZWlnaHRzYC5cbiAqXG4gKiBAcGFyYW0gdGVuc29ycyBBIG1hcCAoXCJkaWN0XCIpIGZyb20gbmFtZXMgdG8gdGVuc29ycy5cbiAqIEBwYXJhbSBncm91cCBHcm91cCB0byB3aGljaCB0aGUgd2VpZ2h0cyBiZWxvbmcgKG9wdGlvbmFsKS5cbiAqIEByZXR1cm5zIEEgYFByb21pc2VgIG9mXG4gKiAgIC0gQSBmbGF0IGBBcnJheUJ1ZmZlcmAgd2l0aCBhbGwgdGhlIGJpbmFyeSB2YWx1ZXMgb2YgdGhlIGBUZW5zb3Jgc1xuICogICAgIGNvbmNhdGVuYXRlZC5cbiAqICAgLSBBbiBgQXJyYXlgIG9mIGBXZWlnaHRNYW5pZmVzdEVudHJ5YHMsIGNhcnJ5aW5nIGluZm9ybWF0aW9uIGluY2x1ZGluZ1xuICogICAgIHRlbnNvciBuYW1lcywgYGR0eXBlYHMgYW5kIHNoYXBlcy5cbiAqIEB0aHJvd3MgRXJyb3I6IG9uIHVuc3VwcG9ydGVkIHRlbnNvciBgZHR5cGVgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5jb2RlV2VpZ2h0cyh0ZW5zb3JzLCBncm91cCkge1xuICAgIC8vIFRPRE8oYWRhcm9iLCBjYWlzKTogU3VwcG9ydCBxdWFudGl6YXRpb24uXG4gICAgY29uc3Qgc3BlY3MgPSBbXTtcbiAgICBjb25zdCBkYXRhUHJvbWlzZXMgPSBbXTtcbiAgICBjb25zdCBuYW1lcyA9IEFycmF5LmlzQXJyYXkodGVuc29ycykgP1xuICAgICAgICB0ZW5zb3JzLm1hcCh0ZW5zb3IgPT4gdGVuc29yLm5hbWUpIDpcbiAgICAgICAgT2JqZWN0LmtleXModGVuc29ycyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBuYW1lID0gbmFtZXNbaV07XG4gICAgICAgIGNvbnN0IHQgPSBBcnJheS5pc0FycmF5KHRlbnNvcnMpID8gdGVuc29yc1tpXS50ZW5zb3IgOiB0ZW5zb3JzW25hbWVdO1xuICAgICAgICBpZiAodC5kdHlwZSAhPT0gJ2Zsb2F0MzInICYmIHQuZHR5cGUgIT09ICdpbnQzMicgJiYgdC5kdHlwZSAhPT0gJ2Jvb2wnICYmXG4gICAgICAgICAgICB0LmR0eXBlICE9PSAnc3RyaW5nJyAmJiB0LmR0eXBlICE9PSAnY29tcGxleDY0Jykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBkdHlwZSBpbiB3ZWlnaHQgJyR7bmFtZX0nOiAke3QuZHR5cGV9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3BlYyA9IHsgbmFtZSwgc2hhcGU6IHQuc2hhcGUsIGR0eXBlOiB0LmR0eXBlIH07XG4gICAgICAgIGlmICh0LmR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3QgdXRmOGJ5dGVzID0gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWxzID0gYXdhaXQgdC5ieXRlcygpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvdGFsTnVtQnl0ZXMgPSB2YWxzLnJlZHVjZSgocCwgYykgPT4gcCArIGMubGVuZ3RoLCAwKSArXG4gICAgICAgICAgICAgICAgICAgIE5VTV9CWVRFU19TVFJJTkdfTEVOR1RIICogdmFscy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheSh0b3RhbE51bUJ5dGVzKTtcbiAgICAgICAgICAgICAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gdmFsc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnl0ZXNPZkxlbmd0aCA9IG5ldyBVaW50OEFycmF5KG5ldyBVaW50MzJBcnJheShbdmFsLmxlbmd0aF0pLmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIGJ5dGVzLnNldChieXRlc09mTGVuZ3RoLCBvZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gTlVNX0JZVEVTX1NUUklOR19MRU5HVEg7XG4gICAgICAgICAgICAgICAgICAgIGJ5dGVzLnNldCh2YWwsIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSB2YWwubGVuZ3RoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXNvbHZlKGJ5dGVzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZGF0YVByb21pc2VzLnB1c2godXRmOGJ5dGVzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRhdGFQcm9taXNlcy5wdXNoKHQuZGF0YSgpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ3JvdXAgIT0gbnVsbCkge1xuICAgICAgICAgICAgc3BlYy5ncm91cCA9IGdyb3VwO1xuICAgICAgICB9XG4gICAgICAgIHNwZWNzLnB1c2goc3BlYyk7XG4gICAgfVxuICAgIGNvbnN0IHRlbnNvclZhbHVlcyA9IGF3YWl0IFByb21pc2UuYWxsKGRhdGFQcm9taXNlcyk7XG4gICAgcmV0dXJuIHsgZGF0YTogY29uY2F0ZW5hdGVUeXBlZEFycmF5cyh0ZW5zb3JWYWx1ZXMpLCBzcGVjcyB9O1xufVxuLyoqXG4gKiBEZWNvZGUgZmxhdCBBcnJheUJ1ZmZlciBhcyB3ZWlnaHRzLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaGFuZGxlIHNoYXJkaW5nLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaXMgdGhlIHJldmVyc2Ugb2YgYGVuY29kZVdlaWdodHNgLlxuICpcbiAqIEBwYXJhbSBidWZmZXIgQSBmbGF0IEFycmF5QnVmZmVyIGNhcnJ5aW5nIHRoZSBiaW5hcnkgdmFsdWVzIG9mIHRoZSB0ZW5zb3JzXG4gKiAgIGNvbmNhdGVuYXRlZCBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkIGluIGBzcGVjc2AuXG4gKiBAcGFyYW0gc3BlY3MgU3BlY2lmaWNhdGlvbnMgb2YgdGhlIG5hbWVzLCBkdHlwZXMgYW5kIHNoYXBlcyBvZiB0aGUgdGVuc29yc1xuICogICB3aG9zZSB2YWx1ZSBhcmUgZW5jb2RlZCBieSBgYnVmZmVyYC5cbiAqIEByZXR1cm4gQSBtYXAgZnJvbSB0ZW5zb3IgbmFtZSB0byB0ZW5zb3IgdmFsdWUsIHdpdGggdGhlIG5hbWVzIGNvcnJlc3BvbmRpbmdcbiAqICAgdG8gbmFtZXMgaW4gYHNwZWNzYC5cbiAqIEB0aHJvd3MgRXJyb3IsIGlmIGFueSBvZiB0aGUgdGVuc29ycyBoYXMgdW5zdXBwb3J0ZWQgZHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVXZWlnaHRzKGJ1ZmZlciwgc3BlY3MpIHtcbiAgICAvLyBUT0RPKGFkYXJvYiwgY2Fpcyk6IFN1cHBvcnQgcXVhbnRpemF0aW9uLlxuICAgIGNvbnN0IG91dCA9IHt9O1xuICAgIGxldCBmbG9hdDE2RGVjb2RlO1xuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIGZvciAoY29uc3Qgc3BlYyBvZiBzcGVjcykge1xuICAgICAgICBjb25zdCBuYW1lID0gc3BlYy5uYW1lO1xuICAgICAgICBjb25zdCBkdHlwZSA9IHNwZWMuZHR5cGU7XG4gICAgICAgIGNvbnN0IHNoYXBlID0gc3BlYy5zaGFwZTtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHNpemVGcm9tU2hhcGUoc2hhcGUpO1xuICAgICAgICBsZXQgdmFsdWVzO1xuICAgICAgICBpZiAoJ3F1YW50aXphdGlvbicgaW4gc3BlYykge1xuICAgICAgICAgICAgY29uc3QgcXVhbnRpemF0aW9uID0gc3BlYy5xdWFudGl6YXRpb247XG4gICAgICAgICAgICBpZiAocXVhbnRpemF0aW9uLmR0eXBlID09PSAndWludDgnIHx8IHF1YW50aXphdGlvbi5kdHlwZSA9PT0gJ3VpbnQxNicpIHtcbiAgICAgICAgICAgICAgICBpZiAoISgnbWluJyBpbiBxdWFudGl6YXRpb24gJiYgJ3NjYWxlJyBpbiBxdWFudGl6YXRpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgV2VpZ2h0ICR7c3BlYy5uYW1lfSB3aXRoIHF1YW50aXphdGlvbiAke3F1YW50aXphdGlvbi5kdHlwZX0gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgZG9lc24ndCBoYXZlIGNvcnJlc3BvbmRpbmcgbWV0YWRhdGEgbWluIGFuZCBzY2FsZS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChxdWFudGl6YXRpb24uZHR5cGUgPT09ICdmbG9hdDE2Jykge1xuICAgICAgICAgICAgICAgIGlmIChkdHlwZSAhPT0gJ2Zsb2F0MzInKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgV2VpZ2h0ICR7c3BlYy5uYW1lfSBpcyBxdWFudGl6ZWQgd2l0aCAke3F1YW50aXphdGlvbi5kdHlwZX0gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgd2hpY2ggb25seSBzdXBwb3J0cyB3ZWlnaHRzIG9mIHR5cGUgZmxvYXQzMiBub3QgJHtkdHlwZX0uYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBXZWlnaHQgJHtzcGVjLm5hbWV9IGhhcyB1bmtub3duIGAgK1xuICAgICAgICAgICAgICAgICAgICBgcXVhbnRpemF0aW9uIGR0eXBlICR7cXVhbnRpemF0aW9uLmR0eXBlfS4gYCArXG4gICAgICAgICAgICAgICAgICAgIGBTdXBwb3J0ZWQgcXVhbnRpemF0aW9uIGR0eXBlcyBhcmU6IGAgK1xuICAgICAgICAgICAgICAgICAgICBgJ3VpbnQ4JywgJ3VpbnQxNicsIGFuZCAnZmxvYXQxNicuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBxdWFudGl6YXRpb25TaXplRmFjdG9yID0gRFRZUEVfVkFMVUVfU0laRV9NQVBbcXVhbnRpemF0aW9uLmR0eXBlXTtcbiAgICAgICAgICAgIGNvbnN0IGJ5dGVCdWZmZXIgPSBidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBzaXplICogcXVhbnRpemF0aW9uU2l6ZUZhY3Rvcik7XG4gICAgICAgICAgICBjb25zdCBxdWFudGl6ZWRBcnJheSA9IChxdWFudGl6YXRpb24uZHR5cGUgPT09ICd1aW50OCcpID9cbiAgICAgICAgICAgICAgICBuZXcgVWludDhBcnJheShieXRlQnVmZmVyKSA6XG4gICAgICAgICAgICAgICAgbmV3IFVpbnQxNkFycmF5KGJ5dGVCdWZmZXIpO1xuICAgICAgICAgICAgaWYgKGR0eXBlID09PSAnZmxvYXQzMicpIHtcbiAgICAgICAgICAgICAgICBpZiAocXVhbnRpemF0aW9uLmR0eXBlID09PSAndWludDgnIHx8IHF1YW50aXphdGlvbi5kdHlwZSA9PT0gJ3VpbnQxNicpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gbmV3IEZsb2F0MzJBcnJheShxdWFudGl6ZWRBcnJheS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHF1YW50aXplZEFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ID0gcXVhbnRpemVkQXJyYXlbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbaV0gPSB2ICogcXVhbnRpemF0aW9uLnNjYWxlICsgcXVhbnRpemF0aW9uLm1pbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChxdWFudGl6YXRpb24uZHR5cGUgPT09ICdmbG9hdDE2Jykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmxvYXQxNkRlY29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdDE2RGVjb2RlID0gZ2V0RmxvYXQxNkRlY29kZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBmbG9hdDE2RGVjb2RlKHF1YW50aXplZEFycmF5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgcXVhbnRpemF0aW9uIHR5cGUgJHtxdWFudGl6YXRpb24uZHR5cGV9IGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYGZvciB3ZWlnaHQgdHlwZSBmbG9hdDMyLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGR0eXBlID09PSAnaW50MzInKSB7XG4gICAgICAgICAgICAgICAgaWYgKHF1YW50aXphdGlvbi5kdHlwZSAhPT0gJ3VpbnQ4JyAmJiBxdWFudGl6YXRpb24uZHR5cGUgIT09ICd1aW50MTYnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgcXVhbnRpemF0aW9uIHR5cGUgJHtxdWFudGl6YXRpb24uZHR5cGV9IGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYGZvciB3ZWlnaHQgdHlwZSBpbnQzMi5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFsdWVzID0gbmV3IEludDMyQXJyYXkocXVhbnRpemVkQXJyYXkubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHF1YW50aXplZEFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHYgPSBxdWFudGl6ZWRBcnJheVtpXTtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzW2ldID0gTWF0aC5yb3VuZCh2ICogcXVhbnRpemF0aW9uLnNjYWxlICsgcXVhbnRpemF0aW9uLm1pbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBkdHlwZSBpbiB3ZWlnaHQgJyR7bmFtZX0nOiAke2R0eXBlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2Zmc2V0ICs9IHNpemUgKiBxdWFudGl6YXRpb25TaXplRmFjdG9yO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IHNpemVGcm9tU2hhcGUoc3BlYy5zaGFwZSk7XG4gICAgICAgICAgICB2YWx1ZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYnl0ZUxlbmd0aCA9IG5ldyBVaW50MzJBcnJheShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBOVU1fQllURVNfU1RSSU5HX0xFTkdUSCkpWzBdO1xuICAgICAgICAgICAgICAgIG9mZnNldCArPSBOVU1fQllURVNfU1RSSU5HX0xFTkdUSDtcbiAgICAgICAgICAgICAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIGJ5dGVMZW5ndGgpKTtcbiAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaChieXRlcyk7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGJ5dGVMZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBkdHlwZUZhY3RvciA9IERUWVBFX1ZBTFVFX1NJWkVfTUFQW2R0eXBlXTtcbiAgICAgICAgICAgIGNvbnN0IGJ5dGVCdWZmZXIgPSBidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBzaXplICogZHR5cGVGYWN0b3IpO1xuICAgICAgICAgICAgaWYgKGR0eXBlID09PSAnZmxvYXQzMicpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgRmxvYXQzMkFycmF5KGJ5dGVCdWZmZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZHR5cGUgPT09ICdpbnQzMicpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgSW50MzJBcnJheShieXRlQnVmZmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGR0eXBlID09PSAnYm9vbCcpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgVWludDhBcnJheShieXRlQnVmZmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBGbG9hdDMyQXJyYXkoYnl0ZUJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVhbCA9IG5ldyBGbG9hdDMyQXJyYXkodmFsdWVzLmxlbmd0aCAvIDIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGltYWdlID0gbmV3IEZsb2F0MzJBcnJheSh2YWx1ZXMubGVuZ3RoIC8gMik7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlYWxbaV0gPSB2YWx1ZXNbaSAqIDJdO1xuICAgICAgICAgICAgICAgICAgICBpbWFnZVtpXSA9IHZhbHVlc1tpICogMiArIDFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCByZWFsVGVuc29yID0gdGVuc29yKHJlYWwsIHNoYXBlLCAnZmxvYXQzMicpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGltYWdlVGVuc29yID0gdGVuc29yKGltYWdlLCBzaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICAgICAgICAgICAgICBvdXRbbmFtZV0gPSBjb21wbGV4KHJlYWxUZW5zb3IsIGltYWdlVGVuc29yKTtcbiAgICAgICAgICAgICAgICByZWFsVGVuc29yLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgICAgICBpbWFnZVRlbnNvci5kaXNwb3NlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGR0eXBlIGluIHdlaWdodCAnJHtuYW1lfSc6ICR7ZHR5cGV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZSAqIGR0eXBlRmFjdG9yO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkdHlwZSAhPT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgICAgIG91dFtuYW1lXSA9IHRlbnNvcih2YWx1ZXMsIHNoYXBlLCBkdHlwZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ29uY2F0ZW5hdGUgVHlwZWRBcnJheXMgaW50byBhbiBBcnJheUJ1ZmZlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmNhdGVuYXRlVHlwZWRBcnJheXMoeHMpIHtcbiAgICAvLyBUT0RPKGFkYXJvYiwgY2Fpcyk6IFN1cHBvcnQgcXVhbnRpemF0aW9uLlxuICAgIGlmICh4cyA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaW5wdXQgdmFsdWU6ICR7SlNPTi5zdHJpbmdpZnkoeHMpfWApO1xuICAgIH1cbiAgICBsZXQgdG90YWxCeXRlTGVuZ3RoID0gMDtcbiAgICAvLyBgbm9ybWFsaXplZFhzYCBpcyBoZXJlIGZvciB0aGlzIHJlYXNvbjogYSBgVHlwZWRBcnJheWAncyBgYnVmZmVyJ1xuICAgIC8vIGNhbiBoYXZlIGEgZGlmZmVyZW50IGJ5dGUgbGVuZ3RoIGZyb20gdGhhdCBvZiB0aGUgYFR5cGVkQXJyYXlgIGl0c2VsZixcbiAgICAvLyBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgYFR5cGVkQXJyYXlgIGlzIGNyZWF0ZWQgZnJvbSBhbiBvZmZzZXQgaW4gYW5cbiAgICAvLyBgQXJyYXlCdWZmZXJgLiBgbm9ybWxpYXplZFhzYCBob2xkcyBgVHlwZWRBcnJheWBzIHdob3NlIGBidWZmZXJgcyBtYXRjaFxuICAgIC8vIHRoZSBgVHlwZWRBcnJheWAgaW4gYnl0ZSBsZW5ndGguIElmIGFuIGVsZW1lbnQgb2YgYHhzYCBkb2VzIG5vdCBzaG93XG4gICAgLy8gdGhpcyBwcm9wZXJ0eSwgYSBuZXcgYFR5cGVkQXJyYXlgIHRoYXQgc2F0aXNmeSB0aGlzIHByb3BlcnR5IHdpbGwgYmVcbiAgICAvLyBjb25zdHJ1Y3RlZCBhbmQgcHVzaGVkIGludG8gYG5vcm1hbGl6ZWRYc2AuXG4gICAgY29uc3Qgbm9ybWFsaXplZFhzID0gW107XG4gICAgeHMuZm9yRWFjaCgoeCkgPT4ge1xuICAgICAgICB0b3RhbEJ5dGVMZW5ndGggKz0geC5ieXRlTGVuZ3RoO1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby1hbnlcbiAgICAgICAgbm9ybWFsaXplZFhzLnB1c2goeC5ieXRlTGVuZ3RoID09PSB4LmJ1ZmZlci5ieXRlTGVuZ3RoID8geCA6XG4gICAgICAgICAgICBuZXcgeC5jb25zdHJ1Y3Rvcih4KSk7XG4gICAgICAgIGlmICghKHggaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkgfHwgeCBpbnN0YW5jZW9mIEludDMyQXJyYXkgfHxcbiAgICAgICAgICAgIHggaW5zdGFuY2VvZiBVaW50OEFycmF5KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBUeXBlZEFycmF5IHN1YnR5cGU6ICR7eC5jb25zdHJ1Y3Rvci5uYW1lfWApO1xuICAgICAgICB9XG4gICAgICAgIC8vIHRzbGludDplbmFibGU6bm8tYW55XG4gICAgfSk7XG4gICAgY29uc3QgeSA9IG5ldyBVaW50OEFycmF5KHRvdGFsQnl0ZUxlbmd0aCk7XG4gICAgbGV0IG9mZnNldCA9IDA7XG4gICAgbm9ybWFsaXplZFhzLmZvckVhY2goKHgpID0+IHtcbiAgICAgICAgeS5zZXQobmV3IFVpbnQ4QXJyYXkoeC5idWZmZXIpLCBvZmZzZXQpO1xuICAgICAgICBvZmZzZXQgKz0geC5ieXRlTGVuZ3RoO1xuICAgIH0pO1xuICAgIHJldHVybiB5LmJ1ZmZlcjtcbn1cbi8vIFVzZSBCdWZmZXIgb24gTm9kZS5qcyBpbnN0ZWFkIG9mIEJsb2IvYXRvYi9idG9hXG5jb25zdCB1c2VOb2RlQnVmZmVyID0gdHlwZW9mIEJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAodHlwZW9mIEJsb2IgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBhdG9iID09PSAndW5kZWZpbmVkJyB8fFxuICAgICAgICB0eXBlb2YgYnRvYSA9PT0gJ3VuZGVmaW5lZCcpO1xuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIGJ5dGUgbGVuZ3RoIG9mIGEgSmF2YVNjcmlwdCBzdHJpbmcuXG4gKlxuICogTm90ZSB0aGF0IGEgSmF2YVNjcmlwdCBzdHJpbmcgY2FuIGNvbnRhaW4gd2lkZSBjaGFyYWN0ZXJzLCB0aGVyZWZvcmUgdGhlXG4gKiBsZW5ndGggb2YgdGhlIHN0cmluZyBpcyBub3QgbmVjZXNzYXJpbHkgZXF1YWwgdG8gdGhlIGJ5dGUgbGVuZ3RoLlxuICpcbiAqIEBwYXJhbSBzdHIgSW5wdXQgc3RyaW5nLlxuICogQHJldHVybnMgQnl0ZSBsZW5ndGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdCeXRlTGVuZ3RoKHN0cikge1xuICAgIGlmICh1c2VOb2RlQnVmZmVyKSB7XG4gICAgICAgIHJldHVybiBCdWZmZXIuYnl0ZUxlbmd0aChzdHIpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEJsb2IoW3N0cl0pLnNpemU7XG59XG4vKipcbiAqIEVuY29kZSBhbiBBcnJheUJ1ZmZlciBhcyBhIGJhc2U2NCBlbmNvZGVkIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gYnVmZmVyIGBBcnJheUJ1ZmZlcmAgdG8gYmUgY29udmVydGVkLlxuICogQHJldHVybnMgQSBzdHJpbmcgdGhhdCBiYXNlNjQtZW5jb2RlcyBgYnVmZmVyYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFycmF5QnVmZmVyVG9CYXNlNjRTdHJpbmcoYnVmZmVyKSB7XG4gICAgaWYgKHVzZU5vZGVCdWZmZXIpIHtcbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGJ1ZmZlcikudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgIH1cbiAgICBjb25zdCBidWYgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xuICAgIGxldCBzID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSBidWYubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gYnRvYShzKTtcbn1cbi8qKlxuICogRGVjb2RlIGEgYmFzZTY0IHN0cmluZyBhcyBhbiBBcnJheUJ1ZmZlci5cbiAqXG4gKiBAcGFyYW0gc3RyIEJhc2U2NCBzdHJpbmcuXG4gKiBAcmV0dXJucyBEZWNvZGVkIGBBcnJheUJ1ZmZlcmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiYXNlNjRTdHJpbmdUb0FycmF5QnVmZmVyKHN0cikge1xuICAgIGlmICh1c2VOb2RlQnVmZmVyKSB7XG4gICAgICAgIGNvbnN0IGJ1ZiA9IEJ1ZmZlci5mcm9tKHN0ciwgJ2Jhc2U2NCcpO1xuICAgICAgICByZXR1cm4gYnVmLmJ1ZmZlci5zbGljZShidWYuYnl0ZU9mZnNldCwgYnVmLmJ5dGVPZmZzZXQgKyBidWYuYnl0ZUxlbmd0aCk7XG4gICAgfVxuICAgIGNvbnN0IHMgPSBhdG9iKHN0cik7XG4gICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkocy5sZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBidWZmZXIuc2V0KFtzLmNoYXJDb2RlQXQoaSldLCBpKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1ZmZlci5idWZmZXI7XG59XG4vKipcbiAqIENvbmNhdGVuYXRlIGEgbnVtYmVyIG9mIEFycmF5QnVmZmVycyBpbnRvIG9uZS5cbiAqXG4gKiBAcGFyYW0gYnVmZmVycyBBIG51bWJlciBvZiBhcnJheSBidWZmZXJzIHRvIGNvbmNhdGVuYXRlLlxuICogQHJldHVybnMgUmVzdWx0IG9mIGNvbmNhdGVuYXRpbmcgYGJ1ZmZlcnNgIGluIG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uY2F0ZW5hdGVBcnJheUJ1ZmZlcnMoYnVmZmVycykge1xuICAgIGlmIChidWZmZXJzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gYnVmZmVyc1swXTtcbiAgICB9XG4gICAgbGV0IHRvdGFsQnl0ZUxlbmd0aCA9IDA7XG4gICAgYnVmZmVycy5mb3JFYWNoKChidWZmZXIpID0+IHtcbiAgICAgICAgdG90YWxCeXRlTGVuZ3RoICs9IGJ1ZmZlci5ieXRlTGVuZ3RoO1xuICAgIH0pO1xuICAgIGNvbnN0IHRlbXAgPSBuZXcgVWludDhBcnJheSh0b3RhbEJ5dGVMZW5ndGgpO1xuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIGJ1ZmZlcnMuZm9yRWFjaCgoYnVmZmVyKSA9PiB7XG4gICAgICAgIHRlbXAuc2V0KG5ldyBVaW50OEFycmF5KGJ1ZmZlciksIG9mZnNldCk7XG4gICAgICAgIG9mZnNldCArPSBidWZmZXIuYnl0ZUxlbmd0aDtcbiAgICB9KTtcbiAgICByZXR1cm4gdGVtcC5idWZmZXI7XG59XG4vKipcbiAqIEdldCB0aGUgYmFzZW5hbWUgb2YgYSBwYXRoLlxuICpcbiAqIEJlaGF2ZXMgaW4gYSB3YXkgYW5hbG9nb3VzIHRvIExpbnV4J3MgYmFzZW5hbWUgY29tbWFuZC5cbiAqXG4gKiBAcGFyYW0gcGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gYmFzZW5hbWUocGF0aCkge1xuICAgIGNvbnN0IFNFUEFSQVRPUiA9ICcvJztcbiAgICBwYXRoID0gcGF0aC50cmltKCk7XG4gICAgd2hpbGUgKHBhdGguZW5kc1dpdGgoU0VQQVJBVE9SKSkge1xuICAgICAgICBwYXRoID0gcGF0aC5zbGljZSgwLCBwYXRoLmxlbmd0aCAtIDEpO1xuICAgIH1cbiAgICBjb25zdCBpdGVtcyA9IHBhdGguc3BsaXQoU0VQQVJBVE9SKTtcbiAgICByZXR1cm4gaXRlbXNbaXRlbXMubGVuZ3RoIC0gMV07XG59XG4vKipcbiAqIENyZWF0ZSBgTW9kZWxKU09OYCBmcm9tIGBNb2RlbEFydGlmYWN0c2AuXG4gKlxuICogQHBhcmFtIGFydGlmYWN0cyBNb2RlbCBhcnRpZmFjdHMsIGRlc2NyaWJpbmcgdGhlIG1vZGVsIGFuZCBpdHMgd2VpZ2h0cy5cbiAqIEBwYXJhbSBtYW5pZmVzdCBXZWlnaHQgbWFuaWZlc3QsIGRlc2NyaWJpbmcgd2hlcmUgdGhlIHdlaWdodHMgb2YgdGhlXG4gKiAgICAgYE1vZGVsQXJ0aWZhY3RzYCBhcmUgc3RvcmVkLCBhbmQgc29tZSBtZXRhZGF0YSBhYm91dCB0aGVtLlxuICogQHJldHVybnMgT2JqZWN0IHJlcHJlc2VudGluZyB0aGUgYG1vZGVsLmpzb25gIGZpbGUgZGVzY3JpYmluZyB0aGUgbW9kZWxcbiAqICAgICBhcnRpZmFjdHMgYW5kIHdlaWdodHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1vZGVsSlNPTkZvck1vZGVsQXJ0aWZhY3RzKGFydGlmYWN0cywgbWFuaWZlc3QpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgIG1vZGVsVG9wb2xvZ3k6IGFydGlmYWN0cy5tb2RlbFRvcG9sb2d5LFxuICAgICAgICBmb3JtYXQ6IGFydGlmYWN0cy5mb3JtYXQsXG4gICAgICAgIGdlbmVyYXRlZEJ5OiBhcnRpZmFjdHMuZ2VuZXJhdGVkQnksXG4gICAgICAgIGNvbnZlcnRlZEJ5OiBhcnRpZmFjdHMuY29udmVydGVkQnksXG4gICAgICAgIHdlaWdodHNNYW5pZmVzdDogbWFuaWZlc3RcbiAgICB9O1xuICAgIGlmIChhcnRpZmFjdHMuc2lnbmF0dXJlICE9IG51bGwpIHtcbiAgICAgICAgcmVzdWx0LnNpZ25hdHVyZSA9IGFydGlmYWN0cy5zaWduYXR1cmU7XG4gICAgfVxuICAgIGlmIChhcnRpZmFjdHMudXNlckRlZmluZWRNZXRhZGF0YSAhPSBudWxsKSB7XG4gICAgICAgIHJlc3VsdC51c2VyRGVmaW5lZE1ldGFkYXRhID0gYXJ0aWZhY3RzLnVzZXJEZWZpbmVkTWV0YWRhdGE7XG4gICAgfVxuICAgIGlmIChhcnRpZmFjdHMubW9kZWxJbml0aWFsaXplciAhPSBudWxsKSB7XG4gICAgICAgIHJlc3VsdC5tb2RlbEluaXRpYWxpemVyID0gYXJ0aWZhY3RzLm1vZGVsSW5pdGlhbGl6ZXI7XG4gICAgfVxuICAgIGlmIChhcnRpZmFjdHMudHJhaW5pbmdDb25maWcgIT0gbnVsbCkge1xuICAgICAgICByZXN1bHQudHJhaW5pbmdDb25maWcgPSBhcnRpZmFjdHMudHJhaW5pbmdDb25maWc7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIENyZWF0ZSBgTW9kZWxBcnRpZmFjdHNgIGZyb20gYSBKU09OIGZpbGUuXG4gKlxuICogQHBhcmFtIG1vZGVsSlNPTiBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyc2VkIEpTT04gb2YgYG1vZGVsLmpzb25gXG4gKiBAcGFyYW0gbG9hZFdlaWdodHMgRnVuY3Rpb24gdGhhdCB0YWtlcyB0aGUgSlNPTiBmaWxlJ3Mgd2VpZ2h0cyBtYW5pZmVzdCxcbiAqICAgICByZWFkcyB3ZWlnaHRzIGZyb20gdGhlIGxpc3RlZCBwYXRoKHMpLCBhbmQgcmV0dXJucyBhIFByb21pc2Ugb2YgdGhlXG4gKiAgICAgd2VpZ2h0IG1hbmlmZXN0IGVudHJpZXMgYWxvbmcgd2l0aCB0aGUgd2VpZ2h0cyBkYXRhLlxuICogQHJldHVybnMgQSBQcm9taXNlIG9mIHRoZSBgTW9kZWxBcnRpZmFjdHNgLCBhcyBkZXNjcmliZWQgYnkgdGhlIEpTT04gZmlsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE1vZGVsQXJ0aWZhY3RzRm9ySlNPTihtb2RlbEpTT04sIGxvYWRXZWlnaHRzKSB7XG4gICAgY29uc3QgbW9kZWxBcnRpZmFjdHMgPSB7XG4gICAgICAgIG1vZGVsVG9wb2xvZ3k6IG1vZGVsSlNPTi5tb2RlbFRvcG9sb2d5LFxuICAgICAgICBmb3JtYXQ6IG1vZGVsSlNPTi5mb3JtYXQsXG4gICAgICAgIGdlbmVyYXRlZEJ5OiBtb2RlbEpTT04uZ2VuZXJhdGVkQnksXG4gICAgICAgIGNvbnZlcnRlZEJ5OiBtb2RlbEpTT04uY29udmVydGVkQnlcbiAgICB9O1xuICAgIGlmIChtb2RlbEpTT04udHJhaW5pbmdDb25maWcgIT0gbnVsbCkge1xuICAgICAgICBtb2RlbEFydGlmYWN0cy50cmFpbmluZ0NvbmZpZyA9IG1vZGVsSlNPTi50cmFpbmluZ0NvbmZpZztcbiAgICB9XG4gICAgaWYgKG1vZGVsSlNPTi53ZWlnaHRzTWFuaWZlc3QgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBbd2VpZ2h0U3BlY3MsIHdlaWdodERhdGFdID0gYXdhaXQgbG9hZFdlaWdodHMobW9kZWxKU09OLndlaWdodHNNYW5pZmVzdCk7XG4gICAgICAgIG1vZGVsQXJ0aWZhY3RzLndlaWdodFNwZWNzID0gd2VpZ2h0U3BlY3M7XG4gICAgICAgIG1vZGVsQXJ0aWZhY3RzLndlaWdodERhdGEgPSB3ZWlnaHREYXRhO1xuICAgIH1cbiAgICBpZiAobW9kZWxKU09OLnNpZ25hdHVyZSAhPSBudWxsKSB7XG4gICAgICAgIG1vZGVsQXJ0aWZhY3RzLnNpZ25hdHVyZSA9IG1vZGVsSlNPTi5zaWduYXR1cmU7XG4gICAgfVxuICAgIGlmIChtb2RlbEpTT04udXNlckRlZmluZWRNZXRhZGF0YSAhPSBudWxsKSB7XG4gICAgICAgIG1vZGVsQXJ0aWZhY3RzLnVzZXJEZWZpbmVkTWV0YWRhdGEgPSBtb2RlbEpTT04udXNlckRlZmluZWRNZXRhZGF0YTtcbiAgICB9XG4gICAgaWYgKG1vZGVsSlNPTi5tb2RlbEluaXRpYWxpemVyICE9IG51bGwpIHtcbiAgICAgICAgbW9kZWxBcnRpZmFjdHMubW9kZWxJbml0aWFsaXplciA9IG1vZGVsSlNPTi5tb2RlbEluaXRpYWxpemVyO1xuICAgIH1cbiAgICByZXR1cm4gbW9kZWxBcnRpZmFjdHM7XG59XG4vKipcbiAqIFBvcHVsYXRlIE1vZGVsQXJ0aWZhY3RzSW5mbyBmaWVsZHMgZm9yIGEgbW9kZWwgd2l0aCBKU09OIHRvcG9sb2d5LlxuICogQHBhcmFtIG1vZGVsQXJ0aWZhY3RzXG4gKiBAcmV0dXJucyBBIE1vZGVsQXJ0aWZhY3RzSW5mbyBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNb2RlbEFydGlmYWN0c0luZm9Gb3JKU09OKG1vZGVsQXJ0aWZhY3RzKSB7XG4gICAgaWYgKG1vZGVsQXJ0aWZhY3RzLm1vZGVsVG9wb2xvZ3kgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIEpTT04gbW9kZWwgdG9wb2xvZ3ksIHJlY2VpdmVkIEFycmF5QnVmZmVyLicpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBkYXRlU2F2ZWQ6IG5ldyBEYXRlKCksXG4gICAgICAgIG1vZGVsVG9wb2xvZ3lUeXBlOiAnSlNPTicsXG4gICAgICAgIG1vZGVsVG9wb2xvZ3lCeXRlczogbW9kZWxBcnRpZmFjdHMubW9kZWxUb3BvbG9neSA9PSBudWxsID9cbiAgICAgICAgICAgIDAgOlxuICAgICAgICAgICAgc3RyaW5nQnl0ZUxlbmd0aChKU09OLnN0cmluZ2lmeShtb2RlbEFydGlmYWN0cy5tb2RlbFRvcG9sb2d5KSksXG4gICAgICAgIHdlaWdodFNwZWNzQnl0ZXM6IG1vZGVsQXJ0aWZhY3RzLndlaWdodFNwZWNzID09IG51bGwgP1xuICAgICAgICAgICAgMCA6XG4gICAgICAgICAgICBzdHJpbmdCeXRlTGVuZ3RoKEpTT04uc3RyaW5naWZ5KG1vZGVsQXJ0aWZhY3RzLndlaWdodFNwZWNzKSksXG4gICAgICAgIHdlaWdodERhdGFCeXRlczogbW9kZWxBcnRpZmFjdHMud2VpZ2h0RGF0YSA9PSBudWxsID9cbiAgICAgICAgICAgIDAgOlxuICAgICAgICAgICAgbW9kZWxBcnRpZmFjdHMud2VpZ2h0RGF0YS5ieXRlTGVuZ3RoLFxuICAgIH07XG59XG4vKipcbiAqIENvbXB1dGVzIG1hbnRpc2EgdGFibGUgZm9yIGNhc3RpbmcgRmxvYXQxNiB0byBGbG9hdDMyXG4gKiBTZWUgaHR0cDovL3d3dy5mb3gtdG9vbGtpdC5vcmcvZnRwL2Zhc3RoYWxmZmxvYXRjb252ZXJzaW9uLnBkZlxuICpcbiAqIEByZXR1cm5zIFVpbnQzMkFycmF5LCAyMDQ4IG1hbnRpc3NhIGxvb2t1cCB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVGbG9hdDE2TWFudGlzYVRhYmxlKCkge1xuICAgIGNvbnN0IGNvbnZlcnRNYW50aXNzYSA9IChpKSA9PiB7XG4gICAgICAgIGxldCBtID0gaSA8PCAxMztcbiAgICAgICAgbGV0IGUgPSAwO1xuICAgICAgICB3aGlsZSAoKG0gJiAweDAwODAwMDAwKSA9PT0gMCkge1xuICAgICAgICAgICAgZSAtPSAweDAwODAwMDAwO1xuICAgICAgICAgICAgbSA8PD0gMTtcbiAgICAgICAgfVxuICAgICAgICBtICY9IH4weDAwODAwMDAwO1xuICAgICAgICBlICs9IDB4Mzg4MDAwMDA7XG4gICAgICAgIHJldHVybiBtIHwgZTtcbiAgICB9O1xuICAgIGNvbnN0IG1hbnRpc2FUYWJsZSA9IG5ldyBVaW50MzJBcnJheSgyMDQ4KTtcbiAgICBtYW50aXNhVGFibGVbMF0gPSAwO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgMTAyNDsgaSsrKSB7XG4gICAgICAgIG1hbnRpc2FUYWJsZVtpXSA9IGNvbnZlcnRNYW50aXNzYShpKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDEwMjQ7IGkgPCAyMDQ4OyBpKyspIHtcbiAgICAgICAgbWFudGlzYVRhYmxlW2ldID0gMHgzODAwMDAwMCArICgoaSAtIDEwMjQpIDw8IDEzKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hbnRpc2FUYWJsZTtcbn1cbi8qKlxuICogQ29tcHV0ZXMgZXhwb25lbnQgdGFibGUgZm9yIGNhc3RpbmcgRmxvYXQxNiB0byBGbG9hdDMyXG4gKiBTZWUgaHR0cDovL3d3dy5mb3gtdG9vbGtpdC5vcmcvZnRwL2Zhc3RoYWxmZmxvYXRjb252ZXJzaW9uLnBkZlxuICpcbiAqIEByZXR1cm5zIFVpbnQzMkFycmF5LCA2NCBleHBvbmVudCBsb29rdXAgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBjb21wdXRlRmxvYXQxNkV4cG9uZW50VGFibGUoKSB7XG4gICAgY29uc3QgZXhwb25lbnRUYWJsZSA9IG5ldyBVaW50MzJBcnJheSg2NCk7XG4gICAgZXhwb25lbnRUYWJsZVswXSA9IDA7XG4gICAgZXhwb25lbnRUYWJsZVszMV0gPSAweDQ3ODAwMDAwO1xuICAgIGV4cG9uZW50VGFibGVbMzJdID0gMHg4MDAwMDAwMDtcbiAgICBleHBvbmVudFRhYmxlWzYzXSA9IDB4Yzc4MDAwMDA7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCAzMTsgaSsrKSB7XG4gICAgICAgIGV4cG9uZW50VGFibGVbaV0gPSBpIDw8IDIzO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMzM7IGkgPCA2MzsgaSsrKSB7XG4gICAgICAgIGV4cG9uZW50VGFibGVbaV0gPSAweDgwMDAwMDAwICsgKChpIC0gMzIpIDw8IDIzKTtcbiAgICB9XG4gICAgcmV0dXJuIGV4cG9uZW50VGFibGU7XG59XG4vKipcbiAqIENvbXB1dGVzIG9mZnNldCB0YWJsZSBmb3IgY2FzdGluZyBGbG9hdDE2IHRvIEZsb2F0MzJcbiAqIFNlZSBodHRwOi8vd3d3LmZveC10b29sa2l0Lm9yZy9mdHAvZmFzdGhhbGZmbG9hdGNvbnZlcnNpb24ucGRmXG4gKlxuICogQHJldHVybnMgVWludDMyQXJyYXksIDZkIG9mZnNldCB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVGbG9hdDE2T2Zmc2V0VGFibGUoKSB7XG4gICAgY29uc3Qgb2Zmc2V0VGFibGUgPSBuZXcgVWludDMyQXJyYXkoNjQpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNjQ7IGkrKykge1xuICAgICAgICBvZmZzZXRUYWJsZVtpXSA9IDEwMjQ7XG4gICAgfVxuICAgIG9mZnNldFRhYmxlWzBdID0gb2Zmc2V0VGFibGVbMzJdID0gMDtcbiAgICByZXR1cm4gb2Zmc2V0VGFibGU7XG59XG4vKipcbiAqIFJldHJpZXZlIGEgRmxvYXQxNiBkZWNvZGVyIHdoaWNoIHdpbGwgZGVjb2RlIGEgQnl0ZUFycmF5IG9mIEZsb2F0MTYgdmFsdWVzXG4gKiB0byBhIEZsb2F0MzJBcnJheS5cbiAqXG4gKiBAcmV0dXJucyBGdW5jdGlvbiAoYnVmZmVyOiBVaW50MTZBcnJheSkgPT4gRmxvYXQzMkFycmF5IHdoaWNoIGRlY29kZXNcbiAqICAgICAgICAgIHRoZSBVaW50MTZBcnJheSBvZiBGbG9hdDE2IGJ5dGVzIHRvIGEgRmxvYXQzMkFycmF5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmxvYXQxNkRlY29kZXIoKSB7XG4gICAgLy8gQWxnb3JpdGhtIGlzIGJhc2VkIG9mZiBvZlxuICAgIC8vIGh0dHA6Ly93d3cuZm94LXRvb2xraXQub3JnL2Z0cC9mYXN0aGFsZmZsb2F0Y29udmVyc2lvbi5wZGZcbiAgICAvLyBDYWNoZSBsb29rdXAgdGFibGVzXG4gICAgY29uc3QgbWFudGlzYVRhYmxlID0gY29tcHV0ZUZsb2F0MTZNYW50aXNhVGFibGUoKTtcbiAgICBjb25zdCBleHBvbmVudFRhYmxlID0gY29tcHV0ZUZsb2F0MTZFeHBvbmVudFRhYmxlKCk7XG4gICAgY29uc3Qgb2Zmc2V0VGFibGUgPSBjb21wdXRlRmxvYXQxNk9mZnNldFRhYmxlKCk7XG4gICAgcmV0dXJuIChxdWFudGl6ZWRBcnJheSkgPT4ge1xuICAgICAgICBjb25zdCBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoNCAqIHF1YW50aXplZEFycmF5Lmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IGJ1ZmZlclVpbnQzMlZpZXcgPSBuZXcgVWludDMyQXJyYXkoYnVmZmVyKTtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHF1YW50aXplZEFycmF5Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgZmxvYXQxNkJpdHMgPSBxdWFudGl6ZWRBcnJheVtpbmRleF07XG4gICAgICAgICAgICBjb25zdCBmbG9hdDMyQml0cyA9IG1hbnRpc2FUYWJsZVtvZmZzZXRUYWJsZVtmbG9hdDE2Qml0cyA+PiAxMF0gKyAoZmxvYXQxNkJpdHMgJiAweDNmZildICtcbiAgICAgICAgICAgICAgICBleHBvbmVudFRhYmxlW2Zsb2F0MTZCaXRzID4+IDEwXTtcbiAgICAgICAgICAgIGJ1ZmZlclVpbnQzMlZpZXdbaW5kZXhdID0gZmxvYXQzMkJpdHM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoYnVmZmVyKTtcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW9fdXRpbHMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0ICcuLi9mbGFncyc7XG5pbXBvcnQgeyBlbnYgfSBmcm9tICcuLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IGFycmF5QnVmZmVyVG9CYXNlNjRTdHJpbmcsIGJhc2U2NFN0cmluZ1RvQXJyYXlCdWZmZXIsIGdldE1vZGVsQXJ0aWZhY3RzSW5mb0ZvckpTT04gfSBmcm9tICcuL2lvX3V0aWxzJztcbmltcG9ydCB7IElPUm91dGVyUmVnaXN0cnkgfSBmcm9tICcuL3JvdXRlcl9yZWdpc3RyeSc7XG5jb25zdCBQQVRIX1NFUEFSQVRPUiA9ICcvJztcbmNvbnN0IFBBVEhfUFJFRklYID0gJ3RlbnNvcmZsb3dqc19tb2RlbHMnO1xuY29uc3QgSU5GT19TVUZGSVggPSAnaW5mbyc7XG5jb25zdCBNT0RFTF9UT1BPTE9HWV9TVUZGSVggPSAnbW9kZWxfdG9wb2xvZ3knO1xuY29uc3QgV0VJR0hUX1NQRUNTX1NVRkZJWCA9ICd3ZWlnaHRfc3BlY3MnO1xuY29uc3QgV0VJR0hUX0RBVEFfU1VGRklYID0gJ3dlaWdodF9kYXRhJztcbmNvbnN0IE1PREVMX01FVEFEQVRBX1NVRkZJWCA9ICdtb2RlbF9tZXRhZGF0YSc7XG4vKipcbiAqIFB1cmdlIGFsbCB0ZW5zb3JmbG93LmpzLXNhdmVkIG1vZGVsIGFydGlmYWN0cyBmcm9tIGxvY2FsIHN0b3JhZ2UuXG4gKlxuICogQHJldHVybnMgUGF0aHMgb2YgdGhlIG1vZGVscyBwdXJnZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwdXJnZUxvY2FsU3RvcmFnZUFydGlmYWN0cygpIHtcbiAgICBpZiAoIWVudigpLmdldEJvb2woJ0lTX0JST1dTRVInKSB8fCB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyB8fFxuICAgICAgICB0eXBlb2Ygd2luZG93LmxvY2FsU3RvcmFnZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwdXJnZUxvY2FsU3RvcmFnZU1vZGVscygpIGNhbm5vdCBwcm9jZWVkIGJlY2F1c2UgbG9jYWwgc3RvcmFnZSBpcyAnICtcbiAgICAgICAgICAgICd1bmF2YWlsYWJsZSBpbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudC4nKTtcbiAgICB9XG4gICAgY29uc3QgTFMgPSB3aW5kb3cubG9jYWxTdG9yYWdlO1xuICAgIGNvbnN0IHB1cmdlZE1vZGVsUGF0aHMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IExTLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IExTLmtleShpKTtcbiAgICAgICAgY29uc3QgcHJlZml4ID0gUEFUSF9QUkVGSVggKyBQQVRIX1NFUEFSQVRPUjtcbiAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKHByZWZpeCkgJiYga2V5Lmxlbmd0aCA+IHByZWZpeC5sZW5ndGgpIHtcbiAgICAgICAgICAgIExTLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgICAgICAgIGNvbnN0IG1vZGVsTmFtZSA9IGdldE1vZGVsUGF0aEZyb21LZXkoa2V5KTtcbiAgICAgICAgICAgIGlmIChwdXJnZWRNb2RlbFBhdGhzLmluZGV4T2YobW9kZWxOYW1lKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBwdXJnZWRNb2RlbFBhdGhzLnB1c2gobW9kZWxOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHVyZ2VkTW9kZWxQYXRocztcbn1cbmZ1bmN0aW9uIGdldE1vZGVsS2V5cyhwYXRoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaW5mbzogW1BBVEhfUFJFRklYLCBwYXRoLCBJTkZPX1NVRkZJWF0uam9pbihQQVRIX1NFUEFSQVRPUiksXG4gICAgICAgIHRvcG9sb2d5OiBbUEFUSF9QUkVGSVgsIHBhdGgsIE1PREVMX1RPUE9MT0dZX1NVRkZJWF0uam9pbihQQVRIX1NFUEFSQVRPUiksXG4gICAgICAgIHdlaWdodFNwZWNzOiBbUEFUSF9QUkVGSVgsIHBhdGgsIFdFSUdIVF9TUEVDU19TVUZGSVhdLmpvaW4oUEFUSF9TRVBBUkFUT1IpLFxuICAgICAgICB3ZWlnaHREYXRhOiBbUEFUSF9QUkVGSVgsIHBhdGgsIFdFSUdIVF9EQVRBX1NVRkZJWF0uam9pbihQQVRIX1NFUEFSQVRPUiksXG4gICAgICAgIG1vZGVsTWV0YWRhdGE6IFtQQVRIX1BSRUZJWCwgcGF0aCwgTU9ERUxfTUVUQURBVEFfU1VGRklYXS5qb2luKFBBVEhfU0VQQVJBVE9SKVxuICAgIH07XG59XG5mdW5jdGlvbiByZW1vdmVJdGVtcyhrZXlzKSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LnZhbHVlcyhrZXlzKSkge1xuICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICB9XG59XG4vKipcbiAqIEdldCBtb2RlbCBwYXRoIGZyb20gYSBsb2NhbC1zdG9yYWdlIGtleS5cbiAqXG4gKiBFLmcuLCAndGVuc29yZmxvd2pzX21vZGVscy9teS9tb2RlbC8xL2luZm8nIC0tPiAnbXkvbW9kZWwvMSdcbiAqXG4gKiBAcGFyYW0ga2V5XG4gKi9cbmZ1bmN0aW9uIGdldE1vZGVsUGF0aEZyb21LZXkoa2V5KSB7XG4gICAgY29uc3QgaXRlbXMgPSBrZXkuc3BsaXQoUEFUSF9TRVBBUkFUT1IpO1xuICAgIGlmIChpdGVtcy5sZW5ndGggPCAzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBrZXkgZm9ybWF0OiAke2tleX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zLnNsaWNlKDEsIGl0ZW1zLmxlbmd0aCAtIDEpLmpvaW4oUEFUSF9TRVBBUkFUT1IpO1xufVxuZnVuY3Rpb24gbWF5YmVTdHJpcFNjaGVtZShrZXkpIHtcbiAgICByZXR1cm4ga2V5LnN0YXJ0c1dpdGgoQnJvd3NlckxvY2FsU3RvcmFnZS5VUkxfU0NIRU1FKSA/XG4gICAgICAgIGtleS5zbGljZShCcm93c2VyTG9jYWxTdG9yYWdlLlVSTF9TQ0hFTUUubGVuZ3RoKSA6XG4gICAgICAgIGtleTtcbn1cbi8qKlxuICogSU9IYW5kbGVyIHN1YmNsYXNzOiBCcm93c2VyIExvY2FsIFN0b3JhZ2UuXG4gKlxuICogU2VlIHRoZSBkb2Mgc3RyaW5nIHRvIGBicm93c2VyTG9jYWxTdG9yYWdlYCBmb3IgbW9yZSBkZXRhaWxzLlxuICovXG5leHBvcnQgY2xhc3MgQnJvd3NlckxvY2FsU3RvcmFnZSB7XG4gICAgY29uc3RydWN0b3IobW9kZWxQYXRoKSB7XG4gICAgICAgIGlmICghZW52KCkuZ2V0Qm9vbCgnSVNfQlJPV1NFUicpIHx8IHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAgICAgICB0eXBlb2Ygd2luZG93LmxvY2FsU3RvcmFnZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIC8vIFRPRE8oY2Fpcyk6IEFkZCBtb3JlIGluZm8gYWJvdXQgd2hhdCBJT0hhbmRsZXIgc3VidHlwZXMgYXJlXG4gICAgICAgICAgICAvLyBhdmFpbGFibGUuXG4gICAgICAgICAgICAvLyAgIE1heWJlIHBvaW50IHRvIGEgZG9jIHBhZ2Ugb24gdGhlIHdlYiBhbmQvb3IgYXV0b21hdGljYWxseSBkZXRlcm1pbmVcbiAgICAgICAgICAgIC8vICAgdGhlIGF2YWlsYWJsZSBJT0hhbmRsZXJzIGFuZCBwcmludCB0aGVtIGluIHRoZSBlcnJvciBtZXNzYWdlLlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgY3VycmVudCBlbnZpcm9ubWVudCBkb2VzIG5vdCBzdXBwb3J0IGxvY2FsIHN0b3JhZ2UuJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5MUyA9IHdpbmRvdy5sb2NhbFN0b3JhZ2U7XG4gICAgICAgIGlmIChtb2RlbFBhdGggPT0gbnVsbCB8fCAhbW9kZWxQYXRoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvciBsb2NhbCBzdG9yYWdlLCBtb2RlbFBhdGggbXVzdCBub3QgYmUgbnVsbCwgdW5kZWZpbmVkIG9yIGVtcHR5LicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubW9kZWxQYXRoID0gbW9kZWxQYXRoO1xuICAgICAgICB0aGlzLmtleXMgPSBnZXRNb2RlbEtleXModGhpcy5tb2RlbFBhdGgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTYXZlIG1vZGVsIGFydGlmYWN0cyB0byBicm93c2VyIGxvY2FsIHN0b3JhZ2UuXG4gICAgICpcbiAgICAgKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gdG8gYGJyb3dzZXJMb2NhbFN0b3JhZ2VgIGZvciBkZXRhaWxzIG9uIHRoZSBzYXZlZFxuICAgICAqIGFydGlmYWN0cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtb2RlbEFydGlmYWN0cyBUaGUgbW9kZWwgYXJ0aWZhY3RzIHRvIGJlIHN0b3JlZC5cbiAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiBTYXZlUmVzdWx0LlxuICAgICAqL1xuICAgIGFzeW5jIHNhdmUobW9kZWxBcnRpZmFjdHMpIHtcbiAgICAgICAgaWYgKG1vZGVsQXJ0aWZhY3RzLm1vZGVsVG9wb2xvZ3kgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCcm93c2VyTG9jYWxTdG9yYWdlLnNhdmUoKSBkb2VzIG5vdCBzdXBwb3J0IHNhdmluZyBtb2RlbCB0b3BvbG9neSAnICtcbiAgICAgICAgICAgICAgICAnaW4gYmluYXJ5IGZvcm1hdHMgeWV0LicpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdG9wb2xvZ3kgPSBKU09OLnN0cmluZ2lmeShtb2RlbEFydGlmYWN0cy5tb2RlbFRvcG9sb2d5KTtcbiAgICAgICAgICAgIGNvbnN0IHdlaWdodFNwZWNzID0gSlNPTi5zdHJpbmdpZnkobW9kZWxBcnRpZmFjdHMud2VpZ2h0U3BlY3MpO1xuICAgICAgICAgICAgY29uc3QgbW9kZWxBcnRpZmFjdHNJbmZvID0gZ2V0TW9kZWxBcnRpZmFjdHNJbmZvRm9ySlNPTihtb2RlbEFydGlmYWN0cyk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuTFMuc2V0SXRlbSh0aGlzLmtleXMuaW5mbywgSlNPTi5zdHJpbmdpZnkobW9kZWxBcnRpZmFjdHNJbmZvKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5MUy5zZXRJdGVtKHRoaXMua2V5cy50b3BvbG9neSwgdG9wb2xvZ3kpO1xuICAgICAgICAgICAgICAgIHRoaXMuTFMuc2V0SXRlbSh0aGlzLmtleXMud2VpZ2h0U3BlY3MsIHdlaWdodFNwZWNzKTtcbiAgICAgICAgICAgICAgICB0aGlzLkxTLnNldEl0ZW0odGhpcy5rZXlzLndlaWdodERhdGEsIGFycmF5QnVmZmVyVG9CYXNlNjRTdHJpbmcobW9kZWxBcnRpZmFjdHMud2VpZ2h0RGF0YSkpO1xuICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBKU09OLnN0cmluZ2lmeSBkb2Vzbid0IHdyaXRlIG91dCBrZXlzIHRoYXQgaGF2ZSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAvLyB2YWx1ZXMsIHNvIGZvciBzb21lIGtleXMsIHdlIHNldCB1bmRlZmluZWQgaW5zdGVhZCBvZiBhIG51bGwtaXNoXG4gICAgICAgICAgICAgICAgLy8gdmFsdWUuXG4gICAgICAgICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdDogbW9kZWxBcnRpZmFjdHMuZm9ybWF0LFxuICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRCeTogbW9kZWxBcnRpZmFjdHMuZ2VuZXJhdGVkQnksXG4gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZEJ5OiBtb2RlbEFydGlmYWN0cy5jb252ZXJ0ZWRCeSxcbiAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlOiBtb2RlbEFydGlmYWN0cy5zaWduYXR1cmUgIT0gbnVsbCA/XG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbEFydGlmYWN0cy5zaWduYXR1cmUgOlxuICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICB1c2VyRGVmaW5lZE1ldGFkYXRhOiBtb2RlbEFydGlmYWN0cy51c2VyRGVmaW5lZE1ldGFkYXRhICE9IG51bGwgP1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxBcnRpZmFjdHMudXNlckRlZmluZWRNZXRhZGF0YSA6XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIG1vZGVsSW5pdGlhbGl6ZXI6IG1vZGVsQXJ0aWZhY3RzLm1vZGVsSW5pdGlhbGl6ZXIgIT0gbnVsbCA/XG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbEFydGlmYWN0cy5tb2RlbEluaXRpYWxpemVyIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgdHJhaW5pbmdDb25maWc6IG1vZGVsQXJ0aWZhY3RzLnRyYWluaW5nQ29uZmlnICE9IG51bGwgP1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxBcnRpZmFjdHMudHJhaW5pbmdDb25maWcgOlxuICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLkxTLnNldEl0ZW0odGhpcy5rZXlzLm1vZGVsTWV0YWRhdGEsIEpTT04uc3RyaW5naWZ5KG1ldGFkYXRhKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbW9kZWxBcnRpZmFjdHNJbmZvIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgc2F2aW5nIGZhaWxlZCwgY2xlYW4gdXAgYWxsIGl0ZW1zIHNhdmVkIHNvIGZhci5cbiAgICAgICAgICAgICAgICByZW1vdmVJdGVtcyh0aGlzLmtleXMpO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHNhdmUgbW9kZWwgJyR7dGhpcy5tb2RlbFBhdGh9JyB0byBsb2NhbCBzdG9yYWdlOiBgICtcbiAgICAgICAgICAgICAgICAgICAgYHNpemUgcXVvdGEgYmVpbmcgZXhjZWVkZWQgaXMgYSBwb3NzaWJsZSBjYXVzZSBvZiB0aGlzIGZhaWx1cmU6IGAgK1xuICAgICAgICAgICAgICAgICAgICBgbW9kZWxUb3BvbG9neUJ5dGVzPSR7bW9kZWxBcnRpZmFjdHNJbmZvLm1vZGVsVG9wb2xvZ3lCeXRlc30sIGAgK1xuICAgICAgICAgICAgICAgICAgICBgd2VpZ2h0U3BlY3NCeXRlcz0ke21vZGVsQXJ0aWZhY3RzSW5mby53ZWlnaHRTcGVjc0J5dGVzfSwgYCArXG4gICAgICAgICAgICAgICAgICAgIGB3ZWlnaHREYXRhQnl0ZXM9JHttb2RlbEFydGlmYWN0c0luZm8ud2VpZ2h0RGF0YUJ5dGVzfS5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb2FkIGEgbW9kZWwgZnJvbSBsb2NhbCBzdG9yYWdlLlxuICAgICAqXG4gICAgICogU2VlIHRoZSBkb2N1bWVudGF0aW9uIHRvIGBicm93c2VyTG9jYWxTdG9yYWdlYCBmb3IgZGV0YWlscyBvbiB0aGUgc2F2ZWRcbiAgICAgKiBhcnRpZmFjdHMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgbG9hZGVkIG1vZGVsIChpZiBsb2FkaW5nIHN1Y2NlZWRzKS5cbiAgICAgKi9cbiAgICBhc3luYyBsb2FkKCkge1xuICAgICAgICBjb25zdCBpbmZvID0gSlNPTi5wYXJzZSh0aGlzLkxTLmdldEl0ZW0odGhpcy5rZXlzLmluZm8pKTtcbiAgICAgICAgaWYgKGluZm8gPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBsb2NhbCBzdG9yYWdlLCB0aGVyZSBpcyBubyBtb2RlbCB3aXRoIG5hbWUgJyR7dGhpcy5tb2RlbFBhdGh9J2ApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbmZvLm1vZGVsVG9wb2xvZ3lUeXBlICE9PSAnSlNPTicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnJvd3NlckxvY2FsU3RvcmFnZSBkb2VzIG5vdCBzdXBwb3J0IGxvYWRpbmcgbm9uLUpTT04gbW9kZWwgJyArXG4gICAgICAgICAgICAgICAgJ3RvcG9sb2d5IHlldC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvdXQgPSB7fTtcbiAgICAgICAgLy8gTG9hZCB0b3BvbG9neS5cbiAgICAgICAgY29uc3QgdG9wb2xvZ3kgPSBKU09OLnBhcnNlKHRoaXMuTFMuZ2V0SXRlbSh0aGlzLmtleXMudG9wb2xvZ3kpKTtcbiAgICAgICAgaWYgKHRvcG9sb2d5ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW4gbG9jYWwgc3RvcmFnZSwgdGhlIHRvcG9sb2d5IG9mIG1vZGVsICcke3RoaXMubW9kZWxQYXRofScgYCArXG4gICAgICAgICAgICAgICAgYGlzIG1pc3NpbmcuYCk7XG4gICAgICAgIH1cbiAgICAgICAgb3V0Lm1vZGVsVG9wb2xvZ3kgPSB0b3BvbG9neTtcbiAgICAgICAgLy8gTG9hZCB3ZWlnaHQgc3BlY3MuXG4gICAgICAgIGNvbnN0IHdlaWdodFNwZWNzID0gSlNPTi5wYXJzZSh0aGlzLkxTLmdldEl0ZW0odGhpcy5rZXlzLndlaWdodFNwZWNzKSk7XG4gICAgICAgIGlmICh3ZWlnaHRTcGVjcyA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluIGxvY2FsIHN0b3JhZ2UsIHRoZSB3ZWlnaHQgc3BlY3Mgb2YgbW9kZWwgJyR7dGhpcy5tb2RlbFBhdGh9JyBgICtcbiAgICAgICAgICAgICAgICBgYXJlIG1pc3NpbmcuYCk7XG4gICAgICAgIH1cbiAgICAgICAgb3V0LndlaWdodFNwZWNzID0gd2VpZ2h0U3BlY3M7XG4gICAgICAgIC8vIExvYWQgbWV0YS1kYXRhIGZpZWxkcy5cbiAgICAgICAgY29uc3QgbWV0YWRhdGFTdHJpbmcgPSB0aGlzLkxTLmdldEl0ZW0odGhpcy5rZXlzLm1vZGVsTWV0YWRhdGEpO1xuICAgICAgICBpZiAobWV0YWRhdGFTdHJpbmcgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBKU09OLnBhcnNlKG1ldGFkYXRhU3RyaW5nKTtcbiAgICAgICAgICAgIG91dC5mb3JtYXQgPSBtZXRhZGF0YS5mb3JtYXQ7XG4gICAgICAgICAgICBvdXQuZ2VuZXJhdGVkQnkgPSBtZXRhZGF0YS5nZW5lcmF0ZWRCeTtcbiAgICAgICAgICAgIG91dC5jb252ZXJ0ZWRCeSA9IG1ldGFkYXRhLmNvbnZlcnRlZEJ5O1xuICAgICAgICAgICAgaWYgKG1ldGFkYXRhLnNpZ25hdHVyZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgb3V0LnNpZ25hdHVyZSA9IG1ldGFkYXRhLnNpZ25hdHVyZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXRhZGF0YS51c2VyRGVmaW5lZE1ldGFkYXRhICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBvdXQudXNlckRlZmluZWRNZXRhZGF0YSA9IG1ldGFkYXRhLnVzZXJEZWZpbmVkTWV0YWRhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWV0YWRhdGEubW9kZWxJbml0aWFsaXplciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgb3V0Lm1vZGVsSW5pdGlhbGl6ZXIgPSBtZXRhZGF0YS5tb2RlbEluaXRpYWxpemVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1ldGFkYXRhLnRyYWluaW5nQ29uZmlnICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBvdXQudHJhaW5pbmdDb25maWcgPSBtZXRhZGF0YS50cmFpbmluZ0NvbmZpZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBMb2FkIHdlaWdodCBkYXRhLlxuICAgICAgICBjb25zdCB3ZWlnaHREYXRhQmFzZTY0ID0gdGhpcy5MUy5nZXRJdGVtKHRoaXMua2V5cy53ZWlnaHREYXRhKTtcbiAgICAgICAgaWYgKHdlaWdodERhdGFCYXNlNjQgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBsb2NhbCBzdG9yYWdlLCB0aGUgYmluYXJ5IHdlaWdodCB2YWx1ZXMgb2YgbW9kZWwgYCArXG4gICAgICAgICAgICAgICAgYCcke3RoaXMubW9kZWxQYXRofScgYXJlIG1pc3NpbmcuYCk7XG4gICAgICAgIH1cbiAgICAgICAgb3V0LndlaWdodERhdGEgPSBiYXNlNjRTdHJpbmdUb0FycmF5QnVmZmVyKHdlaWdodERhdGFCYXNlNjQpO1xuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cbn1cbkJyb3dzZXJMb2NhbFN0b3JhZ2UuVVJMX1NDSEVNRSA9ICdsb2NhbHN0b3JhZ2U6Ly8nO1xuZXhwb3J0IGNvbnN0IGxvY2FsU3RvcmFnZVJvdXRlciA9ICh1cmwpID0+IHtcbiAgICBpZiAoIWVudigpLmdldEJvb2woJ0lTX0JST1dTRVInKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh1cmwpICYmIHVybC5zdGFydHNXaXRoKEJyb3dzZXJMb2NhbFN0b3JhZ2UuVVJMX1NDSEVNRSkpIHtcbiAgICAgICAgICAgIHJldHVybiBicm93c2VyTG9jYWxTdG9yYWdlKHVybC5zbGljZShCcm93c2VyTG9jYWxTdG9yYWdlLlVSTF9TQ0hFTUUubGVuZ3RoKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn07XG5JT1JvdXRlclJlZ2lzdHJ5LnJlZ2lzdGVyU2F2ZVJvdXRlcihsb2NhbFN0b3JhZ2VSb3V0ZXIpO1xuSU9Sb3V0ZXJSZWdpc3RyeS5yZWdpc3RlckxvYWRSb3V0ZXIobG9jYWxTdG9yYWdlUm91dGVyKTtcbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgbG9jYWwgc3RvcmFnZSBJT0hhbmRsZXIuXG4gKlxuICogVGhpcyBgSU9IYW5kbGVyYCBzdXBwb3J0cyBib3RoIGBzYXZlYCBhbmQgYGxvYWRgLlxuICpcbiAqIEZvciBlYWNoIG1vZGVsJ3Mgc2F2ZWQgYXJ0aWZhY3RzLCBmb3VyIGl0ZW1zIGFyZSBzYXZlZCB0byBsb2NhbCBzdG9yYWdlLlxuICogICAtIGAke1BBVEhfU0VQQVJBVE9SfS8ke21vZGVsUGF0aH0vaW5mb2A6IENvbnRhaW5zIG1ldGEtaW5mbyBhYm91dCB0aGVcbiAqICAgICBtb2RlbCwgc3VjaCBhcyBkYXRlIHNhdmVkLCB0eXBlIG9mIHRoZSB0b3BvbG9neSwgc2l6ZSBpbiBieXRlcywgZXRjLlxuICogICAtIGAke1BBVEhfU0VQQVJBVE9SfS8ke21vZGVsUGF0aH0vdG9wb2xvZ3lgOiBNb2RlbCB0b3BvbG9neS4gRm9yIEtlcmFzLVxuICogICAgIHN0eWxlIG1vZGVscywgdGhpcyBpcyBhIHN0cmluZ2l6ZWQgSlNPTi5cbiAqICAgLSBgJHtQQVRIX1NFUEFSQVRPUn0vJHttb2RlbFBhdGh9L3dlaWdodF9zcGVjc2A6IFdlaWdodCBzcGVjcyBvZiB0aGVcbiAqICAgICBtb2RlbCwgY2FuIGJlIHVzZWQgdG8gZGVjb2RlIHRoZSBzYXZlZCBiaW5hcnkgd2VpZ2h0IHZhbHVlcyAoc2VlXG4gKiAgICAgaXRlbSBiZWxvdykuXG4gKiAgIC0gYCR7UEFUSF9TRVBBUkFUT1J9LyR7bW9kZWxQYXRofS93ZWlnaHRfZGF0YWA6IENvbmNhdGVuYXRlZCBiaW5hcnlcbiAqICAgICB3ZWlnaHQgdmFsdWVzLCBzdG9yZWQgYXMgYSBiYXNlNjQtZW5jb2RlZCBzdHJpbmcuXG4gKlxuICogU2F2aW5nIG1heSB0aHJvdyBhbiBgRXJyb3JgIGlmIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBhcnRpZmFjdHMgZXhjZWVkIHRoZVxuICogYnJvd3Nlci1zcGVjaWZpYyBxdW90YS5cbiAqXG4gKiBAcGFyYW0gbW9kZWxQYXRoIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBtb2RlbCB0byBiZSBzYXZlZC4gTXVzdCBiZSBhXG4gKiAgIG5vbi1lbXB0eSBzdHJpbmcuXG4gKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiBgSU9IYW5kbGVyYCwgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCwgZS5nLixcbiAqICAgYHRmLk1vZGVsLnNhdmVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnJvd3NlckxvY2FsU3RvcmFnZShtb2RlbFBhdGgpIHtcbiAgICByZXR1cm4gbmV3IEJyb3dzZXJMb2NhbFN0b3JhZ2UobW9kZWxQYXRoKTtcbn1cbmV4cG9ydCBjbGFzcyBCcm93c2VyTG9jYWxTdG9yYWdlTWFuYWdlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGFzc2VydChlbnYoKS5nZXRCb29sKCdJU19CUk9XU0VSJyksICgpID0+ICdDdXJyZW50IGVudmlyb25tZW50IGlzIG5vdCBhIHdlYiBicm93c2VyJyk7XG4gICAgICAgIGFzc2VydCh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyB8fFxuICAgICAgICAgICAgdHlwZW9mIHdpbmRvdy5sb2NhbFN0b3JhZ2UgIT09ICd1bmRlZmluZWQnLCAoKSA9PiAnQ3VycmVudCBicm93c2VyIGRvZXMgbm90IGFwcGVhciB0byBzdXBwb3J0IGxvY2FsU3RvcmFnZScpO1xuICAgICAgICB0aGlzLkxTID0gd2luZG93LmxvY2FsU3RvcmFnZTtcbiAgICB9XG4gICAgYXN5bmMgbGlzdE1vZGVscygpIHtcbiAgICAgICAgY29uc3Qgb3V0ID0ge307XG4gICAgICAgIGNvbnN0IHByZWZpeCA9IFBBVEhfUFJFRklYICsgUEFUSF9TRVBBUkFUT1I7XG4gICAgICAgIGNvbnN0IHN1ZmZpeCA9IFBBVEhfU0VQQVJBVE9SICsgSU5GT19TVUZGSVg7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5MUy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5MUy5rZXkoaSk7XG4gICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgocHJlZml4KSAmJiBrZXkuZW5kc1dpdGgoc3VmZml4KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1vZGVsUGF0aCA9IGdldE1vZGVsUGF0aEZyb21LZXkoa2V5KTtcbiAgICAgICAgICAgICAgICBvdXRbbW9kZWxQYXRoXSA9IEpTT04ucGFyc2UodGhpcy5MUy5nZXRJdGVtKGtleSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuICAgIGFzeW5jIHJlbW92ZU1vZGVsKHBhdGgpIHtcbiAgICAgICAgcGF0aCA9IG1heWJlU3RyaXBTY2hlbWUocGF0aCk7XG4gICAgICAgIGNvbnN0IGtleXMgPSBnZXRNb2RlbEtleXMocGF0aCk7XG4gICAgICAgIGlmICh0aGlzLkxTLmdldEl0ZW0oa2V5cy5pbmZvKSA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBmaW5kIG1vZGVsIGF0IHBhdGggJyR7cGF0aH0nYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5mbyA9IEpTT04ucGFyc2UodGhpcy5MUy5nZXRJdGVtKGtleXMuaW5mbykpO1xuICAgICAgICByZW1vdmVJdGVtcyhrZXlzKTtcbiAgICAgICAgcmV0dXJuIGluZm87XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG9jYWxfc3RvcmFnZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vKipcbiAqIENsYXNzZXMgYW5kIGZ1bmN0aW9ucyBmb3IgbW9kZWwgbWFuYWdlbWVudCBhY3Jvc3MgbXVsdGlwbGUgc3RvcmFnZSBtZWRpdW1zLlxuICpcbiAqIFN1cHBvcnRlZCBjbGllbnQgYWN0aW9uczpcbiAqIC0gTGlzdGluZyBtb2RlbHMgb24gYWxsIHJlZ2lzdGVyZWQgc3RvcmFnZSBtZWRpdW1zLlxuICogLSBSZW1vdmUgbW9kZWwgYnkgVVJMIGZyb20gYW55IHJlZ2lzdGVyZWQgc3RvcmFnZSBtZWRpdW1zLCBieSB1c2luZyBVUkxcbiAqICAgc3RyaW5nLlxuICogLSBNb3Zpbmcgb3IgY29weWluZyBtb2RlbCBmcm9tIG9uZSBwYXRoIHRvIGFub3RoZXIgaW4gdGhlIHNhbWUgbWVkaXVtIG9yIGZyb21cbiAqICAgb25lIG1lZGl1bSB0byBhbm90aGVyLCBieSB1c2luZyBVUkwgc3RyaW5ncy5cbiAqL1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBJT1JvdXRlclJlZ2lzdHJ5IH0gZnJvbSAnLi9yb3V0ZXJfcmVnaXN0cnknO1xuY29uc3QgVVJMX1NDSEVNRV9TVUZGSVggPSAnOi8vJztcbmV4cG9ydCBjbGFzcyBNb2RlbFN0b3JlTWFuYWdlclJlZ2lzdHJ5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5tYW5hZ2VycyA9IHt9O1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0SW5zdGFuY2UoKSB7XG4gICAgICAgIGlmIChNb2RlbFN0b3JlTWFuYWdlclJlZ2lzdHJ5Lmluc3RhbmNlID09IG51bGwpIHtcbiAgICAgICAgICAgIE1vZGVsU3RvcmVNYW5hZ2VyUmVnaXN0cnkuaW5zdGFuY2UgPSBuZXcgTW9kZWxTdG9yZU1hbmFnZXJSZWdpc3RyeSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBNb2RlbFN0b3JlTWFuYWdlclJlZ2lzdHJ5Lmluc3RhbmNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlciBhIHNhdmUtaGFuZGxlciByb3V0ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2F2ZVJvdXRlciBBIGZ1bmN0aW9uIHRoYXQgbWFwcyBhIFVSTC1saWtlIHN0cmluZyBvbnRvIGFuIGluc3RhbmNlXG4gICAgICogb2YgYElPSGFuZGxlcmAgd2l0aCB0aGUgYHNhdmVgIG1ldGhvZCBkZWZpbmVkIG9yIGBudWxsYC5cbiAgICAgKi9cbiAgICBzdGF0aWMgcmVnaXN0ZXJNYW5hZ2VyKHNjaGVtZSwgbWFuYWdlcikge1xuICAgICAgICBhc3NlcnQoc2NoZW1lICE9IG51bGwsICgpID0+ICdzY2hlbWUgbXVzdCBub3QgYmUgdW5kZWZpbmVkIG9yIG51bGwuJyk7XG4gICAgICAgIGlmIChzY2hlbWUuZW5kc1dpdGgoVVJMX1NDSEVNRV9TVUZGSVgpKSB7XG4gICAgICAgICAgICBzY2hlbWUgPSBzY2hlbWUuc2xpY2UoMCwgc2NoZW1lLmluZGV4T2YoVVJMX1NDSEVNRV9TVUZGSVgpKTtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnQoc2NoZW1lLmxlbmd0aCA+IDAsICgpID0+ICdzY2hlbWUgbXVzdCBub3QgYmUgYW4gZW1wdHkgc3RyaW5nLicpO1xuICAgICAgICBjb25zdCByZWdpc3RyeSA9IE1vZGVsU3RvcmVNYW5hZ2VyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTtcbiAgICAgICAgYXNzZXJ0KHJlZ2lzdHJ5Lm1hbmFnZXJzW3NjaGVtZV0gPT0gbnVsbCwgKCkgPT4gYEEgbW9kZWwgc3RvcmUgbWFuYWdlciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIHNjaGVtZSAnJHtzY2hlbWV9Jy5gKTtcbiAgICAgICAgcmVnaXN0cnkubWFuYWdlcnNbc2NoZW1lXSA9IG1hbmFnZXI7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRNYW5hZ2VyKHNjaGVtZSkge1xuICAgICAgICBjb25zdCBtYW5hZ2VyID0gdGhpcy5nZXRJbnN0YW5jZSgpLm1hbmFnZXJzW3NjaGVtZV07XG4gICAgICAgIGlmIChtYW5hZ2VyID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgbW9kZWwgbWFuYWdlciBmb3Igc2NoZW1lICcke3NjaGVtZX0nYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1hbmFnZXI7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRTY2hlbWVzKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5nZXRJbnN0YW5jZSgpLm1hbmFnZXJzKTtcbiAgICB9XG59XG4vKipcbiAqIEhlbHBlciBtZXRob2QgZm9yIHBhcnNpbmcgYSBVUkwgc3RyaW5nIGludG8gYSBzY2hlbWUgYW5kIGEgcGF0aC5cbiAqXG4gKiBAcGFyYW0gdXJsIEUuZy4sICdsb2NhbHN0b3JhZ2U6Ly9teS1tb2RlbCdcbiAqIEByZXR1cm5zIEEgZGljdGlvbmFyeSB3aXRoIHR3byBmaWVsZHM6IHNjaGVtZSBhbmQgcGF0aC5cbiAqICAgU2NoZW1lOiBlLmcuLCAnbG9jYWxzdG9yYWdlJyBpbiB0aGUgZXhhbXBsZSBhYm92ZS5cbiAqICAgUGF0aDogZS5nLiwgJ215LW1vZGVsJyBpbiB0aGUgZXhhbXBsZSBhYm92ZS5cbiAqL1xuZnVuY3Rpb24gcGFyc2VVUkwodXJsKSB7XG4gICAgaWYgKHVybC5pbmRleE9mKFVSTF9TQ0hFTUVfU1VGRklYKSA9PT0gLTEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgdXJsIHN0cmluZyBwcm92aWRlZCBkb2VzIG5vdCBjb250YWluIGEgc2NoZW1lLiBgICtcbiAgICAgICAgICAgIGBTdXBwb3J0ZWQgc2NoZW1lcyBhcmU6IGAgK1xuICAgICAgICAgICAgYCR7TW9kZWxTdG9yZU1hbmFnZXJSZWdpc3RyeS5nZXRTY2hlbWVzKCkuam9pbignLCcpfWApO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBzY2hlbWU6IHVybC5zcGxpdChVUkxfU0NIRU1FX1NVRkZJWClbMF0sXG4gICAgICAgIHBhdGg6IHVybC5zcGxpdChVUkxfU0NIRU1FX1NVRkZJWClbMV0sXG4gICAgfTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGNsb25lTW9kZWxJbnRlcm5hbChzb3VyY2VVUkwsIGRlc3RVUkwsIGRlbGV0ZVNvdXJjZSA9IGZhbHNlKSB7XG4gICAgYXNzZXJ0KHNvdXJjZVVSTCAhPT0gZGVzdFVSTCwgKCkgPT4gYE9sZCBwYXRoIGFuZCBuZXcgcGF0aCBhcmUgdGhlIHNhbWU6ICcke3NvdXJjZVVSTH0nYCk7XG4gICAgY29uc3QgbG9hZEhhbmRsZXJzID0gSU9Sb3V0ZXJSZWdpc3RyeS5nZXRMb2FkSGFuZGxlcnMoc291cmNlVVJMKTtcbiAgICBhc3NlcnQobG9hZEhhbmRsZXJzLmxlbmd0aCA+IDAsICgpID0+IGBDb3B5aW5nIGZhaWxlZCBiZWNhdXNlIG5vIGxvYWQgaGFuZGxlciBpcyBmb3VuZCBmb3Igc291cmNlIFVSTCAke3NvdXJjZVVSTH0uYCk7XG4gICAgYXNzZXJ0KGxvYWRIYW5kbGVycy5sZW5ndGggPCAyLCAoKSA9PiBgQ29weWluZyBmYWlsZWQgYmVjYXVzZSBtb3JlIHRoYW4gb25lICgke2xvYWRIYW5kbGVycy5sZW5ndGh9KSBgICtcbiAgICAgICAgYGxvYWQgaGFuZGxlcnMgZm9yIHNvdXJjZSBVUkwgJHtzb3VyY2VVUkx9LmApO1xuICAgIGNvbnN0IGxvYWRIYW5kbGVyID0gbG9hZEhhbmRsZXJzWzBdO1xuICAgIGNvbnN0IHNhdmVIYW5kbGVycyA9IElPUm91dGVyUmVnaXN0cnkuZ2V0U2F2ZUhhbmRsZXJzKGRlc3RVUkwpO1xuICAgIGFzc2VydChzYXZlSGFuZGxlcnMubGVuZ3RoID4gMCwgKCkgPT4gYENvcHlpbmcgZmFpbGVkIGJlY2F1c2Ugbm8gc2F2ZSBoYW5kbGVyIGlzIGZvdW5kIGZvciBkZXN0aW5hdGlvbiBgICtcbiAgICAgICAgYFVSTCAke2Rlc3RVUkx9LmApO1xuICAgIGFzc2VydChzYXZlSGFuZGxlcnMubGVuZ3RoIDwgMiwgKCkgPT4gYENvcHlpbmcgZmFpbGVkIGJlY2F1c2UgbW9yZSB0aGFuIG9uZSAoJHtsb2FkSGFuZGxlcnMubGVuZ3RofSkgYCArXG4gICAgICAgIGBzYXZlIGhhbmRsZXJzIGZvciBkZXN0aW5hdGlvbiBVUkwgJHtkZXN0VVJMfS5gKTtcbiAgICBjb25zdCBzYXZlSGFuZGxlciA9IHNhdmVIYW5kbGVyc1swXTtcbiAgICBjb25zdCBzb3VyY2VTY2hlbWUgPSBwYXJzZVVSTChzb3VyY2VVUkwpLnNjaGVtZTtcbiAgICBjb25zdCBzb3VyY2VQYXRoID0gcGFyc2VVUkwoc291cmNlVVJMKS5wYXRoO1xuICAgIGNvbnN0IHNhbWVNZWRpdW0gPSBzb3VyY2VTY2hlbWUgPT09IHBhcnNlVVJMKHNvdXJjZVVSTCkuc2NoZW1lO1xuICAgIGNvbnN0IG1vZGVsQXJ0aWZhY3RzID0gYXdhaXQgbG9hZEhhbmRsZXIubG9hZCgpO1xuICAgIC8vIElmIG1vdmluZyB3aXRoaW4gdGhlIHNhbWUgc3RvcmFnZSBtZWRpdW0sIHJlbW92ZSB0aGUgb2xkIG1vZGVsIGFzIHNvb24gYXNcbiAgICAvLyB0aGUgbG9hZGluZyBpcyBkb25lLiBXaXRob3V0IGRvaW5nIHRoaXMsIGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIGNvbWJpbmVkXG4gICAgLy8gc2l6ZSBvZiB0aGUgdHdvIG1vZGVscyB3aWxsIGNhdXNlIHRoZSBjbG9uaW5nIHRvIGZhaWwuXG4gICAgaWYgKGRlbGV0ZVNvdXJjZSAmJiBzYW1lTWVkaXVtKSB7XG4gICAgICAgIGF3YWl0IE1vZGVsU3RvcmVNYW5hZ2VyUmVnaXN0cnkuZ2V0TWFuYWdlcihzb3VyY2VTY2hlbWUpXG4gICAgICAgICAgICAucmVtb3ZlTW9kZWwoc291cmNlUGF0aCk7XG4gICAgfVxuICAgIGNvbnN0IHNhdmVSZXN1bHQgPSBhd2FpdCBzYXZlSGFuZGxlci5zYXZlKG1vZGVsQXJ0aWZhY3RzKTtcbiAgICAvLyBJZiBtb3ZpbmcgYmV0d2VlbiBtZWRpdW1zLCB0aGUgZGVsZXRpb24gaXMgZG9uZSBhZnRlciB0aGUgc2F2ZSBzdWNjZWVkcy5cbiAgICAvLyBUaGlzIGd1YXJkcyBhZ2FpbnN0IHRoZSBjYXNlIGluIHdoaWNoIHNhdmluZyB0byB0aGUgZGVzdGluYXRpb24gbWVkaXVtXG4gICAgLy8gZmFpbHMuXG4gICAgaWYgKGRlbGV0ZVNvdXJjZSAmJiAhc2FtZU1lZGl1bSkge1xuICAgICAgICBhd2FpdCBNb2RlbFN0b3JlTWFuYWdlclJlZ2lzdHJ5LmdldE1hbmFnZXIoc291cmNlU2NoZW1lKVxuICAgICAgICAgICAgLnJlbW92ZU1vZGVsKHNvdXJjZVBhdGgpO1xuICAgIH1cbiAgICByZXR1cm4gc2F2ZVJlc3VsdC5tb2RlbEFydGlmYWN0c0luZm87XG59XG4vKipcbiAqIExpc3QgYWxsIG1vZGVscyBzdG9yZWQgaW4gcmVnaXN0ZXJlZCBzdG9yYWdlIG1lZGl1bXMuXG4gKlxuICogRm9yIGEgd2ViIGJyb3dzZXIgZW52aXJvbm1lbnQsIHRoZSByZWdpc3RlcmVkIG1lZGl1bXMgYXJlIExvY2FsIFN0b3JhZ2UgYW5kXG4gKiBJbmRleGVkREIuXG4gKlxuICogYGBganNcbiAqIC8vIEZpcnN0IGNyZWF0ZSBhbmQgc2F2ZSBhIG1vZGVsLlxuICogY29uc3QgbW9kZWwgPSB0Zi5zZXF1ZW50aWFsKCk7XG4gKiBtb2RlbC5hZGQodGYubGF5ZXJzLmRlbnNlKFxuICogICAgIHt1bml0czogMSwgaW5wdXRTaGFwZTogWzEwXSwgYWN0aXZhdGlvbjogJ3NpZ21vaWQnfSkpO1xuICogYXdhaXQgbW9kZWwuc2F2ZSgnbG9jYWxzdG9yYWdlOi8vZGVtby9tYW5hZ2VtZW50L21vZGVsMScpO1xuICpcbiAqIC8vIFRoZW4gbGlzdCBleGlzdGluZyBtb2RlbHMuXG4gKiBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShhd2FpdCB0Zi5pby5saXN0TW9kZWxzKCkpKTtcbiAqXG4gKiAvLyBEZWxldGUgdGhlIG1vZGVsLlxuICogYXdhaXQgdGYuaW8ucmVtb3ZlTW9kZWwoJ2xvY2Fsc3RvcmFnZTovL2RlbW8vbWFuYWdlbWVudC9tb2RlbDEnKTtcbiAqXG4gKiAvLyBMaXN0IG1vZGVscyBhZ2Fpbi5cbiAqIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGF3YWl0IHRmLmlvLmxpc3RNb2RlbHMoKSkpO1xuICogYGBgXG4gKlxuICogQHJldHVybnMgQSBgUHJvbWlzZWAgb2YgYSBkaWN0aW9uYXJ5IG1hcHBpbmcgVVJMcyBvZiBleGlzdGluZyBtb2RlbHMgdG9cbiAqIHRoZWlyIG1vZGVsIGFydGlmYWN0cyBpbmZvLiBVUkxzIGluY2x1ZGUgbWVkaXVtLXNwZWNpZmljIHNjaGVtZXMsIGUuZy4sXG4gKiAgICdpbmRleGVkZGI6Ly9teS9tb2RlbC8xJy4gTW9kZWwgYXJ0aWZhY3RzIGluZm8gaW5jbHVkZSB0eXBlIG9mIHRoZVxuICogbW9kZWwncyB0b3BvbG9neSwgYnl0ZSBzaXplcyBvZiB0aGUgdG9wb2xvZ3ksIHdlaWdodHMsIGV0Yy5cbiAqXG4gKiBAZG9jIHtcbiAqICAgaGVhZGluZzogJ01vZGVscycsXG4gKiAgIHN1YmhlYWRpbmc6ICdNYW5hZ2VtZW50JyxcbiAqICAgbmFtZXNwYWNlOiAnaW8nLFxuICogICBpZ25vcmVDSTogdHJ1ZVxuICogfVxuICovXG5hc3luYyBmdW5jdGlvbiBsaXN0TW9kZWxzKCkge1xuICAgIGNvbnN0IHNjaGVtZXMgPSBNb2RlbFN0b3JlTWFuYWdlclJlZ2lzdHJ5LmdldFNjaGVtZXMoKTtcbiAgICBjb25zdCBvdXQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IHNjaGVtZSBvZiBzY2hlbWVzKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtZU91dCA9IGF3YWl0IE1vZGVsU3RvcmVNYW5hZ2VyUmVnaXN0cnkuZ2V0TWFuYWdlcihzY2hlbWUpLmxpc3RNb2RlbHMoKTtcbiAgICAgICAgZm9yIChjb25zdCBwYXRoIGluIHNjaGVtZU91dCkge1xuICAgICAgICAgICAgY29uc3QgdXJsID0gc2NoZW1lICsgVVJMX1NDSEVNRV9TVUZGSVggKyBwYXRoO1xuICAgICAgICAgICAgb3V0W3VybF0gPSBzY2hlbWVPdXRbcGF0aF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUmVtb3ZlIGEgbW9kZWwgc3BlY2lmaWVkIGJ5IFVSTCBmcm9tIGEgcmVpZ3N0ZXJlZCBzdG9yYWdlIG1lZGl1bS5cbiAqXG4gKiBgYGBqc1xuICogLy8gRmlyc3QgY3JlYXRlIGFuZCBzYXZlIGEgbW9kZWwuXG4gKiBjb25zdCBtb2RlbCA9IHRmLnNlcXVlbnRpYWwoKTtcbiAqIG1vZGVsLmFkZCh0Zi5sYXllcnMuZGVuc2UoXG4gKiAgICAge3VuaXRzOiAxLCBpbnB1dFNoYXBlOiBbMTBdLCBhY3RpdmF0aW9uOiAnc2lnbW9pZCd9KSk7XG4gKiBhd2FpdCBtb2RlbC5zYXZlKCdsb2NhbHN0b3JhZ2U6Ly9kZW1vL21hbmFnZW1lbnQvbW9kZWwxJyk7XG4gKlxuICogLy8gVGhlbiBsaXN0IGV4aXN0aW5nIG1vZGVscy5cbiAqIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGF3YWl0IHRmLmlvLmxpc3RNb2RlbHMoKSkpO1xuICpcbiAqIC8vIERlbGV0ZSB0aGUgbW9kZWwuXG4gKiBhd2FpdCB0Zi5pby5yZW1vdmVNb2RlbCgnbG9jYWxzdG9yYWdlOi8vZGVtby9tYW5hZ2VtZW50L21vZGVsMScpO1xuICpcbiAqIC8vIExpc3QgbW9kZWxzIGFnYWluLlxuICogY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoYXdhaXQgdGYuaW8ubGlzdE1vZGVscygpKSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdXJsIEEgVVJMIHRvIGEgc3RvcmVkIG1vZGVsLCB3aXRoIGEgc2NoZW1lIHByZWZpeCwgZS5nLixcbiAqICAgJ2xvY2Fsc3RvcmFnZTovL215LW1vZGVsLTEnLCAnaW5kZXhlZGRiOi8vbXkvbW9kZWwvMicuXG4gKiBAcmV0dXJucyBNb2RlbEFydGlmYWN0c0luZm8gb2YgdGhlIGRlbGV0ZWQgbW9kZWwgKGlmIGFuZCBvbmx5IGlmIGRlbGV0aW9uXG4gKiAgIGlzIHN1Y2Nlc3NmdWwpLlxuICogQHRocm93cyBFcnJvciBpZiBkZWxldGlvbiBmYWlscywgZS5nLiwgaWYgbm8gbW9kZWwgZXhpc3RzIGF0IGBwYXRoYC5cbiAqXG4gKiBAZG9jIHtcbiAqICAgaGVhZGluZzogJ01vZGVscycsXG4gKiAgIHN1YmhlYWRpbmc6ICdNYW5hZ2VtZW50JyxcbiAqICAgbmFtZXNwYWNlOiAnaW8nLFxuICogICBpZ25vcmVDSTogdHJ1ZVxuICogfVxuICovXG5hc3luYyBmdW5jdGlvbiByZW1vdmVNb2RlbCh1cmwpIHtcbiAgICBjb25zdCBzY2hlbWVBbmRQYXRoID0gcGFyc2VVUkwodXJsKTtcbiAgICBjb25zdCBtYW5hZ2VyID0gTW9kZWxTdG9yZU1hbmFnZXJSZWdpc3RyeS5nZXRNYW5hZ2VyKHNjaGVtZUFuZFBhdGguc2NoZW1lKTtcbiAgICByZXR1cm4gbWFuYWdlci5yZW1vdmVNb2RlbChzY2hlbWVBbmRQYXRoLnBhdGgpO1xufVxuLyoqXG4gKiBDb3B5IGEgbW9kZWwgZnJvbSBvbmUgVVJMIHRvIGFub3RoZXIuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBzdXBwb3J0czpcbiAqXG4gKiAxLiBDb3B5aW5nIHdpdGhpbiBhIHN0b3JhZ2UgbWVkaXVtLCBlLmcuLFxuICogICAgYHRmLmlvLmNvcHlNb2RlbCgnbG9jYWxzdG9yYWdlOi8vbW9kZWwtMScsICdsb2NhbHN0b3JhZ2U6Ly9tb2RlbC0yJylgXG4gKiAyLiBDb3B5aW5nIGJldHdlZW4gdHdvIHN0b3JhZ2UgbWVkaXVtcywgZS5nLixcbiAqICAgIGB0Zi5pby5jb3B5TW9kZWwoJ2xvY2Fsc3RvcmFnZTovL21vZGVsLTEnLCAnaW5kZXhlZGRiOi8vbW9kZWwtMScpYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBGaXJzdCBjcmVhdGUgYW5kIHNhdmUgYSBtb2RlbC5cbiAqIGNvbnN0IG1vZGVsID0gdGYuc2VxdWVudGlhbCgpO1xuICogbW9kZWwuYWRkKHRmLmxheWVycy5kZW5zZShcbiAqICAgICB7dW5pdHM6IDEsIGlucHV0U2hhcGU6IFsxMF0sIGFjdGl2YXRpb246ICdzaWdtb2lkJ30pKTtcbiAqIGF3YWl0IG1vZGVsLnNhdmUoJ2xvY2Fsc3RvcmFnZTovL2RlbW8vbWFuYWdlbWVudC9tb2RlbDEnKTtcbiAqXG4gKiAvLyBUaGVuIGxpc3QgZXhpc3RpbmcgbW9kZWxzLlxuICogY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoYXdhaXQgdGYuaW8ubGlzdE1vZGVscygpKSk7XG4gKlxuICogLy8gQ29weSB0aGUgbW9kZWwsIGZyb20gTG9jYWwgU3RvcmFnZSB0byBJbmRleGVkREIuXG4gKiBhd2FpdCB0Zi5pby5jb3B5TW9kZWwoXG4gKiAgICAgJ2xvY2Fsc3RvcmFnZTovL2RlbW8vbWFuYWdlbWVudC9tb2RlbDEnLFxuICogICAgICdpbmRleGVkZGI6Ly9kZW1vL21hbmFnZW1lbnQvbW9kZWwxJyk7XG4gKlxuICogLy8gTGlzdCBtb2RlbHMgYWdhaW4uXG4gKiBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShhd2FpdCB0Zi5pby5saXN0TW9kZWxzKCkpKTtcbiAqXG4gKiAvLyBSZW1vdmUgYm90aCBtb2RlbHMuXG4gKiBhd2FpdCB0Zi5pby5yZW1vdmVNb2RlbCgnbG9jYWxzdG9yYWdlOi8vZGVtby9tYW5hZ2VtZW50L21vZGVsMScpO1xuICogYXdhaXQgdGYuaW8ucmVtb3ZlTW9kZWwoJ2luZGV4ZWRkYjovL2RlbW8vbWFuYWdlbWVudC9tb2RlbDEnKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBzb3VyY2VVUkwgU291cmNlIFVSTCBvZiBjb3B5aW5nLlxuICogQHBhcmFtIGRlc3RVUkwgRGVzdGluYXRpb24gVVJMIG9mIGNvcHlpbmcuXG4gKiBAcmV0dXJucyBNb2RlbEFydGlmYWN0c0luZm8gb2YgdGhlIGNvcGllZCBtb2RlbCAoaWYgYW5kIG9ubHkgaWYgY29weWluZ1xuICogICBpcyBzdWNjZXNzZnVsKS5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgY29weWluZyBmYWlscywgZS5nLiwgaWYgbm8gbW9kZWwgZXhpc3RzIGF0IGBzb3VyY2VVUkxgLCBvclxuICogICBpZiBgb2xkUGF0aGAgYW5kIGBuZXdQYXRoYCBhcmUgaWRlbnRpY2FsLlxuICpcbiAqIEBkb2Mge1xuICogICBoZWFkaW5nOiAnTW9kZWxzJyxcbiAqICAgc3ViaGVhZGluZzogJ01hbmFnZW1lbnQnLFxuICogICBuYW1lc3BhY2U6ICdpbycsXG4gKiAgIGlnbm9yZUNJOiB0cnVlXG4gKiB9XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvcHlNb2RlbChzb3VyY2VVUkwsIGRlc3RVUkwpIHtcbiAgICBjb25zdCBkZWxldGVTb3VyY2UgPSBmYWxzZTtcbiAgICByZXR1cm4gY2xvbmVNb2RlbEludGVybmFsKHNvdXJjZVVSTCwgZGVzdFVSTCwgZGVsZXRlU291cmNlKTtcbn1cbi8qKlxuICogTW92ZSBhIG1vZGVsIGZyb20gb25lIFVSTCB0byBhbm90aGVyLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHM6XG4gKlxuICogMS4gTW92aW5nIHdpdGhpbiBhIHN0b3JhZ2UgbWVkaXVtLCBlLmcuLFxuICogICAgYHRmLmlvLm1vdmVNb2RlbCgnbG9jYWxzdG9yYWdlOi8vbW9kZWwtMScsICdsb2NhbHN0b3JhZ2U6Ly9tb2RlbC0yJylgXG4gKiAyLiBNb3ZpbmcgYmV0d2VlbiB0d28gc3RvcmFnZSBtZWRpdW1zLCBlLmcuLFxuICogICAgYHRmLmlvLm1vdmVNb2RlbCgnbG9jYWxzdG9yYWdlOi8vbW9kZWwtMScsICdpbmRleGVkZGI6Ly9tb2RlbC0xJylgXG4gKlxuICogYGBganNcbiAqIC8vIEZpcnN0IGNyZWF0ZSBhbmQgc2F2ZSBhIG1vZGVsLlxuICogY29uc3QgbW9kZWwgPSB0Zi5zZXF1ZW50aWFsKCk7XG4gKiBtb2RlbC5hZGQodGYubGF5ZXJzLmRlbnNlKFxuICogICAgIHt1bml0czogMSwgaW5wdXRTaGFwZTogWzEwXSwgYWN0aXZhdGlvbjogJ3NpZ21vaWQnfSkpO1xuICogYXdhaXQgbW9kZWwuc2F2ZSgnbG9jYWxzdG9yYWdlOi8vZGVtby9tYW5hZ2VtZW50L21vZGVsMScpO1xuICpcbiAqIC8vIFRoZW4gbGlzdCBleGlzdGluZyBtb2RlbHMuXG4gKiBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShhd2FpdCB0Zi5pby5saXN0TW9kZWxzKCkpKTtcbiAqXG4gKiAvLyBNb3ZlIHRoZSBtb2RlbCwgZnJvbSBMb2NhbCBTdG9yYWdlIHRvIEluZGV4ZWREQi5cbiAqIGF3YWl0IHRmLmlvLm1vdmVNb2RlbChcbiAqICAgICAnbG9jYWxzdG9yYWdlOi8vZGVtby9tYW5hZ2VtZW50L21vZGVsMScsXG4gKiAgICAgJ2luZGV4ZWRkYjovL2RlbW8vbWFuYWdlbWVudC9tb2RlbDEnKTtcbiAqXG4gKiAvLyBMaXN0IG1vZGVscyBhZ2Fpbi5cbiAqIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGF3YWl0IHRmLmlvLmxpc3RNb2RlbHMoKSkpO1xuICpcbiAqIC8vIFJlbW92ZSB0aGUgbW92ZWQgbW9kZWwuXG4gKiBhd2FpdCB0Zi5pby5yZW1vdmVNb2RlbCgnaW5kZXhlZGRiOi8vZGVtby9tYW5hZ2VtZW50L21vZGVsMScpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHNvdXJjZVVSTCBTb3VyY2UgVVJMIG9mIG1vdmluZy5cbiAqIEBwYXJhbSBkZXN0VVJMIERlc3RpbmF0aW9uIFVSTCBvZiBtb3ZpbmcuXG4gKiBAcmV0dXJucyBNb2RlbEFydGlmYWN0c0luZm8gb2YgdGhlIGNvcGllZCBtb2RlbCAoaWYgYW5kIG9ubHkgaWYgY29weWluZ1xuICogICBpcyBzdWNjZXNzZnVsKS5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgbW92aW5nIGZhaWxzLCBlLmcuLCBpZiBubyBtb2RlbCBleGlzdHMgYXQgYHNvdXJjZVVSTGAsIG9yXG4gKiAgIGlmIGBvbGRQYXRoYCBhbmQgYG5ld1BhdGhgIGFyZSBpZGVudGljYWwuXG4gKlxuICogQGRvYyB7XG4gKiAgIGhlYWRpbmc6ICdNb2RlbHMnLFxuICogICBzdWJoZWFkaW5nOiAnTWFuYWdlbWVudCcsXG4gKiAgIG5hbWVzcGFjZTogJ2lvJyxcbiAqICAgaWdub3JlQ0k6IHRydWVcbiAqIH1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbW92ZU1vZGVsKHNvdXJjZVVSTCwgZGVzdFVSTCkge1xuICAgIGNvbnN0IGRlbGV0ZVNvdXJjZSA9IHRydWU7XG4gICAgcmV0dXJuIGNsb25lTW9kZWxJbnRlcm5hbChzb3VyY2VVUkwsIGRlc3RVUkwsIGRlbGV0ZVNvdXJjZSk7XG59XG5leHBvcnQgeyBtb3ZlTW9kZWwsIGNvcHlNb2RlbCwgcmVtb3ZlTW9kZWwsIGxpc3RNb2RlbHMgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1vZGVsX21hbmFnZW1lbnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuY2xhc3MgUGFzc3Rocm91Z2hMb2FkZXIge1xuICAgIGNvbnN0cnVjdG9yKG1vZGVsQXJ0aWZhY3RzKSB7XG4gICAgICAgIHRoaXMubW9kZWxBcnRpZmFjdHMgPSBtb2RlbEFydGlmYWN0cztcbiAgICB9XG4gICAgYXN5bmMgbG9hZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZWxBcnRpZmFjdHM7XG4gICAgfVxufVxuY2xhc3MgUGFzc3Rocm91Z2hTYXZlciB7XG4gICAgY29uc3RydWN0b3Ioc2F2ZUhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5zYXZlSGFuZGxlciA9IHNhdmVIYW5kbGVyO1xuICAgIH1cbiAgICBhc3luYyBzYXZlKG1vZGVsQXJ0aWZhY3RzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNhdmVIYW5kbGVyKG1vZGVsQXJ0aWZhY3RzKTtcbiAgICB9XG59XG4vKipcbiAqIENyZWF0ZXMgYW4gSU9IYW5kbGVyIHRoYXQgbG9hZHMgbW9kZWwgYXJ0aWZhY3RzIGZyb20gbWVtb3J5LlxuICpcbiAqIFdoZW4gdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGB0Zi5sb2FkTGF5ZXJzTW9kZWxgLCBhbiBpbnN0YW5jZSBvZlxuICogYHRmLkxheWVyc01vZGVsYCAoS2VyYXMtc3R5bGUpIGNhbiBiZSBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBsb2FkZWQgYXJ0aWZhY3RzLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtb2RlbCA9IGF3YWl0IHRmLmxvYWRMYXllcnNNb2RlbCh0Zi5pby5mcm9tTWVtb3J5KFxuICogICAgIG1vZGVsVG9wb2xvZ3ksIHdlaWdodFNwZWNzLCB3ZWlnaHREYXRhKSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gbW9kZWxBcnRpZmFjdHMgYSBvYmplY3QgY29udGFpbmluZyBtb2RlbCB0b3BvbG9neSAoaS5lLiwgcGFyc2VkIGZyb21cbiAqICAgdGhlIEpTT04gZm9ybWF0KS5cbiAqIEBwYXJhbSB3ZWlnaHRTcGVjcyBBbiBhcnJheSBvZiBgV2VpZ2h0c01hbmlmZXN0RW50cnlgIG9iamVjdHMgZGVzY3JpYmluZyB0aGVcbiAqICAgbmFtZXMsIHNoYXBlcywgdHlwZXMsIGFuZCBxdWFudGl6YXRpb24gb2YgdGhlIHdlaWdodCBkYXRhLlxuICogQHBhcmFtIHdlaWdodERhdGEgQSBzaW5nbGUgYEFycmF5QnVmZmVyYCBjb250YWluaW5nIHRoZSB3ZWlnaHQgZGF0YSxcbiAqICAgY29uY2F0ZW5hdGVkIGluIHRoZSBvcmRlciBkZXNjcmliZWQgYnkgdGhlIHdlaWdodFNwZWNzLlxuICogQHBhcmFtIHRyYWluaW5nQ29uZmlnIE1vZGVsIHRyYWluaW5nIGNvbmZpZ3VyYXRpb24uIE9wdGlvbmFsLlxuICpcbiAqIEByZXR1cm5zIEEgcGFzc3Rocm91Z2ggYElPSGFuZGxlcmAgdGhhdCBzaW1wbHkgbG9hZHMgdGhlIHByb3ZpZGVkIGRhdGEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tTWVtb3J5KG1vZGVsQXJ0aWZhY3RzLCB3ZWlnaHRTcGVjcywgd2VpZ2h0RGF0YSwgdHJhaW5pbmdDb25maWcpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCBpc01vZGVsQXJ0aWZhY3RzID0gbW9kZWxBcnRpZmFjdHMubW9kZWxUb3BvbG9neSAhPSBudWxsIHx8XG4gICAgICAgICAgICBtb2RlbEFydGlmYWN0cy53ZWlnaHRTcGVjcyAhPSBudWxsO1xuICAgICAgICBpZiAoaXNNb2RlbEFydGlmYWN0cykge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXNzdGhyb3VnaExvYWRlcihtb2RlbEFydGlmYWN0cyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBMZWdhY3kgc3VwcG9ydDogd2l0aCBvbmx5IG1vZGVsVG9wb2xvZ3kuXG4gICAgICAgICAgICAvLyBUT0RPKGNhaXMpOiBSZW1vdmUgdGhpcyBkZXByZWNhdGVkIEFQSS5cbiAgICAgICAgICAgIGNvbnNvbGUud2FybignUGxlYXNlIGNhbGwgdGYuaW8uZnJvbU1lbW9yeSgpIHdpdGggb25seSBvbmUgYXJndW1lbnQuICcgK1xuICAgICAgICAgICAgICAgICdUaGUgYXJndW1lbnQgc2hvdWxkIGJlIG9mIHR5cGUgTW9kZWxBcnRpZmFjdHMuICcgK1xuICAgICAgICAgICAgICAgICdUaGUgbXVsdGktYXJndW1lbnQgc2lnbmF0dXJlIG9mIHRmLmlvLmZyb21NZW1vcnkoKSBoYXMgYmVlbiAnICtcbiAgICAgICAgICAgICAgICAnZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuJyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBhc3N0aHJvdWdoTG9hZGVyKHsgbW9kZWxUb3BvbG9neTogbW9kZWxBcnRpZmFjdHMgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIExlZ2FjeSBzdXBwb3J0LlxuICAgICAgICAvLyBUT0RPKGNhaXMpOiBSZW1vdmUgdGhpcyBkZXByZWNhdGVkIEFQSS5cbiAgICAgICAgY29uc29sZS53YXJuKCdQbGVhc2UgY2FsbCB0Zi5pby5mcm9tTWVtb3J5KCkgd2l0aCBvbmx5IG9uZSBhcmd1bWVudC4gJyArXG4gICAgICAgICAgICAnVGhlIGFyZ3VtZW50IHNob3VsZCBiZSBvZiB0eXBlIE1vZGVsQXJ0aWZhY3RzLiAnICtcbiAgICAgICAgICAgICdUaGUgbXVsdGktYXJndW1lbnQgc2lnbmF0dXJlIG9mIHRmLmlvLmZyb21NZW1vcnkoKSBoYXMgYmVlbiAnICtcbiAgICAgICAgICAgICdkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4nKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQYXNzdGhyb3VnaExvYWRlcih7XG4gICAgICAgICAgICBtb2RlbFRvcG9sb2d5OiBtb2RlbEFydGlmYWN0cyxcbiAgICAgICAgICAgIHdlaWdodFNwZWNzLFxuICAgICAgICAgICAgd2VpZ2h0RGF0YSxcbiAgICAgICAgICAgIHRyYWluaW5nQ29uZmlnXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbi8qKlxuICogQ3JlYXRlcyBhbiBJT0hhbmRsZXIgdGhhdCBwYXNzZXMgc2F2ZWQgbW9kZWwgYXJ0aWZhY3RzIHRvIGEgY2FsbGJhY2suXG4gKlxuICogYGBganNcbiAqIGZ1bmN0aW9uIGhhbmRsZVNhdmUoYXJ0aWZhY3RzKSB7XG4gKiAgIC8vIC4uLiBkbyBzb21ldGhpbmcgd2l0aCB0aGUgYXJ0aWZhY3RzIC4uLlxuICogICByZXR1cm4ge21vZGVsQXJ0aWZhY3RzSW5mbzogey4uLn0sIC4uLn07XG4gKiB9XG4gKlxuICogY29uc3Qgc2F2ZVJlc3VsdCA9IG1vZGVsLnNhdmUodGYuaW8ud2l0aFNhdmVIYW5kbGVyKGhhbmRsZVNhdmUpKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBzYXZlSGFuZGxlciBBIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBhIGBNb2RlbEFydGlmYWN0c2AgYW5kIHJldHVybnMgYVxuICogICAgIGBTYXZlUmVzdWx0YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhTYXZlSGFuZGxlcihzYXZlSGFuZGxlcikge1xuICAgIHJldHVybiBuZXcgUGFzc3Rocm91Z2hTYXZlcihzYXZlSGFuZGxlcik7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXNzdGhyb3VnaC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsJztcbi8qKlxuICogTW9uaXRvciBQcm9taXNlLmFsbCBwcm9ncmVzcywgZmlyZSBvblByb2dyZXNzIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSBwcm9taXNlcyBQcm9taXNlIGxpc3QgZ29pbmcgdG8gYmUgbW9uaXRvcmVkXG4gKiBAcGFyYW0gb25Qcm9ncmVzcyBDYWxsYmFjayBmdW5jdGlvbi4gRmlyZWQgd2hlbiBhIHByb21pc2UgcmVzb2x2ZWQuXG4gKiBAcGFyYW0gc3RhcnRGcmFjdGlvbiBPcHRpb25hbCBmcmFjdGlvbiBzdGFydC4gRGVmYXVsdCB0byAwLlxuICogQHBhcmFtIGVuZEZyYWN0aW9uIE9wdGlvbmFsIGZyYWN0aW9uIGVuZC4gRGVmYXVsdCB0byAxLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbW9uaXRvclByb21pc2VzUHJvZ3Jlc3MocHJvbWlzZXMsIG9uUHJvZ3Jlc3MsIHN0YXJ0RnJhY3Rpb24sIGVuZEZyYWN0aW9uKSB7XG4gICAgY2hlY2tQcm9taXNlcyhwcm9taXNlcyk7XG4gICAgc3RhcnRGcmFjdGlvbiA9IHN0YXJ0RnJhY3Rpb24gPT0gbnVsbCA/IDAgOiBzdGFydEZyYWN0aW9uO1xuICAgIGVuZEZyYWN0aW9uID0gZW5kRnJhY3Rpb24gPT0gbnVsbCA/IDEgOiBlbmRGcmFjdGlvbjtcbiAgICBjaGVja0ZyYWN0aW9uKHN0YXJ0RnJhY3Rpb24sIGVuZEZyYWN0aW9uKTtcbiAgICBsZXQgcmVzb2x2ZWRQcm9taXNlID0gMDtcbiAgICBjb25zdCByZWdpc3Rlck1vbml0b3IgPSAocHJvbWlzZSkgPT4ge1xuICAgICAgICBwcm9taXNlLnRoZW4odmFsdWUgPT4ge1xuICAgICAgICAgICAgY29uc3QgZnJhY3Rpb24gPSBzdGFydEZyYWN0aW9uICtcbiAgICAgICAgICAgICAgICArK3Jlc29sdmVkUHJvbWlzZSAvIHByb21pc2VzLmxlbmd0aCAqIChlbmRGcmFjdGlvbiAtIHN0YXJ0RnJhY3Rpb24pO1xuICAgICAgICAgICAgLy8gcGFzcyBmcmFjdGlvbiBhcyBwYXJhbWV0ZXIgdG8gY2FsbGJhY2sgZnVuY3Rpb24uXG4gICAgICAgICAgICBvblByb2dyZXNzKGZyYWN0aW9uKTtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH07XG4gICAgZnVuY3Rpb24gY2hlY2tQcm9taXNlcyhwcm9taXNlcykge1xuICAgICAgICBhc3NlcnQocHJvbWlzZXMgIT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KHByb21pc2VzKSAmJiBwcm9taXNlcy5sZW5ndGggPiAwLCAoKSA9PiAncHJvbWlzZXMgbXVzdCBiZSBhIG5vbmUgZW1wdHkgYXJyYXknKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2hlY2tGcmFjdGlvbihzdGFydEZyYWN0aW9uLCBlbmRGcmFjdGlvbikge1xuICAgICAgICBhc3NlcnQoc3RhcnRGcmFjdGlvbiA+PSAwICYmIHN0YXJ0RnJhY3Rpb24gPD0gMSwgKCkgPT4gYFByb2dyZXNzIGZyYWN0aW9uIG11c3QgYmUgaW4gcmFuZ2UgWzAsIDFdLCBidXQgYCArXG4gICAgICAgICAgICBgZ290IHN0YXJ0RnJhY3Rpb24gJHtzdGFydEZyYWN0aW9ufWApO1xuICAgICAgICBhc3NlcnQoZW5kRnJhY3Rpb24gPj0gMCAmJiBlbmRGcmFjdGlvbiA8PSAxLCAoKSA9PiBgUHJvZ3Jlc3MgZnJhY3Rpb24gbXVzdCBiZSBpbiByYW5nZSBbMCwgMV0sIGJ1dCBgICtcbiAgICAgICAgICAgIGBnb3QgZW5kRnJhY3Rpb24gJHtlbmRGcmFjdGlvbn1gKTtcbiAgICAgICAgYXNzZXJ0KGVuZEZyYWN0aW9uID49IHN0YXJ0RnJhY3Rpb24sICgpID0+IGBzdGFydEZyYWN0aW9uIG11c3QgYmUgbm8gbW9yZSB0aGFuIGVuZEZyYWN0aW9uLCBidXQgYCArXG4gICAgICAgICAgICBgZ290IHN0YXJ0RnJhY3Rpb24gJHtzdGFydEZyYWN0aW9ufSBhbmQgZW5kRnJhY3Rpb24gYCArXG4gICAgICAgICAgICBgJHtlbmRGcmFjdGlvbn1gKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzLm1hcChyZWdpc3Rlck1vbml0b3IpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXByb2dyZXNzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmV4cG9ydCBjbGFzcyBJT1JvdXRlclJlZ2lzdHJ5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5zYXZlUm91dGVycyA9IFtdO1xuICAgICAgICB0aGlzLmxvYWRSb3V0ZXJzID0gW107XG4gICAgfVxuICAgIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHtcbiAgICAgICAgaWYgKElPUm91dGVyUmVnaXN0cnkuaW5zdGFuY2UgPT0gbnVsbCkge1xuICAgICAgICAgICAgSU9Sb3V0ZXJSZWdpc3RyeS5pbnN0YW5jZSA9IG5ldyBJT1JvdXRlclJlZ2lzdHJ5KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIElPUm91dGVyUmVnaXN0cnkuaW5zdGFuY2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIGEgc2F2ZS1oYW5kbGVyIHJvdXRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzYXZlUm91dGVyIEEgZnVuY3Rpb24gdGhhdCBtYXBzIGEgVVJMLWxpa2Ugc3RyaW5nIG9udG8gYW4gaW5zdGFuY2VcbiAgICAgKiBvZiBgSU9IYW5kbGVyYCB3aXRoIHRoZSBgc2F2ZWAgbWV0aG9kIGRlZmluZWQgb3IgYG51bGxgLlxuICAgICAqL1xuICAgIHN0YXRpYyByZWdpc3RlclNhdmVSb3V0ZXIoc2F2ZVJvdXRlcikge1xuICAgICAgICBJT1JvdXRlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuc2F2ZVJvdXRlcnMucHVzaChzYXZlUm91dGVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXIgYSBsb2FkLWhhbmRsZXIgcm91dGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIGxvYWRSb3V0ZXIgQSBmdW5jdGlvbiB0aGF0IG1hcHMgYSBVUkwtbGlrZSBzdHJpbmcgb250byBhbiBpbnN0YW5jZVxuICAgICAqIG9mIGBJT0hhbmRsZXJgIHdpdGggdGhlIGBsb2FkYCBtZXRob2QgZGVmaW5lZCBvciBgbnVsbGAuXG4gICAgICovXG4gICAgc3RhdGljIHJlZ2lzdGVyTG9hZFJvdXRlcihsb2FkUm91dGVyKSB7XG4gICAgICAgIElPUm91dGVyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5sb2FkUm91dGVycy5wdXNoKGxvYWRSb3V0ZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb29rIHVwIElPSGFuZGxlciBmb3Igc2F2aW5nLCBnaXZlbiBhIFVSTC1saWtlIHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB1cmxcbiAgICAgKiBAcmV0dXJucyBJZiBvbmx5IG9uZSBtYXRjaCBpcyBmb3VuZCwgYW4gaW5zdGFuY2Ugb2YgSU9IYW5kbGVyIHdpdGggdGhlXG4gICAgICogYHNhdmVgIG1ldGhvZCBkZWZpbmVkLiBJZiBubyBtYXRjaCBpcyBmb3VuZCwgYG51bGxgLlxuICAgICAqIEB0aHJvd3MgRXJyb3IsIGlmIG1vcmUgdGhhbiBvbmUgbWF0Y2ggaXMgZm91bmQuXG4gICAgICovXG4gICAgc3RhdGljIGdldFNhdmVIYW5kbGVycyh1cmwpIHtcbiAgICAgICAgcmV0dXJuIElPUm91dGVyUmVnaXN0cnkuZ2V0SGFuZGxlcnModXJsLCAnc2F2ZScpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb29rIHVwIElPSGFuZGxlciBmb3IgbG9hZGluZywgZ2l2ZW4gYSBVUkwtbGlrZSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdXJsXG4gICAgICogQHBhcmFtIGxvYWRPcHRpb25zIE9wdGlvbmFsLCBjdXN0b20gbG9hZCBvcHRpb25zLlxuICAgICAqIEByZXR1cm5zIEFsbCB2YWxpZCBoYW5kbGVycyBmb3IgYHVybGAsIGdpdmVuIHRoZSBjdXJyZW50bHkgcmVnaXN0ZXJlZFxuICAgICAqICAgaGFuZGxlciByb3V0ZXJzLlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRMb2FkSGFuZGxlcnModXJsLCBsb2FkT3B0aW9ucykge1xuICAgICAgICByZXR1cm4gSU9Sb3V0ZXJSZWdpc3RyeS5nZXRIYW5kbGVycyh1cmwsICdsb2FkJywgbG9hZE9wdGlvbnMpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0SGFuZGxlcnModXJsLCBoYW5kbGVyVHlwZSwgbG9hZE9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgdmFsaWRIYW5kbGVycyA9IFtdO1xuICAgICAgICBjb25zdCByb3V0ZXJzID0gaGFuZGxlclR5cGUgPT09ICdsb2FkJyA/XG4gICAgICAgICAgICBJT1JvdXRlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkubG9hZFJvdXRlcnMgOlxuICAgICAgICAgICAgSU9Sb3V0ZXJSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLnNhdmVSb3V0ZXJzO1xuICAgICAgICByb3V0ZXJzLmZvckVhY2gocm91dGVyID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSByb3V0ZXIodXJsLCBsb2FkT3B0aW9ucyk7XG4gICAgICAgICAgICBpZiAoaGFuZGxlciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZhbGlkSGFuZGxlcnMucHVzaChoYW5kbGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB2YWxpZEhhbmRsZXJzO1xuICAgIH1cbn1cbmV4cG9ydCBjb25zdCByZWdpc3RlclNhdmVSb3V0ZXIgPSAobG91ZFJvdXRlcikgPT4gSU9Sb3V0ZXJSZWdpc3RyeS5yZWdpc3RlclNhdmVSb3V0ZXIobG91ZFJvdXRlcik7XG5leHBvcnQgY29uc3QgcmVnaXN0ZXJMb2FkUm91dGVyID0gKGxvdWRSb3V0ZXIpID0+IElPUm91dGVyUmVnaXN0cnkucmVnaXN0ZXJMb2FkUm91dGVyKGxvdWRSb3V0ZXIpO1xuZXhwb3J0IGNvbnN0IGdldFNhdmVIYW5kbGVycyA9ICh1cmwpID0+IElPUm91dGVyUmVnaXN0cnkuZ2V0U2F2ZUhhbmRsZXJzKHVybCk7XG5leHBvcnQgY29uc3QgZ2V0TG9hZEhhbmRsZXJzID0gKHVybCwgbG9hZE9wdGlvbnMpID0+IElPUm91dGVyUmVnaXN0cnkuZ2V0TG9hZEhhbmRsZXJzKHVybCwgbG9hZE9wdGlvbnMpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cm91dGVyX3JlZ2lzdHJ5LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qIFR5cGUgZGVmaW5pdGlvbnMgZm9yIGV4cG9ydGluZyBhbmQgaW1wb3J0aW5nIG9mIG1vZGVscy4gKi9cbi8qKlxuICogQSBtYXAgZnJvbSBUZW5zb3IgZHR5cGUgdG8gbnVtYmVyIG9mIGJ5dGVzIHBlciBlbGVtZW50IG9mIHRoZSBUZW5zb3IuXG4gKi9cbmV4cG9ydCBjb25zdCBEVFlQRV9WQUxVRV9TSVpFX01BUCA9IHtcbiAgICAnZmxvYXQzMic6IDQsXG4gICAgJ2Zsb2F0MTYnOiAyLFxuICAgICdpbnQzMic6IDQsXG4gICAgJ3VpbnQxNic6IDIsXG4gICAgJ3VpbnQ4JzogMSxcbiAgICAnYm9vbCc6IDEsXG4gICAgJ2NvbXBsZXg2NCc6IDhcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD10eXBlcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBlbnYgfSBmcm9tICcuLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgZGVjb2RlV2VpZ2h0cyB9IGZyb20gJy4vaW9fdXRpbHMnO1xuaW1wb3J0IHsgbW9uaXRvclByb21pc2VzUHJvZ3Jlc3MgfSBmcm9tICcuL3Byb2dyZXNzJztcbmltcG9ydCB7IERUWVBFX1ZBTFVFX1NJWkVfTUFQIH0gZnJvbSAnLi90eXBlcyc7XG4vKipcbiAqIFJlYWRzIGJpbmFyeSB3ZWlnaHRzIGRhdGEgZnJvbSBhIG51bWJlciBvZiBVUkxzLlxuICpcbiAqIEBwYXJhbSBmZXRjaFVSTHMgVVJMcyB0byBzZW5kIHRoZSBIVFRQIHJlcXVlc3RzIGF0LCB1c2luZyBgZmV0Y2hgIGNhbGxzLlxuICogQHBhcmFtIHJlcXVlc3RPcHRpb25zIFJlcXVlc3RJbml0IChvcHRpb25zKSBmb3IgdGhlIEhUVFAgcmVxdWVzdHMuXG4gKiBAcGFyYW0gZmV0Y2hGdW5jIE9wdGlvbmFsIG92ZXJyaWRpbmcgdmFsdWUgZm9yIHRoZSBgd2luZG93LmZldGNoYCBmdW5jdGlvbi5cbiAqIEBwYXJhbSBvblByb2dyZXNzIE9wdGlvbmFsLCBwcm9ncmVzcyBjYWxsYmFjayBmdW5jdGlvbiwgZmlyZWQgcGVyaW9kaWNhbGx5XG4gKiAgIGJlZm9yZSB0aGUgbG9hZCBpcyBjb21wbGV0ZWQuXG4gKiBAcmV0dXJucyBBIGBQcm9taXNlYCBvZiBhbiBBcnJheSBvZiBgQXJyYXlCdWZmZXJgLiBUaGUgQXJyYXkgaGFzIHRoZSBzYW1lXG4gKiAgIGxlbmd0aCBhcyBgZmV0Y2hVUkxzYC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRXZWlnaHRzQXNBcnJheUJ1ZmZlcihmZXRjaFVSTHMsIGxvYWRPcHRpb25zKSB7XG4gICAgaWYgKGxvYWRPcHRpb25zID09IG51bGwpIHtcbiAgICAgICAgbG9hZE9wdGlvbnMgPSB7fTtcbiAgICB9XG4gICAgY29uc3QgZmV0Y2hGdW5jID0gbG9hZE9wdGlvbnMuZmV0Y2hGdW5jID09IG51bGwgPyBlbnYoKS5wbGF0Zm9ybS5mZXRjaCA6XG4gICAgICAgIGxvYWRPcHRpb25zLmZldGNoRnVuYztcbiAgICAvLyBDcmVhdGUgdGhlIHJlcXVlc3RzIGZvciBhbGwgb2YgdGhlIHdlaWdodHMgaW4gcGFyYWxsZWwuXG4gICAgY29uc3QgcmVxdWVzdHMgPSBmZXRjaFVSTHMubWFwKGZldGNoVVJMID0+IGZldGNoRnVuYyhmZXRjaFVSTCwgbG9hZE9wdGlvbnMucmVxdWVzdEluaXQsIHsgaXNCaW5hcnk6IHRydWUgfSkpO1xuICAgIGNvbnN0IGZldGNoU3RhcnRGcmFjdGlvbiA9IDA7XG4gICAgY29uc3QgZmV0Y2hFbmRGcmFjdGlvbiA9IDAuNTtcbiAgICBjb25zdCByZXNwb25zZXMgPSBsb2FkT3B0aW9ucy5vblByb2dyZXNzID09IG51bGwgP1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChyZXF1ZXN0cykgOlxuICAgICAgICBhd2FpdCBtb25pdG9yUHJvbWlzZXNQcm9ncmVzcyhyZXF1ZXN0cywgbG9hZE9wdGlvbnMub25Qcm9ncmVzcywgZmV0Y2hTdGFydEZyYWN0aW9uLCBmZXRjaEVuZEZyYWN0aW9uKTtcbiAgICBjb25zdCBidWZmZXJQcm9taXNlcyA9IHJlc3BvbnNlcy5tYXAocmVzcG9uc2UgPT4gcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSk7XG4gICAgY29uc3QgYnVmZmVyU3RhcnRGcmFjdGlvbiA9IDAuNTtcbiAgICBjb25zdCBidWZmZXJFbmRGcmFjdGlvbiA9IDE7XG4gICAgY29uc3QgYnVmZmVycyA9IGxvYWRPcHRpb25zLm9uUHJvZ3Jlc3MgPT0gbnVsbCA/XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKGJ1ZmZlclByb21pc2VzKSA6XG4gICAgICAgIGF3YWl0IG1vbml0b3JQcm9taXNlc1Byb2dyZXNzKGJ1ZmZlclByb21pc2VzLCBsb2FkT3B0aW9ucy5vblByb2dyZXNzLCBidWZmZXJTdGFydEZyYWN0aW9uLCBidWZmZXJFbmRGcmFjdGlvbik7XG4gICAgcmV0dXJuIGJ1ZmZlcnM7XG59XG4vKipcbiAqIFJlYWRzIGEgd2VpZ2h0cyBtYW5pZmVzdCBKU09OIGNvbmZpZ3VyYXRpb24sIGZldGNoZXMgdGhlIHdlaWdodHMgYW5kXG4gKiByZXR1cm5zIHRoZW0gYXMgYFRlbnNvcmBzLlxuICpcbiAqIEBwYXJhbSBtYW5pZmVzdCBUaGUgd2VpZ2h0cyBtYW5pZmVzdCBKU09OLlxuICogQHBhcmFtIGZpbGVQYXRoUHJlZml4IFRoZSBwYXRoIHByZWZpeCBmb3IgZmlsZW5hbWVzIGdpdmVuIGluIHRoZSBtYW5pZmVzdC5cbiAqICAgICBEZWZhdWx0cyB0byB0aGUgZW1wdHkgc3RyaW5nLlxuICogQHBhcmFtIHdlaWdodE5hbWVzIFRoZSBuYW1lcyBvZiB0aGUgd2VpZ2h0cyB0byBiZSBmZXRjaGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFdlaWdodHMobWFuaWZlc3QsIGZpbGVQYXRoUHJlZml4ID0gJycsIHdlaWdodE5hbWVzLCByZXF1ZXN0SW5pdCkge1xuICAgIC8vIFRPRE8obnN0aG9yYXQpOiBHcm91cHMgYXJlIGN1cnJlbnRseSBmZXRjaGVkIGF0b21pY2FsbHkuIElmIHlvdSBuZWVkIGFcbiAgICAvLyBzaW5nbGUgd2VpZ2h0IGZyb20gYSBncm91cCwgdGhlIHdob2xlIGdyb3VwIHdpbGwgYmUgZmV0Y2hlZC4gQXQgYSBmdXR1cmVcbiAgICAvLyBkYXRlLCB3ZSBzaG91bGQgc3VwcG9ydCBmZXRjaGluZyBvbmx5IHRoZSBpbmRpdmlkdWFsIHNoYXJkcyB3aXRoaW4gYVxuICAgIC8vIGdyb3VwIHRoYXQgYXJlIG5lZWRlZCB0byByZWNvbnN0cnVjdCB0aGUgcmVxdWVzdGVkIHdlaWdodC5cbiAgICAvLyBUT0RPKGNhaXMpOiBVc2UgYGRlY29kZVdlaWdodHNgIGZvciBpbXBsZW1lbnRhdGlvbi5cbiAgICBjb25zdCBmZXRjaFdlaWdodHMgPSAoZmV0Y2hVcmxzKSA9PiBsb2FkV2VpZ2h0c0FzQXJyYXlCdWZmZXIoZmV0Y2hVcmxzLCB7IHJlcXVlc3RJbml0IH0pO1xuICAgIGNvbnN0IGxvYWRXZWlnaHRzID0gd2VpZ2h0c0xvYWRlckZhY3RvcnkoZmV0Y2hXZWlnaHRzKTtcbiAgICByZXR1cm4gbG9hZFdlaWdodHMobWFuaWZlc3QsIGZpbGVQYXRoUHJlZml4LCB3ZWlnaHROYW1lcyk7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiwgd2hpY2ggcmVhZHMgYSB3ZWlnaHRzIG1hbmlmZXN0IEpTT04gY29uZmlndXJhdGlvbixcbiAqIGZldGNoZXMgdGhlIHdlaWdodCBmaWxlcyB1c2luZyB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIGFuZCByZXR1cm5zIHRoZW0gYXNcbiAqIGBUZW5zb3Jgcy5cbiAqXG4gKiBgYGBqc1xuICogLy8gZXhhbXBsZSBmb3IgY3JlYXRpbmcgYSBub2RlanMgd2VpZ2h0IGxvYWRlciwgd2hpY2ggcmVhZHMgdGhlIHdlaWdodCBmaWxlc1xuICogLy8gZnJvbSBkaXNrIHVzaW5nIGZzLnJlYWRGaWxlU3luY1xuICpcbiAqIGltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJ1xuICpcbiAqIGNvbnN0IGZldGNoV2VpZ2h0c0Zyb21EaXNrID0gKGZpbGVQYXRoczogc3RyaW5nW10pID0+XG4gKiAgIGZpbGVQYXRocy5tYXAoZmlsZVBhdGggPT4gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoKS5idWZmZXIpXG4gKlxuICogY29uc3QgbG9hZFdlaWdodHMgPSB0Zi5pby53ZWlnaHRzTG9hZGVyRmFjdG9yeShmZXRjaFdlaWdodHNGcm9tRGlzaylcbiAqXG4gKiBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoXG4gKiAgIGZzLnJlYWRGaWxlU3luYygnLi9teV9tb2RlbC13ZWlnaHRzX21hbmlmZXN0JykudG9TdHJpbmcoKVxuICogKVxuICogY29uc3Qgd2VpZ2h0TWFwID0gYXdhaXQgbG9hZFdlaWdodHMobWFuaWZlc3QsICcuLycpXG4gKiBgYGBcbiAqIEBwYXJhbSBmZXRjaFdlaWdodHNGdW5jdGlvbiBUaGUgZnVuY3Rpb24gdXNlZCBmb3IgZmV0Y2hpbmcgdGhlIHdlaWdodCBmaWxlcy5cbiAqIEByZXR1cm5zIFdlaWdodCBsb2FkaW5nIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2VpZ2h0c0xvYWRlckZhY3RvcnkoZmV0Y2hXZWlnaHRzRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gYXN5bmMgKG1hbmlmZXN0LCBmaWxlUGF0aFByZWZpeCA9ICcnLCB3ZWlnaHROYW1lcykgPT4ge1xuICAgICAgICAvLyBDb2xsZWN0IGFsbCB0aGUgZ3JvdXBzLCB3ZWlnaHRzLCBhbmQgdGhlaXIgcmVsYXRpdmUgb2Zmc2V0cyB0byBiZVxuICAgICAgICAvLyBmZXRjaGVkLlxuICAgICAgICBjb25zdCBncm91cEluZGljZXNUb0ZldGNoTWFwID0gbWFuaWZlc3QubWFwKCgpID0+IGZhbHNlKTtcbiAgICAgICAgY29uc3QgZ3JvdXBXZWlnaHRzVG9GZXRjaCA9IHt9O1xuICAgICAgICBjb25zdCB3ZWlnaHRzRm91bmQgPSB3ZWlnaHROYW1lcyAhPSBudWxsID8gd2VpZ2h0TmFtZXMubWFwKCgpID0+IGZhbHNlKSA6IFtdO1xuICAgICAgICBjb25zdCBhbGxNYW5pZmVzdFdlaWdodE5hbWVzID0gW107XG4gICAgICAgIG1hbmlmZXN0LmZvckVhY2goKG1hbmlmZXN0R3JvdXBDb25maWcsIGdyb3VwSW5kZXgpID0+IHtcbiAgICAgICAgICAgIGxldCBncm91cE9mZnNldCA9IDA7XG4gICAgICAgICAgICBtYW5pZmVzdEdyb3VwQ29uZmlnLndlaWdodHMuZm9yRWFjaCh3ZWlnaHRzRW50cnkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhd0R0eXBlID0gKCdxdWFudGl6YXRpb24nIGluIHdlaWdodHNFbnRyeSkgP1xuICAgICAgICAgICAgICAgICAgICB3ZWlnaHRzRW50cnkucXVhbnRpemF0aW9uLmR0eXBlIDpcbiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0c0VudHJ5LmR0eXBlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHdlaWdodHNCeXRlcyA9IERUWVBFX1ZBTFVFX1NJWkVfTUFQW3Jhd0R0eXBlXSAqXG4gICAgICAgICAgICAgICAgICAgIHV0aWwuc2l6ZUZyb21TaGFwZSh3ZWlnaHRzRW50cnkuc2hhcGUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVucXVldWVXZWlnaHRzRm9yRmV0Y2hpbmdGbiA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBJbmRpY2VzVG9GZXRjaE1hcFtncm91cEluZGV4XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChncm91cFdlaWdodHNUb0ZldGNoW2dyb3VwSW5kZXhdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwV2VpZ2h0c1RvRmV0Y2hbZ3JvdXBJbmRleF0gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBncm91cFdlaWdodHNUb0ZldGNoW2dyb3VwSW5kZXhdLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3RFbnRyeTogd2VpZ2h0c0VudHJ5LFxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBPZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplQnl0ZXM6IHdlaWdodHNCeXRlc1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmICh3ZWlnaHROYW1lcyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHdlaWdodE5hbWVzLmZvckVhY2goKHdlaWdodE5hbWUsIHdlaWdodEluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAod2VpZ2h0TmFtZSA9PT0gd2VpZ2h0c0VudHJ5Lm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnF1ZXVlV2VpZ2h0c0ZvckZldGNoaW5nRm4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRzRm91bmRbd2VpZ2h0SW5kZXhdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlbnF1ZXVlV2VpZ2h0c0ZvckZldGNoaW5nRm4oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYWxsTWFuaWZlc3RXZWlnaHROYW1lcy5wdXNoKHdlaWdodHNFbnRyeS5uYW1lKTtcbiAgICAgICAgICAgICAgICBncm91cE9mZnNldCArPSB3ZWlnaHRzQnl0ZXM7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghd2VpZ2h0c0ZvdW5kLmV2ZXJ5KGZvdW5kID0+IGZvdW5kKSkge1xuICAgICAgICAgICAgY29uc3Qgd2VpZ2h0c05vdEZvdW5kID0gd2VpZ2h0TmFtZXMuZmlsdGVyKChfLCBpKSA9PiAhd2VpZ2h0c0ZvdW5kW2ldKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgd2VpZ2h0cyBpbiBtYW5pZmVzdCB3aXRoIG5hbWVzOiBgICtcbiAgICAgICAgICAgICAgICBgJHt3ZWlnaHRzTm90Rm91bmQuam9pbignLCAnKX0uIFxcbmAgK1xuICAgICAgICAgICAgICAgIGBNYW5pZmVzdCBKU09OIGhhcyB3ZWlnaHRzIHdpdGggbmFtZXM6IGAgK1xuICAgICAgICAgICAgICAgIGAke2FsbE1hbmlmZXN0V2VpZ2h0TmFtZXMuam9pbignLCAnKX0uYCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ29udmVydCB0aGUgb25lLWhvdCBib29sZWFuIGdyb3VwSWQgPT4gc2hvdWxkRmV0Y2ggbWFwIHRvIGEgbGlzdCBvZiBncm91cFxuICAgICAgICAvLyBJRHMuXG4gICAgICAgIGNvbnN0IGdyb3VwSW5kaWNlc1RvRmV0Y2ggPSBncm91cEluZGljZXNUb0ZldGNoTWFwLnJlZHVjZSgoYWNjdW11bGF0b3IsIHNob3VsZEZldGNoLCBpKSA9PiB7XG4gICAgICAgICAgICBpZiAoc2hvdWxkRmV0Y2gpIHtcbiAgICAgICAgICAgICAgICBhY2N1bXVsYXRvci5wdXNoKGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICAgICAgICB9LCBbXSk7XG4gICAgICAgIGNvbnN0IGZldGNoVXJscyA9IFtdO1xuICAgICAgICBncm91cEluZGljZXNUb0ZldGNoLmZvckVhY2goaSA9PiB7XG4gICAgICAgICAgICBtYW5pZmVzdFtpXS5wYXRocy5mb3JFYWNoKGZpbGVwYXRoID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmZXRjaFVybCA9IGZpbGVQYXRoUHJlZml4ICtcbiAgICAgICAgICAgICAgICAgICAgKCFmaWxlUGF0aFByZWZpeC5lbmRzV2l0aCgnLycpID8gJy8nIDogJycpICsgZmlsZXBhdGg7XG4gICAgICAgICAgICAgICAgZmV0Y2hVcmxzLnB1c2goZmV0Y2hVcmwpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBidWZmZXJzID0gYXdhaXQgZmV0Y2hXZWlnaHRzRnVuY3Rpb24oZmV0Y2hVcmxzKTtcbiAgICAgICAgY29uc3Qgd2VpZ2h0c1RlbnNvck1hcCA9IHt9O1xuICAgICAgICBsZXQgYnVmZmVySW5kZXhPZmZzZXQgPSAwO1xuICAgICAgICBncm91cEluZGljZXNUb0ZldGNoLmZvckVhY2goaSA9PiB7XG4gICAgICAgICAgICBjb25zdCBudW1CdWZmZXJzID0gbWFuaWZlc3RbaV0ucGF0aHMubGVuZ3RoO1xuICAgICAgICAgICAgbGV0IGdyb3VwQnl0ZXMgPSAwO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1CdWZmZXJzOyBpKyspIHtcbiAgICAgICAgICAgICAgICBncm91cEJ5dGVzICs9IGJ1ZmZlcnNbYnVmZmVySW5kZXhPZmZzZXQgKyBpXS5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ3JlYXRlIGEgYnVmZmVyIGZvciB0aGUgd2hvbGUgZ3JvdXAuXG4gICAgICAgICAgICBjb25zdCBncm91cEJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihncm91cEJ5dGVzKTtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwQnl0ZUJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KGdyb3VwQnVmZmVyKTtcbiAgICAgICAgICAgIGxldCBncm91cEJ1ZmZlck9mZnNldCA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUJ1ZmZlcnM7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcnNbYnVmZmVySW5kZXhPZmZzZXQgKyBpXSk7XG4gICAgICAgICAgICAgICAgZ3JvdXBCeXRlQnVmZmVyLnNldChidWZmZXIsIGdyb3VwQnVmZmVyT2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBncm91cEJ1ZmZlck9mZnNldCArPSBidWZmZXIuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHdlaWdodHNFbnRyaWVzID0gZ3JvdXBXZWlnaHRzVG9GZXRjaFtpXTtcbiAgICAgICAgICAgIHdlaWdodHNFbnRyaWVzLmZvckVhY2god2VpZ2h0c0VudHJ5ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBieXRlQnVmZmVyID0gZ3JvdXBCdWZmZXIuc2xpY2Uod2VpZ2h0c0VudHJ5Lmdyb3VwT2Zmc2V0LCB3ZWlnaHRzRW50cnkuZ3JvdXBPZmZzZXQgKyB3ZWlnaHRzRW50cnkuc2l6ZUJ5dGVzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lVG9UZW5zb3JNYXAgPSBkZWNvZGVXZWlnaHRzKGJ5dGVCdWZmZXIsIFt3ZWlnaHRzRW50cnkubWFuaWZlc3RFbnRyeV0pO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBuYW1lVG9UZW5zb3JNYXApIHtcbiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0c1RlbnNvck1hcFtuYW1lXSA9IG5hbWVUb1RlbnNvck1hcFtuYW1lXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJ1ZmZlckluZGV4T2Zmc2V0ICs9IG51bUJ1ZmZlcnM7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gd2VpZ2h0c1RlbnNvck1hcDtcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d2VpZ2h0c19sb2FkZXIuanMubWFwIiwiZXhwb3J0IGNvbnN0IEFicyA9ICdBYnMnO1xuZXhwb3J0IGNvbnN0IEFjb3MgPSAnQWNvcyc7XG5leHBvcnQgY29uc3QgQWNvc2ggPSAnQWNvc2gnO1xuZXhwb3J0IGNvbnN0IEFkZCA9ICdBZGQnO1xuZXhwb3J0IGNvbnN0IEFkZE4gPSAnQWRkTic7XG5leHBvcnQgY29uc3QgQWxsID0gJ0FsbCc7XG5leHBvcnQgY29uc3QgQW55ID0gJ0FueSc7XG5leHBvcnQgY29uc3QgQXJnTWF4ID0gJ0FyZ01heCc7XG5leHBvcnQgY29uc3QgQXJnTWluID0gJ0FyZ01pbic7XG5leHBvcnQgY29uc3QgQXNpbiA9ICdBc2luJztcbmV4cG9ydCBjb25zdCBBc2luaCA9ICdBc2luaCc7XG5leHBvcnQgY29uc3QgQXRhbiA9ICdBdGFuJztcbmV4cG9ydCBjb25zdCBBdGFuaCA9ICdBdGFuaCc7XG5leHBvcnQgY29uc3QgQXRhbjIgPSAnQXRhbjInO1xuZXhwb3J0IGNvbnN0IEF2Z1Bvb2wgPSAnQXZnUG9vbCc7XG5leHBvcnQgY29uc3QgQXZnUG9vbEdyYWQgPSAnQXZnUG9vbEdyYWQnO1xuZXhwb3J0IGNvbnN0IEF2Z1Bvb2wzRCA9ICdBdmdQb29sM0QnO1xuZXhwb3J0IGNvbnN0IEF2Z1Bvb2wzREdyYWQgPSAnQXZnUG9vbDNER3JhZCc7XG5leHBvcnQgY29uc3QgQmF0Y2hNYXRNdWwgPSAnQmF0Y2hNYXRNdWwnO1xuZXhwb3J0IGNvbnN0IEJhdGNoVG9TcGFjZU5EID0gJ0JhdGNoVG9TcGFjZU5EJztcbmV4cG9ydCBjb25zdCBCaW5jb3VudCA9ICdCaW5jb3VudCc7XG5leHBvcnQgY29uc3QgQnJvYWRjYXN0VG8gPSAnQnJvYWRjYXN0VG8nO1xuZXhwb3J0IGNvbnN0IENhc3QgPSAnQ2FzdCc7XG5leHBvcnQgY29uc3QgQ2VpbCA9ICdDZWlsJztcbmV4cG9ydCBjb25zdCBDbGlwQnlWYWx1ZSA9ICdDbGlwQnlWYWx1ZSc7XG5leHBvcnQgY29uc3QgQ29tcGxleCA9ICdDb21wbGV4JztcbmV4cG9ydCBjb25zdCBDb21wbGV4QWJzID0gJ0NvbXBsZXhBYnMnO1xuZXhwb3J0IGNvbnN0IENvbmNhdCA9ICdDb25jYXQnO1xuZXhwb3J0IGNvbnN0IENvbnYyRCA9ICdDb252MkQnO1xuZXhwb3J0IGNvbnN0IENvbnYyREJhY2twcm9wRmlsdGVyID0gJ0NvbnYyREJhY2twcm9wRmlsdGVyJztcbmV4cG9ydCBjb25zdCBDb252MkRCYWNrcHJvcElucHV0ID0gJ0NvbnYyREJhY2twcm9wSW5wdXQnO1xuZXhwb3J0IGNvbnN0IENvbnYzRCA9ICdDb252M0QnO1xuZXhwb3J0IGNvbnN0IENvbnYzREJhY2twcm9wRmlsdGVyVjIgPSAnQ29udjNEQmFja3Byb3BGaWx0ZXJWMic7XG5leHBvcnQgY29uc3QgQ29udjNEQmFja3Byb3BJbnB1dFYyID0gJ0NvbnYzREJhY2twcm9wSW5wdXRWMic7XG5leHBvcnQgY29uc3QgQ29zID0gJ0Nvcyc7XG5leHBvcnQgY29uc3QgQ29zaCA9ICdDb3NoJztcbmV4cG9ydCBjb25zdCBDdW1zdW0gPSAnQ3Vtc3VtJztcbmV4cG9ydCBjb25zdCBDcm9wQW5kUmVzaXplID0gJ0Nyb3BBbmRSZXNpemUnO1xuZXhwb3J0IGNvbnN0IERlbnNlQmluY291bnQgPSAnRGVuc2VCaW5jb3VudCc7XG5leHBvcnQgY29uc3QgRGVwdGhUb1NwYWNlID0gJ0RlcHRoVG9TcGFjZSc7XG5leHBvcnQgY29uc3QgRGVwdGh3aXNlQ29udjJkTmF0aXZlID0gJ0RlcHRod2lzZUNvbnYyZE5hdGl2ZSc7XG5leHBvcnQgY29uc3QgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIgPSAnRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXInO1xuZXhwb3J0IGNvbnN0IERlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXQgPSAnRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCc7XG5leHBvcnQgY29uc3QgRGlhZyA9ICdEaWFnJztcbmV4cG9ydCBjb25zdCBEaWxhdGlvbjJEID0gJ0RpbGF0aW9uMkQnO1xuZXhwb3J0IGNvbnN0IERpbGF0aW9uMkRCYWNrcHJvcElucHV0ID0gJ0RpbGF0aW9uMkRCYWNrcHJvcElucHV0JztcbmV4cG9ydCBjb25zdCBEaWxhdGlvbjJEQmFja3Byb3BGaWx0ZXIgPSAnRGlsYXRpb24yREJhY2twcm9wRmlsdGVyJztcbmV4cG9ydCBjb25zdCBSZWFsRGl2ID0gJ1JlYWxEaXYnO1xuZXhwb3J0IGNvbnN0IEVpbnN1bSA9ICdFaW5zdW0nO1xuZXhwb3J0IGNvbnN0IEVsdSA9ICdFbHUnO1xuZXhwb3J0IGNvbnN0IEVsdUdyYWQgPSAnRWx1R3JhZCc7XG5leHBvcnQgY29uc3QgRXJmID0gJ0VyZic7XG5leHBvcnQgY29uc3QgRXF1YWwgPSAnRXF1YWwnO1xuZXhwb3J0IGNvbnN0IEV4cCA9ICdFeHAnO1xuZXhwb3J0IGNvbnN0IEV4cGFuZERpbXMgPSAnRXhwYW5kRGltcyc7XG5leHBvcnQgY29uc3QgRXhwbTEgPSAnRXhwbTEnO1xuZXhwb3J0IGNvbnN0IEZGVCA9ICdGRlQnO1xuZXhwb3J0IGNvbnN0IEZpbGwgPSAnRmlsbCc7XG5leHBvcnQgY29uc3QgRmxpcExlZnRSaWdodCA9ICdGbGlwTGVmdFJpZ2h0JztcbmV4cG9ydCBjb25zdCBGbG9vciA9ICdGbG9vcic7XG5leHBvcnQgY29uc3QgRmxvb3JEaXYgPSAnRmxvb3JEaXYnO1xuZXhwb3J0IGNvbnN0IEZ1c2VkQmF0Y2hOb3JtID0gJ0Z1c2VkQmF0Y2hOb3JtJztcbmV4cG9ydCBjb25zdCBHYXRoZXJWMiA9ICdHYXRoZXJWMic7XG5leHBvcnQgY29uc3QgR2F0aGVyTmQgPSAnR2F0aGVyTmQnO1xuZXhwb3J0IGNvbnN0IEdyZWF0ZXIgPSAnR3JlYXRlcic7XG5leHBvcnQgY29uc3QgR3JlYXRlckVxdWFsID0gJ0dyZWF0ZXJFcXVhbCc7XG5leHBvcnQgY29uc3QgSWRlbnRpdHkgPSAnSWRlbnRpdHknO1xuZXhwb3J0IGNvbnN0IElGRlQgPSAnSUZGVCc7XG5leHBvcnQgY29uc3QgSW1hZyA9ICdJbWFnJztcbmV4cG9ydCBjb25zdCBJc0Zpbml0ZSA9ICdJc0Zpbml0ZSc7XG5leHBvcnQgY29uc3QgSXNJbmYgPSAnSXNJbmYnO1xuZXhwb3J0IGNvbnN0IElzTmFuID0gJ0lzTmFuJztcbmV4cG9ydCBjb25zdCBMZWFreVJlbHUgPSAnTGVha3lSZWx1JztcbmV4cG9ydCBjb25zdCBMZXNzID0gJ0xlc3MnO1xuZXhwb3J0IGNvbnN0IExlc3NFcXVhbCA9ICdMZXNzRXF1YWwnO1xuZXhwb3J0IGNvbnN0IExpblNwYWNlID0gJ0xpblNwYWNlJztcbmV4cG9ydCBjb25zdCBMb2cgPSAnTG9nJztcbmV4cG9ydCBjb25zdCBMb2cxcCA9ICdMb2cxcCc7XG5leHBvcnQgY29uc3QgTG9naWNhbEFuZCA9ICdMb2dpY2FsQW5kJztcbmV4cG9ydCBjb25zdCBMb2dpY2FsTm90ID0gJ0xvZ2ljYWxOb3QnO1xuZXhwb3J0IGNvbnN0IExvZ2ljYWxPciA9ICdMb2dpY2FsT3InO1xuZXhwb3J0IGNvbnN0IExvZ1NvZnRtYXggPSAnTG9nU29mdG1heCc7XG5leHBvcnQgY29uc3QgTFJOID0gJ0xSTic7XG5leHBvcnQgY29uc3QgTFJOR3JhZCA9ICdMUk5HcmFkJztcbmV4cG9ydCBjb25zdCBNYXggPSAnTWF4JztcbmV4cG9ydCBjb25zdCBNYXhpbXVtID0gJ01heGltdW0nO1xuZXhwb3J0IGNvbnN0IE1heFBvb2wgPSAnTWF4UG9vbCc7XG5leHBvcnQgY29uc3QgTWF4UG9vbEdyYWQgPSAnTWF4UG9vbEdyYWQnO1xuZXhwb3J0IGNvbnN0IE1heFBvb2wzRCA9ICdNYXhQb29sM0QnO1xuZXhwb3J0IGNvbnN0IE1heFBvb2wzREdyYWQgPSAnTWF4UG9vbDNER3JhZCc7XG5leHBvcnQgY29uc3QgTWF4UG9vbFdpdGhBcmdtYXggPSAnTWF4UG9vbFdpdGhBcmdtYXgnO1xuZXhwb3J0IGNvbnN0IE1lYW4gPSAnTWVhbic7XG5leHBvcnQgY29uc3QgTWluID0gJ01pbic7XG5leHBvcnQgY29uc3QgTWluaW11bSA9ICdNaW5pbXVtJztcbmV4cG9ydCBjb25zdCBNaXJyb3JQYWQgPSAnTWlycm9yUGFkJztcbmV4cG9ydCBjb25zdCBNb2QgPSAnTW9kJztcbmV4cG9ydCBjb25zdCBNdWx0aW5vbWlhbCA9ICdNdWx0aW5vbWlhbCc7XG5leHBvcnQgY29uc3QgTXVsdGlwbHkgPSAnTXVsdGlwbHknO1xuZXhwb3J0IGNvbnN0IE5lZyA9ICdOZWcnO1xuZXhwb3J0IGNvbnN0IE5vdEVxdWFsID0gJ05vdEVxdWFsJztcbmV4cG9ydCBjb25zdCBOb25NYXhTdXBwcmVzc2lvblYzID0gJ05vbk1heFN1cHByZXNzaW9uVjMnO1xuZXhwb3J0IGNvbnN0IE5vbk1heFN1cHByZXNzaW9uVjQgPSAnTm9uTWF4U3VwcHJlc3Npb25WNCc7XG5leHBvcnQgY29uc3QgTm9uTWF4U3VwcHJlc3Npb25WNSA9ICdOb25NYXhTdXBwcmVzc2lvblY1JztcbmV4cG9ydCBjb25zdCBPbmVzTGlrZSA9ICdPbmVzTGlrZSc7XG5leHBvcnQgY29uc3QgT25lSG90ID0gJ09uZUhvdCc7XG5leHBvcnQgY29uc3QgUGFjayA9ICdQYWNrJztcbmV4cG9ydCBjb25zdCBQYWRWMiA9ICdQYWRWMic7XG5leHBvcnQgY29uc3QgUG9vbCA9ICdQb29sJztcbmV4cG9ydCBjb25zdCBQb3cgPSAnUG93JztcbmV4cG9ydCBjb25zdCBQcmVsdSA9ICdQcmVsdSc7XG5leHBvcnQgY29uc3QgUHJvZCA9ICdQcm9kJztcbmV4cG9ydCBjb25zdCBSYW5nZSA9ICdSYW5nZSc7XG5leHBvcnQgY29uc3QgUmVhbCA9ICdSZWFsJztcbmV4cG9ydCBjb25zdCBSZWNpcHJvY2FsID0gJ1JlY2lwcm9jYWwnO1xuZXhwb3J0IGNvbnN0IFJlbHUgPSAnUmVsdSc7XG5leHBvcnQgY29uc3QgUmVzaGFwZSA9ICdSZXNoYXBlJztcbmV4cG9ydCBjb25zdCBSZXNpemVOZWFyZXN0TmVpZ2hib3IgPSAnUmVzaXplTmVhcmVzdE5laWdoYm9yJztcbmV4cG9ydCBjb25zdCBSZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkID0gJ1Jlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWQnO1xuZXhwb3J0IGNvbnN0IFJlc2l6ZUJpbGluZWFyID0gJ1Jlc2l6ZUJpbGluZWFyJztcbmV4cG9ydCBjb25zdCBSZXNpemVCaWxpbmVhckdyYWQgPSAnUmVzaXplQmlsaW5lYXJHcmFkJztcbmV4cG9ydCBjb25zdCBSZWx1NiA9ICdSZWx1Nic7XG5leHBvcnQgY29uc3QgUmV2ZXJzZSA9ICdSZXZlcnNlJztcbmV4cG9ydCBjb25zdCBSb3VuZCA9ICdSb3VuZCc7XG5leHBvcnQgY29uc3QgUnNxcnQgPSAnUnNxcnQnO1xuZXhwb3J0IGNvbnN0IFNjYXR0ZXJOZCA9ICdTY2F0dGVyTmQnO1xuZXhwb3J0IGNvbnN0IFNlbGVjdCA9ICdTZWxlY3QnO1xuZXhwb3J0IGNvbnN0IFNlbHUgPSAnU2VsdSc7XG5leHBvcnQgY29uc3QgU2xpY2UgPSAnU2xpY2UnO1xuZXhwb3J0IGNvbnN0IFNpbiA9ICdTaW4nO1xuZXhwb3J0IGNvbnN0IFNpbmggPSAnU2luaCc7XG5leHBvcnQgY29uc3QgU2lnbiA9ICdTaWduJztcbmV4cG9ydCBjb25zdCBTaWdtb2lkID0gJ1NpZ21vaWQnO1xuZXhwb3J0IGNvbnN0IFNvZnRwbHVzID0gJ1NvZnRwbHVzJztcbmV4cG9ydCBjb25zdCBTcXJ0ID0gJ1NxcnQnO1xuZXhwb3J0IGNvbnN0IFN1bSA9ICdTdW0nO1xuZXhwb3J0IGNvbnN0IFNwYWNlVG9CYXRjaE5EID0gJ1NwYWNlVG9CYXRjaE5EJztcbmV4cG9ydCBjb25zdCBTcGxpdFYgPSAnU3BsaXRWJztcbmV4cG9ydCBjb25zdCBTb2Z0bWF4ID0gJ1NvZnRtYXgnO1xuZXhwb3J0IGNvbnN0IFNwYXJzZUZpbGxFbXB0eVJvd3MgPSAnU3BhcnNlRmlsbEVtcHR5Um93cyc7XG5leHBvcnQgY29uc3QgU3BhcnNlUmVzaGFwZSA9ICdTcGFyc2VSZXNoYXBlJztcbmV4cG9ydCBjb25zdCBTcGFyc2VTZWdtZW50TWVhbiA9ICdTcGFyc2VTZWdtZW50TWVhbic7XG5leHBvcnQgY29uc3QgU3BhcnNlU2VnbWVudFN1bSA9ICdTcGFyc2VTZWdtZW50U3VtJztcbmV4cG9ydCBjb25zdCBTcGFyc2VUb0RlbnNlID0gJ1NwYXJzZVRvRGVuc2UnO1xuZXhwb3J0IGNvbnN0IFNxdWFyZWREaWZmZXJlbmNlID0gJ1NxdWFyZWREaWZmZXJlbmNlJztcbmV4cG9ydCBjb25zdCBTcXVhcmUgPSAnU3F1YXJlJztcbmV4cG9ydCBjb25zdCBTdHJpZGVkU2xpY2UgPSAnU3RyaWRlZFNsaWNlJztcbmV4cG9ydCBjb25zdCBTdHJpbmdOR3JhbXMgPSAnU3RyaW5nTkdyYW1zJztcbmV4cG9ydCBjb25zdCBTdHJpbmdTcGxpdCA9ICdTdHJpbmdTcGxpdCc7XG5leHBvcnQgY29uc3QgU3RyaW5nVG9IYXNoQnVja2V0RmFzdCA9ICdTdHJpbmdUb0hhc2hCdWNrZXRGYXN0JztcbmV4cG9ydCBjb25zdCBTdWIgPSAnU3ViJztcbmV4cG9ydCBjb25zdCBUYW4gPSAnVGFuJztcbmV4cG9ydCBjb25zdCBUYW5oID0gJ1RhbmgnO1xuZXhwb3J0IGNvbnN0IFRpbGUgPSAnVGlsZSc7XG5leHBvcnQgY29uc3QgVG9wSyA9ICdUb3BLJztcbmV4cG9ydCBjb25zdCBUcmFuc2Zvcm0gPSAnVHJhbnNmb3JtJztcbmV4cG9ydCBjb25zdCBUcmFuc3Bvc2UgPSAnVHJhbnNwb3NlJztcbmV4cG9ydCBjb25zdCBVbmlxdWUgPSAnVW5pcXVlJztcbmV4cG9ydCBjb25zdCBVbnBhY2sgPSAnVW5wYWNrJztcbmV4cG9ydCBjb25zdCBVbnNvcnRlZFNlZ21lbnRTdW0gPSAnVW5zb3J0ZWRTZWdtZW50U3VtJztcbmV4cG9ydCBjb25zdCBaZXJvc0xpa2UgPSAnWmVyb3NMaWtlJztcbi8qKlxuICogVGVuc29yRmxvdy5qcy1vbmx5IGtlcm5lbHNcbiAqL1xuZXhwb3J0IGNvbnN0IFN0ZXAgPSAnU3RlcCc7XG5leHBvcnQgY29uc3QgRnJvbVBpeGVscyA9ICdGcm9tUGl4ZWxzJztcbmV4cG9ydCBjb25zdCBSb3RhdGVXaXRoT2Zmc2V0ID0gJ1JvdGF0ZVdpdGhPZmZzZXQnO1xuZXhwb3J0IGNvbnN0IF9GdXNlZE1hdE11bCA9ICdfRnVzZWRNYXRNdWwnO1xuZXhwb3J0IGNvbnN0IEZ1c2VkQ29udjJEID0gJ0Z1c2VkQ29udjJEJztcbmV4cG9ydCBjb25zdCBGdXNlZERlcHRod2lzZUNvbnYyRCA9ICdGdXNlZERlcHRod2lzZUNvbnYyRCc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1rZXJuZWxfbmFtZXMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBnZXRHbG9iYWwgfSBmcm9tICcuL2dsb2JhbF91dGlsJztcbmNvbnN0IGtlcm5lbFJlZ2lzdHJ5ID0gZ2V0R2xvYmFsKCdrZXJuZWxSZWdpc3RyeScsICgpID0+IG5ldyBNYXAoKSk7XG5jb25zdCBncmFkUmVnaXN0cnkgPSBnZXRHbG9iYWwoJ2dyYWRSZWdpc3RyeScsICgpID0+IG5ldyBNYXAoKSk7XG4vKipcbiAqIFJldHVybnMgdGhlIGtlcm5lbCBmdW5jdGlvbiAoY29kZSkgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBuYW1lcy5cbiAqXG4gKiBAcGFyYW0ga2VybmVsTmFtZSBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUga2VybmVsLlxuICogQHBhcmFtIGJhY2tlbmROYW1lIFRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBiYWNrZW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0S2VybmVsKGtlcm5lbE5hbWUsIGJhY2tlbmROYW1lKSB7XG4gICAgY29uc3Qga2V5ID0gbWFrZUtleShrZXJuZWxOYW1lLCBiYWNrZW5kTmFtZSk7XG4gICAgcmV0dXJuIGtlcm5lbFJlZ2lzdHJ5LmdldChrZXkpO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSByZWdpc3RlcmVkIGdyYWRpZW50IGluZm8gYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBrZXJuZWwuXG4gKiBAcGFyYW0ga2VybmVsTmFtZSBUaGUgb2ZmaWNpYWwgVEYga2VybmVsIG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRHcmFkaWVudChrZXJuZWxOYW1lKSB7XG4gICAgcmV0dXJuIGdyYWRSZWdpc3RyeS5nZXQoa2VybmVsTmFtZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0S2VybmVsc0ZvckJhY2tlbmQoYmFja2VuZE5hbWUpIHtcbiAgICBjb25zdCBpdCA9IGtlcm5lbFJlZ2lzdHJ5LmVudHJpZXMoKTtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBpdC5uZXh0KCk7XG4gICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBba2V5LCBjb25maWddID0gdmFsdWU7XG4gICAgICAgIGNvbnN0IFtiYWNrZW5kLF0gPSBrZXkuc3BsaXQoJ18nKTtcbiAgICAgICAgaWYgKGJhY2tlbmQgPT09IGJhY2tlbmROYW1lKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChjb25maWcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIFJlZ2lzdGVycyB0aGUgZnVuY3Rpb24gKGZvcndhcmQgcGFzcykgZm9yIHRoZSBrZXJuZWwgaW4gYSBnbG9iYWwgcmVnaXN0cnkuXG4gKlxuICogQHBhcmFtIGNvbmZpZyBBIGNvbmZpZyBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAtIGBrZXJuZWxOYW1lYCBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUga2VybmVsLlxuICogLSBgYmFja2VuZE5hbWVgIFRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBiYWNrZW5kLlxuICogLSBga2VybmVsRnVuY2AgVGhlIGZ1bmN0aW9uIHRvIHJ1biBkdXJpbmcgdGhlIGZvcndhcmQgcGFzcyBvZiB0aGUga2VybmVsLlxuICogLSBgc2V0dXBGdW5jYCBPcHRpb25hbC4gR2V0cyBjYWxsZWQgb25jZSwgYWZ0ZXIgdGhlIGJhY2tlbmQgaW5pdGlhbGl6ZXMuXG4gKiAtIGBkaXNwb3NlRnVuY2AgT3B0aW9uYWwuIEdldHMgY2FsbGVkIG9uY2UsIHJpZ2h0IGJlZm9yZSB0aGUgYmFja2VuZCBpc1xuICogZGlzcG9zZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3Rlcktlcm5lbChjb25maWcpIHtcbiAgICBjb25zdCB7IGtlcm5lbE5hbWUsIGJhY2tlbmROYW1lIH0gPSBjb25maWc7XG4gICAgY29uc3Qga2V5ID0gbWFrZUtleShrZXJuZWxOYW1lLCBiYWNrZW5kTmFtZSk7XG4gICAgaWYgKGtlcm5lbFJlZ2lzdHJ5LmhhcyhrZXkpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgVGhlIGtlcm5lbCAnJHtrZXJuZWxOYW1lfScgZm9yIGJhY2tlbmQgYCArXG4gICAgICAgICAgICBgJyR7YmFja2VuZE5hbWV9JyBpcyBhbHJlYWR5IHJlZ2lzdGVyZWRgKTtcbiAgICB9XG4gICAga2VybmVsUmVnaXN0cnkuc2V0KGtleSwgY29uZmlnKTtcbn1cbi8qKlxuICogUmVnaXN0ZXJzIGEgZ3JhZGllbnQgZnVuY3Rpb24gZm9yIGEgZ2l2ZW4ga2VybmVsIGluIHRoZSBnbG9iYWwgcmVnaXN0cnksXG4gKiB0byBiZSB1c2VkIGR1cmluZyB0aGUgYmFjay1wcm9wYWdhdGlvbiBvZiB0aGF0IGtlcm5lbC5cbiAqXG4gKiBAcGFyYW0gY29uZmlnIEFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqIC0gYGtlcm5lbE5hbWVgIFRoZSBuYW1lIG9mIHRoZSBrZXJuZWwgdGhhdCB0aGUgZ3JhZGllbnQgZnVuY3Rpb24gaXMgZm9yLlxuICogLSBgZ3JhZEZ1bmNgIFRoZSBmdW5jdGlvbiB0byBydW4gZHVyaW5nIGJhY2stcHJvcGFnYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckdyYWRpZW50KGNvbmZpZykge1xuICAgIGNvbnN0IHsga2VybmVsTmFtZSB9ID0gY29uZmlnO1xuICAgIGlmIChncmFkUmVnaXN0cnkuaGFzKGtlcm5lbE5hbWUpKSB7XG4gICAgICAgIC8vIFRPRE8gKHlhc3NvZ2JhKSBhZnRlciAzLjAgYXNzZXNzIHdoZXRoZXIgd2UgbmVlZCB0byBrZWVwIHRoaXMgZ2F0ZWRcbiAgICAgICAgLy8gdG8gZGVidWcgbW9kZS5cbiAgICAgICAgaWYgKGVudigpLmdldEJvb2woJ0RFQlVHJykpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgT3ZlcnJpZGluZyB0aGUgZ3JhZGllbnQgZm9yICcke2tlcm5lbE5hbWV9J2ApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdyYWRSZWdpc3RyeS5zZXQoa2VybmVsTmFtZSwgY29uZmlnKTtcbn1cbi8qKlxuICogUmVtb3ZlcyB0aGUga2VybmVsIGZ1bmN0aW9uIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICpcbiAqIEBwYXJhbSBrZXJuZWxOYW1lIFRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBrZXJuZWwuXG4gKiBAcGFyYW0gYmFja2VuZE5hbWUgVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGJhY2tlbmQuXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5yZWdpc3Rlcktlcm5lbChrZXJuZWxOYW1lLCBiYWNrZW5kTmFtZSkge1xuICAgIGNvbnN0IGtleSA9IG1ha2VLZXkoa2VybmVsTmFtZSwgYmFja2VuZE5hbWUpO1xuICAgIGlmICgha2VybmVsUmVnaXN0cnkuaGFzKGtleSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUga2VybmVsICcke2tlcm5lbE5hbWV9JyBmb3IgYmFja2VuZCBgICtcbiAgICAgICAgICAgIGAnJHtiYWNrZW5kTmFtZX0nIGlzIG5vdCByZWdpc3RlcmVkYCk7XG4gICAgfVxuICAgIGtlcm5lbFJlZ2lzdHJ5LmRlbGV0ZShrZXkpO1xufVxuLyoqIFJlbW92ZXMgdGhlIHJlZ2lzdGVyZWQgZ3JhZGllbnQgZnJvbSB0aGUgZ2xvYmFsIHJlZ2lzdHJ5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVucmVnaXN0ZXJHcmFkaWVudChrZXJuZWxOYW1lKSB7XG4gICAgaWYgKCFncmFkUmVnaXN0cnkuaGFzKGtlcm5lbE5hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGdyYWRpZW50ICcke2tlcm5lbE5hbWV9JyBmb3IgYmFja2VuZCBpcyBub3QgcmVnaXN0ZXJlZGApO1xuICAgIH1cbiAgICBncmFkUmVnaXN0cnkuZGVsZXRlKGtlcm5lbE5hbWUpO1xufVxuLyoqXG4gKiBGaW5kcyBrZXJuZWxzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCB0byBhIGJhY2tlbmQgYW5kIHJlLXJlZ2lzdGVyc1xuICogdGhlbSBmb3IgYSBuZXcgYmFja2VuZC4gVXNlZnVsIGZvciByZWdpc3RlcmluZyBjdXN0b20gYmFja2VuZHMuXG4gKiBAcGFyYW0gcmVnaXN0ZXJlZEJhY2tlbmROYW1lIEFscmVhZHkgcmVnaXN0ZXJlZCBiYWNrZW5kLlxuICogQHBhcmFtIG5ld0JhY2tlbmROYW1lIE5ldyBiYWNrZW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29weVJlZ2lzdGVyZWRLZXJuZWxzKHJlZ2lzdGVyZWRCYWNrZW5kTmFtZSwgbmV3QmFja2VuZE5hbWUpIHtcbiAgICBjb25zdCBrZXJuZWxzID0gZ2V0S2VybmVsc0ZvckJhY2tlbmQocmVnaXN0ZXJlZEJhY2tlbmROYW1lKTtcbiAgICBrZXJuZWxzLmZvckVhY2goa2VybmVsQ29uZmlnID0+IHtcbiAgICAgICAgY29uc3QgbmV3S2VybmVsQ29uZmlnID0gT2JqZWN0LmFzc2lnbih7fSwga2VybmVsQ29uZmlnLCB7IGJhY2tlbmROYW1lOiBuZXdCYWNrZW5kTmFtZSB9KTtcbiAgICAgICAgcmVnaXN0ZXJLZXJuZWwobmV3S2VybmVsQ29uZmlnKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIG1ha2VLZXkoa2VybmVsTmFtZSwgYmFja2VuZE5hbWUpIHtcbiAgICByZXR1cm4gYCR7YmFja2VuZE5hbWV9XyR7a2VybmVsTmFtZX1gO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9a2VybmVsX3JlZ2lzdHJ5LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGVudiB9IGZyb20gJy4vZW52aXJvbm1lbnQnO1xuZXhwb3J0IGZ1bmN0aW9uIHdhcm4oLi4ubXNnKSB7XG4gICAgaWYgKCFlbnYoKS5nZXRCb29sKCdJU19URVNUJykpIHtcbiAgICAgICAgY29uc29sZS53YXJuKC4uLm1zZyk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGxvZyguLi5tc2cpIHtcbiAgICBpZiAoIWVudigpLmdldEJvb2woJ0lTX1RFU1QnKSkge1xuICAgICAgICBjb25zb2xlLmxvZyguLi5tc2cpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxvZy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vKipcbiAqIEV4cG9ydHMgdW5kZXIgdGhlIHRmLm1hdGguKiBuYW1lc3BhY2UuXG4gKi9cbmltcG9ydCB7IGNvbmZ1c2lvbk1hdHJpeCB9IGZyb20gJy4vb3BzL2NvbmZ1c2lvbl9tYXRyaXgnO1xuZXhwb3J0IHsgY29uZnVzaW9uTWF0cml4IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tYXRoLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBBYnMsIENvbXBsZXhBYnMgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBhYnNvbHV0ZSB2YWx1ZSBlbGVtZW50LXdpc2U6IGBhYnMoeClgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbLTEsIDIsIC0zLCA0XSk7XG4gKlxuICogeC5hYnMoKS5wcmludCgpOyAgLy8gb3IgdGYuYWJzKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBgdGYuVGVuc29yYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gYWJzXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnYWJzJyk7XG4gICAgaWYgKCR4LmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKENvbXBsZXhBYnMsIGlucHV0cyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEFicywgaW5wdXRzKTtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgYWJzID0gb3AoeyBhYnNfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWJzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBBY29zIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgYWNvcyBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOiBgYWNvcyh4KWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFswLCAxLCAtMSwgLjddKTtcbiAqXG4gKiB4LmFjb3MoKS5wcmludCgpOyAgLy8gb3IgdGYuYWNvcyh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGFjb3NfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdhY29zJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEFjb3MsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgYWNvcyA9IG9wKHsgYWNvc18gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hY29zLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBBY29zaCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBpbnZlcnNlIGh5cGVyYm9saWMgY29zIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6XG4gKiBgYWNvc2goeClgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMTAsIDEsIDMsIDUuN10pO1xuICpcbiAqIHguYWNvc2goKS5wcmludCgpOyAgLy8gb3IgdGYuYWNvc2goeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gYWNvc2hfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdhY29zaCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChBY29zaCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBhY29zaCA9IG9wKHsgYWNvc2hfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWNvc2guanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEFkZCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBtYWtlVHlwZXNNYXRjaCB9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQWRkcyB0d28gYHRmLlRlbnNvcmBzIGVsZW1lbnQtd2lzZSwgQSArIEIuIFN1cHBvcnRzIGJyb2FkY2FzdGluZy5cbiAqXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMiwgMywgNF0pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFsxMCwgMjAsIDMwLCA0MF0pO1xuICpcbiAqIGEuYWRkKGIpLnByaW50KCk7ICAvLyBvciB0Zi5hZGQoYSwgYilcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBCcm9hZGNhc3QgYWRkIGEgd2l0aCBiLlxuICogY29uc3QgYSA9IHRmLnNjYWxhcig1KTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbMTAsIDIwLCAzMCwgNDBdKTtcbiAqXG4gKiBhLmFkZChiKS5wcmludCgpOyAgLy8gb3IgdGYuYWRkKGEsIGIpXG4gKiBgYGBcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBgdGYuVGVuc29yYCB0byBhZGQuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIGB0Zi5UZW5zb3JgIHRvIGFkZC4gTXVzdCBoYXZlIHRoZSBzYW1lIHR5cGUgYXMgYGFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0FyaXRobWV0aWMnfVxuICovXG5mdW5jdGlvbiBhZGRfKGEsIGIpIHtcbiAgICBsZXQgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnYWRkJyk7XG4gICAgbGV0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ2FkZCcpO1xuICAgIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGE6ICRhLCBiOiAkYiB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEFkZCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBhZGQgPSBvcCh7IGFkZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hZGQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEFkZE4gfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQWRkcyBhIGxpc3Qgb2YgYHRmLlRlbnNvcmBzIGVsZW1lbnQtd2lzZSwgZWFjaCB3aXRoIHRoZSBzYW1lIHNoYXBlIGFuZCBkdHlwZS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCAyXSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzMsIDRdKTtcbiAqIGNvbnN0IGMgPSB0Zi50ZW5zb3IxZChbNSwgNl0pO1xuICpcbiAqIHRmLmFkZE4oW2EsIGIsIGNdKS5wcmludCgpO1xuICogYGBgXG4gKiBAcGFyYW0gdGVuc29ycyBBIGxpc3Qgb2YgdGVuc29ycyB3aXRoIHRoZSBzYW1lIHNoYXBlIGFuZCBkdHlwZS5cbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0FyaXRobWV0aWMnfVxuICovXG5mdW5jdGlvbiBhZGROXyh0ZW5zb3JzKSB7XG4gICAgdXRpbC5hc3NlcnQoQXJyYXkuaXNBcnJheSh0ZW5zb3JzKSwgKCkgPT4gJ1RoZSBhcmd1bWVudCBwYXNzZWQgdG8gdGYuYWRkTigpIG11c3QgYmUgYSBsaXN0IG9mIHRlbnNvcnMnKTtcbiAgICB1dGlsLmFzc2VydCh0ZW5zb3JzLmxlbmd0aCA+PSAxLCAoKSA9PiBgTXVzdCBwYXNzIGF0IGxlYXN0IG9uZSB0ZW5zb3IgdG8gdGYuYWRkTigpLCBidXQgZ290IGAgK1xuICAgICAgICBgJHt0ZW5zb3JzLmxlbmd0aH1gKTtcbiAgICBjb25zdCAkdGVuc29ycyA9IHRlbnNvcnMubWFwKCh0LCBpKSA9PiBjb252ZXJ0VG9UZW5zb3IodCwgYHRlbnNvcnMke2l9YCwgJ2FkZE4nKSk7XG4gICAgY29uc3QgZmlyc3RUZW5zb3IgPSAkdGVuc29yc1swXTtcbiAgICAkdGVuc29ycy5mb3JFYWNoKHQgPT4ge1xuICAgICAgICBpZiAodC5kdHlwZSAhPT0gZmlyc3RUZW5zb3IuZHR5cGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQWxsIHRlbnNvcnMgcGFzc2VkIHRvIHRmLmFkZE4oKSBtdXN0IGhhdmUgdGhlIHNhbWUgZHR5cGUnKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgICR0ZW5zb3JzLmZvckVhY2godCA9PiB7XG4gICAgICAgIGlmICghdXRpbC5hcnJheXNFcXVhbCh0LnNoYXBlLCBmaXJzdFRlbnNvci5zaGFwZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQWxsIHRlbnNvcnMgcGFzc2VkIHRvIHRmLmFkZE4oKSBtdXN0IGhhdmUgdGhlIHNhbWUgc2hhcGUnKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGlucHV0cyA9ICR0ZW5zb3JzO1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEFkZE4sIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgYWRkTiA9IG9wKHsgYWRkTl8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hZGRfbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgQWxsIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIGxvZ2ljYWwgYW5kIG9mIGVsZW1lbnRzIGFjcm9zcyBkaW1lbnNpb25zIG9mIGEgYHRmLlRlbnNvcmAuXG4gKlxuICogUmVkdWNlcyB0aGUgaW5wdXQgYWxvbmcgdGhlIGRpbWVuc2lvbnMgZ2l2ZW4gaW4gYGF4ZXNgLiBVbmxlc3MgYGtlZXBEaW1zYFxuICogaXMgdHJ1ZSwgdGhlIHJhbmsgb2YgdGhlIGB0Zi5UZW5zb3JgIGlzIHJlZHVjZWQgYnkgMSBmb3IgZWFjaCBlbnRyeSBpblxuICogYGF4ZXNgLiBJZiBga2VlcERpbXNgIGlzIHRydWUsIHRoZSByZWR1Y2VkIGRpbWVuc2lvbnMgYXJlIHJldGFpbmVkIHdpdGhcbiAqIGxlbmd0aCAxLiBJZiBgYXhlc2AgaGFzIG5vIGVudHJpZXMsIGFsbCBkaW1lbnNpb25zIGFyZSByZWR1Y2VkLCBhbmQgYW5cbiAqIGB0Zi5UZW5zb3JgIHdpdGggYSBzaW5nbGUgZWxlbWVudCBpcyByZXR1cm5lZC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAxLCAxXSwgJ2Jvb2wnKTtcbiAqXG4gKiB4LmFsbCgpLnByaW50KCk7ICAvLyBvciB0Zi5hbGwoeClcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDEsIDAsIDBdLCBbMiwgMl0sICdib29sJyk7XG4gKlxuICogY29uc3QgYXhpcyA9IDE7XG4gKiB4LmFsbChheGlzKS5wcmludCgpOyAgLy8gb3IgdGYuYWxsKHgsIGF4aXMpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLiBNdXN0IGJlIG9mIGR0eXBlIGJvb2wuXG4gKiBAcGFyYW0gYXhpcyBUaGUgZGltZW5zaW9uKHMpIHRvIHJlZHVjZS4gQnkgZGVmYXVsdCBpdCByZWR1Y2VzXG4gKiAgICAgYWxsIGRpbWVuc2lvbnMuXG4gKiBAcGFyYW0ga2VlcERpbXMgSWYgdHJ1ZSwgcmV0YWlucyByZWR1Y2VkIGRpbWVuc2lvbnMgd2l0aCBzaXplIDEuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnUmVkdWN0aW9uJ31cbiAqL1xuZnVuY3Rpb24gYWxsXyh4LCBheGlzID0gbnVsbCwga2VlcERpbXMgPSBmYWxzZSkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2FsbCcsICdib29sJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBheGlzLCBrZWVwRGltcyB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEFsbCwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgYWxsID0gb3AoeyBhbGxfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWxsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBBbnkgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgbG9naWNhbCBvciBvZiBlbGVtZW50cyBhY3Jvc3MgZGltZW5zaW9ucyBvZiBhIGB0Zi5UZW5zb3JgLlxuICpcbiAqIFJlZHVjZXMgdGhlIGlucHV0IGFsb25nIHRoZSBkaW1lbnNpb25zIGdpdmVuIGluIGBheGVzYC4gVW5sZXNzIGBrZWVwRGltc2BcbiAqIGlzIHRydWUsIHRoZSByYW5rIG9mIHRoZSBgdGYuVGVuc29yYCBpcyByZWR1Y2VkIGJ5IDEgZm9yIGVhY2ggZW50cnkgaW5cbiAqIGBheGVzYC4gSWYgYGtlZXBEaW1zYCBpcyB0cnVlLCB0aGUgcmVkdWNlZCBkaW1lbnNpb25zIGFyZSByZXRhaW5lZCB3aXRoXG4gKiBsZW5ndGggMS4gSWYgYGF4ZXNgIGhhcyBubyBlbnRyaWVzLCBhbGwgZGltZW5zaW9ucyBhcmUgcmVkdWNlZCwgYW5kIGFuXG4gKiBgdGYuVGVuc29yYCB3aXRoIGEgc2luZ2xlIGVsZW1lbnQgaXMgcmV0dXJuZWQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMSwgMV0sICdib29sJyk7XG4gKlxuICogeC5hbnkoKS5wcmludCgpOyAgLy8gb3IgdGYuYW55KHgpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjJkKFsxLCAxLCAwLCAwXSwgWzIsIDJdLCAnYm9vbCcpO1xuICpcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5hbnkoYXhpcykucHJpbnQoKTsgIC8vIG9yIHRmLmFueSh4LCBheGlzKVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci4gTXVzdCBiZSBvZiBkdHlwZSBib29sLlxuICogQHBhcmFtIGF4aXMgVGhlIGRpbWVuc2lvbihzKSB0byByZWR1Y2UuIEJ5IGRlZmF1bHQgaXQgcmVkdWNlc1xuICogICAgIGFsbCBkaW1lbnNpb25zLlxuICogQHBhcmFtIGtlZXBEaW1zIElmIHRydWUsIHJldGFpbnMgcmVkdWNlZCBkaW1lbnNpb25zIHdpdGggc2l6ZSAxLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1JlZHVjdGlvbid9XG4gKi9cbmZ1bmN0aW9uIGFueV8oeCwgYXhpcyA9IG51bGwsIGtlZXBEaW1zID0gZmFsc2UpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdhbnknLCAnYm9vbCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICBjb25zdCBhdHRycyA9IHsgYXhpcywga2VlcERpbXMgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChBbnksIGlucHV0cywgYXR0cnMpO1xufVxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWVcbmV4cG9ydCBjb25zdCBhbnkgPSBvcCh7IGFueV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hbnkuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEFyZ01heCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIFJldHVybnMgdGhlIGluZGljZXMgb2YgdGhlIG1heGltdW0gdmFsdWVzIGFsb25nIGFuIGBheGlzYC5cbiAqXG4gKiBUaGUgcmVzdWx0IGhhcyB0aGUgc2FtZSBzaGFwZSBhcyBgaW5wdXRgIHdpdGggdGhlIGRpbWVuc2lvbiBhbG9uZyBgYXhpc2BcbiAqIHJlbW92ZWQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICpcbiAqIHguYXJnTWF4KCkucHJpbnQoKTsgIC8vIG9yIHRmLmFyZ01heCh4KVxuICogYGBgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IyZChbMSwgMiwgNCwgM10sIFsyLCAyXSk7XG4gKlxuICogY29uc3QgYXhpcyA9IDE7XG4gKiB4LmFyZ01heChheGlzKS5wcmludCgpOyAgLy8gb3IgdGYuYXJnTWF4KHgsIGF4aXMpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICogQHBhcmFtIGF4aXMgVGhlIGRpbWVuc2lvbiB0byByZWR1Y2UuIERlZmF1bHRzIHRvIDAgKG91dGVyLW1vc3QgZGltZW5zaW9uKS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdSZWR1Y3Rpb24nfVxuICovXG5mdW5jdGlvbiBhcmdNYXhfKHgsIGF4aXMgPSAwKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnYXJnTWF4Jyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBheGlzIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoQXJnTWF4LCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBhcmdNYXggPSBvcCh7IGFyZ01heF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hcmdfbWF4LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBBcmdNaW4gfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbmRpY2VzIG9mIHRoZSBtaW5pbXVtIHZhbHVlcyBhbG9uZyBhbiBgYXhpc2AuXG4gKlxuICogVGhlIHJlc3VsdCBoYXMgdGhlIHNhbWUgc2hhcGUgYXMgYGlucHV0YCB3aXRoIHRoZSBkaW1lbnNpb24gYWxvbmcgYGF4aXNgXG4gKiByZW1vdmVkLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqXG4gKiB4LmFyZ01pbigpLnByaW50KCk7ICAvLyBvciB0Zi5hcmdNaW4oeClcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDQsIDNdLCBbMiwgMl0pO1xuICpcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5hcmdNaW4oYXhpcykucHJpbnQoKTsgIC8vIG9yIHRmLmFyZ01pbih4LCBheGlzKVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBheGlzIFRoZSBkaW1lbnNpb24gdG8gcmVkdWNlLiBEZWZhdWx0cyB0byAwIChvdXRlci1tb3N0IGRpbWVuc2lvbikuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnUmVkdWN0aW9uJ31cbiAqL1xuZnVuY3Rpb24gYXJnTWluXyh4LCBheGlzID0gMCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2FyZ01pbicpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICBjb25zdCBhdHRycyA9IHsgYXhpcyB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEFyZ01pbiwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgYXJnTWluID0gb3AoeyBhcmdNaW5fIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXJnX21pbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vKipcbiAqIEdldHMgdGhlIG5ldyBzaGFwZSBvZiB0aGUgaW5wdXQgVGVuc29yIGFmdGVyIGl0J3MgYmVlbiByZXNoYXBlZFxuICogdG86XG4gKiBbYmxvY2tTaGFwZVswXSwgLi4uLCBibG9ja1NoYXBlW00tMV0sIGJhdGNoIC8gcHJvZChibG9ja1NoYXBlKSxcbiAqIGlucHV0U2hhcGVbMV0sIC4uLiwgaW5wdXRTaGFwZVtOLTFdXVxuICpcbiAqIFNlZSBzdGVwIDE6IGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9iYXRjaF90b19zcGFjZV9uZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVzaGFwZWQoaW5wdXRTaGFwZSwgYmxvY2tTaGFwZSwgcHJvZCwgYmF0Y2hUb1NwYWNlID0gdHJ1ZSkge1xuICAgIGxldCByZXNoYXBlZCA9IFtdO1xuICAgIGlmIChiYXRjaFRvU3BhY2UpIHtcbiAgICAgICAgcmVzaGFwZWQgPSByZXNoYXBlZC5jb25jYXQoYmxvY2tTaGFwZS5zbGljZSgwKSk7XG4gICAgICAgIHJlc2hhcGVkLnB1c2goaW5wdXRTaGFwZVswXSAvIHByb2QpO1xuICAgICAgICByZXNoYXBlZCA9IHJlc2hhcGVkLmNvbmNhdChpbnB1dFNoYXBlLnNsaWNlKDEpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlc2hhcGVkID0gcmVzaGFwZWQuY29uY2F0KGlucHV0U2hhcGVbMF0pO1xuICAgICAgICBjb25zdCBzcGF0aWFsTGVuZ3RoID0gYmxvY2tTaGFwZS5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BhdGlhbExlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICByZXNoYXBlZCA9XG4gICAgICAgICAgICAgICAgcmVzaGFwZWQuY29uY2F0KFtpbnB1dFNoYXBlW2kgKyAxXSAvIGJsb2NrU2hhcGVbaV0sIGJsb2NrU2hhcGVbaV1dKTtcbiAgICAgICAgfVxuICAgICAgICByZXNoYXBlZCA9IHJlc2hhcGVkLmNvbmNhdChpbnB1dFNoYXBlLnNsaWNlKHNwYXRpYWxMZW5ndGggKyAxKSk7XG4gICAgfVxuICAgIHJldHVybiByZXNoYXBlZDtcbn1cbi8qKlxuICogR2V0cyB0aGUgcGVybXV0YXRpb24gdGhhdCB3aWxsIHRyYW5zcG9zZSB0aGUgZGltZW5zaW9ucyBvZiB0aGVcbiAqIHJlc2hhcGVkIHRlbnNvciB0byBzaGFwZTpcbiAqXG4gKiBbYmF0Y2ggLyBwcm9kKGJsb2NrX3NoYXBlKSxpbnB1dFNoYXBlWzFdLCBibG9ja1NoYXBlWzBdLCAuLi4sXG4gKiBpbnB1dFNoYXBlW01dLCBibG9ja1NoYXBlW00tMV0saW5wdXRTaGFwZVtNKzFdLCAuLi4sIGlucHV0U2hhcGVbTi0xXV1cbiAqXG4gKiBzZWUgc3RlcCAyOiBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvYmF0Y2hfdG9fc3BhY2VfbmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBlcm11dGVkKHJlc2hhcGVkUmFuaywgYmxvY2tTaGFwZVJhbmssIGJhdGNoVG9TcGFjZSA9IHRydWUpIHtcbiAgICBjb25zdCBwZXJtdXRlZCA9IFtdO1xuICAgIGlmIChiYXRjaFRvU3BhY2UpIHtcbiAgICAgICAgcGVybXV0ZWQucHVzaChibG9ja1NoYXBlUmFuayk7XG4gICAgICAgIGZvciAobGV0IGkgPSBibG9ja1NoYXBlUmFuayArIDE7IGkgPCByZXNoYXBlZFJhbms7ICsraSkge1xuICAgICAgICAgICAgaWYgKGkgPD0gMiAqIGJsb2NrU2hhcGVSYW5rKSB7XG4gICAgICAgICAgICAgICAgcGVybXV0ZWQucHVzaChpKTtcbiAgICAgICAgICAgICAgICBwZXJtdXRlZC5wdXNoKGkgLSAoYmxvY2tTaGFwZVJhbmsgKyAxKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZXJtdXRlZC5wdXNoKGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBwZXJtdXRlZEJlZm9yZUJhdGNoID0gW107XG4gICAgICAgIGNvbnN0IHBlcm11dGVkQWZ0ZXJCYXRjaCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHJlc2hhcGVkUmFuazsgKytpKSB7XG4gICAgICAgICAgICBpZiAoaSA+PSBibG9ja1NoYXBlUmFuayAqIDIgKyAxIHx8IGkgJSAyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcGVybXV0ZWRBZnRlckJhdGNoLnB1c2goaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZXJtdXRlZEJlZm9yZUJhdGNoLnB1c2goaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcGVybXV0ZWQucHVzaCguLi5wZXJtdXRlZEJlZm9yZUJhdGNoKTtcbiAgICAgICAgcGVybXV0ZWQucHVzaCgwKTtcbiAgICAgICAgcGVybXV0ZWQucHVzaCguLi5wZXJtdXRlZEFmdGVyQmF0Y2gpO1xuICAgIH1cbiAgICByZXR1cm4gcGVybXV0ZWQ7XG59XG4vKipcbiAqIEdldHMgdGhlIHNoYXBlIG9mIHRoZSByZXNoYXBlZCBhbmQgcGVybXV0ZWQgaW5wdXQgVGVuc29yIGJlZm9yZSBhbnkgY3JvcHBpbmdcbiAqIGlzIGFwcGxpZWQuICBUaGUgbmV3IHNoYXBlIHdpbGwgYmU6XG4gKlxuICogW2JhdGNoIC8gcHJvZChibG9ja1NoYXBlKSxpbnB1dFNoYXBlWzFdICogYmxvY2tTaGFwZVswXSwgLi4uLFxuICogaW5wdXRTaGFwZVtNXSAqIGJsb2NrU2hhcGVbTS0xXSxpbnB1dFNoYXBlW00rMV0sIC4uLiwgaW5wdXRTaGFwZVtOLTFdXVxuICpcbiAqIFNlZSBzdGVwIDM6IGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9iYXRjaF90b19zcGFjZV9uZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVzaGFwZWRQZXJtdXRlZChpbnB1dFNoYXBlLCBibG9ja1NoYXBlLCBwcm9kLCBiYXRjaFRvU3BhY2UgPSB0cnVlKSB7XG4gICAgY29uc3QgcmVzaGFwZWRQZXJtdXRlZCA9IFtdO1xuICAgIGlmIChiYXRjaFRvU3BhY2UpIHtcbiAgICAgICAgcmVzaGFwZWRQZXJtdXRlZC5wdXNoKGlucHV0U2hhcGVbMF0gLyBwcm9kKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlc2hhcGVkUGVybXV0ZWQucHVzaChpbnB1dFNoYXBlWzBdICogcHJvZCk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgaW5wdXRTaGFwZS5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAoaSA8PSBibG9ja1NoYXBlLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGJhdGNoVG9TcGFjZSkge1xuICAgICAgICAgICAgICAgIHJlc2hhcGVkUGVybXV0ZWQucHVzaChibG9ja1NoYXBlW2kgLSAxXSAqIGlucHV0U2hhcGVbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzaGFwZWRQZXJtdXRlZC5wdXNoKGlucHV0U2hhcGVbaV0gLyBibG9ja1NoYXBlW2kgLSAxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXNoYXBlZFBlcm11dGVkLnB1c2goaW5wdXRTaGFwZVtpXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc2hhcGVkUGVybXV0ZWQ7XG59XG4vKipcbiAqIENvbnZlcnRzIHRoZSBjcm9wcyBhcmd1bWVudCBpbnRvIHRoZSBiZWdpbm5pbmcgY29vcmRpbmF0ZXMgb2YgYSBzbGljZVxuICogb3BlcmF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2xpY2VCZWdpbkNvb3Jkcyhjcm9wcywgYmxvY2tTaGFwZSkge1xuICAgIGNvbnN0IHNsaWNlQmVnaW5Db29yZHMgPSBbMF07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBibG9ja1NoYXBlOyArK2kpIHtcbiAgICAgICAgc2xpY2VCZWdpbkNvb3Jkcy5wdXNoKGNyb3BzW2ldWzBdKTtcbiAgICB9XG4gICAgcmV0dXJuIHNsaWNlQmVnaW5Db29yZHM7XG59XG4vKipcbiAqIENvbnZlcnRzIHRoZSBjcm9wcyBhcmd1bWVudCBpbnRvIHRoZSBzaXplIG9mIGEgc2xpY2Ugb3BlcmF0aW9uLiAgV2hlblxuICogY29tYmluZWQgd2l0aCBnZXRTbGljZUJlZ2luQ29vcmRzIHRoaXMgZnVuY3Rpb24gYWxsb3dzIHRoZSByZXNoYXBlZCBhbmRcbiAqIHBlcm11dGVkIFRlbnNvciB0byBiZSBjcm9wcGVkIHRvIGl0cyBmaW5hbCBvdXRwdXQgc2hhcGUgb2Y6XG4gKlxuICogaW5wdXRTaGFwZVsxXSAqIGJsb2NrU2hhcGVbMF0gLSBjcm9wc1swLDBdIC0gY3JvcHNbMCwxXSwgLi4uLFxuICogaW5wdXRTaGFwZVtNXSAqIGJsb2NrU2hhcGVbTS0xXSAtY3JvcHNbTS0xLDBdIC1cbiAqIGNyb3BzW00tMSwxXSxpbnB1dFNoYXBlW00rMV0sIC4uLiwgaW5wdXRTaGFwZVtOLTFdXVxuICpcbiAqIFNlZSBzdGVwIDQ6IGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9iYXRjaF90b19zcGFjZV9uZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2xpY2VTaXplKHVuY3JvcHBlZFNoYXBlLCBjcm9wcywgYmxvY2tTaGFwZSkge1xuICAgIGNvbnN0IHNsaWNlU2l6ZSA9IHVuY3JvcHBlZFNoYXBlLnNsaWNlKDAsIDEpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmxvY2tTaGFwZTsgKytpKSB7XG4gICAgICAgIHNsaWNlU2l6ZS5wdXNoKHVuY3JvcHBlZFNoYXBlW2kgKyAxXSAtIGNyb3BzW2ldWzBdIC0gY3JvcHNbaV1bMV0pO1xuICAgIH1cbiAgICByZXR1cm4gc2xpY2VTaXplO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXJyYXlfb3BzX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEFzaW4gfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBhc2luIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6IGBhc2luKHgpYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzAsIDEsIC0xLCAuN10pO1xuICpcbiAqIHguYXNpbigpLnByaW50KCk7ICAvLyBvciB0Zi5hc2luKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gYXNpbl8oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2FzaW4nKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoQXNpbiwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBhc2luID0gb3AoeyBhc2luXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFzaW4uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEFzaW5oIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgaW52ZXJzZSBoeXBlcmJvbGljIHNpbiBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOlxuICogYGFzaW5oKHgpYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzAsIDEsIC0xLCAuN10pO1xuICpcbiAqIHguYXNpbmgoKS5wcmludCgpOyAgLy8gb3IgdGYuYXNpbmgoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gYXNpbmhfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdhc2luaCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChBc2luaCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBhc2luaCA9IG9wKHsgYXNpbmhfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXNpbmguanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEF0YW4gfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBhdGFuIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6IGBhdGFuKHgpYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzAsIDEsIC0xLCAuN10pO1xuICpcbiAqIHguYXRhbigpLnByaW50KCk7ICAvLyBvciB0Zi5hdGFuKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGF0YW5fKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdhdGFuJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEF0YW4sIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgYXRhbiA9IG9wKHsgYXRhbl8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hdGFuLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBBdGFuMiB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBtYWtlVHlwZXNNYXRjaCB9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgYXJjdGFuZ2VudCBvZiBgdGYuVGVuc29yYHMgYSAvIGIgZWxlbWVudC13aXNlOiBgYXRhbjIoYSwgYilgLlxuICogU3VwcG9ydHMgYnJvYWRjYXN0aW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEuMCwgMS4wLCAtMS4wLCAuN10pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFsyLjAsIDEzLjAsIDMuNSwgLjIxXSk7XG4gKlxuICogdGYuYXRhbjIoYSwgYikucHJpbnQoKVxuICogYGBgXG4gKlxuICogQHBhcmFtIGEgVGhlIGZpcnN0IHRlbnNvci5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgdGVuc29yLiBNdXN0IGhhdmUgdGhlIHNhbWUgZHR5cGUgYXMgYGFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBhdGFuMl8oYSwgYikge1xuICAgIGxldCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdhdGFuMicpO1xuICAgIGxldCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdhdGFuMicpO1xuICAgIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGE6ICRhLCBiOiAkYiB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEF0YW4yLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGF0YW4yID0gb3AoeyBhdGFuMl8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hdGFuMi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgQXRhbmggfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBpbnZlcnNlIGh5cGVyYm9saWMgdGFuIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6XG4gKiBgYXRhbmgoeClgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMCwgLjEsIC0uMSwgLjddKTtcbiAqXG4gKiB4LmF0YW5oKCkucHJpbnQoKTsgIC8vIG9yIHRmLmF0YW5oKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGF0YW5oXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnYXRhbmgnKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoQXRhbmgsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgYXRhbmggPSBvcCh7IGF0YW5oXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWF0YW5oLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBBdmdQb29sIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgY2FzdCB9IGZyb20gJy4vY2FzdCc7XG5pbXBvcnQgKiBhcyBjb252X3V0aWwgZnJvbSAnLi9jb252X3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIDJEIGF2ZXJhZ2UgcG9vbGluZyBvZiBhbiBpbWFnZS5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDQgb3IgcmFuayAzIG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgaW5DaGFubmVsc11gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXJTaXplIFRoZSBmaWx0ZXIgc2l6ZTogYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoXWAuIElmXG4gKiAgICAgYGZpbHRlclNpemVgIGlzIGEgc2luZ2xlIG51bWJlciwgdGhlbiBgZmlsdGVySGVpZ2h0ID09IGZpbHRlcldpZHRoYC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBwb29saW5nOiBgW3N0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGhdYC4gSWZcbiAqICAgICBgc3RyaWRlc2AgaXMgYSBzaW5nbGUgbnVtYmVyLCB0aGVuIGBzdHJpZGVIZWlnaHQgPT0gc3RyaWRlV2lkdGhgLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobTpcbiAqICAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAgLSBGb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uXShcbiAqICAgICAgICAgaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uKVxuICogQHBhcmFtIGRpbVJvdW5kaW5nTW9kZSBBIHN0cmluZyBmcm9tOiAnY2VpbCcsICdyb3VuZCcsICdmbG9vcicuIElmIG5vbmUgaXNcbiAqICAgICBwcm92aWRlZCwgaXQgd2lsbCBkZWZhdWx0IHRvIHRydW5jYXRlLlxuICovXG5mdW5jdGlvbiBhdmdQb29sXyh4LCBmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2F2Z1Bvb2wnLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IGRpbGF0aW9ucyA9IDE7XG4gICAgdXRpbC5hc3NlcnQoY29udl91dGlsLmVpdGhlclN0cmlkZXNPckRpbGF0aW9uc0FyZU9uZShzdHJpZGVzLCBkaWxhdGlvbnMpLCAoKSA9PiAnRXJyb3IgaW4gYXZnUG9vbDogRWl0aGVyIHN0cmlkZXMgb3IgZGlsYXRpb25zIG11c3QgYmUgMS4gJyArXG4gICAgICAgIGBHb3Qgc3RyaWRlcyAke3N0cmlkZXN9IGFuZCBkaWxhdGlvbnMgJyR7ZGlsYXRpb25zfSdgKTtcbiAgICBsZXQgeDREID0gJHg7XG4gICAgbGV0IHJlc2hhcGVkVG80RCA9IGZhbHNlO1xuICAgIGlmICgkeC5yYW5rID09PSAzKSB7XG4gICAgICAgIHJlc2hhcGVkVG80RCA9IHRydWU7XG4gICAgICAgIHg0RCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV0sICR4LnNoYXBlWzJdXSk7XG4gICAgfVxuICAgIHV0aWwuYXNzZXJ0KHg0RC5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gYXZnUG9vbDogeCBtdXN0IGJlIHJhbmsgNCBidXQgZ290IHJhbmsgJHt4NEQucmFua30uYCk7XG4gICAgaWYgKGRpbVJvdW5kaW5nTW9kZSAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNJbnQocGFkKSwgKCkgPT4gYEVycm9yIGluIGF2Z1Bvb2w6IHBhZCBtdXN0IGJlIGFuIGludGVnZXIgd2hlbiB1c2luZywgYCArXG4gICAgICAgICAgICBgZGltUm91bmRpbmdNb2RlICR7ZGltUm91bmRpbmdNb2RlfSBidXQgZ290IHBhZCAke3BhZH0uYCk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogeDREIH07XG4gICAgY29uc3QgYXR0cnMgPSB7IGZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlIH07XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgIGxldCByZXMgPSBFTkdJTkUucnVuS2VybmVsKEF2Z1Bvb2wsIGlucHV0cywgYXR0cnMpO1xuICAgIHJlcyA9IGNhc3QocmVzLCAkeC5kdHlwZSk7XG4gICAgaWYgKHJlc2hhcGVkVG80RCkge1xuICAgICAgICByZXR1cm4gcmVzaGFwZShyZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdXSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5leHBvcnQgY29uc3QgYXZnUG9vbCA9IG9wKHsgYXZnUG9vbF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hdmdfcG9vbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgQXZnUG9vbDNEIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgY2FzdCB9IGZyb20gJy4vY2FzdCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL3Jlc2hhcGUnO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgM0QgYXZlcmFnZSBwb29saW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yNWQoWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDhdLCBbMSwgMiwgMiwgMiwgMV0pO1xuICogY29uc3QgcmVzdWx0ID0gdGYuYXZnUG9vbDNkKHgsIDIsIDEsICd2YWxpZCcpO1xuICogcmVzdWx0LnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDUgb3IgcmFuayA0IG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgZGVwdGgsIGhlaWdodCwgd2lkdGgsIGluQ2hhbm5lbHNdYC5cbiAqIEBwYXJhbSBmaWx0ZXJTaXplIFRoZSBmaWx0ZXIgc2l6ZTpcbiAqICAgICBgW2ZpbHRlckRlcHRoLCBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoXWAuXG4gKiAgICAgSWYgYGZpbHRlclNpemVgIGlzIGEgc2luZ2xlIG51bWJlcixcbiAqICAgICB0aGVuIGBmaWx0ZXJEZXB0aCA9PSBmaWx0ZXJIZWlnaHQgPT0gZmlsdGVyV2lkdGhgLlxuICogQHBhcmFtIHN0cmlkZXMgVGhlIHN0cmlkZXMgb2YgdGhlIHBvb2xpbmc6XG4gKiAgICAgYFtzdHJpZGVEZXB0aCwgc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aF1gLlxuICogICAgIElmIGBzdHJpZGVzYCBpcyBhIHNpbmdsZSBudW1iZXIsXG4gKiAgICAgdGhlbiBgc3RyaWRlRGVwdGggPT0gc3RyaWRlSGVpZ2h0ID09IHN0cmlkZVdpZHRoYC5cbiAqIEBwYXJhbSBwYWQgVGhlIHR5cGUgb2YgcGFkZGluZyBhbGdvcml0aG0uXG4gKiAgICAtIGBzYW1lYCBhbmQgc3RyaWRlIDE6IG91dHB1dCB3aWxsIGJlIG9mIHNhbWUgc2l6ZSBhcyBpbnB1dCxcbiAqICAgICAgIHJlZ2FyZGxlc3Mgb2YgZmlsdGVyIHNpemUuXG4gKiAgICAtIGB2YWxpZGA6IG91dHB1dCB3aWxsIGJlIHNtYWxsZXIgdGhhbiBpbnB1dCBpZiBmaWx0ZXIgaXMgbGFyZ2VyXG4gKiAgICAgICB0aGFuIDEqMXgxLlxuICogICAgLSBGb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uXShcbiAqICAgICAgICAgIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbilcbiAqIEBwYXJhbSBkaW1Sb3VuZGluZ01vZGUgQSBzdHJpbmcgZnJvbTogJ2NlaWwnLCAncm91bmQnLCAnZmxvb3InLiBJZiBub25lIGlzXG4gKiAgICAgcHJvdmlkZWQsIGl0IHdpbGwgZGVmYXVsdCB0byB0cnVuY2F0ZS5cbiAqIEBwYXJhbSBkYXRhRm9ybWF0IEFuIG9wdGlvbmFsIHN0cmluZyBmcm9tOiBcIk5ESFdDXCIsIFwiTkNESFdcIi4gRGVmYXVsdHMgdG9cbiAqICAgICBcIk5ESFdDXCIuIFNwZWNpZnkgdGhlIGRhdGEgZm9ybWF0IG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEuIFdpdGggdGhlXG4gKiAgICAgZGVmYXVsdCBmb3JtYXQgXCJOREhXQ1wiLCB0aGUgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIG9yZGVyIG9mOiBbYmF0Y2gsXG4gKiAgICAgZGVwdGgsIGhlaWdodCwgd2lkdGgsIGNoYW5uZWxzXS4gT25seSBcIk5ESFdDXCIgaXMgY3VycmVudGx5IHN1cHBvcnRlZC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdDb252b2x1dGlvbid9XG4gKi9cbmZ1bmN0aW9uIGF2Z1Bvb2wzZF8oeCwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGRhdGFGb3JtYXQgPSAnTkRIV0MnKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnYXZnUG9vbDNkJywgJ2Zsb2F0MzInKTtcbiAgICBsZXQgeDVEID0gJHg7XG4gICAgbGV0IHJlc2hhcGVkVG81RCA9IGZhbHNlO1xuICAgIGlmICgkeC5yYW5rID09PSA0KSB7XG4gICAgICAgIHJlc2hhcGVkVG81RCA9IHRydWU7XG4gICAgICAgIHg1RCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV0sICR4LnNoYXBlWzJdLCAkeC5zaGFwZVszXV0pO1xuICAgIH1cbiAgICB1dGlsLmFzc2VydCh4NUQucmFuayA9PT0gNSwgKCkgPT4gYEVycm9yIGluIGF2Z1Bvb2wzZDogeCBtdXN0IGJlIHJhbmsgNSBidXQgZ290IHJhbmsgJHt4NUQucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoZGF0YUZvcm1hdCA9PT0gJ05ESFdDJywgKCkgPT4gYEVycm9yIGluIGF2Z1Bvb2wzZDogT25seSBOREhXQyBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLCBgICtcbiAgICAgICAgYGJ1dCBnb3QgZGF0YUZvcm1hdCBvZiAke2RhdGFGb3JtYXR9YCk7XG4gICAgaWYgKGRpbVJvdW5kaW5nTW9kZSAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNJbnQocGFkKSwgKCkgPT4gYEVycm9yIGluIGF2Z1Bvb2wzZDogcGFkIG11c3QgYmUgYW4gaW50ZWdlciB3aGVuIHVzaW5nLCBgICtcbiAgICAgICAgICAgIGBkaW1Sb3VuZGluZ01vZGUgJHtkaW1Sb3VuZGluZ01vZGV9IGJ1dCBnb3QgcGFkICR7cGFkfS5gKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiB4NUQgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGRhdGFGb3JtYXQgfTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgbGV0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoQXZnUG9vbDNELCBpbnB1dHMsIGF0dHJzKTtcbiAgICByZXMgPSBjYXN0KHJlcywgeDVELmR0eXBlKTtcbiAgICBpZiAocmVzaGFwZWRUbzVEKSB7XG4gICAgICAgIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM10sIHJlcy5zaGFwZVs0XV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IGF2Z1Bvb2wzZCA9IG9wKHsgYXZnUG9vbDNkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWF2Z19wb29sXzNkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYXhpcyBzcGVjaWZpZXMgdGhlIGlubmVyIG1vc3QgZGltZW5zaW9ucyBvZiB0aGVcbiAqIGFycmF5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXhlc0FyZUlubmVyTW9zdERpbXMoYXhlcywgcmFuaykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXhlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAoYXhlc1theGVzLmxlbmd0aCAtIGkgLSAxXSAhPT0gcmFuayAtIDEgLSBpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5leHBvcnQgZnVuY3Rpb24gY29tYmluZUxvY2F0aW9ucyhvdXRwdXRMb2MsIHJlZHVjZUxvYywgYXhlcykge1xuICAgIGNvbnN0IHJhbmsgPSBvdXRwdXRMb2MubGVuZ3RoICsgcmVkdWNlTG9jLmxlbmd0aDtcbiAgICBjb25zdCBsb2MgPSBbXTtcbiAgICBsZXQgb3V0SWR4ID0gMDtcbiAgICBsZXQgcmVkdWNlSWR4ID0gMDtcbiAgICBmb3IgKGxldCBkaW0gPSAwOyBkaW0gPCByYW5rOyBkaW0rKykge1xuICAgICAgICBpZiAoYXhlcy5pbmRleE9mKGRpbSkgPT09IC0xKSB7XG4gICAgICAgICAgICBsb2MucHVzaChvdXRwdXRMb2Nbb3V0SWR4KytdKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxvYy5wdXNoKHJlZHVjZUxvY1tyZWR1Y2VJZHgrK10pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsb2M7XG59XG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcyhhU2hhcGUsIGF4ZXMpIHtcbiAgICBjb25zdCBvdXRTaGFwZSA9IFtdO1xuICAgIGNvbnN0IHJhbmsgPSBhU2hhcGUubGVuZ3RoO1xuICAgIGZvciAobGV0IGRpbSA9IDA7IGRpbSA8IHJhbms7IGRpbSsrKSB7XG4gICAgICAgIGlmIChheGVzLmluZGV4T2YoZGltKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIG91dFNoYXBlLnB1c2goYVNoYXBlW2RpbV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlZHVjZVNoYXBlID0gYXhlcy5tYXAoZGltID0+IGFTaGFwZVtkaW1dKTtcbiAgICByZXR1cm4gW291dFNoYXBlLCByZWR1Y2VTaGFwZV07XG59XG5leHBvcnQgZnVuY3Rpb24gZXhwYW5kU2hhcGVUb0tlZXBEaW0oc2hhcGUsIGF4ZXMpIHtcbiAgICBjb25zdCByZWR1Y2VTdWJTaGFwZSA9IGF4ZXMubWFwKHggPT4gMSk7XG4gICAgcmV0dXJuIGNvbWJpbmVMb2NhdGlvbnMoc2hhcGUsIHJlZHVjZVN1YlNoYXBlLCBheGVzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcyhtc2csIGF4ZXMsIHJhbmspIHtcbiAgICB1dGlsLmFzc2VydChheGVzQXJlSW5uZXJNb3N0RGltcyhheGVzLCByYW5rKSwgKCkgPT4gYCR7bXNnfSBzdXBwb3J0cyBvbmx5IGlubmVyLW1vc3QgYXhlcyBmb3Igbm93LiBgICtcbiAgICAgICAgYEdvdCBheGVzICR7YXhlc30gYW5kIHJhbmstJHtyYW5rfSBpbnB1dC5gKTtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgYXhlcyBwZXJtdXRhdGlvbiB0byBiZSB1c2VkIHdpdGggYHRmLnRyYW5zcG9zZWAsIGlmIHN1Y2hcbiAqIHBlcm11dGF0aW9uIGlzIG5lY2Vzc2FyeS4gT3RoZXJ3aXNlIGl0IHJldHVybnMgbnVsbC4gVGhpcyBtZXRob2QgaXMgdXNlZCBieVxuICogb3BlcmF0aW9ucyB0aGF0IG9wZXJhdGUgb25seSBvbiBpbm5lci1tb3N0IGF4ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBeGVzUGVybXV0YXRpb24oYXhlcywgcmFuaykge1xuICAgIGlmIChheGVzQXJlSW5uZXJNb3N0RGltcyhheGVzLCByYW5rKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5rOyArK2kpIHtcbiAgICAgICAgaWYgKGF4ZXMuaW5kZXhPZihpKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGF4ZXMuZm9yRWFjaChheGlzID0+IHJlc3VsdC5wdXNoKGF4aXMpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqIFJldHVybnMgdGhlIGF4ZXMgcGVybXV0YXRpb24gdGhhdCB1bmRvZXMgdGhlIG9yaWdpbmFsIHBlcm11dGF0aW9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFVuZG9BeGVzUGVybXV0YXRpb24oYXhlcykge1xuICAgIHJldHVybiBheGVzLm1hcCgoYXhpcywgaSkgPT4gW2ksIGF4aXNdKVxuICAgICAgICAuc29ydCgoYSwgYikgPT4gYVsxXSAtIGJbMV0pXG4gICAgICAgIC5tYXAoeCA9PiB4WzBdKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbm5lck1vc3RBeGVzKG51bUF4ZXMsIHJhbmspIHtcbiAgICBjb25zdCByZXMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gcmFuayAtIG51bUF4ZXM7IGkgPCByYW5rOyArK2kpIHtcbiAgICAgICAgcmVzLnB1c2goaSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1heGlzX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGFkZCB9IGZyb20gJy4vYWRkJztcbmltcG9ydCB7IGNvbmNhdCB9IGZyb20gJy4vY29uY2F0JztcbmltcG9ydCB7IG1hdE11bCB9IGZyb20gJy4vbWF0X211bCc7XG5pbXBvcnQgeyBtdWwgfSBmcm9tICcuL211bCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHNpZ21vaWQgfSBmcm9tICcuL3NpZ21vaWQnO1xuaW1wb3J0IHsgc2xpY2UgfSBmcm9tICcuL3NsaWNlJztcbmltcG9ydCB7IHRhbmggfSBmcm9tICcuL3RhbmgnO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgbmV4dCBzdGF0ZSBhbmQgb3V0cHV0IG9mIGEgQmFzaWNMU1RNQ2VsbC5cbiAqXG4gKiBSZXR1cm5zIGBbbmV3QywgbmV3SF1gLlxuICpcbiAqIERlcml2ZWQgZnJvbSB0Zi5jb250cmliLnJubi5CYXNpY0xTVE1DZWxsLlxuICpcbiAqIEBwYXJhbSBmb3JnZXRCaWFzIEZvcmdldCBiaWFzIGZvciB0aGUgY2VsbC5cbiAqIEBwYXJhbSBsc3RtS2VybmVsIFRoZSB3ZWlnaHRzIGZvciB0aGUgY2VsbC5cbiAqIEBwYXJhbSBsc3RtQmlhcyBUaGUgYmlhcyBmb3IgdGhlIGNlbGwuXG4gKiBAcGFyYW0gZGF0YSBUaGUgaW5wdXQgdG8gdGhlIGNlbGwuXG4gKiBAcGFyYW0gYyBQcmV2aW91cyBjZWxsIHN0YXRlLlxuICogQHBhcmFtIGggUHJldmlvdXMgY2VsbCBvdXRwdXQuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnUk5OJ31cbiAqL1xuZnVuY3Rpb24gYmFzaWNMU1RNQ2VsbF8oZm9yZ2V0QmlhcywgbHN0bUtlcm5lbCwgbHN0bUJpYXMsIGRhdGEsIGMsIGgpIHtcbiAgICBjb25zdCAkZm9yZ2V0QmlhcyA9IGNvbnZlcnRUb1RlbnNvcihmb3JnZXRCaWFzLCAnZm9yZ2V0QmlhcycsICdiYXNpY0xTVE1DZWxsJyk7XG4gICAgY29uc3QgJGxzdG1LZXJuZWwgPSBjb252ZXJ0VG9UZW5zb3IobHN0bUtlcm5lbCwgJ2xzdG1LZXJuZWwnLCAnYmFzaWNMU1RNQ2VsbCcpO1xuICAgIGNvbnN0ICRsc3RtQmlhcyA9IGNvbnZlcnRUb1RlbnNvcihsc3RtQmlhcywgJ2xzdG1CaWFzJywgJ2Jhc2ljTFNUTUNlbGwnKTtcbiAgICBjb25zdCAkZGF0YSA9IGNvbnZlcnRUb1RlbnNvcihkYXRhLCAnZGF0YScsICdiYXNpY0xTVE1DZWxsJyk7XG4gICAgY29uc3QgJGMgPSBjb252ZXJ0VG9UZW5zb3IoYywgJ2MnLCAnYmFzaWNMU1RNQ2VsbCcpO1xuICAgIGNvbnN0ICRoID0gY29udmVydFRvVGVuc29yKGgsICdoJywgJ2Jhc2ljTFNUTUNlbGwnKTtcbiAgICBjb25zdCBjb21iaW5lZCA9IGNvbmNhdChbJGRhdGEsICRoXSwgMSk7XG4gICAgY29uc3Qgd2VpZ2h0ZWQgPSBtYXRNdWwoY29tYmluZWQsICRsc3RtS2VybmVsKTtcbiAgICBjb25zdCByZXMgPSBhZGQod2VpZ2h0ZWQsICRsc3RtQmlhcyk7XG4gICAgLy8gaSA9IGlucHV0X2dhdGUsIGogPSBuZXdfaW5wdXQsIGYgPSBmb3JnZXRfZ2F0ZSwgbyA9IG91dHB1dF9nYXRlXG4gICAgY29uc3QgYmF0Y2hTaXplID0gcmVzLnNoYXBlWzBdO1xuICAgIGNvbnN0IHNsaWNlQ29scyA9IHJlcy5zaGFwZVsxXSAvIDQ7XG4gICAgY29uc3Qgc2xpY2VTaXplID0gW2JhdGNoU2l6ZSwgc2xpY2VDb2xzXTtcbiAgICBjb25zdCBpID0gc2xpY2UocmVzLCBbMCwgMF0sIHNsaWNlU2l6ZSk7XG4gICAgY29uc3QgaiA9IHNsaWNlKHJlcywgWzAsIHNsaWNlQ29sc10sIHNsaWNlU2l6ZSk7XG4gICAgY29uc3QgZiA9IHNsaWNlKHJlcywgWzAsIHNsaWNlQ29scyAqIDJdLCBzbGljZVNpemUpO1xuICAgIGNvbnN0IG8gPSBzbGljZShyZXMsIFswLCBzbGljZUNvbHMgKiAzXSwgc2xpY2VTaXplKTtcbiAgICBjb25zdCBuZXdDID0gYWRkKG11bChzaWdtb2lkKGkpLCB0YW5oKGopKSwgbXVsKCRjLCBzaWdtb2lkKGFkZCgkZm9yZ2V0QmlhcywgZikpKSk7XG4gICAgY29uc3QgbmV3SCA9IG11bCh0YW5oKG5ld0MpLCBzaWdtb2lkKG8pKTtcbiAgICByZXR1cm4gW25ld0MsIG5ld0hdO1xufVxuZXhwb3J0IGNvbnN0IGJhc2ljTFNUTUNlbGwgPSBvcCh7IGJhc2ljTFNUTUNlbGxfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmFzaWNfbHN0bV9jZWxsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBCYXRjaFRvU3BhY2VORCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBUaGlzIG9wZXJhdGlvbiByZXNoYXBlcyB0aGUgXCJiYXRjaFwiIGRpbWVuc2lvbiAwIGludG8gYE0gKyAxYCBkaW1lbnNpb25zIG9mXG4gKiBzaGFwZSBgYmxvY2tTaGFwZSArIFtiYXRjaF1gLCBpbnRlcmxlYXZlcyB0aGVzZSBibG9ja3MgYmFjayBpbnRvIHRoZSBncmlkXG4gKiBkZWZpbmVkIGJ5IHRoZSBzcGF0aWFsIGRpbWVuc2lvbnMgYFsxLCAuLi4sIE1dYCwgdG8gb2J0YWluIGEgcmVzdWx0IHdpdGhcbiAqIHRoZSBzYW1lIHJhbmsgYXMgdGhlIGlucHV0LiBUaGUgc3BhdGlhbCBkaW1lbnNpb25zIG9mIHRoaXMgaW50ZXJtZWRpYXRlXG4gKiByZXN1bHQgYXJlIHRoZW4gb3B0aW9uYWxseSBjcm9wcGVkIGFjY29yZGluZyB0byBgY3JvcHNgIHRvIHByb2R1Y2UgdGhlXG4gKiBvdXRwdXQuIFRoaXMgaXMgdGhlIHJldmVyc2Ugb2YgYHRmLnNwYWNlVG9CYXRjaE5EYC4gU2VlIGJlbG93IGZvciBhIHByZWNpc2VcbiAqIGRlc2NyaXB0aW9uLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yNGQoWzEsIDIsIDMsIDRdLCBbNCwgMSwgMSwgMV0pO1xuICogY29uc3QgYmxvY2tTaGFwZSA9IFsyLCAyXTtcbiAqIGNvbnN0IGNyb3BzID0gW1swLCAwXSwgWzAsIDBdXTtcbiAqXG4gKiB4LmJhdGNoVG9TcGFjZU5EKGJsb2NrU2hhcGUsIGNyb3BzKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHggQSBgdGYuVGVuc29yYC4gTi1EIHdpdGggYHguc2hhcGVgID0gYFtiYXRjaF0gKyBzcGF0aWFsU2hhcGUgK1xuICogcmVtYWluaW5nU2hhcGVgLCB3aGVyZSBzcGF0aWFsU2hhcGUgaGFzIGBNYCBkaW1lbnNpb25zLlxuICogQHBhcmFtIGJsb2NrU2hhcGUgQSAxLUQgYXJyYXkuIE11c3QgaGF2ZSBzaGFwZSBgW01dYCwgYWxsIHZhbHVlcyBtdXN0XG4gKiBiZSA+PSAxLlxuICogQHBhcmFtIGNyb3BzIEEgMi1EIGFycmF5LiAgTXVzdCBoYXZlIHNoYXBlIGBbTSwgMl1gLCBhbGwgdmFsdWVzIG11c3QgYmUgPj0gMC5cbiAqIGBjcm9wc1tpXSA9IFtjcm9wU3RhcnQsIGNyb3BFbmRdYCBzcGVjaWZpZXMgdGhlIGFtb3VudCB0byBjcm9wIGZyb20gaW5wdXRcbiAqIGRpbWVuc2lvbiBgaSArIDFgLCB3aGljaCBjb3JyZXNwb25kcyB0byBzcGF0aWFsIGRpbWVuc2lvbiBgaWAuIEl0IGlzIHJlcXVpcmVkXG4gKiB0aGF0IGBjcm9wU3RhcnRbaV0gKyBjcm9wRW5kW2ldIDw9IGJsb2NrU2hhcGVbaV0gKiBpbnB1dFNoYXBlW2kgKyAxXWBcbiAqXG4gKiBUaGlzIG9wZXJhdGlvbiBpcyBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmcgc3RlcHM6XG4gKlxuICogMS4gUmVzaGFwZSBgeGAgdG8gYHJlc2hhcGVkYCBvZiBzaGFwZTogYFtibG9ja1NoYXBlWzBdLCAuLi4sXG4gKiBibG9ja1NoYXBlW00tMV0sIGJhdGNoIC8gcHJvZChibG9ja1NoYXBlKSwgeC5zaGFwZVsxXSwgLi4uLFxuICogeC5zaGFwZVtOLTFdXWBcbiAqXG4gKiAyLiBQZXJtdXRlIGRpbWVuc2lvbnMgb2YgYHJlc2hhcGVkYHRvIHByb2R1Y2UgYHBlcm11dGVkYCBvZiBzaGFwZSBgW2JhdGNoIC9cbiAqIHByb2QoYmxvY2tTaGFwZSkseC5zaGFwZVsxXSwgYmxvY2tTaGFwZVswXSwgLi4uLCB4LnNoYXBlW01dLFxuICogYmxvY2tTaGFwZVtNLTFdLHguc2hhcGVbTSsxXSwgLi4uLCB4LnNoYXBlW04tMV1dYFxuICpcbiAqIDMuIFJlc2hhcGUgYHBlcm11dGVkYCB0byBwcm9kdWNlIGByZXNoYXBlZFBlcm11dGVkYCBvZiBzaGFwZSBgW2JhdGNoIC9cbiAqIHByb2QoYmxvY2tTaGFwZSkseC5zaGFwZVsxXSAqIGJsb2NrU2hhcGVbMF0sIC4uLiwgeC5zaGFwZVtNXSAqXG4gKiBibG9ja1NoYXBlW00tMV0seC5zaGFwZVtNKzFdLCAuLi4sIHguc2hhcGVbTi0xXV1gXG4gKlxuICogNC4gQ3JvcCB0aGUgc3RhcnQgYW5kIGVuZCBvZiBkaW1lbnNpb25zIGBbMSwgLi4uLCBNXWAgb2YgYHJlc2hhcGVkUGVybXV0ZWRgXG4gKiBhY2NvcmRpbmcgdG8gYGNyb3BzYCB0byBwcm9kdWNlIHRoZSBvdXRwdXQgb2Ygc2hhcGU6IGBbYmF0Y2ggL1xuICogcHJvZChibG9ja1NoYXBlKSx4LnNoYXBlWzFdICogYmxvY2tTaGFwZVswXSAtIGNyb3BzWzAsMF0gLSBjcm9wc1swLDFdLFxuICogLi4uLCB4LnNoYXBlW01dICogYmxvY2tTaGFwZVtNLTFdIC0gY3JvcHNbTS0xLDBdIC1cbiAqIGNyb3BzW00tMSwxXSx4LnNoYXBlW00rMV0sIC4uLiwgeC5zaGFwZVtOLTFdXWBcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdUcmFuc2Zvcm1hdGlvbnMnfVxuICovXG5mdW5jdGlvbiBiYXRjaFRvU3BhY2VORF8oeCwgYmxvY2tTaGFwZSwgY3JvcHMpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdiYXRjaFRvU3BhY2VORCcpO1xuICAgIGNvbnN0IHByb2QgPSBibG9ja1NoYXBlLnJlZHVjZSgoYSwgYikgPT4gYSAqIGIpO1xuICAgIHV0aWwuYXNzZXJ0KCR4LnJhbmsgPj0gMSArIGJsb2NrU2hhcGUubGVuZ3RoLCAoKSA9PiBgaW5wdXQgcmFuayBpcyAkeyR4LnJhbmt9IGJ1dCBzaG91bGQgYmUgPiB0aGFuIGJsb2NrU2hhcGUubGVuZ3RoICR7YmxvY2tTaGFwZS5sZW5ndGh9YCk7XG4gICAgdXRpbC5hc3NlcnQoY3JvcHMubGVuZ3RoID09PSBibG9ja1NoYXBlLmxlbmd0aCwgKCkgPT4gYGNyb3BzLmxlbmd0aCBpcyAke2Nyb3BzLmxlbmd0aH0gYnV0IHNob3VsZCBiZSBlcXVhbCB0byBibG9ja1NoYXBlLmxlbmd0aCAgJHtibG9ja1NoYXBlLmxlbmd0aH1gKTtcbiAgICB1dGlsLmFzc2VydCgkeC5zaGFwZVswXSAlIHByb2QgPT09IDAsICgpID0+IGBpbnB1dCB0ZW5zb3IgYmF0Y2ggaXMgJHskeC5zaGFwZVswXX0gYnV0IGlzIG5vdCBkaXZpc2libGUgYnkgdGhlIHByb2R1Y3Qgb2YgYCArXG4gICAgICAgIGB0aGUgZWxlbWVudHMgb2YgYmxvY2tTaGFwZSAke2Jsb2NrU2hhcGUuam9pbignICogJyl9ID09PSAke3Byb2R9YCk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBibG9ja1NoYXBlLCBjcm9wcyB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEJhdGNoVG9TcGFjZU5ELCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBiYXRjaFRvU3BhY2VORCA9IG9wKHsgYmF0Y2hUb1NwYWNlTkRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmF0Y2hfdG9fc3BhY2VfbmQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEZ1c2VkQmF0Y2hOb3JtIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgeEFzNEQgfSBmcm9tICcuL2JhdGNobm9ybV91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vcmVzaGFwZSc7XG4vKipcbiAqIEJhdGNoIG5vcm1hbGl6YXRpb24uXG4gKlxuICogQXMgZGVzY3JpYmVkIGluXG4gKiBbaHR0cDovL2FyeGl2Lm9yZy9hYnMvMTUwMi4wMzE2N10oaHR0cDovL2FyeGl2Lm9yZy9hYnMvMTUwMi4wMzE2NykuXG4gKlxuICogTWVhbiwgdmFyaWFuY2UsIHNjYWxlLCBhbmQgb2Zmc2V0IGNhbiBiZSBvZiB0d28gc2hhcGVzOlxuICogICAtIFRoZSBzYW1lIHNoYXBlIGFzIHRoZSBpbnB1dC5cbiAqICAgLSBJbiB0aGUgY29tbW9uIGNhc2UsIHRoZSBkZXB0aCBkaW1lbnNpb24gaXMgdGhlIGxhc3QgZGltZW5zaW9uIG9mIHgsIHNvXG4gKiAgICAgdGhlIHZhbHVlcyB3b3VsZCBiZSBhbiBgdGYuVGVuc29yMURgIG9mIHNoYXBlIFtkZXB0aF0uXG4gKlxuICogQWxzbyBhdmFpbGFibGUgYXJlIHN0cmljdGVyIHJhbmstc3BlY2lmaWMgbWV0aG9kcyB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZVxuICogYXMgdGhpcyBtZXRob2QgdGhhdCBhc3NlcnQgdGhhdCBwYXJhbWV0ZXJzIHBhc3NlZCBhcmUgb2YgZ2l2ZW4gcmFua1xuICogICAtIGB0Zi5iYXRjaE5vcm0yZGBcbiAqICAgLSBgdGYuYmF0Y2hOb3JtM2RgXG4gKiAgIC0gYHRmLmJhdGNoTm9ybTRkYFxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBUZW5zb3IuXG4gKiBAcGFyYW0gbWVhbiBBIG1lYW4gVGVuc29yLlxuICogQHBhcmFtIHZhcmlhbmNlIEEgdmFyaWFuY2UgVGVuc29yLlxuICogQHBhcmFtIG9mZnNldCBBbiBvZmZzZXQgVGVuc29yLlxuICogQHBhcmFtIHNjYWxlIEEgc2NhbGUgVGVuc29yLlxuICogQHBhcmFtIHZhcmlhbmNlRXBzaWxvbiBBIHNtYWxsIGZsb2F0IG51bWJlciB0byBhdm9pZCBkaXZpZGluZyBieSAwLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ05vcm1hbGl6YXRpb24nfVxuICovXG5mdW5jdGlvbiBiYXRjaE5vcm1fKHgsIG1lYW4sIHZhcmlhbmNlLCBvZmZzZXQsIHNjYWxlLCB2YXJpYW5jZUVwc2lsb24pIHtcbiAgICBpZiAodmFyaWFuY2VFcHNpbG9uID09IG51bGwpIHtcbiAgICAgICAgdmFyaWFuY2VFcHNpbG9uID0gMC4wMDE7XG4gICAgfVxuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2JhdGNoTm9ybScpO1xuICAgIGNvbnN0ICRtZWFuID0gY29udmVydFRvVGVuc29yKG1lYW4sICdtZWFuJywgJ2JhdGNoTm9ybScpO1xuICAgIGNvbnN0ICR2YXJpYW5jZSA9IGNvbnZlcnRUb1RlbnNvcih2YXJpYW5jZSwgJ3ZhcmlhbmNlJywgJ2JhdGNoTm9ybScpO1xuICAgIGxldCAkc2NhbGU7XG4gICAgaWYgKHNjYWxlICE9IG51bGwpIHtcbiAgICAgICAgJHNjYWxlID0gY29udmVydFRvVGVuc29yKHNjYWxlLCAnc2NhbGUnLCAnYmF0Y2hOb3JtJyk7XG4gICAgfVxuICAgIGxldCAkb2Zmc2V0O1xuICAgIGlmIChvZmZzZXQgIT0gbnVsbCkge1xuICAgICAgICAkb2Zmc2V0ID0gY29udmVydFRvVGVuc29yKG9mZnNldCwgJ29mZnNldCcsICdiYXRjaE5vcm0nKTtcbiAgICB9XG4gICAgdXRpbC5hc3NlcnQoJG1lYW4ucmFuayA9PT0gJHZhcmlhbmNlLnJhbmssICgpID0+ICdCYXRjaCBub3JtYWxpemF0aW9uIGdyYWRpZW50IHJlcXVpcmVzIG1lYW4gYW5kIHZhcmlhbmNlIHRvIGhhdmUgJyArXG4gICAgICAgICdlcXVhbCByYW5rcy4nKTtcbiAgICB1dGlsLmFzc2VydCgkb2Zmc2V0ID09IG51bGwgfHwgJG1lYW4ucmFuayA9PT0gJG9mZnNldC5yYW5rLCAoKSA9PiAnQmF0Y2ggbm9ybWFsaXphdGlvbiBncmFkaWVudCByZXF1aXJlcyBtZWFuIGFuZCBvZmZzZXQgdG8gaGF2ZSAnICtcbiAgICAgICAgJ2VxdWFsIHJhbmtzLicpO1xuICAgIHV0aWwuYXNzZXJ0KCRzY2FsZSA9PSBudWxsIHx8ICRtZWFuLnJhbmsgPT09ICRzY2FsZS5yYW5rLCAoKSA9PiAnQmF0Y2ggbm9ybWFsaXphdGlvbiBncmFkaWVudCByZXF1aXJlcyBtZWFuIGFuZCBzY2FsZSB0byBoYXZlICcgK1xuICAgICAgICAnZXF1YWwgcmFua3MuJyk7XG4gICAgY29uc3QgeDREID0geEFzNEQoJHgpO1xuICAgIGNvbnN0IGlucHV0cyA9IHtcbiAgICAgICAgeDogeDRELFxuICAgICAgICBzY2FsZTogJHNjYWxlLFxuICAgICAgICBvZmZzZXQ6ICRvZmZzZXQsXG4gICAgICAgIG1lYW46ICRtZWFuLFxuICAgICAgICB2YXJpYW5jZTogJHZhcmlhbmNlXG4gICAgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgdmFyaWFuY2VFcHNpbG9uIH07XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgIGNvbnN0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoRnVzZWRCYXRjaE5vcm0sIGlucHV0cywgYXR0cnMpO1xuICAgIHJldHVybiByZXNoYXBlKHJlcywgJHguc2hhcGUpO1xufVxuZXhwb3J0IGNvbnN0IGJhdGNoTm9ybSA9IG9wKHsgYmF0Y2hOb3JtXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJhdGNobm9ybS5qcy5tYXAiLCJpbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IGJhdGNoTm9ybSB9IGZyb20gJy4vYmF0Y2hub3JtJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBCYXRjaCBub3JtYWxpemF0aW9uLCBzdHJpY3RseSBmb3IgMkQuIEZvciB0aGUgbW9yZSByZWxheGVkIHZlcnNpb24sIHNlZVxuICogYHRmLmJhdGNoTm9ybWAuXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IFRlbnNvci5cbiAqIEBwYXJhbSBtZWFuIEEgbWVhbiBUZW5zb3IuXG4gKiBAcGFyYW0gdmFyaWFuY2UgQSB2YXJpYW5jZSBUZW5zb3IuXG4gKiBAcGFyYW0gb2Zmc2V0IEFuIG9mZnNldCBUZW5zb3IuXG4gKiBAcGFyYW0gc2NhbGUgQSBzY2FsZSBUZW5zb3IuXG4gKiBAcGFyYW0gdmFyaWFuY2VFcHNpbG9uIEEgc21hbGwgZmxvYXQgbnVtYmVyIHRvIGF2b2lkIGRpdmlkaW5nIGJ5IDAuXG4gKi9cbmZ1bmN0aW9uIGJhdGNoTm9ybTJkXyh4LCBtZWFuLCB2YXJpYW5jZSwgb2Zmc2V0LCBzY2FsZSwgdmFyaWFuY2VFcHNpbG9uKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnYmF0Y2hOb3JtJyk7XG4gICAgY29uc3QgJG1lYW4gPSBjb252ZXJ0VG9UZW5zb3IobWVhbiwgJ21lYW4nLCAnYmF0Y2hOb3JtJyk7XG4gICAgY29uc3QgJHZhcmlhbmNlID0gY29udmVydFRvVGVuc29yKHZhcmlhbmNlLCAndmFyaWFuY2UnLCAnYmF0Y2hOb3JtJyk7XG4gICAgbGV0ICRzY2FsZTtcbiAgICBpZiAoc2NhbGUgIT0gbnVsbCkge1xuICAgICAgICAkc2NhbGUgPSBjb252ZXJ0VG9UZW5zb3Ioc2NhbGUsICdzY2FsZScsICdiYXRjaE5vcm0nKTtcbiAgICB9XG4gICAgbGV0ICRvZmZzZXQ7XG4gICAgaWYgKG9mZnNldCAhPSBudWxsKSB7XG4gICAgICAgICRvZmZzZXQgPSBjb252ZXJ0VG9UZW5zb3Iob2Zmc2V0LCAnb2Zmc2V0JywgJ2JhdGNoTm9ybScpO1xuICAgIH1cbiAgICB1dGlsLmFzc2VydCgkeC5yYW5rID09PSAyLCAoKSA9PiBgRXJyb3IgaW4gYmF0Y2hOb3JtMkQ6IHggbXVzdCBiZSByYW5rIDIgYnV0IGdvdCByYW5rIGAgK1xuICAgICAgICBgJHskeC5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydCgkbWVhbi5yYW5rID09PSAyIHx8ICRtZWFuLnJhbmsgPT09IDEsICgpID0+IGBFcnJvciBpbiBiYXRjaE5vcm0yRDogbWVhbiBtdXN0IGJlIHJhbmsgMiBvciByYW5rIDEgYnV0IGAgK1xuICAgICAgICBgZ290IHJhbmsgJHskbWVhbi5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydCgkdmFyaWFuY2UucmFuayA9PT0gMiB8fCAkdmFyaWFuY2UucmFuayA9PT0gMSwgKCkgPT4gYEVycm9yIGluIGJhdGNoTm9ybTJEOiB2YXJpYW5jZSBtdXN0IGJlIHJhbmsgMiBvciByYW5rIDEgYCArXG4gICAgICAgIGBidXQgZ290IHJhbmsgJHskdmFyaWFuY2UucmFua30uYCk7XG4gICAgaWYgKCRzY2FsZSAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KCRzY2FsZS5yYW5rID09PSAyIHx8ICRzY2FsZS5yYW5rID09PSAxLCAoKSA9PiBgRXJyb3IgaW4gYmF0Y2hOb3JtMkQ6IHNjYWxlIG11c3QgYmUgcmFuayAyIG9yIHJhbmsgMSBgICtcbiAgICAgICAgICAgIGBidXQgZ290IHJhbmsgJHskc2NhbGUucmFua30uYCk7XG4gICAgfVxuICAgIGlmICgkb2Zmc2V0ICE9IG51bGwpIHtcbiAgICAgICAgdXRpbC5hc3NlcnQoJG9mZnNldC5yYW5rID09PSAyIHx8ICRvZmZzZXQucmFuayA9PT0gMSwgKCkgPT4gYEVycm9yIGluIGJhdGNoTm9ybTJEOiBvZmZzZXQgbXVzdCBiZSByYW5rIDIgb3IgcmFuayAxIGAgK1xuICAgICAgICAgICAgYGJ1dCBnb3QgcmFuayAkeyRvZmZzZXQucmFua30uYCk7XG4gICAgfVxuICAgIHJldHVybiBiYXRjaE5vcm0oJHgsICRtZWFuLCAkdmFyaWFuY2UsICRvZmZzZXQsICRzY2FsZSwgdmFyaWFuY2VFcHNpbG9uKTtcbn1cbmV4cG9ydCBjb25zdCBiYXRjaE5vcm0yZCA9IG9wKHsgYmF0Y2hOb3JtMmRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmF0Y2hub3JtMmQuanMubWFwIiwiaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBiYXRjaE5vcm0gfSBmcm9tICcuL2JhdGNobm9ybSc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQmF0Y2ggbm9ybWFsaXphdGlvbiwgc3RyaWN0bHkgZm9yIDNELiBGb3IgdGhlIG1vcmUgcmVsYXhlZCB2ZXJzaW9uLCBzZWVcbiAqIGB0Zi5iYXRjaE5vcm1gLlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBUZW5zb3IuXG4gKiBAcGFyYW0gbWVhbiBBIG1lYW4gVGVuc29yLlxuICogQHBhcmFtIHZhcmlhbmNlIEEgdmFyaWFuY2UgVGVuc29yLlxuICogQHBhcmFtIG9mZnNldCBBbiBvZmZzZXQgVGVuc29yLlxuICogQHBhcmFtIHNjYWxlIEEgc2NhbGUgVGVuc29yLlxuICogQHBhcmFtIHZhcmlhbmNlRXBzaWxvbiBBIHNtYWxsIGZsb2F0IG51bWJlciB0byBhdm9pZCBkaXZpZGluZyBieSAwLlxuICovXG5mdW5jdGlvbiBiYXRjaE5vcm0zZF8oeCwgbWVhbiwgdmFyaWFuY2UsIG9mZnNldCwgc2NhbGUsIHZhcmlhbmNlRXBzaWxvbikge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2JhdGNoTm9ybScpO1xuICAgIGNvbnN0ICRtZWFuID0gY29udmVydFRvVGVuc29yKG1lYW4sICdtZWFuJywgJ2JhdGNoTm9ybScpO1xuICAgIGNvbnN0ICR2YXJpYW5jZSA9IGNvbnZlcnRUb1RlbnNvcih2YXJpYW5jZSwgJ3ZhcmlhbmNlJywgJ2JhdGNoTm9ybScpO1xuICAgIGxldCAkc2NhbGU7XG4gICAgaWYgKHNjYWxlICE9IG51bGwpIHtcbiAgICAgICAgJHNjYWxlID0gY29udmVydFRvVGVuc29yKHNjYWxlLCAnc2NhbGUnLCAnYmF0Y2hOb3JtJyk7XG4gICAgfVxuICAgIGxldCAkb2Zmc2V0O1xuICAgIGlmIChvZmZzZXQgIT0gbnVsbCkge1xuICAgICAgICAkb2Zmc2V0ID0gY29udmVydFRvVGVuc29yKG9mZnNldCwgJ29mZnNldCcsICdiYXRjaE5vcm0nKTtcbiAgICB9XG4gICAgdXRpbC5hc3NlcnQoJHgucmFuayA9PT0gMywgKCkgPT4gYEVycm9yIGluIGJhdGNoTm9ybTNEOiB4IG11c3QgYmUgcmFuayAzIGJ1dCBnb3QgcmFuayBgICtcbiAgICAgICAgYCR7JHgucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoJG1lYW4ucmFuayA9PT0gMyB8fCAkbWVhbi5yYW5rID09PSAxLCAoKSA9PiBgRXJyb3IgaW4gYmF0Y2hOb3JtM0Q6IG1lYW4gbXVzdCBiZSByYW5rIDMgb3IgcmFuayAxIGJ1dCBgICtcbiAgICAgICAgYGdvdCByYW5rICR7JG1lYW4ucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoJHZhcmlhbmNlLnJhbmsgPT09IDMgfHwgJHZhcmlhbmNlLnJhbmsgPT09IDEsICgpID0+IGBFcnJvciBpbiBiYXRjaE5vcm0zRDogdmFyaWFuY2UgbXVzdCBiZSByYW5rIDMgb3IgcmFuayAxIGAgK1xuICAgICAgICBgYnV0IGdvdCByYW5rICR7JHZhcmlhbmNlLnJhbmt9LmApO1xuICAgIGlmICgkc2NhbGUgIT0gbnVsbCkge1xuICAgICAgICB1dGlsLmFzc2VydCgkc2NhbGUucmFuayA9PT0gMyB8fCAkc2NhbGUucmFuayA9PT0gMSwgKCkgPT4gYEVycm9yIGluIGJhdGNoTm9ybTNEOiBzY2FsZSBtdXN0IGJlIHJhbmsgMyBvciByYW5rIDEgYCArXG4gICAgICAgICAgICBgYnV0IGdvdCByYW5rICR7JHNjYWxlLnJhbmt9LmApO1xuICAgIH1cbiAgICBpZiAoJG9mZnNldCAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KCRvZmZzZXQucmFuayA9PT0gMyB8fCAkb2Zmc2V0LnJhbmsgPT09IDEsICgpID0+IGBFcnJvciBpbiBiYXRjaE5vcm0zRDogb2Zmc2V0IG11c3QgYmUgcmFuayAzIG9yIHJhbmsgMSBgICtcbiAgICAgICAgICAgIGBidXQgZ290IHJhbmsgJHskb2Zmc2V0LnJhbmt9LmApO1xuICAgIH1cbiAgICByZXR1cm4gYmF0Y2hOb3JtKCR4LCAkbWVhbiwgJHZhcmlhbmNlLCAkb2Zmc2V0LCAkc2NhbGUsIHZhcmlhbmNlRXBzaWxvbik7XG59XG5leHBvcnQgY29uc3QgYmF0Y2hOb3JtM2QgPSBvcCh7IGJhdGNoTm9ybTNkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJhdGNobm9ybTNkLmpzLm1hcCIsImltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgYmF0Y2hOb3JtIH0gZnJvbSAnLi9iYXRjaG5vcm0nO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIEJhdGNoIG5vcm1hbGl6YXRpb24sIHN0cmljdGx5IGZvciA0RC4gRm9yIHRoZSBtb3JlIHJlbGF4ZWQgdmVyc2lvbiwgc2VlXG4gKiBgdGYuYmF0Y2hOb3JtYC5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgVGVuc29yLlxuICogQHBhcmFtIG1lYW4gQSBtZWFuIFRlbnNvci5cbiAqIEBwYXJhbSB2YXJpYW5jZSBBIHZhcmlhbmNlIFRlbnNvci5cbiAqIEBwYXJhbSBvZmZzZXQgQW4gb2Zmc2V0IFRlbnNvci5cbiAqIEBwYXJhbSBzY2FsZSBBIHNjYWxlIFRlbnNvci5cbiAqIEBwYXJhbSB2YXJpYW5jZUVwc2lsb24gQSBzbWFsbCBmbG9hdCBudW1iZXIgdG8gYXZvaWQgZGl2aWRpbmcgYnkgMC5cbiAqL1xuZnVuY3Rpb24gYmF0Y2hOb3JtNGRfKHgsIG1lYW4sIHZhcmlhbmNlLCBvZmZzZXQsIHNjYWxlLCB2YXJpYW5jZUVwc2lsb24pIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdiYXRjaE5vcm0nKTtcbiAgICBjb25zdCAkbWVhbiA9IGNvbnZlcnRUb1RlbnNvcihtZWFuLCAnbWVhbicsICdiYXRjaE5vcm0nKTtcbiAgICBjb25zdCAkdmFyaWFuY2UgPSBjb252ZXJ0VG9UZW5zb3IodmFyaWFuY2UsICd2YXJpYW5jZScsICdiYXRjaE5vcm0nKTtcbiAgICBsZXQgJHNjYWxlO1xuICAgIGlmIChzY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICRzY2FsZSA9IGNvbnZlcnRUb1RlbnNvcihzY2FsZSwgJ3NjYWxlJywgJ2JhdGNoTm9ybScpO1xuICAgIH1cbiAgICBsZXQgJG9mZnNldDtcbiAgICBpZiAob2Zmc2V0ICE9IG51bGwpIHtcbiAgICAgICAgJG9mZnNldCA9IGNvbnZlcnRUb1RlbnNvcihvZmZzZXQsICdvZmZzZXQnLCAnYmF0Y2hOb3JtJyk7XG4gICAgfVxuICAgIHV0aWwuYXNzZXJ0KCR4LnJhbmsgPT09IDQsICgpID0+IGBFcnJvciBpbiBiYXRjaE5vcm00RDogeCBtdXN0IGJlIHJhbmsgNCBidXQgZ290IHJhbmsgYCArXG4gICAgICAgIGAkeyR4LnJhbmt9LmApO1xuICAgIHV0aWwuYXNzZXJ0KCRtZWFuLnJhbmsgPT09IDQgfHwgJG1lYW4ucmFuayA9PT0gMSwgKCkgPT4gYEVycm9yIGluIGJhdGNoTm9ybTREOiBtZWFuIG11c3QgYmUgcmFuayA0IG9yIHJhbmsgMSBidXQgYCArXG4gICAgICAgIGBnb3QgcmFuayAkeyRtZWFuLnJhbmt9LmApO1xuICAgIHV0aWwuYXNzZXJ0KCR2YXJpYW5jZS5yYW5rID09PSA0IHx8ICR2YXJpYW5jZS5yYW5rID09PSAxLCAoKSA9PiBgRXJyb3IgaW4gYmF0Y2hOb3JtNEQ6IHZhcmlhbmNlIG11c3QgYmUgcmFuayA0IG9yIHJhbmsgMSBgICtcbiAgICAgICAgYGJ1dCBnb3QgcmFuayAkeyR2YXJpYW5jZS5yYW5rfS5gKTtcbiAgICBpZiAoJHNjYWxlICE9IG51bGwpIHtcbiAgICAgICAgdXRpbC5hc3NlcnQoJHNjYWxlLnJhbmsgPT09IDQgfHwgJHNjYWxlLnJhbmsgPT09IDEsICgpID0+IGBFcnJvciBpbiBiYXRjaE5vcm00RDogc2NhbGUgbXVzdCBiZSByYW5rIDQgb3IgcmFuayAxIGAgK1xuICAgICAgICAgICAgYGJ1dCBnb3QgcmFuayAkeyRzY2FsZS5yYW5rfS5gKTtcbiAgICB9XG4gICAgaWYgKCRvZmZzZXQgIT0gbnVsbCkge1xuICAgICAgICB1dGlsLmFzc2VydCgkb2Zmc2V0LnJhbmsgPT09IDQgfHwgJG9mZnNldC5yYW5rID09PSAxLCAoKSA9PiBgRXJyb3IgaW4gYmF0Y2hOb3JtNEQ6IG9mZnNldCBtdXN0IGJlIHJhbmsgNCBvciByYW5rIDEgYCArXG4gICAgICAgICAgICBgYnV0IGdvdCByYW5rICR7JG9mZnNldC5yYW5rfS5gKTtcbiAgICB9XG4gICAgcmV0dXJuIGJhdGNoTm9ybSgkeCwgJG1lYW4sICR2YXJpYW5jZSwgJG9mZnNldCwgJHNjYWxlLCB2YXJpYW5jZUVwc2lsb24pO1xufVxuZXhwb3J0IGNvbnN0IGJhdGNoTm9ybTRkID0gb3AoeyBiYXRjaE5vcm00ZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iYXRjaG5vcm00ZC5qcy5tYXAiLCJpbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbmV4cG9ydCBmdW5jdGlvbiB4QXM0RCh4KSB7XG4gICAgbGV0IHg0RDtcbiAgICBpZiAoeC5yYW5rID09PSAwIHx8IHgucmFuayA9PT0gMSkge1xuICAgICAgICB4NEQgPSByZXNoYXBlKHgsIFsxLCAxLCAxLCB4LnNpemVdKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoeC5yYW5rID09PSAyKSB7XG4gICAgICAgIHg0RCA9IHJlc2hhcGUoeCwgWzEsIDEsIHguc2hhcGVbMF0sIHguc2hhcGVbMV1dKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoeC5yYW5rID09PSAzKSB7XG4gICAgICAgIHg0RCA9IHJlc2hhcGUoeCwgWzEsIHguc2hhcGVbMF0sIHguc2hhcGVbMV0sIHguc2hhcGVbMl1dKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHg0RCA9IHg7XG4gICAgfVxuICAgIHJldHVybiB4NEQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iYXRjaG5vcm1fdXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgQmluY291bnQgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogT3V0cHV0cyBhIHZlY3RvciB3aXRoIGxlbmd0aCBgc2l6ZWAgYW5kIHRoZSBzYW1lIGR0eXBlIGFzIGB3ZWlnaHRzYC5cbiAqXG4gKiBJZiBgd2VpZ2h0c2AgYXJlIGVtcHR5LCB0aGVuIGluZGV4IGBpYCBzdG9yZXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgdmFsdWVcbiAqIGBpYCBpcyBjb3VudGVkIGluIGB4YC4gSWYgYHdlaWdodHNgIGFyZSBub24tZW1wdHksIHRoZW4gaW5kZXggYGlgIHN0b3JlcyB0aGVcbiAqIHN1bSBvZiB0aGUgdmFsdWUgaW4gYHdlaWdodHNgIGF0IGVhY2ggaW5kZXggd2hlcmUgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgaW5cbiAqIGB4YCBpcyBgaWAuXG4gKlxuICogVmFsdWVzIGluIGB4YCBvdXRzaWRlIG9mIHRoZSByYW5nZSBbMCwgc2l6ZSkgYXJlIGlnbm9yZWQuXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IGludCB0ZW5zb3IsIHJhbmsgMS5cbiAqIEBwYXJhbSB3ZWlnaHRzIFRoZSB3ZWlnaHRzIHRlbnNvciwgbXVzdCBoYXZlIHRoZSBzYW1lIHNoYXBlIGFzIHgsIG9yIGFcbiAqICAgICBsZW5ndGgtMCBUZW5zb3IsIGluIHdoaWNoIGNhc2UgaXQgYWN0cyBhcyBhbGwgd2VpZ2h0cyBlcXVhbCB0byAxLlxuICogQHBhcmFtIHNpemUgTm9uLW5lZ2F0aXZlIGludGVnZXIuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnUmVkdWN0aW9uJ31cbiAqL1xuZnVuY3Rpb24gYmluY291bnRfKHgsIHdlaWdodHMsIHNpemUpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdiaW5jb3VudCcpO1xuICAgIGNvbnN0ICR3ZWlnaHRzID0gY29udmVydFRvVGVuc29yKHdlaWdodHMsICd3ZWlnaHRzJywgJ2JpbmNvdW50Jyk7XG4gICAgdXRpbC5hc3NlcnQoJHguZHR5cGUgPT09ICdpbnQzMicsICgpID0+IGBFcnJvciBpbiBiaW5jb3VudDogaW5wdXQgYCArXG4gICAgICAgIGBkdHlwZSBtdXN0IGJlIGludDMyLCBidXQgZ290ICR7JHguZHR5cGV9YCk7XG4gICAgdXRpbC5hc3NlcnQoc2l6ZSA+PSAwLCAoKSA9PiBgc2l6ZSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSwgYnV0IGdvdCAke3NpemV9LmApO1xuICAgIHV0aWwuYXNzZXJ0KCR3ZWlnaHRzLnNpemUgPT09ICR4LnNpemUgfHwgJHdlaWdodHMuc2l6ZSA9PT0gMCwgKCkgPT4gYEVycm9yIGluIGJpbmNvdW50OiB3ZWlnaHRzIG11c3QgaGF2ZSB0aGUgc2FtZSBzaXplIGFzIGlucHV0IG9yYCArXG4gICAgICAgIGAwLWxlbmd0aCwgYnV0IGdvdCBpbnB1dCBzaGFwZTogJHskeC5zaGFwZX0sIHdlaWdodHMgc2hhcGU6IGAgK1xuICAgICAgICBgJHskd2VpZ2h0cy5zaGFwZX0uYCk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCwgd2VpZ2h0czogJHdlaWdodHMgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgc2l6ZSB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEJpbmNvdW50LCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBiaW5jb3VudCA9IG9wKHsgYmluY291bnRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmluY291bnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBnYXRoZXIgfSBmcm9tICcuL2dhdGhlcic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbmltcG9ydCB7IHNxdWVlemUgfSBmcm9tICcuL3NxdWVlemUnO1xuaW1wb3J0IHsgd2hlcmVBc3luYyB9IGZyb20gJy4vd2hlcmVfYXN5bmMnO1xuLyoqXG4gKiBBcHBseSBib29sZWFuIG1hc2sgdG8gdGVuc29yLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB0ZW5zb3IgPSB0Zi50ZW5zb3IyZChbMSwgMiwgMywgNCwgNSwgNl0sIFszLCAyXSk7XG4gKiBjb25zdCBtYXNrID0gdGYudGVuc29yMWQoWzEsIDAsIDFdLCAnYm9vbCcpO1xuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGYuYm9vbGVhbk1hc2tBc3luYyh0ZW5zb3IsIG1hc2spO1xuICogcmVzdWx0LnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdGVuc29yIE4tRCB0ZW5zb3IuXG4gKiBAcGFyYW0gbWFzayBLLUQgYm9vbGVhbiB0ZW5zb3IsIEsgPD0gTiBhbmQgSyBtdXN0IGJlIGtub3duIHN0YXRpY2FsbHkuXG4gKiBAcGFyYW0gYXhpcyBBIDAtRCBpbnQgVGVuc29yIHJlcHJlc2VudGluZyB0aGUgYXhpcyBpbiB0ZW5zb3IgdG8gbWFzayBmcm9tLlxuICogICAgIEJ5IGRlZmF1bHQsIGF4aXMgaXMgMCB3aGljaCB3aWxsIG1hc2sgZnJvbSB0aGUgZmlyc3QgZGltZW5zaW9uLlxuICogICAgIE90aGVyd2lzZSBLICsgYXhpcyA8PSBOLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1NsaWNpbmcgYW5kIEpvaW5pbmcnfVxuICovXG5hc3luYyBmdW5jdGlvbiBib29sZWFuTWFza0FzeW5jXyh0ZW5zb3IsIG1hc2ssIGF4aXMpIHtcbiAgICBjb25zdCAkdGVuc29yID0gY29udmVydFRvVGVuc29yKHRlbnNvciwgJ3RlbnNvcicsICdib29sTWFzaycpO1xuICAgIGNvbnN0ICRtYXNrID0gY29udmVydFRvVGVuc29yKG1hc2ssICdtYXNrJywgJ2Jvb2xNYXNrJywgJ2Jvb2wnKTtcbiAgICBjb25zdCBheGlzRnJvbSA9IGF4aXMgPT0gbnVsbCA/IDAgOiBheGlzO1xuICAgIGNvbnN0IG1hc2tEaW0gPSAkbWFzay5yYW5rO1xuICAgIGNvbnN0IHRlbnNvclNoYXBlID0gJHRlbnNvci5zaGFwZTtcbiAgICB1dGlsLmFzc2VydChtYXNrRGltID4gMCwgKCkgPT4gJ21hc2sgY2Fubm90IGJlIHNjYWxhcicpO1xuICAgIHV0aWwuYXNzZXJ0U2hhcGVzTWF0Y2godGVuc29yU2hhcGUuc2xpY2UoYXhpc0Zyb20sIGF4aXNGcm9tICsgbWFza0RpbSksICRtYXNrLnNoYXBlLCBgbWFzaydzIHNoYXBlIG11c3QgbWF0Y2ggdGhlIGZpcnN0IEsgZGltZW5zaW9ucyBvZiB0ZW5zb3IncyBzaGFwZSxgKTtcbiAgICBsZXQgbGVhZGluZ1NpemUgPSAxO1xuICAgIGZvciAobGV0IGkgPSBheGlzRnJvbTsgaSA8IGF4aXNGcm9tICsgbWFza0RpbTsgaSsrKSB7XG4gICAgICAgIGxlYWRpbmdTaXplICo9IHRlbnNvclNoYXBlW2ldO1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXRUZW5zb3JTaGFwZSA9IHRlbnNvclNoYXBlLnNsaWNlKDAsIGF4aXNGcm9tKVxuICAgICAgICAuY29uY2F0KFtsZWFkaW5nU2l6ZV0sIHRlbnNvclNoYXBlLnNsaWNlKGF4aXNGcm9tICsgbWFza0RpbSkpO1xuICAgIGNvbnN0IHJlc2hhcGVkVGVuc29yID0gcmVzaGFwZSgkdGVuc29yLCB0YXJnZXRUZW5zb3JTaGFwZSk7XG4gICAgY29uc3QgcmVzaGFwZWRNYXNrID0gcmVzaGFwZSgkbWFzaywgWy0xXSk7XG4gICAgY29uc3QgcG9zaXRpdmVQb3NpdGlvbnMgPSBhd2FpdCB3aGVyZUFzeW5jKHJlc2hhcGVkTWFzayk7XG4gICAgY29uc3QgaW5kaWNlcyA9IHNxdWVlemUocG9zaXRpdmVQb3NpdGlvbnMsIFsxXSk7XG4gICAgY29uc3QgcmVzID0gZ2F0aGVyKHJlc2hhcGVkVGVuc29yLCBpbmRpY2VzLCBheGlzRnJvbSk7XG4gICAgLy8gRW5zdXJlIG5vIG1lbW9yeSBsZWFrLlxuICAgIGlmICh0ZW5zb3IgIT09ICR0ZW5zb3IpIHtcbiAgICAgICAgJHRlbnNvci5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGlmIChtYXNrICE9PSAkbWFzaykge1xuICAgICAgICAkbWFzay5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGluZGljZXMuZGlzcG9zZSgpO1xuICAgIHJlc2hhcGVkVGVuc29yLmRpc3Bvc2UoKTtcbiAgICByZXNoYXBlZE1hc2suZGlzcG9zZSgpO1xuICAgIHBvc2l0aXZlUG9zaXRpb25zLmRpc3Bvc2UoKTtcbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IGJvb2xlYW5NYXNrQXN5bmMgPSBib29sZWFuTWFza0FzeW5jXztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJvb2xlYW5fbWFzay5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgVGlsZSB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgY2xvbmUgfSBmcm9tICcuL2Nsb25lJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vcmVzaGFwZSc7XG4vKipcbiAqIEJyb2FkY2FzdCBhbiBhcnJheSB0byBhIGNvbXBhdGlibGUgc2hhcGUgTnVtUHktc3R5bGUuXG4gKlxuICogVGhlIHRlbnNvcidzIHNoYXBlIGlzIGNvbXBhcmVkIHRvIHRoZSBicm9hZGNhc3Qgc2hhcGUgZnJvbSBlbmQgdG8gYmVnaW5uaW5nLlxuICogT25lcyBhcmUgcHJlcGVuZGVkIHRvIHRoZSB0ZW5zb3IncyBzaGFwZSB1bnRpbCBpcyBoYXMgdGhlIHNhbWUgbGVuZ3RoIGFzXG4gKiB0aGUgYnJvYWRjYXN0IHNoYXBlLiBJZiBpbnB1dC5zaGFwZVtpXT09c2hhcGVbaV0sIHRoZSAoaSsxKS10aCBheGlzIGlzXG4gKiBhbHJlYWR5IGJyb2FkY2FzdC1jb21wYXRpYmxlLiBJZiBpbnB1dC5zaGFwZVtpXT09MSBhbmQgc2hhcGVbaV09PU4sIHRoZW5cbiAqIHRoZSBpbnB1dCB0ZW5zb3IgaXMgdGlsZWQgTiB0aW1lcyBhbG9uZyB0aGF0IGF4aXMgKHVzaW5nIHRmLnRpbGUpLlxuICpcbiAqIEBwYXJhbSBpbnB1dCBUaGUgdGVuc29yIHRoYXQgaXMgdG8gYmUgYnJvYWRjYXN0ZWQuXG4gKiBAcGFyYW0gc2hhcGUgVGhlIGlucHV0IGlzIHRvIGJlIGJyb2FkY2FzdCB0byB0aGlzIHNoYXBlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1RyYW5zZm9ybWF0aW9ucyd9XG4gKi9cbmZ1bmN0aW9uIGJyb2FkY2FzdFRvXyh4LCBzaGFwZSkge1xuICAgIGxldCBpbnB1dCA9IGNvbnZlcnRUb1RlbnNvcih4LCAnYnJvYWRjYXN0VG8nLCAneCcpO1xuICAgIGNvbnN0IHhTaGFwZSA9IGlucHV0LnNoYXBlO1xuICAgIGlmIChzaGFwZS5zb21lKGQgPT4gIShkID4gMCkgfHwgZCAlIDEgIT09IDApKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgYnJvYWRjYXN0VG8oKTogSW52YWxpZCBicm9hZGNhc3Qgc2hhcGUgWyR7c2hhcGV9XS5gKTtcbiAgICB9XG4gICAgaWYgKHNoYXBlLmxlbmd0aCA8IGlucHV0LnJhbmspIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBicm9hZGNhc3RUbygpOiBzaGFwZS5sZW5ndGg9JHtzaGFwZS5sZW5ndGh9IDwgaW5wdXQucmFuaz0ke2lucHV0LnJhbmt9LmApO1xuICAgIH1cbiAgICBpZiAoc2hhcGUubGVuZ3RoID4gaW5wdXQucmFuaykge1xuICAgICAgICBjb25zdCBuZXdTaGFwZSA9IGlucHV0LnNoYXBlLnNsaWNlKCk7XG4gICAgICAgIHdoaWxlIChuZXdTaGFwZS5sZW5ndGggPCBzaGFwZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIG5ld1NoYXBlLnVuc2hpZnQoMSk7XG4gICAgICAgIH1cbiAgICAgICAgaW5wdXQgPSByZXNoYXBlKGlucHV0LCBuZXdTaGFwZSk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0U2hhcGUgPSBpbnB1dC5zaGFwZTtcbiAgICBjb25zdCByZXBzID0gQXJyYXkuZnJvbShzaGFwZSk7XG4gICAgZm9yIChsZXQgaSA9IHNoYXBlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGlmIChpbnB1dFNoYXBlW2ldID09PSBzaGFwZVtpXSkge1xuICAgICAgICAgICAgcmVwc1tpXSA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaW5wdXQuc2hhcGVbaV0gIT09IDEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgYnJvYWRjYXN0VG8oKTogWyR7eFNoYXBlfV0gY2Fubm90IGJlIGJyb2FkY2FzdCB0byBbJHtzaGFwZX1dLmApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGF4ZXMgPSByZXBzLm1hcCgobiwgaSkgPT4gbiA+IDEgPyBpIDogLTEpLmZpbHRlcihpID0+IGkgPj0gMCk7XG4gICAgaWYgKGF4ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBjbG9uZShpbnB1dCk7XG4gICAgfVxuICAgIC8vIFRPRE8gY2FsbCBicm9hZGNhc3RUbyBrZXJuZWwgZGlyZWN0bHkgb25jZSBiYWNrZW5kcyBpbXBsZW1lbnQgYnJvYWRjc3RUb1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogaW5wdXQgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgcmVwcyB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFRpbGUsIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IGJyb2FkY2FzdFRvID0gb3AoeyBicm9hZGNhc3RUb18gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1icm9hZGNhc3RfdG8uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBkaW1lbnNpb25zIGluIHRoZSBpbnB1dCBzaGFwZSB0aGF0IGFyZSBicm9hZGNhc3RlZCB0b1xuICogcHJvZHVjZSB0aGUgcHJvdmlkZWQgb3V0cHV0IHNoYXBlLlxuICpcbiAqIFRoZSByZXR1cm5lZCBkaW1lbnNpb25zIGFyZSAwLWluZGV4ZWQgYW5kIHNvcnRlZC4gQW4gZXhhbXBsZTpcbiAqIGluU2hhcGUgPSBbNCwgMSwgM11cbiAqIG91dFNoYXBlID0gWzUsIDQsIDMsIDNdXG4gKiByZXN1bHQgPSBbMV0uIERpbWVuc2lvbiAxICgybmQgZGltZW5zaW9uIG9mIGlucHV0KSBnZXRzIGJyb2FkY2FzdGVkIDEgPT4gMy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJyb2FkY2FzdERpbXMoaW5TaGFwZSwgb3V0U2hhcGUpIHtcbiAgICBjb25zdCBpblJhbmsgPSBpblNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBkaW1zID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpblJhbms7IGkrKykge1xuICAgICAgICBjb25zdCBkaW0gPSBpblJhbmsgLSAxIC0gaTtcbiAgICAgICAgY29uc3QgYSA9IGluU2hhcGVbZGltXSB8fCAxO1xuICAgICAgICBjb25zdCBiID0gb3V0U2hhcGVbb3V0U2hhcGUubGVuZ3RoIC0gMSAtIGldIHx8IDE7XG4gICAgICAgIGlmIChiID4gMSAmJiBhID09PSAxKSB7XG4gICAgICAgICAgICBkaW1zLnVuc2hpZnQoZGltKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGltcztcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgYXhlcyBpbiB0aGUgb3V0cHV0IHNwYWNlIHRoYXQgc2hvdWxkIGJlIHJlZHVjZWQgdG8gcHJvZHVjZVxuICogdGhlIGlucHV0IHNwYWNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVkdWN0aW9uQXhlcyhpblNoYXBlLCBvdXRTaGFwZSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0U2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgaW5EaW0gPSBpblNoYXBlW2luU2hhcGUubGVuZ3RoIC0gaSAtIDFdO1xuICAgICAgICBjb25zdCBvdXRBeGlzID0gb3V0U2hhcGUubGVuZ3RoIC0gaSAtIDE7XG4gICAgICAgIGNvbnN0IG91dERpbSA9IG91dFNoYXBlW291dEF4aXNdO1xuICAgICAgICBpZiAoaW5EaW0gPT0gbnVsbCB8fCAoaW5EaW0gPT09IDEgJiYgb3V0RGltID4gMSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC51bnNoaWZ0KG91dEF4aXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoc2hhcGVBLCBzaGFwZUIpIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBjb25zdCBsID0gTWF0aC5tYXgoc2hhcGVBLmxlbmd0aCwgc2hhcGVCLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgbGV0IGEgPSBzaGFwZUFbc2hhcGVBLmxlbmd0aCAtIGkgLSAxXTtcbiAgICAgICAgaWYgKGEgPT0gbnVsbCkge1xuICAgICAgICAgICAgYSA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGIgPSBzaGFwZUJbc2hhcGVCLmxlbmd0aCAtIGkgLSAxXTtcbiAgICAgICAgaWYgKGIgPT0gbnVsbCkge1xuICAgICAgICAgICAgYiA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGEgPT09IDEpIHtcbiAgICAgICAgICAgIHJlc3VsdC51bnNoaWZ0KGIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGIgPT09IDEpIHtcbiAgICAgICAgICAgIHJlc3VsdC51bnNoaWZ0KGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGEgIT09IGIpIHtcbiAgICAgICAgICAgIGNvbnN0IGVyck1zZyA9IGBPcGVyYW5kcyBjb3VsZCBub3QgYmUgYnJvYWRjYXN0IHRvZ2V0aGVyIHdpdGggc2hhcGVzIGAgK1xuICAgICAgICAgICAgICAgIGAke3NoYXBlQX0gYW5kICR7c2hhcGVCfS5gO1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoZXJyTXNnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdC51bnNoaWZ0KGEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1icm9hZGNhc3RfdXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi4vZW52aXJvbm1lbnQnO1xuaW1wb3J0IHsgRnJvbVBpeGVscyB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBnZXRLZXJuZWwgfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHsgVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBjYXN0IH0gZnJvbSAnLi9jYXN0JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgdGVuc29yM2QgfSBmcm9tICcuL3RlbnNvcjNkJztcbmxldCBmcm9tUGl4ZWxzMkRDb250ZXh0O1xuLyoqXG4gKiBDcmVhdGVzIGEgYHRmLlRlbnNvcmAgZnJvbSBhbiBpbWFnZS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2VEYXRhKDEsIDEpO1xuICogaW1hZ2UuZGF0YVswXSA9IDEwMDtcbiAqIGltYWdlLmRhdGFbMV0gPSAxNTA7XG4gKiBpbWFnZS5kYXRhWzJdID0gMjAwO1xuICogaW1hZ2UuZGF0YVszXSA9IDI1NTtcbiAqXG4gKiB0Zi5icm93c2VyLmZyb21QaXhlbHMoaW1hZ2UpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gcGl4ZWxzIFRoZSBpbnB1dCBpbWFnZSB0byBjb25zdHJ1Y3QgdGhlIHRlbnNvciBmcm9tLiBUaGVcbiAqIHN1cHBvcnRlZCBpbWFnZSB0eXBlcyBhcmUgYWxsIDQtY2hhbm5lbC4gWW91IGNhbiBhbHNvIHBhc3MgaW4gYW4gaW1hZ2VcbiAqIG9iamVjdCB3aXRoIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuICogYHtkYXRhOiBVaW50OEFycmF5OyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlcn1gXG4gKiBAcGFyYW0gbnVtQ2hhbm5lbHMgVGhlIG51bWJlciBvZiBjaGFubmVscyBvZiB0aGUgb3V0cHV0IHRlbnNvci4gQVxuICogbnVtQ2hhbm5lbHMgdmFsdWUgbGVzcyB0aGFuIDQgYWxsb3dzIHlvdSB0byBpZ25vcmUgY2hhbm5lbHMuIERlZmF1bHRzIHRvXG4gKiAzIChpZ25vcmVzIGFscGhhIGNoYW5uZWwgb2YgaW5wdXQgaW1hZ2UpLlxuICpcbiAqIEByZXR1cm5zIEEgVGVuc29yM0Qgd2l0aCB0aGUgc2hhcGUgYFtoZWlnaHQsIHdpZHRoLCBudW1DaGFubmVsc11gLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdCcm93c2VyJywgbmFtZXNwYWNlOiAnYnJvd3NlcicsIGlnbm9yZUNJOiB0cnVlfVxuICovXG5mdW5jdGlvbiBmcm9tUGl4ZWxzXyhwaXhlbHMsIG51bUNoYW5uZWxzID0gMykge1xuICAgIC8vIFNhbml0eSBjaGVja3MuXG4gICAgaWYgKG51bUNoYW5uZWxzID4gNCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjb25zdHJ1Y3QgVGVuc29yIHdpdGggbW9yZSB0aGFuIDQgY2hhbm5lbHMgZnJvbSBwaXhlbHMuJyk7XG4gICAgfVxuICAgIGlmIChwaXhlbHMgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BpeGVscyBwYXNzZWQgdG8gdGYuYnJvd3Nlci5mcm9tUGl4ZWxzKCkgY2FuIG5vdCBiZSBudWxsJyk7XG4gICAgfVxuICAgIGxldCBpc1BpeGVsRGF0YSA9IGZhbHNlO1xuICAgIGxldCBpc0ltYWdlRGF0YSA9IGZhbHNlO1xuICAgIGxldCBpc1ZpZGVvID0gZmFsc2U7XG4gICAgbGV0IGlzSW1hZ2UgPSBmYWxzZTtcbiAgICBsZXQgaXNDYW52YXNMaWtlID0gZmFsc2U7XG4gICAgbGV0IGlzSW1hZ2VCaXRtYXAgPSBmYWxzZTtcbiAgICBpZiAocGl4ZWxzLmRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgICAgIGlzUGl4ZWxEYXRhID0gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIChJbWFnZURhdGEpICE9PSAndW5kZWZpbmVkJyAmJiBwaXhlbHMgaW5zdGFuY2VvZiBJbWFnZURhdGEpIHtcbiAgICAgICAgaXNJbWFnZURhdGEgPSB0cnVlO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgKEhUTUxWaWRlb0VsZW1lbnQpICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICBwaXhlbHMgaW5zdGFuY2VvZiBIVE1MVmlkZW9FbGVtZW50KSB7XG4gICAgICAgIGlzVmlkZW8gPSB0cnVlO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgKEhUTUxJbWFnZUVsZW1lbnQpICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICBwaXhlbHMgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50KSB7XG4gICAgICAgIGlzSW1hZ2UgPSB0cnVlO1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWFueVxuICAgIH1cbiAgICBlbHNlIGlmIChwaXhlbHMuZ2V0Q29udGV4dCAhPSBudWxsKSB7XG4gICAgICAgIGlzQ2FudmFzTGlrZSA9IHRydWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiAoSW1hZ2VCaXRtYXApICE9PSAndW5kZWZpbmVkJyAmJiBwaXhlbHMgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCkge1xuICAgICAgICBpc0ltYWdlQml0bWFwID0gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigncGl4ZWxzIHBhc3NlZCB0byB0Zi5icm93c2VyLmZyb21QaXhlbHMoKSBtdXN0IGJlIGVpdGhlciBhbiAnICtcbiAgICAgICAgICAgIGBIVE1MVmlkZW9FbGVtZW50LCBIVE1MSW1hZ2VFbGVtZW50LCBIVE1MQ2FudmFzRWxlbWVudCwgSW1hZ2VEYXRhIGAgK1xuICAgICAgICAgICAgYGluIGJyb3dzZXIsIG9yIE9mZnNjcmVlbkNhbnZhcywgSW1hZ2VEYXRhIGluIHdlYndvcmtlcmAgK1xuICAgICAgICAgICAgYCBvciB7ZGF0YTogVWludDMyQXJyYXksIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyfSwgYCArXG4gICAgICAgICAgICBgYnV0IHdhcyAke3BpeGVscy5jb25zdHJ1Y3Rvci5uYW1lfWApO1xuICAgIH1cbiAgICBpZiAoaXNWaWRlbykge1xuICAgICAgICBjb25zdCBIQVZFX0NVUlJFTlRfREFUQV9SRUFEWV9TVEFURSA9IDI7XG4gICAgICAgIGlmIChpc1ZpZGVvICYmXG4gICAgICAgICAgICBwaXhlbHMucmVhZHlTdGF0ZSA8XG4gICAgICAgICAgICAgICAgSEFWRV9DVVJSRU5UX0RBVEFfUkVBRFlfU1RBVEUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHZpZGVvIGVsZW1lbnQgaGFzIG5vdCBsb2FkZWQgZGF0YSB5ZXQuIFBsZWFzZSB3YWl0IGZvciAnICtcbiAgICAgICAgICAgICAgICAnYGxvYWRlZGRhdGFgIGV2ZW50IG9uIHRoZSA8dmlkZW8+IGVsZW1lbnQuJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gSWYgdGhlIGN1cnJlbnQgYmFja2VuZCBoYXMgJ0Zyb21QaXhlbHMnIHJlZ2lzdGVyZWQsIGl0IGhhcyBhIG1vcmVcbiAgICAvLyBlZmZpY2llbnQgd2F5IG9mIGhhbmRsaW5nIHBpeGVsIHVwbG9hZHMsIHNvIHdlIGNhbGwgdGhhdC5cbiAgICBjb25zdCBrZXJuZWwgPSBnZXRLZXJuZWwoRnJvbVBpeGVscywgRU5HSU5FLmJhY2tlbmROYW1lKTtcbiAgICBpZiAoa2VybmVsICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgaW5wdXRzID0geyBwaXhlbHMgfTtcbiAgICAgICAgY29uc3QgYXR0cnMgPSB7IG51bUNoYW5uZWxzIH07XG4gICAgICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEZyb21QaXhlbHMsIGlucHV0cywgYXR0cnMpO1xuICAgIH1cbiAgICBjb25zdCBbd2lkdGgsIGhlaWdodF0gPSBpc1ZpZGVvID9cbiAgICAgICAgW1xuICAgICAgICAgICAgcGl4ZWxzLnZpZGVvV2lkdGgsXG4gICAgICAgICAgICBwaXhlbHMudmlkZW9IZWlnaHRcbiAgICAgICAgXSA6XG4gICAgICAgIFtwaXhlbHMud2lkdGgsIHBpeGVscy5oZWlnaHRdO1xuICAgIGxldCB2YWxzO1xuICAgIGlmIChpc0NhbnZhc0xpa2UpIHtcbiAgICAgICAgdmFscyA9XG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgICAgICAgICBwaXhlbHMuZ2V0Q29udGV4dCgnMmQnKS5nZXRJbWFnZURhdGEoMCwgMCwgd2lkdGgsIGhlaWdodCkuZGF0YTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNJbWFnZURhdGEgfHwgaXNQaXhlbERhdGEpIHtcbiAgICAgICAgdmFscyA9IHBpeGVscy5kYXRhO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc0ltYWdlIHx8IGlzVmlkZW8gfHwgaXNJbWFnZUJpdG1hcCkge1xuICAgICAgICBpZiAoZnJvbVBpeGVsczJEQ29udGV4dCA9PSBudWxsKSB7XG4gICAgICAgICAgICBmcm9tUGl4ZWxzMkRDb250ZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJykuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgfVxuICAgICAgICBmcm9tUGl4ZWxzMkRDb250ZXh0LmNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgICAgICBmcm9tUGl4ZWxzMkRDb250ZXh0LmNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIGZyb21QaXhlbHMyRENvbnRleHQuZHJhd0ltYWdlKHBpeGVscywgMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIHZhbHMgPSBmcm9tUGl4ZWxzMkRDb250ZXh0LmdldEltYWdlRGF0YSgwLCAwLCB3aWR0aCwgaGVpZ2h0KS5kYXRhO1xuICAgIH1cbiAgICBsZXQgdmFsdWVzO1xuICAgIGlmIChudW1DaGFubmVscyA9PT0gNCkge1xuICAgICAgICB2YWx1ZXMgPSBuZXcgSW50MzJBcnJheSh2YWxzKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IG51bVBpeGVscyA9IHdpZHRoICogaGVpZ2h0O1xuICAgICAgICB2YWx1ZXMgPSBuZXcgSW50MzJBcnJheShudW1QaXhlbHMgKiBudW1DaGFubmVscyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtUGl4ZWxzOyBpKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgbnVtQ2hhbm5lbHM7ICsrY2hhbm5lbCkge1xuICAgICAgICAgICAgICAgIHZhbHVlc1tpICogbnVtQ2hhbm5lbHMgKyBjaGFubmVsXSA9IHZhbHNbaSAqIDQgKyBjaGFubmVsXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBvdXRTaGFwZSA9IFtoZWlnaHQsIHdpZHRoLCBudW1DaGFubmVsc107XG4gICAgcmV0dXJuIHRlbnNvcjNkKHZhbHVlcywgb3V0U2hhcGUsICdpbnQzMicpO1xufVxuLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgfGZyb21QaXhlbHNBc3luY3wgdG8gY2hlY2sgd2hldGhlciB0aGUgaW5wdXQgY2FuXG4vLyBiZSB3cmFwcGVkIGludG8gaW1hZ2VCaXRtYXAuXG5mdW5jdGlvbiBpc1BpeGVsRGF0YShwaXhlbHMpIHtcbiAgICByZXR1cm4gKHBpeGVscyAhPSBudWxsKSAmJiAocGl4ZWxzLmRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KTtcbn1cbmZ1bmN0aW9uIGlzSW1hZ2VCaXRtYXBGdWxseVN1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgdHlwZW9mIChJbWFnZUJpdG1hcCkgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIHdpbmRvdy5oYXNPd25Qcm9wZXJ0eSgnY3JlYXRlSW1hZ2VCaXRtYXAnKTtcbn1cbmZ1bmN0aW9uIGlzTm9uRW1wdHlQaXhlbHMocGl4ZWxzKSB7XG4gICAgcmV0dXJuIHBpeGVscyAhPSBudWxsICYmIHBpeGVscy53aWR0aCAhPT0gMCAmJiBwaXhlbHMuaGVpZ2h0ICE9PSAwO1xufVxuZnVuY3Rpb24gY2FuV3JhcFBpeGVsc1RvSW1hZ2VCaXRtYXAocGl4ZWxzKSB7XG4gICAgcmV0dXJuIGlzSW1hZ2VCaXRtYXBGdWxseVN1cHBvcnRlZCgpICYmICEocGl4ZWxzIGluc3RhbmNlb2YgSW1hZ2VCaXRtYXApICYmXG4gICAgICAgIGlzTm9uRW1wdHlQaXhlbHMocGl4ZWxzKSAmJiAhaXNQaXhlbERhdGEocGl4ZWxzKTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIGB0Zi5UZW5zb3JgIGZyb20gYW4gaW1hZ2UgaW4gYXN5bmMgd2F5LlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBpbWFnZSA9IG5ldyBJbWFnZURhdGEoMSwgMSk7XG4gKiBpbWFnZS5kYXRhWzBdID0gMTAwO1xuICogaW1hZ2UuZGF0YVsxXSA9IDE1MDtcbiAqIGltYWdlLmRhdGFbMl0gPSAyMDA7XG4gKiBpbWFnZS5kYXRhWzNdID0gMjU1O1xuICpcbiAqIChhd2FpdCB0Zi5icm93c2VyLmZyb21QaXhlbHNBc3luYyhpbWFnZSkpLnByaW50KCk7XG4gKiBgYGBcbiAqIFRoaXMgQVBJIGlzIHRoZSBhc3luYyB2ZXJzaW9uIG9mIGZyb21QaXhlbHMuIFRoZSBBUEkgd2lsbCBmaXJzdFxuICogY2hlY2sgfFdSQVBfVE9fSU1BR0VCSVRNQVB8IGZsYWcsIGFuZCB0cnkgdG8gd3JhcCB0aGUgaW5wdXQgdG9cbiAqIGltYWdlQml0bWFwIGlmIHRoZSBmbGFnIGlzIHNldCB0byB0cnVlLlxuICpcbiAqIEBwYXJhbSBwaXhlbHMgVGhlIGlucHV0IGltYWdlIHRvIGNvbnN0cnVjdCB0aGUgdGVuc29yIGZyb20uIFRoZVxuICogc3VwcG9ydGVkIGltYWdlIHR5cGVzIGFyZSBhbGwgNC1jaGFubmVsLiBZb3UgY2FuIGFsc28gcGFzcyBpbiBhbiBpbWFnZVxuICogb2JqZWN0IHdpdGggZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG4gKiBge2RhdGE6IFVpbnQ4QXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyfWBcbiAqIEBwYXJhbSBudW1DaGFubmVscyBUaGUgbnVtYmVyIG9mIGNoYW5uZWxzIG9mIHRoZSBvdXRwdXQgdGVuc29yLiBBXG4gKiBudW1DaGFubmVscyB2YWx1ZSBsZXNzIHRoYW4gNCBhbGxvd3MgeW91IHRvIGlnbm9yZSBjaGFubmVscy4gRGVmYXVsdHMgdG9cbiAqIDMgKGlnbm9yZXMgYWxwaGEgY2hhbm5lbCBvZiBpbnB1dCBpbWFnZSkuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0Jyb3dzZXInLCBuYW1lc3BhY2U6ICdicm93c2VyJywgaWdub3JlQ0k6IHRydWV9XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmcm9tUGl4ZWxzQXN5bmMocGl4ZWxzLCBudW1DaGFubmVscyA9IDMpIHtcbiAgICBsZXQgaW5wdXRzID0gbnVsbDtcbiAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBiYWNrZW5kIG5lZWRzIHRvIHdyYXAgfHBpeGVsc3wgdG8gaW1hZ2VCaXRtYXAgYW5kXG4gICAgLy8gd2hldGhlciB8cGl4ZWxzfCBjYW4gYmUgd3JhcHBlZCB0byBpbWFnZUJpdG1hcC5cbiAgICBpZiAoZW52KCkuZ2V0Qm9vbCgnV1JBUF9UT19JTUFHRUJJVE1BUCcpICYmXG4gICAgICAgIGNhbldyYXBQaXhlbHNUb0ltYWdlQml0bWFwKHBpeGVscykpIHtcbiAgICAgICAgLy8gRm9yY2UgdGhlIGltYWdlQml0bWFwIGNyZWF0aW9uIHRvIG5vdCBkbyBhbnkgcHJlbXVsdGlwbHkgYWxwaGFcbiAgICAgICAgLy8gb3BzLlxuICAgICAgICBsZXQgaW1hZ2VCaXRtYXA7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyB3cmFwIGluIHRyeS1jYXRjaCBibG9jaywgYmVjYXVzZSBjcmVhdGVJbWFnZUJpdG1hcCBtYXkgbm90IHdvcmtcbiAgICAgICAgICAgIC8vIHByb3Blcmx5IGluIHNvbWUgYnJvd3NlcnMsIGUuZy5cbiAgICAgICAgICAgIC8vIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTEzMzU1OTRcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tYW55XG4gICAgICAgICAgICBpbWFnZUJpdG1hcCA9IGF3YWl0IGNyZWF0ZUltYWdlQml0bWFwKHBpeGVscywgeyBwcmVtdWx0aXBseUFscGhhOiAnbm9uZScgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGltYWdlQml0bWFwID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBjcmVhdGVJbWFnZUJpdG1hcCB3aWxsIGNsaXAgdGhlIHNvdXJjZSBzaXplLlxuICAgICAgICAvLyBJbiBzb21lIGNhc2VzLCB0aGUgaW5wdXQgd2lsbCBoYXZlIGxhcmdlciBzaXplIHRoYW4gaXRzIGNvbnRlbnQuXG4gICAgICAgIC8vIEUuZy4gbmV3IEltYWdlKDEwLCAxMCkgYnV0IHdpdGggMSB4IDEgY29udGVudC4gVXNpbmdcbiAgICAgICAgLy8gY3JlYXRlSW1hZ2VCaXRtYXAgd2lsbCBjbGlwIHRoZSBzaXplIGZyb20gMTAgeCAxMCB0byAxIHggMSwgd2hpY2hcbiAgICAgICAgLy8gaXMgbm90IGNvcnJlY3QuIFdlIHNob3VsZCBhdm9pZCB3cmFwcGluZyBzdWNoIHJlc291Y2UgdG9cbiAgICAgICAgLy8gaW1hZ2VCaXRtYXAuXG4gICAgICAgIGlmIChpbWFnZUJpdG1hcCAhPSBudWxsICYmIGltYWdlQml0bWFwLndpZHRoID09PSBwaXhlbHMud2lkdGggJiZcbiAgICAgICAgICAgIGltYWdlQml0bWFwLmhlaWdodCA9PT0gcGl4ZWxzLmhlaWdodCkge1xuICAgICAgICAgICAgaW5wdXRzID0gaW1hZ2VCaXRtYXA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpbnB1dHMgPSBwaXhlbHM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlucHV0cyA9IHBpeGVscztcbiAgICB9XG4gICAgcmV0dXJuIGZyb21QaXhlbHNfKGlucHV0cywgbnVtQ2hhbm5lbHMpO1xufVxuLyoqXG4gKiBEcmF3cyBhIGB0Zi5UZW5zb3JgIG9mIHBpeGVsIHZhbHVlcyB0byBhIGJ5dGUgYXJyYXkgb3Igb3B0aW9uYWxseSBhXG4gKiBjYW52YXMuXG4gKlxuICogV2hlbiB0aGUgZHR5cGUgb2YgdGhlIGlucHV0IGlzICdmbG9hdDMyJywgd2UgYXNzdW1lIHZhbHVlcyBpbiB0aGUgcmFuZ2VcbiAqIFswLTFdLiBPdGhlcndpc2UsIHdoZW4gaW5wdXQgaXMgJ2ludDMyJywgd2UgYXNzdW1lIHZhbHVlcyBpbiB0aGUgcmFuZ2VcbiAqIFswLTI1NV0uXG4gKlxuICogUmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjYW52YXMgaGFzIGJlZW4gZHJhd24gdG8uXG4gKlxuICogQHBhcmFtIGltZyBBIHJhbmstMiB0ZW5zb3Igd2l0aCBzaGFwZSBgW2hlaWdodCwgd2lkdGhdYCwgb3IgYSByYW5rLTMgdGVuc29yXG4gKiBvZiBzaGFwZSBgW2hlaWdodCwgd2lkdGgsIG51bUNoYW5uZWxzXWAuIElmIHJhbmstMiwgZHJhd3MgZ3JheXNjYWxlLiBJZlxuICogcmFuay0zLCBtdXN0IGhhdmUgZGVwdGggb2YgMSwgMyBvciA0LiBXaGVuIGRlcHRoIG9mIDEsIGRyYXdzXG4gKiBncmF5c2NhbGUuIFdoZW4gZGVwdGggb2YgMywgd2UgZHJhdyB3aXRoIHRoZSBmaXJzdCB0aHJlZSBjb21wb25lbnRzIG9mXG4gKiB0aGUgZGVwdGggZGltZW5zaW9uIGNvcnJlc3BvbmRpbmcgdG8gciwgZywgYiBhbmQgYWxwaGEgPSAxLiBXaGVuIGRlcHRoIG9mXG4gKiA0LCBhbGwgZm91ciBjb21wb25lbnRzIG9mIHRoZSBkZXB0aCBkaW1lbnNpb24gY29ycmVzcG9uZCB0byByLCBnLCBiLCBhLlxuICogQHBhcmFtIGNhbnZhcyBUaGUgY2FudmFzIHRvIGRyYXcgdG8uXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0Jyb3dzZXInLCBuYW1lc3BhY2U6ICdicm93c2VyJ31cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRvUGl4ZWxzKGltZywgY2FudmFzKSB7XG4gICAgbGV0ICRpbWcgPSBjb252ZXJ0VG9UZW5zb3IoaW1nLCAnaW1nJywgJ3RvUGl4ZWxzJyk7XG4gICAgaWYgKCEoaW1nIGluc3RhbmNlb2YgVGVuc29yKSkge1xuICAgICAgICAvLyBBc3N1bWUgaW50MzIgaWYgdXNlciBwYXNzZWQgYSBuYXRpdmUgYXJyYXkuXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsSW1nVGVuc29yID0gJGltZztcbiAgICAgICAgJGltZyA9IGNhc3Qob3JpZ2luYWxJbWdUZW5zb3IsICdpbnQzMicpO1xuICAgICAgICBvcmlnaW5hbEltZ1RlbnNvci5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGlmICgkaW1nLnJhbmsgIT09IDIgJiYgJGltZy5yYW5rICE9PSAzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdG9QaXhlbHMgb25seSBzdXBwb3J0cyByYW5rIDIgb3IgMyB0ZW5zb3JzLCBnb3QgcmFuayAkeyRpbWcucmFua30uYCk7XG4gICAgfVxuICAgIGNvbnN0IFtoZWlnaHQsIHdpZHRoXSA9ICRpbWcuc2hhcGUuc2xpY2UoMCwgMik7XG4gICAgY29uc3QgZGVwdGggPSAkaW1nLnJhbmsgPT09IDIgPyAxIDogJGltZy5zaGFwZVsyXTtcbiAgICBpZiAoZGVwdGggPiA0IHx8IGRlcHRoID09PSAyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdG9QaXhlbHMgb25seSBzdXBwb3J0cyBkZXB0aCBvZiBzaXplIGAgK1xuICAgICAgICAgICAgYDEsIDMgb3IgNCBidXQgZ290ICR7ZGVwdGh9YCk7XG4gICAgfVxuICAgIGlmICgkaW1nLmR0eXBlICE9PSAnZmxvYXQzMicgJiYgJGltZy5kdHlwZSAhPT0gJ2ludDMyJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHR5cGUgZm9yIHRvUGl4ZWxzOiAkeyRpbWcuZHR5cGV9LmAgK1xuICAgICAgICAgICAgYCBQbGVhc2UgdXNlIGZsb2F0MzIgb3IgaW50MzIgdGVuc29ycy5gKTtcbiAgICB9XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0ICRpbWcuZGF0YSgpO1xuICAgIGNvbnN0IG11bHRpcGxpZXIgPSAkaW1nLmR0eXBlID09PSAnZmxvYXQzMicgPyAyNTUgOiAxO1xuICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHdpZHRoICogaGVpZ2h0ICogNCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWlnaHQgKiB3aWR0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IHJnYmEgPSBbMCwgMCwgMCwgMjU1XTtcbiAgICAgICAgZm9yIChsZXQgZCA9IDA7IGQgPCBkZXB0aDsgZCsrKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGRhdGFbaSAqIGRlcHRoICsgZF07XG4gICAgICAgICAgICBpZiAoJGltZy5kdHlwZSA9PT0gJ2Zsb2F0MzInKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUZW5zb3IgdmFsdWVzIGZvciBhIGZsb2F0MzIgVGVuc29yIG11c3QgYmUgaW4gdGhlIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYHJhbmdlIFswIC0gMV0gYnV0IGVuY291bnRlcmVkICR7dmFsdWV9LmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCRpbWcuZHR5cGUgPT09ICdpbnQzMicpIHtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gMjU1KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGVuc29yIHZhbHVlcyBmb3IgYSBpbnQzMiBUZW5zb3IgbXVzdCBiZSBpbiB0aGUgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgcmFuZ2UgWzAgLSAyNTVdIGJ1dCBlbmNvdW50ZXJlZCAke3ZhbHVlfS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGVwdGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZ2JhWzBdID0gdmFsdWUgKiBtdWx0aXBsaWVyO1xuICAgICAgICAgICAgICAgIHJnYmFbMV0gPSB2YWx1ZSAqIG11bHRpcGxpZXI7XG4gICAgICAgICAgICAgICAgcmdiYVsyXSA9IHZhbHVlICogbXVsdGlwbGllcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJnYmFbZF0gPSB2YWx1ZSAqIG11bHRpcGxpZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaiA9IGkgKiA0O1xuICAgICAgICBieXRlc1tqICsgMF0gPSBNYXRoLnJvdW5kKHJnYmFbMF0pO1xuICAgICAgICBieXRlc1tqICsgMV0gPSBNYXRoLnJvdW5kKHJnYmFbMV0pO1xuICAgICAgICBieXRlc1tqICsgMl0gPSBNYXRoLnJvdW5kKHJnYmFbMl0pO1xuICAgICAgICBieXRlc1tqICsgM10gPSBNYXRoLnJvdW5kKHJnYmFbM10pO1xuICAgIH1cbiAgICBpZiAoY2FudmFzICE9IG51bGwpIHtcbiAgICAgICAgY2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICBjb25zdCBpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKGJ5dGVzLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgY3R4LnB1dEltYWdlRGF0YShpbWFnZURhdGEsIDAsIDApO1xuICAgIH1cbiAgICBpZiAoJGltZyAhPT0gaW1nKSB7XG4gICAgICAgICRpbWcuZGlzcG9zZSgpO1xuICAgIH1cbiAgICByZXR1cm4gYnl0ZXM7XG59XG5leHBvcnQgY29uc3QgZnJvbVBpeGVscyA9IG9wKHsgZnJvbVBpeGVsc18gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1icm93c2VyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFRlbnNvckJ1ZmZlciB9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuLyoqXG4gKiBDcmVhdGVzIGFuIGVtcHR5IGB0Zi5UZW5zb3JCdWZmZXJgIHdpdGggdGhlIHNwZWNpZmllZCBgc2hhcGVgIGFuZCBgZHR5cGVgLlxuICpcbiAqIFRoZSB2YWx1ZXMgYXJlIHN0b3JlZCBpbiBDUFUgYXMgYFR5cGVkQXJyYXlgLiBGaWxsIHRoZSBidWZmZXIgdXNpbmdcbiAqIGBidWZmZXIuc2V0KClgLCBvciBieSBtb2RpZnlpbmcgZGlyZWN0bHkgYGJ1ZmZlci52YWx1ZXNgLlxuICpcbiAqIFdoZW4gZG9uZSwgY2FsbCBgYnVmZmVyLnRvVGVuc29yKClgIHRvIGdldCBhbiBpbW11dGFibGUgYHRmLlRlbnNvcmAgd2l0aFxuICogdGhvc2UgdmFsdWVzLlxuICpcbiAqIGBgYGpzXG4gKiAvLyBDcmVhdGUgYSBidWZmZXIgYW5kIHNldCB2YWx1ZXMgYXQgcGFydGljdWxhciBpbmRpY2VzLlxuICogY29uc3QgYnVmZmVyID0gdGYuYnVmZmVyKFsyLCAyXSk7XG4gKiBidWZmZXIuc2V0KDMsIDAsIDApO1xuICogYnVmZmVyLnNldCg1LCAxLCAwKTtcbiAqXG4gKiAvLyBDb252ZXJ0IHRoZSBidWZmZXIgYmFjayB0byBhIHRlbnNvci5cbiAqIGJ1ZmZlci50b1RlbnNvcigpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gc2hhcGUgQW4gYXJyYXkgb2YgaW50ZWdlcnMgZGVmaW5pbmcgdGhlIG91dHB1dCB0ZW5zb3Igc2hhcGUuXG4gKiBAcGFyYW0gZHR5cGUgVGhlIGR0eXBlIG9mIHRoZSBidWZmZXIuIERlZmF1bHRzIHRvICdmbG9hdDMyJy5cbiAqIEBwYXJhbSB2YWx1ZXMgVGhlIHZhbHVlcyBvZiB0aGUgYnVmZmVyIGFzIGBUeXBlZEFycmF5YC4gRGVmYXVsdHMgdG9cbiAqIHplcm9zLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1ZmZlcihzaGFwZSwgZHR5cGUgPSAnZmxvYXQzMicsIHZhbHVlcykge1xuICAgIGR0eXBlID0gZHR5cGUgfHwgJ2Zsb2F0MzInO1xuICAgIHV0aWwuYXNzZXJ0Tm9uTmVnYXRpdmVJbnRlZ2VyRGltZW5zaW9ucyhzaGFwZSk7XG4gICAgcmV0dXJuIG5ldyBUZW5zb3JCdWZmZXIoc2hhcGUsIGR0eXBlLCB2YWx1ZXMpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YnVmZmVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBDYXN0IH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENhc3RzIGEgYHRmLlRlbnNvcmAgdG8gYSBuZXcgZHR5cGUuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMS41LCAyLjUsIDNdKTtcbiAqIHRmLmNhc3QoeCwgJ2ludDMyJykucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciB0byBiZSBjYXN0ZWQuXG4gKiBAcGFyYW0gZHR5cGUgVGhlIGR0eXBlIHRvIGNhc3QgdGhlIGlucHV0IHRlbnNvciB0by5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdUcmFuc2Zvcm1hdGlvbnMnfVxuICovXG5mdW5jdGlvbiBjYXN0Xyh4LCBkdHlwZSkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2Nhc3QnKTtcbiAgICAvLyBTYW5pdHkgY2hlY2tzLlxuICAgIGlmICghdXRpbC5pc1ZhbGlkRHR5cGUoZHR5cGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGNhc3QgdG8gdW5rbm93biBkdHlwZSAke2R0eXBlfWApO1xuICAgIH1cbiAgICBpZiAoZHR5cGUgPT09ICdzdHJpbmcnICYmICR4LmR0eXBlICE9PSAnc3RyaW5nJyB8fFxuICAgICAgICBkdHlwZSAhPT0gJ3N0cmluZycgJiYgJHguZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignT25seSBzdHJpbmdzIGNhbiBiZSBjYXN0ZWQgdG8gc3RyaW5ncycpO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgY29uc3QgYXR0cnMgPSB7IGR0eXBlIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoQ2FzdCwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgY2FzdCA9IG9wKHsgY2FzdF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jYXN0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBDZWlsIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgY2VpbGluZyBvZiBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6IGBjZWlsKHgpYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWy42LCAxLjEsIC0zLjNdKTtcbiAqXG4gKiB4LmNlaWwoKS5wcmludCgpOyAgLy8gb3IgdGYuY2VpbCh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgVGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBjZWlsXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnY2VpbCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChDZWlsLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGNlaWwgPSBvcCh7IGNlaWxfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2VpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgQ2xpcEJ5VmFsdWUgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ2xpcHMgdmFsdWVzIGVsZW1lbnQtd2lzZS4gYG1heChtaW4oeCwgY2xpcFZhbHVlTWF4KSwgY2xpcFZhbHVlTWluKWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFstMSwgMiwgLTMsIDRdKTtcbiAqXG4gKiB4LmNsaXBCeVZhbHVlKC0yLCAzKS5wcmludCgpOyAgLy8gb3IgdGYuY2xpcEJ5VmFsdWUoeCwgLTIsIDMpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gY2xpcFZhbHVlTWluIExvd2VyLWJvdW5kIG9mIHJhbmdlIHRvIGJlIGNsaXBwZWQgdG8uXG4gKiBAcGFyYW0gY2xpcFZhbHVlTWF4IFVwcGVyLWJvdW5kIG9mIHJhbmdlIHRvIGJlIGNsaXBwZWQgdG8uXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGNsaXBCeVZhbHVlXyh4LCBjbGlwVmFsdWVNaW4sIGNsaXBWYWx1ZU1heCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2NsaXBCeVZhbHVlJyk7XG4gICAgdXRpbC5hc3NlcnQoKGNsaXBWYWx1ZU1pbiA8PSBjbGlwVmFsdWVNYXgpLCAoKSA9PiBgRXJyb3IgaW4gY2xpcDogbWluICgke2NsaXBWYWx1ZU1pbn0pIG11c3QgYmUgYCArXG4gICAgICAgIGBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gbWF4ICgke2NsaXBWYWx1ZU1heH0pLmApO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICBjb25zdCBhdHRycyA9IHsgY2xpcFZhbHVlTWluLCBjbGlwVmFsdWVNYXggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChDbGlwQnlWYWx1ZSwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgY2xpcEJ5VmFsdWUgPSBvcCh7IGNsaXBCeVZhbHVlXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNsaXBfYnlfdmFsdWUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IElkZW50aXR5IH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB0ZW5zb3Igd2l0aCB0aGUgc2FtZSB2YWx1ZXMgYW5kIHNoYXBlIGFzIHRoZSBzcGVjaWZpZWRcbiAqIHRlbnNvci5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcihbMSwgMl0pO1xuICpcbiAqIHguY2xvbmUoKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIHRlbnNvciB0byBjbG9uZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmZ1bmN0aW9uIGNsb25lXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnY2xvbmUnLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgLy8gTm90ZSB0aGlzIG9wIGlzIGNhbGxlZCB0Zi5pZGVudGl0eSBpbiBweXRob24uIEhlbmNlIHRoZSBrZXJuZWwgbmFtZSB1c2VkXG4gICAgLy8gaGVyZS5cbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChJZGVudGl0eSwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBjbG9uZSA9IG9wKHsgY2xvbmVfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2xvbmUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IENvbXBsZXggfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29udmVydHMgdHdvIHJlYWwgbnVtYmVycyB0byBhIGNvbXBsZXggbnVtYmVyLlxuICpcbiAqIEdpdmVuIGEgdGVuc29yIGByZWFsYCByZXByZXNlbnRpbmcgdGhlIHJlYWwgcGFydCBvZiBhIGNvbXBsZXggbnVtYmVyLCBhbmQgYVxuICogdGVuc29yIGBpbWFnYCByZXByZXNlbnRpbmcgdGhlIGltYWdpbmFyeSBwYXJ0IG9mIGEgY29tcGxleCBudW1iZXIsIHRoaXNcbiAqIG9wZXJhdGlvbiByZXR1cm5zIGNvbXBsZXggbnVtYmVycyBlbGVtZW50d2lzZSBvZiB0aGUgZm9ybSBbcjAsIGkwLCByMSwgaTFdLFxuICogd2hlcmUgciByZXByZXNlbnRzIHRoZSByZWFsIHBhcnQgYW5kIGkgcmVwcmVzZW50cyB0aGUgaW1hZyBwYXJ0LlxuICpcbiAqIFRoZSBpbnB1dCB0ZW5zb3JzIHJlYWwgYW5kIGltYWcgbXVzdCBoYXZlIHRoZSBzYW1lIHNoYXBlLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCByZWFsID0gdGYudGVuc29yMWQoWzIuMjUsIDMuMjVdKTtcbiAqIGNvbnN0IGltYWcgPSB0Zi50ZW5zb3IxZChbNC43NSwgNS43NV0pO1xuICogY29uc3QgY29tcGxleCA9IHRmLmNvbXBsZXgocmVhbCwgaW1hZyk7XG4gKlxuICogY29tcGxleC5wcmludCgpO1xuICogYGBgXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5mdW5jdGlvbiBjb21wbGV4XyhyZWFsLCBpbWFnKSB7XG4gICAgY29uc3QgJHJlYWwgPSBjb252ZXJ0VG9UZW5zb3IocmVhbCwgJ3JlYWwnLCAnY29tcGxleCcpO1xuICAgIGNvbnN0ICRpbWFnID0gY29udmVydFRvVGVuc29yKGltYWcsICdpbWFnJywgJ2NvbXBsZXgnKTtcbiAgICB1dGlsLmFzc2VydFNoYXBlc01hdGNoKCRyZWFsLnNoYXBlLCAkaW1hZy5zaGFwZSwgYHJlYWwgYW5kIGltYWcgc2hhcGVzLCAkeyRyZWFsLnNoYXBlfSBhbmQgJHskaW1hZy5zaGFwZX0sIGAgK1xuICAgICAgICBgbXVzdCBtYXRjaCBpbiBjYWxsIHRvIHRmLmNvbXBsZXgoKS5gKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHJlYWw6ICRyZWFsLCBpbWFnOiAkaW1hZyB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKENvbXBsZXgsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgY29tcGxleCA9IG9wKHsgY29tcGxleF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb21wbGV4LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBDb25jYXQgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yQXJyYXkgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBjbG9uZSB9IGZyb20gJy4vY2xvbmUnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbmNhdGVuYXRlcyBhIGxpc3Qgb2YgYHRmLlRlbnNvcmBzIGFsb25nIGEgZ2l2ZW4gYXhpcy5cbiAqXG4gKiBUaGUgdGVuc29ycyByYW5rcyBhbmQgdHlwZXMgbXVzdCBtYXRjaCwgYW5kIHRoZWlyIHNpemVzIG11c3QgbWF0Y2ggaW4gYWxsXG4gKiBkaW1lbnNpb25zIGV4Y2VwdCBgYXhpc2AuXG4gKlxuICogQWxzbyBhdmFpbGFibGUgYXJlIHN0cmljdGVyIHJhbmstc3BlY2lmaWMgbWV0aG9kcyB0aGF0IGFzc2VydCB0aGF0XG4gKiBgdGVuc29yc2AgYXJlIG9mIHRoZSBnaXZlbiByYW5rOlxuICogICAtIGB0Zi5jb25jYXQxZGBcbiAqICAgLSBgdGYuY29uY2F0MmRgXG4gKiAgIC0gYHRmLmNvbmNhdDNkYFxuICogICAtIGB0Zi5jb25jYXQ0ZGBcbiAqXG4gKiBFeGNlcHQgYHRmLmNvbmNhdDFkYCAod2hpY2ggZG9lcyBub3QgaGF2ZSBheGlzIHBhcmFtKSwgYWxsIG1ldGhvZHMgaGF2ZVxuICogc2FtZSBzaWduYXR1cmUgYXMgdGhpcyBtZXRob2QuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMl0pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFszLCA0XSk7XG4gKiBhLmNvbmNhdChiKS5wcmludCgpOyAgLy8gb3IgYS5jb25jYXQoYilcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDJdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbMywgNF0pO1xuICogY29uc3QgYyA9IHRmLnRlbnNvcjFkKFs1LCA2XSk7XG4gKiB0Zi5jb25jYXQoW2EsIGIsIGNdKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IyZChbWzEsIDJdLCBbMTAsIDIwXV0pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjJkKFtbMywgNF0sIFszMCwgNDBdXSk7XG4gKiBjb25zdCBheGlzID0gMTtcbiAqIHRmLmNvbmNhdChbYSwgYl0sIGF4aXMpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSB0ZW5zb3JzIEEgbGlzdCBvZiB0ZW5zb3JzIHRvIGNvbmNhdGVuYXRlLlxuICogQHBhcmFtIGF4aXMgVGhlIGF4aXMgdG8gY29uY2F0ZSBhbG9uZy4gRGVmYXVsdHMgdG8gMCAodGhlIGZpcnN0IGRpbSkuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnU2xpY2luZyBhbmQgSm9pbmluZyd9XG4gKi9cbmZ1bmN0aW9uIGNvbmNhdF8odGVuc29ycywgYXhpcyA9IDApIHtcbiAgICBhc3NlcnQodGVuc29ycy5sZW5ndGggPj0gMSwgKCkgPT4gJ1Bhc3MgYXQgbGVhc3Qgb25lIHRlbnNvciB0byBjb25jYXQnKTtcbiAgICBjb25zdCAkdGVuc29ycyA9IGNvbnZlcnRUb1RlbnNvckFycmF5KHRlbnNvcnMsICd0ZW5zb3JzJywgJ2NvbmNhdCcsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICAgIGlmICgkdGVuc29yc1swXS5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgJHRlbnNvcnMuZm9yRWFjaCh0ZW5zb3IgPT4ge1xuICAgICAgICAgICAgaWYgKHRlbnNvci5kdHlwZSAhPT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb25jYXRlbmF0ZSBjb21wbGV4NjQgdGVuc29ycyB3aXRoIGEgdGVuc29yXG4gICAgICAgICAgd2l0aCBkdHlwZSAke3RlbnNvci5kdHlwZX0uIGApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKCR0ZW5zb3JzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gY2xvbmUoJHRlbnNvcnNbMF0pO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dHMgPSAkdGVuc29ycztcbiAgICBjb25zdCBhdHRyID0geyBheGlzIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoQ29uY2F0LCBpbnB1dHMsIGF0dHIpO1xufVxuZXhwb3J0IGNvbnN0IGNvbmNhdCA9IG9wKHsgY29uY2F0XyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbmNhdC5qcy5tYXAiLCJpbXBvcnQgeyBjb25jYXQgfSBmcm9tICcuL2NvbmNhdCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29uY2F0ZW5hdGVzIGEgbGlzdCBvZmB0Zi5UZW5zb3IxRGBzIGFsb25nIGFuIGF4aXMuIFNlZSBgY29uY2F0YCBmb3IgZGV0YWlscy5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgaWY6XG4gKiBBOiBzaGFwZSgzKSA9IHxyMSwgZzEsIGIxfFxuICogQjogc2hhcGUoMikgPSB8cjIsIGcyfFxuICogQyA9IHRmLmNvbmNhdDFkKFtBLCBCXSkgPT0gfHIxLCBnMSwgYjEsIHIyLCBnMnxcbiAqXG4gKiBAcGFyYW0gdGVuc29ycyBBIGxpc3Qgb2ZgdGYuVGVuc29yYHMgdG8gY29uY2F0ZW5hdGUuXG4gKiBAcmV0dXJuIFRoZSBjb25jYXRlbmF0ZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGNvbmNhdDFkXyh0ZW5zb3JzKSB7XG4gICAgcmV0dXJuIGNvbmNhdCh0ZW5zb3JzLCAwIC8qIGF4aXMgKi8pO1xufVxuZXhwb3J0IGNvbnN0IGNvbmNhdDFkID0gb3AoeyBjb25jYXQxZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25jYXRfMWQuanMubWFwIiwiaW1wb3J0IHsgY29uY2F0IH0gZnJvbSAnLi9jb25jYXQnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbmNhdGVuYXRlcyBhIGxpc3Qgb2ZgdGYuVGVuc29yMkRgcyBhbG9uZyBhbiBheGlzLiBTZWUgYGNvbmNhdGAgZm9yIGRldGFpbHMuXG4gKlxuICogRm9yIGV4YW1wbGUsIGlmOlxuICogQTogc2hhcGUoMiwgMykgPSB8IHIxLCBnMSwgYjEgfFxuICogICAgICAgICAgICAgICAgICB8IHIyLCBnMiwgYjIgfFxuICpcbiAqIEI6IHNoYXBlKDIsIDMpID0gfCByMywgZzMsIGIzIHxcbiAqICAgICAgICAgICAgICAgICAgfCByNCwgZzQsIGI0IHxcbiAqXG4gKiBDID0gdGYuY29uY2F0MmQoW0EsIEJdLCBheGlzKVxuICpcbiAqIGlmIGF4aXMgPSAwOlxuICogQzogc2hhcGUoNCwgMykgPSB8IHIxLCBnMSwgYjEgfFxuICogICAgICAgICAgICAgICAgICB8IHIyLCBnMiwgYjIgfFxuICogICAgICAgICAgICAgICAgICB8IHIzLCBnMywgYjMgfFxuICogICAgICAgICAgICAgICAgICB8IHI0LCBnNCwgYjQgfFxuICpcbiAqIGlmIGF4aXMgPSAxOlxuICogQyA9IHNoYXBlKDIsIDYpID0gfCByMSwgZzEsIGIxLCByMywgZzMsIGIzIHxcbiAqICAgICAgICAgICAgICAgICAgIHwgcjIsIGcyLCBiMiwgcjQsIGc0LCBiNCB8XG4gKlxuICpcbiAqIEBwYXJhbSB0ZW5zb3JzIEEgbGlzdCBvZiBgdGYuVGVuc29yYHMgdG8gY29uY2F0ZW5hdGUuXG4gKiBAcGFyYW0gYXhpcyBUaGUgYXhpcyB0byBjb25jYXRlbmF0ZSBhbG9uZy5cbiAqIEByZXR1cm4gVGhlIGNvbmNhdGVuYXRlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gY29uY2F0MmRfKHRlbnNvcnMsIGF4aXMpIHtcbiAgICByZXR1cm4gY29uY2F0KHRlbnNvcnMsIGF4aXMpO1xufVxuZXhwb3J0IGNvbnN0IGNvbmNhdDJkID0gb3AoeyBjb25jYXQyZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25jYXRfMmQuanMubWFwIiwiaW1wb3J0IHsgY29uY2F0IH0gZnJvbSAnLi9jb25jYXQnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbmNhdGVuYXRlcyBhIGxpc3Qgb2YgYHRmLlRlbnNvcjNEYHMgYWxvbmcgYW4gYXhpcy5cbiAqIFNlZSBgY29uY2F0YCBmb3IgZGV0YWlscy5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgaWY6XG4gKiBBOiBzaGFwZSgyLCAxLCAzKSA9IHwgcjEsIGcxLCBiMSB8XG4gKiAgICAgICAgICAgICAgICAgICAgIHwgcjIsIGcyLCBiMiB8XG4gKlxuICogQjogc2hhcGUoMiwgMSwgMykgPSB8IHIzLCBnMywgYjMgfFxuICogICAgICAgICAgICAgICAgICAgICB8IHI0LCBnNCwgYjQgfFxuICpcbiAqIEMgPSB0Zi5jb25jYXQzZChbQSwgQl0sIGF4aXMpXG4gKlxuICogaWYgYXhpcyA9IDA6XG4gKiBDOiBzaGFwZSg0LCAxLCAzKSA9IHwgcjEsIGcxLCBiMSB8XG4gKiAgICAgICAgICAgICAgICAgICAgIHwgcjIsIGcyLCBiMiB8XG4gKiAgICAgICAgICAgICAgICAgICAgIHwgcjMsIGczLCBiMyB8XG4gKiAgICAgICAgICAgICAgICAgICAgIHwgcjQsIGc0LCBiNCB8XG4gKlxuICogaWYgYXhpcyA9IDE6XG4gKiBDOiBzaGFwZSgyLCAyLCAzKSA9IHwgcjEsIGcxLCBiMSwgcjMsIGczLCBiMyB8XG4gKiAgICAgICAgICAgICAgICAgICAgIHwgcjIsIGcyLCBiMiwgcjQsIGc0LCBiNCB8XG4gKlxuICogaWYgYXhpcyA9IDI6XG4gKiBDID0gc2hhcGUoMiwgMSwgNikgPSB8IHIxLCBnMSwgYjEsIHIzLCBnMywgYjMgfFxuICogICAgICAgICAgICAgICAgICAgICAgfCByMiwgZzIsIGIyLCByNCwgZzQsIGI0IHxcbiAqXG4gKiBAcGFyYW0gdGVuc29ycyBBIGxpc3Qgb2ZgdGYuVGVuc29yYHMgdG8gY29uY2F0ZW5hdGUuXG4gKiBAcGFyYW0gYXhpcyBUaGUgYXhpcyB0byBjb25jYXRlIGFsb25nLlxuICogQHJldHVybiBUaGUgY29uY2F0ZW5hdGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBjb25jYXQzZF8odGVuc29ycywgYXhpcykge1xuICAgIHJldHVybiBjb25jYXQodGVuc29ycywgYXhpcyk7XG59XG5leHBvcnQgY29uc3QgY29uY2F0M2QgPSBvcCh7IGNvbmNhdDNkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbmNhdF8zZC5qcy5tYXAiLCJpbXBvcnQgeyBjb25jYXQgfSBmcm9tICcuL2NvbmNhdCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29uY2F0ZW5hdGVzIGEgbGlzdCBvZiBgdGYuVGVuc29yNERgcyBhbG9uZyBhbiBheGlzLlxuICogU2VlIGBjb25jYXRgIGZvciBkZXRhaWxzLlxuICpcbiAqIEBwYXJhbSB0ZW5zb3JzIEEgbGlzdCBvZiBgdGYuVGVuc29yYHMgdG8gY29uY2F0ZW5hdGUuXG4gKiBAcGFyYW0gYXhpcyBUaGUgYXhpcyB0byBjb25jYXRlIGFsb25nLlxuICogQHJldHVybiBUaGUgY29uY2F0ZW5hdGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBjb25jYXQ0ZF8odGVuc29ycywgYXhpcykge1xuICAgIHJldHVybiBjb25jYXQodGVuc29ycywgYXhpcyk7XG59XG5leHBvcnQgY29uc3QgY29uY2F0NGQgPSBvcCh7IGNvbmNhdDRkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbmNhdF80ZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFBhcmFtc0NvbnNpc3RlbnQoc2hhcGVzLCBheGlzKSB7XG4gICAgY29uc3QgcmFuayA9IHNoYXBlc1swXS5sZW5ndGg7XG4gICAgc2hhcGVzLmZvckVhY2goKHNoYXBlLCBpKSA9PiB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHNoYXBlLmxlbmd0aCA9PT0gcmFuaywgKCkgPT4gYEVycm9yIGluIGNvbmNhdCR7cmFua31EOiByYW5rIG9mIHRlbnNvcnNbJHtpfV0gbXVzdCBiZSB0aGUgc2FtZSBgICtcbiAgICAgICAgICAgIGBhcyB0aGUgcmFuayBvZiB0aGUgcmVzdCAoJHtyYW5rfSlgKTtcbiAgICB9KTtcbiAgICB1dGlsLmFzc2VydChheGlzID49IDAgJiYgYXhpcyA8IHJhbmssICgpID0+IGBFcnJvciBpbiBjb25jYXQke3Jhbmt9RDogYXhpcyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgJHtyYW5rIC0gMX0uYCk7XG4gICAgY29uc3QgZmlyc3RTaGFwZSA9IHNoYXBlc1swXTtcbiAgICBzaGFwZXMuZm9yRWFjaCgoc2hhcGUsIGkpID0+IHtcbiAgICAgICAgZm9yIChsZXQgciA9IDA7IHIgPCByYW5rOyByKyspIHtcbiAgICAgICAgICAgIHV0aWwuYXNzZXJ0KChyID09PSBheGlzKSB8fCAoc2hhcGVbcl0gPT09IGZpcnN0U2hhcGVbcl0pLCAoKSA9PiBgRXJyb3IgaW4gY29uY2F0JHtyYW5rfUQ6IFNoYXBlIG9mIHRlbnNvcnNbJHtpfV0gKCR7c2hhcGV9KSBgICtcbiAgICAgICAgICAgICAgICBgZG9lcyBub3QgbWF0Y2ggdGhlIHNoYXBlIG9mIHRoZSByZXN0ICgke2ZpcnN0U2hhcGV9KSBgICtcbiAgICAgICAgICAgICAgICBgYWxvbmcgdGhlIG5vbi1jb25jYXRlbmF0ZWQgYXhpcyAke2l9LmApO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZU91dFNoYXBlKHNoYXBlcywgYXhpcykge1xuICAgIGNvbnN0IG91dHB1dFNoYXBlID0gc2hhcGVzWzBdLnNsaWNlKCk7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzaGFwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgb3V0cHV0U2hhcGVbYXhpc10gKz0gc2hhcGVzW2ldW2F4aXNdO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0U2hhcGU7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25jYXRfdXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IGNhc3QgfSBmcm9tICcuL2Nhc3QnO1xuaW1wb3J0IHsgbWF0TXVsIH0gZnJvbSAnLi9tYXRfbXVsJztcbmltcG9ydCB7IG9uZUhvdCB9IGZyb20gJy4vb25lX2hvdCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHRyYW5zcG9zZSB9IGZyb20gJy4vdHJhbnNwb3NlJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIGNvbmZ1c2lvbiBtYXRyaXggZnJvbSB0cnVlIGxhYmVscyBhbmQgcHJlZGljdGVkIGxhYmVscy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbGFiZWxzID0gdGYudGVuc29yMWQoWzAsIDEsIDIsIDEsIDBdLCAnaW50MzInKTtcbiAqIGNvbnN0IHByZWRpY3Rpb25zID0gdGYudGVuc29yMWQoWzAsIDIsIDIsIDEsIDBdLCAnaW50MzInKTtcbiAqIGNvbnN0IG51bUNsYXNzZXMgPSAzO1xuICogY29uc3Qgb3V0ID0gdGYubWF0aC5jb25mdXNpb25NYXRyaXgobGFiZWxzLCBwcmVkaWN0aW9ucywgbnVtQ2xhc3Nlcyk7XG4gKiBvdXQucHJpbnQoKTtcbiAqIC8vIEV4cGVjdGVkIG91dHB1dCBtYXRyaXg6XG4gKiAvLyBbWzIsIDAsIDBdLFxuICogLy8gIFswLCAxLCAxXSxcbiAqIC8vICBbMCwgMCwgMV1dXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gbGFiZWxzIFRoZSB0YXJnZXQgbGFiZWxzLCBhc3N1bWVkIHRvIGJlIDAtYmFzZWQgaW50ZWdlcnNcbiAqICAgZm9yIHRoZSBjbGFzc2VzLiBUaGUgc2hhcGUgaXMgYFtudW1FeGFtcGxlc11gLCB3aGVyZVxuICogICBgbnVtRXhhbXBsZXNgIGlzIHRoZSBudW1iZXIgb2YgZXhhbXBsZXMgaW5jbHVkZWQuXG4gKiBAcGFyYW0gcHJlZGljdGlvbnMgVGhlIHByZWRpY3RlZCBjbGFzc2VzLCBhc3N1bWVkIHRvIGJlXG4gKiAgIDAtYmFzZWQgaW50ZWdlcnMgZm9yIHRoZSBjbGFzc2VzLiBNdXN0IGhhdmUgdGhlIHNhbWUgc2hhcGUgYXMgYGxhYmVsc2AuXG4gKiBAcGFyYW0gbnVtQ2xhc3NlcyBOdW1iZXIgb2YgYWxsIGNsYXNzZXMsIGFzIGFuIGludGVnZXIuXG4gKiAgIEl0cyB2YWx1ZSBtdXN0IGJlIGxhcmdlciB0aGFuIHRoZSBsYXJnZXN0IGVsZW1lbnQgaW4gYGxhYmVsc2AgYW5kXG4gKiAgIGBwcmVkaWN0aW9uc2AuXG4gKiBAcmV0dXJucyBUaGUgY29uZnVzaW9uIG1hdHJpeCBhcyBhIGludDMyLXR5cGUgMkQgdGVuc29yLiBUaGUgdmFsdWUgYXRcbiAqICAgcm93IGByYCBhbmQgY29sdW1uIGBjYCBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIGV4YW1wbGVzIG9mIGFjdHVhbCBjbGFzc1xuICogICBgcmAgd2VyZSBwcmVkaWN0ZWQgYXMgY2xhc3MgYGNgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0V2YWx1YXRpb24nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uZnVzaW9uTWF0cml4XyhsYWJlbHMsIHByZWRpY3Rpb25zLCBudW1DbGFzc2VzKSB7XG4gICAgY29uc3QgJGxhYmVscyA9IGNvbnZlcnRUb1RlbnNvcihsYWJlbHMsICdsYWJlbHMnLCAnY29uZnVzaW9uTWF0cml4Jyk7XG4gICAgY29uc3QgJHByZWRpY3Rpb25zID0gY29udmVydFRvVGVuc29yKHByZWRpY3Rpb25zLCAncHJlZGljdGlvbnMnLCAnY29uZnVzaW9uTWF0cml4Jyk7XG4gICAgdXRpbC5hc3NlcnQobnVtQ2xhc3NlcyA9PSBudWxsIHx8IG51bUNsYXNzZXMgPiAwICYmIE51bWJlci5pc0ludGVnZXIobnVtQ2xhc3NlcyksICgpID0+IGBJZiBwcm92aWRlZCwgbnVtQ2xhc3NlcyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciwgYCArXG4gICAgICAgIGBidXQgZ290ICR7bnVtQ2xhc3Nlc31gKTtcbiAgICB1dGlsLmFzc2VydCgkbGFiZWxzLnJhbmsgPT09IDEsICgpID0+IGBFeHBlY3RlZCB0aGUgcmFuayBvZiBsYWJlbHMgdG8gYmUgMSwgYnV0IGdvdCAkeyRsYWJlbHMucmFua31gKTtcbiAgICB1dGlsLmFzc2VydCgkcHJlZGljdGlvbnMucmFuayA9PT0gMSwgKCkgPT4gYEV4cGVjdGVkIHRoZSByYW5rIG9mIHByZWRpY3Rpb25zIHRvIGJlIDEsIGAgK1xuICAgICAgICBgYnV0IGdvdCAkeyRwcmVkaWN0aW9ucy5yYW5rfWApO1xuICAgIHV0aWwuYXNzZXJ0KCRsYWJlbHMuc2hhcGVbMF0gPT09ICRwcmVkaWN0aW9ucy5zaGFwZVswXSwgKCkgPT4gYE1pc21hdGNoIGluIHRoZSBudW1iZXIgb2YgZXhhbXBsZXM6IGAgK1xuICAgICAgICBgJHskbGFiZWxzLnNoYXBlWzBdfSB2cy4gJHskcHJlZGljdGlvbnMuc2hhcGVbMF19LiBgICtcbiAgICAgICAgYExhYmVscyBhbmQgcHJlZGljdGlvbnMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGVsZW1lbnRzLmApO1xuICAgIHV0aWwuYXNzZXJ0KG51bUNsYXNzZXMgPiAwICYmIE51bWJlci5pc0ludGVnZXIobnVtQ2xhc3NlcyksICgpID0+IGBudW1DbGFzc2VzIGlzIHJlcXVpcmVkIHRvIGJlIGEgcG9zaXRpdmUgaW50ZWdlciwgYnV0IGdvdCBgICtcbiAgICAgICAgYCR7bnVtQ2xhc3Nlc31gKTtcbiAgICAvLyBUT0RPKGNhaXMpOiBJbiB0aGUgZnV0dXJlLCBpZiBvbmVIb3Qgc3VwcG9ydHMgdGVuc29ycyBpbnB1dHMgZm9yXG4gICAgLy8gICBgbnVtQ2xhc3Nlc2AsIGBjb25mdXNpb25NYXRyaXhgIGNhbiBtYWtlIGBudW1DbGFzc2VzYCBvcHRpb25hbC5cbiAgICBjb25zdCBvbmVIb3RMYWJlbHMgPSBvbmVIb3QoY2FzdCgkbGFiZWxzLCAnaW50MzInKSwgbnVtQ2xhc3Nlcyk7XG4gICAgY29uc3Qgb25lSG90UHJlZGljdGlvbnMgPSBvbmVIb3QoY2FzdCgkcHJlZGljdGlvbnMsICdpbnQzMicpLCBudW1DbGFzc2VzKTtcbiAgICBjb25zdCBvbmVIb3RMYWJlbHNUID0gdHJhbnNwb3NlKG9uZUhvdExhYmVscyk7XG4gICAgY29uc3QgcHJvZHVjdCA9IG1hdE11bChvbmVIb3RMYWJlbHNULCBvbmVIb3RQcmVkaWN0aW9ucyk7XG4gICAgcmV0dXJuIGNhc3QocHJvZHVjdCwgJ2ludDMyJyk7XG59XG5leHBvcnQgY29uc3QgY29uZnVzaW9uTWF0cml4ID0gb3AoeyBjb25mdXNpb25NYXRyaXhfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uZnVzaW9uX21hdHJpeC5qcy5tYXAiLCJpbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IGNvbnYyZCB9IGZyb20gJy4vY29udjJkJztcbmltcG9ydCAqIGFzIGNvbnZfdXRpbCBmcm9tICcuL2NvbnZfdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL3Jlc2hhcGUnO1xuLyoqXG4gKiBDb21wdXRlcyBhIDFEIGNvbnZvbHV0aW9uIG92ZXIgdGhlIGlucHV0IHguXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciwgb2YgcmFuayAzIG9yIHJhbmsgMiwgb2Ygc2hhcGVcbiAqICAgICBgW2JhdGNoLCB3aWR0aCwgaW5DaGFubmVsc11gLiBJZiByYW5rIDIsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciwgcmFuayAzLCBvZiBzaGFwZVxuICogICAgIGBbZmlsdGVyV2lkdGgsIGluRGVwdGgsIG91dERlcHRoXWAuXG4gKiBAcGFyYW0gc3RyaWRlIFRoZSBudW1iZXIgb2YgZW50cmllcyBieSB3aGljaCB0aGUgZmlsdGVyIGlzIG1vdmVkIHJpZ2h0IGF0XG4gKiAgICAgZWFjaCBzdGVwLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobS5cbiAqICAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAtIEZvciBtb3JlIGluZm8sIHNlZSB0aGlzIGd1aWRlOlxuICogICAgIFtodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb25dKFxuICogICAgICAgICAgaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uKVxuICogQHBhcmFtIGRhdGFGb3JtYXQgQW4gb3B0aW9uYWwgc3RyaW5nIGZyb20gXCJOV0NcIiwgXCJOQ1dcIi4gRGVmYXVsdHMgdG8gXCJOV0NcIixcbiAqICAgICB0aGUgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIG9yZGVyIG9mIFtiYXRjaCwgaW5fd2lkdGgsIGluX2NoYW5uZWxzXS4gT25seVxuICogICAgIFwiTldDXCIgaXMgY3VycmVudGx5IHN1cHBvcnRlZC5cbiAqIEBwYXJhbSBkaWxhdGlvbiBUaGUgZGlsYXRpb24gcmF0ZSBpbiB3aGljaCB3ZSBzYW1wbGUgaW5wdXQgdmFsdWVzIGluXG4gKiAgICAgYXRyb3VzIGNvbnZvbHV0aW9uLiBEZWZhdWx0cyB0byBgMWAuIElmIGl0IGlzIGdyZWF0ZXIgdGhhbiAxLCB0aGVuXG4gKiAgICAgc3RyaWRlIG11c3QgYmUgYDFgLlxuICogQHBhcmFtIGRpbVJvdW5kaW5nTW9kZSBBIHN0cmluZyBmcm9tOiAnY2VpbCcsICdyb3VuZCcsICdmbG9vcicuIElmIG5vbmUgaXNcbiAqICAgICBwcm92aWRlZCwgaXQgd2lsbCBkZWZhdWx0IHRvIHRydW5jYXRlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0NvbnZvbHV0aW9uJ31cbiAqL1xuZnVuY3Rpb24gY29udjFkXyh4LCBmaWx0ZXIsIHN0cmlkZSwgcGFkLCBkYXRhRm9ybWF0ID0gJ05XQycsIGRpbGF0aW9uID0gMSwgZGltUm91bmRpbmdNb2RlKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnY29udjFkJyk7XG4gICAgY29uc3QgJGZpbHRlciA9IGNvbnZlcnRUb1RlbnNvcihmaWx0ZXIsICdmaWx0ZXInLCAnY29udjFkJyk7XG4gICAgbGV0IHgzRCA9ICR4O1xuICAgIGxldCByZXNoYXBlZFRvM0QgPSBmYWxzZTtcbiAgICBpZiAoJHgucmFuayA9PT0gMikge1xuICAgICAgICByZXNoYXBlZFRvM0QgPSB0cnVlO1xuICAgICAgICB4M0QgPSByZXNoYXBlKCR4LCBbMSwgJHguc2hhcGVbMF0sICR4LnNoYXBlWzFdXSk7XG4gICAgfVxuICAgIHV0aWwuYXNzZXJ0KHgzRC5yYW5rID09PSAzLCAoKSA9PiBgRXJyb3IgaW4gY29udjFkOiBpbnB1dCBtdXN0IGJlIHJhbmsgMywgYnV0IGdvdCByYW5rICR7eDNELnJhbmt9LmApO1xuICAgIHV0aWwuYXNzZXJ0KCRmaWx0ZXIucmFuayA9PT0gMywgKCkgPT4gYEVycm9yIGluIGNvbnYxZDogZmlsdGVyIG11c3QgYmUgcmFuayAzLCBidXQgZ290IHJhbmsgYCArXG4gICAgICAgIGAkeyRmaWx0ZXIucmFua30uYCk7XG4gICAgaWYgKGRpbVJvdW5kaW5nTW9kZSAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNJbnQocGFkKSwgKCkgPT4gYEVycm9yIGluIGNvbnYxZDogcGFkIG11c3QgYmUgYW4gaW50ZWdlciB3aGVuIHVzaW5nLCBgICtcbiAgICAgICAgICAgIGBkaW1Sb3VuZGluZ01vZGUgJHtkaW1Sb3VuZGluZ01vZGV9IGJ1dCBnb3QgcGFkICR7cGFkfS5gKTtcbiAgICB9XG4gICAgdXRpbC5hc3NlcnQoeDNELnNoYXBlWzJdID09PSAkZmlsdGVyLnNoYXBlWzFdLCAoKSA9PiBgRXJyb3IgaW4gY29udjFkOiBkZXB0aCBvZiBpbnB1dCAoJHt4M0Quc2hhcGVbMl19KSBtdXN0IG1hdGNoIGAgK1xuICAgICAgICBgaW5wdXQgZGVwdGggZm9yIGZpbHRlciAkeyRmaWx0ZXIuc2hhcGVbMV19LmApO1xuICAgIHV0aWwuYXNzZXJ0KGNvbnZfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlLCBkaWxhdGlvbiksICgpID0+ICdFcnJvciBpbiBjb252MUQ6IEVpdGhlciBzdHJpZGUgb3IgZGlsYXRpb24gbXVzdCBiZSAxLiAnICtcbiAgICAgICAgYEdvdCBzdHJpZGUgJHtzdHJpZGV9IGFuZCBkaWxhdGlvbiAnJHtkaWxhdGlvbn0nYCk7XG4gICAgdXRpbC5hc3NlcnQoZGF0YUZvcm1hdCA9PT0gJ05XQycsICgpID0+IGBFcnJvciBpbiBjb252MWQ6IGdvdCBkYXRhRm9ybWF0IG9mICR7ZGF0YUZvcm1hdH0gYnV0IG9ubHkgTldDIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQuYCk7XG4gICAgY29uc3QgZmlsdGVyNEQgPSByZXNoYXBlKCRmaWx0ZXIsIFsxLCAkZmlsdGVyLnNoYXBlWzBdLCAkZmlsdGVyLnNoYXBlWzFdLCAkZmlsdGVyLnNoYXBlWzJdXSk7XG4gICAgY29uc3QgaW5wdXQ0RCA9IHJlc2hhcGUoeDNELCBbeDNELnNoYXBlWzBdLCAxLCB4M0Quc2hhcGVbMV0sIHgzRC5zaGFwZVsyXV0pO1xuICAgIGNvbnN0IHN0cmlkZXMgPSBbMSwgc3RyaWRlXTtcbiAgICBjb25zdCBkaWxhdGlvbnMgPSBbMSwgZGlsYXRpb25dO1xuICAgIGNvbnN0IGNvbnYyZERhdGFGb3JtYXQgPSAnTkhXQyc7XG4gICAgY29uc3QgcmVzID0gY29udjJkKGlucHV0NEQsIGZpbHRlcjRELCBzdHJpZGVzLCBwYWQsIGNvbnYyZERhdGFGb3JtYXQsIGRpbGF0aW9ucywgZGltUm91bmRpbmdNb2RlKTtcbiAgICBpZiAocmVzaGFwZWRUbzNEKSB7XG4gICAgICAgIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdXSk7XG4gICAgfVxuICAgIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVswXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKTtcbn1cbmV4cG9ydCBjb25zdCBjb252MWQgPSBvcCh7IGNvbnYxZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb252MWQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IENvbnYyRCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCAqIGFzIGNvbnZfdXRpbCBmcm9tICcuL2NvbnZfdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL3Jlc2hhcGUnO1xuLyoqXG4gKiBDb21wdXRlcyBhIDJEIGNvbnZvbHV0aW9uIG92ZXIgdGhlIGlucHV0IHguXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciwgb2YgcmFuayA0IG9yIHJhbmsgMywgb2Ygc2hhcGVcbiAqICAgICBgW2JhdGNoLCBoZWlnaHQsIHdpZHRoLCBpbkNoYW5uZWxzXWAuIElmIHJhbmsgMywgYmF0Y2ggb2YgMSBpc1xuICogYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciwgcmFuayA0LCBvZiBzaGFwZVxuICogICAgIGBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5EZXB0aCwgb3V0RGVwdGhdYC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBjb252b2x1dGlvbjogYFtzdHJpZGVIZWlnaHQsXG4gKiBzdHJpZGVXaWR0aF1gLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobS5cbiAqICAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAtIEZvciBtb3JlIGluZm8sIHNlZSB0aGlzIGd1aWRlOlxuICogICAgIFtodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb25dKFxuICogICAgICAgICAgaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uKVxuICogQHBhcmFtIGRhdGFGb3JtYXQ6IEFuIG9wdGlvbmFsIHN0cmluZyBmcm9tOiBcIk5IV0NcIiwgXCJOQ0hXXCIuIERlZmF1bHRzIHRvXG4gKiAgICAgXCJOSFdDXCIuIFNwZWNpZnkgdGhlIGRhdGEgZm9ybWF0IG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEuIFdpdGggdGhlXG4gKiAgICAgZGVmYXVsdCBmb3JtYXQgXCJOSFdDXCIsIHRoZSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgb3JkZXIgb2Y6IFtiYXRjaCxcbiAqICAgICBoZWlnaHQsIHdpZHRoLCBjaGFubmVsc10uXG4gKiBAcGFyYW0gZGlsYXRpb25zIFRoZSBkaWxhdGlvbiByYXRlczogYFtkaWxhdGlvbkhlaWdodCwgZGlsYXRpb25XaWR0aF1gXG4gKiAgICAgaW4gd2hpY2ggd2Ugc2FtcGxlIGlucHV0IHZhbHVlcyBhY3Jvc3MgdGhlIGhlaWdodCBhbmQgd2lkdGggZGltZW5zaW9uc1xuICogICAgIGluIGF0cm91cyBjb252b2x1dGlvbi4gRGVmYXVsdHMgdG8gYFsxLCAxXWAuIElmIGBkaWxhdGlvbnNgIGlzIGEgc2luZ2xlXG4gKiAgICAgbnVtYmVyLCB0aGVuIGBkaWxhdGlvbkhlaWdodCA9PSBkaWxhdGlvbldpZHRoYC4gSWYgaXQgaXMgZ3JlYXRlciB0aGFuXG4gKiAgICAgMSwgdGhlbiBhbGwgdmFsdWVzIG9mIGBzdHJpZGVzYCBtdXN0IGJlIDEuXG4gKiBAcGFyYW0gZGltUm91bmRpbmdNb2RlIEEgc3RyaW5nIGZyb206ICdjZWlsJywgJ3JvdW5kJywgJ2Zsb29yJy4gSWYgbm9uZSBpc1xuICogICAgIHByb3ZpZGVkLCBpdCB3aWxsIGRlZmF1bHQgdG8gdHJ1bmNhdGUuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQ29udm9sdXRpb24nfVxuICovXG5mdW5jdGlvbiBjb252MmRfKHgsIGZpbHRlciwgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0ID0gJ05IV0MnLCBkaWxhdGlvbnMgPSBbMSwgMV0sIGRpbVJvdW5kaW5nTW9kZSkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2NvbnYyZCcpO1xuICAgIGNvbnN0ICRmaWx0ZXIgPSBjb252ZXJ0VG9UZW5zb3IoZmlsdGVyLCAnZmlsdGVyJywgJ2NvbnYyZCcpO1xuICAgIGxldCB4NEQgPSAkeDtcbiAgICBsZXQgcmVzaGFwZWRUbzREID0gZmFsc2U7XG4gICAgaWYgKCR4LnJhbmsgPT09IDMpIHtcbiAgICAgICAgcmVzaGFwZWRUbzREID0gdHJ1ZTtcbiAgICAgICAgeDREID0gcmVzaGFwZSgkeCwgWzEsICR4LnNoYXBlWzBdLCAkeC5zaGFwZVsxXSwgJHguc2hhcGVbMl1dKTtcbiAgICB9XG4gICAgdXRpbC5hc3NlcnQoeDRELnJhbmsgPT09IDQsICgpID0+IGBFcnJvciBpbiBjb252MmQ6IGlucHV0IG11c3QgYmUgcmFuayA0LCBidXQgZ290IHJhbmsgJHt4NEQucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoJGZpbHRlci5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gY29udjJkOiBmaWx0ZXIgbXVzdCBiZSByYW5rIDQsIGJ1dCBnb3QgcmFuayBgICtcbiAgICAgICAgYCR7JGZpbHRlci5yYW5rfS5gKTtcbiAgICBpZiAoZGltUm91bmRpbmdNb2RlICE9IG51bGwpIHtcbiAgICAgICAgdXRpbC5hc3NlcnQodXRpbC5pc0ludChwYWQpLCAoKSA9PiBgRXJyb3IgaW4gY29udjJkOiBwYWQgbXVzdCBiZSBhbiBpbnRlZ2VyIHdoZW4gdXNpbmcsIGAgK1xuICAgICAgICAgICAgYGRpbVJvdW5kaW5nTW9kZSAke2RpbVJvdW5kaW5nTW9kZX0gYnV0IGdvdCBwYWQgJHtwYWR9LmApO1xuICAgIH1cbiAgICBjb25zdCBpbkRlcHRoID0gZGF0YUZvcm1hdCA9PT0gJ05IV0MnID8geDRELnNoYXBlWzNdIDogeDRELnNoYXBlWzFdO1xuICAgIHV0aWwuYXNzZXJ0KGluRGVwdGggPT09ICRmaWx0ZXIuc2hhcGVbMl0sICgpID0+IGBFcnJvciBpbiBjb252MmQ6IGRlcHRoIG9mIGlucHV0ICgke2luRGVwdGh9KSBtdXN0IG1hdGNoIGAgK1xuICAgICAgICBgaW5wdXQgZGVwdGggZm9yIGZpbHRlciAkeyRmaWx0ZXIuc2hhcGVbMl19LmApO1xuICAgIHV0aWwuYXNzZXJ0KGNvbnZfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgZGlsYXRpb25zKSwgKCkgPT4gJ0Vycm9yIGluIGNvbnYyRDogRWl0aGVyIHN0cmlkZXMgb3IgZGlsYXRpb25zIG11c3QgYmUgMS4gJyArXG4gICAgICAgIGBHb3Qgc3RyaWRlcyAke3N0cmlkZXN9IGFuZCBkaWxhdGlvbnMgJyR7ZGlsYXRpb25zfSdgKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6IHg0RCwgZmlsdGVyOiAkZmlsdGVyIH07XG4gICAgY29uc3QgYXR0cnMgPSB7IHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGlsYXRpb25zLCBkaW1Sb3VuZGluZ01vZGUgfTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgY29uc3QgcmVzID0gRU5HSU5FLnJ1bktlcm5lbChDb252MkQsIGlucHV0cywgYXR0cnMpO1xuICAgIGlmIChyZXNoYXBlZFRvNEQpIHtcbiAgICAgICAgcmV0dXJuIHJlc2hhcGUocmVzLCBbcmVzLnNoYXBlWzFdLCByZXMuc2hhcGVbMl0sIHJlcy5zaGFwZVszXV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IGNvbnYyZCA9IG9wKHsgY29udjJkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnYyZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgQ29udjJEQmFja3Byb3BGaWx0ZXIgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vcmVzaGFwZSc7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBkZXJpdmF0aXZlIG9mIHRoZSBmaWx0ZXIgb2YgYSAyRCBjb252b2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDQgb3IgcmFuayAzIG9mIHNoYXBlXG4gKiAgICAgW2JhdGNoLCBoZWlnaHQsIHdpZHRoLCBpbkNoYW5uZWxzXS4gSWYgcmFuayAzLCBiYXRjaCBvZiAxIGlzIGFzc3VtZWQuXG4gKiBAcGFyYW0gZHkgVGhlIGR5IGltYWdlLCBvZiByYW5rIDQgb3IgcmFuayAzLCBvZiBzaGFwZVxuICogICAgIFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgb3V0RGVwdGhdLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXJTaGFwZSBUaGUgc2hhcGUgb2YgdGhlIGZpbHRlciwgbGVuZ3RoIDQsXG4gKiAgICAgW2ZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGluRGVwdGgsIG91dERlcHRoXS5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBjb252b2x1dGlvbjogW3N0cmlkZUhlaWdodCxcbiAqIHN0cmlkZVdpZHRoXS5cbiAqIEBwYXJhbSBwYWQgQSBzdHJpbmcgZnJvbTogJ3NhbWUnLCAndmFsaWQnLiBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobVxuICogICAgIHVzZWQgaW4gdGhlIGZvcndhcmQgcHJvcCBvZiB0aGUgb3AuXG4gKiBAcGFyYW0gZGF0YUZvcm1hdDogQW4gb3B0aW9uYWwgc3RyaW5nIGZyb206IFwiTkhXQ1wiLCBcIk5DSFdcIi4gRGVmYXVsdHMgdG9cbiAqICAgICBcIk5IV0NcIi4gU3BlY2lmeSB0aGUgZGF0YSBmb3JtYXQgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YS4gV2l0aCB0aGVcbiAqICAgICBkZWZhdWx0IGZvcm1hdCBcIk5IV0NcIiwgdGhlIGRhdGEgaXMgc3RvcmVkIGluIHRoZSBvcmRlciBvZjogW2JhdGNoLFxuICogICAgIGhlaWdodCwgd2lkdGgsIGNoYW5uZWxzXS5cbiAqIEBwYXJhbSBkaW1Sb3VuZGluZ01vZGUgQSBzdHJpbmcgZnJvbTogJ2NlaWwnLCAncm91bmQnLCAnZmxvb3InLiBJZiBub25lIGlzXG4gKiAgICAgcHJvdmlkZWQsIGl0IHdpbGwgZGVmYXVsdCB0byB0cnVuY2F0ZS5cbiAqL1xuZnVuY3Rpb24gY29udjJEQmFja3Byb3BGaWx0ZXJfKHgsIGR5LCBmaWx0ZXJTaGFwZSwgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0ID0gJ05IV0MnLCBkaW1Sb3VuZGluZ01vZGUpIHtcbiAgICBsZXQgeDREID0geDtcbiAgICBpZiAoeC5yYW5rID09PSAzKSB7XG4gICAgICAgIHg0RCA9IHJlc2hhcGUoeCwgWzEsIHguc2hhcGVbMF0sIHguc2hhcGVbMV0sIHguc2hhcGVbMl1dKTtcbiAgICB9XG4gICAgbGV0IGR5NEQgPSBkeTtcbiAgICBpZiAoZHk0RC5yYW5rID09PSAzKSB7XG4gICAgICAgIGR5NEQgPSByZXNoYXBlKGR5LCBbMSwgZHkuc2hhcGVbMF0sIGR5LnNoYXBlWzFdLCBkeS5zaGFwZVsyXV0pO1xuICAgIH1cbiAgICB1dGlsLmFzc2VydCh4NEQucmFuayA9PT0gNCwgKCkgPT4gYEVycm9yIGluIGNvbnYyZERlckZpbHRlcjogaW5wdXQgbXVzdCBiZSByYW5rIDQsIGJ1dCBnb3Qgc2hhcGUgYCArXG4gICAgICAgIGAke3g0RC5zaGFwZX0uYCk7XG4gICAgdXRpbC5hc3NlcnQoZHk0RC5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gY29udjJkRGVyRmlsdGVyOiBkeSBtdXN0IGJlIHJhbmsgNCwgYnV0IGdvdCBzaGFwZSBgICtcbiAgICAgICAgYCR7ZHk0RC5zaGFwZX0uYCk7XG4gICAgdXRpbC5hc3NlcnQoZmlsdGVyU2hhcGUubGVuZ3RoID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gY29udjJkRGVyRmlsdGVyOiBmaWx0ZXJTaGFwZSBtdXN0IGJlIGxlbmd0aCA0LCBidXQgZ290IGAgK1xuICAgICAgICBgJHtmaWx0ZXJTaGFwZX0uYCk7XG4gICAgY29uc3QgaW5EZXB0aCA9IGRhdGFGb3JtYXQgPT09ICdOSFdDJyA/IHg0RC5zaGFwZVszXSA6IHg0RC5zaGFwZVsxXTtcbiAgICBjb25zdCBvdXREZXB0aCA9IGRhdGFGb3JtYXQgPT09ICdOSFdDJyA/IGR5NEQuc2hhcGVbM10gOiBkeTRELnNoYXBlWzFdO1xuICAgIHV0aWwuYXNzZXJ0KGluRGVwdGggPT09IGZpbHRlclNoYXBlWzJdLCAoKSA9PiBgRXJyb3IgaW4gY29udjJkRGVyRmlsdGVyOiBkZXB0aCBvZiBpbnB1dCAke2luRGVwdGh9KSBtdXN0IGAgK1xuICAgICAgICBgbWF0Y2ggaW5wdXQgZGVwdGggaW4gZmlsdGVyICgke2ZpbHRlclNoYXBlWzJdfS5gKTtcbiAgICB1dGlsLmFzc2VydChvdXREZXB0aCA9PT0gZmlsdGVyU2hhcGVbM10sICgpID0+IGBFcnJvciBpbiBjb252MmREZXJGaWx0ZXI6IGRlcHRoIG9mIGR5ICgke291dERlcHRofSkgbXVzdCBgICtcbiAgICAgICAgYG1hdGNoIG91dHB1dCBkZXB0aCBmb3IgZmlsdGVyICgke2ZpbHRlclNoYXBlWzNdfSkuYCk7XG4gICAgaWYgKGRpbVJvdW5kaW5nTW9kZSAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNJbnQocGFkKSwgKCkgPT4gYEVycm9yIGluIGNvbnYyZERlckZpbHRlcjogcGFkIG11c3QgYmUgYW4gaW50ZWdlciB3aGVuIHVzaW5nLCBgICtcbiAgICAgICAgICAgIGBkaW1Sb3VuZGluZ01vZGUgJHtkaW1Sb3VuZGluZ01vZGV9IGJ1dCBnb3QgcGFkICR7cGFkfS5gKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiB4NEQsIGR5OiBkeTREIH07XG4gICAgY29uc3QgYXR0cnMgPSB7IHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGltUm91bmRpbmdNb2RlLCBmaWx0ZXJTaGFwZSB9O1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChDb252MkRCYWNrcHJvcEZpbHRlciwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgY29udjJEQmFja3Byb3BGaWx0ZXIgPSBvcCh7IGNvbnYyREJhY2twcm9wRmlsdGVyXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnYyZF9iYWNrcHJvcF9maWx0ZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IENvbnYyREJhY2twcm9wSW5wdXQgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vcmVzaGFwZSc7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBkZXJpdmF0aXZlIG9mIHRoZSBpbnB1dCBvZiBhIDJEIGNvbnZvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB4U2hhcGUgVGhlIHNoYXBlIG9mIHRoZSBpbnB1dDogW2JhdGNoLCBoZWlnaHQsIHdpZHRoLCBpbkRlcHRoXS5cbiAqIElmIGxlbmd0aCBvZiAzLCBiYXRjaCBvZiAxIGlzIGFzc3VtZWQuXG4gKiBAcGFyYW0gZHkgVGhlIGRlcml2YXRpdmUgb2YgdGhlIG91dHB1dCwgb2YgcmFuayA0IG9yIHJhbmsgMyBvZiBzaGFwZVxuICogICBgW2JhdGNoLCBvdXRIZWlnaHQsIG91dFdpZHRoLCBvdXREZXB0aF1gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXNcbiAqIGFzc3VtZWQuXG4gKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIsIHJhbmsgNCwgb2Ygc2hhcGVcbiAqICAgICBgW2ZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGluRGVwdGgsIG91dERlcHRoXWAuXG4gKiBAcGFyYW0gc3RyaWRlcyBUaGUgc3RyaWRlcyBvZiB0aGUgY29udm9sdXRpb246IGBbc3RyaWRlSGVpZ2h0LFxuICogc3RyaWRlV2lkdGhdYC5cbiAqIEBwYXJhbSBwYWQgVGhlIHR5cGUgb2YgcGFkZGluZyBhbGdvcml0aG0gdXNlZDpcbiAqICAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogQHBhcmFtIGRhdGFGb3JtYXQ6IEFuIG9wdGlvbmFsIHN0cmluZyBmcm9tOiBcIk5IV0NcIiwgXCJOQ0hXXCIuIERlZmF1bHRzIHRvXG4gKiAgICAgXCJOSFdDXCIuIFNwZWNpZnkgdGhlIGRhdGEgZm9ybWF0IG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEuIFdpdGggdGhlXG4gKiAgICAgZGVmYXVsdCBmb3JtYXQgXCJOSFdDXCIsIHRoZSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgb3JkZXIgb2Y6IFtiYXRjaCxcbiAqICAgICBoZWlnaHQsIHdpZHRoLCBjaGFubmVsc10uXG4gKiBAcGFyYW0gZGltUm91bmRpbmdNb2RlIEEgc3RyaW5nIGZyb206ICdjZWlsJywgJ3JvdW5kJywgJ2Zsb29yJy4gSWYgbm9uZSBpc1xuICogICAgIHByb3ZpZGVkLCBpdCB3aWxsIGRlZmF1bHQgdG8gdHJ1bmNhdGUuXG4gKi9cbmZ1bmN0aW9uIGNvbnYyREJhY2twcm9wSW5wdXRfKHhTaGFwZSwgZHksIGZpbHRlciwgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0ID0gJ05IV0MnLCBkaW1Sb3VuZGluZ01vZGUpIHtcbiAgICB1dGlsLmFzc2VydCh4U2hhcGUubGVuZ3RoID09PSBkeS5yYW5rLCAoKSA9PiBgTGVuZ3RoIG9mIGluU2hhcGUgYCArXG4gICAgICAgIGAoJHt4U2hhcGUubGVuZ3RofSkgYW5kIHJhbmsgb2YgZHkgKCR7ZHkucmFua30pIG11c3QgbWF0Y2hgKTtcbiAgICBsZXQgeFNoYXBlNEQgPSB4U2hhcGU7XG4gICAgbGV0IGR5NEQgPSBkeTtcbiAgICBsZXQgcmVzaGFwZWRUbzREID0gZmFsc2U7XG4gICAgaWYgKGR5LnJhbmsgPT09IDMpIHtcbiAgICAgICAgcmVzaGFwZWRUbzREID0gdHJ1ZTtcbiAgICAgICAgZHk0RCA9IHJlc2hhcGUoZHksIFsxLCBkeS5zaGFwZVswXSwgZHkuc2hhcGVbMV0sIGR5LnNoYXBlWzJdXSk7XG4gICAgICAgIHhTaGFwZTREID0gWzEsIHhTaGFwZVswXSwgeFNoYXBlWzFdLCB4U2hhcGVbMl1dO1xuICAgIH1cbiAgICB1dGlsLmFzc2VydCh4U2hhcGU0RC5sZW5ndGggPT09IDQsICgpID0+IGBFcnJvciBpbiBjb252MmREZXJJbnB1dDogaW5TaGFwZSBtdXN0IGJlIGxlbmd0aCA0LCBidXQgZ290IGxlbmd0aCBgICtcbiAgICAgICAgYCR7eFNoYXBlNEQubGVuZ3RofS5gKTtcbiAgICB1dGlsLmFzc2VydChkeTRELnJhbmsgPT09IDQsICgpID0+IGBFcnJvciBpbiBjb252MmREZXJJbnB1dDogZHkgbXVzdCBiZSByYW5rIDQsIGJ1dCBnb3QgYCArXG4gICAgICAgIGByYW5rICR7ZHk0RC5yYW5rfWApO1xuICAgIHV0aWwuYXNzZXJ0KGZpbHRlci5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gY29udjJkRGVySW5wdXQ6IGZpbHRlciBtdXN0IGJlIHJhbmsgNCwgYnV0IGdvdCBgICtcbiAgICAgICAgYHJhbmsgJHtmaWx0ZXIucmFua31gKTtcbiAgICBjb25zdCBpbkRlcHRoID0gZGF0YUZvcm1hdCA9PT0gJ05IV0MnID8geFNoYXBlNERbM10gOiB4U2hhcGU0RFsxXTtcbiAgICBjb25zdCBvdXREZXB0aCA9IGRhdGFGb3JtYXQgPT09ICdOSFdDJyA/IGR5NEQuc2hhcGVbM10gOiBkeTRELnNoYXBlWzFdO1xuICAgIHV0aWwuYXNzZXJ0KGluRGVwdGggPT09IGZpbHRlci5zaGFwZVsyXSwgKCkgPT4gYEVycm9yIGluIGNvbnYyZERlcklucHV0OiBkZXB0aCBvZiBpbnB1dCAoJHtpbkRlcHRofSkgbXVzdCBgICtcbiAgICAgICAgYG1hdGNoIGlucHV0IGRlcHRoIGZvciBmaWx0ZXIgJHtmaWx0ZXIuc2hhcGVbMl19LmApO1xuICAgIHV0aWwuYXNzZXJ0KG91dERlcHRoID09PSBmaWx0ZXIuc2hhcGVbM10sICgpID0+IGBFcnJvciBpbiBjb252MmREZXJJbnB1dDogZGVwdGggb2Ygb3V0cHV0ICgke291dERlcHRofSkgbXVzdCBgICtcbiAgICAgICAgYG1hdGNoIG91dHB1dCBkZXB0aCBmb3IgZmlsdGVyICR7ZmlsdGVyLnNoYXBlWzNdfS5gKTtcbiAgICBpZiAoZGltUm91bmRpbmdNb2RlICE9IG51bGwpIHtcbiAgICAgICAgdXRpbC5hc3NlcnQodXRpbC5pc0ludChwYWQpLCAoKSA9PiBgRXJyb3IgaW4gY29udjJkRGVySW5wdXQ6IHBhZCBtdXN0IGJlIGFuIGludGVnZXIgd2hlbiB1c2luZywgYCArXG4gICAgICAgICAgICBgZGltUm91bmRpbmdNb2RlICR7ZGltUm91bmRpbmdNb2RlfSBidXQgZ290IHBhZCAke3BhZH0uYCk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0cyA9IHsgZHk6IGR5NEQsIGZpbHRlciB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQsIGRpbVJvdW5kaW5nTW9kZSwgaW5wdXRTaGFwZTogeFNoYXBlNEQgfTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgY29uc3QgcmVzID0gRU5HSU5FLnJ1bktlcm5lbChDb252MkRCYWNrcHJvcElucHV0LCBpbnB1dHMsIGF0dHJzKTtcbiAgICBpZiAocmVzaGFwZWRUbzREKSB7XG4gICAgICAgIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydCBjb25zdCBjb252MkRCYWNrcHJvcElucHV0ID0gb3AoeyBjb252MkRCYWNrcHJvcElucHV0XyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnYyZF9iYWNrcHJvcF9pbnB1dC5qcy5tYXAiLCJpbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgY29udjJEQmFja3Byb3BJbnB1dCB9IGZyb20gJy4vY29udjJkX2JhY2twcm9wX2lucHV0JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgdHJhbnNwb3NlZCAyRCBjb252b2x1dGlvbiBvZiBhbiBpbWFnZSwgYWxzbyBrbm93biBhcyBhXG4gKiBkZWNvbnZvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBpbWFnZSwgb2YgcmFuayA0IG9yIHJhbmsgMywgb2Ygc2hhcGVcbiAqICAgYFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgaW5EZXB0aF1gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciwgcmFuayA0LCBvZiBzaGFwZVxuICogICAgIGBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgb3V0RGVwdGgsIGluRGVwdGhdYC5cbiAqICAgICBgaW5EZXB0aGAgbXVzdCBtYXRjaCBgaW5EZXB0aGAgaW4gYHhgLlxuICogQHBhcmFtIG91dHB1dFNoYXBlIE91dHB1dCBzaGFwZSwgb2YgcmFuayA0IG9yIHJhbmsgMzpcbiAqICAgICBgW2JhdGNoLCBoZWlnaHQsIHdpZHRoLCBvdXREZXB0aF1gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBvcmlnaW5hbCBjb252b2x1dGlvbjpcbiAqICAgICBgW3N0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGhdYC5cbiAqIEBwYXJhbSBwYWQgIFRoZSB0eXBlIG9mIHBhZGRpbmcgYWxnb3JpdGhtIHVzZWQgaW4gdGhlIG5vbi10cmFuc3Bvc2UgdmVyc2lvblxuICogICAgb2YgdGhlIG9wLlxuICogQHBhcmFtIGRpbVJvdW5kaW5nTW9kZSBBIHN0cmluZyBmcm9tOiAnY2VpbCcsICdyb3VuZCcsICdmbG9vcicuIElmIG5vbmUgaXNcbiAqICAgICBwcm92aWRlZCwgaXQgd2lsbCBkZWZhdWx0IHRvIHRydW5jYXRlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0NvbnZvbHV0aW9uJ31cbiAqL1xuZnVuY3Rpb24gY29udjJkVHJhbnNwb3NlXyh4LCBmaWx0ZXIsIG91dHB1dFNoYXBlLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2NvbnYyZFRyYW5zcG9zZScpO1xuICAgIGNvbnN0ICRmaWx0ZXIgPSBjb252ZXJ0VG9UZW5zb3IoZmlsdGVyLCAnZmlsdGVyJywgJ2NvbnYyZFRyYW5zcG9zZScpO1xuICAgIHJldHVybiBjb252MkRCYWNrcHJvcElucHV0KG91dHB1dFNoYXBlLCAkeCwgJGZpbHRlciwgc3RyaWRlcywgcGFkLCAnTkhXQycsIGRpbVJvdW5kaW5nTW9kZSk7XG59XG5leHBvcnQgY29uc3QgY29udjJkVHJhbnNwb3NlID0gb3AoeyBjb252MmRUcmFuc3Bvc2VfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29udjJkX3RyYW5zcG9zZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgQ29udjNEIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgZWl0aGVyU3RyaWRlc09yRGlsYXRpb25zQXJlT25lIH0gZnJvbSAnLi9jb252X3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbi8qKlxuICogQ29tcHV0ZXMgYSAzRCBjb252b2x1dGlvbiBvdmVyIHRoZSBpbnB1dCB4LlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IsIG9mIHJhbmsgNSBvciByYW5rIDQsIG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgZGVwdGgsIGhlaWdodCwgd2lkdGgsIGNoYW5uZWxzXWAuIElmIHJhbmsgNCxcbiAqIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciwgcmFuayA1LCBvZiBzaGFwZVxuICogICAgIGBbZmlsdGVyRGVwdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGluQ2hhbm5lbHMsIG91dENoYW5uZWxzXWAuXG4gKiAgICAgIGluQ2hhbm5lbHMgbXVzdCBtYXRjaCBiZXR3ZWVuIGlucHV0IGFuZCBmaWx0ZXIuXG4gKiBAcGFyYW0gc3RyaWRlcyBUaGUgc3RyaWRlcyBvZiB0aGUgY29udm9sdXRpb246IGBbc3RyaWRlRGVwdGgsIHN0cmlkZUhlaWdodCxcbiAqIHN0cmlkZVdpZHRoXWAuXG4gKiBAcGFyYW0gcGFkIFRoZSB0eXBlIG9mIHBhZGRpbmcgYWxnb3JpdGhtLlxuICogICAgLSBgc2FtZWAgYW5kIHN0cmlkZSAxOiBvdXRwdXQgd2lsbCBiZSBvZiBzYW1lIHNpemUgYXMgaW5wdXQsXG4gKiAgICAgICByZWdhcmRsZXNzIG9mIGZpbHRlciBzaXplLlxuICogICAgLSBgdmFsaWRgOiBvdXRwdXQgd2lsbCBiZSBzbWFsbGVyIHRoYW4gaW5wdXQgaWYgZmlsdGVyIGlzIGxhcmdlclxuICogICAgICAgdGhhbiAxeDEuXG4gKiAgIC0gRm9yIG1vcmUgaW5mbywgc2VlIHRoaXMgZ3VpZGU6XG4gKiAgICAgW2h0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbl0oXG4gKiAgICAgICAgICBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb24pXG4gKiBAcGFyYW0gZGF0YUZvcm1hdDogQW4gb3B0aW9uYWwgc3RyaW5nIGZyb206IFwiTkRIV0NcIiwgXCJOQ0RIV1wiLiBEZWZhdWx0cyB0b1xuICogICAgIFwiTkRIV0NcIi4gU3BlY2lmeSB0aGUgZGF0YSBmb3JtYXQgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YS4gV2l0aCB0aGVcbiAqICAgICBkZWZhdWx0IGZvcm1hdCBcIk5ESFdDXCIsIHRoZSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgb3JkZXIgb2Y6IFtiYXRjaCxcbiAqICAgICBkZXB0aCwgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbHNdLiBPbmx5IFwiTkRIV0NcIiBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlxuICogQHBhcmFtIGRpbGF0aW9ucyBUaGUgZGlsYXRpb24gcmF0ZXM6IGBbZGlsYXRpb25EZXB0aCwgZGlsYXRpb25IZWlnaHQsXG4gKiAgICAgZGlsYXRpb25XaWR0aF1gIGluIHdoaWNoIHdlIHNhbXBsZSBpbnB1dCB2YWx1ZXMgYWNyb3NzIHRoZSBoZWlnaHRcbiAqICAgICBhbmQgd2lkdGggZGltZW5zaW9ucyBpbiBhdHJvdXMgY29udm9sdXRpb24uIERlZmF1bHRzIHRvIGBbMSwgMSwgMV1gLlxuICogICAgIElmIGBkaWxhdGlvbnNgIGlzIGEgc2luZ2xlIG51bWJlciwgdGhlblxuICogICAgIGBkaWxhdGlvbkRlcHRoID09IGRpbGF0aW9uSGVpZ2h0ID09IGRpbGF0aW9uV2lkdGhgLiBJZiBpdCBpcyBncmVhdGVyXG4gKiAgICAgdGhhbiAxLCB0aGVuIGFsbCB2YWx1ZXMgb2YgYHN0cmlkZXNgIG11c3QgYmUgMS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdDb252b2x1dGlvbid9XG4gKi9cbmZ1bmN0aW9uIGNvbnYzZF8oeCwgZmlsdGVyLCBzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQgPSAnTkRIV0MnLCBkaWxhdGlvbnMgPSBbMSwgMSwgMV0pIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdjb252M2QnKTtcbiAgICBjb25zdCAkZmlsdGVyID0gY29udmVydFRvVGVuc29yKGZpbHRlciwgJ2ZpbHRlcicsICdjb252M2QnKTtcbiAgICBsZXQgeDVEID0gJHg7XG4gICAgbGV0IHJlc2hhcGVkVG81RCA9IGZhbHNlO1xuICAgIGlmICgkeC5yYW5rID09PSA0KSB7XG4gICAgICAgIHJlc2hhcGVkVG81RCA9IHRydWU7XG4gICAgICAgIHg1RCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV0sICR4LnNoYXBlWzJdLCAkeC5zaGFwZVszXV0pO1xuICAgIH1cbiAgICB1dGlsLmFzc2VydCh4NUQucmFuayA9PT0gNSwgKCkgPT4gYEVycm9yIGluIGNvbnYzZDogaW5wdXQgbXVzdCBiZSByYW5rIDUsIGJ1dCBnb3QgcmFuayAke3g1RC5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydCgkZmlsdGVyLnJhbmsgPT09IDUsICgpID0+IGBFcnJvciBpbiBjb252M2Q6IGZpbHRlciBtdXN0IGJlIHJhbmsgNSwgYnV0IGdvdCByYW5rIGAgK1xuICAgICAgICBgJHskZmlsdGVyLnJhbmt9LmApO1xuICAgIHV0aWwuYXNzZXJ0KHg1RC5zaGFwZVs0XSA9PT0gJGZpbHRlci5zaGFwZVszXSwgKCkgPT4gYEVycm9yIGluIGNvbnYzZDogZGVwdGggb2YgaW5wdXQgKCR7eDVELnNoYXBlWzRdfSkgbXVzdCBtYXRjaCBgICtcbiAgICAgICAgYGlucHV0IGRlcHRoIGZvciBmaWx0ZXIgJHskZmlsdGVyLnNoYXBlWzNdfS5gKTtcbiAgICB1dGlsLmFzc2VydChlaXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgZGlsYXRpb25zKSwgKCkgPT4gJ0Vycm9yIGluIGNvbnYzRDogRWl0aGVyIHN0cmlkZXMgb3IgZGlsYXRpb25zIG11c3QgYmUgMS4gJyArXG4gICAgICAgIGBHb3Qgc3RyaWRlcyAke3N0cmlkZXN9IGFuZCBkaWxhdGlvbnMgJyR7ZGlsYXRpb25zfSdgKTtcbiAgICB1dGlsLmFzc2VydChkYXRhRm9ybWF0ID09PSAnTkRIV0MnLCAoKSA9PiBgRXJyb3IgaW4gY29udjNkOiBnb3QgZGF0YUZvcm1hdCBvZiAke2RhdGFGb3JtYXR9IGJ1dCBvbmx5IE5ESFdDIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQuYCk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiB4NUQsIGZpbHRlcjogJGZpbHRlciB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQsIGRpbGF0aW9ucyB9O1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICBjb25zdCByZXMgPSBFTkdJTkUucnVuS2VybmVsKENvbnYzRCwgaW5wdXRzLCBhdHRycyk7XG4gICAgaWYgKHJlc2hhcGVkVG81RCkge1xuICAgICAgICByZXR1cm4gcmVzaGFwZShyZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdLCByZXMuc2hhcGVbNF1dKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydCBjb25zdCBjb252M2QgPSBvcCh7IGNvbnYzZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb252M2QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IENvbnYzREJhY2twcm9wSW5wdXRWMiB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIGRlcml2YXRpdmUgb2YgdGhlIGlucHV0IG9mIGEgM0QgY29udm9sdXRpb24uXG4gKlxuICogQHBhcmFtIHhTaGFwZSBUaGUgc2hhcGUgb2YgdGhlIGlucHV0OiBbYmF0Y2gsIGRlcHRoLCBoZWlnaHQsIHdpZHRoLFxuICogaW5fY2hhbm5lbHNdLiBJZiBsZW5ndGggb2YgNCwgYmF0Y2ggb2YgMSBpcyBhc3N1bWVkLlxuICogQHBhcmFtIGR5IFRoZSBkZXJpdmF0aXZlIG9mIHRoZSBvdXRwdXQsIG9mIHJhbmsgNSBvciByYW5rIDQgb2Ygc2hhcGVcbiAqICAgYFtiYXRjaCwgb3V0RGVwdGgsIG91dEhlaWdodCwgb3V0V2lkdGgsIGluX2NoYW5uZWxzXWAuXG4gKiBJZiByYW5rIDQsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciwgcmFuayA1LCBvZiBzaGFwZVxuICogICAgIGBbZmlsdGVyRGVwdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGluRGVwdGgsIG91dERlcHRoXWAuXG4gKiBAcGFyYW0gc3RyaWRlcyBUaGUgc3RyaWRlcyBvZiB0aGUgY29udm9sdXRpb246IGBbc3RyaWRlRGVwdGgsIHN0cmlkZUhlaWdodCxcbiAqIHN0cmlkZVdpZHRoXWAuXG4gKiBAcGFyYW0gcGFkIFRoZSB0eXBlIG9mIHBhZGRpbmcgYWxnb3JpdGhtIHVzZWQ6XG4gKiAgICAtIGBzYW1lYCBhbmQgc3RyaWRlIDE6IG91dHB1dCB3aWxsIGJlIG9mIHNhbWUgc2l6ZSBhcyBpbnB1dCxcbiAqICAgICAgIHJlZ2FyZGxlc3Mgb2YgZmlsdGVyIHNpemUuXG4gKiAgICAtIGB2YWxpZGA6IG91dHB1dCB3aWxsIGJlIHNtYWxsZXIgdGhhbiBpbnB1dCBpZiBmaWx0ZXIgaXMgbGFyZ2VyXG4gKiAgICAgICB0aGFuIDF4MS5cbiAqL1xuZnVuY3Rpb24gY29udjNEQmFja3Byb3BJbnB1dF8oeFNoYXBlLCBkeSwgZmlsdGVyLCBzdHJpZGVzLCBwYWQpIHtcbiAgICB1dGlsLmFzc2VydCh4U2hhcGUubGVuZ3RoID09PSBkeS5yYW5rLCAoKSA9PiBgTGVuZ3RoIG9mIGluU2hhcGUgYCArXG4gICAgICAgIGAoJHt4U2hhcGUubGVuZ3RofSkgYW5kIHJhbmsgb2YgZHkgKCR7ZHkucmFua30pIG11c3QgbWF0Y2hgKTtcbiAgICBsZXQgeFNoYXBlNUQgPSB4U2hhcGU7XG4gICAgbGV0IGR5NUQgPSBkeTtcbiAgICBsZXQgcmVzaGFwZWRUbzVEID0gZmFsc2U7XG4gICAgaWYgKGR5LnJhbmsgPT09IDQpIHtcbiAgICAgICAgcmVzaGFwZWRUbzVEID0gdHJ1ZTtcbiAgICAgICAgZHk1RCA9IHJlc2hhcGUoZHksIFsxLCBkeS5zaGFwZVswXSwgZHkuc2hhcGVbMV0sIGR5LnNoYXBlWzJdLCBkeS5zaGFwZVszXV0pO1xuICAgICAgICB4U2hhcGU1RCA9IFsxLCB4U2hhcGVbMF0sIHhTaGFwZVsxXSwgeFNoYXBlWzJdLCB4U2hhcGVbM11dO1xuICAgIH1cbiAgICBjb25zdCBpbkRlcHRoID0geFNoYXBlNURbNF07XG4gICAgY29uc3Qgb3V0RGVwdGggPSBkeTVELnNoYXBlWzRdO1xuICAgIHV0aWwuYXNzZXJ0KHhTaGFwZTVELmxlbmd0aCA9PT0gNSwgKCkgPT4gYEVycm9yIGluIGNvbnYzZERlcklucHV0OiBpblNoYXBlIG11c3QgYmUgbGVuZ3RoIDUsIGJ1dCBnb3QgbGVuZ3RoIGAgK1xuICAgICAgICBgJHt4U2hhcGU1RC5sZW5ndGh9LmApO1xuICAgIHV0aWwuYXNzZXJ0KGR5NUQucmFuayA9PT0gNSwgKCkgPT4gYEVycm9yIGluIGNvbnYzZERlcklucHV0OiBkeSBtdXN0IGJlIHJhbmsgNSwgYnV0IGdvdCBgICtcbiAgICAgICAgYHJhbmsgJHtkeTVELnJhbmt9YCk7XG4gICAgdXRpbC5hc3NlcnQoZmlsdGVyLnJhbmsgPT09IDUsICgpID0+IGBFcnJvciBpbiBjb252M2REZXJJbnB1dDogZmlsdGVyIG11c3QgYmUgcmFuayA1LCBidXQgZ290IGAgK1xuICAgICAgICBgcmFuayAke2ZpbHRlci5yYW5rfWApO1xuICAgIHV0aWwuYXNzZXJ0KGluRGVwdGggPT09IGZpbHRlci5zaGFwZVszXSwgKCkgPT4gYEVycm9yIGluIGNvbnYzZERlcklucHV0OiBkZXB0aCBvZiBpbnB1dCAoJHtpbkRlcHRofSkgbXVzdCBgICtcbiAgICAgICAgYG1hdGNoIGlucHV0IGRlcHRoIGZvciBmaWx0ZXIgJHtmaWx0ZXIuc2hhcGVbM119LmApO1xuICAgIHV0aWwuYXNzZXJ0KG91dERlcHRoID09PSBmaWx0ZXIuc2hhcGVbNF0sICgpID0+IGBFcnJvciBpbiBjb252M2REZXJJbnB1dDogZGVwdGggb2Ygb3V0cHV0ICgke291dERlcHRofSkgbXVzdCBgICtcbiAgICAgICAgYG1hdGNoIG91dHB1dCBkZXB0aCBmb3IgZmlsdGVyICR7ZmlsdGVyLnNoYXBlWzRdfS5gKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGR5OiBkeTVELCBmaWx0ZXIgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgcGFkLCBzdHJpZGVzLCBpbnB1dFNoYXBlOiB4U2hhcGU1RCB9O1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICBjb25zdCByZXMgPSBFTkdJTkUucnVuS2VybmVsKENvbnYzREJhY2twcm9wSW5wdXRWMiwgaW5wdXRzLCBhdHRycyk7XG4gICAgaWYgKHJlc2hhcGVkVG81RCkge1xuICAgICAgICByZXR1cm4gcmVzaGFwZShyZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdLCByZXMuc2hhcGVbNF1dKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydCBjb25zdCBjb252M0RCYWNrcHJvcElucHV0ID0gb3AoeyBjb252M0RCYWNrcHJvcElucHV0XyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnYzZF9iYWNrcHJvcF9pbnB1dC5qcy5tYXAiLCJpbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgY29udjNEQmFja3Byb3BJbnB1dCB9IGZyb20gJy4vY29udjNkX2JhY2twcm9wX2lucHV0JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgdHJhbnNwb3NlZCAzRCBjb252b2x1dGlvbiBvZiBhIHZvbHVtZSwgYWxzbyBrbm93biBhcyBhXG4gKiBkZWNvbnZvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBpbWFnZSwgb2YgcmFuayA1IG9yIHJhbmsgNCwgb2Ygc2hhcGVcbiAqICAgYFtiYXRjaCwgZGVwdGgsIGhlaWdodCwgd2lkdGgsIGluRGVwdGhdYC4gSWYgcmFuayA0LCBiYXRjaCBvZiAxIGlzIGFzc3VtZWQuXG4gKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIsIHJhbmsgNCwgb2Ygc2hhcGVcbiAqICAgICBgW2RlcHRoLCBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBvdXREZXB0aCwgaW5EZXB0aF1gLlxuICogICAgIGBpbkRlcHRoYCBtdXN0IG1hdGNoIGBpbkRlcHRoYCBpbiBgeGAuXG4gKiBAcGFyYW0gb3V0cHV0U2hhcGUgT3V0cHV0IHNoYXBlLCBvZiByYW5rIDUgb3IgcmFuayA0OlxuICogICAgIGBbYmF0Y2gsIGRlcHRoLCBoZWlnaHQsIHdpZHRoLCBvdXREZXB0aF1gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXNcbiAqICAgIGFzc3VtZWQuXG4gKiBAcGFyYW0gc3RyaWRlcyBUaGUgc3RyaWRlcyBvZiB0aGUgb3JpZ2luYWwgY29udm9sdXRpb246XG4gKiAgICAgYFtzdHJpZGVEZXB0aCwgc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aF1gLlxuICogQHBhcmFtIHBhZCAgVGhlIHR5cGUgb2YgcGFkZGluZyBhbGdvcml0aG0gdXNlZCBpbiB0aGUgbm9uLXRyYW5zcG9zZSB2ZXJzaW9uXG4gKiAgICBvZiB0aGUgb3AuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQ29udm9sdXRpb24nfVxuICovXG5mdW5jdGlvbiBjb252M2RUcmFuc3Bvc2VfKHgsIGZpbHRlciwgb3V0cHV0U2hhcGUsIHN0cmlkZXMsIHBhZCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2NvbnYzZFRyYW5zcG9zZScpO1xuICAgIGNvbnN0ICRmaWx0ZXIgPSBjb252ZXJ0VG9UZW5zb3IoZmlsdGVyLCAnZmlsdGVyJywgJ2NvbnYzZFRyYW5zcG9zZScpO1xuICAgIHJldHVybiBjb252M0RCYWNrcHJvcElucHV0KG91dHB1dFNoYXBlLCAkeCwgJGZpbHRlciwgc3RyaWRlcywgcGFkKTtcbn1cbmV4cG9ydCBjb25zdCBjb252M2RUcmFuc3Bvc2UgPSBvcCh7IGNvbnYzZFRyYW5zcG9zZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb252M2RfdHJhbnNwb3NlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qKlxuICpcbiAqIEBwYXJhbSBpbnB1dFNoYXBlIElucHV0IHRlbnNvciBzaGFwZSBpcyBvZiB0aGUgZm9sbG93aW5nIGRpbWVuc2lvbnM6XG4gKiAgICAgYFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgaW5DaGFubmVsc11gLlxuICogQHBhcmFtIGZpbHRlclNoYXBlIFRoZSBmaWx0ZXIgc2hhcGUgaXMgb2YgdGhlIGZvbGxvd2luZyBkaW1lbnNpb25zOlxuICogICAgIGBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgZGVwdGhdYC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBzbGlkaW5nIHdpbmRvdyBmb3IgZWFjaCBkaW1lbnNpb24gb2YgdGhlXG4gKiAgICAgaW5wdXQgdGVuc29yOiBgW3N0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGhdYC5cbiAqICAgICBJZiBgc3RyaWRlc2AgaXMgYSBzaW5nbGUgbnVtYmVyLFxuICogICAgIHRoZW4gYHN0cmlkZUhlaWdodCA9PSBzdHJpZGVXaWR0aGAuXG4gKiBAcGFyYW0gcGFkIFRoZSB0eXBlIG9mIHBhZGRpbmcgYWxnb3JpdGhtLlxuICogICAgLSBgc2FtZWAgYW5kIHN0cmlkZSAxOiBvdXRwdXQgd2lsbCBiZSBvZiBzYW1lIHNpemUgYXMgaW5wdXQsXG4gKiAgICAgICByZWdhcmRsZXNzIG9mIGZpbHRlciBzaXplLlxuICogICAgLSBgdmFsaWRgOiBvdXRwdXQgd2lsbCBiZSBzbWFsbGVyIHRoYW4gaW5wdXQgaWYgZmlsdGVyIGlzIGxhcmdlclxuICogICAgICAgdGhhbiAxKjF4MS5cbiAqICAgIC0gRm9yIG1vcmUgaW5mbywgc2VlIHRoaXMgZ3VpZGU6XG4gKiAgICAgW2h0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbl0oXG4gKiAgICAgICAgICBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb24pXG4gKiBAcGFyYW0gZGF0YUZvcm1hdCBUaGUgZGF0YSBmb3JtYXQgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YS5cbiAqICAgICBEZWZhdWx0cyB0byAnTkhXQycuXG4gKiBAcGFyYW0gZGlsYXRpb25zIFRoZSBkaWxhdGlvbiByYXRlczogYFtkaWxhdGlvbkhlaWdodCwgZGlsYXRpb25XaWR0aF1gLlxuICogICAgIERlZmF1bHRzIHRvIGBbMSwgMV1gLiBJZiBgZGlsYXRpb25zYCBpcyBhIHNpbmdsZSBudW1iZXIsIHRoZW5cbiAqICAgICBgZGlsYXRpb25IZWlnaHQgPT0gZGlsYXRpb25XaWR0aGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlRGlsYXRpb24yREluZm8oaW5wdXRTaGFwZSwgZmlsdGVyU2hhcGUsIHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCA9ICdOSFdDJywgZGlsYXRpb25zKSB7XG4gICAgLy8gYGNvbXB1dGVyQ29udjJESW5mb2AgcmVxdWlyZSBmaWx0ZXJTaGFwZSB0byBiZSBpbiB0aGUgZGltZW5zaW9uIG9mOlxuICAgIC8vIGBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgZGVwdGgsIG91dERlcHRoXWAsIGRpbGF0aW9uMmQgZG9lc24ndCBoYXZlXG4gICAgLy8gb3V0RGVwdGgsIGl0IHNob3VsZCBoYXZlIHRoZSBzYW1lIGRlcHRoIGFzIHRoZSBpbnB1dC5cbiAgICAvLyBJbnB1dCBzaGFwZTogW2JhdGNoLCBoZWlnaHQsIHdpZHRoLCBpbkNoYW5uZWxzXVxuICAgIGNvbnN0IGlucHV0Q2hhbm5lbHMgPSBpbnB1dFNoYXBlWzNdO1xuICAgIGNvbnN0ICRmaWx0ZXJTaGFwZSA9IFsuLi5maWx0ZXJTaGFwZSwgaW5wdXRDaGFubmVsc107XG4gICAgY29uc3QgJGRhdGFGb3JtYXQgPSBjb252ZXJ0Q29udjJERGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcbiAgICByZXR1cm4gY29tcHV0ZUNvbnYyREluZm8oaW5wdXRTaGFwZSwgJGZpbHRlclNoYXBlLCBzdHJpZGVzLCBkaWxhdGlvbnMsIHBhZCwgbnVsbCAvKiByb3VuZGluZ01vZGUgKi8sIG51bGwgLyogZGVwdGhXaXNlICovLCAkZGF0YUZvcm1hdCk7XG59XG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVBvb2wyREluZm8oaW5TaGFwZSwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIHJvdW5kaW5nTW9kZSwgZGF0YUZvcm1hdCA9ICdjaGFubmVsc0xhc3QnKSB7XG4gICAgY29uc3QgW2ZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGhdID0gcGFyc2VUdXBsZVBhcmFtKGZpbHRlclNpemUpO1xuICAgIGxldCBmaWx0ZXJTaGFwZTtcbiAgICBpZiAoZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzTGFzdCcpIHtcbiAgICAgICAgZmlsdGVyU2hhcGUgPSBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5TaGFwZVszXSwgaW5TaGFwZVszXV07XG4gICAgfVxuICAgIGVsc2UgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0Jykge1xuICAgICAgICBmaWx0ZXJTaGFwZSA9IFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBpblNoYXBlWzFdLCBpblNoYXBlWzFdXTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBkYXRhRm9ybWF0ICR7ZGF0YUZvcm1hdH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbXB1dGVDb252MkRJbmZvKGluU2hhcGUsIGZpbHRlclNoYXBlLCBzdHJpZGVzLCBkaWxhdGlvbnMsIHBhZCwgcm91bmRpbmdNb2RlLCBmYWxzZSwgZGF0YUZvcm1hdCk7XG59XG4vKipcbiAqIENvbXB1dGVzIHRoZSBpbmZvcm1hdGlvbiBmb3IgYSBmb3J3YXJkIHBhc3Mgb2YgYSBwb29saW5nM0Qgb3BlcmF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVBvb2wzREluZm8oaW5TaGFwZSwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIHJvdW5kaW5nTW9kZSwgZGF0YUZvcm1hdCA9ICdOREhXQycpIHtcbiAgICBjb25zdCBbZmlsdGVyRGVwdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGhdID0gcGFyc2UzVHVwbGVQYXJhbShmaWx0ZXJTaXplKTtcbiAgICBsZXQgZmlsdGVyU2hhcGU7XG4gICAgbGV0ICRkYXRhRm9ybWF0O1xuICAgIGlmIChkYXRhRm9ybWF0ID09PSAnTkRIV0MnKSB7XG4gICAgICAgICRkYXRhRm9ybWF0ID0gJ2NoYW5uZWxzTGFzdCc7XG4gICAgICAgIGZpbHRlclNoYXBlID1cbiAgICAgICAgICAgIFtmaWx0ZXJEZXB0aCwgZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5TaGFwZVs0XSwgaW5TaGFwZVs0XV07XG4gICAgfVxuICAgIGVsc2UgaWYgKGRhdGFGb3JtYXQgPT09ICdOQ0RIVycpIHtcbiAgICAgICAgJGRhdGFGb3JtYXQgPSAnY2hhbm5lbHNGaXJzdCc7XG4gICAgICAgIGZpbHRlclNoYXBlID1cbiAgICAgICAgICAgIFtmaWx0ZXJEZXB0aCwgZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5TaGFwZVsxXSwgaW5TaGFwZVsxXV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZGF0YUZvcm1hdCAke2RhdGFGb3JtYXR9YCk7XG4gICAgfVxuICAgIHJldHVybiBjb21wdXRlQ29udjNESW5mbyhpblNoYXBlLCBmaWx0ZXJTaGFwZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGZhbHNlLCAkZGF0YUZvcm1hdCwgcm91bmRpbmdNb2RlKTtcbn1cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGluZm9ybWF0aW9uIGZvciBhIGZvcndhcmQgcGFzcyBvZiBhIGNvbnZvbHV0aW9uL3Bvb2xpbmdcbiAqIG9wZXJhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVDb252MkRJbmZvKGluU2hhcGUsIGZpbHRlclNoYXBlLCBzdHJpZGVzLCBkaWxhdGlvbnMsIHBhZCwgcm91bmRpbmdNb2RlLCBkZXB0aHdpc2UgPSBmYWxzZSwgZGF0YUZvcm1hdCA9ICdjaGFubmVsc0xhc3QnKSB7XG4gICAgbGV0IFtiYXRjaFNpemUsIGluSGVpZ2h0LCBpbldpZHRoLCBpbkNoYW5uZWxzXSA9IFstMSwgLTEsIC0xLCAtMV07XG4gICAgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnKSB7XG4gICAgICAgIFtiYXRjaFNpemUsIGluSGVpZ2h0LCBpbldpZHRoLCBpbkNoYW5uZWxzXSA9IGluU2hhcGU7XG4gICAgfVxuICAgIGVsc2UgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0Jykge1xuICAgICAgICBbYmF0Y2hTaXplLCBpbkNoYW5uZWxzLCBpbkhlaWdodCwgaW5XaWR0aF0gPSBpblNoYXBlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGRhdGFGb3JtYXQgJHtkYXRhRm9ybWF0fWApO1xuICAgIH1cbiAgICBjb25zdCBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgLCBmaWx0ZXJDaGFubmVsc10gPSBmaWx0ZXJTaGFwZTtcbiAgICBjb25zdCBbc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aF0gPSBwYXJzZVR1cGxlUGFyYW0oc3RyaWRlcyk7XG4gICAgY29uc3QgW2RpbGF0aW9uSGVpZ2h0LCBkaWxhdGlvbldpZHRoXSA9IHBhcnNlVHVwbGVQYXJhbShkaWxhdGlvbnMpO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckhlaWdodCA9IGdldEVmZmVjdGl2ZUZpbHRlclNpemUoZmlsdGVySGVpZ2h0LCBkaWxhdGlvbkhlaWdodCk7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVyV2lkdGggPSBnZXRFZmZlY3RpdmVGaWx0ZXJTaXplKGZpbHRlcldpZHRoLCBkaWxhdGlvbldpZHRoKTtcbiAgICBjb25zdCB7IHBhZEluZm8sIG91dEhlaWdodCwgb3V0V2lkdGggfSA9IGdldFBhZEFuZE91dEluZm8ocGFkLCBpbkhlaWdodCwgaW5XaWR0aCwgc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aCwgZWZmZWN0aXZlRmlsdGVySGVpZ2h0LCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCwgcm91bmRpbmdNb2RlLCBkYXRhRm9ybWF0KTtcbiAgICBjb25zdCBvdXRDaGFubmVscyA9IGRlcHRod2lzZSA/IGZpbHRlckNoYW5uZWxzICogaW5DaGFubmVscyA6IGZpbHRlckNoYW5uZWxzO1xuICAgIGxldCBvdXRTaGFwZTtcbiAgICBpZiAoZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzRmlyc3QnKSB7XG4gICAgICAgIG91dFNoYXBlID0gW2JhdGNoU2l6ZSwgb3V0Q2hhbm5lbHMsIG91dEhlaWdodCwgb3V0V2lkdGhdO1xuICAgIH1cbiAgICBlbHNlIGlmIChkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNMYXN0Jykge1xuICAgICAgICBvdXRTaGFwZSA9IFtiYXRjaFNpemUsIG91dEhlaWdodCwgb3V0V2lkdGgsIG91dENoYW5uZWxzXTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYmF0Y2hTaXplLFxuICAgICAgICBkYXRhRm9ybWF0LFxuICAgICAgICBpbkhlaWdodCxcbiAgICAgICAgaW5XaWR0aCxcbiAgICAgICAgaW5DaGFubmVscyxcbiAgICAgICAgb3V0SGVpZ2h0LFxuICAgICAgICBvdXRXaWR0aCxcbiAgICAgICAgb3V0Q2hhbm5lbHMsXG4gICAgICAgIHBhZEluZm8sXG4gICAgICAgIHN0cmlkZUhlaWdodCxcbiAgICAgICAgc3RyaWRlV2lkdGgsXG4gICAgICAgIGZpbHRlckhlaWdodCxcbiAgICAgICAgZmlsdGVyV2lkdGgsXG4gICAgICAgIGVmZmVjdGl2ZUZpbHRlckhlaWdodCxcbiAgICAgICAgZWZmZWN0aXZlRmlsdGVyV2lkdGgsXG4gICAgICAgIGRpbGF0aW9uSGVpZ2h0LFxuICAgICAgICBkaWxhdGlvbldpZHRoLFxuICAgICAgICBpblNoYXBlLFxuICAgICAgICBvdXRTaGFwZSxcbiAgICAgICAgZmlsdGVyU2hhcGVcbiAgICB9O1xufVxuLyoqXG4gKiBDb21wdXRlcyB0aGUgaW5mb3JtYXRpb24gZm9yIGEgZm9yd2FyZCBwYXNzIG9mIGEgM0QgY29udm9sdXRpb24vcG9vbGluZ1xuICogb3BlcmF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZUNvbnYzREluZm8oaW5TaGFwZSwgZmlsdGVyU2hhcGUsIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLCBkZXB0aHdpc2UgPSBmYWxzZSwgZGF0YUZvcm1hdCA9ICdjaGFubmVsc0xhc3QnLCByb3VuZGluZ01vZGUpIHtcbiAgICBsZXQgW2JhdGNoU2l6ZSwgaW5EZXB0aCwgaW5IZWlnaHQsIGluV2lkdGgsIGluQ2hhbm5lbHNdID0gWy0xLCAtMSwgLTEsIC0xLCAtMV07XG4gICAgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnKSB7XG4gICAgICAgIFtiYXRjaFNpemUsIGluRGVwdGgsIGluSGVpZ2h0LCBpbldpZHRoLCBpbkNoYW5uZWxzXSA9IGluU2hhcGU7XG4gICAgfVxuICAgIGVsc2UgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0Jykge1xuICAgICAgICBbYmF0Y2hTaXplLCBpbkNoYW5uZWxzLCBpbkRlcHRoLCBpbkhlaWdodCwgaW5XaWR0aF0gPSBpblNoYXBlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGRhdGFGb3JtYXQgJHtkYXRhRm9ybWF0fWApO1xuICAgIH1cbiAgICBjb25zdCBbZmlsdGVyRGVwdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsICwgZmlsdGVyQ2hhbm5lbHNdID0gZmlsdGVyU2hhcGU7XG4gICAgY29uc3QgW3N0cmlkZURlcHRoLCBzdHJpZGVIZWlnaHQsIHN0cmlkZVdpZHRoXSA9IHBhcnNlM1R1cGxlUGFyYW0oc3RyaWRlcyk7XG4gICAgY29uc3QgW2RpbGF0aW9uRGVwdGgsIGRpbGF0aW9uSGVpZ2h0LCBkaWxhdGlvbldpZHRoXSA9IHBhcnNlM1R1cGxlUGFyYW0oZGlsYXRpb25zKTtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJEZXB0aCA9IGdldEVmZmVjdGl2ZUZpbHRlclNpemUoZmlsdGVyRGVwdGgsIGRpbGF0aW9uRGVwdGgpO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckhlaWdodCA9IGdldEVmZmVjdGl2ZUZpbHRlclNpemUoZmlsdGVySGVpZ2h0LCBkaWxhdGlvbkhlaWdodCk7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVyV2lkdGggPSBnZXRFZmZlY3RpdmVGaWx0ZXJTaXplKGZpbHRlcldpZHRoLCBkaWxhdGlvbldpZHRoKTtcbiAgICBjb25zdCB7IHBhZEluZm8sIG91dERlcHRoLCBvdXRIZWlnaHQsIG91dFdpZHRoIH0gPSBnZXQzRFBhZEFuZE91dEluZm8ocGFkLCBpbkRlcHRoLCBpbkhlaWdodCwgaW5XaWR0aCwgc3RyaWRlRGVwdGgsIHN0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGgsIGVmZmVjdGl2ZUZpbHRlckRlcHRoLCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQsIGVmZmVjdGl2ZUZpbHRlcldpZHRoLCByb3VuZGluZ01vZGUpO1xuICAgIGNvbnN0IG91dENoYW5uZWxzID0gZGVwdGh3aXNlID8gZmlsdGVyQ2hhbm5lbHMgKiBpbkNoYW5uZWxzIDogZmlsdGVyQ2hhbm5lbHM7XG4gICAgbGV0IG91dFNoYXBlO1xuICAgIGlmIChkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNGaXJzdCcpIHtcbiAgICAgICAgb3V0U2hhcGUgPSBbYmF0Y2hTaXplLCBvdXRDaGFubmVscywgb3V0RGVwdGgsIG91dEhlaWdodCwgb3V0V2lkdGhdO1xuICAgIH1cbiAgICBlbHNlIGlmIChkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNMYXN0Jykge1xuICAgICAgICBvdXRTaGFwZSA9IFtiYXRjaFNpemUsIG91dERlcHRoLCBvdXRIZWlnaHQsIG91dFdpZHRoLCBvdXRDaGFubmVsc107XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGJhdGNoU2l6ZSxcbiAgICAgICAgZGF0YUZvcm1hdCxcbiAgICAgICAgaW5EZXB0aCxcbiAgICAgICAgaW5IZWlnaHQsXG4gICAgICAgIGluV2lkdGgsXG4gICAgICAgIGluQ2hhbm5lbHMsXG4gICAgICAgIG91dERlcHRoLFxuICAgICAgICBvdXRIZWlnaHQsXG4gICAgICAgIG91dFdpZHRoLFxuICAgICAgICBvdXRDaGFubmVscyxcbiAgICAgICAgcGFkSW5mbyxcbiAgICAgICAgc3RyaWRlRGVwdGgsXG4gICAgICAgIHN0cmlkZUhlaWdodCxcbiAgICAgICAgc3RyaWRlV2lkdGgsXG4gICAgICAgIGZpbHRlckRlcHRoLFxuICAgICAgICBmaWx0ZXJIZWlnaHQsXG4gICAgICAgIGZpbHRlcldpZHRoLFxuICAgICAgICBlZmZlY3RpdmVGaWx0ZXJEZXB0aCxcbiAgICAgICAgZWZmZWN0aXZlRmlsdGVySGVpZ2h0LFxuICAgICAgICBlZmZlY3RpdmVGaWx0ZXJXaWR0aCxcbiAgICAgICAgZGlsYXRpb25EZXB0aCxcbiAgICAgICAgZGlsYXRpb25IZWlnaHQsXG4gICAgICAgIGRpbGF0aW9uV2lkdGgsXG4gICAgICAgIGluU2hhcGUsXG4gICAgICAgIG91dFNoYXBlLFxuICAgICAgICBmaWx0ZXJTaGFwZVxuICAgIH07XG59XG5mdW5jdGlvbiBjb21wdXRlT3V0cHV0U2hhcGUyRChpblNoYXBlLCBmaWVsZFNpemUsIHN0cmlkZSwgemVyb1BhZCwgcm91bmRpbmdNb2RlKSB7XG4gICAgaWYgKHplcm9QYWQgPT0gbnVsbCkge1xuICAgICAgICB6ZXJvUGFkID0gY29tcHV0ZURlZmF1bHRQYWQoaW5TaGFwZSwgZmllbGRTaXplLCBzdHJpZGUpO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dFJvd3MgPSBpblNoYXBlWzBdO1xuICAgIGNvbnN0IGlucHV0Q29scyA9IGluU2hhcGVbMV07XG4gICAgY29uc3Qgb3V0cHV0Um93cyA9IHJvdW5kKChpbnB1dFJvd3MgLSBmaWVsZFNpemUgKyAyICogemVyb1BhZCkgLyBzdHJpZGUgKyAxLCByb3VuZGluZ01vZGUpO1xuICAgIGNvbnN0IG91dHB1dENvbHMgPSByb3VuZCgoaW5wdXRDb2xzIC0gZmllbGRTaXplICsgMiAqIHplcm9QYWQpIC8gc3RyaWRlICsgMSwgcm91bmRpbmdNb2RlKTtcbiAgICByZXR1cm4gW291dHB1dFJvd3MsIG91dHB1dENvbHNdO1xufVxuZnVuY3Rpb24gY29tcHV0ZU91dHB1dFNoYXBlNEQoaW5TaGFwZSwgZmllbGRTaXplLCBvdXRDaGFubmVscywgc3RyaWRlLCB6ZXJvUGFkLCByb3VuZGluZ01vZGUpIHtcbiAgICBpZiAoemVyb1BhZCA9PSBudWxsKSB7XG4gICAgICAgIHplcm9QYWQgPSBjb21wdXRlRGVmYXVsdFBhZChpblNoYXBlLCBmaWVsZFNpemUsIHN0cmlkZSk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0RGVwdGggPSBpblNoYXBlWzBdO1xuICAgIGNvbnN0IGlucHV0Um93cyA9IGluU2hhcGVbMV07XG4gICAgY29uc3QgaW5wdXRDb2xzID0gaW5TaGFwZVsyXTtcbiAgICBjb25zdCBvdXRwdXREZXB0aHMgPSByb3VuZCgoaW5wdXREZXB0aCAtIGZpZWxkU2l6ZSArIDIgKiB6ZXJvUGFkKSAvIHN0cmlkZSArIDEsIHJvdW5kaW5nTW9kZSk7XG4gICAgY29uc3Qgb3V0cHV0Um93cyA9IHJvdW5kKChpbnB1dFJvd3MgLSBmaWVsZFNpemUgKyAyICogemVyb1BhZCkgLyBzdHJpZGUgKyAxLCByb3VuZGluZ01vZGUpO1xuICAgIGNvbnN0IG91dHB1dENvbHMgPSByb3VuZCgoaW5wdXRDb2xzIC0gZmllbGRTaXplICsgMiAqIHplcm9QYWQpIC8gc3RyaWRlICsgMSwgcm91bmRpbmdNb2RlKTtcbiAgICByZXR1cm4gW291dHB1dERlcHRocywgb3V0cHV0Um93cywgb3V0cHV0Q29scywgb3V0Q2hhbm5lbHNdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVEZWZhdWx0UGFkKGlucHV0U2hhcGUsIGZpZWxkU2l6ZSwgc3RyaWRlLCBkaWxhdGlvbiA9IDEpIHtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWVsZFNpemUgPSBnZXRFZmZlY3RpdmVGaWx0ZXJTaXplKGZpZWxkU2l6ZSwgZGlsYXRpb24pO1xuICAgIHJldHVybiBNYXRoLmZsb29yKChpbnB1dFNoYXBlWzBdICogKHN0cmlkZSAtIDEpIC0gc3RyaWRlICsgZWZmZWN0aXZlRmllbGRTaXplKSAvIDIpO1xufVxuZnVuY3Rpb24gcGFyc2VUdXBsZVBhcmFtKHBhcmFtKSB7XG4gICAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIFtwYXJhbSwgcGFyYW0sIHBhcmFtXTtcbiAgICB9XG4gICAgaWYgKHBhcmFtLmxlbmd0aCA9PT0gMikge1xuICAgICAgICByZXR1cm4gW3BhcmFtWzBdLCBwYXJhbVsxXSwgMV07XG4gICAgfVxuICAgIHJldHVybiBwYXJhbTtcbn1cbmZ1bmN0aW9uIHBhcnNlM1R1cGxlUGFyYW0ocGFyYW0pIHtcbiAgICByZXR1cm4gdHlwZW9mIHBhcmFtID09PSAnbnVtYmVyJyA/IFtwYXJhbSwgcGFyYW0sIHBhcmFtXSA6IHBhcmFtO1xufVxuLyogU2VlIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9hdHJvdXNfY29udjJkXG4gKiBBdHJvdXMgY29udm9sdXRpb24gaXMgZXF1aXZhbGVudCB0byBzdGFuZGFyZCBjb252b2x1dGlvbiB3aXRoIHVwc2FtcGxlZFxuICogZmlsdGVycyB3aXRoIGVmZmVjdGl2ZV9maWx0ZXJfaGVpZ2h0ID1cbiAqIGZpbHRlcl9oZWlnaHQgKyAoZmlsdGVyX2hlaWdodCAtIDEpICogKGRpbGF0aW9uIC0gMSlcbiAqIGFuZCBlZmZlY3RpdmVfZmlsdGVyX3dpZHRoID1cbiAqIGZpbHRlcl93aWR0aCArIChmaWx0ZXJfd2lkdGggLSAxKSAqIChkaWxhdGlvbiAtIDEpLFxuICogcHJvZHVjZWQgYnkgaW5zZXJ0aW5nIGRpbGF0aW9uIC0gMSB6ZXJvcyBhbG9uZyBjb25zZWN1dGl2ZSBlbGVtZW50cyBhY3Jvc3NcbiAqIHRoZSBmaWx0ZXJzJyBzcGF0aWFsIGRpbWVuc2lvbnMuXG4gKiBXaGVuIHRoZXJlIGlzIGEgZGlsYXRpb24sIHRoaXMgY29udmVydHMgYSBmaWx0ZXIgZGltZW5zaW9uIHRvIHRoZVxuICogZWZmZWN0aXZlIGZpbHRlciBkaW1lbnNpb24sIHNvIGl0IGNhbiBiZSB1c2VkIGluIGEgc3RhbmRhcmQgY29udm9sdXRpb24uXG4gKi9cbmZ1bmN0aW9uIGdldEVmZmVjdGl2ZUZpbHRlclNpemUoZmlsdGVyU2l6ZSwgZGlsYXRpb24pIHtcbiAgICBpZiAoZGlsYXRpb24gPD0gMSkge1xuICAgICAgICByZXR1cm4gZmlsdGVyU2l6ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZpbHRlclNpemUgKyAoZmlsdGVyU2l6ZSAtIDEpICogKGRpbGF0aW9uIC0gMSk7XG59XG5mdW5jdGlvbiBnZXRQYWRBbmRPdXRJbmZvKHBhZCwgaW5IZWlnaHQsIGluV2lkdGgsIHN0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIHJvdW5kaW5nTW9kZSwgZGF0YUZvcm1hdCkge1xuICAgIGxldCBwYWRJbmZvO1xuICAgIGxldCBvdXRIZWlnaHQ7XG4gICAgbGV0IG91dFdpZHRoO1xuICAgIGlmICh0eXBlb2YgcGFkID09PSAnbnVtYmVyJykge1xuICAgICAgICBjb25zdCBwYWRUeXBlID0gKHBhZCA9PT0gMCkgPyAnVkFMSUQnIDogJ05VTUJFUic7XG4gICAgICAgIHBhZEluZm8gPSB7IHRvcDogcGFkLCBib3R0b206IHBhZCwgbGVmdDogcGFkLCByaWdodDogcGFkLCB0eXBlOiBwYWRUeXBlIH07XG4gICAgICAgIGNvbnN0IG91dFNoYXBlID0gY29tcHV0ZU91dHB1dFNoYXBlMkQoW2luSGVpZ2h0LCBpbldpZHRoXSwgZmlsdGVySGVpZ2h0LCBzdHJpZGVIZWlnaHQsIHBhZCwgcm91bmRpbmdNb2RlKTtcbiAgICAgICAgb3V0SGVpZ2h0ID0gb3V0U2hhcGVbMF07XG4gICAgICAgIG91dFdpZHRoID0gb3V0U2hhcGVbMV07XG4gICAgfVxuICAgIGVsc2UgaWYgKHBhZCA9PT0gJ3NhbWUnKSB7XG4gICAgICAgIG91dEhlaWdodCA9IE1hdGguY2VpbChpbkhlaWdodCAvIHN0cmlkZUhlaWdodCk7XG4gICAgICAgIG91dFdpZHRoID0gTWF0aC5jZWlsKGluV2lkdGggLyBzdHJpZGVXaWR0aCk7XG4gICAgICAgIGNvbnN0IHBhZEFsb25nSGVpZ2h0ID0gTWF0aC5tYXgoMCwgKG91dEhlaWdodCAtIDEpICogc3RyaWRlSGVpZ2h0ICsgZmlsdGVySGVpZ2h0IC0gaW5IZWlnaHQpO1xuICAgICAgICBjb25zdCBwYWRBbG9uZ1dpZHRoID0gTWF0aC5tYXgoMCwgKG91dFdpZHRoIC0gMSkgKiBzdHJpZGVXaWR0aCArIGZpbHRlcldpZHRoIC0gaW5XaWR0aCk7XG4gICAgICAgIGNvbnN0IHRvcCA9IE1hdGguZmxvb3IocGFkQWxvbmdIZWlnaHQgLyAyKTtcbiAgICAgICAgY29uc3QgYm90dG9tID0gcGFkQWxvbmdIZWlnaHQgLSB0b3A7XG4gICAgICAgIGNvbnN0IGxlZnQgPSBNYXRoLmZsb29yKHBhZEFsb25nV2lkdGggLyAyKTtcbiAgICAgICAgY29uc3QgcmlnaHQgPSBwYWRBbG9uZ1dpZHRoIC0gbGVmdDtcbiAgICAgICAgcGFkSW5mbyA9IHsgdG9wLCBib3R0b20sIGxlZnQsIHJpZ2h0LCB0eXBlOiAnU0FNRScgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAocGFkID09PSAndmFsaWQnKSB7XG4gICAgICAgIHBhZEluZm8gPSB7IHRvcDogMCwgYm90dG9tOiAwLCBsZWZ0OiAwLCByaWdodDogMCwgdHlwZTogJ1ZBTElEJyB9O1xuICAgICAgICBvdXRIZWlnaHQgPSBNYXRoLmNlaWwoKGluSGVpZ2h0IC0gZmlsdGVySGVpZ2h0ICsgMSkgLyBzdHJpZGVIZWlnaHQpO1xuICAgICAgICBvdXRXaWR0aCA9IE1hdGguY2VpbCgoaW5XaWR0aCAtIGZpbHRlcldpZHRoICsgMSkgLyBzdHJpZGVXaWR0aCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBwYWQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGNvbnN0IHRvcCA9IGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnID8gcGFkWzFdWzBdIDogcGFkWzJdWzBdO1xuICAgICAgICBjb25zdCBib3R0b20gPSBkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNMYXN0JyA/IHBhZFsxXVsxXSA6IHBhZFsyXVsxXTtcbiAgICAgICAgY29uc3QgbGVmdCA9IGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnID8gcGFkWzJdWzBdIDogcGFkWzNdWzBdO1xuICAgICAgICBjb25zdCByaWdodCA9IGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnID8gcGFkWzJdWzFdIDogcGFkWzNdWzFdO1xuICAgICAgICBjb25zdCBwYWRUeXBlID0gKHRvcCA9PT0gMCAmJiBib3R0b20gPT09IDAgJiYgbGVmdCA9PT0gMCAmJiByaWdodCA9PT0gMCkgP1xuICAgICAgICAgICAgJ1ZBTElEJyA6XG4gICAgICAgICAgICAnRVhQTElDSVQnO1xuICAgICAgICBwYWRJbmZvID0geyB0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHQsIHR5cGU6IHBhZFR5cGUgfTtcbiAgICAgICAgb3V0SGVpZ2h0ID0gcm91bmQoKGluSGVpZ2h0IC0gZmlsdGVySGVpZ2h0ICsgdG9wICsgYm90dG9tKSAvIHN0cmlkZUhlaWdodCArIDEsIHJvdW5kaW5nTW9kZSk7XG4gICAgICAgIG91dFdpZHRoID0gcm91bmQoKGluV2lkdGggLSBmaWx0ZXJXaWR0aCArIGxlZnQgKyByaWdodCkgLyBzdHJpZGVXaWR0aCArIDEsIHJvdW5kaW5nTW9kZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBFcnJvcihgVW5rbm93biBwYWRkaW5nIHBhcmFtZXRlcjogJHtwYWR9YCk7XG4gICAgfVxuICAgIHJldHVybiB7IHBhZEluZm8sIG91dEhlaWdodCwgb3V0V2lkdGggfTtcbn1cbmZ1bmN0aW9uIGdldDNEUGFkQW5kT3V0SW5mbyhwYWQsIGluRGVwdGgsIGluSGVpZ2h0LCBpbldpZHRoLCBzdHJpZGVEZXB0aCwgc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aCwgZmlsdGVyRGVwdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIHJvdW5kaW5nTW9kZSkge1xuICAgIGxldCBwYWRJbmZvO1xuICAgIGxldCBvdXREZXB0aDtcbiAgICBsZXQgb3V0SGVpZ2h0O1xuICAgIGxldCBvdXRXaWR0aDtcbiAgICBpZiAodHlwZW9mIHBhZCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgY29uc3QgcGFkVHlwZSA9IChwYWQgPT09IDApID8gJ1ZBTElEJyA6ICdOVU1CRVInO1xuICAgICAgICBwYWRJbmZvID0ge1xuICAgICAgICAgICAgdG9wOiBwYWQsXG4gICAgICAgICAgICBib3R0b206IHBhZCxcbiAgICAgICAgICAgIGxlZnQ6IHBhZCxcbiAgICAgICAgICAgIHJpZ2h0OiBwYWQsXG4gICAgICAgICAgICBmcm9udDogcGFkLFxuICAgICAgICAgICAgYmFjazogcGFkLFxuICAgICAgICAgICAgdHlwZTogcGFkVHlwZVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBvdXRTaGFwZSA9IGNvbXB1dGVPdXRwdXRTaGFwZTREKFtpbkRlcHRoLCBpbkhlaWdodCwgaW5XaWR0aCwgMV0sIGZpbHRlckRlcHRoLCAxLCBzdHJpZGVEZXB0aCwgcGFkLCByb3VuZGluZ01vZGUpO1xuICAgICAgICBvdXREZXB0aCA9IG91dFNoYXBlWzBdO1xuICAgICAgICBvdXRIZWlnaHQgPSBvdXRTaGFwZVsxXTtcbiAgICAgICAgb3V0V2lkdGggPSBvdXRTaGFwZVsyXTtcbiAgICB9XG4gICAgZWxzZSBpZiAocGFkID09PSAnc2FtZScpIHtcbiAgICAgICAgb3V0RGVwdGggPSBNYXRoLmNlaWwoaW5EZXB0aCAvIHN0cmlkZURlcHRoKTtcbiAgICAgICAgb3V0SGVpZ2h0ID0gTWF0aC5jZWlsKGluSGVpZ2h0IC8gc3RyaWRlSGVpZ2h0KTtcbiAgICAgICAgb3V0V2lkdGggPSBNYXRoLmNlaWwoaW5XaWR0aCAvIHN0cmlkZVdpZHRoKTtcbiAgICAgICAgY29uc3QgcGFkQWxvbmdEZXB0aCA9IChvdXREZXB0aCAtIDEpICogc3RyaWRlRGVwdGggKyBmaWx0ZXJEZXB0aCAtIGluRGVwdGg7XG4gICAgICAgIGNvbnN0IHBhZEFsb25nSGVpZ2h0ID0gKG91dEhlaWdodCAtIDEpICogc3RyaWRlSGVpZ2h0ICsgZmlsdGVySGVpZ2h0IC0gaW5IZWlnaHQ7XG4gICAgICAgIGNvbnN0IHBhZEFsb25nV2lkdGggPSAob3V0V2lkdGggLSAxKSAqIHN0cmlkZVdpZHRoICsgZmlsdGVyV2lkdGggLSBpbldpZHRoO1xuICAgICAgICBjb25zdCBmcm9udCA9IE1hdGguZmxvb3IocGFkQWxvbmdEZXB0aCAvIDIpO1xuICAgICAgICBjb25zdCBiYWNrID0gcGFkQWxvbmdEZXB0aCAtIGZyb250O1xuICAgICAgICBjb25zdCB0b3AgPSBNYXRoLmZsb29yKHBhZEFsb25nSGVpZ2h0IC8gMik7XG4gICAgICAgIGNvbnN0IGJvdHRvbSA9IHBhZEFsb25nSGVpZ2h0IC0gdG9wO1xuICAgICAgICBjb25zdCBsZWZ0ID0gTWF0aC5mbG9vcihwYWRBbG9uZ1dpZHRoIC8gMik7XG4gICAgICAgIGNvbnN0IHJpZ2h0ID0gcGFkQWxvbmdXaWR0aCAtIGxlZnQ7XG4gICAgICAgIHBhZEluZm8gPSB7IHRvcCwgYm90dG9tLCBsZWZ0LCByaWdodCwgZnJvbnQsIGJhY2ssIHR5cGU6ICdTQU1FJyB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChwYWQgPT09ICd2YWxpZCcpIHtcbiAgICAgICAgcGFkSW5mbyA9IHtcbiAgICAgICAgICAgIHRvcDogMCxcbiAgICAgICAgICAgIGJvdHRvbTogMCxcbiAgICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgICByaWdodDogMCxcbiAgICAgICAgICAgIGZyb250OiAwLFxuICAgICAgICAgICAgYmFjazogMCxcbiAgICAgICAgICAgIHR5cGU6ICdWQUxJRCdcbiAgICAgICAgfTtcbiAgICAgICAgb3V0RGVwdGggPSBNYXRoLmNlaWwoKGluRGVwdGggLSBmaWx0ZXJEZXB0aCArIDEpIC8gc3RyaWRlRGVwdGgpO1xuICAgICAgICBvdXRIZWlnaHQgPSBNYXRoLmNlaWwoKGluSGVpZ2h0IC0gZmlsdGVySGVpZ2h0ICsgMSkgLyBzdHJpZGVIZWlnaHQpO1xuICAgICAgICBvdXRXaWR0aCA9IE1hdGguY2VpbCgoaW5XaWR0aCAtIGZpbHRlcldpZHRoICsgMSkgLyBzdHJpZGVXaWR0aCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBFcnJvcihgVW5rbm93biBwYWRkaW5nIHBhcmFtZXRlcjogJHtwYWR9YCk7XG4gICAgfVxuICAgIHJldHVybiB7IHBhZEluZm8sIG91dERlcHRoLCBvdXRIZWlnaHQsIG91dFdpZHRoIH07XG59XG4vKipcbiAqIFJvdW5kcyBhIHZhbHVlIGRlcGVuZGluZyBvbiB0aGUgcm91bmRpbmcgbW9kZVxuICogQHBhcmFtIHZhbHVlXG4gKiBAcGFyYW0gcm91bmRpbmdNb2RlIEEgc3RyaW5nIGZyb206ICdjZWlsJywgJ3JvdW5kJywgJ2Zsb29yJy4gSWYgbm9uZSBpc1xuICogICAgIHByb3ZpZGVkLCBpdCB3aWxsIGRlZmF1bHQgdG8gdHJ1bmNhdGUuXG4gKi9cbmZ1bmN0aW9uIHJvdW5kKHZhbHVlLCByb3VuZGluZ01vZGUpIHtcbiAgICBpZiAoIXJvdW5kaW5nTW9kZSkge1xuICAgICAgICByZXR1cm4gTWF0aC50cnVuYyh2YWx1ZSk7XG4gICAgfVxuICAgIHN3aXRjaCAocm91bmRpbmdNb2RlKSB7XG4gICAgICAgIGNhc2UgJ3JvdW5kJzpcbiAgICAgICAgICAgIC8vIHVzZWQgZm9yIENhZmZlIENvbnZcbiAgICAgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlKTtcbiAgICAgICAgY2FzZSAnY2VpbCc6XG4gICAgICAgICAgICAvLyB1c2VkIGZvciBDYWZmZSBQb29sXG4gICAgICAgICAgICByZXR1cm4gTWF0aC5jZWlsKHZhbHVlKTtcbiAgICAgICAgY2FzZSAnZmxvb3InOlxuICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IodmFsdWUpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHJvdW5kaW5nTW9kZSAke3JvdW5kaW5nTW9kZX1gKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gdHVwbGVWYWx1ZXNBcmVPbmUocGFyYW0pIHtcbiAgICBjb25zdCBbZGltQSwgZGltQiwgZGltQ10gPSBwYXJzZVR1cGxlUGFyYW0ocGFyYW0pO1xuICAgIHJldHVybiBkaW1BID09PSAxICYmIGRpbUIgPT09IDEgJiYgZGltQyA9PT0gMTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBlaXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgZGlsYXRpb25zKSB7XG4gICAgcmV0dXJuIHR1cGxlVmFsdWVzQXJlT25lKHN0cmlkZXMpIHx8IHR1cGxlVmFsdWVzQXJlT25lKGRpbGF0aW9ucyk7XG59XG4vKipcbiAqIENvbnZlcnQgQ29udjJEIGRhdGFGb3JtYXQgZnJvbSAnTkhXQyd8J05DSFcnIHRvXG4gKiAgICAnY2hhbm5lbHNMYXN0J3wnY2hhbm5lbHNGaXJzdCdcbiAqIEBwYXJhbSBkYXRhRm9ybWF0IGluICdOSFdDJ3wnTkNIVycgbW9kZVxuICogQHJldHVybiBkYXRhRm9ybWF0IGluICdjaGFubmVsc0xhc3QnfCdjaGFubmVsc0ZpcnN0JyBtb2RlXG4gKiBAdGhyb3dzIHVua25vd24gZGF0YUZvcm1hdFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydENvbnYyRERhdGFGb3JtYXQoZGF0YUZvcm1hdCkge1xuICAgIGlmIChkYXRhRm9ybWF0ID09PSAnTkhXQycpIHtcbiAgICAgICAgcmV0dXJuICdjaGFubmVsc0xhc3QnO1xuICAgIH1cbiAgICBlbHNlIGlmIChkYXRhRm9ybWF0ID09PSAnTkNIVycpIHtcbiAgICAgICAgcmV0dXJuICdjaGFubmVsc0ZpcnN0JztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBkYXRhRm9ybWF0ICR7ZGF0YUZvcm1hdH1gKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb252X3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IENvcyB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIGNvcyBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOiBgY29zKHgpYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzAsIE1hdGguUEkgLyAyLCBNYXRoLlBJICogMyAvIDRdKTtcbiAqXG4gKiB4LmNvcygpLnByaW50KCk7ICAvLyBvciB0Zi5jb3MoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gY29zXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnY29zJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKENvcywgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBjb3MgPSBvcCh7IGNvc18gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb3MuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IENvc2ggfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBoeXBlcmJvbGljIGNvcyBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOiBgY29zaCh4KWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFswLCAxLCAtMSwgLjddKTtcbiAqXG4gKiB4LmNvc2goKS5wcmludCgpOyAgLy8gb3IgdGYuY29zaCh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBjb3NoXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnY29zaCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChDb3NoLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGNvc2ggPSBvcCh7IGNvc2hfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29zaC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgQ3Vtc3VtIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIGN1bXVsYXRpdmUgc3VtIG9mIGEgYHRmLlRlbnNvcmAgYWxvbmcgYGF4aXNgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yKFsxLCAyLCAzLCA0XSk7XG4gKiB4LmN1bXN1bSgpLnByaW50KCk7XG4gKiBgYGBcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yKFtbMSwgMl0sIFszLCA0XV0pO1xuICogeC5jdW1zdW0oKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciB0byBiZSBzdW1tZWQuXG4gKiBAcGFyYW0gYXhpcyBUaGUgYXhpcyBhbG9uZyB3aGljaCB0byBzdW0uIE9wdGlvbmFsLiBEZWZhdWx0cyB0byAwLlxuICogQHBhcmFtIGV4Y2x1c2l2ZSBXaGV0aGVyIHRvIHBlcmZvcm0gZXhjbHVzaXZlIGN1bXVsYXRpdmUgc3VtLiBPcHRpb25hbC5cbiAqICAgICBEZWZhdWx0cyB0byBmYWxzZS4gSWYgc2V0IHRvIHRydWUgdGhlbiB0aGUgc3VtIG9mIGVhY2ggdGVuc29yIGVudHJ5XG4gKiAgICAgZG9lcyBub3QgaW5jbHVkZSBpdHMgb3duIHZhbHVlLCBidXQgb25seSB0aGUgdmFsdWVzIHByZXZpb3VzIHRvIGl0XG4gKiAgICAgYWxvbmcgdGhlIHNwZWNpZmllZCBheGlzLlxuICogQHBhcmFtIHJldmVyc2UgV2hldGhlciB0byBzdW0gaW4gdGhlIG9wcG9zaXRlIGRpcmVjdGlvbi4gT3B0aW9uYWwuXG4gKiAgICAgRGVmYXVsdHMgdG8gZmFsc2UuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU2Nhbid9XG4gKi9cbmZ1bmN0aW9uIGN1bXN1bV8oeCwgYXhpcyA9IDAsIGV4Y2x1c2l2ZSA9IGZhbHNlLCByZXZlcnNlID0gZmFsc2UpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdjdW1zdW0nKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgY29uc3QgYXR0cnMgPSB7IGF4aXMsIGV4Y2x1c2l2ZSwgcmV2ZXJzZSB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEN1bXN1bSwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgY3Vtc3VtID0gb3AoeyBjdW1zdW1fIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y3Vtc3VtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBEZW5zZUJpbmNvdW50IH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIE91dHB1dHMgYSB2ZWN0b3Igd2l0aCBsZW5ndGggYHNpemVgIGFuZCB0aGUgc2FtZSBkdHlwZSBhcyBgd2VpZ2h0c2AuXG4gKlxuICogSWYgYHdlaWdodHNgIGFyZSBlbXB0eSwgdGhlbiBpbmRleCBgaWAgc3RvcmVzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIHZhbHVlXG4gKiBgaWAgaXMgY291bnRlZCBpbiBgeGAuIElmIGB3ZWlnaHRzYCBhcmUgbm9uLWVtcHR5LCB0aGVuIGluZGV4IGBpYCBzdG9yZXMgdGhlXG4gKiBzdW0gb2YgdGhlIHZhbHVlIGluIGB3ZWlnaHRzYCBhdCBlYWNoIGluZGV4IHdoZXJlIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGluXG4gKiBgeGAgaXMgYGlgLlxuICpcbiAqIFZhbHVlcyBpbiBgeGAgb3V0c2lkZSBvZiB0aGUgcmFuZ2UgWzAsIHNpemUpIGFyZSBpZ25vcmVkLlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBpbnQgdGVuc29yLCByYW5rIDEgb3IgcmFuayAyLlxuICogQHBhcmFtIHdlaWdodHMgVGhlIHdlaWdodHMgdGVuc29yLCBtdXN0IGhhdmUgdGhlIHNhbWUgc2hhcGUgYXMgeCwgb3IgYVxuICogICAgIGxlbmd0aC0wIFRlbnNvciwgaW4gd2hpY2ggY2FzZSBpdCBhY3RzIGFzIGFsbCB3ZWlnaHRzIGVxdWFsIHRvIDEuXG4gKiBAcGFyYW0gc2l6ZSBOb24tbmVnYXRpdmUgaW50ZWdlci5cbiAqIEBwYXJhbSBiaW5hcnlPdXRwdXQgT3B0aW9uYWwuIFdoZXRoZXIgdGhlIGtlcm5lbCBzaG91bGQgY291bnQgdGhlIGFwcGVhcmFuY2VcbiAqICAgICBvciBudW1iZXIgb2Ygb2NjdXJyZW5jZXMuIERlZmF1bHRzIHRvIEZhbHNlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1JlZHVjdGlvbid9XG4gKi9cbmZ1bmN0aW9uIGRlbnNlQmluY291bnRfKHgsIHdlaWdodHMsIHNpemUsIGJpbmFyeU91dHB1dCA9IGZhbHNlKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnZGVuc2VCaW5jb3VudCcpO1xuICAgIGNvbnN0ICR3ZWlnaHRzID0gY29udmVydFRvVGVuc29yKHdlaWdodHMsICd3ZWlnaHRzJywgJ2RlbnNlQmluY291bnQnKTtcbiAgICB1dGlsLmFzc2VydCgkeC5kdHlwZSA9PT0gJ2ludDMyJywgKCkgPT4gYEVycm9yIGluIGRlbnNlQmluY291bnQ6IGlucHV0IGAgK1xuICAgICAgICBgZHR5cGUgbXVzdCBiZSBpbnQzMiwgYnV0IGdvdCAkeyR4LmR0eXBlfWApO1xuICAgIHV0aWwuYXNzZXJ0KCR4LnJhbmsgPD0gMiwgKCkgPT4gYEVycm9yIGluIGRlbnNlQmluY291bnQ6IGlucHV0IG11c3QgYmUgYXQgbW9zdCByYW5rIDIsIGJ1dCBnb3QgYCArXG4gICAgICAgIGByYW5rICR7JHgucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoc2l6ZSA+PSAwLCAoKSA9PiBgc2l6ZSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSwgYnV0IGdvdCAke3NpemV9LmApO1xuICAgIHV0aWwuYXNzZXJ0KCR3ZWlnaHRzLnNpemUgPT09ICR4LnNpemUgfHwgJHdlaWdodHMuc2l6ZSA9PT0gMCwgKCkgPT4gYEVycm9yIGluIGRlbnNlQmluY291bnQ6IHdlaWdodHMgbXVzdCBoYXZlIHRoZSBzYW1lIHNoYXBlIGFzIHggb3IgYCArXG4gICAgICAgIGAwLWxlbmd0aCwgYnV0IGdvdCB4IHNoYXBlOiAkeyR4LnNoYXBlfSwgd2VpZ2h0cyBzaGFwZTogYCArXG4gICAgICAgIGAkeyR3ZWlnaHRzLnNoYXBlfS5gKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4LCB3ZWlnaHRzOiAkd2VpZ2h0cyB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBzaXplLCBiaW5hcnlPdXRwdXQgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChEZW5zZUJpbmNvdW50LCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBkZW5zZUJpbmNvdW50ID0gb3AoeyBkZW5zZUJpbmNvdW50XyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRlbnNlX2JpbmNvdW50LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBEZXB0aFRvU3BhY2UgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmVhcnJhbmdlcyBkYXRhIGZyb20gZGVwdGggaW50byBibG9ja3Mgb2Ygc3BhdGlhbCBkYXRhLiBNb3JlIHNwZWNpZmljYWxseSxcbiAqIHRoaXMgb3Agb3V0cHV0cyBhIGNvcHkgb2YgdGhlIGlucHV0IHRlbnNvciB3aGVyZSB2YWx1ZXMgZnJvbSB0aGUgYGRlcHRoYFxuICogZGltZW5zaW9uIGFyZSBtb3ZlZCBpbiBzcGF0aWFsIGJsb2NrcyB0byB0aGUgYGhlaWdodGAgYW5kIGB3aWR0aGAgZGltZW5zaW9ucy5cbiAqIFRoZSBhdHRyIGBibG9ja1NpemVgIGluZGljYXRlcyB0aGUgaW5wdXQgYmxvY2sgc2l6ZSBhbmQgaG93IHRoZSBkYXRhIGlzXG4gKiBtb3ZlZC5cbiAqXG4gKiAgLSBDaHVua3Mgb2YgZGF0YSBvZiBzaXplIGBibG9ja1NpemUgKiBibG9ja1NpemVgIGZyb20gZGVwdGggYXJlIHJlYXJyYW5nZWRcbiAqIGludG8gbm9uLW92ZXJsYXBwaW5nIGJsb2NrcyBvZiBzaXplIGBibG9ja1NpemUgeCBibG9ja1NpemVgXG4gKlxuICogIC0gVGhlIHdpZHRoIHRoZSBvdXRwdXQgdGVuc29yIGlzIGBpbnB1dFdpZHRoICogYmxvY2tTaXplYCwgd2hlcmVhcyB0aGVcbiAqIGhlaWdodCBpcyBgaW5wdXRIZWlnaHQgKiBibG9ja1NpemVgXG4gKlxuICogIC0gVGhlIFksIFggY29vcmRpbmF0ZXMgd2l0aGluIGVhY2ggYmxvY2sgb2YgdGhlIG91dHB1dCBpbWFnZSBhcmUgZGV0ZXJtaW5lZFxuICogYnkgdGhlIGhpZ2ggb3JkZXIgY29tcG9uZW50IG9mIHRoZSBpbnB1dCBjaGFubmVsIGluZGV4XG4gKlxuICogIC0gVGhlIGRlcHRoIG9mIHRoZSBpbnB1dCB0ZW5zb3IgbXVzdCBiZSBkaXZpc2libGUgYnkgYGJsb2NrU2l6ZSAqXG4gKiBibG9ja1NpemVgXG4gKlxuICogVGhlIGBkYXRhRm9ybWF0YCBhdHRyIHNwZWNpZmllcyB0aGUgbGF5b3V0IG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IHRlbnNvcnNcbiAqIHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zOiBcIk5IV0NcIjogWyBgYmF0Y2gsIGhlaWdodCwgd2lkdGgsIGNoYW5uZWxzYCBdXG4gKiBcIk5DSFdcIjogWyBgYmF0Y2gsIGNoYW5uZWxzLCBoZWlnaHQsIHdpZHRoYCBdXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3I0ZChbMSwgMiwgMywgNF0sIFsxLCAxLCAxLCA0XSk7XG4gKiBjb25zdCBibG9ja1NpemUgPSAyO1xuICogY29uc3QgZGF0YUZvcm1hdCA9IFwiTkhXQ1wiO1xuICpcbiAqIHRmLmRlcHRoVG9TcGFjZSh4LCBibG9ja1NpemUsIGRhdGFGb3JtYXQpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yIG9mIHJhbmsgNFxuICogQHBhcmFtIGJsb2NrU0l6ZSAgQW4gYGludGAgdGhhdCBpcyBgPj0gMmAuIFRoZSBzaXplIG9mIHRoZSBzcGF0aWFsIGJsb2NrXG4gKiBAcGFyYW0gZGF0YUZvcm1hdCBBbiBvcHRpb25hbCBzdHJpbmcgZnJvbTogXCJOSFdDXCIsIFwiTkNIV1wiLiBEZWZhdWx0cyB0byBcIk5IV0NcIlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1RyYW5zZm9ybWF0aW9ucyd9XG4gKi9cbmZ1bmN0aW9uIGRlcHRoVG9TcGFjZV8oeCwgYmxvY2tTaXplLCBkYXRhRm9ybWF0ID0gJ05IV0MnKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnZGVwdGhUb1NwYWNlJyk7XG4gICAgY29uc3QgaW5wdXRIZWlnaHQgPSAoZGF0YUZvcm1hdCA9PT0gJ05IV0MnKSA/ICR4LnNoYXBlWzFdIDogJHguc2hhcGVbMl07XG4gICAgY29uc3QgaW5wdXRXaWR0aCA9IChkYXRhRm9ybWF0ID09PSAnTkhXQycpID8gJHguc2hhcGVbMl0gOiAkeC5zaGFwZVszXTtcbiAgICBjb25zdCBpbnB1dERlcHRoID0gKGRhdGFGb3JtYXQgPT09ICdOSFdDJykgPyAkeC5zaGFwZVszXSA6ICR4LnNoYXBlWzFdO1xuICAgIHV0aWwuYXNzZXJ0KGlucHV0SGVpZ2h0ICogYmxvY2tTaXplID49IDAsICgpID0+IGBOZWdhdGl2ZSBkaW1lbnNpb24gc2l6ZSBjYXVzZWQgYnkgb3ZlcmZsb3cgd2hlbiBtdWx0aXBseWluZ1xuICAgICR7aW5wdXRIZWlnaHR9IGFuZCAke2Jsb2NrU2l6ZX0gIGZvciBkZXB0aFRvU3BhY2Ugd2l0aCBpbnB1dCBzaGFwZVxuICAgICR7JHguc2hhcGV9YCk7XG4gICAgdXRpbC5hc3NlcnQoaW5wdXRXaWR0aCAqIGJsb2NrU2l6ZSA+PSAwLCAoKSA9PiBgTmVnYXRpdmUgZGltZW5zaW9uIHNpemUgY2F1c2VkIGJ5IG92ZXJmbG93IHdoZW4gbXVsdGlwbHlpbmdcbiAgICAke2lucHV0V2lkdGh9IGFuZCAke2Jsb2NrU2l6ZX0gZm9yIGRlcHRoVG9TcGFjZSB3aXRoIGlucHV0IHNoYXBlXG4gICAgICAgICR7JHguc2hhcGV9YCk7XG4gICAgdXRpbC5hc3NlcnQoKGlucHV0RGVwdGggJSAoYmxvY2tTaXplICogYmxvY2tTaXplKSA9PT0gMCksICgpID0+IGBEaW1lbnNpb24gc2l6ZSBtdXN0IGJlIGV2ZW5seSBkaXZpc2libGUgYnkgJHtibG9ja1NpemUgKiBibG9ja1NpemV9IGJ1dCBpcyAke2lucHV0RGVwdGh9IGZvciBkZXB0aFRvU3BhY2Ugd2l0aCBpbnB1dCBzaGFwZSAkeyR4LnNoYXBlfWApO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICBjb25zdCBhdHRycyA9IHsgYmxvY2tTaXplLCBkYXRhRm9ybWF0IH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoRGVwdGhUb1NwYWNlLCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBkZXB0aFRvU3BhY2UgPSBvcCh7IGRlcHRoVG9TcGFjZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZXB0aF90b19zcGFjZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgRGVwdGh3aXNlQ29udjJkTmF0aXZlIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbi8qKlxuICogRGVwdGh3aXNlIDJEIGNvbnZvbHV0aW9uLlxuICpcbiAqIEdpdmVuIGEgNEQgYGlucHV0YCBhcnJheSBhbmQgYSBgZmlsdGVyYCBhcnJheSBvZiBzaGFwZVxuICogYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBpbkNoYW5uZWxzLCBjaGFubmVsTXVsdGlwbGllcl1gIGNvbnRhaW5pbmdcbiAqIGBpbkNoYW5uZWxzYCBjb252b2x1dGlvbmFsIGZpbHRlcnMgb2YgZGVwdGggMSwgdGhpcyBvcCBhcHBsaWVzIGFcbiAqIGRpZmZlcmVudCBmaWx0ZXIgdG8gZWFjaCBpbnB1dCBjaGFubmVsIChleHBhbmRpbmcgZnJvbSAxIGNoYW5uZWwgdG9cbiAqIGBjaGFubmVsTXVsdGlwbGllcmAgY2hhbm5lbHMgZm9yIGVhY2gpLCB0aGVuIGNvbmNhdGVuYXRlcyB0aGUgcmVzdWx0c1xuICogdG9nZXRoZXIuIFRoZSBvdXRwdXQgaGFzIGBpbkNoYW5uZWxzICogY2hhbm5lbE11bHRpcGxpZXJgIGNoYW5uZWxzLlxuICpcbiAqIFNlZVxuICogW2h0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9kZXB0aHdpc2VfY29udjJkXShcbiAqICAgICBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vZGVwdGh3aXNlX2NvbnYyZClcbiAqIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciwgb2YgcmFuayA0IG9yIHJhbmsgMywgb2Ygc2hhcGVcbiAqICAgICBgW2JhdGNoLCBoZWlnaHQsIHdpZHRoLCBpbkNoYW5uZWxzXWAuIElmIHJhbmsgMywgYmF0Y2ggb2YgMSBpc1xuICogYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciB0ZW5zb3IsIHJhbmsgNCwgb2Ygc2hhcGVcbiAqICAgICBgW2ZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGluQ2hhbm5lbHMsIGNoYW5uZWxNdWx0aXBsaWVyXWAuXG4gKiBAcGFyYW0gc3RyaWRlcyBUaGUgc3RyaWRlcyBvZiB0aGUgY29udm9sdXRpb246IGBbc3RyaWRlSGVpZ2h0LFxuICogc3RyaWRlV2lkdGhdYC4gSWYgc3RyaWRlcyBpcyBhIHNpbmdsZSBudW1iZXIsIHRoZW4gYHN0cmlkZUhlaWdodCA9PVxuICogc3RyaWRlV2lkdGhgLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobS5cbiAqICAgLSBgc2FtZWAgYW5kIHN0cmlkZSAxOiBvdXRwdXQgd2lsbCBiZSBvZiBzYW1lIHNpemUgYXMgaW5wdXQsXG4gKiAgICAgICByZWdhcmRsZXNzIG9mIGZpbHRlciBzaXplLlxuICogICAtIGB2YWxpZGA6IG91dHB1dCB3aWxsIGJlIHNtYWxsZXIgdGhhbiBpbnB1dCBpZiBmaWx0ZXIgaXMgbGFyZ2VyXG4gKiAgICAgICB0aGFuIDF4MS5cbiAqICAgLSBGb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uXShcbiAqICAgICAgICAgIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbilcbiAqIEBwYXJhbSBkaWxhdGlvbnMgVGhlIGRpbGF0aW9uIHJhdGVzOiBgW2RpbGF0aW9uSGVpZ2h0LCBkaWxhdGlvbldpZHRoXWBcbiAqICAgICBpbiB3aGljaCB3ZSBzYW1wbGUgaW5wdXQgdmFsdWVzIGFjcm9zcyB0aGUgaGVpZ2h0IGFuZCB3aWR0aCBkaW1lbnNpb25zXG4gKiAgICAgaW4gYXRyb3VzIGNvbnZvbHV0aW9uLiBEZWZhdWx0cyB0byBgWzEsIDFdYC4gSWYgYHJhdGVgIGlzIGEgc2luZ2xlXG4gKiAgICAgbnVtYmVyLCB0aGVuIGBkaWxhdGlvbkhlaWdodCA9PSBkaWxhdGlvbldpZHRoYC4gSWYgaXQgaXMgZ3JlYXRlciB0aGFuXG4gKiAgICAgMSwgdGhlbiBhbGwgdmFsdWVzIG9mIGBzdHJpZGVzYCBtdXN0IGJlIDEuXG4gKiBAcGFyYW0gZGF0YUZvcm1hdDogQW4gb3B0aW9uYWwgc3RyaW5nIGZyb206IFwiTkhXQ1wiLCBcIk5DSFdcIi4gRGVmYXVsdHMgdG9cbiAqICAgICBcIk5IV0NcIi4gU3BlY2lmeSB0aGUgZGF0YSBmb3JtYXQgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YS4gV2l0aCB0aGVcbiAqICAgICBkZWZhdWx0IGZvcm1hdCBcIk5IV0NcIiwgdGhlIGRhdGEgaXMgc3RvcmVkIGluIHRoZSBvcmRlciBvZjogW2JhdGNoLFxuICogICAgIGhlaWdodCwgd2lkdGgsIGNoYW5uZWxzXS4gT25seSBcIk5IV0NcIiBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlxuICogQHBhcmFtIGRpbVJvdW5kaW5nTW9kZSBBIHN0cmluZyBmcm9tOiAnY2VpbCcsICdyb3VuZCcsICdmbG9vcicuIElmIG5vbmUgaXNcbiAqICAgICBwcm92aWRlZCwgaXQgd2lsbCBkZWZhdWx0IHRvIHRydW5jYXRlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0NvbnZvbHV0aW9uJ31cbiAqL1xuZnVuY3Rpb24gZGVwdGh3aXNlQ29udjJkXyh4LCBmaWx0ZXIsIHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCA9ICdOSFdDJywgZGlsYXRpb25zID0gWzEsIDFdLCBkaW1Sb3VuZGluZ01vZGUpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdkZXB0aHdpc2VDb252MmQnKTtcbiAgICBjb25zdCAkZmlsdGVyID0gY29udmVydFRvVGVuc29yKGZpbHRlciwgJ2ZpbHRlcicsICdkZXB0aHdpc2VDb252MmQnKTtcbiAgICBsZXQgeDREID0gJHg7XG4gICAgbGV0IHJlc2hhcGVkVG80RCA9IGZhbHNlO1xuICAgIGlmICgkeC5yYW5rID09PSAzKSB7XG4gICAgICAgIHJlc2hhcGVkVG80RCA9IHRydWU7XG4gICAgICAgIHg0RCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV0sICR4LnNoYXBlWzJdXSk7XG4gICAgfVxuICAgIHV0aWwuYXNzZXJ0KHg0RC5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gZGVwdGh3aXNlQ29udjJkOiBpbnB1dCBtdXN0IGJlIHJhbmsgNCwgYnV0IGdvdCBgICtcbiAgICAgICAgYHJhbmsgJHt4NEQucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoJGZpbHRlci5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gZGVwdGh3aXNlQ29udjJkOiBmaWx0ZXIgbXVzdCBiZSByYW5rIDQsIGJ1dCBnb3QgcmFuayBgICtcbiAgICAgICAgYCR7JGZpbHRlci5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydCh4NEQuc2hhcGVbM10gPT09ICRmaWx0ZXIuc2hhcGVbMl0sICgpID0+IGBFcnJvciBpbiBkZXB0aHdpc2VDb252MmQ6IG51bWJlciBvZiBpbnB1dCBjaGFubmVscyBgICtcbiAgICAgICAgYCgke3g0RC5zaGFwZVszXX0pIG11c3QgbWF0Y2ggdGhlIGluQ2hhbm5lbHMgZGltZW5zaW9uIGluIGAgK1xuICAgICAgICBgZmlsdGVyICR7JGZpbHRlci5zaGFwZVsyXX0uYCk7XG4gICAgaWYgKGRpbVJvdW5kaW5nTW9kZSAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNJbnQocGFkKSwgKCkgPT4gYEVycm9yIGluIGRlcHRod2lzZUNvbnYyZDogcGFkIG11c3QgYmUgYW4gaW50ZWdlciB3aGVuIHVzaW5nLCBgICtcbiAgICAgICAgICAgIGBkaW1Sb3VuZGluZ01vZGUgJHtkaW1Sb3VuZGluZ01vZGV9IGJ1dCBnb3QgcGFkICR7cGFkfS5gKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiB4NEQsIGZpbHRlcjogJGZpbHRlciB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQsIGRpbGF0aW9ucywgZGltUm91bmRpbmdNb2RlIH07XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgIGNvbnN0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoRGVwdGh3aXNlQ29udjJkTmF0aXZlLCBpbnB1dHMsIGF0dHJzKTtcbiAgICBpZiAocmVzaGFwZWRUbzREKSB7XG4gICAgICAgIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydCBjb25zdCBkZXB0aHdpc2VDb252MmQgPSBvcCh7IGRlcHRod2lzZUNvbnYyZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZXB0aHdpc2VfY29udjJkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlciB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL3Jlc2hhcGUnO1xuZnVuY3Rpb24gZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXJfKHgsIGR5LCBmaWx0ZXJTaGFwZSwgc3RyaWRlcywgcGFkLCBkaWxhdGlvbnMgPSBbMSwgMV0sIGRpbVJvdW5kaW5nTW9kZSkge1xuICAgIGxldCB4NEQgPSB4O1xuICAgIGlmICh4LnJhbmsgPT09IDMpIHtcbiAgICAgICAgeDREID0gcmVzaGFwZSh4LCBbMSwgeC5zaGFwZVswXSwgeC5zaGFwZVsxXSwgeC5zaGFwZVsyXV0pO1xuICAgIH1cbiAgICBsZXQgZHk0RCA9IGR5O1xuICAgIGlmIChkeTRELnJhbmsgPT09IDMpIHtcbiAgICAgICAgZHk0RCA9IHJlc2hhcGUoZHksIFsxLCBkeS5zaGFwZVswXSwgZHkuc2hhcGVbMV0sIGR5LnNoYXBlWzJdXSk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogeDRELCBkeTogZHk0RCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgZGlsYXRpb25zLCBmaWx0ZXJTaGFwZSB9O1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlciwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIgPSBvcCh7IGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRlcHRod2lzZV9jb252MmRfbmF0aXZlX2JhY2twcm9wX2ZpbHRlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL3Jlc2hhcGUnO1xuZnVuY3Rpb24gZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dF8oeFNoYXBlLCBkeSwgZmlsdGVyLCBzdHJpZGVzLCBwYWQsIGRpbGF0aW9ucyA9IFsxLCAxXSwgZGltUm91bmRpbmdNb2RlKSB7XG4gICAgbGV0IGR5NEQgPSBkeTtcbiAgICBsZXQgcmVzaGFwZWRUbzREID0gZmFsc2U7XG4gICAgaWYgKGR5LnJhbmsgPT09IDMpIHtcbiAgICAgICAgcmVzaGFwZWRUbzREID0gdHJ1ZTtcbiAgICAgICAgZHk0RCA9IHJlc2hhcGUoZHksIFsxLCBkeS5zaGFwZVswXSwgZHkuc2hhcGVbMV0sIGR5LnNoYXBlWzJdXSk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0cyA9IHsgZHk6IGR5NEQsIGZpbHRlciB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgZGlsYXRpb25zLCBpbnB1dFNoYXBlOiB4U2hhcGUgfTtcbiAgICBjb25zdCByZXMgPSBcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgRU5HSU5FLnJ1bktlcm5lbChEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0LCBpbnB1dHMsIGF0dHJzKTtcbiAgICBpZiAocmVzaGFwZWRUbzREKSB7XG4gICAgICAgIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydCBjb25zdCBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0ID0gb3AoeyBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0XyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRlcHRod2lzZV9jb252MmRfbmF0aXZlX2JhY2twcm9wX2lucHV0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBEaWFnIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV0dXJucyBhIGRpYWdvbmFsIHRlbnNvciB3aXRoIGEgZ2l2ZW4gZGlhZ29uYWwgdmFsdWVzLlxuICpcbiAqIEdpdmVuIGEgZGlhZ29uYWwsIHRoaXMgb3BlcmF0aW9uIHJldHVybnMgYSB0ZW5zb3Igd2l0aCB0aGUgZGlhZ29uYWwgYW5kXG4gKiBldmVyeXRoaW5nIGVsc2UgcGFkZGVkIHdpdGggemVyb3MuXG4gKlxuICogQXNzdW1lIHRoZSBpbnB1dCBoYXMgZGltZW5zaW9ucyBgW0QxLC4uLiwgRGtdYCwgdGhlbiB0aGUgb3V0cHV0IGlzIGEgdGVuc29yXG4gKiBvZiByYW5rIDJrIHdpdGggZGltZW5zaW9ucyBgW0QxLC4uLiwgRGssIEQxLC4uLiwgRGtdYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDMsIDRdKTtcbiAqXG4gKiB0Zi5kaWFnKHgpLnByaW50KClcbiAqIGBgYFxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgMywgNCwgNSwgNiwgNiwgOF0sIFs0LCAyXSlcbiAqXG4gKiB0Zi5kaWFnKHgpLnByaW50KClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmZ1bmN0aW9uIGRpYWdfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdkaWFnJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKERpYWcsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgZGlhZyA9IG9wKHsgZGlhZ18gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaWFnLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBEaWxhdGlvbjJEIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIGdyYXlzY2FsZSBkaWxhdGlvbiBvdmVyIHRoZSBpbnB1dCBgeGAuXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciwgcmFuayAzIG9yIHJhbmsgNCBvZiBzaGFwZVxuICogICAgIGBbYmF0Y2gsIGhlaWdodCwgd2lkdGgsIGluQ2hhbm5lbHNdYC4gSWYgcmFuayAzLCBiYXRjaCBvZiAxIGlzIGFzc3VtZWQuXG4gKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgdGVuc29yLCByYW5rIDMsIG9mIHNoYXBlXG4gKiAgICAgYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBkZXB0aF1gLlxuICogQHBhcmFtIHN0cmlkZXMgVGhlIHN0cmlkZXMgb2YgdGhlIHNsaWRpbmcgd2luZG93IGZvciBlYWNoIGRpbWVuc2lvbiBvZiB0aGVcbiAqICAgICBpbnB1dCB0ZW5zb3I6IGBbc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aF1gLlxuICogICAgIElmIGBzdHJpZGVzYCBpcyBhIHNpbmdsZSBudW1iZXIsXG4gKiAgICAgdGhlbiBgc3RyaWRlSGVpZ2h0ID09IHN0cmlkZVdpZHRoYC5cbiAqIEBwYXJhbSBwYWQgVGhlIHR5cGUgb2YgcGFkZGluZyBhbGdvcml0aG0uXG4gKiAgICAtIGBzYW1lYCBhbmQgc3RyaWRlIDE6IG91dHB1dCB3aWxsIGJlIG9mIHNhbWUgc2l6ZSBhcyBpbnB1dCxcbiAqICAgICAgIHJlZ2FyZGxlc3Mgb2YgZmlsdGVyIHNpemUuXG4gKiAgICAtIGB2YWxpZGA6IG91dHB1dCB3aWxsIGJlIHNtYWxsZXIgdGhhbiBpbnB1dCBpZiBmaWx0ZXIgaXMgbGFyZ2VyXG4gKiAgICAgICB0aGFuIDEqMXgxLlxuICogICAgLSBGb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uXShcbiAqICAgICAgICAgIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbilcbiAqIEBwYXJhbSBkYXRhRm9ybWF0IFNwZWNpZnkgdGhlIGRhdGEgZm9ybWF0IG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEuXG4gKiAgICAgIERlZmF1bHRzIHRvICdOSFdDJy4gT25seSAnTkhXQycgaXMgY3VycmVudGx5IHN1cHBvcnRlZC4gV2l0aCB0aGVcbiAqICAgICAgZGVmYXVsdCBmb3JtYXQgXCJOSFdDXCIsIHRoZSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgb3JkZXIgb2Y6IFtiYXRjaCxcbiAqICAgICAgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbHNdLlxuICogQHBhcmFtIGRpbGF0aW9ucyBUaGUgZGlsYXRpb24gcmF0ZXM6IGBbZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGhdYFxuICogICAgIGluIHdoaWNoIHdlIHNhbXBsZSBpbnB1dCB2YWx1ZXMgYWNyb3NzIHRoZSBoZWlnaHQgYW5kIHdpZHRoIGRpbWVuc2lvbnNcbiAqICAgICBmb3IgYXRyb3VzIG1vcnBob2xvZ2ljYWwgZGlsYXRpb24uIERlZmF1bHRzIHRvIGBbMSwgMV1gLiBJZiBgZGlsYXRpb25zYFxuICogICAgIGlzIGEgc2luZ2xlIG51bWJlciwgdGhlbiBgZGlsYXRpb25IZWlnaHQgPT0gZGlsYXRpb25XaWR0aGAuIElmIGl0IGlzXG4gKiAgICAgZ3JlYXRlciB0aGFuIDEsIHRoZW4gYWxsIHZhbHVlcyBvZiBgc3RyaWRlc2AgbXVzdCBiZSAxLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0NvbnZvbHV0aW9uJ31cbiAqL1xuZnVuY3Rpb24gZGlsYXRpb24yZF8oeCwgZmlsdGVyLCBzdHJpZGVzLCBwYWQsIGRpbGF0aW9ucyA9IFsxLCAxXSwgZGF0YUZvcm1hdCA9ICdOSFdDJykge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2RpbGF0aW9uMmQnKTtcbiAgICBjb25zdCAkZmlsdGVyID0gY29udmVydFRvVGVuc29yKGZpbHRlciwgJ2ZpbHRlcicsICdkaWxhdGlvbjJkJyk7XG4gICAgdXRpbC5hc3NlcnQoJHgucmFuayA9PT0gMyB8fCAkeC5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gZGlsYXRpb24yZDogaW5wdXQgbXVzdCBiZSByYW5rIDMgb3IgNCwgYnV0IGdvdCByYW5rIGAgK1xuICAgICAgICBgJHskeC5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydCgkZmlsdGVyLnJhbmsgPT09IDMsICgpID0+IGBFcnJvciBpbiBkaWxhdGlvbjJkOiBmaWx0ZXIgbXVzdCBiZSByYW5rIDMsIGJ1dCBnb3QgcmFuayBgICtcbiAgICAgICAgYCR7JGZpbHRlci5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydChkYXRhRm9ybWF0ID09PSAnTkhXQycsICgpID0+IGBFcnJvciBpbiBkaWxhdGlvbjJkOiBPbmx5IE5IV0MgaXMgY3VycmVudGx5IHN1cHBvcnRlZCwgYCArXG4gICAgICAgIGBidXQgZ290IGRhdGFGb3JtYXQgb2YgJHtkYXRhRm9ybWF0fWApO1xuICAgIGxldCB4NEQgPSAkeDtcbiAgICBsZXQgcmVzaGFwZWRUbzREID0gZmFsc2U7XG4gICAgaWYgKCR4LnJhbmsgPT09IDMpIHtcbiAgICAgICAgeDREID0gcmVzaGFwZSgkeCwgWzEsICR4LnNoYXBlWzBdLCAkeC5zaGFwZVsxXSwgJHguc2hhcGVbMl1dKTtcbiAgICAgICAgcmVzaGFwZWRUbzREID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiB4NEQsIGZpbHRlcjogJGZpbHRlciB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBzdHJpZGVzLCBwYWQsIGRpbGF0aW9ucyB9O1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICBjb25zdCByZXMgPSBFTkdJTkUucnVuS2VybmVsKERpbGF0aW9uMkQsIGlucHV0cywgYXR0cnMpO1xuICAgIGlmIChyZXNoYXBlZFRvNEQpIHtcbiAgICAgICAgcmV0dXJuIHJlc2hhcGUocmVzLCBbcmVzLnNoYXBlWzFdLCByZXMuc2hhcGVbMl0sIHJlcy5zaGFwZVszXV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IGRpbGF0aW9uMmQgPSBvcCh7IGRpbGF0aW9uMmRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGlsYXRpb24yZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgUmVhbERpdiB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBtYWtlVHlwZXNNYXRjaCB9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBmbG9vckRpdiB9IGZyb20gJy4vZmxvb3JEaXYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIERpdmlkZXMgdHdvIGB0Zi5UZW5zb3JgcyBlbGVtZW50LXdpc2UsIEEgLyBCLiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgNCwgOSwgMTZdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbMSwgMiwgMywgNF0pO1xuICpcbiAqIGEuZGl2KGIpLnByaW50KCk7ICAvLyBvciB0Zi5kaXYoYSwgYilcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBCcm9hZGNhc3QgZGl2IGEgd2l0aCBiLlxuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsyLCA0LCA2LCA4XSk7XG4gKiBjb25zdCBiID0gdGYuc2NhbGFyKDIpO1xuICpcbiAqIGEuZGl2KGIpLnByaW50KCk7ICAvLyBvciB0Zi5kaXYoYSwgYilcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCB0ZW5zb3IgYXMgdGhlIG51bWVyYXRvci5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgdGVuc29yIGFzIHRoZSBkZW5vbWluYXRvci4gTXVzdCBoYXZlIHRoZSBzYW1lIGR0eXBlIGFzXG4gKiBgYWAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQXJpdGhtZXRpYyd9XG4gKi9cbmZ1bmN0aW9uIGRpdl8oYSwgYikge1xuICAgIGxldCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdkaXYnKTtcbiAgICBsZXQgJGIgPSBjb252ZXJ0VG9UZW5zb3IoYiwgJ2InLCAnZGl2Jyk7XG4gICAgWyRhLCAkYl0gPSBtYWtlVHlwZXNNYXRjaCgkYSwgJGIpO1xuICAgIGlmICgkYS5kdHlwZSA9PT0gJ2ludDMyJyAmJiAkYi5kdHlwZSA9PT0gJ2ludDMyJykge1xuICAgICAgICByZXR1cm4gZmxvb3JEaXYoJGEsICRiKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyBhOiAkYSwgYjogJGIgfTtcbiAgICBjb25zdCBhdHRycyA9IHt9O1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChSZWFsRGl2LCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBkaXYgPSBvcCh7IGRpdl8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaXYuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgbWFrZVR5cGVzTWF0Y2ggfSBmcm9tICcuLi90ZW5zb3JfdXRpbCc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgZGl2IH0gZnJvbSAnLi9kaXYnO1xuaW1wb3J0IHsgZXF1YWwgfSBmcm9tICcuL2VxdWFsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgd2hlcmUgfSBmcm9tICcuL3doZXJlJztcbmltcG9ydCB7IHplcm9zTGlrZSB9IGZyb20gJy4vemVyb3NfbGlrZSc7XG4vKipcbiAqIERpdmlkZXMgdHdvIGB0Zi5UZW5zb3JgcyBlbGVtZW50LXdpc2UsIEEgLyBCLiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuIFJldHVybiAwXG4gKiBpZiBkZW5vbWluYXRvciBpcyAwLlxuICpcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCA0LCA5LCAxNl0pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzLCA0XSk7XG4gKiBjb25zdCBjID0gdGYudGVuc29yMWQoWzAsIDAsIDAsIDBdKTtcbiAqXG4gKiBhLmRpdk5vTmFuKGIpLnByaW50KCk7ICAvLyBvciB0Zi5kaXZOb05hbihhLCBiKVxuICogYS5kaXZOb05hbihjKS5wcmludCgpOyAgLy8gb3IgdGYuZGl2Tm9OYW4oYSwgYylcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBCcm9hZGNhc3QgZGl2IGEgd2l0aCBiLlxuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsyLCA0LCA2LCA4XSk7XG4gKiBjb25zdCBiID0gdGYuc2NhbGFyKDIpO1xuICogY29uc3QgYyA9IHRmLnNjYWxhcigwKTtcbiAqXG4gKiBhLmRpdk5vTmFuKGIpLnByaW50KCk7ICAvLyBvciB0Zi5kaXZOb05hbihhLCBiKVxuICogYS5kaXZOb05hbihjKS5wcmludCgpOyAgLy8gb3IgdGYuZGl2Tm9OYW4oYSwgYylcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCB0ZW5zb3IgYXMgdGhlIG51bWVyYXRvci5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgdGVuc29yIGFzIHRoZSBkZW5vbWluYXRvci4gTXVzdCBoYXZlIHRoZSBzYW1lIGR0eXBlIGFzXG4gKiBgYWAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQXJpdGhtZXRpYyd9XG4gKi9cbmZ1bmN0aW9uIGRpdk5vTmFuXyhhLCBiKSB7XG4gICAgLy8gVE9ETzogTWFrZSB0aGlzIGludG8gaXRzIG93biBrZXJuZWwuXG4gICAgbGV0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ2RpdicpO1xuICAgIGxldCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdkaXYnKTtcbiAgICBbJGEsICRiXSA9IG1ha2VUeXBlc01hdGNoKCRhLCAkYik7XG4gICAgY29uc3QgZGl2UmVzdWx0ID0gZGl2KCRhLCAkYik7XG4gICAgY29uc3QgemVyb3MgPSB6ZXJvc0xpa2UoZGl2UmVzdWx0KTtcbiAgICBjb25zdCBiRXF1YWxzWmVybyA9IGVxdWFsKCRiLCB6ZXJvcyk7XG4gICAgcmV0dXJuIHdoZXJlKGJFcXVhbHNaZXJvLCB6ZXJvcywgZGl2UmVzdWx0KTtcbn1cbmV4cG9ydCBjb25zdCBkaXZOb05hbiA9IG9wKHsgZGl2Tm9OYW5fIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGl2X25vX25hbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG1hdE11bCB9IGZyb20gJy4vbWF0X211bCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL3Jlc2hhcGUnO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIG1hdHJpY2VzIGFuZC9vciB2ZWN0b3JzLCBgdDFgIGFuZCBgdDJgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDJdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IyZChbWzEsIDJdLCBbMywgNF1dKTtcbiAqIGNvbnN0IGMgPSB0Zi50ZW5zb3IyZChbWzEsIDIsIDNdLCBbNCwgNSwgNl1dKTtcbiAqXG4gKiBhLmRvdChiKS5wcmludCgpOyAgLy8gb3IgdGYuZG90KGEsIGIpXG4gKiBiLmRvdChhKS5wcmludCgpO1xuICogYi5kb3QoYykucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIHQxIFRoZSBmaXJzdCB0ZW5zb3IgaW4gdGhlIGRvdCBvcGVyYXRpb24uXG4gKiBAcGFyYW0gdDIgVGhlIHNlY29uZCB0ZW5zb3IgaW4gdGhlIGRvdCBvcGVyYXRpb24uXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTWF0cmljZXMnfVxuICovXG5mdW5jdGlvbiBkb3RfKHQxLCB0Mikge1xuICAgIGNvbnN0ICR0MSA9IGNvbnZlcnRUb1RlbnNvcih0MSwgJ3QxJywgJ2RvdCcpO1xuICAgIGNvbnN0ICR0MiA9IGNvbnZlcnRUb1RlbnNvcih0MiwgJ3QyJywgJ2RvdCcpO1xuICAgIHV0aWwuYXNzZXJ0KCgkdDEucmFuayA9PT0gMSB8fCAkdDEucmFuayA9PT0gMikgJiYgKCR0Mi5yYW5rID09PSAxIHx8ICR0Mi5yYW5rID09PSAyKSwgKCkgPT4gYEVycm9yIGluIGRvdDogaW5wdXRzIG11c3QgYWxsIGJlIHJhbmsgMSBvciAyLCBidXQgZ290IHJhbmtzIGAgK1xuICAgICAgICBgJHskdDEucmFua30gYW5kICR7JHQyLnJhbmt9LmApO1xuICAgIGNvbnN0IHQxSW5uZXIgPSAoJHQxLnJhbmsgPT09IDEgPyAkdDEuc2l6ZSA6ICR0MS5zaGFwZVsxXSk7XG4gICAgY29uc3QgdDJJbm5lciA9ICgkdDIucmFuayA9PT0gMSA/ICR0Mi5zaXplIDogJHQyLnNoYXBlWzBdKTtcbiAgICB1dGlsLmFzc2VydCh0MUlubmVyID09PSB0MklubmVyLCAoKSA9PiBgRXJyb3IgaW4gZG90OiBpbm5lciBkaW1lbnNpb25zIG9mIGlucHV0cyBtdXN0IG1hdGNoLCBidXQgZ290IGAgK1xuICAgICAgICBgJHt0MUlubmVyfSBhbmQgJHt0MklubmVyfS5gKTtcbiAgICBpZiAoJHQxLnJhbmsgPT09IDEgJiYgJHQyLnJhbmsgPT09IDEpIHtcbiAgICAgICAgY29uc3QgdDEyRCA9IHJlc2hhcGUoJHQxLCBbMSwgLTFdKTtcbiAgICAgICAgY29uc3QgdDIyRCA9IHJlc2hhcGUoJHQyLCBbLTEsIDFdKTtcbiAgICAgICAgY29uc3QgdDF0MiA9IG1hdE11bCh0MTJELCB0MjJEKTtcbiAgICAgICAgcmV0dXJuIHJlc2hhcGUodDF0MiwgW10pO1xuICAgIH1cbiAgICBlbHNlIGlmICgkdDEucmFuayA9PT0gMSAmJiAkdDIucmFuayA9PT0gMikge1xuICAgICAgICBjb25zdCB0MTJEID0gcmVzaGFwZSgkdDEsIFsxLCAtMV0pO1xuICAgICAgICBjb25zdCB0MjJEID0gcmVzaGFwZSgkdDIsIFskdDIuc2hhcGVbMF0sICR0Mi5zaGFwZVsxXV0pO1xuICAgICAgICBjb25zdCB0MXQyID0gbWF0TXVsKHQxMkQsIHQyMkQpO1xuICAgICAgICByZXR1cm4gcmVzaGFwZSh0MXQyLCBbdDF0Mi5zaXplXSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKCR0MS5yYW5rID09PSAyICYmICR0Mi5yYW5rID09PSAxKSB7XG4gICAgICAgIGNvbnN0IHQyMkQgPSByZXNoYXBlKCR0MiwgWy0xLCAxXSk7XG4gICAgICAgIGNvbnN0IHQxdDIgPSBtYXRNdWwoJHQxLCB0MjJEKTtcbiAgICAgICAgcmV0dXJuIHJlc2hhcGUodDF0MiwgW3QxdDIuc2l6ZV0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgdDIyRCA9IHJlc2hhcGUoJHQyLCBbJHQyLnNoYXBlWzBdLCAkdDIuc2hhcGVbMV1dKTtcbiAgICAgICAgY29uc3QgdDF0MiA9IG1hdE11bCgkdDEsIHQyMkQpO1xuICAgICAgICByZXR1cm4gdDF0MjtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgZG90ID0gb3AoeyBkb3RfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZG90LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFRlbnNvciB9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IGFkZCB9IGZyb20gJy4vYWRkJztcbmltcG9ydCB7IGRpdiB9IGZyb20gJy4vZGl2JztcbmltcG9ydCB7IGdldE5vaXNlU2hhcGUgfSBmcm9tICcuL2Ryb3BvdXRfdXRpbCc7XG5pbXBvcnQgeyBmbG9vciB9IGZyb20gJy4vZmxvb3InO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi9tdWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByYW5kb21Vbmlmb3JtIH0gZnJvbSAnLi9yYW5kb21fdW5pZm9ybSc7XG4vKipcbiAqIENvbXB1dGVzIGRyb3BvdXQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgMiwgMV0pO1xuICogY29uc3QgcmF0ZSA9IDAuNzU7XG4gKiBjb25zdCBvdXRwdXQgPSB0Zi5kcm9wb3V0KHgsIHJhdGUpO1xuICogb3V0cHV0LnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBBIGZsb2F0aW5nIHBvaW50IFRlbnNvciBvciBUZW5zb3JMaWtlLlxuICogQHBhcmFtIHJhdGUgQSBmbG9hdCBpbiB0aGUgcmFuZ2UgWzAsIDEpLiBUaGUgcHJvYmFiaWxpdHkgdGhhdCBlYWNoIGVsZW1lbnRcbiAqICAgb2YgeCBpcyBkaXNjYXJkZWQuXG4gKiBAcGFyYW0gbm9pc2VTaGFwZSBBbiBhcnJheSBvZiBudW1iZXJzIG9mIHR5cGUgaW50MzIsIHJlcHJlc2VudGluZyB0aGVcbiAqIHNoYXBlIGZvciByYW5kb21seSBnZW5lcmF0ZWQga2VlcC9kcm9wIGZsYWdzLiBJZiB0aGUgbm9pc2VTaGFwZSBoYXMgbnVsbFxuICogdmFsdWUsIGl0IHdpbGwgYmUgYXV0b21hdGljYWxseSByZXBsYWNlZCB3aXRoIHRoZSB4J3MgcmVsYXRpdmUgZGltZW5zaW9uXG4gKiBzaXplLiBPcHRpb25hbC5cbiAqIEBwYXJhbSBzZWVkIFVzZWQgdG8gY3JlYXRlIHJhbmRvbSBzZWVkcy4gT3B0aW9uYWwuXG4gKiBAcmV0dXJucyBBIFRlbnNvciBvZiB0aGUgc2FtZSBzaGFwZSBvZiB4LlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Ryb3BvdXQnfVxuICovXG5mdW5jdGlvbiBkcm9wb3V0Xyh4LCByYXRlLCBub2lzZVNoYXBlLCBzZWVkKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnZHJvcG91dCcpO1xuICAgIHV0aWwuYXNzZXJ0KCR4LmR0eXBlID09PSAnZmxvYXQzMicsICgpID0+IGB4IGhhcyB0byBiZSBhIGZsb2F0aW5nIHBvaW50IHRlbnNvciBzaW5jZSBpdCdzIGdvaW5nIHRvIGJlIGAgK1xuICAgICAgICBgc2NhbGVkLCBidXQgZ290IGEgJHskeC5kdHlwZX0gdGVuc29yIGluc3RlYWQuYCk7XG4gICAgdXRpbC5hc3NlcnQocmF0ZSA+PSAwICYmIHJhdGUgPCAxLCAoKSA9PiBgcmF0ZSBtdXN0IGJlIGEgZmxvYXQgaW4gdGhlIHJhbmdlIFswLCAxKSwgYnV0IGdvdCAke3JhdGV9LmApO1xuICAgIGlmIChyYXRlID09PSAwKSB7XG4gICAgICAgIHJldHVybiB4IGluc3RhbmNlb2YgVGVuc29yID8gJHguY2xvbmUoKSA6ICR4O1xuICAgIH1cbiAgICBjb25zdCAkbm9pc2VTaGFwZSA9IGdldE5vaXNlU2hhcGUoJHgsIG5vaXNlU2hhcGUpO1xuICAgIGNvbnN0IGtlZXBQcm9iID0gMSAtIHJhdGU7XG4gICAgY29uc3QgbXVsdGlwbGllciA9IGRpdihmbG9vcihhZGQocmFuZG9tVW5pZm9ybSgkbm9pc2VTaGFwZSwgMCwgMSwgJ2Zsb2F0MzInLCBzZWVkKSwga2VlcFByb2IpKSwga2VlcFByb2IpO1xuICAgIHJldHVybiBtdWwoJHgsIG11bHRpcGxpZXIpO1xufVxuZXhwb3J0IGNvbnN0IGRyb3BvdXQgPSBvcCh7IGRyb3BvdXRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZHJvcG91dC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuLyoqXG4gKiBOb3JtYWxpemUgbm9pc2Ugc2hhcGUgYmFzZWQgb24gcHJvdmlkZWQgdGVuc29yIGFuZCBub2lzZSBzaGFwZS5cbiAqXG4gKiBAcGFyYW0geCBUZW5zb3IuXG4gKiBAcGFyYW0gbm9pc2VTaGFwZSBUaGUgc2hhcGUgZm9yIHRoZSByYW5kb21seSBnZW5lcmF0ZWQga2VlcC9kcm9wIGZsYWdzLCBhc1xuICogICBhbiBhcnJheSBvZiBudW1iZXJzLiBPcHRpb25hbC5cbiAqIEByZXR1cm5zIE5vcm1hbGl6ZWQgbm9pc2Ugc2hhcGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROb2lzZVNoYXBlKHgsIG5vaXNlU2hhcGUpIHtcbiAgICBpZiAobm9pc2VTaGFwZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB4LnNoYXBlLnNsaWNlKCk7XG4gICAgfVxuICAgIGlmICh1dGlsLmFycmF5c0VxdWFsKHguc2hhcGUsIG5vaXNlU2hhcGUpKSB7XG4gICAgICAgIHJldHVybiBub2lzZVNoYXBlO1xuICAgIH1cbiAgICBpZiAoeC5zaGFwZS5sZW5ndGggPT09IG5vaXNlU2hhcGUubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IG5ld0RpbWVuc2lvbiA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHguc2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChub2lzZVNoYXBlW2ldID09IG51bGwgJiYgeC5zaGFwZVtpXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbmV3RGltZW5zaW9uLnB1c2goeC5zaGFwZVtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXdEaW1lbnNpb24ucHVzaChub2lzZVNoYXBlW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3RGltZW5zaW9uO1xuICAgIH1cbiAgICByZXR1cm4gbm9pc2VTaGFwZTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRyb3BvdXRfdXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgRWluc3VtIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogVGVuc29yIGNvbnRyYWN0aW9uIG92ZXIgc3BlY2lmaWVkIGluZGljZXMgYW5kIG91dGVyIHByb2R1Y3QuXG4gKlxuICogYGVpbnN1bWAgYWxsb3dzIGRlZmluaW5nIFRlbnNvcnMgYnkgZGVmaW5pbmcgdGhlaXIgZWxlbWVudC13aXNlIGNvbXB1dGF0aW9uLlxuICogVGhpcyBjb21wdXRhdGlvbiBpcyBiYXNlZCBvblxuICogW0VpbnN0ZWluIHN1bW1hdGlvbl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRWluc3RlaW5fbm90YXRpb24pLlxuICpcbiAqIFNvbWUgc3BlY2lhbCBjYXNlcyBpbmNsdWRlOlxuICpcbiAqIE1hdHJpeCBtdWx0aXBsaWNhdGlvbjpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoW1sxLCAyLCAzXSwgWzQsIDUsIDZdXSk7XG4gKiBjb25zdCB5ID0gdGYudGVuc29yMmQoW1swLCAxXSwgWzIsIDNdLCBbNCwgNV1dKTtcbiAqIHgucHJpbnQoKTtcbiAqIHkucHJpbnQoKTtcbiAqIHRmLmVpbnN1bSgnaWosamstPmlrJywgeCwgeSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIERvdCBwcm9kdWN0OlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICogY29uc3QgeSA9IHRmLnRlbnNvcjFkKFswLCAxLCAyXSk7XG4gKiB4LnByaW50KCk7XG4gKiB5LnByaW50KCk7XG4gKiB0Zi5laW5zdW0oJ2ksaS0+JywgeCwgeSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEJhdGNoIGRvdCBwcm9kdWN0OlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IyZChbWzEsIDIsIDNdLCBbNCwgNSwgNl1dKTtcbiAqIGNvbnN0IHkgPSB0Zi50ZW5zb3IyZChbWzAsIDEsIDJdLCBbMywgNCwgNV1dKTtcbiAqIHgucHJpbnQoKTtcbiAqIHkucHJpbnQoKTtcbiAqIHRmLmVpbnN1bSgnYmksYmktPmInLCB4LCB5KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogT3V0ZXIgcHJvdWR1Y3Q6XG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAzLCA1XSk7XG4gKiBjb25zdCB5ID0gdGYudGVuc29yMWQoWzIsIDQsIDZdKTtcbiAqIHgucHJpbnQoKTtcbiAqIHkucHJpbnQoKTtcbiAqIHRmLmVpbnN1bSgnaSxqLT5paicsIHgsIHkpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBNYXRyaXggdHJhbnNwb3NlOlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IyZChbWzEsIDJdLCBbMywgNF1dKTtcbiAqIHgucHJpbnQoKTtcbiAqIHRmLmVpbnN1bSgnaWotPmppJywgeCkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEJhdGNoIG1hdHJpeCB0cmFuc3Bvc2U6XG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjNkKFtbWzEsIDJdLCBbMywgNF1dLCBbWy0xLCAtMl0sIFstMywgLTRdXV0pO1xuICogeC5wcmludCgpO1xuICogdGYuZWluc3VtKCdiaWotPmJqaScsIHgpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBMaW1pdGF0aW9uczpcbiAqXG4gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIGVpbnN1bSBoYXMgdGhlIGZvbGxvd2luZyBsaW1pdGF0aW9uczpcbiAqXG4gKiAtIERvZXMgbm90IHN1cHBvcnQgPjIgaW5wdXQgdGVuc29ycy5cbiAqIC0gRG9lcyBub3Qgc3VwcG9ydCBkdXBsaWNhdGUgYXhlcyBmb3IgYW55IGdpdmVuIGlucHV0IHRlbnNvci4gRS5nLiwgZXF1YXRpb25cbiAqICAgJ2lpLT4nIGlzIG5vdCBzdXBwb3RlZC5cbiAqIC0gVGhlIGAuLi5gIG5vdGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuXG4gKlxuICogQHBhcmFtIGVxdWF0aW9uIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGNvbnRyYWN0aW9uLCBpbiB0aGUgc2FtZSBmb3JtYXQgYXNcbiAqIFtudW1weS5laW5zdW1dKGh0dHBzOi8vbnVtcHkub3JnL2RvYy9zdGFibGUvcmVmZXJlbmNlL2dlbmVyYXRlZC9udW1weS5laW5zdW0uaHRtbCkuXG4gKiBAcGFyYW0gdGVuc29ycyB0aGUgaW5wdXQocykgdG8gY29udHJhY3QgKGVhY2ggb25lIGEgVGVuc29yKSwgd2hvc2Ugc2hhcGVzXG4gKiAgICAgc2hvdWxkIGJlIGNvbnNpc3RlbnQgd2l0aCBlcXVhdGlvbi5cbiAqIEByZXR1cm5zIFRoZSBvdXRwdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ01hdHJpY2VzJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVpbnN1bV8oZXF1YXRpb24sIC4uLnRlbnNvcnMpIHtcbiAgICBjb25zdCAkdGVuc29ycyA9IHRlbnNvcnMubWFwKCh0LCBpKSA9PiBjb252ZXJ0VG9UZW5zb3IodCwgYHRlbnNvcnMke2l9YCwgJ2VpbnN1bScpKTtcbiAgICBjb25zdCBhdHRycyA9IHsgZXF1YXRpb24gfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChFaW5zdW0sICR0ZW5zb3JzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgZWluc3VtID0gb3AoeyBlaW5zdW1fIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZWluc3VtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBFbHUgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBleHBvbmVudGlhbCBsaW5lYXIgZWxlbWVudC13aXNlOiBgeCA+IDAgPyBlIF4geCAtIDEgOiAwYC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFstMSwgMSwgLTMsIDJdKTtcbiAqXG4gKiB4LmVsdSgpLnByaW50KCk7ICAvLyBvciB0Zi5lbHUoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gZWx1Xyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnZWx1Jyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEVsdSwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBlbHUgPSBvcCh7IGVsdV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lbHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEVxdWFsIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IG1ha2VUeXBlc01hdGNoIH0gZnJvbSAnLi4vdGVuc29yX3V0aWwnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlIH0gZnJvbSAnLi9icm9hZGNhc3RfdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV0dXJucyB0aGUgdHJ1dGggdmFsdWUgb2YgKGEgPT0gYikgZWxlbWVudC13aXNlLiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFsyLCAyLCAyXSk7XG4gKlxuICogYS5lcXVhbChiKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGEgVGhlIGZpcnN0IGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgaW5wdXQgdGVuc29yLiBNdXN0IGhhdmUgdGhlIHNhbWUgZHR5cGUgYXMgYGFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0xvZ2ljYWwnfVxuICovXG5mdW5jdGlvbiBlcXVhbF8oYSwgYikge1xuICAgIGxldCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdlcXVhbCcsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICAgIGxldCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdlcXVhbCcsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICAgIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcbiAgICBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSgkYS5zaGFwZSwgJGIuc2hhcGUpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgYTogJGEsIGI6ICRiIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoRXF1YWwsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgZXF1YWwgPSBvcCh7IGVxdWFsXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVxdWFsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBFcmYgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBjYXN0IH0gZnJvbSAnLi9jYXN0JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBnYXVzZSBlcnJvciBmdW5jdGlvbiBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOlxuICogYGVyZih4KWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFswLCAuMSwgLS4xLCAuN10pO1xuICpcbiAqIHguZXJmKCkucHJpbnQoKTsgLy8gb3IgdGYuZXJmKHgpO1xuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBlcmZfKHgpIHtcbiAgICBsZXQgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnZXJmJyk7XG4gICAgdXRpbC5hc3NlcnQoJHguZHR5cGUgPT09ICdpbnQzMicgfHwgJHguZHR5cGUgPT09ICdmbG9hdDMyJywgKCkgPT4gJ0lucHV0IGR0eXBlIG11c3QgYmUgYGludDMyYCBvciBgZmxvYXQzMmAuJyk7XG4gICAgaWYgKCR4LmR0eXBlID09PSAnaW50MzInKSB7XG4gICAgICAgICR4ID0gY2FzdCgkeCwgJ2Zsb2F0MzInKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEVyZiwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBlcmYgPSBvcCh7IGVyZl8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lcmYuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuZXhwb3J0IGNvbnN0IEVSRl9QID0gMC4zMjc1OTExO1xuZXhwb3J0IGNvbnN0IEVSRl9BMSA9IDAuMjU0ODI5NTkyO1xuZXhwb3J0IGNvbnN0IEVSRl9BMiA9IC0wLjI4NDQ5NjczNjtcbmV4cG9ydCBjb25zdCBFUkZfQTMgPSAxLjQyMTQxMzc0MTtcbmV4cG9ydCBjb25zdCBFUkZfQTQgPSAtMS40NTMxNTIwMjc7XG5leHBvcnQgY29uc3QgRVJGX0E1ID0gMS4wNjE0MDU0Mjk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lcmZfdXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgRXhwIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgZXhwb25lbnRpYWwgb2YgdGhlIGlucHV0IGB0Zi5UZW5zb3JgIGVsZW1lbnQtd2lzZS4gYGUgXiB4YFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIC0zXSk7XG4gKlxuICogeC5leHAoKS5wcmludCgpOyAgLy8gb3IgdGYuZXhwKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGV4cF8oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2V4cCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChFeHAsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgZXhwID0gb3AoeyBleHBfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXhwLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBFeHBhbmREaW1zIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIFJldHVybnMgYSBgdGYuVGVuc29yYCB0aGF0IGhhcyBleHBhbmRlZCByYW5rLCBieSBpbnNlcnRpbmcgYSBkaW1lbnNpb25cbiAqIGludG8gdGhlIHRlbnNvcidzIHNoYXBlLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDMsIDRdKTtcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5leHBhbmREaW1zKGF4aXMpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yIHdob3NlIGRpbWVuc2lvbnMgdG8gYmUgZXhwYW5kZWQuXG4gKiBAcGFyYW0gYXhpcyBUaGUgZGltZW5zaW9uIGluZGV4IGF0IHdoaWNoIHRvIGluc2VydCBzaGFwZSBvZiBgMWAuIERlZmF1bHRzXG4gKiAgICAgdG8gMCAodGhlIGZpcnN0IGRpbWVuc2lvbikuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnVHJhbnNmb3JtYXRpb25zJ31cbiAqL1xuZnVuY3Rpb24gZXhwYW5kRGltc18oeCwgYXhpcyA9IDApIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdleHBhbmREaW1zJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG4gICAgdXRpbC5hc3NlcnQoYXhpcyA8PSAkeC5yYW5rLCAoKSA9PiAnQXhpcyBtdXN0IGJlIDw9IHJhbmsgb2YgdGhlIHRlbnNvcicpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgaW5wdXQ6ICR4IH07XG4gICAgY29uc3QgYXR0cnMgPSB7IGRpbTogYXhpcyB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEV4cGFuZERpbXMsIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IGV4cGFuZERpbXMgPSBvcCh7IGV4cGFuZERpbXNfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXhwYW5kX2RpbXMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEV4cG0xIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgZXhwb25lbnRpYWwgb2YgdGhlIGlucHV0IGB0Zi5UZW5zb3JgIG1pbnVzIG9uZSBlbGVtZW50LXdpc2UuXG4gKiBgZSBeIHggLSAxYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIC0zXSk7XG4gKlxuICogeC5leHBtMSgpLnByaW50KCk7ICAvLyBvciB0Zi5leHBtMSh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBleHBtMV8oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2V4cG0xJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEV4cG0xLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGV4cG0xID0gb3AoeyBleHBtMV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1leHBtMS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBidWZmZXIgfSBmcm9tICcuL2J1ZmZlcic7XG5pbXBvcnQgeyBleHBhbmREaW1zIH0gZnJvbSAnLi9leHBhbmRfZGltcyc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL3Jlc2hhcGUnO1xuaW1wb3J0IHsgdGlsZSB9IGZyb20gJy4vdGlsZSc7XG4vKipcbiAqIENyZWF0ZSBhbiBpZGVudGl0eSBtYXRyaXguXG4gKlxuICogQHBhcmFtIG51bVJvd3MgTnVtYmVyIG9mIHJvd3MuXG4gKiBAcGFyYW0gbnVtQ29sdW1ucyBOdW1iZXIgb2YgY29sdW1ucy4gRGVmYXVsdHMgdG8gYG51bVJvd3NgLlxuICogQHBhcmFtIGJhdGNoU2hhcGUgSWYgcHJvdmlkZWQsIHdpbGwgYWRkIHRoZSBiYXRjaCBzaGFwZSB0byB0aGUgYmVnaW5uaW5nXG4gKiAgIG9mIHRoZSBzaGFwZSBvZiB0aGUgcmV0dXJuZWQgYHRmLlRlbnNvcmAgYnkgcmVwZWF0aW5nIHRoZSBpZGVudGl0eVxuICogICBtYXRyaXguXG4gKiBAcGFyYW0gZHR5cGUgRGF0YSB0eXBlLlxuICogQHJldHVybnMgSWRlbnRpdHkgbWF0cml4IG9mIHRoZSBzcGVjaWZpZWQgc2l6ZSBhbmQgZGF0YSB0eXBlLCBwb3NzaWJseVxuICogICB3aXRoIGJhdGNoIHJlcGV0aXRpb24gaWYgYGJhdGNoU2hhcGVgIGlzIHNwZWNpZmllZC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmZ1bmN0aW9uIGV5ZV8obnVtUm93cywgbnVtQ29sdW1ucywgYmF0Y2hTaGFwZSwgZHR5cGUgPSAnZmxvYXQzMicpIHtcbiAgICBpZiAobnVtQ29sdW1ucyA9PSBudWxsKSB7XG4gICAgICAgIG51bUNvbHVtbnMgPSBudW1Sb3dzO1xuICAgIH1cbiAgICBjb25zdCBidWZmID0gYnVmZmVyKFtudW1Sb3dzLCBudW1Db2x1bW5zXSwgZHR5cGUpO1xuICAgIGNvbnN0IG4gPSBudW1Sb3dzIDw9IG51bUNvbHVtbnMgPyBudW1Sb3dzIDogbnVtQ29sdW1ucztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgICBidWZmLnNldCgxLCBpLCBpKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0ID0gcmVzaGFwZShidWZmLnRvVGVuc29yKCksIFtudW1Sb3dzLCBudW1Db2x1bW5zXSk7XG4gICAgaWYgKGJhdGNoU2hhcGUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKGJhdGNoU2hhcGUubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gdGlsZShleHBhbmREaW1zKG91dCwgMCksIFtiYXRjaFNoYXBlWzBdLCAxLCAxXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYmF0Y2hTaGFwZS5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgICAgICAgICAgcmV0dXJuIHRpbGUoZXhwYW5kRGltcyhleHBhbmREaW1zKG91dCwgMCksIDApLCBbYmF0Y2hTaGFwZVswXSwgYmF0Y2hTaGFwZVsxXSwgMSwgMV0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGJhdGNoU2hhcGUubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICAgICAgICAgIHJldHVybiB0aWxlKGV4cGFuZERpbXMoZXhwYW5kRGltcyhleHBhbmREaW1zKG91dCwgMCksIDApLCAwKSwgW1xuICAgICAgICAgICAgICAgIGJhdGNoU2hhcGVbMF0sIGJhdGNoU2hhcGVbMV0sIGJhdGNoU2hhcGVbMl0sIDEsIDFcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBleWUoKSBjdXJyZW50bHkgc3VwcG9ydHMgb25seSAxRCBhbmQgMkQgYCArXG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgICAgICAgICAgICAgIGBiYXRjaFNoYXBlcywgYnV0IHJlY2VpdmVkICR7YmF0Y2hTaGFwZS5sZW5ndGh9RC5gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydCBjb25zdCBleWUgPSBvcCh7IGV5ZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1leWUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEZpbGwgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuLyoqXG4gKiBDcmVhdGVzIGEgYHRmLlRlbnNvcmAgZmlsbGVkIHdpdGggYSBzY2FsYXIgdmFsdWUuXG4gKlxuICogYGBganNcbiAqIHRmLmZpbGwoWzIsIDJdLCA0KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHNoYXBlIEFuIGFycmF5IG9mIGludGVnZXJzIGRlZmluaW5nIHRoZSBvdXRwdXQgdGVuc29yIHNoYXBlLlxuICogQHBhcmFtIHZhbHVlIFRoZSBzY2FsYXIgdmFsdWUgdG8gZmlsbCB0aGUgdGVuc29yIHdpdGguXG4gKiBAcGFyYW0gZHR5cGUgVGhlIHR5cGUgb2YgYW4gZWxlbWVudCBpbiB0aGUgcmVzdWx0aW5nIHRlbnNvci4gRGVmYXVsdHMgdG9cbiAqICdmbG9hdCcuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5mdW5jdGlvbiBmaWxsKHNoYXBlLCB2YWx1ZSwgZHR5cGUpIHtcbiAgICBjb25zdCBhdHRycyA9IHsgc2hhcGUsIHZhbHVlLCBkdHlwZSB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEZpbGwsIHt9LCBhdHRycyk7XG59XG5leHBvcnQgeyBmaWxsIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1maWxsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBGbG9vciB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIGZsb29yIG9mIGlucHV0IGB0Zi5UZW5zb3JgIGVsZW1lbnQtd2lzZTogYGZsb29yKHgpYC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsuNiwgMS4xLCAtMy4zXSk7XG4gKlxuICogeC5mbG9vcigpLnByaW50KCk7ICAvLyBvciB0Zi5mbG9vcih4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBmbG9vcl8oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2Zsb29yJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEZsb29yLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGZsb29yID0gb3AoeyBmbG9vcl8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mbG9vci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgRmxvb3JEaXYgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgbWFrZVR5cGVzTWF0Y2ggfSBmcm9tICcuLi90ZW5zb3JfdXRpbCc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIERpdmlkZXMgdHdvIGB0Zi5UZW5zb3JgcyBlbGVtZW50LXdpc2UsIEEgLyBCLiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuXG4gKiBUaGUgcmVzdWx0IGlzIHJvdW5kZWQgd2l0aCBmbG9vciBmdW5jdGlvbi5cbiAqXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgNCwgOSwgMTZdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbMSwgMiwgMywgNF0pO1xuICpcbiAqIGEuZmxvb3JEaXYoYikucHJpbnQoKTsgIC8vIG9yIHRmLmRpdihhLCBiKVxuICogYGBgXG4gKlxuICogYGBganNcbiAqIC8vIEJyb2FkY2FzdCBkaXYgYSB3aXRoIGIuXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzIsIDQsIDYsIDhdKTtcbiAqIGNvbnN0IGIgPSB0Zi5zY2FsYXIoMik7XG4gKlxuICogYS5mbG9vckRpdihiKS5wcmludCgpOyAgLy8gb3IgdGYuZmxvb3JEaXYoYSwgYilcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCB0ZW5zb3IgYXMgdGhlIG51bWVyYXRvci5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgdGVuc29yIGFzIHRoZSBkZW5vbWluYXRvci4gTXVzdCBoYXZlIHRoZSBzYW1lIGR0eXBlIGFzXG4gKiBgYWAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQXJpdGhtZXRpYyd9XG4gKi9cbmZ1bmN0aW9uIGZsb29yRGl2XyhhLCBiKSB7XG4gICAgbGV0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ2Zsb29yRGl2Jyk7XG4gICAgbGV0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ2Zsb29yRGl2Jyk7XG4gICAgWyRhLCAkYl0gPSBtYWtlVHlwZXNNYXRjaCgkYSwgJGIpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgYTogJGEsIGI6ICRiIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoRmxvb3JEaXYsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgZmxvb3JEaXYgPSBvcCh7IGZsb29yRGl2XyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZsb29yRGl2LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBjdXN0b21HcmFkIH0gZnJvbSAnLi4vLi4vZ3JhZGllbnRzJztcbmltcG9ydCB7IEZ1c2VkQ29udjJEIH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IG1ha2VUeXBlc01hdGNoIH0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWwnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgeyBhZGQgfSBmcm9tICcuLi9hZGQnO1xuaW1wb3J0ICogYXMgYnJvYWRjYXN0X3V0aWwgZnJvbSAnLi4vYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0IHsgY29udjJkIGFzIHVuZnVzZWRDb252MmQgfSBmcm9tICcuLi9jb252MmQnO1xuaW1wb3J0IHsgY29udjJEQmFja3Byb3BGaWx0ZXIgfSBmcm9tICcuLi9jb252MmRfYmFja3Byb3BfZmlsdGVyJztcbmltcG9ydCB7IGNvbnYyREJhY2twcm9wSW5wdXQgfSBmcm9tICcuLi9jb252MmRfYmFja3Byb3BfaW5wdXQnO1xuaW1wb3J0ICogYXMgY29udl91dGlsIGZyb20gJy4uL2NvbnZfdXRpbCc7XG5pbXBvcnQgeyBhcHBseUFjdGl2YXRpb24sIGdldEZ1c2VkQmlhc0dyYWRpZW50LCBnZXRGdXNlZER5QWN0aXZhdGlvbiwgc2hvdWxkRnVzZSB9IGZyb20gJy4uL2Z1c2VkX3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4uL3Jlc2hhcGUnO1xuLyoqXG4gKiBDb21wdXRlcyBhIDJEIGNvbnZvbHV0aW9uIG92ZXIgdGhlIGlucHV0IHgsIG9wdGlvbmFsbHkgZnVzZWQgd2l0aCBhZGRpbmcgYVxuICogYmlhcyBhbmQgYXBwbHlpbmcgYW4gYWN0aXZhdGlvbi5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgaW5wdXREZXB0aCA9IDI7XG4gKiBjb25zdCBpblNoYXBlID0gWzIsIDIsIDIsIGlucHV0RGVwdGhdO1xuICogY29uc3Qgb3V0cHV0RGVwdGggPSAyO1xuICogY29uc3QgZlNpemUgPSAxO1xuICogY29uc3QgcGFkID0gMDtcbiAqIGNvbnN0IHN0cmlkZXMgPSAxO1xuICpcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3I0ZCggWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsXG4gKiAxNl0sIGluU2hhcGUpO1xuICogY29uc3QgdyA9IHRmLnRlbnNvcjRkKFstMSwgMSwgLTIsIDAuNV0sIFtmU2l6ZSwgZlNpemUsIGlucHV0RGVwdGgsXG4gKiBvdXRwdXREZXB0aF0pO1xuICpcbiAqIHRmLmZ1c2VkLmNvbnYyZCh7IHgsIGZpbHRlcjogdywgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0OiAnTkhXQycsXG4gKiBkaWxhdGlvbnM6IFsxLCAxXSwgYmlhczogdGYuc2NhbGFyKDUpLCBhY3RpdmF0aW9uOiAncmVsdScgfSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBvYmogQW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciwgb2YgcmFuayA0IG9yIHJhbmsgMywgb2Ygc2hhcGVcbiAqICAgICBgW2JhdGNoLCBoZWlnaHQsIHdpZHRoLCBpbkNoYW5uZWxzXWAuIElmIHJhbmsgMywgYmF0Y2ggb2YgMSBpc1xuICogYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciwgcmFuayA0LCBvZiBzaGFwZVxuICogICAgIGBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5EZXB0aCwgb3V0RGVwdGhdYC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBjb252b2x1dGlvbjogYFtzdHJpZGVIZWlnaHQsXG4gKiBzdHJpZGVXaWR0aF1gLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobS5cbiAqICAgLSBgc2FtZWAgYW5kIHN0cmlkZSAxOiBvdXRwdXQgd2lsbCBiZSBvZiBzYW1lIHNpemUgYXMgaW5wdXQsXG4gKiAgICAgICByZWdhcmRsZXNzIG9mIGZpbHRlciBzaXplLlxuICogICAtIGB2YWxpZGAgb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAtIEZvciBtb3JlIGluZm8sIHNlZSB0aGlzIGd1aWRlOlxuICogICAgIFtodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb25dKFxuICogICAgICAgICAgaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uKVxuICogQHBhcmFtIGRhdGFGb3JtYXQgQW4gb3B0aW9uYWwgc3RyaW5nIGZyb206IFwiTkhXQ1wiLCBcIk5DSFdcIi4gRGVmYXVsdHMgdG9cbiAqICAgICBcIk5IV0NcIi4gU3BlY2lmeSB0aGUgZGF0YSBmb3JtYXQgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YS4gV2l0aCB0aGVcbiAqICAgICBkZWZhdWx0IGZvcm1hdCBcIk5IV0NcIiwgdGhlIGRhdGEgaXMgc3RvcmVkIGluIHRoZSBvcmRlciBvZjogW2JhdGNoLFxuICogICAgIGhlaWdodCwgd2lkdGgsIGNoYW5uZWxzXS4gT25seSBcIk5IV0NcIiBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlxuICogQHBhcmFtIGRpbGF0aW9ucyBUaGUgZGlsYXRpb24gcmF0ZXM6IGBbZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGhdYFxuICogICAgIGluIHdoaWNoIHdlIHNhbXBsZSBpbnB1dCB2YWx1ZXMgYWNyb3NzIHRoZSBoZWlnaHQgYW5kIHdpZHRoIGRpbWVuc2lvbnNcbiAqICAgICBpbiBhdHJvdXMgY29udm9sdXRpb24uIERlZmF1bHRzIHRvIGBbMSwgMV1gLiBJZiBgZGlsYXRpb25zYCBpcyBhIHNpbmdsZVxuICogICAgIG51bWJlciwgdGhlbiBgZGlsYXRpb25IZWlnaHQgPT0gZGlsYXRpb25XaWR0aGAuIElmIGl0IGlzIGdyZWF0ZXIgdGhhblxuICogICAgIDEsIHRoZW4gYWxsIHZhbHVlcyBvZiBgc3RyaWRlc2AgbXVzdCBiZSAxLlxuICogQHBhcmFtIGRpbVJvdW5kaW5nTW9kZSBBIHN0cmluZyBmcm9tOiAnY2VpbCcsICdyb3VuZCcsICdmbG9vcicuIElmIG5vbmUgaXNcbiAqICAgICBwcm92aWRlZCwgaXQgd2lsbCBkZWZhdWx0IHRvIHRydW5jYXRlLlxuICogQHBhcmFtIGJpYXMgVGVuc29yIHRvIGJlIGFkZGVkIHRvIHRoZSByZXN1bHQuXG4gKiBAcGFyYW0gYWN0aXZhdGlvbiBOYW1lIG9mIGFjdGl2YXRpb24ga2VybmVsIChkZWZhdWx0cyB0byBgbGluZWFyYCkgdG8gYmVcbiAqICAgICBhcHBsaWVkXG4gKiAgICAgIGFmdGVyIGJpYXNBZGQuXG4gKiBAcGFyYW0gcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyBUZW5zb3Igb2YgcHJlbHUgd2VpZ2h0cyB0byBiZSBhcHBsaWVkIGFzIHBhcnRcbiAqICAgICBvZiBhIGBwcmVsdWAgYWN0aXZhdGlvbiwgdHlwaWNhbGx5IHRoZSBzYW1lIHNoYXBlIGFzIGB4YC5cbiAqIEBwYXJhbSBsZWFreXJlbHVBbHBoYSBPcHRpb25hbC4gQWxwaGEgdG8gYmUgYXBwbGllZCBhcyBwYXJ0IG9mIGEgYGxlYWt5cmVsdWBcbiAqICAgICBhY3RpdmF0aW9uLlxuICovXG5mdW5jdGlvbiBmdXNlZENvbnYyZF8oeyB4LCBmaWx0ZXIsIHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCA9ICdOSFdDJywgZGlsYXRpb25zID0gWzEsIDFdLCBkaW1Sb3VuZGluZ01vZGUsIGJpYXMsIGFjdGl2YXRpb24gPSAnbGluZWFyJywgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cywgbGVha3lyZWx1QWxwaGEgfSkge1xuICAgIGFjdGl2YXRpb24gPSBhY3RpdmF0aW9uIHx8ICdsaW5lYXInO1xuICAgIGlmIChzaG91bGRGdXNlKEVOR0lORS5zdGF0ZS5ncmFkaWVudERlcHRoLCBhY3RpdmF0aW9uKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHVuZnVzZWRDb252MmQoeCwgZmlsdGVyLCBzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQsIGRpbGF0aW9ucywgZGltUm91bmRpbmdNb2RlKTtcbiAgICAgICAgaWYgKGJpYXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gYWRkKHJlc3VsdCwgYmlhcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwcGx5QWN0aXZhdGlvbihyZXN1bHQsIGFjdGl2YXRpb24sIHByZWx1QWN0aXZhdGlvbldlaWdodHMsIGxlYWt5cmVsdUFscGhhKTtcbiAgICB9XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnY29udjJkJyk7XG4gICAgY29uc3QgJGZpbHRlciA9IGNvbnZlcnRUb1RlbnNvcihmaWx0ZXIsICdmaWx0ZXInLCAnY29udjJkJyk7XG4gICAgbGV0IHg0RCA9ICR4O1xuICAgIGxldCByZXNoYXBlZFRvNEQgPSBmYWxzZTtcbiAgICBpZiAoJHgucmFuayA9PT0gMykge1xuICAgICAgICByZXNoYXBlZFRvNEQgPSB0cnVlO1xuICAgICAgICB4NEQgPSByZXNoYXBlKCR4LCBbMSwgJHguc2hhcGVbMF0sICR4LnNoYXBlWzFdLCAkeC5zaGFwZVsyXV0pO1xuICAgIH1cbiAgICB1dGlsLmFzc2VydCh4NEQucmFuayA9PT0gNCwgKCkgPT4gYEVycm9yIGluIGZ1c2VkIGNvbnYyZDogaW5wdXQgbXVzdCBiZSByYW5rIDQsIGJ1dCBnb3QgcmFuayBgICtcbiAgICAgICAgYCR7eDRELnJhbmt9LmApO1xuICAgIHV0aWwuYXNzZXJ0KCRmaWx0ZXIucmFuayA9PT0gNCwgKCkgPT4gYEVycm9yIGluIGZ1c2VkIGNvbnYyZDogZmlsdGVyIG11c3QgYmUgcmFuayA0LCBidXQgZ290IHJhbmsgYCArXG4gICAgICAgIGAkeyRmaWx0ZXIucmFua30uYCk7XG4gICAgaWYgKGRpbVJvdW5kaW5nTW9kZSAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNJbnQocGFkKSwgKCkgPT4gYEVycm9yIGluIGZ1c2VkIGNvbnYyZDogcGFkIG11c3QgYmUgYW4gaW50ZWdlciB3aGVuIHVzaW5nLCBgICtcbiAgICAgICAgICAgIGBkaW1Sb3VuZGluZ01vZGUgJHtkaW1Sb3VuZGluZ01vZGV9IGJ1dCBnb3QgcGFkICR7cGFkfS5gKTtcbiAgICB9XG4gICAgdXRpbC5hc3NlcnQoeDRELnNoYXBlWzNdID09PSAkZmlsdGVyLnNoYXBlWzJdLCAoKSA9PiBgRXJyb3IgaW4gY29udjJkOiBkZXB0aCBvZiBpbnB1dCAoJHt4NEQuc2hhcGVbM119KSBtdXN0IG1hdGNoIGAgK1xuICAgICAgICBgaW5wdXQgZGVwdGggZm9yIGZpbHRlciAkeyRmaWx0ZXIuc2hhcGVbMl19LmApO1xuICAgIHV0aWwuYXNzZXJ0KGNvbnZfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgZGlsYXRpb25zKSwgKCkgPT4gJ0Vycm9yIGluIGNvbnYyRDogRWl0aGVyIHN0cmlkZXMgb3IgZGlsYXRpb25zIG11c3QgYmUgMS4gJyArXG4gICAgICAgIGBHb3Qgc3RyaWRlcyAke3N0cmlkZXN9IGFuZCBkaWxhdGlvbnMgJyR7ZGlsYXRpb25zfSdgKTtcbiAgICB1dGlsLmFzc2VydChkYXRhRm9ybWF0ID09PSAnTkhXQycsICgpID0+IGBFcnJvciBpbiBjb252MmQ6IGdvdCBkYXRhRm9ybWF0IG9mICR7ZGF0YUZvcm1hdH0gYnV0IG9ubHkgTkhXQyBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLmApO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gY29udl91dGlsLmNvbXB1dGVDb252MkRJbmZvKHg0RC5zaGFwZSwgJGZpbHRlci5zaGFwZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSk7XG4gICAgbGV0ICRiaWFzO1xuICAgIGlmIChiaWFzICE9IG51bGwpIHtcbiAgICAgICAgJGJpYXMgPSBjb252ZXJ0VG9UZW5zb3IoYmlhcywgJ2JpYXMnLCAnZnVzZWQgY29udjJkJyk7XG4gICAgICAgIFskYmlhc10gPSBtYWtlVHlwZXNNYXRjaCgkYmlhcywgJHgpO1xuICAgICAgICBicm9hZGNhc3RfdXRpbC5hc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZShjb252SW5mby5vdXRTaGFwZSwgJGJpYXMuc2hhcGUpO1xuICAgIH1cbiAgICBsZXQgJHByZWx1QWN0aXZhdGlvbldlaWdodHM7XG4gICAgaWYgKHByZWx1QWN0aXZhdGlvbldlaWdodHMgIT0gbnVsbCkge1xuICAgICAgICAkcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyA9IGNvbnZlcnRUb1RlbnNvcihwcmVsdUFjdGl2YXRpb25XZWlnaHRzLCAncHJlbHUgd2VpZ2h0cycsICdmdXNlZCBjb252MmQnKTtcbiAgICB9XG4gICAgY29uc3QgZ3JhZCA9IChkeSwgc2F2ZWQpID0+IHtcbiAgICAgICAgY29uc3QgWyRmaWx0ZXIsIHg0RCwgeSwgJGJpYXNdID0gc2F2ZWQ7XG4gICAgICAgIGNvbnN0IGR5QWN0aXZhdGlvbiA9IGdldEZ1c2VkRHlBY3RpdmF0aW9uKGR5LCB5LCBhY3RpdmF0aW9uKTtcbiAgICAgICAgdXRpbC5hc3NlcnQoY29udl91dGlsLnR1cGxlVmFsdWVzQXJlT25lKGRpbGF0aW9ucyksICgpID0+ICdFcnJvciBpbiBncmFkaWVudCBvZiBmdXNlZCBjb252MkQ6ICcgK1xuICAgICAgICAgICAgYGRpbGF0aW9uIHJhdGVzIGdyZWF0ZXIgdGhhbiAxIGAgK1xuICAgICAgICAgICAgYGFyZSBub3QgeWV0IHN1cHBvcnRlZCBpbiBncmFkaWVudHMuIEdvdCBkaWxhdGlvbnMgJyR7ZGlsYXRpb25zfSdgKTtcbiAgICAgICAgY29uc3QgeERlciA9IGNvbnYyREJhY2twcm9wSW5wdXQoeDRELnNoYXBlLCBkeUFjdGl2YXRpb24sICRmaWx0ZXIsIHN0cmlkZXMsIHBhZCk7XG4gICAgICAgIGNvbnN0IGZpbHRlckRlciA9IGNvbnYyREJhY2twcm9wRmlsdGVyKHg0RCwgZHlBY3RpdmF0aW9uLCAkZmlsdGVyLnNoYXBlLCBzdHJpZGVzLCBwYWQpO1xuICAgICAgICBjb25zdCBkZXIgPSBbeERlciwgZmlsdGVyRGVyXTtcbiAgICAgICAgaWYgKCRiaWFzICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGJpYXNEZXIgPSBnZXRGdXNlZEJpYXNHcmFkaWVudCgkYmlhcywgZHlBY3RpdmF0aW9uKTtcbiAgICAgICAgICAgIGRlci5wdXNoKGJpYXNEZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZXI7XG4gICAgfTtcbiAgICBjb25zdCBpbnB1dHMgPSB7XG4gICAgICAgIHg6IHg0RCxcbiAgICAgICAgZmlsdGVyOiAkZmlsdGVyLFxuICAgICAgICBiaWFzOiAkYmlhcyxcbiAgICAgICAgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0czogJHByZWx1QWN0aXZhdGlvbldlaWdodHNcbiAgICB9O1xuICAgIGNvbnN0IGF0dHJzID0ge1xuICAgICAgICBzdHJpZGVzLFxuICAgICAgICBwYWQsXG4gICAgICAgIGRhdGFGb3JtYXQsXG4gICAgICAgIGRpbGF0aW9ucyxcbiAgICAgICAgZGltUm91bmRpbmdNb2RlLFxuICAgICAgICBhY3RpdmF0aW9uLFxuICAgICAgICBsZWFreXJlbHVBbHBoYVxuICAgIH07XG4gICAgLy8gRGVwZW5kaW5nIG9uIHRoZSB0aGUgcGFyYW1zIHBhc3NlZCBpbiB3ZSB3aWxsIGhhdmUgZGlmZmVyZW50IG51bWJlciBvZlxuICAgIC8vIGlucHV0cyBhbmQgdGh1cyBhIGEgZGlmZmVyZW50IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgZ3JhZGllbnQuXG4gICAgaWYgKGJpYXMgPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBjdXN0b21PcCA9IGN1c3RvbUdyYWQoKHg0RCwgZmlsdGVyLCBzYXZlKSA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzID0gXG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgICAgICAgICBFTkdJTkUucnVuS2VybmVsKEZ1c2VkQ29udjJELCBpbnB1dHMsIGF0dHJzKTtcbiAgICAgICAgICAgIHNhdmUoW2ZpbHRlciwgeDRELCByZXNdKTtcbiAgICAgICAgICAgIGlmIChyZXNoYXBlZFRvNEQpIHtcbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgICAgICAgICAgICAgcmVzID0gcmVzaGFwZShyZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogcmVzLCBncmFkRnVuYzogZ3JhZCB9O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGN1c3RvbU9wKHg0RCwgJGZpbHRlcik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBjdXN0b21PcFdpdGhCaWFzID0gY3VzdG9tR3JhZCgoeDRELCBmaWx0ZXIsIGJpYXMsIHNhdmUpID0+IHtcbiAgICAgICAgICAgIGxldCByZXMgPSBFTkdJTkUucnVuS2VybmVsKEZ1c2VkQ29udjJELCBpbnB1dHMsIGF0dHJzKTtcbiAgICAgICAgICAgIHNhdmUoW2ZpbHRlciwgeDRELCByZXMsIGJpYXNdKTtcbiAgICAgICAgICAgIGlmIChyZXNoYXBlZFRvNEQpIHtcbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgICAgICAgICAgICAgcmVzID0gcmVzaGFwZShyZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogcmVzLCBncmFkRnVuYzogZ3JhZCB9O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGN1c3RvbU9wV2l0aEJpYXMoeDRELCAkZmlsdGVyLCAkYmlhcyk7XG4gICAgfVxufVxuZXhwb3J0IGNvbnN0IGNvbnYyZCA9IG9wKHsgZnVzZWRDb252MmRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29udjJkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBjdXN0b21HcmFkIH0gZnJvbSAnLi4vLi4vZ3JhZGllbnRzJztcbmltcG9ydCB7IEZ1c2VkRGVwdGh3aXNlQ29udjJEIH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IG1ha2VUeXBlc01hdGNoIH0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWwnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgeyBhZGQgfSBmcm9tICcuLi9hZGQnO1xuaW1wb3J0ICogYXMgYnJvYWRjYXN0X3V0aWwgZnJvbSAnLi4vYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0ICogYXMgY29udl91dGlsIGZyb20gJy4uL2NvbnZfdXRpbCc7XG5pbXBvcnQgeyBkZXB0aHdpc2VDb252MmQgYXMgdW5mdXNlZERlcHRod2lzZUNvbnYyZCB9IGZyb20gJy4uL2RlcHRod2lzZV9jb252MmQnO1xuaW1wb3J0IHsgZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIgfSBmcm9tICcuLi9kZXB0aHdpc2VfY29udjJkX25hdGl2ZV9iYWNrcHJvcF9maWx0ZXInO1xuaW1wb3J0IHsgZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCB9IGZyb20gJy4uL2RlcHRod2lzZV9jb252MmRfbmF0aXZlX2JhY2twcm9wX2lucHV0JztcbmltcG9ydCB7IGFwcGx5QWN0aXZhdGlvbiwgZ2V0RnVzZWRCaWFzR3JhZGllbnQsIGdldEZ1c2VkRHlBY3RpdmF0aW9uLCBzaG91bGRGdXNlIH0gZnJvbSAnLi4vZnVzZWRfdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4uL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi4vcmVzaGFwZSc7XG4vKipcbiAqIENvbXB1dGVzIGRlcHRod2lzZSAyRCBjb252b2x1dGlvbiwgb3B0aW9uYWxseSBmdXNlZCB3aXRoIGFkZGluZyBhXG4gKiBiaWFzIGFuZCBhcHBseWluZyBhbiBhY3RpdmF0aW9uLlxuICpcbiAqIEdpdmVuIGEgNEQgYGlucHV0YCBhcnJheSBhbmQgYSBgZmlsdGVyYCBhcnJheSBvZiBzaGFwZVxuICogYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBpbkNoYW5uZWxzLCBjaGFubmVsTXVsdGlwbGllcl1gIGNvbnRhaW5pbmdcbiAqIGBpbkNoYW5uZWxzYCBjb252b2x1dGlvbmFsIGZpbHRlcnMgb2YgZGVwdGggMSwgdGhpcyBvcCBhcHBsaWVzIGFcbiAqIGRpZmZlcmVudCBmaWx0ZXIgdG8gZWFjaCBpbnB1dCBjaGFubmVsIChleHBhbmRpbmcgZnJvbSAxIGNoYW5uZWwgdG9cbiAqIGBjaGFubmVsTXVsdGlwbGllcmAgY2hhbm5lbHMgZm9yIGVhY2gpLCB0aGVuIGNvbmNhdGVuYXRlcyB0aGUgcmVzdWx0c1xuICogdG9nZXRoZXIuIFRoZSBvdXRwdXQgaGFzIGBpbkNoYW5uZWxzICogY2hhbm5lbE11bHRpcGxpZXJgIGNoYW5uZWxzLlxuICpcbiAqIFNlZVxuICogW2h0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9kZXB0aHdpc2VfY29udjJkXShcbiAqICAgICBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vZGVwdGh3aXNlX2NvbnYyZClcbiAqIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogQHBhcmFtIG9iaiBBbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDQgb3IgcmFuayAzLCBvZiBzaGFwZVxuICogICAgIGBbYmF0Y2gsIGhlaWdodCwgd2lkdGgsIGluQ2hhbm5lbHNdYC4gSWYgcmFuayAzLCBiYXRjaCBvZiAxIGlzXG4gKiBhc3N1bWVkLlxuICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyIHRlbnNvciwgcmFuayA0LCBvZiBzaGFwZVxuICogICAgIGBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5DaGFubmVscywgY2hhbm5lbE11bHRpcGxpZXJdYC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBjb252b2x1dGlvbjogYFtzdHJpZGVIZWlnaHQsXG4gKiBzdHJpZGVXaWR0aF1gLiBJZiBzdHJpZGVzIGlzIGEgc2luZ2xlIG51bWJlciwgdGhlbiBgc3RyaWRlSGVpZ2h0ID09XG4gKiBzdHJpZGVXaWR0aGAuXG4gKiBAcGFyYW0gcGFkIFRoZSB0eXBlIG9mIHBhZGRpbmcgYWxnb3JpdGhtLlxuICogICAtIGBzYW1lYCBhbmQgc3RyaWRlIDE6IG91dHB1dCB3aWxsIGJlIG9mIHNhbWUgc2l6ZSBhcyBpbnB1dCxcbiAqICAgICAgIHJlZ2FyZGxlc3Mgb2YgZmlsdGVyIHNpemUuXG4gKiAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAtIEZvciBtb3JlIGluZm8sIHNlZSB0aGlzIGd1aWRlOlxuICogICAgIFtodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb25dKFxuICogICAgICAgICAgaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uKVxuICogQHBhcmFtIGRpbGF0aW9ucyBUaGUgZGlsYXRpb24gcmF0ZXM6IGBbZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGhdYFxuICogICAgIGluIHdoaWNoIHdlIHNhbXBsZSBpbnB1dCB2YWx1ZXMgYWNyb3NzIHRoZSBoZWlnaHQgYW5kIHdpZHRoIGRpbWVuc2lvbnNcbiAqICAgICBpbiBhdHJvdXMgY29udm9sdXRpb24uIERlZmF1bHRzIHRvIGBbMSwgMV1gLiBJZiBgcmF0ZWAgaXMgYSBzaW5nbGVcbiAqICAgICBudW1iZXIsIHRoZW4gYGRpbGF0aW9uSGVpZ2h0ID09IGRpbGF0aW9uV2lkdGhgLiBJZiBpdCBpcyBncmVhdGVyIHRoYW5cbiAqICAgICAxLCB0aGVuIGFsbCB2YWx1ZXMgb2YgYHN0cmlkZXNgIG11c3QgYmUgMS5cbiAqIEBwYXJhbSBkYXRhRm9ybWF0OiBBbiBvcHRpb25hbCBzdHJpbmcgZnJvbTogXCJOSFdDXCIsIFwiTkNIV1wiLiBEZWZhdWx0cyB0b1xuICogICAgIFwiTkhXQ1wiLiBTcGVjaWZ5IHRoZSBkYXRhIGZvcm1hdCBvZiB0aGUgaW5wdXQgYW5kIG91dHB1dCBkYXRhLiBXaXRoIHRoZVxuICogICAgIGRlZmF1bHQgZm9ybWF0IFwiTkhXQ1wiLCB0aGUgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIG9yZGVyIG9mOiBbYmF0Y2gsXG4gKiAgICAgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbHNdLiBPbmx5IFwiTkhXQ1wiIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQuXG4gKiBAcGFyYW0gZGltUm91bmRpbmdNb2RlIEEgc3RyaW5nIGZyb206ICdjZWlsJywgJ3JvdW5kJywgJ2Zsb29yJy4gSWYgbm9uZSBpc1xuICogICAgIHByb3ZpZGVkLCBpdCB3aWxsIGRlZmF1bHQgdG8gdHJ1bmNhdGUuXG4gKiBAcGFyYW0gYmlhcyBUZW5zb3IgdG8gYmUgYWRkZWQgdG8gdGhlIHJlc3VsdC5cbiAqIEBwYXJhbSBhY3RpdmF0aW9uIE5hbWUgb2YgYWN0aXZhdGlvbiBrZXJuZWwgKGRlZmF1bHRzIHRvIGBsaW5lYXJgKS5cbiAqIEBwYXJhbSBwcmVsdUFjdGl2YXRpb25XZWlnaHRzIFRlbnNvciBvZiBwcmVsdSB3ZWlnaHRzIHRvIGJlIGFwcGxpZWQgYXMgcGFydFxuICogICAgIG9mIGEgYHByZWx1YCBhY3RpdmF0aW9uLCB0eXBpY2FsbHkgdGhlIHNhbWUgc2hhcGUgYXMgYHhgLlxuICogQHBhcmFtIGxlYWt5cmVsdUFscGhhIE9wdGlvbmFsLiBBbHBoYSB0byBiZSBhcHBsaWVkIGFzIHBhcnQgb2YgYSBgbGVha3lyZWx1YFxuICogICAgIGFjdGl2YXRpb24uXG4gKi9cbmZ1bmN0aW9uIGZ1c2VkRGVwdGh3aXNlQ29udjJkXyh7IHgsIGZpbHRlciwgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0ID0gJ05IV0MnLCBkaWxhdGlvbnMgPSBbMSwgMV0sIGRpbVJvdW5kaW5nTW9kZSwgYmlhcywgYWN0aXZhdGlvbiA9ICdsaW5lYXInLCBwcmVsdUFjdGl2YXRpb25XZWlnaHRzLCBsZWFreXJlbHVBbHBoYSB9KSB7XG4gICAgaWYgKHNob3VsZEZ1c2UoRU5HSU5FLnN0YXRlLmdyYWRpZW50RGVwdGgsIGFjdGl2YXRpb24pID09PSBmYWxzZSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gdW5mdXNlZERlcHRod2lzZUNvbnYyZCh4LCBmaWx0ZXIsIHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGlsYXRpb25zLCBkaW1Sb3VuZGluZ01vZGUpO1xuICAgICAgICBpZiAoYmlhcyAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBhZGQocmVzdWx0LCBiaWFzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXBwbHlBY3RpdmF0aW9uKHJlc3VsdCwgYWN0aXZhdGlvbiwgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cywgbGVha3lyZWx1QWxwaGEpO1xuICAgIH1cbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdkZXB0aHdpc2VDb252MmQnKTtcbiAgICBjb25zdCAkZmlsdGVyID0gY29udmVydFRvVGVuc29yKGZpbHRlciwgJ2ZpbHRlcicsICdkZXB0aHdpc2VDb252MmQnKTtcbiAgICBsZXQgeDREID0gJHg7XG4gICAgbGV0IHJlc2hhcGVkVG80RCA9IGZhbHNlO1xuICAgIGlmICgkeC5yYW5rID09PSAzKSB7XG4gICAgICAgIHJlc2hhcGVkVG80RCA9IHRydWU7XG4gICAgICAgIHg0RCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV0sICR4LnNoYXBlWzJdXSk7XG4gICAgfVxuICAgIHV0aWwuYXNzZXJ0KHg0RC5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gZnVzZWQgZGVwdGh3aXNlQ29udjJkOiBpbnB1dCBtdXN0IGJlIHJhbmsgNCwgYnV0IGdvdCBgICtcbiAgICAgICAgYHJhbmsgJHt4NEQucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoJGZpbHRlci5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gZnVzZWQgZGVwdGh3aXNlQ29udjJkOiBmaWx0ZXIgbXVzdCBiZSByYW5rIDQsIGAgK1xuICAgICAgICBgYnV0IGdvdCByYW5rICR7JGZpbHRlci5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydCh4NEQuc2hhcGVbM10gPT09ICRmaWx0ZXIuc2hhcGVbMl0sICgpID0+IGBFcnJvciBpbiBmdXNlZCBkZXB0aHdpc2VDb252MmQ6IG51bWJlciBvZiBpbnB1dCBjaGFubmVscyBgICtcbiAgICAgICAgYCgke3g0RC5zaGFwZVszXX0pIG11c3QgbWF0Y2ggdGhlIGluQ2hhbm5lbHMgZGltZW5zaW9uIGluIGAgK1xuICAgICAgICBgZmlsdGVyICR7JGZpbHRlci5zaGFwZVsyXX0uYCk7XG4gICAgaWYgKGRpbGF0aW9ucyA9PSBudWxsKSB7XG4gICAgICAgIGRpbGF0aW9ucyA9IFsxLCAxXTtcbiAgICB9XG4gICAgdXRpbC5hc3NlcnQoY29udl91dGlsLmVpdGhlclN0cmlkZXNPckRpbGF0aW9uc0FyZU9uZShzdHJpZGVzLCBkaWxhdGlvbnMpLCAoKSA9PiAnRXJyb3IgaW4gZnVzZWQgZGVwdGh3aXNlQ29udjJkOiBFaXRoZXIgc3RyaWRlcyBvciBkaWxhdGlvbnMgbXVzdCAnICtcbiAgICAgICAgYGJlIDEuIEdvdCBzdHJpZGVzICR7c3RyaWRlc30gYW5kIGRpbGF0aW9ucyAnJHtkaWxhdGlvbnN9J2ApO1xuICAgIGlmIChkaW1Sb3VuZGluZ01vZGUgIT0gbnVsbCkge1xuICAgICAgICB1dGlsLmFzc2VydCh1dGlsLmlzSW50KHBhZCksICgpID0+IGBFcnJvciBpbiBmdXNlZCBkZXB0aHdpc2VDb252MmQ6IHBhZCBtdXN0IGJlIGFuIGludGVnZXIgd2hlbiBgICtcbiAgICAgICAgICAgIGB1c2luZyBkaW1Sb3VuZGluZ01vZGUgJHtkaW1Sb3VuZGluZ01vZGV9IGJ1dCBnb3QgcGFkICR7cGFkfS5gKTtcbiAgICB9XG4gICAgY29uc3QgY29udkluZm8gPSBjb252X3V0aWwuY29tcHV0ZUNvbnYyREluZm8oeDRELnNoYXBlLCAkZmlsdGVyLnNoYXBlLCBzdHJpZGVzLCBkaWxhdGlvbnMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCB0cnVlIC8qIGRlcHRod2lzZSAqLyk7XG4gICAgbGV0ICRiaWFzO1xuICAgIGlmIChiaWFzICE9IG51bGwpIHtcbiAgICAgICAgJGJpYXMgPSBjb252ZXJ0VG9UZW5zb3IoYmlhcywgJ2JpYXMnLCAnZnVzZWQgY29udjJkJyk7XG4gICAgICAgIFskYmlhc10gPSBtYWtlVHlwZXNNYXRjaCgkYmlhcywgJHgpO1xuICAgICAgICBicm9hZGNhc3RfdXRpbC5hc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZShjb252SW5mby5vdXRTaGFwZSwgJGJpYXMuc2hhcGUpO1xuICAgIH1cbiAgICBsZXQgJHByZWx1QWN0aXZhdGlvbldlaWdodHM7XG4gICAgaWYgKHByZWx1QWN0aXZhdGlvbldlaWdodHMgIT0gbnVsbCkge1xuICAgICAgICAkcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyA9IGNvbnZlcnRUb1RlbnNvcihwcmVsdUFjdGl2YXRpb25XZWlnaHRzLCAncHJlbHUgd2VpZ2h0cycsICdmdXNlZCBkZXB0aHdpc2VDb252MmQnKTtcbiAgICB9XG4gICAgY29uc3QgZ3JhZCA9IChkeSwgc2F2ZWQpID0+IHtcbiAgICAgICAgdXRpbC5hc3NlcnQoY29udl91dGlsLnR1cGxlVmFsdWVzQXJlT25lKGRpbGF0aW9ucyksICgpID0+ICdFcnJvciBpbiBncmFkaWVudCBvZiBmdXNlZCBkZXB0aHdpc2VDb252MmQ6IGRpbGF0aW9uIHJhdGVzICcgK1xuICAgICAgICAgICAgYGdyZWF0ZXIgdGhhbiAxIGFyZSBub3QgeWV0IHN1cHBvcnRlZC4gR290IGRpbGF0aW9ucyBgICtcbiAgICAgICAgICAgIGAnJHtkaWxhdGlvbnN9J2ApO1xuICAgICAgICBjb25zdCBbJGZpbHRlciwgeDRELCB5LCBiaWFzXSA9IHNhdmVkO1xuICAgICAgICBjb25zdCBkeUFjdGl2YXRpb24gPSBnZXRGdXNlZER5QWN0aXZhdGlvbihkeSwgeSwgYWN0aXZhdGlvbik7XG4gICAgICAgIGNvbnN0IHhEZXIgPSBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0KHg0RC5zaGFwZSwgZHlBY3RpdmF0aW9uLCAkZmlsdGVyLCBzdHJpZGVzLCBwYWQsIGRpbGF0aW9ucywgZGltUm91bmRpbmdNb2RlKTtcbiAgICAgICAgY29uc3QgZmlsdGVyRGVyID0gZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIoeDRELCBkeUFjdGl2YXRpb24sICRmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsIHBhZCwgZGlsYXRpb25zLCBkaW1Sb3VuZGluZ01vZGUpO1xuICAgICAgICBpZiAoYmlhcyAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBiaWFzRGVyID0gZ2V0RnVzZWRCaWFzR3JhZGllbnQoJGJpYXMsIGR5QWN0aXZhdGlvbik7XG4gICAgICAgICAgICByZXR1cm4gW3hEZXIsIGZpbHRlckRlciwgYmlhc0Rlcl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFt4RGVyLCBmaWx0ZXJEZXJdO1xuICAgIH07XG4gICAgY29uc3QgaW5wdXRzID0ge1xuICAgICAgICB4OiB4NEQsXG4gICAgICAgIGZpbHRlcjogJGZpbHRlcixcbiAgICAgICAgYmlhczogJGJpYXMsXG4gICAgICAgIHByZWx1QWN0aXZhdGlvbldlaWdodHM6ICRwcmVsdUFjdGl2YXRpb25XZWlnaHRzXG4gICAgfTtcbiAgICBjb25zdCBhdHRycyA9IHtcbiAgICAgICAgc3RyaWRlcyxcbiAgICAgICAgcGFkLFxuICAgICAgICBkYXRhRm9ybWF0LFxuICAgICAgICBkaWxhdGlvbnMsXG4gICAgICAgIGRpbVJvdW5kaW5nTW9kZSxcbiAgICAgICAgYWN0aXZhdGlvbixcbiAgICAgICAgbGVha3lyZWx1QWxwaGFcbiAgICB9O1xuICAgIC8vIERlcGVuZGluZyBvbiB0aGUgdGhlIHBhcmFtcyBwYXNzZWQgaW4gd2Ugd2lsbCBoYXZlIGRpZmZlcmVudCBudW1iZXIgb2ZcbiAgICAvLyBpbnB1dHMgYW5kIHRodXMgYSBhIGRpZmZlcmVudCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGdyYWRpZW50LlxuICAgIGlmIChiaWFzID09IG51bGwpIHtcbiAgICAgICAgY29uc3QgY3VzdG9tT3AgPSBjdXN0b21HcmFkKCh4NEQsIGZpbHRlciwgc2F2ZSkgPT4ge1xuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgICAgICAgICAgbGV0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoRnVzZWREZXB0aHdpc2VDb252MkQsIGlucHV0cywgYXR0cnMpO1xuICAgICAgICAgICAgc2F2ZShbZmlsdGVyLCB4NEQsIHJlc10pO1xuICAgICAgICAgICAgaWYgKHJlc2hhcGVkVG80RCkge1xuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICAgICAgICAgICAgICByZXMgPSByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiByZXMsIGdyYWRGdW5jOiBncmFkIH07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY3VzdG9tT3AoeDRELCAkZmlsdGVyKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGN1c3RvbU9wV2l0aEJpYXMgPSBjdXN0b21HcmFkKCh4NEQsIGZpbHRlciwgYmlhcywgc2F2ZSkgPT4ge1xuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgICAgICAgICAgbGV0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoRnVzZWREZXB0aHdpc2VDb252MkQsIGlucHV0cywgYXR0cnMpO1xuICAgICAgICAgICAgc2F2ZShbZmlsdGVyLCB4NEQsIHJlcywgYmlhc10pO1xuICAgICAgICAgICAgaWYgKHJlc2hhcGVkVG80RCkge1xuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICAgICAgICAgICAgICByZXMgPSByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiByZXMsIGdyYWRGdW5jOiBncmFkIH07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY3VzdG9tT3BXaXRoQmlhcyh4NEQsICRmaWx0ZXIsICRiaWFzKTtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgZGVwdGh3aXNlQ29udjJkID0gb3AoeyBmdXNlZERlcHRod2lzZUNvbnYyZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZXB0aHdpc2VfY29udjJkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBjdXN0b21HcmFkIH0gZnJvbSAnLi4vLi4vZ3JhZGllbnRzJztcbmltcG9ydCB7IF9GdXNlZE1hdE11bCB9IGZyb20gJy4uLy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBtYWtlVHlwZXNNYXRjaCB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHsgYWRkIH0gZnJvbSAnLi4vYWRkJztcbmltcG9ydCAqIGFzIGJyb2FkY2FzdF91dGlsIGZyb20gJy4uL2Jyb2FkY2FzdF91dGlsJztcbmltcG9ydCB7IGFwcGx5QWN0aXZhdGlvbiwgZ2V0RnVzZWRCaWFzR3JhZGllbnQsIGdldEZ1c2VkRHlBY3RpdmF0aW9uLCBzaG91bGRGdXNlIH0gZnJvbSAnLi4vZnVzZWRfdXRpbCc7XG5pbXBvcnQgeyBtYXRNdWwgYXMgdW5mdXNlZE1hdE11bCB9IGZyb20gJy4uL21hdF9tdWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4uL3Jlc2hhcGUnO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIG1hdHJpY2VzIHdpdGggb3B0aW9uYWwgYWN0aXZhdGlvbiBhbmQgYmlhcy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjJkKFstMSwgLTJdLCBbMSwgMl0pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjJkKFsxLCAyLCAzLCA0XSwgWzIsIDJdKTtcbiAqIGNvbnN0IGJpYXMgPSB0Zi50ZW5zb3IyZChbMSwgMl0sIFsxLCAyXSk7XG4gKlxuICogdGYuZnVzZWQubWF0TXVsKHthLCBiLCBiaWFzLCBhY3RpdmF0aW9uOiAncmVsdSd9KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIG9iaiBBbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAtIGBhYCBGaXJzdCBtYXRyaXggaW4gZG90IHByb2R1Y3Qgb3BlcmF0aW9uLlxuICogLSBgYmAgU2Vjb25kIG1hdHJpeCBpbiBkb3QgcHJvZHVjdCBvcGVyYXRpb24uXG4gKiAtIGB0cmFuc3Bvc2VBYCBJZiB0cnVlLCBgYWAgaXMgdHJhbnNwb3NlZCBiZWZvcmUgbXVsdGlwbGljYXRpb24uXG4gKiAtIGB0cmFuc3Bvc2VCYCBJZiB0cnVlLCBgYmAgaXMgdHJhbnNwb3NlZCBiZWZvcmUgbXVsdGlwbGljYXRpb24uXG4gKiAtIGBiaWFzYCBNYXRyaXggdG8gYmUgYWRkZWQgdG8gdGhlIHJlc3VsdC5cbiAqIC0gYGFjdGl2YXRpb25gIE5hbWUgb2YgYWN0aXZhdGlvbiBrZXJuZWwgKGRlZmF1bHRzIHRvIGBsaW5lYXJgKS5cbiAqIC0gYHByZWx1QWN0aXZhdGlvbldlaWdodHNgIFRlbnNvciBvZiBwcmVsdSB3ZWlnaHRzLlxuICogLSBgbGVha3lyZWx1QWxwaGFgIEFscGhhIG9mIGxlYWt5cmVsdS5cbiAqL1xuZnVuY3Rpb24gZnVzZWRNYXRNdWxfKHsgYSwgYiwgdHJhbnNwb3NlQSA9IGZhbHNlLCB0cmFuc3Bvc2VCID0gZmFsc2UsIGJpYXMsIGFjdGl2YXRpb24gPSAnbGluZWFyJywgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cywgbGVha3lyZWx1QWxwaGEsIH0pIHtcbiAgICBpZiAoc2hvdWxkRnVzZShFTkdJTkUuc3RhdGUuZ3JhZGllbnREZXB0aCwgYWN0aXZhdGlvbikgPT09IGZhbHNlKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB1bmZ1c2VkTWF0TXVsKGEsIGIsIHRyYW5zcG9zZUEsIHRyYW5zcG9zZUIpO1xuICAgICAgICBpZiAoYmlhcyAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBhZGQocmVzdWx0LCBiaWFzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXBwbHlBY3RpdmF0aW9uKHJlc3VsdCwgYWN0aXZhdGlvbiwgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cywgbGVha3lyZWx1QWxwaGEpO1xuICAgIH1cbiAgICBsZXQgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnZnVzZWQgbWF0TXVsJyk7XG4gICAgbGV0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ2Z1c2VkIG1hdE11bCcpO1xuICAgIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcbiAgICBjb25zdCBpbm5lclNoYXBlQSA9IHRyYW5zcG9zZUEgPyAkYS5zaGFwZVskYS5yYW5rIC0gMl0gOiAkYS5zaGFwZVskYS5yYW5rIC0gMV07XG4gICAgY29uc3QgaW5uZXJTaGFwZUIgPSB0cmFuc3Bvc2VCID8gJGIuc2hhcGVbJGIucmFuayAtIDFdIDogJGIuc2hhcGVbJGIucmFuayAtIDJdO1xuICAgIGNvbnN0IG91dGVyU2hhcGVBID0gdHJhbnNwb3NlQSA/ICRhLnNoYXBlWyRhLnJhbmsgLSAxXSA6ICRhLnNoYXBlWyRhLnJhbmsgLSAyXTtcbiAgICBjb25zdCBvdXRlclNoYXBlQiA9IHRyYW5zcG9zZUIgPyAkYi5zaGFwZVskYi5yYW5rIC0gMl0gOiAkYi5zaGFwZVskYi5yYW5rIC0gMV07XG4gICAgY29uc3Qgb3V0ZXJEaW1zQSA9ICRhLnNoYXBlLnNsaWNlKDAsIC0yKTtcbiAgICBjb25zdCBvdXRlckRpbXNCID0gJGIuc2hhcGUuc2xpY2UoMCwgLTIpO1xuICAgIGNvbnN0IGJhdGNoRGltQSA9IHV0aWwuc2l6ZUZyb21TaGFwZShvdXRlckRpbXNBKTtcbiAgICBjb25zdCBiYXRjaERpbUIgPSB1dGlsLnNpemVGcm9tU2hhcGUob3V0ZXJEaW1zQik7XG4gICAgdXRpbC5hc3NlcnQoJGEucmFuayA+PSAyICYmICRiLnJhbmsgPj0gMiAmJiAkYS5yYW5rID09PSAkYi5yYW5rLCAoKSA9PiBgRXJyb3IgaW4gZnVzZWQgbWF0TXVsOiBpbnB1dHMgbXVzdCBoYXZlIHRoZSBzYW1lIHJhbmsgb2YgYXQgYCArXG4gICAgICAgIGBsZWFzdCAyLCBnb3QgcmFua3MgJHskYS5yYW5rfSBhbmQgJHskYi5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydCh1dGlsLmFycmF5c0VxdWFsKG91dGVyRGltc0EsIG91dGVyRGltc0IpLCAoKSA9PiBgRXJyb3IgaW4gZnVzZWQgbWF0TXVsOiBvdXRlciBkaW1lbnNpb25zICgke291dGVyRGltc0F9KSBhbmQgKGAgK1xuICAgICAgICBgJHtvdXRlckRpbXNCfSkgb2YgVGVuc29ycyB3aXRoIHNoYXBlcyAkeyRhLnNoYXBlfSBhbmQgYCArXG4gICAgICAgIGAkeyRiLnNoYXBlfSBtdXN0IG1hdGNoLmApO1xuICAgIHV0aWwuYXNzZXJ0KGlubmVyU2hhcGVBID09PSBpbm5lclNoYXBlQiwgKCkgPT4gYEVycm9yIGluIGZ1c2VkIG1hdE11bDogaW5uZXIgc2hhcGVzICgke2lubmVyU2hhcGVBfSkgYW5kIChgICtcbiAgICAgICAgYCR7aW5uZXJTaGFwZUJ9KSBvZiBUZW5zb3JzIHdpdGggc2hhcGVzICR7JGEuc2hhcGV9IGFuZCBgICtcbiAgICAgICAgYCR7JGIuc2hhcGV9IGFuZCB0cmFuc3Bvc2VBPSR7dHJhbnNwb3NlQX1gICtcbiAgICAgICAgYCBhbmQgdHJhbnNwb3NlQj0ke3RyYW5zcG9zZUJ9IG11c3QgbWF0Y2guYCk7XG4gICAgY29uc3Qgb3V0U2hhcGUgPSAkYS5zaGFwZS5zbGljZSgwLCAtMikuY29uY2F0KFtvdXRlclNoYXBlQSwgb3V0ZXJTaGFwZUJdKTtcbiAgICBjb25zdCBhM0QgPSB0cmFuc3Bvc2VBID9cbiAgICAgICAgcmVzaGFwZSgkYSwgW2JhdGNoRGltQSwgaW5uZXJTaGFwZUEsIG91dGVyU2hhcGVBXSkgOlxuICAgICAgICByZXNoYXBlKCRhLCBbYmF0Y2hEaW1BLCBvdXRlclNoYXBlQSwgaW5uZXJTaGFwZUFdKTtcbiAgICBjb25zdCBiM0QgPSB0cmFuc3Bvc2VCID9cbiAgICAgICAgcmVzaGFwZSgkYiwgW2JhdGNoRGltQiwgb3V0ZXJTaGFwZUIsIGlubmVyU2hhcGVCXSkgOlxuICAgICAgICByZXNoYXBlKCRiLCBbYmF0Y2hEaW1CLCBpbm5lclNoYXBlQiwgb3V0ZXJTaGFwZUJdKTtcbiAgICBsZXQgJGJpYXM7XG4gICAgaWYgKGJpYXMgIT0gbnVsbCkge1xuICAgICAgICAkYmlhcyA9IGNvbnZlcnRUb1RlbnNvcihiaWFzLCAnYmlhcycsICdmdXNlZCBtYXRNdWwnKTtcbiAgICAgICAgWyRiaWFzXSA9IG1ha2VUeXBlc01hdGNoKCRiaWFzLCAkYSk7XG4gICAgICAgIGJyb2FkY2FzdF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKG91dFNoYXBlLCAkYmlhcy5zaGFwZSk7XG4gICAgfVxuICAgIGxldCAkcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cztcbiAgICBpZiAocHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyAhPSBudWxsKSB7XG4gICAgICAgICRwcmVsdUFjdGl2YXRpb25XZWlnaHRzID0gY29udmVydFRvVGVuc29yKHByZWx1QWN0aXZhdGlvbldlaWdodHMsICdwcmVsdSB3ZWlnaHRzJywgJ2Z1c2VkIG1hdE11bCcpO1xuICAgIH1cbiAgICBjb25zdCBncmFkID0gKGR5LCBzYXZlZCkgPT4ge1xuICAgICAgICBjb25zdCBbYTNELCBiM0QsIHksICRiaWFzXSA9IHNhdmVkO1xuICAgICAgICAvLyB3ZSByZXNoYXBlIGR5IGJlY2F1c2UgdGhlIHJlc3VsdCBvZiB0aGUgZm9yd2FyZCBpcyBub3RcbiAgICAgICAgLy8gbmVjZXNzYXJpbHkgZ29pbmcgdG8gYmUgYSAzZCB0ZW5zb3IgZHVlIHRvIGEgcmVzaGFwZSBkb25lIGF0IHRoZSBlbmQgb2ZcbiAgICAgICAgLy8gdGhlIGN1c3RvbU9wLlxuICAgICAgICBjb25zdCBkeUFjdGl2YXRpb24gPSBnZXRGdXNlZER5QWN0aXZhdGlvbihyZXNoYXBlKGR5LCB5LnNoYXBlKSwgeSwgYWN0aXZhdGlvbik7XG4gICAgICAgIGxldCBhRGVyO1xuICAgICAgICBsZXQgYkRlcjtcbiAgICAgICAgaWYgKCF0cmFuc3Bvc2VBICYmICF0cmFuc3Bvc2VCKSB7XG4gICAgICAgICAgICBhRGVyID0gdW5mdXNlZE1hdE11bChkeUFjdGl2YXRpb24sIGIzRCwgZmFsc2UsIHRydWUpO1xuICAgICAgICAgICAgYkRlciA9IHVuZnVzZWRNYXRNdWwoYTNELCBkeUFjdGl2YXRpb24sIHRydWUsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghdHJhbnNwb3NlQSAmJiB0cmFuc3Bvc2VCKSB7XG4gICAgICAgICAgICBhRGVyID0gdW5mdXNlZE1hdE11bChkeUFjdGl2YXRpb24sIGIzRCwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgICAgIGJEZXIgPSB1bmZ1c2VkTWF0TXVsKGR5QWN0aXZhdGlvbiwgYTNELCB0cnVlLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHJhbnNwb3NlQSAmJiAhdHJhbnNwb3NlQikge1xuICAgICAgICAgICAgYURlciA9IHVuZnVzZWRNYXRNdWwoYjNELCBkeUFjdGl2YXRpb24sIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgICAgIGJEZXIgPSB1bmZ1c2VkTWF0TXVsKGEzRCwgZHlBY3RpdmF0aW9uLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYURlciA9IHVuZnVzZWRNYXRNdWwoYjNELCBkeUFjdGl2YXRpb24sIHRydWUsIHRydWUpO1xuICAgICAgICAgICAgYkRlciA9IHVuZnVzZWRNYXRNdWwoZHlBY3RpdmF0aW9uLCBhM0QsIHRydWUsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiaWFzICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGJpYXNEZXIgPSBnZXRGdXNlZEJpYXNHcmFkaWVudCgkYmlhcywgZHlBY3RpdmF0aW9uKTtcbiAgICAgICAgICAgIHJldHVybiBbYURlciwgYkRlciwgYmlhc0Rlcl07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW2FEZXIsIGJEZXJdO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBpbnB1dHMgPSB7XG4gICAgICAgIGE6IGEzRCxcbiAgICAgICAgYjogYjNELFxuICAgICAgICBiaWFzOiAkYmlhcyxcbiAgICAgICAgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0czogJHByZWx1QWN0aXZhdGlvbldlaWdodHNcbiAgICB9O1xuICAgIGNvbnN0IGF0dHJzID0geyB0cmFuc3Bvc2VBLCB0cmFuc3Bvc2VCLCBhY3RpdmF0aW9uLCBsZWFreXJlbHVBbHBoYSB9O1xuICAgIC8vIERlcGVuZGluZyBvbiB0aGUgdGhlIHBhcmFtcyBwYXNzZWQgaW4gd2Ugd2lsbCBoYXZlIGRpZmZlcmVudCBudW1iZXIgb2ZcbiAgICAvLyBpbnB1dHMgYW5kIHRodXMgYSBhIGRpZmZlcmVudCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGdyYWRpZW50LlxuICAgIGlmIChiaWFzID09IG51bGwpIHtcbiAgICAgICAgY29uc3QgY3VzdG9tT3AgPSBjdXN0b21HcmFkKChhM0QsIGIzRCwgc2F2ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzID0gXG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgICAgICAgICBFTkdJTkUucnVuS2VybmVsKF9GdXNlZE1hdE11bCwgaW5wdXRzLCBhdHRycyk7XG4gICAgICAgICAgICBzYXZlKFthM0QsIGIzRCwgcmVzXSk7XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogcmVzaGFwZShyZXMsIG91dFNoYXBlKSwgZ3JhZEZ1bmM6IGdyYWQgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjdXN0b21PcChhM0QsIGIzRCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBjdXN0b21PcFdpdGhCaWFzID0gY3VzdG9tR3JhZCgoYTNELCBiM0QsICRiaWFzLCBzYXZlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXMgPSBcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICAgICAgICAgIEVOR0lORS5ydW5LZXJuZWwoX0Z1c2VkTWF0TXVsLCBpbnB1dHMsIGF0dHJzKTtcbiAgICAgICAgICAgIHNhdmUoW2EzRCwgYjNELCByZXMsICRiaWFzXSk7XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogcmVzaGFwZShyZXMsIG91dFNoYXBlKSwgZ3JhZEZ1bmM6IGdyYWQgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjdXN0b21PcFdpdGhCaWFzKGEzRCwgYjNELCAkYmlhcyk7XG4gICAgfVxufVxuZXhwb3J0IGNvbnN0IG1hdE11bCA9IG9wKHsgZnVzZWRNYXRNdWxfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWF0X211bC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjb252MmQgfSBmcm9tICcuL2Z1c2VkL2NvbnYyZCc7XG5pbXBvcnQgeyBkZXB0aHdpc2VDb252MmQgfSBmcm9tICcuL2Z1c2VkL2RlcHRod2lzZV9jb252MmQnO1xuaW1wb3J0IHsgbWF0TXVsIH0gZnJvbSAnLi9mdXNlZC9tYXRfbXVsJztcbmV4cG9ydCB7IGNvbnYyZCwgZGVwdGh3aXNlQ29udjJkLCBtYXRNdWwgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZ1c2VkX29wcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgKiBhcyBicm9hZGNhc3RfdXRpbCBmcm9tICcuL2Jyb2FkY2FzdF91dGlsJztcbmltcG9ydCB7IGVsdSB9IGZyb20gJy4vZWx1JztcbmltcG9ydCB7IGxlYWt5UmVsdSB9IGZyb20gJy4vbGVha3lfcmVsdSc7XG5pbXBvcnQgeyBtdWwgfSBmcm9tICcuL211bCc7XG5pbXBvcnQgeyBwcmVsdSB9IGZyb20gJy4vcHJlbHUnO1xuaW1wb3J0IHsgcmVsdSB9IGZyb20gJy4vcmVsdSc7XG5pbXBvcnQgeyByZWx1NiB9IGZyb20gJy4vcmVsdTYnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vcmVzaGFwZSc7XG5pbXBvcnQgeyBzaWdtb2lkIH0gZnJvbSAnLi9zaWdtb2lkJztcbmltcG9ydCB7IHN0ZXAgfSBmcm9tICcuL3N0ZXAnO1xuaW1wb3J0IHsgc3VtIH0gZnJvbSAnLi9zdW0nO1xuLy8gUmV0dXJucyBncmFkaWVudCBmb3IgZnVzZWQgYWN0aXZhdGlvbi5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGdXNlZER5QWN0aXZhdGlvbihkeSwgeSwgYWN0aXZhdGlvbikge1xuICAgIGlmIChhY3RpdmF0aW9uID09IG51bGwgfHwgYWN0aXZhdGlvbiA9PT0gJ2xpbmVhcicpIHtcbiAgICAgICAgcmV0dXJuIGR5O1xuICAgIH1cbiAgICBpZiAoYWN0aXZhdGlvbiA9PT0gJ3JlbHUnKSB7XG4gICAgICAgIHJldHVybiBtdWwoZHksIHN0ZXAoeSkpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb21wdXRlIGdyYWRpZW50IGZvciBmdXNlZCBhY3RpdmF0aW9uICR7YWN0aXZhdGlvbn0uYCk7XG59XG4vLyBSZXR1cm5zIGdyYWRpZW50IGZvciBmdXNlZCBiaWFzLlxuZXhwb3J0IGZ1bmN0aW9uIGdldEZ1c2VkQmlhc0dyYWRpZW50KGJpYXMsIGR5QWN0aXZhdGlvbikge1xuICAgIGxldCByZXMgPSBkeUFjdGl2YXRpb247XG4gICAgY29uc3QgcmVkdWNlQXhlcyA9IGJyb2FkY2FzdF91dGlsLmdldFJlZHVjdGlvbkF4ZXMoYmlhcy5zaGFwZSwgZHlBY3RpdmF0aW9uLnNoYXBlKTtcbiAgICBpZiAocmVkdWNlQXhlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlcyA9IHN1bShyZXMsIHJlZHVjZUF4ZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzaGFwZShyZXMsIGJpYXMuc2hhcGUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5QWN0aXZhdGlvbih4LCBhY3RpdmF0aW9uLCBwcmVsdUFjdGl2YXRpb25XZWlnaHRzLCBsZWFreXJlbHVBbHBoYSkge1xuICAgIGlmIChhY3RpdmF0aW9uID09PSAnbGluZWFyJykge1xuICAgICAgICByZXR1cm4geDtcbiAgICB9XG4gICAgZWxzZSBpZiAoYWN0aXZhdGlvbiA9PT0gJ3JlbHUnKSB7XG4gICAgICAgIHJldHVybiByZWx1KHgpO1xuICAgIH1cbiAgICBlbHNlIGlmIChhY3RpdmF0aW9uID09PSAnZWx1Jykge1xuICAgICAgICByZXR1cm4gZWx1KHgpO1xuICAgIH1cbiAgICBlbHNlIGlmIChhY3RpdmF0aW9uID09PSAncmVsdTYnKSB7XG4gICAgICAgIHJldHVybiByZWx1Nih4KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYWN0aXZhdGlvbiA9PT0gJ3ByZWx1Jykge1xuICAgICAgICByZXR1cm4gcHJlbHUoeCwgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdsZWFreXJlbHUnKSB7XG4gICAgICAgIHJldHVybiBsZWFreVJlbHUoeCwgbGVha3lyZWx1QWxwaGEpO1xuICAgIH1cbiAgICBlbHNlIGlmIChhY3RpdmF0aW9uID09PSAnc2lnbW9pZCcpIHtcbiAgICAgICAgcmV0dXJuIHNpZ21vaWQoeCk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBmdXNlZCBhY3RpdmF0aW9uICR7YWN0aXZhdGlvbn0uYCk7XG59XG4vLyBXaGV0aGVyIHdlIHNob3VsZCBjYWxsIGZ1c2VkIG9wcy5cbmV4cG9ydCBjb25zdCBzaG91bGRGdXNlID0gKGdyYWRpZW50RGVwdGgsIGFjdGl2YXRpb24pID0+IHtcbiAgICBjb25zdCBncmFkaWVudE1vZGUgPSBncmFkaWVudERlcHRoID4gMDtcbiAgICByZXR1cm4gIWdyYWRpZW50TW9kZSB8fCBhY3RpdmF0aW9uID09PSAnbGluZWFyJztcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mdXNlZF91dGlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBHYXRoZXJWMiB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIEdhdGhlciBzbGljZXMgZnJvbSB0ZW5zb3IgYHhgJ3MgYXhpcyBgYXhpc2AgYWNjb3JkaW5nIHRvIGBpbmRpY2VzYC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzLCA0XSk7XG4gKiBjb25zdCBpbmRpY2VzID0gdGYudGVuc29yMWQoWzEsIDMsIDNdLCAnaW50MzInKTtcbiAqXG4gKiB4LmdhdGhlcihpbmRpY2VzKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IyZChbMSwgMiwgMywgNF0sIFsyLCAyXSk7XG4gKiBjb25zdCBpbmRpY2VzID0gdGYudGVuc29yMWQoWzEsIDEsIDBdLCAnaW50MzInKTtcbiAqXG4gKiB4LmdhdGhlcihpbmRpY2VzKS5wcmludCgpO1xuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yIHdob3NlIHNsaWNlcyB0byBiZSBnYXRoZXJlZC5cbiAqIEBwYXJhbSBpbmRpY2VzIFRoZSBpbmRpY2VzIG9mIHRoZSB2YWx1ZXMgdG8gZXh0cmFjdC5cbiAqIEBwYXJhbSBheGlzIFRoZSBheGlzIG92ZXIgd2hpY2ggdG8gc2VsZWN0IHZhbHVlcy4gRGVmYXVsdHMgdG8gMC5cbiAqIEBwYXJhbSBiYXRjaERpbXMgT3B0aW9uYWwuIFRoZSBudW1iZXIgb2YgYmF0Y2ggZGltZW5zaW9ucy4gSXQgbXVzdCBiZSBsZXNzXG4gKiAgICAgdGhhbiBvciBlcXVhbCB0byByYW5rKGluZGljZXMpLiBEZWZhdWx0cyB0byAwLlxuICogICAgIFRoZSBvdXRwdXQgdGVuc29yIHdpbGwgaGF2ZSBzaGFwZSBvZlxuICogICAgIGB4LnNoYXBlWzpheGlzXSArIGluZGljZXMuc2hhcGVbYmF0Y2hEaW1zOl0gKyB4LnNoYXBlW2F4aXMgKyAxOl1gXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnU2xpY2luZyBhbmQgSm9pbmluZyd9XG4gKi9cbmZ1bmN0aW9uIGdhdGhlcl8oeCwgaW5kaWNlcywgYXhpcyA9IDAsIGJhdGNoRGltcyA9IDApIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdnYXRoZXInKTtcbiAgICBjb25zdCAkaW5kaWNlcyA9IGNvbnZlcnRUb1RlbnNvcihpbmRpY2VzLCAnaW5kaWNlcycsICdnYXRoZXInLCAnaW50MzInKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4LCBpbmRpY2VzOiAkaW5kaWNlcyB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBheGlzLCBiYXRjaERpbXMgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChHYXRoZXJWMiwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgZ2F0aGVyID0gb3AoeyBnYXRoZXJfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2F0aGVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBHYXRoZXJOZCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIEdhdGhlciBzbGljZXMgZnJvbSBpbnB1dCB0ZW5zb3IgaW50byBhIFRlbnNvciB3aXRoIHNoYXBlIHNwZWNpZmllZCBieVxuICogYGluZGljZXNgLlxuICpcbiAqIGBpbmRpY2VzYCBpcyBhbiBLLWRpbWVuc2lvbmFsIGludGVnZXIgdGVuc29yLCBiZXN0IHRob3VnaHQgb2YgYXMgYVxuICogKEstMSktZGltZW5zaW9uYWwgdGVuc29yIG9mIGluZGljZXMgaW50byBpbnB1dCwgd2hlcmUgZWFjaCBlbGVtZW50IGRlZmluZXMgYVxuICogc2xpY2Ugb2YgaW5wdXQ6XG4gKiBvdXRwdXRbXFxcXChpXzAsIC4uLiwgaV97Sy0yfVxcXFwpXSA9IGlucHV0W2luZGljZXNbXFxcXChpXzAsIC4uLiwgaV97Sy0yfVxcXFwpXV1cbiAqXG4gKiBXaGVyZWFzIGluIGB0Zi5nYXRoZXJgLCBgaW5kaWNlc2AgZGVmaW5lcyBzbGljZXMgaW50byB0aGUgZmlyc3QgZGltZW5zaW9uIG9mXG4gKiBpbnB1dCwgaW4gYHRmLmdhdGhlck5EYCwgYGluZGljZXNgIGRlZmluZXMgc2xpY2VzIGludG8gdGhlIGZpcnN0IE4gZGltZW5zaW9uc1xuICogb2YgaW5wdXQsIHdoZXJlIE4gPSBpbmRpY2VzLnNoYXBlWy0xXS5cbiAqXG4gKiBUaGUgbGFzdCBkaW1lbnNpb24gb2YgaW5kaWNlcyBjYW4gYmUgYXQgbW9zdCB0aGUgcmFuayBvZiBpbnB1dDpcbiAqIGluZGljZXMuc2hhcGVbLTFdIDw9IGlucHV0LnJhbmtcbiAqXG4gKiBUaGUgbGFzdCBkaW1lbnNpb24gb2YgYGluZGljZXNgIGNvcnJlc3BvbmRzIHRvIGVsZW1lbnRzXG4gKiAoaWYgaW5kaWNlcy5zaGFwZVstMV0gPT0gaW5wdXQucmFuaykgb3Igc2xpY2VzXG4gKiAoaWYgaW5kaWNlcy5zaGFwZVstMV0gPCBpbnB1dC5yYW5rKSBhbG9uZyBkaW1lbnNpb24gaW5kaWNlcy5zaGFwZVstMV0gb2ZcbiAqIGlucHV0LlxuICogVGhlIG91dHB1dCB0ZW5zb3IgaGFzIHNoYXBlXG4gKiBpbmRpY2VzLnNoYXBlWzotMV0gKyBpbnB1dC5zaGFwZVtpbmRpY2VzLnNoYXBlWy0xXTpdXG4gKlxuICogTm90ZSB0aGF0IG9uIENQVSwgaWYgYW4gb3V0IG9mIGJvdW5kIGluZGV4IGlzIGZvdW5kLCBhbiBlcnJvciBpcyByZXR1cm5lZC4gT25cbiAqIEdQVSwgaWYgYW4gb3V0IG9mIGJvdW5kIGluZGV4IGlzIGZvdW5kLCBhIDAgaXMgc3RvcmVkIGluIHRoZSBjb3JyZXNwb25kaW5nXG4gKiBvdXRwdXQgdmFsdWUuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGluZGljZXMgPSB0Zi50ZW5zb3IyZChbMCwgMSwgMSwgMF0sIFsyLDJdLCAnaW50MzInKTtcbiAqIGNvbnN0IGlucHV0ID0gdGYudGVuc29yMmQoWzksIDEwLCAxMSwgMTJdLCBbMiwgMl0pO1xuICogdGYuZ2F0aGVyTkQoaW5wdXQsIGluZGljZXMpLnByaW50KCkgLy8gWzEwLCAxMV1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSB0ZW5zb3IgZnJvbSB3aGljaCB0byBnYXRoZXIgdmFsdWVzLlxuICogQHBhcmFtIGluZGljZXMgSW5kZXggdGVuc29yLCBtdXN0IGJlIG9mIHR5cGUgaW50MzIuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU2xpY2luZyBhbmQgSm9pbmluZyd9XG4gKi9cbmZ1bmN0aW9uIGdhdGhlck5EXyh4LCBpbmRpY2VzKSB7XG4gICAgY29uc3QgJGluZGljZXMgPSBjb252ZXJ0VG9UZW5zb3IoaW5kaWNlcywgJ2luZGljZXMnLCAnZ2F0aGVyTkQnLCAnaW50MzInKTtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdnYXRoZXJORCcsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgcGFyYW1zOiAkeCwgaW5kaWNlczogJGluZGljZXMgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChHYXRoZXJOZCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBnYXRoZXJORCA9IG9wKHsgZ2F0aGVyTkRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2F0aGVyX25kLmpzLm1hcCIsImltcG9ydCB7IGNvbXB1dGVTdHJpZGVzLCBzaXplRnJvbVNoYXBlIH0gZnJvbSAnLi4vdXRpbCc7XG4vKipcbiAqIFZhbGlkYXRlIGdhdGhlciBuZCBpbnB1dHMuXG4gKlxuICogQHBhcmFtIHRlbnNvciBUaGUgdGVuc29yIGNvbnRhaW5zIHRoZSBzb3VyY2UgdmFsdWVzLlxuICogQHBhcmFtIGluZGljZXMgVGhlIHRlbnNvciBjb250YWlucyB0aGUgaW5kaWNlcyB0byBzbGljZSB0aGUgc291cmNlLlxuICpcbiAqIEByZXR1cm5zIFtyZXN1bHRTaGFwZSwgbnVtVXBkYXRlcywgc2xpY2VTaXplLCBzdHJpZGVzXVxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZUFuZFZhbGlkYXRlKHRlbnNvciwgaW5kaWNlcykge1xuICAgIGNvbnN0IHRlbnNvclJhbmsgPSB0ZW5zb3Iuc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IGluZGljZXNSYW5rID0gaW5kaWNlcy5zaGFwZS5sZW5ndGg7XG4gICAgaWYgKHRlbnNvclJhbmsgPCAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGYuZ2F0aGVyTkQoKSBleHBlY3RzIHRoZSBpbnB1dCB0byBiZSByYW5rIDEgb3IgaGlnaGVyLCcgK1xuICAgICAgICAgICAgYCBidXQgdGhlIHJhbmsgd2FzICR7dGVuc29yUmFua30uYCk7XG4gICAgfVxuICAgIGlmIChpbmRpY2VzUmFuayA8IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0Zi5nYXRoZXJORCgpIGV4cGVjdHMgdGhlIGluZGljZXMgdG8gYmUgcmFuayAxIG9yIGhpZ2hlciwnICtcbiAgICAgICAgICAgIGAgYnV0IHRoZSByYW5rIHdhcyAke2luZGljZXNSYW5rfS5gKTtcbiAgICB9XG4gICAgaWYgKGluZGljZXMuZHR5cGUgIT09ICdpbnQzMicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0Zi5nYXRoZXJORCgpIGV4cGVjdHMgdGhlIGluZGljZXMgdG8gYmUgaW50MzIgdHlwZSwnICtcbiAgICAgICAgICAgIGAgYnV0IHRoZSBkdHlwZSB3YXMgJHtpbmRpY2VzLmR0eXBlfS5gKTtcbiAgICB9XG4gICAgaWYgKGluZGljZXMuc2hhcGVbaW5kaWNlc1JhbmsgLSAxXSA+IHRlbnNvclJhbmspIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbmRleCBpbm5lcm1vc3QgZGltZW5zaW9uIGxlbmd0aCBtdXN0IGJlIDw9IHRlbnNvciByYW5rOyBzYXc6ICcgK1xuICAgICAgICAgICAgYCR7aW5kaWNlcy5zaGFwZVtpbmRpY2VzUmFuayAtIDFdfSB2cy4gJHt0ZW5zb3JSYW5rfWApO1xuICAgIH1cbiAgICBpZiAoc2l6ZUZyb21TaGFwZSh0ZW5zb3Iuc2hhcGUpID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWVzdGVkIG1vcmUgdGhhbiAwIGVudHJpZXMsIGJ1dCBpbnB1dCBpcyBlbXB0eS4nICtcbiAgICAgICAgICAgIGAgSW5wdXQgc2hhcGU6ICR7dGVuc29yLnNoYXBlfS5gKTtcbiAgICB9XG4gICAgY29uc3QgaW5kaWNlc1NoYXBlID0gaW5kaWNlcy5zaGFwZTtcbiAgICBjb25zdCBzbGljZVJhbmsgPSBpbmRpY2VzU2hhcGVbaW5kaWNlc1NoYXBlLmxlbmd0aCAtIDFdO1xuICAgIC8vIFRoZSByZXN1bHQgc2hhcGUgaXNcbiAgICAvLyAgIGluZGljZXMuc2hhcGVbOi0xXSArIHBhcmFtcy5zaGFwZVtpbmRpY2VzLnNoYXBlWy0xXTpdXG4gICAgbGV0IG5SZXN1bHQgPSAxO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kaWNlc1NoYXBlLmxlbmd0aCAtIDE7ICsraSkge1xuICAgICAgICBuUmVzdWx0ICo9IGluZGljZXNTaGFwZVtpXTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRTaGFwZSA9IHRlbnNvci5zaGFwZTtcbiAgICBjb25zdCByZXN1bHRTaGFwZSA9IGluZGljZXNTaGFwZS5zbGljZSgpO1xuICAgIHJlc3VsdFNoYXBlLnBvcCgpO1xuICAgIGxldCBzbGljZVNpemUgPSAxO1xuICAgIGZvciAobGV0IGkgPSBzbGljZVJhbms7IGkgPCB0ZW5zb3JSYW5rOyArK2kpIHtcbiAgICAgICAgc2xpY2VTaXplICo9IGlucHV0U2hhcGVbaV07XG4gICAgICAgIHJlc3VsdFNoYXBlLnB1c2goaW5wdXRTaGFwZVtpXSk7XG4gICAgfVxuICAgIGNvbnN0IHN0cmlkZXMgPSBbLi4uY29tcHV0ZVN0cmlkZXModGVuc29yLnNoYXBlKS5tYXAoc3RyaWRlID0+IHN0cmlkZSAvIHNsaWNlU2l6ZSksXG4gICAgICAgIDFdLnNsaWNlKDAsIHNsaWNlUmFuayk7XG4gICAgcmV0dXJuIFtyZXN1bHRTaGFwZSwgblJlc3VsdCwgc2xpY2VTaXplLCBzdHJpZGVzXTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdhdGhlcl9uZF91dGlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBHcmVhdGVyIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IG1ha2VUeXBlc01hdGNoIH0gZnJvbSAnLi4vdGVuc29yX3V0aWwnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlIH0gZnJvbSAnLi9icm9hZGNhc3RfdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV0dXJucyB0aGUgdHJ1dGggdmFsdWUgb2YgKGEgPiBiKSBlbGVtZW50LXdpc2UuIFN1cHBvcnRzIGJyb2FkY2FzdGluZy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzIsIDIsIDJdKTtcbiAqXG4gKiBhLmdyZWF0ZXIoYikucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBpbnB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIGlucHV0IHRlbnNvci4gTXVzdCBoYXZlIHRoZSBzYW1lIGR0eXBlIGFzIGBhYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdMb2dpY2FsJ31cbiAqL1xuZnVuY3Rpb24gZ3JlYXRlcl8oYSwgYikge1xuICAgIGxldCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdncmVhdGVyJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG4gICAgbGV0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ2dyZWF0ZXInLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgICBbJGEsICRiXSA9IG1ha2VUeXBlc01hdGNoKCRhLCAkYik7XG4gICAgYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoJGEuc2hhcGUsICRiLnNoYXBlKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGE6ICRhLCBiOiAkYiB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEdyZWF0ZXIsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgZ3JlYXRlciA9IG9wKHsgZ3JlYXRlcl8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ncmVhdGVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBHcmVhdGVyRXF1YWwgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgbWFrZVR5cGVzTWF0Y2ggfSBmcm9tICcuLi90ZW5zb3JfdXRpbCc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUgfSBmcm9tICcuL2Jyb2FkY2FzdF91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSB0cnV0aCB2YWx1ZSBvZiAoYSA+PSBiKSBlbGVtZW50LXdpc2UuIFN1cHBvcnRzIGJyb2FkY2FzdGluZy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzIsIDIsIDJdKTtcbiAqXG4gKiBhLmdyZWF0ZXJFcXVhbChiKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGEgVGhlIGZpcnN0IGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgaW5wdXQgdGVuc29yLiBNdXN0IGhhdmUgdGhlIHNhbWUgZHR5cGUgYXMgYGFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0xvZ2ljYWwnfVxuICovXG5mdW5jdGlvbiBncmVhdGVyRXF1YWxfKGEsIGIpIHtcbiAgICBsZXQgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnZ3JlYXRlckVxdWFsJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG4gICAgbGV0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ2dyZWF0ZXJFcXVhbCcsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICAgIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcbiAgICBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSgkYS5zaGFwZSwgJGIuc2hhcGUpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgYTogJGEsIGI6ICRiIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoR3JlYXRlckVxdWFsLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGdyZWF0ZXJFcXVhbCA9IG9wKHsgZ3JlYXRlckVxdWFsXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdyZWF0ZXJfZXF1YWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEltYWcgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbWFnaW5hcnkgcGFydCBvZiBhIGNvbXBsZXggKG9yIHJlYWwpIHRlbnNvci5cbiAqXG4gKiBHaXZlbiBhIHRlbnNvciBpbnB1dCwgdGhpcyBvcGVyYXRpb24gcmV0dXJucyBhIHRlbnNvciBvZiB0eXBlIGZsb2F0IHRoYXQgaXNcbiAqIHRoZSBpbWFnaW5hcnkgcGFydCBvZiBlYWNoIGVsZW1lbnQgaW4gaW5wdXQgY29uc2lkZXJlZCBhcyBhIGNvbXBsZXggbnVtYmVyLlxuICogSWYgaW5wdXQgaXMgcmVhbCwgYSB0ZW5zb3Igb2YgYWxsIHplcm9zIGlzIHJldHVybmVkLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYuY29tcGxleChbLTIuMjUsIDMuMjVdLCBbNC43NSwgNS43NV0pO1xuICogdGYuaW1hZyh4KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5mdW5jdGlvbiBpbWFnXyhpbnB1dCkge1xuICAgIGNvbnN0ICRpbnB1dCA9IGNvbnZlcnRUb1RlbnNvcihpbnB1dCwgJ2lucHV0JywgJ2ltYWcnKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGlucHV0OiAkaW5wdXQgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChJbWFnLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGltYWcgPSBvcCh7IGltYWdfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW1hZy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgQ3JvcEFuZFJlc2l6ZSB9IGZyb20gJy4uLy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbi8qKlxuICogRXh0cmFjdHMgY3JvcHMgZnJvbSB0aGUgaW5wdXQgaW1hZ2UgdGVuc29yIGFuZCByZXNpemVzIHRoZW0gdXNpbmcgYmlsaW5lYXJcbiAqIHNhbXBsaW5nIG9yIG5lYXJlc3QgbmVpZ2hib3Igc2FtcGxpbmcgKHBvc3NpYmx5IHdpdGggYXNwZWN0IHJhdGlvIGNoYW5nZSlcbiAqIHRvIGEgY29tbW9uIG91dHB1dCBzaXplIHNwZWNpZmllZCBieSBjcm9wU2l6ZS5cbiAqXG4gKiBAcGFyYW0gaW1hZ2UgNGQgdGVuc29yIG9mIHNoYXBlIGBbYmF0Y2gsaW1hZ2VIZWlnaHQsaW1hZ2VXaWR0aCwgZGVwdGhdYCxcbiAqICAgICB3aGVyZSBpbWFnZUhlaWdodCBhbmQgaW1hZ2VXaWR0aCBtdXN0IGJlIHBvc2l0aXZlLCBzcGVjaWZ5aW5nIHRoZVxuICogICAgIGJhdGNoIG9mIGltYWdlcyBmcm9tIHdoaWNoIHRvIHRha2UgY3JvcHNcbiAqIEBwYXJhbSBib3hlcyAyZCBmbG9hdDMyIHRlbnNvciBvZiBzaGFwZSBgW251bUJveGVzLCA0XWAuIEVhY2ggZW50cnkgaXNcbiAqICAgICBgW3kxLCB4MSwgeTIsIHgyXWAsIHdoZXJlIGAoeTEsIHgxKWAgYW5kIGAoeTIsIHgyKWAgYXJlIHRoZSBub3JtYWxpemVkXG4gKiAgICAgY29vcmRpbmF0ZXMgb2YgdGhlIGJveCBpbiB0aGUgYm94SW5kW2ldJ3RoIGltYWdlIGluIHRoZSBiYXRjaFxuICogQHBhcmFtIGJveEluZCAxZCBpbnQzMiB0ZW5zb3Igb2Ygc2hhcGUgYFtudW1Cb3hlc11gIHdpdGggdmFsdWVzIGluIHJhbmdlXG4gKiAgICAgYFswLCBiYXRjaClgIHRoYXQgc3BlY2lmaWVzIHRoZSBpbWFnZSB0aGF0IHRoZSBgaWAtdGggYm94IHJlZmVycyB0by5cbiAqIEBwYXJhbSBjcm9wU2l6ZSAxZCBpbnQzMiB0ZW5zb3Igb2YgMiBlbGVtZW50cyBgW2Nyb3BIZWlnaCwgY3JvcFdpZHRoXWBcbiAqICAgICBzcGVjaWZ5aW5nIHRoZSBzaXplIHRvIHdoaWNoIGFsbCBjcm9wcyBhcmUgcmVzaXplZCB0by5cbiAqIEBwYXJhbSBtZXRob2QgT3B0aW9uYWwgc3RyaW5nIGZyb20gYCdiaWxpbmVhcicgfCAnbmVhcmVzdCdgLFxuICogICAgIGRlZmF1bHRzIHRvIGJpbGluZWFyLCB3aGljaCBzcGVjaWZpZXMgdGhlIHNhbXBsaW5nIG1ldGhvZCBmb3IgcmVzaXppbmdcbiAqIEBwYXJhbSBleHRyYXBvbGF0aW9uVmFsdWUgQSB0aHJlc2hvbGQgZm9yIGRlY2lkaW5nIHdoZW4gdG8gcmVtb3ZlIGJveGVzIGJhc2VkXG4gKiAgICAgb24gc2NvcmUuIERlZmF1bHRzIHRvIDAuXG4gKiBAcmV0dXJuIEEgNEQgdGVuc29yIG9mIHRoZSBzaGFwZSBgW251bUJveGVzLGNyb3BIZWlnaHQsY3JvcFdpZHRoLGRlcHRoXWBcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdJbWFnZXMnLCBuYW1lc3BhY2U6ICdpbWFnZSd9XG4gKi9cbmZ1bmN0aW9uIGNyb3BBbmRSZXNpemVfKGltYWdlLCBib3hlcywgYm94SW5kLCBjcm9wU2l6ZSwgbWV0aG9kID0gJ2JpbGluZWFyJywgZXh0cmFwb2xhdGlvblZhbHVlID0gMCkge1xuICAgIGNvbnN0ICRpbWFnZSA9IGNvbnZlcnRUb1RlbnNvcihpbWFnZSwgJ2ltYWdlJywgJ2Nyb3BBbmRSZXNpemUnKTtcbiAgICBjb25zdCAkYm94ZXMgPSBjb252ZXJ0VG9UZW5zb3IoYm94ZXMsICdib3hlcycsICdjcm9wQW5kUmVzaXplJywgJ2Zsb2F0MzInKTtcbiAgICBjb25zdCAkYm94SW5kID0gY29udmVydFRvVGVuc29yKGJveEluZCwgJ2JveEluZCcsICdjcm9wQW5kUmVzaXplJywgJ2ludDMyJyk7XG4gICAgY29uc3QgbnVtQm94ZXMgPSAkYm94ZXMuc2hhcGVbMF07XG4gICAgdXRpbC5hc3NlcnQoJGltYWdlLnJhbmsgPT09IDQsICgpID0+ICdFcnJvciBpbiBjcm9wQW5kUmVzaXplOiBpbWFnZSBtdXN0IGJlIHJhbmsgNCwnICtcbiAgICAgICAgYGJ1dCBnb3QgcmFuayAkeyRpbWFnZS5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydCgkYm94ZXMucmFuayA9PT0gMiAmJiAkYm94ZXMuc2hhcGVbMV0gPT09IDQsICgpID0+IGBFcnJvciBpbiBjcm9wQW5kUmVzaXplOiBib3hlcyBtdXN0IGJlIGhhdmUgc2l6ZSBbJHtudW1Cb3hlc30sNF0gYCArXG4gICAgICAgIGBidXQgaGFkIHNoYXBlICR7JGJveGVzLnNoYXBlfS5gKTtcbiAgICB1dGlsLmFzc2VydCgkYm94SW5kLnJhbmsgPT09IDEgJiYgJGJveEluZC5zaGFwZVswXSA9PT0gbnVtQm94ZXMsICgpID0+IGBFcnJvciBpbiBjcm9wQW5kUmVzaXplOiBib3hJbmQgbXVzdCBiZSBoYXZlIHNpemUgWyR7bnVtQm94ZXN9XSBgICtcbiAgICAgICAgYGJ1dCBoYWQgc2hhcGUgJHskYm94ZXMuc2hhcGV9LmApO1xuICAgIHV0aWwuYXNzZXJ0KGNyb3BTaXplLmxlbmd0aCA9PT0gMiwgKCkgPT4gYEVycm9yIGluIGNyb3BBbmRSZXNpemU6IGNyb3BTaXplIG11c3QgYmUgb2YgbGVuZ3RoIDIsIGJ1dCBnb3QgYCArXG4gICAgICAgIGBsZW5ndGggJHtjcm9wU2l6ZS5sZW5ndGh9LmApO1xuICAgIHV0aWwuYXNzZXJ0KGNyb3BTaXplWzBdID49IDEgJiYgY3JvcFNpemVbMV0gPj0gMSwgKCkgPT4gYGNyb3BTaXplIG11c3QgYmUgYXRsZWFzdCBbMSwxXSwgYnV0IHdhcyAke2Nyb3BTaXplfWApO1xuICAgIHV0aWwuYXNzZXJ0KG1ldGhvZCA9PT0gJ2JpbGluZWFyJyB8fCBtZXRob2QgPT09ICduZWFyZXN0JywgKCkgPT4gYG1ldGhvZCBtdXN0IGJlIGJpbGluZWFyIG9yIG5lYXJlc3QsIGJ1dCB3YXMgJHttZXRob2R9YCk7XG4gICAgY29uc3QgaW5wdXRzID0geyBpbWFnZTogJGltYWdlLCBib3hlczogJGJveGVzLCBib3hJbmQ6ICRib3hJbmQgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgbWV0aG9kLCBleHRyYXBvbGF0aW9uVmFsdWUsIGNyb3BTaXplIH07XG4gICAgY29uc3QgcmVzID0gRU5HSU5FLnJ1bktlcm5lbChDcm9wQW5kUmVzaXplLCBpbnB1dHMsIGF0dHJzKTtcbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IGNyb3BBbmRSZXNpemUgPSBvcCh7IGNyb3BBbmRSZXNpemVfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y3JvcF9hbmRfcmVzaXplLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBGbGlwTGVmdFJpZ2h0IH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBGbGlwcyB0aGUgaW1hZ2UgbGVmdCB0byByaWdodC4gQ3VycmVudGx5IGF2YWlsYWJsZSBpbiB0aGUgQ1BVLCBXZWJHTCwgYW5kXG4gKiBXQVNNIGJhY2tlbmRzLlxuICpcbiAqIEBwYXJhbSBpbWFnZSA0ZCB0ZW5zb3Igb2Ygc2hhcGUgYFtiYXRjaCwgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIGRlcHRoXWAuXG4gKi9cbi8qKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdJbWFnZXMnLCBuYW1lc3BhY2U6ICdpbWFnZSd9ICovXG5mdW5jdGlvbiBmbGlwTGVmdFJpZ2h0XyhpbWFnZSkge1xuICAgIGNvbnN0ICRpbWFnZSA9IGNvbnZlcnRUb1RlbnNvcihpbWFnZSwgJ2ltYWdlJywgJ2ZsaXBMZWZ0UmlnaHQnLCAnZmxvYXQzMicpO1xuICAgIHV0aWwuYXNzZXJ0KCRpbWFnZS5yYW5rID09PSA0LCAoKSA9PiAnRXJyb3IgaW4gZmxpcExlZnRSaWdodDogaW1hZ2UgbXVzdCBiZSByYW5rIDQsJyArXG4gICAgICAgIGBidXQgZ290IHJhbmsgJHskaW1hZ2UucmFua30uYCk7XG4gICAgY29uc3QgaW5wdXRzID0geyBpbWFnZTogJGltYWdlIH07XG4gICAgY29uc3QgcmVzID0gRU5HSU5FLnJ1bktlcm5lbChGbGlwTGVmdFJpZ2h0LCBpbnB1dHMsIHt9KTtcbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IGZsaXBMZWZ0UmlnaHQgPSBvcCh7IGZsaXBMZWZ0UmlnaHRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmxpcF9sZWZ0X3JpZ2h0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBOb25NYXhTdXBwcmVzc2lvblYzIH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBub25NYXhTdXBwU2FuaXR5Q2hlY2sgfSBmcm9tICcuLi9ub25tYXhfdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4uL29wZXJhdGlvbic7XG4vKipcbiAqIFBlcmZvcm1zIG5vbiBtYXhpbXVtIHN1cHByZXNzaW9uIG9mIGJvdW5kaW5nIGJveGVzIGJhc2VkIG9uXG4gKiBpb3UgKGludGVyc2VjdGlvbiBvdmVyIHVuaW9uKS5cbiAqXG4gKiBAcGFyYW0gYm94ZXMgYSAyZCB0ZW5zb3Igb2Ygc2hhcGUgYFtudW1Cb3hlcywgNF1gLiBFYWNoIGVudHJ5IGlzXG4gKiAgICAgYFt5MSwgeDEsIHkyLCB4Ml1gLCB3aGVyZSBgKHkxLCB4MSlgIGFuZCBgKHkyLCB4MilgIGFyZSB0aGUgY29ybmVycyBvZlxuICogICAgIHRoZSBib3VuZGluZyBib3guXG4gKiBAcGFyYW0gc2NvcmVzIGEgMWQgdGVuc29yIHByb3ZpZGluZyB0aGUgYm94IHNjb3JlcyBvZiBzaGFwZSBgW251bUJveGVzXWAuXG4gKiBAcGFyYW0gbWF4T3V0cHV0U2l6ZSBUaGUgbWF4aW11bSBudW1iZXIgb2YgYm94ZXMgdG8gYmUgc2VsZWN0ZWQuXG4gKiBAcGFyYW0gaW91VGhyZXNob2xkIEEgZmxvYXQgcmVwcmVzZW50aW5nIHRoZSB0aHJlc2hvbGQgZm9yIGRlY2lkaW5nIHdoZXRoZXJcbiAqICAgICBib3hlcyBvdmVybGFwIHRvbyBtdWNoIHdpdGggcmVzcGVjdCB0byBJT1UuIE11c3QgYmUgYmV0d2VlbiBbMCwgMV0uXG4gKiAgICAgRGVmYXVsdHMgdG8gMC41ICg1MCUgYm94IG92ZXJsYXApLlxuICogQHBhcmFtIHNjb3JlVGhyZXNob2xkIEEgdGhyZXNob2xkIGZvciBkZWNpZGluZyB3aGVuIHRvIHJlbW92ZSBib3hlcyBiYXNlZFxuICogICAgIG9uIHNjb3JlLiBEZWZhdWx0cyB0byAtaW5mLCB3aGljaCBtZWFucyBhbnkgc2NvcmUgaXMgYWNjZXB0ZWQuXG4gKiBAcmV0dXJuIEEgMUQgdGVuc29yIHdpdGggdGhlIHNlbGVjdGVkIGJveCBpbmRpY2VzLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0ltYWdlcycsIG5hbWVzcGFjZTogJ2ltYWdlJ31cbiAqL1xuZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25fKGJveGVzLCBzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCA9IDAuNSwgc2NvcmVUaHJlc2hvbGQgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpIHtcbiAgICBjb25zdCAkYm94ZXMgPSBjb252ZXJ0VG9UZW5zb3IoYm94ZXMsICdib3hlcycsICdub25NYXhTdXBwcmVzc2lvbicpO1xuICAgIGNvbnN0ICRzY29yZXMgPSBjb252ZXJ0VG9UZW5zb3Ioc2NvcmVzLCAnc2NvcmVzJywgJ25vbk1heFN1cHByZXNzaW9uJyk7XG4gICAgY29uc3QgaW5wdXRzID0gbm9uTWF4U3VwcFNhbml0eUNoZWNrKCRib3hlcywgJHNjb3JlcywgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCk7XG4gICAgbWF4T3V0cHV0U2l6ZSA9IGlucHV0cy5tYXhPdXRwdXRTaXplO1xuICAgIGlvdVRocmVzaG9sZCA9IGlucHV0cy5pb3VUaHJlc2hvbGQ7XG4gICAgc2NvcmVUaHJlc2hvbGQgPSBpbnB1dHMuc2NvcmVUaHJlc2hvbGQ7XG4gICAgY29uc3QgYXR0cnMgPSB7IG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChOb25NYXhTdXBwcmVzc2lvblYzLCB7IGJveGVzOiAkYm94ZXMsIHNjb3JlczogJHNjb3JlcyB9LCBhdHRycyk7XG59XG5leHBvcnQgY29uc3Qgbm9uTWF4U3VwcHJlc3Npb24gPSBvcCh7IG5vbk1heFN1cHByZXNzaW9uXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW5vbl9tYXhfc3VwcHJlc3Npb24uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgbm9uTWF4U3VwcHJlc3Npb25WM0ltcGwgfSBmcm9tICcuLi8uLi9iYWNrZW5kcy9ub25fbWF4X3N1cHByZXNzaW9uX2ltcGwnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG5vbk1heFN1cHBTYW5pdHlDaGVjayB9IGZyb20gJy4uL25vbm1heF91dGlsJztcbmltcG9ydCB7IHRlbnNvcjFkIH0gZnJvbSAnLi4vdGVuc29yMWQnO1xuLyoqXG4gKiBQZXJmb3JtcyBub24gbWF4aW11bSBzdXBwcmVzc2lvbiBvZiBib3VuZGluZyBib3hlcyBiYXNlZCBvblxuICogaW91IChpbnRlcnNlY3Rpb24gb3ZlciB1bmlvbikuXG4gKlxuICogVGhpcyBpcyB0aGUgYXN5bmMgdmVyc2lvbiBvZiBgbm9uTWF4U3VwcHJlc3Npb25gXG4gKlxuICogQHBhcmFtIGJveGVzIGEgMmQgdGVuc29yIG9mIHNoYXBlIGBbbnVtQm94ZXMsIDRdYC4gRWFjaCBlbnRyeSBpc1xuICogICAgIGBbeTEsIHgxLCB5MiwgeDJdYCwgd2hlcmUgYCh5MSwgeDEpYCBhbmQgYCh5MiwgeDIpYCBhcmUgdGhlIGNvcm5lcnMgb2ZcbiAqICAgICB0aGUgYm91bmRpbmcgYm94LlxuICogQHBhcmFtIHNjb3JlcyBhIDFkIHRlbnNvciBwcm92aWRpbmcgdGhlIGJveCBzY29yZXMgb2Ygc2hhcGUgYFtudW1Cb3hlc11gLlxuICogQHBhcmFtIG1heE91dHB1dFNpemUgVGhlIG1heGltdW0gbnVtYmVyIG9mIGJveGVzIHRvIGJlIHNlbGVjdGVkLlxuICogQHBhcmFtIGlvdVRocmVzaG9sZCBBIGZsb2F0IHJlcHJlc2VudGluZyB0aGUgdGhyZXNob2xkIGZvciBkZWNpZGluZyB3aGV0aGVyXG4gKiAgICAgYm94ZXMgb3ZlcmxhcCB0b28gbXVjaCB3aXRoIHJlc3BlY3QgdG8gSU9VLiBNdXN0IGJlIGJldHdlZW4gWzAsIDFdLlxuICogICAgIERlZmF1bHRzIHRvIDAuNSAoNTAlIGJveCBvdmVybGFwKS5cbiAqIEBwYXJhbSBzY29yZVRocmVzaG9sZCBBIHRocmVzaG9sZCBmb3IgZGVjaWRpbmcgd2hlbiB0byByZW1vdmUgYm94ZXMgYmFzZWRcbiAqICAgICBvbiBzY29yZS4gRGVmYXVsdHMgdG8gLWluZiwgd2hpY2ggbWVhbnMgYW55IHNjb3JlIGlzIGFjY2VwdGVkLlxuICogQHJldHVybiBBIDFEIHRlbnNvciB3aXRoIHRoZSBzZWxlY3RlZCBib3ggaW5kaWNlcy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdJbWFnZXMnLCBuYW1lc3BhY2U6ICdpbWFnZSd9XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG5vbk1heFN1cHByZXNzaW9uQXN5bmNfKGJveGVzLCBzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCA9IDAuNSwgc2NvcmVUaHJlc2hvbGQgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpIHtcbiAgICBjb25zdCAkYm94ZXMgPSBjb252ZXJ0VG9UZW5zb3IoYm94ZXMsICdib3hlcycsICdub25NYXhTdXBwcmVzc2lvbkFzeW5jJyk7XG4gICAgY29uc3QgJHNjb3JlcyA9IGNvbnZlcnRUb1RlbnNvcihzY29yZXMsICdzY29yZXMnLCAnbm9uTWF4U3VwcHJlc3Npb25Bc3luYycpO1xuICAgIGNvbnN0IGlucHV0cyA9IG5vbk1heFN1cHBTYW5pdHlDaGVjaygkYm94ZXMsICRzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQpO1xuICAgIG1heE91dHB1dFNpemUgPSBpbnB1dHMubWF4T3V0cHV0U2l6ZTtcbiAgICBpb3VUaHJlc2hvbGQgPSBpbnB1dHMuaW91VGhyZXNob2xkO1xuICAgIHNjb3JlVGhyZXNob2xkID0gaW5wdXRzLnNjb3JlVGhyZXNob2xkO1xuICAgIGNvbnN0IGJveGVzQW5kU2NvcmVzID0gYXdhaXQgUHJvbWlzZS5hbGwoWyRib3hlcy5kYXRhKCksICRzY29yZXMuZGF0YSgpXSk7XG4gICAgY29uc3QgYm94ZXNWYWxzID0gYm94ZXNBbmRTY29yZXNbMF07XG4gICAgY29uc3Qgc2NvcmVzVmFscyA9IGJveGVzQW5kU2NvcmVzWzFdO1xuICAgIC8vIFdlIGNhbGwgYSBjcHUgYmFzZWQgaW1wbCBkaXJlY3RseSB3aXRoIHRoZSB0eXBlZGFycmF5IGRhdGEgIGhlcmUgcmF0aGVyXG4gICAgLy8gdGhhbiBhIGtlcm5lbCBiZWNhdXNlIGFsbCBrZXJuZWxzIGFyZSBzeW5jaHJvbm91cyAoYW5kIHRodXMgY2Fubm90IGF3YWl0XG4gICAgLy8gLmRhdGEoKSkuXG4gICAgY29uc3QgeyBzZWxlY3RlZEluZGljZXMgfSA9IG5vbk1heFN1cHByZXNzaW9uVjNJbXBsKGJveGVzVmFscywgc2NvcmVzVmFscywgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCk7XG4gICAgaWYgKCRib3hlcyAhPT0gYm94ZXMpIHtcbiAgICAgICAgJGJveGVzLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgaWYgKCRzY29yZXMgIT09IHNjb3Jlcykge1xuICAgICAgICAkc2NvcmVzLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRlbnNvcjFkKHNlbGVjdGVkSW5kaWNlcywgJ2ludDMyJyk7XG59XG5leHBvcnQgY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25Bc3luYyA9IG5vbk1heFN1cHByZXNzaW9uQXN5bmNfO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bm9uX21heF9zdXBwcmVzc2lvbl9hc3luYy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgTm9uTWF4U3VwcHJlc3Npb25WNCB9IGZyb20gJy4uLy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgbm9uTWF4U3VwcFNhbml0eUNoZWNrIH0gZnJvbSAnLi4vbm9ubWF4X3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBBc3luY2hyb25vdXNseSBwZXJmb3JtcyBub24gbWF4aW11bSBzdXBwcmVzc2lvbiBvZiBib3VuZGluZyBib3hlcyBiYXNlZCBvblxuICogaW91IChpbnRlcnNlY3Rpb24gb3ZlciB1bmlvbiksIHdpdGggYW4gb3B0aW9uIHRvIHBhZCByZXN1bHRzLlxuICpcbiAqIEBwYXJhbSBib3hlcyBhIDJkIHRlbnNvciBvZiBzaGFwZSBgW251bUJveGVzLCA0XWAuIEVhY2ggZW50cnkgaXNcbiAqICAgICBgW3kxLCB4MSwgeTIsIHgyXWAsIHdoZXJlIGAoeTEsIHgxKWAgYW5kIGAoeTIsIHgyKWAgYXJlIHRoZSBjb3JuZXJzIG9mXG4gKiAgICAgdGhlIGJvdW5kaW5nIGJveC5cbiAqIEBwYXJhbSBzY29yZXMgYSAxZCB0ZW5zb3IgcHJvdmlkaW5nIHRoZSBib3ggc2NvcmVzIG9mIHNoYXBlIGBbbnVtQm94ZXNdYC5cbiAqIEBwYXJhbSBtYXhPdXRwdXRTaXplIFRoZSBtYXhpbXVtIG51bWJlciBvZiBib3hlcyB0byBiZSBzZWxlY3RlZC5cbiAqIEBwYXJhbSBpb3VUaHJlc2hvbGQgQSBmbG9hdCByZXByZXNlbnRpbmcgdGhlIHRocmVzaG9sZCBmb3IgZGVjaWRpbmcgd2hldGhlclxuICogICAgIGJveGVzIG92ZXJsYXAgdG9vIG11Y2ggd2l0aCByZXNwZWN0IHRvIElPVS4gTXVzdCBiZSBiZXR3ZWVuIFswLCAxXS5cbiAqICAgICBEZWZhdWx0cyB0byAwLjUgKDUwJSBib3ggb3ZlcmxhcCkuXG4gKiBAcGFyYW0gc2NvcmVUaHJlc2hvbGQgQSB0aHJlc2hvbGQgZm9yIGRlY2lkaW5nIHdoZW4gdG8gcmVtb3ZlIGJveGVzIGJhc2VkXG4gKiAgICAgb24gc2NvcmUuIERlZmF1bHRzIHRvIC1pbmYsIHdoaWNoIG1lYW5zIGFueSBzY29yZSBpcyBhY2NlcHRlZC5cbiAqIEBwYXJhbSBwYWRUb01heE91dHB1dFNpemUgRGVmYWx0cyB0byBmYWxzZS4gSWYgdHJ1ZSwgc2l6ZSBvZiBvdXRwdXRcbiAqICAgICBgc2VsZWN0ZWRJbmRpY2VzYCBpcyBwYWRkZWQgdG8gbWF4T3V0cHV0U2l6ZS5cbiAqIEByZXR1cm4gQSBtYXAgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAgICAgLSBzZWxlY3RlZEluZGljZXM6IEEgMUQgdGVuc29yIHdpdGggdGhlIHNlbGVjdGVkIGJveCBpbmRpY2VzLlxuICogICAgIC0gdmFsaWRPdXRwdXRzOiBBIHNjYWxhciBkZW5vdGluZyBob3cgbWFueSBlbGVtZW50cyBpbiBgc2VsZWN0ZWRJbmRpY2VzYFxuICogICAgICAgYXJlIHZhbGlkLiBWYWxpZCBlbGVtZW50cyBvY2N1ciBmaXJzdCwgdGhlbiBwYWRkaW5nLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0ltYWdlcycsIG5hbWVzcGFjZTogJ2ltYWdlJ31cbiAqL1xuZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25QYWRkZWRfKGJveGVzLCBzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCA9IDAuNSwgc2NvcmVUaHJlc2hvbGQgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksIHBhZFRvTWF4T3V0cHV0U2l6ZSA9IGZhbHNlKSB7XG4gICAgY29uc3QgJGJveGVzID0gY29udmVydFRvVGVuc29yKGJveGVzLCAnYm94ZXMnLCAnbm9uTWF4U3VwcHJlc3Npb24nKTtcbiAgICBjb25zdCAkc2NvcmVzID0gY29udmVydFRvVGVuc29yKHNjb3JlcywgJ3Njb3JlcycsICdub25NYXhTdXBwcmVzc2lvbicpO1xuICAgIGNvbnN0IHBhcmFtcyA9IG5vbk1heFN1cHBTYW5pdHlDaGVjaygkYm94ZXMsICRzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsIG51bGwgLyogc29mdE5tc1NpZ21hICovKTtcbiAgICBjb25zdCAkbWF4T3V0cHV0U2l6ZSA9IHBhcmFtcy5tYXhPdXRwdXRTaXplO1xuICAgIGNvbnN0ICRpb3VUaHJlc2hvbGQgPSBwYXJhbXMuaW91VGhyZXNob2xkO1xuICAgIGNvbnN0ICRzY29yZVRocmVzaG9sZCA9IHBhcmFtcy5zY29yZVRocmVzaG9sZDtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGJveGVzOiAkYm94ZXMsIHNjb3JlczogJHNjb3JlcyB9O1xuICAgIGNvbnN0IGF0dHJzID0ge1xuICAgICAgICBtYXhPdXRwdXRTaXplOiAkbWF4T3V0cHV0U2l6ZSxcbiAgICAgICAgaW91VGhyZXNob2xkOiAkaW91VGhyZXNob2xkLFxuICAgICAgICBzY29yZVRocmVzaG9sZDogJHNjb3JlVGhyZXNob2xkLFxuICAgICAgICBwYWRUb01heE91dHB1dFNpemVcbiAgICB9O1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICBjb25zdCByZXN1bHQgPSBFTkdJTkUucnVuS2VybmVsKE5vbk1heFN1cHByZXNzaW9uVjQsIGlucHV0cywgYXR0cnMpO1xuICAgIHJldHVybiB7IHNlbGVjdGVkSW5kaWNlczogcmVzdWx0WzBdLCB2YWxpZE91dHB1dHM6IHJlc3VsdFsxXSB9O1xufVxuZXhwb3J0IGNvbnN0IG5vbk1heFN1cHByZXNzaW9uUGFkZGVkID0gb3AoeyBub25NYXhTdXBwcmVzc2lvblBhZGRlZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ub25fbWF4X3N1cHByZXNzaW9uX3BhZGRlZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBub25NYXhTdXBwcmVzc2lvblY0SW1wbCB9IGZyb20gJy4uLy4uL2JhY2tlbmRzL25vbl9tYXhfc3VwcHJlc3Npb25faW1wbCc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgbm9uTWF4U3VwcFNhbml0eUNoZWNrIH0gZnJvbSAnLi4vbm9ubWF4X3V0aWwnO1xuaW1wb3J0IHsgc2NhbGFyIH0gZnJvbSAnLi4vc2NhbGFyJztcbmltcG9ydCB7IHRlbnNvcjFkIH0gZnJvbSAnLi4vdGVuc29yMWQnO1xuLyoqXG4gKiBBc3luY2hyb25vdXNseSBwZXJmb3JtcyBub24gbWF4aW11bSBzdXBwcmVzc2lvbiBvZiBib3VuZGluZyBib3hlcyBiYXNlZCBvblxuICogaW91IChpbnRlcnNlY3Rpb24gb3ZlciB1bmlvbiksIHdpdGggYW4gb3B0aW9uIHRvIHBhZCByZXN1bHRzLlxuICpcbiAqIEBwYXJhbSBib3hlcyBhIDJkIHRlbnNvciBvZiBzaGFwZSBgW251bUJveGVzLCA0XWAuIEVhY2ggZW50cnkgaXNcbiAqICAgICBgW3kxLCB4MSwgeTIsIHgyXWAsIHdoZXJlIGAoeTEsIHgxKWAgYW5kIGAoeTIsIHgyKWAgYXJlIHRoZSBjb3JuZXJzIG9mXG4gKiAgICAgdGhlIGJvdW5kaW5nIGJveC5cbiAqIEBwYXJhbSBzY29yZXMgYSAxZCB0ZW5zb3IgcHJvdmlkaW5nIHRoZSBib3ggc2NvcmVzIG9mIHNoYXBlIGBbbnVtQm94ZXNdYC5cbiAqIEBwYXJhbSBtYXhPdXRwdXRTaXplIFRoZSBtYXhpbXVtIG51bWJlciBvZiBib3hlcyB0byBiZSBzZWxlY3RlZC5cbiAqIEBwYXJhbSBpb3VUaHJlc2hvbGQgQSBmbG9hdCByZXByZXNlbnRpbmcgdGhlIHRocmVzaG9sZCBmb3IgZGVjaWRpbmcgd2hldGhlclxuICogICAgIGJveGVzIG92ZXJsYXAgdG9vIG11Y2ggd2l0aCByZXNwZWN0IHRvIElPVS4gTXVzdCBiZSBiZXR3ZWVuIFswLCAxXS5cbiAqICAgICBEZWZhdWx0cyB0byAwLjUgKDUwJSBib3ggb3ZlcmxhcCkuXG4gKiBAcGFyYW0gc2NvcmVUaHJlc2hvbGQgQSB0aHJlc2hvbGQgZm9yIGRlY2lkaW5nIHdoZW4gdG8gcmVtb3ZlIGJveGVzIGJhc2VkXG4gKiAgICAgb24gc2NvcmUuIERlZmF1bHRzIHRvIC1pbmYsIHdoaWNoIG1lYW5zIGFueSBzY29yZSBpcyBhY2NlcHRlZC5cbiAqIEBwYXJhbSBwYWRUb01heE91dHB1dFNpemUgRGVmYWx0cyB0byBmYWxzZS4gSWYgdHJ1ZSwgc2l6ZSBvZiBvdXRwdXRcbiAqICAgICBgc2VsZWN0ZWRJbmRpY2VzYCBpcyBwYWRkZWQgdG8gbWF4T3V0cHV0U2l6ZS5cbiAqIEByZXR1cm4gQSBtYXAgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAgICAgLSBzZWxlY3RlZEluZGljZXM6IEEgMUQgdGVuc29yIHdpdGggdGhlIHNlbGVjdGVkIGJveCBpbmRpY2VzLlxuICogICAgIC0gdmFsaWRPdXRwdXRzOiBBIHNjYWxhciBkZW5vdGluZyBob3cgbWFueSBlbGVtZW50cyBpbiBgc2VsZWN0ZWRJbmRpY2VzYFxuICogICAgICAgYXJlIHZhbGlkLiBWYWxpZCBlbGVtZW50cyBvY2N1ciBmaXJzdCwgdGhlbiBwYWRkaW5nLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0ltYWdlcycsIG5hbWVzcGFjZTogJ2ltYWdlJ31cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25QYWRkZWRBc3luY18oYm94ZXMsIHNjb3JlcywgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkID0gMC41LCBzY29yZVRocmVzaG9sZCA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSwgcGFkVG9NYXhPdXRwdXRTaXplID0gZmFsc2UpIHtcbiAgICBjb25zdCAkYm94ZXMgPSBjb252ZXJ0VG9UZW5zb3IoYm94ZXMsICdib3hlcycsICdub25NYXhTdXBwcmVzc2lvbkFzeW5jJyk7XG4gICAgY29uc3QgJHNjb3JlcyA9IGNvbnZlcnRUb1RlbnNvcihzY29yZXMsICdzY29yZXMnLCAnbm9uTWF4U3VwcHJlc3Npb25Bc3luYycpO1xuICAgIGNvbnN0IHBhcmFtcyA9IG5vbk1heFN1cHBTYW5pdHlDaGVjaygkYm94ZXMsICRzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsIG51bGwgLyogc29mdE5tc1NpZ21hICovKTtcbiAgICBjb25zdCAkbWF4T3V0cHV0U2l6ZSA9IHBhcmFtcy5tYXhPdXRwdXRTaXplO1xuICAgIGNvbnN0ICRpb3VUaHJlc2hvbGQgPSBwYXJhbXMuaW91VGhyZXNob2xkO1xuICAgIGNvbnN0ICRzY29yZVRocmVzaG9sZCA9IHBhcmFtcy5zY29yZVRocmVzaG9sZDtcbiAgICBjb25zdCBbYm94ZXNWYWxzLCBzY29yZXNWYWxzXSA9IGF3YWl0IFByb21pc2UuYWxsKFskYm94ZXMuZGF0YSgpLCAkc2NvcmVzLmRhdGEoKV0pO1xuICAgIC8vIFdlIGNhbGwgYSBjcHUgYmFzZWQgaW1wbCBkaXJlY3RseSB3aXRoIHRoZSB0eXBlZGFycmF5IGRhdGEgaGVyZSByYXRoZXJcbiAgICAvLyB0aGFuIGEga2VybmVsIGJlY2F1c2UgYWxsIGtlcm5lbHMgYXJlIHN5bmNocm9ub3VzIChhbmQgdGh1cyBjYW5ub3QgYXdhaXRcbiAgICAvLyAuZGF0YSgpKS5cbiAgICBjb25zdCB7IHNlbGVjdGVkSW5kaWNlcywgdmFsaWRPdXRwdXRzIH0gPSBub25NYXhTdXBwcmVzc2lvblY0SW1wbChib3hlc1ZhbHMsIHNjb3Jlc1ZhbHMsICRtYXhPdXRwdXRTaXplLCAkaW91VGhyZXNob2xkLCAkc2NvcmVUaHJlc2hvbGQsIHBhZFRvTWF4T3V0cHV0U2l6ZSk7XG4gICAgaWYgKCRib3hlcyAhPT0gYm94ZXMpIHtcbiAgICAgICAgJGJveGVzLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgaWYgKCRzY29yZXMgIT09IHNjb3Jlcykge1xuICAgICAgICAkc2NvcmVzLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2VsZWN0ZWRJbmRpY2VzOiB0ZW5zb3IxZChzZWxlY3RlZEluZGljZXMsICdpbnQzMicpLFxuICAgICAgICB2YWxpZE91dHB1dHM6IHNjYWxhcih2YWxpZE91dHB1dHMsICdpbnQzMicpXG4gICAgfTtcbn1cbmV4cG9ydCBjb25zdCBub25NYXhTdXBwcmVzc2lvblBhZGRlZEFzeW5jID0gbm9uTWF4U3VwcHJlc3Npb25QYWRkZWRBc3luY187XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ub25fbWF4X3N1cHByZXNzaW9uX3BhZGRlZF9hc3luYy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgTm9uTWF4U3VwcHJlc3Npb25WNSB9IGZyb20gJy4uLy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgbm9uTWF4U3VwcFNhbml0eUNoZWNrIH0gZnJvbSAnLi4vbm9ubWF4X3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBQZXJmb3JtcyBub24gbWF4aW11bSBzdXBwcmVzc2lvbiBvZiBib3VuZGluZyBib3hlcyBiYXNlZCBvblxuICogaW91IChpbnRlcnNlY3Rpb24gb3ZlciB1bmlvbikuXG4gKlxuICogVGhpcyBvcCBhbHNvIHN1cHBvcnRzIGEgU29mdC1OTVMgbW9kZSAoYy5mLlxuICogQm9kbGEgZXQgYWwsIGh0dHBzOi8vYXJ4aXYub3JnL2Ficy8xNzA0LjA0NTAzKSB3aGVyZSBib3hlcyByZWR1Y2UgdGhlIHNjb3JlXG4gKiBvZiBvdGhlciBvdmVybGFwcGluZyBib3hlcywgdGhlcmVmb3JlIGZhdm9yaW5nIGRpZmZlcmVudCByZWdpb25zIG9mIHRoZSBpbWFnZVxuICogd2l0aCBoaWdoIHNjb3Jlcy4gVG8gZW5hYmxlIHRoaXMgU29mdC1OTVMgbW9kZSwgc2V0IHRoZSBgc29mdE5tc1NpZ21hYFxuICogcGFyYW1ldGVyIHRvIGJlIGxhcmdlciB0aGFuIDAuXG4gKlxuICogQHBhcmFtIGJveGVzIGEgMmQgdGVuc29yIG9mIHNoYXBlIGBbbnVtQm94ZXMsIDRdYC4gRWFjaCBlbnRyeSBpc1xuICogICAgIGBbeTEsIHgxLCB5MiwgeDJdYCwgd2hlcmUgYCh5MSwgeDEpYCBhbmQgYCh5MiwgeDIpYCBhcmUgdGhlIGNvcm5lcnMgb2ZcbiAqICAgICB0aGUgYm91bmRpbmcgYm94LlxuICogQHBhcmFtIHNjb3JlcyBhIDFkIHRlbnNvciBwcm92aWRpbmcgdGhlIGJveCBzY29yZXMgb2Ygc2hhcGUgYFtudW1Cb3hlc11gLlxuICogQHBhcmFtIG1heE91dHB1dFNpemUgVGhlIG1heGltdW0gbnVtYmVyIG9mIGJveGVzIHRvIGJlIHNlbGVjdGVkLlxuICogQHBhcmFtIGlvdVRocmVzaG9sZCBBIGZsb2F0IHJlcHJlc2VudGluZyB0aGUgdGhyZXNob2xkIGZvciBkZWNpZGluZyB3aGV0aGVyXG4gKiAgICAgYm94ZXMgb3ZlcmxhcCB0b28gbXVjaCB3aXRoIHJlc3BlY3QgdG8gSU9VLiBNdXN0IGJlIGJldHdlZW4gWzAsIDFdLlxuICogICAgIERlZmF1bHRzIHRvIDAuNSAoNTAlIGJveCBvdmVybGFwKS5cbiAqIEBwYXJhbSBzY29yZVRocmVzaG9sZCBBIHRocmVzaG9sZCBmb3IgZGVjaWRpbmcgd2hlbiB0byByZW1vdmUgYm94ZXMgYmFzZWRcbiAqICAgICBvbiBzY29yZS4gRGVmYXVsdHMgdG8gLWluZiwgd2hpY2ggbWVhbnMgYW55IHNjb3JlIGlzIGFjY2VwdGVkLlxuICogQHBhcmFtIHNvZnRObXNTaWdtYSBBIGZsb2F0IHJlcHJlc2VudGluZyB0aGUgc2lnbWEgcGFyYW1ldGVyIGZvciBTb2Z0IE5NUy5cbiAqICAgICBXaGVuIHNpZ21hIGlzIDAsIGl0IGZhbGxzIGJhY2sgdG8gbm9uTWF4U3VwcHJlc3Npb24uXG4gKiBAcmV0dXJuIEEgbWFwIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICogICAgIC0gc2VsZWN0ZWRJbmRpY2VzOiBBIDFEIHRlbnNvciB3aXRoIHRoZSBzZWxlY3RlZCBib3ggaW5kaWNlcy5cbiAqICAgICAtIHNlbGVjdGVkU2NvcmVzOiBBIDFEIHRlbnNvciB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHNjb3JlcyBmb3IgZWFjaFxuICogICAgICAgc2VsZWN0ZWQgYm94LlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0ltYWdlcycsIG5hbWVzcGFjZTogJ2ltYWdlJ31cbiAqL1xuZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25XaXRoU2NvcmVfKGJveGVzLCBzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCA9IDAuNSwgc2NvcmVUaHJlc2hvbGQgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksIHNvZnRObXNTaWdtYSA9IDAuMCkge1xuICAgIGNvbnN0ICRib3hlcyA9IGNvbnZlcnRUb1RlbnNvcihib3hlcywgJ2JveGVzJywgJ25vbk1heFN1cHByZXNzaW9uJyk7XG4gICAgY29uc3QgJHNjb3JlcyA9IGNvbnZlcnRUb1RlbnNvcihzY29yZXMsICdzY29yZXMnLCAnbm9uTWF4U3VwcHJlc3Npb24nKTtcbiAgICBjb25zdCBwYXJhbXMgPSBub25NYXhTdXBwU2FuaXR5Q2hlY2soJGJveGVzLCAkc2NvcmVzLCBtYXhPdXRwdXRTaXplLCBpb3VUaHJlc2hvbGQsIHNjb3JlVGhyZXNob2xkLCBzb2Z0Tm1zU2lnbWEpO1xuICAgIG1heE91dHB1dFNpemUgPSBwYXJhbXMubWF4T3V0cHV0U2l6ZTtcbiAgICBpb3VUaHJlc2hvbGQgPSBwYXJhbXMuaW91VGhyZXNob2xkO1xuICAgIHNjb3JlVGhyZXNob2xkID0gcGFyYW1zLnNjb3JlVGhyZXNob2xkO1xuICAgIHNvZnRObXNTaWdtYSA9IHBhcmFtcy5zb2Z0Tm1zU2lnbWE7XG4gICAgY29uc3QgaW5wdXRzID0geyBib3hlczogJGJveGVzLCBzY29yZXM6ICRzY29yZXMgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCwgc29mdE5tc1NpZ21hIH07XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgIGNvbnN0IHJlc3VsdCA9IEVOR0lORS5ydW5LZXJuZWwoTm9uTWF4U3VwcHJlc3Npb25WNSwgaW5wdXRzLCBhdHRycyk7XG4gICAgcmV0dXJuIHsgc2VsZWN0ZWRJbmRpY2VzOiByZXN1bHRbMF0sIHNlbGVjdGVkU2NvcmVzOiByZXN1bHRbMV0gfTtcbn1cbmV4cG9ydCBjb25zdCBub25NYXhTdXBwcmVzc2lvbldpdGhTY29yZSA9IG9wKHsgbm9uTWF4U3VwcHJlc3Npb25XaXRoU2NvcmVfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bm9uX21heF9zdXBwcmVzc2lvbl93aXRoX3Njb3JlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IG5vbk1heFN1cHByZXNzaW9uVjVJbXBsIH0gZnJvbSAnLi4vLi4vYmFja2VuZHMvbm9uX21heF9zdXBwcmVzc2lvbl9pbXBsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBub25NYXhTdXBwU2FuaXR5Q2hlY2sgfSBmcm9tICcuLi9ub25tYXhfdXRpbCc7XG5pbXBvcnQgeyB0ZW5zb3IxZCB9IGZyb20gJy4uL3RlbnNvcjFkJztcbi8qKlxuICogQXN5bmNocm9ub3VzbHkgcGVyZm9ybXMgbm9uIG1heGltdW0gc3VwcHJlc3Npb24gb2YgYm91bmRpbmcgYm94ZXMgYmFzZWQgb25cbiAqIGlvdSAoaW50ZXJzZWN0aW9uIG92ZXIgdW5pb24pLlxuICpcbiAqIFRoaXMgb3AgYWxzbyBzdXBwb3J0cyBhIFNvZnQtTk1TIG1vZGUgKGMuZi5cbiAqIEJvZGxhIGV0IGFsLCBodHRwczovL2FyeGl2Lm9yZy9hYnMvMTcwNC4wNDUwMykgd2hlcmUgYm94ZXMgcmVkdWNlIHRoZSBzY29yZVxuICogb2Ygb3RoZXIgb3ZlcmxhcHBpbmcgYm94ZXMsIHRoZXJlZm9yZSBmYXZvcmluZyBkaWZmZXJlbnQgcmVnaW9ucyBvZiB0aGUgaW1hZ2VcbiAqIHdpdGggaGlnaCBzY29yZXMuIFRvIGVuYWJsZSB0aGlzIFNvZnQtTk1TIG1vZGUsIHNldCB0aGUgYHNvZnRObXNTaWdtYWBcbiAqIHBhcmFtZXRlciB0byBiZSBsYXJnZXIgdGhhbiAwLlxuICpcbiAqIEBwYXJhbSBib3hlcyBhIDJkIHRlbnNvciBvZiBzaGFwZSBgW251bUJveGVzLCA0XWAuIEVhY2ggZW50cnkgaXNcbiAqICAgICBgW3kxLCB4MSwgeTIsIHgyXWAsIHdoZXJlIGAoeTEsIHgxKWAgYW5kIGAoeTIsIHgyKWAgYXJlIHRoZSBjb3JuZXJzIG9mXG4gKiAgICAgdGhlIGJvdW5kaW5nIGJveC5cbiAqIEBwYXJhbSBzY29yZXMgYSAxZCB0ZW5zb3IgcHJvdmlkaW5nIHRoZSBib3ggc2NvcmVzIG9mIHNoYXBlIGBbbnVtQm94ZXNdYC5cbiAqIEBwYXJhbSBtYXhPdXRwdXRTaXplIFRoZSBtYXhpbXVtIG51bWJlciBvZiBib3hlcyB0byBiZSBzZWxlY3RlZC5cbiAqIEBwYXJhbSBpb3VUaHJlc2hvbGQgQSBmbG9hdCByZXByZXNlbnRpbmcgdGhlIHRocmVzaG9sZCBmb3IgZGVjaWRpbmcgd2hldGhlclxuICogICAgIGJveGVzIG92ZXJsYXAgdG9vIG11Y2ggd2l0aCByZXNwZWN0IHRvIElPVS4gTXVzdCBiZSBiZXR3ZWVuIFswLCAxXS5cbiAqICAgICBEZWZhdWx0cyB0byAwLjUgKDUwJSBib3ggb3ZlcmxhcCkuXG4gKiBAcGFyYW0gc2NvcmVUaHJlc2hvbGQgQSB0aHJlc2hvbGQgZm9yIGRlY2lkaW5nIHdoZW4gdG8gcmVtb3ZlIGJveGVzIGJhc2VkXG4gKiAgICAgb24gc2NvcmUuIERlZmF1bHRzIHRvIC1pbmYsIHdoaWNoIG1lYW5zIGFueSBzY29yZSBpcyBhY2NlcHRlZC5cbiAqIEBwYXJhbSBzb2Z0Tm1zU2lnbWEgQSBmbG9hdCByZXByZXNlbnRpbmcgdGhlIHNpZ21hIHBhcmFtZXRlciBmb3IgU29mdCBOTVMuXG4gKiAgICAgV2hlbiBzaWdtYSBpcyAwLCBpdCBmYWxscyBiYWNrIHRvIG5vbk1heFN1cHByZXNzaW9uLlxuICogQHJldHVybiBBIG1hcCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqICAgICAtIHNlbGVjdGVkSW5kaWNlczogQSAxRCB0ZW5zb3Igd2l0aCB0aGUgc2VsZWN0ZWQgYm94IGluZGljZXMuXG4gKiAgICAgLSBzZWxlY3RlZFNjb3JlczogQSAxRCB0ZW5zb3Igd2l0aCB0aGUgY29ycmVzcG9uZGluZyBzY29yZXMgZm9yIGVhY2hcbiAqICAgICAgIHNlbGVjdGVkIGJveC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdJbWFnZXMnLCBuYW1lc3BhY2U6ICdpbWFnZSd9XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG5vbk1heFN1cHByZXNzaW9uV2l0aFNjb3JlQXN5bmNfKGJveGVzLCBzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCA9IDAuNSwgc2NvcmVUaHJlc2hvbGQgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksIHNvZnRObXNTaWdtYSA9IDAuMCkge1xuICAgIGNvbnN0ICRib3hlcyA9IGNvbnZlcnRUb1RlbnNvcihib3hlcywgJ2JveGVzJywgJ25vbk1heFN1cHByZXNzaW9uQXN5bmMnKTtcbiAgICBjb25zdCAkc2NvcmVzID0gY29udmVydFRvVGVuc29yKHNjb3JlcywgJ3Njb3JlcycsICdub25NYXhTdXBwcmVzc2lvbkFzeW5jJyk7XG4gICAgY29uc3QgcGFyYW1zID0gbm9uTWF4U3VwcFNhbml0eUNoZWNrKCRib3hlcywgJHNjb3JlcywgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCwgc29mdE5tc1NpZ21hKTtcbiAgICBtYXhPdXRwdXRTaXplID0gcGFyYW1zLm1heE91dHB1dFNpemU7XG4gICAgaW91VGhyZXNob2xkID0gcGFyYW1zLmlvdVRocmVzaG9sZDtcbiAgICBzY29yZVRocmVzaG9sZCA9IHBhcmFtcy5zY29yZVRocmVzaG9sZDtcbiAgICBzb2Z0Tm1zU2lnbWEgPSBwYXJhbXMuc29mdE5tc1NpZ21hO1xuICAgIGNvbnN0IGJveGVzQW5kU2NvcmVzID0gYXdhaXQgUHJvbWlzZS5hbGwoWyRib3hlcy5kYXRhKCksICRzY29yZXMuZGF0YSgpXSk7XG4gICAgY29uc3QgYm94ZXNWYWxzID0gYm94ZXNBbmRTY29yZXNbMF07XG4gICAgY29uc3Qgc2NvcmVzVmFscyA9IGJveGVzQW5kU2NvcmVzWzFdO1xuICAgIC8vIFdlIGNhbGwgYSBjcHUgYmFzZWQgaW1wbCBkaXJlY3RseSB3aXRoIHRoZSB0eXBlZGFycmF5IGRhdGEgIGhlcmUgcmF0aGVyXG4gICAgLy8gdGhhbiBhIGtlcm5lbCBiZWNhdXNlIGFsbCBrZXJuZWxzIGFyZSBzeW5jaHJvbm91cyAoYW5kIHRodXMgY2Fubm90IGF3YWl0XG4gICAgLy8gLmRhdGEoKSkuXG4gICAgY29uc3QgeyBzZWxlY3RlZEluZGljZXMsIHNlbGVjdGVkU2NvcmVzIH0gPSBub25NYXhTdXBwcmVzc2lvblY1SW1wbChib3hlc1ZhbHMsIHNjb3Jlc1ZhbHMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsIHNvZnRObXNTaWdtYSk7XG4gICAgaWYgKCRib3hlcyAhPT0gYm94ZXMpIHtcbiAgICAgICAgJGJveGVzLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgaWYgKCRzY29yZXMgIT09IHNjb3Jlcykge1xuICAgICAgICAkc2NvcmVzLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2VsZWN0ZWRJbmRpY2VzOiB0ZW5zb3IxZChzZWxlY3RlZEluZGljZXMsICdpbnQzMicpLFxuICAgICAgICBzZWxlY3RlZFNjb3JlczogdGVuc29yMWQoc2VsZWN0ZWRTY29yZXMpXG4gICAgfTtcbn1cbmV4cG9ydCBjb25zdCBub25NYXhTdXBwcmVzc2lvbldpdGhTY29yZUFzeW5jID0gbm9uTWF4U3VwcHJlc3Npb25XaXRoU2NvcmVBc3luY187XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ub25fbWF4X3N1cHByZXNzaW9uX3dpdGhfc2NvcmVfYXN5bmMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IFJlc2l6ZUJpbGluZWFyIH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4uL3Jlc2hhcGUnO1xuLyoqXG4gKiBCaWxpbmVhciByZXNpemUgYSBzaW5nbGUgM0QgaW1hZ2Ugb3IgYSBiYXRjaCBvZiAzRCBpbWFnZXMgdG8gYSBuZXcgc2hhcGUuXG4gKlxuICogQHBhcmFtIGltYWdlcyBUaGUgaW1hZ2VzLCBvZiByYW5rIDQgb3IgcmFuayAzLCBvZiBzaGFwZVxuICogICAgIGBbYmF0Y2gsIGhlaWdodCwgd2lkdGgsIGluQ2hhbm5lbHNdYC4gSWYgcmFuayAzLCBiYXRjaCBvZiAxIGlzIGFzc3VtZWQuXG4gKiBAcGFyYW0gc2l6ZSBUaGUgbmV3IHNoYXBlIGBbbmV3SGVpZ2h0LCBuZXdXaWR0aF1gIHRvIHJlc2l6ZSB0aGVcbiAqICAgICBpbWFnZXMgdG8uIEVhY2ggY2hhbm5lbCBpcyByZXNpemVkIGluZGl2aWR1YWxseS5cbiAqIEBwYXJhbSBhbGlnbkNvcm5lcnMgRGVmYXVsdHMgdG8gYGZhbHNlYC4gSWYgdHJ1ZSwgcmVzY2FsZVxuICogICAgIGlucHV0IGJ5IGAobmV3X2hlaWdodCAtIDEpIC8gKGhlaWdodCAtIDEpYCwgd2hpY2ggZXhhY3RseSBhbGlnbnMgdGhlIDRcbiAqICAgICBjb3JuZXJzIG9mIGltYWdlcyBhbmQgcmVzaXplZCBpbWFnZXMuIElmIGZhbHNlLCByZXNjYWxlIGJ5XG4gKiAgICAgYG5ld19oZWlnaHQgLyBoZWlnaHRgLiBUcmVhdCBzaW1pbGFybHkgdGhlIHdpZHRoIGRpbWVuc2lvbi5cbiAqIEBwYXJhbSBoYWxmUGl4ZWxDZW50ZXJzIERlZmF1bHRzIHRvIGBmYWxzZWAuIFdoZXRoZXIgdG8gYXNzdW1lIHBpeGVsIGNlbnRlcnNcbiAqICAgICBhcmUgYXQgMC41LCB3aGljaCB3b3VsZCBtYWtlIHRoZSBmbG9hdGluZyBwb2ludCBjb29yZGluYXRlcyBvZiB0aGUgdG9wXG4gKiAgICAgbGVmdCBwaXhlbCAwLjUsIDAuNS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdJbWFnZXMnLCBuYW1lc3BhY2U6ICdpbWFnZSd9XG4gKi9cbmZ1bmN0aW9uIHJlc2l6ZUJpbGluZWFyXyhpbWFnZXMsIHNpemUsIGFsaWduQ29ybmVycyA9IGZhbHNlLCBoYWxmUGl4ZWxDZW50ZXJzID0gZmFsc2UpIHtcbiAgICBjb25zdCAkaW1hZ2VzID0gY29udmVydFRvVGVuc29yKGltYWdlcywgJ2ltYWdlcycsICdyZXNpemVCaWxpbmVhcicpO1xuICAgIHV0aWwuYXNzZXJ0KCRpbWFnZXMucmFuayA9PT0gMyB8fCAkaW1hZ2VzLnJhbmsgPT09IDQsICgpID0+IGBFcnJvciBpbiByZXNpemVCaWxpbmVhcjogeCBtdXN0IGJlIHJhbmsgMyBvciA0LCBidXQgZ290IGAgK1xuICAgICAgICBgcmFuayAkeyRpbWFnZXMucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoc2l6ZS5sZW5ndGggPT09IDIsICgpID0+IGBFcnJvciBpbiByZXNpemVCaWxpbmVhcjogbmV3IHNoYXBlIG11c3QgMkQsIGJ1dCBnb3Qgc2hhcGUgYCArXG4gICAgICAgIGAke3NpemV9LmApO1xuICAgIHV0aWwuYXNzZXJ0KGhhbGZQaXhlbENlbnRlcnMgPT09IGZhbHNlIHx8IGFsaWduQ29ybmVycyA9PT0gZmFsc2UsICgpID0+IGBFcnJvciBpbiByZXNpemVCaWxpbmVhcjogSWYgaGFsZlBpeGVsQ2VudGVycyBpcyB0cnVlLCBgICtcbiAgICAgICAgYGFsaWduQ29ybmVycyBtdXN0IGJlIGZhbHNlLmApO1xuICAgIGxldCBiYXRjaEltYWdlcyA9ICRpbWFnZXM7XG4gICAgbGV0IHJlc2hhcGVkVG80RCA9IGZhbHNlO1xuICAgIGlmICgkaW1hZ2VzLnJhbmsgPT09IDMpIHtcbiAgICAgICAgcmVzaGFwZWRUbzREID0gdHJ1ZTtcbiAgICAgICAgYmF0Y2hJbWFnZXMgPSByZXNoYXBlKCRpbWFnZXMsIFsxLCAkaW1hZ2VzLnNoYXBlWzBdLCAkaW1hZ2VzLnNoYXBlWzFdLCAkaW1hZ2VzLnNoYXBlWzJdXSk7XG4gICAgfVxuICAgIGNvbnN0IFtdID0gc2l6ZTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGltYWdlczogYmF0Y2hJbWFnZXMgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgYWxpZ25Db3JuZXJzLCBoYWxmUGl4ZWxDZW50ZXJzLCBzaXplIH07XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgIGNvbnN0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoUmVzaXplQmlsaW5lYXIsIGlucHV0cywgYXR0cnMpO1xuICAgIGlmIChyZXNoYXBlZFRvNEQpIHtcbiAgICAgICAgcmV0dXJuIHJlc2hhcGUocmVzLCBbcmVzLnNoYXBlWzFdLCByZXMuc2hhcGVbMl0sIHJlcy5zaGFwZVszXV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IHJlc2l6ZUJpbGluZWFyID0gb3AoeyByZXNpemVCaWxpbmVhcl8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZXNpemVfYmlsaW5lYXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IFJlc2l6ZU5lYXJlc3ROZWlnaGJvciB9IGZyb20gJy4uLy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuLi9yZXNoYXBlJztcbi8qKlxuICogTmVhcmVzdE5laWdoYm9yIHJlc2l6ZSBhIGJhdGNoIG9mIDNEIGltYWdlcyB0byBhIG5ldyBzaGFwZS5cbiAqXG4gKiBAcGFyYW0gaW1hZ2VzIFRoZSBpbWFnZXMsIG9mIHJhbmsgNCBvciByYW5rIDMsIG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgaW5DaGFubmVsc11gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBzaXplIFRoZSBuZXcgc2hhcGUgYFtuZXdIZWlnaHQsIG5ld1dpZHRoXWAgdG8gcmVzaXplIHRoZVxuICogICAgIGltYWdlcyB0by4gRWFjaCBjaGFubmVsIGlzIHJlc2l6ZWQgaW5kaXZpZHVhbGx5LlxuICogQHBhcmFtIGFsaWduQ29ybmVycyBEZWZhdWx0cyB0byBGYWxzZS4gSWYgdHJ1ZSwgcmVzY2FsZVxuICogICAgIGlucHV0IGJ5IGAobmV3X2hlaWdodCAtIDEpIC8gKGhlaWdodCAtIDEpYCwgd2hpY2ggZXhhY3RseSBhbGlnbnMgdGhlIDRcbiAqICAgICBjb3JuZXJzIG9mIGltYWdlcyBhbmQgcmVzaXplZCBpbWFnZXMuIElmIGZhbHNlLCByZXNjYWxlIGJ5XG4gKiAgICAgYG5ld19oZWlnaHQgLyBoZWlnaHRgLiBUcmVhdCBzaW1pbGFybHkgdGhlIHdpZHRoIGRpbWVuc2lvbi5cbiAqIEBwYXJhbSBoYWxmUGl4ZWxDZW50ZXJzIERlZmF1bHRzIHRvIGBmYWxzZWAuIFdoZXRoZXIgdG8gYXNzdW1lcyBwaXhlbHMgYXJlIG9mXG4gKiAgICAgIGhhbGYgdGhlIGFjdHVhbCBkaW1lbnNpb25zLCBhbmQgeWllbGRzIG1vcmUgYWNjdXJhdGUgcmVzaXplcy4gVGhpcyBmbGFnXG4gKiAgICAgIHdvdWxkIGFsc28gbWFrZSB0aGUgZmxvYXRpbmcgcG9pbnQgY29vcmRpbmF0ZXMgb2YgdGhlIHRvcCBsZWZ0IHBpeGVsXG4gKiAgICAgIDAuNSwgMC41LlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0ltYWdlcycsIG5hbWVzcGFjZTogJ2ltYWdlJ31cbiAqL1xuZnVuY3Rpb24gcmVzaXplTmVhcmVzdE5laWdoYm9yXyhpbWFnZXMsIHNpemUsIGFsaWduQ29ybmVycyA9IGZhbHNlLCBoYWxmUGl4ZWxDZW50ZXJzID0gZmFsc2UpIHtcbiAgICBjb25zdCAkaW1hZ2VzID0gY29udmVydFRvVGVuc29yKGltYWdlcywgJ2ltYWdlcycsICdyZXNpemVOZWFyZXN0TmVpZ2hib3InKTtcbiAgICB1dGlsLmFzc2VydCgkaW1hZ2VzLnJhbmsgPT09IDMgfHwgJGltYWdlcy5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gcmVzaXplTmVhcmVzdE5laWdoYm9yOiB4IG11c3QgYmUgcmFuayAzIG9yIDQsIGJ1dCBnb3QgYCArXG4gICAgICAgIGByYW5rICR7JGltYWdlcy5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydChzaXplLmxlbmd0aCA9PT0gMiwgKCkgPT4gYEVycm9yIGluIHJlc2l6ZU5lYXJlc3ROZWlnaGJvcjogbmV3IHNoYXBlIG11c3QgMkQsIGJ1dCBnb3Qgc2hhcGUgYCArXG4gICAgICAgIGAke3NpemV9LmApO1xuICAgIHV0aWwuYXNzZXJ0KCRpbWFnZXMuZHR5cGUgPT09ICdmbG9hdDMyJyB8fCAkaW1hZ2VzLmR0eXBlID09PSAnaW50MzInLCAoKSA9PiAnYGltYWdlc2AgbXVzdCBoYXZlIGBpbnQzMmAgb3IgYGZsb2F0MzJgIGFzIGR0eXBlJyk7XG4gICAgdXRpbC5hc3NlcnQoaGFsZlBpeGVsQ2VudGVycyA9PT0gZmFsc2UgfHwgYWxpZ25Db3JuZXJzID09PSBmYWxzZSwgKCkgPT4gYEVycm9yIGluIHJlc2l6ZU5lYXJlc3ROZWlnaGJvcjogSWYgaGFsZlBpeGVsQ2VudGVycyBpcyB0cnVlLCBgICtcbiAgICAgICAgYGFsaWduQ29ybmVycyBtdXN0IGJlIGZhbHNlLmApO1xuICAgIGxldCBiYXRjaEltYWdlcyA9ICRpbWFnZXM7XG4gICAgbGV0IHJlc2hhcGVkVG80RCA9IGZhbHNlO1xuICAgIGlmICgkaW1hZ2VzLnJhbmsgPT09IDMpIHtcbiAgICAgICAgcmVzaGFwZWRUbzREID0gdHJ1ZTtcbiAgICAgICAgYmF0Y2hJbWFnZXMgPSByZXNoYXBlKCRpbWFnZXMsIFsxLCAkaW1hZ2VzLnNoYXBlWzBdLCAkaW1hZ2VzLnNoYXBlWzFdLCAkaW1hZ2VzLnNoYXBlWzJdXSk7XG4gICAgfVxuICAgIGNvbnN0IFtdID0gc2l6ZTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGltYWdlczogYmF0Y2hJbWFnZXMgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgYWxpZ25Db3JuZXJzLCBoYWxmUGl4ZWxDZW50ZXJzLCBzaXplIH07XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgIGNvbnN0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoUmVzaXplTmVhcmVzdE5laWdoYm9yLCBpbnB1dHMsIGF0dHJzKTtcbiAgICBpZiAocmVzaGFwZWRUbzREKSB7XG4gICAgICAgIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydCBjb25zdCByZXNpemVOZWFyZXN0TmVpZ2hib3IgPSBvcCh7IHJlc2l6ZU5lYXJlc3ROZWlnaGJvcl8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZXNpemVfbmVhcmVzdF9uZWlnaGJvci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgUm90YXRlV2l0aE9mZnNldCB9IGZyb20gJy4uLy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbi8qKlxuICogUm90YXRlcyB0aGUgaW5wdXQgaW1hZ2UgdGVuc29yIGNvdW50ZXItY2xvY2t3aXNlIHdpdGggYW4gb3B0aW9uYWwgb2Zmc2V0XG4gKiBjZW50ZXIgb2Ygcm90YXRpb24uIEN1cnJlbnRseSBhdmFpbGFibGUgaW4gdGhlIENQVSwgV2ViR0wsIGFuZCBXQVNNIGJhY2tlbmRzLlxuICpcbiAqIEBwYXJhbSBpbWFnZSA0ZCB0ZW5zb3Igb2Ygc2hhcGUgYFtiYXRjaCwgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIGRlcHRoXWAuXG4gKiBAcGFyYW0gcmFkaWFucyBUaGUgYW1vdW50IG9mIHJvdGF0aW9uLlxuICogQHBhcmFtIGZpbGxWYWx1ZSBUaGUgdmFsdWUgdG8gZmlsbCBpbiB0aGUgZW1wdHkgc3BhY2UgbGVmdG92ZXJcbiAqICAgICBhZnRlciByb3RhdGlvbi4gQ2FuIGJlIGVpdGhlciBhIHNpbmdsZSBncmF5c2NhbGUgdmFsdWUgKDAtMjU1KSwgb3IgYW5cbiAqICAgICBhcnJheSBvZiB0aHJlZSBudW1iZXJzIGBbcmVkLCBncmVlbiwgYmx1ZV1gIHNwZWNpZnlpbmcgdGhlIHJlZCwgZ3JlZW4sXG4gKiAgICAgYW5kIGJsdWUgY2hhbm5lbHMuIERlZmF1bHRzIHRvIGAwYCAoYmxhY2spLlxuICogQHBhcmFtIGNlbnRlciBUaGUgY2VudGVyIG9mIHJvdGF0aW9uLiBDYW4gYmUgZWl0aGVyIGEgc2luZ2xlIHZhbHVlICgwLTEpLCBvclxuICogICAgIGFuIGFycmF5IG9mIHR3byBudW1iZXJzIGBbY2VudGVyWCwgY2VudGVyWV1gLiBEZWZhdWx0cyB0byBgMC41YCAocm90YXRlc1xuICogICAgIHRoZSBpbWFnZSBhcm91bmQgaXRzIGNlbnRlcikuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnSW1hZ2VzJywgbmFtZXNwYWNlOiAnaW1hZ2UnfVxuICovXG5mdW5jdGlvbiByb3RhdGVXaXRoT2Zmc2V0XyhpbWFnZSwgcmFkaWFucywgZmlsbFZhbHVlID0gMCwgY2VudGVyID0gMC41KSB7XG4gICAgY29uc3QgJGltYWdlID0gY29udmVydFRvVGVuc29yKGltYWdlLCAnaW1hZ2UnLCAncm90YXRlV2l0aE9mZnNldCcsICdmbG9hdDMyJyk7XG4gICAgdXRpbC5hc3NlcnQoJGltYWdlLnJhbmsgPT09IDQsICgpID0+ICdFcnJvciBpbiByb3RhdGVXaXRoT2Zmc2V0OiBpbWFnZSBtdXN0IGJlIHJhbmsgNCwnICtcbiAgICAgICAgYGJ1dCBnb3QgcmFuayAkeyRpbWFnZS5yYW5rfS5gKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGltYWdlOiAkaW1hZ2UgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgcmFkaWFucywgZmlsbFZhbHVlLCBjZW50ZXIgfTtcbiAgICBjb25zdCByZXMgPSBFTkdJTkUucnVuS2VybmVsKFJvdGF0ZVdpdGhPZmZzZXQsIGlucHV0cywgYXR0cnMpO1xuICAgIHJldHVybiByZXM7XG59XG5leHBvcnQgY29uc3Qgcm90YXRlV2l0aE9mZnNldCA9IG9wKHsgcm90YXRlV2l0aE9mZnNldF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yb3RhdGVfd2l0aF9vZmZzZXQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IHRlbnNvcjFkIH0gZnJvbSAnLi4vdGVuc29yMWQnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgY2FzdCB9IGZyb20gJy4uL2Nhc3QnO1xuaW1wb3J0IHsgc3BsaXQgfSBmcm9tICcuLi9zcGxpdCc7XG5pbXBvcnQgeyBiaW5jb3VudCB9IGZyb20gJy4uL2JpbmNvdW50JztcbmltcG9ydCB7IGxlc3NFcXVhbCB9IGZyb20gJy4uL2xlc3NfZXF1YWwnO1xuaW1wb3J0IHsgZ3JlYXRlciB9IGZyb20gJy4uL2dyZWF0ZXInO1xuaW1wb3J0IHsgc3VtIH0gZnJvbSAnLi4vc3VtJztcbmltcG9ydCB7IGFkZCB9IGZyb20gJy4uL2FkZCc7XG5pbXBvcnQgeyBtdWwgfSBmcm9tICcuLi9tdWwnO1xuaW1wb3J0IHsgZGl2IH0gZnJvbSAnLi4vZGl2JztcbmltcG9ydCB7IHN1YiB9IGZyb20gJy4uL3N1Yic7XG5pbXBvcnQgeyByb3VuZCB9IGZyb20gJy4uL3JvdW5kJztcbmltcG9ydCB7IHdoZXJlIH0gZnJvbSAnLi4vd2hlcmUnO1xuaW1wb3J0IHsgZmlsbCB9IGZyb20gJy4uL2ZpbGwnO1xuaW1wb3J0IHsgc2xpY2UgfSBmcm9tICcuLi9zbGljZSc7XG5pbXBvcnQgeyByYW5nZSB9IGZyb20gJy4uL3JhbmdlJztcbmltcG9ydCB7IHRlbnNvciB9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52Jztcbi8qKlxuICogUGVyZm9ybXMgaW1hZ2UgYmluYXJpemF0aW9uIHdpdGggY29ycmVzcG9uZGluZyB0aHJlc2hvbGRcbiAqIChkZXBlbmRzIG9uIHRoZSBtZXRob2QpdmFsdWUsIHdoaWNoIGNyZWF0ZXMgYSBiaW5hcnkgaW1hZ2UgZnJvbSBhIGdyYXlzY2FsZS5cbiAqIEBwYXJhbSBpbWFnZSAzZCB0ZW5zb3Igb2Ygc2hhcGUgW2ltYWdlSGVpZ2h0LGltYWdlV2lkdGgsIGRlcHRoXSxcbiAqIHdoZXJlIGltYWdlSGVpZ2h0IGFuZCBpbWFnZVdpZHRoIG11c3QgYmUgcG9zaXRpdmUuVGhlIGltYWdlIGNvbG9yXG4gKiByYW5nZSBzaG91bGQgYmUgWzAsIDI1NV0uXG4gKiBAcGFyYW0gbWV0aG9kIE9wdGlvbmFsIHN0cmluZyBmcm9tIGAnYmluYXJ5JyB8ICdvdHN1J2BcbiAqIHdoaWNoIHNwZWNpZmllcyB0aGUgbWV0aG9kIGZvciB0aHJlc2hvbGRpbmcuIERlZmF1bHRzIHRvICdiaW5hcnknLlxuICogQHBhcmFtIGludmVydGVkIE9wdGlvbmFsIGJvb2xlYW4gd2hpY2hzcGVjaWZpZXNcbiAqIGlmIGNvbG91cnMgc2hvdWxkIGJlIGludmVydGVkLiBEZWZhdWx0cyB0byBmYWxzZS5cbiAqIEBwYXJhbSB0aHJlc2hWYWx1ZSBPcHRpb25hbCBudW1iZXIgd2hpY2ggZGVmaW5lcyB0aHJlc2hvbGQgdmFsdWUgZnJvbSAwIHRvIDEuXG4gKiBEZWZhdWx0cyB0byAwLjUuXG4gKiBAcmV0dXJuIEEgM2QgdGVuc29yIG9mIHNoYXBlIFtpbWFnZUhlaWdodCxpbWFnZVdpZHRoLCBkZXB0aF0sIHdoaWNoXG4gKiBjb250YWlucyBiaW5hcml6ZWQgaW1hZ2UuXG4gKi9cbmZ1bmN0aW9uIHRocmVzaG9sZF8oaW1hZ2UsIG1ldGhvZCA9ICdiaW5hcnknLCBpbnZlcnRlZCA9IGZhbHNlLCB0aHJlc2hWYWx1ZSA9IDAuNSkge1xuICAgIGNvbnN0ICRpbWFnZSA9IGNvbnZlcnRUb1RlbnNvcihpbWFnZSwgJ2ltYWdlJywgJ3RocmVzaG9sZCcpO1xuICAgIC8qIDAuMjk4OSwgMC41ODcwLCAwLjExNDAgYXJlIHJlcHJlc2VudCBsdW1hIGNvZWZmaWNpZW50cyBpbiBDQ0lSNjAxLlxuICAgIFJlZmVyZW5jZSBmb3IgY29udmVydGluZyBiZXR3ZWVuIFJHQiBhbmQgZ3JheXNjYWxlOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MdW1hXyUyOHZpZGVvJTI5ICAqL1xuICAgIGNvbnN0IFJFRF9JTlRFTkNJVFlfQ09FRiA9IDAuMjk4OTtcbiAgICBjb25zdCBHUkVFTl9JTlRFTkNJVFlfQ09FRiA9IDAuNTg3MDtcbiAgICBjb25zdCBCTFVFX0lOVEVOQ0lUWV9DT0VGID0gMC4xMTQwO1xuICAgIGNvbnN0IHRvdGFsUGl4ZWxzSW5JbWFnZSA9ICRpbWFnZS5zaGFwZVswXSAqICRpbWFnZS5zaGFwZVsxXTtcbiAgICBsZXQgJHRocmVzaG9sZCA9IG11bCh0ZW5zb3IxZChbdGhyZXNoVmFsdWVdKSwgMjU1KTtcbiAgICBsZXQgciwgZywgYiwgZ3JheXNjYWxlO1xuICAgIHV0aWwuYXNzZXJ0KCRpbWFnZS5yYW5rID09PSAzLCAoKSA9PiAnRXJyb3IgaW4gdGhyZXNob2xkOiBpbWFnZSBtdXN0IGJlIHJhbmsgMywnICtcbiAgICAgICAgYGJ1dCBnb3QgcmFuayAkeyRpbWFnZS5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydCgkaW1hZ2Uuc2hhcGVbMl0gPT09IDMgfHwgJGltYWdlLnNoYXBlWzJdID09PSAxLCAoKSA9PiAnRXJyb3IgaW4gdGhyZXNob2xkOiAnICtcbiAgICAgICAgJ2ltYWdlIGNvbG9yIGNoYW5uZWwgbXVzdCBiZSBlcXVhbCB0byAzIG9yIDEnICtcbiAgICAgICAgYGJ1dCBnb3QgJHskaW1hZ2Uuc2hhcGVbMl19LmApO1xuICAgIHV0aWwuYXNzZXJ0KCRpbWFnZS5kdHlwZSA9PT0gJ2ludDMyJyB8fCAkaW1hZ2UuZHR5cGUgPT09ICdmbG9hdDMyJywgKCkgPT4gJ0Vycm9yIGluIGR0eXBlOiBpbWFnZSBkdHlwZSBtdXN0IGJlIGludDMyIG9yIGZsb2F0MzIsJyArXG4gICAgICAgIGBidXQgZ290IGR0eXBlICR7JGltYWdlLmR0eXBlfS5gKTtcbiAgICB1dGlsLmFzc2VydChtZXRob2QgPT09ICdvdHN1JyB8fCBtZXRob2QgPT09ICdiaW5hcnknLCAoKSA9PiBgTWV0aG9kIG11c3QgYmUgYmluYXJ5IG9yIG90c3UsIGJ1dCB3YXMgJHttZXRob2R9YCk7XG4gICAgaWYgKCRpbWFnZS5zaGFwZVsyXSA9PT0gMykge1xuICAgICAgICBbciwgZywgYl0gPSBzcGxpdCgkaW1hZ2UsIFsxLCAxLCAxXSwgLTEpO1xuICAgICAgICBjb25zdCAkciA9IG11bChyLCBSRURfSU5URU5DSVRZX0NPRUYpO1xuICAgICAgICBjb25zdCAkZyA9IG11bChnLCBHUkVFTl9JTlRFTkNJVFlfQ09FRik7XG4gICAgICAgIGNvbnN0ICRiID0gbXVsKGIsIEJMVUVfSU5URU5DSVRZX0NPRUYpO1xuICAgICAgICBncmF5c2NhbGUgPSBhZGQoYWRkKCRyLCAkZyksICRiKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGdyYXlzY2FsZSA9IGltYWdlO1xuICAgIH1cbiAgICBpZiAobWV0aG9kID09PSAnb3RzdScpIHtcbiAgICAgICAgY29uc3QgJGhpc3RvZ3JhbSA9IGJpbmNvdW50KGNhc3Qocm91bmQoZ3JheXNjYWxlKSwgJ2ludDMyJyksIHRlbnNvcihbXSksIDI1Nik7XG4gICAgICAgICR0aHJlc2hvbGQgPSBvdHN1KCRoaXN0b2dyYW0sIHRvdGFsUGl4ZWxzSW5JbWFnZSk7XG4gICAgfVxuICAgIGNvbnN0IGludkNvbmRpdGlvbiA9IGludmVydGVkID9cbiAgICAgICAgbGVzc0VxdWFsKGdyYXlzY2FsZSwgJHRocmVzaG9sZCkgOiBncmVhdGVyKGdyYXlzY2FsZSwgJHRocmVzaG9sZCk7XG4gICAgY29uc3QgcmVzdWx0ID0gY2FzdChtdWwoaW52Q29uZGl0aW9uLCAyNTUpLCAnaW50MzInKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gb3RzdShoaXN0b2dyYW0sIHRvdGFsKSB7XG4gICAgbGV0IGJlc3RUaHJlc2ggPSB0ZW5zb3IxZChbLTFdKTtcbiAgICBsZXQgYmVzdEluQmV0VmFyID0gdGVuc29yMWQoWzBdKTtcbiAgICBsZXQgY0luQmV0VmFyID0gdGVuc29yMWQoWzBdKTtcbiAgICBsZXQgY2xhc3NGaXJzdCwgY2xhc3NTZWNvbmQsIG1lYW5GaXJzdCwgbWVhblNlYywgd2VpZ2h0Rm9yZWdyb3VuZCwgd2VpZ2h0QmFjaztcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgaGlzdG9ncmFtLnNpemUgLSAxOyBpbmRleCsrKSB7XG4gICAgICAgIGNsYXNzRmlyc3QgPSBzbGljZShoaXN0b2dyYW0sIDAsIGluZGV4ICsgMSk7XG4gICAgICAgIGNsYXNzU2Vjb25kID0gc2xpY2UoaGlzdG9ncmFtLCBpbmRleCArIDEpO1xuICAgICAgICB3ZWlnaHRGb3JlZ3JvdW5kID0gZGl2KHN1bShjbGFzc0ZpcnN0KSwgdG90YWwpO1xuICAgICAgICB3ZWlnaHRCYWNrID0gZGl2KHN1bShjbGFzc1NlY29uZCksIHRvdGFsKTtcbiAgICAgICAgY29uc3QgbWVhbkZpcnN0RGl2QSA9IHN1bShtdWwoY2xhc3NGaXJzdCwgcmFuZ2UoMCwgY2xhc3NGaXJzdC5zaXplKSkpO1xuICAgICAgICBtZWFuRmlyc3QgPSBkaXYobWVhbkZpcnN0RGl2QSwgc3VtKGNsYXNzRmlyc3QpKTtcbiAgICAgICAgY29uc3QgbWVhblNlY0ZpbGwgPSBmaWxsKGNsYXNzU2Vjb25kLnNoYXBlLCBjbGFzc0ZpcnN0LnNpemUpO1xuICAgICAgICBjb25zdCBtZWFuU2VjQWRkID0gYWRkKHJhbmdlKDAsIGNsYXNzU2Vjb25kLnNpemUpLCBtZWFuU2VjRmlsbCk7XG4gICAgICAgIGNvbnN0IG1lYW5TZWNNdWwgPSBtdWwoY2xhc3NTZWNvbmQsIChtZWFuU2VjQWRkKSk7XG4gICAgICAgIG1lYW5TZWMgPSBkaXYoc3VtKG1lYW5TZWNNdWwpLCBzdW0oY2xhc3NTZWNvbmQpKTtcbiAgICAgICAgY29uc3QgY0luQmV0VmFyU3ViQSA9IHN1YihtZWFuRmlyc3QsIG1lYW5TZWMpO1xuICAgICAgICBjb25zdCBjSW5CZXRWYXJTdWJCID0gc3ViKG1lYW5GaXJzdCwgbWVhblNlYyk7XG4gICAgICAgIGNvbnN0IGNJbkJldFZhck11bCA9IG11bCh3ZWlnaHRGb3JlZ3JvdW5kLCB3ZWlnaHRCYWNrKTtcbiAgICAgICAgY0luQmV0VmFyID0gbXVsKG11bChjSW5CZXRWYXJNdWwsIGNJbkJldFZhclN1YkEpLCBjSW5CZXRWYXJTdWJCKTtcbiAgICAgICAgY29uc3QgY29uZGl0aW9uID0gZ3JlYXRlcihjSW5CZXRWYXIsIGJlc3RJbkJldFZhcik7XG4gICAgICAgIGJlc3RJbkJldFZhciA9IHdoZXJlKGNvbmRpdGlvbiwgY0luQmV0VmFyLCBiZXN0SW5CZXRWYXIpO1xuICAgICAgICBiZXN0VGhyZXNoID0gd2hlcmUoY29uZGl0aW9uLCB0ZW5zb3IxZChbaW5kZXhdKSwgYmVzdFRocmVzaCk7XG4gICAgfVxuICAgIHJldHVybiBiZXN0VGhyZXNoO1xufVxuZXhwb3J0IGNvbnN0IHRocmVzaG9sZCA9IG9wKHsgdGhyZXNob2xkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRocmVzaG9sZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgVHJhbnNmb3JtIH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBBcHBsaWVzIHRoZSBnaXZlbiB0cmFuc2Zvcm0ocykgdG8gdGhlIGltYWdlKHMpLlxuICpcbiAqIEBwYXJhbSBpbWFnZSA0ZCB0ZW5zb3Igb2Ygc2hhcGUgYFtiYXRjaCwgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIGRlcHRoXWAuXG4gKiBAcGFyYW0gdHJhbnNmb3JtcyBQcm9qZWN0aXZlIHRyYW5zZm9ybSBtYXRyaXgvbWF0cmljZXMuIEEgdGVuc29yMWQgb2YgbGVuZ3RoXG4gKiAgICAgOCBvciB0ZW5zb3Igb2Ygc2l6ZSBOIHggOC4gSWYgb25lIHJvdyBvZiB0cmFuc2Zvcm1zIGlzIFthMCwgYTEsIGEyLCBiMFxuICogICAgIGIxLCBiMiwgYzAsIGMxXSwgdGhlbiBpdCBtYXBzIHRoZSBvdXRwdXQgcG9pbnQgKHgsIHkpIHRvIGEgdHJhbnNmb3JtZWRcbiAqICAgICBpbnB1dCBwb2ludCAoeCcsIHknKSA9ICgoYTAgeCArIGExIHkgKyBhMikgLyBrLCAoYjAgeCArIGIxIHkgKyBiMikgLyBrKSxcbiAqICAgICB3aGVyZSBrID0gYzAgeCArIGMxIHkgKyAxLiBUaGUgdHJhbnNmb3JtcyBhcmUgaW52ZXJ0ZWQgY29tcGFyZWQgdG8gdGhlXG4gKiAgICAgdHJhbnNmb3JtIG1hcHBpbmcgaW5wdXQgcG9pbnRzIHRvIG91dHB1dCBwb2ludHMuXG4gKiBAcGFyYW0gaW50ZXJwb2xhdGlvbiBJbnRlcnBvbGF0aW9uIG1vZGUuXG4gKiAgICAgU3VwcG9ydGVkIHZhbHVlczogJ25lYXJlc3QnLCAnYmlsaW5lYXInLiBEZWZhdWx0IHRvICduZWFyZXN0Jy5cbiAqIEBwYXJhbSBmaWxsTW9kZSBQb2ludHMgb3V0c2lkZSB0aGUgYm91bmRhcmllcyBvZiB0aGUgaW5wdXQgYXJlIGZpbGxlZFxuICogICAgIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gbW9kZSwgb25lIG9mICdjb25zdGFudCcsICdyZWZsZWN0JywgJ3dyYXAnLFxuICogICAgICduZWFyZXN0Jy4gRGVmYXVsdCB0byAnY29uc3RhbnQnLlxuICogICAgICdyZWZsZWN0JzogKGQgYyBiIGEgfCBhIGIgYyBkIHwgZCBjIGIgYSApIFRoZSBpbnB1dCBpcyBleHRlbmRlZCBieVxuICogICAgIHJlZmxlY3RpbmcgYWJvdXQgdGhlIGVkZ2Ugb2YgdGhlIGxhc3QgcGl4ZWwuXG4gKiAgICAgJ2NvbnN0YW50JzogKGsgayBrIGsgfCBhIGIgYyBkIHwgayBrIGsgaykgVGhlIGlucHV0IGlzIGV4dGVuZGVkIGJ5XG4gKiAgICAgZmlsbGluZyBhbGwgdmFsdWVzIGJleW9uZCB0aGUgZWRnZSB3aXRoIHRoZSBzYW1lIGNvbnN0YW50IHZhbHVlIGsuXG4gKiAgICAgJ3dyYXAnOiAoYSBiIGMgZCB8IGEgYiBjIGQgfCBhIGIgYyBkKSBUaGUgaW5wdXQgaXMgZXh0ZW5kZWQgYnlcbiAqICAgICB3cmFwcGluZyBhcm91bmQgdG8gdGhlIG9wcG9zaXRlIGVkZ2UuXG4gKiAgICAgJ25lYXJlc3QnOiAoYSBhIGEgYSB8IGEgYiBjIGQgfCBkIGQgZCBkKSBUaGUgaW5wdXQgaXMgZXh0ZW5kZWQgYnlcbiAqICAgICB0aGUgbmVhcmVzdCBwaXhlbC5cbiAqIEBwYXJhbSBmaWxsVmFsdWUgQSBmbG9hdCByZXByZXNlbnRzIHRoZSB2YWx1ZSB0byBiZSBmaWxsZWQgb3V0c2lkZSB0aGVcbiAqICAgICBib3VuZGFyaWVzIHdoZW4gZmlsbE1vZGUgaXMgJ2NvbnN0YW50Jy5cbiAqIEBwYXJhbSBPdXRwdXQgZGltZW5zaW9uIGFmdGVyIHRoZSB0cmFuc2Zvcm0sIFtoZWlnaHQsIHdpZHRoXS4gSWYgdW5kZWZpbmVkLFxuICogICAgIG91dHB1dCBpcyB0aGUgc2FtZSBzaXplIGFzIGlucHV0IGltYWdlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0ltYWdlcycsIG5hbWVzcGFjZTogJ2ltYWdlJ31cbiAqL1xuZnVuY3Rpb24gdHJhbnNmb3JtXyhpbWFnZSwgdHJhbnNmb3JtcywgaW50ZXJwb2xhdGlvbiA9ICduZWFyZXN0JywgZmlsbE1vZGUgPSAnY29uc3RhbnQnLCBmaWxsVmFsdWUgPSAwLCBvdXRwdXRTaGFwZSkge1xuICAgIGNvbnN0ICRpbWFnZSA9IGNvbnZlcnRUb1RlbnNvcihpbWFnZSwgJ2ltYWdlJywgJ3RyYW5zZm9ybScsICdmbG9hdDMyJyk7XG4gICAgY29uc3QgJHRyYW5zZm9ybXMgPSBjb252ZXJ0VG9UZW5zb3IodHJhbnNmb3JtcywgJ3RyYW5zZm9ybXMnLCAndHJhbnNmb3JtJywgJ2Zsb2F0MzInKTtcbiAgICB1dGlsLmFzc2VydCgkaW1hZ2UucmFuayA9PT0gNCwgKCkgPT4gJ0Vycm9yIGluIHRyYW5zZm9ybTogaW1hZ2UgbXVzdCBiZSByYW5rIDQsJyArXG4gICAgICAgIGBidXQgZ290IHJhbmsgJHskaW1hZ2UucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoJHRyYW5zZm9ybXMucmFuayA9PT0gMiAmJlxuICAgICAgICAoJHRyYW5zZm9ybXMuc2hhcGVbMF0gPT09ICRpbWFnZS5zaGFwZVswXSB8fFxuICAgICAgICAgICAgJHRyYW5zZm9ybXMuc2hhcGVbMF0gPT09IDEpICYmXG4gICAgICAgICR0cmFuc2Zvcm1zLnNoYXBlWzFdID09PSA4LCAoKSA9PiBgRXJyb3IgaW4gdHJhbnNmb3JtOiBJbnB1dCB0cmFuc2Zvcm0gc2hvdWxkIGJlIGJhdGNoIHggOCBvciAxIHggOGApO1xuICAgIHV0aWwuYXNzZXJ0KG91dHB1dFNoYXBlID09IG51bGwgfHwgb3V0cHV0U2hhcGUubGVuZ3RoID09PSAyLCAoKSA9PiAnRXJyb3IgaW4gdHJhbnNmb3JtOiBvdXRwdXRTaGFwZSBtdXN0IGJlIFtoZWlnaHQsIHdpZHRoXSBvciBudWxsLCAnICtcbiAgICAgICAgYGJ1dCBnb3QgJHtvdXRwdXRTaGFwZX0uYCk7XG4gICAgY29uc3QgaW5wdXRzID0geyBpbWFnZTogJGltYWdlLCB0cmFuc2Zvcm1zOiAkdHJhbnNmb3JtcyB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBpbnRlcnBvbGF0aW9uLCBmaWxsTW9kZSwgZmlsbFZhbHVlLCBvdXRwdXRTaGFwZSB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFRyYW5zZm9ybSwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgdHJhbnNmb3JtID0gb3AoeyB0cmFuc2Zvcm1fIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHJhbnNmb3JtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnQsIGFzc2VydFNoYXBlc01hdGNoLCBnZXRUeXBlZEFycmF5RnJvbURUeXBlIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyB0ZW5zb3IgfSBmcm9tICcuL3RlbnNvcic7XG4vKipcbiAqIFJldHVybnMgd2hldGhlciB0aGUgdGFyZ2V0cyBhcmUgaW4gdGhlIHRvcCBLIHByZWRpY3Rpb25zLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBwcmVkaWN0aW9ucyA9IHRmLnRlbnNvcjJkKFtbMjAsIDEwLCA0MCwgMzBdLCBbMzAsIDUwLCAtMjAsIDEwXV0pO1xuICogY29uc3QgdGFyZ2V0cyA9IHRmLnRlbnNvcjFkKFsyLCAwXSk7XG4gKiBjb25zdCBwcmVjaXNpb24gPSBhd2FpdCB0Zi5pblRvcEtBc3luYyhwcmVkaWN0aW9ucywgdGFyZ2V0cyk7XG4gKiBwcmVjaXNpb24ucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIHByZWRpY3Rpb25zIDItRCBvciBoaWdoZXIgYHRmLlRlbnNvcmAgd2l0aCBsYXN0IGRpbWVuc2lvbiBiZWluZ1xuICogICAgIGF0IGxlYXN0IGBrYC5cbiAqIEBwYXJhbSB0YXJnZXRzIDEtRCBvciBoaWdoZXIgYHRmLlRlbnNvcmAuXG4gKiBAcGFyYW0gayBPcHRpb25hbCBOdW1iZXIgb2YgdG9wIGVsZW1lbnRzIHRvIGxvb2sgYXQgZm9yIGNvbXB1dGluZyBwcmVjaXNpb24sXG4gKiAgICAgZGVmYXVsdCB0byAxLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0V2YWx1YXRpb24nfVxuICovXG5hc3luYyBmdW5jdGlvbiBpblRvcEtBc3luY18ocHJlZGljdGlvbnMsIHRhcmdldHMsIGsgPSAxKSB7XG4gICAgY29uc3QgJHByZWRpY3Rpb25zID0gY29udmVydFRvVGVuc29yKHByZWRpY3Rpb25zLCAncHJlZGljdGlvbnMnLCAnaW5Ub3BLJyk7XG4gICAgY29uc3QgJHRhcmdldHMgPSBjb252ZXJ0VG9UZW5zb3IodGFyZ2V0cywgJ3RhcmdldHMnLCAnaW5Ub3BLJyk7XG4gICAgYXNzZXJ0KCRwcmVkaWN0aW9ucy5yYW5rID4gMSwgKCkgPT4gJ2luVG9wSygpIGV4cGVjdHMgdGhlIHByZWRpY3Rpb25zIHRvIGJlIG9mIHJhbmsgMiBvciBoaWdoZXIsICcgK1xuICAgICAgICBgYnV0IGdvdCAkeyRwcmVkaWN0aW9ucy5yYW5rfWApO1xuICAgIGFzc2VydCgkcHJlZGljdGlvbnMucmFuayAtIDEgPT09ICR0YXJnZXRzLnJhbmssICgpID0+IGBwcmVkaWN0aW9ucyByYW5rIHNob3VsZCBiZSAxIGxhcmdlciB0aGFuIGAgK1xuICAgICAgICBgdGFyZ2V0cyByYW5rLCBidXQgZ290IHByZWRpY3Rpb25zIHJhbmsgYCArXG4gICAgICAgIGAkeyRwcmVkaWN0aW9ucy5yYW5rfSBhbmQgdGFyZ2V0cyByYW5rICR7JHRhcmdldHMucmFua31gKTtcbiAgICBhc3NlcnRTaGFwZXNNYXRjaCgkcHJlZGljdGlvbnMuc2hhcGUuc2xpY2UoMCwgJHByZWRpY3Rpb25zLnNoYXBlLmxlbmd0aCAtIDEpLCAkdGFyZ2V0cy5zaGFwZSwgYHByZWRpY3Rpb25zJ3Mgc2hhcGUgc2hvdWxkIGJlIGFsaWduIHdpdGggdGhlIHRhcmdldHMnIHNoYXBlLCBgICtcbiAgICAgICAgJ2V4Y2VwdCB0aGUgbGFzdCBkaW1lbnNpb24uJyk7XG4gICAgY29uc3QgbGFzdERpbSA9ICRwcmVkaWN0aW9ucy5zaGFwZVskcHJlZGljdGlvbnMuc2hhcGUubGVuZ3RoIC0gMV07XG4gICAgYXNzZXJ0KGsgPiAwICYmIGsgPD0gbGFzdERpbSwgKCkgPT4gYCdrJyBwYXNzZWQgdG8gaW5Ub3BLKCkgbXVzdCBiZSA+IDAgJiYgPD0gdGhlIHByZWRpY3Rpb25zIGxhc3QgYCArXG4gICAgICAgIGBkaW1lbnNpb24gKCR7bGFzdERpbX0pLCBidXQgZ290ICR7a31gKTtcbiAgICBjb25zdCBwcmVkaWN0aW9uc1ZhbHMgPSBhd2FpdCAkcHJlZGljdGlvbnMuZGF0YSgpO1xuICAgIGNvbnN0IHRhcmdldHNWYWxzID0gYXdhaXQgJHRhcmdldHMuZGF0YSgpO1xuICAgIC8vIFJlc2hhcGUgcHJlZGljdGlvbnNWYWxzIGludG8gYSAyZCB0ZW5zb3IgW2JhdGNoLCBsYXN0RGltXVxuICAgIC8vIGFuZCBsb29rIHVwIHRvcEsgYWxvbmcgbGFzdERpbS5cbiAgICBjb25zdCBbYmF0Y2gsIHNpemVdID0gW3ByZWRpY3Rpb25zVmFscy5sZW5ndGggLyBsYXN0RGltLCBsYXN0RGltXTtcbiAgICBjb25zdCBwcmVjaXNpb24gPSBnZXRUeXBlZEFycmF5RnJvbURUeXBlKCdib29sJywgYmF0Y2gpO1xuICAgIGZvciAobGV0IGIgPSAwOyBiIDwgYmF0Y2g7IGIrKykge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBiICogc2l6ZTtcbiAgICAgICAgY29uc3QgdmFscyA9IHByZWRpY3Rpb25zVmFscy5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIHNpemUpO1xuICAgICAgICBjb25zdCB2YWxBbmRJbmQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YWxBbmRJbmQucHVzaCh7IHZhbHVlOiB2YWxzW2ldLCBpbmRleDogaSB9KTtcbiAgICAgICAgfVxuICAgICAgICB2YWxBbmRJbmQuc29ydCgoYSwgYikgPT4gYi52YWx1ZSAtIGEudmFsdWUpO1xuICAgICAgICBwcmVjaXNpb25bYl0gPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGs7IGkrKykge1xuICAgICAgICAgICAgaWYgKHZhbEFuZEluZFtpXS5pbmRleCA9PT0gdGFyZ2V0c1ZhbHNbYl0pIHtcbiAgICAgICAgICAgICAgICBwcmVjaXNpb25bYl0gPSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChwcmVkaWN0aW9ucyAhPT0gJHByZWRpY3Rpb25zKSB7XG4gICAgICAgICRwcmVkaWN0aW9ucy5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGlmICh0YXJnZXRzICE9PSAkdGFyZ2V0cykge1xuICAgICAgICAkdGFyZ2V0cy5kaXNwb3NlKCk7XG4gICAgfVxuICAgIC8vIE91dHB1dCBwcmVjaXNpb24gaGFzIHRoZSBzYW1lIHNoYXBlIGFzIHRhcmdldHMuXG4gICAgcmV0dXJuIHRlbnNvcihwcmVjaXNpb24sICR0YXJnZXRzLnNoYXBlLCAnYm9vbCcpO1xufVxuZXhwb3J0IGNvbnN0IGluVG9wS0FzeW5jID0gaW5Ub3BLQXN5bmNfO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5fdG9wX2suanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IElzRmluaXRlIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV0dXJucyB3aGljaCBlbGVtZW50cyBvZiB4IGFyZSBmaW5pdGUuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbTmFOLCBJbmZpbml0eSwgLUluZmluaXR5LCAwLCAxXSk7XG4gKlxuICogeC5pc0Zpbml0ZSgpLnByaW50KCk7ICAvLyBvciB0Zi5pc05hTih4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgVGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBpc0Zpbml0ZV8oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2lzRmluaXRlJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKElzRmluaXRlLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGlzRmluaXRlID0gb3AoeyBpc0Zpbml0ZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pc19maW5pdGUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IElzSW5mIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV0dXJucyB3aGljaCBlbGVtZW50cyBvZiB4IGFyZSBJbmZpbml0eSBvciAtSW5maW5pdHkuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbTmFOLCBJbmZpbml0eSwgLUluZmluaXR5LCAwLCAxXSk7XG4gKlxuICogeC5pc0luZigpLnByaW50KCk7ICAvLyBvciB0Zi5pc05hTih4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgVGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBpc0luZl8oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2lzSW5mJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKElzSW5mLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGlzSW5mID0gb3AoeyBpc0luZl8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pc19pbmYuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IElzTmFuIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUlJldHVybnMgd2hpY2ggZWxlbWVudHMgb2YgeCBhcmUgTmFOLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoW05hTiwgSW5maW5pdHksIC1JbmZpbml0eSwgMCwgMV0pO1xuICpcbiAqIHguaXNOYU4oKS5wcmludCgpOyAgLy8gb3IgdGYuaXNOYU4oeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IFRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gaXNOYU5fKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdpc05hTicpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChJc05hbiwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBpc05hTiA9IG9wKHsgaXNOYU5fIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXNfbmFuLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBMZWFreVJlbHUgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBsZWFreSByZWN0aWZpZWQgbGluZWFyIGVsZW1lbnQtd2lzZS5cbiAqXG4gKiBTZWVcbiAqIFtodHRwOi8vd2ViLnN0YW5mb3JkLmVkdS9+YXduaS9wYXBlcnMvcmVsdV9oeWJyaWRfaWNtbDIwMTNfZmluYWwucGRmXShcbiAqICAgICBodHRwOi8vd2ViLnN0YW5mb3JkLmVkdS9+YXduaS9wYXBlcnMvcmVsdV9oeWJyaWRfaWNtbDIwMTNfZmluYWwucGRmKVxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWy0xLCAyLCAtMywgNF0pO1xuICpcbiAqIHgubGVha3lSZWx1KDAuMSkucHJpbnQoKTsgIC8vIG9yIHRmLmxlYWt5UmVsdSh4LCAwLjEpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gYWxwaGEgVGhlIHNjYWxpbmcgZmFjdG9yIGZvciBuZWdhdGl2ZSB2YWx1ZXMsIGRlZmF1bHRzIHRvIDAuMi5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gbGVha3lSZWx1Xyh4LCBhbHBoYSA9IDAuMikge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2xlYWt5UmVsdScpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICBjb25zdCBhdHRycyA9IHsgYWxwaGEgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChMZWFreVJlbHUsIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IGxlYWt5UmVsdSA9IG9wKHsgbGVha3lSZWx1XyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxlYWt5X3JlbHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IExlc3MgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgbWFrZVR5cGVzTWF0Y2ggfSBmcm9tICcuLi90ZW5zb3JfdXRpbCc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUgfSBmcm9tICcuL2Jyb2FkY2FzdF91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSB0cnV0aCB2YWx1ZSBvZiAoYSA8IGIpIGVsZW1lbnQtd2lzZS4gU3VwcG9ydHMgYnJvYWRjYXN0aW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbMiwgMiwgMl0pO1xuICpcbiAqIGEubGVzcyhiKS5wcmludCgpO1xuICogYGBgXG4gKiBAcGFyYW0gYSBUaGUgZmlyc3QgaW5wdXQgdGVuc29yLlxuICogQHBhcmFtIGIgVGhlIHNlY29uZCBpbnB1dCB0ZW5zb3IuIE11c3QgaGF2ZSB0aGUgc2FtZSBkdHlwZSBhcyBgYWAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTG9naWNhbCd9XG4gKi9cbmZ1bmN0aW9uIGxlc3NfKGEsIGIpIHtcbiAgICBsZXQgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnbGVzcycsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICAgIGxldCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdsZXNzJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG4gICAgWyRhLCAkYl0gPSBtYWtlVHlwZXNNYXRjaCgkYSwgJGIpO1xuICAgIGFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKCRhLnNoYXBlLCAkYi5zaGFwZSk7XG4gICAgY29uc3QgaW5wdXRzID0geyBhOiAkYSwgYjogJGIgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChMZXNzLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGxlc3MgPSBvcCh7IGxlc3NfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bGVzcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTGVzc0VxdWFsIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IG1ha2VUeXBlc01hdGNoIH0gZnJvbSAnLi4vdGVuc29yX3V0aWwnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlIH0gZnJvbSAnLi9icm9hZGNhc3RfdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV0dXJucyB0aGUgdHJ1dGggdmFsdWUgb2YgKGEgPD0gYikgZWxlbWVudC13aXNlLiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFsyLCAyLCAyXSk7XG4gKlxuICogYS5sZXNzRXF1YWwoYikucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBpbnB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIGlucHV0IHRlbnNvci4gTXVzdCBoYXZlIHRoZSBzYW1lIGR0eXBlIGFzIGBhYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdMb2dpY2FsJ31cbiAqL1xuZnVuY3Rpb24gbGVzc0VxdWFsXyhhLCBiKSB7XG4gICAgbGV0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ2xlc3NFcXVhbCcsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICAgIGxldCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdsZXNzRXF1YWwnLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgICBbJGEsICRiXSA9IG1ha2VUeXBlc01hdGNoKCRhLCAkYik7XG4gICAgYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoJGEuc2hhcGUsICRiLnNoYXBlKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGE6ICRhLCBiOiAkYiB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKExlc3NFcXVhbCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBsZXNzRXF1YWwgPSBvcCh7IGxlc3NFcXVhbF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sZXNzX2VxdWFsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IGdyZWF0ZXJFcXVhbCB9IGZyb20gJy4uL2dyZWF0ZXJfZXF1YWwnO1xuaW1wb3J0IHsgbGVzc0VxdWFsIH0gZnJvbSAnLi4vbGVzc19lcXVhbCc7XG5pbXBvcnQgeyBsb2dpY2FsQW5kIH0gZnJvbSAnLi4vbG9naWNhbF9hbmQnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmFuZ2UgfSBmcm9tICcuLi9yYW5nZSc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi4vcmVzaGFwZSc7XG5pbXBvcnQgeyBzY2FsYXIgfSBmcm9tICcuLi9zY2FsYXInO1xuaW1wb3J0IHsgc3RhY2sgfSBmcm9tICcuLi9zdGFjayc7XG5pbXBvcnQgeyBzdWIgfSBmcm9tICcuLi9zdWInO1xuaW1wb3J0IHsgdW5zdGFjayB9IGZyb20gJy4uL3Vuc3RhY2snO1xuaW1wb3J0IHsgd2hlcmUgfSBmcm9tICcuLi93aGVyZSc7XG5pbXBvcnQgeyB6ZXJvcyB9IGZyb20gJy4uL3plcm9zJztcbi8qKlxuICogQ29weSBhIHRlbnNvciBzZXR0aW5nIGV2ZXJ5dGhpbmcgb3V0c2lkZSBhIGNlbnRyYWwgYmFuZCBpbiBlYWNoIGlubmVybW9zdFxuICogbWF0cml4IHRvIHplcm8uXG4gKlxuICogVGhlIGJhbmQgcGFydCBpcyBjb21wdXRlZCBhcyBmb2xsb3dzOiBBc3N1bWUgaW5wdXQgaGFzIGBrYCBkaW1lbnNpb25zXG4gKiBgW0ksIEosIEssIC4uLiwgTSwgTl1gLCB0aGVuIHRoZSBvdXRwdXQgaXMgYSB0ZW5zb3Igd2l0aCB0aGUgc2FtZSBzaGFwZSB3aGVyZVxuICogYGJhbmRbaSwgaiwgaywgLi4uLCBtLCBuXSA9IGluX2JhbmQobSwgbikgKiBpbnB1dFtpLCBqLCBrLCAuLi4sIG0sIG5dYC5cbiAqIFRoZSBpbmRpY2F0b3IgZnVuY3Rpb25cbiAqIGBpbl9iYW5kKG0sIG4pID0gKG51bV9sb3dlciA8IDAgfHwgKG0tbikgPD0gbnVtX2xvd2VyKSlgXG4gKiBgJiYgKG51bV91cHBlciA8IDAgfHwgKG4tbSkgPD0gbnVtX3VwcGVyKWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjJkKFtbIDAsICAxLCAgMiwgM10sXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIFstMSwgIDAsICAxLCAyXSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgWy0yLCAtMSwgIDAsIDFdLFxuICogICAgICAgICAgICAgICAgICAgICAgICBbLTMsIC0yLCAtMSwgMF1dKTtcbiAqIGxldCB5ID0gdGYubGluYWxnLmJhbmRQYXJ0KHgsIDEsIC0xKTtcbiAqIHkucHJpbnQoKTsgLy8gW1sgMCwgIDEsICAyLCAzXSxcbiAqICAgICAgICAgICAgLy8gIFstMSwgIDAsICAxLCAyXSxcbiAqICAgICAgICAgICAgLy8gIFsgMCwgLTEsICAwLCAxXSxcbiAqICAgICAgICAgICAgLy8gIFsgMCwgMCAsIC0xLCAwXV1cbiAqIGxldCB6ID0gdGYubGluYWxnLmJhbmRQYXJ0KHgsIDIsIDEpO1xuICogei5wcmludCgpOyAvLyBbWyAwLCAgMSwgIDAsIDBdLFxuICogICAgICAgICAgICAvLyAgWy0xLCAgMCwgIDEsIDBdLFxuICogICAgICAgICAgICAvLyAgWy0yLCAtMSwgIDAsIDFdLFxuICogICAgICAgICAgICAvLyAgWyAwLCAtMiwgLTEsIDBdXVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggUmFuayBga2AgdGVuc29yXG4gKiBAcGFyYW0gbnVtTG93ZXIgTnVtYmVyIG9mIHN1YmRpYWdvbmFscyB0byBrZWVwLlxuICogICBJZiBuZWdhdGl2ZSwga2VlcCBlbnRpcmUgbG93ZXIgdHJpYW5nbGUuXG4gKiBAcGFyYW0gbnVtVXBwZXIgTnVtYmVyIG9mIHN1YmRpYWdvbmFscyB0byBrZWVwLlxuICogICBJZiBuZWdhdGl2ZSwga2VlcCBlbnRpcmUgdXBwZXIgdHJpYW5nbGUuXG4gKiBAcmV0dXJucyBSYW5rIGBrYCB0ZW5zb3Igb2YgdGhlIHNhbWUgc2hhcGUgYXMgaW5wdXQuXG4gKiAgIFRoZSBleHRyYWN0ZWQgYmFuZGVkIHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOidPcGVyYXRpb25zJywgc3ViaGVhZGluZzonTGluZWFyIEFsZ2VicmEnLCBuYW1lc3BhY2U6J2xpbmFsZyd9XG4gKi9cbmZ1bmN0aW9uIGJhbmRQYXJ0XyhhLCBudW1Mb3dlciwgbnVtVXBwZXIpIHtcbiAgICBhc3NlcnQobnVtTG93ZXIgJSAxID09PSAwLCAoKSA9PiBgYmFuZFBhcnQoKTogbnVtTG93ZXIgbXVzdCBiZSBhbiBpbnRlZ2VyLCBnb3QgJHtudW1Mb3dlcn0uYCk7XG4gICAgYXNzZXJ0KG51bVVwcGVyICUgMSA9PT0gMCwgKCkgPT4gYGJhbmRQYXJ0KCk6IG51bVVwcGVyIG11c3QgYmUgYW4gaW50ZWdlciwgZ290ICR7bnVtVXBwZXJ9LmApO1xuICAgIGNvbnN0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ2JhbmRQYXJ0Jyk7XG4gICAgYXNzZXJ0KCRhLnJhbmsgPj0gMiwgKCkgPT4gYGJhbmRQYXJ0KCk6IFJhbmsgbXVzdCBiZSBhdCBsZWFzdCAyLCBnb3QgJHskYS5yYW5rfS5gKTtcbiAgICBjb25zdCBzaGFwZSA9ICRhLnNoYXBlO1xuICAgIGNvbnN0IFtNLCBOXSA9ICRhLnNoYXBlLnNsaWNlKC0yKTtcbiAgICBpZiAoIShudW1Mb3dlciA8PSBNKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGJhbmRQYXJ0KCk6IG51bUxvd2VyICgke251bUxvd2VyfSlgICtcbiAgICAgICAgICAgIGAgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2Ygcm93cyAoJHtNfSkuYCk7XG4gICAgfVxuICAgIGlmICghKG51bVVwcGVyIDw9IE4pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgYmFuZFBhcnQoKTogbnVtVXBwZXIgKCR7bnVtVXBwZXJ9KWAgK1xuICAgICAgICAgICAgYCBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBjb2x1bW5zICgke059KS5gKTtcbiAgICB9XG4gICAgaWYgKG51bUxvd2VyIDwgMCkge1xuICAgICAgICBudW1Mb3dlciA9IE07XG4gICAgfVxuICAgIGlmIChudW1VcHBlciA8IDApIHtcbiAgICAgICAgbnVtVXBwZXIgPSBOO1xuICAgIH1cbiAgICBjb25zdCBpID0gcmVzaGFwZShyYW5nZSgwLCBNLCAxLCAnaW50MzInKSwgWy0xLCAxXSk7XG4gICAgY29uc3QgaiA9IHJhbmdlKDAsIE4sIDEsICdpbnQzMicpO1xuICAgIGNvbnN0IGlqID0gc3ViKGksIGopO1xuICAgIGNvbnN0IGluQmFuZCA9IGxvZ2ljYWxBbmQobGVzc0VxdWFsKGlqLCBzY2FsYXIoK251bUxvd2VyLCAnaW50MzInKSksIGdyZWF0ZXJFcXVhbChpaiwgc2NhbGFyKC1udW1VcHBlciwgJ2ludDMyJykpKTtcbiAgICBjb25zdCB6ZXJvID0gemVyb3MoW00sIE5dLCAkYS5kdHlwZSk7XG4gICAgcmV0dXJuIHJlc2hhcGUoc3RhY2sodW5zdGFjayhyZXNoYXBlKCRhLCBbLTEsIE0sIE5dKSlcbiAgICAgICAgLm1hcChtYXQgPT4gd2hlcmUoaW5CYW5kLCBtYXQsIHplcm8pKSksIHNoYXBlKTtcbn1cbmV4cG9ydCBjb25zdCBiYW5kUGFydCA9IG9wKHsgYmFuZFBhcnRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmFuZF9wYXJ0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IGRpdiB9IGZyb20gJy4uL2Rpdic7XG5pbXBvcnQgeyBtdWwgfSBmcm9tICcuLi9tdWwnO1xuaW1wb3J0IHsgbm9ybSB9IGZyb20gJy4uL25vcm0nO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgc3BsaXQgfSBmcm9tICcuLi9zcGxpdCc7XG5pbXBvcnQgeyBzcXVlZXplIH0gZnJvbSAnLi4vc3F1ZWV6ZSc7XG5pbXBvcnQgeyBzdGFjayB9IGZyb20gJy4uL3N0YWNrJztcbmltcG9ydCB7IHN1YiB9IGZyb20gJy4uL3N1Yic7XG5pbXBvcnQgeyBzdW0gfSBmcm9tICcuLi9zdW0nO1xuLyoqXG4gKiBHcmFtLVNjaG1pZHQgb3J0aG9nb25hbGl6YXRpb24uXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IyZChbWzEsIDJdLCBbMywgNF1dKTtcbiAqIGxldCB5ID0gdGYubGluYWxnLmdyYW1TY2htaWR0KHgpO1xuICogeS5wcmludCgpO1xuICogY29uc29sZS5sb2coJ090aG9nb25hbGl6ZWQ6Jyk7XG4gKiB5LmRvdCh5LnRyYW5zcG9zZSgpKS5wcmludCgpOyAgLy8gc2hvdWxkIGJlIG5lYXJseSB0aGUgaWRlbnRpdHkgbWF0cml4LlxuICogY29uc29sZS5sb2coJ0ZpcnN0IHJvdyBkaXJlY3Rpb24gbWFpbnRhaW5lZDonKTtcbiAqIGNvbnN0IGRhdGEgPSBhd2FpdCB5LmFycmF5KCk7XG4gKiBjb25zb2xlLmxvZyhkYXRhWzBdWzFdIC8gZGF0YVswXVswXSk7ICAvLyBzaG91bGQgYmUgbmVhcmx5IDIuXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geHMgVGhlIHZlY3RvcnMgdG8gYmUgb3J0aG9nb25hbGl6ZWQsIGluIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZ1xuICogICBmb3JtYXRzOlxuICogICAtIEFuIEFycmF5IG9mIGB0Zi5UZW5zb3IxRGAuXG4gKiAgIC0gQSBgdGYuVGVuc29yMkRgLCBpLmUuLCBhIG1hdHJpeCwgaW4gd2hpY2ggY2FzZSB0aGUgdmVjdG9ycyBhcmUgdGhlIHJvd3NcbiAqICAgICBvZiBgeHNgLlxuICogICBJbiBlYWNoIGNhc2UsIGFsbCB0aGUgdmVjdG9ycyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFuZCB0aGUgbGVuZ3RoXG4gKiAgIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgdmVjdG9ycy5cbiAqIEByZXR1cm5zIFRoZSBvcnRob2dvbmFsaXplZCBhbmQgbm9ybWFsaXplZCB2ZWN0b3JzIG9yIG1hdHJpeC5cbiAqICAgT3J0aG9nb25hbGl6YXRpb24gbWVhbnMgdGhhdCB0aGUgdmVjdG9ycyBvciB0aGUgcm93cyBvZiB0aGUgbWF0cml4XG4gKiAgIGFyZSBvcnRob2dvbmFsICh6ZXJvIGlubmVyIHByb2R1Y3RzKS4gTm9ybWFsaXphdGlvbiBtZWFucyB0aGF0IGVhY2hcbiAqICAgdmVjdG9yIG9yIGVhY2ggcm93IG9mIHRoZSBtYXRyaXggaGFzIGFuIEwyIG5vcm0gdGhhdCBlcXVhbHMgYDFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6J09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOidMaW5lYXIgQWxnZWJyYScsIG5hbWVzcGFjZTonbGluYWxnJ31cbiAqL1xuZnVuY3Rpb24gZ3JhbVNjaG1pZHRfKHhzKSB7XG4gICAgbGV0IGlucHV0SXNUZW5zb3IyRDtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh4cykpIHtcbiAgICAgICAgaW5wdXRJc1RlbnNvcjJEID0gZmFsc2U7XG4gICAgICAgIGFzc2VydCh4cyAhPSBudWxsICYmIHhzLmxlbmd0aCA+IDAsICgpID0+ICdHcmFtLVNjaG1pZHQgcHJvY2VzczogaW5wdXQgbXVzdCBub3QgYmUgbnVsbCwgdW5kZWZpbmVkLCBvciAnICtcbiAgICAgICAgICAgICdlbXB0eScpO1xuICAgICAgICBjb25zdCBkaW0gPSB4c1swXS5zaGFwZVswXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCB4cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgYXNzZXJ0KHhzW2ldLnNoYXBlWzBdID09PSBkaW0sICgpID0+ICdHcmFtLVNjaG1pZHQ6IE5vbi11bmlxdWUgbGVuZ3RocyBmb3VuZCBpbiB0aGUgaW5wdXQgdmVjdG9yczogJyArXG4gICAgICAgICAgICAgICAgYCgke3hzW2ldLnNoYXBlWzBdfSB2cy4gJHtkaW19KWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpbnB1dElzVGVuc29yMkQgPSB0cnVlO1xuICAgICAgICB4cyA9IHNwbGl0KHhzLCB4cy5zaGFwZVswXSwgMCkubWFwKHggPT4gc3F1ZWV6ZSh4LCBbMF0pKTtcbiAgICB9XG4gICAgYXNzZXJ0KHhzLmxlbmd0aCA8PSB4c1swXS5zaGFwZVswXSwgKCkgPT4gYEdyYW0tU2NobWlkdDogTnVtYmVyIG9mIHZlY3RvcnMgKCR7eHMubGVuZ3RofSkgZXhjZWVkcyBgICtcbiAgICAgICAgYG51bWJlciBvZiBkaW1lbnNpb25zICgke3hzWzBdLnNoYXBlWzBdfSkuYCk7XG4gICAgY29uc3QgeXMgPSBbXTtcbiAgICBjb25zdCB4czFkID0geHM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB4cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB5cy5wdXNoKEVOR0lORS50aWR5KCgpID0+IHtcbiAgICAgICAgICAgIGxldCB4ID0geHMxZFtpXTtcbiAgICAgICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaTsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb2ogPSBtdWwoc3VtKG11bCh5c1tqXSwgeCkpLCB5c1tqXSk7XG4gICAgICAgICAgICAgICAgICAgIHggPSBzdWIoeCwgcHJvaik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRpdih4LCBub3JtKHgsICdldWNsaWRlYW4nKSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgaWYgKGlucHV0SXNUZW5zb3IyRCkge1xuICAgICAgICByZXR1cm4gc3RhY2soeXMsIDApO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHlzO1xuICAgIH1cbn1cbmV4cG9ydCBjb25zdCBncmFtU2NobWlkdCA9IG9wKHsgZ3JhbVNjaG1pZHRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z3JhbV9zY2htaWR0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBkaXNwb3NlIH0gZnJvbSAnLi4vLi4vZ2xvYmFscyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IGNsb25lIH0gZnJvbSAnLi4vY2xvbmUnO1xuaW1wb3J0IHsgY29uY2F0IH0gZnJvbSAnLi4vY29uY2F0JztcbmltcG9ydCB7IGRpdiB9IGZyb20gJy4uL2Rpdic7XG5pbXBvcnQgeyBleWUgfSBmcm9tICcuLi9leWUnO1xuaW1wb3J0IHsgZ3JlYXRlciB9IGZyb20gJy4uL2dyZWF0ZXInO1xuaW1wb3J0IHsgbWF0TXVsIH0gZnJvbSAnLi4vbWF0X211bCc7XG5pbXBvcnQgeyBtdWwgfSBmcm9tICcuLi9tdWwnO1xuaW1wb3J0IHsgbmVnIH0gZnJvbSAnLi4vbmVnJztcbmltcG9ydCB7IG5vcm0gfSBmcm9tICcuLi9ub3JtJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuLi9yZXNoYXBlJztcbmltcG9ydCB7IHNsaWNlIH0gZnJvbSAnLi4vc2xpY2UnO1xuaW1wb3J0IHsgc3RhY2sgfSBmcm9tICcuLi9zdGFjayc7XG5pbXBvcnQgeyBzdWIgfSBmcm9tICcuLi9zdWInO1xuaW1wb3J0IHsgdGVuc29yMmQgfSBmcm9tICcuLi90ZW5zb3IyZCc7XG5pbXBvcnQgeyB0cmFuc3Bvc2UgfSBmcm9tICcuLi90cmFuc3Bvc2UnO1xuaW1wb3J0IHsgdW5zdGFjayB9IGZyb20gJy4uL3Vuc3RhY2snO1xuaW1wb3J0IHsgd2hlcmUgfSBmcm9tICcuLi93aGVyZSc7XG4vKipcbiAqIENvbXB1dGUgUVIgZGVjb21wb3NpdGlvbiBvZiBtLWJ5LW4gbWF0cml4IHVzaW5nIEhvdXNlaG9sZGVyIHRyYW5zZm9ybWF0aW9uLlxuICpcbiAqIEltcGxlbWVudGF0aW9uIGJhc2VkIG9uXG4gKiAgIFtodHRwOi8vd3d3LmNzLmNvcm5lbGwuZWR1L35iaW5kZWwvY2xhc3MvY3M2MjEwLWYwOS9sZWMxOC5wZGZdXG4gKiAoaHR0cDovL3d3dy5jcy5jb3JuZWxsLmVkdS9+YmluZGVsL2NsYXNzL2NzNjIxMC1mMDkvbGVjMTgucGRmKVxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMmQoW1sxLCAyXSwgWzMsIDRdXSk7XG4gKiBsZXQgW3EsIHJdID0gdGYubGluYWxnLnFyKGEpO1xuICogY29uc29sZS5sb2coJ1EnKTtcbiAqIHEucHJpbnQoKTtcbiAqIGNvbnNvbGUubG9nKCdSJyk7XG4gKiByLnByaW50KCk7XG4gKiBjb25zb2xlLmxvZygnT3J0aG9nb25hbGl6ZWQnKTtcbiAqIHEuZG90KHEudHJhbnNwb3NlKCkpLnByaW50KCkgIC8vIHNob3VsZCBiZSBuZWFybHkgdGhlIGlkZW50aXR5IG1hdHJpeC5cbiAqIGNvbnNvbGUubG9nKCdSZWNvbnN0cnVjdGVkJyk7XG4gKiBxLmRvdChyKS5wcmludCgpOyAvLyBzaG91bGQgYmUgbmVhcmx5IFtbMSwgMl0sIFszLCA0XV07XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgYHRmLlRlbnNvcmAgdG8gYmUgUVItZGVjb21wb3NlZC4gTXVzdCBoYXZlIHJhbmsgPj0gMi4gU3VwcG9zZVxuICogICBpdCBoYXMgdGhlIHNoYXBlIGBbLi4uLCBNLCBOXWAuXG4gKiBAcGFyYW0gZnVsbE1hdHJpY2VzIEFuIG9wdGlvbmFsIGJvb2xlYW4gcGFyYW1ldGVyLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICogICBJZiBgdHJ1ZWAsIGNvbXB1dGUgZnVsbC1zaXplZCBgUWAuIElmIGBmYWxzZWAgKHRoZSBkZWZhdWx0KSxcbiAqICAgY29tcHV0ZSBvbmx5IHRoZSBsZWFkaW5nIE4gY29sdW1ucyBvZiBgUWAgYW5kIGBSYC5cbiAqIEByZXR1cm5zIEFuIGBBcnJheWAgb2YgdHdvIGB0Zi5UZW5zb3JgczogYFtRLCBSXWAuIGBRYCBpcyBhIHVuaXRhcnkgbWF0cml4LFxuICogICBpLmUuLCBpdHMgY29sdW1ucyBhbGwgaGF2ZSB1bml0IG5vcm0gYW5kIGFyZSBtdXR1YWxseSBvcnRob2dvbmFsLlxuICogICBJZiBgTSA+PSBOYCxcbiAqICAgICBJZiBgZnVsbE1hdHJpY2VzYCBpcyBgZmFsc2VgIChkZWZhdWx0KSxcbiAqICAgICAgIC0gYFFgIGhhcyBhIHNoYXBlIG9mIGBbLi4uLCBNLCBOXWAsXG4gKiAgICAgICAtIGBSYCBoYXMgYSBzaGFwZSBvZiBgWy4uLiwgTiwgTl1gLlxuICogICAgIElmIGBmdWxsTWF0cmljZXNgIGlzIGB0cnVlYCAoZGVmYXVsdCksXG4gKiAgICAgICAtIGBRYCBoYXMgYSBzaGFwZSBvZiBgWy4uLiwgTSwgTV1gLFxuICogICAgICAgLSBgUmAgaGFzIGEgc2hhcGUgb2YgYFsuLi4sIE0sIE5dYC5cbiAqICAgSWYgYE0gPCBOYCxcbiAqICAgICAtIGBRYCBoYXMgYSBzaGFwZSBvZiBgWy4uLiwgTSwgTV1gLFxuICogICAgIC0gYFJgIGhhcyBhIHNoYXBlIG9mIGBbLi4uLCBNLCBOXWAuXG4gKiBAdGhyb3dzIElmIHRoZSByYW5rIG9mIGB4YCBpcyBsZXNzIHRoYW4gMi5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOidPcGVyYXRpb25zJyxcbiAqICAgICAgIHN1YmhlYWRpbmc6J0xpbmVhciBBbGdlYnJhJyxcbiAqICAgICAgIG5hbWVzcGFjZTonbGluYWxnJ31cbiAqL1xuZnVuY3Rpb24gcXJfKHgsIGZ1bGxNYXRyaWNlcyA9IGZhbHNlKSB7XG4gICAgYXNzZXJ0KHgucmFuayA+PSAyLCAoKSA9PiBgcXIoKSByZXF1aXJlcyBpbnB1dCB0ZW5zb3IgdG8gaGF2ZSBhIHJhbmsgPj0gMiwgYnV0IGdvdCByYW5rICR7eC5yYW5rfWApO1xuICAgIGlmICh4LnJhbmsgPT09IDIpIHtcbiAgICAgICAgcmV0dXJuIHFyMmQoeCwgZnVsbE1hdHJpY2VzKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIFJhbmsgPiAyLlxuICAgICAgICAvLyBUT0RPKGNhaXMpOiBCZWxvdyB3ZSBzcGxpdCB0aGUgaW5wdXQgaW50byBpbmRpdmlkdWFsIDJEIHRlbnNvcnMsXG4gICAgICAgIC8vICAgcGVyZm9ybSBRUiBkZWNvbXBvc2l0aW9uIG9uIHRoZW0gYW5kIHRoZW4gc3RhY2sgdGhlIHJlc3VsdHMgYmFja1xuICAgICAgICAvLyAgIHRvZ2V0aGVyLiBXZSBzaG91bGQgZXhwbG9yZSB3aGV0aGVyIHRoaXMgY2FuIGJlIHBhcmFsbGVsaXplZC5cbiAgICAgICAgY29uc3Qgb3V0ZXJEaW1zUHJvZCA9IHguc2hhcGUuc2xpY2UoMCwgeC5zaGFwZS5sZW5ndGggLSAyKVxuICAgICAgICAgICAgLnJlZHVjZSgodmFsdWUsIHByZXYpID0+IHZhbHVlICogcHJldik7XG4gICAgICAgIGNvbnN0IHgyZHMgPSB1bnN0YWNrKHJlc2hhcGUoeCwgW1xuICAgICAgICAgICAgb3V0ZXJEaW1zUHJvZCwgeC5zaGFwZVt4LnNoYXBlLmxlbmd0aCAtIDJdLFxuICAgICAgICAgICAgeC5zaGFwZVt4LnNoYXBlLmxlbmd0aCAtIDFdXG4gICAgICAgIF0pLCAwKTtcbiAgICAgICAgY29uc3QgcTJkcyA9IFtdO1xuICAgICAgICBjb25zdCByMmRzID0gW107XG4gICAgICAgIHgyZHMuZm9yRWFjaCh4MmQgPT4ge1xuICAgICAgICAgICAgY29uc3QgW3EyZCwgcjJkXSA9IHFyMmQoeDJkLCBmdWxsTWF0cmljZXMpO1xuICAgICAgICAgICAgcTJkcy5wdXNoKHEyZCk7XG4gICAgICAgICAgICByMmRzLnB1c2gocjJkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHEgPSByZXNoYXBlKHN0YWNrKHEyZHMsIDApLCB4LnNoYXBlKTtcbiAgICAgICAgY29uc3QgciA9IHJlc2hhcGUoc3RhY2socjJkcywgMCksIHguc2hhcGUpO1xuICAgICAgICByZXR1cm4gW3EsIHJdO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHFyMmQoeCwgZnVsbE1hdHJpY2VzID0gZmFsc2UpIHtcbiAgICByZXR1cm4gRU5HSU5FLnRpZHkoKCkgPT4ge1xuICAgICAgICBhc3NlcnQoeC5zaGFwZS5sZW5ndGggPT09IDIsICgpID0+IGBxcjJkKCkgcmVxdWlyZXMgYSAyRCBUZW5zb3IsIGJ1dCBnb3QgYSAke3guc2hhcGUubGVuZ3RofUQgVGVuc29yLmApO1xuICAgICAgICBjb25zdCBtID0geC5zaGFwZVswXTtcbiAgICAgICAgY29uc3QgbiA9IHguc2hhcGVbMV07XG4gICAgICAgIGxldCBxID0gZXllKG0pOyAvLyBPcnRob2dvbmFsIHRyYW5zZm9ybSBzbyBmYXIuXG4gICAgICAgIGxldCByID0gY2xvbmUoeCk7IC8vIFRyYW5zZm9ybWVkIG1hdHJpeCBzbyBmYXIuXG4gICAgICAgIGNvbnN0IG9uZTJEID0gdGVuc29yMmQoW1sxXV0sIFsxLCAxXSk7XG4gICAgICAgIGxldCB3ID0gY2xvbmUob25lMkQpO1xuICAgICAgICBjb25zdCBpdGVycyA9IG0gPj0gbiA/IG4gOiBtO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGl0ZXJzOyArK2opIHtcbiAgICAgICAgICAgIC8vIFRoaXMgdGlkeSB3aXRoaW4gdGhlIGZvci1sb29wIGVuc3VyZXMgd2UgY2xlYW4gdXAgdGVtcG9yYXJ5XG4gICAgICAgICAgICAvLyB0ZW5zb3JzIGFzIHNvb24gYXMgdGhleSBhcmUgbm8gbG9uZ2VyIG5lZWRlZC5cbiAgICAgICAgICAgIGNvbnN0IHJUZW1wID0gcjtcbiAgICAgICAgICAgIGNvbnN0IHdUZW1wID0gdztcbiAgICAgICAgICAgIGNvbnN0IHFUZW1wID0gcTtcbiAgICAgICAgICAgIFt3LCByLCBxXSA9IEVOR0lORS50aWR5KCgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBGaW5kIEggPSBJIC0gdGF1ICogdyAqIHcnLCB0byBwdXQgemVyb3MgYmVsb3cgUihqLCBqKS5cbiAgICAgICAgICAgICAgICBjb25zdCByakVuZDEgPSBzbGljZShyLCBbaiwgal0sIFttIC0gaiwgMV0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vcm1YID0gbm9ybShyakVuZDEpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJqaiA9IHNsaWNlKHIsIFtqLCBqXSwgWzEsIDFdKTtcbiAgICAgICAgICAgICAgICAvLyBUaGUgc2lnbigpIGZ1bmN0aW9uIHJldHVybnMgMCBvbiAwLCB3aGljaCBjYXVzZXMgZGl2aXNpb24gYnkgemVyby5cbiAgICAgICAgICAgICAgICBjb25zdCBzID0gd2hlcmUoZ3JlYXRlcihyamosIDApLCB0ZW5zb3IyZChbWy0xXV0pLCB0ZW5zb3IyZChbWzFdXSkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHUxID0gc3ViKHJqaiwgbXVsKHMsIG5vcm1YKSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgd1ByZSA9IGRpdihyakVuZDEsIHUxKTtcbiAgICAgICAgICAgICAgICBpZiAod1ByZS5zaGFwZVswXSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICB3ID0gY2xvbmUob25lMkQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdyA9IGNvbmNhdChbXG4gICAgICAgICAgICAgICAgICAgICAgICBvbmUyRCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlKHdQcmUsIFsxLCAwXSwgW3dQcmUuc2hhcGVbMF0gLSAxLCB3UHJlLnNoYXBlWzFdXSlcbiAgICAgICAgICAgICAgICAgICAgXSwgMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHRhdSA9IG5lZyhkaXYobWF0TXVsKHMsIHUxKSwgbm9ybVgpKTtcbiAgICAgICAgICAgICAgICAvLyAtLSBSIDo9IEhSLCBRIDo9IFFILlxuICAgICAgICAgICAgICAgIGNvbnN0IHJqRW5kQWxsID0gc2xpY2UociwgW2osIDBdLCBbbSAtIGosIG5dKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0YXVUaW1lc1cgPSBtdWwodGF1LCB3KTtcbiAgICAgICAgICAgICAgICBjb25zdCB3VCA9IHRyYW5zcG9zZSh3KTtcbiAgICAgICAgICAgICAgICBpZiAoaiA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByID0gc3ViKHJqRW5kQWxsLCBtYXRNdWwodGF1VGltZXNXLCBtYXRNdWwod1QsIHJqRW5kQWxsKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgclRpbWVzVGF1ID0gc3ViKHJqRW5kQWxsLCBtYXRNdWwodGF1VGltZXNXLCBtYXRNdWwod1QsIHJqRW5kQWxsKSkpO1xuICAgICAgICAgICAgICAgICAgICByID0gY29uY2F0KFtzbGljZShyLCBbMCwgMF0sIFtqLCBuXSksIHJUaW1lc1RhdV0sIDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB0YXdUaW1lc1dUID0gdHJhbnNwb3NlKHRhdVRpbWVzVyk7XG4gICAgICAgICAgICAgICAgY29uc3QgcUFsbEpFbmQgPSBzbGljZShxLCBbMCwgal0sIFttLCBxLnNoYXBlWzFdIC0gal0pO1xuICAgICAgICAgICAgICAgIGlmIChqID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHEgPSBzdWIocUFsbEpFbmQsIG1hdE11bChtYXRNdWwocUFsbEpFbmQsIHcpLCB0YXdUaW1lc1dUKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBxVGltZXNUYXUgPSBzdWIocUFsbEpFbmQsIG1hdE11bChtYXRNdWwocUFsbEpFbmQsIHcpLCB0YXdUaW1lc1dUKSk7XG4gICAgICAgICAgICAgICAgICAgIHEgPSBjb25jYXQoW3NsaWNlKHEsIFswLCAwXSwgW20sIGpdKSwgcVRpbWVzVGF1XSwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBbdywgciwgcV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRpc3Bvc2UoW3JUZW1wLCB3VGVtcCwgcVRlbXBdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZ1bGxNYXRyaWNlcyAmJiBtID4gbikge1xuICAgICAgICAgICAgcSA9IHNsaWNlKHEsIFswLCAwXSwgW20sIG5dKTtcbiAgICAgICAgICAgIHIgPSBzbGljZShyLCBbMCwgMF0sIFtuLCBuXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtxLCByXTtcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBxciA9IG9wKHsgcXJfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IExpblNwYWNlIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbi8qKlxuICogUmV0dXJuIGFuIGV2ZW5seSBzcGFjZWQgc2VxdWVuY2Ugb2YgbnVtYmVycyBvdmVyIHRoZSBnaXZlbiBpbnRlcnZhbC5cbiAqXG4gKiBgYGBqc1xuICogdGYubGluc3BhY2UoMCwgOSwgMTApLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSBzdGFydCBUaGUgc3RhcnQgdmFsdWUgb2YgdGhlIHNlcXVlbmNlLlxuICogQHBhcmFtIHN0b3AgVGhlIGVuZCB2YWx1ZSBvZiB0aGUgc2VxdWVuY2UuXG4gKiBAcGFyYW0gbnVtIFRoZSBudW1iZXIgb2YgdmFsdWVzIHRvIGdlbmVyYXRlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpbnNwYWNlKHN0YXJ0LCBzdG9wLCBudW0pIHtcbiAgICBpZiAobnVtIDw9IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgbnVtYmVyIG9mIHZhbHVlcyBzaG91bGQgYmUgcG9zaXRpdmUuJyk7XG4gICAgfVxuICAgIGNvbnN0IGF0dHJzID0geyBzdGFydCwgc3RvcCwgbnVtIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoTGluU3BhY2UsIHt9LCBhdHRycyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1saW5zcGFjZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTFJOIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbi8qKlxuICogTm9ybWFsaXplcyB0aGUgYWN0aXZhdGlvbiBvZiBhIGxvY2FsIG5laWdoYm9yaG9vZCBhY3Jvc3Mgb3Igd2l0aGluXG4gKiBjaGFubmVscy5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLiBUaGUgNC1EIGlucHV0IHRlbnNvciBpcyB0cmVhdGVkIGFzIGEgMy1EIGFycmF5XG4gKiAgICAgb2YgMUQgdmVjdG9ycyAoYWxvbmcgdGhlIGxhc3QgZGltZW5zaW9uKSwgYW5kIGVhY2ggdmVjdG9yIGlzXG4gKiAgICAgbm9ybWFsaXplZCBpbmRlcGVuZGVudGx5LlxuICogQHBhcmFtIGRlcHRoUmFkaXVzIFRoZSBudW1iZXIgb2YgYWRqYWNlbnQgY2hhbm5lbHMgaW4gdGhlIDFEIG5vcm1hbGl6YXRpb25cbiAqICAgICB3aW5kb3cuXG4gKiBAcGFyYW0gYmlhcyBBIGNvbnN0YW50IGJpYXMgdGVybSBmb3IgdGhlIGJhc2lzLlxuICogQHBhcmFtIGFscGhhIEEgc2NhbGUgZmFjdG9yLCB1c3VhbGx5IHBvc2l0aXZlLlxuICogQHBhcmFtIGJldGEgQW4gZXhwb25lbnQuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTm9ybWFsaXphdGlvbid9XG4gKi9cbmZ1bmN0aW9uIGxvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uXyh4LCBkZXB0aFJhZGl1cyA9IDUsIGJpYXMgPSAxLCBhbHBoYSA9IDEsIGJldGEgPSAwLjUpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdsb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbicpO1xuICAgIHV0aWwuYXNzZXJ0KCR4LnJhbmsgPT09IDQgfHwgJHgucmFuayA9PT0gMywgKCkgPT4gYEVycm9yIGluIGxvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uOiB4IG11c3QgYmUgcmFuayAzIG9yIDQgYnV0IGdvdFxuICAgICAgICAgICAgICAgcmFuayAkeyR4LnJhbmt9LmApO1xuICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNJbnQoZGVwdGhSYWRpdXMpLCAoKSA9PiBgRXJyb3IgaW4gbG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb246IGRlcHRoUmFkaXVzIG11c3QgYmUgYW4gYCArXG4gICAgICAgIGBpbnRlZ2VyIGJ1dCBnb3QgZGVwdGhSYWRpdXMgJHtkZXB0aFJhZGl1c30uYCk7XG4gICAgbGV0IHg0RCA9ICR4O1xuICAgIGxldCByZXNoYXBlZFRvNEQgPSBmYWxzZTtcbiAgICBpZiAoJHgucmFuayA9PT0gMykge1xuICAgICAgICByZXNoYXBlZFRvNEQgPSB0cnVlO1xuICAgICAgICB4NEQgPSByZXNoYXBlKCR4LCBbMSwgJHguc2hhcGVbMF0sICR4LnNoYXBlWzFdLCAkeC5zaGFwZVsyXV0pO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6IHg0RCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBkZXB0aFJhZGl1cywgYmlhcywgYWxwaGEsIGJldGEgfTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgY29uc3QgcmVzID0gRU5HSU5FLnJ1bktlcm5lbChMUk4sIGlucHV0cywgYXR0cnMpO1xuICAgIGlmIChyZXNoYXBlZFRvNEQpIHtcbiAgICAgICAgcmV0dXJuIHJlc2hhcGUocmVzLCBbcmVzLnNoYXBlWzFdLCByZXMuc2hhcGVbMl0sIHJlcy5zaGFwZVszXV0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG59XG5leHBvcnQgY29uc3QgbG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb24gPSBvcCh7IGxvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxvY2FsX3Jlc3BvbnNlX25vcm1hbGl6YXRpb24uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IExvZyB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIG5hdHVyYWwgbG9nYXJpdGhtIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6IGBsbih4KWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCBNYXRoLkVdKTtcbiAqXG4gKiB4LmxvZygpLnByaW50KCk7ICAvLyBvciB0Zi5sb2coeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gbG9nXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnbG9nJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKExvZywgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBsb2cgPSBvcCh7IGxvZ18gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sb2cuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IExvZzFwIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgbmF0dXJhbCBsb2dhcml0aG0gb2YgdGhlIGlucHV0IGB0Zi5UZW5zb3JgIHBsdXMgb25lXG4gKiBlbGVtZW50LXdpc2U6IGBsbigxICsgeClgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgTWF0aC5FIC0gMV0pO1xuICpcbiAqIHgubG9nMXAoKS5wcmludCgpOyAgLy8gb3IgdGYubG9nMXAoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gbG9nMXBfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdsb2cxcCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChMb2cxcCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBsb2cxcCA9IG9wKHsgbG9nMXBfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG9nMXAuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY3VzdG9tR3JhZCB9IGZyb20gJy4uL2dyYWRpZW50cyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi9tdWwnO1xuaW1wb3J0IHsgbmVnIH0gZnJvbSAnLi9uZWcnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyBzaWdtb2lkIH0gZnJvbSAnLi9zaWdtb2lkJztcbmltcG9ydCB7IHNvZnRwbHVzIH0gZnJvbSAnLi9zb2Z0cGx1cyc7XG4vKipcbiAqIENvbXB1dGVzIGxvZyBzaWdtb2lkIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6XG4gKiBgbG9nU2lnbW9pZCh4KWAuIEZvciBudW1lcmljYWwgc3RhYmlsaXR5LCB3ZSB1c2UgYC10Zi5zb2Z0cGx1cygteClgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzAsIDEsIC0xLCAuN10pO1xuICpcbiAqIHgubG9nU2lnbW9pZCgpLnByaW50KCk7ICAvLyBvciB0Zi5sb2dTaWdtb2lkKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGxvZ1NpZ21vaWRfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdsb2dTaWdtb2lkJyk7XG4gICAgLy8gVXNlIGEgY3VzdG9tIGdyYWRpZW50IHRvIG1haW50YWluIHByZXZpb3VzIGltcGxlbWVudGF0aW9uLlxuICAgIC8vIFRoZXJlIGlzIG5vIExvZ1NpZ21vaWQga2VybmVsIGluIFRGIHNvIHdlIGNhbid0IHVzZSBlbmdpbmUucnVuS2VybmVsXG4gICAgLy8gZGlyZWN0bHlcbiAgICBjb25zdCBjdXN0b21PcCA9IGN1c3RvbUdyYWQoKHgpID0+IHtcbiAgICAgICAgLy8gVE9ETyh5YXNzb2diYSkgd2UgY2FuIHJlbW92ZSB0aGUgY2hhaW5lZCBzb2Z0cGx1cyBjYWxsIGhlcmUgb25seVxuICAgICAgICAvLyBhZnRlciBiYWNrZW5kcyBoYXZlIG1vZHVhbHJpemVkIHNvZnRwbHVzIGF0IHdoaWNoIHBvaW50IHdlIGNhbiBjYWxsXG4gICAgICAgIC8vIGVuZ2luZSBydW5LZXJuZWwoLi4uLCBTb3RmcGx1cywgLi4uKSBkaXJlY3RseS5cbiAgICAgICAgY29uc3QgdmFsdWUgPSBuZWcoc29mdHBsdXMobmVnKHgpKSk7XG4gICAgICAgIGNvbnN0IGdyYWRGdW5jID0gKGR5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkZXJYID0gbXVsKGR5LCBzaWdtb2lkKG5lZyh4KSkpO1xuICAgICAgICAgICAgcmV0dXJuIGRlclg7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB7IHZhbHVlLCBncmFkRnVuYyB9O1xuICAgIH0pO1xuICAgIHJldHVybiBjdXN0b21PcCgkeCk7XG59XG5leHBvcnQgY29uc3QgbG9nU2lnbW9pZCA9IG9wKHsgbG9nU2lnbW9pZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sb2dfc2lnbW9pZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjdXN0b21HcmFkIH0gZnJvbSAnLi4vZ3JhZGllbnRzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBjYXN0IH0gZnJvbSAnLi9jYXN0JztcbmltcG9ydCB7IGV4cCB9IGZyb20gJy4vZXhwJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nJztcbmltcG9ydCB7IG1heCB9IGZyb20gJy4vbWF4JztcbmltcG9ydCB7IG11bCB9IGZyb20gJy4vbXVsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgc3ViIH0gZnJvbSAnLi9zdWInO1xuaW1wb3J0IHsgc3VtIH0gZnJvbSAnLi9zdW0nO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgbG9nIHNvZnRtYXguXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICpcbiAqIGEubG9nU29mdG1heCgpLnByaW50KCk7ICAvLyBvciB0Zi5sb2dTb2Z0bWF4KGEpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjJkKFsyLCA0LCA2LCAxLCAyLCAzXSwgWzIsIDNdKTtcbiAqXG4gKiBhLmxvZ1NvZnRtYXgoKS5wcmludCgpOyAgLy8gb3IgdGYubG9nU29mdG1heChhKVxuICogYGBgXG4gKlxuICogQHBhcmFtIGxvZ2l0cyBUaGUgbG9naXRzIGFycmF5LlxuICogQHBhcmFtIGF4aXMgVGhlIGRpbWVuc2lvbiBzb2Z0bWF4IHdvdWxkIGJlIHBlcmZvcm1lZCBvbi4gRGVmYXVsdHMgdG8gYC0xYFxuICogICAgIHdoaWNoIGluZGljYXRlcyB0aGUgbGFzdCBkaW1lbnNpb24uXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTm9ybWFsaXphdGlvbid9XG4gKi9cbmZ1bmN0aW9uIGxvZ1NvZnRtYXhfKGxvZ2l0cywgYXhpcyA9IC0xKSB7XG4gICAgY29uc3QgJGxvZ2l0cyA9IGNvbnZlcnRUb1RlbnNvcihsb2dpdHMsICdsb2dpdHMnLCAnbG9nU29mdG1heCcpO1xuICAgIGlmIChheGlzID09PSAtMSkge1xuICAgICAgICBheGlzID0gJGxvZ2l0cy5yYW5rIC0gMTtcbiAgICB9XG4gICAgaWYgKGF4aXMgIT09ICRsb2dpdHMucmFuayAtIDEpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJ0xvZyBTb2Z0bWF4IGFsb25nIGEgbm9uLWxhc3QgZGltZW5zaW9uIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiAnICtcbiAgICAgICAgICAgIGBMb2dpdHMgd2FzIHJhbmsgJHskbG9naXRzLnJhbmt9IGFuZCBheGlzIHdhcyAke2F4aXN9YCk7XG4gICAgfVxuICAgIC8vIGNvbnN0IGZvcndhcmQ6IEZvcndhcmRGdW5jPFRlbnNvcj4gPSAoYmFja2VuZCwgc2F2ZSkgPT4ge1xuICAgIC8vICAgY29uc3Qga2VlcERpbXMgPSB0cnVlO1xuICAgIC8vICAgY29uc3QgeE1heCA9IG1heChsb2dpdHMsIGF4aXMsIHRydWUpO1xuICAgIC8vICAgY29uc3Qgc2hpZnRlZCA9IHN1Yihsb2dpdHMsIHhNYXgpO1xuICAgIC8vICAgY29uc3QgdmFsdWUgPVxuICAgIC8vICAgICAgIHN1YihjYXN0KHNoaWZ0ZWQsICdmbG9hdDMyJyksIGxvZyhzdW0oZXhwKHNoaWZ0ZWQpLCBheGlzLFxuICAgIC8vICAgICAgIGtlZXBEaW1zKSkpO1xuICAgIC8vICAgc2F2ZShbdmFsdWVdKTtcbiAgICAvLyAgIHJldHVybiB2YWx1ZTtcbiAgICAvLyB9O1xuICAgIC8vIFVzZSBhIGN1c3RvbSBncmFkaWVudCBmb3IgbnVtZXJpY2FsIHN0YWJpbGl0eS5cbiAgICBjb25zdCBjdXN0b21PcCA9IGN1c3RvbUdyYWQoKGxvZ2l0cywgc2F2ZSkgPT4ge1xuICAgICAgICBjb25zdCBrZWVwRGltcyA9IHRydWU7XG4gICAgICAgIGNvbnN0IHhNYXggPSBtYXgobG9naXRzLCBheGlzLCB0cnVlKTtcbiAgICAgICAgY29uc3Qgc2hpZnRlZCA9IHN1Yihsb2dpdHMsIHhNYXgpO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHN1YihjYXN0KHNoaWZ0ZWQsICdmbG9hdDMyJyksIGxvZyhzdW0oZXhwKHNoaWZ0ZWQpLCBheGlzLCBrZWVwRGltcykpKTtcbiAgICAgICAgc2F2ZShbdmFsdWVdKTtcbiAgICAgICAgY29uc3QgZ3JhZEZ1bmMgPSAoZHksIHNhdmVkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBbdmFsdWVdID0gc2F2ZWQ7XG4gICAgICAgICAgICBjb25zdCBrZWVwRGltcyA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCBzb2Z0bWF4ID0gZXhwKHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiBzdWIoZHksIG11bChzdW0oZHksIGF4aXMsIGtlZXBEaW1zKSwgc29mdG1heCkpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4geyB2YWx1ZSwgZ3JhZEZ1bmMgfTtcbiAgICB9KTtcbiAgICByZXR1cm4gY3VzdG9tT3AoJGxvZ2l0cyk7XG4gICAgLy8gVE9ETyBVc2UgRW5naW5lLnJ1bktlcm5lbCB3aGVuIENQVS9XZWJHTC9XQVNNIGJhY2tlbmRzIGltcGxlbWVudCB0aGlzLlxuICAgIC8vIGNvbnN0IGlucHV0czogTG9nU29mdG1heElucHV0cyA9IHtsb2dpdHM6ICRsb2dpdHN9O1xuICAgIC8vIGNvbnN0IGF0dHJzOiBMb2dTb2Z0bWF4QXR0cnMgPSB7YXhpc307XG4gICAgLy8gcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgLy8gICAgICAgICAgICBMb2dTb2Z0bWF4LCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsXG4gICAgLy8gICAgICAgICAgICBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApO1xufVxuZXhwb3J0IGNvbnN0IGxvZ1NvZnRtYXggPSBvcCh7IGxvZ1NvZnRtYXhfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG9nX3NvZnRtYXguanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IHBhcnNlQXhpc1BhcmFtIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBhZGQgfSBmcm9tICcuL2FkZCc7XG5pbXBvcnQgeyBleHBhbmRTaGFwZVRvS2VlcERpbSB9IGZyb20gJy4vYXhpc191dGlsJztcbmltcG9ydCB7IGV4cCB9IGZyb20gJy4vZXhwJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nJztcbmltcG9ydCB7IG1heCB9IGZyb20gJy4vbWF4JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vcmVzaGFwZSc7XG5pbXBvcnQgeyBzdWIgfSBmcm9tICcuL3N1Yic7XG5pbXBvcnQgeyBzdW0gfSBmcm9tICcuL3N1bSc7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBsb2coc3VtKGV4cChlbGVtZW50cyBhY3Jvc3MgdGhlIHJlZHVjdGlvbiBkaW1lbnNpb25zKSkuXG4gKlxuICogUmVkdWNlcyB0aGUgaW5wdXQgYWxvbmcgdGhlIGRpbWVuc2lvbnMgZ2l2ZW4gaW4gYGF4aXNgLiBVbmxlc3MgYGtlZXBEaW1zYFxuICogaXMgdHJ1ZSwgdGhlIHJhbmsgb2YgdGhlIGFycmF5IGlzIHJlZHVjZWQgYnkgMSBmb3IgZWFjaCBlbnRyeSBpbiBgYXhpc2AuXG4gKiBJZiBga2VlcERpbXNgIGlzIHRydWUsIHRoZSByZWR1Y2VkIGRpbWVuc2lvbnMgYXJlIHJldGFpbmVkIHdpdGggbGVuZ3RoIDEuXG4gKiBJZiBgYXhpc2AgaGFzIG5vIGVudHJpZXMsIGFsbCBkaW1lbnNpb25zIGFyZSByZWR1Y2VkLCBhbmQgYW4gYXJyYXkgd2l0aCBhXG4gKiBzaW5nbGUgZWxlbWVudCBpcyByZXR1cm5lZC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKlxuICogeC5sb2dTdW1FeHAoKS5wcmludCgpOyAgLy8gb3IgdGYubG9nU3VtRXhwKHgpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjJkKFsxLCAyLCAzLCA0XSwgWzIsIDJdKTtcbiAqXG4gKiBjb25zdCBheGlzID0gMTtcbiAqIHgubG9nU3VtRXhwKGF4aXMpLnByaW50KCk7ICAvLyBvciB0Zi5sb2dTdW1FeHAoYSwgYXhpcylcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBheGlzIFRoZSBkaW1lbnNpb24ocykgdG8gcmVkdWNlLiBJZiBudWxsICh0aGUgZGVmYXVsdCksXG4gKiAgICAgcmVkdWNlcyBhbGwgZGltZW5zaW9ucy5cbiAqIEBwYXJhbSBrZWVwRGltcyBJZiB0cnVlLCByZXRhaW5zIHJlZHVjZWQgZGltZW5zaW9ucyB3aXRoIGxlbmd0aFxuICogICAgIG9mIDEuIERlZmF1bHRzIHRvIGZhbHNlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1JlZHVjdGlvbid9XG4gKi9cbmZ1bmN0aW9uIGxvZ1N1bUV4cF8oeCwgYXhpcyA9IG51bGwsIGtlZXBEaW1zID0gZmFsc2UpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdsb2dTdW1FeHAnKTtcbiAgICBjb25zdCBheGVzID0gcGFyc2VBeGlzUGFyYW0oYXhpcywgJHguc2hhcGUpO1xuICAgIGNvbnN0IHhNYXggPSBtYXgoJHgsIGF4ZXMsIHRydWUgLyoga2VlcERpbXMgKi8pO1xuICAgIGNvbnN0IGEgPSBzdWIoJHgsIHhNYXgpO1xuICAgIGNvbnN0IGIgPSBleHAoYSk7XG4gICAgY29uc3QgYyA9IHN1bShiLCBheGVzKTtcbiAgICBjb25zdCBkID0gbG9nKGMpO1xuICAgIGNvbnN0IHJlcyA9IGFkZChyZXNoYXBlKHhNYXgsIGQuc2hhcGUpLCBkKTtcbiAgICBpZiAoa2VlcERpbXMpIHtcbiAgICAgICAgY29uc3QgbmV3U2hhcGUgPSBleHBhbmRTaGFwZVRvS2VlcERpbShyZXMuc2hhcGUsIGF4ZXMpO1xuICAgICAgICByZXR1cm4gcmVzaGFwZShyZXMsIG5ld1NoYXBlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydCBjb25zdCBsb2dTdW1FeHAgPSBvcCh7IGxvZ1N1bUV4cF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sb2dfc3VtX2V4cC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTG9naWNhbEFuZCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUgfSBmcm9tICcuL2Jyb2FkY2FzdF91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSB0cnV0aCB2YWx1ZSBvZiBgYSBBTkQgYmAgZWxlbWVudC13aXNlLiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbZmFsc2UsIGZhbHNlLCB0cnVlLCB0cnVlXSwgJ2Jvb2wnKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbZmFsc2UsIHRydWUsIGZhbHNlLCB0cnVlXSwgJ2Jvb2wnKTtcbiAqXG4gKiBhLmxvZ2ljYWxBbmQoYikucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBpbnB1dCB0ZW5zb3IuIE11c3QgYmUgb2YgZHR5cGUgYm9vbC5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgaW5wdXQgdGVuc29yLiBNdXN0IGJlIG9mIGR0eXBlIGJvb2wuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTG9naWNhbCd9XG4gKi9cbmZ1bmN0aW9uIGxvZ2ljYWxBbmRfKGEsIGIpIHtcbiAgICBjb25zdCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdsb2dpY2FsQW5kJywgJ2Jvb2wnKTtcbiAgICBjb25zdCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdsb2dpY2FsQW5kJywgJ2Jvb2wnKTtcbiAgICBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSgkYS5zaGFwZSwgJGIuc2hhcGUpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgYTogJGEsIGI6ICRiIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoTG9naWNhbEFuZCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBsb2dpY2FsQW5kID0gb3AoeyBsb2dpY2FsQW5kXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxvZ2ljYWxfYW5kLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBMb2dpY2FsTm90IH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV0dXJucyB0aGUgdHJ1dGggdmFsdWUgb2YgYE5PVCB4YCBlbGVtZW50LXdpc2UuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbZmFsc2UsIHRydWVdLCAnYm9vbCcpO1xuICpcbiAqIGEubG9naWNhbE5vdCgpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLiBNdXN0IGJlIG9mIGR0eXBlICdib29sJy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdMb2dpY2FsJ31cbiAqL1xuZnVuY3Rpb24gbG9naWNhbE5vdF8oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2xvZ2ljYWxOb3QnLCAnYm9vbCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChMb2dpY2FsTm90LCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGxvZ2ljYWxOb3QgPSBvcCh7IGxvZ2ljYWxOb3RfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG9naWNhbF9ub3QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IExvZ2ljYWxPciB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUgfSBmcm9tICcuL2Jyb2FkY2FzdF91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSB0cnV0aCB2YWx1ZSBvZiBgYSBPUiBiYCBlbGVtZW50LXdpc2UuIFN1cHBvcnRzIGJyb2FkY2FzdGluZy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFtmYWxzZSwgZmFsc2UsIHRydWUsIHRydWVdLCAnYm9vbCcpO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFtmYWxzZSwgdHJ1ZSwgZmFsc2UsIHRydWVdLCAnYm9vbCcpO1xuICpcbiAqIGEubG9naWNhbE9yKGIpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBpbnB1dCB0ZW5zb3IuIE11c3QgYmUgb2YgZHR5cGUgYm9vbC5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgaW5wdXQgdGVuc29yLiBNdXN0IGJlIG9mIGR0eXBlIGJvb2wuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTG9naWNhbCd9XG4gKi9cbmZ1bmN0aW9uIGxvZ2ljYWxPcl8oYSwgYikge1xuICAgIGNvbnN0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ2xvZ2ljYWxPcicsICdib29sJyk7XG4gICAgY29uc3QgJGIgPSBjb252ZXJ0VG9UZW5zb3IoYiwgJ2InLCAnbG9naWNhbE9yJywgJ2Jvb2wnKTtcbiAgICBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSgkYS5zaGFwZSwgJGIuc2hhcGUpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgYTogJGEsIGI6ICRiIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoTG9naWNhbE9yLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGxvZ2ljYWxPciA9IG9wKHsgbG9naWNhbE9yXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxvZ2ljYWxfb3IuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlIH0gZnJvbSAnLi9icm9hZGNhc3RfdXRpbCc7XG5pbXBvcnQgeyBsb2dpY2FsQW5kIH0gZnJvbSAnLi9sb2dpY2FsX2FuZCc7XG5pbXBvcnQgeyBsb2dpY2FsTm90IH0gZnJvbSAnLi9sb2dpY2FsX25vdCc7XG5pbXBvcnQgeyBsb2dpY2FsT3IgfSBmcm9tICcuL2xvZ2ljYWxfb3InO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIFJldHVybnMgdGhlIHRydXRoIHZhbHVlIG9mIGBhIFhPUiBiYCBlbGVtZW50LXdpc2UuIFN1cHBvcnRzIGJyb2FkY2FzdGluZy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFtmYWxzZSwgZmFsc2UsIHRydWUsIHRydWVdLCAnYm9vbCcpO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFtmYWxzZSwgdHJ1ZSwgZmFsc2UsIHRydWVdLCAnYm9vbCcpO1xuICpcbiAqIGEubG9naWNhbFhvcihiKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGEgVGhlIGZpcnN0IGlucHV0IHRlbnNvci4gTXVzdCBiZSBvZiBkdHlwZSBib29sLlxuICogQHBhcmFtIGIgVGhlIHNlY29uZCBpbnB1dCB0ZW5zb3IuIE11c3QgYmUgb2YgZHR5cGUgYm9vbC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdMb2dpY2FsJ31cbiAqL1xuZnVuY3Rpb24gbG9naWNhbFhvcl8oYSwgYikge1xuICAgIGNvbnN0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ2xvZ2ljYWxYb3InLCAnYm9vbCcpO1xuICAgIGNvbnN0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ2xvZ2ljYWxYb3InLCAnYm9vbCcpO1xuICAgIGFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKCRhLnNoYXBlLCAkYi5zaGFwZSk7XG4gICAgLy8geCBeIHkgPSAoeCB8IHkpICYgfih4ICYgeSlcbiAgICByZXR1cm4gbG9naWNhbEFuZChsb2dpY2FsT3IoYSwgYiksIGxvZ2ljYWxOb3QobG9naWNhbEFuZChhLCBiKSkpO1xufVxuZXhwb3J0IGNvbnN0IGxvZ2ljYWxYb3IgPSBvcCh7IGxvZ2ljYWxYb3JfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG9naWNhbF94b3IuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuZXhwb3J0IHZhciBSZWR1Y3Rpb247XG4oZnVuY3Rpb24gKFJlZHVjdGlvbikge1xuICAgIFJlZHVjdGlvbltSZWR1Y3Rpb25bXCJOT05FXCJdID0gMF0gPSBcIk5PTkVcIjtcbiAgICBSZWR1Y3Rpb25bUmVkdWN0aW9uW1wiTUVBTlwiXSA9IDFdID0gXCJNRUFOXCI7XG4gICAgUmVkdWN0aW9uW1JlZHVjdGlvbltcIlNVTVwiXSA9IDJdID0gXCJTVU1cIjtcbiAgICBSZWR1Y3Rpb25bUmVkdWN0aW9uW1wiU1VNX0JZX05PTlpFUk9fV0VJR0hUU1wiXSA9IDNdID0gXCJTVU1fQllfTk9OWkVST19XRUlHSFRTXCI7XG59KShSZWR1Y3Rpb24gfHwgKFJlZHVjdGlvbiA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sb3NzX29wc191dGlscy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0U2hhcGVzTWF0Y2ggfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IGFicyB9IGZyb20gJy4uL2Ficyc7XG5pbXBvcnQgeyBSZWR1Y3Rpb24gfSBmcm9tICcuLi9sb3NzX29wc191dGlscyc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4uL29wZXJhdGlvbic7XG5pbXBvcnQgeyBzdWIgfSBmcm9tICcuLi9zdWInO1xuaW1wb3J0IHsgY29tcHV0ZVdlaWdodGVkTG9zcyB9IGZyb20gJy4vY29tcHV0ZV93ZWlnaHRlZF9sb3NzJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIGFic29sdXRlIGRpZmZlcmVuY2UgbG9zcyBiZXR3ZWVuIHR3byB0ZW5zb3JzLlxuICpcbiAqIEBwYXJhbSBsYWJlbHMgVGhlIGdyb3VuZCB0cnV0aCBvdXRwdXQgdGVuc29yLCBzYW1lIGRpbWVuc2lvbnMgYXNcbiAqICAgICdwcmVkaWN0aW9ucycuXG4gKiBAcGFyYW0gcHJlZGljdGlvbnMgVGhlIHByZWRpY3RlZCBvdXRwdXRzLlxuICogQHBhcmFtIHdlaWdodHMgVGVuc29yIHdob3NlIHJhbmsgaXMgZWl0aGVyIDAsIG9yIHRoZSBzYW1lIHJhbmsgYXNcbiAqICAgIGBsYWJlbHNgLCBhbmQgbXVzdCBiZSBicm9hZGNhc3RhYmxlIHRvIGBsYWJlbHNgIChpLmUuLCBhbGwgZGltZW5zaW9uc1xuICogICAgbXVzdCBiZSBlaXRoZXIgYDFgLCBvciB0aGUgc2FtZSBhcyB0aGUgY29ycmVzcG9uZGluZyBgbG9zc2VzYFxuICogICAgZGltZW5zaW9uKS5cbiAqIEBwYXJhbSByZWR1Y3Rpb24gVHlwZSBvZiByZWR1Y3Rpb24gdG8gYXBwbHkgdG8gbG9zcy4gU2hvdWxkIGJlIG9mIHR5cGVcbiAqICAgIGBSZWR1Y3Rpb25gXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0xvc3NlcycsIG5hbWVzcGFjZTogJ2xvc3Nlcyd9XG4gKi9cbmZ1bmN0aW9uIGFic29sdXRlRGlmZmVyZW5jZV8obGFiZWxzLCBwcmVkaWN0aW9ucywgd2VpZ2h0cywgcmVkdWN0aW9uID0gUmVkdWN0aW9uLlNVTV9CWV9OT05aRVJPX1dFSUdIVFMpIHtcbiAgICBjb25zdCAkbGFiZWxzID0gY29udmVydFRvVGVuc29yKGxhYmVscywgJ2xhYmVscycsICdhYnNvbHV0ZURpZmZlcmVuY2UnKTtcbiAgICBjb25zdCAkcHJlZGljdGlvbnMgPSBjb252ZXJ0VG9UZW5zb3IocHJlZGljdGlvbnMsICdwcmVkaWN0aW9ucycsICdhYnNvbHV0ZURpZmZlcmVuY2UnKTtcbiAgICBsZXQgJHdlaWdodHMgPSBudWxsO1xuICAgIGlmICh3ZWlnaHRzICE9IG51bGwpIHtcbiAgICAgICAgJHdlaWdodHMgPSBjb252ZXJ0VG9UZW5zb3Iod2VpZ2h0cywgJ3dlaWdodHMnLCAnYWJzb2x1dGVEaWZmZXJlbmNlJyk7XG4gICAgfVxuICAgIGFzc2VydFNoYXBlc01hdGNoKCRsYWJlbHMuc2hhcGUsICRwcmVkaWN0aW9ucy5zaGFwZSwgJ0Vycm9yIGluIGFic29sdXRlRGlmZmVyZW5jZTogJyk7XG4gICAgY29uc3QgbG9zc2VzID0gYWJzKHN1YigkbGFiZWxzLCAkcHJlZGljdGlvbnMpKTtcbiAgICByZXR1cm4gY29tcHV0ZVdlaWdodGVkTG9zcyhsb3NzZXMsICR3ZWlnaHRzLCByZWR1Y3Rpb24pO1xufVxuZXhwb3J0IGNvbnN0IGFic29sdXRlRGlmZmVyZW5jZSA9IG9wKHsgYWJzb2x1dGVEaWZmZXJlbmNlXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFic29sdXRlX2RpZmZlcmVuY2UuanMubWFwIiwiaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGNhc3QgfSBmcm9tICcuLi9jYXN0JztcbmltcG9ydCB7IGRpdiB9IGZyb20gJy4uL2Rpdic7XG5pbXBvcnQgeyBSZWR1Y3Rpb24gfSBmcm9tICcuLi9sb3NzX29wc191dGlscyc7XG5pbXBvcnQgeyBtZWFuIH0gZnJvbSAnLi4vbWVhbic7XG5pbXBvcnQgeyBtdWwgfSBmcm9tICcuLi9tdWwnO1xuaW1wb3J0IHsgbm90RXF1YWwgfSBmcm9tICcuLi9ub3RfZXF1YWwnO1xuaW1wb3J0IHsgb25lcyB9IGZyb20gJy4uL29uZXMnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgc2NhbGFyIH0gZnJvbSAnLi4vc2NhbGFyJztcbmltcG9ydCB7IHN1bSB9IGZyb20gJy4uL3N1bSc7XG4vKipcbiAqIENvbXB1dGVzIHRoZSB3ZWlnaHRlZCBsb3NzIGJldHdlZW4gdHdvIHRlbnNvcnMuXG4gKlxuICogQHBhcmFtIGxvc3NlcyBUZW5zb3Igb2Ygc2hhcGUgYFtiYXRjaF9zaXplLCBkMSwgLi4uIGROXWAuXG4gKiBAcGFyYW0gd2VpZ2h0cyBUZW5zb3Igd2hvc2UgcmFuayBpcyBlaXRoZXIgMCwgb3IgdGhlIHNhbWUgcmFuayBhc1xuICogICAgYGxvc3Nlc2AsIGFuZCBtdXN0IGJlIGJyb2FkY2FzdGFibGUgdG8gYGxvc3Nlc2AgKGkuZS4sIGFsbFxuICogICAgZGltZW5zaW9ucyBtdXN0IGJlIGVpdGhlciBgMWAsIG9yIHRoZSBzYW1lIGFzIHRoZSBjb3JyZXNwb25kaW5nXG4gKiAgICBgbG9zc2VzYCBkaW1lbnNpb24pLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdMb3NzZXMnLCBuYW1lc3BhY2U6ICdsb3NzZXMnfVxuICovXG5mdW5jdGlvbiBjb21wdXRlV2VpZ2h0ZWRMb3NzXyhsb3NzZXMsIHdlaWdodHMsIHJlZHVjdGlvbiA9IFJlZHVjdGlvbi5TVU1fQllfTk9OWkVST19XRUlHSFRTKSB7XG4gICAgY29uc3QgJGxvc3NlcyA9IGNvbnZlcnRUb1RlbnNvcihsb3NzZXMsICdsb3NzZXMnLCAnY29tcHV0ZVdlaWdodGVkTG9zcycpO1xuICAgIGxldCAkd2VpZ2h0cyA9IG51bGw7XG4gICAgaWYgKHdlaWdodHMgIT0gbnVsbCkge1xuICAgICAgICAkd2VpZ2h0cyA9IGNvbnZlcnRUb1RlbnNvcih3ZWlnaHRzLCAnd2VpZ2h0cycsICdjb21wdXRlV2VpZ2h0ZWRMb3NzJyk7XG4gICAgfVxuICAgIGNvbnN0IHdlaWdodGVkTG9zcyA9ICgkd2VpZ2h0cyA9PSBudWxsKSA/ICRsb3NzZXMgOiBtdWwoJGxvc3NlcywgJHdlaWdodHMpO1xuICAgIGlmIChyZWR1Y3Rpb24gPT09IFJlZHVjdGlvbi5OT05FKSB7XG4gICAgICAgIHJldHVybiB3ZWlnaHRlZExvc3M7XG4gICAgfVxuICAgIGlmIChyZWR1Y3Rpb24gPT09IFJlZHVjdGlvbi5TVU0pIHtcbiAgICAgICAgcmV0dXJuIHN1bSh3ZWlnaHRlZExvc3MpO1xuICAgIH1cbiAgICBpZiAocmVkdWN0aW9uID09PSBSZWR1Y3Rpb24uTUVBTikge1xuICAgICAgICBpZiAoJHdlaWdodHMgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG1lYW4od2VpZ2h0ZWRMb3NzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGJyb2FkY2FzdEZhY3RvciA9ICRsb3NzZXMuc2l6ZSAvICR3ZWlnaHRzLnNpemU7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBkaXYoc3VtKHdlaWdodGVkTG9zcyksIHN1bSgkd2VpZ2h0cykpO1xuICAgICAgICAgICAgcmV0dXJuIGJyb2FkY2FzdEZhY3RvciA+IDEgPyBkaXYocmVzdWx0LCBzY2FsYXIoYnJvYWRjYXN0RmFjdG9yKSkgOlxuICAgICAgICAgICAgICAgIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVkdWN0aW9uID09PSBSZWR1Y3Rpb24uU1VNX0JZX05PTlpFUk9fV0VJR0hUUykge1xuICAgICAgICBpZiAoJHdlaWdodHMgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGRpdihzdW0od2VpZ2h0ZWRMb3NzKSwgc2NhbGFyKCRsb3NzZXMuc2l6ZSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgYnJvYWRjYXN0ZWRXZWlnaHRzID0gbXVsKCR3ZWlnaHRzLCBvbmVzKCRsb3NzZXMuc2hhcGUpKTtcbiAgICAgICAgICAgIGNvbnN0IG51bU5vblplcm9zID0gY2FzdChzdW0obm90RXF1YWwoYnJvYWRjYXN0ZWRXZWlnaHRzLCBzY2FsYXIoMCkpKSwgJ2Zsb2F0MzInKTtcbiAgICAgICAgICAgIHJldHVybiBkaXYoc3VtKHdlaWdodGVkTG9zcyksIG51bU5vblplcm9zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBFcnJvcihgVW5rbm93biByZWR1Y3Rpb246ICR7cmVkdWN0aW9ufWApO1xufVxuZXhwb3J0IGNvbnN0IGNvbXB1dGVXZWlnaHRlZExvc3MgPSBvcCh7IGNvbXB1dGVXZWlnaHRlZExvc3NfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29tcHV0ZV93ZWlnaHRlZF9sb3NzLmpzLm1hcCIsImltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnRTaGFwZXNNYXRjaCB9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHsgUmVkdWN0aW9uIH0gZnJvbSAnLi4vbG9zc19vcHNfdXRpbHMnO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi4vbXVsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHNjYWxhciB9IGZyb20gJy4uL3NjYWxhcic7XG5pbXBvcnQgeyBzdWIgfSBmcm9tICcuLi9zdWInO1xuaW1wb3J0IHsgc3VtIH0gZnJvbSAnLi4vc3VtJztcbmltcG9ydCB7IGNvbXB1dGVXZWlnaHRlZExvc3MgfSBmcm9tICcuL2NvbXB1dGVfd2VpZ2h0ZWRfbG9zcyc7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBjb3NpbmUgZGlzdGFuY2UgbG9zcyBiZXR3ZWVuIHR3byB0ZW5zb3JzLlxuICpcbiAqIEBwYXJhbSBsYWJlbHMgVGhlIGdyb3VuZCB0cnV0aCBvdXRwdXQgdGVuc29yLCBzYW1lIGRpbWVuc2lvbnMgYXNcbiAqICAgICdwcmVkaWN0aW9ucycuXG4gKiBAcGFyYW0gcHJlZGljdGlvbnMgVGhlIHByZWRpY3RlZCBvdXRwdXRzLlxuICogQHBhcmFtIGF4aXMgVGhlIGRpbWVuc2lvbiBhbG9uZyB3aGljaCB0aGUgY29zaW5lIGRpc3RhbmNlIGlzIGNvbXB1dGVkLlxuICogQHBhcmFtIHdlaWdodHMgVGVuc29yIHdob3NlIHJhbmsgaXMgZWl0aGVyIDAsIG9yIHRoZSBzYW1lIHJhbmsgYXNcbiAqICAgIGBsYWJlbHNgLCBhbmQgbXVzdCBiZSBicm9hZGNhc3RhYmxlIHRvIGBsYWJlbHNgIChpLmUuLCBhbGwgZGltZW5zaW9uc1xuICogICAgbXVzdCBiZSBlaXRoZXIgYDFgLCBvciB0aGUgc2FtZSBhcyB0aGUgY29ycmVzcG9uZGluZyBgbG9zc2VzYFxuICogICAgZGltZW5zaW9uKS5cbiAqIEBwYXJhbSByZWR1Y3Rpb24gVHlwZSBvZiByZWR1Y3Rpb24gdG8gYXBwbHkgdG8gbG9zcy4gU2hvdWxkIGJlIG9mIHR5cGVcbiAqICAgIGBSZWR1Y3Rpb25gXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0xvc3NlcycsIG5hbWVzcGFjZTogJ2xvc3Nlcyd9XG4gKi9cbmZ1bmN0aW9uIGNvc2luZURpc3RhbmNlXyhsYWJlbHMsIHByZWRpY3Rpb25zLCBheGlzLCB3ZWlnaHRzLCByZWR1Y3Rpb24gPSBSZWR1Y3Rpb24uU1VNX0JZX05PTlpFUk9fV0VJR0hUUykge1xuICAgIGNvbnN0ICRsYWJlbHMgPSBjb252ZXJ0VG9UZW5zb3IobGFiZWxzLCAnbGFiZWxzJywgJ2Nvc2luZURpc3RhbmNlJyk7XG4gICAgY29uc3QgJHByZWRpY3Rpb25zID0gY29udmVydFRvVGVuc29yKHByZWRpY3Rpb25zLCAncHJlZGljdGlvbnMnLCAnY29zaW5lRGlzdGFuY2UnKTtcbiAgICBsZXQgJHdlaWdodHMgPSBudWxsO1xuICAgIGlmICh3ZWlnaHRzICE9IG51bGwpIHtcbiAgICAgICAgJHdlaWdodHMgPSBjb252ZXJ0VG9UZW5zb3Iod2VpZ2h0cywgJ3dlaWdodHMnLCAnY29zaW5lRGlzdGFuY2UnKTtcbiAgICB9XG4gICAgYXNzZXJ0U2hhcGVzTWF0Y2goJGxhYmVscy5zaGFwZSwgJHByZWRpY3Rpb25zLnNoYXBlLCAnRXJyb3IgaW4gY29zaW5lRGlzdGFuY2U6ICcpO1xuICAgIGNvbnN0IG9uZSA9IHNjYWxhcigxKTtcbiAgICBjb25zdCBsb3NzZXMgPSBzdWIob25lLCBzdW0obXVsKCRsYWJlbHMsICRwcmVkaWN0aW9ucyksIGF4aXMsIHRydWUpKTtcbiAgICByZXR1cm4gY29tcHV0ZVdlaWdodGVkTG9zcyhsb3NzZXMsICR3ZWlnaHRzLCByZWR1Y3Rpb24pO1xufVxuZXhwb3J0IGNvbnN0IGNvc2luZURpc3RhbmNlID0gb3AoeyBjb3NpbmVEaXN0YW5jZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb3NpbmVfZGlzdGFuY2UuanMubWFwIiwiaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGFzc2VydFNoYXBlc01hdGNoIH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgeyBSZWR1Y3Rpb24gfSBmcm9tICcuLi9sb3NzX29wc191dGlscyc7XG5pbXBvcnQgeyBtdWwgfSBmcm9tICcuLi9tdWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVsdSB9IGZyb20gJy4uL3JlbHUnO1xuaW1wb3J0IHsgc2NhbGFyIH0gZnJvbSAnLi4vc2NhbGFyJztcbmltcG9ydCB7IHN1YiB9IGZyb20gJy4uL3N1Yic7XG5pbXBvcnQgeyBjb21wdXRlV2VpZ2h0ZWRMb3NzIH0gZnJvbSAnLi9jb21wdXRlX3dlaWdodGVkX2xvc3MnO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgSGluZ2UgbG9zcyBiZXR3ZWVuIHR3byB0ZW5zb3JzLlxuICpcbiAqIEBwYXJhbSBsYWJlbHMgVGhlIGdyb3VuZCB0cnV0aCBvdXRwdXQgdGVuc29yLCBzYW1lIGRpbWVuc2lvbnMgYXNcbiAqICAgICdwcmVkaWN0aW9ucycuXG4gKiBAcGFyYW0gcHJlZGljdGlvbnMgVGhlIHByZWRpY3RlZCBvdXRwdXRzLlxuICogQHBhcmFtIHdlaWdodHMgVGVuc29yIHdob3NlIHJhbmsgaXMgZWl0aGVyIDAsIG9yIHRoZSBzYW1lIHJhbmsgYXNcbiAqICAgIGBsYWJlbHNgLCBhbmQgbXVzdCBiZSBicm9hZGNhc3RhYmxlIHRvIGBsYWJlbHNgIChpLmUuLCBhbGwgZGltZW5zaW9uc1xuICogICAgbXVzdCBiZSBlaXRoZXIgYDFgLCBvciB0aGUgc2FtZSBhcyB0aGUgY29ycmVzcG9uZGluZyBgbG9zc2VzYFxuICogICAgZGltZW5zaW9uKS5cbiAqIEBwYXJhbSByZWR1Y3Rpb24gVHlwZSBvZiByZWR1Y3Rpb24gdG8gYXBwbHkgdG8gbG9zcy4gU2hvdWxkIGJlIG9mIHR5cGVcbiAqICAgIGBSZWR1Y3Rpb25gXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0xvc3NlcycsIG5hbWVzcGFjZTogJ2xvc3Nlcyd9XG4gKi9cbmZ1bmN0aW9uIGhpbmdlTG9zc18obGFiZWxzLCBwcmVkaWN0aW9ucywgd2VpZ2h0cywgcmVkdWN0aW9uID0gUmVkdWN0aW9uLlNVTV9CWV9OT05aRVJPX1dFSUdIVFMpIHtcbiAgICBsZXQgJGxhYmVscyA9IGNvbnZlcnRUb1RlbnNvcihsYWJlbHMsICdsYWJlbHMnLCAnaGluZ2VMb3NzJyk7XG4gICAgY29uc3QgJHByZWRpY3Rpb25zID0gY29udmVydFRvVGVuc29yKHByZWRpY3Rpb25zLCAncHJlZGljdGlvbnMnLCAnaGluZ2VMb3NzJyk7XG4gICAgbGV0ICR3ZWlnaHRzID0gbnVsbDtcbiAgICBpZiAod2VpZ2h0cyAhPSBudWxsKSB7XG4gICAgICAgICR3ZWlnaHRzID0gY29udmVydFRvVGVuc29yKHdlaWdodHMsICd3ZWlnaHRzJywgJ2hpbmdlTG9zcycpO1xuICAgIH1cbiAgICBhc3NlcnRTaGFwZXNNYXRjaCgkbGFiZWxzLnNoYXBlLCAkcHJlZGljdGlvbnMuc2hhcGUsICdFcnJvciBpbiBoaW5nZUxvc3M6ICcpO1xuICAgIGNvbnN0IG9uZSA9IHNjYWxhcigxKTtcbiAgICAvLyBDb252ZXJ0IGJpbmFyeSBsYWJlbHMgdG8gKC0xLCAxKVxuICAgICRsYWJlbHMgPSBzdWIobXVsKHNjYWxhcigyKSwgJGxhYmVscyksIG9uZSk7XG4gICAgY29uc3QgbG9zc2VzID0gcmVsdShzdWIob25lLCBtdWwoJGxhYmVscywgJHByZWRpY3Rpb25zKSkpO1xuICAgIHJldHVybiBjb21wdXRlV2VpZ2h0ZWRMb3NzKGxvc3NlcywgJHdlaWdodHMsIHJlZHVjdGlvbik7XG59XG5leHBvcnQgY29uc3QgaGluZ2VMb3NzID0gb3AoeyBoaW5nZUxvc3NfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGluZ2VfbG9zcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0U2hhcGVzTWF0Y2ggfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IGFicyB9IGZyb20gJy4uL2Ficyc7XG5pbXBvcnQgeyBhZGQgfSBmcm9tICcuLi9hZGQnO1xuaW1wb3J0IHsgUmVkdWN0aW9uIH0gZnJvbSAnLi4vbG9zc19vcHNfdXRpbHMnO1xuaW1wb3J0IHsgbWluaW11bSB9IGZyb20gJy4uL21pbmltdW0nO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi4vbXVsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHNjYWxhciB9IGZyb20gJy4uL3NjYWxhcic7XG5pbXBvcnQgeyBzcXVhcmUgfSBmcm9tICcuLi9zcXVhcmUnO1xuaW1wb3J0IHsgc3ViIH0gZnJvbSAnLi4vc3ViJztcbmltcG9ydCB7IGNvbXB1dGVXZWlnaHRlZExvc3MgfSBmcm9tICcuL2NvbXB1dGVfd2VpZ2h0ZWRfbG9zcyc7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBodWJlciBsb3NzIGJldHdlZW4gdHdvIHRlbnNvcnMuXG4gKlxuICogQHBhcmFtIGxhYmVscyBUaGUgZ3JvdW5kIHRydXRoIG91dHB1dCB0ZW5zb3IsIHNhbWUgZGltZW5zaW9ucyBhc1xuICogICAgJ3ByZWRpY3Rpb25zJy5cbiAqIEBwYXJhbSBwcmVkaWN0aW9ucyBUaGUgcHJlZGljdGVkIG91dHB1dHMuXG4gKiBAcGFyYW0gd2VpZ2h0cyBUZW5zb3Igd2hvc2UgcmFuayBpcyBlaXRoZXIgMCwgb3IgdGhlIHNhbWUgcmFuayBhc1xuICogICAgYGxhYmVsc2AsIGFuZCBtdXN0IGJlIGJyb2FkY2FzdGFibGUgdG8gYGxhYmVsc2AgKGkuZS4sIGFsbCBkaW1lbnNpb25zXG4gKiAgICBtdXN0IGJlIGVpdGhlciBgMWAsIG9yIHRoZSBzYW1lIGFzIHRoZSBjb3JyZXNwb25kaW5nIGBsb3NzZXNgXG4gKiAgICBkaW1lbnNpb24pLlxuICogQHBhcmFtIGRlbHRhIFBvaW50IHdoZXJlIGh1YmVyIGxvc3MgY2hhbmdlcyBmcm9tIHF1YWRyYXRpYyB0byBsaW5lYXIuXG4gKiBAcGFyYW0gcmVkdWN0aW9uIFR5cGUgb2YgcmVkdWN0aW9uIHRvIGFwcGx5IHRvIGxvc3MuIFNob3VsZCBiZSBvZiB0eXBlXG4gKiAgICBgUmVkdWN0aW9uYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVHJhaW5pbmcnLCBzdWJoZWFkaW5nOiAnTG9zc2VzJywgbmFtZXNwYWNlOiAnbG9zc2VzJ31cbiAqL1xuZnVuY3Rpb24gaHViZXJMb3NzXyhsYWJlbHMsIHByZWRpY3Rpb25zLCB3ZWlnaHRzLCBkZWx0YSA9IDEuMCwgcmVkdWN0aW9uID0gUmVkdWN0aW9uLlNVTV9CWV9OT05aRVJPX1dFSUdIVFMpIHtcbiAgICBjb25zdCAkbGFiZWxzID0gY29udmVydFRvVGVuc29yKGxhYmVscywgJ2xhYmVscycsICdodWJlckxvc3MnKTtcbiAgICBjb25zdCAkcHJlZGljdGlvbnMgPSBjb252ZXJ0VG9UZW5zb3IocHJlZGljdGlvbnMsICdwcmVkaWN0aW9ucycsICdodWJlckxvc3MnKTtcbiAgICBsZXQgJHdlaWdodHMgPSBudWxsO1xuICAgIGlmICh3ZWlnaHRzICE9IG51bGwpIHtcbiAgICAgICAgJHdlaWdodHMgPSBjb252ZXJ0VG9UZW5zb3Iod2VpZ2h0cywgJ3dlaWdodHMnLCAnaHViZXJMb3NzJyk7XG4gICAgfVxuICAgIGFzc2VydFNoYXBlc01hdGNoKCRsYWJlbHMuc2hhcGUsICRwcmVkaWN0aW9ucy5zaGFwZSwgJ0Vycm9yIGluIGh1YmVyTG9zczogJyk7XG4gICAgY29uc3QgZGVsdGFTY2FsYXIgPSBzY2FsYXIoZGVsdGEpO1xuICAgIGNvbnN0IGVycm9yID0gYWJzKHN1YigkcHJlZGljdGlvbnMsICRsYWJlbHMpKTtcbiAgICBjb25zdCBxdWFkcmF0aWMgPSBtaW5pbXVtKGVycm9yLCBkZWx0YVNjYWxhcik7XG4gICAgY29uc3QgbGluZWFyID0gc3ViKGVycm9yLCBxdWFkcmF0aWMpO1xuICAgIGNvbnN0IGxvc3NlcyA9IGFkZChtdWwoc2NhbGFyKDAuNSksIHNxdWFyZShxdWFkcmF0aWMpKSwgbXVsKGRlbHRhU2NhbGFyLCBsaW5lYXIpKTtcbiAgICByZXR1cm4gY29tcHV0ZVdlaWdodGVkTG9zcyhsb3NzZXMsICR3ZWlnaHRzLCByZWR1Y3Rpb24pO1xufVxuZXhwb3J0IGNvbnN0IGh1YmVyTG9zcyA9IG9wKHsgaHViZXJMb3NzXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWh1YmVyX2xvc3MuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGFzc2VydFNoYXBlc01hdGNoIH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgeyBhZGQgfSBmcm9tICcuLi9hZGQnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi4vbG9nJztcbmltcG9ydCB7IFJlZHVjdGlvbiB9IGZyb20gJy4uL2xvc3Nfb3BzX3V0aWxzJztcbmltcG9ydCB7IG11bCB9IGZyb20gJy4uL211bCc7XG5pbXBvcnQgeyBuZWcgfSBmcm9tICcuLi9uZWcnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgc2NhbGFyIH0gZnJvbSAnLi4vc2NhbGFyJztcbmltcG9ydCB7IHN1YiB9IGZyb20gJy4uL3N1Yic7XG5pbXBvcnQgeyBjb21wdXRlV2VpZ2h0ZWRMb3NzIH0gZnJvbSAnLi9jb21wdXRlX3dlaWdodGVkX2xvc3MnO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgbG9nIGxvc3MgYmV0d2VlbiB0d28gdGVuc29ycy5cbiAqXG4gKiBAcGFyYW0gbGFiZWxzIFRoZSBncm91bmQgdHJ1dGggb3V0cHV0IHRlbnNvciwgc2FtZSBkaW1lbnNpb25zIGFzXG4gKiAgICAncHJlZGljdGlvbnMnLlxuICogQHBhcmFtIHByZWRpY3Rpb25zIFRoZSBwcmVkaWN0ZWQgb3V0cHV0cy5cbiAqIEBwYXJhbSB3ZWlnaHRzIFRlbnNvciB3aG9zZSByYW5rIGlzIGVpdGhlciAwLCBvciB0aGUgc2FtZSByYW5rIGFzXG4gKiAgICBgbGFiZWxzYCwgYW5kIG11c3QgYmUgYnJvYWRjYXN0YWJsZSB0byBgbGFiZWxzYCAoaS5lLiwgYWxsIGRpbWVuc2lvbnNcbiAqICAgIG11c3QgYmUgZWl0aGVyIGAxYCwgb3IgdGhlIHNhbWUgYXMgdGhlIGNvcnJlc3BvbmRpbmcgYGxvc3Nlc2BcbiAqICAgIGRpbWVuc2lvbikuXG4gKiBAcGFyYW0gZXBzaWxvbiBBIHNtYWxsIGluY3JlbWVudCB0byBhdm9pZCB0YWtpbmcgbG9nIG9mIHplcm9cbiAqIEBwYXJhbSByZWR1Y3Rpb24gVHlwZSBvZiByZWR1Y3Rpb24gdG8gYXBwbHkgdG8gbG9zcy4gU2hvdWxkIGJlIG9mIHR5cGVcbiAqICAgIGBSZWR1Y3Rpb25gXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0xvc3NlcycsIG5hbWVzcGFjZTogJ2xvc3Nlcyd9XG4gKi9cbmZ1bmN0aW9uIGxvZ0xvc3NfKGxhYmVscywgcHJlZGljdGlvbnMsIHdlaWdodHMsIGVwc2lsb24gPSAxZS03LCByZWR1Y3Rpb24gPSBSZWR1Y3Rpb24uU1VNX0JZX05PTlpFUk9fV0VJR0hUUykge1xuICAgIGNvbnN0ICRsYWJlbHMgPSBjb252ZXJ0VG9UZW5zb3IobGFiZWxzLCAnbGFiZWxzJywgJ2xvZ0xvc3MnKTtcbiAgICBjb25zdCAkcHJlZGljdGlvbnMgPSBjb252ZXJ0VG9UZW5zb3IocHJlZGljdGlvbnMsICdwcmVkaWN0aW9ucycsICdsb2dMb3NzJyk7XG4gICAgbGV0ICR3ZWlnaHRzID0gbnVsbDtcbiAgICBpZiAod2VpZ2h0cyAhPSBudWxsKSB7XG4gICAgICAgICR3ZWlnaHRzID0gY29udmVydFRvVGVuc29yKHdlaWdodHMsICd3ZWlnaHRzJywgJ2xvZ0xvc3MnKTtcbiAgICB9XG4gICAgYXNzZXJ0U2hhcGVzTWF0Y2goJGxhYmVscy5zaGFwZSwgJHByZWRpY3Rpb25zLnNoYXBlLCAnRXJyb3IgaW4gbG9nTG9zczogJyk7XG4gICAgY29uc3Qgb25lID0gc2NhbGFyKDEpO1xuICAgIGNvbnN0IGVwc2lsb25TY2FsYXIgPSBzY2FsYXIoZXBzaWxvbik7XG4gICAgY29uc3QgbDEgPSBuZWcobXVsKCRsYWJlbHMsIGxvZyhhZGQoJHByZWRpY3Rpb25zLCBlcHNpbG9uU2NhbGFyKSkpKTtcbiAgICBjb25zdCBsMiA9IG11bChzdWIob25lLCAkbGFiZWxzKSwgbG9nKGFkZChzdWIob25lLCAkcHJlZGljdGlvbnMpLCBlcHNpbG9uU2NhbGFyKSkpO1xuICAgIGNvbnN0IGxvc3NlcyA9IHN1YihsMSwgbDIpO1xuICAgIHJldHVybiBjb21wdXRlV2VpZ2h0ZWRMb3NzKGxvc3NlcywgJHdlaWdodHMsIHJlZHVjdGlvbik7XG59XG5leHBvcnQgY29uc3QgbG9nTG9zcyA9IG9wKHsgbG9nTG9zc18gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sb2dfbG9zcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0U2hhcGVzTWF0Y2ggfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IFJlZHVjdGlvbiB9IGZyb20gJy4uL2xvc3Nfb3BzX3V0aWxzJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHNxdWFyZWREaWZmZXJlbmNlIH0gZnJvbSAnLi4vc3F1YXJlZF9kaWZmZXJlbmNlJztcbmltcG9ydCB7IGNvbXB1dGVXZWlnaHRlZExvc3MgfSBmcm9tICcuL2NvbXB1dGVfd2VpZ2h0ZWRfbG9zcyc7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBtZWFuIHNxdWFyZWQgZXJyb3IgYmV0d2VlbiB0d28gdGVuc29ycy5cbiAqXG4gKiBAcGFyYW0gbGFiZWxzIFRoZSBncm91bmQgdHJ1dGggb3V0cHV0IHRlbnNvciwgc2FtZSBkaW1lbnNpb25zIGFzXG4gKiAgICAncHJlZGljdGlvbnMnLlxuICogQHBhcmFtIHByZWRpY3Rpb25zIFRoZSBwcmVkaWN0ZWQgb3V0cHV0cy5cbiAqIEBwYXJhbSB3ZWlnaHRzIFRlbnNvciB3aG9zZSByYW5rIGlzIGVpdGhlciAwLCBvciB0aGUgc2FtZSByYW5rIGFzXG4gKiAgICBgbGFiZWxzYCwgYW5kIG11c3QgYmUgYnJvYWRjYXN0YWJsZSB0byBgbGFiZWxzYCAoaS5lLiwgYWxsIGRpbWVuc2lvbnNcbiAqICAgIG11c3QgYmUgZWl0aGVyIGAxYCwgb3IgdGhlIHNhbWUgYXMgdGhlIGNvcnJlc3BvbmRpbmcgYGxvc3Nlc2BcbiAqICAgIGRpbWVuc2lvbikuXG4gKiBAcGFyYW0gcmVkdWN0aW9uIFR5cGUgb2YgcmVkdWN0aW9uIHRvIGFwcGx5IHRvIGxvc3MuIFNob3VsZCBiZSBvZiB0eXBlXG4gKiAgICBgUmVkdWN0aW9uYFxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdMb3NzZXMnLCBuYW1lc3BhY2U6ICdsb3NzZXMnfVxuICovXG5mdW5jdGlvbiBtZWFuU3F1YXJlZEVycm9yXyhsYWJlbHMsIHByZWRpY3Rpb25zLCB3ZWlnaHRzLCByZWR1Y3Rpb24gPSBSZWR1Y3Rpb24uU1VNX0JZX05PTlpFUk9fV0VJR0hUUykge1xuICAgIGNvbnN0ICRsYWJlbHMgPSBjb252ZXJ0VG9UZW5zb3IobGFiZWxzLCAnbGFiZWxzJywgJ21lYW5TcXVhcmVkRXJyb3InKTtcbiAgICBjb25zdCAkcHJlZGljdGlvbnMgPSBjb252ZXJ0VG9UZW5zb3IocHJlZGljdGlvbnMsICdwcmVkaWN0aW9ucycsICdtZWFuU3F1YXJlZEVycm9yJyk7XG4gICAgbGV0ICR3ZWlnaHRzID0gbnVsbDtcbiAgICBpZiAod2VpZ2h0cyAhPSBudWxsKSB7XG4gICAgICAgICR3ZWlnaHRzID0gY29udmVydFRvVGVuc29yKHdlaWdodHMsICd3ZWlnaHRzJywgJ21lYW5TcXVhcmVkRXJyb3InKTtcbiAgICB9XG4gICAgYXNzZXJ0U2hhcGVzTWF0Y2goJGxhYmVscy5zaGFwZSwgJHByZWRpY3Rpb25zLnNoYXBlLCAnRXJyb3IgaW4gbWVhblNxdWFyZWRFcnJvcjogJyk7XG4gICAgY29uc3QgbG9zc2VzID0gc3F1YXJlZERpZmZlcmVuY2UoJGxhYmVscywgJHByZWRpY3Rpb25zKTtcbiAgICByZXR1cm4gY29tcHV0ZVdlaWdodGVkTG9zcyhsb3NzZXMsICR3ZWlnaHRzLCByZWR1Y3Rpb24pO1xufVxuZXhwb3J0IGNvbnN0IG1lYW5TcXVhcmVkRXJyb3IgPSBvcCh7IG1lYW5TcXVhcmVkRXJyb3JfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVhbl9zcXVhcmVkX2Vycm9yLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnRTaGFwZXNNYXRjaCB9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHsgYWJzIH0gZnJvbSAnLi4vYWJzJztcbmltcG9ydCB7IGFkZCB9IGZyb20gJy4uL2FkZCc7XG5pbXBvcnQgeyBleHAgfSBmcm9tICcuLi9leHAnO1xuaW1wb3J0IHsgbG9nMXAgfSBmcm9tICcuLi9sb2cxcCc7XG5pbXBvcnQgeyBSZWR1Y3Rpb24gfSBmcm9tICcuLi9sb3NzX29wc191dGlscyc7XG5pbXBvcnQgeyBtdWwgfSBmcm9tICcuLi9tdWwnO1xuaW1wb3J0IHsgbmVnIH0gZnJvbSAnLi4vbmVnJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlbHUgfSBmcm9tICcuLi9yZWx1JztcbmltcG9ydCB7IHNjYWxhciB9IGZyb20gJy4uL3NjYWxhcic7XG5pbXBvcnQgeyBzdWIgfSBmcm9tICcuLi9zdWInO1xuaW1wb3J0IHsgY29tcHV0ZVdlaWdodGVkTG9zcyB9IGZyb20gJy4vY29tcHV0ZV93ZWlnaHRlZF9sb3NzJztcbmZ1bmN0aW9uIHNpZ21vaWRDcm9zc0VudHJvcHlXaXRoTG9naXRzXyhsYWJlbHMsIGxvZ2l0cykge1xuICAgIGNvbnN0ICRsYWJlbHMgPSBjb252ZXJ0VG9UZW5zb3IobGFiZWxzLCAnbGFiZWxzJywgJ3NpZ21vaWRDcm9zc0VudHJvcHlXaXRoTG9naXRzJyk7XG4gICAgY29uc3QgJGxvZ2l0cyA9IGNvbnZlcnRUb1RlbnNvcihsb2dpdHMsICdsb2dpdHMnLCAnc2lnbW9pZENyb3NzRW50cm9weVdpdGhMb2dpdHMnKTtcbiAgICBhc3NlcnRTaGFwZXNNYXRjaCgkbGFiZWxzLnNoYXBlLCAkbG9naXRzLnNoYXBlLCAnRXJyb3IgaW4gc2lnbW9pZENyb3NzRW50cm9weVdpdGhMb2dpdHM6ICcpO1xuICAgIC8qKlxuICAgICAqIEltcGxlbWVudGF0aW9uIERldGFpbHM6XG4gICAgICpcbiAgICAgKiBGb3IgYnJldml0eSwgbGV0IGB4ID0gbG9naXRzYCwgYHogPSBsYWJlbHNgLiAgVGhlIGxvZ2lzdGljIGxvc3MgaXNcbiAgICAgKiAgICAgeiAqIC1sb2coc2lnbW9pZCh4KSkgKyAoMSAtIHopICogLWxvZygxIC0gc2lnbW9pZCh4KSlcbiAgICAgKiAgID0geiAqIC1sb2coMSAvICgxICsgZXhwKC14KSkpICsgKDEgLSB6KSAqIC1sb2coZXhwKC14KSAvICgxICsgZXhwKC14KSkpXG4gICAgICogICA9IHogKiBsb2coMSArIGV4cCgteCkpICsgKDEgLSB6KSAqICgtbG9nKGV4cCgteCkpICsgbG9nKDEgKyBleHAoLXgpKSlcbiAgICAgKiAgID0geiAqIGxvZygxICsgZXhwKC14KSkgKyAoMSAtIHopICogKHggKyBsb2coMSArIGV4cCgteCkpXG4gICAgICogICA9ICgxIC0geikgKiB4ICsgbG9nKDEgKyBleHAoLXgpKVxuICAgICAqICAgPSB4IC0geCAqIHogKyBsb2coMSArIGV4cCgteCkpXG4gICAgICpcbiAgICAgKiAgIEZvciB4IDwgMCwgdG8gYXZvaWQgb3ZlcmZsb3cgaW4gZXhwKC14KSwgd2UgcmVmb3JtdWxhdGUgdGhlIGFib3ZlXG4gICAgICogICAgIHggLSB4ICogeiArIGxvZygxICsgZXhwKC14KSlcbiAgICAgKiAgID0gbG9nKGV4cCh4KSkgLSB4ICogeiArIGxvZygxICsgZXhwKC14KSlcbiAgICAgKiAgID0gLSB4ICogeiArIGxvZygxICsgZXhwKHgpKVxuICAgICAqXG4gICAgICogSGVuY2UsIHRvIGVuc3VyZSBzdGFiaWxpdHkgYW5kIGF2b2lkIG92ZXJmbG93LCB0aGUgaW1wbGVtZW50YXRpb24gdXNlc1xuICAgICAqIHRoaXMgZXF1aXZhbGVudCBmb3JtdWxhdGlvbjpcbiAgICAgKiAgICAgbWF4KHgsIDApIC0geCAqIHogKyBsb2coMSArIGV4cCgtYWJzKHgpKSlcbiAgICAgKi9cbiAgICBjb25zdCBtYXhPdXRwdXQgPSByZWx1KCRsb2dpdHMpO1xuICAgIGNvbnN0IG91dHB1dFhUYXJnZXQgPSBtdWwoJGxvZ2l0cywgJGxhYmVscyk7XG4gICAgY29uc3Qgc2lnbW9pZE91dHB1dCA9IGxvZzFwKGV4cChuZWcoYWJzKCRsb2dpdHMpKSkpO1xuICAgIHJldHVybiBhZGQoc3ViKG1heE91dHB1dCwgb3V0cHV0WFRhcmdldCksIHNpZ21vaWRPdXRwdXQpO1xufVxuLyoqXG4gKiBDb21wdXRlcyB0aGUgc2lnbW9pZCBjcm9zcyBlbnRyb3B5IGxvc3MgYmV0d2VlbiB0d28gdGVuc29ycy5cbiAqXG4gKiBJZiBsYWJlbFNtb290aGluZyBpcyBub256ZXJvLCBzbW9vdGggdGhlIGxhYmVscyB0b3dhcmRzIDEvMjpcbiAqXG4gKiAgIG5ld011bHRpY2xhc3NMYWJlbHMgPSBtdWx0aWNsYXNzTGFiZWxzICogKDEgLSBsYWJlbFNtb290aGluZylcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICsgMC41ICogbGFiZWxTbW9vdGhpbmdcbiAqXG4gKiBAcGFyYW0gbXVsdGlDbGFzc0xhYmVscyBUaGUgZ3JvdW5kIHRydXRoIG91dHB1dCB0ZW5zb3Igb2Ygc2hhcGVcbiAqIFtiYXRjaF9zaXplLCBudW1fY2xhc3Nlc10sIHNhbWUgZGltZW5zaW9ucyBhcyAncHJlZGljdGlvbnMnLlxuICogQHBhcmFtIGxvZ2l0cyBUaGUgcHJlZGljdGVkIG91dHB1dHMuXG4gKiBAcGFyYW0gd2VpZ2h0cyBUZW5zb3Igd2hvc2UgcmFuayBpcyBlaXRoZXIgMCwgb3IgdGhlIHNhbWUgcmFuayBhc1xuICogICAgYGxhYmVsc2AsIGFuZCBtdXN0IGJlIGJyb2FkY2FzdGFibGUgdG8gYGxhYmVsc2AgKGkuZS4sIGFsbCBkaW1lbnNpb25zXG4gKiAgICBtdXN0IGJlIGVpdGhlciBgMWAsIG9yIHRoZSBzYW1lIGFzIHRoZSBjb3JyZXNwb25kaW5nIGBsb3NzZXNgXG4gKiAgICBkaW1lbnNpb24pLlxuICogQHBhcmFtIGxhYmVsU21vb3RoaW5nIElmIGdyZWF0ZXIgdGhhbiAwLCB0aGVuIHNtb290aCB0aGUgbGFiZWxzLlxuICogQHBhcmFtIHJlZHVjdGlvbiBUeXBlIG9mIHJlZHVjdGlvbiB0byBhcHBseSB0byBsb3NzLiBTaG91bGQgYmUgb2YgdHlwZVxuICogICAgYFJlZHVjdGlvbmBcbiAqXG4gKiBAZG9jIHsgaGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0xvc3NlcycsIG5hbWVzcGFjZTogJ2xvc3NlcycgfVxuICovXG5mdW5jdGlvbiBzaWdtb2lkQ3Jvc3NFbnRyb3B5XyhtdWx0aUNsYXNzTGFiZWxzLCBsb2dpdHMsIHdlaWdodHMsIGxhYmVsU21vb3RoaW5nID0gMCwgcmVkdWN0aW9uID0gUmVkdWN0aW9uLlNVTV9CWV9OT05aRVJPX1dFSUdIVFMpIHtcbiAgICBsZXQgJG11bHRpQ2xhc3NMYWJlbHMgPSBjb252ZXJ0VG9UZW5zb3IobXVsdGlDbGFzc0xhYmVscywgJ211bHRpQ2xhc3NMYWJlbHMnLCAnc2lnbW9pZENyb3NzRW50cm9weScpO1xuICAgIGNvbnN0ICRsb2dpdHMgPSBjb252ZXJ0VG9UZW5zb3IobG9naXRzLCAnbG9naXRzJywgJ3NpZ21vaWRDcm9zc0VudHJvcHknKTtcbiAgICBsZXQgJHdlaWdodHMgPSBudWxsO1xuICAgIGlmICh3ZWlnaHRzICE9IG51bGwpIHtcbiAgICAgICAgJHdlaWdodHMgPSBjb252ZXJ0VG9UZW5zb3Iod2VpZ2h0cywgJ3dlaWdodHMnLCAnc2lnbW9pZENyb3NzRW50cm9weScpO1xuICAgIH1cbiAgICBhc3NlcnRTaGFwZXNNYXRjaCgkbXVsdGlDbGFzc0xhYmVscy5zaGFwZSwgJGxvZ2l0cy5zaGFwZSwgJ0Vycm9yIGluIHNpZ21vaWRDcm9zc0VudHJvcHk6ICcpO1xuICAgIGlmIChsYWJlbFNtb290aGluZyA+IDApIHtcbiAgICAgICAgY29uc3QgbGFiZWxTbW9vdGhpbmdTY2FsYXIgPSBzY2FsYXIobGFiZWxTbW9vdGhpbmcpO1xuICAgICAgICBjb25zdCBvbmUgPSBzY2FsYXIoMSk7XG4gICAgICAgIGNvbnN0IGhhbGYgPSBzY2FsYXIoMC41KTtcbiAgICAgICAgJG11bHRpQ2xhc3NMYWJlbHMgPVxuICAgICAgICAgICAgYWRkKG11bCgkbXVsdGlDbGFzc0xhYmVscywgc3ViKG9uZSwgbGFiZWxTbW9vdGhpbmdTY2FsYXIpKSwgbXVsKGhhbGYsIGxhYmVsU21vb3RoaW5nU2NhbGFyKSk7XG4gICAgfVxuICAgIGNvbnN0IGxvc3NlcyA9IHNpZ21vaWRDcm9zc0VudHJvcHlXaXRoTG9naXRzXygkbXVsdGlDbGFzc0xhYmVscywgJGxvZ2l0cyk7XG4gICAgcmV0dXJuIGNvbXB1dGVXZWlnaHRlZExvc3MobG9zc2VzLCAkd2VpZ2h0cywgcmVkdWN0aW9uKTtcbn1cbmV4cG9ydCBjb25zdCBzaWdtb2lkQ3Jvc3NFbnRyb3B5ID0gb3AoeyBzaWdtb2lkQ3Jvc3NFbnRyb3B5XyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNpZ21vaWRfY3Jvc3NfZW50cm9weS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjdXN0b21HcmFkIH0gZnJvbSAnLi4vLi4vZ3JhZGllbnRzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnRTaGFwZXNNYXRjaCB9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHsgYWRkIH0gZnJvbSAnLi4vYWRkJztcbmltcG9ydCB7IGV4cGFuZFNoYXBlVG9LZWVwRGltIH0gZnJvbSAnLi4vYXhpc191dGlsJztcbmltcG9ydCB7IGNhc3QgfSBmcm9tICcuLi9jYXN0JztcbmltcG9ydCB7IGRpdiB9IGZyb20gJy4uL2Rpdic7XG5pbXBvcnQgeyBleHAgfSBmcm9tICcuLi9leHAnO1xuaW1wb3J0IHsgbG9nU3VtRXhwIH0gZnJvbSAnLi4vbG9nX3N1bV9leHAnO1xuaW1wb3J0IHsgUmVkdWN0aW9uIH0gZnJvbSAnLi4vbG9zc19vcHNfdXRpbHMnO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi4vbXVsJztcbmltcG9ydCB7IG5lZyB9IGZyb20gJy4uL25lZyc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4uL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi4vcmVzaGFwZSc7XG5pbXBvcnQgeyBzY2FsYXIgfSBmcm9tICcuLi9zY2FsYXInO1xuaW1wb3J0IHsgc3ViIH0gZnJvbSAnLi4vc3ViJztcbmltcG9ydCB7IHN1bSB9IGZyb20gJy4uL3N1bSc7XG5pbXBvcnQgeyBjb21wdXRlV2VpZ2h0ZWRMb3NzIH0gZnJvbSAnLi9jb21wdXRlX3dlaWdodGVkX2xvc3MnO1xuLyoqXG4gKiBDb21wdXRlcyBzb2Z0bWF4IGNyb3NzIGVudHJvcHkgYmV0d2VlbiBsb2dpdHMgYW5kIGxhYmVscy5cbiAqXG4gKiBNZWFzdXJlcyB0aGUgcHJvYmFiaWxpdHkgZXJyb3IgaW4gZGlzY3JldGUgY2xhc3NpZmljYXRpb24gdGFza3MgaW4gd2hpY2hcbiAqIHRoZSBjbGFzc2VzIGFyZSBtdXR1YWxseSBleGNsdXNpdmUgKGVhY2ggZW50cnkgaXMgaW4gZXhhY3RseSBvbmUgY2xhc3MpLlxuICogRm9yIGV4YW1wbGUsIGVhY2ggQ0lGQVItMTAgaW1hZ2UgaXMgbGFiZWxlZCB3aXRoIG9uZSBhbmQgb25seSBvbmUgbGFiZWw6IGFuXG4gKiBpbWFnZSBjYW4gYmUgYSBkb2cgb3IgYSB0cnVjaywgYnV0IG5vdCBib3RoLlxuICpcbiAqIGBOT1RFYDogV2hpbGUgdGhlIGNsYXNzZXMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSwgdGhlaXIgcHJvYmFiaWxpdGllcyBuZWVkXG4gKiBub3QgYmUuIEFsbCB0aGF0IGlzIHJlcXVpcmVkIGlzIHRoYXQgZWFjaCByb3cgb2YgbGFiZWxzIGlzIGEgdmFsaWRcbiAqIHByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbi4gSWYgdGhleSBhcmUgbm90LCB0aGUgY29tcHV0YXRpb24gb2YgdGhlIGdyYWRpZW50XG4gKiB3aWxsIGJlIGluY29ycmVjdC5cbiAqXG4gKiBgV0FSTklOR2A6IFRoaXMgb3AgZXhwZWN0cyB1bnNjYWxlZCBsb2dpdHMsIHNpbmNlIGl0IHBlcmZvcm1zIGEgc29mdG1heCBvblxuICogbG9naXRzIGludGVybmFsbHkgZm9yIGVmZmljaWVuY3kuIERvIG5vdCBjYWxsIHRoaXMgb3Agd2l0aCB0aGUgb3V0cHV0IG9mXG4gKiBzb2Z0bWF4LCBhcyBpdCB3aWxsIHByb2R1Y2UgaW5jb3JyZWN0IHJlc3VsdHMuXG4gKlxuICogbG9naXRzIGFuZCBsYWJlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIHNoYXBlLCBlLmcuIFtiYXRjaF9zaXplLCBudW1fY2xhc3Nlc11cbiAqIGFuZCB0aGUgc2FtZSBkdHlwZS5cbiAqIEBwYXJhbSBsYWJlbHMgVGhlIGxhYmVscyBhcnJheS5cbiAqIEBwYXJhbSBsb2dpdHMgVGhlIGxvZ2l0cyBhcnJheS5cbiAqIEBwYXJhbSBkaW0gVGhlIGRpbWVuc2lvbiBzb2Z0bWF4IHdvdWxkIGJlIHBlcmZvcm1lZCBvbi4gRGVmYXVsdHMgdG8gYC0xYFxuICogICAgIHdoaWNoIGluZGljYXRlcyB0aGUgbGFzdCBkaW1lbnNpb24uXG4gKi9cbmZ1bmN0aW9uIHNvZnRtYXhDcm9zc0VudHJvcHlXaXRoTG9naXRzXyhsYWJlbHMsIGxvZ2l0cywgZGltID0gLTEpIHtcbiAgICBpZiAoZGltID09PSAtMSkge1xuICAgICAgICBkaW0gPSBsb2dpdHMucmFuayAtIDE7XG4gICAgfVxuICAgIGlmIChkaW0gIT09IGxvZ2l0cy5yYW5rIC0gMSkge1xuICAgICAgICB0aHJvdyBFcnJvcihgU29mdG1heCBjcm9zcyBlbnRyb3B5IGFsb25nIGEgbm9uLWxhc3QgZGltZW5zaW9uIGlzIG5vdCB5ZXQgYCArXG4gICAgICAgICAgICBgc3VwcG9ydGVkLiBMYWJlbHMgLyBsb2dpdHMgd2FzIHJhbmsgJHtsb2dpdHMucmFua30gYCArXG4gICAgICAgICAgICBgYW5kIGRpbSB3YXMgJHtkaW19YCk7XG4gICAgfVxuICAgIC8vIFVzZSBhIGN1c3RvbSBncmFkaWVudCBmb3IgbnVtZXJpY2FsIHN0YWJpbGl0eS5cbiAgICBjb25zdCBjdXN0b21PcCA9IGN1c3RvbUdyYWQoKGxhYmVscywgbG9naXRzLCBzYXZlKSA9PiB7XG4gICAgICAgIC8vIFJlZmVyZW5jZTpcbiAgICAgICAgLy8gICAxLiBodHRwOi8vY3MyMzFuLmdpdGh1Yi5pby9saW5lYXItY2xhc3NpZnkvI3NvZnRtYXhcbiAgICAgICAgLy8gICAyLiBodHRwczovL2Jsb2cuZmVlZGx5LmNvbS90cmlja3Mtb2YtdGhlLXRyYWRlLWxvZ3N1bWV4cC9cbiAgICAgICAgY29uc3Qga2VlcERpbXMgPSB0cnVlO1xuICAgICAgICBjb25zdCBsc2UgPSBsb2dTdW1FeHAobG9naXRzLCBbZGltXSwga2VlcERpbXMpO1xuICAgICAgICBjb25zdCBsb2dSZXN1bHQgPSBzdWIoY2FzdChsb2dpdHMsICdmbG9hdDMyJyksIGxzZSk7XG4gICAgICAgIHNhdmUoW2xhYmVscywgbG9nUmVzdWx0XSk7XG4gICAgICAgIGNvbnN0IGNvc3RWZWN0b3IgPSBuZWcobXVsKGxvZ1Jlc3VsdCwgbGFiZWxzKSk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gc3VtKGNvc3RWZWN0b3IsIFtkaW1dKTtcbiAgICAgICAgY29uc3QgZ3JhZEZ1bmMgPSAoZHksIHNhdmVkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBbbGFiZWxzLCBsb2dSZXN1bHRdID0gc2F2ZWQ7XG4gICAgICAgICAgICBjb25zdCBkeVNoYXBlID0gZXhwYW5kU2hhcGVUb0tlZXBEaW0oZHkuc2hhcGUsIFtkaW1dKTtcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgbXVsKHJlc2hhcGUoZHksIGR5U2hhcGUpLCBzdWIoY2FzdChsYWJlbHMsICdmbG9hdDMyJyksIGV4cChsb2dSZXN1bHQpKSksXG4gICAgICAgICAgICAgICAgbXVsKHJlc2hhcGUoZHksIGR5U2hhcGUpLCBzdWIoZXhwKGxvZ1Jlc3VsdCksIGNhc3QobGFiZWxzLCAnZmxvYXQzMicpKSksXG4gICAgICAgICAgICBdO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4geyB2YWx1ZSwgZ3JhZEZ1bmMgfTtcbiAgICB9KTtcbiAgICByZXR1cm4gY3VzdG9tT3AobGFiZWxzLCBsb2dpdHMpO1xufVxuLyoqXG4gKiBDb21wdXRlcyB0aGUgc29mdG1heCBjcm9zcyBlbnRyb3B5IGxvc3MgYmV0d2VlbiB0d28gdGVuc29ycy5cbiAqXG4gKiBJZiBsYWJlbFNtb290aGluZyBpcyBub256ZXJvLCBzbW9vdGggdGhlIGxhYmVscyB0b3dhcmRzIDEvMjpcbiAqXG4gKiAgIG5ld09uZWhvdExhYmVscyA9IG9uZWhvdExhYmVscyAqICgxIC0gbGFiZWxTbW9vdGhpbmcpXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICArIGxhYmVsU21vb3RoaW5nIC8gbnVtQ2xhc3Nlc1xuICpcbiAqIEBwYXJhbSBvbmVob3RMYWJlbHMgT25lIGhvdCBlbmNvZGVkIGxhYmVsc1xuICogICAgW2JhdGNoX3NpemUsIG51bV9jbGFzc2VzXSwgc2FtZSBkaW1lbnNpb25zIGFzICdwcmVkaWN0aW9ucycuXG4gKiBAcGFyYW0gbG9naXRzIFRoZSBwcmVkaWN0ZWQgb3V0cHV0cy5cbiAqIEBwYXJhbSB3ZWlnaHRzIFRlbnNvciB3aG9zZSByYW5rIGlzIGVpdGhlciAwLCBvciAxLCBhbmQgbXVzdCBiZVxuICogICAgYnJvYWRjYXN0YWJsZSB0byBgbG9zc2AgIG9mIHNoYXBlIFtiYXRjaF9zaXplXVxuICogQHBhcmFtIGxhYmVsU21vb3RoaW5nIElmIGdyZWF0ZXIgdGhhbiAwLCB0aGVuIHNtb290aCB0aGUgbGFiZWxzLlxuICogQHBhcmFtIHJlZHVjdGlvbiBUeXBlIG9mIHJlZHVjdGlvbiB0byBhcHBseSB0byBsb3NzLiBTaG91bGQgYmUgb2YgdHlwZVxuICogICAgYFJlZHVjdGlvbmBcbiAqXG4gKiBAZG9jIHsgaGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0xvc3NlcycsIG5hbWVzcGFjZTogJ2xvc3NlcycgfVxuICovXG5mdW5jdGlvbiBzb2Z0bWF4Q3Jvc3NFbnRyb3B5XyhvbmVob3RMYWJlbHMsIGxvZ2l0cywgd2VpZ2h0cywgbGFiZWxTbW9vdGhpbmcgPSAwLCByZWR1Y3Rpb24gPSBSZWR1Y3Rpb24uU1VNX0JZX05PTlpFUk9fV0VJR0hUUykge1xuICAgIGxldCAkb25laG90TGFiZWxzID0gY29udmVydFRvVGVuc29yKG9uZWhvdExhYmVscywgJ29uZWhvdExhYmVscycsICdzb2Z0bWF4Q3Jvc3NFbnRyb3B5Jyk7XG4gICAgY29uc3QgJGxvZ2l0cyA9IGNvbnZlcnRUb1RlbnNvcihsb2dpdHMsICdsb2dpdHMnLCAnc29mdG1heENyb3NzRW50cm9weScpO1xuICAgIGxldCAkd2VpZ2h0cyA9IG51bGw7XG4gICAgaWYgKHdlaWdodHMgIT0gbnVsbCkge1xuICAgICAgICAkd2VpZ2h0cyA9IGNvbnZlcnRUb1RlbnNvcih3ZWlnaHRzLCAnd2VpZ2h0cycsICdzb2Z0bWF4Q3Jvc3NFbnRyb3B5Jyk7XG4gICAgfVxuICAgIGFzc2VydFNoYXBlc01hdGNoKCRvbmVob3RMYWJlbHMuc2hhcGUsICRsb2dpdHMuc2hhcGUsICdFcnJvciBpbiBzb2Z0bWF4Q3Jvc3NFbnRyb3B5OiAnKTtcbiAgICBpZiAobGFiZWxTbW9vdGhpbmcgPiAwKSB7XG4gICAgICAgIGNvbnN0IGxhYmVsU21vb3RoaW5nU2NhbGFyID0gc2NhbGFyKGxhYmVsU21vb3RoaW5nKTtcbiAgICAgICAgY29uc3Qgb25lID0gc2NhbGFyKDEpO1xuICAgICAgICBjb25zdCBudW1DbGFzc2VzID0gc2NhbGFyKCRvbmVob3RMYWJlbHMuc2hhcGVbMV0pO1xuICAgICAgICAkb25laG90TGFiZWxzID1cbiAgICAgICAgICAgIGFkZChtdWwoJG9uZWhvdExhYmVscywgc3ViKG9uZSwgbGFiZWxTbW9vdGhpbmdTY2FsYXIpKSwgZGl2KGxhYmVsU21vb3RoaW5nU2NhbGFyLCBudW1DbGFzc2VzKSk7XG4gICAgfVxuICAgIGNvbnN0IGxvc3NlcyA9IHNvZnRtYXhDcm9zc0VudHJvcHlXaXRoTG9naXRzXygkb25laG90TGFiZWxzLCAkbG9naXRzKTtcbiAgICByZXR1cm4gY29tcHV0ZVdlaWdodGVkTG9zcyhsb3NzZXMsICR3ZWlnaHRzLCByZWR1Y3Rpb24pO1xufVxuZXhwb3J0IGNvbnN0IHNvZnRtYXhDcm9zc0VudHJvcHkgPSBvcCh7IHNvZnRtYXhDcm9zc0VudHJvcHlfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c29mdG1heF9jcm9zc19lbnRyb3B5LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBCYXRjaE1hdE11bCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBtYWtlVHlwZXNNYXRjaCB9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHR3byBtYXRyaWNlcywgQSAqIEIuIFRoZXNlIG11c3QgYmUgbWF0cmljZXMuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IyZChbMSwgMl0sIFsxLCAyXSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pO1xuICpcbiAqIGEubWF0TXVsKGIpLnByaW50KCk7ICAvLyBvciB0Zi5tYXRNdWwoYSwgYilcbiAqIGBgYFxuICogQHBhcmFtIGEgRmlyc3QgbWF0cml4IGluIGRvdCBwcm9kdWN0IG9wZXJhdGlvbi5cbiAqIEBwYXJhbSBiIFNlY29uZCBtYXRyaXggaW4gZG90IHByb2R1Y3Qgb3BlcmF0aW9uLlxuICogQHBhcmFtIHRyYW5zcG9zZUEgSWYgdHJ1ZSwgYGFgIGlzIHRyYW5zcG9zZWQgYmVmb3JlIG11bHRpcGxpY2F0aW9uLlxuICogQHBhcmFtIHRyYW5zcG9zZUIgSWYgdHJ1ZSwgYGJgIGlzIHRyYW5zcG9zZWQgYmVmb3JlIG11bHRpcGxpY2F0aW9uLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ01hdHJpY2VzJ31cbiAqL1xuZnVuY3Rpb24gbWF0TXVsXyhhLCBiLCB0cmFuc3Bvc2VBID0gZmFsc2UsIHRyYW5zcG9zZUIgPSBmYWxzZSkge1xuICAgIGxldCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdtYXRNdWwnKTtcbiAgICBsZXQgJGIgPSBjb252ZXJ0VG9UZW5zb3IoYiwgJ2InLCAnbWF0TXVsJyk7XG4gICAgWyRhLCAkYl0gPSBtYWtlVHlwZXNNYXRjaCgkYSwgJGIpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgYTogJGEsIGI6ICRiIH07XG4gICAgY29uc3QgYXR0cnMgPSB7IHRyYW5zcG9zZUEsIHRyYW5zcG9zZUIgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChCYXRjaE1hdE11bCwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgbWF0TXVsID0gb3AoeyBtYXRNdWxfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWF0X211bC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTWF4IH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIG1heGltdW0gb2YgZWxlbWVudHMgYWNyb3NzIGRpbWVuc2lvbnMgb2YgYSBgdGYuVGVuc29yYC5cbiAqXG4gKiBSZWR1Y2VzIHRoZSBpbnB1dCBhbG9uZyB0aGUgZGltZW5zaW9ucyBnaXZlbiBpbiBgYXhlc2AuIFVubGVzcyBga2VlcERpbXNgXG4gKiBpcyB0cnVlLCB0aGUgcmFuayBvZiB0aGUgYHRmLlRlbnNvcmAgaXMgcmVkdWNlZCBieSAxIGZvciBlYWNoIGVudHJ5IGluXG4gKiBgYXhlc2AuIElmIGBrZWVwRGltc2AgaXMgdHJ1ZSwgdGhlIHJlZHVjZWQgZGltZW5zaW9ucyBhcmUgcmV0YWluZWQgd2l0aFxuICogbGVuZ3RoIDEuIElmIGBheGVzYCBoYXMgbm8gZW50cmllcywgYWxsIGRpbWVuc2lvbnMgYXJlIHJlZHVjZWQsIGFuZCBhblxuICogYHRmLlRlbnNvcmAgd2l0aCBhIHNpbmdsZSBlbGVtZW50IGlzIHJldHVybmVkLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqXG4gKiB4Lm1heCgpLnByaW50KCk7ICAvLyBvciB0Zi5tYXgoeClcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pO1xuICpcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5tYXgoYXhpcykucHJpbnQoKTsgIC8vIG9yIHRmLm1heCh4LCBheGlzKVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBheGlzIFRoZSBkaW1lbnNpb24ocykgdG8gcmVkdWNlLiBCeSBkZWZhdWx0IGl0IHJlZHVjZXNcbiAqICAgICBhbGwgZGltZW5zaW9ucy5cbiAqIEBwYXJhbSBrZWVwRGltcyBJZiB0cnVlLCByZXRhaW5zIHJlZHVjZWQgZGltZW5zaW9ucyB3aXRoIHNpemUgMS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdSZWR1Y3Rpb24nfVxuICovXG5mdW5jdGlvbiBtYXhfKHgsIGF4aXMgPSBudWxsLCBrZWVwRGltcyA9IGZhbHNlKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnbWF4Jyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyByZWR1Y3Rpb25JbmRpY2VzOiBheGlzLCBrZWVwRGltcyB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKE1heCwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgbWF4ID0gb3AoeyBtYXhfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWF4LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBNYXhQb29sIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0ICogYXMgY29udl91dGlsIGZyb20gJy4vY29udl91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vcmVzaGFwZSc7XG4vKipcbiAqIENvbXB1dGVzIHRoZSAyRCBtYXggcG9vbGluZyBvZiBhbiBpbWFnZS5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDQgb3IgcmFuayAzIG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgaW5DaGFubmVsc11gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXJTaXplIFRoZSBmaWx0ZXIgc2l6ZTogYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoXWAuIElmXG4gKiAgICAgYGZpbHRlclNpemVgIGlzIGEgc2luZ2xlIG51bWJlciwgdGhlbiBgZmlsdGVySGVpZ2h0ID09IGZpbHRlcldpZHRoYC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBwb29saW5nOiBgW3N0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGhdYC4gSWZcbiAqICAgICBgc3RyaWRlc2AgaXMgYSBzaW5nbGUgbnVtYmVyLCB0aGVuIGBzdHJpZGVIZWlnaHQgPT0gc3RyaWRlV2lkdGhgLlxuICogQHBhcmFtIGRpbGF0aW9ucyBUaGUgZGlsYXRpb24gcmF0ZXM6IGBbZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGhdYFxuICogICAgIGluIHdoaWNoIHdlIHNhbXBsZSBpbnB1dCB2YWx1ZXMgYWNyb3NzIHRoZSBoZWlnaHQgYW5kIHdpZHRoIGRpbWVuc2lvbnNcbiAqICAgICBpbiBkaWxhdGVkIHBvb2xpbmcuIERlZmF1bHRzIHRvIGBbMSwgMV1gLiBJZiBgZGlsYXRpb25zYCBpcyBhIHNpbmdsZVxuICogICAgIG51bWJlciwgdGhlbiBgZGlsYXRpb25IZWlnaHQgPT0gZGlsYXRpb25XaWR0aGAuIElmIGl0IGlzIGdyZWF0ZXIgdGhhblxuICogICAgIDEsIHRoZW4gYWxsIHZhbHVlcyBvZiBgc3RyaWRlc2AgbXVzdCBiZSAxLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobS5cbiAqICAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAgLSBGb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uXShcbiAqICAgICAgICAgIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbilcbiAqIEBwYXJhbSBkaW1Sb3VuZGluZ01vZGUgQSBzdHJpbmcgZnJvbTogJ2NlaWwnLCAncm91bmQnLCAnZmxvb3InLiBJZiBub25lIGlzXG4gKiAgICAgcHJvdmlkZWQsIGl0IHdpbGwgZGVmYXVsdCB0byB0cnVuY2F0ZS5cbiAqL1xuZnVuY3Rpb24gbWF4UG9vbF8oeCwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdtYXhQb29sJyk7XG4gICAgY29uc3QgZGlsYXRpb25zID0gMTtcbiAgICBsZXQgeDREID0gJHg7XG4gICAgbGV0IHJlc2hhcGVkVG80RCA9IGZhbHNlO1xuICAgIGlmICgkeC5yYW5rID09PSAzKSB7XG4gICAgICAgIHJlc2hhcGVkVG80RCA9IHRydWU7XG4gICAgICAgIHg0RCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV0sICR4LnNoYXBlWzJdXSk7XG4gICAgfVxuICAgIHV0aWwuYXNzZXJ0KHg0RC5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gbWF4UG9vbDogaW5wdXQgbXVzdCBiZSByYW5rIDQgYnV0IGdvdCByYW5rICR7eDRELnJhbmt9LmApO1xuICAgIHV0aWwuYXNzZXJ0KGNvbnZfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgZGlsYXRpb25zKSwgKCkgPT4gJ0Vycm9yIGluIG1heFBvb2w6IEVpdGhlciBzdHJpZGVzIG9yIGRpbGF0aW9ucyBtdXN0IGJlIDEuICcgK1xuICAgICAgICBgR290IHN0cmlkZXMgJHtzdHJpZGVzfSBhbmQgZGlsYXRpb25zICcke2RpbGF0aW9uc30nYCk7XG4gICAgaWYgKGRpbVJvdW5kaW5nTW9kZSAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNJbnQocGFkKSwgKCkgPT4gYEVycm9yIGluIG1heFBvb2w6IHBhZCBtdXN0IGJlIGFuIGludGVnZXIgd2hlbiB1c2luZywgYCArXG4gICAgICAgICAgICBgZGltUm91bmRpbmdNb2RlICR7ZGltUm91bmRpbmdNb2RlfSBidXQgZ290IHBhZCAke3BhZH0uYCk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogeDREIH07XG4gICAgY29uc3QgYXR0cnMgPSB7IGZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlIH07XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgIGNvbnN0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoTWF4UG9vbCwgaW5wdXRzLCBhdHRycyk7XG4gICAgaWYgKHJlc2hhcGVkVG80RCkge1xuICAgICAgICByZXR1cm4gcmVzaGFwZShyZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdXSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5leHBvcnQgY29uc3QgbWF4UG9vbCA9IG9wKHsgbWF4UG9vbF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tYXhfcG9vbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTWF4UG9vbDNEIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIDNEIG1heCBwb29saW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yNWQoWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDhdLCBbMSwgMiwgMiwgMiwgMV0pO1xuICogY29uc3QgcmVzdWx0ID0gdGYubWF4UG9vbDNkKHgsIDIsIDEsICd2YWxpZCcpO1xuICogcmVzdWx0LnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDUgb3IgcmFuayA0IG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgZGVwdGgsIGhlaWdodCwgd2lkdGgsIGluQ2hhbm5lbHNdYC5cbiAqIEBwYXJhbSBmaWx0ZXJTaXplIFRoZSBmaWx0ZXIgc2l6ZTpcbiAqICAgICBgW2ZpbHRlckRlcHRoLCBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoXWAuXG4gKiAgICAgSWYgYGZpbHRlclNpemVgIGlzIGEgc2luZ2xlIG51bWJlcixcbiAqICAgICB0aGVuIGBmaWx0ZXJEZXB0aCA9PSBmaWx0ZXJIZWlnaHQgPT0gZmlsdGVyV2lkdGhgLlxuICogQHBhcmFtIHN0cmlkZXMgVGhlIHN0cmlkZXMgb2YgdGhlIHBvb2xpbmc6XG4gKiAgICAgYFtzdHJpZGVEZXB0aCwgc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aF1gLlxuICogICAgIElmIGBzdHJpZGVzYCBpcyBhIHNpbmdsZSBudW1iZXIsXG4gKiAgICAgdGhlbiBgc3RyaWRlRGVwdGggPT0gc3RyaWRlSGVpZ2h0ID09IHN0cmlkZVdpZHRoYC5cbiAqIEBwYXJhbSBwYWQgVGhlIHR5cGUgb2YgcGFkZGluZyBhbGdvcml0aG0uXG4gKiAgICAtIGBzYW1lYCBhbmQgc3RyaWRlIDE6IG91dHB1dCB3aWxsIGJlIG9mIHNhbWUgc2l6ZSBhcyBpbnB1dCxcbiAqICAgICAgIHJlZ2FyZGxlc3Mgb2YgZmlsdGVyIHNpemUuXG4gKiAgICAtIGB2YWxpZGA6IG91dHB1dCB3aWxsIGJlIHNtYWxsZXIgdGhhbiBpbnB1dCBpZiBmaWx0ZXIgaXMgbGFyZ2VyXG4gKiAgICAgICB0aGFuIDEqMXgxLlxuICogICAgLSBGb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uXShcbiAqICAgICAgICAgIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbilcbiAqIEBwYXJhbSBkaW1Sb3VuZGluZ01vZGUgQSBzdHJpbmcgZnJvbTogJ2NlaWwnLCAncm91bmQnLCAnZmxvb3InLiBJZiBub25lIGlzXG4gKiAgICAgcHJvdmlkZWQsIGl0IHdpbGwgZGVmYXVsdCB0byB0cnVuY2F0ZS5cbiAqIEBwYXJhbSBkYXRhRm9ybWF0IEFuIG9wdGlvbmFsIHN0cmluZyBmcm9tOiBcIk5ESFdDXCIsIFwiTkNESFdcIi4gRGVmYXVsdHMgdG9cbiAqICAgICBcIk5ESFdDXCIuIFNwZWNpZnkgdGhlIGRhdGEgZm9ybWF0IG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEuIFdpdGggdGhlXG4gKiAgICAgZGVmYXVsdCBmb3JtYXQgXCJOREhXQ1wiLCB0aGUgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIG9yZGVyIG9mOiBbYmF0Y2gsXG4gKiAgICAgZGVwdGgsIGhlaWdodCwgd2lkdGgsIGNoYW5uZWxzXS4gT25seSBcIk5ESFdDXCIgaXMgY3VycmVudGx5IHN1cHBvcnRlZC5cbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0NvbnZvbHV0aW9uJ31cbiAqL1xuZnVuY3Rpb24gbWF4UG9vbDNkXyh4LCBmaWx0ZXJTaXplID0gWzEsIDEsIDFdLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgZGF0YUZvcm1hdCA9ICdOREhXQycpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdtYXhQb29sM2QnKTtcbiAgICBsZXQgeDVEID0gJHg7XG4gICAgbGV0IHJlc2hhcGVkVG81RCA9IGZhbHNlO1xuICAgIGlmICgkeC5yYW5rID09PSA0KSB7XG4gICAgICAgIHJlc2hhcGVkVG81RCA9IHRydWU7XG4gICAgICAgIHg1RCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV0sICR4LnNoYXBlWzJdLCAkeC5zaGFwZVszXV0pO1xuICAgIH1cbiAgICB1dGlsLmFzc2VydCh4NUQucmFuayA9PT0gNSwgKCkgPT4gYEVycm9yIGluIG1heFBvb2wzZDogeCBtdXN0IGJlIHJhbmsgNSBidXQgZ290IHJhbmsgJHt4NUQucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoZGF0YUZvcm1hdCA9PT0gJ05ESFdDJywgKCkgPT4gYEVycm9yIGluIG1heFBvb2wzZDogT25seSBOREhXQyBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLCBgICtcbiAgICAgICAgYGJ1dCBnb3QgZGF0YUZvcm1hdCBvZiAke2RhdGFGb3JtYXR9YCk7XG4gICAgaWYgKGRpbVJvdW5kaW5nTW9kZSAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNJbnQocGFkKSwgKCkgPT4gYEVycm9yIGluIG1heFBvb2wzZDogcGFkIG11c3QgYmUgYW4gaW50ZWdlciB3aGVuIHVzaW5nLCBgICtcbiAgICAgICAgICAgIGBkaW1Sb3VuZGluZ01vZGUgJHtkaW1Sb3VuZGluZ01vZGV9IGJ1dCBnb3QgcGFkICR7cGFkfS5gKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiB4NUQgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGRhdGFGb3JtYXQgfTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgY29uc3QgcmVzID0gRU5HSU5FLnJ1bktlcm5lbChNYXhQb29sM0QsIGlucHV0cywgYXR0cnMpO1xuICAgIGlmIChyZXNoYXBlZFRvNUQpIHtcbiAgICAgICAgcmV0dXJuIHJlc2hhcGUocmVzLCBbcmVzLnNoYXBlWzFdLCByZXMuc2hhcGVbMl0sIHJlcy5zaGFwZVszXSwgcmVzLnNoYXBlWzRdXSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5leHBvcnQgY29uc3QgbWF4UG9vbDNkID0gb3AoeyBtYXhQb29sM2RfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWF4X3Bvb2xfM2QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IE1heFBvb2xXaXRoQXJnbWF4IH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIDJEIG1heCBwb29saW5nIG9mIGFuIGltYWdlIHdpdGggQXJnbWF4IGluZGV4LlxuICogVGhlIGluZGljZXMgaW4gYXJnbWF4IGFyZSBmbGF0dGVuZWQsIHNvIHRoYXQgYSBtYXhpbXVtIHZhbHVlIGF0IHBvc2l0aW9uIGBbYixcbiAqIHksIHgsIGNdYCBiZWNvbWVzIGZsYXR0ZW5lZCBpbmRleDogYCh5ICogd2lkdGggKyB4KSAqIGNoYW5uZWxzICsgY2AgaWZcbiAqIGluY2x1ZGVfYmF0Y2hfaW5faW5kZXggaXMgRmFsc2U7IGAoKGIgKiBoZWlnaHQgKyB5KSAqIHdpZHRoICsgeCkgKiBjaGFubmVsc1xuICogK2NgIGlmIGluY2x1ZGVfYmF0Y2hfaW5faW5kZXggaXMgVHJ1ZS5cbiAqXG4gKiBUaGUgaW5kaWNlcyByZXR1cm5lZCBhcmUgYWx3YXlzIGluIGBbMCwgaGVpZ2h0KSB4IFswLCB3aWR0aClgIGJlZm9yZVxuICogZmxhdHRlbmluZy5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDQgb3IgcmFuayAzIG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgaW5DaGFubmVsc11gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXJTaXplIFRoZSBmaWx0ZXIgc2l6ZTogYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoXWAuIElmXG4gKiAgICAgYGZpbHRlclNpemVgIGlzIGEgc2luZ2xlIG51bWJlciwgdGhlbiBgZmlsdGVySGVpZ2h0ID09IGZpbHRlcldpZHRoYC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBwb29saW5nOiBgW3N0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGhdYC4gSWZcbiAqICAgICBgc3RyaWRlc2AgaXMgYSBzaW5nbGUgbnVtYmVyLCB0aGVuIGBzdHJpZGVIZWlnaHQgPT0gc3RyaWRlV2lkdGhgLlxuICogQHBhcmFtIGRhdGFGb3JtYXQgQW4gb3B0aW9uYWwgc3RyaW5nIGZyb206IFwiTkRIV0NcIiwgXCJOQ0RIV1wiLiBEZWZhdWx0cyB0b1xuICogICAgIFwiTkRIV0NcIi4gU3BlY2lmeSB0aGUgZGF0YSBmb3JtYXQgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YS4gV2l0aCB0aGVcbiAqICAgICBkZWZhdWx0IGZvcm1hdCBcIk5ESFdDXCIsIHRoZSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgb3JkZXIgb2Y6IFtiYXRjaCxcbiAqICAgICBkZXB0aCwgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbHNdLiBPbmx5IFwiTkRIV0NcIiBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobS5cbiAqICAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAgLSBGb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uXShcbiAqICAgICAgICAgIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbilcbiAqIEBwYXJhbSBpbmNsdWRlQmF0Y2hJbmRleCBEZWZhdWx0cyB0byBGYWxzZS4gV2hldGhlciB0byBpbmNsdWRlIGJhdGNoXG4gKiAgICBkaW1lbnNpb24gaW4gZmxhdHRlbmVkIGluZGV4IG9mIGFyZ21heC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdDb252b2x1dGlvbid9XG4gKi9cbmZ1bmN0aW9uIG1heFBvb2xXaXRoQXJnbWF4Xyh4LCBmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGluY2x1ZGVCYXRjaEluSW5kZXggPSBmYWxzZSkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ21heFBvb2xXaXRoQXJnbWF4Jyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGluY2x1ZGVCYXRjaEluSW5kZXggfTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgY29uc3QgcmVzdWx0ID0gRU5HSU5FLnJ1bktlcm5lbChNYXhQb29sV2l0aEFyZ21heCwgaW5wdXRzLCBhdHRycyk7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiByZXN1bHRbMF0sIGluZGV4ZXM6IHJlc3VsdFsxXSB9O1xufVxuZXhwb3J0IGNvbnN0IG1heFBvb2xXaXRoQXJnbWF4ID0gb3AoeyBtYXhQb29sV2l0aEFyZ21heF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tYXhfcG9vbF93aXRoX2FyZ21heC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTWF4aW11bSB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBtYWtlVHlwZXNNYXRjaCB9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSB9IGZyb20gJy4vYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0IHsgY2FzdCB9IGZyb20gJy4vY2FzdCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV0dXJucyB0aGUgbWF4IG9mIGEgYW5kIGIgKGBhID4gYiA/IGEgOiBiYCkgZWxlbWVudC13aXNlLlxuICogU3VwcG9ydHMgYnJvYWRjYXN0aW5nLlxuICpcbiAqIFdlIGFsc28gZXhwb3NlIGB0Zi5tYXhpbXVtU3RyaWN0YCB3aGljaCBoYXMgdGhlIHNhbWUgc2lnbmF0dXJlIGFzIHRoaXMgb3AgYW5kXG4gKiBhc3NlcnRzIHRoYXQgYGFgIGFuZCBgYmAgYXJlIHRoZSBzYW1lIHNoYXBlIChkb2VzIG5vdCBicm9hZGNhc3QpLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDQsIDMsIDE2XSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzEsIDIsIDksIDRdKTtcbiAqXG4gKiBhLm1heGltdW0oYikucHJpbnQoKTsgIC8vIG9yIHRmLm1heGltdW0oYSwgYilcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBCcm9hZGNhc3QgbWF4aW11bSBhIHdpdGggYi5cbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMiwgNCwgNiwgOF0pO1xuICogY29uc3QgYiA9IHRmLnNjYWxhcig1KTtcbiAqXG4gKiBhLm1heGltdW0oYikucHJpbnQoKTsgIC8vIG9yIHRmLm1heGltdW0oYSwgYilcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCB0ZW5zb3IuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIHRlbnNvci4gTXVzdCBoYXZlIHRoZSBzYW1lIHR5cGUgYXMgYGFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0FyaXRobWV0aWMnfVxuICovXG5mdW5jdGlvbiBtYXhpbXVtXyhhLCBiKSB7XG4gICAgbGV0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ21heGltdW0nKTtcbiAgICBsZXQgJGIgPSBjb252ZXJ0VG9UZW5zb3IoYiwgJ2InLCAnbWF4aW11bScpO1xuICAgIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcbiAgICBpZiAoJGEuZHR5cGUgPT09ICdib29sJykge1xuICAgICAgICAkYSA9IGNhc3QoJGEsICdpbnQzMicpO1xuICAgICAgICAkYiA9IGNhc3QoJGIsICdpbnQzMicpO1xuICAgIH1cbiAgICBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSgkYS5zaGFwZSwgJGIuc2hhcGUpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgYTogJGEsIGI6ICRiIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoTWF4aW11bSwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBtYXhpbXVtID0gb3AoeyBtYXhpbXVtXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1heGltdW0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IE1lYW4gfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgbWVhbiBvZiBlbGVtZW50cyBhY3Jvc3MgZGltZW5zaW9ucyBvZiBhIGB0Zi5UZW5zb3JgLlxuICpcbiAqIFJlZHVjZXMgYHhgIGFsb25nIHRoZSBkaW1lbnNpb25zIGdpdmVuIGluIGBheGlzYC4gVW5sZXNzIGBrZWVwRGltc2AgaXNcbiAqIHRydWUsIHRoZSByYW5rIG9mIHRoZSBgdGYuVGVuc29yYCBpcyByZWR1Y2VkIGJ5IDEgZm9yIGVhY2ggZW50cnkgaW4gYGF4aXNgLlxuICogSWYgYGtlZXBEaW1zYCBpcyB0cnVlLCB0aGUgcmVkdWNlZCBkaW1lbnNpb25zIGFyZSByZXRhaW5lZCB3aXRoIGxlbmd0aCAxLlxuICogSWYgYGF4aXNgIGhhcyBubyBlbnRyaWVzLCBhbGwgZGltZW5zaW9ucyBhcmUgcmVkdWNlZCwgYW5kIGEgYHRmLlRlbnNvcmAgd2l0aFxuICogYSBzaW5nbGUgZWxlbWVudCBpcyByZXR1cm5lZC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKlxuICogeC5tZWFuKCkucHJpbnQoKTsgIC8vIG9yIHRmLm1lYW4oYSlcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pO1xuICpcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5tZWFuKGF4aXMpLnByaW50KCk7ICAvLyBvciB0Zi5tZWFuKHgsIGF4aXMpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICogQHBhcmFtIGF4aXMgVGhlIGRpbWVuc2lvbihzKSB0byByZWR1Y2UuIEJ5IGRlZmF1bHQgaXQgcmVkdWNlc1xuICogICAgIGFsbCBkaW1lbnNpb25zLlxuICogQHBhcmFtIGtlZXBEaW1zIElmIHRydWUsIHJldGFpbnMgcmVkdWNlZCBkaW1lbnNpb25zIHdpdGggc2l6ZSAxLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1JlZHVjdGlvbid9XG4gKi9cbmZ1bmN0aW9uIG1lYW5fKHgsIGF4aXMgPSBudWxsLCBrZWVwRGltcyA9IGZhbHNlKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnbWVhbicpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICBjb25zdCBhdHRycyA9IHsgYXhpcywga2VlcERpbXMgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChNZWFuLCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBtZWFuID0gb3AoeyBtZWFuXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1lYW4uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgbWF0TXVsIH0gZnJvbSAnLi9tYXRfbXVsJztcbmltcG9ydCB7IG9uZXMgfSBmcm9tICcuL29uZXMnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vcmVzaGFwZSc7XG5pbXBvcnQgeyBUZW5zb3IgfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IHNpemVGcm9tU2hhcGUgfSBmcm9tICcuLi91dGlsX2Jhc2UnO1xuLyoqXG4gKiBCcm9hZGNhc3RzIHBhcmFtZXRlcnMgZm9yIGV2YWx1YXRpb24gb24gYW4gTi1EIGdyaWQuXG4gKlxuICogR2l2ZW4gTiBvbmUtZGltZW5zaW9uYWwgY29vcmRpbmF0ZSBhcnJheXMgYCphcmdzYCwgcmV0dXJucyBhIGxpc3QgYG91dHB1dHNgXG4gKiBvZiBOLUQgY29vcmRpbmF0ZSBhcnJheXMgZm9yIGV2YWx1YXRpbmcgZXhwcmVzc2lvbnMgb24gYW4gTi1EIGdyaWQuXG4gKlxuICogTm90ZXM6XG4gKiBgbWVzaGdyaWRgIHN1cHBvcnRzIGNhcnRlc2lhbiAoJ3h5JykgYW5kIG1hdHJpeCAoJ2lqJykgaW5kZXhpbmcgY29udmVudGlvbnMuXG4gKiBXaGVuIHRoZSBgaW5kZXhpbmdgIGFyZ3VtZW50IGlzIHNldCB0byAneHknICh0aGUgZGVmYXVsdCksIHRoZSBicm9hZGNhc3RpbmdcbiAqIGluc3RydWN0aW9ucyBmb3IgdGhlIGZpcnN0IHR3byBkaW1lbnNpb25zIGFyZSBzd2FwcGVkLlxuICogRXhhbXBsZXM6XG4gKiBDYWxsaW5nIGBjb25zdCBbWCwgWV0gPSBtZXNoZ3JpZCh4LCB5KWAgd2l0aCB0aGUgdGVuc29yc1xuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGNvbnN0IHggPSBbMSwgMiwgM107XG4gKiBjb25zdCB5ID0gWzQsIDUsIDZdO1xuICogY29uc3QgW1gsIFldID0gdGYubWVzaGdyaWQoeCwgeSk7XG4gKiAvLyBYID0gW1sxLCAyLCAzXSxcbiAqIC8vICAgICAgWzEsIDIsIDNdLFxuICogLy8gICAgICBbMSwgMiwgM11dXG4gKiAvLyBZID0gW1s0LCA0LCA0XSxcbiAqIC8vICAgICAgWzUsIDUsIDVdLFxuICogLy8gICAgICBbNiwgNiwgNl1dXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUZW5zb3Igd2l0aCByYW5rIGdlcSAxLlxuICogQHBhcmFtIHkgVGVuc29yIHdpdGggcmFuayBnZXEgMS5cbiAqIEBwYXJhbSBpbmRleGluZ1xuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1NsaWNpbmcgYW5kIEpvaW5pbmcnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVzaGdyaWQoeCwgeSwgeyBpbmRleGluZyA9ICd4eScgfSA9IHt9KSB7XG4gICAgaWYgKGluZGV4aW5nICE9PSAneHknICYmIGluZGV4aW5nICE9PSAnaWonKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7aW5kZXhpbmd9IGlzIG5vdCBhIHZhbGlkIHRoaXJkIGFyZ3VtZW50IHRvIG1lc2hncmlkYCk7XG4gICAgfVxuICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBsZXQgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnbWVzaGdyaWQnLCB4IGluc3RhbmNlb2YgVGVuc29yID8geC5kdHlwZSA6ICdmbG9hdDMyJyk7XG4gICAgaWYgKHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gWyR4XTtcbiAgICB9XG4gICAgbGV0ICR5ID0gY29udmVydFRvVGVuc29yKHksICd5JywgJ21lc2hncmlkJywgeSBpbnN0YW5jZW9mIFRlbnNvciA/IHkuZHR5cGUgOiAnZmxvYXQzMicpO1xuICAgIGNvbnN0IHcgPSBzaXplRnJvbVNoYXBlKCR4LnNoYXBlKTtcbiAgICBjb25zdCBoID0gc2l6ZUZyb21TaGFwZSgkeS5zaGFwZSk7XG4gICAgaWYgKGluZGV4aW5nID09PSAneHknKSB7XG4gICAgICAgICR4ID0gcmVzaGFwZSgkeCwgWzEsIC0xXSk7XG4gICAgICAgICR5ID0gcmVzaGFwZSgkeSwgWy0xLCAxXSk7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBtYXRNdWwob25lcyhbaCwgMV0sICR4LmR0eXBlKSwgJHgpLFxuICAgICAgICAgICAgbWF0TXVsKCR5LCBvbmVzKFsxLCB3XSwgJHkuZHR5cGUpKSxcbiAgICAgICAgXTtcbiAgICB9XG4gICAgJHggPSByZXNoYXBlKCR4LCBbLTEsIDFdKTtcbiAgICAkeSA9IHJlc2hhcGUoJHksIFsxLCAtMV0pO1xuICAgIHJldHVybiBbXG4gICAgICAgIG1hdE11bCgkeCwgb25lcyhbMSwgaF0sICR4LmR0eXBlKSksXG4gICAgICAgIG1hdE11bChvbmVzKFt3LCAxXSwgJHkuZHR5cGUpLCAkeSksXG4gICAgXTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1lc2hncmlkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBNaW4gfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgbWluaW11bSB2YWx1ZSBmcm9tIHRoZSBpbnB1dC5cbiAqXG4gKiBSZWR1Y2VzIHRoZSBpbnB1dCBhbG9uZyB0aGUgZGltZW5zaW9ucyBnaXZlbiBpbiBgYXhlc2AuIFVubGVzcyBga2VlcERpbXNgXG4gKiBpcyB0cnVlLCB0aGUgcmFuayBvZiB0aGUgYXJyYXkgaXMgcmVkdWNlZCBieSAxIGZvciBlYWNoIGVudHJ5IGluIGBheGVzYC5cbiAqIElmIGBrZWVwRGltc2AgaXMgdHJ1ZSwgdGhlIHJlZHVjZWQgZGltZW5zaW9ucyBhcmUgcmV0YWluZWQgd2l0aCBsZW5ndGggMS5cbiAqIElmIGBheGVzYCBoYXMgbm8gZW50cmllcywgYWxsIGRpbWVuc2lvbnMgYXJlIHJlZHVjZWQsIGFuZCBhbiBhcnJheSB3aXRoIGFcbiAqIHNpbmdsZSBlbGVtZW50IGlzIHJldHVybmVkLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqXG4gKiB4Lm1pbigpLnByaW50KCk7ICAvLyBvciB0Zi5taW4oeClcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pO1xuICpcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5taW4oYXhpcykucHJpbnQoKTsgIC8vIG9yIHRmLm1pbih4LCBheGlzKVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IFRlbnNvci5cbiAqIEBwYXJhbSBheGlzIFRoZSBkaW1lbnNpb24ocykgdG8gcmVkdWNlLiBCeSBkZWZhdWx0IGl0IHJlZHVjZXNcbiAqICAgICBhbGwgZGltZW5zaW9ucy5cbiAqIEBwYXJhbSBrZWVwRGltcyBJZiB0cnVlLCByZXRhaW5zIHJlZHVjZWQgZGltZW5zaW9ucyB3aXRoIHNpemUgMS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdSZWR1Y3Rpb24nfVxuICovXG5mdW5jdGlvbiBtaW5fKHgsIGF4aXMgPSBudWxsLCBrZWVwRGltcyA9IGZhbHNlKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnbWluJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBheGlzLCBrZWVwRGltcyB9O1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChNaW4sIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IG1pbiA9IG9wKHsgbWluXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1pbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTWluaW11bSB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBtYWtlVHlwZXNNYXRjaCB9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSB9IGZyb20gJy4vYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0IHsgY2FzdCB9IGZyb20gJy4vY2FzdCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV0dXJucyB0aGUgbWluIG9mIGEgYW5kIGIgKGBhIDwgYiA/IGEgOiBiYCkgZWxlbWVudC13aXNlLlxuICogU3VwcG9ydHMgYnJvYWRjYXN0aW5nLlxuICpcbiAqIFdlIGFsc28gZXhwb3NlIGBtaW5pbXVtU3RyaWN0YCB3aGljaCBoYXMgdGhlIHNhbWUgc2lnbmF0dXJlIGFzIHRoaXMgb3AgYW5kXG4gKiBhc3NlcnRzIHRoYXQgYGFgIGFuZCBgYmAgYXJlIHRoZSBzYW1lIHNoYXBlIChkb2VzIG5vdCBicm9hZGNhc3QpLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDQsIDMsIDE2XSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzEsIDIsIDksIDRdKTtcbiAqXG4gKiBhLm1pbmltdW0oYikucHJpbnQoKTsgIC8vIG9yIHRmLm1pbmltdW0oYSwgYilcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBCcm9hZGNhc3QgbWluaW11bSBhIHdpdGggYi5cbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMiwgNCwgNiwgOF0pO1xuICogY29uc3QgYiA9IHRmLnNjYWxhcig1KTtcbiAqXG4gKiBhLm1pbmltdW0oYikucHJpbnQoKTsgIC8vIG9yIHRmLm1pbmltdW0oYSwgYilcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCB0ZW5zb3IuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIHRlbnNvci4gTXVzdCBoYXZlIHRoZSBzYW1lIHR5cGUgYXMgYGFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0FyaXRobWV0aWMnfVxuICovXG5mdW5jdGlvbiBtaW5pbXVtXyhhLCBiKSB7XG4gICAgbGV0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ21pbmltdW0nKTtcbiAgICBsZXQgJGIgPSBjb252ZXJ0VG9UZW5zb3IoYiwgJ2InLCAnbWluaW11bScpO1xuICAgIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcbiAgICBpZiAoJGEuZHR5cGUgPT09ICdib29sJykge1xuICAgICAgICAkYSA9IGNhc3QoJGEsICdpbnQzMicpO1xuICAgICAgICAkYiA9IGNhc3QoJGIsICdpbnQzMicpO1xuICAgIH1cbiAgICBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSgkYS5zaGFwZSwgJGIuc2hhcGUpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgYTogJGEsIGI6ICRiIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoTWluaW11bSwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBtaW5pbXVtID0gb3AoeyBtaW5pbXVtXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1pbmltdW0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IE1pcnJvclBhZCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBQYWRzIGEgYHRmLlRlbnNvcmAgdXNpbmcgbWlycm9yIHBhZGRpbmcuXG4gKlxuICogVGhpcyBvcGVyYXRpb24gaW1wbGVtZW50cyB0aGUgYFJFRkxFQ1RgIGFuZCBgU1lNTUVUUklDYCBtb2RlcyBvZiBwYWQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi5yYW5nZSgwLCA5KS5yZXNoYXBlKFsxLCAxLCAzLCAzXSk7XG4gKiB4Lm1pcnJvclBhZChbWzAsIDBdLCBbMCwgMF0sIFsyLCAyXSwgWzIsIDJdXSwgJ3JlZmxlY3QnKS5wcmludCgpO1xuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgdGVuc29yIHRvIHBhZC5cbiAqIEBwYXJhbSBwYWRkaW5ncyBBbiBhcnJheSBvZiBsZW5ndGggYFJgICh0aGUgcmFuayBvZiB0aGUgdGVuc29yKSwgd2hlcmVcbiAqIGVhY2ggZWxlbWVudCBpcyBhIGxlbmd0aC0yIHR1cGxlIG9mIGludHMgYFtwYWRCZWZvcmUsIHBhZEFmdGVyXWAsXG4gKiBzcGVjaWZ5aW5nIGhvdyBtdWNoIHRvIHBhZCBhbG9uZyBlYWNoIGRpbWVuc2lvbiBvZiB0aGUgdGVuc29yLlxuICogSW4gXCJyZWZsZWN0XCIgbW9kZSwgdGhlIHBhZGRlZCByZWdpb25zIGRvIG5vdCBpbmNsdWRlIHRoZSBib3JkZXJzLFxuICogd2hpbGUgaW4gXCJzeW1tZXRyaWNcIiBtb2RlIHRoZSBwYWRkZWQgcmVnaW9ucyBkbyBpbmNsdWRlIHRoZSBib3JkZXJzLlxuICogRm9yIGV4YW1wbGUsIGlmIHRoZSBpbnB1dCBpcyBgWzEsIDIsIDNdYCBhbmQgcGFkZGluZ3MgaXMgYFswLCAyXWAsXG4gKiB0aGVuIHRoZSBvdXRwdXQgaXMgYFsxLCAyLCAzLCAyLCAxXWAgaW4gXCJyZWZsZWN0XCIgbW9kZSwgYW5kXG4gKiBgWzEsIDIsIDMsIDMsIDJdYCBpbiBcInN5bW1ldHJpY1wiIG1vZGUuXG4gKiBJZiBgbW9kZWAgaXMgXCJyZWZsZWN0XCIgdGhlbiBib3RoIGBwYWRkaW5nc1tELCAwXWAgYW5kIGBwYWRkaW5nc1tELCAxXWBcbiAqIG11c3QgYmUgbm8gZ3JlYXRlciB0aGFuIGB4LnNoYXBlW0RdIC0gMWAuIElmIG1vZGUgaXMgXCJzeW1tZXRyaWNcIlxuICogdGhlbiBib3RoIGBwYWRkaW5nc1tELCAwXWAgYW5kIGBwYWRkaW5nc1tELCAxXWAgbXVzdCBiZSBubyBncmVhdGVyIHRoYW5cbiAqIGB4LnNoYXBlW0RdYFxuICogQHBhcmFtIG1vZGUgU3RyaW5nIHRvIHNwZWNpZnkgcGFkZGluZyBtb2RlLiBDYW4gYmUgYCdyZWZsZWN0JyB8ICdzeW1tZXRyaWMnYFxuICovXG4vKiogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnVHJhbnNmb3JtYXRpb25zJ30gKi9cbmZ1bmN0aW9uIG1pcnJvclBhZF8oeCwgcGFkZGluZ3MsIG1vZGUpIHtcbiAgICB1dGlsLmFzc2VydChtb2RlID09PSAncmVmbGVjdCcgfHwgbW9kZSA9PT0gJ3N5bW1ldHJpYycsICgpID0+IGBJbnZhbGlkIG1vZGUuIE1vZGUgbXVzdCBiZSBlaXRoZXIgcmVmbGVjdCBvciBzeW1tZXRyaWMuIGAgK1xuICAgICAgICBgR290ICR7bW9kZX0uYCk7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnbWlycm9yUGFkJyk7XG4gICAgaWYgKCR4LnJhbmsgPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXJyb3JQYWQoc2NhbGFyKSBpcyBub3QgZGVmaW5lZC4gJyArXG4gICAgICAgICAgICAnUGFzcyBub24tc2NhbGFyIHRvIG1pcnJvclBhZCcpO1xuICAgIH1cbiAgICB1dGlsLmFzc2VydChwYWRkaW5ncy5sZW5ndGggPT09ICR4LnJhbmssICgpID0+IGBQYWRkaW5nIGRvZXNuJ3QgbWF0Y2ggaW5wdXQuIE11c3QgYmUgJHskeC5yYW5rfS4gYCArXG4gICAgICAgIGBHb3QgJHtwYWRkaW5ncy5sZW5ndGh9LmApO1xuICAgIGNvbnN0IHNoYXBlT2Zmc2V0ID0gbW9kZSA9PT0gJ3JlZmxlY3QnID8gMSA6IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAkeC5yYW5rOyBpKyspIHtcbiAgICAgICAgdXRpbC5hc3NlcnQocGFkZGluZ3NbaV0ubGVuZ3RoID09PSAyLCAoKSA9PiBgSW52YWxpZCBudW1iZXIgb2YgcGFkZGluZ3MuIE11c3QgYmUgbGVuZ3RoIG9mIDIgZWFjaC5gKTtcbiAgICAgICAgdXRpbC5hc3NlcnQocGFkZGluZ3NbaV1bMF0gPj0gMCAmJiBwYWRkaW5nc1tpXVswXSA8PSAkeC5zaGFwZVtpXSAtIHNoYXBlT2Zmc2V0ICYmXG4gICAgICAgICAgICBwYWRkaW5nc1tpXVsxXSA+PSAwICYmIHBhZGRpbmdzW2ldWzFdIDw9ICR4LnNoYXBlW2ldIC0gc2hhcGVPZmZzZXQsICgpID0+IGBQYWRkaW5nIGluIGRpbWVuc2lvbiAke2l9IGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgYCArXG4gICAgICAgICAgICBgdG8gJHskeC5zaGFwZVtpXSAtIHNoYXBlT2Zmc2V0fSBvciBsZXNzIHRoYW4gMCBmb3IgaW5wdXQgb2YgYCArXG4gICAgICAgICAgICBgc2hhcGUgJHskeC5zaGFwZX1gKTtcbiAgICB9XG4gICAgY29uc3QgYXR0cnMgPSB7IHBhZGRpbmdzLCBtb2RlIH07XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKE1pcnJvclBhZCwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgbWlycm9yUGFkID0gb3AoeyBtaXJyb3JQYWRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWlycm9yX3BhZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTW9kIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IG1ha2VUeXBlc01hdGNoIH0gZnJvbSAnLi4vdGVuc29yX3V0aWwnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBtb2Qgb2YgYSBhbmQgYiBlbGVtZW50LXdpc2UuXG4gKiBgZmxvb3IoeCAvIHkpICogeSArIG1vZCh4LCB5KSA9IHhgXG4gKiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuXG4gKlxuICogV2UgYWxzbyBleHBvc2UgYHRmLm1vZFN0cmljdGAgd2hpY2ggaGFzIHRoZSBzYW1lIHNpZ25hdHVyZSBhcyB0aGlzIG9wIGFuZFxuICogYXNzZXJ0cyB0aGF0IGBhYCBhbmQgYGJgIGFyZSB0aGUgc2FtZSBzaGFwZSAoZG9lcyBub3QgYnJvYWRjYXN0KS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCA0LCAzLCAxNl0pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFsxLCAyLCA5LCA0XSk7XG4gKlxuICogYS5tb2QoYikucHJpbnQoKTsgIC8vIG9yIHRmLm1vZChhLCBiKVxuICogYGBgXG4gKlxuICogYGBganNcbiAqIC8vIEJyb2FkY2FzdCBhIG1vZCBiLlxuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsyLCA0LCA2LCA4XSk7XG4gKiBjb25zdCBiID0gdGYuc2NhbGFyKDUpO1xuICpcbiAqIGEubW9kKGIpLnByaW50KCk7ICAvLyBvciB0Zi5tb2QoYSwgYilcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCB0ZW5zb3IuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIHRlbnNvci4gTXVzdCBoYXZlIHRoZSBzYW1lIHR5cGUgYXMgYGFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0FyaXRobWV0aWMnfVxuICovXG5mdW5jdGlvbiBtb2RfKGEsIGIpIHtcbiAgICBsZXQgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnbW9kJyk7XG4gICAgbGV0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ21vZCcpO1xuICAgIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGE6ICRhLCBiOiAkYiB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKE1vZCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBtb2QgPSBvcCh7IG1vZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tb2QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IHBhcnNlQXhpc1BhcmFtIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBleHBhbmRTaGFwZVRvS2VlcERpbSB9IGZyb20gJy4vYXhpc191dGlsJztcbmltcG9ydCB7IGNhc3QgfSBmcm9tICcuL2Nhc3QnO1xuaW1wb3J0IHsgbWVhbiB9IGZyb20gJy4vbWVhbic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL3Jlc2hhcGUnO1xuaW1wb3J0IHsgc3F1YXJlIH0gZnJvbSAnLi9zcXVhcmUnO1xuaW1wb3J0IHsgc3ViIH0gZnJvbSAnLi9zdWInO1xuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBtZWFuIGFuZCB2YXJpYW5jZSBvZiBgeGAuIFRoZSBtZWFuIGFuZCB2YXJpYW5jZSBhcmVcbiAqIGNhbGN1bGF0ZWQgYnkgYWdncmVnYXRpbmcgdGhlIGNvbnRlbnRzIG9mIGB4YCBhY3Jvc3MgYGF4ZXNgLiBJZiBgeGAgaXNcbiAqIDEtRCBhbmQgYGF4ZXMgPSBbMF1gIHRoaXMgaXMganVzdCB0aGUgbWVhbiBhbmQgdmFyaWFuY2Ugb2YgYSB2ZWN0b3IuXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBheGlzIFRoZSBkaW1lbnNpb24ocykgYWxvbmcgd2l0aCB0byBjb21wdXRlIG1lYW4gYW5kXG4gKiAgICAgdmFyaWFuY2UuIEJ5IGRlZmF1bHQgaXQgcmVkdWNlcyBhbGwgZGltZW5zaW9ucy5cbiAqIEBwYXJhbSBrZWVwRGltcyBJZiB0cnVlLCB0aGUgbW9tZW50cyBoYXZlIHRoZSBzYW1lIGRpbWVuc2lvbmFsaXR5IGFzIHRoZVxuICogICAgIGlucHV0LlxuICogQHJldHVybiBBbiBvYmplY3Qgd2l0aCB0d28ga2V5czogYG1lYW5gIGFuZCBgdmFyaWFuY2VgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ05vcm1hbGl6YXRpb24nfVxuICovXG5mdW5jdGlvbiBtb21lbnRzXyh4LCBheGlzID0gbnVsbCwga2VlcERpbXMgPSBmYWxzZSkge1xuICAgIHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnbW9tZW50cycpO1xuICAgIGNvbnN0IGF4ZXMgPSBwYXJzZUF4aXNQYXJhbShheGlzLCB4LnNoYXBlKTtcbiAgICBjb25zdCB4TWVhbiA9IG1lYW4oeCwgYXhlcywga2VlcERpbXMpO1xuICAgIGxldCBrZWVwRGltc1NoYXBlID0geE1lYW4uc2hhcGU7XG4gICAgaWYgKCFrZWVwRGltcykge1xuICAgICAgICBrZWVwRGltc1NoYXBlID0gZXhwYW5kU2hhcGVUb0tlZXBEaW0oeE1lYW4uc2hhcGUsIGF4ZXMpO1xuICAgIH1cbiAgICBjb25zdCBkZXZTcXVhcmVkID0gc3F1YXJlKHN1YihjYXN0KHgsICdmbG9hdDMyJyksIHJlc2hhcGUoeE1lYW4sIGtlZXBEaW1zU2hhcGUpKSk7XG4gICAgY29uc3QgdmFyaWFuY2UgPSBtZWFuKGRldlNxdWFyZWQsIGF4ZXMsIGtlZXBEaW1zKTtcbiAgICByZXR1cm4geyBtZWFuOiB4TWVhbiwgdmFyaWFuY2UgfTtcbn1cbmV4cG9ydCBjb25zdCBtb21lbnRzID0gb3AoeyBtb21lbnRzXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1vbWVudHMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYXNzZXJ0VHlwZXNNYXRjaCB9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgYWRkIH0gZnJvbSAnLi9hZGQnO1xuaW1wb3J0IHsgZGl2IH0gZnJvbSAnLi9kaXYnO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi9tdWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyBwb3cgfSBmcm9tICcuL3Bvdyc7XG5pbXBvcnQgeyBzY2FsYXIgfSBmcm9tICcuL3NjYWxhcic7XG5pbXBvcnQgeyBzdWIgfSBmcm9tICcuL3N1Yic7XG4vKipcbiAqIENvbXB1dGUgdGhlIG1vdmluZyBhdmVyYWdlIG9mIGEgdmFyaWFibGUuXG4gKlxuICogV2l0aG91dCB6ZXJvRGViaWFzLCB0aGUgbW92aW5nIGF2ZXJhZ2Ugb3BlcmF0aW9uIGlzIGRlZmluZWQgYnk6XG4gKiAgIGB2ICs9IGRlbHRhYFxuICogd2hlcmVcbiAqICAgYGRlbHRhID0gKDEgLSBkZWNheSkgKiAoeCAtIHYpYFxuICpcbiAqIFdpdGggemVyb0RlYmlhcyAoZGVmYXVsdCksIHRoZSBgZGVsdGFgIHRlcm0gaXMgc2NhbGVkIHRvIGRlYmlhcyB0aGVcbiAqIGVmZmVjdCBvZiB0aGUgKGFzc3VtZWQpIHplcm8taW5pdGlhbGl6YXRpb24gb2YgYHZgLlxuICogICBgZGVsdGEgLz0gKDEgLSBkZWNheSBeIHN0ZXApYFxuICpcbiAqIEZvciBtb3JlIGRldGFpbHMgb24gdGhlIHplcm8tZGViaWFzaW5nIGFsZ29yaXRobSwgc2VlOlxuICogICBodHRwczovL2FyeGl2Lm9yZy9hYnMvMTQxMi42OTgwXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgY29tcGxldGVseSBzdGF0ZWxlc3MgYW5kIGRvZXMgbm90IGtlZXAgdHJhY2sgb2ZcbiAqIHN0ZXAgY291bnQuIFRoZSBzdGVwIGNvdW50IG5lZWRzIHRvIGJlIG1haW50YWluZWQgYnkgdGhlIGNhbGxlciBhbmQgcGFzc2VkXG4gKiBpbiBhcyBgc3RlcGAuXG4gKlxuICogQHBhcmFtIHYgVGhlIGN1cnJlbnQgbW92aW5nIGF2ZXJhZ2UgdmFsdWUuXG4gKiBAcGFyYW0geCBOZXcgaW5wdXQgdmFsdWUsIG11c3QgaGF2ZSB0aGUgc2FtZSBzaGFwZSBhbmQgZHR5cGUgYXMgYHZgLlxuICogQHBhcmFtIGRlY2F5IFRoZSBkZWNheSBmYWN0b3IuIFR5cGljYWwgdmFsdWVzIGFyZSAwLjk1IGFuZCAwLjk5LlxuICogQHBhcmFtIHN0ZXAgU3RlcCBjb3VudC5cbiAqIEBwYXJhbSB6ZXJvRGViaWFzOiBXaGV0aGVyIHplcm9EZWJpYXMgaXMgdG8gYmUgcGVyZm9ybWVkIChkZWZhdWx0OiBgdHJ1ZWApLlxuICogQHJldHVybnMgVGhlIG5ldyBtb3ZpbmcgYXZlcmFnZSB2YWx1ZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdNb3ZpbmcgQXZlcmFnZSd9XG4gKi9cbmZ1bmN0aW9uIG1vdmluZ0F2ZXJhZ2VfKHYsIHgsIGRlY2F5LCBzdGVwLCB6ZXJvRGViaWFzID0gdHJ1ZSkge1xuICAgIGNvbnN0ICR2ID0gY29udmVydFRvVGVuc29yKHYsICd2JywgJ21vdmluZ0F2ZXJhZ2UnKTtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdtb3ZpbmdBdmVyYWdlJyk7XG4gICAgY29uc3QgJGRlY2F5ID0gY29udmVydFRvVGVuc29yKGRlY2F5LCAnZGVjYXknLCAnbW92aW5nQXZlcmFnZScpO1xuICAgIGFzc2VydFR5cGVzTWF0Y2goJHYsICR4KTtcbiAgICB1dGlsLmFzc2VydCh1dGlsLmFycmF5c0VxdWFsKCR2LnNoYXBlLCAkeC5zaGFwZSksICgpID0+ICdTaGFwZSBtaXNtYXRjaCBpbiB2IGFuZCB4Jyk7XG4gICAgY29uc3Qgb25lID0gc2NhbGFyKDEpO1xuICAgIGNvbnN0IG9uZU1pbnVzRGVjYXkgPSBzdWIob25lLCAkZGVjYXkpO1xuICAgIGxldCB1cGRhdGUgPSBtdWwoc3ViKCR4LCAkdiksIG9uZU1pbnVzRGVjYXkpO1xuICAgIGlmICh6ZXJvRGViaWFzKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHN0ZXAgIT0gbnVsbCwgKCkgPT4gJ1doZW4gdXNpbmcgemVyb0RlYmlhczogdHJ1ZSwgc3RlcCBpcyByZXF1aXJlZC4nKTtcbiAgICAgICAgY29uc3QgJHN0ZXAgPSBjb252ZXJ0VG9UZW5zb3Ioc3RlcCwgJ3N0ZXAnLCAnbW92aW5nQXZlcmFnZScpO1xuICAgICAgICB1cGRhdGUgPSBkaXYodXBkYXRlLCBzdWIob25lLCBwb3coJGRlY2F5LCAkc3RlcCkpKTtcbiAgICB9XG4gICAgcmV0dXJuIGFkZCgkdiwgdXBkYXRlKTtcbn1cbmV4cG9ydCBjb25zdCBtb3ZpbmdBdmVyYWdlID0gb3AoeyBtb3ZpbmdBdmVyYWdlXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1vdmluZ19hdmVyYWdlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBNdWx0aXBseSB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBtYWtlVHlwZXNNYXRjaCB9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogTXVsdGlwbGllcyB0d28gYHRmLlRlbnNvcmBzIGVsZW1lbnQtd2lzZSwgQSAqIEIuIFN1cHBvcnRzIGJyb2FkY2FzdGluZy5cbiAqXG4gKiBXZSBhbHNvIGV4cG9zZSBgdGYubXVsU3RyaWN0YCB3aGljaCBoYXMgdGhlIHNhbWUgc2lnbmF0dXJlIGFzIHRoaXMgb3AgYW5kXG4gKiBhc3NlcnRzIHRoYXQgYGFgIGFuZCBgYmAgYXJlIHRoZSBzYW1lIHNoYXBlIChkb2VzIG5vdCBicm9hZGNhc3QpLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDIsIDMsIDRdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbMiwgMywgNCwgNV0pO1xuICpcbiAqIGEubXVsKGIpLnByaW50KCk7ICAvLyBvciB0Zi5tdWwoYSwgYilcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBCcm9hZGNhc3QgbXVsIGEgd2l0aCBiLlxuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzLCA0XSk7XG4gKiBjb25zdCBiID0gdGYuc2NhbGFyKDUpO1xuICpcbiAqIGEubXVsKGIpLnByaW50KCk7ICAvLyBvciB0Zi5tdWwoYSwgYilcbiAqIGBgYFxuICogQHBhcmFtIGEgVGhlIGZpcnN0IHRlbnNvciB0byBtdWx0aXBseS5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgdGVuc29yIHRvIG11bHRpcGx5LiBNdXN0IGhhdmUgdGhlIHNhbWUgZHR5cGUgYXMgYGFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0FyaXRobWV0aWMnfVxuICovXG5mdW5jdGlvbiBtdWxfKGEsIGIpIHtcbiAgICBsZXQgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnbXVsJyk7XG4gICAgbGV0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ211bCcpO1xuICAgIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGE6ICRhLCBiOiAkYiB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKE11bHRpcGx5LCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IG11bCA9IG9wKHsgbXVsXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW11bC5qcy5tYXAiLCJpbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IsIGNvbnZlcnRUb1RlbnNvckFycmF5IH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgbmV4dCBzdGF0ZXMgYW5kIG91dHB1dHMgb2YgYSBzdGFjayBvZiBMU1RNQ2VsbHMuXG4gKlxuICogRWFjaCBjZWxsIG91dHB1dCBpcyB1c2VkIGFzIGlucHV0IHRvIHRoZSBuZXh0IGNlbGwuXG4gKlxuICogUmV0dXJucyBgW2NlbGxTdGF0ZSwgY2VsbE91dHB1dF1gLlxuICpcbiAqIERlcml2ZWQgZnJvbSB0Zi5jb250cmliLnJuLk11bHRpUk5OQ2VsbC5cbiAqXG4gKiBAcGFyYW0gbHN0bUNlbGxzIEFycmF5IG9mIExTVE1DZWxsIGZ1bmN0aW9ucy5cbiAqIEBwYXJhbSBkYXRhIFRoZSBpbnB1dCB0byB0aGUgY2VsbC5cbiAqIEBwYXJhbSBjIEFycmF5IG9mIHByZXZpb3VzIGNlbGwgc3RhdGVzLlxuICogQHBhcmFtIGggQXJyYXkgb2YgcHJldmlvdXMgY2VsbCBvdXRwdXRzLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1JOTid9XG4gKi9cbmZ1bmN0aW9uIG11bHRpUk5OQ2VsbF8obHN0bUNlbGxzLCBkYXRhLCBjLCBoKSB7XG4gICAgY29uc3QgJGRhdGEgPSBjb252ZXJ0VG9UZW5zb3IoZGF0YSwgJ2RhdGEnLCAnbXVsdGlSTk5DZWxsJyk7XG4gICAgY29uc3QgJGMgPSBjb252ZXJ0VG9UZW5zb3JBcnJheShjLCAnYycsICdtdWx0aVJOTkNlbGwnKTtcbiAgICBjb25zdCAkaCA9IGNvbnZlcnRUb1RlbnNvckFycmF5KGgsICdoJywgJ211bHRpUk5OQ2VsbCcpO1xuICAgIGxldCBpbnB1dCA9ICRkYXRhO1xuICAgIGNvbnN0IG5ld1N0YXRlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbHN0bUNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IGxzdG1DZWxsc1tpXShpbnB1dCwgJGNbaV0sICRoW2ldKTtcbiAgICAgICAgbmV3U3RhdGVzLnB1c2gob3V0cHV0WzBdKTtcbiAgICAgICAgbmV3U3RhdGVzLnB1c2gob3V0cHV0WzFdKTtcbiAgICAgICAgaW5wdXQgPSBvdXRwdXRbMV07XG4gICAgfVxuICAgIGNvbnN0IG5ld0MgPSBbXTtcbiAgICBjb25zdCBuZXdIID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdTdGF0ZXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgbmV3Qy5wdXNoKG5ld1N0YXRlc1tpXSk7XG4gICAgICAgIG5ld0gucHVzaChuZXdTdGF0ZXNbaSArIDFdKTtcbiAgICB9XG4gICAgcmV0dXJuIFtuZXdDLCBuZXdIXTtcbn1cbmV4cG9ydCBjb25zdCBtdWx0aVJOTkNlbGwgPSBvcCh7IG11bHRpUk5OQ2VsbF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tdWx0aV9ybm5fY2VsbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTXVsdGlub21pYWwgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vcmVzaGFwZSc7XG4vKipcbiAqIENyZWF0ZXMgYSBgdGYuVGVuc29yYCB3aXRoIHZhbHVlcyBkcmF3biBmcm9tIGEgbXVsdGlub21pYWwgZGlzdHJpYnV0aW9uLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBwcm9icyA9IHRmLnRlbnNvcihbLjc1LCAuMjVdKTtcbiAqIHRmLm11bHRpbm9taWFsKHByb2JzLCAzKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGxvZ2l0cyAxRCBhcnJheSB3aXRoIHVubm9ybWFsaXplZCBsb2ctcHJvYmFiaWxpdGllcywgb3JcbiAqICAgICAyRCBhcnJheSBvZiBzaGFwZSBgW2JhdGNoU2l6ZSwgbnVtT3V0Y29tZXNdYC4gU2VlIHRoZSBgbm9ybWFsaXplZGBcbiAqICAgICBwYXJhbWV0ZXIuXG4gKiBAcGFyYW0gbnVtU2FtcGxlcyBOdW1iZXIgb2Ygc2FtcGxlcyB0byBkcmF3IGZvciBlYWNoIHJvdyBzbGljZS5cbiAqIEBwYXJhbSBzZWVkIFRoZSBzZWVkIG51bWJlci5cbiAqIEBwYXJhbSBub3JtYWxpemVkIFdoZXRoZXIgdGhlIHByb3ZpZGVkIGBsb2dpdHNgIGFyZSBub3JtYWxpemVkIHRydWVcbiAqICAgICBwcm9iYWJpbGl0aWVzIChzdW0gdG8gMSkuIERlZmF1bHRzIHRvIGZhbHNlLlxuICogQHJldHVybiAxRCBhcnJheSBvZiBzaGFwZSBgW251bVNhbXBsZXNdYCwgb3IgMkQgYXJyYXkgb2Ygc2hhcGVcbiAqICAgICBgW2JhdGNoU2l6ZSwgbnVtU2FtcGxlc11gLCBkZXBlbmRpbmcgb24gdGhlIHJhbmsgb2YgdGhlIGlucHV0LlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1JhbmRvbSd9XG4gKi9cbmZ1bmN0aW9uIG11bHRpbm9taWFsXyhsb2dpdHMsIG51bVNhbXBsZXMsIHNlZWQsIG5vcm1hbGl6ZWQgPSBmYWxzZSkge1xuICAgIGNvbnN0ICRsb2dpdHMgPSBjb252ZXJ0VG9UZW5zb3IobG9naXRzLCAnbG9naXRzJywgJ211bHRpbm9taWFsJyk7XG4gICAgY29uc3QgbnVtT3V0Y29tZXMgPSAkbG9naXRzLnNpemU7XG4gICAgY29uc3Qgb3JpZ1JhbmsgPSAkbG9naXRzLnJhbms7XG4gICAgaWYgKG51bU91dGNvbWVzIDwgMikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIG11bHRpbm9taWFsOiB5b3UgbmVlZCBhdCBsZWFzdCAyIG91dGNvbWVzLCBidXQgZ290IGAgK1xuICAgICAgICAgICAgYCR7bnVtT3V0Y29tZXN9LmApO1xuICAgIH1cbiAgICBpZiAob3JpZ1JhbmsgPiAyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUmFuayBvZiBwcm9iYWJpbGl0aWVzIG11c3QgYmUgMSBvciAyLCBidXQgaXMgJHtvcmlnUmFua31gKTtcbiAgICB9XG4gICAgLy8gVE9ETyhsaW5hMTI4KTogSW52ZXN0aWdhdGUgY29ycmVjdCBzZWVkIGJlaGF2aW9yLiBUaGUgY29kZSBzZWVtcyBub3QgYWxsb3dcbiAgICAvLyBzZXR0aW5nIHNlZSB0byAwLlxuICAgIHNlZWQgPSBzZWVkIHx8IE1hdGgucmFuZG9tKCk7XG4gICAgLy8gVGhlIGtlcm5lbCBvbmx5IGFjY2VwdHMgKGFuZCByZXR1cm5zKSByYW5rIDIgdGVuc29ycy5cbiAgICBjb25zdCBsb2dpdHMyRCA9IG9yaWdSYW5rID09PSAxID8gcmVzaGFwZSgkbG9naXRzLCBbMSwgLTFdKSA6ICRsb2dpdHM7XG4gICAgY29uc3QgaW5wdXRzID0geyBsb2dpdHM6IGxvZ2l0czJEIH07XG4gICAgY29uc3QgYXR0cnMgPSB7IG51bVNhbXBsZXMsIHNlZWQsIG5vcm1hbGl6ZWQgfTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgY29uc3QgcmVzID0gRU5HSU5FLnJ1bktlcm5lbChNdWx0aW5vbWlhbCwgaW5wdXRzLCBhdHRycyk7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgcmV0dXJuIG9yaWdSYW5rID09PSAxID8gcmVzaGFwZShyZXMsIFtyZXMuc2l6ZV0pIDogcmVzO1xufVxuZXhwb3J0IGNvbnN0IG11bHRpbm9taWFsID0gb3AoeyBtdWx0aW5vbWlhbF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tdWx0aW5vbWlhbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTmVnIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgYC0xICogeGAgZWxlbWVudC13aXNlLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIC0yLCAwXSwgWzIsIDJdKTtcbiAqXG4gKiB4Lm5lZygpLnByaW50KCk7ICAvLyBvciB0Zi5uZWcoeClcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIG5lZ18oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ25lZycpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChOZWcsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgbmVnID0gb3AoeyBuZWdfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bmVnLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5mdW5jdGlvbiBub25NYXhTdXBwU2FuaXR5Q2hlY2soYm94ZXMsIHNjb3JlcywgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCwgc29mdE5tc1NpZ21hKSB7XG4gICAgaWYgKGlvdVRocmVzaG9sZCA9PSBudWxsKSB7XG4gICAgICAgIGlvdVRocmVzaG9sZCA9IDAuNTtcbiAgICB9XG4gICAgaWYgKHNjb3JlVGhyZXNob2xkID09IG51bGwpIHtcbiAgICAgICAgc2NvcmVUaHJlc2hvbGQgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gICAgfVxuICAgIGlmIChzb2Z0Tm1zU2lnbWEgPT0gbnVsbCkge1xuICAgICAgICBzb2Z0Tm1zU2lnbWEgPSAwLjA7XG4gICAgfVxuICAgIGNvbnN0IG51bUJveGVzID0gYm94ZXMuc2hhcGVbMF07XG4gICAgbWF4T3V0cHV0U2l6ZSA9IE1hdGgubWluKG1heE91dHB1dFNpemUsIG51bUJveGVzKTtcbiAgICB1dGlsLmFzc2VydCgwIDw9IGlvdVRocmVzaG9sZCAmJiBpb3VUaHJlc2hvbGQgPD0gMSwgKCkgPT4gYGlvdVRocmVzaG9sZCBtdXN0IGJlIGluIFswLCAxXSwgYnV0IHdhcyAnJHtpb3VUaHJlc2hvbGR9J2ApO1xuICAgIHV0aWwuYXNzZXJ0KGJveGVzLnJhbmsgPT09IDIsICgpID0+IGBib3hlcyBtdXN0IGJlIGEgMkQgdGVuc29yLCBidXQgd2FzIG9mIHJhbmsgJyR7Ym94ZXMucmFua30nYCk7XG4gICAgdXRpbC5hc3NlcnQoYm94ZXMuc2hhcGVbMV0gPT09IDQsICgpID0+IGBib3hlcyBtdXN0IGhhdmUgNCBjb2x1bW5zLCBidXQgMm5kIGRpbWVuc2lvbiB3YXMgJHtib3hlcy5zaGFwZVsxXX1gKTtcbiAgICB1dGlsLmFzc2VydChzY29yZXMucmFuayA9PT0gMSwgKCkgPT4gJ3Njb3JlcyBtdXN0IGJlIGEgMUQgdGVuc29yJyk7XG4gICAgdXRpbC5hc3NlcnQoc2NvcmVzLnNoYXBlWzBdID09PSBudW1Cb3hlcywgKCkgPT4gYHNjb3JlcyBoYXMgaW5jb21wYXRpYmxlIHNoYXBlIHdpdGggYm94ZXMuIEV4cGVjdGVkICR7bnVtQm94ZXN9LCBgICtcbiAgICAgICAgYGJ1dCB3YXMgJHtzY29yZXMuc2hhcGVbMF19YCk7XG4gICAgdXRpbC5hc3NlcnQoMCA8PSBzb2Z0Tm1zU2lnbWEgJiYgc29mdE5tc1NpZ21hIDw9IDEsICgpID0+IGBzb2Z0Tm1zU2lnbWEgbXVzdCBiZSBpbiBbMCwgMV0sIGJ1dCB3YXMgJyR7c29mdE5tc1NpZ21hfSdgKTtcbiAgICByZXR1cm4geyBtYXhPdXRwdXRTaXplLCBpb3VUaHJlc2hvbGQsIHNjb3JlVGhyZXNob2xkLCBzb2Z0Tm1zU2lnbWEgfTtcbn1cbmV4cG9ydCB7IG5vbk1heFN1cHBTYW5pdHlDaGVjayB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bm9ubWF4X3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IHBhcnNlQXhpc1BhcmFtIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBhYnMgfSBmcm9tICcuL2Ficyc7XG5pbXBvcnQgKiBhcyBheGlzX3V0aWwgZnJvbSAnLi9heGlzX3V0aWwnO1xuaW1wb3J0IHsgbWF4IH0gZnJvbSAnLi9tYXgnO1xuaW1wb3J0IHsgbWluIH0gZnJvbSAnLi9taW4nO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyBwb3cgfSBmcm9tICcuL3Bvdyc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbmltcG9ydCB7IHNjYWxhciB9IGZyb20gJy4vc2NhbGFyJztcbmltcG9ydCB7IHNxcnQgfSBmcm9tICcuL3NxcnQnO1xuaW1wb3J0IHsgc3F1YXJlIH0gZnJvbSAnLi9zcXVhcmUnO1xuaW1wb3J0IHsgc3VtIH0gZnJvbSAnLi9zdW0nO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgbm9ybSBvZiBzY2FsYXIsIHZlY3RvcnMsIGFuZCBtYXRyaWNlcy5cbiAqIFRoaXMgZnVuY3Rpb24gY2FuIGNvbXB1dGUgc2V2ZXJhbCBkaWZmZXJlbnQgdmVjdG9yIG5vcm1zICh0aGUgMS1ub3JtLCB0aGVcbiAqIEV1Y2xpZGVhbiBvciAyLW5vcm0sIHRoZSBpbmYtbm9ybSwgYW5kIGluIGdlbmVyYWwgdGhlIHAtbm9ybSBmb3IgcCA+IDApXG4gKiBhbmQgbWF0cml4IG5vcm1zIChGcm9iZW5pdXMsIDEtbm9ybSwgYW5kIGluZi1ub3JtKS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzLCA0XSk7XG4gKlxuICogeC5ub3JtKCkucHJpbnQoKTsgIC8vIG9yIHRmLm5vcm0oeClcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBhcnJheS5cbiAqIEBwYXJhbSBvcmQgT3B0aW9uYWwuIE9yZGVyIG9mIHRoZSBub3JtLiBTdXBwb3J0ZWQgbm9ybSB0eXBlcyBhcmVcbiAqIGZvbGxvd2luZzpcbiAqXG4gKiAgfCBvcmQgICAgICAgIHwgbm9ybSBmb3IgbWF0cmljZXMgICAgICAgICB8IG5vcm0gZm9yIHZlY3RvcnNcbiAqICB8LS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICB8J2V1Y2xpZGVhbicgfEZyb2Jlbml1cyBub3JtICAgICAgICAgICAgIHwyLW5vcm1cbiAqICB8J2ZybycgICAgICAgfEZyb2Jlbml1cyBub3JtXHQgICAgICAgICAgIHxcbiAqICB8SW5maW5pdHkgICAgfG1heChzdW0oYWJzKHgpLCBheGlzPTEpKSAgIHxtYXgoYWJzKHgpKVxuICogIHwtSW5maW5pdHkgICB8bWluKHN1bShhYnMoeCksIGF4aXM9MSkpICAgfG1pbihhYnMoeCkpXG4gKiAgfDEgICAgICAgICAgIHxtYXgoc3VtKGFicyh4KSwgYXhpcz0wKSkgICB8c3VtKGFicyh4KSlcbiAqICB8MiAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxzdW0oYWJzKHgpXjIpXjEvMipcbiAqXG4gKiBAcGFyYW0gYXhpcyBPcHRpb25hbC4gSWYgYXhpcyBpcyBudWxsICh0aGUgZGVmYXVsdCksIHRoZSBpbnB1dCBpc1xuICogY29uc2lkZXJlZCBhIHZlY3RvciBhbmQgYSBzaW5nbGUgdmVjdG9yIG5vcm0gaXMgY29tcHV0ZWQgb3ZlciB0aGUgZW50aXJlXG4gKiBzZXQgb2YgdmFsdWVzIGluIHRoZSBUZW5zb3IsIGkuZS4gbm9ybSh4LCBvcmQpIGlzIGVxdWl2YWxlbnRcbiAqIHRvIG5vcm0oeC5yZXNoYXBlKFstMV0pLCBvcmQpLiBJZiBheGlzIGlzIGEgaW50ZWdlciwgdGhlIGlucHV0XG4gKiBpcyBjb25zaWRlcmVkIGEgYmF0Y2ggb2YgdmVjdG9ycywgYW5kIGF4aXMgZGV0ZXJtaW5lcyB0aGUgYXhpcyBpbiB4XG4gKiBvdmVyIHdoaWNoIHRvIGNvbXB1dGUgdmVjdG9yIG5vcm1zLiBJZiBheGlzIGlzIGEgMi10dXBsZSBvZiBpbnRlZ2VyIGl0IGlzXG4gKiBjb25zaWRlcmVkIGEgYmF0Y2ggb2YgbWF0cmljZXMgYW5kIGF4aXMgZGV0ZXJtaW5lcyB0aGUgYXhlcyBpbiBOREFycmF5XG4gKiBvdmVyIHdoaWNoIHRvIGNvbXB1dGUgYSBtYXRyaXggbm9ybS5cbiAqIEBwYXJhbSBrZWVwRGltcyBPcHRpb25hbC4gSWYgdHJ1ZSwgdGhlIG5vcm0gaGF2ZSB0aGUgc2FtZSBkaW1lbnNpb25hbGl0eVxuICogYXMgdGhlIGlucHV0LlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ01hdHJpY2VzJ31cbiAqL1xuZnVuY3Rpb24gbm9ybV8oeCwgb3JkID0gJ2V1Y2xpZGVhbicsIGF4aXMgPSBudWxsLCBrZWVwRGltcyA9IGZhbHNlKSB7XG4gICAgeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdub3JtJyk7XG4gICAgY29uc3Qgbm9ybSA9IG5vcm1JbXBsKHgsIG9yZCwgYXhpcyk7XG4gICAgbGV0IGtlZXBEaW1zU2hhcGUgPSBub3JtLnNoYXBlO1xuICAgIGlmIChrZWVwRGltcykge1xuICAgICAgICBjb25zdCBheGVzID0gcGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG4gICAgICAgIGtlZXBEaW1zU2hhcGUgPSBheGlzX3V0aWwuZXhwYW5kU2hhcGVUb0tlZXBEaW0obm9ybS5zaGFwZSwgYXhlcyk7XG4gICAgfVxuICAgIHJldHVybiByZXNoYXBlKG5vcm0sIGtlZXBEaW1zU2hhcGUpO1xufVxuZnVuY3Rpb24gbm9ybUltcGwoeCwgcCwgYXhpcyA9IG51bGwpIHtcbiAgICBpZiAoeC5yYW5rID09PSAwKSB7XG4gICAgICAgIHJldHVybiBhYnMoeCk7XG4gICAgfVxuICAgIC8vIGNvbnNpZGVyIHZlY3RvciB3aGVuIG5vIGF4aXMgaXMgc3BlY2lmaWVkXG4gICAgaWYgKHgucmFuayAhPT0gMSAmJiBheGlzID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBub3JtSW1wbChyZXNoYXBlKHgsIFstMV0pLCBwLCBheGlzKTtcbiAgICB9XG4gICAgLy8gdmVjdG9yXG4gICAgaWYgKHgucmFuayA9PT0gMSB8fCB0eXBlb2YgYXhpcyA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheShheGlzKSAmJiBheGlzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBpZiAocCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIHN1bShhYnMoeCksIGF4aXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwID09PSBJbmZpbml0eSkge1xuICAgICAgICAgICAgcmV0dXJuIG1heChhYnMoeCksIGF4aXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwID09PSAtSW5maW5pdHkpIHtcbiAgICAgICAgICAgIHJldHVybiBtaW4oYWJzKHgpLCBheGlzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocCA9PT0gJ2V1Y2xpZGVhbicgfHwgcCA9PT0gMikge1xuICAgICAgICAgICAgLy8gbm9ybSh4LCAyKSA9IHN1bShhYnMoeGkpIF4gMikgXiAxLzJcbiAgICAgICAgICAgIHJldHVybiBzcXJ0KHN1bShwb3coYWJzKHgpLCBzY2FsYXIoMiwgJ2ludDMyJykpLCBheGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBpbiBub3JtOiBpbnZhbGlkIG9yZCB2YWx1ZTogJHtwfWApO1xuICAgIH1cbiAgICAvLyBtYXRyaXggKGFzc3VtcHRpb24gYXhpc1swXSA8IGF4aXNbMV0pXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXhpcykgJiYgYXhpcy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgaWYgKHAgPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXgoc3VtKGFicyh4KSwgYXhpc1swXSksIGF4aXNbMV0gLSAxKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocCA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXgoc3VtKGFicyh4KSwgYXhpc1sxXSksIGF4aXNbMF0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwID09PSAtSW5maW5pdHkpIHtcbiAgICAgICAgICAgIHJldHVybiBtaW4oc3VtKGFicyh4KSwgYXhpc1sxXSksIGF4aXNbMF0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwID09PSAnZnJvJyB8fCBwID09PSAnZXVjbGlkZWFuJykge1xuICAgICAgICAgICAgLy8gbm9ybSh4KSA9IHNxcnQoc3VtKHBvdyh4LCAyKSkpXG4gICAgICAgICAgICByZXR1cm4gc3FydChzdW0oc3F1YXJlKHgpLCBheGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBpbiBub3JtOiBpbnZhbGlkIG9yZCB2YWx1ZTogJHtwfWApO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIG5vcm06IGludmFsaWQgYXhpczogJHtheGlzfWApO1xufVxuZXhwb3J0IGNvbnN0IG5vcm0gPSBvcCh7IG5vcm1fIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bm9ybS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTm90RXF1YWwgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgbWFrZVR5cGVzTWF0Y2ggfSBmcm9tICcuLi90ZW5zb3JfdXRpbCc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUgfSBmcm9tICcuL2Jyb2FkY2FzdF91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSB0cnV0aCB2YWx1ZSBvZiAoYSAhPSBiKSBlbGVtZW50LXdpc2UuIFN1cHBvcnRzIGJyb2FkY2FzdGluZy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzAsIDIsIDNdKTtcbiAqXG4gKiBhLm5vdEVxdWFsKGIpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBpbnB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIGlucHV0IHRlbnNvci4gTXVzdCBoYXZlIHRoZSBzYW1lIGR0eXBlIGFzIGBhYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdMb2dpY2FsJ31cbiAqL1xuZnVuY3Rpb24gbm90RXF1YWxfKGEsIGIpIHtcbiAgICBsZXQgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnbm90RXF1YWwnLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgICBsZXQgJGIgPSBjb252ZXJ0VG9UZW5zb3IoYiwgJ2InLCAnbm90RXF1YWwnLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgICBbJGEsICRiXSA9IG1ha2VUeXBlc01hdGNoKCRhLCAkYik7XG4gICAgYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoJGEuc2hhcGUsICRiLnNoYXBlKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGE6ICRhLCBiOiAkYiB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKE5vdEVxdWFsLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IG5vdEVxdWFsID0gb3AoeyBub3RFcXVhbF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ub3RfZXF1YWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IE9uZUhvdCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENyZWF0ZXMgYSBvbmUtaG90IGB0Zi5UZW5zb3JgLiBUaGUgbG9jYXRpb25zIHJlcHJlc2VudGVkIGJ5IGBpbmRpY2VzYCB0YWtlXG4gKiB2YWx1ZSBgb25WYWx1ZWAgKGRlZmF1bHRzIHRvIDEpLCB3aGlsZSBhbGwgb3RoZXIgbG9jYXRpb25zIHRha2UgdmFsdWVcbiAqIGBvZmZWYWx1ZWAgKGRlZmF1bHRzIHRvIDApLiBJZiBgaW5kaWNlc2AgaXMgcmFuayBgUmAsIHRoZSBvdXRwdXQgaGFzIHJhbmtcbiAqIGBSKzFgIHdpdGggdGhlIGxhc3QgYXhpcyBvZiBzaXplIGBkZXB0aGAuXG4gKlxuICogYGBganNcbiAqIHRmLm9uZUhvdCh0Zi50ZW5zb3IxZChbMCwgMV0sICdpbnQzMicpLCAzKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGluZGljZXMgYHRmLlRlbnNvcmAgb2YgaW5kaWNlcyB3aXRoIGR0eXBlIGBpbnQzMmAuXG4gKiBAcGFyYW0gZGVwdGggVGhlIGRlcHRoIG9mIHRoZSBvbmUgaG90IGRpbWVuc2lvbi5cbiAqIEBwYXJhbSBvblZhbHVlIEEgbnVtYmVyIHVzZWQgdG8gZmlsbCBpbiB0aGUgb3V0cHV0IHdoZW4gdGhlIGluZGV4IG1hdGNoZXNcbiAqIHRoZSBsb2NhdGlvbi5cbiAqIEBwYXJhbSBvZmZWYWx1ZSBBIG51bWJlciB1c2VkIHRvIGZpbGwgaW4gdGhlIG91dHB1dCB3aGVuIHRoZSBpbmRleCBkb2VzXG4gKiAgICAgbm90IG1hdGNoIHRoZSBsb2NhdGlvbi5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmZ1bmN0aW9uIG9uZUhvdF8oaW5kaWNlcywgZGVwdGgsIG9uVmFsdWUgPSAxLCBvZmZWYWx1ZSA9IDApIHtcbiAgICBpZiAoZGVwdGggPCAyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgaW4gb25lSG90OiBkZXB0aCBtdXN0IGJlID49MiwgYnV0IGl0IGlzICR7ZGVwdGh9YCk7XG4gICAgfVxuICAgIGNvbnN0ICRpbmRpY2VzID0gY29udmVydFRvVGVuc29yKGluZGljZXMsICdpbmRpY2VzJywgJ29uZUhvdCcsICdpbnQzMicpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgaW5kaWNlczogJGluZGljZXMgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgZGVwdGgsIG9uVmFsdWUsIG9mZlZhbHVlIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoT25lSG90LCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBvbmVIb3QgPSBvcCh7IG9uZUhvdF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1vbmVfaG90LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBtYWtlT25lc1R5cGVkQXJyYXksIHNpemVGcm9tU2hhcGUgfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IGNvbXBsZXggfSBmcm9tICcuL2NvbXBsZXgnO1xuaW1wb3J0IHsgemVyb3MgfSBmcm9tICcuL3plcm9zJztcbi8qKlxuICogQ3JlYXRlcyBhIGB0Zi5UZW5zb3JgIHdpdGggYWxsIGVsZW1lbnRzIHNldCB0byAxLlxuICpcbiAqIGBgYGpzXG4gKiB0Zi5vbmVzKFsyLCAyXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBzaGFwZSBBbiBhcnJheSBvZiBpbnRlZ2VycyBkZWZpbmluZyB0aGUgb3V0cHV0IHRlbnNvciBzaGFwZS5cbiAqIEBwYXJhbSBkdHlwZSBUaGUgdHlwZSBvZiBhbiBlbGVtZW50IGluIHRoZSByZXN1bHRpbmcgdGVuc29yLiBEZWZhdWx0cyB0b1xuICogICAgICdmbG9hdCcuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gb25lcyhzaGFwZSwgZHR5cGUgPSAnZmxvYXQzMicpIHtcbiAgICBpZiAoZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICAgIGNvbnN0IHJlYWwgPSBvbmVzKHNoYXBlLCAnZmxvYXQzMicpO1xuICAgICAgICBjb25zdCBpbWFnID0gemVyb3Moc2hhcGUsICdmbG9hdDMyJyk7XG4gICAgICAgIHJldHVybiBjb21wbGV4KHJlYWwsIGltYWcpO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZXMgPSBtYWtlT25lc1R5cGVkQXJyYXkoc2l6ZUZyb21TaGFwZShzaGFwZSksIGR0eXBlKTtcbiAgICByZXR1cm4gRU5HSU5FLm1ha2VUZW5zb3IodmFsdWVzLCBzaGFwZSwgZHR5cGUpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b25lcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgT25lc0xpa2UgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDcmVhdGVzIGEgYHRmLlRlbnNvcmAgd2l0aCBhbGwgZWxlbWVudHMgc2V0IHRvIDEgd2l0aCB0aGUgc2FtZSBzaGFwZSBhcyB0aGVcbiAqIGdpdmVuIHRlbnNvci5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcihbMSwgMl0pO1xuICogdGYub25lc0xpa2UoeCkucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIHggQSB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5mdW5jdGlvbiBvbmVzTGlrZV8oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ29uZXNMaWtlJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKE9uZXNMaWtlLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IG9uZXNMaWtlID0gb3AoeyBvbmVzTGlrZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1vbmVzX2xpa2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IGlzUHJvbWlzZSB9IGZyb20gJy4uL3V0aWwnO1xuZXhwb3J0IGNvbnN0IE9QX1NDT1BFX1NVRkZJWCA9ICdfX29wJztcbi8qKlxuICogVXNlZCBmb3Igd3JhcHBpbmcgZnVuY3Rpb25zIHRoYXQgcGVyZm9ybSBtYXRoIG9wZXJhdGlvbnMgb25cbiAqIFRlbnNvcnMuIFRoZSBmdW5jdGlvbiB3aWxsIGJlIHdyYXBwZWQgaW4gYSBuYW1lZCBzY29wZSB0aGF0IGNsZWFucyBhbGxcbiAqIG1lbW9yeSB1c2FnZSBhZnRlciB0aGUgZnVuY3Rpb24gaXMgZG9uZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wKGYpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZik7XG4gICAgaWYgKGtleXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUGxlYXNlIHByb3ZpZGUgYW4gb2JqZWN0IHdpdGggYSBzaW5nbGUga2V5IGAgK1xuICAgICAgICAgICAgYChvcGVyYXRpb24gbmFtZSkgbWFwcGluZyB0byBhIGZ1bmN0aW9uLiBHb3QgYW4gb2JqZWN0IHdpdGggYCArXG4gICAgICAgICAgICBgJHtrZXlzLmxlbmd0aH0ga2V5cy5gKTtcbiAgICB9XG4gICAgbGV0IG9wTmFtZSA9IGtleXNbMF07XG4gICAgY29uc3QgZm4gPSBmW29wTmFtZV07XG4gICAgLy8gU3RyaXAgdGhlIHVuZGVyc2NvcmUgZnJvbSB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbiBuYW1lLlxuICAgIGlmIChvcE5hbWUuZW5kc1dpdGgoJ18nKSkge1xuICAgICAgICBvcE5hbWUgPSBvcE5hbWUuc3Vic3RyaW5nKDAsIG9wTmFtZS5sZW5ndGggLSAxKTtcbiAgICB9XG4gICAgLy8gYWRkIGFuIF9fb3Agc3VmZml4IHRvIGRpc3Rpbmd1aXNoIG9wcyBmcm9tIGtlcm5lbHMgaW4gdGYucHJvZmlsZVxuICAgIG9wTmFtZSA9IG9wTmFtZSArIE9QX1NDT1BFX1NVRkZJWDtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgY29uc3QgZjIgPSAoLi4uYXJncykgPT4ge1xuICAgICAgICBFTkdJTkUuc3RhcnRTY29wZShvcE5hbWUpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZm4oLi4uYXJncyk7XG4gICAgICAgICAgICBpZiAoaXNQcm9taXNlKHJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdDYW5ub3QgcmV0dXJuIGEgUHJvbWlzZSBpbnNpZGUgb2YgdGlkeS4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEVOR0lORS5lbmRTY29wZShyZXN1bHQpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgIEVOR0lORS5lbmRTY29wZShudWxsKTtcbiAgICAgICAgICAgIHRocm93IGV4O1xuICAgICAgICB9XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZjIsICduYW1lJywgeyB2YWx1ZTogb3BOYW1lLCBjb25maWd1cmFibGU6IHRydWUgfSk7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgIHJldHVybiBmMjtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW9wZXJhdGlvbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vLyBNb2R1bGFyaXplZCBvcHMuXG5leHBvcnQgeyBhYnMgfSBmcm9tICcuL2Ficyc7XG5leHBvcnQgeyBhY29zIH0gZnJvbSAnLi9hY29zJztcbmV4cG9ydCB7IGFjb3NoIH0gZnJvbSAnLi9hY29zaCc7XG5leHBvcnQgeyBhZGQgfSBmcm9tICcuL2FkZCc7XG5leHBvcnQgeyBhZGROIH0gZnJvbSAnLi9hZGRfbic7XG5leHBvcnQgeyBhbGwgfSBmcm9tICcuL2FsbCc7XG5leHBvcnQgeyBhbnkgfSBmcm9tICcuL2FueSc7XG5leHBvcnQgeyBhcmdNYXggfSBmcm9tICcuL2FyZ19tYXgnO1xuZXhwb3J0IHsgYXJnTWluIH0gZnJvbSAnLi9hcmdfbWluJztcbmV4cG9ydCB7IGFzaW4gfSBmcm9tICcuL2FzaW4nO1xuZXhwb3J0IHsgYXNpbmggfSBmcm9tICcuL2FzaW5oJztcbmV4cG9ydCB7IGF0YW4gfSBmcm9tICcuL2F0YW4nO1xuZXhwb3J0IHsgYXRhbjIgfSBmcm9tICcuL2F0YW4yJztcbmV4cG9ydCB7IGF0YW5oIH0gZnJvbSAnLi9hdGFuaCc7XG5leHBvcnQgeyBhdmdQb29sIH0gZnJvbSAnLi9hdmdfcG9vbCc7XG5leHBvcnQgeyBhdmdQb29sM2QgfSBmcm9tICcuL2F2Z19wb29sXzNkJztcbmV4cG9ydCB7IGJhc2ljTFNUTUNlbGwgfSBmcm9tICcuL2Jhc2ljX2xzdG1fY2VsbCc7XG5leHBvcnQgeyBiYXRjaFRvU3BhY2VORCB9IGZyb20gJy4vYmF0Y2hfdG9fc3BhY2VfbmQnO1xuZXhwb3J0IHsgYmF0Y2hOb3JtIH0gZnJvbSAnLi9iYXRjaG5vcm0nO1xuZXhwb3J0IHsgYmF0Y2hOb3JtMmQgfSBmcm9tICcuL2JhdGNobm9ybTJkJztcbmV4cG9ydCB7IGJhdGNoTm9ybTNkIH0gZnJvbSAnLi9iYXRjaG5vcm0zZCc7XG5leHBvcnQgeyBiYXRjaE5vcm00ZCB9IGZyb20gJy4vYmF0Y2hub3JtNGQnO1xuZXhwb3J0IHsgYmluY291bnQgfSBmcm9tICcuL2JpbmNvdW50JztcbmV4cG9ydCB7IGJyb2FkY2FzdFRvIH0gZnJvbSAnLi9icm9hZGNhc3RfdG8nO1xuZXhwb3J0IHsgYnVmZmVyIH0gZnJvbSAnLi9idWZmZXInO1xuZXhwb3J0IHsgY2FzdCB9IGZyb20gJy4vY2FzdCc7XG5leHBvcnQgeyBjZWlsIH0gZnJvbSAnLi9jZWlsJztcbmV4cG9ydCB7IGNsaXBCeVZhbHVlIH0gZnJvbSAnLi9jbGlwX2J5X3ZhbHVlJztcbmV4cG9ydCB7IGNsb25lIH0gZnJvbSAnLi9jbG9uZSc7XG5leHBvcnQgeyBjb21wbGV4IH0gZnJvbSAnLi9jb21wbGV4JztcbmV4cG9ydCB7IGNvbmNhdCB9IGZyb20gJy4vY29uY2F0JztcbmV4cG9ydCB7IGNvbmNhdDFkIH0gZnJvbSAnLi9jb25jYXRfMWQnO1xuZXhwb3J0IHsgY29uY2F0MmQgfSBmcm9tICcuL2NvbmNhdF8yZCc7XG5leHBvcnQgeyBjb25jYXQzZCB9IGZyb20gJy4vY29uY2F0XzNkJztcbmV4cG9ydCB7IGNvbmNhdDRkIH0gZnJvbSAnLi9jb25jYXRfNGQnO1xuZXhwb3J0IHsgY29udjFkIH0gZnJvbSAnLi9jb252MWQnO1xuZXhwb3J0IHsgY29udjJkIH0gZnJvbSAnLi9jb252MmQnO1xuZXhwb3J0IHsgY29udjJkVHJhbnNwb3NlIH0gZnJvbSAnLi9jb252MmRfdHJhbnNwb3NlJztcbmV4cG9ydCB7IGNvbnYzZCB9IGZyb20gJy4vY29udjNkJztcbmV4cG9ydCB7IGNvbnYzZFRyYW5zcG9zZSB9IGZyb20gJy4vY29udjNkX3RyYW5zcG9zZSc7XG5leHBvcnQgeyBjb3MgfSBmcm9tICcuL2Nvcyc7XG5leHBvcnQgeyBjb3NoIH0gZnJvbSAnLi9jb3NoJztcbmV4cG9ydCB7IGN1bXN1bSB9IGZyb20gJy4vY3Vtc3VtJztcbmV4cG9ydCB7IGRlbnNlQmluY291bnQgfSBmcm9tICcuL2RlbnNlX2JpbmNvdW50JztcbmV4cG9ydCB7IGRlcHRoVG9TcGFjZSB9IGZyb20gJy4vZGVwdGhfdG9fc3BhY2UnO1xuZXhwb3J0IHsgZGVwdGh3aXNlQ29udjJkIH0gZnJvbSAnLi9kZXB0aHdpc2VfY29udjJkJztcbmV4cG9ydCB7IGRpYWcgfSBmcm9tICcuL2RpYWcnO1xuZXhwb3J0IHsgZGlsYXRpb24yZCB9IGZyb20gJy4vZGlsYXRpb24yZCc7XG5leHBvcnQgeyBkaXYgfSBmcm9tICcuL2Rpdic7XG5leHBvcnQgeyBkaXZOb05hbiB9IGZyb20gJy4vZGl2X25vX25hbic7XG5leHBvcnQgeyBkb3QgfSBmcm9tICcuL2RvdCc7XG5leHBvcnQgeyBlaW5zdW0gfSBmcm9tICcuL2VpbnN1bSc7XG5leHBvcnQgeyBlbHUgfSBmcm9tICcuL2VsdSc7XG5leHBvcnQgeyBlcXVhbCB9IGZyb20gJy4vZXF1YWwnO1xuZXhwb3J0IHsgZXJmIH0gZnJvbSAnLi9lcmYnO1xuZXhwb3J0IHsgZXhwIH0gZnJvbSAnLi9leHAnO1xuZXhwb3J0IHsgZXhwYW5kRGltcyB9IGZyb20gJy4vZXhwYW5kX2RpbXMnO1xuZXhwb3J0IHsgZXhwbTEgfSBmcm9tICcuL2V4cG0xJztcbmV4cG9ydCB7IGV5ZSB9IGZyb20gJy4vZXllJztcbmV4cG9ydCB7IGZpbGwgfSBmcm9tICcuL2ZpbGwnO1xuZXhwb3J0IHsgZmxvb3IgfSBmcm9tICcuL2Zsb29yJztcbmV4cG9ydCB7IGZsb29yRGl2IH0gZnJvbSAnLi9mbG9vckRpdic7XG5leHBvcnQgeyBnYXRoZXIgfSBmcm9tICcuL2dhdGhlcic7XG5leHBvcnQgeyBncmVhdGVyIH0gZnJvbSAnLi9ncmVhdGVyJztcbmV4cG9ydCB7IGdyZWF0ZXJFcXVhbCB9IGZyb20gJy4vZ3JlYXRlcl9lcXVhbCc7XG5leHBvcnQgeyBpbWFnIH0gZnJvbSAnLi9pbWFnJztcbmV4cG9ydCB7IGlzRmluaXRlIH0gZnJvbSAnLi9pc19maW5pdGUnO1xuZXhwb3J0IHsgaXNJbmYgfSBmcm9tICcuL2lzX2luZic7XG5leHBvcnQgeyBpc05hTiB9IGZyb20gJy4vaXNfbmFuJztcbmV4cG9ydCB7IGxlYWt5UmVsdSB9IGZyb20gJy4vbGVha3lfcmVsdSc7XG5leHBvcnQgeyBsZXNzIH0gZnJvbSAnLi9sZXNzJztcbmV4cG9ydCB7IGxlc3NFcXVhbCB9IGZyb20gJy4vbGVzc19lcXVhbCc7XG5leHBvcnQgeyBsaW5zcGFjZSB9IGZyb20gJy4vbGluc3BhY2UnO1xuZXhwb3J0IHsgbG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb24gfSBmcm9tICcuL2xvY2FsX3Jlc3BvbnNlX25vcm1hbGl6YXRpb24nO1xuZXhwb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cnO1xuZXhwb3J0IHsgbG9nMXAgfSBmcm9tICcuL2xvZzFwJztcbmV4cG9ydCB7IGxvZ1NpZ21vaWQgfSBmcm9tICcuL2xvZ19zaWdtb2lkJztcbmV4cG9ydCB7IGxvZ1NvZnRtYXggfSBmcm9tICcuL2xvZ19zb2Z0bWF4JztcbmV4cG9ydCB7IGxvZ1N1bUV4cCB9IGZyb20gJy4vbG9nX3N1bV9leHAnO1xuZXhwb3J0IHsgbG9naWNhbEFuZCB9IGZyb20gJy4vbG9naWNhbF9hbmQnO1xuZXhwb3J0IHsgbG9naWNhbE5vdCB9IGZyb20gJy4vbG9naWNhbF9ub3QnO1xuZXhwb3J0IHsgbG9naWNhbE9yIH0gZnJvbSAnLi9sb2dpY2FsX29yJztcbmV4cG9ydCB7IGxvZ2ljYWxYb3IgfSBmcm9tICcuL2xvZ2ljYWxfeG9yJztcbmV4cG9ydCB7IG1hdE11bCB9IGZyb20gJy4vbWF0X211bCc7XG5leHBvcnQgeyBtYXggfSBmcm9tICcuL21heCc7XG5leHBvcnQgeyBtYXhQb29sIH0gZnJvbSAnLi9tYXhfcG9vbCc7XG5leHBvcnQgeyBtYXhQb29sM2QgfSBmcm9tICcuL21heF9wb29sXzNkJztcbmV4cG9ydCB7IG1heFBvb2xXaXRoQXJnbWF4IH0gZnJvbSAnLi9tYXhfcG9vbF93aXRoX2FyZ21heCc7XG5leHBvcnQgeyBtYXhpbXVtIH0gZnJvbSAnLi9tYXhpbXVtJztcbmV4cG9ydCB7IG1lYW4gfSBmcm9tICcuL21lYW4nO1xuZXhwb3J0IHsgbWVzaGdyaWQgfSBmcm9tICcuL21lc2hncmlkJztcbmV4cG9ydCB7IG1pbiB9IGZyb20gJy4vbWluJztcbmV4cG9ydCB7IG1pbmltdW0gfSBmcm9tICcuL21pbmltdW0nO1xuZXhwb3J0IHsgbWlycm9yUGFkIH0gZnJvbSAnLi9taXJyb3JfcGFkJztcbmV4cG9ydCB7IG1vZCB9IGZyb20gJy4vbW9kJztcbmV4cG9ydCB7IG1vbWVudHMgfSBmcm9tICcuL21vbWVudHMnO1xuZXhwb3J0IHsgbXVsIH0gZnJvbSAnLi9tdWwnO1xuZXhwb3J0IHsgbXVsdGlSTk5DZWxsIH0gZnJvbSAnLi9tdWx0aV9ybm5fY2VsbCc7XG5leHBvcnQgeyBtdWx0aW5vbWlhbCB9IGZyb20gJy4vbXVsdGlub21pYWwnO1xuZXhwb3J0IHsgbmVnIH0gZnJvbSAnLi9uZWcnO1xuZXhwb3J0IHsgbm90RXF1YWwgfSBmcm9tICcuL25vdF9lcXVhbCc7XG5leHBvcnQgeyBvbmVIb3QgfSBmcm9tICcuL29uZV9ob3QnO1xuZXhwb3J0IHsgb25lcyB9IGZyb20gJy4vb25lcyc7XG5leHBvcnQgeyBvbmVzTGlrZSB9IGZyb20gJy4vb25lc19saWtlJztcbmV4cG9ydCB7IG91dGVyUHJvZHVjdCB9IGZyb20gJy4vb3V0ZXJfcHJvZHVjdCc7XG5leHBvcnQgeyBwYWQgfSBmcm9tICcuL3BhZCc7XG5leHBvcnQgeyBwYWQxZCB9IGZyb20gJy4vcGFkMWQnO1xuZXhwb3J0IHsgcGFkMmQgfSBmcm9tICcuL3BhZDJkJztcbmV4cG9ydCB7IHBhZDNkIH0gZnJvbSAnLi9wYWQzZCc7XG5leHBvcnQgeyBwYWQ0ZCB9IGZyb20gJy4vcGFkNGQnO1xuZXhwb3J0IHsgcG9vbCB9IGZyb20gJy4vcG9vbCc7XG5leHBvcnQgeyBwb3cgfSBmcm9tICcuL3Bvdyc7XG5leHBvcnQgeyBwcmVsdSB9IGZyb20gJy4vcHJlbHUnO1xuZXhwb3J0IHsgcHJpbnQgfSBmcm9tICcuL3ByaW50JztcbmV4cG9ydCB7IHByb2QgfSBmcm9tICcuL3Byb2QnO1xuZXhwb3J0IHsgcmFuZCB9IGZyb20gJy4vcmFuZCc7XG5leHBvcnQgeyByYW5kb21HYW1tYSB9IGZyb20gJy4vcmFuZG9tX2dhbW1hJztcbmV4cG9ydCB7IHJhbmRvbU5vcm1hbCB9IGZyb20gJy4vcmFuZG9tX25vcm1hbCc7XG5leHBvcnQgeyByYW5kb21Vbmlmb3JtIH0gZnJvbSAnLi9yYW5kb21fdW5pZm9ybSc7XG5leHBvcnQgeyByYW5nZSB9IGZyb20gJy4vcmFuZ2UnO1xuZXhwb3J0IHsgcmVhbCB9IGZyb20gJy4vcmVhbCc7XG5leHBvcnQgeyByZWNpcHJvY2FsIH0gZnJvbSAnLi9yZWNpcHJvY2FsJztcbmV4cG9ydCB7IHJlbHUgfSBmcm9tICcuL3JlbHUnO1xuZXhwb3J0IHsgcmVsdTYgfSBmcm9tICcuL3JlbHU2JztcbmV4cG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL3Jlc2hhcGUnO1xuZXhwb3J0IHsgcmV2ZXJzZSB9IGZyb20gJy4vcmV2ZXJzZSc7XG5leHBvcnQgeyByZXZlcnNlMWQgfSBmcm9tICcuL3JldmVyc2VfMWQnO1xuZXhwb3J0IHsgcmV2ZXJzZTJkIH0gZnJvbSAnLi9yZXZlcnNlXzJkJztcbmV4cG9ydCB7IHJldmVyc2UzZCB9IGZyb20gJy4vcmV2ZXJzZV8zZCc7XG5leHBvcnQgeyByZXZlcnNlNGQgfSBmcm9tICcuL3JldmVyc2VfNGQnO1xuZXhwb3J0IHsgcm91bmQgfSBmcm9tICcuL3JvdW5kJztcbmV4cG9ydCB7IHJzcXJ0IH0gZnJvbSAnLi9yc3FydCc7XG5leHBvcnQgeyBzY2FsYXIgfSBmcm9tICcuL3NjYWxhcic7XG5leHBvcnQgeyBzZWx1IH0gZnJvbSAnLi9zZWx1JztcbmV4cG9ydCB7IHNlcGFyYWJsZUNvbnYyZCB9IGZyb20gJy4vc2VwYXJhYmxlX2NvbnYyZCc7XG5leHBvcnQgeyBzZXRkaWZmMWRBc3luYyB9IGZyb20gJy4vc2V0ZGlmZjFkX2FzeW5jJztcbmV4cG9ydCB7IHNpZ21vaWQgfSBmcm9tICcuL3NpZ21vaWQnO1xuZXhwb3J0IHsgc2lnbiB9IGZyb20gJy4vc2lnbic7XG5leHBvcnQgeyBzaW4gfSBmcm9tICcuL3Npbic7XG5leHBvcnQgeyBzaW5oIH0gZnJvbSAnLi9zaW5oJztcbmV4cG9ydCB7IHNsaWNlIH0gZnJvbSAnLi9zbGljZSc7XG5leHBvcnQgeyBzbGljZTFkIH0gZnJvbSAnLi9zbGljZTFkJztcbmV4cG9ydCB7IHNsaWNlMmQgfSBmcm9tICcuL3NsaWNlMmQnO1xuZXhwb3J0IHsgc2xpY2UzZCB9IGZyb20gJy4vc2xpY2UzZCc7XG5leHBvcnQgeyBzbGljZTRkIH0gZnJvbSAnLi9zbGljZTRkJztcbmV4cG9ydCB7IHNvZnRtYXggfSBmcm9tICcuL3NvZnRtYXgnO1xuZXhwb3J0IHsgc29mdHBsdXMgfSBmcm9tICcuL3NvZnRwbHVzJztcbmV4cG9ydCB7IHNwYWNlVG9CYXRjaE5EIH0gZnJvbSAnLi9zcGFjZV90b19iYXRjaF9uZCc7XG5leHBvcnQgeyBmZnQgfSBmcm9tICcuL3NwZWN0cmFsL2ZmdCc7XG5leHBvcnQgeyBpZmZ0IH0gZnJvbSAnLi9zcGVjdHJhbC9pZmZ0JztcbmV4cG9ydCB7IGlyZmZ0IH0gZnJvbSAnLi9zcGVjdHJhbC9pcmZmdCc7XG5leHBvcnQgeyByZmZ0IH0gZnJvbSAnLi9zcGVjdHJhbC9yZmZ0JztcbmV4cG9ydCB7IHNwbGl0IH0gZnJvbSAnLi9zcGxpdCc7XG5leHBvcnQgeyBzcXJ0IH0gZnJvbSAnLi9zcXJ0JztcbmV4cG9ydCB7IHNxdWFyZSB9IGZyb20gJy4vc3F1YXJlJztcbmV4cG9ydCB7IHNxdWFyZWREaWZmZXJlbmNlIH0gZnJvbSAnLi9zcXVhcmVkX2RpZmZlcmVuY2UnO1xuZXhwb3J0IHsgc3F1ZWV6ZSB9IGZyb20gJy4vc3F1ZWV6ZSc7XG5leHBvcnQgeyBzdGFjayB9IGZyb20gJy4vc3RhY2snO1xuZXhwb3J0IHsgc3RlcCB9IGZyb20gJy4vc3RlcCc7XG5leHBvcnQgeyBzdHJpZGVkU2xpY2UgfSBmcm9tICcuL3N0cmlkZWRfc2xpY2UnO1xuZXhwb3J0IHsgc3ViIH0gZnJvbSAnLi9zdWInO1xuZXhwb3J0IHsgc3VtIH0gZnJvbSAnLi9zdW0nO1xuZXhwb3J0IHsgdGFuIH0gZnJvbSAnLi90YW4nO1xuZXhwb3J0IHsgdGFuaCB9IGZyb20gJy4vdGFuaCc7XG5leHBvcnQgeyB0ZW5zb3IgfSBmcm9tICcuL3RlbnNvcic7XG5leHBvcnQgeyB0ZW5zb3IxZCB9IGZyb20gJy4vdGVuc29yMWQnO1xuZXhwb3J0IHsgdGVuc29yMmQgfSBmcm9tICcuL3RlbnNvcjJkJztcbmV4cG9ydCB7IHRlbnNvcjNkIH0gZnJvbSAnLi90ZW5zb3IzZCc7XG5leHBvcnQgeyB0ZW5zb3I0ZCB9IGZyb20gJy4vdGVuc29yNGQnO1xuZXhwb3J0IHsgdGVuc29yNWQgfSBmcm9tICcuL3RlbnNvcjVkJztcbmV4cG9ydCB7IHRlbnNvcjZkIH0gZnJvbSAnLi90ZW5zb3I2ZCc7XG5leHBvcnQgeyB0aWxlIH0gZnJvbSAnLi90aWxlJztcbmV4cG9ydCB7IHRvcGsgfSBmcm9tICcuL3RvcGsnO1xuZXhwb3J0IHsgdHJ1bmNhdGVkTm9ybWFsIH0gZnJvbSAnLi90cnVuY2F0ZWRfbm9ybWFsJztcbmV4cG9ydCB7IHVuaXF1ZSB9IGZyb20gJy4vdW5pcXVlJztcbmV4cG9ydCB7IHVuc29ydGVkU2VnbWVudFN1bSB9IGZyb20gJy4vdW5zb3J0ZWRfc2VnbWVudF9zdW0nO1xuZXhwb3J0IHsgdW5zdGFjayB9IGZyb20gJy4vdW5zdGFjayc7XG5leHBvcnQgeyB2YXJpYWJsZSB9IGZyb20gJy4vdmFyaWFibGUnO1xuZXhwb3J0IHsgd2hlcmUgfSBmcm9tICcuL3doZXJlJztcbmV4cG9ydCB7IHdoZXJlQXN5bmMgfSBmcm9tICcuL3doZXJlX2FzeW5jJztcbmV4cG9ydCB7IHplcm9zIH0gZnJvbSAnLi96ZXJvcyc7XG5leHBvcnQgeyB6ZXJvc0xpa2UgfSBmcm9tICcuL3plcm9zX2xpa2UnO1xuZXhwb3J0ICogZnJvbSAnLi9ib29sZWFuX21hc2snO1xuZXhwb3J0ICogZnJvbSAnLi90cmFuc3Bvc2UnO1xuZXhwb3J0ICogZnJvbSAnLi9ub3JtJztcbmV4cG9ydCAqIGZyb20gJy4vbW92aW5nX2F2ZXJhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9zY2F0dGVyX25kJztcbmV4cG9ydCAqIGZyb20gJy4vc3BhcnNlX3RvX2RlbnNlJztcbmV4cG9ydCAqIGZyb20gJy4vZ2F0aGVyX25kJztcbmV4cG9ydCAqIGZyb20gJy4vZHJvcG91dCc7XG5leHBvcnQgKiBmcm9tICcuL3NpZ25hbF9vcHNfdXRpbCc7XG5leHBvcnQgKiBmcm9tICcuL2luX3RvcF9rJztcbmV4cG9ydCB7IG9wLCBPUF9TQ09QRV9TVUZGSVggfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZmZ0IH0gZnJvbSAnLi9zcGVjdHJhbC9yZmZ0JztcbmltcG9ydCB7IGZmdCB9IGZyb20gJy4vc3BlY3RyYWwvZmZ0JztcbmltcG9ydCB7IGlmZnQgfSBmcm9tICcuL3NwZWN0cmFsL2lmZnQnO1xuaW1wb3J0IHsgaXJmZnQgfSBmcm9tICcuL3NwZWN0cmFsL2lyZmZ0JztcbmNvbnN0IHNwZWN0cmFsID0ge1xuICAgIGZmdCxcbiAgICBpZmZ0LFxuICAgIHJmZnQsXG4gICAgaXJmZnRcbn07XG5pbXBvcnQgKiBhcyBmdXNlZCBmcm9tICcuL2Z1c2VkX29wcyc7XG5pbXBvcnQgeyBoYW1taW5nV2luZG93IH0gZnJvbSAnLi9zaWduYWwvaGFtbWluZ193aW5kb3cnO1xuaW1wb3J0IHsgaGFubldpbmRvdyB9IGZyb20gJy4vc2lnbmFsL2hhbm5fd2luZG93JztcbmltcG9ydCB7IGZyYW1lIH0gZnJvbSAnLi9zaWduYWwvZnJhbWUnO1xuaW1wb3J0IHsgc3RmdCB9IGZyb20gJy4vc2lnbmFsL3N0ZnQnO1xuY29uc3Qgc2lnbmFsID0ge1xuICAgIGhhbW1pbmdXaW5kb3csXG4gICAgaGFubldpbmRvdyxcbiAgICBmcmFtZSxcbiAgICBzdGZ0LFxufTtcbi8vIEltYWdlIE9wcyBuYW1lc3BhY2VcbmltcG9ydCB7IGNyb3BBbmRSZXNpemUgfSBmcm9tICcuL2ltYWdlL2Nyb3BfYW5kX3Jlc2l6ZSc7XG5pbXBvcnQgeyBmbGlwTGVmdFJpZ2h0IH0gZnJvbSAnLi9pbWFnZS9mbGlwX2xlZnRfcmlnaHQnO1xuaW1wb3J0IHsgcm90YXRlV2l0aE9mZnNldCB9IGZyb20gJy4vaW1hZ2Uvcm90YXRlX3dpdGhfb2Zmc2V0JztcbmltcG9ydCB7IG5vbk1heFN1cHByZXNzaW9uIH0gZnJvbSAnLi9pbWFnZS9ub25fbWF4X3N1cHByZXNzaW9uJztcbmltcG9ydCB7IG5vbk1heFN1cHByZXNzaW9uQXN5bmMgfSBmcm9tICcuL2ltYWdlL25vbl9tYXhfc3VwcHJlc3Npb25fYXN5bmMnO1xuaW1wb3J0IHsgbm9uTWF4U3VwcHJlc3Npb25XaXRoU2NvcmUgfSBmcm9tICcuL2ltYWdlL25vbl9tYXhfc3VwcHJlc3Npb25fd2l0aF9zY29yZSc7XG5pbXBvcnQgeyBub25NYXhTdXBwcmVzc2lvbldpdGhTY29yZUFzeW5jIH0gZnJvbSAnLi9pbWFnZS9ub25fbWF4X3N1cHByZXNzaW9uX3dpdGhfc2NvcmVfYXN5bmMnO1xuaW1wb3J0IHsgbm9uTWF4U3VwcHJlc3Npb25QYWRkZWQgfSBmcm9tICcuL2ltYWdlL25vbl9tYXhfc3VwcHJlc3Npb25fcGFkZGVkJztcbmltcG9ydCB7IG5vbk1heFN1cHByZXNzaW9uUGFkZGVkQXN5bmMgfSBmcm9tICcuL2ltYWdlL25vbl9tYXhfc3VwcHJlc3Npb25fcGFkZGVkX2FzeW5jJztcbmltcG9ydCB7IHJlc2l6ZUJpbGluZWFyIH0gZnJvbSAnLi9pbWFnZS9yZXNpemVfYmlsaW5lYXInO1xuaW1wb3J0IHsgcmVzaXplTmVhcmVzdE5laWdoYm9yIH0gZnJvbSAnLi9pbWFnZS9yZXNpemVfbmVhcmVzdF9uZWlnaGJvcic7XG5pbXBvcnQgeyB0aHJlc2hvbGQgfSBmcm9tICcuL2ltYWdlL3RocmVzaG9sZCc7XG5pbXBvcnQgeyB0cmFuc2Zvcm0gfSBmcm9tICcuL2ltYWdlL3RyYW5zZm9ybSc7XG5jb25zdCBpbWFnZSA9IHtcbiAgICBmbGlwTGVmdFJpZ2h0LFxuICAgIHJlc2l6ZU5lYXJlc3ROZWlnaGJvcixcbiAgICByZXNpemVCaWxpbmVhcixcbiAgICByb3RhdGVXaXRoT2Zmc2V0LFxuICAgIGNyb3BBbmRSZXNpemUsXG4gICAgbm9uTWF4U3VwcHJlc3Npb24sXG4gICAgbm9uTWF4U3VwcHJlc3Npb25Bc3luYyxcbiAgICBub25NYXhTdXBwcmVzc2lvbldpdGhTY29yZSxcbiAgICBub25NYXhTdXBwcmVzc2lvbldpdGhTY29yZUFzeW5jLFxuICAgIG5vbk1heFN1cHByZXNzaW9uUGFkZGVkLFxuICAgIG5vbk1heFN1cHByZXNzaW9uUGFkZGVkQXN5bmMsXG4gICAgdGhyZXNob2xkLFxuICAgIHRyYW5zZm9ybVxufTtcbi8vIGxpbmFsZyBuYW1lc3BhY2VcbmltcG9ydCB7IGJhbmRQYXJ0IH0gZnJvbSAnLi9saW5hbGcvYmFuZF9wYXJ0JztcbmltcG9ydCB7IGdyYW1TY2htaWR0IH0gZnJvbSAnLi9saW5hbGcvZ3JhbV9zY2htaWR0JztcbmltcG9ydCB7IHFyIH0gZnJvbSAnLi9saW5hbGcvcXInO1xuY29uc3QgbGluYWxnID0ge1xuICAgIGJhbmRQYXJ0LFxuICAgIGdyYW1TY2htaWR0LFxuICAgIHFyXG59O1xuLy8gbG9zc2VzIG5hbWVzcGFjZTtcbmltcG9ydCB7IGFic29sdXRlRGlmZmVyZW5jZSB9IGZyb20gJy4vbG9zc2VzL2Fic29sdXRlX2RpZmZlcmVuY2UnO1xuaW1wb3J0IHsgY29tcHV0ZVdlaWdodGVkTG9zcyB9IGZyb20gJy4vbG9zc2VzL2NvbXB1dGVfd2VpZ2h0ZWRfbG9zcyc7XG5pbXBvcnQgeyBjb3NpbmVEaXN0YW5jZSB9IGZyb20gJy4vbG9zc2VzL2Nvc2luZV9kaXN0YW5jZSc7XG5pbXBvcnQgeyBoaW5nZUxvc3MgfSBmcm9tICcuL2xvc3Nlcy9oaW5nZV9sb3NzJztcbmltcG9ydCB7IGh1YmVyTG9zcyB9IGZyb20gJy4vbG9zc2VzL2h1YmVyX2xvc3MnO1xuaW1wb3J0IHsgbG9nTG9zcyB9IGZyb20gJy4vbG9zc2VzL2xvZ19sb3NzJztcbmltcG9ydCB7IG1lYW5TcXVhcmVkRXJyb3IgfSBmcm9tICcuL2xvc3Nlcy9tZWFuX3NxdWFyZWRfZXJyb3InO1xuaW1wb3J0IHsgc2lnbW9pZENyb3NzRW50cm9weSB9IGZyb20gJy4vbG9zc2VzL3NpZ21vaWRfY3Jvc3NfZW50cm9weSc7XG5pbXBvcnQgeyBzb2Z0bWF4Q3Jvc3NFbnRyb3B5IH0gZnJvbSAnLi9sb3NzZXMvc29mdG1heF9jcm9zc19lbnRyb3B5JztcbmNvbnN0IGxvc3NlcyA9IHtcbiAgICBhYnNvbHV0ZURpZmZlcmVuY2UsXG4gICAgY29tcHV0ZVdlaWdodGVkTG9zcyxcbiAgICBjb3NpbmVEaXN0YW5jZSxcbiAgICBoaW5nZUxvc3MsXG4gICAgaHViZXJMb3NzLFxuICAgIGxvZ0xvc3MsXG4gICAgbWVhblNxdWFyZWRFcnJvcixcbiAgICBzaWdtb2lkQ3Jvc3NFbnRyb3B5LFxuICAgIHNvZnRtYXhDcm9zc0VudHJvcHlcbn07XG5pbXBvcnQgeyBzcGFyc2VGaWxsRW1wdHlSb3dzIH0gZnJvbSAnLi9zcGFyc2Uvc3BhcnNlX2ZpbGxfZW1wdHlfcm93cyc7XG5pbXBvcnQgeyBzcGFyc2VSZXNoYXBlIH0gZnJvbSAnLi9zcGFyc2Uvc3BhcnNlX3Jlc2hhcGUnO1xuaW1wb3J0IHsgc3BhcnNlU2VnbWVudE1lYW4gfSBmcm9tICcuL3NwYXJzZS9zcGFyc2Vfc2VnbWVudF9tZWFuJztcbmltcG9ydCB7IHNwYXJzZVNlZ21lbnRTdW0gfSBmcm9tICcuL3NwYXJzZS9zcGFyc2Vfc2VnbWVudF9zdW0nO1xuY29uc3Qgc3BhcnNlID0ge1xuICAgIHNwYXJzZUZpbGxFbXB0eVJvd3MsXG4gICAgc3BhcnNlUmVzaGFwZSxcbiAgICBzcGFyc2VTZWdtZW50TWVhbixcbiAgICBzcGFyc2VTZWdtZW50U3VtXG59O1xuaW1wb3J0IHsgc3RyaW5nTkdyYW1zIH0gZnJvbSAnLi9zdHJpbmcvc3RyaW5nX25fZ3JhbXMnO1xuaW1wb3J0IHsgc3RyaW5nU3BsaXQgfSBmcm9tICcuL3N0cmluZy9zdHJpbmdfc3BsaXQnO1xuaW1wb3J0IHsgc3RyaW5nVG9IYXNoQnVja2V0RmFzdCB9IGZyb20gJy4vc3RyaW5nL3N0cmluZ190b19oYXNoX2J1Y2tldF9mYXN0Jztcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXG5jb25zdCBzdHJpbmcgPSB7XG4gICAgc3RyaW5nTkdyYW1zLFxuICAgIHN0cmluZ1NwbGl0LFxuICAgIHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3Rcbn07XG4vLyBTZWNvbmQgbGV2ZWwgZXhwb3J0cy5cbmV4cG9ydCB7IGltYWdlLCBsaW5hbGcsIGxvc3Nlcywgc3BlY3RyYWwsIGZ1c2VkLCBzaWduYWwsIHNwYXJzZSwgc3RyaW5nIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1vcHMuanMubWFwIiwiaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBtYXRNdWwgfSBmcm9tICcuL21hdF9tdWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIG91dGVyIHByb2R1Y3Qgb2YgdHdvIHZlY3RvcnMsIGB2MWAgYW5kIGB2MmAuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFszLCA0LCA1XSk7XG4gKlxuICogdGYub3V0ZXJQcm9kdWN0KGEsIGIpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSB2MSBUaGUgZmlyc3QgdmVjdG9yIGluIHRoZSBvdXRlciBwcm9kdWN0IG9wZXJhdGlvbi5cbiAqIEBwYXJhbSB2MiBUaGUgc2Vjb25kIHZlY3RvciBpbiB0aGUgb3V0ZXIgcHJvZHVjdCBvcGVyYXRpb24uXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTWF0cmljZXMnfVxuICovXG5mdW5jdGlvbiBvdXRlclByb2R1Y3RfKHYxLCB2Mikge1xuICAgIGNvbnN0ICR2MSA9IGNvbnZlcnRUb1RlbnNvcih2MSwgJ3YxJywgJ291dGVyUHJvZHVjdCcpO1xuICAgIGNvbnN0ICR2MiA9IGNvbnZlcnRUb1RlbnNvcih2MiwgJ3YyJywgJ291dGVyUHJvZHVjdCcpO1xuICAgIHV0aWwuYXNzZXJ0KCR2MS5yYW5rID09PSAxICYmICR2Mi5yYW5rID09PSAxLCAoKSA9PiBgRXJyb3IgaW4gb3V0ZXJQcm9kdWN0OiBpbnB1dHMgbXVzdCBiZSByYW5rIDEsIGJ1dCBnb3QgcmFua3MgYCArXG4gICAgICAgIGAkeyR2MS5yYW5rfSBhbmQgJHskdjIucmFua30uYCk7XG4gICAgY29uc3QgdjEyRCA9IHJlc2hhcGUoJHYxLCBbLTEsIDFdKTtcbiAgICBjb25zdCB2MjJEID0gcmVzaGFwZSgkdjIsIFsxLCAtMV0pO1xuICAgIHJldHVybiBtYXRNdWwodjEyRCwgdjIyRCk7XG59XG5leHBvcnQgY29uc3Qgb3V0ZXJQcm9kdWN0ID0gb3AoeyBvdXRlclByb2R1Y3RfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b3V0ZXJfcHJvZHVjdC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgUGFkVjIgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBQYWRzIGEgYHRmLlRlbnNvcmAgd2l0aCBhIGdpdmVuIHZhbHVlIGFuZCBwYWRkaW5ncy5cbiAqXG4gKiBUaGlzIG9wZXJhdGlvbiBpbXBsZW1lbnRzIGBDT05TVEFOVGAgbW9kZS4gRm9yIGBSRUZMRUNUYCBhbmQgYFNZTU1FVFJJQ2AsXG4gKiByZWZlciB0byBgdGYubWlycm9yUGFkYFxuICpcbiAqIEFsc28gYXZhaWxhYmxlIGFyZSBzdHJpY3RlciByYW5rLXNwZWNpZmljIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmVcbiAqIGFzIHRoaXMgbWV0aG9kIHRoYXQgYXNzZXJ0IHRoYXQgYHBhZGRpbmdzYCBpcyBvZiBnaXZlbiBsZW5ndGguXG4gKiAgIC0gYHRmLnBhZDFkYFxuICogICAtIGB0Zi5wYWQyZGBcbiAqICAgLSBgdGYucGFkM2RgXG4gKiAgIC0gYHRmLnBhZDRkYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDMsIDRdKTtcbiAqIHgucGFkKFtbMSwgMl1dKS5wcmludCgpO1xuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgdGVuc29yIHRvIHBhZC5cbiAqIEBwYXJhbSBwYWRkaW5ncyBBbiBhcnJheSBvZiBsZW5ndGggYFJgICh0aGUgcmFuayBvZiB0aGUgdGVuc29yKSwgd2hlcmVcbiAqIGVhY2ggZWxlbWVudCBpcyBhIGxlbmd0aC0yIHR1cGxlIG9mIGludHMgYFtwYWRCZWZvcmUsIHBhZEFmdGVyXWAsXG4gKiBzcGVjaWZ5aW5nIGhvdyBtdWNoIHRvIHBhZCBhbG9uZyBlYWNoIGRpbWVuc2lvbiBvZiB0aGUgdGVuc29yLlxuICogQHBhcmFtIGNvbnN0YW50VmFsdWUgVGhlIHBhZCB2YWx1ZSB0byB1c2UuIERlZmF1bHRzIHRvIDAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnVHJhbnNmb3JtYXRpb25zJ31cbiAqL1xuZnVuY3Rpb24gcGFkXyh4LCBwYWRkaW5ncywgY29uc3RhbnRWYWx1ZSA9IDApIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdwYWQnKTtcbiAgICBpZiAoJHgucmFuayA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BhZChzY2FsYXIpIGlzIG5vdCBkZWZpbmVkLiBQYXNzIG5vbi1zY2FsYXIgdG8gcGFkJyk7XG4gICAgfVxuICAgIGNvbnN0IGF0dHJzID0geyBwYWRkaW5ncywgY29uc3RhbnRWYWx1ZSB9O1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChQYWRWMiwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgcGFkID0gb3AoeyBwYWRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGFkLmpzLm1hcCIsImltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyBwYWQgfSBmcm9tICcuL3BhZCc7XG4vKipcbiAqIFBhZHMgYSBgdGYuVGVuc29yMURgIHdpdGggYSBnaXZlbiB2YWx1ZSBhbmQgcGFkZGluZ3MuIFNlZSBgcGFkYCBmb3IgZGV0YWlscy5cbiAqL1xuZnVuY3Rpb24gcGFkMWRfKHgsIHBhZGRpbmdzLCBjb25zdGFudFZhbHVlID0gMCkge1xuICAgIGFzc2VydChwYWRkaW5ncy5sZW5ndGggPT09IDIsICgpID0+ICdJbnZhbGlkIG51bWJlciBvZiBwYWRkaW5ncy4gTXVzdCBiZSBsZW5ndGggb2YgMi4nKTtcbiAgICByZXR1cm4gcGFkKHgsIFtwYWRkaW5nc10sIGNvbnN0YW50VmFsdWUpO1xufVxuZXhwb3J0IGNvbnN0IHBhZDFkID0gb3AoeyBwYWQxZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYWQxZC5qcy5tYXAiLCJpbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcGFkIH0gZnJvbSAnLi9wYWQnO1xuLyoqXG4gKiBQYWRzIGEgYHRmLlRlbnNvcjJEYCB3aXRoIGEgZ2l2ZW4gdmFsdWUgYW5kIHBhZGRpbmdzLiBTZWUgYHBhZGAgZm9yIGRldGFpbHMuXG4gKi9cbmZ1bmN0aW9uIHBhZDJkXyh4LCBwYWRkaW5ncywgY29uc3RhbnRWYWx1ZSA9IDApIHtcbiAgICBhc3NlcnQocGFkZGluZ3MubGVuZ3RoID09PSAyICYmIHBhZGRpbmdzWzBdLmxlbmd0aCA9PT0gMiAmJlxuICAgICAgICBwYWRkaW5nc1sxXS5sZW5ndGggPT09IDIsICgpID0+ICdJbnZhbGlkIG51bWJlciBvZiBwYWRkaW5ncy4gTXVzdCBiZSBsZW5ndGggb2YgMiBlYWNoLicpO1xuICAgIHJldHVybiBwYWQoeCwgcGFkZGluZ3MsIGNvbnN0YW50VmFsdWUpO1xufVxuZXhwb3J0IGNvbnN0IHBhZDJkID0gb3AoeyBwYWQyZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYWQyZC5qcy5tYXAiLCJpbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcGFkIH0gZnJvbSAnLi9wYWQnO1xuLyoqXG4gKiBQYWRzIGEgYHRmLlRlbnNvcjNEYCB3aXRoIGEgZ2l2ZW4gdmFsdWUgYW5kIHBhZGRpbmdzLiBTZWUgYHBhZGAgZm9yIGRldGFpbHMuXG4gKi9cbmZ1bmN0aW9uIHBhZDNkXyh4LCBwYWRkaW5ncywgY29uc3RhbnRWYWx1ZSA9IDApIHtcbiAgICBhc3NlcnQocGFkZGluZ3MubGVuZ3RoID09PSAzICYmIHBhZGRpbmdzWzBdLmxlbmd0aCA9PT0gMiAmJlxuICAgICAgICBwYWRkaW5nc1sxXS5sZW5ndGggPT09IDIgJiYgcGFkZGluZ3NbMl0ubGVuZ3RoID09PSAyLCAoKSA9PiAnSW52YWxpZCBudW1iZXIgb2YgcGFkZGluZ3MuIE11c3QgYmUgbGVuZ3RoIG9mIDIgZWFjaC4nKTtcbiAgICByZXR1cm4gcGFkKHgsIHBhZGRpbmdzLCBjb25zdGFudFZhbHVlKTtcbn1cbmV4cG9ydCBjb25zdCBwYWQzZCA9IG9wKHsgcGFkM2RfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGFkM2QuanMubWFwIiwiaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHBhZCB9IGZyb20gJy4vcGFkJztcbi8qKlxuICogUGFkcyBhIGB0Zi5UZW5zb3I0RGAgd2l0aCBhIGdpdmVuIHZhbHVlIGFuZCBwYWRkaW5ncy4gU2VlIGBwYWRgIGZvciBkZXRhaWxzLlxuICovXG5mdW5jdGlvbiBwYWQ0ZF8oeCwgcGFkZGluZ3MsIGNvbnN0YW50VmFsdWUgPSAwKSB7XG4gICAgYXNzZXJ0KHBhZGRpbmdzLmxlbmd0aCA9PT0gNCAmJiBwYWRkaW5nc1swXS5sZW5ndGggPT09IDIgJiZcbiAgICAgICAgcGFkZGluZ3NbMV0ubGVuZ3RoID09PSAyICYmIHBhZGRpbmdzWzJdLmxlbmd0aCA9PT0gMiAmJlxuICAgICAgICBwYWRkaW5nc1szXS5sZW5ndGggPT09IDIsICgpID0+ICdJbnZhbGlkIG51bWJlciBvZiBwYWRkaW5ncy4gTXVzdCBiZSBsZW5ndGggb2YgMiBlYWNoLicpO1xuICAgIHJldHVybiBwYWQoeCwgcGFkZGluZ3MsIGNvbnN0YW50VmFsdWUpO1xufVxuZXhwb3J0IGNvbnN0IHBhZDRkID0gb3AoeyBwYWQ0ZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYWQ0ZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IGF2Z1Bvb2wgfSBmcm9tICcuL2F2Z19wb29sJztcbmltcG9ydCB7IGJhdGNoVG9TcGFjZU5EIH0gZnJvbSAnLi9iYXRjaF90b19zcGFjZV9uZCc7XG5pbXBvcnQgKiBhcyBjb252X3V0aWwgZnJvbSAnLi9jb252X3V0aWwnO1xuaW1wb3J0IHsgbWF4UG9vbCB9IGZyb20gJy4vbWF4X3Bvb2wnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbmltcG9ydCB7IHNwYWNlVG9CYXRjaE5EIH0gZnJvbSAnLi9zcGFjZV90b19iYXRjaF9uZCc7XG4vKipcbiAqIFBlcmZvcm1zIGFuIE4tRCBwb29saW5nIG9wZXJhdGlvblxuICpcbiAqIEBwYXJhbSBpbnB1dCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDQgb3IgcmFuayAzIG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgaW5DaGFubmVsc11gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSB3aW5kb3dTaGFwZSBUaGUgZmlsdGVyIHNpemU6IGBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aF1gLiBJZlxuICogICAgIGBmaWx0ZXJTaXplYCBpcyBhIHNpbmdsZSBudW1iZXIsIHRoZW4gYGZpbHRlckhlaWdodCA9PSBmaWx0ZXJXaWR0aGAuXG4gKiBAcGFyYW0gcG9vbGluZ1R5cGUgVGhlIHR5cGUgb2YgcG9vbGluZywgZWl0aGVyICdtYXgnIG9yICdhdmcnLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobTpcbiAqICAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAgLSBGb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2d1aWRlcy9weXRob24vbm4jQ29udm9sdXRpb25dKFxuICogICAgICAgICBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZ3VpZGVzL3B5dGhvbi9ubiNDb252b2x1dGlvbilcbiAqIEBwYXJhbSBkaWxhdGlvbnMgVGhlIGRpbGF0aW9uIHJhdGVzOiBgW2RpbGF0aW9uSGVpZ2h0LCBkaWxhdGlvbldpZHRoXWBcbiAqICAgICBpbiB3aGljaCB3ZSBzYW1wbGUgaW5wdXQgdmFsdWVzIGFjcm9zcyB0aGUgaGVpZ2h0IGFuZCB3aWR0aCBkaW1lbnNpb25zXG4gKiAgICAgaW4gZGlsYXRlZCBwb29saW5nLiBEZWZhdWx0cyB0byBgWzEsIDFdYC4gSWYgYGRpbGF0aW9uUmF0ZWAgaXMgYSBzaW5nbGVcbiAqICAgICBudW1iZXIsIHRoZW4gYGRpbGF0aW9uSGVpZ2h0ID09IGRpbGF0aW9uV2lkdGhgLiBJZiBpdCBpcyBncmVhdGVyIHRoYW5cbiAqICAgICAxLCB0aGVuIGFsbCB2YWx1ZXMgb2YgYHN0cmlkZXNgIG11c3QgYmUgMS5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBwb29saW5nOiBgW3N0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGhdYC4gSWZcbiAqICAgICBgc3RyaWRlc2AgaXMgYSBzaW5nbGUgbnVtYmVyLCB0aGVuIGBzdHJpZGVIZWlnaHQgPT0gc3RyaWRlV2lkdGhgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0NvbnZvbHV0aW9uJ31cbiAqL1xuZnVuY3Rpb24gcG9vbF8oaW5wdXQsIHdpbmRvd1NoYXBlLCBwb29saW5nVHlwZSwgcGFkLCBkaWxhdGlvbnMsIHN0cmlkZXMpIHtcbiAgICBpZiAoZGlsYXRpb25zID09IG51bGwpIHtcbiAgICAgICAgZGlsYXRpb25zID0gWzEsIDFdO1xuICAgIH1cbiAgICBpZiAoc3RyaWRlcyA9PSBudWxsKSB7XG4gICAgICAgIHN0cmlkZXMgPSAxO1xuICAgIH1cbiAgICBpZiAocGFkID09PSAwKSB7XG4gICAgICAgIHBhZCA9ICd2YWxpZCc7XG4gICAgfVxuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKGlucHV0LCAneCcsICdtYXhQb29sJyk7XG4gICAgbGV0IHg0RCA9ICR4O1xuICAgIGxldCByZXNoYXBlZFRvNEQgPSBmYWxzZTtcbiAgICBpZiAoJHgucmFuayA9PT0gMykge1xuICAgICAgICByZXNoYXBlZFRvNEQgPSB0cnVlO1xuICAgICAgICB4NEQgPSByZXNoYXBlKCR4LCBbMSwgJHguc2hhcGVbMF0sICR4LnNoYXBlWzFdLCAkeC5zaGFwZVsyXV0pO1xuICAgIH1cbiAgICB1dGlsLmFzc2VydChjb252X3V0aWwuZWl0aGVyU3RyaWRlc09yRGlsYXRpb25zQXJlT25lKHN0cmlkZXMsIGRpbGF0aW9ucyksICgpID0+ICdFcnJvciBpbiBwb29sOiBFaXRoZXIgc3RyaWRlcyBvciBkaWxhdGlvbnMgbXVzdCBiZSAxLiAnICtcbiAgICAgICAgYEdvdCBzdHJpZGVzICR7c3RyaWRlc30gYW5kIGRpbGF0aW9ucyAnJHtkaWxhdGlvbnN9J2ApO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gY29udl91dGlsLmNvbXB1dGVQb29sMkRJbmZvKHg0RC5zaGFwZSwgd2luZG93U2hhcGUsIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkKTtcbiAgICBjb25zdCBkaWxhdGlvbiA9IFtjb252SW5mby5kaWxhdGlvbkhlaWdodCwgY29udkluZm8uZGlsYXRpb25XaWR0aF07XG4gICAgLy8gVGhlIGZvbGxvd2luZyBpbXBsZW1lbnRhdGlvbiBkb2VzIGJhdGNoVG9TcGFjZShwb29sKHNwYWNlVG9CYXRjaCh4KSkpXG4gICAgLy8gd2hlbmV2ZXIgZGlsYXRpb24gPiAxIHNpbmNlIHRoZSBURiBrZXJuZWxzIGRvIG5vdCBzdXBwb3J0IGRpbGF0aW9uID4gMS5cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yZmxvdy9ibG9iLzUwZjZiYjY3ZGM5OGM5Yjc0NjMwYjYwNDdhYWU3YTRmOGE0MGZkMDIvdGVuc29yZmxvdy9weXRob24vb3BzL25uX29wcy5weSNMMTAzN1xuICAgIGxldCBiYXNlUGFkZGluZztcbiAgICBpZiAocGFkID09PSAnc2FtZScpIHtcbiAgICAgICAgYmFzZVBhZGRpbmcgPSB3aXRoU3BhY2VUb0JhdGNoQmFzZVBhZGRpbmdzKFtjb252SW5mby5maWx0ZXJIZWlnaHQsIGNvbnZJbmZvLmZpbHRlcldpZHRoXSwgZGlsYXRpb24pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgYmFzZVBhZGRpbmcgPSBbWzAsIDBdLCBbMCwgMF1dO1xuICAgIH1cbiAgICBjb25zdCBpc0RpbGF0aW9uT25lID0gZGlsYXRpb25bMF0gPT09IDEgJiYgZGlsYXRpb25bMV0gPT09IDE7XG4gICAgY29uc3QgW2FkanVzdGVkUGFkZGluZywgYWRqdXN0ZWRDcm9wc10gPSByZXF1aXJlZFNwYWNlVG9CYXRjaFBhZGRpbmdzKFtjb252SW5mby5pbkhlaWdodCwgY29udkluZm8uaW5XaWR0aF0sIGRpbGF0aW9uLCBiYXNlUGFkZGluZyk7XG4gICAgY29uc3QgY29udmVydGVkUGFkID0gaXNEaWxhdGlvbk9uZSA/IHBhZCA6ICd2YWxpZCc7XG4gICAgY29uc3QgY29udmVydGVkWCA9IGlzRGlsYXRpb25PbmUgPyB4NEQgOiBzcGFjZVRvQmF0Y2hORCh4NEQsIGRpbGF0aW9uLCBhZGp1c3RlZFBhZGRpbmcpO1xuICAgIGNvbnN0IGZvcndhcmRPcCA9IHBvb2xpbmdUeXBlID09PSAnYXZnJyA/XG4gICAgICAgICgpID0+IGF2Z1Bvb2woY29udmVydGVkWCwgd2luZG93U2hhcGUsIHN0cmlkZXMsIGNvbnZlcnRlZFBhZCkgOlxuICAgICAgICAoKSA9PiBtYXhQb29sKGNvbnZlcnRlZFgsIHdpbmRvd1NoYXBlLCBzdHJpZGVzLCBjb252ZXJ0ZWRQYWQpO1xuICAgIGNvbnN0IHkgPSBmb3J3YXJkT3AoKTtcbiAgICBjb25zdCByZXMgPSBpc0RpbGF0aW9uT25lID8geSA6IGJhdGNoVG9TcGFjZU5EKHksIGRpbGF0aW9uLCBhZGp1c3RlZENyb3BzKTtcbiAgICBpZiAocmVzaGFwZWRUbzREKSB7XG4gICAgICAgIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbi8vIEhlbHBlciBmdW5jdGlvbiB0byBjb21wdXRlIGNyb3BzIGFuZCBwYWRkaW5ncyBmb3IgcG9vbCB3aXRoIGRpbGF0aW9uID4gMS5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmZsb3cvYmxvYi81MGY2YmI2N2RjOThjOWI3NDYzMGI2MDQ3YWFlN2E0ZjhhNDBmZDAyL3RlbnNvcmZsb3cvcHl0aG9uL29wcy9hcnJheV9vcHMucHkjTDIxODRcbmZ1bmN0aW9uIHJlcXVpcmVkU3BhY2VUb0JhdGNoUGFkZGluZ3MoaW5wdXRTaGFwZSwgYmxvY2tTaGFwZSwgYmFzZVBhZGRpbmcpIHtcbiAgICBjb25zdCBwYWRTdGFydCA9IGJhc2VQYWRkaW5nLm1hcChiID0+IGJbMF0pO1xuICAgIGNvbnN0IG9yaWdQYWRFbmQgPSBiYXNlUGFkZGluZy5tYXAoYiA9PiBiWzFdKTtcbiAgICBjb25zdCBmdWxsSW5wdXRTaGFwZSA9IGlucHV0U2hhcGUuY29uY2F0KHBhZFN0YXJ0LCBvcmlnUGFkRW5kKTtcbiAgICBjb25zdCBwYWRFbmRFeHRyYSA9IGJsb2NrU2hhcGUubWFwKChiLCBpKSA9PiAoYiAtIGZ1bGxJbnB1dFNoYXBlW2ldICUgYikgJSBiKTtcbiAgICBjb25zdCBwYWRFbmQgPSBvcmlnUGFkRW5kLm1hcCgocywgaSkgPT4gcyArIHBhZEVuZEV4dHJhW2ldKTtcbiAgICBjb25zdCBwYWRkaW5ncyA9IGJsb2NrU2hhcGUubWFwKChfLCBpKSA9PiBbcGFkU3RhcnRbaV0sIHBhZEVuZFtpXV0pO1xuICAgIGNvbnN0IGNyb3BzID0gYmxvY2tTaGFwZS5tYXAoKF8sIGkpID0+IFswLCBwYWRFbmRFeHRyYVtpXV0pO1xuICAgIHJldHVybiBbcGFkZGluZ3MsIGNyb3BzXTtcbn1cbi8vIEhlbHBlciBmdW5jdGlvbiB0byBjb21wdXRlIGJhc2UgcGFkZGluZ3MgZm9yIHBvb2wgd2l0aCBkaWxhdGlvbiA+IDEuXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3JmbG93L2Jsb2IvNTBmNmJiNjdkYzk4YzliNzQ2MzBiNjA0N2FhZTdhNGY4YTQwZmQwMi90ZW5zb3JmbG93L3B5dGhvbi9vcHMvbm5fb3BzLnB5I0w1MjRcbmZ1bmN0aW9uIHdpdGhTcGFjZVRvQmF0Y2hCYXNlUGFkZGluZ3MoZmlsdGVyU2hhcGUsIGRpbGF0aW9uKSB7XG4gICAgLy8gU3BhdGlhbCBkaW1lbnNpb25zIG9mIHRoZSBmaWx0ZXJzIGFuZCB0aGUgdXBzYW1wbGVkIGZpbHRlcnMgaW4gd2hpY2ggd2VcbiAgICAvLyBpbnRyb2R1Y2UgKHJhdGUgLSAxKSB6ZXJvcyBiZXR3ZWVuIGNvbnNlY3V0aXZlIGZpbHRlciB2YWx1ZXMuXG4gICAgY29uc3QgZGlsYXRlZEZpbHRlclNoYXBlID0gZmlsdGVyU2hhcGUubWFwKChzLCBpKSA9PiB7XG4gICAgICAgIHJldHVybiBzICsgKHMgLSAxKSAqIChkaWxhdGlvbltpXSAtIDEpO1xuICAgIH0pO1xuICAgIGNvbnN0IHBhZEV4dHJhU2hhcGUgPSBkaWxhdGVkRmlsdGVyU2hhcGUubWFwKHMgPT4gcyAtIDEpO1xuICAgIC8vIFdoZW4gcGFkZGluZyBpcyBvZGQsIHdlIHBhZCBtb3JlIGF0IGVuZCwgZm9sbG93aW5nIHRoZSBzYW1lXG4gICAgLy8gY29udmVudGlvbiBhcyBjb252MmQuXG4gICAgY29uc3QgcGFkRXh0cmFTdGFydCA9IHBhZEV4dHJhU2hhcGUubWFwKHMgPT4gTWF0aC5mbG9vcihzIC8gMikpO1xuICAgIGNvbnN0IHBhZEV4dHJhRW5kID0gcGFkRXh0cmFTaGFwZS5tYXAoKHMsIGkpID0+IHMgLSBwYWRFeHRyYVN0YXJ0W2ldKTtcbiAgICByZXR1cm4gcGFkRXh0cmFTaGFwZS5tYXAoKF8sIGkpID0+IHtcbiAgICAgICAgcmV0dXJuIFtwYWRFeHRyYVN0YXJ0W2ldLCBwYWRFeHRyYUVuZFtpXV07XG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgcG9vbCA9IG9wKHsgcG9vbF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wb29sLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBQb3cgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgbWFrZVR5cGVzTWF0Y2ggfSBmcm9tICcuLi90ZW5zb3JfdXRpbCc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBwb3dlciBvZiBvbmUgYHRmLlRlbnNvcmAgdG8gYW5vdGhlci4gU3VwcG9ydHMgYnJvYWRjYXN0aW5nLlxuICpcbiAqIEdpdmVuIGEgYHRmLlRlbnNvcmAgeCBhbmQgYSBgdGYuVGVuc29yYCB5LCB0aGlzIG9wZXJhdGlvbiBjb21wdXRlcyB4XnkgZm9yXG4gKiBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIGluIHggYW5kIHkuIFRoZSByZXN1bHQncyBkdHlwZSB3aWxsIGJlIHRoZSB1cGNhc3RlZFxuICogdHlwZSBvZiB0aGUgYGJhc2VgIGFuZCBgZXhwYCBkdHlwZXMuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IoW1syLCAzXSwgWzQsIDVdXSlcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IoW1sxLCAyXSwgWzMsIDBdXSkudG9JbnQoKTtcbiAqXG4gKiBhLnBvdyhiKS5wcmludCgpOyAgLy8gb3IgdGYucG93KGEsIGIpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcihbWzEsIDJdLCBbMywgNF1dKVxuICogY29uc3QgYiA9IHRmLnRlbnNvcigyKS50b0ludCgpO1xuICpcbiAqIGEucG93KGIpLnByaW50KCk7ICAvLyBvciB0Zi5wb3coYSwgYilcbiAqIGBgYFxuICogV2UgYWxzbyBleHBvc2UgYHBvd1N0cmljdGAgd2hpY2ggaGFzIHRoZSBzYW1lIHNpZ25hdHVyZSBhcyB0aGlzIG9wIGFuZFxuICogYXNzZXJ0cyB0aGF0IGBiYXNlYCBhbmQgYGV4cGAgYXJlIHRoZSBzYW1lIHNoYXBlIChkb2VzIG5vdCBicm9hZGNhc3QpLlxuICpcbiAqIEBwYXJhbSBiYXNlIFRoZSBiYXNlIGB0Zi5UZW5zb3JgIHRvIHBvdyBlbGVtZW50LXdpc2UuXG4gKiBAcGFyYW0gZXhwIFRoZSBleHBvbmVudCBgdGYuVGVuc29yYCB0byBwb3cgZWxlbWVudC13aXNlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0FyaXRobWV0aWMnfVxuICovXG5mdW5jdGlvbiBwb3dfKGJhc2UsIGV4cCkge1xuICAgIGxldCAkYmFzZSA9IGNvbnZlcnRUb1RlbnNvcihiYXNlLCAnYmFzZScsICdwb3cnKTtcbiAgICBsZXQgJGV4cCA9IGNvbnZlcnRUb1RlbnNvcihleHAsICdleHAnLCAncG93Jyk7XG4gICAgWyRiYXNlLCAkZXhwXSA9IG1ha2VUeXBlc01hdGNoKCRiYXNlLCAkZXhwKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGE6ICRiYXNlLCBiOiAkZXhwIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoUG93LCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IHBvdyA9IG9wKHsgcG93XyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBvdy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgUHJlbHUgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBsZWFreSByZWN0aWZpZWQgbGluZWFyIGVsZW1lbnQtd2lzZSB3aXRoIHBhcmFtZXRyaWMgYWxwaGFzLlxuICpcbiAqIGB4IDwgMCA/IGFscGhhICogeCA6IGYoeCkgPSB4YFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWy0xLCAyLCAtMywgNF0pO1xuICogY29uc3QgYWxwaGEgPSB0Zi5zY2FsYXIoMC4xKTtcbiAqXG4gKiB4LnByZWx1KGFscGhhKS5wcmludCgpOyAgLy8gb3IgdGYucHJlbHUoeCwgYWxwaGEpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gYWxwaGEgU2NhbGluZyBmYWN0b3IgZm9yIG5lZ2F0aXZlIHZhbHVlcy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gcHJlbHVfKHgsIGFscGhhKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAncHJlbHUnKTtcbiAgICBjb25zdCAkYWxwaGEgPSBjb252ZXJ0VG9UZW5zb3IoYWxwaGEsICdhbHBoYScsICdwcmVsdScpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHgsIGFscGhhOiAkYWxwaGEgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChQcmVsdSwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBwcmVsdSA9IG9wKHsgcHJlbHVfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHJlbHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLyoqXG4gKiBQcmludHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGB0Zi5UZW5zb3JgIGluY2x1ZGluZyBpdHMgZGF0YS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgdmVyYm9zZSA9IHRydWU7XG4gKiB0Zi50ZW5zb3IyZChbMSwgMiwgMywgNF0sIFsyLCAyXSkucHJpbnQodmVyYm9zZSk7XG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSB0ZW5zb3IgdG8gYmUgcHJpbnRlZC5cbiAqIEBwYXJhbSB2ZXJib3NlIFdoZXRoZXIgdG8gcHJpbnQgdmVyYm9zZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYCBUZW5zb3JgLFxuICogaW5jbHVkaW5nIGR0eXBlIGFuZCBzaXplLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByaW50KHgsIHZlcmJvc2UgPSBmYWxzZSkge1xuICAgIGNvbnNvbGUubG9nKHgudG9TdHJpbmcodmVyYm9zZSkpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHJpbnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFByb2QgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGNhc3QgfSBmcm9tICcuL2Nhc3QnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBwcm9kdWN0IG9mIGVsZW1lbnRzIGFjcm9zcyBkaW1lbnNpb25zIG9mIGEgYHRmLlRlbnNvcmAuXG4gKlxuICogUmVkdWNlcyB0aGUgaW5wdXQgYWxvbmcgdGhlIGRpbWVuc2lvbnMgZ2l2ZW4gaW4gYGF4ZXNgLiBVbmxlc3MgYGtlZXBEaW1zYFxuICogaXMgdHJ1ZSwgdGhlIHJhbmsgb2YgdGhlIGB0Zi5UZW5zb3JgIGlzIHJlZHVjZWQgYnkgMSBmb3IgZWFjaCBlbnRyeSBpblxuICogYGF4ZXNgLiBJZiBga2VlcERpbXNgIGlzIHRydWUsIHRoZSByZWR1Y2VkIGRpbWVuc2lvbnMgYXJlIHJldGFpbmVkIHdpdGhcbiAqIGxlbmd0aCAxLiBJZiBgYXhlc2AgaGFzIG5vIGVudHJpZXMsIGFsbCBkaW1lbnNpb25zIGFyZSByZWR1Y2VkLCBhbmQgYVxuICogYHRmLlRlbnNvcmAgd2l0aCBhIHNpbmdsZSBlbGVtZW50IGlzIHJldHVybmVkLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqXG4gKiB4LnByb2QoKS5wcmludCgpOyAgLy8gb3IgdGYucHJvZCh4KVxuICogYGBgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IyZChbMSwgMiwgMywgNF0sIFsyLCAyXSk7XG4gKlxuICogY29uc3QgYXhpcyA9IDE7XG4gKiB4LnByb2QoYXhpcykucHJpbnQoKTsgIC8vIG9yIHRmLnByb2QoeCwgYXhpcylcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IgdG8gY29tcHV0ZSB0aGUgcHJvZHVjdCBvdmVyLiBJZiB0aGUgZHR5cGUgaXMgYGJvb2xgXG4gKiAgIGl0IHdpbGwgYmUgY29udmVydGVkIHRvIGBpbnQzMmAgYW5kIHRoZSBvdXRwdXQgZHR5cGUgd2lsbCBiZSBgaW50MzJgLlxuICogQHBhcmFtIGF4aXMgVGhlIGRpbWVuc2lvbihzKSB0byByZWR1Y2UuIEJ5IGRlZmF1bHQgaXQgcmVkdWNlc1xuICogICAgIGFsbCBkaW1lbnNpb25zLlxuICogQHBhcmFtIGtlZXBEaW1zIElmIHRydWUsIHJldGFpbnMgcmVkdWNlZCBkaW1lbnNpb25zIHdpdGggc2l6ZSAxLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1JlZHVjdGlvbid9XG4gKi9cbmZ1bmN0aW9uIHByb2RfKHgsIGF4aXMgPSBudWxsLCBrZWVwRGltcyA9IGZhbHNlKSB7XG4gICAgbGV0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3Byb2QnKTtcbiAgICBpZiAoJHguZHR5cGUgPT09ICdib29sJykge1xuICAgICAgICAvLyBib29sIGlzIG5vdCBhbiBhbGxvd2VkIHR5cGUgZm9yIHRoZSB1bmRlcmx5aW5nIGtlcm5lbC5cbiAgICAgICAgJHggPSBjYXN0KCR4LCAnaW50MzInKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBheGlzLCBrZWVwRGltcyB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFByb2QsIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IHByb2QgPSBvcCh7IHByb2RfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHJvZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgc2l6ZUZyb21TaGFwZSB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENyZWF0ZXMgYSBgdGYuVGVuc29yYCB3aXRoIHZhbHVlcyBzYW1wbGVkIGZyb20gYSByYW5kb20gbnVtYmVyIGdlbmVyYXRvclxuICogZnVuY3Rpb24gZGVmaW5lZCBieSB0aGUgdXNlci5cbiAqXG4gKiBAcGFyYW0gc2hhcGUgQW4gYXJyYXkgb2YgaW50ZWdlcnMgZGVmaW5pbmcgdGhlIG91dHB1dCB0ZW5zb3Igc2hhcGUuXG4gKiBAcGFyYW0gcmFuZEZ1bmN0aW9uIEEgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkXG4gKiBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSBvdXRwdXQgdGVuc29yLlxuICogQHBhcmFtIGR0eXBlIFRoZSBkYXRhIHR5cGUgb2YgdGhlIG91dHB1dCB0ZW5zb3IuIERlZmF1bHRzIHRvICdmbG9hdDMyJy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdSYW5kb20nfVxuICovXG5mdW5jdGlvbiByYW5kXyhzaGFwZSwgcmFuZEZ1bmN0aW9uLCBkdHlwZSkge1xuICAgIGNvbnN0IHNpemUgPSBzaXplRnJvbVNoYXBlKHNoYXBlKTtcbiAgICBsZXQgdmFsdWVzID0gbnVsbDtcbiAgICBpZiAoZHR5cGUgPT0gbnVsbCB8fCBkdHlwZSA9PT0gJ2Zsb2F0MzInKSB7XG4gICAgICAgIHZhbHVlcyA9IG5ldyBGbG9hdDMyQXJyYXkoc2l6ZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGR0eXBlID09PSAnaW50MzInKSB7XG4gICAgICAgIHZhbHVlcyA9IG5ldyBJbnQzMkFycmF5KHNpemUpO1xuICAgIH1cbiAgICBlbHNlIGlmIChkdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgICAgIHZhbHVlcyA9IG5ldyBVaW50OEFycmF5KHNpemUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGRhdGEgdHlwZSAke2R0eXBlfWApO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICB2YWx1ZXNbaV0gPSByYW5kRnVuY3Rpb24oKTtcbiAgICB9XG4gICAgcmV0dXJuIEVOR0lORS5tYWtlVGVuc29yKHZhbHVlcywgc2hhcGUsIGR0eXBlKTtcbn1cbmV4cG9ydCBjb25zdCByYW5kID0gb3AoeyByYW5kXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJhbmQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0ICogYXMgc2VlZHJhbmRvbSBmcm9tICdzZWVkcmFuZG9tJztcbmltcG9ydCB7IGV4cGVjdE51bWJlcnNDbG9zZSwgdGVzdEVwc2lsb24gfSBmcm9tICcuLi90ZXN0X3V0aWwnO1xuLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTWFyc2FnbGlhX3BvbGFyX21ldGhvZFxuZXhwb3J0IGNsYXNzIE1QUmFuZEdhdXNzIHtcbiAgICBjb25zdHJ1Y3RvcihtZWFuLCBzdGREZXZpYXRpb24sIGR0eXBlLCB0cnVuY2F0ZWQsIHNlZWQpIHtcbiAgICAgICAgdGhpcy5tZWFuID0gbWVhbjtcbiAgICAgICAgdGhpcy5zdGREZXYgPSBzdGREZXZpYXRpb247XG4gICAgICAgIHRoaXMuZHR5cGUgPSBkdHlwZTtcbiAgICAgICAgdGhpcy5uZXh0VmFsID0gTmFOO1xuICAgICAgICB0aGlzLnRydW5jYXRlZCA9IHRydW5jYXRlZDtcbiAgICAgICAgaWYgKHRoaXMudHJ1bmNhdGVkKSB7XG4gICAgICAgICAgICB0aGlzLnVwcGVyID0gdGhpcy5tZWFuICsgdGhpcy5zdGREZXYgKiAyO1xuICAgICAgICAgICAgdGhpcy5sb3dlciA9IHRoaXMubWVhbiAtIHRoaXMuc3RkRGV2ICogMjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZWVkVmFsdWUgPSBzZWVkID8gc2VlZCA6IE1hdGgucmFuZG9tKCk7XG4gICAgICAgIHRoaXMucmFuZG9tID0gc2VlZHJhbmRvbS5hbGVhKHNlZWRWYWx1ZS50b1N0cmluZygpKTtcbiAgICB9XG4gICAgLyoqIFJldHVybnMgbmV4dCBzYW1wbGUgZnJvbSBhIEdhdXNzaWFuIGRpc3RyaWJ1dGlvbi4gKi9cbiAgICBuZXh0VmFsdWUoKSB7XG4gICAgICAgIGlmICghaXNOYU4odGhpcy5uZXh0VmFsKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLm5leHRWYWw7XG4gICAgICAgICAgICB0aGlzLm5leHRWYWwgPSBOYU47XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlc3VsdFgsIHJlc3VsdFk7XG4gICAgICAgIGxldCBpc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgIHdoaWxlICghaXNWYWxpZCkge1xuICAgICAgICAgICAgbGV0IHYxLCB2MiwgcztcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICB2MSA9IDIgKiB0aGlzLnJhbmRvbSgpIC0gMTtcbiAgICAgICAgICAgICAgICB2MiA9IDIgKiB0aGlzLnJhbmRvbSgpIC0gMTtcbiAgICAgICAgICAgICAgICBzID0gdjEgKiB2MSArIHYyICogdjI7XG4gICAgICAgICAgICB9IHdoaWxlIChzID49IDEgfHwgcyA9PT0gMCk7XG4gICAgICAgICAgICBjb25zdCBtdWwgPSBNYXRoLnNxcnQoLTIuMCAqIE1hdGgubG9nKHMpIC8gcyk7XG4gICAgICAgICAgICByZXN1bHRYID0gdGhpcy5tZWFuICsgdGhpcy5zdGREZXYgKiB2MSAqIG11bDtcbiAgICAgICAgICAgIHJlc3VsdFkgPSB0aGlzLm1lYW4gKyB0aGlzLnN0ZERldiAqIHYyICogbXVsO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnRydW5jYXRlZCB8fCB0aGlzLmlzVmFsaWRUcnVuY2F0ZWQocmVzdWx0WCkpIHtcbiAgICAgICAgICAgICAgICBpc1ZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMudHJ1bmNhdGVkIHx8IHRoaXMuaXNWYWxpZFRydW5jYXRlZChyZXN1bHRZKSkge1xuICAgICAgICAgICAgdGhpcy5uZXh0VmFsID0gdGhpcy5jb252ZXJ0VmFsdWUocmVzdWx0WSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydFZhbHVlKHJlc3VsdFgpO1xuICAgIH1cbiAgICAvKiogSGFuZGxlcyBwcm9wZXIgcm91bmRpbmcgZm9yIG5vbi1mbG9hdGluZy1wb2ludCBudW1iZXJzLiAqL1xuICAgIGNvbnZlcnRWYWx1ZSh2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5kdHlwZSA9PSBudWxsIHx8IHRoaXMuZHR5cGUgPT09ICdmbG9hdDMyJykge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlKTtcbiAgICB9XG4gICAgLyoqIFJldHVybnMgdHJ1ZSBpZiBsZXNzIHRoYW4gMi1zdGFuZGFyZC1kZXZpYXRpb25zIGZyb20gdGhlIG1lYW4uICovXG4gICAgaXNWYWxpZFRydW5jYXRlZCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPD0gdGhpcy51cHBlciAmJiB2YWx1ZSA+PSB0aGlzLmxvd2VyO1xuICAgIH1cbn1cbi8vIE1hcnNhZ2xpYSwgR2VvcmdlLCBhbmQgV2FpIFdhbiBUc2FuZy4gMjAwMC4gXCJBIFNpbXBsZSBNZXRob2QgZm9yIEdlbmVyYXRpbmdcbi8vIEdhbW1hIFZhcmlhYmxlcy5cIlxuZXhwb3J0IGNsYXNzIFJhbmRHYW1tYSB7XG4gICAgY29uc3RydWN0b3IoYWxwaGEsIGJldGEsIGR0eXBlLCBzZWVkKSB7XG4gICAgICAgIHRoaXMuYWxwaGEgPSBhbHBoYTtcbiAgICAgICAgdGhpcy5iZXRhID0gMSAvIGJldGE7IC8vIGNvbnZlcnQgcmF0ZSB0byBzY2FsZSBwYXJhbWV0ZXJcbiAgICAgICAgdGhpcy5kdHlwZSA9IGR0eXBlO1xuICAgICAgICBjb25zdCBzZWVkVmFsdWUgPSBzZWVkID8gc2VlZCA6IE1hdGgucmFuZG9tKCk7XG4gICAgICAgIHRoaXMucmFuZHUgPSBzZWVkcmFuZG9tLmFsZWEoc2VlZFZhbHVlLnRvU3RyaW5nKCkpO1xuICAgICAgICB0aGlzLnJhbmRuID0gbmV3IE1QUmFuZEdhdXNzKDAsIDEsIGR0eXBlLCBmYWxzZSwgdGhpcy5yYW5kdSgpKTtcbiAgICAgICAgaWYgKGFscGhhIDwgMSkge1xuICAgICAgICAgICAgdGhpcy5kID0gYWxwaGEgKyAoMiAvIDMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kID0gYWxwaGEgLSAoMSAvIDMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYyA9IDEgLyBNYXRoLnNxcnQoOSAqIHRoaXMuZCk7XG4gICAgfVxuICAgIC8qKiBSZXR1cm5zIG5leHQgc2FtcGxlIGZyb20gYSBnYW1tYSBkaXN0cmlidXRpb24uICovXG4gICAgbmV4dFZhbHVlKCkge1xuICAgICAgICBsZXQgeDIsIHYwLCB2MSwgeCwgdSwgdjtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICB4ID0gdGhpcy5yYW5kbi5uZXh0VmFsdWUoKTtcbiAgICAgICAgICAgICAgICB2ID0gMSArICh0aGlzLmMgKiB4KTtcbiAgICAgICAgICAgIH0gd2hpbGUgKHYgPD0gMCk7XG4gICAgICAgICAgICB2ICo9IHYgKiB2O1xuICAgICAgICAgICAgeDIgPSB4ICogeDtcbiAgICAgICAgICAgIHYwID0gMSAtICgwLjMzMSAqIHgyICogeDIpO1xuICAgICAgICAgICAgdjEgPSAoMC41ICogeDIpICsgKHRoaXMuZCAqICgxIC0gdiArIE1hdGgubG9nKHYpKSk7XG4gICAgICAgICAgICB1ID0gdGhpcy5yYW5kdSgpO1xuICAgICAgICAgICAgaWYgKHUgPCB2MCB8fCBNYXRoLmxvZyh1KSA8IHYxKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdiA9ICgxIC8gdGhpcy5iZXRhKSAqIHRoaXMuZCAqIHY7XG4gICAgICAgIGlmICh0aGlzLmFscGhhIDwgMSkge1xuICAgICAgICAgICAgdiAqPSBNYXRoLnBvdyh0aGlzLnJhbmR1KCksIDEgLyB0aGlzLmFscGhhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0VmFsdWUodik7XG4gICAgfVxuICAgIC8qKiBIYW5kbGVzIHByb3BlciByb3VuZGluZyBmb3Igbm9uLWZsb2F0aW5nLXBvaW50IG51bWJlcnMuICovXG4gICAgY29udmVydFZhbHVlKHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLmR0eXBlID09PSAnZmxvYXQzMicpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCh2YWx1ZSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIFVuaWZvcm1SYW5kb20ge1xuICAgIGNvbnN0cnVjdG9yKG1pbiA9IDAsIG1heCA9IDEsIGR0eXBlLCBzZWVkKSB7XG4gICAgICAgIC8qKiBIYW5kbGVzIHByb3BlciByb3VuZGluZyBmb3Igbm9uIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuICovXG4gICAgICAgIHRoaXMuY2FuUmV0dXJuRmxvYXQgPSAoKSA9PiAodGhpcy5kdHlwZSA9PSBudWxsIHx8IHRoaXMuZHR5cGUgPT09ICdmbG9hdDMyJyk7XG4gICAgICAgIHRoaXMubWluID0gbWluO1xuICAgICAgICB0aGlzLnJhbmdlID0gbWF4IC0gbWluO1xuICAgICAgICB0aGlzLmR0eXBlID0gZHR5cGU7XG4gICAgICAgIGlmIChzZWVkID09IG51bGwpIHtcbiAgICAgICAgICAgIHNlZWQgPSBNYXRoLnJhbmRvbSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2VlZCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHNlZWQgPSBzZWVkLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmNhblJldHVybkZsb2F0KCkgJiYgdGhpcy5yYW5nZSA8PSAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gJHttaW59IC0gJHttYXh9IDw9IDEgYW5kIGR0eXBlIGlzIG5vdCBmbG9hdGApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmFuZG9tID0gc2VlZHJhbmRvbS5hbGVhKHNlZWQpO1xuICAgIH1cbiAgICBjb252ZXJ0VmFsdWUodmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuY2FuUmV0dXJuRmxvYXQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlKTtcbiAgICB9XG4gICAgbmV4dFZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0VmFsdWUodGhpcy5taW4gKyB0aGlzLnJhbmdlICogdGhpcy5yYW5kb20oKSk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGphcnF1ZUJlcmFOb3JtYWxpdHlUZXN0KHZhbHVlcykge1xuICAgIC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0phcnF1ZSVFMiU4MCU5M0JlcmFfdGVzdFxuICAgIGNvbnN0IG4gPSB2YWx1ZXMubGVuZ3RoO1xuICAgIGNvbnN0IHMgPSBza2V3bmVzcyh2YWx1ZXMpO1xuICAgIGNvbnN0IGsgPSBrdXJ0b3Npcyh2YWx1ZXMpO1xuICAgIGNvbnN0IGpiID0gbiAvIDYgKiAoTWF0aC5wb3cocywgMikgKyAwLjI1ICogTWF0aC5wb3coayAtIDMsIDIpKTtcbiAgICAvLyBKQiB0ZXN0IHJlcXVpcmVzIDItZGVncmVzcyBvZiBmcmVlZG9tIGZyb20gQ2hpLVNxdWFyZSBAIDAuOTU6XG4gICAgLy8gaHR0cDovL3d3dy5pdGwubmlzdC5nb3YvZGl2ODk4L2hhbmRib29rL2VkYS9zZWN0aW9uMy9lZGEzNjc0Lmh0bVxuICAgIGNvbnN0IENISV9TUVVBUkVfMkRFRyA9IDUuOTkxO1xuICAgIGlmIChqYiA+IENISV9TUVVBUkVfMkRFRykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcC12YWx1ZSBmb3IgSkI6ICR7amJ9YCk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGV4cGVjdEFycmF5SW5NZWFuU3RkUmFuZ2UoYWN0dWFsLCBleHBlY3RlZE1lYW4sIGV4cGVjdGVkU3RkRGV2LCBlcHNpbG9uKSB7XG4gICAgaWYgKGVwc2lsb24gPT0gbnVsbCkge1xuICAgICAgICBlcHNpbG9uID0gdGVzdEVwc2lsb24oKTtcbiAgICB9XG4gICAgY29uc3QgYWN0dWFsTWVhbiA9IG1lYW4oYWN0dWFsKTtcbiAgICBleHBlY3ROdW1iZXJzQ2xvc2UoYWN0dWFsTWVhbiwgZXhwZWN0ZWRNZWFuLCBlcHNpbG9uKTtcbiAgICBleHBlY3ROdW1iZXJzQ2xvc2Uoc3RhbmRhcmREZXZpYXRpb24oYWN0dWFsLCBhY3R1YWxNZWFuKSwgZXhwZWN0ZWRTdGREZXYsIGVwc2lsb24pO1xufVxuZnVuY3Rpb24gbWVhbih2YWx1ZXMpIHtcbiAgICBsZXQgc3VtID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBzdW0gKz0gdmFsdWVzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gc3VtIC8gdmFsdWVzLmxlbmd0aDtcbn1cbmZ1bmN0aW9uIHN0YW5kYXJkRGV2aWF0aW9uKHZhbHVlcywgbWVhbikge1xuICAgIGxldCBzcXVhcmVEaWZmU3VtID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBkaWZmID0gdmFsdWVzW2ldIC0gbWVhbjtcbiAgICAgICAgc3F1YXJlRGlmZlN1bSArPSBkaWZmICogZGlmZjtcbiAgICB9XG4gICAgcmV0dXJuIE1hdGguc3FydChzcXVhcmVEaWZmU3VtIC8gdmFsdWVzLmxlbmd0aCk7XG59XG5mdW5jdGlvbiBrdXJ0b3Npcyh2YWx1ZXMpIHtcbiAgICAvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9LdXJ0b3Npc1xuICAgIGNvbnN0IHZhbHVlc01lYW4gPSBtZWFuKHZhbHVlcyk7XG4gICAgY29uc3QgbiA9IHZhbHVlcy5sZW5ndGg7XG4gICAgbGV0IHN1bTIgPSAwO1xuICAgIGxldCBzdW00ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICBjb25zdCB2ID0gdmFsdWVzW2ldIC0gdmFsdWVzTWVhbjtcbiAgICAgICAgc3VtMiArPSBNYXRoLnBvdyh2LCAyKTtcbiAgICAgICAgc3VtNCArPSBNYXRoLnBvdyh2LCA0KTtcbiAgICB9XG4gICAgcmV0dXJuICgxIC8gbikgKiBzdW00IC8gTWF0aC5wb3coKDEgLyBuKSAqIHN1bTIsIDIpO1xufVxuZnVuY3Rpb24gc2tld25lc3ModmFsdWVzKSB7XG4gICAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU2tld25lc3NcbiAgICBjb25zdCB2YWx1ZXNNZWFuID0gbWVhbih2YWx1ZXMpO1xuICAgIGNvbnN0IG4gPSB2YWx1ZXMubGVuZ3RoO1xuICAgIGxldCBzdW0yID0gMDtcbiAgICBsZXQgc3VtMyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgY29uc3QgdiA9IHZhbHVlc1tpXSAtIHZhbHVlc01lYW47XG4gICAgICAgIHN1bTIgKz0gTWF0aC5wb3codiwgMik7XG4gICAgICAgIHN1bTMgKz0gTWF0aC5wb3codiwgMyk7XG4gICAgfVxuICAgIHJldHVybiAoMSAvIG4pICogc3VtMyAvIE1hdGgucG93KCgxIC8gKG4gLSAxKSkgKiBzdW0yLCAzIC8gMik7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yYW5kX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYnVmZmVyIH0gZnJvbSAnLi9idWZmZXInO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyBSYW5kR2FtbWEgfSBmcm9tICcuL3JhbmRfdXRpbCc7XG4vKipcbiAqIENyZWF0ZXMgYSBgdGYuVGVuc29yYCB3aXRoIHZhbHVlcyBzYW1wbGVkIGZyb20gYSBnYW1tYSBkaXN0cmlidXRpb24uXG4gKlxuICogYGBganNcbiAqIHRmLnJhbmRvbUdhbW1hKFsyLCAyXSwgMSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBzaGFwZSBBbiBhcnJheSBvZiBpbnRlZ2VycyBkZWZpbmluZyB0aGUgb3V0cHV0IHRlbnNvciBzaGFwZS5cbiAqIEBwYXJhbSBhbHBoYSBUaGUgc2hhcGUgcGFyYW1ldGVyIG9mIHRoZSBnYW1tYSBkaXN0cmlidXRpb24uXG4gKiBAcGFyYW0gYmV0YSBUaGUgaW52ZXJzZSBzY2FsZSBwYXJhbWV0ZXIgb2YgdGhlIGdhbW1hIGRpc3RyaWJ1dGlvbi4gRGVmYXVsdHNcbiAqICAgICB0byAxLlxuICogQHBhcmFtIGR0eXBlIFRoZSBkYXRhIHR5cGUgb2YgdGhlIG91dHB1dC4gRGVmYXVsdHMgdG8gZmxvYXQzMi5cbiAqIEBwYXJhbSBzZWVkIFRoZSBzZWVkIGZvciB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnUmFuZG9tJ31cbiAqL1xuZnVuY3Rpb24gcmFuZG9tR2FtbWFfKHNoYXBlLCBhbHBoYSwgYmV0YSA9IDEsIGR0eXBlID0gJ2Zsb2F0MzInLCBzZWVkKSB7XG4gICAgaWYgKGJldGEgPT0gbnVsbCkge1xuICAgICAgICBiZXRhID0gMTtcbiAgICB9XG4gICAgaWYgKGR0eXBlID09IG51bGwpIHtcbiAgICAgICAgZHR5cGUgPSAnZmxvYXQzMic7XG4gICAgfVxuICAgIGlmIChkdHlwZSAhPT0gJ2Zsb2F0MzInICYmIGR0eXBlICE9PSAnaW50MzInKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgZGF0YSB0eXBlICR7ZHR5cGV9YCk7XG4gICAgfVxuICAgIGNvbnN0IHJnYW1tYSA9IG5ldyBSYW5kR2FtbWEoYWxwaGEsIGJldGEsIGR0eXBlLCBzZWVkKTtcbiAgICBjb25zdCByZXMgPSBidWZmZXIoc2hhcGUsIGR0eXBlKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlcy52YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzLnZhbHVlc1tpXSA9IHJnYW1tYS5uZXh0VmFsdWUoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy50b1RlbnNvcigpO1xufVxuZXhwb3J0IGNvbnN0IHJhbmRvbUdhbW1hID0gb3AoeyByYW5kb21HYW1tYV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yYW5kb21fZ2FtbWEuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYnVmZmVyIH0gZnJvbSAnLi9idWZmZXInO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyBNUFJhbmRHYXVzcyB9IGZyb20gJy4vcmFuZF91dGlsJztcbi8qKlxuICogQ3JlYXRlcyBhIGB0Zi5UZW5zb3JgIHdpdGggdmFsdWVzIHNhbXBsZWQgZnJvbSBhIG5vcm1hbCBkaXN0cmlidXRpb24uXG4gKlxuICogYGBganNcbiAqIHRmLnJhbmRvbU5vcm1hbChbMiwgMl0pLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gc2hhcGUgQW4gYXJyYXkgb2YgaW50ZWdlcnMgZGVmaW5pbmcgdGhlIG91dHB1dCB0ZW5zb3Igc2hhcGUuXG4gKiBAcGFyYW0gbWVhbiBUaGUgbWVhbiBvZiB0aGUgbm9ybWFsIGRpc3RyaWJ1dGlvbi5cbiAqIEBwYXJhbSBzdGREZXYgVGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgbm9ybWFsIGRpc3RyaWJ1dGlvbi5cbiAqIEBwYXJhbSBkdHlwZSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBvdXRwdXQuXG4gKiBAcGFyYW0gc2VlZCBUaGUgc2VlZCBmb3IgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1JhbmRvbSd9XG4gKi9cbmZ1bmN0aW9uIHJhbmRvbU5vcm1hbF8oc2hhcGUsIG1lYW4gPSAwLCBzdGREZXYgPSAxLCBkdHlwZSwgc2VlZCkge1xuICAgIGlmIChkdHlwZSAhPSBudWxsICYmIGR0eXBlID09PSAnYm9vbCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBkYXRhIHR5cGUgJHtkdHlwZX1gKTtcbiAgICB9XG4gICAgY29uc3QgcmFuZEdhdXNzID0gbmV3IE1QUmFuZEdhdXNzKG1lYW4sIHN0ZERldiwgZHR5cGUsIGZhbHNlIC8qIHRydW5jYXRlZCAqLywgc2VlZCk7XG4gICAgY29uc3QgcmVzID0gYnVmZmVyKHNoYXBlLCBkdHlwZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXMudmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlcy52YWx1ZXNbaV0gPSByYW5kR2F1c3MubmV4dFZhbHVlKCk7XG4gICAgfVxuICAgIHJldHVybiByZXMudG9UZW5zb3IoKTtcbn1cbmV4cG9ydCBjb25zdCByYW5kb21Ob3JtYWwgPSBvcCh7IHJhbmRvbU5vcm1hbF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yYW5kb21fbm9ybWFsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJ1ZmZlciB9IGZyb20gJy4vYnVmZmVyJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgVW5pZm9ybVJhbmRvbSB9IGZyb20gJy4vcmFuZF91dGlsJztcbi8qKlxuICogQ3JlYXRlcyBhIGB0Zi5UZW5zb3JgIHdpdGggdmFsdWVzIHNhbXBsZWQgZnJvbSBhIHVuaWZvcm0gZGlzdHJpYnV0aW9uLlxuICpcbiAqIFRoZSBnZW5lcmF0ZWQgdmFsdWVzIGZvbGxvdyBhIHVuaWZvcm0gZGlzdHJpYnV0aW9uIGluIHRoZSByYW5nZSBbbWludmFsLFxuICogbWF4dmFsKS4gVGhlIGxvd2VyIGJvdW5kIG1pbnZhbCBpcyBpbmNsdWRlZCBpbiB0aGUgcmFuZ2UsIHdoaWxlIHRoZSB1cHBlclxuICogYm91bmQgbWF4dmFsIGlzIGV4Y2x1ZGVkLlxuICpcbiAqIGBgYGpzXG4gKiB0Zi5yYW5kb21Vbmlmb3JtKFsyLCAyXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBzaGFwZSBBbiBhcnJheSBvZiBpbnRlZ2VycyBkZWZpbmluZyB0aGUgb3V0cHV0IHRlbnNvciBzaGFwZS5cbiAqIEBwYXJhbSBtaW52YWwgVGhlIGxvd2VyIGJvdW5kIG9uIHRoZSByYW5nZSBvZiByYW5kb20gdmFsdWVzIHRvIGdlbmVyYXRlLlxuICogICBEZWZhdWx0cyB0byAwLlxuICogQHBhcmFtIG1heHZhbCBUaGUgdXBwZXIgYm91bmQgb24gdGhlIHJhbmdlIG9mIHJhbmRvbSB2YWx1ZXMgdG8gZ2VuZXJhdGUuXG4gKiAgIERlZmF1bHRzIHRvIDEuXG4gKiBAcGFyYW0gZHR5cGUgVGhlIGRhdGEgdHlwZSBvZiB0aGUgb3V0cHV0IHRlbnNvci4gRGVmYXVsdHMgdG8gJ2Zsb2F0MzInLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1JhbmRvbSd9XG4gKi9cbmZ1bmN0aW9uIHJhbmRvbVVuaWZvcm1fKHNoYXBlLCBtaW52YWwgPSAwLCBtYXh2YWwgPSAxLCBkdHlwZSA9ICdmbG9hdDMyJywgc2VlZCkge1xuICAgIGNvbnN0IHJlcyA9IGJ1ZmZlcihzaGFwZSwgZHR5cGUpO1xuICAgIGNvbnN0IHJhbmRvbSA9IG5ldyBVbmlmb3JtUmFuZG9tKG1pbnZhbCwgbWF4dmFsLCBudWxsLCBzZWVkKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlcy52YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzLnZhbHVlc1tpXSA9IHJhbmRvbS5uZXh0VmFsdWUoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy50b1RlbnNvcigpO1xufVxuZXhwb3J0IGNvbnN0IHJhbmRvbVVuaWZvcm0gPSBvcCh7IHJhbmRvbVVuaWZvcm1fIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmFuZG9tX3VuaWZvcm0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFJhbmdlIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBgdGYuVGVuc29yMURgIGZpbGxlZCB3aXRoIHRoZSBudW1iZXJzIGluIHRoZSByYW5nZSBwcm92aWRlZC5cbiAqXG4gKiBUaGUgdGVuc29yIGlzIGEgaXMgaGFsZi1vcGVuIGludGVydmFsIG1lYW5pbmcgaXQgaW5jbHVkZXMgc3RhcnQsIGJ1dFxuICogZXhjbHVkZXMgc3RvcC4gRGVjcmVtZW50aW5nIHJhbmdlcyBhbmQgbmVnYXRpdmUgc3RlcCB2YWx1ZXMgYXJlIGFsc29cbiAqIHN1cHBvcnRlZC5zdlxuICpcbiAqXG4gKiBgYGBqc1xuICogdGYucmFuZ2UoMCwgOSwgMikucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBzdGFydCBBbiBpbnRlZ2VyIHN0YXJ0IHZhbHVlXG4gKiBAcGFyYW0gc3RvcCBBbiBpbnRlZ2VyIHN0b3AgdmFsdWVcbiAqIEBwYXJhbSBzdGVwIEFuIGludGVnZXIgaW5jcmVtZW50ICh3aWxsIGRlZmF1bHQgdG8gMSBvciAtMSlcbiAqIEBwYXJhbSBkdHlwZSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBvdXRwdXQgdGVuc29yLiBEZWZhdWx0cyB0byAnZmxvYXQzMicuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmFuZ2Uoc3RhcnQsIHN0b3AsIHN0ZXAgPSAxLCBkdHlwZSA9ICdmbG9hdDMyJykge1xuICAgIGlmIChzdGVwID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGhhdmUgYSBzdGVwIG9mIHplcm8nKTtcbiAgICB9XG4gICAgY29uc3QgYXR0cnMgPSB7IHN0YXJ0LCBzdG9wLCBzdGVwLCBkdHlwZSB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFJhbmdlLCB7fSAvKiBpbnB1dHMgKi8sIGF0dHJzKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJhbmdlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBSZWFsIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV0dXJucyB0aGUgcmVhbCBwYXJ0IG9mIGEgY29tcGxleCAob3IgcmVhbCkgdGVuc29yLlxuICpcbiAqIEdpdmVuIGEgdGVuc29yIGlucHV0LCB0aGlzIG9wZXJhdGlvbiByZXR1cm5zIGEgdGVuc29yIG9mIHR5cGUgZmxvYXQgdGhhdCBpc1xuICogdGhlIHJlYWwgcGFydCBvZiBlYWNoIGVsZW1lbnQgaW4gaW5wdXQgY29uc2lkZXJlZCBhcyBhIGNvbXBsZXggbnVtYmVyLlxuICpcbiAqIElmIHRoZSBpbnB1dCBpcyByZWFsLCBpdCBzaW1wbHkgbWFrZXMgYSBjbG9uZS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLmNvbXBsZXgoWy0yLjI1LCAzLjI1XSwgWzQuNzUsIDUuNzVdKTtcbiAqIHRmLnJlYWwoeCkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZnVuY3Rpb24gcmVhbF8oaW5wdXQpIHtcbiAgICBjb25zdCAkaW5wdXQgPSBjb252ZXJ0VG9UZW5zb3IoaW5wdXQsICdpbnB1dCcsICdyZWFsJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyBpbnB1dDogJGlucHV0IH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoUmVhbCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCByZWFsID0gb3AoeyByZWFsXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlYWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFJlY2lwcm9jYWwgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyByZWNpcHJvY2FsIG9mIHggZWxlbWVudC13aXNlOiBgMSAvIHhgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMCwgMSwgMl0pO1xuICpcbiAqIHgucmVjaXByb2NhbCgpLnByaW50KCk7ICAvLyBvciB0Zi5yZWNpcHJvY2FsKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIHJlY2lwcm9jYWxfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdyZWNpcHJvY2FsJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFJlY2lwcm9jYWwsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgcmVjaXByb2NhbCA9IG9wKHsgcmVjaXByb2NhbF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWNpcHJvY2FsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qKlxuICogSW5wdXRzIG9mIHNpemUgYWJvdmUgdGhpcyB0aHJlc2hvbGQgd2lsbCBiZSBwYXJhbGxlbGl6ZWQgYnkgY2FsbGluZyBtdWx0aXBsZVxuICogc2hhZGVyIHByb2dyYW1zLlxuICovXG5pbXBvcnQgeyBuZWFyZXN0RGl2aXNvciB9IGZyb20gJy4uL3V0aWwnO1xuZXhwb3J0IGNvbnN0IFBBUkFMTEVMSVpFX1RIUkVTSE9MRCA9IDMwO1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVPcHRpbWFsV2luZG93U2l6ZShpblNpemUpIHtcbiAgICBpZiAoaW5TaXplIDw9IFBBUkFMTEVMSVpFX1RIUkVTSE9MRCkge1xuICAgICAgICByZXR1cm4gaW5TaXplO1xuICAgIH1cbiAgICByZXR1cm4gbmVhcmVzdERpdmlzb3IoaW5TaXplLCBNYXRoLmZsb29yKE1hdGguc3FydChpblNpemUpKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWR1Y2VfdXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgUmVsdSB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIHJlY3RpZmllZCBsaW5lYXIgZWxlbWVudC13aXNlOiBgbWF4KHgsIDApYC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFstMSwgMiwgLTMsIDRdKTtcbiAqXG4gKiB4LnJlbHUoKS5wcmludCgpOyAgLy8gb3IgdGYucmVsdSh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLiBJZiB0aGUgZHR5cGUgaXMgYGJvb2xgLCB0aGUgb3V0cHV0IGR0eXBlIHdpbGwgYmVcbiAqICAgICBgaW50MzInLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiByZWx1Xyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAncmVsdScpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChSZWx1LCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IHJlbHUgPSBvcCh7IHJlbHVfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVsdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgUmVsdTYgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyByZWN0aWZpZWQgbGluZWFyIDYgZWxlbWVudC13aXNlOiBgbWluKG1heCh4LCAwKSwgNilgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWy0xLCAyLCAtMywgOF0pO1xuICpcbiAqIHgucmVsdTYoKS5wcmludCgpOyAgLy8gb3IgdGYucmVsdTYoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci4gSWYgdGhlIGR0eXBlIGlzIGBib29sYCwgdGhlIG91dHB1dCBkdHlwZSB3aWxsIGJlXG4gKiAgICAgYGludDMyJy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gcmVsdTZfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdyZWx1NicpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChSZWx1NiwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCByZWx1NiA9IG9wKHsgcmVsdTZfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVsdTYuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFJlc2hhcGUgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBSZXNoYXBlcyBhIGB0Zi5UZW5zb3JgIHRvIGEgZ2l2ZW4gc2hhcGUuXG4gKlxuICogR2l2ZW4gYW4gaW5wdXQgdGVuc29yLCByZXR1cm5zIGEgbmV3IHRlbnNvciB3aXRoIHRoZSBzYW1lIHZhbHVlcyBhcyB0aGVcbiAqIGlucHV0IHRlbnNvciB3aXRoIHNoYXBlIGBzaGFwZWAuXG4gKlxuICogSWYgb25lIGNvbXBvbmVudCBvZiBzaGFwZSBpcyB0aGUgc3BlY2lhbCB2YWx1ZSAtMSwgdGhlIHNpemUgb2YgdGhhdFxuICogZGltZW5zaW9uIGlzIGNvbXB1dGVkIHNvIHRoYXQgdGhlIHRvdGFsIHNpemUgcmVtYWlucyBjb25zdGFudC4gSW5cbiAqIHBhcnRpY3VsYXIsIGEgc2hhcGUgb2YgWy0xXSBmbGF0dGVucyBpbnRvIDEtRC4gQXQgbW9zdCBvbmUgY29tcG9uZW50IG9mXG4gKiBzaGFwZSBjYW4gYmUgLTEuXG4gKlxuICogSWYgc2hhcGUgaXMgMS1EIG9yIGhpZ2hlciwgdGhlbiB0aGUgb3BlcmF0aW9uIHJldHVybnMgYSB0ZW5zb3Igd2l0aCBzaGFwZVxuICogc2hhcGUgZmlsbGVkIHdpdGggdGhlIHZhbHVlcyBvZiB0ZW5zb3IuIEluIHRoaXMgY2FzZSwgdGhlIG51bWJlciBvZlxuICogZWxlbWVudHMgaW1wbGllZCBieSBzaGFwZSBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW5cbiAqIHRlbnNvci5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzLCA0XSk7XG4gKiB4LnJlc2hhcGUoWzIsIDJdKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciB0byBiZSByZXNoYXBlZC5cbiAqIEBwYXJhbSBzaGFwZSBBbiBhcnJheSBvZiBpbnRlZ2VycyBkZWZpbmluZyB0aGUgb3V0cHV0IHRlbnNvciBzaGFwZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdUcmFuc2Zvcm1hdGlvbnMnfVxuICovXG5mdW5jdGlvbiByZXNoYXBlXyh4LCBzaGFwZSkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3Jlc2hhcGUnLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgY29uc3QgYXR0cnMgPSB7IHNoYXBlIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoUmVzaGFwZSwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgcmVzaGFwZSA9IG9wKHsgcmVzaGFwZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZXNoYXBlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBSZXZlcnNlIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV2ZXJzZXMgYSBgdGYuVGVuc29yYCBhbG9uZyBhIHNwZWNpZmllZCBheGlzLlxuICpcbiAqIEFsc28gYXZhaWxhYmxlIGFyZSBzdHJpY3RlciByYW5rLXNwZWNpZmljIG1ldGhvZHMgdGhhdCBhc3NlcnQgdGhhdCBgeGAgaXNcbiAqIG9mIHRoZSBnaXZlbiByYW5rOlxuICogICAtIGB0Zi5yZXZlcnNlMWRgXG4gKiAgIC0gYHRmLnJldmVyc2UyZGBcbiAqICAgLSBgdGYucmV2ZXJzZTNkYFxuICogICAtIGB0Zi5yZXZlcnNlNGRgXG4gKlxuICogRXhjZXB0IGB0Zi5yZXZlcnNlMWRgICh3aGljaCBkb2VzIG5vdCBoYXZlIGF4aXMgcGFyYW0pLCBhbGwgbWV0aG9kcyBoYXZlXG4gKiBzYW1lIHNpZ25hdHVyZSBhcyB0aGlzIG1ldGhvZC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzLCA0XSk7XG4gKlxuICogeC5yZXZlcnNlKCkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pO1xuICpcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5yZXZlcnNlKGF4aXMpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IgdG8gYmUgcmV2ZXJzZWQuXG4gKiBAcGFyYW0gYXhpcyBUaGUgc2V0IG9mIGRpbWVuc2lvbnMgdG8gcmV2ZXJzZS4gTXVzdCBiZSBpbiB0aGVcbiAqICAgICByYW5nZSBbLXJhbmsoeCksIHJhbmsoeCkpLiBEZWZhdWx0cyB0byBhbGwgYXhlcy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdTbGljaW5nIGFuZCBKb2luaW5nJ31cbiAqL1xuZnVuY3Rpb24gcmV2ZXJzZV8oeCwgYXhpcykge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3JldmVyc2UnKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgY29uc3QgYXR0cnMgPSB7IGRpbXM6IGF4aXMgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChSZXZlcnNlLCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCByZXZlcnNlID0gb3AoeyByZXZlcnNlXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJldmVyc2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJldmVyc2UgfSBmcm9tICcuL3JldmVyc2UnO1xuLyoqXG4gKiBSZXZlcnNlcyBhIGB0Zi5UZW5zb3IxRGAuXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqL1xuZnVuY3Rpb24gcmV2ZXJzZTFkXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAncmV2ZXJzZScpO1xuICAgIHV0aWwuYXNzZXJ0KCR4LnJhbmsgPT09IDEsICgpID0+IGBFcnJvciBpbiByZXZlcnNlMUQ6IHggbXVzdCBiZSByYW5rIDEgYnV0IGdvdCByYW5rICR7JHgucmFua30uYCk7XG4gICAgcmV0dXJuIHJldmVyc2UoJHgsIDApO1xufVxuZXhwb3J0IGNvbnN0IHJldmVyc2UxZCA9IG9wKHsgcmV2ZXJzZTFkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJldmVyc2VfMWQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJldmVyc2UgfSBmcm9tICcuL3JldmVyc2UnO1xuLyoqXG4gKiBSZXZlcnNlcyBhIGB0Zi5UZW5zb3IyRGAgYWxvbmcgYSBzcGVjaWZpZWQgYXhpcy5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICogQHBhcmFtIGF4aXMgVGhlIHNldCBvZiBkaW1lbnNpb25zIHRvIHJldmVyc2UuIE11c3QgYmUgaW4gdGhlXG4gKiAgICAgcmFuZ2UgWy1yYW5rKHgpLCByYW5rKHgpKS4gRGVmYXVsdHMgdG8gYWxsIGF4ZXMuXG4gKi9cbmZ1bmN0aW9uIHJldmVyc2UyZF8oeCwgYXhpcykge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3JldmVyc2UnKTtcbiAgICB1dGlsLmFzc2VydCgkeC5yYW5rID09PSAyLCAoKSA9PiBgRXJyb3IgaW4gcmV2ZXJzZTJEOiB4IG11c3QgYmUgcmFuayAyIGJ1dCBnb3QgcmFuayAkeyR4LnJhbmt9LmApO1xuICAgIHJldHVybiByZXZlcnNlKCR4LCBheGlzKTtcbn1cbmV4cG9ydCBjb25zdCByZXZlcnNlMmQgPSBvcCh7IHJldmVyc2UyZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZXZlcnNlXzJkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXZlcnNlIH0gZnJvbSAnLi9yZXZlcnNlJztcbi8qKlxuICogUmV2ZXJzZXMgYSBgdGYuVGVuc29yM0RgIGFsb25nIGEgc3BlY2lmaWVkIGF4aXMuXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBheGlzIFRoZSBzZXQgb2YgZGltZW5zaW9ucyB0byByZXZlcnNlLiBNdXN0IGJlIGluIHRoZVxuICogICAgIHJhbmdlIFstcmFuayh4KSwgcmFuayh4KSkuIERlZmF1bHRzIHRvIGFsbCBheGVzLlxuICovXG5mdW5jdGlvbiByZXZlcnNlM2RfKHgsIGF4aXMpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdyZXZlcnNlJyk7XG4gICAgdXRpbC5hc3NlcnQoJHgucmFuayA9PT0gMywgKCkgPT4gYEVycm9yIGluIHJldmVyc2UzRDogeCBtdXN0IGJlIHJhbmsgMyBidXQgZ290IHJhbmsgJHskeC5yYW5rfS5gKTtcbiAgICByZXR1cm4gcmV2ZXJzZSgkeCwgYXhpcyk7XG59XG5leHBvcnQgY29uc3QgcmV2ZXJzZTNkID0gb3AoeyByZXZlcnNlM2RfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmV2ZXJzZV8zZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmV2ZXJzZSB9IGZyb20gJy4vcmV2ZXJzZSc7XG4vKipcbiAqIFJldmVyc2VzIGEgYHRmLlRlbnNvcjREYCBhbG9uZyBhIHNwZWNpZmllZCBheGlzLlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gYXhpcyBUaGUgc2V0IG9mIGRpbWVuc2lvbnMgdG8gcmV2ZXJzZS4gTXVzdCBiZSBpbiB0aGVcbiAqICAgICByYW5nZSBbLXJhbmsoeCksIHJhbmsoeCkpLiBEZWZhdWx0cyB0byBhbGwgYXhlcy5cbiAqL1xuZnVuY3Rpb24gcmV2ZXJzZTRkXyh4LCBheGlzKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAncmV2ZXJzZScpO1xuICAgIHV0aWwuYXNzZXJ0KCR4LnJhbmsgPT09IDQsICgpID0+IGBFcnJvciBpbiByZXZlcnNlNEQ6IHggbXVzdCBiZSByYW5rIDQgYnV0IGdvdCByYW5rICR7JHgucmFua30uYCk7XG4gICAgcmV0dXJuIHJldmVyc2UoJHgsIGF4aXMpO1xufVxuZXhwb3J0IGNvbnN0IHJldmVyc2U0ZCA9IG9wKHsgcmV2ZXJzZTRkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJldmVyc2VfNGQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLy8gUmV0dXJucyB0aGUgaW1hZ2UgY2VudGVyIGluIHBpeGVscy5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbWFnZUNlbnRlcihjZW50ZXIsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoKSB7XG4gICAgY29uc3QgY2VudGVyWCA9IGltYWdlV2lkdGggKiAodHlwZW9mIGNlbnRlciA9PT0gJ251bWJlcicgPyBjZW50ZXIgOiBjZW50ZXJbMF0pO1xuICAgIGNvbnN0IGNlbnRlclkgPSBpbWFnZUhlaWdodCAqICh0eXBlb2YgY2VudGVyID09PSAnbnVtYmVyJyA/IGNlbnRlciA6IGNlbnRlclsxXSk7XG4gICAgcmV0dXJuIFtjZW50ZXJYLCBjZW50ZXJZXTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJvdGF0ZV91dGlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBSb3VuZCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIHJvdW5kIG9mIGlucHV0IGB0Zi5UZW5zb3JgIGVsZW1lbnQtd2lzZTogYHJvdW5kKHgpYC5cbiAqIEl0IGltcGxlbWVudHMgYmFua2VyJ3Mgcm91bmRpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbLjYsIDEuMSwgLTMuM10pO1xuICpcbiAqIHgucm91bmQoKS5wcmludCgpOyAgLy8gb3IgdGYucm91bmQoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gcm91bmRfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdyb3VuZCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChSb3VuZCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCByb3VuZCA9IG9wKHsgcm91bmRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cm91bmQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFJzcXJ0IH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgcmVjaXByb2NhbCBvZiBzcXVhcmUgcm9vdCBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOlxuICogYHkgPSAxIC8gc3FydCh4KWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCA0LCAtMV0pO1xuICpcbiAqIHgucnNxcnQoKS5wcmludCgpOyAgLy8gb3IgdGYucnNxcnQoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gcnNxcnRfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdyc3FydCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChSc3FydCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCByc3FydCA9IG9wKHsgcnNxcnRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cnNxcnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgaXNUeXBlZEFycmF5IH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBtYWtlVGVuc29yIH0gZnJvbSAnLi90ZW5zb3Jfb3BzX3V0aWwnO1xuLyoqXG4gKiBDcmVhdGVzIHJhbmstMCBgdGYuVGVuc29yYCAoc2NhbGFyKSB3aXRoIHRoZSBwcm92aWRlZCB2YWx1ZSBhbmQgZHR5cGUuXG4gKlxuICogVGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBjYW4gYmUgYWNoaWV2ZWQgd2l0aCBgdGYudGVuc29yYCwgYnV0IGluIGdlbmVyYWxcbiAqIHdlIHJlY29tbWVuZCB1c2luZyBgdGYuc2NhbGFyYCBhcyBpdCBtYWtlcyB0aGUgY29kZSBtb3JlIHJlYWRhYmxlLlxuICpcbiAqIGBgYGpzXG4gKiB0Zi5zY2FsYXIoMy4xNCkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIHNjYWxhci5cbiAqIEBwYXJhbSBkdHlwZSBUaGUgZGF0YSB0eXBlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjYWxhcih2YWx1ZSwgZHR5cGUpIHtcbiAgICBpZiAoKChpc1R5cGVkQXJyYXkodmFsdWUpICYmIGR0eXBlICE9PSAnc3RyaW5nJykgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpICYmXG4gICAgICAgIGR0eXBlICE9PSAnY29tcGxleDY0Jykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vycm9yIGNyZWF0aW5nIGEgbmV3IFNjYWxhcjogdmFsdWUgbXVzdCBiZSBhIHByaW1pdGl2ZSAnICtcbiAgICAgICAgICAgICcobnVtYmVyfGJvb2xlYW58c3RyaW5nKScpO1xuICAgIH1cbiAgICBpZiAoZHR5cGUgPT09ICdzdHJpbmcnICYmIGlzVHlwZWRBcnJheSh2YWx1ZSkgJiZcbiAgICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignV2hlbiBtYWtpbmcgYSBzY2FsYXIgZnJvbSBlbmNvZGVkIHN0cmluZywgJyArXG4gICAgICAgICAgICAndGhlIHZhbHVlIG11c3QgYmUgYFVpbnQ4QXJyYXlgLicpO1xuICAgIH1cbiAgICBjb25zdCBzaGFwZSA9IFtdO1xuICAgIGNvbnN0IGluZmVycmVkU2hhcGUgPSBbXTtcbiAgICByZXR1cm4gbWFrZVRlbnNvcih2YWx1ZSwgc2hhcGUsIGluZmVycmVkU2hhcGUsIGR0eXBlKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNjYWxhci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgU2NhdHRlck5kIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCAqIGFzIHNjYXR0ZXJfbmRfdXRpbCBmcm9tICcuL3NjYXR0ZXJfbmRfdXRpbCc7XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdGVuc29yIGJ5IGFwcGx5aW5nIHNwYXJzZSB1cGRhdGVzIHRvIGluZGl2aWR1YWxcbiAqIHZhbHVlcyBvciBzbGljZXMgd2l0aGluIGEgemVybyB0ZW5zb3Igb2YgdGhlIGdpdmVuIHNoYXBlIHRlbnNvciBhY2NvcmRpbmcgdG9cbiAqIGluZGljZXMuIFRoaXMgb3BlcmF0b3IgaXMgdGhlIGludmVyc2Ugb2YgdGhlIGB0Zi5nYXRoZXJORGAgb3BlcmF0b3Igd2hpY2hcbiAqIGV4dHJhY3RzIHZhbHVlcyBvciBzbGljZXMgZnJvbSBhIGdpdmVuIHRlbnNvci5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgaW5kaWNlcyA9IHRmLnRlbnNvcjJkKFs0LCAzLCAxLCA3XSwgWzQsIDFdLCAnaW50MzInKTtcbiAqIGNvbnN0IHVwZGF0ZXMgPSB0Zi50ZW5zb3IxZChbOSwgMTAsIDExLCAxMl0pO1xuICogY29uc3Qgc2hhcGUgPSBbOF07XG4gKiB0Zi5zY2F0dGVyTkQoaW5kaWNlcywgdXBkYXRlcywgc2hhcGUpLnByaW50KCkgLy9bMCwgMTEsIDAsIDEwLCA5LCAwLCAwLCAxMl1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBpbmRpY2VzIFRoZSB0ZW5zb3IgY29udGFpbnMgdGhlIGluZGljZXMgaW50byB0aGUgb3V0cHV0IHRlbnNvci5cbiAqIEBwYXJhbSB1cGRhdGVzIFRoZSB0ZW5zb3IgY29udGFpbnMgdGhlIHZhbHVlIGZvciB0aGUgaW5kaWNlcy5cbiAqIEBwYXJhbSBzaGFwZTogVGhlIHNoYXBlIG9mIHRoZSBvdXRwdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1NsaWNpbmcgYW5kIEpvaW5pbmcnfVxuICovXG5mdW5jdGlvbiBzY2F0dGVyTkRfKGluZGljZXMsIHVwZGF0ZXMsIHNoYXBlKSB7XG4gICAgY29uc3QgJGluZGljZXMgPSBjb252ZXJ0VG9UZW5zb3IoaW5kaWNlcywgJ2luZGljZXMnLCAnc2NhdHRlck5EJywgJ2ludDMyJyk7XG4gICAgY29uc3QgJHVwZGF0ZXMgPSBjb252ZXJ0VG9UZW5zb3IodXBkYXRlcywgJ3VwZGF0ZXMnLCAnc2NhdHRlck5EJyk7XG4gICAgc2NhdHRlcl9uZF91dGlsLnZhbGlkYXRlSW5wdXQoJHVwZGF0ZXMsICRpbmRpY2VzLCBzaGFwZSk7XG4gICAgY29uc3QgaW5wdXRzID0geyBpbmRpY2VzOiAkaW5kaWNlcywgdXBkYXRlczogJHVwZGF0ZXMgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgc2hhcGUgfTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoU2NhdHRlck5kLCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBzY2F0dGVyTkQgPSBvcCh7IHNjYXR0ZXJORF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zY2F0dGVyX25kLmpzLm1hcCIsImltcG9ydCB7IGNvbXB1dGVTdHJpZGVzLCBzaXplRnJvbVNoYXBlIH0gZnJvbSAnLi4vdXRpbCc7XG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdXBkYXRlcy5zaGFwZSA9IGluZGljZXMuc2hhcGVbOmJhdGNoRGltXSArXG4gKiBzaGFwZVtzbGljZURpbTpdXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlVXBkYXRlU2hhcGUoc2hhcGUsIGluZGljZXMsIHVwZGF0ZXMpIHtcbiAgICBjb25zdCBzbGljZURpbSA9IChpbmRpY2VzLnJhbmsgPiAxKSA/IGluZGljZXMuc2hhcGVbaW5kaWNlcy5yYW5rIC0gMV0gOiAxO1xuICAgIGNvbnN0IGJhdGNoRGltID0gKGluZGljZXMucmFuayA+IDEpID8gaW5kaWNlcy5yYW5rIC0gMSA6IDE7XG4gICAgY29uc3Qgc2hhcGVFcnJvciA9ICdNdXN0IGhhdmUgdXBkYXRlcy5zaGFwZSA9IGluZGljZXMuc2hhcGVbOmJhdGNoRGltXSArICcgK1xuICAgICAgICBgc2hhcGVbc2xpY2VEaW06XSwgZ290IHVwZGF0ZXMuc2hhcGU6ICR7dXBkYXRlcy5zaGFwZX1gICtcbiAgICAgICAgYCwgaW5kaWNlcy5zaGFwZTogJHtpbmRpY2VzLnNoYXBlfSwgc2hhcGU6ICR7c2hhcGV9YCArXG4gICAgICAgIGAsIHNsaWNlRGltOiAke3NsaWNlRGltfSwgYW5kIGJhdGNoRGltOiAke2JhdGNoRGltfS5gO1xuICAgIGlmICh1cGRhdGVzLnJhbmsgPCBiYXRjaERpbSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3Ioc2hhcGVFcnJvciArIGAgdXBkYXRlLnJhbmsgPCAke2JhdGNoRGltfS4gYCk7XG4gICAgfVxuICAgIGlmIChzaGFwZS5sZW5ndGggPCBzbGljZURpbSArICh1cGRhdGVzLnJhbmsgLSBiYXRjaERpbSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHNoYXBlRXJyb3IgK1xuICAgICAgICAgICAgYCBPdXRwdXQgc2hhcGUgbGVuZ3RoIDwgJHtzbGljZURpbSArICh1cGRhdGVzLnJhbmsgLSBiYXRjaERpbSl9YCk7XG4gICAgfVxuICAgIGlmICh1cGRhdGVzLnJhbmsgIT09IGJhdGNoRGltICsgc2hhcGUubGVuZ3RoIC0gc2xpY2VEaW0pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHNoYXBlRXJyb3IgKyBgIHVwZGF0ZS5yYW5rICE9ICR7YmF0Y2hEaW0gKyBzaGFwZS5sZW5ndGggLSBzbGljZURpbX1gKTtcbiAgICB9XG4gICAgZm9yIChsZXQgZCA9IDA7IGQgPCBiYXRjaERpbTsgKytkKSB7XG4gICAgICAgIGlmICh1cGRhdGVzLnNoYXBlW2RdICE9PSBpbmRpY2VzLnNoYXBlW2RdKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3Ioc2hhcGVFcnJvciArXG4gICAgICAgICAgICAgICAgYCB1cGRhdGVzLnNoYXBlWyR7ZH1dICgke3VwZGF0ZXMuc2hhcGVbZF19KSAhPSBpbmRpY2VzLnNoYXBlWyR7ZH1dICgke2luZGljZXMuc2hhcGVbZF19KS5gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCBkID0gMDsgZCA8IHVwZGF0ZXMucmFuayAtIGJhdGNoRGltOyArK2QpIHtcbiAgICAgICAgaWYgKHVwZGF0ZXMuc2hhcGVbZCArIGJhdGNoRGltXSAhPT0gc2hhcGVbZCArIHNsaWNlRGltXSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHNoYXBlRXJyb3IgK1xuICAgICAgICAgICAgICAgIGAgdXBkYXRlcy5zaGFwZVske2QgKyBiYXRjaERpbX1dICgke3VwZGF0ZXMuc2hhcGVbZCArIGJhdGNoRGltXX0pICE9IHNoYXBlWyR7ZCArIGJhdGNoRGltfV0gKCR7c2hhcGVbZCArIGJhdGNoRGltXX0pYCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIFZhbGlkYXRlIHNjYXR0ZXIgbmQgaW5wdXRzLlxuICpcbiAqIEBwYXJhbSB1cGRhdGUgVGhlIHRlbnNvciBjb250YWlucyB0aGUgdXBkYXRlIHZhbHVlcy5cbiAqIEBwYXJhbSBpbmRpY2VzIFRoZSB0ZW5zb3IgY29udGFpbnMgdGhlIGluZGljZXMgZm9yIHRoZSB1cGRhdGUgdmFsdWVzLlxuICogQHBhcmFtIHNoYXBlIFRoZSBzaGFwZSBvZiB0aGUgb3V0cHV0IHRlbnNvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlSW5wdXQodXBkYXRlcywgaW5kaWNlcywgc2hhcGUpIHtcbiAgICBpZiAoaW5kaWNlcy5yYW5rIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RmLnNjYXR0ZXJORCgpIGV4cGVjdHMgdGhlIGluZGljZXMgdG8gYmUgcmFuayAxIG9yIGhpZ2hlciwnICtcbiAgICAgICAgICAgIGAgYnV0IHRoZSByYW5rIHdhcyAke2luZGljZXMucmFua30uYCk7XG4gICAgfVxuICAgIGlmICh1cGRhdGVzLnJhbmsgPCAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGYuc2NhdHRlck5EKCkgZXhwZWN0cyB0aGUgdXBkYXRlcyB0byBiZSByYW5rIDEgb3IgaGlnaGVyLCcgK1xuICAgICAgICAgICAgYCBidXQgdGhlIHJhbmsgd2FzICR7dXBkYXRlcy5yYW5rfS5gKTtcbiAgICB9XG4gICAgaWYgKGluZGljZXMuZHR5cGUgIT09ICdpbnQzMicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgZHR5cGUgb2YgJ2luZGljZXMnIHNob3VsZCBiZSBpbnQzMiwgYnV0IGdvdCBkdHlwZTogJHtpbmRpY2VzLmR0eXBlfWApO1xuICAgIH1cbiAgICBpZiAoc2hhcGUubGVuZ3RoIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE91dHB1dCByYW5rIG11c3QgYmUgZ3JlYXRlciBvciBlcXVhbCB0byAxLCBidXQgZ290IHNoYXBlOiAke3NoYXBlfWApO1xuICAgIH1cbiAgICBpZiAoc2hhcGUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGlmIChpbmRpY2VzLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW5kaWNlcyBzcGVjaWZpZWQgZm9yIGVtcHR5IG91dHB1dC4gaW5kaWNlcyBzaGFwZTogJHtpbmRpY2VzLnNoYXBlfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVzLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVXBkYXRlcyBzcGVjaWZpZWQgZm9yIGVtcHR5IG91dHB1dC4gdXBkYXRlcyBzaGFwZTogJHt1cGRhdGVzLnNoYXBlfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhbGlkYXRlVXBkYXRlU2hhcGUoc2hhcGUsIGluZGljZXMsIHVwZGF0ZXMpO1xufVxuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIHNoYXBlIGluZm9ybWF0aW9uIGZvciB0aGUgb3V0cHV0LlxuICpcbiAqIEBwYXJhbSB1cGRhdGUgVGhlIHRlbnNvciBjb250YWlucyB0aGUgdXBkYXRlIHZhbHVlcy5cbiAqIEBwYXJhbSBpbmRpY2VzIFRoZSB0ZW5zb3IgY29udGFpbnMgdGhlIGluZGljZXMgZm9yIHRoZSB1cGRhdGUgdmFsdWVzLlxuICogQHBhcmFtIHNoYXBlIFRoZSBzaGFwZSBvZiB0aGUgb3V0cHV0IHRlbnNvci5cbiAqXG4gKiBAcmV0dXJucyBTY2F0dGVyU2hhcGVJbmZvXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVTaGFwZXModXBkYXRlcywgaW5kaWNlcywgc2hhcGUpIHtcbiAgICAvLyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIGluIGluZGljZXNcbiAgICBjb25zdCBpbmRpY2VzUmFuayA9IGluZGljZXMuc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IHNsaWNlUmFuayA9IChpbmRpY2VzUmFuayA+IDEpID8gaW5kaWNlcy5zaGFwZVtpbmRpY2VzUmFuayAtIDFdIDogMTtcbiAgICAvLyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBlbGVtZW50cyB0aGF0IG1ha2UgdXAgZWFjaCBzbGljZSBvZiBvdXIgdXBkYXRlZFxuICAgIC8vIHRlbnNvci4gVGhpcyBhbGxvd3MgdXMgdG8gd29yayB3aXRoIGZsYXR0ZW5lZCB0ZW5zb3JzIGFuZCBjb3B5IG92ZXIgd2hvbGVcbiAgICAvLyBzbGljZXMgYXQgYSB0aW1lLlxuICAgIGNvbnN0IHRvdGFsTmQgPSBzaGFwZS5sZW5ndGg7XG4gICAgbGV0IHNsaWNlU2l6ZSA9IDE7XG4gICAgZm9yIChsZXQgaSA9IHNsaWNlUmFuazsgaSA8IHRvdGFsTmQ7ICsraSkge1xuICAgICAgICBzbGljZVNpemUgKj0gc2hhcGVbaV07XG4gICAgfVxuICAgIGNvbnN0IHNhZmVTbGljZURpbSA9IChzbGljZVJhbmsgPCAxKSA/IDEgOiBzbGljZVJhbms7XG4gICAgY29uc3QgbnVtVXBkYXRlcyA9IHNpemVGcm9tU2hhcGUoaW5kaWNlcy5zaGFwZSkgLyBzYWZlU2xpY2VEaW07XG4gICAgY29uc3Qgc3RyaWRlcyA9IFsuLi5jb21wdXRlU3RyaWRlcyhzaGFwZS5zbGljZSgwLCBzbGljZVJhbmspKSwgMV07XG4gICAgY29uc3Qgb3V0cHV0U2l6ZSA9IHNpemVGcm9tU2hhcGUoc2hhcGUpO1xuICAgIHJldHVybiB7IHNsaWNlUmFuaywgbnVtVXBkYXRlcywgc2xpY2VTaXplLCBzdHJpZGVzLCBvdXRwdXRTaXplIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zY2F0dGVyX25kX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgbmVhcmVzdERpdmlzb3IgfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IFBBUkFMTEVMSVpFX1RIUkVTSE9MRCB9IGZyb20gJy4vcmVkdWNlX3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIHNlZ09wQ29tcHV0ZU9wdGltYWxXaW5kb3dTaXplKGluU2l6ZSwgbnVtU2VnbWVudHMpIHtcbiAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgIGxldCByZXM7XG4gICAgaWYgKGluU2l6ZSA8PSBQQVJBTExFTElaRV9USFJFU0hPTEQpIHtcbiAgICAgICAgcmVzID0gaW5TaXplO1xuICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlcyA9IG5lYXJlc3REaXZpc29yKGluU2l6ZSwgTWF0aC5mbG9vcihNYXRoLnNxcnQoaW5TaXplKSkpO1xuICAgIH1cbiAgICB3aGlsZSAoIWRvbmUpIHtcbiAgICAgICAgaWYgKHJlcyA+IG51bVNlZ21lbnRzIHx8IHJlcyA9PT0gaW5TaXplKSB7XG4gICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlcyA9IG5lYXJlc3REaXZpc29yKGluU2l6ZSwgcmVzICsgMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlT3V0U2hhcGUoYVNoYXBlLCBheGlzLCBudW1TZWdtZW50cykge1xuICAgIGNvbnN0IG91dFNoYXBlID0gW107XG4gICAgY29uc3QgcmFuayA9IGFTaGFwZS5sZW5ndGg7XG4gICAgZm9yIChsZXQgZGltID0gMDsgZGltIDwgcmFuazsgZGltKyspIHtcbiAgICAgICAgaWYgKGRpbSAhPT0gYXhpcykge1xuICAgICAgICAgICAgb3V0U2hhcGUucHVzaChhU2hhcGVbZGltXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvdXRTaGFwZS5wdXNoKG51bVNlZ21lbnRzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0U2hhcGU7XG59XG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdEdhdGhlck9wU2hhcGVJbmZvKHgsIGluZGljZXMsIGF4aXMsIGJhdGNoRGltcykge1xuICAgIGNvbnN0IGluZGljZXNSYW5rID0gaW5kaWNlcy5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcbiAgICBpZiAoYmF0Y2hEaW1zICE9PSAwKSB7XG4gICAgICAgIGlmIChiYXRjaERpbXMgPCAtaW5kaWNlc1JhbmsgfHwgYmF0Y2hEaW1zID4gaW5kaWNlc1JhbmspIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0IGJhdGNoRGltcyBpbiB0aGUgcmFuZ2Ugb2YgWy0ke2luZGljZXNSYW5rfSwgJHtpbmRpY2VzUmFua31dLCBidXQgZ290ICR7YmF0Y2hEaW1zfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChiYXRjaERpbXMgPCAwKSB7XG4gICAgICAgIGJhdGNoRGltcyArPSBpbmRpY2VzUmFuaztcbiAgICB9XG4gICAgaWYgKGJhdGNoRGltcyA+IHhSYW5rKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgYmF0Y2hEaW1zICgke2JhdGNoRGltc30pIG11c3QgYmUgbGVzcyB0aGFuIHJhbmsoeCkgKFxuICAgICR7eFJhbmt9KS5gKTtcbiAgICB9XG4gICAgaWYgKGF4aXMgPCBiYXRjaERpbXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBiYXRjaERpbXMgKCR7YmF0Y2hEaW1zfSkgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYXhpcyAoJHtheGlzfSkuYCk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmF0Y2hEaW1zOyArK2kpIHtcbiAgICAgICAgaWYgKHguc2hhcGVbaV0gIT09IGluZGljZXMuc2hhcGVbaV0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgeC5zaGFwZVske2l9XTogJHt4LnNoYXBlW2ldfSBzaG91bGQgYmUgZXF1YWwgdG8gaW5kaWNlcy5zaGFwZVske2l9XTogJHtpbmRpY2VzLnNoYXBlW2ldfS5gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBkaW1TaXplID0geC5zaGFwZVtheGlzXTtcbiAgICBjb25zdCBvdXRwdXRTaGFwZSA9IFtdO1xuICAgIGxldCBiYXRjaFNpemUgPSAxO1xuICAgIGxldCBvdXRlclNpemUgPSAxO1xuICAgIGxldCBzbGljZVNpemUgPSAxO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmF0Y2hEaW1zOyArK2kpIHtcbiAgICAgICAgb3V0cHV0U2hhcGUucHVzaCh4LnNoYXBlW2ldKTtcbiAgICAgICAgYmF0Y2hTaXplICo9IHguc2hhcGVbaV07XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSBiYXRjaERpbXM7IGkgPCBheGlzOyBpKyspIHtcbiAgICAgICAgb3V0cHV0U2hhcGUucHVzaCh4LnNoYXBlW2ldKTtcbiAgICAgICAgb3V0ZXJTaXplICo9IHguc2hhcGVbaV07XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSBiYXRjaERpbXM7IGkgPCBpbmRpY2VzUmFuazsgaSsrKSB7XG4gICAgICAgIG91dHB1dFNoYXBlLnB1c2goaW5kaWNlcy5zaGFwZVtpXSk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSBheGlzICsgMTsgaSA8IHhSYW5rOyBpKyspIHtcbiAgICAgICAgb3V0cHV0U2hhcGUucHVzaCh4LnNoYXBlW2ldKTtcbiAgICAgICAgc2xpY2VTaXplICo9IHguc2hhcGVbaV07XG4gICAgfVxuICAgIHJldHVybiB7IGJhdGNoU2l6ZSwgc2xpY2VTaXplLCBvdXRlclNpemUsIGRpbVNpemUsIG91dHB1dFNoYXBlIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zZWdtZW50X3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFNlbHUgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBzY2FsZWQgZXhwb25lbnRpYWwgbGluZWFyIGVsZW1lbnQtd2lzZS5cbiAqXG4gKiBgeCA8IDAgPyBzY2FsZSAqIGFscGhhICogKGV4cCh4KSAtIDEpIDogeGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFstMSwgMiwgLTMsIDRdKTtcbiAqXG4gKiB4LnNlbHUoKS5wcmludCgpOyAgLy8gb3IgdGYuc2VsdSh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBzZWx1Xyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc2VsdScpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChTZWx1LCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IHNlbHUgPSBvcCh7IHNlbHVfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2VsdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5leHBvcnQgY29uc3QgU0VMVV9TQ0FMRUFMUEhBID0gMS43NTgwOTkzNDA4NDczNzY4NTk5NDAyMTc1MjA4MTIzO1xuZXhwb3J0IGNvbnN0IFNFTFVfU0NBTEUgPSAxLjA1MDcwMDk4NzM1NTQ4MDQ5MzQxOTMzNDk4NTI5NDY7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zZWx1X3V0aWwuanMubWFwIiwiaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBjb252MmQgfSBmcm9tICcuL2NvbnYyZCc7XG5pbXBvcnQgeyBkZXB0aHdpc2VDb252MmQgfSBmcm9tICcuL2RlcHRod2lzZV9jb252MmQnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbi8qKlxuICogMi1EIGNvbnZvbHV0aW9uIHdpdGggc2VwYXJhYmxlIGZpbHRlcnMuXG4gKlxuICogUGVyZm9ybXMgYSBkZXB0aHdpc2UgY29udm9sdXRpb24gdGhhdCBhY3RzIHNlcGFyYXRlbHkgb24gY2hhbm5lbHMgZm9sbG93ZWRcbiAqIGJ5IGEgcG9pbnR3aXNlIGNvbnZvbHV0aW9uIHRoYXQgbWl4ZXMgY2hhbm5lbHMuIE5vdGUgdGhhdCB0aGlzIGlzXG4gKiBzZXBhcmFiaWxpdHkgYmV0d2VlbiBkaW1lbnNpb25zIFsxLCAyXSBhbmQgMywgbm90IHNwYXRpYWwgc2VwYXJhYmlsaXR5XG4gKiBiZXR3ZWVuIGRpbWVuc2lvbnMgMSBhbmQgMi5cbiAqXG4gKiBTZWVcbiAqIFtodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vc2VwYXJhYmxlX2NvbnYyZF0oXG4gKiAgICAgaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL3NlcGFyYWJsZV9jb252MmQpXG4gKiBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IsIG9mIHJhbmsgNCBvciByYW5rIDMsIG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgaW5DaGFubmVsc11gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXNcbiAqIGFzc3VtZWQuXG4gKiBAcGFyYW0gZGVwdGh3aXNlRmlsdGVyIFRoZSBkZXB0aHdpc2UgZmlsdGVyIHRlbnNvciwgcmFuayA0LCBvZiBzaGFwZVxuICogICAgIGBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5DaGFubmVscywgY2hhbm5lbE11bHRpcGxpZXJdYC4gVGhpcyBpc1xuICogICAgIHRoZSBmaWx0ZXIgdXNlZCBpbiB0aGUgZmlyc3Qgc3RlcC5cbiAqIEBwYXJhbSBwb2ludHdpc2VGaWx0ZXIgVGhlIHBvaW50d2lzZSBmaWx0ZXIgdGVuc29yLCByYW5rIDQsIG9mIHNoYXBlXG4gKiAgICAgYFsxLCAxLCBpbkNoYW5uZWxzICogY2hhbm5lbE11bHRpcGxpZXIsIG91dENoYW5uZWxzXWAuIFRoaXMgaXNcbiAqICAgICB0aGUgZmlsdGVyIHVzZWQgaW4gdGhlIHNlY29uZCBzdGVwLlxuICogQHBhcmFtIHN0cmlkZXMgVGhlIHN0cmlkZXMgb2YgdGhlIGNvbnZvbHV0aW9uOiBgW3N0cmlkZUhlaWdodCxcbiAqIHN0cmlkZVdpZHRoXWAuIElmIHN0cmlkZXMgaXMgYSBzaW5nbGUgbnVtYmVyLCB0aGVuIGBzdHJpZGVIZWlnaHQgPT1cbiAqIHN0cmlkZVdpZHRoYC5cbiAqIEBwYXJhbSBwYWQgVGhlIHR5cGUgb2YgcGFkZGluZyBhbGdvcml0aG0uXG4gKiAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgLSBgdmFsaWRgOiBvdXRwdXQgd2lsbCBiZSBzbWFsbGVyIHRoYW4gaW5wdXQgaWYgZmlsdGVyIGlzIGxhcmdlclxuICogICAgICAgdGhhbiAxeDEuXG4gKiAgIC0gRm9yIG1vcmUgaW5mbywgc2VlIHRoaXMgZ3VpZGU6XG4gKiAgICAgW2h0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbl0oXG4gKiAgICAgICAgICBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb24pXG4gKiBAcGFyYW0gZGlsYXRpb25zIFRoZSBkaWxhdGlvbiByYXRlczogYFtkaWxhdGlvbkhlaWdodCwgZGlsYXRpb25XaWR0aF1gXG4gKiAgICAgaW4gd2hpY2ggd2Ugc2FtcGxlIGlucHV0IHZhbHVlcyBhY3Jvc3MgdGhlIGhlaWdodCBhbmQgd2lkdGggZGltZW5zaW9uc1xuICogICAgIGluIGF0cm91cyBjb252b2x1dGlvbi4gRGVmYXVsdHMgdG8gYFsxLCAxXWAuIElmIGByYXRlYCBpcyBhIHNpbmdsZVxuICogICAgIG51bWJlciwgdGhlbiBgZGlsYXRpb25IZWlnaHQgPT0gZGlsYXRpb25XaWR0aGAuIElmIGl0IGlzIGdyZWF0ZXIgdGhhblxuICogICAgIDEsIHRoZW4gYWxsIHZhbHVlcyBvZiBgc3RyaWRlc2AgbXVzdCBiZSAxLlxuICogQHBhcmFtIGRhdGFGb3JtYXQ6IEFuIG9wdGlvbmFsIHN0cmluZyBmcm9tOiBcIk5IV0NcIiwgXCJOQ0hXXCIuIERlZmF1bHRzIHRvXG4gKiAgICAgXCJOSFdDXCIuIFNwZWNpZnkgdGhlIGRhdGEgZm9ybWF0IG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEuIFdpdGggdGhlXG4gKiAgICAgZGVmYXVsdCBmb3JtYXQgXCJOSFdDXCIsIHRoZSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgb3JkZXIgb2Y6IFtiYXRjaCxcbiAqICAgICBoZWlnaHQsIHdpZHRoLCBjaGFubmVsc10uIE9ubHkgXCJOSFdDXCIgaXMgY3VycmVudGx5IHN1cHBvcnRlZC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdDb252b2x1dGlvbid9XG4gKi9cbmZ1bmN0aW9uIHNlcGFyYWJsZUNvbnYyZF8oeCwgZGVwdGh3aXNlRmlsdGVyLCBwb2ludHdpc2VGaWx0ZXIsIHN0cmlkZXMsIHBhZCwgZGlsYXRpb24gPSBbMSwgMV0sIGRhdGFGb3JtYXQgPSAnTkhXQycpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzZXBhcmFibGVDb252MmQnKTtcbiAgICBjb25zdCAkZGVwdGh3aXNlRmlsdGVyID0gY29udmVydFRvVGVuc29yKGRlcHRod2lzZUZpbHRlciwgJ2RlcHRod2lzZUZpbHRlcicsICdzZXBhcmFibGVDb252MmQnKTtcbiAgICBjb25zdCAkcG9pbnR3aXNlRmlsdGVyID0gY29udmVydFRvVGVuc29yKHBvaW50d2lzZUZpbHRlciwgJ3BvaW50d2lzZUZpbHRlcicsICdzZXBhcmFibGVDb252MmQnKTtcbiAgICBsZXQgeDREID0gJHg7XG4gICAgbGV0IHJlc2hhcGVkVG80RCA9IGZhbHNlO1xuICAgIGlmICgkeC5yYW5rID09PSAzKSB7XG4gICAgICAgIHJlc2hhcGVkVG80RCA9IHRydWU7XG4gICAgICAgIHg0RCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV0sICR4LnNoYXBlWzJdXSk7XG4gICAgfVxuICAgIGlmIChkYXRhRm9ybWF0ID09PSAnTkNIVycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzZXBhcmFibGVDb252MmQgY3VycmVudGx5IGRvZXMgbm90IHN1cHBvcnQgZGF0YUZvcm1hdCBOQ0hXOyBvbmx5ICcgK1xuICAgICAgICAgICAgJ05IV0MgaXMgc3VwcG9ydGVkJyk7XG4gICAgfVxuICAgIHV0aWwuYXNzZXJ0KHg0RC5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gc2VwYXJhYmxlQ29udjJkOiBpbnB1dCBtdXN0IGJlIHJhbmsgNCwgYnV0IGdvdCBgICtcbiAgICAgICAgYHJhbmsgJHt4NEQucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoJGRlcHRod2lzZUZpbHRlci5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gc2VwYXJhYmxlQ29udjJkOiBkZXB0aHdpc2UgZmlsdGVyIG11c3QgYmUgcmFuayA0LCBidXQgYCArXG4gICAgICAgIGBnb3QgcmFuayAkeyRkZXB0aHdpc2VGaWx0ZXIucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoJHBvaW50d2lzZUZpbHRlci5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gc2VwYXJhYmxlQ29udjJkOiBwb2ludHdpc2UgZmlsdGVyIG11c3QgYmUgcmFuayA0LCBidXQgYCArXG4gICAgICAgIGBnb3QgcmFuayAkeyRkZXB0aHdpc2VGaWx0ZXIucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoJHBvaW50d2lzZUZpbHRlci5zaGFwZVswXSA9PT0gMSwgKCkgPT4gYEVycm9yIGluIHNlcGFyYWJsZUNvbnYyZDogdGhlIGZpcnN0IGRpbWVuc2lvbiBvZiBwb2ludHdpc2UgZmlsdGVyIGAgK1xuICAgICAgICBgIG11c3QgYmUgMSwgYnV0IGdvdCAkeyRwb2ludHdpc2VGaWx0ZXIuc2hhcGVbMF19LmApO1xuICAgIHV0aWwuYXNzZXJ0KCRwb2ludHdpc2VGaWx0ZXIuc2hhcGVbMV0gPT09IDEsICgpID0+IGBFcnJvciBpbiBzZXBhcmFibGVDb252MmQ6IHRoZSBzZWNvbmQgZGltZW5zaW9uIG9mIHBvaW50d2lzZSBgICtcbiAgICAgICAgYGZpbHRlciBtdXN0IGJlIDEsIGJ1dCBnb3QgJHskcG9pbnR3aXNlRmlsdGVyLnNoYXBlWzFdfS5gKTtcbiAgICBjb25zdCBpbkNoYW5uZWxzID0gJGRlcHRod2lzZUZpbHRlci5zaGFwZVsyXTtcbiAgICBjb25zdCBjaGFubmVsTXVsdGlwbGllciA9ICRkZXB0aHdpc2VGaWx0ZXIuc2hhcGVbM107XG4gICAgdXRpbC5hc3NlcnQoJHBvaW50d2lzZUZpbHRlci5zaGFwZVsyXSA9PT0gaW5DaGFubmVscyAqIGNoYW5uZWxNdWx0aXBsaWVyLCAoKSA9PiBgRXJyb3IgaW4gc2VwYXJhYmxlQ29udjJkOiB0aGUgdGhpcmQgZGltZW5zaW9uIG9mIHBvaW50d2lzZSBmaWx0ZXIgYCArXG4gICAgICAgIGBtdXN0IGJlICR7aW5DaGFubmVscyAqIGNoYW5uZWxNdWx0aXBsaWVyfSwgYCArXG4gICAgICAgIGBidXQgZ290ICR7JHBvaW50d2lzZUZpbHRlci5zaGFwZVsyXX0uYCk7XG4gICAgY29uc3QgZGVwdGh3aXNlID0gZGVwdGh3aXNlQ29udjJkKHg0RCwgJGRlcHRod2lzZUZpbHRlciwgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0LCBkaWxhdGlvbik7XG4gICAgY29uc3QgcG9pbnR3aXNlU3RyaWRlID0gMTtcbiAgICBjb25zdCByZXMgPSBjb252MmQoZGVwdGh3aXNlLCAkcG9pbnR3aXNlRmlsdGVyLCBwb2ludHdpc2VTdHJpZGUsICd2YWxpZCcsIGRhdGFGb3JtYXQpO1xuICAgIGlmIChyZXNoYXBlZFRvNEQpIHtcbiAgICAgICAgcmV0dXJuIHJlc2hhcGUocmVzLCBbcmVzLnNoYXBlWzFdLCByZXMuc2hhcGVbMl0sIHJlcy5zaGFwZVszXV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IHNlcGFyYWJsZUNvbnYyZCA9IG9wKHsgc2VwYXJhYmxlQ29udjJkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlcGFyYWJsZV9jb252MmQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgVGVuc29yQnVmZmVyIH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBsaXN0cyBvZiBudW1iZXJzLlxuICpcbiAqIEdpdmVuIGEgVGVuc29yIGB4YCBhbmQgYSBUZW5zb3IgYHlgLCB0aGlzIG9wZXJhdGlvbiByZXR1cm5zIGEgVGVuc29yIGBvdXRgXG4gKiB0aGF0IHJlcHJlc2VudHMgYWxsIHZhbHVlcyB0aGF0IGFyZSBpbiBgeGAgYnV0IG5vdCBpbiBgeWAuIFRoZSByZXR1cm5lZFxuICogVGVuc29yIGBvdXRgIGlzIHNvcnRlZCBpbiB0aGUgc2FtZSBvcmRlciB0aGF0IHRoZSBudW1iZXJzIGFwcGVhciBpbiBgeGBcbiAqIChkdXBsaWNhdGVzIGFyZSBwcmVzZXJ2ZWQpLiBUaGlzIG9wZXJhdGlvbiBhbHNvIHJldHVybnMgYSBUZW5zb3IgaW5kaWNlcyB0aGF0XG4gKiByZXByZXNlbnRzIHRoZSBwb3NpdGlvbiBvZiBlYWNoIG91dCBlbGVtZW50IGluIGB4YC4gSW4gb3RoZXIgd29yZHM6XG4gKlxuICogYG91dFtpXSA9IHhbaWR4W2ldXSBmb3IgaSBpbiBbMCwgMSwgLi4uLCBvdXQubGVuZ3RoIC0gMV1gXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSBbMSwgMiwgMywgNCwgNSwgNl07XG4gKiBjb25zdCB5ID0gWzEsIDMsIDVdO1xuICpcbiAqIGNvbnN0IFtvdXQsIGluZGljZXNdID0gYXdhaXQgdGYuc2V0ZGlmZjFkQXN5bmMoeCwgeSk7XG4gKiBvdXQucHJpbnQoKTsgLy8gWzIsIDQsIDZdXG4gKiBpbmRpY2VzLnByaW50KCk7IC8vIFsxLCAzLCA1XVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggMS1EIFRlbnNvci4gVmFsdWVzIHRvIGtlZXAuXG4gKiBAcGFyYW0geSAxLUQgVGVuc29yLiBNdXN0IGhhdmUgdGhlIHNhbWUgdHlwZSBhcyB4LiBWYWx1ZXMgdG8gZXhjbHVkZSBpbiB0aGVcbiAqICAgICBvdXRwdXQuXG4gKiBAcmV0dXJucyBQcm9taXNlIG9mIFRlbnNvciB0dXBsZSBbb3V0LCBpbmRpY2VzXS5cbiAqICBvdXQ6IFRlbnNvciB3aXRoIHRoZSBzYW1lIHR5cGUgYXMgeC5cbiAqICBpbmRpY2VzOiBBIFRlbnNvciBvZiB0eXBlIGludDMyLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1RyYW5zZm9ybWF0aW9ucyd9XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNldGRpZmYxZEFzeW5jXyh4LCB5KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc2V0ZGlmZjFkJyk7XG4gICAgY29uc3QgJHkgPSBjb252ZXJ0VG9UZW5zb3IoeSwgJ3knLCAnc2V0ZGlmZjFkJyk7XG4gICAgdXRpbC5hc3NlcnQoJHguZHR5cGUgPT09ICR5LmR0eXBlLCAoKSA9PiBgeCBhbmQgeSBzaG91bGQgaGF2ZSB0aGUgc2FtZSBkdHlwZSwgYnV0IGdvdCB4ICgkeyR4LmR0eXBlfSkgYW5kIHkgKCR7JHkuZHR5cGV9KS5gKTtcbiAgICB1dGlsLmFzc2VydCgkeC5yYW5rID09PSAxLCAoKSA9PiBgeCBzaG91bGQgYmUgMUQgdGVuc29yLCBidXQgZ290IHggKCR7JHguc2hhcGV9KS5gKTtcbiAgICB1dGlsLmFzc2VydCgkeS5yYW5rID09PSAxLCAoKSA9PiBgeSBzaG91bGQgYmUgMUQgdGVuc29yLCBidXQgZ290IHkgKCR7JHkuc2hhcGV9KS5gKTtcbiAgICBjb25zdCB4VmFscyA9IGF3YWl0ICR4LmRhdGEoKTtcbiAgICBjb25zdCB5VmFscyA9IGF3YWl0ICR5LmRhdGEoKTtcbiAgICBjb25zdCB5U2V0ID0gbmV3IFNldCh5VmFscyk7XG4gICAgbGV0IG91dHB1dFNpemUgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeFZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCF5U2V0Lmhhcyh4VmFsc1tpXSkpIHtcbiAgICAgICAgICAgIG91dHB1dFNpemUrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBidWZmZXIgPSBuZXcgVGVuc29yQnVmZmVyKFtvdXRwdXRTaXplXSwgJHguZHR5cGUpO1xuICAgIGNvbnN0IGluZGljZXMgPSBuZXcgVGVuc29yQnVmZmVyKFtvdXRwdXRTaXplXSwgJ2ludDMyJyk7XG4gICAgZm9yIChsZXQgaSA9IDAsIHAgPSAwOyBpIDwgeFZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCF5U2V0Lmhhcyh4VmFsc1tpXSkpIHtcbiAgICAgICAgICAgIGJ1ZmZlci52YWx1ZXNbcF0gPSB4VmFsc1tpXTtcbiAgICAgICAgICAgIGluZGljZXMudmFsdWVzW3BdID0gaTtcbiAgICAgICAgICAgIHArKztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW2J1ZmZlci50b1RlbnNvcigpLCBpbmRpY2VzLnRvVGVuc29yKCldO1xufVxuZXhwb3J0IGNvbnN0IHNldGRpZmYxZEFzeW5jID0gc2V0ZGlmZjFkQXN5bmNfO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2V0ZGlmZjFkX2FzeW5jLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBTaWdtb2lkIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgc2lnbW9pZCBlbGVtZW50LXdpc2UsIGAxIC8gKDEgKyBleHAoLXgpKWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFswLCAtMSwgMiwgLTNdKTtcbiAqXG4gKiB4LnNpZ21vaWQoKS5wcmludCgpOyAgLy8gb3IgdGYuc2lnbW9pZCh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBzaWdtb2lkXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc2lnbW9pZCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChTaWdtb2lkLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IHNpZ21vaWQgPSBvcCh7IHNpZ21vaWRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2lnbW9pZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgU2lnbiB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIFJldHVybnMgYW4gZWxlbWVudC13aXNlIGluZGljYXRpb24gb2YgdGhlIHNpZ24gb2YgYSBudW1iZXIuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbLjYsIDEuMSwgLTMuMywgTmFOLCAwXSk7XG4gKlxuICogeC5zaWduKCkucHJpbnQoKTsgIC8vIG9yIHRmLnNpZ24oeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IFRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gc2lnbl8oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3NpZ24nKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoU2lnbiwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBzaWduID0gb3AoeyBzaWduXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNpZ24uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29uY2F0IH0gZnJvbSAnLi4vY29uY2F0JztcbmltcG9ydCB7IGZpbGwgfSBmcm9tICcuLi9maWxsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuLi9yZXNoYXBlJztcbmltcG9ydCB7IHNsaWNlIH0gZnJvbSAnLi4vc2xpY2UnO1xuaW1wb3J0IHsgdGVuc29yMmQgfSBmcm9tICcuLi90ZW5zb3IyZCc7XG4vKipcbiAqIEV4cGFuZHMgaW5wdXQgaW50byBmcmFtZXMgb2YgZnJhbWVMZW5ndGguXG4gKiBTbGlkZXMgYSB3aW5kb3cgc2l6ZSB3aXRoIGZyYW1lU3RlcC5cbiAqXG4gKiBgYGBqc1xuICogdGYuc2lnbmFsLmZyYW1lKFsxLCAyLCAzXSwgMiwgMSkucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIHNpZ25hbCBUaGUgaW5wdXQgdGVuc29yIHRvIGJlIGV4cGFuZGVkXG4gKiBAcGFyYW0gZnJhbWVMZW5ndGggTGVuZ3RoIG9mIGVhY2ggZnJhbWVcbiAqIEBwYXJhbSBmcmFtZVN0ZXAgVGhlIGZyYW1lIGhvcCBzaXplIGluIHNhbXBsZXMuXG4gKiBAcGFyYW0gcGFkRW5kIFdoZXRoZXIgdG8gcGFkIHRoZSBlbmQgb2Ygc2lnbmFsIHdpdGggcGFkVmFsdWUuXG4gKiBAcGFyYW0gcGFkVmFsdWUgQW4gbnVtYmVyIHRvIHVzZSB3aGVyZSB0aGUgaW5wdXQgc2lnbmFsIGRvZXNcbiAqICAgICBub3QgZXhpc3Qgd2hlbiBwYWRFbmQgaXMgVHJ1ZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTaWduYWwnLCBuYW1lc3BhY2U6ICdzaWduYWwnfVxuICovXG5mdW5jdGlvbiBmcmFtZV8oc2lnbmFsLCBmcmFtZUxlbmd0aCwgZnJhbWVTdGVwLCBwYWRFbmQgPSBmYWxzZSwgcGFkVmFsdWUgPSAwKSB7XG4gICAgbGV0IHN0YXJ0ID0gMDtcbiAgICBjb25zdCBvdXRwdXQgPSBbXTtcbiAgICB3aGlsZSAoc3RhcnQgKyBmcmFtZUxlbmd0aCA8PSBzaWduYWwuc2l6ZSkge1xuICAgICAgICBvdXRwdXQucHVzaChzbGljZShzaWduYWwsIHN0YXJ0LCBmcmFtZUxlbmd0aCkpO1xuICAgICAgICBzdGFydCArPSBmcmFtZVN0ZXA7XG4gICAgfVxuICAgIGlmIChwYWRFbmQpIHtcbiAgICAgICAgd2hpbGUgKHN0YXJ0IDwgc2lnbmFsLnNpemUpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhZExlbiA9IChzdGFydCArIGZyYW1lTGVuZ3RoKSAtIHNpZ25hbC5zaXplO1xuICAgICAgICAgICAgY29uc3QgcGFkID0gY29uY2F0KFtcbiAgICAgICAgICAgICAgICBzbGljZShzaWduYWwsIHN0YXJ0LCBmcmFtZUxlbmd0aCAtIHBhZExlbiksIGZpbGwoW3BhZExlbl0sIHBhZFZhbHVlKVxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICBvdXRwdXQucHVzaChwYWQpO1xuICAgICAgICAgICAgc3RhcnQgKz0gZnJhbWVTdGVwO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChvdXRwdXQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0ZW5zb3IyZChbXSwgWzAsIGZyYW1lTGVuZ3RoXSk7XG4gICAgfVxuICAgIHJldHVybiByZXNoYXBlKGNvbmNhdChvdXRwdXQpLCBbb3V0cHV0Lmxlbmd0aCwgZnJhbWVMZW5ndGhdKTtcbn1cbmV4cG9ydCBjb25zdCBmcmFtZSA9IG9wKHsgZnJhbWVfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZnJhbWUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgY29zaW5lV2luZG93IH0gZnJvbSAnLi4vc2lnbmFsX29wc191dGlsJztcbi8qKlxuICogR2VuZXJhdGUgYSBoYW1taW5nIHdpbmRvdy5cbiAqXG4gKiBTZWU6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1dpbmRvd19mdW5jdGlvbiNIYW5uX2FuZF9IYW1taW5nX3dpbmRvd3NcbiAqXG4gKiBgYGBqc1xuICogdGYuc2lnbmFsLmhhbW1pbmdXaW5kb3coMTApLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSBUaGUgbGVuZ3RoIG9mIHdpbmRvd1xuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1NpZ25hbCcsIG5hbWVzcGFjZTogJ3NpZ25hbCd9XG4gKi9cbmZ1bmN0aW9uIGhhbW1pbmdXaW5kb3dfKHdpbmRvd0xlbmd0aCkge1xuICAgIHJldHVybiBjb3NpbmVXaW5kb3cod2luZG93TGVuZ3RoLCAwLjU0LCAwLjQ2KTtcbn1cbmV4cG9ydCBjb25zdCBoYW1taW5nV2luZG93ID0gb3AoeyBoYW1taW5nV2luZG93XyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhhbW1pbmdfd2luZG93LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7IGNvc2luZVdpbmRvdyB9IGZyb20gJy4uL3NpZ25hbF9vcHNfdXRpbCc7XG4vKipcbiAqIEdlbmVyYXRlIGEgSGFubiB3aW5kb3cuXG4gKlxuICogU2VlOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9XaW5kb3dfZnVuY3Rpb24jSGFubl9hbmRfSGFtbWluZ193aW5kb3dzXG4gKlxuICogYGBganNcbiAqIHRmLnNpZ25hbC5oYW5uV2luZG93KDEwKS5wcmludCgpO1xuICogYGBgXG4gKiBAcGFyYW0gVGhlIGxlbmd0aCBvZiB3aW5kb3dcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTaWduYWwnLCBuYW1lc3BhY2U6ICdzaWduYWwnfVxuICovXG5mdW5jdGlvbiBoYW5uV2luZG93Xyh3aW5kb3dMZW5ndGgpIHtcbiAgICByZXR1cm4gY29zaW5lV2luZG93KHdpbmRvd0xlbmd0aCwgMC41LCAwLjUpO1xufVxuZXhwb3J0IGNvbnN0IGhhbm5XaW5kb3cgPSBvcCh7IGhhbm5XaW5kb3dfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGFubl93aW5kb3cuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi4vbXVsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7IGVuY2xvc2luZ1Bvd2VyT2ZUd28gfSBmcm9tICcuLi9zaWduYWxfb3BzX3V0aWwnO1xuaW1wb3J0IHsgcmZmdCB9IGZyb20gJy4uL3NwZWN0cmFsL3JmZnQnO1xuaW1wb3J0IHsgZnJhbWUgfSBmcm9tICcuL2ZyYW1lJztcbmltcG9ydCB7IGhhbm5XaW5kb3cgfSBmcm9tICcuL2hhbm5fd2luZG93Jztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIFNob3J0LXRpbWUgRm91cmllciBUcmFuc2Zvcm0gb2Ygc2lnbmFsc1xuICogU2VlOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TaG9ydC10aW1lX0ZvdXJpZXJfdHJhbnNmb3JtXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGlucHV0ID0gdGYudGVuc29yMWQoWzEsIDEsIDEsIDEsIDFdKVxuICogdGYuc2lnbmFsLnN0ZnQoaW5wdXQsIDMsIDEpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSBzaWduYWwgMS1kaW1lbnNpb25hbCByZWFsIHZhbHVlIHRlbnNvci5cbiAqIEBwYXJhbSBmcmFtZUxlbmd0aCBUaGUgd2luZG93IGxlbmd0aCBvZiBzYW1wbGVzLlxuICogQHBhcmFtIGZyYW1lU3RlcCBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gc3RlcC5cbiAqIEBwYXJhbSBmZnRMZW5ndGggVGhlIHNpemUgb2YgdGhlIEZGVCB0byBhcHBseS5cbiAqIEBwYXJhbSB3aW5kb3dGbiBBIGNhbGxhYmxlIHRoYXQgdGFrZXMgYSB3aW5kb3cgbGVuZ3RoIGFuZCByZXR1cm5zIDEtZCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU2lnbmFsJywgbmFtZXNwYWNlOiAnc2lnbmFsJ31cbiAqL1xuZnVuY3Rpb24gc3RmdF8oc2lnbmFsLCBmcmFtZUxlbmd0aCwgZnJhbWVTdGVwLCBmZnRMZW5ndGgsIHdpbmRvd0ZuID0gaGFubldpbmRvdykge1xuICAgIGlmIChmZnRMZW5ndGggPT0gbnVsbCkge1xuICAgICAgICBmZnRMZW5ndGggPSBlbmNsb3NpbmdQb3dlck9mVHdvKGZyYW1lTGVuZ3RoKTtcbiAgICB9XG4gICAgY29uc3QgZnJhbWVkU2lnbmFsID0gZnJhbWUoc2lnbmFsLCBmcmFtZUxlbmd0aCwgZnJhbWVTdGVwKTtcbiAgICBjb25zdCB3aW5kb3dlZFNpZ25hbCA9IG11bChmcmFtZWRTaWduYWwsIHdpbmRvd0ZuKGZyYW1lTGVuZ3RoKSk7XG4gICAgcmV0dXJuIHJmZnQod2luZG93ZWRTaWduYWwsIGZmdExlbmd0aCk7XG59XG5leHBvcnQgY29uc3Qgc3RmdCA9IG9wKHsgc3RmdF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdGZ0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IHRlbnNvcjFkIH0gZnJvbSAnLi90ZW5zb3IxZCc7XG5leHBvcnQgZnVuY3Rpb24gZW5jbG9zaW5nUG93ZXJPZlR3byh2YWx1ZSkge1xuICAgIC8vIFJldHVybiAyKipOIGZvciBpbnRlZ2VyIE4gc3VjaCB0aGF0IDIqKk4gPj0gdmFsdWUuXG4gICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5wb3coMiwgTWF0aC5jZWlsKE1hdGgubG9nKHZhbHVlKSAvIE1hdGgubG9nKDIuMCkpKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gY29zaW5lV2luZG93KHdpbmRvd0xlbmd0aCwgYSwgYikge1xuICAgIGNvbnN0IGV2ZW4gPSAxIC0gd2luZG93TGVuZ3RoICUgMjtcbiAgICBjb25zdCBuZXdWYWx1ZXMgPSBuZXcgRmxvYXQzMkFycmF5KHdpbmRvd0xlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3aW5kb3dMZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBjb3NBcmcgPSAoMi4wICogTWF0aC5QSSAqIGkpIC8gKHdpbmRvd0xlbmd0aCArIGV2ZW4gLSAxKTtcbiAgICAgICAgbmV3VmFsdWVzW2ldID0gYSAtIGIgKiBNYXRoLmNvcyhjb3NBcmcpO1xuICAgIH1cbiAgICByZXR1cm4gdGVuc29yMWQobmV3VmFsdWVzLCAnZmxvYXQzMicpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2lnbmFsX29wc191dGlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBTaW4gfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBzaW4gb2YgdGhlIGlucHV0IFRlbnNvciBlbGVtZW50LXdpc2U6IGBzaW4oeClgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMCwgTWF0aC5QSSAvIDIsIE1hdGguUEkgKiAzIC8gNF0pO1xuICpcbiAqIHguc2luKCkucHJpbnQoKTsgIC8vIG9yIHRmLnNpbih4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBzaW5fKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzaW4nKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoU2luLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IHNpbiA9IG9wKHsgc2luXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNpbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgU2luaCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIGh5cGVyYm9saWMgc2luIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6IGBzaW5oKHgpYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzAsIDEsIC0xLCAuN10pO1xuICpcbiAqIHguc2luaCgpLnByaW50KCk7ICAvLyBvciB0Zi5zaW5oKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIHNpbmhfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzaW5oJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFNpbmgsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3Qgc2luaCA9IG9wKHsgc2luaF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zaW5oLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBTbGljZSB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIEV4dHJhY3RzIGEgc2xpY2UgZnJvbSBhIGB0Zi5UZW5zb3JgIHN0YXJ0aW5nIGF0IGNvb3JkaW5hdGVzIGBiZWdpbmBcbiAqIGFuZCBpcyBvZiBzaXplIGBzaXplYC5cbiAqXG4gKiBBbHNvIGF2YWlsYWJsZSBhcmUgc3RyaWN0ZXIgcmFuay1zcGVjaWZpYyBtZXRob2RzIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlXG4gKiBhcyB0aGlzIG1ldGhvZCB0aGF0IGFzc2VydCB0aGF0IGB4YCBpcyBvZiB0aGUgZ2l2ZW4gcmFuazpcbiAqICAgLSBgdGYuc2xpY2UxZGBcbiAqICAgLSBgdGYuc2xpY2UyZGBcbiAqICAgLSBgdGYuc2xpY2UzZGBcbiAqICAgLSBgdGYuc2xpY2U0ZGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzLCA0XSk7XG4gKlxuICogeC5zbGljZShbMV0sIFsyXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pO1xuICpcbiAqIHguc2xpY2UoWzEsIDBdLCBbMSwgMl0pLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBgdGYuVGVuc29yYCB0byBzbGljZSBmcm9tLlxuICogQHBhcmFtIGJlZ2luIFRoZSBjb29yZGluYXRlcyB0byBzdGFydCB0aGUgc2xpY2UgZnJvbS4gVGhlIGxlbmd0aCBjYW4gYmVcbiAqICAgICBsZXNzIHRoYW4gdGhlIHJhbmsgb2YgeCAtIHRoZSByZXN0IG9mIHRoZSBheGVzIHdpbGwgaGF2ZSBpbXBsaWNpdCAwIGFzXG4gKiAgICAgc3RhcnQuIENhbiBhbHNvIGJlIGEgc2luZ2xlIG51bWJlciwgaW4gd2hpY2ggY2FzZSBpdCBzcGVjaWZpZXMgdGhlXG4gKiAgICAgZmlyc3QgYXhpcy5cbiAqIEBwYXJhbSBzaXplIFRoZSBzaXplIG9mIHRoZSBzbGljZS4gVGhlIGxlbmd0aCBjYW4gYmUgbGVzcyB0aGFuIHRoZSByYW5rIG9mXG4gKiAgICAgeCAtIHRoZSByZXN0IG9mIHRoZSBheGVzIHdpbGwgaGF2ZSBpbXBsaWNpdCAtMS4gQSB2YWx1ZSBvZiAtMSByZXF1ZXN0c1xuICogICAgIHRoZSByZXN0IG9mIHRoZSBkaW1lbnNpb25zIGluIHRoZSBheGlzLiBDYW4gYWxzbyBiZSBhIHNpbmdsZSBudW1iZXIsXG4gKiAgICAgaW4gd2hpY2ggY2FzZSBpdCBzcGVjaWZpZXMgdGhlIHNpemUgb2YgdGhlIGZpcnN0IGF4aXMuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnU2xpY2luZyBhbmQgSm9pbmluZyd9XG4gKi9cbmZ1bmN0aW9uIHNsaWNlXyh4LCBiZWdpbiwgc2l6ZSkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3NsaWNlJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG4gICAgaWYgKCR4LnJhbmsgPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTbGljaW5nIHNjYWxhciBpcyBub3QgcG9zc2libGUnKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBiZWdpbiwgc2l6ZSB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFNsaWNlLCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBzbGljZSA9IG9wKHsgc2xpY2VfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2xpY2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHNsaWNlIH0gZnJvbSAnLi9zbGljZSc7XG4vKipcbiAqIEV4dHJhY3RzIGEgMUQgc2xpY2UgZnJvbSAxRCBhcnJheSBzdGFydGluZyBhdCBjb29yZGluYXRlcyBgYmVnaW5gIGFuZCBpc1xuICogb2YgbGVuZ3RoIGBzaXplYC4gU2VlIGBzbGljZWAgZm9yIGRldGFpbHMuXG4gKi9cbmZ1bmN0aW9uIHNsaWNlMWRfKHgsIGJlZ2luLCBzaXplKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc2xpY2UxZCcpO1xuICAgIHV0aWwuYXNzZXJ0KCR4LnJhbmsgPT09IDEsICgpID0+IGBzbGljZTFkIGV4cGVjdHMgYSByYW5rLTEgdGVuc29yLCBidXQgZ290IGEgcmFuay0keyR4LnJhbmt9IHRlbnNvcmApO1xuICAgIHJldHVybiBzbGljZSgkeCwgW2JlZ2luXSwgW3NpemVdKTtcbn1cbmV4cG9ydCBjb25zdCBzbGljZTFkID0gb3AoeyBzbGljZTFkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNsaWNlMWQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHNsaWNlIH0gZnJvbSAnLi9zbGljZSc7XG4vKipcbiAqIEV4dHJhY3RzIGEgMkQgc2xpY2UgZnJvbSBhIDJEIGFycmF5IHN0YXJ0aW5nIGF0IGNvb3JkaW5hdGVzIGBiZWdpbmAgYW5kXG4gKiBpcyBvZiBzaXplIGBzaXplYC4gU2VlIGBzbGljZWAgZm9yIGRldGFpbHMuXG4gKi9cbmZ1bmN0aW9uIHNsaWNlMmRfKHgsIGJlZ2luLCBzaXplKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc2xpY2UyZCcpO1xuICAgIHV0aWwuYXNzZXJ0KCR4LnJhbmsgPT09IDIsICgpID0+IGBzbGljZTJkIGV4cGVjdHMgYSByYW5rLTIgdGVuc29yLCBidXQgZ290IGEgcmFuay0keyR4LnJhbmt9IHRlbnNvcmApO1xuICAgIHJldHVybiBzbGljZSgkeCwgYmVnaW4sIHNpemUpO1xufVxuZXhwb3J0IGNvbnN0IHNsaWNlMmQgPSBvcCh7IHNsaWNlMmRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2xpY2UyZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgc2xpY2UgfSBmcm9tICcuL3NsaWNlJztcbi8qKlxuICogRXh0cmFjdHMgYSAzRCBzbGljZSBmcm9tIGEgM0QgYXJyYXkgc3RhcnRpbmcgYXQgY29vcmRpbmF0ZXMgYGJlZ2luYCBhbmRcbiAqIGlzIG9mIHNpemUgYHNpemVgLiBTZWUgYHNsaWNlYCBmb3IgZGV0YWlscy5cbiAqL1xuZnVuY3Rpb24gc2xpY2UzZF8oeCwgYmVnaW4sIHNpemUpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzbGljZTNkJyk7XG4gICAgdXRpbC5hc3NlcnQoJHgucmFuayA9PT0gMywgKCkgPT4gYHNsaWNlM2QgZXhwZWN0cyBhIHJhbmstMyB0ZW5zb3IsIGJ1dCBnb3QgYSByYW5rLSR7JHgucmFua30gdGVuc29yYCk7XG4gICAgcmV0dXJuIHNsaWNlKCR4LCBiZWdpbiwgc2l6ZSk7XG59XG5leHBvcnQgY29uc3Qgc2xpY2UzZCA9IG9wKHsgc2xpY2UzZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zbGljZTNkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyBzbGljZSB9IGZyb20gJy4vc2xpY2UnO1xuLyoqXG4gKiBFeHRyYWN0cyBhIDREIHNsaWNlIGZyb20gYSA0RCBhcnJheSBzdGFydGluZyBhdCBjb29yZGluYXRlcyBgYmVnaW5gIGFuZFxuICogaXMgb2Ygc2l6ZSBgc2l6ZWAuIFNlZSBgc2xpY2VgIGZvciBkZXRhaWxzLlxuICovXG5mdW5jdGlvbiBzbGljZTRkXyh4LCBiZWdpbiwgc2l6ZSkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3NsaWNlNGQnKTtcbiAgICB1dGlsLmFzc2VydCgkeC5yYW5rID09PSA0LCAoKSA9PiBgc2xpY2U0ZCBleHBlY3RzIGEgcmFuay00IHRlbnNvciwgYnV0IGdvdCBhIHJhbmstJHskeC5yYW5rfSB0ZW5zb3JgKTtcbiAgICByZXR1cm4gc2xpY2UoJHgsIGJlZ2luLCBzaXplKTtcbn1cbmV4cG9ydCBjb25zdCBzbGljZTRkID0gb3AoeyBzbGljZTRkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNsaWNlNGQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRQYXJhbXNWYWxpZChpbnB1dCwgYmVnaW4sIHNpemUpIHtcbiAgICBjb25zdCBpbnB1dFJhbmsgPSBpbnB1dC5zaGFwZS5sZW5ndGg7XG4gICAgdXRpbC5hc3NlcnQoaW5wdXRSYW5rID09PSBiZWdpbi5sZW5ndGgsICgpID0+IGBFcnJvciBpbiBzbGljZSR7aW5wdXRSYW5rfUQ6IExlbmd0aCBvZiBiZWdpbiAke2JlZ2lufSBtdXN0IGAgK1xuICAgICAgICBgbWF0Y2ggdGhlIHJhbmsgb2YgdGhlIGFycmF5ICgke2lucHV0UmFua30pLmApO1xuICAgIHV0aWwuYXNzZXJ0KGlucHV0UmFuayA9PT0gc2l6ZS5sZW5ndGgsICgpID0+IGBFcnJvciBpbiBzbGljZSR7aW5wdXRSYW5rfUQ6IExlbmd0aCBvZiBzaXplICR7c2l6ZX0gbXVzdCBgICtcbiAgICAgICAgYG1hdGNoIHRoZSByYW5rIG9mIHRoZSBhcnJheSAoJHtpbnB1dFJhbmt9KS5gKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0UmFuazsgKytpKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KGJlZ2luW2ldICsgc2l6ZVtpXSA8PSBpbnB1dC5zaGFwZVtpXSwgKCkgPT4gYEVycm9yIGluIHNsaWNlJHtpbnB1dFJhbmt9RDogYmVnaW5bJHtpfV0gKyBzaXplWyR7aX1dIGAgK1xuICAgICAgICAgICAgYCgke2JlZ2luW2ldICsgc2l6ZVtpXX0pIHdvdWxkIG92ZXJmbG93IGlucHV0LnNoYXBlWyR7aX1dICgke2lucHV0LnNoYXBlW2ldfSlgKTtcbiAgICB9XG59XG4vKiogQ29udmVydHMgYSBiaW5hcnkgbWFzayB0byBhbiBhcnJheSBvZiBheGVzLiBVc2VkIGluIHN0cmlkZWRTbGljZSgpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hc2tUb0F4ZXMobWFzaykge1xuICAgIGNvbnN0IGF4ZXMgPSBbXTtcbiAgICBsZXQgYXhpcyA9IDA7XG4gICAgd2hpbGUgKG1hc2sgPiAwKSB7XG4gICAgICAgIGlmIChtYXNrICYgMSkge1xuICAgICAgICAgICAgYXhlcy5wdXNoKGF4aXMpO1xuICAgICAgICB9XG4gICAgICAgIG1hc2sgLz0gMjtcbiAgICAgICAgYXhpcysrO1xuICAgIH1cbiAgICByZXR1cm4gYXhlcztcbn1cbi8qKiBDb21wdXRlcyB0aGUgb3V0cHV0IHNoYXBlIGdpdmVuIHRoZSBzdHJpZGVkIHNsaWNlIHBhcmFtcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlT3V0U2hhcGUoYmVnaW4sIGVuZCwgc3RyaWRlcykge1xuICAgIGNvbnN0IHNpemUgPSBbXTtcbiAgICBmb3IgKGxldCBheGlzID0gMDsgYXhpcyA8IGJlZ2luLmxlbmd0aDsgYXhpcysrKSB7XG4gICAgICAgIHNpemVbYXhpc10gPSBNYXRoLmNlaWwoKGVuZFtheGlzXSAtIGJlZ2luW2F4aXNdKSAvIHN0cmlkZXNbYXhpc10pO1xuICAgIH1cbiAgICByZXR1cm4gc2l6ZTtcbn1cbi8vIENyZWF0ZXMgZnVsbCBzZWxlY3Rpb24gYXQgdGhlIGVsaWRlZCBkaW1lbnNpb25zLiBJZiB0aGUgZGltZW5zaW9uIG1hdGNoZXNcbi8vIHRoZSBlbGxpcHNpcyBtYXNrLCBvdmVycmlkZSB0aGUgY3VycmVudCBzdHJpZGUgdmFsdWUuIE90aGVyd2lzZSwgaW5zZXJ0LlxuZXhwb3J0IGZ1bmN0aW9uIHN0cmlkZXNXaXRoRWxpZGVkRGltcyhzdHJpZGVzLCBlbGxpcHNpc0luc2VydGlvbkluZGV4LCBudW1FbGlkZWRBeGVzLCBpbnB1dFNoYXBlKSB7XG4gICAgY29uc3QgbmV3U3RyaWRlcyA9IFsuLi5zdHJpZGVzXTtcbiAgICBmb3IgKGxldCBpID0gbmV3U3RyaWRlcy5sZW5ndGg7IGkgPCBpbnB1dFNoYXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG5ld1N0cmlkZXMucHVzaCgxKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1FbGlkZWRBeGVzOyBpKyspIHtcbiAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAgIG5ld1N0cmlkZXNbZWxsaXBzaXNJbnNlcnRpb25JbmRleF0gPSAxO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbmV3U3RyaWRlcy5zcGxpY2UoZWxsaXBzaXNJbnNlcnRpb25JbmRleCwgMCAvKiBudW0gZWxlbWVudHMgdG8gZGVsZXRlICovLCAxIC8qIGVsZW1lbnQgdG8gYWRkICovKTtcbiAgICAgICAgICAgIG5ld1N0cmlkZXMucG9wKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ld1N0cmlkZXM7XG59XG5mdW5jdGlvbiB1bm5vcm1hbGl6ZUF4aXMoZWxsaXBzaXNJbnNlcnRpb25JbmRleCwgbnVtRWxpZGVkQXhlcywgbm9ybWFsaXplZEF4aXMpIHtcbiAgICBpZiAobm9ybWFsaXplZEF4aXMgPD0gZWxsaXBzaXNJbnNlcnRpb25JbmRleCkge1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplZEF4aXM7XG4gICAgfVxuICAgIHJldHVybiBub3JtYWxpemVkQXhpcyAtIChudW1FbGlkZWRBeGVzIC0gMSk7XG59XG5mdW5jdGlvbiBnZXRFbGlkZWRBeGVzKG51bUVsaWRlZEF4ZXMsIGVsbGlwc2lzSW5zZXJ0aW9uSW5kZXgpIHtcbiAgICBjb25zdCBlbGlkZWRBeGVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1FbGlkZWRBeGVzOyBpKyspIHtcbiAgICAgICAgZWxpZGVkQXhlcy5wdXNoKGVsbGlwc2lzSW5zZXJ0aW9uSW5kZXggKyBpKTtcbiAgICB9XG4gICAgcmV0dXJuIGVsaWRlZEF4ZXM7XG59XG4vLyBOb3JtYWxpemUgdGhlIHN0YXJ0LCBlbmQgYW5kIHN0cmlkZXMuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Tm9ybWFsaXplZEF4ZXMoaW5wdXRTaGFwZSwgZWxsaXBzaXNBeGVzLCBudW1JbnRlcnBvbGF0ZWRBeGVzLCBiZWdpbiwgZW5kLCBzdHJpZGVzLCBiZWdpbk1hc2ssIGVuZE1hc2ssIGVsbGlwc2lzTWFzaykge1xuICAgIGNvbnN0IGlucHV0UmFuayA9IGlucHV0U2hhcGUubGVuZ3RoO1xuICAgIGxldCBub3JtYWxpemVkQmVnaW4gPSBuZXcgQXJyYXkoaW5wdXRSYW5rKSwgbm9ybWFsaXplZEVuZCA9IG5ldyBBcnJheShpbnB1dFJhbmspLCBub3JtYWxpemVkU3RyaWRlcyA9IG5ldyBBcnJheShpbnB1dFJhbmspO1xuICAgIGlmIChlbGxpcHNpc0F4ZXMubGVuZ3RoICYmIG51bUludGVycG9sYXRlZEF4ZXMgPiAwKSB7XG4gICAgICAgIGNvbnN0IGZ1bGxJbmRleCA9IGVsbGlwc2lzQXhlc1swXTtcbiAgICAgICAgLy8gVGhlIGVsbGlwc2lzIGFwcGxpZXMgdG8gdGhlIG1hc2tlZCBpbmRleCBhcyB3ZWxsIGFzIGFueSBkaW1lbnNpb25zXG4gICAgICAgIC8vIHRoYXQgYXJlIGludGVycG9sYXRlZC5cbiAgICAgICAgY29uc3QgbnVtRWxpZGVkQXhlcyA9IG51bUludGVycG9sYXRlZEF4ZXMgKyAxO1xuICAgICAgICBub3JtYWxpemVkQmVnaW4gPSBzdGFydEluZGljZXNXaXRoRWxpZGVkRGltcyhiZWdpbk1hc2ssIGZ1bGxJbmRleCwgbnVtRWxpZGVkQXhlcywgYmVnaW4sIGlucHV0U2hhcGUpO1xuICAgICAgICBub3JtYWxpemVkRW5kID0gc3RvcEluZGljZXNXaXRoRWxpZGVkRGltcyhlbmRNYXNrLCBmdWxsSW5kZXgsIG51bUVsaWRlZEF4ZXMsIGVuZCwgaW5wdXRTaGFwZSk7XG4gICAgICAgIG5vcm1hbGl6ZWRTdHJpZGVzID1cbiAgICAgICAgICAgIHN0cmlkZXNXaXRoRWxpZGVkRGltcyhzdHJpZGVzLCBmdWxsSW5kZXgsIG51bUVsaWRlZEF4ZXMsIGlucHV0U2hhcGUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZm9yIChsZXQgYXhpcyA9IDA7IGF4aXMgPCBpbnB1dFJhbms7IGF4aXMrKykge1xuICAgICAgICAgICAgbm9ybWFsaXplZEJlZ2luW2F4aXNdID0gc3RhcnRGb3JBeGlzKGJlZ2luTWFzaywgYmVnaW4sIHN0cmlkZXMsIGlucHV0U2hhcGUsIGF4aXMsIGVsbGlwc2lzTWFzayk7XG4gICAgICAgICAgICBub3JtYWxpemVkRW5kW2F4aXNdID1cbiAgICAgICAgICAgICAgICBzdG9wRm9yQXhpcyhlbmRNYXNrLCBlbmQsIHN0cmlkZXMsIGlucHV0U2hhcGUsIGF4aXMsIGVsbGlwc2lzTWFzayk7XG4gICAgICAgICAgICBub3JtYWxpemVkU3RyaWRlc1theGlzXSA9IHN0cmlkZXNGb3JBeGlzKHN0cmlkZXMsIGF4aXMsIGVsbGlwc2lzTWFzayk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYmVnaW46IG5vcm1hbGl6ZWRCZWdpbixcbiAgICAgICAgZW5kOiBub3JtYWxpemVkRW5kLFxuICAgICAgICBzdHJpZGVzOiBub3JtYWxpemVkU3RyaWRlc1xuICAgIH07XG59XG4vLyBDcmVhdGVzIGZ1bGwgc2VsZWN0aW9uIGF0IHRoZSBlbGlkZWQgZGltZW5zaW9ucy4gSWYgdGhlIGRpbWVuc2lvbiBtYXRjaGVzXG4vLyB0aGUgZWxsaXBzaXMgbWFzaywgb3ZlcnJpZGUgdGhlIGN1cnJlbnQgc3RhcnQgdmFsdWUuIE90aGVyd2lzZSwgaW5zZXJ0LlxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0SW5kaWNlc1dpdGhFbGlkZWREaW1zKGJlZ2luTWFzaywgZWxsaXBzaXNJbnNlcnRpb25JbmRleCwgbnVtRWxpZGVkQXhlcywgb3JpZ2luYWxCZWdpbiwgaW5wdXRTaGFwZSkge1xuICAgIGNvbnN0IG5ld0luZGljZXMgPSBbLi4uaW5wdXRTaGFwZV07XG4gICAgY29uc3QgZWxpZGVkQXhlcyA9IGdldEVsaWRlZEF4ZXMobnVtRWxpZGVkQXhlcywgZWxsaXBzaXNJbnNlcnRpb25JbmRleCk7XG4gICAgZm9yIChsZXQgYXhpcyA9IDA7IGF4aXMgPCBuZXdJbmRpY2VzLmxlbmd0aDsgYXhpcysrKSB7XG4gICAgICAgIGlmIChlbGlkZWRBeGVzLmluZGV4T2YoYXhpcykgPiAtMSkge1xuICAgICAgICAgICAgbmV3SW5kaWNlc1theGlzXSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbEF4aXMgPSB1bm5vcm1hbGl6ZUF4aXMoZWxsaXBzaXNJbnNlcnRpb25JbmRleCwgbnVtRWxpZGVkQXhlcywgYXhpcyk7XG4gICAgICAgICAgICBsZXQgb3JpZ2luYWxWYWx1ZSA9IG9yaWdpbmFsQmVnaW5bb3JpZ2luYWxBeGlzXTtcbiAgICAgICAgICAgIGlmIChiZWdpbk1hc2sgJiAxIDw8IG9yaWdpbmFsQXhpcykge1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsVmFsdWUgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV3SW5kaWNlc1theGlzXSA9IG9yaWdpbmFsVmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ld0luZGljZXM7XG59XG4vLyBDcmVhdGVzIGZ1bGwgc2VsZWN0aW9uIGF0IHRoZSBlbGlkZWQgZGltZW5zaW9ucy4gSWYgdGhlIGRpbWVuc2lvbiBtYXRjaGVzXG4vLyB0aGUgZWxsaXBzaXMgbWFzaywgb3ZlcnJpZGUgdGhlIGN1cnJlbnQgc3RvcCB2YWx1ZS4gT3RoZXJ3aXNlLCBpbnNlcnQuXG5leHBvcnQgZnVuY3Rpb24gc3RvcEluZGljZXNXaXRoRWxpZGVkRGltcyhlbmRNYXNrLCBlbGxpcHNpc0luc2VydGlvbkluZGV4LCBudW1FbGlkZWRBeGVzLCBvcmlnaW5hbEVuZCwgaW5wdXRTaGFwZSkge1xuICAgIGNvbnN0IG5ld0luZGljZXMgPSBbLi4uaW5wdXRTaGFwZV07XG4gICAgY29uc3QgZWxpZGVkQXhlcyA9IGdldEVsaWRlZEF4ZXMobnVtRWxpZGVkQXhlcywgZWxsaXBzaXNJbnNlcnRpb25JbmRleCk7XG4gICAgZm9yIChsZXQgYXhpcyA9IDA7IGF4aXMgPCBuZXdJbmRpY2VzLmxlbmd0aDsgYXhpcysrKSB7XG4gICAgICAgIGlmIChlbGlkZWRBeGVzLmluZGV4T2YoYXhpcykgPiAtMSkge1xuICAgICAgICAgICAgbmV3SW5kaWNlc1theGlzXSA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxBeGlzID0gdW5ub3JtYWxpemVBeGlzKGVsbGlwc2lzSW5zZXJ0aW9uSW5kZXgsIG51bUVsaWRlZEF4ZXMsIGF4aXMpO1xuICAgICAgICAgICAgbGV0IG9yaWdpbmFsVmFsdWUgPSBvcmlnaW5hbEVuZFtvcmlnaW5hbEF4aXNdO1xuICAgICAgICAgICAgaWYgKGVuZE1hc2sgJiAxIDw8IG9yaWdpbmFsQXhpcykge1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsVmFsdWUgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5ld0luZGljZXNbYXhpc10gPSBvcmlnaW5hbFZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3SW5kaWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyBIYW5kbGUgbmVnYXRpdmUgaW5kaWNlc1xuICAgICAgICBjb25zdCBheGlzU2l6ZSA9IGlucHV0U2hhcGVbaV07XG4gICAgICAgIGlmIChuZXdJbmRpY2VzW2ldIDwgMCkge1xuICAgICAgICAgICAgbmV3SW5kaWNlc1tpXSArPSBheGlzU2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBuZXdJbmRpY2VzW2ldID0gdXRpbC5jbGFtcCgwLCBuZXdJbmRpY2VzW2ldLCBpbnB1dFNoYXBlW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld0luZGljZXM7XG59XG5leHBvcnQgZnVuY3Rpb24gc3RyaWRlc0ZvckF4aXMoc3RyaWRlcywgYXhpcywgZWxsaXBzaXNNYXNrKSB7XG4gICAgbGV0IHN0cmlkZSA9IHN0cmlkZXNbYXhpc107XG4gICAgaWYgKGVsbGlwc2lzTWFzayAmICgxIDw8IGF4aXMpIHx8IHN0cmlkZSA9PSBudWxsKSB7XG4gICAgICAgIHN0cmlkZSA9IDE7XG4gICAgfVxuICAgIHJldHVybiBzdHJpZGU7XG59XG5leHBvcnQgZnVuY3Rpb24gc3RhcnRGb3JBeGlzKGJlZ2luTWFzaywgc3RhcnRJbmRpY2VzLCBzdHJpZGVzLCBpbnB1dFNoYXBlLCBheGlzLCBlbGxpcHNpc01hc2spIHtcbiAgICAvLyBCZWdpbiB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXhcbiAgICBsZXQgc3RhcnQgPSBzdGFydEluZGljZXNbYXhpc107XG4gICAgY29uc3Qgc3RyaWRlID0gc3RyaWRlc1theGlzXSB8fCAxO1xuICAgIC8vIENoZWNrIHRoZSBheGlzIGJpdCBmcm9tIHJpZ2h0IG9mIG1hc2tlZCBheGVzLCBvciB0aGUgYmVnaW4gaW5kZXggaXMgbm90IHNldFxuICAgIC8vIGZvciB0aGUgYXhpcy5cbiAgICBpZiAoYmVnaW5NYXNrICYgMSA8PCBheGlzIHx8IGVsbGlwc2lzTWFzayAmIDEgPDwgYXhpcyB8fCBzdGFydCA9PSBudWxsKSB7XG4gICAgICAgIGlmIChzdHJpZGUgPiAwKSB7XG4gICAgICAgICAgICAvLyBGb3J3YXJkIGl0ZXJhdGlvbiAtIHVzZSB0aGUgZmlyc3QgZWxlbWVudC4gVGhlc2UgdmFsdWVzIHdpbGwgZ2V0XG4gICAgICAgICAgICAvLyBjbGFtcGVkIGJlbG93IChOb3RlOiBXZSBjb3VsZCBoYXZlIHNldCB0aGVtIHRvIDAgYW5kIGF4aXNfc2l6ZS0xLCBidXRcbiAgICAgICAgICAgIC8vIHVzZSBsb3dlc3QoKSBhbmQgbWF4KCkgdG8gbWFpbnRhaW4gc3ltbWV0cnkgd2l0aCBTdG9wRm9yQXhpcygpKVxuICAgICAgICAgICAgc3RhcnQgPSBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIEJhY2t3YXJkIGl0ZXJhdGlvbiAtIHVzZSB0aGUgbGFzdCBlbGVtZW50LlxuICAgICAgICAgICAgc3RhcnQgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBIYW5kbGUgbmVnYXRpdmUgaW5kaWNlc1xuICAgIGNvbnN0IGF4aXNTaXplID0gaW5wdXRTaGFwZVtheGlzXTtcbiAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgIHN0YXJ0ICs9IGF4aXNTaXplO1xuICAgIH1cbiAgICAvLyBDbGFtcGluZ1xuICAgIHN0YXJ0ID0gdXRpbC5jbGFtcCgwLCBzdGFydCwgYXhpc1NpemUgLSAxKTtcbiAgICByZXR1cm4gc3RhcnQ7XG59XG5leHBvcnQgZnVuY3Rpb24gc3RvcEZvckF4aXMoZW5kTWFzaywgc3RvcEluZGljZXMsIHN0cmlkZXMsIGlucHV0U2hhcGUsIGF4aXMsIGVsbGlwc2lzTWFzaykge1xuICAgIC8vIEJlZ2luIHdpdGggdGhlIHNwZWNpZmllZCBpbmRleFxuICAgIGxldCBzdG9wID0gc3RvcEluZGljZXNbYXhpc107XG4gICAgY29uc3Qgc3RyaWRlID0gc3RyaWRlc1theGlzXSB8fCAxO1xuICAgIC8vIENoZWNrIHRoZSBheGlzIGJpdCBmcm9tIHJpZ2h0IG9mIG1hc2tlZCBheGVzLCBvciBpZiB0aGUgc3RvcCBpbmRleCBpcyBub3RcbiAgICAvLyBzZXQgZm9yIHRoaXMgYXhpcy5cbiAgICBpZiAoZW5kTWFzayAmICgxIDw8IGF4aXMpIHx8IGVsbGlwc2lzTWFzayAmICgxIDw8IGF4aXMpIHx8IHN0b3AgPT0gbnVsbCkge1xuICAgICAgICBpZiAoc3RyaWRlID4gMCkge1xuICAgICAgICAgICAgLy8gRm9yd2FyZCBpdGVyYXRpb24gLSB1c2UgdGhlIGxhc3QgZWxlbWVudC4gVGhlc2UgdmFsdWVzIHdpbGwgZ2V0XG4gICAgICAgICAgICAvLyBjbGFtcGVkIGJlbG93XG4gICAgICAgICAgICBzdG9wID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBCYWNrd2FyZCBpdGVyYXRpb24gLSB1c2UgdGhlIGZpcnN0IGVsZW1lbnQuXG4gICAgICAgICAgICBzdG9wID0gTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gSGFuZGxlIG5lZ2F0aXZlIGluZGljZXNcbiAgICBjb25zdCBheGlzU2l6ZSA9IGlucHV0U2hhcGVbYXhpc107XG4gICAgaWYgKHN0b3AgPCAwKSB7XG4gICAgICAgIHN0b3AgKz0gYXhpc1NpemU7XG4gICAgfVxuICAgIC8vIENsYW1waW5nXG4gICAgLy8gQmVjYXVzZSB0aGUgZW5kIGluZGV4IHBvaW50cyBvbmUgcGFzdCB0aGUgbGFzdCBlbGVtZW50LCB3ZSBuZWVkIHNsaWdodGx5XG4gICAgLy8gZGlmZmVyZW50IGNsYW1waW5nIHJhbmdlcyBkZXBlbmRpbmcgb24gdGhlIGRpcmVjdGlvbi5cbiAgICBpZiAoc3RyaWRlID4gMCkge1xuICAgICAgICAvLyBGb3J3YXJkIGl0ZXJhdGlvblxuICAgICAgICBzdG9wID0gdXRpbC5jbGFtcCgwLCBzdG9wLCBheGlzU2l6ZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBCYWNrd2FyZCBpdGVyYXRpb25cbiAgICAgICAgc3RvcCA9IHV0aWwuY2xhbXAoLTEsIHN0b3AsIGF4aXNTaXplIC0gMSk7XG4gICAgfVxuICAgIHJldHVybiBzdG9wO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNsaWNlIG9jY3VwaWVzIGEgY29udGlub3VzIHNldCBvZiBlbGVtZW50cyBpbiB0aGVcbiAqICdmbGF0JyBzcGFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2xpY2VDb250aW5vdXMoc2hhcGUsIGJlZ2luLCBzaXplKSB7XG4gICAgLy8gSW5kZXggb2YgdGhlIGZpcnN0IGF4aXMgdGhhdCBoYXMgc2l6ZSA+IDEuXG4gICAgbGV0IGZpcnN0Tm9uT25lQXhpcyA9IHNpemUubGVuZ3RoO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoc2l6ZVtpXSA+IDEpIHtcbiAgICAgICAgICAgIGZpcnN0Tm9uT25lQXhpcyA9IGk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCBpID0gZmlyc3ROb25PbmVBeGlzICsgMTsgaSA8IHNpemUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGJlZ2luW2ldID4gMCB8fCBzaXplW2ldICE9PSBzaGFwZVtpXSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVGbGF0T2Zmc2V0KGJlZ2luLCBzdHJpZGVzKSB7XG4gICAgbGV0IGZsYXRPZmZzZXQgPSBiZWdpbi5sZW5ndGggPiAwID8gYmVnaW5bYmVnaW4ubGVuZ3RoIC0gMV0gOiAxO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmVnaW4ubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIGZsYXRPZmZzZXQgKz0gYmVnaW5baV0gKiBzdHJpZGVzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gZmxhdE9mZnNldDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNsaWNlUGFyYW1zKHgsIGJlZ2luLCBzaXplKSB7XG4gICAgLy8gVGhlIGZvbGxvd2luZyBsb2dpYyBhbGxvd3MgZm9yIG1vcmUgZXJnb25vbWljIGNhbGxzLlxuICAgIGxldCBiZWdpbl87XG4gICAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcbiAgICBpZiAodHlwZW9mIGJlZ2luID09PSAnbnVtYmVyJykge1xuICAgICAgICBiZWdpbl8gPSBbYmVnaW4sIC4uLm5ldyBBcnJheSh4UmFuayAtIDEpLmZpbGwoMCldO1xuICAgIH1cbiAgICBlbHNlIGlmIChiZWdpbi5sZW5ndGggPCB4UmFuaykge1xuICAgICAgICBiZWdpbl8gPSBiZWdpbi5jb25jYXQobmV3IEFycmF5KHhSYW5rIC0gYmVnaW4ubGVuZ3RoKS5maWxsKDApKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGJlZ2luXyA9IGJlZ2luLnNsaWNlKCk7XG4gICAgfVxuICAgIGJlZ2luXy5mb3JFYWNoKGQgPT4ge1xuICAgICAgICB1dGlsLmFzc2VydChkICE9PSAtMSwgKCkgPT4gJ3NsaWNlKCkgZG9lcyBub3Qgc3VwcG9ydCBuZWdhdGl2ZSBiZWdpbiBpbmRleGluZy4nKTtcbiAgICB9KTtcbiAgICBsZXQgc2l6ZV87XG4gICAgaWYgKHNpemUgPT0gbnVsbCkge1xuICAgICAgICBzaXplXyA9IG5ldyBBcnJheSh4UmFuaykuZmlsbCgtMSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBzaXplID09PSAnbnVtYmVyJykge1xuICAgICAgICBzaXplXyA9IFtzaXplLCAuLi5uZXcgQXJyYXkoeFJhbmsgLSAxKS5maWxsKC0xKV07XG4gICAgfVxuICAgIGVsc2UgaWYgKHNpemUubGVuZ3RoIDwgeFJhbmspIHtcbiAgICAgICAgc2l6ZV8gPSBzaXplLmNvbmNhdChuZXcgQXJyYXkoeFJhbmsgLSBzaXplLmxlbmd0aCkuZmlsbCgtMSkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgc2l6ZV8gPSBzaXplO1xuICAgIH1cbiAgICBzaXplXyA9IHNpemVfLm1hcCgoZCwgaSkgPT4ge1xuICAgICAgICBpZiAoZCA+PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHV0aWwuYXNzZXJ0KGQgPT09IC0xLCAoKSA9PiBgTmVnYXRpdmUgc2l6ZSB2YWx1ZXMgc2hvdWxkIGJlIGV4YWN0bHkgLTEgYnV0IGdvdCBgICtcbiAgICAgICAgICAgICAgICBgJHtkfSBmb3IgdGhlIHNsaWNlKCkgc2l6ZSBhdCBpbmRleCAke2l9LmApO1xuICAgICAgICAgICAgcmV0dXJuIHguc2hhcGVbaV0gLSBiZWdpbl9baV07XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gW2JlZ2luXywgc2l6ZV9dO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNsaWNlSW5mbyh4U2hhcGUsIGJlZ2luLCBlbmQsIHN0cmlkZXMsIGJlZ2luTWFzaywgZW5kTWFzaywgZWxsaXBzaXNNYXNrLCBuZXdBeGlzTWFzaywgc2hyaW5rQXhpc01hc2spIHtcbiAgICAvLyBtYWtlIGEgY29weSBiZWNhdXNlIGl0IG1heSBiZSBtb2RpZmllZCBmdXJ0aGVyIGRvd24uXG4gICAgbGV0ICRiZWdpbiA9IGJlZ2luLnNsaWNlKCk7XG4gICAgbGV0ICRlbmQgPSBlbmQuc2xpY2UoKTtcbiAgICBsZXQgJHN0cmlkZXMgPSBzdHJpZGVzO1xuICAgIGlmIChzdHJpZGVzID09IG51bGwpIHtcbiAgICAgICAgJHN0cmlkZXMgPSBuZXcgQXJyYXkoJGJlZ2luLmxlbmd0aCk7XG4gICAgfVxuICAgIGNvbnN0IGVsbGlwc2lzQXhlcyA9IG1hc2tUb0F4ZXMoZWxsaXBzaXNNYXNrKTtcbiAgICBpZiAoZWxsaXBzaXNBeGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNdWx0aXBsZSBlbGxpcHNlcyBpbiBzbGljZSBpcyBub3QgYWxsb3dlZC4nKTtcbiAgICB9XG4gICAgaWYgKGVsbGlwc2lzTWFzayAhPT0gMCAmJiBuZXdBeGlzTWFzayAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzaW5nIGJvdGggZWxsaXBzaXNNYXNrIGFuZCBuZXdBeGlzTWFzayBpcyBub3QgeWV0IHN1cHBvcnRlZC4nKTtcbiAgICB9XG4gICAgaWYgKGVsbGlwc2lzTWFzayAhPT0gMCAmJiBzaHJpbmtBeGlzTWFzayAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzaW5nIGJvdGggZWxsaXBzaXNNYXNrIGFuZCBzaHJpbmtBeGlzTWFzayBpcyBub3QgeWV0IHN1cHBvcnRlZC4nKTtcbiAgICB9XG4gICAgY29uc3QgbnVtSW50ZXJwb2xhdGVkQXhlcyA9IHhTaGFwZS5sZW5ndGggLSAkYmVnaW4ubGVuZ3RoO1xuICAgIC8vIEV4cGFuZCB0aGUgZGltcyBvZiB4IGJhc2VkIG9uIHRoZSBuZXdBeGlzTWFzay5cbiAgICBjb25zdCBleHBhbmRBeGVzID0gbWFza1RvQXhlcyhuZXdBeGlzTWFzayk7XG4gICAgY29uc3QgbmV3U2hhcGUgPSB4U2hhcGUuc2xpY2UoKTtcbiAgICBleHBhbmRBeGVzLmZvckVhY2goYXhpcyA9PiB7XG4gICAgICAgICRiZWdpbltheGlzXSA9IDA7XG4gICAgICAgICRlbmRbYXhpc10gPSAxO1xuICAgICAgICBuZXdTaGFwZS5zcGxpY2UoYXhpcywgMCwgMSk7XG4gICAgfSk7XG4gICAgY29uc3QgeyBiZWdpbjogbm9ybWFsaXplZEJlZ2luLCBlbmQ6IG5vcm1hbGl6ZWRFbmQsIHN0cmlkZXM6IG5vcm1hbGl6ZWRTdHJpZGVzIH0gPSBnZXROb3JtYWxpemVkQXhlcyhuZXdTaGFwZSwgZWxsaXBzaXNBeGVzLCBudW1JbnRlcnBvbGF0ZWRBeGVzLCAkYmVnaW4sICRlbmQsICRzdHJpZGVzLCBiZWdpbk1hc2ssIGVuZE1hc2ssIGVsbGlwc2lzTWFzayk7XG4gICAgJGJlZ2luID0gbm9ybWFsaXplZEJlZ2luO1xuICAgICRlbmQgPSBub3JtYWxpemVkRW5kO1xuICAgICRzdHJpZGVzID0gbm9ybWFsaXplZFN0cmlkZXM7XG4gICAgY29uc3Qgc2hyaW5rQXhlcyA9IG1hc2tUb0F4ZXMoc2hyaW5rQXhpc01hc2spO1xuICAgIC8vIEFkanVzdCB0aGUgZW5kcyBiYXNlZCBvbiB0aGUgc2hyaW5rIG1hc2suXG4gICAgc2hyaW5rQXhlcy5mb3JFYWNoKGF4aXMgPT4ge1xuICAgICAgICAkZW5kW2F4aXNdID0gJGJlZ2luW2F4aXNdICsgMTtcbiAgICAgICAgJHN0cmlkZXNbYXhpc10gPSAxO1xuICAgIH0pO1xuICAgIC8vIEZpZ3VyZSBvdXQgdGhlIG91dHB1dCBzaGFwZS5cbiAgICBjb25zdCBzaXplID0gY29tcHV0ZU91dFNoYXBlKCRiZWdpbiwgJGVuZCwgJHN0cmlkZXMpO1xuICAgIC8vIFJlbW92ZSB0aGUgYXhlcyBiYXNlZCBvbiBzaHJpbmtNYXNrLlxuICAgIGNvbnN0IG91dFNoYXBlID0gc2l6ZS5maWx0ZXIoKF8sIGF4aXMpID0+IHNocmlua0F4ZXMuaW5kZXhPZihheGlzKSA9PT0gLTEpO1xuICAgIGNvbnN0IG5vblN0cmlkZWQgPSAkc3RyaWRlcy5ldmVyeSh2ID0+IHYgPT09IDEpO1xuICAgIHJldHVybiB7IG5vblN0cmlkZWQsICRiZWdpbiwgJGVuZCwgJHN0cmlkZXMsIHNpemUsIG5ld1NoYXBlLCBvdXRTaGFwZSB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2xpY2VfdXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgU29mdG1heCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBzb2Z0bWF4IG5vcm1hbGl6ZWQgdmVjdG9yIGdpdmVuIHRoZSBsb2dpdHMuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICpcbiAqIGEuc29mdG1heCgpLnByaW50KCk7ICAvLyBvciB0Zi5zb2Z0bWF4KGEpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjJkKFsyLCA0LCA2LCAxLCAyLCAzXSwgWzIsIDNdKTtcbiAqXG4gKiBhLnNvZnRtYXgoKS5wcmludCgpOyAgLy8gb3IgdGYuc29mdG1heChhKVxuICogYGBgXG4gKlxuICogQHBhcmFtIGxvZ2l0cyBUaGUgbG9naXRzIGFycmF5LlxuICogQHBhcmFtIGRpbSBUaGUgZGltZW5zaW9uIHNvZnRtYXggd291bGQgYmUgcGVyZm9ybWVkIG9uLiBEZWZhdWx0cyB0byBgLTFgXG4gKiAgICAgd2hpY2ggaW5kaWNhdGVzIHRoZSBsYXN0IGRpbWVuc2lvbi5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdOb3JtYWxpemF0aW9uJ31cbiAqL1xuZnVuY3Rpb24gc29mdG1heF8obG9naXRzLCBkaW0gPSAtMSkge1xuICAgIGNvbnN0ICRsb2dpdHMgPSBjb252ZXJ0VG9UZW5zb3IobG9naXRzLCAnbG9naXRzJywgJ3NvZnRtYXgnLCAnZmxvYXQzMicpO1xuICAgIGlmIChkaW0gPT09IC0xKSB7XG4gICAgICAgIGRpbSA9ICRsb2dpdHMucmFuayAtIDE7XG4gICAgfVxuICAgIGlmIChkaW0gIT09ICRsb2dpdHMucmFuayAtIDEpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJ1NvZnRtYXggYWxvbmcgYSBub24tbGFzdCBkaW1lbnNpb24gaXMgbm90IHlldCBzdXBwb3J0ZWQuICcgK1xuICAgICAgICAgICAgYExvZ2l0cyB3YXMgcmFuayAkeyRsb2dpdHMucmFua30gYW5kIGRpbSB3YXMgJHtkaW19YCk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0cyA9IHsgbG9naXRzOiAkbG9naXRzIH07XG4gICAgY29uc3QgYXR0cnMgPSB7IGRpbSB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFNvZnRtYXgsIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IHNvZnRtYXggPSBvcCh7IHNvZnRtYXhfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c29mdG1heC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgU29mdHBsdXMgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBzb2Z0cGx1cyBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOiBgbG9nKGV4cCh4KSArIDEpYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzAsIDEsIC0xLCAuN10pO1xuICpcbiAqIHguc29mdHBsdXMoKS5wcmludCgpOyAgLy8gb3IgdGYuc29mdHBsdXMoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gc29mdHBsdXNfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzb2Z0cGx1cycpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChTb2Z0cGx1cywgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBzb2Z0cGx1cyA9IG9wKHsgc29mdHBsdXNfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c29mdHBsdXMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFNwYWNlVG9CYXRjaE5EIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIFRoaXMgb3BlcmF0aW9uIGRpdmlkZXMgXCJzcGF0aWFsXCIgZGltZW5zaW9ucyBgWzEsIC4uLiwgTV1gIG9mIHRoZSBpbnB1dCBpbnRvXG4gKiBhIGdyaWQgb2YgYmxvY2tzIG9mIHNoYXBlIGBibG9ja1NoYXBlYCwgYW5kIGludGVybGVhdmVzIHRoZXNlIGJsb2NrcyB3aXRoXG4gKiB0aGUgXCJiYXRjaFwiIGRpbWVuc2lvbiAoMCkgc3VjaCB0aGF0IGluIHRoZSBvdXRwdXQsIHRoZSBzcGF0aWFsXG4gKiBkaW1lbnNpb25zIGBbMSwgLi4uLCBNXWAgY29ycmVzcG9uZCB0byB0aGUgcG9zaXRpb24gd2l0aGluIHRoZSBncmlkLFxuICogYW5kIHRoZSBiYXRjaCBkaW1lbnNpb24gY29tYmluZXMgYm90aCB0aGUgcG9zaXRpb24gd2l0aGluIGEgc3BhdGlhbCBibG9ja1xuICogYW5kIHRoZSBvcmlnaW5hbCBiYXRjaCBwb3NpdGlvbi4gUHJpb3IgdG8gZGl2aXNpb24gaW50byBibG9ja3MsXG4gKiB0aGUgc3BhdGlhbCBkaW1lbnNpb25zIG9mIHRoZSBpbnB1dCBhcmUgb3B0aW9uYWxseSB6ZXJvIHBhZGRlZFxuICogYWNjb3JkaW5nIHRvIGBwYWRkaW5nc2AuIFNlZSBiZWxvdyBmb3IgYSBwcmVjaXNlIGRlc2NyaXB0aW9uLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yNGQoWzEsIDIsIDMsIDRdLCBbMSwgMiwgMiwgMV0pO1xuICogY29uc3QgYmxvY2tTaGFwZSA9IFsyLCAyXTtcbiAqIGNvbnN0IHBhZGRpbmdzID0gW1swLCAwXSwgWzAsIDBdXTtcbiAqXG4gKiB4LnNwYWNlVG9CYXRjaE5EKGJsb2NrU2hhcGUsIHBhZGRpbmdzKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHggQSBgdGYuVGVuc29yYC4gTi1EIHdpdGggYHguc2hhcGVgID0gYFtiYXRjaF0gKyBzcGF0aWFsU2hhcGUgK1xuICogcmVtYWluaW5nU2hhcGVgLCB3aGVyZSBzcGF0aWFsU2hhcGUgaGFzIGBNYCBkaW1lbnNpb25zLlxuICogQHBhcmFtIGJsb2NrU2hhcGUgQSAxLUQgYXJyYXkuIE11c3QgaGF2ZSBzaGFwZSBgW01dYCwgYWxsIHZhbHVlcyBtdXN0XG4gKiBiZSA+PSAxLlxuICogQHBhcmFtIHBhZGRpbmdzIEEgMi1EIGFycmF5LiBNdXN0IGhhdmUgc2hhcGUgYFtNLCAyXWAsIGFsbCB2YWx1ZXMgbXVzdCBiZSA+PVxuICogICAgIDAuIGBwYWRkaW5nc1tpXSA9IFtwYWRTdGFydCwgcGFkRW5kXWAgc3BlY2lmaWVzIHRoZSBhbW91bnQgdG8gemVyby1wYWRcbiAqIGZyb20gaW5wdXQgZGltZW5zaW9uIGBpICsgMWAsIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHNwYXRpYWwgZGltZW5zaW9uIGBpYC4gSXRcbiAqIGlzIHJlcXVpcmVkIHRoYXRcbiAqIGAoaW5wdXRTaGFwZVtpICsgMV0gKyBwYWRTdGFydCArIHBhZEVuZCkgJSBibG9ja1NoYXBlW2ldID09PSAwYFxuICpcbiAqIFRoaXMgb3BlcmF0aW9uIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZyBzdGVwczpcbiAqXG4gKiAxLiBaZXJvLXBhZCB0aGUgc3RhcnQgYW5kIGVuZCBvZiBkaW1lbnNpb25zIGBbMSwgLi4uLCBNXWAgb2YgdGhlIGlucHV0XG4gKiBhY2NvcmRpbmcgdG8gYHBhZGRpbmdzYCB0byBwcm9kdWNlIGBwYWRkZWRgIG9mIHNoYXBlIHBhZGRlZFNoYXBlLlxuICpcbiAqIDIuIFJlc2hhcGUgYHBhZGRlZGAgdG8gYHJlc2hhcGVkUGFkZGVkYCBvZiBzaGFwZTpcbiAqIGBbYmF0Y2hdICsgW3BhZGRlZFNoYXBlWzFdIC8gYmxvY2tTaGFwZVswXSwgYmxvY2tTaGFwZVswXSwgLi4uLFxuICogcGFkZGVkU2hhcGVbTV0gLyBibG9ja1NoYXBlW00tMV0sIGJsb2NrU2hhcGVbTS0xXV0gKyByZW1haW5pbmdTaGFwZWBcbiAqXG4gKiAzLiBQZXJtdXRlIGRpbWVuc2lvbnMgb2YgYHJlc2hhcGVkUGFkZGVkYCB0byBwcm9kdWNlIGBwZXJtdXRlZFJlc2hhcGVkUGFkZGVkYFxuICogb2Ygc2hhcGU6IGBibG9ja1NoYXBlICsgW2JhdGNoXSArIFtwYWRkZWRTaGFwZVsxXSAvIGJsb2NrU2hhcGVbMF0sIC4uLixcbiAqIHBhZGRlZFNoYXBlW01dIC8gYmxvY2tTaGFwZVtNLTFdXSArIHJlbWFpbmluZ1NoYXBlYFxuICpcbiAqIDQuIFJlc2hhcGUgYHBlcm11dGVkUmVzaGFwZWRQYWRkZWRgIHRvIGZsYXR0ZW4gYGJsb2NrU2hhcGVgIGludG8gdGhlXG4gKiBiYXRjaCBkaW1lbnNpb24sIHByb2R1Y2luZyBhbiBvdXRwdXQgdGVuc29yIG9mIHNoYXBlOlxuICogYFtiYXRjaCAqIHByb2QoYmxvY2tTaGFwZSldICsgW3BhZGRlZFNoYXBlWzFdIC8gYmxvY2tTaGFwZVswXSwgLi4uLFxuICogcGFkZGVkU2hhcGVbTV0gLyBibG9ja1NoYXBlW00tMV1dICsgcmVtYWluaW5nU2hhcGVgXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnVHJhbnNmb3JtYXRpb25zJ31cbiAqL1xuZnVuY3Rpb24gc3BhY2VUb0JhdGNoTkRfKHgsIGJsb2NrU2hhcGUsIHBhZGRpbmdzKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc3BhY2VUb0JhdGNoTkQnKTtcbiAgICB1dGlsLmFzc2VydCgkeC5yYW5rID49IDEgKyBibG9ja1NoYXBlLmxlbmd0aCwgKCkgPT4gYGlucHV0IHJhbmsgJHskeC5yYW5rfSBzaG91bGQgYmUgPiB0aGFuIFtibG9ja1NoYXBlXSAke2Jsb2NrU2hhcGUubGVuZ3RofWApO1xuICAgIHV0aWwuYXNzZXJ0KHBhZGRpbmdzLmxlbmd0aCA9PT0gYmxvY2tTaGFwZS5sZW5ndGgsICgpID0+IGBwYWRkaW5ncy5zaGFwZVswXSAke3BhZGRpbmdzLmxlbmd0aH0gbXVzdCBiZSBlcXVhbCB0byBbYmxvY2tTaGFwZV0gJHtibG9ja1NoYXBlLmxlbmd0aH1gKTtcbiAgICB1dGlsLmFzc2VydCgkeC5zaGFwZS5yZWR1Y2UoKGEsIGIsIGkpID0+IHtcbiAgICAgICAgaWYgKGkgPiAwICYmIGkgPD0gYmxvY2tTaGFwZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBhICYmXG4gICAgICAgICAgICAgICAgKChiICsgcGFkZGluZ3NbaSAtIDFdWzBdICsgcGFkZGluZ3NbaSAtIDFdWzFdKSAlXG4gICAgICAgICAgICAgICAgICAgIGJsb2NrU2hhcGVbaSAtIDFdID09PVxuICAgICAgICAgICAgICAgICAgICAwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYTtcbiAgICB9LCB0cnVlKSwgKCkgPT4gYGlucHV0IHNwYXRpYWwgZGltZW5zaW9ucyAkeyR4LnNoYXBlLnNsaWNlKDEpfSB3aXRoIHBhZGRpbmdzICR7cGFkZGluZ3MudG9TdHJpbmcoKX0gbXVzdCBiZSBkaXZpc2libGUgYnkgYmxvY2tTaGFwZXMgJHtibG9ja1NoYXBlLnRvU3RyaW5nKCl9YCk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBibG9ja1NoYXBlLCBwYWRkaW5ncyB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFNwYWNlVG9CYXRjaE5ELCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBzcGFjZVRvQmF0Y2hORCA9IG9wKHsgc3BhY2VUb0JhdGNoTkRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3BhY2VfdG9fYmF0Y2hfbmQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IFNwYXJzZUZpbGxFbXB0eVJvd3MgfSBmcm9tICcuLi8uLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbi8qKlxuICogVGhlIGlucHV0IFNwYXJzZVRlbnNvciBpcyByZXByZXNlbnRlZCB2aWEgdGhlIG1hcCBvZiBpbnB1dHMge2BpbmRpY2VzYCxcbiAqIGB2YWx1ZXNgLCBgZGVuc2VTaGFwZWB9LiBUaGUgb3V0cHV0IFNwYXJzZVRlbnNvciBoYXMgdGhlIHNhbWUgYGRlbnNlU2hhcGVgXG4gKiBidXQgd2l0aCBpbmRpY2VzIGBvdXRwdXRJbmRpY2VzYCBhbmQgdmFsdWVzIGBvdXRwdXRWYWx1ZXNgLiBUaGlzIG9wIGluc2VydHMgYVxuICogc2luZ2xlIGVudHJ5IGZvciBldmVyeSByb3cgdGhhdCBkb2Vzbid0IGhhdmUgYW55IHZhbHVlcy4gVGhlIGluZGV4IGlzIGNyZWF0ZWRcbiAqIGFzIGBbcm93LCAwLCAuLi4sIDBdYCBhbmQgdGhlIGluc2VydGVkIHZhbHVlIGlzIGBkZWZhdWx0VmFsdWVgLlxuICpcbiAqIEZvciBleGFtcGxlLCBzdXBwb3NlIGBzcElucHV0YCBoYXMgc2hhcGUgWzUsIDZdIGFuZCBub24tZW1wdHkgdmFsdWVzOlxuICogWzAsIDFdOiBhXG4gKiBbMCwgM106IGJcbiAqIFsyLCAwXTogY1xuICogWzMsIDFdOiBkXG4gKlxuICogUm93cyAxIGFuZCA0IGFyZSBlbXB0eSwgc28gdGhlIG91dHB1dCB3aWxsIGJlIG9mIHNoYXBlIFs1LCA2XSB3aXRoIHZhbHVlczpcbiAqIFswLCAxXTogYVxuICogWzAsIDNdOiBiXG4gKiBbMSwgMF06IGBkZWZhdWx0VmFsdWVgXG4gKiBbMiwgMF06IGNcbiAqIFszLCAxXTogZFxuICogWzQsIDBdOiBgZGVmYXVsdFZhbHVlYFxuICpcbiAqIFRoZSBvdXRwdXQgU3BhcnNlVGVuc29yIHdpbGwgYmUgaW4gcm93LW1ham9yIG9yZGVyIGFuZCB3aWxsIGhhdmUgdGhlIHNhbWVcbiAqIHNoYXBlIGFzIHRoZSBpbnB1dC5cbiAqXG4gKiBUaGlzIG9wIGFsc28gcmV0dXJucyBhbiBpbmRpY2F0b3IgdmVjdG9yIHNoYXBlZCBbZGVuc2Vfc2hhcGVbMF1dIHN1Y2ggdGhhdFxuICogZW1wdHlSb3dJbmRpY2F0b3JbaV0gPSBUcnVlIGlmZiByb3cgaSB3YXMgYW4gZW1wdHkgcm93LlxuICpcbiAqIEFuZCBhIHJldmVyc2UgaW5kZXggbWFwIHZlY3RvciBzaGFwZWQgW2luZGljZXMuc2hhcGVbMF1dIHRoYXQgaXMgdXNlZCBkdXJpbmdcbiAqIGJhY2twcm9wYWdhdGlvbiwgcmV2ZXJzZUluZGV4TWFwW2ldID0gb3V0aSBzLnQuIGluZGljZXNbaSwgal0gPT1cbiAqIG91dHB1dEluZGljZXNbb3V0aSwgal0gZm9yIGFsbCBqXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHJlc3VsdCA9IHRmLnNwYXJzZS5zcGFyc2VGaWxsRW1wdHlSb3dzKFxuICogICBbWzAsIDBdLCBbMSwgMF0sIFsxLCAzXSwgWzEsIDRdLCBbMywgMl0sIFszLCAzXV0sXG4gKiAgIFswLCAxMCwgMTMsIDE0LCAzMiwgMzNdLCBbNSwgNl0sIC0xKTtcbiAqIGNvbnNvbGUubG9nKHJlc3VsdCk7XG4gKiByZXN1bHRbJ291dHB1dEluZGljZXMnXS5wcmludCgpOyAvLyBbWzAsIDBdLCBbMSwgMF0sIFsxLCAzXSwgWzEsIDRdLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIFsyLCAwXSwgWzMsIDJdLCBbMywgM10sIFs0LCAwXV1cbiAqIHJlc3VsdFsnb3V0cHV0VmFsdWVzJ10ucHJpbnQoKTsgLy8gWzAsIDEwLCAxMywgMTQsLTEsIDMyLCAzMywgLTFdXG4gKiByZXN1bHRbJ2VtcHR5Um93SW5kaWNhdG9yJ10ucHJpbnQoKTsgLy8gW2ZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIHRydWVdXG4gKiByZXN1bHRbJ3JldmVyc2VJbmRleE1hcCddLnByaW50KCk7IC8vIFswLCAxLCAyLCAzLCA1LCA2XVxuICogYGBgXG4gKiBAcGFyYW0gaW5kaWNlczogMi1ELiB0aGUgaW5kaWNlcyBvZiB0aGUgc3BhcnNlIHRlbnNvci5cbiAqIEBwYXJhbSB2YWx1ZXM6IDEtRC4gdGhlIHZhbHVlcyBvZiB0aGUgc3BhcnNlIHRlbnNvci5cbiAqIEBwYXJhbSBkZW5zZVNoYXBlOiAxLUQuIHRoZSBzaGFwZSBvZiB0aGUgc3BhcnNlIHRlbnNvci5cbiAqIEBwYXJhbSBkZWZhdWx0VmFsdWU6IDAtRC4gZGVmYXVsdCB2YWx1ZSB0byBpbnNlcnQgaW50byBsb2NhdGlvbiBbcm93LCAwLCAuLi4sXG4gKiAgICAgMF0gZm9yIHJvd3MgbWlzc2luZyBmcm9tIHRoZSBpbnB1dCBzcGFyc2UgdGVuc29yLlxuICogQHJldHVybiBBIG1hcCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqICAgICAtIG91dHB1dEluZGljZXNcbiAqICAgICAtIG91dHB1dFZhbHVlczogMS1ELiB0aGUgdmFsdWVzIG9mIHRoZSBmaWxsZWQgc3BhcnNlIHRlbnNvci5cbiAqICAgICAtIGVtcHR5Um93SW5kaWNhdG9yOiAxLUQuIHdoZXRoZXIgdGhlIGRlbnNlIHJvdyB3YXMgbWlzc2luZyBpbiB0aGUgaW5wdXRcbiAqIHNwYXJzZSB0ZW5zb3IuXG4gKiAgICAgLSByZXZlcnNlSW5kZXhNYXA6IDEtRC4gYSBtYXAgZnJvbSB0aGUgaW5wdXQgaW5kaWNlcyB0byB0aGUgb3V0cHV0XG4gKiBpbmRpY2VzLlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU3BhcnNlJ31cbiAqL1xuZnVuY3Rpb24gc3BhcnNlRmlsbEVtcHR5Um93c18oaW5kaWNlcywgdmFsdWVzLCBkZW5zZVNoYXBlLCBkZWZhdWx0VmFsdWUpIHtcbiAgICBjb25zdCAkaW5kaWNlcyA9IGNvbnZlcnRUb1RlbnNvcihpbmRpY2VzLCAnaW5kaWNlcycsICdzcGFyc2VGaWxsRW1wdHlSb3dzJyk7XG4gICAgY29uc3QgJHZhbHVlcyA9IGNvbnZlcnRUb1RlbnNvcih2YWx1ZXMsICd2YWx1ZXMnLCAnc3BhcnNlRmlsbEVtcHR5Um93cycpO1xuICAgIGNvbnN0ICRkZW5zZVNoYXBlID0gY29udmVydFRvVGVuc29yKGRlbnNlU2hhcGUsICdkZW5zZVNoYXBlJywgJ3NwYXJzZUZpbGxFbXB0eVJvd3MnKTtcbiAgICBjb25zdCAkZGVmYXVsdFZhbHVlID0gY29udmVydFRvVGVuc29yKGRlZmF1bHRWYWx1ZSwgJ2RlZmF1bHRWYWx1ZScsICdzcGFyc2VGaWxsRW1wdHlSb3dzJywgJHZhbHVlcy5kdHlwZSk7XG4gICAgaWYgKCRpbmRpY2VzLnJhbmsgIT09IDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbmRpY2VzIHNob3VsZCBiZSBUZW5zb3IyRCBidXQgcmVjZWl2ZWQgc2hhcGVcbiAgICAgICAgJHskaW5kaWNlcy5zaGFwZX1gKTtcbiAgICB9XG4gICAgaWYgKCR2YWx1ZXMucmFuayAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFZhbHVlcyBzaG91bGQgYmUgVGVuc29yMUQgYnV0IHJlY2VpdmVkIHNoYXBlICR7JHZhbHVlcy5zaGFwZX1gKTtcbiAgICB9XG4gICAgaWYgKCRkZW5zZVNoYXBlLnJhbmsgIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEZW5zZSBzaGFwZSBzaG91bGQgYmUgVGVuc29yMUQgYnV0IHJlY2VpdmVkIHNoYXBlICR7JGRlbnNlU2hhcGUuc2hhcGV9YCk7XG4gICAgfVxuICAgIGlmICgkZGVmYXVsdFZhbHVlLnJhbmsgIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEZWZhdWx0IHZhbHVlIHNob3VsZCBiZSBhIHNjYWxhciBidXQgcmVjZWl2ZWQgc2hhcGUgJHskZGVmYXVsdFZhbHVlLnNoYXBlfWApO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dHMgPSB7XG4gICAgICAgIGluZGljZXM6ICRpbmRpY2VzLFxuICAgICAgICB2YWx1ZXM6ICR2YWx1ZXMsXG4gICAgICAgIGRlbnNlU2hhcGU6ICRkZW5zZVNoYXBlLFxuICAgICAgICBkZWZhdWx0VmFsdWU6ICRkZWZhdWx0VmFsdWVcbiAgICB9O1xuICAgIGNvbnN0IHJlc3VsdCA9IEVOR0lORS5ydW5LZXJuZWwoU3BhcnNlRmlsbEVtcHR5Um93cywgaW5wdXRzKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBvdXRwdXRJbmRpY2VzOiByZXN1bHRbMF0sXG4gICAgICAgIG91dHB1dFZhbHVlczogcmVzdWx0WzFdLFxuICAgICAgICBlbXB0eVJvd0luZGljYXRvcjogcmVzdWx0WzJdLFxuICAgICAgICByZXZlcnNlSW5kZXhNYXA6IHJlc3VsdFszXVxuICAgIH07XG59XG5leHBvcnQgY29uc3Qgc3BhcnNlRmlsbEVtcHR5Um93cyA9IG9wKHsgc3BhcnNlRmlsbEVtcHR5Um93c18gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zcGFyc2VfZmlsbF9lbXB0eV9yb3dzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBTcGFyc2VSZXNoYXBlIH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4uL29wZXJhdGlvbic7XG4vKipcbiAqIFRoaXMgb3BlcmF0aW9uIGhhcyB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgcmVzaGFwZSBvbiB0aGUgcmVwcmVzZW50ZWQgZGVuc2VcbiAqIHRlbnNvci4gVGhlIGBpbnB1dEluZGljZXNgIGFyZSByZWNvbXB1dGVkIGJhc2VkIG9uIHRoZSByZXF1ZXN0ZWQgYG5ld1NoYXBlYC5cbiAqIElmIG9uZSBjb21wb25lbnQgb2YgYG5ld1NoYXBlYCBpcyB0aGUgc3BlY2lhbCB2YWx1ZSAtMSwgdGhlIHNpemUgb2YgdGhhdFxuICogZGltZW5zaW9uIGlzIGNvbXB1dGVkIHNvIHRoYXQgdGhlIHRvdGFsIGRlbnNlIHNpemUgcmVtYWlucyBjb25zdGFudC4gQXQgbW9zdFxuICogb25lIGNvbXBvbmVudCBvZiBgbmV3U2hhcGVgIGNhbiBiZSAtMS4gVGhlIG51bWJlciBvZiBkZW5zZSBlbGVtZW50cyBpbXBsaWVkXG4gKiBieSBgbmV3U2hhcGVgIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBkZW5zZSBlbGVtZW50cyBvcmlnaW5hbGx5XG4gKiBpbXBsaWVkIGJ5IGBpbnB1dFNoYXBlYC4gUmVzaGFwaW5nIGRvZXMgbm90IGFmZmVjdCB0aGUgb3JkZXIgb2YgdmFsdWVzIGluIHRoZVxuICogU3BhcnNlVGVuc29yLiBJZiB0aGUgaW5wdXQgdGVuc29yIGhhcyByYW5rIFJfaW4gYW5kIE4gbm9uLWVtcHR5IHZhbHVlcywgYW5kXG4gKiBgbmV3U2hhcGVgIGhhcyBsZW5ndGggUl9vdXQsIHRoZW4gYGlucHV0SW5kaWNlc2AgaGFzIHNoYXBlIFtOLCBSX2luXSxcbiAqIGBpbnB1dFNoYXBlYCBoYXMgbGVuZ3RoIFJfaW4sIGBvdXRwdXRJbmRpY2VzYCBoYXMgc2hhcGUgW04sIFJfb3V0XSwgYW5kXG4gKiBgb3V0cHV0U2hhcGVgIGhhcyBsZW5ndGggUl9vdXQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHJlc3VsdCA9IHRmLnNwYXJzZS5zcGFyc2VSZXNoYXBlKFxuICogICBbWzAsIDAsIDBdLCBbMCwgMCwgMV0sIFswLCAxLCAwXSwgWzEsIDAsIDBdLCBbMSwgMiwgM11dLFxuICogICBbMiwgMywgNl0sIFs5LCAtMV0pO1xuICogY29uc29sZS5sb2cocmVzdWx0KTtcbiAqIHJlc3VsdFsnb3V0cHV0SW5kaWNlcyddLnByaW50KCk7IC8vW1swLCAwXSwgWzAsIDFdLCBbMSwgMl0sIFs0LCAyXSwgWzgsIDFdXVxuICogcmVzdWx0WydvdXRwdXRTaGFwZSddLnByaW50KCk7IC8vIFs5LCA0XVxuICogYGBgXG4gKiBAcGFyYW0gaW5wdXRJbmRpY2VzOiAyLUQuIE4geCBSX2luIG1hdHJpeCB3aXRoIHRoZSBpbmRpY2VzIG9mIG5vbi1lbXB0eVxuICogdmFsdWVzIGluIGEgU3BhcnNlVGVuc29yLlxuICogQHBhcmFtIGlucHV0U2hhcGU6IDEtRC4gUl9pbiBUZW5zb3IxRCB3aXRoIHRoZSBpbnB1dCBTcGFyc2VUZW5zb3IncyBkZW5zZVxuICogc2hhcGUuXG4gKiBAcGFyYW0gbmV3U2hhcGU6IDEtRC4gUl9vdXQgVGVuc29yMUQgd2l0aCB0aGUgcmVxdWVzdGVkIG5ldyBkZW5zZSBzaGFwZS5cbiAqIEByZXR1cm4gQSBtYXAgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAgICAgLSBvdXRwdXRJbmRpY2VzOiAyLUQuIE4geCBSX291dCBtYXRyaXggd2l0aCB0aGUgdXBkYXRlZCBpbmRpY2VzIG9mXG4gKiAgICAgICBub24tZW1wdHkgdmFsdWVzIGluIHRoZSBvdXRwdXQgU3BhcnNlVGVuc29yLlxuICogICAgIC0gb3V0cHV0U2hhcGU6IDEtRC4gUl9vdXQgdmVjdG9yIHdpdGggdGhlIGZ1bGwgZGVuc2Ugc2hhcGUgb2YgdGhlIG91dHB1dFxuICogICAgICAgU3BhcnNlVGVuc29yLiBUaGlzIGlzIHRoZSBzYW1lIGFzIG5ld1NoYXBlIGJ1dCB3aXRoIGFueSAtMSBkaW1lbnNpb25zXG4gKiAgICAgICAgZmlsbGVkIGluLlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU3BhcnNlJ31cbiAqL1xuZnVuY3Rpb24gc3BhcnNlUmVzaGFwZV8oaW5wdXRJbmRpY2VzLCBpbnB1dFNoYXBlLCBuZXdTaGFwZSkge1xuICAgIGNvbnN0ICRpbnB1dEluZGljZXMgPSBjb252ZXJ0VG9UZW5zb3IoaW5wdXRJbmRpY2VzLCAnaW5wdXRJbmRpY2VzJywgJ3NwYXJzZVJlc2hhcGUnKTtcbiAgICBjb25zdCAkaW5wdXRTaGFwZSA9IGNvbnZlcnRUb1RlbnNvcihpbnB1dFNoYXBlLCAnaW5wdXRTaGFwZScsICdzcGFyc2VSZXNoYXBlJyk7XG4gICAgY29uc3QgJG5ld1NoYXBlID0gY29udmVydFRvVGVuc29yKG5ld1NoYXBlLCAnbmV3U2hhcGUnLCAnc3BhcnNlUmVzaGFwZScpO1xuICAgIGlmICgkaW5wdXRJbmRpY2VzLnJhbmsgIT09IDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnB1dCBpbmRpY2VzIHNob3VsZCBiZSBUZW5zb3IyRCBidXQgcmVjZWl2ZWQgc2hhcGVcbiAgICAgICAgJHskaW5wdXRJbmRpY2VzLnNoYXBlfWApO1xuICAgIH1cbiAgICBpZiAoJGlucHV0U2hhcGUucmFuayAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYElucHV0IHNoYXBlIHNob3VsZCBiZSBUZW5zb3IxRCBidXQgcmVjZWl2ZWQgc2hhcGUgJHskaW5wdXRTaGFwZS5zaGFwZX1gKTtcbiAgICB9XG4gICAgaWYgKCRuZXdTaGFwZS5yYW5rICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTmV3IHNoYXBlIHNob3VsZCBiZSBUZW5zb3IxRCBidXQgcmVjZWl2ZWQgc2hhcGUgJHskbmV3U2hhcGUuc2hhcGV9YCk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0cyA9IHtcbiAgICAgICAgaW5wdXRJbmRpY2VzOiAkaW5wdXRJbmRpY2VzLFxuICAgICAgICBpbnB1dFNoYXBlOiAkaW5wdXRTaGFwZSxcbiAgICAgICAgbmV3U2hhcGU6ICRuZXdTaGFwZVxuICAgIH07XG4gICAgY29uc3QgcmVzdWx0ID0gRU5HSU5FLnJ1bktlcm5lbChTcGFyc2VSZXNoYXBlLCBpbnB1dHMpO1xuICAgIHJldHVybiB7IG91dHB1dEluZGljZXM6IHJlc3VsdFswXSwgb3V0cHV0U2hhcGU6IHJlc3VsdFsxXSB9O1xufVxuZXhwb3J0IGNvbnN0IHNwYXJzZVJlc2hhcGUgPSBvcCh7IHNwYXJzZVJlc2hhcGVfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3BhcnNlX3Jlc2hhcGUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IFNwYXJzZVNlZ21lbnRNZWFuIH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4uL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBtZWFuIGFsb25nIHNwYXJzZSBzZWdtZW50cyBvZiBhIHRlbnNvci5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYyA9IHRmLnRlbnNvcjJkKFtbMSwyLDMsNF0sIFstMSwtMiwtMywtNF0sIFs2LDcsOCw5XV0pO1xuICogLy8gU2VsZWN0IHR3byByb3dzLCBvbmUgc2VnbWVudC5cbiAqIGNvbnN0IHJlc3VsdDEgPSB0Zi5zcGFyc2Uuc3BhcnNlU2VnbWVudE1lYW4oYyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmLnRlbnNvcjFkKFswLCAxXSwgJ2ludDMyJyksXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Zi50ZW5zb3IxZChbMCwgMF0sICdpbnQzMicpKTtcbiAqIHJlc3VsdDEucHJpbnQoKTsgLy8gW1swLCAwLCAwLCAwXV1cbiAqXG4gKiAvLyBTZWxlY3QgdHdvIHJvd3MsIHR3byBzZWdtZW50cy5cbiAqIGNvbnN0IHJlc3VsdDIgPSB0Zi5zcGFyc2Uuc3BhcnNlU2VnbWVudE1lYW4oYyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGYudGVuc29yMWQoWzAsIDFdLCAnaW50MzInKSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGYudGVuc29yMWQoWzAsIDFdLCAnaW50MzInKSk7XG4gKiByZXN1bHQyLnByaW50KCk7IC8vIFtbMSwgMiwgMywgNF0sIFstMSwgLTIsIC0zLCAtNF1dXG4gKlxuICogLy8gU2VsZWN0IGFsbCByb3dzLCB0d28gc2VnbWVudHMuXG4gKiBjb25zdCByZXN1bHQzID0gdGYuc3BhcnNlLnNwYXJzZVNlZ21lbnRNZWFuKGMsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmLnRlbnNvcjFkKFswLCAxLCAyXSwgJ2ludDMyJyksXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmLnRlbnNvcjFkKFswLCAxLCAxXSwgJ2ludDMyJykpO1xuICogcmVzdWx0My5wcmludCgpOyAvLyBbWzEuMCwgMi4wLCAzLjAsIDQuMF0sIFsyLjUsIDIuNSwgMi41LCAyLjVdXVxuICogYGBgXG4gKiBAcGFyYW0gZGF0YTogQSBUZW5zb3Igb2YgYXQgbGVhc3Qgb25lIGRpbWVuc2lvbiB3aXRoIGRhdGEgdGhhdCB3aWxsIGJlXG4gKiAgICAgYXNzZW1ibGVkIGluIHRoZSBvdXRwdXQuXG4gKiBAcGFyYW0gaW5kaWNlczogQSAxLUQgVGVuc29yIHdpdGggaW5kaWNlcyBpbnRvIGRhdGEuIEhhcyBzYW1lIHJhbmsgYXNcbiAqICAgICBzZWdtZW50SWRzLlxuICogQHBhcmFtIHNlZ21lbnRJZHM6IEEgMS1EIFRlbnNvciB3aXRoIGluZGljZXMgaW50byB0aGUgb3V0cHV0IFRlbnNvci4gVmFsdWVzXG4gKiAgICAgc2hvdWxkIGJlIHNvcnRlZCBhbmQgY2FuIGJlIHJlcGVhdGVkLlxuICogQHJldHVybiBIYXMgc2FtZSBzaGFwZSBhcyBkYXRhLCBleGNlcHQgZm9yIGRpbWVuc2lvbiAwIHdoaWNoIGhhcyBlcXVhbCB0b1xuICogICAgICAgICB0aGUgbnVtYmVyIG9mIHNlZ21lbnRzLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1NwYXJzZSd9XG4gKi9cbmZ1bmN0aW9uIHNwYXJzZVNlZ21lbnRNZWFuXyhkYXRhLCBpbmRpY2VzLCBzZWdtZW50SWRzKSB7XG4gICAgY29uc3QgJGRhdGEgPSBjb252ZXJ0VG9UZW5zb3IoZGF0YSwgJ2RhdGEnLCAnc3BhcnNlU2VnbWVudE1lYW4nKTtcbiAgICBjb25zdCAkaW5kaWNlcyA9IGNvbnZlcnRUb1RlbnNvcihpbmRpY2VzLCAnaW5kaWNlcycsICdzcGFyc2VTZWdtZW50TWVhbicpO1xuICAgIGNvbnN0ICRzZWdtZW50SWRzID0gY29udmVydFRvVGVuc29yKHNlZ21lbnRJZHMsICdzZWdtZW50SWRzJywgJ3NwYXJzZVNlZ21lbnRNZWFuJyk7XG4gICAgaWYgKCRkYXRhLnJhbmsgPCAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRGF0YSBzaG91bGQgYmUgYXQgbGVhc3QgMSBkaW1lbnNpb25hbCBidXQgcmVjZWl2ZWQgc2NhbGFyYCk7XG4gICAgfVxuICAgIGlmICgkaW5kaWNlcy5yYW5rICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW5kaWNlcyBzaG91bGQgYmUgVGVuc29yMUQgYnV0IHJlY2VpdmVkIHNoYXBlXG4gICAgICAgICAgJHskaW5kaWNlcy5zaGFwZX1gKTtcbiAgICB9XG4gICAgaWYgKCRzZWdtZW50SWRzLnJhbmsgIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZWdtZW50IGlkcyBzaG91bGQgYmUgVGVuc29yMUQgYnV0IHJlY2VpdmVkIHNoYXBlXG4gICAgICAgICAgJHskc2VnbWVudElkcy5zaGFwZX1gKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0ge1xuICAgICAgICBkYXRhOiAkZGF0YSxcbiAgICAgICAgaW5kaWNlczogJGluZGljZXMsXG4gICAgICAgIHNlZ21lbnRJZHM6ICRzZWdtZW50SWRzXG4gICAgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChTcGFyc2VTZWdtZW50TWVhbiwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBzcGFyc2VTZWdtZW50TWVhbiA9IG9wKHsgc3BhcnNlU2VnbWVudE1lYW5fIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3BhcnNlX3NlZ21lbnRfbWVhbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgU3BhcnNlU2VnbWVudFN1bSB9IGZyb20gJy4uLy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgc3VtIGFsb25nIHNwYXJzZSBzZWdtZW50cyBvZiBhIHRlbnNvci5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYyA9IHRmLnRlbnNvcjJkKFtbMSwyLDMsNF0sIFstMSwtMiwtMywtNF0sIFs1LDYsNyw4XV0pO1xuICogLy8gU2VsZWN0IHR3byByb3dzLCBvbmUgc2VnbWVudC5cbiAqIGNvbnN0IHJlc3VsdDEgPSB0Zi5zcGFyc2Uuc3BhcnNlU2VnbWVudFN1bShjLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGYudGVuc29yMWQoWzAsIDFdLCAnaW50MzInKSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmLnRlbnNvcjFkKFswLCAwXSwgJ2ludDMyJykpO1xuICogcmVzdWx0MS5wcmludCgpOyAvLyBbWzAsIDAsIDAsIDBdXVxuICpcbiAqIC8vIFNlbGVjdCB0d28gcm93cywgdHdvIHNlZ21lbnQuXG4gKiBjb25zdCByZXN1bHQyID0gdGYuc3BhcnNlLnNwYXJzZVNlZ21lbnRTdW0oYyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmLnRlbnNvcjFkKFswLCAxXSwgJ2ludDMyJyksXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Zi50ZW5zb3IxZChbMCwgMV0sICdpbnQzMicpKTtcbiAqIHJlc3VsdDIucHJpbnQoKTsgLy8gW1sxLCAyLCAzLCA0XSwgWy0xLCAtMiwgLTMsIC00XV1cbiAqXG4gKiAvLyBTZWxlY3QgYWxsIHJvd3MsIHR3byBzZWdtZW50cy5cbiAqIGNvbnN0IHJlc3VsdDMgPSB0Zi5zcGFyc2Uuc3BhcnNlU2VnbWVudFN1bShjLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGYudGVuc29yMWQoWzAsIDEsIDJdLCAnaW50MzInKSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmLnRlbnNvcjFkKFswLCAwLCAxXSwgJ2ludDMyJykpO1xuICogcmVzdWx0My5wcmludCgpOyAvLyBbWzAsIDAsIDAsIDBdLCBbNSwgNiwgNywgOF1dXG4gKiBgYGBcbiAqIEBwYXJhbSBkYXRhOiBBIFRlbnNvciBvZiBhdCBsZWFzdCBvbmUgZGltZW5zaW9uIHdpdGggZGF0YSB0aGF0IHdpbGwgYmVcbiAqICAgICBhc3NlbWJsZWQgaW4gdGhlIG91dHB1dC5cbiAqIEBwYXJhbSBpbmRpY2VzOiBBIDEtRCBUZW5zb3Igd2l0aCBpbmRpY2VzIGludG8gZGF0YS4gSGFzIHNhbWUgcmFuayBhc1xuICogICAgIHNlZ21lbnRJZHMuXG4gKiBAcGFyYW0gc2VnbWVudElkczogQSAxLUQgVGVuc29yIHdpdGggaW5kaWNlcyBpbnRvIHRoZSBvdXRwdXQgVGVuc29yLiBWYWx1ZXNcbiAqICAgICBzaG91bGQgYmUgc29ydGVkIGFuZCBjYW4gYmUgcmVwZWF0ZWQuXG4gKiBAcmV0dXJuIEhhcyBzYW1lIHNoYXBlIGFzIGRhdGEsIGV4Y2VwdCBmb3IgZGltZW5zaW9uIDAgd2hpY2ggaGFzIGVxdWFsIHRvXG4gKiAgICAgICAgIHRoZSBudW1iZXIgb2Ygc2VnbWVudHMuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU3BhcnNlJ31cbiAqL1xuZnVuY3Rpb24gc3BhcnNlU2VnbWVudFN1bV8oZGF0YSwgaW5kaWNlcywgc2VnbWVudElkcykge1xuICAgIGNvbnN0ICRkYXRhID0gY29udmVydFRvVGVuc29yKGRhdGEsICdkYXRhJywgJ3NwYXJzZVNlZ21lbnRTdW0nKTtcbiAgICBjb25zdCAkaW5kaWNlcyA9IGNvbnZlcnRUb1RlbnNvcihpbmRpY2VzLCAnaW5kaWNlcycsICdzcGFyc2VTZWdtZW50U3VtJyk7XG4gICAgY29uc3QgJHNlZ21lbnRJZHMgPSBjb252ZXJ0VG9UZW5zb3Ioc2VnbWVudElkcywgJ3NlZ21lbnRJZHMnLCAnc3BhcnNlU2VnbWVudFN1bScpO1xuICAgIGlmICgkZGF0YS5yYW5rIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERhdGEgc2hvdWxkIGJlIGF0IGxlYXN0IDEgZGltZW5zaW9uYWwgYnV0IHJlY2VpdmVkIHNjYWxhcmApO1xuICAgIH1cbiAgICBpZiAoJGluZGljZXMucmFuayAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluZGljZXMgc2hvdWxkIGJlIFRlbnNvcjFEIGJ1dCByZWNlaXZlZCBzaGFwZVxuICAgICAgICAgJHskaW5kaWNlcy5zaGFwZX1gKTtcbiAgICB9XG4gICAgaWYgKCRzZWdtZW50SWRzLnJhbmsgIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZWdtZW50IGlkcyBzaG91bGQgYmUgVGVuc29yMUQgYnV0IHJlY2VpdmVkIHNoYXBlXG4gICAgICAgICAkeyRzZWdtZW50SWRzLnNoYXBlfWApO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dHMgPSB7XG4gICAgICAgIGRhdGE6ICRkYXRhLFxuICAgICAgICBpbmRpY2VzOiAkaW5kaWNlcyxcbiAgICAgICAgc2VnbWVudElkczogJHNlZ21lbnRJZHNcbiAgICB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFNwYXJzZVNlZ21lbnRTdW0sIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3Qgc3BhcnNlU2VnbWVudFN1bSA9IG9wKHsgc3BhcnNlU2VnbWVudFN1bV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zcGFyc2Vfc2VnbWVudF9zdW0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFNwYXJzZVRvRGVuc2UgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0ICogYXMgc3BhcnNlX3RvX2RlbnNlIGZyb20gJy4uL29wcy9zcGFyc2VfdG9fZGVuc2VfdXRpbCc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbnZlcnRzIGEgc3BhcnNlIHJlcHJlc2VudGF0aW9uIGludG8gYSBkZW5zZSB0ZW5zb3IuXG4gKlxuICogQnVpbGRzIGFuIGFycmF5IGRlbnNlIHdpdGggc2hhcGUgb3V0cHV0U2hhcGUgc3VjaCB0aGF0OlxuICpcbiAqIC8vIElmIHNwYXJzZUluZGljZXMgaXMgc2NhbGFyXG4gKiBkZW5zZVtpXSA9IChpID09IHNwYXJzZUluZGljZXMgPyBzcGFyc2VWYWx1ZXMgOiBkZWZhdWx0VmFsdWUpXG4gKlxuICogLy8gSWYgc3BhcnNlSW5kaWNlcyBpcyBhIHZlY3RvciwgdGhlbiBmb3IgZWFjaCBpXG4gKiBkZW5zZVtzcGFyc2VJbmRpY2VzW2ldXSA9IHNwYXJzZVZhbHVlc1tpXVxuICpcbiAqIC8vIElmIHNwYXJzZUluZGljZXMgaXMgYW4gbiBieSBkIG1hdHJpeCwgdGhlbiBmb3IgZWFjaCBpIGluIFswLCBuKVxuICogZGVuc2Vbc3BhcnNlSW5kaWNlc1tpXVswXSwgLi4uLCBzcGFyc2VJbmRpY2VzW2ldW2QtMV1dID0gc3BhcnNlVmFsdWVzW2ldXG4gKiBBbGwgb3RoZXIgdmFsdWVzIGluIGRlbnNlIGFyZSBzZXQgdG8gZGVmYXVsdFZhbHVlLiBJZiBzcGFyc2VWYWx1ZXMgaXMgYVxuICogc2NhbGFyLCBhbGwgc3BhcnNlIGluZGljZXMgYXJlIHNldCB0byB0aGlzIHNpbmdsZSB2YWx1ZS5cbiAqXG4gKiBJZiBpbmRpY2VzIGFyZSByZXBlYXRlZCB0aGUgZmluYWwgdmFsdWUgaXMgc3VtbWVkIG92ZXIgYWxsIHZhbHVlcyBmb3IgdGhvc2VcbiAqIGluZGljZXMuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGluZGljZXMgPSB0Zi50ZW5zb3IxZChbNCwgNSwgNiwgMSwgMiwgM10sICdpbnQzMicpO1xuICogY29uc3QgdmFsdWVzID0gdGYudGVuc29yMWQoWzEwLCAxMSwgMTIsIDEzLCAxNCwgMTVdLCAnZmxvYXQzMicpO1xuICogY29uc3Qgc2hhcGUgPSBbOF07XG4gKiB0Zi5zcGFyc2VUb0RlbnNlKGluZGljZXMsIHZhbHVlcywgc2hhcGUpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gc3BhcnNlSW5kaWNlcyBBIDAtRCwgMS1ELCBvciAyLUQgVGVuc29yIG9mIHR5cGUgaW50MzIuXG4gKiBzcGFyc2VJbmRpY2VzW2ldIGNvbnRhaW5zIHRoZSBjb21wbGV0ZSBpbmRleCB3aGVyZSBzcGFyc2VWYWx1ZXNbaV0gd2lsbCBiZVxuICogcGxhY2VkLlxuICogQHBhcmFtIHNwYXJzZVZhbHVlcyBBIDAtRCBvciAxLUQgVGVuc29yLiBWYWx1ZXNcbiAqIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCByb3cgb2Ygc3BhcnNlSW5kaWNlcywgb3IgYSBzY2FsYXIgdmFsdWUgdG8gYmUgdXNlZCBmb3JcbiAqIGFsbCBzcGFyc2UgaW5kaWNlcy5cbiAqIEBwYXJhbSBvdXRwdXRTaGFwZSBTaGFwZSBvZiB0aGUgZGVuc2Ugb3V0cHV0IHRlbnNvci4gdGhlIHR5cGUgaXMgaW5mZXJyZWQuXG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFNjYWxhci4gVmFsdWUgdG8gc2V0IGZvciBpbmRpY2VzIG5vdCBzcGVjaWZpZWQgaW5cbiAqIHNwYXJzZUluZGljZXMuIERlZmF1bHRzIHRvIHplcm8uXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTm9ybWFsaXphdGlvbid9XG4gKi9cbmZ1bmN0aW9uIHNwYXJzZVRvRGVuc2VfKHNwYXJzZUluZGljZXMsIHNwYXJzZVZhbHVlcywgb3V0cHV0U2hhcGUsIGRlZmF1bHRWYWx1ZSA9IDApIHtcbiAgICBjb25zdCAkc3BhcnNlSW5kaWNlcyA9IGNvbnZlcnRUb1RlbnNvcihzcGFyc2VJbmRpY2VzLCAnc3BhcnNlSW5kaWNlcycsICdzcGFyc2VUb0RlbnNlJywgJ2ludDMyJyk7XG4gICAgY29uc3QgJHNwYXJzZVZhbHVlcyA9IGNvbnZlcnRUb1RlbnNvcihzcGFyc2VWYWx1ZXMsICdzcGFyc2VWYWx1ZXMnLCAnc3BhcnNlVG9EZW5zZScpO1xuICAgIGNvbnN0ICRkZWZhdWx0VmFsdWUgPSBjb252ZXJ0VG9UZW5zb3IoZGVmYXVsdFZhbHVlLCAnZGVmYXVsdFZhbHVlJywgJ3NwYXJzZVRvRGVuc2UnLCAkc3BhcnNlVmFsdWVzLmR0eXBlKTtcbiAgICBzcGFyc2VfdG9fZGVuc2UudmFsaWRhdGVJbnB1dCgkc3BhcnNlSW5kaWNlcywgJHNwYXJzZVZhbHVlcywgb3V0cHV0U2hhcGUsICRkZWZhdWx0VmFsdWUpO1xuICAgIGNvbnN0IGlucHV0cyA9IHtcbiAgICAgICAgc3BhcnNlSW5kaWNlczogJHNwYXJzZUluZGljZXMsXG4gICAgICAgIHNwYXJzZVZhbHVlczogJHNwYXJzZVZhbHVlcyxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiAkZGVmYXVsdFZhbHVlXG4gICAgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgb3V0cHV0U2hhcGUgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChTcGFyc2VUb0RlbnNlLCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBzcGFyc2VUb0RlbnNlID0gb3AoeyBzcGFyc2VUb0RlbnNlXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNwYXJzZV90b19kZW5zZS5qcy5tYXAiLCIvKipcbiAqIFZhbGlkYXRlIHNwYXJzZVRvRGVuc2UgaW5wdXRzLlxuICpcbiAqIEBwYXJhbSBzcGFyc2VJbmRpY2VzIEEgMC1ELCAxLUQsIG9yIDItRCBUZW5zb3Igb2YgdHlwZSBpbnQzMi5cbiAqIHNwYXJzZUluZGljZXNbaV0gY29udGFpbnMgdGhlIGNvbXBsZXRlIGluZGV4IHdoZXJlIHNwYXJzZVZhbHVlc1tpXSB3aWxsIGJlXG4gKiBwbGFjZWQuXG4gKiBAcGFyYW0gc3BhcnNlVmFsdWVzIEEgMC1EIG9yIDEtRCBUZW5zb3IuIFZhbHVlc1xuICogY29ycmVzcG9uZGluZyB0byBlYWNoIHJvdyBvZiBzcGFyc2VJbmRpY2VzLCBvciBhIHNjYWxhciB2YWx1ZSB0byBiZSB1c2VkIGZvclxuICogYWxsIHNwYXJzZSBpbmRpY2VzLlxuICogQHBhcmFtIG91dHB1dFNoYXBlIG51bWJlcltdLiBTaGFwZSBvZiB0aGUgZGVuc2Ugb3V0cHV0IHRlbnNvci5cbiAqIEBwYXJhbSB2YWxpZGF0ZUluZGljZXMgYm9vbGVhbi4gaW5kaWNlIHZhbGlkYXRpb24gaXMgbm90IHN1cHBvcnRlZCwgZXJyb3JcbiAqIHdpbGwgYmUgdGhyb3duIGlmIGl0IGlzIHNldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlSW5wdXQoc3BhcnNlSW5kaWNlcywgc3BhcnNlVmFsdWVzLCBvdXRwdXRTaGFwZSwgZGVmYXVsdFZhbHVlcykge1xuICAgIGlmIChzcGFyc2VJbmRpY2VzLmR0eXBlICE9PSAnaW50MzInKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGYuc3BhcnNlVG9EZW5zZSgpIGV4cGVjdHMgdGhlIGluZGljZXMgdG8gYmUgaW50MzIgdHlwZSwnICtcbiAgICAgICAgICAgIGAgYnV0IHRoZSBkdHlwZSB3YXMgJHtzcGFyc2VJbmRpY2VzLmR0eXBlfS5gKTtcbiAgICB9XG4gICAgaWYgKHNwYXJzZUluZGljZXMucmFuayA+IDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzcGFyc2VJbmRpY2VzIHNob3VsZCBiZSBhIHNjYWxhciwgdmVjdG9yLCBvciBtYXRyaXgsJyArXG4gICAgICAgICAgICBgIGJ1dCBnb3Qgc2hhcGUgJHtzcGFyc2VJbmRpY2VzLnNoYXBlfS5gKTtcbiAgICB9XG4gICAgY29uc3QgbnVtRWxlbXMgPSBzcGFyc2VJbmRpY2VzLnJhbmsgPiAwID8gc3BhcnNlSW5kaWNlcy5zaGFwZVswXSA6IDE7XG4gICAgY29uc3QgbnVtRGltcyA9IHNwYXJzZUluZGljZXMucmFuayA+IDEgPyBzcGFyc2VJbmRpY2VzLnNoYXBlWzFdIDogMTtcbiAgICBpZiAob3V0cHV0U2hhcGUubGVuZ3RoICE9PSBudW1EaW1zKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignb3V0cHV0U2hhcGUgaGFzIGluY29ycmVjdCBudW1iZXIgb2YgZWxlbWVudHM6LCcgK1xuICAgICAgICAgICAgYCAke291dHB1dFNoYXBlLmxlbmd0aH0sIHNob3VsZCBiZTogJHtudW1EaW1zfS5gKTtcbiAgICB9XG4gICAgY29uc3QgbnVtVmFsdWVzID0gc3BhcnNlVmFsdWVzLnNpemU7XG4gICAgaWYgKCEoc3BhcnNlVmFsdWVzLnJhbmsgPT09IDAgfHxcbiAgICAgICAgc3BhcnNlVmFsdWVzLnJhbmsgPT09IDEgJiYgbnVtVmFsdWVzID09PSBudW1FbGVtcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzcGFyc2VWYWx1ZXMgaGFzIGluY29ycmVjdCBzaGFwZSAnICtcbiAgICAgICAgICAgIGAke3NwYXJzZVZhbHVlcy5zaGFwZX0sIHNob3VsZCBiZSBbXSBvciBbJHtudW1FbGVtc31dYCk7XG4gICAgfVxuICAgIGlmIChzcGFyc2VWYWx1ZXMuZHR5cGUgIT09IGRlZmF1bHRWYWx1ZXMuZHR5cGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzcGFyc2VWYWx1ZXMuZHR5cGUgbXVzdCBtYXRjaCBkZWZhdWx0VmFsdWVzLmR0eXBlJyk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3BhcnNlX3RvX2RlbnNlX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IEZGVCB9IGZyb20gJy4uLy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbi8qKlxuICogRmFzdCBGb3VyaWVyIHRyYW5zZm9ybS5cbiAqXG4gKiBDb21wdXRlcyB0aGUgMS1kaW1lbnNpb25hbCBkaXNjcmV0ZSBGb3VyaWVyIHRyYW5zZm9ybSBvdmVyIHRoZSBpbm5lci1tb3N0XG4gKiBkaW1lbnNpb24gb2YgaW5wdXQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHJlYWwgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICogY29uc3QgaW1hZyA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKiBjb25zdCB4ID0gdGYuY29tcGxleChyZWFsLCBpbWFnKTtcbiAqXG4gKiB4LmZmdCgpLnByaW50KCk7ICAvLyB0Zi5zcGVjdHJhbC5mZnQoeCkucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIGlucHV0IFRoZSBjb21wbGV4IGlucHV0IHRvIGNvbXB1dGUgYW4gZmZ0IG92ZXIuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU3BlY3RyYWwnLCBuYW1lc3BhY2U6ICdzcGVjdHJhbCd9XG4gKi9cbmZ1bmN0aW9uIGZmdF8oaW5wdXQpIHtcbiAgICBhc3NlcnQoaW5wdXQuZHR5cGUgPT09ICdjb21wbGV4NjQnLCAoKSA9PiBgVGhlIGR0eXBlIGZvciB0Zi5zcGVjdHJhbC5mZnQoKSBtdXN0IGJlIGNvbXBsZXg2NCBgICtcbiAgICAgICAgYGJ1dCBnb3QgJHtpbnB1dC5kdHlwZX0uYCk7XG4gICAgY29uc3QgaW5wdXRzID0geyBpbnB1dCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEZGVCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBmZnQgPSBvcCh7IGZmdF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mZnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IElGRlQgfSBmcm9tICcuLi8uLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4uL29wZXJhdGlvbic7XG4vKipcbiAqIEludmVyc2UgZmFzdCBGb3VyaWVyIHRyYW5zZm9ybS5cbiAqXG4gKiBDb21wdXRlcyB0aGUgaW52ZXJzZSAxLWRpbWVuc2lvbmFsIGRpc2NyZXRlIEZvdXJpZXIgdHJhbnNmb3JtIG92ZXIgdGhlXG4gKiBpbm5lci1tb3N0IGRpbWVuc2lvbiBvZiBpbnB1dC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgcmVhbCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKiBjb25zdCBpbWFnID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqIGNvbnN0IHggPSB0Zi5jb21wbGV4KHJlYWwsIGltYWcpO1xuICpcbiAqIHguaWZmdCgpLnByaW50KCk7ICAvLyB0Zi5zcGVjdHJhbC5pZmZ0KHgpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSBpbnB1dCBUaGUgY29tcGxleCBpbnB1dCB0byBjb21wdXRlIGFuIGlmZnQgb3Zlci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTcGVjdHJhbCcsIG5hbWVzcGFjZTogJ3NwZWN0cmFsJ31cbiAqL1xuZnVuY3Rpb24gaWZmdF8oaW5wdXQpIHtcbiAgICBhc3NlcnQoaW5wdXQuZHR5cGUgPT09ICdjb21wbGV4NjQnLCAoKSA9PiBgVGhlIGR0eXBlIGZvciB0Zi5zcGVjdHJhbC5pZmZ0KCkgbXVzdCBiZSBjb21wbGV4NjQgYCArXG4gICAgICAgIGBidXQgZ290ICR7aW5wdXQuZHR5cGV9LmApO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgaW5wdXQgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChJRkZULCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGlmZnQgPSBvcCh7IGlmZnRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aWZmdC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjb21wbGV4IH0gZnJvbSAnLi4vY29tcGxleCc7XG5pbXBvcnQgeyBjb25jYXQgfSBmcm9tICcuLi9jb25jYXQnO1xuaW1wb3J0IHsgaW1hZyB9IGZyb20gJy4uL2ltYWcnO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi4vbXVsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlYWwgfSBmcm9tICcuLi9yZWFsJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuLi9yZXNoYXBlJztcbmltcG9ydCB7IHJldmVyc2UgfSBmcm9tICcuLi9yZXZlcnNlJztcbmltcG9ydCB7IHNjYWxhciB9IGZyb20gJy4uL3NjYWxhcic7XG5pbXBvcnQgeyBzbGljZSB9IGZyb20gJy4uL3NsaWNlJztcbmltcG9ydCB7IGlmZnQgfSBmcm9tICcuL2lmZnQnO1xuLyoqXG4gKiBJbnZlcnNlZCByZWFsIHZhbHVlIGlucHV0IGZhc3QgRm91cmllciB0cmFuc2Zvcm0uXG4gKlxuICogQ29tcHV0ZXMgdGhlIDEtZGltZW5zaW9uYWwgaW52ZXJzZWQgZGlzY3JldGUgRm91cmllciB0cmFuc2Zvcm0gb3ZlciB0aGVcbiAqIGlubmVyLW1vc3QgZGltZW5zaW9uIG9mIHRoZSByZWFsIGlucHV0LlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCByZWFsID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqIGNvbnN0IGltYWcgPSB0Zi50ZW5zb3IxZChbMCwgMCwgMF0pO1xuICogY29uc3QgeCA9IHRmLmNvbXBsZXgocmVhbCwgaW1hZyk7XG4gKlxuICogeC5pcmZmdCgpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSBpbnB1dCBUaGUgcmVhbCB2YWx1ZSBpbnB1dCB0byBjb21wdXRlIGFuIGlyZmZ0IG92ZXIuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU3BlY3RyYWwnLCBuYW1lc3BhY2U6ICdzcGVjdHJhbCd9XG4gKi9cbmZ1bmN0aW9uIGlyZmZ0XyhpbnB1dCkge1xuICAgIGNvbnN0IGlubmVyRGltZW5zaW9uU2l6ZSA9IGlucHV0LnNoYXBlW2lucHV0LnNoYXBlLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IGJhdGNoID0gaW5wdXQuc2l6ZSAvIGlubmVyRGltZW5zaW9uU2l6ZTtcbiAgICBsZXQgcmV0O1xuICAgIGlmIChpbm5lckRpbWVuc2lvblNpemUgPD0gMikge1xuICAgICAgICBjb25zdCBjb21wbGV4SW5wdXQgPSByZXNoYXBlKGlucHV0LCBbYmF0Y2gsIGlubmVyRGltZW5zaW9uU2l6ZV0pO1xuICAgICAgICByZXQgPSBpZmZ0KGNvbXBsZXhJbnB1dCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBUaGUgbGVuZ3RoIG9mIHVuaXF1ZSBjb21wb25lbnRzIG9mIHRoZSBERlQgb2YgYSByZWFsLXZhbHVlZCBzaWduYWxcbiAgICAgICAgLy8gaXMgMiAqIChpbnB1dF9sZW4gLSAxKVxuICAgICAgICBjb25zdCBvdXRwdXRTaGFwZSA9IFtiYXRjaCwgMiAqIChpbm5lckRpbWVuc2lvblNpemUgLSAxKV07XG4gICAgICAgIGNvbnN0IHJlYWxJbnB1dCA9IHJlc2hhcGUocmVhbChpbnB1dCksIFtiYXRjaCwgaW5uZXJEaW1lbnNpb25TaXplXSk7XG4gICAgICAgIGNvbnN0IGltYWdJbnB1dCA9IHJlc2hhcGUoaW1hZyhpbnB1dCksIFtiYXRjaCwgaW5uZXJEaW1lbnNpb25TaXplXSk7XG4gICAgICAgIGNvbnN0IHJlYWxDb25qdWdhdGUgPSByZXZlcnNlKHNsaWNlKHJlYWxJbnB1dCwgWzAsIDFdLCBbYmF0Y2gsIGlubmVyRGltZW5zaW9uU2l6ZSAtIDJdKSwgMSk7XG4gICAgICAgIGNvbnN0IGltYWdDb25qdWdhdGUgPSBtdWwocmV2ZXJzZShzbGljZShpbWFnSW5wdXQsIFswLCAxXSwgW2JhdGNoLCBpbm5lckRpbWVuc2lvblNpemUgLSAyXSksIDEpLCBzY2FsYXIoLTEpKTtcbiAgICAgICAgY29uc3QgciA9IGNvbmNhdChbcmVhbElucHV0LCByZWFsQ29uanVnYXRlXSwgMSk7XG4gICAgICAgIGNvbnN0IGkgPSBjb25jYXQoW2ltYWdJbnB1dCwgaW1hZ0Nvbmp1Z2F0ZV0sIDEpO1xuICAgICAgICBjb25zdCBjb21wbGV4SW5wdXQgPSByZXNoYXBlKGNvbXBsZXgociwgaSksIFtvdXRwdXRTaGFwZVswXSwgb3V0cHV0U2hhcGVbMV1dKTtcbiAgICAgICAgcmV0ID0gaWZmdChjb21wbGV4SW5wdXQpO1xuICAgIH1cbiAgICByZXQgPSByZWFsKHJldCk7XG4gICAgLy8gcmVzaGFwZSB0aGUgcmVzdWx0IGlmIHRoZSBpbnB1dCBpcyAzRCB0ZW5zb3IuXG4gICAgaWYgKGlucHV0LnJhbmsgPT09IDMgJiYgaW5wdXQuc2hhcGVbMF0gIT09IDApIHtcbiAgICAgICAgY29uc3QgdGVtcCA9IHJldDtcbiAgICAgICAgY29uc3QgYmF0Y2ggPSBpbnB1dC5zaGFwZVswXTtcbiAgICAgICAgcmV0ID0gcmVzaGFwZShyZXQsIFtiYXRjaCwgcmV0LnNoYXBlWzBdIC8gYmF0Y2gsIHJldC5zaGFwZVsxXV0pO1xuICAgICAgICB0ZW1wLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn1cbmV4cG9ydCBjb25zdCBpcmZmdCA9IG9wKHsgaXJmZnRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXJmZnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgeyBjb21wbGV4IH0gZnJvbSAnLi4vY29tcGxleCc7XG5pbXBvcnQgeyBjb25jYXQgfSBmcm9tICcuLi9jb25jYXQnO1xuaW1wb3J0IHsgaW1hZyB9IGZyb20gJy4uL2ltYWcnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVhbCB9IGZyb20gJy4uL3JlYWwnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4uL3Jlc2hhcGUnO1xuaW1wb3J0IHsgc2xpY2UgfSBmcm9tICcuLi9zbGljZSc7XG5pbXBvcnQgeyBzcGxpdCB9IGZyb20gJy4uL3NwbGl0JztcbmltcG9ydCB7IHplcm9zIH0gZnJvbSAnLi4vemVyb3MnO1xuaW1wb3J0IHsgemVyb3NMaWtlIH0gZnJvbSAnLi4vemVyb3NfbGlrZSc7XG5pbXBvcnQgeyBmZnQgfSBmcm9tICcuL2ZmdCc7XG4vKipcbiAqIFJlYWwgdmFsdWUgaW5wdXQgZmFzdCBGb3VyaWVyIHRyYW5zZm9ybS5cbiAqXG4gKiBDb21wdXRlcyB0aGUgMS1kaW1lbnNpb25hbCBkaXNjcmV0ZSBGb3VyaWVyIHRyYW5zZm9ybSBvdmVyIHRoZVxuICogaW5uZXItbW9zdCBkaW1lbnNpb24gb2YgdGhlIHJlYWwgaW5wdXQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHJlYWwgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICpcbiAqIHJlYWwucmZmdCgpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSBpbnB1dCBUaGUgcmVhbCB2YWx1ZSBpbnB1dCB0byBjb21wdXRlIGFuIHJmZnQgb3Zlci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTcGVjdHJhbCcsIG5hbWVzcGFjZTogJ3NwZWN0cmFsJ31cbiAqL1xuZnVuY3Rpb24gcmZmdF8oaW5wdXQsIGZmdExlbmd0aCkge1xuICAgIGFzc2VydChpbnB1dC5kdHlwZSA9PT0gJ2Zsb2F0MzInLCAoKSA9PiBgVGhlIGR0eXBlIGZvciByZmZ0KCkgbXVzdCBiZSByZWFsIHZhbHVlIGJ1dCBnb3QgJHtpbnB1dC5kdHlwZX1gKTtcbiAgICBsZXQgaW5uZXJEaW1lbnNpb25TaXplID0gaW5wdXQuc2hhcGVbaW5wdXQuc2hhcGUubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgYmF0Y2ggPSBpbnB1dC5zaXplIC8gaW5uZXJEaW1lbnNpb25TaXplO1xuICAgIGxldCBhZGp1c3RlZElucHV0O1xuICAgIGlmIChmZnRMZW5ndGggIT0gbnVsbCAmJiBmZnRMZW5ndGggPCBpbm5lckRpbWVuc2lvblNpemUpIHtcbiAgICAgICAgLy8gTmVlZCB0byBjcm9wXG4gICAgICAgIGNvbnN0IGJlZ2luID0gaW5wdXQuc2hhcGUubWFwKHYgPT4gMCk7XG4gICAgICAgIGNvbnN0IHNpemUgPSBpbnB1dC5zaGFwZS5tYXAodiA9PiB2KTtcbiAgICAgICAgc2l6ZVtpbnB1dC5zaGFwZS5sZW5ndGggLSAxXSA9IGZmdExlbmd0aDtcbiAgICAgICAgYWRqdXN0ZWRJbnB1dCA9IHNsaWNlKGlucHV0LCBiZWdpbiwgc2l6ZSk7XG4gICAgICAgIGlubmVyRGltZW5zaW9uU2l6ZSA9IGZmdExlbmd0aDtcbiAgICB9XG4gICAgZWxzZSBpZiAoZmZ0TGVuZ3RoICE9IG51bGwgJiYgZmZ0TGVuZ3RoID4gaW5uZXJEaW1lbnNpb25TaXplKSB7XG4gICAgICAgIC8vIE5lZWQgdG8gcGFkIHdpdGggemVyb3NcbiAgICAgICAgY29uc3QgemVyb3NTaGFwZSA9IGlucHV0LnNoYXBlLm1hcCh2ID0+IHYpO1xuICAgICAgICB6ZXJvc1NoYXBlW2lucHV0LnNoYXBlLmxlbmd0aCAtIDFdID0gZmZ0TGVuZ3RoIC0gaW5uZXJEaW1lbnNpb25TaXplO1xuICAgICAgICBhZGp1c3RlZElucHV0ID0gY29uY2F0KFtpbnB1dCwgemVyb3MoemVyb3NTaGFwZSldLCBpbnB1dC5zaGFwZS5sZW5ndGggLSAxKTtcbiAgICAgICAgaW5uZXJEaW1lbnNpb25TaXplID0gZmZ0TGVuZ3RoO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgYWRqdXN0ZWRJbnB1dCA9IGlucHV0O1xuICAgIH1cbiAgICAvLyBDb21wbGVtZW50IHRoZSBpbnB1dCB3aXRoIHplcm8gaW1hZ2luYXJ5IG51bWJlcnMuXG4gICAgY29uc3QgemVyb3NJbnB1dCA9IHplcm9zTGlrZShhZGp1c3RlZElucHV0KTtcbiAgICBjb25zdCBjb21wbGV4SW5wdXQgPSByZXNoYXBlKGNvbXBsZXgoYWRqdXN0ZWRJbnB1dCwgemVyb3NJbnB1dCksIFtiYXRjaCwgaW5uZXJEaW1lbnNpb25TaXplXSk7XG4gICAgY29uc3QgcmV0ID0gZmZ0KGNvbXBsZXhJbnB1dCk7XG4gICAgLy8gRXhjbHVkZSBjb21wbGV4IGNvbmp1Z2F0aW9ucy4gVGhlc2UgY29uanVnYXRpb25zIGFyZSBwdXQgc3ltbWV0cmljYWxseS5cbiAgICBjb25zdCBoYWxmID0gTWF0aC5mbG9vcihpbm5lckRpbWVuc2lvblNpemUgLyAyKSArIDE7XG4gICAgY29uc3QgcmVhbFZhbHVlcyA9IHJlYWwocmV0KTtcbiAgICBjb25zdCBpbWFnVmFsdWVzID0gaW1hZyhyZXQpO1xuICAgIGNvbnN0IHJlYWxDb21wbGV4Q29uanVnYXRlID0gc3BsaXQocmVhbFZhbHVlcywgW2hhbGYsIGlubmVyRGltZW5zaW9uU2l6ZSAtIGhhbGZdLCByZWFsVmFsdWVzLnNoYXBlLmxlbmd0aCAtIDEpO1xuICAgIGNvbnN0IGltYWdDb21wbGV4Q29uanVnYXRlID0gc3BsaXQoaW1hZ1ZhbHVlcywgW2hhbGYsIGlubmVyRGltZW5zaW9uU2l6ZSAtIGhhbGZdLCBpbWFnVmFsdWVzLnNoYXBlLmxlbmd0aCAtIDEpO1xuICAgIGNvbnN0IG91dHB1dFNoYXBlID0gYWRqdXN0ZWRJbnB1dC5zaGFwZS5zbGljZSgpO1xuICAgIG91dHB1dFNoYXBlW2FkanVzdGVkSW5wdXQuc2hhcGUubGVuZ3RoIC0gMV0gPSBoYWxmO1xuICAgIHJldHVybiByZXNoYXBlKGNvbXBsZXgocmVhbENvbXBsZXhDb25qdWdhdGVbMF0sIGltYWdDb21wbGV4Q29uanVnYXRlWzBdKSwgb3V0cHV0U2hhcGUpO1xufVxuZXhwb3J0IGNvbnN0IHJmZnQgPSBvcCh7IHJmZnRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmZmdC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgU3BsaXRWIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogU3BsaXRzIGEgYHRmLlRlbnNvcmAgaW50byBzdWIgdGVuc29ycy5cbiAqXG4gKiBJZiBgbnVtT3JTaXplU3BsaXRzYCBpcyBhIG51bWJlciwgc3BsaXRzIGB4YCBhbG9uZyBkaW1lbnNpb24gYGF4aXNgXG4gKiBpbnRvIGBudW1PclNpemVTcGxpdHNgIHNtYWxsZXIgdGVuc29ycy5cbiAqIFJlcXVpcmVzIHRoYXQgYG51bU9yU2l6ZVNwbGl0c2AgZXZlbmx5IGRpdmlkZXMgYHguc2hhcGVbYXhpc11gLlxuICpcbiAqIElmIGBudW1PclNpemVTcGxpdHNgIGlzIGEgbnVtYmVyIGFycmF5LCBzcGxpdHMgYHhgIGludG9cbiAqIGBudW1PclNpemVTcGxpdHMubGVuZ3RoYCBwaWVjZXMuIFRoZSBzaGFwZSBvZiB0aGUgYGlgLXRoIHBpZWNlIGhhcyB0aGVcbiAqIHNhbWUgc2l6ZSBhcyBgeGAgZXhjZXB0IGFsb25nIGRpbWVuc2lvbiBgYXhpc2Agd2hlcmUgdGhlIHNpemUgaXNcbiAqIGBudW1PclNpemVTcGxpdHNbaV1gLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDhdLCBbMiwgNF0pO1xuICogY29uc3QgW2EsIGJdID0gdGYuc3BsaXQoeCwgMiwgMSk7XG4gKiBhLnByaW50KCk7XG4gKiBiLnByaW50KCk7XG4gKlxuICogY29uc3QgW2MsIGQsIGVdID0gdGYuc3BsaXQoeCwgWzEsIDIsIDFdLCAxKTtcbiAqIGMucHJpbnQoKTtcbiAqIGQucHJpbnQoKTtcbiAqIGUucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IgdG8gc3BsaXQuXG4gKiBAcGFyYW0gbnVtT3JTaXplU3BsaXRzIEVpdGhlciBhbiBpbnRlZ2VyIGluZGljYXRpbmcgdGhlIG51bWJlciBvZlxuICogc3BsaXRzIGFsb25nIHRoZSBheGlzIG9yIGFuIGFycmF5IG9mIGludGVnZXJzIGNvbnRhaW5pbmcgdGhlIHNpemVzIG9mXG4gKiBlYWNoIG91dHB1dCB0ZW5zb3IgYWxvbmcgdGhlIGF4aXMuIElmIGEgbnVtYmVyIHRoZW4gaXQgbXVzdCBldmVubHkgZGl2aWRlXG4gKiBgeC5zaGFwZVtheGlzXWA7IG90aGVyd2lzZSB0aGUgc3VtIG9mIHNpemVzIG11c3QgbWF0Y2ggYHguc2hhcGVbYXhpc11gLlxuICogQ2FuIGNvbnRhaW4gb25lIC0xIGluZGljYXRpbmcgdGhhdCBkaW1lbnNpb24gaXMgdG8gYmUgaW5mZXJyZWQuXG4gKiBAcGFyYW0gYXhpcyBUaGUgZGltZW5zaW9uIGFsb25nIHdoaWNoIHRvIHNwbGl0LiBEZWZhdWx0cyB0byAwICh0aGUgZmlyc3RcbiAqIGRpbSkuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnU2xpY2luZyBhbmQgSm9pbmluZyd9XG4gKi9cbmZ1bmN0aW9uIHNwbGl0Xyh4LCBudW1PclNpemVTcGxpdHMsIGF4aXMgPSAwKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc3BsaXQnKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgY29uc3QgYXR0ciA9IHsgbnVtT3JTaXplU3BsaXRzLCBheGlzIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoU3BsaXRWLCBpbnB1dHMsIGF0dHIpO1xufVxuZXhwb3J0IGNvbnN0IHNwbGl0ID0gb3AoeyBzcGxpdF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zcGxpdC5qcy5tYXAiLCJpbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsJztcbi8qKlxuICogUHJlcGFyZSB0aGUgc3BsaXQgc2l6ZSBhcnJheS4gV2hlbiB0aGUgaW5wdXQgaXMgYSBudW1iZXIsIHRoZSBheGlzIGlzIGV2ZW5seVxuICogZGl2aWRlZCBhbW9uZyB0aGUgc3BsaXQgc2l6ZS4gV2hlbiB0aGUgaW5wdXQgY29udGFpbnMgdGhlIG5lZ2F0aXZlIHZhbHVlLCB0aGVcbiAqIHJlc3Qgb2YgdGhlIGF4aXMgaXMgYWxsb2NhdGVkIHRvd2FyZCB0aGF0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZVNwbGl0U2l6ZSh4LCBudW1PclNpemVTcGxpdHMsIGF4aXMgPSAwKSB7XG4gICAgbGV0IHNwbGl0U2l6ZXMgPSBbXTtcbiAgICBpZiAodHlwZW9mIChudW1PclNpemVTcGxpdHMpID09PSAnbnVtYmVyJykge1xuICAgICAgICBhc3NlcnQoeC5zaGFwZVtheGlzXSAlIG51bU9yU2l6ZVNwbGl0cyA9PT0gMCwgKCkgPT4gJ051bWJlciBvZiBzcGxpdHMgbXVzdCBldmVubHkgZGl2aWRlIHRoZSBheGlzLicpO1xuICAgICAgICBzcGxpdFNpemVzID1cbiAgICAgICAgICAgIG5ldyBBcnJheShudW1PclNpemVTcGxpdHMpLmZpbGwoeC5zaGFwZVtheGlzXSAvIG51bU9yU2l6ZVNwbGl0cyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBudW1PZk5lZ3MgPSBudW1PclNpemVTcGxpdHMucmVkdWNlKChjb3VudCwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjb3VudCArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvdW50O1xuICAgICAgICB9LCAwKTtcbiAgICAgICAgYXNzZXJ0KG51bU9mTmVncyA8PSAxLCAoKSA9PiAnVGhlcmUgc2hvdWxkIGJlIG9ubHkgb25lIG5lZ2F0aXZlIHZhbHVlIGluIHNwbGl0IGFycmF5LicpO1xuICAgICAgICBjb25zdCBuZWdJbmRleCA9IG51bU9yU2l6ZVNwbGl0cy5pbmRleE9mKC0xKTtcbiAgICAgICAgLy8gQWxsb3cgdGhlIG51bWJlciBvZiBzcGxpdCBhcnJheSB0byBiZSAtMSwgd2hpY2ggaW5kaWNhdGVzIHRoZSByZXN0XG4gICAgICAgIC8vIG9mIGRpbWVuc2lvbiBpcyBhbGxvY2F0ZWQgdG8gdGhhdCBzcGxpdC5cbiAgICAgICAgaWYgKG5lZ0luZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgY29uc3QgdG90YWwgPSBudW1PclNpemVTcGxpdHMucmVkdWNlKChhLCBiKSA9PiBiID4gMCA/IGEgKyBiIDogYSk7XG4gICAgICAgICAgICBudW1PclNpemVTcGxpdHNbbmVnSW5kZXhdID0geC5zaGFwZVtheGlzXSAtIHRvdGFsO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydCh4LnNoYXBlW2F4aXNdID09PSBudW1PclNpemVTcGxpdHMucmVkdWNlKChhLCBiKSA9PiBhICsgYiksICgpID0+ICdUaGUgc3VtIG9mIHNpemVzIG11c3QgbWF0Y2ggdGhlIHNpemUgb2YgdGhlIGF4aXMgZGltZW5zaW9uLicpO1xuICAgICAgICBzcGxpdFNpemVzID0gbnVtT3JTaXplU3BsaXRzO1xuICAgIH1cbiAgICByZXR1cm4gc3BsaXRTaXplcztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNwbGl0X3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFNxcnQgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBzcXVhcmUgcm9vdCBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOiBgeSA9IHNxcnQoeClgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgNCwgLTFdKTtcbiAqXG4gKiB4LnNxcnQoKS5wcmludCgpOyAgLy8gb3IgdGYuc3FydCh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBzcXJ0Xyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc3FydCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChTcXJ0LCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IHNxcnQgPSBvcCh7IHNxcnRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3FydC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBzcXVhcmUgb2YgYHhgIGVsZW1lbnQtd2lzZTogYHggXiAyYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIE1hdGguc3FydCgyKSwgLTFdKTtcbiAqXG4gKiB4LnNxdWFyZSgpLnByaW50KCk7ICAvLyBvciB0Zi5zcXVhcmUoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IFRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gc3F1YXJlXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc3F1YXJlJyk7XG4gICAgY29uc3QgYXR0cnMgPSB7fTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbCgnU3F1YXJlJywgeyB4OiAkeCB9LCBhdHRycyk7XG59XG5leHBvcnQgY29uc3Qgc3F1YXJlID0gb3AoeyBzcXVhcmVfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3F1YXJlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBTcXVhcmVkRGlmZmVyZW5jZSB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBtYWtlVHlwZXNNYXRjaCB9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSB9IGZyb20gJy4vYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIFJldHVybnMgKGEgLSBiKSAqIChhIC0gYikgZWxlbWVudC13aXNlLlxuICogU3VwcG9ydHMgYnJvYWRjYXN0aW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDQsIDMsIDE2XSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzEsIDIsIDksIDRdKTtcbiAqXG4gKiBhLnNxdWFyZWREaWZmZXJlbmNlKGIpLnByaW50KCk7ICAvLyBvciB0Zi5zcXVhcmVkRGlmZmVyZW5jZShhLCBiKVxuICogYGBgXG4gKlxuICogYGBganNcbiAqIC8vIEJyb2FkY2FzdCBzcXVhcmVkIGRpZmZlcmVuY2UgIGEgd2l0aCBiLlxuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsyLCA0LCA2LCA4XSk7XG4gKiBjb25zdCBiID0gdGYuc2NhbGFyKDUpO1xuICpcbiAqIGEuc3F1YXJlZERpZmZlcmVuY2UoYikucHJpbnQoKTsgIC8vIG9yIHRmLnNxdWFyZWREaWZmZXJlbmNlKGEsIGIpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYSBUaGUgZmlyc3QgdGVuc29yLlxuICogQHBhcmFtIGIgVGhlIHNlY29uZCB0ZW5zb3IuIE11c3QgaGF2ZSB0aGUgc2FtZSB0eXBlIGFzIGBhYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdBcml0aG1ldGljJ31cbiAqL1xuZnVuY3Rpb24gc3F1YXJlZERpZmZlcmVuY2VfKGEsIGIpIHtcbiAgICBsZXQgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnc3F1YXJlZERpZmZlcmVuY2UnKTtcbiAgICBsZXQgJGIgPSBjb252ZXJ0VG9UZW5zb3IoYiwgJ2InLCAnc3F1YXJlZERpZmZlcmVuY2UnKTtcbiAgICBbJGEsICRiXSA9IG1ha2VUeXBlc01hdGNoKCRhLCAkYik7XG4gICAgYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoJGEuc2hhcGUsICRiLnNoYXBlKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGE6ICRhLCBiOiAkYiB9O1xuICAgIGNvbnN0IGF0dHJzID0ge307XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoU3F1YXJlZERpZmZlcmVuY2UsIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IHNxdWFyZWREaWZmZXJlbmNlID0gb3AoeyBzcXVhcmVkRGlmZmVyZW5jZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zcXVhcmVkX2RpZmZlcmVuY2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IHNxdWVlemVTaGFwZSB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbi8qKlxuICogUmVtb3ZlcyBkaW1lbnNpb25zIG9mIHNpemUgMSBmcm9tIHRoZSBzaGFwZSBvZiBhIGB0Zi5UZW5zb3JgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yKFsxLCAyLCAzLCA0XSwgWzEsIDEsIDRdKTtcbiAqIHguc3F1ZWV6ZSgpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yIHRvIGJlIHNxdWVlemVkLlxuICogQHBhcmFtIGF4aXMgQW4gb3B0aW9uYWwgbGlzdCBvZiBudW1iZXJzLiBJZiBzcGVjaWZpZWQsIG9ubHlcbiAqICAgICBzcXVlZXplcyB0aGUgZGltZW5zaW9ucyBsaXN0ZWQuIFRoZSBkaW1lbnNpb24gaW5kZXggc3RhcnRzIGF0IDAuIEl0XG4gKiBpcyBhbiBlcnJvciB0byBzcXVlZXplIGEgZGltZW5zaW9uIHRoYXQgaXMgbm90IDEuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnVHJhbnNmb3JtYXRpb25zJ31cbiAqL1xuZnVuY3Rpb24gc3F1ZWV6ZV8oeCwgYXhpcykge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3NxdWVlemUnKTtcbiAgICByZXR1cm4gcmVzaGFwZSgkeCwgc3F1ZWV6ZVNoYXBlKCR4LnNoYXBlLCBheGlzKS5uZXdTaGFwZSk7XG59XG5leHBvcnQgY29uc3Qgc3F1ZWV6ZSA9IG9wKHsgc3F1ZWV6ZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zcXVlZXplLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBQYWNrIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvckFycmF5IH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogU3RhY2tzIGEgbGlzdCBvZiByYW5rLWBSYCBgdGYuVGVuc29yYHMgaW50byBvbmUgcmFuay1gKFIrMSlgIGB0Zi5UZW5zb3JgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDJdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbMywgNF0pO1xuICogY29uc3QgYyA9IHRmLnRlbnNvcjFkKFs1LCA2XSk7XG4gKiB0Zi5zdGFjayhbYSwgYiwgY10pLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdGVuc29ycyBBIGxpc3Qgb2YgdGVuc29yIG9iamVjdHMgd2l0aCB0aGUgc2FtZSBzaGFwZSBhbmQgZHR5cGUuXG4gKiBAcGFyYW0gYXhpcyBUaGUgYXhpcyB0byBzdGFjayBhbG9uZy4gRGVmYXVsdHMgdG8gMCAodGhlIGZpcnN0IGRpbSkuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnU2xpY2luZyBhbmQgSm9pbmluZyd9XG4gKi9cbmZ1bmN0aW9uIHN0YWNrXyh0ZW5zb3JzLCBheGlzID0gMCkge1xuICAgIGNvbnN0ICR0ZW5zb3JzID0gY29udmVydFRvVGVuc29yQXJyYXkodGVuc29ycywgJ3RlbnNvcnMnLCAnc3RhY2snLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgICB1dGlsLmFzc2VydCgkdGVuc29ycy5sZW5ndGggPj0gMSwgKCkgPT4gJ1Bhc3MgYXQgbGVhc3Qgb25lIHRlbnNvciB0byB0Zi5zdGFjaycpO1xuICAgIGlmICgkdGVuc29ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KGF4aXMgPD0gJHRlbnNvcnNbMF0ucmFuaywgKCkgPT4gJ0F4aXMgbXVzdCBiZSA8PSByYW5rIG9mIHRoZSB0ZW5zb3InKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0gJHRlbnNvcnM7XG4gICAgY29uc3QgYXR0cnMgPSB7IGF4aXMgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChQYWNrLCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBzdGFjayA9IG9wKHsgc3RhY2tfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RhY2suanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFN0ZXAgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBzdGVwIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6IGB4ID4gMCA/IDEgOiBhbHBoYSAqIHhgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMCwgMiwgLTEsIC0zXSk7XG4gKlxuICogeC5zdGVwKC41KS5wcmludCgpOyAgLy8gb3IgdGYuc3RlcCh4LCAuNSlcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBhbHBoYSBUaGUgZ3JhZGllbnQgd2hlbiBpbnB1dCBpcyBuZWdhdGl2ZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gc3RlcF8oeCwgYWxwaGEgPSAwLjApIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzdGVwJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBhbHBoYSB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFN0ZXAsIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IHN0ZXAgPSBvcCh7IHN0ZXBfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RlcC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgU3RyaWRlZFNsaWNlIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogRXh0cmFjdHMgYSBzdHJpZGVkIHNsaWNlIG9mIGEgdGVuc29yLlxuICpcbiAqIFJvdWdobHkgc3BlYWtpbmcsIHRoaXMgb3AgZXh0cmFjdHMgYSBzbGljZSBvZiBzaXplIChlbmQtYmVnaW4pL3N0cmlkZSBmcm9tXG4gKiB0aGUgZ2l2ZW4gaW5wdXQgdGVuc29yICh4KS4gU3RhcnRpbmcgYXQgdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBieSBiZWdpbiB0aGVcbiAqIHNsaWNlIGNvbnRpbnVlcyBieSBhZGRpbmcgc3RyaWRlIHRvIHRoZSBpbmRleCB1bnRpbCBhbGwgZGltZW5zaW9ucyBhcmUgbm90XG4gKiBsZXNzIHRoYW4gZW5kLiBOb3RlIHRoYXQgYSBzdHJpZGUgY2FuIGJlIG5lZ2F0aXZlLCB3aGljaCBjYXVzZXMgYSByZXZlcnNlXG4gKiBzbGljZS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgdCA9IHRmLnRlbnNvcjNkKFsxLCAxLCAxICwyLCAyLCAyLCAzLCAzLCAzLCA0LCA0LCA0LCA1LCA1LCA1LCA2LCA2LCA2XSxcbiAqICAgIFszLCAyLCAzXSk7XG4gKiB0LnN0cmlkZWRTbGljZShbMSwgMCwgMF0sIFsyLCAxLCAzXSwgWzEsIDEsIDFdKS5wcmludCgpICAvLyBbW1szLCAzLCAzXV1dXG4gKiB0LnN0cmlkZWRTbGljZShbMSwgMCwgMF0sIFsyLCAyLCAzXSwgWzEsIDEsIDFdKS5wcmludCgpICAvLyBbW1szLCAzLCAzXSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBbNCwgNCwgNF1dXVxuICogdC5zdHJpZGVkU2xpY2UoWzEsIC0xLCAwXSwgWzIsIC0zLCAzXSwgWzEsIC0xLCAxXSkucHJpbnQoKSAvLyBbW1s0LCA0LCA0XSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBbMywgMywgM11dXVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIHRlbnNvciB0byBzdHJpZGUgc2xpY2UuXG4gKiBAcGFyYW0gYmVnaW4gVGhlIGNvb3JkaW5hdGVzIHRvIHN0YXJ0IHRoZSBzbGljZSBmcm9tLlxuICogQHBhcmFtIGVuZDogVGhlIGNvb3JkaW5hdGVzIHRvIGVuZCB0aGUgc2xpY2UgYXQuXG4gKiBAcGFyYW0gc3RyaWRlczogVGhlIHNpemUgb2YgdGhlIHNsaWNlLlxuICogQHBhcmFtIGJlZ2luTWFzazogSWYgdGhlIGl0aCBiaXQgb2YgYmVnaW5NYXNrIGlzIHNldCwgYmVnaW5baV0gaXMgaWdub3JlZFxuICogICAgICBhbmQgdGhlIGZ1bGxlc3QgcG9zc2libGUgcmFuZ2UgaW4gdGhhdCBkaW1lbnNpb24gaXMgdXNlZCBpbnN0ZWFkLlxuICogQHBhcmFtIGVuZE1hc2s6IElmIHRoZSBpdGggYml0IG9mIGVuZE1hc2sgaXMgc2V0LCBlbmRbaV0gaXMgaWdub3JlZFxuICogICAgICBhbmQgdGhlIGZ1bGxlc3QgcG9zc2libGUgcmFuZ2UgaW4gdGhhdCBkaW1lbnNpb24gaXMgdXNlZCBpbnN0ZWFkLlxuICogQHBhcmFtIHNocmlua0F4aXNNYXNrOiBhIGJpdG1hc2sgd2hlcmUgYml0IGkgaW1wbGllcyB0aGF0XG4gKiB0aGUgaXRoIHNwZWNpZmljYXRpb24gc2hvdWxkIHNocmluayB0aGUgZGltZW5zaW9uYWxpdHkuIGJlZ2luIGFuZCBlbmQgbXVzdFxuICogaW1wbHkgYSBzbGljZSBvZiBzaXplIDEgaW4gdGhlIGRpbWVuc2lvbi5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTbGljaW5nIGFuZCBKb2luaW5nJ31cbiAqL1xuZnVuY3Rpb24gc3RyaWRlZFNsaWNlXyh4LCBiZWdpbiwgZW5kLCBzdHJpZGVzLCBiZWdpbk1hc2sgPSAwLCBlbmRNYXNrID0gMCwgZWxsaXBzaXNNYXNrID0gMCwgbmV3QXhpc01hc2sgPSAwLCBzaHJpbmtBeGlzTWFzayA9IDApIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzdHJpZGVkU2xpY2UnLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgY29uc3QgYXR0cnMgPSB7XG4gICAgICAgIGJlZ2luLFxuICAgICAgICBlbmQsXG4gICAgICAgIHN0cmlkZXMsXG4gICAgICAgIGJlZ2luTWFzayxcbiAgICAgICAgZW5kTWFzayxcbiAgICAgICAgZWxsaXBzaXNNYXNrLFxuICAgICAgICBuZXdBeGlzTWFzayxcbiAgICAgICAgc2hyaW5rQXhpc01hc2tcbiAgICB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFN0cmlkZWRTbGljZSwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3Qgc3RyaWRlZFNsaWNlID0gb3AoeyBzdHJpZGVkU2xpY2VfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RyaWRlZF9zbGljZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgU3RyaW5nTkdyYW1zIH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4uL29wZXJhdGlvbic7XG4vKipcbiAqIENyZWF0ZXMgbmdyYW1zIGZyb20gcmFnZ2VkIHN0cmluZyBkYXRhLlxuICpcbiAqIFRoaXMgb3AgYWNjZXB0cyBhIHJhZ2dlZCB0ZW5zb3Igd2l0aCAxIHJhZ2dlZCBkaW1lbnNpb24gY29udGFpbmluZyBvbmx5XG4gKiBzdHJpbmdzIGFuZCBvdXRwdXRzIGEgcmFnZ2VkIHRlbnNvciB3aXRoIDEgcmFnZ2VkIGRpbWVuc2lvbiBjb250YWluaW5nIG5ncmFtc1xuICogb2YgdGhhdCBzdHJpbmcsIGpvaW5lZCBhbG9uZyB0aGUgaW5uZXJtb3N0IGF4aXMuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHJlc3VsdCA9IHRmLnN0cmluZy5zdHJpbmdOR3JhbXMoXG4gKiAgIFsnYScsICdiJywgJ2MnLCAnZCddLCB0Zi50ZW5zb3IxZChbMCwgMiwgNF0sICdpbnQzMicpLFxuICogICAnfCcsIFsxLCAyXSwgJ0xQJywgJ1JQJywgLTEsIGZhbHNlKTtcbiAqIHJlc3VsdFsnbkdyYW1zJ10ucHJpbnQoKTsgLy8gWydhJywgJ2InLCAnTFB8YScsICdhfGInLCAnYnxSUCcsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAnYycsICdkJywgJ0xQfGMnLCAnY3xkJywgJ2R8UlAnXVxuICogcmVzdWx0WyduR3JhbXNTcGxpdHMnXS5wcmludCgpOyAvLyBbMCwgNSwgMTBdXG4gKiBgYGBcbiAqIEBwYXJhbSBkYXRhOiBUaGUgdmFsdWVzIHRlbnNvciBvZiB0aGUgcmFnZ2VkIHN0cmluZyB0ZW5zb3IgdG8gbWFrZSBuZ3JhbXMgb3V0XG4gKiAgICAgb2YuIE11c3QgYmUgYSAxRCBzdHJpbmcgdGVuc29yLlxuICogQHBhcmFtIGRhdGFTcGxpdHM6IFRoZSBzcGxpdHMgdGVuc29yIG9mIHRoZSByYWdnZWQgc3RyaW5nIHRlbnNvciB0byBtYWtlXG4gKiAgICAgbmdyYW1zIG91dCBvZi5cbiAqIEBwYXJhbSBzZXBhcmF0b3I6IFRoZSBzdHJpbmcgdG8gYXBwZW5kIGJldHdlZW4gZWxlbWVudHMgb2YgdGhlIHRva2VuLiBVc2UgXCJcIlxuICogICAgIGZvciBubyBzZXBhcmF0b3IuXG4gKiBAcGFyYW0gbkdyYW1XaWR0aHM6IFRoZSBzaXplcyBvZiB0aGUgbmdyYW1zIHRvIGNyZWF0ZS5cbiAqIEBwYXJhbSBsZWZ0UGFkOiBUaGUgc3RyaW5nIHRvIHVzZSB0byBwYWQgdGhlIGxlZnQgc2lkZSBvZiB0aGUgbmdyYW0gc2VxdWVuY2UuXG4gKiAgICAgT25seSB1c2VkIGlmIHBhZF93aWR0aCAhPT0gMC5cbiAqIEBwYXJhbSByaWdodFBhZDogVGhlIHN0cmluZyB0byB1c2UgdG8gcGFkIHRoZSByaWdodCBzaWRlIG9mIHRoZSBuZ3JhbVxuICogICAgIHNlcXVlbmNlLiBPbmx5IHVzZWQgaWYgcGFkX3dpZHRoICE9PSAwLlxuICogQHBhcmFtIHBhZFdpZHRoOiBUaGUgbnVtYmVyIG9mIHBhZGRpbmcgZWxlbWVudHMgdG8gYWRkIHRvIGVhY2ggc2lkZSBvZiBlYWNoXG4gKiAgICAgc2VxdWVuY2UuIE5vdGUgdGhhdCBwYWRkaW5nIHdpbGwgbmV2ZXIgYmUgZ3JlYXRlciB0aGFuIGBuR3JhbVdpZHRoc2AtMVxuICogICAgIHJlZ2FyZGxlc3Mgb2YgdGhpcyB2YWx1ZS4gSWYgYHBhZFdpZHRoYD0tMSAsIHRoZW4gYWRkIG1heChgbkdyYW1XaWR0aHMpLTFcbiAqICAgICBlbGVtZW50cy5cbiAqIEBwYXJhbSBwcmVzZXJ2ZVNob3J0U2VxdWVuY2VzOiBJZiB0cnVlLCB0aGVuIGVuc3VyZSB0aGF0IGF0IGxlYXN0IG9uZSBuZ3JhbVxuICogICAgIGlzIGdlbmVyYXRlZCBmb3IgZWFjaCBpbnB1dCBzZXF1ZW5jZS4gSW4gcGFydGljdWxhciwgaWYgYW4gaW5wdXQgc2VxdWVuY2VcbiAqICAgICBpcyBzaG9ydGVyIHRoYW4gbWluKG5ncmFtV2lkdGgpICsgMipwYWRXaWR0aCwgdGhlbiBnZW5lcmF0ZSBhIHNpbmdsZVxuICogICAgIG5ncmFtIGNvbnRhaW5pbmcgdGhlIGVudGlyZSBzZXF1ZW5jZS4gSWYgZmFsc2UsIHRoZW4gbm8gbmdyYW1zIGFyZVxuICogICAgIGdlbmVyYXRlZCBmb3IgdGhlc2Ugc2hvcnQgaW5wdXQgc2VxdWVuY2VzLlxuICogQHJldHVybiBBIG1hcCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqICAgICAtIG5HcmFtczogVGhlIHZhbHVlcyB0ZW5zb3Igb2YgdGhlIG91dHB1dCBuZ3JhbXMgcmFnZ2VkIHRlbnNvci5cbiAqICAgICAtIG5HcmFtc1NwbGl0czogVGhlIHNwbGl0cyB0ZW5zb3Igb2YgdGhlIG91dHB1dCBuZ3JhbXMgcmFnZ2VkIHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTdHJpbmcnfVxuICovXG5mdW5jdGlvbiBzdHJpbmdOR3JhbXNfKGRhdGEsIGRhdGFTcGxpdHMsIHNlcGFyYXRvciwgbkdyYW1XaWR0aHMsIGxlZnRQYWQsIHJpZ2h0UGFkLCBwYWRXaWR0aCwgcHJlc2VydmVTaG9ydFNlcXVlbmNlcykge1xuICAgIGNvbnN0ICRkYXRhID0gY29udmVydFRvVGVuc29yKGRhdGEsICdkYXRhJywgJ3N0cmluZ05HcmFtcycsICdzdHJpbmcnKTtcbiAgICBpZiAoJGRhdGEuZHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRGF0YSBtdXN0IGJlIG9mIGRhdGF0eXBlIHN0cmluZycpO1xuICAgIH1cbiAgICBpZiAoJGRhdGEuc2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRGF0YSBtdXN0IGJlIGEgdmVjdG9yLCBzYXc6ICR7JGRhdGEuc2hhcGV9YCk7XG4gICAgfVxuICAgIGNvbnN0ICRkYXRhU3BsaXRzID0gY29udmVydFRvVGVuc29yKGRhdGFTcGxpdHMsICdkYXRhU3BsaXRzJywgJ3N0cmluZ05HcmFtcycpO1xuICAgIGlmICgkZGF0YVNwbGl0cy5kdHlwZSAhPT0gJ2ludDMyJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RhdGEgc3BsaXRzIG11c3QgYmUgb2YgZGF0YXR5cGUgaW50MzInKTtcbiAgICB9XG4gICAgY29uc3QgYXR0cnMgPSB7XG4gICAgICAgIHNlcGFyYXRvcixcbiAgICAgICAgbkdyYW1XaWR0aHMsXG4gICAgICAgIGxlZnRQYWQsXG4gICAgICAgIHJpZ2h0UGFkLFxuICAgICAgICBwYWRXaWR0aCxcbiAgICAgICAgcHJlc2VydmVTaG9ydFNlcXVlbmNlc1xuICAgIH07XG4gICAgY29uc3QgaW5wdXRzID0geyBkYXRhOiAkZGF0YSwgZGF0YVNwbGl0czogJGRhdGFTcGxpdHMgfTtcbiAgICBjb25zdCByZXN1bHQgPSBFTkdJTkUucnVuS2VybmVsKFN0cmluZ05HcmFtcywgaW5wdXRzLCBhdHRycyk7XG4gICAgcmV0dXJuIHsgbkdyYW1zOiByZXN1bHRbMF0sIG5HcmFtc1NwbGl0czogcmVzdWx0WzFdIH07XG59XG5leHBvcnQgY29uc3Qgc3RyaW5nTkdyYW1zID0gb3AoeyBzdHJpbmdOR3JhbXNfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RyaW5nX25fZ3JhbXMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IFN0cmluZ1NwbGl0IH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4uL29wZXJhdGlvbic7XG4vKipcbiAqIFNwbGl0IGVsZW1lbnRzIG9mIGBpbnB1dGAgYmFzZWQgb24gYGRlbGltaXRlcmAgaW50byBhIFNwYXJzZVRlbnNvciAuXG4gKlxuICogTGV0IE4gYmUgdGhlIHNpemUgb2Ygc291cmNlICh0eXBpY2FsbHkgTiB3aWxsIGJlIHRoZSBiYXRjaCBzaXplKS4gU3BsaXQgZWFjaFxuICogZWxlbWVudCBvZiBgaW5wdXRgIGJhc2VkIG9uIGBkZWxpbWl0ZXJgIGFuZCByZXR1cm4gYSBTcGFyc2VUZW5zb3IgY29udGFpbmluZ1xuICogdGhlIHNwbGl0dGVkIHRva2Vucy4gRW1wdHkgdG9rZW5zIGFyZSBpZ25vcmVkIGlmIGBza2lwRW1wdHlgIGlzIHNldCB0byBUcnVlLlxuICpcbiAqIGBkZWxpbWl0ZXJgIGNhbiBiZSBlbXB0eSwgb3IgYSBzdHJpbmcgb2Ygc3BsaXQgY2hhcmFjdGVycy4gSWYgYGRlbGltaXRlcmAgaXNcbiAqIGFuIGVtcHR5IHN0cmluZywgZWFjaCBlbGVtZW50IG9mIGBpbnB1dGAgaXMgc3BsaXQgaW50byBpbmRpdmlkdWFsXG4gKiBjaGFyYWN0ZXIgc3RyaW5ncy4gT3RoZXJ3aXNlIGV2ZXJ5IGNoYXJhY3RlciBvZiBgZGVsaW1pdGVyYCBpcyBhIHBvdGVudGlhbFxuICogc3BsaXQgcG9pbnQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHJlc3VsdCA9IHRmLnN0cmluZy5zdHJpbmdTcGxpdChbJ2hlbGxvIHdvcmxkJywgICdhIGIgYyddLCAnICcpO1xuICogcmVzdWx0WydpbmRpY2VzJ10ucHJpbnQoKTsgLy8gW1swLCAwXSwgWzAsIDFdLCBbMSwgMF0sIFsxLCAxXSwgWzEsIDJdXVxuICogcmVzdWx0Wyd2YWx1ZXMnXS5wcmludCgpOyAvLyBbJ2hlbGxvJywgJ3dvcmxkJywgJ2EnLCAnYicsICdjJ11cbiAqIHJlc3VsdFsnc2hhcGUnXS5wcmludCgpOyAvLyBbMiwgM11cbiAqIGBgYFxuICogQHBhcmFtIGlucHV0OiAxLUQuIFN0cmluZ3MgdG8gc3BsaXQuXG4gKiBAcGFyYW0gZGVsaW1pdGVyOiAwLUQuIERlbGltaXRlciBjaGFyYWN0ZXJzLCBvciBlbXB0eSBzdHJpbmcuXG4gKiBAcGFyYW0gc2tpcEVtcHR5OiBPcHRpb25hbC4gSWYgdHJ1ZSwgc2tpcCB0aGUgZW1wdHkgc3RyaW5ncyBmcm9tIHRoZSByZXN1bHQuXG4gKiAgICAgRGVmYXVsdHMgdG8gdHJ1ZS5cbiAqIEByZXR1cm4gQSBtYXAgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAgICAgLSBpbmRpY2VzOiBBIGRlbnNlIG1hdHJpeCBvZiBpbnQzMiByZXByZXNlbnRpbmcgdGhlIGluZGljZXMgb2YgdGhlIHNwYXJzZVxuICogICAgICAgdGVuc29yLlxuICogICAgIC0gdmFsdWVzOiBBIHZlY3RvciBvZiBzdHJpbmdzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwbGl0ZWQgdmFsdWVzLlxuICogICAgIC0gc2hhcGU6IGEgbGVuZ3RoLTIgdmVjdG9yIG9mIGludDMyIHJlcHJlc2VudGluZyB0aGUgc2hhcGUgb2YgdGhlIHNwYXJzZVxuICogdGVuc29yLCB3aGVyZSB0aGUgZmlyc3QgdmFsdWUgaXMgTiBhbmQgdGhlIHNlY29uZCB2YWx1ZSBpcyB0aGUgbWF4aW11bSBudW1iZXJcbiAqIG9mIHRva2VucyBpbiBhIHNpbmdsZSBpbnB1dCBlbnRyeS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTdHJpbmcnfVxuICovXG5mdW5jdGlvbiBzdHJpbmdTcGxpdF8oaW5wdXQsIGRlbGltaXRlciwgc2tpcEVtcHR5ID0gdHJ1ZSkge1xuICAgIGNvbnN0ICRpbnB1dCA9IGNvbnZlcnRUb1RlbnNvcihpbnB1dCwgJ2lucHV0JywgJ3N0cmluZ1NwbGl0JywgJ3N0cmluZycpO1xuICAgIGNvbnN0ICRkZWxpbWl0ZXIgPSBjb252ZXJ0VG9UZW5zb3IoZGVsaW1pdGVyLCAnZGVsaW1pdGVyJywgJ3N0cmluZ1NwbGl0JywgJ3N0cmluZycpO1xuICAgIGlmICgkaW5wdXQucmFuayAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYElucHV0IHNob3VsZCBiZSBUZW5zb3IxRCBidXQgcmVjZWl2ZWQgc2hhcGUgJHskaW5wdXQuc2hhcGV9YCk7XG4gICAgfVxuICAgIGlmICgkZGVsaW1pdGVyLnJhbmsgIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEZWxpbWl0ZXIgc2hvdWxkIGJlIGEgc2NhbGFyIGJ1dCByZWNlaXZlZCBzaGFwZSAkeyRkZWxpbWl0ZXIuc2hhcGV9YCk7XG4gICAgfVxuICAgIGNvbnN0IGF0dHJzID0geyBza2lwRW1wdHkgfTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGlucHV0OiAkaW5wdXQsIGRlbGltaXRlcjogJGRlbGltaXRlciB9O1xuICAgIGNvbnN0IHJlc3VsdCA9IEVOR0lORS5ydW5LZXJuZWwoU3RyaW5nU3BsaXQsIGlucHV0cywgYXR0cnMpO1xuICAgIHJldHVybiB7IGluZGljZXM6IHJlc3VsdFswXSwgdmFsdWVzOiByZXN1bHRbMV0sIHNoYXBlOiByZXN1bHRbMl0gfTtcbn1cbmV4cG9ydCBjb25zdCBzdHJpbmdTcGxpdCA9IG9wKHsgc3RyaW5nU3BsaXRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RyaW5nX3NwbGl0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBTdHJpbmdUb0hhc2hCdWNrZXRGYXN0IH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4uL29wZXJhdGlvbic7XG4vKipcbiAqIENvbnZlcnRzIGVhY2ggc3RyaW5nIGluIHRoZSBpbnB1dCBUZW5zb3IgdG8gaXRzIGhhc2ggbW9kIGJ5IGEgbnVtYmVyIG9mXG4gKiBidWNrZXRzLlxuICpcbiAqIFRoZSBoYXNoIGZ1bmN0aW9uIGlzIGRldGVybWluaXN0aWMgb24gdGhlIGNvbnRlbnQgb2YgdGhlIHN0cmluZyB3aXRoaW4gdGhlXG4gKiBwcm9jZXNzIGFuZCB3aWxsIG5ldmVyIGNoYW5nZS4gSG93ZXZlciwgaXQgaXMgbm90IHN1aXRhYmxlIGZvciBjcnlwdG9ncmFwaHkuXG4gKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSB1c2VkIHdoZW4gQ1BVIHRpbWUgaXMgc2NhcmNlIGFuZCBpbnB1dHMgYXJlIHRydXN0ZWQgb3JcbiAqIHVuaW1wb3J0YW50LiBUaGVyZSBpcyBhIHJpc2sgb2YgYWR2ZXJzYXJpZXMgY29uc3RydWN0aW5nIGlucHV0cyB0aGF0IGFsbCBoYXNoXG4gKiB0byB0aGUgc2FtZSBidWNrZXQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHJlc3VsdCA9IHRmLnN0cmluZy5zdHJpbmdUb0hhc2hCdWNrZXRGYXN0KFxuICogICBbJ0hlbGxvJywgJ1RlbnNvckZsb3cnLCAnMi54J10sIDMpO1xuICogcmVzdWx0LnByaW50KCk7IC8vIFswLCAyLCAyXVxuICogYGBgXG4gKiBAcGFyYW0gaW5wdXQ6IFRoZSBzdHJpbmdzIHRvIGFzc2lnbiBhIGhhc2ggYnVja2V0LlxuICogQHBhcmFtIG51bUJ1Y2tldHM6IFRoZSBudW1iZXIgb2YgYnVja2V0cy5cbiAqIEByZXR1cm4gQSBUZW5zb3Igb2YgdGhlIHNhbWUgc2hhcGUgYXMgdGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTdHJpbmcnfVxuICovXG5mdW5jdGlvbiBzdHJpbmdUb0hhc2hCdWNrZXRGYXN0XyhpbnB1dCwgbnVtQnVja2V0cykge1xuICAgIGNvbnN0ICRpbnB1dCA9IGNvbnZlcnRUb1RlbnNvcihpbnB1dCwgJ2lucHV0JywgJ3N0cmluZ1RvSGFzaEJ1Y2tldEZhc3QnLCAnc3RyaW5nJyk7XG4gICAgY29uc3QgYXR0cnMgPSB7IG51bUJ1Y2tldHMgfTtcbiAgICBpZiAobnVtQnVja2V0cyA8PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTnVtYmVyIG9mIGJ1Y2tldHMgbXVzdCBiZSBhdCBsZWFzdCAxYCk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0cyA9IHsgaW5wdXQ6ICRpbnB1dCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFN0cmluZ1RvSGFzaEJ1Y2tldEZhc3QsIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3QgPSBvcCh7IHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RyaW5nX3RvX2hhc2hfYnVja2V0X2Zhc3QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFN1YiB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBtYWtlVHlwZXNNYXRjaCB9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogU3VidHJhY3RzIHR3byBgdGYuVGVuc29yYHMgZWxlbWVudC13aXNlLCBBIC0gQi4gU3VwcG9ydHMgYnJvYWRjYXN0aW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEwLCAyMCwgMzAsIDQwXSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzEsIDIsIDMsIDRdKTtcbiAqXG4gKiBhLnN1YihiKS5wcmludCgpOyAgLy8gb3IgdGYuc3ViKGEsIGIpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogLy8gQnJvYWRjYXN0IHN1YnRyYWN0IGEgd2l0aCBiLlxuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxMCwgMjAsIDMwLCA0MF0pO1xuICogY29uc3QgYiA9IHRmLnNjYWxhcig1KTtcbiAqXG4gKiBhLnN1YihiKS5wcmludCgpOyAgLy8gb3IgdGYuc3ViKGEsIGIpXG4gKiBgYGBcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBgdGYuVGVuc29yYCB0byBzdWJ0cmFjdCBmcm9tLlxuICogQHBhcmFtIGIgVGhlIHNlY29uZCBgdGYuVGVuc29yYCB0byBiZSBzdWJ0cmFjdGVkLiBNdXN0IGhhdmUgdGhlIHNhbWUgZHR5cGUgYXNcbiAqIGBhYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdBcml0aG1ldGljJ31cbiAqL1xuZnVuY3Rpb24gc3ViXyhhLCBiKSB7XG4gICAgbGV0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ3N1YicpO1xuICAgIGxldCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdzdWInKTtcbiAgICBbJGEsICRiXSA9IG1ha2VUeXBlc01hdGNoKCRhLCAkYik7XG4gICAgY29uc3QgaW5wdXRzID0geyBhOiAkYSwgYjogJGIgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChTdWIsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3Qgc3ViID0gb3AoeyBzdWJfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3ViLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBTdW0gfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGNhc3QgfSBmcm9tICcuL2Nhc3QnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBzdW0gb2YgZWxlbWVudHMgYWNyb3NzIGRpbWVuc2lvbnMgb2YgYSBgdGYuVGVuc29yYC5cbiAqXG4gKiBSZWR1Y2VzIHRoZSBpbnB1dCBhbG9uZyB0aGUgZGltZW5zaW9ucyBnaXZlbiBpbiBgYXhlc2AuIFVubGVzcyBga2VlcERpbXNgXG4gKiBpcyB0cnVlLCB0aGUgcmFuayBvZiB0aGUgYHRmLlRlbnNvcmAgaXMgcmVkdWNlZCBieSAxIGZvciBlYWNoIGVudHJ5IGluXG4gKiBgYXhlc2AuIElmIGBrZWVwRGltc2AgaXMgdHJ1ZSwgdGhlIHJlZHVjZWQgZGltZW5zaW9ucyBhcmUgcmV0YWluZWQgd2l0aFxuICogbGVuZ3RoIDEuIElmIGF4ZXMgaGFzIG5vIGVudHJpZXMsIGFsbCBkaW1lbnNpb25zIGFyZSByZWR1Y2VkLCBhbmQgYVxuICogYHRmLlRlbnNvcmAgd2l0aCBhIHNpbmdsZSBlbGVtZW50IGlzIHJldHVybmVkLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqXG4gKiB4LnN1bSgpLnByaW50KCk7ICAvLyBvciB0Zi5zdW0oeClcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pO1xuICpcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5zdW0oYXhpcykucHJpbnQoKTsgIC8vIG9yIHRmLnN1bSh4LCBheGlzKVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciB0byBjb21wdXRlIHRoZSBzdW0gb3Zlci4gSWYgdGhlIGR0eXBlIGlzIGBib29sYFxuICogICBpdCB3aWxsIGJlIGNvbnZlcnRlZCB0byBgaW50MzJgIGFuZCB0aGUgb3V0cHV0IGR0eXBlIHdpbGwgYmUgYGludDMyYC5cbiAqIEBwYXJhbSBheGlzIFRoZSBkaW1lbnNpb24ocykgdG8gcmVkdWNlLiBCeSBkZWZhdWx0IGl0IHJlZHVjZXNcbiAqICAgICBhbGwgZGltZW5zaW9ucy5cbiAqIEBwYXJhbSBrZWVwRGltcyBJZiB0cnVlLCByZXRhaW5zIHJlZHVjZWQgZGltZW5zaW9ucyB3aXRoIHNpemUgMS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdSZWR1Y3Rpb24nfVxuICovXG5mdW5jdGlvbiBzdW1fKHgsIGF4aXMgPSBudWxsLCBrZWVwRGltcyA9IGZhbHNlKSB7XG4gICAgbGV0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3N1bScpO1xuICAgIGlmICgkeC5kdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgICAgICR4ID0gY2FzdCgkeCwgJ2ludDMyJyk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICBjb25zdCBhdHRycyA9IHsgYXhpcywga2VlcERpbXMgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChTdW0sIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IHN1bSA9IG9wKHsgc3VtXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN1bS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgVGFuIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgdGFuIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2UsIGB0YW4oeClgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMCwgTWF0aC5QSSAvIDIsIE1hdGguUEkgKiAzIC8gNF0pO1xuICpcbiAqIHgudGFuKCkucHJpbnQoKTsgIC8vIG9yIHRmLnRhbih4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiB0YW5fKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICd0YW4nKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoVGFuLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IHRhbiA9IG9wKHsgdGFuXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRhbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgVGFuaCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIGh5cGVyYm9saWMgdGFuZ2VudCBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOiBgdGFuaCh4KWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFswLCAxLCAtMSwgNzBdKTtcbiAqXG4gKiB4LnRhbmgoKS5wcmludCgpOyAgLy8gb3IgdGYudGFuaCh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiB0YW5oXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAndGFuaCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChUYW5oLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IHRhbmggPSBvcCh7IHRhbmhfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGFuaC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBpbmZlclNoYXBlIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG1ha2VUZW5zb3IgfSBmcm9tICcuL3RlbnNvcl9vcHNfdXRpbCc7XG4vKipcbiAqIENyZWF0ZXMgYSBgdGYuVGVuc29yYCB3aXRoIHRoZSBwcm92aWRlZCB2YWx1ZXMsIHNoYXBlIGFuZCBkdHlwZS5cbiAqXG4gKiBgYGBqc1xuICogLy8gUGFzcyBhbiBhcnJheSBvZiB2YWx1ZXMgdG8gY3JlYXRlIGEgdmVjdG9yLlxuICogdGYudGVuc29yKFsxLCAyLCAzLCA0XSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBQYXNzIGEgbmVzdGVkIGFycmF5IG9mIHZhbHVlcyB0byBtYWtlIGEgbWF0cml4IG9yIGEgaGlnaGVyXG4gKiAvLyBkaW1lbnNpb25hbCB0ZW5zb3IuXG4gKiB0Zi50ZW5zb3IoW1sxLCAyXSwgWzMsIDRdXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBQYXNzIGEgZmxhdCBhcnJheSBhbmQgc3BlY2lmeSBhIHNoYXBlIHlvdXJzZWxmLlxuICogdGYudGVuc29yKFsxLCAyLCAzLCA0XSwgWzIsIDJdKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHZhbHVlcyBUaGUgdmFsdWVzIG9mIHRoZSB0ZW5zb3IuIENhbiBiZSBuZXN0ZWQgYXJyYXkgb2YgbnVtYmVycyxcbiAqICAgICBvciBhIGZsYXQgYXJyYXksIG9yIGEgYFR5cGVkQXJyYXlgLiBJZiB0aGUgdmFsdWVzIGFyZSBzdHJpbmdzLFxuICogICAgIHRoZXkgd2lsbCBiZSBlbmNvZGVkIGFzIHV0Zi04IGFuZCBrZXB0IGFzIGBVaW50OEFycmF5W11gLlxuICogQHBhcmFtIHNoYXBlIFRoZSBzaGFwZSBvZiB0aGUgdGVuc29yLiBPcHRpb25hbC4gSWYgbm90IHByb3ZpZGVkLFxuICogICBpdCBpcyBpbmZlcnJlZCBmcm9tIGB2YWx1ZXNgLlxuICogQHBhcmFtIGR0eXBlIFRoZSBkYXRhIHR5cGUuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdGVuc29yKHZhbHVlcywgc2hhcGUsIGR0eXBlKSB7XG4gICAgY29uc3QgaW5mZXJyZWRTaGFwZSA9IGluZmVyU2hhcGUodmFsdWVzLCBkdHlwZSk7XG4gICAgcmV0dXJuIG1ha2VUZW5zb3IodmFsdWVzLCBzaGFwZSwgaW5mZXJyZWRTaGFwZSwgZHR5cGUpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGVuc29yLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGluZmVyU2hhcGUgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0Tm9uTnVsbCB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgbWFrZVRlbnNvciB9IGZyb20gJy4vdGVuc29yX29wc191dGlsJztcbi8qKlxuICogQ3JlYXRlcyByYW5rLTEgYHRmLlRlbnNvcmAgd2l0aCB0aGUgcHJvdmlkZWQgdmFsdWVzLCBzaGFwZSBhbmQgZHR5cGUuXG4gKlxuICogVGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBjYW4gYmUgYWNoaWV2ZWQgd2l0aCBgdGYudGVuc29yYCwgYnV0IGluIGdlbmVyYWxcbiAqIHdlIHJlY29tbWVuZCB1c2luZyBgdGYudGVuc29yMWRgIGFzIGl0IG1ha2VzIHRoZSBjb2RlIG1vcmUgcmVhZGFibGUuXG4gKlxuICogYGBganNcbiAqIHRmLnRlbnNvcjFkKFsxLCAyLCAzXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB2YWx1ZXMgVGhlIHZhbHVlcyBvZiB0aGUgdGVuc29yLiBDYW4gYmUgYXJyYXkgb2YgbnVtYmVycyxcbiAqICAgICBvciBhIGBUeXBlZEFycmF5YC5cbiAqIEBwYXJhbSBkdHlwZSBUaGUgZGF0YSB0eXBlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlbnNvcjFkKHZhbHVlcywgZHR5cGUpIHtcbiAgICBhc3NlcnROb25OdWxsKHZhbHVlcyk7XG4gICAgY29uc3QgaW5mZXJyZWRTaGFwZSA9IGluZmVyU2hhcGUodmFsdWVzLCBkdHlwZSk7XG4gICAgaWYgKGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGVuc29yMWQoKSByZXF1aXJlcyB2YWx1ZXMgdG8gYmUgYSBmbGF0L1R5cGVkQXJyYXknKTtcbiAgICB9XG4gICAgY29uc3Qgc2hhcGUgPSBudWxsO1xuICAgIHJldHVybiBtYWtlVGVuc29yKHZhbHVlcywgc2hhcGUsIGluZmVycmVkU2hhcGUsIGR0eXBlKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRlbnNvcjFkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGluZmVyU2hhcGUgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0Tm9uTnVsbCB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgbWFrZVRlbnNvciB9IGZyb20gJy4vdGVuc29yX29wc191dGlsJztcbi8qKlxuICogQ3JlYXRlcyByYW5rLTIgYHRmLlRlbnNvcmAgd2l0aCB0aGUgcHJvdmlkZWQgdmFsdWVzLCBzaGFwZSBhbmQgZHR5cGUuXG4gKlxuICogVGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBjYW4gYmUgYWNoaWV2ZWQgd2l0aCBgdGYudGVuc29yYCwgYnV0IGluIGdlbmVyYWxcbiAqIHdlIHJlY29tbWVuZCB1c2luZyBgdGYudGVuc29yMmRgIGFzIGl0IG1ha2VzIHRoZSBjb2RlIG1vcmUgcmVhZGFibGUuXG4gKlxuICogIGBgYGpzXG4gKiAvLyBQYXNzIGEgbmVzdGVkIGFycmF5LlxuICogdGYudGVuc29yMmQoW1sxLCAyXSwgWzMsIDRdXSkucHJpbnQoKTtcbiAqIGBgYFxuICogYGBganNcbiAqIC8vIFBhc3MgYSBmbGF0IGFycmF5IGFuZCBzcGVjaWZ5IGEgc2hhcGUuXG4gKiB0Zi50ZW5zb3IyZChbMSwgMiwgMywgNF0sIFsyLCAyXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB2YWx1ZXMgVGhlIHZhbHVlcyBvZiB0aGUgdGVuc29yLiBDYW4gYmUgbmVzdGVkIGFycmF5IG9mIG51bWJlcnMsXG4gKiAgICAgb3IgYSBmbGF0IGFycmF5LCBvciBhIGBUeXBlZEFycmF5YC5cbiAqIEBwYXJhbSBzaGFwZSBUaGUgc2hhcGUgb2YgdGhlIHRlbnNvci4gSWYgbm90IHByb3ZpZGVkLCBpdCBpcyBpbmZlcnJlZCBmcm9tXG4gKiAgICAgYHZhbHVlc2AuXG4gKiBAcGFyYW0gZHR5cGUgVGhlIGRhdGEgdHlwZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZW5zb3IyZCh2YWx1ZXMsIHNoYXBlLCBkdHlwZSkge1xuICAgIGFzc2VydE5vbk51bGwodmFsdWVzKTtcbiAgICBpZiAoc2hhcGUgIT0gbnVsbCAmJiBzaGFwZS5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0ZW5zb3IyZCgpIHJlcXVpcmVzIHNoYXBlIHRvIGhhdmUgdHdvIG51bWJlcnMnKTtcbiAgICB9XG4gICAgY29uc3QgaW5mZXJyZWRTaGFwZSA9IGluZmVyU2hhcGUodmFsdWVzLCBkdHlwZSk7XG4gICAgaWYgKGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSAyICYmIGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGVuc29yMmQoKSByZXF1aXJlcyB2YWx1ZXMgdG8gYmUgbnVtYmVyW11bXSBvciBmbGF0L1R5cGVkQXJyYXknKTtcbiAgICB9XG4gICAgaWYgKGluZmVycmVkU2hhcGUubGVuZ3RoID09PSAxICYmIHNoYXBlID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0ZW5zb3IyZCgpIHJlcXVpcmVzIHNoYXBlIHRvIGJlIHByb3ZpZGVkIHdoZW4gYHZhbHVlc2AgJyArXG4gICAgICAgICAgICAnYXJlIGEgZmxhdC9UeXBlZEFycmF5Jyk7XG4gICAgfVxuICAgIHJldHVybiBtYWtlVGVuc29yKHZhbHVlcywgc2hhcGUsIGluZmVycmVkU2hhcGUsIGR0eXBlKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRlbnNvcjJkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGluZmVyU2hhcGUgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0Tm9uTnVsbCB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgbWFrZVRlbnNvciB9IGZyb20gJy4vdGVuc29yX29wc191dGlsJztcbi8qKlxuICogQ3JlYXRlcyByYW5rLTMgYHRmLlRlbnNvcmAgd2l0aCB0aGUgcHJvdmlkZWQgdmFsdWVzLCBzaGFwZSBhbmQgZHR5cGUuXG4gKlxuICogVGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBjYW4gYmUgYWNoaWV2ZWQgd2l0aCBgdGYudGVuc29yYCwgYnV0IGluIGdlbmVyYWxcbiAqIHdlIHJlY29tbWVuZCB1c2luZyBgdGYudGVuc29yM2RgIGFzIGl0IG1ha2VzIHRoZSBjb2RlIG1vcmUgcmVhZGFibGUuXG4gKlxuICogIGBgYGpzXG4gKiAvLyBQYXNzIGEgbmVzdGVkIGFycmF5LlxuICogdGYudGVuc29yM2QoW1tbMV0sIFsyXV0sIFtbM10sIFs0XV1dKS5wcmludCgpO1xuICogYGBgXG4gKiBgYGBqc1xuICogLy8gUGFzcyBhIGZsYXQgYXJyYXkgYW5kIHNwZWNpZnkgYSBzaGFwZS5cbiAqIHRmLnRlbnNvcjNkKFsxLCAyLCAzLCA0XSwgWzIsIDIsIDFdKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHZhbHVlcyBUaGUgdmFsdWVzIG9mIHRoZSB0ZW5zb3IuIENhbiBiZSBuZXN0ZWQgYXJyYXkgb2YgbnVtYmVycyxcbiAqICAgICBvciBhIGZsYXQgYXJyYXksIG9yIGEgYFR5cGVkQXJyYXlgLlxuICogQHBhcmFtIHNoYXBlIFRoZSBzaGFwZSBvZiB0aGUgdGVuc29yLiBJZiBub3QgcHJvdmlkZWQsICBpdCBpcyBpbmZlcnJlZCBmcm9tXG4gKiAgICAgYHZhbHVlc2AuXG4gKiBAcGFyYW0gZHR5cGUgVGhlIGRhdGEgdHlwZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZW5zb3IzZCh2YWx1ZXMsIHNoYXBlLCBkdHlwZSkge1xuICAgIGFzc2VydE5vbk51bGwodmFsdWVzKTtcbiAgICBpZiAoc2hhcGUgIT0gbnVsbCAmJiBzaGFwZS5sZW5ndGggIT09IDMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0ZW5zb3IzZCgpIHJlcXVpcmVzIHNoYXBlIHRvIGhhdmUgdGhyZWUgbnVtYmVycycpO1xuICAgIH1cbiAgICBjb25zdCBpbmZlcnJlZFNoYXBlID0gaW5mZXJTaGFwZSh2YWx1ZXMsIGR0eXBlKTtcbiAgICBpZiAoaW5mZXJyZWRTaGFwZS5sZW5ndGggIT09IDMgJiYgaW5mZXJyZWRTaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0ZW5zb3IzZCgpIHJlcXVpcmVzIHZhbHVlcyB0byBiZSBudW1iZXJbXVtdW10gb3IgZmxhdC9UeXBlZEFycmF5Jyk7XG4gICAgfVxuICAgIGlmIChpbmZlcnJlZFNoYXBlLmxlbmd0aCA9PT0gMSAmJiBzaGFwZSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGVuc29yM2QoKSByZXF1aXJlcyBzaGFwZSB0byBiZSBwcm92aWRlZCB3aGVuIGB2YWx1ZXNgICcgK1xuICAgICAgICAgICAgJ2FyZSBhIGZsYXQgYXJyYXknKTtcbiAgICB9XG4gICAgcmV0dXJuIG1ha2VUZW5zb3IodmFsdWVzLCBzaGFwZSwgaW5mZXJyZWRTaGFwZSwgZHR5cGUpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGVuc29yM2QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgaW5mZXJTaGFwZSB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnROb25OdWxsIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBtYWtlVGVuc29yIH0gZnJvbSAnLi90ZW5zb3Jfb3BzX3V0aWwnO1xuLyoqXG4gKiBDcmVhdGVzIHJhbmstNCBgdGYuVGVuc29yYCB3aXRoIHRoZSBwcm92aWRlZCB2YWx1ZXMsIHNoYXBlIGFuZCBkdHlwZS5cbiAqXG4gKiBUaGUgc2FtZSBmdW5jdGlvbmFsaXR5IGNhbiBiZSBhY2hpZXZlZCB3aXRoIGB0Zi50ZW5zb3JgLCBidXQgaW4gZ2VuZXJhbFxuICogd2UgcmVjb21tZW5kIHVzaW5nIGB0Zi50ZW5zb3I0ZGAgYXMgaXQgbWFrZXMgdGhlIGNvZGUgbW9yZSByZWFkYWJsZS5cbiAqXG4gKiAgYGBganNcbiAqIC8vIFBhc3MgYSBuZXN0ZWQgYXJyYXkuXG4gKiB0Zi50ZW5zb3I0ZChbW1tbMV0sIFsyXV0sIFtbM10sIFs0XV1dXSkucHJpbnQoKTtcbiAqIGBgYFxuICogYGBganNcbiAqIC8vIFBhc3MgYSBmbGF0IGFycmF5IGFuZCBzcGVjaWZ5IGEgc2hhcGUuXG4gKiB0Zi50ZW5zb3I0ZChbMSwgMiwgMywgNF0sIFsxLCAyLCAyLCAxXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB2YWx1ZXMgVGhlIHZhbHVlcyBvZiB0aGUgdGVuc29yLiBDYW4gYmUgbmVzdGVkIGFycmF5IG9mIG51bWJlcnMsXG4gKiAgICAgb3IgYSBmbGF0IGFycmF5LCBvciBhIGBUeXBlZEFycmF5YC5cbiAqIEBwYXJhbSBzaGFwZSBUaGUgc2hhcGUgb2YgdGhlIHRlbnNvci4gT3B0aW9uYWwuIElmIG5vdCBwcm92aWRlZCxcbiAqICAgaXQgaXMgaW5mZXJyZWQgZnJvbSBgdmFsdWVzYC5cbiAqIEBwYXJhbSBkdHlwZSBUaGUgZGF0YSB0eXBlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlbnNvcjRkKHZhbHVlcywgc2hhcGUsIGR0eXBlKSB7XG4gICAgYXNzZXJ0Tm9uTnVsbCh2YWx1ZXMpO1xuICAgIGlmIChzaGFwZSAhPSBudWxsICYmIHNoYXBlLmxlbmd0aCAhPT0gNCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RlbnNvcjRkKCkgcmVxdWlyZXMgc2hhcGUgdG8gaGF2ZSBmb3VyIG51bWJlcnMnKTtcbiAgICB9XG4gICAgY29uc3QgaW5mZXJyZWRTaGFwZSA9IGluZmVyU2hhcGUodmFsdWVzLCBkdHlwZSk7XG4gICAgaWYgKGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSA0ICYmIGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGVuc29yNGQoKSByZXF1aXJlcyB2YWx1ZXMgdG8gYmUgbnVtYmVyW11bXVtdW10gb3IgZmxhdC9UeXBlZEFycmF5Jyk7XG4gICAgfVxuICAgIGlmIChpbmZlcnJlZFNoYXBlLmxlbmd0aCA9PT0gMSAmJiBzaGFwZSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGVuc29yNGQoKSByZXF1aXJlcyBzaGFwZSB0byBiZSBwcm92aWRlZCB3aGVuIGB2YWx1ZXNgICcgK1xuICAgICAgICAgICAgJ2FyZSBhIGZsYXQgYXJyYXknKTtcbiAgICB9XG4gICAgcmV0dXJuIG1ha2VUZW5zb3IodmFsdWVzLCBzaGFwZSwgaW5mZXJyZWRTaGFwZSwgZHR5cGUpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGVuc29yNGQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgaW5mZXJTaGFwZSB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnROb25OdWxsIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBtYWtlVGVuc29yIH0gZnJvbSAnLi90ZW5zb3Jfb3BzX3V0aWwnO1xuLyoqXG4gKiBDcmVhdGVzIHJhbmstNSBgdGYuVGVuc29yYCB3aXRoIHRoZSBwcm92aWRlZCB2YWx1ZXMsIHNoYXBlIGFuZCBkdHlwZS5cbiAqXG4gKiBUaGUgc2FtZSBmdW5jdGlvbmFsaXR5IGNhbiBiZSBhY2hpZXZlZCB3aXRoIGB0Zi50ZW5zb3JgLCBidXQgaW4gZ2VuZXJhbFxuICogd2UgcmVjb21tZW5kIHVzaW5nIGB0Zi50ZW5zb3I1ZGAgYXMgaXQgbWFrZXMgdGhlIGNvZGUgbW9yZSByZWFkYWJsZS5cbiAqXG4gKiAgYGBganNcbiAqIC8vIFBhc3MgYSBuZXN0ZWQgYXJyYXkuXG4gKiB0Zi50ZW5zb3I1ZChbW1tbWzFdLFsyXV0sW1szXSxbNF1dXSxbW1s1XSxbNl1dLFtbN10sWzhdXV1dXSkucHJpbnQoKTtcbiAqIGBgYFxuICogYGBganNcbiAqIC8vIFBhc3MgYSBmbGF0IGFycmF5IGFuZCBzcGVjaWZ5IGEgc2hhcGUuXG4gKiB0Zi50ZW5zb3I1ZChbMSwgMiwgMywgNCwgNSwgNiwgNywgOF0sIFsxLCAyLCAyLCAyLCAxXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB2YWx1ZXMgVGhlIHZhbHVlcyBvZiB0aGUgdGVuc29yLiBDYW4gYmUgbmVzdGVkIGFycmF5IG9mIG51bWJlcnMsXG4gKiAgICAgb3IgYSBmbGF0IGFycmF5LCBvciBhIGBUeXBlZEFycmF5YC5cbiAqIEBwYXJhbSBzaGFwZSBUaGUgc2hhcGUgb2YgdGhlIHRlbnNvci4gT3B0aW9uYWwuIElmIG5vdCBwcm92aWRlZCxcbiAqICAgaXQgaXMgaW5mZXJyZWQgZnJvbSBgdmFsdWVzYC5cbiAqIEBwYXJhbSBkdHlwZSBUaGUgZGF0YSB0eXBlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlbnNvcjVkKHZhbHVlcywgc2hhcGUsIGR0eXBlKSB7XG4gICAgYXNzZXJ0Tm9uTnVsbCh2YWx1ZXMpO1xuICAgIGlmIChzaGFwZSAhPSBudWxsICYmIHNoYXBlLmxlbmd0aCAhPT0gNSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RlbnNvcjVkKCkgcmVxdWlyZXMgc2hhcGUgdG8gaGF2ZSBmaXZlIG51bWJlcnMnKTtcbiAgICB9XG4gICAgY29uc3QgaW5mZXJyZWRTaGFwZSA9IGluZmVyU2hhcGUodmFsdWVzLCBkdHlwZSk7XG4gICAgaWYgKGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSA1ICYmIGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGVuc29yNWQoKSByZXF1aXJlcyB2YWx1ZXMgdG8gYmUgJyArXG4gICAgICAgICAgICAnbnVtYmVyW11bXVtdW11bXSBvciBmbGF0L1R5cGVkQXJyYXknKTtcbiAgICB9XG4gICAgaWYgKGluZmVycmVkU2hhcGUubGVuZ3RoID09PSAxICYmIHNoYXBlID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0ZW5zb3I1ZCgpIHJlcXVpcmVzIHNoYXBlIHRvIGJlIHByb3ZpZGVkIHdoZW4gYHZhbHVlc2AgJyArXG4gICAgICAgICAgICAnYXJlIGEgZmxhdCBhcnJheScpO1xuICAgIH1cbiAgICByZXR1cm4gbWFrZVRlbnNvcih2YWx1ZXMsIHNoYXBlLCBpbmZlcnJlZFNoYXBlLCBkdHlwZSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD10ZW5zb3I1ZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBpbmZlclNoYXBlIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGFzc2VydE5vbk51bGwgfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG1ha2VUZW5zb3IgfSBmcm9tICcuL3RlbnNvcl9vcHNfdXRpbCc7XG4vKipcbiAqIENyZWF0ZXMgcmFuay02IGB0Zi5UZW5zb3JgIHdpdGggdGhlIHByb3ZpZGVkIHZhbHVlcywgc2hhcGUgYW5kIGR0eXBlLlxuICpcbiAqIFRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgY2FuIGJlIGFjaGlldmVkIHdpdGggYHRmLnRlbnNvcmAsIGJ1dCBpbiBnZW5lcmFsXG4gKiB3ZSByZWNvbW1lbmQgdXNpbmcgYHRmLnRlbnNvcjZkYCBhcyBpdCBtYWtlcyB0aGUgY29kZSBtb3JlIHJlYWRhYmxlLlxuICpcbiAqICBgYGBqc1xuICogLy8gUGFzcyBhIG5lc3RlZCBhcnJheS5cbiAqIHRmLnRlbnNvcjZkKFtbW1tbWzFdLFsyXV0sW1szXSxbNF1dXSxbW1s1XSxbNl1dLFtbN10sWzhdXV1dXV0pLnByaW50KCk7XG4gKiBgYGBcbiAqIGBgYGpzXG4gKiAvLyBQYXNzIGEgZmxhdCBhcnJheSBhbmQgc3BlY2lmeSBhIHNoYXBlLlxuICogdGYudGVuc29yNmQoWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDhdLCBbMSwgMSwgMiwgMiwgMiwgMV0pLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdmFsdWVzIFRoZSB2YWx1ZXMgb2YgdGhlIHRlbnNvci4gQ2FuIGJlIG5lc3RlZCBhcnJheSBvZiBudW1iZXJzLFxuICogICAgIG9yIGEgZmxhdCBhcnJheSwgb3IgYSBgVHlwZWRBcnJheWAuXG4gKiBAcGFyYW0gc2hhcGUgVGhlIHNoYXBlIG9mIHRoZSB0ZW5zb3IuIE9wdGlvbmFsLiBJZiBub3QgcHJvdmlkZWQsXG4gKiAgIGl0IGlzIGluZmVycmVkIGZyb20gYHZhbHVlc2AuXG4gKiBAcGFyYW0gZHR5cGUgVGhlIGRhdGEgdHlwZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZW5zb3I2ZCh2YWx1ZXMsIHNoYXBlLCBkdHlwZSkge1xuICAgIGFzc2VydE5vbk51bGwodmFsdWVzKTtcbiAgICBpZiAoc2hhcGUgIT0gbnVsbCAmJiBzaGFwZS5sZW5ndGggIT09IDYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0ZW5zb3I2ZCgpIHJlcXVpcmVzIHNoYXBlIHRvIGhhdmUgc2l4IG51bWJlcnMnKTtcbiAgICB9XG4gICAgY29uc3QgaW5mZXJyZWRTaGFwZSA9IGluZmVyU2hhcGUodmFsdWVzLCBkdHlwZSk7XG4gICAgaWYgKGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSA2ICYmIGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGVuc29yNmQoKSByZXF1aXJlcyB2YWx1ZXMgdG8gYmUgbnVtYmVyW11bXVtdW11bXVtdIG9yICcgK1xuICAgICAgICAgICAgJ2ZsYXQvVHlwZWRBcnJheScpO1xuICAgIH1cbiAgICBpZiAoaW5mZXJyZWRTaGFwZS5sZW5ndGggPT09IDEgJiYgc2hhcGUgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RlbnNvcjZkKCkgcmVxdWlyZXMgc2hhcGUgdG8gYmUgcHJvdmlkZWQgd2hlbiBgdmFsdWVzYCAnICtcbiAgICAgICAgICAgICdhcmUgYSBmbGF0IGFycmF5Jyk7XG4gICAgfVxuICAgIHNoYXBlID0gc2hhcGUgfHxcbiAgICAgICAgaW5mZXJyZWRTaGFwZTtcbiAgICByZXR1cm4gbWFrZVRlbnNvcih2YWx1ZXMsIHNoYXBlLCBpbmZlcnJlZFNoYXBlLCBkdHlwZSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD10ZW5zb3I2ZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgYXNzZXJ0LCBhc3NlcnROb25OZWdhdGl2ZUludGVnZXJEaW1lbnNpb25zLCBmbGF0dGVuLCBpbmZlckR0eXBlLCBpc1R5cGVkQXJyYXksIHNpemVGcm9tU2hhcGUsIHRvVHlwZWRBcnJheSB9IGZyb20gJy4uL3V0aWwnO1xuLyoqIFRoaXMgaXMgc2hhcmVkIGNvZGUgYWNyb3NzIGFsbCB0ZW5zb3IgY3JlYXRpb24gbWV0aG9kcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlVGVuc29yKHZhbHVlcywgc2hhcGUsIGluZmVycmVkU2hhcGUsIGR0eXBlKSB7XG4gICAgaWYgKGR0eXBlID09IG51bGwpIHtcbiAgICAgICAgZHR5cGUgPSBpbmZlckR0eXBlKHZhbHVlcyk7XG4gICAgfVxuICAgIGlmIChkdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29uc3RydWN0IGEgY29tcGxleDY0IHRlbnNvciBkaXJlY3RseS4gYCArXG4gICAgICAgICAgICBgUGxlYXNlIHVzZSB0Zi5jb21wbGV4KHJlYWwsIGltYWcpLmApO1xuICAgIH1cbiAgICBpZiAoIWlzVHlwZWRBcnJheSh2YWx1ZXMpICYmICFBcnJheS5pc0FycmF5KHZhbHVlcykgJiZcbiAgICAgICAgdHlwZW9mIHZhbHVlcyAhPT0gJ251bWJlcicgJiYgdHlwZW9mIHZhbHVlcyAhPT0gJ2Jvb2xlYW4nICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZXMgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndmFsdWVzIHBhc3NlZCB0byB0ZW5zb3IodmFsdWVzKSBtdXN0IGJlIGEgbnVtYmVyL2Jvb2xlYW4vc3RyaW5nIG9yICcgK1xuICAgICAgICAgICAgJ2FuIGFycmF5IG9mIG51bWJlcnMvYm9vbGVhbnMvc3RyaW5ncywgb3IgYSBUeXBlZEFycmF5Jyk7XG4gICAgfVxuICAgIGlmIChzaGFwZSAhPSBudWxsKSB7XG4gICAgICAgIGFzc2VydE5vbk5lZ2F0aXZlSW50ZWdlckRpbWVuc2lvbnMoc2hhcGUpO1xuICAgICAgICBjb25zdCBwcm92aWRlZFNpemUgPSBzaXplRnJvbVNoYXBlKHNoYXBlKTtcbiAgICAgICAgY29uc3QgaW5mZXJyZWRTaXplID0gc2l6ZUZyb21TaGFwZShpbmZlcnJlZFNoYXBlKTtcbiAgICAgICAgYXNzZXJ0KHByb3ZpZGVkU2l6ZSA9PT0gaW5mZXJyZWRTaXplLCAoKSA9PiBgQmFzZWQgb24gdGhlIHByb3ZpZGVkIHNoYXBlLCBbJHtzaGFwZX1dLCB0aGUgdGVuc29yIHNob3VsZCBoYXZlIGAgK1xuICAgICAgICAgICAgYCR7cHJvdmlkZWRTaXplfSB2YWx1ZXMgYnV0IGhhcyAke2luZmVycmVkU2l6ZX1gKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmZlcnJlZFNoYXBlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBjb25zdCBpbmZlcnJlZCA9IGluZmVycmVkU2hhcGVbaV07XG4gICAgICAgICAgICBjb25zdCBmbGF0RGltc0RvbnRNYXRjaCA9IGkgPT09IGluZmVycmVkU2hhcGUubGVuZ3RoIC0gMSA/XG4gICAgICAgICAgICAgICAgaW5mZXJyZWQgIT09IHNpemVGcm9tU2hhcGUoc2hhcGUuc2xpY2UoaSkpIDpcbiAgICAgICAgICAgICAgICB0cnVlO1xuICAgICAgICAgICAgYXNzZXJ0KGluZmVycmVkU2hhcGVbaV0gPT09IHNoYXBlW2ldIHx8ICFmbGF0RGltc0RvbnRNYXRjaCwgKCkgPT4gYEVycm9yIGNyZWF0aW5nIGEgbmV3IFRlbnNvci4gSW5mZXJyZWQgc2hhcGUgYCArXG4gICAgICAgICAgICAgICAgYCgke2luZmVycmVkU2hhcGV9KSBkb2VzIG5vdCBtYXRjaCB0aGUgcHJvdmlkZWQgYCArXG4gICAgICAgICAgICAgICAgYHNoYXBlICgke3NoYXBlfSkuIGApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghaXNUeXBlZEFycmF5KHZhbHVlcykgJiYgIUFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgICAgICB2YWx1ZXMgPSBbdmFsdWVzXTtcbiAgICB9XG4gICAgc2hhcGUgPSBzaGFwZSB8fCBpbmZlcnJlZFNoYXBlO1xuICAgIHZhbHVlcyA9IGR0eXBlICE9PSAnc3RyaW5nJyA/XG4gICAgICAgIHRvVHlwZWRBcnJheSh2YWx1ZXMsIGR0eXBlKSA6XG4gICAgICAgIGZsYXR0ZW4odmFsdWVzLCBbXSwgdHJ1ZSk7XG4gICAgcmV0dXJuIEVOR0lORS5tYWtlVGVuc29yKHZhbHVlcywgc2hhcGUsIGR0eXBlKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRlbnNvcl9vcHNfdXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgVGlsZSB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb25zdHJ1Y3QgYSB0ZW5zb3IgYnkgcmVwZWF0aW5nIGl0IHRoZSBudW1iZXIgb2YgdGltZXMgZ2l2ZW4gYnkgcmVwcy5cbiAqXG4gKiBUaGlzIG9wZXJhdGlvbiBjcmVhdGVzIGEgbmV3IHRlbnNvciBieSByZXBsaWNhdGluZyBgaW5wdXRgIGByZXBzYFxuICogdGltZXMuIFRoZSBvdXRwdXQgdGVuc29yJ3MgaSd0aCBkaW1lbnNpb24gaGFzIGBpbnB1dC5zaGFwZVtpXSAqXG4gKiByZXBzW2ldYCBlbGVtZW50cywgYW5kIHRoZSB2YWx1ZXMgb2YgYGlucHV0YCBhcmUgcmVwbGljYXRlZFxuICogYHJlcHNbaV1gIHRpbWVzIGFsb25nIHRoZSBpJ3RoIGRpbWVuc2lvbi4gRm9yIGV4YW1wbGUsIHRpbGluZ1xuICogYFthLCBiLCBjLCBkXWAgYnkgYFsyXWAgcHJvZHVjZXMgYFthLCBiLCBjLCBkLCBhLCBiLCBjLCBkXWAuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMl0pO1xuICpcbiAqIGEudGlsZShbMl0pLnByaW50KCk7ICAgIC8vIG9yIGEudGlsZShbMl0pXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjJkKFsxLCAyLCAzLCA0XSwgWzIsIDJdKTtcbiAqXG4gKiBhLnRpbGUoWzEsIDJdKS5wcmludCgpOyAgLy8gb3IgYS50aWxlKFsxLCAyXSlcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIHRlbnNvciB0byB0aWxlLlxuICogQHBhcmFtIHJlcHMgRGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIHJlcGxpY2F0aW9ucyBwZXIgZGltZW5zaW9uLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1NsaWNpbmcgYW5kIEpvaW5pbmcnfVxuICovXG5mdW5jdGlvbiB0aWxlXyh4LCByZXBzKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAndGlsZScsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICAgIHV0aWwuYXNzZXJ0KCR4LnJhbmsgPT09IHJlcHMubGVuZ3RoLCAoKSA9PiBgRXJyb3IgaW4gdHJhbnNwb3NlOiByYW5rIG9mIGlucHV0ICR7JHgucmFua30gYCArXG4gICAgICAgIGBtdXN0IG1hdGNoIGxlbmd0aCBvZiByZXBzICR7cmVwc30uYCk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyByZXBzIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoVGlsZSwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgdGlsZSA9IG9wKHsgdGlsZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10aWxlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBUb3BLIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogRmluZHMgdGhlIHZhbHVlcyBhbmQgaW5kaWNlcyBvZiB0aGUgYGtgIGxhcmdlc3QgZW50cmllcyBhbG9uZyB0aGUgbGFzdFxuICogZGltZW5zaW9uLlxuICpcbiAqIElmIHRoZSBpbnB1dCBpcyBhIHZlY3RvciAocmFuaz0xKSwgZmluZHMgdGhlIGsgbGFyZ2VzdCBlbnRyaWVzIGluIHRoZSB2ZWN0b3JcbiAqIGFuZCBvdXRwdXRzIHRoZWlyIHZhbHVlcyBhbmQgaW5kaWNlcyBhcyB2ZWN0b3JzLiBUaHVzIHZhbHVlc1tqXSBpcyB0aGUgai10aFxuICogbGFyZ2VzdCBlbnRyeSBpbiBpbnB1dCwgYW5kIGl0cyBpbmRleCBpcyBpbmRpY2VzW2pdLlxuICogRm9yIGhpZ2hlciByYW5rIGlucHV0cywgY29tcHV0ZXMgdGhlIHRvcCBrIGVudHJpZXMgYWxvbmcgdGhlIGxhc3QgZGltZW5zaW9uLlxuICpcbiAqIElmIHR3byBlbGVtZW50cyBhcmUgZXF1YWwsIHRoZSBsb3dlci1pbmRleCBlbGVtZW50IGFwcGVhcnMgZmlyc3QuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IyZChbWzEsIDVdLCBbNCwgM11dKTtcbiAqIGNvbnN0IHt2YWx1ZXMsIGluZGljZXN9ID0gdGYudG9wayhhKTtcbiAqIHZhbHVlcy5wcmludCgpO1xuICogaW5kaWNlcy5wcmludCgpO1xuICogYGBgXG4gKiBAcGFyYW0geCAxLUQgb3IgaGlnaGVyIGB0Zi5UZW5zb3JgIHdpdGggbGFzdCBkaW1lbnNpb24gYmVpbmcgYXQgbGVhc3QgYGtgLlxuICogQHBhcmFtIGsgTnVtYmVyIG9mIHRvcCBlbGVtZW50cyB0byBsb29rIGZvciBhbG9uZyB0aGUgbGFzdCBkaW1lbnNpb24uXG4gKiBAcGFyYW0gc29ydGVkIElmIHRydWUsIHRoZSByZXN1bHRpbmcgYGtgIGVsZW1lbnRzIHdpbGwgYmUgc29ydGVkIGJ5IHRoZVxuICogICAgIHZhbHVlcyBpbiBkZXNjZW5kaW5nIG9yZGVyLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0V2YWx1YXRpb24nfVxuICovXG5mdW5jdGlvbiB0b3BrXyh4LCBrID0gMSwgc29ydGVkID0gdHJ1ZSkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3RvcGsnKTtcbiAgICBpZiAoJHgucmFuayA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RvcGsoKSBleHBlY3RzIHRoZSBpbnB1dCB0byBiZSBvZiByYW5rIDEgb3IgaGlnaGVyJyk7XG4gICAgfVxuICAgIGNvbnN0IGxhc3REaW0gPSAkeC5zaGFwZVskeC5zaGFwZS5sZW5ndGggLSAxXTtcbiAgICBpZiAoayA8IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAnaycgcGFzc2VkIHRvIHRvcGsoKSBtdXN0IGJlID49IDAgYnV0IGdvdCAke2t9YCk7XG4gICAgfVxuICAgIGlmIChrID4gbGFzdERpbSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCdrJyBwYXNzZWQgdG8gdG9waygpIG11c3QgYmUgPD0gdGhlIGxhc3QgZGltZW5zaW9uICgke2xhc3REaW19KSBgICtcbiAgICAgICAgICAgIGBidXQgZ290ICR7a31gKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBrLCBzb3J0ZWQgfTtcbiAgICBjb25zdCBbdmFsdWVzLCBpbmRpY2VzXSA9IEVOR0lORS5ydW5LZXJuZWwoVG9wSywgaW5wdXRzLCBhdHRycyk7XG4gICAgcmV0dXJuIHsgdmFsdWVzLCBpbmRpY2VzIH07XG59XG5leHBvcnQgY29uc3QgdG9wayA9IG9wKHsgdG9wa18gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10b3BrLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBUcmFuc3Bvc2UgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogVHJhbnNwb3NlcyB0aGUgYHRmLlRlbnNvcmAuIFBlcm11dGVzIHRoZSBkaW1lbnNpb25zIGFjY29yZGluZyB0byBgcGVybWAuXG4gKlxuICogVGhlIHJldHVybmVkIGB0Zi5UZW5zb3JgJ3MgZGltZW5zaW9uIGBpYCB3aWxsIGNvcnJlc3BvbmQgdG8gdGhlIGlucHV0XG4gKiBkaW1lbnNpb24gYHBlcm1baV1gLiBJZiBgcGVybWAgaXMgbm90IGdpdmVuLCBpdCBpcyBzZXQgdG8gYFtuLTEuLi4wXWAsXG4gKiB3aGVyZSBgbmAgaXMgdGhlIHJhbmsgb2YgdGhlIGlucHV0IGB0Zi5UZW5zb3JgLiBIZW5jZSBieSBkZWZhdWx0LCB0aGlzXG4gKiBvcGVyYXRpb24gcGVyZm9ybXMgYSByZWd1bGFyIG1hdHJpeCB0cmFuc3Bvc2Ugb24gMi1EIGlucHV0IGB0Zi5UZW5zb3Jgcy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjJkKFsxLCAyLCAzLCA0LCA1LCA2XSwgWzIsIDNdKTtcbiAqXG4gKiBhLnRyYW5zcG9zZSgpLnByaW50KCk7ICAvLyBvciB0Zi50cmFuc3Bvc2UoYSlcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSB0ZW5zb3IgdG8gdHJhbnNwb3NlLlxuICogQHBhcmFtIHBlcm0gVGhlIHBlcm11dGF0aW9uIG9mIHRoZSBkaW1lbnNpb25zIG9mIGEuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTWF0cmljZXMnfVxuICovXG5mdW5jdGlvbiB0cmFuc3Bvc2VfKHgsIHBlcm0pIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICd0cmFuc3Bvc2UnKTtcbiAgICBpZiAocGVybSA9PSBudWxsKSB7XG4gICAgICAgIHBlcm0gPSAkeC5zaGFwZS5tYXAoKHMsIGkpID0+IGkpLnJldmVyc2UoKTtcbiAgICB9XG4gICAgdXRpbC5hc3NlcnQoJHgucmFuayA9PT0gcGVybS5sZW5ndGgsICgpID0+IGBFcnJvciBpbiB0cmFuc3Bvc2U6IHJhbmsgb2YgaW5wdXQgJHskeC5yYW5rfSBgICtcbiAgICAgICAgYG11c3QgbWF0Y2ggbGVuZ3RoIG9mIHBlcm0gJHtwZXJtfS5gKTtcbiAgICBwZXJtLmZvckVhY2goYXhpcyA9PiB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KGF4aXMgPj0gMCAmJiBheGlzIDwgJHgucmFuaywgKCkgPT4gYEFsbCBlbnRyaWVzIGluICdwZXJtJyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgJHskeC5yYW5rIC0gMX1gICtcbiAgICAgICAgICAgIGAgYnV0IGdvdCAke3Blcm19YCk7XG4gICAgfSk7XG4gICAgaWYgKCR4LnJhbmsgPD0gMSkge1xuICAgICAgICByZXR1cm4gJHguY2xvbmUoKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBwZXJtIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoVHJhbnNwb3NlLCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCB0cmFuc3Bvc2UgPSBvcCh7IHRyYW5zcG9zZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10cmFuc3Bvc2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYnVmZmVyIH0gZnJvbSAnLi9idWZmZXInO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyBNUFJhbmRHYXVzcyB9IGZyb20gJy4vcmFuZF91dGlsJztcbi8qKlxuICogQ3JlYXRlcyBhIGB0Zi5UZW5zb3JgIHdpdGggdmFsdWVzIHNhbXBsZWQgZnJvbSBhIHRydW5jYXRlZCBub3JtYWxcbiAqIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiBgYGBqc1xuICogdGYudHJ1bmNhdGVkTm9ybWFsKFsyLCAyXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIFRoZSBnZW5lcmF0ZWQgdmFsdWVzIGZvbGxvdyBhIG5vcm1hbCBkaXN0cmlidXRpb24gd2l0aCBzcGVjaWZpZWQgbWVhbiBhbmRcbiAqIHN0YW5kYXJkIGRldmlhdGlvbiwgZXhjZXB0IHRoYXQgdmFsdWVzIHdob3NlIG1hZ25pdHVkZSBpcyBtb3JlIHRoYW4gMlxuICogc3RhbmRhcmQgZGV2aWF0aW9ucyBmcm9tIHRoZSBtZWFuIGFyZSBkcm9wcGVkIGFuZCByZS1waWNrZWQuXG4gKlxuICogQHBhcmFtIHNoYXBlIEFuIGFycmF5IG9mIGludGVnZXJzIGRlZmluaW5nIHRoZSBvdXRwdXQgdGVuc29yIHNoYXBlLlxuICogQHBhcmFtIG1lYW4gVGhlIG1lYW4gb2YgdGhlIG5vcm1hbCBkaXN0cmlidXRpb24uXG4gKiBAcGFyYW0gc3RkRGV2IFRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIG5vcm1hbCBkaXN0cmlidXRpb24uXG4gKiBAcGFyYW0gZHR5cGUgVGhlIGRhdGEgdHlwZSBvZiB0aGUgb3V0cHV0IHRlbnNvci5cbiAqIEBwYXJhbSBzZWVkIFRoZSBzZWVkIGZvciB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5mdW5jdGlvbiB0cnVuY2F0ZWROb3JtYWxfKHNoYXBlLCBtZWFuID0gMCwgc3RkRGV2ID0gMSwgZHR5cGUsIHNlZWQpIHtcbiAgICBpZiAoZHR5cGUgIT0gbnVsbCAmJiBkdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgZGF0YSB0eXBlICQgeyBkdHlwZSB9YCk7XG4gICAgfVxuICAgIGNvbnN0IHJhbmRHYXVzcyA9IG5ldyBNUFJhbmRHYXVzcyhtZWFuLCBzdGREZXYsIGR0eXBlLCB0cnVlIC8qIHRydW5jYXRlZCAqLywgc2VlZCk7XG4gICAgY29uc3QgcmVzID0gYnVmZmVyKHNoYXBlLCBkdHlwZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXMudmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlcy52YWx1ZXNbaV0gPSByYW5kR2F1c3MubmV4dFZhbHVlKCk7XG4gICAgfVxuICAgIHJldHVybiByZXMudG9UZW5zb3IoKTtcbn1cbmV4cG9ydCBjb25zdCB0cnVuY2F0ZWROb3JtYWwgPSBvcCh7IHRydW5jYXRlZE5vcm1hbF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10cnVuY2F0ZWRfbm9ybWFsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBVbmlxdWUgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIEZpbmRzIHVuaXF1ZSBlbGVtZW50cyBhbG9uZyBhbiBheGlzIG9mIGEgdGVuc29yLlxuICpcbiAqIEl0IHJldHVybnMgYSB0ZW5zb3IgYHZhbHVlc2AgY29udGFpbmluZyBhbGwgb2YgdGhlIHVuaXF1ZSBlbGVtZW50cyBhbG9uZyB0aGVcbiAqIGBheGlzYCBvZiB0aGUgZ2l2ZW4gdGVuc29yIGB4YCBpbiB0aGUgc2FtZSBvcmRlciB0aGF0IHRoZXkgb2NjdXIgYWxvbmcgdGhlXG4gKiBgYXhpc2AgaW4gYHhgOyBgeGAgZG9lcyBub3QgbmVlZCB0byBiZSBzb3J0ZWQuIEl0IGFsc28gcmV0dXJucyBhIHRlbnNvclxuICogYGluZGljZXNgIHRoZSBzYW1lIHNpemUgYXMgdGhlIG51bWJlciBvZiB0aGUgZWxlbWVudHMgaW4gYHhgIGFsb25nIHRoZSBgYXhpc2BcbiAqIGRpbWVuc2lvbi4gSXQgY29udGFpbnMgdGhlIGluZGV4IGluIHRoZSB1bmlxdWUgb3V0cHV0IGB2YWx1ZXNgLlxuICpcbiAqIGBgYGpzXG4gKiAvLyBBIDEtRCB0ZW5zb3JcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMSwgMiwgNCwgNCwgNCwgNywgOCwgOF0pO1xuICogY29uc3Qge3ZhbHVlcywgaW5kaWNlc30gPSB0Zi51bmlxdWUoYSk7XG4gKiB2YWx1ZXMucHJpbnQoKTsgICAvLyBbMSwgMiwgNCwgNywgOCxdXG4gKiBpbmRpY2VzLnByaW50KCk7ICAvLyBbMCwgMCwgMSwgMiwgMiwgMiwgMywgNCwgNF1cbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBBIDItRCB0ZW5zb3Igd2l0aCBheGlzPTBcbiAqIC8vXG4gKiAvLyAnYScgaXM6IFtbMSwgMCwgMF0sXG4gKiAvLyAgICAgICAgICBbMSwgMCwgMF0sXG4gKiAvLyAgICAgICAgICBbMiwgMCwgMF1dXG4gKiBjb25zdCBhID0gdGYudGVuc29yMmQoW1sxLCAwLCAwXSwgWzEsIDAsIDBdLCBbMiwgMCwgMF1dKTtcbiAqIGNvbnN0IHt2YWx1ZXMsIGluZGljZXN9ID0gdGYudW5pcXVlKGEsIDApXG4gKiB2YWx1ZXMucHJpbnQoKTsgICAvLyBbWzEsIDAsIDBdLFxuICogICAgICAgICAgICAgICAgICAgLy8gIFsyLCAwLCAwXV1cbiAqIGluZGljZXMucHJpbnQoKTsgIC8vIFswLCAwLCAxXVxuICogYGBgXG4gKlxuICogYGBganNcbiAqIC8vIEEgMi1EIHRlbnNvciB3aXRoIGF4aXM9MVxuICogLy9cbiAqIC8vICdhJyBpczogW1sxLCAwLCAwXSxcbiAqIC8vICAgICAgICAgIFsxLCAwLCAwXSxcbiAqIC8vICAgICAgICAgIFsyLCAwLCAwXV1cbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IyZChbWzEsIDAsIDBdLCBbMSwgMCwgMF0sIFsyLCAwLCAwXV0pO1xuICogY29uc3Qge3ZhbHVlcywgaW5kaWNlc30gPSB0Zi51bmlxdWUoYSwgMSlcbiAqIHZhbHVlcy5wcmludCgpOyAgIC8vIFtbMSwgMF0sXG4gKiAgICAgICAgICAgICAgICAgICAvLyAgWzEsIDBdLFxuICogICAgICAgICAgICAgICAgICAgLy8gIFsyLCAwXV1cbiAqIGluZGljZXMucHJpbnQoKTsgIC8vIFswLCAxLCAxXVxuICogYGBgXG4gKiBAcGFyYW0geCBBIHRlbnNvciAoaW50MzIsIHN0cmluZywgYm9vbCkuXG4gKiBAcGFyYW0gYXhpcyBUaGUgYXhpcyBvZiB0aGUgdGVuc29yIHRvIGZpbmQgdGhlIHVuaXF1ZSBlbGVtZW50cy5cbiAqIEByZXR1cm5zIFt1bmlxdWVFbGVtZW50cywgaW5kaWNlc10gKHNlZSBhYm92ZSBmb3IgZGV0YWlscylcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdFdmFsdWF0aW9uJ31cbiAqL1xuZnVuY3Rpb24gdW5pcXVlXyh4LCBheGlzID0gMCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3VuaXF1ZScsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICAgIGFzc2VydCgkeC5yYW5rID4gMCwgKCkgPT4gJ1RoZSBpbnB1dCB0ZW5zb3IgbXVzdCBiZSBhdCBsZWFzdCAxRCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICBjb25zdCBhdHRycyA9IHsgYXhpcyB9O1xuICAgIGNvbnN0IFt2YWx1ZXMsIGluZGljZXNdID0gRU5HSU5FLnJ1bktlcm5lbChVbmlxdWUsIGlucHV0cywgYXR0cnMpO1xuICAgIHJldHVybiB7IHZhbHVlcywgaW5kaWNlcyB9O1xufVxuZXhwb3J0IGNvbnN0IHVuaXF1ZSA9IG9wKHsgdW5pcXVlXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVuaXF1ZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgVW5zb3J0ZWRTZWdtZW50U3VtIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnQsIGlzSW50IH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIHN1bSBhbG9uZyBzZWdtZW50cyBvZiBhIGB0Zi5UZW5zb3JgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDMsIDRdKTtcbiAqIGNvbnN0IHNlZ21lbnRJZHMgPSB0Zi50ZW5zb3IxZChbMSwgMiwgMCwgMV0sICdpbnQzMicpO1xuICogY29uc3QgbnVtU2VnbWVudHMgPSAzO1xuICpcbiAqIHgudW5zb3J0ZWRTZWdtZW50U3VtKHNlZ21lbnRJZHMsIG51bVNlZ21lbnRzKS5wcmludCgpXG4gKiAvL29yIHRmLnVuc29ydGVkU2VnbWVudFN1bSh4LCBzZWdtZW50SWRzLCBudW1TZWdtZW50cylcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGB0Zi5UZW5zb3JgIHRoYXQgd2lsbCBiZSBzdW1tZWQgYWxvbmcgaXRzIHNlZ21lbnRzLlxuICogQHBhcmFtIHNlZ21lbnRJZHMgQSBgdGYuVGVuc29yMURgIHdob3NlIHJhbmsgaXMgZXF1YWwgdG8gdGhlIHJhbmsgb2YgYHhgJ3NcbiAqIGRpbWVuc2lvbiBhbG9uZyB0aGUgYGF4aXNgLiAgTWFwcyBlYWNoIGVsZW1lbnQgb2YgYHhgIHRvIGEgc2VnbWVudC5cbiAqIEBwYXJhbSBudW1TZWdtZW50cyBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IGBzZWdtZW50SWRzYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTZWdtZW50J31cbiAqL1xuZnVuY3Rpb24gdW5zb3J0ZWRTZWdtZW50U3VtXyh4LCBzZWdtZW50SWRzLCBudW1TZWdtZW50cykge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3Vuc29ydGVkU2VnbWVudFN1bScpO1xuICAgIGNvbnN0ICRzZWdtZW50SWRzID0gY29udmVydFRvVGVuc29yKHNlZ21lbnRJZHMsICdzZWdtZW50SWRzJywgJ3Vuc29ydGVkU2VnbWVudFN1bScsICdpbnQzMicpO1xuICAgIGFzc2VydChpc0ludChudW1TZWdtZW50cyksICgpID0+ICdudW1TZWdtZW50cyBtdXN0IGJlIG9mIGR0eXBlIGludCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHgsIHNlZ21lbnRJZHM6ICRzZWdtZW50SWRzIH07XG4gICAgY29uc3QgYXR0cnMgPSB7IG51bVNlZ21lbnRzIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoVW5zb3J0ZWRTZWdtZW50U3VtLCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCB1bnNvcnRlZFNlZ21lbnRTdW0gPSBvcCh7IHVuc29ydGVkU2VnbWVudFN1bV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD11bnNvcnRlZF9zZWdtZW50X3N1bS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgVW5wYWNrIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIFVuc3RhY2tzIGEgYHRmLlRlbnNvcmAgb2YgcmFuay1gUmAgaW50byBhIGxpc3Qgb2YgcmFuay1gKFItMSlgIGB0Zi5UZW5zb3Jgcy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjJkKFsxLCAyLCAzLCA0XSwgWzIsIDJdKTtcbiAqXG4gKiB0Zi51bnN0YWNrKGEpLmZvckVhY2godGVuc29yID0+IHRlbnNvci5wcmludCgpKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IEEgdGVuc29yIG9iamVjdC5cbiAqIEBwYXJhbSBheGlzIFRoZSBheGlzIHRvIHVuc3RhY2sgYWxvbmcuIERlZmF1bHRzIHRvIDAgKHRoZSBmaXJzdCBkaW0pLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1NsaWNpbmcgYW5kIEpvaW5pbmcnfVxuICovXG5mdW5jdGlvbiB1bnN0YWNrXyh4LCBheGlzID0gMCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3Vuc3RhY2snLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgICB1dGlsLmFzc2VydChheGlzID49IC0keC5zaGFwZS5sZW5ndGggJiYgYXhpcyA8ICR4LnNoYXBlLmxlbmd0aCwgKCkgPT4gYEF4aXMgPSAke2F4aXN9IGlzIG5vdCBpbiBbLSR7JHguc2hhcGUubGVuZ3RofSwgJHskeC5zaGFwZS5sZW5ndGh9KWApO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgdmFsdWU6ICR4IH07XG4gICAgY29uc3QgYXR0cnMgPSB7IGF4aXMgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChVbnBhY2ssIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IHVuc3RhY2sgPSBvcCh7IHVuc3RhY2tfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dW5zdGFjay5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHZhcmlhYmxlIHdpdGggdGhlIHByb3ZpZGVkIGluaXRpYWwgdmFsdWUuXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnZhcmlhYmxlKHRmLnRlbnNvcihbMSwgMiwgM10pKTtcbiAqIHguYXNzaWduKHRmLnRlbnNvcihbNCwgNSwgNl0pKTtcbiAqXG4gKiB4LnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gaW5pdGlhbFZhbHVlIEluaXRpYWwgdmFsdWUgZm9yIHRoZSB0ZW5zb3IuXG4gKiBAcGFyYW0gdHJhaW5hYmxlIElmIHRydWUsIG9wdGltaXplcnMgYXJlIGFsbG93ZWQgdG8gdXBkYXRlIGl0LlxuICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdmFyaWFibGUuIERlZmF1bHRzIHRvIGEgdW5pcXVlIGlkLlxuICogQHBhcmFtIGR0eXBlIElmIHNldCwgaW5pdGlhbFZhbHVlIHdpbGwgYmUgY29udmVydGVkIHRvIHRoZSBnaXZlbiB0eXBlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhcmlhYmxlKGluaXRpYWxWYWx1ZSwgdHJhaW5hYmxlID0gdHJ1ZSwgbmFtZSwgZHR5cGUpIHtcbiAgICByZXR1cm4gRU5HSU5FLm1ha2VWYXJpYWJsZShpbml0aWFsVmFsdWUsIHRyYWluYWJsZSwgbmFtZSwgZHR5cGUpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dmFyaWFibGUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFNlbGVjdCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYnJvYWRjYXN0VG8gfSBmcm9tICcuL2Jyb2FkY2FzdF90byc7XG5pbXBvcnQgeyBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSB9IGZyb20gJy4vYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIFJldHVybnMgdGhlIGVsZW1lbnRzLCBlaXRoZXIgYGFgIG9yIGBiYCBkZXBlbmRpbmcgb24gdGhlIGBjb25kaXRpb25gLlxuICpcbiAqIElmIHRoZSBjb25kaXRpb24gaXMgdHJ1ZSwgc2VsZWN0IGZyb20gYGFgLCBvdGhlcndpc2Ugc2VsZWN0IGZyb20gYGJgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBjb25kID0gdGYudGVuc29yMWQoW2ZhbHNlLCBmYWxzZSwgdHJ1ZV0sICdib29sJyk7XG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEgLCAyLCAzXSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWy0xLCAtMiwgLTNdKTtcbiAqXG4gKiBhLndoZXJlKGNvbmQsIGIpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gY29uZGl0aW9uIFRoZSBpbnB1dCBjb25kaXRpb24uIE11c3QgYmUgb2YgZHR5cGUgYm9vbC5cbiAqIEBwYXJhbSBhIElmIGBjb25kaXRpb25gIGlzIHJhbmsgMSwgYGFgIG1heSBoYXZlIGEgaGlnaGVyIHJhbmsgYnV0XG4gKiAgICAgaXRzIGZpcnN0IGRpbWVuc2lvbiBtdXN0IG1hdGNoIHRoZSBzaXplIG9mIGBjb25kaXRpb25gLlxuICogQHBhcmFtIGIgQSB0ZW5zb3Igd2l0aCB0aGUgc2FtZSBkdHlwZSBhcyBgYWAgYW5kIHdpdGggc2hhcGUgdGhhdCBpc1xuICogICAgIGNvbXBhdGlibGUgd2l0aCBgYWAuXG4gKiBAcmV0dXJuIEEgdGVuc29yIHdpdGggc2FtZSBkdHlwZSBhcyBgYWAgYW5kIGBiYCwgYW5kIHNoYXBlIHRoYXQgaXNcbiAqICAgICBicm9hZGNhc3RhYmxlIGZyb20gYGFgIGFuZCBgYmAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTG9naWNhbCd9XG4gKi9cbmZ1bmN0aW9uIHdoZXJlXyhjb25kaXRpb24sIGEsIGIpIHtcbiAgICBjb25zdCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICd3aGVyZScpO1xuICAgIGNvbnN0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ3doZXJlJyk7XG4gICAgY29uc3QgJGNvbmRpdGlvbiA9IGNvbnZlcnRUb1RlbnNvcihjb25kaXRpb24sICdjb25kaXRpb24nLCAnd2hlcmUnLCAnYm9vbCcpO1xuICAgIC8vIFRPRE86IG1vdmUgdGhpcyBsb2dpYyB0byBmb3J3YXJkIGZ1bmN0aW9uIHdoZW4gdGhlIGJyb2FkY2FzdFRvIG9wIGlzXG4gICAgLy8gaW1wbGVtZW50ZWQgaW4gV0FTTS5cbiAgICAvLyBGaW5kIHRoZSBicm9hZGNhc3RhYmxlIHNoYXBlIGZvciAkY29uZGl0aW9uLCAkYSwgYW5kICRiLlxuICAgIGNvbnN0IGJyb2FkY2FzdFNoYXBlID0gYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoJGNvbmRpdGlvbi5zaGFwZSwgJGEuc2hhcGUpLCAkYi5zaGFwZSk7XG4gICAgY29uc3QgJGJyb2FkY2FzdGVkQ29uZGl0aW9uID0gYnJvYWRjYXN0VG8oJGNvbmRpdGlvbiwgYnJvYWRjYXN0U2hhcGUpO1xuICAgIGNvbnN0ICRicm9hZGNhc3RlZEEgPSBicm9hZGNhc3RUbygkYSwgYnJvYWRjYXN0U2hhcGUpO1xuICAgIGNvbnN0ICRicm9hZGNhc3RlZEIgPSBicm9hZGNhc3RUbygkYiwgYnJvYWRjYXN0U2hhcGUpO1xuICAgIGNvbnN0IGlucHV0cyA9IHtcbiAgICAgICAgY29uZGl0aW9uOiAkYnJvYWRjYXN0ZWRDb25kaXRpb24sXG4gICAgICAgIHQ6ICRicm9hZGNhc3RlZEEsXG4gICAgICAgIGU6ICRicm9hZGNhc3RlZEJcbiAgICB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFNlbGVjdCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCB3aGVyZSA9IG9wKHsgd2hlcmVfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d2hlcmUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgd2hlcmVJbXBsIH0gZnJvbSAnLi4vYmFja2VuZHMvd2hlcmVfaW1wbCc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBjb29yZGluYXRlcyBvZiB0cnVlIGVsZW1lbnRzIG9mIGNvbmRpdGlvbi5cbiAqXG4gKiBUaGUgY29vcmRpbmF0ZXMgYXJlIHJldHVybmVkIGluIGEgMi1EIHRlbnNvciB3aGVyZSB0aGUgZmlyc3QgZGltZW5zaW9uIChyb3dzKVxuICogcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIHRydWUgZWxlbWVudHMsIGFuZCB0aGUgc2Vjb25kIGRpbWVuc2lvbiAoY29sdW1ucylcbiAqIHJlcHJlc2VudHMgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSB0cnVlIGVsZW1lbnRzLiBLZWVwIGluIG1pbmQsIHRoZSBzaGFwZSBvZlxuICogdGhlIG91dHB1dCB0ZW5zb3IgY2FuIHZhcnkgZGVwZW5kaW5nIG9uIGhvdyBtYW55IHRydWUgdmFsdWVzIHRoZXJlIGFyZSBpblxuICogaW5wdXQuIEluZGljZXMgYXJlIG91dHB1dCBpbiByb3ctbWFqb3Igb3JkZXIuIFRoZSByZXN1bHRpbmcgdGVuc29yIGhhcyB0aGVcbiAqIHNoYXBlIGBbbnVtVHJ1ZUVsZW1zLCBjb25kaXRpb24ucmFua11gLlxuICpcbiAqIFRoaXMgaXMgYW5hbG9nb3VzIHRvIGNhbGxpbmcgdGhlIHB5dGhvbiBgdGYud2hlcmUoY29uZClgIHdpdGhvdXQgYW4geCBvciB5LlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBjb25kID0gdGYudGVuc29yMWQoW2ZhbHNlLCBmYWxzZSwgdHJ1ZV0sICdib29sJyk7XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCB0Zi53aGVyZUFzeW5jKGNvbmQpO1xuICogcmVzdWx0LnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdMb2dpY2FsJ31cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd2hlcmVBc3luY18oY29uZGl0aW9uKSB7XG4gICAgY29uc3QgJGNvbmRpdGlvbiA9IGNvbnZlcnRUb1RlbnNvcihjb25kaXRpb24sICdjb25kaXRpb24nLCAnd2hlcmVBc3luYycsICdib29sJyk7XG4gICAgY29uc3QgdmFscyA9IGF3YWl0ICRjb25kaXRpb24uZGF0YSgpO1xuICAgIGNvbnN0IHJlcyA9IHdoZXJlSW1wbCgkY29uZGl0aW9uLnNoYXBlLCB2YWxzKTtcbiAgICBpZiAoY29uZGl0aW9uICE9PSAkY29uZGl0aW9uKSB7XG4gICAgICAgICRjb25kaXRpb24uZGlzcG9zZSgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IHdoZXJlQXN5bmMgPSB3aGVyZUFzeW5jXztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXdoZXJlX2FzeW5jLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBtYWtlWmVyb3NUeXBlZEFycmF5LCBzaXplRnJvbVNoYXBlIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBjb21wbGV4IH0gZnJvbSAnLi9jb21wbGV4Jztcbi8qKlxuICogQ3JlYXRlcyBhIGB0Zi5UZW5zb3JgIHdpdGggYWxsIGVsZW1lbnRzIHNldCB0byAwLlxuICpcbiAqIGBgYGpzXG4gKiB0Zi56ZXJvcyhbMiwgMl0pLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gc2hhcGUgQW4gYXJyYXkgb2YgaW50ZWdlcnMgZGVmaW5pbmcgdGhlIG91dHB1dCB0ZW5zb3Igc2hhcGUuXG4gKiBAcGFyYW0gZHR5cGUgVGhlIHR5cGUgb2YgYW4gZWxlbWVudCBpbiB0aGUgcmVzdWx0aW5nIHRlbnNvci4gQ2FuXG4gKiAgICAgYmUgJ2Zsb2F0MzInLCAnaW50MzInIG9yICdib29sJy4gRGVmYXVsdHMgdG8gJ2Zsb2F0Jy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB6ZXJvcyhzaGFwZSwgZHR5cGUgPSAnZmxvYXQzMicpIHtcbiAgICBpZiAoZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICAgIGNvbnN0IHJlYWwgPSB6ZXJvcyhzaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICAgICAgY29uc3QgaW1hZyA9IHplcm9zKHNoYXBlLCAnZmxvYXQzMicpO1xuICAgICAgICByZXR1cm4gY29tcGxleChyZWFsLCBpbWFnKTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWVzID0gbWFrZVplcm9zVHlwZWRBcnJheShzaXplRnJvbVNoYXBlKHNoYXBlKSwgZHR5cGUpO1xuICAgIHJldHVybiBFTkdJTkUubWFrZVRlbnNvcih2YWx1ZXMsIHNoYXBlLCBkdHlwZSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD16ZXJvcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgWmVyb3NMaWtlIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ3JlYXRlcyBhIGB0Zi5UZW5zb3JgIHdpdGggYWxsIGVsZW1lbnRzIHNldCB0byAwIHdpdGggdGhlIHNhbWUgc2hhcGUgYXMgdGhlXG4gKiBnaXZlbiB0ZW5zb3IuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IoWzEsIDJdKTtcbiAqIHRmLnplcm9zTGlrZSh4KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIHRlbnNvciBvZiByZXF1aXJlZCBzaGFwZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmZ1bmN0aW9uIHplcm9zTGlrZV8oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3plcm9zTGlrZScpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChaZXJvc0xpa2UsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgemVyb3NMaWtlID0gb3AoeyB6ZXJvc0xpa2VfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9emVyb3NfbGlrZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgZGlzcG9zZSwgdGlkeSB9IGZyb20gJy4uL2dsb2JhbHMnO1xuaW1wb3J0IHsgYWRkIH0gZnJvbSAnLi4vb3BzL2FkZCc7XG5pbXBvcnQgeyBkaXYgfSBmcm9tICcuLi9vcHMvZGl2JztcbmltcG9ydCB7IG11bCB9IGZyb20gJy4uL29wcy9tdWwnO1xuaW1wb3J0IHsgc3FydCB9IGZyb20gJy4uL29wcy9vcHMnO1xuaW1wb3J0IHsgc3F1YXJlIH0gZnJvbSAnLi4vb3BzL3NxdWFyZSc7XG5pbXBvcnQgeyB6ZXJvc0xpa2UgfSBmcm9tICcuLi9vcHMvemVyb3NfbGlrZSc7XG5pbXBvcnQgeyByZWdpc3RlckNsYXNzIH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbic7XG5pbXBvcnQgeyBPcHRpbWl6ZXIgfSBmcm9tICcuL29wdGltaXplcic7XG4vKiogQGRvY2xpbmsgT3B0aW1pemVyICovXG5leHBvcnQgY2xhc3MgQWRhZGVsdGFPcHRpbWl6ZXIgZXh0ZW5kcyBPcHRpbWl6ZXIge1xuICAgIGNvbnN0cnVjdG9yKGxlYXJuaW5nUmF0ZSwgcmhvLCBlcHNpbG9uID0gbnVsbCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmxlYXJuaW5nUmF0ZSA9IGxlYXJuaW5nUmF0ZTtcbiAgICAgICAgdGhpcy5yaG8gPSByaG87XG4gICAgICAgIHRoaXMuZXBzaWxvbiA9IGVwc2lsb247XG4gICAgICAgIHRoaXMuYWNjdW11bGF0ZWRHcmFkcyA9IFtdO1xuICAgICAgICB0aGlzLmFjY3VtdWxhdGVkVXBkYXRlcyA9IFtdO1xuICAgICAgICBpZiAoZXBzaWxvbiA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmVwc2lsb24gPSBFTkdJTkUuYmFja2VuZC5lcHNpbG9uKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXBwbHlHcmFkaWVudHModmFyaWFibGVHcmFkaWVudHMpIHtcbiAgICAgICAgY29uc3QgdmFyaWFibGVOYW1lcyA9IEFycmF5LmlzQXJyYXkodmFyaWFibGVHcmFkaWVudHMpID9cbiAgICAgICAgICAgIHZhcmlhYmxlR3JhZGllbnRzLm1hcChpdGVtID0+IGl0ZW0ubmFtZSkgOlxuICAgICAgICAgICAgT2JqZWN0LmtleXModmFyaWFibGVHcmFkaWVudHMpO1xuICAgICAgICB2YXJpYWJsZU5hbWVzLmZvckVhY2goKG5hbWUsIGkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gRU5HSU5FLnJlZ2lzdGVyZWRWYXJpYWJsZXNbbmFtZV07XG4gICAgICAgICAgICBjb25zdCB0cmFpbmFibGUgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkR3JhZHNbaV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWNjdW11bGF0ZWRHcmFkc1tpXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lOiBgJHtuYW1lfS9hY2N1bV9ncmFkYCxcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGU6IHRpZHkoKCkgPT4gemVyb3NMaWtlKHZhbHVlKS52YXJpYWJsZSh0cmFpbmFibGUpKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5hY2N1bXVsYXRlZFVwZGF0ZXNbaV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWNjdW11bGF0ZWRVcGRhdGVzW2ldID0ge1xuICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbE5hbWU6IGAke25hbWV9L2FjY3VtX3ZhcmAsXG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlOiB0aWR5KCgpID0+IHplcm9zTGlrZSh2YWx1ZSkudmFyaWFibGUodHJhaW5hYmxlKSlcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZ3JhZGllbnQgPSBBcnJheS5pc0FycmF5KHZhcmlhYmxlR3JhZGllbnRzKSA/XG4gICAgICAgICAgICAgICAgdmFyaWFibGVHcmFkaWVudHNbaV0udGVuc29yIDpcbiAgICAgICAgICAgICAgICB2YXJpYWJsZUdyYWRpZW50c1tuYW1lXTtcbiAgICAgICAgICAgIGlmIChncmFkaWVudCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYWNjdW11bGF0ZWRHcmFkID0gdGhpcy5hY2N1bXVsYXRlZEdyYWRzW2ldLnZhcmlhYmxlO1xuICAgICAgICAgICAgY29uc3QgYWNjdW11bGF0ZWRVcGRhdGUgPSB0aGlzLmFjY3VtdWxhdGVkVXBkYXRlc1tpXS52YXJpYWJsZTtcbiAgICAgICAgICAgIHRpZHkoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0FjY3VtdWxhdGVkR3JhZCA9IGFkZChtdWwoYWNjdW11bGF0ZWRHcmFkLCB0aGlzLnJobyksIG11bChzcXVhcmUoZ3JhZGllbnQpLCAxIC0gdGhpcy5yaG8pKTtcbiAgICAgICAgICAgICAgICBjb25zdCB1cGRhdGVzID0gbXVsKGRpdihzcXJ0KGFkZChhY2N1bXVsYXRlZFVwZGF0ZSwgdGhpcy5lcHNpbG9uKSksIHNxcnQoYWRkKGFjY3VtdWxhdGVkR3JhZCwgdGhpcy5lcHNpbG9uKSkpLCBncmFkaWVudCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3QWNjdW11bGF0ZWRVcGRhdGUgPSBhZGQobXVsKGFjY3VtdWxhdGVkVXBkYXRlLCB0aGlzLnJobyksIG11bChzcXVhcmUodXBkYXRlcyksIDEgLSB0aGlzLnJobykpO1xuICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkR3JhZC5hc3NpZ24obmV3QWNjdW11bGF0ZWRHcmFkKTtcbiAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZFVwZGF0ZS5hc3NpZ24obmV3QWNjdW11bGF0ZWRVcGRhdGUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gYWRkKG11bCh1cGRhdGVzLCAtdGhpcy5sZWFybmluZ1JhdGUpLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgdmFsdWUuYXNzaWduKG5ld1ZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5pbmNyZW1lbnRJdGVyYXRpb25zKCk7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkVXBkYXRlcyAhPSBudWxsKSB7XG4gICAgICAgICAgICBkaXNwb3NlKHRoaXMuYWNjdW11bGF0ZWRHcmFkcy5tYXAodiA9PiB2LnZhcmlhYmxlKSk7XG4gICAgICAgICAgICBkaXNwb3NlKHRoaXMuYWNjdW11bGF0ZWRVcGRhdGVzLm1hcCh2ID0+IHYudmFyaWFibGUpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBnZXRXZWlnaHRzKCkge1xuICAgICAgICAvLyBPcmRlciBtYXR0ZXJzIGZvciBQeXRob24gY29tcGF0aWJpbGl0eS5cbiAgICAgICAgY29uc3QgdmFyaWFibGVzID0gWy4uLnRoaXMuYWNjdW11bGF0ZWRHcmFkcywgLi4udGhpcy5hY2N1bXVsYXRlZFVwZGF0ZXNdO1xuICAgICAgICByZXR1cm4gW2F3YWl0IHRoaXMuc2F2ZUl0ZXJhdGlvbnMoKV0uY29uY2F0KHZhcmlhYmxlcy5tYXAodiA9PiAoeyBuYW1lOiB2Lm9yaWdpbmFsTmFtZSwgdGVuc29yOiB2LnZhcmlhYmxlIH0pKSk7XG4gICAgfVxuICAgIGFzeW5jIHNldFdlaWdodHMod2VpZ2h0VmFsdWVzKSB7XG4gICAgICAgIHdlaWdodFZhbHVlcyA9IGF3YWl0IHRoaXMuZXh0cmFjdEl0ZXJhdGlvbnMod2VpZ2h0VmFsdWVzKTtcbiAgICAgICAgY29uc3QgdmFyaWFibGVDb3VudCA9IHdlaWdodFZhbHVlcy5sZW5ndGggLyAyO1xuICAgICAgICBjb25zdCB0cmFpbmFibGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hY2N1bXVsYXRlZEdyYWRzID1cbiAgICAgICAgICAgIHdlaWdodFZhbHVlcy5zbGljZSgwLCB2YXJpYWJsZUNvdW50KS5tYXAodiA9PiAoe1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogdi5uYW1lLFxuICAgICAgICAgICAgICAgIHZhcmlhYmxlOiB2LnRlbnNvci52YXJpYWJsZSh0cmFpbmFibGUpXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIHRoaXMuYWNjdW11bGF0ZWRVcGRhdGVzID1cbiAgICAgICAgICAgIHdlaWdodFZhbHVlcy5zbGljZSh2YXJpYWJsZUNvdW50LCB2YXJpYWJsZUNvdW50ICogMilcbiAgICAgICAgICAgICAgICAubWFwKHYgPT4gKHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbE5hbWU6IHYubmFtZSxcbiAgICAgICAgICAgICAgICB2YXJpYWJsZTogdi50ZW5zb3IudmFyaWFibGUodHJhaW5hYmxlKVxuICAgICAgICAgICAgfSkpO1xuICAgIH1cbiAgICBnZXRDb25maWcoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnbGVhcm5pbmdSYXRlJzogdGhpcy5sZWFybmluZ1JhdGUsXG4gICAgICAgICAgICAncmhvJzogdGhpcy5yaG8sXG4gICAgICAgICAgICAnZXBzaWxvbic6IHRoaXMuZXBzaWxvblxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBzdGF0aWMgZnJvbUNvbmZpZyhjbHMsIGNvbmZpZykge1xuICAgICAgICByZXR1cm4gbmV3IGNscyhjb25maWdbJ2xlYXJuaW5nUmF0ZSddLCBjb25maWdbJ3JobyddLCBjb25maWdbJ2Vwc2lsb24nXSk7XG4gICAgfVxufVxuLyoqIEBub2NvbGxhcHNlICovXG5BZGFkZWx0YU9wdGltaXplci5jbGFzc05hbWUgPSAnQWRhZGVsdGEnOyAvLyBOYW1lIG1hdHRlcnMgZm9yIFB5dGhvbiBjb21wYXRpYmlsaXR5LlxucmVnaXN0ZXJDbGFzcyhBZGFkZWx0YU9wdGltaXplcik7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hZGFkZWx0YV9vcHRpbWl6ZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IGRpc3Bvc2UsIHRpZHkgfSBmcm9tICcuLi9nbG9iYWxzJztcbmltcG9ydCB7IGFkZCB9IGZyb20gJy4uL29wcy9hZGQnO1xuaW1wb3J0IHsgZGl2IH0gZnJvbSAnLi4vb3BzL2Rpdic7XG5pbXBvcnQgeyBmaWxsIH0gZnJvbSAnLi4vb3BzL2ZpbGwnO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQgeyBzcXJ0IH0gZnJvbSAnLi4vb3BzL3NxcnQnO1xuaW1wb3J0IHsgc3F1YXJlIH0gZnJvbSAnLi4vb3BzL3NxdWFyZSc7XG5pbXBvcnQgeyByZWdpc3RlckNsYXNzIH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbic7XG5pbXBvcnQgeyBPcHRpbWl6ZXIgfSBmcm9tICcuL29wdGltaXplcic7XG4vKiogQGRvY2xpbmsgT3B0aW1pemVyICovXG5leHBvcnQgY2xhc3MgQWRhZ3JhZE9wdGltaXplciBleHRlbmRzIE9wdGltaXplciB7XG4gICAgY29uc3RydWN0b3IobGVhcm5pbmdSYXRlLCBpbml0aWFsQWNjdW11bGF0b3JWYWx1ZSA9IDAuMSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmxlYXJuaW5nUmF0ZSA9IGxlYXJuaW5nUmF0ZTtcbiAgICAgICAgdGhpcy5pbml0aWFsQWNjdW11bGF0b3JWYWx1ZSA9IGluaXRpYWxBY2N1bXVsYXRvclZhbHVlO1xuICAgICAgICB0aGlzLmFjY3VtdWxhdGVkR3JhZHMgPSBbXTtcbiAgICB9XG4gICAgYXBwbHlHcmFkaWVudHModmFyaWFibGVHcmFkaWVudHMpIHtcbiAgICAgICAgY29uc3QgdmFyaWFibGVOYW1lcyA9IEFycmF5LmlzQXJyYXkodmFyaWFibGVHcmFkaWVudHMpID9cbiAgICAgICAgICAgIHZhcmlhYmxlR3JhZGllbnRzLm1hcChpdGVtID0+IGl0ZW0ubmFtZSkgOlxuICAgICAgICAgICAgT2JqZWN0LmtleXModmFyaWFibGVHcmFkaWVudHMpO1xuICAgICAgICB2YXJpYWJsZU5hbWVzLmZvckVhY2goKG5hbWUsIGkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gRU5HSU5FLnJlZ2lzdGVyZWRWYXJpYWJsZXNbbmFtZV07XG4gICAgICAgICAgICBpZiAodGhpcy5hY2N1bXVsYXRlZEdyYWRzW2ldID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0cmFpbmFibGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmFjY3VtdWxhdGVkR3JhZHNbaV0gPSB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogYCR7bmFtZX0vYWNjdW11bGF0b3JgLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogdGlkeSgoKSA9PiBmaWxsKHZhbHVlLnNoYXBlLCB0aGlzLmluaXRpYWxBY2N1bXVsYXRvclZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnZhcmlhYmxlKHRyYWluYWJsZSkpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGdyYWRpZW50ID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JhZGllbnRzW2ldLnRlbnNvciA6XG4gICAgICAgICAgICAgICAgdmFyaWFibGVHcmFkaWVudHNbbmFtZV07XG4gICAgICAgICAgICBpZiAoZ3JhZGllbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFjY3VtdWxhdGVkR3JhZCA9IHRoaXMuYWNjdW11bGF0ZWRHcmFkc1tpXS52YXJpYWJsZTtcbiAgICAgICAgICAgIHRpZHkoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0FjY3VtdWxhdGVkR3JhZCA9IGFkZChhY2N1bXVsYXRlZEdyYWQsIHNxdWFyZShncmFkaWVudCkpO1xuICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkR3JhZC5hc3NpZ24obmV3QWNjdW11bGF0ZWRHcmFkKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IGFkZChtdWwoZGl2KGdyYWRpZW50LCBzcXJ0KGFkZChuZXdBY2N1bXVsYXRlZEdyYWQsIEVOR0lORS5iYWNrZW5kLmVwc2lsb24oKSkpKSwgLXRoaXMubGVhcm5pbmdSYXRlKSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIHZhbHVlLmFzc2lnbihuZXdWYWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaW5jcmVtZW50SXRlcmF0aW9ucygpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICBpZiAodGhpcy5hY2N1bXVsYXRlZEdyYWRzICE9IG51bGwpIHtcbiAgICAgICAgICAgIGRpc3Bvc2UodGhpcy5hY2N1bXVsYXRlZEdyYWRzLm1hcCh2ID0+IHYudmFyaWFibGUpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBnZXRXZWlnaHRzKCkge1xuICAgICAgICAvLyBPcmRlciBtYXR0ZXJzIGZvciBQeXRob24gY29tcGF0aWJpbGl0eS5cbiAgICAgICAgcmV0dXJuIFthd2FpdCB0aGlzLnNhdmVJdGVyYXRpb25zKCldLmNvbmNhdCh0aGlzLmFjY3VtdWxhdGVkR3JhZHMubWFwKHYgPT4gKHsgbmFtZTogdi5vcmlnaW5hbE5hbWUsIHRlbnNvcjogdi52YXJpYWJsZSB9KSkpO1xuICAgIH1cbiAgICBhc3luYyBzZXRXZWlnaHRzKHdlaWdodFZhbHVlcykge1xuICAgICAgICB3ZWlnaHRWYWx1ZXMgPSBhd2FpdCB0aGlzLmV4dHJhY3RJdGVyYXRpb25zKHdlaWdodFZhbHVlcyk7XG4gICAgICAgIGNvbnN0IHRyYWluYWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFjY3VtdWxhdGVkR3JhZHMgPSB3ZWlnaHRWYWx1ZXMubWFwKHYgPT4gKHsgb3JpZ2luYWxOYW1lOiB2Lm5hbWUsIHZhcmlhYmxlOiB2LnRlbnNvci52YXJpYWJsZSh0cmFpbmFibGUpIH0pKTtcbiAgICB9XG4gICAgZ2V0Q29uZmlnKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ2xlYXJuaW5nUmF0ZSc6IHRoaXMubGVhcm5pbmdSYXRlLFxuICAgICAgICAgICAgJ2luaXRpYWxBY2N1bXVsYXRvclZhbHVlJzogdGhpcy5pbml0aWFsQWNjdW11bGF0b3JWYWx1ZSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgc3RhdGljIGZyb21Db25maWcoY2xzLCBjb25maWcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBjbHMoY29uZmlnWydsZWFybmluZ1JhdGUnXSwgY29uZmlnWydpbml0aWFsQWNjdW11bGF0b3JWYWx1ZSddKTtcbiAgICB9XG59XG4vKiogQG5vY29sbGFwc2UgKi9cbkFkYWdyYWRPcHRpbWl6ZXIuY2xhc3NOYW1lID0gJ0FkYWdyYWQnOyAvLyBOb3RlOiBOYW1lIG1hdHRlcnMgZm9yIFB5dGhvbiBjb21wYXRpYmlsaXR5LlxucmVnaXN0ZXJDbGFzcyhBZGFncmFkT3B0aW1pemVyKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFkYWdyYWRfb3B0aW1pemVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBkaXNwb3NlLCB0aWR5IH0gZnJvbSAnLi4vZ2xvYmFscyc7XG5pbXBvcnQgeyBhZGQgfSBmcm9tICcuLi9vcHMvYWRkJztcbmltcG9ydCB7IGRpdiB9IGZyb20gJy4uL29wcy9kaXYnO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQgeyBwb3cgfSBmcm9tICcuLi9vcHMvcG93JztcbmltcG9ydCB7IHNjYWxhciB9IGZyb20gJy4uL29wcy9zY2FsYXInO1xuaW1wb3J0IHsgc3FydCB9IGZyb20gJy4uL29wcy9zcXJ0JztcbmltcG9ydCB7IHNxdWFyZSB9IGZyb20gJy4uL29wcy9zcXVhcmUnO1xuaW1wb3J0IHsgc3ViIH0gZnJvbSAnLi4vb3BzL3N1Yic7XG5pbXBvcnQgeyB6ZXJvc0xpa2UgfSBmcm9tICcuLi9vcHMvemVyb3NfbGlrZSc7XG5pbXBvcnQgeyByZWdpc3RlckNsYXNzIH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbic7XG5pbXBvcnQgeyBPcHRpbWl6ZXIgfSBmcm9tICcuL29wdGltaXplcic7XG5leHBvcnQgY2xhc3MgQWRhbU9wdGltaXplciBleHRlbmRzIE9wdGltaXplciB7XG4gICAgY29uc3RydWN0b3IobGVhcm5pbmdSYXRlLCBiZXRhMSwgYmV0YTIsIGVwc2lsb24gPSBudWxsKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMubGVhcm5pbmdSYXRlID0gbGVhcm5pbmdSYXRlO1xuICAgICAgICB0aGlzLmJldGExID0gYmV0YTE7XG4gICAgICAgIHRoaXMuYmV0YTIgPSBiZXRhMjtcbiAgICAgICAgdGhpcy5lcHNpbG9uID0gZXBzaWxvbjtcbiAgICAgICAgdGhpcy5hY2N1bXVsYXRlZEZpcnN0TW9tZW50ID0gW107XG4gICAgICAgIHRoaXMuYWNjdW11bGF0ZWRTZWNvbmRNb21lbnQgPSBbXTtcbiAgICAgICAgdGlkeSgoKSA9PiB7XG4gICAgICAgICAgICAvLyBhY2NCKiB3aWxsIGJlIHVwZGF0ZWQgYnkgYmF0Y2guXG4gICAgICAgICAgICB0aGlzLmFjY0JldGExID0gc2NhbGFyKGJldGExKS52YXJpYWJsZSgpO1xuICAgICAgICAgICAgdGhpcy5hY2NCZXRhMiA9IHNjYWxhcihiZXRhMikudmFyaWFibGUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChlcHNpbG9uID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZXBzaWxvbiA9IEVOR0lORS5iYWNrZW5kLmVwc2lsb24oKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhcHBseUdyYWRpZW50cyh2YXJpYWJsZUdyYWRpZW50cykge1xuICAgICAgICBjb25zdCB2YXJOYW1lcyA9IEFycmF5LmlzQXJyYXkodmFyaWFibGVHcmFkaWVudHMpID9cbiAgICAgICAgICAgIHZhcmlhYmxlR3JhZGllbnRzLm1hcCh2ID0+IHYubmFtZSkgOlxuICAgICAgICAgICAgT2JqZWN0LmtleXModmFyaWFibGVHcmFkaWVudHMpO1xuICAgICAgICB0aWR5KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9uZU1pbnVzQWNjQmV0YTEgPSBzdWIoMSwgdGhpcy5hY2NCZXRhMSk7XG4gICAgICAgICAgICBjb25zdCBvbmVNaW51c0FjY0JldGEyID0gc3ViKDEsIHRoaXMuYWNjQmV0YTIpO1xuICAgICAgICAgICAgdmFyTmFtZXMuZm9yRWFjaCgobmFtZSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gRU5HSU5FLnJlZ2lzdGVyZWRWYXJpYWJsZXNbbmFtZV07XG4gICAgICAgICAgICAgICAgY29uc3QgdHJhaW5hYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWNjdW11bGF0ZWRGaXJzdE1vbWVudFtpXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWNjdW11bGF0ZWRGaXJzdE1vbWVudFtpXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogYCR7bmFtZX0vbWAsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogdGlkeSgoKSA9PiB6ZXJvc0xpa2UodmFsdWUpLnZhcmlhYmxlKHRyYWluYWJsZSkpXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkU2Vjb25kTW9tZW50W2ldID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY2N1bXVsYXRlZFNlY29uZE1vbWVudFtpXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogYCR7bmFtZX0vdmAsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogdGlkeSgoKSA9PiB6ZXJvc0xpa2UodmFsdWUpLnZhcmlhYmxlKHRyYWluYWJsZSkpXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGdyYWRpZW50ID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyYWRpZW50c1tpXS50ZW5zb3IgOlxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyYWRpZW50c1tuYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAoZ3JhZGllbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0TW9tZW50ID0gdGhpcy5hY2N1bXVsYXRlZEZpcnN0TW9tZW50W2ldLnZhcmlhYmxlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlY29uZE1vbWVudCA9IHRoaXMuYWNjdW11bGF0ZWRTZWNvbmRNb21lbnRbaV0udmFyaWFibGU7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Rmlyc3RNb21lbnQgPSBhZGQobXVsKGZpcnN0TW9tZW50LCB0aGlzLmJldGExKSwgbXVsKGdyYWRpZW50LCAxIC0gdGhpcy5iZXRhMSkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1NlY29uZE1vbWVudCA9IGFkZChtdWwoc2Vjb25kTW9tZW50LCB0aGlzLmJldGEyKSwgbXVsKHNxdWFyZShncmFkaWVudCksIDEgLSB0aGlzLmJldGEyKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgYmlhc0NvcnJlY3RlZEZpcnN0TW9tZW50ID0gZGl2KG5ld0ZpcnN0TW9tZW50LCBvbmVNaW51c0FjY0JldGExKTtcbiAgICAgICAgICAgICAgICBjb25zdCBiaWFzQ29ycmVjdGVkU2Vjb25kTW9tZW50ID0gZGl2KG5ld1NlY29uZE1vbWVudCwgb25lTWludXNBY2NCZXRhMik7XG4gICAgICAgICAgICAgICAgZmlyc3RNb21lbnQuYXNzaWduKG5ld0ZpcnN0TW9tZW50KTtcbiAgICAgICAgICAgICAgICBzZWNvbmRNb21lbnQuYXNzaWduKG5ld1NlY29uZE1vbWVudCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBhZGQobXVsKGRpdihiaWFzQ29ycmVjdGVkRmlyc3RNb21lbnQsIGFkZChzcXJ0KGJpYXNDb3JyZWN0ZWRTZWNvbmRNb21lbnQpLCB0aGlzLmVwc2lsb24pKSwgLXRoaXMubGVhcm5pbmdSYXRlKSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIHZhbHVlLmFzc2lnbihuZXdWYWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuYWNjQmV0YTEuYXNzaWduKG11bCh0aGlzLmFjY0JldGExLCB0aGlzLmJldGExKSk7XG4gICAgICAgICAgICB0aGlzLmFjY0JldGEyLmFzc2lnbihtdWwodGhpcy5hY2NCZXRhMiwgdGhpcy5iZXRhMikpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5pbmNyZW1lbnRJdGVyYXRpb25zKCk7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIHRoaXMuYWNjQmV0YTEuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmFjY0JldGEyLmRpc3Bvc2UoKTtcbiAgICAgICAgaWYgKHRoaXMuYWNjdW11bGF0ZWRGaXJzdE1vbWVudCAhPSBudWxsKSB7XG4gICAgICAgICAgICBkaXNwb3NlKHRoaXMuYWNjdW11bGF0ZWRGaXJzdE1vbWVudC5tYXAodiA9PiB2LnZhcmlhYmxlKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYWNjdW11bGF0ZWRTZWNvbmRNb21lbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgZGlzcG9zZSh0aGlzLmFjY3VtdWxhdGVkU2Vjb25kTW9tZW50Lm1hcCh2ID0+IHYudmFyaWFibGUpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBnZXRXZWlnaHRzKCkge1xuICAgICAgICAvLyBPcmRlciBtYXR0ZXJzIGZvciBQeXRob24gY29tcGF0aWJpbGl0eS5cbiAgICAgICAgY29uc3QgdmFyaWFibGVzID0gWy4uLnRoaXMuYWNjdW11bGF0ZWRGaXJzdE1vbWVudCwgLi4udGhpcy5hY2N1bXVsYXRlZFNlY29uZE1vbWVudF07XG4gICAgICAgIHJldHVybiBbYXdhaXQgdGhpcy5zYXZlSXRlcmF0aW9ucygpXS5jb25jYXQodmFyaWFibGVzLm1hcCh2ID0+ICh7IG5hbWU6IHYub3JpZ2luYWxOYW1lLCB0ZW5zb3I6IHYudmFyaWFibGUgfSkpKTtcbiAgICB9XG4gICAgYXN5bmMgc2V0V2VpZ2h0cyh3ZWlnaHRWYWx1ZXMpIHtcbiAgICAgICAgd2VpZ2h0VmFsdWVzID0gYXdhaXQgdGhpcy5leHRyYWN0SXRlcmF0aW9ucyh3ZWlnaHRWYWx1ZXMpO1xuICAgICAgICB0aWR5KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWNjQmV0YTEuYXNzaWduKHBvdyh0aGlzLmJldGExLCB0aGlzLml0ZXJhdGlvbnNfICsgMSkpO1xuICAgICAgICAgICAgdGhpcy5hY2NCZXRhMi5hc3NpZ24ocG93KHRoaXMuYmV0YTIsIHRoaXMuaXRlcmF0aW9uc18gKyAxKSk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB2YXJpYWJsZUNvdW50ID0gd2VpZ2h0VmFsdWVzLmxlbmd0aCAvIDI7XG4gICAgICAgIGNvbnN0IHRyYWluYWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFjY3VtdWxhdGVkRmlyc3RNb21lbnQgPVxuICAgICAgICAgICAgd2VpZ2h0VmFsdWVzLnNsaWNlKDAsIHZhcmlhYmxlQ291bnQpLm1hcCh2ID0+ICh7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lOiB2Lm5hbWUsXG4gICAgICAgICAgICAgICAgdmFyaWFibGU6IHYudGVuc29yLnZhcmlhYmxlKHRyYWluYWJsZSlcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgdGhpcy5hY2N1bXVsYXRlZFNlY29uZE1vbWVudCA9XG4gICAgICAgICAgICB3ZWlnaHRWYWx1ZXMuc2xpY2UodmFyaWFibGVDb3VudCwgdmFyaWFibGVDb3VudCAqIDIpXG4gICAgICAgICAgICAgICAgLm1hcCh2ID0+ICh7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lOiB2Lm5hbWUsXG4gICAgICAgICAgICAgICAgdmFyaWFibGU6IHYudGVuc29yLnZhcmlhYmxlKHRyYWluYWJsZSlcbiAgICAgICAgICAgIH0pKTtcbiAgICB9XG4gICAgZ2V0Q29uZmlnKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ2xlYXJuaW5nUmF0ZSc6IHRoaXMubGVhcm5pbmdSYXRlLFxuICAgICAgICAgICAgJ2JldGExJzogdGhpcy5iZXRhMSxcbiAgICAgICAgICAgICdiZXRhMic6IHRoaXMuYmV0YTIsXG4gICAgICAgICAgICAnZXBzaWxvbic6IHRoaXMuZXBzaWxvbixcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgc3RhdGljIGZyb21Db25maWcoY2xzLCBjb25maWcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBjbHMoY29uZmlnWydsZWFybmluZ1JhdGUnXSwgY29uZmlnWydiZXRhMSddLCBjb25maWdbJ2JldGEyJ10sIGNvbmZpZ1snZXBzaWxvbiddKTtcbiAgICB9XG59XG4vKiogQG5vY29sbGFwc2UgKi9cbkFkYW1PcHRpbWl6ZXIuY2xhc3NOYW1lID0gJ0FkYW0nOyAvLyBOb3RlOiBOYW1lIG1hdHRlcnMgZm9yIFB5dGhvbiBjb21wYXRpYmlsaXR5LlxucmVnaXN0ZXJDbGFzcyhBZGFtT3B0aW1pemVyKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFkYW1fb3B0aW1pemVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBkaXNwb3NlLCB0aWR5IH0gZnJvbSAnLi4vZ2xvYmFscyc7XG5pbXBvcnQgeyBhYnMgfSBmcm9tICcuLi9vcHMvYWJzJztcbmltcG9ydCB7IGFkZCB9IGZyb20gJy4uL29wcy9hZGQnO1xuaW1wb3J0IHsgZGl2IH0gZnJvbSAnLi4vb3BzL2Rpdic7XG5pbXBvcnQgeyBtYXhpbXVtIH0gZnJvbSAnLi4vb3BzL21heGltdW0nO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQgeyBzY2FsYXIgfSBmcm9tICcuLi9vcHMvc2NhbGFyJztcbmltcG9ydCB7IHN1YiB9IGZyb20gJy4uL29wcy9zdWInO1xuaW1wb3J0IHsgemVyb3NMaWtlIH0gZnJvbSAnLi4vb3BzL3plcm9zX2xpa2UnO1xuaW1wb3J0IHsgcmVnaXN0ZXJDbGFzcyB9IGZyb20gJy4uL3NlcmlhbGl6YXRpb24nO1xuaW1wb3J0IHsgT3B0aW1pemVyIH0gZnJvbSAnLi9vcHRpbWl6ZXInO1xuZXhwb3J0IGNsYXNzIEFkYW1heE9wdGltaXplciBleHRlbmRzIE9wdGltaXplciB7XG4gICAgY29uc3RydWN0b3IobGVhcm5pbmdSYXRlLCBiZXRhMSwgYmV0YTIsIGVwc2lsb24gPSBudWxsLCBkZWNheSA9IDAuMCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmxlYXJuaW5nUmF0ZSA9IGxlYXJuaW5nUmF0ZTtcbiAgICAgICAgdGhpcy5iZXRhMSA9IGJldGExO1xuICAgICAgICB0aGlzLmJldGEyID0gYmV0YTI7XG4gICAgICAgIHRoaXMuZXBzaWxvbiA9IGVwc2lsb247XG4gICAgICAgIHRoaXMuZGVjYXkgPSBkZWNheTtcbiAgICAgICAgdGhpcy5hY2N1bXVsYXRlZEZpcnN0TW9tZW50ID0gW107XG4gICAgICAgIHRoaXMuYWNjdW11bGF0ZWRXZWlnaHRlZEluZk5vcm0gPSBbXTtcbiAgICAgICAgdGlkeSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLml0ZXJhdGlvbiA9IHNjYWxhcigwKS52YXJpYWJsZSgpO1xuICAgICAgICAgICAgdGhpcy5hY2NCZXRhMSA9IHNjYWxhcihiZXRhMSkudmFyaWFibGUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChlcHNpbG9uID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZXBzaWxvbiA9IEVOR0lORS5iYWNrZW5kLmVwc2lsb24oKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhcHBseUdyYWRpZW50cyh2YXJpYWJsZUdyYWRpZW50cykge1xuICAgICAgICBjb25zdCB2YXJpYWJsZU5hbWVzID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICAgICAgdmFyaWFibGVHcmFkaWVudHMubWFwKGl0ZW0gPT4gaXRlbS5uYW1lKSA6XG4gICAgICAgICAgICBPYmplY3Qua2V5cyh2YXJpYWJsZUdyYWRpZW50cyk7XG4gICAgICAgIHRpZHkoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb25lTWludXNBY2NCZXRhMSA9IHN1YigxLCB0aGlzLmFjY0JldGExKTtcbiAgICAgICAgICAgIGNvbnN0IGxyID0gZGl2KC10aGlzLmxlYXJuaW5nUmF0ZSwgYWRkKG11bCh0aGlzLml0ZXJhdGlvbiwgdGhpcy5kZWNheSksIDEpKTtcbiAgICAgICAgICAgIHZhcmlhYmxlTmFtZXMuZm9yRWFjaCgobmFtZSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gRU5HSU5FLnJlZ2lzdGVyZWRWYXJpYWJsZXNbbmFtZV07XG4gICAgICAgICAgICAgICAgY29uc3QgdHJhaW5hYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWNjdW11bGF0ZWRGaXJzdE1vbWVudFtpXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWNjdW11bGF0ZWRGaXJzdE1vbWVudFtpXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogYCR7bmFtZX0vbWAsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogemVyb3NMaWtlKHZhbHVlKS52YXJpYWJsZSh0cmFpbmFibGUpXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkV2VpZ2h0ZWRJbmZOb3JtW2ldID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY2N1bXVsYXRlZFdlaWdodGVkSW5mTm9ybVtpXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogYCR7bmFtZX0vdmAsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogemVyb3NMaWtlKHZhbHVlKS52YXJpYWJsZSh0cmFpbmFibGUpXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGdyYWRpZW50ID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyYWRpZW50c1tpXS50ZW5zb3IgOlxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyYWRpZW50c1tuYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAoZ3JhZGllbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0TW9tZW50ID0gdGhpcy5hY2N1bXVsYXRlZEZpcnN0TW9tZW50W2ldLnZhcmlhYmxlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHdlaWdodGVkSW5mTm9ybSA9IHRoaXMuYWNjdW11bGF0ZWRXZWlnaHRlZEluZk5vcm1baV0udmFyaWFibGU7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Rmlyc3RNb21lbnQgPSBhZGQobXVsKGZpcnN0TW9tZW50LCB0aGlzLmJldGExKSwgbXVsKGdyYWRpZW50LCAxIC0gdGhpcy5iZXRhMSkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHV0MCA9IG11bCh3ZWlnaHRlZEluZk5vcm0sIHRoaXMuYmV0YTIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHV0MSA9IGFicyhncmFkaWVudCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3V2VpZ2h0ZWRJbmZOb3JtID0gbWF4aW11bSh1dDAsIHV0MSk7XG4gICAgICAgICAgICAgICAgZmlyc3RNb21lbnQuYXNzaWduKG5ld0ZpcnN0TW9tZW50KTtcbiAgICAgICAgICAgICAgICB3ZWlnaHRlZEluZk5vcm0uYXNzaWduKG5ld1dlaWdodGVkSW5mTm9ybSk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBhZGQobXVsKGRpdihsciwgb25lTWludXNBY2NCZXRhMSksIGRpdihuZXdGaXJzdE1vbWVudCwgYWRkKG5ld1dlaWdodGVkSW5mTm9ybSwgdGhpcy5lcHNpbG9uKSkpLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgdmFsdWUuYXNzaWduKG5ld1ZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5pdGVyYXRpb24uYXNzaWduKGFkZCh0aGlzLml0ZXJhdGlvbiwgMSkpO1xuICAgICAgICAgICAgdGhpcy5hY2NCZXRhMS5hc3NpZ24obXVsKHRoaXMuYWNjQmV0YTEsIHRoaXMuYmV0YTEpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaW5jcmVtZW50SXRlcmF0aW9ucygpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLmFjY0JldGExLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5pdGVyYXRpb24uZGlzcG9zZSgpO1xuICAgICAgICBpZiAodGhpcy5hY2N1bXVsYXRlZEZpcnN0TW9tZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGRpc3Bvc2UodGhpcy5hY2N1bXVsYXRlZEZpcnN0TW9tZW50Lm1hcCh2ID0+IHYudmFyaWFibGUpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hY2N1bXVsYXRlZFdlaWdodGVkSW5mTm9ybSAhPSBudWxsKSB7XG4gICAgICAgICAgICBkaXNwb3NlKHRoaXMuYWNjdW11bGF0ZWRXZWlnaHRlZEluZk5vcm0ubWFwKHYgPT4gdi52YXJpYWJsZSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGdldFdlaWdodHMoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZ2V0V2VpZ2h0cygpIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgQWRhbWF4IHlldC4nKTtcbiAgICB9XG4gICAgYXN5bmMgc2V0V2VpZ2h0cyh3ZWlnaHRWYWx1ZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzZXRXZWlnaHRzKCkgaXMgbm90IGltcGxlbWVudGVkIGZvciBBZGFtYXggeWV0LicpO1xuICAgIH1cbiAgICBnZXRDb25maWcoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnbGVhcm5pbmdSYXRlJzogdGhpcy5sZWFybmluZ1JhdGUsXG4gICAgICAgICAgICAnYmV0YTEnOiB0aGlzLmJldGExLFxuICAgICAgICAgICAgJ2JldGEyJzogdGhpcy5iZXRhMixcbiAgICAgICAgICAgICdlcHNpbG9uJzogdGhpcy5lcHNpbG9uLFxuICAgICAgICAgICAgJ2RlY2F5JzogdGhpcy5kZWNheVxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBzdGF0aWMgZnJvbUNvbmZpZyhjbHMsIGNvbmZpZykge1xuICAgICAgICByZXR1cm4gbmV3IGNscyhjb25maWdbJ2xlYXJuaW5nUmF0ZSddLCBjb25maWdbJ2JldGExJ10sIGNvbmZpZ1snYmV0YTInXSwgY29uZmlnWydlcHNpbG9uJ10sIGNvbmZpZ1snZGVjYXknXSk7XG4gICAgfVxufVxuLyoqIEBub2NvbGxhcHNlICovXG5BZGFtYXhPcHRpbWl6ZXIuY2xhc3NOYW1lID0gJ0FkYW1heCc7IC8vIE5vdGU6IE5hbWUgbWF0dGVycyBmb3IgUHl0aG9uIGNvbXBhdGJpbGl0eS5cbnJlZ2lzdGVyQ2xhc3MoQWRhbWF4T3B0aW1pemVyKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFkYW1heF9vcHRpbWl6ZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IGRpc3Bvc2UsIHRpZHkgfSBmcm9tICcuLi9nbG9iYWxzJztcbmltcG9ydCB7IGFkZCB9IGZyb20gJy4uL29wcy9hZGQnO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQgeyBzY2FsYXIgfSBmcm9tICcuLi9vcHMvc2NhbGFyJztcbmltcG9ydCB7IHplcm9zTGlrZSB9IGZyb20gJy4uL29wcy96ZXJvc19saWtlJztcbmltcG9ydCB7IHJlZ2lzdGVyQ2xhc3MgfSBmcm9tICcuLi9zZXJpYWxpemF0aW9uJztcbmltcG9ydCB7IFNHRE9wdGltaXplciB9IGZyb20gJy4vc2dkX29wdGltaXplcic7XG4vKiogQGRvY2xpbmsgT3B0aW1pemVyICovXG5leHBvcnQgY2xhc3MgTW9tZW50dW1PcHRpbWl6ZXIgZXh0ZW5kcyBTR0RPcHRpbWl6ZXIge1xuICAgIGNvbnN0cnVjdG9yKGxlYXJuaW5nUmF0ZSwgbW9tZW50dW0sIHVzZU5lc3Rlcm92ID0gZmFsc2UpIHtcbiAgICAgICAgc3VwZXIobGVhcm5pbmdSYXRlKTtcbiAgICAgICAgdGhpcy5sZWFybmluZ1JhdGUgPSBsZWFybmluZ1JhdGU7XG4gICAgICAgIHRoaXMubW9tZW50dW0gPSBtb21lbnR1bTtcbiAgICAgICAgdGhpcy51c2VOZXN0ZXJvdiA9IHVzZU5lc3Rlcm92O1xuICAgICAgICB0aGlzLmFjY3VtdWxhdGlvbnMgPSBbXTtcbiAgICAgICAgdGhpcy5tID0gc2NhbGFyKHRoaXMubW9tZW50dW0pO1xuICAgIH1cbiAgICBhcHBseUdyYWRpZW50cyh2YXJpYWJsZUdyYWRpZW50cykge1xuICAgICAgICBjb25zdCB2YXJpYWJsZU5hbWVzID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICAgICAgdmFyaWFibGVHcmFkaWVudHMubWFwKGl0ZW0gPT4gaXRlbS5uYW1lKSA6XG4gICAgICAgICAgICBPYmplY3Qua2V5cyh2YXJpYWJsZUdyYWRpZW50cyk7XG4gICAgICAgIHZhcmlhYmxlTmFtZXMuZm9yRWFjaCgobmFtZSwgaSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBFTkdJTkUucmVnaXN0ZXJlZFZhcmlhYmxlc1tuYW1lXTtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGlvbnNbaV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRyYWluYWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuYWNjdW11bGF0aW9uc1tpXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lOiBgJHtuYW1lfS9tb21lbnR1bWAsXG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlOiB0aWR5KCgpID0+IHplcm9zTGlrZSh2YWx1ZSkudmFyaWFibGUodHJhaW5hYmxlKSlcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYWNjdW11bGF0aW9uID0gdGhpcy5hY2N1bXVsYXRpb25zW2ldLnZhcmlhYmxlO1xuICAgICAgICAgICAgY29uc3QgZ3JhZGllbnQgPSBBcnJheS5pc0FycmF5KHZhcmlhYmxlR3JhZGllbnRzKSA/XG4gICAgICAgICAgICAgICAgdmFyaWFibGVHcmFkaWVudHNbaV0udGVuc29yIDpcbiAgICAgICAgICAgICAgICB2YXJpYWJsZUdyYWRpZW50c1tuYW1lXTtcbiAgICAgICAgICAgIGlmIChncmFkaWVudCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGlkeSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IG5ld1ZhbHVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0FjY3VtdWxhdGlvbiA9IGFkZChtdWwodGhpcy5tLCBhY2N1bXVsYXRpb24pLCBncmFkaWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudXNlTmVzdGVyb3YpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWUgPSBhZGQobXVsKHRoaXMuYywgYWRkKGdyYWRpZW50LCBtdWwobmV3QWNjdW11bGF0aW9uLCB0aGlzLm0pKSksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gYWRkKG11bCh0aGlzLmMsIG5ld0FjY3VtdWxhdGlvbiksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYWNjdW11bGF0aW9uLmFzc2lnbihuZXdBY2N1bXVsYXRpb24pO1xuICAgICAgICAgICAgICAgIHZhbHVlLmFzc2lnbihuZXdWYWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaW5jcmVtZW50SXRlcmF0aW9ucygpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLm0uZGlzcG9zZSgpO1xuICAgICAgICBpZiAodGhpcy5hY2N1bXVsYXRpb25zICE9IG51bGwpIHtcbiAgICAgICAgICAgIGRpc3Bvc2UodGhpcy5hY2N1bXVsYXRpb25zLm1hcCh2ID0+IHYudmFyaWFibGUpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBtb21lbnR1bSBvZiB0aGUgb3B0aW1pemVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIG1vbWVudHVtXG4gICAgICovXG4gICAgc2V0TW9tZW50dW0obW9tZW50dW0pIHtcbiAgICAgICAgdGhpcy5tb21lbnR1bSA9IG1vbWVudHVtO1xuICAgIH1cbiAgICBhc3luYyBnZXRXZWlnaHRzKCkge1xuICAgICAgICAvLyBPcmRlciBtYXR0ZXJzIGZvciBQeXRob24gY29tcGF0aWJpbGl0eS5cbiAgICAgICAgcmV0dXJuIFthd2FpdCB0aGlzLnNhdmVJdGVyYXRpb25zKCldLmNvbmNhdCh0aGlzLmFjY3VtdWxhdGlvbnMubWFwKHYgPT4gKHsgbmFtZTogdi5vcmlnaW5hbE5hbWUsIHRlbnNvcjogdi52YXJpYWJsZSB9KSkpO1xuICAgIH1cbiAgICBhc3luYyBzZXRXZWlnaHRzKHdlaWdodFZhbHVlcykge1xuICAgICAgICB3ZWlnaHRWYWx1ZXMgPSBhd2FpdCB0aGlzLmV4dHJhY3RJdGVyYXRpb25zKHdlaWdodFZhbHVlcyk7XG4gICAgICAgIGNvbnN0IHRyYWluYWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFjY3VtdWxhdGlvbnMgPSB3ZWlnaHRWYWx1ZXMubWFwKHYgPT4gKHsgb3JpZ2luYWxOYW1lOiB2Lm5hbWUsIHZhcmlhYmxlOiB2LnRlbnNvci52YXJpYWJsZSh0cmFpbmFibGUpIH0pKTtcbiAgICB9XG4gICAgZ2V0Q29uZmlnKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ2xlYXJuaW5nUmF0ZSc6IHRoaXMubGVhcm5pbmdSYXRlLFxuICAgICAgICAgICAgJ21vbWVudHVtJzogdGhpcy5tb21lbnR1bSxcbiAgICAgICAgICAgICd1c2VOZXN0ZXJvdic6IHRoaXMudXNlTmVzdGVyb3ZcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgc3RhdGljIGZyb21Db25maWcoY2xzLCBjb25maWcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBjbHMoY29uZmlnWydsZWFybmluZ1JhdGUnXSwgY29uZmlnWydtb21lbnR1bSddLCBjb25maWdbJ3VzZU5lc3Rlcm92J10pO1xuICAgIH1cbn1cbi8qKiBAbm9jb2xsYXBzZSAqL1xuTW9tZW50dW1PcHRpbWl6ZXIuY2xhc3NOYW1lID0gJ01vbWVudHVtJzsgLy8gTmFtZSBtYXR0ZXJzIGZvciBQeXRob24gY29tcGF0aWJpbGl0eS5cbnJlZ2lzdGVyQ2xhc3MoTW9tZW50dW1PcHRpbWl6ZXIpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bW9tZW50dW1fb3B0aW1pemVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGRpc3Bvc2UgfSBmcm9tICcuLi9nbG9iYWxzJztcbmltcG9ydCB7IHZhcmlhYmxlR3JhZHMgfSBmcm9tICcuLi9ncmFkaWVudHMnO1xuaW1wb3J0IHsgc2NhbGFyIH0gZnJvbSAnLi4vb3BzL29wcyc7XG5pbXBvcnQgeyBTZXJpYWxpemFibGUgfSBmcm9tICcuLi9zZXJpYWxpemF0aW9uJztcbi8qKiBAZG9jIHtoZWFkaW5nOiAnVHJhaW5pbmcnLCBzdWJoZWFkaW5nOiAnQ2xhc3NlcycsIG5hbWVzcGFjZTogJ3RyYWluJ30gKi9cbmV4cG9ydCBjbGFzcyBPcHRpbWl6ZXIgZXh0ZW5kcyBTZXJpYWxpemFibGUge1xuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIGBmKClgIGFuZCBtaW5pbWl6ZXMgdGhlIHNjYWxhciBvdXRwdXQgb2YgYGYoKWAgYnkgY29tcHV0aW5nXG4gICAgICogZ3JhZGllbnRzIG9mIHkgd2l0aCByZXNwZWN0IHRvIHRoZSBsaXN0IG9mIHRyYWluYWJsZSB2YXJpYWJsZXMgcHJvdmlkZWQgYnlcbiAgICAgKiBgdmFyTGlzdGAuIElmIG5vIGxpc3QgaXMgcHJvdmlkZWQsIGl0IGRlZmF1bHRzIHRvIGFsbCB0cmFpbmFibGUgdmFyaWFibGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGYgVGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgYW5kIHdob3NlIG91dHB1dCB0byBtaW5pbWl6ZS5cbiAgICAgKiBAcGFyYW0gcmV0dXJuQ29zdCBXaGV0aGVyIHRvIHJldHVybiB0aGUgc2NhbGFyIGNvc3QgdmFsdWUgcHJvZHVjZWQgYnlcbiAgICAgKiBleGVjdXRpbmcgYGYoKWAuXG4gICAgICogQHBhcmFtIHZhckxpc3QgQW4gb3B0aW9uYWwgbGlzdCBvZiB2YXJpYWJsZXMgdG8gdXBkYXRlLiBJZiBzcGVjaWZpZWQsIG9ubHlcbiAgICAgKiB0aGUgdHJhaW5hYmxlIHZhcmlhYmxlcyBpbiB2YXJMaXN0IHdpbGwgYmUgdXBkYXRlZCBieSBtaW5pbWl6ZS4gRGVmYXVsdHMgdG9cbiAgICAgKiBhbGwgdHJhaW5hYmxlIHZhcmlhYmxlcy5cbiAgICAgKlxuICAgICAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdPcHRpbWl6ZXJzJ31cbiAgICAgKi9cbiAgICBtaW5pbWl6ZShmLCByZXR1cm5Db3N0ID0gZmFsc2UsIHZhckxpc3QpIHtcbiAgICAgICAgY29uc3QgeyB2YWx1ZSwgZ3JhZHMgfSA9IHRoaXMuY29tcHV0ZUdyYWRpZW50cyhmLCB2YXJMaXN0KTtcbiAgICAgICAgaWYgKHZhckxpc3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgZ3JhZEFycmF5ID0gdmFyTGlzdC5tYXAodiA9PiAoeyBuYW1lOiB2Lm5hbWUsIHRlbnNvcjogZ3JhZHNbdi5uYW1lXSB9KSk7XG4gICAgICAgICAgICB0aGlzLmFwcGx5R3JhZGllbnRzKGdyYWRBcnJheSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFwcGx5R3JhZGllbnRzKGdyYWRzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBEaXNwb3NlIGdyYWRpZW50cy5cbiAgICAgICAgZGlzcG9zZShncmFkcyk7XG4gICAgICAgIGlmIChyZXR1cm5Db3N0KSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZS5kaXNwb3NlKCk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgdGhhdCB0aGlzIG9wdGltaXplciBpbnN0YW5jZSBoYXMgYmVlbiBpbnZva2VkIGZvci5cbiAgICAgKi9cbiAgICBnZXQgaXRlcmF0aW9ucygpIHtcbiAgICAgICAgaWYgKHRoaXMuaXRlcmF0aW9uc18gPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5pdGVyYXRpb25zXyA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlcmF0aW9uc187XG4gICAgfVxuICAgIGluY3JlbWVudEl0ZXJhdGlvbnMoKSB7XG4gICAgICAgIHRoaXMuaXRlcmF0aW9uc18gPSB0aGlzLml0ZXJhdGlvbnMgKyAxO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyBmKCkgYW5kIGNvbXB1dGVzIHRoZSBncmFkaWVudCBvZiB0aGUgc2NhbGFyIG91dHB1dCBvZiBmKCkgd2l0aFxuICAgICAqIHJlc3BlY3QgdG8gdGhlIGxpc3Qgb2YgdHJhaW5hYmxlIHZhcmlhYmxlcyBwcm92aWRlZCBieSBgdmFyTGlzdGAuIElmIG5vXG4gICAgICogbGlzdCBpcyBwcm92aWRlZCwgaXQgZGVmYXVsdHMgdG8gYWxsIHRyYWluYWJsZSB2YXJpYWJsZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZiBUaGUgZnVuY3Rpb24gdG8gZXhlY3V0ZSBhbmQgd2hvc2Ugb3V0cHV0IHRvIHVzZSBmb3IgY29tcHV0aW5nXG4gICAgICogZ3JhZGllbnRzIHdpdGggcmVzcGVjdCB0byB2YXJpYWJsZXMuXG4gICAgICogQHBhcmFtIHZhckxpc3QgQW4gb3B0aW9uYWwgbGlzdCBvZiB2YXJpYWJsZXMgdG8gY29tcHV0ZSBncmFkaWVudHMgd2l0aFxuICAgICAqIHJlc3BlY3QgdG8uIElmIHNwZWNpZmllZCwgb25seSB0aGUgdHJhaW5hYmxlIHZhcmlhYmxlcyBpbiB2YXJMaXN0IHdpbGwgaGF2ZVxuICAgICAqIGdyYWRpZW50cyBjb21wdXRlZCB3aXRoIHJlc3BlY3QgdG8uIERlZmF1bHRzIHRvIGFsbCB0cmFpbmFibGUgdmFyaWFibGVzLlxuICAgICAqXG4gICAgICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ09wdGltaXplcnMnfVxuICAgICAqL1xuICAgIGNvbXB1dGVHcmFkaWVudHMoZiwgdmFyTGlzdCkge1xuICAgICAgICByZXR1cm4gdmFyaWFibGVHcmFkcyhmLCB2YXJMaXN0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGlzcG9zZSB0aGUgdmFyaWFibGVzIChpZiBhbnkpIG93bmVkIGJ5IHRoaXMgb3B0aW1pemVyIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLml0ZXJhdGlvbnNfICE9IG51bGwpIHtcbiAgICAgICAgICAgIGRpc3Bvc2UodGhpcy5pdGVyYXRpb25zXyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgc2F2ZUl0ZXJhdGlvbnMoKSB7XG4gICAgICAgIGlmICh0aGlzLml0ZXJhdGlvbnNfID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuaXRlcmF0aW9uc18gPSAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnaXRlcicsXG4gICAgICAgICAgICAvLyBUT0RPKGNhaXMpOiBVc2UgJ2ludDY0JyB0eXBlIHdoZW4gYXZhaWxhYmxlLlxuICAgICAgICAgICAgdGVuc29yOiBzY2FsYXIodGhpcy5pdGVyYXRpb25zXywgJ2ludDMyJylcbiAgICAgICAgfTtcbiAgICB9XG4gICAgYXN5bmMgZ2V0V2VpZ2h0cygpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdnZXRXZWlnaHRzKCkgaXMgbm90IGltcGxlbWVudGVkIGZvciB0aGlzIG9wdGltaXplciB5ZXQuJyk7XG4gICAgfVxuICAgIGFzeW5jIHNldFdlaWdodHMod2VpZ2h0VmFsdWVzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgc2V0V2VpZ2h0cygpIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgdGhpcyBvcHRpbWl6ZXIgY2xhc3MgYCArXG4gICAgICAgICAgICBgJHt0aGlzLmdldENsYXNzTmFtZSgpfWApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0IHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSB3ZWlnaHQgdmFsdWVzIGFuZCBzZXQgaXRcbiAgICAgKiBhcyB0aGUgaXRlcmF0aW9ucyBjb3VudGVyIHZhcmlhYmxlIG9mIHRoaXMgaW5zdGFuY2Ugb2Ygb3B0aW1pemVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHdlaWdodFZhbHVlc1xuICAgICAqIEByZXR1cm5zIFdlaWdodCB2YWx1ZXMgd2l0aCB0aGUgZmlyc3QgZWxlbWVudCBjb25zdW1lZCBhbmQgZXhjbHVkZWQuXG4gICAgICovXG4gICAgYXN5bmMgZXh0cmFjdEl0ZXJhdGlvbnMod2VpZ2h0VmFsdWVzKSB7XG4gICAgICAgIHRoaXMuaXRlcmF0aW9uc18gPSAoYXdhaXQgd2VpZ2h0VmFsdWVzWzBdLnRlbnNvci5kYXRhKCkpWzBdO1xuICAgICAgICByZXR1cm4gd2VpZ2h0VmFsdWVzLnNsaWNlKDEpO1xuICAgIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShPcHRpbWl6ZXIsIFN5bWJvbC5oYXNJbnN0YW5jZSwge1xuICAgIHZhbHVlOiAoaW5zdGFuY2UpID0+IHtcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlLm1pbmltaXplICE9IG51bGwgJiYgaW5zdGFuY2UuY29tcHV0ZUdyYWRpZW50cyAhPSBudWxsICYmXG4gICAgICAgICAgICBpbnN0YW5jZS5hcHBseUdyYWRpZW50cyAhPSBudWxsO1xuICAgIH1cbn0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b3B0aW1pemVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEFkYWRlbHRhT3B0aW1pemVyIH0gZnJvbSAnLi9hZGFkZWx0YV9vcHRpbWl6ZXInO1xuaW1wb3J0IHsgQWRhZ3JhZE9wdGltaXplciB9IGZyb20gJy4vYWRhZ3JhZF9vcHRpbWl6ZXInO1xuaW1wb3J0IHsgQWRhbU9wdGltaXplciB9IGZyb20gJy4vYWRhbV9vcHRpbWl6ZXInO1xuaW1wb3J0IHsgQWRhbWF4T3B0aW1pemVyIH0gZnJvbSAnLi9hZGFtYXhfb3B0aW1pemVyJztcbmltcG9ydCB7IE1vbWVudHVtT3B0aW1pemVyIH0gZnJvbSAnLi9tb21lbnR1bV9vcHRpbWl6ZXInO1xuaW1wb3J0IHsgUk1TUHJvcE9wdGltaXplciB9IGZyb20gJy4vcm1zcHJvcF9vcHRpbWl6ZXInO1xuaW1wb3J0IHsgU0dET3B0aW1pemVyIH0gZnJvbSAnLi9zZ2Rfb3B0aW1pemVyJztcbmV4cG9ydCBjbGFzcyBPcHRpbWl6ZXJDb25zdHJ1Y3RvcnMge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBgdGYuU0dET3B0aW1pemVyYCB0aGF0IHVzZXMgc3RvY2hhc3RpYyBncmFkaWVudCBkZXNjZW50LlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiAvLyBGaXQgYSBxdWFkcmF0aWMgZnVuY3Rpb24gYnkgbGVhcm5pbmcgdGhlIGNvZWZmaWNpZW50cyBhLCBiLCBjLlxuICAgICAqIGNvbnN0IHhzID0gdGYudGVuc29yMWQoWzAsIDEsIDIsIDNdKTtcbiAgICAgKiBjb25zdCB5cyA9IHRmLnRlbnNvcjFkKFsxLjEsIDUuOSwgMTYuOCwgMzMuOV0pO1xuICAgICAqXG4gICAgICogY29uc3QgYSA9IHRmLnNjYWxhcihNYXRoLnJhbmRvbSgpKS52YXJpYWJsZSgpO1xuICAgICAqIGNvbnN0IGIgPSB0Zi5zY2FsYXIoTWF0aC5yYW5kb20oKSkudmFyaWFibGUoKTtcbiAgICAgKiBjb25zdCBjID0gdGYuc2NhbGFyKE1hdGgucmFuZG9tKCkpLnZhcmlhYmxlKCk7XG4gICAgICpcbiAgICAgKiAvLyB5ID0gYSAqIHheMiArIGIgKiB4ICsgYy5cbiAgICAgKiBjb25zdCBmID0geCA9PiBhLm11bCh4LnNxdWFyZSgpKS5hZGQoYi5tdWwoeCkpLmFkZChjKTtcbiAgICAgKiBjb25zdCBsb3NzID0gKHByZWQsIGxhYmVsKSA9PiBwcmVkLnN1YihsYWJlbCkuc3F1YXJlKCkubWVhbigpO1xuICAgICAqXG4gICAgICogY29uc3QgbGVhcm5pbmdSYXRlID0gMC4wMTtcbiAgICAgKiBjb25zdCBvcHRpbWl6ZXIgPSB0Zi50cmFpbi5zZ2QobGVhcm5pbmdSYXRlKTtcbiAgICAgKlxuICAgICAqIC8vIFRyYWluIHRoZSBtb2RlbC5cbiAgICAgKiBmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHtcbiAgICAgKiAgIG9wdGltaXplci5taW5pbWl6ZSgoKSA9PiBsb3NzKGYoeHMpLCB5cykpO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIC8vIE1ha2UgcHJlZGljdGlvbnMuXG4gICAgICogY29uc29sZS5sb2coXG4gICAgICogICAgIGBhOiAke2EuZGF0YVN5bmMoKX0sIGI6ICR7Yi5kYXRhU3luYygpfSwgYzogJHtjLmRhdGFTeW5jKCl9YCk7XG4gICAgICogY29uc3QgcHJlZHMgPSBmKHhzKS5kYXRhU3luYygpO1xuICAgICAqIHByZWRzLmZvckVhY2goKHByZWQsIGkpID0+IHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGB4OiAke2l9LCBwcmVkOiAke3ByZWR9YCk7XG4gICAgICogfSk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGVhcm5pbmdSYXRlIFRoZSBsZWFybmluZyByYXRlIHRvIHVzZSBmb3IgdGhlIFNHRCBhbGdvcml0aG0uXG4gICAgICpcbiAgICAgKiBAZG9jIHtoZWFkaW5nOiAnVHJhaW5pbmcnLCBzdWJoZWFkaW5nOiAnT3B0aW1pemVycycsIG5hbWVzcGFjZTogJ3RyYWluJ31cbiAgICAgKi9cbiAgICBzdGF0aWMgc2dkKGxlYXJuaW5nUmF0ZSkge1xuICAgICAgICByZXR1cm4gbmV3IFNHRE9wdGltaXplcihsZWFybmluZ1JhdGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgYHRmLk1vbWVudHVtT3B0aW1pemVyYCB0aGF0IHVzZXMgbW9tZW50dW0gZ3JhZGllbnRcbiAgICAgKiBkZXNjZW50LlxuICAgICAqXG4gICAgICogU2VlXG4gICAgICogW2h0dHA6Ly9wcm9jZWVkaW5ncy5tbHIucHJlc3MvdjI4L3N1dHNrZXZlcjEzLnBkZl0oXG4gICAgICogaHR0cDovL3Byb2NlZWRpbmdzLm1sci5wcmVzcy92Mjgvc3V0c2tldmVyMTMucGRmKVxuICAgICAqXG4gICAgICogQHBhcmFtIGxlYXJuaW5nUmF0ZSBUaGUgbGVhcm5pbmcgcmF0ZSB0byB1c2UgZm9yIHRoZSBNb21lbnR1bSBncmFkaWVudFxuICAgICAqIGRlc2NlbnQgYWxnb3JpdGhtLlxuICAgICAqIEBwYXJhbSBtb21lbnR1bSBUaGUgbW9tZW50dW0gdG8gdXNlIGZvciB0aGUgbW9tZW50dW0gZ3JhZGllbnQgZGVzY2VudFxuICAgICAqIGFsZ29yaXRobS5cbiAgICAgKlxuICAgICAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdPcHRpbWl6ZXJzJywgbmFtZXNwYWNlOiAndHJhaW4nfVxuICAgICAqL1xuICAgIHN0YXRpYyBtb21lbnR1bShsZWFybmluZ1JhdGUsIG1vbWVudHVtLCB1c2VOZXN0ZXJvdiA9IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBuZXcgTW9tZW50dW1PcHRpbWl6ZXIobGVhcm5pbmdSYXRlLCBtb21lbnR1bSwgdXNlTmVzdGVyb3YpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgYHRmLlJNU1Byb3BPcHRpbWl6ZXJgIHRoYXQgdXNlcyBSTVNQcm9wIGdyYWRpZW50XG4gICAgICogZGVzY2VudC4gVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIHBsYWluIG1vbWVudHVtIGFuZCBpcyBub3QgY2VudGVyZWRcbiAgICAgKiB2ZXJzaW9uIG9mIFJNU1Byb3AuXG4gICAgICpcbiAgICAgKiBTZWVcbiAgICAgKiBbaHR0cDovL3d3dy5jcy50b3JvbnRvLmVkdS9+dGlqbWVuL2NzYzMyMS9zbGlkZXMvbGVjdHVyZV9zbGlkZXNfbGVjNi5wZGZdKFxuICAgICAqIGh0dHA6Ly93d3cuY3MudG9yb250by5lZHUvfnRpam1lbi9jc2MzMjEvc2xpZGVzL2xlY3R1cmVfc2xpZGVzX2xlYzYucGRmKVxuICAgICAqXG4gICAgICogQHBhcmFtIGxlYXJuaW5nUmF0ZSBUaGUgbGVhcm5pbmcgcmF0ZSB0byB1c2UgZm9yIHRoZSBSTVNQcm9wIGdyYWRpZW50XG4gICAgICogZGVzY2VudCBhbGdvcml0aG0uXG4gICAgICogQHBhcmFtIGRlY2F5IFRoZSBkaXNjb3VudGluZyBmYWN0b3IgZm9yIHRoZSBoaXN0b3J5L2NvbWluZyBncmFkaWVudC5cbiAgICAgKiBAcGFyYW0gbW9tZW50dW0gVGhlIG1vbWVudHVtIHRvIHVzZSBmb3IgdGhlIFJNU1Byb3AgZ3JhZGllbnQgZGVzY2VudFxuICAgICAqIGFsZ29yaXRobS5cbiAgICAgKiBAcGFyYW0gZXBzaWxvbiBTbWFsbCB2YWx1ZSB0byBhdm9pZCB6ZXJvIGRlbm9taW5hdG9yLlxuICAgICAqIEBwYXJhbSBjZW50ZXJlZCBJZiB0cnVlLCBncmFkaWVudHMgYXJlIG5vcm1hbGl6ZWQgYnkgdGhlIGVzdGltYXRlZFxuICAgICAqIHZhcmlhbmNlIG9mIHRoZSBncmFkaWVudC5cbiAgICAgKlxuICAgICAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdPcHRpbWl6ZXJzJywgbmFtZXNwYWNlOiAndHJhaW4nfVxuICAgICAqL1xuICAgIHN0YXRpYyBybXNwcm9wKGxlYXJuaW5nUmF0ZSwgZGVjYXkgPSAuOSwgbW9tZW50dW0gPSAwLjAsIGVwc2lsb24gPSBudWxsLCBjZW50ZXJlZCA9IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBuZXcgUk1TUHJvcE9wdGltaXplcihsZWFybmluZ1JhdGUsIGRlY2F5LCBtb21lbnR1bSwgZXBzaWxvbiwgY2VudGVyZWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgYHRmLkFkYW1PcHRpbWl6ZXJgIHRoYXQgdXNlcyB0aGUgQWRhbSBhbGdvcml0aG0uXG4gICAgICogU2VlIFtodHRwczovL2FyeGl2Lm9yZy9hYnMvMTQxMi42OTgwXShodHRwczovL2FyeGl2Lm9yZy9hYnMvMTQxMi42OTgwKVxuICAgICAqXG4gICAgICogQHBhcmFtIGxlYXJuaW5nUmF0ZSBUaGUgbGVhcm5pbmcgcmF0ZSB0byB1c2UgZm9yIHRoZSBBZGFtIGdyYWRpZW50XG4gICAgICogZGVzY2VudCBhbGdvcml0aG0uXG4gICAgICogQHBhcmFtIGJldGExIFRoZSBleHBvbmVudGlhbCBkZWNheSByYXRlIGZvciB0aGUgMXN0IG1vbWVudCBlc3RpbWF0ZXMuXG4gICAgICogQHBhcmFtIGJldGEyIFRoZSBleHBvbmVudGlhbCBkZWNheSByYXRlIGZvciB0aGUgMm5kIG1vbWVudCBlc3RpbWF0ZXMuXG4gICAgICogQHBhcmFtIGVwc2lsb24gQSBzbWFsbCBjb25zdGFudCBmb3IgbnVtZXJpY2FsIHN0YWJpbGl0eS5cbiAgICAgKlxuICAgICAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdPcHRpbWl6ZXJzJywgbmFtZXNwYWNlOiAndHJhaW4nfVxuICAgICAqL1xuICAgIHN0YXRpYyBhZGFtKGxlYXJuaW5nUmF0ZSA9IDAuMDAxLCBiZXRhMSA9IDAuOSwgYmV0YTIgPSAwLjk5OSwgZXBzaWxvbiA9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBZGFtT3B0aW1pemVyKGxlYXJuaW5nUmF0ZSwgYmV0YTEsIGJldGEyLCBlcHNpbG9uKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIGB0Zi5BZGFkZWx0YU9wdGltaXplcmAgdGhhdCB1c2VzIHRoZSBBZGFkZWx0YSBhbGdvcml0aG0uXG4gICAgICogU2VlIFtodHRwczovL2FyeGl2Lm9yZy9hYnMvMTIxMi41NzAxXShodHRwczovL2FyeGl2Lm9yZy9hYnMvMTIxMi41NzAxKVxuICAgICAqXG4gICAgICogQHBhcmFtIGxlYXJuaW5nUmF0ZSBUaGUgbGVhcm5pbmcgcmF0ZSB0byB1c2UgZm9yIHRoZSBBZGFkZWx0YSBncmFkaWVudFxuICAgICAqIGRlc2NlbnQgYWxnb3JpdGhtLlxuICAgICAqIEBwYXJhbSByaG8gVGhlIGxlYXJuaW5nIHJhdGUgZGVjYXkgb3ZlciBlYWNoIHVwZGF0ZS5cbiAgICAgKiBAcGFyYW0gZXBzaWxvbiBBIGNvbnN0YW50IGVwc2lsb24gdXNlZCB0byBiZXR0ZXIgY29uZGl0aW9uIHRoZSBncmFkXG4gICAgICogdXBkYXRlLlxuICAgICAqXG4gICAgICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ09wdGltaXplcnMnLCBuYW1lc3BhY2U6ICd0cmFpbid9XG4gICAgICovXG4gICAgc3RhdGljIGFkYWRlbHRhKGxlYXJuaW5nUmF0ZSA9IC4wMDEsIHJobyA9IC45NSwgZXBzaWxvbiA9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBZGFkZWx0YU9wdGltaXplcihsZWFybmluZ1JhdGUsIHJobywgZXBzaWxvbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBgdGYuQWRhbWF4T3B0aW1pemVyYCB0aGF0IHVzZXMgdGhlIEFkYW1heCBhbGdvcml0aG0uXG4gICAgICogU2VlIFtodHRwczovL2FyeGl2Lm9yZy9hYnMvMTQxMi42OTgwXShodHRwczovL2FyeGl2Lm9yZy9hYnMvMTQxMi42OTgwKVxuICAgICAqXG4gICAgICogQHBhcmFtIGxlYXJuaW5nUmF0ZSBUaGUgbGVhcm5pbmcgcmF0ZSB0byB1c2UgZm9yIHRoZSBBZGFtYXggZ3JhZGllbnRcbiAgICAgKiBkZXNjZW50IGFsZ29yaXRobS5cbiAgICAgKiBAcGFyYW0gYmV0YTEgVGhlIGV4cG9uZW50aWFsIGRlY2F5IHJhdGUgZm9yIHRoZSAxc3QgbW9tZW50IGVzdGltYXRlcy5cbiAgICAgKiBAcGFyYW0gYmV0YTIgVGhlIGV4cG9uZW50aWFsIGRlY2F5IHJhdGUgZm9yIHRoZSAybmQgbW9tZW50IGVzdGltYXRlcy5cbiAgICAgKiBAcGFyYW0gZXBzaWxvbiBBIHNtYWxsIGNvbnN0YW50IGZvciBudW1lcmljYWwgc3RhYmlsaXR5LlxuICAgICAqIEBwYXJhbSBkZWNheSBUaGUgbGVhcm5pbmcgcmF0ZSBkZWNheSBvdmVyIGVhY2ggdXBkYXRlLlxuICAgICAqXG4gICAgICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ09wdGltaXplcnMnLCBuYW1lc3BhY2U6ICd0cmFpbid9XG4gICAgICovXG4gICAgc3RhdGljIGFkYW1heChsZWFybmluZ1JhdGUgPSAwLjAwMiwgYmV0YTEgPSAwLjksIGJldGEyID0gMC45OTksIGVwc2lsb24gPSBudWxsLCBkZWNheSA9IDAuMCkge1xuICAgICAgICByZXR1cm4gbmV3IEFkYW1heE9wdGltaXplcihsZWFybmluZ1JhdGUsIGJldGExLCBiZXRhMiwgZXBzaWxvbiwgZGVjYXkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgYHRmLkFkYWdyYWRPcHRpbWl6ZXJgIHRoYXQgdXNlcyB0aGUgQWRhZ3JhZCBhbGdvcml0aG0uXG4gICAgICogU2VlXG4gICAgICogW2h0dHA6Ly93d3cuam1sci5vcmcvcGFwZXJzL3ZvbHVtZTEyL2R1Y2hpMTFhL2R1Y2hpMTFhLnBkZl0oXG4gICAgICogaHR0cDovL3d3dy5qbWxyLm9yZy9wYXBlcnMvdm9sdW1lMTIvZHVjaGkxMWEvZHVjaGkxMWEucGRmKVxuICAgICAqIG9yXG4gICAgICogW2h0dHA6Ly9ydWRlci5pby9vcHRpbWl6aW5nLWdyYWRpZW50LWRlc2NlbnQvaW5kZXguaHRtbCNhZGFncmFkXShcbiAgICAgKiBodHRwOi8vcnVkZXIuaW8vb3B0aW1pemluZy1ncmFkaWVudC1kZXNjZW50L2luZGV4Lmh0bWwjYWRhZ3JhZClcbiAgICAgKlxuICAgICAqIEBwYXJhbSBsZWFybmluZ1JhdGUgVGhlIGxlYXJuaW5nIHJhdGUgdG8gdXNlIGZvciB0aGUgQWRhZ3JhZCBncmFkaWVudFxuICAgICAqIGRlc2NlbnQgYWxnb3JpdGhtLlxuICAgICAqIEBwYXJhbSBpbml0aWFsQWNjdW11bGF0b3JWYWx1ZSBTdGFydGluZyB2YWx1ZSBmb3IgdGhlIGFjY3VtdWxhdG9ycywgbXVzdCBiZVxuICAgICAqIHBvc2l0aXZlLlxuICAgICAqXG4gICAgICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ09wdGltaXplcnMnLCBuYW1lc3BhY2U6ICd0cmFpbid9XG4gICAgICovXG4gICAgc3RhdGljIGFkYWdyYWQobGVhcm5pbmdSYXRlLCBpbml0aWFsQWNjdW11bGF0b3JWYWx1ZSA9IDAuMSkge1xuICAgICAgICByZXR1cm4gbmV3IEFkYWdyYWRPcHRpbWl6ZXIobGVhcm5pbmdSYXRlLCBpbml0aWFsQWNjdW11bGF0b3JWYWx1ZSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b3B0aW1pemVyX2NvbnN0cnVjdG9ycy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgZGlzcG9zZSwgdGlkeSB9IGZyb20gJy4uL2dsb2JhbHMnO1xuaW1wb3J0IHsgYWRkIH0gZnJvbSAnLi4vb3BzL2FkZCc7XG5pbXBvcnQgeyBkaXYgfSBmcm9tICcuLi9vcHMvZGl2JztcbmltcG9ydCB7IG11bCB9IGZyb20gJy4uL29wcy9tdWwnO1xuaW1wb3J0IHsgc3FydCB9IGZyb20gJy4uL29wcy9zcXJ0JztcbmltcG9ydCB7IHNxdWFyZSB9IGZyb20gJy4uL29wcy9zcXVhcmUnO1xuaW1wb3J0IHsgc3ViIH0gZnJvbSAnLi4vb3BzL3N1Yic7XG5pbXBvcnQgeyB6ZXJvc0xpa2UgfSBmcm9tICcuLi9vcHMvemVyb3NfbGlrZSc7XG5pbXBvcnQgeyByZWdpc3RlckNsYXNzIH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbic7XG5pbXBvcnQgeyBPcHRpbWl6ZXIgfSBmcm9tICcuL29wdGltaXplcic7XG4vKiogQGRvY2xpbmsgT3B0aW1pemVyICovXG5leHBvcnQgY2xhc3MgUk1TUHJvcE9wdGltaXplciBleHRlbmRzIE9wdGltaXplciB7XG4gICAgY29uc3RydWN0b3IobGVhcm5pbmdSYXRlLCBkZWNheSA9IDAuOSwgbW9tZW50dW0gPSAwLjAsIGVwc2lsb24gPSBudWxsLCBjZW50ZXJlZCA9IGZhbHNlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMubGVhcm5pbmdSYXRlID0gbGVhcm5pbmdSYXRlO1xuICAgICAgICB0aGlzLmRlY2F5ID0gZGVjYXk7XG4gICAgICAgIHRoaXMubW9tZW50dW0gPSBtb21lbnR1bTtcbiAgICAgICAgdGhpcy5lcHNpbG9uID0gZXBzaWxvbjtcbiAgICAgICAgdGhpcy5hY2N1bXVsYXRlZE1lYW5TcXVhcmVzID0gW107XG4gICAgICAgIHRoaXMuYWNjdW11bGF0ZWRNb21lbnRzID0gW107XG4gICAgICAgIHRoaXMuYWNjdW11bGF0ZWRNZWFuR3JhZHMgPSBbXTtcbiAgICAgICAgdGhpcy5jZW50ZXJlZCA9IGNlbnRlcmVkO1xuICAgICAgICBpZiAoZXBzaWxvbiA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmVwc2lsb24gPSBFTkdJTkUuYmFja2VuZC5lcHNpbG9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxlYXJuaW5nUmF0ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGxlYXJuaW5nUmF0ZSBmb3IgUk1TUHJvcE9wdGltaXplciBtdXN0IGJlIGRlZmluZWQuYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXBwbHlHcmFkaWVudHModmFyaWFibGVHcmFkaWVudHMpIHtcbiAgICAgICAgY29uc3QgdmFyaWFibGVOYW1lcyA9IEFycmF5LmlzQXJyYXkodmFyaWFibGVHcmFkaWVudHMpID9cbiAgICAgICAgICAgIHZhcmlhYmxlR3JhZGllbnRzLm1hcChpdGVtID0+IGl0ZW0ubmFtZSkgOlxuICAgICAgICAgICAgT2JqZWN0LmtleXModmFyaWFibGVHcmFkaWVudHMpO1xuICAgICAgICB2YXJpYWJsZU5hbWVzLmZvckVhY2goKG5hbWUsIGkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gRU5HSU5FLnJlZ2lzdGVyZWRWYXJpYWJsZXNbbmFtZV07XG4gICAgICAgICAgICBjb25zdCB0cmFpbmFibGUgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkTWVhblNxdWFyZXNbaV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWNjdW11bGF0ZWRNZWFuU3F1YXJlc1tpXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lOiBgJHtuYW1lfS9ybXNgLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogdGlkeSgoKSA9PiB6ZXJvc0xpa2UodmFsdWUpLnZhcmlhYmxlKHRyYWluYWJsZSkpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkTW9tZW50c1tpXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hY2N1bXVsYXRlZE1vbWVudHNbaV0gPSB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogYCR7bmFtZX0vbW9tZW50dW1gLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogdGlkeSgoKSA9PiB6ZXJvc0xpa2UodmFsdWUpLnZhcmlhYmxlKHRyYWluYWJsZSkpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkTWVhbkdyYWRzW2ldID09IG51bGwgJiYgdGhpcy5jZW50ZXJlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWNjdW11bGF0ZWRNZWFuR3JhZHNbaV0gPSB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogYCR7bmFtZX0vbWdgLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogdGlkeSgoKSA9PiB6ZXJvc0xpa2UodmFsdWUpLnZhcmlhYmxlKHRyYWluYWJsZSkpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGdyYWRpZW50ID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JhZGllbnRzW2ldLnRlbnNvciA6XG4gICAgICAgICAgICAgICAgdmFyaWFibGVHcmFkaWVudHNbbmFtZV07XG4gICAgICAgICAgICBpZiAoZ3JhZGllbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFjY3VtdWxhdGVkTWVhblNxdWFyZSA9IHRoaXMuYWNjdW11bGF0ZWRNZWFuU3F1YXJlc1tpXS52YXJpYWJsZTtcbiAgICAgICAgICAgIGNvbnN0IGFjY3VtdWxhdGVkTW9tZW50cyA9IHRoaXMuYWNjdW11bGF0ZWRNb21lbnRzW2ldLnZhcmlhYmxlO1xuICAgICAgICAgICAgdGlkeSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3QWNjdW11bGF0ZWRNZWFuU3F1YXJlID0gYWRkKG11bChhY2N1bXVsYXRlZE1lYW5TcXVhcmUsIHRoaXMuZGVjYXkpLCBtdWwoc3F1YXJlKGdyYWRpZW50KSwgMSAtIHRoaXMuZGVjYXkpKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jZW50ZXJlZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhY2N1bXVsYXRlZE1lYW5HcmFkID0gdGhpcy5hY2N1bXVsYXRlZE1lYW5HcmFkc1tpXS52YXJpYWJsZTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2VudGVyZWQgZ3JhZGllbnRcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3QWNjdW11bGF0ZWRNZWFuR3JhZCA9IGFkZChtdWwoYWNjdW11bGF0ZWRNZWFuR3JhZCwgdGhpcy5kZWNheSksIG11bChncmFkaWVudCwgMSAtIHRoaXMuZGVjYXkpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JhZENvbnRyaWJ1dGlvbiA9IGRpdihtdWwoZ3JhZGllbnQsIHRoaXMubGVhcm5pbmdSYXRlKSwgc3FydChzdWIobmV3QWNjdW11bGF0ZWRNZWFuU3F1YXJlLCBhZGQoc3F1YXJlKG5ld0FjY3VtdWxhdGVkTWVhbkdyYWQpLCB0aGlzLmVwc2lsb24pKSkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdBY2N1bXVsYXRlZE1vbWVudHMgPSBhZGQobXVsKGFjY3VtdWxhdGVkTW9tZW50cywgdGhpcy5tb21lbnR1bSksIGdyYWRDb250cmlidXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZE1lYW5TcXVhcmUuYXNzaWduKG5ld0FjY3VtdWxhdGVkTWVhblNxdWFyZSk7XG4gICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkTWVhbkdyYWQuYXNzaWduKG5ld0FjY3VtdWxhdGVkTWVhbkdyYWQpO1xuICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZE1vbWVudHMuYXNzaWduKG5ld0FjY3VtdWxhdGVkTW9tZW50cyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gc3ViKHZhbHVlLCBuZXdBY2N1bXVsYXRlZE1vbWVudHMpO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZS5hc3NpZ24obmV3VmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUGxhaW4gZ3JhZGllbnRcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3QWNjdW11bGF0ZWRNZWFuU3F1YXJlID0gYWRkKG11bChhY2N1bXVsYXRlZE1lYW5TcXVhcmUsIHRoaXMuZGVjYXkpLCBtdWwoc3F1YXJlKGdyYWRpZW50KSwgMSAtIHRoaXMuZGVjYXkpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3QWNjdW11bGF0ZWRNb21lbnRzID0gYWRkKG11bChhY2N1bXVsYXRlZE1vbWVudHMsIHRoaXMubW9tZW50dW0pLCBkaXYobXVsKGdyYWRpZW50LCB0aGlzLmxlYXJuaW5nUmF0ZSksIHNxcnQoYWRkKG5ld0FjY3VtdWxhdGVkTWVhblNxdWFyZSwgdGhpcy5lcHNpbG9uKSkpKTtcbiAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0ZWRNZWFuU3F1YXJlLmFzc2lnbihuZXdBY2N1bXVsYXRlZE1lYW5TcXVhcmUpO1xuICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZE1vbWVudHMuYXNzaWduKG5ld0FjY3VtdWxhdGVkTW9tZW50cyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gc3ViKHZhbHVlLCBuZXdBY2N1bXVsYXRlZE1vbWVudHMpO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZS5hc3NpZ24obmV3VmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5pbmNyZW1lbnRJdGVyYXRpb25zKCk7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkTWVhblNxdWFyZXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgZGlzcG9zZSh0aGlzLmFjY3VtdWxhdGVkTWVhblNxdWFyZXMubWFwKHYgPT4gdi52YXJpYWJsZSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkTWVhbkdyYWRzICE9IG51bGwgJiYgdGhpcy5jZW50ZXJlZCkge1xuICAgICAgICAgICAgZGlzcG9zZSh0aGlzLmFjY3VtdWxhdGVkTWVhbkdyYWRzLm1hcCh2ID0+IHYudmFyaWFibGUpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hY2N1bXVsYXRlZE1vbWVudHMgIT0gbnVsbCkge1xuICAgICAgICAgICAgZGlzcG9zZSh0aGlzLmFjY3VtdWxhdGVkTW9tZW50cy5tYXAodiA9PiB2LnZhcmlhYmxlKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgZ2V0V2VpZ2h0cygpIHtcbiAgICAgICAgLy8gT3JkZXIgbWF0dGVycyBmb3IgUHl0aG9uIGNvbXBhdGliaWxpdHkuXG4gICAgICAgIGNvbnN0IHZhcmlhYmxlcyA9IFsuLi50aGlzLmFjY3VtdWxhdGVkTWVhblNxdWFyZXMsIC4uLnRoaXMuYWNjdW11bGF0ZWRNb21lbnRzXTtcbiAgICAgICAgaWYgKHRoaXMuY2VudGVyZWQpIHtcbiAgICAgICAgICAgIHZhcmlhYmxlcy5wdXNoKC4uLnRoaXMuYWNjdW11bGF0ZWRNZWFuR3JhZHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbYXdhaXQgdGhpcy5zYXZlSXRlcmF0aW9ucygpXS5jb25jYXQodmFyaWFibGVzLm1hcCh2ID0+ICh7IG5hbWU6IHYub3JpZ2luYWxOYW1lLCB0ZW5zb3I6IHYudmFyaWFibGUgfSkpKTtcbiAgICB9XG4gICAgYXN5bmMgc2V0V2VpZ2h0cyh3ZWlnaHRWYWx1ZXMpIHtcbiAgICAgICAgd2VpZ2h0VmFsdWVzID0gYXdhaXQgdGhpcy5leHRyYWN0SXRlcmF0aW9ucyh3ZWlnaHRWYWx1ZXMpO1xuICAgICAgICBjb25zdCB2YXJpYWJsZUNvdW50ID0gdGhpcy5jZW50ZXJlZCA/IHdlaWdodFZhbHVlcy5sZW5ndGggLyAzIDogd2VpZ2h0VmFsdWVzLmxlbmd0aCAvIDI7XG4gICAgICAgIGNvbnN0IHRyYWluYWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFjY3VtdWxhdGVkTWVhblNxdWFyZXMgPVxuICAgICAgICAgICAgd2VpZ2h0VmFsdWVzLnNsaWNlKDAsIHZhcmlhYmxlQ291bnQpLm1hcCh2ID0+ICh7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lOiB2Lm5hbWUsXG4gICAgICAgICAgICAgICAgdmFyaWFibGU6IHYudGVuc29yLnZhcmlhYmxlKHRyYWluYWJsZSlcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgdGhpcy5hY2N1bXVsYXRlZE1vbWVudHMgPVxuICAgICAgICAgICAgd2VpZ2h0VmFsdWVzLnNsaWNlKHZhcmlhYmxlQ291bnQsIHZhcmlhYmxlQ291bnQgKiAyKVxuICAgICAgICAgICAgICAgIC5tYXAodiA9PiAoe1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogdi5uYW1lLFxuICAgICAgICAgICAgICAgIHZhcmlhYmxlOiB2LnRlbnNvci52YXJpYWJsZSh0cmFpbmFibGUpXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIGlmICh0aGlzLmNlbnRlcmVkKSB7XG4gICAgICAgICAgICB0aGlzLmFjY3VtdWxhdGVkTWVhbkdyYWRzID1cbiAgICAgICAgICAgICAgICB3ZWlnaHRWYWx1ZXMuc2xpY2UodmFyaWFibGVDb3VudCAqIDIsIHZhcmlhYmxlQ291bnQgKiAzKVxuICAgICAgICAgICAgICAgICAgICAubWFwKHYgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lOiB2Lm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlOiB2LnRlbnNvci52YXJpYWJsZSh0cmFpbmFibGUpXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldENvbmZpZygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICdsZWFybmluZ1JhdGUnOiB0aGlzLmxlYXJuaW5nUmF0ZSxcbiAgICAgICAgICAgICdkZWNheSc6IHRoaXMuZGVjYXksXG4gICAgICAgICAgICAnbW9tZW50dW0nOiB0aGlzLm1vbWVudHVtLFxuICAgICAgICAgICAgJ2Vwc2lsb24nOiB0aGlzLmVwc2lsb24sXG4gICAgICAgICAgICAnY2VudGVyZWQnOiB0aGlzLmNlbnRlcmVkXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgIHN0YXRpYyBmcm9tQ29uZmlnKGNscywgY29uZmlnKSB7XG4gICAgICAgIHJldHVybiBuZXcgY2xzKGNvbmZpZ1snbGVhcm5pbmdSYXRlJ10sIGNvbmZpZ1snZGVjYXknXSwgY29uZmlnWydtb21lbnR1bSddLCBjb25maWdbJ2Vwc2lsb24nXSwgY29uZmlnWydjZW50ZXJlZCddKTtcbiAgICB9XG59XG4vKiogQG5vY29sbGFwc2UgKi9cblJNU1Byb3BPcHRpbWl6ZXIuY2xhc3NOYW1lID0gJ1JNU1Byb3AnOyAvLyBOb3RlOiBOYW1lIG1hdHRlcnMgZm9yIFB5dGhvbiBjb21wYXRpYmlsaXR5LlxucmVnaXN0ZXJDbGFzcyhSTVNQcm9wT3B0aW1pemVyKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJtc3Byb3Bfb3B0aW1pemVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBrZWVwLCB0aWR5IH0gZnJvbSAnLi4vZ2xvYmFscyc7XG5pbXBvcnQgeyBhZGQgfSBmcm9tICcuLi9vcHMvYWRkJztcbmltcG9ydCB7IG11bCB9IGZyb20gJy4uL29wcy9tdWwnO1xuaW1wb3J0IHsgc2NhbGFyIH0gZnJvbSAnLi4vb3BzL3NjYWxhcic7XG5pbXBvcnQgeyByZWdpc3RlckNsYXNzIH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbic7XG5pbXBvcnQgeyBPcHRpbWl6ZXIgfSBmcm9tICcuL29wdGltaXplcic7XG4vKiogQGRvY2xpbmsgT3B0aW1pemVyICovXG5leHBvcnQgY2xhc3MgU0dET3B0aW1pemVyIGV4dGVuZHMgT3B0aW1pemVyIHtcbiAgICBjb25zdHJ1Y3RvcihsZWFybmluZ1JhdGUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5sZWFybmluZ1JhdGUgPSBsZWFybmluZ1JhdGU7XG4gICAgICAgIHRoaXMuc2V0TGVhcm5pbmdSYXRlKGxlYXJuaW5nUmF0ZSk7XG4gICAgfVxuICAgIGFwcGx5R3JhZGllbnRzKHZhcmlhYmxlR3JhZGllbnRzKSB7XG4gICAgICAgIGNvbnN0IHZhck5hbWVzID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICAgICAgdmFyaWFibGVHcmFkaWVudHMubWFwKHYgPT4gdi5uYW1lKSA6XG4gICAgICAgICAgICBPYmplY3Qua2V5cyh2YXJpYWJsZUdyYWRpZW50cyk7XG4gICAgICAgIHZhck5hbWVzLmZvckVhY2goKG5hbWUsIGkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGdyYWRpZW50ID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JhZGllbnRzW2ldLnRlbnNvciA6XG4gICAgICAgICAgICAgICAgdmFyaWFibGVHcmFkaWVudHNbbmFtZV07XG4gICAgICAgICAgICBpZiAoZ3JhZGllbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gRU5HSU5FLnJlZ2lzdGVyZWRWYXJpYWJsZXNbbmFtZV07XG4gICAgICAgICAgICB0aWR5KCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IGFkZChtdWwodGhpcy5jLCBncmFkaWVudCksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB2YWx1ZS5hc3NpZ24obmV3VmFsdWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmluY3JlbWVudEl0ZXJhdGlvbnMoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbGVhcm5pbmcgcmF0ZSBvZiB0aGUgb3B0aW1pemVyLlxuICAgICAqL1xuICAgIHNldExlYXJuaW5nUmF0ZShsZWFybmluZ1JhdGUpIHtcbiAgICAgICAgdGhpcy5sZWFybmluZ1JhdGUgPSBsZWFybmluZ1JhdGU7XG4gICAgICAgIGlmICh0aGlzLmMgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5jLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmMgPSBrZWVwKHNjYWxhcigtbGVhcm5pbmdSYXRlKSk7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIHRoaXMuYy5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGFzeW5jIGdldFdlaWdodHMoKSB7XG4gICAgICAgIHJldHVybiBbYXdhaXQgdGhpcy5zYXZlSXRlcmF0aW9ucygpXTtcbiAgICB9XG4gICAgYXN5bmMgc2V0V2VpZ2h0cyh3ZWlnaHRWYWx1ZXMpIHtcbiAgICAgICAgd2VpZ2h0VmFsdWVzID0gYXdhaXQgdGhpcy5leHRyYWN0SXRlcmF0aW9ucyh3ZWlnaHRWYWx1ZXMpO1xuICAgICAgICBpZiAod2VpZ2h0VmFsdWVzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTR0Qgb3B0aW1pemVyIGRvZXMgbm90IGhhdmUgc2V0dGFibGUgd2VpZ2h0cy4nKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRDb25maWcoKSB7XG4gICAgICAgIHJldHVybiB7ICdsZWFybmluZ1JhdGUnOiB0aGlzLmxlYXJuaW5nUmF0ZSB9O1xuICAgIH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBzdGF0aWMgZnJvbUNvbmZpZyhjbHMsIGNvbmZpZykge1xuICAgICAgICByZXR1cm4gbmV3IGNscyhjb25maWdbJ2xlYXJuaW5nUmF0ZSddKTtcbiAgICB9XG59XG4vKiogQG5vY29sbGFwc2UgKi9cblNHRE9wdGltaXplci5jbGFzc05hbWUgPSAnU0dEJzsgLy8gTm90ZTogTmFtZSBtYXR0ZXJzIGZvciBQeXRob24gY29tcGF0aWJpbGl0eS5cbnJlZ2lzdGVyQ2xhc3MoU0dET3B0aW1pemVyKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNnZF9vcHRpbWl6ZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0ICcuLi9mbGFncyc7XG5pbXBvcnQgeyBlbnYgfSBmcm9tICcuLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBCcm93c2VySW5kZXhlZERCLCBCcm93c2VySW5kZXhlZERCTWFuYWdlciB9IGZyb20gJy4uL2lvL2luZGV4ZWRfZGInO1xuaW1wb3J0IHsgQnJvd3NlckxvY2FsU3RvcmFnZSwgQnJvd3NlckxvY2FsU3RvcmFnZU1hbmFnZXIgfSBmcm9tICcuLi9pby9sb2NhbF9zdG9yYWdlJztcbmltcG9ydCB7IE1vZGVsU3RvcmVNYW5hZ2VyUmVnaXN0cnkgfSBmcm9tICcuLi9pby9tb2RlbF9tYW5hZ2VtZW50JztcbmV4cG9ydCBjbGFzcyBQbGF0Zm9ybUJyb3dzZXIge1xuICAgIGZldGNoKHBhdGgsIGluaXQpIHtcbiAgICAgICAgcmV0dXJuIGZldGNoKHBhdGgsIGluaXQpO1xuICAgIH1cbiAgICBub3coKSB7XG4gICAgICAgIHJldHVybiBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICB9XG4gICAgZW5jb2RlKHRleHQsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmIChlbmNvZGluZyAhPT0gJ3V0Zi04JyAmJiBlbmNvZGluZyAhPT0gJ3V0ZjgnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJyb3dzZXIncyBlbmNvZGVyIG9ubHkgc3VwcG9ydHMgdXRmLTgsIGJ1dCBnb3QgJHtlbmNvZGluZ31gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy50ZXh0RW5jb2RlciA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnRleHRFbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dEVuY29kZXIuZW5jb2RlKHRleHQpO1xuICAgIH1cbiAgICBkZWNvZGUoYnl0ZXMsIGVuY29kaW5nKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGV4dERlY29kZXIoZW5jb2RpbmcpLmRlY29kZShieXRlcyk7XG4gICAgfVxufVxuaWYgKGVudigpLmdldCgnSVNfQlJPV1NFUicpKSB7XG4gICAgZW52KCkuc2V0UGxhdGZvcm0oJ2Jyb3dzZXInLCBuZXcgUGxhdGZvcm1Ccm93c2VyKCkpO1xuICAgIC8vIFJlZ2lzdGVyIExvY2FsU3RvcmFnZSBJT0hhbmRsZXJcbiAgICB0cnkge1xuICAgICAgICBNb2RlbFN0b3JlTWFuYWdlclJlZ2lzdHJ5LnJlZ2lzdGVyTWFuYWdlcihCcm93c2VyTG9jYWxTdG9yYWdlLlVSTF9TQ0hFTUUsIG5ldyBCcm93c2VyTG9jYWxTdG9yYWdlTWFuYWdlcigpKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgIH1cbiAgICAvLyBSZWdpc3RlciBJbmRleGVkREIgSU9IYW5kbGVyXG4gICAgdHJ5IHtcbiAgICAgICAgTW9kZWxTdG9yZU1hbmFnZXJSZWdpc3RyeS5yZWdpc3Rlck1hbmFnZXIoQnJvd3NlckluZGV4ZWREQi5VUkxfU0NIRU1FLCBuZXcgQnJvd3NlckluZGV4ZWREQk1hbmFnZXIoKSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wbGF0Zm9ybV9icm93c2VyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGVudiB9IGZyb20gJy4uL2Vudmlyb25tZW50Jztcbi8vIFdlIGFyZSB3cmFwcGluZyB0aGlzIHdpdGhpbiBhbiBvYmplY3Qgc28gaXQgY2FuIGJlIHN0dWJiZWQgYnkgSmFzbWluZS5cbmV4cG9ydCBjb25zdCBnZXROb2RlRmV0Y2ggPSB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXJlcXVpcmUtaW1wb3J0c1xuICAgIGltcG9ydEZldGNoOiAoKSA9PiByZXF1aXJlKCdub2RlLWZldGNoJylcbn07XG5sZXQgc3lzdGVtRmV0Y2g7XG4vLyBUaGVzZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzIGFyZSBmb3IgdGVzdGluZyBzbyB3ZSBkb24ndCBleHBvcnQgYSBtdXRhYmxlXG4vLyB2YXJpYWJsZS5cbmV4cG9ydCBmdW5jdGlvbiByZXNldFN5c3RlbUZldGNoKCkge1xuICAgIHN5c3RlbUZldGNoID0gbnVsbDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzZXRTeXN0ZW1GZXRjaChmZXRjaEZuKSB7XG4gICAgc3lzdGVtRmV0Y2ggPSBmZXRjaEZuO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFN5c3RlbUZldGNoKCkge1xuICAgIHJldHVybiBzeXN0ZW1GZXRjaDtcbn1cbmV4cG9ydCBjbGFzcyBQbGF0Zm9ybU5vZGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tcmVxdWlyZS1pbXBvcnRzXG4gICAgICAgIHRoaXMudXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbiAgICAgICAgLy8gQWNjb3JkaW5nIHRvIHRoZSBzcGVjLCB0aGUgYnVpbHQtaW4gZW5jb2RlciBjYW4gZG8gb25seSBVVEYtOCBlbmNvZGluZy5cbiAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1RleHRFbmNvZGVyL1RleHRFbmNvZGVyXG4gICAgICAgIHRoaXMudGV4dEVuY29kZXIgPSBuZXcgdGhpcy51dGlsLlRleHRFbmNvZGVyKCk7XG4gICAgfVxuICAgIGZldGNoKHBhdGgsIHJlcXVlc3RJbml0cykge1xuICAgICAgICBpZiAoZW52KCkuZ2xvYmFsLmZldGNoICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBlbnYoKS5nbG9iYWwuZmV0Y2gocGF0aCwgcmVxdWVzdEluaXRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3lzdGVtRmV0Y2ggPT0gbnVsbCkge1xuICAgICAgICAgICAgc3lzdGVtRmV0Y2ggPSBnZXROb2RlRmV0Y2guaW1wb3J0RmV0Y2goKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3lzdGVtRmV0Y2gocGF0aCwgcmVxdWVzdEluaXRzKTtcbiAgICB9XG4gICAgbm93KCkge1xuICAgICAgICBjb25zdCB0aW1lID0gcHJvY2Vzcy5ocnRpbWUoKTtcbiAgICAgICAgcmV0dXJuIHRpbWVbMF0gKiAxMDAwICsgdGltZVsxXSAvIDEwMDAwMDA7XG4gICAgfVxuICAgIGVuY29kZSh0ZXh0LCBlbmNvZGluZykge1xuICAgICAgICBpZiAoZW5jb2RpbmcgIT09ICd1dGYtOCcgJiYgZW5jb2RpbmcgIT09ICd1dGY4Jykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb2RlIGJ1aWx0LWluIGVuY29kZXIgb25seSBzdXBwb3J0cyB1dGYtOCwgYnV0IGdvdCAke2VuY29kaW5nfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnRleHRFbmNvZGVyLmVuY29kZSh0ZXh0KTtcbiAgICB9XG4gICAgZGVjb2RlKGJ5dGVzLCBlbmNvZGluZykge1xuICAgICAgICBpZiAoYnl0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyB0aGlzLnV0aWwuVGV4dERlY29kZXIoZW5jb2RpbmcpLmRlY29kZShieXRlcyk7XG4gICAgfVxufVxuaWYgKGVudigpLmdldCgnSVNfTk9ERScpKSB7XG4gICAgZW52KCkuc2V0UGxhdGZvcm0oJ25vZGUnLCBuZXcgUGxhdGZvcm1Ob2RlKCkpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGxhdGZvcm1fbm9kZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBlbnYgfSBmcm9tICcuL2Vudmlyb25tZW50JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi91dGlsJztcbmV4cG9ydCBjbGFzcyBQcm9maWxlciB7XG4gICAgY29uc3RydWN0b3IoYmFja2VuZFRpbWVyLCBsb2dnZXIpIHtcbiAgICAgICAgdGhpcy5iYWNrZW5kVGltZXIgPSBiYWNrZW5kVGltZXI7XG4gICAgICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyO1xuICAgICAgICBpZiAobG9nZ2VyID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyID0gbmV3IExvZ2dlcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByb2ZpbGVLZXJuZWwoa2VybmVsTmFtZSwgaW5wdXRzLCBmKSB7XG4gICAgICAgIGxldCBvdXRwdXRzO1xuICAgICAgICBjb25zdCBob2xkUmVzdWx0V3JhcHBlckZuID0gKCkgPT4ge1xuICAgICAgICAgICAgb3V0cHV0cyA9IGYoKTtcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHRpbWVyO1xuICAgICAgICBjb25zdCBzdGFydCA9IHV0aWwubm93KCk7XG4gICAgICAgIGlmICh0aGlzLmJhY2tlbmRUaW1lci50aW1lckF2YWlsYWJsZSgpKSB7XG4gICAgICAgICAgICB0aW1lciA9IHRoaXMuYmFja2VuZFRpbWVyLnRpbWUoaG9sZFJlc3VsdFdyYXBwZXJGbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBob2xkUmVzdWx0V3JhcHBlckZuKCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG91dHB1dCBvZiBvdXRwdXRzKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0LmRhdGFTeW5jKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aW1lciA9IFByb21pc2UucmVzb2x2ZSh7IGtlcm5lbE1zOiB1dGlsLm5vdygpIC0gc3RhcnQgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVudigpLmdldEJvb2woJ0NIRUNLX0NPTVBVVEFUSU9OX0ZPUl9FUlJPUlMnKSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRwdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0ID0gb3V0cHV0c1tpXTtcbiAgICAgICAgICAgICAgICAvLyBEYW5nbGluZyBwcm9taXNlIGhlcmUgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIHByb3BhZ2F0ZSB1cFxuICAgICAgICAgICAgICAgIC8vIGFzeW5jaHJvbmljaXR5LlxuICAgICAgICAgICAgICAgIG91dHB1dC5kYXRhKCkudGhlbih0ZW5zb3JWYWxzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tDb21wdXRhdGlvbkZvckVycm9ycyh0ZW5zb3JWYWxzLCBvdXRwdXQuZHR5cGUsIGtlcm5lbE5hbWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGtlcm5lbFByb2ZpbGUgPSB7XG4gICAgICAgICAgICBrZXJuZWxOYW1lLFxuICAgICAgICAgICAgb3V0cHV0cyxcbiAgICAgICAgICAgIGlucHV0cyxcbiAgICAgICAgICAgIHRpbWVNczogdGltZXIudGhlbih0aW1pbmcgPT4gdGltaW5nLmtlcm5lbE1zKSxcbiAgICAgICAgICAgIGV4dHJhSW5mbzogdGltZXIudGhlbih0aW1pbmcgPT4gdGltaW5nLmdldEV4dHJhUHJvZmlsZUluZm8gIT0gbnVsbCA/XG4gICAgICAgICAgICAgICAgdGltaW5nLmdldEV4dHJhUHJvZmlsZUluZm8oKSA6XG4gICAgICAgICAgICAgICAgJycpXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBrZXJuZWxQcm9maWxlO1xuICAgIH1cbiAgICBsb2dLZXJuZWxQcm9maWxlKGtlcm5lbFByb2ZpbGUpIHtcbiAgICAgICAgY29uc3QgeyBrZXJuZWxOYW1lLCBvdXRwdXRzLCB0aW1lTXMsIGlucHV0cywgZXh0cmFJbmZvIH0gPSBrZXJuZWxQcm9maWxlO1xuICAgICAgICBvdXRwdXRzLmZvckVhY2gocmVzdWx0ID0+IHtcbiAgICAgICAgICAgIFByb21pc2UuYWxsKFtyZXN1bHQuZGF0YSgpLCB0aW1lTXMsIGV4dHJhSW5mb10pLnRoZW4odmFsdWVDb250YWluZXIgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZ0tlcm5lbFByb2ZpbGUoa2VybmVsTmFtZSwgcmVzdWx0LCB2YWx1ZUNvbnRhaW5lclswXSwgdmFsdWVDb250YWluZXJbMV0sIGlucHV0cywgdmFsdWVDb250YWluZXJbMl0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0NvbXB1dGF0aW9uRm9yRXJyb3JzKHZhbHMsIGR0eXBlLCBrZXJuZWxOYW1lKSB7XG4gICAgaWYgKGR0eXBlICE9PSAnZmxvYXQzMicpIHtcbiAgICAgICAgLy8gT25seSBmbG9hdGluZyBwb2ludCBjb21wdXRhdGlvbnMgd2lsbCBnZW5lcmF0ZSBOYU4gdmFsdWVzXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IG51bSA9IHZhbHNbaV07XG4gICAgICAgIGlmIChpc05hTihudW0pIHx8ICFpc0Zpbml0ZShudW0pKSB7XG4gICAgICAgICAgICAvLyBUaHJvd2luZyBjdXN0b20gZXhjZXB0aW9uIHNvIGJlaGF2aW9yIGlzIHRlc3RhYmxlLlxuICAgICAgICAgICAgY29uc29sZS53YXJuKGBGb3VuZCAke251bX0gaW4gdGhlIHJlc3VsdCBvZiAnJHtrZXJuZWxOYW1lfSdgKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmV4cG9ydCBjbGFzcyBMb2dnZXIge1xuICAgIGxvZ0tlcm5lbFByb2ZpbGUobmFtZSwgcmVzdWx0LCB2YWxzLCB0aW1lTXMsIGlucHV0cywgZXh0cmFJbmZvKSB7XG4gICAgICAgIGNvbnN0IHRpbWUgPSB0eXBlb2YgdGltZU1zID09PSAnbnVtYmVyJyA/IHV0aWwucmlnaHRQYWQoYCR7dGltZU1zfW1zYCwgOSkgOlxuICAgICAgICAgICAgdGltZU1zWydlcnJvciddO1xuICAgICAgICBjb25zdCBwYWRkZWROYW1lID0gdXRpbC5yaWdodFBhZChuYW1lLCAyNSk7XG4gICAgICAgIGNvbnN0IHJhbmsgPSByZXN1bHQucmFuaztcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHJlc3VsdC5zaXplO1xuICAgICAgICBjb25zdCBzaGFwZSA9IHV0aWwucmlnaHRQYWQocmVzdWx0LnNoYXBlLnRvU3RyaW5nKCksIDE0KTtcbiAgICAgICAgbGV0IGlucHV0U2hhcGVzRGVzY3JpcHRpb24gPSAnJztcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIGluIGlucHV0cykge1xuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBpbnB1dHNbbmFtZV07XG4gICAgICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBpbnB1dCBtaWdodCBiZSBhIG5vbi10ZW5zb3IgKGUuZyBIVE1MSW1hZ2VFbGVtZW50KSwgaW4gd2hpY2ggY2FzZVxuICAgICAgICAgICAgICAgIC8vIHdlIGNsYWltIHRoZSBvdXRwdXQgc2hhcGUgYXMgaW5wdXQgc2hhcGUuXG4gICAgICAgICAgICAgICAgY29uc3QgaW5wdXRTaGFwZSA9IGlucHV0LnNoYXBlIHx8IHJlc3VsdC5zaGFwZTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnB1dFJhbmsgPSBpbnB1dFNoYXBlLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpbnB1dFNoYXBlc0Rlc2NyaXB0aW9uICs9XG4gICAgICAgICAgICAgICAgICAgIGAke25hbWV9OiAke2lucHV0UmFua31EICR7aW5wdXRSYW5rID4gMCA/IGlucHV0U2hhcGUgOiAnJ30gYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgJWMke3BhZGRlZE5hbWV9XFx0JWMke3RpbWV9XFx0JWMke3Jhbmt9RCAke3NoYXBlfVxcdCVjJHtzaXplfVxcdCVjJHtpbnB1dFNoYXBlc0Rlc2NyaXB0aW9ufVxcdCVjJHtleHRyYUluZm99YCwgJ2ZvbnQtd2VpZ2h0OmJvbGQnLCAnY29sb3I6cmVkJywgJ2NvbG9yOmJsdWUnLCAnY29sb3I6IG9yYW5nZScsICdjb2xvcjogZ3JlZW4nLCAnY29sb3I6IHN0ZWVsYmx1ZScpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXByb2ZpbGVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4vdXRpbCc7XG4vKipcbiAqIFNlcmlhbGl6YWJsZSBkZWZpbmVzIHRoZSBzZXJpYWxpemF0aW9uIGNvbnRyYWN0LlxuICpcbiAqIFRGSlMgcmVxdWlyZXMgc2VyaWFsaXphYmxlIGNsYXNzZXMgdG8gcmV0dXJuIHRoZWlyIGNsYXNzTmFtZSB3aGVuIGFza2VkXG4gKiB0byBhdm9pZCBpc3N1ZXMgd2l0aCBtaW5pZmljYXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXJpYWxpemFibGUge1xuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgY2xhc3MgbmFtZSBmb3IgdGhpcyBjbGFzcyB0byB1c2UgaW4gc2VyaWFsaXphdGlvbiBjb250ZXh0cy5cbiAgICAgKlxuICAgICAqIEdlbmVyYWxseSBzcGVha2luZyB0aGlzIHdpbGwgYmUgdGhlIHNhbWUgdGhpbmcgdGhhdCBjb25zdHJ1Y3Rvci5uYW1lXG4gICAgICogd291bGQgaGF2ZSByZXR1cm5lZC4gIEhvd2V2ZXIsIHRoZSBjbGFzcyBuYW1lIG5lZWRzIHRvIGJlIHJvYnVzdFxuICAgICAqIGFnYWluc3QgbWluaWZpY2F0aW9uIGZvciBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiB0byB3b3JrIHByb3Blcmx5LlxuICAgICAqXG4gICAgICogVGhlcmUncyBhbHNvIHBsYWNlcyBzdWNoIGFzIGluaXRpYWxpemVycy5WYXJpYW5jZVNjYWxpbmcsIHdoZXJlXG4gICAgICogaW1wbGVtZW50YXRpb24gZGV0YWlscyBiZXR3ZWVuIGRpZmZlcmVudCBsYW5ndWFnZXMgbGVkIHRvIGRpZmZlcmVudFxuICAgICAqIGNsYXNzIGhpZXJhcmNoaWVzIGFuZCBhIG5vbi1sZWFmIG5vZGUgaXMgdXNlZCBmb3Igc2VyaWFsaXphdGlvbiBwdXJwb3Nlcy5cbiAgICAgKi9cbiAgICBnZXRDbGFzc05hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yXG4gICAgICAgICAgICAuY2xhc3NOYW1lO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFQgZnJvbSBhIENvbmZpZ0RpY3QuXG4gICAgICpcbiAgICAgKiBUaGlzIHdvcmtzIGZvciBtb3N0IGRlc2NlbmRhbnRzIG9mIHNlcmlhbGl6YWJsZS4gIEEgZmV3IG5lZWQgdG9cbiAgICAgKiBwcm92aWRlIHNwZWNpYWwgaGFuZGxpbmcuXG4gICAgICogQHBhcmFtIGNscyBBIENvbnN0cnVjdG9yIGZvciB0aGUgY2xhc3MgdG8gaW5zdGFudGlhdGUuXG4gICAgICogQHBhcmFtIGNvbmZpZyBUaGUgQ29uZmlndXJhdGlvbiBmb3IgdGhlIG9iamVjdC5cbiAgICAgKi9cbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBzdGF0aWMgZnJvbUNvbmZpZyhjbHMsIGNvbmZpZykge1xuICAgICAgICByZXR1cm4gbmV3IGNscyhjb25maWcpO1xuICAgIH1cbn1cbi8qKlxuICogTWFwcyBzdHJpbmcga2V5cyB0byBjbGFzcyBjb25zdHJ1Y3RvcnMuXG4gKlxuICogVXNlZCBkdXJpbmcgKGRlKXNlcmlhbGl6YXRpb24gZnJvbSB0aGUgY3Jvc3MtbGFuZ3VhZ2UgSlNPTiBmb3JtYXQsIHdoaWNoXG4gKiByZXF1aXJlcyB0aGUgY2xhc3MgbmFtZSBpbiB0aGUgc2VyaWFsaXphdGlvbiBmb3JtYXQgbWF0Y2hlcyB0aGUgY2xhc3NcbiAqIG5hbWVzIGFzIHVzZWQgaW4gUHl0aG9uLCBzaG91bGQgaXQgZXhpc3QuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXJpYWxpemF0aW9uTWFwIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5jbGFzc05hbWVNYXAgPSB7fTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBtYXAuXG4gICAgICovXG4gICAgc3RhdGljIGdldE1hcCgpIHtcbiAgICAgICAgaWYgKFNlcmlhbGl6YXRpb25NYXAuaW5zdGFuY2UgPT0gbnVsbCkge1xuICAgICAgICAgICAgU2VyaWFsaXphdGlvbk1hcC5pbnN0YW5jZSA9IG5ldyBTZXJpYWxpemF0aW9uTWFwKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFNlcmlhbGl6YXRpb25NYXAuaW5zdGFuY2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVycyB0aGUgY2xhc3MgYXMgc2VyaWFsaXphYmxlLlxuICAgICAqL1xuICAgIHN0YXRpYyByZWdpc3RlcihjbHMpIHtcbiAgICAgICAgU2VyaWFsaXphdGlvbk1hcC5nZXRNYXAoKS5jbGFzc05hbWVNYXBbY2xzLmNsYXNzTmFtZV0gPVxuICAgICAgICAgICAgW2NscywgY2xzLmZyb21Db25maWddO1xuICAgIH1cbn1cbi8qKlxuICogUmVnaXN0ZXIgYSBjbGFzcyB3aXRoIHRoZSBzZXJpYWxpemF0aW9uIG1hcCBvZiBUZW5zb3JGbG93LmpzLlxuICpcbiAqIFRoaXMgaXMgb2Z0ZW4gdXNlZCBmb3IgcmVnaXN0ZXJpbmcgY3VzdG9tIExheWVycywgc28gdGhleSBjYW4gYmVcbiAqIHNlcmlhbGl6ZWQgYW5kIGRlc2VyaWFsaXplZC5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYGpzXG4gKiBjbGFzcyBNeUN1c3RvbUxheWVyIGV4dGVuZHMgdGYubGF5ZXJzLkxheWVyIHtcbiAqICAgc3RhdGljIGNsYXNzTmFtZSA9ICdNeUN1c3RvbUxheWVyJztcbiAqXG4gKiAgIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICogICAgIHN1cGVyKGNvbmZpZyk7XG4gKiAgIH1cbiAqIH1cbiAqIHRmLnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhNeUN1c3RvbUxheWVyKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBjbHMgVGhlIGNsYXNzIHRvIGJlIHJlZ2lzdGVyZWQuIEl0IG11c3QgaGF2ZSBhIHB1YmxpYyBzdGF0aWMgbWVtYmVyXG4gKiAgIGNhbGxlZCBgY2xhc3NOYW1lYCBkZWZpbmVkIGFuZCB0aGUgdmFsdWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ01vZGVscycsIHN1YmhlYWRpbmc6ICdTZXJpYWxpemF0aW9uJywgaWdub3JlQ0k6IHRydWV9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckNsYXNzKGNscykge1xuICAgIGFzc2VydChjbHMuY2xhc3NOYW1lICE9IG51bGwsICgpID0+IGBDbGFzcyBiZWluZyByZWdpc3RlcmVkIGRvZXMgbm90IGhhdmUgdGhlIHN0YXRpYyBjbGFzc05hbWUgYCArXG4gICAgICAgIGBwcm9wZXJ0eSBkZWZpbmVkLmApO1xuICAgIGFzc2VydCh0eXBlb2YgY2xzLmNsYXNzTmFtZSA9PT0gJ3N0cmluZycsICgpID0+IGBjbGFzc05hbWUgaXMgcmVxdWlyZWQgdG8gYmUgYSBzdHJpbmcsIGJ1dCBnb3QgdHlwZSBgICtcbiAgICAgICAgdHlwZW9mIGNscy5jbGFzc05hbWUpO1xuICAgIGFzc2VydChjbHMuY2xhc3NOYW1lLmxlbmd0aCA+IDAsICgpID0+IGBDbGFzcyBiZWluZyByZWdpc3RlcmVkIGhhcyBhbiBlbXB0eS1zdHJpbmcgYXMgaXRzIGNsYXNzTmFtZSwgYCArXG4gICAgICAgIGB3aGljaCBpcyBkaXNhbGxvd2VkLmApO1xuICAgIFNlcmlhbGl6YXRpb25NYXAucmVnaXN0ZXIoY2xzKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlcmlhbGl6YXRpb24uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuL3V0aWwnO1xuLyoqXG4gKiBDb21wdXRlcyBhIGxpc3Qgb2YgVGFwZU5vZGVzIHRoYXQgY29ubmVjdCB4IHRvIHksIGZpbHRlcmluZyBldmVyeXRoaW5nIGVsc2VcbiAqIG91dCBhbmQgcHJlc2VydmluZyB0aGUgb3JkZXIgb2YgdGhlIG9yaWdpbmFsIHRhcGUgZWxlbWVudHMuXG4gKlxuICogQHBhcmFtIHRhcGUgVGhlIHRhcGUgZWxlbWVudHMgdG8gZmlsdGVyLlxuICogQHBhcmFtIHhzIFRoZSBpbnB1dCBUZW5zb3JzLlxuICogQHBhcmFtIHkgVGhlIG91dHB1dCBUZW5zb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWx0ZXJlZE5vZGVzWFRvWSh0YXBlLCB4cywgeSkge1xuICAgIC8vIEZvcndhcmQgcGFzcyB0byBjb21wdXRlIGFsbCB0aGUgbm9kZXMgYW5kIFRlbnNvcnMgdGhhdCBhcmUgdHJhbnNpdGl2ZWx5IGFcbiAgICAvLyBmdW5jdGlvbiBvZiB4LlxuICAgIGNvbnN0IHRlbnNvcnNGcm9tWCA9IHt9O1xuICAgIGNvbnN0IG5vZGVzRnJvbVggPSB7fTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRlbnNvcnNGcm9tWFt4c1tpXS5pZF0gPSB0cnVlO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRhcGVbaV07XG4gICAgICAgIGNvbnN0IG5vZGVJbnB1dHMgPSBub2RlLmlucHV0cztcbiAgICAgICAgZm9yIChjb25zdCBpbnB1dE5hbWUgaW4gbm9kZUlucHV0cykge1xuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBub2RlSW5wdXRzW2lucHV0TmFtZV07XG4gICAgICAgICAgICBsZXQgYW55SW5wdXRGcm9tWCA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB4cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGlmICh0ZW5zb3JzRnJvbVhbaW5wdXQuaWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUub3V0cHV0cy5mb3JFYWNoKG91dHB1dCA9PiB0ZW5zb3JzRnJvbVhbb3V0cHV0LmlkXSA9IHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBhbnlJbnB1dEZyb21YID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbm9kZXNGcm9tWFtub2RlLmlkXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhbnlJbnB1dEZyb21YKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQmFja3dhcmQgcGFzcyB0byBmaW5kIGFsbCBvZiB0aGUgbm9kZXMgYW5kIFRlbnNvcnMgdGhhdCBsZWFkIHRvIHkuXG4gICAgY29uc3QgdGVuc29yc0xlYWRUb1kgPSB7fTtcbiAgICB0ZW5zb3JzTGVhZFRvWVt5LmlkXSA9IHRydWU7XG4gICAgY29uc3Qgbm9kZXNUb1kgPSB7fTtcbiAgICBmb3IgKGxldCBpID0gdGFwZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBjb25zdCBub2RlID0gdGFwZVtpXTtcbiAgICAgICAgY29uc3Qgbm9kZUlucHV0cyA9IG5vZGUuaW5wdXRzO1xuICAgICAgICAvLyBJZiBhbnkgb2YgdGhlIG91dHB1dHMgbGVhZCB0byB5LCBtYXJrIGFsbCBvZiB0aGUgaW5wdXRzIGFzIGxlYWRpbmcgdG8geS5cbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBub2RlLm91dHB1dHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmICh0ZW5zb3JzTGVhZFRvWVtub2RlLm91dHB1dHNbal0uaWRdKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpbnB1dE5hbWUgaW4gbm9kZUlucHV0cykge1xuICAgICAgICAgICAgICAgICAgICB0ZW5zb3JzTGVhZFRvWVtub2RlSW5wdXRzW2lucHV0TmFtZV0uaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbm9kZXNUb1lbbm9kZS5pZF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBSZXR1cm4gdGhlIHBhdGhzIHRoYXQgY29tZSBmcm9tIHggYW5kIGxlYWQgdG8geS5cbiAgICBjb25zdCBmaWx0ZXJlZFRhcGUgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRhcGVbaV07XG4gICAgICAgIGlmIChub2Rlc0Zyb21YW25vZGUuaWRdICYmIG5vZGVzVG9ZW25vZGUuaWRdKSB7XG4gICAgICAgICAgICAvLyBQcnVuZSB0aGUgaW5wdXRzIGZyb20gdGhlIG5vZGUgdGhhdCBhcmVuJ3QgYSBmdW5jdGlvbiBvZiB4LlxuICAgICAgICAgICAgY29uc3QgcHJ1bmVkSW5wdXRzID0ge307XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlucHV0TmFtZSBpbiBub2RlLmlucHV0cykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVJbnB1dCA9IG5vZGUuaW5wdXRzW2lucHV0TmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKHRlbnNvcnNGcm9tWFtub2RlSW5wdXQuaWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIHBydW5lZElucHV0c1tpbnB1dE5hbWVdID0gbm9kZUlucHV0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENvcHkgdGhlIG5vZGUgYW5kIG92ZXJ3cml0ZSBpbnB1dHNBbmRBcmdzIHRvIHRoZSBwcnVuZWQgdmVyc2lvbi5cbiAgICAgICAgICAgIGNvbnN0IHBydW5lZE5vZGUgPSBPYmplY3QuYXNzaWduKHt9LCBub2RlKTtcbiAgICAgICAgICAgIHBydW5lZE5vZGUuaW5wdXRzID0gcHJ1bmVkSW5wdXRzO1xuICAgICAgICAgICAgcHJ1bmVkTm9kZS5vdXRwdXRzID0gbm9kZS5vdXRwdXRzO1xuICAgICAgICAgICAgZmlsdGVyZWRUYXBlLnB1c2gocHJ1bmVkTm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZpbHRlcmVkVGFwZTtcbn1cbi8qKlxuICogQmFja3Byb3BhZ2F0ZSBncmFkaWVudHMgdGhyb3VnaCB0aGUgZmlsdGVyZWQgVGFwZU5vZGVzLlxuICpcbiAqIEBwYXJhbSB0ZW5zb3JBY2N1bXVsYXRlZEdyYWRpZW50TWFwIEEgbWFwIG9mIFRlbnNvciB0byBpdHMgZ3JhZGllbnQuIFRoaXMgbWFwXG4gKiBpcyBtdXRhdGVkIGJ5IHRoaXMgbWV0aG9kLlxuICogQHBhcmFtIGZpbHRlcmVkVGFwZSBUaGUgZmlsdGVyZWQgVGFwZU5vZGVzIHRvIGJhY2twcm9wIHRocm91Z2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiYWNrcHJvcGFnYXRlR3JhZGllbnRzKHRlbnNvckFjY3VtdWxhdGVkR3JhZGllbnRNYXAsIGZpbHRlcmVkVGFwZSwgdGlkeSwgYWRkKSB7XG4gICAgLy8gV2FsayB0aGUgdGFwZSBiYWNrd2FyZCBhbmQga2VlcCBhIG1hcCBvZiBUZW5zb3IgdG8gaXRzIGdyYWRpZW50LlxuICAgIGZvciAobGV0IGkgPSBmaWx0ZXJlZFRhcGUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IGZpbHRlcmVkVGFwZVtpXTtcbiAgICAgICAgY29uc3QgZHlzID0gW107XG4gICAgICAgIG5vZGUub3V0cHV0cy5mb3JFYWNoKG8gPT4ge1xuICAgICAgICAgICAgY29uc3QgZ3JhZFRlbnNvciA9IHRlbnNvckFjY3VtdWxhdGVkR3JhZGllbnRNYXBbby5pZF07XG4gICAgICAgICAgICBpZiAoZ3JhZFRlbnNvciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZHlzLnB1c2goZ3JhZFRlbnNvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIHBhcnRpY3VsYXIgb3V0cHV0IGlzIG5vdCBpbiB0aGUgYmFjay1wcm9wYWdhdGlvbiBzdWJncmFwaCwgc28gaXRcbiAgICAgICAgICAgICAgICAvLyBkb2VzIG5vdCBhZmZlY3QgdGhlIGZpbmFsIG91dHB1dCwgdGh1cyB3ZSBwdXQgbnVsbCBmb3IgaXRzIGR5LlxuICAgICAgICAgICAgICAgIGR5cy5wdXNoKG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKG5vZGUuZ3JhZGllbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29tcHV0ZSBncmFkaWVudDogZ3JhZGllbnQgZnVuY3Rpb24gbm90IGZvdW5kIGAgK1xuICAgICAgICAgICAgICAgIGBmb3IgJHtub2RlLmtlcm5lbE5hbWV9LmApO1xuICAgICAgICB9XG4gICAgICAgIC8vIEJhY2twcm9wIGR5IHRocm91Z2ggdGhpcyBub2RlIGFuZCBhY2N1bXVsYXRlIGdyYWRpZW50cyBvdmVyIHRoZSBpbnB1dHMuXG4gICAgICAgIGNvbnN0IGlucHV0R3JhZGllbnRzID0gbm9kZS5ncmFkaWVudChkeXMpO1xuICAgICAgICBmb3IgKGNvbnN0IGlucHV0TmFtZSBpbiBub2RlLmlucHV0cykge1xuICAgICAgICAgICAgaWYgKCEoaW5wdXROYW1lIGluIGlucHV0R3JhZGllbnRzKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGJhY2twcm9wIHRocm91Z2ggaW5wdXQgJHtpbnB1dE5hbWV9LiBgICtcbiAgICAgICAgICAgICAgICAgICAgYEF2YWlsYWJsZSBncmFkaWVudHMgZm91bmQ6ICR7T2JqZWN0LmtleXMoaW5wdXRHcmFkaWVudHMpfS5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENhbGwgdGhlIGdyYWRpZW50IGZ1bmN0aW9uLlxuICAgICAgICAgICAgY29uc3QgZHggPSB0aWR5KCgpID0+IGlucHV0R3JhZGllbnRzW2lucHV0TmFtZV0oKSk7XG4gICAgICAgICAgICBpZiAoZHguZHR5cGUgIT09ICdmbG9hdDMyJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgaW4gZ3JhZGllbnQgZm9yIG9wICR7bm9kZS5rZXJuZWxOYW1lfS4gVGhlIGdyYWRpZW50IG9mIGlucHV0IGAgK1xuICAgICAgICAgICAgICAgICAgICBgJHtpbnB1dE5hbWV9IG11c3QgaGF2ZSAnZmxvYXQzMicgZHR5cGUsIGJ1dCBoYXMgJyR7ZHguZHR5cGV9J2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeCA9IG5vZGUuaW5wdXRzW2lucHV0TmFtZV07XG4gICAgICAgICAgICBpZiAoIXV0aWwuYXJyYXlzRXF1YWwoZHguc2hhcGUsIHguc2hhcGUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBpbiBncmFkaWVudCBmb3Igb3AgJHtub2RlLmtlcm5lbE5hbWV9LiBUaGUgZ3JhZGllbnQgb2YgaW5wdXQgYCArXG4gICAgICAgICAgICAgICAgICAgIGAnJHtpbnB1dE5hbWV9JyBoYXMgc2hhcGUgJyR7ZHguc2hhcGV9Jywgd2hpY2ggZG9lcyBub3QgbWF0Y2ggYCArXG4gICAgICAgICAgICAgICAgICAgIGB0aGUgc2hhcGUgb2YgdGhlIGlucHV0ICcke3guc2hhcGV9J2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRlbnNvckFjY3VtdWxhdGVkR3JhZGllbnRNYXBbeC5pZF0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRlbnNvckFjY3VtdWxhdGVkR3JhZGllbnRNYXBbeC5pZF0gPSBkeDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1ckdyYWRpZW50ID0gdGVuc29yQWNjdW11bGF0ZWRHcmFkaWVudE1hcFt4LmlkXTtcbiAgICAgICAgICAgICAgICB0ZW5zb3JBY2N1bXVsYXRlZEdyYWRpZW50TWFwW3guaWRdID0gYWRkKGN1ckdyYWRpZW50LCBkeCk7XG4gICAgICAgICAgICAgICAgY3VyR3JhZGllbnQuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGFwZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBnZXRHbG9iYWwgfSBmcm9tICcuL2dsb2JhbF91dGlsJztcbmltcG9ydCB7IHRlbnNvclRvU3RyaW5nIH0gZnJvbSAnLi90ZW5zb3JfZm9ybWF0JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi91dGlsJztcbmltcG9ydCB7IGNvbXB1dGVTdHJpZGVzLCB0b05lc3RlZEFycmF5IH0gZnJvbSAnLi91dGlsJztcbi8qKlxuICogQSBtdXRhYmxlIG9iamVjdCwgc2ltaWxhciB0byBgdGYuVGVuc29yYCwgdGhhdCBhbGxvd3MgdXNlcnMgdG8gc2V0IHZhbHVlc1xuICogYXQgbG9jYXRpb25zIGJlZm9yZSBjb252ZXJ0aW5nIHRvIGFuIGltbXV0YWJsZSBgdGYuVGVuc29yYC5cbiAqXG4gKiBTZWUgYHRmLmJ1ZmZlcmAgZm9yIGNyZWF0aW5nIGEgdGVuc29yIGJ1ZmZlci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAqL1xuZXhwb3J0IGNsYXNzIFRlbnNvckJ1ZmZlciB7XG4gICAgY29uc3RydWN0b3Ioc2hhcGUsIGR0eXBlLCB2YWx1ZXMpIHtcbiAgICAgICAgdGhpcy5kdHlwZSA9IGR0eXBlO1xuICAgICAgICB0aGlzLnNoYXBlID0gc2hhcGUuc2xpY2UoKTtcbiAgICAgICAgdGhpcy5zaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHNoYXBlKTtcbiAgICAgICAgaWYgKHZhbHVlcyAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gdmFsdWVzLmxlbmd0aDtcbiAgICAgICAgICAgIHV0aWwuYXNzZXJ0KG4gPT09IHRoaXMuc2l6ZSwgKCkgPT4gYExlbmd0aCBvZiB2YWx1ZXMgJyR7bn0nIGRvZXMgbm90IG1hdGNoIHRoZSBzaXplIGAgK1xuICAgICAgICAgICAgICAgIGBpbmZlcnJlZCBieSB0aGUgc2hhcGUgJyR7dGhpcy5zaXplfScuYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBjb21wbGV4NjQgZHR5cGUgVGVuc29yQnVmZmVycyBhcmUgbm90IHN1cHBvcnRlZC4gUGxlYXNlIGNyZWF0ZSBgICtcbiAgICAgICAgICAgICAgICBgYSBUZW5zb3JCdWZmZXIgZm9yIHRoZSByZWFsIGFuZCBpbWFnaW5hcnkgcGFydHMgc2VwYXJhdGVseSBhbmQgYCArXG4gICAgICAgICAgICAgICAgYGNhbGwgdGYuY29tcGxleChyZWFsLCBpbWFnKS5gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbHVlcyA9IHZhbHVlcyB8fCB1dGlsLmdldEFycmF5RnJvbURUeXBlKGR0eXBlLCB0aGlzLnNpemUpO1xuICAgICAgICB0aGlzLnN0cmlkZXMgPSBjb21wdXRlU3RyaWRlcyhzaGFwZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgYSB2YWx1ZSBpbiB0aGUgYnVmZmVyIGF0IGEgZ2l2ZW4gbG9jYXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcGFyYW0gbG9jcyAgVGhlIGxvY2F0aW9uIGluZGljZXMuXG4gICAgICpcbiAgICAgKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gICAgICovXG4gICAgc2V0KHZhbHVlLCAuLi5sb2NzKSB7XG4gICAgICAgIGlmIChsb2NzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgbG9jcyA9IFswXTtcbiAgICAgICAgfVxuICAgICAgICB1dGlsLmFzc2VydChsb2NzLmxlbmd0aCA9PT0gdGhpcy5yYW5rLCAoKSA9PiBgVGhlIG51bWJlciBvZiBwcm92aWRlZCBjb29yZGluYXRlcyAoJHtsb2NzLmxlbmd0aH0pIG11c3QgYCArXG4gICAgICAgICAgICBgbWF0Y2ggdGhlIHJhbmsgKCR7dGhpcy5yYW5rfSlgKTtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmxvY1RvSW5kZXgobG9jcyk7XG4gICAgICAgIHRoaXMudmFsdWVzW2luZGV4XSA9IHZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBpbiB0aGUgYnVmZmVyIGF0IHRoZSBwcm92aWRlZCBsb2NhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsb2NzIFRoZSBsb2NhdGlvbiBpbmRpY2VzLlxuICAgICAqXG4gICAgICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICAgICAqL1xuICAgIGdldCguLi5sb2NzKSB7XG4gICAgICAgIGlmIChsb2NzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgbG9jcyA9IFswXTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgbG9jIG9mIGxvY3MpIHtcbiAgICAgICAgICAgIGlmIChsb2MgPCAwIHx8IGxvYyA+PSB0aGlzLnNoYXBlW2ldKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXNnID0gYFJlcXVlc3RlZCBvdXQgb2YgcmFuZ2UgZWxlbWVudCBhdCAke2xvY3N9LiBgICtcbiAgICAgICAgICAgICAgICAgICAgYCAgQnVmZmVyIHNoYXBlPSR7dGhpcy5zaGFwZX1gO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIGxldCBpbmRleCA9IGxvY3NbbG9jcy5sZW5ndGggLSAxXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NzLmxlbmd0aCAtIDE7ICsraSkge1xuICAgICAgICAgICAgaW5kZXggKz0gdGhpcy5zdHJpZGVzW2ldICogbG9jc1tpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZXNbaW5kZXhdO1xuICAgIH1cbiAgICBsb2NUb0luZGV4KGxvY3MpIHtcbiAgICAgICAgaWYgKHRoaXMucmFuayA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5yYW5rID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jc1swXTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaW5kZXggPSBsb2NzW2xvY3MubGVuZ3RoIC0gMV07XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9jcy5sZW5ndGggLSAxOyArK2kpIHtcbiAgICAgICAgICAgIGluZGV4ICs9IHRoaXMuc3RyaWRlc1tpXSAqIGxvY3NbaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgICBpbmRleFRvTG9jKGluZGV4KSB7XG4gICAgICAgIGlmICh0aGlzLnJhbmsgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnJhbmsgPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBbaW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxvY3MgPSBuZXcgQXJyYXkodGhpcy5zaGFwZS5sZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvY3MubGVuZ3RoIC0gMTsgKytpKSB7XG4gICAgICAgICAgICBsb2NzW2ldID0gTWF0aC5mbG9vcihpbmRleCAvIHRoaXMuc3RyaWRlc1tpXSk7XG4gICAgICAgICAgICBpbmRleCAtPSBsb2NzW2ldICogdGhpcy5zdHJpZGVzW2ldO1xuICAgICAgICB9XG4gICAgICAgIGxvY3NbbG9jcy5sZW5ndGggLSAxXSA9IGluZGV4O1xuICAgICAgICByZXR1cm4gbG9jcztcbiAgICB9XG4gICAgZ2V0IHJhbmsoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNoYXBlLmxlbmd0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbW11dGFibGUgYHRmLlRlbnNvcmAgb2JqZWN0IGZyb20gdGhlIGJ1ZmZlci5cbiAgICAgKlxuICAgICAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAgICAgKi9cbiAgICB0b1RlbnNvcigpIHtcbiAgICAgICAgcmV0dXJuIHRyYWNrZXJGbigpLm1ha2VUZW5zb3IodGhpcy52YWx1ZXMsIHRoaXMuc2hhcGUsIHRoaXMuZHR5cGUpO1xuICAgIH1cbn1cbi8vIEZvciB0cmFja2luZyB0ZW5zb3IgY3JlYXRpb24gYW5kIGRpc3Bvc2FsLlxubGV0IHRyYWNrZXJGbiA9IG51bGw7XG4vLyBVc2VkIGJ5IGNoYWluaW5nIG1ldGhvZHMgdG8gY2FsbCBpbnRvIG9wcy5cbmxldCBvcEhhbmRsZXIgPSBudWxsO1xuLy8gVXNlZCB0byB3YXJuIGFib3V0IGRlcHJlY2F0ZWQgbWV0aG9kcy5cbmxldCBkZXByZWNhdGlvbldhcm5pbmdGbiA9IG51bGw7XG4vLyBUaGlzIGhlcmUgc28gdGhhdCB3ZSBjYW4gdXNlIHRoaXMgbWV0aG9kIG9uIGRldiBicmFuY2hlcyBhbmQga2VlcCB0aGVcbi8vIGZ1bmN0aW9uYWxpdHkgYXQgbWFzdGVyLlxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVudXNlZC1leHByZXNzaW9uXG5bZGVwcmVjYXRpb25XYXJuaW5nRm5dO1xuLyoqXG4gKiBBbiBleHRlcm5hbCBjb25zdW1lciBjYW4gcmVnaXN0ZXIgaXRzZWxmIGFzIHRoZSB0ZW5zb3IgdHJhY2tlci4gVGhpcyB3YXlcbiAqIHRoZSBUZW5zb3IgY2xhc3MgY2FuIG5vdGlmeSB0aGUgdHJhY2tlciBmb3IgZXZlcnkgdGVuc29yIGNyZWF0ZWQgYW5kXG4gKiBkaXNwb3NlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFRlbnNvclRyYWNrZXIoZm4pIHtcbiAgICB0cmFja2VyRm4gPSBmbjtcbn1cbi8qKlxuICogQW4gZXh0ZXJuYWwgY29uc3VtZXIgY2FuIHJlZ2lzdGVyIGl0c2VsZiBhcyB0aGUgb3AgaGFuZGxlci4gVGhpcyB3YXkgdGhlXG4gKiBUZW5zb3IgY2xhc3MgY2FuIGhhdmUgY2hhaW5pbmcgbWV0aG9kcyB0aGF0IGNhbGwgaW50byBvcHMgdmlhIHRoZSBvcFxuICogaGFuZGxlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldE9wSGFuZGxlcihoYW5kbGVyKSB7XG4gICAgb3BIYW5kbGVyID0gaGFuZGxlcjtcbn1cbi8qKlxuICogU2V0cyB0aGUgZGVwcmVjYXRpb24gd2FybmluZyBmdW5jdGlvbiB0byBiZSB1c2VkIGJ5IHRoaXMgZmlsZS4gVGhpcyB3YXkgdGhlXG4gKiBUZW5zb3IgY2xhc3MgY2FuIGJlIGEgbGVhZiBidXQgc3RpbGwgdXNlIHRoZSBlbnZpcm9ubWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldERlcHJlY2F0aW9uV2FybmluZ0ZuKGZuKSB7XG4gICAgZGVwcmVjYXRpb25XYXJuaW5nRm4gPSBmbjtcbn1cbi8qKlxuICogQSBgdGYuVGVuc29yYCBvYmplY3QgcmVwcmVzZW50cyBhbiBpbW11dGFibGUsIG11bHRpZGltZW5zaW9uYWwgYXJyYXkgb2ZcbiAqIG51bWJlcnMgdGhhdCBoYXMgYSBzaGFwZSBhbmQgYSBkYXRhIHR5cGUuXG4gKlxuICogRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIGZ1bmN0aW9ucyB0aGF0IGNyZWF0ZSB0ZW5zb3JzIGRvIG5vdCBuZWNlc3NhcmlseVxuICogcGVyZm9ybSBhIGNvcHkgb2YgdGhlIGRhdGEgcGFzc2VkIHRvIHRoZW0gKGUuZy4gaWYgdGhlIGRhdGEgaXMgcGFzc2VkIGFzIGFcbiAqIGBGbG9hdDMyQXJyYXlgKSwgYW5kIGNoYW5nZXMgdG8gdGhlIGRhdGEgd2lsbCBjaGFuZ2UgdGhlIHRlbnNvci4gVGhpcyBpcyBub3RcbiAqIGEgZmVhdHVyZSBhbmQgaXMgbm90IHN1cHBvcnRlZC4gVG8gYXZvaWQgdGhpcyBiZWhhdmlvciwgdXNlIHRoZSB0ZW5zb3IgYmVmb3JlXG4gKiBjaGFuZ2luZyB0aGUgaW5wdXQgZGF0YSBvciBjcmVhdGUgYSBjb3B5IHdpdGggYGNvcHkgPSB0Zi5hZGQoeW91clRlbnNvciwgMClgLlxuICpcbiAqIFNlZSBgdGYudGVuc29yYCBmb3IgZGV0YWlscyBvbiBob3cgdG8gY3JlYXRlIGEgYHRmLlRlbnNvcmAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gKi9cbmV4cG9ydCBjbGFzcyBUZW5zb3Ige1xuICAgIGNvbnN0cnVjdG9yKHNoYXBlLCBkdHlwZSwgZGF0YUlkLCBpZCkge1xuICAgICAgICAvKiogV2hldGhlciB0aGlzIHRlbnNvciBoYXMgYmVlbiBnbG9iYWxseSBrZXB0LiAqL1xuICAgICAgICB0aGlzLmtlcHQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc0Rpc3Bvc2VkSW50ZXJuYWwgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zaGFwZSA9IHNoYXBlLnNsaWNlKCk7XG4gICAgICAgIHRoaXMuZHR5cGUgPSBkdHlwZSB8fCAnZmxvYXQzMic7XG4gICAgICAgIHRoaXMuc2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShzaGFwZSk7XG4gICAgICAgIHRoaXMuc3RyaWRlcyA9IGNvbXB1dGVTdHJpZGVzKHNoYXBlKTtcbiAgICAgICAgdGhpcy5kYXRhSWQgPSBkYXRhSWQ7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5yYW5rVHlwZSA9ICh0aGlzLnJhbmsgPCA1ID8gdGhpcy5yYW5rLnRvU3RyaW5nKCkgOiAnaGlnaGVyJyk7XG4gICAgfVxuICAgIGdldCByYW5rKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zaGFwZS5sZW5ndGg7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBwcm9taXNlIG9mIGB0Zi5UZW5zb3JCdWZmZXJgIHRoYXQgaG9sZHMgdGhlIHVuZGVybHlpbmcgZGF0YS5cbiAgICAgKlxuICAgICAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NsYXNzZXMnfVxuICAgICAqL1xuICAgIGFzeW5jIGJ1ZmZlcigpIHtcbiAgICAgICAgY29uc3QgdmFscyA9IGF3YWl0IHRoaXMuZGF0YSgpO1xuICAgICAgICByZXR1cm4gb3BIYW5kbGVyLmJ1ZmZlcih0aGlzLnNoYXBlLCB0aGlzLmR0eXBlLCB2YWxzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGB0Zi5UZW5zb3JCdWZmZXJgIHRoYXQgaG9sZHMgdGhlIHVuZGVybHlpbmcgZGF0YS5cbiAgICAgKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICAgKi9cbiAgICBidWZmZXJTeW5jKCkge1xuICAgICAgICByZXR1cm4gb3BIYW5kbGVyLmJ1ZmZlcih0aGlzLnNoYXBlLCB0aGlzLmR0eXBlLCB0aGlzLmRhdGFTeW5jKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB0ZW5zb3IgZGF0YSBhcyBhIG5lc3RlZCBhcnJheS4gVGhlIHRyYW5zZmVyIG9mIGRhdGEgaXMgZG9uZVxuICAgICAqIGFzeW5jaHJvbm91c2x5LlxuICAgICAqXG4gICAgICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAgICovXG4gICAgYXN5bmMgYXJyYXkoKSB7XG4gICAgICAgIGNvbnN0IHZhbHMgPSBhd2FpdCB0aGlzLmRhdGEoKTtcbiAgICAgICAgcmV0dXJuIHRvTmVzdGVkQXJyYXkodGhpcy5zaGFwZSwgdmFscywgdGhpcy5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB0ZW5zb3IgZGF0YSBhcyBhIG5lc3RlZCBhcnJheS4gVGhlIHRyYW5zZmVyIG9mIGRhdGEgaXMgZG9uZVxuICAgICAqIHN5bmNocm9ub3VzbHkuXG4gICAgICpcbiAgICAgKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICAgKi9cbiAgICBhcnJheVN5bmMoKSB7XG4gICAgICAgIHJldHVybiB0b05lc3RlZEFycmF5KHRoaXMuc2hhcGUsIHRoaXMuZGF0YVN5bmMoKSwgdGhpcy5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBc3luY2hyb25vdXNseSBkb3dubG9hZHMgdGhlIHZhbHVlcyBmcm9tIHRoZSBgdGYuVGVuc29yYC4gUmV0dXJucyBhXG4gICAgICogcHJvbWlzZSBvZiBgVHlwZWRBcnJheWAgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjb21wdXRhdGlvbiBoYXMgZmluaXNoZWQuXG4gICAgICpcbiAgICAgKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICAgKi9cbiAgICBhc3luYyBkYXRhKCkge1xuICAgICAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgICAgICBjb25zdCBkYXRhID0gdHJhY2tlckZuKCkucmVhZCh0aGlzLmRhdGFJZCk7XG4gICAgICAgIGlmICh0aGlzLmR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSBhd2FpdCBkYXRhO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYnl0ZXMubWFwKGIgPT4gdXRpbC5kZWNvZGVTdHJpbmcoYikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZGVjb2RlIHRoZSBzdHJpbmcgYnl0ZXMgaW50byB1dGYtOC4gJyArXG4gICAgICAgICAgICAgICAgICAgICdUbyBnZXQgdGhlIG9yaWdpbmFsIGJ5dGVzLCBjYWxsIHRlbnNvci5ieXRlcygpLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTeW5jaHJvbm91c2x5IGRvd25sb2FkcyB0aGUgdmFsdWVzIGZyb20gdGhlIGB0Zi5UZW5zb3JgLiBUaGlzIGJsb2NrcyB0aGVcbiAgICAgKiBVSSB0aHJlYWQgdW50aWwgdGhlIHZhbHVlcyBhcmUgcmVhZHksIHdoaWNoIGNhbiBjYXVzZSBwZXJmb3JtYW5jZSBpc3N1ZXMuXG4gICAgICpcbiAgICAgKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICAgKi9cbiAgICBkYXRhU3luYygpIHtcbiAgICAgICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRyYWNrZXJGbigpLnJlYWRTeW5jKHRoaXMuZGF0YUlkKTtcbiAgICAgICAgaWYgKHRoaXMuZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhLm1hcChiID0+IHV0aWwuZGVjb2RlU3RyaW5nKGIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChfYSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGRlY29kZSB0aGUgc3RyaW5nIGJ5dGVzIGludG8gdXRmLTguICcgK1xuICAgICAgICAgICAgICAgICAgICAnVG8gZ2V0IHRoZSBvcmlnaW5hbCBieXRlcywgY2FsbCB0ZW5zb3IuYnl0ZXMoKS4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgLyoqIFJldHVybnMgdGhlIHVuZGVybHlpbmcgYnl0ZXMgb2YgdGhlIHRlbnNvcidzIGRhdGEuICovXG4gICAgYXN5bmMgYnl0ZXMoKSB7XG4gICAgICAgIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0cmFja2VyRm4oKS5yZWFkKHRoaXMuZGF0YUlkKTtcbiAgICAgICAgaWYgKHRoaXMuZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShkYXRhLmJ1ZmZlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRGlzcG9zZXMgYHRmLlRlbnNvcmAgZnJvbSBtZW1vcnkuXG4gICAgICpcbiAgICAgKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICAgKi9cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICBpZiAodGhpcy5pc0Rpc3Bvc2VkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdHJhY2tlckZuKCkuZGlzcG9zZVRlbnNvcih0aGlzKTtcbiAgICAgICAgdGhpcy5pc0Rpc3Bvc2VkSW50ZXJuYWwgPSB0cnVlO1xuICAgIH1cbiAgICBnZXQgaXNEaXNwb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNEaXNwb3NlZEludGVybmFsO1xuICAgIH1cbiAgICB0aHJvd0lmRGlzcG9zZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGVuc29yIGlzIGRpc3Bvc2VkLmApO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByaW50cyB0aGUgYHRmLlRlbnNvcmAuIFNlZSBgdGYucHJpbnRgIGZvciBkZXRhaWxzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZlcmJvc2UgV2hldGhlciB0byBwcmludCB2ZXJib3NlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0ZW5zb3IsXG4gICAgICogICAgaW5jbHVkaW5nIGR0eXBlIGFuZCBzaXplLlxuICAgICAqXG4gICAgICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAgICovXG4gICAgcHJpbnQodmVyYm9zZSA9IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBvcEhhbmRsZXIucHJpbnQodGhpcywgdmVyYm9zZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBjb3B5IG9mIHRoZSB0ZW5zb3IuIFNlZSBgdGYuY2xvbmVgIGZvciBkZXRhaWxzLlxuICAgICAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NsYXNzZXMnfVxuICAgICAqL1xuICAgIGNsb25lKCkge1xuICAgICAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgICAgICByZXR1cm4gb3BIYW5kbGVyLmNsb25lKHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIHRlbnNvci4gVXNlZnVsIGZvciBsb2dnaW5nLlxuICAgICAqXG4gICAgICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAgICovXG4gICAgdG9TdHJpbmcodmVyYm9zZSA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IHZhbHMgPSB0aGlzLmRhdGFTeW5jKCk7XG4gICAgICAgIHJldHVybiB0ZW5zb3JUb1N0cmluZyh2YWxzLCB0aGlzLnNoYXBlLCB0aGlzLmR0eXBlLCB2ZXJib3NlKTtcbiAgICB9XG4gICAgY2FzdChkdHlwZSkge1xuICAgICAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgICAgICByZXR1cm4gb3BIYW5kbGVyLmNhc3QodGhpcywgZHR5cGUpO1xuICAgIH1cbiAgICB2YXJpYWJsZSh0cmFpbmFibGUgPSB0cnVlLCBuYW1lLCBkdHlwZSkge1xuICAgICAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgICAgICByZXR1cm4gdHJhY2tlckZuKCkubWFrZVZhcmlhYmxlKHRoaXMsIHRyYWluYWJsZSwgbmFtZSwgZHR5cGUpO1xuICAgIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShUZW5zb3IsIFN5bWJvbC5oYXNJbnN0YW5jZSwge1xuICAgIHZhbHVlOiAoaW5zdGFuY2UpID0+IHtcbiAgICAgICAgLy8gSW1wbGVtZW50YXRpb24gbm90ZTogd2Ugc2hvdWxkIHVzZSBwcm9wZXJ0aWVzIG9mIHRoZSBvYmplY3QgdGhhdCB3aWxsIGJlXG4gICAgICAgIC8vIGRlZmluZWQgYmVmb3JlIHRoZSBjb25zdHJ1Y3RvciBib2R5IGhhcyBmaW5pc2hlZCBleGVjdXRpbmcgKG1ldGhvZHMpLlxuICAgICAgICAvLyBUaGlzIGlzIGJlY2F1c2Ugd2hlbiB0aGlzIGNvZGUgaXMgdHJhbnNwaWxlZCBieSBiYWJlbCwgYmFiZWwgd2lsbCBjYWxsXG4gICAgICAgIC8vIGNsYXNzQ2FsbENoZWNrIGJlZm9yZSB0aGUgY29uc3RydWN0b3IgYm9keSBpcyBydW4uXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZmpzL2lzc3Vlcy8zMzg0IGZvciBiYWNrc3RvcnkuXG4gICAgICAgIHJldHVybiAhIWluc3RhbmNlICYmIGluc3RhbmNlLmRhdGEgIT0gbnVsbCAmJiBpbnN0YW5jZS5kYXRhU3luYyAhPSBudWxsICYmXG4gICAgICAgICAgICBpbnN0YW5jZS50aHJvd0lmRGlzcG9zZWQgIT0gbnVsbDtcbiAgICB9XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBnZXRHbG9iYWxUZW5zb3JDbGFzcygpIHtcbiAgICAvLyBVc2UgZ2V0R2xvYmFsIHNvIHRoYXQgd2UgY2FuIGF1Z21lbnQgdGhlIFRlbnNvciBjbGFzcyBhY3Jvc3MgcGFja2FnZVxuICAgIC8vIGJvdW5kYXJpZXMgYmVjYXNlIHRoZSBub2RlIHJlc29sdXRpb24gYWxnIG1heSByZXN1bHQgaW4gZGlmZmVyZW50IG1vZHVsZXNcbiAgICAvLyBiZWluZyByZXR1cm5lZCBmb3IgdGhpcyBmaWxlIGRlcGVuZGluZyBvbiB0aGUgcGF0aCB0aGV5IGFyZSBsb2FkZWQgZnJvbS5cbiAgICByZXR1cm4gZ2V0R2xvYmFsKCdUZW5zb3InLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiBUZW5zb3I7XG4gICAgfSk7XG59XG4vLyBHbG9iYWwgc2lkZSBlZmZlY3QuIENhY2hlIGdsb2JhbCByZWZlcmVuY2UgdG8gVGVuc29yIGNsYXNzXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpO1xuLyoqXG4gKiBBIG11dGFibGUgYHRmLlRlbnNvcmAsIHVzZWZ1bCBmb3IgcGVyc2lzdGluZyBzdGF0ZSwgZS5nLiBmb3IgdHJhaW5pbmcuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gKi9cbmV4cG9ydCBjbGFzcyBWYXJpYWJsZSBleHRlbmRzIFRlbnNvciB7XG4gICAgY29uc3RydWN0b3IoaW5pdGlhbFZhbHVlLCB0cmFpbmFibGUsIG5hbWUsIHRlbnNvcklkKSB7XG4gICAgICAgIHN1cGVyKGluaXRpYWxWYWx1ZS5zaGFwZSwgaW5pdGlhbFZhbHVlLmR0eXBlLCBpbml0aWFsVmFsdWUuZGF0YUlkLCB0ZW5zb3JJZCk7XG4gICAgICAgIHRoaXMudHJhaW5hYmxlID0gdHJhaW5hYmxlO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBc3NpZ24gYSBuZXcgYHRmLlRlbnNvcmAgdG8gdGhpcyB2YXJpYWJsZS4gVGhlIG5ldyBgdGYuVGVuc29yYCBtdXN0IGhhdmVcbiAgICAgKiB0aGUgc2FtZSBzaGFwZSBhbmQgZHR5cGUgYXMgdGhlIG9sZCBgdGYuVGVuc29yYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuZXdWYWx1ZSBOZXcgdGVuc29yIHRvIGJlIGFzc2lnbmVkIHRvIHRoaXMgdmFyaWFibGUuXG4gICAgICpcbiAgICAgKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICAgKi9cbiAgICBhc3NpZ24obmV3VmFsdWUpIHtcbiAgICAgICAgaWYgKG5ld1ZhbHVlLmR0eXBlICE9PSB0aGlzLmR0eXBlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGR0eXBlIG9mIHRoZSBuZXcgdmFsdWUgKCR7bmV3VmFsdWUuZHR5cGV9KSBhbmQgYCArXG4gICAgICAgICAgICAgICAgYHByZXZpb3VzIHZhbHVlICgke3RoaXMuZHR5cGV9KSBtdXN0IG1hdGNoYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF1dGlsLmFycmF5c0VxdWFsKG5ld1ZhbHVlLnNoYXBlLCB0aGlzLnNoYXBlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzaGFwZSBvZiB0aGUgbmV3IHZhbHVlICgke25ld1ZhbHVlLnNoYXBlfSkgYW5kIGAgK1xuICAgICAgICAgICAgICAgIGBwcmV2aW91cyB2YWx1ZSAoJHt0aGlzLnNoYXBlfSkgbXVzdCBtYXRjaGApO1xuICAgICAgICB9XG4gICAgICAgIHRyYWNrZXJGbigpLmRpc3Bvc2VUZW5zb3IodGhpcyk7XG4gICAgICAgIHRoaXMuZGF0YUlkID0gbmV3VmFsdWUuZGF0YUlkO1xuICAgICAgICB0cmFja2VyRm4oKS5pbmNSZWYodGhpcywgbnVsbCAvKiBiYWNrZW5kICovKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdHJhY2tlckZuKCkuZGlzcG9zZVZhcmlhYmxlKHRoaXMpO1xuICAgICAgICB0aGlzLmlzRGlzcG9zZWRJbnRlcm5hbCA9IHRydWU7XG4gICAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZhcmlhYmxlLCBTeW1ib2wuaGFzSW5zdGFuY2UsIHtcbiAgICB2YWx1ZTogKGluc3RhbmNlKSA9PiB7XG4gICAgICAgIHJldHVybiBpbnN0YW5jZSBpbnN0YW5jZW9mIFRlbnNvciAmJiBpbnN0YW5jZS5hc3NpZ24gIT0gbnVsbCAmJlxuICAgICAgICAgICAgaW5zdGFuY2UuYXNzaWduIGluc3RhbmNlb2YgRnVuY3Rpb247XG4gICAgfVxufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10ZW5zb3IuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29tcHV0ZVN0cmlkZXMsIGlzU3RyaW5nLCByaWdodFBhZCwgc2l6ZUZyb21TaGFwZSB9IGZyb20gJy4vdXRpbCc7XG4vLyBNYXhpbXVtIG51bWJlciBvZiB2YWx1ZXMgYmVmb3JlIHdlIGRlY2lkZSB0byBzaG93IGVsbGlwc2lzLlxuY29uc3QgRk9STUFUX0xJTUlUX05VTV9WQUxTID0gMjA7XG4vLyBOdW1iZXIgb2YgZmlyc3QgYW5kIGxhc3QgdmFsdWVzIHRvIHNob3cgd2hlbiBkaXNwbGF5aW5nIGEsIGIsLi4uLHksIHouXG5jb25zdCBGT1JNQVRfTlVNX0ZJUlNUX0xBU1RfVkFMUyA9IDM7XG4vLyBOdW1iZXIgb2Ygc2lnbmlmaWNhbnQgZGlnaXRzIHRvIHNob3cuXG5jb25zdCBGT1JNQVRfTlVNX1NJR19ESUdJVFMgPSA3O1xuZXhwb3J0IGZ1bmN0aW9uIHRlbnNvclRvU3RyaW5nKHZhbHMsIHNoYXBlLCBkdHlwZSwgdmVyYm9zZSkge1xuICAgIGNvbnN0IHN0cmlkZXMgPSBjb21wdXRlU3RyaWRlcyhzaGFwZSk7XG4gICAgY29uc3QgcGFkUGVyQ29sID0gY29tcHV0ZU1heFNpemVQZXJDb2x1bW4odmFscywgc2hhcGUsIGR0eXBlLCBzdHJpZGVzKTtcbiAgICBjb25zdCByYW5rID0gc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IHZhbHNMaW5lcyA9IHN1YlRlbnNvclRvU3RyaW5nKHZhbHMsIHNoYXBlLCBkdHlwZSwgc3RyaWRlcywgcGFkUGVyQ29sKTtcbiAgICBjb25zdCBsaW5lcyA9IFsnVGVuc29yJ107XG4gICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgbGluZXMucHVzaChgICBkdHlwZTogJHtkdHlwZX1gKTtcbiAgICAgICAgbGluZXMucHVzaChgICByYW5rOiAke3Jhbmt9YCk7XG4gICAgICAgIGxpbmVzLnB1c2goYCAgc2hhcGU6IFske3NoYXBlfV1gKTtcbiAgICAgICAgbGluZXMucHVzaChgICB2YWx1ZXM6YCk7XG4gICAgfVxuICAgIGxpbmVzLnB1c2godmFsc0xpbmVzLm1hcChsID0+ICcgICAgJyArIGwpLmpvaW4oJ1xcbicpKTtcbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG59XG5mdW5jdGlvbiBjb21wdXRlTWF4U2l6ZVBlckNvbHVtbih2YWxzLCBzaGFwZSwgZHR5cGUsIHN0cmlkZXMpIHtcbiAgICBjb25zdCBuID0gc2l6ZUZyb21TaGFwZShzaGFwZSk7XG4gICAgY29uc3QgbnVtQ29scyA9IHN0cmlkZXNbc3RyaWRlcy5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBwYWRQZXJDb2wgPSBuZXcgQXJyYXkobnVtQ29scykuZmlsbCgwKTtcbiAgICBjb25zdCByYW5rID0gc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IHZhbHVlc09yVHVwbGVzID0gZHR5cGUgPT09ICdjb21wbGV4NjQnID8gY3JlYXRlQ29tcGxleFR1cGxlcyh2YWxzKSA6IHZhbHM7XG4gICAgaWYgKHJhbmsgPiAxKSB7XG4gICAgICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IG4gLyBudW1Db2xzOyByb3crKykge1xuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gcm93ICogbnVtQ29scztcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbnVtQ29sczsgaisrKSB7XG4gICAgICAgICAgICAgICAgcGFkUGVyQ29sW2pdID0gTWF0aC5tYXgocGFkUGVyQ29sW2pdLCB2YWxUb1N0cmluZyh2YWx1ZXNPclR1cGxlc1tvZmZzZXQgKyBqXSwgMCwgZHR5cGUpLmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhZFBlckNvbDtcbn1cbmZ1bmN0aW9uIHZhbFRvU3RyaW5nKHZhbCwgcGFkLCBkdHlwZSkge1xuICAgIGxldCB2YWxTdHI7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICB2YWxTdHIgPSBgJHtwYXJzZUZsb2F0KHZhbFswXS50b0ZpeGVkKEZPUk1BVF9OVU1fU0lHX0RJR0lUUykpfSArIGAgK1xuICAgICAgICAgICAgYCR7cGFyc2VGbG9hdCh2YWxbMV0udG9GaXhlZChGT1JNQVRfTlVNX1NJR19ESUdJVFMpKX1qYDtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNTdHJpbmcodmFsKSkge1xuICAgICAgICB2YWxTdHIgPSBgJyR7dmFsfSdgO1xuICAgIH1cbiAgICBlbHNlIGlmIChkdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgICAgIHZhbFN0ciA9IGJvb2xOdW1Ub1N0cmluZyh2YWwpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdmFsU3RyID0gcGFyc2VGbG9hdCh2YWwudG9GaXhlZChGT1JNQVRfTlVNX1NJR19ESUdJVFMpKS50b1N0cmluZygpO1xuICAgIH1cbiAgICByZXR1cm4gcmlnaHRQYWQodmFsU3RyLCBwYWQpO1xufVxuZnVuY3Rpb24gYm9vbE51bVRvU3RyaW5nKHYpIHtcbiAgICByZXR1cm4gdiA9PT0gMCA/ICdmYWxzZScgOiAndHJ1ZSc7XG59XG5mdW5jdGlvbiBzdWJUZW5zb3JUb1N0cmluZyh2YWxzLCBzaGFwZSwgZHR5cGUsIHN0cmlkZXMsIHBhZFBlckNvbCwgaXNMYXN0ID0gdHJ1ZSkge1xuICAgIGNvbnN0IHN0b3JhZ2VQZXJFbGVtZW50ID0gZHR5cGUgPT09ICdjb21wbGV4NjQnID8gMiA6IDE7XG4gICAgY29uc3Qgc2l6ZSA9IHNoYXBlWzBdO1xuICAgIGNvbnN0IHJhbmsgPSBzaGFwZS5sZW5ndGg7XG4gICAgaWYgKHJhbmsgPT09IDApIHtcbiAgICAgICAgaWYgKGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICAgICAgY29uc3QgY29tcGxleFR1cGxlID0gY3JlYXRlQ29tcGxleFR1cGxlcyh2YWxzKTtcbiAgICAgICAgICAgIHJldHVybiBbdmFsVG9TdHJpbmcoY29tcGxleFR1cGxlWzBdLCAwLCBkdHlwZSldO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgICAgICAgICByZXR1cm4gW2Jvb2xOdW1Ub1N0cmluZyh2YWxzWzBdKV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFt2YWxzWzBdLnRvU3RyaW5nKCldO1xuICAgIH1cbiAgICBpZiAocmFuayA9PT0gMSkge1xuICAgICAgICBpZiAoc2l6ZSA+IEZPUk1BVF9MSU1JVF9OVU1fVkFMUykge1xuICAgICAgICAgICAgY29uc3QgZmlyc3RWYWxzU2l6ZSA9IEZPUk1BVF9OVU1fRklSU1RfTEFTVF9WQUxTICogc3RvcmFnZVBlckVsZW1lbnQ7XG4gICAgICAgICAgICBsZXQgZmlyc3RWYWxzID0gQXJyYXkuZnJvbSh2YWxzLnNsaWNlKDAsIGZpcnN0VmFsc1NpemUpKTtcbiAgICAgICAgICAgIGxldCBsYXN0VmFscyA9IEFycmF5LmZyb20odmFscy5zbGljZSgoc2l6ZSAtIEZPUk1BVF9OVU1fRklSU1RfTEFTVF9WQUxTKSAqIHN0b3JhZ2VQZXJFbGVtZW50LCBzaXplICogc3RvcmFnZVBlckVsZW1lbnQpKTtcbiAgICAgICAgICAgIGlmIChkdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgICAgICAgICBmaXJzdFZhbHMgPSBjcmVhdGVDb21wbGV4VHVwbGVzKGZpcnN0VmFscyk7XG4gICAgICAgICAgICAgICAgbGFzdFZhbHMgPSBjcmVhdGVDb21wbGV4VHVwbGVzKGxhc3RWYWxzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgJ1snICtcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RWYWxzLm1hcCgoeCwgaSkgPT4gdmFsVG9TdHJpbmcoeCwgcGFkUGVyQ29sW2ldLCBkdHlwZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAuam9pbignLCAnKSArXG4gICAgICAgICAgICAgICAgICAgICcsIC4uLiwgJyArXG4gICAgICAgICAgICAgICAgICAgIGxhc3RWYWxzXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKCh4LCBpKSA9PiB2YWxUb1N0cmluZyh4LCBwYWRQZXJDb2xbc2l6ZSAtIEZPUk1BVF9OVU1fRklSU1RfTEFTVF9WQUxTICsgaV0sIGR0eXBlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKCcsICcpICtcbiAgICAgICAgICAgICAgICAgICAgJ10nXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRpc3BsYXlWYWxzID0gZHR5cGUgPT09ICdjb21wbGV4NjQnID8gY3JlYXRlQ29tcGxleFR1cGxlcyh2YWxzKSA6XG4gICAgICAgICAgICBBcnJheS5mcm9tKHZhbHMpO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ1snICtcbiAgICAgICAgICAgICAgICBkaXNwbGF5VmFscy5tYXAoKHgsIGkpID0+IHZhbFRvU3RyaW5nKHgsIHBhZFBlckNvbFtpXSwgZHR5cGUpKVxuICAgICAgICAgICAgICAgICAgICAuam9pbignLCAnKSArXG4gICAgICAgICAgICAgICAgJ10nXG4gICAgICAgIF07XG4gICAgfVxuICAgIC8vIFRoZSBhcnJheSBpcyByYW5rIDIgb3IgbW9yZS5cbiAgICBjb25zdCBzdWJzaGFwZSA9IHNoYXBlLnNsaWNlKDEpO1xuICAgIGNvbnN0IHN1YnN0cmlkZXMgPSBzdHJpZGVzLnNsaWNlKDEpO1xuICAgIGNvbnN0IHN0cmlkZSA9IHN0cmlkZXNbMF0gKiBzdG9yYWdlUGVyRWxlbWVudDtcbiAgICBjb25zdCBsaW5lcyA9IFtdO1xuICAgIGlmIChzaXplID4gRk9STUFUX0xJTUlUX05VTV9WQUxTKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgRk9STUFUX05VTV9GSVJTVF9MQVNUX1ZBTFM7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBpICogc3RyaWRlO1xuICAgICAgICAgICAgY29uc3QgZW5kID0gc3RhcnQgKyBzdHJpZGU7XG4gICAgICAgICAgICBsaW5lcy5wdXNoKC4uLnN1YlRlbnNvclRvU3RyaW5nKHZhbHMuc2xpY2Uoc3RhcnQsIGVuZCksIHN1YnNoYXBlLCBkdHlwZSwgc3Vic3RyaWRlcywgcGFkUGVyQ29sLCBmYWxzZSAvKiBpc0xhc3QgKi8pKTtcbiAgICAgICAgfVxuICAgICAgICBsaW5lcy5wdXNoKCcuLi4nKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHNpemUgLSBGT1JNQVRfTlVNX0ZJUlNUX0xBU1RfVkFMUzsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBpICogc3RyaWRlO1xuICAgICAgICAgICAgY29uc3QgZW5kID0gc3RhcnQgKyBzdHJpZGU7XG4gICAgICAgICAgICBsaW5lcy5wdXNoKC4uLnN1YlRlbnNvclRvU3RyaW5nKHZhbHMuc2xpY2Uoc3RhcnQsIGVuZCksIHN1YnNoYXBlLCBkdHlwZSwgc3Vic3RyaWRlcywgcGFkUGVyQ29sLCBpID09PSBzaXplIC0gMSAvKiBpc0xhc3QgKi8pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gaSAqIHN0cmlkZTtcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgc3RyaWRlO1xuICAgICAgICAgICAgbGluZXMucHVzaCguLi5zdWJUZW5zb3JUb1N0cmluZyh2YWxzLnNsaWNlKHN0YXJ0LCBlbmQpLCBzdWJzaGFwZSwgZHR5cGUsIHN1YnN0cmlkZXMsIHBhZFBlckNvbCwgaSA9PT0gc2l6ZSAtIDEgLyogaXNMYXN0ICovKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgc2VwID0gcmFuayA9PT0gMiA/ICcsJyA6ICcnO1xuICAgIGxpbmVzWzBdID0gJ1snICsgbGluZXNbMF0gKyBzZXA7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBsaW5lcy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgbGluZXNbaV0gPSAnICcgKyBsaW5lc1tpXSArIHNlcDtcbiAgICB9XG4gICAgbGV0IG5ld0xpbmVTZXAgPSAnLFxcbic7XG4gICAgZm9yIChsZXQgaSA9IDI7IGkgPCByYW5rOyBpKyspIHtcbiAgICAgICAgbmV3TGluZVNlcCArPSAnXFxuJztcbiAgICB9XG4gICAgbGluZXNbbGluZXMubGVuZ3RoIC0gMV0gPVxuICAgICAgICAnICcgKyBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSArICddJyArIChpc0xhc3QgPyAnJyA6IG5ld0xpbmVTZXApO1xuICAgIHJldHVybiBsaW5lcztcbn1cbmZ1bmN0aW9uIGNyZWF0ZUNvbXBsZXhUdXBsZXModmFscykge1xuICAgIGNvbnN0IGNvbXBsZXhUdXBsZXMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgY29tcGxleFR1cGxlcy5wdXNoKFt2YWxzW2ldLCB2YWxzW2kgKyAxXV0pO1xuICAgIH1cbiAgICByZXR1cm4gY29tcGxleFR1cGxlcztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRlbnNvcl9mb3JtYXQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgVGVuc29yIH0gZnJvbSAnLi90ZW5zb3InO1xuaW1wb3J0IHsgdXBjYXN0VHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBtYWtlVHlwZXNNYXRjaChhLCBiKSB7XG4gICAgaWYgKGEuZHR5cGUgPT09IGIuZHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIFthLCBiXTtcbiAgICB9XG4gICAgY29uc3QgZHR5cGUgPSB1cGNhc3RUeXBlKGEuZHR5cGUsIGIuZHR5cGUpO1xuICAgIHJldHVybiBbYS5jYXN0KGR0eXBlKSwgYi5jYXN0KGR0eXBlKV07XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VHlwZXNNYXRjaChhLCBiKSB7XG4gICAgYXNzZXJ0KGEuZHR5cGUgPT09IGIuZHR5cGUsICgpID0+IGBUaGUgZHR5cGVzIG9mIHRoZSBmaXJzdCgke2EuZHR5cGV9KSBhbmRgICtcbiAgICAgICAgYCBzZWNvbmQoJHtiLmR0eXBlfSkgaW5wdXQgbXVzdCBtYXRjaGApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVGVuc29ySW5MaXN0KHRlbnNvciwgdGVuc29yTGlzdCkge1xuICAgIHJldHVybiB0ZW5zb3JMaXN0LnNvbWUoeCA9PiB4LmlkID09PSB0ZW5zb3IuaWQpO1xufVxuLyoqXG4gKiBFeHRyYWN0cyBhbnkgYFRlbnNvcmBzIGZvdW5kIHdpdGhpbiB0aGUgcHJvdmlkZWQgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBjb250YWluZXIgYW4gb2JqZWN0IHRoYXQgbWF5IGJlIGEgYFRlbnNvcmAgb3IgbWF5IGRpcmVjdGx5IGNvbnRhaW5cbiAqICAgYFRlbnNvcmBzLCBzdWNoIGFzIGEgYFRlbnNvcltdYCBvciBge2tleTogVGVuc29yLCAuLi59YC4gSW4gZ2VuZXJhbCBpdFxuICogICBpcyBzYWZlIHRvIHBhc3MgYW55IG9iamVjdCBoZXJlLCBleGNlcHQgdGhhdCBgUHJvbWlzZWBzIGFyZSBub3RcbiAqICAgc3VwcG9ydGVkLlxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgYFRlbnNvcnNgIGZvdW5kIHdpdGhpbiB0aGUgcGFzc2VkIG9iamVjdC4gSWYgdGhlXG4gKiAgIGFyZ3VtZW50IGlzIHNpbXBseSBhIGBUZW5zb3InLCBhIGxpc3QgY29udGFpbmluZyB0aGF0IGBUZW5zb3JgIGlzXG4gKiAgIHJldHVybmVkLiBJZiB0aGUgb2JqZWN0IGlzIG5vdCBhIGBUZW5zb3JgIG9yIGRvZXMgbm90XG4gKiAgIGNvbnRhaW4gYFRlbnNvcnNgLCBhbiBlbXB0eSBsaXN0IGlzIHJldHVybmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGVuc29yc0luQ29udGFpbmVyKHJlc3VsdCkge1xuICAgIGNvbnN0IGxpc3QgPSBbXTtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldCgpO1xuICAgIHdhbGtUZW5zb3JDb250YWluZXIocmVzdWx0LCBsaXN0LCBzZWVuKTtcbiAgICByZXR1cm4gbGlzdDtcbn1cbmZ1bmN0aW9uIHdhbGtUZW5zb3JDb250YWluZXIoY29udGFpbmVyLCBsaXN0LCBzZWVuKSB7XG4gICAgaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFRlbnNvcikge1xuICAgICAgICBsaXN0LnB1c2goY29udGFpbmVyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWlzSXRlcmFibGUoY29udGFpbmVyKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEl0ZXJhdGlvbiBvdmVyIGtleXMgd29ya3MgYWxzbyBmb3IgYXJyYXlzLlxuICAgIGNvbnN0IGl0ZXJhYmxlID0gY29udGFpbmVyO1xuICAgIGZvciAoY29uc3QgayBpbiBpdGVyYWJsZSkge1xuICAgICAgICBjb25zdCB2YWwgPSBpdGVyYWJsZVtrXTtcbiAgICAgICAgaWYgKCFzZWVuLmhhcyh2YWwpKSB7XG4gICAgICAgICAgICBzZWVuLmFkZCh2YWwpO1xuICAgICAgICAgICAgd2Fsa1RlbnNvckNvbnRhaW5lcih2YWwsIGxpc3QsIHNlZW4pO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuZnVuY3Rpb24gaXNJdGVyYWJsZShvYmopIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShvYmopIHx8IHR5cGVvZiBvYmogPT09ICdvYmplY3QnO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGVuc29yX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi9lbmdpbmUnO1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBUZW5zb3IgfSBmcm9tICcuL3RlbnNvcic7XG5pbXBvcnQgeyBhc3NlcnQsIGZsYXR0ZW4sIGluZmVyRHR5cGUsIGlzVHlwZWRBcnJheSwgdG9UeXBlZEFycmF5IH0gZnJvbSAnLi91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBpbmZlclNoYXBlKHZhbCwgZHR5cGUpIHtcbiAgICBsZXQgZmlyc3RFbGVtID0gdmFsO1xuICAgIGlmIChpc1R5cGVkQXJyYXkodmFsKSkge1xuICAgICAgICByZXR1cm4gZHR5cGUgPT09ICdzdHJpbmcnID8gW10gOiBbdmFsLmxlbmd0aF07XG4gICAgfVxuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgIHJldHVybiBbXTsgLy8gU2NhbGFyLlxuICAgIH1cbiAgICBjb25zdCBzaGFwZSA9IFtdO1xuICAgIHdoaWxlIChBcnJheS5pc0FycmF5KGZpcnN0RWxlbSkgfHxcbiAgICAgICAgaXNUeXBlZEFycmF5KGZpcnN0RWxlbSkgJiYgZHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHNoYXBlLnB1c2goZmlyc3RFbGVtLmxlbmd0aCk7XG4gICAgICAgIGZpcnN0RWxlbSA9IGZpcnN0RWxlbVswXTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSAmJlxuICAgICAgICBlbnYoKS5nZXRCb29sKCdURU5TT1JMSUtFX0NIRUNLX1NIQVBFX0NPTlNJU1RFTkNZJykpIHtcbiAgICAgICAgZGVlcEFzc2VydFNoYXBlQ29uc2lzdGVuY3kodmFsLCBzaGFwZSwgW10pO1xuICAgIH1cbiAgICByZXR1cm4gc2hhcGU7XG59XG5mdW5jdGlvbiBkZWVwQXNzZXJ0U2hhcGVDb25zaXN0ZW5jeSh2YWwsIHNoYXBlLCBpbmRpY2VzKSB7XG4gICAgaW5kaWNlcyA9IGluZGljZXMgfHwgW107XG4gICAgaWYgKCEoQXJyYXkuaXNBcnJheSh2YWwpKSAmJiAhaXNUeXBlZEFycmF5KHZhbCkpIHtcbiAgICAgICAgYXNzZXJ0KHNoYXBlLmxlbmd0aCA9PT0gMCwgKCkgPT4gYEVsZW1lbnQgYXJyWyR7aW5kaWNlcy5qb2luKCddWycpfV0gaXMgYSBwcmltaXRpdmUsIGAgK1xuICAgICAgICAgICAgYGJ1dCBzaG91bGQgYmUgYW4gYXJyYXkvVHlwZWRBcnJheSBvZiAke3NoYXBlWzBdfSBlbGVtZW50c2ApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGFzc2VydChzaGFwZS5sZW5ndGggPiAwLCAoKSA9PiBgRWxlbWVudCBhcnJbJHtpbmRpY2VzLmpvaW4oJ11bJyl9XSBzaG91bGQgYmUgYSBwcmltaXRpdmUsIGAgK1xuICAgICAgICBgYnV0IGlzIGFuIGFycmF5IG9mICR7dmFsLmxlbmd0aH0gZWxlbWVudHNgKTtcbiAgICBhc3NlcnQodmFsLmxlbmd0aCA9PT0gc2hhcGVbMF0sICgpID0+IGBFbGVtZW50IGFyclske2luZGljZXMuam9pbignXVsnKX1dIHNob3VsZCBoYXZlICR7c2hhcGVbMF19IGAgK1xuICAgICAgICBgZWxlbWVudHMsIGJ1dCBoYXMgJHt2YWwubGVuZ3RofSBlbGVtZW50c2ApO1xuICAgIGNvbnN0IHN1YlNoYXBlID0gc2hhcGUuc2xpY2UoMSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgZGVlcEFzc2VydFNoYXBlQ29uc2lzdGVuY3kodmFsW2ldLCBzdWJTaGFwZSwgaW5kaWNlcy5jb25jYXQoaSkpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFzc2VydER0eXBlKGV4cGVjdGVkRHR5cGUsIGFjdHVhbERUeXBlLCBhcmdOYW1lLCBmdW5jdGlvbk5hbWUpIHtcbiAgICBpZiAoZXhwZWN0ZWREdHlwZSA9PT0gJ3N0cmluZ19vcl9udW1lcmljJykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChleHBlY3RlZER0eXBlID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBkdHlwZSBjYW5ub3QgYmUgbnVsbC5gKTtcbiAgICB9XG4gICAgaWYgKGV4cGVjdGVkRHR5cGUgIT09ICdudW1lcmljJyAmJiBleHBlY3RlZER0eXBlICE9PSBhY3R1YWxEVHlwZSB8fFxuICAgICAgICBleHBlY3RlZER0eXBlID09PSAnbnVtZXJpYycgJiYgYWN0dWFsRFR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQXJndW1lbnQgJyR7YXJnTmFtZX0nIHBhc3NlZCB0byAnJHtmdW5jdGlvbk5hbWV9JyBtdXN0IGAgK1xuICAgICAgICAgICAgYGJlICR7ZXhwZWN0ZWREdHlwZX0gdGVuc29yLCBidXQgZ290ICR7YWN0dWFsRFR5cGV9IHRlbnNvcmApO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0VG9UZW5zb3IoeCwgYXJnTmFtZSwgZnVuY3Rpb25OYW1lLCBwYXJzZUFzRHR5cGUgPSAnbnVtZXJpYycpIHtcbiAgICBpZiAoeCBpbnN0YW5jZW9mIFRlbnNvcikge1xuICAgICAgICBhc3NlcnREdHlwZShwYXJzZUFzRHR5cGUsIHguZHR5cGUsIGFyZ05hbWUsIGZ1bmN0aW9uTmFtZSk7XG4gICAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgICBsZXQgaW5mZXJyZWREdHlwZSA9IGluZmVyRHR5cGUoeCk7XG4gICAgLy8gSWYgdGhlIHVzZXIgZXhwZWN0cyBhIGJvb2wvaW50L2Zsb2F0LCB1c2UgdGhhdCBpbmZvIHRvIHVwZGF0ZSB0aGVcbiAgICAvLyBpbmZlcnJlZER0eXBlIHdoZW4gaXQgaXMgbm90IGEgc3RyaW5nLlxuICAgIGlmIChpbmZlcnJlZER0eXBlICE9PSAnc3RyaW5nJyAmJlxuICAgICAgICBbJ2Jvb2wnLCAnaW50MzInLCAnZmxvYXQzMiddLmluZGV4T2YocGFyc2VBc0R0eXBlKSA+PSAwKSB7XG4gICAgICAgIGluZmVycmVkRHR5cGUgPSBwYXJzZUFzRHR5cGU7XG4gICAgfVxuICAgIGFzc2VydER0eXBlKHBhcnNlQXNEdHlwZSwgaW5mZXJyZWREdHlwZSwgYXJnTmFtZSwgZnVuY3Rpb25OYW1lKTtcbiAgICBpZiAoKHggPT0gbnVsbCkgfHxcbiAgICAgICAgKCFpc1R5cGVkQXJyYXkoeCkgJiYgIUFycmF5LmlzQXJyYXkoeCkgJiYgdHlwZW9mIHggIT09ICdudW1iZXInICYmXG4gICAgICAgICAgICB0eXBlb2YgeCAhPT0gJ2Jvb2xlYW4nICYmIHR5cGVvZiB4ICE9PSAnc3RyaW5nJykpIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IHggPT0gbnVsbCA/ICdudWxsJyA6IHguY29uc3RydWN0b3IubmFtZTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBcmd1bWVudCAnJHthcmdOYW1lfScgcGFzc2VkIHRvICcke2Z1bmN0aW9uTmFtZX0nIG11c3QgYmUgYSBgICtcbiAgICAgICAgICAgIGBUZW5zb3Igb3IgVGVuc29yTGlrZSwgYnV0IGdvdCAnJHt0eXBlfSdgKTtcbiAgICB9XG4gICAgY29uc3QgaW5mZXJyZWRTaGFwZSA9IGluZmVyU2hhcGUoeCwgaW5mZXJyZWREdHlwZSk7XG4gICAgaWYgKCFpc1R5cGVkQXJyYXkoeCkgJiYgIUFycmF5LmlzQXJyYXkoeCkpIHtcbiAgICAgICAgeCA9IFt4XTtcbiAgICB9XG4gICAgY29uc3Qgc2tpcFR5cGVkQXJyYXkgPSB0cnVlO1xuICAgIGNvbnN0IHZhbHVlcyA9IGluZmVycmVkRHR5cGUgIT09ICdzdHJpbmcnID9cbiAgICAgICAgdG9UeXBlZEFycmF5KHgsIGluZmVycmVkRHR5cGUpIDpcbiAgICAgICAgZmxhdHRlbih4LCBbXSwgc2tpcFR5cGVkQXJyYXkpO1xuICAgIHJldHVybiBFTkdJTkUubWFrZVRlbnNvcih2YWx1ZXMsIGluZmVycmVkU2hhcGUsIGluZmVycmVkRHR5cGUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUb1RlbnNvckFycmF5KGFyZywgYXJnTmFtZSwgZnVuY3Rpb25OYW1lLCBwYXJzZUFzRHR5cGUgPSAnbnVtZXJpYycpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJnKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFyZ3VtZW50ICR7YXJnTmFtZX0gcGFzc2VkIHRvICR7ZnVuY3Rpb25OYW1lfSBtdXN0IGJlIGEgYCArXG4gICAgICAgICAgICAnYFRlbnNvcltdYCBvciBgVGVuc29yTGlrZVtdYCcpO1xuICAgIH1cbiAgICBjb25zdCB0ZW5zb3JzID0gYXJnO1xuICAgIHJldHVybiB0ZW5zb3JzLm1hcCgodCwgaSkgPT4gY29udmVydFRvVGVuc29yKHQsIGAke2FyZ05hbWV9WyR7aX1dYCwgZnVuY3Rpb25OYW1lLCBwYXJzZUFzRHR5cGUpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRlbnNvcl91dGlsX2Vudi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuL2VuZ2luZSc7XG5pbXBvcnQgeyBpbmZlclNoYXBlIH0gZnJvbSAnLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXJyYXlzRXF1YWwsIGVuY29kZVN0cmluZywgZmxhdHRlbiwgaXNTdHJpbmcsIGlzVHlwZWRBcnJheSB9IGZyb20gJy4vdXRpbCc7XG5jb25zdCBURVNUX0VQU0lMT05fRkxPQVQzMiA9IDFlLTM7XG5leHBvcnQgY29uc3QgVEVTVF9FUFNJTE9OX0ZMT0FUMTYgPSAxZS0xO1xuZXhwb3J0IGZ1bmN0aW9uIGV4cGVjdEFycmF5c0Nsb3NlKGFjdHVhbCwgZXhwZWN0ZWQsIGVwc2lsb24pIHtcbiAgICBpZiAoZXBzaWxvbiA9PSBudWxsKSB7XG4gICAgICAgIGVwc2lsb24gPSB0ZXN0RXBzaWxvbigpO1xuICAgIH1cbiAgICByZXR1cm4gZXhwZWN0QXJyYXlzUHJlZGljYXRlKGFjdHVhbCwgZXhwZWN0ZWQsIChhLCBiKSA9PiBhcmVDbG9zZShhLCBiLCBlcHNpbG9uKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gdGVzdEVwc2lsb24oKSB7XG4gICAgcmV0dXJuIEVOR0lORS5iYWNrZW5kLmZsb2F0UHJlY2lzaW9uKCkgPT09IDMyID8gVEVTVF9FUFNJTE9OX0ZMT0FUMzIgOlxuICAgICAgICBURVNUX0VQU0lMT05fRkxPQVQxNjtcbn1cbmZ1bmN0aW9uIGV4cGVjdEFycmF5c1ByZWRpY2F0ZShhY3R1YWwsIGV4cGVjdGVkLCBwcmVkaWNhdGUpIHtcbiAgICBsZXQgY2hlY2tDbGFzc1R5cGUgPSB0cnVlO1xuICAgIGlmIChpc1R5cGVkQXJyYXkoYWN0dWFsKSB8fCBpc1R5cGVkQXJyYXkoZXhwZWN0ZWQpKSB7XG4gICAgICAgIGNoZWNrQ2xhc3NUeXBlID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChpc1R5cGVkQXJyYXkoYWN0dWFsKSAmJiBpc1R5cGVkQXJyYXkoZXhwZWN0ZWQpKSB7XG4gICAgICAgIGNoZWNrQ2xhc3NUeXBlID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGNoZWNrQ2xhc3NUeXBlKSB7XG4gICAgICAgIGNvbnN0IGFUeXBlID0gYWN0dWFsLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgICAgIGNvbnN0IGJUeXBlID0gZXhwZWN0ZWQuY29uc3RydWN0b3IubmFtZTtcbiAgICAgICAgaWYgKGFUeXBlICE9PSBiVHlwZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBcnJheXMgYXJlIG9mIGRpZmZlcmVudCB0eXBlLiBBY3R1YWw6ICR7YVR5cGV9LiBgICtcbiAgICAgICAgICAgICAgICBgRXhwZWN0ZWQ6ICR7YlR5cGV9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYWN0dWFsKSAmJiBBcnJheS5pc0FycmF5KGV4cGVjdGVkKSkge1xuICAgICAgICBjb25zdCBhY3R1YWxTaGFwZSA9IGluZmVyU2hhcGUoYWN0dWFsKTtcbiAgICAgICAgY29uc3QgZXhwZWN0ZWRTaGFwZSA9IGluZmVyU2hhcGUoZXhwZWN0ZWQpO1xuICAgICAgICBpZiAoIWFycmF5c0VxdWFsKGFjdHVhbFNoYXBlLCBleHBlY3RlZFNoYXBlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBcnJheXMgaGF2ZSBkaWZmZXJlbnQgc2hhcGVzLiBgICtcbiAgICAgICAgICAgICAgICBgQWN0dWFsOiBbJHthY3R1YWxTaGFwZX1dLiBFeHBlY3RlZDogWyR7ZXhwZWN0ZWRTaGFwZX1dYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgYWN0dWFsRmxhdCA9IGlzVHlwZWRBcnJheShhY3R1YWwpID8gYWN0dWFsIDogZmxhdHRlbihhY3R1YWwpO1xuICAgIGNvbnN0IGV4cGVjdGVkRmxhdCA9IGlzVHlwZWRBcnJheShleHBlY3RlZCkgP1xuICAgICAgICBleHBlY3RlZCA6XG4gICAgICAgIGZsYXR0ZW4oZXhwZWN0ZWQpO1xuICAgIGlmIChhY3R1YWxGbGF0Lmxlbmd0aCAhPT0gZXhwZWN0ZWRGbGF0Lmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFycmF5cyBoYXZlIGRpZmZlcmVudCBsZW5ndGhzIGFjdHVhbDogJHthY3R1YWxGbGF0Lmxlbmd0aH0gdnMgYCArXG4gICAgICAgICAgICBgZXhwZWN0ZWQ6ICR7ZXhwZWN0ZWRGbGF0Lmxlbmd0aH0uXFxuYCArXG4gICAgICAgICAgICBgQWN0dWFsOiAgICR7YWN0dWFsRmxhdH0uXFxuYCArXG4gICAgICAgICAgICBgRXhwZWN0ZWQ6ICR7ZXhwZWN0ZWRGbGF0fS5gKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHBlY3RlZEZsYXQubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3QgYSA9IGFjdHVhbEZsYXRbaV07XG4gICAgICAgIGNvbnN0IGUgPSBleHBlY3RlZEZsYXRbaV07XG4gICAgICAgIGlmICghcHJlZGljYXRlKGEsIGUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFycmF5cyBkaWZmZXI6IGFjdHVhbFske2l9XSA9ICR7YX0sIGV4cGVjdGVkWyR7aX1dID0gJHtlfS5cXG5gICtcbiAgICAgICAgICAgICAgICBgQWN0dWFsOiAgICR7YWN0dWFsRmxhdH0uXFxuYCArXG4gICAgICAgICAgICAgICAgYEV4cGVjdGVkOiAke2V4cGVjdGVkRmxhdH0uYCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gZXhwZWN0UHJvbWlzZVRvRmFpbChmbiwgZG9uZSkge1xuICAgIGZuKCkudGhlbigoKSA9PiBkb25lLmZhaWwoKSwgKCkgPT4gZG9uZSgpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3RBcnJheXNFcXVhbChhY3R1YWwsIGV4cGVjdGVkKSB7XG4gICAgY29uc3QgZXhwID0gdHlwZW9mIGV4cGVjdGVkID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgZXhwZWN0ZWQgPT09ICdudW1iZXInIHx8XG4gICAgICAgIHR5cGVvZiBleHBlY3RlZCA9PT0gJ2Jvb2xlYW4nID9cbiAgICAgICAgW2V4cGVjdGVkXSA6XG4gICAgICAgIGV4cGVjdGVkO1xuICAgIGlmIChpc1N0cmluZyhhY3R1YWwpIHx8IGlzU3RyaW5nKGFjdHVhbFswXSkgfHxcbiAgICAgICAgaXNTdHJpbmcoZXhwZWN0ZWQpIHx8IGlzU3RyaW5nKGV4cGVjdGVkWzBdKSkge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHRyaXBsZS1lcXVhbHNcbiAgICAgICAgcmV0dXJuIGV4cGVjdEFycmF5c1ByZWRpY2F0ZShhY3R1YWwsIGV4cCwgKGEsIGIpID0+IGEgPT0gYik7XG4gICAgfVxuICAgIHJldHVybiBleHBlY3RBcnJheXNQcmVkaWNhdGUoYWN0dWFsLCBleHBlY3RlZCwgKGEsIGIpID0+IGFyZUNsb3NlKGEsIGIsIDApKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3ROdW1iZXJzQ2xvc2UoYSwgZSwgZXBzaWxvbikge1xuICAgIGlmIChlcHNpbG9uID09IG51bGwpIHtcbiAgICAgICAgZXBzaWxvbiA9IHRlc3RFcHNpbG9uKCk7XG4gICAgfVxuICAgIGlmICghYXJlQ2xvc2UoYSwgZSwgZXBzaWxvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOdW1iZXJzIGRpZmZlcjogYWN0dWFsID09PSAke2F9LCBleHBlY3RlZCA9PT0gJHtlfWApO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFyZUNsb3NlKGEsIGUsIGVwc2lsb24pIHtcbiAgICBpZiAoIWlzRmluaXRlKGEpICYmICFpc0Zpbml0ZShlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGlzTmFOKGEpIHx8IGlzTmFOKGUpIHx8IE1hdGguYWJzKGEgLSBlKSA+IGVwc2lsb24pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3RWYWx1ZXNJblJhbmdlKGFjdHVhbCwgbG93LCBoaWdoKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhY3R1YWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGFjdHVhbFtpXSA8IGxvdyB8fCBhY3R1YWxbaV0gPiBoaWdoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFZhbHVlIG91dCBvZiByYW5nZToke2FjdHVhbFtpXX0gbG93OiAke2xvd30sIGhpZ2g6ICR7aGlnaH1gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3RBcnJheUJ1ZmZlcnNFcXVhbChhY3R1YWwsIGV4cGVjdGVkKSB7XG4gICAgLy8gU2FmYXJpICYgSmFzbWluZSBkb24ndCBsaWtlIGNvbXBhcmluZyBBcnJheUJ1ZmZlcnMgZGlyZWN0bHkuIFdyYXBwaW5nIGluXG4gICAgLy8gYSBGbG9hdDMyQXJyYXkgc29sdmVzIHRoaXMgaXNzdWUuXG4gICAgZXhwZWN0KG5ldyBGbG9hdDMyQXJyYXkoYWN0dWFsKSkudG9FcXVhbChuZXcgRmxvYXQzMkFycmF5KGV4cGVjdGVkKSk7XG59XG4vKiogRW5jb2RlcyBzdHJpbmdzIGludG8gdXRmLTggYnl0ZXMuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlU3RyaW5ncyhhKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHZhbCA9IGFbaV07XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgICAgIGVuY29kZVN0cmluZ3ModmFsKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGFbaV0gPSBlbmNvZGVTdHJpbmcodmFsKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRlc3RfdXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vLyBTbyB0eXBpbmdzIGNhbiBwcm9wYWdhdGUuXG5pbXBvcnQgeyBBZGFkZWx0YU9wdGltaXplciB9IGZyb20gJy4vb3B0aW1pemVycy9hZGFkZWx0YV9vcHRpbWl6ZXInO1xuaW1wb3J0IHsgQWRhZ3JhZE9wdGltaXplciB9IGZyb20gJy4vb3B0aW1pemVycy9hZGFncmFkX29wdGltaXplcic7XG5pbXBvcnQgeyBBZGFtT3B0aW1pemVyIH0gZnJvbSAnLi9vcHRpbWl6ZXJzL2FkYW1fb3B0aW1pemVyJztcbmltcG9ydCB7IEFkYW1heE9wdGltaXplciB9IGZyb20gJy4vb3B0aW1pemVycy9hZGFtYXhfb3B0aW1pemVyJztcbmltcG9ydCB7IE1vbWVudHVtT3B0aW1pemVyIH0gZnJvbSAnLi9vcHRpbWl6ZXJzL21vbWVudHVtX29wdGltaXplcic7XG5pbXBvcnQgeyBPcHRpbWl6ZXJDb25zdHJ1Y3RvcnMgfSBmcm9tICcuL29wdGltaXplcnMvb3B0aW1pemVyX2NvbnN0cnVjdG9ycyc7XG5pbXBvcnQgeyBSTVNQcm9wT3B0aW1pemVyIH0gZnJvbSAnLi9vcHRpbWl6ZXJzL3Jtc3Byb3Bfb3B0aW1pemVyJztcbmltcG9ydCB7IFNHRE9wdGltaXplciB9IGZyb20gJy4vb3B0aW1pemVycy9zZ2Rfb3B0aW1pemVyJztcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bnVzZWQtZXhwcmVzc2lvblxuW01vbWVudHVtT3B0aW1pemVyLCBTR0RPcHRpbWl6ZXIsIEFkYWRlbHRhT3B0aW1pemVyLCBBZGFncmFkT3B0aW1pemVyLFxuICAgIFJNU1Byb3BPcHRpbWl6ZXIsIEFkYW1heE9wdGltaXplciwgQWRhbU9wdGltaXplcl07XG5leHBvcnQgY29uc3QgdHJhaW4gPSB7XG4gICAgc2dkOiBPcHRpbWl6ZXJDb25zdHJ1Y3RvcnMuc2dkLFxuICAgIG1vbWVudHVtOiBPcHRpbWl6ZXJDb25zdHJ1Y3RvcnMubW9tZW50dW0sXG4gICAgYWRhZGVsdGE6IE9wdGltaXplckNvbnN0cnVjdG9ycy5hZGFkZWx0YSxcbiAgICBhZGFncmFkOiBPcHRpbWl6ZXJDb25zdHJ1Y3RvcnMuYWRhZ3JhZCxcbiAgICBybXNwcm9wOiBPcHRpbWl6ZXJDb25zdHJ1Y3RvcnMucm1zcHJvcCxcbiAgICBhZGFtYXg6IE9wdGltaXplckNvbnN0cnVjdG9ycy5hZGFtYXgsXG4gICAgYWRhbTogT3B0aW1pemVyQ29uc3RydWN0b3JzLmFkYW1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD10cmFpbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5leHBvcnQgdmFyIFJhbms7XG4oZnVuY3Rpb24gKFJhbmspIHtcbiAgICBSYW5rW1wiUjBcIl0gPSBcIlIwXCI7XG4gICAgUmFua1tcIlIxXCJdID0gXCJSMVwiO1xuICAgIFJhbmtbXCJSMlwiXSA9IFwiUjJcIjtcbiAgICBSYW5rW1wiUjNcIl0gPSBcIlIzXCI7XG4gICAgUmFua1tcIlI0XCJdID0gXCJSNFwiO1xuICAgIFJhbmtbXCJSNVwiXSA9IFwiUjVcIjtcbiAgICBSYW5rW1wiUjZcIl0gPSBcIlI2XCI7XG59KShSYW5rIHx8IChSYW5rID0ge30pKTtcbi8vIExvb2tzIGZvciB1cGNhc3RpbmcgdHlwZXMuIFVzZWQsIGZvciBleGFtcGxlLCBpbiBvcGVyYXRpb25zIHdpdGggbWl4ZWQgZHR5cGVcbi8vIGlucHV0cy5cbnZhciBVcGNhc3RJbnQzMkFuZE1hcDtcbihmdW5jdGlvbiAoVXBjYXN0SW50MzJBbmRNYXApIHtcbiAgICBVcGNhc3RJbnQzMkFuZE1hcFtcImZsb2F0MzJcIl0gPSBcImZsb2F0MzJcIjtcbiAgICBVcGNhc3RJbnQzMkFuZE1hcFtcImludDMyXCJdID0gXCJpbnQzMlwiO1xuICAgIFVwY2FzdEludDMyQW5kTWFwW1wiYm9vbFwiXSA9IFwiaW50MzJcIjtcbiAgICBVcGNhc3RJbnQzMkFuZE1hcFtcImNvbXBsZXg2NFwiXSA9IFwiY29tcGxleDY0XCI7XG59KShVcGNhc3RJbnQzMkFuZE1hcCB8fCAoVXBjYXN0SW50MzJBbmRNYXAgPSB7fSkpO1xudmFyIFVwY2FzdEJvb2xBbmRNYXA7XG4oZnVuY3Rpb24gKFVwY2FzdEJvb2xBbmRNYXApIHtcbiAgICBVcGNhc3RCb29sQW5kTWFwW1wiZmxvYXQzMlwiXSA9IFwiZmxvYXQzMlwiO1xuICAgIFVwY2FzdEJvb2xBbmRNYXBbXCJpbnQzMlwiXSA9IFwiaW50MzJcIjtcbiAgICBVcGNhc3RCb29sQW5kTWFwW1wiYm9vbFwiXSA9IFwiYm9vbFwiO1xuICAgIFVwY2FzdEJvb2xBbmRNYXBbXCJjb21wbGV4NjRcIl0gPSBcImNvbXBsZXg2NFwiO1xufSkoVXBjYXN0Qm9vbEFuZE1hcCB8fCAoVXBjYXN0Qm9vbEFuZE1hcCA9IHt9KSk7XG52YXIgVXBjYXN0RmxvYXQzMkFuZE1hcDtcbihmdW5jdGlvbiAoVXBjYXN0RmxvYXQzMkFuZE1hcCkge1xuICAgIFVwY2FzdEZsb2F0MzJBbmRNYXBbXCJmbG9hdDMyXCJdID0gXCJmbG9hdDMyXCI7XG4gICAgVXBjYXN0RmxvYXQzMkFuZE1hcFtcImludDMyXCJdID0gXCJmbG9hdDMyXCI7XG4gICAgVXBjYXN0RmxvYXQzMkFuZE1hcFtcImJvb2xcIl0gPSBcImZsb2F0MzJcIjtcbiAgICBVcGNhc3RGbG9hdDMyQW5kTWFwW1wiY29tcGxleDY0XCJdID0gXCJjb21wbGV4NjRcIjtcbn0pKFVwY2FzdEZsb2F0MzJBbmRNYXAgfHwgKFVwY2FzdEZsb2F0MzJBbmRNYXAgPSB7fSkpO1xudmFyIFVwY2FzdENvbXBsZXg2NEFuZE1hcDtcbihmdW5jdGlvbiAoVXBjYXN0Q29tcGxleDY0QW5kTWFwKSB7XG4gICAgVXBjYXN0Q29tcGxleDY0QW5kTWFwW1wiZmxvYXQzMlwiXSA9IFwiY29tcGxleDY0XCI7XG4gICAgVXBjYXN0Q29tcGxleDY0QW5kTWFwW1wiaW50MzJcIl0gPSBcImNvbXBsZXg2NFwiO1xuICAgIFVwY2FzdENvbXBsZXg2NEFuZE1hcFtcImJvb2xcIl0gPSBcImNvbXBsZXg2NFwiO1xuICAgIFVwY2FzdENvbXBsZXg2NEFuZE1hcFtcImNvbXBsZXg2NFwiXSA9IFwiY29tcGxleDY0XCI7XG59KShVcGNhc3RDb21wbGV4NjRBbmRNYXAgfHwgKFVwY2FzdENvbXBsZXg2NEFuZE1hcCA9IHt9KSk7XG5jb25zdCB1cGNhc3RUeXBlTWFwID0ge1xuICAgICdmbG9hdDMyJzogVXBjYXN0RmxvYXQzMkFuZE1hcCxcbiAgICAnaW50MzInOiBVcGNhc3RJbnQzMkFuZE1hcCxcbiAgICAnYm9vbCc6IFVwY2FzdEJvb2xBbmRNYXAsXG4gICAgJ2NvbXBsZXg2NCc6IFVwY2FzdENvbXBsZXg2NEFuZE1hcFxufTtcbmV4cG9ydCBmdW5jdGlvbiB1cGNhc3RUeXBlKHR5cGVBLCB0eXBlQikge1xuICAgIGlmICh0eXBlQSA9PT0gJ3N0cmluZycgfHwgdHlwZUIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmICh0eXBlQSA9PT0gJ3N0cmluZycgJiYgdHlwZUIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3N0cmluZyc7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4gbm90IHVwY2FzdCAke3R5cGVBfSB3aXRoICR7dHlwZUJ9YCk7XG4gICAgfVxuICAgIHJldHVybiB1cGNhc3RUeXBlTWFwW3R5cGVBXVt0eXBlQl07XG59XG4vKiogUmV0dXJucyB0aGUgb3V0cHV0IHR5cGUgYWZ0ZXIgc3VtbWF0aW9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1bU91dFR5cGUodHlwZSkge1xuICAgIHJldHVybiB1cGNhc3RUeXBlKHR5cGUsICdpbnQzMicpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHlwZXMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgKiBhcyBiYXNlIGZyb20gJy4vdXRpbF9iYXNlJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbF9iYXNlJztcbmV4cG9ydCAqIGZyb20gJy4vaGFzaF91dGlsJztcbi8qKlxuICogQ3JlYXRlIHR5cGVkIGFycmF5IGZvciBzY2FsYXIgdmFsdWUuIFVzZWQgZm9yIHN0b3JpbmcgaW4gYERhdGFTdG9yYWdlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNjYWxhclZhbHVlKHZhbHVlLCBkdHlwZSkge1xuICAgIGlmIChkdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGVuY29kZVN0cmluZyh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB0b1R5cGVkQXJyYXkoW3ZhbHVlXSwgZHR5cGUpO1xufVxuZnVuY3Rpb24gbm9Db252ZXJzaW9uTmVlZGVkKGEsIGR0eXBlKSB7XG4gICAgcmV0dXJuIChhIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5ICYmIGR0eXBlID09PSAnZmxvYXQzMicpIHx8XG4gICAgICAgIChhIGluc3RhbmNlb2YgSW50MzJBcnJheSAmJiBkdHlwZSA9PT0gJ2ludDMyJykgfHxcbiAgICAgICAgKGEgaW5zdGFuY2VvZiBVaW50OEFycmF5ICYmIGR0eXBlID09PSAnYm9vbCcpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRvVHlwZWRBcnJheShhLCBkdHlwZSkge1xuICAgIGlmIChkdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29udmVydCBhIHN0cmluZ1tdIHRvIGEgVHlwZWRBcnJheScpO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgICBhID0gYmFzZS5mbGF0dGVuKGEpO1xuICAgIH1cbiAgICBpZiAoZW52KCkuZ2V0Qm9vbCgnREVCVUcnKSkge1xuICAgICAgICBiYXNlLmNoZWNrQ29udmVyc2lvbkZvckVycm9ycyhhLCBkdHlwZSk7XG4gICAgfVxuICAgIGlmIChub0NvbnZlcnNpb25OZWVkZWQoYSwgZHR5cGUpKSB7XG4gICAgICAgIHJldHVybiBhO1xuICAgIH1cbiAgICBpZiAoZHR5cGUgPT0gbnVsbCB8fCBkdHlwZSA9PT0gJ2Zsb2F0MzInIHx8IGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheShhKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZHR5cGUgPT09ICdpbnQzMicpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnQzMkFycmF5KGEpO1xuICAgIH1cbiAgICBlbHNlIGlmIChkdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgICAgIGNvbnN0IGJvb2wgPSBuZXcgVWludDhBcnJheShhLmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYm9vbC5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKE1hdGgucm91bmQoYVtpXSkgIT09IDApIHtcbiAgICAgICAgICAgICAgICBib29sW2ldID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYm9vbDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBkYXRhIHR5cGUgJHtkdHlwZX1gKTtcbiAgICB9XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGN1cnJlbnQgaGlnaC1yZXNvbHV0aW9uIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHJlbGF0aXZlIHRvIGFuXG4gKiBhcmJpdHJhcnkgdGltZSBpbiB0aGUgcGFzdC4gSXQgd29ya3MgYWNyb3NzIGRpZmZlcmVudCBwbGF0Zm9ybXMgKG5vZGUuanMsXG4gKiBicm93c2VycykuXG4gKlxuICogYGBganNcbiAqIGNvbnNvbGUubG9nKHRmLnV0aWwubm93KCkpO1xuICogYGBgXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1V0aWwnLCBuYW1lc3BhY2U6ICd1dGlsJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vdygpIHtcbiAgICByZXR1cm4gZW52KCkucGxhdGZvcm0ubm93KCk7XG59XG4vKipcbiAqIFJldHVybnMgYSBwbGF0Zm9ybS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZlxuICogW2BmZXRjaGBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GZXRjaF9BUEkpLlxuICpcbiAqIElmIGBmZXRjaGAgaXMgZGVmaW5lZCBvbiB0aGUgZ2xvYmFsIG9iamVjdCAoYHdpbmRvd2AsIGBwcm9jZXNzYCwgZXRjLiksXG4gKiBgdGYudXRpbC5mZXRjaGAgcmV0dXJucyB0aGF0IGZ1bmN0aW9uLlxuICpcbiAqIElmIG5vdCwgYHRmLnV0aWwuZmV0Y2hgIHJldHVybnMgYSBwbGF0Zm9ybS1zcGVjaWZpYyBzb2x1dGlvbi5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgcmVzb3VyY2UgPSBhd2FpdCB0Zi51dGlsLmZldGNoKCdodHRwczovL3VucGtnLmNvbS9AdGVuc29yZmxvdy90ZmpzJyk7XG4gKiAvLyBoYW5kbGUgcmVzcG9uc2VcbiAqIGBgYFxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdVdGlsJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZldGNoKHBhdGgsIHJlcXVlc3RJbml0cykge1xuICAgIHJldHVybiBlbnYoKS5wbGF0Zm9ybS5mZXRjaChwYXRoLCByZXF1ZXN0SW5pdHMpO1xufVxuLyoqXG4gKiBFbmNvZGVzIHRoZSBwcm92aWRlZCBzdHJpbmcgaW50byBieXRlcyB1c2luZyB0aGUgcHJvdmlkZWQgZW5jb2Rpbmcgc2NoZW1lLlxuICpcbiAqIEBwYXJhbSBzIFRoZSBzdHJpbmcgdG8gZW5jb2RlLlxuICogQHBhcmFtIGVuY29kaW5nIFRoZSBlbmNvZGluZyBzY2hlbWUuIERlZmF1bHRzIHRvIHV0Zi04LlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdVdGlsJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVN0cmluZyhzLCBlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICBlbmNvZGluZyA9IGVuY29kaW5nIHx8ICd1dGYtOCc7XG4gICAgcmV0dXJuIGVudigpLnBsYXRmb3JtLmVuY29kZShzLCBlbmNvZGluZyk7XG59XG4vKipcbiAqIERlY29kZXMgdGhlIHByb3ZpZGVkIGJ5dGVzIGludG8gYSBzdHJpbmcgdXNpbmcgdGhlIHByb3ZpZGVkIGVuY29kaW5nIHNjaGVtZS5cbiAqIEBwYXJhbSBieXRlcyBUaGUgYnl0ZXMgdG8gZGVjb2RlLlxuICpcbiAqIEBwYXJhbSBlbmNvZGluZyBUaGUgZW5jb2Rpbmcgc2NoZW1lLiBEZWZhdWx0cyB0byB1dGYtOC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVXRpbCd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVTdHJpbmcoYnl0ZXMsIGVuY29kaW5nID0gJ3V0Zi04Jykge1xuICAgIGVuY29kaW5nID0gZW5jb2RpbmcgfHwgJ3V0Zi04JztcbiAgICByZXR1cm4gZW52KCkucGxhdGZvcm0uZGVjb2RlKGJ5dGVzLCBlbmNvZGluZyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qKlxuICogU2h1ZmZsZXMgdGhlIGFycmF5IGluLXBsYWNlIHVzaW5nIEZpc2hlci1ZYXRlcyBhbGdvcml0aG0uXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSBbMSwgMiwgMywgNCwgNV07XG4gKiB0Zi51dGlsLnNodWZmbGUoYSk7XG4gKiBjb25zb2xlLmxvZyhhKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhcnJheSBUaGUgYXJyYXkgdG8gc2h1ZmZsZSBpbi1wbGFjZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVXRpbCcsIG5hbWVzcGFjZTogJ3V0aWwnfVxuICovXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG5leHBvcnQgZnVuY3Rpb24gc2h1ZmZsZShhcnJheSkge1xuICAgIGxldCBjb3VudGVyID0gYXJyYXkubGVuZ3RoO1xuICAgIGxldCBpbmRleCA9IDA7XG4gICAgLy8gV2hpbGUgdGhlcmUgYXJlIGVsZW1lbnRzIGluIHRoZSBhcnJheVxuICAgIHdoaWxlIChjb3VudGVyID4gMCkge1xuICAgICAgICAvLyBQaWNrIGEgcmFuZG9tIGluZGV4XG4gICAgICAgIGluZGV4ID0gKE1hdGgucmFuZG9tKCkgKiBjb3VudGVyKSB8IDA7XG4gICAgICAgIC8vIERlY3JlYXNlIGNvdW50ZXIgYnkgMVxuICAgICAgICBjb3VudGVyLS07XG4gICAgICAgIC8vIEFuZCBzd2FwIHRoZSBsYXN0IGVsZW1lbnQgd2l0aCBpdFxuICAgICAgICBzd2FwKGFycmF5LCBjb3VudGVyLCBpbmRleCk7XG4gICAgfVxufVxuLyoqXG4gKiBTaHVmZmxlcyB0d28gYXJyYXlzIGluLXBsYWNlIHRoZSBzYW1lIHdheSB1c2luZyBGaXNoZXItWWF0ZXMgYWxnb3JpdGhtLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gWzEsMiwzLDQsNV07XG4gKiBjb25zdCBiID0gWzExLDIyLDMzLDQ0LDU1XTtcbiAqIHRmLnV0aWwuc2h1ZmZsZUNvbWJvKGEsIGIpO1xuICogY29uc29sZS5sb2coYSwgYik7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYXJyYXkgVGhlIGZpcnN0IGFycmF5IHRvIHNodWZmbGUgaW4tcGxhY2UuXG4gKiBAcGFyYW0gYXJyYXkyIFRoZSBzZWNvbmQgYXJyYXkgdG8gc2h1ZmZsZSBpbi1wbGFjZSB3aXRoIHRoZSBzYW1lIHBlcm11dGF0aW9uXG4gKiAgICAgYXMgdGhlIGZpcnN0IGFycmF5LlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdVdGlsJywgbmFtZXNwYWNlOiAndXRpbCd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaHVmZmxlQ29tYm8oXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG5hcnJheSwgXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG5hcnJheTIpIHtcbiAgICBpZiAoYXJyYXkubGVuZ3RoICE9PSBhcnJheTIubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQXJyYXkgc2l6ZXMgbXVzdCBtYXRjaCB0byBiZSBzaHVmZmxlZCB0b2dldGhlciBgICtcbiAgICAgICAgICAgIGBGaXJzdCBhcnJheSBsZW5ndGggd2FzICR7YXJyYXkubGVuZ3RofWAgK1xuICAgICAgICAgICAgYFNlY29uZCBhcnJheSBsZW5ndGggd2FzICR7YXJyYXkyLmxlbmd0aH1gKTtcbiAgICB9XG4gICAgbGV0IGNvdW50ZXIgPSBhcnJheS5sZW5ndGg7XG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICAvLyBXaGlsZSB0aGVyZSBhcmUgZWxlbWVudHMgaW4gdGhlIGFycmF5XG4gICAgd2hpbGUgKGNvdW50ZXIgPiAwKSB7XG4gICAgICAgIC8vIFBpY2sgYSByYW5kb20gaW5kZXhcbiAgICAgICAgaW5kZXggPSAoTWF0aC5yYW5kb20oKSAqIGNvdW50ZXIpIHwgMDtcbiAgICAgICAgLy8gRGVjcmVhc2UgY291bnRlciBieSAxXG4gICAgICAgIGNvdW50ZXItLTtcbiAgICAgICAgLy8gQW5kIHN3YXAgdGhlIGxhc3QgZWxlbWVudCBvZiBlYWNoIGFycmF5IHdpdGggaXRcbiAgICAgICAgc3dhcChhcnJheSwgY291bnRlciwgaW5kZXgpO1xuICAgICAgICBzd2FwKGFycmF5MiwgY291bnRlciwgaW5kZXgpO1xuICAgIH1cbn1cbi8qKiBDbGFtcHMgYSB2YWx1ZSB0byBhIHNwZWNpZmllZCByYW5nZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFtcChtaW4sIHgsIG1heCkge1xuICAgIHJldHVybiBNYXRoLm1heChtaW4sIE1hdGgubWluKHgsIG1heCkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG5lYXJlc3RMYXJnZXJFdmVuKHZhbCkge1xuICAgIHJldHVybiB2YWwgJSAyID09PSAwID8gdmFsIDogdmFsICsgMTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzd2FwKG9iamVjdCwgbGVmdCwgcmlnaHQpIHtcbiAgICBjb25zdCB0ZW1wID0gb2JqZWN0W2xlZnRdO1xuICAgIG9iamVjdFtsZWZ0XSA9IG9iamVjdFtyaWdodF07XG4gICAgb2JqZWN0W3JpZ2h0XSA9IHRlbXA7XG59XG5leHBvcnQgZnVuY3Rpb24gc3VtKGFycikge1xuICAgIGxldCBzdW0gPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHN1bSArPSBhcnJbaV07XG4gICAgfVxuICAgIHJldHVybiBzdW07XG59XG4vKipcbiAqIFJldHVybnMgYSBzYW1wbGUgZnJvbSBhIHVuaWZvcm0gW2EsIGIpIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiBAcGFyYW0gYSBUaGUgbWluaW11bSBzdXBwb3J0IChpbmNsdXNpdmUpLlxuICogQHBhcmFtIGIgVGhlIG1heGltdW0gc3VwcG9ydCAoZXhjbHVzaXZlKS5cbiAqIEByZXR1cm4gQSBwc2V1ZG9yYW5kb20gbnVtYmVyIG9uIHRoZSBoYWxmLW9wZW4gaW50ZXJ2YWwgW2EsYikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYW5kVW5pZm9ybShhLCBiKSB7XG4gICAgY29uc3QgciA9IE1hdGgucmFuZG9tKCk7XG4gICAgcmV0dXJuIChiICogcikgKyAoMSAtIHIpICogYTtcbn1cbi8qKiBSZXR1cm5zIHRoZSBzcXVhcmVkIEV1Y2xpZGVhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWN0b3JzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc3RTcXVhcmVkKGEsIGIpIHtcbiAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgZGlmZiA9IE51bWJlcihhW2ldKSAtIE51bWJlcihiW2ldKTtcbiAgICAgICAgcmVzdWx0ICs9IGRpZmYgKiBkaWZmO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgdGhlIGV4cHJlc3Npb24gaXMgdHJ1ZS4gT3RoZXJ3aXNlIHRocm93cyBhbiBlcnJvciB3aXRoIHRoZVxuICogcHJvdmlkZWQgbWVzc2FnZS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IDI7XG4gKiB0Zi51dGlsLmFzc2VydCh4ID09PSAyLCAneCBpcyBub3QgMicpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGV4cHIgVGhlIGV4cHJlc3Npb24gdG8gYXNzZXJ0IChhcyBhIGJvb2xlYW4pLlxuICogQHBhcmFtIG1zZyBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbWVzc2FnZSB0byByZXBvcnQgd2hlbiB0aHJvd2luZyBhblxuICogICAgIGVycm9yLiBXZSB1c2UgYSBmdW5jdGlvbiBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVXRpbCcsIG5hbWVzcGFjZTogJ3V0aWwnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0KGV4cHIsIG1zZykge1xuICAgIGlmICghZXhwcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IodHlwZW9mIG1zZyA9PT0gJ3N0cmluZycgPyBtc2cgOiBtc2coKSk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFNoYXBlc01hdGNoKHNoYXBlQSwgc2hhcGVCLCBlcnJvck1lc3NhZ2VQcmVmaXggPSAnJykge1xuICAgIGFzc2VydChhcnJheXNFcXVhbChzaGFwZUEsIHNoYXBlQiksICgpID0+IGVycm9yTWVzc2FnZVByZWZpeCArIGAgU2hhcGVzICR7c2hhcGVBfSBhbmQgJHtzaGFwZUJ9IG11c3QgbWF0Y2hgKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnROb25OdWxsKGEpIHtcbiAgICBhc3NlcnQoYSAhPSBudWxsLCAoKSA9PiBgVGhlIGlucHV0IHRvIHRoZSB0ZW5zb3IgY29uc3RydWN0b3IgbXVzdCBiZSBhIG5vbi1udWxsIHZhbHVlLmApO1xufVxuLy8gTk9URTogV2UgZXhwbGljaXRseSB0eXBlIG91dCB3aGF0IFQgZXh0ZW5kcyBpbnN0ZWFkIG9mIGFueSBzbyB0aGF0XG4vLyB1dGlsLmZsYXR0ZW4gb24gYSBuZXN0ZWQgYXJyYXkgb2YgbnVtYmVyIGRvZXNuJ3QgdHJ5IHRvIGluZmVyIFQgYXMgYVxuLy8gbnVtYmVyW11bXSwgY2F1c2luZyB1cyB0byBleHBsaWNpdGx5IHR5cGUgdXRpbC5mbGF0dGVuPG51bWJlcj4oKS5cbi8qKlxuICogIEZsYXR0ZW5zIGFuIGFyYml0cmFyaWx5IG5lc3RlZCBhcnJheS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IFtbMSwgMl0sIFszLCA0XSwgWzUsIFs2LCBbN11dXV07XG4gKiBjb25zdCBmbGF0ID0gdGYudXRpbC5mbGF0dGVuKGEpO1xuICogY29uc29sZS5sb2coZmxhdCk7XG4gKiBgYGBcbiAqXG4gKiAgQHBhcmFtIGFyciBUaGUgbmVzdGVkIGFycmF5IHRvIGZsYXR0ZW4uXG4gKiAgQHBhcmFtIHJlc3VsdCBUaGUgZGVzdGluYXRpb24gYXJyYXkgd2hpY2ggaG9sZHMgdGhlIGVsZW1lbnRzLlxuICogIEBwYXJhbSBza2lwVHlwZWRBcnJheSBJZiB0cnVlLCBhdm9pZHMgZmxhdHRlbmluZyB0aGUgdHlwZWQgYXJyYXlzLiBEZWZhdWx0c1xuICogICAgICB0byBmYWxzZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVXRpbCcsIG5hbWVzcGFjZTogJ3V0aWwnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZmxhdHRlbihhcnIsIHJlc3VsdCA9IFtdLCBza2lwVHlwZWRBcnJheSA9IGZhbHNlKSB7XG4gICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7XG4gICAgICAgIHJlc3VsdCA9IFtdO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcnIpIHx8IGlzVHlwZWRBcnJheShhcnIpICYmICFza2lwVHlwZWRBcnJheSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgZmxhdHRlbihhcnJbaV0sIHJlc3VsdCwgc2tpcFR5cGVkQXJyYXkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXN1bHQucHVzaChhcnIpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzaXplIChudW1iZXIgb2YgZWxlbWVudHMpIG9mIHRoZSB0ZW5zb3IgZ2l2ZW4gaXRzIHNoYXBlLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBzaGFwZSA9IFszLCA0LCAyXTtcbiAqIGNvbnN0IHNpemUgPSB0Zi51dGlsLnNpemVGcm9tU2hhcGUoc2hhcGUpO1xuICogY29uc29sZS5sb2coc2l6ZSk7XG4gKiBgYGBcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVXRpbCcsIG5hbWVzcGFjZTogJ3V0aWwnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2l6ZUZyb21TaGFwZShzaGFwZSkge1xuICAgIGlmIChzaGFwZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gU2NhbGFyLlxuICAgICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgbGV0IHNpemUgPSBzaGFwZVswXTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHNoYXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHNpemUgKj0gc2hhcGVbaV07XG4gICAgfVxuICAgIHJldHVybiBzaXplO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzU2NhbGFyU2hhcGUoc2hhcGUpIHtcbiAgICByZXR1cm4gc2hhcGUubGVuZ3RoID09PSAwO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFycmF5c0VxdWFsKG4xLCBuMikge1xuICAgIGlmIChuMSA9PT0gbjIpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChuMSA9PSBudWxsIHx8IG4yID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobjEubGVuZ3RoICE9PSBuMi5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG4xLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChuMVtpXSAhPT0gbjJbaV0pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0ludChhKSB7XG4gICAgcmV0dXJuIGEgJSAxID09PSAwO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRhbmgoeCkge1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICBpZiAoTWF0aC50YW5oICE9IG51bGwpIHtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgICAgICByZXR1cm4gTWF0aC50YW5oKHgpO1xuICAgIH1cbiAgICBpZiAoeCA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIGVsc2UgaWYgKHggPT09IC1JbmZpbml0eSkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBlMnggPSBNYXRoLmV4cCgyICogeCk7XG4gICAgICAgIHJldHVybiAoZTJ4IC0gMSkgLyAoZTJ4ICsgMSk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHNpemVUb1NxdWFyaXNoU2hhcGUoc2l6ZSkge1xuICAgIGNvbnN0IHdpZHRoID0gTWF0aC5jZWlsKE1hdGguc3FydChzaXplKSk7XG4gICAgcmV0dXJuIFt3aWR0aCwgTWF0aC5jZWlsKHNpemUgLyB3aWR0aCldO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGFycmF5IHdpdGggcmFuZG9taXplZCBpbmRpY2llcyB0byBhIGdpdmVuIHF1YW50aXR5LlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCByYW5kb21UZW4gPSB0Zi51dGlsLmNyZWF0ZVNodWZmbGVkSW5kaWNlcygxMCk7XG4gKiBjb25zb2xlLmxvZyhyYW5kb21UZW4pO1xuICogYGBgXG4gKlxuICogQHBhcmFtIG51bWJlciBRdWFudGl0eSBvZiBob3cgbWFueSBzaHVmZmxlZCBpbmRpY2llcyB0byBjcmVhdGUuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1V0aWwnLCBuYW1lc3BhY2U6ICd1dGlsJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNodWZmbGVkSW5kaWNlcyhuKSB7XG4gICAgY29uc3Qgc2h1ZmZsZWRJbmRpY2VzID0gbmV3IFVpbnQzMkFycmF5KG4pO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIHNodWZmbGVkSW5kaWNlc1tpXSA9IGk7XG4gICAgfVxuICAgIHNodWZmbGUoc2h1ZmZsZWRJbmRpY2VzKTtcbiAgICByZXR1cm4gc2h1ZmZsZWRJbmRpY2VzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJpZ2h0UGFkKGEsIHNpemUpIHtcbiAgICBpZiAoc2l6ZSA8PSBhLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gYTtcbiAgICB9XG4gICAgcmV0dXJuIGEgKyAnICcucmVwZWF0KHNpemUgLSBhLmxlbmd0aCk7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVwZWF0ZWRUcnkoY2hlY2tGbiwgZGVsYXlGbiA9IChjb3VudGVyKSA9PiAwLCBtYXhDb3VudGVyKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgbGV0IHRyeUNvdW50ID0gMDtcbiAgICAgICAgY29uc3QgdHJ5Rm4gPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoY2hlY2tGbigpKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeUNvdW50Kys7XG4gICAgICAgICAgICBjb25zdCBuZXh0QmFja29mZiA9IGRlbGF5Rm4odHJ5Q291bnQpO1xuICAgICAgICAgICAgaWYgKG1heENvdW50ZXIgIT0gbnVsbCAmJiB0cnlDb3VudCA+PSBtYXhDb3VudGVyKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0VGltZW91dCh0cnlGbiwgbmV4dEJhY2tvZmYpO1xuICAgICAgICB9O1xuICAgICAgICB0cnlGbigpO1xuICAgIH0pO1xufVxuLyoqXG4gKiBHaXZlbiB0aGUgZnVsbCBzaXplIG9mIHRoZSBhcnJheSBhbmQgYSBzaGFwZSB0aGF0IG1heSBjb250YWluIC0xIGFzIHRoZVxuICogaW1wbGljaXQgZGltZW5zaW9uLCByZXR1cm5zIHRoZSBpbmZlcnJlZCBzaGFwZSB3aGVyZSAtMSBpcyByZXBsYWNlZC5cbiAqIEUuZy4gRm9yIHNoYXBlPVsyLCAtMSwgM10gYW5kIHNpemU9MjQsIGl0IHdpbGwgcmV0dXJuIFsyLCA0LCAzXS5cbiAqXG4gKiBAcGFyYW0gc2hhcGUgVGhlIHNoYXBlLCB3aGljaCBtYXkgY29udGFpbiAtMSBpbiBzb21lIGRpbWVuc2lvbi5cbiAqIEBwYXJhbSBzaXplIFRoZSBmdWxsIHNpemUgKG51bWJlciBvZiBlbGVtZW50cykgb2YgdGhlIGFycmF5LlxuICogQHJldHVybiBUaGUgaW5mZXJyZWQgc2hhcGUgd2hlcmUgLTEgaXMgcmVwbGFjZWQgd2l0aCB0aGUgaW5mZXJyZWQgc2l6ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluZmVyRnJvbUltcGxpY2l0U2hhcGUoc2hhcGUsIHNpemUpIHtcbiAgICBsZXQgc2hhcGVQcm9kID0gMTtcbiAgICBsZXQgaW1wbGljaXRJZHggPSAtMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNoYXBlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmIChzaGFwZVtpXSA+PSAwKSB7XG4gICAgICAgICAgICBzaGFwZVByb2QgKj0gc2hhcGVbaV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc2hhcGVbaV0gPT09IC0xKSB7XG4gICAgICAgICAgICBpZiAoaW1wbGljaXRJZHggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoYFNoYXBlcyBjYW4gb25seSBoYXZlIDEgaW1wbGljaXQgc2l6ZS4gYCArXG4gICAgICAgICAgICAgICAgICAgIGBGb3VuZCAtMSBhdCBkaW0gJHtpbXBsaWNpdElkeH0gYW5kIGRpbSAke2l9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbXBsaWNpdElkeCA9IGk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc2hhcGVbaV0gPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcihgU2hhcGVzIGNhbiBub3QgYmUgPCAwLiBGb3VuZCAke3NoYXBlW2ldfSBhdCBkaW0gJHtpfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpbXBsaWNpdElkeCA9PT0gLTEpIHtcbiAgICAgICAgaWYgKHNpemUgPiAwICYmIHNpemUgIT09IHNoYXBlUHJvZCkge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoYFNpemUoJHtzaXplfSkgbXVzdCBtYXRjaCB0aGUgcHJvZHVjdCBvZiBzaGFwZSAke3NoYXBlfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaGFwZTtcbiAgICB9XG4gICAgaWYgKHNoYXBlUHJvZCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBFcnJvcihgQ2Fubm90IGluZmVyIHRoZSBtaXNzaW5nIHNpemUgaW4gWyR7c2hhcGV9XSB3aGVuIGAgK1xuICAgICAgICAgICAgYHRoZXJlIGFyZSAwIGVsZW1lbnRzYCk7XG4gICAgfVxuICAgIGlmIChzaXplICUgc2hhcGVQcm9kICE9PSAwKSB7XG4gICAgICAgIHRocm93IEVycm9yKGBUaGUgaW1wbGljaXQgc2hhcGUgY2FuJ3QgYmUgYSBmcmFjdGlvbmFsIG51bWJlci4gYCArXG4gICAgICAgICAgICBgR290ICR7c2l6ZX0gLyAke3NoYXBlUHJvZH1gKTtcbiAgICB9XG4gICAgY29uc3QgbmV3U2hhcGUgPSBzaGFwZS5zbGljZSgpO1xuICAgIG5ld1NoYXBlW2ltcGxpY2l0SWR4XSA9IHNpemUgLyBzaGFwZVByb2Q7XG4gICAgcmV0dXJuIG5ld1NoYXBlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQXhpc1BhcmFtKGF4aXMsIHNoYXBlKSB7XG4gICAgY29uc3QgcmFuayA9IHNoYXBlLmxlbmd0aDtcbiAgICAvLyBOb3JtYWxpemUgaW5wdXRcbiAgICBheGlzID0gYXhpcyA9PSBudWxsID8gc2hhcGUubWFwKChzLCBpKSA9PiBpKSA6IFtdLmNvbmNhdChheGlzKTtcbiAgICAvLyBDaGVjayBmb3IgdmFsaWQgcmFuZ2VcbiAgICBhc3NlcnQoYXhpcy5ldmVyeShheCA9PiBheCA+PSAtcmFuayAmJiBheCA8IHJhbmspLCAoKSA9PiBgQWxsIHZhbHVlcyBpbiBheGlzIHBhcmFtIG11c3QgYmUgaW4gcmFuZ2UgWy0ke3Jhbmt9LCAke3Jhbmt9KSBidXQgYCArXG4gICAgICAgIGBnb3QgYXhpcyAke2F4aXN9YCk7XG4gICAgLy8gQ2hlY2sgZm9yIG9ubHkgaW50ZWdlcnNcbiAgICBhc3NlcnQoYXhpcy5ldmVyeShheCA9PiBpc0ludChheCkpLCAoKSA9PiBgQWxsIHZhbHVlcyBpbiBheGlzIHBhcmFtIG11c3QgYmUgaW50ZWdlcnMgYnV0IGAgK1xuICAgICAgICBgZ290IGF4aXMgJHtheGlzfWApO1xuICAgIC8vIEhhbmRsZSBuZWdhdGl2ZSBheGlzLlxuICAgIHJldHVybiBheGlzLm1hcChhID0+IGEgPCAwID8gcmFuayArIGEgOiBhKTtcbn1cbi8qKiBSZWR1Y2VzIHRoZSBzaGFwZSBieSByZW1vdmluZyBhbGwgZGltZW5zaW9ucyBvZiBzaGFwZSAxLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNxdWVlemVTaGFwZShzaGFwZSwgYXhpcykge1xuICAgIGNvbnN0IG5ld1NoYXBlID0gW107XG4gICAgY29uc3Qga2VwdERpbXMgPSBbXTtcbiAgICBjb25zdCBpc0VtcHR5QXJyYXkgPSBheGlzICE9IG51bGwgJiYgQXJyYXkuaXNBcnJheShheGlzKSAmJiBheGlzLmxlbmd0aCA9PT0gMDtcbiAgICBjb25zdCBheGVzID0gKGF4aXMgPT0gbnVsbCB8fCBpc0VtcHR5QXJyYXkpID9cbiAgICAgICAgbnVsbCA6XG4gICAgICAgIHBhcnNlQXhpc1BhcmFtKGF4aXMsIHNoYXBlKS5zb3J0KCk7XG4gICAgbGV0IGogPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2hhcGUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgaWYgKGF4ZXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGF4ZXNbal0gPT09IGkgJiYgc2hhcGVbaV0gIT09IDEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IHNxdWVlemUgYXhpcyAke2l9IHNpbmNlIGl0cyBkaW0gJyR7c2hhcGVbaV19JyBpcyBub3QgMWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChheGVzW2pdID09IG51bGwgfHwgYXhlc1tqXSA+IGkpICYmIHNoYXBlW2ldID09PSAxKSB7XG4gICAgICAgICAgICAgICAgbmV3U2hhcGUucHVzaChzaGFwZVtpXSk7XG4gICAgICAgICAgICAgICAga2VwdERpbXMucHVzaChpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChheGVzW2pdIDw9IGkpIHtcbiAgICAgICAgICAgICAgICBqKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNoYXBlW2ldICE9PSAxKSB7XG4gICAgICAgICAgICBuZXdTaGFwZS5wdXNoKHNoYXBlW2ldKTtcbiAgICAgICAgICAgIGtlcHREaW1zLnB1c2goaSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgbmV3U2hhcGUsIGtlcHREaW1zIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0VHlwZWRBcnJheUZyb21EVHlwZShkdHlwZSwgc2l6ZSkge1xuICAgIGxldCB2YWx1ZXMgPSBudWxsO1xuICAgIGlmIChkdHlwZSA9PSBudWxsIHx8IGR0eXBlID09PSAnZmxvYXQzMicpIHtcbiAgICAgICAgdmFsdWVzID0gbmV3IEZsb2F0MzJBcnJheShzaXplKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZHR5cGUgPT09ICdpbnQzMicpIHtcbiAgICAgICAgdmFsdWVzID0gbmV3IEludDMyQXJyYXkoc2l6ZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGR0eXBlID09PSAnYm9vbCcpIHtcbiAgICAgICAgdmFsdWVzID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZGF0YSB0eXBlICR7ZHR5cGV9YCk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZXM7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0QXJyYXlGcm9tRFR5cGUoZHR5cGUsIHNpemUpIHtcbiAgICBsZXQgdmFsdWVzID0gbnVsbDtcbiAgICBpZiAoZHR5cGUgPT0gbnVsbCB8fCBkdHlwZSA9PT0gJ2Zsb2F0MzInKSB7XG4gICAgICAgIHZhbHVlcyA9IG5ldyBGbG9hdDMyQXJyYXkoc2l6ZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGR0eXBlID09PSAnaW50MzInKSB7XG4gICAgICAgIHZhbHVlcyA9IG5ldyBJbnQzMkFycmF5KHNpemUpO1xuICAgIH1cbiAgICBlbHNlIGlmIChkdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgICAgIHZhbHVlcyA9IG5ldyBVaW50OEFycmF5KHNpemUpO1xuICAgIH1cbiAgICBlbHNlIGlmIChkdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFsdWVzID0gbmV3IEFycmF5KHNpemUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGRhdGEgdHlwZSAke2R0eXBlfWApO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrQ29udmVyc2lvbkZvckVycm9ycyh2YWxzLCBkdHlwZSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBudW0gPSB2YWxzW2ldO1xuICAgICAgICBpZiAoaXNOYU4obnVtKSB8fCAhaXNGaW5pdGUobnVtKSkge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoYEEgdGVuc29yIG9mIHR5cGUgJHtkdHlwZX0gYmVpbmcgdXBsb2FkZWQgY29udGFpbnMgJHtudW19LmApO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZHR5cGUgaXMgdmFsaWQuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZER0eXBlKGR0eXBlKSB7XG4gICAgcmV0dXJuIGR0eXBlID09PSAnYm9vbCcgfHwgZHR5cGUgPT09ICdjb21wbGV4NjQnIHx8IGR0eXBlID09PSAnZmxvYXQzMicgfHxcbiAgICAgICAgZHR5cGUgPT09ICdpbnQzMicgfHwgZHR5cGUgPT09ICdzdHJpbmcnO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIG5ldyB0eXBlIGNhbid0IGVuY29kZSB0aGUgb2xkIHR5cGUgd2l0aG91dCBsb3NzIG9mXG4gKiBwcmVjaXNpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNFbmNvZGluZ0xvc3Mob2xkVHlwZSwgbmV3VHlwZSkge1xuICAgIGlmIChuZXdUeXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChuZXdUeXBlID09PSAnZmxvYXQzMicgJiYgb2xkVHlwZSAhPT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobmV3VHlwZSA9PT0gJ2ludDMyJyAmJiBvbGRUeXBlICE9PSAnZmxvYXQzMicgJiYgb2xkVHlwZSAhPT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobmV3VHlwZSA9PT0gJ2Jvb2wnICYmIG9sZFR5cGUgPT09ICdib29sJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVHlwZWRBcnJheShhKSB7XG4gICAgcmV0dXJuIGEgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkgfHwgYSBpbnN0YW5jZW9mIEludDMyQXJyYXkgfHxcbiAgICAgICAgYSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXk7XG59XG5leHBvcnQgZnVuY3Rpb24gYnl0ZXNQZXJFbGVtZW50KGR0eXBlKSB7XG4gICAgaWYgKGR0eXBlID09PSAnZmxvYXQzMicgfHwgZHR5cGUgPT09ICdpbnQzMicpIHtcbiAgICAgICAgcmV0dXJuIDQ7XG4gICAgfVxuICAgIGVsc2UgaWYgKGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICByZXR1cm4gODtcbiAgICB9XG4gICAgZWxzZSBpZiAoZHR5cGUgPT09ICdib29sJykge1xuICAgICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBkdHlwZSAke2R0eXBlfWApO1xuICAgIH1cbn1cbi8qKlxuICogUmV0dXJucyB0aGUgYXBwcm94aW1hdGUgbnVtYmVyIG9mIGJ5dGVzIGFsbG9jYXRlZCBpbiB0aGUgc3RyaW5nIGFycmF5IC0gMlxuICogYnl0ZXMgcGVyIGNoYXJhY3Rlci4gQ29tcHV0aW5nIHRoZSBleGFjdCBieXRlcyBmb3IgYSBuYXRpdmUgc3RyaW5nIGluIEpTIGlzXG4gKiBub3QgcG9zc2libGUgc2luY2UgaXQgZGVwZW5kcyBvbiB0aGUgZW5jb2Rpbmcgb2YgdGhlIGh0bWwgcGFnZSB0aGF0IHNlcnZlc1xuICogdGhlIHdlYnNpdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBieXRlc0Zyb21TdHJpbmdBcnJheShhcnIpIHtcbiAgICBpZiAoYXJyID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGxldCBieXRlcyA9IDA7XG4gICAgYXJyLmZvckVhY2goeCA9PiBieXRlcyArPSB4Lmxlbmd0aCk7XG4gICAgcmV0dXJuIGJ5dGVzO1xufVxuLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSBzdHJpbmcuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZztcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0Jvb2xlYW4odmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbic7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXIodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJztcbn1cbmV4cG9ydCBmdW5jdGlvbiBpbmZlckR0eXBlKHZhbHVlcykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICAgICAgcmV0dXJuIGluZmVyRHR5cGUodmFsdWVzWzBdKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlcyBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSkge1xuICAgICAgICByZXR1cm4gJ2Zsb2F0MzInO1xuICAgIH1cbiAgICBlbHNlIGlmICh2YWx1ZXMgaW5zdGFuY2VvZiBJbnQzMkFycmF5IHx8IHZhbHVlcyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgcmV0dXJuICdpbnQzMic7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzTnVtYmVyKHZhbHVlcykpIHtcbiAgICAgICAgcmV0dXJuICdmbG9hdDMyJztcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNTdHJpbmcodmFsdWVzKSkge1xuICAgICAgICByZXR1cm4gJ3N0cmluZyc7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzQm9vbGVhbih2YWx1ZXMpKSB7XG4gICAgICAgIHJldHVybiAnYm9vbCc7XG4gICAgfVxuICAgIHJldHVybiAnZmxvYXQzMic7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNGdW5jdGlvbihmKSB7XG4gICAgcmV0dXJuICEhKGYgJiYgZi5jb25zdHJ1Y3RvciAmJiBmLmNhbGwgJiYgZi5hcHBseSk7XG59XG5leHBvcnQgZnVuY3Rpb24gbmVhcmVzdERpdmlzb3Ioc2l6ZSwgc3RhcnQpIHtcbiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzaXplOyArK2kpIHtcbiAgICAgICAgaWYgKHNpemUgJSBpID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2l6ZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlU3RyaWRlcyhzaGFwZSkge1xuICAgIGNvbnN0IHJhbmsgPSBzaGFwZS5sZW5ndGg7XG4gICAgaWYgKHJhbmsgPCAyKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgLy8gTGFzdCBkaW1lbnNpb24gaGFzIGltcGxpY2l0IHN0cmlkZSBvZiAxLCB0aHVzIGhhdmluZyBELTEgKGluc3RlYWQgb2YgRClcbiAgICAvLyBzdHJpZGVzLlxuICAgIGNvbnN0IHN0cmlkZXMgPSBuZXcgQXJyYXkocmFuayAtIDEpO1xuICAgIHN0cmlkZXNbcmFuayAtIDJdID0gc2hhcGVbcmFuayAtIDFdO1xuICAgIGZvciAobGV0IGkgPSByYW5rIC0gMzsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgc3RyaWRlc1tpXSA9IHN0cmlkZXNbaSArIDFdICogc2hhcGVbaSArIDFdO1xuICAgIH1cbiAgICByZXR1cm4gc3RyaWRlcztcbn1cbmZ1bmN0aW9uIGNyZWF0ZU5lc3RlZEFycmF5KG9mZnNldCwgc2hhcGUsIGEsIGlzQ29tcGxleCA9IGZhbHNlKSB7XG4gICAgY29uc3QgcmV0ID0gbmV3IEFycmF5KCk7XG4gICAgaWYgKHNoYXBlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCBkID0gc2hhcGVbMF0gKiAoaXNDb21wbGV4ID8gMiA6IDEpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGQ7IGkrKykge1xuICAgICAgICAgICAgcmV0W2ldID0gYVtvZmZzZXQgKyBpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgZCA9IHNoYXBlWzBdO1xuICAgICAgICBjb25zdCByZXN0ID0gc2hhcGUuc2xpY2UoMSk7XG4gICAgICAgIGNvbnN0IGxlbiA9IHJlc3QucmVkdWNlKChhY2MsIGMpID0+IGFjYyAqIGMpICogKGlzQ29tcGxleCA/IDIgOiAxKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkOyBpKyspIHtcbiAgICAgICAgICAgIHJldFtpXSA9IGNyZWF0ZU5lc3RlZEFycmF5KG9mZnNldCArIGkgKiBsZW4sIHJlc3QsIGEsIGlzQ29tcGxleCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn1cbi8vIFByb3ZpZGUgYSBuZXN0ZWQgYXJyYXkgb2YgVHlwZWRBcnJheSBpbiBnaXZlbiBzaGFwZS5cbmV4cG9ydCBmdW5jdGlvbiB0b05lc3RlZEFycmF5KHNoYXBlLCBhLCBpc0NvbXBsZXggPSBmYWxzZSkge1xuICAgIGlmIChzaGFwZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gU2NhbGFyIHR5cGUgc2hvdWxkIHJldHVybiBhIHNpbmdsZSBudW1iZXIuXG4gICAgICAgIHJldHVybiBhWzBdO1xuICAgIH1cbiAgICBjb25zdCBzaXplID0gc2hhcGUucmVkdWNlKChhY2MsIGMpID0+IGFjYyAqIGMpICogKGlzQ29tcGxleCA/IDIgOiAxKTtcbiAgICBpZiAoc2l6ZSA9PT0gMCkge1xuICAgICAgICAvLyBBIHRlbnNvciB3aXRoIHNoYXBlIHplcm8gc2hvdWxkIGJlIHR1cm5lZCBpbnRvIGVtcHR5IGxpc3QuXG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgaWYgKHNpemUgIT09IGEubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWyR7c2hhcGV9XSBkb2VzIG5vdCBtYXRjaCB0aGUgaW5wdXQgc2l6ZSAke2EubGVuZ3RofSR7aXNDb21wbGV4ID8gJyBmb3IgYSBjb21wbGV4IHRlbnNvcicgOiAnJ30uYCk7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVOZXN0ZWRBcnJheSgwLCBzaGFwZSwgYSwgaXNDb21wbGV4KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBtYWtlT25lc1R5cGVkQXJyYXkoc2l6ZSwgZHR5cGUpIHtcbiAgICBjb25zdCBhcnJheSA9IG1ha2VaZXJvc1R5cGVkQXJyYXkoc2l6ZSwgZHR5cGUpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYXJyYXlbaV0gPSAxO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG59XG5leHBvcnQgZnVuY3Rpb24gbWFrZVplcm9zVHlwZWRBcnJheShzaXplLCBkdHlwZSkge1xuICAgIGlmIChkdHlwZSA9PSBudWxsIHx8IGR0eXBlID09PSAnZmxvYXQzMicgfHwgZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KHNpemUpO1xuICAgIH1cbiAgICBlbHNlIGlmIChkdHlwZSA9PT0gJ2ludDMyJykge1xuICAgICAgICByZXR1cm4gbmV3IEludDMyQXJyYXkoc2l6ZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGR0eXBlID09PSAnYm9vbCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHNpemUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGRhdGEgdHlwZSAke2R0eXBlfWApO1xuICAgIH1cbn1cbi8qKlxuICogTWFrZSBuZXN0ZWQgYFR5cGVkQXJyYXlgIGZpbGxlZCB3aXRoIHplcm9zLlxuICogQHBhcmFtIHNoYXBlIFRoZSBzaGFwZSBpbmZvcm1hdGlvbiBmb3IgdGhlIG5lc3RlZCBhcnJheS5cbiAqIEBwYXJhbSBkdHlwZSBkdHlwZSBvZiB0aGUgYXJyYXkgZWxlbWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VaZXJvc05lc3RlZFR5cGVkQXJyYXkoc2hhcGUsIGR0eXBlKSB7XG4gICAgY29uc3Qgc2l6ZSA9IHNoYXBlLnJlZHVjZSgocHJldiwgY3VycikgPT4gcHJldiAqIGN1cnIsIDEpO1xuICAgIGlmIChkdHlwZSA9PSBudWxsIHx8IGR0eXBlID09PSAnZmxvYXQzMicpIHtcbiAgICAgICAgcmV0dXJuIHRvTmVzdGVkQXJyYXkoc2hhcGUsIG5ldyBGbG9hdDMyQXJyYXkoc2l6ZSkpO1xuICAgIH1cbiAgICBlbHNlIGlmIChkdHlwZSA9PT0gJ2ludDMyJykge1xuICAgICAgICByZXR1cm4gdG9OZXN0ZWRBcnJheShzaGFwZSwgbmV3IEludDMyQXJyYXkoc2l6ZSkpO1xuICAgIH1cbiAgICBlbHNlIGlmIChkdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgICAgIHJldHVybiB0b05lc3RlZEFycmF5KHNoYXBlLCBuZXcgVWludDhBcnJheShzaXplKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZGF0YSB0eXBlICR7ZHR5cGV9YCk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE5vbk5lZ2F0aXZlSW50ZWdlckRpbWVuc2lvbnMoc2hhcGUpIHtcbiAgICBzaGFwZS5mb3JFYWNoKGRpbVNpemUgPT4ge1xuICAgICAgICBhc3NlcnQoTnVtYmVyLmlzSW50ZWdlcihkaW1TaXplKSAmJiBkaW1TaXplID49IDAsICgpID0+IGBUZW5zb3IgbXVzdCBoYXZlIGEgc2hhcGUgY29tcHJpc2VkIG9mIHBvc2l0aXZlIGludGVnZXJzIGJ1dCBnb3QgYCArXG4gICAgICAgICAgICBgc2hhcGUgWyR7c2hhcGV9XS5gKTtcbiAgICB9KTtcbn1cbi8qKlxuICogQ29tcHV0ZXMgZmxhdCBpbmRleCBmb3IgYSBnaXZlbiBsb2NhdGlvbiAobXVsdGlkaW1lbnRpb25zYWwgaW5kZXgpIGluIGFcbiAqIFRlbnNvci9tdWx0aWRpbWVuc2lvbmFsIGFycmF5LlxuICpcbiAqIEBwYXJhbSBsb2NzIExvY2F0aW9uIGluIHRoZSB0ZW5zb3IuXG4gKiBAcGFyYW0gcmFuayBSYW5rIG9mIHRoZSB0ZW5zb3IuXG4gKiBAcGFyYW0gc3RyaWRlcyBUZW5zb3Igc3RyaWRlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvY1RvSW5kZXgobG9jcywgcmFuaywgc3RyaWRlcykge1xuICAgIGlmIChyYW5rID09PSAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBlbHNlIGlmIChyYW5rID09PSAxKSB7XG4gICAgICAgIHJldHVybiBsb2NzWzBdO1xuICAgIH1cbiAgICBsZXQgaW5kZXggPSBsb2NzW2xvY3MubGVuZ3RoIC0gMV07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NzLmxlbmd0aCAtIDE7ICsraSkge1xuICAgICAgICBpbmRleCArPSBzdHJpZGVzW2ldICogbG9jc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIGluZGV4O1xufVxuLyoqXG4gKiBDb21wdXRlcyB0aGUgbG9jYXRpb24gKG11bHRpZGltZW5zaW9uYWwgaW5kZXgpIGluIGEgdGVuc29yL211bHRpZGltZW50aW9uYWxcbiAqIGFycmF5IGZvciBhIGdpdmVuIGZsYXQgaW5kZXguXG4gKlxuICogQHBhcmFtIGluZGV4IEluZGV4IGluIGZsYXQgYXJyYXkuXG4gKiBAcGFyYW0gcmFuayBSYW5rIG9mIHRlbnNvci5cbiAqIEBwYXJhbSBzdHJpZGVzIFN0cmlkZXMgb2YgdGVuc29yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5kZXhUb0xvYyhpbmRleCwgcmFuaywgc3RyaWRlcykge1xuICAgIGlmIChyYW5rID09PSAwKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgZWxzZSBpZiAocmFuayA9PT0gMSkge1xuICAgICAgICByZXR1cm4gW2luZGV4XTtcbiAgICB9XG4gICAgY29uc3QgbG9jcyA9IG5ldyBBcnJheShyYW5rKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvY3MubGVuZ3RoIC0gMTsgKytpKSB7XG4gICAgICAgIGxvY3NbaV0gPSBNYXRoLmZsb29yKGluZGV4IC8gc3RyaWRlc1tpXSk7XG4gICAgICAgIGluZGV4IC09IGxvY3NbaV0gKiBzdHJpZGVzW2ldO1xuICAgIH1cbiAgICBsb2NzW2xvY3MubGVuZ3RoIC0gMV0gPSBpbmRleDtcbiAgICByZXR1cm4gbG9jcztcbn1cbi8qKlxuICogVGhpcyBtZXRob2QgYXNzZXJ0cyB3aGV0aGVyIGFuIG9iamVjdCBpcyBhIFByb21pc2UgaW5zdGFuY2UuXG4gKiBAcGFyYW0gb2JqZWN0XG4gKi9cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tYW55XG5leHBvcnQgZnVuY3Rpb24gaXNQcm9taXNlKG9iamVjdCkge1xuICAgIC8vICBXZSBjaG9zZSB0byBub3QgdXNlICdvYmogaW5zdGFuY2VPZiBQcm9taXNlJyBmb3IgdHdvIHJlYXNvbnM6XG4gICAgLy8gIDEuIEl0IG9ubHkgcmVsaWFibHkgd29ya3MgZm9yIGVzNiBQcm9taXNlLCBub3Qgb3RoZXIgUHJvbWlzZVxuICAgIC8vICBpbXBsZW1lbnRhdGlvbnMuXG4gICAgLy8gIDIuIEl0IGRvZXNuJ3Qgd29yayB3aXRoIGZyYW1ld29yayB0aGF0IHVzZXMgem9uZS5qcy4gem9uZS5qcyBtb25rZXkgcGF0Y2hcbiAgICAvLyAgdGhlIGFzeW5jIGNhbGxzLCBzbyBpdCBpcyBwb3NzaWJsZSB0aGUgb2JqIChwYXRjaGVkKSBpcyBjb21wYXJpbmcgdG8gYVxuICAgIC8vICBwcmUtcGF0Y2hlZCBQcm9taXNlLlxuICAgIHJldHVybiBvYmplY3QgJiYgb2JqZWN0LnRoZW4gJiYgdHlwZW9mIG9iamVjdC50aGVuID09PSAnZnVuY3Rpb24nO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbF9iYXNlLmpzLm1hcCIsIi8qKiBAbGljZW5zZSBTZWUgdGhlIExJQ0VOU0UgZmlsZS4gKi9cbi8vIFRoaXMgY29kZSBpcyBhdXRvLWdlbmVyYXRlZCwgZG8gbm90IG1vZGlmeSB0aGlzIGZpbGUhXG5jb25zdCB2ZXJzaW9uID0gJzMuOC4wJztcbmV4cG9ydCB7IHZlcnNpb24gfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZlcnNpb24uanMubWFwIiwiJ3VzZSBzdHJpY3QnXG5cbmV4cG9ydHMuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhcbmV4cG9ydHMudG9CeXRlQXJyYXkgPSB0b0J5dGVBcnJheVxuZXhwb3J0cy5mcm9tQnl0ZUFycmF5ID0gZnJvbUJ5dGVBcnJheVxuXG52YXIgbG9va3VwID0gW11cbnZhciByZXZMb29rdXAgPSBbXVxudmFyIEFyciA9IHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJyA/IFVpbnQ4QXJyYXkgOiBBcnJheVxuXG52YXIgY29kZSA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJ1xuZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNvZGUubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgbG9va3VwW2ldID0gY29kZVtpXVxuICByZXZMb29rdXBbY29kZS5jaGFyQ29kZUF0KGkpXSA9IGlcbn1cblxuLy8gU3VwcG9ydCBkZWNvZGluZyBVUkwtc2FmZSBiYXNlNjQgc3RyaW5ncywgYXMgTm9kZS5qcyBkb2VzLlxuLy8gU2VlOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CYXNlNjQjVVJMX2FwcGxpY2F0aW9uc1xucmV2TG9va3VwWyctJy5jaGFyQ29kZUF0KDApXSA9IDYyXG5yZXZMb29rdXBbJ18nLmNoYXJDb2RlQXQoMCldID0gNjNcblxuZnVuY3Rpb24gZ2V0TGVucyAoYjY0KSB7XG4gIHZhciBsZW4gPSBiNjQubGVuZ3RoXG5cbiAgaWYgKGxlbiAlIDQgPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0JylcbiAgfVxuXG4gIC8vIFRyaW0gb2ZmIGV4dHJhIGJ5dGVzIGFmdGVyIHBsYWNlaG9sZGVyIGJ5dGVzIGFyZSBmb3VuZFxuICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9iZWF0Z2FtbWl0L2Jhc2U2NC1qcy9pc3N1ZXMvNDJcbiAgdmFyIHZhbGlkTGVuID0gYjY0LmluZGV4T2YoJz0nKVxuICBpZiAodmFsaWRMZW4gPT09IC0xKSB2YWxpZExlbiA9IGxlblxuXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSB2YWxpZExlbiA9PT0gbGVuXG4gICAgPyAwXG4gICAgOiA0IC0gKHZhbGlkTGVuICUgNClcblxuICByZXR1cm4gW3ZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW5dXG59XG5cbi8vIGJhc2U2NCBpcyA0LzMgKyB1cCB0byB0d28gY2hhcmFjdGVycyBvZiB0aGUgb3JpZ2luYWwgZGF0YVxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoYjY0KSB7XG4gIHZhciBsZW5zID0gZ2V0TGVucyhiNjQpXG4gIHZhciB2YWxpZExlbiA9IGxlbnNbMF1cbiAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IGxlbnNbMV1cbiAgcmV0dXJuICgodmFsaWRMZW4gKyBwbGFjZUhvbGRlcnNMZW4pICogMyAvIDQpIC0gcGxhY2VIb2xkZXJzTGVuXG59XG5cbmZ1bmN0aW9uIF9ieXRlTGVuZ3RoIChiNjQsIHZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW4pIHtcbiAgcmV0dXJuICgodmFsaWRMZW4gKyBwbGFjZUhvbGRlcnNMZW4pICogMyAvIDQpIC0gcGxhY2VIb2xkZXJzTGVuXG59XG5cbmZ1bmN0aW9uIHRvQnl0ZUFycmF5IChiNjQpIHtcbiAgdmFyIHRtcFxuICB2YXIgbGVucyA9IGdldExlbnMoYjY0KVxuICB2YXIgdmFsaWRMZW4gPSBsZW5zWzBdXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSBsZW5zWzFdXG5cbiAgdmFyIGFyciA9IG5ldyBBcnIoX2J5dGVMZW5ndGgoYjY0LCB2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuKSlcblxuICB2YXIgY3VyQnl0ZSA9IDBcblxuICAvLyBpZiB0aGVyZSBhcmUgcGxhY2Vob2xkZXJzLCBvbmx5IGdldCB1cCB0byB0aGUgbGFzdCBjb21wbGV0ZSA0IGNoYXJzXG4gIHZhciBsZW4gPSBwbGFjZUhvbGRlcnNMZW4gPiAwXG4gICAgPyB2YWxpZExlbiAtIDRcbiAgICA6IHZhbGlkTGVuXG5cbiAgdmFyIGlcbiAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7XG4gICAgdG1wID1cbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDE4KSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgMTIpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA8PCA2KSB8XG4gICAgICByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDMpXVxuICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA+PiAxNikgJiAweEZGXG4gICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgaWYgKHBsYWNlSG9sZGVyc0xlbiA9PT0gMikge1xuICAgIHRtcCA9XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAyKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPj4gNClcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIGlmIChwbGFjZUhvbGRlcnNMZW4gPT09IDEpIHtcbiAgICB0bXAgPVxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTApIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCA0KSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPj4gMilcbiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gOCkgJiAweEZGXG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICByZXR1cm4gYXJyXG59XG5cbmZ1bmN0aW9uIHRyaXBsZXRUb0Jhc2U2NCAobnVtKSB7XG4gIHJldHVybiBsb29rdXBbbnVtID4+IDE4ICYgMHgzRl0gK1xuICAgIGxvb2t1cFtudW0gPj4gMTIgJiAweDNGXSArXG4gICAgbG9va3VwW251bSA+PiA2ICYgMHgzRl0gK1xuICAgIGxvb2t1cFtudW0gJiAweDNGXVxufVxuXG5mdW5jdGlvbiBlbmNvZGVDaHVuayAodWludDgsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHRtcFxuICB2YXIgb3V0cHV0ID0gW11cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IDMpIHtcbiAgICB0bXAgPVxuICAgICAgKCh1aW50OFtpXSA8PCAxNikgJiAweEZGMDAwMCkgK1xuICAgICAgKCh1aW50OFtpICsgMV0gPDwgOCkgJiAweEZGMDApICtcbiAgICAgICh1aW50OFtpICsgMl0gJiAweEZGKVxuICAgIG91dHB1dC5wdXNoKHRyaXBsZXRUb0Jhc2U2NCh0bXApKVxuICB9XG4gIHJldHVybiBvdXRwdXQuam9pbignJylcbn1cblxuZnVuY3Rpb24gZnJvbUJ5dGVBcnJheSAodWludDgpIHtcbiAgdmFyIHRtcFxuICB2YXIgbGVuID0gdWludDgubGVuZ3RoXG4gIHZhciBleHRyYUJ5dGVzID0gbGVuICUgMyAvLyBpZiB3ZSBoYXZlIDEgYnl0ZSBsZWZ0LCBwYWQgMiBieXRlc1xuICB2YXIgcGFydHMgPSBbXVxuICB2YXIgbWF4Q2h1bmtMZW5ndGggPSAxNjM4MyAvLyBtdXN0IGJlIG11bHRpcGxlIG9mIDNcblxuICAvLyBnbyB0aHJvdWdoIHRoZSBhcnJheSBldmVyeSB0aHJlZSBieXRlcywgd2UnbGwgZGVhbCB3aXRoIHRyYWlsaW5nIHN0dWZmIGxhdGVyXG4gIGZvciAodmFyIGkgPSAwLCBsZW4yID0gbGVuIC0gZXh0cmFCeXRlczsgaSA8IGxlbjI7IGkgKz0gbWF4Q2h1bmtMZW5ndGgpIHtcbiAgICBwYXJ0cy5wdXNoKGVuY29kZUNodW5rKHVpbnQ4LCBpLCAoaSArIG1heENodW5rTGVuZ3RoKSA+IGxlbjIgPyBsZW4yIDogKGkgKyBtYXhDaHVua0xlbmd0aCkpKVxuICB9XG5cbiAgLy8gcGFkIHRoZSBlbmQgd2l0aCB6ZXJvcywgYnV0IG1ha2Ugc3VyZSB0byBub3QgZm9yZ2V0IHRoZSBleHRyYSBieXRlc1xuICBpZiAoZXh0cmFCeXRlcyA9PT0gMSkge1xuICAgIHRtcCA9IHVpbnQ4W2xlbiAtIDFdXG4gICAgcGFydHMucHVzaChcbiAgICAgIGxvb2t1cFt0bXAgPj4gMl0gK1xuICAgICAgbG9va3VwWyh0bXAgPDwgNCkgJiAweDNGXSArXG4gICAgICAnPT0nXG4gICAgKVxuICB9IGVsc2UgaWYgKGV4dHJhQnl0ZXMgPT09IDIpIHtcbiAgICB0bXAgPSAodWludDhbbGVuIC0gMl0gPDwgOCkgKyB1aW50OFtsZW4gLSAxXVxuICAgIHBhcnRzLnB1c2goXG4gICAgICBsb29rdXBbdG1wID4+IDEwXSArXG4gICAgICBsb29rdXBbKHRtcCA+PiA0KSAmIDB4M0ZdICtcbiAgICAgIGxvb2t1cFsodG1wIDw8IDIpICYgMHgzRl0gK1xuICAgICAgJz0nXG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIHBhcnRzLmpvaW4oJycpXG59XG4iLCIvKiFcbiAqIFRoZSBidWZmZXIgbW9kdWxlIGZyb20gbm9kZS5qcywgZm9yIHRoZSBicm93c2VyLlxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbnZhciBiYXNlNjQgPSByZXF1aXJlKCdiYXNlNjQtanMnKVxudmFyIGllZWU3NTQgPSByZXF1aXJlKCdpZWVlNzU0JylcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnaXNhcnJheScpXG5cbmV4cG9ydHMuQnVmZmVyID0gQnVmZmVyXG5leHBvcnRzLlNsb3dCdWZmZXIgPSBTbG93QnVmZmVyXG5leHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTID0gNTBcblxuLyoqXG4gKiBJZiBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgOlxuICogICA9PT0gdHJ1ZSAgICBVc2UgVWludDhBcnJheSBpbXBsZW1lbnRhdGlvbiAoZmFzdGVzdClcbiAqICAgPT09IGZhbHNlICAgVXNlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiAobW9zdCBjb21wYXRpYmxlLCBldmVuIElFNilcbiAqXG4gKiBCcm93c2VycyB0aGF0IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGFyZSBJRSAxMCssIEZpcmVmb3ggNCssIENocm9tZSA3KywgU2FmYXJpIDUuMSssXG4gKiBPcGVyYSAxMS42KywgaU9TIDQuMisuXG4gKlxuICogRHVlIHRvIHZhcmlvdXMgYnJvd3NlciBidWdzLCBzb21ldGltZXMgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIHVzZWQgZXZlblxuICogd2hlbiB0aGUgYnJvd3NlciBzdXBwb3J0cyB0eXBlZCBhcnJheXMuXG4gKlxuICogTm90ZTpcbiAqXG4gKiAgIC0gRmlyZWZveCA0LTI5IGxhY2tzIHN1cHBvcnQgZm9yIGFkZGluZyBuZXcgcHJvcGVydGllcyB0byBgVWludDhBcnJheWAgaW5zdGFuY2VzLFxuICogICAgIFNlZTogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk1NDM4LlxuICpcbiAqICAgLSBDaHJvbWUgOS0xMCBpcyBtaXNzaW5nIHRoZSBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uLlxuICpcbiAqICAgLSBJRTEwIGhhcyBhIGJyb2tlbiBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYXJyYXlzIG9mXG4gKiAgICAgaW5jb3JyZWN0IGxlbmd0aCBpbiBzb21lIHNpdHVhdGlvbnMuXG5cbiAqIFdlIGRldGVjdCB0aGVzZSBidWdneSBicm93c2VycyBhbmQgc2V0IGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGAgdG8gYGZhbHNlYCBzbyB0aGV5XG4gKiBnZXQgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaXMgc2xvd2VyIGJ1dCBiZWhhdmVzIGNvcnJlY3RseS5cbiAqL1xuQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgPSBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVCAhPT0gdW5kZWZpbmVkXG4gID8gZ2xvYmFsLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgOiB0eXBlZEFycmF5U3VwcG9ydCgpXG5cbi8qXG4gKiBFeHBvcnQga01heExlbmd0aCBhZnRlciB0eXBlZCBhcnJheSBzdXBwb3J0IGlzIGRldGVybWluZWQuXG4gKi9cbmV4cG9ydHMua01heExlbmd0aCA9IGtNYXhMZW5ndGgoKVxuXG5mdW5jdGlvbiB0eXBlZEFycmF5U3VwcG9ydCAoKSB7XG4gIHRyeSB7XG4gICAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KDEpXG4gICAgYXJyLl9fcHJvdG9fXyA9IHtfX3Byb3RvX186IFVpbnQ4QXJyYXkucHJvdG90eXBlLCBmb286IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDQyIH19XG4gICAgcmV0dXJuIGFyci5mb28oKSA9PT0gNDIgJiYgLy8gdHlwZWQgYXJyYXkgaW5zdGFuY2VzIGNhbiBiZSBhdWdtZW50ZWRcbiAgICAgICAgdHlwZW9mIGFyci5zdWJhcnJheSA9PT0gJ2Z1bmN0aW9uJyAmJiAvLyBjaHJvbWUgOS0xMCBsYWNrIGBzdWJhcnJheWBcbiAgICAgICAgYXJyLnN1YmFycmF5KDEsIDEpLmJ5dGVMZW5ndGggPT09IDAgLy8gaWUxMCBoYXMgYnJva2VuIGBzdWJhcnJheWBcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmZ1bmN0aW9uIGtNYXhMZW5ndGggKCkge1xuICByZXR1cm4gQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgICA/IDB4N2ZmZmZmZmZcbiAgICA6IDB4M2ZmZmZmZmZcbn1cblxuZnVuY3Rpb24gY3JlYXRlQnVmZmVyICh0aGF0LCBsZW5ndGgpIHtcbiAgaWYgKGtNYXhMZW5ndGgoKSA8IGxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHR5cGVkIGFycmF5IGxlbmd0aCcpXG4gIH1cbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aClcbiAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICAvLyBGYWxsYmFjazogUmV0dXJuIGFuIG9iamVjdCBpbnN0YW5jZSBvZiB0aGUgQnVmZmVyIGNsYXNzXG4gICAgaWYgKHRoYXQgPT09IG51bGwpIHtcbiAgICAgIHRoYXQgPSBuZXcgQnVmZmVyKGxlbmd0aClcbiAgICB9XG4gICAgdGhhdC5sZW5ndGggPSBsZW5ndGhcbiAgfVxuXG4gIHJldHVybiB0aGF0XG59XG5cbi8qKlxuICogVGhlIEJ1ZmZlciBjb25zdHJ1Y3RvciByZXR1cm5zIGluc3RhbmNlcyBvZiBgVWludDhBcnJheWAgdGhhdCBoYXZlIHRoZWlyXG4gKiBwcm90b3R5cGUgY2hhbmdlZCB0byBgQnVmZmVyLnByb3RvdHlwZWAuIEZ1cnRoZXJtb3JlLCBgQnVmZmVyYCBpcyBhIHN1YmNsYXNzIG9mXG4gKiBgVWludDhBcnJheWAsIHNvIHRoZSByZXR1cm5lZCBpbnN0YW5jZXMgd2lsbCBoYXZlIGFsbCB0aGUgbm9kZSBgQnVmZmVyYCBtZXRob2RzXG4gKiBhbmQgdGhlIGBVaW50OEFycmF5YCBtZXRob2RzLiBTcXVhcmUgYnJhY2tldCBub3RhdGlvbiB3b3JrcyBhcyBleHBlY3RlZCAtLSBpdFxuICogcmV0dXJucyBhIHNpbmdsZSBvY3RldC5cbiAqXG4gKiBUaGUgYFVpbnQ4QXJyYXlgIHByb3RvdHlwZSByZW1haW5zIHVubW9kaWZpZWQuXG4gKi9cblxuZnVuY3Rpb24gQnVmZmVyIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmICEodGhpcyBpbnN0YW5jZW9mIEJ1ZmZlcikpIHtcbiAgICByZXR1cm4gbmV3IEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIC8vIENvbW1vbiBjYXNlLlxuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nT3JPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZydcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIGFsbG9jVW5zYWZlKHRoaXMsIGFyZylcbiAgfVxuICByZXR1cm4gZnJvbSh0aGlzLCBhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnBvb2xTaXplID0gODE5MiAvLyBub3QgdXNlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uXG5cbi8vIFRPRE86IExlZ2FjeSwgbm90IG5lZWRlZCBhbnltb3JlLiBSZW1vdmUgaW4gbmV4dCBtYWpvciB2ZXJzaW9uLlxuQnVmZmVyLl9hdWdtZW50ID0gZnVuY3Rpb24gKGFycikge1xuICBhcnIuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICByZXR1cm4gYXJyXG59XG5cbmZ1bmN0aW9uIGZyb20gKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZyb21TdHJpbmcodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQpXG4gIH1cblxuICByZXR1cm4gZnJvbU9iamVjdCh0aGF0LCB2YWx1ZSlcbn1cblxuLyoqXG4gKiBGdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBCdWZmZXIoYXJnLCBlbmNvZGluZykgYnV0IHRocm93cyBhIFR5cGVFcnJvclxuICogaWYgdmFsdWUgaXMgYSBudW1iZXIuXG4gKiBCdWZmZXIuZnJvbShzdHJbLCBlbmNvZGluZ10pXG4gKiBCdWZmZXIuZnJvbShhcnJheSlcbiAqIEJ1ZmZlci5mcm9tKGJ1ZmZlcilcbiAqIEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyWywgYnl0ZU9mZnNldFssIGxlbmd0aF1dKVxuICoqL1xuQnVmZmVyLmZyb20gPSBmdW5jdGlvbiAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gZnJvbShudWxsLCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5pZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgQnVmZmVyLnByb3RvdHlwZS5fX3Byb3RvX18gPSBVaW50OEFycmF5LnByb3RvdHlwZVxuICBCdWZmZXIuX19wcm90b19fID0gVWludDhBcnJheVxuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnNwZWNpZXMgJiZcbiAgICAgIEJ1ZmZlcltTeW1ib2wuc3BlY2llc10gPT09IEJ1ZmZlcikge1xuICAgIC8vIEZpeCBzdWJhcnJheSgpIGluIEVTMjAxNi4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9wdWxsLzk3XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlciwgU3ltYm9sLnNwZWNpZXMsIHtcbiAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSlcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRTaXplIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfSBlbHNlIGlmIChzaXplIDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWxsb2MgKHRoYXQsIHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgaWYgKHNpemUgPD0gMCkge1xuICAgIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSlcbiAgfVxuICBpZiAoZmlsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT25seSBwYXkgYXR0ZW50aW9uIHRvIGVuY29kaW5nIGlmIGl0J3MgYSBzdHJpbmcuIFRoaXNcbiAgICAvLyBwcmV2ZW50cyBhY2NpZGVudGFsbHkgc2VuZGluZyBpbiBhIG51bWJlciB0aGF0IHdvdWxkXG4gICAgLy8gYmUgaW50ZXJwcmV0dGVkIGFzIGEgc3RhcnQgb2Zmc2V0LlxuICAgIHJldHVybiB0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnXG4gICAgICA/IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKS5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgICAgOiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSkuZmlsbChmaWxsKVxuICB9XG4gIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSlcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiBhbGxvYyhzaXplWywgZmlsbFssIGVuY29kaW5nXV0pXG4gKiovXG5CdWZmZXIuYWxsb2MgPSBmdW5jdGlvbiAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGFsbG9jKG51bGwsIHNpemUsIGZpbGwsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBhbGxvY1Vuc2FmZSAodGhhdCwgc2l6ZSkge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSA8IDAgPyAwIDogY2hlY2tlZChzaXplKSB8IDApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7ICsraSkge1xuICAgICAgdGhhdFtpXSA9IDBcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIEJ1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufVxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIFNsb3dCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufVxuXG5mdW5jdGlvbiBmcm9tU3RyaW5nICh0aGF0LCBzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnIHx8IGVuY29kaW5nID09PSAnJykge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gIH1cblxuICBpZiAoIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiZW5jb2RpbmdcIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVuY29kaW5nJylcbiAgfVxuXG4gIHZhciBsZW5ndGggPSBieXRlTGVuZ3RoKHN0cmluZywgZW5jb2RpbmcpIHwgMFxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbmd0aClcblxuICB2YXIgYWN0dWFsID0gdGhhdC53cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuXG4gIGlmIChhY3R1YWwgIT09IGxlbmd0aCkge1xuICAgIC8vIFdyaXRpbmcgYSBoZXggc3RyaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMgd2lsbFxuICAgIC8vIGNhdXNlIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGZpcnN0IGludmFsaWQgY2hhcmFjdGVyIHRvIGJlIGlnbm9yZWQuIChlLmcuXG4gICAgLy8gJ2FieHhjZCcgd2lsbCBiZSB0cmVhdGVkIGFzICdhYicpXG4gICAgdGhhdCA9IHRoYXQuc2xpY2UoMCwgYWN0dWFsKVxuICB9XG5cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5TGlrZSAodGhhdCwgYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCA8IDAgPyAwIDogY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMFxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbmd0aClcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIHRoYXRbaV0gPSBhcnJheVtpXSAmIDI1NVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUJ1ZmZlciAodGhhdCwgYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICBhcnJheS5ieXRlTGVuZ3RoIC8vIHRoaXMgdGhyb3dzIGlmIGBhcnJheWAgaXMgbm90IGEgdmFsaWQgQXJyYXlCdWZmZXJcblxuICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXFwnb2Zmc2V0XFwnIGlzIG91dCBvZiBib3VuZHMnKVxuICB9XG5cbiAgaWYgKGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0ICsgKGxlbmd0aCB8fCAwKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcXCdsZW5ndGhcXCcgaXMgb3V0IG9mIGJvdW5kcycpXG4gIH1cblxuICBpZiAoYnl0ZU9mZnNldCA9PT0gdW5kZWZpbmVkICYmIGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSlcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQpXG4gIH0gZWxzZSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IGFycmF5XG4gICAgdGhhdC5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIHRoYXQgPSBmcm9tQXJyYXlMaWtlKHRoYXQsIGFycmF5KVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21PYmplY3QgKHRoYXQsIG9iaikge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKG9iaikpIHtcbiAgICB2YXIgbGVuID0gY2hlY2tlZChvYmoubGVuZ3RoKSB8IDBcbiAgICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbilcblxuICAgIGlmICh0aGF0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoYXRcbiAgICB9XG5cbiAgICBvYmouY29weSh0aGF0LCAwLCAwLCBsZW4pXG4gICAgcmV0dXJuIHRoYXRcbiAgfVxuXG4gIGlmIChvYmopIHtcbiAgICBpZiAoKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgb2JqLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB8fCAnbGVuZ3RoJyBpbiBvYmopIHtcbiAgICAgIGlmICh0eXBlb2Ygb2JqLmxlbmd0aCAhPT0gJ251bWJlcicgfHwgaXNuYW4ob2JqLmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCAwKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2UodGhhdCwgb2JqKVxuICAgIH1cblxuICAgIGlmIChvYmoudHlwZSA9PT0gJ0J1ZmZlcicgJiYgaXNBcnJheShvYmouZGF0YSkpIHtcbiAgICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKHRoYXQsIG9iai5kYXRhKVxuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBhcnJheS1saWtlIG9iamVjdC4nKVxufVxuXG5mdW5jdGlvbiBjaGVja2VkIChsZW5ndGgpIHtcbiAgLy8gTm90ZTogY2Fubm90IHVzZSBgbGVuZ3RoIDwga01heExlbmd0aCgpYCBoZXJlIGJlY2F1c2UgdGhhdCBmYWlscyB3aGVuXG4gIC8vIGxlbmd0aCBpcyBOYU4gKHdoaWNoIGlzIG90aGVyd2lzZSBjb2VyY2VkIHRvIHplcm8uKVxuICBpZiAobGVuZ3RoID49IGtNYXhMZW5ndGgoKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICdzaXplOiAweCcgKyBrTWF4TGVuZ3RoKCkudG9TdHJpbmcoMTYpICsgJyBieXRlcycpXG4gIH1cbiAgcmV0dXJuIGxlbmd0aCB8IDBcbn1cblxuZnVuY3Rpb24gU2xvd0J1ZmZlciAobGVuZ3RoKSB7XG4gIGlmICgrbGVuZ3RoICE9IGxlbmd0aCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcVxuICAgIGxlbmd0aCA9IDBcbiAgfVxuICByZXR1cm4gQnVmZmVyLmFsbG9jKCtsZW5ndGgpXG59XG5cbkJ1ZmZlci5pc0J1ZmZlciA9IGZ1bmN0aW9uIGlzQnVmZmVyIChiKSB7XG4gIHJldHVybiAhIShiICE9IG51bGwgJiYgYi5faXNCdWZmZXIpXG59XG5cbkJ1ZmZlci5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAoYSwgYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihhKSB8fCAhQnVmZmVyLmlzQnVmZmVyKGIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIG11c3QgYmUgQnVmZmVycycpXG4gIH1cblxuICBpZiAoYSA9PT0gYikgcmV0dXJuIDBcblxuICB2YXIgeCA9IGEubGVuZ3RoXG4gIHZhciB5ID0gYi5sZW5ndGhcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gTWF0aC5taW4oeCwgeSk7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICB4ID0gYVtpXVxuICAgICAgeSA9IGJbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG5CdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIGlzRW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gIHN3aXRjaCAoU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgY2FzZSAnYXNjaWknOlxuICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgY2FzZSAnYmluYXJ5JzpcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5CdWZmZXIuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0IChsaXN0LCBsZW5ndGgpIHtcbiAgaWYgKCFpc0FycmF5KGxpc3QpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBCdWZmZXIuYWxsb2MoMClcbiAgfVxuXG4gIHZhciBpXG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGxlbmd0aCA9IDBcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgbGVuZ3RoICs9IGxpc3RbaV0ubGVuZ3RoXG4gICAgfVxuICB9XG5cbiAgdmFyIGJ1ZmZlciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShsZW5ndGgpXG4gIHZhciBwb3MgPSAwXG4gIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGJ1ZiA9IGxpc3RbaV1cbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICAgIH1cbiAgICBidWYuY29weShidWZmZXIsIHBvcylcbiAgICBwb3MgKz0gYnVmLmxlbmd0aFxuICB9XG4gIHJldHVybiBidWZmZXJcbn1cblxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHN0cmluZykpIHtcbiAgICByZXR1cm4gc3RyaW5nLmxlbmd0aFxuICB9XG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgIChBcnJheUJ1ZmZlci5pc1ZpZXcoc3RyaW5nKSB8fCBzdHJpbmcgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpIHtcbiAgICByZXR1cm4gc3RyaW5nLmJ5dGVMZW5ndGhcbiAgfVxuICBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICBzdHJpbmcgPSAnJyArIHN0cmluZ1xuICB9XG5cbiAgdmFyIGxlbiA9IHN0cmluZy5sZW5ndGhcbiAgaWYgKGxlbiA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBVc2UgYSBmb3IgbG9vcCB0byBhdm9pZCByZWN1cnNpb25cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGVuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiBsZW4gKiAyXG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gbGVuID4+PiAxXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGggLy8gYXNzdW1lIHV0ZjhcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cbkJ1ZmZlci5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuXG5mdW5jdGlvbiBzbG93VG9TdHJpbmcgKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG5cbiAgLy8gTm8gbmVlZCB0byB2ZXJpZnkgdGhhdCBcInRoaXMubGVuZ3RoIDw9IE1BWF9VSU5UMzJcIiBzaW5jZSBpdCdzIGEgcmVhZC1vbmx5XG4gIC8vIHByb3BlcnR5IG9mIGEgdHlwZWQgYXJyYXkuXG5cbiAgLy8gVGhpcyBiZWhhdmVzIG5laXRoZXIgbGlrZSBTdHJpbmcgbm9yIFVpbnQ4QXJyYXkgaW4gdGhhdCB3ZSBzZXQgc3RhcnQvZW5kXG4gIC8vIHRvIHRoZWlyIHVwcGVyL2xvd2VyIGJvdW5kcyBpZiB0aGUgdmFsdWUgcGFzc2VkIGlzIG91dCBvZiByYW5nZS5cbiAgLy8gdW5kZWZpbmVkIGlzIGhhbmRsZWQgc3BlY2lhbGx5IGFzIHBlciBFQ01BLTI2MiA2dGggRWRpdGlvbixcbiAgLy8gU2VjdGlvbiAxMy4zLjMuNyBSdW50aW1lIFNlbWFudGljczogS2V5ZWRCaW5kaW5nSW5pdGlhbGl6YXRpb24uXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkIHx8IHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIC8vIFJldHVybiBlYXJseSBpZiBzdGFydCA+IHRoaXMubGVuZ3RoLiBEb25lIGhlcmUgdG8gcHJldmVudCBwb3RlbnRpYWwgdWludDMyXG4gIC8vIGNvZXJjaW9uIGZhaWwgYmVsb3cuXG4gIGlmIChzdGFydCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKGVuZCA8PSAwKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICAvLyBGb3JjZSBjb2Vyc2lvbiB0byB1aW50MzIuIFRoaXMgd2lsbCBhbHNvIGNvZXJjZSBmYWxzZXkvTmFOIHZhbHVlcyB0byAwLlxuICBlbmQgPj4+PSAwXG4gIHN0YXJ0ID4+Pj0gMFxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9IChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG4vLyBUaGUgcHJvcGVydHkgaXMgdXNlZCBieSBgQnVmZmVyLmlzQnVmZmVyYCBhbmQgYGlzLWJ1ZmZlcmAgKGluIFNhZmFyaSA1LTcpIHRvIGRldGVjdFxuLy8gQnVmZmVyIGluc3RhbmNlcy5cbkJ1ZmZlci5wcm90b3R5cGUuX2lzQnVmZmVyID0gdHJ1ZVxuXG5mdW5jdGlvbiBzd2FwIChiLCBuLCBtKSB7XG4gIHZhciBpID0gYltuXVxuICBiW25dID0gYlttXVxuICBiW21dID0gaVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAxNiA9IGZ1bmN0aW9uIHN3YXAxNiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgMiAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gMikge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDEpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMzIgPSBmdW5jdGlvbiBzd2FwMzIgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDQgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAzKVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyAyKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDY0ID0gZnVuY3Rpb24gc3dhcDY0ICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSA4ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA4KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgNylcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgNilcbiAgICBzd2FwKHRoaXMsIGkgKyAyLCBpICsgNSlcbiAgICBzd2FwKHRoaXMsIGkgKyAzLCBpICsgNClcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGggfCAwXG4gIGlmIChsZW5ndGggPT09IDApIHJldHVybiAnJ1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCAwLCBsZW5ndGgpXG4gIHJldHVybiBzbG93VG9TdHJpbmcuYXBwbHkodGhpcywgYXJndW1lbnRzKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyAoYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIGlmICh0aGlzID09PSBiKSByZXR1cm4gdHJ1ZVxuICByZXR1cm4gQnVmZmVyLmNvbXBhcmUodGhpcywgYikgPT09IDBcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCAoKSB7XG4gIHZhciBzdHIgPSAnJ1xuICB2YXIgbWF4ID0gZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFU1xuICBpZiAodGhpcy5sZW5ndGggPiAwKSB7XG4gICAgc3RyID0gdGhpcy50b1N0cmluZygnaGV4JywgMCwgbWF4KS5tYXRjaCgvLnsyfS9nKS5qb2luKCcgJylcbiAgICBpZiAodGhpcy5sZW5ndGggPiBtYXgpIHN0ciArPSAnIC4uLiAnXG4gIH1cbiAgcmV0dXJuICc8QnVmZmVyICcgKyBzdHIgKyAnPidcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAodGFyZ2V0LCBzdGFydCwgZW5kLCB0aGlzU3RhcnQsIHRoaXNFbmQpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGFyZ2V0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICB9XG5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmQgPSB0YXJnZXQgPyB0YXJnZXQubGVuZ3RoIDogMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNTdGFydCA9IDBcbiAgfVxuICBpZiAodGhpc0VuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc0VuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoc3RhcnQgPCAwIHx8IGVuZCA+IHRhcmdldC5sZW5ndGggfHwgdGhpc1N0YXJ0IDwgMCB8fCB0aGlzRW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCAmJiBzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCkge1xuICAgIHJldHVybiAtMVxuICB9XG4gIGlmIChzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMVxuICB9XG5cbiAgc3RhcnQgPj4+PSAwXG4gIGVuZCA+Pj49IDBcbiAgdGhpc1N0YXJ0ID4+Pj0gMFxuICB0aGlzRW5kID4+Pj0gMFxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQpIHJldHVybiAwXG5cbiAgdmFyIHggPSB0aGlzRW5kIC0gdGhpc1N0YXJ0XG4gIHZhciB5ID0gZW5kIC0gc3RhcnRcbiAgdmFyIGxlbiA9IE1hdGgubWluKHgsIHkpXG5cbiAgdmFyIHRoaXNDb3B5ID0gdGhpcy5zbGljZSh0aGlzU3RhcnQsIHRoaXNFbmQpXG4gIHZhciB0YXJnZXRDb3B5ID0gdGFyZ2V0LnNsaWNlKHN0YXJ0LCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgIGlmICh0aGlzQ29weVtpXSAhPT0gdGFyZ2V0Q29weVtpXSkge1xuICAgICAgeCA9IHRoaXNDb3B5W2ldXG4gICAgICB5ID0gdGFyZ2V0Q29weVtpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbi8vIEZpbmRzIGVpdGhlciB0aGUgZmlyc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0ID49IGBieXRlT2Zmc2V0YCxcbi8vIE9SIHRoZSBsYXN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA8PSBgYnl0ZU9mZnNldGAuXG4vL1xuLy8gQXJndW1lbnRzOlxuLy8gLSBidWZmZXIgLSBhIEJ1ZmZlciB0byBzZWFyY2hcbi8vIC0gdmFsIC0gYSBzdHJpbmcsIEJ1ZmZlciwgb3IgbnVtYmVyXG4vLyAtIGJ5dGVPZmZzZXQgLSBhbiBpbmRleCBpbnRvIGBidWZmZXJgOyB3aWxsIGJlIGNsYW1wZWQgdG8gYW4gaW50MzJcbi8vIC0gZW5jb2RpbmcgLSBhbiBvcHRpb25hbCBlbmNvZGluZywgcmVsZXZhbnQgaXMgdmFsIGlzIGEgc3RyaW5nXG4vLyAtIGRpciAtIHRydWUgZm9yIGluZGV4T2YsIGZhbHNlIGZvciBsYXN0SW5kZXhPZlxuZnVuY3Rpb24gYmlkaXJlY3Rpb25hbEluZGV4T2YgKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIC8vIEVtcHR5IGJ1ZmZlciBtZWFucyBubyBtYXRjaFxuICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIC0xXG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXRcbiAgaWYgKHR5cGVvZiBieXRlT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gYnl0ZU9mZnNldFxuICAgIGJ5dGVPZmZzZXQgPSAwXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA+IDB4N2ZmZmZmZmYpIHtcbiAgICBieXRlT2Zmc2V0ID0gMHg3ZmZmZmZmZlxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAtMHg4MDAwMDAwMCkge1xuICAgIGJ5dGVPZmZzZXQgPSAtMHg4MDAwMDAwMFxuICB9XG4gIGJ5dGVPZmZzZXQgPSArYnl0ZU9mZnNldCAgLy8gQ29lcmNlIHRvIE51bWJlci5cbiAgaWYgKGlzTmFOKGJ5dGVPZmZzZXQpKSB7XG4gICAgLy8gYnl0ZU9mZnNldDogaXQgaXQncyB1bmRlZmluZWQsIG51bGwsIE5hTiwgXCJmb29cIiwgZXRjLCBzZWFyY2ggd2hvbGUgYnVmZmVyXG4gICAgYnl0ZU9mZnNldCA9IGRpciA/IDAgOiAoYnVmZmVyLmxlbmd0aCAtIDEpXG4gIH1cblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldDogbmVnYXRpdmUgb2Zmc2V0cyBzdGFydCBmcm9tIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlclxuICBpZiAoYnl0ZU9mZnNldCA8IDApIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoICsgYnl0ZU9mZnNldFxuICBpZiAoYnl0ZU9mZnNldCA+PSBidWZmZXIubGVuZ3RoKSB7XG4gICAgaWYgKGRpcikgcmV0dXJuIC0xXG4gICAgZWxzZSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCAtIDFcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgMCkge1xuICAgIGlmIChkaXIpIGJ5dGVPZmZzZXQgPSAwXG4gICAgZWxzZSByZXR1cm4gLTFcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSB2YWxcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFsID0gQnVmZmVyLmZyb20odmFsLCBlbmNvZGluZylcbiAgfVxuXG4gIC8vIEZpbmFsbHksIHNlYXJjaCBlaXRoZXIgaW5kZXhPZiAoaWYgZGlyIGlzIHRydWUpIG9yIGxhc3RJbmRleE9mXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsKSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogbG9va2luZyBmb3IgZW1wdHkgc3RyaW5nL2J1ZmZlciBhbHdheXMgZmFpbHNcbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAweEZGIC8vIFNlYXJjaCBmb3IgYSBieXRlIHZhbHVlIFswLTI1NV1cbiAgICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiZcbiAgICAgICAgdHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmIChkaXIpIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgWyB2YWwgXSwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlcicpXG59XG5cbmZ1bmN0aW9uIGFycmF5SW5kZXhPZiAoYXJyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgdmFyIGluZGV4U2l6ZSA9IDFcbiAgdmFyIGFyckxlbmd0aCA9IGFyci5sZW5ndGhcbiAgdmFyIHZhbExlbmd0aCA9IHZhbC5sZW5ndGhcblxuICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgaWYgKGVuY29kaW5nID09PSAndWNzMicgfHwgZW5jb2RpbmcgPT09ICd1Y3MtMicgfHxcbiAgICAgICAgZW5jb2RpbmcgPT09ICd1dGYxNmxlJyB8fCBlbmNvZGluZyA9PT0gJ3V0Zi0xNmxlJykge1xuICAgICAgaWYgKGFyci5sZW5ndGggPCAyIHx8IHZhbC5sZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiAtMVxuICAgICAgfVxuICAgICAgaW5kZXhTaXplID0gMlxuICAgICAgYXJyTGVuZ3RoIC89IDJcbiAgICAgIHZhbExlbmd0aCAvPSAyXG4gICAgICBieXRlT2Zmc2V0IC89IDJcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWFkIChidWYsIGkpIHtcbiAgICBpZiAoaW5kZXhTaXplID09PSAxKSB7XG4gICAgICByZXR1cm4gYnVmW2ldXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBidWYucmVhZFVJbnQxNkJFKGkgKiBpbmRleFNpemUpXG4gICAgfVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGRpcikge1xuICAgIHZhciBmb3VuZEluZGV4ID0gLTFcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpIDwgYXJyTGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChyZWFkKGFyciwgaSkgPT09IHJlYWQodmFsLCBmb3VuZEluZGV4ID09PSAtMSA/IDAgOiBpIC0gZm91bmRJbmRleCkpIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggPT09IC0xKSBmb3VuZEluZGV4ID0gaVxuICAgICAgICBpZiAoaSAtIGZvdW5kSW5kZXggKyAxID09PSB2YWxMZW5ndGgpIHJldHVybiBmb3VuZEluZGV4ICogaW5kZXhTaXplXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZm91bmRJbmRleCAhPT0gLTEpIGkgLT0gaSAtIGZvdW5kSW5kZXhcbiAgICAgICAgZm91bmRJbmRleCA9IC0xXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChieXRlT2Zmc2V0ICsgdmFsTGVuZ3RoID4gYXJyTGVuZ3RoKSBieXRlT2Zmc2V0ID0gYXJyTGVuZ3RoIC0gdmFsTGVuZ3RoXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBmb3VuZCA9IHRydWVcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdmFsTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKHJlYWQoYXJyLCBpICsgaikgIT09IHJlYWQodmFsLCBqKSkge1xuICAgICAgICAgIGZvdW5kID0gZmFsc2VcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZm91bmQpIHJldHVybiBpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gdGhpcy5pbmRleE9mKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpICE9PSAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCB0cnVlKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmxhc3RJbmRleE9mID0gZnVuY3Rpb24gbGFzdEluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGZhbHNlKVxufVxuXG5mdW5jdGlvbiBoZXhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIG9mZnNldCA9IE51bWJlcihvZmZzZXQpIHx8IDBcbiAgdmFyIHJlbWFpbmluZyA9IGJ1Zi5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKVxuICAgIGlmIChsZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICAgIH1cbiAgfVxuXG4gIC8vIG11c3QgYmUgYW4gZXZlbiBudW1iZXIgb2YgZGlnaXRzXG4gIHZhciBzdHJMZW4gPSBzdHJpbmcubGVuZ3RoXG4gIGlmIChzdHJMZW4gJSAyICE9PSAwKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGhleCBzdHJpbmcnKVxuXG4gIGlmIChsZW5ndGggPiBzdHJMZW4gLyAyKSB7XG4gICAgbGVuZ3RoID0gc3RyTGVuIC8gMlxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgcGFyc2VkID0gcGFyc2VJbnQoc3RyaW5nLnN1YnN0cihpICogMiwgMiksIDE2KVxuICAgIGlmIChpc05hTihwYXJzZWQpKSByZXR1cm4gaVxuICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHBhcnNlZFxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIHV0ZjhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjhUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGFzY2lpV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihhc2NpaVRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gbGF0aW4xV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYXNjaWlXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGJhc2U2NFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYmFzZTY0VG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiB1Y3MyV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGYxNmxlVG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gd3JpdGUgKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKSB7XG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcpXG4gIGlmIChvZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBvZmZzZXRcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgb2Zmc2V0WywgbGVuZ3RoXVssIGVuY29kaW5nXSlcbiAgfSBlbHNlIGlmIChpc0Zpbml0ZShvZmZzZXQpKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICAgIGlmIChpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICBsZW5ndGggPSBsZW5ndGggfCAwXG4gICAgICBpZiAoZW5jb2RpbmcgPT09IHVuZGVmaW5lZCkgZW5jb2RpbmcgPSAndXRmOCdcbiAgICB9IGVsc2Uge1xuICAgICAgZW5jb2RpbmcgPSBsZW5ndGhcbiAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZFxuICAgIH1cbiAgLy8gbGVnYWN5IHdyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldCwgbGVuZ3RoKSAtIHJlbW92ZSBpbiB2MC4xM1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCdcbiAgICApXG4gIH1cblxuICB2YXIgcmVtYWluaW5nID0gdGhpcy5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IGxlbmd0aCA+IHJlbWFpbmluZykgbGVuZ3RoID0gcmVtYWluaW5nXG5cbiAgaWYgKChzdHJpbmcubGVuZ3RoID4gMCAmJiAobGVuZ3RoIDwgMCB8fCBvZmZzZXQgPCAwKSkgfHwgb2Zmc2V0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsYXRpbjFXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICAvLyBXYXJuaW5nOiBtYXhMZW5ndGggbm90IHRha2VuIGludG8gYWNjb3VudCBpbiBiYXNlNjRXcml0ZVxuICAgICAgICByZXR1cm4gYmFzZTY0V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHVjczJXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04gKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdCdWZmZXInLFxuICAgIGRhdGE6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2FyciB8fCB0aGlzLCAwKVxuICB9XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKHN0YXJ0ID09PSAwICYmIGVuZCA9PT0gYnVmLmxlbmd0aCkge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1Zi5zbGljZShzdGFydCwgZW5kKSlcbiAgfVxufVxuXG5mdW5jdGlvbiB1dGY4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG4gIHZhciByZXMgPSBbXVxuXG4gIHZhciBpID0gc3RhcnRcbiAgd2hpbGUgKGkgPCBlbmQpIHtcbiAgICB2YXIgZmlyc3RCeXRlID0gYnVmW2ldXG4gICAgdmFyIGNvZGVQb2ludCA9IG51bGxcbiAgICB2YXIgYnl0ZXNQZXJTZXF1ZW5jZSA9IChmaXJzdEJ5dGUgPiAweEVGKSA/IDRcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4REYpID8gM1xuICAgICAgOiAoZmlyc3RCeXRlID4gMHhCRikgPyAyXG4gICAgICA6IDFcblxuICAgIGlmIChpICsgYnl0ZXNQZXJTZXF1ZW5jZSA8PSBlbmQpIHtcbiAgICAgIHZhciBzZWNvbmRCeXRlLCB0aGlyZEJ5dGUsIGZvdXJ0aEJ5dGUsIHRlbXBDb2RlUG9pbnRcblxuICAgICAgc3dpdGNoIChieXRlc1BlclNlcXVlbmNlKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBpZiAoZmlyc3RCeXRlIDwgMHg4MCkge1xuICAgICAgICAgICAgY29kZVBvaW50ID0gZmlyc3RCeXRlXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4MUYpIDw8IDB4NiB8IChzZWNvbmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3Rikge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweEMgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4NiB8ICh0aGlyZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGRiAmJiAodGVtcENvZGVQb2ludCA8IDB4RDgwMCB8fCB0ZW1wQ29kZVBvaW50ID4gMHhERkZGKSkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBmb3VydGhCeXRlID0gYnVmW2kgKyAzXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAoZm91cnRoQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHgxMiB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHhDIHwgKHRoaXJkQnl0ZSAmIDB4M0YpIDw8IDB4NiB8IChmb3VydGhCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHhGRkZGICYmIHRlbXBDb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb2RlUG9pbnQgPT09IG51bGwpIHtcbiAgICAgIC8vIHdlIGRpZCBub3QgZ2VuZXJhdGUgYSB2YWxpZCBjb2RlUG9pbnQgc28gaW5zZXJ0IGFcbiAgICAgIC8vIHJlcGxhY2VtZW50IGNoYXIgKFUrRkZGRCkgYW5kIGFkdmFuY2Ugb25seSAxIGJ5dGVcbiAgICAgIGNvZGVQb2ludCA9IDB4RkZGRFxuICAgICAgYnl0ZXNQZXJTZXF1ZW5jZSA9IDFcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA+IDB4RkZGRikge1xuICAgICAgLy8gZW5jb2RlIHRvIHV0ZjE2IChzdXJyb2dhdGUgcGFpciBkYW5jZSlcbiAgICAgIGNvZGVQb2ludCAtPSAweDEwMDAwXG4gICAgICByZXMucHVzaChjb2RlUG9pbnQgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApXG4gICAgICBjb2RlUG9pbnQgPSAweERDMDAgfCBjb2RlUG9pbnQgJiAweDNGRlxuICAgIH1cblxuICAgIHJlcy5wdXNoKGNvZGVQb2ludClcbiAgICBpICs9IGJ5dGVzUGVyU2VxdWVuY2VcbiAgfVxuXG4gIHJldHVybiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkocmVzKVxufVxuXG4vLyBCYXNlZCBvbiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMjc0NzI3Mi82ODA3NDIsIHRoZSBicm93c2VyIHdpdGhcbi8vIHRoZSBsb3dlc3QgbGltaXQgaXMgQ2hyb21lLCB3aXRoIDB4MTAwMDAgYXJncy5cbi8vIFdlIGdvIDEgbWFnbml0dWRlIGxlc3MsIGZvciBzYWZldHlcbnZhciBNQVhfQVJHVU1FTlRTX0xFTkdUSCA9IDB4MTAwMFxuXG5mdW5jdGlvbiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkgKGNvZGVQb2ludHMpIHtcbiAgdmFyIGxlbiA9IGNvZGVQb2ludHMubGVuZ3RoXG4gIGlmIChsZW4gPD0gTUFYX0FSR1VNRU5UU19MRU5HVEgpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGNvZGVQb2ludHMpIC8vIGF2b2lkIGV4dHJhIHNsaWNlKClcbiAgfVxuXG4gIC8vIERlY29kZSBpbiBjaHVua3MgdG8gYXZvaWQgXCJjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIi5cbiAgdmFyIHJlcyA9ICcnXG4gIHZhciBpID0gMFxuICB3aGlsZSAoaSA8IGxlbikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFxuICAgICAgU3RyaW5nLFxuICAgICAgY29kZVBvaW50cy5zbGljZShpLCBpICs9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKVxuICAgIClcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldICYgMHg3RilcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGxhdGluMVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGhleFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGhcblxuICBpZiAoIXN0YXJ0IHx8IHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIGlmICghZW5kIHx8IGVuZCA8IDAgfHwgZW5kID4gbGVuKSBlbmQgPSBsZW5cblxuICB2YXIgb3V0ID0gJydcbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICBvdXQgKz0gdG9IZXgoYnVmW2ldKVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGJ5dGVzID0gYnVmLnNsaWNlKHN0YXJ0LCBlbmQpXG4gIHZhciByZXMgPSAnJ1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0gKyBieXRlc1tpICsgMV0gKiAyNTYpXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIHN0YXJ0ID0gfn5zdGFydFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IH5+ZW5kXG5cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ICs9IGxlblxuICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMFxuICB9IGVsc2UgaWYgKHN0YXJ0ID4gbGVuKSB7XG4gICAgc3RhcnQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCAwKSB7XG4gICAgZW5kICs9IGxlblxuICAgIGlmIChlbmQgPCAwKSBlbmQgPSAwXG4gIH0gZWxzZSBpZiAoZW5kID4gbGVuKSB7XG4gICAgZW5kID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgdmFyIG5ld0J1ZlxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBuZXdCdWYgPSB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpXG4gICAgbmV3QnVmLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICB2YXIgc2xpY2VMZW4gPSBlbmQgLSBzdGFydFxuICAgIG5ld0J1ZiA9IG5ldyBCdWZmZXIoc2xpY2VMZW4sIHVuZGVmaW5lZClcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWNlTGVuOyArK2kpIHtcbiAgICAgIG5ld0J1ZltpXSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdCdWZcbn1cblxuLypcbiAqIE5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYnVmZmVyIGlzbid0IHRyeWluZyB0byB3cml0ZSBvdXQgb2YgYm91bmRzLlxuICovXG5mdW5jdGlvbiBjaGVja09mZnNldCAob2Zmc2V0LCBleHQsIGxlbmd0aCkge1xuICBpZiAoKG9mZnNldCAlIDEpICE9PSAwIHx8IG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdvZmZzZXQgaXMgbm90IHVpbnQnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gbGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRMRSA9IGZ1bmN0aW9uIHJlYWRVSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRCRSA9IGZ1bmN0aW9uIHJlYWRVSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG4gIH1cblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdXG4gIHZhciBtdWwgPSAxXG4gIHdoaWxlIChieXRlTGVuZ3RoID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDggPSBmdW5jdGlvbiByZWFkVUludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2QkUgPSBmdW5jdGlvbiByZWFkVUludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgOCkgfCB0aGlzW29mZnNldCArIDFdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkxFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICgodGhpc1tvZmZzZXRdKSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikpICtcbiAgICAgICh0aGlzW29mZnNldCArIDNdICogMHgxMDAwMDAwKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdICogMHgxMDAwMDAwKSArXG4gICAgKCh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgIHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludExFID0gZnVuY3Rpb24gcmVhZEludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludEJFID0gZnVuY3Rpb24gcmVhZEludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoXG4gIHZhciBtdWwgPSAxXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0taV1cbiAgd2hpbGUgKGkgPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1pXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDggPSBmdW5jdGlvbiByZWFkSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICBpZiAoISh0aGlzW29mZnNldF0gJiAweDgwKSkgcmV0dXJuICh0aGlzW29mZnNldF0pXG4gIHJldHVybiAoKDB4ZmYgLSB0aGlzW29mZnNldF0gKyAxKSAqIC0xKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkxFID0gZnVuY3Rpb24gcmVhZEludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIDFdIHwgKHRoaXNbb2Zmc2V0XSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyTEUgPSBmdW5jdGlvbiByZWFkSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdKSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10gPDwgMjQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyQkUgPSBmdW5jdGlvbiByZWFkSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDI0KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0TEUgPSBmdW5jdGlvbiByZWFkRmxvYXRMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0QkUgPSBmdW5jdGlvbiByZWFkRmxvYXRCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVMRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgNTIsIDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUJFID0gZnVuY3Rpb24gcmVhZERvdWJsZUJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgNTIsIDgpXG59XG5cbmZ1bmN0aW9uIGNoZWNrSW50IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJidWZmZXJcIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJylcbiAgaWYgKHZhbHVlID4gbWF4IHx8IHZhbHVlIDwgbWluKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50OCA9IGZ1bmN0aW9uIHdyaXRlVUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHhmZiwgMClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQxNiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmYgKyB2YWx1ZSArIDFcbiAgZm9yICh2YXIgaSA9IDAsIGogPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gb2Zmc2V0LCAyKTsgaSA8IGo7ICsraSkge1xuICAgIGJ1ZltvZmZzZXQgKyBpXSA9ICh2YWx1ZSAmICgweGZmIDw8ICg4ICogKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkpKSkgPj4+XG4gICAgICAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSAqIDhcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQzMiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgNCk7IGkgPCBqOyArK2kpIHtcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSAodmFsdWUgPj4+IChsaXR0bGVFbmRpYW4gPyBpIDogMyAtIGkpICogOCkgJiAweGZmXG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50TEUgPSBmdW5jdGlvbiB3cml0ZUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gMFxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgLSAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50QkUgPSBmdW5jdGlvbiB3cml0ZUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IDBcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgKyAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50OCA9IGZ1bmN0aW9uIHdyaXRlSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweDdmLCAtMHg4MClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmYgKyB2YWx1ZSArIDFcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuZnVuY3Rpb24gY2hlY2tJRUVFNzU0IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxuICBpZiAob2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRmxvYXQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgNCwgMy40MDI4MjM0NjYzODUyODg2ZSszOCwgLTMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgMjMsIDQpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdExFID0gZnVuY3Rpb24gd3JpdGVGbG9hdExFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0QkUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuZnVuY3Rpb24gd3JpdGVEb3VibGUgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgOCwgMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgsIC0xLjc5NzY5MzEzNDg2MjMxNTdFKzMwOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCA1MiwgOClcbiAgcmV0dXJuIG9mZnNldCArIDhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUxFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlQkUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG4vLyBjb3B5KHRhcmdldEJ1ZmZlciwgdGFyZ2V0U3RhcnQ9MCwgc291cmNlU3RhcnQ9MCwgc291cmNlRW5kPWJ1ZmZlci5sZW5ndGgpXG5CdWZmZXIucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5ICh0YXJnZXQsIHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKSB7XG4gIGlmICghc3RhcnQpIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCAmJiBlbmQgIT09IDApIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXRTdGFydCA+PSB0YXJnZXQubGVuZ3RoKSB0YXJnZXRTdGFydCA9IHRhcmdldC5sZW5ndGhcbiAgaWYgKCF0YXJnZXRTdGFydCkgdGFyZ2V0U3RhcnQgPSAwXG4gIGlmIChlbmQgPiAwICYmIGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIC8vIENvcHkgMCBieXRlczsgd2UncmUgZG9uZVxuICBpZiAoZW5kID09PSBzdGFydCkgcmV0dXJuIDBcbiAgaWYgKHRhcmdldC5sZW5ndGggPT09IDAgfHwgdGhpcy5sZW5ndGggPT09IDApIHJldHVybiAwXG5cbiAgLy8gRmF0YWwgZXJyb3IgY29uZGl0aW9uc1xuICBpZiAodGFyZ2V0U3RhcnQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3RhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICB9XG4gIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgaWYgKGVuZCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcycpXG5cbiAgLy8gQXJlIHdlIG9vYj9cbiAgaWYgKGVuZCA+IHRoaXMubGVuZ3RoKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0IDwgZW5kIC0gc3RhcnQpIHtcbiAgICBlbmQgPSB0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgKyBzdGFydFxuICB9XG5cbiAgdmFyIGxlbiA9IGVuZCAtIHN0YXJ0XG4gIHZhciBpXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCAmJiBzdGFydCA8IHRhcmdldFN0YXJ0ICYmIHRhcmdldFN0YXJ0IDwgZW5kKSB7XG4gICAgLy8gZGVzY2VuZGluZyBjb3B5IGZyb20gZW5kXG4gICAgZm9yIChpID0gbGVuIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2UgaWYgKGxlbiA8IDEwMDAgfHwgIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gYXNjZW5kaW5nIGNvcHkgZnJvbSBzdGFydFxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoXG4gICAgICB0YXJnZXQsXG4gICAgICB0aGlzLnN1YmFycmF5KHN0YXJ0LCBzdGFydCArIGxlbiksXG4gICAgICB0YXJnZXRTdGFydFxuICAgIClcbiAgfVxuXG4gIHJldHVybiBsZW5cbn1cblxuLy8gVXNhZ2U6XG4vLyAgICBidWZmZXIuZmlsbChudW1iZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKGJ1ZmZlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoc3RyaW5nWywgb2Zmc2V0WywgZW5kXV1bLCBlbmNvZGluZ10pXG5CdWZmZXIucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbiBmaWxsICh2YWwsIHN0YXJ0LCBlbmQsIGVuY29kaW5nKSB7XG4gIC8vIEhhbmRsZSBzdHJpbmcgY2FzZXM6XG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIGlmICh0eXBlb2Ygc3RhcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IHN0YXJ0XG4gICAgICBzdGFydCA9IDBcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZW5kID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBlbmRcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfVxuICAgIGlmICh2YWwubGVuZ3RoID09PSAxKSB7XG4gICAgICB2YXIgY29kZSA9IHZhbC5jaGFyQ29kZUF0KDApXG4gICAgICBpZiAoY29kZSA8IDI1Nikge1xuICAgICAgICB2YWwgPSBjb2RlXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2VuY29kaW5nIG11c3QgYmUgYSBzdHJpbmcnKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJyAmJiAhQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMjU1XG4gIH1cblxuICAvLyBJbnZhbGlkIHJhbmdlcyBhcmUgbm90IHNldCB0byBhIGRlZmF1bHQsIHNvIGNhbiByYW5nZSBjaGVjayBlYXJseS5cbiAgaWYgKHN0YXJ0IDwgMCB8fCB0aGlzLmxlbmd0aCA8IHN0YXJ0IHx8IHRoaXMubGVuZ3RoIDwgZW5kKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ091dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHN0YXJ0ID0gc3RhcnQgPj4+IDBcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyB0aGlzLmxlbmd0aCA6IGVuZCA+Pj4gMFxuXG4gIGlmICghdmFsKSB2YWwgPSAwXG5cbiAgdmFyIGlcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgdGhpc1tpXSA9IHZhbFxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgYnl0ZXMgPSBCdWZmZXIuaXNCdWZmZXIodmFsKVxuICAgICAgPyB2YWxcbiAgICAgIDogdXRmOFRvQnl0ZXMobmV3IEJ1ZmZlcih2YWwsIGVuY29kaW5nKS50b1N0cmluZygpKVxuICAgIHZhciBsZW4gPSBieXRlcy5sZW5ndGhcbiAgICBmb3IgKGkgPSAwOyBpIDwgZW5kIC0gc3RhcnQ7ICsraSkge1xuICAgICAgdGhpc1tpICsgc3RhcnRdID0gYnl0ZXNbaSAlIGxlbl1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpc1xufVxuXG4vLyBIRUxQRVIgRlVOQ1RJT05TXG4vLyA9PT09PT09PT09PT09PT09XG5cbnZhciBJTlZBTElEX0JBU0U2NF9SRSA9IC9bXitcXC8wLTlBLVphLXotX10vZ1xuXG5mdW5jdGlvbiBiYXNlNjRjbGVhbiAoc3RyKSB7XG4gIC8vIE5vZGUgc3RyaXBzIG91dCBpbnZhbGlkIGNoYXJhY3RlcnMgbGlrZSBcXG4gYW5kIFxcdCBmcm9tIHRoZSBzdHJpbmcsIGJhc2U2NC1qcyBkb2VzIG5vdFxuICBzdHIgPSBzdHJpbmd0cmltKHN0cikucmVwbGFjZShJTlZBTElEX0JBU0U2NF9SRSwgJycpXG4gIC8vIE5vZGUgY29udmVydHMgc3RyaW5ncyB3aXRoIGxlbmd0aCA8IDIgdG8gJydcbiAgaWYgKHN0ci5sZW5ndGggPCAyKSByZXR1cm4gJydcbiAgLy8gTm9kZSBhbGxvd3MgZm9yIG5vbi1wYWRkZWQgYmFzZTY0IHN0cmluZ3MgKG1pc3NpbmcgdHJhaWxpbmcgPT09KSwgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHdoaWxlIChzdHIubGVuZ3RoICUgNCAhPT0gMCkge1xuICAgIHN0ciA9IHN0ciArICc9J1xuICB9XG4gIHJldHVybiBzdHJcbn1cblxuZnVuY3Rpb24gc3RyaW5ndHJpbSAoc3RyKSB7XG4gIGlmIChzdHIudHJpbSkgcmV0dXJuIHN0ci50cmltKClcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJylcbn1cblxuZnVuY3Rpb24gdG9IZXggKG4pIHtcbiAgaWYgKG4gPCAxNikgcmV0dXJuICcwJyArIG4udG9TdHJpbmcoMTYpXG4gIHJldHVybiBuLnRvU3RyaW5nKDE2KVxufVxuXG5mdW5jdGlvbiB1dGY4VG9CeXRlcyAoc3RyaW5nLCB1bml0cykge1xuICB1bml0cyA9IHVuaXRzIHx8IEluZmluaXR5XG4gIHZhciBjb2RlUG9pbnRcbiAgdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGhcbiAgdmFyIGxlYWRTdXJyb2dhdGUgPSBudWxsXG4gIHZhciBieXRlcyA9IFtdXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGNvZGVQb2ludCA9IHN0cmluZy5jaGFyQ29kZUF0KGkpXG5cbiAgICAvLyBpcyBzdXJyb2dhdGUgY29tcG9uZW50XG4gICAgaWYgKGNvZGVQb2ludCA+IDB4RDdGRiAmJiBjb2RlUG9pbnQgPCAweEUwMDApIHtcbiAgICAgIC8vIGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoIWxlYWRTdXJyb2dhdGUpIHtcbiAgICAgICAgLy8gbm8gbGVhZCB5ZXRcbiAgICAgICAgaWYgKGNvZGVQb2ludCA+IDB4REJGRikge1xuICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgdHJhaWxcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9IGVsc2UgaWYgKGkgKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICAvLyB1bnBhaXJlZCBsZWFkXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHZhbGlkIGxlYWRcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIDIgbGVhZHMgaW4gYSByb3dcbiAgICAgIGlmIChjb2RlUG9pbnQgPCAweERDMDApIHtcbiAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gdmFsaWQgc3Vycm9nYXRlIHBhaXJcbiAgICAgIGNvZGVQb2ludCA9IChsZWFkU3Vycm9nYXRlIC0gMHhEODAwIDw8IDEwIHwgY29kZVBvaW50IC0gMHhEQzAwKSArIDB4MTAwMDBcbiAgICB9IGVsc2UgaWYgKGxlYWRTdXJyb2dhdGUpIHtcbiAgICAgIC8vIHZhbGlkIGJtcCBjaGFyLCBidXQgbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgIH1cblxuICAgIGxlYWRTdXJyb2dhdGUgPSBudWxsXG5cbiAgICAvLyBlbmNvZGUgdXRmOFxuICAgIGlmIChjb2RlUG9pbnQgPCAweDgwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDEpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goY29kZVBvaW50KVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHg4MDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiB8IDB4QzAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDMpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgfCAweEUwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSA0KSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHgxMiB8IDB4RjAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29kZSBwb2ludCcpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpVG9CeXRlcyAoc3RyKSB7XG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIC8vIE5vZGUncyBjb2RlIHNlZW1zIHRvIGJlIGRvaW5nIHRoaXMgYW5kIG5vdCAmIDB4N0YuLlxuICAgIGJ5dGVBcnJheS5wdXNoKHN0ci5jaGFyQ29kZUF0KGkpICYgMHhGRilcbiAgfVxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVUb0J5dGVzIChzdHIsIHVuaXRzKSB7XG4gIHZhciBjLCBoaSwgbG9cbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG5cbiAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSlcbiAgICBoaSA9IGMgPj4gOFxuICAgIGxvID0gYyAlIDI1NlxuICAgIGJ5dGVBcnJheS5wdXNoKGxvKVxuICAgIGJ5dGVBcnJheS5wdXNoKGhpKVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiBiYXNlNjRUb0J5dGVzIChzdHIpIHtcbiAgcmV0dXJuIGJhc2U2NC50b0J5dGVBcnJheShiYXNlNjRjbGVhbihzdHIpKVxufVxuXG5mdW5jdGlvbiBibGl0QnVmZmVyIChzcmMsIGRzdCwgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGlmICgoaSArIG9mZnNldCA+PSBkc3QubGVuZ3RoKSB8fCAoaSA+PSBzcmMubGVuZ3RoKSkgYnJlYWtcbiAgICBkc3RbaSArIG9mZnNldF0gPSBzcmNbaV1cbiAgfVxuICByZXR1cm4gaVxufVxuXG5mdW5jdGlvbiBpc25hbiAodmFsKSB7XG4gIHJldHVybiB2YWwgIT09IHZhbCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxufVxuIiwiLyohIGllZWU3NTQuIEJTRC0zLUNsYXVzZSBMaWNlbnNlLiBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmcvb3BlbnNvdXJjZT4gKi9cbmV4cG9ydHMucmVhZCA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtXG4gIHZhciBlTGVuID0gKG5CeXRlcyAqIDgpIC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBuQml0cyA9IC03XG4gIHZhciBpID0gaXNMRSA/IChuQnl0ZXMgLSAxKSA6IDBcbiAgdmFyIGQgPSBpc0xFID8gLTEgOiAxXG4gIHZhciBzID0gYnVmZmVyW29mZnNldCArIGldXG5cbiAgaSArPSBkXG5cbiAgZSA9IHMgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgcyA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gZUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBlID0gKGUgKiAyNTYpICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgbSA9IGUgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgZSA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gbUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gKG0gKiAyNTYpICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgaWYgKGUgPT09IDApIHtcbiAgICBlID0gMSAtIGVCaWFzXG4gIH0gZWxzZSBpZiAoZSA9PT0gZU1heCkge1xuICAgIHJldHVybiBtID8gTmFOIDogKChzID8gLTEgOiAxKSAqIEluZmluaXR5KVxuICB9IGVsc2Uge1xuICAgIG0gPSBtICsgTWF0aC5wb3coMiwgbUxlbilcbiAgICBlID0gZSAtIGVCaWFzXG4gIH1cbiAgcmV0dXJuIChzID8gLTEgOiAxKSAqIG0gKiBNYXRoLnBvdygyLCBlIC0gbUxlbilcbn1cblxuZXhwb3J0cy53cml0ZSA9IGZ1bmN0aW9uIChidWZmZXIsIHZhbHVlLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbSwgY1xuICB2YXIgZUxlbiA9IChuQnl0ZXMgKiA4KSAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgcnQgPSAobUxlbiA9PT0gMjMgPyBNYXRoLnBvdygyLCAtMjQpIC0gTWF0aC5wb3coMiwgLTc3KSA6IDApXG4gIHZhciBpID0gaXNMRSA/IDAgOiAobkJ5dGVzIC0gMSlcbiAgdmFyIGQgPSBpc0xFID8gMSA6IC0xXG4gIHZhciBzID0gdmFsdWUgPCAwIHx8ICh2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPCAwKSA/IDEgOiAwXG5cbiAgdmFsdWUgPSBNYXRoLmFicyh2YWx1ZSlcblxuICBpZiAoaXNOYU4odmFsdWUpIHx8IHZhbHVlID09PSBJbmZpbml0eSkge1xuICAgIG0gPSBpc05hTih2YWx1ZSkgPyAxIDogMFxuICAgIGUgPSBlTWF4XG4gIH0gZWxzZSB7XG4gICAgZSA9IE1hdGguZmxvb3IoTWF0aC5sb2codmFsdWUpIC8gTWF0aC5MTjIpXG4gICAgaWYgKHZhbHVlICogKGMgPSBNYXRoLnBvdygyLCAtZSkpIDwgMSkge1xuICAgICAgZS0tXG4gICAgICBjICo9IDJcbiAgICB9XG4gICAgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICB2YWx1ZSArPSBydCAvIGNcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgKz0gcnQgKiBNYXRoLnBvdygyLCAxIC0gZUJpYXMpXG4gICAgfVxuICAgIGlmICh2YWx1ZSAqIGMgPj0gMikge1xuICAgICAgZSsrXG4gICAgICBjIC89IDJcbiAgICB9XG5cbiAgICBpZiAoZSArIGVCaWFzID49IGVNYXgpIHtcbiAgICAgIG0gPSAwXG4gICAgICBlID0gZU1heFxuICAgIH0gZWxzZSBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIG0gPSAoKHZhbHVlICogYykgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gZSArIGVCaWFzXG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIE1hdGgucG93KDIsIGVCaWFzIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IDBcbiAgICB9XG4gIH1cblxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBtICYgMHhmZiwgaSArPSBkLCBtIC89IDI1NiwgbUxlbiAtPSA4KSB7fVxuXG4gIGUgPSAoZSA8PCBtTGVuKSB8IG1cbiAgZUxlbiArPSBtTGVuXG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjhcbn1cbiIsInZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKGFycikge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChhcnIpID09ICdbb2JqZWN0IEFycmF5XSc7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBMb25nO1xyXG5cclxuLyoqXHJcbiAqIHdhc20gb3B0aW1pemF0aW9ucywgdG8gZG8gbmF0aXZlIGk2NCBtdWx0aXBsaWNhdGlvbiBhbmQgZGl2aWRlXHJcbiAqL1xyXG52YXIgd2FzbSA9IG51bGw7XHJcblxyXG50cnkge1xyXG4gIHdhc20gPSBuZXcgV2ViQXNzZW1ibHkuSW5zdGFuY2UobmV3IFdlYkFzc2VtYmx5Lk1vZHVsZShuZXcgVWludDhBcnJheShbXHJcbiAgICAwLCA5NywgMTE1LCAxMDksIDEsIDAsIDAsIDAsIDEsIDEzLCAyLCA5NiwgMCwgMSwgMTI3LCA5NiwgNCwgMTI3LCAxMjcsIDEyNywgMTI3LCAxLCAxMjcsIDMsIDcsIDYsIDAsIDEsIDEsIDEsIDEsIDEsIDYsIDYsIDEsIDEyNywgMSwgNjUsIDAsIDExLCA3LCA1MCwgNiwgMywgMTA5LCAxMTcsIDEwOCwgMCwgMSwgNSwgMTAwLCAxMDUsIDExOCwgOTUsIDExNSwgMCwgMiwgNSwgMTAwLCAxMDUsIDExOCwgOTUsIDExNywgMCwgMywgNSwgMTE0LCAxMDEsIDEwOSwgOTUsIDExNSwgMCwgNCwgNSwgMTE0LCAxMDEsIDEwOSwgOTUsIDExNywgMCwgNSwgOCwgMTAzLCAxMDEsIDExNiwgOTUsIDEwNCwgMTA1LCAxMDMsIDEwNCwgMCwgMCwgMTAsIDE5MSwgMSwgNiwgNCwgMCwgMzUsIDAsIDExLCAzNiwgMSwgMSwgMTI2LCAzMiwgMCwgMTczLCAzMiwgMSwgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAzMiwgMiwgMTczLCAzMiwgMywgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAxMjYsIDM0LCA0LCA2NiwgMzIsIDEzNSwgMTY3LCAzNiwgMCwgMzIsIDQsIDE2NywgMTEsIDM2LCAxLCAxLCAxMjYsIDMyLCAwLCAxNzMsIDMyLCAxLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDMyLCAyLCAxNzMsIDMyLCAzLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDEyNywgMzQsIDQsIDY2LCAzMiwgMTM1LCAxNjcsIDM2LCAwLCAzMiwgNCwgMTY3LCAxMSwgMzYsIDEsIDEsIDEyNiwgMzIsIDAsIDE3MywgMzIsIDEsIDE3MywgNjYsIDMyLCAxMzQsIDEzMiwgMzIsIDIsIDE3MywgMzIsIDMsIDE3MywgNjYsIDMyLCAxMzQsIDEzMiwgMTI4LCAzNCwgNCwgNjYsIDMyLCAxMzUsIDE2NywgMzYsIDAsIDMyLCA0LCAxNjcsIDExLCAzNiwgMSwgMSwgMTI2LCAzMiwgMCwgMTczLCAzMiwgMSwgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAzMiwgMiwgMTczLCAzMiwgMywgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAxMjksIDM0LCA0LCA2NiwgMzIsIDEzNSwgMTY3LCAzNiwgMCwgMzIsIDQsIDE2NywgMTEsIDM2LCAxLCAxLCAxMjYsIDMyLCAwLCAxNzMsIDMyLCAxLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDMyLCAyLCAxNzMsIDMyLCAzLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDEzMCwgMzQsIDQsIDY2LCAzMiwgMTM1LCAxNjcsIDM2LCAwLCAzMiwgNCwgMTY3LCAxMVxyXG4gIF0pKSwge30pLmV4cG9ydHM7XHJcbn0gY2F0Y2ggKGUpIHtcclxuICAvLyBubyB3YXNtIHN1cHBvcnQgOihcclxufVxyXG5cclxuLyoqXHJcbiAqIENvbnN0cnVjdHMgYSA2NCBiaXQgdHdvJ3MtY29tcGxlbWVudCBpbnRlZ2VyLCBnaXZlbiBpdHMgbG93IGFuZCBoaWdoIDMyIGJpdCB2YWx1ZXMgYXMgKnNpZ25lZCogaW50ZWdlcnMuXHJcbiAqICBTZWUgdGhlIGZyb20qIGZ1bmN0aW9ucyBiZWxvdyBmb3IgbW9yZSBjb252ZW5pZW50IHdheXMgb2YgY29uc3RydWN0aW5nIExvbmdzLlxyXG4gKiBAZXhwb3J0cyBMb25nXHJcbiAqIEBjbGFzcyBBIExvbmcgY2xhc3MgZm9yIHJlcHJlc2VudGluZyBhIDY0IGJpdCB0d28ncy1jb21wbGVtZW50IGludGVnZXIgdmFsdWUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBsb3cgVGhlIGxvdyAoc2lnbmVkKSAzMiBiaXRzIG9mIHRoZSBsb25nXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBoaWdoIFRoZSBoaWdoIChzaWduZWQpIDMyIGJpdHMgb2YgdGhlIGxvbmdcclxuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxyXG4gKiBAY29uc3RydWN0b3JcclxuICovXHJcbmZ1bmN0aW9uIExvbmcobG93LCBoaWdoLCB1bnNpZ25lZCkge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGxvdyAzMiBiaXRzIGFzIGEgc2lnbmVkIHZhbHVlLlxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xyXG4gICAgdGhpcy5sb3cgPSBsb3cgfCAwO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGhpZ2ggMzIgYml0cyBhcyBhIHNpZ25lZCB2YWx1ZS5cclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cclxuICAgIHRoaXMuaGlnaCA9IGhpZ2ggfCAwO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hldGhlciB1bnNpZ25lZCBvciBub3QuXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgdGhpcy51bnNpZ25lZCA9ICEhdW5zaWduZWQ7XHJcbn1cclxuXHJcbi8vIFRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBhIGxvbmcgaXMgdGhlIHR3byBnaXZlbiBzaWduZWQsIDMyLWJpdCB2YWx1ZXMuXHJcbi8vIFdlIHVzZSAzMi1iaXQgcGllY2VzIGJlY2F1c2UgdGhlc2UgYXJlIHRoZSBzaXplIG9mIGludGVnZXJzIG9uIHdoaWNoXHJcbi8vIEphdmFzY3JpcHQgcGVyZm9ybXMgYml0LW9wZXJhdGlvbnMuICBGb3Igb3BlcmF0aW9ucyBsaWtlIGFkZGl0aW9uIGFuZFxyXG4vLyBtdWx0aXBsaWNhdGlvbiwgd2Ugc3BsaXQgZWFjaCBudW1iZXIgaW50byAxNiBiaXQgcGllY2VzLCB3aGljaCBjYW4gZWFzaWx5IGJlXHJcbi8vIG11bHRpcGxpZWQgd2l0aGluIEphdmFzY3JpcHQncyBmbG9hdGluZy1wb2ludCByZXByZXNlbnRhdGlvbiB3aXRob3V0IG92ZXJmbG93XHJcbi8vIG9yIGNoYW5nZSBpbiBzaWduLlxyXG4vL1xyXG4vLyBJbiB0aGUgYWxnb3JpdGhtcyBiZWxvdywgd2UgZnJlcXVlbnRseSByZWR1Y2UgdGhlIG5lZ2F0aXZlIGNhc2UgdG8gdGhlXHJcbi8vIHBvc2l0aXZlIGNhc2UgYnkgbmVnYXRpbmcgdGhlIGlucHV0KHMpIGFuZCB0aGVuIHBvc3QtcHJvY2Vzc2luZyB0aGUgcmVzdWx0LlxyXG4vLyBOb3RlIHRoYXQgd2UgbXVzdCBBTFdBWVMgY2hlY2sgc3BlY2lhbGx5IHdoZXRoZXIgdGhvc2UgdmFsdWVzIGFyZSBNSU5fVkFMVUVcclxuLy8gKC0yXjYzKSBiZWNhdXNlIC1NSU5fVkFMVUUgPT0gTUlOX1ZBTFVFIChzaW5jZSAyXjYzIGNhbm5vdCBiZSByZXByZXNlbnRlZCBhc1xyXG4vLyBhIHBvc2l0aXZlIG51bWJlciwgaXQgb3ZlcmZsb3dzIGJhY2sgaW50byBhIG5lZ2F0aXZlKS4gIE5vdCBoYW5kbGluZyB0aGlzXHJcbi8vIGNhc2Ugd291bGQgb2Z0ZW4gcmVzdWx0IGluIGluZmluaXRlIHJlY3Vyc2lvbi5cclxuLy9cclxuLy8gQ29tbW9uIGNvbnN0YW50IHZhbHVlcyBaRVJPLCBPTkUsIE5FR19PTkUsIGV0Yy4gYXJlIGRlZmluZWQgYmVsb3cgdGhlIGZyb20qXHJcbi8vIG1ldGhvZHMgb24gd2hpY2ggdGhleSBkZXBlbmQuXHJcblxyXG4vKipcclxuICogQW4gaW5kaWNhdG9yIHVzZWQgdG8gcmVsaWFibHkgZGV0ZXJtaW5lIGlmIGFuIG9iamVjdCBpcyBhIExvbmcgb3Igbm90LlxyXG4gKiBAdHlwZSB7Ym9vbGVhbn1cclxuICogQGNvbnN0XHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5Mb25nLnByb3RvdHlwZS5fX2lzTG9uZ19fO1xyXG5cclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KExvbmcucHJvdG90eXBlLCBcIl9faXNMb25nX19cIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxuXHJcbi8qKlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHsqfSBvYmogT2JqZWN0XHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKiBAaW5uZXJcclxuICovXHJcbmZ1bmN0aW9uIGlzTG9uZyhvYmopIHtcclxuICAgIHJldHVybiAob2JqICYmIG9ialtcIl9faXNMb25nX19cIl0pID09PSB0cnVlO1xyXG59XHJcblxyXG4vKipcclxuICogVGVzdHMgaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgYSBMb25nLlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHsqfSBvYmogT2JqZWN0XHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxuTG9uZy5pc0xvbmcgPSBpc0xvbmc7XHJcblxyXG4vKipcclxuICogQSBjYWNoZSBvZiB0aGUgTG9uZyByZXByZXNlbnRhdGlvbnMgb2Ygc21hbGwgaW50ZWdlciB2YWx1ZXMuXHJcbiAqIEB0eXBlIHshT2JqZWN0fVxyXG4gKiBAaW5uZXJcclxuICovXHJcbnZhciBJTlRfQ0FDSEUgPSB7fTtcclxuXHJcbi8qKlxyXG4gKiBBIGNhY2hlIG9mIHRoZSBMb25nIHJlcHJlc2VudGF0aW9ucyBvZiBzbWFsbCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlcy5cclxuICogQHR5cGUgeyFPYmplY3R9XHJcbiAqIEBpbm5lclxyXG4gKi9cclxudmFyIFVJTlRfQ0FDSEUgPSB7fTtcclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcclxuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWRcclxuICogQHJldHVybnMgeyFMb25nfVxyXG4gKiBAaW5uZXJcclxuICovXHJcbmZ1bmN0aW9uIGZyb21JbnQodmFsdWUsIHVuc2lnbmVkKSB7XHJcbiAgICB2YXIgb2JqLCBjYWNoZWRPYmosIGNhY2hlO1xyXG4gICAgaWYgKHVuc2lnbmVkKSB7XHJcbiAgICAgICAgdmFsdWUgPj4+PSAwO1xyXG4gICAgICAgIGlmIChjYWNoZSA9ICgwIDw9IHZhbHVlICYmIHZhbHVlIDwgMjU2KSkge1xyXG4gICAgICAgICAgICBjYWNoZWRPYmogPSBVSU5UX0NBQ0hFW3ZhbHVlXTtcclxuICAgICAgICAgICAgaWYgKGNhY2hlZE9iailcclxuICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZWRPYmo7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9iaiA9IGZyb21CaXRzKHZhbHVlLCAodmFsdWUgfCAwKSA8IDAgPyAtMSA6IDAsIHRydWUpO1xyXG4gICAgICAgIGlmIChjYWNoZSlcclxuICAgICAgICAgICAgVUlOVF9DQUNIRVt2YWx1ZV0gPSBvYmo7XHJcbiAgICAgICAgcmV0dXJuIG9iajtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdmFsdWUgfD0gMDtcclxuICAgICAgICBpZiAoY2FjaGUgPSAoLTEyOCA8PSB2YWx1ZSAmJiB2YWx1ZSA8IDEyOCkpIHtcclxuICAgICAgICAgICAgY2FjaGVkT2JqID0gSU5UX0NBQ0hFW3ZhbHVlXTtcclxuICAgICAgICAgICAgaWYgKGNhY2hlZE9iailcclxuICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZWRPYmo7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9iaiA9IGZyb21CaXRzKHZhbHVlLCB2YWx1ZSA8IDAgPyAtMSA6IDAsIGZhbHNlKTtcclxuICAgICAgICBpZiAoY2FjaGUpXHJcbiAgICAgICAgICAgIElOVF9DQUNIRVt2YWx1ZV0gPSBvYmo7XHJcbiAgICAgICAgcmV0dXJuIG9iajtcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSBMb25nIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gMzIgYml0IGludGVnZXIgdmFsdWUuXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVGhlIDMyIGJpdCBpbnRlZ2VyIGluIHF1ZXN0aW9uXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcclxuICogQHJldHVybnMgeyFMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXHJcbiAqL1xyXG5Mb25nLmZyb21JbnQgPSBmcm9tSW50O1xyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxyXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZFxyXG4gKiBAcmV0dXJucyB7IUxvbmd9XHJcbiAqIEBpbm5lclxyXG4gKi9cclxuZnVuY3Rpb24gZnJvbU51bWJlcih2YWx1ZSwgdW5zaWduZWQpIHtcclxuICAgIGlmIChpc05hTih2YWx1ZSkpXHJcbiAgICAgICAgcmV0dXJuIHVuc2lnbmVkID8gVVpFUk8gOiBaRVJPO1xyXG4gICAgaWYgKHVuc2lnbmVkKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlIDwgMClcclxuICAgICAgICAgICAgcmV0dXJuIFVaRVJPO1xyXG4gICAgICAgIGlmICh2YWx1ZSA+PSBUV09fUFdSXzY0X0RCTClcclxuICAgICAgICAgICAgcmV0dXJuIE1BWF9VTlNJR05FRF9WQUxVRTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKHZhbHVlIDw9IC1UV09fUFdSXzYzX0RCTClcclxuICAgICAgICAgICAgcmV0dXJuIE1JTl9WQUxVRTtcclxuICAgICAgICBpZiAodmFsdWUgKyAxID49IFRXT19QV1JfNjNfREJMKVxyXG4gICAgICAgICAgICByZXR1cm4gTUFYX1ZBTFVFO1xyXG4gICAgfVxyXG4gICAgaWYgKHZhbHVlIDwgMClcclxuICAgICAgICByZXR1cm4gZnJvbU51bWJlcigtdmFsdWUsIHVuc2lnbmVkKS5uZWcoKTtcclxuICAgIHJldHVybiBmcm9tQml0cygodmFsdWUgJSBUV09fUFdSXzMyX0RCTCkgfCAwLCAodmFsdWUgLyBUV09fUFdSXzMyX0RCTCkgfCAwLCB1bnNpZ25lZCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgTG9uZyByZXByZXNlbnRpbmcgdGhlIGdpdmVuIHZhbHVlLCBwcm92aWRlZCB0aGF0IGl0IGlzIGEgZmluaXRlIG51bWJlci4gT3RoZXJ3aXNlLCB6ZXJvIGlzIHJldHVybmVkLlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFRoZSBudW1iZXIgaW4gcXVlc3Rpb25cclxuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxyXG4gKiBAcmV0dXJucyB7IUxvbmd9IFRoZSBjb3JyZXNwb25kaW5nIExvbmcgdmFsdWVcclxuICovXHJcbkxvbmcuZnJvbU51bWJlciA9IGZyb21OdW1iZXI7XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtudW1iZXJ9IGxvd0JpdHNcclxuICogQHBhcmFtIHtudW1iZXJ9IGhpZ2hCaXRzXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkXHJcbiAqIEByZXR1cm5zIHshTG9uZ31cclxuICogQGlubmVyXHJcbiAqL1xyXG5mdW5jdGlvbiBmcm9tQml0cyhsb3dCaXRzLCBoaWdoQml0cywgdW5zaWduZWQpIHtcclxuICAgIHJldHVybiBuZXcgTG9uZyhsb3dCaXRzLCBoaWdoQml0cywgdW5zaWduZWQpO1xyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIExvbmcgcmVwcmVzZW50aW5nIHRoZSA2NCBiaXQgaW50ZWdlciB0aGF0IGNvbWVzIGJ5IGNvbmNhdGVuYXRpbmcgdGhlIGdpdmVuIGxvdyBhbmQgaGlnaCBiaXRzLiBFYWNoIGlzXHJcbiAqICBhc3N1bWVkIHRvIHVzZSAzMiBiaXRzLlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtudW1iZXJ9IGxvd0JpdHMgVGhlIGxvdyAzMiBiaXRzXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBoaWdoQml0cyBUaGUgaGlnaCAzMiBiaXRzXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcclxuICogQHJldHVybnMgeyFMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXHJcbiAqL1xyXG5Mb25nLmZyb21CaXRzID0gZnJvbUJpdHM7XHJcblxyXG4vKipcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBiYXNlXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBleHBvbmVudFxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gKiBAaW5uZXJcclxuICovXHJcbnZhciBwb3dfZGJsID0gTWF0aC5wb3c7IC8vIFVzZWQgNCB0aW1lcyAoNCo4IHRvIDE1KzQpXHJcblxyXG4vKipcclxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxyXG4gKiBAcGFyYW0geyhib29sZWFufG51bWJlcik9fSB1bnNpZ25lZFxyXG4gKiBAcGFyYW0ge251bWJlcj19IHJhZGl4XHJcbiAqIEByZXR1cm5zIHshTG9uZ31cclxuICogQGlubmVyXHJcbiAqL1xyXG5mdW5jdGlvbiBmcm9tU3RyaW5nKHN0ciwgdW5zaWduZWQsIHJhZGl4KSB7XHJcbiAgICBpZiAoc3RyLmxlbmd0aCA9PT0gMClcclxuICAgICAgICB0aHJvdyBFcnJvcignZW1wdHkgc3RyaW5nJyk7XHJcbiAgICBpZiAoc3RyID09PSBcIk5hTlwiIHx8IHN0ciA9PT0gXCJJbmZpbml0eVwiIHx8IHN0ciA9PT0gXCIrSW5maW5pdHlcIiB8fCBzdHIgPT09IFwiLUluZmluaXR5XCIpXHJcbiAgICAgICAgcmV0dXJuIFpFUk87XHJcbiAgICBpZiAodHlwZW9mIHVuc2lnbmVkID09PSAnbnVtYmVyJykge1xyXG4gICAgICAgIC8vIEZvciBnb29nLm1hdGgubG9uZyBjb21wYXRpYmlsaXR5XHJcbiAgICAgICAgcmFkaXggPSB1bnNpZ25lZCxcclxuICAgICAgICB1bnNpZ25lZCA9IGZhbHNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICB1bnNpZ25lZCA9ICEhIHVuc2lnbmVkO1xyXG4gICAgfVxyXG4gICAgcmFkaXggPSByYWRpeCB8fCAxMDtcclxuICAgIGlmIChyYWRpeCA8IDIgfHwgMzYgPCByYWRpeClcclxuICAgICAgICB0aHJvdyBSYW5nZUVycm9yKCdyYWRpeCcpO1xyXG5cclxuICAgIHZhciBwO1xyXG4gICAgaWYgKChwID0gc3RyLmluZGV4T2YoJy0nKSkgPiAwKVxyXG4gICAgICAgIHRocm93IEVycm9yKCdpbnRlcmlvciBoeXBoZW4nKTtcclxuICAgIGVsc2UgaWYgKHAgPT09IDApIHtcclxuICAgICAgICByZXR1cm4gZnJvbVN0cmluZyhzdHIuc3Vic3RyaW5nKDEpLCB1bnNpZ25lZCwgcmFkaXgpLm5lZygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIERvIHNldmVyYWwgKDgpIGRpZ2l0cyBlYWNoIHRpbWUgdGhyb3VnaCB0aGUgbG9vcCwgc28gYXMgdG9cclxuICAgIC8vIG1pbmltaXplIHRoZSBjYWxscyB0byB0aGUgdmVyeSBleHBlbnNpdmUgZW11bGF0ZWQgZGl2LlxyXG4gICAgdmFyIHJhZGl4VG9Qb3dlciA9IGZyb21OdW1iZXIocG93X2RibChyYWRpeCwgOCkpO1xyXG5cclxuICAgIHZhciByZXN1bHQgPSBaRVJPO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpICs9IDgpIHtcclxuICAgICAgICB2YXIgc2l6ZSA9IE1hdGgubWluKDgsIHN0ci5sZW5ndGggLSBpKSxcclxuICAgICAgICAgICAgdmFsdWUgPSBwYXJzZUludChzdHIuc3Vic3RyaW5nKGksIGkgKyBzaXplKSwgcmFkaXgpO1xyXG4gICAgICAgIGlmIChzaXplIDwgOCkge1xyXG4gICAgICAgICAgICB2YXIgcG93ZXIgPSBmcm9tTnVtYmVyKHBvd19kYmwocmFkaXgsIHNpemUpKTtcclxuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0Lm11bChwb3dlcikuYWRkKGZyb21OdW1iZXIodmFsdWUpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQubXVsKHJhZGl4VG9Qb3dlcik7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5hZGQoZnJvbU51bWJlcih2YWx1ZSkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJlc3VsdC51bnNpZ25lZCA9IHVuc2lnbmVkO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSBMb25nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBzdHJpbmcsIHdyaXR0ZW4gdXNpbmcgdGhlIHNwZWNpZmllZCByYWRpeC5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgVGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIExvbmdcclxuICogQHBhcmFtIHsoYm9vbGVhbnxudW1iZXIpPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxyXG4gKiBAcGFyYW0ge251bWJlcj19IHJhZGl4IFRoZSByYWRpeCBpbiB3aGljaCB0aGUgdGV4dCBpcyB3cml0dGVuICgyLTM2KSwgZGVmYXVsdHMgdG8gMTBcclxuICogQHJldHVybnMgeyFMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXHJcbiAqL1xyXG5Mb25nLmZyb21TdHJpbmcgPSBmcm9tU3RyaW5nO1xyXG5cclxuLyoqXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd8IXtsb3c6IG51bWJlciwgaGlnaDogbnVtYmVyLCB1bnNpZ25lZDogYm9vbGVhbn19IHZhbFxyXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZFxyXG4gKiBAcmV0dXJucyB7IUxvbmd9XHJcbiAqIEBpbm5lclxyXG4gKi9cclxuZnVuY3Rpb24gZnJvbVZhbHVlKHZhbCwgdW5zaWduZWQpIHtcclxuICAgIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJylcclxuICAgICAgICByZXR1cm4gZnJvbU51bWJlcih2YWwsIHVuc2lnbmVkKTtcclxuICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJylcclxuICAgICAgICByZXR1cm4gZnJvbVN0cmluZyh2YWwsIHVuc2lnbmVkKTtcclxuICAgIC8vIFRocm93cyBmb3Igbm9uLW9iamVjdHMsIGNvbnZlcnRzIG5vbi1pbnN0YW5jZW9mIExvbmc6XHJcbiAgICByZXR1cm4gZnJvbUJpdHModmFsLmxvdywgdmFsLmhpZ2gsIHR5cGVvZiB1bnNpZ25lZCA9PT0gJ2Jvb2xlYW4nID8gdW5zaWduZWQgOiB2YWwudW5zaWduZWQpO1xyXG59XHJcblxyXG4vKipcclxuICogQ29udmVydHMgdGhlIHNwZWNpZmllZCB2YWx1ZSB0byBhIExvbmcgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIGZyb20qIGZ1bmN0aW9uIGZvciBpdHMgdHlwZS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ3whe2xvdzogbnVtYmVyLCBoaWdoOiBudW1iZXIsIHVuc2lnbmVkOiBib29sZWFufX0gdmFsIFZhbHVlXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcclxuICogQHJldHVybnMgeyFMb25nfVxyXG4gKi9cclxuTG9uZy5mcm9tVmFsdWUgPSBmcm9tVmFsdWU7XHJcblxyXG4vLyBOT1RFOiB0aGUgY29tcGlsZXIgc2hvdWxkIGlubGluZSB0aGVzZSBjb25zdGFudCB2YWx1ZXMgYmVsb3cgYW5kIHRoZW4gcmVtb3ZlIHRoZXNlIHZhcmlhYmxlcywgc28gdGhlcmUgc2hvdWxkIGJlXHJcbi8vIG5vIHJ1bnRpbWUgcGVuYWx0eSBmb3IgdGhlc2UuXHJcblxyXG4vKipcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0XHJcbiAqIEBpbm5lclxyXG4gKi9cclxudmFyIFRXT19QV1JfMTZfREJMID0gMSA8PCAxNjtcclxuXHJcbi8qKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RcclxuICogQGlubmVyXHJcbiAqL1xyXG52YXIgVFdPX1BXUl8yNF9EQkwgPSAxIDw8IDI0O1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdFxyXG4gKiBAaW5uZXJcclxuICovXHJcbnZhciBUV09fUFdSXzMyX0RCTCA9IFRXT19QV1JfMTZfREJMICogVFdPX1BXUl8xNl9EQkw7XHJcblxyXG4vKipcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0XHJcbiAqIEBpbm5lclxyXG4gKi9cclxudmFyIFRXT19QV1JfNjRfREJMID0gVFdPX1BXUl8zMl9EQkwgKiBUV09fUFdSXzMyX0RCTDtcclxuXHJcbi8qKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RcclxuICogQGlubmVyXHJcbiAqL1xyXG52YXIgVFdPX1BXUl82M19EQkwgPSBUV09fUFdSXzY0X0RCTCAvIDI7XHJcblxyXG4vKipcclxuICogQHR5cGUgeyFMb25nfVxyXG4gKiBAY29uc3RcclxuICogQGlubmVyXHJcbiAqL1xyXG52YXIgVFdPX1BXUl8yNCA9IGZyb21JbnQoVFdPX1BXUl8yNF9EQkwpO1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlIHshTG9uZ31cclxuICogQGlubmVyXHJcbiAqL1xyXG52YXIgWkVSTyA9IGZyb21JbnQoMCk7XHJcblxyXG4vKipcclxuICogU2lnbmVkIHplcm8uXHJcbiAqIEB0eXBlIHshTG9uZ31cclxuICovXHJcbkxvbmcuWkVSTyA9IFpFUk87XHJcblxyXG4vKipcclxuICogQHR5cGUgeyFMb25nfVxyXG4gKiBAaW5uZXJcclxuICovXHJcbnZhciBVWkVSTyA9IGZyb21JbnQoMCwgdHJ1ZSk7XHJcblxyXG4vKipcclxuICogVW5zaWduZWQgemVyby5cclxuICogQHR5cGUgeyFMb25nfVxyXG4gKi9cclxuTG9uZy5VWkVSTyA9IFVaRVJPO1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlIHshTG9uZ31cclxuICogQGlubmVyXHJcbiAqL1xyXG52YXIgT05FID0gZnJvbUludCgxKTtcclxuXHJcbi8qKlxyXG4gKiBTaWduZWQgb25lLlxyXG4gKiBAdHlwZSB7IUxvbmd9XHJcbiAqL1xyXG5Mb25nLk9ORSA9IE9ORTtcclxuXHJcbi8qKlxyXG4gKiBAdHlwZSB7IUxvbmd9XHJcbiAqIEBpbm5lclxyXG4gKi9cclxudmFyIFVPTkUgPSBmcm9tSW50KDEsIHRydWUpO1xyXG5cclxuLyoqXHJcbiAqIFVuc2lnbmVkIG9uZS5cclxuICogQHR5cGUgeyFMb25nfVxyXG4gKi9cclxuTG9uZy5VT05FID0gVU9ORTtcclxuXHJcbi8qKlxyXG4gKiBAdHlwZSB7IUxvbmd9XHJcbiAqIEBpbm5lclxyXG4gKi9cclxudmFyIE5FR19PTkUgPSBmcm9tSW50KC0xKTtcclxuXHJcbi8qKlxyXG4gKiBTaWduZWQgbmVnYXRpdmUgb25lLlxyXG4gKiBAdHlwZSB7IUxvbmd9XHJcbiAqL1xyXG5Mb25nLk5FR19PTkUgPSBORUdfT05FO1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlIHshTG9uZ31cclxuICogQGlubmVyXHJcbiAqL1xyXG52YXIgTUFYX1ZBTFVFID0gZnJvbUJpdHMoMHhGRkZGRkZGRnwwLCAweDdGRkZGRkZGfDAsIGZhbHNlKTtcclxuXHJcbi8qKlxyXG4gKiBNYXhpbXVtIHNpZ25lZCB2YWx1ZS5cclxuICogQHR5cGUgeyFMb25nfVxyXG4gKi9cclxuTG9uZy5NQVhfVkFMVUUgPSBNQVhfVkFMVUU7XHJcblxyXG4vKipcclxuICogQHR5cGUgeyFMb25nfVxyXG4gKiBAaW5uZXJcclxuICovXHJcbnZhciBNQVhfVU5TSUdORURfVkFMVUUgPSBmcm9tQml0cygweEZGRkZGRkZGfDAsIDB4RkZGRkZGRkZ8MCwgdHJ1ZSk7XHJcblxyXG4vKipcclxuICogTWF4aW11bSB1bnNpZ25lZCB2YWx1ZS5cclxuICogQHR5cGUgeyFMb25nfVxyXG4gKi9cclxuTG9uZy5NQVhfVU5TSUdORURfVkFMVUUgPSBNQVhfVU5TSUdORURfVkFMVUU7XHJcblxyXG4vKipcclxuICogQHR5cGUgeyFMb25nfVxyXG4gKiBAaW5uZXJcclxuICovXHJcbnZhciBNSU5fVkFMVUUgPSBmcm9tQml0cygwLCAweDgwMDAwMDAwfDAsIGZhbHNlKTtcclxuXHJcbi8qKlxyXG4gKiBNaW5pbXVtIHNpZ25lZCB2YWx1ZS5cclxuICogQHR5cGUgeyFMb25nfVxyXG4gKi9cclxuTG9uZy5NSU5fVkFMVUUgPSBNSU5fVkFMVUU7XHJcblxyXG4vKipcclxuICogQGFsaWFzIExvbmcucHJvdG90eXBlXHJcbiAqIEBpbm5lclxyXG4gKi9cclxudmFyIExvbmdQcm90b3R5cGUgPSBMb25nLnByb3RvdHlwZTtcclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyB0aGUgTG9uZyB0byBhIDMyIGJpdCBpbnRlZ2VyLCBhc3N1bWluZyBpdCBpcyBhIDMyIGJpdCBpbnRlZ2VyLlxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS50b0ludCA9IGZ1bmN0aW9uIHRvSW50KCkge1xyXG4gICAgcmV0dXJuIHRoaXMudW5zaWduZWQgPyB0aGlzLmxvdyA+Pj4gMCA6IHRoaXMubG93O1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIHRoZSBMb25nIHRvIGEgdGhlIG5lYXJlc3QgZmxvYXRpbmctcG9pbnQgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB2YWx1ZSAoZG91YmxlLCA1MyBiaXQgbWFudGlzc2EpLlxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS50b051bWJlciA9IGZ1bmN0aW9uIHRvTnVtYmVyKCkge1xyXG4gICAgaWYgKHRoaXMudW5zaWduZWQpXHJcbiAgICAgICAgcmV0dXJuICgodGhpcy5oaWdoID4+PiAwKSAqIFRXT19QV1JfMzJfREJMKSArICh0aGlzLmxvdyA+Pj4gMCk7XHJcbiAgICByZXR1cm4gdGhpcy5oaWdoICogVFdPX1BXUl8zMl9EQkwgKyAodGhpcy5sb3cgPj4+IDApO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIHRoZSBMb25nIHRvIGEgc3RyaW5nIHdyaXR0ZW4gaW4gdGhlIHNwZWNpZmllZCByYWRpeC5cclxuICogQHBhcmFtIHtudW1iZXI9fSByYWRpeCBSYWRpeCAoMi0zNiksIGRlZmF1bHRzIHRvIDEwXHJcbiAqIEByZXR1cm5zIHtzdHJpbmd9XHJcbiAqIEBvdmVycmlkZVxyXG4gKiBAdGhyb3dzIHtSYW5nZUVycm9yfSBJZiBgcmFkaXhgIGlzIG91dCBvZiByYW5nZVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKHJhZGl4KSB7XHJcbiAgICByYWRpeCA9IHJhZGl4IHx8IDEwO1xyXG4gICAgaWYgKHJhZGl4IDwgMiB8fCAzNiA8IHJhZGl4KVxyXG4gICAgICAgIHRocm93IFJhbmdlRXJyb3IoJ3JhZGl4Jyk7XHJcbiAgICBpZiAodGhpcy5pc1plcm8oKSlcclxuICAgICAgICByZXR1cm4gJzAnO1xyXG4gICAgaWYgKHRoaXMuaXNOZWdhdGl2ZSgpKSB7IC8vIFVuc2lnbmVkIExvbmdzIGFyZSBuZXZlciBuZWdhdGl2ZVxyXG4gICAgICAgIGlmICh0aGlzLmVxKE1JTl9WQUxVRSkpIHtcclxuICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBjaGFuZ2UgdGhlIExvbmcgdmFsdWUgYmVmb3JlIGl0IGNhbiBiZSBuZWdhdGVkLCBzbyB3ZSByZW1vdmVcclxuICAgICAgICAgICAgLy8gdGhlIGJvdHRvbS1tb3N0IGRpZ2l0IGluIHRoaXMgYmFzZSBhbmQgdGhlbiByZWN1cnNlIHRvIGRvIHRoZSByZXN0LlxyXG4gICAgICAgICAgICB2YXIgcmFkaXhMb25nID0gZnJvbU51bWJlcihyYWRpeCksXHJcbiAgICAgICAgICAgICAgICBkaXYgPSB0aGlzLmRpdihyYWRpeExvbmcpLFxyXG4gICAgICAgICAgICAgICAgcmVtMSA9IGRpdi5tdWwocmFkaXhMb25nKS5zdWIodGhpcyk7XHJcbiAgICAgICAgICAgIHJldHVybiBkaXYudG9TdHJpbmcocmFkaXgpICsgcmVtMS50b0ludCgpLnRvU3RyaW5nKHJhZGl4KTtcclxuICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgcmV0dXJuICctJyArIHRoaXMubmVnKCkudG9TdHJpbmcocmFkaXgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIERvIHNldmVyYWwgKDYpIGRpZ2l0cyBlYWNoIHRpbWUgdGhyb3VnaCB0aGUgbG9vcCwgc28gYXMgdG9cclxuICAgIC8vIG1pbmltaXplIHRoZSBjYWxscyB0byB0aGUgdmVyeSBleHBlbnNpdmUgZW11bGF0ZWQgZGl2LlxyXG4gICAgdmFyIHJhZGl4VG9Qb3dlciA9IGZyb21OdW1iZXIocG93X2RibChyYWRpeCwgNiksIHRoaXMudW5zaWduZWQpLFxyXG4gICAgICAgIHJlbSA9IHRoaXM7XHJcbiAgICB2YXIgcmVzdWx0ID0gJyc7XHJcbiAgICB3aGlsZSAodHJ1ZSkge1xyXG4gICAgICAgIHZhciByZW1EaXYgPSByZW0uZGl2KHJhZGl4VG9Qb3dlciksXHJcbiAgICAgICAgICAgIGludHZhbCA9IHJlbS5zdWIocmVtRGl2Lm11bChyYWRpeFRvUG93ZXIpKS50b0ludCgpID4+PiAwLFxyXG4gICAgICAgICAgICBkaWdpdHMgPSBpbnR2YWwudG9TdHJpbmcocmFkaXgpO1xyXG4gICAgICAgIHJlbSA9IHJlbURpdjtcclxuICAgICAgICBpZiAocmVtLmlzWmVybygpKVxyXG4gICAgICAgICAgICByZXR1cm4gZGlnaXRzICsgcmVzdWx0O1xyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB3aGlsZSAoZGlnaXRzLmxlbmd0aCA8IDYpXHJcbiAgICAgICAgICAgICAgICBkaWdpdHMgPSAnMCcgKyBkaWdpdHM7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9ICcnICsgZGlnaXRzICsgcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufTtcclxuXHJcbi8qKlxyXG4gKiBHZXRzIHRoZSBoaWdoIDMyIGJpdHMgYXMgYSBzaWduZWQgaW50ZWdlci5cclxuICogQHJldHVybnMge251bWJlcn0gU2lnbmVkIGhpZ2ggYml0c1xyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5nZXRIaWdoQml0cyA9IGZ1bmN0aW9uIGdldEhpZ2hCaXRzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaGlnaDtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBHZXRzIHRoZSBoaWdoIDMyIGJpdHMgYXMgYW4gdW5zaWduZWQgaW50ZWdlci5cclxuICogQHJldHVybnMge251bWJlcn0gVW5zaWduZWQgaGlnaCBiaXRzXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmdldEhpZ2hCaXRzVW5zaWduZWQgPSBmdW5jdGlvbiBnZXRIaWdoQml0c1Vuc2lnbmVkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaGlnaCA+Pj4gMDtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBHZXRzIHRoZSBsb3cgMzIgYml0cyBhcyBhIHNpZ25lZCBpbnRlZ2VyLlxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBTaWduZWQgbG93IGJpdHNcclxuICovXHJcbkxvbmdQcm90b3R5cGUuZ2V0TG93Qml0cyA9IGZ1bmN0aW9uIGdldExvd0JpdHMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5sb3c7XHJcbn07XHJcblxyXG4vKipcclxuICogR2V0cyB0aGUgbG93IDMyIGJpdHMgYXMgYW4gdW5zaWduZWQgaW50ZWdlci5cclxuICogQHJldHVybnMge251bWJlcn0gVW5zaWduZWQgbG93IGJpdHNcclxuICovXHJcbkxvbmdQcm90b3R5cGUuZ2V0TG93Qml0c1Vuc2lnbmVkID0gZnVuY3Rpb24gZ2V0TG93Qml0c1Vuc2lnbmVkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubG93ID4+PiAwO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEdldHMgdGhlIG51bWJlciBvZiBiaXRzIG5lZWRlZCB0byByZXByZXNlbnQgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoaXMgTG9uZy5cclxuICogQHJldHVybnMge251bWJlcn1cclxuICovXHJcbkxvbmdQcm90b3R5cGUuZ2V0TnVtQml0c0FicyA9IGZ1bmN0aW9uIGdldE51bUJpdHNBYnMoKSB7XHJcbiAgICBpZiAodGhpcy5pc05lZ2F0aXZlKCkpIC8vIFVuc2lnbmVkIExvbmdzIGFyZSBuZXZlciBuZWdhdGl2ZVxyXG4gICAgICAgIHJldHVybiB0aGlzLmVxKE1JTl9WQUxVRSkgPyA2NCA6IHRoaXMubmVnKCkuZ2V0TnVtQml0c0FicygpO1xyXG4gICAgdmFyIHZhbCA9IHRoaXMuaGlnaCAhPSAwID8gdGhpcy5oaWdoIDogdGhpcy5sb3c7XHJcbiAgICBmb3IgKHZhciBiaXQgPSAzMTsgYml0ID4gMDsgYml0LS0pXHJcbiAgICAgICAgaWYgKCh2YWwgJiAoMSA8PCBiaXQpKSAhPSAwKVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgIHJldHVybiB0aGlzLmhpZ2ggIT0gMCA/IGJpdCArIDMzIDogYml0ICsgMTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBlcXVhbHMgemVyby5cclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmlzWmVybyA9IGZ1bmN0aW9uIGlzWmVybygpIHtcclxuICAgIHJldHVybiB0aGlzLmhpZ2ggPT09IDAgJiYgdGhpcy5sb3cgPT09IDA7XHJcbn07XHJcblxyXG4vKipcclxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgZXF1YWxzIHplcm8uIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjaXNaZXJvfS5cclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmVxeiA9IExvbmdQcm90b3R5cGUuaXNaZXJvO1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIG5lZ2F0aXZlLlxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbkxvbmdQcm90b3R5cGUuaXNOZWdhdGl2ZSA9IGZ1bmN0aW9uIGlzTmVnYXRpdmUoKSB7XHJcbiAgICByZXR1cm4gIXRoaXMudW5zaWduZWQgJiYgdGhpcy5oaWdoIDwgMDtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBwb3NpdGl2ZS5cclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmlzUG9zaXRpdmUgPSBmdW5jdGlvbiBpc1Bvc2l0aXZlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudW5zaWduZWQgfHwgdGhpcy5oaWdoID49IDA7XHJcbn07XHJcblxyXG4vKipcclxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgb2RkLlxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbkxvbmdQcm90b3R5cGUuaXNPZGQgPSBmdW5jdGlvbiBpc09kZCgpIHtcclxuICAgIHJldHVybiAodGhpcy5sb3cgJiAxKSA9PT0gMTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBldmVuLlxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbkxvbmdQcm90b3R5cGUuaXNFdmVuID0gZnVuY3Rpb24gaXNFdmVuKCkge1xyXG4gICAgcmV0dXJuICh0aGlzLmxvdyAmIDEpID09PSAwO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGVxdWFscyB0aGUgc3BlY2lmaWVkJ3MuXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyhvdGhlcikge1xyXG4gICAgaWYgKCFpc0xvbmcob3RoZXIpKVxyXG4gICAgICAgIG90aGVyID0gZnJvbVZhbHVlKG90aGVyKTtcclxuICAgIGlmICh0aGlzLnVuc2lnbmVkICE9PSBvdGhlci51bnNpZ25lZCAmJiAodGhpcy5oaWdoID4+PiAzMSkgPT09IDEgJiYgKG90aGVyLmhpZ2ggPj4+IDMxKSA9PT0gMSlcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICByZXR1cm4gdGhpcy5oaWdoID09PSBvdGhlci5oaWdoICYmIHRoaXMubG93ID09PSBvdGhlci5sb3c7XHJcbn07XHJcblxyXG4vKipcclxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgZXF1YWxzIHRoZSBzcGVjaWZpZWQncy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNlcXVhbHN9LlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbkxvbmdQcm90b3R5cGUuZXEgPSBMb25nUHJvdG90eXBlLmVxdWFscztcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIHNwZWNpZmllZCdzLlxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5ub3RFcXVhbHMgPSBmdW5jdGlvbiBub3RFcXVhbHMob3RoZXIpIHtcclxuICAgIHJldHVybiAhdGhpcy5lcSgvKiB2YWxpZGF0ZXMgKi8gb3RoZXIpO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbm90RXF1YWxzfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLm5lcSA9IExvbmdQcm90b3R5cGUubm90RXF1YWxzO1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbm90RXF1YWxzfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLm5lID0gTG9uZ1Byb3RvdHlwZS5ub3RFcXVhbHM7XHJcblxyXG4vKipcclxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQncy5cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbkxvbmdQcm90b3R5cGUubGVzc1RoYW4gPSBmdW5jdGlvbiBsZXNzVGhhbihvdGhlcikge1xyXG4gICAgcmV0dXJuIHRoaXMuY29tcCgvKiB2YWxpZGF0ZXMgKi8gb3RoZXIpIDwgMDtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2xlc3NUaGFufS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmx0ID0gTG9uZ1Byb3RvdHlwZS5sZXNzVGhhbjtcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdGhlIHNwZWNpZmllZCdzLlxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5sZXNzVGhhbk9yRXF1YWwgPSBmdW5jdGlvbiBsZXNzVGhhbk9yRXF1YWwob3RoZXIpIHtcclxuICAgIHJldHVybiB0aGlzLmNvbXAoLyogdmFsaWRhdGVzICovIG90aGVyKSA8PSAwO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbGVzc1RoYW5PckVxdWFsfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmx0ZSA9IExvbmdQcm90b3R5cGUubGVzc1RoYW5PckVxdWFsO1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbGVzc1RoYW5PckVxdWFsfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmxlID0gTG9uZ1Byb3RvdHlwZS5sZXNzVGhhbk9yRXF1YWw7XHJcblxyXG4vKipcclxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBzcGVjaWZpZWQncy5cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbkxvbmdQcm90b3R5cGUuZ3JlYXRlclRoYW4gPSBmdW5jdGlvbiBncmVhdGVyVGhhbihvdGhlcikge1xyXG4gICAgcmV0dXJuIHRoaXMuY29tcCgvKiB2YWxpZGF0ZXMgKi8gb3RoZXIpID4gMDtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2dyZWF0ZXJUaGFufS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmd0ID0gTG9uZ1Byb3RvdHlwZS5ncmVhdGVyVGhhbjtcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdGhlIHNwZWNpZmllZCdzLlxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5ncmVhdGVyVGhhbk9yRXF1YWwgPSBmdW5jdGlvbiBncmVhdGVyVGhhbk9yRXF1YWwob3RoZXIpIHtcclxuICAgIHJldHVybiB0aGlzLmNvbXAoLyogdmFsaWRhdGVzICovIG90aGVyKSA+PSAwO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjZ3JlYXRlclRoYW5PckVxdWFsfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmd0ZSA9IExvbmdQcm90b3R5cGUuZ3JlYXRlclRoYW5PckVxdWFsO1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjZ3JlYXRlclRoYW5PckVxdWFsfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmdlID0gTG9uZ1Byb3RvdHlwZS5ncmVhdGVyVGhhbk9yRXF1YWw7XHJcblxyXG4vKipcclxuICogQ29tcGFyZXMgdGhpcyBMb25nJ3MgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkJ3MuXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge251bWJlcn0gMCBpZiB0aGV5IGFyZSB0aGUgc2FtZSwgMSBpZiB0aGUgdGhpcyBpcyBncmVhdGVyIGFuZCAtMVxyXG4gKiAgaWYgdGhlIGdpdmVuIG9uZSBpcyBncmVhdGVyXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlKG90aGVyKSB7XHJcbiAgICBpZiAoIWlzTG9uZyhvdGhlcikpXHJcbiAgICAgICAgb3RoZXIgPSBmcm9tVmFsdWUob3RoZXIpO1xyXG4gICAgaWYgKHRoaXMuZXEob3RoZXIpKVxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgdmFyIHRoaXNOZWcgPSB0aGlzLmlzTmVnYXRpdmUoKSxcclxuICAgICAgICBvdGhlck5lZyA9IG90aGVyLmlzTmVnYXRpdmUoKTtcclxuICAgIGlmICh0aGlzTmVnICYmICFvdGhlck5lZylcclxuICAgICAgICByZXR1cm4gLTE7XHJcbiAgICBpZiAoIXRoaXNOZWcgJiYgb3RoZXJOZWcpXHJcbiAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAvLyBBdCB0aGlzIHBvaW50IHRoZSBzaWduIGJpdHMgYXJlIHRoZSBzYW1lXHJcbiAgICBpZiAoIXRoaXMudW5zaWduZWQpXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ViKG90aGVyKS5pc05lZ2F0aXZlKCkgPyAtMSA6IDE7XHJcbiAgICAvLyBCb3RoIGFyZSBwb3NpdGl2ZSBpZiBhdCBsZWFzdCBvbmUgaXMgdW5zaWduZWRcclxuICAgIHJldHVybiAob3RoZXIuaGlnaCA+Pj4gMCkgPiAodGhpcy5oaWdoID4+PiAwKSB8fCAob3RoZXIuaGlnaCA9PT0gdGhpcy5oaWdoICYmIChvdGhlci5sb3cgPj4+IDApID4gKHRoaXMubG93ID4+PiAwKSkgPyAtMSA6IDE7XHJcbn07XHJcblxyXG4vKipcclxuICogQ29tcGFyZXMgdGhpcyBMb25nJ3MgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjY29tcGFyZX0uXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXHJcbiAqIEByZXR1cm5zIHtudW1iZXJ9IDAgaWYgdGhleSBhcmUgdGhlIHNhbWUsIDEgaWYgdGhlIHRoaXMgaXMgZ3JlYXRlciBhbmQgLTFcclxuICogIGlmIHRoZSBnaXZlbiBvbmUgaXMgZ3JlYXRlclxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5jb21wID0gTG9uZ1Byb3RvdHlwZS5jb21wYXJlO1xyXG5cclxuLyoqXHJcbiAqIE5lZ2F0ZXMgdGhpcyBMb25nJ3MgdmFsdWUuXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gTmVnYXRlZCBMb25nXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLm5lZ2F0ZSA9IGZ1bmN0aW9uIG5lZ2F0ZSgpIHtcclxuICAgIGlmICghdGhpcy51bnNpZ25lZCAmJiB0aGlzLmVxKE1JTl9WQUxVRSkpXHJcbiAgICAgICAgcmV0dXJuIE1JTl9WQUxVRTtcclxuICAgIHJldHVybiB0aGlzLm5vdCgpLmFkZChPTkUpO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIE5lZ2F0ZXMgdGhpcyBMb25nJ3MgdmFsdWUuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbmVnYXRlfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gTmVnYXRlZCBMb25nXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLm5lZyA9IExvbmdQcm90b3R5cGUubmVnYXRlO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIHN1bSBvZiB0aGlzIGFuZCB0aGUgc3BlY2lmaWVkIExvbmcuXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gYWRkZW5kIEFkZGVuZFxyXG4gKiBAcmV0dXJucyB7IUxvbmd9IFN1bVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBhZGQoYWRkZW5kKSB7XHJcbiAgICBpZiAoIWlzTG9uZyhhZGRlbmQpKVxyXG4gICAgICAgIGFkZGVuZCA9IGZyb21WYWx1ZShhZGRlbmQpO1xyXG5cclxuICAgIC8vIERpdmlkZSBlYWNoIG51bWJlciBpbnRvIDQgY2h1bmtzIG9mIDE2IGJpdHMsIGFuZCB0aGVuIHN1bSB0aGUgY2h1bmtzLlxyXG5cclxuICAgIHZhciBhNDggPSB0aGlzLmhpZ2ggPj4+IDE2O1xyXG4gICAgdmFyIGEzMiA9IHRoaXMuaGlnaCAmIDB4RkZGRjtcclxuICAgIHZhciBhMTYgPSB0aGlzLmxvdyA+Pj4gMTY7XHJcbiAgICB2YXIgYTAwID0gdGhpcy5sb3cgJiAweEZGRkY7XHJcblxyXG4gICAgdmFyIGI0OCA9IGFkZGVuZC5oaWdoID4+PiAxNjtcclxuICAgIHZhciBiMzIgPSBhZGRlbmQuaGlnaCAmIDB4RkZGRjtcclxuICAgIHZhciBiMTYgPSBhZGRlbmQubG93ID4+PiAxNjtcclxuICAgIHZhciBiMDAgPSBhZGRlbmQubG93ICYgMHhGRkZGO1xyXG5cclxuICAgIHZhciBjNDggPSAwLCBjMzIgPSAwLCBjMTYgPSAwLCBjMDAgPSAwO1xyXG4gICAgYzAwICs9IGEwMCArIGIwMDtcclxuICAgIGMxNiArPSBjMDAgPj4+IDE2O1xyXG4gICAgYzAwICY9IDB4RkZGRjtcclxuICAgIGMxNiArPSBhMTYgKyBiMTY7XHJcbiAgICBjMzIgKz0gYzE2ID4+PiAxNjtcclxuICAgIGMxNiAmPSAweEZGRkY7XHJcbiAgICBjMzIgKz0gYTMyICsgYjMyO1xyXG4gICAgYzQ4ICs9IGMzMiA+Pj4gMTY7XHJcbiAgICBjMzIgJj0gMHhGRkZGO1xyXG4gICAgYzQ4ICs9IGE0OCArIGI0ODtcclxuICAgIGM0OCAmPSAweEZGRkY7XHJcbiAgICByZXR1cm4gZnJvbUJpdHMoKGMxNiA8PCAxNikgfCBjMDAsIChjNDggPDwgMTYpIHwgYzMyLCB0aGlzLnVuc2lnbmVkKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBkaWZmZXJlbmNlIG9mIHRoaXMgYW5kIHRoZSBzcGVjaWZpZWQgTG9uZy5cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBzdWJ0cmFoZW5kIFN1YnRyYWhlbmRcclxuICogQHJldHVybnMgeyFMb25nfSBEaWZmZXJlbmNlXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLnN1YnRyYWN0ID0gZnVuY3Rpb24gc3VidHJhY3Qoc3VidHJhaGVuZCkge1xyXG4gICAgaWYgKCFpc0xvbmcoc3VidHJhaGVuZCkpXHJcbiAgICAgICAgc3VidHJhaGVuZCA9IGZyb21WYWx1ZShzdWJ0cmFoZW5kKTtcclxuICAgIHJldHVybiB0aGlzLmFkZChzdWJ0cmFoZW5kLm5lZygpKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBkaWZmZXJlbmNlIG9mIHRoaXMgYW5kIHRoZSBzcGVjaWZpZWQgTG9uZy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNzdWJ0cmFjdH0uXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IHN1YnRyYWhlbmQgU3VidHJhaGVuZFxyXG4gKiBAcmV0dXJucyB7IUxvbmd9IERpZmZlcmVuY2VcclxuICovXHJcbkxvbmdQcm90b3R5cGUuc3ViID0gTG9uZ1Byb3RvdHlwZS5zdWJ0cmFjdDtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBwcm9kdWN0IG9mIHRoaXMgYW5kIHRoZSBzcGVjaWZpZWQgTG9uZy5cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBtdWx0aXBsaWVyIE11bHRpcGxpZXJcclxuICogQHJldHVybnMgeyFMb25nfSBQcm9kdWN0XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLm11bHRpcGx5ID0gZnVuY3Rpb24gbXVsdGlwbHkobXVsdGlwbGllcikge1xyXG4gICAgaWYgKHRoaXMuaXNaZXJvKCkpXHJcbiAgICAgICAgcmV0dXJuIFpFUk87XHJcbiAgICBpZiAoIWlzTG9uZyhtdWx0aXBsaWVyKSlcclxuICAgICAgICBtdWx0aXBsaWVyID0gZnJvbVZhbHVlKG11bHRpcGxpZXIpO1xyXG5cclxuICAgIC8vIHVzZSB3YXNtIHN1cHBvcnQgaWYgcHJlc2VudFxyXG4gICAgaWYgKHdhc20pIHtcclxuICAgICAgICB2YXIgbG93ID0gd2FzbS5tdWwodGhpcy5sb3csXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGlnaCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGllci5sb3csXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxpZXIuaGlnaCk7XHJcbiAgICAgICAgcmV0dXJuIGZyb21CaXRzKGxvdywgd2FzbS5nZXRfaGlnaCgpLCB0aGlzLnVuc2lnbmVkKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobXVsdGlwbGllci5pc1plcm8oKSlcclxuICAgICAgICByZXR1cm4gWkVSTztcclxuICAgIGlmICh0aGlzLmVxKE1JTl9WQUxVRSkpXHJcbiAgICAgICAgcmV0dXJuIG11bHRpcGxpZXIuaXNPZGQoKSA/IE1JTl9WQUxVRSA6IFpFUk87XHJcbiAgICBpZiAobXVsdGlwbGllci5lcShNSU5fVkFMVUUpKVxyXG4gICAgICAgIHJldHVybiB0aGlzLmlzT2RkKCkgPyBNSU5fVkFMVUUgOiBaRVJPO1xyXG5cclxuICAgIGlmICh0aGlzLmlzTmVnYXRpdmUoKSkge1xyXG4gICAgICAgIGlmIChtdWx0aXBsaWVyLmlzTmVnYXRpdmUoKSlcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubmVnKCkubXVsKG11bHRpcGxpZXIubmVnKCkpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubmVnKCkubXVsKG11bHRpcGxpZXIpLm5lZygpO1xyXG4gICAgfSBlbHNlIGlmIChtdWx0aXBsaWVyLmlzTmVnYXRpdmUoKSlcclxuICAgICAgICByZXR1cm4gdGhpcy5tdWwobXVsdGlwbGllci5uZWcoKSkubmVnKCk7XHJcblxyXG4gICAgLy8gSWYgYm90aCBsb25ncyBhcmUgc21hbGwsIHVzZSBmbG9hdCBtdWx0aXBsaWNhdGlvblxyXG4gICAgaWYgKHRoaXMubHQoVFdPX1BXUl8yNCkgJiYgbXVsdGlwbGllci5sdChUV09fUFdSXzI0KSlcclxuICAgICAgICByZXR1cm4gZnJvbU51bWJlcih0aGlzLnRvTnVtYmVyKCkgKiBtdWx0aXBsaWVyLnRvTnVtYmVyKCksIHRoaXMudW5zaWduZWQpO1xyXG5cclxuICAgIC8vIERpdmlkZSBlYWNoIGxvbmcgaW50byA0IGNodW5rcyBvZiAxNiBiaXRzLCBhbmQgdGhlbiBhZGQgdXAgNHg0IHByb2R1Y3RzLlxyXG4gICAgLy8gV2UgY2FuIHNraXAgcHJvZHVjdHMgdGhhdCB3b3VsZCBvdmVyZmxvdy5cclxuXHJcbiAgICB2YXIgYTQ4ID0gdGhpcy5oaWdoID4+PiAxNjtcclxuICAgIHZhciBhMzIgPSB0aGlzLmhpZ2ggJiAweEZGRkY7XHJcbiAgICB2YXIgYTE2ID0gdGhpcy5sb3cgPj4+IDE2O1xyXG4gICAgdmFyIGEwMCA9IHRoaXMubG93ICYgMHhGRkZGO1xyXG5cclxuICAgIHZhciBiNDggPSBtdWx0aXBsaWVyLmhpZ2ggPj4+IDE2O1xyXG4gICAgdmFyIGIzMiA9IG11bHRpcGxpZXIuaGlnaCAmIDB4RkZGRjtcclxuICAgIHZhciBiMTYgPSBtdWx0aXBsaWVyLmxvdyA+Pj4gMTY7XHJcbiAgICB2YXIgYjAwID0gbXVsdGlwbGllci5sb3cgJiAweEZGRkY7XHJcblxyXG4gICAgdmFyIGM0OCA9IDAsIGMzMiA9IDAsIGMxNiA9IDAsIGMwMCA9IDA7XHJcbiAgICBjMDAgKz0gYTAwICogYjAwO1xyXG4gICAgYzE2ICs9IGMwMCA+Pj4gMTY7XHJcbiAgICBjMDAgJj0gMHhGRkZGO1xyXG4gICAgYzE2ICs9IGExNiAqIGIwMDtcclxuICAgIGMzMiArPSBjMTYgPj4+IDE2O1xyXG4gICAgYzE2ICY9IDB4RkZGRjtcclxuICAgIGMxNiArPSBhMDAgKiBiMTY7XHJcbiAgICBjMzIgKz0gYzE2ID4+PiAxNjtcclxuICAgIGMxNiAmPSAweEZGRkY7XHJcbiAgICBjMzIgKz0gYTMyICogYjAwO1xyXG4gICAgYzQ4ICs9IGMzMiA+Pj4gMTY7XHJcbiAgICBjMzIgJj0gMHhGRkZGO1xyXG4gICAgYzMyICs9IGExNiAqIGIxNjtcclxuICAgIGM0OCArPSBjMzIgPj4+IDE2O1xyXG4gICAgYzMyICY9IDB4RkZGRjtcclxuICAgIGMzMiArPSBhMDAgKiBiMzI7XHJcbiAgICBjNDggKz0gYzMyID4+PiAxNjtcclxuICAgIGMzMiAmPSAweEZGRkY7XHJcbiAgICBjNDggKz0gYTQ4ICogYjAwICsgYTMyICogYjE2ICsgYTE2ICogYjMyICsgYTAwICogYjQ4O1xyXG4gICAgYzQ4ICY9IDB4RkZGRjtcclxuICAgIHJldHVybiBmcm9tQml0cygoYzE2IDw8IDE2KSB8IGMwMCwgKGM0OCA8PCAxNikgfCBjMzIsIHRoaXMudW5zaWduZWQpO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIHByb2R1Y3Qgb2YgdGhpcyBhbmQgdGhlIHNwZWNpZmllZCBMb25nLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI211bHRpcGx5fS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gbXVsdGlwbGllciBNdWx0aXBsaWVyXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gUHJvZHVjdFxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5tdWwgPSBMb25nUHJvdG90eXBlLm11bHRpcGx5O1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhpcyBMb25nIGRpdmlkZWQgYnkgdGhlIHNwZWNpZmllZC4gVGhlIHJlc3VsdCBpcyBzaWduZWQgaWYgdGhpcyBMb25nIGlzIHNpZ25lZCBvclxyXG4gKiAgdW5zaWduZWQgaWYgdGhpcyBMb25nIGlzIHVuc2lnbmVkLlxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IGRpdmlzb3IgRGl2aXNvclxyXG4gKiBAcmV0dXJucyB7IUxvbmd9IFF1b3RpZW50XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmRpdmlkZSA9IGZ1bmN0aW9uIGRpdmlkZShkaXZpc29yKSB7XHJcbiAgICBpZiAoIWlzTG9uZyhkaXZpc29yKSlcclxuICAgICAgICBkaXZpc29yID0gZnJvbVZhbHVlKGRpdmlzb3IpO1xyXG4gICAgaWYgKGRpdmlzb3IuaXNaZXJvKCkpXHJcbiAgICAgICAgdGhyb3cgRXJyb3IoJ2RpdmlzaW9uIGJ5IHplcm8nKTtcclxuXHJcbiAgICAvLyB1c2Ugd2FzbSBzdXBwb3J0IGlmIHByZXNlbnRcclxuICAgIGlmICh3YXNtKSB7XHJcbiAgICAgICAgLy8gZ3VhcmQgYWdhaW5zdCBzaWduZWQgZGl2aXNpb24gb3ZlcmZsb3c6IHRoZSBsYXJnZXN0XHJcbiAgICAgICAgLy8gbmVnYXRpdmUgbnVtYmVyIC8gLTEgd291bGQgYmUgMSBsYXJnZXIgdGhhbiB0aGUgbGFyZ2VzdFxyXG4gICAgICAgIC8vIHBvc2l0aXZlIG51bWJlciwgZHVlIHRvIHR3bydzIGNvbXBsZW1lbnQuXHJcbiAgICAgICAgaWYgKCF0aGlzLnVuc2lnbmVkICYmXHJcbiAgICAgICAgICAgIHRoaXMuaGlnaCA9PT0gLTB4ODAwMDAwMDAgJiZcclxuICAgICAgICAgICAgZGl2aXNvci5sb3cgPT09IC0xICYmIGRpdmlzb3IuaGlnaCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgLy8gYmUgY29uc2lzdGVudCB3aXRoIG5vbi13YXNtIGNvZGUgcGF0aFxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGxvdyA9ICh0aGlzLnVuc2lnbmVkID8gd2FzbS5kaXZfdSA6IHdhc20uZGl2X3MpKFxyXG4gICAgICAgICAgICB0aGlzLmxvdyxcclxuICAgICAgICAgICAgdGhpcy5oaWdoLFxyXG4gICAgICAgICAgICBkaXZpc29yLmxvdyxcclxuICAgICAgICAgICAgZGl2aXNvci5oaWdoXHJcbiAgICAgICAgKTtcclxuICAgICAgICByZXR1cm4gZnJvbUJpdHMobG93LCB3YXNtLmdldF9oaWdoKCksIHRoaXMudW5zaWduZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmlzWmVybygpKVxyXG4gICAgICAgIHJldHVybiB0aGlzLnVuc2lnbmVkID8gVVpFUk8gOiBaRVJPO1xyXG4gICAgdmFyIGFwcHJveCwgcmVtLCByZXM7XHJcbiAgICBpZiAoIXRoaXMudW5zaWduZWQpIHtcclxuICAgICAgICAvLyBUaGlzIHNlY3Rpb24gaXMgb25seSByZWxldmFudCBmb3Igc2lnbmVkIGxvbmdzIGFuZCBpcyBkZXJpdmVkIGZyb20gdGhlXHJcbiAgICAgICAgLy8gY2xvc3VyZSBsaWJyYXJ5IGFzIGEgd2hvbGUuXHJcbiAgICAgICAgaWYgKHRoaXMuZXEoTUlOX1ZBTFVFKSkge1xyXG4gICAgICAgICAgICBpZiAoZGl2aXNvci5lcShPTkUpIHx8IGRpdmlzb3IuZXEoTkVHX09ORSkpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gTUlOX1ZBTFVFOyAgLy8gcmVjYWxsIHRoYXQgLU1JTl9WQUxVRSA9PSBNSU5fVkFMVUVcclxuICAgICAgICAgICAgZWxzZSBpZiAoZGl2aXNvci5lcShNSU5fVkFMVUUpKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIE9ORTtcclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlIHxvdGhlcnwgPj0gMiwgc28gfHRoaXMvb3RoZXJ8IDwgfE1JTl9WQUxVRXwuXHJcbiAgICAgICAgICAgICAgICB2YXIgaGFsZlRoaXMgPSB0aGlzLnNocigxKTtcclxuICAgICAgICAgICAgICAgIGFwcHJveCA9IGhhbGZUaGlzLmRpdihkaXZpc29yKS5zaGwoMSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYXBwcm94LmVxKFpFUk8pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRpdmlzb3IuaXNOZWdhdGl2ZSgpID8gT05FIDogTkVHX09ORTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVtID0gdGhpcy5zdWIoZGl2aXNvci5tdWwoYXBwcm94KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzID0gYXBwcm94LmFkZChyZW0uZGl2KGRpdmlzb3IpKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChkaXZpc29yLmVxKE1JTl9WQUxVRSkpXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnVuc2lnbmVkID8gVVpFUk8gOiBaRVJPO1xyXG4gICAgICAgIGlmICh0aGlzLmlzTmVnYXRpdmUoKSkge1xyXG4gICAgICAgICAgICBpZiAoZGl2aXNvci5pc05lZ2F0aXZlKCkpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5uZWcoKS5kaXYoZGl2aXNvci5uZWcoKSk7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm5lZygpLmRpdihkaXZpc29yKS5uZWcoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGRpdmlzb3IuaXNOZWdhdGl2ZSgpKVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kaXYoZGl2aXNvci5uZWcoKSkubmVnKCk7XHJcbiAgICAgICAgcmVzID0gWkVSTztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gVGhlIGFsZ29yaXRobSBiZWxvdyBoYXMgbm90IGJlZW4gbWFkZSBmb3IgdW5zaWduZWQgbG9uZ3MuIEl0J3MgdGhlcmVmb3JlXHJcbiAgICAgICAgLy8gcmVxdWlyZWQgdG8gdGFrZSBzcGVjaWFsIGNhcmUgb2YgdGhlIE1TQiBwcmlvciB0byBydW5uaW5nIGl0LlxyXG4gICAgICAgIGlmICghZGl2aXNvci51bnNpZ25lZClcclxuICAgICAgICAgICAgZGl2aXNvciA9IGRpdmlzb3IudG9VbnNpZ25lZCgpO1xyXG4gICAgICAgIGlmIChkaXZpc29yLmd0KHRoaXMpKVxyXG4gICAgICAgICAgICByZXR1cm4gVVpFUk87XHJcbiAgICAgICAgaWYgKGRpdmlzb3IuZ3QodGhpcy5zaHJ1KDEpKSkgLy8gMTUgPj4+IDEgPSA3IDsgd2l0aCBkaXZpc29yID0gOCA7IHRydWVcclxuICAgICAgICAgICAgcmV0dXJuIFVPTkU7XHJcbiAgICAgICAgcmVzID0gVVpFUk87XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVwZWF0IHRoZSBmb2xsb3dpbmcgdW50aWwgdGhlIHJlbWFpbmRlciBpcyBsZXNzIHRoYW4gb3RoZXI6ICBmaW5kIGFcclxuICAgIC8vIGZsb2F0aW5nLXBvaW50IHRoYXQgYXBwcm94aW1hdGVzIHJlbWFpbmRlciAvIG90aGVyICpmcm9tIGJlbG93KiwgYWRkIHRoaXNcclxuICAgIC8vIGludG8gdGhlIHJlc3VsdCwgYW5kIHN1YnRyYWN0IGl0IGZyb20gdGhlIHJlbWFpbmRlci4gIEl0IGlzIGNyaXRpY2FsIHRoYXRcclxuICAgIC8vIHRoZSBhcHByb3hpbWF0ZSB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHJlYWwgdmFsdWUgc28gdGhhdCB0aGVcclxuICAgIC8vIHJlbWFpbmRlciBuZXZlciBiZWNvbWVzIG5lZ2F0aXZlLlxyXG4gICAgcmVtID0gdGhpcztcclxuICAgIHdoaWxlIChyZW0uZ3RlKGRpdmlzb3IpKSB7XHJcbiAgICAgICAgLy8gQXBwcm94aW1hdGUgdGhlIHJlc3VsdCBvZiBkaXZpc2lvbi4gVGhpcyBtYXkgYmUgYSBsaXR0bGUgZ3JlYXRlciBvclxyXG4gICAgICAgIC8vIHNtYWxsZXIgdGhhbiB0aGUgYWN0dWFsIHZhbHVlLlxyXG4gICAgICAgIGFwcHJveCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3IocmVtLnRvTnVtYmVyKCkgLyBkaXZpc29yLnRvTnVtYmVyKCkpKTtcclxuXHJcbiAgICAgICAgLy8gV2Ugd2lsbCB0d2VhayB0aGUgYXBwcm94aW1hdGUgcmVzdWx0IGJ5IGNoYW5naW5nIGl0IGluIHRoZSA0OC10aCBkaWdpdCBvclxyXG4gICAgICAgIC8vIHRoZSBzbWFsbGVzdCBub24tZnJhY3Rpb25hbCBkaWdpdCwgd2hpY2hldmVyIGlzIGxhcmdlci5cclxuICAgICAgICB2YXIgbG9nMiA9IE1hdGguY2VpbChNYXRoLmxvZyhhcHByb3gpIC8gTWF0aC5MTjIpLFxyXG4gICAgICAgICAgICBkZWx0YSA9IChsb2cyIDw9IDQ4KSA/IDEgOiBwb3dfZGJsKDIsIGxvZzIgLSA0OCksXHJcblxyXG4gICAgICAgIC8vIERlY3JlYXNlIHRoZSBhcHByb3hpbWF0aW9uIHVudGlsIGl0IGlzIHNtYWxsZXIgdGhhbiB0aGUgcmVtYWluZGVyLiAgTm90ZVxyXG4gICAgICAgIC8vIHRoYXQgaWYgaXQgaXMgdG9vIGxhcmdlLCB0aGUgcHJvZHVjdCBvdmVyZmxvd3MgYW5kIGlzIG5lZ2F0aXZlLlxyXG4gICAgICAgICAgICBhcHByb3hSZXMgPSBmcm9tTnVtYmVyKGFwcHJveCksXHJcbiAgICAgICAgICAgIGFwcHJveFJlbSA9IGFwcHJveFJlcy5tdWwoZGl2aXNvcik7XHJcbiAgICAgICAgd2hpbGUgKGFwcHJveFJlbS5pc05lZ2F0aXZlKCkgfHwgYXBwcm94UmVtLmd0KHJlbSkpIHtcclxuICAgICAgICAgICAgYXBwcm94IC09IGRlbHRhO1xyXG4gICAgICAgICAgICBhcHByb3hSZXMgPSBmcm9tTnVtYmVyKGFwcHJveCwgdGhpcy51bnNpZ25lZCk7XHJcbiAgICAgICAgICAgIGFwcHJveFJlbSA9IGFwcHJveFJlcy5tdWwoZGl2aXNvcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBXZSBrbm93IHRoZSBhbnN3ZXIgY2FuJ3QgYmUgemVyby4uLiBhbmQgYWN0dWFsbHksIHplcm8gd291bGQgY2F1c2VcclxuICAgICAgICAvLyBpbmZpbml0ZSByZWN1cnNpb24gc2luY2Ugd2Ugd291bGQgbWFrZSBubyBwcm9ncmVzcy5cclxuICAgICAgICBpZiAoYXBwcm94UmVzLmlzWmVybygpKVxyXG4gICAgICAgICAgICBhcHByb3hSZXMgPSBPTkU7XHJcblxyXG4gICAgICAgIHJlcyA9IHJlcy5hZGQoYXBwcm94UmVzKTtcclxuICAgICAgICByZW0gPSByZW0uc3ViKGFwcHJveFJlbSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhpcyBMb25nIGRpdmlkZWQgYnkgdGhlIHNwZWNpZmllZC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNkaXZpZGV9LlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBkaXZpc29yIERpdmlzb3JcclxuICogQHJldHVybnMgeyFMb25nfSBRdW90aWVudFxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5kaXYgPSBMb25nUHJvdG90eXBlLmRpdmlkZTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyBtb2R1bG8gdGhlIHNwZWNpZmllZC5cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBkaXZpc29yIERpdmlzb3JcclxuICogQHJldHVybnMgeyFMb25nfSBSZW1haW5kZXJcclxuICovXHJcbkxvbmdQcm90b3R5cGUubW9kdWxvID0gZnVuY3Rpb24gbW9kdWxvKGRpdmlzb3IpIHtcclxuICAgIGlmICghaXNMb25nKGRpdmlzb3IpKVxyXG4gICAgICAgIGRpdmlzb3IgPSBmcm9tVmFsdWUoZGl2aXNvcik7XHJcblxyXG4gICAgLy8gdXNlIHdhc20gc3VwcG9ydCBpZiBwcmVzZW50XHJcbiAgICBpZiAod2FzbSkge1xyXG4gICAgICAgIHZhciBsb3cgPSAodGhpcy51bnNpZ25lZCA/IHdhc20ucmVtX3UgOiB3YXNtLnJlbV9zKShcclxuICAgICAgICAgICAgdGhpcy5sb3csXHJcbiAgICAgICAgICAgIHRoaXMuaGlnaCxcclxuICAgICAgICAgICAgZGl2aXNvci5sb3csXHJcbiAgICAgICAgICAgIGRpdmlzb3IuaGlnaFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgcmV0dXJuIGZyb21CaXRzKGxvdywgd2FzbS5nZXRfaGlnaCgpLCB0aGlzLnVuc2lnbmVkKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5zdWIodGhpcy5kaXYoZGl2aXNvcikubXVsKGRpdmlzb3IpKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyBtb2R1bG8gdGhlIHNwZWNpZmllZC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNtb2R1bG99LlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBkaXZpc29yIERpdmlzb3JcclxuICogQHJldHVybnMgeyFMb25nfSBSZW1haW5kZXJcclxuICovXHJcbkxvbmdQcm90b3R5cGUubW9kID0gTG9uZ1Byb3RvdHlwZS5tb2R1bG87XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGlzIExvbmcgbW9kdWxvIHRoZSBzcGVjaWZpZWQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbW9kdWxvfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gZGl2aXNvciBEaXZpc29yXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gUmVtYWluZGVyXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLnJlbSA9IExvbmdQcm90b3R5cGUubW9kdWxvO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGJpdHdpc2UgTk9UIG9mIHRoaXMgTG9uZy5cclxuICogQHJldHVybnMgeyFMb25nfVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5ub3QgPSBmdW5jdGlvbiBub3QoKSB7XHJcbiAgICByZXR1cm4gZnJvbUJpdHMofnRoaXMubG93LCB+dGhpcy5oaWdoLCB0aGlzLnVuc2lnbmVkKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBiaXR3aXNlIEFORCBvZiB0aGlzIExvbmcgYW5kIHRoZSBzcGVjaWZpZWQuXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgTG9uZ1xyXG4gKiBAcmV0dXJucyB7IUxvbmd9XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmFuZCA9IGZ1bmN0aW9uIGFuZChvdGhlcikge1xyXG4gICAgaWYgKCFpc0xvbmcob3RoZXIpKVxyXG4gICAgICAgIG90aGVyID0gZnJvbVZhbHVlKG90aGVyKTtcclxuICAgIHJldHVybiBmcm9tQml0cyh0aGlzLmxvdyAmIG90aGVyLmxvdywgdGhpcy5oaWdoICYgb3RoZXIuaGlnaCwgdGhpcy51bnNpZ25lZCk7XHJcbn07XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgYml0d2lzZSBPUiBvZiB0aGlzIExvbmcgYW5kIHRoZSBzcGVjaWZpZWQuXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgTG9uZ1xyXG4gKiBAcmV0dXJucyB7IUxvbmd9XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLm9yID0gZnVuY3Rpb24gb3Iob3RoZXIpIHtcclxuICAgIGlmICghaXNMb25nKG90aGVyKSlcclxuICAgICAgICBvdGhlciA9IGZyb21WYWx1ZShvdGhlcik7XHJcbiAgICByZXR1cm4gZnJvbUJpdHModGhpcy5sb3cgfCBvdGhlci5sb3csIHRoaXMuaGlnaCB8IG90aGVyLmhpZ2gsIHRoaXMudW5zaWduZWQpO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGJpdHdpc2UgWE9SIG9mIHRoaXMgTG9uZyBhbmQgdGhlIGdpdmVuIG9uZS5cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBvdGhlciBPdGhlciBMb25nXHJcbiAqIEByZXR1cm5zIHshTG9uZ31cclxuICovXHJcbkxvbmdQcm90b3R5cGUueG9yID0gZnVuY3Rpb24geG9yKG90aGVyKSB7XHJcbiAgICBpZiAoIWlzTG9uZyhvdGhlcikpXHJcbiAgICAgICAgb3RoZXIgPSBmcm9tVmFsdWUob3RoZXIpO1xyXG4gICAgcmV0dXJuIGZyb21CaXRzKHRoaXMubG93IF4gb3RoZXIubG93LCB0aGlzLmhpZ2ggXiBvdGhlci5oaWdoLCB0aGlzLnVuc2lnbmVkKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgc2hpZnRlZCB0byB0aGUgbGVmdCBieSB0aGUgZ2l2ZW4gYW1vdW50LlxyXG4gKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xyXG4gKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5zaGlmdExlZnQgPSBmdW5jdGlvbiBzaGlmdExlZnQobnVtQml0cykge1xyXG4gICAgaWYgKGlzTG9uZyhudW1CaXRzKSlcclxuICAgICAgICBudW1CaXRzID0gbnVtQml0cy50b0ludCgpO1xyXG4gICAgaWYgKChudW1CaXRzICY9IDYzKSA9PT0gMClcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIGVsc2UgaWYgKG51bUJpdHMgPCAzMilcclxuICAgICAgICByZXR1cm4gZnJvbUJpdHModGhpcy5sb3cgPDwgbnVtQml0cywgKHRoaXMuaGlnaCA8PCBudW1CaXRzKSB8ICh0aGlzLmxvdyA+Pj4gKDMyIC0gbnVtQml0cykpLCB0aGlzLnVuc2lnbmVkKTtcclxuICAgIGVsc2VcclxuICAgICAgICByZXR1cm4gZnJvbUJpdHMoMCwgdGhpcy5sb3cgPDwgKG51bUJpdHMgLSAzMiksIHRoaXMudW5zaWduZWQpO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyBzaGlmdGVkIHRvIHRoZSBsZWZ0IGJ5IHRoZSBnaXZlbiBhbW91bnQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjc2hpZnRMZWZ0fS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gU2hpZnRlZCBMb25nXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLnNobCA9IExvbmdQcm90b3R5cGUuc2hpZnRMZWZ0O1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyBhcml0aG1ldGljYWxseSBzaGlmdGVkIHRvIHRoZSByaWdodCBieSB0aGUgZ2l2ZW4gYW1vdW50LlxyXG4gKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xyXG4gKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5zaGlmdFJpZ2h0ID0gZnVuY3Rpb24gc2hpZnRSaWdodChudW1CaXRzKSB7XHJcbiAgICBpZiAoaXNMb25nKG51bUJpdHMpKVxyXG4gICAgICAgIG51bUJpdHMgPSBudW1CaXRzLnRvSW50KCk7XHJcbiAgICBpZiAoKG51bUJpdHMgJj0gNjMpID09PSAwKVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgZWxzZSBpZiAobnVtQml0cyA8IDMyKVxyXG4gICAgICAgIHJldHVybiBmcm9tQml0cygodGhpcy5sb3cgPj4+IG51bUJpdHMpIHwgKHRoaXMuaGlnaCA8PCAoMzIgLSBudW1CaXRzKSksIHRoaXMuaGlnaCA+PiBudW1CaXRzLCB0aGlzLnVuc2lnbmVkKTtcclxuICAgIGVsc2VcclxuICAgICAgICByZXR1cm4gZnJvbUJpdHModGhpcy5oaWdoID4+IChudW1CaXRzIC0gMzIpLCB0aGlzLmhpZ2ggPj0gMCA/IDAgOiAtMSwgdGhpcy51bnNpZ25lZCk7XHJcbn07XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIGFyaXRobWV0aWNhbGx5IHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0IGJ5IHRoZSBnaXZlbiBhbW91bnQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjc2hpZnRSaWdodH0uXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xyXG4gKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5zaHIgPSBMb25nUHJvdG90eXBlLnNoaWZ0UmlnaHQ7XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIGxvZ2ljYWxseSBzaGlmdGVkIHRvIHRoZSByaWdodCBieSB0aGUgZ2l2ZW4gYW1vdW50LlxyXG4gKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xyXG4gKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5zaGlmdFJpZ2h0VW5zaWduZWQgPSBmdW5jdGlvbiBzaGlmdFJpZ2h0VW5zaWduZWQobnVtQml0cykge1xyXG4gICAgaWYgKGlzTG9uZyhudW1CaXRzKSlcclxuICAgICAgICBudW1CaXRzID0gbnVtQml0cy50b0ludCgpO1xyXG4gICAgbnVtQml0cyAmPSA2MztcclxuICAgIGlmIChudW1CaXRzID09PSAwKVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgdmFyIGhpZ2ggPSB0aGlzLmhpZ2g7XHJcbiAgICAgICAgaWYgKG51bUJpdHMgPCAzMikge1xyXG4gICAgICAgICAgICB2YXIgbG93ID0gdGhpcy5sb3c7XHJcbiAgICAgICAgICAgIHJldHVybiBmcm9tQml0cygobG93ID4+PiBudW1CaXRzKSB8IChoaWdoIDw8ICgzMiAtIG51bUJpdHMpKSwgaGlnaCA+Pj4gbnVtQml0cywgdGhpcy51bnNpZ25lZCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChudW1CaXRzID09PSAzMilcclxuICAgICAgICAgICAgcmV0dXJuIGZyb21CaXRzKGhpZ2gsIDAsIHRoaXMudW5zaWduZWQpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgcmV0dXJuIGZyb21CaXRzKGhpZ2ggPj4+IChudW1CaXRzIC0gMzIpLCAwLCB0aGlzLnVuc2lnbmVkKTtcclxuICAgIH1cclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgbG9naWNhbGx5IHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0IGJ5IHRoZSBnaXZlbiBhbW91bnQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjc2hpZnRSaWdodFVuc2lnbmVkfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gU2hpZnRlZCBMb25nXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLnNocnUgPSBMb25nUHJvdG90eXBlLnNoaWZ0UmlnaHRVbnNpZ25lZDtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgbG9naWNhbGx5IHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0IGJ5IHRoZSBnaXZlbiBhbW91bnQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjc2hpZnRSaWdodFVuc2lnbmVkfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gU2hpZnRlZCBMb25nXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLnNocl91ID0gTG9uZ1Byb3RvdHlwZS5zaGlmdFJpZ2h0VW5zaWduZWQ7XHJcblxyXG4vKipcclxuICogQ29udmVydHMgdGhpcyBMb25nIHRvIHNpZ25lZC5cclxuICogQHJldHVybnMgeyFMb25nfSBTaWduZWQgbG9uZ1xyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS50b1NpZ25lZCA9IGZ1bmN0aW9uIHRvU2lnbmVkKCkge1xyXG4gICAgaWYgKCF0aGlzLnVuc2lnbmVkKVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgcmV0dXJuIGZyb21CaXRzKHRoaXMubG93LCB0aGlzLmhpZ2gsIGZhbHNlKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyB0aGlzIExvbmcgdG8gdW5zaWduZWQuXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gVW5zaWduZWQgbG9uZ1xyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS50b1Vuc2lnbmVkID0gZnVuY3Rpb24gdG9VbnNpZ25lZCgpIHtcclxuICAgIGlmICh0aGlzLnVuc2lnbmVkKVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgcmV0dXJuIGZyb21CaXRzKHRoaXMubG93LCB0aGlzLmhpZ2gsIHRydWUpO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIHRoaXMgTG9uZyB0byBpdHMgYnl0ZSByZXByZXNlbnRhdGlvbi5cclxuICogQHBhcmFtIHtib29sZWFuPX0gbGUgV2hldGhlciBsaXR0bGUgb3IgYmlnIGVuZGlhbiwgZGVmYXVsdHMgdG8gYmlnIGVuZGlhblxyXG4gKiBAcmV0dXJucyB7IUFycmF5LjxudW1iZXI+fSBCeXRlIHJlcHJlc2VudGF0aW9uXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLnRvQnl0ZXMgPSBmdW5jdGlvbiB0b0J5dGVzKGxlKSB7XHJcbiAgICByZXR1cm4gbGUgPyB0aGlzLnRvQnl0ZXNMRSgpIDogdGhpcy50b0J5dGVzQkUoKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyB0aGlzIExvbmcgdG8gaXRzIGxpdHRsZSBlbmRpYW4gYnl0ZSByZXByZXNlbnRhdGlvbi5cclxuICogQHJldHVybnMgeyFBcnJheS48bnVtYmVyPn0gTGl0dGxlIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLnRvQnl0ZXNMRSA9IGZ1bmN0aW9uIHRvQnl0ZXNMRSgpIHtcclxuICAgIHZhciBoaSA9IHRoaXMuaGlnaCxcclxuICAgICAgICBsbyA9IHRoaXMubG93O1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgICBsbyAgICAgICAgJiAweGZmLFxyXG4gICAgICAgIGxvID4+PiAgOCAmIDB4ZmYsXHJcbiAgICAgICAgbG8gPj4+IDE2ICYgMHhmZixcclxuICAgICAgICBsbyA+Pj4gMjQgICAgICAgLFxyXG4gICAgICAgIGhpICAgICAgICAmIDB4ZmYsXHJcbiAgICAgICAgaGkgPj4+ICA4ICYgMHhmZixcclxuICAgICAgICBoaSA+Pj4gMTYgJiAweGZmLFxyXG4gICAgICAgIGhpID4+PiAyNFxyXG4gICAgXTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyB0aGlzIExvbmcgdG8gaXRzIGJpZyBlbmRpYW4gYnl0ZSByZXByZXNlbnRhdGlvbi5cclxuICogQHJldHVybnMgeyFBcnJheS48bnVtYmVyPn0gQmlnIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLnRvQnl0ZXNCRSA9IGZ1bmN0aW9uIHRvQnl0ZXNCRSgpIHtcclxuICAgIHZhciBoaSA9IHRoaXMuaGlnaCxcclxuICAgICAgICBsbyA9IHRoaXMubG93O1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgICBoaSA+Pj4gMjQgICAgICAgLFxyXG4gICAgICAgIGhpID4+PiAxNiAmIDB4ZmYsXHJcbiAgICAgICAgaGkgPj4+ICA4ICYgMHhmZixcclxuICAgICAgICBoaSAgICAgICAgJiAweGZmLFxyXG4gICAgICAgIGxvID4+PiAyNCAgICAgICAsXHJcbiAgICAgICAgbG8gPj4+IDE2ICYgMHhmZixcclxuICAgICAgICBsbyA+Pj4gIDggJiAweGZmLFxyXG4gICAgICAgIGxvICAgICAgICAmIDB4ZmZcclxuICAgIF07XHJcbn07XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIExvbmcgZnJvbSBpdHMgYnl0ZSByZXByZXNlbnRhdGlvbi5cclxuICogQHBhcmFtIHshQXJyYXkuPG51bWJlcj59IGJ5dGVzIEJ5dGUgcmVwcmVzZW50YXRpb25cclxuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxyXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBsZSBXaGV0aGVyIGxpdHRsZSBvciBiaWcgZW5kaWFuLCBkZWZhdWx0cyB0byBiaWcgZW5kaWFuXHJcbiAqIEByZXR1cm5zIHtMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXHJcbiAqL1xyXG5Mb25nLmZyb21CeXRlcyA9IGZ1bmN0aW9uIGZyb21CeXRlcyhieXRlcywgdW5zaWduZWQsIGxlKSB7XHJcbiAgICByZXR1cm4gbGUgPyBMb25nLmZyb21CeXRlc0xFKGJ5dGVzLCB1bnNpZ25lZCkgOiBMb25nLmZyb21CeXRlc0JFKGJ5dGVzLCB1bnNpZ25lZCk7XHJcbn07XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIExvbmcgZnJvbSBpdHMgbGl0dGxlIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uLlxyXG4gKiBAcGFyYW0geyFBcnJheS48bnVtYmVyPn0gYnl0ZXMgTGl0dGxlIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcclxuICogQHJldHVybnMge0xvbmd9IFRoZSBjb3JyZXNwb25kaW5nIExvbmcgdmFsdWVcclxuICovXHJcbkxvbmcuZnJvbUJ5dGVzTEUgPSBmdW5jdGlvbiBmcm9tQnl0ZXNMRShieXRlcywgdW5zaWduZWQpIHtcclxuICAgIHJldHVybiBuZXcgTG9uZyhcclxuICAgICAgICBieXRlc1swXSAgICAgICB8XHJcbiAgICAgICAgYnl0ZXNbMV0gPDwgIDggfFxyXG4gICAgICAgIGJ5dGVzWzJdIDw8IDE2IHxcclxuICAgICAgICBieXRlc1szXSA8PCAyNCxcclxuICAgICAgICBieXRlc1s0XSAgICAgICB8XHJcbiAgICAgICAgYnl0ZXNbNV0gPDwgIDggfFxyXG4gICAgICAgIGJ5dGVzWzZdIDw8IDE2IHxcclxuICAgICAgICBieXRlc1s3XSA8PCAyNCxcclxuICAgICAgICB1bnNpZ25lZFxyXG4gICAgKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgTG9uZyBmcm9tIGl0cyBiaWcgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb24uXHJcbiAqIEBwYXJhbSB7IUFycmF5LjxudW1iZXI+fSBieXRlcyBCaWcgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb25cclxuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxyXG4gKiBAcmV0dXJucyB7TG9uZ30gVGhlIGNvcnJlc3BvbmRpbmcgTG9uZyB2YWx1ZVxyXG4gKi9cclxuTG9uZy5mcm9tQnl0ZXNCRSA9IGZ1bmN0aW9uIGZyb21CeXRlc0JFKGJ5dGVzLCB1bnNpZ25lZCkge1xyXG4gICAgcmV0dXJuIG5ldyBMb25nKFxyXG4gICAgICAgIGJ5dGVzWzRdIDw8IDI0IHxcclxuICAgICAgICBieXRlc1s1XSA8PCAxNiB8XHJcbiAgICAgICAgYnl0ZXNbNl0gPDwgIDggfFxyXG4gICAgICAgIGJ5dGVzWzddLFxyXG4gICAgICAgIGJ5dGVzWzBdIDw8IDI0IHxcclxuICAgICAgICBieXRlc1sxXSA8PCAxNiB8XHJcbiAgICAgICAgYnl0ZXNbMl0gPDwgIDggfFxyXG4gICAgICAgIGJ5dGVzWzNdLFxyXG4gICAgICAgIHVuc2lnbmVkXHJcbiAgICApO1xyXG59O1xyXG4iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwiLy8gQSBsaWJyYXJ5IG9mIHNlZWRhYmxlIFJOR3MgaW1wbGVtZW50ZWQgaW4gSmF2YXNjcmlwdC5cbi8vXG4vLyBVc2FnZTpcbi8vXG4vLyB2YXIgc2VlZHJhbmRvbSA9IHJlcXVpcmUoJ3NlZWRyYW5kb20nKTtcbi8vIHZhciByYW5kb20gPSBzZWVkcmFuZG9tKDEpOyAvLyBvciBhbnkgc2VlZC5cbi8vIHZhciB4ID0gcmFuZG9tKCk7ICAgICAgIC8vIDAgPD0geCA8IDEuICBFdmVyeSBiaXQgaXMgcmFuZG9tLlxuLy8gdmFyIHggPSByYW5kb20ucXVpY2soKTsgLy8gMCA8PSB4IDwgMS4gIDMyIGJpdHMgb2YgcmFuZG9tbmVzcy5cblxuLy8gYWxlYSwgYSA1My1iaXQgbXVsdGlwbHktd2l0aC1jYXJyeSBnZW5lcmF0b3IgYnkgSm9oYW5uZXMgQmFhZ8O4ZS5cbi8vIFBlcmlvZDogfjJeMTE2XG4vLyBSZXBvcnRlZCB0byBwYXNzIGFsbCBCaWdDcnVzaCB0ZXN0cy5cbnZhciBhbGVhID0gcmVxdWlyZSgnLi9saWIvYWxlYScpO1xuXG4vLyB4b3IxMjgsIGEgcHVyZSB4b3Itc2hpZnQgZ2VuZXJhdG9yIGJ5IEdlb3JnZSBNYXJzYWdsaWEuXG4vLyBQZXJpb2Q6IDJeMTI4LTEuXG4vLyBSZXBvcnRlZCB0byBmYWlsOiBNYXRyaXhSYW5rIGFuZCBMaW5lYXJDb21wLlxudmFyIHhvcjEyOCA9IHJlcXVpcmUoJy4vbGliL3hvcjEyOCcpO1xuXG4vLyB4b3J3b3csIEdlb3JnZSBNYXJzYWdsaWEncyAxNjAtYml0IHhvci1zaGlmdCBjb21iaW5lZCBwbHVzIHdleWwuXG4vLyBQZXJpb2Q6IDJeMTkyLTJeMzJcbi8vIFJlcG9ydGVkIHRvIGZhaWw6IENvbGxpc2lvbk92ZXIsIFNpbXBQb2tlciwgYW5kIExpbmVhckNvbXAuXG52YXIgeG9yd293ID0gcmVxdWlyZSgnLi9saWIveG9yd293Jyk7XG5cbi8vIHhvcnNoaWZ0NywgYnkgRnJhbsOnb2lzIFBhbm5ldG9uIGFuZCBQaWVycmUgTCdlY3V5ZXIsIHRha2VzXG4vLyBhIGRpZmZlcmVudCBhcHByb2FjaDogaXQgYWRkcyByb2J1c3RuZXNzIGJ5IGFsbG93aW5nIG1vcmUgc2hpZnRzXG4vLyB0aGFuIE1hcnNhZ2xpYSdzIG9yaWdpbmFsIHRocmVlLiAgSXQgaXMgYSA3LXNoaWZ0IGdlbmVyYXRvclxuLy8gd2l0aCAyNTYgYml0cywgdGhhdCBwYXNzZXMgQmlnQ3J1c2ggd2l0aCBubyBzeXN0bWF0aWMgZmFpbHVyZXMuXG4vLyBQZXJpb2QgMl4yNTYtMS5cbi8vIE5vIHN5c3RlbWF0aWMgQmlnQ3J1c2ggZmFpbHVyZXMgcmVwb3J0ZWQuXG52YXIgeG9yc2hpZnQ3ID0gcmVxdWlyZSgnLi9saWIveG9yc2hpZnQ3Jyk7XG5cbi8vIHhvcjQwOTYsIGJ5IFJpY2hhcmQgQnJlbnQsIGlzIGEgNDA5Ni1iaXQgeG9yLXNoaWZ0IHdpdGggYVxuLy8gdmVyeSBsb25nIHBlcmlvZCB0aGF0IGFsc28gYWRkcyBhIFdleWwgZ2VuZXJhdG9yLiBJdCBhbHNvIHBhc3Nlc1xuLy8gQmlnQ3J1c2ggd2l0aCBubyBzeXN0ZW1hdGljIGZhaWx1cmVzLiAgSXRzIGxvbmcgcGVyaW9kIG1heVxuLy8gYmUgdXNlZnVsIGlmIHlvdSBoYXZlIG1hbnkgZ2VuZXJhdG9ycyBhbmQgbmVlZCB0byBhdm9pZFxuLy8gY29sbGlzaW9ucy5cbi8vIFBlcmlvZDogMl40MTI4LTJeMzIuXG4vLyBObyBzeXN0ZW1hdGljIEJpZ0NydXNoIGZhaWx1cmVzIHJlcG9ydGVkLlxudmFyIHhvcjQwOTYgPSByZXF1aXJlKCcuL2xpYi94b3I0MDk2Jyk7XG5cbi8vIFR5Y2hlLWksIGJ5IFNhbXVlbCBOZXZlcyBhbmQgRmlsaXBlIEFyYXVqbywgaXMgYSBiaXQtc2hpZnRpbmcgcmFuZG9tXG4vLyBudW1iZXIgZ2VuZXJhdG9yIGRlcml2ZWQgZnJvbSBDaGFDaGEsIGEgbW9kZXJuIHN0cmVhbSBjaXBoZXIuXG4vLyBodHRwczovL2VkZW4uZGVpLnVjLnB0L35zbmV2ZXMvcHVicy8yMDExLXNuZmEyLnBkZlxuLy8gUGVyaW9kOiB+Ml4xMjdcbi8vIE5vIHN5c3RlbWF0aWMgQmlnQ3J1c2ggZmFpbHVyZXMgcmVwb3J0ZWQuXG52YXIgdHljaGVpID0gcmVxdWlyZSgnLi9saWIvdHljaGVpJyk7XG5cbi8vIFRoZSBvcmlnaW5hbCBBUkM0LWJhc2VkIHBybmcgaW5jbHVkZWQgaW4gdGhpcyBsaWJyYXJ5LlxuLy8gUGVyaW9kOiB+Ml4xNjAwXG52YXIgc3IgPSByZXF1aXJlKCcuL3NlZWRyYW5kb20nKTtcblxuc3IuYWxlYSA9IGFsZWE7XG5zci54b3IxMjggPSB4b3IxMjg7XG5zci54b3J3b3cgPSB4b3J3b3c7XG5zci54b3JzaGlmdDcgPSB4b3JzaGlmdDc7XG5zci54b3I0MDk2ID0geG9yNDA5NjtcbnNyLnR5Y2hlaSA9IHR5Y2hlaTtcblxubW9kdWxlLmV4cG9ydHMgPSBzcjtcbiIsIi8vIEEgcG9ydCBvZiBhbiBhbGdvcml0aG0gYnkgSm9oYW5uZXMgQmFhZ8O4ZSA8YmFhZ29lQGJhYWdvZS5jb20+LCAyMDEwXG4vLyBodHRwOi8vYmFhZ29lLmNvbS9lbi9SYW5kb21NdXNpbmdzL2phdmFzY3JpcHQvXG4vLyBodHRwczovL2dpdGh1Yi5jb20vbnF1aW5sYW4vYmV0dGVyLXJhbmRvbS1udW1iZXJzLWZvci1qYXZhc2NyaXB0LW1pcnJvclxuLy8gT3JpZ2luYWwgd29yayBpcyB1bmRlciBNSVQgbGljZW5zZSAtXG5cbi8vIENvcHlyaWdodCAoQykgMjAxMCBieSBKb2hhbm5lcyBCYWFnw7hlIDxiYWFnb2VAYmFhZ29lLm9yZz5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vLyBcbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vIFxuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cblxuXG4oZnVuY3Rpb24oZ2xvYmFsLCBtb2R1bGUsIGRlZmluZSkge1xuXG5mdW5jdGlvbiBBbGVhKHNlZWQpIHtcbiAgdmFyIG1lID0gdGhpcywgbWFzaCA9IE1hc2goKTtcblxuICBtZS5uZXh0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHQgPSAyMDkxNjM5ICogbWUuczAgKyBtZS5jICogMi4zMjgzMDY0MzY1Mzg2OTYzZS0xMDsgLy8gMl4tMzJcbiAgICBtZS5zMCA9IG1lLnMxO1xuICAgIG1lLnMxID0gbWUuczI7XG4gICAgcmV0dXJuIG1lLnMyID0gdCAtIChtZS5jID0gdCB8IDApO1xuICB9O1xuXG4gIC8vIEFwcGx5IHRoZSBzZWVkaW5nIGFsZ29yaXRobSBmcm9tIEJhYWdvZS5cbiAgbWUuYyA9IDE7XG4gIG1lLnMwID0gbWFzaCgnICcpO1xuICBtZS5zMSA9IG1hc2goJyAnKTtcbiAgbWUuczIgPSBtYXNoKCcgJyk7XG4gIG1lLnMwIC09IG1hc2goc2VlZCk7XG4gIGlmIChtZS5zMCA8IDApIHsgbWUuczAgKz0gMTsgfVxuICBtZS5zMSAtPSBtYXNoKHNlZWQpO1xuICBpZiAobWUuczEgPCAwKSB7IG1lLnMxICs9IDE7IH1cbiAgbWUuczIgLT0gbWFzaChzZWVkKTtcbiAgaWYgKG1lLnMyIDwgMCkgeyBtZS5zMiArPSAxOyB9XG4gIG1hc2ggPSBudWxsO1xufVxuXG5mdW5jdGlvbiBjb3B5KGYsIHQpIHtcbiAgdC5jID0gZi5jO1xuICB0LnMwID0gZi5zMDtcbiAgdC5zMSA9IGYuczE7XG4gIHQuczIgPSBmLnMyO1xuICByZXR1cm4gdDtcbn1cblxuZnVuY3Rpb24gaW1wbChzZWVkLCBvcHRzKSB7XG4gIHZhciB4ZyA9IG5ldyBBbGVhKHNlZWQpLFxuICAgICAgc3RhdGUgPSBvcHRzICYmIG9wdHMuc3RhdGUsXG4gICAgICBwcm5nID0geGcubmV4dDtcbiAgcHJuZy5pbnQzMiA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gKHhnLm5leHQoKSAqIDB4MTAwMDAwMDAwKSB8IDA7IH1cbiAgcHJuZy5kb3VibGUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gcHJuZygpICsgKHBybmcoKSAqIDB4MjAwMDAwIHwgMCkgKiAxLjExMDIyMzAyNDYyNTE1NjVlLTE2OyAvLyAyXi01M1xuICB9O1xuICBwcm5nLnF1aWNrID0gcHJuZztcbiAgaWYgKHN0YXRlKSB7XG4gICAgaWYgKHR5cGVvZihzdGF0ZSkgPT0gJ29iamVjdCcpIGNvcHkoc3RhdGUsIHhnKTtcbiAgICBwcm5nLnN0YXRlID0gZnVuY3Rpb24oKSB7IHJldHVybiBjb3B5KHhnLCB7fSk7IH1cbiAgfVxuICByZXR1cm4gcHJuZztcbn1cblxuZnVuY3Rpb24gTWFzaCgpIHtcbiAgdmFyIG4gPSAweGVmYzgyNDlkO1xuXG4gIHZhciBtYXNoID0gZnVuY3Rpb24oZGF0YSkge1xuICAgIGRhdGEgPSBkYXRhLnRvU3RyaW5nKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBuICs9IGRhdGEuY2hhckNvZGVBdChpKTtcbiAgICAgIHZhciBoID0gMC4wMjUxOTYwMzI4MjQxNjkzOCAqIG47XG4gICAgICBuID0gaCA+Pj4gMDtcbiAgICAgIGggLT0gbjtcbiAgICAgIGggKj0gbjtcbiAgICAgIG4gPSBoID4+PiAwO1xuICAgICAgaCAtPSBuO1xuICAgICAgbiArPSBoICogMHgxMDAwMDAwMDA7IC8vIDJeMzJcbiAgICB9XG4gICAgcmV0dXJuIChuID4+PiAwKSAqIDIuMzI4MzA2NDM2NTM4Njk2M2UtMTA7IC8vIDJeLTMyXG4gIH07XG5cbiAgcmV0dXJuIG1hc2g7XG59XG5cblxuaWYgKG1vZHVsZSAmJiBtb2R1bGUuZXhwb3J0cykge1xuICBtb2R1bGUuZXhwb3J0cyA9IGltcGw7XG59IGVsc2UgaWYgKGRlZmluZSAmJiBkZWZpbmUuYW1kKSB7XG4gIGRlZmluZShmdW5jdGlvbigpIHsgcmV0dXJuIGltcGw7IH0pO1xufSBlbHNlIHtcbiAgdGhpcy5hbGVhID0gaW1wbDtcbn1cblxufSkoXG4gIHRoaXMsXG4gICh0eXBlb2YgbW9kdWxlKSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUsICAgIC8vIHByZXNlbnQgaW4gbm9kZS5qc1xuICAodHlwZW9mIGRlZmluZSkgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUgICAvLyBwcmVzZW50IHdpdGggYW4gQU1EIGxvYWRlclxuKTtcblxuXG4iLCIvLyBBIEphdmFzY3JpcHQgaW1wbGVtZW50YWlvbiBvZiB0aGUgXCJUeWNoZS1pXCIgcHJuZyBhbGdvcml0aG0gYnlcbi8vIFNhbXVlbCBOZXZlcyBhbmQgRmlsaXBlIEFyYXVqby5cbi8vIFNlZSBodHRwczovL2VkZW4uZGVpLnVjLnB0L35zbmV2ZXMvcHVicy8yMDExLXNuZmEyLnBkZlxuXG4oZnVuY3Rpb24oZ2xvYmFsLCBtb2R1bGUsIGRlZmluZSkge1xuXG5mdW5jdGlvbiBYb3JHZW4oc2VlZCkge1xuICB2YXIgbWUgPSB0aGlzLCBzdHJzZWVkID0gJyc7XG5cbiAgLy8gU2V0IHVwIGdlbmVyYXRvciBmdW5jdGlvbi5cbiAgbWUubmV4dCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBiID0gbWUuYiwgYyA9IG1lLmMsIGQgPSBtZS5kLCBhID0gbWUuYTtcbiAgICBiID0gKGIgPDwgMjUpIF4gKGIgPj4+IDcpIF4gYztcbiAgICBjID0gKGMgLSBkKSB8IDA7XG4gICAgZCA9IChkIDw8IDI0KSBeIChkID4+PiA4KSBeIGE7XG4gICAgYSA9IChhIC0gYikgfCAwO1xuICAgIG1lLmIgPSBiID0gKGIgPDwgMjApIF4gKGIgPj4+IDEyKSBeIGM7XG4gICAgbWUuYyA9IGMgPSAoYyAtIGQpIHwgMDtcbiAgICBtZS5kID0gKGQgPDwgMTYpIF4gKGMgPj4+IDE2KSBeIGE7XG4gICAgcmV0dXJuIG1lLmEgPSAoYSAtIGIpIHwgMDtcbiAgfTtcblxuICAvKiBUaGUgZm9sbG93aW5nIGlzIG5vbi1pbnZlcnRlZCB0eWNoZSwgd2hpY2ggaGFzIGJldHRlciBpbnRlcm5hbFxuICAgKiBiaXQgZGlmZnVzaW9uLCBidXQgd2hpY2ggaXMgYWJvdXQgMjUlIHNsb3dlciB0aGFuIHR5Y2hlLWkgaW4gSlMuXG4gIG1lLm5leHQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgYSA9IG1lLmEsIGIgPSBtZS5iLCBjID0gbWUuYywgZCA9IG1lLmQ7XG4gICAgYSA9IChtZS5hICsgbWUuYiB8IDApID4+PiAwO1xuICAgIGQgPSBtZS5kIF4gYTsgZCA9IGQgPDwgMTYgXiBkID4+PiAxNjtcbiAgICBjID0gbWUuYyArIGQgfCAwO1xuICAgIGIgPSBtZS5iIF4gYzsgYiA9IGIgPDwgMTIgXiBkID4+PiAyMDtcbiAgICBtZS5hID0gYSA9IGEgKyBiIHwgMDtcbiAgICBkID0gZCBeIGE7IG1lLmQgPSBkID0gZCA8PCA4IF4gZCA+Pj4gMjQ7XG4gICAgbWUuYyA9IGMgPSBjICsgZCB8IDA7XG4gICAgYiA9IGIgXiBjO1xuICAgIHJldHVybiBtZS5iID0gKGIgPDwgNyBeIGIgPj4+IDI1KTtcbiAgfVxuICAqL1xuXG4gIG1lLmEgPSAwO1xuICBtZS5iID0gMDtcbiAgbWUuYyA9IDI2NTQ0MzU3NjkgfCAwO1xuICBtZS5kID0gMTM2NzEzMDU1MTtcblxuICBpZiAoc2VlZCA9PT0gTWF0aC5mbG9vcihzZWVkKSkge1xuICAgIC8vIEludGVnZXIgc2VlZC5cbiAgICBtZS5hID0gKHNlZWQgLyAweDEwMDAwMDAwMCkgfCAwO1xuICAgIG1lLmIgPSBzZWVkIHwgMDtcbiAgfSBlbHNlIHtcbiAgICAvLyBTdHJpbmcgc2VlZC5cbiAgICBzdHJzZWVkICs9IHNlZWQ7XG4gIH1cblxuICAvLyBNaXggaW4gc3RyaW5nIHNlZWQsIHRoZW4gZGlzY2FyZCBhbiBpbml0aWFsIGJhdGNoIG9mIDY0IHZhbHVlcy5cbiAgZm9yICh2YXIgayA9IDA7IGsgPCBzdHJzZWVkLmxlbmd0aCArIDIwOyBrKyspIHtcbiAgICBtZS5iIF49IHN0cnNlZWQuY2hhckNvZGVBdChrKSB8IDA7XG4gICAgbWUubmV4dCgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvcHkoZiwgdCkge1xuICB0LmEgPSBmLmE7XG4gIHQuYiA9IGYuYjtcbiAgdC5jID0gZi5jO1xuICB0LmQgPSBmLmQ7XG4gIHJldHVybiB0O1xufTtcblxuZnVuY3Rpb24gaW1wbChzZWVkLCBvcHRzKSB7XG4gIHZhciB4ZyA9IG5ldyBYb3JHZW4oc2VlZCksXG4gICAgICBzdGF0ZSA9IG9wdHMgJiYgb3B0cy5zdGF0ZSxcbiAgICAgIHBybmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuICh4Zy5uZXh0KCkgPj4+IDApIC8gMHgxMDAwMDAwMDA7IH07XG4gIHBybmcuZG91YmxlID0gZnVuY3Rpb24oKSB7XG4gICAgZG8ge1xuICAgICAgdmFyIHRvcCA9IHhnLm5leHQoKSA+Pj4gMTEsXG4gICAgICAgICAgYm90ID0gKHhnLm5leHQoKSA+Pj4gMCkgLyAweDEwMDAwMDAwMCxcbiAgICAgICAgICByZXN1bHQgPSAodG9wICsgYm90KSAvICgxIDw8IDIxKTtcbiAgICB9IHdoaWxlIChyZXN1bHQgPT09IDApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIHBybmcuaW50MzIgPSB4Zy5uZXh0O1xuICBwcm5nLnF1aWNrID0gcHJuZztcbiAgaWYgKHN0YXRlKSB7XG4gICAgaWYgKHR5cGVvZihzdGF0ZSkgPT0gJ29iamVjdCcpIGNvcHkoc3RhdGUsIHhnKTtcbiAgICBwcm5nLnN0YXRlID0gZnVuY3Rpb24oKSB7IHJldHVybiBjb3B5KHhnLCB7fSk7IH1cbiAgfVxuICByZXR1cm4gcHJuZztcbn1cblxuaWYgKG1vZHVsZSAmJiBtb2R1bGUuZXhwb3J0cykge1xuICBtb2R1bGUuZXhwb3J0cyA9IGltcGw7XG59IGVsc2UgaWYgKGRlZmluZSAmJiBkZWZpbmUuYW1kKSB7XG4gIGRlZmluZShmdW5jdGlvbigpIHsgcmV0dXJuIGltcGw7IH0pO1xufSBlbHNlIHtcbiAgdGhpcy50eWNoZWkgPSBpbXBsO1xufVxuXG59KShcbiAgdGhpcyxcbiAgKHR5cGVvZiBtb2R1bGUpID09ICdvYmplY3QnICYmIG1vZHVsZSwgICAgLy8gcHJlc2VudCBpbiBub2RlLmpzXG4gICh0eXBlb2YgZGVmaW5lKSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZSAgIC8vIHByZXNlbnQgd2l0aCBhbiBBTUQgbG9hZGVyXG4pO1xuXG5cbiIsIi8vIEEgSmF2YXNjcmlwdCBpbXBsZW1lbnRhaW9uIG9mIHRoZSBcInhvcjEyOFwiIHBybmcgYWxnb3JpdGhtIGJ5XG4vLyBHZW9yZ2UgTWFyc2FnbGlhLiAgU2VlIGh0dHA6Ly93d3cuanN0YXRzb2Z0Lm9yZy92MDgvaTE0L3BhcGVyXG5cbihmdW5jdGlvbihnbG9iYWwsIG1vZHVsZSwgZGVmaW5lKSB7XG5cbmZ1bmN0aW9uIFhvckdlbihzZWVkKSB7XG4gIHZhciBtZSA9IHRoaXMsIHN0cnNlZWQgPSAnJztcblxuICBtZS54ID0gMDtcbiAgbWUueSA9IDA7XG4gIG1lLnogPSAwO1xuICBtZS53ID0gMDtcblxuICAvLyBTZXQgdXAgZ2VuZXJhdG9yIGZ1bmN0aW9uLlxuICBtZS5uZXh0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHQgPSBtZS54IF4gKG1lLnggPDwgMTEpO1xuICAgIG1lLnggPSBtZS55O1xuICAgIG1lLnkgPSBtZS56O1xuICAgIG1lLnogPSBtZS53O1xuICAgIHJldHVybiBtZS53IF49IChtZS53ID4+PiAxOSkgXiB0IF4gKHQgPj4+IDgpO1xuICB9O1xuXG4gIGlmIChzZWVkID09PSAoc2VlZCB8IDApKSB7XG4gICAgLy8gSW50ZWdlciBzZWVkLlxuICAgIG1lLnggPSBzZWVkO1xuICB9IGVsc2Uge1xuICAgIC8vIFN0cmluZyBzZWVkLlxuICAgIHN0cnNlZWQgKz0gc2VlZDtcbiAgfVxuXG4gIC8vIE1peCBpbiBzdHJpbmcgc2VlZCwgdGhlbiBkaXNjYXJkIGFuIGluaXRpYWwgYmF0Y2ggb2YgNjQgdmFsdWVzLlxuICBmb3IgKHZhciBrID0gMDsgayA8IHN0cnNlZWQubGVuZ3RoICsgNjQ7IGsrKykge1xuICAgIG1lLnggXj0gc3Ryc2VlZC5jaGFyQ29kZUF0KGspIHwgMDtcbiAgICBtZS5uZXh0KCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29weShmLCB0KSB7XG4gIHQueCA9IGYueDtcbiAgdC55ID0gZi55O1xuICB0LnogPSBmLno7XG4gIHQudyA9IGYudztcbiAgcmV0dXJuIHQ7XG59XG5cbmZ1bmN0aW9uIGltcGwoc2VlZCwgb3B0cykge1xuICB2YXIgeGcgPSBuZXcgWG9yR2VuKHNlZWQpLFxuICAgICAgc3RhdGUgPSBvcHRzICYmIG9wdHMuc3RhdGUsXG4gICAgICBwcm5nID0gZnVuY3Rpb24oKSB7IHJldHVybiAoeGcubmV4dCgpID4+PiAwKSAvIDB4MTAwMDAwMDAwOyB9O1xuICBwcm5nLmRvdWJsZSA9IGZ1bmN0aW9uKCkge1xuICAgIGRvIHtcbiAgICAgIHZhciB0b3AgPSB4Zy5uZXh0KCkgPj4+IDExLFxuICAgICAgICAgIGJvdCA9ICh4Zy5uZXh0KCkgPj4+IDApIC8gMHgxMDAwMDAwMDAsXG4gICAgICAgICAgcmVzdWx0ID0gKHRvcCArIGJvdCkgLyAoMSA8PCAyMSk7XG4gICAgfSB3aGlsZSAocmVzdWx0ID09PSAwKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICBwcm5nLmludDMyID0geGcubmV4dDtcbiAgcHJuZy5xdWljayA9IHBybmc7XG4gIGlmIChzdGF0ZSkge1xuICAgIGlmICh0eXBlb2Yoc3RhdGUpID09ICdvYmplY3QnKSBjb3B5KHN0YXRlLCB4Zyk7XG4gICAgcHJuZy5zdGF0ZSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gY29weSh4Zywge30pOyB9XG4gIH1cbiAgcmV0dXJuIHBybmc7XG59XG5cbmlmIChtb2R1bGUgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBpbXBsO1xufSBlbHNlIGlmIChkZWZpbmUgJiYgZGVmaW5lLmFtZCkge1xuICBkZWZpbmUoZnVuY3Rpb24oKSB7IHJldHVybiBpbXBsOyB9KTtcbn0gZWxzZSB7XG4gIHRoaXMueG9yMTI4ID0gaW1wbDtcbn1cblxufSkoXG4gIHRoaXMsXG4gICh0eXBlb2YgbW9kdWxlKSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUsICAgIC8vIHByZXNlbnQgaW4gbm9kZS5qc1xuICAodHlwZW9mIGRlZmluZSkgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUgICAvLyBwcmVzZW50IHdpdGggYW4gQU1EIGxvYWRlclxuKTtcblxuXG4iLCIvLyBBIEphdmFzY3JpcHQgaW1wbGVtZW50YWlvbiBvZiBSaWNoYXJkIEJyZW50J3MgWG9yZ2VucyB4b3I0MDk2IGFsZ29yaXRobS5cbi8vXG4vLyBUaGlzIGZhc3Qgbm9uLWNyeXB0b2dyYXBoaWMgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgaXMgZGVzaWduZWQgZm9yXG4vLyB1c2UgaW4gTW9udGUtQ2FybG8gYWxnb3JpdGhtcy4gSXQgY29tYmluZXMgYSBsb25nLXBlcmlvZCB4b3JzaGlmdFxuLy8gZ2VuZXJhdG9yIHdpdGggYSBXZXlsIGdlbmVyYXRvciwgYW5kIGl0IHBhc3NlcyBhbGwgY29tbW9uIGJhdHRlcmllc1xuLy8gb2Ygc3Rhc3RpY2lhbCB0ZXN0cyBmb3IgcmFuZG9tbmVzcyB3aGlsZSBjb25zdW1pbmcgb25seSBhIGZldyBuYW5vc2Vjb25kc1xuLy8gZm9yIGVhY2ggcHJuZyBnZW5lcmF0ZWQuICBGb3IgYmFja2dyb3VuZCBvbiB0aGUgZ2VuZXJhdG9yLCBzZWUgQnJlbnQnc1xuLy8gcGFwZXI6IFwiU29tZSBsb25nLXBlcmlvZCByYW5kb20gbnVtYmVyIGdlbmVyYXRvcnMgdXNpbmcgc2hpZnRzIGFuZCB4b3JzLlwiXG4vLyBodHRwOi8vYXJ4aXYub3JnL3BkZi8xMDA0LjMxMTV2MS5wZGZcbi8vXG4vLyBVc2FnZTpcbi8vXG4vLyB2YXIgeG9yNDA5NiA9IHJlcXVpcmUoJ3hvcjQwOTYnKTtcbi8vIHJhbmRvbSA9IHhvcjQwOTYoMSk7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VlZCB3aXRoIGludDMyIG9yIHN0cmluZy5cbi8vIGFzc2VydC5lcXVhbChyYW5kb20oKSwgMC4xNTIwNDM2NDUwNTM4NTQ3KTsgLy8gKDAsIDEpIHJhbmdlLCA1MyBiaXRzLlxuLy8gYXNzZXJ0LmVxdWFsKHJhbmRvbS5pbnQzMigpLCAxODA2NTM0ODk3KTsgICAvLyBzaWduZWQgaW50MzIsIDMyIGJpdHMuXG4vL1xuLy8gRm9yIG5vbnplcm8gbnVtZXJpYyBrZXlzLCB0aGlzIGltcGVsZW1lbnRhdGlvbiBwcm92aWRlcyBhIHNlcXVlbmNlXG4vLyBpZGVudGljYWwgdG8gdGhhdCBieSBCcmVudCdzIHhvcmdlbnMgMyBpbXBsZW1lbnRhaW9uIGluIEMuICBUaGlzXG4vLyBpbXBsZW1lbnRhdGlvbiBhbHNvIHByb3ZpZGVzIGZvciBpbml0YWxpemluZyB0aGUgZ2VuZXJhdG9yIHdpdGhcbi8vIHN0cmluZyBzZWVkcywgb3IgZm9yIHNhdmluZyBhbmQgcmVzdG9yaW5nIHRoZSBzdGF0ZSBvZiB0aGUgZ2VuZXJhdG9yLlxuLy9cbi8vIE9uIENocm9tZSwgdGhpcyBwcm5nIGJlbmNobWFya3MgYWJvdXQgMi4xIHRpbWVzIHNsb3dlciB0aGFuXG4vLyBKYXZhc2NyaXB0J3MgYnVpbHQtaW4gTWF0aC5yYW5kb20oKS5cblxuKGZ1bmN0aW9uKGdsb2JhbCwgbW9kdWxlLCBkZWZpbmUpIHtcblxuZnVuY3Rpb24gWG9yR2VuKHNlZWQpIHtcbiAgdmFyIG1lID0gdGhpcztcblxuICAvLyBTZXQgdXAgZ2VuZXJhdG9yIGZ1bmN0aW9uLlxuICBtZS5uZXh0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHcgPSBtZS53LFxuICAgICAgICBYID0gbWUuWCwgaSA9IG1lLmksIHQsIHY7XG4gICAgLy8gVXBkYXRlIFdleWwgZ2VuZXJhdG9yLlxuICAgIG1lLncgPSB3ID0gKHcgKyAweDYxYzg4NjQ3KSB8IDA7XG4gICAgLy8gVXBkYXRlIHhvciBnZW5lcmF0b3IuXG4gICAgdiA9IFhbKGkgKyAzNCkgJiAxMjddO1xuICAgIHQgPSBYW2kgPSAoKGkgKyAxKSAmIDEyNyldO1xuICAgIHYgXj0gdiA8PCAxMztcbiAgICB0IF49IHQgPDwgMTc7XG4gICAgdiBePSB2ID4+PiAxNTtcbiAgICB0IF49IHQgPj4+IDEyO1xuICAgIC8vIFVwZGF0ZSBYb3IgZ2VuZXJhdG9yIGFycmF5IHN0YXRlLlxuICAgIHYgPSBYW2ldID0gdiBeIHQ7XG4gICAgbWUuaSA9IGk7XG4gICAgLy8gUmVzdWx0IGlzIHRoZSBjb21iaW5hdGlvbi5cbiAgICByZXR1cm4gKHYgKyAodyBeICh3ID4+PiAxNikpKSB8IDA7XG4gIH07XG5cbiAgZnVuY3Rpb24gaW5pdChtZSwgc2VlZCkge1xuICAgIHZhciB0LCB2LCBpLCBqLCB3LCBYID0gW10sIGxpbWl0ID0gMTI4O1xuICAgIGlmIChzZWVkID09PSAoc2VlZCB8IDApKSB7XG4gICAgICAvLyBOdW1lcmljIHNlZWRzIGluaXRpYWxpemUgdiwgd2hpY2ggaXMgdXNlZCB0byBnZW5lcmF0ZXMgWC5cbiAgICAgIHYgPSBzZWVkO1xuICAgICAgc2VlZCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFN0cmluZyBzZWVkcyBhcmUgbWl4ZWQgaW50byB2IGFuZCBYIG9uZSBjaGFyYWN0ZXIgYXQgYSB0aW1lLlxuICAgICAgc2VlZCA9IHNlZWQgKyAnXFwwJztcbiAgICAgIHYgPSAwO1xuICAgICAgbGltaXQgPSBNYXRoLm1heChsaW1pdCwgc2VlZC5sZW5ndGgpO1xuICAgIH1cbiAgICAvLyBJbml0aWFsaXplIGNpcmN1bGFyIGFycmF5IGFuZCB3ZXlsIHZhbHVlLlxuICAgIGZvciAoaSA9IDAsIGogPSAtMzI7IGogPCBsaW1pdDsgKytqKSB7XG4gICAgICAvLyBQdXQgdGhlIHVuaWNvZGUgY2hhcmFjdGVycyBpbnRvIHRoZSBhcnJheSwgYW5kIHNodWZmbGUgdGhlbS5cbiAgICAgIGlmIChzZWVkKSB2IF49IHNlZWQuY2hhckNvZGVBdCgoaiArIDMyKSAlIHNlZWQubGVuZ3RoKTtcbiAgICAgIC8vIEFmdGVyIDMyIHNodWZmbGVzLCB0YWtlIHYgYXMgdGhlIHN0YXJ0aW5nIHcgdmFsdWUuXG4gICAgICBpZiAoaiA9PT0gMCkgdyA9IHY7XG4gICAgICB2IF49IHYgPDwgMTA7XG4gICAgICB2IF49IHYgPj4+IDE1O1xuICAgICAgdiBePSB2IDw8IDQ7XG4gICAgICB2IF49IHYgPj4+IDEzO1xuICAgICAgaWYgKGogPj0gMCkge1xuICAgICAgICB3ID0gKHcgKyAweDYxYzg4NjQ3KSB8IDA7ICAgICAvLyBXZXlsLlxuICAgICAgICB0ID0gKFhbaiAmIDEyN10gXj0gKHYgKyB3KSk7ICAvLyBDb21iaW5lIHhvciBhbmQgd2V5bCB0byBpbml0IGFycmF5LlxuICAgICAgICBpID0gKDAgPT0gdCkgPyBpICsgMSA6IDA7ICAgICAvLyBDb3VudCB6ZXJvZXMuXG4gICAgICB9XG4gICAgfVxuICAgIC8vIFdlIGhhdmUgZGV0ZWN0ZWQgYWxsIHplcm9lczsgbWFrZSB0aGUga2V5IG5vbnplcm8uXG4gICAgaWYgKGkgPj0gMTI4KSB7XG4gICAgICBYWyhzZWVkICYmIHNlZWQubGVuZ3RoIHx8IDApICYgMTI3XSA9IC0xO1xuICAgIH1cbiAgICAvLyBSdW4gdGhlIGdlbmVyYXRvciA1MTIgdGltZXMgdG8gZnVydGhlciBtaXggdGhlIHN0YXRlIGJlZm9yZSB1c2luZyBpdC5cbiAgICAvLyBGYWN0b3JpbmcgdGhpcyBhcyBhIGZ1bmN0aW9uIHNsb3dzIHRoZSBtYWluIGdlbmVyYXRvciwgc28gaXQgaXMganVzdFxuICAgIC8vIHVucm9sbGVkIGhlcmUuICBUaGUgd2V5bCBnZW5lcmF0b3IgaXMgbm90IGFkdmFuY2VkIHdoaWxlIHdhcm1pbmcgdXAuXG4gICAgaSA9IDEyNztcbiAgICBmb3IgKGogPSA0ICogMTI4OyBqID4gMDsgLS1qKSB7XG4gICAgICB2ID0gWFsoaSArIDM0KSAmIDEyN107XG4gICAgICB0ID0gWFtpID0gKChpICsgMSkgJiAxMjcpXTtcbiAgICAgIHYgXj0gdiA8PCAxMztcbiAgICAgIHQgXj0gdCA8PCAxNztcbiAgICAgIHYgXj0gdiA+Pj4gMTU7XG4gICAgICB0IF49IHQgPj4+IDEyO1xuICAgICAgWFtpXSA9IHYgXiB0O1xuICAgIH1cbiAgICAvLyBTdG9yaW5nIHN0YXRlIGFzIG9iamVjdCBtZW1iZXJzIGlzIGZhc3RlciB0aGFuIHVzaW5nIGNsb3N1cmUgdmFyaWFibGVzLlxuICAgIG1lLncgPSB3O1xuICAgIG1lLlggPSBYO1xuICAgIG1lLmkgPSBpO1xuICB9XG5cbiAgaW5pdChtZSwgc2VlZCk7XG59XG5cbmZ1bmN0aW9uIGNvcHkoZiwgdCkge1xuICB0LmkgPSBmLmk7XG4gIHQudyA9IGYudztcbiAgdC5YID0gZi5YLnNsaWNlKCk7XG4gIHJldHVybiB0O1xufTtcblxuZnVuY3Rpb24gaW1wbChzZWVkLCBvcHRzKSB7XG4gIGlmIChzZWVkID09IG51bGwpIHNlZWQgPSArKG5ldyBEYXRlKTtcbiAgdmFyIHhnID0gbmV3IFhvckdlbihzZWVkKSxcbiAgICAgIHN0YXRlID0gb3B0cyAmJiBvcHRzLnN0YXRlLFxuICAgICAgcHJuZyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gKHhnLm5leHQoKSA+Pj4gMCkgLyAweDEwMDAwMDAwMDsgfTtcbiAgcHJuZy5kb3VibGUgPSBmdW5jdGlvbigpIHtcbiAgICBkbyB7XG4gICAgICB2YXIgdG9wID0geGcubmV4dCgpID4+PiAxMSxcbiAgICAgICAgICBib3QgPSAoeGcubmV4dCgpID4+PiAwKSAvIDB4MTAwMDAwMDAwLFxuICAgICAgICAgIHJlc3VsdCA9ICh0b3AgKyBib3QpIC8gKDEgPDwgMjEpO1xuICAgIH0gd2hpbGUgKHJlc3VsdCA9PT0gMCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgcHJuZy5pbnQzMiA9IHhnLm5leHQ7XG4gIHBybmcucXVpY2sgPSBwcm5nO1xuICBpZiAoc3RhdGUpIHtcbiAgICBpZiAoc3RhdGUuWCkgY29weShzdGF0ZSwgeGcpO1xuICAgIHBybmcuc3RhdGUgPSBmdW5jdGlvbigpIHsgcmV0dXJuIGNvcHkoeGcsIHt9KTsgfVxuICB9XG4gIHJldHVybiBwcm5nO1xufVxuXG5pZiAobW9kdWxlICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gaW1wbDtcbn0gZWxzZSBpZiAoZGVmaW5lICYmIGRlZmluZS5hbWQpIHtcbiAgZGVmaW5lKGZ1bmN0aW9uKCkgeyByZXR1cm4gaW1wbDsgfSk7XG59IGVsc2Uge1xuICB0aGlzLnhvcjQwOTYgPSBpbXBsO1xufVxuXG59KShcbiAgdGhpcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2luZG93IG9iamVjdCBvciBnbG9iYWxcbiAgKHR5cGVvZiBtb2R1bGUpID09ICdvYmplY3QnICYmIG1vZHVsZSwgICAgLy8gcHJlc2VudCBpbiBub2RlLmpzXG4gICh0eXBlb2YgZGVmaW5lKSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZSAgIC8vIHByZXNlbnQgd2l0aCBhbiBBTUQgbG9hZGVyXG4pO1xuIiwiLy8gQSBKYXZhc2NyaXB0IGltcGxlbWVudGFpb24gb2YgdGhlIFwieG9yc2hpZnQ3XCIgYWxnb3JpdGhtIGJ5XG4vLyBGcmFuw6dvaXMgUGFubmV0b24gYW5kIFBpZXJyZSBMJ2VjdXllcjpcbi8vIFwiT24gdGhlIFhvcmdzaGlmdCBSYW5kb20gTnVtYmVyIEdlbmVyYXRvcnNcIlxuLy8gaHR0cDovL3NhbHVjLmVuZ3IudWNvbm4uZWR1L3JlZnMvY3J5cHRvL3JuZy9wYW5uZXRvbjA1b250aGV4b3JzaGlmdC5wZGZcblxuKGZ1bmN0aW9uKGdsb2JhbCwgbW9kdWxlLCBkZWZpbmUpIHtcblxuZnVuY3Rpb24gWG9yR2VuKHNlZWQpIHtcbiAgdmFyIG1lID0gdGhpcztcblxuICAvLyBTZXQgdXAgZ2VuZXJhdG9yIGZ1bmN0aW9uLlxuICBtZS5uZXh0ID0gZnVuY3Rpb24oKSB7XG4gICAgLy8gVXBkYXRlIHhvciBnZW5lcmF0b3IuXG4gICAgdmFyIFggPSBtZS54LCBpID0gbWUuaSwgdCwgdiwgdztcbiAgICB0ID0gWFtpXTsgdCBePSAodCA+Pj4gNyk7IHYgPSB0IF4gKHQgPDwgMjQpO1xuICAgIHQgPSBYWyhpICsgMSkgJiA3XTsgdiBePSB0IF4gKHQgPj4+IDEwKTtcbiAgICB0ID0gWFsoaSArIDMpICYgN107IHYgXj0gdCBeICh0ID4+PiAzKTtcbiAgICB0ID0gWFsoaSArIDQpICYgN107IHYgXj0gdCBeICh0IDw8IDcpO1xuICAgIHQgPSBYWyhpICsgNykgJiA3XTsgdCA9IHQgXiAodCA8PCAxMyk7IHYgXj0gdCBeICh0IDw8IDkpO1xuICAgIFhbaV0gPSB2O1xuICAgIG1lLmkgPSAoaSArIDEpICYgNztcbiAgICByZXR1cm4gdjtcbiAgfTtcblxuICBmdW5jdGlvbiBpbml0KG1lLCBzZWVkKSB7XG4gICAgdmFyIGosIHcsIFggPSBbXTtcblxuICAgIGlmIChzZWVkID09PSAoc2VlZCB8IDApKSB7XG4gICAgICAvLyBTZWVkIHN0YXRlIGFycmF5IHVzaW5nIGEgMzItYml0IGludGVnZXIuXG4gICAgICB3ID0gWFswXSA9IHNlZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNlZWQgc3RhdGUgdXNpbmcgYSBzdHJpbmcuXG4gICAgICBzZWVkID0gJycgKyBzZWVkO1xuICAgICAgZm9yIChqID0gMDsgaiA8IHNlZWQubGVuZ3RoOyArK2opIHtcbiAgICAgICAgWFtqICYgN10gPSAoWFtqICYgN10gPDwgMTUpIF5cbiAgICAgICAgICAgIChzZWVkLmNoYXJDb2RlQXQoaikgKyBYWyhqICsgMSkgJiA3XSA8PCAxMyk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEVuZm9yY2UgYW4gYXJyYXkgbGVuZ3RoIG9mIDgsIG5vdCBhbGwgemVyb2VzLlxuICAgIHdoaWxlIChYLmxlbmd0aCA8IDgpIFgucHVzaCgwKTtcbiAgICBmb3IgKGogPSAwOyBqIDwgOCAmJiBYW2pdID09PSAwOyArK2opO1xuICAgIGlmIChqID09IDgpIHcgPSBYWzddID0gLTE7IGVsc2UgdyA9IFhbal07XG5cbiAgICBtZS54ID0gWDtcbiAgICBtZS5pID0gMDtcblxuICAgIC8vIERpc2NhcmQgYW4gaW5pdGlhbCAyNTYgdmFsdWVzLlxuICAgIGZvciAoaiA9IDI1NjsgaiA+IDA7IC0taikge1xuICAgICAgbWUubmV4dCgpO1xuICAgIH1cbiAgfVxuXG4gIGluaXQobWUsIHNlZWQpO1xufVxuXG5mdW5jdGlvbiBjb3B5KGYsIHQpIHtcbiAgdC54ID0gZi54LnNsaWNlKCk7XG4gIHQuaSA9IGYuaTtcbiAgcmV0dXJuIHQ7XG59XG5cbmZ1bmN0aW9uIGltcGwoc2VlZCwgb3B0cykge1xuICBpZiAoc2VlZCA9PSBudWxsKSBzZWVkID0gKyhuZXcgRGF0ZSk7XG4gIHZhciB4ZyA9IG5ldyBYb3JHZW4oc2VlZCksXG4gICAgICBzdGF0ZSA9IG9wdHMgJiYgb3B0cy5zdGF0ZSxcbiAgICAgIHBybmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuICh4Zy5uZXh0KCkgPj4+IDApIC8gMHgxMDAwMDAwMDA7IH07XG4gIHBybmcuZG91YmxlID0gZnVuY3Rpb24oKSB7XG4gICAgZG8ge1xuICAgICAgdmFyIHRvcCA9IHhnLm5leHQoKSA+Pj4gMTEsXG4gICAgICAgICAgYm90ID0gKHhnLm5leHQoKSA+Pj4gMCkgLyAweDEwMDAwMDAwMCxcbiAgICAgICAgICByZXN1bHQgPSAodG9wICsgYm90KSAvICgxIDw8IDIxKTtcbiAgICB9IHdoaWxlIChyZXN1bHQgPT09IDApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIHBybmcuaW50MzIgPSB4Zy5uZXh0O1xuICBwcm5nLnF1aWNrID0gcHJuZztcbiAgaWYgKHN0YXRlKSB7XG4gICAgaWYgKHN0YXRlLngpIGNvcHkoc3RhdGUsIHhnKTtcbiAgICBwcm5nLnN0YXRlID0gZnVuY3Rpb24oKSB7IHJldHVybiBjb3B5KHhnLCB7fSk7IH1cbiAgfVxuICByZXR1cm4gcHJuZztcbn1cblxuaWYgKG1vZHVsZSAmJiBtb2R1bGUuZXhwb3J0cykge1xuICBtb2R1bGUuZXhwb3J0cyA9IGltcGw7XG59IGVsc2UgaWYgKGRlZmluZSAmJiBkZWZpbmUuYW1kKSB7XG4gIGRlZmluZShmdW5jdGlvbigpIHsgcmV0dXJuIGltcGw7IH0pO1xufSBlbHNlIHtcbiAgdGhpcy54b3JzaGlmdDcgPSBpbXBsO1xufVxuXG59KShcbiAgdGhpcyxcbiAgKHR5cGVvZiBtb2R1bGUpID09ICdvYmplY3QnICYmIG1vZHVsZSwgICAgLy8gcHJlc2VudCBpbiBub2RlLmpzXG4gICh0eXBlb2YgZGVmaW5lKSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZSAgIC8vIHByZXNlbnQgd2l0aCBhbiBBTUQgbG9hZGVyXG4pO1xuXG4iLCIvLyBBIEphdmFzY3JpcHQgaW1wbGVtZW50YWlvbiBvZiB0aGUgXCJ4b3J3b3dcIiBwcm5nIGFsZ29yaXRobSBieVxuLy8gR2VvcmdlIE1hcnNhZ2xpYS4gIFNlZSBodHRwOi8vd3d3LmpzdGF0c29mdC5vcmcvdjA4L2kxNC9wYXBlclxuXG4oZnVuY3Rpb24oZ2xvYmFsLCBtb2R1bGUsIGRlZmluZSkge1xuXG5mdW5jdGlvbiBYb3JHZW4oc2VlZCkge1xuICB2YXIgbWUgPSB0aGlzLCBzdHJzZWVkID0gJyc7XG5cbiAgLy8gU2V0IHVwIGdlbmVyYXRvciBmdW5jdGlvbi5cbiAgbWUubmV4dCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0ID0gKG1lLnggXiAobWUueCA+Pj4gMikpO1xuICAgIG1lLnggPSBtZS55OyBtZS55ID0gbWUuejsgbWUueiA9IG1lLnc7IG1lLncgPSBtZS52O1xuICAgIHJldHVybiAobWUuZCA9IChtZS5kICsgMzYyNDM3IHwgMCkpICtcbiAgICAgICAobWUudiA9IChtZS52IF4gKG1lLnYgPDwgNCkpIF4gKHQgXiAodCA8PCAxKSkpIHwgMDtcbiAgfTtcblxuICBtZS54ID0gMDtcbiAgbWUueSA9IDA7XG4gIG1lLnogPSAwO1xuICBtZS53ID0gMDtcbiAgbWUudiA9IDA7XG5cbiAgaWYgKHNlZWQgPT09IChzZWVkIHwgMCkpIHtcbiAgICAvLyBJbnRlZ2VyIHNlZWQuXG4gICAgbWUueCA9IHNlZWQ7XG4gIH0gZWxzZSB7XG4gICAgLy8gU3RyaW5nIHNlZWQuXG4gICAgc3Ryc2VlZCArPSBzZWVkO1xuICB9XG5cbiAgLy8gTWl4IGluIHN0cmluZyBzZWVkLCB0aGVuIGRpc2NhcmQgYW4gaW5pdGlhbCBiYXRjaCBvZiA2NCB2YWx1ZXMuXG4gIGZvciAodmFyIGsgPSAwOyBrIDwgc3Ryc2VlZC5sZW5ndGggKyA2NDsgaysrKSB7XG4gICAgbWUueCBePSBzdHJzZWVkLmNoYXJDb2RlQXQoaykgfCAwO1xuICAgIGlmIChrID09IHN0cnNlZWQubGVuZ3RoKSB7XG4gICAgICBtZS5kID0gbWUueCA8PCAxMCBeIG1lLnggPj4+IDQ7XG4gICAgfVxuICAgIG1lLm5leHQoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb3B5KGYsIHQpIHtcbiAgdC54ID0gZi54O1xuICB0LnkgPSBmLnk7XG4gIHQueiA9IGYuejtcbiAgdC53ID0gZi53O1xuICB0LnYgPSBmLnY7XG4gIHQuZCA9IGYuZDtcbiAgcmV0dXJuIHQ7XG59XG5cbmZ1bmN0aW9uIGltcGwoc2VlZCwgb3B0cykge1xuICB2YXIgeGcgPSBuZXcgWG9yR2VuKHNlZWQpLFxuICAgICAgc3RhdGUgPSBvcHRzICYmIG9wdHMuc3RhdGUsXG4gICAgICBwcm5nID0gZnVuY3Rpb24oKSB7IHJldHVybiAoeGcubmV4dCgpID4+PiAwKSAvIDB4MTAwMDAwMDAwOyB9O1xuICBwcm5nLmRvdWJsZSA9IGZ1bmN0aW9uKCkge1xuICAgIGRvIHtcbiAgICAgIHZhciB0b3AgPSB4Zy5uZXh0KCkgPj4+IDExLFxuICAgICAgICAgIGJvdCA9ICh4Zy5uZXh0KCkgPj4+IDApIC8gMHgxMDAwMDAwMDAsXG4gICAgICAgICAgcmVzdWx0ID0gKHRvcCArIGJvdCkgLyAoMSA8PCAyMSk7XG4gICAgfSB3aGlsZSAocmVzdWx0ID09PSAwKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICBwcm5nLmludDMyID0geGcubmV4dDtcbiAgcHJuZy5xdWljayA9IHBybmc7XG4gIGlmIChzdGF0ZSkge1xuICAgIGlmICh0eXBlb2Yoc3RhdGUpID09ICdvYmplY3QnKSBjb3B5KHN0YXRlLCB4Zyk7XG4gICAgcHJuZy5zdGF0ZSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gY29weSh4Zywge30pOyB9XG4gIH1cbiAgcmV0dXJuIHBybmc7XG59XG5cbmlmIChtb2R1bGUgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBpbXBsO1xufSBlbHNlIGlmIChkZWZpbmUgJiYgZGVmaW5lLmFtZCkge1xuICBkZWZpbmUoZnVuY3Rpb24oKSB7IHJldHVybiBpbXBsOyB9KTtcbn0gZWxzZSB7XG4gIHRoaXMueG9yd293ID0gaW1wbDtcbn1cblxufSkoXG4gIHRoaXMsXG4gICh0eXBlb2YgbW9kdWxlKSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUsICAgIC8vIHByZXNlbnQgaW4gbm9kZS5qc1xuICAodHlwZW9mIGRlZmluZSkgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUgICAvLyBwcmVzZW50IHdpdGggYW4gQU1EIGxvYWRlclxuKTtcblxuXG4iLCIvKlxuQ29weXJpZ2h0IDIwMTQgRGF2aWQgQmF1LlxuXG5QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmdcbmEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG53aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG5kaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG9cbnBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0b1xudGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG5UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZVxuaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsXG5FWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbk1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC5cbklOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZXG5DTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULFxuVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEVcblNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4qL1xuXG4oZnVuY3Rpb24gKHBvb2wsIG1hdGgpIHtcbi8vXG4vLyBUaGUgZm9sbG93aW5nIGNvbnN0YW50cyBhcmUgcmVsYXRlZCB0byBJRUVFIDc1NCBsaW1pdHMuXG4vL1xudmFyIGdsb2JhbCA9IHRoaXMsXG4gICAgd2lkdGggPSAyNTYsICAgICAgICAvLyBlYWNoIFJDNCBvdXRwdXQgaXMgMCA8PSB4IDwgMjU2XG4gICAgY2h1bmtzID0gNiwgICAgICAgICAvLyBhdCBsZWFzdCBzaXggUkM0IG91dHB1dHMgZm9yIGVhY2ggZG91YmxlXG4gICAgZGlnaXRzID0gNTIsICAgICAgICAvLyB0aGVyZSBhcmUgNTIgc2lnbmlmaWNhbnQgZGlnaXRzIGluIGEgZG91YmxlXG4gICAgcm5nbmFtZSA9ICdyYW5kb20nLCAvLyBybmduYW1lOiBuYW1lIGZvciBNYXRoLnJhbmRvbSBhbmQgTWF0aC5zZWVkcmFuZG9tXG4gICAgc3RhcnRkZW5vbSA9IG1hdGgucG93KHdpZHRoLCBjaHVua3MpLFxuICAgIHNpZ25pZmljYW5jZSA9IG1hdGgucG93KDIsIGRpZ2l0cyksXG4gICAgb3ZlcmZsb3cgPSBzaWduaWZpY2FuY2UgKiAyLFxuICAgIG1hc2sgPSB3aWR0aCAtIDEsXG4gICAgbm9kZWNyeXB0bzsgICAgICAgICAvLyBub2RlLmpzIGNyeXB0byBtb2R1bGUsIGluaXRpYWxpemVkIGF0IHRoZSBib3R0b20uXG5cbi8vXG4vLyBzZWVkcmFuZG9tKClcbi8vIFRoaXMgaXMgdGhlIHNlZWRyYW5kb20gZnVuY3Rpb24gZGVzY3JpYmVkIGFib3ZlLlxuLy9cbmZ1bmN0aW9uIHNlZWRyYW5kb20oc2VlZCwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgdmFyIGtleSA9IFtdO1xuICBvcHRpb25zID0gKG9wdGlvbnMgPT0gdHJ1ZSkgPyB7IGVudHJvcHk6IHRydWUgfSA6IChvcHRpb25zIHx8IHt9KTtcblxuICAvLyBGbGF0dGVuIHRoZSBzZWVkIHN0cmluZyBvciBidWlsZCBvbmUgZnJvbSBsb2NhbCBlbnRyb3B5IGlmIG5lZWRlZC5cbiAgdmFyIHNob3J0c2VlZCA9IG1peGtleShmbGF0dGVuKFxuICAgIG9wdGlvbnMuZW50cm9weSA/IFtzZWVkLCB0b3N0cmluZyhwb29sKV0gOlxuICAgIChzZWVkID09IG51bGwpID8gYXV0b3NlZWQoKSA6IHNlZWQsIDMpLCBrZXkpO1xuXG4gIC8vIFVzZSB0aGUgc2VlZCB0byBpbml0aWFsaXplIGFuIEFSQzQgZ2VuZXJhdG9yLlxuICB2YXIgYXJjNCA9IG5ldyBBUkM0KGtleSk7XG5cbiAgLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcmFuZG9tIGRvdWJsZSBpbiBbMCwgMSkgdGhhdCBjb250YWluc1xuICAvLyByYW5kb21uZXNzIGluIGV2ZXJ5IGJpdCBvZiB0aGUgbWFudGlzc2Egb2YgdGhlIElFRUUgNzU0IHZhbHVlLlxuICB2YXIgcHJuZyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBuID0gYXJjNC5nKGNodW5rcyksICAgICAgICAgICAgIC8vIFN0YXJ0IHdpdGggYSBudW1lcmF0b3IgbiA8IDIgXiA0OFxuICAgICAgICBkID0gc3RhcnRkZW5vbSwgICAgICAgICAgICAgICAgIC8vICAgYW5kIGRlbm9taW5hdG9yIGQgPSAyIF4gNDguXG4gICAgICAgIHggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBhbmQgbm8gJ2V4dHJhIGxhc3QgYnl0ZScuXG4gICAgd2hpbGUgKG4gPCBzaWduaWZpY2FuY2UpIHsgICAgICAgICAgLy8gRmlsbCB1cCBhbGwgc2lnbmlmaWNhbnQgZGlnaXRzIGJ5XG4gICAgICBuID0gKG4gKyB4KSAqIHdpZHRoOyAgICAgICAgICAgICAgLy8gICBzaGlmdGluZyBudW1lcmF0b3IgYW5kXG4gICAgICBkICo9IHdpZHRoOyAgICAgICAgICAgICAgICAgICAgICAgLy8gICBkZW5vbWluYXRvciBhbmQgZ2VuZXJhdGluZyBhXG4gICAgICB4ID0gYXJjNC5nKDEpOyAgICAgICAgICAgICAgICAgICAgLy8gICBuZXcgbGVhc3Qtc2lnbmlmaWNhbnQtYnl0ZS5cbiAgICB9XG4gICAgd2hpbGUgKG4gPj0gb3ZlcmZsb3cpIHsgICAgICAgICAgICAgLy8gVG8gYXZvaWQgcm91bmRpbmcgdXAsIGJlZm9yZSBhZGRpbmdcbiAgICAgIG4gLz0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGxhc3QgYnl0ZSwgc2hpZnQgZXZlcnl0aGluZ1xuICAgICAgZCAvPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgcmlnaHQgdXNpbmcgaW50ZWdlciBtYXRoIHVudGlsXG4gICAgICB4ID4+Pj0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICB3ZSBoYXZlIGV4YWN0bHkgdGhlIGRlc2lyZWQgYml0cy5cbiAgICB9XG4gICAgcmV0dXJuIChuICsgeCkgLyBkOyAgICAgICAgICAgICAgICAgLy8gRm9ybSB0aGUgbnVtYmVyIHdpdGhpbiBbMCwgMSkuXG4gIH07XG5cbiAgcHJuZy5pbnQzMiA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJjNC5nKDQpIHwgMDsgfVxuICBwcm5nLnF1aWNrID0gZnVuY3Rpb24oKSB7IHJldHVybiBhcmM0LmcoNCkgLyAweDEwMDAwMDAwMDsgfVxuICBwcm5nLmRvdWJsZSA9IHBybmc7XG5cbiAgLy8gTWl4IHRoZSByYW5kb21uZXNzIGludG8gYWNjdW11bGF0ZWQgZW50cm9weS5cbiAgbWl4a2V5KHRvc3RyaW5nKGFyYzQuUyksIHBvb2wpO1xuXG4gIC8vIENhbGxpbmcgY29udmVudGlvbjogd2hhdCB0byByZXR1cm4gYXMgYSBmdW5jdGlvbiBvZiBwcm5nLCBzZWVkLCBpc19tYXRoLlxuICByZXR1cm4gKG9wdGlvbnMucGFzcyB8fCBjYWxsYmFjayB8fFxuICAgICAgZnVuY3Rpb24ocHJuZywgc2VlZCwgaXNfbWF0aF9jYWxsLCBzdGF0ZSkge1xuICAgICAgICBpZiAoc3RhdGUpIHtcbiAgICAgICAgICAvLyBMb2FkIHRoZSBhcmM0IHN0YXRlIGZyb20gdGhlIGdpdmVuIHN0YXRlIGlmIGl0IGhhcyBhbiBTIGFycmF5LlxuICAgICAgICAgIGlmIChzdGF0ZS5TKSB7IGNvcHkoc3RhdGUsIGFyYzQpOyB9XG4gICAgICAgICAgLy8gT25seSBwcm92aWRlIHRoZSAuc3RhdGUgbWV0aG9kIGlmIHJlcXVlc3RlZCB2aWEgb3B0aW9ucy5zdGF0ZS5cbiAgICAgICAgICBwcm5nLnN0YXRlID0gZnVuY3Rpb24oKSB7IHJldHVybiBjb3B5KGFyYzQsIHt9KTsgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgY2FsbGVkIGFzIGEgbWV0aG9kIG9mIE1hdGggKE1hdGguc2VlZHJhbmRvbSgpKSwgbXV0YXRlXG4gICAgICAgIC8vIE1hdGgucmFuZG9tIGJlY2F1c2UgdGhhdCBpcyBob3cgc2VlZHJhbmRvbS5qcyBoYXMgd29ya2VkIHNpbmNlIHYxLjAuXG4gICAgICAgIGlmIChpc19tYXRoX2NhbGwpIHsgbWF0aFtybmduYW1lXSA9IHBybmc7IHJldHVybiBzZWVkOyB9XG5cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCBpdCBpcyBhIG5ld2VyIGNhbGxpbmcgY29udmVudGlvbiwgc28gcmV0dXJuIHRoZVxuICAgICAgICAvLyBwcm5nIGRpcmVjdGx5LlxuICAgICAgICBlbHNlIHJldHVybiBwcm5nO1xuICAgICAgfSkoXG4gIHBybmcsXG4gIHNob3J0c2VlZCxcbiAgJ2dsb2JhbCcgaW4gb3B0aW9ucyA/IG9wdGlvbnMuZ2xvYmFsIDogKHRoaXMgPT0gbWF0aCksXG4gIG9wdGlvbnMuc3RhdGUpO1xufVxubWF0aFsnc2VlZCcgKyBybmduYW1lXSA9IHNlZWRyYW5kb207XG5cbi8vXG4vLyBBUkM0XG4vL1xuLy8gQW4gQVJDNCBpbXBsZW1lbnRhdGlvbi4gIFRoZSBjb25zdHJ1Y3RvciB0YWtlcyBhIGtleSBpbiB0aGUgZm9ybSBvZlxuLy8gYW4gYXJyYXkgb2YgYXQgbW9zdCAod2lkdGgpIGludGVnZXJzIHRoYXQgc2hvdWxkIGJlIDAgPD0geCA8ICh3aWR0aCkuXG4vL1xuLy8gVGhlIGcoY291bnQpIG1ldGhvZCByZXR1cm5zIGEgcHNldWRvcmFuZG9tIGludGVnZXIgdGhhdCBjb25jYXRlbmF0ZXNcbi8vIHRoZSBuZXh0IChjb3VudCkgb3V0cHV0cyBmcm9tIEFSQzQuICBJdHMgcmV0dXJuIHZhbHVlIGlzIGEgbnVtYmVyIHhcbi8vIHRoYXQgaXMgaW4gdGhlIHJhbmdlIDAgPD0geCA8ICh3aWR0aCBeIGNvdW50KS5cbi8vXG5mdW5jdGlvbiBBUkM0KGtleSkge1xuICB2YXIgdCwga2V5bGVuID0ga2V5Lmxlbmd0aCxcbiAgICAgIG1lID0gdGhpcywgaSA9IDAsIGogPSBtZS5pID0gbWUuaiA9IDAsIHMgPSBtZS5TID0gW107XG5cbiAgLy8gVGhlIGVtcHR5IGtleSBbXSBpcyB0cmVhdGVkIGFzIFswXS5cbiAgaWYgKCFrZXlsZW4pIHsga2V5ID0gW2tleWxlbisrXTsgfVxuXG4gIC8vIFNldCB1cCBTIHVzaW5nIHRoZSBzdGFuZGFyZCBrZXkgc2NoZWR1bGluZyBhbGdvcml0aG0uXG4gIHdoaWxlIChpIDwgd2lkdGgpIHtcbiAgICBzW2ldID0gaSsrO1xuICB9XG4gIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7XG4gICAgc1tpXSA9IHNbaiA9IG1hc2sgJiAoaiArIGtleVtpICUga2V5bGVuXSArICh0ID0gc1tpXSkpXTtcbiAgICBzW2pdID0gdDtcbiAgfVxuXG4gIC8vIFRoZSBcImdcIiBtZXRob2QgcmV0dXJucyB0aGUgbmV4dCAoY291bnQpIG91dHB1dHMgYXMgb25lIG51bWJlci5cbiAgKG1lLmcgPSBmdW5jdGlvbihjb3VudCkge1xuICAgIC8vIFVzaW5nIGluc3RhbmNlIG1lbWJlcnMgaW5zdGVhZCBvZiBjbG9zdXJlIHN0YXRlIG5lYXJseSBkb3VibGVzIHNwZWVkLlxuICAgIHZhciB0LCByID0gMCxcbiAgICAgICAgaSA9IG1lLmksIGogPSBtZS5qLCBzID0gbWUuUztcbiAgICB3aGlsZSAoY291bnQtLSkge1xuICAgICAgdCA9IHNbaSA9IG1hc2sgJiAoaSArIDEpXTtcbiAgICAgIHIgPSByICogd2lkdGggKyBzW21hc2sgJiAoKHNbaV0gPSBzW2ogPSBtYXNrICYgKGogKyB0KV0pICsgKHNbal0gPSB0KSldO1xuICAgIH1cbiAgICBtZS5pID0gaTsgbWUuaiA9IGo7XG4gICAgcmV0dXJuIHI7XG4gICAgLy8gRm9yIHJvYnVzdCB1bnByZWRpY3RhYmlsaXR5LCB0aGUgZnVuY3Rpb24gY2FsbCBiZWxvdyBhdXRvbWF0aWNhbGx5XG4gICAgLy8gZGlzY2FyZHMgYW4gaW5pdGlhbCBiYXRjaCBvZiB2YWx1ZXMuICBUaGlzIGlzIGNhbGxlZCBSQzQtZHJvcFsyNTZdLlxuICAgIC8vIFNlZSBodHRwOi8vZ29vZ2xlLmNvbS9zZWFyY2g/cT1yc2ErZmx1aHJlcityZXNwb25zZSZidG5JXG4gIH0pKHdpZHRoKTtcbn1cblxuLy9cbi8vIGNvcHkoKVxuLy8gQ29waWVzIGludGVybmFsIHN0YXRlIG9mIEFSQzQgdG8gb3IgZnJvbSBhIHBsYWluIG9iamVjdC5cbi8vXG5mdW5jdGlvbiBjb3B5KGYsIHQpIHtcbiAgdC5pID0gZi5pO1xuICB0LmogPSBmLmo7XG4gIHQuUyA9IGYuUy5zbGljZSgpO1xuICByZXR1cm4gdDtcbn07XG5cbi8vXG4vLyBmbGF0dGVuKClcbi8vIENvbnZlcnRzIGFuIG9iamVjdCB0cmVlIHRvIG5lc3RlZCBhcnJheXMgb2Ygc3RyaW5ncy5cbi8vXG5mdW5jdGlvbiBmbGF0dGVuKG9iaiwgZGVwdGgpIHtcbiAgdmFyIHJlc3VsdCA9IFtdLCB0eXAgPSAodHlwZW9mIG9iaiksIHByb3A7XG4gIGlmIChkZXB0aCAmJiB0eXAgPT0gJ29iamVjdCcpIHtcbiAgICBmb3IgKHByb3AgaW4gb2JqKSB7XG4gICAgICB0cnkgeyByZXN1bHQucHVzaChmbGF0dGVuKG9ialtwcm9wXSwgZGVwdGggLSAxKSk7IH0gY2F0Y2ggKGUpIHt9XG4gICAgfVxuICB9XG4gIHJldHVybiAocmVzdWx0Lmxlbmd0aCA/IHJlc3VsdCA6IHR5cCA9PSAnc3RyaW5nJyA/IG9iaiA6IG9iaiArICdcXDAnKTtcbn1cblxuLy9cbi8vIG1peGtleSgpXG4vLyBNaXhlcyBhIHN0cmluZyBzZWVkIGludG8gYSBrZXkgdGhhdCBpcyBhbiBhcnJheSBvZiBpbnRlZ2VycywgYW5kXG4vLyByZXR1cm5zIGEgc2hvcnRlbmVkIHN0cmluZyBzZWVkIHRoYXQgaXMgZXF1aXZhbGVudCB0byB0aGUgcmVzdWx0IGtleS5cbi8vXG5mdW5jdGlvbiBtaXhrZXkoc2VlZCwga2V5KSB7XG4gIHZhciBzdHJpbmdzZWVkID0gc2VlZCArICcnLCBzbWVhciwgaiA9IDA7XG4gIHdoaWxlIChqIDwgc3RyaW5nc2VlZC5sZW5ndGgpIHtcbiAgICBrZXlbbWFzayAmIGpdID1cbiAgICAgIG1hc2sgJiAoKHNtZWFyIF49IGtleVttYXNrICYgal0gKiAxOSkgKyBzdHJpbmdzZWVkLmNoYXJDb2RlQXQoaisrKSk7XG4gIH1cbiAgcmV0dXJuIHRvc3RyaW5nKGtleSk7XG59XG5cbi8vXG4vLyBhdXRvc2VlZCgpXG4vLyBSZXR1cm5zIGFuIG9iamVjdCBmb3IgYXV0b3NlZWRpbmcsIHVzaW5nIHdpbmRvdy5jcnlwdG8gYW5kIE5vZGUgY3J5cHRvXG4vLyBtb2R1bGUgaWYgYXZhaWxhYmxlLlxuLy9cbmZ1bmN0aW9uIGF1dG9zZWVkKCkge1xuICB0cnkge1xuICAgIHZhciBvdXQ7XG4gICAgaWYgKG5vZGVjcnlwdG8gJiYgKG91dCA9IG5vZGVjcnlwdG8ucmFuZG9tQnl0ZXMpKSB7XG4gICAgICAvLyBUaGUgdXNlIG9mICdvdXQnIHRvIHJlbWVtYmVyIHJhbmRvbUJ5dGVzIG1ha2VzIHRpZ2h0IG1pbmlmaWVkIGNvZGUuXG4gICAgICBvdXQgPSBvdXQod2lkdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgPSBuZXcgVWludDhBcnJheSh3aWR0aCk7XG4gICAgICAoZ2xvYmFsLmNyeXB0byB8fCBnbG9iYWwubXNDcnlwdG8pLmdldFJhbmRvbVZhbHVlcyhvdXQpO1xuICAgIH1cbiAgICByZXR1cm4gdG9zdHJpbmcob3V0KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHZhciBicm93c2VyID0gZ2xvYmFsLm5hdmlnYXRvcixcbiAgICAgICAgcGx1Z2lucyA9IGJyb3dzZXIgJiYgYnJvd3Nlci5wbHVnaW5zO1xuICAgIHJldHVybiBbK25ldyBEYXRlLCBnbG9iYWwsIHBsdWdpbnMsIGdsb2JhbC5zY3JlZW4sIHRvc3RyaW5nKHBvb2wpXTtcbiAgfVxufVxuXG4vL1xuLy8gdG9zdHJpbmcoKVxuLy8gQ29udmVydHMgYW4gYXJyYXkgb2YgY2hhcmNvZGVzIHRvIGEgc3RyaW5nXG4vL1xuZnVuY3Rpb24gdG9zdHJpbmcoYSkge1xuICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseSgwLCBhKTtcbn1cblxuLy9cbi8vIFdoZW4gc2VlZHJhbmRvbS5qcyBpcyBsb2FkZWQsIHdlIGltbWVkaWF0ZWx5IG1peCBhIGZldyBiaXRzXG4vLyBmcm9tIHRoZSBidWlsdC1pbiBSTkcgaW50byB0aGUgZW50cm9weSBwb29sLiAgQmVjYXVzZSB3ZSBkb1xuLy8gbm90IHdhbnQgdG8gaW50ZXJmZXJlIHdpdGggZGV0ZXJtaW5pc3RpYyBQUk5HIHN0YXRlIGxhdGVyLFxuLy8gc2VlZHJhbmRvbSB3aWxsIG5vdCBjYWxsIG1hdGgucmFuZG9tIG9uIGl0cyBvd24gYWdhaW4gYWZ0ZXJcbi8vIGluaXRpYWxpemF0aW9uLlxuLy9cbm1peGtleShtYXRoLnJhbmRvbSgpLCBwb29sKTtcblxuLy9cbi8vIE5vZGVqcyBhbmQgQU1EIHN1cHBvcnQ6IGV4cG9ydCB0aGUgaW1wbGVtZW50YXRpb24gYXMgYSBtb2R1bGUgdXNpbmdcbi8vIGVpdGhlciBjb252ZW50aW9uLlxuLy9cbmlmICgodHlwZW9mIG1vZHVsZSkgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBzZWVkcmFuZG9tO1xuICAvLyBXaGVuIGluIG5vZGUuanMsIHRyeSB1c2luZyBjcnlwdG8gcGFja2FnZSBmb3IgYXV0b3NlZWRpbmcuXG4gIHRyeSB7XG4gICAgbm9kZWNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuICB9IGNhdGNoIChleCkge31cbn0gZWxzZSBpZiAoKHR5cGVvZiBkZWZpbmUpID09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICBkZWZpbmUoZnVuY3Rpb24oKSB7IHJldHVybiBzZWVkcmFuZG9tOyB9KTtcbn1cblxuLy8gRW5kIGFub255bW91cyBzY29wZSwgYW5kIHBhc3MgaW5pdGlhbCB2YWx1ZXMuXG59KShcbiAgW10sICAgICAvLyBwb29sOiBlbnRyb3B5IHBvb2wgc3RhcnRzIGVtcHR5XG4gIE1hdGggICAgLy8gbWF0aDogcGFja2FnZSBjb250YWluaW5nIHJhbmRvbSwgcG93LCBhbmQgc2VlZHJhbmRvbVxuKTtcbiIsIihmdW5jdGlvbiAoZ2xvYmFsLCB1bmRlZmluZWQpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIGlmIChnbG9iYWwuc2V0SW1tZWRpYXRlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgbmV4dEhhbmRsZSA9IDE7IC8vIFNwZWMgc2F5cyBncmVhdGVyIHRoYW4gemVyb1xuICAgIHZhciB0YXNrc0J5SGFuZGxlID0ge307XG4gICAgdmFyIGN1cnJlbnRseVJ1bm5pbmdBVGFzayA9IGZhbHNlO1xuICAgIHZhciBkb2MgPSBnbG9iYWwuZG9jdW1lbnQ7XG4gICAgdmFyIHJlZ2lzdGVySW1tZWRpYXRlO1xuXG4gICAgZnVuY3Rpb24gc2V0SW1tZWRpYXRlKGNhbGxiYWNrKSB7XG4gICAgICAvLyBDYWxsYmFjayBjYW4gZWl0aGVyIGJlIGEgZnVuY3Rpb24gb3IgYSBzdHJpbmdcbiAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBjYWxsYmFjayA9IG5ldyBGdW5jdGlvbihcIlwiICsgY2FsbGJhY2spO1xuICAgICAgfVxuICAgICAgLy8gQ29weSBmdW5jdGlvbiBhcmd1bWVudHNcbiAgICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGFyZ3NbaV0gPSBhcmd1bWVudHNbaSArIDFdO1xuICAgICAgfVxuICAgICAgLy8gU3RvcmUgYW5kIHJlZ2lzdGVyIHRoZSB0YXNrXG4gICAgICB2YXIgdGFzayA9IHsgY2FsbGJhY2s6IGNhbGxiYWNrLCBhcmdzOiBhcmdzIH07XG4gICAgICB0YXNrc0J5SGFuZGxlW25leHRIYW5kbGVdID0gdGFzaztcbiAgICAgIHJlZ2lzdGVySW1tZWRpYXRlKG5leHRIYW5kbGUpO1xuICAgICAgcmV0dXJuIG5leHRIYW5kbGUrKztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbGVhckltbWVkaWF0ZShoYW5kbGUpIHtcbiAgICAgICAgZGVsZXRlIHRhc2tzQnlIYW5kbGVbaGFuZGxlXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBydW4odGFzaykge1xuICAgICAgICB2YXIgY2FsbGJhY2sgPSB0YXNrLmNhbGxiYWNrO1xuICAgICAgICB2YXIgYXJncyA9IHRhc2suYXJncztcbiAgICAgICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIGNhbGxiYWNrKGFyZ3NbMF0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIGNhbGxiYWNrKGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIGNhbGxiYWNrKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBjYWxsYmFjay5hcHBseSh1bmRlZmluZWQsIGFyZ3MpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBydW5JZlByZXNlbnQoaGFuZGxlKSB7XG4gICAgICAgIC8vIEZyb20gdGhlIHNwZWM6IFwiV2FpdCB1bnRpbCBhbnkgaW52b2NhdGlvbnMgb2YgdGhpcyBhbGdvcml0aG0gc3RhcnRlZCBiZWZvcmUgdGhpcyBvbmUgaGF2ZSBjb21wbGV0ZWQuXCJcbiAgICAgICAgLy8gU28gaWYgd2UncmUgY3VycmVudGx5IHJ1bm5pbmcgYSB0YXNrLCB3ZSdsbCBuZWVkIHRvIGRlbGF5IHRoaXMgaW52b2NhdGlvbi5cbiAgICAgICAgaWYgKGN1cnJlbnRseVJ1bm5pbmdBVGFzaykge1xuICAgICAgICAgICAgLy8gRGVsYXkgYnkgZG9pbmcgYSBzZXRUaW1lb3V0LiBzZXRJbW1lZGlhdGUgd2FzIHRyaWVkIGluc3RlYWQsIGJ1dCBpbiBGaXJlZm94IDcgaXQgZ2VuZXJhdGVkIGFcbiAgICAgICAgICAgIC8vIFwidG9vIG11Y2ggcmVjdXJzaW9uXCIgZXJyb3IuXG4gICAgICAgICAgICBzZXRUaW1lb3V0KHJ1bklmUHJlc2VudCwgMCwgaGFuZGxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciB0YXNrID0gdGFza3NCeUhhbmRsZVtoYW5kbGVdO1xuICAgICAgICAgICAgaWYgKHRhc2spIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50bHlSdW5uaW5nQVRhc2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJ1bih0YXNrKTtcbiAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICBjbGVhckltbWVkaWF0ZShoYW5kbGUpO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50bHlSdW5uaW5nQVRhc2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsTmV4dFRpY2tJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkgeyBydW5JZlByZXNlbnQoaGFuZGxlKTsgfSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2FuVXNlUG9zdE1lc3NhZ2UoKSB7XG4gICAgICAgIC8vIFRoZSB0ZXN0IGFnYWluc3QgYGltcG9ydFNjcmlwdHNgIHByZXZlbnRzIHRoaXMgaW1wbGVtZW50YXRpb24gZnJvbSBiZWluZyBpbnN0YWxsZWQgaW5zaWRlIGEgd2ViIHdvcmtlcixcbiAgICAgICAgLy8gd2hlcmUgYGdsb2JhbC5wb3N0TWVzc2FnZWAgbWVhbnMgc29tZXRoaW5nIGNvbXBsZXRlbHkgZGlmZmVyZW50IGFuZCBjYW4ndCBiZSB1c2VkIGZvciB0aGlzIHB1cnBvc2UuXG4gICAgICAgIGlmIChnbG9iYWwucG9zdE1lc3NhZ2UgJiYgIWdsb2JhbC5pbXBvcnRTY3JpcHRzKSB7XG4gICAgICAgICAgICB2YXIgcG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cyA9IHRydWU7XG4gICAgICAgICAgICB2YXIgb2xkT25NZXNzYWdlID0gZ2xvYmFsLm9ubWVzc2FnZTtcbiAgICAgICAgICAgIGdsb2JhbC5vbm1lc3NhZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZUlzQXN5bmNocm9ub3VzID0gZmFsc2U7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKFwiXCIsIFwiKlwiKTtcbiAgICAgICAgICAgIGdsb2JhbC5vbm1lc3NhZ2UgPSBvbGRPbk1lc3NhZ2U7XG4gICAgICAgICAgICByZXR1cm4gcG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxQb3N0TWVzc2FnZUltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICAvLyBJbnN0YWxscyBhbiBldmVudCBoYW5kbGVyIG9uIGBnbG9iYWxgIGZvciB0aGUgYG1lc3NhZ2VgIGV2ZW50OiBzZWVcbiAgICAgICAgLy8gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9ET00vd2luZG93LnBvc3RNZXNzYWdlXG4gICAgICAgIC8vICogaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay9tdWx0aXBhZ2UvY29tbXMuaHRtbCNjcm9zc0RvY3VtZW50TWVzc2FnZXNcblxuICAgICAgICB2YXIgbWVzc2FnZVByZWZpeCA9IFwic2V0SW1tZWRpYXRlJFwiICsgTWF0aC5yYW5kb20oKSArIFwiJFwiO1xuICAgICAgICB2YXIgb25HbG9iYWxNZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChldmVudC5zb3VyY2UgPT09IGdsb2JhbCAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBldmVudC5kYXRhID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICAgICAgZXZlbnQuZGF0YS5pbmRleE9mKG1lc3NhZ2VQcmVmaXgpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcnVuSWZQcmVzZW50KCtldmVudC5kYXRhLnNsaWNlKG1lc3NhZ2VQcmVmaXgubGVuZ3RoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgICAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgb25HbG9iYWxNZXNzYWdlLCBmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnbG9iYWwuYXR0YWNoRXZlbnQoXCJvbm1lc3NhZ2VcIiwgb25HbG9iYWxNZXNzYWdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBnbG9iYWwucG9zdE1lc3NhZ2UobWVzc2FnZVByZWZpeCArIGhhbmRsZSwgXCIqXCIpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxNZXNzYWdlQ2hhbm5lbEltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgICAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gZXZlbnQuZGF0YTtcbiAgICAgICAgICAgIHJ1bklmUHJlc2VudChoYW5kbGUpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBjaGFubmVsLnBvcnQyLnBvc3RNZXNzYWdlKGhhbmRsZSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbFJlYWR5U3RhdGVDaGFuZ2VJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgdmFyIGh0bWwgPSBkb2MuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgLy8gQ3JlYXRlIGEgPHNjcmlwdD4gZWxlbWVudDsgaXRzIHJlYWR5c3RhdGVjaGFuZ2UgZXZlbnQgd2lsbCBiZSBmaXJlZCBhc3luY2hyb25vdXNseSBvbmNlIGl0IGlzIGluc2VydGVkXG4gICAgICAgICAgICAvLyBpbnRvIHRoZSBkb2N1bWVudC4gRG8gc28sIHRodXMgcXVldWluZyB1cCB0aGUgdGFzay4gUmVtZW1iZXIgdG8gY2xlYW4gdXAgb25jZSBpdCdzIGJlZW4gY2FsbGVkLlxuICAgICAgICAgICAgdmFyIHNjcmlwdCA9IGRvYy5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO1xuICAgICAgICAgICAgc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBydW5JZlByZXNlbnQoaGFuZGxlKTtcbiAgICAgICAgICAgICAgICBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBodG1sLnJlbW92ZUNoaWxkKHNjcmlwdCk7XG4gICAgICAgICAgICAgICAgc2NyaXB0ID0gbnVsbDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBodG1sLmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbFNldFRpbWVvdXRJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQocnVuSWZQcmVzZW50LCAwLCBoYW5kbGUpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIElmIHN1cHBvcnRlZCwgd2Ugc2hvdWxkIGF0dGFjaCB0byB0aGUgcHJvdG90eXBlIG9mIGdsb2JhbCwgc2luY2UgdGhhdCBpcyB3aGVyZSBzZXRUaW1lb3V0IGV0IGFsLiBsaXZlLlxuICAgIHZhciBhdHRhY2hUbyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZ2xvYmFsKTtcbiAgICBhdHRhY2hUbyA9IGF0dGFjaFRvICYmIGF0dGFjaFRvLnNldFRpbWVvdXQgPyBhdHRhY2hUbyA6IGdsb2JhbDtcblxuICAgIC8vIERvbid0IGdldCBmb29sZWQgYnkgZS5nLiBicm93c2VyaWZ5IGVudmlyb25tZW50cy5cbiAgICBpZiAoe30udG9TdHJpbmcuY2FsbChnbG9iYWwucHJvY2VzcykgPT09IFwiW29iamVjdCBwcm9jZXNzXVwiKSB7XG4gICAgICAgIC8vIEZvciBOb2RlLmpzIGJlZm9yZSAwLjlcbiAgICAgICAgaW5zdGFsbE5leHRUaWNrSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSBpZiAoY2FuVXNlUG9zdE1lc3NhZ2UoKSkge1xuICAgICAgICAvLyBGb3Igbm9uLUlFMTAgbW9kZXJuIGJyb3dzZXJzXG4gICAgICAgIGluc3RhbGxQb3N0TWVzc2FnZUltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2UgaWYgKGdsb2JhbC5NZXNzYWdlQ2hhbm5lbCkge1xuICAgICAgICAvLyBGb3Igd2ViIHdvcmtlcnMsIHdoZXJlIHN1cHBvcnRlZFxuICAgICAgICBpbnN0YWxsTWVzc2FnZUNoYW5uZWxJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIGlmIChkb2MgJiYgXCJvbnJlYWR5c3RhdGVjaGFuZ2VcIiBpbiBkb2MuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKSkge1xuICAgICAgICAvLyBGb3IgSUUgNuKAkzhcbiAgICAgICAgaW5zdGFsbFJlYWR5U3RhdGVDaGFuZ2VJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRm9yIG9sZGVyIGJyb3dzZXJzXG4gICAgICAgIGluc3RhbGxTZXRUaW1lb3V0SW1wbGVtZW50YXRpb24oKTtcbiAgICB9XG5cbiAgICBhdHRhY2hUby5zZXRJbW1lZGlhdGUgPSBzZXRJbW1lZGlhdGU7XG4gICAgYXR0YWNoVG8uY2xlYXJJbW1lZGlhdGUgPSBjbGVhckltbWVkaWF0ZTtcbn0odHlwZW9mIHNlbGYgPT09IFwidW5kZWZpbmVkXCIgPyB0eXBlb2YgZ2xvYmFsID09PSBcInVuZGVmaW5lZFwiID8gdGhpcyA6IGdsb2JhbCA6IHNlbGYpKTtcbiIsInZhciBzY29wZSA9ICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiICYmIGdsb2JhbCkgfHxcbiAgICAgICAgICAgICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzZWxmKSB8fFxuICAgICAgICAgICAgd2luZG93O1xudmFyIGFwcGx5ID0gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5O1xuXG4vLyBET00gQVBJcywgZm9yIGNvbXBsZXRlbmVzc1xuXG5leHBvcnRzLnNldFRpbWVvdXQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBUaW1lb3V0KGFwcGx5LmNhbGwoc2V0VGltZW91dCwgc2NvcGUsIGFyZ3VtZW50cyksIGNsZWFyVGltZW91dCk7XG59O1xuZXhwb3J0cy5zZXRJbnRlcnZhbCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFRpbWVvdXQoYXBwbHkuY2FsbChzZXRJbnRlcnZhbCwgc2NvcGUsIGFyZ3VtZW50cyksIGNsZWFySW50ZXJ2YWwpO1xufTtcbmV4cG9ydHMuY2xlYXJUaW1lb3V0ID1cbmV4cG9ydHMuY2xlYXJJbnRlcnZhbCA9IGZ1bmN0aW9uKHRpbWVvdXQpIHtcbiAgaWYgKHRpbWVvdXQpIHtcbiAgICB0aW1lb3V0LmNsb3NlKCk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIFRpbWVvdXQoaWQsIGNsZWFyRm4pIHtcbiAgdGhpcy5faWQgPSBpZDtcbiAgdGhpcy5fY2xlYXJGbiA9IGNsZWFyRm47XG59XG5UaW1lb3V0LnByb3RvdHlwZS51bnJlZiA9IFRpbWVvdXQucHJvdG90eXBlLnJlZiA9IGZ1bmN0aW9uKCkge307XG5UaW1lb3V0LnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9jbGVhckZuLmNhbGwoc2NvcGUsIHRoaXMuX2lkKTtcbn07XG5cbi8vIERvZXMgbm90IHN0YXJ0IHRoZSB0aW1lLCBqdXN0IHNldHMgdXAgdGhlIG1lbWJlcnMgbmVlZGVkLlxuZXhwb3J0cy5lbnJvbGwgPSBmdW5jdGlvbihpdGVtLCBtc2Vjcykge1xuICBjbGVhclRpbWVvdXQoaXRlbS5faWRsZVRpbWVvdXRJZCk7XG4gIGl0ZW0uX2lkbGVUaW1lb3V0ID0gbXNlY3M7XG59O1xuXG5leHBvcnRzLnVuZW5yb2xsID0gZnVuY3Rpb24oaXRlbSkge1xuICBjbGVhclRpbWVvdXQoaXRlbS5faWRsZVRpbWVvdXRJZCk7XG4gIGl0ZW0uX2lkbGVUaW1lb3V0ID0gLTE7XG59O1xuXG5leHBvcnRzLl91bnJlZkFjdGl2ZSA9IGV4cG9ydHMuYWN0aXZlID0gZnVuY3Rpb24oaXRlbSkge1xuICBjbGVhclRpbWVvdXQoaXRlbS5faWRsZVRpbWVvdXRJZCk7XG5cbiAgdmFyIG1zZWNzID0gaXRlbS5faWRsZVRpbWVvdXQ7XG4gIGlmIChtc2VjcyA+PSAwKSB7XG4gICAgaXRlbS5faWRsZVRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gb25UaW1lb3V0KCkge1xuICAgICAgaWYgKGl0ZW0uX29uVGltZW91dClcbiAgICAgICAgaXRlbS5fb25UaW1lb3V0KCk7XG4gICAgfSwgbXNlY3MpO1xuICB9XG59O1xuXG4vLyBzZXRpbW1lZGlhdGUgYXR0YWNoZXMgaXRzZWxmIHRvIHRoZSBnbG9iYWwgb2JqZWN0XG5yZXF1aXJlKFwic2V0aW1tZWRpYXRlXCIpO1xuLy8gT24gc29tZSBleG90aWMgZW52aXJvbm1lbnRzLCBpdCdzIG5vdCBjbGVhciB3aGljaCBvYmplY3QgYHNldGltbWVkaWF0ZWAgd2FzXG4vLyBhYmxlIHRvIGluc3RhbGwgb250by4gIFNlYXJjaCBlYWNoIHBvc3NpYmlsaXR5IGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZVxuLy8gYHNldGltbWVkaWF0ZWAgbGlicmFyeS5cbmV4cG9ydHMuc2V0SW1tZWRpYXRlID0gKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiICYmIHNlbGYuc2V0SW1tZWRpYXRlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBnbG9iYWwuc2V0SW1tZWRpYXRlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAodGhpcyAmJiB0aGlzLnNldEltbWVkaWF0ZSk7XG5leHBvcnRzLmNsZWFySW1tZWRpYXRlID0gKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiICYmIHNlbGYuY2xlYXJJbW1lZGlhdGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgJiYgZ2xvYmFsLmNsZWFySW1tZWRpYXRlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzICYmIHRoaXMuY2xlYXJJbW1lZGlhdGUpO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcblx0dGhyb3cgbmV3IEVycm9yKFwiZGVmaW5lIGNhbm5vdCBiZSB1c2VkIGluZGlyZWN0XCIpO1xufTtcbiIsIi8qIGdsb2JhbHMgX193ZWJwYWNrX2FtZF9vcHRpb25zX18gKi9cbm1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX2FtZF9vcHRpb25zX187XG4iLCJ2YXIgZztcblxuLy8gVGhpcyB3b3JrcyBpbiBub24tc3RyaWN0IG1vZGVcbmcgPSAoZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzO1xufSkoKTtcblxudHJ5IHtcblx0Ly8gVGhpcyB3b3JrcyBpZiBldmFsIGlzIGFsbG93ZWQgKHNlZSBDU1ApXG5cdGcgPSBnIHx8IG5ldyBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCk7XG59IGNhdGNoIChlKSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlXG5cdGlmICh0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKSBnID0gd2luZG93O1xufVxuXG4vLyBnIGNhbiBzdGlsbCBiZSB1bmRlZmluZWQsIGJ1dCBub3RoaW5nIHRvIGRvIGFib3V0IGl0Li4uXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xuLy8gZWFzaWVyIHRvIGhhbmRsZSB0aGlzIGNhc2UuIGlmKCFnbG9iYWwpIHsgLi4ufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGc7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuXHRpZiAoIW1vZHVsZS53ZWJwYWNrUG9seWZpbGwpIHtcblx0XHRtb2R1bGUuZGVwcmVjYXRlID0gZnVuY3Rpb24oKSB7fTtcblx0XHRtb2R1bGUucGF0aHMgPSBbXTtcblx0XHQvLyBtb2R1bGUucGFyZW50ID0gdW5kZWZpbmVkIGJ5IGRlZmF1bHRcblx0XHRpZiAoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgXCJsb2FkZWRcIiwge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBtb2R1bGUubDtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImlkXCIsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gbW9kdWxlLmk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0bW9kdWxlLndlYnBhY2tQb2x5ZmlsbCA9IDE7XG5cdH1cblx0cmV0dXJuIG1vZHVsZTtcbn07XG4iLCJpbXBvcnQge01MfSBmcm9tICcuL21sJztcbmltcG9ydCB7TUxDb250ZXh0fSBmcm9tICcuL25uL2NvbnRleHQnO1xuaW1wb3J0IHtNTEdyYXBofSBmcm9tICcuL25uL2dyYXBoJztcbmltcG9ydCB7TUxHcmFwaEJ1aWxkZXJ9IGZyb20gJy4vbm4vZ3JhcGhfYnVpbGRlcic7XG5pbXBvcnQge01MT3BlcmFuZH0gZnJvbSAnLi9ubi9vcGVyYW5kJztcblxuaWYgKG5hdmlnYXRvci5tbCA9PSBudWxsKSB7XG4gIG5hdmlnYXRvci5tbCA9IG5ldyBNTCgpO1xufVxuXG5pZiAoZ2xvYmFsLk1MID09IG51bGwpIHtcbiAgZ2xvYmFsLk1MID0gTUw7XG59XG5cbmlmIChnbG9iYWwuTUxDb250ZXh0ID09IG51bGwpIHtcbiAgZ2xvYmFsLk1MQ29udGV4dCA9IE1MQ29udGV4dDtcbn1cblxuaWYgKGdsb2JhbC5NTEdyYXBoQnVpbGRlciA9PSBudWxsKSB7XG4gIGdsb2JhbC5NTEdyYXBoQnVpbGRlciA9IE1MR3JhcGhCdWlsZGVyO1xufVxuXG5pZiAoZ2xvYmFsLk1MR3JhcGggPT0gbnVsbCkge1xuICBnbG9iYWwuTUxHcmFwaCA9IE1MR3JhcGg7XG59XG5cbmlmIChnbG9iYWwuTUxPcGVyYW5kID09IG51bGwpIHtcbiAgZ2xvYmFsLk1MT3BlcmFuZCA9IE1MT3BlcmFuZDtcbn1cbiIsImltcG9ydCB7TUxDb250ZXh0LCBNTENvbnRleHRPcHRpb25zfSBmcm9tICcuL25uL2NvbnRleHQnO1xuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI21sKVxuICovXG5leHBvcnQgY2xhc3MgTUwge1xuICAvKiogQGlnbm9yZSAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBjcmVhdGVDb250ZXh0KG9wdGlvbnM6IE1MQ29udGV4dE9wdGlvbnMgPSB7fSk6IE1MQ29udGV4dCB7XG4gICAgcmV0dXJuIG5ldyBNTENvbnRleHQob3B0aW9ucyk7XG4gIH1cbn1cbiIsImltcG9ydCAnQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsJztcbmltcG9ydCAnQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdSc7XG5pbXBvcnQgKiBhcyB3YXNtIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtJztcblxuaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZW51bWRlZi1tbHBvd2VycHJlZmVyZW5jZSlcbiAqL1xuZXhwb3J0IGVudW0gTUxQb3dlclByZWZlcmVuY2Uge1xuICAnZGVmYXVsdCcgPSAnZGVmYXVsdCcsXG4gICdoaWdoLXBlcmZvcm1hbmNlJyA9ICdoaWdoLXBlcmZvcm1hbmNlJyxcbiAgJ2xvdy1wb3dlcicgPSAnbG93LXBvd2VyJ1xufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2VudW1kZWYtbWxkZXZpY2VwcmVmZXJlbmNlKVxuICovXG5leHBvcnQgZW51bSBNTERldmljZVByZWZlcmVuY2Uge1xuICAnZGVmYXVsdCcgPSAnZGVmYXVsdCcsXG4gICdncHUnID0gJ2dwdScsXG4gICdjcHUnID0gJ2NwdSdcbn1cblxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RpY3RkZWYtbWxjb250ZXh0b3B0aW9ucylcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNTENvbnRleHRPcHRpb25zIHtcbiAgLyoqICovXG4gIHBvd2VyUHJlZmVyZW5jZT86IE1MUG93ZXJQcmVmZXJlbmNlO1xuICAvKiogKi9cbiAgZGV2aWNlUHJlZmVyZW5jZT86IE1MRGV2aWNlUHJlZmVyZW5jZTtcbn1cblxuLyoqXG4gKiBbQVBJIHNwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jbWxjb250ZXh0KVxuICovXG5leHBvcnQgY2xhc3MgTUxDb250ZXh0IHtcbiAgcHJpdmF0ZSBvcHRpb25zXzogTUxDb250ZXh0T3B0aW9ucztcblxuICAvKiogQGludGVybmFsICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgY29uc3RydWN0b3Iob3B0aW9uczogTUxDb250ZXh0T3B0aW9ucyA9IHt9KSB7XG4gICAgdXRpbHMuYXNzZXJ0KG9wdGlvbnMgaW5zdGFuY2VvZiBPYmplY3QsICdJbnZhbGlkIG9wdGlvbnMuJyk7XG4gICAgaWYgKG9wdGlvbnMucG93ZXJQcmVmZXJlbmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgICBvcHRpb25zLnBvd2VyUHJlZmVyZW5jZSBpbiBNTFBvd2VyUHJlZmVyZW5jZSxcbiAgICAgICAgICAnSW52YWxpZCBwb3dlciBwcmVmZXJlbmNlLicpO1xuICAgIH1cbiAgICB0aGlzLm9wdGlvbnNfID0gb3B0aW9ucztcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0IG9wdGlvbnMoKTogTUxDb250ZXh0T3B0aW9ucyB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9uc187XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIC8vIEV4cG9zZSB0Zi5qcyBmb3IgYmFja2VuZCBkZWJ1Z2dpbmcuXG4gIGdldCB0ZigpOiB1bmtub3duIHtcbiAgICAvLyBTZXQgZGlyZWN0b3J5IG9mIHdhc20gYmluYXJpZXMgZm9yICd3YXNtJyBiYWNrZW5kXG4gICAgd2FzbS5zZXRXYXNtUGF0aHMoYGh0dHBzOi8vdW5wa2cuY29tL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtQCR7XG4gICAgICAgIHRmLnZlcnNpb25fY29yZX0vZGlzdC9gKTtcbiAgICByZXR1cm4gdGY7XG4gIH1cbn1cbiIsImltcG9ydCAnQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsJztcbmltcG9ydCAnQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdSc7XG5pbXBvcnQgJ0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtJztcblxuaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNTEJ1ZmZlclZpZXcsIE1MTmFtZWRPcGVyYW5kc30gZnJvbSAnLi9ncmFwaF9idWlsZGVyJztcbmltcG9ydCB7Q29uc3RhbnRPcGVyYW5kLCBJbnB1dE9wZXJhbmQsIE1MT3BlcmFuZCwgTUxPcGVyYW5kRGVzY3JpcHRvciwgT3V0cHV0T3BlcmFuZH0gZnJvbSAnLi9vcGVyYW5kJztcbmltcG9ydCB7T3BlcmF0aW9ufSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge0FycmF5QnVmZmVyVmlld30gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IHR5cGUgTUxSZXNvdXJjY2UgPSBNTEJ1ZmZlclZpZXd8V2ViR0xUZXh0dXJlO1xuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RpY3RkZWYtbWxpbnB1dClcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNTElucHV0IHtcbiAgcmVzb3VyY2U6IE1MUmVzb3VyY2NlO1xuICBkaW1lbnNpb25zOiBudW1iZXJbXTtcbn1cblxuLyoqXG4gKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyN0eXBlZGVmZGVmLW1sbmFtZWRpbnB1dHMpXG4gKi9cbmV4cG9ydCB0eXBlIE1MTmFtZWRJbnB1dHMgPSBSZWNvcmQ8c3RyaW5nLCBNTElucHV0fE1MUmVzb3VyY2NlPjtcblxuLyoqXG4gKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyN0eXBlZGVmZGVmLW1sbmFtZWRvdXRwdXRzKVxuICovXG5leHBvcnQgdHlwZSBNTE5hbWVkT3V0cHV0cyA9IFJlY29yZDxzdHJpbmcsIE1MUmVzb3VyY2NlPjtcblxuLyoqIEBpbnRlcm5hbCAqL1xuY2xhc3MgT3BlcmFuZFRlbnNvciB7XG4gIHJlZjogbnVtYmVyO1xuICB0ZW5zb3I6IHRmLlRlbnNvcjtcbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGNsYXNzIEV4ZWN1dGlvbkNvbnRleHQge1xuICBwcml2YXRlIGNvbnN0YW50VGVub3Nyc186IE1hcDxDb25zdGFudE9wZXJhbmQsIHRmLlRlbnNvcj47XG4gIHByaXZhdGUgaW5wdXRUZW5zb3JzXzogTWFwPElucHV0T3BlcmFuZCwgT3BlcmFuZFRlbnNvcj47XG4gIHByaXZhdGUgb3V0cHV0VGVuc29yc186IE1hcDxPdXRwdXRPcGVyYW5kLCBPcGVyYW5kVGVuc29yPjtcbiAgcHJpdmF0ZSBvcGVyYW5kUmVmc186IE1hcDxNTE9wZXJhbmQsIG51bWJlcj47XG4gIHByaXZhdGUgb3V0cHV0T3BlcmFuZHNfOiBTZXQ8T3V0cHV0T3BlcmFuZD47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBjb25zdGFudFRlbnNvcnM6IE1hcDxDb25zdGFudE9wZXJhbmQsIHRmLlRlbnNvcj4sXG4gICAgICBpbnB1dE9wZXJhbmRzOiBNYXA8c3RyaW5nLCBJbnB1dE9wZXJhbmQ+LFxuICAgICAgaW5wdXRzOiBNTE5hbWVkSW5wdXRzLFxuICAgICAgb3BlcmFuZFJlZnM6IE1hcDxNTE9wZXJhbmQsIG51bWJlcj4sXG4gICkge1xuICAgIHRoaXMuY29uc3RhbnRUZW5vc3JzXyA9IGNvbnN0YW50VGVuc29ycztcbiAgICB0aGlzLm9wZXJhbmRSZWZzXyA9IG9wZXJhbmRSZWZzO1xuICAgIHRoaXMuYWxsb2NhdGVJbnB1dFRlbnNvcnMoaW5wdXRPcGVyYW5kcywgaW5wdXRzKTtcbiAgICB0aGlzLm91dHB1dFRlbnNvcnNfID0gbmV3IE1hcCgpO1xuICAgIHRoaXMub3V0cHV0T3BlcmFuZHNfID0gbmV3IFNldCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhbGxvY2F0ZUlucHV0VGVuc29ycyhcbiAgICAgIGlucHV0T3BlcmFuZHM6IE1hcDxzdHJpbmcsIElucHV0T3BlcmFuZD4sIGlucHV0czogTUxOYW1lZElucHV0cykge1xuICAgIHRoaXMuaW5wdXRUZW5zb3JzXyA9IG5ldyBNYXAoKTtcbiAgICBmb3IgKGNvbnN0IGlucHV0TmFtZSBpbiBpbnB1dHMpIHtcbiAgICAgIGNvbnN0IGlucHV0ID0gaW5wdXRzW2lucHV0TmFtZV07XG4gICAgICBjb25zdCBpbnB1dE9wZXJhbmQgPSBpbnB1dE9wZXJhbmRzLmdldChpbnB1dE5hbWUpO1xuICAgICAgbGV0IGRlc2M6IE1MT3BlcmFuZERlc2NyaXB0b3I7XG4gICAgICBsZXQgcmVzb3VyY2U7XG4gICAgICBpZiAoKGlucHV0IGFzIE1MSW5wdXQpLmRpbWVuc2lvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZXNjID0ge1xuICAgICAgICAgIHR5cGU6IGlucHV0T3BlcmFuZC5kZXNjLnR5cGUsXG4gICAgICAgICAgZGltZW5zaW9uczogKGlucHV0IGFzIE1MSW5wdXQpLmRpbWVuc2lvbnNcbiAgICAgICAgfSBhcyBNTE9wZXJhbmREZXNjcmlwdG9yO1xuICAgICAgICByZXNvdXJjZSA9IChpbnB1dCBhcyBNTElucHV0KS5yZXNvdXJjZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlc2MgPSBpbnB1dE9wZXJhbmQuZGVzYztcbiAgICAgICAgcmVzb3VyY2UgPSBpbnB1dDtcbiAgICAgIH1cbiAgICAgIHRoaXMuaW5wdXRUZW5zb3JzXy5zZXQoaW5wdXRPcGVyYW5kLCB7XG4gICAgICAgIHJlZjogdGhpcy5vcGVyYW5kUmVmc18uZ2V0KGlucHV0T3BlcmFuZCksXG4gICAgICAgIHRlbnNvcjogdXRpbHMuY3JlYXRlVGVuc29yKGRlc2MsIHJlc291cmNlIGFzIEFycmF5QnVmZmVyVmlldylcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGNvbXB1dGUob3V0cHV0czogTWFwPHN0cmluZywgT3V0cHV0T3BlcmFuZD4pOiB0Zi5UZW5zb3JDb250YWluZXJPYmplY3Qge1xuICAgIGZvciAoY29uc3Qgb3V0cHV0IG9mIG91dHB1dHMudmFsdWVzKCkpIHtcbiAgICAgIHRoaXMub3V0cHV0T3BlcmFuZHNfLmFkZChvdXRwdXQpO1xuICAgIH1cbiAgICBjb25zdCBvdXRwdXRUZW5zb3JzOiB0Zi5UZW5zb3JDb250YWluZXJPYmplY3QgPSB7fTtcbiAgICBmb3IgKGNvbnN0IG91dHB1dE5hbWUgb2Ygb3V0cHV0cy5rZXlzKCkpIHtcbiAgICAgIG91dHB1dFRlbnNvcnNbb3V0cHV0TmFtZV0gPSB0aGlzLmdldFRlbnNvcihvdXRwdXRzLmdldChvdXRwdXROYW1lKSk7XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXRUZW5zb3JzO1xuICB9XG5cbiAgc2V0T3V0cHV0VGVuc29yKG91dHB1dDogT3V0cHV0T3BlcmFuZCwgdGVuc29yOiB0Zi5UZW5zb3IpOiB2b2lkIHtcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgICF0aGlzLm91dHB1dFRlbnNvcnNfLmhhcyhvdXRwdXQpLCAnTUxPdXRwdXQgYWxyZWFkeSBoYXMgdGVuc29yLicpO1xuICAgIHRoaXMub3V0cHV0VGVuc29yc18uc2V0KFxuICAgICAgICBvdXRwdXQsIHtyZWY6IHRoaXMub3BlcmFuZFJlZnNfLmdldChvdXRwdXQpLCB0ZW5zb3J9KTtcbiAgfVxuXG4gIHJlbGVhc2VUZW5zb3Iob3BlcmFuZDogTUxPcGVyYW5kKTogdm9pZCB7XG4gICAgbGV0IG9wZXJhbmRUZW5zb3JNYXA6IE1hcDxNTE9wZXJhbmQsIE9wZXJhbmRUZW5zb3I+O1xuICAgIGlmIChvcGVyYW5kIGluc3RhbmNlb2YgSW5wdXRPcGVyYW5kKSB7XG4gICAgICBvcGVyYW5kVGVuc29yTWFwID0gdGhpcy5pbnB1dFRlbnNvcnNfO1xuICAgIH0gZWxzZSBpZiAob3BlcmFuZCBpbnN0YW5jZW9mIE91dHB1dE9wZXJhbmQpIHtcbiAgICAgIGlmICh0aGlzLm91dHB1dE9wZXJhbmRzXy5oYXMob3BlcmFuZCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgb3BlcmFuZFRlbnNvck1hcCA9IHRoaXMub3V0cHV0VGVuc29yc187XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb3BlcmFuZFRlbnNvcjogT3BlcmFuZFRlbnNvciA9IG9wZXJhbmRUZW5zb3JNYXAuZ2V0KG9wZXJhbmQpO1xuICAgIHV0aWxzLmFzc2VydChvcGVyYW5kVGVuc29yICE9PSB1bmRlZmluZWQsICdObyB0ZW5zb3IgZm91bmQgZm9yIG9wZXJhbmQuJyk7XG4gICAgb3BlcmFuZFRlbnNvci5yZWYtLTtcbiAgICBpZiAob3BlcmFuZFRlbnNvci5yZWYgPT09IDApIHtcbiAgICAgIHRmLmRpc3Bvc2Uob3BlcmFuZFRlbnNvci50ZW5zb3IpO1xuICAgICAgb3BlcmFuZFRlbnNvck1hcC5kZWxldGUob3BlcmFuZCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0VGVuc29yKG9wZXJhbmQ6IE1MT3BlcmFuZCk6IHRmLlRlbnNvciB7XG4gICAgaWYgKG9wZXJhbmQgaW5zdGFuY2VvZiBDb25zdGFudE9wZXJhbmQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnN0YW50VGVub3Nyc18uZ2V0KG9wZXJhbmQpO1xuICAgIH0gZWxzZSBpZiAob3BlcmFuZCBpbnN0YW5jZW9mIElucHV0T3BlcmFuZCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5wdXRUZW5zb3JzXy5nZXQob3BlcmFuZCkudGVuc29yO1xuICAgIH0gZWxzZSBpZiAob3BlcmFuZCBpbnN0YW5jZW9mIE91dHB1dE9wZXJhbmQpIHtcbiAgICAgIGlmICh0aGlzLm91dHB1dFRlbnNvcnNfLmhhcyhvcGVyYW5kKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5vdXRwdXRUZW5zb3JzXy5nZXQob3BlcmFuZCkudGVuc29yO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3BlcmFuZC5vcGVyYXRpb24uY29tcHV0ZSh0aGlzKTtcbiAgICAgICAgdXRpbHMuYXNzZXJ0KHRoaXMub3V0cHV0VGVuc29yc18uaGFzKG9wZXJhbmQpLCAnTm8gb3V0cHV0IGlzIHNldC4nKTtcbiAgICAgICAgcmV0dXJuIHRoaXMub3V0cHV0VGVuc29yc18uZ2V0KG9wZXJhbmQpLnRlbnNvcjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgb3BlcmFuZCBpcyBpbnZhbGlkLicpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2FwaS1tbGdyYXBoKVxuICovXG5leHBvcnQgY2xhc3MgTUxHcmFwaCB7XG4gIHByaXZhdGUgaW5wdXRzXzogTWFwPHN0cmluZywgSW5wdXRPcGVyYW5kPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBvdXRwdXRzXzogTWFwPHN0cmluZywgT3V0cHV0T3BlcmFuZD4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgY29uc3RhbnRzXzogU2V0PENvbnN0YW50T3BlcmFuZD4gPSBuZXcgU2V0KCk7XG4gIHByaXZhdGUgb3BlcmFuZFJlZnNfOiBNYXA8TUxPcGVyYW5kLCBudW1iZXI+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIGNvbnN0YW50VGVuc29yc186IE1hcDxDb25zdGFudE9wZXJhbmQsIHRmLlRlbnNvcj4gPSBuZXcgTWFwKCk7XG5cbiAgY29tcHV0ZShpbnB1dHM6IE1MTmFtZWRJbnB1dHMsIG91dHB1dHM6IE1MTmFtZWRPdXRwdXRzKTogdm9pZCB7XG4gICAgdGhpcy52YWxpZGF0ZUlucHV0cyhpbnB1dHMpO1xuXG4gICAgLy8gVmFsaWRhdGUgYW5kIGZpbHRlciB0aGUgcmVxdWlyZWQgb3V0cHV0IG9wZXJhbmRzLlxuICAgIHV0aWxzLmFzc2VydChPYmplY3Qua2V5cyhvdXRwdXRzKS5sZW5ndGggIT09IDAsICdUaGUgb3V0cHV0cyBpcyBpbnZhbGlkLicpO1xuICAgIGNvbnN0IG91dHB1dE9wZXJhbmRzOiBNYXA8c3RyaW5nLCBPdXRwdXRPcGVyYW5kPiA9IG5ldyBNYXAoKTtcbiAgICBmb3IgKGNvbnN0IG91dHB1dE5hbWUgaW4gb3V0cHV0cykge1xuICAgICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgIHR5cGVvZiBvdXRwdXROYW1lID09PSAnc3RyaW5nJyAmJiB0aGlzLm91dHB1dHNfLmhhcyhvdXRwdXROYW1lKSxcbiAgICAgICAgICAnVGhlIG5hbWUgb2YgdGhlIG91dHB1dCBpcyBpbnZhbGlkLicpO1xuICAgICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgIHV0aWxzLmlzVHlwZWRBcnJheShvdXRwdXRzW291dHB1dE5hbWVdKSxcbiAgICAgICAgICAnT25seSBvdXRwdXQgb2YgQXJyYXlCdWZmZXJWaWV3IHR5cGUgaXMgc3VwcG9ydGVkLicpO1xuICAgICAgb3V0cHV0T3BlcmFuZHMuc2V0KG91dHB1dE5hbWUsIHRoaXMub3V0cHV0c18uZ2V0KG91dHB1dE5hbWUpKTtcbiAgICB9XG5cbiAgICAvLyBDb21wdXRlIHRoZSBvdXRwdXQgdGVuc29ycy5cbiAgICBjb25zdCBvdXRwdXRUZW5zb3JzOiB0Zi5UZW5zb3JDb250YWluZXJPYmplY3QgPSB0Zi50aWR5KCgpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBuZXcgRXhlY3V0aW9uQ29udGV4dChcbiAgICAgICAgICB0aGlzLmNvbnN0YW50VGVuc29yc18sIHRoaXMuaW5wdXRzXywgaW5wdXRzLCB0aGlzLm9wZXJhbmRSZWZzXyk7XG4gICAgICAvLyBUaGUgaW5wdXQgYW5kIGltbWVkaWF0ZSB0ZW5zb3JzIHdpbGwgYmUgY2xlYW5lZCB1cC5cbiAgICAgIHJldHVybiBjb250ZXh0LmNvbXB1dGUob3V0cHV0T3BlcmFuZHMpO1xuICAgIH0pO1xuXG4gICAgLy8gU2V0dXAgdGhlIG91dHB1dHMuXG4gICAgZm9yIChjb25zdCBvdXRwdXROYW1lIG9mIE9iamVjdC5rZXlzKG91dHB1dFRlbnNvcnMpKSB7XG4gICAgICBjb25zdCB0ZW5zb3IgPSBvdXRwdXRUZW5zb3JzW291dHB1dE5hbWVdIGFzIHRmLlRlbnNvcjtcbiAgICAgIGNvbnN0IGRlc2MgPSB1dGlscy5jcmVhdGVPcGVyYW5kRGVzY3JpcHRvckZyb21UZW5zb3IodGVuc29yKTtcbiAgICAgIGNvbnN0IHJlc291cmNlID0gb3V0cHV0c1tvdXRwdXROYW1lXSBhcyBBcnJheUJ1ZmZlclZpZXc7XG4gICAgICB1dGlscy52YWxpZGF0ZVR5cGVkQXJyYXkocmVzb3VyY2UsIGRlc2MudHlwZSwgZGVzYy5kaW1lbnNpb25zKTtcbiAgICAgIHJlc291cmNlLnNldCh0ZW5zb3IuZGF0YVN5bmMoKSk7XG4gICAgICB0Zi5kaXNwb3NlKHRlbnNvcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZUlucHV0cyhpbnB1dHM6IE1MTmFtZWRJbnB1dHMpIHtcbiAgICBmb3IgKGNvbnN0IG5hbWUgaW4gaW5wdXRzKSB7XG4gICAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgICAgdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnICYmIHRoaXMuaW5wdXRzXy5oYXMobmFtZSksXG4gICAgICAgICAgJ1RoZSBuYW1lIG9mIHRoZSBpbnB1dCBpcyBpbnZhbGlkLicpO1xuICAgICAgY29uc3QgaW5wdXRPcGVyYW5kID0gdGhpcy5pbnB1dHNfLmdldChuYW1lKTtcbiAgICAgIGxldCByZXNvdXJjZTtcbiAgICAgIGxldCBkaW1lbnNpb25zO1xuICAgICAgaWYgKChpbnB1dHNbbmFtZV0gYXMgTUxJbnB1dCkuZGltZW5zaW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gaW5wdXRzW25hbWVdIGFzIE1MSW5wdXQ7XG4gICAgICAgIHJlc291cmNlID0gaW5wdXQucmVzb3VyY2U7XG4gICAgICAgIGRpbWVuc2lvbnMgPSBpbnB1dC5kaW1lbnNpb25zO1xuICAgICAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgICAgICByZXNvdXJjZSAhPT0gdW5kZWZpbmVkLCAnVGhlIHJlc291cmNlIG9mIGlucHV0IGlzIHVuZGVmaW5lZC4nKTtcbiAgICAgICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgICAgdXRpbHMuaXNJbnRlZ2VyQXJyYXkoZGltZW5zaW9ucykgPT09IHRydWUsXG4gICAgICAgICAgICAnVGhlIHR5cGUgb2YgdGhlIGlucHV0IGRpbWVuc2lvbnMgaXMgaW52YWxpZC4nKTtcbiAgICAgICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgICAgZGltZW5zaW9ucy5sZW5ndGggPT09IGlucHV0T3BlcmFuZC5kZXNjLmRpbWVuc2lvbnMubGVuZ3RoLFxuICAgICAgICAgICAgJ1RoZSByYW5rIG9mIHRoZSBpbnB1dCBkaW1lbnNpb25zIGlzIGludmFsaWQuJyk7XG4gICAgICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgICAgICF1dGlscy5pc0R5YW5taWNTaGFwZShkaW1lbnNpb25zKSxcbiAgICAgICAgICAgICdUaGUgdmFsdWUgb2YgaW5wdXQgZGltZW5zaW9ucyBpcyBuZWdhdGl2ZS4nKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dE9wZXJhbmQuZGVzYy5kaW1lbnNpb25zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgY29uc3QgZCA9IGlucHV0T3BlcmFuZC5kZXNjLmRpbWVuc2lvbnNbaV07XG4gICAgICAgICAgaWYgKGQgPiAwKSB7XG4gICAgICAgICAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgICAgICAgICAgZCA9PT0gZGltZW5zaW9uc1tpXSxcbiAgICAgICAgICAgICAgICAnVGhlIHZhbHVlIG9mIHRoZSBpbnB1dCBkaW1lbnNpb25zIGlzIGludmFsaWQuJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvdXJjZSA9IGlucHV0c1tuYW1lXSBhcyBNTFJlc291cmNjZTtcbiAgICAgICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgICAgIXV0aWxzLmlzRHlhbm1pY1NoYXBlKGlucHV0T3BlcmFuZC5kZXNjLmRpbWVuc2lvbnMpLFxuICAgICAgICAgICAgJ1RoZSBpbnB1dCBkaW1lbnNpb25zIGlzIG5vdCBzcGVjaWZpZWQuJyk7XG4gICAgICAgIGRpbWVuc2lvbnMgPSBpbnB1dE9wZXJhbmQuZGVzYy5kaW1lbnNpb25zO1xuICAgICAgfVxuICAgICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgIHV0aWxzLmlzVHlwZWRBcnJheShyZXNvdXJjZSksXG4gICAgICAgICAgJ09ubHkgcmVzb3VyY2Ugb2YgQXJyYXlCdWZmZXJWaWV3IHR5cGUgaXMgc3VwcG9ydGVkLicpO1xuICAgICAgdXRpbHMudmFsaWRhdGVUeXBlZEFycmF5KFxuICAgICAgICAgIHJlc291cmNlIGFzIEFycmF5QnVmZmVyVmlldywgaW5wdXRPcGVyYW5kLmRlc2MudHlwZSwgZGltZW5zaW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgY29uc3RydWN0b3Iob3V0cHV0cz86IE1MTmFtZWRPcGVyYW5kcykge1xuICAgIHV0aWxzLmFzc2VydChvdXRwdXRzICE9PSB1bmRlZmluZWQsICdJbnZhbGlkIGFyZ3VtZW50Jyk7XG4gICAgZm9yIChjb25zdCBuYW1lIGluIG91dHB1dHMpIHtcbiAgICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgICB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycgJiYgb3V0cHV0c1tuYW1lXSBpbnN0YW5jZW9mIE91dHB1dE9wZXJhbmQsXG4gICAgICAgICAgJ1RoZSBvdXRwdXRzIHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgICAgdGhpcy5vdXRwdXRzXy5zZXQobmFtZSwgb3V0cHV0c1tuYW1lXSBhcyBPdXRwdXRPcGVyYW5kKTtcbiAgICB9XG4gICAgdXRpbHMuYXNzZXJ0KHRoaXMub3V0cHV0c18uc2l6ZSAhPT0gMCwgJ1RoZSBvdXRwdXRzIGlzIGVtcHR5Jyk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHN0YXRpYyBidWlsZEFuZENvbXBpbGUob3V0cHV0cz86IE1MTmFtZWRPcGVyYW5kcyk6IE1MR3JhcGgge1xuICAgIGNvbnN0IGdyYXBoID0gbmV3IE1MR3JhcGgob3V0cHV0cyk7XG4gICAgZ3JhcGguYnVpbGQoKTtcbiAgICBncmFwaC5jb21waWxlKCk7XG4gICAgcmV0dXJuIGdyYXBoO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZCgpOiB2b2lkIHtcbiAgICBjb25zdCB2aXNpdGVkT3BzOiBTZXQ8T3BlcmF0aW9uPiA9IG5ldyBTZXQoKTtcbiAgICBmb3IgKGNvbnN0IG91dHB1dCBvZiB0aGlzLm91dHB1dHNfLnZhbHVlcygpKSB7XG4gICAgICB0aGlzLmJ1aWxkT3BlcmF0aW9uKG91dHB1dC5vcGVyYXRpb24sIHZpc2l0ZWRPcHMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRPcGVyYXRpb24ob3BlcmF0aW9uOiBPcGVyYXRpb24sIHZpc2l0ZWRPcHM6IFNldDxPcGVyYXRpb24+KTpcbiAgICAgIHZvaWQge1xuICAgIGlmICh2aXNpdGVkT3BzLmhhcyhvcGVyYXRpb24pKSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIHZpc2l0ZWRPcHMuYWRkKG9wZXJhdGlvbik7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgb3BlcmFuZCBvZiBvcGVyYXRpb24uaW5wdXRzKCkpIHtcbiAgICAgIGlmICghdGhpcy5vcGVyYW5kUmVmc18uaGFzKG9wZXJhbmQpKSB7XG4gICAgICAgIHRoaXMub3BlcmFuZFJlZnNfLnNldChvcGVyYW5kLCAxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCByZWYgPSB0aGlzLm9wZXJhbmRSZWZzXy5nZXQob3BlcmFuZCk7XG4gICAgICAgIHJlZisrO1xuICAgICAgICB0aGlzLm9wZXJhbmRSZWZzXy5zZXQob3BlcmFuZCwgcmVmKTtcbiAgICAgIH1cbiAgICAgIGlmIChvcGVyYW5kIGluc3RhbmNlb2YgSW5wdXRPcGVyYW5kKSB7XG4gICAgICAgIGlmICh0aGlzLmlucHV0c18uaGFzKG9wZXJhbmQubmFtZSkpIHtcbiAgICAgICAgICBpZiAodGhpcy5pbnB1dHNfLmdldChvcGVyYW5kLm5hbWUpICE9PSBvcGVyYW5kKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBuYW1lIG9mIHRoaXMgaW5wdXQgaXMgZXhpc3RlZC4nKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5wdXRzXy5zZXQob3BlcmFuZC5uYW1lLCBvcGVyYW5kKTtcbiAgICAgIH0gZWxzZSBpZiAob3BlcmFuZCBpbnN0YW5jZW9mIENvbnN0YW50T3BlcmFuZCkge1xuICAgICAgICBpZiAoIXRoaXMuY29uc3RhbnRzXy5oYXMob3BlcmFuZCkpIHtcbiAgICAgICAgICB0aGlzLmNvbnN0YW50c18uYWRkKG9wZXJhbmQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG9wZXJhbmQgaW5zdGFuY2VvZiBPdXRwdXRPcGVyYW5kKSB7XG4gICAgICAgIHRoaXMuYnVpbGRPcGVyYXRpb24ob3BlcmFuZC5vcGVyYXRpb24sIHZpc2l0ZWRPcHMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY29tcGlsZSgpOiB2b2lkIHtcbiAgICB0aGlzLmFsbG9jYXRlQ29uc3RhbnRzKCk7XG4gICAgdGhpcy5jb21wdXRlT25jZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhbGxvY2F0ZUNvbnN0YW50cygpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGNvbnN0YW50IG9mIHRoaXMuY29uc3RhbnRzXykge1xuICAgICAgdGhpcy5jb25zdGFudFRlbnNvcnNfLnNldChcbiAgICAgICAgICBjb25zdGFudCwgdXRpbHMuY3JlYXRlVGVuc29yKGNvbnN0YW50LmRlc2MsIGNvbnN0YW50LnZhbHVlKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb21wdXRlT25jZSgpOiB2b2lkIHtcbiAgICBjb25zdCBpbnB1dHM6IE1MTmFtZWRJbnB1dHMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGlucHV0TmFtZSBvZiB0aGlzLmlucHV0c18ua2V5cygpKSB7XG4gICAgICBjb25zdCBpbnB1dE9wZXJhbmQgPSB0aGlzLmlucHV0c18uZ2V0KGlucHV0TmFtZSk7XG4gICAgICAvLyBhc3N1bWUgMSBmb3IgbmVnYXRpdmUgZGltIHZhbHVlLlxuICAgICAgY29uc3Qgc2hhcGUgPSBpbnB1dE9wZXJhbmQuZGVzYy5kaW1lbnNpb25zLm1hcCh4ID0+IHggPCAwID8gMSA6IHgpO1xuICAgICAgY29uc3QgdHlwZWRBcnJheUNvbnN0cnVjdG9yID0gdXRpbHMuZ2V0VHlwZWRBcnJheShpbnB1dE9wZXJhbmQuZGVzYy50eXBlKTtcbiAgICAgIGNvbnN0IGlucHV0QnVmZmVyID0gbmV3IHR5cGVkQXJyYXlDb25zdHJ1Y3RvcihcbiAgICAgICAgICB1dGlscy5zaXplRnJvbURpbWVuc2lvbnMoaW5wdXRPcGVyYW5kLmRlc2MuZGltZW5zaW9ucykpO1xuICAgICAgaW5wdXRzW2lucHV0TmFtZV0gPSB7cmVzb3VyY2U6IGlucHV0QnVmZmVyLCBkaW1lbnNpb25zOiBzaGFwZX0gYXMgTUxJbnB1dDtcbiAgICB9XG4gICAgY29uc3Qgb3V0cHV0VGVuc29yczogdGYuVGVuc29yQ29udGFpbmVyT2JqZWN0ID0gdGYudGlkeSgoKSA9PiB7XG4gICAgICBjb25zdCBjb250ZXh0ID0gbmV3IEV4ZWN1dGlvbkNvbnRleHQoXG4gICAgICAgICAgdGhpcy5jb25zdGFudFRlbnNvcnNfLCB0aGlzLmlucHV0c18sIGlucHV0cywgdGhpcy5vcGVyYW5kUmVmc18pO1xuICAgICAgLy8gVGhlIGlucHV0IGFuZCBpbW1lZGlhdGUgdGVuc29ycyB3aWxsIGJlIGNsZWFuZWQgdXAuXG4gICAgICByZXR1cm4gY29udGV4dC5jb21wdXRlKHRoaXMub3V0cHV0c18pO1xuICAgIH0pO1xuICAgIGZvciAoY29uc3Qgb3V0cHV0TmFtZSBvZiBPYmplY3Qua2V5cyhvdXRwdXRUZW5zb3JzKSkge1xuICAgICAgY29uc3QgdGVuc29yID0gb3V0cHV0VGVuc29yc1tvdXRwdXROYW1lXSBhcyB0Zi5UZW5zb3I7XG4gICAgICB0ZW5zb3IuZGF0YVN5bmMoKTtcbiAgICAgIHRmLmRpc3Bvc2UodGVuc29yKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICAvLyBGb3IgbWVtb3J5IGxlYWsgdGVzdGluZy5cbiAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHRlbnNvciBvZiB0aGlzLmNvbnN0YW50VGVuc29yc18udmFsdWVzKCkpIHtcbiAgICAgIHRmLmRpc3Bvc2UodGVuc29yKTtcbiAgICB9XG4gICAgY29uc3QgdmlzaXRlZE9wczogU2V0PE9wZXJhdGlvbj4gPSBuZXcgU2V0KCk7XG4gICAgZm9yIChjb25zdCBvdXRwdXQgb2YgdGhpcy5vdXRwdXRzXy52YWx1ZXMoKSkge1xuICAgICAgdGhpcy5kaXNwb3NlT3BlcmF0aW9uKG91dHB1dC5vcGVyYXRpb24sIHZpc2l0ZWRPcHMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZGlzcG9zZU9wZXJhdGlvbihvcGVyYXRpb246IE9wZXJhdGlvbiwgdmlzaXRlZE9wczogU2V0PE9wZXJhdGlvbj4pOlxuICAgICAgdm9pZCB7XG4gICAgaWYgKHZpc2l0ZWRPcHMuaGFzKG9wZXJhdGlvbikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgb3BlcmF0aW9uLmRpc3Bvc2UoKTtcbiAgICAgIHZpc2l0ZWRPcHMuYWRkKG9wZXJhdGlvbik7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgb3BlcmFuZCBvZiBvcGVyYXRpb24uaW5wdXRzKCkpIHtcbiAgICAgIGlmIChvcGVyYW5kIGluc3RhbmNlb2YgT3V0cHV0T3BlcmFuZCkge1xuICAgICAgICB0aGlzLmRpc3Bvc2VPcGVyYXRpb24ob3BlcmFuZC5vcGVyYXRpb24sIHZpc2l0ZWRPcHMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHtNTENvbnRleHR9IGZyb20gJy4vY29udGV4dCc7XG5pbXBvcnQge01MR3JhcGh9IGZyb20gJy4vZ3JhcGgnO1xuaW1wb3J0IHtDb25zdGFudE9wZXJhbmQsIElucHV0T3BlcmFuZCwgTUxPcGVyYW5kLCBNTE9wZXJhbmREZXNjcmlwdG9yLCBNTE9wZXJhbmRUeXBlfSBmcm9tICcuL29wZXJhbmQnO1xuaW1wb3J0IHtNTE9wZXJhdG9yfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge0JhdGNoTm9ybWFsaXphdGlvbn0gZnJvbSAnLi9vcHMvYmF0Y2hfbm9ybSc7XG5pbXBvcnQge0FkZCwgRGl2LCBNYXRNdWwsIE1heCwgTWluLCBNdWwsIFBvdywgU3VifSBmcm9tICcuL29wcy9iaW5hcnknO1xuaW1wb3J0IHtDbGFtcH0gZnJvbSAnLi9vcHMvY2xhbXAnO1xuaW1wb3J0IHtDb25jYXR9IGZyb20gJy4vb3BzL2NvbmNhdCc7XG5pbXBvcnQge0NvbnYyZH0gZnJvbSAnLi9vcHMvY29udjJkJztcbmltcG9ydCB7R2VtbX0gZnJvbSAnLi9vcHMvZ2VtbSc7XG5pbXBvcnQge0dydSwgR3J1Q2VsbH0gZnJvbSAnLi9vcHMvZ3J1JztcbmltcG9ydCB7SW5zdGFuY2VOb3JtYWxpemF0aW9ufSBmcm9tICcuL29wcy9pbnN0YW5jZV9ub3JtJztcbmltcG9ydCB7TGVha3lSZWx1fSBmcm9tICcuL29wcy9sZWFreV9yZWx1JztcbmltcG9ydCB7UGFkfSBmcm9tICcuL29wcy9wYWQnO1xuaW1wb3J0IHtBdmVyYWdlUG9vbDJkLCBNYXhQb29sMmR9IGZyb20gJy4vb3BzL3Bvb2wyZCc7XG5pbXBvcnQge1JlZHVjZUxvZ1N1bUV4cCwgUmVkdWNlTWF4LCBSZWR1Y2VNZWFuLCBSZWR1Y2VNaW4sIFJlZHVjZVByb2R1Y3QsIFJlZHVjZVN1bX0gZnJvbSAnLi9vcHMvcmVkdWNlJztcbmltcG9ydCB7UmVzYW1wbGV9IGZyb20gJy4vb3BzL3Jlc2FtcGxlJztcbmltcG9ydCB7UmVzaGFwZX0gZnJvbSAnLi9vcHMvcmVzaGFwZSc7XG5pbXBvcnQge1NsaWNlfSBmcm9tICcuL29wcy9zbGljZSc7XG5pbXBvcnQge1NvZnRtYXh9IGZyb20gJy4vb3BzL3NvZnRtYXgnO1xuaW1wb3J0IHtTcGxpdH0gZnJvbSAnLi9vcHMvc3BsaXQnO1xuaW1wb3J0IHtTcXVlZXplfSBmcm9tICcuL29wcy9zcXVlZXplJztcbmltcG9ydCB7VHJhbnNwb3NlfSBmcm9tICcuL29wcy90cmFuc3Bvc2UnO1xuaW1wb3J0IHtFeHAsIFJlbHUsIFNpZ21vaWQsIFRhbmh9IGZyb20gJy4vb3BzL3VuYXJ5JztcbmltcG9ydCB7QXJyYXlCdWZmZXJWaWV3fSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2VudW1kZWYtbWxpbnB1dG9wZXJhbmRsYXlvdXQpXG4gKi9cbmV4cG9ydCBlbnVtIE1MSW5wdXRPcGVyYW5kTGF5b3V0IHtcbiAgJ25jaHcnID0gJ25jaHcnLFxuICAnbmh3YycgPSAnbmh3Yydcbn1cblxuLyoqXG4gKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkaWN0ZGVmLW1sYmF0Y2hub3JtYWxpemF0aW9ub3B0aW9ucylcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNTEJhdGNoTm9ybWFsaXphdGlvbk9wdGlvbnMge1xuICBzY2FsZT86IE1MT3BlcmFuZDtcbiAgYmlhcz86IE1MT3BlcmFuZDtcbiAgYXhpcz86IG51bWJlcjtcbiAgZXBzaWxvbj86IG51bWJlcjtcbiAgYWN0aXZhdGlvbj86IE1MT3BlcmF0b3I7XG59XG5cbi8qKlxuICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZGljdGRlZi1tbGNsYW1wb3B0aW9ucylcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNTENsYW1wT3B0aW9ucyB7XG4gIG1pblZhbHVlPzogTUxPcGVyYW5kO1xuICBtYXhWYWx1ZT86IE1MT3BlcmFuZDtcbn1cblxuLyoqXG4gKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNlbnVtZGVmLW1sZmlsdGVyb3BlcmFuZGxheW91dClcbiAqL1xuZXhwb3J0IGVudW0gTUxGaWx0ZXJPcGVyYW5kTGF5b3V0IHtcbiAgJ29paHcnID0gJ29paHcnLFxuICAnaHdpbycgPSAnaHdpbycsXG4gICdvaHdpJyA9ICdvaHdpJyxcbiAgJ2lod28nID0gJ2lod28nLFxufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2VudW1kZWYtbWxhdXRvcGFkKVxuICovXG5leHBvcnQgZW51bSBNTEF1dG9QYWQge1xuICAnZXhwbGljaXQnID0gJ2V4cGxpY2l0JyxcbiAgJ3NhbWUtdXBwZXInID0gJ3NhbWUtdXBwZXInLFxuICAnc2FtZS1sb3dlcicgPSAnc2FtZS1sb3dlcicsXG59XG5cbi8qKlxuICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZGljdGRlZi1tbGNvbnYyZG9wdGlvbnMpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTUxDb252MmRPcHRpb25zIHtcbiAgcGFkZGluZz86IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICBzdHJpZGVzPzogW251bWJlciwgbnVtYmVyXTtcbiAgZGlsYXRpb25zPzogW251bWJlciwgbnVtYmVyXTtcbiAgb3V0cHV0UGFkZGluZz86IFtudW1iZXIsIG51bWJlcl07XG4gIG91dHB1dFNpemVzPzogW251bWJlciwgbnVtYmVyXTtcbiAgYXV0b1BhZD86IE1MQXV0b1BhZDtcbiAgdHJhbnNwb3NlPzogYm9vbGVhbjtcbiAgZ3JvdXBzPzogbnVtYmVyO1xuICBpbnB1dExheW91dD86IE1MSW5wdXRPcGVyYW5kTGF5b3V0O1xuICBmaWx0ZXJMYXlvdXQ/OiBNTEZpbHRlck9wZXJhbmRMYXlvdXQ7XG4gIGJpYXM/OiBNTE9wZXJhbmQ7XG4gIGFjdGl2YXRpb24/OiBNTE9wZXJhdG9yO1xufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RpY3RkZWYtbWxnZW1tb3B0aW9ucylcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNTEdlbW1PcHRpb25zIHtcbiAgYz86IE1MT3BlcmFuZDtcbiAgYWxwaGE/OiBudW1iZXI7XG4gIGJldGE/OiBudW1iZXI7XG4gIGFUcmFuc3Bvc2U/OiBib29sZWFuO1xuICBiVHJhbnNwb3NlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNlbnVtZGVmLW1scmVjdXJyZW50bmV0d29ya3dlaWdodGxheW91dClcbiAqL1xuZXhwb3J0IGVudW0gTUxSZWN1cnJlbnROZXR3b3JrV2VpZ2h0TGF5b3V0IHtcbiAgJ3pybicgPSAnenJuJyxcbiAgJ3J6bicgPSAncnpuJyxcbn1cblxuLyoqXG4gKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNlbnVtZGVmLW1scmVjdXJyZW50bmV0d29ya2RpcmVjdGlvbilcbiAqL1xuZXhwb3J0IGVudW0gTUxSZWN1cnJlbnROZXR3b3JrRGlyZWN0aW9uIHtcbiAgJ2ZvcndhcmQnID0gJ2ZvcndhcmQnLFxuICAnYmFja3dhcmQnID0gJ2JhY2t3YXJkJyxcbiAgJ2JvdGgnID0gJ2JvdGgnLFxufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RpY3RkZWYtbWxncnVvcHRpb25zKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1MR3J1T3B0aW9ucyB7XG4gIGJpYXM/OiBNTE9wZXJhbmQ7XG4gIHJlY3VycmVudEJpYXM/OiBNTE9wZXJhbmQ7XG4gIGluaXRpYWxIaWRkZW5TdGF0ZT86IE1MT3BlcmFuZDtcbiAgcmVzZXRBZnRlcj86IGJvb2xlYW47XG4gIHJldHVyblNlcXVlbmNlPzogYm9vbGVhbjtcbiAgZGlyZWN0aW9uPzogTUxSZWN1cnJlbnROZXR3b3JrRGlyZWN0aW9uO1xuICBsYXlvdXQ/OiBNTFJlY3VycmVudE5ldHdvcmtXZWlnaHRMYXlvdXQ7XG4gIGFjdGl2YXRpb25zPzogTUxPcGVyYXRvcltdO1xufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RpY3RkZWYtbWxncnVjZWxsb3B0aW9ucylcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNTEdydUNlbGxPcHRpb25zIHtcbiAgYmlhcz86IE1MT3BlcmFuZDtcbiAgcmVjdXJyZW50Qmlhcz86IE1MT3BlcmFuZDtcbiAgcmVzZXRBZnRlcj86IGJvb2xlYW47XG4gIGxheW91dD86IE1MUmVjdXJyZW50TmV0d29ya1dlaWdodExheW91dDtcbiAgYWN0aXZhdGlvbnM/OiBNTE9wZXJhdG9yW107XG59XG5cbi8qKlxuICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZGljdGRlZi1tbGluc3RhbmNlbm9ybWFsaXphdGlvbm9wdGlvbnMpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTUxJbnN0YW5jZU5vcm1hbGl6YXRpb25PcHRpb25zIHtcbiAgc2NhbGU/OiBNTE9wZXJhbmQ7XG4gIGJpYXM/OiBNTE9wZXJhbmQ7XG4gIGVwc2lsb24/OiBudW1iZXI7XG4gIGxheW91dD86IE1MSW5wdXRPcGVyYW5kTGF5b3V0O1xufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RpY3RkZWYtbWxsZWFreXJlbHVvcHRpb25zKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1MTGVha3lSZWx1T3B0aW9ucyB7XG4gIGFscGhhPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2VudW1kZWYtbWxwYWRkaW5nbW9kZSlcbiAqL1xuZXhwb3J0IGVudW0gTUxQYWRkaW5nTW9kZSB7XG4gICdjb25zdGFudCcgPSAnY29uc3RhbnQnLFxuICAnZWRnZScgPSAnZWRnZScsXG4gICdyZWZsZWN0aW9uJyA9ICdyZWZsZWN0aW9uJyxcbiAgJ3N5bW1ldHJpYycgPSAnc3ltbWV0cmljJ1xufVxuXG4vKipcbiAqIFtzcGVjXShoaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkaWN0ZGVmLW1scGFkb3B0aW9ucylcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNTFBhZE9wdGlvbnMge1xuICBtb2RlPzogTUxQYWRkaW5nTW9kZTtcbiAgdmFsdWU/OiBudW1iZXI7XG59XG5cbi8qKlxuICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZGljdGRlZi1tbHBvb2wyZG9wdGlvbnMpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTUxQb29saW5nMmRPcHRpb25zIHtcbiAgd2luZG93RGltZW5zaW9ucz86IFtudW1iZXIsIG51bWJlcl07XG4gIHBhZGRpbmc/OiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgc3RyaWRlcz86IFtudW1iZXIsIG51bWJlcl07XG4gIGRpbGF0aW9ucz86IFtudW1iZXIsIG51bWJlcl07XG4gIGF1dG9QYWQ/OiBNTEF1dG9QYWQ7XG4gIGxheW91dD86IE1MSW5wdXRPcGVyYW5kTGF5b3V0O1xufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RpY3RkZWYtbWxyZWR1Y2VvcHRpb25zKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1MUmVkdWNlT3B0aW9ucyB7XG4gIGF4ZXM/OiBudW1iZXJbXTtcbiAga2VlcERpbWVuc2lvbnM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2VudW1kZWYtbWxpbnRlcnBvbGF0aW9ubW9kZSlcbiAqL1xuZXhwb3J0IGVudW0gTUxJbnRlcnBvbGF0aW9uTW9kZSB7XG4gICduZWFyZXN0LW5laWdoYm9yJyA9ICduZWFyZXN0LW5laWdoYm9yJyxcbiAgJ2xpbmVhcicgPSAnbGluZWFyJ1xufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RpY3RkZWYtbWxyZXNhbXBsZW9wdGlvbnMpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTUxSZXNhbXBsZU9wdGlvbnMge1xuICBtb2RlPzogTUxJbnRlcnBvbGF0aW9uTW9kZTtcbiAgc2NhbGVzPzogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG4gIHNpemVzPzogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG59XG5cbi8qKlxuICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZGljdGRlZi1tbHNsaWNlb3B0aW9ucylcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNTFNsaWNlT3B0aW9ucyB7XG4gIGF4ZXM/OiBudW1iZXJbXTtcbn1cblxuLyoqXG4gKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkaWN0ZGVmLW1sc3BsaXRvcHRpb25zKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1MU3BsaXRPcHRpb25zIHtcbiAgYXhpcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkaWN0ZGVmLW1sc3F1ZWV6ZW9wdGlvbnMpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTUxTcXVlZXplT3B0aW9ucyB7XG4gIGF4ZXM/OiBudW1iZXJbXTtcbn1cblxuLyoqXG4gKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkaWN0ZGVmLW1sdHJhbnNwb3Nlb3B0aW9ucylcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNTFRyYW5zcG9zZU9wdGlvbnMge1xuICBwZXJtdXRhdGlvbj86IG51bWJlcltdO1xufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI3R5cGVkZWZkZWYtbWxuYW1lZG9wZXJhbmRzKVxuICovXG5leHBvcnQgdHlwZSBNTE5hbWVkT3BlcmFuZHMgPSBSZWNvcmQ8c3RyaW5nLCBNTE9wZXJhbmQ+O1xuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RpY3RkZWYtbWxidWZmZXJyZXNvdXJjZXZpZXcpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTUxCdWZmZXJSZXNvdXJjZVZpZXcge1xuICByZXNvdXJjZTogV2ViR0xCdWZmZXI7XG4gIG9mZnNldD86IG51bWJlcjtcbiAgc2l6ZT86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyN0eXBlZGVmZGVmLW1sYnVmZmVydmlldylcbiAqL1xuZXhwb3J0IHR5cGUgTUxCdWZmZXJWaWV3ID0gQXJyYXlCdWZmZXJWaWV3fE1MQnVmZmVyUmVzb3VyY2VWaWV3O1xuXG4vKipcbiAqIFtzcGVjXShoaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNhcGktbWxncmFwaGJ1aWxkZXIpXG4gKi9cbmV4cG9ydCBjbGFzcyBNTEdyYXBoQnVpbGRlciB7XG4gIHByaXZhdGUgY29udGV4dF86IE1MQ29udGV4dDtcblxuICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBNTENvbnRleHQpIHtcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIGNvbnRleHQgaW5zdGFuY2VvZiBNTENvbnRleHQsICdUaGUgY29udGV4dCBwYXJhbXRlciBpcyBpbnZhbGlkLicpO1xuICAgIHRoaXMuY29udGV4dF8gPSBjb250ZXh0O1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXQgY29udGV4dCgpOiBNTENvbnRleHQge1xuICAgIHJldHVybiB0aGlzLmNvbnRleHRfO1xuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1idWlsZClcbiAgICovXG4gIGJ1aWxkKG91dHB1dHM6IE1MTmFtZWRPcGVyYW5kcyk6IE1MR3JhcGgge1xuICAgIHJldHVybiBNTEdyYXBoLmJ1aWxkQW5kQ29tcGlsZShvdXRwdXRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItaW5wdXQpXG4gICAqL1xuICBpbnB1dChuYW1lOiBzdHJpbmcsIGRlc2M6IE1MT3BlcmFuZERlc2NyaXB0b3IpOiBNTE9wZXJhbmQge1xuICAgIHJldHVybiBuZXcgSW5wdXRPcGVyYW5kKG5hbWUsIGRlc2MsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1jb25zdGFudClcbiAgICovXG4gIGNvbnN0YW50KGRlc2M6IE1MT3BlcmFuZERlc2NyaXB0b3IsIGJ1ZmZlclZpZXc6IE1MQnVmZmVyVmlldyk6IE1MT3BlcmFuZDtcbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1jb25zdGFudC12YWx1ZS10eXBlKVxuICAgKi9cbiAgY29uc3RhbnQodmFsdWU6IG51bWJlciwgdHlwZT86IE1MT3BlcmFuZFR5cGUpOiBNTE9wZXJhbmQ7XG4gIGNvbnN0YW50KFxuICAgICAgZGVzY09yVmFsdWU6IE1MT3BlcmFuZERlc2NyaXB0b3J8bnVtYmVyLFxuICAgICAgdmFsdWVPclR5cGU6IE1MQnVmZmVyVmlld3xNTE9wZXJhbmRUeXBlKTogQ29uc3RhbnRPcGVyYW5kIHtcbiAgICBpZiAodHlwZW9mIGRlc2NPclZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgaWYgKHZhbHVlT3JUeXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFsdWVPclR5cGUgPSBNTE9wZXJhbmRUeXBlLmZsb2F0MzI7XG4gICAgICB9XG4gICAgICByZXR1cm4gQ29uc3RhbnRPcGVyYW5kLmNyZWF0ZVNjYWxhcihcbiAgICAgICAgICBkZXNjT3JWYWx1ZSwgdmFsdWVPclR5cGUgYXMgTUxPcGVyYW5kVHlwZSwgdGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBDb25zdGFudE9wZXJhbmQuY3JlYXRlVGVuc29yKFxuICAgICAgICAgIGRlc2NPclZhbHVlLCB2YWx1ZU9yVHlwZSBhcyBNTEJ1ZmZlclZpZXcsIHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItYmF0Y2hub3JtYWxpemF0aW9uKVxuICAgKi9cbiAgYmF0Y2hOb3JtYWxpemF0aW9uKFxuICAgICAgaW5wdXQ6IE1MT3BlcmFuZCwgbWVhbjogTUxPcGVyYW5kLCB2YXJpYW5jZTogTUxPcGVyYW5kLFxuICAgICAgb3B0aW9uczogTUxCYXRjaE5vcm1hbGl6YXRpb25PcHRpb25zID0ge30pOiBNTE9wZXJhbmQge1xuICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihcbiAgICAgICAgW2lucHV0LCBtZWFuLCB2YXJpYW5jZSwgb3B0aW9ucy5zY2FsZSwgb3B0aW9ucy5iaWFzXSk7XG4gICAgcmV0dXJuIChuZXcgQmF0Y2hOb3JtYWxpemF0aW9uKGlucHV0LCBtZWFuLCB2YXJpYW5jZSwgb3B0aW9ucykpXG4gICAgICAgIC5nZXRGdXNlZE91dHB1dHMoKVswXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItY2xhbXApXG4gICAqL1xuICBjbGFtcCh4OiBNTE9wZXJhbmQsIG9wdGlvbnM6IE1MQ2xhbXBPcHRpb25zKTogTUxPcGVyYW5kO1xuICBjbGFtcChvcHRpb25zOiBNTENsYW1wT3B0aW9ucyk6IE1MT3BlcmF0b3I7XG4gIGNsYW1wKFxuICAgICAgb3BlcmFuZE9yT3B0aW9uczogTUxPcGVyYW5kfE1MQ2xhbXBPcHRpb25zID0ge30sXG4gICAgICBvcHRpb25zOiBNTENsYW1wT3B0aW9ucyA9IHt9KTogTUxPcGVyYW5kfE1MT3BlcmF0b3Ige1xuICAgIGlmIChvcGVyYW5kT3JPcHRpb25zIGluc3RhbmNlb2YgTUxPcGVyYW5kKSB7XG4gICAgICBjb25zdCB4ID0gb3BlcmFuZE9yT3B0aW9ucztcbiAgICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihbeCwgb3B0aW9ucy5taW5WYWx1ZSwgb3B0aW9ucy5tYXhWYWx1ZV0pO1xuICAgICAgcmV0dXJuIChuZXcgQ2xhbXAoeCwgb3B0aW9ucykpLm91dHB1dDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IG9wZXJhbmRPck9wdGlvbnM7XG4gICAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW29wdGlvbnMubWluVmFsdWUsIG9wdGlvbnMubWF4VmFsdWVdKTtcbiAgICAgIHJldHVybiAobmV3IENsYW1wKHVuZGVmaW5lZCwgb3B0aW9ucykpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItY29uY2F0KVxuICAgKi9cbiAgY29uY2F0KGlucHV0czogTUxPcGVyYW5kW10sIGF4aXM6IG51bWJlcik6IE1MT3BlcmFuZCB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKGlucHV0cyk7XG4gICAgcmV0dXJuIChuZXcgQ29uY2F0KGlucHV0cywgYXhpcykpLm91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItY29udjJkKVxuICAgKi9cbiAgY29udjJkKGlucHV0OiBNTE9wZXJhbmQsIGZpbHRlcjogTUxPcGVyYW5kLCBvcHRpb25zOiBNTENvbnYyZE9wdGlvbnMgPSB7fSk6XG4gICAgICBNTE9wZXJhbmQge1xuICAgIGNvbnN0IGlucHV0cyA9IFtpbnB1dCwgZmlsdGVyXTtcbiAgICBpZiAob3B0aW9ucy5iaWFzKSB7XG4gICAgICBpbnB1dHMucHVzaChvcHRpb25zLmJpYXMpO1xuICAgIH1cbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoaW5wdXRzKTtcbiAgICByZXR1cm4gKG5ldyBDb252MmQoaW5wdXQsIGZpbHRlciwgb3B0aW9ucykpLmdldEZ1c2VkT3V0cHV0cygpWzBdO1xuICB9XG5cbiAgLy8gc3RhcnQgb2YgZWxlbWVudC13aXNlIGJpbmFyeSBvcGVyYXRpb25zXG4gIC8vIGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jYXBpLW1sZ3JhcGhidWlsZGVyLWJpbmFyeVxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLWFkZClcbiAgICovXG4gIGFkZChhOiBNTE9wZXJhbmQsIGI6IE1MT3BlcmFuZCk6IE1MT3BlcmFuZCB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFthLCBiXSk7XG4gICAgcmV0dXJuIChuZXcgQWRkKGEsIGIpKS5vdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLXN1YilcbiAgICovXG4gIHN1YihhOiBNTE9wZXJhbmQsIGI6IE1MT3BlcmFuZCk6IE1MT3BlcmFuZCB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFthLCBiXSk7XG4gICAgcmV0dXJuIChuZXcgU3ViKGEsIGIpKS5vdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLW11bClcbiAgICovXG4gIG11bChhOiBNTE9wZXJhbmQsIGI6IE1MT3BlcmFuZCk6IE1MT3BlcmFuZCB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFthLCBiXSk7XG4gICAgcmV0dXJuIChuZXcgTXVsKGEsIGIpKS5vdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLWRpdilcbiAgICovXG4gIGRpdihhOiBNTE9wZXJhbmQsIGI6IE1MT3BlcmFuZCk6IE1MT3BlcmFuZCB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFthLCBiXSk7XG4gICAgcmV0dXJuIChuZXcgRGl2KGEsIGIpKS5vdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLW1heClcbiAgICovXG4gIG1heChhOiBNTE9wZXJhbmQsIGI6IE1MT3BlcmFuZCk6IE1MT3BlcmFuZCB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFthLCBiXSk7XG4gICAgcmV0dXJuIChuZXcgTWF4KGEsIGIpKS5vdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLW1pbilcbiAgICovXG4gIG1pbihhOiBNTE9wZXJhbmQsIGI6IE1MT3BlcmFuZCk6IE1MT3BlcmFuZCB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFthLCBiXSk7XG4gICAgcmV0dXJuIChuZXcgTWluKGEsIGIpKS5vdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLXBvdylcbiAgICpcbiAgICovXG4gIHBvdyhhOiBNTE9wZXJhbmQsIGI6IE1MT3BlcmFuZCk6IE1MT3BlcmFuZCB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFthLCBiXSk7XG4gICAgcmV0dXJuIChuZXcgUG93KGEsIGIpKS5vdXRwdXQ7XG4gIH1cbiAgLy8gZW5kIG9mIGVsZW1lbnQtd2lzZSBiaW5hcnkgb3BlcmF0aW9uc1xuXG4gIC8vIHN0YXJ0IG9mIGVsZW1lbnQtd2lzZSB1bmFyeSBvcGVyYXRpb25zXG4gIC8vIGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLXVuYXJ5XG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItZXhwKVxuICAgKi9cbiAgZXhwKHg6IE1MT3BlcmFuZCk6IE1MT3BlcmFuZCB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFt4XSk7XG4gICAgcmV0dXJuIChuZXcgRXhwKHgpKS5vdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLXJlbHUpXG4gICAqL1xuICByZWx1KGlucHV0OiBNTE9wZXJhbmQpOiBNTE9wZXJhbmQ7XG4gIHJlbHUoKTogTUxPcGVyYXRvcjtcbiAgcmVsdShpbnB1dDogTUxPcGVyYW5kID0gdW5kZWZpbmVkKTogTUxPcGVyYW5kfE1MT3BlcmF0b3Ige1xuICAgIGlmIChpbnB1dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbmV3IFJlbHUodW5kZWZpbmVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFtpbnB1dF0pO1xuICAgICAgcmV0dXJuIChuZXcgUmVsdShpbnB1dCkpLm91dHB1dDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLXNpZ21vaWQpXG4gICAqL1xuICBzaWdtb2lkKGlucHV0OiBNTE9wZXJhbmQpOiBNTE9wZXJhbmQ7XG4gIHNpZ21vaWQoKTogTUxPcGVyYXRvcjtcbiAgc2lnbW9pZChpbnB1dDogTUxPcGVyYW5kID0gdW5kZWZpbmVkKTogTUxPcGVyYW5kfE1MT3BlcmF0b3Ige1xuICAgIGlmIChpbnB1dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbmV3IFNpZ21vaWQodW5kZWZpbmVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFtpbnB1dF0pO1xuICAgICAgcmV0dXJuIChuZXcgU2lnbW9pZChpbnB1dCkpLm91dHB1dDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLXRhbmgpXG4gICAqL1xuICB0YW5oKGlucHV0OiBNTE9wZXJhbmQpOiBNTE9wZXJhbmQ7XG4gIHRhbmgoKTogTUxPcGVyYXRvcjtcbiAgdGFuaChpbnB1dDogTUxPcGVyYW5kID0gdW5kZWZpbmVkKTogTUxPcGVyYW5kfE1MT3BlcmF0b3Ige1xuICAgIGlmIChpbnB1dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbmV3IFRhbmgodW5kZWZpbmVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFtpbnB1dF0pO1xuICAgICAgcmV0dXJuIChuZXcgVGFuaChpbnB1dCkpLm91dHB1dDtcbiAgICB9XG4gIH1cbiAgLy8gZW5kIG9mIGVsZW1lbnQtd2lzZSB1bmFyeSBvcGVyYXRpb25zXG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1nZW1tKVxuICAgKi9cbiAgZ2VtbShhOiBNTE9wZXJhbmQsIGI6IE1MT3BlcmFuZCwgb3B0aW9uczogTUxHZW1tT3B0aW9ucyA9IHt9KTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW2EsIGIsIG9wdGlvbnMuY10pO1xuICAgIHJldHVybiBHZW1tLmJ1aWxkKHRoaXMsIGEsIGIsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1ncnUpXG4gICAqL1xuICBncnUoaW5wdXQ6IE1MT3BlcmFuZCwgd2VpZ2h0OiBNTE9wZXJhbmQsIHJlY3VycmVudFdlaWdodDogTUxPcGVyYW5kLFxuICAgICAgc3RlcHM6IG51bWJlciwgaGlkZGVuU2l6ZTogbnVtYmVyLFxuICAgICAgb3B0aW9uczogTUxHcnVPcHRpb25zID0ge30pOiBNTE9wZXJhbmRbXSB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFtcbiAgICAgIGlucHV0LCB3ZWlnaHQsIHJlY3VycmVudFdlaWdodCwgb3B0aW9ucy5iaWFzLCBvcHRpb25zLnJlY3VycmVudEJpYXMsXG4gICAgICBvcHRpb25zLmluaXRpYWxIaWRkZW5TdGF0ZVxuICAgIF0pO1xuICAgIHJldHVybiAobmV3IEdydShpbnB1dCwgd2VpZ2h0LCByZWN1cnJlbnRXZWlnaHQsIHN0ZXBzLCBoaWRkZW5TaXplLCBvcHRpb25zKSlcbiAgICAgICAgLm91dHB1dHM7XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLWdydWNlbGwpXG4gICAqL1xuICBncnVDZWxsKFxuICAgICAgaW5wdXQ6IE1MT3BlcmFuZCwgd2VpZ2h0OiBNTE9wZXJhbmQsIHJlY3VycmVudFdlaWdodDogTUxPcGVyYW5kLFxuICAgICAgaGlkZGVuU3RhdGU6IE1MT3BlcmFuZCwgaGlkZGVuU2l6ZTogbnVtYmVyLFxuICAgICAgb3B0aW9uczogTUxHcnVDZWxsT3B0aW9ucyA9IHt9KTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW1xuICAgICAgaW5wdXQsIHdlaWdodCwgcmVjdXJyZW50V2VpZ2h0LCBoaWRkZW5TdGF0ZSwgb3B0aW9ucy5iaWFzLFxuICAgICAgb3B0aW9ucy5yZWN1cnJlbnRCaWFzXG4gICAgXSk7XG4gICAgcmV0dXJuIChuZXcgR3J1Q2VsbChcbiAgICAgICAgICAgICAgICBpbnB1dCwgd2VpZ2h0LCByZWN1cnJlbnRXZWlnaHQsIGhpZGRlblN0YXRlLCBoaWRkZW5TaXplLFxuICAgICAgICAgICAgICAgIG9wdGlvbnMpKVxuICAgICAgICAub3V0cHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2FwaS1tbGdyYXBoYnVpbGRlci1pbnN0YW5jZW5vcm0pXG4gICAqL1xuICBpbnN0YW5jZU5vcm1hbGl6YXRpb24oXG4gICAgICBpbnB1dDogTUxPcGVyYW5kLFxuICAgICAgb3B0aW9uczogTUxJbnN0YW5jZU5vcm1hbGl6YXRpb25PcHRpb25zID0ge30pOiBNTE9wZXJhbmQge1xuICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihbaW5wdXQsIG9wdGlvbnMuYmlhcywgb3B0aW9ucy5zY2FsZV0pO1xuICAgIHJldHVybiAobmV3IEluc3RhbmNlTm9ybWFsaXphdGlvbihpbnB1dCwgb3B0aW9ucykpLm91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItbGVha3lyZWx1KVxuICAgKi9cbiAgbGVha3lSZWx1KHg6IE1MT3BlcmFuZCwgb3B0aW9uczogTUxMZWFreVJlbHVPcHRpb25zKTogTUxPcGVyYW5kO1xuICBsZWFreVJlbHUob3B0aW9uczogTUxMZWFreVJlbHVPcHRpb25zKTogTUxPcGVyYXRvcjtcbiAgbGVha3lSZWx1KFxuICAgICAgb3BlcmFuZE9yT3B0aW9uczogTUxPcGVyYW5kfE1MTGVha3lSZWx1T3B0aW9ucyA9IHt9LFxuICAgICAgb3B0aW9uczogTUxMZWFreVJlbHVPcHRpb25zID0ge30pOiBNTE9wZXJhbmR8TUxPcGVyYXRvciB7XG4gICAgaWYgKG9wZXJhbmRPck9wdGlvbnMgaW5zdGFuY2VvZiBNTE9wZXJhbmQpIHtcbiAgICAgIGNvbnN0IHggPSBvcGVyYW5kT3JPcHRpb25zO1xuICAgICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFt4XSk7XG4gICAgICByZXR1cm4gKG5ldyBMZWFreVJlbHUoeCwgb3B0aW9ucy5hbHBoYSkpLm91dHB1dDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IG9wZXJhbmRPck9wdGlvbnM7XG4gICAgICByZXR1cm4gKG5ldyBMZWFreVJlbHUodW5kZWZpbmVkLCBvcHRpb25zLmFscGhhKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1tYXRtdWwpXG4gICAqL1xuICBtYXRtdWwoYTogTUxPcGVyYW5kLCBiOiBNTE9wZXJhbmQpOiBNTE9wZXJhbmQge1xuICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihbYSwgYl0pO1xuICAgIHJldHVybiAobmV3IE1hdE11bChhLCBiKSkub3V0cHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2FwaS1tbGdyYXBoYnVpbGRlci1wYWQpXG4gICAqL1xuICBwYWQoaW5wdXQ6IE1MT3BlcmFuZCwgcGFkZGluZzogTUxPcGVyYW5kLFxuICAgICAgb3B0aW9uczogTUxQYWRPcHRpb25zID0ge30pOiBNTE9wZXJhbmQge1xuICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihbaW5wdXQsIHBhZGRpbmddKTtcbiAgICByZXR1cm4gKG5ldyBQYWQoaW5wdXQsIHBhZGRpbmcsIG9wdGlvbnMpKS5vdXRwdXQ7XG4gIH1cblxuICAvLyBzdGFydCBvZiBwb29saW5nIG9wZXJhdGlvbnNcbiAgLy8gaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItcG9vbDJkXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItYXZlcmFnZXBvb2wyZClcbiAgICovXG4gIGF2ZXJhZ2VQb29sMmQoaW5wdXQ6IE1MT3BlcmFuZCwgb3B0aW9uczogTUxQb29saW5nMmRPcHRpb25zID0ge30pOiBNTE9wZXJhbmQge1xuICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihbaW5wdXRdKTtcbiAgICByZXR1cm4gKG5ldyBBdmVyYWdlUG9vbDJkKGlucHV0LCBvcHRpb25zKSkub3V0cHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1tYXhwb29sMmQpXG4gICAqL1xuICBtYXhQb29sMmQoaW5wdXQ6IE1MT3BlcmFuZCwgb3B0aW9uczogTUxQb29saW5nMmRPcHRpb25zID0ge30pOiBNTE9wZXJhbmQge1xuICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihbaW5wdXRdKTtcbiAgICByZXR1cm4gKG5ldyBNYXhQb29sMmQoaW5wdXQsIG9wdGlvbnMpKS5vdXRwdXQ7XG4gIH1cbiAgLy8gZW5kIG9mIHBvb2xpbmcgb3BlcmF0aW9uc1xuXG4gIC8vIHN0YXJ0IG9mIHJlZHVjdGlvbiBvcGVyYXRpb25zXG4gIC8vIGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jYXBpLW1sZ3JhcGhidWlsZGVyLXJlZHVjZVxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLXJlZHVjZWxvZ3N1bWV4cClcbiAgICovXG4gIHJlZHVjZUxvZ1N1bUV4cChpbnB1dDogTUxPcGVyYW5kLCBvcHRpb25zOiBNTFJlZHVjZU9wdGlvbnMgPSB7fSk6IE1MT3BlcmFuZCB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFtpbnB1dF0pO1xuICAgIHJldHVybiAobmV3IFJlZHVjZUxvZ1N1bUV4cChpbnB1dCwgb3B0aW9ucykpLm91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItcmVkdWNlbWF4KVxuICAgKi9cbiAgcmVkdWNlTWF4KGlucHV0OiBNTE9wZXJhbmQsIG9wdGlvbnM6IE1MUmVkdWNlT3B0aW9ucyA9IHt9KTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW2lucHV0XSk7XG4gICAgcmV0dXJuIChuZXcgUmVkdWNlTWF4KGlucHV0LCBvcHRpb25zKSkub3V0cHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1yZWR1Y2VtZWFuKVxuICAgKi9cbiAgcmVkdWNlTWVhbihpbnB1dDogTUxPcGVyYW5kLCBvcHRpb25zOiBNTFJlZHVjZU9wdGlvbnMgPSB7fSk6IE1MT3BlcmFuZCB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFtpbnB1dF0pO1xuICAgIHJldHVybiAobmV3IFJlZHVjZU1lYW4oaW5wdXQsIG9wdGlvbnMpKS5vdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLXJlZHVjZW1pbilcbiAgICovXG4gIHJlZHVjZU1pbihpbnB1dDogTUxPcGVyYW5kLCBvcHRpb25zOiBNTFJlZHVjZU9wdGlvbnMgPSB7fSk6IE1MT3BlcmFuZCB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFtpbnB1dF0pO1xuICAgIHJldHVybiAobmV3IFJlZHVjZU1pbihpbnB1dCwgb3B0aW9ucykpLm91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItcmVkdWNlcHJvZHVjdClcbiAgICovXG4gIHJlZHVjZVByb2R1Y3QoaW5wdXQ6IE1MT3BlcmFuZCwgb3B0aW9uczogTUxSZWR1Y2VPcHRpb25zID0ge30pOiBNTE9wZXJhbmQge1xuICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihbaW5wdXRdKTtcbiAgICByZXR1cm4gKG5ldyBSZWR1Y2VQcm9kdWN0KGlucHV0LCBvcHRpb25zKSkub3V0cHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1yZWR1Y2VzdW0pXG4gICAqL1xuICByZWR1Y2VTdW0oaW5wdXQ6IE1MT3BlcmFuZCwgb3B0aW9uczogTUxSZWR1Y2VPcHRpb25zID0ge30pOiBNTE9wZXJhbmQge1xuICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihbaW5wdXRdKTtcbiAgICByZXR1cm4gKG5ldyBSZWR1Y2VTdW0oaW5wdXQsIG9wdGlvbnMpKS5vdXRwdXQ7XG4gIH1cbiAgLy8gZW5kIG9mIHJlZHVjdGlvbiBvcGVyYXRpb25zXG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2FwaS1tbGdyYXBoYnVpbGRlci1yZXNhbXBsZSlcbiAgICovXG4gIHJlc2FtcGxlKGlucHV0OiBNTE9wZXJhbmQsIG9wdGlvbnM6IE1MUmVzYW1wbGVPcHRpb25zID0ge30pOiBNTE9wZXJhbmQge1xuICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihbaW5wdXRdKTtcbiAgICByZXR1cm4gKG5ldyBSZXNhbXBsZShpbnB1dCwgb3B0aW9ucykpLm91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItcmVzaGFwZSlcbiAgICovXG4gIHJlc2hhcGUoaW5wdXQ6IE1MT3BlcmFuZCwgbmV3U2hhcGU6IG51bWJlcltdKTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW2lucHV0XSk7XG4gICAgcmV0dXJuIChuZXcgUmVzaGFwZShpbnB1dCwgbmV3U2hhcGUpKS5vdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLXNsaWNlKVxuICAgKi9cbiAgc2xpY2UoXG4gICAgICBpbnB1dDogTUxPcGVyYW5kLCBzdGFydHM6IG51bWJlcltdLCBzaXplczogbnVtYmVyW10sXG4gICAgICBvcHRpb25zOiBNTFNsaWNlT3B0aW9ucyA9IHt9KTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW2lucHV0XSk7XG4gICAgcmV0dXJuIChuZXcgU2xpY2UoaW5wdXQsIHN0YXJ0cywgc2l6ZXMsIG9wdGlvbnMuYXhlcykpLm91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItc29mdG1heClcbiAgICovXG4gIHNvZnRtYXgoeDogTUxPcGVyYW5kKTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW3hdKTtcbiAgICByZXR1cm4gKG5ldyBTb2Z0bWF4KHgpKS5vdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLXNwbGl0KVxuICAgKi9cbiAgc3BsaXQoXG4gICAgICBpbnB1dDogTUxPcGVyYW5kLCBzcGxpdHM6IG51bWJlcnxudW1iZXJbXSxcbiAgICAgIG9wdGlvbnM6IE1MU3BsaXRPcHRpb25zID0ge30pOiBNTE9wZXJhbmRbXSB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFtpbnB1dF0pO1xuICAgIHJldHVybiAobmV3IFNwbGl0KGlucHV0LCBzcGxpdHMsIG9wdGlvbnMpKS5vdXRwdXRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1zcXVlZXplKVxuICAgKi9cbiAgc3F1ZWV6ZShpbnB1dDogTUxPcGVyYW5kLCBvcHRpb25zOiBNTFNxdWVlemVPcHRpb25zID0ge30pOiBNTE9wZXJhbmQge1xuICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihbaW5wdXRdKTtcbiAgICByZXR1cm4gKG5ldyBTcXVlZXplKGlucHV0LCBvcHRpb25zLmF4ZXMpKS5vdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLXRyYW5zcG9zZSlcbiAgICovXG4gIHRyYW5zcG9zZShpbnB1dDogTUxPcGVyYW5kLCBvcHRpb25zOiBNTFRyYW5zcG9zZU9wdGlvbnMgPSB7fSk6IE1MT3BlcmFuZCB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFtpbnB1dF0pO1xuICAgIHJldHVybiAobmV3IFRyYW5zcG9zZShpbnB1dCwgb3B0aW9ucy5wZXJtdXRhdGlvbikpLm91dHB1dDtcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVPcGVyYW5kQnVpbGRlcihvcGVyYW5kczogTUxPcGVyYW5kW10pIHtcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIG9wZXJhbmRzLmV2ZXJ5KFxuICAgICAgICAgICAgb3BlcmFuZCA9PiBvcGVyYW5kID9cbiAgICAgICAgICAgICAgICAob3BlcmFuZCBpbnN0YW5jZW9mIE1MT3BlcmFuZCAmJiBvcGVyYW5kLmJ1aWxkZXIgPT09IHRoaXMpIDpcbiAgICAgICAgICAgICAgICB0cnVlKSxcbiAgICAgICAgJ1RoZSBvcGVyYW5kIGlzIG5vdCBidWlsdCBieSB0aGlzIGJ1aWxkZXIuJyk7XG4gIH1cbn1cbiIsImltcG9ydCB7TUxCdWZmZXJWaWV3LCBNTEdyYXBoQnVpbGRlcn0gZnJvbSAnLi9ncmFwaF9idWlsZGVyJztcbmltcG9ydCB7T3BlcmF0aW9ufSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge0FycmF5QnVmZmVyVmlld30gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNlbnVtZGVmLW1sb3BlcmFuZHR5cGUpXG4gKi9cbmV4cG9ydCBlbnVtIE1MT3BlcmFuZFR5cGUge1xuICAnZmxvYXQzMicgPSAnZmxvYXQzMicsXG4gICdmbG9hdDE2JyA9ICdmbG9hdDE2JyxcbiAgJ2ludDMyJyA9ICdpbnQzMicsXG4gICd1aW50MzInID0gJ3VpbnQzMicsXG4gICdpbnQ4JyA9ICdpbnQ4JyxcbiAgJ3VpbnQ4JyA9ICd1aW50OCdcbn1cblxuLyoqXG4gKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkaWN0ZGVmLW1sb3BlcmFuZGRlc2NyaXB0b3IpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTUxPcGVyYW5kRGVzY3JpcHRvciB7XG4gIHR5cGU6IE1MT3BlcmFuZFR5cGU7XG4gIGRpbWVuc2lvbnM6IG51bWJlcltdO1xufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2FwaS1tbG9wZXJhbmQpXG4gKi9cbmV4cG9ydCBjbGFzcyBNTE9wZXJhbmQge1xuICBwcml2YXRlIHJlYWRvbmx5IGJ1aWxkZXJfOiBNTEdyYXBoQnVpbGRlcjtcblxuICAvKiogQGludGVybmFsICovXG4gIGdldCBidWlsZGVyKCk6IE1MR3JhcGhCdWlsZGVyIHtcbiAgICByZXR1cm4gdGhpcy5idWlsZGVyXztcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgY29uc3RydWN0b3IoYnVpbGRlcjogTUxHcmFwaEJ1aWxkZXIpIHtcbiAgICB0aGlzLmJ1aWxkZXJfID0gYnVpbGRlcjtcbiAgfVxufVxuXG4vKiogQGludGVybmFsICovXG5leHBvcnQgY2xhc3MgSW5wdXRPcGVyYW5kIGV4dGVuZHMgTUxPcGVyYW5kIHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBkZXNjOiBNTE9wZXJhbmREZXNjcmlwdG9yO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgbmFtZTogc3RyaW5nLCBkZXNjOiBNTE9wZXJhbmREZXNjcmlwdG9yLCBidWlsZGVyOiBNTEdyYXBoQnVpbGRlcikge1xuICAgIHN1cGVyKGJ1aWxkZXIpO1xuICAgIHV0aWxzLmFzc2VydCh0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycsICdUaGUgbmFtZSBwYXJhbWV0ZXIgaXMgaW52YWxpZCcpO1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kRGVzY3JpcHRvcihkZXNjKTtcbiAgICB0aGlzLmRlc2MgPSBkZXNjO1xuICB9XG59XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBjbGFzcyBDb25zdGFudE9wZXJhbmQgZXh0ZW5kcyBNTE9wZXJhbmQge1xuICByZWFkb25seSBkZXNjOiBNTE9wZXJhbmREZXNjcmlwdG9yO1xuICByZWFkb25seSB2YWx1ZTogbnVtYmVyfEFycmF5QnVmZmVyVmlldztcblxuICBzdGF0aWMgY3JlYXRlU2NhbGFyKFxuICAgICAgdmFsdWU6IG51bWJlciwgdHlwZTogTUxPcGVyYW5kVHlwZSA9IE1MT3BlcmFuZFR5cGUuZmxvYXQzMixcbiAgICAgIGJ1aWxkZXI6IE1MR3JhcGhCdWlsZGVyKTogQ29uc3RhbnRPcGVyYW5kIHtcbiAgICB1dGlscy5hc3NlcnQodHlwZSBpbiBNTE9wZXJhbmRUeXBlLCAnVGhlIG9wZXJhbmQgdHlwZSBpcyBpbnZhbGlkLicpO1xuICAgIHV0aWxzLnZhbGlkYXRlVmFsdWVUeXBlKHZhbHVlLCB0eXBlKTtcbiAgICByZXR1cm4gbmV3IENvbnN0YW50T3BlcmFuZCh7dHlwZX0gYXMgTUxPcGVyYW5kRGVzY3JpcHRvciwgdmFsdWUsIGJ1aWxkZXIpO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVRlbnNvcihcbiAgICAgIGRlc2M6IE1MT3BlcmFuZERlc2NyaXB0b3IsIHZhbHVlOiBNTEJ1ZmZlclZpZXcsXG4gICAgICBidWlsZGVyOiBNTEdyYXBoQnVpbGRlcik6IENvbnN0YW50T3BlcmFuZCB7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICB1dGlscy5pc1R5cGVkQXJyYXkodmFsdWUpLFxuICAgICAgICAnT25seSBBcnJheUJ1ZmZlclZpZXcgdmFsdWUgdHlwZSBpcyBzdXBwb3J0ZWQuJyk7XG4gICAgY29uc3QgYXJyYXkgPSB2YWx1ZSBhcyBBcnJheUJ1ZmZlclZpZXc7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kRGVzY3JpcHRvcihkZXNjKTtcbiAgICB1dGlscy52YWxpZGF0ZVR5cGVkQXJyYXkoYXJyYXksIGRlc2MudHlwZSwgZGVzYy5kaW1lbnNpb25zKTtcbiAgICByZXR1cm4gbmV3IENvbnN0YW50T3BlcmFuZChkZXNjLCBhcnJheSwgYnVpbGRlcik7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgICAgZGVzYzogTUxPcGVyYW5kRGVzY3JpcHRvciwgdmFsdWU6IG51bWJlcnxBcnJheUJ1ZmZlclZpZXcsXG4gICAgICBidWlsZGVyOiBNTEdyYXBoQnVpbGRlcikge1xuICAgIHN1cGVyKGJ1aWxkZXIpO1xuICAgIHRoaXMuZGVzYyA9IGRlc2M7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9XG59XG5cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgT3V0cHV0T3BlcmFuZCBleHRlbmRzIE1MT3BlcmFuZCB7XG4gIHJlYWRvbmx5IG9wZXJhdGlvbjogT3BlcmF0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKG9wZXJhdGlvbjogT3BlcmF0aW9uKSB7XG4gICAgc3VwZXIob3BlcmF0aW9uLmJ1aWxkZXIpO1xuICAgIHRoaXMub3BlcmF0aW9uID0gb3BlcmF0aW9uO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyB0ZiBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge0V4ZWN1dGlvbkNvbnRleHR9IGZyb20gJy4vZ3JhcGgnO1xuaW1wb3J0IHtNTEdyYXBoQnVpbGRlcn0gZnJvbSAnLi9ncmFwaF9idWlsZGVyJztcbmltcG9ydCB7TUxPcGVyYW5kLCBPdXRwdXRPcGVyYW5kfSBmcm9tICcuL29wZXJhbmQnO1xuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2FwaS1tbG9wZXJhdG9yKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1MT3BlcmF0b3Ige1xuICAvKiogQGludGVybmFsICovXG4gIGFwcGx5KGlucHV0OiBNTE9wZXJhbmQpOiBPdXRwdXRPcGVyYW5kO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcnVuT3AoeDogdGYuVGVuc29yKTogdGYuVGVuc29yO1xufVxuXG4vKiogQGludGVybmFsICovXG5leHBvcnQgaW50ZXJmYWNlIEZ1c2VkT3BlcmF0aW9uIHtcbiAgZ2V0RnVzZWRPdXRwdXRzKCk6IE91dHB1dE9wZXJhbmRbXTtcbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE9wZXJhdGlvbiB7XG4gIHByb3RlY3RlZCBidWlsZGVyXzogTUxHcmFwaEJ1aWxkZXI7XG4gIHByb3RlY3RlZCBvdXRwdXRzXzogT3V0cHV0T3BlcmFuZFtdID0gW107XG5cbiAgZ2V0IGJ1aWxkZXIoKTogTUxHcmFwaEJ1aWxkZXIge1xuICAgIHJldHVybiB0aGlzLmJ1aWxkZXJfO1xuICB9XG5cbiAgZ2V0IG91dHB1dHMoKTogT3V0cHV0T3BlcmFuZFtdIHtcbiAgICByZXR1cm4gdGhpcy5vdXRwdXRzXztcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGJ1aWxkZXI6IE1MR3JhcGhCdWlsZGVyKSB7XG4gICAgdGhpcy5idWlsZGVyXyA9IGJ1aWxkZXI7XG4gIH1cblxuICBhYnN0cmFjdCBpbnB1dHMoKTogTUxPcGVyYW5kW107XG5cbiAgY29tcHV0ZShjb250ZXh0OiBFeGVjdXRpb25Db250ZXh0KTogdm9pZCB7XG4gICAgY29uc3QgaW5wdXRUZW5zb3JzOiBNYXA8TUxPcGVyYW5kLCB0Zi5UZW5zb3I+ID0gbmV3IE1hcCgpO1xuICAgIGZvciAoY29uc3QgaW5wdXRPcGVyYW5kIG9mIHRoaXMuaW5wdXRzKCkpIHtcbiAgICAgIGlucHV0VGVuc29ycy5zZXQoaW5wdXRPcGVyYW5kLCBjb250ZXh0LmdldFRlbnNvcihpbnB1dE9wZXJhbmQpKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0cHV0VGVuc29ycyA9IHRmLnRpZHkoKCkgPT4gdGhpcy5jb21wdXRlSW1wbChpbnB1dFRlbnNvcnMpKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3V0cHV0c18ubGVuZ3RoOyArK2kpIHtcbiAgICAgIGNvbnRleHQuc2V0T3V0cHV0VGVuc29yKHRoaXMub3V0cHV0c19baV0sIG91dHB1dFRlbnNvcnNbaV0pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGlucHV0T3BlcmFuZCBvZiB0aGlzLmlucHV0cygpKSB7XG4gICAgICBjb250ZXh0LnJlbGVhc2VUZW5zb3IoaW5wdXRPcGVyYW5kKTtcbiAgICB9XG4gIH1cblxuICBhYnN0cmFjdCBjb21wdXRlSW1wbChpbnB1dFRlbnNvcnM6IE1hcDxNTE9wZXJhbmQsIHRmLlRlbnNvcj4pOiB0Zi5UZW5zb3JbXTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIGRpc3Bvc2UoKTogdm9pZCB7fVxufVxuXG4vKiogQGludGVybmFsICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgU2luZ2xlT3V0cHV0T3BlcmF0aW9uIGV4dGVuZHMgT3BlcmF0aW9uIHtcbiAgY29uc3RydWN0b3IoYnVpbGRlcjogTUxHcmFwaEJ1aWxkZXIpIHtcbiAgICBzdXBlcihidWlsZGVyKTtcbiAgICBpZiAoYnVpbGRlcikge1xuICAgICAgdGhpcy5jcmVhdGVPdXRwdXQoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlT3V0cHV0KCk6IHZvaWQge1xuICAgIC8vIE9wZXJhdGlvbiBwcm9kdWNlcyAxIG91dHB1dCBvcGVyYW5kIGJ5IGRlZmF1bHQuXG4gICAgdGhpcy5vdXRwdXRzXy5wdXNoKG5ldyBPdXRwdXRPcGVyYW5kKHRoaXMpKTtcbiAgfVxuXG4gIGdldCBvdXRwdXQoKTogT3V0cHV0T3BlcmFuZCB7XG4gICAgcmV0dXJuIHRoaXMub3V0cHV0c19bMF07XG4gIH1cblxuICBjb21wdXRlSW1wbChpbnB1dFRlbnNvcnM6IE1hcDxNTE9wZXJhbmQsIHRmLlRlbnNvcj4pOiB0Zi5UZW5zb3JbXSB7XG4gICAgcmV0dXJuIFt0aGlzLnJ1bihpbnB1dFRlbnNvcnMpXTtcbiAgfVxuXG4gIGFic3RyYWN0IHJ1bihpbnB1dFRlbnNvcnM6IE1hcDxNTE9wZXJhbmQsIHRmLlRlbnNvcj4pOiB0Zi5UZW5zb3I7XG59IiwiaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNTEJhdGNoTm9ybWFsaXphdGlvbk9wdGlvbnN9IGZyb20gJy4uL2dyYXBoX2J1aWxkZXInO1xuaW1wb3J0IHtNTE9wZXJhbmQsIE91dHB1dE9wZXJhbmR9IGZyb20gJy4uL29wZXJhbmQnO1xuaW1wb3J0IHtGdXNlZE9wZXJhdGlvbiwgTUxPcGVyYXRvciwgU2luZ2xlT3V0cHV0T3BlcmF0aW9ufSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgQmF0Y2hOb3JtYWxpemF0aW9uIGV4dGVuZHMgU2luZ2xlT3V0cHV0T3BlcmF0aW9uIGltcGxlbWVudHNcbiAgICBGdXNlZE9wZXJhdGlvbiB7XG4gIHByaXZhdGUgaW5wdXRfOiBNTE9wZXJhbmQ7XG4gIHByaXZhdGUgbWVhbl86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSB2YXJpYW5jZV86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSBzY2FsZV8/OiBNTE9wZXJhbmQ7XG4gIHByaXZhdGUgYmlhc18/OiBNTE9wZXJhbmQ7XG4gIHByaXZhdGUgYXhpc18/OiBudW1iZXI7XG4gIHByaXZhdGUgZXBzaWxvbl8/OiBudW1iZXI7XG4gIHByaXZhdGUgYWN0aXZhdGlvbl8/OiBNTE9wZXJhdG9yO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgaW5wdXQ6IE1MT3BlcmFuZCwgbWVhbjogTUxPcGVyYW5kLCB2YXJpYW5jZTogTUxPcGVyYW5kLFxuICAgICAgb3B0aW9uczogTUxCYXRjaE5vcm1hbGl6YXRpb25PcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihpbnB1dC5idWlsZGVyKTtcbiAgICB1dGlscy52YWxpZGF0ZU9wZXJhbmQoaW5wdXQpO1xuICAgIHRoaXMuaW5wdXRfID0gaW5wdXQ7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKG1lYW4pO1xuICAgIHRoaXMubWVhbl8gPSBtZWFuO1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZCh2YXJpYW5jZSk7XG4gICAgdGhpcy52YXJpYW5jZV8gPSB2YXJpYW5jZTtcbiAgICB1dGlscy52YWxpZGF0ZU9wdGlvbmFsT3BlcmFuZChvcHRpb25zLnNjYWxlKTtcbiAgICB0aGlzLnNjYWxlXyA9IG9wdGlvbnMuc2NhbGU7XG4gICAgdXRpbHMudmFsaWRhdGVPcHRpb25hbE9wZXJhbmQob3B0aW9ucy5iaWFzKTtcbiAgICB0aGlzLmJpYXNfID0gb3B0aW9ucy5iaWFzO1xuICAgIGlmIChvcHRpb25zLmF4aXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgYXhpcyA9IG9wdGlvbnMuYXhpcztcbiAgICAgIHV0aWxzLmFzc2VydCh1dGlscy5pc0ludGVnZXIoYXhpcyksICdUaGUgYXhpcyBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICAgIHRoaXMuYXhpc18gPSBheGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmF4aXNfID0gMTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuZXBzaWxvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBlcHNpbG9uID0gb3B0aW9ucy5lcHNpbG9uO1xuICAgICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgIHR5cGVvZiBlcHNpbG9uID09PSAnbnVtYmVyJywgJ1RoZSBlcHNpbG9uIHBhcmFtZXRlciBpcyBpbnZhbGlkJyk7XG4gICAgICB0aGlzLmVwc2lsb25fID0gZXBzaWxvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lcHNpbG9uXyA9IDFlLTU7XG4gICAgfVxuICAgIHRoaXMuYWN0aXZhdGlvbl8gPSBvcHRpb25zLmFjdGl2YXRpb247XG4gIH1cblxuICBpbnB1dHMoKTogTUxPcGVyYW5kW10ge1xuICAgIGNvbnN0IGlucHV0czogTUxPcGVyYW5kW10gPSBbdGhpcy5pbnB1dF8sIHRoaXMubWVhbl8sIHRoaXMudmFyaWFuY2VfXTtcbiAgICBpZiAodGhpcy5zY2FsZV8pIHtcbiAgICAgIGlucHV0cy5wdXNoKHRoaXMuc2NhbGVfKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYmlhc18pIHtcbiAgICAgIGlucHV0cy5wdXNoKHRoaXMuYmlhc18pO1xuICAgIH1cbiAgICByZXR1cm4gaW5wdXRzO1xuICB9XG5cbiAgZ2V0RnVzZWRPdXRwdXRzKCk6IE91dHB1dE9wZXJhbmRbXSB7XG4gICAgaWYgKHRoaXMuYWN0aXZhdGlvbl8pIHtcbiAgICAgIHJldHVybiBbdGhpcy5hY3RpdmF0aW9uXy5hcHBseSh0aGlzLm91dHB1dCldO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW3RoaXMub3V0cHV0XTtcbiAgICB9XG4gIH1cblxuICBydW4oaW5wdXRUZW5zb3JzOiBNYXA8TUxPcGVyYW5kLCB0Zi5UZW5zb3I+KTogdGYuVGVuc29yIHtcbiAgICBjb25zdCBpbnB1dDogdGYuVGVuc29yID0gaW5wdXRUZW5zb3JzLmdldCh0aGlzLmlucHV0Xyk7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICB0aGlzLmF4aXNfIDwgaW5wdXQucmFuayAmJiB0aGlzLmF4aXNfID49IC1pbnB1dC5yYW5rLFxuICAgICAgICAnVGhlIGF4aXMgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgY29uc3QgYXhpcyA9IHRoaXMuYXhpc18gPj0gMCA/IHRoaXMuYXhpc18gOiBpbnB1dC5yYW5rICsgdGhpcy5heGlzXztcbiAgICBjb25zdCBtZWFuOiB0Zi5UZW5zb3IgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMubWVhbl8pO1xuICAgIHV0aWxzLmFzc2VydChtZWFuLnJhbmsgPT09IDEsICdUaGUgbWVhbiBvcGVyYW5kIGlzIG5vdCAxLUQuJyk7XG4gICAgY29uc3QgdmFyaWFuY2U6IHRmLlRlbnNvciA9IGlucHV0VGVuc29ycy5nZXQodGhpcy52YXJpYW5jZV8pO1xuICAgIHV0aWxzLmFzc2VydCh2YXJpYW5jZS5yYW5rID09PSAxLCAnVGhlIG1lYW4gb3BlcmFuZCBpcyBub3QgMS1ELicpO1xuICAgIGxldCBzY2FsZTogdGYuVGVuc29yO1xuICAgIGlmICh0aGlzLnNjYWxlXykge1xuICAgICAgc2NhbGUgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuc2NhbGVfKTtcbiAgICAgIHV0aWxzLmFzc2VydChzY2FsZS5yYW5rID09PSAxLCAnVGhlIHNjYWxlIG9wZXJhbmQgaXMgbm90IDEtRC4nKTtcbiAgICB9XG4gICAgbGV0IGJpYXM6IHRmLlRlbnNvcjtcbiAgICBpZiAodGhpcy5iaWFzXykge1xuICAgICAgYmlhcyA9IGlucHV0VGVuc29ycy5nZXQodGhpcy5iaWFzXyk7XG4gICAgICB1dGlscy5hc3NlcnQoYmlhcy5yYW5rID09PSAxLCAnVGhlIGJpYXMgb3BlcmFuZCBpcyBub3QgMS1ELicpO1xuICAgIH1cbiAgICAvLyB0Zi5iYXRjaE5vcm0gb25seSBjb21wdXRlcyBmb3IgdGhlIGxhc3QgZGltZW5zaW9uLlxuICAgIGNvbnN0IHBlcm11dGF0aW9uID0gQXJyYXkuZnJvbShBcnJheShpbnB1dC5yYW5rKS5rZXlzKCkpO1xuICAgIHBlcm11dGF0aW9uW2F4aXNdID0gaW5wdXQucmFuayAtIDE7XG4gICAgcGVybXV0YXRpb25baW5wdXQucmFuayAtIDFdID0gYXhpcztcbiAgICByZXR1cm4gdGYudHJhbnNwb3NlKFxuICAgICAgICB0Zi5iYXRjaE5vcm0oXG4gICAgICAgICAgICB0Zi50cmFuc3Bvc2UoaW5wdXQsIHBlcm11dGF0aW9uKSwgbWVhbiwgdmFyaWFuY2UsIGJpYXMsIHNjYWxlLFxuICAgICAgICAgICAgdGhpcy5lcHNpbG9uXyksXG4gICAgICAgIHBlcm11dGF0aW9uKTtcbiAgfVxufSIsImltcG9ydCAqIGFzIHRmIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TUxPcGVyYW5kfSBmcm9tICcuLi9vcGVyYW5kJztcbmltcG9ydCB7U2luZ2xlT3V0cHV0T3BlcmF0aW9ufSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmluYXJ5IGV4dGVuZHMgU2luZ2xlT3V0cHV0T3BlcmF0aW9uIHtcbiAgcHJpdmF0ZSBhXzogTUxPcGVyYW5kO1xuICBwcml2YXRlIGJfOiBNTE9wZXJhbmQ7XG5cbiAgY29uc3RydWN0b3IoYTogTUxPcGVyYW5kLCBiOiBNTE9wZXJhbmQpIHtcbiAgICBzdXBlcihhLmJ1aWxkZXIpO1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZChhKTtcbiAgICB0aGlzLmFfID0gYTtcbiAgICB1dGlscy52YWxpZGF0ZU9wZXJhbmQoYik7XG4gICAgdGhpcy5iXyA9IGI7XG4gIH1cblxuICBpbnB1dHMoKTogTUxPcGVyYW5kW10ge1xuICAgIHJldHVybiBbdGhpcy5hXywgdGhpcy5iX107XG4gIH1cblxuICBydW4oaW5wdXRUZW5zb3JzOiBNYXA8TUxPcGVyYW5kLCB0Zi5UZW5zb3I+KTogdGYuVGVuc29yIHtcbiAgICBjb25zdCBhOiB0Zi5UZW5zb3IgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuYV8pO1xuICAgIGNvbnN0IGI6IHRmLlRlbnNvciA9IGlucHV0VGVuc29ycy5nZXQodGhpcy5iXyk7XG4gICAgcmV0dXJuIHRoaXMucnVuT3AoYSwgYik7XG4gIH1cblxuICBhYnN0cmFjdCBydW5PcChhOiB0Zi5UZW5zb3IsIGI6IHRmLlRlbnNvcik6IHRmLlRlbnNvcjtcbn1cblxuZXhwb3J0IGNsYXNzIEFkZCBleHRlbmRzIEJpbmFyeSB7XG4gIHJ1bk9wKGE6IHRmLlRlbnNvciwgYjogdGYuVGVuc29yKTogdGYuVGVuc29yIHtcbiAgICByZXR1cm4gdGYuYWRkKGEsIGIpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdWIgZXh0ZW5kcyBCaW5hcnkge1xuICBydW5PcChhOiB0Zi5UZW5zb3IsIGI6IHRmLlRlbnNvcik6IHRmLlRlbnNvciB7XG4gICAgcmV0dXJuIHRmLnN1YihhLCBiKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTXVsIGV4dGVuZHMgQmluYXJ5IHtcbiAgcnVuT3AoYTogdGYuVGVuc29yLCBiOiB0Zi5UZW5zb3IpOiB0Zi5UZW5zb3Ige1xuICAgIHJldHVybiB0Zi5tdWwoYSwgYik7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERpdiBleHRlbmRzIEJpbmFyeSB7XG4gIHJ1bk9wKGE6IHRmLlRlbnNvciwgYjogdGYuVGVuc29yKTogdGYuVGVuc29yIHtcbiAgICByZXR1cm4gdGYuZGl2KGEsIGIpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNYXggZXh0ZW5kcyBCaW5hcnkge1xuICBydW5PcChhOiB0Zi5UZW5zb3IsIGI6IHRmLlRlbnNvcik6IHRmLlRlbnNvciB7XG4gICAgcmV0dXJuIHRmLm1heGltdW0oYSwgYik7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1pbiBleHRlbmRzIEJpbmFyeSB7XG4gIHJ1bk9wKGE6IHRmLlRlbnNvciwgYjogdGYuVGVuc29yKTogdGYuVGVuc29yIHtcbiAgICByZXR1cm4gdGYubWluaW11bShhLCBiKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUG93IGV4dGVuZHMgQmluYXJ5IHtcbiAgcnVuT3AoYTogdGYuVGVuc29yLCBiOiB0Zi5UZW5zb3IpOiB0Zi5UZW5zb3Ige1xuICAgIHJldHVybiB0Zi5wb3coYSwgYik7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1hdE11bCBleHRlbmRzIEJpbmFyeSB7XG4gIHJ1bk9wKGE6IHRmLlRlbnNvciwgYjogdGYuVGVuc29yKTogdGYuVGVuc29yIHtcbiAgICBpZiAoYS5yYW5rID09PSAxKSB7XG4gICAgICBpZiAoYi5yYW5rID09PSAxKSB7XG4gICAgICAgIHJldHVybiB0Zi5kb3QoYSwgYik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhIGlzIDEtRCwgY29udmVydCB0byBhIDItRCB0ZW5zb3IgYnkgcHJlcGVuZGluZyBhIDEgdG8gaXRzIGRpbWVzaW9uc1xuICAgICAgICByZXR1cm4gdGYubWF0TXVsKHRmLnJlc2hhcGUoYSwgWzEsIC0xXSksIGIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoYi5yYW5rID09PSAxKSB7XG4gICAgICAgIC8vIGIgaXMgMS1ELCBjb252ZXJ0IHRvIGEgMi1EIHRlbnNvciBieSBhcHBlbmRpbmcgYSAxIHRvIGl0cyBkaW1lc2lvbnNcbiAgICAgICAgcmV0dXJuIHRmLm1hdE11bChhLCB0Zi5yZXNoYXBlKGIsIFstMSwgMV0pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJhbmsgPSBhLnJhbmsgPiBiLnJhbmsgPyBhLnJhbmsgOiBiLnJhbms7XG4gICAgICAgIGxldCBjID0gdGYubWF0TXVsKGEsIGIpO1xuICAgICAgICAvLyB3b3JrYXJvdW5kIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RmanMvaXNzdWVzLzQxOTJcbiAgICAgICAgaWYgKGMucmFuayAhPT0gcmFuaykge1xuICAgICAgICAgIGMgPSB0Zi5yZXNoYXBlKGMsIFsxXS5jb25jYXQoYy5zaGFwZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjO1xuICAgICAgfVxuICAgIH1cbiAgfVxufSIsImltcG9ydCAqIGFzIHRmIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TUxDbGFtcE9wdGlvbnN9IGZyb20gJy4uL2dyYXBoX2J1aWxkZXInO1xuaW1wb3J0IHtDb25zdGFudE9wZXJhbmQsIE1MT3BlcmFuZCwgT3V0cHV0T3BlcmFuZH0gZnJvbSAnLi4vb3BlcmFuZCc7XG5pbXBvcnQge1NpbmdsZU91dHB1dE9wZXJhdGlvbn0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIENsYW1wIGV4dGVuZHMgU2luZ2xlT3V0cHV0T3BlcmF0aW9uIHtcbiAgcHJpdmF0ZSB4XzogTUxPcGVyYW5kO1xuICBwcml2YXRlIG1pbk9wZXJhbmRfPzogTUxPcGVyYW5kO1xuICBwcml2YXRlIG1heE9wZXJhbmRfPzogTUxPcGVyYW5kO1xuICBwcml2YXRlIG1pblNjYWxhclZhbHVlXz86IG51bWJlcjtcbiAgcHJpdmF0ZSBtYXhTY2FsYXJWYWx1ZV8/OiBudW1iZXI7XG5cbiAgZ2V0IG1pblNjYWxhclZhbHVlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubWluU2NhbGFyVmFsdWVfO1xuICB9XG4gIGdldCBtYXhTY2FsYXJWYWx1ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm1heFNjYWxhclZhbHVlXztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2NhbGFyVmFsdWUob3BlcmFuZDogTUxPcGVyYW5kLCBtaW51cyA9IGZhbHNlKTogbnVtYmVyIHtcbiAgICBpZiAob3BlcmFuZCBpbnN0YW5jZW9mIENvbnN0YW50T3BlcmFuZCkge1xuICAgICAgY29uc3QgbWluQ29uc3RhbnQgPSBvcGVyYW5kO1xuICAgICAgaWYgKHR5cGVvZiBtaW5Db25zdGFudC52YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIG1pbkNvbnN0YW50LnZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAob3BlcmFuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbWludXMgPyAtSW5maW5pdHkgOiArSW5maW5pdHk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcih4OiBNTE9wZXJhbmQsIG9wdGlvbnM6IE1MQ2xhbXBPcHRpb25zID0ge30pIHtcbiAgICBpZiAoeCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzdXBlcih4LmJ1aWxkZXIpO1xuICAgICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKHgpO1xuICAgICAgdGhpcy54XyA9IHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1cGVyKHVuZGVmaW5lZCk7XG4gICAgICB0aGlzLnhfID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB1dGlscy52YWxpZGF0ZU9wdGlvbmFsT3BlcmFuZChvcHRpb25zLm1pblZhbHVlKTtcbiAgICB0aGlzLm1pbk9wZXJhbmRfID0gb3B0aW9ucy5taW5WYWx1ZTtcbiAgICB0aGlzLm1pblNjYWxhclZhbHVlXyA9IHRoaXMuZ2V0U2NhbGFyVmFsdWUodGhpcy5taW5PcGVyYW5kXywgdHJ1ZSk7XG4gICAgdXRpbHMudmFsaWRhdGVPcHRpb25hbE9wZXJhbmQob3B0aW9ucy5tYXhWYWx1ZSk7XG4gICAgdGhpcy5tYXhPcGVyYW5kXyA9IG9wdGlvbnMubWF4VmFsdWU7XG4gICAgdGhpcy5tYXhTY2FsYXJWYWx1ZV8gPSB0aGlzLmdldFNjYWxhclZhbHVlKHRoaXMubWF4T3BlcmFuZF8pO1xuICB9XG5cbiAgaW5wdXRzKCk6IE1MT3BlcmFuZFtdIHtcbiAgICBjb25zdCBpbnB1dHMgPSBbdGhpcy54X107XG4gICAgaWYgKHRoaXMubWluT3BlcmFuZF8pIHtcbiAgICAgIGlucHV0cy5wdXNoKHRoaXMubWluT3BlcmFuZF8pO1xuICAgIH1cbiAgICBpZiAodGhpcy5tYXhPcGVyYW5kXykge1xuICAgICAgaW5wdXRzLnB1c2godGhpcy5tYXhPcGVyYW5kXyk7XG4gICAgfVxuICAgIHJldHVybiBpbnB1dHM7XG4gIH1cblxuICBydW4oaW5wdXRUZW5zb3JzOiBNYXA8TUxPcGVyYW5kLCB0Zi5UZW5zb3I+KTogdGYuVGVuc29yIHtcbiAgICBjb25zdCB4OiB0Zi5UZW5zb3IgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMueF8pO1xuICAgIGlmICh0aGlzLm1pbk9wZXJhbmRfKSB7XG4gICAgICBpZiAodGhpcy5tYXhPcGVyYW5kXykge1xuICAgICAgICByZXR1cm4gdGYubWluaW11bShcbiAgICAgICAgICAgIHRmLm1heGltdW0oeCwgaW5wdXRUZW5zb3JzLmdldCh0aGlzLm1pbk9wZXJhbmRfKSksXG4gICAgICAgICAgICBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMubWF4T3BlcmFuZF8pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0Zi5tYXhpbXVtKHgsIGlucHV0VGVuc29ycy5nZXQodGhpcy5taW5PcGVyYW5kXykpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5tYXhPcGVyYW5kXykge1xuICAgICAgICByZXR1cm4gdGYubWluaW11bSh4LCBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMubWF4T3BlcmFuZF8pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0Zi5jbG9uZSh4KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhcHBseSh4OiBNTE9wZXJhbmQpOiBPdXRwdXRPcGVyYW5kIHtcbiAgICB0aGlzLmJ1aWxkZXJfID0geC5idWlsZGVyO1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZCh4KTtcbiAgICB0aGlzLnhfID0geDtcbiAgICB0aGlzLmNyZWF0ZU91dHB1dCgpO1xuICAgIHJldHVybiB0aGlzLm91dHB1dDtcbiAgfVxuXG4gIHJ1bk9wKHg6IHRmLlRlbnNvcik6IHRmLlRlbnNvciB7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICB0aGlzLm1pblNjYWxhclZhbHVlXyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICB0aGlzLm1heFNjYWxhclZhbHVlXyAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAndGYuanMgb25seSBzdXBwb3J0cyBjbGlwQnlWYWx1ZS4nKTtcbiAgICByZXR1cm4gdGYuY2xpcEJ5VmFsdWUoeCwgdGhpcy5taW5TY2FsYXJWYWx1ZV8sIHRoaXMubWF4U2NhbGFyVmFsdWVfKTtcbiAgfVxufSIsImltcG9ydCAqIGFzIHRmIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TUxPcGVyYW5kfSBmcm9tICcuLi9vcGVyYW5kJztcbmltcG9ydCB7U2luZ2xlT3V0cHV0T3BlcmF0aW9ufSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgQ29uY2F0IGV4dGVuZHMgU2luZ2xlT3V0cHV0T3BlcmF0aW9uIHtcbiAgcHJpdmF0ZSBpbnB1dHNfOiBNTE9wZXJhbmRbXTtcbiAgcHJpdmF0ZSBheGlzXzogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGlucHV0czogTUxPcGVyYW5kW10sIGF4aXM6IG51bWJlcikge1xuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgaW5wdXRzLmV2ZXJ5KGlucHV0ID0+IGlucHV0IGluc3RhbmNlb2YgTUxPcGVyYW5kKSxcbiAgICAgICAgJ1RoZSBwYXJhbWV0ZXIgaXMgbm90IGFuIG9wZXJhbmQuJyk7XG4gICAgc3VwZXIoaW5wdXRzWzBdLmJ1aWxkZXIpO1xuICAgIHRoaXMuaW5wdXRzXyA9IGlucHV0cztcbiAgICB1dGlscy5hc3NlcnQodXRpbHMuaXNJbnRlZ2VyKGF4aXMpLCAnVGhlIGF4aXMgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5heGlzXyA9IGF4aXM7XG4gIH1cblxuICBpbnB1dHMoKTogTUxPcGVyYW5kW10ge1xuICAgIHJldHVybiB0aGlzLmlucHV0c187XG4gIH1cblxuICBydW4oaW5wdXRUZW5zb3JzOiBNYXA8TUxPcGVyYW5kLCB0Zi5UZW5zb3I+KTogdGYuVGVuc29yIHtcbiAgICBjb25zdCBpbnB1dHM6IHRmLlRlbnNvcltdID0gW107XG4gICAgZm9yIChjb25zdCBpbnB1dCBvZiB0aGlzLmlucHV0cygpKSB7XG4gICAgICBpbnB1dHMucHVzaChpbnB1dFRlbnNvcnMuZ2V0KGlucHV0KSk7XG4gICAgfVxuICAgIHJldHVybiB0Zi5jb25jYXQoaW5wdXRzLCB0aGlzLmF4aXNfKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7RXhwbGljaXRQYWRkaW5nfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUvc3JjL29wcy9jb252X3V0aWwnO1xuXG5pbXBvcnQge01MQXV0b1BhZCwgTUxDb252MmRPcHRpb25zLCBNTEZpbHRlck9wZXJhbmRMYXlvdXQsIE1MSW5wdXRPcGVyYW5kTGF5b3V0fSBmcm9tICcuLi9ncmFwaF9idWlsZGVyJztcbmltcG9ydCB7Q29uc3RhbnRPcGVyYW5kLCBNTE9wZXJhbmQsIE91dHB1dE9wZXJhbmR9IGZyb20gJy4uL29wZXJhbmQnO1xuaW1wb3J0IHtGdXNlZE9wZXJhdGlvbiwgTUxPcGVyYXRvciwgU2luZ2xlT3V0cHV0T3BlcmF0aW9ufSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi4vdXRpbHMnO1xuXG5pbXBvcnQge0NsYW1wfSBmcm9tICcuL2NsYW1wJztcbmltcG9ydCB7TGVha3lSZWx1fSBmcm9tICcuL2xlYWt5X3JlbHUnO1xuaW1wb3J0IHtSZWx1LCBTaWdtb2lkfSBmcm9tICcuL3VuYXJ5JztcblxuZXhwb3J0IGNsYXNzIENvbnYyZCBleHRlbmRzIFNpbmdsZU91dHB1dE9wZXJhdGlvbiBpbXBsZW1lbnRzIEZ1c2VkT3BlcmF0aW9uIHtcbiAgcHJpdmF0ZSBpbnB1dF86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSBmaWx0ZXJfOiBNTE9wZXJhbmQ7XG4gIHByaXZhdGUgYmlhc186IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSBwYWRkaW5nXz86IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICBwcml2YXRlIHN0cmlkZXNfPzogW251bWJlciwgbnVtYmVyXTtcbiAgcHJpdmF0ZSBkaWxhdGlvbnNfPzogW251bWJlciwgbnVtYmVyXTtcbiAgcHJpdmF0ZSBncm91cHNfPzogbnVtYmVyO1xuICBwcml2YXRlIGlucHV0TGF5b3V0Xz86IE1MSW5wdXRPcGVyYW5kTGF5b3V0O1xuICBwcml2YXRlIGZpbHRlckxheW91dF8/OiBNTEZpbHRlck9wZXJhbmRMYXlvdXQ7XG4gIHByaXZhdGUgYXV0b1BhZF8/OiBNTEF1dG9QYWQ7XG4gIHByaXZhdGUgb3V0cHV0UGFkZGluZ18/OiBbbnVtYmVyLCBudW1iZXJdO1xuICBwcml2YXRlIG91dHB1dFNpemVzXz86IFtudW1iZXIsIG51bWJlcl07XG4gIHByaXZhdGUgdHJhbnNwb3NlXz86IGJvb2xlYW47XG4gIHByaXZhdGUgYWN0aXZhdGlvbl8/OiBNTE9wZXJhdG9yO1xuICBwcml2YXRlIGZ1c2VkQWN0aXZhdGlvbl8/OiB0Zi5mdXNlZC5BY3RpdmF0aW9uO1xuICBwcml2YXRlIGxlYWt5cmVsdUFscGhhXz86IG51bWJlcjtcbiAgcHJpdmF0ZSBmaWx0ZXJUZW5zb3JfPzogdGYuVGVuc29yNEQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBpbnB1dDogTUxPcGVyYW5kLCBmaWx0ZXI6IE1MT3BlcmFuZCwgb3B0aW9uczogTUxDb252MmRPcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihpbnB1dC5idWlsZGVyKTtcbiAgICB1dGlscy52YWxpZGF0ZU9wZXJhbmQoaW5wdXQpO1xuICAgIHRoaXMuaW5wdXRfID0gaW5wdXQ7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKGZpbHRlcik7XG4gICAgdGhpcy5maWx0ZXJfID0gZmlsdGVyO1xuXG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAhKG9wdGlvbnMuYXV0b1BhZCA9PT0gTUxBdXRvUGFkLmV4cGxpY2l0ICYmXG4gICAgICAgICAgb3B0aW9ucy5wYWRkaW5nID09PSB1bmRlZmluZWQpLFxuICAgICAgICAnVGhlIHBhZGRpbmcgcGFyYW1ldGVyIHNob3VsZCBiZSBhc3NpZ25lZCB3aGVuIGF1dG9QYWQgaXMgZXhwbGljaXQuJyk7XG5cbiAgICB0aGlzLmluaXRPcHRpb25zKFxuICAgICAgICBvcHRpb25zLnBhZGRpbmcsIG9wdGlvbnMuc3RyaWRlcywgb3B0aW9ucy5kaWxhdGlvbnMsIG9wdGlvbnMuZ3JvdXBzLFxuICAgICAgICBvcHRpb25zLmlucHV0TGF5b3V0LCBvcHRpb25zLmZpbHRlckxheW91dCwgb3B0aW9ucy5hdXRvUGFkLFxuICAgICAgICBvcHRpb25zLnRyYW5zcG9zZSwgb3B0aW9ucy5vdXRwdXRQYWRkaW5nLCBvcHRpb25zLm91dHB1dFNpemVzLFxuICAgICAgICBvcHRpb25zLmJpYXMsIG9wdGlvbnMuYWN0aXZhdGlvbik7XG4gIH1cblxuICBwcml2YXRlIGluaXRPcHRpb25zKFxuICAgICAgcGFkZGluZzogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPSBbMCwgMCwgMCwgMF0sXG4gICAgICBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdID0gWzEsIDFdLCBkaWxhdGlvbnM6IFtudW1iZXIsIG51bWJlcl0gPSBbMSwgMV0sXG4gICAgICBncm91cHMgPSAxLCBpbnB1dExheW91dDogTUxJbnB1dE9wZXJhbmRMYXlvdXQgPSBNTElucHV0T3BlcmFuZExheW91dC5uY2h3LFxuICAgICAgZmlsdGVyTGF5b3V0OiBNTEZpbHRlck9wZXJhbmRMYXlvdXQgPSBNTEZpbHRlck9wZXJhbmRMYXlvdXQub2lodyxcbiAgICAgIGF1dG9QYWQ6IE1MQXV0b1BhZCA9IE1MQXV0b1BhZC5leHBsaWNpdCwgdHJhbnNwb3NlID0gZmFsc2UsXG4gICAgICBvdXRwdXRQYWRkaW5nOiBbbnVtYmVyLCBudW1iZXJdID0gWzAsIDBdLFxuICAgICAgb3V0cHV0U2l6ZXM6IFtudW1iZXIsIG51bWJlcl0gPSB1bmRlZmluZWQsIGJpYXM6IE1MT3BlcmFuZCA9IHVuZGVmaW5lZCxcbiAgICAgIGFjdGl2YXRpb246IE1MT3BlcmF0b3IgPSB1bmRlZmluZWQpIHtcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIHV0aWxzLmlzSW50ZWdlckFycmF5KHBhZGRpbmcpICYmIHBhZGRpbmcubGVuZ3RoID09PSA0LFxuICAgICAgICAnVGhlIHBhZGRpbmcgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5wYWRkaW5nXyA9IHBhZGRpbmc7XG5cbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIHV0aWxzLmlzSW50ZWdlckFycmF5KHN0cmlkZXMpICYmIHN0cmlkZXMubGVuZ3RoID09PSAyLFxuICAgICAgICAnVGhlIHN0cmlkZXMgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5zdHJpZGVzXyA9IHN0cmlkZXM7XG5cbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIHV0aWxzLmlzSW50ZWdlckFycmF5KGRpbGF0aW9ucykgJiYgZGlsYXRpb25zLmxlbmd0aCA9PT0gMixcbiAgICAgICAgJ1RoZSBkaWxhdGlvbnMgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5kaWxhdGlvbnNfID0gZGlsYXRpb25zO1xuXG4gICAgdXRpbHMuYXNzZXJ0KHV0aWxzLmlzSW50ZWdlcihncm91cHMpLCAnVGhlIGdvdXJwcyBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICB0aGlzLmdyb3Vwc18gPSBncm91cHM7XG5cbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIGlucHV0TGF5b3V0IGluIE1MSW5wdXRPcGVyYW5kTGF5b3V0LFxuICAgICAgICAnVGhlIGlucHV0IGxheW91dCBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICB0aGlzLmlucHV0TGF5b3V0XyA9IGlucHV0TGF5b3V0O1xuXG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICBmaWx0ZXJMYXlvdXQgaW4gTUxGaWx0ZXJPcGVyYW5kTGF5b3V0LFxuICAgICAgICAnVGhlIGZpbHRlciBsYXlvdXQgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5maWx0ZXJMYXlvdXRfID0gZmlsdGVyTGF5b3V0O1xuXG4gICAgdXRpbHMuYXNzZXJ0KGF1dG9QYWQgaW4gTUxBdXRvUGFkLCAnVGhlIGF1dG9QYWQgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5hdXRvUGFkXyA9IGF1dG9QYWQ7XG5cbiAgICB0aGlzLnRyYW5zcG9zZV8gPSB0cmFuc3Bvc2U7XG5cbiAgICBpZiAodGhpcy50cmFuc3Bvc2VfKSB7XG4gICAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgICAgdXRpbHMuaXNJbnRlZ2VyQXJyYXkob3V0cHV0UGFkZGluZykgJiYgb3V0cHV0UGFkZGluZy5sZW5ndGggPT09IDIsXG4gICAgICAgICAgJ1RoZSBvdXRwdXRQYWRkaW5nIHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgICAgdGhpcy5vdXRwdXRQYWRkaW5nXyA9IG91dHB1dFBhZGRpbmc7XG5cbiAgICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgICBvdXRwdXRTaXplcyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAgICh1dGlscy5pc0ludGVnZXJBcnJheShvdXRwdXRTaXplcykgJiYgb3V0cHV0U2l6ZXMubGVuZ3RoID09PSAyKSxcbiAgICAgICAgICAnVGhlIG91dHB1dFNpemVzIHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgICAgdGhpcy5vdXRwdXRTaXplc18gPSBvdXRwdXRTaXplcztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vdXRwdXRQYWRkaW5nXyA9IFswLCAwXTtcbiAgICAgIHRoaXMub3V0cHV0U2l6ZXNfID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHRoaXMuYmlhc18gPSBiaWFzO1xuICAgIGlmICh0aGlzLmJpYXNfKSB7XG4gICAgICB1dGlscy52YWxpZGF0ZU9wZXJhbmQodGhpcy5iaWFzXyk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGl2YXRpb24gaW5zdGFuY2VvZiBSZWx1KSB7XG4gICAgICB0aGlzLmZ1c2VkQWN0aXZhdGlvbl8gPSAncmVsdSc7XG4gICAgICB0aGlzLmFjdGl2YXRpb25fID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc1JlbHU2KGFjdGl2YXRpb24pKSB7XG4gICAgICB0aGlzLmZ1c2VkQWN0aXZhdGlvbl8gPSAncmVsdTYnO1xuICAgICAgdGhpcy5hY3RpdmF0aW9uXyA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKGFjdGl2YXRpb24gaW5zdGFuY2VvZiBMZWFreVJlbHUpIHtcbiAgICAgIHRoaXMuZnVzZWRBY3RpdmF0aW9uXyA9ICdsZWFreXJlbHUnO1xuICAgICAgdGhpcy5sZWFreXJlbHVBbHBoYV8gPSAoYWN0aXZhdGlvbikuYWxwaGE7XG4gICAgICB0aGlzLmFjdGl2YXRpb25fID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAoYWN0aXZhdGlvbiBpbnN0YW5jZW9mIFNpZ21vaWQpIHtcbiAgICAgIHRoaXMuZnVzZWRBY3RpdmF0aW9uXyA9ICdzaWdtb2lkJztcbiAgICAgIHRoaXMuYWN0aXZhdGlvbl8gPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZnVzZWRBY3RpdmF0aW9uXyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuYWN0aXZhdGlvbl8gPSBhY3RpdmF0aW9uO1xuICAgIH1cbiAgfVxuXG4gIGlzUmVsdTYoYWN0aXZhdGlvbjogTUxPcGVyYXRvcik6IGJvb2xlYW4ge1xuICAgIGlmIChhY3RpdmF0aW9uIGluc3RhbmNlb2YgQ2xhbXApIHtcbiAgICAgIGNvbnN0IGNsYW1wID0gYWN0aXZhdGlvbjtcbiAgICAgIGlmIChNYXRoLmFicyhjbGFtcC5taW5TY2FsYXJWYWx1ZSAtIDAuMCkgPCAxZS01ICYmXG4gICAgICAgICAgTWF0aC5hYnMoY2xhbXAubWF4U2NhbGFyVmFsdWUgLSA2LjApIDwgMWUtNSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0RnVzZWRPdXRwdXRzKCk6IE91dHB1dE9wZXJhbmRbXSB7XG4gICAgaWYgKHRoaXMuYWN0aXZhdGlvbl8pIHtcbiAgICAgIHJldHVybiBbdGhpcy5hY3RpdmF0aW9uXy5hcHBseSh0aGlzLm91dHB1dCldO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW3RoaXMub3V0cHV0XTtcbiAgICB9XG4gIH1cblxuICBpbnB1dHMoKTogTUxPcGVyYW5kW10ge1xuICAgIGNvbnN0IGlucHV0cyA9IFt0aGlzLmlucHV0XywgdGhpcy5maWx0ZXJfXTtcbiAgICBpZiAodGhpcy5iaWFzXykge1xuICAgICAgaW5wdXRzLnB1c2godGhpcy5iaWFzXyk7XG4gICAgfVxuICAgIHJldHVybiBpbnB1dHM7XG4gIH1cblxuICBydW4oaW5wdXRUZW5zb3JzOiBNYXA8TUxPcGVyYW5kLCB0Zi5UZW5zb3I+KTogdGYuVGVuc29yIHtcbiAgICBsZXQgaW5wdXQ6IHRmLlRlbnNvcjREID0gaW5wdXRUZW5zb3JzLmdldCh0aGlzLmlucHV0XykgYXMgdGYuVGVuc29yNEQ7XG4gICAgbGV0IGZpbHRlcjogdGYuVGVuc29yNEQ7XG4gICAgbGV0IGJpYXM6IHRmLlRlbnNvcjFEO1xuICAgIGxldCBmdXNlZCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmJpYXNfKSB7XG4gICAgICBiaWFzID0gaW5wdXRUZW5zb3JzLmdldCh0aGlzLmJpYXNfKSBhcyB0Zi5UZW5zb3IxRDtcbiAgICB9XG5cbiAgICAvLyB0Zi5jb252MmQgaW5wdXQgbGF5b3V0IChuaHdjKTogW2JhdGNoLCBoZWlnaHQsIHdpZHRoLCBpbkRlcHRoXVxuICAgIGlmICh0aGlzLmlucHV0TGF5b3V0XyA9PT0gTUxJbnB1dE9wZXJhbmRMYXlvdXQubmNodykge1xuICAgICAgLy8gbmNodyAtPiBuaHdjXG4gICAgICBpbnB1dCA9IHRmLnRyYW5zcG9zZShpbnB1dCwgWzAsIDIsIDMsIDFdKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRDaGFubmVscyA9IGlucHV0LnNoYXBlWzNdO1xuICAgIC8vIHRmLmNvbnYyZCBmaWx0ZXIgbGF5b3V0IChod2lvKTogW2ZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGluRGVwdGgsXG4gICAgLy8gb3V0RGVwdGhdXG4gICAgaWYgKHRoaXMuZmlsdGVyVGVuc29yXyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBmaWx0ZXIgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuZmlsdGVyXykgYXMgdGYuVGVuc29yNEQ7XG4gICAgICBpZiAodGhpcy5maWx0ZXJMYXlvdXRfID09PSBNTEZpbHRlck9wZXJhbmRMYXlvdXQub2lodykge1xuICAgICAgICBmaWx0ZXIgPSB0Zi50cmFuc3Bvc2UoZmlsdGVyLCBbMiwgMywgMSwgMF0pO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmZpbHRlckxheW91dF8gPT09IE1MRmlsdGVyT3BlcmFuZExheW91dC5vaHdpKSB7XG4gICAgICAgIGZpbHRlciA9IHRmLnRyYW5zcG9zZShmaWx0ZXIsIFsxLCAyLCAzLCAwXSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZmlsdGVyTGF5b3V0XyA9PT0gTUxGaWx0ZXJPcGVyYW5kTGF5b3V0Lmlod28pIHtcbiAgICAgICAgZmlsdGVyID0gdGYudHJhbnNwb3NlKGZpbHRlciwgWzEsIDIsIDAsIDNdKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmdyb3Vwc18gIT09IDEpIHtcbiAgICAgICAgLy8gZmlsdGVyIGxheW91dCBod2lvXG4gICAgICAgIC8vIHRmLmRlcHRod2lzZUNvbnYyZCBmaWx0ZXIgbGF5b3V0OiBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCxcbiAgICAgICAgLy8gaW5DaGFubmVscywgY2hhbm5lbE11bHRpcGxpZXJdXG4gICAgICAgIGZpbHRlciA9IHRmLnRyYW5zcG9zZShmaWx0ZXIsIFswLCAxLCAzLCAyXSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5maWx0ZXJfIGluc3RhbmNlb2YgQ29uc3RhbnRPcGVyYW5kKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyVGVuc29yXyA9IGZpbHRlcjtcbiAgICAgICAgdGYua2VlcCh0aGlzLmZpbHRlclRlbnNvcl8pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmaWx0ZXIgPSB0aGlzLmZpbHRlclRlbnNvcl87XG4gICAgfVxuICAgIGNvbnN0IHBhZGRpbmc6ICd2YWxpZCd8J3NhbWUnfEV4cGxpY2l0UGFkZGluZyA9IHV0aWxzLmdldFBhZGRpbmdzKFxuICAgICAgICBpbnB1dCwgZmlsdGVyLCB0aGlzLnBhZGRpbmdfLCB0aGlzLnN0cmlkZXNfLCB0aGlzLm91dHB1dFBhZGRpbmdfLFxuICAgICAgICB0aGlzLmRpbGF0aW9uc18sIHRoaXMuYXV0b1BhZF8pO1xuICAgIGxldCBvdXRwdXQ7XG4gICAgaWYgKHRoaXMudHJhbnNwb3NlXyA9PT0gZmFsc2UpIHtcbiAgICAgIGlmICh0aGlzLmdyb3Vwc18gPT09IDEpIHtcbiAgICAgICAgb3V0cHV0ID0gdGYuZnVzZWQuY29udjJkKHtcbiAgICAgICAgICB4OiBpbnB1dCxcbiAgICAgICAgICBmaWx0ZXIsXG4gICAgICAgICAgc3RyaWRlczogdGhpcy5zdHJpZGVzXyxcbiAgICAgICAgICBwYWQ6IHBhZGRpbmcsXG4gICAgICAgICAgZGF0YUZvcm1hdDogJ05IV0MnLFxuICAgICAgICAgIGRpbGF0aW9uczogdGhpcy5kaWxhdGlvbnNfLFxuICAgICAgICAgIGJpYXMsXG4gICAgICAgICAgYWN0aXZhdGlvbjogdGhpcy5mdXNlZEFjdGl2YXRpb25fLFxuICAgICAgICAgIGxlYWt5cmVsdUFscGhhOiB0aGlzLmxlYWt5cmVsdUFscGhhX1xuICAgICAgICB9KTtcbiAgICAgICAgZnVzZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICB0aGlzLmdyb3Vwc18gPT09IGlucHV0Q2hhbm5lbHMgJiYgdGhpcy5ncm91cHNfID09PSBmaWx0ZXIuc2hhcGVbMl0pIHtcbiAgICAgICAgaWYgKHBhZGRpbmcgPT09ICd2YWxpZCcgfHwgcGFkZGluZyA9PT0gJ3NhbWUnIHx8XG4gICAgICAgICAgICAocGFkZGluZyBpbnN0YW5jZW9mIEFycmF5ICYmIHBhZGRpbmdbMV1bMF0gPT09IHBhZGRpbmdbMV1bMV0gJiZcbiAgICAgICAgICAgICBwYWRkaW5nWzFdWzBdID09PSBwYWRkaW5nWzJdWzBdICYmXG4gICAgICAgICAgICAgcGFkZGluZ1sxXVswXSA9PT0gcGFkZGluZ1syXVsxXSkpIHtcbiAgICAgICAgICBsZXQgZnVzZWREZXB0aHdpc2VQYWQ6ICd2YWxpZCd8J3NhbWUnfG51bWJlcjtcbiAgICAgICAgICBpZiAocGFkZGluZyA9PT0gJ3ZhbGlkJyB8fCBwYWRkaW5nID09PSAnc2FtZScpIHtcbiAgICAgICAgICAgIGZ1c2VkRGVwdGh3aXNlUGFkID0gcGFkZGluZztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZnVzZWREZXB0aHdpc2VQYWQgPSBwYWRkaW5nWzFdWzBdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvdXRwdXQgPSB0Zi5mdXNlZC5kZXB0aHdpc2VDb252MmQoe1xuICAgICAgICAgICAgeDogaW5wdXQsXG4gICAgICAgICAgICBmaWx0ZXIsXG4gICAgICAgICAgICBzdHJpZGVzOiB0aGlzLnN0cmlkZXNfLFxuICAgICAgICAgICAgcGFkOiBmdXNlZERlcHRod2lzZVBhZCxcbiAgICAgICAgICAgIGRhdGFGb3JtYXQ6ICdOSFdDJyxcbiAgICAgICAgICAgIGRpbGF0aW9uczogdGhpcy5kaWxhdGlvbnNfLFxuICAgICAgICAgICAgYmlhcyxcbiAgICAgICAgICAgIGFjdGl2YXRpb246IHRoaXMuZnVzZWRBY3RpdmF0aW9uXyxcbiAgICAgICAgICAgIGxlYWt5cmVsdUFscGhhOiB0aGlzLmxlYWt5cmVsdUFscGhhX1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGZ1c2VkID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXRwdXQgPSB0Zi5kZXB0aHdpc2VDb252MmQoXG4gICAgICAgICAgICAgIGlucHV0LCBmaWx0ZXIsIHRoaXMuc3RyaWRlc18sIHBhZGRpbmcsICdOSFdDJywgdGhpcy5kaWxhdGlvbnNfKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ1RoZSB0Zi5qcyBjb252b2x1dGlvbiBkb2VzblxcJ3Qgc3VwcG9ydCBncm91cHMgcGFyYW1ldGVyJyArXG4gICAgICAgICAgICBgICR7dGhpcy5ncm91cHNffWApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0cmFuc3Bvc2UgPT0gdHJ1ZVxuICAgICAgaWYgKHRoaXMuYXV0b1BhZF8gIT09IE1MQXV0b1BhZC5leHBsaWNpdCkge1xuICAgICAgICB0aGlzLm91dHB1dFNpemVzXyA9IFtcbiAgICAgICAgICBpbnB1dC5zaGFwZVsxXSAqIHRoaXMuc3RyaWRlc19bMF0sXG4gICAgICAgICAgaW5wdXQuc2hhcGVbMl0gKiB0aGlzLnN0cmlkZXNfWzFdLFxuICAgICAgICBdO1xuICAgICAgfVxuICAgICAgLy8gdGYuY29udjJkVHJhbnNwb3NlIG91dHB1dFNoYXBlOiBbYmF0Y2gsIGhlaWdodCwgd2lkdGgsIG91dERlcHRoXVxuICAgICAgY29uc3Qgb3V0cHV0U2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID1cbiAgICAgICAgICBbaW5wdXQuc2hhcGVbMF0sIDAsIDAsIGZpbHRlci5zaGFwZVsyXV07XG4gICAgICBpZiAodGhpcy5vdXRwdXRTaXplc18gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI7ICsraSkge1xuICAgICAgICAgIG91dHB1dFNoYXBlW2kgKyAxXSA9IHRoaXMuc3RyaWRlc19baV0gKiAoaW5wdXQuc2hhcGVbaSArIDFdIC0gMSkgK1xuICAgICAgICAgICAgICB0aGlzLm91dHB1dFBhZGRpbmdfW2ldICtcbiAgICAgICAgICAgICAgKChmaWx0ZXIuc2hhcGVbaV0gLSAxKSAqIHRoaXMuZGlsYXRpb25zX1tpXSArIDEpIC1cbiAgICAgICAgICAgICAgdGhpcy5wYWRkaW5nX1tpICogMl0gLSB0aGlzLnBhZGRpbmdfW2kgKiAyICsgMV07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dHB1dFNoYXBlWzFdID0gdGhpcy5vdXRwdXRTaXplc19bMF07XG4gICAgICAgIG91dHB1dFNoYXBlWzJdID0gdGhpcy5vdXRwdXRTaXplc19bMV07XG4gICAgICB9XG4gICAgICBvdXRwdXQgPSB0Zi5jb252MmRUcmFuc3Bvc2UoXG4gICAgICAgICAgaW5wdXQsIGZpbHRlciwgb3V0cHV0U2hhcGUsIHRoaXMuc3RyaWRlc18sIHBhZGRpbmcpO1xuICAgIH1cbiAgICBpZiAoIWZ1c2VkKSB7XG4gICAgICBpZiAoYmlhcykge1xuICAgICAgICAvLyBvdXRwdXQgaXMgc3RpbGwgbmh3Y1xuICAgICAgICBvdXRwdXQgPSB0Zi5hZGQob3V0cHV0LCBiaWFzKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmZ1c2VkQWN0aXZhdGlvbl8gPT09ICdyZWx1Jykge1xuICAgICAgICBvdXRwdXQgPSB0Zi5yZWx1KG91dHB1dCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZnVzZWRBY3RpdmF0aW9uXyA9PT0gJ3JlbHU2Jykge1xuICAgICAgICBvdXRwdXQgPSB0Zi5jbGlwQnlWYWx1ZShvdXRwdXQsIDAsIDYpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmZ1c2VkQWN0aXZhdGlvbl8gPT09ICdsZWFreXJlbHUnKSB7XG4gICAgICAgIG91dHB1dCA9IHRmLmxlYWt5UmVsdShvdXRwdXQsIHRoaXMubGVha3lyZWx1QWxwaGFfKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5mdXNlZEFjdGl2YXRpb25fID09PSAnc2lnbW9pZCcpIHtcbiAgICAgICAgb3V0cHV0ID0gdGYuc2lnbW9pZChvdXRwdXQpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmZ1c2VkQWN0aXZhdGlvbl8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB1dGlscy5hc3NlcnQoZmFsc2UsIGBUaGUgJHt0aGlzLmZ1c2VkQWN0aXZhdGlvbl99IGlzIHVuIHN1cHBvcnRlZC5gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuaW5wdXRMYXlvdXRfID09PSBNTElucHV0T3BlcmFuZExheW91dC5uY2h3KSB7XG4gICAgICAvLyBuaHdjIC0+IG5jaHdcbiAgICAgIG91dHB1dCA9IHRmLnRyYW5zcG9zZShvdXRwdXQsIFswLCAzLCAxLCAyXSk7XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cblxuICBkaXNwb3NlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZpbHRlclRlbnNvcl8pIHtcbiAgICAgIHRmLmRpc3Bvc2UodGhpcy5maWx0ZXJUZW5zb3JfKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7TUxHZW1tT3B0aW9ucywgTUxHcmFwaEJ1aWxkZXJ9IGZyb20gJy4uL2dyYXBoX2J1aWxkZXInO1xuaW1wb3J0IHtNTE9wZXJhbmR9IGZyb20gJy4uL29wZXJhbmQnO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgR2VtbSB7XG4gIHN0YXRpYyBidWlsZChcbiAgICAgIGJ1aWxkZXI6IE1MR3JhcGhCdWlsZGVyLCBhOiBNTE9wZXJhbmQsIGI6IE1MT3BlcmFuZCxcbiAgICAgIG9wdGlvbnM6IE1MR2VtbU9wdGlvbnMgPSB7fSk6IE1MT3BlcmFuZCB7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKGEpO1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZChiKTtcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIG9wdGlvbnMuYyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zLmMgPT09ICdudW1iZXInIHx8XG4gICAgICAgICAgICBvcHRpb25zLmMgaW5zdGFuY2VvZiBNTE9wZXJhbmQsXG4gICAgICAgICdUaGUgb3B0aW9ucy5jIGlzIGludmFsaWQuJyk7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICBvcHRpb25zLmFUcmFuc3Bvc2UgPT09IHVuZGVmaW5lZCB8fCB1dGlscy5pc0Jvb2xlYW4ob3B0aW9ucy5hVHJhbnNwb3NlKSxcbiAgICAgICAgJ1RoZSBvcHRpb25zLmFUcmFuc3Bvc2UgaXMgaW52YWxpZC4nKTtcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIG9wdGlvbnMuYlRyYW5zcG9zZSA9PT0gdW5kZWZpbmVkIHx8IHV0aWxzLmlzQm9vbGVhbihvcHRpb25zLmJUcmFuc3Bvc2UpLFxuICAgICAgICAnVGhlIG9wdGlvbnMuYlRyYW5zcG9zZSBpcyBpbnZhbGlkLicpO1xuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgb3B0aW9ucy5hbHBoYSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zLmFscGhhID09PSAnbnVtYmVyJyxcbiAgICAgICAgJ1RoZSBvcHRpb25zLmFscGhhIGlzIGludmFsaWQuJyk7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICBvcHRpb25zLmJldGEgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2Ygb3B0aW9ucy5iZXRhID09PSAnbnVtYmVyJyxcbiAgICAgICAgJ1RoZSBvcHRpb25zLmJldGEgaXMgaW52YWxpZC4nKTtcblxuICAgIC8vIGJ1aWxkIGdyYXBoXG4gICAgaWYgKG9wdGlvbnMuYVRyYW5zcG9zZSkge1xuICAgICAgYSA9IGJ1aWxkZXIudHJhbnNwb3NlKGEpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmJUcmFuc3Bvc2UpIHtcbiAgICAgIGIgPSBidWlsZGVyLnRyYW5zcG9zZShiKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbHBoYSA9XG4gICAgICAgIGJ1aWxkZXIuY29uc3RhbnQob3B0aW9ucy5hbHBoYSA9PT0gdW5kZWZpbmVkID8gMS4wIDogb3B0aW9ucy5hbHBoYSk7XG4gICAgY29uc3QgYmV0YSA9XG4gICAgICAgIGJ1aWxkZXIuY29uc3RhbnQob3B0aW9ucy5iZXRhID09PSB1bmRlZmluZWQgPyAxLjAgOiBvcHRpb25zLmJldGEpO1xuXG4gICAgY29uc3QgYWIgPSBidWlsZGVyLm1hdG11bChidWlsZGVyLm11bChhbHBoYSwgYSksIGIpO1xuICAgIHJldHVybiAob3B0aW9ucy5jID8gYnVpbGRlci5hZGQoYWIsIGJ1aWxkZXIubXVsKGJldGEsIG9wdGlvbnMuYykpIDogYWIpO1xuICB9XG59IiwiaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNTEdydUNlbGxPcHRpb25zLCBNTEdydU9wdGlvbnMsIE1MUmVjdXJyZW50TmV0d29ya0RpcmVjdGlvbiwgTUxSZWN1cnJlbnROZXR3b3JrV2VpZ2h0TGF5b3V0fSBmcm9tICcuLi9ncmFwaF9idWlsZGVyJztcbmltcG9ydCB7TUxPcGVyYW5kLCBPdXRwdXRPcGVyYW5kfSBmcm9tICcuLi9vcGVyYW5kJztcbmltcG9ydCB7TUxPcGVyYXRvciwgT3BlcmF0aW9uLCBTaW5nbGVPdXRwdXRPcGVyYXRpb259IGZyb20gJy4uL29wZXJhdGlvbic7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQge1VuYXJ5TUxPcGVyYXRvcn0gZnJvbSAnLi91bmFyeSc7XG5cbmV4cG9ydCBjbGFzcyBHcnUgZXh0ZW5kcyBPcGVyYXRpb24ge1xuICBwcml2YXRlIGlucHV0XzogTUxPcGVyYW5kO1xuICBwcml2YXRlIHdlaWdodF86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSByZWN1cnJlbnRXZWlnaHRfOiBNTE9wZXJhbmQ7XG4gIHByaXZhdGUgc3RlcHNfOiBudW1iZXI7XG4gIHByaXZhdGUgaGlkZGVuU2l6ZV86IG51bWJlcjtcbiAgcHJpdmF0ZSBiaWFzXz86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSByZWN1cnJlbnRCaWFzXz86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSBpbml0aWFsSGlkZGVuU3RhdGVfPzogTUxPcGVyYW5kO1xuICBwcml2YXRlIHJlc2V0QWZ0ZXJfOiBib29sZWFuO1xuICBwcml2YXRlIHJldHVyblNlcXVlbmNlXzogYm9vbGVhbjtcbiAgcHJpdmF0ZSBkaXJlY3Rpb25fOiBNTFJlY3VycmVudE5ldHdvcmtEaXJlY3Rpb247XG4gIHByaXZhdGUgbGF5b3V0XzogTUxSZWN1cnJlbnROZXR3b3JrV2VpZ2h0TGF5b3V0O1xuICBwcml2YXRlIGFjdGl2YXRpb25zXzogTUxPcGVyYXRvcltdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgaW5wdXQ6IE1MT3BlcmFuZCwgd2VpZ2h0OiBNTE9wZXJhbmQsIHJlY3VycmVudFdlaWdodDogTUxPcGVyYW5kLFxuICAgICAgc3RlcHM6IG51bWJlciwgaGlkZGVuU2l6ZTogbnVtYmVyLCBvcHRpb25zOiBNTEdydU9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKGlucHV0LmJ1aWxkZXIpO1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZChpbnB1dCk7XG4gICAgdGhpcy5pbnB1dF8gPSBpbnB1dDtcbiAgICB1dGlscy52YWxpZGF0ZU9wZXJhbmQod2VpZ2h0KTtcbiAgICB0aGlzLndlaWdodF8gPSB3ZWlnaHQ7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKHJlY3VycmVudFdlaWdodCk7XG4gICAgdGhpcy5yZWN1cnJlbnRXZWlnaHRfID0gcmVjdXJyZW50V2VpZ2h0O1xuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgdXRpbHMuaXNJbnRlZ2VyKHN0ZXBzKSAmJiBzdGVwcyA+IDAsICdUaGUgc3RlcHMgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5zdGVwc18gPSBzdGVwcztcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIHV0aWxzLmlzSW50ZWdlcihoaWRkZW5TaXplKSAmJiBoaWRkZW5TaXplID4gMCxcbiAgICAgICAgJ1RoZSBoaWRkZW5TaXplIHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgIHRoaXMuaGlkZGVuU2l6ZV8gPSBoaWRkZW5TaXplO1xuICAgIHRoaXMuaW5pdE9wdGlvbnMoXG4gICAgICAgIG9wdGlvbnMuYmlhcywgb3B0aW9ucy5yZWN1cnJlbnRCaWFzLCBvcHRpb25zLmluaXRpYWxIaWRkZW5TdGF0ZSxcbiAgICAgICAgb3B0aW9ucy5yZXNldEFmdGVyLCBvcHRpb25zLnJldHVyblNlcXVlbmNlLCBvcHRpb25zLmRpcmVjdGlvbixcbiAgICAgICAgb3B0aW9ucy5sYXlvdXQsIG9wdGlvbnMuYWN0aXZhdGlvbnMpO1xuXG4gICAgdGhpcy5vdXRwdXRzLnB1c2gobmV3IE91dHB1dE9wZXJhbmQodGhpcykpO1xuICAgIGlmICh0aGlzLnJldHVyblNlcXVlbmNlXykge1xuICAgICAgdGhpcy5vdXRwdXRzXy5wdXNoKG5ldyBPdXRwdXRPcGVyYW5kKHRoaXMpKTtcbiAgICB9XG4gIH1cblxuICBpbml0T3B0aW9ucyhcbiAgICAgIGJpYXM/OiBNTE9wZXJhbmQsIHJlY3VycmVudEJpYXM/OiBNTE9wZXJhbmQsXG4gICAgICBpbml0aWFsSGlkZGVuU3RhdGU/OiBNTE9wZXJhbmQsIHJlc2V0QWZ0ZXIgPSB0cnVlLCByZXR1cm5TZXF1ZW5jZSA9IGZhbHNlLFxuICAgICAgZGlyZWN0aW9uOlxuICAgICAgICAgIE1MUmVjdXJyZW50TmV0d29ya0RpcmVjdGlvbiA9IE1MUmVjdXJyZW50TmV0d29ya0RpcmVjdGlvbi5mb3J3YXJkLFxuICAgICAgbGF5b3V0OlxuICAgICAgICAgIE1MUmVjdXJyZW50TmV0d29ya1dlaWdodExheW91dCA9IE1MUmVjdXJyZW50TmV0d29ya1dlaWdodExheW91dC56cm4sXG4gICAgICBhY3RpdmF0aW9uczpcbiAgICAgICAgICBNTE9wZXJhdG9yW10gPSBbdGhpcy5idWlsZGVyLnNpZ21vaWQoKSwgdGhpcy5idWlsZGVyLnRhbmgoKV0pOiB2b2lkIHtcbiAgICB1dGlscy52YWxpZGF0ZU9wdGlvbmFsT3BlcmFuZChiaWFzKTtcbiAgICB0aGlzLmJpYXNfID0gYmlhcztcbiAgICB1dGlscy52YWxpZGF0ZU9wdGlvbmFsT3BlcmFuZChyZWN1cnJlbnRCaWFzKTtcbiAgICB0aGlzLnJlY3VycmVudEJpYXNfID0gcmVjdXJyZW50QmlhcztcbiAgICB1dGlscy52YWxpZGF0ZU9wdGlvbmFsT3BlcmFuZChpbml0aWFsSGlkZGVuU3RhdGUpO1xuICAgIHRoaXMuaW5pdGlhbEhpZGRlblN0YXRlXyA9IGluaXRpYWxIaWRkZW5TdGF0ZTtcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIHV0aWxzLmlzQm9vbGVhbihyZXNldEFmdGVyKSxcbiAgICAgICAgJ1RoZSByZXNldEFmdGVyIHBhcmFtZXRlciBpcyBub3QgYSBib29sZWFuLicpO1xuICAgIHRoaXMucmVzZXRBZnRlcl8gPSByZXNldEFmdGVyO1xuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgdXRpbHMuaXNCb29sZWFuKHJldHVyblNlcXVlbmNlKSxcbiAgICAgICAgJ1RoZSByZXNldEFmdGVyIHBhcmFtZXRlciBpcyBub3QgYSBib29sZWFuLicpO1xuICAgIHRoaXMucmV0dXJuU2VxdWVuY2VfID0gcmV0dXJuU2VxdWVuY2U7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICBkaXJlY3Rpb24gaW4gTUxSZWN1cnJlbnROZXR3b3JrRGlyZWN0aW9uLFxuICAgICAgICAnVGhlIGRpcmVjdGlvbiBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICB0aGlzLmRpcmVjdGlvbl8gPSBkaXJlY3Rpb247XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICBsYXlvdXQgaW4gTUxSZWN1cnJlbnROZXR3b3JrV2VpZ2h0TGF5b3V0LFxuICAgICAgICAnVGhlIGxheW91dCBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICB0aGlzLmxheW91dF8gPSBsYXlvdXQ7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICBhY3RpdmF0aW9ucyBpbnN0YW5jZW9mIEFycmF5ICYmIGFjdGl2YXRpb25zLmxlbmd0aCA9PT0gMiAmJlxuICAgICAgICAgICAgYWN0aXZhdGlvbnMuZXZlcnkoYSA9PiBhIGluc3RhbmNlb2YgVW5hcnlNTE9wZXJhdG9yKSxcbiAgICAgICAgJ1RoZSBhY3RpdmF0aW9ucyBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICB0aGlzLmFjdGl2YXRpb25zXyA9IGFjdGl2YXRpb25zO1xuICB9XG5cbiAgaW5wdXRzKCk6IE1MT3BlcmFuZFtdIHtcbiAgICBjb25zdCBpbnB1dHM6IE1MT3BlcmFuZFtdID1cbiAgICAgICAgW3RoaXMuaW5wdXRfLCB0aGlzLndlaWdodF8sIHRoaXMucmVjdXJyZW50V2VpZ2h0X107XG4gICAgaWYgKHRoaXMuYmlhc18pIHtcbiAgICAgIGlucHV0cy5wdXNoKHRoaXMuYmlhc18pO1xuICAgIH1cbiAgICBpZiAodGhpcy5yZWN1cnJlbnRCaWFzXykge1xuICAgICAgaW5wdXRzLnB1c2godGhpcy5yZWN1cnJlbnRCaWFzXyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmluaXRpYWxIaWRkZW5TdGF0ZV8pIHtcbiAgICAgIGlucHV0cy5wdXNoKHRoaXMuaW5pdGlhbEhpZGRlblN0YXRlXyk7XG4gICAgfVxuICAgIHJldHVybiBpbnB1dHM7XG4gIH1cblxuICBjb21wdXRlSW1wbChpbnB1dFRlbnNvcnM6IE1hcDxNTE9wZXJhbmQsIHRmLlRlbnNvcj4pOiB0Zi5UZW5zb3JbXSB7XG4gICAgY29uc3QgaW5wdXQgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuaW5wdXRfKTtcbiAgICBjb25zdCB3ZWlnaHQgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMud2VpZ2h0Xyk7XG4gICAgY29uc3QgcmVjdXJyZW50V2VpZ2h0ID0gaW5wdXRUZW5zb3JzLmdldCh0aGlzLnJlY3VycmVudFdlaWdodF8pO1xuICAgIGNvbnN0IGJpYXMgPSB0aGlzLmJpYXNfID8gaW5wdXRUZW5zb3JzLmdldCh0aGlzLmJpYXNfKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCByZWN1cnJlbnRCaWFzID0gdGhpcy5yZWN1cnJlbnRXZWlnaHRfID9cbiAgICAgICAgaW5wdXRUZW5zb3JzLmdldCh0aGlzLnJlY3VycmVudEJpYXNfKSA6XG4gICAgICAgIHVuZGVmaW5lZDtcbiAgICBjb25zdCBpbml0aWFsSGlkZGVuU3RhdGUgPSB0aGlzLmluaXRpYWxIaWRkZW5TdGF0ZV8gP1xuICAgICAgICBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuaW5pdGlhbEhpZGRlblN0YXRlXykgOlxuICAgICAgICB1bmRlZmluZWQ7XG4gICAgY29uc3Qgc3RlcHMgPSB0aGlzLnN0ZXBzXztcbiAgICBjb25zdCBoaWRkZW5TaXplID0gdGhpcy5oaWRkZW5TaXplXztcbiAgICBjb25zdCByZXNldEFmdGVyID0gdGhpcy5yZXNldEFmdGVyXztcbiAgICBjb25zdCByZXR1cm5TZXF1ZW5jZSA9IHRoaXMucmV0dXJuU2VxdWVuY2VfO1xuICAgIGNvbnN0IGxheW91dCA9IHRoaXMubGF5b3V0XztcbiAgICBjb25zdCBhY3RpdmF0aW9ucyA9IHRoaXMuYWN0aXZhdGlvbnNfO1xuICAgIGNvbnN0IGRpcmVjdGlvbiA9IHRoaXMuZGlyZWN0aW9uXztcblxuICAgIGNvbnN0IG51bURpcmVjdGlvbnMgPVxuICAgICAgICAoZGlyZWN0aW9uID09PSBNTFJlY3VycmVudE5ldHdvcmtEaXJlY3Rpb24uYm90aCA/IDIgOiAxKTtcbiAgICBsZXQgaGlkZGVuU3RhdGUgPSBpbml0aWFsSGlkZGVuU3RhdGU7XG5cbiAgICBpZiAoaGlkZGVuU3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaGlkZGVuU3RhdGUgPSB0Zi56ZXJvcyhbbnVtRGlyZWN0aW9ucywgMSwgaGlkZGVuU2l6ZV0pO1xuICAgIH1cblxuICAgIGxldCBzZXF1ZW5jZTogdGYuVGVuc29yO1xuICAgIGNvbnN0IGNlbGxXZWlnaHQ6IHRmLlRlbnNvcltdID0gW107XG4gICAgY29uc3QgY2VsbFJlY3VycmVudFdlaWdodDogdGYuVGVuc29yW10gPSBbXTtcbiAgICBjb25zdCBjZWxsQmlhczogdGYuVGVuc29yW10gPSBbXTtcbiAgICBjb25zdCBjZWxsUmVjdXJyZW50QmlhczogdGYuVGVuc29yW10gPSBbXTtcblxuICAgIGZvciAobGV0IHNsb3QgPSAwOyBzbG90IDwgbnVtRGlyZWN0aW9uczsgKytzbG90KSB7XG4gICAgICBjZWxsV2VpZ2h0LnB1c2goXG4gICAgICAgICAgdGYuc3F1ZWV6ZSh0Zi5zbGljZSh3ZWlnaHQsIFtzbG90LCAwLCAwXSwgWzEsIC0xLCAtMV0pLCBbMF0pKTtcbiAgICAgIGNlbGxSZWN1cnJlbnRXZWlnaHQucHVzaCh0Zi5zcXVlZXplKFxuICAgICAgICAgIHRmLnNsaWNlKHJlY3VycmVudFdlaWdodCwgW3Nsb3QsIDAsIDBdLCBbMSwgLTEsIC0xXSksIFswXSkpO1xuICAgICAgY2VsbEJpYXMucHVzaChcbiAgICAgICAgICBiaWFzID8gKHRmLnNxdWVlemUodGYuc2xpY2UoYmlhcywgW3Nsb3QsIDBdLCBbMSwgLTFdKSwgWzBdKSkgOlxuICAgICAgICAgICAgICAgICB1bmRlZmluZWQpO1xuICAgICAgY2VsbFJlY3VycmVudEJpYXMucHVzaChcbiAgICAgICAgICByZWN1cnJlbnRCaWFzID9cbiAgICAgICAgICAgICAgKHRmLnNxdWVlemUodGYuc2xpY2UocmVjdXJyZW50QmlhcywgW3Nsb3QsIDBdLCBbMSwgLTFdKSwgWzBdKSkgOlxuICAgICAgICAgICAgICB1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIGZvciAobGV0IHN0ZXAgPSAwOyBzdGVwIDwgc3RlcHM7ICsrc3RlcCkge1xuICAgICAgY29uc3QgY2VsbEhpZGRlbjogdGYuVGVuc29yW10gPSBbXTtcbiAgICAgIGxldCBjZWxsT3V0cHV0OiB0Zi5UZW5zb3I7XG5cbiAgICAgIGZvciAobGV0IHNsb3QgPSAwOyBzbG90IDwgbnVtRGlyZWN0aW9uczsgKytzbG90KSB7XG4gICAgICAgIGNlbGxIaWRkZW4ucHVzaChcbiAgICAgICAgICAgIHRmLnNxdWVlemUodGYuc2xpY2UoaGlkZGVuU3RhdGUsIFtzbG90LCAwLCAwXSwgWzEsIC0xLCAtMV0pLCBbMF0pKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgc2xvdCA9IDA7IHNsb3QgPCBudW1EaXJlY3Rpb25zOyArK3Nsb3QpIHtcbiAgICAgICAgY29uc3Qgc2xpY2UgPVxuICAgICAgICAgICAgKHNsb3QgPT09IDEgfHwgZGlyZWN0aW9uID09PSBNTFJlY3VycmVudE5ldHdvcmtEaXJlY3Rpb24uYmFja3dhcmQgP1xuICAgICAgICAgICAgICAgICBzdGVwcyAtIHN0ZXAgLSAxIDpcbiAgICAgICAgICAgICAgICAgc3RlcCk7XG4gICAgICAgIGNvbnN0IGNlbGxJbnB1dCA9XG4gICAgICAgICAgICB0Zi5zcXVlZXplKHRmLnNsaWNlKGlucHV0LCBbc2xpY2UsIDAsIDBdLCBbMSwgLTEsIC0xXSksIFswXSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGYucmVzaGFwZShcbiAgICAgICAgICAgIEdydUNlbGwuY29tcHV0ZShcbiAgICAgICAgICAgICAgICBjZWxsSW5wdXQsIGNlbGxXZWlnaHRbc2xvdF0sIGNlbGxSZWN1cnJlbnRXZWlnaHRbc2xvdF0sXG4gICAgICAgICAgICAgICAgY2VsbEhpZGRlbltzbG90XSwgaGlkZGVuU2l6ZSwgYWN0aXZhdGlvbnMsIGNlbGxCaWFzW3Nsb3RdLFxuICAgICAgICAgICAgICAgIGNlbGxSZWN1cnJlbnRCaWFzW3Nsb3RdLCByZXNldEFmdGVyLCBsYXlvdXQpLFxuICAgICAgICAgICAgWzEsIC0xLCBoaWRkZW5TaXplXSk7XG5cbiAgICAgICAgY2VsbE91dHB1dCA9IChjZWxsT3V0cHV0ID8gdGYuY29uY2F0KFtjZWxsT3V0cHV0LCByZXN1bHRdLCAwKSA6IHJlc3VsdCk7XG4gICAgICB9XG5cbiAgICAgIGhpZGRlblN0YXRlID0gY2VsbE91dHB1dDtcblxuICAgICAgaWYgKHJldHVyblNlcXVlbmNlKSB7XG4gICAgICAgIGNlbGxPdXRwdXQgPSB0Zi5yZXNoYXBlKGNlbGxPdXRwdXQsIFsxLCBudW1EaXJlY3Rpb25zLCAtMSwgaGlkZGVuU2l6ZV0pO1xuICAgICAgICBzZXF1ZW5jZSA9XG4gICAgICAgICAgICAoc2VxdWVuY2UgPyB0Zi5jb25jYXQoW3NlcXVlbmNlLCBjZWxsT3V0cHV0XSwgMCkgOiBjZWxsT3V0cHV0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gW2hpZGRlblN0YXRlLCBzZXF1ZW5jZV07XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdydUNlbGwgZXh0ZW5kcyBTaW5nbGVPdXRwdXRPcGVyYXRpb24ge1xuICBwcml2YXRlIGlucHV0XzogTUxPcGVyYW5kO1xuICBwcml2YXRlIHdlaWdodF86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSByZWN1cnJlbnRXZWlnaHRfOiBNTE9wZXJhbmQ7XG4gIHByaXZhdGUgaGlkZGVuU3RhdGVfOiBNTE9wZXJhbmQ7XG4gIHByaXZhdGUgaGlkZGVuU2l6ZV86IG51bWJlcjtcbiAgcHJpdmF0ZSBiaWFzXz86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSByZWN1cnJlbnRCaWFzXz86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSByZXNldEFmdGVyXzogYm9vbGVhbjtcbiAgcHJpdmF0ZSBsYXlvdXRfOiBNTFJlY3VycmVudE5ldHdvcmtXZWlnaHRMYXlvdXQ7XG4gIHByaXZhdGUgYWN0aXZhdGlvbnNfOiBNTE9wZXJhdG9yW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBpbnB1dDogTUxPcGVyYW5kLCB3ZWlnaHQ6IE1MT3BlcmFuZCwgcmVjdXJyZW50V2VpZ2h0OiBNTE9wZXJhbmQsXG4gICAgICBoaWRkZW5TdGF0ZTogTUxPcGVyYW5kLCBoaWRkZW5TaXplOiBudW1iZXIsXG4gICAgICBvcHRpb25zOiBNTEdydUNlbGxPcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihpbnB1dC5idWlsZGVyKTtcbiAgICB1dGlscy52YWxpZGF0ZU9wZXJhbmQoaW5wdXQpO1xuICAgIHRoaXMuaW5wdXRfID0gaW5wdXQ7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKHdlaWdodCk7XG4gICAgdGhpcy53ZWlnaHRfID0gd2VpZ2h0O1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZChyZWN1cnJlbnRXZWlnaHQpO1xuICAgIHRoaXMucmVjdXJyZW50V2VpZ2h0XyA9IHJlY3VycmVudFdlaWdodDtcbiAgICB1dGlscy52YWxpZGF0ZU9wZXJhbmQoaGlkZGVuU3RhdGUpO1xuICAgIHRoaXMuaGlkZGVuU3RhdGVfID0gaGlkZGVuU3RhdGU7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICB1dGlscy5pc0ludGVnZXIoaGlkZGVuU2l6ZSkgJiYgaGlkZGVuU2l6ZSA+IDAsXG4gICAgICAgICdUaGUgaGlkZGVuU2l6ZSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICB0aGlzLmhpZGRlblNpemVfID0gaGlkZGVuU2l6ZTtcbiAgICB0aGlzLmluaXRPcHRpb25zKFxuICAgICAgICBvcHRpb25zLmJpYXMsIG9wdGlvbnMucmVjdXJyZW50Qmlhcywgb3B0aW9ucy5yZXNldEFmdGVyLCBvcHRpb25zLmxheW91dCxcbiAgICAgICAgb3B0aW9ucy5hY3RpdmF0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIGluaXRPcHRpb25zKFxuICAgICAgYmlhcz86IE1MT3BlcmFuZCwgcmVjdXJyZW50Qmlhcz86IE1MT3BlcmFuZCwgcmVzZXRBZnRlciA9IHRydWUsXG4gICAgICBsYXlvdXQ6XG4gICAgICAgICAgTUxSZWN1cnJlbnROZXR3b3JrV2VpZ2h0TGF5b3V0ID0gTUxSZWN1cnJlbnROZXR3b3JrV2VpZ2h0TGF5b3V0LnpybixcbiAgICAgIGFjdGl2YXRpb25zOlxuICAgICAgICAgIE1MT3BlcmF0b3JbXSA9IFt0aGlzLmJ1aWxkZXIuc2lnbW9pZCgpLCB0aGlzLmJ1aWxkZXIudGFuaCgpXSkge1xuICAgIHV0aWxzLnZhbGlkYXRlT3B0aW9uYWxPcGVyYW5kKGJpYXMpO1xuICAgIHRoaXMuYmlhc18gPSBiaWFzO1xuICAgIHV0aWxzLnZhbGlkYXRlT3B0aW9uYWxPcGVyYW5kKHJlY3VycmVudEJpYXMpO1xuICAgIHRoaXMucmVjdXJyZW50Qmlhc18gPSByZWN1cnJlbnRCaWFzO1xuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgdXRpbHMuaXNCb29sZWFuKHJlc2V0QWZ0ZXIpLFxuICAgICAgICAnVGhlIHJlc2V0QWZ0ZXIgcGFyYW1ldGVyIGlzIG5vdCBhIGJvb2xlYW4uJyk7XG4gICAgdGhpcy5yZXNldEFmdGVyXyA9IHJlc2V0QWZ0ZXI7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICBsYXlvdXQgaW4gTUxSZWN1cnJlbnROZXR3b3JrV2VpZ2h0TGF5b3V0LFxuICAgICAgICAnVGhlIGxheW91dCBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICB0aGlzLmxheW91dF8gPSBsYXlvdXQ7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICBhY3RpdmF0aW9ucyBpbnN0YW5jZW9mIEFycmF5ICYmIGFjdGl2YXRpb25zLmxlbmd0aCA9PT0gMiAmJlxuICAgICAgICAgICAgYWN0aXZhdGlvbnMuZXZlcnkoYSA9PiBhIGluc3RhbmNlb2YgVW5hcnlNTE9wZXJhdG9yKSxcbiAgICAgICAgJ1RoZSBhY3RpdmF0aW9ucyBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICB0aGlzLmFjdGl2YXRpb25zXyA9IGFjdGl2YXRpb25zO1xuICB9XG5cbiAgaW5wdXRzKCk6IE1MT3BlcmFuZFtdIHtcbiAgICBjb25zdCBpbnB1dHM6IE1MT3BlcmFuZFtdID1cbiAgICAgICAgW3RoaXMuaW5wdXRfLCB0aGlzLndlaWdodF8sIHRoaXMucmVjdXJyZW50V2VpZ2h0XywgdGhpcy5oaWRkZW5TdGF0ZV9dO1xuICAgIGlmICh0aGlzLmJpYXNfKSB7XG4gICAgICBpbnB1dHMucHVzaCh0aGlzLmJpYXNfKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucmVjdXJyZW50Qmlhc18pIHtcbiAgICAgIGlucHV0cy5wdXNoKHRoaXMucmVjdXJyZW50Qmlhc18pO1xuICAgIH1cbiAgICByZXR1cm4gaW5wdXRzO1xuICB9XG5cbiAgc3RhdGljIGNvbXB1dGUoXG4gICAgICBpbnB1dDogdGYuVGVuc29yLCB3ZWlnaHQ6IHRmLlRlbnNvciwgcmVjdXJyZW50V2VpZ2h0OiB0Zi5UZW5zb3IsXG4gICAgICBoaWRkZW5TdGF0ZTogdGYuVGVuc29yLCBoaWRkZW5TaXplOiBudW1iZXIsIGFjdGl2YXRpb25zOiBNTE9wZXJhdG9yW10sXG4gICAgICBiaWFzPzogdGYuVGVuc29yLCByZWN1cnJlbnRCaWFzPzogdGYuVGVuc29yLCByZXNldEFmdGVyID0gdHJ1ZSxcbiAgICAgIGxheW91dDpcbiAgICAgICAgICBNTFJlY3VycmVudE5ldHdvcmtXZWlnaHRMYXlvdXQgPSBNTFJlY3VycmVudE5ldHdvcmtXZWlnaHRMYXlvdXQuenJuKTpcbiAgICAgIHRmLlRlbnNvciB7XG4gICAgY29uc3Qgb25lID0gdGYuc2NhbGFyKDEpO1xuICAgIGNvbnN0IHplcm8gPSB0Zi5zY2FsYXIoMCk7XG4gICAgY29uc3Qgc3RhcnRzID0gbGF5b3V0ID09PSBNTFJlY3VycmVudE5ldHdvcmtXZWlnaHRMYXlvdXQuenJuID9cbiAgICAgICAge3o6IDAsIHI6IGhpZGRlblNpemUsIG46IDIgKiBoaWRkZW5TaXplfSA6XG4gICAgICAgIC8qcnpuKi8ge3I6IDAsIHo6IGhpZGRlblNpemUsIG46IDIgKiBoaWRkZW5TaXplfTtcbiAgICBjb25zdCBhY3RpdmF0aW9uMDogVW5hcnlNTE9wZXJhdG9yID0gYWN0aXZhdGlvbnNbMF0gYXMgVW5hcnlNTE9wZXJhdG9yO1xuICAgIGNvbnN0IGFjdGl2YXRpb24xOiBVbmFyeU1MT3BlcmF0b3IgPSBhY3RpdmF0aW9uc1sxXSBhcyBVbmFyeU1MT3BlcmF0b3I7XG4gICAgLy8gdXBkYXRlIGdhdGVcbiAgICBjb25zdCB6ID0gYWN0aXZhdGlvbjAucnVuT3AodGYuYWRkKFxuICAgICAgICB0Zi5hZGQoXG4gICAgICAgICAgICAoYmlhcyA/IHRmLnNsaWNlKGJpYXMsIFtzdGFydHMuel0sIFtoaWRkZW5TaXplXSkgOiB6ZXJvKSxcbiAgICAgICAgICAgIChyZWN1cnJlbnRCaWFzID8gdGYuc2xpY2UocmVjdXJyZW50QmlhcywgW3N0YXJ0cy56XSwgW2hpZGRlblNpemVdKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHplcm8pKSxcbiAgICAgICAgdGYuYWRkKFxuICAgICAgICAgICAgdGYubWF0TXVsKFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIHRmLnRyYW5zcG9zZShcbiAgICAgICAgICAgICAgICAgICAgdGYuc2xpY2Uod2VpZ2h0LCBbc3RhcnRzLnosIDBdLCBbaGlkZGVuU2l6ZSwgLTFdKSkpLFxuICAgICAgICAgICAgdGYubWF0TXVsKFxuICAgICAgICAgICAgICAgIGhpZGRlblN0YXRlLFxuICAgICAgICAgICAgICAgIHRmLnRyYW5zcG9zZSh0Zi5zbGljZShcbiAgICAgICAgICAgICAgICAgICAgcmVjdXJyZW50V2VpZ2h0LCBbc3RhcnRzLnosIDBdLCBbaGlkZGVuU2l6ZSwgLTFdKSkpKSkpO1xuICAgIC8vIHJlc2V0IGdhdGVcbiAgICBjb25zdCByID0gYWN0aXZhdGlvbjAucnVuT3AodGYuYWRkKFxuICAgICAgICB0Zi5hZGQoXG4gICAgICAgICAgICAoYmlhcyA/IHRmLnNsaWNlKGJpYXMsIFtzdGFydHMucl0sIFtoaWRkZW5TaXplXSkgOiB6ZXJvKSxcbiAgICAgICAgICAgIChyZWN1cnJlbnRCaWFzID8gdGYuc2xpY2UocmVjdXJyZW50QmlhcywgW3N0YXJ0cy5yXSwgW2hpZGRlblNpemVdKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHplcm8pKSxcbiAgICAgICAgdGYuYWRkKFxuICAgICAgICAgICAgdGYubWF0TXVsKFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIHRmLnRyYW5zcG9zZShcbiAgICAgICAgICAgICAgICAgICAgdGYuc2xpY2Uod2VpZ2h0LCBbc3RhcnRzLnIsIDBdLCBbaGlkZGVuU2l6ZSwgLTFdKSkpLFxuICAgICAgICAgICAgdGYubWF0TXVsKFxuICAgICAgICAgICAgICAgIGhpZGRlblN0YXRlLFxuICAgICAgICAgICAgICAgIHRmLnRyYW5zcG9zZSh0Zi5zbGljZShcbiAgICAgICAgICAgICAgICAgICAgcmVjdXJyZW50V2VpZ2h0LCBbc3RhcnRzLnIsIDBdLCBbaGlkZGVuU2l6ZSwgLTFdKSkpKSkpO1xuICAgIC8vIG5ldyBnYXRlXG4gICAgbGV0IG47XG4gICAgaWYgKHJlc2V0QWZ0ZXIpIHtcbiAgICAgIG4gPSBhY3RpdmF0aW9uMS5ydW5PcCh0Zi5hZGQoXG4gICAgICAgICAgKGJpYXMgPyB0Zi5zbGljZShiaWFzLCBbc3RhcnRzLm5dLCBbaGlkZGVuU2l6ZV0pIDogemVybyksXG4gICAgICAgICAgdGYuYWRkKFxuICAgICAgICAgICAgICB0Zi5tYXRNdWwoXG4gICAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICAgIHRmLnRyYW5zcG9zZShcbiAgICAgICAgICAgICAgICAgICAgICB0Zi5zbGljZSh3ZWlnaHQsIFtzdGFydHMubiwgMF0sIFtoaWRkZW5TaXplLCAtMV0pKSksXG4gICAgICAgICAgICAgIHRmLm11bChcbiAgICAgICAgICAgICAgICAgIHIsXG4gICAgICAgICAgICAgICAgICB0Zi5hZGQoXG4gICAgICAgICAgICAgICAgICAgICAgKHJlY3VycmVudEJpYXMgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgdGYuc2xpY2UocmVjdXJyZW50QmlhcywgW3N0YXJ0cy5uXSwgW2hpZGRlblNpemVdKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICB6ZXJvKSxcbiAgICAgICAgICAgICAgICAgICAgICB0Zi5tYXRNdWwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlblN0YXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0Zi50cmFuc3Bvc2UodGYuc2xpY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN1cnJlbnRXZWlnaHQsIFtzdGFydHMubiwgMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZGVuU2l6ZSwgLTFdKSkpKSkpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG4gPSBhY3RpdmF0aW9uMS5ydW5PcCh0Zi5hZGQoXG4gICAgICAgICAgdGYuYWRkKFxuICAgICAgICAgICAgICAoYmlhcyA/IHRmLnNsaWNlKGJpYXMsIFtzdGFydHMubl0sIFtoaWRkZW5TaXplXSkgOiB6ZXJvKSxcbiAgICAgICAgICAgICAgKHJlY3VycmVudEJpYXMgP1xuICAgICAgICAgICAgICAgICAgIHRmLnNsaWNlKHJlY3VycmVudEJpYXMsIFtzdGFydHMubl0sIFtoaWRkZW5TaXplXSkgOlxuICAgICAgICAgICAgICAgICAgIHplcm8pKSxcbiAgICAgICAgICB0Zi5hZGQoXG4gICAgICAgICAgICAgIHRmLm1hdE11bChcbiAgICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgICAgdGYudHJhbnNwb3NlKFxuICAgICAgICAgICAgICAgICAgICAgIHRmLnNsaWNlKHdlaWdodCwgW3N0YXJ0cy5uLCAwXSwgW2hpZGRlblNpemUsIC0xXSkpKSxcbiAgICAgICAgICAgICAgdGYubWF0TXVsKFxuICAgICAgICAgICAgICAgICAgdGYubXVsKHIsIGhpZGRlblN0YXRlKSxcbiAgICAgICAgICAgICAgICAgIHRmLnRyYW5zcG9zZSh0Zi5zbGljZShcbiAgICAgICAgICAgICAgICAgICAgICByZWN1cnJlbnRXZWlnaHQsIFtzdGFydHMubiwgMF0sIFtoaWRkZW5TaXplLCAtMV0pKSkpKSk7XG4gICAgfVxuICAgIC8vIGNvbXB1dGUgdGhlIG5ldyBoaWRkZW4gc3RhdGVcbiAgICByZXR1cm4gdGYuYWRkKHRmLm11bCh6LCBoaWRkZW5TdGF0ZSksIHRmLm11bChuLCB0Zi5zdWIob25lLCB6KSkpO1xuICB9XG5cbiAgcnVuKGlucHV0VGVuc29yczogTWFwPE1MT3BlcmFuZCwgdGYuVGVuc29yPik6IHRmLlRlbnNvciB7XG4gICAgcmV0dXJuIEdydUNlbGwuY29tcHV0ZShcbiAgICAgICAgaW5wdXRUZW5zb3JzLmdldCh0aGlzLmlucHV0XyksIGlucHV0VGVuc29ycy5nZXQodGhpcy53ZWlnaHRfKSxcbiAgICAgICAgaW5wdXRUZW5zb3JzLmdldCh0aGlzLnJlY3VycmVudFdlaWdodF8pLFxuICAgICAgICBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuaGlkZGVuU3RhdGVfKSwgdGhpcy5oaWRkZW5TaXplXyxcbiAgICAgICAgdGhpcy5hY3RpdmF0aW9uc18sXG4gICAgICAgIHRoaXMuYmlhc18gPyBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuYmlhc18pIDogdW5kZWZpbmVkLFxuICAgICAgICB0aGlzLnJlY3VycmVudEJpYXNfID8gaW5wdXRUZW5zb3JzLmdldCh0aGlzLnJlY3VycmVudEJpYXNfKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgdGhpcy5yZXNldEFmdGVyXywgdGhpcy5sYXlvdXRfKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNTElucHV0T3BlcmFuZExheW91dCwgTUxJbnN0YW5jZU5vcm1hbGl6YXRpb25PcHRpb25zfSBmcm9tICcuLi9ncmFwaF9idWlsZGVyJztcbmltcG9ydCB7TUxPcGVyYW5kfSBmcm9tICcuLi9vcGVyYW5kJztcbmltcG9ydCB7U2luZ2xlT3V0cHV0T3BlcmF0aW9ufSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgSW5zdGFuY2VOb3JtYWxpemF0aW9uIGV4dGVuZHMgU2luZ2xlT3V0cHV0T3BlcmF0aW9uIHtcbiAgcHJpdmF0ZSBpbnB1dF86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSBzY2FsZV8/OiBNTE9wZXJhbmQ7XG4gIHByaXZhdGUgYmlhc18/OiBNTE9wZXJhbmQ7XG4gIHByaXZhdGUgZXBzaWxvbl8/OiBudW1iZXI7XG4gIHByaXZhdGUgbGF5b3V0XzogTUxJbnB1dE9wZXJhbmRMYXlvdXQ7XG5cbiAgY29uc3RydWN0b3IoaW5wdXQ6IE1MT3BlcmFuZCwgb3B0aW9uczogTUxJbnN0YW5jZU5vcm1hbGl6YXRpb25PcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihpbnB1dC5idWlsZGVyKTtcbiAgICB1dGlscy52YWxpZGF0ZU9wZXJhbmQoaW5wdXQpO1xuICAgIHRoaXMuaW5wdXRfID0gaW5wdXQ7XG4gICAgdXRpbHMudmFsaWRhdGVPcHRpb25hbE9wZXJhbmQob3B0aW9ucy5zY2FsZSk7XG4gICAgdGhpcy5zY2FsZV8gPSBvcHRpb25zLnNjYWxlO1xuICAgIHV0aWxzLnZhbGlkYXRlT3B0aW9uYWxPcGVyYW5kKG9wdGlvbnMuYmlhcyk7XG4gICAgdGhpcy5iaWFzXyA9IG9wdGlvbnMuYmlhcztcbiAgICBpZiAob3B0aW9ucy5lcHNpbG9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGVwc2lsb24gPSBvcHRpb25zLmVwc2lsb247XG4gICAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgICAgdHlwZW9mIGVwc2lsb24gPT09ICdudW1iZXInLCAnVGhlIGVwc2lsb24gcGFyYW1ldGVyIGlzIGludmFsaWQnKTtcbiAgICAgIHRoaXMuZXBzaWxvbl8gPSBlcHNpbG9uO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVwc2lsb25fID0gMWUtNTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMubGF5b3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgICBvcHRpb25zLmxheW91dCBpbiBNTElucHV0T3BlcmFuZExheW91dCxcbiAgICAgICAgICAnVGhlIGxheW91dCBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICAgIHRoaXMubGF5b3V0XyA9IG9wdGlvbnMubGF5b3V0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxheW91dF8gPSBNTElucHV0T3BlcmFuZExheW91dC5uY2h3O1xuICAgIH1cbiAgfVxuXG4gIGlucHV0cygpOiBNTE9wZXJhbmRbXSB7XG4gICAgY29uc3QgaW5wdXRzOiBNTE9wZXJhbmRbXSA9IFt0aGlzLmlucHV0X107XG4gICAgaWYgKHRoaXMuc2NhbGVfKSB7XG4gICAgICBpbnB1dHMucHVzaCh0aGlzLnNjYWxlXyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmJpYXNfKSB7XG4gICAgICBpbnB1dHMucHVzaCh0aGlzLmJpYXNfKTtcbiAgICB9XG4gICAgcmV0dXJuIGlucHV0cztcbiAgfVxuXG4gIHJ1bihpbnB1dFRlbnNvcnM6IE1hcDxNTE9wZXJhbmQsIHRmLlRlbnNvcj4pOiB0Zi5UZW5zb3Ige1xuICAgIGNvbnN0IGlucHV0OiB0Zi5UZW5zb3IgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuaW5wdXRfKTtcbiAgICB1dGlscy5hc3NlcnQoaW5wdXQucmFuayA9PT0gNCwgJ1RoZSBpbnB1dCBvcGVyYW5kIGlzIG5vdCA0LUQuJyk7XG4gICAgbGV0IGF4ZXMgPSBbMiwgM107XG4gICAgbGV0IHNoYXBlID0gWzEsIC0xLCAxLCAxXTtcbiAgICBsZXQgaW5wdXRDaGFubmVscyA9IGlucHV0LnNoYXBlWzFdO1xuICAgIGlmICh0aGlzLmxheW91dF8gPT09IE1MSW5wdXRPcGVyYW5kTGF5b3V0Lm5od2MpIHtcbiAgICAgIGF4ZXMgPSBbMSwgMl07XG4gICAgICBzaGFwZSA9IFsxLCAxLCAxLCAtMV07XG4gICAgICBpbnB1dENoYW5uZWxzID0gaW5wdXQuc2hhcGVbM107XG4gICAgfVxuICAgIGxldCBzY2FsZTogdGYuVGVuc29yO1xuICAgIGlmICh0aGlzLnNjYWxlXykge1xuICAgICAgc2NhbGUgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuc2NhbGVfKTtcbiAgICAgIHV0aWxzLmFzc2VydChzY2FsZS5yYW5rID09PSAxLCAnVGhlIHNjYWxlIG9wZXJhbmQgaXMgbm90IDEtRC4nKTtcbiAgICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgICBzY2FsZS5zaGFwZVswXSA9PT0gaW5wdXRDaGFubmVscyxcbiAgICAgICAgICAnVGhlIGxlbmd0aCBvZiBzY2FsZSBpcyBub3QgZXF1YWwgdG8gdGhlIHNpemUgb2YgdGhlIGZlYXR1cmUgJyArXG4gICAgICAgICAgICAgICdkaW1lbnNpb24gb2YgdGhlIGlucHV0LicpO1xuICAgIH0gZWxzZSB7XG4gICAgfVxuICAgIGxldCBiaWFzOiB0Zi5UZW5zb3I7XG4gICAgaWYgKHRoaXMuYmlhc18pIHtcbiAgICAgIGJpYXMgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuYmlhc18pO1xuICAgICAgdXRpbHMuYXNzZXJ0KGJpYXMucmFuayA9PT0gMSwgJ1RoZSBiaWFzIG9wZXJhbmQgaXMgbm90IDEtRC4nKTtcbiAgICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgICBiaWFzLnNoYXBlWzBdID09PSBpbnB1dENoYW5uZWxzLFxuICAgICAgICAgICdUaGUgbGVuZ3RoIG9mIGJpYXMgaXMgbm90IGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoZSBmZWF0dXJlICcgK1xuICAgICAgICAgICAgICAnZGltZW5zaW9uIG9mIHRoZSBpbnB1dC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBtZWFuID0gdGYubWVhbihpbnB1dCwgYXhlcywgdHJ1ZSk7XG4gICAgY29uc3QgdmFyaWFuY2UgPSB0Zi5tZWFuKHRmLnBvdyh0Zi5zdWIoaW5wdXQsIG1lYW4pLCAyKSwgYXhlcywgdHJ1ZSk7XG4gICAgY29uc3Qgbm9ybSA9IHRmLmRpdihcbiAgICAgICAgdGYuc3ViKGlucHV0LCBtZWFuKSwgdGYucG93KHRmLmFkZCh2YXJpYW5jZSwgdGhpcy5lcHNpbG9uXyksIDAuNSkpO1xuICAgIGNvbnN0IHNjYWxlZCA9IHNjYWxlID8gdGYubXVsKHRmLnJlc2hhcGUoc2NhbGUsIHNoYXBlKSwgbm9ybSkgOiBub3JtO1xuICAgIHJldHVybiBiaWFzID8gdGYuYWRkKHRmLnJlc2hhcGUoYmlhcywgc2hhcGUpLCBzY2FsZWQpIDogc2NhbGVkO1xuICB9XG59IiwiaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNTE9wZXJhbmR9IGZyb20gJy4uL29wZXJhbmQnO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi4vdXRpbHMnO1xuXG5pbXBvcnQge1VuYXJ5TUxPcGVyYXRvcn0gZnJvbSAnLi91bmFyeSc7XG5cbmV4cG9ydCBjbGFzcyBMZWFreVJlbHUgZXh0ZW5kcyBVbmFyeU1MT3BlcmF0b3Ige1xuICBwcml2YXRlIGFscGhhXz86IG51bWJlcjtcblxuICBnZXQgYWxwaGEoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5hbHBoYV87XG4gIH1cblxuICBjb25zdHJ1Y3Rvcih4OiBNTE9wZXJhbmQsIGFscGhhID0gMC4wMSkge1xuICAgIHN1cGVyKHgpO1xuICAgIHV0aWxzLmFzc2VydCh0eXBlb2YgYWxwaGEgPT09ICdudW1iZXInLCAnVGhlIGFscGhhIHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgIHRoaXMuYWxwaGFfID0gYWxwaGE7XG4gIH1cblxuICBydW5PcCh4OiB0Zi5UZW5zb3IpOiB0Zi5UZW5zb3Ige1xuICAgIHJldHVybiB0Zi5sZWFreVJlbHUoeCwgdGhpcy5hbHBoYV8pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyB0ZiBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01MUGFkZGluZ01vZGUsIE1MUGFkT3B0aW9uc30gZnJvbSAnLi4vZ3JhcGhfYnVpbGRlcic7XG5pbXBvcnQge01MT3BlcmFuZH0gZnJvbSAnLi4vb3BlcmFuZCc7XG5pbXBvcnQge1NpbmdsZU91dHB1dE9wZXJhdGlvbn0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIFBhZCBleHRlbmRzIFNpbmdsZU91dHB1dE9wZXJhdGlvbiB7XG4gIHByaXZhdGUgaW5wdXRfOiBNTE9wZXJhbmQ7XG4gIHByaXZhdGUgcGFkZGluZ186IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSBtb2RlXzogTUxQYWRkaW5nTW9kZSA9IE1MUGFkZGluZ01vZGUuY29uc3RhbnQ7XG4gIHByaXZhdGUgdmFsdWVfID0gMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIGlucHV0OiBNTE9wZXJhbmQsIHBhZGRpbmc6IE1MT3BlcmFuZCwgb3B0aW9uczogTUxQYWRPcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihpbnB1dC5idWlsZGVyKTtcbiAgICB1dGlscy52YWxpZGF0ZU9wZXJhbmQoaW5wdXQpO1xuICAgIHRoaXMuaW5wdXRfID0gaW5wdXQ7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKHBhZGRpbmcpO1xuICAgIHRoaXMucGFkZGluZ18gPSBwYWRkaW5nO1xuICAgIGlmIChvcHRpb25zLm1vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgIG9wdGlvbnMubW9kZSBpbiBNTFBhZGRpbmdNb2RlLCAnVGhlIG1vZGUgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgICB0aGlzLm1vZGVfID0gb3B0aW9ucy5tb2RlO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnZhbHVlXyA9IG9wdGlvbnMudmFsdWU7XG4gICAgfVxuICB9XG5cbiAgaW5wdXRzKCk6IE1MT3BlcmFuZFtdIHtcbiAgICByZXR1cm4gW3RoaXMuaW5wdXRfLCB0aGlzLnBhZGRpbmdfXTtcbiAgfVxuXG4gIHJ1bihpbnB1dFRlbnNvcnM6IE1hcDxNTE9wZXJhbmQsIHRmLlRlbnNvcj4pOiB0Zi5UZW5zb3Ige1xuICAgIGNvbnN0IGlucHV0OiB0Zi5UZW5zb3IgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuaW5wdXRfKTtcbiAgICBjb25zdCBwYWRkaW5nOiB0Zi5UZW5zb3IgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMucGFkZGluZ18pO1xuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgcGFkZGluZy5yYW5rID09PSAyICYmIHBhZGRpbmcuZHR5cGUgPT09ICdpbnQzMicgJiZcbiAgICAgICAgICAgIHBhZGRpbmcuc2hhcGVbMF0gPT09IGlucHV0LnJhbmssXG4gICAgICAgICdUaGUgcGFkZGluZyBvcGVyYW5kIGlzIGludmFsaWQuJyk7XG4gICAgY29uc3QgcGFkZGluZ0FycmF5ID0gcGFkZGluZy5hcnJheVN5bmMoKSBhcyBBcnJheTxbbnVtYmVyLCBudW1iZXJdPjtcbiAgICBpZiAodGhpcy5tb2RlXyA9PT0gTUxQYWRkaW5nTW9kZS5jb25zdGFudCkge1xuICAgICAgcmV0dXJuIHRmLnBhZChpbnB1dCwgcGFkZGluZ0FycmF5LCB0aGlzLnZhbHVlXyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLm1vZGVfID09PSBNTFBhZGRpbmdNb2RlLmVkZ2UpIHtcbiAgICAgICAgY29uc3QgZWRnZVBhZGRpbmdzOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPiA9XG4gICAgICAgICAgICBuZXcgQXJyYXkocGFkZGluZ0FycmF5Lmxlbmd0aCk7XG4gICAgICAgIGxldCBwYWRkZWQ6IHRmLlRlbnNvciA9IGlucHV0O1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYWRkaW5nQXJyYXkubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGVkZ2VQYWRkaW5nc1tpXSA9IFswLCAwXTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMjsgKytqKSB7XG4gICAgICAgICAgICAgIGlmIChwYWRkaW5nQXJyYXlbaV1bal0gPiAwKSB7XG4gICAgICAgICAgICAgICAgZWRnZVBhZGRpbmdzW2ldW2pdID0gMTtcbiAgICAgICAgICAgICAgICBwYWRkaW5nQXJyYXlbaV1bal0gLT0gMTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlZGdlUGFkZGluZ3NbaV1bal0gPSAwO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChlZGdlUGFkZGluZ3MuZXZlcnkodmFsdWUgPT4gdmFsdWVbMF0gPT09IDAgJiYgdmFsdWVbMV0gPT09IDApKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgcGFkZGVkID0gdGYubWlycm9yUGFkKHBhZGRlZCwgZWRnZVBhZGRpbmdzLCAnc3ltbWV0cmljJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhZGRlZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBtb2RlOiAncmVmbGVjdCd8J3N5bW1ldHJpYyc7XG4gICAgICAgIGlmICh0aGlzLm1vZGVfID09PSBNTFBhZGRpbmdNb2RlLnJlZmxlY3Rpb24pIHtcbiAgICAgICAgICBtb2RlID0gJ3JlZmxlY3QnO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubW9kZV8gPT09IE1MUGFkZGluZ01vZGUuc3ltbWV0cmljKSB7XG4gICAgICAgICAgbW9kZSA9ICdzeW1tZXRyaWMnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0Zi5taXJyb3JQYWQoaW5wdXQsIHBhZGRpbmdBcnJheSwgbW9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59IiwiaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7RXhwbGljaXRQYWRkaW5nfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUvc3JjL29wcy9jb252X3V0aWwnO1xuXG5pbXBvcnQge01MQXV0b1BhZCwgTUxJbnB1dE9wZXJhbmRMYXlvdXQsIE1MUG9vbGluZzJkT3B0aW9uc30gZnJvbSAnLi4vZ3JhcGhfYnVpbGRlcic7XG5pbXBvcnQge01MT3BlcmFuZH0gZnJvbSAnLi4vb3BlcmFuZCc7XG5pbXBvcnQge1NpbmdsZU91dHB1dE9wZXJhdGlvbn0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4uL3V0aWxzJztcblxudHlwZSBQb29saW5nVHlwZSA9ICdhdmcnfCdtYXgnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUG9vbCBleHRlbmRzIFNpbmdsZU91dHB1dE9wZXJhdGlvbiB7XG4gIHByb3RlY3RlZCBpbnB1dF86IE1MT3BlcmFuZDtcbiAgcHJvdGVjdGVkIHdpbmRvd0RpbWVuc2lvbnNfPzogW251bWJlciwgbnVtYmVyXTtcbiAgcHJvdGVjdGVkIHBhZGRpbmdfPzogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG4gIHByb3RlY3RlZCBzdHJpZGVzXz86IFtudW1iZXIsIG51bWJlcl07XG4gIHByb3RlY3RlZCBkaWxhdGlvbnNfPzogW251bWJlciwgbnVtYmVyXTtcbiAgcHJvdGVjdGVkIGdyb3Vwc18/OiBudW1iZXI7XG4gIHByb3RlY3RlZCBsYXlvdXRfPzogTUxJbnB1dE9wZXJhbmRMYXlvdXQ7XG4gIHByaXZhdGUgYXV0b1BhZF8/OiBNTEF1dG9QYWQ7XG5cbiAgY29uc3RydWN0b3IoaW5wdXQ6IE1MT3BlcmFuZCwgb3B0aW9uczogTUxQb29saW5nMmRPcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihpbnB1dC5idWlsZGVyKTtcbiAgICB1dGlscy52YWxpZGF0ZU9wZXJhbmQoaW5wdXQpO1xuICAgIHRoaXMuaW5wdXRfID0gaW5wdXQ7XG4gICAgdGhpcy5pbml0T3B0aW9ucyhcbiAgICAgICAgb3B0aW9ucy53aW5kb3dEaW1lbnNpb25zLCBvcHRpb25zLnBhZGRpbmcsIG9wdGlvbnMuc3RyaWRlcyxcbiAgICAgICAgb3B0aW9ucy5kaWxhdGlvbnMsIG9wdGlvbnMubGF5b3V0LCBvcHRpb25zLmF1dG9QYWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0T3B0aW9ucyhcbiAgICAgIHdpbmRvd0RpbWVuc2lvbnM6IFtudW1iZXIsIG51bWJlcl0gPSBbLTEsIC0xXSxcbiAgICAgIHBhZGRpbmc6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0gWzAsIDAsIDAsIDBdLFxuICAgICAgc3RyaWRlczogW251bWJlciwgbnVtYmVyXSA9IFsxLCAxXSwgZGlsYXRpb25zOiBbbnVtYmVyLCBudW1iZXJdID0gWzEsIDFdLFxuICAgICAgbGF5b3V0OiBNTElucHV0T3BlcmFuZExheW91dCA9IE1MSW5wdXRPcGVyYW5kTGF5b3V0Lm5jaHcsXG4gICAgICBhdXRvUGFkOiBNTEF1dG9QYWQgPSBNTEF1dG9QYWQuZXhwbGljaXQpIHtcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIHV0aWxzLmlzSW50ZWdlckFycmF5KHdpbmRvd0RpbWVuc2lvbnMpICYmIHdpbmRvd0RpbWVuc2lvbnMubGVuZ3RoID09PSAyLFxuICAgICAgICAnVGhlIHBhZGRpbmcgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy53aW5kb3dEaW1lbnNpb25zXyA9IHdpbmRvd0RpbWVuc2lvbnM7XG5cbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIHV0aWxzLmlzSW50ZWdlckFycmF5KHBhZGRpbmcpICYmIHBhZGRpbmcubGVuZ3RoID09PSA0LFxuICAgICAgICAnVGhlIHBhZGRpbmcgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5wYWRkaW5nXyA9IHBhZGRpbmc7XG5cbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIHV0aWxzLmlzSW50ZWdlckFycmF5KHN0cmlkZXMpICYmIHN0cmlkZXMubGVuZ3RoID09PSAyLFxuICAgICAgICAnVGhlIHN0cmlkZXMgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5zdHJpZGVzXyA9IHN0cmlkZXM7XG5cbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIHV0aWxzLmlzSW50ZWdlckFycmF5KGRpbGF0aW9ucykgJiYgZGlsYXRpb25zLmxlbmd0aCA9PT0gMixcbiAgICAgICAgJ1RoZSBkaWxhdGlvbnMgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5kaWxhdGlvbnNfID0gZGlsYXRpb25zO1xuXG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICBsYXlvdXQgaW4gTUxJbnB1dE9wZXJhbmRMYXlvdXQsICdUaGUgbGF5b3V0IHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgIHRoaXMubGF5b3V0XyA9IGxheW91dDtcblxuICAgIHV0aWxzLmFzc2VydChhdXRvUGFkIGluIE1MQXV0b1BhZCwgJ1RoZSBhdXRvUGFkIHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgIHRoaXMuYXV0b1BhZF8gPSBhdXRvUGFkO1xuICB9XG5cbiAgaW5wdXRzKCk6IE1MT3BlcmFuZFtdIHtcbiAgICByZXR1cm4gW3RoaXMuaW5wdXRfXTtcbiAgfVxuXG4gIHJ1bihpbnB1dFRlbnNvcnM6IE1hcDxNTE9wZXJhbmQsIHRmLlRlbnNvcj4pOiB0Zi5UZW5zb3Ige1xuICAgIGxldCBpbnB1dDogdGYuVGVuc29yNEQgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuaW5wdXRfKSBhcyB0Zi5UZW5zb3I0RDtcbiAgICBjb25zdCBwb29saW5nVHlwZSA9IHRoaXMuZ2V0UG9vbGluZ1R5cGUoKTtcbiAgICBpZiAodGhpcy5sYXlvdXRfID09PSBNTElucHV0T3BlcmFuZExheW91dC5uY2h3KSB7XG4gICAgICAvLyBuY2h3IC0+IG5od2NcbiAgICAgIGlucHV0ID0gdGYudHJhbnNwb3NlKGlucHV0LCBbMCwgMiwgMywgMV0pO1xuICAgIH1cbiAgICBjb25zdCB3aW5kb3dEaW1lbnNpb25zID0gdGhpcy53aW5kb3dEaW1lbnNpb25zXztcbiAgICBpZiAod2luZG93RGltZW5zaW9uc1swXSA9PT0gLTEgJiYgd2luZG93RGltZW5zaW9uc1sxXSA9PT0gLTEpIHtcbiAgICAgIHdpbmRvd0RpbWVuc2lvbnNbMF0gPSBpbnB1dC5zaGFwZVsxXTtcbiAgICAgIHdpbmRvd0RpbWVuc2lvbnNbMV0gPSBpbnB1dC5zaGFwZVsyXTtcbiAgICB9XG4gICAgbGV0IHBhZGRpbmc6ICd2YWxpZCd8J3NhbWUnfEV4cGxpY2l0UGFkZGluZztcbiAgICBpZiAodGhpcy5hdXRvUGFkXyA9PT0gTUxBdXRvUGFkLmV4cGxpY2l0KSB7XG4gICAgICBpZiAodGhpcy5wYWRkaW5nXy5ldmVyeSh2ID0+IHYgPT09IDApKSB7XG4gICAgICAgIHBhZGRpbmcgPSAndmFsaWQnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFkZGluZyA9IFtcbiAgICAgICAgICBbMCwgMF0sIFt0aGlzLnBhZGRpbmdfWzBdLCB0aGlzLnBhZGRpbmdfWzFdXSxcbiAgICAgICAgICBbdGhpcy5wYWRkaW5nX1syXSwgdGhpcy5wYWRkaW5nX1szXV0sIFswLCAwXVxuICAgICAgICBdIGFzIEV4cGxpY2l0UGFkZGluZztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuYXV0b1BhZF8gPT09IE1MQXV0b1BhZFsnc2FtZS11cHBlciddKSB7XG4gICAgICAgIHBhZGRpbmcgPSAnc2FtZSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGV4cGxpY2l0IHBhZGRpbmdzIGZvciAnc2FtZS1sb3dlcidcbiAgICAgICAgcGFkZGluZyA9IFtbMCwgMF0sIFswLCAwXSwgWzAsIDBdLCBbMCwgMF1dO1xuICAgICAgICBjb25zdCBvdXRwdXRTaXplcyA9IFswLCAwXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyOyArK2kpIHtcbiAgICAgICAgICBvdXRwdXRTaXplc1tpXSA9IE1hdGguY2VpbChpbnB1dC5zaGFwZVsxICsgaV0gLyB0aGlzLnN0cmlkZXNfW2ldKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b3RhbFBhZGRpbmc6IFtudW1iZXIsIG51bWJlcl0gPSBbMCwgMF07XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjsgKytpKSB7XG4gICAgICAgICAgdG90YWxQYWRkaW5nW2ldID0gdGhpcy5zdHJpZGVzX1tpXSAqIChvdXRwdXRTaXplc1tpXSAtIDEpICtcbiAgICAgICAgICAgICAgKCh3aW5kb3dEaW1lbnNpb25zW2ldIC0gMSkgKiB0aGlzLmRpbGF0aW9uc19baV0gKyAxKSAtXG4gICAgICAgICAgICAgIGlucHV0LnNoYXBlWzEgKyBpXTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI7ICsraSkge1xuICAgICAgICAgIHBhZGRpbmdbaSArIDFdWzBdID0gdG90YWxQYWRkaW5nW2ldIC0gTWF0aC5mbG9vcih0b3RhbFBhZGRpbmdbaV0gLyAyKTtcbiAgICAgICAgICBwYWRkaW5nW2kgKyAxXVsxXSA9IE1hdGguZmxvb3IodG90YWxQYWRkaW5nW2ldIC8gMik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgb3V0cHV0ID0gdGYucG9vbChcbiAgICAgICAgaW5wdXQsIHRoaXMud2luZG93RGltZW5zaW9uc18sIHBvb2xpbmdUeXBlLCBwYWRkaW5nLCB0aGlzLmRpbGF0aW9uc18sXG4gICAgICAgIHRoaXMuc3RyaWRlc18pO1xuICAgIGlmICh0aGlzLmxheW91dF8gPT09IE1MSW5wdXRPcGVyYW5kTGF5b3V0Lm5jaHcpIHtcbiAgICAgIC8vIG5od2MgLT4gbmNod1xuICAgICAgb3V0cHV0ID0gdGYudHJhbnNwb3NlKG91dHB1dCwgWzAsIDMsIDEsIDJdKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxuXG4gIGFic3RyYWN0IGdldFBvb2xpbmdUeXBlKCk6IFBvb2xpbmdUeXBlO1xufVxuXG5leHBvcnQgY2xhc3MgQXZlcmFnZVBvb2wyZCBleHRlbmRzIFBvb2wge1xuICBnZXRQb29saW5nVHlwZSgpOiBQb29saW5nVHlwZSB7XG4gICAgcmV0dXJuICdhdmcnO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNYXhQb29sMmQgZXh0ZW5kcyBQb29sIHtcbiAgZ2V0UG9vbGluZ1R5cGUoKTogUG9vbGluZ1R5cGUge1xuICAgIHJldHVybiAnbWF4JztcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNTFJlZHVjZU9wdGlvbnN9IGZyb20gJy4uL2dyYXBoX2J1aWxkZXInO1xuaW1wb3J0IHtNTE9wZXJhbmR9IGZyb20gJy4uL29wZXJhbmQnO1xuaW1wb3J0IHtTaW5nbGVPdXRwdXRPcGVyYXRpb259IGZyb20gJy4uL29wZXJhdGlvbic7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuLi91dGlscyc7XG5cbmFic3RyYWN0IGNsYXNzIFJlZHVjZSBleHRlbmRzIFNpbmdsZU91dHB1dE9wZXJhdGlvbiB7XG4gIHByaXZhdGUgaW5wdXRfOiBNTE9wZXJhbmQ7XG4gIHByaXZhdGUgYXhlc18/OiBudW1iZXJbXTtcbiAgcHJpdmF0ZSBrZWVwRGltZW5zaW9uc18/OiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKGlucHV0OiBNTE9wZXJhbmQsIG9wdGlvbnM6IE1MUmVkdWNlT3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIoaW5wdXQuYnVpbGRlcik7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKGlucHV0KTtcbiAgICB0aGlzLmlucHV0XyA9IGlucHV0O1xuICAgIGlmIChvcHRpb25zLmF4ZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgIHV0aWxzLmlzSW50ZWdlckFycmF5KG9wdGlvbnMuYXhlcyksICdUaGUgYXhlcyBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICAgIHRoaXMuYXhlc18gPSBvcHRpb25zLmF4ZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYXhlc18gPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmtlZXBEaW1lbnNpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgICB1dGlscy5pc0Jvb2xlYW4ob3B0aW9ucy5rZWVwRGltZW5zaW9ucyksXG4gICAgICAgICAgJ1RoZSBrZWVwRGltZW5zaW9ucyBwYXJhbWV0ZXIgaXMgbm90IGEgYm9vbGVhbi4nKTtcbiAgICAgIHRoaXMua2VlcERpbWVuc2lvbnNfID0gb3B0aW9ucy5rZWVwRGltZW5zaW9ucztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5rZWVwRGltZW5zaW9uc18gPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBpbnB1dHMoKTogTUxPcGVyYW5kW10ge1xuICAgIHJldHVybiBbdGhpcy5pbnB1dF9dO1xuICB9XG5cbiAgcnVuKGlucHV0VGVuc29yczogTWFwPE1MT3BlcmFuZCwgdGYuVGVuc29yPik6IHRmLlRlbnNvciB7XG4gICAgY29uc3QgaW5wdXQ6IHRmLlRlbnNvciA9IGlucHV0VGVuc29ycy5nZXQodGhpcy5pbnB1dF8pO1xuICAgIC8vIGFjY2VwdHMgYXhpcyByYW5nZSBbLXIsIHIpXG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICB1dGlscy52YWxpZGF0ZUF4ZXModGhpcy5heGVzXywgaW5wdXQucmFuayksXG4gICAgICAgIGBUaGUgYXhlcyBtdXN0IGJlIGluIHJhbmdlIFstJHtpbnB1dC5yYW5rfSwgJHtpbnB1dC5yYW5rfSlgKTtcbiAgICByZXR1cm4gdGhpcy5ydW5PcChpbnB1dCwgdGhpcy5heGVzXywgdGhpcy5rZWVwRGltZW5zaW9uc18pO1xuICB9XG5cbiAgYWJzdHJhY3QgcnVuT3AoaW5wdXQ6IHRmLlRlbnNvciwgYXhlczogbnVtYmVyW10sIGtlZXBEaW1lbnNpb25zOiBib29sZWFuKTpcbiAgICAgIHRmLlRlbnNvcjtcbn1cblxuZXhwb3J0IGNsYXNzIFJlZHVjZUxvZ1N1bUV4cCBleHRlbmRzIFJlZHVjZSB7XG4gIHJ1bk9wKGlucHV0OiB0Zi5UZW5zb3IsIGF4ZXM6IG51bWJlcltdLCBrZWVwRGltZW5zaW9uczogYm9vbGVhbik6IHRmLlRlbnNvciB7XG4gICAgcmV0dXJuIHRmLmxvZ1N1bUV4cChpbnB1dCwgYXhlcywga2VlcERpbWVuc2lvbnMpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWR1Y2VNYXggZXh0ZW5kcyBSZWR1Y2Uge1xuICBydW5PcChpbnB1dDogdGYuVGVuc29yLCBheGVzOiBudW1iZXJbXSwga2VlcERpbWVuc2lvbnM6IGJvb2xlYW4pOiB0Zi5UZW5zb3Ige1xuICAgIHJldHVybiB0Zi5tYXgoaW5wdXQsIGF4ZXMsIGtlZXBEaW1lbnNpb25zKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVkdWNlTWVhbiBleHRlbmRzIFJlZHVjZSB7XG4gIHJ1bk9wKGlucHV0OiB0Zi5UZW5zb3IsIGF4ZXM6IG51bWJlcltdLCBrZWVwRGltZW5zaW9uczogYm9vbGVhbik6IHRmLlRlbnNvciB7XG4gICAgcmV0dXJuIHRmLm1lYW4oaW5wdXQsIGF4ZXMsIGtlZXBEaW1lbnNpb25zKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVkdWNlTWluIGV4dGVuZHMgUmVkdWNlIHtcbiAgcnVuT3AoaW5wdXQ6IHRmLlRlbnNvciwgYXhlczogbnVtYmVyW10sIGtlZXBEaW1lbnNpb25zOiBib29sZWFuKTogdGYuVGVuc29yIHtcbiAgICByZXR1cm4gdGYubWluKGlucHV0LCBheGVzLCBrZWVwRGltZW5zaW9ucyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlZHVjZVByb2R1Y3QgZXh0ZW5kcyBSZWR1Y2Uge1xuICBydW5PcChpbnB1dDogdGYuVGVuc29yLCBheGVzOiBudW1iZXJbXSwga2VlcERpbWVuc2lvbnM6IGJvb2xlYW4pOiB0Zi5UZW5zb3Ige1xuICAgIHJldHVybiB0Zi5wcm9kKGlucHV0LCBheGVzLCBrZWVwRGltZW5zaW9ucyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlZHVjZVN1bSBleHRlbmRzIFJlZHVjZSB7XG4gIHJ1bk9wKGlucHV0OiB0Zi5UZW5zb3IsIGF4ZXM6IG51bWJlcltdLCBrZWVwRGltZW5zaW9uczogYm9vbGVhbik6IHRmLlRlbnNvciB7XG4gICAgcmV0dXJuIHRmLnN1bShpbnB1dCwgYXhlcywga2VlcERpbWVuc2lvbnMpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyB0ZiBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01MSW50ZXJwb2xhdGlvbk1vZGUsIE1MUmVzYW1wbGVPcHRpb25zfSBmcm9tICcuLi9ncmFwaF9idWlsZGVyJztcbmltcG9ydCB7TUxPcGVyYW5kfSBmcm9tICcuLi9vcGVyYW5kJztcbmltcG9ydCB7U2luZ2xlT3V0cHV0T3BlcmF0aW9ufSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgUmVzYW1wbGUgZXh0ZW5kcyBTaW5nbGVPdXRwdXRPcGVyYXRpb24ge1xuICBwcml2YXRlIGlucHV0XzogTUxPcGVyYW5kO1xuICBwcml2YXRlIG1vZGVfOiBNTEludGVycG9sYXRpb25Nb2RlID0gTUxJbnRlcnBvbGF0aW9uTW9kZVsnbmVhcmVzdC1uZWlnaGJvciddO1xuICBwcml2YXRlIHNjYWxlc186IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICBwcml2YXRlIHNpemVzXzogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG5cbiAgY29uc3RydWN0b3IoaW5wdXQ6IE1MT3BlcmFuZCwgb3B0aW9uczogTUxSZXNhbXBsZU9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKGlucHV0LmJ1aWxkZXIpO1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZChpbnB1dCk7XG4gICAgdGhpcy5pbnB1dF8gPSBpbnB1dDtcbiAgICBpZiAob3B0aW9ucy5zY2FsZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgYXJyYXkgPSBvcHRpb25zLnNjYWxlcztcbiAgICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgICBhcnJheSBpbnN0YW5jZW9mIEFycmF5ICYmIGFycmF5LmV2ZXJ5KHYgPT4gdHlwZW9mIHYgPT09ICdudW1iZXInKSAmJlxuICAgICAgICAgICAgICBhcnJheS5sZW5ndGggPT09IDQsXG4gICAgICAgICAgJ1RoZSBzY2FsZXMgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgICB0aGlzLnNjYWxlc18gPSBvcHRpb25zLnNjYWxlcztcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuc2l6ZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgIHV0aWxzLmlzSW50ZWdlckFycmF5KG9wdGlvbnMuc2l6ZXMpICYmIG9wdGlvbnMuc2l6ZXMubGVuZ3RoID09PSA0LFxuICAgICAgICAgICdUaGUgc2l6ZXMgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgICB0aGlzLnNpemVzXyA9IG9wdGlvbnMuc2l6ZXM7XG4gICAgICB0aGlzLnNjYWxlc18gPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgdGhpcy5zY2FsZXNfICE9PSB1bmRlZmluZWQgfHwgdGhpcy5zaXplc18gIT09IHVuZGVmaW5lZCxcbiAgICAgICAgJ1RoZSBzY2FsZXMgb3Igc2l6ZXMgcGFyYW1ldGVyIGlzIG5vdCBwcm92aWVkLicpO1xuICAgIGlmIChvcHRpb25zLm1vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgIG9wdGlvbnMubW9kZSBpbiBNTEludGVycG9sYXRpb25Nb2RlLFxuICAgICAgICAgICdUaGUgbW9kZSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICAgIHRoaXMubW9kZV8gPSBvcHRpb25zLm1vZGU7XG4gICAgfVxuICB9XG5cbiAgaW5wdXRzKCk6IE1MT3BlcmFuZFtdIHtcbiAgICByZXR1cm4gW3RoaXMuaW5wdXRfXTtcbiAgfVxuXG4gIHJ1bihpbnB1dFRlbnNvcnM6IE1hcDxNTE9wZXJhbmQsIHRmLlRlbnNvcj4pOiB0Zi5UZW5zb3Ige1xuICAgIGxldCBpbnB1dDogdGYuVGVuc29yNEQgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuaW5wdXRfKSBhcyB0Zi5UZW5zb3I0RDtcbiAgICB1dGlscy5hc3NlcnQoaW5wdXQucmFuayA9PT0gNCwgJ1RoZSBpbnB1dCB0ZW5zb3IgaXMgbm90IDQtRC4nKTtcbiAgICBjb25zdCBzaXplczogW251bWJlciwgbnVtYmVyXSA9IFswLCAwXTtcbiAgICBsZXQgdHJhbnNwb3NlZCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLnNpemVzXyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodGhpcy5zaXplc19bMF0gPT09IGlucHV0LnNoYXBlWzBdICYmXG4gICAgICAgICAgdGhpcy5zaXplc19bMV0gPT09IGlucHV0LnNoYXBlWzFdKSB7XG4gICAgICAgIHNpemVzWzBdID0gdGhpcy5zaXplc19bMl07XG4gICAgICAgIHNpemVzWzFdID0gdGhpcy5zaXplc19bM107XG4gICAgICAgIC8vIGFzc3VtZSBuY2h3IC0+IG5od2NcbiAgICAgICAgaW5wdXQgPSB0Zi50cmFuc3Bvc2UoaW5wdXQsIFswLCAyLCAzLCAxXSk7XG4gICAgICAgIHRyYW5zcG9zZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICB0aGlzLnNpemVzX1swXSA9PT0gaW5wdXQuc2hhcGVbMF0gJiZcbiAgICAgICAgICB0aGlzLnNpemVzX1szXSA9PT0gaW5wdXQuc2hhcGVbM10pIHtcbiAgICAgICAgLy8gYXNzdW1lIG5od2NcbiAgICAgICAgc2l6ZXNbMF0gPSB0aGlzLnNpemVzX1sxXTtcbiAgICAgICAgc2l6ZXNbMV0gPSB0aGlzLnNpemVzX1syXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICd0Zi5pbWFnZS5yZXNpemUgZG9lc25cXCd0IHN1cHBvcnQgdGhlIHNpemVzIHBhcmFtZXRlci4nKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuc2NhbGVzXyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodGhpcy5zY2FsZXNfWzBdID09PSAxLjAgJiYgdGhpcy5zY2FsZXNfWzFdID09PSAxLjApIHtcbiAgICAgICAgc2l6ZXNbMF0gPSBNYXRoLmZsb29yKGlucHV0LnNoYXBlWzJdICogdGhpcy5zY2FsZXNfWzJdKTtcbiAgICAgICAgc2l6ZXNbMV0gPSBNYXRoLmZsb29yKGlucHV0LnNoYXBlWzNdICogdGhpcy5zY2FsZXNfWzNdKTtcbiAgICAgICAgLy8gYXNzdW1lIG5jaHcgLT4gbmh3Y1xuICAgICAgICBpbnB1dCA9IHRmLnRyYW5zcG9zZShpbnB1dCwgWzAsIDIsIDMsIDFdKTtcbiAgICAgICAgdHJhbnNwb3NlZCA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc2NhbGVzX1swXSA9PT0gMS4wICYmIHRoaXMuc2NhbGVzX1szXSA9PT0gMS4wKSB7XG4gICAgICAgIC8vIGFzc3VtZSBuaHdjXG4gICAgICAgIHNpemVzWzBdID0gTWF0aC5mbG9vcihpbnB1dC5zaGFwZVsxXSAqIHRoaXMuc2NhbGVzX1sxXSk7XG4gICAgICAgIHNpemVzWzFdID0gTWF0aC5mbG9vcihpbnB1dC5zaGFwZVsyXSAqIHRoaXMuc2NhbGVzX1syXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAndGYuaW1hZ2UucmVzaXplIGRvZXNuXFwndCBzdXBwb3J0IHRoZSBzY2FsZXMgcGFyYW1ldGVyLicpO1xuICAgICAgfVxuICAgIH1cbiAgICBsZXQgb3V0cHV0OiB0Zi5UZW5zb3I7XG4gICAgaWYgKHRoaXMubW9kZV8gPT09IE1MSW50ZXJwb2xhdGlvbk1vZGVbJ25lYXJlc3QtbmVpZ2hib3InXSkge1xuICAgICAgb3V0cHV0ID0gdGYuaW1hZ2UucmVzaXplTmVhcmVzdE5laWdoYm9yKGlucHV0LCBzaXplcywgZmFsc2UsIHRydWUpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5tb2RlXyA9PT0gTUxJbnRlcnBvbGF0aW9uTW9kZS5saW5lYXIpIHtcbiAgICAgIG91dHB1dCA9IHRmLmltYWdlLnJlc2l6ZUJpbGluZWFyKGlucHV0LCBzaXplcywgZmFsc2UsIHRydWUpO1xuICAgIH1cbiAgICBpZiAodHJhbnNwb3NlZCkge1xuICAgICAgLy8gbmh3YyAtPiBuY2h3XG4gICAgICBvdXRwdXQgPSB0Zi50cmFuc3Bvc2Uob3V0cHV0LCBbMCwgMywgMSwgMl0pO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xuICB9XG59IiwiaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNTE9wZXJhbmR9IGZyb20gJy4uL29wZXJhbmQnO1xuaW1wb3J0IHtTaW5nbGVPdXRwdXRPcGVyYXRpb259IGZyb20gJy4uL29wZXJhdGlvbic7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuLi91dGlscyc7XG5cbmV4cG9ydCBjbGFzcyBSZXNoYXBlIGV4dGVuZHMgU2luZ2xlT3V0cHV0T3BlcmF0aW9uIHtcbiAgcHJpdmF0ZSBpbnB1dF86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSBuZXdTaGFwZV86IG51bWJlcltdO1xuXG4gIGNvbnN0cnVjdG9yKGlucHV0OiBNTE9wZXJhbmQsIG5ld1NoYXBlOiBudW1iZXJbXSkge1xuICAgIHN1cGVyKGlucHV0LmJ1aWxkZXIpO1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZChpbnB1dCk7XG4gICAgdGhpcy5pbnB1dF8gPSBpbnB1dDtcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIHV0aWxzLmlzSW50ZWdlckFycmF5KG5ld1NoYXBlKSAmJiBuZXdTaGFwZS5sZW5ndGggIT09IDAsXG4gICAgICAgICdUaGUgbmV3U2hhcGUgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5uZXdTaGFwZV8gPSBuZXdTaGFwZTtcbiAgfVxuXG4gIGlucHV0cygpOiBNTE9wZXJhbmRbXSB7XG4gICAgcmV0dXJuIFt0aGlzLmlucHV0X107XG4gIH1cblxuICBydW4oaW5wdXRUZW5zb3JzOiBNYXA8TUxPcGVyYW5kLCB0Zi5UZW5zb3I+KTogdGYuVGVuc29yIHtcbiAgICBjb25zdCBpbnB1dDogdGYuVGVuc29yID0gaW5wdXRUZW5zb3JzLmdldCh0aGlzLmlucHV0Xyk7XG4gICAgcmV0dXJuIHRmLnJlc2hhcGUoaW5wdXQsIHRoaXMubmV3U2hhcGVfKTtcbiAgfVxufSIsImltcG9ydCAqIGFzIHRmIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TUxPcGVyYW5kfSBmcm9tICcuLi9vcGVyYW5kJztcbmltcG9ydCB7U2luZ2xlT3V0cHV0T3BlcmF0aW9ufSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgU2xpY2UgZXh0ZW5kcyBTaW5nbGVPdXRwdXRPcGVyYXRpb24ge1xuICBwcml2YXRlIGlucHV0XzogTUxPcGVyYW5kO1xuICBwcml2YXRlIHN0YXJ0c186IG51bWJlcltdO1xuICBwcml2YXRlIHNpemVzXzogbnVtYmVyW107XG4gIHByaXZhdGUgYXhlc18/OiBudW1iZXJbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIGlucHV0OiBNTE9wZXJhbmQsIHN0YXJ0czogbnVtYmVyW10sIHNpemVzOiBudW1iZXJbXSwgYXhlcz86IG51bWJlcltdKSB7XG4gICAgc3VwZXIoaW5wdXQuYnVpbGRlcik7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKGlucHV0KTtcbiAgICB0aGlzLmlucHV0XyA9IGlucHV0O1xuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgdXRpbHMuaXNJbnRlZ2VyQXJyYXkoc3RhcnRzKSwgJ1RoZSBzdGFydHMgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5zdGFydHNfID0gc3RhcnRzO1xuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgdXRpbHMuaXNJbnRlZ2VyQXJyYXkoc2l6ZXMpICYmIHNpemVzLmV2ZXJ5KHYgPT4gdiA+IDAgfHwgdiA9PT0gLTEpLFxuICAgICAgICAnVGhlIHNpemVzIHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgIHRoaXMuc2l6ZXNfID0gc2l6ZXM7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICBzaXplcy5sZW5ndGggPT09IHNpemVzLmxlbmd0aCxcbiAgICAgICAgJ1RoZSBsZW5ndGggb2Ygc2l6ZXMgaXMgbm90IGVxdWFsIHRvIHRoZSBsZW5ndGggb2Ygc2l6ZXMuKSknKTtcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIGF4ZXMgPT09IHVuZGVmaW5lZCB8fCB1dGlscy5pc0ludGVnZXJBcnJheShheGVzKSxcbiAgICAgICAgJ1RoZSBheGVzIHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgIGlmIChheGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgICBzaXplcy5sZW5ndGggPT09IGF4ZXMubGVuZ3RoLCAnVGhlIGxlbmd0aCBvZiBheGVzIGlzIGludmFsaWQuKSknKTtcbiAgICB9XG4gICAgdGhpcy5heGVzXyA9IGF4ZXM7XG4gIH1cblxuICBpbnB1dHMoKTogTUxPcGVyYW5kW10ge1xuICAgIHJldHVybiBbdGhpcy5pbnB1dF9dO1xuICB9XG5cbiAgcnVuKGlucHV0VGVuc29yczogTWFwPE1MT3BlcmFuZCwgdGYuVGVuc29yPik6IHRmLlRlbnNvciB7XG4gICAgY29uc3QgaW5wdXQ6IHRmLlRlbnNvcjREID0gaW5wdXRUZW5zb3JzLmdldCh0aGlzLmlucHV0XykgYXMgdGYuVGVuc29yNEQ7XG4gICAgY29uc3QgcmFuayA9IGlucHV0LnNoYXBlLmxlbmd0aDtcbiAgICBpZiAodGhpcy5heGVzXyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBhc3N1bWUgYXhlcyBpcyBbMCwgMSwuLi5yLTFdIGlmIGl0IGlzIG5vdCBkZWZpbmVkLlxuICAgICAgdGhpcy5heGVzXyA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5rOyArK2kpIHtcbiAgICAgICAgdGhpcy5heGVzXy5wdXNoKGkpO1xuICAgICAgfVxuICAgIH1cbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIHRoaXMuYXhlc18uZXZlcnkoYXhpcyA9PiBheGlzIDwgcmFuayAmJiBheGlzID49IC1yYW5rKSxcbiAgICAgICAgJ1RoZSB2YWx1ZSBvZiBheGVzIGlzIGludmFsaWQuJyk7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICB0aGlzLnN0YXJ0c18ubGVuZ3RoID09PSB0aGlzLmF4ZXNfLmxlbmd0aCxcbiAgICAgICAgJ1RoZSBsZW5ndGggb2Ygc3RhcnRzIGlzIGludmFsaWQuJyk7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICB0aGlzLnNpemVzXy5sZW5ndGggPT09IHRoaXMuYXhlc18ubGVuZ3RoLFxuICAgICAgICAnVGhlIGxlbmd0aCBvZiBzaXplcyBpcyBpbnZhbGlkLicpO1xuXG4gICAgY29uc3QgYmVnaW46IG51bWJlcltdID0gbmV3IEFycmF5KHRoaXMuYXhlc18ubGVuZ3RoKS5maWxsKDApO1xuICAgIGNvbnN0IHNpemU6IG51bWJlcltdID0gbmV3IEFycmF5KHRoaXMuYXhlc18ubGVuZ3RoKS5maWxsKC0xKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYXhlc18ubGVuZ3RoOyArK2kpIHtcbiAgICAgIGxldCBheGlzID0gdGhpcy5heGVzX1tpXTtcbiAgICAgIGlmIChheGlzIDwgMCkge1xuICAgICAgICBheGlzID0gcmFuayArIGF4aXM7XG4gICAgICB9XG4gICAgICBiZWdpbltheGlzXSA9IHRoaXMuc3RhcnRzX1tpXTtcbiAgICAgIHNpemVbYXhpc10gPSB0aGlzLnNpemVzX1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIHRmLnNsaWNlKGlucHV0LCBiZWdpbiwgc2l6ZSk7XG4gIH1cbn0iLCJpbXBvcnQgKiBhcyB0ZiBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01MT3BlcmFuZH0gZnJvbSAnLi4vb3BlcmFuZCc7XG5pbXBvcnQge1NpbmdsZU91dHB1dE9wZXJhdGlvbn0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIFNvZnRtYXggZXh0ZW5kcyBTaW5nbGVPdXRwdXRPcGVyYXRpb24ge1xuICBwcml2YXRlIHhfOiBNTE9wZXJhbmQ7XG5cbiAgY29uc3RydWN0b3IoeDogTUxPcGVyYW5kKSB7XG4gICAgc3VwZXIoeC5idWlsZGVyKTtcbiAgICB1dGlscy52YWxpZGF0ZU9wZXJhbmQoeCk7XG4gICAgdGhpcy54XyA9IHg7XG4gIH1cblxuICBpbnB1dHMoKTogTUxPcGVyYW5kW10ge1xuICAgIHJldHVybiBbdGhpcy54X107XG4gIH1cblxuICBydW4oaW5wdXRUZW5zb3JzOiBNYXA8TUxPcGVyYW5kLCB0Zi5UZW5zb3I+KTogdGYuVGVuc29yIHtcbiAgICBjb25zdCB4OiB0Zi5UZW5zb3IgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMueF8pO1xuICAgIGlmICh4LnJhbmsgIT09IDIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHJhbmsgb2YgeCBwYXJhbWV0ZXIgc2hvdWxkIGJlIDIuJyk7XG4gICAgfVxuICAgIHJldHVybiB0Zi5zb2Z0bWF4KHgpO1xuICB9XG59IiwiaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNTFNwbGl0T3B0aW9uc30gZnJvbSAnLi4vZ3JhcGhfYnVpbGRlcic7XG5pbXBvcnQge01MT3BlcmFuZCwgT3V0cHV0T3BlcmFuZH0gZnJvbSAnLi4vb3BlcmFuZCc7XG5pbXBvcnQge09wZXJhdGlvbn0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIFNwbGl0IGV4dGVuZHMgT3BlcmF0aW9uIHtcbiAgcHJpdmF0ZSBpbnB1dF86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSBzcGxpdHNfOiBudW1iZXJ8bnVtYmVyW107XG4gIHByaXZhdGUgYXhpc18/OiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBpbnB1dDogTUxPcGVyYW5kLCBzcGxpdHM6IG51bWJlcnxudW1iZXJbXSwgb3B0aW9uczogTUxTcGxpdE9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKGlucHV0LmJ1aWxkZXIpO1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZChpbnB1dCk7XG4gICAgdGhpcy5pbnB1dF8gPSBpbnB1dDtcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIHV0aWxzLmlzSW50ZWdlcihzcGxpdHMpIHx8IHV0aWxzLmlzSW50ZWdlckFycmF5KHNwbGl0cyBhcyBudW1iZXJbXSksXG4gICAgICAgICdUaGUgc3BsaXRzIHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgIHRoaXMuc3BsaXRzXyA9IHNwbGl0cztcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIG9wdGlvbnMuYXhpcyA9PT0gdW5kZWZpbmVkIHx8IHV0aWxzLmlzSW50ZWdlcihvcHRpb25zLmF4aXMpLFxuICAgICAgICAnVGhlIG9wdGlvbnMuYXhpcyBpcyBpbnZhbGlkLicpO1xuICAgIHRoaXMuYXhpc18gPSBvcHRpb25zLmF4aXM7XG5cbiAgICAvLyBQcmVwYXJlIG91dHB1dHMuXG4gICAgY29uc3QgbnVtT3V0cHV0cyA9XG4gICAgICAgIHV0aWxzLmlzSW50ZWdlcihzcGxpdHMpID8gc3BsaXRzIDogKHNwbGl0cyBhcyBudW1iZXJbXSkubGVuZ3RoO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtT3V0cHV0czsgKytpKSB7XG4gICAgICB0aGlzLm91dHB1dHMucHVzaChuZXcgT3V0cHV0T3BlcmFuZCh0aGlzKSk7XG4gICAgfVxuICB9XG5cbiAgaW5wdXRzKCk6IE1MT3BlcmFuZFtdIHtcbiAgICByZXR1cm4gW3RoaXMuaW5wdXRfXTtcbiAgfVxuXG4gIGNvbXB1dGVJbXBsKGlucHV0VGVuc29yczogTWFwPE1MT3BlcmFuZCwgdGYuVGVuc29yPik6IHRmLlRlbnNvcltdIHtcbiAgICBjb25zdCBpbnB1dDogdGYuVGVuc29yID0gaW5wdXRUZW5zb3JzLmdldCh0aGlzLmlucHV0Xyk7XG4gICAgcmV0dXJuIHRmLnNwbGl0KGlucHV0LCB0aGlzLnNwbGl0c18sIHRoaXMuYXhpc18pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyB0ZiBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01MT3BlcmFuZH0gZnJvbSAnLi4vb3BlcmFuZCc7XG5pbXBvcnQge1NpbmdsZU91dHB1dE9wZXJhdGlvbn0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIFNxdWVlemUgZXh0ZW5kcyBTaW5nbGVPdXRwdXRPcGVyYXRpb24ge1xuICBwcml2YXRlIGlucHV0XzogTUxPcGVyYW5kO1xuICBwcml2YXRlIGF4ZXNfPzogbnVtYmVyW107XG5cbiAgY29uc3RydWN0b3IoaW5wdXQ6IE1MT3BlcmFuZCwgYXhlcz86IG51bWJlcltdKSB7XG4gICAgc3VwZXIoaW5wdXQuYnVpbGRlcik7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKGlucHV0KTtcbiAgICB0aGlzLmlucHV0XyA9IGlucHV0O1xuICAgIGlmIChheGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgICB1dGlscy5pc0ludGVnZXJBcnJheShheGVzKSAmJiBheGVzLmxlbmd0aCAhPT0gMCxcbiAgICAgICAgICAnVGhlIGF4ZXMgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgfVxuICAgIHRoaXMuYXhlc18gPSBheGVzO1xuICB9XG5cbiAgaW5wdXRzKCk6IE1MT3BlcmFuZFtdIHtcbiAgICByZXR1cm4gW3RoaXMuaW5wdXRfXTtcbiAgfVxuXG4gIHJ1bihpbnB1dFRlbnNvcnM6IE1hcDxNTE9wZXJhbmQsIHRmLlRlbnNvcj4pOiB0Zi5UZW5zb3Ige1xuICAgIGNvbnN0IGlucHV0OiB0Zi5UZW5zb3IgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuaW5wdXRfKTtcbiAgICByZXR1cm4gdGYuc3F1ZWV6ZShpbnB1dCwgdGhpcy5heGVzXyk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIHRmIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TUxPcGVyYW5kfSBmcm9tICcuLi9vcGVyYW5kJztcbmltcG9ydCB7U2luZ2xlT3V0cHV0T3BlcmF0aW9ufSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNwb3NlIGV4dGVuZHMgU2luZ2xlT3V0cHV0T3BlcmF0aW9uIHtcbiAgcHJpdmF0ZSBpbnB1dF86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSBwZXJtdXRhdGlvbl8/OiBudW1iZXJbXTtcblxuICBjb25zdHJ1Y3RvcihpbnB1dDogTUxPcGVyYW5kLCBwZXJtdXRhdGlvbj86IG51bWJlcltdKSB7XG4gICAgc3VwZXIoaW5wdXQuYnVpbGRlcik7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKGlucHV0KTtcbiAgICB0aGlzLmlucHV0XyA9IGlucHV0O1xuICAgIGlmIChwZXJtdXRhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgICAgdXRpbHMuaXNJbnRlZ2VyQXJyYXkocGVybXV0YXRpb24pICYmIHBlcm11dGF0aW9uLmxlbmd0aCAhPT0gMCxcbiAgICAgICAgICAnVGhlIHBlcm11dGF0aW9uIHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgIH1cbiAgICB0aGlzLnBlcm11dGF0aW9uXyA9IHBlcm11dGF0aW9uO1xuICB9XG5cbiAgaW5wdXRzKCk6IE1MT3BlcmFuZFtdIHtcbiAgICByZXR1cm4gW3RoaXMuaW5wdXRfXTtcbiAgfVxuXG4gIHJ1bihpbnB1dFRlbnNvcnM6IE1hcDxNTE9wZXJhbmQsIHRmLlRlbnNvcj4pOiB0Zi5UZW5zb3Ige1xuICAgIGNvbnN0IGlucHV0OiB0Zi5UZW5zb3IgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuaW5wdXRfKTtcbiAgICByZXR1cm4gdGYudHJhbnNwb3NlKGlucHV0LCB0aGlzLnBlcm11dGF0aW9uXyk7XG4gIH1cbn0iLCJpbXBvcnQgKiBhcyB0ZiBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01MT3BlcmFuZCwgT3V0cHV0T3BlcmFuZH0gZnJvbSAnLi4vb3BlcmFuZCc7XG5pbXBvcnQge01MT3BlcmF0b3IsIFNpbmdsZU91dHB1dE9wZXJhdGlvbn0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFVuYXJ5IGV4dGVuZHMgU2luZ2xlT3V0cHV0T3BlcmF0aW9uIHtcbiAgcHJvdGVjdGVkIHhfOiBNTE9wZXJhbmQ7XG5cbiAgY29uc3RydWN0b3IoeDogTUxPcGVyYW5kKSB7XG4gICAgaWYgKHggIT09IHVuZGVmaW5lZCkge1xuICAgICAgc3VwZXIoeC5idWlsZGVyKTtcbiAgICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZCh4KTtcbiAgICAgIHRoaXMueF8gPSB4O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdXBlcih1bmRlZmluZWQpO1xuICAgICAgdGhpcy54XyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBpbnB1dHMoKTogTUxPcGVyYW5kW10ge1xuICAgIHJldHVybiBbdGhpcy54X107XG4gIH1cblxuICBydW4oaW5wdXRUZW5zb3JzOiBNYXA8TUxPcGVyYW5kLCB0Zi5UZW5zb3I+KTogdGYuVGVuc29yIHtcbiAgICBjb25zdCB4OiB0Zi5UZW5zb3IgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMueF8pO1xuICAgIHJldHVybiB0aGlzLnJ1bk9wKHgpO1xuICB9XG5cbiAgYWJzdHJhY3QgcnVuT3AoeDogdGYuVGVuc29yKTogdGYuVGVuc29yO1xufVxuXG5leHBvcnQgY2xhc3MgRXhwIGV4dGVuZHMgVW5hcnkge1xuICBydW5PcCh4OiB0Zi5UZW5zb3IpOiB0Zi5UZW5zb3Ige1xuICAgIHJldHVybiB0Zi5leHAoeCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNxcnQgZXh0ZW5kcyBVbmFyeSB7XG4gIHJ1bk9wKHg6IHRmLlRlbnNvcik6IHRmLlRlbnNvciB7XG4gICAgcmV0dXJuIHRmLnNxcnQoeCk7XG4gIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFVuYXJ5TUxPcGVyYXRvciBleHRlbmRzIFVuYXJ5IGltcGxlbWVudHMgTUxPcGVyYXRvciB7XG4gIGFwcGx5KHg6IE1MT3BlcmFuZCk6IE91dHB1dE9wZXJhbmQge1xuICAgIHRoaXMuYnVpbGRlcl8gPSB4LmJ1aWxkZXI7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKHgpO1xuICAgIHRoaXMueF8gPSB4O1xuICAgIHRoaXMuY3JlYXRlT3V0cHV0KCk7XG4gICAgcmV0dXJuIHRoaXMub3V0cHV0O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTaWdtb2lkIGV4dGVuZHMgVW5hcnlNTE9wZXJhdG9yIHtcbiAgcnVuT3AoeDogdGYuVGVuc29yKTogdGYuVGVuc29yIHtcbiAgICByZXR1cm4gdGYuc2lnbW9pZCh4KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGFuaCBleHRlbmRzIFVuYXJ5TUxPcGVyYXRvciB7XG4gIHJ1bk9wKHg6IHRmLlRlbnNvcik6IHRmLlRlbnNvciB7XG4gICAgcmV0dXJuIHRmLnRhbmgoeCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlbHUgZXh0ZW5kcyBVbmFyeU1MT3BlcmF0b3Ige1xuICBydW5PcCh4OiB0Zi5UZW5zb3IpOiB0Zi5UZW5zb3Ige1xuICAgIHJldHVybiB0Zi5yZWx1KHgpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyB0ZiBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtFeHBsaWNpdFBhZGRpbmd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZS9zcmMvb3BzL2NvbnZfdXRpbCc7XG5cbmltcG9ydCB7TUxBdXRvUGFkLCBNTEJ1ZmZlclZpZXd9IGZyb20gJy4vZ3JhcGhfYnVpbGRlcic7XG5pbXBvcnQge01MT3BlcmFuZCwgTUxPcGVyYW5kRGVzY3JpcHRvciwgTUxPcGVyYW5kVHlwZX0gZnJvbSAnLi9vcGVyYW5kJztcbmltcG9ydCB7QXJyYXlCdWZmZXJWaWV3IGFzIFR5cGVkQXJyYXl9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0KGV4cHI6IGJvb2xlYW4sIG1zZzogc3RyaW5nKTogdm9pZCB7XG4gIGlmICghZXhwcikge1xuICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Jvb2xlYW4odmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNJbnRlZ2VyKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIE51bWJlci5pc0ludGVnZXIodmFsdWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNJbnRlZ2VyQXJyYXkoYXJyYXk6IG51bWJlcltdKTogYm9vbGVhbiB7XG4gIHJldHVybiBhcnJheSBpbnN0YW5jZW9mIEFycmF5ICYmIGFycmF5LmV2ZXJ5KHYgPT4gaXNJbnRlZ2VyKHYpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVHlwZWRBcnJheShhcnJheTogTUxCdWZmZXJWaWV3fFdlYkdMVGV4dHVyZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gYXJyYXkgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkgfHwgYXJyYXkgaW5zdGFuY2VvZiBJbnQzMkFycmF5IHx8XG4gICAgICBhcnJheSBpbnN0YW5jZW9mIFVpbnQzMkFycmF5IHx8IGFycmF5IGluc3RhbmNlb2YgSW50MTZBcnJheSB8fFxuICAgICAgYXJyYXkgaW5zdGFuY2VvZiBVaW50MTZBcnJheSB8fCBhcnJheSBpbnN0YW5jZW9mIEludDhBcnJheSB8fFxuICAgICAgYXJyYXkgaW5zdGFuY2VvZiBVaW50OEFycmF5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHlwZWRBcnJheSh0eXBlOiBNTE9wZXJhbmRUeXBlKTogRmxvYXQzMkFycmF5Q29uc3RydWN0b3J8XG4gICAgSW50MzJBcnJheUNvbnN0cnVjdG9yfFVpbnQzMkFycmF5Q29uc3RydWN0b3J8VWludDE2QXJyYXlDb25zdHJ1Y3RvcnxcbiAgICBJbnQ4QXJyYXlDb25zdHJ1Y3RvcnxVaW50OEFycmF5Q29uc3RydWN0b3Ige1xuICBpZiAodHlwZSA9PT0gJ2Zsb2F0MzInKSB7XG4gICAgcmV0dXJuIEZsb2F0MzJBcnJheTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnaW50MzInKSB7XG4gICAgcmV0dXJuIEludDMyQXJyYXk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3VpbnQzMicpIHtcbiAgICByZXR1cm4gVWludDMyQXJyYXk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2Zsb2F0MTYnKSB7XG4gICAgcmV0dXJuIFVpbnQxNkFycmF5O1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdpbnQ4Jykge1xuICAgIHJldHVybiBJbnQ4QXJyYXk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3VpbnQ4Jykge1xuICAgIHJldHVybiBVaW50OEFycmF5O1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignVHlwZSBpcyBub3Qgc3VwcG9ydGVkLicpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZVR5cGVkQXJyYXkodmFsdWU6IFR5cGVkQXJyYXkpOiBUeXBlZEFycmF5IHtcbiAgbGV0IGFycmF5O1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkpIHtcbiAgICBhcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkodmFsdWUubGVuZ3RoKTtcbiAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEludDMyQXJyYXkpIHtcbiAgICBhcnJheSA9IG5ldyBJbnQzMkFycmF5KHZhbHVlLmxlbmd0aCk7XG4gIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBVaW50MzJBcnJheSkge1xuICAgIGFycmF5ID0gbmV3IFVpbnQzMkFycmF5KHZhbHVlLmxlbmd0aCk7XG4gIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBVaW50MTZBcnJheSkge1xuICAgIGFycmF5ID0gbmV3IFVpbnQxNkFycmF5KHZhbHVlLmxlbmd0aCk7XG4gIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnQ4QXJyYXkpIHtcbiAgICBhcnJheSA9IG5ldyBJbnQ4QXJyYXkodmFsdWUubGVuZ3RoKTtcbiAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICBhcnJheSA9IG5ldyBVaW50OEFycmF5KHZhbHVlLmxlbmd0aCk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUeXBlIGlzIG5vdCBzdXBwb3J0ZWQuJyk7XG4gIH1cbiAgYXJyYXkuc2V0KHZhbHVlKTtcbiAgcmV0dXJuIGFycmF5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGF0YVR5cGUodHlwZTogTUxPcGVyYW5kVHlwZSk6IHRmLkRhdGFUeXBlIHtcbiAgaWYgKHR5cGUgPT09ICdmbG9hdDMyJykge1xuICAgIHJldHVybiAnZmxvYXQzMic7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2ludDMyJykge1xuICAgIHJldHVybiAnaW50MzInO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIG9wZXJhbmQgdHlwZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IFRGLmpzLicpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVPcGVyYW5kRGVzY3JpcHRvckZyb21UZW5zb3IodGVuc29yOiB0Zi5UZW5zb3IpOlxuICAgIE1MT3BlcmFuZERlc2NyaXB0b3Ige1xuICBsZXQgdHlwZTogTUxPcGVyYW5kVHlwZTtcbiAgaWYgKHRlbnNvci5kdHlwZSA9PT0gJ2Zsb2F0MzInKSB7XG4gICAgdHlwZSA9IE1MT3BlcmFuZFR5cGUuZmxvYXQzMjtcbiAgfSBlbHNlIGlmICh0ZW5zb3IuZHR5cGUgPT09ICdpbnQzMicpIHtcbiAgICB0eXBlID0gTUxPcGVyYW5kVHlwZS5pbnQzMjtcbiAgfVxuICByZXR1cm4ge3R5cGUsIGRpbWVuc2lvbnM6IHRlbnNvci5zaGFwZX0gYXMgTUxPcGVyYW5kRGVzY3JpcHRvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlT3BlcmFuZERlc2NyaXB0b3IoZGVzYzogTUxPcGVyYW5kRGVzY3JpcHRvcik6IHZvaWQge1xuICBhc3NlcnQoZGVzYy50eXBlIGluIE1MT3BlcmFuZFR5cGUsICdUaGUgb3BlcmFuZCB0eXBlIGlzIGludmFsaWQuJyk7XG4gIGlmIChkZXNjLmRpbWVuc2lvbnMpIHtcbiAgICBhc3NlcnQoaXNJbnRlZ2VyQXJyYXkoZGVzYy5kaW1lbnNpb25zKSwgJ1RoZSBkaW1lbnNpb25zIGlzIGludmFsaWQuJyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRHlhbm1pY1NoYXBlKGRpbWVuc2lvbnM6IG51bWJlcltdKTogYm9vbGVhbiB7XG4gIHJldHVybiAhZGltZW5zaW9ucy5ldmVyeSh4ID0+IHggPiAwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlVHlwZWRBcnJheShcbiAgICB2YWx1ZTogVHlwZWRBcnJheSwgdHlwZTogTUxPcGVyYW5kVHlwZSwgZGltZW5zaW9uczogbnVtYmVyW10pOiB2b2lkIHtcbiAgYXNzZXJ0KGlzVHlwZWRBcnJheSh2YWx1ZSksICdUaGUgdmFsdWUgaXMgbm90IGEgdHlwZWQgYXJyYXkuJyk7XG4gIGFzc2VydCh2YWx1ZSBpbnN0YW5jZW9mIGdldFR5cGVkQXJyYXkodHlwZSksICdUaGUgdHlwZSBvZiB2YWx1ZSBpcyBpbnZhbGlkLicpO1xuICBhc3NlcnQoXG4gICAgICB2YWx1ZS5sZW5ndGggPT09IHNpemVGcm9tRGltZW5zaW9ucyhkaW1lbnNpb25zKSxcbiAgICAgIGB0aGUgdmFsdWUgbGVuZ3RoICR7dmFsdWUubGVuZ3RofSBpcyBpbnZhbGlkLCBzaXplIG9mIGAgK1xuICAgICAgICAgIGBbJHtkaW1lbnNpb25zfV0gJHtzaXplRnJvbURpbWVuc2lvbnMoZGltZW5zaW9ucyl9IGAgK1xuICAgICAgICAgICdpcyBleHBlY3RlZC4nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlVmFsdWVUeXBlKHZhbHVlOiBudW1iZXIsIHR5cGU6IE1MT3BlcmFuZFR5cGUpOiB2b2lkIHtcbiAgaWYgKHR5cGUgPT09IE1MT3BlcmFuZFR5cGUuaW50MzIpIHtcbiAgICBhc3NlcnQoTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSksICd0aGUgdmFsdWUgaXMgbm90IGFuIGludDMyLicpO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1MT3BlcmFuZFR5cGUudWludDMyKSB7XG4gICAgYXNzZXJ0KFxuICAgICAgICBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSAmJiB2YWx1ZSA+PSAwLCAndGhlIHZhbHVlIGlzIG5vdCBhbiB1aW50MzIuJyk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTUxPcGVyYW5kVHlwZS5pbnQ4KSB7XG4gICAgYXNzZXJ0KFxuICAgICAgICBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSAmJiB2YWx1ZSA+PSAtMTI4ICYmIHZhbHVlIDw9IDEyNyxcbiAgICAgICAgJ3RoZSB2YWx1ZSBpcyBub3QgYW4gaW50OC4nKTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNTE9wZXJhbmRUeXBlLnVpbnQ4KSB7XG4gICAgYXNzZXJ0KFxuICAgICAgICBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSAmJiB2YWx1ZSA+PSAwICYmIHZhbHVlIDw9IDI1NSxcbiAgICAgICAgJ3RoZSB2YWx1ZSBpcyBub3QgYW4gdWludDguJyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRlbnNvcihcbiAgICBkZXNjOiBNTE9wZXJhbmREZXNjcmlwdG9yLFxuICAgIHZhbHVlOiBNTEJ1ZmZlclZpZXd8V2ViR0xUZXh0dXJlfG51bWJlcik6IHRmLlRlbnNvciB7XG4gIGNvbnN0IGR0eXBlOiB0Zi5EYXRhVHlwZSA9IGdldERhdGFUeXBlKGRlc2MudHlwZSk7XG4gIGlmIChkZXNjLmRpbWVuc2lvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydChcbiAgICAgICAgaXNUeXBlZEFycmF5KHZhbHVlIGFzIE1MQnVmZmVyVmlldyB8IFdlYkdMVGV4dHVyZSksXG4gICAgICAgICdPbmx5IEFycmF5QnVmZmVyVmlldyB2YWx1ZSBpcyBzdXBwb3J0ZWQuJyk7XG4gICAgY29uc3QgYXJyYXkgPSB2YWx1ZSBhcyBUeXBlZEFycmF5O1xuICAgIHZhbGlkYXRlVHlwZWRBcnJheShhcnJheSwgZGVzYy50eXBlLCBkZXNjLmRpbWVuc2lvbnMpO1xuICAgIGNvbnN0IGNsb25lZEFycmF5ID0gY2xvbmVUeXBlZEFycmF5KGFycmF5KTtcbiAgICByZXR1cm4gdGYudGVuc29yKGNsb25lZEFycmF5LCBkZXNjLmRpbWVuc2lvbnMsIGR0eXBlKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgdmFsaWRhdGVWYWx1ZVR5cGUodmFsdWUsIGRlc2MudHlwZSk7XG4gICAgICByZXR1cm4gdGYuc2NhbGFyKHZhbHVlLCBkdHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbGlkYXRlVHlwZWRBcnJheSh2YWx1ZSBhcyBUeXBlZEFycmF5LCBkZXNjLnR5cGUsIGRlc2MuZGltZW5zaW9ucyk7XG4gICAgICByZXR1cm4gdGYuc2NhbGFyKCh2YWx1ZSBhcyBUeXBlZEFycmF5KVswXSwgZHR5cGUpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2l6ZUZyb21EaW1lbnNpb25zKGRpbTogbnVtYmVyW10pOiBudW1iZXIge1xuICBpZiAoZGltID09PSB1bmRlZmluZWQgfHwgKGlzSW50ZWdlckFycmF5KGRpbSkgJiYgZGltLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAvLyBzY2FsYXJcbiAgICByZXR1cm4gMTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZGltLnJlZHVjZShcbiAgICAgICAgKGFjY3VtdWxhdG9yLCBjdXJyZW50VmFsdWUpID0+XG4gICAgICAgICAgICBjdXJyZW50VmFsdWUgPiAwID8gYWNjdW11bGF0b3IgKiBjdXJyZW50VmFsdWUgOiBhY2N1bXVsYXRvcixcbiAgICAgICAgMSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlT3BlcmFuZChpbnB1dDogTUxPcGVyYW5kLCBuYW1lID0gJycpOiB2b2lkIHtcbiAgYXNzZXJ0KFxuICAgICAgaW5wdXQgaW5zdGFuY2VvZiBNTE9wZXJhbmQsIGBUaGUgcGFyYW1ldGVyICR7bmFtZX0gaXMgbm90IGFuIG9wZXJhbmQuYCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZU9wdGlvbmFsT3BlcmFuZChpbnB1dDogTUxPcGVyYW5kLCBuYW1lID0gJycpOiB2b2lkIHtcbiAgYXNzZXJ0KFxuICAgICAgaW5wdXQgPT09IHVuZGVmaW5lZCB8fCBpbnB1dCBpbnN0YW5jZW9mIE1MT3BlcmFuZCxcbiAgICAgIGBUaGUgcGFyYW1ldGVyICR7bmFtZX0gaXMgbm90IGFuIG9wdGlvbmFsIG9wZXJhbmQuYCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUF4ZXMoYXhlczogbnVtYmVyW10sIHJhbms6IG51bWJlcik6IGJvb2xlYW4ge1xuICBpZiAodHlwZW9mIGF4ZXMgIT09ICd1bmRlZmluZWQnICYmIGF4ZXMubGVuZ3RoID4gMCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXhlcy5sZW5ndGg7ICsraSkge1xuICAgICAgaWYgKGF4ZXNbaV0gPj0gcmFuayB8fCBheGVzW2ldIDwgLXJhbmspIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhZGRpbmdzKFxuICAgIGlucHV0OiB0Zi5UZW5zb3I0RCwgZmlsdGVyOiB0Zi5UZW5zb3I0RCxcbiAgICBwYWRkaW5nOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgc3RyaWRlczogW251bWJlciwgbnVtYmVyXSxcbiAgICBvdXRwdXRQYWRkaW5nOiBbbnVtYmVyLCBudW1iZXJdLCBkaWxhdGlvbnM6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgYXV0b1BhZDogTUxBdXRvUGFkKTogJ3ZhbGlkJ3wnc2FtZSd8RXhwbGljaXRQYWRkaW5nIHtcbiAgLy8gV2ViTk4gcGFkZGluZzpcbiAgLy8gICBbYmVnaW5uaW5nX2hlaWdodCwgZW5kaW5nX2hlaWdodCwgYmVnaW5uaW5nX3dpZHRoLCBlbmRpbmdfd2lkdGhdXG4gIC8vIHRmLmNvbnYyZCBOSFdDIHNob3VsZCBiZSBpbiB0aGUgZm9sbG93aW5nIGZvcm06XG4gIC8vICAgW1swLCAwXSwgW3BhZF90b3AscGFkX2JvdHRvbV0sIFtwYWRfbGVmdCwgcGFkX3JpZ2h0XSwgWzAsIDBdXVxuICBsZXQgcmVzdWx0UGFkZGluZzogJ3ZhbGlkJ3wnc2FtZSd8RXhwbGljaXRQYWRkaW5nO1xuICBpZiAoYXV0b1BhZCA9PT0gTUxBdXRvUGFkLmV4cGxpY2l0KSB7XG4gICAgaWYgKHBhZGRpbmcuZXZlcnkodiA9PiB2ID09PSAwKSkge1xuICAgICAgcmVzdWx0UGFkZGluZyA9ICd2YWxpZCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFBhZGRpbmcgPSBbXG4gICAgICAgIFswLCAwXSwgW3BhZGRpbmdbMF0sIHBhZGRpbmdbMV1dLCBbcGFkZGluZ1syXSwgcGFkZGluZ1szXV0sIFswLCAwXVxuICAgICAgXSBhcyBFeHBsaWNpdFBhZGRpbmc7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChhdXRvUGFkID09PSBNTEF1dG9QYWRbJ3NhbWUtdXBwZXInXSkge1xuICAgICAgcmVzdWx0UGFkZGluZyA9ICdzYW1lJztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBleHBsaWNpdCBwYWRkaW5ncyBmb3IgJ3NhbWUtbG93ZXInXG4gICAgICByZXN1bHRQYWRkaW5nID0gW1swLCAwXSwgWzAsIDBdLCBbMCwgMF0sIFswLCAwXV07XG4gICAgICBjb25zdCBvdXRwdXRTaXplcyA9IFswLCAwXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjsgKytpKSB7XG4gICAgICAgIG91dHB1dFNpemVzW2ldID0gTWF0aC5jZWlsKGlucHV0LnNoYXBlWzEgKyBpXSAvIHN0cmlkZXNbaV0pO1xuICAgICAgfVxuICAgICAgY29uc3QgdG90YWxQYWRkaW5nOiBbbnVtYmVyLCBudW1iZXJdID0gWzAsIDBdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyOyArK2kpIHtcbiAgICAgICAgdG90YWxQYWRkaW5nW2ldID0gc3RyaWRlc1tpXSAqIChvdXRwdXRTaXplc1tpXSAtIDEpICsgb3V0cHV0UGFkZGluZ1tpXSArXG4gICAgICAgICAgICAoKGZpbHRlci5zaGFwZVtpXSAtIDEpICogZGlsYXRpb25zW2ldICsgMSkgLSBpbnB1dC5zaGFwZVsxICsgaV07XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI7ICsraSkge1xuICAgICAgICByZXN1bHRQYWRkaW5nW2kgKyAxXVswXSA9XG4gICAgICAgICAgICB0b3RhbFBhZGRpbmdbaV0gLSBNYXRoLmZsb29yKHRvdGFsUGFkZGluZ1tpXSAvIDIpO1xuICAgICAgICByZXN1bHRQYWRkaW5nW2kgKyAxXVsxXSA9IE1hdGguZmxvb3IodG90YWxQYWRkaW5nW2ldIC8gMik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHRQYWRkaW5nO1xufSJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file

v@8uLLZYohve=EEaVy-HRgqEbIC5t4SS#(Cv ze@)&up)G#*kdn!Iwd3z3kWcV_WF29dPu97IGn4hmWIf7ceR=$m1@Az4=q-2$W)71!Rax*3 zgeA<&Eni9d#kIM*bb-_Du*74BUdxy6yY#V6{ zi<1W@@|PwBkFM}Ec(@q|jXo{V9PviZ*tZZS3r8g9l@*I|FU(AVb!VTL{|i{7cd| z`~?->tP1~8ZQQ8PpApzzv@u<_G2Pb&2;=I$v~^($bGiD~^mWzE_C#xexZhCKlhmh* zSMqCUaRpU)874!D!~(k1lApB)ApA2Jc9rO1vxxDH;er@@hq<@3j~HL&4eIngpQNqF z6#5i_M-{ME_Y4=r*h4vMH`4nEv{LOJHh`!{$dD0ZciDy!<6%{}TWvg~&|eYQRkSfv zwlUM!#=OM1mkb#(?jhJujJs9gzpIVA6nccf9Yq^E%QklQwP6pfz}8}A=)%L^xop*w zm-CqGl5_{T^Uwa3m?h~gB@lnLn`UlSGk>VijSBrWf$c@h(`xzcyT#7adCQqRHAs8B zU!EQxF&}3C@X{O-wo4M?iakKWHZ^@+06eD97YRJ7fG1(QBq8Ny$f zD!lD4srn&>{+7V5qK%odjhVhS<|iQ;auO08AfYO}Pi@?#(3c3@QM9qMY-49%8|Lj@ zlCX~>3lfrh4hc&jJPFmz7uE8O3jJ>a+l!W`)pAC{zLq6=(!Jm4C*e2xN!Xk%g>gwj zJj3k;oh7NM#IN!gTKb;?;4y{%k-(!0coL$2GnKf9aIn$pl^k<}}ZW*Jq!Hlct`@n$4 zLnY;gxNo~(e-6>^O;Tx(DYTcsqY8M+4V9Fm+${as7--`WGUSvi+whcAh4-k9hZOoh z1a=i|%#>}+^tHiL>ejB?whEbmr@pHmxmDfA5jcNA^xEZf-G*M=rF z9IMDlGoSt>cmBDc9BCQ*c*?1nUlR;BD)jFJwihi=tL2PxdCQspRGz*4!ngN;!q+NE z*qSAL+^CzrR{%Vw&^`i>D&R@jDoIGW0}CG+auSwpcoM3@zg8O$DfAS9T}2x+Wg9bn zZOl(XGUOyAI6y*G`07tn^<5SM$vk12^dU4=3gN zlX3?pAsKQKmThE1>`icAr=Gew++dc;xM%euzHVgrhjnjfV? z(SMIB{+-W|@&$!ntI%f^dONK?qJXu!Tdn#v#qPXS&cESZu4(Lm8W!<)QBXR5Mim(8 zKd8{VRr`Gk{U){FtAN#hPg(mteYKl%B-7l{PWzkhd$eTW!8Y zp?C0chXU5-Eo##fg+LC$!4@ zs#<+qp?A^hHx%&H)0-t8k9+GG^$d^HU+oS|M1;pjDQHwu1%}5jDD=k9ib@LoHnl&Z zfTvPf`|iHlJr5Mf>KkO5^Wbq8)d`O?s@CxML52Q6ZQiHQU3|P(0Z%)%>G60^-lp)F zVR8ga@}99Fl0I@3x)8~WR1t3cZ(RcPQY=S9bN5yjk8W z!n2NrO0hK`&t>%ESkHmnOIIZH_oz!oL0*Og$7<#-g+4|zcPL=Z z>@0D-Gw*Lz6r}!Yx7J^~D7b@yda~{oRbUjnS)n(5j@oZj=;PGBT>-0ox~zS=uXa-@ z5w8c73)Osz97>6N11tztdxedUtM0EVbdN%hDfA#8A639w*&|eWn(Zl3WfV!s^H?@8 z(;)g7ws~wsFVST0lg@`iYBm(A1&>07KCR~OQs^&)LIpeuOG@qRYkt2dq@bZt6?haX z^nVP63Vl*2RKTOKtesQJIUkrEj^|+d$v=p~N`^vyGZZRx>*s|+g?0;t3V0OC9+;u9 zQnn(d9wX1Avr+iyK~VSzH4BAoyJRSQ*g|UlA%#9o^SczV=GmAln7yz0{h{z)3JQg6 zD72HpYElRp>vAateKs<{wqSQ!Xk{w}(^k znV#6M06#)Op>DS-Fz$O;p&efkVHEmXYTu=RCrnxUOkeHupl*Qs?xg~u@E%oUD7;&t zd)3Na3Vn%>cPQWqq*grl?JQeCkqU{62bQ&&+8bQfQrQkF6V`4~rDlq_S)os;#TylR zluX+d@I)*7rMm+RYp6YZ-{;PxnBsmzR%p>g_AgszepR7=Qtgi^^bgejr~;lQX#Pxh z@8KGPymn(})J{LcNvS?UL8FN(@HA2AW*NX9Qs~RnzDog5ld|@izS@l@sExVvG~R`l z5wQ3q6?-q$8HH4>4U2ax^j@`jmqL%x<{b)n3aQPELV25d(;0;-8jVAvP$MH&{$`hF zU3qYQKsPNh!J<0Te5%$s`(}k6RGT*{^sl0k0-i=?KXsXdVUbandkRFO>Hrp@(N-!4 znO9QWD71;d->d3Z5cnE3zdWz_@{&3{I+oW9=sc9w2Q|F`aRSE%r58{?wOvBoIQjwt zzasnL1_FDje?7kjIDDJoiZ{w44cwY6=$)qAy7d;7JB9q;q}+*lxiysYYYN^ZGq7YK z$jjVk69o;eAEMB%VvL=s6~$(OI?fyuISzv)$vLeRPczg7I#P2_d@c zgkV@R!E^M89q%{s>LE$(&X`(mb}(Cj?GC0x(9>aoq;HFCRm01V@LZMW9>sc{QRgcp z$FN4GbC@rwLSA`-VC~Lg{WM`jk&joU_zAcHps6Ru+pZ}yPoiBQ=E+sqN-MSC+*5-W z5@JGn2|w+Vq6-vrKr?Yt^a8^1sliM589Oz2F+WBOdl_!j%5q@a4GYmcw;? z%AQ6zIh8Fj-gP-OSkDg}w1%Im6?B9+{O+n`U9Pb9mw@!tV3OEk?Pu_8g*KbG=E0tn z^N-!}elXcsS<)FAXXhz-pPty+6X+69-*`n7C~i4KiyV@!DHj-<5>Od1<{ese>l zM+!%#x{z@LGbEne)Ye?A=QnwuQ_phx2MUM$^P4UIIN?zK8ssR|@bq3<-O_2X)7Rn! zAfAI9DxZT~Z0~QjAh=#9EMt0|u#D+-!ZK#B6P8hXov@7B>x5<0UMKX?w%*^g_w%N@ zqxPnze}7Xj@yK)E```_P$z~`_pN-wZME5FnTJfQbC`R3o>%zF!l^!%pS z3ov*$&%{;@FXk$1!sGDMZNjA-_19GrB4 zy+WKlAvkPtz~e2x(M_E(`b!cuF^rGVk4>FLRL~?@m-a5gdPF}B{?mB$P@tURf=$)| ziueFLy~#2j2PblNZW2cJdAV7_XK{I6xVg+*A3Hoa#kkjyY;PP6!-uiK-f1GvLVwjY zm55?f3}KnB`?cf71tAAqzPSgrtSMUKZde=2f~m&cmCf8L+wHIW-(6~aV;;Amg>~DtGW~W?L6=PNEJtwq*d?16XDFYSOFWxd7 z7|4Qwn#k?pBgER#9u35_26yyzg`;Jzav=+7rdx#0AI9*4T=vv!<_sI?TsTEat+#Q@ zFyp4xrELvsDH3O?Ik6l_3i@hhEb}!}BcbzE+9pMn^hs`G2+wChUUwCQ2j$SMT&T#D z3us2@l{!bSh`*chU)Q+MsItvpnbfJvj?#Zu(*D9OxSNZVLzKca|GVa#iR=8eE!TC! zb`@ELsP|Lg((I^>yE~CwPC_Ou zIXU5zfeJ;K*|@$_wxIgm>!R22#bdj;L@vYFHSmEjiThNJ?fNWK`*?xsb>X*En}@er z5YET1J8vTXay6=Li(cg?Y|I-YsT|Y+(`heZ)t~FKXQ=5$jX4+#mJ1bh)hpF4GD`O_ z_()ihNsXr=vWzY_K_iJ3l){-c8Xa;W9!Cu-;C_4%bMCOj9!=$H(toLJTE1TN(3Gof zM#Yu&gMTG=8hs7u=6+q?x(umPIE|6#H(`Lvb zf#FbdH@LzasX#=P3Z*4cn(xOaI6N*&x4GBp|bvW z>f$;Of4&g!V;TOVwVqfR4Z5}zuBfbEcWE05G^nd+dnPYR04qVaB2s~gYNw)ZT3g+k zH4D8qckH5l)>Tsb{9M_|i6Uj$^PfE`sZuL28sXQ57-5T7W7CkSIHoH9>86Fz>^nS~ zHS*EyU_;qb#!Ef3%b2E&BoFe{lE!7_1L8|_ik{F!XYpCM?3Q?02gx_=QN znBY%%vkQL00uq{S1gpt^RAMWd_=W3a7;Z}slZ0uY-{vYPEirlW_fc2wk9eQ8Sq#SU z4Iw#m$i?%_B|Pjk8jm*P2mxrxZtk!|V$%93>?;XNcVk+hO05uL_UlF>a4aZkl3e*cJZ;I+*^LXO-*S+j=L;420jEjD<&5_5le~0y@L6w zFrTzpki3qE4>a@y$<<7B0Xo41SJeW1R7}JwFCFbAAEpa@`ePfZg(W^sQHIGe^(z`C zk83xBg*aFY;v@K@er`>7{?Ddnw?7<^l19CF!hd-*_=RqeKyzwN9}PB55sn+mll0g6l0 z5eVXzeNA?c#eY)?n;9nz$(ECRF6_ii;_Jz+m2N%xObEt?lGn-Y*C^~N$pf&I^*)#~ zdTC=`R3(v+=b&yA@n)<)erlu=gaKb!;LaqEg&mC^nU%F_LkMH6!3ZlbJEl3V38Z3H zGftJHYmh93!qja^9}g6Z(>1D!=Vg3VEf_>~v}8o(vumyn!UN@Cxv$1p?MBI0BG!v7 zI{ewN!;+C&o1Hp-(D-y|a-kPQeMhaWAb=@M znTL{}UnawgL}a(rE;2ctXqphD$DbNNc2yG~Z0U5%fei@;fV8xz(411)7nZJBE zNdLFO$oY1(41>ahLHdtMVc?fW0HS#JY-as@&a6B3$E<8fdW zMNhv4PNk|oPW4s6sj4dD)C1)BmN~WO+4L*)TjM}I~7<77V4;MJw6d9nubYf<*i=+Ghw7M4eE4>ni8ShGw~Gox+a?z2sA&cQ4PP z9}KC*%VQdCf%vhFTgkgaOmuadP`i-?bc}Gth*%zj8dkg6&A8zX#z`$(g5(cFB-4X| zwvdnO#^Fieoqw0Cc7$daO9PkL)EEG$~ z4hT;2D`Ak2i<(+6KO7_Fqt75a{na2leP}=IboT%|y`IgELuRKB{QqMojd2}u(+Cck ztcMGpnn_+?jg|Jj%T`DfYk*$zzd&~oTdbPLenjennRAsaCZwTF%hL7~OxR0y)ZpiV zBsKu%NlI?R>xgj~Zs*sx!Ccq3SPjx`@d|55;)WzMwMRwgd_Eq;huhbLZG6Dcej!EJ z#)zd`Q51l?y%vuWp?NxC+gR~Svq|FxX&{*RR_%uRX>L@Ma?z1)?bT!Aa`F|zbeq;xOa!zHF}sTE$N4XA)(Fk20+ka#pyf@p_NWTl?(Gk0rAc`L9>?kQ zL+#|v;j*Km! z&n9_@#Ya^=hAj={uTkwN7J;X+Jt{cq;X7)>uqW+D)$5YC*VYI2zrAPXp%<-`DlvP(m6Y#~`t8sjSrLvFxg!CM=P9uWL7$L}( zyw&8xlGJ@$e2_O<=2<<*LHxxitY=G+hQ@{Tvk$giWx@cWl)XZZV14$*VZ{3nZXhwiQlY0RQxu-G^^4hyu)iXdeEe|)wSYIgFk{%(T zw^0I_@vAWnqqaD$#;*}iWg>{kgD84`zIu!P*2IBr8!VdqBo`~HZlMCk1%;OeI-dMX z6*cfJ7ZyOibR0iWjiPPUS9y9y{9@(lW}>heW5TYze|@vRv?v@JL`vk_r5cCsOmFa@RnPepcV`2B9x z>fNC#T-B=HackT~B3$LRZg3la{S?T$^A^CYddt*nvy=p$@6l9pr#xCsczPwVHf+7fszy=Tz3!ZoQ3+hi~YH6J=d4 zoVb-5v;+;jy(By*-oWw}TJdg(nR1X{=|{#prJL))|U>}lMOFP}#Rs|Ghr)))ntR^KQ**ut{r_lzhWr$HvKx;2PrWo*Afo9Fgu9L=Wd8g==?Lh5(%T_MP3E+&%qFjHxOCz%)Kpr66Wd99n_9#Zt9|7x2lWtiWp zT7~`~{%Hnl^f<#XLoT?$sAzi%L1is5vMH|p9Exi2KO2{548ahd#YU*?p(v~v#PuU1 zeKf{vLuHOZDvCfSFu!-KEYVk!2F?< z3V^cE&>sv$Fp1Shk)f^psb1Y<^xykC-_)stS5ouSOjSR%$Q2HNG%~%fvR=_uwZ2fDct^uwa^){xohe6pA&({`JATObs z`3GdkVy9}e8MBz3rfq3}YK|w2YLx6~k*h(HDy{NrZ(k4v<|M>?7AK)DhWyYq2b10W z$!oUEsU#9&@DLGHE$d^$5F?Lz+N`MZN?y74?o95aZ~!SF-tR%v7{2VXPn2V4Fd*US&Y-@s%{(7*2KP^v`n4hk8S6%xu4nudc#B) zmPP4mxEF*ZphT|TgrlBuftn%%K4?l+_e0|a_zW$=$Bp8JA@Ks9P*jugLPfk#mvqoo z%i}(j%u@~H=mtG0uCs$~cfQF3j)7PM+H3n!G ziXZl@s;=U_7l@t8kX-3Te5Y{k%F z`fKu22*v`&7e5U61#4dNEh@Q`l5e8qIKNgB6#J5}<3M5LG!aSI!t;CQ^`6$-1t9NL zb#yPijp|nB)w!ZNZnfxxMUuvUvJ2EO%24?@+M1eUjjNPiBLiC)-&Bu=U<*h?7S3*a ztx;v~;3}IsxscM51||}n0ERGOfitz!)!xXb2l>Pt1YszJDE;7nXH6&k>^Aj%drlrR;F&le@HV%8-`H{<`Rq+}a? zH^U2hg17Y0pG?orpRffyZBoR7;l_z>9j&{JB*{+oViqHEIZ3XFDKjLXpuC~CWhQGT zu)MA=ytTlzN`e_7oBrX`A{V-bgFC_25?l9Clb?25sB^zAKV~B)uyQYFlh?W4P`nlr;KKPEQW;~E#=`C7kNFSfy&%^ zY_C|}+z?ZG3U(!@t_<>eAPIu_vzac?ChkhHI%J;-^>-KZczzP}PQ*DpN(SkZf5d2( zyhGDJ;mBJN$TaTc?#CRTEm-)nl78TiO@UO>Z}Kbd`{ca@0;(AArT1}=61<>8G>xRp za;mDs35dOR(D-2^Qd3AVYPTl27rX-#0La^yujU+HHv^p^5uoUtcItvO?9^DB(7p{Z zEl&=l;MCwoTe6e@n<8;|YWe{VYu#=5pjhjSL;w(6Wk zpayews%Z-Io>Ocnt0Ar+`(*;4szrmb&T{At0BjuL>%NIGb~0LHt{p$1BKWGjh>PaJg`v;9JQ6u6?cAv$Q z?exnZmkC)636)1=2!lQKiB91)rY35@uX!#43IniUq^0HHR_xHJN~>C~bQ=aynI; zO2MSC35A5oqnK;Kh7lq0VfioP3LxhsiMl2Dhdlg4n3q)jc$XXbF5DuY;g;#lY-UB{ zCGeb_;G^6VsOBp3y>C(L$N_2{vsyuOR%;@>u#G5~Hn5as3?DMUY=8hT8x~co4wU53 zg4w|ewA;o=mCgQuf2)_HE2m)EpYM#)`E5>&*mR?&jL4xaJ#t>tZ6i?9&#g2dH@-4X z9pYez>>gXCs7xlW?6#&r6ZLV3gyx#*qhG&o`NhLkU>;WW@NCQ4>tbHt+GR7=B@B#z zPcAs^>-W8VgfX#AL+z|&gAg*s9CJ8U{}iF#xPU|B(0Tx<&)P;Aug1)D9|>U&+&sx6zClimu8}7-Dhnug@&|M77PMs%EDvp%wCH4 znCXZ-=beTn6UrbRF@27-<@{sbu_!l*yC%+>Yim@^YX?pp?xFTdS$m|~aVyAbkM>); zh7YzmvabF+Xb;mE1+^@_fr&Ab!_BeHTeYJS{C?0*Cvz;`c$=|CPC)mCZTx!d`@Q6|wdqyz)?+=CPswUFozwb;nH+<) zs}?gk|Fo&5acl+2*RUu<&`;wst;jUa8m5vt^O0=&c@iKx2A2#lf^ZopBUzWDeL1y) z%QAcNn()WzKl~A@dZk7Zt=59{i+@lj)oElPh6Vn*Hj0(ksI}aP)2}Q0xX-SE#AmmG zB+rh%f#4eItkNn!=1>%*Z~a5+?yIbi0fXDg}XR=k}31Mf2! z5(g?9Qj>ofSHZ8eqNZPY`uRs>`Z_>gNL8BtX5_`@S>c1>5(Ny`ox|u^G3q!QEySe8 z{eDtt0}u@AGa4D0c#FR@H<7UyXJVL@FWOXud2EW%EX-6)pKLYKGSdV(s%F#64~BJA z*!D~E`Eh4x@Eh>TN+sQza%N3yXcG!fvlU_HzOI{gT)WX-TXK@?FKF>D&YrPwX`no7DdP{5wLL+=tMYg2k}?)*wi-9ArDn;QbKB> z4xc3EAJztf$YaKj{2({kw?&#d&$!=ny*c+^2NSYUplHN$p21DH-~LBpS{lN>>?PBLq&pBgj; znh%LjI3UPmBE5bygCx<-9ftHyts-(__A`B;#b6+g2L(1J_qC2{oWFIBFJ`UhFo}U! z9(bnZma|)BMwOi1HO`ntMU0?Yk$nwZTJj-}GKFdU zO88x>S%#wgL8D(O+tyO=^lrIj@4=FmWwn^)6DZ8Zv)mVH<6o6Cov_}jwa^YwXvPnA z)Pg`_CiJmrnQ301D7T0F%loU#Ox5;%kwZ-W`3se0Uh=Ir^OtD&`po-NS>ZBmR2%Qv zqzXmiIBZzp0os0Rc<>8lvr(3KP_2Xba#fviRXZBcBoYxC%{6R7r8ZG3wzkd}lrpv` zx2j^`6je&teEoeiB4HjHF|W+4m=`vlPuGmoQ&gghTFhsNHorEF4Y*7ZkXkLi*`$L6 zl5r92oKD2KCbpo%7;>}v-6EA*@e3z3+vfP4m9UZB*^JUx51H4QqC(UyWmDY_u%h%frff>KR2sW+C*0B)zw#q>-S*|@-4 z72u_4wh~r1*#O1aqQ7gKjKNeSMU&y+O}QbPTO-p4D@V;e06`(=djx=|vmanJ2ZBQn z1rR1|Ub1@ZCe4P!M!{FcU#MVnWj2KpsWF=}$>e;>$0F!%45Wh~nwpCZu{^2=S_gmx zd?`VL0D{U4Y`dVcIPN!&PL)_wJ@rDOuBKtPCW8Q`4DFV-;3_ zr1N6F5zR>kKq6rtkdPXIWF06#^4%E#De@q}01eY}Dl}J}0(6BO+Tt?nMI-)TRH<*P zTx;GfSU)rtMK^ca;$K;?!eZx)A-B(1?%MkncMt~t4nZO9G#~_KlPwMBN;Oj@h`JfO#i5ngXGQZxQKthvE8?)84b#2P7O#? z*_!4}2)fNXGfhA-_J588MsD@s-|$N(2yq$1ODA+0fYb&mL=Mb2hL3+o#D3n>tRH8!5Qi$EiYgVm;jXUTz>6gg&7=}!P7+zu9 zN~@{Ads{z-t|;H87)qgdRn} zVIpNTIkWpn=!Mi(@Z=EzScZk38r=+&PhYut%aeyk%QfMVbS~AlsISQ!N{~^ZJ9I{x ztY)7POwgbl&%GdH(i@`(TJ#Cf#7{LKnkI5iz6nLfaWZP45I)TZ2ol79Ua^z(cvteZ z8?9S@Bd4N+8_atnvY`H43X??ZM*KJUta2&)*T60txrvfAdG!U=>&b;tc{;p~eRitX zs2AxFb+9>YZ0)HH%b{6$aKrZa$&EA$16``M5Und!e=Z|e1__Mc*Yaf;X6P*aprWj* z;09M+xBNBRRd9P*V*p^Pv*;1o^ZMuOk1%?`DlfB1Gur5t*4fQjeID#fWijgOGQHJs zD-Now*(aBRe7~e{b>YEa@ntU~)2yPZUJDetta4R--kFiCPJCc&eAnX`B#a%1Tc1Q3*Jzqg;=Xj#{FC44Xsk9)Z@a}xGpG;yjZqEKBn;YmkavrJB_Ga1`~vQER!F*FU5w3#GabUM$dfJ# zwP1&HeDD1X)uY0^W>(QbLn;0-;IHad(Pi_R5*xvUklCevygyc)cATp*(ywMfuR7=b zWsc4LWn5*gTP4-MwR@~EcdR!Ot={+L&<6BXumavP$Lrhi^L)c)X20L?o0+%H%u3}9 zP~*qrOh0CD;Cm1{H>)kb9|RA>2A+qHaK~uuM>_DPI-=KcAO+7E*wngY#5hh>9oI+k zj1J5L7~8FBmuAj0t4wBd52=!W1Qi^VK{c2T`^=lJ#i*LD4m3?I$G9WBQK9062HYbw zk_dN{TbVpbe>zB2WPCpl<(r=JLFOg}-7JyIAY<%gjB1fz_nJlC4#l!xeDNI5pY zp4AYv!Y$X0S_jm#I8}8~(o(4m)Xbx$X9EgFUe6N8UgP!bqD;@OqUnA;3uZQht5VO( z9n*GWS4mM&x9M4GG5)q{GF%mU)~n$BlhC!FPr}%|6|Mqp9h1IXR*&(+)&YQ6B`S-a z$oDZO-v!>R4VvgLiWr#-amqDy7@SgtYrAaG=ZTc4Pqa!k)Q zGd&9iC2hxKRdI0GoDBuGM8{K{iI?_L`{>XoZB``1LRln}wyc+f>9Ehd>AAEGHjT6a zwAZtV7n)4kM&05*XbG2rBH9HvB~G8qD9| zkn0gy{uqa?V#F3!#dE7j(VXvSYCt2y9$GrHK3f5|pqW`Vu>uWq$0wO;Wk}cOjh!KP zq=bxdnvsKMj|PL|HVGPHOduKeNa)!x%*(^XFwYKq+jfOQceH0JE;6-%#_&h|FwVMC z%AB?jCAaQ=H0rT3_fpgX8D)#u=nmGRRvs(h8wR#<)4Ot+S>++Co!5?iOC@OpLu!Fxqkt6B~j?VweS59^*prad<}xr{&4J%E&8P zgPssn81ul(b$7U@tf4)hnrWd7O_2@VJDTM%R_M=x;y6eS)Q4Gj=5J+{l!!DcO2qR5 zPYcX~uw6np(0)ctltC^l8B=iNLzM~(aD?XuV+65;4cA3cV*m}_jG!3!dt*r2<=*HF=j<9ql{bR1xbibaAl`WkP6i-A*2LrKRC&VHH;u4ZKEmAl|H$}IbZ?+q^-Nvy z8ifVF)J$d_%tnqQnJKK;;8FC zS@+LMT`cXnnER6<{Sq6h#{C3pp4MnfdFjbicii%hp@-lLy*MlGPm&$1>lZ1pLL#@% z6^S+C!w84Z1Y#OR&k-TM`oYxh`CaULZ-ePj%3vDMd#2M4sLLAx!rFB7D4i0+S7Srmv zgQ?LLP&JswkQm{Cmb{hu6(EZ9 z!8GvnW12EdzE(eVvI#CiBl->Zx?@;xhkcGQqhDVR=y#AD(C+}PWc2IPsI~66(eL08 z7Q$F)*r>bM#5$&T45lMy3LmVmfL4M%#vdC@=PK)ZKA6siL*<6^azYa0-u#v7BZKMw zKf;>@Y6hxR&(syqIMQRNnQSo4xQY9bAU7`234>|;`JwRH44??B?D^f5+C@5+o%huC zp;k&yv6^CXi1||Xds5P-TQR{#e?aO=;AHu*VxqGO6(HtOEywW@PR87)T+hZkmQ;-G z?7%iV$GIcPccfenj*6+4d@FmMqunayUF|4a?W|qUX5d)z~>?Ta{-!m&lQMWP|GpRNydBk2Fw^cPm&Y zt(Lq+G?V7i6GT=XS77+!4k=6fK_(hR7Fpzn5Dy}YEplS)#)*tu#Wt~8OeV)ll%xx+28E_O?a z;0eK(v)Ljca)d?J$8H&sWs0zy>n73=dOycKo8uqH!$~K&^W7!xVt0{Slf0|tj*|X{ zuwLA>PwR%!crzX7kAE zP2I_iM~;RO`gr8%j7R41$0UqstboOlE?|Y|BRqUk5+4322@gxmAv~N>5+2Sd2@gw@ zgoh#WX|F6J5p{0H@`q&6c|S5@zDNs zxNikFr$KWLl}B0+j8UV8nBIx_E$EB-&1cgR^b$<+I?W;Aipz!ek1M&q_v7k2j3kf# zr;i~sKaN4X3`4TCKASCd99%VYz%Eru}bo62A|md^74n4NvY&6oU}m7ez>b4 zj5SK`GK`spqXqRi#}3K%)je}r3b#VelUSWEu|AMkvRgwF^@gqXyx~slmNzDj^X-)! z*JrOgFvn@q-j;(to)XOY#CYb8qh9=w7*D=X9*qn)W*9fdGuL*R(+ztqVGk3p$)@pJ z4eW7pwO=;vW|Ud{78>>%v>p!N$Wmq_&L_@7oKKvCI9ZiC@*V+kUQTN^$>+J8*^PlU z>=Me2cFFzN4vsZDn9O090&7(4u?8~^VvVurY&W(pe7>C(PVR(#f=(h--)W~xf{Kpc zY2AftvNM@>G}M$KgdS40P+7W7$oB~`ibbbbQK)u*t7~A`bnzx__Sz-ll%!Ws*3)lT zio>CYuj{g*W-dPQ`xX>6V?Zf33yL})%@!0j@9>~0YCK*xpqYH)9DS3`3lVVA>{BA%mbl&@tqfKM=yu(2ojeQYy%RB8Fex~Z7cZpqwb!BA*UfA{ z{rcBfM9=>Ge@@Wk*EMUoEdm#9gW7jYjJ$4H;E5aw6 zK@w9{XN2)f11!+n?UoEZj;XH3BkqUh1G5I)0~vLgm)n79nyy;YByhC5g8|apcHtOR zGnBTsbVqGK)1cSf(oKp;bxU{54|Q%RPqg3Grk>ihj~22r7P6{11VZhYqi_l>Cj-M> zOyVIuU{g11T(zkttKOGlKSiaO6le+oZp;SCvV(%U=SWbinC$ut9omJn1I>eYY4zcS zBlUfVG2=aRC;4J$XH%G)hFg0DN$kNPs@`Cy=yfQ=4^cu_OUot}1OTA6lAU@C+dITNz^ttExv+8B^dHnENKd6gEd>H<_A9Fe6|Z#{b-^`h|7$Ds;f^ z!0vBBtT4*SRNB=WCtU#8pe1o9JK;#2wR9E-JXSlbf$er8o3GoJW|LYtQ`$dYxA&iH zdvmB*?XXyoEQy&$SyRdOkGVNtEi=#UUrQ_6x0Y6PU@a|UHLI~9QDBH(A{*Hp9d867 zRVy365NC=;igFj?h#BXAYiYeSs5!b|P1x+zy5Fy*bs7qR;j^a1S}DR?5TcPj%w60+ zr)#4uMO?sz5?Km32EFY2$efK~ZbOIt6?RF&lc{cmlB1RjfDLMu5Jk2+$W50gA=q{t4hoYXs=a{jCu|1`N9`5dw_C zEJgrZQ;y{X;0%b!K6WQZv2?!{XxBb8HpoQp^VHC*j77rYgs7^wAM#WyC)TP z*Au3+G2~m|D+Fp~O>h$`CRHnn{`MphiE3%<{1o`MrZ@8Zn61n3TW@#mLE(0{rtsny zQxUM}h)=^U{*&ibCiz{&uY)t*{LdW9T~6Qz1(p)f%^>6ae&$OAv;zF&J=~2n+RIR6xbe{sJ5cpkwPvqCCUsF`SCaXTe zOskW>HFZ}1G588ebvhxFx^6b1;U>Fzqz6nAVB!nP&(J|;c)L%ADFC9Dtu=9jW;@OV zUsiR$^%tEG1bTfAV=bc4Ew>4DoL#3A5AW+;`XB0poMrCiS2(dgAZ6*ymvq^X?iXU< z19rac4m5SCEhxJMWyfr2LD?-RyYF^o_uzuETbS7~x-ZP^7G`$e^E10YT~Kxl%5Fi~ z*`9o6M_5?K=8NR-wPoxl7L?tBvRhDg3(D^M!Djd8PhZ*HzyEE<)xp9xBYT{FOX->4 zX6zO8C^rSGW;O2LqI%}`7&Gt|_84uGc=jISeAJ7e-qYP+Jb?US@LzBf_%4#)f*#+U z@|%ITAiwj=?>yA|cF6A^CQ*3ph%OJ@i*rEs90q%)>|zFZ+H2#FEmuXk0)Xu|PJQV> zVC}qadqQ8UxRFFkWxsEN58Pw_{?IPKYwI9W$gW`vXP%HvL_1w*o3i+f*yF;S6_iJ? zod%`q^0BwJJcn9W;Rys-tXc0vC6dw?3J72)^LH61y*@2 zWHwfP&1D(O3Rd+>-qXiwyAP{FC05&;V8{WiveVD?@8bF)e^a^+D#2=?IXnI=&m>+Q zHPfxfe80G<8o7qm?H+l4xQ|(w(0K*^gqpkXTe06dSD@-CkD4ki9_&;Oya)zz zAVNKA1)I5S(g2q$%SB}W6^lB6!bUQlJpARAjHjTysY4ip(i{fCHz8V^;w7fnfU;wC zoVoSvFkG+$iYPnaz?DL6`Y2twTq>`bKF&R#q;iq2JTkdxJEF(juOQktd%0HYHnJ<| zdAWqg(8?I1*B66T`eHM|Ky>$DbkAUPZy6n;vw+C)rW|2y(|dx68xeAtfT%6jS6<%b z;dT{MeDpulUeaCU_YX5>q_@Ka9KQ3NWhmhlCA?WBQ79~YM~9#wzEEuh3ICT^PdF0A zWhZ5*o#ebH9cVDoc8p1g%%o2wNp})L9!16b7;Z-KUaV?09TG0j zC8S#gL>=cwjCb(L)$pMa>}Y@}%p)IBKmpOgJ9zy<38V6$pf}Fo$UIWy{{Cz2^YKj_CK>;PW=%7vS?~4=<#cJsioo!^jAm@W|X<8A@DMm3U@V0;=*7&#FsQ zlO-U*eNBTuX}}0fRw6xI^kgTX5GgKbm@kUqw%~7LR0NNQg73{I_oeeMB`B&~i;pwG zw&8)Zjp))*a$s%Tc`ObuIWLb^FI>9Q`AGG`l{=kB;%n@%FyW3LeB}ciw<e5x7d#+306#pRnC?o5>0$9kUvfP#-)5n8J8RpEu~F&WJk4Em>>4oz z0s_zw6ql~eMRAfw{HsK8nXmm;%%2a(c%c`40?#rjDLb;VeNNbU(l;)zZLgBzI_ZK~ zv9PV_mr$s0Ifg2Px^ny_-&7SMDXx>OP%qy_fg!Quwh=c%H~3libPbETS6#(2+dZzS zvK9s#yG7EvZs9xCWS;GgWv-H}I|GM|n$Nav-?4Pwp5?VG(EhfD*f$XE8>scvon!T2 zc?GMys%CQhPROAK2gla7lN6xA+XYO5+!3V!yw>6tK==k?kezjl8^6qs#{ zhN!|jc)-_u?Pezbg=-HITaAQyzN~%S+FJ;&);TUJu6phy_7UBLxHZ7&I%XV0OLrp< zNm_?P>?%#>3Smx%mbpqY9O9fRpH)dgbz=)C(hYp3t>(_gZjiLD8~EEbnX5Lv8p)gBIoc_kqcWWSgL*6<27B`L+ z1RE(C8R2~o33Z)>+T?TZM)G;|9QlZwo+F>rAfNj;lFwsbPUMpY?vrlhJ|wNDz$9+b#+=theARCGMSdN5UTmkD1l1oa^KuS>8)F3HAL4rvM>aJIUCN20$(?$(Cm9T$O z^$%8G0;4H5&CD`ArJh+G%`D3iX76^C0VaERo0-d}(j%VK!Ej*b><6<6O=OBFqP0+) zQNlGu2Aswd3o#NPTpQ@`I16c`-V~Vis7Hl4hx(cw7)8yngEP{j|H-1>l#lhOKRxvW ztC8`;$ws+P(mJ`%CCN=@&CF&!ZJDbiW1az8R&g`yEnhwBCz|z^Bh2&d#Lzy;tUrw< z)RU*ga0FMg{)?>~==|kLXMIo{Y}OO%wNV_}v;HAWqub1$@{qbWPHzvd_j6k;ueXKQ zd*fn`*ITqk<~Qe8?~2N=QU^k|<6a5Y8%vgnmw4GL`L^s6=jGe5Dq(CIe=7Bxfe&(E z788^D8R_d&F&2d}yEm8wHUt~}i$2VVK|s?24lTV{V#=D_Ke$(u5loL-r7>COl1 zzU@EFGFhw4zSAr-XqCz9GO@q{s3Snl{{eL*Q0ot%e)$!VaCdMOOrNtT22JpsMR9f^ zX1a3C#?M(4XRX5LEQ*_&^UqlnAN_JN37s=Y|DzhD?>}czw8chkV5`kC=PZinEQ(K5 z0XeN*-E$Vjb=#`zZ42itiufe_vo|Z9vnaX`%9E!EowF#OvnbAZ>X@=qudAQHcH@_k zMe*;KYm4F^58_4hI?IUZwWzzG<4dDl-iY!sS6yX1_D)6Jz3K4w=%m<{!u6vL|`yZQanC@n@;MMV2kdZ*wXa;(dG?iQ1) zB6HZeH0l*|S4HvzBfVeDUlp-~tmi?oa8;zpkvtEJ?5c?HetI4i+pda6{yZ+WUlmyp ztxF?fkX;o`JbkX{UKP#x^L){}D#E==Wfuw@Xcg8PM?^eS+p#2xG{&`3+p);9MP!lH zB#m(i#XoJ=%DR6F0ZN59GZv8`!RTd_ZSfgL|XF{@F747xsIgS2&f1WRrtD+11 z*&uPD9QLslW2n@X%$oy%-Pv`c=V+7RQP-yd!U_Vp*K81&`m;fx@MnX-MgD9M*yqm% z0q%knWDEjN@n?g;Q~lW>u-~5z0#Ea2gTT}M*&y&0{%jDq#GefUm-@3o;4A&vAn;WV z0S+CUDFlo%fdJt%YX}_hnhgS9?au~*f91~xfv@prgTQ6}Y!LWbe>MnQ?#~8+EBx6Y zaHT&R1fJo~27#;m*&y(B{%jCEH~>xS?KPVolTA-w{^+n?-P`9hX(4Lk(E3y$o1 zE#!56?Hpt#KipInbZu-H*&SM5g$*ebs)g83PEsE`9qZ~V2x||K$Jtxsxei=o%c_YG zI3)^UL~r(cr|jN|!Jn3J%#Ott^eBe{yoco{&aDfK#ELwY za=t@v6^Pgs)vdcYtz_>W$@w0}`{yaAKluGTfFxpNEEb!T+;E-IGz}1t5QapIMZ1GW zfdV;+v{=M8GWEu~vBV(1oe`+uB15(h*F;w&ON_`nXi0QWi15Qj!U~P@eIKETg@w*R z((IkkoVv%?hBv`MG|mS?gIx})oZy1ys=P2(UV2|R1R`TODaUqniJ*zz69BWobvXV5 zjb!)l9sficCxijbc`eiL1$b0aez=D#{TD740717p!7 zl5#u5aB1|B@a;2+&JcMX`=m!at4UIJb($Ich26=Ak#tJ^EUAQqRsA2avQ;}8eEFHA ze2jw|b~P9IlWVg_MG^Y+Si)B?hSR|AB#J0zs^ATo ztQ)5Hdi@X|vtwa4ps@h44uE+o0CGM-u|4T0AtTGgV44C`5;(yYXL!8;S#G8FJjY;-bWOo_gZ zvvBB)+00WJO%xDQ0kkK~ZLi-sM5;q&p;EP!_n*!6Q>Zq#<7Lc_^Yz>zQ`eusA?)l0 zNBF3&s#kp;SzDY^3$Mq`31O=6r}ngXd6L^a zSQ0cY7st~qUCKL}p9;iFTo~O-Nn%8AdcXmAb2?+?ZJabD@MJFd`OkI!44iLBv%M^8(q# z)X`Y=1PD|@Jr@~wQvt<WU5$W9R7^3bn9NkJBYTDlE<2$tl^YtE_iz<0Ay1)Wr$x(4C8YG{8R$` z9mIq;$ZaCPKTrwq6Ws7EEW9tC{tFV|pD+OqK|)w~KtR?@FFV*5Hw2K~mS*_m3H zvI=4b!7VbKZG&3(C(kpQwb_E62l2!8wspl_^NyyQqR*2m#m26XqH^hg&~L4y=@42} zUV`pr0&RbCi!>u|oE4%^`K2e+q9$YPYK{b>`W!0vIS0SppX{{>&1@EvPpzlfx93SH zNRdOD_+sscOeaW`g=8E}#0Z)Jl4eRBvWrL5Irs|N7V2GL`kwI(HN&#dnsGo#wL@#8 zi3(KX*QROA{c`a=dGa*)4&tQh0#_u9;t9U(iY4d}n?|Bsfx@L52Gk(uGqa>>NclG z#vJ$a-$PW4-`eLX^}IY*ql-m?B&uMOI9NzO0m_Tp((qRR~o^xktc9-NQMUv zCpR?!U9SdNy=WbV1Os$K6{`|JQC`)9Sh7&*;8W5$y1}c{Tdtt?2s%I^U0Q%x3B9wP zSP9(_Hr`z8y^o90POkO-q;!2Meg{5e`h7TVwBFZ*Zx6>VV3bGm$FjTDtL&1NuJzuB zl-AdGk{Yz$*I3z0BX0-oBPt(`%Xa{=TB*G@`-G7(pWYGkRa)2an-|d$da6lPiRaR}TRTqd9g)dO95UnwJzp7jrp!++lH`h0elqTh z=VyL;fqo{_3-vRa=A3BFR|_5IrtVZNTLT4ZoVW#AtfrK1v*1Pv9NORlOL=t7%bA|p z6{*fKg6Dk5m#Lo!<^*t_9XT>B@=QnDQ+~L!{vwnkP6p2rz&^fVx({BXlf~TBF8-}c zE|@Up}L}#Y+-780^OJ~8Eu3{4$-FERNW`ZQm^hVp(xpYc`#SEY;QRqCM)G(f^-mrIZ zaKySuC+6scRendo#k2KzDWb7jUsYtF+le%)RuKy)03$;P8UMV<^xsekGh6NANO4FD zlFggdZ7@YYU-U6?vV4WJr#t;E9KD{}+xQcsq>IFY7Vm{Ecjfx338z(+=2OwTJb4M= z<^~oKLbufNlT-J-QZDByi_q(rS&R)YPwp1$>z1Em!Ap<Z(Bo(x_reD+7t<($m6 zT2NgMP@JEo&|kZe`Xxmgptj$^o|fD+!on{=f9xGE2^_-!Q3ezVB9%75746*2Q&!O; zSop={=+6cZ88PaqkxQoNoGMf>)Qfjn$@SE_dI(Z+3e`Vw zST);G{|H|kr@0I@C@qe?7SWJ$KuE>**v;{S{~g0Q9t3)Hj_4?67`cB9esWx^!M&3`-5=^?*Kr`2ERc`T*T#->&{h^^B(} zrBP0W{iw!%x*q#To_6RMVc67|lVCq(06%3j9=>WUBo)$pDp+ zXR7w+*efTA>g&%m5k8-NKh?`A6k2sL`ytjbS^-r(r_T%H^2D22okq$izQ=bNN^O*U zAOGkeO}S?XTRYgxvqF>c}{1wcPqW7%G{yp~f-;r0(QS`qM zo{1}p-vauu0Ddus>%H87z_acpj7h!3s0j1Q{?u(X(>S|Bvjb(#tqB-GSU;4b>=y^v zBY8vNE!c)&;dp5j%_Z3#P$+L*ssd(bKj1*EMz@>I9QqqbRw(i*BOIM-#woYYxE4n1 z;!YacOtecxJL9kA&=$j`T8zwu^kEyv+kmTJ;far8Bom9xBZ+x*!tu6FH2(KH(&0<{ z#*(2LX@1E;9y&69$K_YEGPn`8#7@mTuLo9cJW4uYnGTD0>7(8`yr%cGdY6E;P)=Gl zah`RBGpaEf=q1=j>75e+_(=itTH^ptylmHPL2g9SRnr92m6Dv%j*j zMHGTM&Jp1nEi)PbaanZ8l4a}h`Y8B#?aH;A*&h`i3UKx>x#9TsT@sr zElTsX*J*Iekxof-M3t3d1*{e&8NDoE%Nqbrg^hUS8VCQ;jn9u?si;Sxhz*8f`X$?Q zP+cwF&}i-1WlRIrX?xaI70A?wO`8I)!Ay6=$Ei;4N0*Rr_5|r zLQgS z-)teaoPgwteo_MJH3ZaKM?k0KApu70|3hDFz;5gbi_`|?BS$zP1H?oAsUdu5C#bP> zST|3N@Ux3MwF$!8Yy-KEC|DH2hYiBJAe<{lH-gy^t{`%baK(;0DZ+;!JOt+$u0!}5 zwrZggJH^H})_z5iw3boeW9*nb;SxufKRu;#RkSCIvPmpiiQ8>jeIZu2g(bQcOYoa* zD@ZXj@GceecVdPlJ)dsJJ%WXkj7&+DW&X}0Q_|jIUR%NQC-UsXJz5c4gaoX3k`ynY z_C0(kcIG?p85cWU%DRNjcPgmd-62ND1LG+=!2V?abccQxF+_K0O3xE(eg2wbB^JTe zA`5{9w;v^5V0>3jK(`mK+>7xDdLv(C*ekt6K}F)vaQlW_J)a_%5u* zpm-rPzi^artabCIgkS)5U@V*f9xY%z!B!Vf-KxRt5;P#ji+S2!5BTe$WjR@Gllg30 z?u+g5zZ)bIw?RHiZ0G?tNNv#%bmuG@#Y%QO*5Xc9jtJX*S6e46p;;Uz2TS5<5>DEb zxKfKb?&XxdV=Q|IW_gx~!QL?}6&n@R(c+>GtGK9yt-<^*lcfwB1Y3|{V_3%^Ef(1u zleR~!TY{Z7Z&*88Z;FfBe6zTy&8x*lZC))dYV&GwQT-KJr&y=+iiNsv>JLQa{KDo1V8xEASgB@5WeGlEGlngR zf$Uv&g*W??Hx%je6w9tQEC%HwyB5prEAVxREe?JbnI`;Xnlxsa0woAf@K%N`JDxlC zjGjT9(*-iH8v%0Xgj{Uf+?Y&SstBYJv9*BUD2kqQD6~<@ zIH?>7YEF7y$-coJy0^}9+|$I>7|*Nr4KAqn4eT2fj{SnZ73bCa1|4!&mSa6vmSdjX z3f!yB#@aWK3$0m>FHnyzFebUjoB_P%ri^7Z%kdsrj`vtrv`^L$wzjKc-$FqVHOmoC zpH8xGfa_PjGq6|G4aQ*m24*=1V0b)K+iUOwKswHg{324z<8pO7e(Z+j=^lq|zW2^D z&i69Yi_Y@&Jn0W*#O7+=SuXYlDSm;X6JM0?J~4f2zT2rjd=*)Q!3i=i82^KioQ(h5IFN(OKFCFi_N{lt2^eRYe!AURi&(vIo## z`t!xs?xi}j|IeS|!n**pG-Rt0U`W z)jD5V`y^=R(VD5@@!D>$a&5O)wYEFO64F2kymlPjUA4|@Pp$IXKZkBM=M>|sHcg!} zi15b6oTIzJbPLHX{GK6dcgr-m3~t$Tgi_XaYw^FFuI=ux$L+vzI}ErT1>BC$;r5>_ zZe^YmZneG_Zbt#PD5kUXcH+353%H#RxLr6IZrK~%l1=xGP2-flRj!InpB-Cl4@B*q zoDE|j-ST_YAB(o%n3Q>K&D*|A%9caAq?wd0LwF+ypouT_qKaTocG$GdTb|D1RB`x>z4DU-c#%sx61d|rVi@cdl#B8m0$Q`loxVd zaP*Lx*~8-=IiTgsJT3bYK4?AWEg^Lh?cvl43Z+psPDerMn`*M%RFfTHXs9L9sq0w6 zizn4mxLc{xQhKhX@MBsEzow<|yG~2lAuVP5X=o{u^!0i1w`8+DNc@*Wgy~ z#jruct^+J2C>y(Hl?^C+M%fU3x0MYMc~CaG1Z_MUWn;0P?czYDZt!F32EV3m@Vidk zI3v8-tr^Yaw;MBRp*_^(w;c84w+!{ZH6~&wl%66EVU5S!p#|?WlKe2 z9bTj=fCp0*_%&65-*u|OIlMFz=PdBDm5^VD7m0cBU}BzM6Z8D86Y~vTY{7f-)!5mu zXz44usv?SJJqUwDcos$pn6CMK(K!;^q+ z&6l3Bv7T>{ZWPd}P6Aq$t?iz(n$~vDTQ!w{P9&f)#h8Fj^NyPid>4XcdIv#`RZ2@~ zJVbIA&do}HMuzV`v6-}XQ;!SmBna%p1vW;YJ;*;vYzzWC1&PhQQIh8F--!7J!xDD5 zd>1w%KcS}sGNfZC3h8^BbZkTiWS#r`Q##vbtaH07>)b`_taDFqY;8|(+1l_xe>}#b zb_Uit3@N)PL>Cmyb-FiL=bjR*bLR)^+!9{kjdgBUZJj%hG3|2O*KVwHyJSS8D!0z< znz7F9Zd>Qhv#gDEjzAC_t#cPQ6<@51FRm)Sc*Z)nyJekIKC9KNa~A~bT-C#tb#9ki z=R&7ut#g?Bw9m0?gLQ6?taHl@`DE6)J(YFt!joC&_Oz^Xds^1HJuU0pp2pIK%H;oR ztaBI2I(MO&+?G#aom-Z54o`NRE`te9%5`Oh5x0;^7Cu!bBPHvf+Qq9^*126F1r63^RnS@Cw{PvNg_ zb#vR?1*fvj$!dB^+uSvef8X)rk6nn{$RhgM&U5BD7S5=Cwo)i2Aw3&Prwc`jQ#rtUo6=)>Zv6Q(L3+o2{+Z`Jb>c z&gQD@XQtI_uL51)=c=q|`OI8>@{Dm8%o^kNqotfDPp14StNET_j9bDOxBs5vX=aRj zTH6?R{#|B-lWxCH#<&aJ7-uFpGsdwio$o!RG4A9V38m33PDdl@n=Z25bP+eknI1A@ zj0;{==oIU>3}uW9Y6+`RZ5i^jnK5owEos)Nr`R?8=WdT%n$<33OK58s5=U+ALUjH` zvd8UgFW|Sd#~IH$BaEG$b*$B~e{@S+gP#^^T39(lglwr9ti#9_mbh~m5&!?*x=S-7xDgzE zWLr!wu6FyoIS`sD>0t9WM@|r7qD<~8I`h4LKkDFmV+V(Ax6VozI+GP*jM}MDUh$(P zjx3&S3PFJ<4-U`v%Aaf{yIpoLg;XG$Jk+pflDp1oZ=TN%qABOibNC&2#T>%22BSRE z*|liGkv|=X#tF46zfz5e@LX@}>`{!l_Lr^&=kU)TOZV8xz49L-MRjat!&H=H?@#tn z+eC34;_K#QI_ar(jGsC2W37EXTU;F*0&az~113RTS~p?w zS5IsPSkx0u!J7OwV+W^6fdN;X;cs=(-n@%cz1*;JLs4I5&u<8F)&nEB0lHL z75LC~2%efI1=%M!IRj0e6yf!3U_4cWG;a;6-$s)azK0e-k?tkgTRIHJC=~u}@4%sh zxPf8jghI7IDm{f2hJIGb(plA^5Y4zG`-_f~xrHWGC02z}y#lc}2w%segt+v@602 z!v`AyFD?}V6%jU#0q5HKdv_X-ETpH7KM@&7kz`VZHzl&eUb#GztQZzuoudXwgcE{- zc~-?J2^P8A!=%7VC0apc!;~;m_3?AfY2&$N^ z+m)}1iC?`g1N1-!aM5}89e%jm`mkDblzZqsv9-v+*P!tT6;T$%E`6Px0;@nzm|q_9(2*v#+DCg+;1^Cno`9(Bdqof*ws7ljJ`{t~XaoG*#>@QN+N=5snmf zeRDD@^^L$RD8d0b8AsDW!r=6fkbnfCKbb*-;_(W?LIMobkwDLCBn&o30wnU~jfAcv z0eTY>c-s;QApl&B1Y%?oniC$4lpJ%aKh!s_0c zea9Hgnv8)TF%J}+G!3{A^-Y}1UB5~QflIvT>|ZOw<_EQ(!oac_ZSRgVMEW(Ju1c7jZGXll{3J|1B&wIkIi3EygTXb(OeCB67|Bcn}66 z0z0->^*VG{lS`$u?~loE@mm$43pOUfxg9Dpc!-f_SCMtR)FjbAX$4VswLXmbz<{Fc z;CTG&aZIqIgS5{eG6JO%f|_wj`sx1xqAua&p>PViHBSVR5f&>VsN=*=UiZD@Qm@fGE2`Ie_u>wbPv{)?1M8Y+S5XEklqRA)tDlUiDqp~{3R+ZA;I&A0f1(L z@`+nnPpx_gA4VxU6t7$0q^pXmw{~?wo^bih9)RQEe`5+5=@Qx&iU*k?V?tvcWeOrW zs8=Ktb1H9DLB4rIiO~;nIE^luR-#Fmrw(C}pPUpS#HMBnN+-}W46gVT=;D*Z_{n9V z&?!N?!VMW^@o)y5U{;YVV+1SASxsi-I|OWb7nuyuiLD`Wo}~H&HU;@@jHieRz4S z1Jm3SQapB;8AV(Yj+8xa#h#I zn005?JcnbS=Ts+IUc`0=2?NozP8FJS9(vnO!>3I!s?U9 z!X<08#9mdOWe}s*Sh)^_C)IR0a+|(dcu3QxN`LmE=~PqAO8}nu`a4uZRn8x%pB(!T z9ke+f->TR~))fmaUv~vgS9Qf^IdiRQv}6=iD`vQ)_-5Gg^2&D1& zwx;n;_KFnACSp@VG#wg{3SKp!1Jq3eV6|?bTUyhhfo_@7KzBUe0VuN{GwHTA36k=AIhGig$6mBz`fv8)>4@nVYsvj$ z^dzayiUSOikL-*N-jK{y%_%MZ5Z5cE)ty%JdwFDslEc2shZz!*9 z{96L}5u=eFT7BwiLwJP6lw6i4hIR9CB&kDhvj@b(huP0LD<`02l>Kc?M^G@CS>k(x zvcHo3n$jerT)%mt1uFDY*U>)62ihV20usamh-Dv^u@KNw#J{|X${3uz;Nh6Ps-Jy+ z;ffUcEcYwwK=ib9Ni4wvchMKKV&}ipg^mjWC$()pnT;=o@5z zh`}lvFN3Tyo>FV}ha!|H`zvPBDyqh~s_-5C@m1tA}0obi7FCvj34mL4~OrQTB?i(UD2>R@%HqA<@ERMbREq z1j@Z$(7XRJv#@?OO;O7S8i3kMTzIu=03J{BEJ)2fO(g`#|~mh_KJB zcapox`#;&24uZXzQQAnmK-S|*dgMj=vXl&fSfKOS+3h#nq~j&kRR z6w4X_IoGjSS8N^6WjsM^KrsTN@FNOqoTAL*@g0JekF^GAfPjsfRhY5Xw$}*4H@R5!iAOWhXWN}=tQ^~1@2n?XF`2DHO8|bzCUgg-$!fWyU&SF zQ^$!$+;p|nWXpahEsvS9XN`mpWt{!CY<$^=`5XIeIsNAT z57x7F0)39(_}A0N`0*oAAZCWvq!jFpxkR;h>0cD1r^eN z4*1VAO`j3;%Xj?IB>NFACe!mn{`^&l8Q!S-3w=q(@}c**@w3r3he{6SXkOy>JVo;f zr;*0x8{gh9Kl97|@}p__{crDQDD>s$e{(`%u}ZXA-BuP|lw5B?^kIEiI0+nl`~#Eh zKM>a|%Kj4Uqx?&0P0Hh)>?n&Ftp-_?bp2KwURc)j>_r>%aR2Wu`l!+AL96FJ)e{=M zp34%^gP#@IzsHVcojrA1RdpL`GBcn$VaqUJ2X|(K2ryq~_;@lca=H4gTQ#aUuWaUI zKQgFOfXCXeI6OX7!@~-V%g81S!vyK?uuBMaVb2KYh~$&&#uxHfA{u2{)&+r`W95jI z(nSah0x6Bhe-$Um-PQWMw~sDX|6P<8-8nMuPp-5zwVs}7%bjsHtYLA#38gEj5 zQ2R7~6+^o;Xuv!xtd6ha&+>J5@Rz)-tI$0xDEkNb1)MHg69WskB9*X|i|7dRwOp_Z z&_w+JX_S2)E&8a`u}cCsQa*`6ooC<#B& zU+aY}{nnUf_8$gQ*+_ya@m+9BYM{nN{n={<6~<|;$yQ>mEiyBYY0O%A$NC}ukXAER zwdS zE$e|}3D+jwlSl6=(rYez)dS_@3yL}PIKlGn&TS!1F9O{}(Z7X?(U_}*$G-mcOoumh z8M_RF<-rv;J!n}=IcVYweJ)G|EOvC9dGLeBkNtpo_;9r2v8!MH9x57-pIHMn7^$>& zgB!A#!@`ijIeeFga(N(AQAh;O^&`7^2YAlxABu)nH*xWXs2iVOELHLp?N-r zEwGPtWnl-{7z^q+{Y=<6gmU6lwm8kzh~h+cgQ3!EKCiMZ<}r~7;Fl-cVsgu2M7iwk z7;6rhjVMR@+(&7 z(n0G_Y{;kQB1Bm_KI&-5Gp0I z2DzIMRC2uVvC>&45W|U$5@1Fex-0?Z`$QV7DKx9%A1Fq*2tujfR7s@7Z=S;>#fK^3 z^G6TlUB#!WOYz}l7^9JMuF-%;+Rp=&T+LpjdY((zBn z@QPG;zh7o+NL9fwO5I<>jXS&?6LF)9UYgcG>B6re-Vx zP7V^&Q;`E*j^_)jd2A+`@?UF;9-A(Rum}ycGKCMIdmSm}RMP*;=QJ4xQf&-{T(E=W z8i12Lo(@!UP+lw}1aC|hSaa;}+Tvj=o2_|*DT@5DYF!#7Q}8s6S<7E6xlCySaPl5e zA6HqyiQliz%-LP%M=put>}L`_t5;Oew+X}*vM@R7D)(vn49Er56U#AH{77tg^on6^ zvu3eM(*s~J1P-yLNTxlYae1LOJ;D(9De2RlB>&LwcEoZSirp9kchvwOa4scM`M4^d zv!k64rr@b5s1eajRz6)5*?X(*F$ne9V7sp4ocTq4cqCpeN17Ejn9iND{~zyZX)@*Z zrDj<9j=3IV*}?zk4Q9U6B+I)SVXTB>5t#en^Z63?iC&Y>uTpGS9w)-6Pd5}pt}}Yu zK=EJ?aixL5*`PNPxIlgRm4dOMRfBRMqOmmt;#=yN06Yn7d}ctFHZveOA*sKH7|q)q z?6#p=GHZ~F(acz25@R+WofZbv&}U!bZC0vm8w*;PkY%J;m&tVr-tFfxE&I^!CYJ7hE(Tsy~wT`rmk}VUiA9N6ApbMnvApGEp^cG{|*Q#aR=1fCuIb?5zmepBf^4o--k-E)1xONU_ ziy>3>rAJ}2M2Hr)jxIx>(R5P&^(*?&^>z`n{f9i+@MI~_V7w}7kIVo0XdVObg`;K4 zVIjilEt804Y<}9=8UD@hTy=A&f-9mNO0P6mDFBZiu<_8ge!=2@BkHDA=`<8qGm`zX!o0s#dmlN>B z3H!VL>FeTXvb%c0G%(p!y{Lwr)r%EcL|h;z`9D{0A^pq29YF1Kbc$^BGv7|n^P|~` z9SS;&i-fMR*N0p9g&<$7VXVMLlIcVO#>-^C&}5g9eY*k%i#Y?y5zz!j!mqLxyRJF* zEt>V$MES0l6}vz^GuKe&T=KX)W-RG%02gHX|GlEGCdH-D0_$IuRb%)!1^n`+Y zd2$Q0jZX4Bo(5WA7LGNghq_w|e;jV9%ic67hAF`|^ZYtenp)V{tk?)_sXp$9USsuS;znIN=Cu*HG&A zRn`S!qk`a~dJ%P^BjV2(@6jV!StFweXvrQcatrd=bj9R`C0L|Z<&<$&EKz9N+Q)&bu!UN(Mjxs)uHCp3wBy)GNn9;kld)~1c;=}ppw z)A9e4CMglqsd;}1y^w?dvAix~yV$p9LCbl*0>miP%{a*tpc#g5UXTnQ=_tR!QPI7Y zHs|mxBnJ&%8gVJAv<5y-a2D~dS_Nt2+gR0>0?gp^Dfn1+md7BR8kMp4B2Kry4!$d0QWa?puRHb)F|(yl&mLoOLUbwwt!1L5EgG z8(Nvz7@bC}mATN0L!s(V-Ablb)|XibW#*fnNsdPh4V2>^cDMlsB9Em81dW>XRBRBe zM_wq`PaF{RXR@k|u^0n}$O2N!*5dI*^+cEjbiwE+WN}arY&sYu02n*d3B~f5t+DTd z&|_>4dniv08oqvSAG7=BD|UAqr3N}l4b-L*Obyi$_KIR}!RQp*|4}({#^R0?gO6S( z2U)KHUd$}gVuNN#3dBtzdDpNXdpm1IEDkCUO;qJI@vH|bkHF_;;vPh=kK?XwmJ)W` zE2Lji)bxS}k^4Ty+(L?};r1d~1<(l&A@a$D`cf0OfSKHj)Bw-NDGX0dYXSn(#yZx= zym!O0qVj~MQveR{V(VB;9Ag~sa5hY7!WW)b;L^4_=;yWL-yUE+(I?u$beX-oi&WEw zzwc(6XSvQTEMXk64Z?8E068FDSRh7wZXMv&*Lb!pGFwSu{w{L(y+JM`T$tI;h43>U z5JF!DWKx|ftKXaYw86}$0bM}$(G)$$PUD@j5Aa~yCT>0qO=-@Dh;y~1@^}NH(m3VN zovK|JoaOLA0|X6I0s*Upeh_kEZeo4a4(|+9RL*Qj4u-RXir9Dq5_tP&Fj36RvjK=2 zIXOJI&6T;W(Ta&{bbtL6R4GE0Q;t0{;%{=pA;Ix6A z${MlGvv*OEhOBr_B?b!f*+dlD=mZ0R;-E-P=ux%o#uX?4*b-AzrHoJcG!StMmizp* zp>3=-0)@!{YVH~+07)}Msahb+GghEbRaUaeXP_WmrdmH6(SU*>=|i6uKzs{EeSw0p zyVk2*OR$uRzXCb+PHh+{D9BjFEqD+N0E&YGg%+0Bk*9vmPCD67r)W~m#Bm0~S(PQU zJ(?mAyT)#4H(KG-23lciE0ZY`>Zt(;8*DRhnSe&dOgyi?P@O8PCwT*Ka_SRH0kI^q zHc&$6(+6mFbAmx~TT9Be1kbK1M!w1pCNUGW;Der-KgLW(VkQt1?bgi1*s4|O2O+;` zP!ZWQAkhq>mGv+&vaxYLF@UI%lfz@n83Z#HFr2Dv1{o;$Bk0-;GThr_uo=Xs4KoPY zDFW#T?Et)I1cE(jhCr;BH8Bems;W+K@-R@4KA?3!_1n+}M%FE65VR0x5V@9+)fGJ; zL{4i4jj$cMg8Z|49KD)YUaODn*TQOPw> zRkF!<-5j|Lc3P$h*9}lns|8eK?79z;*b>c&LwoTha;e{{m@icu9M28|#-`ok(Be)^ zLk<{f>5pG7RtLHACMY<2)_v%)qh5V|mwin+oUKKBt9ZejhM(zp1N-kl6Jh}?Z{{R8rF=7X=`auy8M2DwBn)21`TH(9Fo$=9a-(sxeKa8%Q{%|v=&57 zqc?`eknN(Q1_*e<3kVqD)_s^0!O@y#v2=U^Va~e<)mrU0OY3rOC7B1kq3c3oHf_Uk zblH+b9Qxuy+vqQl9^|710{VM(LY=GFP&WL8x(>s#pp-BDMD#d8d z<{^thqrn(CU_6lV0@tVl)O;II3u+7}ZUM?jq7t}#U~xAqN~OKe*K`Ba<^!N+sLKEq zGTI;nC{@>nx&ewr0ct%h43%3S*lgO2NQMDWo3oW3(XrpF0Lft>+sKubT4BF&sG=+HAlZoU4tQV^mzXqX-aw2Rpz(*flE5HgW zB5{ZrJ$4O@o6IE^SSx_Bnk6TlOD$d!RyAicmx#KvIkzFmfo~d#Nc9A5%>}Nltc7M`ifSdA2%`RU z1U=gov$HV>Yny#A+QCU_B4n&-VkCyWo+e0?ez{(ag&Bn|Cpl&@%h9KQ%+$aE(EnCHcsm-$&5{bP-2)gjvoB`DV_2X zXeq3ZyC%8@nN3$9ooyFJgkB1)&(7^d<^5!evY%mJ()GP4dsL0mbB<@3qgG<` zBa_}@+iu!q%S;SEV4FXTsf_sl!)%);HnceR^Q{s#U|oB%CtH;`T`VepJrsFw zDDu8g8|4j6QQyLljq7g5qy^_l*W~Tz9?2j~H zPBHxfomPeq1FMhN0L~8lP_n>(ACMLJ?-hg%{Qpi*2L4y+N#K9E9t`})6*s_Pe;n9H zHSB-?4`v8X)R>QMsj0)MjUH=nB@hfdFoA$Okz}UG1qx-1tW9)ymywH5G*jr|WptD& zeSkOX=OsK?H}~_PUdk$Eoy_Y#a_T3hi>mtx!cqHGPR4X;GcpcvTy!vIRqrNM?{FTn z-ih3;cPN(*L5H3iC}*IjWpq6$`PiO;g5DDyiiq8Z!uISILt%ROj1=H~M(W9Dq@HX> z>cM9uI$JdzHNQj>Hm_y|rD2M7d?^NSAAK{LRv(?F_2e|IC!=XSI88SLI6gCg*S$B; zwD?KKk45`@WYE8v=Iu+ku_3TL1u@{DZy`bvWZ8caQ)k&PQBjeM>{c|01w^ZG` zsp{UL(7k6>-9w8HSUXU7`2jttlkd}m(cmLZCrwCc5~-qZMu^Efie)-y5jX}YF*)Mb31i}*AYu&o?yXVy5C=mdaPerecP=S7wgdIUr; zH-ygdh%o=Kb&@T6Eu6LCj?XgsG1giW44ERh0HH?`IUuEeU_FDK+abBvN#Y0&ivX*P z$M3_4uXAn3O`kgsXc<&0&sN5LoY8l(_aetgJjhvq%xFe3jF0GA-R$oq+sjoq;-J@2WZG(uiOqytU4?M=DGrrfUPafu~P za!?-mswI@CD@0;fD7`* z43Q!XGJvW|P5sd-5y%`eA~1(cl@GUzsx-i?Qv047N*i1QWU3s)rknxS`!a5-m^6@K zAPr;|Jc}S>=@n!w{j&}ka8$K}OJ&tRL)WL{@uvsr=vepeM2=R_bSDS!%&X)el$C0e zGPy=Ghku{DT1NqrXDwa&tmpp2^e?X_L;T`m@b+T<4OqbEU!VPUT+BZsWrqW$T{H>6 z=kmGxi@EIAl4lSwfmiZ8BQ>p?!)U5K_S%yx5{$p)l-cA5iKeL(NNrB#U9?dII6J!* zVi6B!lz%Q3gBdXOgR@VkoE(AI`P|dlE)9g~k6R-CfC?3dD{n_PNnt-R#$a*R;0;GH za1C`C5lz)WgJ2_lk5)$jHZc}@1T;I7SI zj6*6cg76Uvc=trgE4l;R7w*Gx3RGw8`V2C3Nmh)|B^&a_F2TXpcL{JPN+x`mpnqdn z2K&u+EXl&MnPsG1Ck%?$!j4?2*-)RHb;O2kbA!!LH$-^9HYpAd1m{h0oN=r;Nwg1p ztp`%=i?$l2dLKm9D1+5nB7~M>r|&L6G%kN2oTo~j71_T>ug>Sfevo@s2^SGj<~o>e4R7J zNXZn7+R+!3Z$$Nf0bBxO+@g0@1B%z8fLE^l=r_&hX}77+ssG!9M7j6 z{wA0?;A%04SL|r-w3j`$i1(C^1%(vZ?5js$Hq8EeqHXKF>^<_cG))0!%>TQ3U35=c z(#gicbPBuYMSu3L-~>o2UeCN~XG1iKNbX?$mO{ZyW93#A1lcOcpH@Mw?Bt37VCsS} zsXj%uPa4`}0;?#0>Z0yvV@2_ysoSJkYLkmI9zuB!|89?6gh3Tgd#z_+Ynn1R9BU~J z{Zw(o|wDg_%~vFJNA~_!{2$}&zu}9iCUEqY^Y4EBtU-0crRts}ludUCw8S2R@W2Qp@LU+so;0Qr@OvrR613#W-%0eIHiya=+dV zgqL4>07ki>zKpkq1j5E|+DJFS?#6EKsNAo0M(B!)x_`!L|GvVLdJX{^xj)%0GA` zBo~#x@&F7zdvzj}l8^4^9-qjg6Zc%BxM|7igRi{1yimVC_`sM8MHvu4MZ7?asJ^DE zjpOz~%we%Y9LDu=-Ej0=h4HrWDxV1-tl8x%cW*?sT{p8yS;N zz_OqHc^4F?Ipw9!`muK=bVuedlxUKf*x-TQ3B8^2oj<2(Qdwy@D0vf^*gk=Bz(LNV z>^V3bn}#lAP)cVi?E`i%g(dUGm%MSs?3J!audO=7ja5g38IMS;y1FIasNU|qBoop~ z?*0Zu1*gHGnRX2A*>4lVOY_;LI zRk)v2s-qfhF|k1q8L#KKAKL{-rYZy%n50@RS;LJ!1V|~LI z(>D_h3)mv%HsbK|2#6yudz3ZebS9VGK29N_Ie zMh5sCZ7+;VoSGMeCTf&9tK5to-G(*FZG2qJd56^4sSM}UFy%}Gr+3)YLk7eeGP9^2 z^8DsQ21Xh(Zf-L}Rsgs8bwifPiV1Irt6PJ`FAS8}V8Mo{Gz?aoF79@7Gk9u^+Cqpz zr>)*~L*C}~tvQl9deldVcPSdkV0Qvf(MLh@z4y=0DXHK2w&- zt-AkGS>}H_E0+23e#%DE%j`({Ii~p~W}2YxUk=ms!G0MtO^hhwTS%OzBgY72+~SC4z5n)nYo>sR%8*4POcQ0rk}T!BD6T> zHVcVnZjYoCF?$IlV+RN~PV5cIC!g34B{~}k_b{ui_H0n(bnt>7sdDI*7A4%dlx({! zN@zXhL(#vH_)03;MTM0~xa-?AI> z_NF5BM5W;uQ z(jSynnSnUv9m~3*1vHkg%aa#MmsTt-)LMCj#N{jBrzM@XV{J(d=cSg8A6K9so7VC? zujRSa!k*%)?Hb8VGKO?zj zSdEyVLPrj?#@6mgU5Axk^wPKvc}KLitN^QZFO)OHw4ommZ6+7tOE~xSAE~48n4Msg zau$C%^}gv*VT?7r>XrGFU{`}+=^2iHewg--B`-_v7IiQy=8QVz?aWXQ5H+asR$63M z%!wHOoZp;4G>_{2|9l-*kB{kT?S7u{(3va$kWB1!&Xw<061%@q`NsQuyniI@Jxh|a zINP-L_fb%_KcWh(_IK*(A+_@kJ^eAYKdc9<{h_Azhh}TPtk@>I0rS~={t4BsE71hRo6&233rA}$UX2CobN`;Oy zONNYvWuNeBaTLP?>;ByPdMe#dWuKU{|he@(S_R<+(45(=d`5h6+zw zksWS0t=fpVg&6jqQfjU3k0Rh>)2Z`PmMUOjvHP=hANY_&h@O3}w1AfD^Ub^^; z*MH)FzwherYyr0X9f9%?gL@~;=~)#7!EYc|7^DCQADEYW#bUnWzGBDMNBp~OhUgzt zJy%lxgVb|bRnLLC9{5|k9=d60cmvYSzzbk8#W`G81y~JsIu8TN=kF|E)jfJGXc-bl zhi#r5*2Y(OFP;zC=h!qxr574GJ?McC^ZD_)TVTUcuyeP-YGY*PO5Ss~z;Yz#+%2$n z0dajYM;=sSJZN|N@gqy;Zh>VjgX$Y@xJG@i=90q)X^29v+pCeRNIN?-NE&=!HgW?g z+lW$mZL2}?u2hBABB4$ac&(}pwUN!X1FXS1YpZ!mdAsLsfz=M8d6dPR7JG~BT1{D} zPFXpg;uhGCvdKtMjs>xEqo-U|DAg;l+yT(~Dw1xphGzoM{dmR7ehot zSK1-LAb&m`|Hd#GStK|uD0HGsjENfo-SPwMcxMf-E2LO~VDw=gu#Ji7$Kqoj6Lx~5 zAa)XT{Ji^YOOxd}dG;OV>}$S(!?tfAr;d)A17h1Nuvd8nvemyfM8_p$rFjR+qZrE# z&X#lL@W&BYE@-XZg8Lp$ZPop$QiQz>eNas*C3@oSO8G`}AFRACZ0C23`9WlXS)fz) zabdKzj&1k{VaGS~FO-iU{jM7Ei*rSThH2rYdJFie++xfv`Dta_y2XggD9xEGl3R z-ck*va!}Qs10YT=X28p?B^JCJl=cj0azZ2yQ$VTQFB_C9R0vL4R9%5U&fEgOkyV3I zn7L4j8B$-E$g}tm^9NwTiOUZ|xw%nf?uD2x7$CdU&*aeD>26|lOl6Re1Kn}?xl zVR)2NTDSIbmsPZOb5EPhK8f)P|Bk{;WxV?wWulwm(YwzblI~6i?5s6_8<%!2kV9ng%#wivA^rxUjQ;WiS}s*@ra)5;!^)#p`}su_{q~N;XJ0SsSGd0~7zi zyVa>3&k{i;Ab>ZG%6Lo7z(nm{MhuLaq;utg&^04 zO((D}akJD}SHzx)T!fDwx6E4XF;?xFtY=-mXCl@`23QwXc&KA)25;d-4yk-I;C4(5 z0CMxO2U(UHi*NPv`L#vkTk{r9w|of@H&AHu1)gP4u6b5?%bhKSx4^T)Tg9`&YsIs| zYsIs|YsIs8l`kPvOJTnPH>&gjX9bRNq@!}R<`NUyk=YlTE1rcPxn{RvvbrAJ9LAhy zJ)BAvhRUURp|eTTN>2QNCE{@|KX z0)TaSBF0ORVo}`KE4w}eN)lu=1LbVT)X}kpMEGO~bjNif+smVQJcKI?hG!eu$ZxNfN09=*PG9jpF7wEww_-3btg;>wvFuzj^bWE|6&O~%}+f?*YGBtP+J%tieg+mujTd*?C6Ogz+@5!q&H%+Un?OTYE z7Ss*63z}E1ckSTF&6sA`(ZETWGbb#*hqfEr(=G=-#28J~l^zO4c7kf;3@ZgLlt+P+ z7C{$imzg42&2$lL1R!%?L|pqpf8W&tIogn7>sl6-Uipe2N8gz6@ab3cK;Rd5`tFs# z@uQ}QMCFMeRj9CFxYv%A=!bmrJj|o`%H1DP!h&Ik|c?7u0X~ z1s6rI#9{%WE^>j1r;NW5t%HuqqrH!ciYM#0kfKK>u13bt`C(>jSmrtFqij`*7BO4t zx2iTEVl}JIZz9B-E<5)s5mc(VsZfhh=55`};00YbG4=}4Eh&0at3nh~)x_XuE3~oT_0dpsNQ)*TP0aEaQfvEd+XYputco>^Duse|Z z0&*9~vMd&m^~mWFHRKQh$W^6?ymgftzfyR!3QB?rdY6FQze#llAhU3Dm>6i93TI&g zX?PQoy-plnAwb4gp3M|};lZ~;4`&GvI|e|$w*}-*_U6>)c7@PDc4BS@(3%TXY=Au7*fW zc5R5DvIVkhL!?c1&^-|OtrkSY?>@0P+3DJY7R}k~SrD9;uc^&ze`2I&Wg9y4nx7bv zS=old?DdSu>kA&V-h@Xd`-RQP%c^Z?%U;idu)KUtRbKlOBPlD(nkBF?d$sXDQDXYD zlMvITv&5uVEo#?sFD-jchkMC!&sLkxy6knNRmlwBy76@QmX&Q0lhy21ImeRGt#{Mu za4f5;MNF!y=T)_MRp`}bylR%1PMn08RBelx^s3Xd>$sFaDGdZwT)gC@Tq=yeVo~-w zRHtY7Q|R>8{3(pTCZ>A)GsIMneFSfKc= z|E}-U4ShDNuWUxBuS5E3)4*e6pl3t69c_RKLZ;$q{Bk-Ld^BLYVhH745e|$Sh)=baY*Nw-0|xhfwfc*)q^^#wgY2I<`uuXiRL7==EI_dr^Ft{jdQ1OfVarfR z7Kzw!frKDWU#EhY;k##bqW>LcsQnuNC2IL|mhWIi4LCU^NohgDU^Va#Jlk@O4og|S z*#XW#oH}eRNpmzYA&|SC3Mw+duOu~%U)=2lK>6tSX6aWd#pVI5ExO(_U>J_W2JOkAHhb|->_nGTGn#OFzZCv zS5H~Yh?2XSb+l-jJE$@1LjVR>M+%R8OtOcEn8-97pv=mRcMWgK{GU?EwR3$r7j)+U zJw%I>VV+tTTQB@cFAA#kol2|GiJ%kWJ(XjEu2b;{ud?hk{c zv8a|>MYYfmK$C6|ar!)k+#G-v(ikHR#`ugi9@J+Sc|hmfPmHw1nEKA7c|2H8%r1WR{J1` zilSlI!Y>R1PK6VM`cMr6qFX-=(ws-L59I>)-b%9dKijVFEB8i z_6RJFOJ5U53s*Kl^ASP&nQ(S`3_N{kqr`(PZIF1l6=>JA=xi$SWU@fwX~kGeJi~=u zo>wF{13@I-A>b4w9{gM!2u8>c5|7g{nj&mP)iUi9CezvMEfxp>6%A@O$GQg%iPMgWcqRoyZjc_cy11sk&TF#TwmdB{)bow*B1EdUnCJN{a& zp~IED(?`gsLS*Qi16}u=8eaPbje+JI=X8XKekJdMa5dltP~c!EEYg!Cdm9+Hh6|T> zZ>!`Tf<&Q4Ox|@|-gO&!=Y>DTkI}-6yi@AbJo%IyCUcN?OwtYVP7W2#@N7KI@QhBK zY&EY^C{d^wJ%V!OjxR3o5c?fQq8(lY9_}dwvoKQ2`^>%#0x!^E-WLg)z>^_$oxtn5 zzzd6MgJ7V`e++@A(X<4fUdIxq8w8#X-kg>9wmvW|hD*5E!R>vIL%*M4xnl z<%pfrFg6H04Pz65XI-w!2OO*Xtia=LqL#pW`M9;j8$m;;L>grKzZ{C)a*5{xuQD62 zlX+G06BBzM-%{-T>C8f}B^*ucz4W39x1jaD zNg)Y1vNhkSB%r*kH~8flD9W+kbuUZ$5n6f zLk&W(N=YRLN2bo|2d-4h!66jpa?qDHEjb9QwH;4c2Yg3?g^NHrD+=jUwfGAXtln=J zx-=ZNrJ<`I48)j^lmp~5>pxQysH8T9|1J%Vn#j&aBm_X-?~mdzV%Gx<6mtmAC-DC`N(XRd<4VQ zdayI2$Auxy4AMnpg_$5FQO-2Xuqy0%=r9wK(ufd})C+)G6>Tmjt7@4pEm1iPq7oEn zVc&5-bKmj?X|}iyMB9kUU;R?84XZvk(y~f9V}V%}Y-DDY@}(7o4ImUvmN!xw<3_VY?SNG zH@2;%PFkB=OaH{gWXlc;vuxImADa=Ptz4|06I>I5wUk!ZuN}GnL(HT0Q_!7x?yO?& zAP7Px(y2IYygb5Le^;UMB zz+(gM=DrbrFfen6ekjX$wEm_4-&6@v3q_2MUYk!vkUGeQ5Upqc%tHfaL8a)o*m@GH zv;;Lx&FYga^Eqe0l!HYI)i7<)ukabT99%K-)!#@+&QZ8Du?ggs6-gHGQ1fds3%n)Ldy8#YGOw+w?dx9~;gTPh(cqbjGpY?0YJiBa`4q35$kRiz?CsbHf~ zmDwyI3Wh5o%3`)f#Q`@B?LebO#TB-SIp$t^5L^!fJ!vc~8Z`M>ph|XXC0J;YEEF|F z%N(`EW|-VTC278ksE0C=2#LPl1V3gScLQr6+Azff(KbT#T`3_jlY2Cpa>m3e$$*I! zOJp#yvZH1uR?{AfB3qQc6=YQVt6+KeiIr}lmmc$ij0IUuMwP|)P*JFGfT1Ke$_}0^vqkplb9R2ex<>-T_BS-6Ax8$fTMl}}ibR|gX^cf4% zR`o*z&qUkS%%?_>-YWNiCtH&K`HUoe@MMy-LKZ!2Rx5_pTTd=YpI^o=Vhp|{-AbC) zwa?uOB~;Q>#b*U-ElyhnL_Ovs2^BxTLd5AwROtmlriKdVjTkGDN_A%;QoTwOsZy7W z$69!xhJZptbAf!j*0 zpNUlcn@y#vQcosTncJr)RjV-p<{(w8ao_4>3l2n5dNC1ecHAwbYhB@-ChjKUwUq%X zuf%JhaXp(kI$)*Y`UYz-t2p7cJ^UQDz9X_to*12 zxRc%2-5)tcp~VRoHE_luIap#{TvePnmcu%QpaTxt{2uE96*Fg{df54>fzC(4N&H0T zpgPg1JA?BT?mKbc3HS_>ZLo69_i<<|Tiad~c19Y5sGUk{-gI87dDD5R=FQGaHLrGF zs(H2ZQq8NKm-5%1&Ums}T@F@@iRMi{*Ez`CQ=hPzR(+yJ`@|2Gm(XVfN3*<)ol{fd zmyzc$*}dJziyhb)YwaX+qzx9|M6;_(snLcm(V9n5WQz)b*+3W{93af`LL4tD2y#c#Z-Wn+Dtp#Ph zwxF!n7L@h+grKY=D;uG#gNEy%JgJ}@&ZUX&L71!=x=PewZ2%TgXTL-gh2$6n4YS=x z6fbj+%!_R$7iQR!S_f?N&ZW_Dj#KK6oByA^caQSxy6Qad*#G3h`X+KY%LFlmxC%MDB?J*3j}`R;S><5$0`l5EM4*d@Du_jS%b z=j^l3K6~%8&pxDE1^;Y1atDlXas*n9?JIonzRZpSCdu`A#8ywn2K~5_kwV$DBU3`Z zy*)mOv=#V&O%#KLJeZy4E*^kA&HT29t^brv7eTWO+LE-&D8v`MQ|} zR&tG7nn^kLgesR6g%E<9bz0>5%HFZQvVil)D5E5WbuFodx!Xk2fmBcTqN)}uJyo5w z7!gz8S{}#6vO@a{pZUNrN&v}VPgLSG@;JS>iBnS`+@5rB>LfvS-l{*?UnR7%+=NX= z@zFr+z0}_j8|pnZmMa6xUxrvJOmnpM+Gb5mU+_vW9BPvrE`x@?=%iK3SR2AnjWvaS zFs!Ys&T@3;y1J0iVeQ4$B3tz6!jGe+V;(lbQp;nBSpPNUZG@%e=!SLGawuZE=}STp zEUiRQYXn8AkteLpQFPb3y1Y~rEkQ0*8o(_!p*3l#kA4Hi^^N5HDD8P%J=nyRjne*l z!arUTeuUMKQR;B@U^z~41wkAVIY9&ZW1K=xxXj~UYIZq&sfOgNrzNYvEQs^<@xbf4jqYAoBhju6MOTx$A_m)P!BA9<{EM<6sYE432EbpANJk zp<{4~N8LkXsH>>IWN^2Z6@@+2sC$SGuSTMH$2!#ckr>%XY@m)Q$%dg-fVeL!zFr=6 zdR?JT!x}C&R-=2?)re7Ej>mOe%ntFP-e$=W>g+{Tos2$4#xOcFj>V3E)qFaI1XlC8 z+t|N4cdO&)9g&0>Bnh&;u$bYAjFUY$b^?DlE(h5<&gDQx$k3v5obZ#>=}poz!a0G0i+Pzp%r*1StGL>&iFItG`IuPU&gJ_Qv z*;9A6k3<@oB=aGF=zy+dbSFWwYurhYh>f-MXsam*pC&zaBt2rgc9LVKl+P91!%2=f zfC$}^96Pn-xYx%p>X_tMKS^?|pCmcfPbN9mk0v?Rk0v?Rk0v>~#|g>j6CeQj+{F?? zfu~lg6I=Nk^7)W=NRDhnW~}FZxy-~s8hvl@`Eg#b|t2dFj3rfCXtbrCn4(zB*8O9^T0!X5#X)HUjt zfO-RtRK(69bT$FC43K0&17v3Xs%i5zpmqspILH(f0!fNkW(H2ZV@+lmK$C`o75YwD zfYpH;dYVIp*vcQDKWj@=fOOowUDvh9pH)p#UioJAN5Qy)vn(bk- zYVl5DI7(J>oAIz#%Bj0MSF^>mp9S$zs*1p=ss_w|>5f$$8L0)MsdS!@AycLk!*`gQ zW>%>>acZ2ZY^gX@DxcB>vVa|8z~I~s-=s*NEhZZZ-XqDF zkZ}tB;L=3dkB$}=E65{g(y{JIDgNx+R?H{Ix(8z2)37{K`UfTJP5|=-co4Rg32-uj zJPq$2RD3djz42~5b&Yq|PvYJ6lX!RiWW2k6G~Qi58t<+jjd#1pDe>;9G!gGk3^UWl zyHzJRM}v2-QcrldVs(R=X-kV|me>0GF1>j7s<^x2BThQoO4(YyAr*V`HPg$401rpE zZ*X!%9Q<92PZIX1S8$+Wk2x;+Q)U6F>S=f85#ldd?6qp$B%0`wq5hs*s?HkW&|IbHTMthl6%CoW5jCoVTIo_bE}%@*|H zdIT*l_h>9FM|U%5xZIU3!4w1CE+B$(Ig;(u zAp>&RyP9QO_N`_)mn&AYD=jZ5b=e{vco0YeRkjvVP&&KHB-Uc^rrAoipS#_wX}*%Z zhP$QJ^vad&Dv_DPQ-sXLfXZH*?g!aB2%oc@zJ@yv^vkYJui|czyVp^_KACWNNMFm? zj?=5T+qKGVJ6+~>UbkWTI&SxHdrc55@+Vo*_r0s6#+o%#rx-+{3X~^%DO@nKiur4d z+NiW({F2-JFqSWm8>-VIL$z0&mZU{|Bbekr8pPqdyQkU@V)Bq`r4AyKBD~R{x{8^c5)zA474Kp&_GZqtijI z^H@>_Cj&%-vu8=WbYFLEve%y&3@4|i1OE^B7=!FntKI3AuXR8-TC3jDHbY-od)2~-L+7WvgclZI|h6As;hL$?lN7rLeBQol^EYjj(bK?*T+6S9Tl zyn!2xquVTAQHkzo1lqK#_A1x8&v%hga z-?-;|b{k#m2a@mEv4P}(>sa?HTiv;rV=URAmo|W~a3A|stw9_1v5PlJH#ky3KakBH<9Ih9b~uGiLG0M32G0*Ux5@2ZMsRcIAdw)Q zc_??OTpBv;KI7XMjeM%C}i;5A*S8IFd##~e<61B`r-KE;7rd&))W_i3QFQE zX)xg&dGHP_bZoWwxDJP5HPg;Xp|yviNA>*q^N3~d*WG7z_dea};F(8s^Y1^$tJ9QQ z{K|O|E^|j2QA@Ejp_F6yvj?R#h5pdu%5e zfq~>69k^mBxSb08)E|>YMwt)j<~TQ>qiQ#lRRed$f3?;h#r*Eh6R|*|RERWZI9TP& zyYhHaNSDT0bm8x&epo=e3i0rrYh9rS$@YgT>i{>uq?=`K{)9sJb2WUV6+VzrszRj@ zqoL%nSyIX#1@OEBtOExP@Q|D51sHG6;`0Dj=NaIj1YAP}(Za17^W!w;e^gt9KWt9w zP)g)%DZ48u%DiSNQS(3hUv$Q}_WbMkDU%H>2^^jz)`gY;sh(%Zg<_I-ph*C}=NuX# z8&33!j)FaIaRxmW+Jc`MGg}Jj%37c{p}LTigljlyp`7BPBbg#xn>7vJdZdjAlJ)C% zCb?>t53UAsb$}K2R@OR%oBlm0gbAVt?`k}1l50FJRF7upu<)#=q&VYC*XB1C^b9gO zNtxMFV@}2gO`N^!W<%;Q+(4rEy>M+Wi%rmy5GWppz)g1`IDAXgdRSjHkMY@Q1d|_O z3oYKA>{dYiq3a-s8PPhOrs-Go_?wYp&PH$p#kz|JE&5kHBS@aWlr0ln3n|*(P%a4hu%%~bxIC`d$Y;iV&Y9&g(c>MSov|G-g`$Yk5c$)Mz zn?dUd5KA62s4|-FOZNyggIkkxrv_~c)twS_rvz=2vvv(vpvmv{h>%;LZ9Ui>5@$}S zM@He|n=}d(3ccRd_lN;yuyK02=5sEtAcLIu7X8_Ce7s&;Nkv!41Z@^#sf~6b^<;1- zKD@qwU}`3jfgkv1U$wK(wDNdP|J-Prw2OC{M(#4i9^v>zvya5CE>Js z;_{U*Dq#KTFO{F{L(Y7K269ahvo{a5@CvZ%ZK#7$cF!CSy(aJ7+ z4VR;3RwcOXcRpaa**jJY2SIefTj+k-t%M=*94g6$*jCDtVimz9ipcM1_i0xl;c-%U znCYEgy@k2RWs2Y9i*F2>^ELo2@dL?+sGf@;3LF5YV_@u8Zw-w73XD`Xn=D3ZC@|1) z$}9^8K?z{m2F8B%*1*`Wz-VLE#$cqQwa5?xMse-~17p9umBoNBWuw?^1B+%>{s(c? zKGl-n;W?x~jA}++T6r(23yn|9<3+r>B9f8%oXxYKs&`v%V;%6K338z&}%;nf;_3I2&fG~hHhP1U7O+K+Msni;0T7T zlwo<;&byV=Tu} zi`qZsw9RxXdA8*~#E(+1_$f|RRI>QAp3d-8AoC(V;7*+UL#+s$v$f<8wCIL`y5Tfu zNmShcj+@;uQ=>eewvO19>Y8B0R($WOll<2O|5ayg2I-6;)PLID>@5muAu&5p$lMHM z%mXT#egd%TQY&z-(O-FNuNG;db!E7RA!cPYJpbn)wg`? zTetf5&8|?q88;~uA=Wp1ywLfvZ*`&j$G+8tUh4|&Y+7h%EOXt`onznXLa!S8Ru_86 z6$+2tq@}&F%ypp)W8dmRm&d-Ox;P_N^}TI#(#+t~P1u za4d6O=+fA?y3hk--|9lIcZE)AJ!(VhovJcx7>`o#zOiq0p>G)bRu}qhd>fo?1#t6& zED|%PRuYwoa4sU!3WEtIC^m~|r?qV{+`JU%+}sG;Zpw3OOX5>D$yQ?6+LA;Iy{m=1 zwWU~GOM)3C)bq0VwLY}%%qtdwxEESf1@njZ3E+MvfiXKKu&7c7lTqNMiD5XGY>Q!A zh+)4R6Rg0*urn`03}b#D6T^0o2wemTP~SF$G9w4g>wM@T?2mN6MSw-RBTU*5nSx7? zg>gLe={zTbxj>|v$IaUk5o`qtn}+^I<+aUZJI%gOmt?QqoJFFeOr#;0RF(RVr!~ti zaF&U_N<|p?`l!vpP^RRwQf@QxsubKz@{;7X2iZX|q*IK*kWeVmPvTy{d@EzQh`S-a zNh(w=HKR+$BMW;fMnpFxIcDikOhlbi;X@2|?c9+8QlhCg3xIi6Qvw-Q0vW!dqs-Ad zRJ?fXCuMWOf?7QKrH}=@R`Kb-b13@!pUXb=GB5_9&+?-Q}s#fp&S6EhmgpC=KY?LCk=a^+BT-o8+?=lzF|^5IbQoIQ~f zvm0ECCXj(MZ)l1n1GWS&pcw_pZ;Rt#HkV9SR<{Ti$FypcsEC{CZFey!q%NhU{w5+2J4g#cnRQ!=p= zkVUOWYgrs*eI&ULB~eMN6Ks#a9x$b0V{{*|pg!&IbBnu&VUJeG;^(6RkV9Sfj8En7 zlc#oNu6PVega6}(!2X>tz8kaH;HTAmb=89yy+2ujFSwPp?bBS6D@?#v<@G2asw64? z#XmD(ryqGk@!@<6$ef?`nO)WhRjIU!>Rx8hFnOwt?n!y@f5oIVG+?TJ#M?*})AD`( zUI@l;2w~!hjW=TPgTJG$^D8#3Ovw<)#VrbXtR;-Y)q~azKPbOMD z8B(~)EuN=|WTZOD$G1xNoJ&U{m06@#3^x}p;j^PTue60H+uNWfNqr)eJ@>TyodOhol zKdxg_Y&em1L&G~Z_Tus1m6cvr`#~O`|s-vgyp45k@ z!{U!$&nX^18&Ou<`A<7z_5az6hRzM|Jm%`IR)e8NvCe$Tx#AI7n}yEkXn|r~?sP<0 zsT~l^uY?)S{7NR=F2}xe#hWNy@uuNgSiEJemAjKXZLpW}7%S3jC7Uj1mUc2FjM2F zO5z@`SsO)4phaSNRN;CyQRsSvjUCnivbdWY(w;M7Q7dF-(k%J3tTnhKX_Ph4YqgN&ASpIFFa=MxNKbgc(PH;P958q2a4-7Fca_e+&J9H9qA|>Q zYU9QjsvHWjVs3&V^O5|-EzwgFFM<}5)qj{Y-at=jX@yM>?l?%zPBGSB7ZJgZ zv^DXF-O8CxTXT${I^32e8g0ICZwY+kR^)r;c9tf`zMt9p;M%^>Il4;%>6D&lIMb~A zOb4+uUzK4Ppcxq%xt-C;u}6S(E?Ap23DfS#-(wBdykD9FS&(;YNSjDfuTIb_(f@oa%gbSP|i7=O2Cs;6*0`Wq3I{vW{R2-fHzL6Jgv;vnQ8yHVl;cSO@ zPgWJ4-p(R56;QxBZty&EX|cmssck*N6x4jE9P%-b7}ki_KDrf)0a`m2UZ@T7PZi>v z+CUR8qBclPt~T6I8)AZu)yOJAGzcV7i`dRY=k_R)v(E_jOaS&Ab9MnWWyRQnRyllT zlf3dMW><+AJWp?)3@I$MmO0}VzHp!*A2^iBP>$5-kfNvvv==c$lPr;`xfCIzBBr`S zs=-URPmM$Ysqse8>M{h@WR15b*6>8rUOh(71-s7>#&{H6r3&$}z5}i75?#!(hAt^w zNGnEg+C8J@QGd5(!9&ov_XML+r&|lcVY2{Il3I>93m#Oo>Ix5b5E;lZlNEE+I-E`$ zPA4t`r_+K=5d{*4$7fw1s;l|es+9K^CFMePzPf@AvJvfvX&-Vbm=JWM?&*5cRXA5f zMafHzF1W0u+n0-@6Q)M1R`-S4sNLFiUkoCnO&jGxAd&0%Y9#6w-9@6Vw`6!S=}WSq znt}(HE_53rijkv8kuZt!!I%UY%xfeq(G-}=c!fnI3Wq6f=uWbU`5;#SioLc*+UrTn z$UJBal((Z|dJJnDrH}JAT@(2zh8YN#!W^OtQ9C}Y9>dYiIFR%+IDxps;5~AO!Dx^; zCk-JD5id?YjI-d^l4yvQn8sh*#U^Ty&6MZZ0?4!Z$H*Th=S`c z2L=S>WkkRyw7yUOqCM$ICN9MPV*=J41E)9_=%j3&e-7hd62-NUk%(oTij2-{a9A5Q^|L80N-;sY#^F_~3|nLAHG9c9g7Iu^{r=aH-t-=BQ7p?P_@!@d(b{e@OEaVq2>I+2YtcToeL zh#S4SnwwWwP;Q>U&vYM#*XSUjXrX9)U0r^3|dIE|W1B}*HDA4srRum;JyJpB2PHBv8OW>aqu>5BKmF6+mi%6r4}R#|gCKZ| z;?NDAsBLiuexwo`l!wsjL4zP-3ozek+L=)I;q(hl^jG;~3uM}VC#y9?A%&#WI{nFS zLoHM)?SrH_8dmakp?NW@v+rbE9HDxZM^it>)Uv&dwpH_i)wwG&yRukLV^OiyWDbv_ z!vF|{pkMmdi=S%W8CDjBKCmu5sGaWCjr5FqlYWwXc!MsO><>ls4tH(CXPblD4@I~0 zhS{O)2joeTsq3|Rgu^P`(|PBry}f?$`8LN;hwp|)g2N1TqXmZYF_fOX3vr1cbiK!Y zy5B#dT-)nqe-#~QDmfHA=gb`vB3Pk1C|<>g@beC!@3LaxG~C~5#bEbTF>zVU9V&*lKIWUh`?}ymb}J8dBu#Bkj2#-z z=snf=amEZ^?KSv)!oPkzjE>reoLb(Z2}X25Cg+H);q98Dmnt>W0AuKmz(nz7&u_qV5o5q zoq+VnVIwTDvEPtx6BNwNETk{8jI>e4(uQR$P{!ctZLhm(#kaBCi;gL;J2TJihwn7K z(AX62R?jzD=EdV=otqpJUO`Y1ByoJw^mBYs>p?_?6%~31IsEsaB^WAyq=nIW?>LPi z<;EvY^N7nGZk$`9uNZ%e+~UzKMj(HBqulyY+0n+i;oWIW+E6tympUlka^pzHOP?Fe zIA^*qN2N2}i&@3pcBW&ZbnCI}o#{SPI@8(uu2z1vcECI+PpO}m`Y{j$6m&3*11 zyk*;c?i+#!j)QSr znZRxWn0p zeg(Ar&~YDT#y)i22j+VfMCD*(G;y?n7O-ifg4ovL+qSMC#HV#1d_j9$L9}zDf>Xm0F-FUZ)u_K0s-P-`rkFK9US!51_?_Q4mlqz_Ti-ngLlST+{Z7Heb-x*au(G&an@^AY?GLs5|D#W(9StY~?WU1x=5A@CEG} z```<@f)9fqc*T3KU5q%hq1W20N1XYY$|+5rP1UT5vlnbFM~z*T-y&A0qPaKV8`mif z7q88o(&P)asZZMJ(kD$0Wu;G={L@k|*qHpXrAylFKBfH50_L~cC9M*IBps1Vd%&6^ zkc&q5FI!>n)Rj>dMn_%$*uHDz*LyA2;89-7B2-{mlldO~Q9>~rXjU-G;_-tb$piaA z^=SKoZsY`Tn>b^HX6tfq=|E*pS*@~ge`&M{JTteAz{}gnc}&8|N5e^W0d5T%+n<>a zsSWC&=q-|M1gJ&$wSCcY-nx}XBCg3dp6`TlL?^U*E-=$GXKI>}b)JdSvb@03i#?Sn z!XzTQ7aB4VTZwBVmqwN$ZDoEYnf_e z)mWgB-zDoM8Rda!A7nF;eo0-apuM7c>IjQ56RB4yl<)ho$EX*~Yr>ws)*D@3dr37rUpr1m+OGI8QwUK!Z(Ok;Mh8;43sZaYPnQNi){O?0X$LEU znRqb#sn*z7%)~Q^Y3FhODNWJWcxLq5RW=ozk}=1iI;-`AX?tU+Lrf^@CWEPmGb0e&4x-tL9K6Wa zGTIoPw}Tlt-QV4;UsOVqIZI8}_BS=TvoWv;0MLj5(>*4`y0M)S7!+r~v?Wi#x|;*L zfuyWK2!DbXG~snic-MP)6CU2g=I|io3fQ$xU=t;+T`;~EM(czY+hw+DVy|b<&2X*T_T$$`E(Rc zo{ElYuQ2CSG49beEu>8QX8a+@krS&<-*6hzH~DlHd~>nZs<%%wkp^!F zTN$(Q8^Vaa5L~qJnae~rkBEdbViv?l`IV=r^Iznl6CVXz7M{@1G0(2WS)4p(Qtg&O zE(V({a3!AsJ~MVEJ0}x24mpyRVoB6SfW7iS%Gj zJeWI)3=67Tb})i1?D3A}CP^)3)+poCXbH;BZ0IU^9hgLJLp=Ma2`!77z$)5E3=tNO zSjZ%m^9>yU!9p}xQK>5m+iYEwm_0Jq#T7LYUS)%#EH;A`)pJG3!N%lJ&3zUV*M*=U zmX1~y6v;)x6FWkeBAu$c< z*A0=2AkV%b{mr|_c@vr^Lv&O}1+uDJA_Sa@9vDc5Vi&e%U?VgxLOUf8D%6229mRB% zBLcSl(it3YPjv&#pc&I~im@!G1NefE={Q-glV|pgaW0CJi+B}ekiZ31kU`xm{!##6 zx2O^Ebu{?9sKEhJXse#&T@3?ESNYJ5*C>pZFBmzz;bc&a~dN~*|di^ zg^Rir?tOq;w9H7;#I_-1K=M{q-O+%!_t+SM^8EYe0HUY;TN^!Y#8J+9a{~UkmWyU{ zTHaCn1E3>fYeG^l%jJW61&gDlTCQbglY|-rqR;*SLTdT#!WZjNyCIyo@-LL?}< zLJqnzL~;R=y|R8aSV{h_qNv*&)r63?jW8(`FcIV@de>0!{v4 zM4L&fSiKfm&2+|I^1WL2y;mp{c=CV(g%i`copHgYeCEv7;Nvar$9p%hSzBkbow0aE zL9Qsgj*FmbIiUpr`*Cg%X8VGcu9}?ELuTP=**y(&iX`rcdrA;%csl5w=9%1iy4F2O zvFGWCds=b^7JSGs7f2YO0x7qKY9>Jqwu3?>yM{}aB%clr%%Qlg_GAVdN~|zee6hhsv9lv9gUXLf9Xfd=l;TvmTz{W<)7*qgctwdFEm;-Cem8VKkmKB*ADrI= znF7UAO`LP3(r>uwHA?j_e5vNd=g8NEOBF%V14weYCdhg1E2Fb1RTADcZD+UX3}FVbKtZi;$7o(Ktai0pjLX*wRhLAm6Es zL5_H`tD==%(8jd<+HgH<6{r4ZZC6U(DK??ejT3}yVe{-bc_$wLp7zn+7IYLLKqX?Y zp2&Cme1viWik#mSh94sr$$1fonhlnPG=~;-MuE7@^y&#Bji)Q}4yhuvz>AVbNWuw#`tLd&2*yy26 zqf}X=?J%m6Qgzr=tkX20R7jEg8Aqw}C!k*$8lcpDMyYcgOvE@4BV@)6*vJUo+EZfm z+I5GLSM)mP>9xwDph%-xh`9z!foiWXs;yGaa!Ar>%2C>lm4_2NHlp3Hbi;w>#q&tv zglu-)+}3l%fmm7)bI!3(IL6mQlQC_O+0Dir}(qqun*eaUQUX}QB?sLUN2`;r%o)y4X6yJX`!UG4TA*< zD-VNvRDAH0fW+1w75|TbKcTx{r#vj@zPvMad3YIB^Lx-J6owJKu5u$Xt6(A9wZUH$I`j#VF-srW5{eg`+d0pxqQ z8m{iHP=yv%!nMD_azj~{qg7qBrm0?wP!bs;wR+0gkRlzG2MPLpD4M`raUcFI z;2r_qr+|BH3HKmyf9SV_ORrvu=HwP$w+C{@-yY#tyAfIxsmaz!I{A>*(7K4HRD|TE z-=zpiCWgkKEW+w-@WGH=+K2B%XdA*wWDTh*O5Xk81%p)zh%X8zJB*9p&<$*>_zVeP zhz@vC;RU;-@KVCpxlQ0f#vSt16@WJMDrM!H0+cqsigVpfJ~~OoxcYB zUA6&&TD6YSUC6{uP<+N53dEL98oB^f5<7MSpSdpBMSBbpTxlt#h@czbp`i-=kgYZz zyo<*yWolieHvmru4+nz}wwNDp?E;q^(L(Fz3UhyXEf*u(WUml#ZD7hW9*j%(_X8XaF9C5JWL zaVy&)%i`zk!B^%vJ<#Oex2r~5SPrm)!EitF44Cr+P)zhrE~~m&*DC*8eVRMm$9vr6K3(1z-tI2cY8=Y9FXVkpjpK#z))n#871LuD*KITwZ@Q z4u=xOUSO3-$Ch=k3FdRoVJr}PuL&ki)5km=y@~i72&C5pL$oDWdk-a$ODi*FSmPR| zr$Atg@*b+OSSxy`jrr-+0VKs_4i9}36M_IHa7JZ9z*HuhsZ7jQVidSTsP8#eOMRc} z^2U&JvD6hT+?l#78;RX9dN^Q9?-I?s+|i8df+cr{yX9UJNa!Xcct*l?!8^D^2D+OI z_NTk_gn}8c%6<>`_@cg(3%<0PCE+f2a+$V_w{tfs^6jOZBzJ?JFs@IN@mB8f_5DsR z_{QGBh1p1QNy{=G;SMF$_M}{^dxb)`#(gVKIJsWW1x9>;3kKn3zA0pi4iMu!8 zdW2U=9;Y3$ZQ`QOqtgu4*|?5Df{rYqA$@zWPany$FxTNLMIv!*~s zn?5aOtgZIzm@)Izzahem(a46(*d#H@VWOjw86yW?1IRIEEc^I4Gq!Aw8IR~74Q6Z- zG|adhWdD9Tx*8FWL3WhL4_YVHe`XcInWiJ_mkesi0Cp-h-wT5MY#2`s8qjW4w}d`) z@zngO)Wb5K+7K|rQgcUAD-H@vO63xI{szRt04C74SZei?f+5vU3V>8USuC~s(PF99 zj}}X?y<)b0D8`_=#|Iwxmapg!KqbMCu$_|#LWDSSZbXrmKw2GlwM{jN%>O0 zOPj7*%JSeq-)u#KDTX_DmuHuwtJsD1)?JsK4H6#AN5J|MaK zE^i?|9N~ieu%GV;4PEnavix8fH1;@LLE2kaa!=}NpwIyxi1bUDB9!PL_W;C=D-97` ztP~5`X<(347!4Dw7HGkJ4|ft22p&R+2ocAiq?Az-aV}b@%pLhM$kW13z%??#+1SGF zwM8a)N=fB(q4yAFas1#d&eC63qym!h!j-2&N&u7is8F^UsSv2NBr6*4y(%^$6@LP* zk&4hHQi(4}Dm{@(Y+c=M5QlrCJ=D;e^|X64!<&*o+#8+5g)V6j2<3YtE%8Sk%K=^X zKL4NHp%vKK=nCg7TDP;&Ip4!#ZJ0>}UpkC$@{2+JB3z;cekFy}n+X}xa9hUrruuFN ziVK1ipn_mHMd-ecK(WvvN@dYuW1Xu81o`t24bm4SNqMlMVr7>)!15Z$Hp@SSdJQ>& zfE6P}DmJx1^M{3H-;c* z>*iOiWT}QD2lD3GN|tlSA-q@8iYd}2Zk=u_y^1M#XEm+i9t&>+JTXLZUybS-h1C!0X-HMR)jD#_7d2 zbhMl@VEv-Z&b+K;H)UH3LhKtMwm!P3cVB+Zx`Y$yHR}?}s}mlB`S3&@*!a{E$wd?) z)jQ11=}D}cW2e$RTj%sACx8evWJU4_;w?+^>HW+gN^Q28@#LD~lR=W2KK#PvQ_poiy88yV!M7rvb5C8=NTlaq>4v+c?lY}-(Dt>=k@cdZR9jNg z^~?geJ|rL2(o1cOT6Xu>%VB0eDbQR~UhyRH86_Rdm0n7Y!Z8CqKKV6l@{(7)|08$9 z+W%1>%=^(q8gt$Xy^|wEVj-mow^4ZqO2GEl=X2y9BO{g{Ipll7&YLodU#x;}CK!r=p zae>JIUhzt0RC6q4hdR1qDVSxH80)%X!_f%R?jlQ9oM~Z29E*EKG)sqzBpQ-vnC`-# zW;N3q`y|6UC0(Cyp-FwS(*Ik8KR3Bxx*VMW%j6oGZg4AXqXzdh3zhbEkxUb`b%!6? z;Izz1%tV&gSQQ;8^;H@mU> zzx@r3-G8+`b~hQ~FLLZoBOo-!?!6;pH#t$X-jz4TE`#>vAG>Z=-n~+e+H%OQ+_cen zRcb$2nSnXzeGrHfFbdsBb>D56*55 z4M!baEg$2TG#1Yxtss}0%(jBOtsrk@OW9VCU$qKyJgOjbK>3ymvfMaE6lBaj zuUG{cg@MV{6l89l3~lxX=2ugY^>%Xw*<~*kWS+deS<^G7v|2$f6FLRCnNTjlTPet8 zPN#!6a$ZnD9?OY}W3EA)D9D?oU#B3K$((}BlLz|^sUZLQwvc^!glsXHhL8=DX(-5! zr8IgLPC;&_l8s|C z;d^u7TZ-W0*$78}Bnr}v1o2H1H^lKOjZ=`Rz6bb{gz~esg8Y4fw@)863k%lvseTaa zUlfP9;W?vHO4M0%Pr>>*NIu0e_Zxort<64sQXhiim;W{EZ!-R9JI!DpyF7@l9par5 z^R~b`rf&=ECu2oqFwHwxN^m0i)o^e&BD_v?R4--zkrNe1iC~imuL+jSOd;zRQC)6g z$&gss?VGgi34qSikW9EHOTA%vhBXpF!5GYTaOV-j<4|!~p(E<2JKPY>2e(-UzN;tF z_$Iz$YFNRLfdfZ4k|4DNd~Usk@~ytA0|r&4#&=VhxhDWPxWLWy1ZmqMZ45j`*MIG7 z__go9_MBbNGE>i$o2>bYFps@h6Gmt7rxDwzMzDq7YO|uWl3h=(Iz%7faFeuU;71T< zyD7j>6JfXjB@Ru7FxIdb_e?z86JC1{WAv&PrNts8J8Sh;z+YZgqfF2)5=JW{kJTS-{~mSYObdR<#$z}t_H z8}76ApElWNJwa#p3Fkea4U9*X1WjXrX1ZcjYL{W(8wa<>A)(`$;z0LiIP8`rE%NlILYJZ&Sv z^6${eSy8rbcpJw;#iL&c4JJ#t;hj|wZ8~FMXML~=k!z1blZ0(YK06+5<(lP-leQkl zy8C((wn!AcjnS`@$25>wJ<~$j@II3qjDp>p-q;&_^*upibylwWaXn3Qrj*a5*+<|SA z>rrbPAM2C0MkqTl%0|~3!K!>QnX?->bZ?qih4I1IDkQJRs&;>7VhdtnM!}9#Y>*9l zSMQSgaxe>FRj2mRgn`E@m3KUY64ql?tK#8tN)B$lPn50GC0GTYev%b$IQ7k}mIby; zyURxLjMYHs9IGBgHNBd1?ic$bO9rf!H1^aM?AK<$1uGTcRz3qWD>AHR!LfjVH(?eX z3$wZCXe>xmB(P)my119Euy#qp>w;xDZxP>`^S0r6W z6lqL&U9j)mM;bhvPONyg?n|D{ea(NXInNleEtEF`i}Wrq;UO{LEPiP`TO5nM;Okie z1n4@M3D3F;8nX#+42PxAU>vs#4mX?dDvsM5VGA9QXU8=)Cp`IO;a6sSSNA3IxZe_a zu*?!8jt4l%b)I^{yBrL_BhQ9kzaIHx$kVhY_ZpKQY{KJBHR07?niHPR67dtB#0Wp( zHPL_36JA$KnVXj1=9&Z3cdj_3eAH_y#&FwbeTAcAE*&*}KOYMxW%LFLjsH|@#9 zZ(dER32wru*BwOXC%B%Q;7qQCQMo5S!F_pKr>m#9ZJiE;_!knqJ5&P!s1I~mAu%=Qn(NIcsUn(WsI|XA$rOt^gcTl!T zzcZ44XG~2irC&i-o>rveeL?(nM)7ANogwZ;#Ms;faSe-38Dq0V9R92$h(pjU&BT|AIB&l6hzrIM=M4-X zXHvunLbX+Yl5GG)ElP(RE~!supyUR%0xKD`Yr?GA9)=h+e&hD!aC zI{`0;bSO(DPR{;Bdo89gTtvjgW1`}Yh$rC!a?-sB99JgG4RAba-xB1oI# z^blg{%Jv=?j18=OQpyP30((}sabZ~!3mY0XC&-*Mqo!U*Y`eKBn_VaA^KKMRIIee?w1)@JD6uFmLQg@osOfiUdO>86$uVk4v=0>HfAn3$q@_Zv?Bqf zZq`1r9YP-$^MLm)y-(~t$@Rs(?<|Vg?7aZd{>5{7SKItD(HtCEyB(_$FsXP9suwBC zDooT>XlBJY+D<2E4*a1UK-!@%n`m%WMp18lFfDONq*KE!hou#fqW2mWBVkb~!D0lq zgn5U>Not``6~bI!nyS_gy+IP?b<*Ll?=ff%R3sq7&T7*eguMpmCF`ZjX6L7s~gVfO1Sn7y!XOb&R z((VoZ05l;$0>OEfxU!s5(FK?uPg2oJ#}}ahypy+EBzX+jJ@7Y&HFwh*M#DbozY-i#TSR zZp(_=)H7n&EJvQVWJvw1LPlvJ9teRDP*tv(SSRh6kdtuDCm zJYQ+avOmm|-)uaI)P%$oW#?&yfl3_RY&^1;f0A>14)&BgsgmIpcG*C%xgjnALZINyp&66G&th4b{ z*;){&QE$c6P-wfB`XzS)8lbcBu>6DLrW1fFB4+{9g-bwGaOgy z&^V6&M$x;@#`ChFSN>ondcEH#nytbMjG|W@qPFqKMa^tHwH?B&Im87PyTy5JRMhd} zjd)$&WB))V^)o;K!u6Yiyqu%*G3KBU*d_yxDzF;i2v)w?WpC(oi{SvE+yY6KpLfd| zp6-5|><_wIcw0W>?smN`pLKUT-ONgE3-eF`boRB9k8){MW_^ZvKwm zb$G3DGowD0y3+~*R9~P3gd62Wyis1L-{sxVoa0=jFy|N=N6k53M`(O|g~qp6XncEx z#=S94lK?;FLg$vM zYqw>y`D{BT2IW6#V~ebRpiP_2=j+2U(RHWfpsjopl`5axz*(bmPb{4^#@!RWv&Q9e zPyF0gOBmZ;8ta@55C+SgCNFs*cH2t>)NO3~@HpMX^x+Y=?WM8prGXS7ZL?z@8c6i!Rq3T+$MS4@X|RfNFXzjN5j#0 z<)dMbl^*}sTM0PZJ{n)I0?xLNhW87=2}wILZ7Bltx$P~|rYZf0v2)u;Lr&C}*$s8u zN5h3ZDw)G&c0;|aJ{lVeINLrN7vrN*P1@To8d?jId+JMa(Wvk^F8o}ShsMh%{QSYT zhXzsCw>>oKmc?xCScxoOJTcF+JL4L_HQbI{lrix=;o@xNY*f5wPiX96C?hO^49 z^IxtG+X@@?6e}{Z&c{pH^ivSfw0MlelK-xJb?lAeU_LtXMrq#9o4;piI4JG?VXmN) zMa%6C;tl5>^2@n}Ve+dTlF7DIro-$^VfHz1vl>@KWb^tsjPk@(97JJMxe>awk8z$6 zX$dImLZXH({fqDyB4(CiiE8gr&IyQ|gKT@+<3v854az^Ts~Ty_Y3tP`hgm?~E z*Vx|Zhv1#n2)wHvfNpedIB;!jvf)>oBr{d5mE5D~y+QHVPl?TP4rWLwW_DCMc4#I_ z#{R2}`8|DU=)2=J$(#^UM!L|ZNS#f-nZ_A39RmQDNuNp=9Z$Va6T%i#~`SyzWJ&PJ| z!lIP(GK~p~2TNhGIOviP9g099DA!MgL>x-ngI|c8-IERXEzF*FkP;R{>HVAzL&(QK zb_RbtU?ZlCe!L}2vQF@67pHE<4yQwc*p6@az6P!04}X#a#TPIi{&$C>c`pB0&j~ep z@wt3uy8V;#O%psTm|?7%c*J zS+fQY*f#^#Zw1HJQEreCRDxkBO1LuVSfYqWg48R!HVcDFWbB@*lyK7P0(_t^MdlmAkqoc~v+*k7QBb2U#HS|u0Zt9{Hjp#%k8g=VHkPTq^^coD- zFlDRU1znIi_yM&8H=uy{ax3{%I+P!w7=@Y$KTr@lLZwjoAVrTn4?noQiD6%a_b zpU4Ai@+?g*vu&7I$1sp7A|M;hnocbcyYattPOquffM5-Ln{;8>`BrHEX0oU+;W~s2 zAOcLRM0VqNxOE4fZFW2y$kPFFoE`7ZViT)XTa2}VPxiixG1?0|A#T$H&;BM(h~u;$ z5Oz6^hx6x_!G}A8ADN5$@9v%oABG?TBPhGE6X3$)?=ZG*fuK2CiKA$k*lsxq(g=-o z6E8WotYyz^nb&h%KHH{w9eXncVG;09-5U~A<$z*l2VoR9|Ln_fqc6v_lJ#Z%1Z%T- z=h$ifwYY0rV3UWq>mNIH46>E`m))rloy0U=2vsH?C9x9MW>PNU+ES=%w6?_YItPMy zZ7E*+S?lP9e0J?;LeYc=69hr&5m2OSza8@P>5#*425Y}Z21;D2k~W$~oTfT4!G@I> z4zzZdqu{#Ml=rDUr)b4s?a10~Q2CYxuDvzyt?dnto%+tjwOMN{kD)#83)kKX}%wIEK{{+SxL7_1RgpnL2TqC$zR2Fi_Ira@>AbWVV*_X<-f zcj0^2gn+s%5unN>*;|lJu2_4L2Cscb5mEqju=d8apO>FUi89q;!y;jZ7e!YWMN&l8 zFG*^DS=r`DA>?CCQpCz|BsBp^DQeioQc-7=ig;{LQAbo{DJm+m1TUV7d}DkyFHA+3 zR;{{cD=Kn0X;RU$sHo$pNP}I3L?8QM-XJ6>|2D&dBOqa5Qv&ML1k_naKo{g89!CV! zg}#U+H(nEBXVqOk;X1tIc*xgVhxgOI>epu+T@>4BkJ2HJ4LWR#4lPARhnAqC!wovT z$u>}(V9fLC@P6IlZ91F)bK_{X4)0eSgS*W;yibR>9mnXe>+rRwZ9<3-ZdAtFFR4X~ z;dMbsv|H|?>jH!y-No0z;_Qx7-2&u1n{H<$=P|9$5EfAp2PBoiZ!8or3Z_D*Ox>R` zvo1$zHj9S%ux@eTD3eUxk66g7rF=??+0@xIIs34rC{3yItra#O1o|F6C_vA{gM5dZ zW!(&$?$G@5ke@?7GRTktmZRltPM3LtqqQhX_d_dv>ewj+v{^!`J^9{`5OOP@J($i;4{%HZT|DiJpFSzs zvMk<&5S^-E$e2D0J{rh)iKWh8xKzX00VE*Wd-I~isO9LOdpy3V?w*mLIgpJX{2aeW}pBVxDoZ2m*1Z)uY@g78x!iUSNoFna@zsAU`xTF4uGF zI+r61B`()8l(^ib-B8QXof(0)mZLi|qH94a86mZnquaCHbXVtiwuhcYXN3gzpwCG{ zF&heuH~B7E33+kbq`WxNDMupG5y?ZS4L###cPkQnJDpk07P%~}W{9up?$vCs0R=-Y zJ?K>W*rlIH7gy3`HQR?+IKP@Mtz=hlw`(=syOO1%6+5;u9i;nKI14Px(kr;1TV2WW zH05q5cUMx0kfgFPz&LWKdUn-L1H)nI zvQ<1fxLTLwU6mTIYu!sM^)(k+>H)Pj?ZVHj5(nL*<7a-5Ir5Qp&nQniJC+KaA}R{w z=mE$pV+9y~r2_-Hdg+WGn7aeKMH5bjXDDIcL8<@jENW_RYc&;HRT18wJ9V?xRi|%) zGB_5s)Kz(w)b5{6SJk<8URM=_=@q8P7)?<^#NVpYI=!+Mhe4&8&TMO@+nVV`Yo;~v zTom1GtDm)P#gtw>nr-ERTJZ+j$hP_^GZ_|~OH=HTO)k!AwXJ@J7omRMhPwIQ5JmTJ zSm~LG*E5q+Vs?5a2Jidxxs^ABtgN82Y^rSfBq*EAmrZ4JrYQx@G^C)JvjlA2iL|wI zMB3UpDs7d@=DeWJBO13@7tp;)f>QL5l2A5hHd8idUc9n-5!Etf^CHwf)5|YT*}T|N zcU+>f`9}KOmN8ftcFN{I*;Y19rQKFGUlqzG9L@1F^rkKJO(m0R^r|Q(Uh$#dXI`akbei&%7xPQxo>J`Y9cGk}0nKW~R9M(M)mmqnYCBM>EB_$8qlH z4t+3FTz5lL9HEWM6ZF=Z;<_svnc{q7$4qfLW{m~G(iGQ~DUM?^WuwCs$75}ZldS+# zT-Tf8IPFfRIE6!SmN^nHU|Hib53}QvU|HjGJ(e{tN3uP-T#HqV%UxK-xZIiT)#VQC zUcuGz@$5=nj$)tU!2honRt)}hAst+CYeqLC#VC+S}-vg8u<4Tdc6QaB7{UDqnXKu7tEtRfienjB+YasX_uBJ>%(`9#Gg@+&>- zvV#iK`bn&-eiG}dpNw_YkH)&{M`K;}qp>dc*w-pTUz~xJ6f-d5iUqZ+PU$+vdtg>+kY=kep&-py#epK0Ez9&o+t+Bu^G+)eF+57k4tP$bdskUUggeDBJdT3R z=IJ50X2rT-iaR*ev@iAp3!mri3hs7MiIAjXT|4Z=9Idgzx_0tn5l%&iP$H~r7ccfz zFF5lA2a@UIIux~+PTkCI-BH%n(~vU8EY=0D#u3b0t&Me=Q?IeEwi|q&b-6edP1eQn zu8tL5G_rj97mKW#b$!Dit72UfW2|du@a;ix`oB*@f?m8o`96F2(GLzL=qBDIKhYb+ zEDpRs9&z+z?Ng`j!m7e+f+fX$z*x}2gTkEq><}`Je=%2Dip~glpaeap7rK(53S*9b z=6^lB1!A2r8-(s~OvZH<-^xZY+6|bR!yF5+E8i3b@S&>Q^fL~HU?^zQKQhYukwpN5HQ={k6Q97wl}PNkv#1e?*Kq0NOAX)f(s z<$|Ejq9n$wPVm)79X@$1eeWZOqw9IJMd6;@j#>29ETL=iuaF&6jzzj5-+6>- zLf(&fF`Gj%>u<;J)4D4+C&f(NY0tRSQ4UoV3*5Oj=hk!I;nsTZa_hi%*rNI*$3HX4 z%rMQ+QdVU-_<1$Mu{8_Divj2fiRDvcVDuRaZ3u8me-q5j%`?eLKFbHqWB6o3ptCpG zN?ID-auO2538x=%tdr-C1IHcb$w8;t11noPK>km|wLc4OLS|~$+PGPUQWlESuI4_m z@B8GWOPj@KJ*1rtNQ}sIf}amOc7(e~EE76=(_}DO_~u!Ft05RQf#d&c)f@$mOSS6Q zb?f)uIoSN6p}^(n?mRHMYMp@0T(pvII$UKe`6(+*BPYyQkV%AYO>DF)5E`MySXjyD z*RBYX?^~NA7St6XH#D2ONOzI$V%^1tG{t*iba4_F69&+|xS$pZBJ@uKlJ65@tc@gb zbze`m1YnlNA_sVpVRDWqDHoGQ73*n_Gra;wd!mhs_C$}Z6Zm-KX66fR45MDc$V9I4 z$VIGnv}Tlscc+n)@jz$`FTz#UVjbn(Qb74$Bb#1H`?o9_v^M)3($-A9g5P*#^4W|hG@k=EIEKXBC4|$f8 zi47!Aq<+o2a@wD~QKL#H!Z;eGyH9I-(BN~sTgkg;@#2bfCg;Hu`3~48yg13Oh)yvB z23DnEzWl-Df6A}^A-#Fa+d$UUPspXqT)75W%EEPsaA@=Ask@j?PNhL=S%NxC(8!Wr zv69a#S8Bh<7qdM!aVA-=*gua&$e3IojS#%h08Qf-6Q9?1qnM^osOgDlp_&=+fvDLwO* z(gTUwsgMiIp4o0vM5Cudw#aPi{z7?v>E6;uDYI`36rDcDbhJ>Q+!+6j(}e=Hr@F_M zQ{KCqmX69P|3_qrFlSKny^v47*T&0kBYFq9&SOczW0daJEW6v1vbQU3ZG3u%|5W<9 zLtFOGAJn5wIP;#hF@w+sCs(fm-?O!O$JUI~(hpapDU2Gb#3xa|H!o(p9d^^j`wOJ= zBDgt^7qbPe;=pGXPo(i;zUY^7_TuG|rRmPI*;VOIN80$f7|wf=-=GvEl005Xm&BxY zf!HN&j9`Qm51wR%?^&C{HETD&lj#-wPNj?d_R^H!>2xo@NqQ9rQJ^YtKa(!-JDcYG z>Zrt+u3Cb&DFSzE`IpDV_c^^0rk;2w?Yi9u$+gZTXb{25e&VnMr zZ-XB>ugkG~R>1}dx#b;EL3N4v+S`{|X$D8%xvf*-_}{|a7AMz{tpRdit+xjBb0Ub>4xzV87LjTd*Q z$1uP00d3{rInr~K@8_9~g*esfInH0hGiEZm&?LOR4O!W|{ijPef32Dh<(zAt;Yza@ zuI+Ik*Y-G2YkOj*${I`bYs+yAWPRd@HdPIY2#!P+jOmW%O3Aqfm_?7ok8l`wyx3I9{K(+ z#%p`JYl9Hw2T=qOup!FXLCs6zaN;$N4LBB%UZwdQ3=IxrkR=ulk#^z#g`iU5*8|91G-P zERd_QK(6ap;H+5Sj9B0W#)KGKca*X5*kEj3F*Zw4F*Zvu&e(K(@79!j$z_c*t+Z`; ztM++y+0*n^N7~{w`A%^%k)-h)F*f5R5ILVC<80z7P&&`CaW>D%+G%n@a@T$m$H}-t z?GBXVWNgy#93NL)$IG}FFXL*wjO#jHR`;8U5rH<$Y&dnP-!6?KG^=;ve!H}?Ht07L zA?vD^xRCV{cUTaugSf@f*k&1SV`E6ZTUypFt<5GFffE-JFmWM45*HGfk_$;8Lb-`e zp+xm}QkMz6+M$f7BW|>_!Fu*p0@4VF+IMy%UL+ZLCoCgH1T&r#dY%+Ip2U(5pTv_8 zqPX)si9*G%obC!YLMq4bneLE%EmUmK&}rKU+5Y`f{T>1PpcI@Rh{IT$&$Sv6?Z?1V zN%_(zu&K$98MBz;6GpPM-+^kya_a3o{qNt;^R3*xM>og0`OjQ$;QH(D;f8$06Yo(r z)@8#PBopZZ)NT{V*E+}t$zYHVaPt8{UgqX6xbEj_kkbk>jJt$Pdke{$Y+ff?ZA|;i zH*9n#Hm%;EeB7nbw3yO#e`l_`G+G!Z_h3Pf>>FPcZET)LG^GT{pHgLp-2AF;&@qcI zbCvvWwW7e{@$aX-J~%@btHIzd0j9Ke3hpJ}o5loF$Yd;Z>q2Qf_;4sQ9HAZls~!17 zmVp2>OQn)U zSJhbuW;9c;%!DDX%0$lJQJ4&rHvSV33qb%HF>E}5H5W>38OgV9B9nb&Ta@;;gb!#& zN!zz9Iwg^@5w=7{nM%@5JI0%Q)rU zurK^}OrI_HhElOC9}5mspU$z?VaTH+E9*g0FN=e8G}<~0?&Loas8}hMNCA)q-fG#s zOtIins2w`uov0tnDxED$X;<8%o4m(jfeds1_&%uF(y_ZidAhVji3a4*J{`6jaOsHv z0Cp#uT}Qyx9E#WW77Sr4%4^mEogk=@`79Eju;2A?um|7bK-^w}xP25v0|2Hu06^A8 zFdDZ)8>YJJRU*|GI_qO%m6s*M^_YK5Mjw|)A8*eDj3(Tkx?J?LwamXJS}hfoO_OA{ z#yj}4DC~%xJ_|c_L9`)cmJnER!V4ipw|9W!Z*v}t(lV_7EbBz$g;g$;Rqo6bUM;*8`!^0SLlhE9fS%Zfbo4_1rP0(L0u;16vyFdo$V0a` z+n=RWaTQ1uTV@eyvY5DWayDg2b{_gb7dsR^D3kvo3}OA0%e|Oqf9x;#WYL8Kb%=w~ z%5D2iU+!tAoxC zZwZptY*q~|Fq1net08JHv#}7QVMYXWFv1WGa*XrqF){=rn1zLrBd!Y9a-qWxRyBc) zE0CMlWWURuRyAShl-VGbc@v>##6$bVbCZ12x_*FdNrpzno7UREO7iDOw7iFIHMLPQ zC03=y#kA^}wvBD^WjT6o5*8tO!tQgeBN7%~Y)n%qeIxmT|3s|fmdSsMCTFFm4u&%u zlkm(434aAz5e@&9Xol+x*q=%&MzOW#IY47nJPPOw0tA_T-UB)>K%S5rfG$YL71RbH zKj&e7R#(b+RchS~-oHW$3S(w-rTKfEpG0q`*Ox&-ezmm4n{BtkJc69aD_&NHYe-~P=l~Bn;B+4rYqg}R9zwBoz-BQ#9hI$3O(*2 zoT)2xrjc_)`Zk&q(N^Kbm?0gN^ENr8+3n>e^%+O%i6?b8f+`jO&(N^+-1-X|YNAjv z13K?~RFV35qURW?J3#m;s8y`ydtNdM=s6GQvmVg10^~^j*#;mZb>u@Q2#7;j^=b}P zK~+Zz{cxyHdYI4XN@dRpwj=d(4cI`cNxg#ONZms?t(>0J8#$2!RiVZt;sQ-+cB=pp zLa(gQ(*g%Yeau(rsk%Z>HNkFPp~pOgN9zhb+Q>N}-ZhVk+e$vunVfdhwuyDpB2G+2 zQOI&GwOdE8f{F}(Mo@p~%i_6bN~lH^w(VMSfn&&sb03-#aDh&87M;)obg%y4&gj$_ zG&*9x_|Vh}+P;bqB~Z?XrqWm?4Y`W(JzogIlpAdhj>saT_+tp*-Quxd{sNy$?%*qAoxA6 z=SSHztJXCtt|yyJl5f+$wP& z7&NNOH(^wGuvv*R{0q%WZbm|r7Ha4HjKpL#z3~X09vPv}3G+1gvs^VopN;8TCsI8d z`w{8@jg8PzK%ex0p7DUr36LA1=Nf=6I6^C^jS>2^hxsvGsq9mN?MCQR4cH?iw1Q(J z^shv^H1CCaK)g_rF3sC&gjRqWBlHPX1oC*?SLjS#p)-vNsXttJOU6)dW@RhV3J3Z@jfQ-gG14y0`G?EqaM7(^!@`)HA@;mcE4K1(c zx(xj{lg}p17p4e*JRCnaiMrOladN2G8K`bqD=v8uRvjc_W+z>2;U5<#&A{Fbj==`U z<~ek{2X~nk2f92z>G-ik?kM@eNnGyCE|s?5G&wXzCh>on8fZ>iCOxeSh-qLA%cnIR zvg#s(8Y6?1MVed644)V2&Qg1kuGI8?alRZG6hz)0UTqua{VV02W0)(i6m=BC(Yy)H z9vkOlokp298O4=5pYPZt?_*EpBeNu>hh*zi*gK*okA zQ|i=WLuaK_*7|Y~UQwCQdCXs5sL0>^=5JHwn>p+ zG$hc)NWW{>(1$$q$2{~$1^xYBQ6D~9Lx+3W=#ZZb-YX_74DB997y)|1Xbi)vO6wId zue8%bm6;vwf#C?*J;z+F9{4O*^}w^N5tS1myGM)+h6bpW&yDuLD4icXg$Vrv%$igf;B42Tb<$J;1$`cJ+XcC2_nefVEpRl9ZaEQs!u+Mvw z?=fR*I|VhM8qIM(L7Su_Oi=O{{y!V{6CUx0v&jD+oU)*j_hizy?x1(N}P6qW`=QO0CWdp>Co- zUm|ocpsNso|9|%022QW4y7xaX&oj?6bDqhZ$xM>TOn~zoA|{YPv?xfm%o!!Tw#1gp zwJ*1q)_(5aW@2w9BA0&5%U}YHiW+THw5S78p%yeE3JSuYRMG3L^cI!2{@dJJs%Wi- zzqG}YkpK6$_CC+cyaZ6&fB&D)H8STs=j@lY*IIk6wbx#I9W#p^Ufm+WTwrxxI7GEb zRc}wmy95z@dWVPXKpV0HC1mg`E!i;J3#(RR2Hq{cnVWP4`!j0hDMQ{&M>F8fP)2h^ zjcH1AS5YM2JUTw10Rz|}4fuUOG8x<+aJQ*t<7_X6TA1rFwXX93?)T%|*Btw6H+ZpqApfdNrj$J6zMM1UHBRqT z(tF!f3e9W8o6@NSpmwiMmi6Jz-Wz&(1s|#sO?i?7YscJpM0vKr>BC%2I6=fxIB^)z zgp(6|w&T|py0UlGoEAM_ud{7;K^@yl_u!D1k+gu?1jw6oh2Lh>w%70-ZPQX)+_l=V7M}3rKO{W4$#$p% zPn>oVKu(yLT3BG1)wYzo&I7XF1GcXX(7q0UM8VcVs~ey_zJ+Pk^s~QRvz+~Ph-3a^ z_|nb(GRiZ3!H+Z1p=4{Kv*oFYj@BhoPEyo>6_bSWr7NkuJ;bNin*OaZbV@?c`};kL z_qAu(z772G97G(Plt)vpbgyA0B7Qv zCm5<+B!`%`#WxR|yibVYhoKW$B3^Sa@4V))`QGrlqcu=#Yroop@Aj!Jr#tr1RyjG$ z=Z=KyVxUDh+B^3i^DREAE1Z2$Ejx}r*lsx*2U3{GBaEz?*;)`W)Lx6IP^`M9L0bN;|&kE`fm{gnfPy=$(XmDI2 zYd7s0W`$@?tKlfo*b)qSn@P@@z`<5|-z*$w11YGlA|5SMCaHwUW!5I1J;T=ZT%B93 z!>7h0T!HET?s2LDL6)+a%cVkmL1Qgz+!fXV(LiU|p*5ILJ2D7WnirAf=98?I_l^ay z^WIVFQ9a*Vdhx7h&3EU($BHPJMSsdA@jdP(^mQ~C5NI14GTmxrorc7#Gsc($+e84g8R5cBla9iA-@ zh_FuT9Vpom*+ltzn<1ERw|IuQNmoR{jOzWhExu;TdI&J;)!OyI!yc6f@zd>orpxlm zZFo*UtGJT!DEFkd#h%cWeh$edbNw7DZ88=NWXkOll(tT)v-j!+B`Xdu(OTey9ZEwM zD4Tfu{aR)pLdMVeeWfL;5D3jDPNG3k@9tqznK}-FFK7^A~SAQydsrh%R9)raBh^==E3I;-5IZC57a9?(Q<;u#>3k(G z>RJEBes@cKj!pnkyAmn!U8SCjD;#LddbScf#IjHIv9HSd?$*^e8ByX|i1wO5X!d%b zja%uIJskKG1*aje*8|fvuLtT-PRnMkJ9YLS42xmhhP2r@2tdyrE$yOcGjHQODZPbo zctTfL{}5e!?l?pQh1WIoL0jl%FHxlrxR>S;SBSIQ7OI-N4v^(^+b__i!UVeG?0qHZ zb7!h#)MFl;M|IUYQQ$Z>I@kqHiw{6KbTmEy7~=zNNB3|tL?Mek@IkqB$?^KZJS{#@ z`H~N!Hc26%5JrUTRHlf_79SAcwJ0CJ)~=HA0k$@LAY;0d52(KoAGB!Y`9O$WkPmJW zGC|Tzn-6A6WZK*kX9@ZxB2pJR^x7_IQ7&P5y^Ue2c|O20$%q zUDh@T90Q>4N`s)qWTx64^zA>OD||59rsr(gey=8kHwb7>Vu5ZN;w`sQX&VIokv9mI z%rPL%ks24JL$iY;nM4l@c``|aJm*M#s6-x|XpYpLMe07Px)^l_Ro6LE4|dlTv~vxR$`&Az$y-)SMU$hNA6T3Q-=x=p;HIOk`T4}CQJHSAZHP|FLuckmr7%ad(`^6V^>kKs+22J>3$cB27%uMRx30*XuhUX~ z%IoYtRoyn8khZ1LER83QyL+X{wbOVqlLd}m3*TO zejF@8pF2%$f#<<_SXZXoLv8+fs0*By@q{d$%Lj^_aK@92m;{C5jp#YX(;`MRR*xeo z##5uyc)}t+1|RrJ-F#s6OCy^43-N*Toq^8zMsznHJRxLiQnmTuP>D>NRFV&DCd#WL zu|?CC_G~pJmASc+a~{PiEptOOh#+Ot7;PY9VqTQ)>NfDXfc@?Pj~tD z@9^y(Xw&mR*?vv(fYrX*_iHNd8|4BjYT7qGdDO9{vPW7!nT#sEDQ)e|sEMcugGg=+ zm|4 zFqU+;CXN=>#J1{dYvQ((VIfWIPIs^tDmAfN;V?sE)5N?neGcOUnU8(Fs-=nBZCBC6 z?wCuafLKl|NE7QDL<)#?nt1M%m2|pEq-ESQBCR)s+NAAP5h}mmv&24?cbaiuS$>`- zg*Eqj*4d*gB4JwfoCcmQ>&?@sNXrK`TPXj4pEa{>5j0!Q8m2R%i`arvbOGNTDvybH zK;^xsr7X|%r92@=WqHco;@iJTSJ-8y-Oo%}&!PK~eoSMC@y-53ix+3EF`-a7iOvFL zBB%5a?Jzl6<+c$RVc< zuT>N%Yq{dEDTYm{J~eB^5%S=Kt?q+0HP(}pb^ zaDrylV#Ah<<1prkv0>XC#AYp$g=-^D?%+U_0>aLa!;ph!5?~`b%3~$cGcYo(#E2`w zAvM)pr87TPcAdTlYtL4n!SOjOyUvwe&HRXgL8qu9jtk+bhMwzLIX;D zB2jGfPf+|D!bwEvyrWt`srl-UYH^WH5fcJ;3@4x#C;6_V4^%1|lfW(uJuH@WKF`|E zo1M?swVyNapsDT*hy~AgIY0~ooTTsuj?yIgVKuDjD9`~V)PlQM5$gzJTwFi!;^;E2 zd%0#@4`ZUQ;i_{Uaj}jQQt9^yCozZb)-&Q;FwbyDyE>0iwq2)|em&xhRP5qSql+jA zcl;WcTQJAhp^_?0LsNS47&tpM=A0Nu@_0~5?{+D^v>9K7sWKiCCxDh<2vz(c9XOSlig6{q0AJ<50!-wjLGX6%9)T$kPwDpGH^6e`ICpZ)Ad5B& z>xfGohpDCCRxS83KrE-45c65fScm7HE!PGAu~p+D z)u^Yps3oy$`XRfsFR7E>l!K3Nszvo(@f&zu+X838#>&#jA7V$f@xvdMDEfMEtn^S4 z(^danv*<{`IC}N>$fKbWR=Jx#d!Cd(8}_r`|D>e;pHNeSM3yblMILl6{p5$^qP-$6 z=sjH&Q^5r*R2O~e7%9w$0q|79%ba>G;?0&VD4s%TO)`q0umpWNmdFGlIi)(lAFU2Z z8Kw^ES)vYDK&S)UD%OF*AtQ7QUl9Z{21|9Mt&N~H(C+bR=-oqfm{1lp!^cm3#C~-3 zi~acVzraLAZQ~d)R~U;nri-5Q^&vI=)Fv$15%rlh{nW+^>G8%Gy?$!Hg!EmUz_Xv) zb0{Kyf^NeGhxmJmg~vIkVLt=$a1d-0?TOkQ8z7ul% z|1rlQI{(UH;i@j|`Rl@FgD%gCQGgI7Sde}ZMv0igGE@E)Ua!j@d$9mxnL&bT>$Y;*I( zjQm(znydM}YO?t}imw2rNw!)%@H}ovxlN@LdB5^}(wT3`m(lDgG}s@HN601c$&Y~b z=<(!|Q8p~x0nFbqwY~&??%&d^@q78C(pOc+O<||((7q8tzJVRu=1I)m!RESbfWPar zKDe#vMF>aMGhB8Rm;N?ePwtwNmDlT|VSZ}1E;}__d*m$g3Z0@1No#nKJztrTl86Xv zXv~D$HmCZ;9y*=Xxf5zU%ccS`PmrB7VaZTJs|(C5@vvA-8suQiI-Jv6tA~>S_M}CD zC0!;MCj2_YH>#ACah5IA;sDs_HENJCFl#`KW%{ro`G-xrHqmq(33kaV=YdmJM)Xr^ zZe@oq_=?lcZF~<l3`Zb)5=$-U5oDMf( z;=p1Z3{Or*aXO!gg%Q>mE3Z}RQWAjk;AG2p_I%^&Q)1(4ST|96WpcJ{u^eqfJQw>8 zff=L~J0#qWZpl^(&{cfY0KE0F+7S1%1`#(ax!O7yxUa>{uxy_)+4sTF%>m=>;f2}O z7?v&({xm3!;2HH~sC|m~alQEL`A0sjKOYZ|+!umy=hI-1x^az@=GD)7yRd(lZFG)j=5Ynb3%E^<=yGKkBsVKQDI(zxTRB_`LF zk>CJ{#n%Z$ZN6%ttc2wKmfm1eU6G$4U>c=>%ftdx%_f(_?o+Qhw^T7vdzZ4qN$>?I z$XCH6bR;>Ri-%6puT8mR;yT@~$(M4wUbnA8pmM1+5p0t8T5&YaH~FWfiOEEgJnG8? zCr&m`YKgm5P_|#+7RUqb#tukk!}Vy&77tk-2;(8rg~QFuD3>>b?0Mwgg@|ZYrWN}~ zC9^!=1eQIPz*^)@ebG0K1>ShA4JWZKv-xQm9v1K3vSG#&KV^mGk_9G{klsE|>GAR@ zEYt|elx13yqO_|G++pl-cT|9x%VAp;jaq!U&{NKMEl@U|^HhKfQpdTTs|QL+1AU~K zppUkl(k;0(&8Z8J3Qv;+#cB*$-jW_@p&7r1w0wij)3S_Fp5PIocJWP>ke-&UVbVJl zwKh9dlidWt$tDQ0wakAsmZ!MHJrwV*-YE>8ZBt%Ft?5!xS}eCz6dD!I`>}x~^Ae;S!_qEO}YTVxfWFXK`cX*jq=Up>R-$xU6i@OERG2 z+W2N!ZyhdN$E&CXn4_hz7En=1G8u-X#E@jb1+J9YCMrV6g>wRTlV-iv_ApAQM?kJZ z={IypRBtNf8;nGI^Ec*i<&RD*BG1H^VftNy`x*fVinj1;ca$twgW)8fn5ioxFX zs}O(bwb|gWPGy5U2!dbDf~jmcy?&s%Tv>Ee`4E>Ue{fu7#jg4rDlR#R62UYruhwx| z{TKUhZ>$esG~o&0kIO3OU}bQZ?cmH|8sq{AFW4O0%(9{2QmHrqJJt($%+; z`J1m|R9592K?YEA7m>+$ev<&Skt}Fn$I4q|)$^bWs`FeM+BU{m?EQ?}T+L`$&@nQ- z2P|PrAgWZ@oL_TaS(7E#xzvhmNZf)a4XIL8HHa#pk4|MPrx>?DdM1Fbvu2A51lG8- zWmZ9rxBC%b)=@ZVaP|Z9JP4y=<};0?c|6g#tCOOqd0hHXm@gMGg649FA*L$-Wvh#L za!EA`!!W?D)gYnN6LGFDl2dr4#ZSpF;k+P54!-j9nKe!vr;$GLb6xaGlhmSa!cd-R{~|5 zGe?H<^+zW17udTKTJO*Y6Zs2|Y|4K|c_>wHRrk9M_VD=bho>FcL~(jvm;Fq(;mD@U zKM+hWP(v@&pAGtRnhKr@W201=)l#DrI+f?GWp&{HheBg;{5#TLW&rMZMY=$+x1N8z zFIVCn?{mFczi8DJz`9QF7pkgP>lUq=Wy=7){P@j^4(xJH#E|=I`SUyQ+J3rbTfUZ0 zz_+m4ev@~gwf*$OZ6pxSvMkTmZp-u|BLm^{H)m@$XZhyr#LXbU+tvPaJEO1)h#iw_ z1Q$8DT`sB0k{aUkhIL2!Phrj>*vqpaHml$!+1twyX(ndV&n=N)Y5)E_r;d+DNnv;| z&yHUoRL%+xv(nCRnLnv(^R(cCpAC-K?fT%Nvx1`*__iFT-}4zs*!1fmjSB`C80E2L z3y^fe5FzFhU)VH&1LT1v#q?)%?1=@^)z%V@ljXkLS+2*l6BwI=bQ@`|osf;ncwX5Y z(Qx!}CN1JL(^l!B%{IQsGlri6eWux_xdJv;F-dJ!t#^|N79kg`W)*dCAV9jY7Vno6 zX&rOs)D8k#mU2C8O#?A$$^7fPnO|%QuPwxe{?#JPKVlrbNY!I=@QMXE*bS@Ad&lC) z5zl@jbJzfS0?~>mKdmVz({Wk05*T@b(r6CpMKk9i9}HvIMi5OI+JbbN zbysX=rWKE=7~0d`Nw}!-6-BQ#eyD7m0w>Vch&ouoj;%W2rFFnU3R&ekpxsc7ht_zu zjA9`ZxRLOY02bh*;v2#e8~&3Vk}4}C*;dGUUY@Z9H?1p2@3(V7=v@iOWPJfEj7m`R zSCVmazOo3i(ZdN&qil3@6BChESGBZu*vzQ8OtNGZ#bM6mw&sg?gkpBD@a^o%Qdp4z z;mcG@D-h7Cu>$)QRZb^EkOr49MUceDD0fk z8giojbOLF11&xHCZyO00%Scc~w$it7VJH0(E(9{1$%XS~ zr*r93zy!M&+L2$bvp}o4Sene`3Nc&7FLqZ)xUjoA%!MEw>;vunH@IlOmW!>Wmp6sn z=P|IREjVw$hsbwdgUW^@No6|nKQewC3jL3i9|y}H0Y4tH7%^Ah7OYLa`gunDkY%8U z)3ih<%656Sny4_0p#uAeG$Q~8lSv4O7n7{%^JX5G9MAf{7?HE9U}>NJZIlP;JB};< zqQQ^lNrL#`75Aql$ujP3hg(NX@PVZpXfqj|^Hi@Y=}YvgRk`SB=;a;vuSk;r!s5O7 z=1qzWQas5;qtSSwPsTGZ=#`Cfx=h)#I+t&e5L^(A>$7ne7Jc~s1ArUAb4qPe&W&qd$@ zY^cKb7<0(T{+OsqaYC@fj&&jS zvLGOWFQ^qHSD}q)&!#bTqnjkTz9*{evhNq`i)_`^fm^|4xFRNiBz?-Z7WtKar-v=3 zNUd`))7tORMd+w$S4Df70BBx}^!Eus%&Kc+GF|90qQD&j)2}Aa{@S?CRyUWRX~}na z-Wmac{1Y3l*^{$HPyhPHfX2mbYfLp)pcla0@e0}2?4a-)OcG_HIO?jUJ5|FPf?!!2 zU+FsC>N@SI@ZlLCEEMTN6BNW@!~bUQo-J#_^rlAFB2tF1lT) z-mCK7Rz30%uZ=e;#ddFNIAu@49=4+U7JA$#9}wS~MThNVc)dG>j!Tj9EO&pI?zO)i z@5n2AHW@6L;k{$5Yus4b;#2%dG7(+_3eVoVM||1W`ju#7oL>w|F~0|eud$08 zjd%6SIDd(*`kK9Jf}_Z;`-uQu0W!!{+Kucp9RM2~vRgxcm05@arRff7fmaU!0epb6 z2h@2w1echF#@DZ=qbWF#eI}(tsw$^6p@A*5@#0BnSlecd(Wb}e&-R2r&%rW22bSH! zv8&XCWe^?8o5!p;BZf%}_sy+aVuJ9H2A>>YGVM|rGtx)-#c}x&HDmE`x&&y^Ai@AD zW`88}kxz~7vh#6x-q|ozd^geb7|XmXc1}&^+BD#vZEj0pUoW=Oa@D;u*}!M8CQI)e zkuCC#GKaXJ2oRSFhCapRz(GxbOioN3x4USDQUHR z3RftdavMq(Winvs2e-GzdepXJ2sz**SCb~+{x9$v7RP1Ljtaz?$I?Uf(I$ma!4d z$e$ueKW$QuC&WAO$DRxjl9~LXNpJa@flq{`6Q~TRtPtc^tiK)!hu2b0)KRCN!p#&U zPzuL#0d?_Tj#*vy@CIvveVKGE%{s?%h(q?VLydI5i7zY1n5nLyEIx{GTB{_VM9>gL zKvj5;DnJ2OILTUrLU={;myrtS`9bIg3bm+X&6b^g^q)NV@o z=84Lvc(?OSpbsJYia+EvQm5m!;#<`o?Gy4;iN@n`AggTT6V72ItRT^VM&cqL5nSpqSLNrYg~LGa-tN7xvKFVIx=uV{cKnUAu||n2cO$ zGNiH%cca8TyN_((IIRfbVmPFOmQda4dC21FFc|B*2R znyyC6AnBtGI5WLA_P2p<&wyc~@#4`#ji;9em?f~fex$!A7Ek|bAa_>PS71?lehmiP z!9$ItizUHkkX|8Hd&CT+;?3_T8ZCWil){>u+-Eu*hd3@)P-&2UvBo%U>mf`h*}Wq3 z9ST|CrdNOvq|xT|?`3*Ip!7>fHJJ?XxGcfeY*5$5+umPKpCYs{{g<8~xi{?W5G?!v zt00C4!by3!0JK??;Ug_}1(I1I(Zq`)am3)a)6O)XCk4V;$y0sKH|CL|#&g1+*%edtMr?2CLpq_R4Jk&I-YiqPC;hOvNF(!s zh*1lEeet%0pXhe&_?AQHvmwA;unB_+VT|`DikIe86nhFg-Mo zT+za(_%15`D>#hCx#=@x(%QFa!0CIn{dr~|amGxfiX&0gfgS<1Oes1@Nj4r!6b^_v zB>)CCr}yhw8~8y39%Ba!pE0s!_%eVi{?;@jcj?tN+j#tT&4CdXj|RU3YIgGtQp!IX zY?(|C$9@<`;$)?2_xiGw@^22uNzHoton#z?KHTZ12I9Xx*TVFv0cMt;Z9pueg`r|w z%ZiB%YNWZt_vw-41a`|J8|~8rPEkbX3%?gndG(oox@MvzeW%n)vQDIsh-pS9VC_g& zkbXNt(IFt4%ETbXmu6u#7LDs(wvK6&t&*wQk+sIf8$ohrP#pZ045U$i)g}FwY=_Oq zcr;qV_trGoh){Hh2+&WeE_ec#A_xW3bau-^S;~#+B2AONMKiuBGKij8Xbq-E6dkX{ zWpVI3RL~94$*-k3_w=svDRS4IR#0dNixL8faoSX`{_7GHd~ejGR1u!YTJ=_}iC_$= z5~SBjQCjCw@^dYLhmJ);VWmktp%Epc)PhM(STRmNpl$AosymqiZ0uAs%>*yY3ob>R ztT9p*4?m`1h!EI0&g@~~*^oEW_Qr$cMGR8-x4(epabNzt#*w1@>E9-oGh~o6Yt0*$ znxR-Cy@tbqnx&dTk7;q~~CBHtGLh0N1yh_Q)!i}9tY;%v)=-X?suL>czav98yyJ^y% zO0;>s3_;lE^}Io2Ocz@k==LuR^Z^HY7IN?--4i8ew+L>>FT^r+;V+A%tn_6;27Uv0 z5VGWGLG#d>V%x=54BbS`a zHo7HGpe2tL88+Cf(RlkGaSh8hgOep#k1-!QK|olml-Hhc>j$blOCJl_a&x_s0aR&q z33Ac4TOd2KKYeq=(J@l@rf-ssw`f`PSA(+I@^knoJ?%9Z9)G&VBT=Q%;a@fz4jn(1 z6A~T+JM(jph|*hY&46LZ+~`B>eN}EMjvWRs4g!1drg)Bv(MeUph_SUr72s?wVH1{NqKzKlCb#njeYWl6Sc2I>E> zZld&$|Gj{tscMH&kTT!;$wdWuAo|lk|1m|y0PNfT_nc(K=elHtZET3o<%{i>6=K8A zNzqkw5mC`K9%KJfRIuN)xTuiqf4dhIFzB-o6*%Dr1z(4#aPT22WOObpDn2(?RJb~A zQ8Bk_*2@!ct=V0Qien(~*$N6)#I(7HpeXSy_xMjHC`u%C2nyFYfS-@^3QrzO+vD_jx7934-JFY(|qeka9V?FJY6gb^MNP6*x{DzQGB zJ+@m%je<`;*ao?Kzmuaxi5&as&gK&C#wWRHaKi@-cQ*UE$#kR18S_J4=cIVT{vP7* zAc2|+*G!64o6~m>;w9IyREbwUM_HN5mlnNOuzepi@%Y$+Dr)wX(hgWSEsW7f?ORwj z|4%t~Vg#H;OXQfDLnv`-+;hx?F;b( zUyvY!pmL=&(kp-=izIr2^i%kO$g8Si7@(|`bletC4iiSeVc}Wvb4du~3cGh8x=%g$ zI+RoozU{?YE=##4+ocw3avrwOC9w4QS)awALPq`Em?i6jH!vZlvY~AxE|R^o#M{t@ zvP3J;H?oQbHRfmzIjXom_;0|jzk99v@jQ7I z$nGj|Z?ZLwf~b??Cg#&y*{b7Z6Z&xk*c+C%Euz^OT98WR9L&i{zeu2st>kZ2TYK=n z>N;(%jR9KRVJ5EH(^G z&AS=#96FE+r{*dSsRA-JE2SSe_L~(~WpzEP$V6i`#wtq>r-V8Ef-gIAk8wiZWKtke~?dD=mF2H!44G zh6g|x3wDfNE>K$>E`|cnnPLIlg_32oi=E|%v`4$!h+#F2Bxm{8@rq|Si@stwP7!6D zutIM&q#4LcpkIF)`m;oT2K8qk{V+ArV{%8~C}wXJ9`fsd6RJFB!GBdH{Y=R9Pf7V*{%CkyG_TRZgb9q#^%q5D`YUe}5M^8G2Ts!10KAe|hOm#yY} z7UAU@<*tOMtp9aFTY8%f5tU^trHU%XC!htbp5W0)_r!T!nBt8&Oc>p$c1<2cXG_Ji zord3-3sV+tT}?kmGeT5oO=!nwm_z&7}*Rbkm3&$VqGwTBg=v-=E{HtO$c@0HX*D@XF|+x)42Uv znGm4*-5+X zV$F9-3rQF)Q=f}z0ZBw2lR?jDTKqYth0InfJ=e5oFH@uR3*Dv#b(lO7?%Iv%v@2YT zYOjC@lPT-|RO^1(J?VS9>_lS)>YfcxK&%QHY*l4GCn~rOwd&t8E#REk)fsE z0!9W#;}wp7e_DnHDEL=3G*-_wG(PJMjglVNw2NulcpSPJjX2n>c0wo)YnjS+?RaCu zWW{qeHa;P@JABb;Y;+O8SdES`Hdg->jg2`Nkij7#vltdU4#W-5!rmB}Yj2E{_J&TZ zbV`t)g1w<5l0{goPamj_CMyEBs1MB+_%11FOvh?-5LK*YhW03Ro4jbQ8N%?jjmm4g zQ?ZEMRR6{s$w@fv0gq~~Xj=E|;uKXbzR<|PJ2`bSX{GX*G$iiP;{u6SrbK_=hhBrGkm zL3`d9mp|dcGZ+Oo#kjXMWSC%ZV4PM4D~bXNiW&CP*}6lmycyd?AzdGg6rmRKuJPKU z@n08dASfHSg=Iu{12=~q4b)r%U4!_@zuq9O{YeK=Hn7kj*f))mPqy95y&`)0mtj+% zIp|5>8Rz}-jB#imq($Qr4S5Y(k$Ll!$t7_R1}s#Gik#J^5Nu*5NKQ5bGXP-%8HKR# z=4Oor0@d-m=RG(FNFDOS?G*ET|pwbm-ET)z$^!u}W}& zlniOj9%LJduzp_OQ<5@$XPEva`3d+XfO<^YlttJgph#0&hNGmf`XI}E9<|E>dM_I? zuo2xe6XdN)?_=-R?#uvoE;WlWRyfCZ7=1WIZ--F z|BkFJ_BIQW56xxkzbe^!|FdUn-0vN1?W7pgmFe)~uytp1qJ_o^TdO(G*2gIEZ^hPp ztK3o2*jg~cDdPHL^R#E^??jHF8yyTS?~eQ3!O*P4ZTy&*8h=A#)Yo#GNF_t7ExzU>hBlK`L0fQ?_RV`rme!_p7oWBXP!j--pYd@@liA#CBSPFc zk2R&8=JTao1{pI4pj$Iy!JbV15RgD4QiUw2e>j+|*D^UUS9HL%B!om$G3181VX-=n z??jR$Ij3t1#PUB7N-U4Of{RJ&VlgYKegC(J0Yp!x@2NNGQei8tiSogaaHdG%OqqEZ zB6X;kqI8?g=4!glb*zA_ik#@X*+-Lfdp3I!NMun0!w$khy%;Ld_~~@r_{0;UU+`@$%0#i8LIigrfhE!?-m^8A6q)mbpV99Z5Na!j}CtJIgTeDy@0ka0(5lU^qAD!6ZEBM=JVdA z$=Ckfk1*~WAEA2BFhV?y@l^7$kTXtYv>mZ>9YmYQST1l|jP>=JHqP3U5+U2gSaAnc z+&g8GFOiRcuyaX{6gr>6ksE*91n;MNJK;{L@OPKXplo!hB=^{)^&y*@D#mGDVx%SK zI_Cl)_jH0he=c;%HHOnEK;R>s$2|trmA}M|xoQ6ciAJ)Xn?ZERR`!_J;V%>M!@(Mo zye5e07FU(ayT)si>%y?&&7LY87h?1rt>hIKdyRp~{AU#_OOyI8-qymY_3Lx7M1bO{ z^SC1>TCWJWMcvSv)D4P60m8^;rLV`de?DYysR5af0!Sx_X{XAy@2B40`dS#>skTjVuL$@I<8AYI($7`hQr$qx1sR1dh!Cr zCPq5rg0~`c(MiSZ7aQP_AU~O(x5}+f@lcPEWY^bq2+5r5uyxlzFUKH8YWV+m6xaBbTmhCrs!Bz6fsso_|M&)9$oIY|>XtAGNZGB(0hsxU!S{Z~*NoGC(g zu#wYKjJ}?{Q`?H#h2-VfB?hzf(Bjn89k8jY{A@^iCG<;$60E=!FgHD&Em9!n)VLz0 z39{o4VEAvfkrHUix@V0^)|;n;3pHJscUp8_^~ODQ;MrD8b9W_2D1a9>)kZcY%2OYC zRp_91D_$0c5FGoERN#ChF_I)RQuDSbGbn6aCS!CwP`2u)M<+A~e!N5RuGa5RJ z)x~BV#nc$@Ij#p@jiLOIGzf9K%@FX8owHIyg>@$(aaAj3M?U{3>rtIQ68i5vZb^I^9bv@^Av*+&N z!7tQ^R3OoXuE_^t4pT&kWI$rCbKe(h>H9;oubH1{HPyOu*2FoGJ-Q6~t(n>eSS!AOtj zg#&|)5Z$@(CRa7%?KUD|XsLAugRmvKCQiOq>`HGh^W_ES0E^=s$<^|}Mp^i~$141M zR2Hb#HY(7AUi_-*$CkS0#gxX7NwQ$M+vk@%B>)vHDmhBu2JoV$E$YRTw=K=l>K6g; zEQduHV`w_feGmaz$375GO;;9&AF;?V&Ij=i0DYnK9aWtf>VEdN3OZG*S*$!T%_X(% zH>*fKQrxXVQYQPtPHNDe4QjC(t6dE#+$5#1^#3L>pFgitz?*j67pvIOm0S)OX>yb8 zi;|O%QK{_B7qt%mS{?qi>u}z9-?ab^_EnOTfwcJMXZJ+2ItxZGO zhb&AqgPBkeV6{7{yoSg4&7Emy4tvrj3?@OdLI}7*r*yhNOu&ktd-R|xXCz%9-*Fg? zo5q}6(5F@Tu%$|g1GCF{< z(ffJEjr$znTtlfJvkksK)?8Y%9W6&ohUai5_FB>e;z zY8L4Ee>ynqSPM4)>e6Iy{O^;3>w}TAf)zhL1y}qODd=E%Mhfa2B?!*axkOwStl*ua zqq|>-ly=0C`b4bG2E>R~EGugIBM4XAb-$A>9ghwfoe>l516SrFPruI!T(q~Ze-wAz zV>RuVQzhLm+Yya>UA2i`)ZGqonbO=?jn%rO?~cz3*74e0@N=8zQ!^dSf939lnt$)J zZ~iah2$zZ733EN1s9b|^ed*pkvIJWd2X^Oy zebh|r?E0@zFmC;v4Yp${AjQhYrl-euAQA)LHWjW`at)h26X9-^mMONWRbduS#3fz7 zUOC3p?f|9)B;H*%diW?QN7PXH;7Pn0%uZkOJ_dAYKU%_`DbGu_c*j2nq<%t9D4LkY z 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%0DD?sQMP4Wp?yo>y#|khHzwxY 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